Index: /galaxy-central/tool_data_table_conf.xml
===================================================================
--- /galaxy-central/tool_data_table_conf.xml (revision 3)
+++ /galaxy-central/tool_data_table_conf.xml (revision 3)
@@ -0,0 +1,22 @@
+<tables>
+    <!-- Locations of MAF files that have been indexed with bx-python -->    
+    <table name="indexed_maf_files">
+        <columns>name, value, dbkey, species</columns>
+        <file path="tool-data/maf_index.loc" />
+    </table>
+    <!-- Locations of indexes in the BWA mapper format -->
+    <table name="bwa_indexes">
+        <columns>name, value</columns>
+        <file path="tool-data/bwa_index.loc" />
+    </table>
+    <!-- Locations of indexes in the Bowtie mapper format -->
+    <table name="bowtie_indexes">
+        <columns>name, value</columns>
+        <file path="tool-data/bowtie_indices.loc" />
+    </table>
+    <!-- Locations of indexes in the BFAST mapper format -->
+    <table name="bfast_indexes" comment_char="#">
+        <columns>value, dbkey, formats, name, path</columns>
+        <file path="tool-data/bfast_indexes.loc" />
+    </table>
+</tables>
Index: /galaxy-central/tools/unix_tools/remove_ending.xml
===================================================================
--- /galaxy-central/tools/unix_tools/remove_ending.xml (revision 3)
+++ /galaxy-central/tools/unix_tools/remove_ending.xml (revision 3)
@@ -0,0 +1,43 @@
+<tool id="Remove ending" name="Remove ending">
+  <description>of a file</description>
+  <command interpreter="sh">remove_ending.sh $num_lines $input $out_file1</command>
+  <inputs>
+    <param name="num_lines" size="5" type="integer" value="1" label="Remove last" help="lines"/>
+    <param format="txt" name="input" type="data" label="from"/>
+  </inputs>
+  <tests>
+	  <test>
+		  <param name="input" value="remove_ending_input1.txt" />
+		  <output name="out_file1" file="remove_ending_output1.txt" />
+		  <param name="num_lines" value="2" />
+	  </test>
+  </tests>
+  <outputs>
+    <data format="input" name="out_file1" metadata_source="input"/>
+  </outputs>
+  <help>
+
+**What it does**
+
+This tool removes specified number of lines from the ending of a dataset
+
+-----
+
+**Example**
+
+Input File::
+
+    chr7  56632  56652   D17003_CTCF_R6  310  +
+    chr7  56736  56756   D17003_CTCF_R7  354  +
+    chr7  56761  56781   D17003_CTCF_R4  220  +
+    chr7  56772  56792   D17003_CTCF_R7  372  +
+    chr7  56775  56795   D17003_CTCF_R4  207  +
+
+After removing the last 2 lines the dataset will look like this::
+
+    chr7  56632  56652   D17003_CTCF_R6  310  +
+    chr7  56736  56756   D17003_CTCF_R7  354  +
+    chr7  56761  56781   D17003_CTCF_R4  220  +
+
+</help>
+</tool>
Index: /galaxy-central/tools/unix_tools/word_list_grep.xml
===================================================================
--- /galaxy-central/tools/unix_tools/word_list_grep.xml (revision 3)
+++ /galaxy-central/tools/unix_tools/word_list_grep.xml (revision 3)
@@ -0,0 +1,106 @@
+<tool id="cshl_word_list_grep" name="Select lines">
+<description>by word list</description>
+<command interpreter="perl">
+	word_list_grep.pl 
+	#if $searchwhere.choice == "column":
+		-c $searchwhere.column
+	#end if
+	-o $output 
+	$inverse 
+	$caseinsensitive 
+	$wholewords 
+	$skip_first_line
+	$wordlist 
+	$input
+</command>
+
+<inputs>
+	<param name="input" format="txt" type="data" label="input file" />
+	<param name="wordlist" format="txt" type="data" label="word list file" />
+
+
+	<param name="inverse" type="boolean" checked="false" truevalue="-v" falsevalue="" label="Inverse filter" 
+		help="Report lines NOT matching the word list" />
+
+	<param name="caseinsensitive" type="boolean" checked="false" truevalue="-i" falsevalue="" label="Case-Insensitive search" 
+		help="" />
+
+	<param name="wholewords" type="boolean" checked="false" truevalue="-w" falsevalue="" label="find whole-words" 
+		help="ignore partial matches (e.g. 'apple' will not match 'snapple') " />
+
+	<param name="skip_first_line" type="boolean" checked="false" truevalue="-s" falsevalue="" label="Ignore first line" 
+		help="Select this option if the first line contains column headers. First line will not be filtered. " />
+
+	<conditional name="searchwhere">
+		<param name="choice" type="select" label="Search words in">
+			<option value="line" selected="true">entire line</option>
+			<option value="column">specific column</option>
+		</param>
+
+		<when value="line">
+		</when>
+
+		<when value="column">
+    			<param name="column" label="in column" type="data_column" data_ref="input" accept_default="true" />
+		</when>
+	</conditional>
+
+</inputs>
+
+<outputs>
+	<data name="output" format="input" metadata_source="input" />
+</outputs>
+
+<help>
+**What it does**
+
+This tool selects lines that match words from a word list.
+
+--------
+
+**Example**
+
+Input file (UCSC's rmsk track from dm3)::
+
+    585	787	66	241	11	chrXHet	2860	3009	-201103	-	DNAREP1_DM	LINE	Penelope	0	594	435	1
+    585	1383	78	220	0	chrXHet	3012	3320	-200792	-	DNAREP1_DM	LINE	Penelope	-217	377	2	1
+    585	244	103	0	0	chrXHet	3737	3776	-200336	-	DNAREP1_DM	LINE	Penelope	-555	39	1	1
+    585	2270	83	144	0	chrXHet	7907	8426	-195686	+	DNAREP1_DM	LINE	Penelope	1	594	0	1
+    585	617	189	73	68	chrXHet	10466	10671	-193441	+	DNAREP1_DM	LINE	Penelope	368	573	-21	1
+    586	1122	71	185	0	chrXHet	173138	173322	-30790	-	PROTOP	DNA	P	-4033	447	230	1
+    ...
+    ...
+
+
+Word list file::
+
+  STALKER
+  PROTOP
+
+ 
+
+Output sequence (searching in column 11)::
+
+    586	1122	71	185	0	chrXHet	173138	173322	-30790	        -	PROTOP	DNA	P	-4033	447	230	1
+    586	228	162	0	0	chrXHet	181026	181063	-23049	        +	STALKER4_I	LTR	Gypsy	9	45	-6485	1
+    585	245	105	26	0	chr3R	41609	41647	-27863406	+	PROTOP_B	DNA	P	507	545	-608	4
+    586	238	91	0	0	chr3R	140224	140257	-27764796	-	PROTOP_B	DNA	P	-617	536	504	4
+    ...
+    ...
+
+( With **find whole-words** not selected, *PROTOP* matched *PROTOP_B*, *STALKER* matched *STALKER4_I* )
+
+
+
+
+Output sequence (searching in column 11, and whole-words only)::
+
+    586	670	90	38	57	chrXHet	168356	168462	-35650	-	PROTOP	DNA	P	-459	4021	3918	1
+    586	413	139	70	0	chrXHet	168462	168548	-35564	-	PROTOP	DNA	P	-3406	1074	983	1
+    586	1122	71	185	0	chrXHet	173138	173322	-30790	-	PROTOP	DNA	P	-4033	447	230	1
+    ...
+    ...
+
+</help>
+
+</tool>
Index: /galaxy-central/tools/unix_tools/sort_tool.xml
===================================================================
--- /galaxy-central/tools/unix_tools/sort_tool.xml (revision 3)
+++ /galaxy-central/tools/unix_tools/sort_tool.xml (revision 3)
@@ -0,0 +1,134 @@
+<tool id="cshl_sort_tool" name="Sort">
+  <!-- 
+   	note 1:
+	  the 'version' sort (or natual order sort)
+	  requires GNU Coreutils 7.1 or later
+
+	note 2:
+	  for greater efficiency, sort buffer size is very large.
+	  If your Galaxy server doesn't have so much memory (or the
+	  sorts you use don't require it) - you can decrease the memory size.
+	  (argument is "-S 2G")
+  -->
+  <command>sort -S 2G $unique 
+      #for $key in $sortkeys
+       '-k ${key.column},${key.column}${key.order}${key.style}'
+      #end for
+  	$input > $out_file1
+  </command>
+
+  <inputs>
+	<param format="txt" name="input" type="data" label="Sort Query" />
+		
+	<param name="unique" type="select" label="Output only unique values?">
+		<option value="">No</option>
+		<option value="-u">Yes</option>
+	</param>
+
+	<repeat name="sortkeys" title="sort key">
+	    <param name="column" label="on column" type="data_column" data_ref="input" accept_default="true" />
+	    <param name="order" type="select" display="radio" label="in">
+	      <option value="r">Descending order</option>
+	      <option value="">Ascending order</option>
+	    </param>
+	    <param name="style" type="select" display="radio" label="Flavor">
+	      <option value="n">Fast numeric sort ([-n])</option>
+	      <option value="g">General numeric sort ( scientific notation [-g])</option>
+	      <option value="V">Natural/Version sort ([-V]) </option>
+	      <option value="">Alphabetical sort</option>
+	    </param>
+	</repeat>
+  </inputs>
+  <tests>
+	  <test>
+		  <!-- Sort Descending numerical order,
+		       with scientific notation -->
+		  <param name="input" value="unix_sort_input1.txt" />
+		  <output name="output" file="unix_sort_output1.txt" />
+		  <param name="unique" value="No" />
+		  <param name="column" value="2" />
+		  <param name="order"  value="r" />
+		  <param name="style"  value="g" />
+	  </test>
+	  <test>
+		  <!-- Sort Ascending numerical order,
+		  with scientific notation - outputing unique values only 
+
+		  The catch:
+		  	chr15 appears twice, with the same value (0.0314 and 3.14e-2).
+			In the output, it should appear only once because of the unique flag
+		  -->
+		  <param name="input" value="unix_sort_input1.txt" />
+		  <output name="output" file="unix_sort_output2.txt" />
+		  <param name="unique" value="Yes" />
+		  <param name="column" value="2" />
+		  <param name="order"  value="" />
+		  <param name="style"  value="g" />
+	  </test>
+	  <test>
+		  <!-- Sort Ascending 'natural' order -->
+		  <param name="input" value="unix_sort_input1.txt" />
+		  <output name="output" file="unix_sort_output3.txt" />
+		  <param name="unique" value="No" />
+		  <param name="column" value="1" />
+		  <param name="order"  value="" />
+		  <param name="style"  value="V" />
+	  </test>
+  </tests>
+  <outputs>
+    <data format="input" name="out_file1" metadata_source="input"/>
+  </outputs>
+  <help>
+
+**What it does**
+
+This tool runs the unix **sort** command on the selected data file.
+
+-----
+
+**Sorting Styles**
+
+* **Fast Numeric**: sort by numeric values. Handles integer values (e.g. 43, 134) and decimal-point values (e.g. 3.14). *Does not* handle scientific notation (e.g. -2.32e2).
+* **General Numeric**: sort by numeric values. Handles all numeric notations (including scientific notation). Slower than *fast numeric*, so use only when necessary.
+* **Natural Sort**: Sort in 'natural' order (natural to humans, not to computers). See example below.
+* **Alphabetical sort**: Sort in strict alphabetical order. See example below.
+
+
+
+
+**Sorting Examples**
+
+Given the following list::
+
+    chr4
+    chr13
+    chr1
+    chr10
+    chr20
+    chr2
+
+**Alphabetical sort** would produce the following sorted list::
+
+    chr1
+    chr10
+    chr13
+    chr2
+    chr20
+    chr4
+
+**Natural Sort** would produce the following sorted list::
+
+    chr1
+    chr2
+    chr4
+    chr10
+    chr13
+    chr20
+
+
+.. class:: infomark
+
+If you're planning to use the file with another tool that expected sorted files (such as *join*), you should use the **Alphabetical sort**,  not the **Natural Sort**. Natural sort order is easier for humans, but is unnatural for computer programs.
+
+  </help>
+</tool>
Index: /galaxy-central/tools/unix_tools/sed_wrapper.sh
===================================================================
--- /galaxy-central/tools/unix_tools/sed_wrapper.sh (revision 3)
+++ /galaxy-central/tools/unix_tools/sed_wrapper.sh (revision 3)
@@ -0,0 +1,37 @@
+#!/bin/sh
+
+##
+## Galaxy wrapper for SED command
+##
+
+##
+## command line arguments:
+##   input_file
+##   output_file
+##   sed-program
+##   [other parameters passed on to sed]
+
+INPUT="$1"
+OUTPUT="$2"
+PROG="$3"
+
+shift 3
+
+if [ -z "$PROG" ]; then
+	echo usage: $0 INPUTFILE OUTPUTFILE SED-PROGRAM [other sed patameters] >&2
+	exit 1
+fi
+
+if [ ! -r "$INPUT" ]; then
+	echo "error: input file ($INPUT) not found!" >&2
+	exit 1
+fi
+
+# Messages printed to STDOUT will be displayed in the "INFO" field in the galaxy dataset.
+# This way the user can tell what was the command
+echo "sed" "$@" "$PROG"
+
+sed -r --sandbox "$@" "$PROG" "$INPUT" > "$OUTPUT"
+if (( $? ));  then exit; fi
+
+exit 0
Index: /galaxy-central/tools/unix_tools/cut_tool.xml
===================================================================
--- /galaxy-central/tools/unix_tools/cut_tool.xml (revision 3)
+++ /galaxy-central/tools/unix_tools/cut_tool.xml (revision 3)
@@ -0,0 +1,94 @@
+<tool id="cshl_cut_tool" name="cut">
+  <description>columns from files</description>
+  <command interpreter="sh">
+  	cut_wrapper.sh '$complement' '$cutwhat' '$list' '$input' '$output'
+  </command>
+
+  <inputs>
+	<param format="txt" name="input" type="data" label="file to cut" />
+		
+    	<param name="complement" type="select" label="Operation">
+	      <option value="">Keep</option>
+	      <option value="--complement">Discard</option>
+	</param>
+
+    	<param name="cutwhat" type="select" label="Cut by">
+	      <option value="-f">fields</option>
+	      <option value="-c">characters</option>
+	</param>
+
+	<param name="list" type="text" size="20" label="List of Fields/Characters/Bytes" help="These will be kept/discarded (depending on 'operation'). &lt;BR /&gt; Examples: 1,3,4 or 2-5" value = "" />
+  </inputs>
+
+  <tests>
+	  <test>
+		  <param name="input" value="unix_cut_input1.txt" />
+		  <output name="output" file="unix_cut_output1.txt" />
+		  <param name="complement" value="Keep" />
+		  <param name="cutwhat" value="fields" />
+		  <param name="list"  value="1,3,4" />
+	  </test>
+	  <test>
+		  <param name="input" value="unix_cut_input1.txt" />
+		  <output name="output" file="unix_cut_output1.txt" />
+		  <param name="complement" value="Discard" />
+		  <param name="cutwhat" value="fields" />
+		  <param name="list"  value="2" />
+	  </test>
+  </tests>
+
+  <outputs>
+    <data format="input" name="output" metadata_source="input"/>
+  </outputs>
+  <help>
+
+**What it does**
+
+This tool runs the **cut** unix command, which extract or delete columns from a file.
+
+-----
+
+Field List Example:
+
+**1,3,7** - Cut specific fields/characters.
+
+**3-**    - Cut from the third field/character to the end of the line.
+
+**2-5**   - Cut from the second to the fifth field/character.
+
+**-8**    - Cut from the first to the eight field/characters.
+
+
+
+
+Input Example::
+
+    fruit	color	price	weight
+    apple	red	1.4	0.5
+    orange	orange	1.5	0.3
+    banana	yellow	0.9	0.3
+
+
+Output Example ( **Keeping fields 1,3,4** )::
+
+    fruit	price	weight
+    apple	1.4	0.5
+    orange	1.5	0.3
+    banana	0.9	0.3
+
+Output Example ( **Discarding field 2** )::
+
+    fruit	price	weight
+    apple	1.4	0.5
+    orange	1.5	0.3
+    banana	0.9	0.3
+
+Output Example ( **Keeping 3 characters** )::
+
+    fru
+    app
+    ora
+    ban
+
+  </help>
+</tool>
Index: /galaxy-central/tools/unix_tools/grep_tool.xml
===================================================================
--- /galaxy-central/tools/unix_tools/grep_tool.xml (revision 3)
+++ /galaxy-central/tools/unix_tools/grep_tool.xml (revision 3)
@@ -0,0 +1,130 @@
+<tool id="cshl_grep_tool" name="grep">
+  <description></description>
+  <command interpreter="sh">grep_wrapper.sh $input $output '$url_paste' $color -A $lines_after -B $lines_before $invert $case_sensitive</command>
+  <inputs>
+    <param format="txt" name="input" type="data" label="Select lines from" />
+
+    <param name="invert" type="select" label="that">
+      <option value="">Match</option>
+      <option value="-v">Don't Match</option>
+    </param>
+
+    <!-- Note: the parameter ane MUST BE 'url_paste' -
+         This is a hack in the galaxy library (see ./lib/galaxy/util/__init__.py line 142)
+	 If the name is 'url_paste' the string won't be sanitized, and all the non-alphanumeric characters 
+	 will be passed to the shell script -->
+    <param name="url_paste" type="text" size="40" label="Regular Expression" help=""> 
+    	<validator type="expression" message="Invalid Program!">value.find('\'')==-1</validator>
+    </param>
+
+    <param name="case_sensitive" type="select"  label="Match type"> 
+      <option value="-i">case insensitive</option>
+      <option value="">case sensitive</option>
+    </param>
+
+    <param name="lines_before" type="integer"  label="Show lines preceding the matched line" help="(same as grep -B, leave it at zero unless you know what you're doing)" value="0" /> 
+    <param name="lines_after" type="integer"  label="Show lines trailing the matched line" help="(same as grep -A, leave it at zero unless you know what you're doing)" value="0" /> 
+
+    <param name="color" type="select"  label="Output"> 
+      <option value="NOCOLOR">text file (for further processing)</option>
+      <option value="COLOR">Highlighted HTML (for easier viewing)</option>
+    </param>
+
+  </inputs>
+  <tests>
+	  <test>
+		  <!-- grep a FASTA file for sequences with specific motif -->
+		  <param name="input" value="unix_grep_input1.txt" />
+		  <output name="output" file="unix_grep_output1.txt" />
+		  <param name="case_sensitive" value="case sensitive" />
+		  <param name="invert" value="" />
+		  <param name="url_paste" value="AA.{2}GT" />
+		  <param name="lines_before" value="1" />
+		  <param name="lines_after" value="0" />
+		  <param name="color" value="NOCOLOR" />
+	  </test>
+	  <test>
+		  <!-- grep a FASTA file for sequences with specific motif -
+		 	show highlighed output -->
+		  <param name="input" value="unix_grep_input1.txt" />
+		  <output name="output" file="unix_grep_output2.html" />
+		  <param name="case_sensitive" value="case sensitive" />
+		  <param name="invert" value="" />
+		  <param name="url_paste" value="AA.{2}GT" />
+		  <param name="lines_before" value="0" />
+		  <param name="lines_after" value="0" />
+		  <param name="color" value="COLOR" />
+	  </test>
+  </tests>
+  <outputs>
+	  <data format="input" name="output" metadata_source="input" >
+		<change_format>
+			<when input="color" value="COLOR" format="HTML" />
+		</change_format>
+ 	  </data>
+  </outputs>
+<help>
+
+**What it does**
+
+This tool runs the unix **grep** command on the selected data file.
+
+.. class:: infomark
+
+**TIP:** This tool uses the **perl** regular expression syntax (same as running 'grep -P'). This is **NOT** the POSIX or POSIX-extended syntax (unlike the awk/sed tools).
+
+
+**Further reading**
+
+- Wikipedia's Regular Expression page (http://en.wikipedia.org/wiki/Regular_expression)
+- Regular Expressions cheat-sheet (PDF) (http://www.addedbytes.com/cheat-sheets/download/regular-expressions-cheat-sheet-v2.pdf)
+- Grep Tutorial (http://www.panix.com/~elflord/unix/grep.html)
+
+-----
+
+**Grep Examples**
+
+- **AGC.AAT** would match lines with AGC followed by any character, followed by AAT (e.g. **AGCQAAT**, **AGCPAAT**, **AGCwAAT**)
+- **C{2,5}AGC** would match lines with 2 to 5 consecutive Cs followed by AGC
+- **TTT.{4,10}AAA** would match lines with 3 Ts, followed by 4 to 10 characters (any characeters), followed by 3 As.
+- **^chr([0-9A-Za-z])+** would match lines that begin with chromsomes, such as lines in a BED format file.
+- **(ACGT){1,5}** would match at least 1 "ACGT" and at most 5 "ACGT" consecutively.
+- **hsa|mmu** would match lines containing "hsa" or "mmu" (or both).
+ 
+-----
+
+**Regular Expression Syntax**
+
+The select tool searches the data for lines containing or not containing a match to the given pattern. A Regular Expression is a pattern descibing a certain amount of text. 
+
+- **( ) { } [ ] . * ? + \ ^ $** are all special characters. **\\** can be used to "escape" a special character, allowing that special character to be searched for.
+- **^** matches the beginning of a string(but not an internal line).
+- **\\d** matches a digit, same as [0-9].
+- **\\D** matches a non-digit.
+- **\\s** matches a whitespace character.
+- **\\S** matches anything BUT a whitespace.
+- **\\t** matches a tab.
+- **\\w** matches an alphanumeric character ( A to Z, 0 to 9 and underscore )
+- **\\W** matches anything but an alphanumeric character.
+- **(** .. **)** groups a particular pattern.
+- **\\Z** matches the end of a string(but not a internal line).
+- **{** n or n, or n,m **}** specifies an expected number of repetitions of the preceding pattern.
+
+  - **{n}** The preceding item is matched exactly n times.
+  - **{n,}** The preceding item ismatched n or more times. 
+  - **{n,m}** The preceding item is matched at least n times but not more than m times. 
+
+- **[** ... **]** creates a character class. Within the brackets, single characters can be placed. A dash (-) may be used to indicate a range such as **a-z**.
+- **.** Matches any single character except a newline.
+- ***** The preceding item will be matched zero or more times.
+- **?** The preceding item is optional and matched at most once.
+- **+** The preceding item will be matched one or more times.
+- **^** has two meaning:
+  - matches the beginning of a line or string. 
+  - indicates negation in a character class. For example, [^...] matches every character except the ones inside brackets.
+- **$** matches the end of a line or string.
+- **\|** Separates alternate possibilities. 
+
+
+</help>
+</tool>
Index: /galaxy-central/tools/unix_tools/remove_ending.sh
===================================================================
--- /galaxy-central/tools/unix_tools/remove_ending.sh (revision 3)
+++ /galaxy-central/tools/unix_tools/remove_ending.sh (revision 3)
@@ -0,0 +1,69 @@
+#!/bin/sh
+
+# Version 0.1 ,  15aug08
+# Written by Assaf Gordon (gordon@cshl.edu)
+#
+
+LINES="$1"
+INFILE="$2"
+OUTFILE="$3"
+
+if [ "$LINES" == "" ]; then
+	cat >&2 <<EOF 
+Remove Ending Lines
+
+Usage: $0 LINES [INFILE] [OUTFILE]
+
+   LINES - number of lines to remove from the end of the file
+   [INFILE] - input file (if not specified - defaults to STDIN)
+   [OUTFILE]- output file (if not specified - defaults to STDOUT)
+
+Input Example:
+
+#Chr	Start	End
+chr1	10	15
+chr1	40	20
+chr1	21	14
+total   3 chromosomes
+
+Removing 1 line (the last line) produces:
+
+#Chr	Start	End
+chr1	10	15
+chr1	20	40
+chr	14	21
+
+Usage Example:
+   
+   \$ $0 1 < my_input_file.txt > my_output_file.txt
+
+EOF
+	
+	exit 1
+fi
+
+#Validate line argument - remove non-digits characters
+LINES=${LINES//[^[:digit:]]/}
+
+#Make sure the line strings isn't empty
+#(after the regex above, they will either contains digits or be empty)
+if [ -z "$LINES" ]; then
+	echo "Error: bad line value (must be numeric)" >&2
+	exit 1
+fi
+
+# Use default (stdin/out) values if infile / outfile not specified
+[ -z "$INFILE" ] && INFILE="/dev/stdin"
+[ -z "$OUTFILE" ] && OUTFILE="/dev/stdout"
+
+#Make sure the input file (if specified) exists.
+if [ ! -r "$INFILE" ]; then
+	echo "Error: input file ($INFILE) not found!" >&2
+	exit 1
+fi
+
+
+# The "gunzip -f" trick allows
+# piping a file (gzip or plain text, real file name or "/dev/stdin") to sed 
+gunzip -f <"$INFILE" | sed -n -e :a -e "1,${LINES}!{P;N;D;};N;ba" > "$OUTFILE"
+
Index: /galaxy-central/tools/unix_tools/join_tool.xml
===================================================================
--- /galaxy-central/tools/unix_tools/join_tool.xml (revision 3)
+++ /galaxy-central/tools/unix_tools/join_tool.xml (revision 3)
@@ -0,0 +1,54 @@
+<tool id="cshl_join_tool" name="join">
+  <description>two files</description>
+  <command interpreter="sh">join_tool.sh "$jointype" "$output_format" 
+  				"$empty_string_filler" "$delimiter"
+				"$ignore_case"
+				"$input1" "$column1"
+				"$input2" "$column2"
+				"$output"
+  </command>
+  
+  <inputs>
+	<param format="txt" name="input1" type="data" label="1st file" />
+	<param name="column1" label="Column to use from 1st file" type="data_column" data_ref="input1" accept_default="true" />
+
+	<param format="txt" name="input2" type="data" label="2nd File" />
+	<param name="column2" label="Column to use from 2nd file" type="data_column" data_ref="input2" accept_default="true" />
+
+	<param name="jointype" type="select" label="Output lines appearing in">
+	      <option value=" ">BOTH 1st &amp; 2nd file.</option>
+	      <option value="-v 1">1st but not in 2nd file. [-v 1]</option>
+	      <option value="-v 2">2nd but not in 1st file. [-v 2]</option>
+	      <option value="-a 1">both 1st &amp; 2nd file, plus unpairable lines from 1st file. [-a 1]</option>
+	      <option value="-a 2">both 1st &amp; 2nd file, plus unpairable lines from 2st file. [-a 2]</option>
+	      <option value="-a 1 -a 2">All Lines [-a 1 -a 2]</option>
+	</param>
+
+	    <param name="delimiter" type="select" label="field-separator [-t]">
+		<option value=",">comma (,)</option>
+		<option value=":">colons (:) </option>
+		<option value=" ">single space</option>
+		<option value=".">dot (.)</option>
+		<option value="-">dash (-)</option>
+		<option value="|">pipe (|)</option>
+		<option value="_">underscore (_)</option>
+		<option selected="True" value="tab">tab</option>
+	    </param>
+
+	<param name="ignore_case" type="select" label="Case sensitivity">
+	      <option value="">Case sensitive</option>
+	      <option value="-i">Case INsensitive [-i]</option>
+	</param>
+
+	<param name="empty_string_filler" type="text" size="20" label="String replacement for empty fields [-e EMPTY]" help="Leave empty unless you know what you're doing. Use this when specifing output format" /> 
+
+	<param name="output_format" type="text" size="30" label="Output line format [-o FORMAT]" help="Leave empty unless you know what you're doing. Example: 1.1,2.1,2.1" /> 
+
+  </inputs>
+  <outputs>
+    <data name="output" format="input" metadata_source="input1" />
+  </outputs>
+  
+<help>
+</help>
+</tool>
Index: /galaxy-central/tools/unix_tools/awk_wrapper.sh
===================================================================
--- /galaxy-central/tools/unix_tools/awk_wrapper.sh (revision 3)
+++ /galaxy-central/tools/unix_tools/awk_wrapper.sh (revision 3)
@@ -0,0 +1,47 @@
+#!/bin/sh
+
+##
+## Galaxy wrapper for AWK command
+##
+
+##
+## command line arguments:
+##   input_file
+##   output_file
+##   awk-program
+##   input-field-separator
+##   output-field-separator
+
+INPUT="$1"
+OUTPUT="$2"
+PROG="$3"
+FS="$4"
+OFS="$5"
+
+shift 5
+
+if [ -z "$OFS" ]; then
+	echo usage: $0 INPUTFILE OUTPUTFILE AWK-PROGRAM FS OFS>&2
+	exit 1
+fi
+
+if [ ! -r "$INPUT" ]; then
+	echo "error: input file ($INPUT) not found!" >&2
+	exit 1
+fi
+
+if [ "$FS" == "tab" ]; then
+	FS="\t"
+fi
+if [ "$OFS" == "tab" ]; then
+	OFS="\t"
+fi
+
+# Messages printed to STDOUT will be displayed in the "INFO" field in the galaxy dataset.
+# This way the user can tell what was the command
+echo "awk" "$PROG"
+
+awk --sandbox -v OFS="$OFS" -v FS="$FS" --re-interval "$PROG" "$INPUT" > "$OUTPUT"
+if (( $? ));  then exit; fi
+
+exit 0
Index: /galaxy-central/tools/unix_tools/find_and_replace.xml
===================================================================
--- /galaxy-central/tools/unix_tools/find_and_replace.xml (revision 3)
+++ /galaxy-central/tools/unix_tools/find_and_replace.xml (revision 3)
@@ -0,0 +1,154 @@
+<tool id="cshl_find_and_replace" name="Find and Replace">
+  <description>text</description>
+  <command interpreter="perl">
+	find_and_replace.pl
+	#if $searchwhere.choice == "column":
+		-c $searchwhere.column
+	#end if
+	-o $output 
+	$caseinsensitive 
+	$wholewords 
+	$skip_first_line
+	$is_regex
+	'$url_paste'
+	'$file_data'
+	'$input'
+  </command>
+  <inputs>
+    <param format="txt" name="input" type="data" label="File to process" />
+
+    <!-- Note: the parameter ane MUST BE 'url_paste' -
+         This is a hack in the galaxy library (see ./lib/galaxy/util/__init__.py line 142)
+	 If the name is 'url_paste' the string won't be sanitized, and all the non-alphanumeric characters 
+	 will be passed to the shell script -->
+	 <param name="url_paste" type="text" size="20" label="Find pattern" help="Use simple text, or a valid regular expression (without backslashes // ) " > 
+    		<validator type="expression" message="Invalid Program!">value.find('\'')==-1</validator>
+	</param>
+
+	 <param name="file_data" type="text" size="20" label="Replace with" help="Use simple text, or &amp; (ampersand) and \\1 \\2 \\3 to refer to matched text. See examples below." >
+    		<validator type="expression" message="Invalid Program!">value.find('\'')==-1</validator>
+	</param>
+
+	<param name="is_regex" type="boolean" checked="false" truevalue="-r" falsevalue="" label="Find-Pattern is a regular expression" 
+		help="see help section for details." />
+
+	<param name="caseinsensitive" type="boolean" checked="false" truevalue="-i" falsevalue="" label="Case-Insensitive search" 
+		help="" />
+
+	<param name="wholewords" type="boolean" checked="false" truevalue="-w" falsevalue="" label="find whole-words" 
+		help="ignore partial matches (e.g. 'apple' will not match 'snapple') " />
+
+	<param name="skip_first_line" type="boolean" checked="false" truevalue="-s" falsevalue="" label="Ignore first line" 
+		help="Select this option if the first line contains column headers. Text in the line will not be replaced. " />
+
+	<conditional name="searchwhere">
+		<param name="choice" type="select" label="Replace text in">
+			<option value="line" selected="true">entire line</option>
+			<option value="column">specific column</option>
+		</param>
+
+		<when value="line">
+		</when>
+
+		<when value="column">
+    			<param name="column" label="in column" type="data_column" data_ref="input" accept_default="true" />
+		</when>
+	</conditional>
+  </inputs>
+
+  <outputs>
+    <data format="input" name="output" metadata_source="input" />
+  </outputs>
+
+<help>
+
+**What it does**
+
+This tool finds &amp; replaces text in an input dataset.
+
+.. class:: infomark
+
+The **pattern to find** can be a simple text string, or a perl **regular expression** string (depending on *pattern is a regex* check-box).
+
+.. class:: infomark
+
+When using regular expressions, the **replace pattern** can contain back-references ( e.g. \\1 )
+
+.. class:: infomark
+
+This tool uses Perl regular expression syntax.
+
+-----
+
+**Examples of *regular-expression* Find Patterns**
+
+- **HELLO**     The word 'HELLO' (case sensitive).
+- **AG.T**      The letters A,G followed by any single character, followed by the letter T.
+- **A{4,}**     Four or more consecutive A's.
+- **chr2[012]\\t**       The words 'chr20' or 'chr21' or 'chr22' followed by a tab character.
+- **hsa-mir-([^ ]+)**        The text 'hsa-mir-' followed by one-or-more non-space characters. When using parenthesis, the matched content of the parenthesis can be accessed with **\1** in the **replace** pattern.
+
+
+**Examples of Replace Patterns**
+
+- **WORLD**  The word 'WORLD' will be placed whereever the find pattern was found.
+- **FOO-&amp;-BAR**  Each time the find pattern is found, it will be surrounded with 'FOO-' at the begining and '-BAR' at the end. **&amp;** (ampersand) represents the matched find pattern.
+- **\\1**   The text which matched the first parenthesis in the Find Pattern.
+
+
+-----
+
+**Example 1**
+
+**Find Pattern:** HELLO
+**Replace Pattern:** WORLD
+**Regular Expression:** no
+**Replace what:** entire line
+
+Every time the word HELLO is found, it will be replaced with the word WORLD. 
+
+-----
+
+**Example 2**
+
+**Find Pattern:** ^chr 
+**Replace Pattern:** (empty)
+**Regular Expression:** yes
+**Replace what:** column 11
+
+If column 11 (of every line) begins with ther letters 'chr', they will be removed. Effectively, it'll turn "chr4" into "4" and "chrXHet" into "XHet"
+
+
+-----
+
+**Perl's Regular Expression Syntax**
+
+The Find &amp; Replace tool searches the data for lines containing or not containing a match to the given pattern. A Regular Expression is a pattern descibing a certain amount of text. 
+
+- **( ) { } [ ] . * ? + \\ ^ $** are all special characters. **\\** can be used to "escape" a special character, allowing that special character to be searched for.
+- **^** matches the beginning of a string(but not an internal line).
+- **(** .. **)** groups a particular pattern.
+- **{** n or n, or n,m **}** specifies an expected number of repetitions of the preceding pattern.
+
+  - **{n}** The preceding item is matched exactly n times.
+  - **{n,}** The preceding item ismatched n or more times. 
+  - **{n,m}** The preceding item is matched at least n times but not more than m times. 
+
+- **[** ... **]** creates a character class. Within the brackets, single characters can be placed. A dash (-) may be used to indicate a range such as **a-z**.
+- **.** Matches any single character except a newline.
+- ***** The preceding item will be matched zero or more times.
+- **?** The preceding item is optional and matched at most once.
+- **+** The preceding item will be matched one or more times.
+- **^** has two meaning:
+  - matches the beginning of a line or string. 
+  - indicates negation in a character class. For example, [^...] matches every character except the ones inside brackets.
+- **$** matches the end of a line or string.
+- **\\|** Separates alternate possibilities. 
+- **\\d** matches a single digit
+- **\\w** matches a single letter or digit or an underscore.
+- **\\s** matches a single white-space (space or tabs).
+
+
+</help>
+
+</tool>
Index: /galaxy-central/tools/unix_tools/word_list_grep.pl
===================================================================
--- /galaxy-central/tools/unix_tools/word_list_grep.pl (revision 3)
+++ /galaxy-central/tools/unix_tools/word_list_grep.pl (revision 3)
@@ -0,0 +1,182 @@
+#!/usr/bin/perl
+use strict;
+use warnings;
+use Getopt::Std;
+
+sub parse_command_line();
+sub load_word_list();
+sub compile_regex(@);
+sub usage();
+
+my $word_list_file;
+my $input_file ;
+my $output_file;
+my $find_complete_words ;
+my $find_inverse; 
+my $find_in_specific_column ;
+my $find_case_insensitive ;
+my $skip_first_line ;
+
+
+##
+## Program Start
+##
+usage() if @ARGV==0;
+parse_command_line();
+
+my @words = load_word_list();
+
+my $regex = compile_regex(@words);
+
+# Allow first line to pass without filtering?
+if ( $skip_first_line ) {
+	my $line = <$input_file>;
+	print $output_file $line ;
+}
+
+
+##
+## Main loop
+##
+while ( <$input_file> ) {
+	my $target = $_;
+
+
+	# If searching in a specific column (and not in the entire line)
+	# extract the content of that one column
+	if ( $find_in_specific_column ) {
+		my @columns = split ;
+
+		#not enough columns in this line - skip it
+		next if ( @columns < $find_in_specific_column ) ;
+
+		$target = $columns [ $find_in_specific_column - 1 ] ;
+	}
+
+	# Match ?
+	if ( ($target =~ $regex) ^ ($find_inverse) ) {
+		print $output_file $_ ;
+	}
+}
+
+close $input_file;
+close $output_file;
+
+##
+## Program end
+##
+
+
+sub parse_command_line()
+{
+	my %opts ;
+	getopts('siwvc:o:', \%opts) or die "$0: Invalid option specified\n";
+
+	die "$0: missing word-list file name\n" if (@ARGV==0); 
+
+	$word_list_file = $ARGV[0];
+	die "$0: Word-list file '$word_list_file' not found\n" unless -e $word_list_file ;
+
+	$find_complete_words = ( exists $opts{w} ) ;
+	$find_inverse = ( exists $opts{v} ) ;
+	$find_case_insensitive = ( exists $opts{i} ) ;
+	$skip_first_line = ( exists $opts{s} ) ;
+
+
+	# Search in specific column ?
+	if ( defined $opts{c} ) {
+		$find_in_specific_column = $opts{c};
+
+		die "$0: invalid column number ($find_in_specific_column).\n"
+			unless $find_in_specific_column =~ /^\d+$/ ;
+			
+		die "$0: invalid column number ($find_in_specific_column).\n"
+			if $find_in_specific_column <= 0; 
+	}
+	else {
+		$find_in_specific_column = 0 ;
+	}
+
+
+	# Output File specified (instead of STDOUT) ?
+	if ( defined $opts{o} ) {
+		my $filename = $opts{o};
+		open $output_file, ">$filename" or die "$0: Failed to create output file '$filename': $!\n" ;
+	} else {
+		$output_file = *STDOUT ;
+	}
+
+
+
+	# Input file Specified (instead of STDIN) ?
+	if ( @ARGV>1 ) {
+		my $filename = $ARGV[1];
+		open $input_file, "<$filename" or die "$0: Failed to open input file '$filename': $!\n" ;
+	} else {
+		$input_file = *STDIN;
+	}
+}
+
+sub load_word_list()
+{
+	open WORDLIST, "<$word_list_file" or die "$0: Failed to open word-list file '$word_list_file'\n" ;
+	my @words ;
+	while ( <WORDLIST> ) {
+		chomp ;
+		s/^\s+//;
+		s/\s+$//;
+		next if length==0;
+		push @words,quotemeta $_;
+	}
+	close WORDLIST;
+
+	die "$0: Error: word-list file '$word_list_file' is empty!\n" 
+       		unless @words;
+
+	return @words;	
+}
+
+sub compile_regex(@)
+{
+	my @words = @_;
+
+	my $regex_string = join ( '|', @words ) ;
+	if ( $find_complete_words ) {
+		$regex_string = "\\b($regex_string)\\b"; 
+	}
+	my $regex;
+
+	if ( $find_case_insensitive ) {
+		$regex = qr/$regex_string/i ;
+	} else {
+		$regex = qr/$regex_string/;
+	}
+
+	return $regex;
+}
+
+sub usage()
+{
+print <<EOF;
+
+Word-List Grep
+Copyright (C) 2009 - by A. Gordon ( gordon at cshl dot edu )
+
+Usage: $0 [-o OUTPUT] [-s] [-w] [-i] [-c N] [-v] WORD-LIST-FILE [INPUT-FILE]
+
+   -s   - do not filter first line - always output the first line from the input file.
+   -w   - search for complete words (not partial sub-strings).
+   -i   - case insensitive search.
+   -v   - inverse - output lines NOT matching the word list.
+   -c N - check only column N, instead of entire line (line split by whitespace).
+   -o OUT - specify output file (default = STDOUT).
+   WORD-LIST-FILE - file containing one word per line. These will be used
+          for the search. 
+   INPUT-FILE - (optional) read from file (default = from STDIN).
+
+
+
+EOF
+
+	exit;
+}
Index: /galaxy-central/tools/unix_tools/cut_wrapper.sh
===================================================================
--- /galaxy-central/tools/unix_tools/cut_wrapper.sh (revision 3)
+++ /galaxy-central/tools/unix_tools/cut_wrapper.sh (revision 3)
@@ -0,0 +1,52 @@
+#!/bin/sh
+
+##
+## Galaxy wrapper for cut command.
+##
+
+##
+## command line arguments:
+##   complement flag (might be empty string)
+##   what to cut (fields or characters)
+##   cut list (e.g. 1,2,3,4)
+##   input_file
+##   output_file
+
+COMPLEMENT="$1"
+CUTWHAT="$2"
+CUTLIST="$3"
+INPUT="$4"
+OUTPUT="$5"
+
+if [ -z "$OUTPUT" ]; then
+	echo "This script should be run from inside galaxy!" >&2
+	exit 1
+fi
+
+if [ ! -r "$INPUT" ]; then
+	echo "error: input file ($INPUT) not found!" >&2
+	exit 1
+fi
+
+# Messages printed to STDOUT will be displayed in the "INFO" field in the galaxy dataset.
+# This way the user can tell what was the command
+if [ -z "$COMPLEMENT" ]; then
+	echo -n "Extracting " 
+else
+	echo "Deleting "
+fi
+
+case $CUTWHAT in
+	-f)	echo -n "field(s) "
+		;;
+		
+	-c)	echo -n "character(s) "
+		;;
+esac
+
+echo "$CUTLIST"
+
+
+cut $COMPLEMENT $CUTWHAT $CUTLIST < $INPUT > $OUTPUT
+
+exit 
Index: /galaxy-central/tools/unix_tools/join_tool.sh
===================================================================
--- /galaxy-central/tools/unix_tools/join_tool.sh (revision 3)
+++ /galaxy-central/tools/unix_tools/join_tool.sh (revision 3)
@@ -0,0 +1,37 @@
+#!/bin/sh
+
+#
+# NOTE:
+#  This is a wrapper for GNU's join under galaxy
+#  not ment to be used from command line (if you're using the command line, simply run 'join' directly...)
+#
+# All parameters must be supplied.
+# the join_tool.xml file takes care of that.
+
+JOINTYPE="$1"
+OUTPUT_FORMAT="$2"
+EMPTY_STRING="$3"
+DELIMITER="$4"
+IGNORE_CASE="$5"
+
+INPUT1="$6"
+COLUMN1="$7"
+INPUT2="$8"
+COLUMN2="$9"
+OUTPUT="${10}"
+
+if [ "$OUTPUT" == "" ]; then	
+	echo "This script is part of galaxy. Don't run it manually.\n" >&2
+	exit 1;
+fi
+
+#This a TAB hack for galaxy (which can't transfer a "\t" as a parameter)
+[ "$DELIMITER" == "tab" ] && DELIMITER="	"
+
+#Remove spaces from the output format (if the user entered any)
+OUTPUT_FORMAT=${OUTPUT_FORMAT// /}
+[ "$OUTPUT_FORMAT" != "" ] && OUTPUT_FORMAT="-o $OUTPUT_FORMAT"
+
+echo join $OUTPUT_FORMAT -t "$DELIMITER" -e "$EMPTY_STRING" $IGNORE_CASE $JOINTYPE -1 "$COLUMN1" -2 "$COLUMN2" 
+#echo join $OUTPUT_FORMAT -t "$DELIMITER" -e "$EMPTY_STRING" $IGNORE_CASE $JOINTYPE -1 "$COLUMN1" -2 "$COLUMN2" "$INPUT1" "$INPUT2" \> "$OUTPUT" 
+join $OUTPUT_FORMAT -t "$DELIMITER" -e "$EMPTY_STRING" $JOINTYPE -1 "$COLUMN1" -2 "$COLUMN2" "$INPUT1" "$INPUT2" > "$OUTPUT" || exit 1
Index: /galaxy-central/tools/unix_tools/grep_wrapper.sh
===================================================================
--- /galaxy-central/tools/unix_tools/grep_wrapper.sh (revision 3)
+++ /galaxy-central/tools/unix_tools/grep_wrapper.sh (revision 3)
@@ -0,0 +1,62 @@
+#!/bin/sh
+
+##
+## Galaxy wrapper for GREP command.
+##
+
+##
+## command line arguments:
+##   input_file
+##   output_file
+##   regex
+##   COLOR or NOCOLOR
+##   [other parameters passed on to grep]
+
+INPUT="$1"
+OUTPUT="$2"
+REGEX="$3"
+COLOR="$4"
+
+shift 4
+
+if [ -z "$COLOR" ]; then
+	echo usage: $0 INPUTFILE OUTPUTFILE REGEX COLOR\|NOCOLOR [other grep patameters] >&2
+	exit 1
+fi
+
+if [ ! -r "$INPUT" ]; then
+	echo "error: input file ($INPUT) not found!" >&2
+	exit 1
+fi
+
+# Messages printed to STDOUT will be displayed in the "INFO" field in the galaxy dataset.
+# This way the user can tell what was the command
+echo "grep" "$@" "$REGEX"
+
+if [ "$COLOR" == "COLOR" ]; then
+	#
+	# What the heck is going on here???
+	# 1. "GREP_COLORS" is an environment variable, telling GREP which ANSI colors to use.
+	# 2. "--colors=always" tells grep to actually use colors (according to the GREP_COLORS variable)
+	# 3. first sed command translates the ANSI color to a <FONT> tag with blue color (and a <B> tag, too)
+	# 4. second sed command translates the no-color ANSI command to a </FONT> tag (and a </B> tag, too)
+	# 5. htmlize_pre scripts takes a text input and wraps it in <HTML><BODY><PRE> tags, making it a fixed-font HTML file.
+
+	GREP_COLORS="ms=31" grep --color=always -P "$@" -- "$REGEX" "$INPUT" | \
+		grep -v "^\[36m\[K--\[m\[K$" | \
+		sed -r 's/\[[0123456789;]+m\[K?/<font color="blue"><b>/g' | \
+		sed -r 's/\[m\[K?/<\/b><\/font>/g' | \
+		htmlize_pre.sh > "$OUTPUT"
+
+
+	if (( $? ));  then exit; fi
+
+elif [ "$COLOR" == "NOCOLOR" ]; then
+	grep -P "$@" -- "$REGEX" "$INPUT" | grep -v "^--$" > "$OUTPUT"
+	if (( $? ));  then exit; fi
+else
+	echo Error: third parameter must be "COLOR" or "NOCOLOR" >&2
+	exit 1
+fi
+
+exit 0
Index: /galaxy-central/tools/unix_tools/sed_tool.xml
===================================================================
--- /galaxy-central/tools/unix_tools/sed_tool.xml (revision 3)
+++ /galaxy-central/tools/unix_tools/sed_tool.xml (revision 3)
@@ -0,0 +1,92 @@
+<tool id="cshl_sed_tool" name="sed">
+  <description></description>
+  <!-- NOTE
+  	  'sandbox' is a patched SED program,
+	  which blocks executing shell commands and file reading/writing.
+
+	  Hopefully, it is safe enough to allow users to execute their own SED commands
+	  -->
+  <command interpreter="sh">sed_wrapper.sh $silent $input $output '$url_paste'</command>
+  <inputs>
+    <param format="txt" name="input" type="data" label="File to process" />
+
+    <!-- Note: the parameter ane MUST BE 'url_paste' -
+         This is a hack in the galaxy library (see ./lib/galaxy/util/__init__.py line 142)
+	 If the name is 'url_paste' the string won't be sanitized, and all the non-alphanumeric characters 
+	 will be passed to the shell script -->
+    <param name="url_paste" type="text" area="true" size="5x35" label="SED Program" help=""> 
+    	<validator type="expression" message="Invalid Program!">value.find('\'')==-1</validator>
+    </param>
+
+    <param name="silent" type="select"  label="operation mode" help="(Same as 'sed -n', leave at 'normal' unless you know what you're doing)" > 
+      <option value="">normal</option>
+      <option value="-n">silent</option>
+    </param>
+
+  </inputs>
+  <outputs>
+    <data format="input" name="output" metadata_source="input" />
+  </outputs>
+<help>
+
+**What it does**
+
+This tool runs the unix **sed** command on the selected data file.
+
+.. class:: infomark
+
+**TIP:** This tool uses the **extended regular** expression syntax (same as running 'sed -r').
+
+
+
+**Further reading**
+
+- Short sed tutorial (http://www.linuxhowtos.org/System/sed_tutorial.htm)
+- Long sed tutorial (http://www.grymoire.com/Unix/Sed.html)
+- sed faq with good examples (http://sed.sourceforge.net/sedfaq.html)
+- sed cheat-sheet (http://www.catonmat.net/download/sed.stream.editor.cheat.sheet.pdf)
+- Collection of useful sed one-liners (http://student.northpark.edu/pemente/sed/sed1line.txt)
+
+-----
+
+**Sed commands**
+
+The most useful sed command is **s** (substitute).
+
+**Examples**
+
+- **s/hsa//**  will remove the first instance of 'hsa' in every line.
+- **s/hsa//g**  will remove all instances (beacuse of the **g**) of 'hsa' in every line.
+- **s/A{4,}/--&amp;--/g**  will find sequences of 4 or more consecutive A's, and once found, will surround them with two dashes from each side. The **&amp;** marker is a place holder for 'whatever matched the regular expression'.
+- **s/hsa-mir-([^ ]+)/short name: \\1 full name: &amp;/**  will find strings such as 'hsa-mir-43a' (the regular expression is 'hsa-mir-' followed by non-space characters) and will replace it will string such as 'short name: 43a full name: hsa-mir-43a'.  The **\\1** marker is a place holder for 'whatever matched the first parenthesis' (similar to perl's **$1**) .
+
+
+**sed's Regular Expression Syntax**
+
+The select tool searches the data for lines containing or not containing a match to the given pattern. A Regular Expression is a pattern descibing a certain amount of text. 
+
+- **( ) { } [ ] . * ? + \ ^ $** are all special characters. **\\** can be used to "escape" a special character, allowing that special character to be searched for.
+- **^** matches the beginning of a string(but not an internal line).
+- **(** .. **)** groups a particular pattern.
+- **{** n or n, or n,m **}** specifies an expected number of repetitions of the preceding pattern.
+
+  - **{n}** The preceding item is matched exactly n times.
+  - **{n,}** The preceding item ismatched n or more times. 
+  - **{n,m}** The preceding item is matched at least n times but not more than m times. 
+
+- **[** ... **]** creates a character class. Within the brackets, single characters can be placed. A dash (-) may be used to indicate a range such as **a-z**.
+- **.** Matches any single character except a newline.
+- ***** The preceding item will be matched zero or more times.
+- **?** The preceding item is optional and matched at most once.
+- **+** The preceding item will be matched one or more times.
+- **^** has two meaning:
+  - matches the beginning of a line or string. 
+  - indicates negation in a character class. For example, [^...] matches every character except the ones inside brackets.
+- **$** matches the end of a line or string.
+- **\|** Separates alternate possibilities. 
+
+
+**Note**: SED uses extended regular expression syntax, not Perl syntax. **\\d**, **\\w**, **\\s** etc. are **not** supported.
+
+</help>
+</tool>
Index: /galaxy-central/tools/unix_tools/find_and_replace.pl
===================================================================
--- /galaxy-central/tools/unix_tools/find_and_replace.pl (revision 3)
+++ /galaxy-central/tools/unix_tools/find_and_replace.pl (revision 3)
@@ -0,0 +1,202 @@
+#!/usr/bin/perl
+use strict;
+use warnings;
+use Getopt::Std;
+
+sub parse_command_line();
+sub build_regex_string();
+sub usage();
+
+my $input_file ;
+my $output_file;
+my $find_pattern ;
+my $replace_pattern ;
+my $find_complete_words ;
+my $find_pattern_is_regex ;
+my $find_in_specific_column ;
+my $find_case_insensitive ;
+my $replace_global ;
+my $skip_first_line ;
+
+
+##
+## Program Start
+##
+usage() if @ARGV<2;
+parse_command_line();
+my $regex_string = build_regex_string() ;
+
+# Allow first line to pass without filtering?
+if ( $skip_first_line ) {
+	my $line = <$input_file>;
+	print $output_file $line ;
+}
+
+
+##
+## Main loop
+##
+
+## I LOVE PERL (and hate it, at the same time...)
+##
+## So what's going on with the self-compiling perl code?
+##
+## 1. The program gets the find-pattern and the replace-pattern from the user (as strings).
+## 2. If both the find-pattern and replace-pattern are simple strings (not regex), 
+##    it would be possible to pre-compile a regex (with qr//) and use it in a 's///'
+## 3. If the find-pattern is a regex but the replace-pattern is a simple text string (with out back-references)
+##    it is still possible to pre-compile the regex and use it in a 's///'
+## However,
+## 4. If the replace-pattern contains back-references, pre-compiling is not possible.
+##    (in perl, you can't precompile a substitute regex).
+##    See these examples:
+##    http://www.perlmonks.org/?node_id=84420
+##    http://stackoverflow.com/questions/125171/passing-a-regex-substitution-as-a-variable-in-perl
+##
+##    The solution:
+##    we build the regex string as valid perl code (in 'build_regex()', stored in $regex_string ),
+##    Then eval() a new perl code that contains the substitution regex as inlined code.
+##    Gotta love perl!
+
+my $perl_program ;
+if ( $find_in_specific_column ) {
+	# Find & replace in specific column
+
+	$perl_program = <<EOF;
+	while ( <STDIN> ) {
+		chomp ;
+		my \@columns = split ;
+
+		#not enough columns in this line - skip it
+		next if ( \@columns < $find_in_specific_column ) ;
+
+		\$columns [ $find_in_specific_column - 1 ] =~ $regex_string ;
+
+		print STDOUT join("\t", \@columns), "\n" ;
+	}
+EOF
+
+} else {
+	# Find & replace the entire line
+	$perl_program = <<EOF;
+		while ( <STDIN> ) {
+			$regex_string ;
+			print STDOUT;
+		}
+EOF
+}
+
+
+# The dynamic perl code reads from STDIN and writes to STDOUT,
+# so connect these handles (if the user didn't specifiy input / output
+# file names, these might be already be STDIN/OUT, so the whole could be a no-op).
+*STDIN = $input_file ;
+*STDOUT = $output_file ;
+eval $perl_program ;
+
+
+##
+## Program end
+##
+
+
+sub parse_command_line()
+{
+	my %opts ;
+	getopts('grsiwc:o:', \%opts) or die "$0: Invalid option specified\n";
+
+	die "$0: missing Find-Pattern argument\n" if (@ARGV==0); 
+	$find_pattern = $ARGV[0];
+	die "$0: missing Replace-Pattern argument\n" if (@ARGV==1); 
+	$replace_pattern = $ARGV[1];
+
+	$find_complete_words = ( exists $opts{w} ) ;
+	$find_case_insensitive = ( exists $opts{i} ) ;
+	$skip_first_line = ( exists $opts{s} ) ;
+	$find_pattern_is_regex = ( exists $opts{r} ) ;
+	$replace_global = ( exists $opts{g} ) ;
+
+	# Search in specific column ?
+	if ( defined $opts{c} ) {
+		$find_in_specific_column = $opts{c};
+
+		die "$0: invalid column number ($find_in_specific_column).\n"
+			unless $find_in_specific_column =~ /^\d+$/ ;
+			
+		die "$0: invalid column number ($find_in_specific_column).\n"
+			if $find_in_specific_column <= 0; 
+	}
+	else {
+		$find_in_specific_column = 0 ;
+	}
+
+	# Output File specified (instead of STDOUT) ?
+	if ( defined $opts{o} ) {
+		my $filename = $opts{o};
+		open $output_file, ">$filename" or die "$0: Failed to create output file '$filename': $!\n" ;
+	} else {
+		$output_file = *STDOUT ;
+	}
+
+
+	# Input file Specified (instead of STDIN) ?
+	if ( @ARGV>2 ) {
+		my $filename = $ARGV[2];
+		open $input_file, "<$filename" or die "$0: Failed to open input file '$filename': $!\n" ;
+	} else {
+		$input_file = *STDIN;
+	}
+}
+
+sub build_regex_string()
+{
+	my $find_string ;
+	my $replace_string ;
+
+	if ( $find_pattern_is_regex ) {
+		$find_string = $find_pattern ;
+		$replace_string = $replace_pattern ;
+	} else {
+		$find_string = quotemeta $find_pattern ;
+		$replace_string = quotemeta $replace_pattern;
+	}
+
+	if ( $find_complete_words ) {
+		$find_string = "\\b($find_string)\\b"; 
+	}
+
+	my $regex_string = "s/$find_string/$replace_string/";
+
+	$regex_string .= "i" if ( $find_case_insensitive );
+	$regex_string .= "g" if ( $replace_global ) ;
+	
+
+	return $regex_string;
+}
+
+sub usage()
+{
+print <<EOF;
+
+Find and Replace
+Copyright (C) 2009 - by A. Gordon ( gordon at cshl dot edu )
+
+Usage: $0 [-o OUTPUT] [-g] [-r] [-w] [-i] [-c N] [-l] FIND-PATTERN REPLACE-PATTERN [INPUT-FILE]
+
+   -g   - Global replace - replace all occurences in line/column. 
+          Default - replace just the first instance.
+   -w   - search for complete words (not partial sub-strings).
+   -i   - case insensitive search.
+   -c N - check only column N, instead of entire line (line split by whitespace).
+   -l   - skip first line (don't replace anything in it)
+   -r   - FIND-PATTERN and REPLACE-PATTERN are perl regular expression,
+          usable inside a 's///' statement.
+          By default, they are used as verbatim text strings.
+   -o OUT - specify output file (default = STDOUT).
+   INPUT-FILE - (optional) read from file (default = from STDIN).
+
+
+EOF
+
+	exit;
+}
Index: /galaxy-central/tools/unix_tools/uniq_tool.xml
===================================================================
--- /galaxy-central/tools/unix_tools/uniq_tool.xml (revision 3)
+++ /galaxy-central/tools/unix_tools/uniq_tool.xml (revision 3)
@@ -0,0 +1,25 @@
+<tool id="cshl_uniq_tool" name="uniq">
+  <command>
+  	uniq -f $skipfields $count $repeated $ignorecase $uniqueonly $input $output
+  </command>
+
+  <inputs>
+	<param format="txt" name="input" type="data" label="file to scan for unique values" />
+		
+	<param name="count" type="boolean" label="count [-c]" help="prefix lines by the number of occurrences" truevalue="-c" falsevalue="" />
+
+	<param name="repeated" type="boolean" label="repeated [-d]" help="only print duplicate lines" truevalue="-d" falsevalue="" />
+
+	<param name="ignorecase" type="boolean" label="ignore case [-i]" help="ignore differences in case when comparing" truevalue="-i" falsevalue="" />
+
+	<param name="uniqueonly" type="boolean" label="unique only [-u]" help="only print unique lines" truevalue="-u" falsevalue="" />
+
+	<param name="skipfields" type="integer" label="skip fields [-f]" help="avoind comparing the first N fields. (use zero to start from the first field)" size="2" value="0" />
+  </inputs>
+
+  <outputs>
+    <data format="input" name="output" metadata_source="input"/>
+  </outputs>
+  <help>
+  </help>
+</tool>
Index: /galaxy-central/tools/unix_tools/awk_tool.xml
===================================================================
--- /galaxy-central/tools/unix_tools/awk_tool.xml (revision 3)
+++ /galaxy-central/tools/unix_tools/awk_tool.xml (revision 3)
@@ -0,0 +1,138 @@
+<tool id="cshl_awk_tool" name="awk">
+  <description></description>
+  <command interpreter="sh">awk_wrapper.sh $input $output '$file_data' '$FS' '$OFS'</command>
+  <inputs>
+    <param format="txt" name="input" type="data" label="File to process" />
+
+    <param name="FS" type="select" label="Input field-separator">
+	<option value=",">comma (,)</option>
+	<option value=":">colons (:) </option>
+	<option value=" ">single space</option>
+	<option value=".">dot (.)</option>
+	<option value="-">dash (-)</option>
+	<option value="|">pipe (|)</option>
+	<option value="_">underscore (_)</option>
+	<option selected="True" value="tab">tab</option>
+    </param>
+
+    <param name="OFS" type="select" label="Output field-separator">
+	<option value=",">comma (,)</option>
+	<option value=":">colons (:)</option>
+	<option value=" ">space ( )</option>
+	<option value="-">dash (-)</option>
+	<option value=".">dot (.)</option>
+	<option value="|">pipe (|)</option>
+	<option value="_">underscore (_)</option>
+	<option selected="True" value="tab">tab</option>
+    </param>
+
+
+    <!-- Note: the parameter ane MUST BE 'url_paste' -
+         This is a hack in the galaxy library (see ./lib/galaxy/util/__init__.py line 142)
+	 If the name is 'url_paste' the string won't be sanitized, and all the non-alphanumeric characters 
+	 will be passed to the shell script -->
+    <param name="file_data" type="text" area="true" size="5x35" label="AWK Program" help=""> 
+    	<validator type="expression" message="Invalid Program!">value.find('\'')==-1</validator>
+    </param>
+
+  </inputs>
+  <tests>
+	  <test>
+		  <param name="input" value="unix_awk_input1.txt" />
+		  <output name="output" file="unix_awk_output1.txt" />
+		  <param name="FS" value="tab" />
+		  <param name="OFS" value="tab" />
+		  <param name="file_data"  value="$2>0.5 { print $2*9, $1 }" />
+	  </test>
+  </tests>
+  <outputs>
+    <data format="input" name="output" metadata_source="input" />
+  </outputs>
+<help>
+
+**What it does**
+
+This tool runs the unix **awk** command on the selected data file.
+
+.. class:: infomark
+
+**TIP:** This tool uses the **extended regular** expression syntax (not the perl syntax).
+
+
+**Further reading**
+
+- Awk by Example (http://www.ibm.com/developerworks/linux/library/l-awk1.html)
+- Long AWK tutorial (http://www.grymoire.com/Unix/Awk.html)
+- Learn AWK in 1 hour (http://www.selectorweb.com/awk.html)
+- awk cheat-sheet (http://cbi.med.harvard.edu/people/peshkin/sb302/awk_cheatsheets.pdf)
+- Collection of useful awk one-liners (http://student.northpark.edu/pemente/awk/awk1line.txt)
+
+-----
+
+**AWK programs**
+
+Most AWK programs consist of **patterns** (i.e. rules that match lines of text) and **actions** (i.e. commands to execute when a pattern matches a line).
+
+The basic form of AWK program is::
+
+    pattern { action 1; action 2; action 3; }
+
+
+
+
+
+**Pattern Examples**
+
+- **$2 == "chr3"**  will match lines whose second column is the string 'chr3'
+- **$5-$4>23**  will match lines that after subtracting the value of the fourth column from the value of the fifth column, gives value alrger than 23.
+- **/AG..AG/** will match lines that contain the regular expression **AG..AG** (meaning the characeters AG followed by any two characeters followed by AG). (This is the way to specify regular expressions on the entire line, similar to GREP.)
+- **$7 ~ /A{4}U/**  will match lines whose seventh column contains 4 consecutive A's followed by a U. (This is the way to specify regular expressions on a specific field.)
+- **10000 &lt; $4 &amp;&amp; $4 &lt; 20000** will match lines whose fourth column value is larger than 10,000 but smaller than 20,000
+- If no pattern is specified, all lines match (meaning the **action** part will be executed on all lines).
+
+
+
+**Action Examples**
+
+- **{ print }** or **{ print $0 }**   will print the entire input line (the line that matched in **pattern**). **$0** is a special marker meaning 'the entire line'.
+- **{ print $1, $4, $5 }** will print only the first, fourth and fifth fields of the input line.
+- **{ print $4, $5-$4 }** will print the fourth column and the difference between the fifth and fourth column. (If the fourth column was start-position in the input file, and the fifth column was end-position - the output file will contain the start-position, and the length).
+- If no action part is specified (not even the curly brackets) - the default action is to print the entire line.
+
+
+
+
+
+
+
+
+
+**AWK's Regular Expression Syntax**
+
+The select tool searches the data for lines containing or not containing a match to the given pattern. A Regular Expression is a pattern descibing a certain amount of text. 
+
+- **( ) { } [ ] . * ? + \ ^ $** are all special characters. **\\** can be used to "escape" a special character, allowing that special character to be searched for.
+- **^** matches the beginning of a string(but not an internal line).
+- **(** .. **)** groups a particular pattern.
+- **{** n or n, or n,m **}** specifies an expected number of repetitions of the preceding pattern.
+
+  - **{n}** The preceding item is matched exactly n times.
+  - **{n,}** The preceding item ismatched n or more times. 
+  - **{n,m}** The preceding item is matched at least n times but not more than m times. 
+
+- **[** ... **]** creates a character class. Within the brackets, single characters can be placed. A dash (-) may be used to indicate a range such as **a-z**.
+- **.** Matches any single character except a newline.
+- ***** The preceding item will be matched zero or more times.
+- **?** The preceding item is optional and matched at most once.
+- **+** The preceding item will be matched one or more times.
+- **^** has two meaning:
+  - matches the beginning of a line or string. 
+  - indicates negation in a character class. For example, [^...] matches every character except the ones inside brackets.
+- **$** matches the end of a line or string.
+- **\|** Separates alternate possibilities. 
+
+
+**Note**: AWK uses extended regular expression syntax, not Perl syntax. **\\d**, **\\w**, **\\s** etc. are **not** supported.
+
+</help>
+</tool>
Index: /galaxy-central/database/files/000/dataset_1.dat
===================================================================
--- /galaxy-central/database/files/000/dataset_1.dat (revision 3)
+++ /galaxy-central/database/files/000/dataset_1.dat (revision 3)
@@ -0,0 +1,2 @@
+1	gene1
+2	gene2
Index: /galaxy-central/database/files/000/dataset_2.dat
===================================================================
--- /galaxy-central/database/files/000/dataset_2.dat (revision 3)
+++ /galaxy-central/database/files/000/dataset_2.dat (revision 3)
@@ -0,0 +1,2 @@
+chr1	gene1
+chr2	gene2
Index: /galaxy-central/database/compiled_templates/tool_executed.mako.py
===================================================================
--- /galaxy-central/database/compiled_templates/tool_executed.mako.py (revision 3)
+++ /galaxy-central/database/compiled_templates/tool_executed.mako.py (revision 3)
@@ -0,0 +1,68 @@
+from mako import runtime, filters, cache
+UNDEFINED = runtime.UNDEFINED
+__M_dict_builtin = dict
+__M_locals_builtin = locals
+_magic_number = 5
+_modified_time = 1287725813.3330619
+_template_filename='templates/tool_executed.mako'
+_template_uri='tool_executed.mako'
+_template_cache=cache.Cache(__name__, _modified_time)
+_source_encoding=None
+_exports = []
+
+
+def render_body(context,**pageargs):
+    context.caller_stack._push_frame()
+    try:
+        __M_locals = __M_dict_builtin(pageargs=pageargs)
+        h = context.get('h', UNDEFINED)
+        tool = context.get('tool', UNDEFINED)
+        trans = context.get('trans', UNDEFINED)
+        out_data = context.get('out_data', UNDEFINED)
+        __M_writer = context.writer()
+        # SOURCE LINE 1
+        __M_writer(u'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">\n<html>\n\n<head>\n<title>Galaxy</title>\n<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />\n<link href="')
+        # SOURCE LINE 7
+        __M_writer(unicode(h.url_for('/static/style/base.css')))
+        __M_writer(u'" rel="stylesheet" type="text/css" />\n<script type="text/javascript">\n  var inside_galaxy_frameset = false;\n\n  if ( parent.frames && parent.frames.galaxy_history ) {\n      parent.frames.galaxy_history.location.href="')
+        # SOURCE LINE 12
+        __M_writer(unicode(h.url_for( controller='root', action='history' )))
+        __M_writer(u'";\n      inside_galaxy_frameset = true;\n  }\n\n')
+        # SOURCE LINE 16
+        if trans.user:  
+            # SOURCE LINE 17
+            __M_writer(u'      if (inside_galaxy_frameset)\n      {\n            parent.frames.galaxy_tools.update_recently_used();\n      }\n')
+        # SOURCE LINE 22
+        __M_writer(u'  \n  if ( parent.handle_minwidth_hint ) {\n      parent.handle_minwidth_hint( -1 );\n  }\n\n  function main() {\n    // If called from outside the galaxy frameset, redirect there\n')
+        # SOURCE LINE 29
+        if tool.options.refresh:
+            # SOURCE LINE 30
+            __M_writer(u'      if ( ! inside_galaxy_frameset ) {\n        setTimeout( "refresh()", 1000 );\n        document.getElementById( "refresh_message" ).style.display = "block";\n      }\n')
+        # SOURCE LINE 35
+        __M_writer(u"  }\n\n  function refresh() {\n    top.location.href = '")
+        # SOURCE LINE 38
+        __M_writer(unicode(h.url_for( "/" )))
+        __M_writer(u'\';\n  }  \n\n</script>\n\n</head>\n\n<body onLoad="main()">\n\n<div class="donemessagelarge">\n\n<p>The following job has been successfully added to the queue:</p>\n\n')
+        # SOURCE LINE 51
+        for data in out_data.values():
+            # SOURCE LINE 52
+            __M_writer(u'   <div style="padding: 10px"><b> ')
+            __M_writer(unicode(data.hid))
+            __M_writer(u': ')
+            __M_writer(unicode(data.name))
+            __M_writer(u'</b></div>\n')
+        # SOURCE LINE 54
+        __M_writer(u"\n<p>\nYou can check the status of queued jobs and view the resulting \ndata by refreshing the <b>History</b> pane. When the job has been run\nthe status will change from 'running' to 'finished' if completed \nsuccessfully or 'error' if problems were encountered.\n</p>\n\n")
+        # SOURCE LINE 62
+        if tool.options.refresh:
+            # SOURCE LINE 63
+            __M_writer(u'<p id="refresh_message" style="display: none;">You are now being redirected back to <a href="')
+            __M_writer(unicode(h.url_for( '/' )))
+            __M_writer(u'">Galaxy</a></div>\n')
+        # SOURCE LINE 65
+        __M_writer(u'\n</div>\n\n</body>\n\n</html>\n')
+        return ''
+    finally:
+        context.caller_stack._pop_frame()
+
+
Index: /galaxy-central/database/compiled_templates/message.mako.py
===================================================================
--- /galaxy-central/database/compiled_templates/message.mako.py (revision 3)
+++ /galaxy-central/database/compiled_templates/message.mako.py (revision 3)
@@ -0,0 +1,220 @@
+from mako import runtime, filters, cache
+UNDEFINED = runtime.UNDEFINED
+__M_dict_builtin = dict
+__M_locals_builtin = locals
+_magic_number = 5
+_modified_time = 1287725818.341774
+_template_filename=u'templates/message.mako'
+_template_uri=u'/message.mako'
+_template_cache=cache.Cache(__name__, _modified_time)
+_source_encoding=None
+_exports = ['body', 'render_msg', 'center_panel', 'init', 'render_large_message', 'javascripts']
+
+
+# SOURCE LINE 1
+
+def inherit(context):
+    if context.get('use_panels'):
+        if context.get('webapp'):
+            webapp = context.get('webapp')
+        else:
+            webapp = 'galaxy'
+        return '/webapps/%s/base_panels.mako' % webapp
+    else:
+        return '/base.mako'
+
+
+def _mako_get_namespace(context, name):
+    try:
+        return context.namespaces[(__name__, name)]
+    except KeyError:
+        _mako_generate_namespaces(context)
+        return context.namespaces[(__name__, name)]
+def _mako_generate_namespaces(context):
+    pass
+def _mako_inherit(template, context):
+    _mako_generate_namespaces(context)
+    return runtime._inherit_from(context, (inherit(context)), _template_uri)
+def render_body(context,**pageargs):
+    context.caller_stack._push_frame()
+    try:
+        __M_locals = __M_dict_builtin(pageargs=pageargs)
+        n_ = context.get('n_', UNDEFINED)
+        __M_writer = context.writer()
+        # SOURCE LINE 11
+        __M_writer(u'\n')
+        # SOURCE LINE 12
+        __M_writer(u'\n')
+        # SOURCE LINE 13
+        _=n_ 
+        
+        __M_locals.update(__M_dict_builtin([(__M_key, __M_locals_builtin()[__M_key]) for __M_key in ['_'] if __M_key in __M_locals_builtin()]))
+        __M_writer(u'\n\n')
+        # SOURCE LINE 22
+        __M_writer(u'\n\n')
+        # SOURCE LINE 66
+        __M_writer(u'\n\n')
+        # SOURCE LINE 71
+        __M_writer(u'\n')
+        # SOURCE LINE 74
+        __M_writer(u'\n\n')
+        # SOURCE LINE 78
+        __M_writer(u'\n\n')
+        # SOURCE LINE 83
+        __M_writer(u'\n\n')
+        # SOURCE LINE 89
+        __M_writer(u'\n\n')
+        return ''
+    finally:
+        context.caller_stack._pop_frame()
+
+
+def render_body(context):
+    context.caller_stack._push_frame()
+    try:
+        status = context.get('status', UNDEFINED)
+        message = context.get('message', UNDEFINED)
+        def render_large_message(message,status):
+            return render_render_large_message(context,message,status)
+        __M_writer = context.writer()
+        # SOURCE LINE 76
+        __M_writer(u'\n    ')
+        # SOURCE LINE 77
+        __M_writer(unicode(render_large_message( message, status )))
+        __M_writer(u'\n')
+        return ''
+    finally:
+        context.caller_stack._pop_frame()
+
+
+def render_render_msg(context,msg,status='done'):
+    context.caller_stack._push_frame()
+    try:
+        _ = context.get('_', UNDEFINED)
+        __M_writer = context.writer()
+        # SOURCE LINE 86
+        __M_writer(u'\n    <div class="')
+        # SOURCE LINE 87
+        __M_writer(unicode(status))
+        __M_writer(u'message">')
+        __M_writer(unicode(_(msg)))
+        __M_writer(u'</div>\n    <br/>\n')
+        return ''
+    finally:
+        context.caller_stack._pop_frame()
+
+
+def render_center_panel(context):
+    context.caller_stack._push_frame()
+    try:
+        status = context.get('status', UNDEFINED)
+        message = context.get('message', UNDEFINED)
+        def render_large_message(message,status):
+            return render_render_large_message(context,message,status)
+        __M_writer = context.writer()
+        # SOURCE LINE 72
+        __M_writer(u'\n    ')
+        # SOURCE LINE 73
+        __M_writer(unicode(render_large_message( message, status )))
+        __M_writer(u'\n')
+        return ''
+    finally:
+        context.caller_stack._pop_frame()
+
+
+def render_init(context):
+    context.caller_stack._push_frame()
+    try:
+        self = context.get('self', UNDEFINED)
+        active_view = context.get('active_view', UNDEFINED)
+        __M_writer = context.writer()
+        # SOURCE LINE 15
+        __M_writer(u'\n')
+        # SOURCE LINE 16
+
+        self.has_left_panel=False
+        self.has_right_panel=False
+        self.active_view=active_view
+        self.message_box_visible=False
+        
+        
+        # SOURCE LINE 21
+        __M_writer(u'\n')
+        return ''
+    finally:
+        context.caller_stack._pop_frame()
+
+
+def render_render_large_message(context,message,status):
+    context.caller_stack._push_frame()
+    try:
+        _ = context.get('_', UNDEFINED)
+        __M_writer = context.writer()
+        # SOURCE LINE 81
+        __M_writer(u'\n    <div class="')
+        # SOURCE LINE 82
+        __M_writer(unicode(status))
+        __M_writer(u'messagelarge" style="margin: 1em">')
+        __M_writer(unicode(_(message)))
+        __M_writer(u'</div>\n')
+        return ''
+    finally:
+        context.caller_stack._pop_frame()
+
+
+def render_javascripts(context):
+    context.caller_stack._push_frame()
+    try:
+        parent = context.get('parent', UNDEFINED)
+        int = context.get('int', UNDEFINED)
+        h = context.get('h', UNDEFINED)
+        app = context.get('app', UNDEFINED)
+        refresh_frames = context.get('refresh_frames', UNDEFINED)
+        trans = context.get('trans', UNDEFINED)
+        __M_writer = context.writer()
+        # SOURCE LINE 24
+        __M_writer(u'\n    ')
+        # SOURCE LINE 25
+        __M_writer(unicode(parent.javascripts()))
+        __M_writer(u'\n    <script type="text/javascript">\n')
+        # SOURCE LINE 27
+        if 'masthead' in refresh_frames:
+            # SOURCE LINE 34
+            __M_writer(u'            \n')
+            # SOURCE LINE 36
+            __M_writer(u'            if ( parent.user_changed ) {\n')
+            # SOURCE LINE 37
+            if trans.user:
+                # SOURCE LINE 38
+                __M_writer(u'                    parent.user_changed( "')
+                __M_writer(unicode(trans.user.email))
+                __M_writer(u'", ')
+                __M_writer(unicode(int( app.config.is_admin_user( trans.user ) )))
+                __M_writer(u' );\n')
+                # SOURCE LINE 39
+            else:
+                # SOURCE LINE 40
+                __M_writer(u'                    parent.user_changed( null, false );\n')
+            # SOURCE LINE 42
+            __M_writer(u'            }\n')
+        # SOURCE LINE 44
+        if 'history' in refresh_frames:
+            # SOURCE LINE 45
+            __M_writer(u'            if ( parent.frames && parent.frames.galaxy_history ) {\n                parent.frames.galaxy_history.location.href="')
+            # SOURCE LINE 46
+            __M_writer(unicode(h.url_for( controller='root', action='history')))
+            __M_writer(u'";\n                if ( parent.force_right_panel ) {\n                    parent.force_right_panel( \'show\' );\n                }\n            }\n')
+        # SOURCE LINE 52
+        if 'tools' in refresh_frames:
+            # SOURCE LINE 53
+            __M_writer(u'            if ( parent.frames && parent.frames.galaxy_tools ) {\n                parent.frames.galaxy_tools.location.href="')
+            # SOURCE LINE 54
+            __M_writer(unicode(h.url_for( controller='root', action='tool_menu')))
+            __M_writer(u'";\n                if ( parent.force_left_panel ) {\n                    parent.force_left_panel( \'show\' );\n                }\n            }\n')
+        # SOURCE LINE 60
+        __M_writer(u'\n        if ( parent.handle_minwidth_hint )\n        {\n            parent.handle_minwidth_hint( -1 );\n        }\n    </script>\n')
+        return ''
+    finally:
+        context.caller_stack._pop_frame()
+
+
Index: /galaxy-central/database/compiled_templates/webapps/galaxy/base_panels.mako.py
===================================================================
--- /galaxy-central/database/compiled_templates/webapps/galaxy/base_panels.mako.py (revision 3)
+++ /galaxy-central/database/compiled_templates/webapps/galaxy/base_panels.mako.py (revision 3)
@@ -0,0 +1,298 @@
+from mako import runtime, filters, cache
+UNDEFINED = runtime.UNDEFINED
+__M_dict_builtin = dict
+__M_locals_builtin = locals
+_magic_number = 5
+_modified_time = 1287725326.7917881
+_template_filename=u'templates/webapps/galaxy/base_panels.mako'
+_template_uri=u'/webapps/galaxy/base_panels.mako'
+_template_cache=cache.Cache(__name__, _modified_time)
+_source_encoding=None
+_exports = ['masthead', 'title']
+
+
+def _mako_get_namespace(context, name):
+    try:
+        return context.namespaces[(__name__, name)]
+    except KeyError:
+        _mako_generate_namespaces(context)
+        return context.namespaces[(__name__, name)]
+def _mako_generate_namespaces(context):
+    pass
+def _mako_inherit(template, context):
+    _mako_generate_namespaces(context)
+    return runtime._inherit_from(context, u'/base_panels.mako', _template_uri)
+def render_body(context,**pageargs):
+    context.caller_stack._push_frame()
+    try:
+        __M_locals = __M_dict_builtin(pageargs=pageargs)
+        __M_writer = context.writer()
+        # SOURCE LINE 1
+        __M_writer(u'\n\n')
+        # SOURCE LINE 4
+        __M_writer(u'\n\n')
+        # SOURCE LINE 172
+        __M_writer(u'\n')
+        return ''
+    finally:
+        context.caller_stack._pop_frame()
+
+
+def render_masthead(context):
+    context.caller_stack._push_frame()
+    try:
+        h = context.get('h', UNDEFINED)
+        app = context.get('app', UNDEFINED)
+        trans = context.get('trans', UNDEFINED)
+        def tab(id,display,href,target='_parent',visible=True,extra_class='',menu_options=None):
+            context.caller_stack._push_frame()
+            try:
+                self = context.get('self', UNDEFINED)
+                len = context.get('len', UNDEFINED)
+                __M_writer = context.writer()
+                # SOURCE LINE 15
+                __M_writer(u'\n')
+                # SOURCE LINE 18
+                __M_writer(u'    \n        ')
+                # SOURCE LINE 19
+
+                cls = "tab"
+                if extra_class:
+                    cls += " " + extra_class
+                if self.active_view == id:
+                    cls += " active"
+                style = ""
+                if not visible:
+                    style = "display: none;"
+                
+                
+                # SOURCE LINE 28
+                __M_writer(u'\n        <td class="')
+                # SOURCE LINE 29
+                __M_writer(unicode(cls))
+                __M_writer(u'" style="')
+                __M_writer(unicode(style))
+                __M_writer(u'">\n')
+                # SOURCE LINE 30
+                if href:
+                    # SOURCE LINE 31
+                    __M_writer(u'                <a target="')
+                    __M_writer(unicode(target))
+                    __M_writer(u'" href="')
+                    __M_writer(unicode(href))
+                    __M_writer(u'">')
+                    __M_writer(unicode(display))
+                    __M_writer(u'</a>\n')
+                    # SOURCE LINE 32
+                else:
+                    # SOURCE LINE 33
+                    __M_writer(u'                <a>')
+                    __M_writer(unicode(display))
+                    __M_writer(u'</a>\n')
+                # SOURCE LINE 35
+                if menu_options:
+                    # SOURCE LINE 36
+                    __M_writer(u'                <div class="submenu">\n                <ul>\n')
+                    # SOURCE LINE 38
+                    for menu_item in menu_options:
+                        # SOURCE LINE 39
+                        __M_writer(u'                        <li>\n')
+                        # SOURCE LINE 40
+                        if not menu_item:
+                            # SOURCE LINE 41
+                            __M_writer(u'                            <hr style="color: inherit; background-color: gray"/></li>\n')
+                            # SOURCE LINE 42
+                        else:
+                            # SOURCE LINE 43
+                            if len ( menu_item ) == 1:
+                                # SOURCE LINE 44
+                                __M_writer(u'                                ')
+                                __M_writer(unicode(menu_item[0]))
+                                __M_writer(u'\n')
+                                # SOURCE LINE 45
+                            elif len ( menu_item ) == 2:
+                                # SOURCE LINE 46
+                                __M_writer(u'                                ')
+                                name, link = menu_item 
+                                
+                                __M_writer(u'\n                                <a href="')
+                                # SOURCE LINE 47
+                                __M_writer(unicode(link))
+                                __M_writer(u'">')
+                                __M_writer(unicode(name))
+                                __M_writer(u'</a></li>\n')
+                                # SOURCE LINE 48
+                            else:
+                                # SOURCE LINE 49
+                                __M_writer(u'                                ')
+                                name, link, target = menu_item 
+                                
+                                __M_writer(u'\n                                <a target="')
+                                # SOURCE LINE 50
+                                __M_writer(unicode(target))
+                                __M_writer(u'" href="')
+                                __M_writer(unicode(link))
+                                __M_writer(u'">')
+                                __M_writer(unicode(name))
+                                __M_writer(u'</a></li>\n')
+                    # SOURCE LINE 54
+                    __M_writer(u'                </ul>\n                </div>\n')
+                # SOURCE LINE 57
+                __M_writer(u'        </td>\n    ')
+                return ''
+            finally:
+                context.caller_stack._pop_frame()
+        __M_writer = context.writer()
+        # SOURCE LINE 7
+        __M_writer(u'\n\n')
+        # SOURCE LINE 10
+        __M_writer(u'    <div style="position: absolute; top: 0; left: 0; width: 100%; text-align: center">\n    \n    <table class="tab-group" border="0" cellspacing="0" style="margin: auto;">\n    <tr>\n    \n    ')
+        # SOURCE LINE 58
+        __M_writer(u'\n    \n\n')
+        # SOURCE LINE 62
+        __M_writer(u'    ')
+        __M_writer(unicode(tab( "analysis", "Analyze Data", h.url_for( controller='/root', action='index' ) )))
+        __M_writer(u'\n    \n')
+        # SOURCE LINE 65
+        __M_writer(u'    ')
+        __M_writer(unicode(tab( "workflow", "Workflow", h.url_for( controller='/workflow', action='index' ) )))
+        __M_writer(u'\n    \n')
+        # SOURCE LINE 68
+        __M_writer(u'    ')
+
+        menu_options = [ 
+                        [ 'Data Libraries', h.url_for( controller='/library', action='index') ],
+                        None,
+                        [ 'Published Histories', h.url_for( controller='/history', action='list_published' ) ],
+                        [ 'Published Workflows', h.url_for( controller='/workflow', action='list_published' ) ],
+                        [ 'Published Visualizations', h.url_for( controller='/visualization', action='list_published' ) ],
+                        [ 'Published Pages', h.url_for( controller='/page', action='list_published' ) ]
+                       ]
+        tab( "shared", "Shared Data", h.url_for( controller='/library', action='index'), menu_options=menu_options )
+            
+        
+        # SOURCE LINE 78
+        __M_writer(u'\n    \n')
+        # SOURCE LINE 81
+        __M_writer(u'    ')
+
+        menu_options = [
+                         [ 'Sequencing Requests', h.url_for( controller='/requests', action='index' ) ],
+                         [ 'Find Samples', h.url_for( controller='/requests', action='find_samples_index' ) ],
+                         [ 'Help', app.config.get( "lims_doc_url", "http://main.g2.bx.psu.edu/u/rkchak/p/sts" ), "galaxy_main" ]
+                       ]
+        tab( "lab", "Lab", None, menu_options=menu_options, visible=( trans.user and trans.user.requests ) )
+            
+        
+        # SOURCE LINE 88
+        __M_writer(u'\n\n')
+        # SOURCE LINE 91
+        if app.config.get_bool( 'enable_tracks', False ):
+            # SOURCE LINE 92
+            __M_writer(u'        ')
+
+            menu_options = [
+                             ['New Track Browser', h.url_for( controller='/tracks', action='index' ) ],
+                             ['Saved Visualizations', h.url_for( controller='/visualization', action='list' ) ]
+                           ]
+            tab( "visualization", "Visualization", h.url_for( controller='/visualization', action='list'), menu_options=menu_options )
+                    
+            
+            # SOURCE LINE 98
+            __M_writer(u'\n')
+        # SOURCE LINE 100
+        __M_writer(u'\n')
+        # SOURCE LINE 102
+        __M_writer(u'    ')
+        __M_writer(unicode(tab( "admin", "Admin", h.url_for( controller='/admin', action='index' ), extra_class="admin-only", visible=( trans.user and app.config.is_admin_user( trans.user ) ) )))
+        __M_writer(u'\n    \n')
+        # SOURCE LINE 105
+        __M_writer(u'    ')
+
+        menu_options = [
+                            ['Email comments, bug reports, or suggestions', app.config.get( "bugs_email", "mailto:galaxy-bugs@bx.psu.edu"  ) ],
+                            ['Galaxy Wiki', app.config.get( "wiki_url", "http://bitbucket.org/galaxy/galaxy-central/wiki" ), "_blank" ],
+                            ['Video tutorials (screencasts)', app.config.get( "screencasts_url", "http://galaxycast.org" ), "_blank" ],
+                            ['How to Cite Galaxy', app.config.get( "screencasts_url", "http://bitbucket.org/galaxy/galaxy-central/wiki/Citations" ), "_blank" ]
+                        ]
+        tab( "help", "Help", None, menu_options=menu_options)
+            
+        
+        # SOURCE LINE 113
+        __M_writer(u'\n    \n')
+        # SOURCE LINE 116
+        __M_writer(u'    ')
+  
+        # Menu for user who is not logged in.
+        menu_options = [ [ "Login", h.url_for( controller='/user', action='login' ), "galaxy_main" ] ]
+        if app.config.allow_user_creation:
+            menu_options.append( [ "Register", h.url_for( controller='/user', action='create' ), "galaxy_main" ] ) 
+        extra_class = "loggedout-only"
+        visible = ( trans.user == None )
+        tab( "user", "User", None, visible=visible, menu_options=menu_options )
+        
+        # Menu for user who is logged in.
+        if trans.user:
+            email = trans.user.email
+        else:
+            email = ""
+        menu_options = [ [ '<li>Logged in as <span id="user-email">%s</span></li>' %  email ] ]
+        if app.config.use_remote_user:
+            if app.config.remote_user_logout_href:
+                menu_options.append( [ 'Logout', app.config.remote_user_logout_href, "galaxy_main" ] )
+        else:
+            menu_options.append( [ 'Preferences', h.url_for( controller='/user', action='index' ), "galaxy_main" ] )
+            if app.config.get_bool( 'enable_tracks', False ):
+                menu_options.append( [ 'Custom Builds', h.url_for( controller='/user', action='dbkeys' ), "galaxy_main" ] )
+            if app.config.require_login:
+                logout_url = h.url_for( controller='/root', action='index', m_c='user', m_a='logout' )
+            else:
+                logout_url = h.url_for( controller='/user', action='logout' )
+            menu_options.append( [ 'Logout', logout_url, "_top" ] )
+            menu_options.append( None )
+        menu_options.append( [ 'Saved Histories', h.url_for( controller='/history', action='list' ), "galaxy_main" ] )
+        menu_options.append( [ 'Saved Datasets', h.url_for( controller='/dataset', action='list' ), "galaxy_main" ] )
+        if app.config.get_bool( 'enable_pages', False ):
+            menu_options.append( [ 'Saved Pages', h.url_for( controller='/page', action='list' ), "_top" ] )
+        if app.config.enable_api:
+            menu_options.append( [ 'API Keys', h.url_for( controller='/user', action='api_keys' ), "galaxy_main" ] )
+            
+        extra_class = "loggedin-only"
+        visible = ( trans.user != None )
+        tab( "user", "User", None, visible=visible, menu_options=menu_options )
+            
+        
+        # SOURCE LINE 154
+        __M_writer(u'\n    \n    </tr>\n    </table>\n    \n    </div>\n    \n')
+        # SOURCE LINE 162
+        __M_writer(u'    <div class="title" style="position: absolute; top: 0; left: 0;">\n        <a href="')
+        # SOURCE LINE 163
+        __M_writer(unicode(app.config.get( 'logo_url', '/' )))
+        __M_writer(u'">\n        <img border="0" src="')
+        # SOURCE LINE 164
+        __M_writer(unicode(h.url_for('/static/images/galaxyIcon_noText.png')))
+        __M_writer(u'" style="width: 26px; vertical-align: top;">\n        Galaxy\n')
+        # SOURCE LINE 166
+        if app.config.brand:
+            # SOURCE LINE 167
+            __M_writer(u"            <span class='brand'>/ ")
+            __M_writer(unicode(app.config.brand))
+            __M_writer(u'</span>\n')
+        # SOURCE LINE 169
+        __M_writer(u'        </a>\n    </div>\n    \n')
+        return ''
+    finally:
+        context.caller_stack._pop_frame()
+
+
+def render_title(context):
+    context.caller_stack._push_frame()
+    try:
+        __M_writer = context.writer()
+        # SOURCE LINE 4
+        __M_writer(u'Galaxy')
+        return ''
+    finally:
+        context.caller_stack._pop_frame()
+
+
Index: /galaxy-central/database/compiled_templates/root/index.mako.py
===================================================================
--- /galaxy-central/database/compiled_templates/root/index.mako.py (revision 3)
+++ /galaxy-central/database/compiled_templates/root/index.mako.py (revision 3)
@@ -0,0 +1,259 @@
+from mako import runtime, filters, cache
+UNDEFINED = runtime.UNDEFINED
+__M_dict_builtin = dict
+__M_locals_builtin = locals
+_magic_number = 5
+_modified_time = 1287725326.7005551
+_template_filename='templates/root/index.mako'
+_template_uri='root/index.mako'
+_template_cache=cache.Cache(__name__, _modified_time)
+_source_encoding=None
+_exports = ['init', 'left_panel', 'center_panel', 'late_javascripts', 'right_panel']
+
+
+def _mako_get_namespace(context, name):
+    try:
+        return context.namespaces[(__name__, name)]
+    except KeyError:
+        _mako_generate_namespaces(context)
+        return context.namespaces[(__name__, name)]
+def _mako_generate_namespaces(context):
+    pass
+def _mako_inherit(template, context):
+    _mako_generate_namespaces(context)
+    return runtime._inherit_from(context, u'/webapps/galaxy/base_panels.mako', _template_uri)
+def render_body(context,**pageargs):
+    context.caller_stack._push_frame()
+    try:
+        __M_locals = __M_dict_builtin(pageargs=pageargs)
+        __M_writer = context.writer()
+        # SOURCE LINE 1
+        __M_writer(u'\n\n')
+        # SOURCE LINE 156
+        __M_writer(u'\n\n')
+        # SOURCE LINE 176
+        __M_writer(u'\n\n')
+        # SOURCE LINE 190
+        __M_writer(u'\n\n')
+        # SOURCE LINE 212
+        __M_writer(u'\n\n')
+        # SOURCE LINE 226
+        __M_writer(u'\n')
+        return ''
+    finally:
+        context.caller_stack._pop_frame()
+
+
+def render_init(context):
+    context.caller_stack._push_frame()
+    try:
+        self = context.get('self', UNDEFINED)
+        trans = context.get('trans', UNDEFINED)
+        __M_writer = context.writer()
+        # SOURCE LINE 158
+        __M_writer(u'\n')
+        # SOURCE LINE 159
+
+        if trans.app.config.cloud_controller_instance:
+                self.has_left_panel=False
+                self.has_right_panel=False
+                self.active_view="cloud"
+        else:
+                self.has_left_panel=True
+                self.has_right_panel=True
+                self.active_view="analysis"
+        
+        
+        # SOURCE LINE 168
+        __M_writer(u'\n')
+        # SOURCE LINE 169
+        if trans.app.config.require_login and not trans.user:
+            # SOURCE LINE 170
+            __M_writer(u'    <script type="text/javascript">\n        if ( window != top ) {\n            top.location.href = location.href;\n        }\n    </script>\n')
+        return ''
+    finally:
+        context.caller_stack._pop_frame()
+
+
+def render_left_panel(context):
+    context.caller_stack._push_frame()
+    try:
+        h = context.get('h', UNDEFINED)
+        _ = context.get('_', UNDEFINED)
+        n_ = context.get('n_', UNDEFINED)
+        __M_writer = context.writer()
+        # SOURCE LINE 178
+        __M_writer(u'\n    <div class="unified-panel-header" unselectable="on">\n        <div class=\'unified-panel-header-inner\'>\n            <div style="float: right">\n                <a class=\'panel-header-button popup\' id="tools-options-button" href="#">')
+        # SOURCE LINE 182
+        __M_writer(unicode(_('Options')))
+        __M_writer(u'</a>\n            </div>\n            ')
+        # SOURCE LINE 184
+        __M_writer(unicode(n_('Tools')))
+        __M_writer(u'\n        </div>\n    </div>\n    <div class="unified-panel-body" style="overflow: hidden;">\n        <iframe name="galaxy_tools" id="galaxy_tools" src="')
+        # SOURCE LINE 188
+        __M_writer(unicode(h.url_for( controller='root', action='tool_menu' )))
+        __M_writer(u'" frameborder="0" style="position: absolute; margin: 0; border: 0 none; height: 100%; width: 100%;"> </iframe>\n    </div>\n')
+        return ''
+    finally:
+        context.caller_stack._pop_frame()
+
+
+def render_center_panel(context):
+    context.caller_stack._push_frame()
+    try:
+        tool_id = context.get('tool_id', UNDEFINED)
+        m_c = context.get('m_c', UNDEFINED)
+        h = context.get('h', UNDEFINED)
+        m_a = context.get('m_a', UNDEFINED)
+        workflow_id = context.get('workflow_id', UNDEFINED)
+        trans = context.get('trans', UNDEFINED)
+        __M_writer = context.writer()
+        # SOURCE LINE 192
+        __M_writer(u'\n\n')
+        # SOURCE LINE 195
+        __M_writer(u'    ')
+
+        if trans.app.config.require_login and not trans.user:
+            center_url = h.url_for( controller='user', action='login' )
+        elif tool_id is not None:
+            center_url = h.url_for( 'tool_runner', tool_id=tool_id, from_noframe=True )
+        elif workflow_id is not None:
+            center_url = h.url_for( controller='workflow', action='run', id=workflow_id )
+        elif m_c is not None:
+            center_url = h.url_for( controller=m_c, action=m_a )
+        elif trans.app.config.cloud_controller_instance:
+            center_url = h.url_for( controller='cloud', action='list' )
+        else:
+            center_url = h.url_for( '/static/welcome.html' )
+        
+        
+        # SOURCE LINE 208
+        __M_writer(u'\n    \n    <iframe name="galaxy_main" id="galaxy_main" frameborder="0" style="position: absolute; width: 100%; height: 100%;" src="')
+        # SOURCE LINE 210
+        __M_writer(unicode(center_url))
+        __M_writer(u'"> </iframe>\n\n')
+        return ''
+    finally:
+        context.caller_stack._pop_frame()
+
+
+def render_late_javascripts(context):
+    context.caller_stack._push_frame()
+    try:
+        h = context.get('h', UNDEFINED)
+        trans = context.get('trans', UNDEFINED)
+        parent = context.get('parent', UNDEFINED)
+        __M_writer = context.writer()
+        # SOURCE LINE 3
+        __M_writer(u'\n    ')
+        # SOURCE LINE 4
+        __M_writer(unicode(parent.late_javascripts()))
+        __M_writer(u'\n    <script type="text/javascript">\n    // Set up GalaxyAsync object.\n    var galaxy_async = new GalaxyAsync();\n    galaxy_async.set_func_url(galaxy_async.set_user_pref, "')
+        # SOURCE LINE 8
+        __M_writer(unicode(h.url_for( controller='user', action='set_user_pref_async' )))
+        __M_writer(u'");\n    \n    $(function(){\n        // Init history options.\n        $("#history-options-button").css( "position", "relative" );\n        make_popupmenu( $("#history-options-button"), {\n            "History Lists": null,\n            "Saved Histories": function() {\n                galaxy_main.location = "')
+        # SOURCE LINE 16
+        __M_writer(unicode(h.url_for( controller='history', action='list')))
+        __M_writer(u'";\n            },\n            "Histories Shared with Me": function() {\n                galaxy_main.location = "')
+        # SOURCE LINE 19
+        __M_writer(unicode(h.url_for( controller='history', action='list_shared')))
+        __M_writer(u'";\n            },\n            "Current History": null,\n            "Create New": function() {\n                galaxy_history.location = "')
+        # SOURCE LINE 23
+        __M_writer(unicode(h.url_for( controller='root', action='history_new' )))
+        __M_writer(u'";\n            },\n            "Clone": function() {\n                galaxy_main.location = "')
+        # SOURCE LINE 26
+        __M_writer(unicode(h.url_for( controller='history', action='clone')))
+        __M_writer(u'";\n            },\n            "Share or Publish": function() {\n                galaxy_main.location = "')
+        # SOURCE LINE 29
+        __M_writer(unicode(h.url_for( controller='history', action='sharing' )))
+        __M_writer(u'";\n            },\n            "Extract Workflow": function() {\n                galaxy_main.location = "')
+        # SOURCE LINE 32
+        __M_writer(unicode(h.url_for( controller='workflow', action='build_from_current_history' )))
+        __M_writer(u'";\n            },\n            "Dataset Security": function() {\n                galaxy_main.location = "')
+        # SOURCE LINE 35
+        __M_writer(unicode(h.url_for( controller='root', action='history_set_default_permissions' )))
+        __M_writer(u'";\n            },\n            "Show Deleted Datasets": function() {\n                galaxy_history.location = "')
+        # SOURCE LINE 38
+        __M_writer(unicode(h.url_for( controller='root', action='history', show_deleted=True)))
+        __M_writer(u'";\n            },\n            "Show Hidden Datasets": function() {\n                galaxy_history.location = "')
+        # SOURCE LINE 41
+        __M_writer(unicode(h.url_for( controller='root', action='history', show_hidden=True)))
+        __M_writer(u'";\n            },\n            "Show structure": function() {\n                galaxy_main.location = "')
+        # SOURCE LINE 44
+        __M_writer(unicode(h.url_for( controller='history', action='display_structured' )))
+        __M_writer(u'";\n            },\n            "Export to File": function() {\n                galaxy_main.location = "')
+        # SOURCE LINE 47
+        __M_writer(unicode(h.url_for( controller='history', action='export_archive' )))
+        __M_writer(u'";\n            },\n            "Delete": function()\n            {\n                if ( confirm( "Really delete the current history?" ) )\n                {\n                    galaxy_main.location = "')
+        # SOURCE LINE 53
+        __M_writer(unicode(h.url_for( controller='history', action='delete_current' )))
+        __M_writer(u'";\n                }\n            },\n')
+        # SOURCE LINE 60
+        __M_writer(u'        });\n        \n        // Init tool options.\n        make_popupmenu( $("#tools-options-button"), {\n')
+        # SOURCE LINE 65
+        if trans.app.toolbox_search.enabled:
+            # SOURCE LINE 66
+            __M_writer(u'                ')
+ 
+            show_tool_search = False
+            if trans.user:
+                show_tool_search = trans.user.preferences.get( "show_tool_search", "False" )
+                
+            if show_tool_search == "True":
+                initial_text = "Hide Search"
+            else:
+                initial_text = "Search Tools"
+                            
+            
+            # SOURCE LINE 75
+            __M_writer(u'\n                "')
+            # SOURCE LINE 76
+            __M_writer(unicode(initial_text))
+            __M_writer(u'": function() {\n                    // Show/hide menu and update vars, user preferences.\n                    var menu = $("#galaxy_tools").contents().find(\'#tool-search\');\n                    if (menu.is(":visible"))\n                    {\n                        // Hide menu.\n                        pref_value = "False";\n                        menu_option_text = "Search Tools";\n                        menu.toggle();\n                        \n                        // Reset search.\n                        reset_tool_search(true);\n                    }\n                    else\n                    {\n                        // Show menu.\n                        pref_value = "True";\n                        menu_option_text = "Hide Search";\n                        menu.toggle();\n                    }\n            \n                    // Update menu option.\n                    $("#tools-options-button-menu").find("li").eq(0).text(menu_option_text);\n            \n                    galaxy_async.set_user_pref("show_tool_search", pref_value);\n                },\n')
+        # SOURCE LINE 104
+        if trans.user:
+            # SOURCE LINE 105
+            __M_writer(u'                ')
+
+            if trans.user.preferences.get( 'show_recently_used_menu', 'False' ) == 'True':
+                action = "Hide"
+            else:
+                action = "Show"
+                            
+            
+            # SOURCE LINE 110
+            __M_writer(u'\n                "')
+            # SOURCE LINE 111
+            __M_writer(unicode(action))
+            __M_writer(u' Recently Used": function() {\n                    // Show/hide menu.\n                    var ru_menu = $(\'#galaxy_tools\').contents().find(\'#recently_used_wrapper\');\n                    var ru_menu_body = ru_menu.find(".toolSectionBody");\n                    var pref_value = null;\n                    var menu_option_text = null;\n                    if (ru_menu.hasClass("user_pref_visible"))\n                    {\n                        // Hide menu.\n                        ru_menu_body.slideUp();\n                        ru_menu.slideUp();\n                        \n                        // Set vars used below and in tool menu frame.\n                        pref_value = "False";\n                        menu_option_text = "Show Recently Used";\n                    }\n                    else\n                    {\n                        // "Show" menu.\n                        if (!$(\'#galaxy_tools\').contents().find(\'#tool-search-query\').hasClass("search_active"))\n                            // Default.\n                            ru_menu.slideDown();\n                        else\n                            // Search active: tf there are matching tools in RU menu, show menu.\n                            if ( ru_menu.find(".toolTitle.search_match").length != 0 )\n                            {\n                                ru_menu.slideDown();\n                                ru_menu_body.slideDown();\n                            }\n                        \n                        // Set vars used below and in tool menu frame.\n                        pref_value = "True";\n                        menu_option_text = "Hide Recently Used";\n                    }\n                 \n                    // Update menu class and option.\n                    ru_menu.toggleClass("user_pref_hidden user_pref_visible");\n                    $("#tools-options-button-menu").find("li").eq(1).text(menu_option_text);\n\n                    galaxy_async.set_user_pref("show_recently_used_menu", pref_value);\n                }\n')
+        # SOURCE LINE 153
+        __M_writer(u'        });\n    });\n    </script>\n')
+        return ''
+    finally:
+        context.caller_stack._pop_frame()
+
+
+def render_right_panel(context):
+    context.caller_stack._push_frame()
+    try:
+        h = context.get('h', UNDEFINED)
+        _ = context.get('_', UNDEFINED)
+        __M_writer = context.writer()
+        # SOURCE LINE 214
+        __M_writer(u'\n    <div class="unified-panel-header" unselectable="on">\n        <div class="unified-panel-header-inner">\n            <div style="float: right">\n                <a id="history-options-button" class=\'panel-header-button popup\' href="')
+        # SOURCE LINE 218
+        __M_writer(unicode(h.url_for( controller='root', action='history_options' )))
+        __M_writer(u'" target="galaxy_main">')
+        __M_writer(unicode(_('Options')))
+        __M_writer(u'</a>\n            </div>\n            <div class="panel-header-text">')
+        # SOURCE LINE 220
+        __M_writer(unicode(_('History')))
+        __M_writer(u'</div>\n        </div>\n    </div>\n    <div class="unified-panel-body" style="overflow: hidden;">\n        <iframe name="galaxy_history" width="100%" height="100%" frameborder="0" style="position: absolute; margin: 0; border: 0 none; height: 100%;" src="')
+        # SOURCE LINE 224
+        __M_writer(unicode(h.url_for( controller='root', action='history' )))
+        __M_writer(u'"></iframe>\n    </div>\n')
+        return ''
+    finally:
+        context.caller_stack._pop_frame()
+
+
Index: /galaxy-central/database/compiled_templates/root/history_common.mako.py
===================================================================
--- /galaxy-central/database/compiled_templates/root/history_common.mako.py (revision 3)
+++ /galaxy-central/database/compiled_templates/root/history_common.mako.py (revision 3)
@@ -0,0 +1,410 @@
+from mako import runtime, filters, cache
+UNDEFINED = runtime.UNDEFINED
+__M_dict_builtin = dict
+__M_locals_builtin = locals
+_magic_number = 5
+_modified_time = 1287725327.4199979
+_template_filename=u'templates/root/history_common.mako'
+_template_uri=u'root/history_common.mako'
+_template_cache=cache.Cache(__name__, _modified_time)
+_source_encoding=None
+_exports = ['render_dataset']
+
+
+def render_body(context,**pageargs):
+    context.caller_stack._push_frame()
+    try:
+        __M_locals = __M_dict_builtin(pageargs=pageargs)
+        n_ = context.get('n_', UNDEFINED)
+        __M_writer = context.writer()
+        # SOURCE LINE 1
+        _=n_ 
+        
+        __M_locals.update(__M_dict_builtin([(__M_key, __M_locals_builtin()[__M_key]) for __M_key in ['_'] if __M_key in __M_locals_builtin()]))
+        __M_writer(u'\n')
+        # SOURCE LINE 208
+        __M_writer(u'\n')
+        return ''
+    finally:
+        context.caller_stack._pop_frame()
+
+
+def render_render_dataset(context,data,hid,show_deleted_on_refresh=False,for_editing=True):
+    context.caller_stack._push_frame()
+    try:
+        h = context.get('h', UNDEFINED)
+        app = context.get('app', UNDEFINED)
+        def render_dataset(data,hid,show_deleted_on_refresh=False,for_editing=True):
+            return render_render_dataset(context,data,hid,show_deleted_on_refresh,for_editing)
+        request = context.get('request', UNDEFINED)
+        len = context.get('len', UNDEFINED)
+        enumerate = context.get('enumerate', UNDEFINED)
+        trans = context.get('trans', UNDEFINED)
+        _ = context.get('_', UNDEFINED)
+        __M_writer = context.writer()
+        # SOURCE LINE 3
+        __M_writer(u'\n    <a name="')
+        # SOURCE LINE 4
+        __M_writer(unicode(trans.security.encode_id( data.id )))
+        __M_writer(u'"></a>\n    ')
+        # SOURCE LINE 5
+
+        if data.state in ['no state','',None]:
+            data_state = "queued"
+        else:
+            data_state = data.state
+        current_user_roles = trans.get_current_user_roles()
+            
+        
+        # SOURCE LINE 11
+        __M_writer(u'\n')
+        # SOURCE LINE 12
+        if not trans.user_is_admin() and not trans.app.security_agent.can_access_dataset( current_user_roles, data.dataset ):
+            # SOURCE LINE 13
+            __M_writer(u'        <div class="historyItemWrapper historyItem historyItem-')
+            __M_writer(unicode(data_state))
+            __M_writer(u' historyItem-noPermission" id="historyItem-')
+            __M_writer(unicode(data.id))
+            __M_writer(u'">\n')
+            # SOURCE LINE 14
+        else:
+            # SOURCE LINE 15
+            __M_writer(u'        <div class="historyItemWrapper historyItem historyItem-')
+            __M_writer(unicode(data_state))
+            __M_writer(u'" id="historyItem-')
+            __M_writer(unicode(data.id))
+            __M_writer(u'">\n')
+        # SOURCE LINE 17
+        __M_writer(u'        \n')
+        # SOURCE LINE 18
+        if data.deleted:
+            # SOURCE LINE 19
+            __M_writer(u'        <div class="warningmessagesmall">\n            <strong>This dataset has been deleted. Click <a href="')
+            # SOURCE LINE 20
+            __M_writer(unicode(h.url_for( controller='dataset', action='undelete', id=data.id )))
+            __M_writer(u'" class="historyItemUndelete" id="historyItemUndeleter-')
+            __M_writer(unicode(data.id))
+            __M_writer(u'" target="galaxy_history">here</a> to undelete.</strong>\n        </div>\n')
+        # SOURCE LINE 23
+        __M_writer(u'\n')
+        # SOURCE LINE 24
+        if data.visible is False:
+            # SOURCE LINE 25
+            __M_writer(u'        <div class="warningmessagesmall">\n            <strong>This dataset has been hidden. Click <a href="')
+            # SOURCE LINE 26
+            __M_writer(unicode(h.url_for( controller='dataset', action='unhide', id=data.id )))
+            __M_writer(u'" class="historyItemUnhide" id="historyItemUnhider-')
+            __M_writer(unicode(data.id))
+            __M_writer(u'" target="galaxy_history">here</a> to unhide.</strong>\n        </div>\n')
+        # SOURCE LINE 29
+        __M_writer(u'\n\n')
+        # SOURCE LINE 32
+        __M_writer(u'    <div style="overflow: hidden;" class="historyItemTitleBar">     \n        <div class="historyItemButtons">\n')
+        # SOURCE LINE 34
+        if data_state == "upload":
+            # SOURCE LINE 38
+            __M_writer(u"                <img title='Display Data' class='icon-button display_disabled' />\n")
+            # SOURCE LINE 39
+            if for_editing:
+                # SOURCE LINE 40
+                __M_writer(u"                    <img title='Edit Attributes' class='icon-button edit_disabled' />\n")
+            # SOURCE LINE 42
+        else:
+            # SOURCE LINE 43
+            __M_writer(u'                ')
+ 
+            dataset_id = trans.security.encode_id( data.id )
+            if for_editing:
+                display_url = h.url_for( controller='dataset', action='display', dataset_id=dataset_id, preview=True, filename='' )
+            else:
+                # Get URL for display only.
+                if data.history.user and data.history.user.username:
+                    display_url = h.url_for( controller='dataset', action='display_by_username_and_slug',
+                                             username=data.history.user.username, slug=dataset_id )
+                else:
+                    # HACK: revert to for_editing display URL when there is no user/username. This should only happen when
+                    # there's no user/username because dataset is being displayed by history/view after error reported.
+                    # There are no security concerns here because both dataset/display and dataset/display_by_username_and_slug
+                    # check user permissions (to the same degree) before displaying.
+                    display_url = h.url_for( controller='dataset', action='display', dataset_id=dataset_id, preview=True, filename='' )
+                            
+            
+            # SOURCE LINE 58
+            __M_writer(u'\n                <a class="icon-button display tooltip" title="Display data in browser" href="')
+            # SOURCE LINE 59
+            __M_writer(unicode(display_url))
+            __M_writer(u'"\n')
+            # SOURCE LINE 60
+            if for_editing:
+                # SOURCE LINE 61
+                __M_writer(u'                    target="galaxy_main"\n')
+            # SOURCE LINE 63
+            __M_writer(u'                ></a>\n')
+            # SOURCE LINE 64
+            if for_editing:
+                # SOURCE LINE 65
+                __M_writer(u'                    <a class="icon-button edit tooltip" title="Edit attributes" href="')
+                __M_writer(unicode(h.url_for( controller='root', action='edit', id=data.id )))
+                __M_writer(u'" target="galaxy_main"></a>\n')
+        # SOURCE LINE 68
+        if for_editing:
+            # SOURCE LINE 69
+            __M_writer(u'                <a class="icon-button delete tooltip" title="Delete" href="')
+            __M_writer(unicode(h.url_for( action='delete', id=data.id, show_deleted_on_refresh=show_deleted_on_refresh )))
+            __M_writer(u'" id="historyItemDeleter-')
+            __M_writer(unicode(data.id))
+            __M_writer(u'"></a>\n')
+        # SOURCE LINE 71
+        __M_writer(u'        </div>\n        <span class="state-icon"></span>\n        <span class="historyItemTitle">')
+        # SOURCE LINE 73
+        __M_writer(unicode(hid))
+        __M_writer(u': ')
+        __M_writer(unicode(data.display_name()))
+        __M_writer(u'</span>\n    </div>\n        \n')
+        # SOURCE LINE 77
+        __M_writer(u'    \n    <div id="info')
+        # SOURCE LINE 78
+        __M_writer(unicode(data.id))
+        __M_writer(u'" class="historyItemBody">\n')
+        # SOURCE LINE 79
+        if not trans.user_is_admin() and not trans.app.security_agent.can_access_dataset( current_user_roles, data.dataset ):
+            # SOURCE LINE 80
+            __M_writer(u'            <div>You do not have permission to view this dataset.</div>\n')
+            # SOURCE LINE 81
+        elif data_state == "upload":
+            # SOURCE LINE 82
+            __M_writer(u'            <div>Dataset is uploading</div>\n')
+            # SOURCE LINE 83
+        elif data_state == "queued":
+            # SOURCE LINE 84
+            __M_writer(u'            <div>')
+            __M_writer(unicode(_('Job is waiting to run')))
+            __M_writer(u'</div>\n')
+            # SOURCE LINE 85
+        elif data_state == "running":
+            # SOURCE LINE 86
+            __M_writer(u'            <div>')
+            __M_writer(unicode(_('Job is currently running')))
+            __M_writer(u'</div>\n')
+            # SOURCE LINE 87
+        elif data_state == "error":
+            # SOURCE LINE 88
+            __M_writer(u'            <div>\n                An error occurred running this job: <i>')
+            # SOURCE LINE 89
+            __M_writer(unicode(data.display_info().strip()))
+            __M_writer(u'</i>\n            </div>\n            <div>\n                <a href="')
+            # SOURCE LINE 92
+            __M_writer(unicode(h.url_for( controller='dataset', action='errors', id=data.id )))
+            __M_writer(u'" target="galaxy_main" title="View or report this error" class="icon-button bug tooltip"></a>\n                <a href="')
+            # SOURCE LINE 93
+            __M_writer(unicode(h.url_for( controller='tool_runner', action='rerun', id=data.id )))
+            __M_writer(u'" target="galaxy_main" title="Run this job again" class="icon-button arrow-circle tooltip"></a>\n            </div>\n')
+            # SOURCE LINE 95
+        elif data_state == "discarded":
+            # SOURCE LINE 96
+            __M_writer(u'            <div>\n                The job creating this dataset was cancelled before completion.\n            </div>\n')
+            # SOURCE LINE 99
+        elif data_state == 'setting_metadata':
+            # SOURCE LINE 100
+            __M_writer(u'            <div>')
+            __M_writer(unicode(_('Metadata is being Auto-Detected.')))
+            __M_writer(u'</div>\n')
+            # SOURCE LINE 101
+        elif data_state == "empty":
+            # SOURCE LINE 102
+            __M_writer(u'            <div>')
+            __M_writer(unicode(_('No data: ')))
+            __M_writer(u'<i>')
+            __M_writer(unicode(data.display_info()))
+            __M_writer(u'</i></div>\n')
+            # SOURCE LINE 103
+        elif data_state in [ "ok", "failed_metadata" ]:
+            # SOURCE LINE 104
+            if data_state == "failed_metadata":
+                # SOURCE LINE 105
+                __M_writer(u'                <div class="warningmessagesmall" style="margin: 4px 0 4px 0">\n                    An error occurred setting the metadata for this dataset.  You may be able to <a href="')
+                # SOURCE LINE 106
+                __M_writer(unicode(h.url_for( controller='root', action='edit', id=data.id )))
+                __M_writer(u'" target="galaxy_main">set it manually or retry auto-detection</a>.\n                </div>\n')
+            # SOURCE LINE 109
+            __M_writer(u'            <div>\n                ')
+            # SOURCE LINE 110
+            __M_writer(unicode(data.blurb))
+            __M_writer(u',\n                format: <span class="')
+            # SOURCE LINE 111
+            __M_writer(unicode(data.ext))
+            __M_writer(u'">')
+            __M_writer(unicode(data.ext))
+            __M_writer(u'</span>, \n                database:\n')
+            # SOURCE LINE 113
+            if data.dbkey == '?':
+                # SOURCE LINE 114
+                __M_writer(u'                    <a href="')
+                __M_writer(unicode(h.url_for( controller='root', action='edit', id=data.id )))
+                __M_writer(u'" target="galaxy_main">')
+                __M_writer(unicode(_(data.dbkey)))
+                __M_writer(u'</a>\n')
+                # SOURCE LINE 115
+            else:
+                # SOURCE LINE 116
+                __M_writer(u'                    <span class="')
+                __M_writer(unicode(data.dbkey))
+                __M_writer(u'">')
+                __M_writer(unicode(_(data.dbkey)))
+                __M_writer(u'</span>\n')
+            # SOURCE LINE 118
+            __M_writer(u'            </div>\n            <div class="info">')
+            # SOURCE LINE 119
+            __M_writer(unicode(_('Info: ')))
+            __M_writer(unicode(data.display_info()))
+            __M_writer(u'</div>\n            <div> \n                ')
+            # SOURCE LINE 121
+            dataset_id=trans.security.encode_id( data.id ) 
+            
+            __M_writer(u'\n')
+            # SOURCE LINE 122
+            if data.has_data():
+                # SOURCE LINE 123
+                __M_writer(u'                    <a href="')
+                __M_writer(unicode(h.url_for( controller='dataset', action='display', dataset_id=dataset_id, to_ext=data.ext )))
+                __M_writer(u'" title="Save" class="icon-button disk tooltip"></a>\n')
+                # SOURCE LINE 124
+                if for_editing:
+                    # SOURCE LINE 125
+                    __M_writer(u'                        <a href="')
+                    __M_writer(unicode(h.url_for( controller='tool_runner', action='rerun', id=data.id )))
+                    __M_writer(u'" target="galaxy_main" title="Run this job again" class="icon-button arrow-circle tooltip"></a>\n')
+                    # SOURCE LINE 126
+                    if app.config.get_bool( 'enable_tracks', False ) and data.ext in app.datatypes_registry.get_available_tracks():
+                        # SOURCE LINE 127
+                        __M_writer(u'                            <a data-url="')
+                        __M_writer(unicode(h.url_for( controller='tracks', action='list_tracks' )))
+                        __M_writer(u'" class="icon-button vis-chart tooltip trackster-add"\n                                action-url="')
+                        # SOURCE LINE 128
+                        __M_writer(unicode(h.url_for( controller='tracks', action='browser', dataset_id=dataset_id)))
+                        __M_writer(u'"\n                                new-url="')
+                        # SOURCE LINE 129
+                        __M_writer(unicode(h.url_for( controller='tracks', action='index', dataset_id=dataset_id, default_dbkey=data.dbkey)))
+                        __M_writer(u'" title="Visualize in Trackster"></a>\n')
+                    # SOURCE LINE 131
+                    if trans.user:
+                        # SOURCE LINE 132
+                        __M_writer(u'                            <div style="float: right">\n                                <a href="')
+                        # SOURCE LINE 133
+                        __M_writer(unicode(h.url_for( controller='tag', action='retag', item_class=data.__class__.__name__, item_id=dataset_id )))
+                        __M_writer(u'" target="galaxy_main" title="Edit dataset tags" class="icon-button tags tooltip"></a>\n                                <a href="')
+                        # SOURCE LINE 134
+                        __M_writer(unicode(h.url_for( controller='dataset', action='annotate', id=dataset_id )))
+                        __M_writer(u'" target="galaxy_main" title="Edit dataset annotation" class="icon-button annotate tooltip"></a>\n                            </div>\n                            <div style="clear: both"></div>\n                            <div class="tag-area" style="display: none">\n                                <strong>Tags:</strong>\n                                <div class="tag-elt"></div>\n                            </div>\n                            <div id="')
+                        # SOURCE LINE 141
+                        __M_writer(unicode(dataset_id))
+                        __M_writer(u'-annotation-area" class="annotation-area" style="display: none">\n                                <strong>Annotation:</strong>\n                                <div id="')
+                        # SOURCE LINE 143
+                        __M_writer(unicode(dataset_id))
+                        __M_writer(u'-annotation-elt" style="margin: 1px 0px 1px 0px" class="annotation-elt tooltip editable-text" title="Edit dataset annotation"></div>\n                            </div>\n                            \n')
+                    # SOURCE LINE 147
+                else:
+                    # SOURCE LINE 150
+                    __M_writer(u'                        <div style="clear: both"></div>\n')
+                # SOURCE LINE 152
+                __M_writer(u'    \t\t        <div style="clear: both"></div>\n')
+                # SOURCE LINE 153
+                for display_app in data.datatype.get_display_types():
+                    # SOURCE LINE 154
+                    __M_writer(u'                        ')
+                    target_frame, display_links = data.datatype.get_display_links( data, display_app, app, request.base ) 
+                    
+                    __M_writer(u'\n')
+                    # SOURCE LINE 155
+                    if len( display_links ) > 0:
+                        # SOURCE LINE 156
+                        __M_writer(u'                            | ')
+                        __M_writer(unicode(data.datatype.get_display_label(display_app)))
+                        __M_writer(u'\n')
+                        # SOURCE LINE 157
+                        for display_name, display_link in display_links:
+                            # SOURCE LINE 158
+                            __M_writer(u'                                <a target="')
+                            __M_writer(unicode(target_frame))
+                            __M_writer(u'" href="')
+                            __M_writer(unicode(display_link))
+                            __M_writer(u'">')
+                            __M_writer(unicode(_(display_name)))
+                            __M_writer(u'</a> \n')
+                # SOURCE LINE 162
+                for display_app in data.get_display_applications( trans ).itervalues():
+                    # SOURCE LINE 163
+                    __M_writer(u'                        | ')
+                    __M_writer(unicode(display_app.name))
+                    __M_writer(u' \n')
+                    # SOURCE LINE 164
+                    for link_app in display_app.links.itervalues():
+                        # SOURCE LINE 165
+                        __M_writer(u'                            <a target="')
+                        __M_writer(unicode(link_app.url.get( 'target_frame', '_blank' )))
+                        __M_writer(u'" href="')
+                        __M_writer(unicode(link_app.get_display_url( data, trans )))
+                        __M_writer(u'">')
+                        __M_writer(unicode(_(link_app.name)))
+                        __M_writer(u'</a> \n')
+                # SOURCE LINE 168
+            elif for_editing:
+                # SOURCE LINE 169
+                __M_writer(u'                    <a href="')
+                __M_writer(unicode(h.url_for( controller='tool_runner', action='rerun', id=data.id )))
+                __M_writer(u'" target="galaxy_main" title="Run this job again" class="icon-button arrow-circle tooltip"></a>\n')
+            # SOURCE LINE 171
+            __M_writer(u'    \n                </div>\n')
+            # SOURCE LINE 173
+            if data.peek != "no peek":
+                # SOURCE LINE 174
+                __M_writer(u'                    <div><pre id="peek')
+                __M_writer(unicode(data.id))
+                __M_writer(u'" class="peek">')
+                __M_writer(unicode(_(data.display_peek())))
+                __M_writer(u'</pre></div>\n')
+            # SOURCE LINE 176
+        else:
+            # SOURCE LINE 177
+            __M_writer(u'            <div>')
+            __M_writer(unicode(_('Error: unknown dataset state "%s".') % data_state))
+            __M_writer(u'</div>\n')
+        # SOURCE LINE 179
+        __M_writer(u'           \n')
+        # SOURCE LINE 181
+        __M_writer(u'                          \n')
+        # SOURCE LINE 182
+        if len( data.children ) > 0:
+            # SOURCE LINE 185
+            __M_writer(u'            ')
+
+            children = []
+            for child in data.children:
+                if child.visible:
+                    children.append( child )
+            
+            
+            # SOURCE LINE 190
+            __M_writer(u'\n')
+            # SOURCE LINE 191
+            if len( children ) > 0:
+                # SOURCE LINE 192
+                __M_writer(u'                <div>\n                    There are ')
+                # SOURCE LINE 193
+                __M_writer(unicode(len( children )))
+                __M_writer(u' secondary datasets.\n')
+                # SOURCE LINE 194
+                for idx, child in enumerate(children):
+                    # SOURCE LINE 195
+                    __M_writer(u'                        ')
+                    __M_writer(unicode(render_dataset( child, idx + 1, show_deleted_on_refresh = show_deleted_on_refresh )))
+                    __M_writer(u'\n')
+                # SOURCE LINE 197
+                __M_writer(u'                </div>\n')
+        # SOURCE LINE 200
+        __M_writer(u'\n    <div style="clear: both;"></div>\n\n    </div>\n        \n        \n    </div>\n\n')
+        return ''
+    finally:
+        context.caller_stack._pop_frame()
+
+
Index: /galaxy-central/database/compiled_templates/root/history_item.mako.py
===================================================================
--- /galaxy-central/database/compiled_templates/root/history_item.mako.py (revision 3)
+++ /galaxy-central/database/compiled_templates/root/history_item.mako.py (revision 3)
@@ -0,0 +1,43 @@
+from mako import runtime, filters, cache
+UNDEFINED = runtime.UNDEFINED
+__M_dict_builtin = dict
+__M_locals_builtin = locals
+_magic_number = 5
+_modified_time = 1287725817.5901711
+_template_filename='templates/root/history_item.mako'
+_template_uri='root/history_item.mako'
+_template_cache=cache.Cache(__name__, _modified_time)
+_source_encoding=None
+_exports = []
+
+
+def _mako_get_namespace(context, name):
+    try:
+        return context.namespaces[(__name__, name)]
+    except KeyError:
+        _mako_generate_namespaces(context)
+        return context.namespaces[(__name__, name)]
+def _mako_generate_namespaces(context):
+    # SOURCE LINE 1
+    ns = runtime.Namespace('__anon_0x10aacc110', context._clean_inheritance_tokens(), templateuri=u'history_common.mako', callables=None, calling_uri=_template_uri, module=None)
+    context.namespaces[(__name__, '__anon_0x10aacc110')] = ns
+
+def render_body(context,**pageargs):
+    context.caller_stack._push_frame()
+    try:
+        __M_locals = __M_dict_builtin(pageargs=pageargs)
+        _import_ns = {}
+        _mako_get_namespace(context, '__anon_0x10aacc110')._populate(_import_ns, [u'render_dataset'])
+        hid = _import_ns.get('hid', context.get('hid', UNDEFINED))
+        data = _import_ns.get('data', context.get('data', UNDEFINED))
+        render_dataset = _import_ns.get('render_dataset', context.get('render_dataset', UNDEFINED))
+        __M_writer = context.writer()
+        __M_writer(u'\n\n')
+        # SOURCE LINE 3
+        __M_writer(unicode(render_dataset( data, hid )))
+        __M_writer(u'    \n')
+        return ''
+    finally:
+        context.caller_stack._pop_frame()
+
+
Index: /galaxy-central/database/compiled_templates/root/history.mako.py
===================================================================
--- /galaxy-central/database/compiled_templates/root/history.mako.py (revision 3)
+++ /galaxy-central/database/compiled_templates/root/history.mako.py (revision 3)
@@ -0,0 +1,245 @@
+from mako import runtime, filters, cache
+UNDEFINED = runtime.UNDEFINED
+__M_dict_builtin = dict
+__M_locals_builtin = locals
+_magic_number = 5
+_modified_time = 1287725327.3004439
+_template_filename='templates/root/history.mako'
+_template_uri='root/history.mako'
+_template_cache=cache.Cache(__name__, _modified_time)
+_source_encoding=None
+_exports = []
+
+
+def _mako_get_namespace(context, name):
+    try:
+        return context.namespaces[(__name__, name)]
+    except KeyError:
+        _mako_generate_namespaces(context)
+        return context.namespaces[(__name__, name)]
+def _mako_generate_namespaces(context):
+    # SOURCE LINE 364
+    ns = runtime.Namespace('__anon_0x110c0db10', context._clean_inheritance_tokens(), templateuri=u'../tagging_common.mako', callables=None, calling_uri=_template_uri, module=None)
+    context.namespaces[(__name__, '__anon_0x110c0db10')] = ns
+
+    # SOURCE LINE 365
+    ns = runtime.Namespace('__anon_0x110c0dc10', context._clean_inheritance_tokens(), templateuri=u'history_common.mako', callables=None, calling_uri=_template_uri, module=None)
+    context.namespaces[(__name__, '__anon_0x110c0dc10')] = ns
+
+def render_body(context,**pageargs):
+    context.caller_stack._push_frame()
+    try:
+        __M_locals = __M_dict_builtin(pageargs=pageargs)
+        _import_ns = {}
+        _mako_get_namespace(context, '__anon_0x110c0db10')._populate(_import_ns, [u'render_individual_tagging_element'])
+        _mako_get_namespace(context, '__anon_0x110c0dc10')._populate(_import_ns, [u'render_dataset'])
+        datasets = _import_ns.get('datasets', context.get('datasets', UNDEFINED))
+        show_deleted = _import_ns.get('show_deleted', context.get('show_deleted', UNDEFINED))
+        h = _import_ns.get('h', context.get('h', UNDEFINED))
+        reversed = _import_ns.get('reversed', context.get('reversed', UNDEFINED))
+        render_dataset = _import_ns.get('render_dataset', context.get('render_dataset', UNDEFINED))
+        trans = _import_ns.get('trans', context.get('trans', UNDEFINED))
+        dict = _import_ns.get('dict', context.get('dict', UNDEFINED))
+        show_hidden = _import_ns.get('show_hidden', context.get('show_hidden', UNDEFINED))
+        render_individual_tagging_element = _import_ns.get('render_individual_tagging_element', context.get('render_individual_tagging_element', UNDEFINED))
+        n_ = _import_ns.get('n_', context.get('n_', UNDEFINED))
+        hda_id = _import_ns.get('hda_id', context.get('hda_id', UNDEFINED))
+        bool = _import_ns.get('bool', context.get('bool', UNDEFINED))
+        annotation = _import_ns.get('annotation', context.get('annotation', UNDEFINED))
+        history = _import_ns.get('history', context.get('history', UNDEFINED))
+        __M_writer = context.writer()
+        # SOURCE LINE 1
+        _=n_ 
+        
+        __M_locals.update(__M_dict_builtin([(__M_key, __M_locals_builtin()[__M_key]) for __M_key in ['_'] if __M_key in __M_locals_builtin()]))
+        __M_writer(u'\n<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">\n\n<html>\n\n<head>\n<title>')
+        # SOURCE LINE 7
+        __M_writer(unicode(_('Galaxy History')))
+        __M_writer(u'</title>\n\n')
+        # SOURCE LINE 10
+        if bool( [ data for data in history.active_datasets if data.state in ['running', 'queued', '', None ] ] ):
+            # SOURCE LINE 11
+            __M_writer(u'<!-- running: do not change this comment, used by TwillTestCase.wait -->\n')
+        # SOURCE LINE 13
+        __M_writer(u'\n<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />\n<meta http-equiv="Pragma" content="no-cache">\n\n')
+        # SOURCE LINE 17
+        __M_writer(unicode(h.css( "base", "history", "autocomplete_tagging" )))
+        __M_writer(u'\n')
+        # SOURCE LINE 18
+        __M_writer(unicode(h.js( "jquery", "jquery.tipsy", "galaxy.base", "json2", "class", "jquery.jstore", "jquery.autocomplete", "autocomplete_tagging" )))
+        __M_writer(u'\n\n<script type="text/javascript">\n\n')
+        # SOURCE LINE 22
+        TERMINAL_STATES = ["ok", "error", "empty", "deleted", "discarded", "failed_metadata"] 
+        
+        __M_locals.update(__M_dict_builtin([(__M_key, __M_locals_builtin()[__M_key]) for __M_key in ['TERMINAL_STATES'] if __M_key in __M_locals_builtin()]))
+        __M_writer(u'\nTERMINAL_STATES = ')
+        # SOURCE LINE 23
+        __M_writer(unicode( h.to_json_string(TERMINAL_STATES) ))
+        __M_writer(u';\n\n$(function() {\n    var historywrapper = $("div.historyItemWrapper");\n    init_history_items(historywrapper);\n    historywrapper.each( function() {\n        // Delete link\n        $(this).find( "div.historyItemButtons > .delete" ).each( function() {\n            var data_id = this.id.split( "-" )[1];\n            $(this).click( function() {\n                $( \'#historyItem-\' + data_id + "> div.historyItemTitleBar" ).addClass( "spinner" );\n                $.ajax({\n                    url: "')
+        # SOURCE LINE 35
+        __M_writer(unicode(h.url_for( action='delete_async', id='XXX' )))
+        __M_writer(u'".replace( \'XXX\', data_id ),\n                    error: function() { alert( "Delete failed" ); },\n                    success: function(msg) {\n                        if (msg === "OK") {\n')
+        # SOURCE LINE 39
+        if show_deleted:
+            # SOURCE LINE 40
+            __M_writer(u'                            var to_update = {};\n                            to_update[data_id] = "none";\n                            updater( to_update );\n')
+            # SOURCE LINE 43
+        else:
+            # SOURCE LINE 44
+            __M_writer(u'                            $( "#historyItem-" + data_id ).fadeOut( "fast", function() {\n                                $( "#historyItemContainer-" + data_id ).remove();\n                                if ( $( "div.historyItemContainer" ).length < 1 ) {\n                                    $( "#emptyHistoryMessage" ).show();\n                                }\n                            });\n')
+        # SOURCE LINE 51
+        __M_writer(u'                            $(".tipsy").remove();\n                        } else {\n                            alert( "Delete failed" );\n                        }\n                    }\n                });\n                return false;\n            });\n        });\n        // Undelete link\n        $(this).find( "a.historyItemUndelete" ).each( function() {\n            var data_id = this.id.split( "-" )[1];\n            $(this).click( function() {\n                $( \'#historyItem-\' + data_id + " > div.historyItemTitleBar" ).addClass( "spinner" );\n                $.ajax({\n                    url: "')
+        # SOURCE LINE 66
+        __M_writer(unicode(h.url_for( controller='dataset', action='undelete_async', id='XXX' )))
+        __M_writer(u'".replace( \'XXX\', data_id ),\n                    error: function() { alert( "Undelete failed" ) },\n                    success: function() {\n                        var to_update = {};\n                        to_update[data_id] = "none";\n                        updater( to_update );\n                    }\n                });\n                return false;\n            });\n        });\n\n        // Tag handling.\n        $(this).find( "a.icon-button.tags").each( function() {\n            // Use links parameters but custom URL as ajax URL.\n            $(this).click( function() {\n                // Get tag area, tag element.\n                var history_item = $(this).parents(".historyItem");\n                var tag_area = history_item.find(".tag-area");\n                var tag_elt = history_item.find(".tag-elt");\n\n                // Show or hide tag area; if showing tag area and it\'s empty, fill it.\n                if ( tag_area.is( ":hidden" ) ) {\n                    if (!tag_elt.html()) {\n                        // Need to fill tag element.\n                        var href_parms = $(this).attr("href").split("?")[1];\n                        var ajax_url = "')
+        # SOURCE LINE 92
+        __M_writer(unicode(h.url_for( controller='tag', action='get_tagging_elt_async' )))
+        __M_writer(u'?" + href_parms;\n                        $.ajax({\n                            url: ajax_url,\n                            error: function() { alert( "Tagging failed" ) },\n                            success: function(tag_elt_html) {\n                                tag_elt.html(tag_elt_html);\n                                tag_elt.find(".tooltip").tipsy( { gravity: \'s\' } );\n                                tag_area.slideDown("fast");\n                            }\n                        });\n                    } else {\n                        // Tag element is filled; show.\n                        tag_area.slideDown("fast");\n                    }\n                } else {\n                    // Hide.\n                    tag_area.slideUp("fast");\n                }\n                return false;        \n            });\n        });\n\n        // Annotation handling.\n        $(this).find( "a.icon-button.annotate").each( function() {\n            // Use links parameters but custom URL as ajax URL.\n            $(this).click( function() {\n                // Get tag area, tag element.\n                var history_item = $(this).parents(".historyItem");\n                var annotation_area = history_item.find(".annotation-area");\n                var annotation_elt = history_item.find(".annotation-elt");\n\n                // Show or hide annotation area; if showing annotation area and it\'s empty, fill it.\n                if ( annotation_area.is( ":hidden" ) ) {\n                    if (!annotation_elt.html()) {\n                        // Need to fill annotation element.\n                        var href_parms = $(this).attr("href").split("?")[1];\n                        var ajax_url = "')
+        # SOURCE LINE 128
+        __M_writer(unicode(h.url_for( controller='dataset', action='get_annotation_async' )))
+        __M_writer(u'?" + href_parms;\n                        $.ajax({\n                            url: ajax_url,\n                            error: function() { alert( "Annotations failed" ) },\n                            success: function(annotation) {\n                                if (annotation == "") {\n                                    annotation = "<em>Describe or add notes to dataset</em>";\n                                }\n                                annotation_elt.html(annotation);\n                                annotation_area.find(".tooltip").tipsy( { gravity: \'s\' } );\n                                async_save_text(\n                                    annotation_elt.attr("id"), annotation_elt.attr("id"),\n                                    "')
+        # SOURCE LINE 140
+        __M_writer(unicode(h.url_for( controller="/dataset", action="annotate_async")))
+        __M_writer(u'?" + href_parms,\n                                    "new_annotation", 18, true, 4);\n                                annotation_area.slideDown("fast");\n                            }\n                        });\n                    } else {\n                        // Annotation element is filled; show.\n                        annotation_area.slideDown("fast");\n                    }\n                } else {\n                    // Hide.\n                    annotation_area.slideUp("fast");\n                }\n                return false;        \n            });\n        });\n    });\n    \n    // Trackster links\n    function init_trackster_links() {\n        $("a.trackster").live( "click", function() {\n            var link = $(this),\n                hid = link.attr("id").split("_")[1]; // visualize_{id}\n\n            $.ajax({\n                url: "')
+        # SOURCE LINE 165
+        __M_writer(unicode(h.url_for( controller='tracks', action='list_tracks' )))
+        __M_writer(u'",\n                data: {\'hid\': hid},\n                error: function() { alert( "Visualization error" ); },\n                success: function(html) {\n                    show_modal("Add Track &mdash; Select Dataset(s)", html, {\n                        "New Browser": function() {\n                            hide_modal();\n                        },\n                        "Insert": function() {\n                            hide_modal();\n                        },\n                        "Cancel": function() {\n                            hide_modal();\n                        }\n                    });\n                }\n            });\n        });    \n    }\n    \n    init_trackster_links();\n    \n    // History rename functionality.\n    async_save_text("history-name-container", "history-name", "')
+        # SOURCE LINE 188
+        __M_writer(unicode(h.url_for( controller="/history", action="rename_async", id=trans.security.encode_id(history.id) )))
+        __M_writer(u'", "new_name", 18);\n    \n    // History tagging functionality.\n    var historyTagArea = $(\'#history-tag-area\');\n    $(\'#history-tag\').click( function() {\n        if ( historyTagArea.is( ":hidden" ) ) {\n            historyTagArea.slideDown("fast");\n        } else {\n            historyTagArea.slideUp("fast");\n        }\n        return false;\n    });\n    \n    // History annotation functionality.\n    var historyAnnotationArea = $(\'#history-annotation-area\');\n    $(\'#history-annotate\').click( function() {\n        if ( historyAnnotationArea.is( ":hidden" ) ) {\n            historyAnnotationArea.slideDown("fast");\n        } else {\n            historyAnnotationArea.slideUp("fast");\n        }\n        return false;\n    });\n    async_save_text("history-annotation-container", "history-annotation", "')
+        # SOURCE LINE 211
+        __M_writer(unicode(h.url_for( controller="/history", action="annotate_async", id=trans.security.encode_id(history.id) )))
+        __M_writer(u'", "new_annotation", 18, true, 4);\n    \n    // Updater\n    updater(\n        ')
+        # SOURCE LINE 215
+        __M_writer(unicode( h.to_json_string( dict([(data.id, data.state) for data in reversed( datasets ) if data.visible and data.state not in TERMINAL_STATES]) ) ))
+        __M_writer(u'\n    );\n    \n    // Navigate to a dataset.\n')
+        # SOURCE LINE 219
+        if hda_id:
+            # SOURCE LINE 220
+            __M_writer(u'        self.location = "#')
+            __M_writer(unicode(hda_id))
+            __M_writer(u'";\n')
+        # SOURCE LINE 222
+        __M_writer(u'});\n\n// Looks for changes in dataset state using an async request. Keeps\n// calling itself (via setTimeout) until all datasets are in a terminal\n// state.\nvar updater = function ( tracked_datasets ) {\n    // Check if there are any items left to track\n    var empty = true;\n    for ( i in tracked_datasets ) {\n        empty = false;\n        break;\n    }\n    if ( !empty ) {\n        setTimeout( function() { updater_callback( tracked_datasets ) }, 4000 );\n    }\n};\nvar updater_callback = function ( tracked_datasets ) {\n    // Build request data\n    var ids = [],\n        states = [],\n        force_history_refresh = false;\n        \n    $.each( tracked_datasets, function ( id, state ) {\n        ids.push( id );\n        states.push( state );\n    });\n    // Make ajax call\n    $.ajax( {\n        type: "POST",\n        url: "')
+        # SOURCE LINE 251
+        __M_writer(unicode(h.url_for( controller='root', action='history_item_updates' )))
+        __M_writer(u'",\n        dataType: "json",\n        data: { ids: ids.join( "," ), states: states.join( "," ) },\n        success : function ( data ) {\n            $.each( data, function( id, val ) {\n                // Replace HTML\n                var container = $("#historyItemContainer-" + id);\n                container.html( val.html );\n                init_history_items( $("div.historyItemWrapper"), "noinit" );\n                // If new state is terminal, stop tracking\n                if (TERMINAL_STATES.indexOf(val.state) !== -1) {\n                    if ( val.force_history_refresh ){\n                        force_history_refresh = true;\n                    }\n                    delete tracked_datasets[ parseInt(id) ];\n                } else {\n                    tracked_datasets[ parseInt(id) ] = val.state;\n                }\n            });\n            if ( force_history_refresh ) {\n                parent.frames.galaxy_history.location.reload();\n            } else {\n                // Keep going (if there are still any items to track)\n                updater( tracked_datasets ); \n            }\n        },\n        error: function() {\n            // Just retry, like the old method, should try to be smarter\n            updater( tracked_datasets );\n        }\n    });\n};\n\n</script>\n\n<style>\n.historyItemBody {\n    display: none;\n}\ndiv.form-row {\n    padding: 5px 5px 5px 0px;\n}\n#top-links {\n    margin-bottom: 15px;\n}\n#history-name-container {\n    display: inline-block;\n    color: gray;\n    font-weight: bold;\n}\n.editable-text {\n    border: solid transparent 1px;\n    padding: 3px;\n    margin: -4px;\n}\n</style>\n\n<noscript>\n<style>\n.historyItemBody {\n    display: block;\n}\n</style>\n</noscript>\n\n</head>\n\n<body class="historyPage">\n<div id="top-links" class="historyLinks">\n    \n    <a title="')
+        # SOURCE LINE 321
+        __M_writer(unicode(_('refresh')))
+        __M_writer(u'" class="icon-button arrow-circle tooltip" href="')
+        __M_writer(unicode(h.url_for('history', show_deleted=show_deleted)))
+        __M_writer(u'"></a>\n    <a title=\'')
+        # SOURCE LINE 322
+        __M_writer(unicode(_('collapse all')))
+        __M_writer(u'\' class=\'icon-button toggle tooltip\' href=\'#\' style="display: none;"></a>\n    \n')
+        # SOURCE LINE 324
+        if trans.get_user():
+            # SOURCE LINE 325
+            __M_writer(u'    <div style="width: 40px; float: right; white-space: nowrap;">\n        <a id="history-tag" title="Edit history tags" class="icon-button tags tooltip" target="galaxy_main" href="')
+            # SOURCE LINE 326
+            __M_writer(unicode(h.url_for( controller='history', action='tag' )))
+            __M_writer(u'"></a>\n        <a id="history-annotate" title="Edit history annotation" class="icon-button annotate tooltip" target="galaxy_main" href="')
+            # SOURCE LINE 327
+            __M_writer(unicode(h.url_for( controller='history', action='annotate' )))
+            __M_writer(u'"></a>\n    </div>\n')
+        # SOURCE LINE 330
+        __M_writer(u'\n</div>\n\n<div style="clear: both;"></div>\n\n')
+        # SOURCE LINE 335
+        if show_deleted:
+            # SOURCE LINE 336
+            __M_writer(u'<div class="historyLinks">\n    <a href="')
+            # SOURCE LINE 337
+            __M_writer(unicode(h.url_for('history', show_deleted=False)))
+            __M_writer(u'">')
+            __M_writer(unicode(_('hide deleted')))
+            __M_writer(u'</a>\n</div>\n')
+        # SOURCE LINE 340
+        __M_writer(u'\n')
+        # SOURCE LINE 341
+        if show_hidden:
+            # SOURCE LINE 342
+            __M_writer(u'<div class="historyLinks">\n    <a href="')
+            # SOURCE LINE 343
+            __M_writer(unicode(h.url_for('history', show_hidden=False)))
+            __M_writer(u'">')
+            __M_writer(unicode(_('hide hidden')))
+            __M_writer(u'</a>\n</div>\n')
+        # SOURCE LINE 346
+        __M_writer(u'\n<div id="history-name-area" class="historyLinks">\n    \n')
+        # SOURCE LINE 349
+        if trans.get_user():
+            # SOURCE LINE 350
+            __M_writer(u'    <div id="history-name-container">\n        <div id="history-name" class="tooltip editable-text" title="Click to rename history">')
+            # SOURCE LINE 351
+            __M_writer(filters.html_escape(unicode(history.get_display_name() )))
+            __M_writer(u'</div>\n    </div>\n')
+        # SOURCE LINE 354
+        __M_writer(u'                               \n</div>\n\n')
+        # SOURCE LINE 357
+        if history.deleted:
+            # SOURCE LINE 358
+            __M_writer(u'    <div class="warningmessagesmall">\n        ')
+            # SOURCE LINE 359
+            __M_writer(unicode(_('You are currently viewing a deleted history!')))
+            __M_writer(u'\n    </div>\n    <p></p>\n')
+        # SOURCE LINE 363
+        __M_writer(u'\n')
+        # SOURCE LINE 364
+        __M_writer(u'\n')
+        # SOURCE LINE 365
+        __M_writer(u'\n\n')
+        # SOURCE LINE 367
+        if trans.get_user() is not None:
+            # SOURCE LINE 368
+            __M_writer(u'    <div style="margin: 0px 5px 10px 5px">\n')
+            # SOURCE LINE 370
+            __M_writer(u'        <div id="history-tag-area" style="display: none">\n            <b>Tags:</b>\n            ')
+            # SOURCE LINE 372
+            __M_writer(unicode(render_individual_tagging_element(user=trans.get_user(), tagged_item=history, elt_context="history.mako", use_toggle_link=False, input_size="20")))
+            __M_writer(u'\n        </div>\n    \n')
+            # SOURCE LINE 376
+            __M_writer(u'        <div id="history-annotation-area" style="display: none">\n   \t        <b>Annotation / Notes:</b>\n   \t        <div id="history-annotation-container">\n\t\t    <div id="history-annotation" class="tooltip editable-text" title="Click to edit annotation">\n')
+            # SOURCE LINE 380
+            if annotation:
+                # SOURCE LINE 381
+                __M_writer(u'                    ')
+                __M_writer(filters.html_escape(unicode(h.to_unicode( annotation ) )))
+                __M_writer(u'\n')
+                # SOURCE LINE 382
+            else:
+                # SOURCE LINE 383
+                __M_writer(u'                    <em>Describe or add notes to history</em>\n')
+            # SOURCE LINE 385
+            __M_writer(u'\t\t    </div>\n            </div>\n        </div>\n        \n    </div>\n')
+        # SOURCE LINE 391
+        __M_writer(u'\n')
+        # SOURCE LINE 392
+        if not datasets:
+            # SOURCE LINE 393
+            __M_writer(u'\n    <div class="infomessagesmall" id="emptyHistoryMessage">\n\n')
+            # SOURCE LINE 396
+        else:    
+            # SOURCE LINE 397
+            __M_writer(u'\n')
+            # SOURCE LINE 399
+            for data in reversed( datasets ):
+                # SOURCE LINE 400
+                if data.visible or show_hidden:
+                    # SOURCE LINE 401
+                    __M_writer(u'            <div class="historyItemContainer" id="historyItemContainer-')
+                    __M_writer(unicode(data.id))
+                    __M_writer(u'">\n                ')
+                    # SOURCE LINE 402
+                    __M_writer(unicode(render_dataset( data, data.hid, show_deleted_on_refresh = show_deleted, for_editing = True )))
+                    __M_writer(u'\n            </div>\n')
+            # SOURCE LINE 406
+            __M_writer(u'\n    <div class="infomessagesmall" id="emptyHistoryMessage" style="display:none;">\n')
+        # SOURCE LINE 409
+        __M_writer(u'        ')
+        __M_writer(unicode(_("Your history is empty. Click 'Get Data' on the left pane to start")))
+        __M_writer(u'\n    </div>\n\n</body>\n</html>\n')
+        return ''
+    finally:
+        context.caller_stack._pop_frame()
+
+
Index: /galaxy-central/database/compiled_templates/root/tool_menu.mako.py
===================================================================
--- /galaxy-central/database/compiled_templates/root/tool_menu.mako.py (revision 3)
+++ /galaxy-central/database/compiled_templates/root/tool_menu.mako.py (revision 3)
@@ -0,0 +1,333 @@
+from mako import runtime, filters, cache
+UNDEFINED = runtime.UNDEFINED
+__M_dict_builtin = dict
+__M_locals_builtin = locals
+_magic_number = 5
+_modified_time = 1287725327.091922
+_template_filename='templates/root/tool_menu.mako'
+_template_uri='/root/tool_menu.mako'
+_template_cache=cache.Cache(__name__, _modified_time)
+_source_encoding=None
+_exports = ['render_label', 'render_tool', 'render_workflow']
+
+
+def render_body(context,**pageargs):
+    context.caller_stack._push_frame()
+    try:
+        __M_locals = __M_dict_builtin(pageargs=pageargs)
+        _ = context.get('_', UNDEFINED)
+        h = context.get('h', UNDEFINED)
+        def render_label(label):
+            return render_render_label(context.locals_(__M_locals),label)
+        t = context.get('t', UNDEFINED)
+        str = context.get('str', UNDEFINED)
+        recent_tools = context.get('recent_tools', UNDEFINED)
+        toolbox = context.get('toolbox', UNDEFINED)
+        trans = context.get('trans', UNDEFINED)
+        def render_tool(tool,section):
+            return render_render_tool(context.locals_(__M_locals),tool,section)
+        def render_workflow(key,workflow,section):
+            return render_render_workflow(context.locals_(__M_locals),key,workflow,section)
+        __M_writer = context.writer()
+        # SOURCE LINE 25
+        __M_writer(u'\n\n')
+        # SOURCE LINE 37
+        __M_writer(u'\n\n')
+        # SOURCE LINE 44
+        __M_writer(u'\n\n<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">\n<html>\n    <head>\n        <title>')
+        # SOURCE LINE 49
+        __M_writer(unicode(_('Galaxy Tools')))
+        __M_writer(u'</title>\n        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />\n        <link href="')
+        # SOURCE LINE 51
+        __M_writer(unicode(h.url_for('/static/style/base.css')))
+        __M_writer(u'" rel="stylesheet" type="text/css" />\n        <link href="')
+        # SOURCE LINE 52
+        __M_writer(unicode(h.url_for('/static/style/tool_menu.css')))
+        __M_writer(u'" rel="stylesheet" type="text/css" />\n\n')
+        # SOURCE LINE 55
+        __M_writer(u'        ')
+        __M_writer(unicode(h.js( "jquery", "galaxy.base", "json2" )))
+        __M_writer(u'\n\n        <script type="text/javascript">\n            // Set up GalaxyAsync object.\n            var galaxy_async = new GalaxyAsync(')
+        # SOURCE LINE 59
+        __M_writer(unicode(str(trans.app.config.log_actions).lower()))
+        __M_writer(u');\n            galaxy_async.set_func_url(galaxy_async.log_user_action, "')
+        # SOURCE LINE 60
+        __M_writer(unicode(h.url_for( controller='user', action='log_user_action_async' )))
+        __M_writer(u'");\n        \n            $(document).ready(function() { \n                // Init showing/hiding of tool sections.\n                $( "div.toolSectionBody" ).hide();\n                $( "div.toolSectionTitle > span" ).wrap( "<a href=\'#\'></a>" )\n                var last_expanded = null;\n                $( "div.toolSectionTitle" ).each( function() { \n                   var body = $(this).next( "div.toolSectionBody" );\n                   $(this).click( function() {\n                       if ( body.is( ":hidden" ) ) {\n                            if ( last_expanded ) {\n                                last_expanded.slideUp( "fast" );\n                            }\n                            last_expanded = body;\n                            body.slideDown( "fast" );\n                       }\n                       else {\n                           body.slideUp( "fast" );\n                           last_expanded = null;\n                       }\n                       return false;\n                   });\n                });\n                \n                // Log clicks on tools.\n                $("div.toolTitle > a").click( function() \n                {\n                    var tool_title = $(this).attr(\'id\').split("-")[1];\n                    var section_title = $(this).parents("div.toolSectionWrapper").find("div.toolSectionTitle").text().trim();\n                    var search_active = $(this).parents("div.toolTitle").hasClass("search_match");\n                    \n                    // Log action.\n                    galaxy_async.log_user_action("tool_menu_click." + tool_title, section_title, \n                                                    JSON.stringify({"search_active" : search_active}));\n                });\n                \n                $( "a[minsizehint]" ).click( function() {\n                    if ( parent.handle_minwidth_hint ) {\n                        parent.handle_minwidth_hint( $(this).attr( "minsizehint" ) );\n                    }\n                });\n                \n                // Init searching.\n                $("#tool-search-query").click( function (){\n                    $(this).focus();\n                    $(this).select();\n                })\n                .keyup( function () {\n                    // Remove italics.\n                    $(this).css("font-style", "normal");\n                    \n                    // Don\'t update if same value as last time\n                    if ( this.value.length < 3 ) {\n                        reset_tool_search(false);\n                    } else if ( this.value != this.lastValue ) {\n                        // Add class to denote that searching is active.\n                        $(this).addClass("search_active");\n                        // input.addClass(config.loadingClass);\n                        // Add \'*\' to facilitate partial matching.\n                        var q = this.value + \'*\';\n                        // Stop previous ajax-request\n                        if (this.timer) {\n                            clearTimeout(this.timer);\n                        }\n                        // Start a new ajax-request in X ms\n                        $("#search-spinner").show();\n                        this.timer = setTimeout(function () {\n                            $.get("')
+        # SOURCE LINE 128
+        __M_writer(unicode(h.url_for( controller='root', action='tool_search' )))
+        __M_writer(u'", { query: q }, function (data) {\n                                // input.removeClass(config.loadingClass);\n                                // Show live-search if results and search-term aren\'t empty\n                                $("#search-no-results").hide();\n                                // Hide all tool sections.\n                                $(".toolSectionWrapper").hide();\n                                // This hides all tools but not workflows link (which is in a .toolTitle div).\n                                $(".toolSectionWrapper").find(".toolTitle").hide();\n                                if ( data.length != 0 ) {\n                                    // Map tool ids to element ids and join them.\n                                    var s = $.map( data, function( n, i ) { return "#link-" + n; } ).join( ", " );\n                                    \n                                    // First pass to show matching tools and their parents.\n                                    $(s).each( function() {\n                                        // Add class to denote match.\n                                        $(this).parent().addClass("search_match");\n                                        if ($(this).parents("#recently_used_wrapper").length == 0)\n                                            // Default behavior.\n                                            $(this).parent().show().parent().parent().show().parent().show();\n                                        else if ($(this).parents(".user_pref_visible").length != 0)\n                                            // RU menu is visible, so filter it as normal.\n                                            $(this).parent().show().parent().parent().show().parent().show();\n                                        else \n                                        {\n                                            // RU menu is not visible, so set up classes and visibility so that if menu shown matching is \n                                            // aleady in place.\n                                            $(this).parent().show();\n                                        }\n                                    });\n                                    \n                                    // Hide labels that have no visible children.\n                                    $(".toolPanelLabel").each( function() {\n                                       var this_label = $(this);                                   \n                                       var next = this_label.next();\n                                       var no_visible_tools = true;\n                                       // Look through tools following label and, if none are visible, hide label.\n                                       while (next.length != 0 && next.hasClass("toolTitle"))\n                                       {\n                                           if (next.is(":visible"))\n                                           {\n                                               no_visible_tools = false;\n                                               break;\n                                           }\n                                           else\n                                               next = next.next();\n                                        }\n                                        if (no_visible_tools)\n                                            this_label.hide();\n                                    });\n                                } else {\n                                    $("#search-no-results").show();\n                                }\n                                $("#search-spinner").hide();\n                            }, "json" );\n                        }, 200 );\n                    }\n                    this.lastValue = this.value;\n                });                \n            });            \n\n            // Update recently used tools menu. Function inserts a new item and removes the last item.\n            function update_recently_used()\n            {\n                $.ajax({\n                    url: "')
+        # SOURCE LINE 192
+        __M_writer(unicode(h.url_for( controller='/user', action='get_most_recently_used_tool_async' )))
+        __M_writer(u'",\n                    dataType: \'json\',\n                    error: function() { \n                        // console.log( "Failed to update recently used list." );\n                    },\n                    success: function(new_tool_info) {\n                        var recently_used_elts = $("#recently_used").find(".toolTitle");\n                        var first_elt = $(recently_used_elts.first());\n                        var found_in_list = false;\n            \n                        // Look for new tool in current list. If found, rearrange list to move tool to top.\n                        recently_used_elts.each( function(index) {\n                            var anchor = $(this).find("a");\n                            var tool_id = anchor.attr("id").split("-")[1];\n                            if (tool_id == new_tool_info.id)\n                            {\n                                found_in_list = true;\n                    \n                                // If tool is first, do nothing.\n                                if (index == 0)\n                                    return;\n                                else \n                                {\n                                    // Tool not first; reorder.\n                                    $(this).remove();\n                                    first_elt.before($(this));\n                                }\n                            }\n                        });\n            \n                        // If tool not in list, create new element, remove last element, and put new element first in list.\n                        if (!found_in_list)\n                        {\n                            new_tool_elt = $("<div class=\'toolTitle\'> ')
+        # SOURCE LINE 226
+        __M_writer(u'                                                <a id=\'link-" + new_tool_info.id + "\' href=\'" + new_tool_info.link + "\' target=\'" + \n                                                new_tool_info.target + "\' minsizehint=\'" + new_tool_info.minsizehint + "\'>" +\n                                                new_tool_info.name + "</a> " + new_tool_info.description + " ')
+        # SOURCE LINE 229
+        __M_writer(u'                                              </div>");\n                            recently_used_elts.last().remove();\n                            recently_used_elts.first().before(new_tool_elt);                            \n                        }\n                    }\n                });                \n            }\n        </script>\n    </head>\n\n    <body class="toolMenuPage">\n        <div class="toolMenu">\n            \n')
+        # SOURCE LINE 243
+        __M_writer(u'                ')
+
+        show_tool_search = False
+        if trans.user:
+            show_tool_search = trans.user.preferences.get( "show_tool_search", "False" )
+        
+        if show_tool_search == "True":
+            display = "block"
+        else:
+            display = "none"
+                        
+        
+        __M_locals.update(__M_dict_builtin([(__M_key, __M_locals_builtin()[__M_key]) for __M_key in ['display','show_tool_search'] if __M_key in __M_locals_builtin()]))
+        # SOURCE LINE 252
+        __M_writer(u'\n                <div id="tool-search" style="padding-bottom: 5px; position: relative; display: ')
+        # SOURCE LINE 253
+        __M_writer(unicode(display))
+        __M_writer(u'; width: 100%">\n                    <input type="text" name="query" value="search tools" id="tool-search-query" style="width: 100%; font-style:italic; font-size: inherit"/>\n                    <img src="')
+        # SOURCE LINE 255
+        __M_writer(unicode(h.url_for('/static/images/loading_small_white_bg.gif')))
+        __M_writer(u'" id="search-spinner" style="display: none; position: absolute; right: 0; top: 5px;"/>\n                </div>\n                \n')
+        # SOURCE LINE 259
+        if trans.user:
+            # SOURCE LINE 260
+            __M_writer(u'                    ')
+
+            if trans.user.preferences.get( 'show_recently_used_menu', 'False' ) == 'True':
+                display = "block"
+                pref_class = "user_pref_visible"
+            else:
+                display = "none"
+                pref_class = "user_pref_hidden"
+            
+            
+            __M_locals.update(__M_dict_builtin([(__M_key, __M_locals_builtin()[__M_key]) for __M_key in ['pref_class','display'] if __M_key in __M_locals_builtin()]))
+            # SOURCE LINE 267
+            __M_writer(u'\n                    <div class="toolSectionWrapper ')
+            # SOURCE LINE 268
+            __M_writer(unicode(pref_class))
+            __M_writer(u'" id="recently_used_wrapper" \n                            style="display: ')
+            # SOURCE LINE 269
+            __M_writer(unicode(display))
+            __M_writer(u'; padding-bottom: 5px">\n                        <div class="toolSectionTitle">\n                            <span>Recently Used</span>\n                        </div>\n                        <div id="recently_used" class="toolSectionBody">\n                            <div class="toolSectionBg">\n')
+            # SOURCE LINE 275
+            for tool in recent_tools:
+                # SOURCE LINE 276
+                __M_writer(u'                                    ')
+                __M_writer(unicode(render_tool( tool, True )))
+                __M_writer(u'\n')
+            # SOURCE LINE 278
+            __M_writer(u'                            </div>\n                        </div>\n                        <div class="toolSectionPad"></div>\n                    </div>\n')
+        # SOURCE LINE 283
+        __M_writer(u'                \n')
+        # SOURCE LINE 285
+        for key, val in toolbox.tool_panel.items():
+            # SOURCE LINE 286
+            __M_writer(u'                    <div class="toolSectionWrapper">\n')
+            # SOURCE LINE 287
+            if key.startswith( 'tool' ):
+                # SOURCE LINE 288
+                __M_writer(u'                        ')
+                __M_writer(unicode(render_tool( val, False )))
+                __M_writer(u'\n')
+                # SOURCE LINE 289
+            elif key.startswith( 'workflow' ):
+                # SOURCE LINE 290
+                __M_writer(u'                        ')
+                __M_writer(unicode(render_workflow( key, val, False )))
+                __M_writer(u'\n')
+                # SOURCE LINE 291
+            elif key.startswith( 'section' ):
+                # SOURCE LINE 292
+                __M_writer(u'                        ')
+                section = val 
+                
+                __M_locals.update(__M_dict_builtin([(__M_key, __M_locals_builtin()[__M_key]) for __M_key in ['section'] if __M_key in __M_locals_builtin()]))
+                __M_writer(u'\n                        <div class="toolSectionTitle" id="title_')
+                # SOURCE LINE 293
+                __M_writer(unicode(section.id))
+                __M_writer(u'">\n                            <span>')
+                # SOURCE LINE 294
+                __M_writer(unicode(section.name))
+                __M_writer(u'</span>\n                        </div>\n                        <div id="')
+                # SOURCE LINE 296
+                __M_writer(unicode(section.id))
+                __M_writer(u'" class="toolSectionBody">\n                            <div class="toolSectionBg">\n')
+                # SOURCE LINE 298
+                for section_key, section_val in section.elems.items():
+                    # SOURCE LINE 299
+                    if section_key.startswith( 'tool' ):
+                        # SOURCE LINE 300
+                        __M_writer(u'                                        ')
+                        __M_writer(unicode(render_tool( section_val, True )))
+                        __M_writer(u'\n')
+                        # SOURCE LINE 301
+                    elif section_key.startswith( 'workflow' ):
+                        # SOURCE LINE 302
+                        __M_writer(u'                                        ')
+                        __M_writer(unicode(render_workflow( section_key, section_val, True )))
+                        __M_writer(u'\n')
+                        # SOURCE LINE 303
+                    elif section_key.startswith( 'label' ):
+                        # SOURCE LINE 304
+                        __M_writer(u'                                        ')
+                        __M_writer(unicode(render_label( section_val )))
+                        __M_writer(u'\n')
+                # SOURCE LINE 307
+                __M_writer(u'                            </div>\n                        </div>\n')
+                # SOURCE LINE 309
+            elif key.startswith( 'label' ):
+                # SOURCE LINE 310
+                __M_writer(u'                        ')
+                __M_writer(unicode(render_label( val )))
+                __M_writer(u'\n')
+            # SOURCE LINE 312
+            __M_writer(u'                    <div class="toolSectionPad"></div>\n                    </div>\n')
+        # SOURCE LINE 315
+        __M_writer(u'                \n')
+        # SOURCE LINE 317
+        __M_writer(u'                <div id="search-no-results" style="display: none; padding-top: 5px">\n                    <em><strong>Search did not match any tools.</strong></em>\n                </div>\n                \n')
+        # SOURCE LINE 324
+        __M_writer(u'                \n')
+        # SOURCE LINE 325
+        if t.user:
+            # SOURCE LINE 326
+            __M_writer(u'                    <div class="toolSectionPad"></div>\n                    <div class="toolSectionPad"></div>\n                    <div class="toolSectionTitle" id="title_XXinternalXXworkflow">\n                      <span>Workflows</span>\n                    </div>\n                    <div id="XXinternalXXworkflow" class="toolSectionBody">\n                        <div class="toolSectionBg">\n')
+            # SOURCE LINE 333
+            if t.user.stored_workflow_menu_entries:
+                # SOURCE LINE 334
+                for m in t.user.stored_workflow_menu_entries:
+                    # SOURCE LINE 335
+                    __M_writer(u'                                    <div class="toolTitle">\n                                        <a href="')
+                    # SOURCE LINE 336
+                    __M_writer(unicode(h.url_for( controller='workflow', action='run', id=trans.security.encode_id(m.stored_workflow_id) )))
+                    __M_writer(u'" target="galaxy_main">')
+                    __M_writer(unicode(m.stored_workflow.name))
+                    __M_writer(u'</a>\n                                    </div>\n')
+            # SOURCE LINE 340
+            __M_writer(u'                            <div class="toolTitle">\n                                <a href="')
+            # SOURCE LINE 341
+            __M_writer(unicode(h.url_for( controller='workflow', action='list_for_run')))
+            __M_writer(u'" target="galaxy_main">All workflows</a>\n                            </div>\n                        </div>\n                    </div>\n')
+        # SOURCE LINE 346
+        __M_writer(u'                \n            </div>\n        </div>\n    </body>\n</html>\n')
+        return ''
+    finally:
+        context.caller_stack._pop_frame()
+
+
+def render_render_label(context,label):
+    context.caller_stack._push_frame()
+    try:
+        __M_writer = context.writer()
+        # SOURCE LINE 40
+        __M_writer(u'\n    <div class="toolPanelLabel" id="title_')
+        # SOURCE LINE 41
+        __M_writer(unicode(label.id))
+        __M_writer(u'">\n        <span>')
+        # SOURCE LINE 42
+        __M_writer(unicode(label.text))
+        __M_writer(u'</span>\n    </div>\n')
+        return ''
+    finally:
+        context.caller_stack._pop_frame()
+
+
+def render_render_tool(context,tool,section):
+    context.caller_stack._push_frame()
+    try:
+        h = context.get('h', UNDEFINED)
+        t = context.get('t', UNDEFINED)
+        _ = context.get('_', UNDEFINED)
+        __M_writer = context.writer()
+        # SOURCE LINE 2
+        __M_writer(u'\n')
+        # SOURCE LINE 3
+        if not tool.hidden:
+            # SOURCE LINE 4
+            if section:
+                # SOURCE LINE 5
+                __M_writer(u'            <div class="toolTitle">\n')
+                # SOURCE LINE 6
+            else:
+                # SOURCE LINE 7
+                __M_writer(u'            <div class="toolTitleNoSection">\n')
+            # SOURCE LINE 9
+            __M_writer(u'            ')
+
+            if tool.input_required:
+                link = h.url_for( controller='tool_runner', tool_id=tool.id )
+            else:
+                link = h.url_for( tool.action, ** tool.get_static_param_values( t ) )
+                        
+            
+            # SOURCE LINE 14
+            __M_writer(u'\n')
+            # SOURCE LINE 18
+            if tool.name:
+                # SOURCE LINE 19
+                __M_writer(u'                <a id="link-')
+                __M_writer(unicode(tool.id))
+                __M_writer(u'" href="')
+                __M_writer(unicode(link))
+                __M_writer(u'" target=')
+                __M_writer(unicode(tool.target))
+                __M_writer(u' minsizehint="')
+                __M_writer(unicode(tool.uihints.get( 'minwidth', -1 )))
+                __M_writer(u'">')
+                __M_writer(unicode(_(tool.name)))
+                __M_writer(u'</a> ')
+                __M_writer(unicode(tool.description))
+                __M_writer(u' \n')
+                # SOURCE LINE 20
+            else:
+                # SOURCE LINE 21
+                __M_writer(u'                <a id="link-')
+                __M_writer(unicode(tool.id))
+                __M_writer(u'" href="')
+                __M_writer(unicode(link))
+                __M_writer(u'" target=')
+                __M_writer(unicode(tool.target))
+                __M_writer(u' minsizehint="')
+                __M_writer(unicode(tool.uihints.get( 'minwidth', -1 )))
+                __M_writer(u'">')
+                __M_writer(unicode(tool.description))
+                __M_writer(u'</a>\n')
+            # SOURCE LINE 23
+            __M_writer(u'        </div>\n')
+        return ''
+    finally:
+        context.caller_stack._pop_frame()
+
+
+def render_render_workflow(context,key,workflow,section):
+    context.caller_stack._push_frame()
+    try:
+        h = context.get('h', UNDEFINED)
+        _ = context.get('_', UNDEFINED)
+        __M_writer = context.writer()
+        # SOURCE LINE 28
+        __M_writer(u'\n')
+        # SOURCE LINE 29
+        if section:
+            # SOURCE LINE 30
+            __M_writer(u'        <div class="toolTitle">\n')
+            # SOURCE LINE 31
+        else:
+            # SOURCE LINE 32
+            __M_writer(u'        <div class="toolTitleNoSection">\n')
+        # SOURCE LINE 34
+        __M_writer(u'        ')
+        encoded_id = key.lstrip( 'workflow_' ) 
+        
+        __M_writer(u'\n        <a id="link-')
+        # SOURCE LINE 35
+        __M_writer(unicode(workflow.id))
+        __M_writer(u'" href="')
+        __M_writer(unicode( h.url_for( controller='workflow', action='run', id=encoded_id, check_user=False )))
+        __M_writer(u'" target="_parent"}">')
+        __M_writer(unicode(_(workflow.name)))
+        __M_writer(u'</a>\n    </div>\n')
+        return ''
+    finally:
+        context.caller_stack._pop_frame()
+
+
Index: /galaxy-central/database/compiled_templates/dataset/edit_attributes.mako.py
===================================================================
--- /galaxy-central/database/compiled_templates/dataset/edit_attributes.mako.py (revision 3)
+++ /galaxy-central/database/compiled_templates/dataset/edit_attributes.mako.py (revision 3)
@@ -0,0 +1,337 @@
+from mako import runtime, filters, cache
+UNDEFINED = runtime.UNDEFINED
+__M_dict_builtin = dict
+__M_locals_builtin = locals
+_magic_number = 5
+_modified_time = 1287725818.302273
+_template_filename='templates/dataset/edit_attributes.mako'
+_template_uri='/dataset/edit_attributes.mako'
+_template_cache=cache.Cache(__name__, _modified_time)
+_source_encoding=None
+_exports = ['stylesheets', 'datatype', 'javascripts', 'title']
+
+
+def _mako_get_namespace(context, name):
+    try:
+        return context.namespaces[(__name__, name)]
+    except KeyError:
+        _mako_generate_namespaces(context)
+        return context.namespaces[(__name__, name)]
+def _mako_generate_namespaces(context):
+    # SOURCE LINE 163
+    ns = runtime.Namespace('__anon_0x10ab4e150', context._clean_inheritance_tokens(), templateuri=u'/dataset/security_common.mako', callables=None, calling_uri=_template_uri, module=None)
+    context.namespaces[(__name__, '__anon_0x10ab4e150')] = ns
+
+    # SOURCE LINE 2
+    ns = runtime.Namespace('__anon_0x10aad7dd0', context._clean_inheritance_tokens(), templateuri=u'/message.mako', callables=None, calling_uri=_template_uri, module=None)
+    context.namespaces[(__name__, '__anon_0x10aad7dd0')] = ns
+
+def _mako_inherit(template, context):
+    _mako_generate_namespaces(context)
+    return runtime._inherit_from(context, u'/base.mako', _template_uri)
+def render_body(context,**pageargs):
+    context.caller_stack._push_frame()
+    try:
+        __M_locals = __M_dict_builtin(pageargs=pageargs)
+        _import_ns = {}
+        _mako_get_namespace(context, '__anon_0x10ab4e150')._populate(_import_ns, [u'render_permission_form'])
+        _mako_get_namespace(context, '__anon_0x10aad7dd0')._populate(_import_ns, [u'render_msg'])
+        status = _import_ns.get('status', context.get('status', UNDEFINED))
+        render_permission_form = _import_ns.get('render_permission_form', context.get('render_permission_form', UNDEFINED))
+        render_msg = _import_ns.get('render_msg', context.get('render_msg', UNDEFINED))
+        all_roles = _import_ns.get('all_roles', context.get('all_roles', UNDEFINED))
+        data_annotation = _import_ns.get('data_annotation', context.get('data_annotation', UNDEFINED))
+        def datatype(dataset,datatypes):
+            return render_datatype(context.locals_(__M_locals),dataset,datatypes)
+        h = _import_ns.get('h', context.get('h', UNDEFINED))
+        current_user_roles = _import_ns.get('current_user_roles', context.get('current_user_roles', UNDEFINED))
+        len = _import_ns.get('len', context.get('len', UNDEFINED))
+        message = _import_ns.get('message', context.get('message', UNDEFINED))
+        trans = _import_ns.get('trans', context.get('trans', UNDEFINED))
+        data = _import_ns.get('data', context.get('data', UNDEFINED))
+        datatypes = _import_ns.get('datatypes', context.get('datatypes', UNDEFINED))
+        _ = _import_ns.get('_', context.get('_', UNDEFINED))
+        __M_writer = context.writer()
+        # SOURCE LINE 1
+        __M_writer(u'\n')
+        # SOURCE LINE 2
+        __M_writer(u'\n\n')
+        # SOURCE LINE 4
+        __M_writer(u'\n\n')
+        # SOURCE LINE 8
+        __M_writer(u'\n\n')
+        # SOURCE LINE 13
+        __M_writer(u'\n\n')
+        # SOURCE LINE 25
+        __M_writer(u'\n\n')
+        # SOURCE LINE 27
+        if message:
+            # SOURCE LINE 28
+            __M_writer(u'    ')
+            __M_writer(unicode(render_msg( message, status )))
+            __M_writer(u'\n')
+        # SOURCE LINE 30
+        __M_writer(u'\n<div class="toolForm">\n    <div class="toolFormTitle">')
+        # SOURCE LINE 32
+        __M_writer(unicode(_('Edit Attributes')))
+        __M_writer(u'</div>\n    <div class="toolFormBody">\n        <form name="edit_attributes" action="')
+        # SOURCE LINE 34
+        __M_writer(unicode(h.url_for( controller='root', action='edit' )))
+        __M_writer(u'" method="post">\n            <input type="hidden" name="id" value="')
+        # SOURCE LINE 35
+        __M_writer(unicode(data.id))
+        __M_writer(u'"/>\n            <div class="form-row">\n                <label>\n                    Name:\n                </label>\n                <div style="float: left; width: 250px; margin-right: 10px;">\n                    <input type="text" name="name" value="')
+        # SOURCE LINE 41
+        __M_writer(unicode(data.get_display_name()))
+        __M_writer(u'" size="40"/>\n                </div>\n                <div style="clear: both"></div>\n            </div>\n            <div class="form-row">\n                <label>\n                    Info:\n                </label>\n                <div style="float: left; width: 250px; margin-right: 10px;">\n                    <input type="text" name="info" value="')
+        # SOURCE LINE 50
+        __M_writer(unicode(data.info))
+        __M_writer(u'" size="40"/>\n                </div>\n                <div style="clear: both"></div>\n            </div>\n')
+        # SOURCE LINE 54
+        if trans.get_user() is not None:
+            # SOURCE LINE 55
+            __M_writer(u'                <div class="form-row">                    \n                    <label>\n                        Annotation / Notes:\n                    </label>\n                    <div style="float: left; width: 250px; margin-right: 10px;">\n                        <textarea name="annotation" cols="40" rows="2">')
+            # SOURCE LINE 60
+            __M_writer(unicode(data_annotation))
+            __M_writer(u'</textarea>\n                    </div>\n                    <div style="clear: both"></div>\n                    <div class="toolParamHelp">Add an annotation or notes to a dataset; annotations are available when a history is viewed.</div>\n                </div>\n')
+        # SOURCE LINE 66
+        for name, spec in data.metadata.spec.items():
+            # SOURCE LINE 67
+            if spec.visible:
+                # SOURCE LINE 68
+                __M_writer(u'                    <div class="form-row">\n                        <label>\n                            ')
+                # SOURCE LINE 70
+                __M_writer(unicode(spec.desc))
+                __M_writer(u':\n                        </label>\n                        <div style="float: left; width: 250px; margin-right: 10px;">\n                            ')
+                # SOURCE LINE 73
+                __M_writer(unicode(data.metadata.get_html_by_name( name, trans=trans )))
+                __M_writer(u'\n                        </div>\n                        <div style="clear: both"></div>\n                    </div>\n')
+        # SOURCE LINE 79
+        __M_writer(u'            <div class="form-row">\n                <input type="submit" name="save" value="')
+        # SOURCE LINE 80
+        __M_writer(unicode(_('Save')))
+        __M_writer(u'"/>\n            </div>\n        </form>\n        <form name="auto_detect" action="')
+        # SOURCE LINE 83
+        __M_writer(unicode(h.url_for( controller='root', action='edit' )))
+        __M_writer(u'" method="post">\n            <input type="hidden" name="id" value="')
+        # SOURCE LINE 84
+        __M_writer(unicode(data.id))
+        __M_writer(u'"/>\n            <div class="form-row">\n                <div style="float: left; width: 250px; margin-right: 10px;">\n                    <input type="submit" name="detect" value="')
+        # SOURCE LINE 87
+        __M_writer(unicode(_('Auto-detect')))
+        __M_writer(u'"/>\n                </div>\n                <div class="toolParamHelp" style="clear: both;">\n                    This will inspect the dataset and attempt to correct the above column values if they are not accurate.\n                </div>\n            </div>\n        </form>\n')
+        # SOURCE LINE 94
+        if data.missing_meta():
+            # SOURCE LINE 95
+            __M_writer(u'            <div class="form-row">\n                <div class="errormessagesmall">')
+            # SOURCE LINE 96
+            __M_writer(unicode(_('Required metadata values are missing. Some of these values may not be editable by the user. Selecting "Auto-detect" will attempt to fix these values.')))
+            __M_writer(u'</div>\n            </div>\n')
+        # SOURCE LINE 99
+        __M_writer(u'    </div>\n</div>\n<p />\n')
+        # SOURCE LINE 102
+        converters = data.get_converter_types() 
+        
+        __M_locals.update(__M_dict_builtin([(__M_key, __M_locals_builtin()[__M_key]) for __M_key in ['converters'] if __M_key in __M_locals_builtin()]))
+        __M_writer(u'\n')
+        # SOURCE LINE 103
+        if len( converters ) > 0:
+            # SOURCE LINE 104
+            __M_writer(u'    <div class="toolForm">\n        <div class="toolFormTitle">')
+            # SOURCE LINE 105
+            __M_writer(unicode(_('Convert to new format')))
+            __M_writer(u'</div>\n        <div class="toolFormBody">\n            <form name="convert_data" action="')
+            # SOURCE LINE 107
+            __M_writer(unicode(h.url_for( controller='root', action='edit' )))
+            __M_writer(u'" method="post">\n                <input type="hidden" name="id" value="')
+            # SOURCE LINE 108
+            __M_writer(unicode(data.id))
+            __M_writer(u'"/>\n                <div class="form-row">\n                    <div style="float: left; width: 250px; margin-right: 10px;">\n                        <select name="target_type">\n')
+            # SOURCE LINE 112
+            for key, value in converters.items():
+                # SOURCE LINE 113
+                __M_writer(u'                                <option value="')
+                __M_writer(unicode(key))
+                __M_writer(u'">')
+                __M_writer(unicode(value.name))
+                __M_writer(u'</option>\n')
+            # SOURCE LINE 115
+            __M_writer(u'                        </select>\n                    </div>\n                    <div class="toolParamHelp" style="clear: both;">\n                        This will create a new dataset with the contents of this dataset converted to a new format. \n                    </div>\n                    <div style="clear: both"></div>\n                </div>\n                <div class="form-row">\n                    <input type="submit" name="convert_data" value="')
+            # SOURCE LINE 123
+            __M_writer(unicode(_('Convert')))
+            __M_writer(u'"/>\n                </div>\n            </form>\n        </div>\n    </div>\n    <p />\n')
+        # SOURCE LINE 130
+        __M_writer(u'\n<div class="toolForm">\n    <div class="toolFormTitle">')
+        # SOURCE LINE 132
+        __M_writer(unicode(_('Change data type')))
+        __M_writer(u'</div>\n    <div class="toolFormBody">\n')
+        # SOURCE LINE 134
+        if data.datatype.allow_datatype_change:
+            # SOURCE LINE 135
+            __M_writer(u'            <form name="change_datatype" action="')
+            __M_writer(unicode(h.url_for( controller='root', action='edit' )))
+            __M_writer(u'" method="post">\n                <input type="hidden" name="id" value="')
+            # SOURCE LINE 136
+            __M_writer(unicode(data.id))
+            __M_writer(u'"/>\n                <div class="form-row">\n                    <label>\n                        ')
+            # SOURCE LINE 139
+            __M_writer(unicode(_('New Type')))
+            __M_writer(u':\n                    </label>\n                    <div style="float: left; width: 250px; margin-right: 10px;">\n                        ')
+            # SOURCE LINE 142
+            __M_writer(unicode(datatype( data, datatypes )))
+            __M_writer(u'\n                    </div>\n                    <div class="toolParamHelp" style="clear: both;">\n                        ')
+            # SOURCE LINE 145
+            __M_writer(unicode(_('This will change the datatype of the existing dataset but <i>not</i> modify its contents. Use this if Galaxy has incorrectly guessed the type of your dataset.')))
+            __M_writer(u'\n                    </div>\n                    <div style="clear: both"></div>\n                </div>\n                <div class="form-row">\n                    <input type="submit" name="change" value="')
+            # SOURCE LINE 150
+            __M_writer(unicode(_('Save')))
+            __M_writer(u'"/>\n                </div>\n            </form>\n')
+            # SOURCE LINE 153
+        else:
+            # SOURCE LINE 154
+            __M_writer(u'            <div class="form-row">\n                <div class="warningmessagesmall">')
+            # SOURCE LINE 155
+            __M_writer(unicode(_('Changing the datatype of this dataset is not allowed.')))
+            __M_writer(u'</div>\n            </div>\n')
+        # SOURCE LINE 158
+        __M_writer(u'    </div>\n</div>\n<p />\n\n')
+        # SOURCE LINE 162
+        if trans.app.security_agent.can_manage_dataset( current_user_roles, data.dataset ):
+            # SOURCE LINE 163
+            __M_writer(u'    ')
+            __M_writer(u'\n    ')
+            # SOURCE LINE 164
+            __M_writer(unicode(render_permission_form( data.dataset, data.get_display_name(), h.url_for( controller='root', action='edit', id=data.id ), all_roles )))
+            __M_writer(u'\n')
+            # SOURCE LINE 165
+        elif trans.user:
+            # SOURCE LINE 166
+            __M_writer(u'    <div class="toolForm">\n        <div class="toolFormTitle">View Permissions</div>\n        <div class="toolFormBody">\n            <div class="form-row">\n')
+            # SOURCE LINE 170
+            if data.dataset.actions:
+                # SOURCE LINE 171
+                __M_writer(u'                    <ul>\n')
+                # SOURCE LINE 172
+                for action, roles in trans.app.security_agent.get_permissions( data.dataset ).items():
+                    # SOURCE LINE 173
+                    if roles:
+                        # SOURCE LINE 174
+                        __M_writer(u'                                <li>')
+                        __M_writer(unicode(action.description))
+                        __M_writer(u'</li>\n                                <ul>\n')
+                        # SOURCE LINE 176
+                        for role in roles:
+                            # SOURCE LINE 177
+                            __M_writer(u'                                        <li>')
+                            __M_writer(unicode(role.name))
+                            __M_writer(u'</li>\n')
+                        # SOURCE LINE 179
+                        __M_writer(u'                                </ul>\n')
+                # SOURCE LINE 182
+                __M_writer(u'                    </ul>\n')
+                # SOURCE LINE 183
+            else:
+                # SOURCE LINE 184
+                __M_writer(u'                    <p>This dataset is accessible by everyone (it is public).</p>\n')
+            # SOURCE LINE 186
+            __M_writer(u'            </div>\n        </div>\n    </div>\n')
+        # SOURCE LINE 190
+        __M_writer(u'<p/>\n<div class="toolForm">\n    <div class="toolFormTitle">Copy History Item</div>\n        <div class="toolFormBody">\n            <form name="copy_hda" action="')
+        # SOURCE LINE 194
+        __M_writer(unicode(h.url_for( controller='dataset', action='copy_datasets', source_dataset_ids=data.id, target_history_ids=data.history_id )))
+        __M_writer(u'" method="post">\n                <div class="form-row">\n                    <input type="submit" name="change" value="Copy history item"/>\n                    <div class="toolParamHelp" style="clear: both;">\n                        Make a copy of this history item in your current history or any of your active histories.\n                    </div>\n                </div>\n            </form>\n        </div>\n    </div>\n</div>\n')
+        return ''
+    finally:
+        context.caller_stack._pop_frame()
+
+
+def render_stylesheets(context):
+    context.caller_stack._push_frame()
+    try:
+        _import_ns = {}
+        _mako_get_namespace(context, '__anon_0x10ab4e150')._populate(_import_ns, [u'render_permission_form'])
+        _mako_get_namespace(context, '__anon_0x10aad7dd0')._populate(_import_ns, [u'render_msg'])
+        h = _import_ns.get('h', context.get('h', UNDEFINED))
+        __M_writer = context.writer()
+        # SOURCE LINE 6
+        __M_writer(u'\n    ')
+        # SOURCE LINE 7
+        __M_writer(unicode(h.css( "base", "autocomplete_tagging" )))
+        __M_writer(u'\n')
+        return ''
+    finally:
+        context.caller_stack._pop_frame()
+
+
+def render_datatype(context,dataset,datatypes):
+    context.caller_stack._push_frame()
+    try:
+        _import_ns = {}
+        _mako_get_namespace(context, '__anon_0x10ab4e150')._populate(_import_ns, [u'render_permission_form'])
+        _mako_get_namespace(context, '__anon_0x10aad7dd0')._populate(_import_ns, [u'render_msg'])
+        _ = _import_ns.get('_', context.get('_', UNDEFINED))
+        __M_writer = context.writer()
+        # SOURCE LINE 15
+        __M_writer(u'\n    <select name="datatype">\n')
+        # SOURCE LINE 17
+        for ext in datatypes:
+            # SOURCE LINE 18
+            if dataset.ext == ext:
+                # SOURCE LINE 19
+                __M_writer(u'                <option value="')
+                __M_writer(unicode(ext))
+                __M_writer(u'" selected="yes">')
+                __M_writer(unicode(_(ext)))
+                __M_writer(u'</option>\n')
+                # SOURCE LINE 20
+            else:
+                # SOURCE LINE 21
+                __M_writer(u'                <option value="')
+                __M_writer(unicode(ext))
+                __M_writer(u'">')
+                __M_writer(unicode(_(ext)))
+                __M_writer(u'</option>\n')
+        # SOURCE LINE 24
+        __M_writer(u'    </select>\n')
+        return ''
+    finally:
+        context.caller_stack._pop_frame()
+
+
+def render_javascripts(context):
+    context.caller_stack._push_frame()
+    try:
+        _import_ns = {}
+        _mako_get_namespace(context, '__anon_0x10ab4e150')._populate(_import_ns, [u'render_permission_form'])
+        _mako_get_namespace(context, '__anon_0x10aad7dd0')._populate(_import_ns, [u'render_msg'])
+        h = _import_ns.get('h', context.get('h', UNDEFINED))
+        parent = _import_ns.get('parent', context.get('parent', UNDEFINED))
+        __M_writer = context.writer()
+        # SOURCE LINE 10
+        __M_writer(u'\n    ')
+        # SOURCE LINE 11
+        __M_writer(unicode(parent.javascripts()))
+        __M_writer(u'\n    ')
+        # SOURCE LINE 12
+        __M_writer(unicode(h.js( "galaxy.base", "jquery.autocomplete", "autocomplete_tagging" )))
+        __M_writer(u'\n')
+        return ''
+    finally:
+        context.caller_stack._pop_frame()
+
+
+def render_title(context):
+    context.caller_stack._push_frame()
+    try:
+        _import_ns = {}
+        _mako_get_namespace(context, '__anon_0x10ab4e150')._populate(_import_ns, [u'render_permission_form'])
+        _mako_get_namespace(context, '__anon_0x10aad7dd0')._populate(_import_ns, [u'render_msg'])
+        _ = _import_ns.get('_', context.get('_', UNDEFINED))
+        __M_writer = context.writer()
+        # SOURCE LINE 4
+        __M_writer(unicode(_('Edit Dataset Attributes')))
+        return ''
+    finally:
+        context.caller_stack._pop_frame()
+
+
Index: /galaxy-central/database/compiled_templates/dataset/security_common.mako.py
===================================================================
--- /galaxy-central/database/compiled_templates/dataset/security_common.mako.py (revision 3)
+++ /galaxy-central/database/compiled_templates/dataset/security_common.mako.py (revision 3)
@@ -0,0 +1,180 @@
+from mako import runtime, filters, cache
+UNDEFINED = runtime.UNDEFINED
+__M_dict_builtin = dict
+__M_locals_builtin = locals
+_magic_number = 5
+_modified_time = 1287725818.3254099
+_template_filename=u'templates/dataset/security_common.mako'
+_template_uri=u'/dataset/security_common.mako'
+_template_cache=cache.Cache(__name__, _modified_time)
+_source_encoding=None
+_exports = ['render_permission_form', 'render_select']
+
+
+def render_body(context,**pageargs):
+    context.caller_stack._push_frame()
+    try:
+        __M_locals = __M_dict_builtin(pageargs=pageargs)
+        __M_writer = context.writer()
+        # SOURCE LINE 37
+        __M_writer(u'\n\n')
+        # SOURCE LINE 123
+        __M_writer(u'\n')
+        return ''
+    finally:
+        context.caller_stack._pop_frame()
+
+
+def render_render_permission_form(context,obj,obj_name,form_url,all_roles,do_not_render=[]):
+    context.caller_stack._push_frame()
+    try:
+        trans = context.get('trans', UNDEFINED)
+        def render_select(current_actions,action_key,action,all_roles):
+            return render_render_select(context,current_actions,action_key,action,all_roles)
+        isinstance = context.get('isinstance', UNDEFINED)
+        __M_writer = context.writer()
+        # SOURCE LINE 40
+        __M_writer(u'\n    ')
+        # SOURCE LINE 41
+
+        if isinstance( obj, trans.app.model.User ):
+            current_actions = obj.default_permissions
+            permitted_actions = trans.app.model.Dataset.permitted_actions.items()
+            obj_str = 'user %s' % obj_name
+            obj_type = 'dataset'
+        elif isinstance( obj, trans.app.model.History ):
+            current_actions = obj.default_permissions
+            permitted_actions = trans.app.model.Dataset.permitted_actions.items()
+            obj_str = 'history %s' % obj_name
+            obj_type = 'dataset'
+        elif isinstance( obj, trans.app.model.Dataset ):
+            current_actions = obj.actions
+            permitted_actions = trans.app.model.Dataset.permitted_actions.items()
+            obj_str = obj_name
+            obj_type = 'dataset'
+        elif isinstance( obj, trans.app.model.LibraryDatasetDatasetAssociation ):
+            current_actions = obj.actions + obj.dataset.actions
+            permitted_actions = trans.app.model.Dataset.permitted_actions.items() + trans.app.model.Library.permitted_actions.items()
+            obj_str = obj_name
+            obj_type = 'dataset'
+        elif isinstance( obj, trans.app.model.Library ):
+            current_actions = obj.actions
+            permitted_actions = trans.app.model.Library.permitted_actions.items()
+            obj_str = 'library %s' % obj_name
+            obj_type = 'library'
+        elif isinstance( obj, trans.app.model.LibraryDataset ):
+            current_actions = obj.actions
+            permitted_actions = trans.app.model.Library.permitted_actions.items()
+            obj_str = 'library dataset %s' % obj_name
+            obj_type = 'library'
+        elif isinstance( obj, trans.app.model.LibraryFolder ):
+            current_actions = obj.actions
+            permitted_actions = trans.app.model.Library.permitted_actions.items()
+            obj_str = 'library folder %s' % obj_name
+            obj_type = 'library'
+        else:
+            current_actions = []
+            permitted_actions = {}.items()
+            obj_str = 'unknown object %s' %obj_name
+            obj_type = ''
+            
+        
+        # SOURCE LINE 82
+        __M_writer(u'\n    <script type="text/javascript">\n        $( document ).ready( function () {\n            $( \'.role_add_button\' ).click( function() {\n                var action = this.id.substring( 0, this.id.lastIndexOf( \'_add_button\' ) )\n                var in_select = \'#\' + action + \'_in_select\';\n                var out_select = \'#\' + action + \'_out_select\';\n                return !$( out_select + \' option:selected\' ).remove().appendTo( in_select );\n            });\n            $( \'.role_remove_button\' ).click( function() {\n                var action = this.id.substring( 0, this.id.lastIndexOf( \'_remove_button\' ) )\n                var in_select = \'#\' + action + \'_in_select\';\n                var out_select = \'#\' + action + \'_out_select\';\n                return !$( in_select + \' option:selected\' ).remove().appendTo( out_select );\n            });\n            $( \'form#edit_role_associations\' ).submit( function() {\n                $( \'.in_select option\' ).each(function( i ) {\n                    $( this ).attr( "selected", "selected" );\n                });\n            });\n        });\n    </script>\n    <div class="toolForm">\n        <div class="toolFormTitle">Manage ')
+        # SOURCE LINE 105
+        __M_writer(unicode(obj_type))
+        __M_writer(u' permissions on ')
+        __M_writer(unicode(obj_str))
+        __M_writer(u'</div>\n        <div class="toolFormBody">\n            <form name="edit_role_associations" id="edit_role_associations" action="')
+        # SOURCE LINE 107
+        __M_writer(unicode(form_url))
+        __M_writer(u'" method="post">\n                <div class="form-row"></div>\n')
+        # SOURCE LINE 109
+        for k, v in permitted_actions:
+            # SOURCE LINE 110
+            if k not in do_not_render:
+                # SOURCE LINE 111
+                __M_writer(u'                        <div class="form-row">\n                            ')
+                # SOURCE LINE 112
+                __M_writer(unicode(render_select( current_actions, k, v, all_roles )))
+                __M_writer(u'\n                        </div>\n')
+        # SOURCE LINE 116
+        __M_writer(u'                <div class="form-row">\n                    <input type="submit" name="update_roles_button" value="Save"/>\n                </div>\n            </form>\n        </div>\n    </div>\n    <p/>\n')
+        return ''
+    finally:
+        context.caller_stack._pop_frame()
+
+
+def render_render_select(context,current_actions,action_key,action,all_roles):
+    context.caller_stack._push_frame()
+    try:
+        filter = context.get('filter', UNDEFINED)
+        x = context.get('x', UNDEFINED)
+        trans = context.get('trans', UNDEFINED)
+        __M_writer = context.writer()
+        # SOURCE LINE 1
+        __M_writer(u'\n    ')
+        # SOURCE LINE 2
+
+        import sets
+        in_roles = sets.Set()
+        for a in current_actions:
+            if a.action == action.action:
+                in_roles.add( a.role )
+        out_roles = filter( lambda x: x not in in_roles, all_roles )
+            
+        
+        # SOURCE LINE 9
+        __M_writer(u'\n    <p>\n        <b>')
+        # SOURCE LINE 11
+        __M_writer(unicode(action.action))
+        __M_writer(u':</b> ')
+        __M_writer(unicode(action.description))
+        __M_writer(u'\n')
+        # SOURCE LINE 12
+        if action == trans.app.security_agent.permitted_actions.DATASET_ACCESS:
+            # SOURCE LINE 13
+            __M_writer(u'            <br/>\n            NOTE: Users must have every role associated with this dataset in order to access it\n')
+        # SOURCE LINE 16
+        __M_writer(u'    </p>\n    <div style="width: 100%; white-space: nowrap;">\n        <div style="float: left; width: 50%;">\n            Roles associated:<br/>\n            <select name="')
+        # SOURCE LINE 20
+        __M_writer(unicode(action_key))
+        __M_writer(u'_in" id="')
+        __M_writer(unicode(action_key))
+        __M_writer(u'_in_select" class="in_select" style="max-width: 98%; width: 98%; height: 150px; font-size: 100%;" multiple>\n')
+        # SOURCE LINE 21
+        for role in in_roles:
+            # SOURCE LINE 22
+            __M_writer(u'                    <option value="')
+            __M_writer(unicode(role.id))
+            __M_writer(u'">')
+            __M_writer(unicode(role.name))
+            __M_writer(u'</option>\n')
+        # SOURCE LINE 24
+        __M_writer(u'            </select> <br/>\n            <div style="width: 98%; text-align: right"><input type="submit" id="')
+        # SOURCE LINE 25
+        __M_writer(unicode(action_key))
+        __M_writer(u'_remove_button" class="role_remove_button" value=">>"/></div>\n        </div>\n        <div style="width: 50%;">\n            Roles not associated:<br/>\n            <select name="')
+        # SOURCE LINE 29
+        __M_writer(unicode(action_key))
+        __M_writer(u'_out" id="')
+        __M_writer(unicode(action_key))
+        __M_writer(u'_out_select" style="max-width: 98%; width: 98%; height: 150px; font-size: 100%;" multiple>\n')
+        # SOURCE LINE 30
+        for role in out_roles:
+            # SOURCE LINE 31
+            __M_writer(u'                    <option value="')
+            __M_writer(unicode(role.id))
+            __M_writer(u'">')
+            __M_writer(unicode(role.name))
+            __M_writer(u'</option>\n')
+        # SOURCE LINE 33
+        __M_writer(u'            </select> <br/>\n            <input type="submit" id="')
+        # SOURCE LINE 34
+        __M_writer(unicode(action_key))
+        __M_writer(u'_add_button" class="role_add_button" value="<<"/>\n        </div>\n    </div>\n')
+        return ''
+    finally:
+        context.caller_stack._pop_frame()
+
+
Index: /galaxy-central/database/compiled_templates/tagging_common.mako.py
===================================================================
--- /galaxy-central/database/compiled_templates/tagging_common.mako.py (revision 3)
+++ /galaxy-central/database/compiled_templates/tagging_common.mako.py (revision 3)
@@ -0,0 +1,311 @@
+from mako import runtime, filters, cache
+UNDEFINED = runtime.UNDEFINED
+__M_dict_builtin = dict
+__M_locals_builtin = locals
+_magic_number = 5
+_modified_time = 1287725327.3571129
+_template_filename=u'templates/tagging_common.mako'
+_template_uri=u'root/../tagging_common.mako'
+_template_cache=cache.Cache(__name__, _modified_time)
+_source_encoding=None
+_exports = ['render_tagging_element_html', 'render_individual_tagging_element', 'render_community_tagging_element']
+
+
+# SOURCE LINE 1
+ 
+from cgi import escape 
+from galaxy.web.framework.helpers import iff
+from random import random
+from sys import maxint
+from math import floor
+from galaxy.model import Tag, ItemTagAssociation
+
+
+def render_body(context,**pageargs):
+    context.caller_stack._push_frame()
+    try:
+        __M_locals = __M_dict_builtin(pageargs=pageargs)
+        in_form = context.get('in_form', UNDEFINED)
+        def render_community_tagging_element(tagged_item=None,elt_context=None,use_toggle_link=False,tag_click_fn='default_tag_click_fn'):
+            return render_render_community_tagging_element(context.locals_(__M_locals),tagged_item,elt_context,use_toggle_link,tag_click_fn)
+        elt_context = context.get('elt_context', UNDEFINED)
+        use_toggle_link = context.get('use_toggle_link', UNDEFINED)
+        user = context.get('user', UNDEFINED)
+        def render_individual_tagging_element(user=None,tagged_item=None,elt_context=None,use_toggle_link=True,in_form=False,input_size='15',tag_click_fn='default_tag_click_fn',get_toggle_link_text_fn='default_get_toggle_link_text_fn',editable=True,render_add_tag_button=True):
+            return render_render_individual_tagging_element(context.locals_(__M_locals),user,tagged_item,elt_context,use_toggle_link,in_form,input_size,tag_click_fn,get_toggle_link_text_fn,editable,render_add_tag_button)
+        tag_click_fn = context.get('tag_click_fn', UNDEFINED)
+        input_size = context.get('input_size', UNDEFINED)
+        tagged_item = context.get('tagged_item', UNDEFINED)
+        tag_type = context.get('tag_type', UNDEFINED)
+        __M_writer = context.writer()
+        # SOURCE LINE 8
+        __M_writer(u'\n\n')
+        # SOURCE LINE 11
+        if tagged_item is not None:
+            # SOURCE LINE 12
+            if tag_type == "individual":
+                # SOURCE LINE 13
+                __M_writer(u'        ')
+                __M_writer(unicode(render_individual_tagging_element( user=user, tagged_item=tagged_item, elt_context=elt_context, in_form=in_form, input_size=input_size, tag_click_fn=tag_click_fn, use_toggle_link=use_toggle_link )))
+                __M_writer(u'\n')
+                # SOURCE LINE 14
+            elif tag_type == "community":
+                # SOURCE LINE 15
+                __M_writer(u'        ')
+                __M_writer(unicode(render_community_tagging_element(tagged_item=tagged_item, elt_context=elt_context, tag_click_fn=tag_click_fn)))
+                __M_writer(u'\n')
+        # SOURCE LINE 18
+        __M_writer(u'\n')
+        # SOURCE LINE 85
+        __M_writer(u'\n\n')
+        # SOURCE LINE 103
+        __M_writer(u'\n\n\n')
+        return ''
+    finally:
+        context.caller_stack._pop_frame()
+
+
+def render_render_tagging_element_html(context,elt_id=None,tags=None,editable=True,use_toggle_link=True,input_size='15',in_form=False,tag_type='individual',render_add_tag_button=True):
+    context.caller_stack._push_frame()
+    try:
+        h = context.get('h', UNDEFINED)
+        unicode = context.get('unicode', UNDEFINED)
+        isinstance = context.get('isinstance', UNDEFINED)
+        len = context.get('len', UNDEFINED)
+        str = context.get('str', UNDEFINED)
+        __M_writer = context.writer()
+        # SOURCE LINE 20
+        __M_writer(u'\n')
+        # SOURCE LINE 22
+        __M_writer(u'    ')
+ 
+        num_tags = len( tags )
+            
+        
+        # SOURCE LINE 24
+        __M_writer(u'\n    <div class="tag-element"\n')
+        # SOURCE LINE 26
+        if elt_id:
+            # SOURCE LINE 27
+            __M_writer(u'            id="')
+            __M_writer(unicode(elt_id))
+            __M_writer(u'"\n')
+        # SOURCE LINE 30
+        if num_tags == 0 and not editable:
+            # SOURCE LINE 31
+            __M_writer(u'            style="display: none"\n')
+        # SOURCE LINE 33
+        __M_writer(u'    >\n')
+        # SOURCE LINE 34
+        if use_toggle_link:
+            # SOURCE LINE 35
+            __M_writer(u'            <a class="toggle-link" href="#">')
+            __M_writer(unicode(num_tags))
+            __M_writer(u' Tag')
+            __M_writer(unicode(iff( num_tags == 1, "", "s")))
+            __M_writer(u'</a>\n')
+        # SOURCE LINE 37
+        __M_writer(u'        <div class="tag-area \n')
+        # SOURCE LINE 38
+        if tag_type == 'individual':
+            # SOURCE LINE 39
+            __M_writer(u'                individual-tag-area\n')
+        # SOURCE LINE 41
+        __M_writer(u'        ">\n\n')
+        # SOURCE LINE 44
+        for tag in tags:
+            # SOURCE LINE 45
+            __M_writer(u'                ')
+
+                    ## Handle both Tag and ItemTagAssociation objects.
+            if isinstance( tag, Tag ):
+                tag_name = tag.name
+                tag_value = None
+            elif isinstance( tag, ItemTagAssociation ):
+                tag_name = tag.user_tname
+                tag_value = tag.user_value
+            ## Convert tag name, value to unicode.
+            if isinstance( tag_name, str ):
+                tag_name = unicode( escape( tag_name ), 'utf-8' )
+                if tag_value:
+                    tag_value = unicode( escape( tag_value ), 'utf-8' )
+            if tag_value:
+                tag_str = tag_name + ":" + tag_value
+            else:
+                tag_str = tag_name
+                            
+            
+            # SOURCE LINE 62
+            __M_writer(u'\n                <span class="tag-button">\n                    <span class="tag-name">')
+            # SOURCE LINE 64
+            __M_writer(unicode(tag_str))
+            __M_writer(u'</span>\n')
+            # SOURCE LINE 65
+            if editable:
+                # SOURCE LINE 66
+                __M_writer(u'                        <img class="delete-tag-img" src="')
+                __M_writer(unicode(h.url_for('/static/images/delete_tag_icon_gray.png')))
+                __M_writer(u'"/>\n')
+            # SOURCE LINE 68
+            __M_writer(u'                </span>\n')
+        # SOURCE LINE 70
+        __M_writer(u'            \n')
+        # SOURCE LINE 72
+        if editable:
+            # SOURCE LINE 73
+            if in_form:
+                # SOURCE LINE 74
+                __M_writer(u'                    <textarea class="tag-input" rows=\'1\' cols=\'')
+                __M_writer(unicode(input_size))
+                __M_writer(u"'></textarea>\n")
+                # SOURCE LINE 75
+            else:
+                # SOURCE LINE 76
+                __M_writer(u'                    <input class="tag-input" type=\'text\' size=\'')
+                __M_writer(unicode(input_size))
+                __M_writer(u"'/>\n")
+            # SOURCE LINE 79
+            if render_add_tag_button:
+                # SOURCE LINE 80
+                __M_writer(u"                    <img src='")
+                __M_writer(unicode(h.url_for('/static/images/fugue/tag--plus.png')))
+                __M_writer(u'\' class="add-tag-button tooltip" title="Add tags"/>\n')
+        # SOURCE LINE 83
+        __M_writer(u'        </div>\n    </div>\n')
+        return ''
+    finally:
+        context.caller_stack._pop_frame()
+
+
+def render_render_individual_tagging_element(context,user=None,tagged_item=None,elt_context=None,use_toggle_link=True,in_form=False,input_size='15',tag_click_fn='default_tag_click_fn',get_toggle_link_text_fn='default_get_toggle_link_text_fn',editable=True,render_add_tag_button=True):
+    context.caller_stack._push_frame()
+    try:
+        isinstance = context.get('isinstance', UNDEFINED)
+        unicode = context.get('unicode', UNDEFINED)
+        int = context.get('int', UNDEFINED)
+        h = context.get('h', UNDEFINED)
+        self = context.get('self', UNDEFINED)
+        dict = context.get('dict', UNDEFINED)
+        str = context.get('str', UNDEFINED)
+        trans = context.get('trans', UNDEFINED)
+        __M_writer = context.writer()
+        # SOURCE LINE 107
+        __M_writer(u'\n')
+        # SOURCE LINE 109
+        __M_writer(u'    ')
+
+        # Useful ids.
+        tagged_item_id = str( trans.security.encode_id ( tagged_item.id ) )
+        elt_id = int ( floor ( random()*maxint ) )
+        
+        # Get list of user's item tags. TODO: this could be moved to a database query for speed purposes.
+        item_tags = [ tag for tag in tagged_item.tags if ( tag.user == user ) ]
+            
+        
+        # SOURCE LINE 116
+        __M_writer(u'\n    \n')
+        # SOURCE LINE 119
+        __M_writer(u'    ')
+        __M_writer(unicode(self.render_tagging_element_html(elt_id=elt_id, tags=item_tags, editable=editable, use_toggle_link=use_toggle_link, input_size=input_size, in_form=in_form, render_add_tag_button=render_add_tag_button)))
+        __M_writer(u'\n    \n')
+        # SOURCE LINE 122
+        __M_writer(u'    <script type="text/javascript">\n        //\n        // Set up autocomplete tagger.\n        //\n\n        //\n        // Default function get text to display on the toggle link.\n        //\n        var default_get_toggle_link_text_fn = function(tags)\n        {\n            var text = "";\n            var num_tags = obj_length(tags);\n            if (num_tags != 0)\n              {\n                text = num_tags + (num_tags != 1 ? " Tags" : " Tag");\n                /*\n                // Show first N tags; hide the rest.\n                var max_to_show = 1;\n    \n                // Build tag string.\n                var tag_strs = new Array();\n                var count = 0;\n                for (tag_name in tags)\n                  {\n                    tag_value = tags[tag_name];\n                    tag_strs[tag_strs.length] = build_tag_str(tag_name, tag_value);\n                    if (++count == max_to_show)\n                      break;\n                  }\n                tag_str = tag_strs.join(", ");\n            \n                // Finalize text.\n                var num_tags_hiding = num_tags - max_to_show;\n                text = "Tags: " + tag_str + \n                  (num_tags_hiding != 0 ? " and " + num_tags_hiding + " more" : "");\n                */\n              }\n            else\n              {\n                // No tags.\n                text = "Add tags";\n              }\n            return text;\n        };\n        \n        // Default function to handle a tag click.\n        var default_tag_click_fn = function(tag_name, tag_value) { };\n        \n        ')
+        # SOURCE LINE 170
+
+            ## Build dict of tag name, values.
+        tag_names_and_values = dict()
+        for tag in item_tags:
+            tag_name = tag.user_tname
+            tag_value = ""
+            if tag.value is not None:
+                tag_value = tag.user_value
+            ## Tag names and values may be string or unicode object.
+            if isinstance( tag_name, str ):
+                tag_names_and_values[unicode(tag_name, 'utf-8')] = unicode(tag_value, 'utf-8')
+            else: ## isInstance( tag_name, unicode ):
+                tag_names_and_values[tag_name] = tag_value
+                
+        
+        # SOURCE LINE 183
+        __M_writer(u'\n        var options =\n        {\n            tags : ')
+        # SOURCE LINE 186
+        __M_writer(unicode(h.to_json_string(tag_names_and_values)))
+        __M_writer(u',\n            editable : ')
+        # SOURCE LINE 187
+        __M_writer(unicode(iff( editable, 'true', 'false' )))
+        __M_writer(u',\n            get_toggle_link_text_fn: ')
+        # SOURCE LINE 188
+        __M_writer(unicode(get_toggle_link_text_fn))
+        __M_writer(u',\n            tag_click_fn: ')
+        # SOURCE LINE 189
+        __M_writer(unicode(tag_click_fn))
+        __M_writer(u',\n')
+        # SOURCE LINE 191
+        __M_writer(u'            ajax_autocomplete_tag_url: "')
+        __M_writer(unicode(h.url_for( controller='/tag', action='tag_autocomplete_data', item_id=tagged_item_id, item_class=tagged_item.__class__.__name__ )))
+        __M_writer(u'",\n            ajax_add_tag_url: "')
+        # SOURCE LINE 192
+        __M_writer(unicode(h.url_for( controller='/tag', action='add_tag_async', item_id=tagged_item_id, item_class=tagged_item.__class__.__name__, context=elt_context )))
+        __M_writer(u'",\n            ajax_delete_tag_url: "')
+        # SOURCE LINE 193
+        __M_writer(unicode(h.url_for( controller='/tag', action='remove_tag_async', item_id=tagged_item_id, item_class=tagged_item.__class__.__name__, context=elt_context )))
+        __M_writer(u'",\n            delete_tag_img: "')
+        # SOURCE LINE 194
+        __M_writer(unicode(h.url_for('/static/images/delete_tag_icon_gray.png')))
+        __M_writer(u'",\n            delete_tag_img_rollover: "')
+        # SOURCE LINE 195
+        __M_writer(unicode(h.url_for('/static/images/delete_tag_icon_white.png')))
+        __M_writer(u'",\n            use_toggle_link: ')
+        # SOURCE LINE 196
+        __M_writer(unicode(iff( use_toggle_link, 'true', 'false' )))
+        __M_writer(u"\n         };\n         \n        $('#")
+        # SOURCE LINE 199
+        __M_writer(unicode(elt_id))
+        __M_writer(u"').autocomplete_tagging(options);\n    </script>\n    \n")
+        # SOURCE LINE 203
+        __M_writer(u'    <style>\n    .tag-area {\n        display: ')
+        # SOURCE LINE 205
+        __M_writer(unicode(iff( use_toggle_link, "none", "block" )))
+        __M_writer(u';\n    }\n    </style>\n\n    <noscript>\n    <style>\n    .tag-area {\n        display: block;\n    }\n    </style>\n    </noscript>\n')
+        return ''
+    finally:
+        context.caller_stack._pop_frame()
+
+
+def render_render_community_tagging_element(context,tagged_item=None,elt_context=None,use_toggle_link=False,tag_click_fn='default_tag_click_fn'):
+    context.caller_stack._push_frame()
+    try:
+        int = context.get('int', UNDEFINED)
+        self = context.get('self', UNDEFINED)
+        trans = context.get('trans', UNDEFINED)
+        __M_writer = context.writer()
+        # SOURCE LINE 88
+        __M_writer(u'\n')
+        # SOURCE LINE 90
+        __M_writer(u'    ')
+ 
+        elt_id = int ( floor ( random()*maxint ) ) 
+        community_tags = trans.app.tag_handler.get_community_tags( trans, item=tagged_item, limit=5 )
+            
+        
+        # SOURCE LINE 93
+        __M_writer(u'\n    ')
+        # SOURCE LINE 94
+        __M_writer(unicode(self.render_tagging_element_html(elt_id=elt_id, \
+                                        tags=community_tags, \
+                                        use_toggle_link=use_toggle_link, \
+                                        editable=False, tag_type="community")))
+        # SOURCE LINE 97
+        __M_writer(u'\n    \n')
+        # SOURCE LINE 100
+        __M_writer(u'    <script type="text/javascript">\n        init_tag_click_function($(\'#')
+        # SOURCE LINE 101
+        __M_writer(unicode(elt_id))
+        __M_writer(u"'), ")
+        __M_writer(unicode(tag_click_fn))
+        __M_writer(u');\n    </script>\n')
+        return ''
+    finally:
+        context.caller_stack._pop_frame()
+
+
Index: /galaxy-central/database/compiled_templates/base.mako.py
===================================================================
--- /galaxy-central/database/compiled_templates/base.mako.py (revision 3)
+++ /galaxy-central/database/compiled_templates/base.mako.py (revision 3)
@@ -0,0 +1,103 @@
+from mako import runtime, filters, cache
+UNDEFINED = runtime.UNDEFINED
+__M_dict_builtin = dict
+__M_locals_builtin = locals
+_magic_number = 5
+_modified_time = 1287725818.353277
+_template_filename='templates/base.mako'
+_template_uri='/base.mako'
+_template_cache=cache.Cache(__name__, _modified_time)
+_source_encoding=None
+_exports = ['stylesheets', 'javascripts', 'metas', 'title']
+
+
+def render_body(context,**pageargs):
+    context.caller_stack._push_frame()
+    try:
+        __M_locals = __M_dict_builtin(pageargs=pageargs)
+        self = context.get('self', UNDEFINED)
+        next = context.get('next', UNDEFINED)
+        n_ = context.get('n_', UNDEFINED)
+        __M_writer = context.writer()
+        # SOURCE LINE 1
+        _=n_ 
+        
+        __M_locals.update(__M_dict_builtin([(__M_key, __M_locals_builtin()[__M_key]) for __M_key in ['_'] if __M_key in __M_locals_builtin()]))
+        __M_writer(u'\n<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">\n<html>\n\n<head>\n<title>')
+        # SOURCE LINE 6
+        __M_writer(unicode(self.title()))
+        __M_writer(u'</title>\n<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />\n')
+        # SOURCE LINE 8
+        __M_writer(unicode(self.metas()))
+        __M_writer(u'\n')
+        # SOURCE LINE 9
+        __M_writer(unicode(self.stylesheets()))
+        __M_writer(u'\n')
+        # SOURCE LINE 10
+        __M_writer(unicode(self.javascripts()))
+        __M_writer(u'\n</head>\n\n    <body>\n        ')
+        # SOURCE LINE 14
+        __M_writer(unicode(next.body()))
+        __M_writer(u'\n    </body>\n</html>\n\n')
+        # SOURCE LINE 19
+        __M_writer(u'\n\n')
+        # SOURCE LINE 24
+        __M_writer(u'\n\n')
+        # SOURCE LINE 32
+        __M_writer(u'\n\n')
+        # SOURCE LINE 35
+        __M_writer(u'\n')
+        return ''
+    finally:
+        context.caller_stack._pop_frame()
+
+
+def render_stylesheets(context):
+    context.caller_stack._push_frame()
+    try:
+        h = context.get('h', UNDEFINED)
+        __M_writer = context.writer()
+        # SOURCE LINE 22
+        __M_writer(u'\n    ')
+        # SOURCE LINE 23
+        __M_writer(unicode(h.css('base')))
+        __M_writer(u'\n')
+        return ''
+    finally:
+        context.caller_stack._pop_frame()
+
+
+def render_javascripts(context):
+    context.caller_stack._push_frame()
+    try:
+        h = context.get('h', UNDEFINED)
+        __M_writer = context.writer()
+        # SOURCE LINE 27
+        __M_writer(u'\n')
+        # SOURCE LINE 31
+        __M_writer(u'  ')
+        __M_writer(unicode(h.js( "jquery", "galaxy.base" )))
+        __M_writer(u'\n')
+        return ''
+    finally:
+        context.caller_stack._pop_frame()
+
+
+def render_metas(context):
+    context.caller_stack._push_frame()
+    try:
+        __M_writer = context.writer()
+        return ''
+    finally:
+        context.caller_stack._pop_frame()
+
+
+def render_title(context):
+    context.caller_stack._push_frame()
+    try:
+        __M_writer = context.writer()
+        return ''
+    finally:
+        context.caller_stack._pop_frame()
+
+
Index: /galaxy-central/database/compiled_templates/base_panels.mako.py
===================================================================
--- /galaxy-central/database/compiled_templates/base_panels.mako.py (revision 3)
+++ /galaxy-central/database/compiled_templates/base_panels.mako.py (revision 3)
@@ -0,0 +1,285 @@
+from mako import runtime, filters, cache
+UNDEFINED = runtime.UNDEFINED
+__M_dict_builtin = dict
+__M_locals_builtin = locals
+_magic_number = 5
+_modified_time = 1287725326.8172879
+_template_filename=u'templates/base_panels.mako'
+_template_uri=u'/base_panels.mako'
+_template_cache=cache.Cache(__name__, _modified_time)
+_source_encoding=None
+_exports = ['message_box_content', 'overlay', 'late_javascripts', 'stylesheets', 'init', 'masthead', 'javascripts']
+
+
+def render_body(context,**pageargs):
+    context.caller_stack._push_frame()
+    try:
+        __M_locals = __M_dict_builtin(pageargs=pageargs)
+        self = context.get('self', UNDEFINED)
+        __M_writer = context.writer()
+        # SOURCE LINE 2
+        __M_writer(u'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">\n\n')
+        # SOURCE LINE 4
+
+        self.has_left_panel=True
+        self.has_right_panel=True
+        self.message_box_visible=False
+        self.overlay_visible=False
+        self.message_box_class=""
+        self.active_view=None
+        self.body_class=""
+        
+        
+        # SOURCE LINE 12
+        __M_writer(u'\n    \n')
+        # SOURCE LINE 16
+        __M_writer(u'\n\n')
+        # SOURCE LINE 37
+        __M_writer(u'\n\n')
+        # SOURCE LINE 48
+        __M_writer(u'\n\n')
+        # SOURCE LINE 151
+        __M_writer(u'\n\n')
+        # SOURCE LINE 156
+        __M_writer(u'\n\n')
+        # SOURCE LINE 191
+        __M_writer(u'\n\n')
+        # SOURCE LINE 195
+        __M_writer(u'\n\n')
+        # SOURCE LINE 198
+        __M_writer(u'<html>\n    ')
+        # SOURCE LINE 199
+        __M_writer(unicode(self.init()))
+        __M_writer(u'    \n    <head>\n    <title>')
+        # SOURCE LINE 201
+        __M_writer(unicode(self.title()))
+        __M_writer(u'</title>\n    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />\n    ')
+        # SOURCE LINE 203
+        __M_writer(unicode(self.stylesheets()))
+        __M_writer(u'\n    ')
+        # SOURCE LINE 204
+        __M_writer(unicode(self.javascripts()))
+        __M_writer(u'\n    </head>\n    \n    <body scroll="no" class="')
+        # SOURCE LINE 207
+        __M_writer(unicode(self.body_class))
+        __M_writer(u'">\n\t<div id="everything" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; min-width: 600px;">\n')
+        # SOURCE LINE 210
+        __M_writer(u'        <div id="background"></div>\n')
+        # SOURCE LINE 212
+        __M_writer(u'        <div id="masthead">\n            ')
+        # SOURCE LINE 213
+        __M_writer(unicode(self.masthead()))
+        __M_writer(u'\n        </div>\n        <div id="messagebox" class="panel-')
+        # SOURCE LINE 215
+        __M_writer(unicode(self.message_box_class))
+        __M_writer(u'-message">\n')
+        # SOURCE LINE 216
+        if self.message_box_visible:
+            # SOURCE LINE 217
+            __M_writer(u'                ')
+            __M_writer(unicode(self.message_box_content()))
+            __M_writer(u'\n')
+        # SOURCE LINE 219
+        __M_writer(u'        </div>\n    ')
+        # SOURCE LINE 220
+        __M_writer(unicode(self.overlay()))
+        __M_writer(u'\n')
+        # SOURCE LINE 221
+        if self.has_left_panel:
+            # SOURCE LINE 222
+            __M_writer(u'            <div id="left">\n                ')
+            # SOURCE LINE 223
+            __M_writer(unicode(self.left_panel()))
+            __M_writer(u'\n            </div>\n            <div id="left-border">\n                <div id="left-border-inner" style="display: none;"></div>\n            </div>\n')
+        # SOURCE LINE 229
+        __M_writer(u'        <div id="center">\n            ')
+        # SOURCE LINE 230
+        __M_writer(unicode(self.center_panel()))
+        __M_writer(u'\n        </div>\n')
+        # SOURCE LINE 232
+        if self.has_right_panel:
+            # SOURCE LINE 233
+            __M_writer(u'            <div id="right-border"><div id="right-border-inner" style="display: none;"></div></div>\n            <div id="right">\n                ')
+            # SOURCE LINE 235
+            __M_writer(unicode(self.right_panel()))
+            __M_writer(u'\n            </div>\n')
+        # SOURCE LINE 238
+        __M_writer(u'\t</div>\n')
+        # SOURCE LINE 240
+        __M_writer(u'    </body>\n')
+        # SOURCE LINE 243
+        __M_writer(u'    ')
+        __M_writer(unicode(self.late_javascripts()))
+        __M_writer(u'\n</html>\n')
+        return ''
+    finally:
+        context.caller_stack._pop_frame()
+
+
+def render_message_box_content(context):
+    context.caller_stack._push_frame()
+    try:
+        __M_writer = context.writer()
+        # SOURCE LINE 194
+        __M_writer(u'\n')
+        return ''
+    finally:
+        context.caller_stack._pop_frame()
+
+
+def render_overlay(context,title='',content=''):
+    context.caller_stack._push_frame()
+    try:
+        self = context.get('self', UNDEFINED)
+        __M_writer = context.writer()
+        # SOURCE LINE 158
+        __M_writer(u'\n    ')
+        # SOURCE LINE 159
+        __M_writer(u'\n    ')
+        # SOURCE LINE 160
+        __M_writer(u'\n\n    <div id="overlay"\n')
+        # SOURCE LINE 163
+        if not self.overlay_visible:
+            # SOURCE LINE 164
+            __M_writer(u'    style="display: none;"\n')
+        # SOURCE LINE 166
+        __M_writer(u'    >\n')
+        # SOURCE LINE 168
+        __M_writer(u'    <div id="overlay-background" style="position: absolute; width: 100%; height: 100%;"></div>\n    \n')
+        # SOURCE LINE 171
+        __M_writer(u'    <table class="dialog-box-container" border="0" cellpadding="0" cellspacing="0"\n')
+        # SOURCE LINE 172
+        if not self.overlay_visible:
+            # SOURCE LINE 173
+            __M_writer(u'        style="display: none;"\n')
+        # SOURCE LINE 175
+        __M_writer(u'    ><tr><td>\n    <div class="dialog-box-wrapper">\n        <div class="dialog-box">\n        <div class="unified-panel-header">\n            <div class="unified-panel-header-inner"><span class=\'title\'>')
+        # SOURCE LINE 179
+        __M_writer(unicode(title))
+        __M_writer(u'</span></div>\n        </div>\n        <div class="body">')
+        # SOURCE LINE 181
+        __M_writer(unicode(content))
+        __M_writer(u'</div>\n        <div>\n            <div class="buttons" style="display: none; float: right;"></div>\n            <div class="extra_buttons" style="display: none; padding: 5px;"></div>\n            <div style="clear: both;"></div>\n        </div>\n        </div>\n    </div>\n    </td></tr></table>\n    </div>\n')
+        return ''
+    finally:
+        context.caller_stack._pop_frame()
+
+
+def render_late_javascripts(context):
+    context.caller_stack._push_frame()
+    try:
+        h = context.get('h', UNDEFINED)
+        self = context.get('self', UNDEFINED)
+        __M_writer = context.writer()
+        # SOURCE LINE 51
+        __M_writer(u'\n')
+        # SOURCE LINE 54
+        __M_writer(u'    ')
+        __M_writer(unicode(h.js( 'jquery.event.drag', 'jquery.event.hover', 'jquery.form', 'jquery.rating', 'galaxy.base', 'galaxy.panels' )))
+        __M_writer(u'\n    <script type="text/javascript">\n        \n    ensure_dd_helper();\n        \n')
+        # SOURCE LINE 59
+        if self.has_left_panel:
+            # SOURCE LINE 60
+            __M_writer(u'            var lp = make_left_panel( $("#left"), $("#center"), $("#left-border" ) );\n            force_left_panel = lp.force_panel;\n')
+        # SOURCE LINE 63
+        __M_writer(u'        \n')
+        # SOURCE LINE 64
+        if self.has_right_panel:
+            # SOURCE LINE 65
+            __M_writer(u'            var rp = make_right_panel( $("#right"), $("#center"), $("#right-border" ) );\n            handle_minwidth_hint = rp.handle_minwidth_hint;\n            force_right_panel = rp.force_panel;\n')
+        # SOURCE LINE 69
+        __M_writer(u'    \n    </script>\n')
+        # SOURCE LINE 72
+        __M_writer(u'    <![if !IE]>\n    <script type="text/javascript">\n        var upload_form_error = function( msg ) {\n            if ( ! $("iframe#galaxy_main").contents().find("body").find("div[class=\'errormessage\']").size() ) {\n                $("iframe#galaxy_main").contents().find("body").prepend( \'<div class="errormessage" name="upload_error">\' + msg + \'</div><p/>\' );\n            } else {\n                $("iframe#galaxy_main").contents().find("body").find("div[class=\'errormessage\']").text( msg );\n            }\n        }\n        jQuery( function() {\n            $("iframe#galaxy_main").load( function() {\n                $(this).contents().find("form").each( function() { \n                    if ( $(this).find("input[galaxy-ajax-upload]").length > 0 ){\n                        $(this).submit( function() {\n                            // Only bother using a hidden iframe if there\'s a file (e.g. big data) upload\n                            var file_upload = false;\n                            $(this).find("input[galaxy-ajax-upload]").each( function() {\n                                if ( $(this).val() != \'\' ) {\n                                    file_upload = true;\n                                }\n                            });\n                            if ( ! file_upload ) {\n                                return true;\n                            }\n                            // Make a synchronous request to create the datasets first\n                            var async_datasets;\n                            var upload_error = false;\n                            $.ajax( {\n                                async:      false,\n                                type:       "POST",\n                                url:        "')
+        # SOURCE LINE 102
+        __M_writer(unicode(h.url_for(controller='/tool_runner', action='upload_async_create')))
+        __M_writer(u'",\n                                data:       $(this).formSerialize(),\n                                dataType:   "json",\n                                success:    function(array_obj, status) {\n                                                if (array_obj.length > 0) {\n                                                    if (array_obj[0] == \'error\') {\n                                                        upload_error = true;\n                                                        upload_form_error(array_obj[1]);\n                                                    } else {\n                                                        async_datasets = array_obj.join();\n                                                    }\n                                                } else {\n                                                    // ( gvk 1/22/10 ) FIXME: this block is never entered, so there may be a bug somewhere\n                                                    // I\'ve done some debugging like checking to see if array_obj is undefined, but have not\n                                                    // tracked down the behavior that will result in this block being entered.  I believe the\n                                                    // intent was to have this block entered if the upload button is clicked on the upload\n                                                    // form but no file was selected.\n                                                    upload_error = true;\n                                                    upload_form_error( \'No data was entered in the upload form.  You may choose to upload a file, paste some data directly in the data box, or enter URL(s) to fetch data.\' );\n                                                }\n                                            }\n                            } );\n                            if (upload_error == true) {\n                                return false;\n                            } else {\n                                $(this).find("input[name=async_datasets]").val( async_datasets );\n                                $(this).append("<input type=\'hidden\' name=\'ajax_upload\' value=\'true\'>");\n                            }\n                            // iframe submit is required for nginx (otherwise the encoding is wrong)\n                            $(this).ajaxSubmit( { iframe: true } );\n                            if ( $(this).find("input[name=\'folder_id\']").val() != undefined ) {\n                                var library_id = $(this).find("input[name=\'library_id\']").val();\n                                var show_deleted = $(this).find("input[name=\'show_deleted\']").val();\n                                if ( location.pathname.indexOf( \'admin\' ) != -1 ) {\n                                    $("iframe#galaxy_main").attr("src","')
+        # SOURCE LINE 136
+        __M_writer(unicode(h.url_for( controller='library_common', action='browse_library' )))
+        __M_writer(u'?cntrller=library_admin&id=" + library_id + "&created_ldda_ids=" + async_datasets + "&show_deleted=" + show_deleted);\n                                } else {\n                                    $("iframe#galaxy_main").attr("src","')
+        # SOURCE LINE 138
+        __M_writer(unicode(h.url_for( controller='library_common', action='browse_library' )))
+        __M_writer(u'?cntrller=library&id=" + library_id + "&created_ldda_ids=" + async_datasets + "&show_deleted=" + show_deleted);\n                                }\n                            } else {\n                                $("iframe#galaxy_main").attr("src","')
+        # SOURCE LINE 141
+        __M_writer(unicode(h.url_for(controller='tool_runner', action='upload_async_message')))
+        __M_writer(u'");\n                            }\n                            return false;\n                        });\n                    }\n                });\n            });\n        });\n    </script>\n    <![endif]>\n')
+        return ''
+    finally:
+        context.caller_stack._pop_frame()
+
+
+def render_stylesheets(context):
+    context.caller_stack._push_frame()
+    try:
+        h = context.get('h', UNDEFINED)
+        self = context.get('self', UNDEFINED)
+        __M_writer = context.writer()
+        # SOURCE LINE 19
+        __M_writer(u'\n    ')
+        # SOURCE LINE 20
+        __M_writer(unicode(h.css('base','panel_layout','jquery.rating')))
+        __M_writer(u'\n    <style type="text/css">\n    #center {\n')
+        # SOURCE LINE 23
+        if not self.has_left_panel:
+            # SOURCE LINE 24
+            __M_writer(u'            left: 0;\n')
+        # SOURCE LINE 26
+        if not self.has_right_panel:
+            # SOURCE LINE 27
+            __M_writer(u'            right: 0;\n')
+        # SOURCE LINE 29
+        __M_writer(u'    }\n')
+        # SOURCE LINE 30
+        if self.message_box_visible:
+            # SOURCE LINE 31
+            __M_writer(u'        #left, #left-border, #center, #right-border, #right\n        {\n            top: 64px;\n        }\n')
+        # SOURCE LINE 36
+        __M_writer(u'    </style>\n')
+        return ''
+    finally:
+        context.caller_stack._pop_frame()
+
+
+def render_init(context):
+    context.caller_stack._push_frame()
+    try:
+        __M_writer = context.writer()
+        # SOURCE LINE 14
+        __M_writer(u'\n')
+        return ''
+    finally:
+        context.caller_stack._pop_frame()
+
+
+def render_masthead(context):
+    context.caller_stack._push_frame()
+    try:
+        __M_writer = context.writer()
+        # SOURCE LINE 154
+        __M_writer(u'\n')
+        return ''
+    finally:
+        context.caller_stack._pop_frame()
+
+
+def render_javascripts(context):
+    context.caller_stack._push_frame()
+    try:
+        h = context.get('h', UNDEFINED)
+        __M_writer = context.writer()
+        # SOURCE LINE 40
+        __M_writer(u'\n    <!--[if lt IE 7]>\n    ')
+        # SOURCE LINE 42
+        __M_writer(unicode(h.js( 'IE7', 'ie7-recalc' )))
+        __M_writer(u'\n    <![endif]-->\n    <script type="text/javascript">\n        var image_path = \'')
+        # SOURCE LINE 45
+        __M_writer(unicode(h.url_for("/static/images")))
+        __M_writer(u"';\n    </script>\n    ")
+        # SOURCE LINE 47
+        __M_writer(unicode(h.js( 'jquery' )))
+        __M_writer(u'\n')
+        return ''
+    finally:
+        context.caller_stack._pop_frame()
+
+
Index: /galaxy-central/database/compiled_templates/tool_form.mako.py
===================================================================
--- /galaxy-central/database/compiled_templates/tool_form.mako.py (revision 3)
+++ /galaxy-central/database/compiled_templates/tool_form.mako.py (revision 3)
@@ -0,0 +1,427 @@
+from mako import runtime, filters, cache
+UNDEFINED = runtime.UNDEFINED
+__M_dict_builtin = dict
+__M_locals_builtin = locals
+_magic_number = 5
+_modified_time = 1287725781.101141
+_template_filename='templates/tool_form.mako'
+_template_uri='tool_form.mako'
+_template_cache=cache.Cache(__name__, _modified_time)
+_source_encoding=None
+_exports = ['do_inputs', 'row_for_param']
+
+
+def render_body(context,**pageargs):
+    context.caller_stack._push_frame()
+    try:
+        __M_locals = __M_dict_builtin(pageargs=pageargs)
+        add_frame = context.get('add_frame', UNDEFINED)
+        errors = context.get('errors', UNDEFINED)
+        h = context.get('h', UNDEFINED)
+        tool = context.get('tool', UNDEFINED)
+        def do_inputs(inputs,tool_state,errors,prefix,other_values=None):
+            return render_do_inputs(context.locals_(__M_locals),inputs,tool_state,errors,prefix,other_values)
+        len = context.get('len', UNDEFINED)
+        util = context.get('util', UNDEFINED)
+        unicode = context.get('unicode', UNDEFINED)
+        type = context.get('type', UNDEFINED)
+        tool_state = context.get('tool_state', UNDEFINED)
+        trans = context.get('trans', UNDEFINED)
+        AttributeError = context.get('AttributeError', UNDEFINED)
+        app = context.get('app', UNDEFINED)
+        __M_writer = context.writer()
+        # SOURCE LINE 1
+        __M_writer(u'<!-- -->\n<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">\n\n')
+        # SOURCE LINE 4
+
+        from galaxy.util.expressions import ExpressionContext 
+        
+        
+        __M_locals.update(__M_dict_builtin([(__M_key, __M_locals_builtin()[__M_key]) for __M_key in ['ExpressionContext'] if __M_key in __M_locals_builtin()]))
+        # SOURCE LINE 6
+        __M_writer(u'\n\n<html>\n\n<head>\n<title>Galaxy</title>\n<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />\n')
+        # SOURCE LINE 13
+        __M_writer(unicode(h.css( "base", "autocomplete_tagging" )))
+        __M_writer(u'\n')
+        # SOURCE LINE 14
+        __M_writer(unicode(h.js( "jquery", "galaxy.base", "jquery.autocomplete" )))
+        __M_writer(u'\n<script type="text/javascript">\n$(function() {\n    $(window).bind("refresh_on_change", function() {\n        $(\':file\').each( function() {\n            var file = $(this);\n            var file_value = file.val();\n            if (file_value) {\n                // disable file input, since we don\'t want to upload the file on refresh\n                var file_name = $(this).attr("name");\n                file.attr( { name: \'replaced_file_input_\' + file_name, disabled: true } );\n                // create a new hidden field which stores the filename and has the original name of the file input\n                var new_file_input = $(document.createElement(\'input\'));\n                new_file_input.attr( { "type", "hidden", "value": file_value, "name": file_name } );\n                file.after(new_file_input);\n            }\n        });\n    });\n});\n\n')
+        # SOURCE LINE 34
+        if not add_frame.debug:
+            # SOURCE LINE 35
+            __M_writer(u'    if( window.name != "galaxy_main" ) {\n        location.replace( \'')
+            # SOURCE LINE 36
+            __M_writer(unicode(h.url_for( controller='root', action='index', tool_id=tool.id )))
+            __M_writer(u"' );\n    }\n")
+        # SOURCE LINE 39
+        __M_writer(u'function checkUncheckAll( name, check )\n{\n    if ( check == 0 )\n    {\n        $("input[name=" + name + "][type=\'checkbox\']").attr(\'checked\', false);\n    }\n    else\n    {\n        $("input[name=" + name + "][type=\'checkbox\']").attr(\'checked\', true );\n    }\n}\n\n</script>\n</head>\n\n<body>\n    ')
+        # SOURCE LINE 128
+        __M_writer(u'\n    \n    ')
+        # SOURCE LINE 169
+        __M_writer(u'\n    \n')
+        # SOURCE LINE 171
+        if add_frame.from_noframe:
+            # SOURCE LINE 172
+            __M_writer(u'        <div class="warningmessage">\n        <strong>Welcome to Galaxy</strong>\n        <hr/>\n        It appears that you found this tool from a link outside of Galaxy.\n        If you\'re not familiar with Galaxy, please consider visiting the\n        <a href="')
+            # SOURCE LINE 177
+            __M_writer(unicode(h.url_for( controller='root' )))
+            __M_writer(u'" target="_top">welcome page</a>.\n        To learn more about what Galaxy is and what it can do for you, please visit\n        the <a href="$add_frame.wiki_url" target="_top">Galaxy wiki</a>.\n        </div>\n        <br/>\n')
+        # SOURCE LINE 183
+        __M_writer(u'    \n')
+        # SOURCE LINE 186
+        __M_writer(u'    ')
+
+        try:   
+            tool_url = h.url_for(tool.action)
+        except AttributeError:
+            assert len(tool.action) == 2
+            tool_url = tool.action[0] + h.url_for(tool.action[1])
+            
+        
+        __M_locals.update(__M_dict_builtin([(__M_key, __M_locals_builtin()[__M_key]) for __M_key in ['tool_url'] if __M_key in __M_locals_builtin()]))
+        # SOURCE LINE 192
+        __M_writer(u'<div class="toolForm" id="')
+        __M_writer(unicode(tool.id))
+        __M_writer(u'">\n')
+        # SOURCE LINE 193
+        if tool.has_multiple_pages:
+            # SOURCE LINE 194
+            __M_writer(u'            <div class="toolFormTitle">')
+            __M_writer(unicode(tool.name))
+            __M_writer(u' (step ')
+            __M_writer(unicode(tool_state.page+1))
+            __M_writer(u' of ')
+            __M_writer(unicode(tool.npages))
+            __M_writer(u')</div>\n')
+            # SOURCE LINE 195
+        else:
+            # SOURCE LINE 196
+            __M_writer(u'            <div class="toolFormTitle">')
+            __M_writer(unicode(tool.name))
+            __M_writer(u'</div>\n')
+        # SOURCE LINE 198
+        __M_writer(u'        <div class="toolFormBody">\n            <form id="tool_form" name="tool_form" action="')
+        # SOURCE LINE 199
+        __M_writer(unicode(tool_url))
+        __M_writer(u'" enctype="')
+        __M_writer(unicode(tool.enctype))
+        __M_writer(u'" target="')
+        __M_writer(unicode(tool.target))
+        __M_writer(u'" method="')
+        __M_writer(unicode(tool.method))
+        __M_writer(u'">\n                <input type="hidden" name="tool_id" value="')
+        # SOURCE LINE 200
+        __M_writer(unicode(tool.id))
+        __M_writer(u'">\n                <input type="hidden" name="tool_state" value="')
+        # SOURCE LINE 201
+        __M_writer(unicode(util.object_to_string( tool_state.encode( tool, app ) )))
+        __M_writer(u'">\n')
+        # SOURCE LINE 202
+        if tool.display_by_page[tool_state.page]:
+            # SOURCE LINE 203
+            __M_writer(u'                    ')
+            __M_writer(unicode(trans.fill_template_string( tool.display_by_page[tool_state.page], context=tool.get_param_html_map( trans, tool_state.page, tool_state.inputs ) )))
+            __M_writer(u'\n                    <input type="submit" class="primary-button" name="runtool_btn" value="Execute">\n')
+            # SOURCE LINE 205
+        else:
+            # SOURCE LINE 206
+            __M_writer(u'                    ')
+            __M_writer(unicode(do_inputs( tool.inputs_by_page[ tool_state.page ], tool_state.inputs, errors, "" )))
+            __M_writer(u'\n                    <div class="form-row">\n')
+            # SOURCE LINE 208
+            if tool_state.page == tool.last_page:
+                # SOURCE LINE 209
+                __M_writer(u'                            <input type="submit" class="primary-button" name="runtool_btn" value="Execute">\n')
+                # SOURCE LINE 210
+            else:
+                # SOURCE LINE 211
+                __M_writer(u'                            <input type="submit" class="primary-button" name="runtool_btn" value="Next step">\n')
+            # SOURCE LINE 213
+            __M_writer(u'                    </div>\n')
+        # SOURCE LINE 215
+        __M_writer(u'            </form>\n        </div>\n    </div>\n')
+        # SOURCE LINE 218
+        if tool.help:
+            # SOURCE LINE 219
+            __M_writer(u'        <div class="toolHelp">\n            <div class="toolHelpBody">\n                ')
+            # SOURCE LINE 221
+
+            if tool.has_multiple_pages:
+                tool_help = tool.help_by_page[tool_state.page]
+            else:
+                tool_help = tool.help
+            
+            # Convert to unicode to display non-ascii characters.
+            if type( tool_help ) is not unicode:
+                tool_help = unicode( tool_help, 'utf-8')
+                            
+            
+            __M_locals.update(__M_dict_builtin([(__M_key, __M_locals_builtin()[__M_key]) for __M_key in ['tool_help'] if __M_key in __M_locals_builtin()]))
+            # SOURCE LINE 230
+            __M_writer(u'\n                ')
+            # SOURCE LINE 231
+            __M_writer(unicode(tool_help))
+            __M_writer(u'\n            </div>        \n        </div>\n')
+        # SOURCE LINE 235
+        __M_writer(u'</body>\n\n<script type="text/javascript">\n')
+        # SOURCE LINE 239
+        __M_writer(u"   $( function() {\n       $( 'li > ul' ).each( function( i ) {\n           if ( $( this )[0].className == 'toolParameterExpandableCollapsable' )\n           {\n               var parent_li = $( this ).parent( 'li' );\n               var sub_ul = $( this ).remove();\n               parent_li.find( 'span' ).wrapInner( '<a/>' ).find( 'a' ).click( function() {\n                 sub_ul.toggle();\n                 $( this )[0].innerHTML = ( sub_ul[0].style.display=='none' ) ? '[+]' : '[-]';\n               });\n               parent_li.append( sub_ul );\n           }\n       });\n       $( 'ul ul' ).each( function(i) {\n           if ( $( this )[0].className == 'toolParameterExpandableCollapsable' && this.attributes.getNamedItem( 'default_state' ).value == 'collapsed' )\n           {\n               $( this ).hide();\n           }\n       });\n   });\n\n")
+        # SOURCE LINE 261
+        __M_writer(u'$( function() {\n    $("div.checkUncheckAllPlaceholder").each( function( i ) {\n        $( this )[0].innerHTML = \'<a class="action-button" onclick="checkUncheckAll( \\\'\' + this.attributes.getNamedItem( \'checkbox_name\' ).value + \'\\\', 1 );"><span>Select All</span></a> <a class="action-button" onclick="checkUncheckAll( \\\'\' + this.attributes.getNamedItem( \'checkbox_name\' ).value + \'\\\', 0 );"><span>Unselect All</span></a>\';\n    });\n});\n\n</script>\n\n</html>\n')
+        return ''
+    finally:
+        context.caller_stack._pop_frame()
+
+
+def render_do_inputs(context,inputs,tool_state,errors,prefix,other_values=None):
+    context.caller_stack._push_frame()
+    try:
+        def row_for_param(prefix,param,parent_state,parent_errors,other_values):
+            return render_row_for_param(context,prefix,param,parent_state,parent_errors,other_values)
+        h = context.get('h', UNDEFINED)
+        def do_inputs(inputs,tool_state,errors,prefix,other_values=None):
+            return render_do_inputs(context,inputs,tool_state,errors,prefix,other_values)
+        len = context.get('len', UNDEFINED)
+        range = context.get('range', UNDEFINED)
+        dict = context.get('dict', UNDEFINED)
+        str = context.get('str', UNDEFINED)
+        enumerate = context.get('enumerate', UNDEFINED)
+        trans = context.get('trans', UNDEFINED)
+        ExpressionContext = context.get('ExpressionContext', UNDEFINED)
+        __M_writer = context.writer()
+        # SOURCE LINE 55
+        __M_writer(u'\n      ')
+        # SOURCE LINE 56
+        other_values = ExpressionContext( tool_state, other_values ) 
+        
+        __M_writer(u'\n')
+        # SOURCE LINE 57
+        for input_index, input in enumerate( inputs.itervalues() ):
+            # SOURCE LINE 58
+            if input.type == "repeat":
+                # SOURCE LINE 59
+                __M_writer(u'              <div class="repeat-group">\n                  <div class="form-title-row"><b>')
+                # SOURCE LINE 60
+                __M_writer(unicode(input.title_plural))
+                __M_writer(u'</b></div>\n                  ')
+                # SOURCE LINE 61
+                repeat_state = tool_state[input.name] 
+                
+                __M_writer(u'\n')
+                # SOURCE LINE 62
+                for i in range( len( repeat_state ) ):
+                    # SOURCE LINE 63
+                    __M_writer(u'                    <div class="repeat-group-item">\n                    ')
+                    # SOURCE LINE 64
+
+                    if input.name in errors:
+                        rep_errors = errors[input.name][i]
+                    else:
+                        rep_errors = dict()
+                    index = repeat_state[i]['__index__']
+                    
+                    
+                    # SOURCE LINE 70
+                    __M_writer(u'\n                    <div class="form-title-row"><b>')
+                    # SOURCE LINE 71
+                    __M_writer(unicode(input.title))
+                    __M_writer(u' ')
+                    __M_writer(unicode(i + 1))
+                    __M_writer(u'</b></div>\n                    ')
+                    # SOURCE LINE 72
+                    __M_writer(unicode(do_inputs( input.inputs, repeat_state[i], rep_errors, prefix + input.name + "_" + str(index) + "|", other_values )))
+                    __M_writer(u'\n                    <div class="form-row"><input type="submit" name="')
+                    # SOURCE LINE 73
+                    __M_writer(unicode(prefix))
+                    __M_writer(unicode(input.name))
+                    __M_writer(u'_')
+                    __M_writer(unicode(index))
+                    __M_writer(u'_remove" value="Remove ')
+                    __M_writer(unicode(input.title))
+                    __M_writer(u' ')
+                    __M_writer(unicode(i+1))
+                    __M_writer(u'"></div>\n                    </div>\n')
+                    # SOURCE LINE 75
+                    if rep_errors.has_key( '__index__' ):
+                        # SOURCE LINE 76
+                        __M_writer(u'                        <div><img style="vertical-align: middle;" src="')
+                        __M_writer(unicode(h.url_for('/static/style/error_small.png')))
+                        __M_writer(u'">&nbsp;<span style="vertical-align: middle;">')
+                        __M_writer(unicode(rep_errors['__index__']))
+                        __M_writer(u'</span></div>\n')
+                # SOURCE LINE 79
+                __M_writer(u'                  <div class="form-row"><input type="submit" name="')
+                __M_writer(unicode(prefix))
+                __M_writer(unicode(input.name))
+                __M_writer(u'_add" value="Add new ')
+                __M_writer(unicode(input.title))
+                __M_writer(u'"></div>\n              </div>\n')
+                # SOURCE LINE 81
+            elif input.type == "conditional":
+                # SOURCE LINE 82
+                __M_writer(u'                ')
+
+                group_state = tool_state[input.name]
+                group_errors = errors.get( input.name, {} )
+                current_case = group_state['__current_case__']
+                group_prefix = prefix + input.name + "|"
+                
+                
+                # SOURCE LINE 87
+                __M_writer(u'\n')
+                # SOURCE LINE 88
+                if input.value_ref_in_group:
+                    # SOURCE LINE 89
+                    __M_writer(u'                    ')
+                    __M_writer(unicode(row_for_param( group_prefix, input.test_param, group_state, group_errors, other_values )))
+                    __M_writer(u'\n')
+                # SOURCE LINE 91
+                __M_writer(u'                ')
+                __M_writer(unicode(do_inputs( input.cases[current_case].inputs, group_state, group_errors, group_prefix, other_values )))
+                __M_writer(u'\n')
+                # SOURCE LINE 92
+            elif input.type == "upload_dataset":
+                # SOURCE LINE 93
+                if input.get_datatype( trans, other_values ).composite_type is None: #have non-composite upload appear as before
+                    # SOURCE LINE 94
+                    __M_writer(u'                    ')
+
+                    if input.name in errors:
+                        rep_errors = errors[input.name][0]
+                    else:
+                        rep_errors = dict()
+                    
+                    
+                    # SOURCE LINE 99
+                    __M_writer(u'\n                  ')
+                    # SOURCE LINE 100
+                    __M_writer(unicode(do_inputs( input.inputs, tool_state[input.name][0], rep_errors, prefix + input.name + "_" + str( 0 ) + "|", other_values )))
+                    __M_writer(u'\n')
+                    # SOURCE LINE 101
+                else:
+                    # SOURCE LINE 102
+                    __M_writer(u'                    <div class="repeat-group">\n                        <div class="form-title-row"><b>')
+                    # SOURCE LINE 103
+                    __M_writer(unicode(input.group_title( other_values )))
+                    __M_writer(u'</b></div>\n                        ')
+                    # SOURCE LINE 104
+ 
+                    repeat_state = tool_state[input.name] 
+                    
+                    
+                    # SOURCE LINE 106
+                    __M_writer(u'\n')
+                    # SOURCE LINE 107
+                    for i in range( len( repeat_state ) ):
+                        # SOURCE LINE 108
+                        __M_writer(u'                          <div class="repeat-group-item">\n                          ')
+                        # SOURCE LINE 109
+
+                        if input.name in errors:
+                            rep_errors = errors[input.name][i]
+                        else:
+                            rep_errors = dict()
+                        index = repeat_state[i]['__index__']
+                        
+                        
+                        # SOURCE LINE 115
+                        __M_writer(u'\n                          <div class="form-title-row"><b>File Contents for ')
+                        # SOURCE LINE 116
+                        __M_writer(unicode(input.title_by_index( trans, i, other_values )))
+                        __M_writer(u'</b></div>\n                          ')
+                        # SOURCE LINE 117
+                        __M_writer(unicode(do_inputs( input.inputs, repeat_state[i], rep_errors, prefix + input.name + "_" + str(index) + "|", other_values )))
+                        __M_writer(u'\n')
+                        # SOURCE LINE 119
+                        __M_writer(u'                          </div>\n')
+                    # SOURCE LINE 122
+                    __M_writer(u'                    </div>\n')
+                # SOURCE LINE 124
+            else:
+                # SOURCE LINE 125
+                __M_writer(u'                ')
+                __M_writer(unicode(row_for_param( prefix, input, tool_state, errors, other_values )))
+                __M_writer(u'\n')
+        # SOURCE LINE 128
+        __M_writer(u'    ')
+        return ''
+    finally:
+        context.caller_stack._pop_frame()
+
+
+def render_row_for_param(context,prefix,param,parent_state,parent_errors,other_values):
+    context.caller_stack._push_frame()
+    try:
+        h = context.get('h', UNDEFINED)
+        trans = context.get('trans', UNDEFINED)
+        type = context.get('type', UNDEFINED)
+        unicode = context.get('unicode', UNDEFINED)
+        __M_writer = context.writer()
+        # SOURCE LINE 130
+        __M_writer(u'\n        ')
+        # SOURCE LINE 131
+
+        if parent_errors.has_key( param.name ):
+            cls = "form-row form-row-error"
+        else:
+            cls = "form-row"
+        
+        
+        # SOURCE LINE 136
+        __M_writer(u'\n        <div class="')
+        # SOURCE LINE 137
+        __M_writer(unicode(cls))
+        __M_writer(u'">\n            ')
+        # SOURCE LINE 138
+        label = param.get_label() 
+        
+        __M_writer(u'\n')
+        # SOURCE LINE 139
+        if label:
+            # SOURCE LINE 140
+            __M_writer(u'                <label>\n                    ')
+            # SOURCE LINE 141
+            __M_writer(unicode(label))
+            __M_writer(u':\n                </label>\n')
+        # SOURCE LINE 144
+        __M_writer(u'            ')
+
+        field = param.get_html_field( trans, parent_state[ param.name ], other_values )
+        field.refresh_on_change = param.refresh_on_change
+        
+        # Field may contain characters submitted by user and these characters may be unicode; handle non-ascii characters gracefully.
+        field_html = field.get_html( prefix )
+        if type( field_html ) is not unicode:
+            field_html = unicode( field_html, 'utf-8' )
+                    
+        
+        # SOURCE LINE 152
+        __M_writer(u'\n            <div class="form-row-input">')
+        # SOURCE LINE 153
+        __M_writer(unicode(field_html))
+        __M_writer(u'</div>\n')
+        # SOURCE LINE 154
+        if parent_errors.has_key( param.name ):
+            # SOURCE LINE 155
+            __M_writer(u'            <div class="form-row-error-message">\n                <div><img style="vertical-align: middle;" src="')
+            # SOURCE LINE 156
+            __M_writer(unicode(h.url_for('/static/style/error_small.png')))
+            __M_writer(u'">&nbsp;<span style="vertical-align: middle;">')
+            __M_writer(unicode(parent_errors[param.name]))
+            __M_writer(u'</span></div>\n            </div>\n')
+        # SOURCE LINE 159
+        __M_writer(u'            \n')
+        # SOURCE LINE 160
+        if param.help:
+            # SOURCE LINE 161
+            __M_writer(u'            <div class="toolParamHelp" style="clear: both;">\n                ')
+            # SOURCE LINE 162
+            __M_writer(unicode(param.help))
+            __M_writer(u'\n            </div>\n')
+        # SOURCE LINE 165
+        __M_writer(u'    \n            <div style="clear: both"></div>\n                    \n        </div>\n    ')
+        return ''
+    finally:
+        context.caller_stack._pop_frame()
+
+
Index: /galaxy-central/universe_wsgi.ini
===================================================================
--- /galaxy-central/universe_wsgi.ini (revision 3)
+++ /galaxy-central/universe_wsgi.ini (revision 3)
@@ -0,0 +1,423 @@
+#
+# Galaxy is configured by default to be useable in a single-user development
+# environment.  To tune the application for a multi-user production
+# environment, see the documentation at:
+#
+# http://bitbucket.org/galaxy/galaxy-central/wiki/Config/ProductionServer
+#
+
+# Throughout this sample configuration file, except where stated otherwise,
+# uncommented values override the default if left unset, whereas commented
+# values are set to the default value.
+# examples of many of these options are explained in more detail in the wiki:
+#
+# Config hackers are encouraged to check there before asking for help.
+
+# ---- HTTP Server ----------------------------------------------------------
+
+# Configuration of the internal HTTP server.
+
+[server:main]
+
+# The internal HTTP server to use.  Currently only Paste is provided.  This
+# option is required.
+use = egg:Paste#http
+
+# The port on which to listen.
+#port = 8080
+
+# The address on which to listen.  By default, only listen to localhost (Galaxy
+# will not be accessible over the network).  Use '0.0.0.0' to listen on all
+# available network interfaces.
+#host = 127.0.0.1
+
+# Use a threadpool for the web server instead of creating a thread for each
+# request.
+use_threadpool = True
+
+# Number of threads in the web server thread pool.
+#threadpool_workers = 10
+
+# ---- Filters --------------------------------------------------------------
+
+# Filters sit between Galaxy and the HTTP server.
+
+# These filters are disabled by default.  They can be enabled with
+# 'filter-with' in the [app:main] section below.
+
+# Define the gzip filter.
+[filter:gzip]
+use = egg:Paste#gzip
+
+# Define the proxy-prefix filter.
+[filter:proxy-prefix]
+use = egg:PasteDeploy#prefix
+prefix = /galaxy
+
+# ---- Galaxy ---------------------------------------------------------------
+
+# Configuration of the Galaxy application.
+
+[app:main]
+
+# -- Application and filtering
+
+# The factory for the WSGI application.  This should not be changed.
+paste.app_factory = galaxy.web.buildapp:app_factory
+
+# If not running behind a proxy server, you may want to enable gzip compression
+# to decrease the size of data transferred over the network.  If using a proxy
+# server, please enable gzip compression there instead.
+#filter-with = gzip
+
+# If running behind a proxy server and Galaxy is served from a subdirectory,
+# enable the proxy-prefix filter and set the prefix in the
+# [filter:proxy-prefix] section above.
+#filter-with = proxy-prefix
+
+# If proxy-prefix is enabled and you're running more than one Galaxy instance
+# behind one hostname, you will want to set this to the same path as the prefix
+# in the filter above.  This value becomes the "path" attribute set in the
+# cookie so the cookies from each instance will not clobber each other.
+#cookie_path = None
+
+# -- Database
+
+# By default, Galaxy uses a SQLite database at 'database/universe.sqlite'.  You
+# may use a SQLAlchemy connection string to specify an external database
+# instead.  This string takes many options which are explained in detail in the
+# config file documentation.
+#database_connection = sqlite:///./database/universe.sqlite?isolation_level=IMMEDIATE
+
+# If the server logs errors about not having enough database pool connections,
+# you will want to increase these values, or consider running more Galaxy
+# processes.
+#database_engine_option_pool_size = 5
+#database_engine_option_max_overflow = 10
+
+# If using MySQL and the server logs the error "MySQL server has gone away",
+# you will want to set this to some positive value (7200 should work).
+#database_engine_option_pool_recycle = -1
+
+# If large database query results are causing memory or response time issues in
+# the Galaxy process, leave the result on the server instead.  This option is
+# only available for PostgreSQL and is highly recommended.
+#database_engine_option_server_side_cursors = False
+
+# Create only one connection to the database per thread, to reduce the
+# connection overhead.  Recommended when not using SQLite:
+#database_engine_option_strategy = threadlocal
+
+# -- Files and directories
+
+# Dataset files are stored in this directory.
+#file_path = database/files
+
+# Temporary files are stored in this directory.
+#new_file_path = database/tmp
+
+# Tool config file, defines what tools are available in Galaxy.
+#tool_config_file = tool_conf.xml
+
+# Path to the directory containing the tools defined in the config.
+#tool_path = tools
+
+# Directory where data used by tools is located, see the samples in that
+# directory and the wiki for help:
+# http://bitbucket.org/galaxy/galaxy-central/wiki/DataIntegration
+#tool_data_path = tool-data
+
+# Datatypes config file, defines what data (file) types are available in
+# Galaxy.
+#datatypes_config_file = datatypes_conf.xml
+
+# -- Mail and notification
+
+# Galaxy sends mail for various things: Subscribing users to the mailing list
+# if they request it, emailing password resets, notification from the Galaxy
+# Sample Tracking system, and reporting dataset errors.  To do this, it needs
+# to send mail through an SMTP server, which you may define here.
+#smtp_server = None
+
+# On the user registration form, users may choose to join the mailing list.
+# This is the address of the list they'll be subscribed to.
+#mailing_join_addr = galaxy-user-join@bx.psu.edu
+
+# Datasets in an error state include a link to report the error.  Those reports
+# will be sent to this address.  Error reports are disabled if no address is set.
+#error_email_to = None
+
+# -- Display sites
+
+# Galaxy can display data at various external browsers.  These options specify
+# which browsers should be available.  URLs and builds available at these
+# browsers are defined in the specifield files.
+
+# UCSC browsers: tool-data/shared/ucsc/ucsc_build_sites.txt
+#ucsc_display_sites = main,test,archaea,ucla
+
+# GBrowse servers: tool-data/shared/gbrowse/gbrowse_build_sites.txt
+#gbrowse_display_sites = wormbase,tair,modencode_worm,modencode_fly
+
+# GeneTrack servers: tool-data/shared/genetrack/genetrack_sites.txt
+#genetrack_display_sites = main,test
+
+# -- UI Localization
+
+# Append "/{brand}" to the "Galaxy" text in the masthead.
+#brand = None
+
+# The URL linked by the "Galaxy/brand" text.
+#logo_url = /
+
+# The URL linked by the "Galaxy Wiki" link in the "Help" menu.
+#wiki_url = http://bitbucket.org/galaxy/galaxy-central/wiki
+
+# The URL linked by the "Email comments..." link in the "Help" menu.
+#bugs_email = None
+
+# The URL linked by the "How to Cite..." link in the "Help" menu.
+#citation_url = http://bitbucket.org/galaxy/galaxy-central/wiki/Citations
+
+# Serve static content, which must be enabled if you're not serving it via a
+# proxy server.  These options should be self explanatory and so are not
+# documented individually.  You can use these paths (or ones in the proxy
+# server) to point to your own styles.
+static_enabled = True
+static_cache_time = 360
+static_dir = %(here)s/static/
+static_images_dir = %(here)s/static/images
+static_favicon_dir = %(here)s/static/favicon.ico
+static_scripts_dir = %(here)s/static/scripts/
+static_style_dir = %(here)s/static/june_2007_style/blue
+
+# -- Logging and Debugging
+
+# Verbosity of console log messages.  Acceptable values can be found here:
+# http://docs.python.org/library/logging.html#logging-levels
+#log_level = DEBUG
+
+# Print database operations to the server log (warning, quite verbose!).
+#database_engine_option_echo = False
+
+# Print database pool operations to the server log (warning, quite verbose!).
+#database_engine_option_echo_pool = False
+
+# Turn on logging of application events and some user events to the database.
+#log_events = True
+
+# Turn on logging of user actions to the database. Actions currently logged are
+# grid views, tool searches, and use of "recently" used tools menu.  The
+# log_events and log_actions functionality will eventually be merged.
+#log_actions = True
+
+# Debug enables access to various config options useful for development and
+# debugging: use_lint, use_profile, use_printdebug and use_interactive.  It
+# also causes the files used by PBS/SGE (submission script, output, and error)
+# to remain on disk after the job is complete.  Debug mode is disabled if
+# commented, but is uncommented by default in the sample config.
+debug = True
+
+# Check for WSGI compliance.
+#use_lint = False
+
+# Run the Python profiler on each request.
+#use_profile = False
+
+# Intercept print statements and show them on the returned page.
+#use_printdebug = True
+
+# Enable live debugging in your browser.  This should NEVER be enabled on a
+# public site.  Enabled in the sample config for development.
+use_interactive = True
+
+# Write thread status periodically to 'heartbeat.log',  (careful, uses disk
+# space rapidly!).  Useful to determine why your processes may be consuming a
+# lot of CPU.
+#use_heartbeat = False
+
+# Enable the memory debugging interface (careful, negatively impacts server
+# performance).
+#use_memdump = False
+
+# -- Data Libraries
+
+# These library upload options are described in much more detail in the wiki:
+# http://bitbucket.org/galaxy/galaxy-central/wiki/DataLibraries/UploadingFiles
+
+# Add an option to the library upload form which allows administrators to
+# upload a directory of files.
+#library_import_dir = None
+
+# Add an option to the library upload form which allows authorized
+# non-administrators to upload a directory of files.  The configured directory
+# must contain sub-directories named the same as the non-admin user's Galaxy
+# login ( email ).  The non-admin user is restricted to uploading files or
+# sub-directories of files contained in their directory.
+#user_library_import_dir = None
+
+# Add an option to the admin library upload tool allowing admins to paste
+# filesystem paths to files and directories in a box, and these paths will be
+# added to a library.  Set to True to enable.  Please note the security
+# implication that this will give Galaxy Admins access to anything your Galaxy
+# user has access to.
+#allow_library_path_paste = False
+
+# -- Users and Security
+
+# Galaxy encodes various internal values when these values will be output in
+# some format (for example, in a URL or cookie).  You should set a key to be
+# used by the algorithm that encodes and decodes these values.  It can be any
+# string.  If left unchanged, anyone could construct a cookie that would grant
+# them access to others' sessions.
+#id_secret = USING THE DEFAULT IS NOT SECURE!
+
+# User authentication can be delegated to an upstream proxy server (usually
+# Apache).  The upstream proxy should set a REMOTE_USER header in the request.
+# Enabling remote user disables regular logins.  For more information, see:
+# http://bitbucket.org/galaxy/galaxy-central/wiki/Config/ApacheProxy
+#use_remote_user = False
+
+# If use_remote_user is enabled and your external authentication
+# method just returns bare usernames, set a default mail domain to be appended
+# to usernames, to become your Galaxy usernames (email addresses).
+#remote_user_maildomain = None
+
+# If use_remote_user is enabled, you can set this to a URL that will log your
+# users out.
+#remote_user_logout_href = None
+
+# Administrative users - set this to a comma-separated list of valid Galaxy
+# users (email addresses).  These users will have access to the Admin section
+# of the server, and will have access to create users, groups, roles,
+# libraries, and more.  For more information, see:
+# http://bitbucket.org/galaxy/galaxy-central/wiki/Admin/AdminInterface
+#admin_users = None
+
+# Force everyone to log in (disable anonymous access).
+#require_login = False
+
+# Allow unregistered users to create new accounts (otherwise, they will have to
+# be created by an admin).
+#allow_user_creation = True
+
+# Allow administrators to delete accounts.
+#allow_user_deletion = False
+
+# By default, users' data will be public, but setting this to True will cause
+# it to be private.  Does not affect existing users and data, only ones created
+# after this option is set.  Users may still change their default back to
+# public.
+#new_user_dataset_access_role_default_private = False
+
+# -- Beta features
+
+# Enable Galaxy's built-in visualization module, Trackster.
+#enable_tracks = False
+
+# Enable Galaxy Pages. Pages are custom webpages that include embedded Galaxy items, 
+# such as datasets, histories, workflows, and visualizations; pages are useful for 
+# documenting and sharing multiple analyses or workflows. Pages are created using a 
+# WYSIWYG editor that is very similar to a word processor.
+#enable_pages = False
+
+# Enable the (experimental! beta!) Web API.  Documentation forthcoming.
+#enable_api = False
+
+# -- Job Execution
+
+# If running multiple Galaxy processes, one can be designated as the job
+# runner.  For more information, see:
+# http://bitbucket.org/galaxy/galaxy-central/wiki/Config/WebApplicationScaling
+#enable_job_running = True
+
+# Should jobs be tracked through the database, rather than in memory.
+# Necessary if you're running the load balanced setup.
+#track_jobs_in_database = False
+
+# Enable job recovery (if Galaxy is restarted while cluster jobs are running,
+# it can "recover" them when it starts).  This is not safe to use if you are
+# running more than one Galaxy server using the same database.
+#enable_job_recovery = True
+
+# Setting metadata on job outputs to in a separate process (or if using a
+# cluster, on the cluster).  Thanks to Python's Global Interpreter Lock and the
+# hefty expense that setting metadata incurs, your Galaxy process may become
+# unresponsive when this operation occurs internally.
+#set_metadata_externally = False
+
+# Although it is fairly reliable, setting metadata can occasionally fail.  In
+# these instances, you can choose to retry setting it internally or leave it in
+# a failed state (since retrying internally may cause the Galaxy process to be
+# unresponsive).  If this option is set to False, the user will be given the
+# option to retry externally, or set metadata manually (when possible).
+#retry_metadata_internally = True
+
+# Number of concurrent jobs to run (local job runner)
+#local_job_queue_workers = 5
+
+# Jobs can be killed after a certain amount of execution time.  Format is in
+# hh:mm:ss.  Currently only implemented for PBS.
+#job_walltime = None
+
+# Clustering Galaxy is not a straightforward process and requires some
+# pre-configuration.  See the the wiki before attempting to set any of these
+# options:
+# http://bitbucket.org/galaxy/galaxy-central/wiki/Config/Cluster
+
+# Comma-separated list of job runners to start.  local is always started.  If
+# left commented, no jobs will be run on the cluster, even if a cluster URL is
+# explicitly defined in the [galaxy:tool_runners] section below.  The runners
+# currently available are 'pbs' and 'drmaa'.
+#start_job_runners = None
+
+# The URL for the default runner to use when a tool doesn't explicity define a
+# runner below.
+#default_cluster_job_runner = local:///
+
+# The cluster runners have their own thread pools used to prepare and finish
+# jobs (so that these sometimes lengthy operations do not block normal queue
+# operation).  The value here is the number of worker threads available to each
+# started runner.
+#cluster_job_queue_workers = 3
+
+# These options are only used when using file staging with PBS.
+#pbs_application_server = 
+#pbs_stage_path = 
+#pbs_dataset_server = 
+
+# ---- Tool Job Runners -----------------------------------------------------
+
+# Individual per-tool job runner overrides.  If not listed here, a tool will
+# run with the runner defined with default_cluster_job_runner.
+
+[galaxy:tool_runners]
+
+biomart = local:///
+encode_db1 = local:///
+hbvar = local:///
+microbial_import1 = local:///
+ucsc_table_direct1 = local:///
+ucsc_table_direct_archaea1 = local:///
+ucsc_table_direct_test1 = local:///
+upload1 = local:///
+
+# ---- Galaxy Message Queue -------------------------------------------------
+
+# Galaxy uses AMQ protocol to receive messages from external sources like 
+# bar code scanners. Galaxy has been tested against RabbitMQ AMQP implementation.
+# For Galaxy to receive messages from a message queue the RabbitMQ server has 
+# to be set up with a user account and other parameters listed below. The 'host'
+# and 'port' fields should point to where the RabbitMQ server is running. 
+
+[galaxy_amqp]
+
+#host = 127.0.0.1
+#port = 5672
+#userid = galaxy
+#password = galaxy
+#virtual_host = galaxy_messaging_engine
+#queue = galaxy_queue
+#exchange = galaxy_exchange
+#routing_key = bar_code_scanner
+
Index: /galaxy-central/run_functional_tests.html
===================================================================
--- /galaxy-central/run_functional_tests.html (revision 3)
+++ /galaxy-central/run_functional_tests.html (revision 3)
@@ -0,0 +1,80 @@
+
+<html>
+<head>
+<style>
+
+body
+{
+  font: 12px verdana, "Bitstream Vera Sans", geneva, arial, helvetica, helve, sans-serif;
+  line-height: 160%;
+}
+
+div.test
+{
+  margin: 5px;
+  padding: 5px;
+  border: solid black 1px;
+  background: lightgray;
+}
+
+div.success
+{
+  background: #CCFFCC;
+  border: solid #66AA66 1px;
+}
+
+div.error, div.failure
+{
+  background: #FFCCCC;
+  border: solid #AA6666 1px;
+}
+
+span.label
+{
+  font-weight: bold;
+}
+
+pre
+{
+  background: white;
+  padding: 5px;
+  border:  solid black 1px;
+  display: block;
+  overflow: auto;
+}
+</style>
+
+<script>
+function toggle(name){
+	var elem = document.getElementById(name)
+	if (elem) {
+		if (elem.style.display=="none"){
+			elem.style.display="block"
+		} else {
+			elem.style.display="none"
+		}
+	}
+}
+</script>
+</head>
+<body>
+
+<div class='test error'>
+<div><span class='label'>ID:</span> nose.failure.Failure.runTest</div>
+<div><span class='label'>Status:</span> error</div>
+<div><span class='label'>Exception:</span> <a href="javascript:toggle('exception_1')">...</a></div>
+<div id='exception_1' style='display: none'><pre class='exception'>Traceback (most recent call last):
+
+  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/unittest.py", line 279, in run
+    testMethod()
+
+  File "/Users/mako/Projects/bh2010/galaxy/bh10.10/galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/failure.py", line 39, in runTest
+    raise self.exc_class(self.exc_val)
+
+ValueError: No such test TestForTool_cshl_sed_tool
+</pre></div>
+</div>
+
+</body>
+</html>
+
Index: /galaxy-central/tool_conf.xml
===================================================================
--- /galaxy-central/tool_conf.xml (revision 3)
+++ /galaxy-central/tool_conf.xml (revision 3)
@@ -0,0 +1,506 @@
+<?xml version="1.0"?>
+<toolbox>
+  <section name="Get Data" id="getext">
+    <tool file="data_source/upload.xml"/>
+    <tool file="data_source/ucsc_tablebrowser.xml" />
+    <tool file="data_source/ucsc_tablebrowser_test.xml" />
+    <tool file="data_source/ucsc_tablebrowser_archaea.xml" />
+    <tool file="data_source/bx_browser.xml" />
+    <tool file="data_source/microbial_import.xml" />
+    <tool file="data_source/biomart.xml" />
+    <tool file="data_source/biomart_test.xml" />
+    <tool file="data_source/cbi_rice_mart.xml" />
+    <tool file="data_source/gramene_mart.xml" />
+    <tool file="data_source/fly_modencode.xml" />
+    <tool file="data_source/flymine.xml" />
+    <tool file="data_source/flymine_test.xml" />
+    <tool file="data_source/modmine.xml" />
+    <tool file="data_source/ratmine.xml" />
+    <tool file="data_source/worm_modencode.xml" />
+    <tool file="data_source/wormbase.xml" />
+    <tool file="data_source/wormbase_test.xml" />
+    <tool file="data_source/eupathdb.xml" />
+    <tool file="data_source/encode_db.xml" />
+    <tool file="data_source/epigraph_import.xml" />
+    <tool file="data_source/epigraph_import_test.xml" />
+    <tool file="data_source/hbvar.xml" />
+    <tool file="validation/fix_errors.xml" />
+  </section>
+  <section name="Send Data" id="send">
+    <tool file="data_destination/epigraph.xml" />
+    <tool file="data_destination/epigraph_test.xml" />
+  </section>
+  <section name="ENCODE Tools" id="EncodeTools">
+    <tool file="encode/gencode_partition.xml" />
+    <tool file="encode/random_intervals.xml" />
+  </section>
+  <section name="Lift-Over" id="liftOver">
+    <tool file="extract/liftOver_wrapper.xml" />
+  </section>
+  <section name="Text Manipulation" id="textutil">
+    <tool file="filters/fixedValueColumn.xml" />
+    <tool file="stats/column_maker.xml" />
+    <tool file="filters/catWrapper.xml" />
+    <tool file="filters/cutWrapper.xml" />
+    <tool file="filters/mergeCols.xml" />
+    <tool file="filters/convert_characters.xml" />
+    <tool file="filters/CreateInterval.xml" />
+    <tool file="filters/cutWrapper.xml" />
+    <tool file="filters/changeCase.xml" />
+    <tool file="filters/pasteWrapper.xml" />
+    <tool file="filters/remove_beginning.xml" />
+    <tool file="filters/randomlines.xml" />
+    <tool file="filters/headWrapper.xml" />
+    <tool file="filters/tailWrapper.xml" />
+    <tool file="filters/trimmer.xml" />
+    <tool file="stats/dna_filtering.xml" />
+    <tool file="new_operations/tables_arithmetic_operations.xml" />
+<!--
+	add galaxy-unix tools from here
+-->
+	<tool file="unix_tools/remove_ending.xml" />
+	<tool file="unix_tools/find_and_replace.xml" />
+<!--
+	add galaxy-unix tools end
+-->
+  </section>
+  <section name="Filter and Sort" id="filter">
+<!--
+	add galaxy-unix tools from here
+-->
+    <tool file="unix_tools/word_list_grep.xml" />
+<!--
+	add galaxy-unix tools end
+-->
+    <tool file="stats/filtering.xml" />
+    <tool file="filters/sorter.xml" />
+    <tool file="filters/grep.xml" />
+    <label text="GFF" id="gff" />
+        <tool file="filters/gff/extract_GFF_Features.xml" />
+        <tool file="filters/gff/gff_filter_by_attribute.xml" />
+        <tool file="filters/gff/gff_filter_by_feature_count.xml" />
+  </section>
+  <section name="Join, Subtract and Group" id="group">
+    <tool file="filters/joiner.xml" />
+    <tool file="filters/compare.xml"/>
+    <tool file="new_operations/subtract_query.xml"/>
+    <tool file="stats/grouping.xml" />
+    <tool file="new_operations/column_join.xml" />
+  </section>
+  <section name="Convert Formats" id="convert">
+    <tool file="filters/axt_to_concat_fasta.xml" />
+    <tool file="filters/axt_to_fasta.xml" />
+    <tool file="filters/axt_to_lav.xml" />
+    <tool file="filters/bed2gff.xml" />
+    <tool file="fasta_tools/fasta_to_tabular.xml" />
+    <tool file="filters/gff2bed.xml" />
+    <tool file="filters/lav_to_bed.xml" />
+    <tool file="maf/maf_to_bed.xml" />
+    <tool file="maf/maf_to_interval.xml" />
+    <tool file="maf/maf_to_fasta.xml" />
+    <tool file="fasta_tools/tabular_to_fasta.xml" />
+    <tool file="fastq/fastq_to_fasta.xml" />
+    <tool file="filters/wiggle_to_simple.xml" />
+    <tool file="filters/sff_extractor.xml" />
+    <tool file="filters/gtf2bedgraph.xml" />
+    <tool file="filters/wig_to_bigwig.xml" />
+  </section>
+  <section name="Extract Features" id="features">
+    <tool file="filters/ucsc_gene_bed_to_exon_bed.xml" />
+  </section>
+  <section name="Fetch Sequences" id="fetchSeq">
+    <tool file="extract/extract_genomic_dna.xml" />
+  </section>
+  <section name="Fetch Alignments" id="fetchAlign">
+    <tool file="maf/interval2maf_pairwise.xml" />
+    <tool file="maf/interval2maf.xml" />
+    <tool file="maf/maf_split_by_species.xml"/>
+    <tool file="maf/interval_maf_to_merged_fasta.xml" />
+    <tool file="maf/genebed_maf_to_fasta.xml"/>
+    <tool file="maf/maf_stats.xml"/>
+    <tool file="maf/maf_thread_for_species.xml"/>
+    <tool file="maf/maf_limit_to_species.xml"/>
+    <tool file="maf/maf_limit_size.xml"/>
+    <tool file="maf/maf_by_block_number.xml"/>
+    <tool file="maf/maf_reverse_complement.xml"/>
+    <tool file="maf/maf_filter.xml"/>
+  </section>
+  <section name="Get Genomic Scores" id="scores">
+    <tool file="stats/wiggle_to_simple.xml" />
+    <tool file="stats/aggregate_binned_scores_in_intervals.xml" />
+    <tool file="extract/phastOdds/phastOdds_tool.xml" />
+  </section>
+  <section name="Operate on Genomic Intervals" id="bxops">
+    <tool file="new_operations/intersect.xml" />
+    <tool file="new_operations/subtract.xml" />
+    <tool file="new_operations/merge.xml" />
+    <tool file="new_operations/concat.xml" />
+    <tool file="new_operations/basecoverage.xml" />
+    <tool file="new_operations/coverage.xml" />
+    <tool file="new_operations/complement.xml" />
+    <tool file="new_operations/cluster.xml" id="cluster" />
+    <tool file="new_operations/join.xml" />
+    <tool file="new_operations/get_flanks.xml" />
+    <tool file="new_operations/flanking_features.xml" />
+    <tool file="annotation_profiler/annotation_profiler.xml" />
+  </section>
+  <section name="Statistics" id="stats">
+    <tool file="stats/gsummary.xml" />
+    <tool file="filters/uniq.xml" />
+    <tool file="stats/cor.xml" />
+    <tool file="stats/generate_matrix_for_pca_lda.xml" />
+    <tool file="stats/lda_analy.xml" />
+    <tool file="stats/plot_from_lda.xml" />
+    <tool file="regVariation/t_test_two_samples.xml" />
+    <tool file="regVariation/compute_q_values.xml" />
+  </section>
+  <section name="Wavelet Analysis" id="dwt">
+ 	<tool file="discreteWavelet/execute_dwt_IvC_all.xml" />
+ 	<tool file="discreteWavelet/execute_dwt_cor_aVa_perClass.xml" />
+ 	<tool file="discreteWavelet/execute_dwt_cor_aVb_all.xml" /> 
+ 	<tool file="discreteWavelet/execute_dwt_var_perClass.xml" />
+ </section>
+  <section name="Graph/Display Data" id="plots">
+    <tool file="plotting/histogram2.xml" />
+    <tool file="plotting/scatterplot.xml" />
+    <tool file="plotting/bar_chart.xml" />
+    <tool file="plotting/xy_plot.xml" />
+    <tool file="plotting/boxplot.xml" />
+    <tool file="visualization/GMAJ.xml" />
+    <tool file="visualization/LAJ.xml" />
+    <tool file="visualization/build_ucsc_custom_track.xml" />
+    <tool file="maf/vcf_to_maf_customtrack.xml" />
+    <tool file="mutation/visualize.xml" />
+  </section>
+  <section name="Regional Variation" id="regVar">
+    <tool file="regVariation/windowSplitter.xml" />
+    <tool file="regVariation/featureCounter.xml" />
+    <tool file="regVariation/quality_filter.xml" />
+    <tool file="regVariation/maf_cpg_filter.xml" />
+    <tool file="regVariation/getIndels_2way.xml" />
+    <tool file="regVariation/getIndels_3way.xml" />
+    <tool file="regVariation/getIndelRates_3way.xml" />
+    <tool file="regVariation/substitutions.xml" />
+    <tool file="regVariation/substitution_rates.xml" />
+    <tool file="regVariation/microsats_alignment_level.xml" />
+    <tool file="regVariation/microsats_mutability.xml" />
+    <tool file="regVariation/delete_overlapping_indels.xml" />
+    <tool file="regVariation/compute_motifs_frequency.xml" />
+    <tool file="regVariation/compute_motif_frequencies_for_all_motifs.xml" />
+    <tool file="regVariation/categorize_elements_satisfying_criteria.xml" />s
+    <tool file="regVariation/draw_stacked_barplots.xml" />
+  </section>
+  <section name="Multiple regression" id="multReg">
+    <tool file="regVariation/linear_regression.xml" />
+    <tool file="regVariation/best_regression_subsets.xml" />
+    <tool file="regVariation/rcve.xml" />
+  </section>
+  <section name="Multivariate Analysis" id="multVar">
+    <tool file="multivariate_stats/pca.xml" />
+    <tool file="multivariate_stats/cca.xml" />
+    <tool file="multivariate_stats/kpca.xml" />
+    <tool file="multivariate_stats/kcca.xml" />
+  </section>
+ <section name="Evolution" id="hyphy">
+    <tool file="hyphy/hyphy_branch_lengths_wrapper.xml" />
+    <tool file="hyphy/hyphy_nj_tree_wrapper.xml" />
+    <tool file="hyphy/hyphy_dnds_wrapper.xml" />
+    <tool file="evolution/mutate_snp_codon.xml" />
+    <tool file="evolution/codingSnps.xml" />
+    <tool file="evolution/add_scores.xml" />
+ </section>
+ <section name="Metagenomic analyses" id="tax_manipulation">
+    <tool file="taxonomy/gi2taxonomy.xml" />
+    <tool file="taxonomy/t2t_report.xml" />
+    <tool file="taxonomy/t2ps_wrapper.xml" />
+    <tool file="taxonomy/find_diag_hits.xml" />
+    <tool file="taxonomy/lca.xml" />
+    <tool file="taxonomy/poisson2test.xml" />
+  </section>
+  <section name="FASTA manipulation" id="fasta_manipulation">
+    <tool file="fasta_tools/fasta_compute_length.xml" />
+    <tool file="fasta_tools/fasta_filter_by_length.xml" />
+    <tool file="fasta_tools/fasta_concatenate_by_species.xml" />
+    <tool file="fasta_tools/fasta_to_tabular.xml" />
+    <tool file="fasta_tools/tabular_to_fasta.xml" />
+    <tool file="fastx_toolkit/fasta_formatter.xml" />
+    <tool file="fastx_toolkit/fasta_nucleotide_changer.xml" />
+    <tool file="fastx_toolkit/fastx_collapser.xml" />
+  </section>
+  <section name="NGS: QC and manipulation" id="cshl_library_information">
+    <label text="Illumina data" id="illumina" />
+        <tool file="fastq/fastq_groomer.xml" />
+        <tool file="fastq/fastq_paired_end_splitter.xml" />
+        <tool file="fastq/fastq_paired_end_joiner.xml" />
+        <tool file="fastq/fastq_stats.xml" />
+    <label text="Roche-454 data" id="454" />
+        <tool file="metag_tools/short_reads_figure_score.xml" />
+        <tool file="metag_tools/short_reads_trim_seq.xml" />
+        <tool file="fastq/fastq_combiner.xml" />
+    <label text="AB-SOLiD data" id="solid" />
+        <tool file="next_gen_conversion/solid2fastq.xml" />
+        <tool file="solid_tools/solid_qual_stats.xml" />
+        <tool file="solid_tools/solid_qual_boxplot.xml" />
+    <label text="Generic FASTQ manipulation" id="generic_fastq" />
+        <tool file="fastq/fastq_filter.xml" />
+        <tool file="fastq/fastq_trimmer.xml" />
+        <tool file="fastq/fastq_trimmer_by_quality.xml" />
+        <tool file="fastq/fastq_masker_by_quality.xml" />
+        <tool file="fastq/fastq_manipulation.xml" />
+        <tool file="fastq/fastq_to_fasta.xml" />
+        <tool file="fastq/fastq_to_tabular.xml" />
+        <tool file="fastq/tabular_to_fastq.xml" />
+    <label text="FASTX-Toolkit for FASTQ data" id="fastx_toolkit" />
+        <tool file="fastx_toolkit/fastq_quality_converter.xml" />
+        <tool file="fastx_toolkit/fastx_quality_statistics.xml" />
+        <tool file="fastx_toolkit/fastq_quality_boxplot.xml" />
+        <tool file="fastx_toolkit/fastx_nucleotides_distribution.xml" />
+        <tool file="fastx_toolkit/fastq_to_fasta.xml" />
+        <tool file="fastx_toolkit/fastq_quality_filter.xml" />
+        <tool file="fastx_toolkit/fastq_to_fasta.xml" />
+        <tool file="fastx_toolkit/fastx_artifacts_filter.xml" />
+        <tool file="fastx_toolkit/fastx_barcode_splitter.xml" />
+        <tool file="fastx_toolkit/fastx_clipper.xml" />
+        <tool file="fastx_toolkit/fastx_collapser.xml" />
+        <tool file="fastx_toolkit/fastx_renamer.xml" />
+        <tool file="fastx_toolkit/fastx_reverse_complement.xml" />
+        <tool file="fastx_toolkit/fastx_trimmer.xml" />  
+  </section>
+  <!--
+  Keep this section commented until it includes tools that
+  will be hosted on test/main.  The velvet wrappers have been
+  included in the distribution but will not be hosted on our
+  public servers for the current time.
+  <section name="NGS: Assembly" id="ngs_assembly">
+        <label text="Velvet" id="velvet"/>
+        <tool file="sr_assembly/velvetg.xml" />
+        <tool file="sr_assembly/velveth.xml" />
+  </section>
+  -->
+  <section name="NCBI BLAST+" id="ncbi_blast_plus_tools">
+   <tool file="ncbi_blast_plus/ncbi_blastn_wrapper.xml" />
+   <tool file="ncbi_blast_plus/ncbi_blastp_wrapper.xml" />
+   <tool file="ncbi_blast_plus/ncbi_blastx_wrapper.xml" />
+   <tool file="ncbi_blast_plus/ncbi_tblastn_wrapper.xml" />
+   <tool file="ncbi_blast_plus/ncbi_tblastx_wrapper.xml" />
+   <tool file="ncbi_blast_plus/blast_filter_fasta.xml" />
+  </section>
+  <section name="NGS: Mapping" id="solexa_tools">
+   <tool file="sr_mapping/lastz_wrapper.xml" />
+   <tool file="sr_mapping/lastz_paired_reads_wrapper.xml" />
+   <tool file="sr_mapping/bowtie_wrapper.xml" />
+   <tool file="sr_mapping/bowtie_color_wrapper.xml" />
+   <tool file="sr_mapping/bwa_wrapper.xml" />
+   <tool file="sr_mapping/bfast_wrapper.xml" />
+   <tool file="metag_tools/megablast_wrapper.xml" />
+   <tool file="metag_tools/megablast_xml_parser.xml" />
+   <tool file="sr_mapping/PerM.xml" />
+   <tool file="sr_mapping/srma_wrapper.xml" />
+  </section>
+  <section name="NGS: Indel Analysis" id="indel_analysis">
+   <tool file="indels/sam_indel_filter.xml" />
+   <tool file="indels/indel_sam2interval.xml" />
+   <tool file="indels/indel_table.xml" />"
+   <tool file="indels/indel_analysis.xml" />
+  </section>
+  <section name="NGS: RNA Analysis" id="ngs-rna-tools">
+   <label text="RNA-seq" id="rna_seq" />
+      <tool file="ngs_rna/tophat_wrapper.xml" />
+      <tool file="ngs_rna/cufflinks_wrapper.xml" />
+      <tool file="ngs_rna/cuffcompare_wrapper.xml" />
+      <tool file="ngs_rna/cuffdiff_wrapper.xml" />
+   <label text="Filtering" id="filtering" />
+      <tool file="ngs_rna/filter_transcripts_via_tracking.xml" />
+  </section>
+  <section name="NGS: SAM Tools" id="samtools">
+   <tool file="samtools/sam_bitwise_flag_filter.xml" />
+   <tool file="samtools/sam2interval.xml" />
+   <tool file="samtools/sam_to_bam.xml" />
+   <tool file="samtools/bam_to_sam.xml" />
+   <tool file="samtools/sam_merge.xml" />
+   <tool file="samtools/sam_pileup.xml" />
+   <tool file="samtools/pileup_parser.xml" />
+   <tool file="samtools/pileup_interval.xml" />
+  </section>
+  <section name="NGS: Peak Calling" id="peak_calling">
+   <tool file="peak_calling/macs_wrapper.xml" />
+   <tool file="genetrack/genetrack_indexer.xml" />
+   <tool file="genetrack/genetrack_peak_prediction.xml" />
+  </section>
+  <section name="SNP/WGA: Data; Filters" id="rgdat">
+  <label text="Data: Import and upload" id="rgimport" />
+    <tool file="data_source/upload.xml"/>
+    <tool file="data_source/access_libraries.xml" />
+    <tool file="data_source/hapmapmart.xml" />
+  <label text="Data: Filter and Clean" id="rgfilter" />
+    <tool file="rgenetics/rgClean.xml"/>
+    <tool file="rgenetics/rgPedSub.xml"/>
+    <tool file="rgenetics/rgLDIndep.xml"/>
+  <label text="Simulate" id="rgsim" />
+    <tool file="rgenetics/rgfakePhe.xml"/>
+    <tool file="rgenetics/rgfakePed.xml"/>
+  </section>
+  <section name="SNP/WGA: QC; LD; Plots" id="rgqcplot">
+  <label text="QC; Eigenstrat" id="rgvisual" />
+    <tool file="rgenetics/rgQC.xml"/>
+    <tool file="rgenetics/rgEigPCA.xml"/>
+  <label text="LD; Manhattan/QQ; GRR" id="rgld" />
+    <tool file="rgenetics/rgHaploView.xml"/>
+    <tool file="rgenetics/rgManQQ.xml"/>
+    <tool file="rgenetics/rgGRR.xml"/>
+  </section>
+  <section name="SNP/WGA: Statistical Models" id="rgmodel">
+    <tool file="rgenetics/rgCaCo.xml"/>
+    <tool file="rgenetics/rgTDT.xml"/>
+    <tool file="rgenetics/rgGLM.xml"/>
+    <tool file="rgenetics/rgManQQ.xml"/>
+  </section>
+  <section name="Human Genome Variation" id="hgv">
+    <tool file="evolution/codingSnps.xml" />
+    <tool file="evolution/add_scores.xml" />
+    <tool file="human_genome_variation/sift.xml" />
+    <tool file="human_genome_variation/linkToGProfile.xml" />
+    <tool file="human_genome_variation/linkToDavid.xml"/>
+    <tool file="human_genome_variation/ctd.xml" />
+    <tool file="human_genome_variation/funDo.xml" />
+    <tool file="human_genome_variation/snpFreq.xml" />
+    <tool file="human_genome_variation/ldtools.xml" />
+    <tool file="human_genome_variation/pass.xml" />
+    <tool file="human_genome_variation/gpass.xml" />
+    <tool file="human_genome_variation/beam.xml" />
+    <tool file="human_genome_variation/lps.xml" />
+    <tool file="human_genome_variation/hilbertvis.xml" />
+  </section>
+<!--
+	add galaxy-unix tools from here
+-->
+  <section name="Unix Tools" id="unix_tools">
+    <tool file="unix_tools/awk_tool.xml" />
+    <tool file="unix_tools/sed_tool.xml" />
+    <tool file="unix_tools/grep_tool.xml" />
+    <tool file="unix_tools/sort_tool.xml" />
+    <tool file="unix_tools/uniq_tool.xml" />
+    <tool file="unix_tools/cut_tool.xml" />
+    <tool file="unix_tools/join_tool.xml" />
+  </section>
+<!--
+	add galaxy-unix tools end
+-->
+<!--
+  TODO: uncomment the following EMBOSS section whenever
+  moving to test, but comment it in .sample to eliminate
+  it from buildbot functional tests since these tools
+  rarely change.
+-->
+<!--
+  <section name="EMBOSS" id="EMBOSSLite">
+    <tool file="emboss_5/emboss_antigenic.xml" />
+    <tool file="emboss_5/emboss_backtranseq.xml" />
+    <tool file="emboss_5/emboss_banana.xml" />
+    <tool file="emboss_5/emboss_biosed.xml" />
+    <tool file="emboss_5/emboss_btwisted.xml" />
+    <tool file="emboss_5/emboss_cai_custom.xml" />
+    <tool file="emboss_5/emboss_cai.xml" />
+    <tool file="emboss_5/emboss_chaos.xml" />
+    <tool file="emboss_5/emboss_charge.xml" />
+    <tool file="emboss_5/emboss_checktrans.xml" />
+    <tool file="emboss_5/emboss_chips.xml" />
+    <tool file="emboss_5/emboss_cirdna.xml" />
+    <tool file="emboss_5/emboss_codcmp.xml" />
+    <tool file="emboss_5/emboss_coderet.xml" />
+    <tool file="emboss_5/emboss_compseq.xml" />
+    <tool file="emboss_5/emboss_cpgplot.xml" />
+    <tool file="emboss_5/emboss_cpgreport.xml" />
+    <tool file="emboss_5/emboss_cusp.xml" />
+    <tool file="emboss_5/emboss_cutseq.xml" />
+    <tool file="emboss_5/emboss_dan.xml" />
+    <tool file="emboss_5/emboss_degapseq.xml" />
+    <tool file="emboss_5/emboss_descseq.xml" />
+    <tool file="emboss_5/emboss_diffseq.xml" />
+    <tool file="emboss_5/emboss_digest.xml" />
+    <tool file="emboss_5/emboss_dotmatcher.xml" />
+    <tool file="emboss_5/emboss_dotpath.xml" />
+    <tool file="emboss_5/emboss_dottup.xml" />
+    <tool file="emboss_5/emboss_dreg.xml" />
+    <tool file="emboss_5/emboss_einverted.xml" />
+    <tool file="emboss_5/emboss_epestfind.xml" />
+    <tool file="emboss_5/emboss_equicktandem.xml" />
+    <tool file="emboss_5/emboss_est2genome.xml" />
+    <tool file="emboss_5/emboss_etandem.xml" />
+    <tool file="emboss_5/emboss_extractfeat.xml" />
+    <tool file="emboss_5/emboss_extractseq.xml" />
+    <tool file="emboss_5/emboss_freak.xml" />
+    <tool file="emboss_5/emboss_fuzznuc.xml" />
+    <tool file="emboss_5/emboss_fuzzpro.xml" />
+    <tool file="emboss_5/emboss_fuzztran.xml" />
+    <tool file="emboss_5/emboss_garnier.xml" />
+    <tool file="emboss_5/emboss_geecee.xml" />
+    <tool file="emboss_5/emboss_getorf.xml" />
+    <tool file="emboss_5/emboss_helixturnhelix.xml" />
+    <tool file="emboss_5/emboss_hmoment.xml" />
+    <tool file="emboss_5/emboss_iep.xml" />
+    <tool file="emboss_5/emboss_infoseq.xml" />
+    <tool file="emboss_5/emboss_isochore.xml" />
+    <tool file="emboss_5/emboss_lindna.xml" />
+    <tool file="emboss_5/emboss_marscan.xml" />
+    <tool file="emboss_5/emboss_maskfeat.xml" />
+    <tool file="emboss_5/emboss_maskseq.xml" />
+    <tool file="emboss_5/emboss_matcher.xml" />
+    <tool file="emboss_5/emboss_megamerger.xml" />
+    <tool file="emboss_5/emboss_merger.xml" />
+    <tool file="emboss_5/emboss_msbar.xml" />
+    <tool file="emboss_5/emboss_needle.xml" />
+    <tool file="emboss_5/emboss_newcpgreport.xml" />
+    <tool file="emboss_5/emboss_newcpgseek.xml" />
+    <tool file="emboss_5/emboss_newseq.xml" />
+    <tool file="emboss_5/emboss_noreturn.xml" />
+    <tool file="emboss_5/emboss_notseq.xml" />
+    <tool file="emboss_5/emboss_nthseq.xml" />
+    <tool file="emboss_5/emboss_octanol.xml" />
+    <tool file="emboss_5/emboss_oddcomp.xml" />
+    <tool file="emboss_5/emboss_palindrome.xml" />
+    <tool file="emboss_5/emboss_pasteseq.xml" />
+    <tool file="emboss_5/emboss_patmatdb.xml" />
+    <tool file="emboss_5/emboss_pepcoil.xml" />
+    <tool file="emboss_5/emboss_pepinfo.xml" />
+    <tool file="emboss_5/emboss_pepnet.xml" />
+    <tool file="emboss_5/emboss_pepstats.xml" />
+    <tool file="emboss_5/emboss_pepwheel.xml" />
+    <tool file="emboss_5/emboss_pepwindow.xml" />
+    <tool file="emboss_5/emboss_pepwindowall.xml" />
+    <tool file="emboss_5/emboss_plotcon.xml" />
+    <tool file="emboss_5/emboss_plotorf.xml" />
+    <tool file="emboss_5/emboss_polydot.xml" />
+    <tool file="emboss_5/emboss_preg.xml" />
+    <tool file="emboss_5/emboss_prettyplot.xml" />
+    <tool file="emboss_5/emboss_prettyseq.xml" />
+    <tool file="emboss_5/emboss_primersearch.xml" />
+    <tool file="emboss_5/emboss_revseq.xml" />
+    <tool file="emboss_5/emboss_seqmatchall.xml" />
+    <tool file="emboss_5/emboss_seqret.xml" />
+    <tool file="emboss_5/emboss_showfeat.xml" />
+    <tool file="emboss_5/emboss_shuffleseq.xml" />
+    <tool file="emboss_5/emboss_sigcleave.xml" />
+    <tool file="emboss_5/emboss_sirna.xml" />
+    <tool file="emboss_5/emboss_sixpack.xml" />
+    <tool file="emboss_5/emboss_skipseq.xml" />
+    <tool file="emboss_5/emboss_splitter.xml" />
+    <tool file="emboss_5/emboss_supermatcher.xml" />
+    <tool file="emboss_5/emboss_syco.xml" />
+    <tool file="emboss_5/emboss_tcode.xml" />
+    <tool file="emboss_5/emboss_textsearch.xml" />
+    <tool file="emboss_5/emboss_tmap.xml" />
+    <tool file="emboss_5/emboss_tranalign.xml" />
+    <tool file="emboss_5/emboss_transeq.xml" />
+    <tool file="emboss_5/emboss_trimest.xml" />
+    <tool file="emboss_5/emboss_trimseq.xml" />
+    <tool file="emboss_5/emboss_twofeat.xml" />
+    <tool file="emboss_5/emboss_union.xml" />
+    <tool file="emboss_5/emboss_vectorstrip.xml" />
+    <tool file="emboss_5/emboss_water.xml" />
+    <tool file="emboss_5/emboss_wobble.xml" />
+    <tool file="emboss_5/emboss_wordcount.xml" />
+    <tool file="emboss_5/emboss_wordmatch.xml" />
+  </section>
+-->
+</toolbox>
Index: /galaxy-central/tool-data/alignseq.loc
===================================================================
--- /galaxy-central/tool-data/alignseq.loc (revision 3)
+++ /galaxy-central/tool-data/alignseq.loc (revision 3)
@@ -0,0 +1,57 @@
+#This is a sample file distributed with Galaxy that enables tools
+#to use alignment data stored as axt files (lines starting with "align")
+#or nib files (lines starting with "seq").  You will need to index 
+#them and then create an alignseq.loc file similar to this one (store
+#it in this directory) that points to the directories in which those 
+#alignments are stored.  The "align" data referred to by the alignseq.loc 
+#file has this format (white space characters are TAB characters):
+#
+#align	<build1>	<build2>	<dir>
+#
+#So, for example, if you had hg18/bosTau2 alignment files stored in 
+#/depot/data2/galaxy/hg18/align/bosTau2, then the alignseq.loc entry 
+#would look like this:
+#
+#align	hg18	bosTau2	/depot/data2/galaxy/hg18/align/bosTau2
+#
+#and your /depot/data2/galaxy/hg18/align/bosTau2 directory would 
+#contain all of your alignment files (e.g.):
+#
+#-rw-rw-r--   1 nate   galaxy 151842783 2006-01-08 01:00 chr10.axt
+#-rw-rw-r--   1 nate   galaxy     79575 2006-01-08 01:00 chr10_random.axt
+#-rw-rw-r--   1 nate   galaxy 155015634 2006-01-08 01:01 chr11.axt
+#...etc...
+#
+#Your alignseq.loc file should include an entry per line for each alignment 
+#file you have stored.  For example:
+#
+#align anoGam1 dm1 /depot/data2/galaxy/anoGam1/align/dm1
+#align anoGam1 dm2 /depot/data2/galaxy/anoGam1/align/dm2
+#align canFam1 hg17 /depot/data2/galaxy/canFam1/align/hg17
+#...etc...
+#
+#The "seq" data referred to by the alignseq.loc file has this 
+#format (white space characters are TAB characters):
+#
+#seq	<build1>	<dir>
+#
+#So, for example, if you had anoGam1 sequence files stored in
+#/depot/data2/galaxy/anoGam1/seq, then the alignseq.loc entry
+#would look like this:
+#
+#seq anoGam1 /depot/data2/galaxy/anoGam1/seq
+#and your seq anoGam1 /depot/data2/galaxy/anoGam1/seq directory would
+#contain all of your sequence files (e.g.):
+#
+#-rw-rw-r-- 1 nate galaxy 24397551 2006-06-26 12:51 chr2L.nib
+#-rw-rw-r-- 1 nate galaxy 31362964 2006-06-26 12:51 chr2R.nib
+#-rw-rw-r-- 1 nate galaxy 20642013 2006-06-26 12:51 chr3L.nib
+#-rw-rw-r-- 1 nate galaxy 26636071 2006-06-26 12:51 chr3R.nib
+#
+#Your alignseq.loc file should include an entry per line for each sequence
+#file you have stored.  For example:
+#
+#seq anoGam1 /depot/data2/galaxy/anoGam1/seq
+#seq bosTau2 /depot/data2/galaxy/bosTau2/seq
+#seq bosTau3 /depot/data2/galaxy/bosTau3/seq
+#...etc...
Index: /galaxy-central/tool-data/maf_pairwise.loc
===================================================================
--- /galaxy-central/tool-data/maf_pairwise.loc (revision 3)
+++ /galaxy-central/tool-data/maf_pairwise.loc (revision 3)
@@ -0,0 +1,31 @@
+#This is a sample file distributed with Galaxy that is used by some
+#alignment tools.  The maf_pairwise.loc file has this format (white 
+#space characters are TAB characters):
+#
+#<Display_name UID>	<indexed_for:build1,build2,build3>	<exists_in_maf:build1,build2,build3>	<Comma_Separated_List_of_Full_Paths_To_Files>
+#
+#Pairwise (anoGam1,dm2)	PAIRWISE_anoGam1_dm2	anoGam1,dm2	anoGam1,dm2	/depot/data2/galaxy/anoGam1/align/dm2/maf/chr2L.maf,/depot/data2/galaxy/anoGam1/align/dm2/maf/chr2R.maf,/depot/data2/galaxy/anoGam1/align/dm2/maf/chr3L.maf,/depot/data2/galaxy/anoGam1/align/dm2/maf/chr3R.maf,/depot/data2/galaxy/anoGam1/align/dm2/maf/chrM.maf,/depot/data2/galaxy/anoGam1/align/dm2/maf/chrU.maf,/depot/data2/galaxy/anoGam1/align/dm2/maf/chrX.maf
+#Pairwise (canFam1,hg17)	PAIRWISE_canFam1_hg17	canFam1,hg17	canFam1,hg17	/depot/data2/galaxy/canFam1/align/hg17/maf/chr1.maf,/depot/data2/galaxy/canFam1/align/hg17/maf/chr10.maf,/depot/data2/galaxy/canFam1/align/hg17/maf/chr11.maf,/depot/data2/galaxy/canFam1/align/hg17/maf/chr12.maf,/depot/data2/galaxy/canFam1/align/hg17/maf/chr13.maf,/depot/data2/galaxy/canFam1/align/hg17/maf/chr14.maf,/depot/data2/galaxy/canFam1/align/hg17/maf/chr15.maf,/depot/data2/galaxy/canFam1/align/hg17/maf/chr16.maf,/depot/data2/galaxy/canFam1/align/hg17/maf/chr17.maf,/depot/data2/galaxy/canFam1/align/hg17/maf/chr18.maf,/depot/data2/galaxy/canFam1/align/hg17/maf/chr19.maf,/depot/data2/galaxy/canFam1/align/hg17/maf/chr2.maf,/depot/data2/galaxy/canFam1/align/hg17/maf/chr20.maf,/depot/data2/galaxy/canFam1/align/hg17/maf/chr21.maf,/depot/data2/galaxy/canFam1/align/hg17/maf/chr22.maf,/depot/data2/galaxy/canFam1/align/hg17/maf/chr23.maf,/depot/data2/galaxy/canFam1/align/hg17/maf/chr24.maf,/depot/data2/galaxy/canFam1/align/hg17/maf/chr25.maf,/depot/data2/galaxy/canFam1/align/hg17/maf/chr26.maf,/depot/data2/galaxy/canFam1/align/hg17/maf/chr27.maf,/depot/data2/galaxy/canFam1/align/hg17/maf/chr28.maf,/depot/data2/galaxy/canFam1/align/hg17/maf/chr29.maf,/depot/data2/galaxy/canFam1/align/hg17/maf/chr3.maf,/depot/data2/galaxy/canFam1/align/hg17/maf/chr30.maf,/depot/data2/galaxy/canFam1/align/hg17/maf/chr31.maf,/depot/data2/galaxy/canFam1/align/hg17/maf/chr32.maf,/depot/data2/galaxy/canFam1/align/hg17/maf/chr33.maf,/depot/data2/galaxy/canFam1/align/hg17/maf/chr34.maf,/depot/data2/galaxy/canFam1/align/hg17/maf/chr35.maf,/depot/data2/galaxy/canFam1/align/hg17/maf/chr36.maf,/depot/data2/galaxy/canFam1/align/hg17/maf/chr37.maf,/depot/data2/galaxy/canFam1/align/hg17/maf/chr38.maf,/depot/data2/galaxy/canFam1/align/hg17/maf/chr4.maf,/depot/data2/galaxy/canFam1/align/hg17/maf/chr5.maf,/depot/data2/galaxy/canFam1/align/hg17/maf/chr6.maf,/depot/data2/galaxy/canFam1/align/hg17/maf/chr7.maf,/depot/data2/galaxy/canFam1/align/hg17/maf/chr8.maf,/depot/data2/galaxy/canFam1/align/hg17/maf/chr9.maf,/depot/data2/galaxy/canFam1/align/hg17/maf/chrM.maf,/depot/data2/galaxy/canFam1/align/hg17/maf/chrUn.maf,/depot/data2/galaxy/canFam1/align/hg17/maf/chrX.maf
+#Pairwise (canFam1,mm6)	PAIRWISE_canFam1_mm6	canFam1,mm6	canFam1,mm6	/depot/data2/galaxy/canFam1/align/mm6/maf/chr1.maf,/depot/data2/galaxy/canFam1/align/mm6/maf/chr10.maf,/depot/data2/galaxy/canFam1/align/mm6/maf/chr11.maf,/depot/data2/galaxy/canFam1/align/mm6/maf/chr12.maf,/depot/data2/galaxy/canFam1/align/mm6/maf/chr13.maf,/depot/data2/galaxy/canFam1/align/mm6/maf/chr14.maf,/depot/data2/galaxy/canFam1/align/mm6/maf/chr15.maf,/depot/data2/galaxy/canFam1/align/mm6/maf/chr16.maf,/depot/data2/galaxy/canFam1/align/mm6/maf/chr17.maf,/depot/data2/galaxy/canFam1/align/mm6/maf/chr18.maf,/depot/data2/galaxy/canFam1/align/mm6/maf/chr19.maf,/depot/data2/galaxy/canFam1/align/mm6/maf/chr2.maf,/depot/data2/galaxy/canFam1/align/mm6/maf/chr20.maf,/depot/data2/galaxy/canFam1/align/mm6/maf/chr21.maf,/depot/data2/galaxy/canFam1/align/mm6/maf/chr22.maf,/depot/data2/galaxy/canFam1/align/mm6/maf/chr23.maf,/depot/data2/galaxy/canFam1/align/mm6/maf/chr24.maf,/depot/data2/galaxy/canFam1/align/mm6/maf/chr25.maf,/depot/data2/galaxy/canFam1/align/mm6/maf/chr26.maf,/depot/data2/galaxy/canFam1/align/mm6/maf/chr27.maf,/depot/data2/galaxy/canFam1/align/mm6/maf/chr28.maf,/depot/data2/galaxy/canFam1/align/mm6/maf/chr29.maf,/depot/data2/galaxy/canFam1/align/mm6/maf/chr3.maf,/depot/data2/galaxy/canFam1/align/mm6/maf/chr30.maf,/depot/data2/galaxy/canFam1/align/mm6/maf/chr31.maf,/depot/data2/galaxy/canFam1/align/mm6/maf/chr32.maf,/depot/data2/galaxy/canFam1/align/mm6/maf/chr33.maf,/depot/data2/galaxy/canFam1/align/mm6/maf/chr34.maf,/depot/data2/galaxy/canFam1/align/mm6/maf/chr35.maf,/depot/data2/galaxy/canFam1/align/mm6/maf/chr36.maf,/depot/data2/galaxy/canFam1/align/mm6/maf/chr37.maf,/depot/data2/galaxy/canFam1/align/mm6/maf/chr38.maf,/depot/data2/galaxy/canFam1/align/mm6/maf/chr4.maf,/depot/data2/galaxy/canFam1/align/mm6/maf/chr5.maf,/depot/data2/galaxy/canFam1/align/mm6/maf/chr6.maf,/depot/data2/galaxy/canFam1/align/mm6/maf/chr7.maf,/depot/data2/galaxy/canFam1/align/mm6/maf/chr8.maf,/depot/data2/galaxy/canFam1/align/mm6/maf/chr9.maf,/depot/data2/galaxy/canFam1/align/mm6/maf/chrM.maf,/depot/data2/galaxy/canFam1/align/mm6/maf/chrUn.maf,/depot/data2/galaxy/canFam1/align/mm6/maf/chrX.maf
+#Pairwise (canFam2,canFam2)	PAIRWISE_canFam2_canFam2	canFam2,canFam2	canFam2,canFam2	/depot/data2/galaxy/canFam2/align/canFam2/maf/chr1.maf,/depot/data2/galaxy/canFam2/align/canFam2/maf/chr10.maf,/depot/data2/galaxy/canFam2/align/canFam2/maf/chr11.maf,/depot/data2/galaxy/canFam2/align/canFam2/maf/chr12.maf,/depot/data2/galaxy/canFam2/align/canFam2/maf/chr13.maf,/depot/data2/galaxy/canFam2/align/canFam2/maf/chr14.maf,/depot/data2/galaxy/canFam2/align/canFam2/maf/chr15.maf,/depot/data2/galaxy/canFam2/align/canFam2/maf/chr16.maf,/depot/data2/galaxy/canFam2/align/canFam2/maf/chr17.maf,/depot/data2/galaxy/canFam2/align/canFam2/maf/chr18.maf,/depot/data2/galaxy/canFam2/align/canFam2/maf/chr19.maf,/depot/data2/galaxy/canFam2/align/canFam2/maf/chr2.maf,/depot/data2/galaxy/canFam2/align/canFam2/maf/chr20.maf,/depot/data2/galaxy/canFam2/align/canFam2/maf/chr21.maf,/depot/data2/galaxy/canFam2/align/canFam2/maf/chr22.maf,/depot/data2/galaxy/canFam2/align/canFam2/maf/chr23.maf,/depot/data2/galaxy/canFam2/align/canFam2/maf/chr24.maf,/depot/data2/galaxy/canFam2/align/canFam2/maf/chr25.maf,/depot/data2/galaxy/canFam2/align/canFam2/maf/chr26.maf,/depot/data2/galaxy/canFam2/align/canFam2/maf/chr27.maf,/depot/data2/galaxy/canFam2/align/canFam2/maf/chr28.maf,/depot/data2/galaxy/canFam2/align/canFam2/maf/chr29.maf,/depot/data2/galaxy/canFam2/align/canFam2/maf/chr3.maf,/depot/data2/galaxy/canFam2/align/canFam2/maf/chr30.maf,/depot/data2/galaxy/canFam2/align/canFam2/maf/chr31.maf,/depot/data2/galaxy/canFam2/align/canFam2/maf/chr32.maf,/depot/data2/galaxy/canFam2/align/canFam2/maf/chr33.maf,/depot/data2/galaxy/canFam2/align/canFam2/maf/chr34.maf,/depot/data2/galaxy/canFam2/align/canFam2/maf/chr35.maf,/depot/data2/galaxy/canFam2/align/canFam2/maf/chr36.maf,/depot/data2/galaxy/canFam2/align/canFam2/maf/chr37.maf,/depot/data2/galaxy/canFam2/align/canFam2/maf/chr38.maf,/depot/data2/galaxy/canFam2/align/canFam2/maf/chr4.maf,/depot/data2/galaxy/canFam2/align/canFam2/maf/chr5.maf,/depot/data2/galaxy/canFam2/align/canFam2/maf/chr6.maf,/depot/data2/galaxy/canFam2/align/canFam2/maf/chr7.maf,/depot/data2/galaxy/canFam2/align/canFam2/maf/chr8.maf,/depot/data2/galaxy/canFam2/align/canFam2/maf/chr9.maf,/depot/data2/galaxy/canFam2/align/canFam2/maf/chrM.maf,/depot/data2/galaxy/canFam2/align/canFam2/maf/chrX.maf
+#Pairwise (canFam2,hg17)	PAIRWISE_canFam2_hg17	canFam2,hg17	canFam2,hg17	/depot/data2/galaxy/canFam2/align/hg17/maf/chr1.maf,/depot/data2/galaxy/canFam2/align/hg17/maf/chr10.maf,/depot/data2/galaxy/canFam2/align/hg17/maf/chr11.maf,/depot/data2/galaxy/canFam2/align/hg17/maf/chr12.maf,/depot/data2/galaxy/canFam2/align/hg17/maf/chr13.maf,/depot/data2/galaxy/canFam2/align/hg17/maf/chr14.maf,/depot/data2/galaxy/canFam2/align/hg17/maf/chr15.maf,/depot/data2/galaxy/canFam2/align/hg17/maf/chr16.maf,/depot/data2/galaxy/canFam2/align/hg17/maf/chr17.maf,/depot/data2/galaxy/canFam2/align/hg17/maf/chr18.maf,/depot/data2/galaxy/canFam2/align/hg17/maf/chr19.maf,/depot/data2/galaxy/canFam2/align/hg17/maf/chr2.maf,/depot/data2/galaxy/canFam2/align/hg17/maf/chr20.maf,/depot/data2/galaxy/canFam2/align/hg17/maf/chr21.maf,/depot/data2/galaxy/canFam2/align/hg17/maf/chr22.maf,/depot/data2/galaxy/canFam2/align/hg17/maf/chr23.maf,/depot/data2/galaxy/canFam2/align/hg17/maf/chr24.maf,/depot/data2/galaxy/canFam2/align/hg17/maf/chr25.maf,/depot/data2/galaxy/canFam2/align/hg17/maf/chr26.maf,/depot/data2/galaxy/canFam2/align/hg17/maf/chr27.maf,/depot/data2/galaxy/canFam2/align/hg17/maf/chr28.maf,/depot/data2/galaxy/canFam2/align/hg17/maf/chr29.maf,/depot/data2/galaxy/canFam2/align/hg17/maf/chr3.maf,/depot/data2/galaxy/canFam2/align/hg17/maf/chr30.maf,/depot/data2/galaxy/canFam2/align/hg17/maf/chr31.maf,/depot/data2/galaxy/canFam2/align/hg17/maf/chr32.maf,/depot/data2/galaxy/canFam2/align/hg17/maf/chr33.maf,/depot/data2/galaxy/canFam2/align/hg17/maf/chr34.maf,/depot/data2/galaxy/canFam2/align/hg17/maf/chr35.maf,/depot/data2/galaxy/canFam2/align/hg17/maf/chr36.maf,/depot/data2/galaxy/canFam2/align/hg17/maf/chr37.maf,/depot/data2/galaxy/canFam2/align/hg17/maf/chr38.maf,/depot/data2/galaxy/canFam2/align/hg17/maf/chr4.maf,/depot/data2/galaxy/canFam2/align/hg17/maf/chr5.maf,/depot/data2/galaxy/canFam2/align/hg17/maf/chr6.maf,/depot/data2/galaxy/canFam2/align/hg17/maf/chr7.maf,/depot/data2/galaxy/canFam2/align/hg17/maf/chr8.maf,/depot/data2/galaxy/canFam2/align/hg17/maf/chr9.maf,/depot/data2/galaxy/canFam2/align/hg17/maf/chrM.maf,/depot/data2/galaxy/canFam2/align/hg17/maf/chrUn.maf,/depot/data2/galaxy/canFam2/align/hg17/maf/chrX.maf
+#Pairwise (canFam2,hg18)	PAIRWISE_canFam2_hg18	canFam2,hg18	canFam2,hg18	/depot/data2/galaxy/canFam2/align/hg18/maf/chr1.maf,/depot/data2/galaxy/canFam2/align/hg18/maf/chr10.maf,/depot/data2/galaxy/canFam2/align/hg18/maf/chr11.maf,/depot/data2/galaxy/canFam2/align/hg18/maf/chr12.maf,/depot/data2/galaxy/canFam2/align/hg18/maf/chr13.maf,/depot/data2/galaxy/canFam2/align/hg18/maf/chr14.maf,/depot/data2/galaxy/canFam2/align/hg18/maf/chr15.maf,/depot/data2/galaxy/canFam2/align/hg18/maf/chr16.maf,/depot/data2/galaxy/canFam2/align/hg18/maf/chr17.maf,/depot/data2/galaxy/canFam2/align/hg18/maf/chr18.maf,/depot/data2/galaxy/canFam2/align/hg18/maf/chr19.maf,/depot/data2/galaxy/canFam2/align/hg18/maf/chr2.maf,/depot/data2/galaxy/canFam2/align/hg18/maf/chr20.maf,/depot/data2/galaxy/canFam2/align/hg18/maf/chr21.maf,/depot/data2/galaxy/canFam2/align/hg18/maf/chr22.maf,/depot/data2/galaxy/canFam2/align/hg18/maf/chr23.maf,/depot/data2/galaxy/canFam2/align/hg18/maf/chr24.maf,/depot/data2/galaxy/canFam2/align/hg18/maf/chr25.maf,/depot/data2/galaxy/canFam2/align/hg18/maf/chr26.maf,/depot/data2/galaxy/canFam2/align/hg18/maf/chr27.maf,/depot/data2/galaxy/canFam2/align/hg18/maf/chr28.maf,/depot/data2/galaxy/canFam2/align/hg18/maf/chr29.maf,/depot/data2/galaxy/canFam2/align/hg18/maf/chr3.maf,/depot/data2/galaxy/canFam2/align/hg18/maf/chr30.maf,/depot/data2/galaxy/canFam2/align/hg18/maf/chr31.maf,/depot/data2/galaxy/canFam2/align/hg18/maf/chr32.maf,/depot/data2/galaxy/canFam2/align/hg18/maf/chr33.maf,/depot/data2/galaxy/canFam2/align/hg18/maf/chr34.maf,/depot/data2/galaxy/canFam2/align/hg18/maf/chr35.maf,/depot/data2/galaxy/canFam2/align/hg18/maf/chr36.maf,/depot/data2/galaxy/canFam2/align/hg18/maf/chr37.maf,/depot/data2/galaxy/canFam2/align/hg18/maf/chr38.maf,/depot/data2/galaxy/canFam2/align/hg18/maf/chr4.maf,/depot/data2/galaxy/canFam2/align/hg18/maf/chr5.maf,/depot/data2/galaxy/canFam2/align/hg18/maf/chr6.maf,/depot/data2/galaxy/canFam2/align/hg18/maf/chr7.maf,/depot/data2/galaxy/canFam2/align/hg18/maf/chr8.maf,/depot/data2/galaxy/canFam2/align/hg18/maf/chr9.maf,/depot/data2/galaxy/canFam2/align/hg18/maf/chrM.maf,/depot/data2/galaxy/canFam2/align/hg18/maf/chrUn.maf,/depot/data2/galaxy/canFam2/align/hg18/maf/chrX.maf
+#Pairwise (canFam2,mm6)	PAIRWISE_canFam2_mm6	canFam2,mm6	canFam2,mm6	/depot/data2/galaxy/canFam2/align/mm6/maf/chr1.maf,/depot/data2/galaxy/canFam2/align/mm6/maf/chr10.maf,/depot/data2/galaxy/canFam2/align/mm6/maf/chr11.maf,/depot/data2/galaxy/canFam2/align/mm6/maf/chr12.maf,/depot/data2/galaxy/canFam2/align/mm6/maf/chr13.maf,/depot/data2/galaxy/canFam2/align/mm6/maf/chr14.maf,/depot/data2/galaxy/canFam2/align/mm6/maf/chr15.maf,/depot/data2/galaxy/canFam2/align/mm6/maf/chr16.maf,/depot/data2/galaxy/canFam2/align/mm6/maf/chr17.maf,/depot/data2/galaxy/canFam2/align/mm6/maf/chr18.maf,/depot/data2/galaxy/canFam2/align/mm6/maf/chr19.maf,/depot/data2/galaxy/canFam2/align/mm6/maf/chr2.maf,/depot/data2/galaxy/canFam2/align/mm6/maf/chr20.maf,/depot/data2/galaxy/canFam2/align/mm6/maf/chr21.maf,/depot/data2/galaxy/canFam2/align/mm6/maf/chr22.maf,/depot/data2/galaxy/canFam2/align/mm6/maf/chr23.maf,/depot/data2/galaxy/canFam2/align/mm6/maf/chr24.maf,/depot/data2/galaxy/canFam2/align/mm6/maf/chr25.maf,/depot/data2/galaxy/canFam2/align/mm6/maf/chr26.maf,/depot/data2/galaxy/canFam2/align/mm6/maf/chr27.maf,/depot/data2/galaxy/canFam2/align/mm6/maf/chr28.maf,/depot/data2/galaxy/canFam2/align/mm6/maf/chr29.maf,/depot/data2/galaxy/canFam2/align/mm6/maf/chr3.maf,/depot/data2/galaxy/canFam2/align/mm6/maf/chr30.maf,/depot/data2/galaxy/canFam2/align/mm6/maf/chr31.maf,/depot/data2/galaxy/canFam2/align/mm6/maf/chr32.maf,/depot/data2/galaxy/canFam2/align/mm6/maf/chr33.maf,/depot/data2/galaxy/canFam2/align/mm6/maf/chr34.maf,/depot/data2/galaxy/canFam2/align/mm6/maf/chr35.maf,/depot/data2/galaxy/canFam2/align/mm6/maf/chr36.maf,/depot/data2/galaxy/canFam2/align/mm6/maf/chr37.maf,/depot/data2/galaxy/canFam2/align/mm6/maf/chr38.maf,/depot/data2/galaxy/canFam2/align/mm6/maf/chr4.maf,/depot/data2/galaxy/canFam2/align/mm6/maf/chr5.maf,/depot/data2/galaxy/canFam2/align/mm6/maf/chr6.maf,/depot/data2/galaxy/canFam2/align/mm6/maf/chr7.maf,/depot/data2/galaxy/canFam2/align/mm6/maf/chr8.maf,/depot/data2/galaxy/canFam2/align/mm6/maf/chr9.maf,/depot/data2/galaxy/canFam2/align/mm6/maf/chrM.maf,/depot/data2/galaxy/canFam2/align/mm6/maf/chrUn.maf,/depot/data2/galaxy/canFam2/align/mm6/maf/chrX.maf
+#Pairwise (canFam2,mm7)	PAIRWISE_canFam2_mm7	canFam2,mm7	canFam2,mm7	/depot/data2/galaxy/canFam2/align/mm7/maf/chr1.maf,/depot/data2/galaxy/canFam2/align/mm7/maf/chr10.maf,/depot/data2/galaxy/canFam2/align/mm7/maf/chr11.maf,/depot/data2/galaxy/canFam2/align/mm7/maf/chr12.maf,/depot/data2/galaxy/canFam2/align/mm7/maf/chr13.maf,/depot/data2/galaxy/canFam2/align/mm7/maf/chr14.maf,/depot/data2/galaxy/canFam2/align/mm7/maf/chr15.maf,/depot/data2/galaxy/canFam2/align/mm7/maf/chr16.maf,/depot/data2/galaxy/canFam2/align/mm7/maf/chr17.maf,/depot/data2/galaxy/canFam2/align/mm7/maf/chr18.maf,/depot/data2/galaxy/canFam2/align/mm7/maf/chr19.maf,/depot/data2/galaxy/canFam2/align/mm7/maf/chr2.maf,/depot/data2/galaxy/canFam2/align/mm7/maf/chr20.maf,/depot/data2/galaxy/canFam2/align/mm7/maf/chr21.maf,/depot/data2/galaxy/canFam2/align/mm7/maf/chr22.maf,/depot/data2/galaxy/canFam2/align/mm7/maf/chr23.maf,/depot/data2/galaxy/canFam2/align/mm7/maf/chr24.maf,/depot/data2/galaxy/canFam2/align/mm7/maf/chr25.maf,/depot/data2/galaxy/canFam2/align/mm7/maf/chr26.maf,/depot/data2/galaxy/canFam2/align/mm7/maf/chr27.maf,/depot/data2/galaxy/canFam2/align/mm7/maf/chr28.maf,/depot/data2/galaxy/canFam2/align/mm7/maf/chr29.maf,/depot/data2/galaxy/canFam2/align/mm7/maf/chr3.maf,/depot/data2/galaxy/canFam2/align/mm7/maf/chr30.maf,/depot/data2/galaxy/canFam2/align/mm7/maf/chr31.maf,/depot/data2/galaxy/canFam2/align/mm7/maf/chr32.maf,/depot/data2/galaxy/canFam2/align/mm7/maf/chr33.maf,/depot/data2/galaxy/canFam2/align/mm7/maf/chr34.maf,/depot/data2/galaxy/canFam2/align/mm7/maf/chr35.maf,/depot/data2/galaxy/canFam2/align/mm7/maf/chr36.maf,/depot/data2/galaxy/canFam2/align/mm7/maf/chr37.maf,/depot/data2/galaxy/canFam2/align/mm7/maf/chr38.maf,/depot/data2/galaxy/canFam2/align/mm7/maf/chr4.maf,/depot/data2/galaxy/canFam2/align/mm7/maf/chr5.maf,/depot/data2/galaxy/canFam2/align/mm7/maf/chr6.maf,/depot/data2/galaxy/canFam2/align/mm7/maf/chr7.maf,/depot/data2/galaxy/canFam2/align/mm7/maf/chr8.maf,/depot/data2/galaxy/canFam2/align/mm7/maf/chr9.maf,/depot/data2/galaxy/canFam2/align/mm7/maf/chrM.maf,/depot/data2/galaxy/canFam2/align/mm7/maf/chrUn.maf,/depot/data2/galaxy/canFam2/align/mm7/maf/chrX.maf
+#Pairwise (canFam2,mm8)	PAIRWISE_canFam2_mm8	canFam2,mm8	canFam2,mm8	/depot/data2/galaxy/canFam2/align/mm8/maf/chr1.maf,/depot/data2/galaxy/canFam2/align/mm8/maf/chr10.maf,/depot/data2/galaxy/canFam2/align/mm8/maf/chr11.maf,/depot/data2/galaxy/canFam2/align/mm8/maf/chr12.maf,/depot/data2/galaxy/canFam2/align/mm8/maf/chr13.maf,/depot/data2/galaxy/canFam2/align/mm8/maf/chr14.maf,/depot/data2/galaxy/canFam2/align/mm8/maf/chr15.maf,/depot/data2/galaxy/canFam2/align/mm8/maf/chr16.maf,/depot/data2/galaxy/canFam2/align/mm8/maf/chr17.maf,/depot/data2/galaxy/canFam2/align/mm8/maf/chr18.maf,/depot/data2/galaxy/canFam2/align/mm8/maf/chr19.maf,/depot/data2/galaxy/canFam2/align/mm8/maf/chr2.maf,/depot/data2/galaxy/canFam2/align/mm8/maf/chr20.maf,/depot/data2/galaxy/canFam2/align/mm8/maf/chr21.maf,/depot/data2/galaxy/canFam2/align/mm8/maf/chr22.maf,/depot/data2/galaxy/canFam2/align/mm8/maf/chr23.maf,/depot/data2/galaxy/canFam2/align/mm8/maf/chr24.maf,/depot/data2/galaxy/canFam2/align/mm8/maf/chr25.maf,/depot/data2/galaxy/canFam2/align/mm8/maf/chr26.maf,/depot/data2/galaxy/canFam2/align/mm8/maf/chr27.maf,/depot/data2/galaxy/canFam2/align/mm8/maf/chr28.maf,/depot/data2/galaxy/canFam2/align/mm8/maf/chr29.maf,/depot/data2/galaxy/canFam2/align/mm8/maf/chr3.maf,/depot/data2/galaxy/canFam2/align/mm8/maf/chr30.maf,/depot/data2/galaxy/canFam2/align/mm8/maf/chr31.maf,/depot/data2/galaxy/canFam2/align/mm8/maf/chr32.maf,/depot/data2/galaxy/canFam2/align/mm8/maf/chr33.maf,/depot/data2/galaxy/canFam2/align/mm8/maf/chr34.maf,/depot/data2/galaxy/canFam2/align/mm8/maf/chr35.maf,/depot/data2/galaxy/canFam2/align/mm8/maf/chr36.maf,/depot/data2/galaxy/canFam2/align/mm8/maf/chr37.maf,/depot/data2/galaxy/canFam2/align/mm8/maf/chr38.maf,/depot/data2/galaxy/canFam2/align/mm8/maf/chr4.maf,/depot/data2/galaxy/canFam2/align/mm8/maf/chr5.maf,/depot/data2/galaxy/canFam2/align/mm8/maf/chr6.maf,/depot/data2/galaxy/canFam2/align/mm8/maf/chr7.maf,/depot/data2/galaxy/canFam2/align/mm8/maf/chr8.maf,/depot/data2/galaxy/canFam2/align/mm8/maf/chr9.maf,/depot/data2/galaxy/canFam2/align/mm8/maf/chrM.maf,/depot/data2/galaxy/canFam2/align/mm8/maf/chrUn.maf,/depot/data2/galaxy/canFam2/align/mm8/maf/chrX.maf
+#Pairwise (canFam2,rn3)	PAIRWISE_canFam2_rn3	canFam2,rn3	canFam2,rn3	/depot/data2/galaxy/canFam2/align/rn3/maf/chr1.maf,/depot/data2/galaxy/canFam2/align/rn3/maf/chr10.maf,/depot/data2/galaxy/canFam2/align/rn3/maf/chr11.maf,/depot/data2/galaxy/canFam2/align/rn3/maf/chr12.maf,/depot/data2/galaxy/canFam2/align/rn3/maf/chr13.maf,/depot/data2/galaxy/canFam2/align/rn3/maf/chr14.maf,/depot/data2/galaxy/canFam2/align/rn3/maf/chr15.maf,/depot/data2/galaxy/canFam2/align/rn3/maf/chr16.maf,/depot/data2/galaxy/canFam2/align/rn3/maf/chr17.maf,/depot/data2/galaxy/canFam2/align/rn3/maf/chr18.maf,/depot/data2/galaxy/canFam2/align/rn3/maf/chr19.maf,/depot/data2/galaxy/canFam2/align/rn3/maf/chr2.maf,/depot/data2/galaxy/canFam2/align/rn3/maf/chr20.maf,/depot/data2/galaxy/canFam2/align/rn3/maf/chr21.maf,/depot/data2/galaxy/canFam2/align/rn3/maf/chr22.maf,/depot/data2/galaxy/canFam2/align/rn3/maf/chr23.maf,/depot/data2/galaxy/canFam2/align/rn3/maf/chr24.maf,/depot/data2/galaxy/canFam2/align/rn3/maf/chr25.maf,/depot/data2/galaxy/canFam2/align/rn3/maf/chr26.maf,/depot/data2/galaxy/canFam2/align/rn3/maf/chr27.maf,/depot/data2/galaxy/canFam2/align/rn3/maf/chr28.maf,/depot/data2/galaxy/canFam2/align/rn3/maf/chr29.maf,/depot/data2/galaxy/canFam2/align/rn3/maf/chr3.maf,/depot/data2/galaxy/canFam2/align/rn3/maf/chr30.maf,/depot/data2/galaxy/canFam2/align/rn3/maf/chr31.maf,/depot/data2/galaxy/canFam2/align/rn3/maf/chr32.maf,/depot/data2/galaxy/canFam2/align/rn3/maf/chr33.maf,/depot/data2/galaxy/canFam2/align/rn3/maf/chr34.maf,/depot/data2/galaxy/canFam2/align/rn3/maf/chr35.maf,/depot/data2/galaxy/canFam2/align/rn3/maf/chr36.maf,/depot/data2/galaxy/canFam2/align/rn3/maf/chr37.maf,/depot/data2/galaxy/canFam2/align/rn3/maf/chr38.maf,/depot/data2/galaxy/canFam2/align/rn3/maf/chr4.maf,/depot/data2/galaxy/canFam2/align/rn3/maf/chr5.maf,/depot/data2/galaxy/canFam2/align/rn3/maf/chr6.maf,/depot/data2/galaxy/canFam2/align/rn3/maf/chr7.maf,/depot/data2/galaxy/canFam2/align/rn3/maf/chr8.maf,/depot/data2/galaxy/canFam2/align/rn3/maf/chr9.maf,/depot/data2/galaxy/canFam2/align/rn3/maf/chrM.maf,/depot/data2/galaxy/canFam2/align/rn3/maf/chrUn.maf,/depot/data2/galaxy/canFam2/align/rn3/maf/chrX.maf
+#Pairwise (canFam2,rn4)	PAIRWISE_canFam2_rn4	canFam2,rn4	canFam2,rn4	/depot/data2/galaxy/canFam2/align/rn4/maf/chr1.maf,/depot/data2/galaxy/canFam2/align/rn4/maf/chr10.maf,/depot/data2/galaxy/canFam2/align/rn4/maf/chr11.maf,/depot/data2/galaxy/canFam2/align/rn4/maf/chr12.maf,/depot/data2/galaxy/canFam2/align/rn4/maf/chr13.maf,/depot/data2/galaxy/canFam2/align/rn4/maf/chr14.maf,/depot/data2/galaxy/canFam2/align/rn4/maf/chr15.maf,/depot/data2/galaxy/canFam2/align/rn4/maf/chr16.maf,/depot/data2/galaxy/canFam2/align/rn4/maf/chr17.maf,/depot/data2/galaxy/canFam2/align/rn4/maf/chr18.maf,/depot/data2/galaxy/canFam2/align/rn4/maf/chr19.maf,/depot/data2/galaxy/canFam2/align/rn4/maf/chr2.maf,/depot/data2/galaxy/canFam2/align/rn4/maf/chr20.maf,/depot/data2/galaxy/canFam2/align/rn4/maf/chr21.maf,/depot/data2/galaxy/canFam2/align/rn4/maf/chr22.maf,/depot/data2/galaxy/canFam2/align/rn4/maf/chr23.maf,/depot/data2/galaxy/canFam2/align/rn4/maf/chr24.maf,/depot/data2/galaxy/canFam2/align/rn4/maf/chr25.maf,/depot/data2/galaxy/canFam2/align/rn4/maf/chr26.maf,/depot/data2/galaxy/canFam2/align/rn4/maf/chr27.maf,/depot/data2/galaxy/canFam2/align/rn4/maf/chr28.maf,/depot/data2/galaxy/canFam2/align/rn4/maf/chr29.maf,/depot/data2/galaxy/canFam2/align/rn4/maf/chr3.maf,/depot/data2/galaxy/canFam2/align/rn4/maf/chr30.maf,/depot/data2/galaxy/canFam2/align/rn4/maf/chr31.maf,/depot/data2/galaxy/canFam2/align/rn4/maf/chr32.maf,/depot/data2/galaxy/canFam2/align/rn4/maf/chr33.maf,/depot/data2/galaxy/canFam2/align/rn4/maf/chr34.maf,/depot/data2/galaxy/canFam2/align/rn4/maf/chr35.maf,/depot/data2/galaxy/canFam2/align/rn4/maf/chr36.maf,/depot/data2/galaxy/canFam2/align/rn4/maf/chr37.maf,/depot/data2/galaxy/canFam2/align/rn4/maf/chr38.maf,/depot/data2/galaxy/canFam2/align/rn4/maf/chr4.maf,/depot/data2/galaxy/canFam2/align/rn4/maf/chr5.maf,/depot/data2/galaxy/canFam2/align/rn4/maf/chr6.maf,/depot/data2/galaxy/canFam2/align/rn4/maf/chr7.maf,/depot/data2/galaxy/canFam2/align/rn4/maf/chr8.maf,/depot/data2/galaxy/canFam2/align/rn4/maf/chr9.maf,/depot/data2/galaxy/canFam2/align/rn4/maf/chrM.maf,/depot/data2/galaxy/canFam2/align/rn4/maf/chrUn.maf,/depot/data2/galaxy/canFam2/align/rn4/maf/chrX.maf
+#Pairwise (danRer2,fr1)	PAIRWISE_danRer2_fr1	danRer2,fr1	danRer2,fr1	/depot/data2/galaxy/danRer2/align/fr1/maf/chr1.maf,/depot/data2/galaxy/danRer2/align/fr1/maf/chr10.maf,/depot/data2/galaxy/danRer2/align/fr1/maf/chr11.maf,/depot/data2/galaxy/danRer2/align/fr1/maf/chr12.maf,/depot/data2/galaxy/danRer2/align/fr1/maf/chr13.maf,/depot/data2/galaxy/danRer2/align/fr1/maf/chr14.maf,/depot/data2/galaxy/danRer2/align/fr1/maf/chr15.maf,/depot/data2/galaxy/danRer2/align/fr1/maf/chr16.maf,/depot/data2/galaxy/danRer2/align/fr1/maf/chr17.maf,/depot/data2/galaxy/danRer2/align/fr1/maf/chr18.maf,/depot/data2/galaxy/danRer2/align/fr1/maf/chr19.maf,/depot/data2/galaxy/danRer2/align/fr1/maf/chr2.maf,/depot/data2/galaxy/danRer2/align/fr1/maf/chr20.maf,/depot/data2/galaxy/danRer2/align/fr1/maf/chr21.maf,/depot/data2/galaxy/danRer2/align/fr1/maf/chr22.maf,/depot/data2/galaxy/danRer2/align/fr1/maf/chr23.maf,/depot/data2/galaxy/danRer2/align/fr1/maf/chr24.maf,/depot/data2/galaxy/danRer2/align/fr1/maf/chr25.maf,/depot/data2/galaxy/danRer2/align/fr1/maf/chr3.maf,/depot/data2/galaxy/danRer2/align/fr1/maf/chr4.maf,/depot/data2/galaxy/danRer2/align/fr1/maf/chr5.maf,/depot/data2/galaxy/danRer2/align/fr1/maf/chr6.maf,/depot/data2/galaxy/danRer2/align/fr1/maf/chr7.maf,/depot/data2/galaxy/danRer2/align/fr1/maf/chr8.maf,/depot/data2/galaxy/danRer2/align/fr1/maf/chr9.maf,/depot/data2/galaxy/danRer2/align/fr1/maf/chrM.maf,/depot/data2/galaxy/danRer2/align/fr1/maf/chrNA.maf,/depot/data2/galaxy/danRer2/align/fr1/maf/chrUn.maf
+#Pairwise (danRer2,hg17)	PAIRWISE_danRer2_hg17	danRer2,hg17	danRer2,hg17	/depot/data2/galaxy/danRer2/align/hg17/maf/chr1.maf,/depot/data2/galaxy/danRer2/align/hg17/maf/chr10.maf,/depot/data2/galaxy/danRer2/align/hg17/maf/chr11.maf,/depot/data2/galaxy/danRer2/align/hg17/maf/chr12.maf,/depot/data2/galaxy/danRer2/align/hg17/maf/chr13.maf,/depot/data2/galaxy/danRer2/align/hg17/maf/chr14.maf,/depot/data2/galaxy/danRer2/align/hg17/maf/chr15.maf,/depot/data2/galaxy/danRer2/align/hg17/maf/chr16.maf,/depot/data2/galaxy/danRer2/align/hg17/maf/chr17.maf,/depot/data2/galaxy/danRer2/align/hg17/maf/chr18.maf,/depot/data2/galaxy/danRer2/align/hg17/maf/chr19.maf,/depot/data2/galaxy/danRer2/align/hg17/maf/chr2.maf,/depot/data2/galaxy/danRer2/align/hg17/maf/chr20.maf,/depot/data2/galaxy/danRer2/align/hg17/maf/chr21.maf,/depot/data2/galaxy/danRer2/align/hg17/maf/chr22.maf,/depot/data2/galaxy/danRer2/align/hg17/maf/chr23.maf,/depot/data2/galaxy/danRer2/align/hg17/maf/chr24.maf,/depot/data2/galaxy/danRer2/align/hg17/maf/chr25.maf,/depot/data2/galaxy/danRer2/align/hg17/maf/chr3.maf,/depot/data2/galaxy/danRer2/align/hg17/maf/chr4.maf,/depot/data2/galaxy/danRer2/align/hg17/maf/chr5.maf,/depot/data2/galaxy/danRer2/align/hg17/maf/chr6.maf,/depot/data2/galaxy/danRer2/align/hg17/maf/chr7.maf,/depot/data2/galaxy/danRer2/align/hg17/maf/chr8.maf,/depot/data2/galaxy/danRer2/align/hg17/maf/chr9.maf,/depot/data2/galaxy/danRer2/align/hg17/maf/chrM.maf,/depot/data2/galaxy/danRer2/align/hg17/maf/chrNA.maf,/depot/data2/galaxy/danRer2/align/hg17/maf/chrUn.maf
+#Pairwise (danRer2,mm6)	PAIRWISE_danRer2_mm6	danRer2,mm6	danRer2,mm6	/depot/data2/galaxy/danRer2/align/mm6/maf/chr1.maf,/depot/data2/galaxy/danRer2/align/mm6/maf/chr10.maf,/depot/data2/galaxy/danRer2/align/mm6/maf/chr11.maf,/depot/data2/galaxy/danRer2/align/mm6/maf/chr12.maf,/depot/data2/galaxy/danRer2/align/mm6/maf/chr13.maf,/depot/data2/galaxy/danRer2/align/mm6/maf/chr14.maf,/depot/data2/galaxy/danRer2/align/mm6/maf/chr15.maf,/depot/data2/galaxy/danRer2/align/mm6/maf/chr16.maf,/depot/data2/galaxy/danRer2/align/mm6/maf/chr17.maf,/depot/data2/galaxy/danRer2/align/mm6/maf/chr18.maf,/depot/data2/galaxy/danRer2/align/mm6/maf/chr19.maf,/depot/data2/galaxy/danRer2/align/mm6/maf/chr2.maf,/depot/data2/galaxy/danRer2/align/mm6/maf/chr20.maf,/depot/data2/galaxy/danRer2/align/mm6/maf/chr21.maf,/depot/data2/galaxy/danRer2/align/mm6/maf/chr22.maf,/depot/data2/galaxy/danRer2/align/mm6/maf/chr23.maf,/depot/data2/galaxy/danRer2/align/mm6/maf/chr24.maf,/depot/data2/galaxy/danRer2/align/mm6/maf/chr25.maf,/depot/data2/galaxy/danRer2/align/mm6/maf/chr3.maf,/depot/data2/galaxy/danRer2/align/mm6/maf/chr4.maf,/depot/data2/galaxy/danRer2/align/mm6/maf/chr5.maf,/depot/data2/galaxy/danRer2/align/mm6/maf/chr6.maf,/depot/data2/galaxy/danRer2/align/mm6/maf/chr7.maf,/depot/data2/galaxy/danRer2/align/mm6/maf/chr8.maf,/depot/data2/galaxy/danRer2/align/mm6/maf/chr9.maf,/depot/data2/galaxy/danRer2/align/mm6/maf/chrM.maf,/depot/data2/galaxy/danRer2/align/mm6/maf/chrNA.maf,/depot/data2/galaxy/danRer2/align/mm6/maf/chrUn.maf
+#Pairwise (danRer2,tetNig1)	PAIRWISE_danRer2_tetNig1	danRer2,tetNig1	danRer2,tetNig1	/depot/data2/galaxy/danRer2/align/tetNig1/maf/chr1.maf,/depot/data2/galaxy/danRer2/align/tetNig1/maf/chr10.maf,/depot/data2/galaxy/danRer2/align/tetNig1/maf/chr11.maf,/depot/data2/galaxy/danRer2/align/tetNig1/maf/chr12.maf,/depot/data2/galaxy/danRer2/align/tetNig1/maf/chr13.maf,/depot/data2/galaxy/danRer2/align/tetNig1/maf/chr14.maf,/depot/data2/galaxy/danRer2/align/tetNig1/maf/chr15.maf,/depot/data2/galaxy/danRer2/align/tetNig1/maf/chr16.maf,/depot/data2/galaxy/danRer2/align/tetNig1/maf/chr17.maf,/depot/data2/galaxy/danRer2/align/tetNig1/maf/chr18.maf,/depot/data2/galaxy/danRer2/align/tetNig1/maf/chr19.maf,/depot/data2/galaxy/danRer2/align/tetNig1/maf/chr2.maf,/depot/data2/galaxy/danRer2/align/tetNig1/maf/chr20.maf,/depot/data2/galaxy/danRer2/align/tetNig1/maf/chr21.maf,/depot/data2/galaxy/danRer2/align/tetNig1/maf/chr22.maf,/depot/data2/galaxy/danRer2/align/tetNig1/maf/chr23.maf,/depot/data2/galaxy/danRer2/align/tetNig1/maf/chr24.maf,/depot/data2/galaxy/danRer2/align/tetNig1/maf/chr25.maf,/depot/data2/galaxy/danRer2/align/tetNig1/maf/chr3.maf,/depot/data2/galaxy/danRer2/align/tetNig1/maf/chr4.maf,/depot/data2/galaxy/danRer2/align/tetNig1/maf/chr5.maf,/depot/data2/galaxy/danRer2/align/tetNig1/maf/chr6.maf,/depot/data2/galaxy/danRer2/align/tetNig1/maf/chr7.maf,/depot/data2/galaxy/danRer2/align/tetNig1/maf/chr8.maf,/depot/data2/galaxy/danRer2/align/tetNig1/maf/chr9.maf,/depot/data2/galaxy/danRer2/align/tetNig1/maf/chrM.maf,/depot/data2/galaxy/danRer2/align/tetNig1/maf/chrNA.maf,/depot/data2/galaxy/danRer2/align/tetNig1/maf/chrUn.maf
+#Pairwise (danRer3,fr1)	PAIRWISE_danRer3_fr1	danRer3,fr1	danRer3,fr1	/depot/data2/galaxy/danRer3/align/fr1/maf/chr1.maf,/depot/data2/galaxy/danRer3/align/fr1/maf/chr10.maf,/depot/data2/galaxy/danRer3/align/fr1/maf/chr11.maf,/depot/data2/galaxy/danRer3/align/fr1/maf/chr12.maf,/depot/data2/galaxy/danRer3/align/fr1/maf/chr13.maf,/depot/data2/galaxy/danRer3/align/fr1/maf/chr14.maf,/depot/data2/galaxy/danRer3/align/fr1/maf/chr15.maf,/depot/data2/galaxy/danRer3/align/fr1/maf/chr16.maf,/depot/data2/galaxy/danRer3/align/fr1/maf/chr17.maf,/depot/data2/galaxy/danRer3/align/fr1/maf/chr18.maf,/depot/data2/galaxy/danRer3/align/fr1/maf/chr19.maf,/depot/data2/galaxy/danRer3/align/fr1/maf/chr2.maf,/depot/data2/galaxy/danRer3/align/fr1/maf/chr20.maf,/depot/data2/galaxy/danRer3/align/fr1/maf/chr21.maf,/depot/data2/galaxy/danRer3/align/fr1/maf/chr22.maf,/depot/data2/galaxy/danRer3/align/fr1/maf/chr23.maf,/depot/data2/galaxy/danRer3/align/fr1/maf/chr24.maf,/depot/data2/galaxy/danRer3/align/fr1/maf/chr25.maf,/depot/data2/galaxy/danRer3/align/fr1/maf/chr3.maf,/depot/data2/galaxy/danRer3/align/fr1/maf/chr4.maf,/depot/data2/galaxy/danRer3/align/fr1/maf/chr5.maf,/depot/data2/galaxy/danRer3/align/fr1/maf/chr6.maf,/depot/data2/galaxy/danRer3/align/fr1/maf/chr7.maf,/depot/data2/galaxy/danRer3/align/fr1/maf/chr8.maf,/depot/data2/galaxy/danRer3/align/fr1/maf/chr9.maf,/depot/data2/galaxy/danRer3/align/fr1/maf/chrM.maf,/depot/data2/galaxy/danRer3/align/fr1/maf/chrNA.maf,/depot/data2/galaxy/danRer3/align/fr1/maf/chrUn.maf
+#Pairwise (danRer3,hg18)	PAIRWISE_danRer3_hg18	danRer3,hg18	danRer3,hg18	/depot/data2/galaxy/danRer3/align/hg18/maf/chr1.maf,/depot/data2/galaxy/danRer3/align/hg18/maf/chr10.maf,/depot/data2/galaxy/danRer3/align/hg18/maf/chr11.maf,/depot/data2/galaxy/danRer3/align/hg18/maf/chr12.maf,/depot/data2/galaxy/danRer3/align/hg18/maf/chr13.maf,/depot/data2/galaxy/danRer3/align/hg18/maf/chr14.maf,/depot/data2/galaxy/danRer3/align/hg18/maf/chr15.maf,/depot/data2/galaxy/danRer3/align/hg18/maf/chr16.maf,/depot/data2/galaxy/danRer3/align/hg18/maf/chr17.maf,/depot/data2/galaxy/danRer3/align/hg18/maf/chr18.maf,/depot/data2/galaxy/danRer3/align/hg18/maf/chr19.maf,/depot/data2/galaxy/danRer3/align/hg18/maf/chr2.maf,/depot/data2/galaxy/danRer3/align/hg18/maf/chr20.maf,/depot/data2/galaxy/danRer3/align/hg18/maf/chr21.maf,/depot/data2/galaxy/danRer3/align/hg18/maf/chr22.maf,/depot/data2/galaxy/danRer3/align/hg18/maf/chr23.maf,/depot/data2/galaxy/danRer3/align/hg18/maf/chr24.maf,/depot/data2/galaxy/danRer3/align/hg18/maf/chr25.maf,/depot/data2/galaxy/danRer3/align/hg18/maf/chr3.maf,/depot/data2/galaxy/danRer3/align/hg18/maf/chr4.maf,/depot/data2/galaxy/danRer3/align/hg18/maf/chr5.maf,/depot/data2/galaxy/danRer3/align/hg18/maf/chr6.maf,/depot/data2/galaxy/danRer3/align/hg18/maf/chr7.maf,/depot/data2/galaxy/danRer3/align/hg18/maf/chr8.maf,/depot/data2/galaxy/danRer3/align/hg18/maf/chr9.maf,/depot/data2/galaxy/danRer3/align/hg18/maf/chrM.maf,/depot/data2/galaxy/danRer3/align/hg18/maf/chrNA.maf,/depot/data2/galaxy/danRer3/align/hg18/maf/chrUn.maf
+#Pairwise (danRer3,mm7)	PAIRWISE_danRer3_mm7	danRer3,mm7	danRer3,mm7	/depot/data2/galaxy/danRer3/align/mm7/maf/chr1.maf,/depot/data2/galaxy/danRer3/align/mm7/maf/chr10.maf,/depot/data2/galaxy/danRer3/align/mm7/maf/chr11.maf,/depot/data2/galaxy/danRer3/align/mm7/maf/chr12.maf,/depot/data2/galaxy/danRer3/align/mm7/maf/chr13.maf,/depot/data2/galaxy/danRer3/align/mm7/maf/chr14.maf,/depot/data2/galaxy/danRer3/align/mm7/maf/chr15.maf,/depot/data2/galaxy/danRer3/align/mm7/maf/chr16.maf,/depot/data2/galaxy/danRer3/align/mm7/maf/chr17.maf,/depot/data2/galaxy/danRer3/align/mm7/maf/chr18.maf,/depot/data2/galaxy/danRer3/align/mm7/maf/chr19.maf,/depot/data2/galaxy/danRer3/align/mm7/maf/chr2.maf,/depot/data2/galaxy/danRer3/align/mm7/maf/chr20.maf,/depot/data2/galaxy/danRer3/align/mm7/maf/chr21.maf,/depot/data2/galaxy/danRer3/align/mm7/maf/chr22.maf,/depot/data2/galaxy/danRer3/align/mm7/maf/chr23.maf,/depot/data2/galaxy/danRer3/align/mm7/maf/chr24.maf,/depot/data2/galaxy/danRer3/align/mm7/maf/chr25.maf,/depot/data2/galaxy/danRer3/align/mm7/maf/chr3.maf,/depot/data2/galaxy/danRer3/align/mm7/maf/chr4.maf,/depot/data2/galaxy/danRer3/align/mm7/maf/chr5.maf,/depot/data2/galaxy/danRer3/align/mm7/maf/chr6.maf,/depot/data2/galaxy/danRer3/align/mm7/maf/chr7.maf,/depot/data2/galaxy/danRer3/align/mm7/maf/chr8.maf,/depot/data2/galaxy/danRer3/align/mm7/maf/chr9.maf,/depot/data2/galaxy/danRer3/align/mm7/maf/chrM.maf,/depot/data2/galaxy/danRer3/align/mm7/maf/chrNA.maf,/depot/data2/galaxy/danRer3/align/mm7/maf/chrUn.maf
+#Pairwise (danRer3,mm8)	PAIRWISE_danRer3_mm8	danRer3,mm8	danRer3,mm8	/depot/data2/galaxy/danRer3/align/mm8/maf/chr1.maf,/depot/data2/galaxy/danRer3/align/mm8/maf/chr10.maf,/depot/data2/galaxy/danRer3/align/mm8/maf/chr11.maf,/depot/data2/galaxy/danRer3/align/mm8/maf/chr12.maf,/depot/data2/galaxy/danRer3/align/mm8/maf/chr13.maf,/depot/data2/galaxy/danRer3/align/mm8/maf/chr14.maf,/depot/data2/galaxy/danRer3/align/mm8/maf/chr15.maf,/depot/data2/galaxy/danRer3/align/mm8/maf/chr16.maf,/depot/data2/galaxy/danRer3/align/mm8/maf/chr17.maf,/depot/data2/galaxy/danRer3/align/mm8/maf/chr18.maf,/depot/data2/galaxy/danRer3/align/mm8/maf/chr19.maf,/depot/data2/galaxy/danRer3/align/mm8/maf/chr2.maf,/depot/data2/galaxy/danRer3/align/mm8/maf/chr20.maf,/depot/data2/galaxy/danRer3/align/mm8/maf/chr21.maf,/depot/data2/galaxy/danRer3/align/mm8/maf/chr22.maf,/depot/data2/galaxy/danRer3/align/mm8/maf/chr23.maf,/depot/data2/galaxy/danRer3/align/mm8/maf/chr24.maf,/depot/data2/galaxy/danRer3/align/mm8/maf/chr25.maf,/depot/data2/galaxy/danRer3/align/mm8/maf/chr3.maf,/depot/data2/galaxy/danRer3/align/mm8/maf/chr4.maf,/depot/data2/galaxy/danRer3/align/mm8/maf/chr5.maf,/depot/data2/galaxy/danRer3/align/mm8/maf/chr6.maf,/depot/data2/galaxy/danRer3/align/mm8/maf/chr7.maf,/depot/data2/galaxy/danRer3/align/mm8/maf/chr8.maf,/depot/data2/galaxy/danRer3/align/mm8/maf/chr9.maf,/depot/data2/galaxy/danRer3/align/mm8/maf/chrM.maf
+#Pairwise (danRer3,tetNig1)	PAIRWISE_danRer3_tetNig1	danRer3,tetNig1	danRer3,tetNig1	/depot/data2/galaxy/danRer3/align/tetNig1/maf/chr1.maf,/depot/data2/galaxy/danRer3/align/tetNig1/maf/chr10.maf,/depot/data2/galaxy/danRer3/align/tetNig1/maf/chr11.maf,/depot/data2/galaxy/danRer3/align/tetNig1/maf/chr12.maf,/depot/data2/galaxy/danRer3/align/tetNig1/maf/chr13.maf,/depot/data2/galaxy/danRer3/align/tetNig1/maf/chr14.maf,/depot/data2/galaxy/danRer3/align/tetNig1/maf/chr15.maf,/depot/data2/galaxy/danRer3/align/tetNig1/maf/chr16.maf,/depot/data2/galaxy/danRer3/align/tetNig1/maf/chr17.maf,/depot/data2/galaxy/danRer3/align/tetNig1/maf/chr18.maf,/depot/data2/galaxy/danRer3/align/tetNig1/maf/chr19.maf,/depot/data2/galaxy/danRer3/align/tetNig1/maf/chr2.maf,/depot/data2/galaxy/danRer3/align/tetNig1/maf/chr20.maf,/depot/data2/galaxy/danRer3/align/tetNig1/maf/chr21.maf,/depot/data2/galaxy/danRer3/align/tetNig1/maf/chr22.maf,/depot/data2/galaxy/danRer3/align/tetNig1/maf/chr23.maf,/depot/data2/galaxy/danRer3/align/tetNig1/maf/chr24.maf,/depot/data2/galaxy/danRer3/align/tetNig1/maf/chr25.maf,/depot/data2/galaxy/danRer3/align/tetNig1/maf/chr3.maf,/depot/data2/galaxy/danRer3/align/tetNig1/maf/chr4.maf,/depot/data2/galaxy/danRer3/align/tetNig1/maf/chr5.maf,/depot/data2/galaxy/danRer3/align/tetNig1/maf/chr6.maf,/depot/data2/galaxy/danRer3/align/tetNig1/maf/chr7.maf,/depot/data2/galaxy/danRer3/align/tetNig1/maf/chr8.maf,/depot/data2/galaxy/danRer3/align/tetNig1/maf/chr9.maf,/depot/data2/galaxy/danRer3/align/tetNig1/maf/chrM.maf,/depot/data2/galaxy/danRer3/align/tetNig1/maf/chrNA.maf,/depot/data2/galaxy/danRer3/align/tetNig1/maf/chrUn.maf
+#Pairwise (danRer4,fr1)	PAIRWISE_danRer4_fr1	danRer4,fr1	danRer4,fr1	/depot/data2/galaxy/danRer4/align/fr1/maf/chr1.maf,/depot/data2/galaxy/danRer4/align/fr1/maf/chr10.maf,/depot/data2/galaxy/danRer4/align/fr1/maf/chr11.maf,/depot/data2/galaxy/danRer4/align/fr1/maf/chr12.maf,/depot/data2/galaxy/danRer4/align/fr1/maf/chr13.maf,/depot/data2/galaxy/danRer4/align/fr1/maf/chr14.maf,/depot/data2/galaxy/danRer4/align/fr1/maf/chr15.maf,/depot/data2/galaxy/danRer4/align/fr1/maf/chr16.maf,/depot/data2/galaxy/danRer4/align/fr1/maf/chr17.maf,/depot/data2/galaxy/danRer4/align/fr1/maf/chr18.maf,/depot/data2/galaxy/danRer4/align/fr1/maf/chr19.maf,/depot/data2/galaxy/danRer4/align/fr1/maf/chr2.maf,/depot/data2/galaxy/danRer4/align/fr1/maf/chr20.maf,/depot/data2/galaxy/danRer4/align/fr1/maf/chr21.maf,/depot/data2/galaxy/danRer4/align/fr1/maf/chr22.maf,/depot/data2/galaxy/danRer4/align/fr1/maf/chr23.maf,/depot/data2/galaxy/danRer4/align/fr1/maf/chr24.maf,/depot/data2/galaxy/danRer4/align/fr1/maf/chr25.maf,/depot/data2/galaxy/danRer4/align/fr1/maf/chr3.maf,/depot/data2/galaxy/danRer4/align/fr1/maf/chr4.maf,/depot/data2/galaxy/danRer4/align/fr1/maf/chr5.maf,/depot/data2/galaxy/danRer4/align/fr1/maf/chr6.maf,/depot/data2/galaxy/danRer4/align/fr1/maf/chr7.maf,/depot/data2/galaxy/danRer4/align/fr1/maf/chr8.maf,/depot/data2/galaxy/danRer4/align/fr1/maf/chr9.maf,/depot/data2/galaxy/danRer4/align/fr1/maf/chrM.maf,/depot/data2/galaxy/danRer4/align/fr1/maf/chrNA_random.maf,/depot/data2/galaxy/danRer4/align/fr1/maf/chrUn_random.maf
+#Pairwise (danRer4,hg18)	PAIRWISE_danRer4_hg18	danRer4,hg18	danRer4,hg18	/depot/data2/galaxy/danRer4/align/hg18/maf/chr1.maf,/depot/data2/galaxy/danRer4/align/hg18/maf/chr10.maf,/depot/data2/galaxy/danRer4/align/hg18/maf/chr11.maf,/depot/data2/galaxy/danRer4/align/hg18/maf/chr12.maf,/depot/data2/galaxy/danRer4/align/hg18/maf/chr13.maf,/depot/data2/galaxy/danRer4/align/hg18/maf/chr14.maf,/depot/data2/galaxy/danRer4/align/hg18/maf/chr15.maf,/depot/data2/galaxy/danRer4/align/hg18/maf/chr16.maf,/depot/data2/galaxy/danRer4/align/hg18/maf/chr17.maf,/depot/data2/galaxy/danRer4/align/hg18/maf/chr18.maf,/depot/data2/galaxy/danRer4/align/hg18/maf/chr19.maf,/depot/data2/galaxy/danRer4/align/hg18/maf/chr2.maf,/depot/data2/galaxy/danRer4/align/hg18/maf/chr20.maf,/depot/data2/galaxy/danRer4/align/hg18/maf/chr21.maf,/depot/data2/galaxy/danRer4/align/hg18/maf/chr22.maf,/depot/data2/galaxy/danRer4/align/hg18/maf/chr23.maf,/depot/data2/galaxy/danRer4/align/hg18/maf/chr24.maf,/depot/data2/galaxy/danRer4/align/hg18/maf/chr25.maf,/depot/data2/galaxy/danRer4/align/hg18/maf/chr3.maf,/depot/data2/galaxy/danRer4/align/hg18/maf/chr4.maf,/depot/data2/galaxy/danRer4/align/hg18/maf/chr5.maf,/depot/data2/galaxy/danRer4/align/hg18/maf/chr6.maf,/depot/data2/galaxy/danRer4/align/hg18/maf/chr7.maf,/depot/data2/galaxy/danRer4/align/hg18/maf/chr8.maf,/depot/data2/galaxy/danRer4/align/hg18/maf/chr9.maf,/depot/data2/galaxy/danRer4/align/hg18/maf/chrM.maf,/depot/data2/galaxy/danRer4/align/hg18/maf/chrNA_random.maf,/depot/data2/galaxy/danRer4/align/hg18/maf/chrUn_random.maf
+#Pairwise (danRer4,mm8)	PAIRWISE_danRer4_mm8	danRer4,mm8	danRer4,mm8	/depot/data2/galaxy/danRer4/align/mm8/maf/chr1.maf,/depot/data2/galaxy/danRer4/align/mm8/maf/chr10.maf,/depot/data2/galaxy/danRer4/align/mm8/maf/chr11.maf,/depot/data2/galaxy/danRer4/align/mm8/maf/chr12.maf,/depot/data2/galaxy/danRer4/align/mm8/maf/chr13.maf,/depot/data2/galaxy/danRer4/align/mm8/maf/chr14.maf,/depot/data2/galaxy/danRer4/align/mm8/maf/chr15.maf,/depot/data2/galaxy/danRer4/align/mm8/maf/chr16.maf,/depot/data2/galaxy/danRer4/align/mm8/maf/chr17.maf,/depot/data2/galaxy/danRer4/align/mm8/maf/chr18.maf,/depot/data2/galaxy/danRer4/align/mm8/maf/chr19.maf,/depot/data2/galaxy/danRer4/align/mm8/maf/chr2.maf,/depot/data2/galaxy/danRer4/align/mm8/maf/chr20.maf,/depot/data2/galaxy/danRer4/align/mm8/maf/chr21.maf,/depot/data2/galaxy/danRer4/align/mm8/maf/chr22.maf,/depot/data2/galaxy/danRer4/align/mm8/maf/chr23.maf,/depot/data2/galaxy/danRer4/align/mm8/maf/chr24.maf,/depot/data2/galaxy/danRer4/align/mm8/maf/chr25.maf,/depot/data2/galaxy/danRer4/align/mm8/maf/chr3.maf,/depot/data2/galaxy/danRer4/align/mm8/maf/chr4.maf,/depot/data2/galaxy/danRer4/align/mm8/maf/chr5.maf,/depot/data2/galaxy/danRer4/align/mm8/maf/chr6.maf,/depot/data2/galaxy/danRer4/align/mm8/maf/chr7.maf,/depot/data2/galaxy/danRer4/align/mm8/maf/chr8.maf,/depot/data2/galaxy/danRer4/align/mm8/maf/chr9.maf,/depot/data2/galaxy/danRer4/align/mm8/maf/chrM.maf,/depot/data2/galaxy/danRer4/align/mm8/maf/chrNA_random.maf,/depot/data2/galaxy/danRer4/align/mm8/maf/chrUn_random.maf
+#Pairwise (danRer4,rn4)	PAIRWISE_danRer4_rn4	danRer4,rn4	danRer4,rn4	/depot/data2/galaxy/danRer4/align/rn4/maf/chr1.maf,/depot/data2/galaxy/danRer4/align/rn4/maf/chr10.maf,/depot/data2/galaxy/danRer4/align/rn4/maf/chr11.maf,/depot/data2/galaxy/danRer4/align/rn4/maf/chr12.maf,/depot/data2/galaxy/danRer4/align/rn4/maf/chr13.maf,/depot/data2/galaxy/danRer4/align/rn4/maf/chr14.maf,/depot/data2/galaxy/danRer4/align/rn4/maf/chr15.maf,/depot/data2/galaxy/danRer4/align/rn4/maf/chr16.maf,/depot/data2/galaxy/danRer4/align/rn4/maf/chr17.maf,/depot/data2/galaxy/danRer4/align/rn4/maf/chr18.maf,/depot/data2/galaxy/danRer4/align/rn4/maf/chr19.maf,/depot/data2/galaxy/danRer4/align/rn4/maf/chr2.maf,/depot/data2/galaxy/danRer4/align/rn4/maf/chr20.maf,/depot/data2/galaxy/danRer4/align/rn4/maf/chr21.maf,/depot/data2/galaxy/danRer4/align/rn4/maf/chr22.maf,/depot/data2/galaxy/danRer4/align/rn4/maf/chr23.maf,/depot/data2/galaxy/danRer4/align/rn4/maf/chr24.maf,/depot/data2/galaxy/danRer4/align/rn4/maf/chr25.maf,/depot/data2/galaxy/danRer4/align/rn4/maf/chr3.maf,/depot/data2/galaxy/danRer4/align/rn4/maf/chr4.maf,/depot/data2/galaxy/danRer4/align/rn4/maf/chr5.maf,/depot/data2/galaxy/danRer4/align/rn4/maf/chr6.maf,/depot/data2/galaxy/danRer4/align/rn4/maf/chr7.maf,/depot/data2/galaxy/danRer4/align/rn4/maf/chr8.maf,/depot/data2/galaxy/danRer4/align/rn4/maf/chr9.maf,/depot/data2/galaxy/danRer4/align/rn4/maf/chrM.maf,/depot/data2/galaxy/danRer4/align/rn4/maf/chrNA_random.maf,/depot/data2/galaxy/danRer4/align/rn4/maf/chrUn_random.maf
+#Pairwise (danRer4,tetNig1)	PAIRWISE_danRer4_tetNig1	danRer4,tetNig1	danRer4,tetNig1	/depot/data2/galaxy/danRer4/align/tetNig1/maf/chr1.maf,/depot/data2/galaxy/danRer4/align/tetNig1/maf/chr10.maf,/depot/data2/galaxy/danRer4/align/tetNig1/maf/chr11.maf,/depot/data2/galaxy/danRer4/align/tetNig1/maf/chr12.maf,/depot/data2/galaxy/danRer4/align/tetNig1/maf/chr13.maf,/depot/data2/galaxy/danRer4/align/tetNig1/maf/chr14.maf,/depot/data2/galaxy/danRer4/align/tetNig1/maf/chr15.maf,/depot/data2/galaxy/danRer4/align/tetNig1/maf/chr16.maf,/depot/data2/galaxy/danRer4/align/tetNig1/maf/chr17.maf,/depot/data2/galaxy/danRer4/align/tetNig1/maf/chr18.maf,/depot/data2/galaxy/danRer4/align/tetNig1/maf/chr19.maf,/depot/data2/galaxy/danRer4/align/tetNig1/maf/chr2.maf,/depot/data2/galaxy/danRer4/align/tetNig1/maf/chr20.maf,/depot/data2/galaxy/danRer4/align/tetNig1/maf/chr21.maf,/depot/data2/galaxy/danRer4/align/tetNig1/maf/chr22.maf,/depot/data2/galaxy/danRer4/align/tetNig1/maf/chr23.maf,/depot/data2/galaxy/danRer4/align/tetNig1/maf/chr24.maf,/depot/data2/galaxy/danRer4/align/tetNig1/maf/chr25.maf,/depot/data2/galaxy/danRer4/align/tetNig1/maf/chr3.maf,/depot/data2/galaxy/danRer4/align/tetNig1/maf/chr4.maf,/depot/data2/galaxy/danRer4/align/tetNig1/maf/chr5.maf,/depot/data2/galaxy/danRer4/align/tetNig1/maf/chr6.maf,/depot/data2/galaxy/danRer4/align/tetNig1/maf/chr7.maf,/depot/data2/galaxy/danRer4/align/tetNig1/maf/chr8.maf,/depot/data2/galaxy/danRer4/align/tetNig1/maf/chr9.maf,/depot/data2/galaxy/danRer4/align/tetNig1/maf/chrM.maf,/depot/data2/galaxy/danRer4/align/tetNig1/maf/chrNA_random.maf,/depot/data2/galaxy/danRer4/align/tetNig1/maf/chrUn_random.maf
Index: /galaxy-central/tool-data/regions.loc
===================================================================
--- /galaxy-central/tool-data/regions.loc (revision 3)
+++ /galaxy-central/tool-data/regions.loc (revision 3)
@@ -0,0 +1,24 @@
+#This is a sample file distributed with Galaxy that is used by some
+#ENCODE tools.  The regions.loc file has this format (white space 
+#characters are TAB characters):
+#
+#<build>	<uid>	<region_description>	<file_path>
+#
+#So, for example, if you had ENCODE Regions for build hg16 stored in 
+#/depot/data2/galaxy/regions/encode_regions_coords_hg16.bed, then the
+#regions.loc entry would look like this:
+#
+#hg16    encode_hg16     ENCODE Regions  /depot/data2/galaxy/regions/encode_regions_coords_hg16.bed
+#
+#and your /depot/data2/galaxy/regions/ directory would 
+#contain all of your regions files (e.g.):
+#
+#-rw-r--r--   1 dan  g2cache 1367 2006-03-14 13:55 encode_regions_coords_hg16.bed
+#-rw-r--r--   1 dan  g2cache 1367 2006-03-14 13:53 encode_regions_coords_hg17.bed
+#...etc...
+#
+#Your regions.loc file should include an entry per line for each region 
+#file you have stored.  For example:
+#
+#hg16	encode_hg16	ENCODE Regions	/depot/data2/galaxy/regions/encode_regions_coords_hg16.bed 
+#hg17	encode_hg17	ENCODE Regions	/depot/data2/galaxy/regions/encode_regions_coords_hg17.bed
Index: /galaxy-central/tool-data/annotation_profiler_options.xml
===================================================================
--- /galaxy-central/tool-data/annotation_profiler_options.xml (revision 3)
+++ /galaxy-central/tool-data/annotation_profiler_options.xml (revision 3)
@@ -0,0 +1,1101 @@
+<filter type="meta_key" name="dbkey" value="hg18">
+  <options>
+    <option name="Mapping and Sequencing Tracks" value="group-map">
+        <option name="STS Markers" value="stsMap"/>
+        <option name="Fosmid End Pairs" value="fosEndPairs"/>
+        <option name="Chromosome Band" value="cytoBand"/>
+        <option name="BAC End Pairs" value="bacEndPairs"/>
+        <option name="FISH Clones" value="fishClones"/>
+        <option name="GC Percent" value="gc5Base"/>
+        <option name="Coverage" value="clonePos"/>
+        <option name="Recomb Rate" value="recombRate"/>
+        <option name="Map Contigs" value="ctgPos"/>
+        <option name="Assembly" value="gold"/>
+        <option name="Gap" value="gap"/>
+        <option name="Chromosome Band (Ideogram)" value="cytoBandIdeo"/>
+    </option>
+    <option name="Comparative Genomics" value="group-compGeno">
+        <option name="chainRn4" value="chainRn4"/>
+        <option name="chainOryLat1" value="chainOryLat1"/>
+        <option name="chainTetNig1" value="chainTetNig1"/>
+        <option name="netDanRer5" value="netDanRer5"/>
+        <option name="netPanTro2" value="netPanTro2"/>
+        <option name="chainCanFam2" value="chainCanFam2"/>
+        <option name="netPonAbe2" value="netPonAbe2"/>
+        <option name="netGasAcu1" value="netGasAcu1"/>
+        <option name="netStrPur2" value="netStrPur2"/>
+        <option name="chainDanRer5" value="chainDanRer5"/>
+        <option name="netGalGal3" value="netGalGal3"/>
+        <option name="netMonDom4" value="netMonDom4"/>
+        <option name="netOryLat1" value="netOryLat1"/>
+        <option name="netMm9" value="netMm9"/>
+        <option name="chainRheMac2" value="chainRheMac2"/>
+        <option name="netOrnAna1" value="netOrnAna1"/>
+        <option name="chainFr2" value="chainFr2"/>
+        <option name="netXenTro2" value="netXenTro2"/>
+        <option name="Cons Indels MmCf" value="consIndelsHgMmCanFam"/>
+        <option name="Tetraodon Ecores" value="ecoresTetNig1"/>
+        <option name="netTetNig1" value="netTetNig1"/>
+        <option name="chainGalGal3" value="chainGalGal3"/>
+        <option name="chainStrPur2" value="chainStrPur2"/>
+        <option name="chainOrnAna1" value="chainOrnAna1"/>
+        <option name="netFelCat3" value="netFelCat3"/>
+        <option name="chainEquCab1" value="chainEquCab1"/>
+        <option name="chainPonAbe2" value="chainPonAbe2"/>
+        <option name="chainFelCat3" value="chainFelCat3"/>
+      <option name="mostConserved28way" value="subtracks-mostConserved28way">
+        <option name="Most Conserved" value="mostConserved28way"/>
+        <option name="Vertebrate" value="phastConsElements28way"/>
+        <option name="Mammal" value="phastConsElements28wayPlacMammal"/>
+      </option>
+        <option name="chainAnoCar1" value="chainAnoCar1"/>
+        <option name="17-Way Cons" value="multiz17way"/>
+        <option name="chainXenTro2" value="chainXenTro2"/>
+        <option name="17-Way Most Cons" value="phastConsElements17way"/>
+        <option name="chainGasAcu1" value="chainGasAcu1"/>
+        <option name="Conservation" value="multiz28way"/>
+        <option name="chainCalJac1" value="chainCalJac1"/>
+        <option name="netCanFam2" value="netCanFam2"/>
+        <option name="chainMm9" value="chainMm9"/>
+        <option name="chainMonDom4" value="chainMonDom4"/>
+        <option name="netCalJac1" value="netCalJac1"/>
+        <option name="netRheMac2" value="netRheMac2"/>
+        <option name="chainPanTro2" value="chainPanTro2"/>
+        <option name="netEquCab1" value="netEquCab1"/>
+        <option name="netFr2" value="netFr2"/>
+        <option name="netAnoCar1" value="netAnoCar1"/>
+        <option name="netBosTau4" value="netBosTau4"/>
+        <option name="chainBosTau4" value="chainBosTau4"/>
+        <option name="netRn4" value="netRn4"/>
+    </option>
+    <option name="Phenotype and Disease Associations" value="group-phenDis">
+      <option name="caseControl" value="subtracks-caseControl">
+        <option name="Case Control" value="caseControl"/>
+        <option name="CCC Bipolar Dis" value="cccTrendPvalBd"/>
+        <option name="CCC Coronary Art" value="cccTrendPvalCad"/>
+        <option name="CCC Crohns Dis" value="cccTrendPvalCd"/>
+        <option name="CCC Hypertension" value="cccTrendPvalHt"/>
+        <option name="CCC Rheum Arth" value="cccTrendPvalRa"/>
+        <option name="CCC T1 Diabetes" value="cccTrendPvalT1d"/>
+        <option name="CCC T2 Diabetes" value="cccTrendPvalT2d"/>
+      </option>
+        <option name="GAD View" value="gad"/>
+        <option name="RGD Human QTL" value="rgdQtl"/>
+        <option name="RGD Rat QTL" value="rgdRatQtl"/>
+      <option name="nimhBipolar" value="subtracks-nimhBipolar">
+        <option name="NIMH Bipolar" value="nimhBipolar"/>
+        <option name="NIMH Bipolar De" value="nimhBipolarDe"/>
+        <option name="NIMH Bipolar Us" value="nimhBipolarUs"/>
+      </option>
+      <option name="jaxQtlMapped" value="subtracks-jaxQtlMapped">
+        <option name="MGI Mouse QTL" value="jaxQtlAsIs"/>
+        <option name="MGI Mouse QTL" value="jaxQtlMapped"/>
+        <option name="MGI Mouse QTL Padded" value="jaxQtlPadded"/>
+      </option>
+    </option>
+    <option name="mRNA and EST Tracks" value="group-rna">
+        <option name="CGAP SAGE" value="cgapSage"/>
+        <option name="est" value="est"/>
+        <option name="UniGene" value="uniGene_3"/>
+        <option name="Gene Bounds" value="rnaCluster"/>
+        <option name="SIB Alt-Splicing" value="sibTxGraph"/>
+        <option name="Spliced ESTs" value="intronEst"/>
+        <option name="Other mRNAs" value="xenoMrna"/>
+        <option name="H-Inv" value="HInvGeneMrna"/>
+        <option name="mrna" value="mrna"/>
+      <option name="polyA" value="subtracks-polyA">
+        <option name="Poly(A)" value="polyA"/>
+        <option name="PolyA_DB" value="polyaDb"/>
+        <option name="Poly(A) SVM" value="polyaPredict"/>
+      </option>
+        <option name="Other ESTs" value="xenoEst"/>
+    </option>
+    <option name="Genes and Gene Prediction Tracks" value="group-genes">
+        <option name="CCDS" value="ccdsGene"/>
+      <option name="augustus" value="subtracks-augustus">
+        <option name="Augustus" value="augustus"/>
+        <option name="Augustus Ab Initio" value="augustusAbinitio"/>
+        <option name="Augustus Hints" value="augustusHints"/>
+        <option name="Augustus De Novo" value="augustusXRA"/>
+      </option>
+        <option name="sno/miRNA" value="wgRna"/>
+        <option name="Geneid Genes" value="geneid"/>
+        <option name="SIB Genes" value="sibGene"/>
+        <option name="Old Known Genes" value="knownGeneOld2"/>
+        <option name="EvoFold" value="evofold"/>
+        <option name="CONTRAST" value="contrastGene"/>
+        <option name="Exoniphy" value="exoniphy"/>
+        <option name="AceView Genes" value="acembly"/>
+      <option name="nscan" value="subtracks-nscan">
+        <option name="N-SCAN" value="nscan"/>
+        <option name="N-SCAN" value="nscanGene"/>
+        <option name="N-SCAN PASA-EST" value="nscanPasaGene"/>
+      </option>
+        <option name="Ensembl Genes" value="ensGene"/>
+        <option name="SGP Genes" value="sgpGene"/>
+        <option name="RefSeq Genes" value="refGene"/>
+        <option name="Genscan Genes" value="genscan"/>
+        <option name="RNA Genes" value="rnaGene"/>
+        <option name="UCSC Genes" value="knownGene"/>
+        <option name="ACEScan" value="acescan"/>
+        <option name="Other RefSeq" value="xenoRefGene"/>
+        <option name="Alt Events" value="knownAlt"/>
+        <option name="ORFeome Clones" value="orfeomeGenes"/>
+        <option name="MGC Genes" value="mgcGenes"/>
+    </option>
+    <option name="Variation and Repeats" value="group-varRep">
+        <option name="Segmental Dups" value="genomicSuperDups"/>
+        <option name="Structural Var" value="cnp"/>
+      <option name="tajdSnp" value="subtracks-tajdSnp">
+        <option name="Tajima's D SNPs" value="tajdSnp"/>
+        <option name="SNPs AD" value="tajdSnpAd"/>
+        <option name="SNPs ED" value="tajdSnpEd"/>
+        <option name="SNPs XD" value="tajdSnpXd"/>
+      </option>
+        <option name="Self Chain" value="chainSelf"/>
+        <option name="RepeatMasker" value="rmsk"/>
+      <option name="snpArray" value="subtracks-snpArray">
+        <option name="SNP Arrays" value="snpArray"/>
+        <option name="Affy 250KNsp" value="snpArrayAffy250Nsp"/>
+        <option name="Affy 250KSty" value="snpArrayAffy250Sty"/>
+        <option name="Affy SNP 5.0" value="snpArrayAffy5"/>
+        <option name="Affy SNP 6.0" value="snpArrayAffy6"/>
+        <option name="Affy SNP 6.0 SV" value="snpArrayAffy6SV"/>
+        <option name="Illumina 300" value="snpArrayIllumina300"/>
+        <option name="Illumina 550" value="snpArrayIllumina550"/>
+        <option name="Illumina 650" value="snpArrayIllumina650"/>
+      </option>
+      <option name="hapmapLdPh" value="subtracks-hapmapLdPh">
+        <option name="HapMap LD Phased" value="hapmapLdPh"/>
+        <option name="Phased CEU" value="hapmapLdPhCeu"/>
+        <option name="Ph JPT+CHB" value="hapmapLdPhChbJpt"/>
+        <option name="Phased YRI" value="hapmapLdPhYri"/>
+      </option>
+        <option name="SNPs (126)" value="snp126"/>
+        <option name="Interrupted Rpts" value="nestedRepeats"/>
+        <option name="Exapted Repeats" value="exaptedRepeats"/>
+        <option name="SNPs (128)" value="snp128"/>
+      <option name="tajD" value="subtracks-tajD">
+        <option name="Tajima's D" value="tajD"/>
+        <option name="Tajima's D AD" value="tajdAd"/>
+        <option name="Tajima's D ED" value="tajdEd"/>
+        <option name="Tajima's D XD" value="tajdXd"/>
+      </option>
+        <option name="Microsatellite" value="microsat"/>
+        <option name="Simple Repeats" value="simpleRepeat"/>
+      <option name="hapmapSnps" value="subtracks-hapmapSnps">
+        <option name="Chimp Alleles" value="hapmapAllelesChimp"/>
+        <option name="Macaque Alleles" value="hapmapAllelesMacaque"/>
+        <option name="HapMap SNPs" value="hapmapSnps"/>
+        <option name="SNPs CEU" value="hapmapSnpsCEU"/>
+        <option name="SNPs CHB" value="hapmapSnpsCHB"/>
+        <option name="SNPs JPT" value="hapmapSnpsJPT"/>
+        <option name="SNPs YRI" value="hapmapSnpsYRI"/>
+      </option>
+    </option>
+    <option name="Expression and Regulation" value="group-regulation">
+        <option name="FirstEF" value="firstEF"/>
+        <option name="Affy GNF1H" value="affyGnf1h"/>
+        <option name="Affy All Exon" value="affyHumanExon"/>
+      <option name="wgEncodeUcsdNgTaf1Sites" value="subtracks-wgEncodeUcsdNgTaf1Sites">
+        <option name="TAF1 Known Sites" value="wgEncodeUcsdNgTaf1KnownSites"/>
+        <option name="TAF1 Novel Sites" value="wgEncodeUcsdNgTaf1NovelSites"/>
+        <option name="LI TAF1 Sites" value="wgEncodeUcsdNgTaf1Sites"/>
+      </option>
+      <option name="wgEncodeUcsdNgTaf1Valid" value="subtracks-wgEncodeUcsdNgTaf1Valid">
+        <option name="LI TAF1 Valid" value="wgEncodeUcsdNgTaf1Valid"/>
+        <option name="LI Valid H3K4m2" value="wgEncodeUcsdNgTaf1ValidH3K4me"/>
+        <option name="LI Valid H3ac" value="wgEncodeUcsdNgTaf1ValidH3ac"/>
+        <option name="LI Valid Pol2" value="wgEncodeUcsdNgTaf1ValidRnap"/>
+        <option name="LI Valid TAF1" value="wgEncodeUcsdNgTaf1ValidTaf"/>
+      </option>
+        <option name="LI TAF1 Signal" value="wgEncodeUcsdNgTaf1Signal"/>
+        <option name="Affy Txn" value="affyTxnPhase3Super"/>
+      <option name="affyTxnPhase3L" value="subtracks-affyTxnPhase3L">
+        <option name="HDF lRNA" value="affyTxnPhase3HDF"/>
+        <option name="HeLa Cyto lRNA" value="affyTxnPhase3HeLaCyto"/>
+        <option name="HeLa Nucl lRNA" value="affyTxnPhase3HeLaNuclear"/>
+        <option name="HepG2 Cyto lRNA" value="affyTxnPhase3HepG2Cyto"/>
+        <option name="HepG2 Nucl lRNA" value="affyTxnPhase3HepG2Nuclear"/>
+        <option name="Jurkat lRNA" value="affyTxnPhase3Jurkat"/>
+        <option name="Affy Tx lRNA Sig" value="affyTxnPhase3L"/>
+        <option name="NCCIT lRNA" value="affyTxnPhase3NCCIT"/>
+        <option name="PC3 lRNA" value="affyTxnPhase3PC3"/>
+        <option name="SK-N-AS lRNA" value="affyTxnPhase3SK_N_AS"/>
+        <option name="U87MG lRNA" value="affyTxnPhase3U87MG"/>
+      </option>
+        <option name="SwitchGear TSS" value="switchDbTss"/>
+        <option name="LI/UCSD TAF1" value="wgEncodeUcsdNgTaf1Super"/>
+        <option name="Affy U133Plus2" value="affyU133Plus2"/>
+        <option name="GNF Ratio" value="affyRatio"/>
+        <option name="Affy HuEx 1.0" value="affyHuEx1"/>
+      <option name="affyTxnPhase3FragsS" value="subtracks-affyTxnPhase3FragsS">
+        <option name="HeLa - sRNA" value="affyTxnPhase3FragsHeLaBottomStrand"/>
+        <option name="HeLa + sRNA" value="affyTxnPhase3FragsHeLaTopStrand"/>
+        <option name="HepG2 - sRNA" value="affyTxnPhase3FragsHepG2BottomStrand"/>
+        <option name="HepG2 + sRNA" value="affyTxnPhase3FragsHepG2TopStrand"/>
+        <option name="Affy Tx sRNA Reg" value="affyTxnPhase3FragsS"/>
+      </option>
+        <option name="7X Reg Potential" value="regPotential7X"/>
+      <option name="uppsalaChipSites" value="subtracks-uppsalaChipSites">
+        <option name="UU H3ac Sites" value="uppsalaChipH3acSites"/>
+        <option name="UU ChIP Sites" value="uppsalaChipSites"/>
+        <option name="UU Usf1 Sites" value="uppsalaChipUsf1Sites"/>
+        <option name="UU Usf2 Sites" value="uppsalaChipUsf2Sites"/>
+      </option>
+        <option name="CpG Islands" value="cpgIslandExt"/>
+        <option name="GIS PET" value="wgEncodeGisSuper"/>
+        <option name="GNF Atlas 2" value="gnfAtlas2"/>
+        <option name="Vista Enhancers" value="vistaEnhancers"/>
+      <option name="affyTxnPhase3S" value="subtracks-affyTxnPhase3S">
+        <option name="HeLa - sRNA" value="affyTxnPhase3HeLaBottomStrand"/>
+        <option name="HeLa + sRNA" value="affyTxnPhase3HeLaTopStrand"/>
+        <option name="HepG2 - sRNA" value="affyTxnPhase3HepG2BottomStrand"/>
+        <option name="HepG2 + sRNA" value="affyTxnPhase3HepG2TopStrand"/>
+        <option name="Affy Tx sRNA Sig" value="affyTxnPhase3S"/>
+      </option>
+      <option name="wgEncodeGisRnaPet" value="subtracks-wgEncodeGisRnaPet">
+        <option name="GIS PET RNA" value="wgEncodeGisRnaPet"/>
+        <option name="GIS RNA HCT116" value="wgEncodeGisRnaPetHCT116"/>
+        <option name="GIS RNA hES3" value="wgEncodeGisRnaPetHes3"/>
+        <option name="GIS RNA MCF7" value="wgEncodeGisRnaPetMCF7"/>
+        <option name="GIS RNA MCF7 Est" value="wgEncodeGisRnaPetMCF7Estr"/>
+      </option>
+        <option name="TFBS Conserved" value="tfbsConsSites"/>
+      <option name="affyTxnPhase3FragsL" value="subtracks-affyTxnPhase3FragsL">
+        <option name="HDF lRNA" value="affyTxnPhase3FragsHDF"/>
+        <option name="HeLa Cyto lRNA" value="affyTxnPhase3FragsHeLaCyto"/>
+        <option name="HeLa Nucl lRNA" value="affyTxnPhase3FragsHeLaNuclear"/>
+        <option name="HepG2 Cyto lRNA" value="affyTxnPhase3FragsHepG2Cyto"/>
+        <option name="HepG2 Nucl lRNA" value="affyTxnPhase3FragsHepG2Nuclear"/>
+        <option name="Jurkat lRNA" value="affyTxnPhase3FragsJurkat"/>
+        <option name="Affy Tx lRNA Reg" value="affyTxnPhase3FragsL"/>
+        <option name="NCCIT lRNA" value="affyTxnPhase3FragsNCCIT"/>
+        <option name="PC3 lRNA" value="affyTxnPhase3FragsPC3"/>
+        <option name="SK-N-AS lRNA" value="affyTxnPhase3FragsSK_N_AS"/>
+        <option name="U87MG lRNA" value="affyTxnPhase3FragsU87MG"/>
+      </option>
+        <option name="ORegAnno" value="oreganno"/>
+        <option name="Affy U133" value="affyU133"/>
+        <option name="Eponine TSS" value="eponine"/>
+        <option name="Allen Brain" value="allenBrainAli"/>
+        <option name="TS miRNA sites" value="targetScanS"/>
+        <option name="Bertone Yale TAR" value="yaleBertoneTars"/>
+      <option name="uppsalaChipSignal" value="subtracks-uppsalaChipSignal">
+        <option name="UU H3ac Signal" value="uppsalaChipH3acSignal"/>
+        <option name="UU ChIP Signal" value="uppsalaChipSignal"/>
+        <option name="UU Usf1 Signal" value="uppsalaChipUsf1Signal"/>
+        <option name="UU Usf2 Signal" value="uppsalaChipUsf2Signal"/>
+      </option>
+        <option name="Affy U95" value="affyU95"/>
+        <option name="Uppsala ChIP" value="uppsalaChipSuper"/>
+      <option name="wgEncodeGisChipPetAll" value="subtracks-wgEncodeGisChipPetAll">
+        <option name="p53 HCT116 +5FU" value="wgEncodeGisChipPet"/>
+        <option name="GIS ChIP-PET" value="wgEncodeGisChipPetAll"/>
+        <option name="H3K27me3 hES3" value="wgEncodeGisChipPetHes3H3K27me3"/>
+        <option name="H3K4me3 hES3" value="wgEncodeGisChipPetHes3H3K4me3"/>
+        <option name="cMyc P493" value="wgEncodeGisChipPetMycP493"/>
+        <option name="STAT1 HeLa +gIF" value="wgEncodeGisChipPetStat1Gif"/>
+        <option name="STAT1 HeLa -gIF" value="wgEncodeGisChipPetStat1NoGif"/>
+      </option>
+    </option>
+    <option name="ENCODE Comparative Genomics and Variation" value="group-encodeCompAndVar">
+        <option name="NHGRI DIPs" value="encodeIndels"/>
+    </option>
+    <option name="Experimental Tracks" value="group-x">
+        <option name="Uppsala ChIP" value="encodeUppsalaChip"/>
+      <option name="cnp" value="subtracks-cnp">
+        <option name="Iafrate CNPs" value="cnpIafrate2"/>
+        <option name="Locke CNPs" value="cnpLocke"/>
+        <option name="Redon CNPs" value="cnpRedon"/>
+        <option name="Sebat CNPs" value="cnpSebat2"/>
+        <option name="Sharp CNPs" value="cnpSharp2"/>
+        <option name="Tuzun Fosmids" value="cnpTuzun"/>
+        <option name="Conrad Dels" value="delConrad2"/>
+        <option name="Hinds Dels" value="delHinds2"/>
+        <option name="McCarroll Dels" value="delMccarroll"/>
+      </option>
+      <option name="encodeUncFaire" value="subtracks-encodeUncFaire">
+        <option name="FAIRE PeakFinder" value="encodeUncFairePeaks"/>
+        <option name="FAIRE ChIPOTle" value="encodeUncFairePeaksChipotle"/>
+      </option>
+      <option name="encodeUppsalaChipBut" value="subtracks-encodeUppsalaChipBut">
+        <option name="UU H3ac 0h vs 12h" value="encodeUppsalaChipH3acBut0vs12"/>
+        <option name="UU H4ac 0h vs 12h" value="encodeUppsalaChipH4acBut0vs12"/>
+      </option>
+        <option name="UT-Austin STAGE" value="encodeUtexStage"/>
+        <option name="UW DNase-array" value="encodeRegulomeDnaseArray"/>
+      <option name="encodeSangerChipHits" value="subtracks-encodeSangerChipHits">
+        <option name="SI H3K4m1 GM6990" value="encodeSangerChipCenterH3K4me1GM06990"/>
+        <option name="SI H3K4me1 HeLa" value="encodeSangerChipCenterH3K4me1HeLa"/>
+        <option name="SI H3K4m2 GM6990" value="encodeSangerChipCenterH3K4me2GM06990"/>
+        <option name="SI H3K4me2 HeLa" value="encodeSangerChipCenterH3K4me2HeLa"/>
+        <option name="SI H3K4me2 K562" value="encodeSangerChipCenterH3K4me2K562"/>
+        <option name="SI H3K4m3 GM6990" value="encodeSangerChipCenterH3K4me3GM06990"/>
+        <option name="SI H3K4me3 HeLa" value="encodeSangerChipCenterH3K4me3HeLa"/>
+        <option name="SI H3K4me3 K562" value="encodeSangerChipCenterH3K4me3K562"/>
+        <option name="SI H3ac GM06990" value="encodeSangerChipCenterH3acGM06990"/>
+        <option name="SI H3ac HeLa" value="encodeSangerChipCenterH3acHeLa"/>
+        <option name="SI H3ac K562" value="encodeSangerChipCenterH3acK562"/>
+        <option name="SI H4ac GM06990" value="encodeSangerChipCenterH4acGM06990"/>
+        <option name="SI H4ac HeLa" value="encodeSangerChipCenterH4acHeLa"/>
+        <option name="SI H4ac K562" value="encodeSangerChipCenterH4acK562"/>
+      </option>
+        <option name="Gencode Genes Mar07" value="encodeGencodeGeneMar07"/>
+      <option name="encodeNhgriDukeDnaseHs off" value="subtracks-encodeNhgriDukeDnaseHs off">
+        <option name="DNase CD4 MS" value="encodeNhgriDnaseHsMpssCd4"/>
+        <option name="DNase CD4-act MS" value="encodeNhgriDnaseHsMpssCd4Act"/>
+      </option>
+      <option name="encodeNhgriDukeDnaseHs" value="subtracks-encodeNhgriDukeDnaseHs">
+        <option name="DNase CD4 Pval" value="encodeNhgriDnaseHsChipPvalCd4"/>
+        <option name="DNase GM069 Pval" value="encodeNhgriDnaseHsChipPvalGm06990"/>
+        <option name="DNase H9 Pval" value="encodeNhgriDnaseHsChipPvalH9"/>
+        <option name="DNase HeLa Pval" value="encodeNhgriDnaseHsChipPvalHela"/>
+        <option name="DNase HepG2 Pval" value="encodeNhgriDnaseHsChipPvalHepG2"/>
+        <option name="DNase IMR90 Pval" value="encodeNhgriDnaseHsChipPvalImr90"/>
+        <option name="DNase K562 Pval" value="encodeNhgriDnaseHsChipPvalK562"/>
+      </option>
+    </option>
+    <option name="ENCODE Transcript Levels" value="group-encodeTxLevels">
+      <option name="encodeYaleAffyRNATars" value="subtracks-encodeYaleAffyRNATars">
+        <option name="Yale TAR NB4 RA" value="encodeYaleAffyNB4RARNATars"/>
+        <option name="Yale TAR NB4 TPA" value="encodeYaleAffyNB4TPARNATars"/>
+        <option name="Yale TAR NB4 Un" value="encodeYaleAffyNB4UntrRNATars"/>
+        <option name="Yale TAR Neutro" value="encodeYaleAffyNeutRNATars"/>
+        <option name="Yale TAR Plcnta" value="encodeYaleAffyPlacRNATars"/>
+        <option name="Yale TAR" value="encodeYaleAffyRNATars"/>
+      </option>
+      <option name="encodeYaleAffyRNATransMap" value="subtracks-encodeYaleAffyRNATransMap">
+        <option name="Yale RNA NB4 RA" value="encodeYaleAffyNB4RARNATransMap"/>
+        <option name="Yale RNA NB4 TPA" value="encodeYaleAffyNB4TPARNATransMap"/>
+        <option name="Yale RNA NB4 Un" value="encodeYaleAffyNB4UntrRNATransMap"/>
+        <option name="Yale RNA Neutro" value="encodeYaleAffyNeutRNATransMap"/>
+        <option name="Yale RNA Plcnta" value="encodeYaleAffyPlacRNATransMap"/>
+        <option name="Yale RNA" value="encodeYaleAffyRNATransMap"/>
+      </option>
+      <option name="encodeAffyRnaSignal" value="subtracks-encodeAffyRnaSignal">
+        <option name="Affy RNA GM06990" value="encodeAffyRnaGm06990Signal"/>
+        <option name="Affy RNA HeLa" value="encodeAffyRnaHeLaSignal"/>
+        <option name="Affy RNA RA 0h" value="encodeAffyRnaHl60SignalHr00"/>
+        <option name="Affy RNA RA 2h" value="encodeAffyRnaHl60SignalHr02"/>
+        <option name="Affy RNA RA 8h" value="encodeAffyRnaHl60SignalHr08"/>
+        <option name="Affy RNA RA 32h" value="encodeAffyRnaHl60SignalHr32"/>
+        <option name="Affy RNA Signal" value="encodeAffyRnaSignal"/>
+      </option>
+      <option name="encodeYaleMASPlacRNATransMap" value="subtracks-encodeYaleMASPlacRNATransMap">
+        <option name="Yale NB4 NgF RNA" value="encodeYaleMASNB4RNANprotTMFWDMless36mer36bp"/>
+        <option name="Yale NB4 NgR RNA" value="encodeYaleMASNB4RNANprotTMREVMless36mer36bp"/>
+        <option name="Yale Plc NgF RNA" value="encodeYaleMASPlacRNANprotTMFWDMless36mer36bp"/>
+        <option name="Yale Plc NgR RNA" value="encodeYaleMASPlacRNANprotTMREVMless36mer36bp"/>
+        <option name="Yale MAS RNA" value="encodeYaleMASPlacRNATransMap"/>
+        <option name="Yale Plc BtF RNA" value="encodeYaleMASPlacRNATransMapFwdMless36mer36bp"/>
+        <option name="Yale Plc BtR RNA" value="encodeYaleMASPlacRNATransMapRevMless36mer36bp"/>
+      </option>
+      <option name="encodeBuFirstExon" value="subtracks-encodeBuFirstExon">
+        <option name="BU First Exon" value="encodeBuFirstExon"/>
+        <option name="BU Cere. Cortex" value="encodeBuFirstExonCerebrum"/>
+        <option name="BU Colon" value="encodeBuFirstExonColon"/>
+        <option name="BU Heart" value="encodeBuFirstExonHeart"/>
+        <option name="BU Kidney" value="encodeBuFirstExonKidney"/>
+        <option name="BU Liver" value="encodeBuFirstExonLiver"/>
+        <option name="BU Lung" value="encodeBuFirstExonLung"/>
+        <option name="BU Skel. Muscle" value="encodeBuFirstExonSkMuscle"/>
+        <option name="BU Spleen" value="encodeBuFirstExonSpleen"/>
+        <option name="BU Stomach" value="encodeBuFirstExonStomach"/>
+        <option name="BU Testis" value="encodeBuFirstExonTestis"/>
+      </option>
+      <option name="encodeAffyEcSites" value="subtracks-encodeAffyEcSites">
+        <option name="EC1 Sites BrainC" value="encodeAffyEc1BrainCerebellumSites"/>
+        <option name="EC1 Sites BrainF" value="encodeAffyEc1BrainFrontalLobeSites"/>
+        <option name="EC1 Sites Hippoc" value="encodeAffyEc1BrainHippocampusSites"/>
+        <option name="EC1 Sites BrainH" value="encodeAffyEc1BrainHypothalamusSites"/>
+        <option name="EC1 Sites FetalK" value="encodeAffyEc1FetalKidneySites"/>
+        <option name="EC1 Sites Spleen" value="encodeAffyEc1FetalSpleenSites"/>
+        <option name="EC1 Sites FetalT" value="encodeAffyEc1FetalTestisSites"/>
+        <option name="EC1 Sites GM0699" value="encodeAffyEc1GM06990Sites"/>
+        <option name="EC1 Sites HeLa" value="encodeAffyEc1HeLaC1S3Sites"/>
+        <option name="EC1 Sites HepG2" value="encodeAffyEc1HepG2Sites"/>
+        <option name="EC1 Sites K562" value="encodeAffyEc1K562Sites"/>
+        <option name="EC1 Sites Ovary" value="encodeAffyEc1OvarySites"/>
+        <option name="EC1 Sites Placen" value="encodeAffyEc1PlacentaSites"/>
+        <option name="EC1 Sites Prost" value="encodeAffyEc1ProstateSites"/>
+        <option name="EC1 Sites TertBJ" value="encodeAffyEc1TertBJSites"/>
+        <option name="EC1 Sites Testis" value="encodeAffyEc1TestisSites"/>
+        <option name="EC51 Sites BrainC" value="encodeAffyEc51BrainCerebellumSites"/>
+        <option name="EC51 Site BrainF" value="encodeAffyEc51BrainFrontalLobeSites"/>
+        <option name="EC51 Site Hippoc" value="encodeAffyEc51BrainHippocampusSites"/>
+        <option name="EC51 Sites BrainH" value="encodeAffyEc51BrainHypothalamusSites"/>
+        <option name="EC51 Site FetalK" value="encodeAffyEc51FetalKidneySites"/>
+        <option name="EC51 Site Spleen" value="encodeAffyEc51FetalSpleenSites"/>
+        <option name="EC51 Site FetalT" value="encodeAffyEc51FetalTestisSites"/>
+        <option name="EC51 Site GM0699" value="encodeAffyEc51GM06990Sites"/>
+        <option name="EC51 Site HeLa" value="encodeAffyEc51HeLaC1S3Sites"/>
+        <option name="EC51 Site HepG2" value="encodeAffyEc51HepG2Sites"/>
+        <option name="EC51 Site K562" value="encodeAffyEc51K562Sites"/>
+        <option name="EC51 Site Ovary" value="encodeAffyEc51OvarySites"/>
+        <option name="EC51 Site Placen" value="encodeAffyEc51PlacentaSites"/>
+        <option name="EC51 Site Prost" value="encodeAffyEc51ProstateSites"/>
+        <option name="EC51 Site TertBJ" value="encodeAffyEc51TertBJSites"/>
+        <option name="EC51 Site Testis" value="encodeAffyEc51TestisSites"/>
+        <option name="Affy EC Sites" value="encodeAffyEcSites"/>
+      </option>
+      <option name="encodeStanfordPromoters" value="subtracks-encodeStanfordPromoters">
+        <option name="Stanf Promoter" value="encodeStanfordPromoters"/>
+        <option name="Stan Pro AGS" value="encodeStanfordPromotersAGS"/>
+        <option name="Stan Pro Average" value="encodeStanfordPromotersAverage"/>
+        <option name="Stan Pro Be2c" value="encodeStanfordPromotersBe2C"/>
+        <option name="Stan Pro CRL1690" value="encodeStanfordPromotersCRL1690"/>
+        <option name="Stan Pro G402" value="encodeStanfordPromotersG402"/>
+        <option name="Stan Pro HCT116" value="encodeStanfordPromotersHCT116"/>
+        <option name="Stan Pro HMCB" value="encodeStanfordPromotersHMCB"/>
+        <option name="Stan Pro HT1080" value="encodeStanfordPromotersHT1080"/>
+        <option name="Stan Pro HTB11" value="encodeStanfordPromotersHTB11"/>
+        <option name="Stan Pro Hela" value="encodeStanfordPromotersHela"/>
+        <option name="Stan Pro HepG2" value="encodeStanfordPromotersHepG2"/>
+        <option name="Stan Pro JEG3" value="encodeStanfordPromotersJEG3"/>
+        <option name="Stan Pro MG63" value="encodeStanfordPromotersMG63"/>
+        <option name="Stan Pro MRC5" value="encodeStanfordPromotersMRC5"/>
+        <option name="Stan Pro Panc1" value="encodeStanfordPromotersPanc1"/>
+        <option name="Stan Pro Snu182" value="encodeStanfordPromotersSnu182"/>
+        <option name="Stan Pro U87" value="encodeStanfordPromotersU87"/>
+      </option>
+        <option name="Affy RNA" value="encodeAffyRnaSuper"/>
+        <option name="Yale RNA" value="encodeYaleRnaSuper"/>
+      <option name="encodeAffyEcSignal" value="subtracks-encodeAffyEcSignal">
+        <option name="EC1 Sgnl BrainC" value="encodeAffyEc1BrainCerebellumSignal"/>
+        <option name="EC1 Sgnl BrainF" value="encodeAffyEc1BrainFrontalLobeSignal"/>
+        <option name="EC1 Sgnl Hippoc" value="encodeAffyEc1BrainHippocampusSignal"/>
+        <option name="EC1 Sgnl BrainH" value="encodeAffyEc1BrainHypothalamusSignal"/>
+        <option name="EC1 Sgnl FetalK" value="encodeAffyEc1FetalKidneySignal"/>
+        <option name="EC1 Sgnl Spleen" value="encodeAffyEc1FetalSpleenSignal"/>
+        <option name="EC1 Sgnl FetalT" value="encodeAffyEc1FetalTestisSignal"/>
+        <option name="EC1 Sgnl GM0699" value="encodeAffyEc1GM06990Signal"/>
+        <option name="EC1 Sgnl HeLa" value="encodeAffyEc1HeLaC1S3Signal"/>
+        <option name="EC1 Sgnl HepG2" value="encodeAffyEc1HepG2Signal"/>
+        <option name="EC1 Sgnl K562" value="encodeAffyEc1K562Signal"/>
+        <option name="EC1 Sgnl Ovary" value="encodeAffyEc1OvarySignal"/>
+        <option name="EC1 Sgnl Placen" value="encodeAffyEc1PlacentaSignal"/>
+        <option name="EC1 Sgnl Prost" value="encodeAffyEc1ProstateSignal"/>
+        <option name="EC1 Sgnl TertBJ" value="encodeAffyEc1TertBJSignal"/>
+        <option name="EC1 Sgnl Testis" value="encodeAffyEc1TestisSignal"/>
+        <option name="EC51 Sgnl BrainC" value="encodeAffyEc51BrainCerebellumSignal"/>
+        <option name="EC51 Sgnl BrainF" value="encodeAffyEc51BrainFrontalLobeSignal"/>
+        <option name="EC51 Sgnl Hippoc" value="encodeAffyEc51BrainHippocampusSignal"/>
+        <option name="EC51 Sgnl BrainH" value="encodeAffyEc51BrainHypothalamusSignal"/>
+        <option name="EC51 Sgnl FetalK" value="encodeAffyEc51FetalKidneySignal"/>
+        <option name="EC51 Sgnl Spleen" value="encodeAffyEc51FetalSpleenSignal"/>
+        <option name="EC51 Sgnl FetalT" value="encodeAffyEc51FetalTestisSignal"/>
+        <option name="EC51 Sgnl GM0699" value="encodeAffyEc51GM06990Signal"/>
+        <option name="EC51 Sgnl HeLa" value="encodeAffyEc51HeLaC1S3Signal"/>
+        <option name="EC51 Sgnl HepG2" value="encodeAffyEc51HepG2Signal"/>
+        <option name="EC51 Sgnl K562" value="encodeAffyEc51K562Signal"/>
+        <option name="EC51 Sgnl Ovary" value="encodeAffyEc51OvarySignal"/>
+        <option name="EC51 Sgnl Placen" value="encodeAffyEc51PlacentaSignal"/>
+        <option name="EC51 Sgnl Prost" value="encodeAffyEc51ProstateSignal"/>
+        <option name="EC51 Sgnl TertBJ" value="encodeAffyEc51TertBJSignal"/>
+        <option name="EC51 Sgnl Testis" value="encodeAffyEc51TestisSignal"/>
+        <option name="Affy EC Signal" value="encodeAffyEcSignal"/>
+      </option>
+        <option name="Stanf RTPCR" value="encodeStanfordRtPcr"/>
+      <option name="encodeAffyRnaTransfrags" value="subtracks-encodeAffyRnaTransfrags">
+        <option name="Affy RNA GM06990" value="encodeAffyRnaGm06990Sites"/>
+        <option name="Affy RNA HeLa" value="encodeAffyRnaHeLaSites"/>
+        <option name="Affy RNA RA 0h" value="encodeAffyRnaHl60SitesHr00"/>
+        <option name="Affy RNA RA 2h" value="encodeAffyRnaHl60SitesHr02"/>
+        <option name="Affy RNA RA 8h" value="encodeAffyRnaHl60SitesHr08"/>
+        <option name="Affy RNA RA 32h" value="encodeAffyRnaHl60SitesHr32"/>
+        <option name="Affy Transfrags" value="encodeAffyRnaTransfrags"/>
+      </option>
+      <option name="encodeYaleMASPlacRNATars" value="subtracks-encodeYaleMASPlacRNATars">
+        <option name="Yale NB4 NgF TAR" value="encodeYaleMASNB4RNANProtTarsFWDMless36mer36bp"/>
+        <option name="Yale NB4 NgR TAR" value="encodeYaleMASNB4RNANProtTarsREVMless36mer36bp"/>
+        <option name="Yale Plc NgF TAR" value="encodeYaleMASPlacRNANprotTarsFWDMless36mer36bp"/>
+        <option name="Yale Plc NgR TAR" value="encodeYaleMASPlacRNANprotTarsREVMless36mer36bp"/>
+        <option name="Yale MAS TAR" value="encodeYaleMASPlacRNATars"/>
+        <option name="Yale Plc BtF TAR" value="encodeYaleMASPlacRNATarsFwdMless36mer36bp"/>
+        <option name="Yale Plc BtR TAR" value="encodeYaleMASPlacRNATarsRevMless36mer36bp"/>
+      </option>
+        <option name="Affy EC" value="encodeAffyEcSuper"/>
+      <option name="encodeRikenCage" value="subtracks-encodeRikenCage">
+        <option name="Riken CAGE" value="encodeRikenCage"/>
+        <option name="Riken CAGE -" value="encodeRikenCageMinus"/>
+        <option name="Riken CAGE +" value="encodeRikenCagePlus"/>
+      </option>
+    </option>
+    <option name="ENCODE Chromatin Immunoprecipitation" value="group-encodeChip">
+      <option name="encodeAffyChIpHl60SignalStrict" value="subtracks-encodeAffyChIpHl60SignalStrict">
+        <option name="Affy Strict Sig" value="encodeAffyChIpHl60SignalStrict"/>
+        <option name="Affy H3K9ac2 0h" value="encodeAffyChIpHl60SignalStrictH3K9K14DHr00"/>
+        <option name="Affy H3K9ac2 2h" value="encodeAffyChIpHl60SignalStrictH3K9K14DHr02"/>
+        <option name="Affy H3K9ac2 8h" value="encodeAffyChIpHl60SignalStrictH3K9K14DHr08"/>
+        <option name="Affy H3K9ac2 32h" value="encodeAffyChIpHl60SignalStrictH3K9K14DHr32"/>
+        <option name="Affy H4Kac4 0h" value="encodeAffyChIpHl60SignalStrictHisH4Hr00"/>
+        <option name="Affy H4Kac4 2h" value="encodeAffyChIpHl60SignalStrictHisH4Hr02"/>
+        <option name="Affy H4Kac4 8h" value="encodeAffyChIpHl60SignalStrictHisH4Hr08"/>
+        <option name="Affy H4Kac4 32h" value="encodeAffyChIpHl60SignalStrictHisH4Hr32"/>
+        <option name="Affy Pol2 0h" value="encodeAffyChIpHl60SignalStrictPol2Hr00"/>
+        <option name="Affy Pol2 2h" value="encodeAffyChIpHl60SignalStrictPol2Hr02"/>
+        <option name="Affy Pol2 8h" value="encodeAffyChIpHl60SignalStrictPol2Hr08"/>
+        <option name="Affy Pol2 32h" value="encodeAffyChIpHl60SignalStrictPol2Hr32"/>
+        <option name="Affy p63 ME-180+" value="encodeAffyChIpHl60SignalStrictp63_ActD"/>
+        <option name="Affy p63 ME-180" value="encodeAffyChIpHl60SignalStrictp63_mActD"/>
+      </option>
+        <option name="Stanf ChIP" value="encodeStanfordChipSuper"/>
+      <option name="encodeYaleChIPSTAT1Pval" value="subtracks-encodeYaleChIPSTAT1Pval">
+        <option name="Yale LI PVal" value="encodeYaleChIPSTAT1HeLaBingRenPval"/>
+        <option name="Yale 36-36 PVal" value="encodeYaleChIPSTAT1HeLaMaskLess36mer36bpPval"/>
+        <option name="Yale 50-38 PVal" value="encodeYaleChIPSTAT1HeLaMaskLess50mer38bpPval"/>
+        <option name="Yale 50-50 PVal" value="encodeYaleChIPSTAT1HeLaMaskLess50mer50bpPval"/>
+        <option name="Yale STAT1 pVal" value="encodeYaleChIPSTAT1Pval"/>
+      </option>
+      <option name="encodeUtexStage" value="subtracks-encodeUtexStage">
+        <option name="UT-Austin STAGE" value="encodeUtexStage"/>
+        <option name="UT Myc HeLa Tags" value="encodeUtexStageCMycHelaTags"/>
+        <option name="UT STAT1 HeLa Tags" value="encodeUtexStageStat1HelaTags"/>
+      </option>
+        <option name="Sanger ChIP-chip" value="encodeSangerChipSuper"/>
+      <option name="encodeLIChIP" value="subtracks-encodeLIChIP">
+        <option name="LI ChIP Various" value="encodeLIChIP"/>
+        <option name="LI H3ac IMR90" value="encodeUcsdChipAch3Imr90_f"/>
+        <option name="LI H3K27me3 HeLa" value="encodeUcsdChipH3K27me3"/>
+        <option name="LI SUZ12 HeLa" value="encodeUcsdChipH3K27me3Suz12"/>
+        <option name="LI H3K4me2 IMR90" value="encodeUcsdChipMeh3k4Imr90_f"/>
+        <option name="LI Pol2 HCT116" value="encodeUcsdChipRnapHct116_f"/>
+        <option name="LI Pol2 HeLa" value="encodeUcsdChipRnapHela_f"/>
+        <option name="LI Pol2 IMR90" value="encodeUcsdChipRnapImr90_f"/>
+        <option name="LI Pol2 THP1" value="encodeUcsdChipRnapThp1_f"/>
+        <option name="LI TAF1 HCT116" value="encodeUcsdChipTaf250Hct116_f"/>
+        <option name="LI TAF1 HeLa" value="encodeUcsdChipTaf250Hela_f"/>
+        <option name="LI TAF1 IMR90" value="encodeUcsdChipTaf250Imr90_f"/>
+        <option name="LI TAF1 THP1" value="encodeUcsdChipTaf250Thp1_f"/>
+      </option>
+      <option name="encodeUtexChip" value="subtracks-encodeUtexChip">
+        <option name="UT-Austin ChIP" value="encodeUtexChip"/>
+        <option name="UT E2F4 st-Fb Pk" value="encodeUtexChip2091fibE2F4Peaks"/>
+        <option name="UT E2F4 Fb" value="encodeUtexChip2091fibE2F4Raw"/>
+        <option name="UT Myc Fb Pk" value="encodeUtexChip2091fibMycPeaks"/>
+        <option name="UT Myc Fb" value="encodeUtexChip2091fibMycRaw"/>
+        <option name="UT Myc st-Fb Pk" value="encodeUtexChip2091fibMycStimPeaks"/>
+        <option name="UT Myc st-Fb" value="encodeUtexChip2091fibMycStimRaw"/>
+        <option name="UT Myc HeLa Pk" value="encodeUtexChipHeLaMycPeaks"/>
+        <option name="UT Myc HeLa" value="encodeUtexChipHeLaMycRaw"/>
+      </option>
+      <option name="encodeYaleChipSig" value="subtracks-encodeYaleChipSig">
+        <option name="Yale ChIP Signal" value="encodeYaleChipSig"/>
+        <option name="YU BAF155 HeLa S" value="encodeYaleChipSignalBaf155"/>
+        <option name="YU BAF155 K562 S" value="encodeYaleChipSignalBaf155K562"/>
+        <option name="YU BAF170 HeLa S" value="encodeYaleChipSignalBaf170"/>
+        <option name="YU BAF170 K562 S" value="encodeYaleChipSignalBaf170K562"/>
+        <option name="YU BAF47 K562 S" value="encodeYaleChipSignalBaf47K562"/>
+        <option name="YU c-Fos HeLa S" value="encodeYaleChipSignalFos"/>
+        <option name="YU H3K27me3 HeLa S" value="encodeYaleChipSignalH3k27me3Hela"/>
+        <option name="YU H4Kac4 GM S" value="encodeYaleChipSignalH4kac4Gm06990"/>
+        <option name="YU H4Kac4 HeLa S" value="encodeYaleChipSignalH4kac4Hela"/>
+        <option name="YU c-Jun HeLa S" value="encodeYaleChipSignalJun"/>
+        <option name="YU NRSF HeLa S" value="encodeYaleChipSignalNrsfHela"/>
+        <option name="YU P65-C HeLa TNF S" value="encodeYaleChipSignalP65cHelaTnfa"/>
+        <option name="YU P65-N HeLa TNF S" value="encodeYaleChipSignalP65nHelaTnfa"/>
+        <option name="YU Pol2 GM S" value="encodeYaleChipSignalPol2Gm06990"/>
+        <option name="YU Pol2 HeLa S" value="encodeYaleChipSignalPol2Hela"/>
+        <option name="YU Pol2N GM S" value="encodeYaleChipSignalPol2nGm06990"/>
+        <option name="YU Pol2N HeLa S" value="encodeYaleChipSignalPol2nHela"/>
+        <option name="YU SMARCA4 HeLa S" value="encodeYaleChipSignalSmarca4Hela"/>
+        <option name="YU SMARCA6 HeLa S" value="encodeYaleChipSignalSmarca6Hela"/>
+        <option name="YU STAT1 HeLa IF S" value="encodeYaleChipSignalStat1HelaIfna"/>
+        <option name="YU TAF1 HeLa S" value="encodeYaleChipSignalTaf"/>
+      </option>
+        <option name="Uppsala ChIP" value="encodeUppsalaChipSuper"/>
+      <option name="encodeUppsalaChip" value="subtracks-encodeUppsalaChip">
+        <option name="Uppsala ChIP" value="encodeUppsalaChip"/>
+        <option name="UU H3ac HepG2" value="encodeUppsalaChipAch3"/>
+        <option name="UU HNF-3b HepG2" value="encodeUppsalaChipHnf3b"/>
+        <option name="UU HNF-4a HepG2" value="encodeUppsalaChipHnf4a"/>
+        <option name="UU USF-1 HepG2" value="encodeUppsalaChipUsf1"/>
+      </option>
+      <option name="encodeUcDavisChipHits" value="subtracks-encodeUcDavisChipHits">
+        <option name="UCD Ng ChIP Hits" value="encodeUcDavisChipHits"/>
+        <option name="UCD E2F1 Hits" value="encodeUcDavisChipHitsE2F1"/>
+        <option name="UCD c-Myc Hits" value="encodeUcDavisChipHitsMyc"/>
+      </option>
+      <option name="encodeUppsalaChipBut" value="subtracks-encodeUppsalaChipBut">
+        <option name="Uppsala ChIP Buty" value="encodeUppsalaChipBut"/>
+        <option name="UU H3ac HepG2 0h" value="encodeUppsalaChipH3acBut0h"/>
+        <option name="UU H3ac HepG2 12h" value="encodeUppsalaChipH3acBut12h"/>
+        <option name="UU H4ac HepG2 0h" value="encodeUppsalaChipH4acBut0h"/>
+        <option name="UU H4ac HepG2 12h" value="encodeUppsalaChipH4acBut12h"/>
+      </option>
+      <option name="encodeYaleChipSites" value="subtracks-encodeYaleChipSites">
+        <option name="Yale ChIP Sites" value="encodeYaleChipSites"/>
+        <option name="YU BAF155 HeLa" value="encodeYaleChipSitesBaf155"/>
+        <option name="YU BAF155 K562" value="encodeYaleChipSitesBaf155K562"/>
+        <option name="YU BAF170 HeLa" value="encodeYaleChipSitesBaf170"/>
+        <option name="YU BAF170 K562" value="encodeYaleChipSitesBaf170K562"/>
+        <option name="YU BAF47 K562" value="encodeYaleChipSitesBaf47K562"/>
+        <option name="YU c-Fos HeLa" value="encodeYaleChipSitesFos"/>
+        <option name="YU H3K27me3 HeLa" value="encodeYaleChipSitesH3k27me3Hela"/>
+        <option name="YU H4Kac4 GM" value="encodeYaleChipSitesH4kac4Gm06990"/>
+        <option name="YU H4Kac4 HeLa" value="encodeYaleChipSitesH4kac4Hela"/>
+        <option name="YU c-Jun HeLa" value="encodeYaleChipSitesJun"/>
+        <option name="YU NRSF HeLa" value="encodeYaleChipSitesNrsfHela"/>
+        <option name="YU P65-C HeLa TNF" value="encodeYaleChipSitesP65cHelaTnfa"/>
+        <option name="YU P65-N HeLa TNF" value="encodeYaleChipSitesP65nHelaTnfa"/>
+        <option name="YU Pol2 GM" value="encodeYaleChipSitesPol2Gm06990"/>
+        <option name="YU Pol2 HeLa" value="encodeYaleChipSitesPol2Hela"/>
+        <option name="YU Pol2N GM" value="encodeYaleChipSitesPol2nGm06990"/>
+        <option name="YU Pol2N HeLa" value="encodeYaleChipSitesPol2nHela"/>
+        <option name="YU SMARCA4 HeLa" value="encodeYaleChipSitesSmarca4Hela"/>
+        <option name="YU SMARCA6 HeLa" value="encodeYaleChipSitesSmarca6Hela"/>
+        <option name="YU STAT1 HeLa IF" value="encodeYaleChipSitesStat1HelaIfna"/>
+        <option name="YU TAF1 HeLa" value="encodeYaleChipSitesTaf"/>
+      </option>
+      <option name="encodeLIChIPgIF" value="subtracks-encodeLIChIPgIF">
+        <option name="LI gIF ChIP" value="encodeLIChIPgIF"/>
+        <option name="LI Pol2 -gIF" value="encodeUcsdChipHeLaH3H4RNAP_p0"/>
+        <option name="LI Pol2 +gIF" value="encodeUcsdChipHeLaH3H4RNAP_p30"/>
+        <option name="LI TAF1 -gIF" value="encodeUcsdChipHeLaH3H4TAF250_p0"/>
+        <option name="LI TAF1 +gIF" value="encodeUcsdChipHeLaH3H4TAF250_p30"/>
+        <option name="LI H3ac -gIF" value="encodeUcsdChipHeLaH3H4acH3_p0"/>
+        <option name="LI H3ac +gIF" value="encodeUcsdChipHeLaH3H4acH3_p30"/>
+        <option name="LI H4ac -gIF" value="encodeUcsdChipHeLaH3H4acH4_p0"/>
+        <option name="LI H4ac +gIF" value="encodeUcsdChipHeLaH3H4acH4_p30"/>
+        <option name="LI H3K4me2 -gIF" value="encodeUcsdChipHeLaH3H4dmH3K4_p0"/>
+        <option name="LI H3K4me2 +gIF" value="encodeUcsdChipHeLaH3H4dmH3K4_p30"/>
+        <option name="LI STAT1 -gIF" value="encodeUcsdChipHeLaH3H4stat1_p0"/>
+        <option name="LI STAT1 +gIF" value="encodeUcsdChipHeLaH3H4stat1_p30"/>
+        <option name="LI H3K4me3 -gIF" value="encodeUcsdChipHeLaH3H4tmH3K4_p0"/>
+        <option name="LI H3K4me3 +gIF" value="encodeUcsdChipHeLaH3H4tmH3K4_p30"/>
+      </option>
+        <option name="Yale WG ChIP-seq" value="wgEncodeYaleChipSeqSuper"/>
+      <option name="encodeStanfordChipSmoothed" value="subtracks-encodeStanfordChipSmoothed">
+        <option name="Stanf ChIP Score" value="encodeStanfordChipSmoothed"/>
+        <option name="Stan Sc HCT116 Sp1" value="encodeStanfordChipSmoothedHCT116Sp1"/>
+        <option name="Stan Sc HCT116 Sp3" value="encodeStanfordChipSmoothedHCT116Sp3"/>
+        <option name="Stan Sc Jurkat Sp1" value="encodeStanfordChipSmoothedJurkatSp1"/>
+        <option name="Stan Sc Jurkat Sp3" value="encodeStanfordChipSmoothedJurkatSp3"/>
+        <option name="Stan Sc K562 Sp1" value="encodeStanfordChipSmoothedK562Sp1"/>
+        <option name="Stan Sc K562 Sp3" value="encodeStanfordChipSmoothedK562Sp3"/>
+      </option>
+      <option name="encodeYaleChIPSTAT1Sites" value="subtracks-encodeYaleChIPSTAT1Sites">
+        <option name="Yale LI Sites" value="encodeYaleChIPSTAT1HeLaBingRenSites"/>
+        <option name="Yale 36-36 Sites" value="encodeYaleChIPSTAT1HeLaMaskLess36mer36bpSite"/>
+        <option name="Yale 50-38 Sites" value="encodeYaleChIPSTAT1HeLaMaskLess50mer38bpSite"/>
+        <option name="Yale 50-50 Sites" value="encodeYaleChIPSTAT1HeLaMaskLess50mer50bpSite"/>
+        <option name="Yale STAT1 Sites" value="encodeYaleChIPSTAT1Sites"/>
+      </option>
+        <option name="Affy ChIP" value="encodeAffyChipSuper"/>
+      <option name="encodeStanfordChip" value="subtracks-encodeStanfordChip">
+        <option name="Stanf ChIP" value="encodeStanfordChip"/>
+        <option name="Stan HCT116 Sp1" value="encodeStanfordChipHCT116Sp1"/>
+        <option name="Stan HCT116 Sp3" value="encodeStanfordChipHCT116Sp3"/>
+        <option name="Stan Jurkat Sp1" value="encodeStanfordChipJurkatSp1"/>
+        <option name="Stan Jurkat Sp3" value="encodeStanfordChipJurkatSp3"/>
+        <option name="Stan K562 Sp1" value="encodeStanfordChipK562Sp1"/>
+        <option name="Stan K562 Sp3" value="encodeStanfordChipK562Sp3"/>
+      </option>
+      <option name="encodeAffyChIpHl60SitesStrict" value="subtracks-encodeAffyChIpHl60SitesStrict">
+        <option name="Affy Strict Sites" value="encodeAffyChIpHl60SitesStrict"/>
+        <option name="Affy H3K9ac2 0h" value="encodeAffyChIpHl60SitesStrictH3K9K14DHr00"/>
+        <option name="Affy H3K9ac2 2h" value="encodeAffyChIpHl60SitesStrictH3K9K14DHr02"/>
+        <option name="Affy H3K9ac2 8h" value="encodeAffyChIpHl60SitesStrictH3K9K14DHr08"/>
+        <option name="Affy H3K9ac2 32h" value="encodeAffyChIpHl60SitesStrictH3K9K14DHr32"/>
+        <option name="Affy H4Kac4 0h" value="encodeAffyChIpHl60SitesStrictHisH4Hr00"/>
+        <option name="Affy H4Kac4 2h" value="encodeAffyChIpHl60SitesStrictHisH4Hr02"/>
+        <option name="Affy H4Kac4 8h" value="encodeAffyChIpHl60SitesStrictHisH4Hr08"/>
+        <option name="Affy H4Kac4 32h" value="encodeAffyChIpHl60SitesStrictHisH4Hr32"/>
+        <option name="Affy p63 ME-180+" value="encodeAffyChIpHl60SitesStrictP63_ActD"/>
+        <option name="Affy p63 ME-180" value="encodeAffyChIpHl60SitesStrictP63_mActD"/>
+        <option name="Affy Pol2 0h" value="encodeAffyChIpHl60SitesStrictRnapHr00"/>
+        <option name="Affy Pol2 2h" value="encodeAffyChIpHl60SitesStrictRnapHr02"/>
+        <option name="Affy Pol2 8h" value="encodeAffyChIpHl60SitesStrictRnapHr08"/>
+        <option name="Affy Pol2 32h" value="encodeAffyChIpHl60SitesStrictRnapHr32"/>
+      </option>
+      <option name="encodeAffyChIpHl60Pval" value="subtracks-encodeAffyChIpHl60Pval">
+        <option name="Affy pVal" value="encodeAffyChIpHl60Pval"/>
+        <option name="Affy Brg1 RA 0h" value="encodeAffyChIpHl60PvalBrg1Hr00"/>
+        <option name="Affy Brg1 RA 2h" value="encodeAffyChIpHl60PvalBrg1Hr02"/>
+        <option name="Affy Brg1 RA 8h" value="encodeAffyChIpHl60PvalBrg1Hr08"/>
+        <option name="Affy Brg1 RA 32h" value="encodeAffyChIpHl60PvalBrg1Hr32"/>
+        <option name="Affy CEBPe RA 0h" value="encodeAffyChIpHl60PvalCebpeHr00"/>
+        <option name="Affy CEBPe RA 2h" value="encodeAffyChIpHl60PvalCebpeHr02"/>
+        <option name="Affy CEBPe RA 8h" value="encodeAffyChIpHl60PvalCebpeHr08"/>
+        <option name="Affy CEBPe RA 32h" value="encodeAffyChIpHl60PvalCebpeHr32"/>
+        <option name="Affy CTCF RA 0h" value="encodeAffyChIpHl60PvalCtcfHr00"/>
+        <option name="Affy CTCF RA 2h" value="encodeAffyChIpHl60PvalCtcfHr02"/>
+        <option name="Affy CTCF RA 8h" value="encodeAffyChIpHl60PvalCtcfHr08"/>
+        <option name="Affy CTCF RA 32h" value="encodeAffyChIpHl60PvalCtcfHr32"/>
+        <option name="Affy H3K27me3 RA 0h" value="encodeAffyChIpHl60PvalH3K27me3Hr00"/>
+        <option name="Affy H3K27me3 RA 2h" value="encodeAffyChIpHl60PvalH3K27me3Hr02"/>
+        <option name="Affy H3K27me3 RA 8h" value="encodeAffyChIpHl60PvalH3K27me3Hr08"/>
+        <option name="Affy H3K27me3 RA 32h" value="encodeAffyChIpHl60PvalH3K27me3Hr32"/>
+        <option name="Affy H4Kac4 RA 0h" value="encodeAffyChIpHl60PvalH4Kac4Hr00"/>
+        <option name="Affy H4Kac4 RA 2h" value="encodeAffyChIpHl60PvalH4Kac4Hr02"/>
+        <option name="Affy H4Kac4 RA 8h" value="encodeAffyChIpHl60PvalH4Kac4Hr08"/>
+        <option name="Affy H4Kac4 RA 32h" value="encodeAffyChIpHl60PvalH4Kac4Hr32"/>
+        <option name="Affy P300 RA 0h" value="encodeAffyChIpHl60PvalP300Hr00"/>
+        <option name="Affy P300 RA 2h" value="encodeAffyChIpHl60PvalP300Hr02"/>
+        <option name="Affy P300 RA 8h" value="encodeAffyChIpHl60PvalP300Hr08"/>
+        <option name="Affy P300 RA 32h" value="encodeAffyChIpHl60PvalP300Hr32"/>
+        <option name="Affy PU1 RA 0h" value="encodeAffyChIpHl60PvalPu1Hr00"/>
+        <option name="Affy PU1 RA 2h" value="encodeAffyChIpHl60PvalPu1Hr02"/>
+        <option name="Affy PU1 RA 8h" value="encodeAffyChIpHl60PvalPu1Hr08"/>
+        <option name="Affy PU1 RA 32h" value="encodeAffyChIpHl60PvalPu1Hr32"/>
+        <option name="Affy RARA RA 0h" value="encodeAffyChIpHl60PvalRaraHr00"/>
+        <option name="Affy RARA RA 2h" value="encodeAffyChIpHl60PvalRaraHr02"/>
+        <option name="Affy RARA RA 8h" value="encodeAffyChIpHl60PvalRaraHr08"/>
+        <option name="Affy RARA RA 32h" value="encodeAffyChIpHl60PvalRaraHr32"/>
+        <option name="Affy Pol2 RA 0h" value="encodeAffyChIpHl60PvalRnapHr00"/>
+        <option name="Affy Pol2 RA 2h" value="encodeAffyChIpHl60PvalRnapHr02"/>
+        <option name="Affy Pol2 RA 8h" value="encodeAffyChIpHl60PvalRnapHr08"/>
+        <option name="Affy Pol2 RA 32h" value="encodeAffyChIpHl60PvalRnapHr32"/>
+        <option name="Affy SIRT1 RA 0h" value="encodeAffyChIpHl60PvalSirt1Hr00"/>
+        <option name="Affy SIRT1 RA 2h" value="encodeAffyChIpHl60PvalSirt1Hr02"/>
+        <option name="Affy SIRT1 RA 8h" value="encodeAffyChIpHl60PvalSirt1Hr08"/>
+        <option name="Affy SIRT1 RA 32h" value="encodeAffyChIpHl60PvalSirt1Hr32"/>
+        <option name="Affy TFIIB RA 32h" value="encodeAffyChIpHl60PvalTfiibHr32"/>
+      </option>
+      <option name="encodeYaleChipRfbr" value="subtracks-encodeYaleChipRfbr">
+        <option name="Yale ChIP RFBR" value="encodeYaleChipRfbr"/>
+        <option name="Yale RFBR Clusters" value="encodeYaleChipRfbrClusters"/>
+        <option name="Yale RFBR Deserts" value="encodeYaleChipRfbrDeserts"/>
+      </option>
+      <option name="encodeSangerChip" value="subtracks-encodeSangerChip">
+        <option name="Sanger ChIP" value="encodeSangerChip"/>
+        <option name="SI CTCF GM06990" value="encodeSangerChipCTCF"/>
+        <option name="SI H3K27me3 GM06990" value="encodeSangerChipH3K27me3"/>
+        <option name="SI H3K36me3 GM06990" value="encodeSangerChipH3K36me3"/>
+        <option name="SI H3K4m1 GM6990" value="encodeSangerChipH3K4me1"/>
+        <option name="SI H3K4me1 HFL-1" value="encodeSangerChipH3K4me1HFL1"/>
+        <option name="SI H3K4me1 HeLa" value="encodeSangerChipH3K4me1HeLa"/>
+        <option name="SI H3K4me1 MOLT4" value="encodeSangerChipH3K4me1Molt4"/>
+        <option name="SI H3K4me1 PTR8" value="encodeSangerChipH3K4me1Ptr8"/>
+        <option name="SI H3K4m2 GM6990" value="encodeSangerChipH3K4me2"/>
+        <option name="SI H3K4me2 HFL-1" value="encodeSangerChipH3K4me2HFL1"/>
+        <option name="SI H3K4me2 HeLa" value="encodeSangerChipH3K4me2HeLa"/>
+        <option name="SI H3K4me2 K562" value="encodeSangerChipH3K4me2K562"/>
+        <option name="SI H3K4me2 MOLT4" value="encodeSangerChipH3K4me2Molt4"/>
+        <option name="SI H3K4me2 PTR8" value="encodeSangerChipH3K4me2Ptr8"/>
+        <option name="SI H3K4m3 GM6990" value="encodeSangerChipH3K4me3"/>
+        <option name="SI H3K4me3 HFL-1" value="encodeSangerChipH3K4me3HFL1"/>
+        <option name="SI H3K4me3 HeLa" value="encodeSangerChipH3K4me3HeLa"/>
+        <option name="SI H3K4me3 K562" value="encodeSangerChipH3K4me3K562"/>
+        <option name="SI H3K4me3 MOLT4" value="encodeSangerChipH3K4me3Molt4"/>
+        <option name="SI H3K4me3 PTR8" value="encodeSangerChipH3K4me3Ptr8"/>
+        <option name="SI H3K79me3 GM06990" value="encodeSangerChipH3K79me3"/>
+        <option name="SI H3K9me3 GM06990" value="encodeSangerChipH3K9me3"/>
+        <option name="SI H3ac GM06990" value="encodeSangerChipH3ac"/>
+        <option name="SI H3ac HFL-1" value="encodeSangerChipH3acHFL1"/>
+        <option name="SI H3ac HeLa" value="encodeSangerChipH3acHeLa"/>
+        <option name="SI H3ac K562" value="encodeSangerChipH3acK562"/>
+        <option name="SI H3ac MOLT4" value="encodeSangerChipH3acMolt4"/>
+        <option name="SI H4ac GM06990" value="encodeSangerChipH4ac"/>
+        <option name="SI H4ac HFL-1" value="encodeSangerChipH4acHFL1"/>
+        <option name="SI H4ac HeLa" value="encodeSangerChipH4acHeLa"/>
+        <option name="SI H4ac K562" value="encodeSangerChipH4acK562"/>
+        <option name="SI H4ac MOLT4" value="encodeSangerChipH4acMolt4"/>
+      </option>
+      <option name="encodeAffyChIpHl60Sites" value="subtracks-encodeAffyChIpHl60Sites">
+        <option name="Affy Sites" value="encodeAffyChIpHl60Sites"/>
+        <option name="Affy Brg1 RA 0h" value="encodeAffyChIpHl60SitesBrg1Hr00"/>
+        <option name="Affy Brg1 RA 2h" value="encodeAffyChIpHl60SitesBrg1Hr02"/>
+        <option name="Affy Brg1 RA 8h" value="encodeAffyChIpHl60SitesBrg1Hr08"/>
+        <option name="Affy Brg1 RA 32h" value="encodeAffyChIpHl60SitesBrg1Hr32"/>
+        <option name="Affy CEBPe RA 0h" value="encodeAffyChIpHl60SitesCebpeHr00"/>
+        <option name="Affy CEBPe RA 2h" value="encodeAffyChIpHl60SitesCebpeHr02"/>
+        <option name="Affy CEBPe RA 8h" value="encodeAffyChIpHl60SitesCebpeHr08"/>
+        <option name="Affy CEBPe RA 32h" value="encodeAffyChIpHl60SitesCebpeHr32"/>
+        <option name="Affy CTCF RA 0h" value="encodeAffyChIpHl60SitesCtcfHr00"/>
+        <option name="Affy CTCF RA 2h" value="encodeAffyChIpHl60SitesCtcfHr02"/>
+        <option name="Affy CTCF RA 8h" value="encodeAffyChIpHl60SitesCtcfHr08"/>
+        <option name="Affy CTCF RA 32h" value="encodeAffyChIpHl60SitesCtcfHr32"/>
+        <option name="Affy H3K27me3 RA 0h" value="encodeAffyChIpHl60SitesH3K27me3Hr00"/>
+        <option name="Affy H3K27me3 RA 2h" value="encodeAffyChIpHl60SitesH3K27me3Hr02"/>
+        <option name="Affy H3K27me3 RA 8h" value="encodeAffyChIpHl60SitesH3K27me3Hr08"/>
+        <option name="Affy H3K27me3 RA 32h" value="encodeAffyChIpHl60SitesH3K27me3Hr32"/>
+        <option name="Affy H4Kac4 RA 0h" value="encodeAffyChIpHl60SitesH4Kac4Hr00"/>
+        <option name="Affy H4Kac4 RA 2h" value="encodeAffyChIpHl60SitesH4Kac4Hr02"/>
+        <option name="Affy H4Kac4 RA 8h" value="encodeAffyChIpHl60SitesH4Kac4Hr08"/>
+        <option name="Affy H4Kac4 RA 32h" value="encodeAffyChIpHl60SitesH4Kac4Hr32"/>
+        <option name="Affy P300 RA 0h" value="encodeAffyChIpHl60SitesP300Hr00"/>
+        <option name="Affy P300 RA 2h" value="encodeAffyChIpHl60SitesP300Hr02"/>
+        <option name="Affy P300 RA 8h" value="encodeAffyChIpHl60SitesP300Hr08"/>
+        <option name="Affy P300 RA 32h" value="encodeAffyChIpHl60SitesP300Hr32"/>
+        <option name="Affy PU1 RA 0h" value="encodeAffyChIpHl60SitesPu1Hr00"/>
+        <option name="Affy PU1 RA 2h" value="encodeAffyChIpHl60SitesPu1Hr02"/>
+        <option name="Affy PU1 RA 8h" value="encodeAffyChIpHl60SitesPu1Hr08"/>
+        <option name="Affy PU1 RA 32h" value="encodeAffyChIpHl60SitesPu1Hr32"/>
+        <option name="Affy RARA RA 0h" value="encodeAffyChIpHl60SitesRaraHr00"/>
+        <option name="Affy RARA RA 2h" value="encodeAffyChIpHl60SitesRaraHr02"/>
+        <option name="Affy RARA RA 8h" value="encodeAffyChIpHl60SitesRaraHr08"/>
+        <option name="Affy RARA RA 32h" value="encodeAffyChIpHl60SitesRaraHr32"/>
+        <option name="Affy Pol2 RA 0h" value="encodeAffyChIpHl60SitesRnapHr00"/>
+        <option name="Affy Pol2 RA 2h" value="encodeAffyChIpHl60SitesRnapHr02"/>
+        <option name="Affy Pol2 RA 8h" value="encodeAffyChIpHl60SitesRnapHr08"/>
+        <option name="Affy Pol2 RA 32h" value="encodeAffyChIpHl60SitesRnapHr32"/>
+        <option name="Affy SIRT1 RA 0h" value="encodeAffyChIpHl60SitesSirt1Hr00"/>
+        <option name="Affy SIRT1 RA 2h" value="encodeAffyChIpHl60SitesSirt1Hr02"/>
+        <option name="Affy SIRT1 RA 8h" value="encodeAffyChIpHl60SitesSirt1Hr08"/>
+        <option name="Affy SIRT1 RA 32h" value="encodeAffyChIpHl60SitesSirt1Hr32"/>
+        <option name="Affy TFIIB RA 32h" value="encodeAffyChIpHl60SitesTfiibHr32"/>
+      </option>
+        <option name="Yale ChIP" value="encodeYaleChipSuper"/>
+      <option name="encodeUcsdNgGif" value="subtracks-encodeUcsdNgGif">
+        <option name="LI Ng gIF ChIP" value="encodeUcsdNgGif"/>
+        <option name="LI H3ac -gIF" value="encodeUcsdNgHeLaAcH3_p0"/>
+        <option name="LI H3ac -gIF Pk" value="encodeUcsdNgHeLaAcH3_p0_peak"/>
+        <option name="LI H3ac +gIF" value="encodeUcsdNgHeLaAcH3_p30"/>
+        <option name="LI H3ac +gIF Pk" value="encodeUcsdNgHeLaAcH3_p30_peak"/>
+        <option name="LI H4ac -gIF" value="encodeUcsdNgHeLaAcH4_p0"/>
+        <option name="LI H4ac -gIF Pk" value="encodeUcsdNgHeLaAcH4_p0_peak"/>
+        <option name="LI H3K4me2 -gIF" value="encodeUcsdNgHeLaDmH3K4_p0"/>
+        <option name="LI H3K4m2 -IF Pk" value="encodeUcsdNgHeLaDmH3K4_p0_peak"/>
+        <option name="LI H3K4me2 +gIF" value="encodeUcsdNgHeLaDmH3K4_p30"/>
+        <option name="LI H3K4m2 +IF Pk" value="encodeUcsdNgHeLaDmH3K4_p30_peak"/>
+        <option name="LI H3K4me3 -gIF" value="encodeUcsdNgHeLaH3K4me3_p0"/>
+        <option name="LI H3K4m3 +gIF" value="encodeUcsdNgHeLaH3K4me3_p30"/>
+        <option name="LI Pol2 -gIF" value="encodeUcsdNgHeLaRnap_p0"/>
+        <option name="LI Pol2 +gIF" value="encodeUcsdNgHeLaRnap_p30"/>
+        <option name="LI STAT1 +gIF" value="encodeUcsdNgHeLaStat1_p30"/>
+        <option name="LI STAT1 +gIF Pk" value="encodeUcsdNgHeLaStat1_p30_peak"/>
+      </option>
+      <option name="encodeYaleChipPval" value="subtracks-encodeYaleChipPval">
+        <option name="Yale ChIP pVal" value="encodeYaleChipPval"/>
+        <option name="YU BAF155 HeLa P" value="encodeYaleChipPvalBaf155"/>
+        <option name="YU BAF155 K562 P" value="encodeYaleChipPvalBaf155K562"/>
+        <option name="YU BAF170 HeLa P" value="encodeYaleChipPvalBaf170"/>
+        <option name="YU BAF170 K562 P" value="encodeYaleChipPvalBaf170K562"/>
+        <option name="YU BAF47 K562 P" value="encodeYaleChipPvalBaf47K562"/>
+        <option name="YU c-Fos HeLa P" value="encodeYaleChipPvalFos"/>
+        <option name="YU H3K27me3 HeLa P" value="encodeYaleChipPvalH3k27me3Hela"/>
+        <option name="YU H4Kac4 GM P" value="encodeYaleChipPvalH4kac4Gm06990"/>
+        <option name="YU H4Kac4 HeLa P" value="encodeYaleChipPvalH4kac4Hela"/>
+        <option name="YU c-Jun HeLa P" value="encodeYaleChipPvalJun"/>
+        <option name="YU NRSF HeLa P" value="encodeYaleChipPvalNrsfHela"/>
+        <option name="YU P65-C HeLa TNF P" value="encodeYaleChipPvalP65cHelaTnfa"/>
+        <option name="YU P65-N HeLa TNF P" value="encodeYaleChipPvalP65nHelaTnfa"/>
+        <option name="YU Pol2 GM P" value="encodeYaleChipPvalPol2Gm06990"/>
+        <option name="YU Pol2 HeLa P" value="encodeYaleChipPvalPol2Hela"/>
+        <option name="YU Pol2N GM P" value="encodeYaleChipPvalPol2nGm06990"/>
+        <option name="YU Pol2N HeLa P" value="encodeYaleChipPvalPol2nHela"/>
+        <option name="YU SMARCA4 HeLa P" value="encodeYaleChipPvalSmarca4Hela"/>
+        <option name="YU SMARCA6 HeLa P" value="encodeYaleChipPvalSmarca6Hela"/>
+        <option name="YU STAT1 HeLa IF P" value="encodeYaleChipPvalStat1HelaIfna"/>
+        <option name="YU TAF1 HeLa P" value="encodeYaleChipPvalTaf"/>
+      </option>
+        <option name="UT-Austin ChIP" value="encodeUtexChipSuper"/>
+      <option name="encodeAffyChIpHl60PvalStrict" value="subtracks-encodeAffyChIpHl60PvalStrict">
+        <option name="Affy Strict pVal" value="encodeAffyChIpHl60PvalStrict"/>
+        <option name="Affy H3K9ac2 0h" value="encodeAffyChIpHl60PvalStrictH3K9K14DHr00"/>
+        <option name="Affy H3K9ac2 2h" value="encodeAffyChIpHl60PvalStrictH3K9K14DHr02"/>
+        <option name="Affy H3K9ac2 8h" value="encodeAffyChIpHl60PvalStrictH3K9K14DHr08"/>
+        <option name="Affy H3K9ac2 32h" value="encodeAffyChIpHl60PvalStrictH3K9K14DHr32"/>
+        <option name="Affy H4Kac4 0h" value="encodeAffyChIpHl60PvalStrictHisH4Hr00"/>
+        <option name="Affy H4Kac4 2h" value="encodeAffyChIpHl60PvalStrictHisH4Hr02"/>
+        <option name="Affy H4Kac4 8h" value="encodeAffyChIpHl60PvalStrictHisH4Hr08"/>
+        <option name="Affy H4Kac4 32h" value="encodeAffyChIpHl60PvalStrictHisH4Hr32"/>
+        <option name="Affy Pol2 0h" value="encodeAffyChIpHl60PvalStrictPol2Hr00"/>
+        <option name="Affy Pol2 2h" value="encodeAffyChIpHl60PvalStrictPol2Hr02"/>
+        <option name="Affy Pol2 8h" value="encodeAffyChIpHl60PvalStrictPol2Hr08"/>
+        <option name="Affy Pol2 32h" value="encodeAffyChIpHl60PvalStrictPol2Hr32"/>
+        <option name="Affy p63 ME-180+" value="encodeAffyChIpHl60PvalStrictp63_ActD"/>
+        <option name="Affy p63 ME-180" value="encodeAffyChIpHl60PvalStrictp63_mActD"/>
+      </option>
+        <option name="UC Davis ChIP" value="encodeUcDavisChipSuper"/>
+      <option name="encodeYaleChIPSTAT1Sig" value="subtracks-encodeYaleChIPSTAT1Sig">
+        <option name="Yale LI Sig" value="encodeYaleChIPSTAT1HeLaBingRenSig"/>
+        <option name="Yale 36-36 Sig" value="encodeYaleChIPSTAT1HeLaMaskLess36mer36bpSig"/>
+        <option name="Yale 50-38 Sig" value="encodeYaleChIPSTAT1HeLaMaskLess50mer38bpSig"/>
+        <option name="Yale 50-50 Sig" value="encodeYaleChIPSTAT1HeLaMaskLess50mer50bpSig"/>
+        <option name="Yale STAT1 Sig" value="encodeYaleChIPSTAT1Sig"/>
+      </option>
+      <option name="encodeUCDavisChip" value="subtracks-encodeUCDavisChip">
+        <option name="UCD Ng ChIP" value="encodeUCDavisChip"/>
+        <option name="UCD C-Myc" value="encodeUCDavisChipMyc"/>
+        <option name="UCD E2F1" value="encodeUCDavisE2F1Median"/>
+        <option name="UCD PolII_GM" value="encodeUCDavisPolIIGM"/>
+        <option name="UCD PolII_HelaS3" value="encodeUCDavisPolIIHelaS3"/>
+        <option name="UCD Taf_GM" value="encodeUCDavisTafGM"/>
+        <option name="UCD Taf_HelaS3" value="encodeUCDavisTafHelaS3"/>
+      </option>
+      <option name="encodeSangerChipHits" value="subtracks-encodeSangerChipHits">
+        <option name="SI H3K4m1 GM6990" value="encodeSangerChipHitH3K4me1GM06990"/>
+        <option name="SI H3K4me1 HeLa" value="encodeSangerChipHitH3K4me1HeLa"/>
+        <option name="SI H3K4m2 GM6990" value="encodeSangerChipHitH3K4me2GM06990"/>
+        <option name="SI H3K4me2 HeLa" value="encodeSangerChipHitH3K4me2HeLa"/>
+        <option name="SI H3K4me2 K562" value="encodeSangerChipHitH3K4me2K562"/>
+        <option name="SI H3K4m3 GM6990" value="encodeSangerChipHitH3K4me3GM06990"/>
+        <option name="SI H3K4me3 HeLa" value="encodeSangerChipHitH3K4me3HeLa"/>
+        <option name="SI H3K4me3 K562" value="encodeSangerChipHitH3K4me3K562"/>
+        <option name="SI H3ac GM06990" value="encodeSangerChipHitH3acGM06990"/>
+        <option name="SI H3ac HeLa" value="encodeSangerChipHitH3acHeLa"/>
+        <option name="SI H3ac K562" value="encodeSangerChipHitH3acK562"/>
+        <option name="SI H4ac GM06990" value="encodeSangerChipHitH4acGM06990"/>
+        <option name="SI H4ac HeLa" value="encodeSangerChipHitH4acHeLa"/>
+        <option name="SI H4ac K562" value="encodeSangerChipHitH4acK562"/>
+        <option name="Sanger ChIP Hits" value="encodeSangerChipHits"/>
+      </option>
+        <option name="LI/UCSD ChIP" value="encodeUcsdChipSuper"/>
+    </option>
+    <option name="ENCODE Chromosome, Chromatin and DNA Structure" value="group-encodeChrom">
+        <option name="BU ORChID" value="encodeBUORChID"/>
+      <option name="encodeUncFaire" value="subtracks-encodeUncFaire">
+        <option name="UNC FAIRE" value="encodeUncFaire"/>
+        <option name="FAIRE Signal" value="encodeUncFaireSignal"/>
+      </option>
+      <option name="encodeUvaDnaRepOrigins" value="subtracks-encodeUvaDnaRepOrigins">
+        <option name="UVa DNA Rep Ori" value="encodeUvaDnaRepOrigins"/>
+        <option name="UVa Ori-Bubble HeLa" value="encodeUvaDnaRepOriginsBubbleHela"/>
+        <option name="UVa Ori-NS GM" value="encodeUvaDnaRepOriginsNSGM"/>
+        <option name="UVa Ori-NS HeLa" value="encodeUvaDnaRepOriginsNSHela"/>
+        <option name="UVa Ori-TR50 HeLa" value="encodeUvaDnaRepOriginsTR50Hela"/>
+      </option>
+        <option name="UVa DNA Rep TR50" value="encodeUvaDnaRepTr50"/>
+        <option name="UVa DNA Rep" value="encodeUvaDnaRepSuper"/>
+      <option name="encodeUvaDnaRepSeg" value="subtracks-encodeUvaDnaRepSeg">
+        <option name="UVa DNA Rep Early" value="encodeUvaDnaRepEarly"/>
+        <option name="UVa DNA Rep Late" value="encodeUvaDnaRepLate"/>
+        <option name="UVa DNA Rep Mid" value="encodeUvaDnaRepMid"/>
+        <option name="UVa DNA Rep PanS" value="encodeUvaDnaRepPanS"/>
+        <option name="UVa DNA Rep Seg" value="encodeUvaDnaRepSeg"/>
+      </option>
+      <option name="encodeRegulomeDnaseArray" value="subtracks-encodeRegulomeDnaseArray">
+        <option name="UW DNase-array" value="encodeRegulomeDnaseArray"/>
+        <option name="DnaseI Sens" value="encodeRegulomeDnaseGM06990Sens"/>
+      </option>
+        <option name="UW DNase" value="encodeUwDnaseSuper"/>
+      <option name="encodeUWRegulomeBase" value="subtracks-encodeUWRegulomeBase">
+        <option name="UW DNase-QCP" value="encodeUWRegulomeBase"/>
+        <option name="CD4" value="encodeUWRegulomeBaseCD4"/>
+        <option name="CaCo2" value="encodeUWRegulomeBaseCaCo2"/>
+        <option name="CaLU3" value="encodeUWRegulomeBaseCaLU3"/>
+        <option name="EryAdult" value="encodeUWRegulomeBaseEryAdult"/>
+        <option name="EryFetal" value="encodeUWRegulomeBaseEryFetal"/>
+        <option name="GM" value="encodeUWRegulomeBaseGM"/>
+        <option name="HMEC" value="encodeUWRegulomeBaseHMEC"/>
+        <option name="HRE" value="encodeUWRegulomeBaseHRE"/>
+        <option name="HeLa" value="encodeUWRegulomeBaseHeLa"/>
+        <option name="HepG2" value="encodeUWRegulomeBaseHepG2"/>
+        <option name="Huh7" value="encodeUWRegulomeBaseHuh7"/>
+        <option name="K562" value="encodeUWRegulomeBaseK562"/>
+        <option name="NHBE" value="encodeUWRegulomeBaseNHBE"/>
+        <option name="PANC" value="encodeUWRegulomeBasePANC"/>
+        <option name="SAEC" value="encodeUWRegulomeBaseSAEC"/>
+        <option name="SKnSH" value="encodeUWRegulomeBaseSKnSH"/>
+      </option>
+      <option name="encodeNhgriDukeDnaseHs" value="subtracks-encodeNhgriDukeDnaseHs">
+        <option name="DNase CD4 Raw" value="encodeNhgriDnaseHsChipRawCd4"/>
+        <option name="DNase GM069 Raw" value="encodeNhgriDnaseHsChipRawGm06990"/>
+        <option name="DNase H9 Raw" value="encodeNhgriDnaseHsChipRawH9"/>
+        <option name="DNase HeLa Raw" value="encodeNhgriDnaseHsChipRawHela"/>
+        <option name="DNase HepG2 Raw" value="encodeNhgriDnaseHsChipRawHepG2"/>
+        <option name="DNase IMR90 Raw" value="encodeNhgriDnaseHsChipRawImr90"/>
+        <option name="DNase K562 Raw" value="encodeNhgriDnaseHsChipRawK562"/>
+        <option name="Duke/NHGRI DNase" value="encodeNhgriDukeDnaseHs"/>
+      </option>
+      <option name="encodeUvaDnaRep" value="subtracks-encodeUvaDnaRep">
+        <option name="UVa DNA Rep" value="encodeUvaDnaRep"/>
+        <option name="UVa DNA Rep 0h" value="encodeUvaDnaRep0"/>
+        <option name="UVa DNA Rep 2h" value="encodeUvaDnaRep2"/>
+        <option name="UVa DNA Rep 4h" value="encodeUvaDnaRep4"/>
+        <option name="UVa DNA Rep 6h" value="encodeUvaDnaRep6"/>
+        <option name="UVa DNA Rep 8h" value="encodeUvaDnaRep8"/>
+      </option>
+    </option>
+    <option name="ENCODE Regions and Genes" value="group-encodeGenes">
+      <option name="encodeGencodeGeneMar07" value="subtracks-encodeGencodeGeneMar07">
+        <option name="Gencode Ref" value="encodeGencodeGeneKnownMar07"/>
+        <option name="Gencode Genes Mar07" value="encodeGencodeGeneMar07"/>
+        <option name="Gencode Polymorph" value="encodeGencodeGenePolymorphicMar07"/>
+        <option name="Gencode Pseudo" value="encodeGencodeGenePseudoMar07"/>
+        <option name="Gencode Putative" value="encodeGencodeGenePutativeMar07"/>
+      </option>
+        <option name="Vienna RNAz" value="encodeUViennaRnaz"/>
+        <option name="Gencode Genes" value="encodeGencodeSuper"/>
+        <option name="EGASP" value="encodeEgaspSuper"/>
+      <option name="encodeGencodeRaceFrags" value="subtracks-encodeGencodeRaceFrags">
+        <option name="Gencode RACEfrags" value="encodeGencodeRaceFrags"/>
+        <option name="RACEfrags Brain" value="encodeGencodeRaceFragsBrain"/>
+        <option name="RACEfrags Colon" value="encodeGencodeRaceFragsColon"/>
+        <option name="RACEfrags GM06990" value="encodeGencodeRaceFragsGM06990"/>
+        <option name="RACEfrags HL60" value="encodeGencodeRaceFragsHL60"/>
+        <option name="RACEfrags Heart" value="encodeGencodeRaceFragsHeart"/>
+        <option name="RACEfrags HeLaS3" value="encodeGencodeRaceFragsHela"/>
+        <option name="RACEfrags Kidney" value="encodeGencodeRaceFragsKidney"/>
+        <option name="RACEfrags Liver" value="encodeGencodeRaceFragsLiver"/>
+        <option name="RACEfrags Lung" value="encodeGencodeRaceFragsLung"/>
+        <option name="RACEfrags Muscle" value="encodeGencodeRaceFragsMuscle"/>
+        <option name="RACEfrags Placenta" value="encodeGencodeRaceFragsPlacenta"/>
+        <option name="RACEfrags Primer" value="encodeGencodeRaceFragsPrimer"/>
+        <option name="RACEfrags Sm Int" value="encodeGencodeRaceFragsSmallIntest"/>
+        <option name="RACEfrags Spleen" value="encodeGencodeRaceFragsSpleen"/>
+        <option name="RACEfrags Stomach" value="encodeGencodeRaceFragsStomach"/>
+        <option name="RACEfrags Testis" value="encodeGencodeRaceFragsTestis"/>
+      </option>
+        <option name="Known+Pred RNA" value="encodeRna"/>
+      <option name="encodeEgaspFull" value="subtracks-encodeEgaspFull">
+        <option name="EGASP Full" value="encodeEgaspFull"/>
+        <option name="AceView" value="encodeEgaspFullAceview"/>
+        <option name="DOGFISH-C" value="encodeEgaspFullDogfish"/>
+        <option name="Ensembl" value="encodeEgaspFullEnsembl"/>
+        <option name="Ensembl Pseudo" value="encodeEgaspFullEnsemblPseudo"/>
+        <option name="Exogean" value="encodeEgaspFullExogean"/>
+        <option name="ExonHunter" value="encodeEgaspFullExonhunter"/>
+        <option name="Fgenesh++" value="encodeEgaspFullFgenesh"/>
+        <option name="GeneID" value="encodeEgaspFullGeneId"/>
+        <option name="GeneID U12" value="encodeEgaspFullGeneIdU12"/>
+        <option name="GeneMark" value="encodeEgaspFullGenemark"/>
+        <option name="Jigsaw" value="encodeEgaspFullJigsaw"/>
+        <option name="Pairgn/NSCAN-E/+" value="encodeEgaspFullPairagonAny"/>
+        <option name="Pairgn/NSCAN-E" value="encodeEgaspFullPairagonMrna"/>
+        <option name="NSCAN" value="encodeEgaspFullPairagonMultiple"/>
+        <option name="SGP2" value="encodeEgaspFullSgp2"/>
+        <option name="SGP2 U12" value="encodeEgaspFullSgp2U12"/>
+        <option name="Fgenesh Pseudo" value="encodeEgaspFullSoftberryPseudo"/>
+        <option name="SPIDA Exons" value="encodeEgaspFullSpida"/>
+        <option name="Twinscan" value="encodeEgaspFullTwinscan"/>
+      </option>
+      <option name="encodeGencodeGeneOct05" value="subtracks-encodeGencodeGeneOct05">
+        <option name="Gencode Ref" value="encodeGencodeGeneKnownOct05"/>
+        <option name="Gencode Genes Oct05" value="encodeGencodeGeneOct05"/>
+        <option name="Gencode Pseudo" value="encodeGencodeGenePseudoOct05"/>
+        <option name="Gencode Putative" value="encodeGencodeGenePutativeOct05"/>
+      </option>
+        <option name="Gencode Introns Oct05" value="encodeGencodeIntronOct05"/>
+      <option name="encodePseudogene" value="subtracks-encodePseudogene">
+        <option name="Pseudogenes" value="encodePseudogene"/>
+        <option name="Consensus Pseudogenes" value="encodePseudogeneConsensus"/>
+        <option name="GIS Pseudogenes" value="encodePseudogeneGIS"/>
+        <option name="Havana-Gencode Pseudogenes" value="encodePseudogeneHavana"/>
+        <option name="UCSC Retrogenes" value="encodePseudogeneUcsc"/>
+        <option name="UCSC Pseudogenes" value="encodePseudogeneUcsc2"/>
+        <option name="Yale Pseudogenes" value="encodePseudogeneYale"/>
+      </option>
+        <option name="ENCODE Regions" value="encodeRegions"/>
+      <option name="encodeEgaspUpdate" value="subtracks-encodeEgaspUpdate">
+        <option name="Augustus Update" value="encodeEgaspUpdAugustusAbinitio"/>
+        <option name="August/EST/Ms Upd" value="encodeEgaspUpdAugustusAny"/>
+        <option name="August/Mouse Upd" value="encodeEgaspUpdAugustusDual"/>
+        <option name="Augustus/EST Upd" value="encodeEgaspUpdAugustusEst"/>
+        <option name="Exogean Update" value="encodeEgaspUpdExogean"/>
+        <option name="FGenesh++ Upd" value="encodeEgaspUpdFgenesh"/>
+        <option name="GeneID Update" value="encodeEgaspUpdGeneId"/>
+        <option name="GeneID U12 Upd" value="encodeEgaspUpdGeneIdU12"/>
+        <option name="Jigsaw Update" value="encodeEgaspUpdJigsaw"/>
+        <option name="SGP2 Update" value="encodeEgaspUpdSgp2"/>
+        <option name="SGP2 U12 Update" value="encodeEgaspUpdSgp2U12"/>
+        <option name="Yale Pseudo Upd" value="encodeEgaspUpdYalePseudo"/>
+        <option name="EGASP Update" value="encodeEgaspUpdate"/>
+      </option>
+      <option name="encodeEgaspPartial" value="subtracks-encodeEgaspPartial">
+        <option name="ACEScan Cons Alt" value="encodeEgaspPartAceCons"/>
+        <option name="ACEScan Other" value="encodeEgaspPartAceOther"/>
+        <option name="Augustus" value="encodeEgaspPartAugustusAbinitio"/>
+        <option name="Augustus/EST/Mouse" value="encodeEgaspPartAugustusAny"/>
+        <option name="Augustus/Mouse" value="encodeEgaspPartAugustusDual"/>
+        <option name="Augustus/EST" value="encodeEgaspPartAugustusEst"/>
+        <option name="GeneZilla" value="encodeEgaspPartGenezilla"/>
+        <option name="SAGA" value="encodeEgaspPartSaga"/>
+        <option name="EGASP Partial" value="encodeEgaspPartial"/>
+      </option>
+    </option>
+  </options>
+</filter>
Index: /galaxy-central/tool-data/blastdb.loc
===================================================================
--- /galaxy-central/tool-data/blastdb.loc (revision 3)
+++ /galaxy-central/tool-data/blastdb.loc (revision 3)
@@ -0,0 +1,32 @@
+#This is a sample file distributed with Galaxy that is used to define a
+#list of nucelotide BLAST databases, using two columns tab separated:
+#
+#<database caption>     <path to base name>
+#
+#The captions typically contain spaces and might end with the build date.
+#It is important that the actual database name does not have a space in it,
+#and that the first tab that appears in the line is right before the path.
+#
+#So, for example, if your database is nt and the path to your base name 
+#is /depot/data2/galaxy/blastdb/nt/nt.chunk, then the blastdb.loc entry 
+#would look like this:
+#
+#nt 02 Dec 2009      /depot/data2/galaxy/blastdb/nt/nt.chunk
+#
+#and your /depot/data2/galaxy/blastdb/nt directory would contain all of 
+#your "base names" (e.g.):
+#
+#-rw-r--r--  1 wychung galaxy  23437408 2008-04-09 11:26 nt.chunk.00.nhr
+#-rw-r--r--  1 wychung galaxy   3689920 2008-04-09 11:26 nt.chunk.00.nin
+#-rw-r--r--  1 wychung galaxy 251215198 2008-04-09 11:26 nt.chunk.00.nsq
+#...etc...
+#
+#Your blastdb.loc file should include an entry per line for each "base name" 
+#you have stored.  For example:
+#
+#nt 02 Dec 2009	/depot/data2/galaxy/blastdb/nt/nt.chunk
+#wgs 30 Nov 2009	/depot/data2/galaxy/blastdb/wgs/wgs.chunk
+#test 20 Sep 2008	/depot/data2/galaxy/blastdb/test/test
+#...etc...
+#
+#See also blastdb_p.loc which is for any protein BLAST database.
Index: /galaxy-central/tool-data/sam_fa_indices.loc
===================================================================
--- /galaxy-central/tool-data/sam_fa_indices.loc (revision 3)
+++ /galaxy-central/tool-data/sam_fa_indices.loc (revision 3)
@@ -0,0 +1,28 @@
+#This is a sample file distributed with Galaxy that enables tools
+#to use a directory of Samtools indexed sequences data files.  You will need
+#to create these data files and then create a sam_fa_indices.loc file 
+#similar to this one (store it in this directory) that points to 
+#the directories in which those files are stored. The sam_fa_indices.loc 
+#file has this format (white space characters are TAB characters):
+#
+#index	<seq>	<location>
+#
+#So, for example, if you had hg18 indexed stored in 
+#/depot/data2/galaxy/sam/, 
+#then the sam_fa_indices.loc entry would look like this:
+#
+#index	hg18	/depot/data2/galaxy/sam/hg18.fa
+#
+#and your /depot/data2/galaxy/sam/ directory
+#would contain hg18.fa and hg18.fa.fai files:
+#
+#-rw-r--r--  1 james    universe 830134 2005-09-13 10:12 hg18.fa
+#-rw-r--r--  1 james    universe 527388 2005-09-13 10:12 hg18.fa.fai
+#
+#Your sam_fa_indices.loc file should include an entry per line for 
+#each index set you have stored.  The file in the path does actually
+#exist, but it should never be directly used. Instead, the name serves
+#as a prefix for the index file.  For example:
+#
+#index	hg18	/depot/data2/galaxy/sam/hg18.fa
+#index	hg19	/depot/data2/galaxy/sam/hg19.fa
Index: /galaxy-central/tool-data/encode_datasets.loc
===================================================================
--- /galaxy-central/tool-data/encode_datasets.loc (revision 3)
+++ /galaxy-central/tool-data/encode_datasets.loc (revision 3)
@@ -0,0 +1,62 @@
+#This is a sample file distributed with Galaxy that enables tools
+#to use ENCODE data.  The encode_datasets.loc file has this format 
+#(white space characters are TAB characters):
+#
+#<EncodeGroup>	<build>	<DisplayName>	<UniqueID>	<FullPathToFile>	<Format>
+#             Encode Groups: ShortHandCode = Group
+#                                       CC = chromatin and chromosomes
+#                                       GT = genes and transcripts
+#                                      MSA = multi-species sequence analysis
+#                                       TR = transcription regulation
+#                                      ALD = All Latest Datasets
+#All files are assumbed to be BED.
+#
+#ALD	hg17	Latest Datasets (20051208)	all_latest_datasets.20051208.bed	/depot/data2/galaxy/encode-data/all_latest/all_latest_datasets.20051208.bed	bed
+#ALD	hg17	Latest Datasets (20051208) [gencode_partitioned]	all_latest_datasets.20051208.gencode_partitioned.bed	/depot/data2/galaxy/encode-data/all_latest/all_latest_datasets.20051208.gencode_partitioned.bed	bed
+#ALD	hg17	Latest Datasets (20051208) [gencode_partitioned]	all_latest_datasets.20051208.gencode_partitioned.gff	/depot/data2/galaxy/encode-data/all_latest/all_latest_datasets.20051208.gencode_partitioned.gff	gff
+#ALD	hg17	Latest Datasets (20051208)	all_latest_datasets.20051208.gff	/depot/data2/galaxy/encode-data/all_latest/all_latest_datasets.20051208.gff	gff
+#ALD	hg17	Latest Datasets (20051209)	all_latest_datasets.20051209.bed	/depot/data2/galaxy/encode-data/all_latest/all_latest_datasets.20051209.bed	bed
+#ALD	hg17	Latest Datasets (20051209) [gencode_partitioned]	all_latest_datasets.20051209.gencode_partitioned.bed	/depot/data2/galaxy/encode-data/all_latest/all_latest_datasets.20051209.gencode_partitioned.bed	bed
+#ALD	hg17	Latest Datasets (20051209) [gencode_partitioned]	all_latest_datasets.20051209.gencode_partitioned.gff	/depot/data2/galaxy/encode-data/all_latest/all_latest_datasets.20051209.gencode_partitioned.gff	gff
+#ALD	hg17	Latest Datasets (20051209)	all_latest_datasets.20051209.gff	/depot/data2/galaxy/encode-data/all_latest/all_latest_datasets.20051209.gff	gff
+#ALD	hg17	Latest Datasets (20051211)	all_latest_datasets.20051211.bed	/depot/data2/galaxy/encode-data/all_latest/all_latest_datasets.20051211.bed	bed
+#ALD	hg17	Latest Datasets (20051211) [gencode_partitioned]	all_latest_datasets.20051211.gencode_partitioned.bed	/depot/data2/galaxy/encode-data/all_latest/all_latest_datasets.20051211.gencode_partitioned.bed	bed
+#ALD	hg17	Latest Datasets (20051211) [gencode_partitioned]	all_latest_datasets.20051211.gencode_partitioned.gff	/depot/data2/galaxy/encode-data/all_latest/all_latest_datasets.20051211.gencode_partitioned.gff	gff
+#ALD	hg17	Latest Datasets (20051211)	all_latest_datasets.20051211.gff	/depot/data2/galaxy/encode-data/all_latest/all_latest_datasets.20051211.gff	gff
+#ALD	hg17	Latest Datasets (20051212)	all_latest_datasets.20051212.bed	/depot/data2/galaxy/encode-data/all_latest/all_latest_datasets.20051212.bed	bed
+#ALD	hg17	Latest Datasets (20051212) [gencode_partitioned]	all_latest_datasets.20051212.gencode_partitioned.bed	/depot/data2/galaxy/encode-data/all_latest/all_latest_datasets.20051212.gencode_partitioned.bed	bed
+#ALD	hg17	Latest Datasets (20051212) [gencode_partitioned]	all_latest_datasets.20051212.gencode_partitioned.gff	/depot/data2/galaxy/encode-data/all_latest/all_latest_datasets.20051212.gencode_partitioned.gff	gff
+#ALD	hg17	Latest Datasets (20051212)	all_latest_datasets.20051212.gff	/depot/data2/galaxy/encode-data/all_latest/all_latest_datasets.20051212.gff	gff
+#ALD	hg17	Latest Datasets (20051214)	all_latest_datasets.20051214.bed	/depot/data2/galaxy/encode-data/all_latest/all_latest_datasets.20051214.bed	bed
+#ALD	hg17	Latest Datasets (20051214) [gencode_partitioned]	all_latest_datasets.20051214.gencode_partitioned.bed	/depot/data2/galaxy/encode-data/all_latest/all_latest_datasets.20051214.gencode_partitioned.bed	bed
+#ALD	hg17	Latest Datasets (20051214) [gencode_partitioned]	all_latest_datasets.20051214.gencode_partitioned.gff	/depot/data2/galaxy/encode-data/all_latest/all_latest_datasets.20051214.gencode_partitioned.gff	gff
+#ALD	hg17	Latest Datasets (20051214)	all_latest_datasets.20051214.gff	/depot/data2/galaxy/encode-data/all_latest/all_latest_datasets.20051214.gff	gff
+#ALD	hg17	Latest Datasets (20051216)	all_latest_datasets.20051216.bed	/depot/data2/galaxy/encode-data/all_latest/all_latest_datasets.20051216.bed	bed
+#ALD	hg17	Latest Datasets (20051216) [gencode_partitioned]	all_latest_datasets.20051216.gencode_partitioned.bed	/depot/data2/galaxy/encode-data/all_latest/all_latest_datasets.20051216.gencode_partitioned.bed	bed
+#ALD	hg17	Latest Datasets (20051216) [gencode_partitioned]	all_latest_datasets.20051216.gencode_partitioned.gff	/depot/data2/galaxy/encode-data/all_latest/all_latest_datasets.20051216.gencode_partitioned.gff	gff
+#ALD	hg17	Latest Datasets (20051216)	all_latest_datasets.20051216.gff	/depot/data2/galaxy/encode-data/all_latest/all_latest_datasets.20051216.gff	gff
+#ALD	hg17	Latest Datasets (20060105)	all_latest_datasets.20060105.bed	/depot/data2/galaxy/encode-data/all_latest/all_latest_datasets.20060105.bed	bed
+#ALD	hg17	Latest Datasets (20060105) [gencode_partitioned]	all_latest_datasets.20060105.gencode_partitioned.bed	/depot/data2/galaxy/encode-data/all_latest/all_latest_datasets.20060105.gencode_partitioned.bed	bed
+#ALD	hg17	Latest Datasets (20060105) [gencode_partitioned]	all_latest_datasets.20060105.gencode_partitioned.gff	/depot/data2/galaxy/encode-data/all_latest/all_latest_datasets.20060105.gencode_partitioned.gff	gff
+#ALD	hg17	Latest Datasets (20060105)	all_latest_datasets.20060105.gff	/depot/data2/galaxy/encode-data/all_latest/all_latest_datasets.20060105.gff	gff
+#ALD	hg17	Latest Datasets (20060106)	all_latest_datasets.20060106.bed	/depot/data2/galaxy/encode-data/all_latest/all_latest_datasets.20060106.bed	bed
+#ALD	hg17	Latest Datasets (20060106) [gencode_partitioned]	all_latest_datasets.20060106.gencode_partitioned.bed	/depot/data2/galaxy/encode-data/all_latest/all_latest_datasets.20060106.gencode_partitioned.bed	bed
+#ALD	hg17	Latest Datasets (20060106) [gencode_partitioned]	all_latest_datasets.20060106.gencode_partitioned.gff	/depot/data2/galaxy/encode-data/all_latest/all_latest_datasets.20060106.gencode_partitioned.gff	gff
+#ALD	hg17	Latest Datasets (20060106)	all_latest_datasets.20060106.gff	/depot/data2/galaxy/encode-data/all_latest/all_latest_datasets.20060106.gff	gff
+#ALD	hg17	Latest Datasets (20060116)	all_latest_datasets.20060116.bed	/depot/data2/galaxy/encode-data/all_latest/all_latest_datasets.20060116.bed	bed
+#ALD	hg17	Latest Datasets (20060116) [gencode_partitioned]	all_latest_datasets.20060116.gencode_partitioned.bed	/depot/data2/galaxy/encode-data/all_latest/all_latest_datasets.20060116.gencode_partitioned.bed	bed
+#ALD	hg17	Latest Datasets (20060116) [gencode_partitioned]	all_latest_datasets.20060116.gencode_partitioned.gff	/depot/data2/galaxy/encode-data/all_latest/all_latest_datasets.20060116.gencode_partitioned.gff	gff
+#ALD	hg17	Latest Datasets (20060116)	all_latest_datasets.20060116.gff	/depot/data2/galaxy/encode-data/all_latest/all_latest_datasets.20060116.gff	gff
+#ALD	hg17	Latest Datasets (20060124)	all_latest_datasets.20060124.bed	/depot/data2/galaxy/encode-data/all_latest/all_latest_datasets.20060124.bed	bed
+#ALD	hg17	Latest Datasets (20060124) [gencode_partitioned]	all_latest_datasets.20060124.gencode_partitioned.bed	/depot/data2/galaxy/encode-data/all_latest/all_latest_datasets.20060124.gencode_partitioned.bed	bed
+#ALD	hg17	Latest Datasets (20060124) [gencode_partitioned]	all_latest_datasets.20060124.gencode_partitioned.gff	/depot/data2/galaxy/encode-data/all_latest/all_latest_datasets.20060124.gencode_partitioned.gff	gff
+#ALD	hg17	Latest Datasets (20060124)	all_latest_datasets.20060124.gff	/depot/data2/galaxy/encode-data/all_latest/all_latest_datasets.20060124.gff	gff
+#ALD	hg17	Latest Datasets (20060204)	all_latest_datasets.20060204.bed	/depot/data2/galaxy/encode-data/all_latest/all_latest_datasets.20060204.bed	bed
+#ALD	hg17	Latest Datasets (20060204) [gencode_partitioned]	all_latest_datasets.20060204.gencode_partitioned.bed	/depot/data2/galaxy/encode-data/all_latest/all_latest_datasets.20060204.gencode_partitioned.bed	bed
+#ALD	hg17	Latest Datasets (20060204) [gencode_partitioned]	all_latest_datasets.20060204.gencode_partitioned.gff	/depot/data2/galaxy/encode-data/all_latest/all_latest_datasets.20060204.gencode_partitioned.gff	gff
+#ALD	hg17	Latest Datasets (20060204)	all_latest_datasets.20060204.gff	/depot/data2/galaxy/encode-data/all_latest/all_latest_datasets.20060204.gff	gff
+#ALD	hg17	Latest Datasets (20060206)	all_latest_datasets.20060206.bed	/depot/data2/galaxy/encode-data/all_latest/all_latest_datasets.20060206.bed	bed
+#ALD	hg17	Latest Datasets (20060206) [gencode_partitioned]	all_latest_datasets.20060206.gencode_partitioned.bed	/depot/data2/galaxy/encode-data/all_latest/all_latest_datasets.20060206.gencode_partitioned.bed	bed
+#ALD	hg17	Latest Datasets (20060206) [gencode_partitioned]	all_latest_datasets.20060206.gencode_partitioned.gff	/depot/data2/galaxy/encode-data/all_latest/all_latest_datasets.20060206.gencode_partitioned.gff	gff
+#ALD	hg17	Latest Datasets (20060206)	all_latest_datasets.20060206.gff	/depot/data2/galaxy/encode-data/all_latest/all_latest_datasets.20060206.gff	gff
+#ALD	hg17	Latest Datasets (20060209) [gencode_partitioned]	all_latest_datasets.20060209.gencode_partitioned.bed	/depot/data2/galaxy/encode-data/all_latest/all_latest_datasets.20060209.gencode_partitioned.bed	bed
Index: /galaxy-central/tool-data/bowtie_indices_color.loc
===================================================================
--- /galaxy-central/tool-data/bowtie_indices_color.loc (revision 3)
+++ /galaxy-central/tool-data/bowtie_indices_color.loc (revision 3)
@@ -0,0 +1,31 @@
+#This is a sample file distributed with Galaxy that enables tools
+#to use a directory of colorspace Bowtie indexed sequences data files.  
+#You will need to create these data files and then create a 
+#bowtie_indices_color.loc file similar to this one (store it in this 
+#directory) that points to the directories in which those files are 
+#stored. The bowtie_indices_color.loc file has this format (white 
+#space characters are TAB characters):
+#
+#<build>	<file_base>
+#
+#So, for example, if you had hg18 indexed stored in 
+#/depot/data2/galaxy/bowtie/hg18/, 
+#then the bowtie_indices_color.loc entry would look like this:
+#
+#hg18	/depot/data2/galaxy/bowtie/hg18/hg18
+#
+#and your /depot/data2/galaxy/bowtie/hg18/ directory
+#would contain hg18.*.ebwt files:
+#
+#-rw-r--r--  1 james    universe 830134 2005-09-13 10:12 hg18.1.ebwt
+#-rw-r--r--  1 james    universe 527388 2005-09-13 10:12 hg18.2.ebwt
+#-rw-r--r--  1 james    universe 269808 2005-09-13 10:12 gh18.3.ebwt
+#...etc...
+#
+#Your bowtie_indices_color.loc file should include an entry per line 
+#for each index set you have stored.  The "file" in the path does not 
+#actually exist, but it is the prefix for the actual index files. For 
+#example:
+#
+#hg18	/depot/data2/galaxy/bowtie/hg18/hg18
+#hg19	/depot/data2/galaxy/bowtie/hg19/hg19
Index: /galaxy-central/tool-data/maf_index.loc
===================================================================
--- /galaxy-central/tool-data/maf_index.loc (revision 3)
+++ /galaxy-central/tool-data/maf_index.loc (revision 3)
@@ -0,0 +1,17 @@
+#This is a sample file distributed with Galaxy that is used by some
+#alignment tools.  The maf_index.loc file has this format (white space 
+#characters are TAB characters):
+#
+#<Display_name UID>	<indexed_for:build1,build2,build3>	<exists_in_maf:build1,build2,build3>	<Comma_Separated_List_of_Full_Paths_To_Files>
+#
+#ENCODE TBA (hg17)	ENCODE_TBA_hg17	armadillo,baboon,galGal2,panTro1,colobus_monkey,cow,canFam1,dusky_titi,elephant,fr1,galago,hedgehog,hg17,rheMac1,marmoset,monDom1,mm6,mouse_lemur,owl_monkey,platypus,rabbit,rn3,rfbat,shrew,tenrec,tetNig1,xenTro1,danRer2	armadillo,baboon,galGal2,panTro1,colobus_monkey,cow,canFam1,dusky_titi,elephant,fr1,galago,hedgehog,hg17,rheMac1,marmoset,monDom1,mm6,mouse_lemur,owl_monkey,platypus,rabbit,rn3,rfbat,shrew,tenrec,tetNig1,xenTro1,danRer2	/depot/data2/galaxy/hg17/align/encode_relabeled/tba/ENm001/human.ENm001.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/tba/ENm002/human.ENm002.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/tba/ENm003/human.ENm003.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/tba/ENm004/human.ENm004.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/tba/ENm005/human.ENm005.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/tba/ENm006/human.ENm006.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/tba/ENm007/human.ENm007.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/tba/ENm008/human.ENm008.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/tba/ENm009/human.ENm009.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/tba/ENm010/human.ENm010.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/tba/ENm011/human.ENm011.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/tba/ENm012/human.ENm012.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/tba/ENm013/human.ENm013.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/tba/ENm014/human.ENm014.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/tba/ENr111/human.ENr111.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/tba/ENr112/human.ENr112.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/tba/ENr113/human.ENr113.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/tba/ENr114/human.ENr114.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/tba/ENr121/human.ENr121.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/tba/ENr122/human.ENr122.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/tba/ENr123/human.ENr123.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/tba/ENr131/human.ENr131.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/tba/ENr132/human.ENr132.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/tba/ENr133/human.ENr133.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/tba/ENr211/human.ENr211.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/tba/ENr212/human.ENr212.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/tba/ENr213/human.ENr213.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/tba/ENr221/human.ENr221.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/tba/ENr222/human.ENr222.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/tba/ENr223/human.ENr223.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/tba/ENr231/human.ENr231.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/tba/ENr232/human.ENr232.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/tba/ENr233/human.ENr233.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/tba/ENr311/human.ENr311.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/tba/ENr312/human.ENr312.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/tba/ENr313/human.ENr313.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/tba/ENr321/human.ENr321.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/tba/ENr322/human.ENr322.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/tba/ENr323/human.ENr323.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/tba/ENr324/human.ENr324.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/tba/ENr331/human.ENr331.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/tba/ENr332/human.ENr332.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/tba/ENr333/human.ENr333.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/tba/ENr334/human.ENr334.maf
+#ENCODE MAVID (hg17)	ENCODE_MAVID_hg17	armadillo,baboon,galGal2,panTro1,colobus_monkey,cow,canFam1,dusky_titi,elephant,fr1,galago,hedgehog,hg17,rheMac1,marmoset,monDom1,mm6,mouse_lemur,owl_monkey,platypus,rabbit,rn3,rfbat,shrew,tenrec,tetNig1,xenTro1,danRer2	armadillo,baboon,galGal2,panTro1,colobus_monkey,cow,canFam1,dusky_titi,elephant,fr1,galago,hedgehog,hg17,rheMac1,marmoset,monDom1,mm6,mouse_lemur,owl_monkey,platypus,rabbit,rn3,rfbat,shrew,tenrec,tetNig1,xenTro1,danRer2	/depot/data2/galaxy/hg17/align/encode_relabeled/mavid/abs/ENm001.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/mavid/abs/ENm002.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/mavid/abs/ENm003.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/mavid/abs/ENm004.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/mavid/abs/ENm005.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/mavid/abs/ENm006.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/mavid/abs/ENm007.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/mavid/abs/ENm008.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/mavid/abs/ENm009.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/mavid/abs/ENm010.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/mavid/abs/ENm011.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/mavid/abs/ENm012.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/mavid/abs/ENm013.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/mavid/abs/ENm014.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/mavid/abs/ENr111.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/mavid/abs/ENr112.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/mavid/abs/ENr113.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/mavid/abs/ENr114.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/mavid/abs/ENr121.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/mavid/abs/ENr122.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/mavid/abs/ENr123.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/mavid/abs/ENr131.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/mavid/abs/ENr132.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/mavid/abs/ENr133.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/mavid/abs/ENr211.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/mavid/abs/ENr212.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/mavid/abs/ENr213.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/mavid/abs/ENr221.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/mavid/abs/ENr222.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/mavid/abs/ENr223.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/mavid/abs/ENr231.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/mavid/abs/ENr232.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/mavid/abs/ENr233.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/mavid/abs/ENr311.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/mavid/abs/ENr312.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/mavid/abs/ENr313.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/mavid/abs/ENr321.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/mavid/abs/ENr322.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/mavid/abs/ENr323.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/mavid/abs/ENr324.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/mavid/abs/ENr331.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/mavid/abs/ENr332.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/mavid/abs/ENr333.maf,/depot/data2/galaxy/hg17/align/encode_relabeled/mavid/abs/ENr334.maf
+#ENCODE TBA (hg16)	ENCODE_TBA_hg16	armadillo,baboon,galGal2,panTro1,colobus_monkey,cow,canFam1,dusky_titi,elephant=elephant,fr1,galago,hedgehog,hg16,rheMac1,marmoset,monDom1,mm6,mouse_lemur,owl_monkey,platypus,rabbit,rn3,rfbat,shrew,tenrec,tetNig1,xenTro1,danRer2	armadillo,baboon,galGal2,panTro1,colobus_monkey,cow,canFam1,dusky_titi,elephant=elephant,fr1,galago,hedgehog,hg16,rheMac1,marmoset,monDom1,mm6,mouse_lemur,owl_monkey,platypus,rabbit,rn3,rfbat,shrew,tenrec,tetNig1,xenTro1,danRer2	/depot/data2/galaxy/hg16/align/encode/june2005freeze/tba/human.ENm001.maf,/depot/data2/galaxy/hg16/align/encode/june2005freeze/tba/human.ENm002.maf,/depot/data2/galaxy/hg16/align/encode/june2005freeze/tba/human.ENm003.maf,/depot/data2/galaxy/hg16/align/encode/june2005freeze/tba/human.ENm004.maf,/depot/data2/galaxy/hg16/align/encode/june2005freeze/tba/human.ENm005.maf,/depot/data2/galaxy/hg16/align/encode/june2005freeze/tba/human.ENm006.maf,/depot/data2/galaxy/hg16/align/encode/june2005freeze/tba/human.ENm007.maf,/depot/data2/galaxy/hg16/align/encode/june2005freeze/tba/human.ENm008.maf,/depot/data2/galaxy/hg16/align/encode/june2005freeze/tba/human.ENm009.maf,/depot/data2/galaxy/hg16/align/encode/june2005freeze/tba/human.ENm010.maf,/depot/data2/galaxy/hg16/align/encode/june2005freeze/tba/human.ENm011.maf,/depot/data2/galaxy/hg16/align/encode/june2005freeze/tba/human.ENm012.maf,/depot/data2/galaxy/hg16/align/encode/june2005freeze/tba/human.ENm013.maf,/depot/data2/galaxy/hg16/align/encode/june2005freeze/tba/human.ENm014.maf,/depot/data2/galaxy/hg16/align/encode/june2005freeze/tba/human.ENr111.maf,/depot/data2/galaxy/hg16/align/encode/june2005freeze/tba/human.ENr112.maf,/depot/data2/galaxy/hg16/align/encode/june2005freeze/tba/human.ENr113.maf,/depot/data2/galaxy/hg16/align/encode/june2005freeze/tba/human.ENr114.maf,/depot/data2/galaxy/hg16/align/encode/june2005freeze/tba/human.ENr121.maf,/depot/data2/galaxy/hg16/align/encode/june2005freeze/tba/human.ENr122.maf,/depot/data2/galaxy/hg16/align/encode/june2005freeze/tba/human.ENr123.maf,/depot/data2/galaxy/hg16/align/encode/june2005freeze/tba/human.ENr131.maf,/depot/data2/galaxy/hg16/align/encode/june2005freeze/tba/human.ENr132.maf,/depot/data2/galaxy/hg16/align/encode/june2005freeze/tba/human.ENr133.maf,/depot/data2/galaxy/hg16/align/encode/june2005freeze/tba/human.ENr211.maf,/depot/data2/galaxy/hg16/align/encode/june2005freeze/tba/human.ENr212.maf,/depot/data2/galaxy/hg16/align/encode/june2005freeze/tba/human.ENr213.maf,/depot/data2/galaxy/hg16/align/encode/june2005freeze/tba/human.ENr221.maf,/depot/data2/galaxy/hg16/align/encode/june2005freeze/tba/human.ENr222.maf,/depot/data2/galaxy/hg16/align/encode/june2005freeze/tba/human.ENr223.maf,/depot/data2/galaxy/hg16/align/encode/june2005freeze/tba/human.ENr231.maf,/depot/data2/galaxy/hg16/align/encode/june2005freeze/tba/human.ENr232.maf,/depot/data2/galaxy/hg16/align/encode/june2005freeze/tba/human.ENr233.maf,/depot/data2/galaxy/hg16/align/encode/june2005freeze/tba/human.ENr311.maf,/depot/data2/galaxy/hg16/align/encode/june2005freeze/tba/human.ENr312.maf,/depot/data2/galaxy/hg16/align/encode/june2005freeze/tba/human.ENr313.maf,/depot/data2/galaxy/hg16/align/encode/june2005freeze/tba/human.ENr321.maf,/depot/data2/galaxy/hg16/align/encode/june2005freeze/tba/human.ENr322.maf,/depot/data2/galaxy/hg16/align/encode/june2005freeze/tba/human.ENr323.maf,/depot/data2/galaxy/hg16/align/encode/june2005freeze/tba/human.ENr324.maf,/depot/data2/galaxy/hg16/align/encode/june2005freeze/tba/human.ENr331.maf,/depot/data2/galaxy/hg16/align/encode/june2005freeze/tba/human.ENr332.maf,/depot/data2/galaxy/hg16/align/encode/june2005freeze/tba/human.ENr333.maf,/depot/data2/galaxy/hg16/align/encode/june2005freeze/tba/human.ENr334.maf
+#8-way multiZ (hg17)	8_WAY_MULTIZ_hg17	canFam1,danRer1,fr1,galGal2,hg17,mm5,panTro1,rn3	canFam1,danRer1,fr1,galGal2,hg17,mm5,panTro1,rn3	/depot/data2/galaxy/hg17/align/8way-multiZ/chr1.maf,/depot/data2/galaxy/hg17/align/8way-multiZ/chr1_random.maf,/depot/data2/galaxy/hg17/align/8way-multiZ/chr10.maf,/depot/data2/galaxy/hg17/align/8way-multiZ/chr10_random.maf,/depot/data2/galaxy/hg17/align/8way-multiZ/chr11.maf,/depot/data2/galaxy/hg17/align/8way-multiZ/chr12.maf,/depot/data2/galaxy/hg17/align/8way-multiZ/chr12_random.maf,/depot/data2/galaxy/hg17/align/8way-multiZ/chr13.maf,/depot/data2/galaxy/hg17/align/8way-multiZ/chr13_random.maf,/depot/data2/galaxy/hg17/align/8way-multiZ/chr14.maf,/depot/data2/galaxy/hg17/align/8way-multiZ/chr15.maf,/depot/data2/galaxy/hg17/align/8way-multiZ/chr15_random.maf,/depot/data2/galaxy/hg17/align/8way-multiZ/chr16.maf,/depot/data2/galaxy/hg17/align/8way-multiZ/chr16_random.maf,/depot/data2/galaxy/hg17/align/8way-multiZ/chr17.maf,/depot/data2/galaxy/hg17/align/8way-multiZ/chr17_random.maf,/depot/data2/galaxy/hg17/align/8way-multiZ/chr18.maf,/depot/data2/galaxy/hg17/align/8way-multiZ/chr18_random.maf,/depot/data2/galaxy/hg17/align/8way-multiZ/chr19.maf,/depot/data2/galaxy/hg17/align/8way-multiZ/chr19_random.maf,/depot/data2/galaxy/hg17/align/8way-multiZ/chr2.maf,/depot/data2/galaxy/hg17/align/8way-multiZ/chr2_random.maf,/depot/data2/galaxy/hg17/align/8way-multiZ/chr20.maf,/depot/data2/galaxy/hg17/align/8way-multiZ/chr21.maf,/depot/data2/galaxy/hg17/align/8way-multiZ/chr22.maf,/depot/data2/galaxy/hg17/align/8way-multiZ/chr22_random.maf,/depot/data2/galaxy/hg17/align/8way-multiZ/chr3.maf,/depot/data2/galaxy/hg17/align/8way-multiZ/chr3_random.maf,/depot/data2/galaxy/hg17/align/8way-multiZ/chr4.maf,/depot/data2/galaxy/hg17/align/8way-multiZ/chr4_random.maf,/depot/data2/galaxy/hg17/align/8way-multiZ/chr5.maf,/depot/data2/galaxy/hg17/align/8way-multiZ/chr5_random.maf,/depot/data2/galaxy/hg17/align/8way-multiZ/chr6.maf,/depot/data2/galaxy/hg17/align/8way-multiZ/chr6_hla_hap1.maf,/depot/data2/galaxy/hg17/align/8way-multiZ/chr6_hla_hap2.maf,/depot/data2/galaxy/hg17/align/8way-multiZ/chr6_random.maf,/depot/data2/galaxy/hg17/align/8way-multiZ/chr7.maf,/depot/data2/galaxy/hg17/align/8way-multiZ/chr7_random.maf,/depot/data2/galaxy/hg17/align/8way-multiZ/chr8.maf,/depot/data2/galaxy/hg17/align/8way-multiZ/chr8_random.maf,/depot/data2/galaxy/hg17/align/8way-multiZ/chr9.maf,/depot/data2/galaxy/hg17/align/8way-multiZ/chr9_random.maf,/depot/data2/galaxy/hg17/align/8way-multiZ/chrM.maf,/depot/data2/galaxy/hg17/align/8way-multiZ/chrX.maf,/depot/data2/galaxy/hg17/align/8way-multiZ/chrX_random.maf,/depot/data2/galaxy/hg17/align/8way-multiZ/chrY.maf
+#17-way multiZ (hg18)	17_WAY_MULTIZ_hg18	hg18,panTro1,bosTau2,rheMac2,mm8,rn4,canFam2,echTel1,loxAfr1,oryCun1,danRer3,monDom4,dasNov1,galGal2,fr1,tetNig1,xenTro1	hg18,panTro1,bosTau2,rheMac2,mm8,rn4,canFam2,echTel1,loxAfr1,oryCun1,danRer3,monDom4,dasNov1,galGal2,fr1,tetNig1,xenTro1	/depot/data2/galaxy/hg18/align/17way-multiZ/chr10.maf,/depot/data2/galaxy/hg18/align/17way-multiZ/chr10_random.maf,/depot/data2/galaxy/hg18/align/17way-multiZ/chr11.maf,/depot/data2/galaxy/hg18/align/17way-multiZ/chr11_random.maf,/depot/data2/galaxy/hg18/align/17way-multiZ/chr12.maf,/depot/data2/galaxy/hg18/align/17way-multiZ/chr13.maf,/depot/data2/galaxy/hg18/align/17way-multiZ/chr13_random.maf,/depot/data2/galaxy/hg18/align/17way-multiZ/chr14.maf,/depot/data2/galaxy/hg18/align/17way-multiZ/chr15.maf,/depot/data2/galaxy/hg18/align/17way-multiZ/chr15_random.maf,/depot/data2/galaxy/hg18/align/17way-multiZ/chr16.maf,/depot/data2/galaxy/hg18/align/17way-multiZ/chr16_random.maf,/depot/data2/galaxy/hg18/align/17way-multiZ/chr17.maf,/depot/data2/galaxy/hg18/align/17way-multiZ/chr17_random.maf,/depot/data2/galaxy/hg18/align/17way-multiZ/chr18.maf,/depot/data2/galaxy/hg18/align/17way-multiZ/chr18_random.maf,/depot/data2/galaxy/hg18/align/17way-multiZ/chr19.maf,/depot/data2/galaxy/hg18/align/17way-multiZ/chr19_random.maf,/depot/data2/galaxy/hg18/align/17way-multiZ/chr1.maf,/depot/data2/galaxy/hg18/align/17way-multiZ/chr1_random.maf,/depot/data2/galaxy/hg18/align/17way-multiZ/chr20.maf,/depot/data2/galaxy/hg18/align/17way-multiZ/chr21.maf,/depot/data2/galaxy/hg18/align/17way-multiZ/chr21_random.maf,/depot/data2/galaxy/hg18/align/17way-multiZ/chr22_h2_hap1.maf,/depot/data2/galaxy/hg18/align/17way-multiZ/chr22.maf,/depot/data2/galaxy/hg18/align/17way-multiZ/chr22_random.maf,/depot/data2/galaxy/hg18/align/17way-multiZ/chr2.maf,/depot/data2/galaxy/hg18/align/17way-multiZ/chr2_random.maf,/depot/data2/galaxy/hg18/align/17way-multiZ/chr3.maf,/depot/data2/galaxy/hg18/align/17way-multiZ/chr3_random.maf,/depot/data2/galaxy/hg18/align/17way-multiZ/chr4.maf,/depot/data2/galaxy/hg18/align/17way-multiZ/chr4_random.maf,/depot/data2/galaxy/hg18/align/17way-multiZ/chr5_h2_hap1.maf,/depot/data2/galaxy/hg18/align/17way-multiZ/chr5.maf,/depot/data2/galaxy/hg18/align/17way-multiZ/chr5_random.maf,/depot/data2/galaxy/hg18/align/17way-multiZ/chr6_cox_hap1.maf,/depot/data2/galaxy/hg18/align/17way-multiZ/chr6.maf,/depot/data2/galaxy/hg18/align/17way-multiZ/chr6_qbl_hap2.maf,/depot/data2/galaxy/hg18/align/17way-multiZ/chr6_random.maf,/depot/data2/galaxy/hg18/align/17way-multiZ/chr7.maf,/depot/data2/galaxy/hg18/align/17way-multiZ/chr7_random.maf,/depot/data2/galaxy/hg18/align/17way-multiZ/chr8.maf,/depot/data2/galaxy/hg18/align/17way-multiZ/chr8_random.maf,/depot/data2/galaxy/hg18/align/17way-multiZ/chr9.maf,/depot/data2/galaxy/hg18/align/17way-multiZ/chr9_random.maf,/depot/data2/galaxy/hg18/align/17way-multiZ/chrM.maf,/depot/data2/galaxy/hg18/align/17way-multiZ/chrX.maf,/depot/data2/galaxy/hg18/align/17way-multiZ/chrX_random.maf,/depot/data2/galaxy/hg18/align/17way-multiZ/chrY.maf
+#3-way multiZ (hg18,panTro2,rheMac2)	3_WAY_MULTIZ_hg18	hg18,panTro2,rheMac2	hg18,panTro2,rheMac2	/depot/data2/galaxy/hg18/align/3way-multiZ/chr10.maf,/depot/data2/galaxy/hg18/align/3way-multiZ/chr10_random.maf,/depot/data2/galaxy/hg18/align/3way-multiZ/chr11.maf,/depot/data2/galaxy/hg18/align/3way-multiZ/chr11_random.maf,/depot/data2/galaxy/hg18/align/3way-multiZ/chr12.maf,/depot/data2/galaxy/hg18/align/3way-multiZ/chr13.maf,/depot/data2/galaxy/hg18/align/3way-multiZ/chr13_random.maf,/depot/data2/galaxy/hg18/align/3way-multiZ/chr14.maf,/depot/data2/galaxy/hg18/align/3way-multiZ/chr15.maf,/depot/data2/galaxy/hg18/align/3way-multiZ/chr15_random.maf,/depot/data2/galaxy/hg18/align/3way-multiZ/chr16.maf,/depot/data2/galaxy/hg18/align/3way-multiZ/chr16_random.maf,/depot/data2/galaxy/hg18/align/3way-multiZ/chr17.maf,/depot/data2/galaxy/hg18/align/3way-multiZ/chr17_random.maf,/depot/data2/galaxy/hg18/align/3way-multiZ/chr18.maf,/depot/data2/galaxy/hg18/align/3way-multiZ/chr18_random.maf,/depot/data2/galaxy/hg18/align/3way-multiZ/chr19.maf,/depot/data2/galaxy/hg18/align/3way-multiZ/chr19_random.maf,/depot/data2/galaxy/hg18/align/3way-multiZ/chr1.maf,/depot/data2/galaxy/hg18/align/3way-multiZ/chr1_random.maf,/depot/data2/galaxy/hg18/align/3way-multiZ/chr20.maf,/depot/data2/galaxy/hg18/align/3way-multiZ/chr21.maf,/depot/data2/galaxy/hg18/align/3way-multiZ/chr21_random.maf,/depot/data2/galaxy/hg18/align/3way-multiZ/chr22_h2_hap1.maf,/depot/data2/galaxy/hg18/align/3way-multiZ/chr22.maf,/depot/data2/galaxy/hg18/align/3way-multiZ/chr22_random.maf,/depot/data2/galaxy/hg18/align/3way-multiZ/chr2.maf,/depot/data2/galaxy/hg18/align/3way-multiZ/chr2_random.maf,/depot/data2/galaxy/hg18/align/3way-multiZ/chr3.maf,/depot/data2/galaxy/hg18/align/3way-multiZ/chr3_random.maf,/depot/data2/galaxy/hg18/align/3way-multiZ/chr4.maf,/depot/data2/galaxy/hg18/align/3way-multiZ/chr4_random.maf,/depot/data2/galaxy/hg18/align/3way-multiZ/chr5_h2_hap1.maf,/depot/data2/galaxy/hg18/align/3way-multiZ/chr5.maf,/depot/data2/galaxy/hg18/align/3way-multiZ/chr5_random.maf,/depot/data2/galaxy/hg18/align/3way-multiZ/chr6_cox_hap1.maf,/depot/data2/galaxy/hg18/align/3way-multiZ/chr6.maf,/depot/data2/galaxy/hg18/align/3way-multiZ/chr6_qbl_hap2.maf,/depot/data2/galaxy/hg18/align/3way-multiZ/chr6_random.maf,/depot/data2/galaxy/hg18/align/3way-multiZ/chr7.maf,/depot/data2/galaxy/hg18/align/3way-multiZ/chr7_random.maf,/depot/data2/galaxy/hg18/align/3way-multiZ/chr8.maf,/depot/data2/galaxy/hg18/align/3way-multiZ/chr8_random.maf,/depot/data2/galaxy/hg18/align/3way-multiZ/chr9.maf,/depot/data2/galaxy/hg18/align/3way-multiZ/chr9_random.maf,/depot/data2/galaxy/hg18/align/3way-multiZ/chrM.maf,/depot/data2/galaxy/hg18/align/3way-multiZ/chrX.maf,/depot/data2/galaxy/hg18/align/3way-multiZ/chrX_random.maf,/depot/data2/galaxy/hg18/align/3way-multiZ/chrY.maf
+#5-way multiZ (hg18,panTro2,rheMac2,mm8,canFam2)	5_WAY_MULTIZ_hg18	hg18,panTro2,rheMac2,mm8,canFam2	hg18,panTro2,rheMac2,mm8,canFam2	/depot/data2/galaxy/hg18/align/5way-multiZ/chr10.maf,/depot/data2/galaxy/hg18/align/5way-multiZ/chr10_random.maf,/depot/data2/galaxy/hg18/align/5way-multiZ/chr11.maf,/depot/data2/galaxy/hg18/align/5way-multiZ/chr11_random.maf,/depot/data2/galaxy/hg18/align/5way-multiZ/chr12.maf,/depot/data2/galaxy/hg18/align/5way-multiZ/chr13.maf,/depot/data2/galaxy/hg18/align/5way-multiZ/chr13_random.maf,/depot/data2/galaxy/hg18/align/5way-multiZ/chr14.maf,/depot/data2/galaxy/hg18/align/5way-multiZ/chr15.maf,/depot/data2/galaxy/hg18/align/5way-multiZ/chr15_random.maf,/depot/data2/galaxy/hg18/align/5way-multiZ/chr16.maf,/depot/data2/galaxy/hg18/align/5way-multiZ/chr16_random.maf,/depot/data2/galaxy/hg18/align/5way-multiZ/chr17.maf,/depot/data2/galaxy/hg18/align/5way-multiZ/chr17_random.maf,/depot/data2/galaxy/hg18/align/5way-multiZ/chr18.maf,/depot/data2/galaxy/hg18/align/5way-multiZ/chr18_random.maf,/depot/data2/galaxy/hg18/align/5way-multiZ/chr19.maf,/depot/data2/galaxy/hg18/align/5way-multiZ/chr19_random.maf,/depot/data2/galaxy/hg18/align/5way-multiZ/chr1.maf,/depot/data2/galaxy/hg18/align/5way-multiZ/chr1_random.maf,/depot/data2/galaxy/hg18/align/5way-multiZ/chr20.maf,/depot/data2/galaxy/hg18/align/5way-multiZ/chr21.maf,/depot/data2/galaxy/hg18/align/5way-multiZ/chr21_random.maf,/depot/data2/galaxy/hg18/align/5way-multiZ/chr22_h2_hap1.maf,/depot/data2/galaxy/hg18/align/5way-multiZ/chr22.maf,/depot/data2/galaxy/hg18/align/5way-multiZ/chr22_random.maf,/depot/data2/galaxy/hg18/align/5way-multiZ/chr2.maf,/depot/data2/galaxy/hg18/align/5way-multiZ/chr2_random.maf,/depot/data2/galaxy/hg18/align/5way-multiZ/chr3.maf,/depot/data2/galaxy/hg18/align/5way-multiZ/chr3_random.maf,/depot/data2/galaxy/hg18/align/5way-multiZ/chr4.maf,/depot/data2/galaxy/hg18/align/5way-multiZ/chr4_random.maf,/depot/data2/galaxy/hg18/align/5way-multiZ/chr5_h2_hap1.maf,/depot/data2/galaxy/hg18/align/5way-multiZ/chr5.maf,/depot/data2/galaxy/hg18/align/5way-multiZ/chr5_random.maf,/depot/data2/galaxy/hg18/align/5way-multiZ/chr6_cox_hap1.maf,/depot/data2/galaxy/hg18/align/5way-multiZ/chr6.maf,/depot/data2/galaxy/hg18/align/5way-multiZ/chr6_qbl_hap2.maf,/depot/data2/galaxy/hg18/align/5way-multiZ/chr6_random.maf,/depot/data2/galaxy/hg18/align/5way-multiZ/chr7.maf,/depot/data2/galaxy/hg18/align/5way-multiZ/chr7_random.maf,/depot/data2/galaxy/hg18/align/5way-multiZ/chr8.maf,/depot/data2/galaxy/hg18/align/5way-multiZ/chr8_random.maf,/depot/data2/galaxy/hg18/align/5way-multiZ/chr9.maf,/depot/data2/galaxy/hg18/align/5way-multiZ/chr9_random.maf,/depot/data2/galaxy/hg18/align/5way-multiZ/chrM.maf,/depot/data2/galaxy/hg18/align/5way-multiZ/chrX.maf,/depot/data2/galaxy/hg18/align/5way-multiZ/chrX_random.maf,/depot/data2/galaxy/hg18/align/5way-multiZ/chrY.maf
+#28-way multiZ (hg18)	28_WAY_MULTIZ_hg18	hg18	hg18,dasNov1,otoGar1,felCat3,galGal3,panTro2,bosTau3,canFam2,loxAfr1,xenTro2,fr2,cavPor2,eriEur1,equCab1,anoCar1,oryLat1,mm8,monDom4,ornAna1,oryCun1,rn4,rheMac2,sorAra1,gasAcu1,echTel1,tetNig1,tupBel1,danRer4	/depot/data2/galaxy/hg18/align/multiz28way/chr1.maf.lzo,/depot/data2/galaxy/hg18/align/multiz28way/chr10.maf.lzo,/depot/data2/galaxy/hg18/align/multiz28way/chr10_random.maf.lzo,/depot/data2/galaxy/hg18/align/multiz28way/chr11.maf.lzo,/depot/data2/galaxy/hg18/align/multiz28way/chr11_random.maf.lzo,/depot/data2/galaxy/hg18/align/multiz28way/chr12.maf.lzo,/depot/data2/galaxy/hg18/align/multiz28way/chr13.maf.lzo,/depot/data2/galaxy/hg18/align/multiz28way/chr13_random.maf.lzo,/depot/data2/galaxy/hg18/align/multiz28way/chr14.maf.lzo,/depot/data2/galaxy/hg18/align/multiz28way/chr15.maf.lzo,/depot/data2/galaxy/hg18/align/multiz28way/chr15_random.maf.lzo,/depot/data2/galaxy/hg18/align/multiz28way/chr16.maf.lzo,/depot/data2/galaxy/hg18/align/multiz28way/chr16_random.maf.lzo,/depot/data2/galaxy/hg18/align/multiz28way/chr17.maf.lzo,/depot/data2/galaxy/hg18/align/multiz28way/chr17_random.maf.lzo,/depot/data2/galaxy/hg18/align/multiz28way/chr18.maf.lzo,/depot/data2/galaxy/hg18/align/multiz28way/chr18_random.maf.lzo,/depot/data2/galaxy/hg18/align/multiz28way/chr19.maf.lzo,/depot/data2/galaxy/hg18/align/multiz28way/chr19_random.maf.lzo,/depot/data2/galaxy/hg18/align/multiz28way/chr1_random.maf.lzo,/depot/data2/galaxy/hg18/align/multiz28way/chr2.maf.lzo,/depot/data2/galaxy/hg18/align/multiz28way/chr20.maf.lzo,/depot/data2/galaxy/hg18/align/multiz28way/chr21.maf.lzo,/depot/data2/galaxy/hg18/align/multiz28way/chr21_random.maf.lzo,/depot/data2/galaxy/hg18/align/multiz28way/chr22.maf.lzo,/depot/data2/galaxy/hg18/align/multiz28way/chr22_h2_hap1.maf.lzo,/depot/data2/galaxy/hg18/align/multiz28way/chr22_random.maf.lzo,/depot/data2/galaxy/hg18/align/multiz28way/chr2_random.maf.lzo,/depot/data2/galaxy/hg18/align/multiz28way/chr3.maf.lzo,/depot/data2/galaxy/hg18/align/multiz28way/chr3_random.maf.lzo,/depot/data2/galaxy/hg18/align/multiz28way/chr4.maf.lzo,/depot/data2/galaxy/hg18/align/multiz28way/chr4_random.maf.lzo,/depot/data2/galaxy/hg18/align/multiz28way/chr5.maf.lzo,/depot/data2/galaxy/hg18/align/multiz28way/chr5_h2_hap1.maf.lzo,/depot/data2/galaxy/hg18/align/multiz28way/chr5_random.maf.lzo,/depot/data2/galaxy/hg18/align/multiz28way/chr6.maf.lzo,/depot/data2/galaxy/hg18/align/multiz28way/chr6_cox_hap1.maf.lzo,/depot/data2/galaxy/hg18/align/multiz28way/chr6_qbl_hap2.maf.lzo,/depot/data2/galaxy/hg18/align/multiz28way/chr6_random.maf.lzo,/depot/data2/galaxy/hg18/align/multiz28way/chr7.maf.lzo,/depot/data2/galaxy/hg18/align/multiz28way/chr7_random.maf.lzo,/depot/data2/galaxy/hg18/align/multiz28way/chr8.maf.lzo,/depot/data2/galaxy/hg18/align/multiz28way/chr8_random.maf.lzo,/depot/data2/galaxy/hg18/align/multiz28way/chr9.maf.lzo,/depot/data2/galaxy/hg18/align/multiz28way/chr9_random.maf.lzo,/depot/data2/galaxy/hg18/align/multiz28way/chrM.maf.lzo,/depot/data2/galaxy/hg18/align/multiz28way/chrX.maf.lzo,/depot/data2/galaxy/hg18/align/multiz28way/chrX_random.maf.lzo,/depot/data2/galaxy/hg18/align/multiz28way/chrY.maf.lzo
+#15-way multiZ (dm2)	15_WAY_MULTIZ_dm2	dm2,droSim1,droSec1,droYak2,droEre2,droAna3,dp4,droPer1,droWil1,droVir3,droMoj3,droGri2,anoGam1,apiMel2,triCas2	dm2,droSim1,droSec1,droYak2,droEre2,droAna3,dp4,droPer1,droWil1,droVir3,droMoj3,droGri2,anoGam1,apiMel2,triCas2	/depot/data2/galaxy/dm2/align/multiz15way/chr2L.maf,/depot/data2/galaxy/dm2/align/multiz15way/chr2R.maf,/depot/data2/galaxy/dm2/align/multiz15way/chr2h.maf,/depot/data2/galaxy/dm2/align/multiz15way/chr3L.maf,/depot/data2/galaxy/dm2/align/multiz15way/chr3R.maf,/depot/data2/galaxy/dm2/align/multiz15way/chr3h.maf,/depot/data2/galaxy/dm2/align/multiz15way/chr4.maf,/depot/data2/galaxy/dm2/align/multiz15way/chr4h.maf,/depot/data2/galaxy/dm2/align/multiz15way/chrM.maf,/depot/data2/galaxy/dm2/align/multiz15way/chrU.maf,/depot/data2/galaxy/dm2/align/multiz15way/chrX.maf,/depot/data2/galaxy/dm2/align/multiz15way/chrXh.maf,/depot/data2/galaxy/dm2/align/multiz15way/chrYh.maf
+#17-way multiZ (mm8)	17_WAY_MULTIZ_mm8	mm8	hg18,panTro1,bosTau2,rheMac2,mm8,rn4,canFam2,echTel1,loxAfr1,oryCun1,danRer3,monDom4,dasNov1,galGal2,fr1,tetNig1,xenTro1	/depot/data2/galaxy/mm8/align/multiz17way/chr10.maf.lzo,/depot/data2/galaxy/mm8/align/multiz17way/chr10_random.maf.lzo,/depot/data2/galaxy/mm8/align/multiz17way/chr11.maf.lzo,/depot/data2/galaxy/mm8/align/multiz17way/chr12.maf.lzo,/depot/data2/galaxy/mm8/align/multiz17way/chr13.maf.lzo,/depot/data2/galaxy/mm8/align/multiz17way/chr13_random.maf.lzo,/depot/data2/galaxy/mm8/align/multiz17way/chr14.maf.lzo,/depot/data2/galaxy/mm8/align/multiz17way/chr15.maf.lzo,/depot/data2/galaxy/mm8/align/multiz17way/chr15_random.maf.lzo,/depot/data2/galaxy/mm8/align/multiz17way/chr16.maf.lzo,/depot/data2/galaxy/mm8/align/multiz17way/chr17.maf.lzo,/depot/data2/galaxy/mm8/align/multiz17way/chr17_random.maf.lzo,/depot/data2/galaxy/mm8/align/multiz17way/chr18.maf.lzo,/depot/data2/galaxy/mm8/align/multiz17way/chr19.maf.lzo,/depot/data2/galaxy/mm8/align/multiz17way/chr1.maf.lzo,/depot/data2/galaxy/mm8/align/multiz17way/chr1_random.maf.lzo,/depot/data2/galaxy/mm8/align/multiz17way/chr2.maf.lzo,/depot/data2/galaxy/mm8/align/multiz17way/chr3.maf.lzo,/depot/data2/galaxy/mm8/align/multiz17way/chr4.maf.lzo,/depot/data2/galaxy/mm8/align/multiz17way/chr5.maf.lzo,/depot/data2/galaxy/mm8/align/multiz17way/chr5_random.maf.lzo,/depot/data2/galaxy/mm8/align/multiz17way/chr6.maf.lzo,/depot/data2/galaxy/mm8/align/multiz17way/chr7.maf.lzo,/depot/data2/galaxy/mm8/align/multiz17way/chr7_random.maf.lzo,/depot/data2/galaxy/mm8/align/multiz17way/chr8.maf.lzo,/depot/data2/galaxy/mm8/align/multiz17way/chr8_random.maf.lzo,/depot/data2/galaxy/mm8/align/multiz17way/chr9.maf.lzo,/depot/data2/galaxy/mm8/align/multiz17way/chr9_random.maf.lzo,/depot/data2/galaxy/mm8/align/multiz17way/chrM.maf.lzo,/depot/data2/galaxy/mm8/align/multiz17way/chrUn_random.maf.lzo,/depot/data2/galaxy/mm8/align/multiz17way/chrX.maf.lzo,/depot/data2/galaxy/mm8/align/multiz17way/chrX_random.maf.lzo,/depot/data2/galaxy/mm8/align/multiz17way/chrY.maf.lzo,/depot/data2/galaxy/mm8/align/multiz17way/chrY_random.maf.lzo
+#8-way multiZ (ponAbe2)	8_WAY_MULTIZ_ponAbe2	ponAbe2,hg18,panTro2,rheMac2,calJac1,mm9,monDom4,ornAna1	ponAbe2,hg18,panTro2,rheMac2,calJac1,mm9,monDom4,ornAna1	/depot/data2/galaxy/ponAbe2/align/multiz8way/maf/chr10.maf.lzo,/depot/data2/galaxy/ponAbe2/align/multiz8way/maf/chr10_random.maf.lzo,/depot/data2/galaxy/ponAbe2/align/multiz8way/maf/chr11.maf.lzo,/depot/data2/galaxy/ponAbe2/align/multiz8way/maf/chr11_random.maf.lzo,/depot/data2/galaxy/ponAbe2/align/multiz8way/maf/chr12.maf.lzo,/depot/data2/galaxy/ponAbe2/align/multiz8way/maf/chr12_random.maf.lzo,/depot/data2/galaxy/ponAbe2/align/multiz8way/maf/chr13.maf.lzo,/depot/data2/galaxy/ponAbe2/align/multiz8way/maf/chr13_random.maf.lzo,/depot/data2/galaxy/ponAbe2/align/multiz8way/maf/chr14.maf.lzo,/depot/data2/galaxy/ponAbe2/align/multiz8way/maf/chr14_random.maf.lzo,/depot/data2/galaxy/ponAbe2/align/multiz8way/maf/chr15.maf.lzo,/depot/data2/galaxy/ponAbe2/align/multiz8way/maf/chr15_random.maf.lzo,/depot/data2/galaxy/ponAbe2/align/multiz8way/maf/chr16.maf.lzo,/depot/data2/galaxy/ponAbe2/align/multiz8way/maf/chr16_random.maf.lzo,/depot/data2/galaxy/ponAbe2/align/multiz8way/maf/chr17.maf.lzo,/depot/data2/galaxy/ponAbe2/align/multiz8way/maf/chr17_random.maf.lzo,/depot/data2/galaxy/ponAbe2/align/multiz8way/maf/chr18.maf.lzo,/depot/data2/galaxy/ponAbe2/align/multiz8way/maf/chr18_random.maf.lzo,/depot/data2/galaxy/ponAbe2/align/multiz8way/maf/chr19.maf.lzo,/depot/data2/galaxy/ponAbe2/align/multiz8way/maf/chr19_random.maf.lzo,/depot/data2/galaxy/ponAbe2/align/multiz8way/maf/chr1.maf.lzo,/depot/data2/galaxy/ponAbe2/align/multiz8way/maf/chr1_random.maf.lzo,/depot/data2/galaxy/ponAbe2/align/multiz8way/maf/chr20.maf.lzo,/depot/data2/galaxy/ponAbe2/align/multiz8way/maf/chr20_random.maf.lzo,/depot/data2/galaxy/ponAbe2/align/multiz8way/maf/chr21.maf.lzo,/depot/data2/galaxy/ponAbe2/align/multiz8way/maf/chr21_random.maf.lzo,/depot/data2/galaxy/ponAbe2/align/multiz8way/maf/chr22.maf.lzo,/depot/data2/galaxy/ponAbe2/align/multiz8way/maf/chr22_random.maf.lzo,/depot/data2/galaxy/ponAbe2/align/multiz8way/maf/chr2a.maf.lzo,/depot/data2/galaxy/ponAbe2/align/multiz8way/maf/chr2a_random.maf.lzo,/depot/data2/galaxy/ponAbe2/align/multiz8way/maf/chr2b.maf.lzo,/depot/data2/galaxy/ponAbe2/align/multiz8way/maf/chr2b_random.maf.lzo,/depot/data2/galaxy/ponAbe2/align/multiz8way/maf/chr3.maf.lzo,/depot/data2/galaxy/ponAbe2/align/multiz8way/maf/chr3_random.maf.lzo,/depot/data2/galaxy/ponAbe2/align/multiz8way/maf/chr4.maf.lzo,/depot/data2/galaxy/ponAbe2/align/multiz8way/maf/chr4_random.maf.lzo,/depot/data2/galaxy/ponAbe2/align/multiz8way/maf/chr5_h2_hap1.maf.lzo,/depot/data2/galaxy/ponAbe2/align/multiz8way/maf/chr5.maf.lzo,/depot/data2/galaxy/ponAbe2/align/multiz8way/maf/chr5_random.maf.lzo,/depot/data2/galaxy/ponAbe2/align/multiz8way/maf/chr6_cox_hap1.maf.lzo,/depot/data2/galaxy/ponAbe2/align/multiz8way/maf/chr6_cox_hap1_random.maf.lzo,/depot/data2/galaxy/ponAbe2/align/multiz8way/maf/chr6.maf.lzo,/depot/data2/galaxy/ponAbe2/align/multiz8way/maf/chr6_qbl_hap2.maf.lzo,/depot/data2/galaxy/ponAbe2/align/multiz8way/maf/chr6_qbl_hap2_random.maf.lzo,/depot/data2/galaxy/ponAbe2/align/multiz8way/maf/chr6_random.maf.lzo,/depot/data2/galaxy/ponAbe2/align/multiz8way/maf/chr7.maf.lzo,/depot/data2/galaxy/ponAbe2/align/multiz8way/maf/chr7_random.maf.lzo,/depot/data2/galaxy/ponAbe2/align/multiz8way/maf/chr8.maf.lzo,/depot/data2/galaxy/ponAbe2/align/multiz8way/maf/chr8_random.maf.lzo,/depot/data2/galaxy/ponAbe2/align/multiz8way/maf/chr9.maf.lzo,/depot/data2/galaxy/ponAbe2/align/multiz8way/maf/chr9_random.maf.lzo,/depot/data2/galaxy/ponAbe2/align/multiz8way/maf/chrM.maf.lzo,/depot/data2/galaxy/ponAbe2/align/multiz8way/maf/chrUn.maf.lzo,/depot/data2/galaxy/ponAbe2/align/multiz8way/maf/chrX.maf.lzo,/depot/data2/galaxy/ponAbe2/align/multiz8way/maf/chrX_random.maf.lzo
Index: /galaxy-central/tool-data/liftOver.loc
===================================================================
--- /galaxy-central/tool-data/liftOver.loc (revision 3)
+++ /galaxy-central/tool-data/liftOver.loc (revision 3)
@@ -0,0 +1,27 @@
+#This is a sample file distributed with Galaxy that is used by the
+#liftOver tools.  The liftOver.loc file has this format (white space 
+#characters are TAB characters):
+#
+#<FromSpecies>	<ToSpecies>	<PathToChainFile>
+#
+#So, for example, if you had the chain file to convert from anoCar1 to galGal3
+#located at /depot/data2/galaxy/anoCar1/liftOver/anoCar1ToGalGal3.over.chain, 
+#then the liftOver.loc entry would look like this:
+#
+#anoCar1 galGal3 /depot/data2/galaxy/anoCar1/liftOver/anoCar1ToGalGal3.over.chain
+#
+#and your /depot/data2/galaxy/anoCar1/liftOver directory would 
+#contain all of your "chain" files (e.g.):
+#
+#-rw-rw-r-- 1 gua110 galaxy 24046079 2008-01-16 14:20 anoCar1ToGalGal3.over.chain
+#-rw-rw-r-- 1 gua110 galaxy 13216668 2008-01-16 14:20 anoCar1ToGasAcu1.over.chain
+#-rw-rw-r-- 1 gua110 galaxy 29597067 2008-01-16 14:20 anoCar1ToHg18.over.chain
+#...etc...
+#
+#Your liftOver.loc file should include an entry per line for each build you can
+#convert.  For example:
+#
+#anoCar1	galGal3	/depot/data2/galaxy/anoCar1/liftOver/anoCar1ToGalGal3.over.chain
+#anoCar1	gasAcu1	/depot/data2/galaxy/anoCar1/liftOver/anoCar1ToGasAcu1.over.chain
+#anoCar1	hg18	/depot/data2/galaxy/anoCar1/liftOver/anoCar1ToHg18.over.chain
+#...etc...
Index: /galaxy-central/tool-data/shared/ucsc/builds.txt
===================================================================
--- /galaxy-central/tool-data/shared/ucsc/builds.txt (revision 3)
+++ /galaxy-central/tool-data/shared/ucsc/builds.txt (revision 3)
@@ -0,0 +1,152 @@
+#Harvested from http://genome-test.cse.ucsc.edu/cgi-bin/das/dsn
+?	unspecified (?)
+hg19Haps	hg19Haplotypes Feb. 2009 (GRCh37/hg19Haps) (hg19Haps)
+hg19	Human Feb. 2009 (GRCh37/hg19) (hg19)
+hg18	Human Mar. 2006 (NCBI36/hg18) (hg18)
+hg17	Human May 2004 (NCBI35/hg17) (hg17)
+hg16	Human July 2003 (NCBI34/hg16) (hg16)
+hg15	Human Apr. 2003 (NCBI33/hg15) (hg15)
+venter1	J. Craig Venter Sep. 2007 (HuRef/venter1) (venter1)
+panTro2	Chimp Mar. 2006 (CGSC 2.1/panTro2) (panTro2)
+panTro1	Chimp Nov. 2003 (CGSC 1.1/panTro1) (panTro1)
+gorGor2	Gorilla Aug. 2009 (Sanger 4/gorGor2) (gorGor2)
+gorGor1	Gorilla Oct. 2008 (Sanger 0.1/gorGor1) (gorGor1)
+ponAbe2	Orangutan July 2007 (WUGSC 2.0.2/ponAbe2) (ponAbe2)
+rheMac2	Rhesus Jan. 2006 (MGSC Merged 1.0/rheMac2) (rheMac2)
+papHam1	Baboon Nov. 2008 (Baylor 1.0/papHam1) (papHam1)
+calJac3	Marmoset March 2009 (WUGSC 3.2/calJac3) (calJac3)
+calJac1	Marmoset June 2007 (WUGSC 2.0.2/calJac1) (calJac1)
+otoGar1	Bushbaby Dec. 2006 (Broad/otoGar1) (otoGar1)
+micMur1	Mouse lemur Jun. 2003 (Broad/micMur1) (micMur1)
+tupBel1	Tree shrew Dec. 2006 (Broad/tupBel1) (tupBel1)
+mmtv	MMTV Nov. 2009 (MMTV/mmtv) (mmtv)
+homPan20	chimp/human Jun. 2008 (UCSC Recon/homPan20) (homPan20)
+homIni20	orang/human Jun. 2008 (UCSC Recon/homIni20) (homIni20)
+sorAra1	Shrew June 2006 (Broad/sorAra1) (sorAra1)
+mm9	Mouse July 2007 (NCBI37/mm9) (mm9)
+mm8	Mouse Feb. 2006 (NCBI36/mm8) (mm8)
+mm7	Mouse Aug. 2005 (NCBI35/mm7) (mm7)
+rn4	Rat Nov. 2004 (Baylor 3.4/rn4) (rn4)
+rn3	Rat June 2003 (Baylor 3.1/rn3) (rn3)
+speTri1	Squirrel Feb. 2008 (Broad/speTri1) (speTri1)
+cavPor3	Guinea pig Feb. 2008 (Broad/cavPor3) (cavPor3)
+oryCun2	Rabbit Apr. 2009 (Broad/oryCun2) (oryCun2)
+oryCun1	Rabbit May 2005 (Broad/oryCun1) (oryCun1)
+ochPri2	Pika Jul. 2008 (Broad/ochPri2) (ochPri2)
+eriEur1	Hedgehog June 2006 (Broad/eriEur1) (eriEur1)
+felCatV17e	Cat Dec. 2008 (NHGRI/GTB V17e/felCatV17e) (felCatV17e)
+felCat3	Cat Mar. 2006 (Broad/felCat3) (felCat3)
+ailMel1	Panda Dec. 2009 (BGI-Shenzhen 1.0/ailMel1) (ailMel1)
+nemVec1	Starlet sea anemone Jun. 2007 (JGI-PDF/nemVec1) (nemVec1)
+canFam2	Dog May 2005 (Broad/canFam2) (canFam2)
+canFam1	Dog July 2004 (Broad/canFam1) (canFam1)
+canFamPoodle1	Dog May 2003 (TIGR Poodle/canFamPoodle1) (canFamPoodle1)
+equCab2	Horse Sep. 2007 (Broad/equCab2) (equCab2)
+equCab1	Horse Jan. 2007 (Broad/equCab1) (equCab1)
+susScr2	Pig Nov. 2009 (SGSC Sscrofa9.2/susScr2) (susScr2)
+pteVam1	Megabat Jul. 2008 (Broad/pteVam1) (pteVam1)
+myoLuc1	Microbat Mar. 2006 (Broad/myoLuc1) (myoLuc1)
+susScr1	Pig Apr. 2009 (SGSC 9.53/susScr1) (susScr1)
+turTru1	Dolphin Feb. 2008 (Broad/turTru1) (turTru1)
+tarSyr1	Tarsier Aug. 2008 (Broad/tarSyr1) (tarSyr1)
+proCap1	Rock hyrax Jul. 2008 (Broad/proCap1) (proCap1)
+oviAri1	Sheep Feb. 2010 (ISGC Ovis_aries_1.0/oviAri1) (oviAri1)
+dipOrd1	Kangaroo rat Jul. 2008 (Broad/dipOrd1) (dipOrd1)
+choHof1	Sloth Jul. 2008 (Broad/choHof1) (choHof1)
+bosTau4	Cow Oct. 2007 (Baylor 4.0/bosTau4) (bosTau4)
+bosTau3	Cow Aug. 2006 (Baylor 3.1/bosTau3) (bosTau3)
+bosTau2	Cow Mar. 2005 (Baylor 2.0/bosTau2) (bosTau2)
+macEug1	Wallaby Nov. 2007 (Baylor 1.0/macEug1) (macEug1)
+dasNov2	Armadillo Jul. 2008 (Broad/dasNov2) (dasNov2)
+dasNov1	Armadillo May 2005 (Broad/dasNov1) (dasNov1)
+echTel1	Tenrec July 2005 (Broad/echTel1) (echTel1)
+loxAfr3	Elephant Jul. 2009 (Broad/loxAfr3) (loxAfr3)
+loxAfr2	Elephant Jul. 2008 (Broad/loxAfr2) (loxAfr2)
+loxAfr1	Elephant May 2005 (Broad/loxAfr1) (loxAfr1)
+monDom5	Opossum Oct. 2006 (Broad/monDom5) (monDom5)
+monDom4	Opossum Jan. 2006 (Broad/monDom4) (monDom4)
+monDom1	Opossum Oct. 2004 (Broad prelim/monDom1) (monDom1)
+ornAna1	Platypus Mar. 2007 (WUGSC 5.0.1/ornAna1) (ornAna1)
+galGal3	Chicken May 2006 (WUGSC 2.1/galGal3) (galGal3)
+galGal2	Chicken Feb. 2004 (WUGSC 1.0/galGal2) (galGal2)
+taeGut1	Zebra finch Jul. 2008 (WUGSC 3.2.4/taeGut1) (taeGut1)
+anoCar1	Lizard Feb. 2007 (Broad/anoCar1) (anoCar1)
+xenTro2	X. tropicalis Aug. 2005 (JGI 4.1/xenTro2) (xenTro2)
+xenTro1	X. tropicalis Oct. 2004 (JGI 3.0/xenTro1) (xenTro1)
+danRer6	Zebrafish Dec. 2008 (Zv8/danRer6) (danRer6)
+danRer5	Zebrafish July 2007 (Zv7/danRer5) (danRer5)
+danRer4	Zebrafish Mar. 2006 (Zv6/danRer4) (danRer4)
+danRer3	Zebrafish May 2005 (Zv5/danRer3) (danRer3)
+tetNig2	Tetraodon Mar. 2007 (Genoscope 8.0/tetNig2) (tetNig2)
+tetNig1	Tetraodon Feb. 2004 (Genoscope 7/tetNig1) (tetNig1)
+fr2	Fugu Oct. 2004 (JGI 4.0/fr2) (fr2)
+fr1	Fugu Aug. 2002 (JGI 3.0/fr1) (fr1)
+gasAcu1	Stickleback Feb. 2006 (Broad/gasAcu1) (gasAcu1)
+oryLat2	Medaka Oct. 2005 (NIG/UT MEDAKA1/oryLat2) (oryLat2)
+oryLat1	Medaka Apr. 2006 (NIG/UT MEDAKA1/oryLat1) (oryLat1)
+petMar1	Lamprey Mar. 2007 (WUGSC 3.0/petMar1) (petMar1)
+borEut13	Boreoeutherian Apr. 24. 2006 (UCSC Recon/borEut13) (borEut13)
+canHg12	Boreoeutherian Nov. 19. 2005 (UCSC Recon/canHg12) (canHg12)
+rodEnt13	Rodent Apr. 24. 2006 (UCSC Recon/rodEnt13) (rodEnt13)
+priMat13	Primate Apr. 24. 2006 (UCSC Recon/priMat13) (priMat13)
+nonAfr13	Non-Afrotheria Apr. 24. 2006 (UCSC Recon/nonAfr13) (nonAfr13)
+lauRas13	Laurasiatheria Apr. 24. 2006 (UCSC Recon/lauRas13) (lauRas13)
+homIni14	Hominidae Oct. 1. 2006 (UCSC Recon/homIni14) (homIni14)
+homIni13	Hominidae Apr. 24. 2006 (UCSC Recon/homIni13) (homIni13)
+gliRes13	Glires Apr. 24. 2006 (UCSC Recon/gliRes13) (gliRes13)
+eutHer13	Eutheria Apr. 24. 2006 (UCSC Recon/eutHer13) (eutHer13)
+euaGli13	Euarchontoglires Apr. 24. 2006 (UCSC Recon/euaGli13) (euaGli13)
+catArr1	Catarrhini June 13. 2006 (UCSC Recon/catArr1) (catArr1)
+afrOth13	Afrotheria Apr. 24. 2006 (UCSC Recon/afrOth13) (afrOth13)
+braFlo1	Lancelet Mar. 2006 (JGI 1.0/braFlo1) (braFlo1)
+ci2	C. intestinalis Mar. 2005 (JGI 2.1/ci2) (ci2)
+ci1	C. intestinalis Dec. 2002 (JGI 1.0/ci1) (ci1)
+cioSav2	C. savignyi July 2005 (Sidow Lab 2.0/cioSav2) (cioSav2)
+cioSav1	C. savignyi Apr. 2003 (Broad/cioSav1) (cioSav1)
+strPur2	S. purpuratus Sep. 2006 (Baylor 2.1/strPur2) (strPur2)
+strPur1	S. purpuratus Apr. 2005 (Baylor 1.1/strPur1) (strPur1)
+ce8	C. elegans Jun 2009 (WS204/ce8) (ce8)
+ce7	C. elegans Feb 2009 (WS200/ce7) (ce7)
+aplCal1	Sea hare Sept. 2008 (Broad 2.0/aplCal1) (aplCal1)
+ce6	C. elegans May 2008 (WS190/ce6) (ce6)
+ce5	C. elegans Aug. 2007 (WS180/ce5) (ce5)
+ce4	C. elegans Jan. 2007 (WS170/ce4) (ce4)
+ce3	C. elegans March 2005 (WS140/ce3) (ce3)
+ce2	C. elegans Mar. 2004 (WS120/ce2) (ce2)
+caePb2	C. brenneri Feb. 2008 (WUGSC 6.0.1/caePb2) (caePb2)
+caePb1	C. brenneri Jan. 2007 (WUGSC 4.0/caePb1) (caePb1)
+cb3	C. briggsae Jan. 2007 (WUGSC 1.0/cb3) (cb3)
+cb2	C. briggsae Aug 2005 (WUGSC prelim/cb2) (cb2)
+cb1	C. briggsae July 2002 (WormBase cb25.agp8/cb1) (cb1)
+caeRem3	C. remanei May 2007 (WUGSC 15.0.1/caeRem3) (caeRem3)
+caeRem2	C. remanei Mar. 2006 (WUGSC 1.0/caeRem2) (caeRem2)
+caeRem1	C. remanei March 2005 (WUGSC prelim/caeRem1) (caeRem1)
+caeJap2	C. japonica Jan. 2009 (WUGSC 4.0.1/caeJap2) (caeJap2)
+caeJap1	C. japonica Mar. 2008 (WUGSC 3.0.2/caeJap1) (caeJap1)
+priPac1	P. pacificus Feb. 2007 (WUGSC 5.0/priPac1) (priPac1)
+dm3	D. melanogaster Apr. 2006 (BDGP R5/dm3) (dm3)
+dm2	D. melanogaster Apr. 2004 (BDGP R4/dm2) (dm2)
+dm1	D. melanogaster Jan. 2003 (BDGP R3/dm1) (dm1)
+droSim1	D. simulans Apr. 2005 (WUGSC mosaic 1.0/droSim1) (droSim1)
+droSec1	D. sechellia Oct. 2005 (Broad/droSec1) (droSec1)
+droYak2	D. yakuba Nov. 2005 (WUGSC 7.1/droYak2) (droYak2)
+droYak1	D. yakuba Apr. 2004 (WUGSC 1.0/droYak1) (droYak1)
+droEre1	D. erecta Aug. 2005 (Agencourt prelim/droEre1) (droEre1)
+droAna2	D. ananassae Aug. 2005 (Agencourt prelim/droAna2) (droAna2)
+droAna1	D. ananassae July 2004 (TIGR/droAna1) (droAna1)
+dp3	D. pseudoobscura Nov. 2004 (FlyBase 1.03/dp3) (dp3)
+dp2	D. pseudoobscura Aug. 2003 (Baylor freeze1/dp2) (dp2)
+droPer1	D. persimilis Oct. 2005 (Broad/droPer1) (droPer1)
+droVir2	D. virilis Aug. 2005 (Agencourt prelim/droVir2) (droVir2)
+droVir1	D. virilis July 2004 (Agencourt prelim/droVir1) (droVir1)
+droMoj2	D. mojavensis Aug. 2005 (Agencourt prelim/droMoj2) (droMoj2)
+droMoj1	D. mojavensis Aug. 2004 (Agencourt prelim/droMoj1) (droMoj1)
+droGri1	D. grimshawi Aug. 2005 (Agencourt prelim/droGri1) (droGri1)
+anoGam1	A. gambiae Feb. 2003 (IAGEC MOZ2/anoGam1) (anoGam1)
+apiMel2	A. mellifera Jan. 2005 (Baylor 2.0/apiMel2) (apiMel2)
+apiMel1	A. mellifera July 2004 (Baylor 1.2/apiMel1) (apiMel1)
+triCas2	T. castaneum Sep. 2005 (Baylor 2.0/triCas2) (triCas2)
+falciparum	P. falciparum Plasmodium falciparum (?/falciparum) (falciparum)
+sacCer2	S. cerevisiae June 2008 (SGD/sacCer2) (sacCer2)
+sacCer1	S. cerevisiae Oct. 2003 (SGD/sacCer1) (sacCer1)
+sc1	SARS coronavirus Apr. 2003 (GenBank Apr. 14 '03/sc1) (sc1)
Index: /galaxy-central/tool-data/annotation_profiler_valid_builds.txt
===================================================================
--- /galaxy-central/tool-data/annotation_profiler_valid_builds.txt (revision 3)
+++ /galaxy-central/tool-data/annotation_profiler_valid_builds.txt (revision 3)
@@ -0,0 +1,1 @@
+hg18
Index: /galaxy-central/tool-data/quality_scores.loc
===================================================================
--- /galaxy-central/tool-data/quality_scores.loc (revision 3)
+++ /galaxy-central/tool-data/quality_scores.loc (revision 3)
@@ -0,0 +1,26 @@
+#This is a sample file distributed with Galaxy that is used by some
+#regional variation tools.  The quality_scores.loc file has this format (white 
+#space characters are TAB characters):
+#
+#<build>	<QualityScoreDirectoryPath>
+#
+#So, for example, if you had panTro2 qualit score files stored in 
+#/depot/data2/galaxy/panTro2/quality_scores, then the quality_scores.loc entry 
+#would look like this:
+#
+#panTro2 /depot/data2/galaxy/panTro2/quality_scores
+#
+#and your /depot/data2/galaxy/panTro2/quality_scores directory would 
+#contain all of your quality score files (e.g.):
+#
+#-rw-r--r--  1 gua110 galaxy 10964768 2007-10-02 10:33 chr10.qa.bqv
+#-rw-r--r--  1 gua110 galaxy  1749899 2007-10-02 10:33 chr10_random.qa.bqv
+#-rw-r--r--  1 gua110 galaxy 11310721 2007-10-02 10:33 chr11.qa.bqv
+#...etc...
+#
+#Your quality_scores.loc file should include an entry per line for each quality score 
+#file you have stored.  For example:
+#
+#panTro2	/depot/data2/galaxy/panTro2/quality_scores
+#rheMac2	/depot/data2/galaxy/rheMac2/quality_scores
+#ponAbe2	/depot/data2/galaxy/ponAbe2/quality_scores
Index: /galaxy-central/tool-data/twobit.loc
===================================================================
--- /galaxy-central/tool-data/twobit.loc (revision 3)
+++ /galaxy-central/tool-data/twobit.loc (revision 3)
@@ -0,0 +1,26 @@
+#This is a sample file distributed with Galaxy that is used by some
+#tools.  The twobit.loc file has this format (white space characters 
+#are TAB characters):
+#
+#<Build>	<FullPathToFile>
+#
+#So, for example, if you had droPer1 twobit files stored in 
+#/depot/data2/galaxy/droPer1/, then the twobit.loc entry 
+#would look like this:
+#
+#droPer1 /depot/data2/galaxy/droPer1/droPer1.2bit
+#
+#and your /depot/data2/galaxy/droPer1/ directory would 
+#contain all of your twobit files (e.g.):
+#
+#-rw-rw-r--   1 nate   galaxy 48972650 2007-05-04 11:27 droPer1.2bit
+#...etc...
+#
+#Your twobit.loc file should include an entry per line for each twobit 
+#file you have stored.  For example:
+#
+#droPer1 /depot/data2/galaxy/droPer1/droPer1.2bit
+#apiMel2 /depot/data2/galaxy/apiMel2/apiMel2.2bit
+#droAna1 /depot/data2/galaxy/droAna1/droAna1.2bit
+#droAna2 /depot/data2/galaxy/droAna2/droAna2.2bit
+#...etc...
Index: /galaxy-central/tool-data/binned_scores.loc
===================================================================
--- /galaxy-central/tool-data/binned_scores.loc (revision 3)
+++ /galaxy-central/tool-data/binned_scores.loc (revision 3)
@@ -0,0 +1,37 @@
+#This is a sample file distributed with Galaxy that enables tools
+#to use a directory of FileBinnedArray data files.  You will need
+#to create these data files and then create a binned_scores.loc file 
+#similar to this one (store it in this directory ) that points to 
+#the directories in which those files are stored.  The binned_scores.loc 
+#file has this format (white space characters are TAB characters):
+#
+#<build>	<description>	<dir>
+#
+#So, for example, if you had hg16 ENCODE binCons on MLAGAN alignments
+#stored in /depot/data2/galaxy/binned_scores/hg16/encode_bincons_lagan, 
+#then the binned_scores.loc entry would look like this:
+#
+#hg16    ENCODE binCons on MLAGAN alignments     /depot/data2/galaxy/binned_scores/hg16/encode_bincons_lagan
+#
+#and your /depot/data2/galaxy/binned_scores/hg16/encode_bincons_lagan
+#directory would contain all of your "binned" files (e.g.):
+#
+#-rw-r--r--  1 james    universe 830134 2005-09-13 10:12 ENm001
+#-rw-r--r--  1 james    universe 527388 2005-09-13 10:12 ENm002
+#-rw-r--r--  1 james    universe 269808 2005-09-13 10:12 ENm003
+#...etc...
+#
+#Your binned_scores.loc file should include an entry per line for each
+#"binned" file you have stored.  For example:
+#
+#hg16	ENCODE binCons on MLAGAN alignments	/depot/data2/galaxy/binned_scores/hg16/encode_bincons_lagan
+#hg16	ENCODE binCons on TBA alignments	/depot/data2/galaxy/binned_scores/hg16/encode_bincons_tba
+#hg16	ENCODE GERP on MLAGAN alignment	/depot/data2/galaxy/binned_scores/hg16/encode_gerp_lagan
+#hg16	ENCODE GERP on TBA alignment	/depot/data2/galaxy/binned_scores/hg16/encode_gerp_tba
+#hg16	ENCODE phastCons on MLAGAN alignment	/depot/data2/galaxy/binned_scores/hg16/encode_phastcons_lagan
+#hg16	ENCODE phastCons on TBA alignment	/depot/data2/galaxy/binned_scores/hg16/encode_phatcons_tba
+#hg17	ENCODE phastCons on TBA alignment	/depot/data2/galaxy/binned_scores/hg17/phastcons_encode_sep2005_tba
+#hg17	phastCons on 8-species multiz, 16-Jun-2005	/depot/data2/galaxy/binned_scores/hg17/phastcons_mzPt1Mm5Rn3Cf1Gg2Fr1Dr1/
+#hg17	phastCons on 17-species multiz, 13-Apr-2006	/depot/data2/galaxy/binned_scores/hg17/phastCons17way/ba
+#hg17	ESPERR Regulatory Potential, 7-species, 23-Jun-2006	/depot/data2/galaxy/binned_scores/hg17/esperr_rp_7way/ba
+#hg18	phastCons on 17-species multiz, 06-Apr-2006	/depot/data2/galaxy/binned_scores/hg18/phastCons17way/ba
Index: /galaxy-central/tool-data/bfast_indexes.loc
===================================================================
--- /galaxy-central/tool-data/bfast_indexes.loc (revision 3)
+++ /galaxy-central/tool-data/bfast_indexes.loc (revision 3)
@@ -0,0 +1,38 @@
+#This is a sample file distributed with Galaxy that enables tools
+#to use a directory of BFAST indexed sequences data files.  You will need
+#to create these data files and then create a bfast_indices.loc file 
+#similar to this one (store it in this directory) that points to 
+#the directories in which those files are stored. The bfast_indexes.loc 
+#file has this format (white space characters are TAB characters):
+#
+#<unique_id>	<build>	<galaxy format extensions valid1,valid2>	<description>	<bfast_index_directory>
+#
+#
+#So, for example, if you had hg18 indexed for 40+ bp NT reads stored in 
+#/galaxy/data/hg18/bfast_index/nt/40+, 
+#then the bfast_indices.loc entry could look like this:
+#
+#hg18_nt_40+	hg18	fastqsanger	hg18: 40+ bp NT Space reads	/galaxy/data/hg18/bfast_index/nt/40+/hg18.fa
+#
+#and your /depot/data2/galaxy/hg18/bfast/nt/40+ directory
+#would contain hg18.fa.*.brg and hg18.fa.*.bif files:
+#hg18.fa.nt.brg
+#hg18.fa.nt.1.1.bif
+#hg18.fa.nt.2.1.bif
+#...etc...
+#or similarly for color space indexes:
+#hg18.fa.nt.brg #NB: the localalign process requires the nucleotide brg file
+#hg18.fa.cs.brg
+#hg18.fa.cs.1.1.bif
+#hg18.fa.cs.2.1.bif
+#...etc...
+#
+#a 'generic' directory can be used to hold intermixed NT and CS indexes, when differentiating is not needed, the bfast_indices.loc entry could look like this:
+#hg18_standard	hg18	fastqsanger,fastqcssanger	hg18 standard indexes	/galaxy/data/hg18/bfast_index/hg18.fa
+#
+#The use of symlinks to prevent copying of e.g. .fa and .brg files is recommended
+#
+#hg18_nt_40+	hg18	fastqsanger	hg18: 40+ bp NT Space reads	/galaxy/data/hg18/bfast_index/nt/40+/hg18.fa
+#hg18_cs_50+	hg18	fastqcssanger	hg18: 50+ bp Color space reads	/galaxy/data/hg18/bfast_index/cs/50+/hg18.fa
+#hg18_nt_40-	hg18	fastqsanger	hg18: 40- bp NT Space reads	/galaxy/data/hg18/bfast_index/nt/40-/hg18.fa
+#phiX_nt_50	phiX	fastqsanger	phiX: 50 bp NT Space reads	/galaxy/data/phiX/bfast_index/nt/50/phiX.fa
Index: /galaxy-central/tool-data/bowtie_indices.loc
===================================================================
--- /galaxy-central/tool-data/bowtie_indices.loc (revision 3)
+++ /galaxy-central/tool-data/bowtie_indices.loc (revision 3)
@@ -0,0 +1,29 @@
+#This is a sample file distributed with Galaxy that enables tools
+#to use a directory of Bowtie indexed sequences data files.  You will need
+#to create these data files and then create a bowtie_indices.loc file 
+#similar to this one (store it in this directory) that points to 
+#the directories in which those files are stored. The bowtie_indices.loc 
+#file has this format (white space characters are TAB characters):
+#
+#<build>	<file_base>
+#
+#So, for example, if you had hg18 indexed stored in 
+#/depot/data2/galaxy/bowtie/hg18/, 
+#then the bowtie_indices.loc entry would look like this:
+#
+#hg18	/depot/data2/galaxy/bowtie/hg18/hg18
+#
+#and your /depot/data2/galaxy/bowtie/hg18/ directory
+#would contain hg18.*.ebwt files:
+#
+#-rw-r--r--  1 james    universe 830134 2005-09-13 10:12 hg18.1.ebwt
+#-rw-r--r--  1 james    universe 527388 2005-09-13 10:12 hg18.2.ebwt
+#-rw-r--r--  1 james    universe 269808 2005-09-13 10:12 gh18.3.ebwt
+#...etc...
+#
+#Your bowtie_indices.loc file should include an entry per line for 
+#each index set you have stored.  The "file" in the path does not actually
+#exist, but it is the prefix for the actual index files.  For example:
+#
+#hg18	/depot/data2/galaxy/bowtie/hg18/hg18
+#hg19	/depot/data2/galaxy/bowtie/hg19/hg19
Index: /galaxy-central/tool-data/phastOdds.loc
===================================================================
--- /galaxy-central/tool-data/phastOdds.loc (revision 3)
+++ /galaxy-central/tool-data/phastOdds.loc (revision 3)
@@ -0,0 +1,21 @@
+#This is a sample file distributed with Galaxy that is used by the
+#phastOdds scores tool.  The phastOdds.loc file has this format (white space 
+#characters are TAB characters):
+#
+#<build>	<description>	<path to phastOdds score files>
+#
+#So, for example, if you had hg17 ENCODE regions only, SEP-2005 tba.v2 alignments
+#stored in /depot/data2/galaxy/phastOdds_precomputed/encode_SEP-2005_tba.v2_phastOdds, 
+#then the phastOdds.loc entry would look like this:
+#
+#hg17	ENCODE regions only, SEP-2005 tba.v2 alignments	/depot/data2/galaxy/phastOdds_precomputed/encode_SEP-2005_tba.v2_phastOdds
+#
+#and your /depot/data2/galaxy/phastOdds_precomputed/ directory would 
+#contain all of your alignment files (e.g.):
+#
+#-rw-r--r--   1 james g2cache 56555036 2006-02-22 18:26 encode_SEP-2005_tba.v2_phastOdds.h5
+#-rw-r--r--   1 james g2cache     1367 2006-02-08 12:23 encode_SEP-2005_tba.v2_phastOdds.mapping.bed
+#...etc...
+#
+#Your phastOdds.loc file should include an entry per line for each phastOdds 
+#file you have stored.
Index: /galaxy-central/tool-data/srma_index.loc
===================================================================
--- /galaxy-central/tool-data/srma_index.loc (revision 3)
+++ /galaxy-central/tool-data/srma_index.loc (revision 3)
@@ -0,0 +1,25 @@
+#This is a sample file distributed with Galaxy that enables tools
+#to use a directory of SRMA indexed sequences data files. You will need
+#to create these data files and then create a srma_index.loc file 
+#similar to this one (store it in this directory) that points to 
+#the directories in which those files are stored. The srma_index.loc 
+#file has this format (white space is the TAB character):
+#
+#<build>	<fasta_file>
+#
+#So, for example, if you had hg18 indexed and stored in 
+#/depot/data2/galaxy/srma/hg18/, 
+#then the srma_index.loc entry would look like this:
+#
+#hg18	/depot/data2/galaxy/srma/hg18/hg18.fa
+#
+#and your /depot/data2/galaxy/srma/hg18/ directory
+#would contain the following three files:
+#hg18.fa
+#hg18.dict
+#hg18.fa.fai
+#
+#The dictionary file for each reference (ex. hg18.dict) must be 
+#created via Picard (http://picard.sourceforge.net). Note that
+#the dict file does not have the .fa extension although the
+#path list in the loc file does include it.
Index: /galaxy-central/tool-data/microbial_data.loc
===================================================================
--- /galaxy-central/tool-data/microbial_data.loc (revision 3)
+++ /galaxy-central/tool-data/microbial_data.loc (revision 3)
@@ -0,0 +1,37 @@
+#This is a sample file distributed with Galaxy that enables tools
+#to retrieve microbial data via a URL .
+#
+#ORG	campJeju_RM1221_1	Campylobacter jejuni RM1221	bacteria	Epsilonproteobacteria	chr	http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=genomeprj&cmd=Retrieve&dopt=Overview&list_uids=303	UCSC
+#CHR	campJeju_RM1221_1	chr	Campylobacter jejuni RM1221, complete genome	1777831	57236892	None	http://www.ncbi.nlm.nih.gov/entrez/viewer.fcgi?db=nucleotide&val=NC_003912
+#DATA	campJeju_RM1221_1_chr_CDS	campJeju_RM1221_1	chr	CDS	bed	/depot/data2/galaxy/microbes/campJeju_RM1221_1/chr.CDS.bed
+#DATA	campJeju_RM1221_1_chr_tRNA	campJeju_RM1221_1	chr	tRNA	bed	/depot/data2/galaxy/microbes/campJeju_RM1221_1/chr.tRNA.bed
+#DATA	campJeju_RM1221_1_chr_rRNA	campJeju_RM1221_1	chr	rRNA	bed	/depot/data2/galaxy/microbes/campJeju_RM1221_1/chr.rRNA.bed
+#DATA	campJeju_RM1221_1_chr_seq	campJeju_RM1221_1	chr	sequence	fasta	/depot/data2/galaxy/microbes/campJeju_RM1221_1/chr.fna
+#DATA	campJeju_RM1221_1_chr_GeneMark	campJeju_RM1221_1	chr	GeneMark	bed	/depot/data2/galaxy/microbes/campJeju_RM1221_1/chr.GeneMark.bed
+#DATA	campJeju_RM1221_1_chr_GeneMarkHMM	campJeju_RM1221_1	chr	GeneMarkHMM	bed	/depot/data2/galaxy/microbes/campJeju_RM1221_1/chr.GeneMarkHMM.bed
+#DATA	campJeju_RM1221_1_chr_Glimmer3	campJeju_RM1221_1	chr	Glimmer3	bed	/depot/data2/galaxy/microbes/campJeju_RM1221_1/chr.Glimmer3.bed
+#ORG	12521	Clostridium perfringens SM101	bacteria	Firmicutes	NC_008262,NC_008263,NC_008264,NC_008265	http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=genomeprj&cmd=Retrieve&dopt=Overview&list_uids=12521	None
+#CHR	12521	NC_008265	Clostridium perfringens phage phiSM101, complete genome	38092	110804020	None	http://www.ncbi.nlm.nih.gov/entrez/viewer.fcgi?db=nucleotide&val=NC_008265
+#DATA	12521_NC_008265_CDS	12521	NC_008265	CDS	bed	/depot/data2/galaxy/microbes/12521/NC_008265.CDS.bed
+#DATA	12521_NC_008265_tRNA	12521	NC_008265	tRNA	bed	/depot/data2/galaxy/microbes/12521/NC_008265.tRNA.bed
+#DATA	12521_NC_008265_rRNA	12521	NC_008265	rRNA	bed	/depot/data2/galaxy/microbes/12521/NC_008265.rRNA.bed
+#DATA	12521_NC_008265_seq	12521	NC_008265	sequence	fasta	/depot/data2/galaxy/microbes/12521/NC_008265.fna
+#DATA	12521_NC_008265_GeneMark	12521	NC_008265	GeneMark	bed	/depot/data2/galaxy/microbes/12521/NC_008265.GeneMark.bed
+#DATA	12521_NC_008265_GeneMarkHMM	12521	NC_008265	GeneMarkHMM	bed	/depot/data2/galaxy/microbes/12521/NC_008265.GeneMarkHMM.bed
+#DATA	12521_NC_008265_Glimmer3	12521	NC_008265	Glimmer3	bed	/depot/data2/galaxy/microbes/12521/NC_008265.Glimmer3.bed
+#CHR	12521	NC_008264	Clostridium perfringens SM101 plasmid 2, complete sequence	12206	110804009	None	http://www.ncbi.nlm.nih.gov/entrez/viewer.fcgi?db=nucleotide&val=NC_008264
+#DATA	12521_NC_008264_CDS	12521	NC_008264	CDS	bed	/depot/data2/galaxy/microbes/12521/NC_008264.CDS.bed
+#DATA	12521_NC_008264_tRNA	12521	NC_008264	tRNA	bed	/depot/data2/galaxy/microbes/12521/NC_008264.tRNA.bed
+#DATA	12521_NC_008264_rRNA	12521	NC_008264	rRNA	bed	/depot/data2/galaxy/microbes/12521/NC_008264.rRNA.bed
+#DATA	12521_NC_008264_seq	12521	NC_008264	sequence	fasta	/depot/data2/galaxy/microbes/12521/NC_008264.fna
+#DATA	12521_NC_008264_GeneMark	12521	NC_008264	GeneMark	bed	/depot/data2/galaxy/microbes/12521/NC_008264.GeneMark.bed
+#DATA	12521_NC_008264_GeneMarkHMM	12521	NC_008264	GeneMarkHMM	bed	/depot/data2/galaxy/microbes/12521/NC_008264.GeneMarkHMM.bed
+#DATA	12521_NC_008264_Glimmer3	12521	NC_008264	Glimmer3	bed	/depot/data2/galaxy/microbes/12521/NC_008264.Glimmer3.bed
+#CHR	12521	NC_008263	Clostridium perfringens SM101 plasmid 1, complete sequence	12397	110803998	None	http://www.ncbi.nlm.nih.gov/entrez/viewer.fcgi?db=nucleotide&val=NC_008263
+#DATA	12521_NC_008263_CDS	12521	NC_008263	CDS	bed	/depot/data2/galaxy/microbes/12521/NC_008263.CDS.bed
+#DATA	12521_NC_008263_tRNA	12521	NC_008263	tRNA	bed	/depot/data2/galaxy/microbes/12521/NC_008263.tRNA.bed
+#DATA	12521_NC_008263_rRNA	12521	NC_008263	rRNA	bed	/depot/data2/galaxy/microbes/12521/NC_008263.rRNA.bed
+#DATA	12521_NC_008263_seq	12521	NC_008263	sequence	fasta	/depot/data2/galaxy/microbes/12521/NC_008263.fna
+#DATA	12521_NC_008263_GeneMark	12521	NC_008263	GeneMark	bed	/depot/data2/galaxy/microbes/12521/NC_008263.GeneMark.bed
+#DATA	12521_NC_008263_GeneMarkHMM	12521	NC_008263	GeneMarkHMM	bed	/depot/data2/galaxy/microbes/12521/NC_008263.GeneMarkHMM.bed
+#DATA	12521_NC_008263_Glimmer3	12521	NC_008263	Glimmer3	bed	/depot/data2/galaxy/microbes/12521/NC_008263.Glimmer3.bed
Index: /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/windmill/readme.txt
===================================================================
--- /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/windmill/readme.txt (revision 3)
+++ /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/windmill/readme.txt (revision 3)
@@ -0,0 +1,1 @@
+Place for windmill tests
Index: /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/megatest.py
===================================================================
--- /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/megatest.py (revision 3)
+++ /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/megatest.py (revision 3)
@@ -0,0 +1,32 @@
+"""
+Runs a more demaniding test
+"""
+import os
+from genetrack import util, conf, logger, scripts
+from genetrack.scripts import bed2genetrack
+
+logger.disable(None)
+
+def bedfile(inpfile):
+    basename = os.path.basename(inpfile)
+    outfile = conf.tempdata('%s.genetrack' % basename)
+    bed2genetrack.transform(inpfile, outfile)
+
+if __name__ == '__main__':
+    import optparse
+
+    parser = optparse.OptionParser()
+
+    # setting the input file name
+    parser.add_option(
+        '--bed2genetrack', 
+        dest="bed2genetrack",
+        help="run the bed2genetrack transform on a file"
+    )
+
+    options, args = parser.parse_args()
+    
+    if options.bed2genetrack:
+        bedfile(options.bed2genetrack)
+    
+
Index: /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/populate.py
===================================================================
--- /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/populate.py (revision 3)
+++ /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/populate.py (revision 3)
@@ -0,0 +1,72 @@
+"""
+Populates the active server instance with various test datasets
+"""
+import random
+from genetrack import conf, logger
+from genetrack.server.web.models import *
+from genetrack.server.web import authorize, status
+
+from django.contrib.auth.models import User
+
+# the user used to populate the data
+user = User.objects.get(email='admin')
+
+# potential project names
+project_names = [
+    'Mouse project HBB %s', 
+    'Yeast mutant RAV %s', 
+    'Yeast mutant RAP2 %s', 
+    'Fly data DR2%s', 
+    'Human HELA 16 %s',
+    'Human HELA 17 %s',
+]
+
+# generates projects
+
+def generate(n=5):
+
+    projects = []
+    for i in range(1, n):
+        name = random.choice(project_names) % i
+        info = 'some info=%s' % i
+        project = authorize.create_project(user=user, name=name, info=info)
+        projects.append(project)
+        logger.info('creating %s' % name)
+
+    # data names
+    data_names = ( 'short-good-input.gtrack', 'short-data.bed')
+    
+    # visualization names
+    track_names = ( 'differential expression', 'HELA subtract', 'Default track')
+    
+
+    # a subset of projects get data, visualization and results added to them
+    subset = projects[-1:]
+    for project in subset:
+        
+        # create some tracks for this project
+        for tname in track_names:
+            json = dict()
+            track = authorize.create_track(user=user, pid=project.id, name=tname, json=json )
+            logger.info('creating track %s' % track.name)
+        
+        assert (project.track_count(), len(track_names))
+
+        # upload some data names        
+        for name in data_names:
+            logger.info('uploading data %s' % name)
+            stream = File( open(conf.testdata(name)) )
+            data = authorize.create_data(user=user, pid=project.id, stream=stream, name=name, info='test data')
+            
+            # create some  results
+            logger.info('adding results content and image')
+            stream1 = File( open(conf.testdata('short-results.txt')) )
+            image1  = File( open(conf.testdata('readcounts.png'),'rb') )
+            result1 = authorize.create_result( user=user, data=data, content=stream1, image=image1)
+
+            image2  = File( open(conf.testdata('shift.png'), 'rb') )
+            result2 = authorize.create_result( user=user, data=data, content=None, image=image2)
+                
+if __name__ == '__main__':
+    generate()
+
Index: /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/hdflib_tests.py
===================================================================
--- /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/hdflib_tests.py (revision 3)
+++ /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/hdflib_tests.py (revision 3)
@@ -0,0 +1,26 @@
+import os, unittest, random
+
+import testlib
+from genetrack import conf, util, logger
+
+class Hdflib( unittest.TestCase ):
+    'basic sequence class tests'
+    
+    def test_all(self):
+        "Testing sequence operations"
+        #self.assertEqual(1, 0)
+
+def get_suite():
+    "Returns the testsuite"
+    tests  = [ 
+        Hdflib,
+    ]
+
+    return testlib.make_suite( tests )
+
+if __name__ == '__main__':
+    suite = get_suite()
+    logger.disable(None)
+    unittest.TextTestRunner(verbosity=2).run( suite )
+
+    
Index: /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/authorize_tests.py
===================================================================
--- /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/authorize_tests.py (revision 3)
+++ /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/authorize_tests.py (revision 3)
@@ -0,0 +1,67 @@
+import testlib
+import os, unittest, random
+from django.test import utils
+from django.db import connection
+from django.conf import settings
+from genetrack import conf, util, logger
+from genetrack.server.scripts import initializer
+from genetrack.server.web import html
+from django.contrib.auth.models import User
+from django.core.files import File
+
+class AuthorizeTest( unittest.TestCase ):
+    """
+    Tests the models
+    """
+    def setUp(self):
+        "Setting up the tests database for data insert"
+        self.old_name = settings.DATABASE_NAME
+        utils.setup_test_environment()
+        connection.creation.create_test_db(verbosity=0, autoclobber=True)
+        options = util.Params(test_mode=True, delete_everything=False, flush=False, verbosity=0)
+        fname = conf.testdata('test-users.csv')
+        initializer.load_users(fname, options)
+        
+
+    def tearDown(self):
+        "Tearing down the database after test"
+        connection.creation.destroy_test_db(self.old_name, 0)
+        utils.teardown_test_environment()
+    
+    def test_data_creation(self):
+        """
+        Create datasets
+        """
+        
+        # it seems that importing it earlier messes up the test database setup
+        from genetrack.server.web import authorize
+
+        john = User.objects.get(username='johndoe')
+        project = authorize.create_project(user=john, name="Test project")
+        stream = File( open(conf.testdata('test-users.csv')) )
+        data = authorize.create_data(user=john, pid=project.id, stream=stream, name="Test data")
+
+        # project counts update
+        project = authorize.get_project(user=john, pid=project.id)
+        self.assertEqual(project.data_count, 1)
+
+        # testing data deletion
+        authorize.delete_data(user=john, pid=project.id, dids=[data.id])
+        project = authorize.get_project(user=john, pid=project.id)
+        self.assertEqual(project.data_count, 0)
+
+    def test_two(self):
+        pass
+
+def get_suite():
+    "Returns the testsuite"
+    tests  = [ 
+        AuthorizeTest,
+    ]
+
+    return testlib.make_suite( tests )
+
+if __name__ == '__main__':
+    suite = get_suite()
+    logger.disable('DEBUG')
+    unittest.TextTestRunner(verbosity=2).run( suite )
Index: /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/.gitignore
===================================================================
--- /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/.gitignore (revision 3)
+++ /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/.gitignore (revision 3)
@@ -0,0 +1,3 @@
+tempdir
+sandbox
+coverage
Index: /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/testlib/testoptions.py
===================================================================
--- /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/testlib/testoptions.py (revision 3)
+++ /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/testlib/testoptions.py (revision 3)
@@ -0,0 +1,93 @@
+"""
+Option parser for all tests
+
+Needs to be a separate module to avoid circular imports
+"""
+
+import sys, optparse
+
+def option_parser():
+    """
+    Returns the option parser for tests.
+    
+    This parser needs to be able to handle all flags that may be passed 
+    to any test
+    
+    Due to the optparse desing we cannot create a 'partial' option parser 
+    that would ignore extra parameters while allowing it to be later be 
+    extended. So it is either every flag goes the main option parser, 
+    or each module will have to implement almost identical parsers. 
+
+    Having one large option parser seemed the lesser of two bad choices.
+    """
+
+    parser = optparse.OptionParser()
+
+    # passing -n will disable the pathfix, use it to test global pygr distributions
+    parser.add_option(
+        '-n', '--nopath', action="store_true", dest="no_pathfix", default=False,
+        help="do not alter the python import path"
+    )
+
+    # add the regular build directory rather than the in place directory
+    parser.add_option(
+        '-b', '--buildpath', action="store_true", dest="builddir", default=False,
+        help="use the platform specific build directory",
+    )
+
+    # stops testing immediately after a test suite fails
+    parser.add_option(
+        '-s', '--strict', action="store_true", 
+        dest="strict", default=False, 
+        help="stops testing after a test suite fails"
+    )
+
+    # exclude the modules listed in arguments from all the tests
+    parser.add_option(
+        '-x', '--exclude', action="store_true", 
+        dest="exclude", default=False, 
+        help="excludes the files that are listed"
+    )
+
+    # verbosity can be 0,1 and 2 (increasing verbosity)
+    parser.add_option(
+        '-v', '--verbosity', action="store", 
+        dest="verbosity", type="int", default=1, 
+        help="sets the verbosity (0, 1, or 2)",
+    )
+
+    # reset the test directory
+    parser.add_option(
+        '-r', '--reset', action="store_true", 
+        dest="reset", default=False, 
+        help="resets the test directory"
+    )
+
+    # long options are typically used only within individual tests
+    
+    # executes figleaf to collect the coverage data
+    parser.add_option(
+        '--coverage', action="store_true", dest="coverage", default=False, 
+        help="runs figleaf and collects the coverage information into the html directory"
+    )
+
+    # runs the performance tests
+    parser.add_option(
+        '--performance', action="store_true", dest="performance", default=False, 
+        help="runs the performance tests (not implemented)"
+    )
+
+
+    return parser
+
+if __name__ == '__main__':
+    # list flags here
+    flags = " --coverage"
+
+    sys.argv.extend( flags.split() )
+    parser = option_parser()
+    options, args = parser.parse_args()
+    
+    print options
+    
+   
Index: /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/testlib/testutil.py
===================================================================
--- /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/testlib/testutil.py (revision 3)
+++ /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/testlib/testutil.py (revision 3)
@@ -0,0 +1,96 @@
+import pathfix
+from genetrack import conf
+from genetrack.logger import debug, info, warn, error
+
+import os, sys, unittest, re, time, shutil
+
+
+# enables tests if biopython is present
+try:
+    import Bio
+    biopython = True
+except ImportError, exc:
+    biopython = False
+
+def path_join(*args):
+    return os.path.abspath(os.path.join(*args))
+
+def stop( text ):
+    "Unrecoverable error"
+    error ( text )
+    sys.exit()
+
+class Timer:
+    
+    def __init__(self):
+        self.reset()
+    
+    def reset(self):
+        self.start = time.time()
+
+    def display(self, msg, reps=1):
+        total = (time.time() - self.start )
+
+        if reps == 1:
+            info( "%s takes %.3f seconds" % (msg, total) )
+        else:
+            value = total/reps
+            info( "%s performs at %.3f per second" % (msg, value) )
+
+        self.reset()
+
+def reset_tempdir( tempdir=None ):
+    "Deletes and recreates the temporary directory"
+    tempdir = tempdir or conf.temp_data_dir
+    if os.path.isdir( tempdir ):
+        shutil.rmtree( tempdir )
+    os.mkdir( tempdir )
+
+def make_suite( tests ):
+    "Makes a test suite from a list of TestCase classes"
+    loader = unittest.TestLoader().loadTestsFromTestCase
+    suites = map( loader, tests )
+    return unittest.TestSuite( suites )
+
+def generate_coverage( func, path, *args, **kwds):
+    """
+    Generates code coverage for the function 
+    and places the results in the path
+    """
+
+    import figleaf
+    from figleaf import annotate_html
+
+    # Fix for figleaf misbehaving. It is adding a logger at root level 
+    # and that will add a handler to all subloggers (ours as well)
+    # needs to be fixed in figleaf
+    import logging
+    root = logging.getLogger()
+    # remove all root handlers
+    for hand in root.handlers: 
+        root.removeHandler(hand)
+
+    if os.path.isdir( path ):
+        shutil.rmtree( path )       
+    
+    info( "collecting coverage information" )
+
+    figleaf.start() 
+    # execute the function itself
+    return_vals = func( *args, **kwds)
+    figleaf.stop()
+    
+    info( 'generating coverage' )
+    coverage = figleaf.get_data().gather_files()
+    
+    annotate_html.prepare_reportdir( path )
+    
+    # skip python modules and the test modules
+    regpatt  = lambda patt: re.compile( patt, re.IGNORECASE )
+    patterns = map( regpatt, [ 'python', 'tests', 'django', 'path*' ] )
+    annotate_html.report_as_html( coverage, path, exclude_patterns=patterns, files_list='')
+    
+    return return_vals
+
+if __name__ == '__main__':
+    pass
Index: /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/testlib/unittest_extensions.py
===================================================================
--- /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/testlib/unittest_extensions.py (revision 3)
+++ /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/testlib/unittest_extensions.py (revision 3)
@@ -0,0 +1,79 @@
+"""
+Provide support for test skipping.
+
+Based on work by Titus Brown in pygr
+"""
+
+import unittest, time
+import pathfix
+from genetrack import logger
+
+class SkipTest(Exception):
+    pass
+
+class TestResult(unittest._TextTestResult):
+
+    def __init__(self, *args, **kwargs):
+        unittest._TextTestResult.__init__(self, *args, **kwargs)
+        self.skipped = []
+        
+    def addError(self, test, err):
+        exc_type, val, _ = err
+        if issubclass(exc_type, SkipTest):
+            self.skipped.append((self, val))
+            if self.showAll:                         
+                # report skips: SKIP/S
+                self.stream.writeln("SKIP")
+            elif self.dots:
+                self.stream.write('S')
+        else:
+            unittest._TextTestResult.addError(self, test, err)
+
+class TestRunner(unittest.TextTestRunner):
+    """
+    Support running tests that understand SkipTest.
+    """
+    def _makeResult(self):
+        return TestResult(self.stream, self.descriptions,
+                              self.verbosity)
+
+    def run(self, test):
+        "Run the given test case or test suite."
+        result = self._makeResult()
+        startTime = time.time()
+        test(result)
+        stopTime = time.time()
+        timeTaken = stopTime - startTime
+        result.printErrors()
+        #self.stream.writeln(result.separator2)
+        run = result.testsRun
+
+        if self.verbosity>0:
+            self.stream.writeln("Ran %d test%s in %.3fs" %
+                               (run, run != 1 and "s" or "", timeTaken))
+            self.stream.writeln()
+
+        if not result.wasSuccessful():
+            self.stream.write("FAILED (")
+            failed, errored = map(len, (result.failures, result.errors))
+            if failed:
+                self.stream.write("failures=%d" % failed)
+            if errored:
+                if failed: self.stream.write(", ")
+                self.stream.write("errors=%d" % errored)
+            self.stream.writeln(")")
+        else:
+            #self.stream.writeln("OK")
+            pass
+        return result
+
+class TestProgram(unittest.TestProgram):
+    
+    def __init__(self, **kwargs):
+        verbosity = kwargs.pop('verbosity', 1)
+        if verbosity != 2:
+            logger.disable('DEBUG')
+        if kwargs.get('testRunner') is None:
+            kwargs['testRunner'] = TestRunner(verbosity=verbosity)
+
+        unittest.TestProgram.__init__(self, **kwargs)
Index: /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/testlib/__init__.py
===================================================================
--- /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/testlib/__init__.py (revision 3)
+++ /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/testlib/__init__.py (revision 3)
@@ -0,0 +1,31 @@
+"""
+Test utilities
+"""
+
+class SkipMessages(object):
+    """
+    A class that maintains the skipped messages
+    """
+    def __init__(self):
+        self.messages = []
+
+    def add(self, msg):
+        self.messages.append( msg )
+
+    def __len__(self):
+        return len(self.messages)
+
+    def __iter__(self):
+        return iter(self.messages)
+
+
+BASE_URL = 'http://127.0.0.1:8080'
+PROJECT_LIST_URL = '%s/project/list/' % BASE_URL
+
+TWILL_QUIET = True
+
+SKIP_MESSAGES = SkipMessages()
+
+from pathfix import test_dir as TEST_DIR
+from testutil import *
+from testoptions import *
Index: /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/testlib/datagen.py
===================================================================
--- /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/testlib/datagen.py (revision 3)
+++ /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/testlib/datagen.py (revision 3)
@@ -0,0 +1,34 @@
+"""
+Data Generator
+"""
+import random
+import pathfix
+from testutil import commify
+
+def fasta_generator(fname, seqnum, seqlen):
+    """
+    Generates a FASTA file
+    """
+    fp = file( fname, 'wt')
+    seq = [ random.choice("ATGC") for x in range(seqlen) ]
+    
+    snum, slen = commify(seqnum ), commify(seqlen )
+    print "Fasta Generator N=%s L=%s into '%s' " % (snum, slen, fname) 
+
+    for id in xrange( seqnum):
+        line1 = "id%06d" % id
+        random.shuffle( seq )
+        line2 = "".join( seq ) 
+        fp.write( '>%s\n' % line1 )
+        fp.write( '%s\n' % line2 )
+
+    fp.close()
+
+def run():
+    seqnum = 10**5
+    seqlen = 10**2
+    fname = 'data/100K.fasta'
+    fasta_generator( fname, seqnum, seqlen)
+
+if __name__ == '__main__':
+    run()
Index: /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/testlib/pathfix.py
===================================================================
--- /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/testlib/pathfix.py (revision 3)
+++ /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/testlib/pathfix.py (revision 3)
@@ -0,0 +1,22 @@
+"""
+The sole purpose of this module is to alter the sys.path upon
+importing to add the current genetrack package's path first into 
+the import path
+"""
+import sys, os
+
+def path_join(*args):
+    return os.path.abspath(os.path.join(*args))
+
+curr_dir = os.path.dirname( __file__ )
+test_dir = path_join(curr_dir, '..')
+base_dir = path_join(curr_dir, '..', '..' )
+lib_dir  = path_join(base_dir, 'library')
+zip_dir  = path_join(lib_dir, 'library.zip')
+
+for path in [ base_dir, lib_dir, zip_dir ]:
+    if path not in sys.path:
+        sys.path.insert(0, path )
+
+# test that the modules in library.zip are accessible
+import twill, figleaf
Index: /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/functional.py
===================================================================
--- /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/functional.py (revision 3)
+++ /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/functional.py (revision 3)
@@ -0,0 +1,325 @@
+"""
+Functional tests via twill
+"""
+import os, unittest, random
+import testlib
+
+from genetrack import logger, conf
+
+import twill
+from twill import commands as tc
+from StringIO import StringIO
+
+from django.conf import settings
+
+# django specific handlers
+from django.test import TestCase, utils
+from django.core.servers.basehttp import AdminMediaHandler
+from django.core.handlers.wsgi import WSGIHandler
+
+def twill_setup():
+    app = AdminMediaHandler(WSGIHandler())
+    twill.add_wsgi_intercept("127.0.0.1", 8080, lambda: app)
+
+def twill_teardown():
+    twill.remove_wsgi_intercept('127.0.0.1', 8080)
+
+def twill_quiet():
+    # suppress normal output of twill.. You don't want to 
+    # call this if you want an interactive session
+    if testlib.TWILL_QUIET:
+        twill.set_output(StringIO())
+
+class TwillTest( TestCase ):
+    """
+    Base class for twill tests
+    """
+    fixtures = [ 'test-fixture.json' ]
+
+    def setUp(self):
+        twill_setup()
+        twill_quiet()
+    
+    def tearDown(self):
+        twill_teardown()
+
+class BaseTest( TwillTest ): 
+    """
+    Basic functionality of the site. Also does link checking
+    """
+    def test_main(self):
+        #testing main page
+        tc.go( testlib.BASE_URL )
+        tc.code(200)
+        tc.find("GeneTrack") 
+        tc.find("You are not logged in") 
+
+    def test_404(self):
+        # testing 404 errors
+        tc.go( testlib.BASE_URL )
+        tc.go( "./nosuchurl" )
+        tc.code(404)
+
+        tc.go( testlib.BASE_URL )
+        tc.follow('Log in now')
+        tc.find("Please log in") 
+        tc.code(200)
+        
+        # logs in on every test
+        tc.fv("1", "email", 'admin')
+        tc.fv("1", "password", '1')
+        tc.submit('0')
+        #print tc.show()
+
+        tc.code(200)
+        tc.find("Logged in as")
+        
+class ServerTest( TwillTest ):
+    """
+    Full server test.
+    """
+    fixtures = [ 'test-fixture.json' ]
+    
+    def setUp(self):
+        TwillTest.setUp(self)
+        self.login()
+
+    def tearDown(self):
+        self.logout()
+        TwillTest.tearDown(self)
+
+    def login(self, name='admin', passwd='1'):
+        "Performs a login"
+        tc.go( testlib.BASE_URL )
+        tc.follow('Log in now')
+        tc.find("Please log in") 
+        tc.code(200)
+        
+        # logs in on every test
+        tc.fv("1", "email", name)
+        tc.fv("1", "password", passwd)
+        tc.submit('0')
+        tc.code(200)
+        tc.find("Logged in as") 
+
+    def logout(self):
+        "Performs a logout"
+        tc.go( testlib.PROJECT_LIST_URL )
+        tc.code(200)
+        tc.go("/logout/")
+        tc.code(200)
+        tc.find("You are not logged in")
+
+    def create_project(self, name, info='no info'):
+        """
+        Creates a new project
+        """
+        tc.go( testlib.PROJECT_LIST_URL )
+        tc.find("Logged in as") 
+        tc.follow('New Project')
+        tc.code(200)
+        tc.find("Create New Project")
+        tc.fv("1", "name", name )
+        tc.fv("1", "info", info)
+        tc.submit()
+        tc.code(200)
+        tc.find(name)
+
+    def delete_project(self, name):
+        """
+        Deletes a project
+        """
+        tc.follow("Delete")
+        tc.find("You are removing")
+        tc.fv("1", "delete", True)
+        tc.submit()
+        tc.code(200)
+        tc.find("Project deletion complete")
+        tc.notfind(name)
+
+    def test_project_actions(self):
+        
+        # main page
+        tc.go( testlib.PROJECT_LIST_URL )
+        tc.find("Logged in as") 
+
+        # default project list
+        tc.find("Fly data 19") 
+        tc.find("Human HELA 16") 
+        tc.find("Mouse project HBB 1") 
+
+
+        # create a new project
+        name = "Rainbow Connection - New Project"
+        self.create_project(name=name)
+
+        # visit this new project
+        tc.follow(name)
+        tc.code(200)
+        tc.find("Project: %s" % name)
+
+        # edit and rename project
+        newname = "Iguana Garden - New Project"
+        tc.follow("Edit")
+        tc.find("Edit Project")
+        tc.fv("1", "name", newname )
+        tc.fv("1", "info", "Some other *markup* goes here")
+        tc.submit()
+        tc.code(200)
+        tc.notfind(name)
+        tc.find(newname)
+
+        self.delete_project(name=newname)
+
+    def test_project_member_sharing(self):
+
+        # tests sharing as a member
+        tc.go( testlib.PROJECT_LIST_URL )
+        tc.find("Logged in as") 
+        
+        # a project list with member access
+        tc.find("Fly data 19") 
+        tc.follow("Fly data 19")
+        tc.follow("Sharing")
+        tc.find("Current members")
+        
+        # members may not add access
+        tc.notfind("Add access")
+        tc.follow("<< return to project")
+        tc.find("Project: Fly data 19") 
+
+    def test_project_manager_sharing(self):
+        # test sharing as a manager
+
+        # main page
+        tc.go( testlib.PROJECT_LIST_URL )
+        tc.find("Logged in as") 
+        
+        # default project list
+        tc.find("Yeast mutant RAV 17") 
+        tc.follow("Yeast mutant RAV 17")
+        tc.follow("Sharing")
+        tc.find("Current members")
+        tc.find("Add access")
+
+        # search for then add Demo User to this project
+        tc.fv("1", "text", "demo" )
+        tc.submit()
+        tc.code(200)
+        tc.find("Demo User")
+        tc.follow("add as member")
+        tc.find("Demo User")
+
+        # back to the project view
+        tc.follow("<< return to project")
+        tc.find("Yeast mutant RAV 17") 
+
+    def test_project_stress(self):
+        names = [ 'STRESS-NAME-%010d' % step for step in range(11) ]
+        for name in names:
+            self.create_project(name)
+        
+        for name in names:
+            tc.go( testlib.PROJECT_LIST_URL )
+            tc.follow(name)
+            self.delete_project(name)
+
+    def test_project_access(self):  
+        # verifies project access
+
+        # may view this project
+        tc.go("/project/view/19/")
+        tc.code(200)
+
+        # may not edit it
+        tc.go("/project/edit/19/")
+        tc.code(500)
+
+        # may not delete it
+        tc.go("/project/delete/19/")
+        tc.code(500)
+
+        # project does not exist (will return no access)
+        tc.go("/project/view/190/")
+        tc.code(500)
+
+    def test_data_uploads(self):  
+        # data upload test
+        name = 'Upload-test-name'
+        self.create_project(name)
+        
+        tc.follow(name)
+
+        # find the project id
+        url = tc.follow('Edit')
+        pid = url.split("/")[-2]
+        tc.go("/data/upload/simple/%s/" % pid)
+        
+        # search for then add Demo User to this project
+        tc.formfile("1", "File1", conf.testdata('short-data.bed') )
+        tc.formfile("1", "File2", conf.testdata('short-good-input.gtrack') )
+        tc.formfile("1", "File3", conf.testdata('readcounts.png') )
+        tc.submit()
+
+        # verify uploads
+        tc.find("short-data.bed")
+        tc.find("short-good-input.gtrack")
+        tc.find("readcounts.png")
+
+        # visit the dataset            
+        tc.follow("short-good-input.gtrack")
+        tc.find("waiting")
+
+        # edit the dataset
+        tc.follow("Edit")
+        tc.fv("1", "name", "short-good-input.gtrack" )
+        tc.fv("1", "info","extra-info" )
+        tc.submit()
+        tc.find("extra-info")
+
+        # upload two results for it
+        tc.follow("Add results")
+        tc.formfile("1", "content", conf.testdata('short-data.bed') )
+        tc.formfile("1", "image", conf.testdata('readcounts.png') )
+        tc.submit()
+        tc.follow("short-data.bed")
+        tc.back()
+
+        # upload one image
+        tc.follow("Add results")
+        tc.formfile("1", "image", conf.testdata('shift.png') )
+        tc.submit()
+        tc.follow("shift.png")
+        tc.back()
+
+        # back to project view
+        tc.follow("Project view")
+        self.delete_project(name)
+
+def get_suite():
+    "Returns the testsuite"
+    return testlib.make_suite( [] )
+
+def local_suite():
+    "Returns the testsuite"
+    tests  = [ 
+        BaseTest,
+        ServerTest,
+    ]
+    return testlib.make_suite( tests )
+
+def test_runner( suite, verbosity=0 ):
+    "Runs the functional tests on a test database"
+    from django.db import connection
+    
+    old_name = settings.DATABASE_NAME
+    utils.setup_test_environment()
+    connection.creation.create_test_db(verbosity=verbosity, autoclobber=True)
+    result = unittest.TextTestRunner(verbosity=2).run(suite) 
+    connection.creation.destroy_test_db(old_name, verbosity)
+    utils.teardown_test_environment()
+    
+if __name__ == '__main__':
+    logger.info("executing functional tests")
+    suite = local_suite()
+    test_runner( suite, verbosity=0)
Index: /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/testdata/short-data.bed
===================================================================
--- /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/testdata/short-data.bed (revision 3)
+++ /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/testdata/short-data.bed (revision 3)
@@ -0,0 +1,1000 @@
+chr13	232783	232819	3	1	+
+chr4	849506	849542	4	1	-
+chr16	199764	199800	6	1	-
+chr13	883287	883323	7	1	+
+chr8	139201	139237	11	1	+
+chr5	80909	80945	14	1	+
+chr3	156318	156354	17	1	+
+chr2	793165	793201	18	1	-
+chr2	599830	599866	19	1	+
+chr8	198788	198824	20	1	-
+chr11	450442	450478	21	0	+
+chr15	448227	448263	22	0	+
+chr12	105006	105042	23	0	-
+chr15	617326	617362	25	0	-
+chr10	638024	638060	26	2	-
+chr9	42277	42313	27	0	+
+chr2	112620	112656	28	0	-
+chr13	616921	616957	29	1	-
+chr14	199259	199295	30	0	+
+chr7	300266	300302	31	0	+
+chr10	726409	726445	35	0	-
+chr8	180840	180876	36	0	+
+chr10	569538	569574	37	0	-
+chr6	168548	168584	38	0	-
+chr4	679043	679079	39	0	+
+chr8	218587	218623	40	1	+
+chr2	598987	599023	41	0	+
+chr10	533412	533448	43	0	-
+chr12	795867	795903	47	0	-
+chr15	1011400	1011436	49	0	+
+chr4	226001	226037	52	0	+
+chr14	504253	504289	53	2	+
+chr7	451879	451915	55	0	+
+chr6	70204	70240	57	1	-
+chr4	766486	766522	58	1	-
+chr4	743568	743604	59	0	+
+chr4	501761	501797	60	0	+
+chr12	370013	370049	61	3	+
+chr15	615569	615605	62	0	+
+chr11	142110	142146	63	1	-
+chr15	458351	458387	64	0	+
+chr14	407299	407335	65	0	+
+chr7	259272	259308	66	0	+
+chr10	685213	685249	69	0	+
+chr10	138313	138349	70	0	-
+chr7	927724	927760	71	0	-
+chr15	882042	882078	72	0	-
+chr7	972981	973017	73	0	+
+chr15	924782	924818	74	2	-
+chr11	68901	68937	75	0	+
+chr11	171547	171583	76	0	-
+chr7	1026874	1026910	77	0	+
+chr12	389393	389429	79	0	+
+chr15	344436	344472	81	0	+
+chr11	255674	255710	82	0	+
+chr6	234485	234521	84	0	-
+chr14	192649	192685	85	0	+
+chr8	480943	480979	86	1	+
+chr9	96420	96456	87	0	-
+chr16	305937	305973	89	0	-
+chr16	732919	732955	90	0	-
+chr14	678288	678324	91	0	-
+chr11	17968	18004	92	0	-
+chr5	438755	438791	93	0	-
+chr10	35105	35141	94	0	+
+chr6	266449	266485	95	0	+
+chr14	342352	342388	96	0	+
+chr7	75118	75154	97	0	-
+chr12	405463	405499	98	0	+
+chr14	149038	149074	100	0	-
+chr9	5	41	101	0	+
+chr4	1400742	1400778	102	0	-
+chr7	1007212	1007248	103	0	-
+chr3	300092	300128	104	0	-
+chr1	33235	33271	105	0	-
+chr4	1497133	1497169	106	0	+
+chr7	181052	181088	107	1	-
+chr13	288255	288291	108	1	-
+chr8	425589	425625	109	0	+
+chr10	518415	518451	110	0	-
+chr5	188262	188298	111	1	+
+chr2	246088	246124	112	0	+
+chr8	326158	326194	113	0	-
+chr7	211554	211590	114	0	+
+chr1	229130	229166	116	0	+
+chr16	284410	284446	117	0	+
+chr12	883648	883684	118	0	+
+chr7	156960	156996	119	0	-
+chr4	301441	301477	120	0	-
+chr7	623478	623514	121	0	+
+chr11	541304	541340	122	0	-
+chr11	337963	337999	123	0	-
+chr11	266222	266258	124	0	+
+chr12	205459	205495	125	0	-
+chr13	37122	37158	126	0	-
+chr5	473104	473140	127	1	-
+chr12	853042	853078	128	0	+
+chr15	656232	656268	129	1	+
+chr11	574119	574155	130	0	-
+chr14	169787	169823	132	1	+
+chr16	786261	786297	133	0	+
+chr14	639707	639743	134	0	+
+chr5	248249	248285	135	0	-
+chr4	351067	351103	136	0	-
+chr4	62454	62490	137	0	-
+chr11	444757	444793	138	1	+
+chr8	317786	317822	139	0	-
+chr5	355320	355356	141	0	+
+chr13	285287	285323	142	0	+
+chr16	431974	432010	144	1	-
+chr4	386420	386456	145	0	+
+chr16	219527	219563	146	0	+
+chr11	43920	43956	147	0	+
+chr15	238535	238571	148	0	+
+chr1	201697	201733	150	0	+
+chr2	662423	662459	151	0	+
+chr8	190254	190290	152	0	-
+chr3	215	251	153	2	+
+chr10	601208	601244	154	0	+
+chr7	534644	534680	156	0	-
+chr16	797479	797515	158	0	+
+chr2	681304	681340	159	0	-
+chr16	141389	141425	161	0	-
+chr12	11242	11278	162	1	+
+chr11	220426	220462	164	0	-
+chr10	246119	246155	165	0	+
+chr7	786034	786070	166	2	+
+chr9	123371	123407	167	1	+
+chr14	318230	318266	168	0	+
+chr15	642685	642721	169	0	+
+chr7	183723	183759	171	0	+
+chr13	417137	417173	172	0	-
+chr9	431949	431985	176	0	-
+chr16	457154	457190	177	0	+
+chr13	371451	371487	178	0	+
+chr13	525796	525832	179	0	+
+chr14	346412	346448	181	0	+
+chr10	463572	463608	182	2	+
+chr15	30	66	183	1	+
+chr7	24535	24571	184	0	+
+chr16	325838	325874	185	0	+
+chr3	51970	52006	186	0	+
+chr14	188240	188276	187	0	+
+chr16	247054	247090	188	0	+
+chr15	55806	55842	189	1	+
+chr13	261866	261902	190	0	-
+chr10	699105	699141	191	0	+
+chr4	1471795	1471831	192	0	+
+chr7	1035661	1035697	193	0	+
+chr13	83396	83432	194	0	+
+chr8	130101	130137	195	0	+
+chr10	276460	276496	196	0	-
+chr15	906767	906803	197	0	-
+chr7	187238	187274	199	0	+
+chr8	123495	123531	200	0	-
+chr12	505589	505625	201	0	-
+chr8	555079	555115	202	0	+
+chr14	703871	703907	203	1	+
+chr11	141903	141939	204	2	+
+chr2	69959	69995	206	0	-
+chr4	1390298	1390334	208	0	-
+chr14	650708	650744	209	0	+
+chr4	1002783	1002819	210	0	+
+chr3	258173	258209	212	0	-
+chr4	1140648	1140684	214	1	+
+chr7	606518	606554	215	0	+
+chr7	489832	489868	216	0	+
+chr15	116413	116449	217	0	+
+chr11	552775	552811	218	0	+
+chr7	934186	934222	219	0	-
+chr13	283217	283253	221	0	+
+chr10	429639	429675	222	0	-
+chr13	629688	629724	223	0	-
+chr11	503263	503299	224	0	-
+chr14	533112	533148	229	0	+
+chr8	526308	526344	230	0	+
+chr4	552753	552789	233	0	+
+chr13	458081	458117	234	0	+
+chr6	232342	232378	236	0	-
+chr13	662534	662570	238	0	+
+chr5	170332	170368	240	0	-
+chr7	214459	214495	241	0	+
+chr11	534031	534067	242	0	-
+chr13	572016	572052	245	0	-
+chr16	280157	280193	247	0	+
+chr16	74289	74325	250	0	+
+chr11	146040	146076	251	1	+
+chr2	641439	641475	253	0	+
+chr16	271087	271123	254	0	+
+chr14	719653	719689	255	0	-
+chr5	64244	64280	256	0	-
+chr2	680433	680469	257	1	-
+chr5	243957	243993	258	0	+
+chr10	364167	364203	259	0	-
+chr3	262090	262126	261	0	-
+chr5	186508	186544	263	0	-
+chr13	405529	405565	264	0	+
+chr5	542600	542636	265	0	+
+chr11	263892	263928	267	0	+
+chr12	736048	736084	269	1	-
+chr9	156514	156550	270	1	-
+chr5	311522	311558	271	0	+
+chr13	568677	568713	272	0	+
+chr4	546661	546697	274	0	+
+chr8	77581	77617	275	0	+
+chr15	392721	392757	277	0	-
+chr16	127722	127758	278	1	-
+chr7	427693	427729	279	0	-
+chr11	196844	196880	280	0	-
+chr14	473536	473572	281	0	+
+chr4	269596	269632	282	0	-
+chr11	175287	175323	283	0	-
+chr8	371401	371437	284	0	-
+chr13	837912	837948	285	1	-
+chr7	1067960	1067996	286	0	+
+chr4	1280089	1280125	288	0	+
+chr2	130478	130514	289	0	-
+chr4	625647	625683	290	0	+
+chr7	870282	870318	294	0	+
+chr4	892939	892975	295	0	-
+chr3	198904	198940	296	0	+
+chr7	371033	371069	297	0	-
+chr11	72007	72043	298	0	+
+chr5	27702	27738	299	0	+
+chr15	236186	236222	300	0	+
+chr9	193057	193093	301	0	-
+chr8	47701	47737	302	0	+
+chr9	399718	399754	304	1	+
+chr16	402845	402881	305	0	-
+chr11	153492	153528	306	0	-
+chr6	228348	228384	307	1	+
+chr4	205881	205917	308	0	-
+chr12	177862	177898	309	0	-
+chr4	634251	634287	311	0	+
+chr7	156017	156053	313	0	-
+chr14	784051	784087	314	2	-
+chr15	537803	537839	316	0	-
+chr16	405918	405954	317	0	+
+chr5	38216	38252	318	0	-
+chr4	63567	63603	320	0	+
+chr11	408472	408508	321	1	+
+chr15	929011	929047	322	0	-
+chr14	756437	756473	323	0	+
+chr13	265108	265144	324	1	+
+chr3	81504	81540	326	0	+
+chr13	759075	759111	327	0	-
+chr9	126137	126173	331	0	+
+chr10	689512	689548	332	0	-
+chr2	117586	117622	333	0	-
+chr15	559727	559763	334	1	+
+chr16	491337	491373	335	0	+
+chr8	136068	136104	336	0	+
+chr4	1182264	1182300	337	0	+
+chr2	599898	599934	338	1	+
+chr16	157880	157916	340	0	-
+chr14	711957	711993	341	0	-
+chr2	590803	590839	342	0	+
+chr3	81397	81433	343	0	+
+chr5	115714	115750	344	0	-
+chr15	879323	879359	345	0	-
+chr15	584757	584793	346	0	+
+chr11	341404	341440	347	1	-
+chr12	562861	562897	348	0	-
+chr16	206405	206441	349	0	+
+chr2	47104	47140	350	0	+
+chr16	901028	901064	351	1	+
+chr9	174395	174431	352	0	-
+chr4	1046454	1046490	354	1	-
+chr15	750358	750394	355	0	+
+chr2	213582	213618	356	0	-
+chr11	307063	307099	359	0	+
+chr11	432080	432116	360	0	+
+chr7	376940	376976	362	0	+
+chr14	689534	689570	364	0	+
+chr7	124064	124100	366	0	-
+chr12	400884	400920	368	0	+
+chr16	617401	617437	369	0	-
+chr16	934275	934311	370	1	+
+chr11	106245	106281	371	0	-
+chr12	200489	200525	372	0	+
+chr7	217621	217657	373	0	+
+chr15	216445	216481	374	0	+
+chr15	137630	137666	378	0	-
+chr4	1143812	1143848	379	0	-
+chr1	60345	60381	381	0	+
+chr5	408218	408254	382	0	-
+chr14	25873	25909	383	1	+
+chr12	235258	235294	384	0	-
+chr2	651692	651728	385	0	+
+chr4	1514085	1514121	387	0	-
+chr10	503378	503414	388	2	+
+chr12	910354	910390	389	0	-
+chr14	373426	373462	390	0	+
+chr8	470665	470701	391	1	+
+chr5	58417	58453	392	0	-
+chr7	342971	343007	394	1	+
+chr16	148802	148838	395	0	-
+chr2	173166	173202	396	0	-
+chr15	904946	904982	398	0	+
+chr9	91101	91137	399	0	+
+chr13	225697	225733	400	0	+
+chr15	352553	352589	402	1	-
+chr13	596563	596599	403	0	-
+chr1	85755	85791	405	0	-
+chr9	28449	28485	406	0	-
+chr2	653663	653699	408	0	+
+chr8	140827	140863	409	0	+
+chr12	518789	518825	410	0	+
+chr14	582758	582794	412	0	-
+chr15	55532	55568	414	1	+
+chr7	527201	527237	415	0	-
+chr1	123169	123205	416	0	-
+chr2	63130	63166	419	0	+
+chr4	228016	228052	421	1	+
+chr10	430459	430495	422	0	+
+chr2	759088	759124	423	0	-
+chr10	366335	366371	424	0	+
+chr5	222040	222076	425	0	-
+chr4	270148	270184	426	0	+
+chr4	276616	276652	427	0	-
+chr7	1034951	1034987	428	0	+
+chr2	298071	298107	431	0	-
+chr8	500049	500085	432	0	+
+chr13	438423	438459	433	0	+
+chr7	669565	669601	434	0	-
+chr13	755987	756023	435	0	+
+chr11	566189	566225	437	0	+
+chr1	132373	132409	438	1	-
+chr3	220097	220133	440	0	+
+chr12	825352	825388	442	0	-
+chr13	598982	599018	443	0	-
+chr1	192739	192775	444	0	+
+chr6	182569	182605	445	0	+
+chr12	238701	238737	447	1	-
+chr9	102119	102155	448	0	-
+chr15	829445	829481	450	0	+
+chr11	95089	95125	451	0	+
+chr11	456523	456559	452	0	-
+chr2	797063	797099	453	0	+
+chr14	462479	462515	454	0	-
+chr2	25022	25058	455	0	-
+chr12	460409	460445	457	0	+
+chr15	909666	909702	458	0	-
+chr4	1475680	1475716	459	0	+
+chr8	487780	487816	460	0	-
+chr4	493211	493247	461	0	-
+chr6	117161	117197	462	0	+
+chr9	406562	406598	464	0	-
+chr9	412053	412089	465	0	+
+chr12	188009	188045	466	0	-
+chr16	858384	858420	467	0	+
+chr16	54950	54986	470	0	+
+chr5	17697	17733	471	2	-
+chr12	198208	198244	472	1	+
+chr8	422919	422955	473	0	+
+chr1	41059	41095	474	0	+
+chr8	69213	69249	475	0	-
+chr5	390684	390720	479	0	+
+chr16	483942	483978	480	0	-
+chr4	1017056	1017092	481	0	-
+chr11	391863	391899	482	0	+
+chr11	23452	23488	484	0	-
+chr8	138151	138187	485	0	-
+chr15	685089	685125	486	0	+
+chr4	1200044	1200080	487	0	+
+chr10	667865	667901	488	1	-
+chr2	410503	410539	489	0	-
+chr8	231678	231714	490	0	-
+chr5	293236	293272	491	0	+
+chr6	50007	50043	492	0	-
+chr11	75826	75862	493	0	+
+chr12	411192	411228	498	0	+
+chr16	449514	449550	499	0	-
+chr7	251542	251578	501	1	+
+chr12	252905	252941	502	1	-
+chr3	297717	297753	503	0	-
+chr12	504173	504209	504	0	+
+chr1	194255	194291	505	0	+
+chr4	435879	435915	506	0	-
+chr4	1054311	1054347	507	0	+
+chr4	31648	31684	509	0	-
+chr5	475077	475113	510	0	-
+chr13	326158	326194	512	0	+
+chr4	1469437	1469473	513	0	+
+chr10	273865	273901	514	0	+
+chr15	948978	949014	515	0	-
+chr14	373350	373386	516	0	-
+chr6	209111	209147	517	0	+
+chr9	357119	357155	518	0	+
+chr13	534358	534394	519	0	-
+chr4	1460136	1460172	521	0	-
+chr15	1060954	1060990	522	0	+
+chr12	149262	149298	523	0	+
+chr16	67155	67191	524	0	+
+chr11	352100	352136	526	0	-
+chr1	114455	114491	527	1	-
+chr4	813326	813362	528	0	-
+chr12	787676	787712	530	0	-
+chr8	419230	419266	531	0	-
+chr10	262970	263006	532	2	-
+chr13	606249	606285	533	0	-
+chr12	870946	870982	534	0	+
+chr4	1035836	1035872	535	0	+
+chr13	316504	316540	537	0	+
+chr3	57056	57092	538	3	+
+chr9	124657	124693	540	0	-
+chr11	124073	124109	541	0	+
+chr4	376214	376250	543	0	+
+chr2	185407	185443	544	0	-
+chr16	80821	80857	545	0	+
+chr4	1407313	1407349	546	0	-
+chr5	547661	547697	547	0	+
+chr9	53646	53682	549	0	-
+chr9	414736	414772	550	0	+
+chr3	216810	216846	551	0	+
+chr2	443143	443179	552	0	-
+chr16	386450	386486	553	0	-
+chr4	570941	570977	554	0	-
+chr10	389840	389876	555	0	-
+chr14	662952	662988	556	0	-
+chr13	802246	802282	558	0	-
+chr12	1052119	1052155	559	1	-
+chr12	532472	532508	560	1	+
+chr12	916769	916805	561	0	-
+chr16	89334	89370	562	0	-
+chr15	262791	262827	563	0	+
+chr4	1367043	1367079	564	0	+
+chr7	220515	220551	565	0	+
+chr11	615628	615664	566	0	+
+chr13	333801	333837	568	0	+
+chr11	253647	253683	569	0	-
+chr7	307625	307661	570	0	-
+chr8	253620	253656	571	0	-
+chr7	387584	387620	572	0	-
+chr2	742291	742327	573	1	+
+chr8	268507	268543	575	3	+
+chr10	365376	365412	576	0	+
+chr2	652674	652710	577	1	+
+chr5	259407	259443	578	0	+
+chr11	200802	200838	579	0	+
+chr3	70496	70532	580	0	-
+chr14	194619	194655	581	0	+
+chr2	693382	693418	582	0	+
+chr12	389200	389236	583	0	+
+chr12	758828	758864	584	0	-
+chr11	57417	57453	586	1	+
+chr7	960073	960109	587	0	+
+chr3	258350	258386	588	0	+
+chr13	597687	597723	589	0	-
+chr13	15513	15549	590	0	+
+chr11	50436	50472	591	0	-
+chr4	82802	82838	592	0	+
+chr11	107526	107562	593	0	-
+chr5	350153	350189	594	0	-
+chr7	137290	137326	595	0	-
+chr10	132904	132940	596	0	-
+chr4	243237	243273	598	0	+
+chr16	516447	516483	599	1	+
+chr7	468327	468363	600	0	-
+chr12	637316	637352	601	0	+
+chr8	285601	285637	602	0	+
+chr3	222621	222657	604	0	-
+chr4	1398623	1398659	605	0	-
+chr7	217034	217070	606	0	+
+chr13	225713	225749	607	0	-
+chr2	740457	740493	608	0	-
+chr13	328205	328241	609	0	-
+chr8	81990	82026	610	0	+
+chr12	776773	776809	611	0	-
+chr16	577806	577842	613	1	-
+chr12	460170	460206	614	0	-
+chr15	1028218	1028254	615	0	-
+chr1	97437	97473	616	0	-
+chr2	74655	74691	617	0	+
+chr12	93940	93976	618	0	+
+chr5	87694	87730	621	1	-
+chr11	428890	428926	622	0	+
+chr6	266800	266836	623	1	+
+chr5	350700	350736	625	0	+
+chr11	522637	522673	626	2	-
+chr11	119025	119061	628	0	+
+chr16	584955	584991	629	0	-
+chr10	359570	359606	630	0	+
+chr11	459668	459704	632	0	-
+chr13	880041	880077	633	0	-
+chr5	419225	419261	637	1	-
+chr12	460117	460153	638	0	+
+chr2	702968	703004	639	1	-
+chr9	240477	240513	640	0	+
+chr16	609504	609540	642	0	+
+chr4	271444	271480	643	0	-
+chr14	693545	693581	646	1	+
+chr16	282495	282531	647	0	+
+chr3	110746	110782	648	0	+
+chr15	796875	796911	649	0	-
+chr12	405539	405575	651	1	+
+chr12	99995	100031	652	0	-
+chr10	39011	39047	653	0	+
+chr2	463312	463348	654	0	+
+chr5	84554	84590	656	0	+
+chr8	218244	218280	657	0	+
+chr16	547818	547854	658	0	+
+chr12	798194	798230	659	0	+
+chr15	216081	216117	660	0	+
+chr13	217516	217552	661	0	+
+chr7	198826	198862	662	0	+
+chr4	140819	140855	663	1	-
+chr7	933423	933459	665	1	-
+chr15	262557	262593	667	0	+
+chr7	124124	124160	668	0	+
+chr16	534561	534597	669	0	-
+chr4	126932	126968	671	0	+
+chr16	902455	902491	672	0	+
+chr2	684864	684900	674	0	+
+chr7	998599	998635	675	0	+
+chr12	251158	251194	676	1	-
+chr1	34115	34151	677	0	-
+chr2	77321	77357	679	0	+
+chr5	468579	468615	680	0	-
+chr7	892837	892873	682	0	+
+chr6	251099	251135	684	0	-
+chr10	121728	121764	685	0	-
+chr13	698201	698237	686	1	-
+chr12	896697	896733	687	0	+
+chr16	141461	141497	688	0	+
+chr4	280440	280476	689	0	-
+chr14	339021	339057	690	0	-
+chr13	341331	341367	691	1	-
+chr10	167870	167906	692	0	+
+chr2	685848	685884	693	0	-
+chr7	1011493	1011529	694	0	+
+chr11	41766	41802	696	0	-
+chr12	154766	154802	698	0	-
+chr16	137615	137651	700	0	+
+chr11	666332	666368	701	2	-
+chr5	42416	42452	703	1	+
+chr16	200571	200607	704	0	-
+chr7	450942	450978	705	0	-
+chr4	75932	75968	706	0	-
+chr4	704792	704828	707	0	-
+chr8	169030	169066	708	0	+
+chr12	1015913	1015949	710	0	-
+chr16	110638	110674	711	0	+
+chr10	60491	60527	712	0	+
+chr4	160566	160602	715	0	-
+chr10	37010	37046	717	0	+
+chr12	1031420	1031456	718	0	+
+chr9	418807	418843	719	0	-
+chr15	478885	478921	721	0	-
+chr10	553722	553758	722	1	-
+chr2	582907	582943	723	0	-
+chr13	215885	215921	724	0	+
+chr4	1251159	1251195	725	0	+
+chr2	461519	461555	727	0	-
+chr10	651404	651440	728	0	-
+chr14	450065	450101	730	1	-
+chr2	504842	504878	731	0	+
+chr14	491565	491601	733	0	+
+chr5	461999	462035	734	0	+
+chr4	552230	552266	735	0	+
+chr3	73497	73533	736	0	-
+chr3	208288	208324	739	0	-
+chr12	195962	195998	740	0	+
+chr4	106307	106343	742	0	-
+chr16	138625	138661	743	0	+
+chr15	1030667	1030703	744	1	-
+chr1	191034	191070	745	1	-
+chr12	459871	459907	747	1	+
+chr5	78560	78596	748	0	-
+chr13	726389	726425	749	1	-
+chr14	687720	687756	750	0	+
+chr4	835113	835149	752	0	+
+chr8	37395	37431	753	1	-
+chr5	132710	132746	754	0	+
+chr7	214741	214777	755	0	-
+chr12	949513	949549	756	1	+
+chr13	645411	645447	757	0	-
+chr11	91142	91178	759	0	-
+chr13	434222	434258	760	0	-
+chr2	301585	301621	761	0	-
+chr15	148947	148983	762	1	+
+chr7	735975	736011	764	0	+
+chr10	467424	467460	767	1	+
+chr12	132026	132062	768	1	-
+chr1	96861	96897	769	0	+
+chr14	528576	528612	770	0	-
+chr8	190081	190117	771	0	+
+chr4	1515582	1515618	773	0	-
+chr13	410126	410162	774	0	-
+chr16	130601	130637	777	0	-
+chr15	73709	73745	778	0	-
+chr15	737389	737425	779	0	+
+chr9	185057	185093	780	0	-
+chr15	81675	81711	781	0	-
+chr14	188740	188776	782	0	-
+chr7	200034	200070	783	0	-
+chr8	439857	439893	784	0	-
+chr5	503993	504029	785	0	+
+chr8	318194	318230	786	0	-
+chr7	1066534	1066570	787	0	-
+chr13	82805	82841	788	1	-
+chr10	55830	55866	789	0	-
+chr7	453740	453776	790	0	-
+chr13	729764	729800	791	0	-
+chr3	36555	36591	794	2	-
+chr3	79212	79248	795	1	+
+chr4	367538	367574	796	0	+
+chr13	615437	615473	797	0	+
+chr4	727480	727516	798	0	+
+chr14	703665	703701	799	0	-
+chr5	113855	113891	801	0	+
+chr9	422125	422161	802	0	-
+chr15	138137	138173	803	0	+
+chr7	661058	661094	805	0	-
+chr1	12869	12905	806	0	+
+chr14	379290	379326	807	0	-
+chr15	717160	717196	809	0	-
+chr2	113855	113891	811	0	-
+chr10	210211	210247	812	0	-
+chr8	130928	130964	813	0	-
+chr7	381829	381865	815	0	+
+chr10	453129	453165	816	0	-
+chr5	121864	121900	817	0	+
+chr15	142913	142949	818	0	-
+chr15	744889	744925	820	0	+
+chr14	6634	6670	821	0	+
+chr13	256231	256267	822	0	-
+chr5	442698	442734	824	0	+
+chr15	723159	723195	825	0	-
+chr8	453090	453126	826	0	-
+chr12	844893	844929	827	0	-
+chr4	1428711	1428747	828	0	+
+chr16	197167	197203	830	0	-
+chr14	353013	353049	833	0	-
+chr13	690043	690079	834	0	+
+chr7	976426	976462	835	0	-
+chr12	97051	97087	836	0	-
+chr2	357103	357139	837	0	+
+chr5	122249	122285	838	0	-
+chr14	114797	114833	839	0	+
+chr2	202570	202606	841	2	+
+chr15	436652	436688	844	0	+
+chr3	125543	125579	848	0	-
+chr12	929441	929477	849	0	-
+chr9	155709	155745	850	0	+
+chr15	999305	999341	851	0	+
+chr15	425426	425462	852	0	-
+chr15	229579	229615	855	0	+
+chr10	502033	502069	856	0	-
+chr4	1036614	1036650	857	0	-
+chr10	251749	251785	858	1	+
+chr4	1383670	1383706	859	0	+
+chr5	175473	175509	860	0	-
+chr4	374626	374662	861	0	-
+chr6	55683	55719	862	0	-
+chr4	427307	427343	863	0	-
+chr14	625703	625739	865	0	-
+chr12	748173	748209	866	1	+
+chr11	30574	30610	867	0	-
+chr13	793188	793224	870	0	+
+chr12	657339	657375	871	0	-
+chr7	310521	310557	872	0	-
+chr2	534188	534224	873	0	-
+chr2	420628	420664	874	1	+
+chr6	227269	227305	876	0	-
+chr4	52825	52861	877	0	-
+chr12	583068	583104	878	1	-
+chr7	1012681	1012717	879	0	+
+chr12	960398	960434	880	0	+
+chr11	646413	646449	881	0	+
+chr5	119053	119089	882	0	-
+chr11	240037	240073	883	0	+
+chr11	275307	275343	884	0	-
+chr4	1273313	1273349	885	0	+
+chr8	265905	265941	886	3	-
+chr15	677104	677140	887	0	+
+chr12	375326	375362	889	1	+
+chr2	538737	538773	890	0	+
+chr10	456970	457006	891	0	+
+chr12	951468	951504	892	0	-
+chr6	267204	267240	893	0	-
+chr6	243509	243545	895	3	+
+chr5	334149	334185	897	0	-
+chr16	823848	823884	898	0	-
+chr13	320393	320429	901	0	+
+chr16	404042	404078	902	0	+
+chr12	523818	523854	903	0	-
+chr14	471435	471471	904	0	-
+chr12	222778	222814	906	0	-
+chr13	650034	650070	907	1	+
+chr2	706001	706037	908	0	+
+chr3	34918	34954	909	0	-
+chr5	107030	107066	910	0	-
+chr13	227632	227668	911	1	-
+chr2	667017	667053	912	0	-
+chr4	841721	841757	913	0	-
+chr14	414268	414304	914	0	+
+chr15	460715	460751	915	0	+
+chr13	436919	436955	917	0	-
+chr4	1051395	1051431	918	0	-
+chr5	411124	411160	919	0	-
+chr14	402992	403028	920	0	+
+chr6	195306	195342	921	0	+
+chr4	185140	185176	922	0	-
+chr3	70554	70590	923	0	+
+chr12	702973	703009	924	1	+
+chr9	43094	43130	926	0	+
+chr12	332781	332817	928	0	-
+chr8	150305	150341	929	0	-
+chr13	588706	588742	930	0	-
+chr3	28446	28482	931	1	+
+chr4	1434313	1434349	932	0	-
+chr9	316627	316663	933	0	-
+chr9	189232	189268	934	0	-
+chr4	577482	577518	935	0	+
+chr7	740097	740133	936	0	+
+chr15	943005	943041	937	0	+
+chr12	827352	827388	939	0	+
+chr16	29094	29130	940	1	+
+chr9	132672	132708	941	0	-
+chr15	736957	736993	942	0	+
+chr4	1132745	1132781	943	0	+
+chr4	125929	125965	944	0	-
+chr15	799085	799121	945	0	+
+chr6	167270	167306	946	0	-
+chr4	741360	741396	947	2	-
+chr9	204966	205002	948	0	-
+chr4	1361239	1361275	949	0	+
+chr6	25100	25136	951	0	+
+chr12	260174	260210	952	0	+
+chr8	481705	481741	955	0	+
+chr4	90882	90918	956	0	+
+chr10	469189	469225	958	0	+
+chr9	218889	218925	959	0	-
+chr6	17167	17203	960	0	+
+chr2	495153	495189	961	0	-
+chr4	824443	824479	963	0	-
+chr7	508271	508307	964	0	+
+chr6	60567	60603	965	0	+
+chr12	133381	133417	966	0	+
+chr2	795269	795305	967	0	+
+chr14	393992	394028	969	0	+
+chr4	548963	548999	970	0	+
+chr15	493662	493698	972	0	+
+chr15	144147	144183	973	0	+
+chr4	1047669	1047705	974	1	+
+chr2	219488	219524	976	0	-
+chr2	275685	275721	977	1	-
+chr8	266425	266461	978	0	+
+chr12	1006975	1007011	982	0	+
+chr16	426454	426490	983	1	+
+chr12	178327	178363	984	0	+
+chr8	188300	188336	988	0	+
+chr14	318593	318629	989	0	+
+chr15	94055	94091	990	0	-
+chr6	128168	128204	991	0	+
+chr16	381980	382016	992	1	+
+chr2	630409	630445	993	1	-
+chr7	341033	341069	994	0	+
+chr3	218492	218528	995	0	-
+chr10	489946	489982	996	0	+
+chr13	72237	72273	997	0	-
+chr16	351071	351107	998	0	-
+chr15	99636	99672	1002	0	+
+chr11	58269	58305	1003	0	-
+chr16	672613	672649	1004	0	+
+chr4	903346	903382	1006	0	-
+chr9	83614	83650	1007	0	+
+chr6	72329	72365	1009	0	-
+chr5	234432	234468	1011	0	+
+chr7	652341	652377	1013	0	-
+chr6	198527	198563	1014	1	+
+chr12	587039	587075	1015	0	-
+chr8	8919	8955	1016	1	+
+chr2	626031	626067	1021	0	+
+chr4	399484	399520	1023	0	+
+chr7	883515	883551	1024	0	-
+chr8	65263	65299	1025	0	-
+chr8	53241	53277	1026	0	+
+chr10	60135	60171	1027	0	-
+chr4	1263070	1263106	1029	0	+
+chr5	387712	387748	1030	0	-
+chr14	633963	633999	1032	1	+
+chr15	919716	919752	1034	0	-
+chr10	372947	372983	1035	2	-
+chr12	251745	251781	1036	0	-
+chr2	140246	140282	1037	0	+
+chr8	457541	457577	1038	0	-
+chr4	1366980	1367016	1039	0	+
+chr16	731759	731795	1040	0	-
+chr7	63751	63787	1041	0	+
+chr12	426879	426915	1042	0	-
+chr2	753505	753541	1043	0	-
+chr9	92962	92998	1044	0	+
+chr7	994721	994757	1045	0	-
+chr16	257977	258013	1046	0	+
+chr15	1062540	1062576	1047	0	+
+chr16	226651	226687	1048	1	-
+chr4	205808	205844	1049	0	-
+chr16	54299	54335	1050	0	+
+chr4	591357	591393	1051	2	+
+chr14	204092	204128	1052	0	-
+chr4	590498	590534	1053	0	+
+chr11	644660	644696	1054	0	-
+chr15	216443	216479	1055	0	+
+chr1	61070	61106	1056	1	-
+chr12	646574	646610	1057	0	-
+chr12	744929	744965	1058	0	+
+chr12	391397	391433	1059	0	+
+chr4	268592	268628	1060	0	-
+chr2	204836	204872	1061	0	-
+chr11	107684	107720	1062	0	-
+chr6	202861	202897	1064	0	+
+chr16	131220	131256	1066	0	+
+chr14	296631	296667	1067	0	+
+chr16	229201	229237	1069	0	-
+chr15	414238	414274	1071	0	-
+chr10	32453	32489	1072	0	-
+chr4	768547	768583	1073	0	-
+chr16	831230	831266	1074	0	+
+chr16	922305	922341	1075	0	-
+chr2	804462	804498	1076	0	+
+chr14	208160	208196	1077	0	+
+chr10	94530	94566	1078	1	-
+chr4	468756	468792	1080	0	-
+chr9	277096	277132	1081	0	+
+chr7	283267	283303	1082	0	+
+chr7	889860	889896	1083	0	-
+chr16	791441	791477	1086	0	-
+chr12	432622	432658	1087	0	+
+chr5	314729	314765	1088	0	+
+chr2	662579	662615	1089	0	+
+chr3	254719	254755	1090	1	-
+chr16	564836	564872	1094	0	-
+chr2	739773	739809	1095	1	+
+chr13	668037	668073	1096	1	-
+chr3	253552	253588	1097	0	-
+chr5	83203	83239	1099	0	-
+chr15	478573	478609	1100	0	-
+chr11	474765	474801	1101	0	-
+chr16	417510	417546	1102	0	+
+chr15	845928	845964	1103	0	+
+chr14	105594	105630	1104	0	-
+chr4	150572	150608	1106	0	+
+chr13	244417	244453	1107	0	+
+chr4	1525355	1525391	1108	2	+
+chr2	522815	522851	1110	0	+
+chr5	330813	330849	1111	0	+
+chr3	219922	219958	1113	0	+
+chr4	340766	340802	1114	0	-
+chr4	1062675	1062711	1115	0	-
+chr14	207390	207426	1116	0	+
+chr16	286884	286920	1117	0	+
+chr2	386052	386088	1118	0	-
+chr15	578910	578946	1119	0	-
+chr1	13359	13395	1121	0	-
+chr4	868344	868380	1122	0	-
+chr9	73830	73866	1123	0	+
+chr10	171100	171136	1124	0	-
+chr13	93960	93996	1126	0	+
+chr2	565142	565178	1127	0	+
+chr5	191999	192035	1128	0	+
+chr12	151204	151240	1129	0	+
+chr5	512803	512839	1130	0	+
+chr4	380446	380482	1131	0	-
+chr4	1284365	1284401	1133	0	+
+chr7	908054	908090	1134	0	+
+chr4	596174	596210	1135	0	+
+chr6	131563	131599	1136	0	-
+chr7	1023115	1023151	1138	0	+
+chr6	67039	67075	1139	0	+
+chr9	345523	345559	1140	0	+
+chr8	265448	265484	1141	1	-
+chr4	479904	479940	1142	0	+
+chr11	481113	481149	1143	0	+
+chr2	575493	575529	1144	0	+
+chr13	244425	244461	1147	0	+
+chr4	1352292	1352328	1148	0	-
+chr11	78095	78131	1149	1	+
+chr6	184362	184398	1150	1	-
+chr4	187488	187524	1151	0	-
+chr9	414251	414287	1152	0	+
+chr15	213350	213386	1153	0	+
+chr11	335343	335379	1154	0	-
+chr1	111790	111826	1155	1	+
+chr9	107336	107372	1157	0	+
+chr16	191955	191991	1158	0	+
+chr12	138212	138248	1159	0	-
+chr4	107209	107245	1160	0	+
+chr12	460423	460459	1162	1	-
+chr12	803312	803348	1163	1	-
+chr10	637982	638018	1164	2	+
+chr5	354914	354950	1166	0	-
+chr4	557740	557776	1167	0	-
+chr5	88839	88875	1168	0	+
+chr6	78276	78312	1169	0	-
+chr9	27365	27401	1170	0	-
+chr10	96687	96723	1171	0	+
+chr14	95699	95735	1172	0	+
+chr15	7078	7114	1174	0	+
+chr10	720816	720852	1175	0	-
+chr16	576826	576862	1176	0	-
+chr2	255928	255964	1177	0	+
+chr14	197569	197605	1178	0	-
+chr10	38477	38513	1179	0	-
+chr13	735823	735859	1180	0	+
+chr16	219684	219720	1181	0	+
+chr5	571603	571639	1182	0	-
+chr12	935185	935221	1184	0	-
+chr16	570211	570247	1186	0	+
+chr14	515434	515470	1187	0	+
+chr16	637105	637141	1188	0	+
+chr4	1298694	1298730	1189	0	-
+chr15	655834	655870	1191	0	-
+chr14	420734	420770	1192	1	+
+chr11	402688	402724	1193	0	-
+chr9	190398	190434	1194	1	+
+chr16	521806	521842	1195	0	+
+chr8	361020	361056	1197	0	+
+chr7	388171	388207	1200	0	+
+chr12	1038525	1038561	1201	0	-
+chr14	720058	720094	1202	0	-
+chr15	772889	772925	1204	0	+
+chr12	1048534	1048570	1206	0	-
+chr8	64963	64999	1207	0	+
+chr13	911796	911832	1208	0	+
+chr7	679740	679776	1210	1	+
+chr12	213370	213406	1212	0	+
+chr15	82514	82550	1213	0	+
+chr7	606117	606153	1215	0	+
+chr9	90336	90372	1216	0	+
+chr12	611468	611504	1217	0	+
+chr7	684523	684559	1218	0	+
+chr4	471142	471178	1219	0	-
+chr3	121169	121205	1220	0	-
+chr8	497994	498030	1222	0	-
+chr14	518903	518939	1223	0	-
+chr16	347709	347745	1224	0	+
+chr10	38194	38230	1225	0	-
+chr10	38010	38046	1226	0	-
+chr14	64908	64944	1227	0	-
+chr16	774860	774896	1228	1	-
+chr12	946209	946245	1229	0	+
+chr5	360845	360881	1233	0	+
+chr2	415506	415542	1234	0	+
+chr4	1282307	1282343	1235	0	+
+chr4	707746	707782	1236	0	-
+chr9	359649	359685	1237	1	+
+chr13	854323	854359	1239	0	-
+chr13	334787	334823	1240	0	-
+chr13	723829	723865	1242	0	+
+chr4	1342769	1342805	1243	0	-
+chr10	360574	360610	1245	0	-
+chr13	37962	37998	1246	0	-
+chr9	291728	291764	1247	3	+
+chr12	991297	991333	1248	0	-
+chr10	632841	632877	1252	0	+
+chr11	541452	541488	1253	0	-
+chr12	40320	40356	1255	0	+
+chr12	866647	866683	1256	0	+
+chr14	717652	717688	1257	0	+
+chr13	868953	868989	1259	0	+
+chr14	174697	174733	1262	0	-
+chr15	957090	957126	1263	0	+
+chr4	464786	464822	1264	2	+
+chr13	644894	644930	1266	1	-
+chr4	945727	945763	1267	0	-
+chr10	675145	675181	1269	0	+
+chr8	281392	281428	1270	0	+
+chr7	646810	646846	1271	0	-
+chr8	166195	166231	1272	0	+
+chr15	294640	294676	1273	0	+
+chr2	794515	794551	1275	0	-
+chr10	591753	591789	1276	0	+
+chr5	533495	533531	1278	0	+
+chr12	416816	416852	1280	1	+
+chr10	532831	532867	1281	0	+
+chr11	412642	412678	1282	0	+
+chr7	138726	138762	1283	0	-
+chr16	517663	517699	1284	0	-
+chr7	362404	362440	1286	0	+
+chr14	115464	115500	1287	0	+
+chr13	172076	172112	1288	0	+
+chr10	113030	113066	1289	3	-
+chr2	253607	253643	1290	0	-
+chr16	400556	400592	1291	0	+
+chr8	130170	130206	1295	0	+
+chr2	699711	699747	1296	0	-
+chr14	175558	175594	1297	0	+
+chr7	383452	383488	1301	1	+
+chr7	1043942	1043978	1305	0	+
+chr4	1138134	1138170	1306	0	+
+chr7	37016	37052	1307	1	-
+chr16	217087	217123	1309	0	+
+chr16	286884	286920	1310	0	-
+chr14	603645	603681	1311	0	+
+chr15	725840	725876	1312	0	-
+chr4	904315	904351	1313	0	-
+chr16	498521	498557	1314	0	+
+chr12	222722	222758	1315	0	+
Index: /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/testdata/test-hdflib-input.txt
===================================================================
--- /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/testdata/test-hdflib-input.txt (revision 3)
+++ /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/testdata/test-hdflib-input.txt (revision 3)
@@ -0,0 +1,30106 @@
+#
+# this is the internal genetrack internal file format 
+#
+# optimized for the highest possibly throughput
+#
+# it starts with comment lines that are ignored then a header
+#
+# no comments are allowed once the data starts
+#
+chrom	index	forward	reverse	value
+chr1	146	0.0	1.0	1.0
+chr1	254	0.0	3.0	3.0
+chr1	319	0.0	1.0	1.0
+chr1	328	0.0	1.0	1.0
+chr1	330	0.0	1.0	1.0
+chr1	339	0.0	1.0	1.0
+chr1	341	1.0	0.0	1.0
+chr1	342	1.0	0.0	1.0
+chr1	345	0.0	1.0	1.0
+chr1	362	1.0	0.0	1.0
+chr1	363	1.0	0.0	1.0
+chr1	365	1.0	0.0	1.0
+chr1	367	0.0	1.0	1.0
+chr1	369	0.0	2.0	2.0
+chr1	370	1.0	0.0	1.0
+chr1	371	3.0	0.0	3.0
+chr1	372	0.0	2.0	2.0
+chr1	379	1.0	0.0	1.0
+chr1	385	2.0	1.0	3.0
+chr1	395	0.0	1.0	1.0
+chr1	402	0.0	3.0	3.0
+chr1	403	1.0	0.0	1.0
+chr1	411	0.0	1.0	1.0
+chr1	419	0.0	1.0	1.0
+chr1	427	0.0	1.0	1.0
+chr1	432	2.0	0.0	2.0
+chr1	434	1.0	0.0	1.0
+chr1	443	0.0	1.0	1.0
+chr1	587	0.0	1.0	1.0
+chr1	593	0.0	1.0	1.0
+chr1	596	1.0	0.0	1.0
+chr1	607	0.0	1.0	1.0
+chr1	611	1.0	0.0	1.0
+chr1	612	1.0	0.0	1.0
+chr1	613	0.0	1.0	1.0
+chr1	614	2.0	0.0	2.0
+chr1	620	1.0	0.0	1.0
+chr1	623	2.0	0.0	2.0
+chr1	627	0.0	4.0	4.0
+chr1	629	3.0	0.0	3.0
+chr1	632	0.0	1.0	1.0
+chr1	638	1.0	0.0	1.0
+chr1	639	1.0	0.0	1.0
+chr1	641	0.0	1.0	1.0
+chr1	861	0.0	1.0	1.0
+chr1	931	1.0	0.0	1.0
+chr1	1091	1.0	0.0	1.0
+chr1	1180	1.0	0.0	1.0
+chr1	1307	0.0	1.0	1.0
+chr1	1337	2.0	0.0	2.0
+chr1	1349	0.0	1.0	1.0
+chr1	1516	1.0	0.0	1.0
+chr1	1559	1.0	0.0	1.0
+chr1	1589	0.0	2.0	2.0
+chr1	1596	0.0	1.0	1.0
+chr1	1605	0.0	1.0	1.0
+chr1	1607	1.0	0.0	1.0
+chr1	1644	1.0	0.0	1.0
+chr1	1836	0.0	1.0	1.0
+chr1	1842	0.0	2.0	2.0
+chr1	1844	0.0	1.0	1.0
+chr1	1849	0.0	1.0	1.0
+chr1	1858	0.0	1.0	1.0
+chr1	1868	0.0	1.0	1.0
+chr1	1869	6.0	0.0	6.0
+chr1	1870	0.0	1.0	1.0
+chr1	1871	0.0	1.0	1.0
+chr1	1875	2.0	0.0	2.0
+chr1	1879	3.0	5.0	8.0
+chr1	1880	0.0	4.0	4.0
+chr1	1882	0.0	1.0	1.0
+chr1	1885	0.0	2.0	2.0
+chr1	1886	4.0	1.0	5.0
+chr1	1889	2.0	4.0	6.0
+chr1	1890	2.0	0.0	2.0
+chr1	1892	2.0	0.0	2.0
+chr1	1893	0.0	2.0	2.0
+chr1	1894	1.0	1.0	2.0
+chr1	1895	0.0	2.0	2.0
+chr1	1896	0.0	1.0	1.0
+chr1	1897	1.0	1.0	2.0
+chr1	1898	0.0	3.0	3.0
+chr1	1899	0.0	6.0	6.0
+chr1	1900	0.0	1.0	1.0
+chr1	1901	3.0	0.0	3.0
+chr1	1902	0.0	1.0	1.0
+chr1	1904	0.0	1.0	1.0
+chr1	1908	1.0	0.0	1.0
+chr1	1909	1.0	0.0	1.0
+chr1	1910	0.0	1.0	1.0
+chr1	1915	0.0	1.0	1.0
+chr1	1916	1.0	1.0	2.0
+chr1	1917	0.0	1.0	1.0
+chr1	1920	0.0	1.0	1.0
+chr1	1921	2.0	0.0	2.0
+chr1	1925	0.0	1.0	1.0
+chr1	1926	1.0	0.0	1.0
+chr1	1927	1.0	0.0	1.0
+chr1	1936	0.0	1.0	1.0
+chr1	1939	0.0	1.0	1.0
+chr1	1940	0.0	1.0	1.0
+chr1	1942	0.0	1.0	1.0
+chr1	1949	0.0	1.0	1.0
+chr1	1959	1.0	0.0	1.0
+chr1	1973	1.0	2.0	3.0
+chr1	1983	1.0	0.0	1.0
+chr1	1999	0.0	2.0	2.0
+chr1	2001	1.0	0.0	1.0
+chr1	2010	2.0	0.0	2.0
+chr1	2011	2.0	0.0	2.0
+chr1	2018	0.0	1.0	1.0
+chr1	2019	0.0	1.0	1.0
+chr1	2025	1.0	0.0	1.0
+chr1	2026	2.0	0.0	2.0
+chr1	2029	1.0	0.0	1.0
+chr1	2032	1.0	0.0	1.0
+chr1	2033	1.0	0.0	1.0
+chr1	2034	3.0	0.0	3.0
+chr1	2042	1.0	0.0	1.0
+chr1	2052	8.0	0.0	8.0
+chr1	2054	1.0	0.0	1.0
+chr1	2060	0.0	1.0	1.0
+chr1	2063	2.0	0.0	2.0
+chr1	2066	3.0	0.0	3.0
+chr1	2069	1.0	0.0	1.0
+chr1	2072	0.0	1.0	1.0
+chr1	2076	1.0	1.0	2.0
+chr1	2082	0.0	1.0	1.0
+chr1	2085	0.0	3.0	3.0
+chr1	2086	0.0	1.0	1.0
+chr1	2090	1.0	0.0	1.0
+chr1	2095	0.0	3.0	3.0
+chr1	2096	3.0	0.0	3.0
+chr1	2101	0.0	1.0	1.0
+chr1	2113	1.0	0.0	1.0
+chr1	2120	1.0	0.0	1.0
+chr1	2123	0.0	1.0	1.0
+chr1	2146	1.0	0.0	1.0
+chr1	2158	1.0	0.0	1.0
+chr1	2192	1.0	0.0	1.0
+chr1	2198	1.0	0.0	1.0
+chr1	2204	0.0	1.0	1.0
+chr1	2209	1.0	0.0	1.0
+chr1	2344	0.0	1.0	1.0
+chr1	2358	0.0	1.0	1.0
+chr1	2361	0.0	5.0	5.0
+chr1	2368	0.0	1.0	1.0
+chr1	2373	0.0	10.0	10.0
+chr1	2383	0.0	2.0	2.0
+chr1	2384	0.0	5.0	5.0
+chr1	2385	0.0	1.0	1.0
+chr1	2389	0.0	1.0	1.0
+chr1	2390	0.0	1.0	1.0
+chr1	2406	0.0	1.0	1.0
+chr1	2412	0.0	1.0	1.0
+chr1	2418	1.0	0.0	1.0
+chr1	2419	1.0	0.0	1.0
+chr1	2563	1.0	0.0	1.0
+chr1	2620	1.0	0.0	1.0
+chr1	2632	1.0	0.0	1.0
+chr1	2634	1.0	0.0	1.0
+chr1	2635	4.0	0.0	4.0
+chr1	2640	0.0	6.0	6.0
+chr1	2644	1.0	0.0	1.0
+chr1	2649	3.0	0.0	3.0
+chr1	2650	1.0	0.0	1.0
+chr1	2651	2.0	0.0	2.0
+chr1	2660	1.0	0.0	1.0
+chr1	2663	2.0	0.0	2.0
+chr1	2668	0.0	2.0	2.0
+chr1	2670	2.0	0.0	2.0
+chr1	2671	4.0	0.0	4.0
+chr1	2673	1.0	1.0	2.0
+chr1	2675	0.0	5.0	5.0
+chr1	2678	1.0	0.0	1.0
+chr1	2681	0.0	1.0	1.0
+chr1	2682	0.0	1.0	1.0
+chr1	2683	0.0	4.0	4.0
+chr1	2688	1.0	0.0	1.0
+chr1	2697	0.0	1.0	1.0
+chr1	2700	1.0	0.0	1.0
+chr1	2702	2.0	0.0	2.0
+chr1	3035	0.0	1.0	1.0
+chr1	3208	1.0	0.0	1.0
+chr1	3327	0.0	1.0	1.0
+chr1	3583	0.0	3.0	3.0
+chr1	3813	1.0	0.0	1.0
+chr1	3915	1.0	0.0	1.0
+chr1	4053	0.0	1.0	1.0
+chr1	4248	0.0	1.0	1.0
+chr1	4296	1.0	0.0	1.0
+chr1	4822	0.0	1.0	1.0
+chr1	4829	1.0	0.0	1.0
+chr1	4914	1.0	0.0	1.0
+chr1	5333	0.0	1.0	1.0
+chr1	5509	1.0	0.0	1.0
+chr1	5513	0.0	1.0	1.0
+chr1	5520	2.0	0.0	2.0
+chr1	5725	0.0	1.0	1.0
+chr1	5748	0.0	1.0	1.0
+chr1	5755	1.0	0.0	1.0
+chr1	5763	0.0	1.0	1.0
+chr1	5776	1.0	0.0	1.0
+chr1	5839	0.0	1.0	1.0
+chr1	5933	1.0	0.0	1.0
+chr1	5954	1.0	0.0	1.0
+chr1	5955	1.0	0.0	1.0
+chr1	5975	0.0	1.0	1.0
+chr1	5996	0.0	1.0	1.0
+chr1	6067	1.0	0.0	1.0
+chr1	6087	0.0	1.0	1.0
+chr1	6129	1.0	0.0	1.0
+chr1	6145	0.0	1.0	1.0
+chr1	6192	0.0	1.0	1.0
+chr1	6194	1.0	0.0	1.0
+chr1	6229	0.0	1.0	1.0
+chr1	6284	1.0	0.0	1.0
+chr1	6285	1.0	0.0	1.0
+chr1	6294	1.0	0.0	1.0
+chr1	6298	2.0	0.0	2.0
+chr1	6306	0.0	1.0	1.0
+chr1	6308	0.0	2.0	2.0
+chr1	6328	0.0	1.0	1.0
+chr1	6344	1.0	0.0	1.0
+chr1	6345	0.0	1.0	1.0
+chr1	6397	1.0	0.0	1.0
+chr1	6572	1.0	0.0	1.0
+chr1	6583	0.0	1.0	1.0
+chr1	6597	1.0	0.0	1.0
+chr1	6601	3.0	0.0	3.0
+chr1	6607	0.0	1.0	1.0
+chr1	6608	1.0	0.0	1.0
+chr1	6640	0.0	1.0	1.0
+chr1	6958	0.0	1.0	1.0
+chr1	7313	1.0	0.0	1.0
+chr1	7341	0.0	1.0	1.0
+chr1	7374	1.0	0.0	1.0
+chr1	7410	1.0	0.0	1.0
+chr1	7436	0.0	1.0	1.0
+chr1	7441	1.0	0.0	1.0
+chr1	7445	0.0	1.0	1.0
+chr1	7458	1.0	0.0	1.0
+chr1	7489	0.0	1.0	1.0
+chr1	7577	0.0	1.0	1.0
+chr1	7593	0.0	1.0	1.0
+chr1	7673	1.0	0.0	1.0
+chr1	7747	1.0	0.0	1.0
+chr1	7791	1.0	0.0	1.0
+chr1	7985	1.0	0.0	1.0
+chr1	8035	1.0	0.0	1.0
+chr1	8080	0.0	1.0	1.0
+chr1	8082	1.0	0.0	1.0
+chr1	8087	0.0	1.0	1.0
+chr1	8094	1.0	0.0	1.0
+chr1	8099	1.0	0.0	1.0
+chr1	8101	1.0	0.0	1.0
+chr1	8103	1.0	0.0	1.0
+chr1	8115	4.0	0.0	4.0
+chr1	8122	1.0	0.0	1.0
+chr1	8285	1.0	0.0	1.0
+chr1	8289	1.0	0.0	1.0
+chr1	8293	1.0	0.0	1.0
+chr1	8308	0.0	1.0	1.0
+chr1	8312	1.0	0.0	1.0
+chr1	8324	0.0	1.0	1.0
+chr1	8325	1.0	0.0	1.0
+chr1	8328	2.0	0.0	2.0
+chr1	8336	1.0	0.0	1.0
+chr1	8356	0.0	2.0	2.0
+chr1	8397	0.0	1.0	1.0
+chr1	8457	2.0	0.0	2.0
+chr1	8464	0.0	1.0	1.0
+chr1	8472	0.0	1.0	1.0
+chr1	8477	1.0	0.0	1.0
+chr1	8496	1.0	0.0	1.0
+chr1	8533	1.0	0.0	1.0
+chr1	8544	0.0	1.0	1.0
+chr1	8706	0.0	1.0	1.0
+chr1	8715	1.0	0.0	1.0
+chr1	8716	1.0	0.0	1.0
+chr1	8761	1.0	0.0	1.0
+chr1	8849	0.0	1.0	1.0
+chr1	8882	0.0	1.0	1.0
+chr1	8906	1.0	0.0	1.0
+chr1	8930	0.0	1.0	1.0
+chr1	8938	0.0	1.0	1.0
+chr1	8943	0.0	1.0	1.0
+chr1	8944	0.0	1.0	1.0
+chr1	8956	1.0	0.0	1.0
+chr1	8998	1.0	0.0	1.0
+chr1	9107	1.0	0.0	1.0
+chr1	9134	1.0	0.0	1.0
+chr1	9152	0.0	1.0	1.0
+chr1	9153	0.0	1.0	1.0
+chr1	9158	1.0	0.0	1.0
+chr1	9179	1.0	0.0	1.0
+chr1	9215	0.0	1.0	1.0
+chr1	9231	0.0	1.0	1.0
+chr1	9246	1.0	0.0	1.0
+chr1	9252	0.0	1.0	1.0
+chr1	9272	1.0	0.0	1.0
+chr1	9329	1.0	0.0	1.0
+chr1	9339	2.0	0.0	2.0
+chr1	9353	0.0	1.0	1.0
+chr1	9358	1.0	0.0	1.0
+chr1	9381	1.0	1.0	2.0
+chr1	9388	0.0	1.0	1.0
+chr1	9394	2.0	0.0	2.0
+chr1	9395	1.0	0.0	1.0
+chr1	9396	0.0	1.0	1.0
+chr1	9401	0.0	1.0	1.0
+chr1	9402	0.0	1.0	1.0
+chr1	9409	1.0	1.0	2.0
+chr1	9422	1.0	0.0	1.0
+chr1	9427	1.0	0.0	1.0
+chr1	9434	0.0	1.0	1.0
+chr1	9435	1.0	0.0	1.0
+chr1	9441	0.0	1.0	1.0
+chr1	9449	0.0	1.0	1.0
+chr1	9450	0.0	1.0	1.0
+chr1	9453	2.0	0.0	2.0
+chr1	9458	0.0	1.0	1.0
+chr1	9466	1.0	0.0	1.0
+chr1	9478	0.0	1.0	1.0
+chr1	9581	1.0	0.0	1.0
+chr1	9595	0.0	1.0	1.0
+chr1	9612	0.0	1.0	1.0
+chr1	9614	2.0	0.0	2.0
+chr1	9641	1.0	0.0	1.0
+chr1	9713	0.0	1.0	1.0
+chr1	9826	1.0	0.0	1.0
+chr1	9940	0.0	2.0	2.0
+chr1	9941	0.0	1.0	1.0
+chr1	9972	0.0	1.0	1.0
+chr1	9974	1.0	0.0	1.0
+chr1	9982	1.0	0.0	1.0
+chr1	10154	1.0	0.0	1.0
+chr1	10403	0.0	2.0	2.0
+chr1	10433	2.0	0.0	2.0
+chr1	10488	1.0	0.0	1.0
+chr1	10514	0.0	1.0	1.0
+chr1	10533	1.0	0.0	1.0
+chr1	10551	0.0	1.0	1.0
+chr1	10560	0.0	1.0	1.0
+chr1	10561	0.0	1.0	1.0
+chr1	10565	1.0	0.0	1.0
+chr1	10575	0.0	1.0	1.0
+chr1	10576	1.0	0.0	1.0
+chr1	10752	1.0	0.0	1.0
+chr1	10764	0.0	2.0	2.0
+chr1	10765	0.0	5.0	5.0
+chr1	10766	0.0	1.0	1.0
+chr1	10813	1.0	0.0	1.0
+chr1	10887	0.0	1.0	1.0
+chr1	10917	2.0	0.0	2.0
+chr1	10935	0.0	1.0	1.0
+chr1	10937	2.0	0.0	2.0
+chr1	10951	0.0	2.0	2.0
+chr1	10967	1.0	0.0	1.0
+chr1	10977	1.0	0.0	1.0
+chr1	11074	1.0	0.0	1.0
+chr1	11112	1.0	0.0	1.0
+chr1	11334	0.0	1.0	1.0
+chr1	11361	1.0	0.0	1.0
+chr1	11369	1.0	0.0	1.0
+chr1	11409	1.0	0.0	1.0
+chr1	11532	1.0	0.0	1.0
+chr1	11555	1.0	0.0	1.0
+chr1	11582	1.0	0.0	1.0
+chr1	11666	0.0	1.0	1.0
+chr1	11681	0.0	1.0	1.0
+chr1	11692	1.0	0.0	1.0
+chr1	11699	0.0	2.0	2.0
+chr1	11703	0.0	1.0	1.0
+chr1	11720	0.0	1.0	1.0
+chr1	11724	2.0	0.0	2.0
+chr1	11726	0.0	1.0	1.0
+chr1	11730	1.0	0.0	1.0
+chr1	11731	0.0	1.0	1.0
+chr1	11744	0.0	1.0	1.0
+chr1	11745	3.0	0.0	3.0
+chr1	11757	0.0	1.0	1.0
+chr1	11760	1.0	0.0	1.0
+chr1	11762	0.0	1.0	1.0
+chr1	11763	0.0	3.0	3.0
+chr1	11766	0.0	1.0	1.0
+chr1	11768	1.0	0.0	1.0
+chr1	11798	1.0	0.0	1.0
+chr1	11858	1.0	0.0	1.0
+chr1	11860	0.0	1.0	1.0
+chr1	11875	1.0	0.0	1.0
+chr1	11877	1.0	0.0	1.0
+chr1	11879	0.0	1.0	1.0
+chr1	11896	0.0	1.0	1.0
+chr1	11898	1.0	1.0	2.0
+chr1	11900	1.0	0.0	1.0
+chr1	11903	1.0	0.0	1.0
+chr1	11905	0.0	1.0	1.0
+chr1	11911	0.0	2.0	2.0
+chr1	11926	1.0	0.0	1.0
+chr1	11930	1.0	0.0	1.0
+chr1	11937	1.0	1.0	2.0
+chr1	11939	1.0	0.0	1.0
+chr1	11944	0.0	1.0	1.0
+chr1	11945	1.0	0.0	1.0
+chr1	11946	0.0	1.0	1.0
+chr1	11968	1.0	0.0	1.0
+chr1	12001	0.0	1.0	1.0
+chr1	12017	0.0	1.0	1.0
+chr1	12049	1.0	0.0	1.0
+chr1	12057	1.0	0.0	1.0
+chr1	12069	0.0	1.0	1.0
+chr1	12074	1.0	0.0	1.0
+chr1	12075	1.0	0.0	1.0
+chr1	12076	1.0	0.0	1.0
+chr1	12082	2.0	1.0	3.0
+chr1	12094	1.0	0.0	1.0
+chr1	12098	3.0	2.0	5.0
+chr1	12100	1.0	0.0	1.0
+chr1	12116	0.0	1.0	1.0
+chr1	12117	0.0	1.0	1.0
+chr1	12152	1.0	0.0	1.0
+chr1	12177	1.0	0.0	1.0
+chr1	12246	1.0	0.0	1.0
+chr1	12251	1.0	0.0	1.0
+chr1	12254	1.0	0.0	1.0
+chr1	12275	0.0	1.0	1.0
+chr1	12281	1.0	0.0	1.0
+chr1	12293	1.0	0.0	1.0
+chr1	12299	1.0	0.0	1.0
+chr1	12332	1.0	0.0	1.0
+chr1	12339	1.0	0.0	1.0
+chr1	12344	1.0	0.0	1.0
+chr1	12370	0.0	2.0	2.0
+chr1	12391	1.0	0.0	1.0
+chr1	12395	1.0	0.0	1.0
+chr1	12410	0.0	1.0	1.0
+chr1	12416	1.0	0.0	1.0
+chr1	12420	0.0	1.0	1.0
+chr1	12423	1.0	0.0	1.0
+chr1	12424	2.0	0.0	2.0
+chr1	12425	0.0	2.0	2.0
+chr1	12426	0.0	3.0	3.0
+chr1	12428	2.0	0.0	2.0
+chr1	12431	3.0	0.0	3.0
+chr1	12440	0.0	1.0	1.0
+chr1	12443	1.0	0.0	1.0
+chr1	12446	1.0	0.0	1.0
+chr1	12447	0.0	3.0	3.0
+chr1	12449	0.0	2.0	2.0
+chr1	12459	1.0	0.0	1.0
+chr1	12469	0.0	1.0	1.0
+chr1	12476	0.0	3.0	3.0
+chr1	12477	0.0	1.0	1.0
+chr1	12478	0.0	1.0	1.0
+chr1	12503	0.0	2.0	2.0
+chr1	12527	1.0	0.0	1.0
+chr1	12547	0.0	2.0	2.0
+chr1	12560	1.0	0.0	1.0
+chr1	12608	1.0	0.0	1.0
+chr1	12635	1.0	0.0	1.0
+chr1	12647	0.0	2.0	2.0
+chr1	12656	1.0	0.0	1.0
+chr1	12691	0.0	2.0	2.0
+chr1	12704	1.0	0.0	1.0
+chr1	12741	0.0	2.0	2.0
+chr1	12752	1.0	0.0	1.0
+chr1	12779	1.0	0.0	1.0
+chr1	12800	1.0	0.0	1.0
+chr1	12812	0.0	1.0	1.0
+chr1	12876	0.0	1.0	1.0
+chr1	12881	4.0	0.0	4.0
+chr1	12900	0.0	3.0	3.0
+chr1	12904	0.0	2.0	2.0
+chr1	12908	1.0	0.0	1.0
+chr1	12910	1.0	0.0	1.0
+chr1	12919	1.0	0.0	1.0
+chr1	12925	0.0	1.0	1.0
+chr1	12929	1.0	0.0	1.0
+chr1	12933	0.0	1.0	1.0
+chr1	12952	0.0	1.0	1.0
+chr1	12964	0.0	1.0	1.0
+chr1	13070	1.0	0.0	1.0
+chr1	13208	2.0	0.0	2.0
+chr1	13217	0.0	1.0	1.0
+chr1	13226	0.0	1.0	1.0
+chr1	13244	0.0	1.0	1.0
+chr1	13277	1.0	0.0	1.0
+chr1	13286	1.0	0.0	1.0
+chr1	13303	1.0	0.0	1.0
+chr1	13304	0.0	1.0	1.0
+chr1	13355	0.0	1.0	1.0
+chr1	13379	0.0	1.0	1.0
+chr1	13424	0.0	1.0	1.0
+chr1	13433	1.0	0.0	1.0
+chr1	13536	0.0	1.0	1.0
+chr1	13600	1.0	0.0	1.0
+chr1	13612	1.0	0.0	1.0
+chr1	13614	1.0	0.0	1.0
+chr1	13634	0.0	1.0	1.0
+chr1	13670	0.0	1.0	1.0
+chr1	13676	0.0	1.0	1.0
+chr1	13681	1.0	0.0	1.0
+chr1	13715	1.0	0.0	1.0
+chr1	13746	2.0	0.0	2.0
+chr1	13827	1.0	0.0	1.0
+chr1	13846	0.0	1.0	1.0
+chr1	13870	0.0	1.0	1.0
+chr1	13874	1.0	0.0	1.0
+chr1	13910	0.0	1.0	1.0
+chr1	13944	0.0	1.0	1.0
+chr1	13951	0.0	1.0	1.0
+chr1	13952	0.0	1.0	1.0
+chr1	13971	1.0	0.0	1.0
+chr1	13973	0.0	1.0	1.0
+chr1	14017	0.0	1.0	1.0
+chr1	14057	0.0	1.0	1.0
+chr1	14098	0.0	1.0	1.0
+chr1	14100	1.0	0.0	1.0
+chr1	14145	0.0	1.0	1.0
+chr1	14218	1.0	0.0	1.0
+chr1	14228	1.0	0.0	1.0
+chr1	14266	0.0	1.0	1.0
+chr1	14299	2.0	0.0	2.0
+chr1	14301	0.0	1.0	1.0
+chr1	14308	0.0	1.0	1.0
+chr1	14310	0.0	1.0	1.0
+chr1	14312	0.0	2.0	2.0
+chr1	14314	1.0	0.0	1.0
+chr1	14315	1.0	0.0	1.0
+chr1	14317	1.0	0.0	1.0
+chr1	14318	0.0	2.0	2.0
+chr1	14322	0.0	1.0	1.0
+chr1	14330	1.0	0.0	1.0
+chr1	14419	1.0	0.0	1.0
+chr1	14471	0.0	1.0	1.0
+chr1	14477	0.0	1.0	1.0
+chr1	14486	1.0	0.0	1.0
+chr1	14494	0.0	2.0	2.0
+chr1	14505	1.0	0.0	1.0
+chr1	14514	1.0	0.0	1.0
+chr1	14546	1.0	0.0	1.0
+chr1	14559	3.0	0.0	3.0
+chr1	14623	1.0	0.0	1.0
+chr1	14625	1.0	0.0	1.0
+chr1	14628	0.0	1.0	1.0
+chr1	14631	1.0	0.0	1.0
+chr1	14635	0.0	1.0	1.0
+chr1	14636	1.0	0.0	1.0
+chr1	14641	0.0	3.0	3.0
+chr1	14645	2.0	0.0	2.0
+chr1	14648	0.0	1.0	1.0
+chr1	14650	2.0	0.0	2.0
+chr1	14666	0.0	1.0	1.0
+chr1	14670	1.0	0.0	1.0
+chr1	14671	1.0	2.0	3.0
+chr1	14677	0.0	3.0	3.0
+chr1	14680	0.0	3.0	3.0
+chr1	14681	0.0	1.0	1.0
+chr1	14965	1.0	0.0	1.0
+chr1	14974	1.0	0.0	1.0
+chr1	14981	1.0	1.0	2.0
+chr1	14989	0.0	1.0	1.0
+chr1	14991	0.0	1.0	1.0
+chr1	14999	0.0	1.0	1.0
+chr1	15001	0.0	1.0	1.0
+chr1	15002	0.0	1.0	1.0
+chr1	15010	1.0	0.0	1.0
+chr1	15015	1.0	0.0	1.0
+chr1	15016	0.0	1.0	1.0
+chr1	15023	0.0	2.0	2.0
+chr1	15025	0.0	1.0	1.0
+chr1	15027	2.0	0.0	2.0
+chr1	15031	0.0	1.0	1.0
+chr1	15034	1.0	0.0	1.0
+chr1	15035	1.0	0.0	1.0
+chr1	15036	1.0	0.0	1.0
+chr1	15039	2.0	0.0	2.0
+chr1	15041	1.0	1.0	2.0
+chr1	15044	3.0	0.0	3.0
+chr1	15045	0.0	1.0	1.0
+chr1	15046	1.0	0.0	1.0
+chr1	15047	1.0	1.0	2.0
+chr1	15053	2.0	0.0	2.0
+chr1	15054	0.0	2.0	2.0
+chr1	15055	0.0	1.0	1.0
+chr1	15056	0.0	1.0	1.0
+chr1	15063	0.0	1.0	1.0
+chr1	15158	0.0	1.0	1.0
+chr1	15216	1.0	0.0	1.0
+chr1	15265	0.0	4.0	4.0
+chr1	15302	0.0	1.0	1.0
+chr1	15342	1.0	0.0	1.0
+chr1	15375	1.0	0.0	1.0
+chr1	15381	0.0	1.0	1.0
+chr1	15386	1.0	0.0	1.0
+chr1	15400	0.0	1.0	1.0
+chr1	15402	0.0	3.0	3.0
+chr1	15544	0.0	1.0	1.0
+chr1	15557	1.0	0.0	1.0
+chr1	15577	1.0	0.0	1.0
+chr1	15696	1.0	0.0	1.0
+chr1	15704	1.0	0.0	1.0
+chr1	15727	1.0	0.0	1.0
+chr1	15731	1.0	0.0	1.0
+chr1	15735	1.0	0.0	1.0
+chr1	15753	0.0	1.0	1.0
+chr1	15774	1.0	0.0	1.0
+chr1	15783	1.0	0.0	1.0
+chr1	16302	2.0	0.0	2.0
+chr1	16330	0.0	1.0	1.0
+chr1	16354	0.0	1.0	1.0
+chr1	16371	1.0	0.0	1.0
+chr1	16481	1.0	0.0	1.0
+chr1	16490	1.0	0.0	1.0
+chr1	16557	2.0	0.0	2.0
+chr1	16594	0.0	2.0	2.0
+chr1	16666	0.0	1.0	1.0
+chr1	16686	0.0	1.0	1.0
+chr1	16827	1.0	0.0	1.0
+chr1	16972	1.0	0.0	1.0
+chr1	17033	0.0	3.0	3.0
+chr1	17129	0.0	1.0	1.0
+chr1	17261	0.0	1.0	1.0
+chr1	17295	0.0	2.0	2.0
+chr1	17313	0.0	1.0	1.0
+chr1	17325	0.0	1.0	1.0
+chr1	17365	1.0	0.0	1.0
+chr1	17554	0.0	1.0	1.0
+chr1	17628	0.0	1.0	1.0
+chr1	17638	0.0	1.0	1.0
+chr1	17683	1.0	0.0	1.0
+chr1	17690	1.0	0.0	1.0
+chr1	17691	1.0	0.0	1.0
+chr1	17706	0.0	1.0	1.0
+chr1	17754	0.0	1.0	1.0
+chr1	17767	0.0	1.0	1.0
+chr1	17781	0.0	5.0	5.0
+chr1	17788	1.0	0.0	1.0
+chr1	17792	1.0	0.0	1.0
+chr1	17793	2.0	0.0	2.0
+chr1	17795	0.0	1.0	1.0
+chr1	17797	1.0	0.0	1.0
+chr1	17802	1.0	0.0	1.0
+chr1	17803	1.0	0.0	1.0
+chr1	17804	4.0	0.0	4.0
+chr1	17805	5.0	0.0	5.0
+chr1	17809	0.0	2.0	2.0
+chr1	17816	0.0	1.0	1.0
+chr1	17818	2.0	0.0	2.0
+chr1	17820	0.0	2.0	2.0
+chr1	17827	1.0	0.0	1.0
+chr1	17829	0.0	1.0	1.0
+chr1	17838	1.0	0.0	1.0
+chr1	17843	1.0	0.0	1.0
+chr1	17855	0.0	1.0	1.0
+chr1	17858	0.0	4.0	4.0
+chr1	17859	0.0	1.0	1.0
+chr1	17860	0.0	1.0	1.0
+chr1	17867	0.0	2.0	2.0
+chr1	17872	0.0	1.0	1.0
+chr1	17875	0.0	1.0	1.0
+chr1	17878	0.0	1.0	1.0
+chr1	17884	0.0	1.0	1.0
+chr1	17988	1.0	0.0	1.0
+chr1	18012	0.0	1.0	1.0
+chr1	18033	2.0	0.0	2.0
+chr1	18034	1.0	0.0	1.0
+chr1	18035	1.0	0.0	1.0
+chr1	18038	2.0	0.0	2.0
+chr1	18039	1.0	0.0	1.0
+chr1	18044	0.0	2.0	2.0
+chr1	18057	1.0	0.0	1.0
+chr1	18060	0.0	3.0	3.0
+chr1	18063	0.0	1.0	1.0
+chr1	18066	2.0	0.0	2.0
+chr1	18067	1.0	0.0	1.0
+chr1	18073	0.0	1.0	1.0
+chr1	18074	1.0	0.0	1.0
+chr1	18154	1.0	0.0	1.0
+chr1	18199	0.0	1.0	1.0
+chr1	18201	0.0	1.0	1.0
+chr1	18208	0.0	8.0	8.0
+chr1	18213	1.0	0.0	1.0
+chr1	18214	0.0	1.0	1.0
+chr1	18215	1.0	0.0	1.0
+chr1	18219	0.0	1.0	1.0
+chr1	18221	0.0	1.0	1.0
+chr1	18222	0.0	1.0	1.0
+chr1	18227	1.0	0.0	1.0
+chr1	18228	1.0	0.0	1.0
+chr1	18229	1.0	0.0	1.0
+chr1	18231	0.0	1.0	1.0
+chr1	18238	0.0	3.0	3.0
+chr1	18242	1.0	0.0	1.0
+chr1	18257	0.0	1.0	1.0
+chr1	18265	0.0	1.0	1.0
+chr1	18348	0.0	1.0	1.0
+chr1	18355	0.0	2.0	2.0
+chr1	18368	1.0	0.0	1.0
+chr1	18372	0.0	1.0	1.0
+chr1	18373	1.0	0.0	1.0
+chr1	18386	0.0	1.0	1.0
+chr1	18388	0.0	1.0	1.0
+chr1	18398	3.0	0.0	3.0
+chr1	18411	0.0	2.0	2.0
+chr1	18420	0.0	1.0	1.0
+chr1	18565	0.0	3.0	3.0
+chr1	18569	0.0	1.0	1.0
+chr1	18579	1.0	0.0	1.0
+chr1	18593	0.0	1.0	1.0
+chr1	18608	0.0	1.0	1.0
+chr1	18645	0.0	2.0	2.0
+chr1	18651	1.0	0.0	1.0
+chr1	18665	0.0	1.0	1.0
+chr1	18666	1.0	0.0	1.0
+chr1	18667	1.0	0.0	1.0
+chr1	18706	0.0	3.0	3.0
+chr1	18717	1.0	0.0	1.0
+chr1	18722	0.0	1.0	1.0
+chr1	18723	0.0	1.0	1.0
+chr1	18724	0.0	2.0	2.0
+chr1	18728	0.0	1.0	1.0
+chr1	18734	1.0	0.0	1.0
+chr1	18742	1.0	0.0	1.0
+chr1	18743	2.0	0.0	2.0
+chr1	18747	0.0	1.0	1.0
+chr1	18750	0.0	1.0	1.0
+chr1	18791	0.0	1.0	1.0
+chr1	18795	1.0	0.0	1.0
+chr1	18805	0.0	2.0	2.0
+chr1	18855	0.0	1.0	1.0
+chr1	18871	1.0	0.0	1.0
+chr1	18874	0.0	1.0	1.0
+chr1	18879	3.0	0.0	3.0
+chr1	18883	1.0	0.0	1.0
+chr1	18884	1.0	0.0	1.0
+chr1	18887	0.0	1.0	1.0
+chr1	18888	1.0	1.0	2.0
+chr1	18898	1.0	0.0	1.0
+chr1	18903	1.0	0.0	1.0
+chr1	18905	1.0	0.0	1.0
+chr1	18941	0.0	1.0	1.0
+chr1	18975	0.0	1.0	1.0
+chr1	19042	0.0	1.0	1.0
+chr1	19061	1.0	0.0	1.0
+chr1	19064	1.0	1.0	2.0
+chr1	19065	0.0	1.0	1.0
+chr1	19071	1.0	0.0	1.0
+chr1	19076	1.0	2.0	3.0
+chr1	19089	0.0	1.0	1.0
+chr1	19095	0.0	1.0	1.0
+chr1	19099	4.0	0.0	4.0
+chr1	19103	0.0	1.0	1.0
+chr1	19164	0.0	1.0	1.0
+chr1	19193	0.0	1.0	1.0
+chr1	19227	1.0	0.0	1.0
+chr1	19230	1.0	0.0	1.0
+chr1	19241	1.0	0.0	1.0
+chr1	19242	1.0	1.0	2.0
+chr1	19247	0.0	1.0	1.0
+chr1	19248	0.0	1.0	1.0
+chr1	19260	1.0	0.0	1.0
+chr1	19273	1.0	0.0	1.0
+chr1	19280	0.0	1.0	1.0
+chr1	19389	0.0	1.0	1.0
+chr1	19396	0.0	1.0	1.0
+chr1	19405	0.0	1.0	1.0
+chr1	19406	1.0	0.0	1.0
+chr1	19407	2.0	0.0	2.0
+chr1	19419	1.0	0.0	1.0
+chr1	19420	1.0	0.0	1.0
+chr1	19425	0.0	1.0	1.0
+chr1	19427	0.0	1.0	1.0
+chr1	19433	1.0	2.0	3.0
+chr1	19436	2.0	0.0	2.0
+chr1	19440	0.0	1.0	1.0
+chr1	19445	1.0	0.0	1.0
+chr1	19446	0.0	1.0	1.0
+chr1	19451	0.0	1.0	1.0
+chr1	19455	1.0	0.0	1.0
+chr1	19458	0.0	3.0	3.0
+chr1	19468	0.0	1.0	1.0
+chr1	19491	1.0	0.0	1.0
+chr1	19532	1.0	1.0	2.0
+chr1	19538	0.0	1.0	1.0
+chr1	19545	1.0	0.0	1.0
+chr1	19546	0.0	1.0	1.0
+chr1	19548	0.0	1.0	1.0
+chr1	19555	1.0	2.0	3.0
+chr1	19558	4.0	0.0	4.0
+chr1	19567	1.0	0.0	1.0
+chr1	19569	0.0	1.0	1.0
+chr1	19573	0.0	1.0	1.0
+chr1	19574	1.0	0.0	1.0
+chr1	19589	1.0	0.0	1.0
+chr1	19592	0.0	1.0	1.0
+chr1	19600	1.0	0.0	1.0
+chr1	19605	3.0	0.0	3.0
+chr1	19616	1.0	0.0	1.0
+chr1	19627	3.0	0.0	3.0
+chr1	19628	1.0	0.0	1.0
+chr1	19632	0.0	1.0	1.0
+chr1	19697	1.0	0.0	1.0
+chr1	19698	1.0	2.0	3.0
+chr1	19699	0.0	2.0	2.0
+chr1	19700	0.0	1.0	1.0
+chr1	19701	1.0	0.0	1.0
+chr1	19742	1.0	0.0	1.0
+chr1	19751	0.0	3.0	3.0
+chr1	19770	0.0	1.0	1.0
+chr1	19774	0.0	1.0	1.0
+chr1	19810	1.0	0.0	1.0
+chr1	19813	1.0	0.0	1.0
+chr1	19814	1.0	0.0	1.0
+chr1	19880	1.0	0.0	1.0
+chr1	19893	0.0	1.0	1.0
+chr1	19904	2.0	0.0	2.0
+chr1	19924	0.0	1.0	1.0
+chr1	19928	0.0	2.0	2.0
+chr1	19941	0.0	1.0	1.0
+chr1	19942	0.0	1.0	1.0
+chr1	19943	0.0	1.0	1.0
+chr1	19946	1.0	0.0	1.0
+chr1	19950	0.0	1.0	1.0
+chr1	19953	1.0	0.0	1.0
+chr1	19964	0.0	2.0	2.0
+chr1	20001	0.0	1.0	1.0
+chr1	20003	2.0	0.0	2.0
+chr1	20011	1.0	0.0	1.0
+chr1	20021	1.0	0.0	1.0
+chr1	20036	1.0	0.0	1.0
+chr1	20074	0.0	2.0	2.0
+chr1	20080	0.0	1.0	1.0
+chr1	20082	2.0	0.0	2.0
+chr1	20102	1.0	0.0	1.0
+chr1	20107	1.0	0.0	1.0
+chr1	20112	1.0	0.0	1.0
+chr1	20119	0.0	1.0	1.0
+chr1	20121	1.0	0.0	1.0
+chr1	20140	0.0	2.0	2.0
+chr1	20151	1.0	0.0	1.0
+chr1	20171	1.0	0.0	1.0
+chr1	20173	0.0	1.0	1.0
+chr1	20200	0.0	1.0	1.0
+chr1	20214	0.0	1.0	1.0
+chr1	20224	1.0	0.0	1.0
+chr1	20243	1.0	0.0	1.0
+chr1	20265	0.0	1.0	1.0
+chr1	20268	0.0	1.0	1.0
+chr1	20282	1.0	0.0	1.0
+chr1	20286	0.0	1.0	1.0
+chr1	20288	2.0	0.0	2.0
+chr1	20292	0.0	1.0	1.0
+chr1	20297	2.0	0.0	2.0
+chr1	20308	2.0	0.0	2.0
+chr1	20319	0.0	1.0	1.0
+chr1	20321	0.0	1.0	1.0
+chr1	20327	0.0	1.0	1.0
+chr1	20333	1.0	0.0	1.0
+chr1	20339	1.0	0.0	1.0
+chr1	20458	1.0	0.0	1.0
+chr1	20460	1.0	0.0	1.0
+chr1	20462	0.0	1.0	1.0
+chr1	20478	0.0	1.0	1.0
+chr1	20493	0.0	1.0	1.0
+chr1	20494	2.0	1.0	3.0
+chr1	20518	1.0	0.0	1.0
+chr1	20527	1.0	1.0	2.0
+chr1	20530	0.0	1.0	1.0
+chr1	20537	0.0	1.0	1.0
+chr1	20538	0.0	1.0	1.0
+chr1	20575	1.0	0.0	1.0
+chr1	20584	0.0	1.0	1.0
+chr1	20585	1.0	0.0	1.0
+chr1	20604	0.0	1.0	1.0
+chr1	20620	1.0	0.0	1.0
+chr1	20625	0.0	1.0	1.0
+chr1	20627	0.0	1.0	1.0
+chr1	20629	0.0	2.0	2.0
+chr1	20631	0.0	1.0	1.0
+chr1	20639	0.0	1.0	1.0
+chr1	20641	1.0	0.0	1.0
+chr1	20658	0.0	1.0	1.0
+chr1	20673	1.0	0.0	1.0
+chr1	20674	0.0	1.0	1.0
+chr1	20680	1.0	0.0	1.0
+chr1	20741	1.0	0.0	1.0
+chr1	20786	0.0	1.0	1.0
+chr1	20788	2.0	0.0	2.0
+chr1	20791	1.0	0.0	1.0
+chr1	20797	1.0	0.0	1.0
+chr1	20799	2.0	0.0	2.0
+chr1	20810	1.0	0.0	1.0
+chr1	20811	0.0	3.0	3.0
+chr1	20812	0.0	1.0	1.0
+chr1	20814	2.0	0.0	2.0
+chr1	20815	4.0	0.0	4.0
+chr1	20819	0.0	1.0	1.0
+chr1	20820	0.0	1.0	1.0
+chr1	20822	1.0	0.0	1.0
+chr1	20823	2.0	0.0	2.0
+chr1	20824	0.0	3.0	3.0
+chr1	20825	2.0	0.0	2.0
+chr1	20826	1.0	0.0	1.0
+chr1	20828	1.0	0.0	1.0
+chr1	20829	2.0	0.0	2.0
+chr1	20831	0.0	3.0	3.0
+chr1	20845	0.0	1.0	1.0
+chr1	20848	1.0	0.0	1.0
+chr1	20864	0.0	1.0	1.0
+chr1	20904	1.0	0.0	1.0
+chr1	21064	0.0	1.0	1.0
+chr1	21195	1.0	0.0	1.0
+chr1	21199	1.0	0.0	1.0
+chr1	21219	0.0	1.0	1.0
+chr1	21298	0.0	1.0	1.0
+chr1	21301	1.0	0.0	1.0
+chr1	21303	0.0	1.0	1.0
+chr1	21315	0.0	2.0	2.0
+chr1	21347	0.0	1.0	1.0
+chr1	21348	1.0	0.0	1.0
+chr1	21367	0.0	1.0	1.0
+chr1	21377	2.0	0.0	2.0
+chr1	21395	1.0	0.0	1.0
+chr1	21396	1.0	0.0	1.0
+chr1	21399	2.0	0.0	2.0
+chr1	21407	1.0	0.0	1.0
+chr1	21408	0.0	1.0	1.0
+chr1	21409	0.0	1.0	1.0
+chr1	21413	0.0	1.0	1.0
+chr1	21416	0.0	1.0	1.0
+chr1	21418	1.0	0.0	1.0
+chr1	21419	0.0	1.0	1.0
+chr1	21428	0.0	2.0	2.0
+chr1	21439	1.0	0.0	1.0
+chr1	21455	1.0	0.0	1.0
+chr1	21463	1.0	0.0	1.0
+chr1	21494	0.0	1.0	1.0
+chr1	21508	2.0	0.0	2.0
+chr1	21518	1.0	0.0	1.0
+chr1	21521	0.0	3.0	3.0
+chr1	21531	1.0	0.0	1.0
+chr1	21539	1.0	0.0	1.0
+chr1	21566	1.0	0.0	1.0
+chr1	21568	0.0	1.0	1.0
+chr1	21570	1.0	0.0	1.0
+chr1	21577	1.0	0.0	1.0
+chr1	21601	0.0	1.0	1.0
+chr1	21608	0.0	1.0	1.0
+chr1	21673	0.0	3.0	3.0
+chr1	21702	2.0	0.0	2.0
+chr1	21709	0.0	2.0	2.0
+chr1	21714	0.0	1.0	1.0
+chr1	21715	0.0	1.0	1.0
+chr1	21716	2.0	0.0	2.0
+chr1	21726	1.0	0.0	1.0
+chr1	21727	2.0	0.0	2.0
+chr1	21728	0.0	1.0	1.0
+chr1	21729	0.0	2.0	2.0
+chr1	21735	1.0	0.0	1.0
+chr1	21736	0.0	1.0	1.0
+chr1	21737	0.0	2.0	2.0
+chr1	21744	0.0	1.0	1.0
+chr1	21753	0.0	1.0	1.0
+chr1	21754	0.0	1.0	1.0
+chr1	21757	0.0	1.0	1.0
+chr1	21766	0.0	1.0	1.0
+chr1	21774	0.0	1.0	1.0
+chr1	21829	0.0	2.0	2.0
+chr1	21847	2.0	0.0	2.0
+chr1	21848	1.0	0.0	1.0
+chr1	21863	1.0	0.0	1.0
+chr1	21883	1.0	0.0	1.0
+chr1	21886	0.0	1.0	1.0
+chr1	21904	0.0	1.0	1.0
+chr1	21914	1.0	0.0	1.0
+chr1	21929	0.0	2.0	2.0
+chr1	21933	0.0	1.0	1.0
+chr1	21938	1.0	0.0	1.0
+chr1	21993	0.0	1.0	1.0
+chr1	22006	1.0	0.0	1.0
+chr1	22050	0.0	1.0	1.0
+chr1	22069	1.0	0.0	1.0
+chr1	22077	1.0	0.0	1.0
+chr1	22080	1.0	0.0	1.0
+chr1	22094	0.0	1.0	1.0
+chr1	22149	0.0	2.0	2.0
+chr1	22154	1.0	0.0	1.0
+chr1	22155	1.0	0.0	1.0
+chr1	22161	1.0	0.0	1.0
+chr1	22162	1.0	0.0	1.0
+chr1	22164	0.0	1.0	1.0
+chr1	22175	0.0	1.0	1.0
+chr1	22198	0.0	1.0	1.0
+chr1	22199	0.0	1.0	1.0
+chr1	22215	1.0	0.0	1.0
+chr1	22218	1.0	0.0	1.0
+chr1	22238	1.0	0.0	1.0
+chr1	22243	0.0	1.0	1.0
+chr1	22247	2.0	0.0	2.0
+chr1	22258	1.0	0.0	1.0
+chr1	22265	0.0	1.0	1.0
+chr1	22271	2.0	0.0	2.0
+chr1	22285	0.0	1.0	1.0
+chr1	22338	0.0	3.0	3.0
+chr1	22347	0.0	1.0	1.0
+chr1	22375	0.0	1.0	1.0
+chr1	22573	0.0	1.0	1.0
+chr1	22578	1.0	0.0	1.0
+chr1	22582	1.0	0.0	1.0
+chr1	22603	1.0	0.0	1.0
+chr1	22614	0.0	1.0	1.0
+chr1	22681	0.0	2.0	2.0
+chr1	22697	1.0	0.0	1.0
+chr1	22713	0.0	1.0	1.0
+chr1	22714	3.0	0.0	3.0
+chr1	22715	1.0	0.0	1.0
+chr1	22730	0.0	1.0	1.0
+chr1	22731	1.0	0.0	1.0
+chr1	22733	1.0	0.0	1.0
+chr1	22736	5.0	1.0	6.0
+chr1	22738	2.0	0.0	2.0
+chr1	22741	0.0	1.0	1.0
+chr1	22742	0.0	1.0	1.0
+chr1	22744	1.0	0.0	1.0
+chr1	22759	1.0	0.0	1.0
+chr1	22765	1.0	0.0	1.0
+chr1	22776	0.0	1.0	1.0
+chr1	22811	0.0	2.0	2.0
+chr1	22835	1.0	0.0	1.0
+chr1	22849	0.0	1.0	1.0
+chr1	22947	0.0	2.0	2.0
+chr1	22983	0.0	1.0	1.0
+chr1	23004	1.0	0.0	1.0
+chr1	23005	0.0	1.0	1.0
+chr1	23008	2.0	0.0	2.0
+chr1	23011	2.0	1.0	3.0
+chr1	23016	0.0	1.0	1.0
+chr1	23021	1.0	0.0	1.0
+chr1	23023	1.0	0.0	1.0
+chr1	23031	3.0	1.0	4.0
+chr1	23034	0.0	2.0	2.0
+chr1	23035	0.0	1.0	1.0
+chr1	23037	0.0	1.0	1.0
+chr1	23039	0.0	1.0	1.0
+chr1	23051	0.0	2.0	2.0
+chr1	23055	2.0	0.0	2.0
+chr1	23057	1.0	0.0	1.0
+chr1	23058	0.0	2.0	2.0
+chr1	23076	1.0	0.0	1.0
+chr1	23094	2.0	0.0	2.0
+chr1	23143	1.0	0.0	1.0
+chr1	23146	0.0	2.0	2.0
+chr1	23163	1.0	1.0	2.0
+chr1	23171	1.0	0.0	1.0
+chr1	23201	0.0	1.0	1.0
+chr1	23203	0.0	2.0	2.0
+chr1	23206	1.0	0.0	1.0
+chr1	23211	1.0	0.0	1.0
+chr1	23219	0.0	1.0	1.0
+chr1	23226	1.0	0.0	1.0
+chr1	23232	1.0	0.0	1.0
+chr1	23242	2.0	0.0	2.0
+chr1	23243	0.0	2.0	2.0
+chr1	23247	1.0	1.0	2.0
+chr1	23251	0.0	1.0	1.0
+chr1	23252	1.0	1.0	2.0
+chr1	23253	1.0	0.0	1.0
+chr1	23259	1.0	0.0	1.0
+chr1	23265	1.0	0.0	1.0
+chr1	23394	0.0	1.0	1.0
+chr1	23404	1.0	0.0	1.0
+chr1	23417	1.0	0.0	1.0
+chr1	23424	2.0	0.0	2.0
+chr1	23431	0.0	1.0	1.0
+chr1	23432	0.0	1.0	1.0
+chr1	23445	1.0	0.0	1.0
+chr1	23448	1.0	0.0	1.0
+chr1	23472	1.0	0.0	1.0
+chr1	23475	1.0	0.0	1.0
+chr1	23491	0.0	2.0	2.0
+chr1	23512	0.0	1.0	1.0
+chr1	23518	0.0	1.0	1.0
+chr1	23524	1.0	0.0	1.0
+chr1	23534	1.0	0.0	1.0
+chr1	23544	0.0	2.0	2.0
+chr1	23545	0.0	1.0	1.0
+chr1	23562	1.0	0.0	1.0
+chr1	23570	0.0	1.0	1.0
+chr1	23578	2.0	0.0	2.0
+chr1	23585	0.0	1.0	1.0
+chr1	23588	0.0	1.0	1.0
+chr1	23589	0.0	2.0	2.0
+chr1	23592	0.0	1.0	1.0
+chr1	23597	0.0	1.0	1.0
+chr1	23604	1.0	0.0	1.0
+chr1	23605	0.0	1.0	1.0
+chr1	23609	1.0	0.0	1.0
+chr1	23615	1.0	0.0	1.0
+chr1	23624	0.0	1.0	1.0
+chr1	23625	0.0	1.0	1.0
+chr1	23627	1.0	0.0	1.0
+chr1	23628	1.0	0.0	1.0
+chr1	23838	1.0	0.0	1.0
+chr1	23845	0.0	1.0	1.0
+chr1	23987	1.0	0.0	1.0
+chr1	23988	1.0	0.0	1.0
+chr1	23990	0.0	1.0	1.0
+chr1	24003	0.0	2.0	2.0
+chr1	24006	0.0	2.0	2.0
+chr1	24007	0.0	2.0	2.0
+chr1	24011	0.0	1.0	1.0
+chr1	24015	0.0	2.0	2.0
+chr1	24028	2.0	0.0	2.0
+chr1	24032	0.0	1.0	1.0
+chr1	24035	0.0	1.0	1.0
+chr1	24050	0.0	1.0	1.0
+chr1	24051	1.0	1.0	2.0
+chr1	24053	0.0	1.0	1.0
+chr1	24061	1.0	0.0	1.0
+chr1	24066	0.0	1.0	1.0
+chr1	24069	0.0	1.0	1.0
+chr1	24080	0.0	1.0	1.0
+chr1	24082	0.0	3.0	3.0
+chr1	24113	0.0	1.0	1.0
+chr1	24131	0.0	2.0	2.0
+chr1	24133	1.0	0.0	1.0
+chr1	24135	0.0	1.0	1.0
+chr1	24152	0.0	1.0	1.0
+chr1	24154	2.0	0.0	2.0
+chr1	24158	0.0	1.0	1.0
+chr1	24162	1.0	0.0	1.0
+chr1	24163	0.0	1.0	1.0
+chr1	24170	1.0	0.0	1.0
+chr1	24173	2.0	0.0	2.0
+chr1	24176	0.0	1.0	1.0
+chr1	24182	1.0	0.0	1.0
+chr1	24185	1.0	0.0	1.0
+chr1	24189	0.0	1.0	1.0
+chr1	24194	0.0	1.0	1.0
+chr1	24195	0.0	3.0	3.0
+chr1	24198	0.0	1.0	1.0
+chr1	24200	1.0	0.0	1.0
+chr1	24230	1.0	0.0	1.0
+chr1	24290	1.0	0.0	1.0
+chr1	24292	0.0	1.0	1.0
+chr1	24307	1.0	0.0	1.0
+chr1	24309	1.0	0.0	1.0
+chr1	24311	0.0	1.0	1.0
+chr1	24328	0.0	2.0	2.0
+chr1	24330	1.0	0.0	1.0
+chr1	24332	1.0	0.0	1.0
+chr1	24335	1.0	0.0	1.0
+chr1	24337	0.0	1.0	1.0
+chr1	24343	0.0	2.0	2.0
+chr1	24358	1.0	1.0	2.0
+chr1	24362	1.0	0.0	1.0
+chr1	24369	1.0	1.0	2.0
+chr1	24371	1.0	0.0	1.0
+chr1	24376	0.0	1.0	1.0
+chr1	24377	1.0	0.0	1.0
+chr1	24378	0.0	1.0	1.0
+chr1	24400	1.0	0.0	1.0
+chr1	24433	0.0	1.0	1.0
+chr1	24449	0.0	1.0	1.0
+chr1	24481	1.0	0.0	1.0
+chr1	24489	1.0	0.0	1.0
+chr1	24501	0.0	1.0	1.0
+chr1	24506	1.0	0.0	1.0
+chr1	24507	1.0	0.0	1.0
+chr1	24508	1.0	0.0	1.0
+chr1	24514	2.0	1.0	3.0
+chr1	24526	1.0	0.0	1.0
+chr1	24530	3.0	0.0	3.0
+chr1	24531	0.0	1.0	1.0
+chr1	24532	1.0	1.0	2.0
+chr1	24548	0.0	1.0	1.0
+chr1	24551	0.0	1.0	1.0
+chr1	24584	1.0	0.0	1.0
+chr1	24609	1.0	0.0	1.0
+chr1	24678	1.0	0.0	1.0
+chr1	24683	1.0	0.0	1.0
+chr1	24686	1.0	0.0	1.0
+chr1	24713	1.0	0.0	1.0
+chr1	24725	2.0	1.0	3.0
+chr1	24785	1.0	0.0	1.0
+chr1	24792	1.0	0.0	1.0
+chr1	24797	1.0	0.0	1.0
+chr1	24823	0.0	2.0	2.0
+chr1	24844	1.0	0.0	1.0
+chr1	24848	1.0	0.0	1.0
+chr1	24863	0.0	1.0	1.0
+chr1	24869	1.0	0.0	1.0
+chr1	24873	0.0	1.0	1.0
+chr1	24876	1.0	0.0	1.0
+chr1	24877	2.0	0.0	2.0
+chr1	24878	0.0	2.0	2.0
+chr1	24879	0.0	3.0	3.0
+chr1	24881	2.0	0.0	2.0
+chr1	24884	3.0	0.0	3.0
+chr1	24896	1.0	1.0	2.0
+chr1	24899	1.0	0.0	1.0
+chr1	24900	0.0	3.0	3.0
+chr1	24902	0.0	1.0	1.0
+chr1	24911	0.0	1.0	1.0
+chr1	24912	1.0	0.0	1.0
+chr1	24922	0.0	1.0	1.0
+chr1	24929	0.0	3.0	3.0
+chr1	24930	0.0	1.0	1.0
+chr1	24942	0.0	1.0	1.0
+chr1	24977	0.0	1.0	1.0
+chr1	24980	1.0	0.0	1.0
+chr1	25041	0.0	1.0	1.0
+chr1	25046	4.0	0.0	4.0
+chr1	25065	0.0	3.0	3.0
+chr1	25069	0.0	2.0	2.0
+chr1	25073	1.0	0.0	1.0
+chr1	25075	1.0	0.0	1.0
+chr1	25084	1.0	0.0	1.0
+chr1	25090	0.0	1.0	1.0
+chr1	25094	1.0	0.0	1.0
+chr1	25098	0.0	1.0	1.0
+chr1	25117	0.0	1.0	1.0
+chr1	25129	0.0	1.0	1.0
+chr1	25235	1.0	0.0	1.0
+chr1	25373	2.0	0.0	2.0
+chr1	25394	1.0	0.0	1.0
+chr1	25409	0.0	1.0	1.0
+chr1	25443	1.0	0.0	1.0
+chr1	25449	1.0	0.0	1.0
+chr1	25469	0.0	1.0	1.0
+chr1	25470	1.0	0.0	1.0
+chr1	25476	1.0	0.0	1.0
+chr1	25486	0.0	1.0	1.0
+chr1	25500	1.0	0.0	1.0
+chr1	25502	0.0	1.0	1.0
+chr1	25550	1.0	0.0	1.0
+chr1	25558	1.0	0.0	1.0
+chr1	25560	0.0	1.0	1.0
+chr1	25572	1.0	0.0	1.0
+chr1	25574	0.0	1.0	1.0
+chr1	25589	0.0	1.0	1.0
+chr1	25601	1.0	0.0	1.0
+chr1	25604	0.0	1.0	1.0
+chr1	25607	0.0	2.0	2.0
+chr1	25609	1.0	0.0	1.0
+chr1	25619	0.0	1.0	1.0
+chr1	25633	1.0	0.0	1.0
+chr1	25645	0.0	1.0	1.0
+chr1	25649	0.0	1.0	1.0
+chr1	25673	0.0	1.0	1.0
+chr1	25682	1.0	1.0	2.0
+chr1	25686	1.0	0.0	1.0
+chr1	25691	0.0	1.0	1.0
+chr1	25693	1.0	0.0	1.0
+chr1	25703	1.0	0.0	1.0
+chr1	25707	0.0	1.0	1.0
+chr1	25713	0.0	1.0	1.0
+chr1	25734	1.0	0.0	1.0
+chr1	25742	0.0	1.0	1.0
+chr1	25748	3.0	0.0	3.0
+chr1	25752	0.0	1.0	1.0
+chr1	25765	2.0	0.0	2.0
+chr1	25769	1.0	0.0	1.0
+chr1	25773	1.0	0.0	1.0
+chr1	25780	0.0	1.0	1.0
+chr1	25792	2.0	0.0	2.0
+chr1	25797	1.0	0.0	1.0
+chr1	25799	0.0	2.0	2.0
+chr1	25808	0.0	1.0	1.0
+chr1	25811	0.0	1.0	1.0
+chr1	25824	1.0	0.0	1.0
+chr1	25828	1.0	0.0	1.0
+chr1	25832	1.0	0.0	1.0
+chr1	25835	1.0	0.0	1.0
+chr1	25842	0.0	1.0	1.0
+chr1	25848	0.0	1.0	1.0
+chr1	25877	0.0	1.0	1.0
+chr1	25887	3.0	1.0	4.0
+chr1	25908	1.0	0.0	1.0
+chr1	25915	0.0	1.0	1.0
+chr1	25927	2.0	0.0	2.0
+chr1	25932	1.0	0.0	1.0
+chr1	25936	0.0	2.0	2.0
+chr1	25943	0.0	1.0	1.0
+chr1	25946	0.0	1.0	1.0
+chr1	25959	1.0	0.0	1.0
+chr1	25963	1.0	0.0	1.0
+chr1	25967	1.0	0.0	1.0
+chr1	25970	1.0	0.0	1.0
+chr1	25977	0.0	1.0	1.0
+chr1	25983	0.0	1.0	1.0
+chr1	25986	0.0	2.0	2.0
+chr1	26012	0.0	1.0	1.0
+chr1	26022	3.0	1.0	4.0
+chr1	26032	0.0	1.0	1.0
+chr1	26035	1.0	0.0	1.0
+chr1	26039	2.0	0.0	2.0
+chr1	26043	1.0	0.0	1.0
+chr1	26046	1.0	0.0	1.0
+chr1	26050	0.0	1.0	1.0
+chr1	26062	2.0	0.0	2.0
+chr1	26067	1.0	0.0	1.0
+chr1	26071	0.0	2.0	2.0
+chr1	26078	0.0	1.0	1.0
+chr1	26094	1.0	0.0	1.0
+chr1	26098	1.0	0.0	1.0
+chr1	26102	1.0	0.0	1.0
+chr1	26105	1.0	0.0	1.0
+chr1	26110	0.0	1.0	1.0
+chr1	26118	0.0	1.0	1.0
+chr1	26121	0.0	2.0	2.0
+chr1	26122	0.0	1.0	1.0
+chr1	26147	0.0	1.0	1.0
+chr1	26157	3.0	1.0	4.0
+chr1	26167	0.0	1.0	1.0
+chr1	26170	1.0	0.0	1.0
+chr1	26174	2.0	0.0	2.0
+chr1	26178	1.0	0.0	1.0
+chr1	26181	1.0	0.0	1.0
+chr1	26185	0.0	1.0	1.0
+chr1	26197	2.0	0.0	2.0
+chr1	26202	1.0	0.0	1.0
+chr1	26206	0.0	2.0	2.0
+chr1	26213	0.0	1.0	1.0
+chr1	26229	1.0	0.0	1.0
+chr1	26233	1.0	0.0	1.0
+chr1	26237	1.0	0.0	1.0
+chr1	26246	1.0	0.0	1.0
+chr1	26247	0.0	1.0	1.0
+chr1	26253	0.0	1.0	1.0
+chr1	26282	0.0	1.0	1.0
+chr1	26292	3.0	1.0	4.0
+chr1	26305	1.0	0.0	1.0
+chr1	26309	2.0	0.0	2.0
+chr1	26313	1.0	0.0	1.0
+chr1	26318	0.0	1.0	1.0
+chr1	26332	2.0	0.0	2.0
+chr1	26337	1.0	0.0	1.0
+chr1	26339	0.0	2.0	2.0
+chr1	26348	0.0	1.0	1.0
+chr1	26351	0.0	1.0	1.0
+chr1	26364	1.0	0.0	1.0
+chr1	26368	1.0	0.0	1.0
+chr1	26372	1.0	0.0	1.0
+chr1	26375	1.0	0.0	1.0
+chr1	26382	0.0	1.0	1.0
+chr1	26388	0.0	1.0	1.0
+chr1	26417	0.0	1.0	1.0
+chr1	26427	3.0	1.0	4.0
+chr1	26448	1.0	0.0	1.0
+chr1	26453	0.0	1.0	1.0
+chr1	26467	2.0	0.0	2.0
+chr1	26472	1.0	0.0	1.0
+chr1	26476	0.0	3.0	3.0
+chr1	26499	1.0	0.0	1.0
+chr1	26503	1.0	0.0	1.0
+chr1	26507	1.0	0.0	1.0
+chr1	26510	1.0	0.0	1.0
+chr1	26517	0.0	1.0	1.0
+chr1	26523	0.0	1.0	1.0
+chr1	26552	0.0	1.0	1.0
+chr1	26562	3.0	1.0	4.0
+chr1	26575	1.0	0.0	1.0
+chr1	26583	1.0	0.0	1.0
+chr1	26588	0.0	1.0	1.0
+chr1	26602	2.0	0.0	2.0
+chr1	26607	1.0	0.0	1.0
+chr1	26611	0.0	3.0	3.0
+chr1	26632	1.0	0.0	1.0
+chr1	26638	1.0	0.0	1.0
+chr1	26642	1.0	0.0	1.0
+chr1	26645	1.0	0.0	1.0
+chr1	26652	0.0	1.0	1.0
+chr1	26658	0.0	1.0	1.0
+chr1	26687	0.0	1.0	1.0
+chr1	26697	3.0	1.0	4.0
+chr1	26710	1.0	0.0	1.0
+chr1	26718	1.0	0.0	1.0
+chr1	26723	0.0	1.0	1.0
+chr1	26737	2.0	0.0	2.0
+chr1	26742	1.0	0.0	1.0
+chr1	26746	0.0	3.0	3.0
+chr1	26767	1.0	0.0	1.0
+chr1	26773	1.0	0.0	1.0
+chr1	26777	1.0	0.0	1.0
+chr1	26780	1.0	0.0	1.0
+chr1	26785	0.0	1.0	1.0
+chr1	26793	0.0	1.0	1.0
+chr1	26796	0.0	1.0	1.0
+chr1	26822	0.0	1.0	1.0
+chr1	26828	0.0	1.0	1.0
+chr1	26832	3.0	0.0	3.0
+chr1	26845	1.0	0.0	1.0
+chr1	26853	1.0	0.0	1.0
+chr1	26872	2.0	0.0	2.0
+chr1	26877	1.0	0.0	1.0
+chr1	26881	0.0	2.0	2.0
+chr1	26902	1.0	0.0	1.0
+chr1	26912	1.0	0.0	1.0
+chr1	26928	0.0	1.0	1.0
+chr1	26931	0.0	1.0	1.0
+chr1	26939	0.0	1.0	1.0
+chr1	26967	3.0	1.0	4.0
+chr1	26980	1.0	0.0	1.0
+chr1	26988	1.0	0.0	1.0
+chr1	27000	1.0	0.0	1.0
+chr1	27003	1.0	0.0	1.0
+chr1	27026	0.0	3.0	3.0
+chr1	27029	0.0	1.0	1.0
+chr1	27037	1.0	0.0	1.0
+chr1	27047	1.0	0.0	1.0
+chr1	27063	0.0	1.0	1.0
+chr1	27066	0.0	3.0	3.0
+chr1	27067	0.0	1.0	1.0
+chr1	27081	1.0	0.0	1.0
+chr1	27096	1.0	0.0	1.0
+chr1	27115	1.0	0.0	1.0
+chr1	27119	1.0	0.0	1.0
+chr1	27123	1.0	0.0	1.0
+chr1	27135	0.0	2.0	2.0
+chr1	27165	1.0	0.0	1.0
+chr1	27304	1.0	0.0	1.0
+chr1	27324	0.0	1.0	1.0
+chr1	27349	0.0	1.0	1.0
+chr1	27412	1.0	0.0	1.0
+chr1	27478	0.0	1.0	1.0
+chr1	27484	0.0	1.0	1.0
+chr1	27522	1.0	0.0	1.0
+chr1	27543	0.0	1.0	1.0
+chr1	27554	2.0	0.0	2.0
+chr1	27566	0.0	1.0	1.0
+chr1	27650	0.0	1.0	1.0
+chr1	27706	0.0	2.0	2.0
+chr1	27742	1.0	0.0	1.0
+chr1	27839	0.0	1.0	1.0
+chr1	27869	1.0	0.0	1.0
+chr1	27937	0.0	1.0	1.0
+chr1	28308	0.0	1.0	1.0
+chr1	28471	1.0	0.0	1.0
+chr1	28492	1.0	0.0	1.0
+chr1	28498	1.0	0.0	1.0
+chr1	28502	1.0	0.0	1.0
+chr1	28506	1.0	0.0	1.0
+chr1	28507	1.0	0.0	1.0
+chr1	28511	0.0	1.0	1.0
+chr1	28769	1.0	0.0	1.0
+chr1	28799	1.0	0.0	1.0
+chr1	28824	0.0	1.0	1.0
+chr1	28869	1.0	0.0	1.0
+chr1	28879	0.0	1.0	1.0
+chr1	28941	1.0	0.0	1.0
+chr1	28942	1.0	0.0	1.0
+chr1	29341	0.0	1.0	1.0
+chr1	29359	1.0	0.0	1.0
+chr1	29375	1.0	0.0	1.0
+chr1	29499	0.0	1.0	1.0
+chr1	29513	1.0	0.0	1.0
+chr1	29580	0.0	1.0	1.0
+chr1	29668	2.0	0.0	2.0
+chr1	29676	1.0	0.0	1.0
+chr1	29681	0.0	1.0	1.0
+chr1	29693	1.0	0.0	1.0
+chr1	29696	4.0	0.0	4.0
+chr1	29701	0.0	1.0	1.0
+chr1	29702	0.0	2.0	2.0
+chr1	29703	0.0	1.0	1.0
+chr1	29709	3.0	0.0	3.0
+chr1	29713	1.0	0.0	1.0
+chr1	29715	1.0	0.0	1.0
+chr1	29716	0.0	1.0	1.0
+chr1	29719	1.0	0.0	1.0
+chr1	29721	1.0	0.0	1.0
+chr1	29723	1.0	0.0	1.0
+chr1	29956	0.0	1.0	1.0
+chr1	30033	0.0	1.0	1.0
+chr1	30166	0.0	1.0	1.0
+chr1	30219	0.0	1.0	1.0
+chr1	30289	1.0	0.0	1.0
+chr1	30293	1.0	0.0	1.0
+chr1	30379	1.0	0.0	1.0
+chr1	30391	0.0	2.0	2.0
+chr1	30409	0.0	1.0	1.0
+chr1	30430	0.0	1.0	1.0
+chr1	30454	1.0	0.0	1.0
+chr1	30464	0.0	1.0	1.0
+chr1	30488	2.0	0.0	2.0
+chr1	30661	0.0	1.0	1.0
+chr1	30662	2.0	0.0	2.0
+chr1	30700	1.0	0.0	1.0
+chr1	30707	0.0	1.0	1.0
+chr1	30715	1.0	0.0	1.0
+chr1	30893	1.0	2.0	3.0
+chr1	30894	2.0	0.0	2.0
+chr1	31097	2.0	0.0	2.0
+chr1	31175	0.0	1.0	1.0
+chr1	31216	2.0	0.0	2.0
+chr1	31359	0.0	1.0	1.0
+chr1	31368	1.0	0.0	1.0
+chr1	31369	0.0	1.0	1.0
+chr1	31400	0.0	1.0	1.0
+chr1	31542	0.0	1.0	1.0
+chr1	31547	0.0	2.0	2.0
+chr1	31554	0.0	1.0	1.0
+chr1	31583	1.0	0.0	1.0
+chr1	31589	1.0	0.0	1.0
+chr1	31705	0.0	1.0	1.0
+chr1	31735	1.0	0.0	1.0
+chr1	31736	2.0	0.0	2.0
+chr1	31752	1.0	0.0	1.0
+chr1	31767	1.0	0.0	1.0
+chr1	31779	1.0	0.0	1.0
+chr1	31811	1.0	0.0	1.0
+chr1	31814	1.0	0.0	1.0
+chr1	31822	2.0	0.0	2.0
+chr1	31837	1.0	0.0	1.0
+chr1	31875	0.0	1.0	1.0
+chr1	31903	1.0	0.0	1.0
+chr1	31925	1.0	0.0	1.0
+chr1	31933	1.0	0.0	1.0
+chr1	31947	0.0	1.0	1.0
+chr1	31959	1.0	0.0	1.0
+chr1	31995	0.0	1.0	1.0
+chr1	32011	1.0	0.0	1.0
+chr1	32067	1.0	0.0	1.0
+chr1	32086	0.0	1.0	1.0
+chr1	32096	2.0	0.0	2.0
+chr1	32101	1.0	0.0	1.0
+chr1	32152	1.0	0.0	1.0
+chr1	32187	0.0	2.0	2.0
+chr1	32232	0.0	2.0	2.0
+chr1	32237	1.0	0.0	1.0
+chr1	32255	0.0	1.0	1.0
+chr1	32267	2.0	0.0	2.0
+chr1	32278	1.0	0.0	1.0
+chr1	32316	1.0	0.0	1.0
+chr1	32373	0.0	1.0	1.0
+chr1	32410	0.0	1.0	1.0
+chr1	32412	2.0	0.0	2.0
+chr1	32477	0.0	1.0	1.0
+chr1	32492	0.0	2.0	2.0
+chr1	32494	1.0	0.0	1.0
+chr1	32497	1.0	0.0	1.0
+chr1	32502	1.0	0.0	1.0
+chr1	32503	1.0	0.0	1.0
+chr1	32505	1.0	0.0	1.0
+chr1	32514	1.0	1.0	2.0
+chr1	32518	1.0	1.0	2.0
+chr1	32524	1.0	0.0	1.0
+chr1	32553	0.0	1.0	1.0
+chr1	32575	0.0	1.0	1.0
+chr1	32580	0.0	1.0	1.0
+chr1	32607	0.0	2.0	2.0
+chr1	32647	1.0	0.0	1.0
+chr1	32695	1.0	0.0	1.0
+chr1	32697	1.0	0.0	1.0
+chr1	32709	1.0	0.0	1.0
+chr1	32718	1.0	0.0	1.0
+chr1	32739	3.0	0.0	3.0
+chr1	32744	1.0	0.0	1.0
+chr1	32886	0.0	1.0	1.0
+chr1	32888	1.0	0.0	1.0
+chr1	32890	0.0	1.0	1.0
+chr1	32893	0.0	1.0	1.0
+chr1	32895	0.0	1.0	1.0
+chr1	32896	0.0	3.0	3.0
+chr1	32902	2.0	0.0	2.0
+chr1	32908	0.0	1.0	1.0
+chr1	32921	1.0	1.0	2.0
+chr1	32922	2.0	0.0	2.0
+chr1	32925	1.0	0.0	1.0
+chr1	32926	3.0	0.0	3.0
+chr1	33159	0.0	1.0	1.0
+chr1	33189	0.0	1.0	1.0
+chr1	33197	0.0	3.0	3.0
+chr1	33198	0.0	1.0	1.0
+chr1	33199	1.0	0.0	1.0
+chr1	33207	1.0	0.0	1.0
+chr1	33210	2.0	1.0	3.0
+chr1	33212	2.0	0.0	2.0
+chr1	33213	0.0	1.0	1.0
+chr1	33214	0.0	3.0	3.0
+chr1	33218	4.0	0.0	4.0
+chr1	33222	0.0	1.0	1.0
+chr1	33224	0.0	1.0	1.0
+chr1	33230	2.0	0.0	2.0
+chr1	33238	0.0	2.0	2.0
+chr1	33239	1.0	0.0	1.0
+chr1	33242	0.0	1.0	1.0
+chr1	33245	2.0	0.0	2.0
+chr1	33246	2.0	0.0	2.0
+chr1	33253	1.0	0.0	1.0
+chr1	33254	0.0	1.0	1.0
+chr1	33268	0.0	1.0	1.0
+chr1	33269	1.0	1.0	2.0
+chr1	33297	0.0	1.0	1.0
+chr1	33555	0.0	1.0	1.0
+chr1	33563	1.0	0.0	1.0
+chr1	33575	1.0	0.0	1.0
+chr1	33597	0.0	1.0	1.0
+chr1	33721	1.0	0.0	1.0
+chr1	33727	1.0	0.0	1.0
+chr1	33741	0.0	1.0	1.0
+chr1	33759	1.0	0.0	1.0
+chr1	33771	0.0	1.0	1.0
+chr1	33875	1.0	0.0	1.0
+chr1	33910	0.0	1.0	1.0
+chr1	34028	0.0	1.0	1.0
+chr1	34040	1.0	0.0	1.0
+chr1	34041	0.0	1.0	1.0
+chr1	34058	0.0	1.0	1.0
+chr1	34109	1.0	0.0	1.0
+chr1	34165	1.0	0.0	1.0
+chr1	34178	1.0	0.0	1.0
+chr1	34298	1.0	0.0	1.0
+chr1	34314	1.0	0.0	1.0
+chr1	34327	0.0	1.0	1.0
+chr1	34372	1.0	0.0	1.0
+chr1	34392	1.0	0.0	1.0
+chr1	34418	1.0	0.0	1.0
+chr1	34443	1.0	0.0	1.0
+chr1	34454	0.0	1.0	1.0
+chr1	34473	2.0	0.0	2.0
+chr1	34635	0.0	1.0	1.0
+chr1	34679	0.0	1.0	1.0
+chr1	34701	1.0	0.0	1.0
+chr1	34721	3.0	0.0	3.0
+chr1	34722	0.0	1.0	1.0
+chr1	34768	0.0	1.0	1.0
+chr1	34845	0.0	1.0	1.0
+chr1	34865	0.0	1.0	1.0
+chr1	34869	0.0	1.0	1.0
+chr1	34881	4.0	0.0	4.0
+chr1	34973	1.0	0.0	1.0
+chr1	34991	1.0	0.0	1.0
+chr1	34992	2.0	0.0	2.0
+chr1	34996	0.0	1.0	1.0
+chr1	35001	0.0	1.0	1.0
+chr1	35042	0.0	1.0	1.0
+chr1	35051	1.0	0.0	1.0
+chr1	35059	0.0	1.0	1.0
+chr1	35062	0.0	1.0	1.0
+chr1	35171	3.0	0.0	3.0
+chr1	35194	1.0	0.0	1.0
+chr1	35215	1.0	0.0	1.0
+chr1	35218	0.0	1.0	1.0
+chr1	35219	0.0	1.0	1.0
+chr1	35230	1.0	0.0	1.0
+chr1	35232	0.0	4.0	4.0
+chr1	35236	0.0	1.0	1.0
+chr1	35239	1.0	0.0	1.0
+chr1	35244	0.0	1.0	1.0
+chr1	35253	0.0	2.0	2.0
+chr1	35348	0.0	1.0	1.0
+chr1	35401	1.0	0.0	1.0
+chr1	35415	1.0	0.0	1.0
+chr1	35462	1.0	0.0	1.0
+chr1	35550	1.0	0.0	1.0
+chr1	35566	0.0	1.0	1.0
+chr1	35570	0.0	1.0	1.0
+chr1	35586	1.0	0.0	1.0
+chr1	35592	0.0	1.0	1.0
+chr1	35603	1.0	0.0	1.0
+chr1	35681	1.0	0.0	1.0
+chr1	35691	0.0	1.0	1.0
+chr1	35698	0.0	1.0	1.0
+chr1	35699	0.0	1.0	1.0
+chr1	35701	0.0	1.0	1.0
+chr1	35705	0.0	3.0	3.0
+chr1	35712	1.0	0.0	1.0
+chr1	35726	1.0	0.0	1.0
+chr1	35855	0.0	4.0	4.0
+chr1	35971	1.0	0.0	1.0
+chr1	36146	0.0	1.0	1.0
+chr1	36158	0.0	1.0	1.0
+chr1	36184	1.0	0.0	1.0
+chr1	36273	0.0	1.0	1.0
+chr1	36295	2.0	0.0	2.0
+chr1	36301	2.0	0.0	2.0
+chr1	36308	0.0	1.0	1.0
+chr1	36312	2.0	0.0	2.0
+chr1	36322	1.0	0.0	1.0
+chr1	36343	0.0	1.0	1.0
+chr1	36544	0.0	1.0	1.0
+chr1	36571	1.0	0.0	1.0
+chr1	36573	0.0	2.0	2.0
+chr1	36574	0.0	2.0	2.0
+chr1	36579	0.0	1.0	1.0
+chr1	36582	0.0	1.0	1.0
+chr1	36584	1.0	0.0	1.0
+chr1	36586	2.0	1.0	3.0
+chr1	36588	0.0	4.0	4.0
+chr1	36591	0.0	6.0	6.0
+chr1	36595	0.0	1.0	1.0
+chr1	36601	0.0	1.0	1.0
+chr1	36605	2.0	0.0	2.0
+chr1	36608	0.0	1.0	1.0
+chr1	36609	1.0	0.0	1.0
+chr1	36613	0.0	1.0	1.0
+chr1	36622	1.0	0.0	1.0
+chr1	36740	0.0	2.0	2.0
+chr1	36748	0.0	1.0	1.0
+chr1	36750	1.0	0.0	1.0
+chr1	36869	0.0	1.0	1.0
+chr1	36881	0.0	1.0	1.0
+chr1	36882	0.0	1.0	1.0
+chr1	36932	1.0	0.0	1.0
+chr1	37003	1.0	0.0	1.0
+chr1	37159	1.0	0.0	1.0
+chr1	37191	1.0	0.0	1.0
+chr1	37407	0.0	1.0	1.0
+chr1	37409	0.0	1.0	1.0
+chr1	37433	1.0	0.0	1.0
+chr1	37434	1.0	0.0	1.0
+chr1	37437	0.0	1.0	1.0
+chr1	37441	3.0	0.0	3.0
+chr1	37447	1.0	0.0	1.0
+chr1	37450	1.0	0.0	1.0
+chr1	37451	0.0	1.0	1.0
+chr1	37458	1.0	0.0	1.0
+chr1	37459	0.0	3.0	3.0
+chr1	37464	0.0	1.0	1.0
+chr1	37468	0.0	3.0	3.0
+chr1	37469	0.0	1.0	1.0
+chr1	37501	0.0	1.0	1.0
+chr1	37504	1.0	0.0	1.0
+chr1	37574	0.0	1.0	1.0
+chr1	37601	0.0	1.0	1.0
+chr1	37607	1.0	0.0	1.0
+chr1	37621	1.0	0.0	1.0
+chr1	37628	0.0	2.0	2.0
+chr1	37635	0.0	1.0	1.0
+chr1	37640	0.0	2.0	2.0
+chr1	37655	2.0	0.0	2.0
+chr1	37659	0.0	2.0	2.0
+chr1	37663	2.0	0.0	2.0
+chr1	37666	2.0	0.0	2.0
+chr1	37670	0.0	2.0	2.0
+chr1	37734	0.0	1.0	1.0
+chr1	37787	0.0	1.0	1.0
+chr1	37803	0.0	2.0	2.0
+chr1	37849	1.0	0.0	1.0
+chr1	37867	0.0	1.0	1.0
+chr1	37888	1.0	0.0	1.0
+chr1	37921	0.0	1.0	1.0
+chr1	37967	1.0	0.0	1.0
+chr1	38122	1.0	0.0	1.0
+chr1	38281	1.0	0.0	1.0
+chr1	38291	1.0	0.0	1.0
+chr1	38309	0.0	2.0	2.0
+chr1	38311	1.0	0.0	1.0
+chr1	38642	1.0	0.0	1.0
+chr1	38654	0.0	1.0	1.0
+chr1	38717	0.0	1.0	1.0
+chr1	38784	1.0	0.0	1.0
+chr1	38802	0.0	1.0	1.0
+chr1	38814	2.0	1.0	3.0
+chr1	38965	3.0	0.0	3.0
+chr1	38967	1.0	0.0	1.0
+chr1	38974	0.0	1.0	1.0
+chr1	38982	1.0	0.0	1.0
+chr1	38983	1.0	0.0	1.0
+chr1	39231	0.0	1.0	1.0
+chr1	39232	2.0	0.0	2.0
+chr1	39240	0.0	1.0	1.0
+chr1	39243	2.0	0.0	2.0
+chr1	39244	0.0	2.0	2.0
+chr1	39246	1.0	0.0	1.0
+chr1	39249	1.0	0.0	1.0
+chr1	39254	0.0	1.0	1.0
+chr1	39255	0.0	1.0	1.0
+chr1	39261	0.0	5.0	5.0
+chr1	39262	0.0	1.0	1.0
+chr1	39263	2.0	3.0	5.0
+chr1	39265	3.0	0.0	3.0
+chr1	39267	1.0	0.0	1.0
+chr1	39268	1.0	0.0	1.0
+chr1	39270	0.0	1.0	1.0
+chr1	39273	0.0	1.0	1.0
+chr1	39274	0.0	4.0	4.0
+chr1	39275	0.0	1.0	1.0
+chr1	39278	1.0	1.0	2.0
+chr1	39279	2.0	0.0	2.0
+chr1	39284	0.0	4.0	4.0
+chr1	39288	3.0	0.0	3.0
+chr1	39291	0.0	2.0	2.0
+chr1	39292	1.0	0.0	1.0
+chr1	39294	1.0	0.0	1.0
+chr1	39298	1.0	0.0	1.0
+chr1	39320	0.0	1.0	1.0
+chr1	39327	1.0	0.0	1.0
+chr1	39408	1.0	0.0	1.0
+chr1	39422	0.0	1.0	1.0
+chr1	39431	1.0	0.0	1.0
+chr1	39433	0.0	1.0	1.0
+chr1	39439	1.0	0.0	1.0
+chr1	39442	0.0	1.0	1.0
+chr1	39443	1.0	0.0	1.0
+chr1	39598	1.0	1.0	2.0
+chr1	39740	0.0	1.0	1.0
+chr1	40293	1.0	0.0	1.0
+chr1	40402	1.0	0.0	1.0
+chr1	40797	0.0	1.0	1.0
+chr1	40962	0.0	1.0	1.0
+chr1	40973	1.0	0.0	1.0
+chr1	41199	0.0	1.0	1.0
+chr1	41356	1.0	0.0	1.0
+chr1	41740	0.0	1.0	1.0
+chr1	42180	1.0	0.0	1.0
+chr1	42189	0.0	1.0	1.0
+chr1	42192	0.0	1.0	1.0
+chr1	42203	0.0	2.0	2.0
+chr1	42210	1.0	0.0	1.0
+chr1	42218	0.0	2.0	2.0
+chr1	42221	1.0	0.0	1.0
+chr1	42222	0.0	1.0	1.0
+chr1	42223	0.0	3.0	3.0
+chr1	42224	1.0	0.0	1.0
+chr1	42226	0.0	1.0	1.0
+chr1	42228	1.0	0.0	1.0
+chr1	42231	1.0	0.0	1.0
+chr1	42234	1.0	0.0	1.0
+chr1	42247	1.0	0.0	1.0
+chr1	42252	1.0	0.0	1.0
+chr1	42268	1.0	0.0	1.0
+chr1	42388	1.0	1.0	2.0
+chr1	42392	0.0	1.0	1.0
+chr1	42393	2.0	0.0	2.0
+chr1	42401	1.0	0.0	1.0
+chr1	42420	0.0	1.0	1.0
+chr1	42431	0.0	1.0	1.0
+chr1	42451	0.0	3.0	3.0
+chr1	42500	0.0	1.0	1.0
+chr1	42514	0.0	1.0	1.0
+chr1	42571	0.0	2.0	2.0
+chr1	42582	1.0	0.0	1.0
+chr1	42677	1.0	0.0	1.0
+chr1	42887	0.0	1.0	1.0
+chr1	42894	1.0	0.0	1.0
+chr1	42896	0.0	1.0	1.0
+chr1	42919	0.0	3.0	3.0
+chr1	42922	0.0	1.0	1.0
+chr1	42939	2.0	0.0	2.0
+chr1	42953	0.0	2.0	2.0
+chr1	43034	1.0	0.0	1.0
+chr1	43066	0.0	1.0	1.0
+chr1	43072	2.0	0.0	2.0
+chr1	43074	1.0	0.0	1.0
+chr1	43080	0.0	1.0	1.0
+chr1	43088	2.0	2.0	4.0
+chr1	43113	2.0	0.0	2.0
+chr1	43118	1.0	0.0	1.0
+chr1	43122	0.0	1.0	1.0
+chr1	43131	1.0	3.0	4.0
+chr1	43139	0.0	1.0	1.0
+chr1	43150	1.0	0.0	1.0
+chr1	43158	1.0	0.0	1.0
+chr1	43166	0.0	1.0	1.0
+chr1	43187	1.0	0.0	1.0
+chr1	43226	1.0	0.0	1.0
+chr1	43237	5.0	1.0	6.0
+chr1	43239	0.0	1.0	1.0
+chr1	43243	0.0	1.0	1.0
+chr1	43244	1.0	0.0	1.0
+chr1	43246	2.0	1.0	3.0
+chr1	43247	0.0	1.0	1.0
+chr1	43250	2.0	0.0	2.0
+chr1	43260	3.0	0.0	3.0
+chr1	43268	0.0	1.0	1.0
+chr1	43271	2.0	0.0	2.0
+chr1	43273	1.0	0.0	1.0
+chr1	43274	0.0	1.0	1.0
+chr1	43275	0.0	1.0	1.0
+chr1	43280	0.0	1.0	1.0
+chr1	43281	1.0	0.0	1.0
+chr1	43282	1.0	0.0	1.0
+chr1	43285	1.0	1.0	2.0
+chr1	43300	3.0	1.0	4.0
+chr1	43309	0.0	1.0	1.0
+chr1	43313	1.0	0.0	1.0
+chr1	43317	0.0	1.0	1.0
+chr1	43431	0.0	1.0	1.0
+chr1	43440	0.0	1.0	1.0
+chr1	43461	2.0	0.0	2.0
+chr1	43470	1.0	0.0	1.0
+chr1	43474	1.0	0.0	1.0
+chr1	43475	1.0	0.0	1.0
+chr1	43480	0.0	1.0	1.0
+chr1	43481	0.0	4.0	4.0
+chr1	43482	1.0	0.0	1.0
+chr1	43483	0.0	2.0	2.0
+chr1	43484	1.0	0.0	1.0
+chr1	43485	0.0	2.0	2.0
+chr1	43489	2.0	0.0	2.0
+chr1	43498	1.0	0.0	1.0
+chr1	43504	1.0	0.0	1.0
+chr1	43506	1.0	0.0	1.0
+chr1	43513	2.0	0.0	2.0
+chr1	43519	0.0	1.0	1.0
+chr1	43529	0.0	1.0	1.0
+chr1	43531	0.0	1.0	1.0
+chr1	43543	0.0	3.0	3.0
+chr1	43545	0.0	1.0	1.0
+chr1	43556	1.0	0.0	1.0
+chr1	43573	2.0	0.0	2.0
+chr1	43579	1.0	0.0	1.0
+chr1	43583	1.0	0.0	1.0
+chr1	43604	2.0	0.0	2.0
+chr1	43644	0.0	5.0	5.0
+chr1	43645	0.0	1.0	1.0
+chr1	43652	0.0	1.0	1.0
+chr1	43657	0.0	1.0	1.0
+chr1	43685	1.0	0.0	1.0
+chr1	43687	0.0	1.0	1.0
+chr1	43705	1.0	0.0	1.0
+chr1	43740	0.0	1.0	1.0
+chr1	43781	0.0	1.0	1.0
+chr1	43800	0.0	1.0	1.0
+chr1	43801	0.0	1.0	1.0
+chr1	43810	1.0	0.0	1.0
+chr1	43814	0.0	1.0	1.0
+chr1	43829	0.0	1.0	1.0
+chr1	43981	0.0	1.0	1.0
+chr1	43987	1.0	0.0	1.0
+chr1	44035	0.0	1.0	1.0
+chr1	44190	1.0	0.0	1.0
+chr1	44254	1.0	0.0	1.0
+chr1	44291	0.0	1.0	1.0
+chr1	44415	1.0	0.0	1.0
+chr1	44443	3.0	0.0	3.0
+chr1	44608	0.0	2.0	2.0
+chr1	44644	1.0	0.0	1.0
+chr1	44646	1.0	0.0	1.0
+chr1	44652	1.0	0.0	1.0
+chr1	44682	0.0	2.0	2.0
+chr1	44807	0.0	1.0	1.0
+chr1	44808	0.0	1.0	1.0
+chr1	44825	1.0	0.0	1.0
+chr1	44826	1.0	0.0	1.0
+chr1	44850	0.0	1.0	1.0
+chr1	44977	1.0	0.0	1.0
+chr1	44987	1.0	0.0	1.0
+chr1	45017	1.0	0.0	1.0
+chr1	45146	0.0	1.0	1.0
+chr1	45147	0.0	1.0	1.0
+chr1	45151	0.0	2.0	2.0
+chr1	45152	0.0	1.0	1.0
+chr1	45153	2.0	0.0	2.0
+chr1	45164	1.0	0.0	1.0
+chr1	45166	2.0	0.0	2.0
+chr1	45170	1.0	0.0	1.0
+chr1	45174	0.0	1.0	1.0
+chr1	45175	1.0	0.0	1.0
+chr1	45176	2.0	4.0	6.0
+chr1	45177	0.0	4.0	4.0
+chr1	45182	0.0	1.0	1.0
+chr1	45190	1.0	0.0	1.0
+chr1	45192	0.0	3.0	3.0
+chr1	45199	1.0	0.0	1.0
+chr1	45208	1.0	0.0	1.0
+chr1	45776	1.0	0.0	1.0
+chr1	45797	1.0	0.0	1.0
+chr1	45964	0.0	1.0	1.0
+chr1	45965	0.0	1.0	1.0
+chr1	45967	1.0	0.0	1.0
+chr1	45968	1.0	0.0	1.0
+chr1	45969	2.0	0.0	2.0
+chr1	45971	0.0	2.0	2.0
+chr1	45973	1.0	0.0	1.0
+chr1	45978	0.0	1.0	1.0
+chr1	45986	1.0	0.0	1.0
+chr1	45988	0.0	1.0	1.0
+chr1	46146	0.0	1.0	1.0
+chr1	46279	1.0	0.0	1.0
+chr1	46305	1.0	0.0	1.0
+chr1	46334	1.0	0.0	1.0
+chr1	46440	1.0	0.0	1.0
+chr1	46650	1.0	0.0	1.0
+chr1	47801	1.0	0.0	1.0
+chr1	47920	1.0	0.0	1.0
+chr1	48030	0.0	1.0	1.0
+chr1	48517	1.0	0.0	1.0
+chr1	48524	1.0	0.0	1.0
+chr1	48528	1.0	0.0	1.0
+chr1	48550	1.0	0.0	1.0
+chr1	48552	0.0	1.0	1.0
+chr1	48555	1.0	0.0	1.0
+chr1	48557	0.0	1.0	1.0
+chr1	48558	0.0	3.0	3.0
+chr1	48562	1.0	0.0	1.0
+chr1	48572	0.0	1.0	1.0
+chr1	48573	1.0	0.0	1.0
+chr1	48574	5.0	0.0	5.0
+chr1	48580	1.0	0.0	1.0
+chr1	48584	1.0	0.0	1.0
+chr1	48585	1.0	1.0	2.0
+chr1	48586	0.0	2.0	2.0
+chr1	48587	2.0	1.0	3.0
+chr1	48593	0.0	1.0	1.0
+chr1	48595	1.0	0.0	1.0
+chr1	48598	1.0	0.0	1.0
+chr1	48602	0.0	5.0	5.0
+chr1	48603	0.0	1.0	1.0
+chr1	48604	0.0	1.0	1.0
+chr1	48618	1.0	0.0	1.0
+chr1	48619	3.0	0.0	3.0
+chr1	48665	1.0	0.0	1.0
+chr1	48753	1.0	0.0	1.0
+chr1	48763	0.0	1.0	1.0
+chr1	48766	1.0	0.0	1.0
+chr1	48797	1.0	0.0	1.0
+chr1	48824	0.0	1.0	1.0
+chr1	49402	2.0	0.0	2.0
+chr1	49542	2.0	0.0	2.0
+chr1	50054	1.0	0.0	1.0
+chr1	51273	2.0	0.0	2.0
+chr1	51278	2.0	0.0	2.0
+chr1	51346	1.0	0.0	1.0
+chr1	51411	1.0	0.0	1.0
+chr1	51425	1.0	0.0	1.0
+chr1	51558	0.0	1.0	1.0
+chr1	51865	0.0	1.0	1.0
+chr1	51910	0.0	1.0	1.0
+chr1	51920	0.0	1.0	1.0
+chr1	52013	1.0	0.0	1.0
+chr1	52080	0.0	1.0	1.0
+chr1	52103	0.0	1.0	1.0
+chr1	52123	1.0	0.0	1.0
+chr1	52192	0.0	1.0	1.0
+chr1	52252	1.0	0.0	1.0
+chr1	52367	1.0	0.0	1.0
+chr1	52421	1.0	0.0	1.0
+chr1	52425	0.0	2.0	2.0
+chr1	52426	0.0	1.0	1.0
+chr1	52439	1.0	0.0	1.0
+chr1	52441	0.0	1.0	1.0
+chr1	52527	0.0	1.0	1.0
+chr1	52566	0.0	1.0	1.0
+chr1	52567	0.0	1.0	1.0
+chr1	52569	0.0	2.0	2.0
+chr1	52582	0.0	2.0	2.0
+chr1	52583	1.0	0.0	1.0
+chr1	52584	1.0	0.0	1.0
+chr1	52588	1.0	1.0	2.0
+chr1	52596	3.0	1.0	4.0
+chr1	52597	0.0	1.0	1.0
+chr1	52598	1.0	0.0	1.0
+chr1	52618	0.0	1.0	1.0
+chr1	52620	1.0	0.0	1.0
+chr1	52621	0.0	1.0	1.0
+chr1	52857	2.0	0.0	2.0
+chr1	52858	1.0	0.0	1.0
+chr1	52870	0.0	1.0	1.0
+chr1	52873	0.0	1.0	1.0
+chr1	52877	0.0	2.0	2.0
+chr1	52881	2.0	0.0	2.0
+chr1	52890	1.0	0.0	1.0
+chr1	53027	0.0	1.0	1.0
+chr1	53028	0.0	2.0	2.0
+chr1	53037	0.0	1.0	1.0
+chr1	53047	0.0	1.0	1.0
+chr1	53048	0.0	1.0	1.0
+chr1	53054	0.0	1.0	1.0
+chr1	53057	1.0	0.0	1.0
+chr1	53058	1.0	0.0	1.0
+chr1	53070	1.0	0.0	1.0
+chr1	53071	1.0	0.0	1.0
+chr1	53374	1.0	0.0	1.0
+chr1	53383	0.0	1.0	1.0
+chr1	53539	1.0	0.0	1.0
+chr1	53646	1.0	0.0	1.0
+chr1	53827	0.0	1.0	1.0
+chr1	53894	1.0	0.0	1.0
+chr1	53979	1.0	0.0	1.0
+chr1	54053	0.0	1.0	1.0
+chr1	54074	1.0	0.0	1.0
+chr1	54161	1.0	0.0	1.0
+chr1	54201	0.0	1.0	1.0
+chr1	54230	0.0	2.0	2.0
+chr1	54245	0.0	1.0	1.0
+chr1	54249	1.0	0.0	1.0
+chr1	54264	1.0	0.0	1.0
+chr1	54398	0.0	1.0	1.0
+chr1	54402	0.0	1.0	1.0
+chr1	54412	1.0	0.0	1.0
+chr1	54414	1.0	0.0	1.0
+chr1	54426	1.0	0.0	1.0
+chr1	54430	1.0	0.0	1.0
+chr1	54440	1.0	0.0	1.0
+chr1	54560	0.0	1.0	1.0
+chr1	54573	1.0	0.0	1.0
+chr1	54574	0.0	1.0	1.0
+chr1	54575	1.0	0.0	1.0
+chr1	54576	0.0	1.0	1.0
+chr1	54590	0.0	1.0	1.0
+chr1	54594	1.0	0.0	1.0
+chr1	54596	0.0	1.0	1.0
+chr1	54615	1.0	0.0	1.0
+chr1	54713	0.0	1.0	1.0
+chr1	54716	0.0	2.0	2.0
+chr1	54717	1.0	0.0	1.0
+chr1	54727	1.0	0.0	1.0
+chr1	54732	3.0	0.0	3.0
+chr1	54734	0.0	3.0	3.0
+chr1	54737	1.0	0.0	1.0
+chr1	54739	0.0	1.0	1.0
+chr1	54740	0.0	1.0	1.0
+chr1	54762	1.0	1.0	2.0
+chr1	54763	0.0	1.0	1.0
+chr1	54778	2.0	0.0	2.0
+chr1	54780	1.0	0.0	1.0
+chr1	54784	1.0	0.0	1.0
+chr1	54801	1.0	0.0	1.0
+chr1	55004	1.0	0.0	1.0
+chr1	55110	0.0	1.0	1.0
+chr1	55125	1.0	0.0	1.0
+chr1	55132	0.0	1.0	1.0
+chr1	55141	0.0	1.0	1.0
+chr1	55148	0.0	1.0	1.0
+chr1	55347	1.0	0.0	1.0
+chr1	55731	0.0	1.0	1.0
+chr1	55968	0.0	1.0	1.0
+chr1	55989	1.0	0.0	1.0
+chr1	56006	1.0	0.0	1.0
+chr1	56133	1.0	0.0	1.0
+chr1	56152	0.0	1.0	1.0
+chr1	56282	0.0	1.0	1.0
+chr1	56307	0.0	1.0	1.0
+chr1	56312	1.0	0.0	1.0
+chr1	56321	1.0	0.0	1.0
+chr1	56484	0.0	1.0	1.0
+chr1	56497	1.0	0.0	1.0
+chr1	56498	0.0	1.0	1.0
+chr1	56605	0.0	2.0	2.0
+chr1	56624	1.0	0.0	1.0
+chr1	56628	1.0	2.0	3.0
+chr1	56658	0.0	2.0	2.0
+chr1	56664	1.0	0.0	1.0
+chr1	56677	0.0	1.0	1.0
+chr1	56768	0.0	1.0	1.0
+chr1	56789	0.0	1.0	1.0
+chr1	56791	0.0	1.0	1.0
+chr1	56799	1.0	0.0	1.0
+chr1	56800	0.0	1.0	1.0
+chr1	56801	0.0	1.0	1.0
+chr1	56804	1.0	0.0	1.0
+chr1	56805	3.0	0.0	3.0
+chr1	56810	0.0	1.0	1.0
+chr1	56813	0.0	4.0	4.0
+chr1	56814	2.0	0.0	2.0
+chr1	56817	0.0	2.0	2.0
+chr1	56818	1.0	0.0	1.0
+chr1	56819	0.0	2.0	2.0
+chr1	56820	0.0	1.0	1.0
+chr1	56821	1.0	1.0	2.0
+chr1	56822	1.0	1.0	2.0
+chr1	56825	4.0	1.0	5.0
+chr1	56826	2.0	1.0	3.0
+chr1	56832	1.0	0.0	1.0
+chr1	56833	1.0	1.0	2.0
+chr1	56839	0.0	1.0	1.0
+chr1	56840	1.0	0.0	1.0
+chr1	56843	2.0	0.0	2.0
+chr1	56859	2.0	0.0	2.0
+chr1	57019	1.0	0.0	1.0
+chr1	57020	1.0	0.0	1.0
+chr1	57022	0.0	1.0	1.0
+chr1	57034	0.0	1.0	1.0
+chr1	57036	2.0	2.0	4.0
+chr1	57037	2.0	1.0	3.0
+chr1	57038	5.0	0.0	5.0
+chr1	57045	0.0	1.0	1.0
+chr1	57046	0.0	1.0	1.0
+chr1	57049	1.0	0.0	1.0
+chr1	57063	1.0	1.0	2.0
+chr1	57072	1.0	0.0	1.0
+chr1	57074	1.0	0.0	1.0
+chr1	57105	1.0	0.0	1.0
+chr1	57155	0.0	1.0	1.0
+chr1	57166	0.0	1.0	1.0
+chr1	57168	0.0	1.0	1.0
+chr1	57172	1.0	0.0	1.0
+chr1	57187	1.0	0.0	1.0
+chr1	57188	0.0	1.0	1.0
+chr1	57189	1.0	1.0	2.0
+chr1	57192	1.0	0.0	1.0
+chr1	57197	1.0	0.0	1.0
+chr1	57208	0.0	2.0	2.0
+chr1	57322	0.0	1.0	1.0
+chr1	57328	2.0	2.0	4.0
+chr1	57330	1.0	0.0	1.0
+chr1	57335	0.0	1.0	1.0
+chr1	57336	1.0	0.0	1.0
+chr1	57337	2.0	0.0	2.0
+chr1	57339	2.0	0.0	2.0
+chr1	57340	0.0	4.0	4.0
+chr1	57341	1.0	0.0	1.0
+chr1	57342	1.0	0.0	1.0
+chr1	57351	0.0	1.0	1.0
+chr1	57357	0.0	1.0	1.0
+chr1	57358	1.0	0.0	1.0
+chr1	57360	0.0	1.0	1.0
+chr1	57369	0.0	4.0	4.0
+chr1	57372	0.0	1.0	1.0
+chr1	57379	1.0	0.0	1.0
+chr1	57380	1.0	0.0	1.0
+chr1	57523	0.0	1.0	1.0
+chr1	57546	0.0	1.0	1.0
+chr1	57548	2.0	1.0	3.0
+chr1	57555	0.0	1.0	1.0
+chr1	57556	0.0	1.0	1.0
+chr1	57559	0.0	1.0	1.0
+chr1	57563	0.0	1.0	1.0
+chr1	57564	2.0	0.0	2.0
+chr1	57565	0.0	1.0	1.0
+chr1	57567	2.0	7.0	9.0
+chr1	57568	0.0	4.0	4.0
+chr1	57584	1.0	0.0	1.0
+chr1	57586	1.0	0.0	1.0
+chr1	57593	1.0	0.0	1.0
+chr1	57687	1.0	1.0	2.0
+chr1	57692	0.0	1.0	1.0
+chr1	57703	1.0	0.0	1.0
+chr1	57719	0.0	1.0	1.0
+chr1	57727	0.0	1.0	1.0
+chr1	57732	0.0	1.0	1.0
+chr1	57741	0.0	2.0	2.0
+chr1	57747	2.0	0.0	2.0
+chr1	57752	1.0	0.0	1.0
+chr1	57759	0.0	1.0	1.0
+chr1	57768	0.0	1.0	1.0
+chr1	57830	0.0	1.0	1.0
+chr1	57944	0.0	1.0	1.0
+chr1	58035	0.0	2.0	2.0
+chr1	58070	1.0	0.0	1.0
+chr1	58082	0.0	2.0	2.0
+chr1	58094	1.0	0.0	1.0
+chr1	58095	1.0	0.0	1.0
+chr1	58101	1.0	0.0	1.0
+chr1	58221	1.0	0.0	1.0
+chr1	58228	1.0	0.0	1.0
+chr1	58235	1.0	0.0	1.0
+chr1	58253	1.0	0.0	1.0
+chr1	58257	0.0	1.0	1.0
+chr1	58259	1.0	0.0	1.0
+chr1	58262	0.0	1.0	1.0
+chr1	58265	1.0	0.0	1.0
+chr1	58276	0.0	1.0	1.0
+chr1	58281	0.0	1.0	1.0
+chr1	58296	0.0	1.0	1.0
+chr1	58403	1.0	1.0	2.0
+chr1	58409	1.0	0.0	1.0
+chr1	58416	0.0	1.0	1.0
+chr1	58425	2.0	1.0	3.0
+chr1	58430	0.0	2.0	2.0
+chr1	58431	0.0	1.0	1.0
+chr1	58434	1.0	1.0	2.0
+chr1	58435	1.0	0.0	1.0
+chr1	58439	1.0	0.0	1.0
+chr1	58449	3.0	0.0	3.0
+chr1	58452	0.0	2.0	2.0
+chr1	58453	2.0	0.0	2.0
+chr1	58470	0.0	1.0	1.0
+chr1	58488	1.0	0.0	1.0
+chr1	58669	1.0	0.0	1.0
+chr1	58689	0.0	1.0	1.0
+chr1	58704	0.0	1.0	1.0
+chr1	58719	0.0	1.0	1.0
+chr1	58722	1.0	0.0	1.0
+chr1	58727	0.0	1.0	1.0
+chr1	58738	0.0	1.0	1.0
+chr1	58817	0.0	1.0	1.0
+chr1	58841	0.0	1.0	1.0
+chr1	58897	0.0	1.0	1.0
+chr1	59078	0.0	1.0	1.0
+chr1	59172	1.0	0.0	1.0
+chr1	59221	0.0	1.0	1.0
+chr1	59394	0.0	1.0	1.0
+chr1	59551	1.0	0.0	1.0
+chr1	59782	1.0	0.0	1.0
+chr1	60021	0.0	1.0	1.0
+chr1	60218	0.0	1.0	1.0
+chr1	60366	1.0	0.0	1.0
+chr1	60684	2.0	0.0	2.0
+chr1	60841	1.0	0.0	1.0
+chr1	60851	1.0	0.0	1.0
+chr1	60857	0.0	1.0	1.0
+chr1	60862	0.0	1.0	1.0
+chr1	60890	0.0	1.0	1.0
+chr1	60996	1.0	0.0	1.0
+chr1	61008	1.0	0.0	1.0
+chr1	61010	2.0	1.0	3.0
+chr1	61016	1.0	0.0	1.0
+chr1	61017	3.0	0.0	3.0
+chr1	61018	0.0	1.0	1.0
+chr1	61019	0.0	1.0	1.0
+chr1	61020	1.0	0.0	1.0
+chr1	61021	1.0	0.0	1.0
+chr1	61023	1.0	0.0	1.0
+chr1	61024	6.0	0.0	6.0
+chr1	61026	0.0	3.0	3.0
+chr1	61027	1.0	3.0	4.0
+chr1	61028	1.0	0.0	1.0
+chr1	61029	0.0	2.0	2.0
+chr1	61031	0.0	1.0	1.0
+chr1	61032	0.0	1.0	1.0
+chr1	61034	0.0	3.0	3.0
+chr1	61037	1.0	0.0	1.0
+chr1	61038	1.0	2.0	3.0
+chr1	61039	2.0	1.0	3.0
+chr1	61041	0.0	3.0	3.0
+chr1	61048	1.0	0.0	1.0
+chr1	61050	0.0	1.0	1.0
+chr1	61071	1.0	0.0	1.0
+chr1	61100	1.0	0.0	1.0
+chr1	61289	1.0	0.0	1.0
+chr1	61311	3.0	0.0	3.0
+chr1	61316	3.0	0.0	3.0
+chr1	61320	1.0	0.0	1.0
+chr1	61326	0.0	1.0	1.0
+chr1	61327	1.0	1.0	2.0
+chr1	61331	0.0	3.0	3.0
+chr1	61333	0.0	2.0	2.0
+chr1	61334	0.0	3.0	3.0
+chr1	61335	0.0	2.0	2.0
+chr1	61336	3.0	0.0	3.0
+chr1	61337	4.0	0.0	4.0
+chr1	61339	2.0	0.0	2.0
+chr1	61340	2.0	0.0	2.0
+chr1	61345	1.0	0.0	1.0
+chr1	61346	0.0	2.0	2.0
+chr1	61348	1.0	0.0	1.0
+chr1	61355	0.0	1.0	1.0
+chr1	61356	0.0	1.0	1.0
+chr1	61357	0.0	1.0	1.0
+chr1	61362	1.0	0.0	1.0
+chr1	61449	0.0	1.0	1.0
+chr1	61450	0.0	1.0	1.0
+chr1	61451	0.0	1.0	1.0
+chr1	61459	0.0	1.0	1.0
+chr1	61467	0.0	1.0	1.0
+chr1	61493	2.0	1.0	3.0
+chr1	61497	0.0	1.0	1.0
+chr1	61508	3.0	0.0	3.0
+chr1	61509	0.0	1.0	1.0
+chr1	61514	0.0	1.0	1.0
+chr1	61618	0.0	1.0	1.0
+chr1	61642	0.0	1.0	1.0
+chr1	61650	1.0	0.0	1.0
+chr1	61806	2.0	0.0	2.0
+chr1	62194	0.0	1.0	1.0
+chr1	62345	0.0	1.0	1.0
+chr1	62489	0.0	1.0	1.0
+chr1	62502	1.0	0.0	1.0
+chr1	62507	0.0	5.0	5.0
+chr1	62513	1.0	0.0	1.0
+chr1	62527	0.0	1.0	1.0
+chr1	62534	1.0	1.0	2.0
+chr1	62538	1.0	0.0	1.0
+chr1	62539	2.0	0.0	2.0
+chr1	62542	2.0	0.0	2.0
+chr1	62594	1.0	0.0	1.0
+chr1	62787	0.0	1.0	1.0
+chr1	62789	1.0	0.0	1.0
+chr1	62799	2.0	0.0	2.0
+chr1	62800	0.0	2.0	2.0
+chr1	62803	1.0	1.0	2.0
+chr1	62805	0.0	2.0	2.0
+chr1	62806	2.0	0.0	2.0
+chr1	62807	2.0	0.0	2.0
+chr1	62809	4.0	0.0	4.0
+chr1	62811	0.0	1.0	1.0
+chr1	62812	0.0	3.0	3.0
+chr1	62815	1.0	0.0	1.0
+chr1	62816	0.0	5.0	5.0
+chr1	62817	0.0	1.0	1.0
+chr1	62819	3.0	0.0	3.0
+chr1	62821	1.0	2.0	3.0
+chr1	62826	3.0	1.0	4.0
+chr1	62827	2.0	0.0	2.0
+chr1	62830	1.0	0.0	1.0
+chr1	62831	1.0	0.0	1.0
+chr1	62833	0.0	4.0	4.0
+chr1	62834	0.0	2.0	2.0
+chr1	62846	0.0	1.0	1.0
+chr1	62852	0.0	1.0	1.0
+chr1	62951	1.0	0.0	1.0
+chr1	62953	1.0	1.0	2.0
+chr1	62974	1.0	0.0	1.0
+chr1	63001	0.0	1.0	1.0
+chr1	63116	0.0	1.0	1.0
+chr1	63134	1.0	0.0	1.0
+chr1	63155	0.0	1.0	1.0
+chr1	63159	1.0	0.0	1.0
+chr1	63194	1.0	0.0	1.0
+chr1	63289	1.0	0.0	1.0
+chr1	63325	0.0	1.0	1.0
+chr1	63481	0.0	1.0	1.0
+chr1	63490	0.0	1.0	1.0
+chr1	63496	1.0	0.0	1.0
+chr1	63595	0.0	1.0	1.0
+chr1	63916	0.0	1.0	1.0
+chr1	63951	1.0	0.0	1.0
+chr1	64089	0.0	1.0	1.0
+chr1	64405	1.0	0.0	1.0
+chr1	64531	0.0	1.0	1.0
+chr1	64912	0.0	1.0	1.0
+chr1	64950	1.0	0.0	1.0
+chr1	65034	1.0	0.0	1.0
+chr1	66032	1.0	0.0	1.0
+chr1	66206	1.0	0.0	1.0
+chr1	66338	2.0	0.0	2.0
+chr1	66968	0.0	1.0	1.0
+chr1	66997	0.0	1.0	1.0
+chr1	67137	0.0	1.0	1.0
+chr1	67193	1.0	0.0	1.0
+chr1	67316	0.0	2.0	2.0
+chr1	67489	0.0	1.0	1.0
+chr1	67655	1.0	0.0	1.0
+chr1	67752	1.0	0.0	1.0
+chr1	67849	1.0	0.0	1.0
+chr1	68006	0.0	1.0	1.0
+chr1	68037	1.0	0.0	1.0
+chr1	68041	1.0	0.0	1.0
+chr1	68227	0.0	2.0	2.0
+chr1	68272	2.0	0.0	2.0
+chr1	68293	0.0	1.0	1.0
+chr1	68706	1.0	0.0	1.0
+chr1	68707	1.0	0.0	1.0
+chr1	68715	1.0	0.0	1.0
+chr1	68873	4.0	0.0	4.0
+chr1	68901	0.0	1.0	1.0
+chr1	68907	1.0	0.0	1.0
+chr1	68962	1.0	0.0	1.0
+chr1	68993	1.0	0.0	1.0
+chr1	69040	1.0	0.0	1.0
+chr1	69064	0.0	1.0	1.0
+chr1	69189	0.0	1.0	1.0
+chr1	69212	2.0	0.0	2.0
+chr1	69240	1.0	0.0	1.0
+chr1	69298	1.0	0.0	1.0
+chr1	69350	1.0	0.0	1.0
+chr1	69394	1.0	0.0	1.0
+chr1	69452	0.0	1.0	1.0
+chr1	69469	1.0	0.0	1.0
+chr1	69512	0.0	1.0	1.0
+chr1	69513	0.0	4.0	4.0
+chr1	69517	1.0	0.0	1.0
+chr1	69519	1.0	0.0	1.0
+chr1	69528	1.0	0.0	1.0
+chr1	69529	0.0	1.0	1.0
+chr1	69530	2.0	0.0	2.0
+chr1	69533	1.0	0.0	1.0
+chr1	69537	0.0	2.0	2.0
+chr1	69540	1.0	0.0	1.0
+chr1	69541	1.0	0.0	1.0
+chr1	69542	0.0	1.0	1.0
+chr1	69545	0.0	1.0	1.0
+chr1	69935	1.0	0.0	1.0
+chr1	69945	0.0	1.0	1.0
+chr1	69958	0.0	1.0	1.0
+chr1	69974	0.0	1.0	1.0
+chr1	69980	3.0	0.0	3.0
+chr1	69983	0.0	2.0	2.0
+chr1	70002	1.0	0.0	1.0
+chr1	70015	0.0	1.0	1.0
+chr1	70031	1.0	0.0	1.0
+chr1	70089	0.0	1.0	1.0
+chr1	70111	0.0	1.0	1.0
+chr1	70137	0.0	1.0	1.0
+chr1	70275	0.0	2.0	2.0
+chr1	70292	0.0	1.0	1.0
+chr1	70293	0.0	1.0	1.0
+chr1	70298	0.0	1.0	1.0
+chr1	70313	0.0	2.0	2.0
+chr1	71447	1.0	0.0	1.0
+chr1	71601	0.0	1.0	1.0
+chr1	71817	0.0	1.0	1.0
+chr1	71822	1.0	0.0	1.0
+chr1	73055	1.0	0.0	1.0
+chr1	73611	0.0	1.0	1.0
+chr1	73618	1.0	0.0	1.0
+chr1	73653	2.0	0.0	2.0
+chr1	73662	0.0	1.0	1.0
+chr1	73714	1.0	0.0	1.0
+chr1	73837	0.0	1.0	1.0
+chr1	73867	1.0	0.0	1.0
+chr1	73870	1.0	0.0	1.0
+chr1	73881	2.0	0.0	2.0
+chr1	73886	1.0	0.0	1.0
+chr1	73888	0.0	1.0	1.0
+chr1	73889	1.0	2.0	3.0
+chr1	73894	1.0	0.0	1.0
+chr1	73907	1.0	0.0	1.0
+chr1	74036	0.0	1.0	1.0
+chr1	74050	0.0	1.0	1.0
+chr1	74052	4.0	0.0	4.0
+chr1	74054	1.0	0.0	1.0
+chr1	74061	0.0	1.0	1.0
+chr1	74065	1.0	0.0	1.0
+chr1	74187	0.0	1.0	1.0
+chr1	74208	1.0	0.0	1.0
+chr1	74210	0.0	2.0	2.0
+chr1	74231	2.0	0.0	2.0
+chr1	74246	1.0	0.0	1.0
+chr1	74247	1.0	0.0	1.0
+chr1	74249	0.0	1.0	1.0
+chr1	74280	2.0	0.0	2.0
+chr1	74406	0.0	1.0	1.0
+chr1	74408	0.0	2.0	2.0
+chr1	74411	0.0	1.0	1.0
+chr1	74418	0.0	2.0	2.0
+chr1	74421	0.0	1.0	1.0
+chr1	74426	0.0	1.0	1.0
+chr1	74433	0.0	1.0	1.0
+chr1	74613	1.0	0.0	1.0
+chr1	74633	0.0	1.0	1.0
+chr1	74715	0.0	1.0	1.0
+chr1	74729	1.0	0.0	1.0
+chr1	74749	0.0	1.0	1.0
+chr1	74758	1.0	0.0	1.0
+chr1	74768	0.0	1.0	1.0
+chr1	75107	1.0	0.0	1.0
+chr1	75169	0.0	2.0	2.0
+chr1	75303	0.0	1.0	1.0
+chr1	75501	0.0	1.0	1.0
+chr1	75526	0.0	1.0	1.0
+chr1	75790	0.0	1.0	1.0
+chr1	75808	0.0	1.0	1.0
+chr1	75823	1.0	0.0	1.0
+chr1	75830	0.0	1.0	1.0
+chr1	75869	0.0	1.0	1.0
+chr1	75946	1.0	0.0	1.0
+chr1	75980	0.0	1.0	1.0
+chr1	75981	0.0	2.0	2.0
+chr1	75990	1.0	0.0	1.0
+chr1	75998	0.0	2.0	2.0
+chr1	76125	0.0	2.0	2.0
+chr1	76134	0.0	2.0	2.0
+chr1	76138	2.0	3.0	5.0
+chr1	76143	0.0	1.0	1.0
+chr1	76144	1.0	0.0	1.0
+chr1	76145	1.0	0.0	1.0
+chr1	76146	2.0	0.0	2.0
+chr1	76147	2.0	0.0	2.0
+chr1	76150	0.0	1.0	1.0
+chr1	76151	0.0	3.0	3.0
+chr1	76152	2.0	0.0	2.0
+chr1	76154	1.0	2.0	3.0
+chr1	76155	3.0	0.0	3.0
+chr1	76156	0.0	2.0	2.0
+chr1	76157	1.0	0.0	1.0
+chr1	76161	0.0	2.0	2.0
+chr1	76162	0.0	4.0	4.0
+chr1	76163	1.0	7.0	8.0
+chr1	76170	1.0	0.0	1.0
+chr1	76171	1.0	1.0	2.0
+chr1	76174	0.0	1.0	1.0
+chr1	76175	0.0	2.0	2.0
+chr1	76192	0.0	1.0	1.0
+chr1	76409	0.0	1.0	1.0
+chr1	76414	1.0	0.0	1.0
+chr1	76427	1.0	0.0	1.0
+chr1	76436	0.0	1.0	1.0
+chr1	76438	2.0	0.0	2.0
+chr1	76439	3.0	0.0	3.0
+chr1	76441	3.0	0.0	3.0
+chr1	76446	1.0	0.0	1.0
+chr1	76447	4.0	0.0	4.0
+chr1	76448	0.0	1.0	1.0
+chr1	76451	1.0	0.0	1.0
+chr1	76453	0.0	9.0	9.0
+chr1	76454	0.0	2.0	2.0
+chr1	76457	1.0	0.0	1.0
+chr1	76459	1.0	0.0	1.0
+chr1	76460	0.0	1.0	1.0
+chr1	76462	0.0	1.0	1.0
+chr1	76602	0.0	1.0	1.0
+chr1	76743	0.0	1.0	1.0
+chr1	76754	1.0	0.0	1.0
+chr1	76769	1.0	1.0	2.0
+chr1	77480	1.0	0.0	1.0
+chr1	77843	0.0	1.0	1.0
+chr1	78597	0.0	1.0	1.0
+chr1	78768	0.0	1.0	1.0
+chr1	79434	0.0	1.0	1.0
+chr1	79706	0.0	1.0	1.0
+chr1	79710	1.0	0.0	1.0
+chr1	79720	0.0	3.0	3.0
+chr1	79722	0.0	1.0	1.0
+chr1	79723	0.0	2.0	2.0
+chr1	79724	1.0	0.0	1.0
+chr1	79725	1.0	0.0	1.0
+chr1	79726	1.0	0.0	1.0
+chr1	79729	2.0	1.0	3.0
+chr1	79737	0.0	4.0	4.0
+chr1	79738	2.0	1.0	3.0
+chr1	79739	5.0	2.0	7.0
+chr1	79740	1.0	0.0	1.0
+chr1	79744	0.0	3.0	3.0
+chr1	79754	0.0	1.0	1.0
+chr1	79755	2.0	0.0	2.0
+chr1	79756	1.0	0.0	1.0
+chr1	79793	1.0	0.0	1.0
+chr1	79844	0.0	1.0	1.0
+chr1	79863	0.0	2.0	2.0
+chr1	79893	0.0	1.0	1.0
+chr1	79894	1.0	0.0	1.0
+chr1	79899	0.0	1.0	1.0
+chr1	79901	3.0	0.0	3.0
+chr1	79916	2.0	0.0	2.0
+chr1	79920	0.0	1.0	1.0
+chr1	79932	1.0	0.0	1.0
+chr1	79936	6.0	0.0	6.0
+chr1	80052	0.0	1.0	1.0
+chr1	80086	1.0	0.0	1.0
+chr1	80087	1.0	0.0	1.0
+chr1	80099	0.0	1.0	1.0
+chr1	80111	0.0	1.0	1.0
+chr1	80161	0.0	1.0	1.0
+chr1	80394	0.0	1.0	1.0
+chr1	80397	0.0	1.0	1.0
+chr1	80443	2.0	0.0	2.0
+chr1	80553	2.0	0.0	2.0
+chr1	80804	1.0	0.0	1.0
+chr1	80858	1.0	0.0	1.0
+chr1	80868	0.0	1.0	1.0
+chr1	80942	0.0	1.0	1.0
+chr1	81040	0.0	1.0	1.0
+chr1	81163	1.0	0.0	1.0
+chr1	81171	0.0	1.0	1.0
+chr1	81971	0.0	2.0	2.0
+chr1	81974	0.0	1.0	1.0
+chr1	81985	0.0	1.0	1.0
+chr1	82178	1.0	0.0	1.0
+chr1	82210	0.0	1.0	1.0
+chr1	82236	1.0	0.0	1.0
+chr1	82239	0.0	1.0	1.0
+chr1	82242	0.0	1.0	1.0
+chr1	82272	1.0	0.0	1.0
+chr1	82330	0.0	1.0	1.0
+chr1	82335	0.0	1.0	1.0
+chr1	82349	0.0	1.0	1.0
+chr1	82367	0.0	1.0	1.0
+chr1	82375	1.0	3.0	4.0
+chr1	82504	8.0	0.0	8.0
+chr1	82507	0.0	1.0	1.0
+chr1	82511	0.0	3.0	3.0
+chr1	82513	0.0	1.0	1.0
+chr1	82514	2.0	4.0	6.0
+chr1	82515	1.0	0.0	1.0
+chr1	82521	0.0	1.0	1.0
+chr1	82522	1.0	0.0	1.0
+chr1	82525	1.0	0.0	1.0
+chr1	82528	2.0	0.0	2.0
+chr1	82541	6.0	0.0	6.0
+chr1	82542	1.0	1.0	2.0
+chr1	82549	0.0	1.0	1.0
+chr1	82553	1.0	0.0	1.0
+chr1	82556	1.0	0.0	1.0
+chr1	82558	0.0	1.0	1.0
+chr1	82559	0.0	1.0	1.0
+chr1	82561	1.0	0.0	1.0
+chr1	82564	1.0	0.0	1.0
+chr1	82576	1.0	0.0	1.0
+chr1	82578	1.0	0.0	1.0
+chr1	82725	0.0	1.0	1.0
+chr1	82738	0.0	1.0	1.0
+chr1	82747	0.0	1.0	1.0
+chr1	82754	3.0	0.0	3.0
+chr1	82758	0.0	1.0	1.0
+chr1	82761	0.0	2.0	2.0
+chr1	82766	0.0	5.0	5.0
+chr1	82767	0.0	4.0	4.0
+chr1	82768	0.0	1.0	1.0
+chr1	82770	1.0	0.0	1.0
+chr1	82782	0.0	1.0	1.0
+chr1	82788	0.0	1.0	1.0
+chr1	82792	1.0	0.0	1.0
+chr1	82803	1.0	0.0	1.0
+chr1	82810	1.0	0.0	1.0
+chr1	82900	0.0	1.0	1.0
+chr1	82909	1.0	0.0	1.0
+chr1	82916	6.0	0.0	6.0
+chr1	82917	0.0	1.0	1.0
+chr1	82918	0.0	1.0	1.0
+chr1	82931	1.0	0.0	1.0
+chr1	82935	1.0	0.0	1.0
+chr1	83035	1.0	0.0	1.0
+chr1	83069	1.0	0.0	1.0
+chr1	83081	1.0	0.0	1.0
+chr1	83296	0.0	1.0	1.0
+chr1	83354	0.0	1.0	1.0
+chr1	83392	0.0	1.0	1.0
+chr1	83434	1.0	0.0	1.0
+chr1	83451	1.0	0.0	1.0
+chr1	83453	0.0	1.0	1.0
+chr1	83609	0.0	1.0	1.0
+chr1	83620	0.0	1.0	1.0
+chr1	83644	1.0	0.0	1.0
+chr1	83670	1.0	0.0	1.0
+chr1	83772	1.0	0.0	1.0
+chr1	83940	0.0	1.0	1.0
+chr1	83959	1.0	0.0	1.0
+chr1	84086	0.0	2.0	2.0
+chr1	84088	1.0	0.0	1.0
+chr1	84105	2.0	0.0	2.0
+chr1	84106	0.0	1.0	1.0
+chr1	84107	0.0	1.0	1.0
+chr1	84112	2.0	0.0	2.0
+chr1	84133	1.0	0.0	1.0
+chr1	84252	0.0	2.0	2.0
+chr1	84253	1.0	0.0	1.0
+chr1	84262	1.0	0.0	1.0
+chr1	84264	0.0	2.0	2.0
+chr1	84271	0.0	3.0	3.0
+chr1	84272	1.0	0.0	1.0
+chr1	84276	1.0	0.0	1.0
+chr1	84287	0.0	1.0	1.0
+chr1	84288	0.0	1.0	1.0
+chr1	84293	0.0	1.0	1.0
+chr1	84294	1.0	1.0	2.0
+chr1	84338	1.0	0.0	1.0
+chr1	84364	1.0	0.0	1.0
+chr1	84401	1.0	0.0	1.0
+chr1	84402	1.0	1.0	2.0
+chr1	84421	0.0	1.0	1.0
+chr1	84424	2.0	0.0	2.0
+chr1	84427	2.0	0.0	2.0
+chr1	84433	0.0	1.0	1.0
+chr1	84435	2.0	0.0	2.0
+chr1	84436	1.0	0.0	1.0
+chr1	84438	0.0	2.0	2.0
+chr1	84440	1.0	0.0	1.0
+chr1	84441	1.0	0.0	1.0
+chr1	84442	2.0	0.0	2.0
+chr1	84443	4.0	0.0	4.0
+chr1	84444	6.0	0.0	6.0
+chr1	84447	0.0	3.0	3.0
+chr1	84450	0.0	2.0	2.0
+chr1	84451	2.0	0.0	2.0
+chr1	84454	0.0	13.0	13.0
+chr1	84455	0.0	1.0	1.0
+chr1	84456	1.0	2.0	3.0
+chr1	84458	0.0	1.0	1.0
+chr1	84463	2.0	4.0	6.0
+chr1	84464	4.0	3.0	7.0
+chr1	84465	2.0	0.0	2.0
+chr1	84474	0.0	1.0	1.0
+chr1	84475	1.0	0.0	1.0
+chr1	84477	0.0	1.0	1.0
+chr1	84517	2.0	0.0	2.0
+chr1	84889	1.0	0.0	1.0
+chr1	84900	1.0	0.0	1.0
+chr1	85049	0.0	1.0	1.0
+chr1	85075	1.0	0.0	1.0
+chr1	85218	1.0	0.0	1.0
+chr1	85362	1.0	0.0	1.0
+chr1	85571	0.0	1.0	1.0
+chr1	85588	1.0	0.0	1.0
+chr1	85632	1.0	0.0	1.0
+chr1	85723	1.0	0.0	1.0
+chr1	85909	0.0	1.0	1.0
+chr1	86044	0.0	1.0	1.0
+chr1	86051	0.0	1.0	1.0
+chr1	86065	0.0	1.0	1.0
+chr1	86227	1.0	0.0	1.0
+chr1	86343	0.0	1.0	1.0
+chr1	86515	1.0	0.0	1.0
+chr1	86668	0.0	1.0	1.0
+chr1	86690	0.0	1.0	1.0
+chr1	86697	1.0	0.0	1.0
+chr1	86702	1.0	0.0	1.0
+chr1	86705	1.0	0.0	1.0
+chr1	86707	0.0	1.0	1.0
+chr1	86709	0.0	2.0	2.0
+chr1	86838	0.0	1.0	1.0
+chr1	86844	0.0	1.0	1.0
+chr1	86882	0.0	2.0	2.0
+chr1	86975	0.0	3.0	3.0
+chr1	86978	1.0	0.0	1.0
+chr1	86994	0.0	2.0	2.0
+chr1	86999	0.0	2.0	2.0
+chr1	87005	0.0	1.0	1.0
+chr1	87008	1.0	0.0	1.0
+chr1	87009	0.0	1.0	1.0
+chr1	87010	1.0	0.0	1.0
+chr1	87011	3.0	0.0	3.0
+chr1	87012	6.0	2.0	8.0
+chr1	87013	5.0	0.0	5.0
+chr1	87015	0.0	3.0	3.0
+chr1	87016	0.0	1.0	1.0
+chr1	87017	0.0	2.0	2.0
+chr1	87019	0.0	2.0	2.0
+chr1	87020	4.0	0.0	4.0
+chr1	87021	3.0	0.0	3.0
+chr1	87022	1.0	0.0	1.0
+chr1	87024	0.0	1.0	1.0
+chr1	87026	2.0	0.0	2.0
+chr1	87028	9.0	0.0	9.0
+chr1	87032	2.0	8.0	10.0
+chr1	87033	0.0	8.0	8.0
+chr1	87036	1.0	0.0	1.0
+chr1	87037	0.0	1.0	1.0
+chr1	87040	3.0	2.0	5.0
+chr1	87043	0.0	3.0	3.0
+chr1	87044	0.0	3.0	3.0
+chr1	87045	0.0	1.0	1.0
+chr1	87046	1.0	0.0	1.0
+chr1	87047	0.0	1.0	1.0
+chr1	87048	1.0	1.0	2.0
+chr1	87049	1.0	0.0	1.0
+chr1	87052	1.0	0.0	1.0
+chr1	87056	0.0	2.0	2.0
+chr1	87074	0.0	1.0	1.0
+chr1	87288	1.0	1.0	2.0
+chr1	87290	0.0	3.0	3.0
+chr1	87294	0.0	1.0	1.0
+chr1	87302	2.0	0.0	2.0
+chr1	87306	3.0	0.0	3.0
+chr1	87307	3.0	1.0	4.0
+chr1	87308	0.0	3.0	3.0
+chr1	87309	6.0	0.0	6.0
+chr1	87310	0.0	1.0	1.0
+chr1	87311	2.0	4.0	6.0
+chr1	87312	3.0	0.0	3.0
+chr1	87313	15.0	0.0	15.0
+chr1	87315	0.0	1.0	1.0
+chr1	87316	4.0	0.0	4.0
+chr1	87317	0.0	16.0	16.0
+chr1	87318	0.0	16.0	16.0
+chr1	87320	3.0	0.0	3.0
+chr1	87321	3.0	2.0	5.0
+chr1	87322	0.0	1.0	1.0
+chr1	87324	0.0	5.0	5.0
+chr1	87325	0.0	1.0	1.0
+chr1	87326	0.0	1.0	1.0
+chr1	87332	0.0	3.0	3.0
+chr1	87334	1.0	1.0	2.0
+chr1	87335	1.0	0.0	1.0
+chr1	87341	0.0	1.0	1.0
+chr1	87342	0.0	1.0	1.0
+chr1	87349	0.0	1.0	1.0
+chr1	87369	1.0	0.0	1.0
+chr1	87431	0.0	1.0	1.0
+chr1	87491	0.0	1.0	1.0
+chr1	87498	0.0	1.0	1.0
+chr1	87640	0.0	2.0	2.0
+chr1	87659	2.0	0.0	2.0
+chr1	87660	1.0	0.0	1.0
+chr1	87661	1.0	1.0	2.0
+chr1	87695	1.0	0.0	1.0
+chr1	87698	0.0	1.0	1.0
+chr1	87969	1.0	0.0	1.0
+chr1	88013	0.0	1.0	1.0
+chr1	88028	1.0	0.0	1.0
+chr1	88226	0.0	1.0	1.0
+chr1	88381	0.0	2.0	2.0
+chr1	89216	0.0	1.0	1.0
+chr1	89242	1.0	0.0	1.0
+chr1	89586	0.0	1.0	1.0
+chr1	90275	0.0	1.0	1.0
+chr1	91080	1.0	0.0	1.0
+chr1	91777	1.0	0.0	1.0
+chr1	92010	0.0	2.0	2.0
+chr1	92045	1.0	0.0	1.0
+chr1	92108	1.0	0.0	1.0
+chr1	92242	3.0	0.0	3.0
+chr1	92475	0.0	1.0	1.0
+chr1	92476	0.0	1.0	1.0
+chr1	92478	1.0	0.0	1.0
+chr1	92495	0.0	1.0	1.0
+chr1	92882	1.0	0.0	1.0
+chr1	92883	1.0	0.0	1.0
+chr1	92888	0.0	1.0	1.0
+chr1	92889	1.0	2.0	3.0
+chr1	92890	1.0	0.0	1.0
+chr1	92894	2.0	3.0	5.0
+chr1	92895	1.0	0.0	1.0
+chr1	92896	2.0	0.0	2.0
+chr1	92898	0.0	1.0	1.0
+chr1	92899	2.0	0.0	2.0
+chr1	92904	3.0	1.0	4.0
+chr1	92905	0.0	3.0	3.0
+chr1	92907	0.0	1.0	1.0
+chr1	92908	1.0	2.0	3.0
+chr1	92909	0.0	2.0	2.0
+chr1	92912	1.0	0.0	1.0
+chr1	92917	1.0	0.0	1.0
+chr1	92922	1.0	5.0	6.0
+chr1	92923	3.0	1.0	4.0
+chr1	92926	1.0	1.0	2.0
+chr1	92928	0.0	2.0	2.0
+chr1	92929	0.0	1.0	1.0
+chr1	92934	0.0	1.0	1.0
+chr1	92935	1.0	0.0	1.0
+chr1	92939	1.0	0.0	1.0
+chr1	92942	1.0	0.0	1.0
+chr1	92958	0.0	1.0	1.0
+chr1	93037	0.0	2.0	2.0
+chr1	93056	2.0	0.0	2.0
+chr1	93057	0.0	1.0	1.0
+chr1	93069	0.0	1.0	1.0
+chr1	93070	1.0	0.0	1.0
+chr1	93075	1.0	0.0	1.0
+chr1	93076	1.0	0.0	1.0
+chr1	93077	1.0	0.0	1.0
+chr1	93081	0.0	3.0	3.0
+chr1	93082	0.0	2.0	2.0
+chr1	93096	0.0	1.0	1.0
+chr1	93108	0.0	1.0	1.0
+chr1	93110	0.0	1.0	1.0
+chr1	93121	1.0	0.0	1.0
+chr1	93123	1.0	0.0	1.0
+chr1	93130	1.0	0.0	1.0
+chr1	93220	0.0	1.0	1.0
+chr1	93239	0.0	1.0	1.0
+chr1	93241	0.0	1.0	1.0
+chr1	93249	1.0	0.0	1.0
+chr1	93251	0.0	1.0	1.0
+chr1	93270	0.0	1.0	1.0
+chr1	93370	1.0	0.0	1.0
+chr1	93390	1.0	0.0	1.0
+chr1	93554	0.0	1.0	1.0
+chr1	93559	2.0	0.0	2.0
+chr1	93571	1.0	0.0	1.0
+chr1	93575	1.0	0.0	1.0
+chr1	93595	1.0	0.0	1.0
+chr1	93683	1.0	0.0	1.0
+chr1	93743	0.0	1.0	1.0
+chr1	93752	0.0	1.0	1.0
+chr1	93919	0.0	1.0	1.0
+chr1	94167	2.0	0.0	2.0
+chr1	94248	0.0	1.0	1.0
+chr1	94249	0.0	1.0	1.0
+chr1	94278	0.0	1.0	1.0
+chr1	94354	1.0	0.0	1.0
+chr1	94448	0.0	1.0	1.0
+chr1	94626	0.0	1.0	1.0
+chr1	94627	1.0	0.0	1.0
+chr1	94628	3.0	0.0	3.0
+chr1	94654	1.0	0.0	1.0
+chr1	94656	1.0	0.0	1.0
+chr1	94660	1.0	1.0	2.0
+chr1	94661	1.0	0.0	1.0
+chr1	94665	0.0	2.0	2.0
+chr1	94671	0.0	2.0	2.0
+chr1	94672	2.0	0.0	2.0
+chr1	94673	0.0	1.0	1.0
+chr1	94681	0.0	1.0	1.0
+chr1	94689	1.0	0.0	1.0
+chr1	94692	1.0	0.0	1.0
+chr1	94694	1.0	0.0	1.0
+chr1	94697	0.0	1.0	1.0
+chr1	94700	0.0	2.0	2.0
+chr1	94706	0.0	1.0	1.0
+chr1	94720	0.0	2.0	2.0
+chr1	94926	0.0	1.0	1.0
+chr1	94955	1.0	0.0	1.0
+chr1	94956	1.0	0.0	1.0
+chr1	94980	1.0	0.0	1.0
+chr1	94986	0.0	1.0	1.0
+chr1	94987	0.0	1.0	1.0
+chr1	95008	1.0	0.0	1.0
+chr1	95075	0.0	1.0	1.0
+chr1	95078	2.0	0.0	2.0
+chr1	95101	1.0	0.0	1.0
+chr1	95105	0.0	1.0	1.0
+chr1	95177	0.0	1.0	1.0
+chr1	95184	0.0	1.0	1.0
+chr1	95204	1.0	0.0	1.0
+chr1	95321	0.0	1.0	1.0
+chr1	95333	0.0	1.0	1.0
+chr1	95352	0.0	1.0	1.0
+chr1	95380	0.0	1.0	1.0
+chr1	95396	0.0	1.0	1.0
+chr1	95783	0.0	2.0	2.0
+chr1	96102	0.0	2.0	2.0
+chr1	96256	0.0	2.0	2.0
+chr1	96821	2.0	0.0	2.0
+chr1	97008	1.0	0.0	1.0
+chr1	97150	1.0	0.0	1.0
+chr1	97335	0.0	1.0	1.0
+chr1	97389	2.0	0.0	2.0
+chr1	97703	1.0	0.0	1.0
+chr1	97811	0.0	1.0	1.0
+chr1	98260	0.0	1.0	1.0
+chr1	98927	0.0	1.0	1.0
+chr1	98941	1.0	0.0	1.0
+chr1	99102	1.0	0.0	1.0
+chr1	99193	0.0	1.0	1.0
+chr1	99394	0.0	1.0	1.0
+chr1	99413	1.0	0.0	1.0
+chr1	99414	1.0	0.0	1.0
+chr1	99566	1.0	0.0	1.0
+chr1	99567	0.0	1.0	1.0
+chr1	99568	0.0	1.0	1.0
+chr1	99569	1.0	0.0	1.0
+chr1	99574	1.0	1.0	2.0
+chr1	99578	1.0	1.0	2.0
+chr1	99579	0.0	1.0	1.0
+chr1	99595	0.0	1.0	1.0
+chr1	99597	0.0	1.0	1.0
+chr1	99602	1.0	0.0	1.0
+chr1	99622	2.0	0.0	2.0
+chr1	99682	1.0	0.0	1.0
+chr1	99709	1.0	0.0	1.0
+chr1	99710	1.0	0.0	1.0
+chr1	99711	1.0	0.0	1.0
+chr1	99716	9.0	0.0	9.0
+chr1	99719	0.0	1.0	1.0
+chr1	99720	0.0	3.0	3.0
+chr1	99722	1.0	0.0	1.0
+chr1	99728	1.0	0.0	1.0
+chr1	99732	0.0	1.0	1.0
+chr1	99733	3.0	4.0	7.0
+chr1	99734	0.0	1.0	1.0
+chr1	99736	0.0	1.0	1.0
+chr1	99738	5.0	3.0	8.0
+chr1	99741	1.0	9.0	10.0
+chr1	99743	0.0	3.0	3.0
+chr1	99745	1.0	0.0	1.0
+chr1	99747	2.0	0.0	2.0
+chr1	99767	0.0	1.0	1.0
+chr1	99771	1.0	0.0	1.0
+chr1	100180	0.0	1.0	1.0
+chr1	100216	0.0	1.0	1.0
+chr1	100303	1.0	0.0	1.0
+chr1	100770	1.0	0.0	1.0
+chr1	100783	0.0	1.0	1.0
+chr1	100816	2.0	0.0	2.0
+chr1	100822	1.0	0.0	1.0
+chr1	100828	0.0	1.0	1.0
+chr1	100902	1.0	0.0	1.0
+chr1	100953	1.0	0.0	1.0
+chr1	100969	1.0	0.0	1.0
+chr1	100977	0.0	1.0	1.0
+chr1	100978	0.0	2.0	2.0
+chr1	100979	0.0	1.0	1.0
+chr1	100981	1.0	0.0	1.0
+chr1	101116	0.0	1.0	1.0
+chr1	101121	0.0	1.0	1.0
+chr1	101123	0.0	2.0	2.0
+chr1	101125	0.0	2.0	2.0
+chr1	101126	1.0	0.0	1.0
+chr1	101127	0.0	1.0	1.0
+chr1	101128	3.0	0.0	3.0
+chr1	101132	1.0	1.0	2.0
+chr1	101133	2.0	0.0	2.0
+chr1	101134	0.0	2.0	2.0
+chr1	101137	0.0	1.0	1.0
+chr1	101143	1.0	0.0	1.0
+chr1	101145	1.0	0.0	1.0
+chr1	101146	1.0	0.0	1.0
+chr1	101147	0.0	2.0	2.0
+chr1	101159	0.0	1.0	1.0
+chr1	101162	1.0	0.0	1.0
+chr1	101166	1.0	0.0	1.0
+chr1	101170	1.0	0.0	1.0
+chr1	101180	1.0	0.0	1.0
+chr1	101182	1.0	0.0	1.0
+chr1	101231	1.0	0.0	1.0
+chr1	101610	2.0	0.0	2.0
+chr1	101642	0.0	1.0	1.0
+chr1	101805	0.0	1.0	1.0
+chr1	101999	1.0	0.0	1.0
+chr1	102018	0.0	1.0	1.0
+chr1	102343	1.0	0.0	1.0
+chr1	102612	0.0	1.0	1.0
+chr1	103010	1.0	0.0	1.0
+chr1	103523	1.0	0.0	1.0
+chr1	103568	0.0	1.0	1.0
+chr1	103623	1.0	0.0	1.0
+chr1	103641	0.0	1.0	1.0
+chr1	103856	0.0	3.0	3.0
+chr1	104322	0.0	1.0	1.0
+chr1	104323	1.0	0.0	1.0
+chr1	105112	1.0	0.0	1.0
+chr1	105280	1.0	0.0	1.0
+chr1	105289	3.0	0.0	3.0
+chr1	105426	1.0	0.0	1.0
+chr1	105563	0.0	1.0	1.0
+chr1	105609	0.0	4.0	4.0
+chr1	105613	1.0	0.0	1.0
+chr1	105737	0.0	1.0	1.0
+chr1	105742	1.0	0.0	1.0
+chr1	105746	0.0	1.0	1.0
+chr1	105749	1.0	0.0	1.0
+chr1	105753	0.0	3.0	3.0
+chr1	105763	1.0	0.0	1.0
+chr1	105773	3.0	0.0	3.0
+chr1	105776	0.0	1.0	1.0
+chr1	105877	0.0	1.0	1.0
+chr1	105879	0.0	2.0	2.0
+chr1	105901	1.0	0.0	1.0
+chr1	105902	1.0	0.0	1.0
+chr1	105905	0.0	1.0	1.0
+chr1	105908	2.0	0.0	2.0
+chr1	105909	1.0	0.0	1.0
+chr1	105914	0.0	1.0	1.0
+chr1	105917	0.0	1.0	1.0
+chr1	105918	0.0	2.0	2.0
+chr1	105919	1.0	0.0	1.0
+chr1	105921	0.0	2.0	2.0
+chr1	105922	4.0	0.0	4.0
+chr1	105923	5.0	2.0	7.0
+chr1	105924	5.0	0.0	5.0
+chr1	105925	1.0	5.0	6.0
+chr1	105927	3.0	0.0	3.0
+chr1	105928	1.0	3.0	4.0
+chr1	105930	1.0	0.0	1.0
+chr1	105931	0.0	2.0	2.0
+chr1	105933	0.0	5.0	5.0
+chr1	105934	0.0	3.0	3.0
+chr1	105937	1.0	0.0	1.0
+chr1	105938	1.0	0.0	1.0
+chr1	105940	0.0	2.0	2.0
+chr1	105941	3.0	0.0	3.0
+chr1	105942	6.0	0.0	6.0
+chr1	105943	1.0	0.0	1.0
+chr1	105945	3.0	0.0	3.0
+chr1	105966	0.0	1.0	1.0
+chr1	105976	2.0	0.0	2.0
+chr1	106004	1.0	0.0	1.0
+chr1	106173	0.0	1.0	1.0
+chr1	106195	0.0	1.0	1.0
+chr1	106409	1.0	0.0	1.0
+chr1	107526	0.0	1.0	1.0
+chr1	107602	1.0	0.0	1.0
+chr1	107839	1.0	0.0	1.0
+chr1	108251	1.0	0.0	1.0
+chr1	108254	2.0	0.0	2.0
+chr1	108400	0.0	2.0	2.0
+chr1	108433	1.0	0.0	1.0
+chr1	108441	0.0	1.0	1.0
+chr1	108466	0.0	1.0	1.0
+chr1	108563	1.0	0.0	1.0
+chr1	108575	0.0	2.0	2.0
+chr1	108577	1.0	0.0	1.0
+chr1	108589	1.0	0.0	1.0
+chr1	108593	2.0	0.0	2.0
+chr1	108594	1.0	0.0	1.0
+chr1	108595	4.0	0.0	4.0
+chr1	108598	1.0	1.0	2.0
+chr1	108599	0.0	1.0	1.0
+chr1	108600	0.0	1.0	1.0
+chr1	108601	4.0	0.0	4.0
+chr1	108602	0.0	3.0	3.0
+chr1	108603	1.0	2.0	3.0
+chr1	108604	0.0	2.0	2.0
+chr1	108608	4.0	0.0	4.0
+chr1	108610	1.0	0.0	1.0
+chr1	108613	1.0	0.0	1.0
+chr1	108619	1.0	0.0	1.0
+chr1	108621	0.0	1.0	1.0
+chr1	108624	1.0	0.0	1.0
+chr1	108629	2.0	0.0	2.0
+chr1	108640	0.0	1.0	1.0
+chr1	108644	0.0	1.0	1.0
+chr1	108647	0.0	1.0	1.0
+chr1	108651	0.0	1.0	1.0
+chr1	108947	0.0	1.0	1.0
+chr1	109285	0.0	1.0	1.0
+chr1	109291	1.0	0.0	1.0
+chr1	109745	0.0	1.0	1.0
+chr1	109757	0.0	1.0	1.0
+chr1	109794	1.0	0.0	1.0
+chr1	109810	0.0	1.0	1.0
+chr1	109949	1.0	0.0	1.0
+chr1	110062	1.0	0.0	1.0
+chr1	110075	0.0	1.0	1.0
+chr1	110081	1.0	0.0	1.0
+chr1	110086	1.0	0.0	1.0
+chr1	110234	0.0	1.0	1.0
+chr1	110244	0.0	1.0	1.0
+chr1	110260	0.0	1.0	1.0
+chr1	110279	0.0	1.0	1.0
+chr1	110316	1.0	0.0	1.0
+chr1	110349	0.0	1.0	1.0
+chr1	110357	0.0	1.0	1.0
+chr1	110366	0.0	1.0	1.0
+chr1	110372	4.0	1.0	5.0
+chr1	110378	0.0	1.0	1.0
+chr1	110384	1.0	0.0	1.0
+chr1	110386	5.0	1.0	6.0
+chr1	110387	0.0	1.0	1.0
+chr1	110388	1.0	0.0	1.0
+chr1	110392	3.0	2.0	5.0
+chr1	110394	0.0	1.0	1.0
+chr1	110395	4.0	0.0	4.0
+chr1	110396	0.0	1.0	1.0
+chr1	110398	2.0	0.0	2.0
+chr1	110401	4.0	0.0	4.0
+chr1	110406	2.0	0.0	2.0
+chr1	110407	0.0	9.0	9.0
+chr1	110416	1.0	0.0	1.0
+chr1	110417	3.0	0.0	3.0
+chr1	110418	0.0	2.0	2.0
+chr1	110419	0.0	1.0	1.0
+chr1	110426	0.0	2.0	2.0
+chr1	110427	1.0	1.0	2.0
+chr1	110428	3.0	0.0	3.0
+chr1	110434	1.0	0.0	1.0
+chr1	110461	4.0	0.0	4.0
+chr1	110822	0.0	1.0	1.0
+chr1	111223	0.0	1.0	1.0
+chr1	111310	0.0	1.0	1.0
+chr1	111325	0.0	1.0	1.0
+chr1	111439	1.0	0.0	1.0
+chr1	111618	0.0	1.0	1.0
+chr1	111760	0.0	2.0	2.0
+chr1	112053	1.0	0.0	1.0
+chr1	112267	1.0	0.0	1.0
+chr1	112527	1.0	0.0	1.0
+chr1	112548	0.0	1.0	1.0
+chr1	112878	1.0	0.0	1.0
+chr1	113004	0.0	1.0	1.0
+chr1	113014	1.0	0.0	1.0
+chr1	113059	1.0	0.0	1.0
+chr1	113072	1.0	0.0	1.0
+chr1	113186	1.0	1.0	2.0
+chr1	113201	1.0	0.0	1.0
+chr1	113229	0.0	2.0	2.0
+chr1	113312	1.0	0.0	1.0
+chr1	113327	0.0	1.0	1.0
+chr1	113334	0.0	1.0	1.0
+chr1	113336	0.0	1.0	1.0
+chr1	113338	2.0	0.0	2.0
+chr1	113339	1.0	0.0	1.0
+chr1	113340	0.0	1.0	1.0
+chr1	113341	0.0	2.0	2.0
+chr1	113342	1.0	0.0	1.0
+chr1	113343	1.0	0.0	1.0
+chr1	113344	2.0	0.0	2.0
+chr1	113346	0.0	1.0	1.0
+chr1	113347	1.0	0.0	1.0
+chr1	113348	2.0	0.0	2.0
+chr1	113351	8.0	0.0	8.0
+chr1	113353	0.0	3.0	3.0
+chr1	113354	0.0	3.0	3.0
+chr1	113355	1.0	0.0	1.0
+chr1	113359	0.0	2.0	2.0
+chr1	113360	3.0	1.0	4.0
+chr1	113363	1.0	1.0	2.0
+chr1	113364	0.0	2.0	2.0
+chr1	113368	0.0	3.0	3.0
+chr1	113369	0.0	1.0	1.0
+chr1	113373	0.0	2.0	2.0
+chr1	113385	0.0	1.0	1.0
+chr1	113388	0.0	1.0	1.0
+chr1	113392	0.0	1.0	1.0
+chr1	113595	0.0	1.0	1.0
+chr1	113601	0.0	1.0	1.0
+chr1	113605	1.0	0.0	1.0
+chr1	113606	0.0	1.0	1.0
+chr1	113610	2.0	0.0	2.0
+chr1	113615	1.0	2.0	3.0
+chr1	113620	0.0	1.0	1.0
+chr1	113621	1.0	0.0	1.0
+chr1	113626	0.0	2.0	2.0
+chr1	113627	0.0	1.0	1.0
+chr1	113628	0.0	11.0	11.0
+chr1	113634	1.0	0.0	1.0
+chr1	113635	2.0	0.0	2.0
+chr1	113640	1.0	0.0	1.0
+chr1	113646	0.0	1.0	1.0
+chr1	113655	1.0	0.0	1.0
+chr1	113662	1.0	0.0	1.0
+chr1	113671	1.0	0.0	1.0
+chr1	113677	1.0	0.0	1.0
+chr1	113752	2.0	0.0	2.0
+chr1	113793	0.0	2.0	2.0
+chr1	113799	1.0	0.0	1.0
+chr1	113800	1.0	0.0	1.0
+chr1	113922	1.0	0.0	1.0
+chr1	113952	1.0	0.0	1.0
+chr1	114094	0.0	1.0	1.0
+chr1	114097	0.0	1.0	1.0
+chr1	114109	1.0	0.0	1.0
+chr1	114167	2.0	0.0	2.0
+chr1	114278	0.0	1.0	1.0
+chr1	114288	0.0	1.0	1.0
+chr1	114385	0.0	1.0	1.0
+chr1	114393	1.0	0.0	1.0
+chr1	114396	0.0	1.0	1.0
+chr1	114416	1.0	0.0	1.0
+chr1	114421	0.0	5.0	5.0
+chr1	114440	1.0	0.0	1.0
+chr1	114521	0.0	1.0	1.0
+chr1	114529	0.0	1.0	1.0
+chr1	114530	0.0	1.0	1.0
+chr1	114538	0.0	1.0	1.0
+chr1	114540	0.0	1.0	1.0
+chr1	114542	1.0	0.0	1.0
+chr1	114550	2.0	0.0	2.0
+chr1	114553	1.0	0.0	1.0
+chr1	114564	1.0	0.0	1.0
+chr1	114565	0.0	1.0	1.0
+chr1	114567	1.0	0.0	1.0
+chr1	114568	1.0	0.0	1.0
+chr1	114569	2.0	0.0	2.0
+chr1	114570	0.0	1.0	1.0
+chr1	114572	2.0	0.0	2.0
+chr1	114573	1.0	0.0	1.0
+chr1	114575	1.0	3.0	4.0
+chr1	114577	0.0	2.0	2.0
+chr1	114579	1.0	0.0	1.0
+chr1	114581	1.0	0.0	1.0
+chr1	114582	3.0	0.0	3.0
+chr1	114585	0.0	5.0	5.0
+chr1	114587	0.0	2.0	2.0
+chr1	114593	0.0	6.0	6.0
+chr1	114594	0.0	2.0	2.0
+chr1	114605	0.0	1.0	1.0
+chr1	114619	1.0	0.0	1.0
+chr1	114706	0.0	1.0	1.0
+chr1	114780	1.0	0.0	1.0
+chr1	114798	0.0	1.0	1.0
+chr1	114799	0.0	1.0	1.0
+chr1	114807	0.0	1.0	1.0
+chr1	114808	0.0	1.0	1.0
+chr1	114827	0.0	1.0	1.0
+chr1	114830	2.0	0.0	2.0
+chr1	114832	2.0	0.0	2.0
+chr1	114834	0.0	3.0	3.0
+chr1	114838	3.0	0.0	3.0
+chr1	114840	0.0	1.0	1.0
+chr1	114853	5.0	0.0	5.0
+chr1	114854	3.0	0.0	3.0
+chr1	114855	0.0	1.0	1.0
+chr1	114857	1.0	0.0	1.0
+chr1	114858	2.0	1.0	3.0
+chr1	114860	2.0	4.0	6.0
+chr1	114861	0.0	4.0	4.0
+chr1	114864	1.0	2.0	3.0
+chr1	114865	3.0	2.0	5.0
+chr1	114866	0.0	1.0	1.0
+chr1	114874	0.0	1.0	1.0
+chr1	114875	0.0	2.0	2.0
+chr1	114877	1.0	0.0	1.0
+chr1	114878	0.0	1.0	1.0
+chr1	115000	0.0	1.0	1.0
+chr1	115012	1.0	0.0	1.0
+chr1	115013	1.0	0.0	1.0
+chr1	115016	2.0	0.0	2.0
+chr1	115018	1.0	0.0	1.0
+chr1	115019	0.0	1.0	1.0
+chr1	115021	1.0	0.0	1.0
+chr1	115028	2.0	3.0	5.0
+chr1	115029	0.0	1.0	1.0
+chr1	115047	0.0	1.0	1.0
+chr1	115048	0.0	2.0	2.0
+chr1	115056	0.0	1.0	1.0
+chr1	115071	1.0	0.0	1.0
+chr1	115169	0.0	1.0	1.0
+chr1	115176	1.0	0.0	1.0
+chr1	115179	1.0	0.0	1.0
+chr1	115218	0.0	1.0	1.0
+chr1	115226	1.0	0.0	1.0
+chr1	115339	0.0	1.0	1.0
+chr1	115359	0.0	1.0	1.0
+chr1	115366	0.0	1.0	1.0
+chr1	115382	1.0	0.0	1.0
+chr1	115535	1.0	0.0	1.0
+chr1	115539	1.0	0.0	1.0
+chr1	115922	0.0	1.0	1.0
+chr1	116062	1.0	0.0	1.0
+chr1	116303	1.0	0.0	1.0
+chr1	116385	1.0	0.0	1.0
+chr1	116433	0.0	1.0	1.0
+chr1	116963	0.0	1.0	1.0
+chr1	117582	1.0	0.0	1.0
+chr1	118109	0.0	1.0	1.0
+chr1	118536	1.0	0.0	1.0
+chr1	118587	1.0	0.0	1.0
+chr1	118651	0.0	1.0	1.0
+chr1	118682	0.0	1.0	1.0
+chr1	118684	3.0	0.0	3.0
+chr1	118699	1.0	1.0	2.0
+chr1	118702	0.0	2.0	2.0
+chr1	118716	0.0	1.0	1.0
+chr1	118739	0.0	1.0	1.0
+chr1	118745	1.0	0.0	1.0
+chr1	118890	0.0	1.0	1.0
+chr1	118902	0.0	1.0	1.0
+chr1	118942	0.0	1.0	1.0
+chr1	119085	1.0	0.0	1.0
+chr1	119248	1.0	0.0	1.0
+chr1	119418	0.0	1.0	1.0
+chr1	119421	1.0	0.0	1.0
+chr1	119449	0.0	1.0	1.0
+chr1	119450	0.0	1.0	1.0
+chr1	119582	1.0	0.0	1.0
+chr1	119589	0.0	2.0	2.0
+chr1	119843	0.0	1.0	1.0
+chr1	119878	0.0	1.0	1.0
+chr1	119893	2.0	0.0	2.0
+chr1	119898	0.0	1.0	1.0
+chr1	119903	0.0	9.0	9.0
+chr1	119904	0.0	2.0	2.0
+chr1	119907	1.0	0.0	1.0
+chr1	119908	1.0	0.0	1.0
+chr1	119911	0.0	1.0	1.0
+chr1	119912	4.0	0.0	4.0
+chr1	119913	7.0	0.0	7.0
+chr1	119914	0.0	1.0	1.0
+chr1	119916	0.0	6.0	6.0
+chr1	119917	0.0	1.0	1.0
+chr1	119918	1.0	0.0	1.0
+chr1	119920	1.0	0.0	1.0
+chr1	119925	0.0	2.0	2.0
+chr1	119928	0.0	1.0	1.0
+chr1	119932	2.0	0.0	2.0
+chr1	119933	1.0	0.0	1.0
+chr1	119938	0.0	1.0	1.0
+chr1	119943	1.0	0.0	1.0
+chr1	119948	2.0	0.0	2.0
+chr1	120059	0.0	1.0	1.0
+chr1	120067	1.0	0.0	1.0
+chr1	120078	1.0	0.0	1.0
+chr1	120108	1.0	0.0	1.0
+chr1	120130	0.0	1.0	1.0
+chr1	120259	0.0	1.0	1.0
+chr1	120285	1.0	0.0	1.0
+chr1	120300	2.0	0.0	2.0
+chr1	120367	1.0	0.0	1.0
+chr1	120619	0.0	2.0	2.0
+chr1	120900	1.0	0.0	1.0
+chr1	121065	0.0	1.0	1.0
+chr1	121163	1.0	0.0	1.0
+chr1	122242	0.0	1.0	1.0
+chr1	122403	1.0	0.0	1.0
+chr1	122416	0.0	1.0	1.0
+chr1	122434	1.0	0.0	1.0
+chr1	122530	0.0	1.0	1.0
+chr1	123049	1.0	0.0	1.0
+chr1	123100	0.0	1.0	1.0
+chr1	123587	0.0	1.0	1.0
+chr1	123653	1.0	0.0	1.0
+chr1	124814	1.0	0.0	1.0
+chr1	124824	0.0	2.0	2.0
+chr1	124830	1.0	0.0	1.0
+chr1	124831	2.0	0.0	2.0
+chr1	124840	2.0	0.0	2.0
+chr1	124843	2.0	0.0	2.0
+chr1	124844	2.0	0.0	2.0
+chr1	124848	1.0	0.0	1.0
+chr1	124853	0.0	1.0	1.0
+chr1	124854	0.0	9.0	9.0
+chr1	124857	0.0	2.0	2.0
+chr1	124859	1.0	0.0	1.0
+chr1	124860	1.0	3.0	4.0
+chr1	124861	0.0	2.0	2.0
+chr1	124863	0.0	2.0	2.0
+chr1	124867	1.0	0.0	1.0
+chr1	124869	1.0	1.0	2.0
+chr1	124954	1.0	0.0	1.0
+chr1	124992	1.0	0.0	1.0
+chr1	125009	0.0	2.0	2.0
+chr1	125428	1.0	0.0	1.0
+chr1	125519	1.0	0.0	1.0
+chr1	125797	1.0	0.0	1.0
+chr1	126209	0.0	1.0	1.0
+chr1	126354	0.0	1.0	1.0
+chr1	126608	1.0	0.0	1.0
+chr1	126949	0.0	1.0	1.0
+chr1	126984	0.0	1.0	1.0
+chr1	127000	1.0	0.0	1.0
+chr1	127008	1.0	0.0	1.0
+chr1	127027	0.0	1.0	1.0
+chr1	127063	1.0	0.0	1.0
+chr1	127104	0.0	1.0	1.0
+chr1	127156	1.0	0.0	1.0
+chr1	127165	1.0	0.0	1.0
+chr1	127172	0.0	1.0	1.0
+chr1	127177	0.0	1.0	1.0
+chr1	127228	0.0	1.0	1.0
+chr1	127292	2.0	0.0	2.0
+chr1	127327	0.0	1.0	1.0
+chr1	127341	1.0	0.0	1.0
+chr1	127352	1.0	0.0	1.0
+chr1	127353	0.0	1.0	1.0
+chr1	127354	0.0	1.0	1.0
+chr1	127366	0.0	1.0	1.0
+chr1	127372	0.0	2.0	2.0
+chr1	127379	0.0	1.0	1.0
+chr1	127389	1.0	0.0	1.0
+chr1	127432	1.0	0.0	1.0
+chr1	127486	0.0	1.0	1.0
+chr1	127510	2.0	0.0	2.0
+chr1	127518	1.0	0.0	1.0
+chr1	127525	1.0	0.0	1.0
+chr1	127527	0.0	1.0	1.0
+chr1	127579	0.0	1.0	1.0
+chr1	127665	0.0	1.0	1.0
+chr1	127677	0.0	1.0	1.0
+chr1	127680	1.0	4.0	5.0
+chr1	127691	1.0	0.0	1.0
+chr1	127698	1.0	0.0	1.0
+chr1	127702	0.0	1.0	1.0
+chr1	127716	0.0	1.0	1.0
+chr1	127719	0.0	1.0	1.0
+chr1	127732	0.0	1.0	1.0
+chr1	127740	0.0	1.0	1.0
+chr1	127839	0.0	1.0	1.0
+chr1	127849	1.0	0.0	1.0
+chr1	127856	1.0	0.0	1.0
+chr1	127858	0.0	1.0	1.0
+chr1	127859	0.0	3.0	3.0
+chr1	127879	1.0	0.0	1.0
+chr1	127884	1.0	0.0	1.0
+chr1	127886	0.0	3.0	3.0
+chr1	127891	0.0	1.0	1.0
+chr1	127895	0.0	1.0	1.0
+chr1	127897	1.0	0.0	1.0
+chr1	127898	3.0	0.0	3.0
+chr1	127906	2.0	0.0	2.0
+chr1	127907	1.0	0.0	1.0
+chr1	127909	0.0	1.0	1.0
+chr1	127921	0.0	1.0	1.0
+chr1	127930	1.0	0.0	1.0
+chr1	127957	1.0	0.0	1.0
+chr1	128023	0.0	1.0	1.0
+chr1	128030	0.0	1.0	1.0
+chr1	128061	1.0	0.0	1.0
+chr1	128071	1.0	0.0	1.0
+chr1	128333	1.0	0.0	1.0
+chr1	128359	1.0	0.0	1.0
+chr1	128376	1.0	0.0	1.0
+chr1	128392	1.0	0.0	1.0
+chr1	128404	0.0	1.0	1.0
+chr1	128664	0.0	1.0	1.0
+chr1	128675	0.0	2.0	2.0
+chr1	128829	1.0	0.0	1.0
+chr1	128830	1.0	0.0	1.0
+chr1	128832	1.0	0.0	1.0
+chr1	128841	0.0	1.0	1.0
+chr1	128968	0.0	2.0	2.0
+chr1	128987	0.0	1.0	1.0
+chr1	128988	1.0	0.0	1.0
+chr1	128989	1.0	0.0	1.0
+chr1	128990	2.0	0.0	2.0
+chr1	128991	2.0	3.0	5.0
+chr1	128993	0.0	2.0	2.0
+chr1	128995	3.0	0.0	3.0
+chr1	128997	1.0	0.0	1.0
+chr1	128998	1.0	4.0	5.0
+chr1	129005	0.0	1.0	1.0
+chr1	129006	0.0	1.0	1.0
+chr1	129007	0.0	1.0	1.0
+chr1	129012	0.0	1.0	1.0
+chr1	129013	0.0	2.0	2.0
+chr1	129015	1.0	0.0	1.0
+chr1	129016	0.0	1.0	1.0
+chr1	129023	2.0	0.0	2.0
+chr1	129026	2.0	0.0	2.0
+chr1	129029	0.0	1.0	1.0
+chr1	129041	1.0	0.0	1.0
+chr1	129061	0.0	3.0	3.0
+chr1	129240	0.0	1.0	1.0
+chr1	129247	1.0	0.0	1.0
+chr1	129250	1.0	0.0	1.0
+chr1	129270	0.0	1.0	1.0
+chr1	129276	3.0	2.0	5.0
+chr1	129277	5.0	1.0	6.0
+chr1	129279	6.0	0.0	6.0
+chr1	129281	1.0	0.0	1.0
+chr1	129285	1.0	6.0	7.0
+chr1	129286	1.0	1.0	2.0
+chr1	129288	0.0	3.0	3.0
+chr1	129291	0.0	1.0	1.0
+chr1	129292	2.0	0.0	2.0
+chr1	129294	2.0	0.0	2.0
+chr1	129295	3.0	7.0	10.0
+chr1	129296	0.0	1.0	1.0
+chr1	129297	0.0	2.0	2.0
+chr1	129298	5.0	0.0	5.0
+chr1	129300	0.0	1.0	1.0
+chr1	129303	1.0	0.0	1.0
+chr1	129308	0.0	1.0	1.0
+chr1	129311	1.0	0.0	1.0
+chr1	129312	0.0	2.0	2.0
+chr1	129343	1.0	0.0	1.0
+chr1	129447	0.0	2.0	2.0
+chr1	129451	0.0	1.0	1.0
+chr1	129456	0.0	1.0	1.0
+chr1	129458	0.0	1.0	1.0
+chr1	129459	0.0	1.0	1.0
+chr1	129461	1.0	0.0	1.0
+chr1	129462	1.0	0.0	1.0
+chr1	129464	1.0	0.0	1.0
+chr1	129470	2.0	0.0	2.0
+chr1	129471	1.0	0.0	1.0
+chr1	129472	0.0	1.0	1.0
+chr1	129478	1.0	0.0	1.0
+chr1	129575	0.0	1.0	1.0
+chr1	129585	0.0	1.0	1.0
+chr1	129616	1.0	0.0	1.0
+chr1	129639	0.0	1.0	1.0
+chr1	129658	0.0	1.0	1.0
+chr1	129808	1.0	0.0	1.0
+chr1	129931	0.0	1.0	1.0
+chr1	129980	0.0	1.0	1.0
+chr1	130094	1.0	0.0	1.0
+chr1	130103	0.0	1.0	1.0
+chr1	130454	0.0	1.0	1.0
+chr1	130720	0.0	1.0	1.0
+chr1	130749	0.0	1.0	1.0
+chr1	130754	1.0	0.0	1.0
+chr1	130768	0.0	2.0	2.0
+chr1	130781	0.0	2.0	2.0
+chr1	130782	0.0	1.0	1.0
+chr1	130841	0.0	1.0	1.0
+chr1	131009	1.0	0.0	1.0
+chr1	131095	0.0	1.0	1.0
+chr1	131104	1.0	0.0	1.0
+chr1	131137	1.0	0.0	1.0
+chr1	131948	0.0	1.0	1.0
+chr1	131972	0.0	1.0	1.0
+chr1	132002	1.0	0.0	1.0
+chr1	132209	0.0	2.0	2.0
+chr1	132216	0.0	1.0	1.0
+chr1	132218	2.0	0.0	2.0
+chr1	132224	2.0	0.0	2.0
+chr1	132225	1.0	0.0	1.0
+chr1	132226	6.0	0.0	6.0
+chr1	132227	0.0	5.0	5.0
+chr1	132231	0.0	2.0	2.0
+chr1	132232	5.0	0.0	5.0
+chr1	132233	5.0	2.0	7.0
+chr1	132234	0.0	1.0	1.0
+chr1	132235	0.0	1.0	1.0
+chr1	132236	1.0	2.0	3.0
+chr1	132237	4.0	0.0	4.0
+chr1	132238	0.0	3.0	3.0
+chr1	132241	0.0	1.0	1.0
+chr1	132242	0.0	1.0	1.0
+chr1	132243	2.0	0.0	2.0
+chr1	132244	5.0	3.0	8.0
+chr1	132247	0.0	3.0	3.0
+chr1	132249	0.0	1.0	1.0
+chr1	132250	0.0	2.0	2.0
+chr1	132251	0.0	3.0	3.0
+chr1	132253	1.0	0.0	1.0
+chr1	132255	0.0	1.0	1.0
+chr1	132256	0.0	3.0	3.0
+chr1	132263	1.0	0.0	1.0
+chr1	132269	0.0	2.0	2.0
+chr1	132381	0.0	1.0	1.0
+chr1	132382	1.0	0.0	1.0
+chr1	132387	1.0	0.0	1.0
+chr1	132394	0.0	2.0	2.0
+chr1	132403	3.0	0.0	3.0
+chr1	132404	1.0	0.0	1.0
+chr1	132406	0.0	1.0	1.0
+chr1	132410	0.0	1.0	1.0
+chr1	132520	0.0	1.0	1.0
+chr1	132543	1.0	0.0	1.0
+chr1	132559	1.0	0.0	1.0
+chr1	132566	3.0	0.0	3.0
+chr1	132568	0.0	1.0	1.0
+chr1	132577	0.0	1.0	1.0
+chr1	132662	2.0	0.0	2.0
+chr1	132689	0.0	1.0	1.0
+chr1	132724	0.0	1.0	1.0
+chr1	132894	1.0	0.0	1.0
+chr1	132914	1.0	0.0	1.0
+chr1	133091	0.0	2.0	2.0
+chr1	133228	1.0	0.0	1.0
+chr1	133589	1.0	0.0	1.0
+chr1	134220	2.0	0.0	2.0
+chr1	134518	0.0	1.0	1.0
+chr1	134585	1.0	0.0	1.0
+chr1	134656	1.0	0.0	1.0
+chr1	134669	0.0	1.0	1.0
+chr1	134823	0.0	1.0	1.0
+chr1	134831	0.0	1.0	1.0
+chr1	134832	0.0	1.0	1.0
+chr1	134860	0.0	1.0	1.0
+chr1	135319	3.0	0.0	3.0
+chr1	135323	0.0	1.0	1.0
+chr1	135324	1.0	0.0	1.0
+chr1	135337	1.0	0.0	1.0
+chr1	135365	1.0	0.0	1.0
+chr1	135477	1.0	0.0	1.0
+chr1	135485	0.0	2.0	2.0
+chr1	135523	1.0	0.0	1.0
+chr1	135581	0.0	1.0	1.0
+chr1	135621	0.0	2.0	2.0
+chr1	135642	5.0	2.0	7.0
+chr1	135646	0.0	1.0	1.0
+chr1	135648	1.0	0.0	1.0
+chr1	135650	0.0	2.0	2.0
+chr1	135653	0.0	2.0	2.0
+chr1	135655	0.0	1.0	1.0
+chr1	135657	0.0	2.0	2.0
+chr1	135660	0.0	2.0	2.0
+chr1	135663	2.0	0.0	2.0
+chr1	135665	1.0	0.0	1.0
+chr1	135669	0.0	2.0	2.0
+chr1	135671	1.0	0.0	1.0
+chr1	135675	0.0	2.0	2.0
+chr1	135684	2.0	0.0	2.0
+chr1	135840	0.0	2.0	2.0
+chr1	135844	1.0	0.0	1.0
+chr1	135851	1.0	0.0	1.0
+chr1	135854	1.0	0.0	1.0
+chr1	135858	0.0	3.0	3.0
+chr1	135863	1.0	1.0	2.0
+chr1	135864	3.0	1.0	4.0
+chr1	135866	1.0	2.0	3.0
+chr1	135869	0.0	1.0	1.0
+chr1	135873	0.0	1.0	1.0
+chr1	135877	1.0	0.0	1.0
+chr1	135883	1.0	0.0	1.0
+chr1	135884	1.0	0.0	1.0
+chr1	135886	2.0	0.0	2.0
+chr1	135887	1.0	0.0	1.0
+chr1	135888	0.0	2.0	2.0
+chr1	135889	0.0	1.0	1.0
+chr1	135891	1.0	4.0	5.0
+chr1	135899	1.0	0.0	1.0
+chr1	135900	1.0	0.0	1.0
+chr1	135904	1.0	0.0	1.0
+chr1	135906	0.0	1.0	1.0
+chr1	135908	0.0	1.0	1.0
+chr1	135909	0.0	1.0	1.0
+chr1	135921	1.0	0.0	1.0
+chr1	135930	1.0	0.0	1.0
+chr1	135946	1.0	0.0	1.0
+chr1	135985	0.0	1.0	1.0
+chr1	136018	0.0	2.0	2.0
+chr1	136025	0.0	1.0	1.0
+chr1	136026	0.0	1.0	1.0
+chr1	136041	2.0	0.0	2.0
+chr1	136042	2.0	0.0	2.0
+chr1	136044	0.0	2.0	2.0
+chr1	136054	1.0	0.0	1.0
+chr1	136063	1.0	0.0	1.0
+chr1	136064	1.0	0.0	1.0
+chr1	136366	1.0	0.0	1.0
+chr1	136517	0.0	1.0	1.0
+chr1	136535	1.0	0.0	1.0
+chr1	136540	1.0	0.0	1.0
+chr1	136543	1.0	0.0	1.0
+chr1	136544	1.0	0.0	1.0
+chr1	136549	2.0	0.0	2.0
+chr1	136562	0.0	2.0	2.0
+chr1	136564	1.0	0.0	1.0
+chr1	136705	0.0	1.0	1.0
+chr1	136874	1.0	0.0	1.0
+chr1	136877	0.0	1.0	1.0
+chr1	136882	0.0	1.0	1.0
+chr1	136891	1.0	0.0	1.0
+chr1	136911	0.0	1.0	1.0
+chr1	136914	1.0	0.0	1.0
+chr1	136915	2.0	0.0	2.0
+chr1	136920	1.0	0.0	1.0
+chr1	136921	0.0	2.0	2.0
+chr1	136922	0.0	2.0	2.0
+chr1	136933	0.0	1.0	1.0
+chr1	136942	0.0	1.0	1.0
+chr1	136961	0.0	1.0	1.0
+chr1	137056	1.0	0.0	1.0
+chr1	137070	1.0	0.0	1.0
+chr1	137086	0.0	1.0	1.0
+chr1	137090	0.0	2.0	2.0
+chr1	137094	1.0	0.0	1.0
+chr1	137096	1.0	0.0	1.0
+chr1	137103	1.0	0.0	1.0
+chr1	137222	1.0	0.0	1.0
+chr1	137233	1.0	0.0	1.0
+chr1	137235	0.0	1.0	1.0
+chr1	137277	1.0	0.0	1.0
+chr1	137287	0.0	1.0	1.0
+chr1	137335	0.0	1.0	1.0
+chr1	137761	0.0	1.0	1.0
+chr1	137785	0.0	1.0	1.0
+chr1	137788	0.0	1.0	1.0
+chr1	137866	1.0	1.0	2.0
+chr1	137934	0.0	1.0	1.0
+chr1	138028	0.0	1.0	1.0
+chr1	138175	0.0	1.0	1.0
+chr1	138193	1.0	0.0	1.0
+chr1	138196	1.0	0.0	1.0
+chr1	138207	0.0	1.0	1.0
+chr1	138211	0.0	5.0	5.0
+chr1	138212	1.0	0.0	1.0
+chr1	138217	0.0	1.0	1.0
+chr1	138218	1.0	0.0	1.0
+chr1	138226	0.0	1.0	1.0
+chr1	138236	1.0	0.0	1.0
+chr1	138263	1.0	0.0	1.0
+chr1	138288	1.0	0.0	1.0
+chr1	138337	2.0	0.0	2.0
+chr1	138346	4.0	0.0	4.0
+chr1	138351	0.0	2.0	2.0
+chr1	138354	0.0	1.0	1.0
+chr1	138358	0.0	1.0	1.0
+chr1	138359	2.0	2.0	4.0
+chr1	138360	4.0	1.0	5.0
+chr1	138364	0.0	2.0	2.0
+chr1	138365	0.0	2.0	2.0
+chr1	138366	1.0	1.0	2.0
+chr1	138370	0.0	1.0	1.0
+chr1	138371	0.0	1.0	1.0
+chr1	138375	0.0	1.0	1.0
+chr1	138376	0.0	2.0	2.0
+chr1	138377	3.0	1.0	4.0
+chr1	138379	1.0	0.0	1.0
+chr1	138380	1.0	0.0	1.0
+chr1	138382	1.0	0.0	1.0
+chr1	138383	1.0	0.0	1.0
+chr1	138385	0.0	1.0	1.0
+chr1	138387	0.0	3.0	3.0
+chr1	138388	0.0	2.0	2.0
+chr1	138389	0.0	2.0	2.0
+chr1	138390	1.0	0.0	1.0
+chr1	138391	12.0	0.0	12.0
+chr1	138398	0.0	2.0	2.0
+chr1	138640	1.0	0.0	1.0
+chr1	138643	1.0	0.0	1.0
+chr1	138644	1.0	0.0	1.0
+chr1	138658	0.0	1.0	1.0
+chr1	138659	1.0	0.0	1.0
+chr1	138661	0.0	4.0	4.0
+chr1	138677	0.0	1.0	1.0
+chr1	138846	1.0	0.0	1.0
+chr1	138859	0.0	1.0	1.0
+chr1	138989	1.0	0.0	1.0
+chr1	139018	0.0	1.0	1.0
+chr1	139710	0.0	1.0	1.0
+chr1	139757	1.0	0.0	1.0
+chr1	139893	0.0	1.0	1.0
+chr1	140066	0.0	2.0	2.0
+chr1	140073	0.0	1.0	1.0
+chr1	140382	1.0	0.0	1.0
+chr1	140489	0.0	1.0	1.0
+chr1	140574	0.0	1.0	1.0
+chr1	140671	0.0	1.0	1.0
+chr1	140818	1.0	0.0	1.0
+chr1	140821	1.0	0.0	1.0
+chr1	140842	1.0	0.0	1.0
+chr1	140847	0.0	1.0	1.0
+chr1	140892	1.0	0.0	1.0
+chr1	141051	1.0	0.0	1.0
+chr1	141069	1.0	0.0	1.0
+chr1	141191	1.0	0.0	1.0
+chr1	141196	0.0	1.0	1.0
+chr1	141239	1.0	0.0	1.0
+chr1	141352	0.0	1.0	1.0
+chr1	141360	0.0	1.0	1.0
+chr1	141369	1.0	0.0	1.0
+chr1	141370	1.0	0.0	1.0
+chr1	141373	1.0	0.0	1.0
+chr1	141374	1.0	0.0	1.0
+chr1	141539	0.0	1.0	1.0
+chr1	141604	1.0	0.0	1.0
+chr1	141611	1.0	0.0	1.0
+chr1	142833	0.0	1.0	1.0
+chr1	143601	0.0	1.0	1.0
+chr1	143625	1.0	0.0	1.0
+chr1	143627	2.0	0.0	2.0
+chr1	143635	0.0	1.0	1.0
+chr1	143652	0.0	1.0	1.0
+chr1	143653	3.0	0.0	3.0
+chr1	143663	0.0	1.0	1.0
+chr1	143671	0.0	4.0	4.0
+chr1	143686	0.0	1.0	1.0
+chr1	143797	0.0	1.0	1.0
+chr1	143809	0.0	2.0	2.0
+chr1	143818	1.0	0.0	1.0
+chr1	143915	1.0	0.0	1.0
+chr1	144003	1.0	0.0	1.0
+chr1	144040	0.0	1.0	1.0
+chr1	144138	1.0	0.0	1.0
+chr1	144168	1.0	0.0	1.0
+chr1	144291	0.0	1.0	1.0
+chr1	144333	1.0	0.0	1.0
+chr1	144338	0.0	1.0	1.0
+chr1	144619	1.0	0.0	1.0
+chr1	144752	0.0	1.0	1.0
+chr1	144766	1.0	0.0	1.0
+chr1	144778	1.0	0.0	1.0
+chr1	144807	0.0	1.0	1.0
+chr1	145036	0.0	1.0	1.0
+chr1	145434	0.0	1.0	1.0
+chr1	145469	0.0	1.0	1.0
+chr1	145613	1.0	0.0	1.0
+chr1	145939	0.0	1.0	1.0
+chr1	146783	0.0	1.0	1.0
+chr1	147166	0.0	1.0	1.0
+chr1	148264	1.0	0.0	1.0
+chr1	148720	1.0	0.0	1.0
+chr1	148894	0.0	1.0	1.0
+chr1	148994	1.0	0.0	1.0
+chr1	149205	1.0	0.0	1.0
+chr1	149224	0.0	1.0	1.0
+chr1	149719	0.0	1.0	1.0
+chr1	149740	0.0	1.0	1.0
+chr1	150214	1.0	0.0	1.0
+chr1	150627	0.0	1.0	1.0
+chr1	150630	1.0	0.0	1.0
+chr1	150638	1.0	0.0	1.0
+chr1	150970	0.0	2.0	2.0
+chr1	150978	0.0	1.0	1.0
+chr1	151003	1.0	0.0	1.0
+chr1	151128	1.0	0.0	1.0
+chr1	151133	0.0	1.0	1.0
+chr1	151136	2.0	0.0	2.0
+chr1	151137	3.0	0.0	3.0
+chr1	151140	0.0	1.0	1.0
+chr1	151141	0.0	1.0	1.0
+chr1	151148	1.0	0.0	1.0
+chr1	151149	1.0	0.0	1.0
+chr1	151156	1.0	0.0	1.0
+chr1	151158	0.0	1.0	1.0
+chr1	151160	0.0	1.0	1.0
+chr1	151203	3.0	0.0	3.0
+chr1	151680	0.0	1.0	1.0
+chr1	152245	0.0	1.0	1.0
+chr1	152247	0.0	3.0	3.0
+chr1	152249	0.0	1.0	1.0
+chr1	152250	0.0	2.0	2.0
+chr1	152251	0.0	4.0	4.0
+chr1	152254	0.0	1.0	1.0
+chr1	152258	0.0	3.0	3.0
+chr1	152263	0.0	1.0	1.0
+chr1	152264	16.0	0.0	16.0
+chr1	152265	1.0	0.0	1.0
+chr1	152267	0.0	3.0	3.0
+chr1	152269	2.0	0.0	2.0
+chr1	152270	7.0	0.0	7.0
+chr1	152274	0.0	1.0	1.0
+chr1	152279	1.0	0.0	1.0
+chr1	152280	1.0	0.0	1.0
+chr1	152282	0.0	1.0	1.0
+chr1	152283	0.0	1.0	1.0
+chr1	152299	2.0	0.0	2.0
+chr1	152443	2.0	0.0	2.0
+chr1	152581	1.0	0.0	1.0
+chr1	153336	0.0	1.0	1.0
+chr1	153432	1.0	0.0	1.0
+chr1	153519	0.0	1.0	1.0
+chr1	153562	0.0	1.0	1.0
+chr1	153601	3.0	0.0	3.0
+chr1	153781	0.0	1.0	1.0
+chr1	154168	1.0	0.0	1.0
+chr1	154181	1.0	0.0	1.0
+chr1	154186	1.0	0.0	1.0
+chr1	154200	3.0	0.0	3.0
+chr1	154223	1.0	0.0	1.0
+chr1	154302	1.0	0.0	1.0
+chr1	154324	0.0	1.0	1.0
+chr1	154368	0.0	1.0	1.0
+chr1	154377	0.0	1.0	1.0
+chr1	154383	0.0	1.0	1.0
+chr1	154387	0.0	1.0	1.0
+chr1	154390	1.0	0.0	1.0
+chr1	154393	1.0	0.0	1.0
+chr1	154515	1.0	0.0	1.0
+chr1	154554	0.0	1.0	1.0
+chr1	154555	0.0	1.0	1.0
+chr1	154558	1.0	0.0	1.0
+chr1	154564	2.0	0.0	2.0
+chr1	154677	0.0	1.0	1.0
+chr1	154686	0.0	1.0	1.0
+chr1	154691	1.0	0.0	1.0
+chr1	154699	0.0	1.0	1.0
+chr1	154704	1.0	0.0	1.0
+chr1	154705	0.0	2.0	2.0
+chr1	154706	0.0	1.0	1.0
+chr1	154718	0.0	1.0	1.0
+chr1	154719	6.0	0.0	6.0
+chr1	154724	0.0	1.0	1.0
+chr1	154725	0.0	1.0	1.0
+chr1	154727	1.0	0.0	1.0
+chr1	154728	3.0	0.0	3.0
+chr1	154729	2.0	0.0	2.0
+chr1	154730	6.0	0.0	6.0
+chr1	154732	0.0	1.0	1.0
+chr1	154741	1.0	0.0	1.0
+chr1	154756	0.0	1.0	1.0
+chr1	154758	1.0	0.0	1.0
+chr1	154933	0.0	1.0	1.0
+chr1	154958	0.0	1.0	1.0
+chr1	154962	1.0	0.0	1.0
+chr1	154963	0.0	1.0	1.0
+chr1	154964	0.0	1.0	1.0
+chr1	154968	0.0	1.0	1.0
+chr1	154970	0.0	2.0	2.0
+chr1	154971	1.0	0.0	1.0
+chr1	154973	0.0	1.0	1.0
+chr1	154981	0.0	1.0	1.0
+chr1	154986	0.0	1.0	1.0
+chr1	154988	1.0	0.0	1.0
+chr1	154989	3.0	0.0	3.0
+chr1	154990	7.0	0.0	7.0
+chr1	154991	0.0	8.0	8.0
+chr1	154992	1.0	0.0	1.0
+chr1	154993	0.0	2.0	2.0
+chr1	154995	0.0	7.0	7.0
+chr1	154997	1.0	1.0	2.0
+chr1	155001	0.0	2.0	2.0
+chr1	155003	1.0	0.0	1.0
+chr1	155005	1.0	0.0	1.0
+chr1	155006	2.0	0.0	2.0
+chr1	155012	0.0	2.0	2.0
+chr1	155082	0.0	1.0	1.0
+chr1	155143	1.0	0.0	1.0
+chr1	155148	4.0	0.0	4.0
+chr1	155150	1.0	0.0	1.0
+chr1	155164	0.0	1.0	1.0
+chr1	155278	1.0	0.0	1.0
+chr1	155305	2.0	0.0	2.0
+chr1	155312	1.0	0.0	1.0
+chr1	155336	1.0	0.0	1.0
+chr1	155493	2.0	0.0	2.0
+chr1	155723	0.0	1.0	1.0
+chr1	155803	0.0	1.0	1.0
+chr1	156103	0.0	1.0	1.0
+chr1	156536	0.0	1.0	1.0
+chr1	156625	1.0	0.0	1.0
+chr1	156643	1.0	0.0	1.0
+chr1	156788	0.0	1.0	1.0
+chr1	157013	0.0	1.0	1.0
+chr1	157319	0.0	1.0	1.0
+chr1	157466	0.0	1.0	1.0
+chr1	157478	1.0	0.0	1.0
+chr1	157532	1.0	0.0	1.0
+chr1	157602	0.0	1.0	1.0
+chr1	157981	1.0	0.0	1.0
+chr1	158123	0.0	1.0	1.0
+chr1	158132	1.0	0.0	1.0
+chr1	158178	1.0	0.0	1.0
+chr1	158288	1.0	0.0	1.0
+chr1	158297	0.0	1.0	1.0
+chr1	158477	1.0	0.0	1.0
+chr1	158480	0.0	1.0	1.0
+chr1	158482	2.0	0.0	2.0
+chr1	158618	0.0	1.0	1.0
+chr1	158628	3.0	0.0	3.0
+chr1	158629	2.0	0.0	2.0
+chr1	158630	3.0	0.0	3.0
+chr1	158631	1.0	0.0	1.0
+chr1	158636	0.0	1.0	1.0
+chr1	158643	0.0	2.0	2.0
+chr1	158644	0.0	2.0	2.0
+chr1	158646	3.0	0.0	3.0
+chr1	158648	0.0	2.0	2.0
+chr1	158649	0.0	1.0	1.0
+chr1	158653	0.0	1.0	1.0
+chr1	158666	1.0	1.0	2.0
+chr1	158853	1.0	0.0	1.0
+chr1	158888	6.0	0.0	6.0
+chr1	158890	1.0	1.0	2.0
+chr1	158904	0.0	4.0	4.0
+chr1	158906	1.0	0.0	1.0
+chr1	158907	2.0	1.0	3.0
+chr1	158908	0.0	1.0	1.0
+chr1	158909	0.0	1.0	1.0
+chr1	158914	5.0	0.0	5.0
+chr1	158915	5.0	3.0	8.0
+chr1	158916	0.0	4.0	4.0
+chr1	158917	2.0	2.0	4.0
+chr1	158918	4.0	0.0	4.0
+chr1	158919	7.0	1.0	8.0
+chr1	158922	0.0	2.0	2.0
+chr1	158924	3.0	1.0	4.0
+chr1	158925	0.0	1.0	1.0
+chr1	158927	0.0	2.0	2.0
+chr1	158930	1.0	0.0	1.0
+chr1	158931	1.0	2.0	3.0
+chr1	158934	2.0	0.0	2.0
+chr1	158935	1.0	1.0	2.0
+chr1	158936	5.0	0.0	5.0
+chr1	158938	0.0	1.0	1.0
+chr1	158939	0.0	1.0	1.0
+chr1	158940	0.0	1.0	1.0
+chr1	158947	2.0	0.0	2.0
+chr1	158961	0.0	1.0	1.0
+chr1	159053	0.0	1.0	1.0
+chr1	159056	0.0	1.0	1.0
+chr1	159057	0.0	1.0	1.0
+chr1	159066	1.0	1.0	2.0
+chr1	159068	1.0	0.0	1.0
+chr1	159069	1.0	1.0	2.0
+chr1	159071	1.0	0.0	1.0
+chr1	159082	2.0	0.0	2.0
+chr1	159088	2.0	0.0	2.0
+chr1	159112	0.0	2.0	2.0
+chr1	159124	1.0	0.0	1.0
+chr1	159231	3.0	0.0	3.0
+chr1	159235	0.0	1.0	1.0
+chr1	159270	0.0	1.0	1.0
+chr1	159338	0.0	1.0	1.0
+chr1	159388	1.0	0.0	1.0
+chr1	159396	0.0	1.0	1.0
+chr1	159517	0.0	1.0	1.0
+chr1	159536	1.0	0.0	1.0
+chr1	159557	0.0	2.0	2.0
+chr1	159635	0.0	2.0	2.0
+chr1	159660	2.0	0.0	2.0
+chr1	159691	1.0	0.0	1.0
+chr1	159707	1.0	0.0	1.0
+chr1	159712	0.0	1.0	1.0
+chr1	159787	0.0	1.0	1.0
+chr1	160038	1.0	0.0	1.0
+chr1	160068	1.0	0.0	1.0
+chr1	160081	0.0	1.0	1.0
+chr1	160090	0.0	3.0	3.0
+chr1	160094	1.0	0.0	1.0
+chr1	160101	0.0	1.0	1.0
+chr1	160105	3.0	0.0	3.0
+chr1	160112	0.0	1.0	1.0
+chr1	160120	1.0	1.0	2.0
+chr1	160259	0.0	2.0	2.0
+chr1	160264	0.0	2.0	2.0
+chr1	160265	0.0	1.0	1.0
+chr1	160271	0.0	1.0	1.0
+chr1	160272	0.0	1.0	1.0
+chr1	160275	0.0	3.0	3.0
+chr1	160276	0.0	1.0	1.0
+chr1	160279	0.0	2.0	2.0
+chr1	160280	0.0	1.0	1.0
+chr1	160283	0.0	1.0	1.0
+chr1	160285	0.0	3.0	3.0
+chr1	160286	0.0	1.0	1.0
+chr1	160288	0.0	5.0	5.0
+chr1	160289	0.0	17.0	17.0
+chr1	160290	0.0	1.0	1.0
+chr1	160293	0.0	1.0	1.0
+chr1	160297	0.0	1.0	1.0
+chr1	160298	0.0	1.0	1.0
+chr1	160300	0.0	1.0	1.0
+chr1	160301	0.0	1.0	1.0
+chr1	160302	0.0	1.0	1.0
+chr1	160304	0.0	1.0	1.0
+chr1	160306	0.0	1.0	1.0
+chr1	160310	0.0	1.0	1.0
+chr1	160312	5.0	0.0	5.0
+chr1	160314	0.0	1.0	1.0
+chr1	160316	0.0	1.0	1.0
+chr1	160319	5.0	0.0	5.0
+chr1	160322	0.0	2.0	2.0
+chr1	160324	2.0	0.0	2.0
+chr1	160330	1.0	3.0	4.0
+chr1	160331	0.0	1.0	1.0
+chr1	160332	1.0	1.0	2.0
+chr1	160335	1.0	0.0	1.0
+chr1	160341	0.0	1.0	1.0
+chr1	160362	1.0	0.0	1.0
+chr1	160368	1.0	0.0	1.0
+chr1	160379	1.0	0.0	1.0
+chr1	160380	1.0	0.0	1.0
+chr1	160381	1.0	0.0	1.0
+chr1	160390	1.0	0.0	1.0
+chr1	160391	0.0	1.0	1.0
+chr1	160392	3.0	0.0	3.0
+chr1	160412	0.0	1.0	1.0
+chr1	160413	1.0	0.0	1.0
+chr1	160414	2.0	0.0	2.0
+chr1	160418	2.0	0.0	2.0
+chr1	160419	1.0	0.0	1.0
+chr1	160425	1.0	0.0	1.0
+chr1	160439	0.0	1.0	1.0
+chr1	160440	2.0	1.0	3.0
+chr1	160446	1.0	2.0	3.0
+chr1	160447	1.0	0.0	1.0
+chr1	160448	2.0	1.0	3.0
+chr1	160456	0.0	1.0	1.0
+chr1	160458	0.0	1.0	1.0
+chr1	160468	0.0	1.0	1.0
+chr1	160474	1.0	0.0	1.0
+chr1	160476	1.0	0.0	1.0
+chr1	160478	0.0	1.0	1.0
+chr1	160481	0.0	1.0	1.0
+chr1	160488	0.0	1.0	1.0
+chr1	160492	5.0	0.0	5.0
+chr1	160495	1.0	0.0	1.0
+chr1	160496	2.0	0.0	2.0
+chr1	160498	1.0	0.0	1.0
+chr1	160499	1.0	1.0	2.0
+chr1	160502	0.0	5.0	5.0
+chr1	160510	6.0	0.0	6.0
+chr1	160511	3.0	0.0	3.0
+chr1	160514	1.0	0.0	1.0
+chr1	160515	2.0	0.0	2.0
+chr1	160516	1.0	0.0	1.0
+chr1	160526	2.0	0.0	2.0
+chr1	160546	2.0	0.0	2.0
+chr1	160550	1.0	0.0	1.0
+chr1	160551	1.0	0.0	1.0
+chr1	160554	1.0	0.0	1.0
+chr1	160619	1.0	0.0	1.0
+chr1	160642	1.0	0.0	1.0
+chr1	160645	1.0	0.0	1.0
+chr1	160648	0.0	2.0	2.0
+chr1	160665	0.0	1.0	1.0
+chr1	160670	2.0	0.0	2.0
+chr1	160674	1.0	0.0	1.0
+chr1	160696	1.0	0.0	1.0
+chr1	160697	0.0	1.0	1.0
+chr1	160731	0.0	1.0	1.0
+chr1	160807	1.0	0.0	1.0
+chr1	160845	0.0	1.0	1.0
+chr1	160864	0.0	2.0	2.0
+chr1	160865	1.0	0.0	1.0
+chr1	160866	1.0	0.0	1.0
+chr1	160874	0.0	1.0	1.0
+chr1	160883	0.0	3.0	3.0
+chr1	160897	1.0	0.0	1.0
+chr1	160911	0.0	1.0	1.0
+chr1	160941	0.0	1.0	1.0
+chr1	160942	1.0	0.0	1.0
+chr1	160950	0.0	1.0	1.0
+chr1	160955	0.0	2.0	2.0
+chr1	160965	0.0	1.0	1.0
+chr1	160966	1.0	0.0	1.0
+chr1	160967	1.0	0.0	1.0
+chr1	160970	0.0	1.0	1.0
+chr1	160975	1.0	0.0	1.0
+chr1	161017	0.0	1.0	1.0
+chr1	161021	0.0	2.0	2.0
+chr1	161026	0.0	1.0	1.0
+chr1	161051	0.0	1.0	1.0
+chr1	161063	0.0	1.0	1.0
+chr1	161069	0.0	2.0	2.0
+chr1	161083	0.0	1.0	1.0
+chr1	161092	0.0	1.0	1.0
+chr1	161106	1.0	0.0	1.0
+chr1	161123	0.0	1.0	1.0
+chr1	161132	1.0	0.0	1.0
+chr1	161136	1.0	0.0	1.0
+chr1	161142	1.0	0.0	1.0
+chr1	161170	1.0	0.0	1.0
+chr1	161173	0.0	1.0	1.0
+chr1	161207	0.0	1.0	1.0
+chr1	161236	1.0	0.0	1.0
+chr1	161246	0.0	1.0	1.0
+chr1	161267	0.0	1.0	1.0
+chr1	161269	0.0	1.0	1.0
+chr1	161275	1.0	0.0	1.0
+chr1	161303	0.0	1.0	1.0
+chr1	161304	0.0	1.0	1.0
+chr1	161311	2.0	0.0	2.0
+chr1	161315	0.0	2.0	2.0
+chr1	161317	1.0	0.0	1.0
+chr1	161325	1.0	0.0	1.0
+chr1	161327	0.0	1.0	1.0
+chr1	161333	1.0	0.0	1.0
+chr1	161339	0.0	1.0	1.0
+chr1	161344	0.0	1.0	1.0
+chr1	161351	1.0	0.0	1.0
+chr1	161355	1.0	1.0	2.0
+chr1	161358	1.0	0.0	1.0
+chr1	161368	0.0	1.0	1.0
+chr1	161370	1.0	0.0	1.0
+chr1	161382	0.0	1.0	1.0
+chr1	161394	0.0	1.0	1.0
+chr1	161395	1.0	0.0	1.0
+chr1	161406	0.0	1.0	1.0
+chr1	161407	0.0	2.0	2.0
+chr1	161426	0.0	1.0	1.0
+chr1	161430	1.0	0.0	1.0
+chr1	161446	1.0	0.0	1.0
+chr1	161556	1.0	0.0	1.0
+chr1	161572	0.0	1.0	1.0
+chr1	161575	0.0	1.0	1.0
+chr1	161577	1.0	0.0	1.0
+chr1	161580	1.0	0.0	1.0
+chr1	161630	1.0	0.0	1.0
+chr1	161642	0.0	1.0	1.0
+chr1	161650	2.0	0.0	2.0
+chr1	161655	1.0	0.0	1.0
+chr1	161659	1.0	0.0	1.0
+chr1	161662	5.0	0.0	5.0
+chr1	161675	0.0	1.0	1.0
+chr1	161680	1.0	1.0	2.0
+chr1	161681	0.0	1.0	1.0
+chr1	161684	0.0	2.0	2.0
+chr1	161698	2.0	0.0	2.0
+chr1	161706	0.0	1.0	1.0
+chr1	161707	0.0	1.0	1.0
+chr1	161708	0.0	1.0	1.0
+chr1	161741	1.0	0.0	1.0
+chr1	161749	0.0	1.0	1.0
+chr1	161759	0.0	2.0	2.0
+chr1	161765	1.0	0.0	1.0
+chr1	161782	1.0	0.0	1.0
+chr1	161794	1.0	0.0	1.0
+chr1	161802	0.0	1.0	1.0
+chr1	161826	0.0	1.0	1.0
+chr1	161885	0.0	1.0	1.0
+chr1	161887	0.0	1.0	1.0
+chr1	161896	0.0	1.0	1.0
+chr1	161897	0.0	1.0	1.0
+chr1	161898	0.0	2.0	2.0
+chr1	161904	1.0	0.0	1.0
+chr1	161914	0.0	1.0	1.0
+chr1	161915	0.0	1.0	1.0
+chr1	161924	0.0	1.0	1.0
+chr1	161927	1.0	0.0	1.0
+chr1	161934	2.0	0.0	2.0
+chr1	161937	1.0	1.0	2.0
+chr1	161949	0.0	2.0	2.0
+chr1	161965	0.0	1.0	1.0
+chr1	161968	1.0	0.0	1.0
+chr1	161976	0.0	1.0	1.0
+chr1	161984	0.0	1.0	1.0
+chr1	162025	0.0	1.0	1.0
+chr1	162029	0.0	1.0	1.0
+chr1	162042	0.0	1.0	1.0
+chr1	162051	0.0	1.0	1.0
+chr1	162085	1.0	0.0	1.0
+chr1	162099	1.0	0.0	1.0
+chr1	162116	0.0	1.0	1.0
+chr1	162128	1.0	0.0	1.0
+chr1	162129	1.0	0.0	1.0
+chr1	162133	0.0	1.0	1.0
+chr1	162145	0.0	1.0	1.0
+chr1	162152	1.0	0.0	1.0
+chr1	162154	0.0	1.0	1.0
+chr1	162163	1.0	0.0	1.0
+chr1	162172	1.0	0.0	1.0
+chr1	162178	0.0	1.0	1.0
+chr1	162196	1.0	0.0	1.0
+chr1	162219	1.0	1.0	2.0
+chr1	162235	0.0	1.0	1.0
+chr1	162240	1.0	0.0	1.0
+chr1	162263	1.0	0.0	1.0
+chr1	162264	0.0	2.0	2.0
+chr1	162267	1.0	0.0	1.0
+chr1	162276	0.0	1.0	1.0
+chr1	162284	0.0	1.0	1.0
+chr1	162291	1.0	0.0	1.0
+chr1	162313	0.0	1.0	1.0
+chr1	162346	0.0	1.0	1.0
+chr1	162376	0.0	1.0	1.0
+chr1	162394	1.0	0.0	1.0
+chr1	162395	0.0	1.0	1.0
+chr1	162396	1.0	0.0	1.0
+chr1	162408	0.0	1.0	1.0
+chr1	162410	0.0	2.0	2.0
+chr1	162418	0.0	1.0	1.0
+chr1	162423	1.0	0.0	1.0
+chr1	162425	1.0	0.0	1.0
+chr1	162426	0.0	1.0	1.0
+chr1	162453	0.0	3.0	3.0
+chr1	162461	1.0	0.0	1.0
+chr1	162466	0.0	1.0	1.0
+chr1	162469	1.0	0.0	1.0
+chr1	162483	1.0	0.0	1.0
+chr1	162497	2.0	0.0	2.0
+chr1	162524	0.0	1.0	1.0
+chr1	162561	1.0	0.0	1.0
+chr1	162564	1.0	0.0	1.0
+chr1	162566	1.0	0.0	1.0
+chr1	162573	0.0	1.0	1.0
+chr1	162588	0.0	1.0	1.0
+chr1	162617	2.0	0.0	2.0
+chr1	162620	0.0	2.0	2.0
+chr1	162632	1.0	0.0	1.0
+chr1	162633	0.0	1.0	1.0
+chr1	162635	1.0	0.0	1.0
+chr1	162643	1.0	0.0	1.0
+chr1	162649	1.0	0.0	1.0
+chr1	162671	1.0	0.0	1.0
+chr1	162672	1.0	0.0	1.0
+chr1	162675	1.0	0.0	1.0
+chr1	162699	0.0	1.0	1.0
+chr1	162718	0.0	2.0	2.0
+chr1	162721	0.0	1.0	1.0
+chr1	162726	2.0	0.0	2.0
+chr1	162744	0.0	1.0	1.0
+chr1	162753	2.0	0.0	2.0
+chr1	162757	3.0	1.0	4.0
+chr1	162759	0.0	1.0	1.0
+chr1	162772	1.0	0.0	1.0
+chr1	162774	1.0	0.0	1.0
+chr1	162779	1.0	0.0	1.0
+chr1	162807	0.0	1.0	1.0
+chr1	162810	2.0	0.0	2.0
+chr1	162827	0.0	1.0	1.0
+chr1	162829	1.0	0.0	1.0
+chr1	162876	2.0	0.0	2.0
+chr1	162877	2.0	0.0	2.0
+chr1	162881	2.0	0.0	2.0
+chr1	162882	1.0	0.0	1.0
+chr1	162903	0.0	1.0	1.0
+chr1	162908	2.0	0.0	2.0
+chr1	162915	1.0	0.0	1.0
+chr1	162922	0.0	1.0	1.0
+chr1	162930	1.0	0.0	1.0
+chr1	162949	0.0	1.0	1.0
+chr1	162954	1.0	0.0	1.0
+chr1	162961	0.0	1.0	1.0
+chr1	162963	0.0	1.0	1.0
+chr1	162980	1.0	0.0	1.0
+chr1	162983	1.0	0.0	1.0
+chr1	162998	1.0	0.0	1.0
+chr1	163005	2.0	0.0	2.0
+chr1	163021	0.0	1.0	1.0
+chr1	163023	1.0	0.0	1.0
+chr1	163029	1.0	0.0	1.0
+chr1	163030	1.0	0.0	1.0
+chr1	163032	3.0	0.0	3.0
+chr1	163046	1.0	0.0	1.0
+chr1	163050	1.0	0.0	1.0
+chr1	163069	0.0	1.0	1.0
+chr1	163090	0.0	1.0	1.0
+chr1	163091	0.0	1.0	1.0
+chr1	163129	0.0	2.0	2.0
+chr1	163131	1.0	0.0	1.0
+chr1	163133	0.0	1.0	1.0
+chr1	163143	1.0	0.0	1.0
+chr1	163147	1.0	0.0	1.0
+chr1	163149	1.0	0.0	1.0
+chr1	163151	1.0	0.0	1.0
+chr1	163160	0.0	1.0	1.0
+chr1	163170	3.0	0.0	3.0
+chr1	163186	2.0	0.0	2.0
+chr1	163190	1.0	0.0	1.0
+chr1	163200	1.0	0.0	1.0
+chr1	163201	0.0	2.0	2.0
+chr1	163203	2.0	0.0	2.0
+chr1	163239	1.0	0.0	1.0
+chr1	163240	0.0	2.0	2.0
+chr1	163245	1.0	0.0	1.0
+chr1	163250	0.0	1.0	1.0
+chr1	163256	1.0	0.0	1.0
+chr1	163261	0.0	1.0	1.0
+chr1	163269	0.0	1.0	1.0
+chr1	163278	0.0	2.0	2.0
+chr1	163279	1.0	0.0	1.0
+chr1	163285	0.0	1.0	1.0
+chr1	163287	2.0	0.0	2.0
+chr1	163293	1.0	0.0	1.0
+chr1	163304	0.0	1.0	1.0
+chr1	163306	0.0	2.0	2.0
+chr1	163322	1.0	0.0	1.0
+chr1	163330	1.0	1.0	2.0
+chr1	163332	1.0	0.0	1.0
+chr1	163335	0.0	1.0	1.0
+chr1	163339	0.0	1.0	1.0
+chr1	163340	1.0	0.0	1.0
+chr1	163343	1.0	1.0	2.0
+chr1	163344	0.0	1.0	1.0
+chr1	163345	3.0	0.0	3.0
+chr1	163346	0.0	1.0	1.0
+chr1	163347	1.0	0.0	1.0
+chr1	163349	1.0	0.0	1.0
+chr1	163350	0.0	2.0	2.0
+chr1	163351	0.0	1.0	1.0
+chr1	163357	1.0	0.0	1.0
+chr1	163359	1.0	0.0	1.0
+chr1	163368	1.0	0.0	1.0
+chr1	163369	0.0	1.0	1.0
+chr1	163391	2.0	0.0	2.0
+chr1	163405	2.0	0.0	2.0
+chr1	163428	0.0	1.0	1.0
+chr1	163452	2.0	0.0	2.0
+chr1	163457	0.0	2.0	2.0
+chr1	163500	1.0	0.0	1.0
+chr1	163510	1.0	0.0	1.0
+chr1	163512	0.0	1.0	1.0
+chr1	163515	0.0	1.0	1.0
+chr1	163516	0.0	1.0	1.0
+chr1	163521	0.0	1.0	1.0
+chr1	163522	0.0	1.0	1.0
+chr1	163527	2.0	1.0	3.0
+chr1	163533	1.0	0.0	1.0
+chr1	163534	0.0	1.0	1.0
+chr1	163542	1.0	0.0	1.0
+chr1	163549	2.0	0.0	2.0
+chr1	163560	0.0	2.0	2.0
+chr1	163563	0.0	1.0	1.0
+chr1	163565	0.0	1.0	1.0
+chr1	163585	1.0	0.0	1.0
+chr1	163589	0.0	1.0	1.0
+chr1	163595	0.0	1.0	1.0
+chr1	163607	3.0	0.0	3.0
+chr1	163622	0.0	1.0	1.0
+chr1	163624	1.0	0.0	1.0
+chr1	163625	0.0	1.0	1.0
+chr1	163655	0.0	4.0	4.0
+chr1	163662	0.0	2.0	2.0
+chr1	163664	1.0	0.0	1.0
+chr1	163665	0.0	1.0	1.0
+chr1	163670	0.0	1.0	1.0
+chr1	163675	2.0	0.0	2.0
+chr1	163676	1.0	0.0	1.0
+chr1	163681	0.0	2.0	2.0
+chr1	163684	0.0	1.0	1.0
+chr1	163686	1.0	0.0	1.0
+chr1	163701	0.0	3.0	3.0
+chr1	163713	1.0	0.0	1.0
+chr1	163716	1.0	0.0	1.0
+chr1	163717	1.0	1.0	2.0
+chr1	163720	0.0	2.0	2.0
+chr1	163724	0.0	1.0	1.0
+chr1	163748	4.0	0.0	4.0
+chr1	163751	1.0	0.0	1.0
+chr1	163774	0.0	3.0	3.0
+chr1	163779	3.0	0.0	3.0
+chr1	163781	0.0	1.0	1.0
+chr1	163785	0.0	2.0	2.0
+chr1	163787	1.0	0.0	1.0
+chr1	163795	1.0	0.0	1.0
+chr1	163807	0.0	1.0	1.0
+chr1	163809	0.0	1.0	1.0
+chr1	163820	0.0	1.0	1.0
+chr1	163832	1.0	0.0	1.0
+chr1	163833	1.0	0.0	1.0
+chr1	163837	0.0	1.0	1.0
+chr1	163840	2.0	0.0	2.0
+chr1	163850	0.0	1.0	1.0
+chr1	163862	0.0	1.0	1.0
+chr1	163868	0.0	1.0	1.0
+chr1	163870	0.0	1.0	1.0
+chr1	163875	0.0	2.0	2.0
+chr1	163884	0.0	3.0	3.0
+chr1	163888	6.0	0.0	6.0
+chr1	163894	0.0	1.0	1.0
+chr1	163915	2.0	0.0	2.0
+chr1	163918	0.0	1.0	1.0
+chr1	163925	2.0	0.0	2.0
+chr1	163927	0.0	1.0	1.0
+chr1	163937	0.0	1.0	1.0
+chr1	163944	0.0	1.0	1.0
+chr1	163950	1.0	0.0	1.0
+chr1	163956	1.0	0.0	1.0
+chr1	163958	0.0	1.0	1.0
+chr1	163966	0.0	1.0	1.0
+chr1	163972	1.0	0.0	1.0
+chr1	163984	1.0	0.0	1.0
+chr1	163989	2.0	0.0	2.0
+chr1	163999	1.0	0.0	1.0
+chr1	164004	0.0	1.0	1.0
+chr1	164009	1.0	0.0	1.0
+chr1	164010	0.0	3.0	3.0
+chr1	164014	0.0	1.0	1.0
+chr1	164015	0.0	1.0	1.0
+chr1	164016	0.0	14.0	14.0
+chr1	164026	0.0	2.0	2.0
+chr1	164043	3.0	0.0	3.0
+chr1	164045	0.0	1.0	1.0
+chr1	164060	0.0	1.0	1.0
+chr1	164068	1.0	0.0	1.0
+chr1	164074	1.0	0.0	1.0
+chr1	164077	2.0	0.0	2.0
+chr1	164084	1.0	0.0	1.0
+chr1	164093	0.0	1.0	1.0
+chr1	164097	1.0	0.0	1.0
+chr1	164112	1.0	0.0	1.0
+chr1	164115	0.0	1.0	1.0
+chr1	164124	3.0	1.0	4.0
+chr1	164144	0.0	1.0	1.0
+chr1	164149	0.0	1.0	1.0
+chr1	164152	1.0	0.0	1.0
+chr1	164157	0.0	1.0	1.0
+chr1	164158	1.0	0.0	1.0
+chr1	164162	0.0	1.0	1.0
+chr1	164165	1.0	0.0	1.0
+chr1	164166	1.0	0.0	1.0
+chr1	164175	1.0	0.0	1.0
+chr1	164177	1.0	0.0	1.0
+chr1	164182	0.0	3.0	3.0
+chr1	164199	1.0	0.0	1.0
+chr1	164212	0.0	1.0	1.0
+chr1	164217	1.0	0.0	1.0
+chr1	164218	1.0	0.0	1.0
+chr1	164222	0.0	1.0	1.0
+chr1	164223	0.0	3.0	3.0
+chr1	164243	1.0	0.0	1.0
+chr1	164247	1.0	0.0	1.0
+chr1	164267	4.0	0.0	4.0
+chr1	164272	1.0	0.0	1.0
+chr1	164280	0.0	1.0	1.0
+chr1	164284	3.0	0.0	3.0
+chr1	164292	0.0	1.0	1.0
+chr1	164297	1.0	3.0	4.0
+chr1	164298	0.0	2.0	2.0
+chr1	164299	0.0	1.0	1.0
+chr1	164302	1.0	0.0	1.0
+chr1	164303	0.0	1.0	1.0
+chr1	164305	0.0	1.0	1.0
+chr1	164311	1.0	0.0	1.0
+chr1	164312	1.0	1.0	2.0
+chr1	164313	1.0	1.0	2.0
+chr1	164319	1.0	0.0	1.0
+chr1	164320	0.0	1.0	1.0
+chr1	164321	0.0	1.0	1.0
+chr1	164322	1.0	0.0	1.0
+chr1	164333	1.0	0.0	1.0
+chr1	164336	1.0	0.0	1.0
+chr1	164338	1.0	0.0	1.0
+chr1	164355	1.0	0.0	1.0
+chr1	164356	1.0	0.0	1.0
+chr1	164376	0.0	1.0	1.0
+chr1	164404	1.0	0.0	1.0
+chr1	164409	1.0	0.0	1.0
+chr1	164412	0.0	1.0	1.0
+chr1	164432	0.0	1.0	1.0
+chr1	164444	0.0	1.0	1.0
+chr1	164446	2.0	0.0	2.0
+chr1	164455	2.0	0.0	2.0
+chr1	164456	0.0	1.0	1.0
+chr1	164463	1.0	0.0	1.0
+chr1	164467	0.0	3.0	3.0
+chr1	164468	1.0	0.0	1.0
+chr1	164471	2.0	0.0	2.0
+chr1	164476	0.0	1.0	1.0
+chr1	164488	0.0	1.0	1.0
+chr1	164489	1.0	0.0	1.0
+chr1	164490	4.0	1.0	5.0
+chr1	164493	2.0	0.0	2.0
+chr1	164495	0.0	1.0	1.0
+chr1	164496	0.0	1.0	1.0
+chr1	164499	1.0	0.0	1.0
+chr1	164503	1.0	1.0	2.0
+chr1	164506	5.0	4.0	9.0
+chr1	164512	0.0	1.0	1.0
+chr1	164515	1.0	1.0	2.0
+chr1	164516	0.0	1.0	1.0
+chr1	164521	1.0	0.0	1.0
+chr1	164522	4.0	0.0	4.0
+chr1	164526	0.0	1.0	1.0
+chr1	164529	0.0	2.0	2.0
+chr1	164531	0.0	1.0	1.0
+chr1	164532	0.0	2.0	2.0
+chr1	164535	1.0	0.0	1.0
+chr1	164536	1.0	0.0	1.0
+chr1	164537	1.0	0.0	1.0
+chr1	164538	0.0	1.0	1.0
+chr1	164569	0.0	1.0	1.0
+chr1	164572	0.0	2.0	2.0
+chr1	164585	1.0	1.0	2.0
+chr1	164587	1.0	0.0	1.0
+chr1	164588	1.0	0.0	1.0
+chr1	164589	0.0	1.0	1.0
+chr1	164602	1.0	0.0	1.0
+chr1	164603	1.0	0.0	1.0
+chr1	164606	1.0	1.0	2.0
+chr1	164609	2.0	0.0	2.0
+chr1	164612	0.0	2.0	2.0
+chr1	164614	1.0	0.0	1.0
+chr1	164617	0.0	1.0	1.0
+chr1	164618	2.0	3.0	5.0
+chr1	164619	0.0	4.0	4.0
+chr1	164620	0.0	1.0	1.0
+chr1	164623	1.0	0.0	1.0
+chr1	164624	1.0	0.0	1.0
+chr1	164625	0.0	1.0	1.0
+chr1	164627	0.0	1.0	1.0
+chr1	164628	1.0	0.0	1.0
+chr1	164629	3.0	0.0	3.0
+chr1	164630	1.0	1.0	2.0
+chr1	164638	0.0	2.0	2.0
+chr1	164640	2.0	0.0	2.0
+chr1	164642	2.0	0.0	2.0
+chr1	164646	0.0	8.0	8.0
+chr1	164647	0.0	2.0	2.0
+chr1	164655	1.0	0.0	1.0
+chr1	164656	2.0	0.0	2.0
+chr1	164658	0.0	1.0	1.0
+chr1	164659	0.0	2.0	2.0
+chr1	164663	1.0	1.0	2.0
+chr1	164664	0.0	1.0	1.0
+chr1	164666	0.0	3.0	3.0
+chr1	164667	0.0	3.0	3.0
+chr1	164668	3.0	0.0	3.0
+chr1	164678	2.0	0.0	2.0
+chr1	164684	0.0	4.0	4.0
+chr1	164686	1.0	0.0	1.0
+chr1	164687	5.0	0.0	5.0
+chr1	164688	0.0	1.0	1.0
+chr1	164689	1.0	0.0	1.0
+chr1	164692	1.0	1.0	2.0
+chr1	164695	0.0	2.0	2.0
+chr1	164697	0.0	2.0	2.0
+chr1	164698	0.0	1.0	1.0
+chr1	164706	0.0	1.0	1.0
+chr1	164708	0.0	1.0	1.0
+chr1	164714	0.0	1.0	1.0
+chr1	164722	1.0	0.0	1.0
+chr1	164726	0.0	1.0	1.0
+chr1	164731	1.0	0.0	1.0
+chr1	164733	2.0	0.0	2.0
+chr1	164734	0.0	1.0	1.0
+chr1	164739	1.0	0.0	1.0
+chr1	164751	0.0	1.0	1.0
+chr1	164754	0.0	1.0	1.0
+chr1	164760	1.0	0.0	1.0
+chr1	164766	0.0	1.0	1.0
+chr1	164775	1.0	0.0	1.0
+chr1	164777	2.0	0.0	2.0
+chr1	164790	0.0	2.0	2.0
+chr1	164794	2.0	3.0	5.0
+chr1	164798	1.0	0.0	1.0
+chr1	164800	3.0	0.0	3.0
+chr1	164809	0.0	1.0	1.0
+chr1	164810	1.0	0.0	1.0
+chr1	164813	1.0	0.0	1.0
+chr1	164814	0.0	2.0	2.0
+chr1	164815	2.0	0.0	2.0
+chr1	164818	0.0	3.0	3.0
+chr1	164819	1.0	0.0	1.0
+chr1	164820	2.0	0.0	2.0
+chr1	164821	4.0	0.0	4.0
+chr1	164822	0.0	3.0	3.0
+chr1	164823	0.0	3.0	3.0
+chr1	164824	0.0	5.0	5.0
+chr1	164825	0.0	3.0	3.0
+chr1	164831	0.0	1.0	1.0
+chr1	164833	0.0	1.0	1.0
+chr1	164835	2.0	0.0	2.0
+chr1	164836	1.0	0.0	1.0
+chr1	164839	1.0	0.0	1.0
+chr1	164841	0.0	6.0	6.0
+chr1	164843	2.0	2.0	4.0
+chr1	164845	1.0	1.0	2.0
+chr1	164850	0.0	4.0	4.0
+chr1	164852	0.0	2.0	2.0
+chr1	164854	1.0	8.0	9.0
+chr1	164855	2.0	0.0	2.0
+chr1	164862	0.0	1.0	1.0
+chr1	164866	1.0	0.0	1.0
+chr1	164867	2.0	0.0	2.0
+chr1	164874	5.0	0.0	5.0
+chr1	164876	0.0	1.0	1.0
+chr1	164878	0.0	1.0	1.0
+chr1	164879	2.0	0.0	2.0
+chr1	164880	0.0	1.0	1.0
+chr1	164884	0.0	1.0	1.0
+chr1	164885	0.0	1.0	1.0
+chr1	164896	0.0	1.0	1.0
+chr1	164898	1.0	0.0	1.0
+chr1	164903	0.0	1.0	1.0
+chr1	164906	1.0	0.0	1.0
+chr1	164909	0.0	1.0	1.0
+chr1	164922	1.0	0.0	1.0
+chr1	164928	1.0	0.0	1.0
+chr1	164934	0.0	1.0	1.0
+chr1	164948	1.0	0.0	1.0
+chr1	164949	1.0	1.0	2.0
+chr1	164951	1.0	0.0	1.0
+chr1	164954	0.0	3.0	3.0
+chr1	164955	1.0	0.0	1.0
+chr1	164957	0.0	2.0	2.0
+chr1	164960	0.0	1.0	1.0
+chr1	164961	0.0	5.0	5.0
+chr1	164962	2.0	2.0	4.0
+chr1	164963	0.0	1.0	1.0
+chr1	164965	5.0	1.0	6.0
+chr1	164966	0.0	2.0	2.0
+chr1	164972	0.0	5.0	5.0
+chr1	164979	2.0	0.0	2.0
+chr1	164980	4.0	0.0	4.0
+chr1	164981	2.0	0.0	2.0
+chr1	164982	8.0	0.0	8.0
+chr1	164983	2.0	0.0	2.0
+chr1	164985	0.0	4.0	4.0
+chr1	164986	0.0	4.0	4.0
+chr1	164987	1.0	0.0	1.0
+chr1	164988	0.0	6.0	6.0
+chr1	164991	4.0	0.0	4.0
+chr1	164992	1.0	0.0	1.0
+chr1	164993	1.0	0.0	1.0
+chr1	164994	0.0	1.0	1.0
+chr1	164995	0.0	3.0	3.0
+chr1	164996	1.0	1.0	2.0
+chr1	164998	1.0	0.0	1.0
+chr1	165001	0.0	2.0	2.0
+chr1	165003	0.0	5.0	5.0
+chr1	165004	1.0	1.0	2.0
+chr1	165005	1.0	1.0	2.0
+chr1	165006	1.0	0.0	1.0
+chr1	165007	1.0	0.0	1.0
+chr1	165008	5.0	2.0	7.0
+chr1	165009	11.0	0.0	11.0
+chr1	165010	1.0	2.0	3.0
+chr1	165012	1.0	2.0	3.0
+chr1	165013	0.0	1.0	1.0
+chr1	165014	3.0	3.0	6.0
+chr1	165015	0.0	1.0	1.0
+chr1	165019	0.0	10.0	10.0
+chr1	165020	0.0	6.0	6.0
+chr1	165021	0.0	4.0	4.0
+chr1	165022	3.0	1.0	4.0
+chr1	165023	0.0	3.0	3.0
+chr1	165024	0.0	10.0	10.0
+chr1	165025	1.0	0.0	1.0
+chr1	165026	6.0	0.0	6.0
+chr1	165027	1.0	14.0	15.0
+chr1	165028	7.0	2.0	9.0
+chr1	165032	2.0	0.0	2.0
+chr1	165033	4.0	0.0	4.0
+chr1	165034	3.0	3.0	6.0
+chr1	165035	3.0	1.0	4.0
+chr1	165036	4.0	0.0	4.0
+chr1	165037	16.0	0.0	16.0
+chr1	165038	1.0	4.0	5.0
+chr1	165039	0.0	3.0	3.0
+chr1	165041	0.0	1.0	1.0
+chr1	165042	0.0	6.0	6.0
+chr1	165043	1.0	0.0	1.0
+chr1	165044	1.0	0.0	1.0
+chr1	165045	1.0	1.0	2.0
+chr1	165046	5.0	0.0	5.0
+chr1	165049	5.0	2.0	7.0
+chr1	165052	0.0	1.0	1.0
+chr1	165053	0.0	1.0	1.0
+chr1	165055	1.0	0.0	1.0
+chr1	165056	0.0	1.0	1.0
+chr1	165059	0.0	3.0	3.0
+chr1	165060	0.0	1.0	1.0
+chr1	165062	2.0	0.0	2.0
+chr1	165064	3.0	0.0	3.0
+chr1	165067	1.0	0.0	1.0
+chr1	165068	3.0	0.0	3.0
+chr1	165070	1.0	0.0	1.0
+chr1	165071	0.0	1.0	1.0
+chr1	165092	0.0	1.0	1.0
+chr1	165096	0.0	1.0	1.0
+chr1	165100	0.0	4.0	4.0
+chr1	165102	0.0	1.0	1.0
+chr1	165112	4.0	1.0	5.0
+chr1	165113	2.0	0.0	2.0
+chr1	165114	7.0	3.0	10.0
+chr1	165115	0.0	5.0	5.0
+chr1	165117	0.0	2.0	2.0
+chr1	165119	0.0	1.0	1.0
+chr1	165121	4.0	0.0	4.0
+chr1	165122	4.0	0.0	4.0
+chr1	165126	2.0	0.0	2.0
+chr1	165130	0.0	3.0	3.0
+chr1	165131	0.0	6.0	6.0
+chr1	165132	0.0	2.0	2.0
+chr1	165133	0.0	1.0	1.0
+chr1	165135	3.0	0.0	3.0
+chr1	165136	4.0	0.0	4.0
+chr1	165138	1.0	0.0	1.0
+chr1	165143	7.0	1.0	8.0
+chr1	165145	4.0	0.0	4.0
+chr1	165147	0.0	1.0	1.0
+chr1	165149	2.0	3.0	5.0
+chr1	165150	4.0	1.0	5.0
+chr1	165153	3.0	1.0	4.0
+chr1	165154	0.0	2.0	2.0
+chr1	165155	1.0	0.0	1.0
+chr1	165156	4.0	2.0	6.0
+chr1	165158	0.0	1.0	1.0
+chr1	165162	6.0	0.0	6.0
+chr1	165163	0.0	2.0	2.0
+chr1	165168	0.0	1.0	1.0
+chr1	165172	0.0	1.0	1.0
+chr1	165174	4.0	0.0	4.0
+chr1	165176	1.0	2.0	3.0
+chr1	165178	0.0	1.0	1.0
+chr1	165180	6.0	2.0	8.0
+chr1	165181	3.0	4.0	7.0
+chr1	165182	0.0	3.0	3.0
+chr1	165183	0.0	1.0	1.0
+chr1	165186	0.0	2.0	2.0
+chr1	165191	1.0	0.0	1.0
+chr1	165192	2.0	9.0	11.0
+chr1	165193	1.0	1.0	2.0
+chr1	165194	0.0	1.0	1.0
+chr1	165195	0.0	1.0	1.0
+chr1	165196	1.0	0.0	1.0
+chr1	165199	6.0	0.0	6.0
+chr1	165200	7.0	0.0	7.0
+chr1	165201	4.0	0.0	4.0
+chr1	165204	0.0	1.0	1.0
+chr1	165207	0.0	3.0	3.0
+chr1	165208	1.0	1.0	2.0
+chr1	165209	2.0	0.0	2.0
+chr1	165210	17.0	0.0	17.0
+chr1	165212	1.0	3.0	4.0
+chr1	165213	4.0	0.0	4.0
+chr1	165214	1.0	6.0	7.0
+chr1	165215	0.0	2.0	2.0
+chr1	165216	0.0	6.0	6.0
+chr1	165217	1.0	1.0	2.0
+chr1	165219	6.0	3.0	9.0
+chr1	165220	1.0	8.0	9.0
+chr1	165221	0.0	4.0	4.0
+chr1	165222	1.0	0.0	1.0
+chr1	165223	3.0	0.0	3.0
+chr1	165226	0.0	1.0	1.0
+chr1	165229	1.0	1.0	2.0
+chr1	165231	0.0	1.0	1.0
+chr1	165232	0.0	12.0	12.0
+chr1	165233	0.0	3.0	3.0
+chr1	165234	0.0	1.0	1.0
+chr1	165235	2.0	0.0	2.0
+chr1	165236	0.0	1.0	1.0
+chr1	165239	1.0	0.0	1.0
+chr1	165245	0.0	3.0	3.0
+chr1	165246	0.0	2.0	2.0
+chr1	165249	1.0	0.0	1.0
+chr1	165251	1.0	0.0	1.0
+chr1	165252	0.0	1.0	1.0
+chr1	165253	2.0	0.0	2.0
+chr1	165258	0.0	1.0	1.0
+chr1	165259	0.0	3.0	3.0
+chr1	165264	2.0	1.0	3.0
+chr1	165266	1.0	0.0	1.0
+chr1	165270	1.0	0.0	1.0
+chr1	165271	1.0	0.0	1.0
+chr1	165272	2.0	0.0	2.0
+chr1	165275	0.0	1.0	1.0
+chr1	165280	1.0	0.0	1.0
+chr1	165283	1.0	0.0	1.0
+chr1	165287	0.0	1.0	1.0
+chr1	165291	0.0	1.0	1.0
+chr1	165292	0.0	7.0	7.0
+chr1	165297	2.0	0.0	2.0
+chr1	165304	1.0	1.0	2.0
+chr1	165308	0.0	2.0	2.0
+chr1	165309	1.0	0.0	1.0
+chr1	165313	0.0	1.0	1.0
+chr1	165316	1.0	0.0	1.0
+chr1	165322	1.0	0.0	1.0
+chr1	165323	2.0	0.0	2.0
+chr1	165326	0.0	1.0	1.0
+chr1	165332	0.0	5.0	5.0
+chr1	165333	0.0	3.0	3.0
+chr1	165335	1.0	0.0	1.0
+chr1	165336	0.0	1.0	1.0
+chr1	165338	0.0	2.0	2.0
+chr1	165339	0.0	2.0	2.0
+chr1	165342	1.0	0.0	1.0
+chr1	165343	2.0	0.0	2.0
+chr1	165344	9.0	3.0	12.0
+chr1	165345	2.0	3.0	5.0
+chr1	165346	1.0	1.0	2.0
+chr1	165351	0.0	1.0	1.0
+chr1	165353	0.0	1.0	1.0
+chr1	165355	1.0	2.0	3.0
+chr1	165356	1.0	0.0	1.0
+chr1	165358	1.0	0.0	1.0
+chr1	165361	1.0	0.0	1.0
+chr1	165362	0.0	1.0	1.0
+chr1	165366	0.0	3.0	3.0
+chr1	165367	1.0	0.0	1.0
+chr1	165368	0.0	1.0	1.0
+chr1	165369	1.0	0.0	1.0
+chr1	165370	1.0	0.0	1.0
+chr1	165371	0.0	3.0	3.0
+chr1	165372	4.0	0.0	4.0
+chr1	165373	10.0	5.0	15.0
+chr1	165375	0.0	1.0	1.0
+chr1	165376	1.0	0.0	1.0
+chr1	165378	1.0	0.0	1.0
+chr1	165379	3.0	1.0	4.0
+chr1	165380	6.0	1.0	7.0
+chr1	165381	0.0	1.0	1.0
+chr1	165382	2.0	0.0	2.0
+chr1	165383	1.0	0.0	1.0
+chr1	165384	0.0	14.0	14.0
+chr1	165385	19.0	2.0	21.0
+chr1	165386	12.0	0.0	12.0
+chr1	165387	12.0	13.0	25.0
+chr1	165388	4.0	0.0	4.0
+chr1	165389	0.0	1.0	1.0
+chr1	165390	0.0	3.0	3.0
+chr1	165391	2.0	2.0	4.0
+chr1	165392	1.0	7.0	8.0
+chr1	165393	0.0	3.0	3.0
+chr1	165394	10.0	0.0	10.0
+chr1	165395	11.0	5.0	16.0
+chr1	165396	0.0	16.0	16.0
+chr1	165397	11.0	12.0	23.0
+chr1	165398	1.0	1.0	2.0
+chr1	165399	7.0	0.0	7.0
+chr1	165400	9.0	1.0	10.0
+chr1	165402	6.0	0.0	6.0
+chr1	165404	0.0	3.0	3.0
+chr1	165405	1.0	16.0	17.0
+chr1	165406	12.0	5.0	17.0
+chr1	165407	19.0	0.0	19.0
+chr1	165409	0.0	2.0	2.0
+chr1	165410	3.0	2.0	5.0
+chr1	165411	0.0	3.0	3.0
+chr1	165412	1.0	0.0	1.0
+chr1	165413	0.0	18.0	18.0
+chr1	165414	0.0	9.0	9.0
+chr1	165415	0.0	1.0	1.0
+chr1	165416	2.0	0.0	2.0
+chr1	165417	2.0	0.0	2.0
+chr1	165418	2.0	1.0	3.0
+chr1	165420	1.0	0.0	1.0
+chr1	165421	5.0	0.0	5.0
+chr1	165422	23.0	0.0	23.0
+chr1	165423	2.0	2.0	4.0
+chr1	165425	1.0	0.0	1.0
+chr1	165428	0.0	2.0	2.0
+chr1	165429	0.0	9.0	9.0
+chr1	165430	0.0	3.0	3.0
+chr1	165431	0.0	2.0	2.0
+chr1	165433	2.0	9.0	11.0
+chr1	165434	0.0	2.0	2.0
+chr1	165436	0.0	4.0	4.0
+chr1	165437	0.0	3.0	3.0
+chr1	165442	0.0	1.0	1.0
+chr1	165445	3.0	8.0	11.0
+chr1	165446	11.0	0.0	11.0
+chr1	165447	0.0	2.0	2.0
+chr1	165449	0.0	1.0	1.0
+chr1	165450	0.0	1.0	1.0
+chr1	165451	0.0	3.0	3.0
+chr1	165452	2.0	1.0	3.0
+chr1	165458	1.0	1.0	2.0
+chr1	165459	5.0	2.0	7.0
+chr1	165460	1.0	1.0	2.0
+chr1	165461	3.0	0.0	3.0
+chr1	165463	1.0	0.0	1.0
+chr1	165465	0.0	1.0	1.0
+chr1	165468	1.0	0.0	1.0
+chr1	165470	2.0	1.0	3.0
+chr1	165472	2.0	0.0	2.0
+chr1	165473	0.0	1.0	1.0
+chr1	165480	1.0	0.0	1.0
+chr1	165483	0.0	1.0	1.0
+chr1	165485	0.0	1.0	1.0
+chr1	165487	1.0	0.0	1.0
+chr1	165488	3.0	0.0	3.0
+chr1	165493	7.0	0.0	7.0
+chr1	165494	4.0	1.0	5.0
+chr1	165495	2.0	0.0	2.0
+chr1	165497	2.0	0.0	2.0
+chr1	165498	0.0	5.0	5.0
+chr1	165501	1.0	0.0	1.0
+chr1	165503	1.0	4.0	5.0
+chr1	165505	0.0	2.0	2.0
+chr1	165506	1.0	0.0	1.0
+chr1	165509	1.0	0.0	1.0
+chr1	165510	0.0	3.0	3.0
+chr1	165512	3.0	0.0	3.0
+chr1	165514	0.0	2.0	2.0
+chr1	165516	0.0	1.0	1.0
+chr1	165519	2.0	0.0	2.0
+chr1	165520	0.0	1.0	1.0
+chr1	165521	1.0	1.0	2.0
+chr1	165523	0.0	7.0	7.0
+chr1	165524	0.0	1.0	1.0
+chr1	165527	1.0	0.0	1.0
+chr1	165528	1.0	0.0	1.0
+chr1	165531	1.0	0.0	1.0
+chr1	165532	0.0	1.0	1.0
+chr1	165533	3.0	0.0	3.0
+chr1	165535	0.0	2.0	2.0
+chr1	165536	2.0	0.0	2.0
+chr1	165537	0.0	1.0	1.0
+chr1	165539	1.0	1.0	2.0
+chr1	165543	1.0	0.0	1.0
+chr1	165544	3.0	0.0	3.0
+chr1	165546	6.0	0.0	6.0
+chr1	165549	0.0	5.0	5.0
+chr1	165552	1.0	0.0	1.0
+chr1	165553	2.0	1.0	3.0
+chr1	165555	5.0	0.0	5.0
+chr1	165557	0.0	4.0	4.0
+chr1	165560	0.0	2.0	2.0
+chr1	165561	7.0	0.0	7.0
+chr1	165563	1.0	0.0	1.0
+chr1	165567	0.0	1.0	1.0
+chr1	165569	1.0	0.0	1.0
+chr1	165575	0.0	1.0	1.0
+chr1	165577	1.0	0.0	1.0
+chr1	165580	1.0	0.0	1.0
+chr1	165582	0.0	1.0	1.0
+chr1	165583	6.0	0.0	6.0
+chr1	165584	4.0	0.0	4.0
+chr1	165594	1.0	0.0	1.0
+chr1	165597	1.0	0.0	1.0
+chr1	165598	1.0	3.0	4.0
+chr1	165599	2.0	2.0	4.0
+chr1	165601	0.0	2.0	2.0
+chr1	165605	1.0	1.0	2.0
+chr1	165606	0.0	2.0	2.0
+chr1	165607	6.0	0.0	6.0
+chr1	165608	4.0	0.0	4.0
+chr1	165609	1.0	0.0	1.0
+chr1	165611	0.0	1.0	1.0
+chr1	165612	0.0	2.0	2.0
+chr1	165614	0.0	2.0	2.0
+chr1	165616	4.0	0.0	4.0
+chr1	165617	7.0	0.0	7.0
+chr1	165620	1.0	0.0	1.0
+chr1	165621	0.0	2.0	2.0
+chr1	165624	0.0	2.0	2.0
+chr1	165627	0.0	1.0	1.0
+chr1	165634	0.0	2.0	2.0
+chr1	165637	4.0	0.0	4.0
+chr1	165640	1.0	0.0	1.0
+chr1	165643	0.0	1.0	1.0
+chr1	165644	1.0	0.0	1.0
+chr1	165647	2.0	0.0	2.0
+chr1	165652	3.0	0.0	3.0
+chr1	165656	0.0	2.0	2.0
+chr1	165657	2.0	7.0	9.0
+chr1	165661	0.0	8.0	8.0
+chr1	165662	5.0	4.0	9.0
+chr1	165663	1.0	0.0	1.0
+chr1	165664	8.0	0.0	8.0
+chr1	165667	1.0	0.0	1.0
+chr1	165668	1.0	1.0	2.0
+chr1	165669	1.0	1.0	2.0
+chr1	165670	1.0	0.0	1.0
+chr1	165671	2.0	0.0	2.0
+chr1	165672	3.0	1.0	4.0
+chr1	165673	12.0	2.0	14.0
+chr1	165677	0.0	2.0	2.0
+chr1	165678	0.0	1.0	1.0
+chr1	165683	4.0	1.0	5.0
+chr1	165689	0.0	3.0	3.0
+chr1	165690	0.0	1.0	1.0
+chr1	165693	0.0	1.0	1.0
+chr1	165694	0.0	1.0	1.0
+chr1	165696	0.0	9.0	9.0
+chr1	165697	0.0	1.0	1.0
+chr1	165699	6.0	0.0	6.0
+chr1	165701	1.0	0.0	1.0
+chr1	165703	0.0	2.0	2.0
+chr1	165705	0.0	3.0	3.0
+chr1	165708	1.0	2.0	3.0
+chr1	165709	0.0	1.0	1.0
+chr1	165710	2.0	0.0	2.0
+chr1	165713	0.0	1.0	1.0
+chr1	165716	16.0	0.0	16.0
+chr1	165718	0.0	1.0	1.0
+chr1	165722	3.0	3.0	6.0
+chr1	165723	1.0	0.0	1.0
+chr1	165724	0.0	5.0	5.0
+chr1	165725	3.0	1.0	4.0
+chr1	165726	0.0	1.0	1.0
+chr1	165728	3.0	1.0	4.0
+chr1	165731	1.0	2.0	3.0
+chr1	165735	1.0	0.0	1.0
+chr1	165737	1.0	1.0	2.0
+chr1	165738	4.0	0.0	4.0
+chr1	165742	1.0	0.0	1.0
+chr1	165747	1.0	0.0	1.0
+chr1	165749	4.0	2.0	6.0
+chr1	165753	0.0	1.0	1.0
+chr1	165754	0.0	5.0	5.0
+chr1	165755	1.0	0.0	1.0
+chr1	165756	0.0	1.0	1.0
+chr1	165757	0.0	1.0	1.0
+chr1	165758	0.0	5.0	5.0
+chr1	165759	0.0	1.0	1.0
+chr1	165760	1.0	0.0	1.0
+chr1	165763	1.0	0.0	1.0
+chr1	165764	1.0	3.0	4.0
+chr1	165767	1.0	3.0	4.0
+chr1	165771	1.0	0.0	1.0
+chr1	165773	1.0	0.0	1.0
+chr1	165774	0.0	1.0	1.0
+chr1	165775	1.0	1.0	2.0
+chr1	165776	1.0	1.0	2.0
+chr1	165778	0.0	1.0	1.0
+chr1	165787	0.0	1.0	1.0
+chr1	165789	0.0	1.0	1.0
+chr1	165790	3.0	0.0	3.0
+chr1	165795	0.0	1.0	1.0
+chr1	165796	1.0	2.0	3.0
+chr1	165797	1.0	1.0	2.0
+chr1	165808	2.0	1.0	3.0
+chr1	165821	0.0	1.0	1.0
+chr1	165823	1.0	0.0	1.0
+chr1	165825	0.0	2.0	2.0
+chr1	165830	0.0	1.0	1.0
+chr1	165834	0.0	1.0	1.0
+chr1	165837	1.0	0.0	1.0
+chr1	165843	3.0	0.0	3.0
+chr1	165844	2.0	0.0	2.0
+chr1	165845	1.0	0.0	1.0
+chr1	165847	0.0	2.0	2.0
+chr1	165852	2.0	3.0	5.0
+chr1	165853	0.0	2.0	2.0
+chr1	165859	1.0	1.0	2.0
+chr1	165860	0.0	1.0	1.0
+chr1	165861	2.0	0.0	2.0
+chr1	165862	4.0	0.0	4.0
+chr1	165863	0.0	3.0	3.0
+chr1	165864	0.0	1.0	1.0
+chr1	165867	0.0	2.0	2.0
+chr1	165868	1.0	1.0	2.0
+chr1	165871	1.0	1.0	2.0
+chr1	165872	2.0	0.0	2.0
+chr1	165873	0.0	3.0	3.0
+chr1	165874	0.0	1.0	1.0
+chr1	165875	2.0	0.0	2.0
+chr1	165876	0.0	5.0	5.0
+chr1	165877	0.0	17.0	17.0
+chr1	165878	2.0	1.0	3.0
+chr1	165879	1.0	0.0	1.0
+chr1	165881	0.0	1.0	1.0
+chr1	165885	0.0	1.0	1.0
+chr1	165886	0.0	1.0	1.0
+chr1	165888	0.0	1.0	1.0
+chr1	165889	0.0	1.0	1.0
+chr1	165890	0.0	1.0	1.0
+chr1	165892	0.0	1.0	1.0
+chr1	165894	0.0	1.0	1.0
+chr1	165898	0.0	1.0	1.0
+chr1	165900	5.0	0.0	5.0
+chr1	165902	0.0	1.0	1.0
+chr1	165904	0.0	1.0	1.0
+chr1	165907	5.0	0.0	5.0
+chr1	165910	0.0	2.0	2.0
+chr1	165912	2.0	0.0	2.0
+chr1	165918	1.0	3.0	4.0
+chr1	165919	0.0	1.0	1.0
+chr1	165920	1.0	1.0	2.0
+chr1	165923	1.0	0.0	1.0
+chr1	165929	0.0	1.0	1.0
+chr1	165950	1.0	0.0	1.0
+chr1	165956	1.0	0.0	1.0
+chr1	165967	1.0	0.0	1.0
+chr1	165968	1.0	0.0	1.0
+chr1	165969	1.0	0.0	1.0
+chr1	165978	1.0	0.0	1.0
+chr1	165979	0.0	1.0	1.0
+chr1	165980	3.0	0.0	3.0
+chr1	166000	0.0	1.0	1.0
+chr1	166001	1.0	0.0	1.0
+chr1	166002	2.0	0.0	2.0
+chr1	166006	2.0	0.0	2.0
+chr1	166007	1.0	0.0	1.0
+chr1	166013	1.0	0.0	1.0
+chr1	166027	0.0	1.0	1.0
+chr1	166028	2.0	1.0	3.0
+chr1	166034	1.0	2.0	3.0
+chr1	166035	1.0	0.0	1.0
+chr1	166036	2.0	1.0	3.0
+chr1	166044	0.0	1.0	1.0
+chr1	166046	0.0	1.0	1.0
+chr1	166056	0.0	1.0	1.0
+chr1	166062	1.0	0.0	1.0
+chr1	166064	1.0	0.0	1.0
+chr1	166066	0.0	1.0	1.0
+chr1	166069	0.0	1.0	1.0
+chr1	166076	0.0	1.0	1.0
+chr1	166080	5.0	0.0	5.0
+chr1	166083	1.0	0.0	1.0
+chr1	166084	2.0	0.0	2.0
+chr1	166086	1.0	0.0	1.0
+chr1	166087	1.0	1.0	2.0
+chr1	166090	0.0	5.0	5.0
+chr1	166098	6.0	0.0	6.0
+chr1	166099	3.0	0.0	3.0
+chr1	166100	0.0	1.0	1.0
+chr1	166102	1.0	0.0	1.0
+chr1	166103	2.0	0.0	2.0
+chr1	166104	1.0	0.0	1.0
+chr1	166114	2.0	0.0	2.0
+chr1	166134	2.0	0.0	2.0
+chr1	166138	1.0	0.0	1.0
+chr1	166139	1.0	0.0	1.0
+chr1	166142	1.0	0.0	1.0
+chr1	166452	1.0	0.0	1.0
+chr1	166698	1.0	0.0	1.0
+chr1	167014	0.0	2.0	2.0
+chr1	167261	1.0	0.0	1.0
+chr1	167318	0.0	1.0	1.0
+chr1	167330	3.0	0.0	3.0
+chr1	167358	2.0	0.0	2.0
+chr1	167443	0.0	1.0	1.0
+chr1	167474	1.0	0.0	1.0
+chr1	167583	0.0	1.0	1.0
+chr1	168154	1.0	0.0	1.0
+chr1	168160	0.0	1.0	1.0
+chr1	168185	0.0	1.0	1.0
+chr1	168294	1.0	0.0	1.0
+chr1	168310	0.0	1.0	1.0
+chr1	168627	0.0	1.0	1.0
+chr1	168783	0.0	1.0	1.0
+chr1	168784	0.0	2.0	2.0
+chr1	168793	1.0	0.0	1.0
+chr1	168794	0.0	1.0	1.0
+chr1	168806	1.0	0.0	1.0
+chr1	168809	2.0	0.0	2.0
+chr1	168810	1.0	0.0	1.0
+chr1	168858	1.0	0.0	1.0
+chr1	168928	0.0	1.0	1.0
+chr1	168930	0.0	1.0	1.0
+chr1	168938	1.0	0.0	1.0
+chr1	168946	3.0	0.0	3.0
+chr1	168952	0.0	1.0	1.0
+chr1	168958	0.0	2.0	2.0
+chr1	168961	0.0	3.0	3.0
+chr1	168962	2.0	0.0	2.0
+chr1	168963	3.0	0.0	3.0
+chr1	168964	2.0	0.0	2.0
+chr1	168966	1.0	3.0	4.0
+chr1	168967	3.0	1.0	4.0
+chr1	168968	1.0	2.0	3.0
+chr1	168969	2.0	0.0	2.0
+chr1	168970	2.0	0.0	2.0
+chr1	168971	2.0	0.0	2.0
+chr1	168973	4.0	4.0	8.0
+chr1	168974	5.0	0.0	5.0
+chr1	168975	1.0	1.0	2.0
+chr1	168976	0.0	3.0	3.0
+chr1	168977	0.0	1.0	1.0
+chr1	168981	2.0	0.0	2.0
+chr1	168982	1.0	6.0	7.0
+chr1	168983	1.0	4.0	5.0
+chr1	168984	1.0	0.0	1.0
+chr1	168985	0.0	3.0	3.0
+chr1	168988	1.0	0.0	1.0
+chr1	168992	1.0	0.0	1.0
+chr1	168994	1.0	0.0	1.0
+chr1	168997	0.0	1.0	1.0
+chr1	169001	0.0	1.0	1.0
+chr1	169007	0.0	4.0	4.0
+chr1	169025	1.0	0.0	1.0
+chr1	169263	1.0	0.0	1.0
+chr1	169411	0.0	1.0	1.0
+chr1	169413	0.0	1.0	1.0
+chr1	169415	1.0	0.0	1.0
+chr1	169420	0.0	2.0	2.0
+chr1	169435	1.0	0.0	1.0
+chr1	169591	1.0	0.0	1.0
+chr1	169601	0.0	1.0	1.0
+chr1	169616	0.0	2.0	2.0
+chr1	169715	0.0	1.0	1.0
+chr1	169779	2.0	0.0	2.0
+chr1	169904	0.0	1.0	1.0
+chr1	169914	0.0	1.0	1.0
+chr1	169944	0.0	1.0	1.0
+chr1	170153	0.0	1.0	1.0
+chr1	170321	1.0	0.0	1.0
+chr1	170643	0.0	1.0	1.0
+chr1	170691	0.0	1.0	1.0
+chr1	170713	0.0	1.0	1.0
+chr1	170830	1.0	0.0	1.0
+chr1	170865	0.0	1.0	1.0
+chr1	170894	0.0	1.0	1.0
+chr1	170959	0.0	1.0	1.0
+chr1	171015	1.0	0.0	1.0
+chr1	171168	1.0	0.0	1.0
+chr1	171235	2.0	0.0	2.0
+chr1	171239	1.0	0.0	1.0
+chr1	171374	0.0	1.0	1.0
+chr1	171474	0.0	1.0	1.0
+chr1	171515	1.0	0.0	1.0
+chr1	171524	1.0	0.0	1.0
+chr1	171526	1.0	0.0	1.0
+chr1	171530	1.0	0.0	1.0
+chr1	171638	0.0	1.0	1.0
+chr1	171643	0.0	1.0	1.0
+chr1	171665	1.0	1.0	2.0
+chr1	171667	0.0	1.0	1.0
+chr1	171669	0.0	1.0	1.0
+chr1	171670	2.0	0.0	2.0
+chr1	171672	0.0	2.0	2.0
+chr1	171678	0.0	1.0	1.0
+chr1	171682	2.0	0.0	2.0
+chr1	171683	1.0	0.0	1.0
+chr1	171684	3.0	0.0	3.0
+chr1	171685	2.0	0.0	2.0
+chr1	171686	2.0	0.0	2.0
+chr1	171695	0.0	2.0	2.0
+chr1	171696	0.0	1.0	1.0
+chr1	171697	0.0	1.0	1.0
+chr1	171703	0.0	5.0	5.0
+chr1	171704	0.0	1.0	1.0
+chr1	171705	1.0	0.0	1.0
+chr1	171943	1.0	0.0	1.0
+chr1	172311	0.0	1.0	1.0
+chr1	172458	0.0	1.0	1.0
+chr1	172480	0.0	1.0	1.0
+chr1	172494	1.0	0.0	1.0
+chr1	172843	0.0	1.0	1.0
+chr1	172855	0.0	1.0	1.0
+chr1	172993	0.0	3.0	3.0
+chr1	173235	1.0	0.0	1.0
+chr1	173442	0.0	1.0	1.0
+chr1	174473	1.0	0.0	1.0
+chr1	174706	0.0	1.0	1.0
+chr1	174759	0.0	1.0	1.0
+chr1	174768	1.0	0.0	1.0
+chr1	174776	1.0	0.0	1.0
+chr1	174787	0.0	1.0	1.0
+chr1	174815	1.0	0.0	1.0
+chr1	174935	1.0	0.0	1.0
+chr1	174945	1.0	0.0	1.0
+chr1	174953	0.0	1.0	1.0
+chr1	175063	0.0	1.0	1.0
+chr1	175078	0.0	1.0	1.0
+chr1	175083	1.0	0.0	1.0
+chr1	175086	0.0	2.0	2.0
+chr1	175092	0.0	1.0	1.0
+chr1	175093	0.0	1.0	1.0
+chr1	175094	2.0	1.0	3.0
+chr1	175096	1.0	0.0	1.0
+chr1	175097	0.0	1.0	1.0
+chr1	175099	0.0	1.0	1.0
+chr1	175101	1.0	0.0	1.0
+chr1	175102	4.0	0.0	4.0
+chr1	175103	0.0	1.0	1.0
+chr1	175104	1.0	0.0	1.0
+chr1	175105	2.0	0.0	2.0
+chr1	175107	2.0	0.0	2.0
+chr1	175109	0.0	1.0	1.0
+chr1	175110	1.0	0.0	1.0
+chr1	175115	2.0	0.0	2.0
+chr1	175116	2.0	0.0	2.0
+chr1	175117	0.0	1.0	1.0
+chr1	175120	0.0	1.0	1.0
+chr1	175123	0.0	6.0	6.0
+chr1	175124	1.0	0.0	1.0
+chr1	175126	0.0	2.0	2.0
+chr1	175127	0.0	1.0	1.0
+chr1	175128	1.0	0.0	1.0
+chr1	175129	0.0	6.0	6.0
+chr1	175130	1.0	1.0	2.0
+chr1	175132	0.0	4.0	4.0
+chr1	175133	0.0	1.0	1.0
+chr1	175134	0.0	2.0	2.0
+chr1	175136	6.0	0.0	6.0
+chr1	175139	0.0	2.0	2.0
+chr1	175160	0.0	1.0	1.0
+chr1	175172	1.0	0.0	1.0
+chr1	175286	0.0	1.0	1.0
+chr1	175292	1.0	0.0	1.0
+chr1	175309	1.0	0.0	1.0
+chr1	175311	1.0	0.0	1.0
+chr1	175320	3.0	0.0	3.0
+chr1	175326	1.0	0.0	1.0
+chr1	175327	1.0	2.0	3.0
+chr1	175328	1.0	1.0	2.0
+chr1	175329	1.0	0.0	1.0
+chr1	175334	0.0	4.0	4.0
+chr1	175335	1.0	0.0	1.0
+chr1	175336	2.0	0.0	2.0
+chr1	175337	0.0	2.0	2.0
+chr1	175339	0.0	2.0	2.0
+chr1	175342	0.0	1.0	1.0
+chr1	175347	2.0	0.0	2.0
+chr1	175352	0.0	2.0	2.0
+chr1	175355	3.0	1.0	4.0
+chr1	175358	0.0	1.0	1.0
+chr1	175360	0.0	3.0	3.0
+chr1	175361	0.0	1.0	1.0
+chr1	175363	1.0	0.0	1.0
+chr1	175365	1.0	0.0	1.0
+chr1	175367	0.0	1.0	1.0
+chr1	175371	0.0	4.0	4.0
+chr1	175376	0.0	1.0	1.0
+chr1	175379	1.0	0.0	1.0
+chr1	175501	0.0	2.0	2.0
+chr1	175511	0.0	1.0	1.0
+chr1	175512	0.0	1.0	1.0
+chr1	175518	1.0	0.0	1.0
+chr1	175525	0.0	1.0	1.0
+chr1	175526	1.0	0.0	1.0
+chr1	175531	0.0	1.0	1.0
+chr1	175534	0.0	1.0	1.0
+chr1	175548	1.0	0.0	1.0
+chr1	175710	1.0	0.0	1.0
+chr1	175713	0.0	1.0	1.0
+chr1	176178	1.0	0.0	1.0
+chr1	176339	1.0	0.0	1.0
+chr1	176363	0.0	2.0	2.0
+chr1	176365	1.0	0.0	1.0
+chr1	176403	0.0	1.0	1.0
+chr1	176678	0.0	1.0	1.0
+chr1	176686	0.0	1.0	1.0
+chr1	176687	0.0	1.0	1.0
+chr1	176704	0.0	4.0	4.0
+chr1	176707	0.0	2.0	2.0
+chr1	176716	1.0	1.0	2.0
+chr1	176717	0.0	1.0	1.0
+chr1	176724	2.0	0.0	2.0
+chr1	176725	3.0	5.0	8.0
+chr1	176726	0.0	4.0	4.0
+chr1	176728	0.0	1.0	1.0
+chr1	176731	0.0	3.0	3.0
+chr1	176732	4.0	1.0	5.0
+chr1	176735	2.0	2.0	4.0
+chr1	176736	2.0	2.0	4.0
+chr1	176738	2.0	0.0	2.0
+chr1	176739	0.0	2.0	2.0
+chr1	176740	1.0	1.0	2.0
+chr1	176741	0.0	11.0	11.0
+chr1	176743	1.0	0.0	1.0
+chr1	176745	0.0	1.0	1.0
+chr1	176746	1.0	2.0	3.0
+chr1	176747	1.0	0.0	1.0
+chr1	176751	0.0	1.0	1.0
+chr1	176753	0.0	3.0	3.0
+chr1	176754	0.0	1.0	1.0
+chr1	176756	2.0	2.0	4.0
+chr1	176757	1.0	0.0	1.0
+chr1	176762	2.0	0.0	2.0
+chr1	176766	0.0	1.0	1.0
+chr1	176769	1.0	0.0	1.0
+chr1	176771	0.0	1.0	1.0
+chr1	176775	1.0	0.0	1.0
+chr1	176777	0.0	1.0	1.0
+chr1	176780	1.0	0.0	1.0
+chr1	176782	0.0	1.0	1.0
+chr1	176791	0.0	1.0	1.0
+chr1	176805	1.0	0.0	1.0
+chr1	176811	0.0	1.0	1.0
+chr1	176813	0.0	1.0	1.0
+chr1	176814	0.0	1.0	1.0
+chr1	176816	1.0	0.0	1.0
+chr1	176822	0.0	1.0	1.0
+chr1	176823	0.0	1.0	1.0
+chr1	176826	2.0	0.0	2.0
+chr1	176836	0.0	2.0	2.0
+chr1	176845	0.0	2.0	2.0
+chr1	176856	3.0	0.0	3.0
+chr1	176857	2.0	0.0	2.0
+chr1	176872	2.0	0.0	2.0
+chr1	176883	1.0	0.0	1.0
+chr1	176889	1.0	0.0	1.0
+chr1	176892	1.0	0.0	1.0
+chr1	176894	3.0	0.0	3.0
+chr1	176895	4.0	0.0	4.0
+chr1	176907	1.0	0.0	1.0
+chr1	176912	1.0	0.0	1.0
+chr1	176921	0.0	1.0	1.0
+chr1	176925	1.0	0.0	1.0
+chr1	176937	0.0	2.0	2.0
+chr1	176944	1.0	0.0	1.0
+chr1	176947	0.0	2.0	2.0
+chr1	176948	0.0	1.0	1.0
+chr1	176970	1.0	0.0	1.0
+chr1	176976	2.0	0.0	2.0
+chr1	176981	0.0	1.0	1.0
+chr1	176985	1.0	0.0	1.0
+chr1	176988	1.0	0.0	1.0
+chr1	176994	1.0	0.0	1.0
+chr1	176996	1.0	0.0	1.0
+chr1	176997	2.0	0.0	2.0
+chr1	177003	1.0	0.0	1.0
+chr1	177004	0.0	1.0	1.0
+chr1	177010	0.0	1.0	1.0
+chr1	177012	1.0	0.0	1.0
+chr1	177049	0.0	1.0	1.0
+chr1	177143	0.0	1.0	1.0
+chr1	177172	0.0	1.0	1.0
+chr1	177187	0.0	1.0	1.0
+chr1	177305	1.0	0.0	1.0
+chr1	177318	0.0	1.0	1.0
+chr1	177339	1.0	0.0	1.0
+chr1	177372	0.0	1.0	1.0
+chr1	177421	1.0	0.0	1.0
+chr1	177567	1.0	0.0	1.0
+chr1	177581	1.0	0.0	1.0
+chr1	177583	1.0	0.0	1.0
+chr1	177590	1.0	0.0	1.0
+chr1	177591	0.0	1.0	1.0
+chr1	177592	1.0	0.0	1.0
+chr1	177601	2.0	0.0	2.0
+chr1	177602	1.0	0.0	1.0
+chr1	177604	0.0	1.0	1.0
+chr1	177651	1.0	0.0	1.0
+chr1	177652	1.0	0.0	1.0
+chr1	177701	1.0	0.0	1.0
+chr1	177762	1.0	0.0	1.0
+chr1	177764	1.0	0.0	1.0
+chr1	177821	3.0	0.0	3.0
+chr1	177838	0.0	1.0	1.0
+chr1	177878	1.0	0.0	1.0
+chr1	177908	0.0	1.0	1.0
+chr1	177937	0.0	1.0	1.0
+chr1	177947	1.0	0.0	1.0
+chr1	178050	0.0	2.0	2.0
+chr1	178088	0.0	1.0	1.0
+chr1	178134	1.0	0.0	1.0
+chr1	178251	1.0	0.0	1.0
+chr1	178293	1.0	0.0	1.0
+chr1	178498	0.0	1.0	1.0
+chr1	178586	0.0	1.0	1.0
+chr1	178589	0.0	1.0	1.0
+chr1	178734	2.0	0.0	2.0
+chr1	178741	1.0	0.0	1.0
+chr1	178869	0.0	1.0	1.0
+chr1	178877	1.0	0.0	1.0
+chr1	178970	1.0	0.0	1.0
+chr1	179063	0.0	1.0	1.0
+chr1	179087	0.0	1.0	1.0
+chr1	179322	1.0	0.0	1.0
+chr1	179357	1.0	0.0	1.0
+chr1	179358	1.0	0.0	1.0
+chr1	179374	1.0	0.0	1.0
+chr1	179379	0.0	1.0	1.0
+chr1	179396	1.0	0.0	1.0
+chr1	179444	0.0	1.0	1.0
+chr1	179449	1.0	0.0	1.0
+chr1	179510	0.0	3.0	3.0
+chr1	179557	1.0	0.0	1.0
+chr1	179558	1.0	0.0	1.0
+chr1	179563	1.0	0.0	1.0
+chr1	179620	1.0	0.0	1.0
+chr1	179683	1.0	0.0	1.0
+chr1	179692	0.0	1.0	1.0
+chr1	179694	1.0	0.0	1.0
+chr1	179703	1.0	0.0	1.0
+chr1	179723	1.0	0.0	1.0
+chr1	179732	1.0	0.0	1.0
+chr1	179738	1.0	0.0	1.0
+chr1	179761	0.0	1.0	1.0
+chr1	179850	1.0	0.0	1.0
+chr1	179862	2.0	0.0	2.0
+chr1	179868	0.0	1.0	1.0
+chr1	179872	1.0	0.0	1.0
+chr1	179875	2.0	0.0	2.0
+chr1	179897	3.0	0.0	3.0
+chr1	179899	0.0	1.0	1.0
+chr1	179900	1.0	0.0	1.0
+chr1	179906	0.0	1.0	1.0
+chr1	179907	0.0	1.0	1.0
+chr1	179918	4.0	0.0	4.0
+chr1	180000	1.0	0.0	1.0
+chr1	180007	0.0	1.0	1.0
+chr1	180015	0.0	1.0	1.0
+chr1	180018	0.0	1.0	1.0
+chr1	180030	1.0	0.0	1.0
+chr1	180045	0.0	1.0	1.0
+chr1	180049	0.0	1.0	1.0
+chr1	180055	1.0	0.0	1.0
+chr1	180060	0.0	1.0	1.0
+chr1	180061	0.0	1.0	1.0
+chr1	180071	0.0	1.0	1.0
+chr1	180088	1.0	0.0	1.0
+chr1	180094	1.0	0.0	1.0
+chr1	180275	1.0	0.0	1.0
+chr1	180276	0.0	1.0	1.0
+chr1	180296	0.0	1.0	1.0
+chr1	180306	1.0	0.0	1.0
+chr1	180346	0.0	1.0	1.0
+chr1	180415	1.0	0.0	1.0
+chr1	180428	0.0	2.0	2.0
+chr1	180438	1.0	0.0	1.0
+chr1	180443	2.0	0.0	2.0
+chr1	180447	0.0	1.0	1.0
+chr1	180451	1.0	0.0	1.0
+chr1	180454	2.0	0.0	2.0
+chr1	180507	1.0	0.0	1.0
+chr1	180570	0.0	1.0	1.0
+chr1	180585	1.0	0.0	1.0
+chr1	180611	0.0	3.0	3.0
+chr1	180612	0.0	1.0	1.0
+chr1	180615	1.0	0.0	1.0
+chr1	180618	1.0	0.0	1.0
+chr1	180632	0.0	2.0	2.0
+chr1	180643	1.0	0.0	1.0
+chr1	180652	1.0	0.0	1.0
+chr1	180767	1.0	0.0	1.0
+chr1	180778	1.0	0.0	1.0
+chr1	180780	1.0	0.0	1.0
+chr1	180803	2.0	0.0	2.0
+chr1	180809	0.0	3.0	3.0
+chr1	180824	2.0	0.0	2.0
+chr1	180951	0.0	1.0	1.0
+chr1	180953	0.0	1.0	1.0
+chr1	180960	0.0	1.0	1.0
+chr1	180964	0.0	1.0	1.0
+chr1	180969	1.0	6.0	7.0
+chr1	180971	1.0	2.0	3.0
+chr1	180974	1.0	0.0	1.0
+chr1	180975	1.0	0.0	1.0
+chr1	180976	4.0	0.0	4.0
+chr1	181004	1.0	0.0	1.0
+chr1	181340	0.0	3.0	3.0
+chr1	181349	0.0	3.0	3.0
+chr1	181382	2.0	0.0	2.0
+chr1	181388	1.0	0.0	1.0
+chr1	181389	1.0	0.0	1.0
+chr1	181413	1.0	0.0	1.0
+chr1	181414	0.0	1.0	1.0
+chr1	181510	1.0	0.0	1.0
+chr1	181521	0.0	1.0	1.0
+chr1	181525	0.0	1.0	1.0
+chr1	181543	0.0	1.0	1.0
+chr1	181547	0.0	1.0	1.0
+chr1	181548	1.0	0.0	1.0
+chr1	181572	0.0	1.0	1.0
+chr1	181585	0.0	1.0	1.0
+chr1	181590	2.0	0.0	2.0
+chr1	181598	0.0	1.0	1.0
+chr1	181667	1.0	0.0	1.0
+chr1	181676	1.0	0.0	1.0
+chr1	181685	1.0	0.0	1.0
+chr1	181698	1.0	0.0	1.0
+chr1	181699	1.0	0.0	1.0
+chr1	181700	1.0	0.0	1.0
+chr1	181702	1.0	2.0	3.0
+chr1	181703	0.0	1.0	1.0
+chr1	181706	1.0	0.0	1.0
+chr1	181710	2.0	0.0	2.0
+chr1	181722	0.0	1.0	1.0
+chr1	181723	0.0	2.0	2.0
+chr1	181756	1.0	0.0	1.0
+chr1	181856	0.0	2.0	2.0
+chr1	181859	0.0	1.0	1.0
+chr1	181871	2.0	0.0	2.0
+chr1	181875	0.0	2.0	2.0
+chr1	182009	1.0	0.0	1.0
+chr1	182035	0.0	1.0	1.0
+chr1	182036	1.0	0.0	1.0
+chr1	182037	1.0	0.0	1.0
+chr1	182052	1.0	0.0	1.0
+chr1	182053	0.0	3.0	3.0
+chr1	182088	1.0	0.0	1.0
+chr1	182175	1.0	0.0	1.0
+chr1	182186	1.0	0.0	1.0
+chr1	182187	0.0	1.0	1.0
+chr1	182199	0.0	1.0	1.0
+chr1	182202	1.0	0.0	1.0
+chr1	182208	0.0	1.0	1.0
+chr1	182217	0.0	4.0	4.0
+chr1	182222	6.0	0.0	6.0
+chr1	182223	2.0	0.0	2.0
+chr1	182226	2.0	0.0	2.0
+chr1	182235	0.0	3.0	3.0
+chr1	182236	0.0	1.0	1.0
+chr1	182246	0.0	2.0	2.0
+chr1	182249	1.0	0.0	1.0
+chr1	182258	1.0	0.0	1.0
+chr1	182325	0.0	1.0	1.0
+chr1	182342	0.0	1.0	1.0
+chr1	182366	1.0	0.0	1.0
+chr1	182387	0.0	1.0	1.0
+chr1	182417	1.0	0.0	1.0
+chr1	182638	0.0	1.0	1.0
+chr1	182642	0.0	1.0	1.0
+chr1	182644	0.0	1.0	1.0
+chr1	182645	0.0	1.0	1.0
+chr1	182659	0.0	1.0	1.0
+chr1	182664	0.0	2.0	2.0
+chr1	182666	0.0	2.0	2.0
+chr1	182669	0.0	1.0	1.0
+chr1	182674	0.0	6.0	6.0
+chr1	182675	0.0	3.0	3.0
+chr1	182676	0.0	7.0	7.0
+chr1	182686	2.0	0.0	2.0
+chr1	182690	0.0	1.0	1.0
+chr1	182691	1.0	0.0	1.0
+chr1	182693	1.0	0.0	1.0
+chr1	182708	1.0	1.0	2.0
+chr1	182720	0.0	1.0	1.0
+chr1	182727	0.0	1.0	1.0
+chr1	182729	0.0	6.0	6.0
+chr1	182730	0.0	3.0	3.0
+chr1	182731	0.0	1.0	1.0
+chr1	182734	0.0	1.0	1.0
+chr1	182735	1.0	0.0	1.0
+chr1	182737	0.0	1.0	1.0
+chr1	182742	0.0	1.0	1.0
+chr1	182743	0.0	2.0	2.0
+chr1	182745	1.0	2.0	3.0
+chr1	182746	2.0	0.0	2.0
+chr1	182747	2.0	0.0	2.0
+chr1	182748	1.0	0.0	1.0
+chr1	182749	0.0	1.0	1.0
+chr1	182750	0.0	1.0	1.0
+chr1	182752	2.0	0.0	2.0
+chr1	182753	1.0	0.0	1.0
+chr1	182754	2.0	1.0	3.0
+chr1	182755	0.0	1.0	1.0
+chr1	182758	5.0	0.0	5.0
+chr1	182761	1.0	0.0	1.0
+chr1	182763	0.0	1.0	1.0
+chr1	182764	0.0	1.0	1.0
+chr1	182766	1.0	0.0	1.0
+chr1	182768	1.0	1.0	2.0
+chr1	182773	1.0	0.0	1.0
+chr1	182775	3.0	0.0	3.0
+chr1	182783	1.0	0.0	1.0
+chr1	182786	1.0	0.0	1.0
+chr1	182789	0.0	1.0	1.0
+chr1	182790	0.0	2.0	2.0
+chr1	182792	1.0	2.0	3.0
+chr1	182799	1.0	0.0	1.0
+chr1	182806	1.0	0.0	1.0
+chr1	182807	4.0	0.0	4.0
+chr1	182815	0.0	2.0	2.0
+chr1	182818	0.0	1.0	1.0
+chr1	182819	0.0	2.0	2.0
+chr1	182820	0.0	1.0	1.0
+chr1	182823	1.0	0.0	1.0
+chr1	182826	0.0	3.0	3.0
+chr1	182828	0.0	1.0	1.0
+chr1	182830	1.0	0.0	1.0
+chr1	182834	1.0	0.0	1.0
+chr1	182838	0.0	1.0	1.0
+chr1	182840	0.0	2.0	2.0
+chr1	182843	2.0	0.0	2.0
+chr1	182851	1.0	0.0	1.0
+chr1	182864	0.0	1.0	1.0
+chr1	182872	0.0	1.0	1.0
+chr1	182877	0.0	1.0	1.0
+chr1	182880	0.0	1.0	1.0
+chr1	182884	2.0	0.0	2.0
+chr1	182889	1.0	0.0	1.0
+chr1	182905	1.0	0.0	1.0
+chr1	182907	5.0	0.0	5.0
+chr1	182908	2.0	0.0	2.0
+chr1	182909	2.0	0.0	2.0
+chr1	182910	3.0	0.0	3.0
+chr1	182911	8.0	0.0	8.0
+chr1	182914	5.0	0.0	5.0
+chr1	182915	1.0	0.0	1.0
+chr1	182917	1.0	0.0	1.0
+chr1	182919	3.0	0.0	3.0
+chr1	182932	1.0	0.0	1.0
+chr1	182939	1.0	0.0	1.0
+chr1	182951	0.0	1.0	1.0
+chr1	183096	0.0	1.0	1.0
+chr1	183162	0.0	1.0	1.0
+chr1	183170	0.0	1.0	1.0
+chr1	183174	0.0	1.0	1.0
+chr1	183175	0.0	1.0	1.0
+chr1	183184	0.0	2.0	2.0
+chr1	183186	0.0	3.0	3.0
+chr1	183189	0.0	1.0	1.0
+chr1	183197	0.0	2.0	2.0
+chr1	183198	0.0	1.0	1.0
+chr1	183201	0.0	3.0	3.0
+chr1	183202	0.0	4.0	4.0
+chr1	183205	0.0	1.0	1.0
+chr1	183209	6.0	0.0	6.0
+chr1	183210	0.0	1.0	1.0
+chr1	183212	1.0	1.0	2.0
+chr1	183214	0.0	1.0	1.0
+chr1	183215	0.0	1.0	1.0
+chr1	183220	2.0	0.0	2.0
+chr1	183223	1.0	1.0	2.0
+chr1	183226	2.0	0.0	2.0
+chr1	183230	1.0	0.0	1.0
+chr1	183234	0.0	2.0	2.0
+chr1	183235	0.0	1.0	1.0
+chr1	183241	0.0	2.0	2.0
+chr1	183244	0.0	1.0	1.0
+chr1	183248	0.0	1.0	1.0
+chr1	183249	0.0	1.0	1.0
+chr1	183251	0.0	3.0	3.0
+chr1	183255	1.0	0.0	1.0
+chr1	183259	0.0	1.0	1.0
+chr1	183260	0.0	1.0	1.0
+chr1	183263	1.0	0.0	1.0
+chr1	183265	2.0	0.0	2.0
+chr1	183266	0.0	1.0	1.0
+chr1	183270	1.0	0.0	1.0
+chr1	183280	0.0	1.0	1.0
+chr1	183282	2.0	0.0	2.0
+chr1	183291	1.0	1.0	2.0
+chr1	183292	0.0	2.0	2.0
+chr1	183293	0.0	2.0	2.0
+chr1	183295	1.0	0.0	1.0
+chr1	183304	1.0	0.0	1.0
+chr1	183309	0.0	6.0	6.0
+chr1	183326	0.0	1.0	1.0
+chr1	183327	0.0	1.0	1.0
+chr1	183328	0.0	1.0	1.0
+chr1	183339	0.0	1.0	1.0
+chr1	183345	0.0	1.0	1.0
+chr1	183348	1.0	0.0	1.0
+chr1	183355	2.0	0.0	2.0
+chr1	183356	1.0	0.0	1.0
+chr1	183374	1.0	0.0	1.0
+chr1	183375	1.0	1.0	2.0
+chr1	183384	2.0	0.0	2.0
+chr1	183388	0.0	1.0	1.0
+chr1	183390	1.0	0.0	1.0
+chr1	183392	1.0	0.0	1.0
+chr1	183397	0.0	1.0	1.0
+chr1	183403	3.0	0.0	3.0
+chr1	183407	1.0	0.0	1.0
+chr1	183408	1.0	0.0	1.0
+chr1	183409	1.0	0.0	1.0
+chr1	183413	1.0	0.0	1.0
+chr1	183416	1.0	0.0	1.0
+chr1	183421	16.0	0.0	16.0
+chr1	183430	1.0	0.0	1.0
+chr1	183431	3.0	0.0	3.0
+chr1	183434	1.0	0.0	1.0
+chr1	183435	3.0	1.0	4.0
+chr1	183438	1.0	0.0	1.0
+chr1	183439	1.0	0.0	1.0
+chr1	183440	0.0	2.0	2.0
+chr1	183443	1.0	1.0	2.0
+chr1	183447	1.0	0.0	1.0
+chr1	183451	0.0	1.0	1.0
+chr1	183453	0.0	1.0	1.0
+chr1	183454	0.0	1.0	1.0
+chr1	183455	0.0	1.0	1.0
+chr1	183456	0.0	1.0	1.0
+chr1	183457	0.0	2.0	2.0
+chr1	183465	0.0	5.0	5.0
+chr1	183467	1.0	1.0	2.0
+chr1	183469	0.0	5.0	5.0
+chr1	183471	1.0	0.0	1.0
+chr1	183474	1.0	0.0	1.0
+chr1	183485	1.0	0.0	1.0
+chr1	183487	3.0	1.0	4.0
+chr1	183493	1.0	0.0	1.0
+chr1	183528	1.0	0.0	1.0
+chr1	183646	1.0	0.0	1.0
+chr1	183714	1.0	1.0	2.0
+chr1	183721	0.0	1.0	1.0
+chr1	183724	0.0	1.0	1.0
+chr1	183728	0.0	2.0	2.0
+chr1	183732	2.0	0.0	2.0
+chr1	183733	1.0	0.0	1.0
+chr1	183734	1.0	0.0	1.0
+chr1	183745	1.0	0.0	1.0
+chr1	183752	0.0	1.0	1.0
+chr1	183756	1.0	0.0	1.0
+chr1	183757	1.0	0.0	1.0
+chr1	183770	0.0	3.0	3.0
+chr1	183779	0.0	5.0	5.0
+chr1	183783	1.0	0.0	1.0
+chr1	183785	0.0	1.0	1.0
+chr1	183793	0.0	4.0	4.0
+chr1	183806	1.0	0.0	1.0
+chr1	183811	1.0	0.0	1.0
+chr1	183820	1.0	0.0	1.0
+chr1	183867	0.0	1.0	1.0
+chr1	183880	2.0	0.0	2.0
+chr1	183909	0.0	1.0	1.0
+chr1	184078	0.0	2.0	2.0
+chr1	184084	1.0	0.0	1.0
+chr1	184094	1.0	0.0	1.0
+chr1	184104	1.0	0.0	1.0
+chr1	184120	0.0	1.0	1.0
+chr1	184129	0.0	1.0	1.0
+chr1	184132	0.0	2.0	2.0
+chr1	184159	1.0	0.0	1.0
+chr1	184173	1.0	0.0	1.0
+chr1	184279	1.0	0.0	1.0
+chr1	184293	1.0	0.0	1.0
+chr1	184319	0.0	1.0	1.0
+chr1	184482	2.0	0.0	2.0
+chr1	184563	0.0	2.0	2.0
+chr1	184570	0.0	1.0	1.0
+chr1	184586	1.0	0.0	1.0
+chr1	184587	1.0	0.0	1.0
+chr1	184611	0.0	3.0	3.0
+chr1	184614	0.0	1.0	1.0
+chr1	184617	2.0	0.0	2.0
+chr1	184618	1.0	1.0	2.0
+chr1	184621	1.0	1.0	2.0
+chr1	184624	1.0	0.0	1.0
+chr1	184628	0.0	2.0	2.0
+chr1	184633	1.0	0.0	1.0
+chr1	184639	1.0	0.0	1.0
+chr1	184656	0.0	1.0	1.0
+chr1	184665	1.0	0.0	1.0
+chr1	184681	0.0	1.0	1.0
+chr1	184769	0.0	1.0	1.0
+chr1	184777	1.0	1.0	2.0
+chr1	184843	0.0	1.0	1.0
+chr1	184847	0.0	2.0	2.0
+chr1	184865	1.0	0.0	1.0
+chr1	184866	4.0	0.0	4.0
+chr1	184869	1.0	0.0	1.0
+chr1	184874	1.0	6.0	7.0
+chr1	184875	0.0	3.0	3.0
+chr1	184879	0.0	1.0	1.0
+chr1	184880	1.0	0.0	1.0
+chr1	184881	1.0	0.0	1.0
+chr1	184884	3.0	0.0	3.0
+chr1	184885	4.0	0.0	4.0
+chr1	184886	0.0	1.0	1.0
+chr1	184888	0.0	2.0	2.0
+chr1	184889	0.0	1.0	1.0
+chr1	184890	1.0	0.0	1.0
+chr1	184892	0.0	2.0	2.0
+chr1	184893	3.0	1.0	4.0
+chr1	184895	3.0	0.0	3.0
+chr1	184901	0.0	2.0	2.0
+chr1	184903	1.0	0.0	1.0
+chr1	184904	0.0	3.0	3.0
+chr1	184905	0.0	1.0	1.0
+chr1	184907	0.0	4.0	4.0
+chr1	184909	0.0	2.0	2.0
+chr1	184911	0.0	1.0	1.0
+chr1	184916	0.0	1.0	1.0
+chr1	184917	1.0	1.0	2.0
+chr1	184920	0.0	1.0	1.0
+chr1	184922	0.0	1.0	1.0
+chr1	184927	1.0	0.0	1.0
+chr1	184938	1.0	0.0	1.0
+chr1	185002	2.0	0.0	2.0
+chr1	185026	1.0	0.0	1.0
+chr1	185058	0.0	2.0	2.0
+chr1	185059	1.0	0.0	1.0
+chr1	185069	1.0	0.0	1.0
+chr1	185076	0.0	1.0	1.0
+chr1	185170	1.0	0.0	1.0
+chr1	185191	4.0	0.0	4.0
+chr1	185204	1.0	0.0	1.0
+chr1	185210	1.0	0.0	1.0
+chr1	185227	1.0	0.0	1.0
+chr1	185231	0.0	1.0	1.0
+chr1	185353	1.0	0.0	1.0
+chr1	185514	0.0	1.0	1.0
+chr1	185521	2.0	0.0	2.0
+chr1	185527	0.0	3.0	3.0
+chr1	185671	0.0	1.0	1.0
+chr1	185676	0.0	1.0	1.0
+chr1	185678	0.0	2.0	2.0
+chr1	185680	3.0	0.0	3.0
+chr1	185681	0.0	2.0	2.0
+chr1	185682	0.0	1.0	1.0
+chr1	185691	0.0	1.0	1.0
+chr1	185706	0.0	1.0	1.0
+chr1	185709	1.0	0.0	1.0
+chr1	185729	1.0	0.0	1.0
+chr1	185905	0.0	1.0	1.0
+chr1	185917	0.0	1.0	1.0
+chr1	185926	1.0	0.0	1.0
+chr1	185934	0.0	2.0	2.0
+chr1	185938	1.0	0.0	1.0
+chr1	185941	0.0	1.0	1.0
+chr1	185950	0.0	1.0	1.0
+chr1	185959	1.0	0.0	1.0
+chr1	185983	0.0	1.0	1.0
+chr1	186069	0.0	1.0	1.0
+chr1	186101	0.0	1.0	1.0
+chr1	186112	1.0	0.0	1.0
+chr1	186126	1.0	0.0	1.0
+chr1	186166	1.0	0.0	1.0
+chr1	186235	0.0	1.0	1.0
+chr1	186306	0.0	1.0	1.0
+chr1	186319	1.0	0.0	1.0
+chr1	186321	0.0	1.0	1.0
+chr1	186576	0.0	2.0	2.0
+chr1	186590	1.0	0.0	1.0
+chr1	186605	1.0	0.0	1.0
+chr1	186606	0.0	1.0	1.0
+chr1	186619	0.0	2.0	2.0
+chr1	186644	1.0	0.0	1.0
+chr1	186697	1.0	0.0	1.0
+chr1	186732	0.0	1.0	1.0
+chr1	186756	0.0	1.0	1.0
+chr1	186772	1.0	0.0	1.0
+chr1	186773	0.0	1.0	1.0
+chr1	186782	1.0	0.0	1.0
+chr1	186790	1.0	0.0	1.0
+chr1	186796	0.0	2.0	2.0
+chr1	186800	0.0	1.0	1.0
+chr1	186930	0.0	1.0	1.0
+chr1	186957	1.0	1.0	2.0
+chr1	186959	1.0	0.0	1.0
+chr1	186973	0.0	2.0	2.0
+chr1	186977	1.0	0.0	1.0
+chr1	186978	1.0	0.0	1.0
+chr1	186979	2.0	0.0	2.0
+chr1	186987	1.0	0.0	1.0
+chr1	186997	1.0	0.0	1.0
+chr1	187002	0.0	4.0	4.0
+chr1	187003	0.0	1.0	1.0
+chr1	187004	0.0	2.0	2.0
+chr1	187006	1.0	0.0	1.0
+chr1	187007	1.0	0.0	1.0
+chr1	187008	1.0	0.0	1.0
+chr1	187009	2.0	0.0	2.0
+chr1	187011	1.0	0.0	1.0
+chr1	187013	2.0	0.0	2.0
+chr1	187032	0.0	4.0	4.0
+chr1	187035	2.0	0.0	2.0
+chr1	187036	1.0	0.0	1.0
+chr1	187049	0.0	1.0	1.0
+chr1	187063	0.0	1.0	1.0
+chr1	187075	0.0	1.0	1.0
+chr1	187089	1.0	0.0	1.0
+chr1	187090	1.0	0.0	1.0
+chr1	187106	2.0	0.0	2.0
+chr1	187114	1.0	0.0	1.0
+chr1	187126	0.0	3.0	3.0
+chr1	187187	1.0	0.0	1.0
+chr1	187227	0.0	1.0	1.0
+chr1	187307	1.0	0.0	1.0
+chr1	187321	0.0	1.0	1.0
+chr1	187368	0.0	1.0	1.0
+chr1	187376	2.0	3.0	5.0
+chr1	187382	2.0	0.0	2.0
+chr1	187410	1.0	0.0	1.0
+chr1	187411	0.0	1.0	1.0
+chr1	187425	0.0	1.0	1.0
+chr1	187434	0.0	1.0	1.0
+chr1	187437	0.0	1.0	1.0
+chr1	187438	2.0	0.0	2.0
+chr1	187487	0.0	1.0	1.0
+chr1	187514	0.0	1.0	1.0
+chr1	187515	0.0	2.0	2.0
+chr1	187562	1.0	0.0	1.0
+chr1	187576	1.0	0.0	1.0
+chr1	187594	1.0	0.0	1.0
+chr1	187627	0.0	1.0	1.0
+chr1	187670	0.0	1.0	1.0
+chr1	187676	0.0	2.0	2.0
+chr1	187689	1.0	0.0	1.0
+chr1	187698	0.0	1.0	1.0
+chr1	187758	1.0	0.0	1.0
+chr1	187811	0.0	1.0	1.0
+chr1	187812	1.0	0.0	1.0
+chr1	187823	0.0	2.0	2.0
+chr1	187824	1.0	0.0	1.0
+chr1	187827	1.0	0.0	1.0
+chr1	187830	1.0	0.0	1.0
+chr1	187831	4.0	0.0	4.0
+chr1	187832	4.0	0.0	4.0
+chr1	187833	1.0	0.0	1.0
+chr1	187835	2.0	0.0	2.0
+chr1	187836	0.0	1.0	1.0
+chr1	187840	2.0	1.0	3.0
+chr1	187844	0.0	1.0	1.0
+chr1	187846	0.0	1.0	1.0
+chr1	187848	0.0	1.0	1.0
+chr1	187852	0.0	6.0	6.0
+chr1	187853	0.0	3.0	3.0
+chr1	187855	0.0	1.0	1.0
+chr1	187862	0.0	1.0	1.0
+chr1	187885	0.0	2.0	2.0
+chr1	187886	0.0	3.0	3.0
+chr1	187961	0.0	1.0	1.0
+chr1	188017	1.0	0.0	1.0
+chr1	188021	0.0	1.0	1.0
+chr1	188063	0.0	1.0	1.0
+chr1	188071	2.0	0.0	2.0
+chr1	188076	1.0	0.0	1.0
+chr1	188078	2.0	1.0	3.0
+chr1	188089	0.0	10.0	10.0
+chr1	188090	0.0	1.0	1.0
+chr1	188093	1.0	0.0	1.0
+chr1	188096	2.0	0.0	2.0
+chr1	188097	2.0	0.0	2.0
+chr1	188101	1.0	0.0	1.0
+chr1	188110	1.0	0.0	1.0
+chr1	188111	6.0	0.0	6.0
+chr1	188113	0.0	1.0	1.0
+chr1	188116	1.0	0.0	1.0
+chr1	188117	0.0	4.0	4.0
+chr1	188118	0.0	2.0	2.0
+chr1	188155	0.0	1.0	1.0
+chr1	188166	1.0	0.0	1.0
+chr1	188169	0.0	1.0	1.0
+chr1	188174	1.0	0.0	1.0
+chr1	188175	1.0	0.0	1.0
+chr1	188178	1.0	0.0	1.0
+chr1	188219	1.0	0.0	1.0
+chr1	188242	1.0	0.0	1.0
+chr1	188275	0.0	1.0	1.0
+chr1	188286	1.0	0.0	1.0
+chr1	188339	0.0	1.0	1.0
+chr1	188344	1.0	0.0	1.0
+chr1	188378	0.0	1.0	1.0
+chr1	188392	0.0	1.0	1.0
+chr1	188424	1.0	0.0	1.0
+chr1	188425	1.0	0.0	1.0
+chr1	188440	0.0	1.0	1.0
+chr1	188454	1.0	0.0	1.0
+chr1	188460	0.0	2.0	2.0
+chr1	188469	0.0	1.0	1.0
+chr1	188472	0.0	2.0	2.0
+chr1	188491	2.0	0.0	2.0
+chr1	188492	1.0	0.0	1.0
+chr1	188499	0.0	1.0	1.0
+chr1	188508	1.0	0.0	1.0
+chr1	188526	1.0	0.0	1.0
+chr1	188574	1.0	0.0	1.0
+chr1	188576	0.0	2.0	2.0
+chr1	188593	3.0	0.0	3.0
+chr1	188600	2.0	0.0	2.0
+chr1	188603	0.0	2.0	2.0
+chr1	188606	0.0	1.0	1.0
+chr1	188609	0.0	3.0	3.0
+chr1	188612	0.0	1.0	1.0
+chr1	188615	1.0	0.0	1.0
+chr1	188616	0.0	1.0	1.0
+chr1	188620	0.0	1.0	1.0
+chr1	188621	1.0	0.0	1.0
+chr1	188622	1.0	0.0	1.0
+chr1	188623	0.0	3.0	3.0
+chr1	188624	1.0	0.0	1.0
+chr1	188628	0.0	2.0	2.0
+chr1	188636	5.0	0.0	5.0
+chr1	188637	0.0	1.0	1.0
+chr1	188643	0.0	1.0	1.0
+chr1	188644	1.0	0.0	1.0
+chr1	188650	1.0	0.0	1.0
+chr1	188653	1.0	1.0	2.0
+chr1	188662	1.0	1.0	2.0
+chr1	188664	1.0	0.0	1.0
+chr1	188671	2.0	0.0	2.0
+chr1	188675	0.0	1.0	1.0
+chr1	188700	0.0	2.0	2.0
+chr1	188701	1.0	0.0	1.0
+chr1	188713	0.0	1.0	1.0
+chr1	188734	1.0	0.0	1.0
+chr1	188746	1.0	0.0	1.0
+chr1	188824	1.0	0.0	1.0
+chr1	188828	1.0	0.0	1.0
+chr1	188833	0.0	1.0	1.0
+chr1	188848	0.0	1.0	1.0
+chr1	188849	1.0	0.0	1.0
+chr1	188855	0.0	1.0	1.0
+chr1	188876	0.0	1.0	1.0
+chr1	188877	1.0	0.0	1.0
+chr1	188880	0.0	1.0	1.0
+chr1	188905	0.0	1.0	1.0
+chr1	188921	1.0	0.0	1.0
+chr1	188930	0.0	1.0	1.0
+chr1	188932	3.0	0.0	3.0
+chr1	188933	1.0	0.0	1.0
+chr1	188949	0.0	1.0	1.0
+chr1	188952	1.0	0.0	1.0
+chr1	188974	0.0	2.0	2.0
+chr1	188975	0.0	2.0	2.0
+chr1	188988	1.0	0.0	1.0
+chr1	188992	0.0	2.0	2.0
+chr1	188996	0.0	1.0	1.0
+chr1	188997	2.0	0.0	2.0
+chr1	188998	2.0	0.0	2.0
+chr1	189005	0.0	1.0	1.0
+chr1	189006	1.0	1.0	2.0
+chr1	189007	2.0	0.0	2.0
+chr1	189008	2.0	0.0	2.0
+chr1	189010	0.0	1.0	1.0
+chr1	189013	0.0	4.0	4.0
+chr1	189015	0.0	1.0	1.0
+chr1	189016	0.0	1.0	1.0
+chr1	189020	0.0	1.0	1.0
+chr1	189021	0.0	1.0	1.0
+chr1	189030	1.0	0.0	1.0
+chr1	189031	6.0	0.0	6.0
+chr1	189032	0.0	3.0	3.0
+chr1	189033	0.0	3.0	3.0
+chr1	189038	2.0	0.0	2.0
+chr1	189047	1.0	0.0	1.0
+chr1	189049	0.0	1.0	1.0
+chr1	189052	1.0	0.0	1.0
+chr1	189071	0.0	1.0	1.0
+chr1	189079	1.0	0.0	1.0
+chr1	189196	1.0	0.0	1.0
+chr1	189205	0.0	1.0	1.0
+chr1	189212	1.0	0.0	1.0
+chr1	189400	0.0	1.0	1.0
+chr1	189401	0.0	1.0	1.0
+chr1	189405	1.0	0.0	1.0
+chr1	189406	1.0	0.0	1.0
+chr1	189441	0.0	1.0	1.0
+chr1	189444	0.0	1.0	1.0
+chr1	189445	0.0	1.0	1.0
+chr1	189449	0.0	2.0	2.0
+chr1	189493	6.0	0.0	6.0
+chr1	189496	1.0	1.0	2.0
+chr1	189499	0.0	2.0	2.0
+chr1	189500	0.0	1.0	1.0
+chr1	189503	0.0	5.0	5.0
+chr1	189556	1.0	0.0	1.0
+chr1	189560	0.0	1.0	1.0
+chr1	189616	0.0	1.0	1.0
+chr1	189638	1.0	0.0	1.0
+chr1	189648	0.0	1.0	1.0
+chr1	189655	0.0	1.0	1.0
+chr1	189661	0.0	2.0	2.0
+chr1	189666	0.0	2.0	2.0
+chr1	189671	0.0	4.0	4.0
+chr1	189678	0.0	1.0	1.0
+chr1	189683	2.0	0.0	2.0
+chr1	189690	3.0	0.0	3.0
+chr1	189694	2.0	0.0	2.0
+chr1	189697	1.0	0.0	1.0
+chr1	189698	1.0	0.0	1.0
+chr1	189700	3.0	0.0	3.0
+chr1	189702	5.0	0.0	5.0
+chr1	189703	9.0	0.0	9.0
+chr1	189705	1.0	0.0	1.0
+chr1	189707	1.0	0.0	1.0
+chr1	189712	0.0	1.0	1.0
+chr1	189716	3.0	0.0	3.0
+chr1	189717	2.0	0.0	2.0
+chr1	189720	1.0	0.0	1.0
+chr1	189721	1.0	0.0	1.0
+chr1	189728	1.0	0.0	1.0
+chr1	189737	1.0	0.0	1.0
+chr1	189875	0.0	1.0	1.0
+chr1	189890	1.0	0.0	1.0
+chr1	189902	0.0	1.0	1.0
+chr1	189904	1.0	0.0	1.0
+chr1	190063	0.0	1.0	1.0
+chr1	190088	1.0	0.0	1.0
+chr1	190225	0.0	1.0	1.0
+chr1	190456	0.0	1.0	1.0
+chr1	190491	0.0	1.0	1.0
+chr1	190496	0.0	2.0	2.0
+chr1	190506	0.0	1.0	1.0
+chr1	190507	1.0	0.0	1.0
+chr1	190510	1.0	0.0	1.0
+chr1	190534	1.0	0.0	1.0
+chr1	190663	1.0	0.0	1.0
+chr1	190696	1.0	0.0	1.0
+chr1	190697	1.0	0.0	1.0
+chr1	190741	0.0	1.0	1.0
+chr1	190750	1.0	0.0	1.0
+chr1	190758	1.0	0.0	1.0
+chr1	190775	1.0	0.0	1.0
+chr1	190786	0.0	1.0	1.0
+chr1	190789	0.0	1.0	1.0
+chr1	190838	2.0	0.0	2.0
+chr1	190859	1.0	0.0	1.0
+chr1	190864	1.0	0.0	1.0
+chr1	190865	0.0	1.0	1.0
+chr1	190909	1.0	0.0	1.0
+chr1	190997	0.0	1.0	1.0
+chr1	191026	1.0	1.0	2.0
+chr1	191055	0.0	1.0	1.0
+chr1	191057	0.0	1.0	1.0
+chr1	191098	0.0	1.0	1.0
+chr1	191168	0.0	1.0	1.0
+chr1	191172	0.0	1.0	1.0
+chr1	191174	0.0	1.0	1.0
+chr1	191177	1.0	0.0	1.0
+chr1	191188	0.0	1.0	1.0
+chr1	191194	0.0	1.0	1.0
+chr1	191200	0.0	1.0	1.0
+chr1	191206	1.0	0.0	1.0
+chr1	191294	1.0	0.0	1.0
+chr1	191331	0.0	1.0	1.0
+chr1	191334	0.0	1.0	1.0
+chr1	191335	0.0	1.0	1.0
+chr1	191342	0.0	1.0	1.0
+chr1	191352	0.0	1.0	1.0
+chr1	191366	0.0	2.0	2.0
+chr1	191403	2.0	0.0	2.0
+chr1	191405	0.0	1.0	1.0
+chr1	191408	0.0	1.0	1.0
+chr1	191420	1.0	0.0	1.0
+chr1	191443	0.0	1.0	1.0
+chr1	191454	1.0	0.0	1.0
+chr1	191469	0.0	1.0	1.0
+chr1	191579	2.0	0.0	2.0
+chr1	191592	1.0	0.0	1.0
+chr1	191607	2.0	0.0	2.0
+chr1	191611	4.0	0.0	4.0
+chr1	191621	0.0	2.0	2.0
+chr1	191622	2.0	0.0	2.0
+chr1	191623	2.0	1.0	3.0
+chr1	191625	1.0	0.0	1.0
+chr1	191632	0.0	1.0	1.0
+chr1	191633	0.0	1.0	1.0
+chr1	191638	0.0	1.0	1.0
+chr1	191654	0.0	1.0	1.0
+chr1	191668	1.0	0.0	1.0
+chr1	191679	1.0	0.0	1.0
+chr1	191728	1.0	0.0	1.0
+chr1	191741	1.0	0.0	1.0
+chr1	191773	2.0	0.0	2.0
+chr1	191779	1.0	0.0	1.0
+chr1	191780	1.0	0.0	1.0
+chr1	191785	2.0	0.0	2.0
+chr1	191800	0.0	1.0	1.0
+chr1	191803	0.0	2.0	2.0
+chr1	191818	0.0	1.0	1.0
+chr1	191846	1.0	0.0	1.0
+chr1	191934	1.0	0.0	1.0
+chr1	191950	0.0	1.0	1.0
+chr1	191968	0.0	2.0	2.0
+chr1	191969	1.0	0.0	1.0
+chr1	192007	1.0	0.0	1.0
+chr1	192112	0.0	2.0	2.0
+chr1	192113	0.0	1.0	1.0
+chr1	192122	0.0	1.0	1.0
+chr1	192168	1.0	0.0	1.0
+chr1	192209	1.0	0.0	1.0
+chr1	192287	0.0	1.0	1.0
+chr1	192297	1.0	0.0	1.0
+chr1	192301	1.0	0.0	1.0
+chr1	192308	0.0	2.0	2.0
+chr1	192323	0.0	1.0	1.0
+chr1	192325	0.0	1.0	1.0
+chr1	192329	1.0	0.0	1.0
+chr1	192594	1.0	2.0	3.0
+chr1	192610	0.0	2.0	2.0
+chr1	192611	1.0	2.0	3.0
+chr1	192613	3.0	0.0	3.0
+chr1	192615	2.0	0.0	2.0
+chr1	192616	0.0	1.0	1.0
+chr1	192619	1.0	0.0	1.0
+chr1	192620	0.0	2.0	2.0
+chr1	192621	2.0	0.0	2.0
+chr1	192623	0.0	2.0	2.0
+chr1	192624	1.0	0.0	1.0
+chr1	192629	0.0	1.0	1.0
+chr1	192630	0.0	3.0	3.0
+chr1	192631	2.0	0.0	2.0
+chr1	192632	1.0	0.0	1.0
+chr1	192634	2.0	3.0	5.0
+chr1	192637	1.0	1.0	2.0
+chr1	192638	1.0	0.0	1.0
+chr1	192643	1.0	0.0	1.0
+chr1	192756	1.0	0.0	1.0
+chr1	192770	1.0	0.0	1.0
+chr1	192771	1.0	0.0	1.0
+chr1	192772	1.0	0.0	1.0
+chr1	192785	0.0	1.0	1.0
+chr1	192787	2.0	0.0	2.0
+chr1	192799	0.0	1.0	1.0
+chr1	192807	1.0	0.0	1.0
+chr1	192942	1.0	0.0	1.0
+chr1	192945	0.0	1.0	1.0
+chr1	193155	1.0	0.0	1.0
+chr1	193398	0.0	1.0	1.0
+chr1	194474	1.0	0.0	1.0
+chr1	195048	0.0	1.0	1.0
+chr1	195190	1.0	0.0	1.0
+chr1	195315	0.0	1.0	1.0
+chr1	195320	0.0	1.0	1.0
+chr1	195366	0.0	1.0	1.0
+chr1	195738	1.0	0.0	1.0
+chr1	195841	1.0	0.0	1.0
+chr1	196062	0.0	1.0	1.0
+chr1	196272	0.0	2.0	2.0
+chr1	196903	0.0	1.0	1.0
+chr1	197001	0.0	2.0	2.0
+chr1	197092	2.0	0.0	2.0
+chr1	197300	1.0	0.0	1.0
+chr1	197302	0.0	1.0	1.0
+chr1	197380	0.0	1.0	1.0
+chr1	197654	0.0	1.0	1.0
+chr1	197701	1.0	0.0	1.0
+chr1	197845	1.0	0.0	1.0
+chr1	197862	0.0	1.0	1.0
+chr1	197877	2.0	0.0	2.0
+chr1	198044	2.0	0.0	2.0
+chr1	198050	1.0	0.0	1.0
+chr1	198213	0.0	1.0	1.0
+chr1	198379	0.0	1.0	1.0
+chr1	198393	0.0	1.0	1.0
+chr1	198395	1.0	1.0	2.0
+chr1	198406	0.0	1.0	1.0
+chr1	198409	0.0	1.0	1.0
+chr1	198428	0.0	1.0	1.0
+chr1	198763	1.0	0.0	1.0
+chr1	198773	2.0	0.0	2.0
+chr1	198778	2.0	0.0	2.0
+chr1	198787	1.0	0.0	1.0
+chr1	198788	0.0	1.0	1.0
+chr1	198789	0.0	1.0	1.0
+chr1	198791	1.0	0.0	1.0
+chr1	198796	0.0	1.0	1.0
+chr1	198797	0.0	1.0	1.0
+chr1	198798	1.0	1.0	2.0
+chr1	198799	0.0	1.0	1.0
+chr1	198811	0.0	2.0	2.0
+chr1	198814	0.0	1.0	1.0
+chr1	198822	2.0	0.0	2.0
+chr1	198838	1.0	0.0	1.0
+chr1	198844	1.0	0.0	1.0
+chr1	198871	0.0	1.0	1.0
+chr1	198907	1.0	0.0	1.0
+chr1	198920	0.0	1.0	1.0
+chr1	198935	1.0	0.0	1.0
+chr1	198938	1.0	0.0	1.0
+chr1	198942	0.0	1.0	1.0
+chr1	198943	1.0	0.0	1.0
+chr1	198959	0.0	2.0	2.0
+chr1	198962	1.0	0.0	1.0
+chr1	198976	3.0	0.0	3.0
+chr1	199110	0.0	1.0	1.0
+chr1	199119	1.0	0.0	1.0
+chr1	199142	1.0	0.0	1.0
+chr1	199152	2.0	0.0	2.0
+chr1	199170	1.0	0.0	1.0
+chr1	199171	1.0	0.0	1.0
+chr1	199240	0.0	1.0	1.0
+chr1	199829	1.0	0.0	1.0
+chr1	199840	0.0	1.0	1.0
+chr1	199897	2.0	0.0	2.0
+chr1	199990	1.0	0.0	1.0
+chr1	200052	0.0	2.0	2.0
+chr1	200206	0.0	1.0	1.0
+chr1	200350	0.0	1.0	1.0
+chr1	200354	1.0	0.0	1.0
+chr1	200358	0.0	1.0	1.0
+chr1	200360	0.0	1.0	1.0
+chr1	200361	0.0	1.0	1.0
+chr1	200364	3.0	0.0	3.0
+chr1	200365	1.0	0.0	1.0
+chr1	200366	0.0	1.0	1.0
+chr1	200368	3.0	0.0	3.0
+chr1	200369	1.0	0.0	1.0
+chr1	200371	2.0	0.0	2.0
+chr1	200377	1.0	0.0	1.0
+chr1	200378	0.0	1.0	1.0
+chr1	200382	0.0	2.0	2.0
+chr1	200392	1.0	0.0	1.0
+chr1	200405	1.0	0.0	1.0
+chr1	200414	1.0	0.0	1.0
+chr1	200638	0.0	3.0	3.0
+chr1	200643	1.0	0.0	1.0
+chr1	200649	0.0	1.0	1.0
+chr1	200651	0.0	1.0	1.0
+chr1	200655	1.0	0.0	1.0
+chr1	200660	4.0	0.0	4.0
+chr1	200663	1.0	0.0	1.0
+chr1	200664	0.0	1.0	1.0
+chr1	200667	3.0	0.0	3.0
+chr1	200669	0.0	1.0	1.0
+chr1	200671	2.0	0.0	2.0
+chr1	200672	0.0	1.0	1.0
+chr1	200679	0.0	1.0	1.0
+chr1	200685	0.0	1.0	1.0
+chr1	200694	1.0	0.0	1.0
+chr1	200699	1.0	0.0	1.0
+chr1	200704	1.0	0.0	1.0
+chr1	200722	1.0	0.0	1.0
+chr1	200727	0.0	1.0	1.0
+chr1	200734	1.0	0.0	1.0
+chr1	200753	4.0	0.0	4.0
+chr1	200767	1.0	0.0	1.0
+chr1	200806	1.0	0.0	1.0
+chr1	200827	0.0	1.0	1.0
+chr1	200957	1.0	0.0	1.0
+chr1	200986	0.0	1.0	1.0
+chr1	201001	0.0	1.0	1.0
+chr1	201182	0.0	1.0	1.0
+chr1	201249	0.0	1.0	1.0
+chr1	201277	0.0	1.0	1.0
+chr1	201287	0.0	1.0	1.0
+chr1	201302	1.0	0.0	1.0
+chr1	201320	1.0	0.0	1.0
+chr1	201400	0.0	1.0	1.0
+chr1	201462	0.0	1.0	1.0
+chr1	201787	1.0	0.0	1.0
+chr1	201788	1.0	0.0	1.0
+chr1	201810	1.0	0.0	1.0
+chr1	201952	1.0	0.0	1.0
+chr1	202185	1.0	0.0	1.0
+chr1	202278	2.0	0.0	2.0
+chr1	202310	0.0	1.0	1.0
+chr1	202312	1.0	0.0	1.0
+chr1	202317	1.0	0.0	1.0
+chr1	202334	1.0	0.0	1.0
+chr1	202461	1.0	0.0	1.0
+chr1	202467	1.0	0.0	1.0
+chr1	202468	0.0	1.0	1.0
+chr1	202473	1.0	0.0	1.0
+chr1	202474	2.0	0.0	2.0
+chr1	202483	2.0	0.0	2.0
+chr1	202486	1.0	0.0	1.0
+chr1	202487	1.0	0.0	1.0
+chr1	202501	1.0	0.0	1.0
+chr1	202502	0.0	1.0	1.0
+chr1	202512	0.0	1.0	1.0
+chr1	202538	1.0	0.0	1.0
+chr1	202773	1.0	0.0	1.0
+chr1	202780	2.0	0.0	2.0
+chr1	202781	1.0	0.0	1.0
+chr1	202783	1.0	0.0	1.0
+chr1	202791	0.0	2.0	2.0
+chr1	202795	1.0	1.0	2.0
+chr1	202807	4.0	0.0	4.0
+chr1	202808	2.0	0.0	2.0
+chr1	202811	0.0	1.0	1.0
+chr1	202814	1.0	0.0	1.0
+chr1	202815	0.0	2.0	2.0
+chr1	202816	0.0	1.0	1.0
+chr1	202824	0.0	1.0	1.0
+chr1	202827	0.0	1.0	1.0
+chr1	202831	1.0	0.0	1.0
+chr1	202840	2.0	0.0	2.0
+chr1	202887	0.0	1.0	1.0
+chr1	202978	1.0	0.0	1.0
+chr1	202994	1.0	0.0	1.0
+chr1	202998	1.0	0.0	1.0
+chr1	202999	0.0	1.0	1.0
+chr1	203117	0.0	1.0	1.0
+chr1	203168	1.0	0.0	1.0
+chr1	203293	1.0	0.0	1.0
+chr1	203346	0.0	1.0	1.0
+chr1	203364	1.0	0.0	1.0
+chr1	203458	0.0	1.0	1.0
+chr1	203473	1.0	0.0	1.0
+chr1	203488	1.0	0.0	1.0
+chr1	203494	2.0	0.0	2.0
+chr1	203505	1.0	0.0	1.0
+chr1	203624	0.0	1.0	1.0
+chr1	203657	2.0	0.0	2.0
+chr1	203713	1.0	0.0	1.0
+chr1	203794	1.0	0.0	1.0
+chr1	203809	0.0	2.0	2.0
+chr1	203811	1.0	0.0	1.0
+chr1	203920	1.0	0.0	1.0
+chr1	203962	1.0	0.0	1.0
+chr1	204018	1.0	0.0	1.0
+chr1	204040	1.0	0.0	1.0
+chr1	204059	0.0	1.0	1.0
+chr1	204118	0.0	1.0	1.0
+chr1	204128	0.0	1.0	1.0
+chr1	204240	0.0	1.0	1.0
+chr1	204244	0.0	1.0	1.0
+chr1	204267	0.0	1.0	1.0
+chr1	204282	0.0	1.0	1.0
+chr1	204286	1.0	0.0	1.0
+chr1	204289	1.0	0.0	1.0
+chr1	204295	1.0	0.0	1.0
+chr1	204297	1.0	0.0	1.0
+chr1	204300	1.0	0.0	1.0
+chr1	204316	0.0	1.0	1.0
+chr1	204326	0.0	1.0	1.0
+chr1	204334	1.0	0.0	1.0
+chr1	204337	3.0	0.0	3.0
+chr1	204360	0.0	1.0	1.0
+chr1	204363	0.0	1.0	1.0
+chr1	204375	0.0	1.0	1.0
+chr1	204383	0.0	1.0	1.0
+chr1	204396	1.0	3.0	4.0
+chr1	204424	1.0	0.0	1.0
+chr1	204432	1.0	0.0	1.0
+chr1	204435	1.0	0.0	1.0
+chr1	204451	0.0	1.0	1.0
+chr1	204461	0.0	1.0	1.0
+chr1	204482	2.0	0.0	2.0
+chr1	204486	0.0	1.0	1.0
+chr1	204491	0.0	2.0	2.0
+chr1	204510	0.0	1.0	1.0
+chr1	204518	0.0	1.0	1.0
+chr1	204531	0.0	3.0	3.0
+chr1	204535	1.0	0.0	1.0
+chr1	204541	1.0	0.0	1.0
+chr1	204567	1.0	0.0	1.0
+chr1	204570	1.0	0.0	1.0
+chr1	204578	1.0	0.0	1.0
+chr1	204583	0.0	1.0	1.0
+chr1	204586	0.0	1.0	1.0
+chr1	204590	0.0	1.0	1.0
+chr1	204596	0.0	1.0	1.0
+chr1	204617	3.0	0.0	3.0
+chr1	204621	0.0	1.0	1.0
+chr1	204626	0.0	2.0	2.0
+chr1	204640	1.0	0.0	1.0
+chr1	204645	0.0	1.0	1.0
+chr1	204653	0.0	1.0	1.0
+chr1	204666	1.0	3.0	4.0
+chr1	204676	1.0	0.0	1.0
+chr1	204705	1.0	0.0	1.0
+chr1	204711	1.0	0.0	1.0
+chr1	204718	0.0	1.0	1.0
+chr1	204721	0.0	1.0	1.0
+chr1	204725	0.0	1.0	1.0
+chr1	204731	0.0	1.0	1.0
+chr1	204752	3.0	0.0	3.0
+chr1	204756	0.0	1.0	1.0
+chr1	204761	0.0	2.0	2.0
+chr1	204775	1.0	0.0	1.0
+chr1	204780	0.0	1.0	1.0
+chr1	204788	0.0	1.0	1.0
+chr1	204801	1.0	3.0	4.0
+chr1	204811	1.0	0.0	1.0
+chr1	204840	1.0	0.0	1.0
+chr1	204846	1.0	0.0	1.0
+chr1	204853	0.0	1.0	1.0
+chr1	204856	0.0	1.0	1.0
+chr1	204860	0.0	1.0	1.0
+chr1	204864	0.0	1.0	1.0
+chr1	204887	3.0	0.0	3.0
+chr1	204891	0.0	1.0	1.0
+chr1	204896	0.0	2.0	2.0
+chr1	204910	1.0	0.0	1.0
+chr1	204915	0.0	1.0	1.0
+chr1	204936	1.0	3.0	4.0
+chr1	204946	1.0	0.0	1.0
+chr1	204975	1.0	0.0	1.0
+chr1	204981	1.0	0.0	1.0
+chr1	204988	0.0	1.0	1.0
+chr1	204991	0.0	1.0	1.0
+chr1	204995	0.0	1.0	1.0
+chr1	204999	0.0	1.0	1.0
+chr1	205012	1.0	0.0	1.0
+chr1	205015	1.0	0.0	1.0
+chr1	205024	1.0	0.0	1.0
+chr1	205026	0.0	1.0	1.0
+chr1	205031	0.0	2.0	2.0
+chr1	205045	1.0	0.0	1.0
+chr1	205050	0.0	1.0	1.0
+chr1	205054	0.0	2.0	2.0
+chr1	205071	1.0	3.0	4.0
+chr1	205081	1.0	0.0	1.0
+chr1	205116	1.0	0.0	1.0
+chr1	205117	0.0	1.0	1.0
+chr1	205126	0.0	1.0	1.0
+chr1	205130	0.0	1.0	1.0
+chr1	205134	0.0	1.0	1.0
+chr1	205150	1.0	0.0	1.0
+chr1	205157	2.0	0.0	2.0
+chr1	205161	0.0	1.0	1.0
+chr1	205166	0.0	2.0	2.0
+chr1	205178	1.0	0.0	1.0
+chr1	205182	0.0	1.0	1.0
+chr1	205185	0.0	1.0	1.0
+chr1	205189	0.0	2.0	2.0
+chr1	205193	0.0	1.0	1.0
+chr1	205196	1.0	0.0	1.0
+chr1	205206	1.0	3.0	4.0
+chr1	205216	1.0	0.0	1.0
+chr1	205241	1.0	0.0	1.0
+chr1	205242	2.0	0.0	2.0
+chr1	205245	1.0	0.0	1.0
+chr1	205253	1.0	0.0	1.0
+chr1	205258	0.0	1.0	1.0
+chr1	205261	0.0	1.0	1.0
+chr1	205265	0.0	1.0	1.0
+chr1	205269	0.0	1.0	1.0
+chr1	205285	1.0	0.0	1.0
+chr1	205292	2.0	0.0	2.0
+chr1	205296	0.0	1.0	1.0
+chr1	205301	0.0	2.0	2.0
+chr1	205313	1.0	0.0	1.0
+chr1	205317	0.0	1.0	1.0
+chr1	205320	0.0	1.0	1.0
+chr1	205324	0.0	2.0	2.0
+chr1	205328	0.0	1.0	1.0
+chr1	205331	1.0	0.0	1.0
+chr1	205341	1.0	3.0	4.0
+chr1	205351	1.0	0.0	1.0
+chr1	205377	2.0	0.0	2.0
+chr1	205380	1.0	0.0	1.0
+chr1	205386	1.0	0.0	1.0
+chr1	205393	0.0	1.0	1.0
+chr1	205396	0.0	1.0	1.0
+chr1	205400	0.0	1.0	1.0
+chr1	205404	0.0	1.0	1.0
+chr1	205417	1.0	0.0	1.0
+chr1	205420	1.0	0.0	1.0
+chr1	205427	2.0	0.0	2.0
+chr1	205431	0.0	1.0	1.0
+chr1	205436	0.0	2.0	2.0
+chr1	205448	1.0	0.0	1.0
+chr1	205455	0.0	1.0	1.0
+chr1	205476	1.0	3.0	4.0
+chr1	205486	1.0	0.0	1.0
+chr1	205515	1.0	0.0	1.0
+chr1	205521	1.0	0.0	1.0
+chr1	205528	0.0	1.0	1.0
+chr1	205531	0.0	1.0	1.0
+chr1	205535	0.0	1.0	1.0
+chr1	205539	0.0	1.0	1.0
+chr1	205552	1.0	0.0	1.0
+chr1	205555	1.0	0.0	1.0
+chr1	205564	2.0	0.0	2.0
+chr1	205566	0.0	1.0	1.0
+chr1	205571	0.0	2.0	2.0
+chr1	205584	1.0	0.0	1.0
+chr1	205590	0.0	1.0	1.0
+chr1	205594	0.0	1.0	1.0
+chr1	205598	0.0	2.0	2.0
+chr1	205611	1.0	0.0	1.0
+chr1	205615	0.0	3.0	3.0
+chr1	205621	1.0	0.0	1.0
+chr1	205629	0.0	1.0	1.0
+chr1	205650	1.0	0.0	1.0
+chr1	205656	1.0	0.0	1.0
+chr1	205660	0.0	1.0	1.0
+chr1	205670	0.0	1.0	1.0
+chr1	205672	1.0	0.0	1.0
+chr1	205677	0.0	1.0	1.0
+chr1	205681	1.0	1.0	2.0
+chr1	205690	1.0	0.0	1.0
+chr1	205714	1.0	0.0	1.0
+chr1	205718	1.0	0.0	1.0
+chr1	205730	0.0	1.0	1.0
+chr1	205744	1.0	0.0	1.0
+chr1	205754	0.0	1.0	1.0
+chr1	205756	2.0	0.0	2.0
+chr1	205759	1.0	0.0	1.0
+chr1	205762	0.0	1.0	1.0
+chr1	205774	1.0	0.0	1.0
+chr1	205789	1.0	0.0	1.0
+chr1	205795	0.0	1.0	1.0
+chr1	205800	0.0	1.0	1.0
+chr1	205803	1.0	0.0	1.0
+chr1	205813	0.0	1.0	1.0
+chr1	205825	1.0	0.0	1.0
+chr1	205859	2.0	0.0	2.0
+chr1	205861	1.0	0.0	1.0
+chr1	205865	0.0	1.0	1.0
+chr1	205877	1.0	0.0	1.0
+chr1	205889	0.0	1.0	1.0
+chr1	205893	1.0	0.0	1.0
+chr1	205894	1.0	0.0	1.0
+chr1	205899	0.0	1.0	1.0
+chr1	205906	1.0	0.0	1.0
+chr1	205914	2.0	0.0	2.0
+chr1	205915	1.0	0.0	1.0
+chr1	205918	2.0	0.0	2.0
+chr1	205924	1.0	0.0	1.0
+chr1	205935	0.0	1.0	1.0
+chr1	205938	1.0	0.0	1.0
+chr1	205948	1.0	0.0	1.0
+chr1	205960	1.0	0.0	1.0
+chr1	205977	1.0	0.0	1.0
+chr1	205988	1.0	0.0	1.0
+chr1	205996	1.0	0.0	1.0
+chr1	206000	0.0	1.0	1.0
+chr1	206014	1.0	0.0	1.0
+chr1	206022	0.0	1.0	1.0
+chr1	206034	0.0	1.0	1.0
+chr1	206044	1.0	0.0	1.0
+chr1	206073	1.0	1.0	2.0
+chr1	206083	1.0	1.0	2.0
+chr1	206095	1.0	0.0	1.0
+chr1	206129	1.0	0.0	1.0
+chr1	206130	0.0	1.0	1.0
+chr1	206131	1.0	0.0	1.0
+chr1	206161	2.0	0.0	2.0
+chr1	206169	0.0	1.0	1.0
+chr1	206179	1.0	0.0	1.0
+chr1	206188	2.0	0.0	2.0
+chr1	206190	1.0	0.0	1.0
+chr1	206199	0.0	1.0	1.0
+chr1	206209	1.0	0.0	1.0
+chr1	206211	0.0	1.0	1.0
+chr1	206218	1.0	0.0	1.0
+chr1	206221	0.0	1.0	1.0
+chr1	206254	1.0	0.0	1.0
+chr1	206258	1.0	0.0	1.0
+chr1	206266	1.0	0.0	1.0
+chr1	206268	0.0	1.0	1.0
+chr1	206284	1.0	0.0	1.0
+chr1	206294	0.0	1.0	1.0
+chr1	206296	2.0	0.0	2.0
+chr1	206304	0.0	1.0	1.0
+chr1	206314	1.0	0.0	1.0
+chr1	206335	0.0	1.0	1.0
+chr1	206343	0.0	1.0	1.0
+chr1	206347	1.0	0.0	1.0
+chr1	206353	0.0	1.0	1.0
+chr1	206361	1.0	0.0	1.0
+chr1	206374	1.0	0.0	1.0
+chr1	206383	1.0	0.0	1.0
+chr1	206399	2.0	0.0	2.0
+chr1	206401	1.0	0.0	1.0
+chr1	206405	0.0	1.0	1.0
+chr1	206417	1.0	0.0	1.0
+chr1	206429	0.0	1.0	1.0
+chr1	206431	2.0	0.0	2.0
+chr1	206437	0.0	1.0	1.0
+chr1	206449	1.0	0.0	1.0
+chr1	206464	1.0	0.0	1.0
+chr1	206470	0.0	1.0	1.0
+chr1	206475	0.0	1.0	1.0
+chr1	206478	1.0	0.0	1.0
+chr1	206481	0.0	1.0	1.0
+chr1	206488	1.0	0.0	1.0
+chr1	206491	0.0	1.0	1.0
+chr1	206500	1.0	0.0	1.0
+chr1	206534	2.0	0.0	2.0
+chr1	206538	0.0	1.0	1.0
+chr1	206562	0.0	1.0	1.0
+chr1	206589	1.0	0.0	1.0
+chr1	206593	2.0	0.0	2.0
+chr1	206599	1.0	0.0	1.0
+chr1	206647	0.0	1.0	1.0
+chr1	206668	0.0	2.0	2.0
+chr1	206684	0.0	1.0	1.0
+chr1	206722	0.0	1.0	1.0
+chr1	206794	0.0	1.0	1.0
+chr1	206879	1.0	0.0	1.0
+chr1	206892	1.0	0.0	1.0
+chr1	206902	0.0	1.0	1.0
+chr1	206907	0.0	1.0	1.0
+chr1	206909	1.0	0.0	1.0
+chr1	206932	2.0	0.0	2.0
+chr1	206934	3.0	0.0	3.0
+chr1	206952	0.0	4.0	4.0
+chr1	206958	1.0	0.0	1.0
+chr1	207022	1.0	1.0	2.0
+chr1	207060	1.0	0.0	1.0
+chr1	207072	1.0	0.0	1.0
+chr1	207073	3.0	0.0	3.0
+chr1	207080	1.0	0.0	1.0
+chr1	207091	1.0	0.0	1.0
+chr1	207094	0.0	1.0	1.0
+chr1	207100	1.0	0.0	1.0
+chr1	207102	3.0	0.0	3.0
+chr1	207103	0.0	1.0	1.0
+chr1	207106	0.0	1.0	1.0
+chr1	207109	1.0	0.0	1.0
+chr1	207111	0.0	3.0	3.0
+chr1	207121	0.0	2.0	2.0
+chr1	207123	3.0	0.0	3.0
+chr1	207124	2.0	0.0	2.0
+chr1	207125	0.0	2.0	2.0
+chr1	207126	0.0	1.0	1.0
+chr1	207129	1.0	0.0	1.0
+chr1	207133	0.0	1.0	1.0
+chr1	207139	1.0	0.0	1.0
+chr1	207150	0.0	1.0	1.0
+chr1	207158	0.0	1.0	1.0
+chr1	207179	2.0	0.0	2.0
+chr1	207250	0.0	1.0	1.0
+chr1	207256	0.0	2.0	2.0
+chr1	207268	0.0	1.0	1.0
+chr1	207274	1.0	0.0	1.0
+chr1	207295	0.0	1.0	1.0
+chr1	207298	0.0	1.0	1.0
+chr1	207303	0.0	1.0	1.0
+chr1	207372	0.0	1.0	1.0
+chr1	207397	0.0	1.0	1.0
+chr1	207430	1.0	0.0	1.0
+chr1	207433	1.0	0.0	1.0
+chr1	207449	0.0	1.0	1.0
+chr1	207451	2.0	3.0	5.0
+chr1	207455	0.0	1.0	1.0
+chr1	207467	1.0	2.0	3.0
+chr1	207473	0.0	1.0	1.0
+chr1	207474	0.0	1.0	1.0
+chr1	207475	0.0	1.0	1.0
+chr1	207480	1.0	0.0	1.0
+chr1	207492	0.0	1.0	1.0
+chr1	207496	0.0	1.0	1.0
+chr1	207532	1.0	0.0	1.0
+chr1	207548	1.0	0.0	1.0
+chr1	207581	0.0	1.0	1.0
+chr1	207602	0.0	2.0	2.0
+chr1	207603	1.0	0.0	1.0
+chr1	207605	1.0	0.0	1.0
+chr1	207612	1.0	0.0	1.0
+chr1	207621	1.0	0.0	1.0
+chr1	207630	0.0	1.0	1.0
+chr1	207632	0.0	1.0	1.0
+chr1	207638	2.0	0.0	2.0
+chr1	207644	1.0	0.0	1.0
+chr1	207651	1.0	0.0	1.0
+chr1	207653	1.0	0.0	1.0
+chr1	207673	0.0	1.0	1.0
+chr1	207676	0.0	1.0	1.0
+chr1	207678	0.0	1.0	1.0
+chr1	207699	0.0	1.0	1.0
+chr1	207701	0.0	1.0	1.0
+chr1	207718	0.0	1.0	1.0
+chr1	207778	0.0	1.0	1.0
+chr1	207808	0.0	1.0	1.0
+chr1	207812	1.0	0.0	1.0
+chr1	207814	4.0	0.0	4.0
+chr1	207819	1.0	0.0	1.0
+chr1	207823	0.0	1.0	1.0
+chr1	207824	0.0	1.0	1.0
+chr1	207832	1.0	0.0	1.0
+chr1	207835	0.0	2.0	2.0
+chr1	207838	0.0	1.0	1.0
+chr1	207845	1.0	0.0	1.0
+chr1	207846	0.0	1.0	1.0
+chr1	207850	1.0	0.0	1.0
+chr1	207854	0.0	2.0	2.0
+chr1	207856	1.0	0.0	1.0
+chr1	207873	1.0	0.0	1.0
+chr1	207875	0.0	1.0	1.0
+chr1	207877	2.0	0.0	2.0
+chr1	207895	1.0	0.0	1.0
+chr1	207926	3.0	0.0	3.0
+chr1	207928	1.0	0.0	1.0
+chr1	207939	1.0	0.0	1.0
+chr1	207942	1.0	0.0	1.0
+chr1	207947	0.0	1.0	1.0
+chr1	207957	0.0	1.0	1.0
+chr1	207958	3.0	0.0	3.0
+chr1	207973	1.0	0.0	1.0
+chr1	207976	1.0	0.0	1.0
+chr1	207980	0.0	2.0	2.0
+chr1	207993	2.0	0.0	2.0
+chr1	207997	1.0	0.0	1.0
+chr1	208001	2.0	0.0	2.0
+chr1	208002	2.0	0.0	2.0
+chr1	208005	2.0	0.0	2.0
+chr1	208018	1.0	0.0	1.0
+chr1	208020	0.0	1.0	1.0
+chr1	208021	0.0	1.0	1.0
+chr1	208163	1.0	0.0	1.0
+chr1	208169	0.0	1.0	1.0
+chr1	208368	0.0	1.0	1.0
+chr1	208369	0.0	1.0	1.0
+chr1	208371	1.0	0.0	1.0
+chr1	208372	1.0	0.0	1.0
+chr1	208381	0.0	1.0	1.0
+chr1	208387	0.0	1.0	1.0
+chr1	208389	1.0	0.0	1.0
+chr1	208392	0.0	1.0	1.0
+chr1	208399	1.0	0.0	1.0
+chr1	208404	1.0	0.0	1.0
+chr1	208407	2.0	0.0	2.0
+chr1	208408	1.0	0.0	1.0
+chr1	208411	1.0	0.0	1.0
+chr1	208418	0.0	2.0	2.0
+chr1	208433	1.0	0.0	1.0
+chr1	208434	0.0	1.0	1.0
+chr1	208451	1.0	0.0	1.0
+chr1	208452	2.0	0.0	2.0
+chr1	208462	0.0	1.0	1.0
+chr1	208472	0.0	1.0	1.0
+chr1	208478	1.0	0.0	1.0
+chr1	208484	1.0	0.0	1.0
+chr1	208505	2.0	0.0	2.0
+chr1	208521	0.0	1.0	1.0
+chr1	208524	0.0	1.0	1.0
+chr1	208548	0.0	1.0	1.0
+chr1	208551	0.0	1.0	1.0
+chr1	208564	1.0	0.0	1.0
+chr1	208565	1.0	0.0	1.0
+chr1	208572	0.0	2.0	2.0
+chr1	208575	0.0	1.0	1.0
+chr1	208592	0.0	1.0	1.0
+chr1	208602	1.0	0.0	1.0
+chr1	208728	0.0	1.0	1.0
+chr1	208741	0.0	1.0	1.0
+chr1	208744	1.0	0.0	1.0
+chr1	208745	1.0	0.0	1.0
+chr1	208749	1.0	0.0	1.0
+chr1	208753	2.0	0.0	2.0
+chr1	208761	0.0	1.0	1.0
+chr1	208767	0.0	1.0	1.0
+chr1	208782	0.0	1.0	1.0
+chr1	208787	0.0	1.0	1.0
+chr1	208795	2.0	0.0	2.0
+chr1	208797	1.0	0.0	1.0
+chr1	208822	0.0	1.0	1.0
+chr1	208830	1.0	1.0	2.0
+chr1	208847	2.0	0.0	2.0
+chr1	208850	0.0	1.0	1.0
+chr1	208899	0.0	2.0	2.0
+chr1	208917	0.0	1.0	1.0
+chr1	208935	2.0	0.0	2.0
+chr1	208936	0.0	1.0	1.0
+chr1	208938	0.0	2.0	2.0
+chr1	208942	2.0	0.0	2.0
+chr1	208954	1.0	0.0	1.0
+chr1	208956	1.0	0.0	1.0
+chr1	208958	1.0	0.0	1.0
+chr1	208959	2.0	0.0	2.0
+chr1	208962	1.0	3.0	4.0
+chr1	208966	0.0	1.0	1.0
+chr1	208972	0.0	1.0	1.0
+chr1	208977	1.0	0.0	1.0
+chr1	208982	1.0	2.0	3.0
+chr1	208985	0.0	2.0	2.0
+chr1	208988	1.0	0.0	1.0
+chr1	208989	0.0	1.0	1.0
+chr1	209010	1.0	0.0	1.0
+chr1	209046	2.0	0.0	2.0
+chr1	209144	1.0	0.0	1.0
+chr1	209158	0.0	1.0	1.0
+chr1	209182	2.0	0.0	2.0
+chr1	209214	0.0	1.0	1.0
+chr1	209217	1.0	0.0	1.0
+chr1	209228	0.0	1.0	1.0
+chr1	209234	0.0	1.0	1.0
+chr1	209248	0.0	1.0	1.0
+chr1	209251	1.0	0.0	1.0
+chr1	209252	1.0	0.0	1.0
+chr1	209255	0.0	2.0	2.0
+chr1	209257	1.0	5.0	6.0
+chr1	209260	0.0	1.0	1.0
+chr1	209263	0.0	1.0	1.0
+chr1	209269	1.0	0.0	1.0
+chr1	209278	0.0	1.0	1.0
+chr1	209280	1.0	0.0	1.0
+chr1	209285	0.0	2.0	2.0
+chr1	209286	0.0	1.0	1.0
+chr1	209298	0.0	1.0	1.0
+chr1	209312	2.0	0.0	2.0
+chr1	209379	1.0	0.0	1.0
+chr1	209385	0.0	1.0	1.0
+chr1	209419	0.0	1.0	1.0
+chr1	209420	1.0	0.0	1.0
+chr1	209423	0.0	1.0	1.0
+chr1	209626	1.0	0.0	1.0
+chr1	209651	0.0	1.0	1.0
+chr1	209654	1.0	0.0	1.0
+chr1	209663	3.0	0.0	3.0
+chr1	209716	1.0	0.0	1.0
+chr1	209730	0.0	2.0	2.0
+chr1	209736	1.0	0.0	1.0
+chr1	209743	0.0	1.0	1.0
+chr1	209754	0.0	2.0	2.0
+chr1	209758	1.0	0.0	1.0
+chr1	209763	0.0	1.0	1.0
+chr1	209783	0.0	1.0	1.0
+chr1	209786	0.0	1.0	1.0
+chr1	209802	1.0	0.0	1.0
+chr1	209803	1.0	0.0	1.0
+chr1	209826	1.0	0.0	1.0
+chr1	209837	1.0	0.0	1.0
+chr1	209839	0.0	1.0	1.0
+chr1	209840	0.0	1.0	1.0
+chr1	209846	0.0	1.0	1.0
+chr1	209847	0.0	1.0	1.0
+chr1	209852	2.0	0.0	2.0
+chr1	209907	1.0	0.0	1.0
+chr1	209921	0.0	1.0	1.0
+chr1	209924	0.0	1.0	1.0
+chr1	209932	0.0	1.0	1.0
+chr1	209951	1.0	0.0	1.0
+chr1	209995	0.0	1.0	1.0
+chr1	210006	1.0	0.0	1.0
+chr1	210063	0.0	1.0	1.0
+chr1	210068	1.0	0.0	1.0
+chr1	210072	2.0	0.0	2.0
+chr1	210087	0.0	1.0	1.0
+chr1	210097	1.0	0.0	1.0
+chr1	210115	1.0	0.0	1.0
+chr1	210118	0.0	1.0	1.0
+chr1	210138	0.0	1.0	1.0
+chr1	210153	0.0	1.0	1.0
+chr1	210154	0.0	1.0	1.0
+chr1	210157	0.0	1.0	1.0
+chr1	210172	2.0	0.0	2.0
+chr1	210227	1.0	0.0	1.0
+chr1	210235	1.0	0.0	1.0
+chr1	210239	0.0	1.0	1.0
+chr1	210243	1.0	0.0	1.0
+chr1	210247	1.0	0.0	1.0
+chr1	210248	1.0	0.0	1.0
+chr1	210257	1.0	0.0	1.0
+chr1	210264	2.0	0.0	2.0
+chr1	210265	1.0	1.0	2.0
+chr1	210273	0.0	2.0	2.0
+chr1	210274	0.0	1.0	1.0
+chr1	210280	3.0	0.0	3.0
+chr1	210284	0.0	2.0	2.0
+chr1	210286	1.0	0.0	1.0
+chr1	210288	1.0	0.0	1.0
+chr1	210292	2.0	0.0	2.0
+chr1	210298	0.0	2.0	2.0
+chr1	210316	1.0	0.0	1.0
+chr1	210317	2.0	0.0	2.0
+chr1	210362	1.0	0.0	1.0
+chr1	210372	0.0	1.0	1.0
+chr1	210392	1.0	0.0	1.0
+chr1	210399	1.0	0.0	1.0
+chr1	210423	0.0	1.0	1.0
+chr1	210430	0.0	1.0	1.0
+chr1	210432	1.0	0.0	1.0
+chr1	210434	0.0	1.0	1.0
+chr1	210455	1.0	0.0	1.0
+chr1	210465	0.0	1.0	1.0
+chr1	210469	1.0	1.0	2.0
+chr1	210479	0.0	1.0	1.0
+chr1	210480	3.0	0.0	3.0
+chr1	210482	0.0	1.0	1.0
+chr1	210497	0.0	2.0	2.0
+chr1	210505	1.0	0.0	1.0
+chr1	210616	1.0	0.0	1.0
+chr1	210635	2.0	0.0	2.0
+chr1	210640	0.0	3.0	3.0
+chr1	210649	1.0	0.0	1.0
+chr1	210651	1.0	0.0	1.0
+chr1	210661	1.0	0.0	1.0
+chr1	210672	0.0	1.0	1.0
+chr1	210673	1.0	0.0	1.0
+chr1	210682	1.0	0.0	1.0
+chr1	210686	0.0	1.0	1.0
+chr1	210689	1.0	0.0	1.0
+chr1	210694	0.0	2.0	2.0
+chr1	210697	0.0	1.0	1.0
+chr1	210698	0.0	1.0	1.0
+chr1	210716	0.0	2.0	2.0
+chr1	210745	0.0	1.0	1.0
+chr1	210746	1.0	0.0	1.0
+chr1	210778	2.0	0.0	2.0
+chr1	210790	1.0	0.0	1.0
+chr1	210792	0.0	1.0	1.0
+chr1	210795	1.0	0.0	1.0
+chr1	210874	1.0	0.0	1.0
+chr1	210894	0.0	1.0	1.0
+chr1	210899	0.0	1.0	1.0
+chr1	211029	1.0	0.0	1.0
+chr1	211189	0.0	1.0	1.0
+chr1	211229	1.0	0.0	1.0
+chr1	211244	1.0	0.0	1.0
+chr1	211245	0.0	1.0	1.0
+chr1	211262	3.0	0.0	3.0
+chr1	211264	0.0	2.0	2.0
+chr1	211265	0.0	1.0	1.0
+chr1	211267	0.0	1.0	1.0
+chr1	211268	0.0	2.0	2.0
+chr1	211269	3.0	0.0	3.0
+chr1	211270	0.0	2.0	2.0
+chr1	211271	0.0	1.0	1.0
+chr1	211273	1.0	0.0	1.0
+chr1	211274	1.0	0.0	1.0
+chr1	211278	0.0	4.0	4.0
+chr1	211279	0.0	2.0	2.0
+chr1	211281	1.0	0.0	1.0
+chr1	211282	3.0	0.0	3.0
+chr1	211283	0.0	1.0	1.0
+chr1	211294	0.0	2.0	2.0
+chr1	211296	0.0	1.0	1.0
+chr1	211302	0.0	1.0	1.0
+chr1	211307	1.0	0.0	1.0
+chr1	211308	0.0	2.0	2.0
+chr1	211352	0.0	1.0	1.0
+chr1	211413	0.0	1.0	1.0
+chr1	211419	1.0	0.0	1.0
+chr1	211420	0.0	2.0	2.0
+chr1	211427	1.0	0.0	1.0
+chr1	211452	0.0	1.0	1.0
+chr1	211454	1.0	0.0	1.0
+chr1	211462	1.0	0.0	1.0
+chr1	211464	2.0	0.0	2.0
+chr1	211466	1.0	0.0	1.0
+chr1	211468	1.0	0.0	1.0
+chr1	211473	0.0	1.0	1.0
+chr1	211489	1.0	0.0	1.0
+chr1	211508	0.0	1.0	1.0
+chr1	211509	1.0	0.0	1.0
+chr1	211518	0.0	1.0	1.0
+chr1	211555	1.0	0.0	1.0
+chr1	211556	1.0	0.0	1.0
+chr1	211563	1.0	0.0	1.0
+chr1	211566	1.0	1.0	2.0
+chr1	211575	0.0	1.0	1.0
+chr1	211599	1.0	2.0	3.0
+chr1	211600	1.0	0.0	1.0
+chr1	211615	1.0	0.0	1.0
+chr1	211631	1.0	0.0	1.0
+chr1	211633	0.0	1.0	1.0
+chr1	211635	0.0	1.0	1.0
+chr1	211700	0.0	1.0	1.0
+chr1	211756	0.0	1.0	1.0
+chr1	211762	0.0	1.0	1.0
+chr1	211766	1.0	0.0	1.0
+chr1	211772	1.0	0.0	1.0
+chr1	211774	1.0	0.0	1.0
+chr1	211778	1.0	0.0	1.0
+chr1	211787	0.0	2.0	2.0
+chr1	211793	1.0	0.0	1.0
+chr1	211798	0.0	2.0	2.0
+chr1	211807	0.0	2.0	2.0
+chr1	211810	1.0	0.0	1.0
+chr1	211813	0.0	1.0	1.0
+chr1	211828	1.0	0.0	1.0
+chr1	211831	1.0	0.0	1.0
+chr1	211852	0.0	1.0	1.0
+chr1	211865	0.0	1.0	1.0
+chr1	211886	1.0	0.0	1.0
+chr1	211895	1.0	0.0	1.0
+chr1	211924	0.0	1.0	1.0
+chr1	211931	1.0	0.0	1.0
+chr1	211944	0.0	1.0	1.0
+chr1	211955	2.0	0.0	2.0
+chr1	211974	0.0	1.0	1.0
+chr1	211976	1.0	0.0	1.0
+chr1	211983	0.0	1.0	1.0
+chr1	211988	0.0	1.0	1.0
+chr1	211993	0.0	1.0	1.0
+chr1	212006	0.0	2.0	2.0
+chr1	212010	1.0	0.0	1.0
+chr1	212021	2.0	0.0	2.0
+chr1	212062	0.0	1.0	1.0
+chr1	212077	0.0	1.0	1.0
+chr1	212091	0.0	1.0	1.0
+chr1	212094	1.0	0.0	1.0
+chr1	212095	0.0	2.0	2.0
+chr1	212118	0.0	1.0	1.0
+chr1	212131	2.0	0.0	2.0
+chr1	212142	0.0	1.0	1.0
+chr1	212153	1.0	0.0	1.0
+chr1	212155	2.0	0.0	2.0
+chr1	212157	0.0	1.0	1.0
+chr1	212168	2.0	0.0	2.0
+chr1	212172	1.0	0.0	1.0
+chr1	212194	0.0	2.0	2.0
+chr1	212205	1.0	0.0	1.0
+chr1	212218	0.0	1.0	1.0
+chr1	212293	0.0	1.0	1.0
+chr1	212294	0.0	1.0	1.0
+chr1	212297	0.0	1.0	1.0
+chr1	212324	1.0	0.0	1.0
+chr1	212328	1.0	0.0	1.0
+chr1	212347	3.0	0.0	3.0
+chr1	212365	0.0	1.0	1.0
+chr1	212403	0.0	1.0	1.0
+chr1	212407	1.0	0.0	1.0
+chr1	212408	2.0	0.0	2.0
+chr1	212409	2.0	1.0	3.0
+chr1	212410	0.0	1.0	1.0
+chr1	212465	1.0	0.0	1.0
+chr1	212475	1.0	0.0	1.0
+chr1	212479	0.0	1.0	1.0
+chr1	212480	0.0	3.0	3.0
+chr1	212491	0.0	1.0	1.0
+chr1	212502	0.0	3.0	3.0
+chr1	212507	0.0	1.0	1.0
+chr1	212515	1.0	0.0	1.0
+chr1	212518	0.0	1.0	1.0
+chr1	212533	0.0	1.0	1.0
+chr1	212534	1.0	0.0	1.0
+chr1	212538	1.0	0.0	1.0
+chr1	212540	0.0	1.0	1.0
+chr1	212549	0.0	4.0	4.0
+chr1	212552	2.0	1.0	3.0
+chr1	212559	1.0	0.0	1.0
+chr1	212561	1.0	0.0	1.0
+chr1	212562	0.0	1.0	1.0
+chr1	212569	1.0	0.0	1.0
+chr1	212575	1.0	1.0	2.0
+chr1	212615	0.0	1.0	1.0
+chr1	212639	1.0	0.0	1.0
+chr1	212649	3.0	0.0	3.0
+chr1	212651	0.0	1.0	1.0
+chr1	212656	1.0	0.0	1.0
+chr1	212661	1.0	1.0	2.0
+chr1	212667	1.0	0.0	1.0
+chr1	212670	0.0	2.0	2.0
+chr1	212673	0.0	1.0	1.0
+chr1	212674	2.0	0.0	2.0
+chr1	212680	1.0	0.0	1.0
+chr1	212682	1.0	0.0	1.0
+chr1	212686	0.0	1.0	1.0
+chr1	212687	0.0	1.0	1.0
+chr1	212699	1.0	2.0	3.0
+chr1	212700	1.0	1.0	2.0
+chr1	212711	1.0	0.0	1.0
+chr1	212725	1.0	0.0	1.0
+chr1	212826	1.0	0.0	1.0
+chr1	212835	0.0	1.0	1.0
+chr1	212846	0.0	1.0	1.0
+chr1	212858	1.0	0.0	1.0
+chr1	212859	1.0	0.0	1.0
+chr1	212864	1.0	1.0	2.0
+chr1	212865	0.0	1.0	1.0
+chr1	212876	0.0	1.0	1.0
+chr1	212882	0.0	1.0	1.0
+chr1	212913	1.0	0.0	1.0
+chr1	212942	1.0	0.0	1.0
+chr1	213003	1.0	0.0	1.0
+chr1	213009	0.0	4.0	4.0
+chr1	213011	1.0	0.0	1.0
+chr1	213017	1.0	0.0	1.0
+chr1	213030	2.0	0.0	2.0
+chr1	213032	0.0	1.0	1.0
+chr1	213036	1.0	0.0	1.0
+chr1	213037	0.0	1.0	1.0
+chr1	213041	1.0	0.0	1.0
+chr1	213042	1.0	0.0	1.0
+chr1	213044	0.0	1.0	1.0
+chr1	213047	0.0	1.0	1.0
+chr1	213064	1.0	0.0	1.0
+chr1	213133	1.0	0.0	1.0
+chr1	213167	1.0	0.0	1.0
+chr1	213203	0.0	1.0	1.0
+chr1	213205	0.0	1.0	1.0
+chr1	213210	0.0	1.0	1.0
+chr1	213220	1.0	1.0	2.0
+chr1	213221	1.0	0.0	1.0
+chr1	213224	0.0	1.0	1.0
+chr1	213225	0.0	1.0	1.0
+chr1	213229	0.0	3.0	3.0
+chr1	213234	1.0	0.0	1.0
+chr1	213237	0.0	1.0	1.0
+chr1	213245	0.0	1.0	1.0
+chr1	213253	1.0	0.0	1.0
+chr1	213297	1.0	0.0	1.0
+chr1	213298	1.0	0.0	1.0
+chr1	213313	0.0	1.0	1.0
+chr1	213317	1.0	0.0	1.0
+chr1	213358	1.0	0.0	1.0
+chr1	213361	1.0	0.0	1.0
+chr1	213365	0.0	2.0	2.0
+chr1	213366	0.0	1.0	1.0
+chr1	213374	0.0	1.0	1.0
+chr1	213380	1.0	0.0	1.0
+chr1	213384	2.0	0.0	2.0
+chr1	213385	1.0	0.0	1.0
+chr1	213386	1.0	0.0	1.0
+chr1	213402	3.0	0.0	3.0
+chr1	213441	1.0	1.0	2.0
+chr1	213442	0.0	1.0	1.0
+chr1	213459	0.0	1.0	1.0
+chr1	213463	2.0	0.0	2.0
+chr1	213500	1.0	0.0	1.0
+chr1	213515	1.0	0.0	1.0
+chr1	213538	0.0	1.0	1.0
+chr1	213539	1.0	0.0	1.0
+chr1	213543	3.0	0.0	3.0
+chr1	213674	1.0	0.0	1.0
+chr1	213680	2.0	0.0	2.0
+chr1	213697	0.0	3.0	3.0
+chr1	213706	1.0	0.0	1.0
+chr1	213708	1.0	0.0	1.0
+chr1	213718	1.0	0.0	1.0
+chr1	213722	0.0	1.0	1.0
+chr1	213727	0.0	1.0	1.0
+chr1	213739	1.0	0.0	1.0
+chr1	213747	2.0	0.0	2.0
+chr1	213830	1.0	0.0	1.0
+chr1	213838	1.0	0.0	1.0
+chr1	213850	0.0	1.0	1.0
+chr1	213857	3.0	0.0	3.0
+chr1	213863	0.0	1.0	1.0
+chr1	213864	1.0	1.0	2.0
+chr1	213865	0.0	1.0	1.0
+chr1	213873	1.0	0.0	1.0
+chr1	213874	1.0	0.0	1.0
+chr1	213876	1.0	0.0	1.0
+chr1	213877	0.0	1.0	1.0
+chr1	213879	0.0	1.0	1.0
+chr1	213881	1.0	0.0	1.0
+chr1	213883	1.0	0.0	1.0
+chr1	213884	6.0	0.0	6.0
+chr1	213887	1.0	0.0	1.0
+chr1	213894	1.0	0.0	1.0
+chr1	213896	1.0	0.0	1.0
+chr1	213938	0.0	1.0	1.0
+chr1	214018	0.0	1.0	1.0
+chr1	214019	1.0	0.0	1.0
+chr1	214025	0.0	1.0	1.0
+chr1	214026	0.0	2.0	2.0
+chr1	214029	1.0	0.0	1.0
+chr1	214032	3.0	0.0	3.0
+chr1	214035	0.0	1.0	1.0
+chr1	214042	1.0	0.0	1.0
+chr1	214048	2.0	0.0	2.0
+chr1	214053	0.0	1.0	1.0
+chr1	214054	0.0	2.0	2.0
+chr1	214057	0.0	1.0	1.0
+chr1	214058	0.0	1.0	1.0
+chr1	214059	0.0	2.0	2.0
+chr1	214080	1.0	0.0	1.0
+chr1	214101	0.0	1.0	1.0
+chr1	214208	1.0	0.0	1.0
+chr1	214213	0.0	2.0	2.0
+chr1	214214	1.0	0.0	1.0
+chr1	214217	1.0	0.0	1.0
+chr1	214220	1.0	0.0	1.0
+chr1	214221	2.0	0.0	2.0
+chr1	214232	1.0	0.0	1.0
+chr1	214233	3.0	0.0	3.0
+chr1	214234	2.0	0.0	2.0
+chr1	214237	1.0	0.0	1.0
+chr1	214253	0.0	1.0	1.0
+chr1	214258	0.0	1.0	1.0
+chr1	214263	1.0	0.0	1.0
+chr1	214269	0.0	1.0	1.0
+chr1	214272	2.0	0.0	2.0
+chr1	214276	1.0	0.0	1.0
+chr1	214278	0.0	2.0	2.0
+chr1	214283	2.0	0.0	2.0
+chr1	214291	0.0	5.0	5.0
+chr1	214292	0.0	4.0	4.0
+chr1	214293	1.0	1.0	2.0
+chr1	214294	0.0	1.0	1.0
+chr1	214299	0.0	1.0	1.0
+chr1	214303	0.0	2.0	2.0
+chr1	214304	1.0	1.0	2.0
+chr1	214308	0.0	1.0	1.0
+chr1	214311	5.0	0.0	5.0
+chr1	214321	0.0	1.0	1.0
+chr1	214325	1.0	0.0	1.0
+chr1	214338	1.0	0.0	1.0
+chr1	214390	1.0	0.0	1.0
+chr1	214405	0.0	1.0	1.0
+chr1	214406	0.0	1.0	1.0
+chr1	214413	0.0	1.0	1.0
+chr1	214458	1.0	0.0	1.0
+chr1	214468	1.0	0.0	1.0
+chr1	214542	1.0	0.0	1.0
+chr1	214725	0.0	1.0	1.0
+chr1	214738	0.0	1.0	1.0
+chr1	214739	0.0	2.0	2.0
+chr1	214771	1.0	0.0	1.0
+chr1	214801	2.0	0.0	2.0
+chr1	214831	1.0	0.0	1.0
+chr1	214852	0.0	1.0	1.0
+chr1	215175	1.0	0.0	1.0
+chr1	215271	3.0	0.0	3.0
+chr1	215332	0.0	1.0	1.0
+chr1	215473	0.0	1.0	1.0
+chr1	215614	1.0	0.0	1.0
+chr1	215634	1.0	0.0	1.0
+chr1	215706	2.0	0.0	2.0
+chr1	215740	0.0	2.0	2.0
+chr1	215808	0.0	1.0	1.0
+chr1	215817	0.0	1.0	1.0
+chr1	215927	0.0	1.0	1.0
+chr1	215944	1.0	0.0	1.0
+chr1	215968	1.0	0.0	1.0
+chr1	215987	0.0	1.0	1.0
+chr1	216039	0.0	1.0	1.0
+chr1	216180	1.0	0.0	1.0
+chr1	216495	0.0	1.0	1.0
+chr1	216504	0.0	1.0	1.0
+chr1	216526	1.0	0.0	1.0
+chr1	216543	0.0	1.0	1.0
+chr1	216547	0.0	1.0	1.0
+chr1	216551	0.0	1.0	1.0
+chr1	216574	0.0	1.0	1.0
+chr1	216582	0.0	1.0	1.0
+chr1	216704	0.0	1.0	1.0
+chr1	216721	0.0	1.0	1.0
+chr1	216728	1.0	0.0	1.0
+chr1	216869	1.0	0.0	1.0
+chr1	216874	2.0	0.0	2.0
+chr1	216878	1.0	0.0	1.0
+chr1	216894	0.0	1.0	1.0
+chr1	216895	1.0	0.0	1.0
+chr1	216905	0.0	1.0	1.0
+chr1	216938	0.0	1.0	1.0
+chr1	216978	1.0	0.0	1.0
+chr1	217015	4.0	0.0	4.0
+chr1	217064	0.0	1.0	1.0
+chr1	217122	1.0	0.0	1.0
+chr1	217217	1.0	0.0	1.0
+chr1	217224	1.0	0.0	1.0
+chr1	217225	1.0	0.0	1.0
+chr1	217226	2.0	0.0	2.0
+chr1	217227	0.0	2.0	2.0
+chr1	217233	1.0	1.0	2.0
+chr1	217234	0.0	1.0	1.0
+chr1	217235	1.0	0.0	1.0
+chr1	217236	0.0	3.0	3.0
+chr1	217239	0.0	1.0	1.0
+chr1	217241	1.0	2.0	3.0
+chr1	217244	0.0	1.0	1.0
+chr1	217245	0.0	1.0	1.0
+chr1	217246	0.0	1.0	1.0
+chr1	217249	1.0	0.0	1.0
+chr1	217252	1.0	0.0	1.0
+chr1	217253	0.0	2.0	2.0
+chr1	217257	2.0	0.0	2.0
+chr1	217264	1.0	0.0	1.0
+chr1	217265	0.0	1.0	1.0
+chr1	217270	0.0	1.0	1.0
+chr1	217278	1.0	0.0	1.0
+chr1	217279	1.0	0.0	1.0
+chr1	217281	1.0	0.0	1.0
+chr1	217289	1.0	0.0	1.0
+chr1	217291	1.0	0.0	1.0
+chr1	217299	1.0	1.0	2.0
+chr1	217302	0.0	1.0	1.0
+chr1	217317	0.0	1.0	1.0
+chr1	217601	1.0	0.0	1.0
+chr1	217602	3.0	0.0	3.0
+chr1	217605	3.0	0.0	3.0
+chr1	217610	0.0	1.0	1.0
+chr1	217611	2.0	0.0	2.0
+chr1	217612	0.0	1.0	1.0
+chr1	217616	1.0	0.0	1.0
+chr1	217630	0.0	1.0	1.0
+chr1	217631	0.0	2.0	2.0
+chr1	217634	1.0	0.0	1.0
+chr1	217637	0.0	1.0	1.0
+chr1	217638	0.0	1.0	1.0
+chr1	217641	3.0	0.0	3.0
+chr1	217645	0.0	1.0	1.0
+chr1	217647	1.0	0.0	1.0
+chr1	217650	0.0	1.0	1.0
+chr1	217654	1.0	0.0	1.0
+chr1	217656	0.0	1.0	1.0
+chr1	217658	0.0	1.0	1.0
+chr1	217722	0.0	3.0	3.0
+chr1	217735	0.0	1.0	1.0
+chr1	217767	0.0	1.0	1.0
+chr1	217776	0.0	1.0	1.0
+chr1	217787	2.0	0.0	2.0
+chr1	217795	0.0	1.0	1.0
+chr1	217804	1.0	0.0	1.0
+chr1	217809	1.0	0.0	1.0
+chr1	217862	0.0	1.0	1.0
+chr1	217951	0.0	1.0	1.0
+chr1	217956	1.0	0.0	1.0
+chr1	217963	2.0	0.0	2.0
+chr1	217964	0.0	1.0	1.0
+chr1	217966	2.0	1.0	3.0
+chr1	217967	0.0	1.0	1.0
+chr1	217971	1.0	0.0	1.0
+chr1	217973	1.0	0.0	1.0
+chr1	217980	1.0	0.0	1.0
+chr1	217982	0.0	2.0	2.0
+chr1	218015	1.0	0.0	1.0
+chr1	218024	1.0	0.0	1.0
+chr1	218053	0.0	1.0	1.0
+chr1	218063	0.0	1.0	1.0
+chr1	218136	1.0	0.0	1.0
+chr1	218181	0.0	1.0	1.0
+chr1	218183	1.0	0.0	1.0
+chr1	218192	0.0	1.0	1.0
+chr1	218224	1.0	0.0	1.0
+chr1	218264	1.0	0.0	1.0
+chr1	218283	0.0	1.0	1.0
+chr1	218308	1.0	0.0	1.0
+chr1	218314	0.0	1.0	1.0
+chr1	218327	1.0	0.0	1.0
+chr1	218334	1.0	0.0	1.0
+chr1	218341	1.0	0.0	1.0
+chr1	218375	1.0	0.0	1.0
+chr1	218411	0.0	1.0	1.0
+chr1	218415	1.0	0.0	1.0
+chr1	218439	1.0	0.0	1.0
+chr1	218457	0.0	1.0	1.0
+chr1	218538	0.0	2.0	2.0
+chr1	218570	0.0	1.0	1.0
+chr1	218608	1.0	0.0	1.0
+chr1	218609	0.0	1.0	1.0
+chr1	218614	1.0	0.0	1.0
+chr1	218650	1.0	0.0	1.0
+chr1	218663	1.0	0.0	1.0
+chr1	218670	0.0	1.0	1.0
+chr1	218680	0.0	1.0	1.0
+chr1	218689	0.0	1.0	1.0
+chr1	218748	1.0	0.0	1.0
+chr1	218756	0.0	1.0	1.0
+chr1	218768	1.0	0.0	1.0
+chr1	218772	0.0	1.0	1.0
+chr1	218775	1.0	0.0	1.0
+chr1	218778	0.0	2.0	2.0
+chr1	218788	0.0	1.0	1.0
+chr1	218841	0.0	1.0	1.0
+chr1	218847	0.0	1.0	1.0
+chr1	218853	0.0	1.0	1.0
+chr1	218860	1.0	0.0	1.0
+chr1	218905	1.0	0.0	1.0
+chr1	218922	0.0	1.0	1.0
+chr1	218929	1.0	0.0	1.0
+chr1	218949	0.0	1.0	1.0
+chr1	218974	4.0	0.0	4.0
+chr1	219007	0.0	1.0	1.0
+chr1	219024	1.0	1.0	2.0
+chr1	219026	1.0	0.0	1.0
+chr1	219033	0.0	1.0	1.0
+chr1	219063	1.0	0.0	1.0
+chr1	219078	1.0	0.0	1.0
+chr1	219087	1.0	0.0	1.0
+chr1	219102	0.0	2.0	2.0
+chr1	219118	0.0	1.0	1.0
+chr1	219165	0.0	1.0	1.0
+chr1	219246	1.0	0.0	1.0
+chr1	219251	1.0	0.0	1.0
+chr1	219253	0.0	2.0	2.0
+chr1	219267	0.0	1.0	1.0
+chr1	219268	0.0	1.0	1.0
+chr1	219282	1.0	0.0	1.0
+chr1	219294	1.0	0.0	1.0
+chr1	219401	1.0	0.0	1.0
+chr1	219408	0.0	1.0	1.0
+chr1	219421	0.0	1.0	1.0
+chr1	219426	0.0	1.0	1.0
+chr1	219437	0.0	1.0	1.0
+chr1	219441	1.0	2.0	3.0
+chr1	219442	1.0	0.0	1.0
+chr1	219477	1.0	0.0	1.0
+chr1	219485	2.0	0.0	2.0
+chr1	219547	0.0	1.0	1.0
+chr1	219552	0.0	1.0	1.0
+chr1	219565	0.0	1.0	1.0
+chr1	219589	3.0	0.0	3.0
+chr1	219593	1.0	0.0	1.0
+chr1	219600	0.0	1.0	1.0
+chr1	219606	0.0	1.0	1.0
+chr1	219612	1.0	0.0	1.0
+chr1	219614	0.0	2.0	2.0
+chr1	219615	1.0	0.0	1.0
+chr1	219629	1.0	0.0	1.0
+chr1	219633	0.0	1.0	1.0
+chr1	219645	1.0	0.0	1.0
+chr1	219665	0.0	1.0	1.0
+chr1	219741	0.0	1.0	1.0
+chr1	219742	1.0	0.0	1.0
+chr1	219754	1.0	0.0	1.0
+chr1	219759	0.0	2.0	2.0
+chr1	219764	1.0	0.0	1.0
+chr1	219793	0.0	1.0	1.0
+chr1	219818	0.0	1.0	1.0
+chr1	219838	0.0	1.0	1.0
+chr1	219863	0.0	1.0	1.0
+chr1	219868	1.0	0.0	1.0
+chr1	219907	1.0	0.0	1.0
+chr1	219908	2.0	0.0	2.0
+chr1	219914	0.0	1.0	1.0
+chr1	219926	1.0	0.0	1.0
+chr1	219934	0.0	1.0	1.0
+chr1	219965	0.0	1.0	1.0
+chr1	219973	2.0	0.0	2.0
+chr1	220097	0.0	2.0	2.0
+chr1	220122	1.0	0.0	1.0
+chr1	220133	1.0	0.0	1.0
+chr1	220160	0.0	1.0	1.0
+chr1	220175	1.0	2.0	3.0
+chr1	220209	0.0	1.0	1.0
+chr1	220407	0.0	1.0	1.0
+chr1	220454	1.0	0.0	1.0
+chr1	220505	2.0	0.0	2.0
+chr1	220512	0.0	1.0	1.0
+chr1	220513	1.0	0.0	1.0
+chr1	220516	0.0	1.0	1.0
+chr1	220529	1.0	0.0	1.0
+chr1	220532	0.0	3.0	3.0
+chr1	220535	0.0	1.0	1.0
+chr1	220551	0.0	3.0	3.0
+chr1	220567	1.0	0.0	1.0
+chr1	220578	0.0	1.0	1.0
+chr1	220589	1.0	0.0	1.0
+chr1	220608	0.0	1.0	1.0
+chr1	220731	1.0	0.0	1.0
+chr1	220736	1.0	0.0	1.0
+chr1	220739	0.0	2.0	2.0
+chr1	220749	0.0	1.0	1.0
+chr1	220896	1.0	0.0	1.0
+chr1	220912	0.0	1.0	1.0
+chr1	220913	0.0	1.0	1.0
+chr1	220915	1.0	0.0	1.0
+chr1	220922	2.0	0.0	2.0
+chr1	220923	0.0	1.0	1.0
+chr1	221060	1.0	0.0	1.0
+chr1	221079	1.0	0.0	1.0
+chr1	221087	1.0	0.0	1.0
+chr1	221098	0.0	1.0	1.0
+chr1	221109	1.0	0.0	1.0
+chr1	221121	0.0	1.0	1.0
+chr1	221123	0.0	1.0	1.0
+chr1	221125	0.0	1.0	1.0
+chr1	221127	0.0	1.0	1.0
+chr1	221129	2.0	0.0	2.0
+chr1	221134	2.0	0.0	2.0
+chr1	221135	1.0	0.0	1.0
+chr1	221152	1.0	0.0	1.0
+chr1	221164	1.0	1.0	2.0
+chr1	221166	1.0	0.0	1.0
+chr1	221186	1.0	0.0	1.0
+chr1	221188	0.0	1.0	1.0
+chr1	221200	1.0	0.0	1.0
+chr1	221206	0.0	1.0	1.0
+chr1	221216	1.0	0.0	1.0
+chr1	221300	1.0	0.0	1.0
+chr1	221329	1.0	0.0	1.0
+chr1	221349	2.0	0.0	2.0
+chr1	221397	1.0	0.0	1.0
+chr1	221409	1.0	0.0	1.0
+chr1	221420	0.0	3.0	3.0
+chr1	221591	1.0	0.0	1.0
+chr1	221606	0.0	1.0	1.0
+chr1	221612	1.0	0.0	1.0
+chr1	221626	1.0	0.0	1.0
+chr1	221640	2.0	0.0	2.0
+chr1	221711	0.0	1.0	1.0
+chr1	221725	1.0	0.0	1.0
+chr1	221757	1.0	0.0	1.0
+chr1	221772	1.0	0.0	1.0
+chr1	221817	0.0	1.0	1.0
+chr1	221822	0.0	1.0	1.0
+chr1	221849	1.0	0.0	1.0
+chr1	221996	1.0	0.0	1.0
+chr1	222002	0.0	2.0	2.0
+chr1	222163	0.0	2.0	2.0
+chr1	222253	1.0	0.0	1.0
+chr1	222300	2.0	0.0	2.0
+chr1	222310	1.0	0.0	1.0
+chr1	222454	1.0	0.0	1.0
+chr1	222470	1.0	0.0	1.0
+chr1	222471	1.0	0.0	1.0
+chr1	222484	0.0	1.0	1.0
+chr1	222496	1.0	0.0	1.0
+chr1	222500	0.0	1.0	1.0
+chr1	222523	1.0	0.0	1.0
+chr1	222650	0.0	1.0	1.0
+chr1	222655	2.0	0.0	2.0
+chr1	222656	1.0	0.0	1.0
+chr1	222681	1.0	0.0	1.0
+chr1	222690	1.0	1.0	2.0
+chr1	222726	1.0	0.0	1.0
+chr1	222749	1.0	0.0	1.0
+chr1	222751	1.0	0.0	1.0
+chr1	222772	0.0	1.0	1.0
+chr1	222786	1.0	0.0	1.0
+chr1	222793	0.0	1.0	1.0
+chr1	222805	2.0	0.0	2.0
+chr1	222806	0.0	1.0	1.0
+chr1	222807	0.0	1.0	1.0
+chr1	222808	2.0	0.0	2.0
+chr1	222812	3.0	0.0	3.0
+chr1	222816	0.0	2.0	2.0
+chr1	222819	1.0	0.0	1.0
+chr1	222820	1.0	4.0	5.0
+chr1	222821	0.0	1.0	1.0
+chr1	222822	0.0	2.0	2.0
+chr1	222823	2.0	1.0	3.0
+chr1	222826	0.0	1.0	1.0
+chr1	222838	0.0	1.0	1.0
+chr1	222839	0.0	2.0	2.0
+chr1	222840	2.0	0.0	2.0
+chr1	222842	1.0	0.0	1.0
+chr1	222844	1.0	0.0	1.0
+chr1	222847	3.0	0.0	3.0
+chr1	222848	2.0	0.0	2.0
+chr1	222849	0.0	1.0	1.0
+chr1	222853	0.0	5.0	5.0
+chr1	222855	1.0	0.0	1.0
+chr1	222856	1.0	0.0	1.0
+chr1	222887	0.0	1.0	1.0
+chr1	222977	1.0	0.0	1.0
+chr1	223011	2.0	0.0	2.0
+chr1	223013	1.0	0.0	1.0
+chr1	223022	0.0	4.0	4.0
+chr1	223023	0.0	1.0	1.0
+chr1	223026	1.0	0.0	1.0
+chr1	223031	0.0	1.0	1.0
+chr1	223039	0.0	1.0	1.0
+chr1	223043	0.0	1.0	1.0
+chr1	223044	1.0	0.0	1.0
+chr1	223048	2.0	0.0	2.0
+chr1	223070	1.0	0.0	1.0
+chr1	223257	0.0	1.0	1.0
+chr1	223288	0.0	1.0	1.0
+chr1	223292	0.0	1.0	1.0
+chr1	223307	0.0	2.0	2.0
+chr1	223313	1.0	0.0	1.0
+chr1	223314	2.0	0.0	2.0
+chr1	223315	1.0	3.0	4.0
+chr1	223316	1.0	1.0	2.0
+chr1	223317	0.0	1.0	1.0
+chr1	223321	7.0	0.0	7.0
+chr1	223322	11.0	2.0	13.0
+chr1	223323	0.0	1.0	1.0
+chr1	223324	3.0	0.0	3.0
+chr1	223325	0.0	4.0	4.0
+chr1	223326	2.0	0.0	2.0
+chr1	223327	3.0	0.0	3.0
+chr1	223328	0.0	7.0	7.0
+chr1	223329	0.0	4.0	4.0
+chr1	223330	2.0	0.0	2.0
+chr1	223332	5.0	0.0	5.0
+chr1	223334	1.0	7.0	8.0
+chr1	223336	0.0	6.0	6.0
+chr1	223337	0.0	3.0	3.0
+chr1	223338	1.0	0.0	1.0
+chr1	223346	1.0	0.0	1.0
+chr1	223348	1.0	0.0	1.0
+chr1	223349	0.0	1.0	1.0
+chr1	223377	2.0	0.0	2.0
+chr1	223518	3.0	0.0	3.0
+chr1	223650	2.0	0.0	2.0
+chr1	223661	0.0	1.0	1.0
+chr1	223664	1.0	0.0	1.0
+chr1	223674	0.0	1.0	1.0
+chr1	223675	1.0	0.0	1.0
+chr1	223859	1.0	0.0	1.0
+chr1	223863	0.0	1.0	1.0
+chr1	223901	1.0	0.0	1.0
+chr1	223905	1.0	1.0	2.0
+chr1	223907	1.0	0.0	1.0
+chr1	223909	0.0	1.0	1.0
+chr1	223913	0.0	2.0	2.0
+chr1	223914	3.0	3.0	6.0
+chr1	223925	1.0	0.0	1.0
+chr1	223935	1.0	0.0	1.0
+chr1	223944	0.0	1.0	1.0
+chr1	224056	1.0	0.0	1.0
+chr1	224066	1.0	0.0	1.0
+chr1	224072	0.0	1.0	1.0
+chr1	224076	0.0	1.0	1.0
+chr1	224078	0.0	1.0	1.0
+chr1	224079	0.0	1.0	1.0
+chr1	224080	0.0	1.0	1.0
+chr1	224084	0.0	1.0	1.0
+chr1	224086	7.0	0.0	7.0
+chr1	224088	0.0	1.0	1.0
+chr1	224103	2.0	0.0	2.0
+chr1	224104	1.0	0.0	1.0
+chr1	224149	0.0	1.0	1.0
+chr1	224203	0.0	1.0	1.0
+chr1	224228	0.0	1.0	1.0
+chr1	224233	0.0	1.0	1.0
+chr1	224235	1.0	0.0	1.0
+chr1	224237	1.0	1.0	2.0
+chr1	224241	0.0	1.0	1.0
+chr1	224243	0.0	2.0	2.0
+chr1	224244	2.0	2.0	4.0
+chr1	224245	0.0	1.0	1.0
+chr1	224247	1.0	0.0	1.0
+chr1	224255	2.0	0.0	2.0
+chr1	224259	0.0	1.0	1.0
+chr1	224261	0.0	2.0	2.0
+chr1	224268	0.0	2.0	2.0
+chr1	224269	1.0	0.0	1.0
+chr1	224276	0.0	1.0	1.0
+chr1	224286	0.0	1.0	1.0
+chr1	224294	1.0	0.0	1.0
+chr1	224315	1.0	0.0	1.0
+chr1	224403	0.0	1.0	1.0
+chr1	224409	0.0	1.0	1.0
+chr1	224416	2.0	0.0	2.0
+chr1	224417	1.0	0.0	1.0
+chr1	224432	0.0	2.0	2.0
+chr1	224437	2.0	0.0	2.0
+chr1	224438	0.0	1.0	1.0
+chr1	224477	0.0	1.0	1.0
+chr1	224502	1.0	0.0	1.0
+chr1	224503	0.0	1.0	1.0
+chr1	224513	0.0	1.0	1.0
+chr1	224521	0.0	1.0	1.0
+chr1	224574	0.0	1.0	1.0
+chr1	224575	1.0	0.0	1.0
+chr1	224589	1.0	0.0	1.0
+chr1	224590	0.0	1.0	1.0
+chr1	224591	0.0	1.0	1.0
+chr1	224595	1.0	0.0	1.0
+chr1	224608	0.0	2.0	2.0
+chr1	224625	0.0	1.0	1.0
+chr1	224649	0.0	1.0	1.0
+chr1	224666	0.0	1.0	1.0
+chr1	224676	1.0	0.0	1.0
+chr1	224692	1.0	1.0	2.0
+chr1	224704	1.0	0.0	1.0
+chr1	224758	1.0	0.0	1.0
+chr1	224765	0.0	1.0	1.0
+chr1	224782	3.0	0.0	3.0
+chr1	224909	2.0	0.0	2.0
+chr1	224918	0.0	1.0	1.0
+chr1	224923	1.0	0.0	1.0
+chr1	224926	0.0	1.0	1.0
+chr1	224927	0.0	1.0	1.0
+chr1	224934	2.0	0.0	2.0
+chr1	224943	1.0	0.0	1.0
+chr1	224948	0.0	1.0	1.0
+chr1	224951	1.0	0.0	1.0
+chr1	224953	1.0	0.0	1.0
+chr1	225000	1.0	0.0	1.0
+chr1	225137	0.0	3.0	3.0
+chr1	225168	1.0	0.0	1.0
+chr1	225177	1.0	0.0	1.0
+chr1	225178	0.0	1.0	1.0
+chr1	225179	0.0	2.0	2.0
+chr1	225185	1.0	0.0	1.0
+chr1	225187	0.0	3.0	3.0
+chr1	225188	0.0	1.0	1.0
+chr1	225190	0.0	1.0	1.0
+chr1	225192	1.0	0.0	1.0
+chr1	225193	2.0	0.0	2.0
+chr1	225194	0.0	1.0	1.0
+chr1	225195	0.0	2.0	2.0
+chr1	225198	1.0	1.0	2.0
+chr1	225203	2.0	2.0	4.0
+chr1	225205	1.0	0.0	1.0
+chr1	225208	1.0	0.0	1.0
+chr1	225224	0.0	1.0	1.0
+chr1	225225	0.0	1.0	1.0
+chr1	225327	1.0	0.0	1.0
+chr1	225333	1.0	0.0	1.0
+chr1	225338	0.0	2.0	2.0
+chr1	225350	3.0	0.0	3.0
+chr1	225357	1.0	0.0	1.0
+chr1	225358	1.0	0.0	1.0
+chr1	225365	0.0	1.0	1.0
+chr1	225378	0.0	1.0	1.0
+chr1	225382	0.0	2.0	2.0
+chr1	225395	0.0	1.0	1.0
+chr1	225413	1.0	0.0	1.0
+chr1	225422	0.0	1.0	1.0
+chr1	225485	0.0	1.0	1.0
+chr1	225528	2.0	0.0	2.0
+chr1	225544	0.0	2.0	2.0
+chr1	225551	0.0	1.0	1.0
+chr1	225553	1.0	0.0	1.0
+chr1	225710	1.0	0.0	1.0
+chr1	225714	0.0	2.0	2.0
+chr1	225727	1.0	0.0	1.0
+chr1	225759	1.0	0.0	1.0
+chr1	225874	0.0	1.0	1.0
+chr1	225888	1.0	0.0	1.0
+chr1	225897	1.0	0.0	1.0
+chr1	226163	1.0	0.0	1.0
+chr1	226333	0.0	1.0	1.0
+chr1	226448	1.0	0.0	1.0
+chr1	226589	2.0	0.0	2.0
+chr1	226599	0.0	1.0	1.0
+chr1	226609	1.0	0.0	1.0
+chr1	226620	0.0	1.0	1.0
+chr1	226628	0.0	1.0	1.0
+chr1	226636	0.0	2.0	2.0
+chr1	226637	1.0	0.0	1.0
+chr1	226654	0.0	1.0	1.0
+chr1	226710	0.0	1.0	1.0
+chr1	226729	0.0	1.0	1.0
+chr1	226750	1.0	0.0	1.0
+chr1	226769	1.0	0.0	1.0
+chr1	226775	0.0	1.0	1.0
+chr1	226777	0.0	6.0	6.0
+chr1	226778	3.0	0.0	3.0
+chr1	226779	2.0	0.0	2.0
+chr1	226783	0.0	8.0	8.0
+chr1	226784	3.0	0.0	3.0
+chr1	226785	2.0	0.0	2.0
+chr1	226786	0.0	1.0	1.0
+chr1	226787	1.0	0.0	1.0
+chr1	226795	3.0	0.0	3.0
+chr1	226803	1.0	0.0	1.0
+chr1	226814	1.0	0.0	1.0
+chr1	226993	1.0	0.0	1.0
+chr1	227043	1.0	0.0	1.0
+chr1	227052	2.0	0.0	2.0
+chr1	227054	0.0	1.0	1.0
+chr1	227070	0.0	1.0	1.0
+chr1	227099	0.0	1.0	1.0
+chr1	227197	0.0	1.0	1.0
+chr1	227198	2.0	0.0	2.0
+chr1	227199	0.0	1.0	1.0
+chr1	227203	0.0	1.0	1.0
+chr1	227204	0.0	1.0	1.0
+chr1	227206	0.0	2.0	2.0
+chr1	227208	2.0	0.0	2.0
+chr1	227221	2.0	0.0	2.0
+chr1	227222	3.0	0.0	3.0
+chr1	227223	2.0	3.0	5.0
+chr1	227225	0.0	1.0	1.0
+chr1	227226	0.0	1.0	1.0
+chr1	227229	1.0	0.0	1.0
+chr1	227230	2.0	0.0	2.0
+chr1	227232	1.0	0.0	1.0
+chr1	227233	2.0	0.0	2.0
+chr1	227236	0.0	2.0	2.0
+chr1	227245	0.0	1.0	1.0
+chr1	227246	1.0	0.0	1.0
+chr1	227248	0.0	1.0	1.0
+chr1	227251	1.0	0.0	1.0
+chr1	227261	1.0	0.0	1.0
+chr1	227265	1.0	0.0	1.0
+chr1	227279	0.0	1.0	1.0
+chr1	227487	0.0	1.0	1.0
+chr1	227496	0.0	1.0	1.0
+chr1	227504	0.0	2.0	2.0
+chr1	227506	0.0	1.0	1.0
+chr1	227514	1.0	0.0	1.0
+chr1	227525	0.0	2.0	2.0
+chr1	227526	0.0	1.0	1.0
+chr1	227533	1.0	0.0	1.0
+chr1	227537	0.0	1.0	1.0
+chr1	227541	1.0	0.0	1.0
+chr1	227713	0.0	1.0	1.0
+chr1	227745	1.0	0.0	1.0
+chr1	227776	0.0	1.0	1.0
+chr1	227802	1.0	0.0	1.0
+chr1	227873	1.0	0.0	1.0
+chr1	228015	1.0	0.0	1.0
+chr1	228071	1.0	0.0	1.0
+chr1	228089	1.0	0.0	1.0
+chr1	228124	0.0	1.0	1.0
+chr1	228335	0.0	2.0	2.0
+chr1	228346	0.0	2.0	2.0
+chr1	228419	1.0	0.0	1.0
+chr1	228481	1.0	0.0	1.0
+chr1	228624	0.0	1.0	1.0
+chr1	228671	1.0	0.0	1.0
+chr1	228871	0.0	1.0	1.0
+chr1	228876	1.0	0.0	1.0
+chr1	228987	1.0	0.0	1.0
+chr1	228997	0.0	1.0	1.0
+chr1	229094	0.0	1.0	1.0
+chr1	229159	0.0	1.0	1.0
+chr1	229603	0.0	1.0	1.0
+chr1	229916	2.0	0.0	2.0
+chr2	79	0.0	1.0	1.0
+chr2	88	1.0	0.0	1.0
+chr2	144	1.0	0.0	1.0
+chr2	146	1.0	1.0	2.0
+chr2	168	0.0	1.0	1.0
+chr2	170	0.0	1.0	1.0
+chr2	176	2.0	2.0	4.0
+chr2	177	4.0	1.0	5.0
+chr2	182	1.0	0.0	1.0
+chr2	199	0.0	1.0	1.0
+chr2	200	5.0	0.0	5.0
+chr2	201	1.0	0.0	1.0
+chr2	204	4.0	0.0	4.0
+chr2	207	0.0	3.0	3.0
+chr2	211	0.0	1.0	1.0
+chr2	213	0.0	1.0	1.0
+chr2	215	2.0	0.0	2.0
+chr2	216	0.0	1.0	1.0
+chr2	219	0.0	1.0	1.0
+chr2	222	2.0	0.0	2.0
+chr2	230	0.0	1.0	1.0
+chr2	234	0.0	1.0	1.0
+chr2	236	0.0	7.0	7.0
+chr2	237	1.0	1.0	2.0
+chr2	240	0.0	4.0	4.0
+chr2	244	0.0	2.0	2.0
+chr2	247	3.0	0.0	3.0
+chr2	258	3.0	0.0	3.0
+chr2	264	0.0	2.0	2.0
+chr2	281	0.0	3.0	3.0
+chr2	308	1.0	0.0	1.0
+chr2	335	0.0	1.0	1.0
+chr2	339	1.0	0.0	1.0
+chr2	340	3.0	0.0	3.0
+chr2	355	1.0	0.0	1.0
+chr2	358	0.0	1.0	1.0
+chr2	364	0.0	1.0	1.0
+chr2	370	2.0	0.0	2.0
+chr2	373	1.0	0.0	1.0
+chr2	375	0.0	1.0	1.0
+chr2	382	0.0	1.0	1.0
+chr2	390	0.0	1.0	1.0
+chr2	391	0.0	1.0	1.0
+chr2	397	1.0	0.0	1.0
+chr2	398	1.0	0.0	1.0
+chr2	399	5.0	3.0	8.0
+chr2	402	6.0	0.0	6.0
+chr2	403	2.0	0.0	2.0
+chr2	404	3.0	0.0	3.0
+chr2	407	2.0	0.0	2.0
+chr2	409	0.0	4.0	4.0
+chr2	410	0.0	3.0	3.0
+chr2	411	1.0	0.0	1.0
+chr2	413	1.0	0.0	1.0
+chr2	414	0.0	2.0	2.0
+chr2	415	0.0	1.0	1.0
+chr2	416	0.0	2.0	2.0
+chr2	417	1.0	2.0	3.0
+chr2	419	1.0	0.0	1.0
+chr2	421	0.0	1.0	1.0
+chr2	424	1.0	1.0	2.0
+chr2	427	2.0	1.0	3.0
+chr2	428	5.0	0.0	5.0
+chr2	429	2.0	0.0	2.0
+chr2	430	3.0	0.0	3.0
+chr2	431	0.0	1.0	1.0
+chr2	432	0.0	2.0	2.0
+chr2	437	1.0	1.0	2.0
+chr2	438	1.0	0.0	1.0
+chr2	439	1.0	0.0	1.0
+chr2	440	1.0	0.0	1.0
+chr2	445	1.0	0.0	1.0
+chr2	448	0.0	1.0	1.0
+chr2	449	1.0	0.0	1.0
+chr2	456	0.0	3.0	3.0
+chr2	457	0.0	1.0	1.0
+chr2	458	0.0	1.0	1.0
+chr2	468	1.0	0.0	1.0
+chr2	469	0.0	1.0	1.0
+chr2	472	0.0	1.0	1.0
+chr2	479	0.0	1.0	1.0
+chr2	493	0.0	1.0	1.0
+chr2	506	2.0	0.0	2.0
+chr2	516	0.0	1.0	1.0
+chr2	517	0.0	1.0	1.0
+chr2	529	1.0	0.0	1.0
+chr2	535	0.0	1.0	1.0
+chr2	545	0.0	2.0	2.0
+chr2	546	0.0	2.0	2.0
+chr2	547	0.0	1.0	1.0
+chr2	548	1.0	0.0	1.0
+chr2	558	1.0	0.0	1.0
+chr2	564	2.0	0.0	2.0
+chr2	565	0.0	1.0	1.0
+chr2	567	1.0	0.0	1.0
+chr2	584	0.0	1.0	1.0
+chr2	587	1.0	0.0	1.0
+chr2	589	2.0	0.0	2.0
+chr2	592	2.0	0.0	2.0
+chr2	595	1.0	1.0	2.0
+chr2	600	0.0	1.0	1.0
+chr2	601	0.0	2.0	2.0
+chr2	602	0.0	2.0	2.0
+chr2	604	1.0	0.0	1.0
+chr2	610	1.0	0.0	1.0
+chr2	611	1.0	0.0	1.0
+chr2	613	0.0	1.0	1.0
+chr2	615	1.0	0.0	1.0
+chr2	621	0.0	1.0	1.0
+chr2	628	1.0	0.0	1.0
+chr2	630	1.0	0.0	1.0
+chr2	631	0.0	1.0	1.0
+chr2	640	0.0	1.0	1.0
+chr2	643	1.0	0.0	1.0
+chr2	648	0.0	1.0	1.0
+chr2	649	0.0	1.0	1.0
+chr2	659	1.0	0.0	1.0
+chr2	673	0.0	1.0	1.0
+chr2	683	1.0	0.0	1.0
+chr2	686	0.0	2.0	2.0
+chr2	687	1.0	0.0	1.0
+chr2	693	0.0	2.0	2.0
+chr2	696	1.0	0.0	1.0
+chr2	704	0.0	1.0	1.0
+chr2	716	0.0	1.0	1.0
+chr2	718	0.0	1.0	1.0
+chr2	727	0.0	1.0	1.0
+chr2	744	1.0	0.0	1.0
+chr2	748	1.0	0.0	1.0
+chr2	749	1.0	0.0	1.0
+chr2	754	0.0	2.0	2.0
+chr2	756	0.0	4.0	4.0
+chr2	760	0.0	1.0	1.0
+chr2	761	0.0	1.0	1.0
+chr2	765	0.0	1.0	1.0
+chr2	767	1.0	0.0	1.0
+chr2	779	0.0	1.0	1.0
+chr2	782	1.0	1.0	2.0
+chr2	803	2.0	0.0	2.0
+chr2	826	1.0	0.0	1.0
+chr2	842	2.0	0.0	2.0
+chr2	852	1.0	0.0	1.0
+chr2	856	0.0	1.0	1.0
+chr2	862	0.0	1.0	1.0
+chr2	863	0.0	1.0	1.0
+chr2	873	1.0	0.0	1.0
+chr2	879	0.0	1.0	1.0
+chr2	881	0.0	1.0	1.0
+chr2	909	0.0	1.0	1.0
+chr2	931	0.0	1.0	1.0
+chr2	939	1.0	0.0	1.0
+chr2	940	2.0	0.0	2.0
+chr2	941	0.0	1.0	1.0
+chr2	951	0.0	1.0	1.0
+chr2	953	0.0	1.0	1.0
+chr2	954	1.0	0.0	1.0
+chr2	956	0.0	2.0	2.0
+chr2	962	1.0	0.0	1.0
+chr2	982	0.0	1.0	1.0
+chr2	984	0.0	1.0	1.0
+chr2	1006	0.0	1.0	1.0
+chr2	1010	0.0	1.0	1.0
+chr2	1023	1.0	0.0	1.0
+chr2	1030	0.0	1.0	1.0
+chr2	1039	0.0	1.0	1.0
+chr2	1048	1.0	0.0	1.0
+chr2	1075	1.0	0.0	1.0
+chr2	1088	1.0	0.0	1.0
+chr2	1090	1.0	0.0	1.0
+chr2	1103	0.0	1.0	1.0
+chr2	1112	1.0	0.0	1.0
+chr2	1113	0.0	2.0	2.0
+chr2	1123	0.0	1.0	1.0
+chr2	1139	0.0	1.0	1.0
+chr2	1147	0.0	1.0	1.0
+chr2	1174	0.0	3.0	3.0
+chr2	1177	0.0	2.0	2.0
+chr2	1189	1.0	0.0	1.0
+chr2	1206	0.0	1.0	1.0
+chr2	1223	0.0	1.0	1.0
+chr2	1247	1.0	0.0	1.0
+chr2	1262	0.0	1.0	1.0
+chr2	1275	0.0	1.0	1.0
+chr2	1306	0.0	1.0	1.0
+chr2	1317	0.0	1.0	1.0
+chr2	1358	1.0	0.0	1.0
+chr2	1373	1.0	0.0	1.0
+chr2	1386	0.0	1.0	1.0
+chr2	1406	1.0	0.0	1.0
+chr2	1407	0.0	1.0	1.0
+chr2	1409	1.0	0.0	1.0
+chr2	1410	1.0	0.0	1.0
+chr2	1418	0.0	1.0	1.0
+chr2	1421	0.0	1.0	1.0
+chr2	1446	0.0	1.0	1.0
+chr2	1449	1.0	0.0	1.0
+chr2	1455	1.0	0.0	1.0
+chr2	1473	0.0	1.0	1.0
+chr2	1483	1.0	0.0	1.0
+chr2	1489	1.0	0.0	1.0
+chr2	1503	0.0	1.0	1.0
+chr2	1505	0.0	3.0	3.0
+chr2	1509	0.0	3.0	3.0
+chr2	1511	0.0	2.0	2.0
+chr2	1512	1.0	0.0	1.0
+chr2	1514	0.0	1.0	1.0
+chr2	1516	0.0	2.0	2.0
+chr2	1517	0.0	2.0	2.0
+chr2	1520	0.0	1.0	1.0
+chr2	1529	0.0	1.0	1.0
+chr2	1535	0.0	1.0	1.0
+chr2	1537	1.0	0.0	1.0
+chr2	1541	0.0	1.0	1.0
+chr2	1545	0.0	1.0	1.0
+chr2	1547	0.0	2.0	2.0
+chr2	1552	0.0	2.0	2.0
+chr2	1553	0.0	2.0	2.0
+chr2	1556	0.0	1.0	1.0
+chr2	1559	1.0	0.0	1.0
+chr2	1563	0.0	2.0	2.0
+chr2	1565	0.0	1.0	1.0
+chr2	1568	1.0	1.0	2.0
+chr2	1570	1.0	0.0	1.0
+chr2	1571	3.0	0.0	3.0
+chr2	1577	1.0	2.0	3.0
+chr2	1583	0.0	1.0	1.0
+chr2	1585	2.0	0.0	2.0
+chr2	1586	0.0	1.0	1.0
+chr2	1588	1.0	0.0	1.0
+chr2	1604	1.0	0.0	1.0
+chr2	1607	2.0	0.0	2.0
+chr2	1611	0.0	1.0	1.0
+chr2	1613	1.0	1.0	2.0
+chr2	1617	0.0	2.0	2.0
+chr2	1618	0.0	1.0	1.0
+chr2	1619	0.0	1.0	1.0
+chr2	1621	2.0	0.0	2.0
+chr2	1625	0.0	1.0	1.0
+chr2	1628	0.0	1.0	1.0
+chr2	1635	0.0	1.0	1.0
+chr2	1637	0.0	1.0	1.0
+chr2	1640	1.0	0.0	1.0
+chr2	1643	1.0	1.0	2.0
+chr2	1644	2.0	0.0	2.0
+chr2	1649	2.0	1.0	3.0
+chr2	1652	1.0	0.0	1.0
+chr2	1653	0.0	1.0	1.0
+chr2	1655	0.0	2.0	2.0
+chr2	1657	1.0	0.0	1.0
+chr2	1658	1.0	1.0	2.0
+chr2	1660	0.0	2.0	2.0
+chr2	1661	0.0	1.0	1.0
+chr2	1663	1.0	0.0	1.0
+chr2	1680	2.0	0.0	2.0
+chr2	1685	0.0	2.0	2.0
+chr2	1689	0.0	1.0	1.0
+chr2	1690	0.0	1.0	1.0
+chr2	1695	0.0	3.0	3.0
+chr2	1699	1.0	0.0	1.0
+chr2	1704	0.0	2.0	2.0
+chr2	1712	0.0	1.0	1.0
+chr2	1714	1.0	0.0	1.0
+chr2	1715	1.0	0.0	1.0
+chr2	1721	0.0	1.0	1.0
+chr2	1725	0.0	1.0	1.0
+chr2	1727	0.0	2.0	2.0
+chr2	1730	0.0	3.0	3.0
+chr2	1738	0.0	1.0	1.0
+chr2	1739	2.0	0.0	2.0
+chr2	1748	1.0	0.0	1.0
+chr2	1755	0.0	1.0	1.0
+chr2	1757	0.0	2.0	2.0
+chr2	1760	2.0	0.0	2.0
+chr2	1761	1.0	3.0	4.0
+chr2	1763	0.0	2.0	2.0
+chr2	1766	0.0	3.0	3.0
+chr2	1774	0.0	1.0	1.0
+chr2	1781	0.0	1.0	1.0
+chr2	1782	1.0	0.0	1.0
+chr2	1785	1.0	0.0	1.0
+chr2	1788	2.0	0.0	2.0
+chr2	1791	0.0	1.0	1.0
+chr2	1793	2.0	2.0	4.0
+chr2	1796	1.0	0.0	1.0
+chr2	1797	0.0	2.0	2.0
+chr2	1799	0.0	2.0	2.0
+chr2	1801	1.0	0.0	1.0
+chr2	1802	1.0	2.0	3.0
+chr2	1807	2.0	0.0	2.0
+chr2	1810	0.0	1.0	1.0
+chr2	1818	1.0	0.0	1.0
+chr2	1820	1.0	0.0	1.0
+chr2	1823	1.0	0.0	1.0
+chr2	1824	1.0	0.0	1.0
+chr2	1829	2.0	1.0	3.0
+chr2	1832	1.0	0.0	1.0
+chr2	1833	0.0	1.0	1.0
+chr2	1834	0.0	1.0	1.0
+chr2	1835	0.0	1.0	1.0
+chr2	1839	0.0	2.0	2.0
+chr2	1840	2.0	0.0	2.0
+chr2	1845	1.0	0.0	1.0
+chr2	1851	0.0	1.0	1.0
+chr2	1856	1.0	0.0	1.0
+chr2	1859	3.0	0.0	3.0
+chr2	1868	1.0	0.0	1.0
+chr2	1869	0.0	2.0	2.0
+chr2	1871	0.0	1.0	1.0
+chr2	1874	0.0	3.0	3.0
+chr2	1894	1.0	0.0	1.0
+chr2	1895	2.0	0.0	2.0
+chr2	1901	0.0	1.0	1.0
+chr2	1905	0.0	1.0	1.0
+chr2	1906	0.0	1.0	1.0
+chr2	1911	0.0	2.0	2.0
+chr2	1916	0.0	1.0	1.0
+chr2	1923	0.0	4.0	4.0
+chr2	1928	1.0	0.0	1.0
+chr2	1929	1.0	0.0	1.0
+chr2	1930	1.0	0.0	1.0
+chr2	1931	2.0	0.0	2.0
+chr2	1932	2.0	0.0	2.0
+chr2	1940	1.0	0.0	1.0
+chr2	1964	0.0	1.0	1.0
+chr2	1965	1.0	0.0	1.0
+chr2	1966	1.0	0.0	1.0
+chr2	1967	1.0	0.0	1.0
+chr2	1973	0.0	2.0	2.0
+chr2	1979	0.0	2.0	2.0
+chr2	1982	0.0	3.0	3.0
+chr2	2005	1.0	0.0	1.0
+chr2	2013	0.0	1.0	1.0
+chr2	2019	0.0	3.0	3.0
+chr2	2024	0.0	1.0	1.0
+chr2	2033	0.0	1.0	1.0
+chr2	2037	1.0	0.0	1.0
+chr2	2039	1.0	0.0	1.0
+chr2	2040	2.0	0.0	2.0
+chr2	2043	0.0	1.0	1.0
+chr2	2045	1.0	6.0	7.0
+chr2	2051	0.0	2.0	2.0
+chr2	2053	1.0	0.0	1.0
+chr2	2054	0.0	3.0	3.0
+chr2	2062	0.0	1.0	1.0
+chr2	2077	1.0	0.0	1.0
+chr2	2083	1.0	0.0	1.0
+chr2	2085	0.0	1.0	1.0
+chr2	2086	0.0	1.0	1.0
+chr2	2089	1.0	0.0	1.0
+chr2	2091	0.0	1.0	1.0
+chr2	2096	0.0	1.0	1.0
+chr2	2103	0.0	2.0	2.0
+chr2	2105	0.0	1.0	1.0
+chr2	2108	1.0	1.0	2.0
+chr2	2110	1.0	0.0	1.0
+chr2	2111	2.0	0.0	2.0
+chr2	2115	0.0	1.0	1.0
+chr2	2117	0.0	6.0	6.0
+chr2	2121	1.0	0.0	1.0
+chr2	2123	0.0	2.0	2.0
+chr2	2126	0.0	3.0	3.0
+chr2	2134	0.0	1.0	1.0
+chr2	2146	1.0	0.0	1.0
+chr2	2147	1.0	0.0	1.0
+chr2	2156	1.0	0.0	1.0
+chr2	2157	1.0	1.0	2.0
+chr2	2158	0.0	1.0	1.0
+chr2	2161	2.0	0.0	2.0
+chr2	2163	0.0	1.0	1.0
+chr2	2168	0.0	1.0	1.0
+chr2	2175	0.0	2.0	2.0
+chr2	2177	0.0	1.0	1.0
+chr2	2180	1.0	1.0	2.0
+chr2	2182	1.0	0.0	1.0
+chr2	2183	2.0	0.0	2.0
+chr2	2187	0.0	1.0	1.0
+chr2	2189	0.0	3.0	3.0
+chr2	2193	1.0	2.0	3.0
+chr2	2194	0.0	2.0	2.0
+chr2	2195	0.0	1.0	1.0
+chr2	2200	0.0	2.0	2.0
+chr2	2201	0.0	1.0	1.0
+chr2	2218	1.0	0.0	1.0
+chr2	2219	1.0	0.0	1.0
+chr2	2225	0.0	2.0	2.0
+chr2	2229	1.0	0.0	1.0
+chr2	2231	0.0	2.0	2.0
+chr2	2233	2.0	0.0	2.0
+chr2	2234	0.0	3.0	3.0
+chr2	2249	0.0	1.0	1.0
+chr2	2252	1.0	0.0	1.0
+chr2	2254	1.0	0.0	1.0
+chr2	2255	2.0	0.0	2.0
+chr2	2259	0.0	1.0	1.0
+chr2	2261	0.0	3.0	3.0
+chr2	2267	0.0	2.0	2.0
+chr2	2270	0.0	2.0	2.0
+chr2	2278	0.0	1.0	1.0
+chr2	2285	0.0	1.0	1.0
+chr2	2289	1.0	0.0	1.0
+chr2	2290	1.0	0.0	1.0
+chr2	2291	1.0	0.0	1.0
+chr2	2292	2.0	0.0	2.0
+chr2	2295	0.0	1.0	1.0
+chr2	2297	2.0	2.0	4.0
+chr2	2300	1.0	0.0	1.0
+chr2	2301	0.0	2.0	2.0
+chr2	2302	0.0	1.0	1.0
+chr2	2303	0.0	1.0	1.0
+chr2	2305	1.0	0.0	1.0
+chr2	2306	1.0	0.0	1.0
+chr2	2307	0.0	2.0	2.0
+chr2	2308	2.0	0.0	2.0
+chr2	2322	1.0	0.0	1.0
+chr2	2327	1.0	0.0	1.0
+chr2	2328	1.0	0.0	1.0
+chr2	2333	2.0	0.0	2.0
+chr2	2336	1.0	0.0	1.0
+chr2	2341	1.0	0.0	1.0
+chr2	2342	1.0	0.0	1.0
+chr2	2347	2.0	0.0	2.0
+chr2	2352	0.0	1.0	1.0
+chr2	2360	1.0	0.0	1.0
+chr2	2363	2.0	0.0	2.0
+chr2	2389	0.0	1.0	1.0
+chr2	2396	1.0	0.0	1.0
+chr2	2428	1.0	0.0	1.0
+chr2	2439	0.0	1.0	1.0
+chr2	2449	0.0	1.0	1.0
+chr2	2450	0.0	1.0	1.0
+chr2	2453	0.0	1.0	1.0
+chr2	2464	0.0	1.0	1.0
+chr2	2468	1.0	0.0	1.0
+chr2	2485	3.0	1.0	4.0
+chr2	2486	1.0	0.0	1.0
+chr2	2498	3.0	0.0	3.0
+chr2	2500	1.0	0.0	1.0
+chr2	2504	1.0	0.0	1.0
+chr2	2533	1.0	0.0	1.0
+chr2	2539	1.0	0.0	1.0
+chr2	2542	1.0	0.0	1.0
+chr2	2544	0.0	1.0	1.0
+chr2	2553	0.0	1.0	1.0
+chr2	2562	0.0	1.0	1.0
+chr2	2575	0.0	1.0	1.0
+chr2	2584	0.0	1.0	1.0
+chr2	2595	1.0	0.0	1.0
+chr2	2605	0.0	1.0	1.0
+chr2	2609	0.0	1.0	1.0
+chr2	2629	0.0	1.0	1.0
+chr2	2633	0.0	1.0	1.0
+chr2	2641	1.0	0.0	1.0
+chr2	2642	0.0	1.0	1.0
+chr2	2662	1.0	0.0	1.0
+chr2	2666	0.0	1.0	1.0
+chr2	2670	0.0	1.0	1.0
+chr2	2673	0.0	1.0	1.0
+chr2	2687	1.0	0.0	1.0
+chr2	2705	0.0	1.0	1.0
+chr2	2724	0.0	1.0	1.0
+chr2	2731	0.0	1.0	1.0
+chr2	2742	1.0	0.0	1.0
+chr2	2757	0.0	1.0	1.0
+chr2	2778	0.0	1.0	1.0
+chr2	2782	1.0	0.0	1.0
+chr2	2800	0.0	1.0	1.0
+chr2	2801	0.0	1.0	1.0
+chr2	2825	0.0	1.0	1.0
+chr2	2836	0.0	1.0	1.0
+chr2	2842	0.0	1.0	1.0
+chr2	2851	1.0	0.0	1.0
+chr2	2906	2.0	0.0	2.0
+chr2	2912	2.0	0.0	2.0
+chr2	2920	0.0	1.0	1.0
+chr2	2927	1.0	0.0	1.0
+chr2	2934	2.0	0.0	2.0
+chr2	2939	1.0	0.0	1.0
+chr2	2946	0.0	1.0	1.0
+chr2	2950	0.0	1.0	1.0
+chr2	2951	1.0	0.0	1.0
+chr2	2972	1.0	0.0	1.0
+chr2	2973	0.0	1.0	1.0
+chr2	2984	1.0	0.0	1.0
+chr2	2987	0.0	3.0	3.0
+chr2	2988	0.0	1.0	1.0
+chr2	2997	1.0	0.0	1.0
+chr2	3002	0.0	1.0	1.0
+chr2	3013	2.0	0.0	2.0
+chr2	3015	0.0	1.0	1.0
+chr2	3032	0.0	1.0	1.0
+chr2	3042	0.0	1.0	1.0
+chr2	3067	2.0	0.0	2.0
+chr2	3080	1.0	0.0	1.0
+chr2	3083	1.0	0.0	1.0
+chr2	3090	0.0	2.0	2.0
+chr2	3103	1.0	0.0	1.0
+chr2	3110	0.0	1.0	1.0
+chr2	3136	1.0	0.0	1.0
+chr2	3152	3.0	2.0	5.0
+chr2	3155	1.0	0.0	1.0
+chr2	3170	1.0	0.0	1.0
+chr2	3171	2.0	0.0	2.0
+chr2	3180	1.0	0.0	1.0
+chr2	3193	0.0	1.0	1.0
+chr2	3199	0.0	1.0	1.0
+chr2	3200	0.0	1.0	1.0
+chr2	3221	0.0	1.0	1.0
+chr2	3223	0.0	1.0	1.0
+chr2	3233	0.0	1.0	1.0
+chr2	3234	1.0	0.0	1.0
+chr2	3247	0.0	1.0	1.0
+chr2	3248	0.0	1.0	1.0
+chr2	3249	1.0	3.0	4.0
+chr2	3250	0.0	2.0	2.0
+chr2	3255	0.0	1.0	1.0
+chr2	3260	0.0	2.0	2.0
+chr2	3261	0.0	1.0	1.0
+chr2	3267	0.0	1.0	1.0
+chr2	3272	2.0	0.0	2.0
+chr2	3275	0.0	2.0	2.0
+chr2	3276	0.0	2.0	2.0
+chr2	3279	1.0	0.0	1.0
+chr2	3285	0.0	2.0	2.0
+chr2	3287	1.0	1.0	2.0
+chr2	3290	1.0	0.0	1.0
+chr2	3298	0.0	1.0	1.0
+chr2	3309	1.0	0.0	1.0
+chr2	3314	2.0	1.0	3.0
+chr2	3318	1.0	0.0	1.0
+chr2	3398	0.0	2.0	2.0
+chr2	3400	0.0	1.0	1.0
+chr2	3402	1.0	0.0	1.0
+chr2	3415	1.0	0.0	1.0
+chr2	3425	1.0	1.0	2.0
+chr2	3427	1.0	0.0	1.0
+chr2	3428	4.0	0.0	4.0
+chr2	3433	1.0	0.0	1.0
+chr2	3437	4.0	0.0	4.0
+chr2	3439	0.0	1.0	1.0
+chr2	3443	0.0	1.0	1.0
+chr2	3445	0.0	1.0	1.0
+chr2	3446	0.0	1.0	1.0
+chr2	3448	1.0	0.0	1.0
+chr2	3449	2.0	1.0	3.0
+chr2	3453	0.0	1.0	1.0
+chr2	3455	1.0	0.0	1.0
+chr2	3462	1.0	0.0	1.0
+chr2	3466	0.0	1.0	1.0
+chr2	3475	0.0	2.0	2.0
+chr2	3476	1.0	0.0	1.0
+chr2	3477	1.0	0.0	1.0
+chr2	3485	1.0	0.0	1.0
+chr2	3491	0.0	1.0	1.0
+chr2	3494	1.0	1.0	2.0
+chr2	3499	0.0	1.0	1.0
+chr2	3509	0.0	1.0	1.0
+chr2	3519	0.0	1.0	1.0
+chr2	3526	0.0	1.0	1.0
+chr2	3555	1.0	0.0	1.0
+chr2	3563	0.0	2.0	2.0
+chr2	3576	0.0	1.0	1.0
+chr2	3581	0.0	1.0	1.0
+chr2	3584	0.0	1.0	1.0
+chr2	3590	1.0	0.0	1.0
+chr2	3594	0.0	2.0	2.0
+chr2	3595	1.0	0.0	1.0
+chr2	3596	1.0	0.0	1.0
+chr2	3597	0.0	4.0	4.0
+chr2	3600	5.0	3.0	8.0
+chr2	3602	1.0	0.0	1.0
+chr2	3603	1.0	0.0	1.0
+chr2	3605	1.0	0.0	1.0
+chr2	3608	1.0	0.0	1.0
+chr2	3613	0.0	1.0	1.0
+chr2	3615	1.0	12.0	13.0
+chr2	3616	6.0	3.0	9.0
+chr2	3617	7.0	0.0	7.0
+chr2	3619	2.0	0.0	2.0
+chr2	3621	3.0	0.0	3.0
+chr2	3622	3.0	0.0	3.0
+chr2	3623	2.0	0.0	2.0
+chr2	3624	3.0	1.0	4.0
+chr2	3626	1.0	1.0	2.0
+chr2	3629	1.0	5.0	6.0
+chr2	3630	2.0	1.0	3.0
+chr2	3633	1.0	1.0	2.0
+chr2	3637	0.0	1.0	1.0
+chr2	3641	2.0	0.0	2.0
+chr2	3642	0.0	3.0	3.0
+chr2	3644	0.0	1.0	1.0
+chr2	3645	1.0	2.0	3.0
+chr2	3646	1.0	0.0	1.0
+chr2	3651	1.0	0.0	1.0
+chr2	3652	2.0	0.0	2.0
+chr2	3655	1.0	0.0	1.0
+chr2	3656	2.0	0.0	2.0
+chr2	3669	1.0	0.0	1.0
+chr2	3672	1.0	0.0	1.0
+chr2	3678	0.0	1.0	1.0
+chr2	3680	0.0	1.0	1.0
+chr2	3692	0.0	1.0	1.0
+chr2	3710	0.0	1.0	1.0
+chr2	3719	0.0	1.0	1.0
+chr2	3721	0.0	1.0	1.0
+chr2	3722	1.0	3.0	4.0
+chr2	3723	0.0	1.0	1.0
+chr2	3732	1.0	1.0	2.0
+chr2	3734	0.0	1.0	1.0
+chr2	3738	0.0	3.0	3.0
+chr2	3739	1.0	0.0	1.0
+chr2	3745	0.0	1.0	1.0
+chr2	3747	0.0	6.0	6.0
+chr2	3749	1.0	0.0	1.0
+chr2	3750	9.0	0.0	9.0
+chr2	3751	1.0	0.0	1.0
+chr2	3752	2.0	2.0	4.0
+chr2	3753	1.0	3.0	4.0
+chr2	3755	1.0	0.0	1.0
+chr2	3756	0.0	1.0	1.0
+chr2	3762	8.0	0.0	8.0
+chr2	3763	3.0	1.0	4.0
+chr2	3764	0.0	17.0	17.0
+chr2	3765	0.0	7.0	7.0
+chr2	3766	4.0	2.0	6.0
+chr2	3767	14.0	0.0	14.0
+chr2	3768	1.0	2.0	3.0
+chr2	3769	0.0	1.0	1.0
+chr2	3770	4.0	12.0	16.0
+chr2	3771	0.0	5.0	5.0
+chr2	3772	1.0	1.0	2.0
+chr2	3773	0.0	2.0	2.0
+chr2	3775	1.0	0.0	1.0
+chr2	3776	27.0	0.0	27.0
+chr2	3777	17.0	0.0	17.0
+chr2	3778	3.0	0.0	3.0
+chr2	3779	5.0	9.0	14.0
+chr2	3780	51.0	0.0	51.0
+chr2	3781	4.0	0.0	4.0
+chr2	3782	5.0	0.0	5.0
+chr2	3783	2.0	4.0	6.0
+chr2	3785	2.0	2.0	4.0
+chr2	3786	0.0	8.0	8.0
+chr2	3787	3.0	0.0	3.0
+chr2	3788	10.0	12.0	22.0
+chr2	3789	0.0	43.0	43.0
+chr2	3790	0.0	58.0	58.0
+chr2	3791	3.0	11.0	14.0
+chr2	3792	3.0	2.0	5.0
+chr2	3793	9.0	0.0	9.0
+chr2	3794	29.0	4.0	33.0
+chr2	3795	14.0	5.0	19.0
+chr2	3796	0.0	6.0	6.0
+chr2	3797	8.0	0.0	8.0
+chr2	3798	3.0	0.0	3.0
+chr2	3799	0.0	5.0	5.0
+chr2	3800	0.0	3.0	3.0
+chr2	3802	0.0	2.0	2.0
+chr2	3804	10.0	5.0	15.0
+chr2	3805	8.0	0.0	8.0
+chr2	3807	1.0	0.0	1.0
+chr2	3808	1.0	0.0	1.0
+chr2	3809	7.0	0.0	7.0
+chr2	3810	12.0	2.0	14.0
+chr2	3812	0.0	7.0	7.0
+chr2	3814	0.0	1.0	1.0
+chr2	3816	0.0	1.0	1.0
+chr2	3820	0.0	11.0	11.0
+chr2	3821	0.0	1.0	1.0
+chr2	3822	0.0	1.0	1.0
+chr2	3826	0.0	1.0	1.0
+chr2	3827	1.0	0.0	1.0
+chr2	3828	0.0	2.0	2.0
+chr2	3829	2.0	3.0	5.0
+chr2	3830	0.0	1.0	1.0
+chr2	3833	1.0	0.0	1.0
+chr2	3835	1.0	3.0	4.0
+chr2	3838	0.0	2.0	2.0
+chr2	3840	0.0	1.0	1.0
+chr2	3845	0.0	1.0	1.0
+chr2	3847	2.0	0.0	2.0
+chr2	3848	0.0	2.0	2.0
+chr2	3849	0.0	1.0	1.0
+chr2	3855	1.0	0.0	1.0
+chr2	3859	1.0	0.0	1.0
+chr2	3863	3.0	0.0	3.0
+chr2	3869	1.0	0.0	1.0
+chr2	3879	0.0	1.0	1.0
+chr2	3881	0.0	1.0	1.0
+chr2	3896	1.0	0.0	1.0
+chr2	3899	0.0	1.0	1.0
+chr2	3900	1.0	0.0	1.0
+chr2	3901	0.0	1.0	1.0
+chr2	3905	0.0	1.0	1.0
+chr2	3909	0.0	1.0	1.0
+chr2	3921	1.0	0.0	1.0
+chr2	3937	1.0	0.0	1.0
+chr2	3939	0.0	1.0	1.0
+chr2	3992	1.0	0.0	1.0
+chr2	3998	4.0	0.0	4.0
+chr2	4012	0.0	2.0	2.0
+chr2	4014	0.0	1.0	1.0
+chr2	4019	0.0	1.0	1.0
+chr2	4021	1.0	0.0	1.0
+chr2	4024	0.0	1.0	1.0
+chr2	4028	3.0	0.0	3.0
+chr2	4034	2.0	0.0	2.0
+chr2	4040	1.0	0.0	1.0
+chr2	4045	0.0	1.0	1.0
+chr2	4046	0.0	1.0	1.0
+chr2	4047	1.0	1.0	2.0
+chr2	4048	1.0	2.0	3.0
+chr2	4049	0.0	2.0	2.0
+chr2	4050	1.0	1.0	2.0
+chr2	4051	8.0	0.0	8.0
+chr2	4055	0.0	4.0	4.0
+chr2	4056	1.0	1.0	2.0
+chr2	4057	7.0	1.0	8.0
+chr2	4060	3.0	1.0	4.0
+chr2	4061	0.0	3.0	3.0
+chr2	4062	0.0	3.0	3.0
+chr2	4063	3.0	1.0	4.0
+chr2	4064	6.0	0.0	6.0
+chr2	4067	2.0	0.0	2.0
+chr2	4068	4.0	2.0	6.0
+chr2	4069	0.0	8.0	8.0
+chr2	4070	0.0	1.0	1.0
+chr2	4075	2.0	0.0	2.0
+chr2	4076	2.0	1.0	3.0
+chr2	4077	0.0	3.0	3.0
+chr2	4078	1.0	0.0	1.0
+chr2	4079	2.0	13.0	15.0
+chr2	4084	1.0	0.0	1.0
+chr2	4090	1.0	0.0	1.0
+chr2	4094	3.0	0.0	3.0
+chr2	4095	3.0	0.0	3.0
+chr2	4102	1.0	4.0	5.0
+chr2	4109	0.0	2.0	2.0
+chr2	4112	1.0	0.0	1.0
+chr2	4174	1.0	0.0	1.0
+chr2	4183	1.0	0.0	1.0
+chr2	4189	0.0	1.0	1.0
+chr2	4201	0.0	1.0	1.0
+chr2	4203	1.0	0.0	1.0
+chr2	4209	2.0	0.0	2.0
+chr2	4211	0.0	2.0	2.0
+chr2	4228	0.0	1.0	1.0
+chr2	4229	0.0	1.0	1.0
+chr2	4232	0.0	1.0	1.0
+chr2	4233	2.0	0.0	2.0
+chr2	4234	2.0	0.0	2.0
+chr2	4236	2.0	0.0	2.0
+chr2	4239	0.0	1.0	1.0
+chr2	4250	0.0	1.0	1.0
+chr2	4252	0.0	2.0	2.0
+chr2	4256	0.0	1.0	1.0
+chr2	4261	0.0	2.0	2.0
+chr2	4263	0.0	1.0	1.0
+chr2	4264	0.0	1.0	1.0
+chr2	4267	2.0	0.0	2.0
+chr2	4270	1.0	0.0	1.0
+chr2	4283	0.0	3.0	3.0
+chr2	4285	1.0	1.0	2.0
+chr2	4286	1.0	0.0	1.0
+chr2	4287	0.0	1.0	1.0
+chr2	4289	0.0	1.0	1.0
+chr2	4292	1.0	0.0	1.0
+chr2	4294	1.0	0.0	1.0
+chr2	4295	1.0	0.0	1.0
+chr2	4296	1.0	0.0	1.0
+chr2	4304	1.0	0.0	1.0
+chr2	4313	0.0	1.0	1.0
+chr2	4319	0.0	2.0	2.0
+chr2	4322	0.0	1.0	1.0
+chr2	4323	0.0	1.0	1.0
+chr2	4324	1.0	0.0	1.0
+chr2	4326	0.0	2.0	2.0
+chr2	4335	0.0	1.0	1.0
+chr2	4342	1.0	0.0	1.0
+chr2	4344	0.0	1.0	1.0
+chr2	4345	0.0	1.0	1.0
+chr2	4346	0.0	1.0	1.0
+chr2	4351	1.0	0.0	1.0
+chr2	4356	0.0	1.0	1.0
+chr2	4357	1.0	0.0	1.0
+chr2	4359	2.0	0.0	2.0
+chr2	4363	0.0	1.0	1.0
+chr2	4368	1.0	0.0	1.0
+chr2	4372	0.0	1.0	1.0
+chr2	4376	1.0	0.0	1.0
+chr2	4379	0.0	1.0	1.0
+chr2	4381	3.0	0.0	3.0
+chr2	4382	2.0	0.0	2.0
+chr2	4387	0.0	1.0	1.0
+chr2	4388	2.0	0.0	2.0
+chr2	4389	0.0	1.0	1.0
+chr2	4391	0.0	2.0	2.0
+chr2	4392	0.0	1.0	1.0
+chr2	4396	1.0	0.0	1.0
+chr2	4401	1.0	0.0	1.0
+chr2	4405	0.0	1.0	1.0
+chr2	4406	1.0	0.0	1.0
+chr2	4409	0.0	2.0	2.0
+chr2	4410	1.0	0.0	1.0
+chr2	4412	1.0	0.0	1.0
+chr2	4420	0.0	1.0	1.0
+chr2	4423	2.0	1.0	3.0
+chr2	4426	1.0	0.0	1.0
+chr2	4431	0.0	1.0	1.0
+chr2	4433	0.0	3.0	3.0
+chr2	4434	1.0	0.0	1.0
+chr2	4435	1.0	0.0	1.0
+chr2	4450	1.0	1.0	2.0
+chr2	4456	1.0	0.0	1.0
+chr2	4460	1.0	7.0	8.0
+chr2	4465	3.0	0.0	3.0
+chr2	4469	1.0	0.0	1.0
+chr2	4473	1.0	0.0	1.0
+chr2	4476	1.0	0.0	1.0
+chr2	4481	1.0	0.0	1.0
+chr2	4488	0.0	2.0	2.0
+chr2	4489	0.0	1.0	1.0
+chr2	4493	1.0	0.0	1.0
+chr2	4497	0.0	1.0	1.0
+chr2	4499	0.0	1.0	1.0
+chr2	4503	1.0	0.0	1.0
+chr2	4505	2.0	0.0	2.0
+chr2	4506	3.0	0.0	3.0
+chr2	4511	2.0	0.0	2.0
+chr2	4512	4.0	0.0	4.0
+chr2	4523	0.0	1.0	1.0
+chr2	4537	0.0	1.0	1.0
+chr2	4540	3.0	0.0	3.0
+chr2	4543	1.0	0.0	1.0
+chr2	4548	0.0	1.0	1.0
+chr2	4557	1.0	0.0	1.0
+chr2	4560	1.0	0.0	1.0
+chr2	4563	0.0	1.0	1.0
+chr2	4564	0.0	2.0	2.0
+chr2	4569	2.0	0.0	2.0
+chr2	4578	1.0	0.0	1.0
+chr2	4579	1.0	0.0	1.0
+chr2	4581	1.0	0.0	1.0
+chr2	4593	0.0	1.0	1.0
+chr2	4602	1.0	0.0	1.0
+chr2	4606	1.0	0.0	1.0
+chr2	4610	1.0	0.0	1.0
+chr2	4613	0.0	2.0	2.0
+chr2	4619	0.0	1.0	1.0
+chr2	4630	1.0	0.0	1.0
+chr2	4631	1.0	0.0	1.0
+chr2	4633	0.0	1.0	1.0
+chr2	4641	2.0	0.0	2.0
+chr2	4653	6.0	0.0	6.0
+chr2	4661	0.0	1.0	1.0
+chr2	4667	0.0	1.0	1.0
+chr2	4668	0.0	1.0	1.0
+chr2	4669	1.0	0.0	1.0
+chr2	4673	2.0	0.0	2.0
+chr2	4674	0.0	4.0	4.0
+chr2	4679	1.0	0.0	1.0
+chr2	4680	0.0	1.0	1.0
+chr2	4682	0.0	1.0	1.0
+chr2	4689	1.0	0.0	1.0
+chr2	4691	2.0	0.0	2.0
+chr2	4696	1.0	0.0	1.0
+chr2	4701	3.0	3.0	6.0
+chr2	4706	1.0	0.0	1.0
+chr2	4707	1.0	0.0	1.0
+chr2	4708	0.0	4.0	4.0
+chr2	4709	0.0	2.0	2.0
+chr2	4715	2.0	1.0	3.0
+chr2	4716	0.0	1.0	1.0
+chr2	4725	2.0	1.0	3.0
+chr2	4727	1.0	0.0	1.0
+chr2	4728	1.0	0.0	1.0
+chr2	4729	1.0	0.0	1.0
+chr2	4738	0.0	2.0	2.0
+chr2	4739	0.0	1.0	1.0
+chr2	4743	1.0	0.0	1.0
+chr2	4754	0.0	1.0	1.0
+chr2	4758	0.0	1.0	1.0
+chr2	4769	0.0	1.0	1.0
+chr2	4786	0.0	1.0	1.0
+chr2	4796	1.0	0.0	1.0
+chr2	4797	1.0	1.0	2.0
+chr2	4798	0.0	1.0	1.0
+chr2	4800	0.0	1.0	1.0
+chr2	4820	1.0	1.0	2.0
+chr2	4825	0.0	1.0	1.0
+chr2	4826	0.0	1.0	1.0
+chr2	4830	0.0	1.0	1.0
+chr2	4832	1.0	0.0	1.0
+chr2	4835	1.0	0.0	1.0
+chr2	4840	0.0	1.0	1.0
+chr2	4845	0.0	1.0	1.0
+chr2	4848	1.0	0.0	1.0
+chr2	4849	0.0	1.0	1.0
+chr2	4853	0.0	1.0	1.0
+chr2	4855	1.0	0.0	1.0
+chr2	4857	0.0	2.0	2.0
+chr2	4862	0.0	2.0	2.0
+chr2	4864	0.0	1.0	1.0
+chr2	4865	1.0	1.0	2.0
+chr2	4866	0.0	2.0	2.0
+chr2	4867	1.0	0.0	1.0
+chr2	4868	2.0	0.0	2.0
+chr2	4869	0.0	1.0	1.0
+chr2	4870	1.0	2.0	3.0
+chr2	4871	1.0	2.0	3.0
+chr2	4872	1.0	1.0	2.0
+chr2	4873	2.0	0.0	2.0
+chr2	4880	1.0	0.0	1.0
+chr2	4881	1.0	0.0	1.0
+chr2	4884	0.0	1.0	1.0
+chr2	4885	1.0	0.0	1.0
+chr2	4886	3.0	5.0	8.0
+chr2	4887	0.0	1.0	1.0
+chr2	4890	1.0	0.0	1.0
+chr2	4891	3.0	0.0	3.0
+chr2	4892	0.0	1.0	1.0
+chr2	4895	0.0	3.0	3.0
+chr2	4897	1.0	0.0	1.0
+chr2	4904	0.0	1.0	1.0
+chr2	4905	0.0	1.0	1.0
+chr2	4907	1.0	0.0	1.0
+chr2	4908	2.0	0.0	2.0
+chr2	4909	5.0	0.0	5.0
+chr2	4910	3.0	1.0	4.0
+chr2	4911	0.0	2.0	2.0
+chr2	4914	0.0	3.0	3.0
+chr2	4915	0.0	1.0	1.0
+chr2	4917	2.0	0.0	2.0
+chr2	4921	0.0	6.0	6.0
+chr2	4922	0.0	1.0	1.0
+chr2	4923	1.0	0.0	1.0
+chr2	4925	8.0	0.0	8.0
+chr2	4927	0.0	1.0	1.0
+chr2	4928	0.0	2.0	2.0
+chr2	4931	0.0	1.0	1.0
+chr2	4933	1.0	0.0	1.0
+chr2	4934	2.0	0.0	2.0
+chr2	4935	1.0	2.0	3.0
+chr2	4948	0.0	1.0	1.0
+chr2	4959	1.0	0.0	1.0
+chr2	4973	1.0	0.0	1.0
+chr2	4976	0.0	1.0	1.0
+chr2	4987	1.0	0.0	1.0
+chr2	5004	1.0	0.0	1.0
+chr2	5013	0.0	1.0	1.0
+chr2	5020	1.0	0.0	1.0
+chr2	5023	1.0	0.0	1.0
+chr2	5037	0.0	2.0	2.0
+chr2	5038	0.0	2.0	2.0
+chr2	5047	1.0	0.0	1.0
+chr2	5099	0.0	1.0	1.0
+chr2	5109	0.0	1.0	1.0
+chr2	5116	2.0	0.0	2.0
+chr2	5126	0.0	1.0	1.0
+chr2	5127	0.0	1.0	1.0
+chr2	5129	0.0	4.0	4.0
+chr2	5132	0.0	1.0	1.0
+chr2	5139	0.0	1.0	1.0
+chr2	5145	0.0	1.0	1.0
+chr2	5148	0.0	1.0	1.0
+chr2	5162	1.0	1.0	2.0
+chr2	5168	3.0	0.0	3.0
+chr2	5178	0.0	3.0	3.0
+chr2	5188	1.0	0.0	1.0
+chr2	5189	0.0	1.0	1.0
+chr2	5191	1.0	0.0	1.0
+chr2	5195	2.0	0.0	2.0
+chr2	5197	0.0	1.0	1.0
+chr2	5200	3.0	0.0	3.0
+chr2	5203	0.0	1.0	1.0
+chr2	5210	0.0	1.0	1.0
+chr2	5211	3.0	0.0	3.0
+chr2	5215	0.0	1.0	1.0
+chr2	5218	5.0	0.0	5.0
+chr2	5220	0.0	1.0	1.0
+chr2	5221	1.0	0.0	1.0
+chr2	5222	1.0	0.0	1.0
+chr2	5223	0.0	1.0	1.0
+chr2	5224	1.0	0.0	1.0
+chr2	5230	1.0	0.0	1.0
+chr2	5231	4.0	0.0	4.0
+chr2	5236	1.0	0.0	1.0
+chr2	5237	1.0	0.0	1.0
+chr2	5239	0.0	4.0	4.0
+chr2	5240	0.0	3.0	3.0
+chr2	5244	2.0	0.0	2.0
+chr2	5246	3.0	0.0	3.0
+chr2	5248	0.0	2.0	2.0
+chr2	5249	1.0	0.0	1.0
+chr2	5250	1.0	0.0	1.0
+chr2	5256	0.0	3.0	3.0
+chr2	5258	1.0	0.0	1.0
+chr2	5260	0.0	2.0	2.0
+chr2	5261	0.0	2.0	2.0
+chr2	5269	0.0	1.0	1.0
+chr2	5270	0.0	1.0	1.0
+chr2	5273	0.0	1.0	1.0
+chr2	5279	1.0	0.0	1.0
+chr2	5280	0.0	1.0	1.0
+chr2	5287	2.0	0.0	2.0
+chr2	5288	1.0	0.0	1.0
+chr2	5290	6.0	0.0	6.0
+chr2	5291	3.0	1.0	4.0
+chr2	5292	0.0	3.0	3.0
+chr2	5295	2.0	0.0	2.0
+chr2	5296	1.0	0.0	1.0
+chr2	5300	0.0	2.0	2.0
+chr2	5308	1.0	0.0	1.0
+chr2	5326	0.0	2.0	2.0
+chr2	5330	1.0	0.0	1.0
+chr2	5331	0.0	1.0	1.0
+chr2	5334	1.0	0.0	1.0
+chr2	5335	1.0	0.0	1.0
+chr2	5336	1.0	3.0	4.0
+chr2	5339	1.0	0.0	1.0
+chr2	5343	2.0	0.0	2.0
+chr2	5347	1.0	0.0	1.0
+chr2	5349	1.0	0.0	1.0
+chr2	5350	2.0	0.0	2.0
+chr2	5351	0.0	1.0	1.0
+chr2	5352	0.0	1.0	1.0
+chr2	5353	1.0	0.0	1.0
+chr2	5354	0.0	1.0	1.0
+chr2	5355	0.0	12.0	12.0
+chr2	5356	0.0	2.0	2.0
+chr2	5357	0.0	6.0	6.0
+chr2	5358	1.0	1.0	2.0
+chr2	5359	0.0	1.0	1.0
+chr2	5360	0.0	1.0	1.0
+chr2	5362	9.0	0.0	9.0
+chr2	5363	0.0	3.0	3.0
+chr2	5364	0.0	2.0	2.0
+chr2	5365	7.0	1.0	8.0
+chr2	5367	0.0	5.0	5.0
+chr2	5368	0.0	6.0	6.0
+chr2	5369	1.0	2.0	3.0
+chr2	5370	1.0	0.0	1.0
+chr2	5371	0.0	4.0	4.0
+chr2	5372	0.0	1.0	1.0
+chr2	5373	0.0	5.0	5.0
+chr2	5374	6.0	1.0	7.0
+chr2	5375	3.0	1.0	4.0
+chr2	5376	0.0	1.0	1.0
+chr2	5378	0.0	2.0	2.0
+chr2	5385	0.0	5.0	5.0
+chr2	5386	0.0	1.0	1.0
+chr2	5388	0.0	3.0	3.0
+chr2	5391	3.0	0.0	3.0
+chr2	5392	1.0	0.0	1.0
+chr2	5393	13.0	0.0	13.0
+chr2	5395	1.0	1.0	2.0
+chr2	5396	17.0	0.0	17.0
+chr2	5400	0.0	5.0	5.0
+chr2	5401	0.0	1.0	1.0
+chr2	5403	5.0	0.0	5.0
+chr2	5408	0.0	8.0	8.0
+chr2	5409	0.0	5.0	5.0
+chr2	5410	7.0	2.0	9.0
+chr2	5411	5.0	0.0	5.0
+chr2	5412	2.0	0.0	2.0
+chr2	5415	1.0	0.0	1.0
+chr2	5416	2.0	1.0	3.0
+chr2	5417	3.0	0.0	3.0
+chr2	5420	2.0	0.0	2.0
+chr2	5421	4.0	0.0	4.0
+chr2	5422	18.0	0.0	18.0
+chr2	5423	16.0	0.0	16.0
+chr2	5424	1.0	0.0	1.0
+chr2	5426	5.0	0.0	5.0
+chr2	5427	4.0	0.0	4.0
+chr2	5430	2.0	0.0	2.0
+chr2	5435	1.0	0.0	1.0
+chr2	5438	2.0	0.0	2.0
+chr2	5439	2.0	1.0	3.0
+chr2	5440	0.0	1.0	1.0
+chr2	5443	4.0	0.0	4.0
+chr2	5444	5.0	0.0	5.0
+chr2	5446	1.0	0.0	1.0
+chr2	5447	1.0	0.0	1.0
+chr2	5458	1.0	0.0	1.0
+chr2	5460	1.0	0.0	1.0
+chr2	5484	1.0	0.0	1.0
+chr2	5616	1.0	0.0	1.0
+chr2	5655	0.0	1.0	1.0
+chr2	5714	0.0	1.0	1.0
+chr2	5747	1.0	0.0	1.0
+chr2	5765	0.0	2.0	2.0
+chr2	5813	1.0	0.0	1.0
+chr2	5941	0.0	1.0	1.0
+chr2	5966	1.0	0.0	1.0
+chr2	6007	0.0	2.0	2.0
+chr2	6022	2.0	0.0	2.0
+chr2	6026	0.0	1.0	1.0
+chr2	6030	0.0	1.0	1.0
+chr2	6031	1.0	0.0	1.0
+chr2	6036	1.0	0.0	1.0
+chr2	6042	0.0	1.0	1.0
+chr2	6044	1.0	0.0	1.0
+chr2	6058	0.0	3.0	3.0
+chr2	6134	0.0	1.0	1.0
+chr2	6138	0.0	1.0	1.0
+chr2	6145	0.0	1.0	1.0
+chr2	6146	3.0	0.0	3.0
+chr2	6148	1.0	0.0	1.0
+chr2	6151	0.0	1.0	1.0
+chr2	6173	0.0	2.0	2.0
+chr2	6174	0.0	1.0	1.0
+chr2	6178	0.0	3.0	3.0
+chr2	6182	1.0	0.0	1.0
+chr2	6190	2.0	0.0	2.0
+chr2	6204	1.0	0.0	1.0
+chr2	6205	2.0	0.0	2.0
+chr2	6209	0.0	3.0	3.0
+chr2	6221	0.0	1.0	1.0
+chr2	6226	0.0	2.0	2.0
+chr2	6231	1.0	0.0	1.0
+chr2	6237	1.0	0.0	1.0
+chr2	6250	0.0	1.0	1.0
+chr2	6253	0.0	1.0	1.0
+chr2	6277	1.0	0.0	1.0
+chr2	6332	0.0	1.0	1.0
+chr2	6394	0.0	1.0	1.0
+chr2	6400	0.0	1.0	1.0
+chr2	6403	2.0	0.0	2.0
+chr2	6414	0.0	1.0	1.0
+chr2	6418	1.0	0.0	1.0
+chr2	6419	1.0	1.0	2.0
+chr2	6420	0.0	1.0	1.0
+chr2	6421	2.0	1.0	3.0
+chr2	6427	1.0	0.0	1.0
+chr2	6430	2.0	0.0	2.0
+chr2	6435	0.0	2.0	2.0
+chr2	6436	3.0	3.0	6.0
+chr2	6445	1.0	0.0	1.0
+chr2	6446	1.0	0.0	1.0
+chr2	6448	0.0	1.0	1.0
+chr2	6667	0.0	1.0	1.0
+chr2	6669	1.0	0.0	1.0
+chr2	6673	1.0	0.0	1.0
+chr2	6680	0.0	1.0	1.0
+chr2	6693	1.0	0.0	1.0
+chr2	6733	1.0	0.0	1.0
+chr2	6897	1.0	0.0	1.0
+chr2	7111	0.0	1.0	1.0
+chr2	7139	2.0	0.0	2.0
+chr2	7321	1.0	0.0	1.0
+chr2	7362	1.0	0.0	1.0
+chr2	7393	0.0	2.0	2.0
+chr2	7400	0.0	1.0	1.0
+chr2	7407	1.0	1.0	2.0
+chr2	7448	1.0	0.0	1.0
+chr2	7634	0.0	1.0	1.0
+chr2	7640	0.0	2.0	2.0
+chr2	7646	0.0	1.0	1.0
+chr2	7647	2.0	1.0	3.0
+chr2	7649	2.0	0.0	2.0
+chr2	7656	0.0	2.0	2.0
+chr2	7659	0.0	1.0	1.0
+chr2	7665	1.0	0.0	1.0
+chr2	7666	1.0	1.0	2.0
+chr2	7668	0.0	1.0	1.0
+chr2	7669	0.0	1.0	1.0
+chr2	7677	0.0	5.0	5.0
+chr2	7678	5.0	4.0	9.0
+chr2	7680	0.0	1.0	1.0
+chr2	7683	0.0	3.0	3.0
+chr2	7684	4.0	1.0	5.0
+chr2	7687	2.0	4.0	6.0
+chr2	7688	2.0	0.0	2.0
+chr2	7690	2.0	0.0	2.0
+chr2	7691	0.0	2.0	2.0
+chr2	7692	1.0	1.0	2.0
+chr2	7693	0.0	2.0	2.0
+chr2	7694	0.0	1.0	1.0
+chr2	7695	1.0	1.0	2.0
+chr2	7696	0.0	3.0	3.0
+chr2	7697	0.0	6.0	6.0
+chr2	7698	0.0	1.0	1.0
+chr2	7699	3.0	0.0	3.0
+chr2	7700	0.0	1.0	1.0
+chr2	7702	0.0	1.0	1.0
+chr2	7706	1.0	0.0	1.0
+chr2	7707	1.0	0.0	1.0
+chr2	7708	0.0	1.0	1.0
+chr2	7713	0.0	1.0	1.0
+chr2	7714	2.0	1.0	3.0
+chr2	7715	0.0	1.0	1.0
+chr2	7718	0.0	1.0	1.0
+chr2	7719	2.0	0.0	2.0
+chr2	7723	0.0	1.0	1.0
+chr2	7724	1.0	0.0	1.0
+chr2	7725	1.0	0.0	1.0
+chr2	7734	0.0	1.0	1.0
+chr2	7737	0.0	1.0	1.0
+chr2	7738	0.0	2.0	2.0
+chr2	7740	0.0	1.0	1.0
+chr2	7747	0.0	1.0	1.0
+chr2	7757	1.0	0.0	1.0
+chr2	7763	0.0	1.0	1.0
+chr2	7765	0.0	1.0	1.0
+chr2	7766	0.0	1.0	1.0
+chr2	7771	1.0	2.0	3.0
+chr2	7781	1.0	0.0	1.0
+chr2	7795	1.0	0.0	1.0
+chr2	7797	0.0	2.0	2.0
+chr2	7808	2.0	0.0	2.0
+chr2	7809	2.0	0.0	2.0
+chr2	7816	0.0	1.0	1.0
+chr2	7817	0.0	1.0	1.0
+chr2	7823	1.0	0.0	1.0
+chr2	7824	2.0	0.0	2.0
+chr2	7827	1.0	0.0	1.0
+chr2	7830	1.0	0.0	1.0
+chr2	7831	1.0	0.0	1.0
+chr2	7832	3.0	0.0	3.0
+chr2	7840	1.0	0.0	1.0
+chr2	7850	8.0	0.0	8.0
+chr2	7852	1.0	0.0	1.0
+chr2	7859	0.0	1.0	1.0
+chr2	7861	2.0	0.0	2.0
+chr2	7864	3.0	0.0	3.0
+chr2	7867	1.0	0.0	1.0
+chr2	7871	0.0	1.0	1.0
+chr2	7874	1.0	0.0	1.0
+chr2	7875	0.0	1.0	1.0
+chr2	7881	0.0	1.0	1.0
+chr2	7884	0.0	3.0	3.0
+chr2	7885	0.0	1.0	1.0
+chr2	7888	1.0	0.0	1.0
+chr2	7894	3.0	3.0	6.0
+chr2	7900	0.0	1.0	1.0
+chr2	7911	1.0	0.0	1.0
+chr2	7918	1.0	0.0	1.0
+chr2	7922	0.0	1.0	1.0
+chr2	7944	1.0	0.0	1.0
+chr2	7956	1.0	0.0	1.0
+chr2	7959	0.0	1.0	1.0
+chr2	7966	0.0	1.0	1.0
+chr2	7991	1.0	0.0	1.0
+chr2	8042	1.0	0.0	1.0
+chr2	8048	0.0	1.0	1.0
+chr2	8049	0.0	2.0	2.0
+chr2	8093	0.0	1.0	1.0
+chr2	8124	1.0	0.0	1.0
+chr2	8133	0.0	2.0	2.0
+chr2	8147	0.0	1.0	1.0
+chr2	8161	1.0	1.0	2.0
+chr2	8162	1.0	0.0	1.0
+chr2	8164	0.0	1.0	1.0
+chr2	8166	1.0	2.0	3.0
+chr2	8168	0.0	2.0	2.0
+chr2	8170	1.0	0.0	1.0
+chr2	8171	0.0	1.0	1.0
+chr2	8173	1.0	0.0	1.0
+chr2	8174	2.0	0.0	2.0
+chr2	8177	1.0	0.0	1.0
+chr2	8178	2.0	0.0	2.0
+chr2	8179	1.0	0.0	1.0
+chr2	8181	0.0	4.0	4.0
+chr2	8182	2.0	2.0	4.0
+chr2	8183	2.0	0.0	2.0
+chr2	8184	0.0	4.0	4.0
+chr2	8186	1.0	3.0	4.0
+chr2	8187	0.0	5.0	5.0
+chr2	8188	0.0	1.0	1.0
+chr2	8192	0.0	1.0	1.0
+chr2	8193	0.0	1.0	1.0
+chr2	8197	1.0	0.0	1.0
+chr2	8198	2.0	0.0	2.0
+chr2	8201	4.0	0.0	4.0
+chr2	8209	0.0	1.0	1.0
+chr2	8213	1.0	0.0	1.0
+chr2	8214	0.0	1.0	1.0
+chr2	8221	1.0	0.0	1.0
+chr2	8222	1.0	0.0	1.0
+chr2	8376	0.0	1.0	1.0
+chr2	8379	0.0	1.0	1.0
+chr2	8392	1.0	0.0	1.0
+chr2	8409	0.0	1.0	1.0
+chr2	8439	1.0	0.0	1.0
+chr2	8440	2.0	0.0	2.0
+chr2	8443	0.0	1.0	1.0
+chr2	8444	0.0	1.0	1.0
+chr2	8449	1.0	0.0	1.0
+chr2	8454	1.0	0.0	1.0
+chr2	8455	1.0	0.0	1.0
+chr2	8464	0.0	1.0	1.0
+chr2	8471	1.0	2.0	3.0
+chr2	8475	0.0	1.0	1.0
+chr2	8478	0.0	1.0	1.0
+chr2	8480	0.0	1.0	1.0
+chr2	8482	1.0	1.0	2.0
+chr2	8484	0.0	2.0	2.0
+chr2	8485	0.0	2.0	2.0
+chr2	8491	0.0	1.0	1.0
+chr2	8494	2.0	0.0	2.0
+chr2	8513	0.0	2.0	2.0
+chr2	8603	1.0	0.0	1.0
+chr2	8625	1.0	0.0	1.0
+chr2	8641	1.0	0.0	1.0
+chr2	8648	0.0	1.0	1.0
+chr2	8819	0.0	1.0	1.0
+chr2	9114	0.0	1.0	1.0
+chr2	9117	0.0	1.0	1.0
+chr2	9118	0.0	1.0	1.0
+chr2	9122	0.0	2.0	2.0
+chr2	9142	0.0	1.0	1.0
+chr2	9152	0.0	1.0	1.0
+chr2	9153	0.0	2.0	2.0
+chr2	9154	0.0	1.0	1.0
+chr2	9157	0.0	3.0	3.0
+chr2	9158	0.0	6.0	6.0
+chr2	9165	3.0	0.0	3.0
+chr2	9166	4.0	0.0	4.0
+chr2	9169	1.0	1.0	2.0
+chr2	9170	0.0	1.0	1.0
+chr2	9172	0.0	2.0	2.0
+chr2	9173	0.0	1.0	1.0
+chr2	9176	0.0	5.0	5.0
+chr2	9180	1.0	0.0	1.0
+chr2	9187	1.0	0.0	1.0
+chr2	9190	1.0	0.0	1.0
+chr2	9199	0.0	1.0	1.0
+chr2	9200	1.0	0.0	1.0
+chr2	9202	0.0	1.0	1.0
+chr2	9207	1.0	0.0	1.0
+chr2	9211	0.0	1.0	1.0
+chr2	9212	1.0	0.0	1.0
+chr2	9214	0.0	1.0	1.0
+chr2	9215	0.0	1.0	1.0
+chr2	9220	1.0	0.0	1.0
+chr2	9222	2.0	0.0	2.0
+chr2	9228	1.0	0.0	1.0
+chr2	9229	1.0	0.0	1.0
+chr2	9233	0.0	1.0	1.0
+chr2	9262	2.0	0.0	2.0
+chr2	9289	0.0	1.0	1.0
+chr2	9311	1.0	0.0	1.0
+chr2	9321	0.0	1.0	1.0
+chr2	9328	0.0	2.0	2.0
+chr2	9337	0.0	2.0	2.0
+chr2	9348	0.0	1.0	1.0
+chr2	9351	0.0	2.0	2.0
+chr2	9356	2.0	0.0	2.0
+chr2	9363	3.0	0.0	3.0
+chr2	9367	2.0	0.0	2.0
+chr2	9370	1.0	0.0	1.0
+chr2	9371	1.0	0.0	1.0
+chr2	9373	3.0	0.0	3.0
+chr2	9375	5.0	0.0	5.0
+chr2	9376	9.0	0.0	9.0
+chr2	9377	3.0	0.0	3.0
+chr2	9378	1.0	0.0	1.0
+chr2	9379	1.0	0.0	1.0
+chr2	9380	2.0	0.0	2.0
+chr2	9389	1.0	0.0	1.0
+chr2	9390	1.0	0.0	1.0
+chr2	9394	1.0	0.0	1.0
+chr2	9395	1.0	0.0	1.0
+chr2	9400	1.0	0.0	1.0
+chr2	9401	1.0	0.0	1.0
+chr2	9406	2.0	0.0	2.0
+chr2	9432	1.0	0.0	1.0
+chr2	9433	0.0	3.0	3.0
+chr2	9950	1.0	0.0	1.0
+chr2	9965	1.0	0.0	1.0
+chr2	9973	3.0	0.0	3.0
+chr2	9985	1.0	0.0	1.0
+chr2	9989	2.0	0.0	2.0
+chr2	9993	0.0	1.0	1.0
+chr2	10123	0.0	2.0	2.0
+chr2	10134	1.0	0.0	1.0
+chr2	10343	0.0	1.0	1.0
+chr2	10347	1.0	0.0	1.0
+chr2	10413	1.0	0.0	1.0
+chr2	10455	1.0	0.0	1.0
+chr2	10466	0.0	1.0	1.0
+chr2	10467	0.0	2.0	2.0
+chr2	10477	2.0	1.0	3.0
+chr2	10482	1.0	0.0	1.0
+chr2	10485	0.0	2.0	2.0
+chr2	10493	0.0	1.0	1.0
+chr2	10496	0.0	2.0	2.0
+chr2	10498	2.0	0.0	2.0
+chr2	10499	0.0	3.0	3.0
+chr2	10502	0.0	1.0	1.0
+chr2	10515	0.0	1.0	1.0
+chr2	10521	0.0	1.0	1.0
+chr2	10541	1.0	0.0	1.0
+chr2	10545	1.0	0.0	1.0
+chr2	10753	0.0	2.0	2.0
+chr2	10757	0.0	1.0	1.0
+chr2	10776	0.0	1.0	1.0
+chr2	10780	1.0	0.0	1.0
+chr2	10783	1.0	1.0	2.0
+chr2	10788	3.0	0.0	3.0
+chr2	10789	2.0	0.0	2.0
+chr2	10793	0.0	2.0	2.0
+chr2	10796	0.0	2.0	2.0
+chr2	10800	0.0	1.0	1.0
+chr2	10825	1.0	0.0	1.0
+chr2	10933	0.0	1.0	1.0
+chr2	10950	0.0	2.0	2.0
+chr2	11366	0.0	1.0	1.0
+chr2	11406	1.0	0.0	1.0
+chr2	11674	0.0	2.0	2.0
+chr2	11682	1.0	0.0	1.0
+chr2	11909	0.0	1.0	1.0
+chr2	12161	0.0	1.0	1.0
+chr2	12303	1.0	0.0	1.0
+chr2	12821	1.0	0.0	1.0
+chr2	12951	0.0	1.0	1.0
+chr2	12971	0.0	1.0	1.0
+chr2	13492	1.0	0.0	1.0
+chr2	13574	1.0	0.0	1.0
+chr2	13666	1.0	0.0	1.0
+chr2	13688	0.0	1.0	1.0
+chr2	13707	0.0	1.0	1.0
+chr2	13749	1.0	0.0	1.0
+chr2	13818	1.0	0.0	1.0
+chr2	13885	0.0	1.0	1.0
+chr2	14352	1.0	0.0	1.0
+chr2	14448	1.0	0.0	1.0
+chr2	14523	0.0	1.0	1.0
+chr2	15338	0.0	1.0	1.0
+chr2	15457	1.0	0.0	1.0
+chr2	15528	0.0	1.0	1.0
+chr2	15705	0.0	1.0	1.0
+chr2	15718	0.0	1.0	1.0
+chr2	15991	1.0	0.0	1.0
+chr2	16332	1.0	0.0	1.0
+chr2	16816	1.0	0.0	1.0
+chr2	17055	1.0	0.0	1.0
+chr2	17741	1.0	0.0	1.0
+chr2	17865	0.0	1.0	1.0
+chr2	17874	0.0	1.0	1.0
+chr2	17887	1.0	0.0	1.0
+chr2	17891	0.0	1.0	1.0
+chr2	17892	4.0	0.0	4.0
+chr2	17893	6.0	0.0	6.0
+chr2	17894	0.0	4.0	4.0
+chr2	17895	2.0	1.0	3.0
+chr2	17896	0.0	1.0	1.0
+chr2	17897	1.0	1.0	2.0
+chr2	17898	1.0	0.0	1.0
+chr2	17899	12.0	0.0	12.0
+chr2	17900	0.0	2.0	2.0
+chr2	17902	0.0	1.0	1.0
+chr2	17905	0.0	4.0	4.0
+chr2	17906	0.0	2.0	2.0
+chr2	17907	0.0	1.0	1.0
+chr2	17909	0.0	1.0	1.0
+chr2	17910	0.0	1.0	1.0
+chr2	17917	1.0	1.0	2.0
+chr2	17922	0.0	1.0	1.0
+chr2	17925	1.0	0.0	1.0
+chr2	17939	0.0	1.0	1.0
+chr2	18175	1.0	0.0	1.0
+chr2	18176	0.0	1.0	1.0
+chr2	18186	0.0	2.0	2.0
+chr2	18191	0.0	1.0	1.0
+chr2	18199	0.0	1.0	1.0
+chr2	18214	1.0	0.0	1.0
+chr2	18216	1.0	0.0	1.0
+chr2	18241	2.0	0.0	2.0
+chr2	18355	0.0	1.0	1.0
+chr2	18364	0.0	2.0	2.0
+chr2	18380	1.0	0.0	1.0
+chr2	18684	0.0	1.0	1.0
+chr2	18694	0.0	1.0	1.0
+chr2	18851	1.0	0.0	1.0
+chr2	18866	0.0	2.0	2.0
+chr2	18923	1.0	0.0	1.0
+chr2	19060	1.0	0.0	1.0
+chr2	20274	0.0	1.0	1.0
+chr2	20296	0.0	1.0	1.0
+chr2	20450	0.0	1.0	1.0
+chr2	20458	0.0	1.0	1.0
+chr2	21030	1.0	0.0	1.0
+chr2	21075	1.0	0.0	1.0
+chr2	21244	2.0	0.0	2.0
+chr2	21245	0.0	1.0	1.0
+chr2	21248	2.0	0.0	2.0
+chr2	21253	0.0	5.0	5.0
+chr2	21260	3.0	1.0	4.0
+chr2	21261	1.0	0.0	1.0
+chr2	21264	0.0	1.0	1.0
+chr2	21266	0.0	1.0	1.0
+chr2	21275	0.0	1.0	1.0
+chr2	21276	2.0	0.0	2.0
+chr2	21282	0.0	1.0	1.0
+chr2	21283	0.0	1.0	1.0
+chr2	21416	0.0	1.0	1.0
+chr2	21453	1.0	0.0	1.0
+chr2	21478	1.0	0.0	1.0
+chr2	21479	0.0	1.0	1.0
+chr2	21491	1.0	0.0	1.0
+chr2	21507	0.0	1.0	1.0
+chr2	21521	1.0	0.0	1.0
+chr2	21525	0.0	1.0	1.0
+chr2	21529	3.0	1.0	4.0
+chr2	22219	0.0	1.0	1.0
+chr2	23100	2.0	0.0	2.0
+chr2	23113	1.0	0.0	1.0
+chr2	23228	0.0	1.0	1.0
+chr2	23458	1.0	0.0	1.0
+chr2	23567	0.0	1.0	1.0
+chr2	23686	0.0	1.0	1.0
+chr2	23724	2.0	0.0	2.0
+chr2	23727	0.0	1.0	1.0
+chr2	23729	0.0	1.0	1.0
+chr2	23734	3.0	0.0	3.0
+chr2	23738	1.0	0.0	1.0
+chr2	23741	0.0	3.0	3.0
+chr2	23743	2.0	2.0	4.0
+chr2	23744	0.0	2.0	2.0
+chr2	23749	1.0	0.0	1.0
+chr2	23750	2.0	0.0	2.0
+chr2	23752	2.0	0.0	2.0
+chr2	23753	0.0	4.0	4.0
+chr2	23754	0.0	2.0	2.0
+chr2	23760	1.0	0.0	1.0
+chr2	23771	0.0	1.0	1.0
+chr2	24004	1.0	0.0	1.0
+chr2	24023	0.0	1.0	1.0
+chr2	24031	1.0	0.0	1.0
+chr2	24041	1.0	0.0	1.0
+chr2	24042	0.0	2.0	2.0
+chr2	24053	0.0	1.0	1.0
+chr2	24055	0.0	2.0	2.0
+chr2	24058	0.0	1.0	1.0
+chr2	24061	1.0	0.0	1.0
+chr2	24088	1.0	0.0	1.0
+chr2	24172	1.0	0.0	1.0
+chr2	24194	1.0	0.0	1.0
+chr2	24399	1.0	0.0	1.0
+chr2	24493	1.0	0.0	1.0
+chr2	24515	1.0	0.0	1.0
+chr2	24529	0.0	1.0	1.0
+chr2	24540	0.0	1.0	1.0
+chr2	24667	0.0	1.0	1.0
+chr2	24691	0.0	1.0	1.0
+chr2	24744	0.0	1.0	1.0
+chr2	25018	1.0	0.0	1.0
+chr2	25043	0.0	1.0	1.0
+chr2	25201	1.0	0.0	1.0
+chr2	25221	1.0	0.0	1.0
+chr2	25226	0.0	1.0	1.0
+chr2	25948	0.0	1.0	1.0
+chr2	25989	0.0	1.0	1.0
+chr2	26118	0.0	1.0	1.0
+chr2	26307	1.0	0.0	1.0
+chr2	26713	1.0	0.0	1.0
+chr2	26927	1.0	0.0	1.0
+chr2	27104	0.0	1.0	1.0
+chr2	27414	0.0	1.0	1.0
+chr2	27444	2.0	0.0	2.0
+chr2	27577	0.0	2.0	2.0
+chr2	27919	0.0	1.0	1.0
+chr2	27934	0.0	1.0	1.0
+chr2	27959	1.0	0.0	1.0
+chr2	27970	1.0	0.0	1.0
+chr2	27982	1.0	0.0	1.0
+chr2	27991	0.0	5.0	5.0
+chr2	28028	2.0	0.0	2.0
+chr2	28154	0.0	1.0	1.0
+chr2	28175	1.0	0.0	1.0
+chr2	28190	2.0	0.0	2.0
+chr2	28211	0.0	1.0	1.0
+chr2	28225	2.0	0.0	2.0
+chr2	28264	1.0	0.0	1.0
+chr2	28283	1.0	0.0	1.0
+chr2	28285	1.0	0.0	1.0
+chr2	28303	0.0	1.0	1.0
+chr2	28316	0.0	1.0	1.0
+chr2	28323	1.0	0.0	1.0
+chr2	28324	1.0	0.0	1.0
+chr2	28325	2.0	0.0	2.0
+chr2	28347	0.0	4.0	4.0
+chr2	28356	0.0	1.0	1.0
+chr2	28358	0.0	1.0	1.0
+chr2	28380	1.0	0.0	1.0
+chr2	28385	0.0	1.0	1.0
+chr2	28401	0.0	1.0	1.0
+chr2	28543	0.0	1.0	1.0
+chr2	28565	1.0	0.0	1.0
+chr2	28574	1.0	0.0	1.0
+chr2	28587	1.0	0.0	1.0
+chr2	28591	1.0	0.0	1.0
+chr2	28597	0.0	1.0	1.0
+chr2	28608	1.0	0.0	1.0
+chr2	28612	1.0	0.0	1.0
+chr2	28754	0.0	1.0	1.0
+chr2	28843	1.0	0.0	1.0
+chr2	28878	0.0	1.0	1.0
+chr2	28914	0.0	1.0	1.0
+chr2	29097	1.0	0.0	1.0
+chr2	29108	0.0	1.0	1.0
+chr2	29110	2.0	1.0	3.0
+chr2	29111	0.0	1.0	1.0
+chr2	29115	0.0	1.0	1.0
+chr2	29121	0.0	1.0	1.0
+chr2	29126	1.0	0.0	1.0
+chr2	29127	0.0	1.0	1.0
+chr2	29269	1.0	0.0	1.0
+chr2	29270	1.0	0.0	1.0
+chr2	29277	0.0	1.0	1.0
+chr2	29294	1.0	0.0	1.0
+chr2	29318	1.0	0.0	1.0
+chr2	29450	0.0	1.0	1.0
+chr2	29503	1.0	1.0	2.0
+chr2	29507	0.0	2.0	2.0
+chr2	29515	0.0	1.0	1.0
+chr2	29516	0.0	1.0	1.0
+chr2	29518	2.0	0.0	2.0
+chr2	29540	1.0	0.0	1.0
+chr2	29541	1.0	0.0	1.0
+chr2	29584	1.0	0.0	1.0
+chr2	29662	0.0	1.0	1.0
+chr2	29665	0.0	1.0	1.0
+chr2	29666	0.0	1.0	1.0
+chr2	29670	0.0	2.0	2.0
+chr2	29690	0.0	1.0	1.0
+chr2	29700	0.0	1.0	1.0
+chr2	29701	0.0	3.0	3.0
+chr2	29702	0.0	1.0	1.0
+chr2	29705	0.0	3.0	3.0
+chr2	29706	0.0	6.0	6.0
+chr2	29711	0.0	1.0	1.0
+chr2	29713	3.0	0.0	3.0
+chr2	29714	4.0	0.0	4.0
+chr2	29716	0.0	1.0	1.0
+chr2	29717	1.0	1.0	2.0
+chr2	29718	0.0	4.0	4.0
+chr2	29720	0.0	2.0	2.0
+chr2	29721	0.0	1.0	1.0
+chr2	29724	0.0	5.0	5.0
+chr2	29728	1.0	0.0	1.0
+chr2	29735	1.0	0.0	1.0
+chr2	29738	1.0	0.0	1.0
+chr2	29747	0.0	1.0	1.0
+chr2	29748	1.0	0.0	1.0
+chr2	29750	0.0	1.0	1.0
+chr2	29755	1.0	0.0	1.0
+chr2	29759	0.0	1.0	1.0
+chr2	29760	1.0	0.0	1.0
+chr2	29762	0.0	1.0	1.0
+chr2	29763	1.0	1.0	2.0
+chr2	29765	1.0	0.0	1.0
+chr2	29768	1.0	0.0	1.0
+chr2	29770	2.0	0.0	2.0
+chr2	29775	1.0	0.0	1.0
+chr2	29776	1.0	0.0	1.0
+chr2	29777	1.0	0.0	1.0
+chr2	29779	2.0	0.0	2.0
+chr2	29781	0.0	1.0	1.0
+chr2	29810	2.0	0.0	2.0
+chr2	29837	0.0	1.0	1.0
+chr2	29859	1.0	0.0	1.0
+chr2	29869	0.0	1.0	1.0
+chr2	29876	0.0	1.0	1.0
+chr2	29885	0.0	2.0	2.0
+chr2	29896	0.0	1.0	1.0
+chr2	29899	0.0	2.0	2.0
+chr2	29904	2.0	0.0	2.0
+chr2	29911	3.0	1.0	4.0
+chr2	29915	2.0	0.0	2.0
+chr2	29918	1.0	0.0	1.0
+chr2	29919	1.0	0.0	1.0
+chr2	29921	3.0	0.0	3.0
+chr2	29923	5.0	0.0	5.0
+chr2	29924	0.0	2.0	2.0
+chr2	29925	1.0	0.0	1.0
+chr2	29926	1.0	0.0	1.0
+chr2	29927	1.0	2.0	3.0
+chr2	29928	2.0	0.0	2.0
+chr2	29931	0.0	1.0	1.0
+chr2	29936	0.0	6.0	6.0
+chr2	29937	1.0	0.0	1.0
+chr2	29938	1.0	0.0	1.0
+chr2	29942	1.0	0.0	1.0
+chr2	29943	1.0	0.0	1.0
+chr2	29948	1.0	0.0	1.0
+chr2	29949	1.0	0.0	1.0
+chr2	29953	1.0	0.0	1.0
+chr2	29954	1.0	0.0	1.0
+chr2	29955	0.0	3.0	3.0
+chr2	29956	0.0	2.0	2.0
+chr2	29963	0.0	2.0	2.0
+chr2	29973	0.0	2.0	2.0
+chr2	29974	0.0	1.0	1.0
+chr2	29978	2.0	0.0	2.0
+chr2	29979	1.0	0.0	1.0
+chr2	29980	2.0	0.0	2.0
+chr2	29983	0.0	1.0	1.0
+chr2	29989	0.0	1.0	1.0
+chr2	30000	1.0	0.0	1.0
+chr2	30002	0.0	2.0	2.0
+chr2	30003	2.0	0.0	2.0
+chr2	30004	1.0	0.0	1.0
+chr2	30005	1.0	0.0	1.0
+chr2	30007	0.0	3.0	3.0
+chr2	30009	0.0	1.0	1.0
+chr2	30010	1.0	0.0	1.0
+chr2	30011	2.0	0.0	2.0
+chr2	30016	0.0	1.0	1.0
+chr2	30019	0.0	1.0	1.0
+chr2	30021	1.0	0.0	1.0
+chr2	30024	1.0	0.0	1.0
+chr2	30029	1.0	0.0	1.0
+chr2	30030	2.0	0.0	2.0
+chr2	30032	0.0	1.0	1.0
+chr2	30034	0.0	1.0	1.0
+chr2	30036	0.0	1.0	1.0
+chr2	30039	0.0	2.0	2.0
+chr2	30044	0.0	1.0	1.0
+chr2	30046	2.0	1.0	3.0
+chr2	30050	1.0	3.0	4.0
+chr2	30053	0.0	1.0	1.0
+chr2	30057	0.0	2.0	2.0
+chr2	30058	0.0	4.0	4.0
+chr2	30061	0.0	2.0	2.0
+chr2	30062	0.0	2.0	2.0
+chr2	30065	0.0	1.0	1.0
+chr2	30067	1.0	0.0	1.0
+chr2	30068	2.0	0.0	2.0
+chr2	30069	0.0	1.0	1.0
+chr2	30073	1.0	0.0	1.0
+chr2	30074	1.0	1.0	2.0
+chr2	30075	2.0	0.0	2.0
+chr2	30079	1.0	0.0	1.0
+chr2	30081	0.0	1.0	1.0
+chr2	30083	0.0	8.0	8.0
+chr2	30084	0.0	2.0	2.0
+chr2	30086	0.0	7.0	7.0
+chr2	30088	0.0	1.0	1.0
+chr2	30089	2.0	0.0	2.0
+chr2	30090	2.0	0.0	2.0
+chr2	30091	2.0	0.0	2.0
+chr2	30094	2.0	0.0	2.0
+chr2	30095	0.0	2.0	2.0
+chr2	30096	1.0	0.0	1.0
+chr2	30097	2.0	0.0	2.0
+chr2	30098	0.0	6.0	6.0
+chr2	30100	0.0	4.0	4.0
+chr2	30101	0.0	1.0	1.0
+chr2	30102	1.0	3.0	4.0
+chr2	30103	3.0	1.0	4.0
+chr2	30104	0.0	1.0	1.0
+chr2	30106	3.0	0.0	3.0
+chr2	30109	1.0	0.0	1.0
+chr2	30110	4.0	0.0	4.0
+chr2	30111	0.0	2.0	2.0
+chr2	30115	0.0	5.0	5.0
+chr2	30118	0.0	1.0	1.0
+chr2	30121	0.0	11.0	11.0
+chr2	30122	1.0	0.0	1.0
+chr2	30123	5.0	0.0	5.0
+chr2	30124	1.0	0.0	1.0
+chr2	30125	1.0	0.0	1.0
+chr2	30126	0.0	5.0	5.0
+chr2	30127	0.0	2.0	2.0
+chr2	30128	0.0	1.0	1.0
+chr2	30129	0.0	4.0	4.0
+chr2	30130	0.0	1.0	1.0
+chr2	30131	0.0	1.0	1.0
+chr2	30132	0.0	1.0	1.0
+chr2	30133	0.0	14.0	14.0
+chr2	30136	1.0	0.0	1.0
+chr2	30137	3.0	0.0	3.0
+chr2	30138	0.0	1.0	1.0
+chr2	30141	1.0	3.0	4.0
+chr2	30142	11.0	0.0	11.0
+chr2	30143	3.0	0.0	3.0
+chr2	30146	1.0	2.0	3.0
+chr2	30147	0.0	2.0	2.0
+chr2	30149	2.0	0.0	2.0
+chr2	30150	1.0	0.0	1.0
+chr2	30151	0.0	2.0	2.0
+chr2	30154	1.0	0.0	1.0
+chr2	30156	0.0	1.0	1.0
+chr2	30158	4.0	0.0	4.0
+chr2	30159	0.0	1.0	1.0
+chr2	30163	3.0	0.0	3.0
+chr2	30164	0.0	1.0	1.0
+chr2	30166	4.0	3.0	7.0
+chr2	30168	1.0	0.0	1.0
+chr2	30170	1.0	0.0	1.0
+chr2	30173	0.0	1.0	1.0
+chr2	30179	0.0	2.0	2.0
+chr2	30180	0.0	1.0	1.0
+chr2	30182	0.0	3.0	3.0
+chr2	30185	2.0	0.0	2.0
+chr2	30186	0.0	1.0	1.0
+chr2	30188	1.0	0.0	1.0
+chr2	30192	0.0	1.0	1.0
+chr2	30193	1.0	0.0	1.0
+chr2	30194	1.0	0.0	1.0
+chr2	30197	0.0	1.0	1.0
+chr2	30199	0.0	4.0	4.0
+chr2	30200	1.0	0.0	1.0
+chr2	30201	0.0	2.0	2.0
+chr2	30205	1.0	0.0	1.0
+chr2	30210	1.0	0.0	1.0
+chr2	30211	1.0	0.0	1.0
+chr2	30212	0.0	2.0	2.0
+chr2	30215	1.0	0.0	1.0
+chr2	30217	1.0	0.0	1.0
+chr2	30218	0.0	2.0	2.0
+chr2	30219	0.0	7.0	7.0
+chr2	30220	2.0	0.0	2.0
+chr2	30222	0.0	1.0	1.0
+chr2	30223	1.0	0.0	1.0
+chr2	30226	1.0	0.0	1.0
+chr2	30232	2.0	0.0	2.0
+chr2	30235	2.0	0.0	2.0
+chr2	30236	1.0	0.0	1.0
+chr2	30238	0.0	1.0	1.0
+chr2	30240	0.0	5.0	5.0
+chr2	30241	2.0	0.0	2.0
+chr2	30244	1.0	0.0	1.0
+chr2	30250	2.0	0.0	2.0
+chr2	30251	1.0	2.0	3.0
+chr2	30252	0.0	1.0	1.0
+chr2	30253	1.0	1.0	2.0
+chr2	30255	1.0	1.0	2.0
+chr2	30256	0.0	2.0	2.0
+chr2	30257	2.0	5.0	7.0
+chr2	30258	2.0	0.0	2.0
+chr2	30262	2.0	0.0	2.0
+chr2	30264	2.0	0.0	2.0
+chr2	30265	0.0	1.0	1.0
+chr2	30268	1.0	2.0	3.0
+chr2	30270	0.0	1.0	1.0
+chr2	30272	0.0	2.0	2.0
+chr2	30276	5.0	0.0	5.0
+chr2	30281	1.0	0.0	1.0
+chr2	30284	2.0	5.0	7.0
+chr2	30285	0.0	1.0	1.0
+chr2	30289	1.0	0.0	1.0
+chr2	30290	0.0	1.0	1.0
+chr2	30293	4.0	0.0	4.0
+chr2	30294	4.0	1.0	5.0
+chr2	30295	0.0	1.0	1.0
+chr2	30299	0.0	1.0	1.0
+chr2	30301	0.0	1.0	1.0
+chr2	30302	3.0	0.0	3.0
+chr2	30303	4.0	3.0	7.0
+chr2	30304	0.0	2.0	2.0
+chr2	30305	1.0	1.0	2.0
+chr2	30307	0.0	1.0	1.0
+chr2	30310	0.0	2.0	2.0
+chr2	30312	0.0	1.0	1.0
+chr2	30313	1.0	0.0	1.0
+chr2	30314	0.0	2.0	2.0
+chr2	30315	3.0	0.0	3.0
+chr2	30316	0.0	2.0	2.0
+chr2	30321	1.0	0.0	1.0
+chr2	30322	1.0	0.0	1.0
+chr2	30325	0.0	2.0	2.0
+chr2	30326	2.0	0.0	2.0
+chr2	30329	0.0	2.0	2.0
+chr2	30330	1.0	0.0	1.0
+chr2	30332	1.0	0.0	1.0
+chr2	30333	1.0	0.0	1.0
+chr2	30335	0.0	1.0	1.0
+chr2	30343	0.0	1.0	1.0
+chr2	30344	0.0	1.0	1.0
+chr2	30348	1.0	1.0	2.0
+chr2	30353	2.0	0.0	2.0
+chr2	30354	0.0	1.0	1.0
+chr2	30355	0.0	1.0	1.0
+chr2	30357	1.0	0.0	1.0
+chr2	30362	0.0	1.0	1.0
+chr2	30364	0.0	1.0	1.0
+chr2	30367	1.0	0.0	1.0
+chr2	30368	2.0	1.0	3.0
+chr2	30369	3.0	0.0	3.0
+chr2	30370	7.0	0.0	7.0
+chr2	30371	1.0	1.0	2.0
+chr2	30372	2.0	0.0	2.0
+chr2	30373	3.0	0.0	3.0
+chr2	30374	1.0	1.0	2.0
+chr2	30378	0.0	1.0	1.0
+chr2	30379	0.0	2.0	2.0
+chr2	30382	1.0	3.0	4.0
+chr2	30383	0.0	2.0	2.0
+chr2	30384	0.0	2.0	2.0
+chr2	30386	3.0	0.0	3.0
+chr2	30387	5.0	3.0	8.0
+chr2	30388	10.0	2.0	12.0
+chr2	30389	0.0	2.0	2.0
+chr2	30390	0.0	3.0	3.0
+chr2	30395	0.0	2.0	2.0
+chr2	30396	0.0	1.0	1.0
+chr2	30398	0.0	2.0	2.0
+chr2	30399	1.0	1.0	2.0
+chr2	30400	0.0	2.0	2.0
+chr2	30401	0.0	1.0	1.0
+chr2	30402	0.0	3.0	3.0
+chr2	30403	4.0	0.0	4.0
+chr2	30404	4.0	0.0	4.0
+chr2	30405	7.0	0.0	7.0
+chr2	30407	0.0	1.0	1.0
+chr2	30411	0.0	1.0	1.0
+chr2	30414	1.0	0.0	1.0
+chr2	30415	0.0	1.0	1.0
+chr2	30416	3.0	1.0	4.0
+chr2	30419	1.0	0.0	1.0
+chr2	30422	2.0	0.0	2.0
+chr2	30423	0.0	1.0	1.0
+chr2	30425	1.0	0.0	1.0
+chr2	30426	0.0	1.0	1.0
+chr2	30427	2.0	0.0	2.0
+chr2	30429	0.0	1.0	1.0
+chr2	30430	1.0	0.0	1.0
+chr2	30431	0.0	2.0	2.0
+chr2	30432	0.0	3.0	3.0
+chr2	30437	1.0	0.0	1.0
+chr2	30444	0.0	1.0	1.0
+chr2	30466	0.0	1.0	1.0
+chr2	30467	0.0	1.0	1.0
+chr2	30478	0.0	1.0	1.0
+chr2	30482	1.0	0.0	1.0
+chr2	30490	0.0	1.0	1.0
+chr2	30501	0.0	1.0	1.0
+chr2	30525	1.0	0.0	1.0
+chr2	30538	0.0	1.0	1.0
+chr2	30548	0.0	3.0	3.0
+chr2	30551	0.0	1.0	1.0
+chr2	30555	1.0	0.0	1.0
+chr2	30557	1.0	0.0	1.0
+chr2	30559	0.0	1.0	1.0
+chr2	30570	4.0	0.0	4.0
+chr2	30573	0.0	1.0	1.0
+chr2	30575	1.0	0.0	1.0
+chr2	30579	2.0	0.0	2.0
+chr2	30580	1.0	0.0	1.0
+chr2	30592	0.0	2.0	2.0
+chr2	30593	0.0	2.0	2.0
+chr2	30594	0.0	1.0	1.0
+chr2	30595	1.0	0.0	1.0
+chr2	30598	2.0	0.0	2.0
+chr2	30599	1.0	0.0	1.0
+chr2	30600	3.0	0.0	3.0
+chr2	30601	0.0	2.0	2.0
+chr2	30605	5.0	0.0	5.0
+chr2	30606	3.0	1.0	4.0
+chr2	30611	1.0	0.0	1.0
+chr2	30613	0.0	2.0	2.0
+chr2	30615	1.0	1.0	2.0
+chr2	30618	0.0	4.0	4.0
+chr2	30619	1.0	2.0	3.0
+chr2	30620	3.0	0.0	3.0
+chr2	30625	1.0	3.0	4.0
+chr2	30626	0.0	1.0	1.0
+chr2	30629	0.0	1.0	1.0
+chr2	30630	0.0	1.0	1.0
+chr2	30632	1.0	0.0	1.0
+chr2	30633	0.0	3.0	3.0
+chr2	30634	1.0	0.0	1.0
+chr2	30637	0.0	1.0	1.0
+chr2	30640	1.0	1.0	2.0
+chr2	30641	0.0	1.0	1.0
+chr2	30642	0.0	1.0	1.0
+chr2	30652	3.0	0.0	3.0
+chr2	30656	1.0	0.0	1.0
+chr2	30667	1.0	0.0	1.0
+chr2	30703	0.0	1.0	1.0
+chr2	30705	1.0	0.0	1.0
+chr2	30707	0.0	1.0	1.0
+chr2	30709	0.0	1.0	1.0
+chr2	30714	1.0	0.0	1.0
+chr2	30718	0.0	1.0	1.0
+chr2	30726	0.0	1.0	1.0
+chr2	30727	1.0	0.0	1.0
+chr2	30730	1.0	0.0	1.0
+chr2	30732	1.0	0.0	1.0
+chr2	30736	0.0	1.0	1.0
+chr2	30737	0.0	1.0	1.0
+chr2	30738	0.0	1.0	1.0
+chr2	30739	1.0	0.0	1.0
+chr2	30743	0.0	1.0	1.0
+chr2	30745	0.0	1.0	1.0
+chr2	30747	0.0	1.0	1.0
+chr2	30748	1.0	2.0	3.0
+chr2	30749	2.0	2.0	4.0
+chr2	30755	3.0	0.0	3.0
+chr2	30757	1.0	1.0	2.0
+chr2	30765	0.0	1.0	1.0
+chr2	30767	0.0	3.0	3.0
+chr2	30768	1.0	1.0	2.0
+chr2	30774	0.0	1.0	1.0
+chr2	30775	3.0	0.0	3.0
+chr2	30776	0.0	1.0	1.0
+chr2	30777	2.0	0.0	2.0
+chr2	30778	0.0	1.0	1.0
+chr2	30779	1.0	1.0	2.0
+chr2	30780	1.0	0.0	1.0
+chr2	30781	1.0	3.0	4.0
+chr2	30782	0.0	1.0	1.0
+chr2	30783	1.0	0.0	1.0
+chr2	30784	4.0	0.0	4.0
+chr2	30787	0.0	1.0	1.0
+chr2	30789	1.0	0.0	1.0
+chr2	30792	3.0	0.0	3.0
+chr2	30794	4.0	0.0	4.0
+chr2	30796	0.0	5.0	5.0
+chr2	30797	3.0	0.0	3.0
+chr2	30801	1.0	0.0	1.0
+chr2	30802	5.0	0.0	5.0
+chr2	30803	0.0	1.0	1.0
+chr2	30805	0.0	2.0	2.0
+chr2	30807	1.0	1.0	2.0
+chr2	30814	1.0	0.0	1.0
+chr2	30817	2.0	0.0	2.0
+chr2	30822	0.0	1.0	1.0
+chr2	30836	1.0	0.0	1.0
+chr2	30846	0.0	1.0	1.0
+chr2	30859	0.0	2.0	2.0
+chr2	30860	1.0	1.0	2.0
+chr2	30861	1.0	0.0	1.0
+chr2	30863	3.0	0.0	3.0
+chr2	30871	0.0	1.0	1.0
+chr2	30872	0.0	2.0	2.0
+chr2	30877	0.0	2.0	2.0
+chr2	30878	1.0	0.0	1.0
+chr2	30884	0.0	1.0	1.0
+chr2	30886	2.0	0.0	2.0
+chr2	30888	3.0	0.0	3.0
+chr2	30889	1.0	0.0	1.0
+chr2	30892	0.0	2.0	2.0
+chr2	30893	0.0	1.0	1.0
+chr2	30896	2.0	0.0	2.0
+chr2	30904	0.0	1.0	1.0
+chr2	30905	1.0	0.0	1.0
+chr2	30906	0.0	1.0	1.0
+chr2	30915	1.0	1.0	2.0
+chr2	30920	1.0	0.0	1.0
+chr2	30924	1.0	0.0	1.0
+chr2	30925	0.0	1.0	1.0
+chr2	30930	3.0	0.0	3.0
+chr2	30931	1.0	0.0	1.0
+chr2	30936	1.0	0.0	1.0
+chr2	30937	1.0	0.0	1.0
+chr2	30943	1.0	1.0	2.0
+chr2	30944	0.0	1.0	1.0
+chr2	30945	1.0	0.0	1.0
+chr2	30946	0.0	1.0	1.0
+chr2	30948	0.0	1.0	1.0
+chr2	30959	1.0	0.0	1.0
+chr2	30960	1.0	0.0	1.0
+chr2	30963	0.0	1.0	1.0
+chr2	30965	0.0	1.0	1.0
+chr2	30970	2.0	0.0	2.0
+chr2	30971	0.0	2.0	2.0
+chr2	30972	0.0	1.0	1.0
+chr2	30975	1.0	0.0	1.0
+chr2	30980	0.0	1.0	1.0
+chr2	30989	1.0	0.0	1.0
+chr2	30993	1.0	0.0	1.0
+chr2	31016	0.0	1.0	1.0
+chr2	31032	1.0	0.0	1.0
+chr2	31033	3.0	0.0	3.0
+chr2	31050	0.0	2.0	2.0
+chr2	31053	1.0	0.0	1.0
+chr2	31058	0.0	3.0	3.0
+chr2	31061	1.0	0.0	1.0
+chr2	31063	1.0	2.0	3.0
+chr2	31067	0.0	1.0	1.0
+chr2	31069	0.0	1.0	1.0
+chr2	31071	1.0	0.0	1.0
+chr2	31078	1.0	0.0	1.0
+chr2	31080	1.0	0.0	1.0
+chr2	31081	3.0	1.0	4.0
+chr2	31082	0.0	1.0	1.0
+chr2	31083	1.0	2.0	3.0
+chr2	31086	0.0	5.0	5.0
+chr2	31091	2.0	0.0	2.0
+chr2	31092	1.0	0.0	1.0
+chr2	31093	0.0	2.0	2.0
+chr2	31096	0.0	1.0	1.0
+chr2	31097	0.0	1.0	1.0
+chr2	31098	2.0	0.0	2.0
+chr2	31099	2.0	1.0	3.0
+chr2	31102	5.0	8.0	13.0
+chr2	31103	3.0	0.0	3.0
+chr2	31104	1.0	0.0	1.0
+chr2	31106	2.0	1.0	3.0
+chr2	31109	2.0	0.0	2.0
+chr2	31110	0.0	1.0	1.0
+chr2	31111	0.0	2.0	2.0
+chr2	31112	0.0	1.0	1.0
+chr2	31113	0.0	2.0	2.0
+chr2	31114	2.0	0.0	2.0
+chr2	31115	0.0	1.0	1.0
+chr2	31118	2.0	0.0	2.0
+chr2	31120	0.0	2.0	2.0
+chr2	31122	0.0	1.0	1.0
+chr2	31127	1.0	0.0	1.0
+chr2	31132	0.0	2.0	2.0
+chr2	31133	0.0	1.0	1.0
+chr2	31134	1.0	0.0	1.0
+chr2	31137	0.0	1.0	1.0
+chr2	31141	1.0	1.0	2.0
+chr2	31144	0.0	1.0	1.0
+chr2	31150	0.0	1.0	1.0
+chr2	31151	3.0	0.0	3.0
+chr2	31157	2.0	0.0	2.0
+chr2	31160	0.0	1.0	1.0
+chr2	31165	1.0	2.0	3.0
+chr2	31166	2.0	0.0	2.0
+chr2	31220	0.0	1.0	1.0
+chr2	31223	1.0	0.0	1.0
+chr2	31234	1.0	0.0	1.0
+chr2	31240	0.0	1.0	1.0
+chr2	31246	3.0	0.0	3.0
+chr2	31248	1.0	0.0	1.0
+chr2	31251	1.0	0.0	1.0
+chr2	31253	1.0	0.0	1.0
+chr2	31255	0.0	1.0	1.0
+chr2	31257	0.0	1.0	1.0
+chr2	31265	0.0	1.0	1.0
+chr2	31268	0.0	1.0	1.0
+chr2	31269	1.0	0.0	1.0
+chr2	31271	2.0	0.0	2.0
+chr2	31273	1.0	0.0	1.0
+chr2	31274	8.0	0.0	8.0
+chr2	31278	0.0	1.0	1.0
+chr2	31279	3.0	0.0	3.0
+chr2	31281	0.0	2.0	2.0
+chr2	31282	0.0	2.0	2.0
+chr2	31283	4.0	0.0	4.0
+chr2	31288	0.0	5.0	5.0
+chr2	31289	0.0	1.0	1.0
+chr2	31291	1.0	0.0	1.0
+chr2	31292	0.0	1.0	1.0
+chr2	31295	0.0	3.0	3.0
+chr2	31296	0.0	4.0	4.0
+chr2	31298	1.0	0.0	1.0
+chr2	31305	0.0	1.0	1.0
+chr2	31313	1.0	0.0	1.0
+chr2	31314	0.0	2.0	2.0
+chr2	31320	1.0	0.0	1.0
+chr2	31321	2.0	0.0	2.0
+chr2	31322	0.0	1.0	1.0
+chr2	31325	0.0	1.0	1.0
+chr2	31328	0.0	1.0	1.0
+chr2	31335	0.0	1.0	1.0
+chr2	31337	2.0	0.0	2.0
+chr2	31345	1.0	0.0	1.0
+chr2	31348	0.0	3.0	3.0
+chr2	31352	1.0	0.0	1.0
+chr2	31356	1.0	0.0	1.0
+chr2	31373	1.0	0.0	1.0
+chr2	31383	0.0	1.0	1.0
+chr2	31386	2.0	1.0	3.0
+chr2	31408	0.0	1.0	1.0
+chr2	31411	0.0	1.0	1.0
+chr2	31416	1.0	0.0	1.0
+chr2	31418	1.0	0.0	1.0
+chr2	31424	1.0	2.0	3.0
+chr2	31446	0.0	1.0	1.0
+chr2	31448	1.0	1.0	2.0
+chr2	31450	1.0	0.0	1.0
+chr2	31451	1.0	0.0	1.0
+chr2	31457	1.0	0.0	1.0
+chr2	31471	0.0	1.0	1.0
+chr2	31483	0.0	1.0	1.0
+chr2	31484	1.0	0.0	1.0
+chr2	31490	1.0	0.0	1.0
+chr2	31495	1.0	0.0	1.0
+chr2	31496	0.0	1.0	1.0
+chr2	31508	0.0	1.0	1.0
+chr2	31516	0.0	1.0	1.0
+chr2	31542	0.0	1.0	1.0
+chr2	31560	0.0	1.0	1.0
+chr2	31579	2.0	0.0	2.0
+chr2	31604	0.0	1.0	1.0
+chr2	31617	0.0	1.0	1.0
+chr2	31671	0.0	1.0	1.0
+chr2	31674	0.0	1.0	1.0
+chr2	31681	0.0	1.0	1.0
+chr2	31684	1.0	0.0	1.0
+chr2	31696	0.0	1.0	1.0
+chr2	31726	1.0	1.0	2.0
+chr2	31740	4.0	0.0	4.0
+chr2	31741	1.0	0.0	1.0
+chr2	31743	0.0	1.0	1.0
+chr2	31747	0.0	2.0	2.0
+chr2	31778	5.0	0.0	5.0
+chr2	31787	0.0	1.0	1.0
+chr2	31795	1.0	0.0	1.0
+chr2	31815	0.0	1.0	1.0
+chr2	31826	0.0	1.0	1.0
+chr2	31827	0.0	1.0	1.0
+chr2	31857	1.0	0.0	1.0
+chr2	31863	2.0	0.0	2.0
+chr2	31872	0.0	2.0	2.0
+chr2	31878	1.0	0.0	1.0
+chr2	31885	1.0	0.0	1.0
+chr2	31890	1.0	0.0	1.0
+chr2	31897	1.0	0.0	1.0
+chr2	31899	0.0	5.0	5.0
+chr2	31902	1.0	1.0	2.0
+chr2	31915	2.0	0.0	2.0
+chr2	31916	1.0	0.0	1.0
+chr2	31918	1.0	0.0	1.0
+chr2	31920	0.0	2.0	2.0
+chr2	31955	0.0	1.0	1.0
+chr2	31966	3.0	0.0	3.0
+chr2	31978	1.0	0.0	1.0
+chr2	31991	0.0	1.0	1.0
+chr2	32007	3.0	0.0	3.0
+chr2	32039	0.0	1.0	1.0
+chr2	32057	1.0	0.0	1.0
+chr2	32059	1.0	0.0	1.0
+chr2	32063	1.0	0.0	1.0
+chr2	32071	0.0	1.0	1.0
+chr2	32077	0.0	1.0	1.0
+chr2	32083	2.0	0.0	2.0
+chr2	32084	0.0	1.0	1.0
+chr2	32095	0.0	1.0	1.0
+chr2	32105	1.0	0.0	1.0
+chr2	32122	0.0	1.0	1.0
+chr2	32160	1.0	0.0	1.0
+chr2	32170	0.0	1.0	1.0
+chr2	32174	1.0	0.0	1.0
+chr2	32178	0.0	1.0	1.0
+chr2	32194	1.0	0.0	1.0
+chr2	32219	0.0	1.0	1.0
+chr2	32223	0.0	1.0	1.0
+chr2	32226	1.0	0.0	1.0
+chr2	32228	0.0	3.0	3.0
+chr2	32232	0.0	1.0	1.0
+chr2	32236	1.0	0.0	1.0
+chr2	32239	0.0	1.0	1.0
+chr2	32253	0.0	1.0	1.0
+chr2	32258	2.0	0.0	2.0
+chr2	32259	0.0	1.0	1.0
+chr2	32269	1.0	0.0	1.0
+chr2	32330	2.0	0.0	2.0
+chr2	32332	0.0	3.0	3.0
+chr2	32344	1.0	0.0	1.0
+chr2	32355	1.0	0.0	1.0
+chr2	32377	0.0	1.0	1.0
+chr2	32416	1.0	0.0	1.0
+chr2	32418	1.0	0.0	1.0
+chr2	32422	1.0	0.0	1.0
+chr2	32435	0.0	1.0	1.0
+chr2	32438	0.0	2.0	2.0
+chr2	32440	0.0	1.0	1.0
+chr2	32442	1.0	0.0	1.0
+chr2	32443	0.0	1.0	1.0
+chr2	32446	0.0	1.0	1.0
+chr2	32449	0.0	1.0	1.0
+chr2	32450	0.0	1.0	1.0
+chr2	32453	0.0	1.0	1.0
+chr2	32493	0.0	1.0	1.0
+chr2	32495	0.0	2.0	2.0
+chr2	32508	0.0	1.0	1.0
+chr2	32536	1.0	0.0	1.0
+chr2	32540	0.0	1.0	1.0
+chr2	32541	0.0	1.0	1.0
+chr2	32546	2.0	0.0	2.0
+chr2	32552	1.0	0.0	1.0
+chr2	32578	0.0	1.0	1.0
+chr2	32604	0.0	1.0	1.0
+chr2	32632	0.0	1.0	1.0
+chr2	32674	1.0	0.0	1.0
+chr2	32719	0.0	1.0	1.0
+chr2	32795	0.0	1.0	1.0
+chr2	32801	0.0	1.0	1.0
+chr2	32820	0.0	1.0	1.0
+chr2	32888	2.0	0.0	2.0
+chr2	32895	2.0	0.0	2.0
+chr2	32933	1.0	0.0	1.0
+chr2	32955	1.0	0.0	1.0
+chr2	32956	1.0	0.0	1.0
+chr2	33015	2.0	0.0	2.0
+chr2	33044	1.0	0.0	1.0
+chr2	33045	1.0	0.0	1.0
+chr2	33046	0.0	1.0	1.0
+chr2	33066	0.0	2.0	2.0
+chr2	33079	0.0	1.0	1.0
+chr2	33133	0.0	1.0	1.0
+chr2	33168	2.0	0.0	2.0
+chr2	33178	0.0	1.0	1.0
+chr2	33194	0.0	1.0	1.0
+chr2	33197	1.0	0.0	1.0
+chr2	33212	4.0	0.0	4.0
+chr2	33259	0.0	1.0	1.0
+chr2	33261	0.0	1.0	1.0
+chr2	33282	1.0	0.0	1.0
+chr2	33295	1.0	0.0	1.0
+chr2	33326	1.0	0.0	1.0
+chr2	33327	1.0	0.0	1.0
+chr2	33391	1.0	0.0	1.0
+chr2	33434	1.0	0.0	1.0
+chr2	33447	0.0	1.0	1.0
+chr2	33449	0.0	1.0	1.0
+chr2	33451	1.0	0.0	1.0
+chr2	33530	1.0	0.0	1.0
+chr2	33558	0.0	1.0	1.0
+chr2	33563	1.0	0.0	1.0
+chr2	33565	1.0	0.0	1.0
+chr2	33579	2.0	0.0	2.0
+chr2	33580	0.0	1.0	1.0
+chr2	33604	1.0	0.0	1.0
+chr2	33609	1.0	0.0	1.0
+chr2	33615	0.0	1.0	1.0
+chr2	33627	1.0	0.0	1.0
+chr2	33651	1.0	0.0	1.0
+chr2	33706	1.0	0.0	1.0
+chr2	33719	0.0	1.0	1.0
+chr2	33740	0.0	1.0	1.0
+chr2	33797	1.0	0.0	1.0
+chr2	33816	1.0	0.0	1.0
+chr2	33849	1.0	0.0	1.0
+chr2	33867	1.0	0.0	1.0
+chr2	33875	0.0	1.0	1.0
+chr2	33880	0.0	1.0	1.0
+chr2	33882	1.0	0.0	1.0
+chr2	33894	1.0	0.0	1.0
+chr2	33903	0.0	1.0	1.0
+chr2	33909	0.0	1.0	1.0
+chr2	33928	1.0	0.0	1.0
+chr2	33929	1.0	0.0	1.0
+chr2	33935	1.0	1.0	2.0
+chr2	33944	0.0	2.0	2.0
+chr2	33945	2.0	0.0	2.0
+chr2	33946	1.0	0.0	1.0
+chr2	33951	1.0	0.0	1.0
+chr2	33955	0.0	1.0	1.0
+chr2	33958	1.0	0.0	1.0
+chr2	33995	2.0	0.0	2.0
+chr2	34011	1.0	0.0	1.0
+chr2	34018	1.0	0.0	1.0
+chr2	34035	1.0	0.0	1.0
+chr2	34061	0.0	1.0	1.0
+chr2	34078	0.0	1.0	1.0
+chr2	34086	2.0	0.0	2.0
+chr2	34135	1.0	0.0	1.0
+chr2	34136	1.0	0.0	1.0
+chr2	34137	1.0	0.0	1.0
+chr2	34139	1.0	0.0	1.0
+chr2	34140	0.0	1.0	1.0
+chr2	34145	0.0	2.0	2.0
+chr2	34193	0.0	1.0	1.0
+chr2	34201	1.0	0.0	1.0
+chr2	34213	0.0	1.0	1.0
+chr2	34228	1.0	0.0	1.0
+chr2	34263	0.0	1.0	1.0
+chr2	34266	0.0	1.0	1.0
+chr2	34268	1.0	0.0	1.0
+chr2	34271	1.0	0.0	1.0
+chr2	34287	0.0	1.0	1.0
+chr2	34397	0.0	1.0	1.0
+chr2	34413	0.0	1.0	1.0
+chr2	34417	1.0	0.0	1.0
+chr2	34436	2.0	0.0	2.0
+chr2	34437	1.0	0.0	1.0
+chr2	34447	0.0	1.0	1.0
+chr2	34449	1.0	0.0	1.0
+chr2	34457	1.0	0.0	1.0
+chr2	34473	0.0	1.0	1.0
+chr2	34475	1.0	0.0	1.0
+chr2	34485	0.0	1.0	1.0
+chr2	34488	1.0	1.0	2.0
+chr2	34492	0.0	1.0	1.0
+chr2	34499	1.0	0.0	1.0
+chr2	34504	1.0	0.0	1.0
+chr2	34510	0.0	1.0	1.0
+chr2	34516	1.0	0.0	1.0
+chr2	34518	0.0	1.0	1.0
+chr2	34526	0.0	1.0	1.0
+chr2	34528	2.0	0.0	2.0
+chr2	34532	0.0	2.0	2.0
+chr2	34539	1.0	0.0	1.0
+chr2	34540	1.0	0.0	1.0
+chr2	34568	0.0	1.0	1.0
+chr2	34575	1.0	0.0	1.0
+chr2	34576	1.0	0.0	1.0
+chr2	34597	1.0	0.0	1.0
+chr2	34607	0.0	1.0	1.0
+chr2	34636	1.0	0.0	1.0
+chr2	34670	1.0	0.0	1.0
+chr2	34673	0.0	1.0	1.0
+chr2	34702	0.0	1.0	1.0
+chr2	34707	0.0	1.0	1.0
+chr2	34711	0.0	1.0	1.0
+chr2	34720	1.0	0.0	1.0
+chr2	34737	0.0	1.0	1.0
+chr2	34751	1.0	0.0	1.0
+chr2	34760	1.0	0.0	1.0
+chr2	34774	2.0	0.0	2.0
+chr2	34780	1.0	1.0	2.0
+chr2	34792	1.0	0.0	1.0
+chr2	34824	3.0	0.0	3.0
+chr2	34826	1.0	0.0	1.0
+chr2	34868	0.0	2.0	2.0
+chr2	34869	0.0	1.0	1.0
+chr2	34874	1.0	0.0	1.0
+chr2	34888	2.0	0.0	2.0
+chr2	34889	1.0	0.0	1.0
+chr2	34902	1.0	0.0	1.0
+chr2	34910	0.0	1.0	1.0
+chr2	34946	0.0	1.0	1.0
+chr2	34952	3.0	0.0	3.0
+chr2	34969	1.0	0.0	1.0
+chr2	34979	2.0	0.0	2.0
+chr2	34989	0.0	1.0	1.0
+chr2	34994	1.0	0.0	1.0
+chr2	35009	1.0	0.0	1.0
+chr2	35036	0.0	1.0	1.0
+chr2	35037	1.0	0.0	1.0
+chr2	35044	1.0	0.0	1.0
+chr2	35112	1.0	0.0	1.0
+chr2	35146	1.0	0.0	1.0
+chr2	35147	0.0	1.0	1.0
+chr2	35169	0.0	1.0	1.0
+chr2	35173	0.0	2.0	2.0
+chr2	35178	1.0	0.0	1.0
+chr2	35195	2.0	0.0	2.0
+chr2	35198	0.0	1.0	1.0
+chr2	35201	0.0	1.0	1.0
+chr2	35224	0.0	1.0	1.0
+chr2	35289	0.0	1.0	1.0
+chr2	35292	0.0	1.0	1.0
+chr2	35293	0.0	1.0	1.0
+chr2	35297	0.0	2.0	2.0
+chr2	35317	0.0	1.0	1.0
+chr2	35327	0.0	1.0	1.0
+chr2	35328	0.0	3.0	3.0
+chr2	35329	0.0	1.0	1.0
+chr2	35332	0.0	3.0	3.0
+chr2	35333	0.0	6.0	6.0
+chr2	35338	0.0	1.0	1.0
+chr2	35341	6.0	0.0	6.0
+chr2	35343	0.0	1.0	1.0
+chr2	35344	1.0	1.0	2.0
+chr2	35345	0.0	4.0	4.0
+chr2	35347	0.0	2.0	2.0
+chr2	35348	0.0	1.0	1.0
+chr2	35351	0.0	5.0	5.0
+chr2	35355	1.0	0.0	1.0
+chr2	35362	1.0	0.0	1.0
+chr2	35365	1.0	0.0	1.0
+chr2	35374	0.0	1.0	1.0
+chr2	35375	1.0	0.0	1.0
+chr2	35377	0.0	1.0	1.0
+chr2	35382	1.0	0.0	1.0
+chr2	35386	0.0	1.0	1.0
+chr2	35387	1.0	0.0	1.0
+chr2	35389	0.0	1.0	1.0
+chr2	35390	1.0	1.0	2.0
+chr2	35392	1.0	0.0	1.0
+chr2	35395	1.0	0.0	1.0
+chr2	35397	2.0	0.0	2.0
+chr2	35402	1.0	0.0	1.0
+chr2	35403	1.0	0.0	1.0
+chr2	35404	1.0	0.0	1.0
+chr2	35406	2.0	0.0	2.0
+chr2	35408	0.0	1.0	1.0
+chr2	35437	2.0	0.0	2.0
+chr2	35464	0.0	1.0	1.0
+chr2	35486	1.0	0.0	1.0
+chr2	35496	0.0	1.0	1.0
+chr2	35503	0.0	1.0	1.0
+chr2	35512	0.0	2.0	2.0
+chr2	35523	0.0	1.0	1.0
+chr2	35526	0.0	1.0	1.0
+chr2	35527	0.0	1.0	1.0
+chr2	35531	2.0	0.0	2.0
+chr2	35538	3.0	0.0	3.0
+chr2	35542	2.0	0.0	2.0
+chr2	35545	1.0	0.0	1.0
+chr2	35546	1.0	0.0	1.0
+chr2	35548	2.0	0.0	2.0
+chr2	35550	5.0	0.0	5.0
+chr2	35556	3.0	0.0	3.0
+chr2	35564	1.0	0.0	1.0
+chr2	35565	1.0	0.0	1.0
+chr2	35569	1.0	0.0	1.0
+chr2	35570	1.0	0.0	1.0
+chr2	35575	1.0	0.0	1.0
+chr2	35576	1.0	0.0	1.0
+chr2	35580	1.0	0.0	1.0
+chr2	35581	1.0	0.0	1.0
+chr2	35679	0.0	1.0	1.0
+chr2	35693	1.0	0.0	1.0
+chr2	35703	0.0	1.0	1.0
+chr2	35721	1.0	0.0	1.0
+chr2	35730	0.0	2.0	2.0
+chr2	35910	0.0	1.0	1.0
+chr2	35953	2.0	0.0	2.0
+chr2	35969	1.0	0.0	1.0
+chr2	35976	0.0	1.0	1.0
+chr2	35988	1.0	0.0	1.0
+chr2	35995	0.0	1.0	1.0
+chr2	36003	3.0	0.0	3.0
+chr2	36004	2.0	0.0	2.0
+chr2	36020	0.0	1.0	1.0
+chr2	36021	0.0	1.0	1.0
+chr2	36025	0.0	2.0	2.0
+chr2	36031	1.0	0.0	1.0
+chr2	36035	0.0	1.0	1.0
+chr2	36043	3.0	0.0	3.0
+chr2	36044	1.0	2.0	3.0
+chr2	36046	1.0	0.0	1.0
+chr2	36050	0.0	1.0	1.0
+chr2	36052	0.0	2.0	2.0
+chr2	36055	0.0	1.0	1.0
+chr2	36059	1.0	0.0	1.0
+chr2	36060	0.0	1.0	1.0
+chr2	36061	0.0	2.0	2.0
+chr2	36062	1.0	0.0	1.0
+chr2	36063	1.0	0.0	1.0
+chr2	36064	3.0	0.0	3.0
+chr2	36065	0.0	1.0	1.0
+chr2	36067	0.0	4.0	4.0
+chr2	36069	4.0	0.0	4.0
+chr2	36070	0.0	3.0	3.0
+chr2	36071	4.0	1.0	5.0
+chr2	36072	4.0	0.0	4.0
+chr2	36073	0.0	3.0	3.0
+chr2	36074	0.0	1.0	1.0
+chr2	36076	0.0	2.0	2.0
+chr2	36085	1.0	0.0	1.0
+chr2	36087	2.0	1.0	3.0
+chr2	36088	0.0	1.0	1.0
+chr2	36092	0.0	3.0	3.0
+chr2	36097	4.0	1.0	5.0
+chr2	36100	2.0	0.0	2.0
+chr2	36104	1.0	0.0	1.0
+chr2	36107	0.0	1.0	1.0
+chr2	36108	1.0	0.0	1.0
+chr2	36110	1.0	0.0	1.0
+chr2	36118	1.0	0.0	1.0
+chr2	36123	0.0	1.0	1.0
+chr2	36124	1.0	0.0	1.0
+chr2	36127	0.0	1.0	1.0
+chr2	36133	1.0	0.0	1.0
+chr2	36141	1.0	0.0	1.0
+chr2	36142	0.0	2.0	2.0
+chr2	36145	0.0	3.0	3.0
+chr2	36155	1.0	0.0	1.0
+chr2	36167	1.0	0.0	1.0
+chr2	36168	1.0	0.0	1.0
+chr2	36172	4.0	0.0	4.0
+chr2	36176	1.0	0.0	1.0
+chr2	36184	1.0	0.0	1.0
+chr2	36194	1.0	0.0	1.0
+chr2	36208	3.0	0.0	3.0
+chr2	36214	1.0	0.0	1.0
+chr2	36228	1.0	1.0	2.0
+chr2	36235	1.0	1.0	2.0
+chr2	36238	0.0	1.0	1.0
+chr2	36244	0.0	1.0	1.0
+chr2	36262	0.0	1.0	1.0
+chr2	36765	2.0	0.0	2.0
+chr2	36768	0.0	1.0	1.0
+chr2	36772	0.0	2.0	2.0
+chr2	36958	1.0	0.0	1.0
+chr2	37105	0.0	1.0	1.0
+chr2	37118	0.0	1.0	1.0
+chr2	37804	1.0	0.0	1.0
+chr2	37805	2.0	0.0	2.0
+chr2	37832	1.0	0.0	1.0
+chr2	38104	0.0	1.0	1.0
+chr2	39144	0.0	1.0	1.0
+chr2	39160	0.0	1.0	1.0
+chr2	39162	1.0	0.0	1.0
+chr2	39163	0.0	1.0	1.0
+chr2	39164	0.0	2.0	2.0
+chr2	39166	1.0	0.0	1.0
+chr2	39167	1.0	0.0	1.0
+chr2	39174	1.0	0.0	1.0
+chr2	39181	2.0	0.0	2.0
+chr2	39187	2.0	0.0	2.0
+chr2	39192	0.0	1.0	1.0
+chr2	39195	0.0	3.0	3.0
+chr2	39330	1.0	0.0	1.0
+chr2	39363	0.0	1.0	1.0
+chr2	39369	1.0	0.0	1.0
+chr2	39377	0.0	1.0	1.0
+chr2	39422	1.0	0.0	1.0
+chr2	39490	0.0	1.0	1.0
+chr2	39491	0.0	2.0	2.0
+chr2	39501	0.0	1.0	1.0
+chr2	39658	0.0	1.0	1.0
+chr2	39674	0.0	1.0	1.0
+chr2	39703	1.0	0.0	1.0
+chr2	39797	1.0	0.0	1.0
+chr2	39802	1.0	0.0	1.0
+chr2	39810	1.0	0.0	1.0
+chr2	39817	0.0	1.0	1.0
+chr2	39821	1.0	0.0	1.0
+chr2	39832	0.0	1.0	1.0
+chr2	39859	0.0	1.0	1.0
+chr2	39873	0.0	1.0	1.0
+chr2	39990	0.0	1.0	1.0
+chr2	40014	1.0	0.0	1.0
+chr2	40022	0.0	1.0	1.0
+chr2	40024	3.0	0.0	3.0
+chr2	40031	0.0	1.0	1.0
+chr2	40032	0.0	2.0	2.0
+chr2	40040	1.0	0.0	1.0
+chr2	40043	3.0	0.0	3.0
+chr2	40044	3.0	0.0	3.0
+chr2	40046	0.0	3.0	3.0
+chr2	40047	0.0	4.0	4.0
+chr2	40049	1.0	0.0	1.0
+chr2	40071	0.0	1.0	1.0
+chr2	40072	1.0	0.0	1.0
+chr2	40073	0.0	1.0	1.0
+chr2	40126	1.0	0.0	1.0
+chr2	40199	2.0	0.0	2.0
+chr2	40227	1.0	0.0	1.0
+chr2	40358	1.0	0.0	1.0
+chr2	40487	1.0	0.0	1.0
+chr2	40491	0.0	1.0	1.0
+chr2	40492	0.0	2.0	2.0
+chr2	40506	0.0	1.0	1.0
+chr2	40508	0.0	2.0	2.0
+chr2	40511	2.0	0.0	2.0
+chr2	40515	0.0	1.0	1.0
+chr2	40519	1.0	0.0	1.0
+chr2	40521	1.0	0.0	1.0
+chr2	40522	1.0	0.0	1.0
+chr2	40525	2.0	0.0	2.0
+chr2	40526	2.0	0.0	2.0
+chr2	40545	1.0	0.0	1.0
+chr2	40758	0.0	1.0	1.0
+chr2	40776	1.0	0.0	1.0
+chr2	40794	1.0	1.0	2.0
+chr2	40795	2.0	0.0	2.0
+chr2	40799	1.0	0.0	1.0
+chr2	40801	0.0	2.0	2.0
+chr2	40804	0.0	2.0	2.0
+chr2	40805	1.0	2.0	3.0
+chr2	40806	0.0	1.0	1.0
+chr2	40810	1.0	0.0	1.0
+chr2	40811	1.0	0.0	1.0
+chr2	40813	1.0	0.0	1.0
+chr2	40815	0.0	2.0	2.0
+chr2	40817	1.0	0.0	1.0
+chr2	40818	1.0	1.0	2.0
+chr2	40821	0.0	1.0	1.0
+chr2	40826	4.0	0.0	4.0
+chr2	40837	1.0	0.0	1.0
+chr2	40966	0.0	1.0	1.0
+chr2	40970	1.0	0.0	1.0
+chr2	40980	0.0	2.0	2.0
+chr2	40982	1.0	0.0	1.0
+chr2	40999	1.0	0.0	1.0
+chr2	41001	0.0	1.0	1.0
+chr2	41116	1.0	0.0	1.0
+chr2	41117	0.0	1.0	1.0
+chr2	41118	0.0	1.0	1.0
+chr2	41140	0.0	1.0	1.0
+chr2	41156	1.0	0.0	1.0
+chr2	41312	0.0	1.0	1.0
+chr2	41452	1.0	0.0	1.0
+chr2	41469	1.0	0.0	1.0
+chr2	41941	0.0	1.0	1.0
+chr2	42071	1.0	0.0	1.0
+chr2	42199	1.0	0.0	1.0
+chr2	42445	1.0	0.0	1.0
+chr2	42451	0.0	1.0	1.0
+chr2	42542	1.0	0.0	1.0
+chr2	42580	1.0	0.0	1.0
+chr2	42671	1.0	0.0	1.0
+chr2	42817	1.0	0.0	1.0
+chr2	42844	1.0	0.0	1.0
+chr2	42845	1.0	0.0	1.0
+chr2	42858	1.0	0.0	1.0
+chr2	42881	1.0	0.0	1.0
+chr2	42972	0.0	1.0	1.0
+chr2	42988	1.0	0.0	1.0
+chr2	42991	0.0	1.0	1.0
+chr2	43004	0.0	1.0	1.0
+chr2	43010	1.0	0.0	1.0
+chr2	43016	0.0	2.0	2.0
+chr2	43025	1.0	0.0	1.0
+chr2	43026	1.0	2.0	3.0
+chr2	43029	0.0	2.0	2.0
+chr2	43268	0.0	1.0	1.0
+chr2	43288	0.0	1.0	1.0
+chr2	43302	1.0	0.0	1.0
+chr2	43303	1.0	0.0	1.0
+chr2	43307	0.0	3.0	3.0
+chr2	43309	2.0	0.0	2.0
+chr2	43319	0.0	1.0	1.0
+chr2	43322	0.0	2.0	2.0
+chr2	43326	0.0	1.0	1.0
+chr2	43469	0.0	1.0	1.0
+chr2	43470	1.0	0.0	1.0
+chr2	43475	1.0	0.0	1.0
+chr2	43657	0.0	1.0	1.0
+chr2	43882	0.0	1.0	1.0
+chr2	44275	0.0	1.0	1.0
+chr2	44460	0.0	1.0	1.0
+chr2	44468	1.0	0.0	1.0
+chr2	44512	0.0	1.0	1.0
+chr2	44609	1.0	0.0	1.0
+chr2	44750	0.0	1.0	1.0
+chr2	44816	1.0	0.0	1.0
+chr2	44841	0.0	1.0	1.0
+chr2	44865	0.0	1.0	1.0
+chr2	44949	1.0	0.0	1.0
+chr2	44969	1.0	0.0	1.0
+chr2	44972	1.0	0.0	1.0
+chr2	44976	0.0	3.0	3.0
+chr2	44977	0.0	2.0	2.0
+chr2	44983	0.0	1.0	1.0
+chr2	44985	1.0	0.0	1.0
+chr2	44993	1.0	0.0	1.0
+chr2	44996	0.0	1.0	1.0
+chr2	45000	1.0	0.0	1.0
+chr2	45005	1.0	0.0	1.0
+chr2	45009	0.0	2.0	2.0
+chr2	45022	2.0	0.0	2.0
+chr2	45027	1.0	0.0	1.0
+chr2	45763	1.0	0.0	1.0
+chr2	45766	1.0	0.0	1.0
+chr2	45827	0.0	1.0	1.0
+chr2	46060	0.0	1.0	1.0
+chr2	46120	0.0	1.0	1.0
+chr2	46576	1.0	0.0	1.0
+chr2	46618	1.0	0.0	1.0
+chr2	46620	1.0	2.0	3.0
+chr2	46627	0.0	2.0	2.0
+chr2	46632	1.0	0.0	1.0
+chr2	46637	0.0	1.0	1.0
+chr2	46639	0.0	1.0	1.0
+chr2	46645	1.0	0.0	1.0
+chr2	46646	1.0	0.0	1.0
+chr2	46684	1.0	0.0	1.0
+chr2	46764	1.0	0.0	1.0
+chr2	46786	1.0	0.0	1.0
+chr2	46787	0.0	1.0	1.0
+chr2	46802	0.0	1.0	1.0
+chr2	46811	2.0	0.0	2.0
+chr2	46818	0.0	1.0	1.0
+chr2	46823	1.0	0.0	1.0
+chr2	46825	1.0	0.0	1.0
+chr2	46963	0.0	1.0	1.0
+chr2	46965	1.0	0.0	1.0
+chr2	46989	1.0	1.0	2.0
+chr2	47113	1.0	0.0	1.0
+chr2	47121	1.0	0.0	1.0
+chr2	47122	2.0	1.0	3.0
+chr2	47123	0.0	1.0	1.0
+chr2	47128	0.0	1.0	1.0
+chr2	47129	0.0	1.0	1.0
+chr2	47134	0.0	1.0	1.0
+chr2	47137	1.0	0.0	1.0
+chr2	47138	0.0	1.0	1.0
+chr2	47142	0.0	1.0	1.0
+chr2	47145	3.0	0.0	3.0
+chr2	47149	2.0	0.0	2.0
+chr2	47150	1.0	0.0	1.0
+chr2	47164	2.0	1.0	3.0
+chr2	47176	0.0	1.0	1.0
+chr2	47376	0.0	1.0	1.0
+chr2	47379	2.0	0.0	2.0
+chr2	47396	1.0	0.0	1.0
+chr2	47401	1.0	0.0	1.0
+chr2	47424	1.0	0.0	1.0
+chr2	47486	1.0	0.0	1.0
+chr2	47547	1.0	0.0	1.0
+chr2	47634	1.0	0.0	1.0
+chr2	48259	1.0	0.0	1.0
+chr2	48407	0.0	1.0	1.0
+chr2	48427	1.0	0.0	1.0
+chr2	48466	1.0	0.0	1.0
+chr2	48574	0.0	1.0	1.0
+chr2	48575	0.0	1.0	1.0
+chr2	48577	0.0	1.0	1.0
+chr2	48578	1.0	0.0	1.0
+chr2	48583	1.0	0.0	1.0
+chr2	48585	1.0	0.0	1.0
+chr2	48586	1.0	0.0	1.0
+chr2	48587	2.0	0.0	2.0
+chr2	48588	2.0	0.0	2.0
+chr2	48600	0.0	1.0	1.0
+chr2	48602	0.0	7.0	7.0
+chr2	48603	0.0	1.0	1.0
+chr2	48609	1.0	0.0	1.0
+chr2	48617	0.0	1.0	1.0
+chr2	48618	0.0	1.0	1.0
+chr2	48631	0.0	1.0	1.0
+chr2	48647	1.0	0.0	1.0
+chr2	48660	0.0	1.0	1.0
+chr2	48775	0.0	1.0	1.0
+chr2	48790	0.0	1.0	1.0
+chr2	48820	1.0	0.0	1.0
+chr2	48826	0.0	1.0	1.0
+chr2	48835	0.0	1.0	1.0
+chr2	48837	3.0	0.0	3.0
+chr2	48839	6.0	0.0	6.0
+chr2	48840	0.0	1.0	1.0
+chr2	48841	0.0	4.0	4.0
+chr2	48844	0.0	3.0	3.0
+chr2	48850	1.0	0.0	1.0
+chr2	48852	1.0	6.0	7.0
+chr2	48856	1.0	0.0	1.0
+chr2	48858	1.0	0.0	1.0
+chr2	48859	0.0	1.0	1.0
+chr2	48860	1.0	0.0	1.0
+chr2	48861	1.0	0.0	1.0
+chr2	48864	0.0	1.0	1.0
+chr2	48887	1.0	0.0	1.0
+chr2	48893	1.0	0.0	1.0
+chr2	48905	0.0	1.0	1.0
+chr2	48995	1.0	0.0	1.0
+chr2	49002	1.0	0.0	1.0
+chr2	49016	0.0	1.0	1.0
+chr2	49029	0.0	1.0	1.0
+chr2	49030	1.0	0.0	1.0
+chr2	49031	0.0	2.0	2.0
+chr2	49037	0.0	1.0	1.0
+chr2	49039	0.0	1.0	1.0
+chr2	49092	1.0	0.0	1.0
+chr2	49209	0.0	1.0	1.0
+chr2	49233	1.0	0.0	1.0
+chr2	49340	1.0	0.0	1.0
+chr2	49342	0.0	1.0	1.0
+chr2	49353	0.0	1.0	1.0
+chr2	49356	1.0	0.0	1.0
+chr2	49357	2.0	0.0	2.0
+chr2	49360	1.0	0.0	1.0
+chr2	49361	1.0	0.0	1.0
+chr2	49365	0.0	2.0	2.0
+chr2	49367	2.0	0.0	2.0
+chr2	49370	1.0	0.0	1.0
+chr2	49372	1.0	1.0	2.0
+chr2	49373	2.0	0.0	2.0
+chr2	49374	0.0	1.0	1.0
+chr2	49375	0.0	3.0	3.0
+chr2	49376	0.0	1.0	1.0
+chr2	49377	0.0	3.0	3.0
+chr2	49389	0.0	1.0	1.0
+chr2	49398	1.0	0.0	1.0
+chr2	49557	1.0	0.0	1.0
+chr2	49566	1.0	0.0	1.0
+chr2	49579	0.0	3.0	3.0
+chr2	49582	1.0	0.0	1.0
+chr2	49583	2.0	0.0	2.0
+chr2	49584	2.0	0.0	2.0
+chr2	49589	6.0	0.0	6.0
+chr2	49592	1.0	0.0	1.0
+chr2	49594	0.0	1.0	1.0
+chr2	49595	0.0	1.0	1.0
+chr2	49597	0.0	1.0	1.0
+chr2	49600	1.0	0.0	1.0
+chr2	49604	0.0	1.0	1.0
+chr2	49607	0.0	4.0	4.0
+chr2	49610	4.0	3.0	7.0
+chr2	49612	2.0	0.0	2.0
+chr2	49616	0.0	1.0	1.0
+chr2	49619	1.0	0.0	1.0
+chr2	49629	0.0	2.0	2.0
+chr2	49632	0.0	1.0	1.0
+chr2	49686	1.0	0.0	1.0
+chr2	49757	1.0	0.0	1.0
+chr2	49764	0.0	1.0	1.0
+chr2	49767	0.0	2.0	2.0
+chr2	49778	1.0	0.0	1.0
+chr2	49787	1.0	1.0	2.0
+chr2	49922	1.0	0.0	1.0
+chr2	49928	0.0	1.0	1.0
+chr2	49956	0.0	1.0	1.0
+chr2	49997	0.0	1.0	1.0
+chr2	50010	1.0	0.0	1.0
+chr2	50172	0.0	2.0	2.0
+chr2	50201	1.0	0.0	1.0
+chr2	50253	1.0	0.0	1.0
+chr2	50284	0.0	1.0	1.0
+chr2	50353	1.0	0.0	1.0
+chr2	50380	1.0	0.0	1.0
+chr2	50425	1.0	0.0	1.0
+chr2	50641	1.0	0.0	1.0
+chr2	50648	1.0	0.0	1.0
+chr2	50661	0.0	1.0	1.0
+chr2	50665	1.0	0.0	1.0
+chr2	50702	1.0	0.0	1.0
+chr2	50711	0.0	1.0	1.0
+chr2	50719	0.0	1.0	1.0
+chr2	50917	0.0	1.0	1.0
+chr2	51498	1.0	0.0	1.0
+chr2	51534	1.0	0.0	1.0
+chr2	51541	0.0	1.0	1.0
+chr2	51548	0.0	1.0	1.0
+chr2	51572	1.0	0.0	1.0
+chr2	51821	0.0	2.0	2.0
+chr2	52094	0.0	1.0	1.0
+chr2	52331	1.0	0.0	1.0
+chr2	53387	0.0	1.0	1.0
+chr2	54022	1.0	0.0	1.0
+chr2	55628	1.0	0.0	1.0
+chr2	55754	2.0	0.0	2.0
+chr2	55897	1.0	0.0	1.0
+chr2	55939	1.0	0.0	1.0
+chr2	56479	1.0	0.0	1.0
+chr2	56609	2.0	0.0	2.0
+chr2	56687	1.0	0.0	1.0
+chr2	56942	1.0	0.0	1.0
+chr2	57371	1.0	0.0	1.0
+chr2	57616	1.0	0.0	1.0
+chr2	57636	0.0	1.0	1.0
+chr2	58160	1.0	0.0	1.0
+chr2	58991	0.0	1.0	1.0
+chr2	59076	1.0	0.0	1.0
+chr2	59174	1.0	0.0	1.0
+chr2	59188	1.0	0.0	1.0
+chr2	59193	3.0	0.0	3.0
+chr2	59209	0.0	1.0	1.0
+chr2	59223	1.0	1.0	2.0
+chr2	59278	0.0	1.0	1.0
+chr2	59285	4.0	0.0	4.0
+chr2	59289	1.0	0.0	1.0
+chr2	59322	1.0	0.0	1.0
+chr2	59331	0.0	1.0	1.0
+chr2	59333	0.0	1.0	1.0
+chr2	59355	1.0	0.0	1.0
+chr2	59356	0.0	1.0	1.0
+chr2	59366	1.0	0.0	1.0
+chr2	59379	0.0	1.0	1.0
+chr2	59380	0.0	1.0	1.0
+chr2	59384	0.0	1.0	1.0
+chr2	59389	0.0	2.0	2.0
+chr2	59390	1.0	0.0	1.0
+chr2	59392	1.0	0.0	1.0
+chr2	59407	0.0	1.0	1.0
+chr2	59415	1.0	0.0	1.0
+chr2	59452	0.0	1.0	1.0
+chr2	59504	1.0	0.0	1.0
+chr2	59538	0.0	1.0	1.0
+chr2	59539	1.0	0.0	1.0
+chr2	59555	0.0	1.0	1.0
+chr2	59557	0.0	1.0	1.0
+chr2	59558	0.0	1.0	1.0
+chr2	59561	1.0	0.0	1.0
+chr2	59565	1.0	0.0	1.0
+chr2	59853	1.0	0.0	1.0
+chr2	59879	0.0	1.0	1.0
+chr2	59881	0.0	1.0	1.0
+chr2	59902	1.0	0.0	1.0
+chr2	61220	1.0	0.0	1.0
+chr2	61229	2.0	0.0	2.0
+chr2	61233	0.0	1.0	1.0
+chr2	61234	0.0	2.0	2.0
+chr2	61383	1.0	0.0	1.0
+chr2	61386	0.0	1.0	1.0
+chr2	61389	1.0	0.0	1.0
+chr2	61410	0.0	1.0	1.0
+chr2	61419	1.0	0.0	1.0
+chr2	61524	1.0	0.0	1.0
+chr2	61543	0.0	1.0	1.0
+chr2	61692	1.0	0.0	1.0
+chr2	61733	1.0	0.0	1.0
+chr2	62000	1.0	0.0	1.0
+chr2	62106	0.0	1.0	1.0
+chr2	62291	1.0	0.0	1.0
+chr2	62292	0.0	1.0	1.0
+chr2	62297	1.0	0.0	1.0
+chr2	62307	1.0	0.0	1.0
+chr2	62313	1.0	0.0	1.0
+chr2	62380	0.0	1.0	1.0
+chr2	62440	0.0	1.0	1.0
+chr2	62449	1.0	2.0	3.0
+chr2	62451	1.0	0.0	1.0
+chr2	62452	2.0	0.0	2.0
+chr2	62455	5.0	0.0	5.0
+chr2	62459	0.0	2.0	2.0
+chr2	62460	0.0	1.0	1.0
+chr2	62461	2.0	0.0	2.0
+chr2	62465	0.0	1.0	1.0
+chr2	62468	0.0	2.0	2.0
+chr2	62470	0.0	5.0	5.0
+chr2	62474	0.0	1.0	1.0
+chr2	62477	1.0	0.0	1.0
+chr2	62478	3.0	0.0	3.0
+chr2	62480	0.0	2.0	2.0
+chr2	62481	1.0	0.0	1.0
+chr2	62485	1.0	1.0	2.0
+chr2	62486	0.0	1.0	1.0
+chr2	62488	1.0	0.0	1.0
+chr2	62489	0.0	1.0	1.0
+chr2	62503	1.0	0.0	1.0
+chr2	62505	0.0	1.0	1.0
+chr2	62616	0.0	1.0	1.0
+chr2	62621	1.0	0.0	1.0
+chr2	62622	0.0	1.0	1.0
+chr2	62626	1.0	0.0	1.0
+chr2	62629	1.0	0.0	1.0
+chr2	62637	2.0	0.0	2.0
+chr2	62645	1.0	0.0	1.0
+chr2	62647	0.0	2.0	2.0
+chr2	62667	2.0	0.0	2.0
+chr2	62678	1.0	0.0	1.0
+chr2	62698	1.0	0.0	1.0
+chr2	62895	1.0	0.0	1.0
+chr2	62925	1.0	0.0	1.0
+chr2	63109	0.0	1.0	1.0
+chr2	63189	1.0	0.0	1.0
+chr2	63191	1.0	0.0	1.0
+chr2	63204	0.0	2.0	2.0
+chr2	63472	0.0	1.0	1.0
+chr2	63506	1.0	0.0	1.0
+chr2	63542	0.0	1.0	1.0
+chr2	63683	0.0	1.0	1.0
+chr2	63701	0.0	1.0	1.0
+chr2	63702	1.0	0.0	1.0
+chr2	63703	1.0	0.0	1.0
+chr2	63706	1.0	0.0	1.0
+chr2	63711	0.0	1.0	1.0
+chr2	63717	0.0	2.0	2.0
+chr2	63720	3.0	0.0	3.0
+chr2	63726	0.0	1.0	1.0
+chr2	63728	1.0	0.0	1.0
+chr2	63731	0.0	1.0	1.0
+chr2	63738	1.0	0.0	1.0
+chr2	63739	2.0	1.0	3.0
+chr2	63741	3.0	0.0	3.0
+chr2	63745	0.0	1.0	1.0
+chr2	63748	0.0	1.0	1.0
+chr2	63779	1.0	0.0	1.0
+chr2	63821	1.0	0.0	1.0
+chr2	63879	0.0	1.0	1.0
+chr2	63894	0.0	2.0	2.0
+chr2	63896	0.0	1.0	1.0
+chr2	63974	1.0	0.0	1.0
+chr2	64067	1.0	0.0	1.0
+chr2	64187	1.0	0.0	1.0
+chr2	64230	0.0	1.0	1.0
+chr2	64280	0.0	1.0	1.0
+chr2	64360	1.0	0.0	1.0
+chr2	64398	1.0	0.0	1.0
+chr2	65002	0.0	2.0	2.0
+chr2	65554	0.0	1.0	1.0
+chr2	66714	1.0	0.0	1.0
+chr2	66740	1.0	0.0	1.0
+chr2	66952	1.0	0.0	1.0
+chr2	67227	0.0	1.0	1.0
+chr2	67266	0.0	1.0	1.0
+chr2	67325	0.0	1.0	1.0
+chr2	67616	0.0	1.0	1.0
+chr2	67780	0.0	1.0	1.0
+chr2	68607	1.0	0.0	1.0
+chr2	69045	1.0	0.0	1.0
+chr2	69141	0.0	1.0	1.0
+chr2	69148	1.0	1.0	2.0
+chr2	69152	2.0	0.0	2.0
+chr2	69171	0.0	1.0	1.0
+chr2	69179	1.0	0.0	1.0
+chr2	69204	1.0	0.0	1.0
+chr2	69299	0.0	1.0	1.0
+chr2	69304	1.0	0.0	1.0
+chr2	69305	0.0	1.0	1.0
+chr2	69306	1.0	0.0	1.0
+chr2	69313	0.0	1.0	1.0
+chr2	69314	0.0	1.0	1.0
+chr2	69320	1.0	0.0	1.0
+chr2	69324	0.0	1.0	1.0
+chr2	69328	0.0	1.0	1.0
+chr2	69333	0.0	1.0	1.0
+chr2	69349	0.0	3.0	3.0
+chr2	69356	1.0	0.0	1.0
+chr2	69367	0.0	1.0	1.0
+chr2	69460	1.0	0.0	1.0
+chr2	69461	0.0	1.0	1.0
+chr2	69464	1.0	0.0	1.0
+chr2	69466	0.0	1.0	1.0
+chr2	69471	1.0	0.0	1.0
+chr2	69477	2.0	0.0	2.0
+chr2	69478	0.0	1.0	1.0
+chr2	69479	0.0	2.0	2.0
+chr2	69481	1.0	0.0	1.0
+chr2	69488	0.0	2.0	2.0
+chr2	69497	0.0	2.0	2.0
+chr2	69501	1.0	0.0	1.0
+chr2	69507	3.0	0.0	3.0
+chr2	69513	0.0	1.0	1.0
+chr2	69514	1.0	0.0	1.0
+chr2	69516	0.0	2.0	2.0
+chr2	69517	0.0	1.0	1.0
+chr2	69524	1.0	0.0	1.0
+chr2	69528	1.0	0.0	1.0
+chr2	69534	1.0	0.0	1.0
+chr2	69770	0.0	1.0	1.0
+chr2	69772	3.0	0.0	3.0
+chr2	69774	1.0	0.0	1.0
+chr2	69779	0.0	1.0	1.0
+chr2	69793	1.0	0.0	1.0
+chr2	69801	1.0	0.0	1.0
+chr2	70114	1.0	0.0	1.0
+chr2	70507	0.0	1.0	1.0
+chr2	70508	0.0	1.0	1.0
+chr2	70511	1.0	0.0	1.0
+chr2	70683	1.0	0.0	1.0
+chr2	70790	2.0	0.0	2.0
+chr2	70797	0.0	2.0	2.0
+chr2	70813	1.0	1.0	2.0
+chr2	70825	0.0	1.0	1.0
+chr2	70826	0.0	1.0	1.0
+chr2	70935	1.0	0.0	1.0
+chr2	70954	1.0	0.0	1.0
+chr2	70984	0.0	1.0	1.0
+chr2	71092	0.0	2.0	2.0
+chr2	71095	3.0	0.0	3.0
+chr2	71100	1.0	0.0	1.0
+chr2	71109	1.0	0.0	1.0
+chr2	71110	4.0	0.0	4.0
+chr2	71111	1.0	0.0	1.0
+chr2	71112	2.0	0.0	2.0
+chr2	71113	0.0	3.0	3.0
+chr2	71114	1.0	0.0	1.0
+chr2	71115	1.0	0.0	1.0
+chr2	71116	0.0	4.0	4.0
+chr2	71117	0.0	1.0	1.0
+chr2	71118	1.0	0.0	1.0
+chr2	71119	0.0	2.0	2.0
+chr2	71120	0.0	1.0	1.0
+chr2	71121	0.0	3.0	3.0
+chr2	71124	1.0	0.0	1.0
+chr2	71127	1.0	1.0	2.0
+chr2	71128	1.0	0.0	1.0
+chr2	71131	0.0	1.0	1.0
+chr2	71134	0.0	1.0	1.0
+chr2	71136	0.0	1.0	1.0
+chr2	71140	1.0	0.0	1.0
+chr2	71145	0.0	1.0	1.0
+chr2	71161	0.0	1.0	1.0
+chr2	71166	0.0	1.0	1.0
+chr2	71168	1.0	0.0	1.0
+chr2	71169	0.0	1.0	1.0
+chr2	71292	1.0	0.0	1.0
+chr2	71314	1.0	0.0	1.0
+chr2	71333	0.0	1.0	1.0
+chr2	71334	0.0	2.0	2.0
+chr2	71335	0.0	1.0	1.0
+chr2	71341	8.0	5.0	13.0
+chr2	71343	3.0	0.0	3.0
+chr2	71346	1.0	3.0	4.0
+chr2	71350	0.0	1.0	1.0
+chr2	71352	0.0	1.0	1.0
+chr2	71353	1.0	0.0	1.0
+chr2	71357	0.0	2.0	2.0
+chr2	71360	2.0	0.0	2.0
+chr2	71362	0.0	3.0	3.0
+chr2	71372	0.0	4.0	4.0
+chr2	71376	1.0	0.0	1.0
+chr2	71381	1.0	0.0	1.0
+chr2	71382	1.0	0.0	1.0
+chr2	71398	1.0	0.0	1.0
+chr2	71402	1.0	0.0	1.0
+chr2	71589	0.0	1.0	1.0
+chr2	71603	1.0	0.0	1.0
+chr2	71604	2.0	0.0	2.0
+chr2	71606	0.0	2.0	2.0
+chr2	71608	0.0	1.0	1.0
+chr2	71623	1.0	0.0	1.0
+chr2	71625	0.0	1.0	1.0
+chr2	71628	0.0	3.0	3.0
+chr2	71652	0.0	1.0	1.0
+chr2	71731	1.0	0.0	1.0
+chr2	71945	0.0	1.0	1.0
+chr2	71968	1.0	0.0	1.0
+chr2	72753	0.0	1.0	1.0
+chr2	72773	2.0	0.0	2.0
+chr2	72987	0.0	1.0	1.0
+chr2	73651	2.0	0.0	2.0
+chr2	73671	0.0	1.0	1.0
+chr2	73860	1.0	0.0	1.0
+chr2	73962	1.0	0.0	1.0
+chr2	74031	0.0	1.0	1.0
+chr2	74070	1.0	0.0	1.0
+chr2	74180	1.0	0.0	1.0
+chr2	74182	1.0	0.0	1.0
+chr2	74198	1.0	0.0	1.0
+chr2	74199	0.0	1.0	1.0
+chr2	74252	0.0	1.0	1.0
+chr2	74346	1.0	0.0	1.0
+chr2	74347	1.0	0.0	1.0
+chr2	74352	0.0	1.0	1.0
+chr2	74353	0.0	1.0	1.0
+chr2	74369	2.0	1.0	3.0
+chr2	74413	0.0	1.0	1.0
+chr2	74417	1.0	0.0	1.0
+chr2	74457	0.0	1.0	1.0
+chr2	74479	1.0	0.0	1.0
+chr2	74485	0.0	1.0	1.0
+chr2	74502	0.0	1.0	1.0
+chr2	74510	0.0	1.0	1.0
+chr2	74513	0.0	1.0	1.0
+chr2	74520	2.0	0.0	2.0
+chr2	74531	0.0	2.0	2.0
+chr2	74534	0.0	1.0	1.0
+chr2	74536	0.0	1.0	1.0
+chr2	74565	1.0	0.0	1.0
+chr2	74568	0.0	2.0	2.0
+chr2	74663	1.0	0.0	1.0
+chr2	74669	0.0	1.0	1.0
+chr2	74670	1.0	0.0	1.0
+chr2	74682	1.0	0.0	1.0
+chr2	74686	0.0	1.0	1.0
+chr2	74687	2.0	0.0	2.0
+chr2	74688	0.0	4.0	4.0
+chr2	74689	5.0	0.0	5.0
+chr2	74696	1.0	0.0	1.0
+chr2	74698	2.0	0.0	2.0
+chr2	74699	2.0	0.0	2.0
+chr2	74703	0.0	1.0	1.0
+chr2	74707	0.0	5.0	5.0
+chr2	74708	0.0	4.0	4.0
+chr2	74712	1.0	0.0	1.0
+chr2	74719	1.0	1.0	2.0
+chr2	74725	1.0	0.0	1.0
+chr2	74730	1.0	0.0	1.0
+chr2	74748	1.0	0.0	1.0
+chr2	74927	0.0	1.0	1.0
+chr2	74945	0.0	1.0	1.0
+chr2	74958	1.0	0.0	1.0
+chr2	74960	1.0	0.0	1.0
+chr2	74963	0.0	1.0	1.0
+chr2	74964	1.0	0.0	1.0
+chr2	74966	0.0	1.0	1.0
+chr2	74967	1.0	1.0	2.0
+chr2	74968	4.0	0.0	4.0
+chr2	74970	1.0	0.0	1.0
+chr2	74972	0.0	1.0	1.0
+chr2	74978	0.0	2.0	2.0
+chr2	74980	0.0	1.0	1.0
+chr2	74998	1.0	0.0	1.0
+chr2	75215	1.0	0.0	1.0
+chr2	75222	1.0	0.0	1.0
+chr2	75227	0.0	1.0	1.0
+chr2	75229	1.0	4.0	5.0
+chr2	75230	0.0	1.0	1.0
+chr2	75231	1.0	0.0	1.0
+chr2	75232	3.0	0.0	3.0
+chr2	75234	1.0	1.0	2.0
+chr2	75235	0.0	1.0	1.0
+chr2	75236	1.0	1.0	2.0
+chr2	75237	4.0	1.0	5.0
+chr2	75238	0.0	1.0	1.0
+chr2	75239	2.0	0.0	2.0
+chr2	75241	0.0	3.0	3.0
+chr2	75242	1.0	0.0	1.0
+chr2	75243	0.0	1.0	1.0
+chr2	75246	1.0	0.0	1.0
+chr2	75247	1.0	0.0	1.0
+chr2	75256	1.0	0.0	1.0
+chr2	75257	0.0	2.0	2.0
+chr2	75258	0.0	1.0	1.0
+chr2	75259	0.0	2.0	2.0
+chr2	75395	0.0	1.0	1.0
+chr2	75407	1.0	0.0	1.0
+chr2	75408	1.0	0.0	1.0
+chr2	75411	2.0	0.0	2.0
+chr2	75412	1.0	0.0	1.0
+chr2	75415	3.0	0.0	3.0
+chr2	75417	0.0	3.0	3.0
+chr2	75421	1.0	0.0	1.0
+chr2	75425	0.0	1.0	1.0
+chr2	75426	0.0	1.0	1.0
+chr2	75450	0.0	1.0	1.0
+chr2	75495	1.0	0.0	1.0
+chr2	75589	2.0	0.0	2.0
+chr2	75595	0.0	1.0	1.0
+chr2	75674	1.0	0.0	1.0
+chr2	75698	0.0	1.0	1.0
+chr2	75717	1.0	0.0	1.0
+chr2	75940	1.0	0.0	1.0
+chr2	76480	0.0	1.0	1.0
+chr2	76490	0.0	1.0	1.0
+chr2	76897	1.0	0.0	1.0
+chr2	77260	0.0	2.0	2.0
+chr2	77442	1.0	0.0	1.0
+chr2	77464	0.0	1.0	1.0
+chr2	77668	1.0	0.0	1.0
+chr2	77866	1.0	0.0	1.0
+chr2	78827	0.0	1.0	1.0
+chr2	78941	1.0	0.0	1.0
+chr2	79666	1.0	0.0	1.0
+chr2	80159	0.0	1.0	1.0
+chr2	80360	0.0	1.0	1.0
+chr2	80419	0.0	1.0	1.0
+chr2	80522	1.0	0.0	1.0
+chr2	80534	1.0	0.0	1.0
+chr2	80544	1.0	0.0	1.0
+chr2	80551	0.0	3.0	3.0
+chr2	80557	1.0	0.0	1.0
+chr2	80559	0.0	2.0	2.0
+chr2	80560	1.0	0.0	1.0
+chr2	80561	5.0	0.0	5.0
+chr2	80566	1.0	2.0	3.0
+chr2	80574	0.0	1.0	1.0
+chr2	80576	1.0	0.0	1.0
+chr2	80653	0.0	1.0	1.0
+chr2	80665	0.0	1.0	1.0
+chr2	80681	1.0	0.0	1.0
+chr2	80697	0.0	3.0	3.0
+chr2	80712	2.0	0.0	2.0
+chr2	80717	1.0	0.0	1.0
+chr2	80723	2.0	0.0	2.0
+chr2	80726	1.0	0.0	1.0
+chr2	80733	0.0	1.0	1.0
+chr2	80735	0.0	1.0	1.0
+chr2	80747	0.0	1.0	1.0
+chr2	81183	1.0	0.0	1.0
+chr2	81329	0.0	1.0	1.0
+chr2	81950	2.0	0.0	2.0
+chr2	82733	1.0	0.0	1.0
+chr2	84065	0.0	1.0	1.0
+chr2	84069	1.0	0.0	1.0
+chr2	84075	1.0	0.0	1.0
+chr2	84077	1.0	0.0	1.0
+chr2	84082	0.0	1.0	1.0
+chr2	84083	0.0	1.0	1.0
+chr2	84089	1.0	0.0	1.0
+chr2	84208	0.0	1.0	1.0
+chr2	84214	1.0	0.0	1.0
+chr2	84216	0.0	1.0	1.0
+chr2	84236	0.0	1.0	1.0
+chr2	84245	0.0	1.0	1.0
+chr2	84280	1.0	0.0	1.0
+chr2	84542	1.0	0.0	1.0
+chr2	84551	0.0	1.0	1.0
+chr2	84557	0.0	1.0	1.0
+chr2	84560	1.0	8.0	9.0
+chr2	84561	0.0	1.0	1.0
+chr2	84562	0.0	1.0	1.0
+chr2	84563	1.0	0.0	1.0
+chr2	84568	4.0	1.0	5.0
+chr2	84569	2.0	0.0	2.0
+chr2	84570	1.0	3.0	4.0
+chr2	84573	2.0	0.0	2.0
+chr2	84574	2.0	4.0	6.0
+chr2	84575	0.0	1.0	1.0
+chr2	84580	0.0	5.0	5.0
+chr2	84584	1.0	0.0	1.0
+chr2	84588	3.0	0.0	3.0
+chr2	84597	0.0	2.0	2.0
+chr2	84630	0.0	1.0	1.0
+chr2	84653	1.0	0.0	1.0
+chr2	84711	1.0	0.0	1.0
+chr2	84726	0.0	1.0	1.0
+chr2	84738	0.0	1.0	1.0
+chr2	84743	2.0	0.0	2.0
+chr2	84754	1.0	0.0	1.0
+chr2	84764	1.0	0.0	1.0
+chr2	84888	1.0	0.0	1.0
+chr2	84903	0.0	1.0	1.0
+chr2	84912	1.0	0.0	1.0
+chr2	84921	0.0	1.0	1.0
+chr2	84933	0.0	1.0	1.0
+chr2	85076	0.0	2.0	2.0
+chr2	85087	0.0	1.0	1.0
+chr2	85102	0.0	1.0	1.0
+chr2	85256	1.0	0.0	1.0
+chr2	85272	2.0	0.0	2.0
+chr2	85283	0.0	1.0	1.0
+chr2	85537	1.0	0.0	1.0
+chr2	85828	1.0	0.0	1.0
+chr2	85831	1.0	0.0	1.0
+chr2	86027	1.0	0.0	1.0
+chr2	86386	1.0	0.0	1.0
+chr2	86956	1.0	0.0	1.0
+chr2	87045	1.0	0.0	1.0
+chr2	87090	1.0	0.0	1.0
+chr2	87225	1.0	0.0	1.0
+chr2	87459	1.0	0.0	1.0
+chr2	87583	0.0	1.0	1.0
+chr2	87590	1.0	0.0	1.0
+chr2	87593	1.0	0.0	1.0
+chr2	87601	0.0	1.0	1.0
+chr2	87624	0.0	1.0	1.0
+chr2	87731	1.0	0.0	1.0
+chr2	87735	1.0	0.0	1.0
+chr2	87736	1.0	0.0	1.0
+chr2	87739	1.0	0.0	1.0
+chr2	87751	1.0	0.0	1.0
+chr2	87765	1.0	0.0	1.0
+chr2	87772	3.0	0.0	3.0
+chr2	87774	1.0	0.0	1.0
+chr2	87780	0.0	1.0	1.0
+chr2	87784	0.0	1.0	1.0
+chr2	87785	0.0	1.0	1.0
+chr2	87789	0.0	1.0	1.0
+chr2	87790	0.0	2.0	2.0
+chr2	87797	1.0	0.0	1.0
+chr2	87804	0.0	1.0	1.0
+chr2	88002	0.0	1.0	1.0
+chr2	88035	0.0	1.0	1.0
+chr2	88113	0.0	1.0	1.0
+chr2	88922	0.0	1.0	1.0
+chr2	89112	1.0	0.0	1.0
+chr2	89122	1.0	0.0	1.0
+chr2	89442	0.0	1.0	1.0
+chr2	89969	1.0	0.0	1.0
+chr2	89971	1.0	0.0	1.0
+chr2	89974	0.0	1.0	1.0
+chr2	89988	0.0	1.0	1.0
+chr2	89989	1.0	0.0	1.0
+chr2	89991	2.0	0.0	2.0
+chr2	89997	0.0	1.0	1.0
+chr2	90001	0.0	1.0	1.0
+chr2	90013	2.0	0.0	2.0
+chr2	90025	1.0	0.0	1.0
+chr2	90034	1.0	0.0	1.0
+chr2	90125	0.0	1.0	1.0
+chr2	90169	0.0	1.0	1.0
+chr2	90387	1.0	0.0	1.0
+chr2	90439	0.0	1.0	1.0
+chr2	90443	0.0	1.0	1.0
+chr2	90445	1.0	0.0	1.0
+chr2	90447	0.0	1.0	1.0
+chr2	90476	2.0	0.0	2.0
+chr2	90485	0.0	1.0	1.0
+chr2	90684	1.0	0.0	1.0
+chr2	90698	1.0	0.0	1.0
+chr2	90706	2.0	1.0	3.0
+chr2	90719	0.0	1.0	1.0
+chr2	90721	0.0	3.0	3.0
+chr2	90723	2.0	0.0	2.0
+chr2	90727	1.0	0.0	1.0
+chr2	90741	0.0	1.0	1.0
+chr2	90742	0.0	2.0	2.0
+chr2	90744	1.0	0.0	1.0
+chr2	90762	1.0	0.0	1.0
+chr2	90832	0.0	2.0	2.0
+chr2	90853	2.0	0.0	2.0
+chr2	90861	0.0	1.0	1.0
+chr2	90868	1.0	0.0	1.0
+chr2	90870	1.0	0.0	1.0
+chr2	90888	1.0	0.0	1.0
+chr2	91023	1.0	0.0	1.0
+chr2	91195	0.0	1.0	1.0
+chr2	91367	1.0	0.0	1.0
+chr2	91401	2.0	0.0	2.0
+chr2	91503	0.0	3.0	3.0
+chr2	91529	0.0	2.0	2.0
+chr2	91652	0.0	1.0	1.0
+chr2	91841	0.0	1.0	1.0
+chr2	91994	0.0	1.0	1.0
+chr2	92003	0.0	2.0	2.0
+chr2	92014	1.0	0.0	1.0
+chr2	92134	0.0	1.0	1.0
+chr2	92144	1.0	0.0	1.0
+chr2	92145	0.0	1.0	1.0
+chr2	92146	0.0	1.0	1.0
+chr2	92147	1.0	0.0	1.0
+chr2	92149	0.0	2.0	2.0
+chr2	92150	1.0	0.0	1.0
+chr2	92151	0.0	1.0	1.0
+chr2	92154	0.0	3.0	3.0
+chr2	92155	0.0	1.0	1.0
+chr2	92157	0.0	1.0	1.0
+chr2	92158	2.0	0.0	2.0
+chr2	92159	1.0	0.0	1.0
+chr2	92160	2.0	0.0	2.0
+chr2	92161	2.0	0.0	2.0
+chr2	92166	0.0	2.0	2.0
+chr2	92167	0.0	1.0	1.0
+chr2	92171	1.0	3.0	4.0
+chr2	92179	0.0	1.0	1.0
+chr2	92190	0.0	1.0	1.0
+chr2	92269	0.0	1.0	1.0
+chr2	92320	2.0	0.0	2.0
+chr2	92401	1.0	0.0	1.0
+chr2	92402	2.0	0.0	2.0
+chr2	92403	0.0	1.0	1.0
+chr2	92407	1.0	1.0	2.0
+chr2	92408	2.0	0.0	2.0
+chr2	92414	1.0	0.0	1.0
+chr2	92417	2.0	0.0	2.0
+chr2	92418	0.0	1.0	1.0
+chr2	92421	1.0	3.0	4.0
+chr2	92429	0.0	2.0	2.0
+chr2	92430	0.0	1.0	1.0
+chr2	92436	1.0	0.0	1.0
+chr2	92440	0.0	1.0	1.0
+chr2	92474	1.0	0.0	1.0
+chr2	92553	0.0	1.0	1.0
+chr2	92568	0.0	1.0	1.0
+chr2	92572	2.0	0.0	2.0
+chr2	92573	0.0	1.0	1.0
+chr2	92580	0.0	1.0	1.0
+chr2	92583	1.0	0.0	1.0
+chr2	92587	1.0	0.0	1.0
+chr2	92757	1.0	0.0	1.0
+chr2	92972	0.0	1.0	1.0
+chr2	93003	0.0	1.0	1.0
+chr2	93153	1.0	0.0	1.0
+chr2	93162	1.0	0.0	1.0
+chr2	93196	1.0	0.0	1.0
+chr2	93198	1.0	0.0	1.0
+chr2	93363	0.0	1.0	1.0
+chr2	93366	0.0	1.0	1.0
+chr2	93369	1.0	0.0	1.0
+chr2	93980	0.0	1.0	1.0
+chr2	94430	0.0	1.0	1.0
+chr2	94442	2.0	0.0	2.0
+chr2	95307	0.0	1.0	1.0
+chr2	95343	0.0	1.0	1.0
+chr2	95446	0.0	2.0	2.0
+chr2	95768	0.0	1.0	1.0
+chr2	95932	0.0	1.0	1.0
+chr2	95934	0.0	1.0	1.0
+chr2	95935	2.0	0.0	2.0
+chr2	95936	0.0	1.0	1.0
+chr2	96086	0.0	4.0	4.0
+chr2	96092	0.0	1.0	1.0
+chr2	96100	1.0	0.0	1.0
+chr2	96101	1.0	0.0	1.0
+chr2	96104	1.0	0.0	1.0
+chr2	96114	0.0	1.0	1.0
+chr2	96358	2.0	0.0	2.0
+chr2	96528	0.0	1.0	1.0
+chr2	96728	0.0	1.0	1.0
+chr2	96754	1.0	0.0	1.0
+chr2	97206	0.0	1.0	1.0
+chr2	97544	2.0	0.0	2.0
+chr2	98177	0.0	1.0	1.0
+chr2	98409	1.0	0.0	1.0
+chr2	98981	0.0	1.0	1.0
+chr2	99180	0.0	2.0	2.0
+chr2	99363	1.0	0.0	1.0
+chr2	99410	0.0	1.0	1.0
+chr2	99622	0.0	1.0	1.0
+chr2	99659	1.0	0.0	1.0
+chr2	99774	0.0	1.0	1.0
+chr2	99777	1.0	0.0	1.0
+chr2	99937	1.0	0.0	1.0
+chr2	99956	0.0	1.0	1.0
+chr2	99962	0.0	1.0	1.0
+chr2	99965	0.0	1.0	1.0
+chr2	99969	1.0	0.0	1.0
+chr2	99979	1.0	0.0	1.0
+chr2	99995	1.0	0.0	1.0
+chr2	100006	1.0	0.0	1.0
+chr2	100072	0.0	1.0	1.0
+chr2	100085	1.0	0.0	1.0
+chr2	100092	0.0	2.0	2.0
+chr2	100093	0.0	1.0	1.0
+chr2	100098	0.0	1.0	1.0
+chr2	100099	1.0	0.0	1.0
+chr2	100100	0.0	1.0	1.0
+chr2	100102	1.0	0.0	1.0
+chr2	100106	1.0	0.0	1.0
+chr2	100113	1.0	0.0	1.0
+chr2	100114	3.0	0.0	3.0
+chr2	100118	0.0	3.0	3.0
+chr2	100119	1.0	0.0	1.0
+chr2	100120	0.0	4.0	4.0
+chr2	100122	1.0	1.0	2.0
+chr2	100131	0.0	1.0	1.0
+chr2	100156	1.0	0.0	1.0
+chr2	100390	0.0	1.0	1.0
+chr2	100394	1.0	0.0	1.0
+chr2	100416	0.0	2.0	2.0
+chr2	100445	0.0	1.0	1.0
+chr2	100558	0.0	1.0	1.0
+chr2	100582	0.0	2.0	2.0
+chr2	100694	0.0	1.0	1.0
+chr2	100781	0.0	1.0	1.0
+chr2	100827	0.0	1.0	1.0
+chr2	100837	2.0	0.0	2.0
+chr2	100841	2.0	0.0	2.0
+chr2	100853	1.0	0.0	1.0
+chr2	100858	0.0	1.0	1.0
+chr2	100888	0.0	1.0	1.0
+chr2	100991	1.0	0.0	1.0
+chr2	100994	1.0	0.0	1.0
+chr2	101006	0.0	1.0	1.0
+chr2	101009	0.0	1.0	1.0
+chr2	101011	0.0	1.0	1.0
+chr2	101018	0.0	2.0	2.0
+chr2	101030	0.0	1.0	1.0
+chr2	101132	0.0	1.0	1.0
+chr2	101138	0.0	1.0	1.0
+chr2	101144	0.0	3.0	3.0
+chr2	101145	0.0	1.0	1.0
+chr2	101148	0.0	1.0	1.0
+chr2	101150	3.0	0.0	3.0
+chr2	101155	1.0	0.0	1.0
+chr2	101157	0.0	1.0	1.0
+chr2	101159	0.0	1.0	1.0
+chr2	101161	3.0	0.0	3.0
+chr2	101164	1.0	0.0	1.0
+chr2	101165	1.0	1.0	2.0
+chr2	101167	2.0	0.0	2.0
+chr2	101169	0.0	2.0	2.0
+chr2	101170	0.0	1.0	1.0
+chr2	101178	2.0	0.0	2.0
+chr2	101179	0.0	1.0	1.0
+chr2	101188	0.0	3.0	3.0
+chr2	101194	1.0	0.0	1.0
+chr2	101201	0.0	2.0	2.0
+chr2	101516	0.0	1.0	1.0
+chr2	101628	1.0	0.0	1.0
+chr2	101630	1.0	0.0	1.0
+chr2	101663	0.0	1.0	1.0
+chr2	101670	0.0	1.0	1.0
+chr2	101690	1.0	0.0	1.0
+chr2	101824	1.0	0.0	1.0
+chr2	101897	0.0	1.0	1.0
+chr2	101901	0.0	1.0	1.0
+chr2	101903	0.0	3.0	3.0
+chr2	101904	0.0	1.0	1.0
+chr2	101907	2.0	4.0	6.0
+chr2	101908	2.0	0.0	2.0
+chr2	101910	2.0	0.0	2.0
+chr2	101911	3.0	0.0	3.0
+chr2	101912	2.0	0.0	2.0
+chr2	101914	1.0	1.0	2.0
+chr2	101916	2.0	0.0	2.0
+chr2	101919	4.0	0.0	4.0
+chr2	101920	2.0	3.0	5.0
+chr2	101922	0.0	2.0	2.0
+chr2	101924	0.0	7.0	7.0
+chr2	101938	0.0	1.0	1.0
+chr2	101939	2.0	0.0	2.0
+chr2	101940	2.0	2.0	4.0
+chr2	101941	0.0	2.0	2.0
+chr2	101945	1.0	0.0	1.0
+chr2	101949	1.0	0.0	1.0
+chr2	101955	1.0	0.0	1.0
+chr2	101958	1.0	0.0	1.0
+chr2	101973	0.0	1.0	1.0
+chr2	102056	1.0	0.0	1.0
+chr2	102071	2.0	0.0	2.0
+chr2	102091	1.0	0.0	1.0
+chr2	102092	1.0	1.0	2.0
+chr2	102109	1.0	0.0	1.0
+chr2	102127	1.0	0.0	1.0
+chr2	102246	1.0	1.0	2.0
+chr2	102264	1.0	0.0	1.0
+chr2	102513	1.0	0.0	1.0
+chr2	102548	1.0	0.0	1.0
+chr2	102568	1.0	0.0	1.0
+chr2	102582	2.0	0.0	2.0
+chr2	102670	0.0	1.0	1.0
+chr2	102746	0.0	1.0	1.0
+chr2	102767	2.0	0.0	2.0
+chr2	102868	1.0	0.0	1.0
+chr2	102928	1.0	0.0	1.0
+chr2	103269	1.0	0.0	1.0
+chr2	103301	0.0	2.0	2.0
+chr2	103965	1.0	0.0	1.0
+chr2	104011	1.0	0.0	1.0
+chr2	104121	1.0	0.0	1.0
+chr2	104756	0.0	1.0	1.0
+chr2	105835	1.0	0.0	1.0
+chr2	106778	1.0	0.0	1.0
+chr2	106830	1.0	0.0	1.0
+chr2	106934	1.0	0.0	1.0
+chr2	107263	0.0	1.0	1.0
+chr2	107276	1.0	0.0	1.0
+chr2	107292	0.0	1.0	1.0
+chr2	107299	2.0	0.0	2.0
+chr2	107366	1.0	0.0	1.0
+chr2	107436	0.0	1.0	1.0
+chr2	107439	0.0	3.0	3.0
+chr2	107444	2.0	0.0	2.0
+chr2	107450	0.0	1.0	1.0
+chr2	107454	1.0	0.0	1.0
+chr2	107455	1.0	0.0	1.0
+chr2	107456	1.0	1.0	2.0
+chr2	107458	1.0	1.0	2.0
+chr2	107469	0.0	1.0	1.0
+chr2	107476	0.0	1.0	1.0
+chr2	107489	0.0	1.0	1.0
+chr2	107697	0.0	1.0	1.0
+chr2	107700	2.0	0.0	2.0
+chr2	107713	1.0	0.0	1.0
+chr2	107717	1.0	0.0	1.0
+chr2	107719	0.0	1.0	1.0
+chr2	107724	1.0	0.0	1.0
+chr2	107727	1.0	2.0	3.0
+chr2	107758	1.0	0.0	1.0
+chr2	107775	0.0	1.0	1.0
+chr2	107905	1.0	0.0	1.0
+chr2	107923	1.0	0.0	1.0
+chr2	107930	0.0	2.0	2.0
+chr2	107935	1.0	0.0	1.0
+chr2	107942	2.0	0.0	2.0
+chr2	107945	3.0	0.0	3.0
+chr2	107955	0.0	1.0	1.0
+chr2	107962	0.0	1.0	1.0
+chr2	107972	0.0	1.0	1.0
+chr2	108053	0.0	1.0	1.0
+chr2	108106	0.0	1.0	1.0
+chr2	108107	1.0	0.0	1.0
+chr2	108117	0.0	1.0	1.0
+chr2	108261	0.0	1.0	1.0
+chr2	108265	2.0	0.0	2.0
+chr2	108267	0.0	1.0	1.0
+chr2	108419	1.0	0.0	1.0
+chr2	108438	0.0	3.0	3.0
+chr2	108941	0.0	1.0	1.0
+chr2	109094	0.0	1.0	1.0
+chr2	109318	0.0	1.0	1.0
+chr2	109519	0.0	1.0	1.0
+chr2	109577	0.0	1.0	1.0
+chr2	109608	1.0	0.0	1.0
+chr2	110120	1.0	0.0	1.0
+chr2	110141	0.0	1.0	1.0
+chr2	110159	0.0	1.0	1.0
+chr2	110172	0.0	1.0	1.0
+chr2	110216	0.0	2.0	2.0
+chr2	110298	0.0	1.0	1.0
+chr2	110337	0.0	1.0	1.0
+chr2	110341	1.0	0.0	1.0
+chr2	110487	0.0	1.0	1.0
+chr2	110502	3.0	0.0	3.0
+chr2	110504	0.0	1.0	1.0
+chr2	110512	0.0	1.0	1.0
+chr2	110513	0.0	2.0	2.0
+chr2	110514	0.0	1.0	1.0
+chr2	110517	1.0	0.0	1.0
+chr2	110520	0.0	1.0	1.0
+chr2	110525	1.0	0.0	1.0
+chr2	110526	1.0	0.0	1.0
+chr2	110527	0.0	1.0	1.0
+chr2	110533	2.0	0.0	2.0
+chr2	110721	0.0	1.0	1.0
+chr2	110735	0.0	1.0	1.0
+chr2	110739	0.0	1.0	1.0
+chr2	110745	3.0	0.0	3.0
+chr2	110747	0.0	1.0	1.0
+chr2	110753	0.0	1.0	1.0
+chr2	110769	1.0	0.0	1.0
+chr2	111043	0.0	1.0	1.0
+chr2	111138	0.0	3.0	3.0
+chr2	111161	1.0	1.0	2.0
+chr2	111163	0.0	1.0	1.0
+chr2	111164	1.0	0.0	1.0
+chr2	111169	0.0	1.0	1.0
+chr2	111188	0.0	1.0	1.0
+chr2	111196	1.0	0.0	1.0
+chr2	111197	0.0	1.0	1.0
+chr2	111436	2.0	0.0	2.0
+chr2	111439	3.0	2.0	5.0
+chr2	111441	1.0	0.0	1.0
+chr2	111442	2.0	0.0	2.0
+chr2	111443	3.0	0.0	3.0
+chr2	111447	0.0	1.0	1.0
+chr2	111448	1.0	0.0	1.0
+chr2	111449	2.0	1.0	3.0
+chr2	111451	0.0	3.0	3.0
+chr2	111456	1.0	0.0	1.0
+chr2	111457	1.0	0.0	1.0
+chr2	111458	0.0	1.0	1.0
+chr2	111459	1.0	0.0	1.0
+chr2	111460	0.0	6.0	6.0
+chr2	111461	1.0	3.0	4.0
+chr2	111462	0.0	1.0	1.0
+chr2	111463	0.0	1.0	1.0
+chr2	111464	0.0	1.0	1.0
+chr2	111468	1.0	0.0	1.0
+chr2	111469	0.0	1.0	1.0
+chr2	111470	5.0	0.0	5.0
+chr2	111472	2.0	0.0	2.0
+chr2	111475	0.0	1.0	1.0
+chr2	111476	1.0	1.0	2.0
+chr2	111623	0.0	1.0	1.0
+chr2	111624	0.0	3.0	3.0
+chr2	111625	1.0	0.0	1.0
+chr2	111632	0.0	1.0	1.0
+chr2	111634	2.0	0.0	2.0
+chr2	111647	0.0	1.0	1.0
+chr2	112117	0.0	1.0	1.0
+chr2	112297	0.0	2.0	2.0
+chr2	112329	3.0	0.0	3.0
+chr2	113052	0.0	1.0	1.0
+chr2	113054	0.0	1.0	1.0
+chr2	113090	1.0	0.0	1.0
+chr2	113163	1.0	0.0	1.0
+chr2	113216	1.0	0.0	1.0
+chr2	113222	1.0	0.0	1.0
+chr2	113229	1.0	0.0	1.0
+chr2	113253	2.0	0.0	2.0
+chr2	113254	0.0	1.0	1.0
+chr2	113321	0.0	1.0	1.0
+chr2	113389	0.0	2.0	2.0
+chr2	113392	2.0	1.0	3.0
+chr2	113395	2.0	1.0	3.0
+chr2	113396	0.0	1.0	1.0
+chr2	113397	1.0	0.0	1.0
+chr2	113398	1.0	0.0	1.0
+chr2	113401	3.0	0.0	3.0
+chr2	113406	1.0	1.0	2.0
+chr2	113407	0.0	1.0	1.0
+chr2	113409	1.0	0.0	1.0
+chr2	113411	0.0	1.0	1.0
+chr2	113413	1.0	0.0	1.0
+chr2	113420	0.0	1.0	1.0
+chr2	113421	0.0	2.0	2.0
+chr2	113427	0.0	1.0	1.0
+chr2	113429	2.0	0.0	2.0
+chr2	113440	0.0	1.0	1.0
+chr2	113639	0.0	1.0	1.0
+chr2	113669	1.0	0.0	1.0
+chr2	113678	1.0	0.0	1.0
+chr2	113681	0.0	1.0	1.0
+chr2	113684	1.0	0.0	1.0
+chr2	113685	1.0	1.0	2.0
+chr2	113689	0.0	1.0	1.0
+chr2	113692	3.0	2.0	5.0
+chr2	113693	2.0	0.0	2.0
+chr2	113694	6.0	0.0	6.0
+chr2	113697	1.0	0.0	1.0
+chr2	113699	0.0	2.0	2.0
+chr2	113703	0.0	1.0	1.0
+chr2	113710	0.0	2.0	2.0
+chr2	113711	0.0	2.0	2.0
+chr2	113750	1.0	0.0	1.0
+chr2	113828	0.0	1.0	1.0
+chr2	113837	0.0	1.0	1.0
+chr2	113851	1.0	0.0	1.0
+chr2	113858	3.0	0.0	3.0
+chr2	113859	0.0	3.0	3.0
+chr2	113860	0.0	1.0	1.0
+chr2	113863	0.0	1.0	1.0
+chr2	113866	1.0	0.0	1.0
+chr2	113868	0.0	5.0	5.0
+chr2	113869	0.0	1.0	1.0
+chr2	113870	0.0	1.0	1.0
+chr2	113873	1.0	0.0	1.0
+chr2	113882	0.0	2.0	2.0
+chr2	113885	1.0	0.0	1.0
+chr2	114011	0.0	1.0	1.0
+chr2	114023	1.0	0.0	1.0
+chr2	114529	1.0	0.0	1.0
+chr2	115078	0.0	1.0	1.0
+chr2	115178	1.0	0.0	1.0
+chr2	115192	1.0	0.0	1.0
+chr2	115581	0.0	1.0	1.0
+chr2	115859	0.0	3.0	3.0
+chr2	115870	0.0	1.0	1.0
+chr2	115873	0.0	1.0	1.0
+chr2	116180	1.0	0.0	1.0
+chr2	116314	1.0	0.0	1.0
+chr2	116338	1.0	0.0	1.0
+chr2	116472	1.0	0.0	1.0
+chr2	116516	1.0	0.0	1.0
+chr2	116649	1.0	0.0	1.0
+chr2	116667	1.0	0.0	1.0
+chr2	116671	0.0	1.0	1.0
+chr2	116805	0.0	1.0	1.0
+chr2	116819	0.0	1.0	1.0
+chr2	116828	0.0	2.0	2.0
+chr2	116829	0.0	1.0	1.0
+chr2	116836	1.0	0.0	1.0
+chr2	116837	0.0	1.0	1.0
+chr2	116840	1.0	1.0	2.0
+chr2	116842	0.0	1.0	1.0
+chr2	116844	1.0	0.0	1.0
+chr2	116848	0.0	1.0	1.0
+chr2	116850	0.0	1.0	1.0
+chr2	116858	0.0	1.0	1.0
+chr2	116864	0.0	2.0	2.0
+chr2	116867	1.0	0.0	1.0
+chr2	116896	0.0	1.0	1.0
+chr2	117135	1.0	0.0	1.0
+chr2	117154	0.0	2.0	2.0
+chr2	117165	0.0	1.0	1.0
+chr2	117175	0.0	2.0	2.0
+chr2	117185	1.0	0.0	1.0
+chr2	117222	1.0	0.0	1.0
+chr2	117433	0.0	1.0	1.0
+chr2	117458	0.0	3.0	3.0
+chr2	117459	0.0	1.0	1.0
+chr2	117464	0.0	1.0	1.0
+chr2	117486	0.0	1.0	1.0
+chr2	117500	0.0	2.0	2.0
+chr2	117501	0.0	2.0	2.0
+chr2	117607	1.0	0.0	1.0
+chr2	117614	0.0	1.0	1.0
+chr2	117624	1.0	0.0	1.0
+chr2	117636	0.0	1.0	1.0
+chr2	117638	0.0	1.0	1.0
+chr2	117650	0.0	1.0	1.0
+chr2	117656	1.0	0.0	1.0
+chr2	117788	1.0	0.0	1.0
+chr2	117798	1.0	0.0	1.0
+chr2	117817	0.0	1.0	1.0
+chr2	117821	0.0	1.0	1.0
+chr2	118022	0.0	1.0	1.0
+chr2	118453	1.0	0.0	1.0
+chr2	118626	0.0	1.0	1.0
+chr2	119037	0.0	1.0	1.0
+chr2	119526	0.0	2.0	2.0
+chr2	119555	0.0	1.0	1.0
+chr2	119864	1.0	0.0	1.0
+chr2	120148	0.0	1.0	1.0
+chr2	121208	1.0	0.0	1.0
+chr2	121403	0.0	1.0	1.0
+chr2	121725	1.0	0.0	1.0
+chr2	121910	0.0	2.0	2.0
+chr2	121914	1.0	0.0	1.0
+chr2	121945	1.0	0.0	1.0
+chr2	122063	1.0	0.0	1.0
+chr2	122064	2.0	0.0	2.0
+chr2	122070	0.0	1.0	1.0
+chr2	122071	1.0	0.0	1.0
+chr2	122072	1.0	0.0	1.0
+chr2	122074	0.0	3.0	3.0
+chr2	122081	0.0	1.0	1.0
+chr2	122084	0.0	2.0	2.0
+chr2	122090	0.0	2.0	2.0
+chr2	122091	0.0	1.0	1.0
+chr2	122093	2.0	0.0	2.0
+chr2	122096	0.0	2.0	2.0
+chr2	122100	1.0	1.0	2.0
+chr2	122105	1.0	0.0	1.0
+chr2	122110	1.0	0.0	1.0
+chr2	122123	0.0	1.0	1.0
+chr2	122129	1.0	0.0	1.0
+chr2	122133	1.0	0.0	1.0
+chr2	122134	2.0	0.0	2.0
+chr2	123080	0.0	1.0	1.0
+chr2	123327	1.0	0.0	1.0
+chr2	123652	0.0	1.0	1.0
+chr2	123819	0.0	1.0	1.0
+chr2	124036	0.0	1.0	1.0
+chr2	124275	0.0	1.0	1.0
+chr2	124300	1.0	0.0	1.0
+chr2	124422	0.0	1.0	1.0
+chr2	124429	0.0	2.0	2.0
+chr2	124596	0.0	1.0	1.0
+chr2	124609	0.0	1.0	1.0
+chr2	124613	1.0	0.0	1.0
+chr2	124620	0.0	1.0	1.0
+chr2	124637	1.0	0.0	1.0
+chr2	124701	0.0	1.0	1.0
+chr2	124739	0.0	2.0	2.0
+chr2	124758	1.0	0.0	1.0
+chr2	124767	0.0	1.0	1.0
+chr2	124774	1.0	1.0	2.0
+chr2	124775	0.0	4.0	4.0
+chr2	124776	0.0	2.0	2.0
+chr2	124778	6.0	0.0	6.0
+chr2	124779	3.0	0.0	3.0
+chr2	124780	3.0	0.0	3.0
+chr2	124783	2.0	0.0	2.0
+chr2	124784	1.0	0.0	1.0
+chr2	124785	1.0	1.0	2.0
+chr2	124786	0.0	1.0	1.0
+chr2	124787	1.0	0.0	1.0
+chr2	124788	0.0	4.0	4.0
+chr2	124789	0.0	7.0	7.0
+chr2	124792	2.0	0.0	2.0
+chr2	124793	1.0	0.0	1.0
+chr2	124795	1.0	0.0	1.0
+chr2	124796	1.0	0.0	1.0
+chr2	124798	0.0	1.0	1.0
+chr2	124800	0.0	2.0	2.0
+chr2	124809	1.0	0.0	1.0
+chr2	124820	0.0	1.0	1.0
+chr2	125051	0.0	1.0	1.0
+chr2	125060	0.0	2.0	2.0
+chr2	125069	0.0	1.0	1.0
+chr2	125073	0.0	2.0	2.0
+chr2	125074	0.0	4.0	4.0
+chr2	125075	1.0	0.0	1.0
+chr2	125080	1.0	0.0	1.0
+chr2	125081	4.0	0.0	4.0
+chr2	125082	0.0	1.0	1.0
+chr2	125086	1.0	4.0	5.0
+chr2	125092	2.0	0.0	2.0
+chr2	125093	0.0	3.0	3.0
+chr2	125095	7.0	0.0	7.0
+chr2	125097	0.0	1.0	1.0
+chr2	125098	0.0	5.0	5.0
+chr2	125099	0.0	10.0	10.0
+chr2	125101	1.0	2.0	3.0
+chr2	125103	1.0	0.0	1.0
+chr2	125106	2.0	0.0	2.0
+chr2	125107	0.0	1.0	1.0
+chr2	125111	3.0	0.0	3.0
+chr2	125112	0.0	1.0	1.0
+chr2	125115	0.0	2.0	2.0
+chr2	125230	0.0	1.0	1.0
+chr2	125244	0.0	1.0	1.0
+chr2	125254	0.0	1.0	1.0
+chr2	125255	1.0	0.0	1.0
+chr2	125286	0.0	1.0	1.0
+chr2	125407	1.0	0.0	1.0
+chr2	125467	0.0	2.0	2.0
+chr2	125665	0.0	2.0	2.0
+chr2	125860	1.0	0.0	1.0
+chr2	125894	1.0	0.0	1.0
+chr2	125902	1.0	0.0	1.0
+chr2	126337	1.0	0.0	1.0
+chr2	126447	0.0	2.0	2.0
+chr2	126481	0.0	1.0	1.0
+chr2	126497	0.0	2.0	2.0
+chr2	126532	1.0	0.0	1.0
+chr2	126571	1.0	0.0	1.0
+chr2	126721	0.0	2.0	2.0
+chr2	126789	1.0	0.0	1.0
+chr2	126933	1.0	0.0	1.0
+chr2	126967	0.0	1.0	1.0
+chr2	126997	0.0	1.0	1.0
+chr2	127142	0.0	1.0	1.0
+chr2	127151	0.0	2.0	2.0
+chr2	127161	4.0	0.0	4.0
+chr2	127185	0.0	1.0	1.0
+chr2	127203	1.0	0.0	1.0
+chr2	127339	1.0	0.0	1.0
+chr2	127343	2.0	0.0	2.0
+chr2	127352	0.0	1.0	1.0
+chr2	127360	2.0	1.0	3.0
+chr2	127444	1.0	0.0	1.0
+chr2	127511	1.0	0.0	1.0
+chr2	127529	1.0	0.0	1.0
+chr2	127569	1.0	0.0	1.0
+chr2	127571	1.0	0.0	1.0
+chr2	127588	0.0	1.0	1.0
+chr2	127883	0.0	1.0	1.0
+chr2	127889	0.0	1.0	1.0
+chr2	127951	1.0	0.0	1.0
+chr2	128077	1.0	0.0	1.0
+chr2	128853	0.0	1.0	1.0
+chr2	129062	0.0	1.0	1.0
+chr2	129070	0.0	1.0	1.0
+chr2	129108	0.0	1.0	1.0
+chr2	129110	1.0	0.0	1.0
+chr2	129294	1.0	0.0	1.0
+chr2	129362	1.0	0.0	1.0
+chr2	129619	1.0	0.0	1.0
+chr2	129622	1.0	0.0	1.0
+chr2	130752	0.0	1.0	1.0
+chr2	131452	1.0	0.0	1.0
+chr2	131551	1.0	0.0	1.0
+chr2	131630	0.0	1.0	1.0
+chr2	131788	0.0	2.0	2.0
+chr2	131949	0.0	1.0	1.0
+chr2	131977	0.0	1.0	1.0
+chr2	131981	0.0	1.0	1.0
+chr2	131992	0.0	1.0	1.0
+chr2	131995	1.0	0.0	1.0
+chr2	132125	1.0	0.0	1.0
+chr2	132136	0.0	1.0	1.0
+chr2	132141	0.0	1.0	1.0
+chr2	132144	1.0	0.0	1.0
+chr2	132145	2.0	0.0	2.0
+chr2	132148	0.0	3.0	3.0
+chr2	132149	1.0	0.0	1.0
+chr2	132158	1.0	0.0	1.0
+chr2	132159	2.0	0.0	2.0
+chr2	132160	0.0	1.0	1.0
+chr2	132161	1.0	0.0	1.0
+chr2	132163	0.0	1.0	1.0
+chr2	132164	0.0	1.0	1.0
+chr2	132165	1.0	0.0	1.0
+chr2	132173	0.0	3.0	3.0
+chr2	132175	0.0	1.0	1.0
+chr2	132178	0.0	1.0	1.0
+chr2	132450	0.0	1.0	1.0
+chr2	132451	1.0	0.0	1.0
+chr2	132453	0.0	1.0	1.0
+chr2	132455	2.0	1.0	3.0
+chr2	132458	0.0	1.0	1.0
+chr2	132459	2.0	0.0	2.0
+chr2	132461	1.0	0.0	1.0
+chr2	132462	2.0	6.0	8.0
+chr2	132468	1.0	0.0	1.0
+chr2	132471	1.0	0.0	1.0
+chr2	132480	0.0	2.0	2.0
+chr2	132484	0.0	1.0	1.0
+chr2	132485	0.0	1.0	1.0
+chr2	132496	1.0	0.0	1.0
+chr2	132499	0.0	2.0	2.0
+chr2	132509	0.0	1.0	1.0
+chr2	132609	1.0	0.0	1.0
+chr2	132626	1.0	0.0	1.0
+chr2	132638	0.0	1.0	1.0
+chr2	132696	0.0	1.0	1.0
+chr2	132793	0.0	3.0	3.0
+chr2	132816	1.0	0.0	1.0
+chr2	133507	3.0	0.0	3.0
+chr2	133560	1.0	0.0	1.0
+chr2	133629	1.0	0.0	1.0
+chr2	134695	0.0	1.0	1.0
+chr2	135172	1.0	0.0	1.0
+chr2	135400	1.0	0.0	1.0
+chr2	135486	0.0	2.0	2.0
+chr2	135487	0.0	1.0	1.0
+chr2	135488	1.0	0.0	1.0
+chr2	135500	1.0	0.0	1.0
+chr2	135629	1.0	0.0	1.0
+chr2	135663	3.0	0.0	3.0
+chr2	135665	1.0	0.0	1.0
+chr2	135667	0.0	1.0	1.0
+chr2	135670	0.0	1.0	1.0
+chr2	135673	0.0	1.0	1.0
+chr2	135674	4.0	0.0	4.0
+chr2	135678	0.0	1.0	1.0
+chr2	135679	1.0	4.0	5.0
+chr2	135682	2.0	0.0	2.0
+chr2	135690	0.0	1.0	1.0
+chr2	135706	1.0	0.0	1.0
+chr2	136091	0.0	1.0	1.0
+chr2	136177	0.0	1.0	1.0
+chr2	136276	1.0	0.0	1.0
+chr2	136305	0.0	1.0	1.0
+chr2	136323	0.0	1.0	1.0
+chr2	136342	1.0	0.0	1.0
+chr2	136347	1.0	0.0	1.0
+chr2	136366	0.0	1.0	1.0
+chr2	136367	0.0	1.0	1.0
+chr2	136368	3.0	0.0	3.0
+chr2	136369	0.0	1.0	1.0
+chr2	136370	0.0	1.0	1.0
+chr2	136382	0.0	1.0	1.0
+chr2	136384	0.0	1.0	1.0
+chr2	136387	2.0	0.0	2.0
+chr2	136388	1.0	2.0	3.0
+chr2	136390	0.0	1.0	1.0
+chr2	136393	0.0	1.0	1.0
+chr2	136395	0.0	1.0	1.0
+chr2	136401	0.0	1.0	1.0
+chr2	136403	0.0	1.0	1.0
+chr2	136404	1.0	0.0	1.0
+chr2	136422	2.0	0.0	2.0
+chr2	136430	1.0	0.0	1.0
+chr2	136527	0.0	1.0	1.0
+chr2	136552	0.0	1.0	1.0
+chr2	136567	1.0	0.0	1.0
+chr2	136573	1.0	0.0	1.0
+chr2	136604	0.0	1.0	1.0
+chr2	136611	0.0	1.0	1.0
+chr2	136686	0.0	1.0	1.0
+chr2	136714	0.0	1.0	1.0
+chr2	136724	1.0	0.0	1.0
+chr2	136729	1.0	0.0	1.0
+chr2	136731	0.0	1.0	1.0
+chr2	136733	0.0	2.0	2.0
+chr2	136734	1.0	1.0	2.0
+chr2	136749	0.0	1.0	1.0
+chr2	136760	0.0	3.0	3.0
+chr2	136765	1.0	0.0	1.0
+chr2	136775	1.0	0.0	1.0
+chr2	136776	3.0	0.0	3.0
+chr2	136798	1.0	0.0	1.0
+chr2	136802	1.0	0.0	1.0
+chr2	136804	1.0	0.0	1.0
+chr2	136875	1.0	0.0	1.0
+chr2	136908	0.0	1.0	1.0
+chr2	136922	1.0	0.0	1.0
+chr2	136934	0.0	1.0	1.0
+chr2	136935	1.0	0.0	1.0
+chr2	136936	1.0	0.0	1.0
+chr2	136937	1.0	0.0	1.0
+chr2	136957	0.0	1.0	1.0
+chr2	137021	0.0	1.0	1.0
+chr2	137057	0.0	1.0	1.0
+chr2	137081	1.0	0.0	1.0
+chr2	137083	0.0	1.0	1.0
+chr2	137105	1.0	0.0	1.0
+chr2	137111	0.0	1.0	1.0
+chr2	137162	0.0	1.0	1.0
+chr2	137165	1.0	0.0	1.0
+chr2	137176	0.0	1.0	1.0
+chr2	137212	3.0	0.0	3.0
+chr2	137216	0.0	2.0	2.0
+chr2	137236	1.0	0.0	1.0
+chr2	137252	0.0	4.0	4.0
+chr2	137260	1.0	0.0	1.0
+chr2	137262	2.0	0.0	2.0
+chr2	137265	3.0	0.0	3.0
+chr2	137301	0.0	1.0	1.0
+chr2	137303	1.0	0.0	1.0
+chr2	137327	1.0	0.0	1.0
+chr2	137348	1.0	0.0	1.0
+chr2	137354	1.0	0.0	1.0
+chr2	137356	0.0	1.0	1.0
+chr2	137362	1.0	0.0	1.0
+chr2	137363	0.0	1.0	1.0
+chr2	137376	1.0	0.0	1.0
+chr2	137379	0.0	3.0	3.0
+chr2	137384	1.0	0.0	1.0
+chr2	137394	1.0	0.0	1.0
+chr2	137395	1.0	0.0	1.0
+chr2	137400	1.0	0.0	1.0
+chr2	137403	1.0	0.0	1.0
+chr2	137416	1.0	0.0	1.0
+chr2	137450	1.0	0.0	1.0
+chr2	137453	0.0	1.0	1.0
+chr2	137457	1.0	0.0	1.0
+chr2	137478	0.0	1.0	1.0
+chr2	137540	0.0	2.0	2.0
+chr2	137548	2.0	1.0	3.0
+chr2	137778	0.0	1.0	1.0
+chr2	137781	0.0	1.0	1.0
+chr2	137782	0.0	1.0	1.0
+chr2	137795	0.0	1.0	1.0
+chr2	137817	0.0	1.0	1.0
+chr2	137886	1.0	0.0	1.0
+chr2	137889	0.0	1.0	1.0
+chr2	137905	0.0	1.0	1.0
+chr2	137921	0.0	1.0	1.0
+chr2	137923	1.0	0.0	1.0
+chr2	137927	1.0	0.0	1.0
+chr2	137928	3.0	0.0	3.0
+chr2	137934	0.0	1.0	1.0
+chr2	137943	0.0	1.0	1.0
+chr2	137945	0.0	1.0	1.0
+chr2	137947	2.0	0.0	2.0
+chr2	137949	0.0	1.0	1.0
+chr2	137969	1.0	0.0	1.0
+chr2	137997	0.0	1.0	1.0
+chr2	138133	0.0	1.0	1.0
+chr2	138136	0.0	1.0	1.0
+chr2	138154	1.0	0.0	1.0
+chr2	138168	0.0	1.0	1.0
+chr2	138413	0.0	1.0	1.0
+chr2	138498	0.0	1.0	1.0
+chr2	138654	1.0	0.0	1.0
+chr2	139256	1.0	0.0	1.0
+chr2	139268	1.0	0.0	1.0
+chr2	139279	0.0	1.0	1.0
+chr2	139309	0.0	1.0	1.0
+chr2	139461	0.0	1.0	1.0
+chr2	139621	0.0	1.0	1.0
+chr2	139785	0.0	1.0	1.0
+chr2	139815	0.0	1.0	1.0
+chr2	139846	1.0	0.0	1.0
+chr2	139900	0.0	1.0	1.0
+chr2	140018	0.0	1.0	1.0
+chr2	140084	0.0	1.0	1.0
+chr2	140162	1.0	1.0	2.0
+chr2	140277	0.0	1.0	1.0
+chr2	140300	1.0	0.0	1.0
+chr2	140313	0.0	2.0	2.0
+chr2	140319	1.0	0.0	1.0
+chr2	140323	1.0	0.0	1.0
+chr2	140329	1.0	0.0	1.0
+chr2	140337	1.0	0.0	1.0
+chr2	140344	0.0	2.0	2.0
+chr2	140902	0.0	1.0	1.0
+chr2	140908	0.0	2.0	2.0
+chr2	140920	1.0	0.0	1.0
+chr2	140934	2.0	0.0	2.0
+chr2	140945	1.0	0.0	1.0
+chr2	140954	1.0	0.0	1.0
+chr2	140964	0.0	2.0	2.0
+chr2	140979	1.0	0.0	1.0
+chr2	140981	1.0	0.0	1.0
+chr2	140995	1.0	0.0	1.0
+chr2	141240	0.0	1.0	1.0
+chr2	141249	1.0	0.0	1.0
+chr2	141254	0.0	2.0	2.0
+chr2	141255	0.0	1.0	1.0
+chr2	141263	2.0	1.0	3.0
+chr2	141268	2.0	0.0	2.0
+chr2	141276	0.0	2.0	2.0
+chr2	141277	0.0	1.0	1.0
+chr2	141281	1.0	0.0	1.0
+chr2	141286	0.0	3.0	3.0
+chr2	141287	0.0	1.0	1.0
+chr2	141288	1.0	0.0	1.0
+chr2	141300	1.0	0.0	1.0
+chr2	141301	0.0	1.0	1.0
+chr2	141347	0.0	1.0	1.0
+chr2	141392	1.0	0.0	1.0
+chr2	141423	0.0	3.0	3.0
+chr2	141424	0.0	1.0	1.0
+chr2	141587	0.0	1.0	1.0
+chr2	142266	0.0	1.0	1.0
+chr2	142361	1.0	0.0	1.0
+chr2	142496	1.0	1.0	2.0
+chr2	142520	0.0	2.0	2.0
+chr2	142521	1.0	1.0	2.0
+chr2	142655	1.0	0.0	1.0
+chr2	142669	0.0	1.0	1.0
+chr2	142671	1.0	0.0	1.0
+chr2	142672	1.0	0.0	1.0
+chr2	142685	0.0	1.0	1.0
+chr2	142691	1.0	0.0	1.0
+chr2	142706	0.0	2.0	2.0
+chr2	142708	0.0	1.0	1.0
+chr2	142808	0.0	1.0	1.0
+chr2	142821	1.0	0.0	1.0
+chr2	142824	1.0	0.0	1.0
+chr2	142828	0.0	1.0	1.0
+chr2	142846	2.0	0.0	2.0
+chr2	142847	1.0	0.0	1.0
+chr2	142853	1.0	0.0	1.0
+chr2	142854	1.0	1.0	2.0
+chr2	142856	1.0	4.0	5.0
+chr2	142858	1.0	0.0	1.0
+chr2	142862	2.0	0.0	2.0
+chr2	142865	1.0	0.0	1.0
+chr2	142866	1.0	0.0	1.0
+chr2	142870	1.0	0.0	1.0
+chr2	142874	0.0	1.0	1.0
+chr2	142875	0.0	1.0	1.0
+chr2	142886	0.0	1.0	1.0
+chr2	142943	1.0	0.0	1.0
+chr2	143032	0.0	1.0	1.0
+chr2	143039	0.0	1.0	1.0
+chr2	143054	1.0	0.0	1.0
+chr2	143073	1.0	0.0	1.0
+chr2	143075	0.0	5.0	5.0
+chr2	143093	0.0	1.0	1.0
+chr2	143128	1.0	0.0	1.0
+chr2	143147	1.0	0.0	1.0
+chr2	143150	0.0	1.0	1.0
+chr2	143152	0.0	1.0	1.0
+chr2	143153	0.0	2.0	2.0
+chr2	143161	0.0	1.0	1.0
+chr2	143192	1.0	0.0	1.0
+chr2	143198	1.0	0.0	1.0
+chr2	143327	1.0	0.0	1.0
+chr2	143349	1.0	0.0	1.0
+chr2	143409	0.0	1.0	1.0
+chr2	143515	2.0	0.0	2.0
+chr2	144516	0.0	1.0	1.0
+chr2	144572	0.0	1.0	1.0
+chr2	145092	0.0	1.0	1.0
+chr2	145143	1.0	0.0	1.0
+chr2	145257	0.0	1.0	1.0
+chr2	145371	1.0	0.0	1.0
+chr2	145432	1.0	0.0	1.0
+chr2	145446	0.0	1.0	1.0
+chr2	145574	0.0	1.0	1.0
+chr2	145602	0.0	3.0	3.0
+chr2	145611	1.0	1.0	2.0
+chr2	145701	1.0	0.0	1.0
+chr2	145729	0.0	1.0	1.0
+chr2	145731	1.0	0.0	1.0
+chr2	145758	0.0	2.0	2.0
+chr2	145759	1.0	0.0	1.0
+chr2	145760	0.0	1.0	1.0
+chr2	145766	2.0	0.0	2.0
+chr2	145773	1.0	0.0	1.0
+chr2	145774	1.0	0.0	1.0
+chr2	145778	0.0	1.0	1.0
+chr2	146126	0.0	1.0	1.0
+chr2	146137	0.0	1.0	1.0
+chr2	146141	0.0	2.0	2.0
+chr2	146143	0.0	1.0	1.0
+chr2	146145	1.0	0.0	1.0
+chr2	146150	0.0	1.0	1.0
+chr2	146151	3.0	0.0	3.0
+chr2	146152	0.0	1.0	1.0
+chr2	146153	3.0	0.0	3.0
+chr2	146159	1.0	0.0	1.0
+chr2	146160	1.0	0.0	1.0
+chr2	146163	1.0	0.0	1.0
+chr2	146167	0.0	1.0	1.0
+chr2	146168	0.0	1.0	1.0
+chr2	146173	1.0	0.0	1.0
+chr2	146178	0.0	1.0	1.0
+chr2	146179	1.0	0.0	1.0
+chr2	146194	0.0	1.0	1.0
+chr2	146276	1.0	0.0	1.0
+chr2	146322	1.0	0.0	1.0
+chr2	146325	0.0	3.0	3.0
+chr2	146332	0.0	1.0	1.0
+chr2	146451	0.0	1.0	1.0
+chr2	146896	0.0	1.0	1.0
+chr2	146902	0.0	1.0	1.0
+chr2	146903	1.0	0.0	1.0
+chr2	146909	1.0	0.0	1.0
+chr2	147091	1.0	0.0	1.0
+chr2	147114	0.0	1.0	1.0
+chr2	147132	0.0	1.0	1.0
+chr2	147143	1.0	0.0	1.0
+chr2	147152	2.0	0.0	2.0
+chr2	147154	0.0	1.0	1.0
+chr2	147155	1.0	0.0	1.0
+chr2	147158	0.0	4.0	4.0
+chr2	147168	0.0	1.0	1.0
+chr2	147169	1.0	0.0	1.0
+chr2	147171	3.0	1.0	4.0
+chr2	147173	1.0	0.0	1.0
+chr2	147175	1.0	0.0	1.0
+chr2	147177	1.0	0.0	1.0
+chr2	147182	2.0	0.0	2.0
+chr2	147185	1.0	0.0	1.0
+chr2	147186	3.0	0.0	3.0
+chr2	147281	1.0	0.0	1.0
+chr2	147308	1.0	0.0	1.0
+chr2	147315	1.0	0.0	1.0
+chr2	147331	1.0	0.0	1.0
+chr2	147335	0.0	1.0	1.0
+chr2	147349	1.0	0.0	1.0
+chr2	147362	1.0	0.0	1.0
+chr2	147463	1.0	0.0	1.0
+chr2	147537	1.0	0.0	1.0
+chr2	147681	1.0	0.0	1.0
+chr2	147684	0.0	1.0	1.0
+chr2	147953	0.0	1.0	1.0
+chr2	148149	1.0	0.0	1.0
+chr2	148249	0.0	1.0	1.0
+chr2	148585	1.0	0.0	1.0
+chr2	148939	1.0	0.0	1.0
+chr2	148947	0.0	1.0	1.0
+chr2	149019	1.0	0.0	1.0
+chr2	149042	0.0	1.0	1.0
+chr2	149200	0.0	1.0	1.0
+chr2	149266	0.0	1.0	1.0
+chr2	149791	0.0	1.0	1.0
+chr2	149890	0.0	1.0	1.0
+chr2	150013	0.0	1.0	1.0
+chr2	150167	1.0	0.0	1.0
+chr2	150218	1.0	0.0	1.0
+chr2	150527	1.0	0.0	1.0
+chr2	150607	1.0	0.0	1.0
+chr2	150801	1.0	0.0	1.0
+chr2	150872	1.0	0.0	1.0
+chr2	151002	1.0	0.0	1.0
+chr2	151013	2.0	0.0	2.0
+chr2	151067	0.0	1.0	1.0
+chr2	151161	0.0	2.0	2.0
+chr2	151169	0.0	1.0	1.0
+chr2	151175	1.0	0.0	1.0
+chr2	151179	1.0	3.0	4.0
+chr2	151186	0.0	1.0	1.0
+chr2	151187	0.0	1.0	1.0
+chr2	151195	1.0	0.0	1.0
+chr2	151196	1.0	0.0	1.0
+chr2	151199	0.0	1.0	1.0
+chr2	151203	1.0	2.0	3.0
+chr2	151205	0.0	1.0	1.0
+chr2	151207	1.0	1.0	2.0
+chr2	151218	1.0	0.0	1.0
+chr2	151475	2.0	0.0	2.0
+chr2	151476	5.0	0.0	5.0
+chr2	151478	1.0	0.0	1.0
+chr2	151481	0.0	1.0	1.0
+chr2	151482	1.0	0.0	1.0
+chr2	151483	0.0	1.0	1.0
+chr2	151489	0.0	2.0	2.0
+chr2	151492	0.0	2.0	2.0
+chr2	151502	0.0	2.0	2.0
+chr2	151510	5.0	0.0	5.0
+chr2	151513	0.0	2.0	2.0
+chr2	151514	1.0	0.0	1.0
+chr2	151516	2.0	0.0	2.0
+chr2	151522	1.0	0.0	1.0
+chr2	151561	1.0	0.0	1.0
+chr2	151570	0.0	1.0	1.0
+chr2	151575	1.0	0.0	1.0
+chr2	151661	0.0	1.0	1.0
+chr2	151669	0.0	2.0	2.0
+chr2	152103	0.0	1.0	1.0
+chr2	152113	0.0	1.0	1.0
+chr2	152195	1.0	0.0	1.0
+chr2	152251	1.0	0.0	1.0
+chr2	152469	1.0	0.0	1.0
+chr2	152479	0.0	1.0	1.0
+chr2	152546	0.0	1.0	1.0
+chr2	152587	0.0	1.0	1.0
+chr2	152631	0.0	1.0	1.0
+chr2	152650	1.0	0.0	1.0
+chr2	152656	0.0	1.0	1.0
+chr2	152768	1.0	0.0	1.0
+chr2	152861	1.0	0.0	1.0
+chr2	152997	1.0	0.0	1.0
+chr2	153141	1.0	0.0	1.0
+chr2	153185	0.0	1.0	1.0
+chr2	153298	1.0	0.0	1.0
+chr2	153320	0.0	2.0	2.0
+chr2	153348	1.0	0.0	1.0
+chr2	153459	1.0	0.0	1.0
+chr2	153490	2.0	0.0	2.0
+chr2	153495	1.0	0.0	1.0
+chr2	153496	1.0	0.0	1.0
+chr2	153497	1.0	0.0	1.0
+chr2	153508	0.0	2.0	2.0
+chr2	153509	0.0	2.0	2.0
+chr2	153511	1.0	0.0	1.0
+chr2	153541	1.0	0.0	1.0
+chr2	153627	0.0	1.0	1.0
+chr2	153646	1.0	0.0	1.0
+chr2	153673	0.0	1.0	1.0
+chr2	153780	0.0	1.0	1.0
+chr2	153947	0.0	1.0	1.0
+chr2	153959	1.0	0.0	1.0
+chr2	153962	0.0	1.0	1.0
+chr2	153968	1.0	0.0	1.0
+chr2	153979	1.0	0.0	1.0
+chr2	153981	0.0	1.0	1.0
+chr2	153986	1.0	0.0	1.0
+chr2	153990	0.0	1.0	1.0
+chr2	153999	1.0	0.0	1.0
+chr2	154011	1.0	0.0	1.0
+chr2	154136	0.0	1.0	1.0
+chr2	154142	0.0	1.0	1.0
+chr2	154334	0.0	1.0	1.0
+chr2	154508	1.0	0.0	1.0
+chr2	155380	0.0	1.0	1.0
+chr2	155552	1.0	0.0	1.0
+chr2	155594	0.0	1.0	1.0
+chr2	156062	1.0	0.0	1.0
+chr2	156127	1.0	0.0	1.0
+chr2	156306	0.0	3.0	3.0
+chr2	157152	1.0	0.0	1.0
+chr2	157233	1.0	0.0	1.0
+chr2	157439	0.0	1.0	1.0
+chr2	158066	1.0	0.0	1.0
+chr2	158074	1.0	0.0	1.0
+chr2	158075	1.0	0.0	1.0
+chr2	158078	1.0	0.0	1.0
+chr2	158096	0.0	1.0	1.0
+chr2	158102	1.0	0.0	1.0
+chr2	158139	2.0	0.0	2.0
+chr2	158198	0.0	1.0	1.0
+chr2	158226	4.0	0.0	4.0
+chr2	158246	0.0	1.0	1.0
+chr2	158249	0.0	1.0	1.0
+chr2	158250	6.0	0.0	6.0
+chr2	158259	0.0	1.0	1.0
+chr2	158266	0.0	2.0	2.0
+chr2	158270	1.0	0.0	1.0
+chr2	158271	1.0	0.0	1.0
+chr2	158272	0.0	1.0	1.0
+chr2	158274	0.0	1.0	1.0
+chr2	158281	1.0	0.0	1.0
+chr2	158323	1.0	0.0	1.0
+chr2	158386	1.0	0.0	1.0
+chr2	158407	1.0	2.0	3.0
+chr2	158409	0.0	3.0	3.0
+chr2	158410	1.0	2.0	3.0
+chr2	158412	1.0	0.0	1.0
+chr2	158414	0.0	1.0	1.0
+chr2	158415	1.0	0.0	1.0
+chr2	158416	1.0	1.0	2.0
+chr2	158423	1.0	0.0	1.0
+chr2	158424	6.0	0.0	6.0
+chr2	158429	1.0	0.0	1.0
+chr2	158431	1.0	0.0	1.0
+chr2	158434	0.0	1.0	1.0
+chr2	158435	0.0	3.0	3.0
+chr2	158441	2.0	0.0	2.0
+chr2	158446	2.0	0.0	2.0
+chr2	158450	1.0	0.0	1.0
+chr2	158452	1.0	0.0	1.0
+chr2	158677	1.0	0.0	1.0
+chr2	158686	0.0	1.0	1.0
+chr2	158694	0.0	1.0	1.0
+chr2	158696	0.0	1.0	1.0
+chr2	158704	0.0	1.0	1.0
+chr2	158707	1.0	0.0	1.0
+chr2	158710	0.0	3.0	3.0
+chr2	158711	0.0	2.0	2.0
+chr2	158714	0.0	1.0	1.0
+chr2	158717	5.0	0.0	5.0
+chr2	158718	3.0	5.0	8.0
+chr2	158722	0.0	1.0	1.0
+chr2	158727	1.0	0.0	1.0
+chr2	158729	0.0	3.0	3.0
+chr2	158731	0.0	1.0	1.0
+chr2	158733	0.0	7.0	7.0
+chr2	158734	0.0	1.0	1.0
+chr2	158736	2.0	0.0	2.0
+chr2	158737	1.0	0.0	1.0
+chr2	158738	1.0	0.0	1.0
+chr2	158739	0.0	1.0	1.0
+chr2	158749	1.0	0.0	1.0
+chr2	158865	1.0	0.0	1.0
+chr2	158868	1.0	0.0	1.0
+chr2	158881	1.0	0.0	1.0
+chr2	158990	1.0	0.0	1.0
+chr2	159005	1.0	0.0	1.0
+chr2	159048	1.0	0.0	1.0
+chr2	159074	1.0	0.0	1.0
+chr2	159179	0.0	2.0	2.0
+chr2	159330	1.0	0.0	1.0
+chr2	159428	1.0	0.0	1.0
+chr2	159507	1.0	0.0	1.0
+chr2	159509	1.0	0.0	1.0
+chr2	159510	1.0	0.0	1.0
+chr2	159646	1.0	0.0	1.0
+chr2	159662	1.0	0.0	1.0
+chr2	159663	0.0	2.0	2.0
+chr2	159672	3.0	1.0	4.0
+chr2	159674	1.0	0.0	1.0
+chr2	159696	0.0	1.0	1.0
+chr2	159702	0.0	1.0	1.0
+chr2	160108	0.0	1.0	1.0
+chr2	160123	0.0	1.0	1.0
+chr2	160130	0.0	1.0	1.0
+chr2	160138	2.0	0.0	2.0
+chr2	160140	1.0	0.0	1.0
+chr2	160143	1.0	0.0	1.0
+chr2	160144	1.0	0.0	1.0
+chr2	160149	1.0	4.0	5.0
+chr2	160150	0.0	1.0	1.0
+chr2	160151	0.0	1.0	1.0
+chr2	160154	2.0	0.0	2.0
+chr2	160155	2.0	0.0	2.0
+chr2	160156	0.0	7.0	7.0
+chr2	160158	0.0	4.0	4.0
+chr2	160162	1.0	6.0	7.0
+chr2	160163	1.0	3.0	4.0
+chr2	160164	1.0	0.0	1.0
+chr2	160165	3.0	0.0	3.0
+chr2	160172	2.0	0.0	2.0
+chr2	160177	0.0	1.0	1.0
+chr2	160180	0.0	1.0	1.0
+chr2	160310	2.0	0.0	2.0
+chr2	160311	1.0	0.0	1.0
+chr2	160315	1.0	0.0	1.0
+chr2	160319	0.0	4.0	4.0
+chr2	160492	0.0	2.0	2.0
+chr2	160496	1.0	0.0	1.0
+chr2	160639	1.0	0.0	1.0
+chr2	160663	1.0	0.0	1.0
+chr2	160675	1.0	0.0	1.0
+chr2	160689	1.0	0.0	1.0
+chr2	160786	0.0	1.0	1.0
+chr2	160798	1.0	0.0	1.0
+chr2	160945	0.0	1.0	1.0
+chr2	160959	1.0	0.0	1.0
+chr2	160975	1.0	0.0	1.0
+chr2	161263	1.0	0.0	1.0
+chr2	161278	1.0	0.0	1.0
+chr2	161294	1.0	0.0	1.0
+chr2	161411	1.0	0.0	1.0
+chr2	161414	1.0	0.0	1.0
+chr2	161708	0.0	1.0	1.0
+chr2	161709	0.0	2.0	2.0
+chr2	161711	1.0	0.0	1.0
+chr2	161716	0.0	3.0	3.0
+chr2	161719	1.0	0.0	1.0
+chr2	161720	1.0	2.0	3.0
+chr2	161724	1.0	0.0	1.0
+chr2	161725	4.0	3.0	7.0
+chr2	161726	4.0	1.0	5.0
+chr2	161727	0.0	1.0	1.0
+chr2	161728	4.0	0.0	4.0
+chr2	161730	1.0	0.0	1.0
+chr2	161731	0.0	1.0	1.0
+chr2	161732	1.0	2.0	3.0
+chr2	161735	6.0	0.0	6.0
+chr2	161737	0.0	1.0	1.0
+chr2	161739	0.0	1.0	1.0
+chr2	161892	0.0	1.0	1.0
+chr2	161899	0.0	1.0	1.0
+chr2	161900	1.0	0.0	1.0
+chr2	162046	1.0	0.0	1.0
+chr2	162049	1.0	0.0	1.0
+chr2	162077	0.0	1.0	1.0
+chr2	162093	0.0	1.0	1.0
+chr2	162255	0.0	1.0	1.0
+chr2	162261	1.0	0.0	1.0
+chr2	162426	1.0	0.0	1.0
+chr2	162440	2.0	0.0	2.0
+chr2	162453	0.0	1.0	1.0
+chr2	162507	0.0	1.0	1.0
+chr2	162570	1.0	0.0	1.0
+chr2	162586	0.0	1.0	1.0
+chr2	162607	1.0	0.0	1.0
+chr2	162651	0.0	1.0	1.0
+chr2	162668	0.0	1.0	1.0
+chr2	163210	1.0	0.0	1.0
+chr2	163231	0.0	1.0	1.0
+chr2	163292	1.0	0.0	1.0
+chr2	163437	0.0	1.0	1.0
+chr2	163464	4.0	0.0	4.0
+chr2	163613	0.0	1.0	1.0
+chr2	163661	1.0	0.0	1.0
+chr2	163686	1.0	0.0	1.0
+chr2	163842	0.0	1.0	1.0
+chr2	163843	0.0	2.0	2.0
+chr2	163848	0.0	1.0	1.0
+chr2	163969	2.0	0.0	2.0
+chr2	164006	1.0	0.0	1.0
+chr2	164042	0.0	1.0	1.0
+chr2	164100	0.0	1.0	1.0
+chr2	164103	0.0	1.0	1.0
+chr2	164177	0.0	1.0	1.0
+chr2	164195	0.0	2.0	2.0
+chr2	164233	0.0	1.0	1.0
+chr2	164241	0.0	1.0	1.0
+chr2	164263	0.0	1.0	1.0
+chr2	164281	3.0	0.0	3.0
+chr2	164506	2.0	0.0	2.0
+chr2	164508	1.0	0.0	1.0
+chr2	164511	3.0	0.0	3.0
+chr2	164521	0.0	1.0	1.0
+chr2	164527	0.0	1.0	1.0
+chr2	164534	1.0	1.0	2.0
+chr2	164535	1.0	0.0	1.0
+chr2	164536	1.0	1.0	2.0
+chr2	164538	1.0	0.0	1.0
+chr2	164548	0.0	1.0	1.0
+chr2	164553	0.0	1.0	1.0
+chr2	164616	1.0	0.0	1.0
+chr2	164665	0.0	1.0	1.0
+chr2	164695	1.0	0.0	1.0
+chr2	164705	1.0	1.0	2.0
+chr2	164812	0.0	1.0	1.0
+chr2	164840	0.0	1.0	1.0
+chr2	164841	0.0	1.0	1.0
+chr2	164852	0.0	1.0	1.0
+chr2	164856	0.0	1.0	1.0
+chr2	164859	1.0	0.0	1.0
+chr2	164863	0.0	1.0	1.0
+chr2	164864	1.0	0.0	1.0
+chr2	164874	0.0	2.0	2.0
+chr2	164875	0.0	1.0	1.0
+chr2	164878	2.0	0.0	2.0
+chr2	164883	1.0	0.0	1.0
+chr2	164888	0.0	1.0	1.0
+chr2	164890	0.0	1.0	1.0
+chr2	164891	1.0	0.0	1.0
+chr2	164901	1.0	0.0	1.0
+chr2	165519	1.0	1.0	2.0
+chr2	165520	1.0	0.0	1.0
+chr2	165578	0.0	1.0	1.0
+chr2	165677	0.0	1.0	1.0
+chr2	165776	0.0	1.0	1.0
+chr2	165778	0.0	1.0	1.0
+chr2	165788	1.0	0.0	1.0
+chr2	165793	0.0	1.0	1.0
+chr2	165794	0.0	1.0	1.0
+chr2	165812	0.0	1.0	1.0
+chr2	165823	1.0	0.0	1.0
+chr2	166023	1.0	0.0	1.0
+chr2	166030	0.0	1.0	1.0
+chr2	166184	0.0	1.0	1.0
+chr2	166235	0.0	1.0	1.0
+chr2	166260	1.0	0.0	1.0
+chr2	166264	0.0	1.0	1.0
+chr2	166283	0.0	1.0	1.0
+chr2	166307	0.0	1.0	1.0
+chr2	166474	1.0	0.0	1.0
+chr2	166528	0.0	1.0	1.0
+chr2	166562	1.0	1.0	2.0
+chr2	166564	0.0	1.0	1.0
+chr2	166582	0.0	1.0	1.0
+chr2	166603	0.0	1.0	1.0
+chr2	166627	0.0	1.0	1.0
+chr2	166692	1.0	0.0	1.0
+chr2	166699	1.0	0.0	1.0
+chr2	166700	0.0	1.0	1.0
+chr2	166731	0.0	2.0	2.0
+chr2	166741	1.0	0.0	1.0
+chr2	166744	1.0	1.0	2.0
+chr2	166764	1.0	0.0	1.0
+chr2	166769	0.0	1.0	1.0
+chr2	166830	0.0	1.0	1.0
+chr2	166838	1.0	0.0	1.0
+chr2	166887	0.0	1.0	1.0
+chr2	166898	0.0	1.0	1.0
+chr2	166907	0.0	1.0	1.0
+chr2	166908	0.0	2.0	2.0
+chr2	166927	1.0	0.0	1.0
+chr2	166930	0.0	4.0	4.0
+chr2	166931	0.0	1.0	1.0
+chr2	166946	0.0	2.0	2.0
+chr2	166957	0.0	1.0	1.0
+chr2	166966	1.0	0.0	1.0
+chr2	167014	0.0	1.0	1.0
+chr2	167073	1.0	0.0	1.0
+chr2	167094	0.0	2.0	2.0
+chr2	167170	0.0	1.0	1.0
+chr2	167173	1.0	0.0	1.0
+chr2	167179	0.0	1.0	1.0
+chr2	167188	0.0	1.0	1.0
+chr2	167190	3.0	0.0	3.0
+chr2	167193	0.0	1.0	1.0
+chr2	167195	1.0	0.0	1.0
+chr2	167206	0.0	1.0	1.0
+chr2	167207	0.0	1.0	1.0
+chr2	167656	0.0	2.0	2.0
+chr2	167823	1.0	0.0	1.0
+chr2	167824	0.0	1.0	1.0
+chr2	167825	1.0	0.0	1.0
+chr2	167827	0.0	1.0	1.0
+chr2	167833	0.0	1.0	1.0
+chr2	167846	0.0	1.0	1.0
+chr2	167847	0.0	1.0	1.0
+chr2	167850	0.0	1.0	1.0
+chr2	167851	1.0	0.0	1.0
+chr2	168895	1.0	0.0	1.0
+chr2	168964	1.0	0.0	1.0
+chr2	168981	1.0	0.0	1.0
+chr2	169051	1.0	0.0	1.0
+chr2	169123	0.0	1.0	1.0
+chr2	169178	1.0	0.0	1.0
+chr2	169186	1.0	0.0	1.0
+chr2	169225	0.0	1.0	1.0
+chr2	169579	0.0	2.0	2.0
+chr2	169667	1.0	0.0	1.0
+chr2	169692	1.0	0.0	1.0
+chr2	169740	0.0	2.0	2.0
+chr2	169799	1.0	0.0	1.0
+chr2	169800	1.0	0.0	1.0
+chr2	169808	0.0	2.0	2.0
+chr2	169827	0.0	1.0	1.0
+chr2	169862	0.0	1.0	1.0
+chr2	169864	0.0	2.0	2.0
+chr2	169868	0.0	1.0	1.0
+chr2	169872	1.0	0.0	1.0
+chr2	169881	0.0	1.0	1.0
+chr2	169882	1.0	0.0	1.0
+chr2	169885	0.0	1.0	1.0
+chr2	169887	3.0	0.0	3.0
+chr2	169888	1.0	0.0	1.0
+chr2	169890	2.0	0.0	2.0
+chr2	169892	1.0	0.0	1.0
+chr2	169894	0.0	1.0	1.0
+chr2	169900	1.0	0.0	1.0
+chr2	169901	0.0	2.0	2.0
+chr2	169918	4.0	0.0	4.0
+chr2	169926	0.0	1.0	1.0
+chr2	169957	1.0	0.0	1.0
+chr2	169964	1.0	0.0	1.0
+chr2	170129	0.0	2.0	2.0
+chr2	170143	0.0	1.0	1.0
+chr2	170206	0.0	1.0	1.0
+chr2	170355	1.0	0.0	1.0
+chr2	170356	1.0	0.0	1.0
+chr2	170357	1.0	0.0	1.0
+chr2	170395	0.0	1.0	1.0
+chr2	170397	1.0	0.0	1.0
+chr2	170602	0.0	1.0	1.0
+chr2	170603	0.0	1.0	1.0
+chr2	170608	0.0	2.0	2.0
+chr2	170615	0.0	1.0	1.0
+chr2	170616	0.0	2.0	2.0
+chr2	170617	2.0	1.0	3.0
+chr2	170620	4.0	0.0	4.0
+chr2	170626	1.0	0.0	1.0
+chr2	170632	0.0	1.0	1.0
+chr2	170633	0.0	1.0	1.0
+chr2	170639	1.0	1.0	2.0
+chr2	170647	1.0	0.0	1.0
+chr2	170650	1.0	0.0	1.0
+chr2	170741	0.0	1.0	1.0
+chr2	170745	0.0	2.0	2.0
+chr2	170761	0.0	1.0	1.0
+chr2	170776	0.0	1.0	1.0
+chr2	170781	0.0	1.0	1.0
+chr2	170799	0.0	2.0	2.0
+chr2	170810	2.0	0.0	2.0
+chr2	170933	1.0	0.0	1.0
+chr2	170970	0.0	1.0	1.0
+chr2	171207	1.0	0.0	1.0
+chr2	171211	3.0	0.0	3.0
+chr2	171213	0.0	1.0	1.0
+chr2	171219	1.0	0.0	1.0
+chr2	171221	0.0	1.0	1.0
+chr2	171222	1.0	0.0	1.0
+chr2	171226	3.0	0.0	3.0
+chr2	171229	0.0	1.0	1.0
+chr2	171232	0.0	2.0	2.0
+chr2	171233	0.0	1.0	1.0
+chr2	171246	1.0	0.0	1.0
+chr2	171261	1.0	0.0	1.0
+chr2	171454	0.0	1.0	1.0
+chr2	171466	0.0	1.0	1.0
+chr2	171472	2.0	0.0	2.0
+chr2	171474	2.0	0.0	2.0
+chr2	171482	1.0	0.0	1.0
+chr2	171484	0.0	1.0	1.0
+chr2	171496	0.0	1.0	1.0
+chr2	171506	1.0	0.0	1.0
+chr2	171613	0.0	1.0	1.0
+chr2	171627	0.0	1.0	1.0
+chr2	171631	2.0	0.0	2.0
+chr2	171645	0.0	1.0	1.0
+chr2	171649	0.0	3.0	3.0
+chr2	171650	0.0	1.0	1.0
+chr2	171671	0.0	1.0	1.0
+chr2	171676	1.0	0.0	1.0
+chr2	171819	1.0	0.0	1.0
+chr2	171828	1.0	0.0	1.0
+chr2	171840	0.0	1.0	1.0
+chr2	171898	0.0	1.0	1.0
+chr2	172053	1.0	0.0	1.0
+chr2	172090	1.0	0.0	1.0
+chr2	172206	0.0	1.0	1.0
+chr2	172211	0.0	1.0	1.0
+chr2	172214	1.0	0.0	1.0
+chr2	172227	0.0	1.0	1.0
+chr2	172234	1.0	0.0	1.0
+chr2	172247	0.0	1.0	1.0
+chr2	172270	2.0	0.0	2.0
+chr2	172515	1.0	0.0	1.0
+chr2	172519	0.0	1.0	1.0
+chr2	172522	1.0	0.0	1.0
+chr2	172524	0.0	1.0	1.0
+chr2	172527	0.0	1.0	1.0
+chr2	172532	0.0	1.0	1.0
+chr2	172533	1.0	0.0	1.0
+chr2	172534	0.0	1.0	1.0
+chr2	172535	1.0	0.0	1.0
+chr2	172538	1.0	0.0	1.0
+chr2	172539	2.0	1.0	3.0
+chr2	172540	1.0	1.0	2.0
+chr2	172546	1.0	0.0	1.0
+chr2	172547	1.0	1.0	2.0
+chr2	172548	2.0	0.0	2.0
+chr2	172552	0.0	1.0	1.0
+chr2	172554	1.0	0.0	1.0
+chr2	172555	0.0	2.0	2.0
+chr2	172556	0.0	1.0	1.0
+chr2	172557	1.0	0.0	1.0
+chr2	172563	1.0	0.0	1.0
+chr2	172566	1.0	0.0	1.0
+chr2	172574	1.0	0.0	1.0
+chr2	172629	1.0	0.0	1.0
+chr2	172664	0.0	1.0	1.0
+chr2	172700	0.0	1.0	1.0
+chr2	172704	1.0	0.0	1.0
+chr2	172705	0.0	1.0	1.0
+chr2	172769	1.0	0.0	1.0
+chr2	172836	0.0	1.0	1.0
+chr2	172861	0.0	1.0	1.0
+chr2	173119	0.0	1.0	1.0
+chr2	173890	1.0	0.0	1.0
+chr2	174561	0.0	1.0	1.0
+chr2	174630	0.0	1.0	1.0
+chr2	175150	0.0	1.0	1.0
+chr2	175242	0.0	1.0	1.0
+chr2	175291	0.0	1.0	1.0
+chr2	175328	0.0	1.0	1.0
+chr2	175482	0.0	3.0	3.0
+chr2	175553	1.0	0.0	1.0
+chr2	175874	0.0	1.0	1.0
+chr2	175930	1.0	0.0	1.0
+chr2	175932	0.0	2.0	2.0
+chr2	176160	0.0	1.0	1.0
+chr2	176378	1.0	0.0	1.0
+chr2	176394	1.0	0.0	1.0
+chr2	176516	0.0	2.0	2.0
+chr2	177024	0.0	1.0	1.0
+chr2	177186	0.0	1.0	1.0
+chr2	177265	0.0	1.0	1.0
+chr2	177369	0.0	3.0	3.0
+chr2	177388	1.0	0.0	1.0
+chr2	177391	1.0	0.0	1.0
+chr2	177398	1.0	0.0	1.0
+chr2	177403	0.0	1.0	1.0
+chr2	177406	1.0	0.0	1.0
+chr2	177415	0.0	1.0	1.0
+chr2	177418	0.0	1.0	1.0
+chr2	177442	1.0	0.0	1.0
+chr2	177523	3.0	0.0	3.0
+chr2	177543	0.0	1.0	1.0
+chr2	177545	0.0	1.0	1.0
+chr2	177555	0.0	1.0	1.0
+chr2	177595	1.0	0.0	1.0
+chr2	177609	1.0	0.0	1.0
+chr2	177626	1.0	0.0	1.0
+chr2	177994	1.0	0.0	1.0
+chr2	178207	0.0	1.0	1.0
+chr2	178516	0.0	2.0	2.0
+chr2	180264	0.0	1.0	1.0
+chr2	180366	1.0	0.0	1.0
+chr2	180405	1.0	0.0	1.0
+chr2	180532	0.0	1.0	1.0
+chr2	180540	1.0	0.0	1.0
+chr2	180559	1.0	0.0	1.0
+chr2	181003	0.0	1.0	1.0
+chr2	181018	1.0	0.0	1.0
+chr2	181029	0.0	1.0	1.0
+chr2	181195	0.0	1.0	1.0
+chr2	181204	0.0	1.0	1.0
+chr2	181210	0.0	1.0	1.0
+chr2	181350	1.0	0.0	1.0
+chr2	181351	4.0	0.0	4.0
+chr2	181355	0.0	2.0	2.0
+chr2	181356	1.0	0.0	1.0
+chr2	181359	2.0	0.0	2.0
+chr2	181362	0.0	1.0	1.0
+chr2	181363	2.0	0.0	2.0
+chr2	181364	1.0	0.0	1.0
+chr2	181366	1.0	1.0	2.0
+chr2	181367	0.0	3.0	3.0
+chr2	181368	0.0	1.0	1.0
+chr2	181371	3.0	0.0	3.0
+chr2	181380	0.0	3.0	3.0
+chr2	181381	0.0	2.0	2.0
+chr2	181384	0.0	1.0	1.0
+chr2	181385	0.0	2.0	2.0
+chr2	181392	0.0	1.0	1.0
+chr2	181424	1.0	0.0	1.0
+chr2	181615	0.0	1.0	1.0
+chr2	181617	0.0	1.0	1.0
+chr2	181644	1.0	0.0	1.0
+chr2	181652	1.0	0.0	1.0
+chr2	181911	1.0	0.0	1.0
+chr2	181917	0.0	1.0	1.0
+chr2	181928	1.0	0.0	1.0
+chr2	181957	0.0	1.0	1.0
+chr2	182024	0.0	1.0	1.0
+chr2	182056	0.0	2.0	2.0
+chr2	182058	1.0	0.0	1.0
+chr2	182063	1.0	0.0	1.0
+chr2	182066	3.0	3.0	6.0
+chr2	182067	3.0	0.0	3.0
+chr2	182071	1.0	0.0	1.0
+chr2	182076	0.0	4.0	4.0
+chr2	182079	1.0	0.0	1.0
+chr2	182081	0.0	1.0	1.0
+chr2	182085	0.0	1.0	1.0
+chr2	182087	1.0	0.0	1.0
+chr2	182098	0.0	1.0	1.0
+chr2	182281	0.0	2.0	2.0
+chr2	182343	2.0	0.0	2.0
+chr2	182344	0.0	1.0	1.0
+chr2	182345	1.0	0.0	1.0
+chr2	182350	0.0	1.0	1.0
+chr2	182357	1.0	0.0	1.0
+chr2	182360	0.0	1.0	1.0
+chr2	182363	0.0	1.0	1.0
+chr2	182364	0.0	1.0	1.0
+chr2	182368	0.0	1.0	1.0
+chr2	182371	0.0	1.0	1.0
+chr2	182376	0.0	1.0	1.0
+chr2	182512	1.0	0.0	1.0
+chr2	182528	3.0	0.0	3.0
+chr2	182550	0.0	1.0	1.0
+chr2	182673	0.0	2.0	2.0
+chr2	182712	1.0	0.0	1.0
+chr2	182716	0.0	1.0	1.0
+chr2	182903	0.0	1.0	1.0
+chr2	183003	1.0	0.0	1.0
+chr2	183025	0.0	1.0	1.0
+chr2	183029	1.0	0.0	1.0
+chr2	183040	0.0	1.0	1.0
+chr2	183064	1.0	0.0	1.0
+chr2	183228	1.0	0.0	1.0
+chr2	183709	1.0	0.0	1.0
+chr2	183825	1.0	0.0	1.0
+chr2	183977	1.0	0.0	1.0
+chr2	184337	0.0	1.0	1.0
+chr2	184340	1.0	0.0	1.0
+chr2	184345	0.0	2.0	2.0
+chr2	184349	1.0	0.0	1.0
+chr2	184353	0.0	1.0	1.0
+chr2	184354	1.0	0.0	1.0
+chr2	184356	0.0	1.0	1.0
+chr2	184360	0.0	2.0	2.0
+chr2	184361	0.0	1.0	1.0
+chr2	184365	1.0	0.0	1.0
+chr2	184368	1.0	0.0	1.0
+chr2	184369	1.0	0.0	1.0
+chr2	184370	0.0	1.0	1.0
+chr2	184372	0.0	1.0	1.0
+chr2	184374	0.0	1.0	1.0
+chr2	184377	0.0	1.0	1.0
+chr2	184378	1.0	0.0	1.0
+chr2	184379	0.0	1.0	1.0
+chr2	184388	0.0	2.0	2.0
+chr2	184392	1.0	0.0	1.0
+chr2	184417	1.0	0.0	1.0
+chr2	184516	0.0	1.0	1.0
+chr2	184519	0.0	1.0	1.0
+chr2	184530	1.0	0.0	1.0
+chr2	184537	3.0	0.0	3.0
+chr2	184540	0.0	1.0	1.0
+chr2	184547	0.0	1.0	1.0
+chr2	184557	1.0	0.0	1.0
+chr2	184580	0.0	1.0	1.0
+chr2	184597	0.0	1.0	1.0
+chr2	184626	0.0	2.0	2.0
+chr2	184694	2.0	0.0	2.0
+chr2	184715	0.0	1.0	1.0
+chr2	184723	0.0	1.0	1.0
+chr2	184728	1.0	0.0	1.0
+chr2	184743	0.0	1.0	1.0
+chr2	184748	1.0	0.0	1.0
+chr2	184766	1.0	0.0	1.0
+chr2	184867	1.0	0.0	1.0
+chr2	184888	0.0	1.0	1.0
+chr2	184914	1.0	0.0	1.0
+chr2	184939	0.0	1.0	1.0
+chr2	184941	1.0	0.0	1.0
+chr2	185037	0.0	1.0	1.0
+chr2	185040	0.0	1.0	1.0
+chr2	185041	1.0	0.0	1.0
+chr2	185062	0.0	1.0	1.0
+chr2	185067	1.0	0.0	1.0
+chr2	185079	1.0	0.0	1.0
+chr2	185094	0.0	1.0	1.0
+chr2	185100	3.0	0.0	3.0
+chr2	185104	2.0	0.0	2.0
+chr2	185144	1.0	0.0	1.0
+chr2	185200	0.0	1.0	1.0
+chr2	185245	0.0	1.0	1.0
+chr2	185280	1.0	0.0	1.0
+chr2	185436	0.0	1.0	1.0
+chr2	185593	1.0	0.0	1.0
+chr2	185604	2.0	0.0	2.0
+chr2	185615	0.0	1.0	1.0
+chr2	185693	1.0	0.0	1.0
+chr2	185714	2.0	0.0	2.0
+chr2	185756	0.0	1.0	1.0
+chr2	185770	2.0	0.0	2.0
+chr2	185772	1.0	0.0	1.0
+chr2	185778	0.0	1.0	1.0
+chr2	185799	1.0	1.0	2.0
+chr2	185837	1.0	0.0	1.0
+chr2	186044	0.0	1.0	1.0
+chr2	186104	0.0	1.0	1.0
+chr2	186160	0.0	1.0	1.0
+chr2	186279	1.0	0.0	1.0
+chr2	186280	0.0	1.0	1.0
+chr2	186283	0.0	1.0	1.0
+chr2	186284	0.0	2.0	2.0
+chr2	186286	1.0	0.0	1.0
+chr2	186291	2.0	0.0	2.0
+chr2	186299	2.0	0.0	2.0
+chr2	186300	1.0	0.0	1.0
+chr2	186307	0.0	1.0	1.0
+chr2	186309	0.0	2.0	2.0
+chr2	186317	1.0	0.0	1.0
+chr2	186324	1.0	0.0	1.0
+chr2	186439	0.0	2.0	2.0
+chr2	186444	0.0	1.0	1.0
+chr2	186447	0.0	1.0	1.0
+chr2	186459	0.0	1.0	1.0
+chr2	186460	1.0	0.0	1.0
+chr2	186461	2.0	0.0	2.0
+chr2	186469	0.0	1.0	1.0
+chr2	186472	0.0	1.0	1.0
+chr2	186475	0.0	5.0	5.0
+chr2	186480	0.0	1.0	1.0
+chr2	186483	0.0	1.0	1.0
+chr2	186506	1.0	0.0	1.0
+chr2	186528	1.0	0.0	1.0
+chr2	186722	0.0	1.0	1.0
+chr2	186735	1.0	0.0	1.0
+chr2	186746	1.0	1.0	2.0
+chr2	186757	0.0	1.0	1.0
+chr2	186761	0.0	1.0	1.0
+chr2	186763	0.0	1.0	1.0
+chr2	186768	0.0	1.0	1.0
+chr2	186773	0.0	2.0	2.0
+chr2	186810	1.0	0.0	1.0
+chr2	186921	0.0	1.0	1.0
+chr2	186935	1.0	0.0	1.0
+chr2	186954	0.0	1.0	1.0
+chr2	187224	1.0	0.0	1.0
+chr2	187265	0.0	2.0	2.0
+chr2	187315	1.0	0.0	1.0
+chr2	187631	0.0	1.0	1.0
+chr2	187820	0.0	1.0	1.0
+chr2	187858	1.0	0.0	1.0
+chr2	188022	1.0	0.0	1.0
+chr2	188089	1.0	0.0	1.0
+chr2	188172	2.0	0.0	2.0
+chr2	188432	0.0	1.0	1.0
+chr2	188461	1.0	0.0	1.0
+chr2	188492	0.0	3.0	3.0
+chr2	188495	0.0	1.0	1.0
+chr2	188504	0.0	1.0	1.0
+chr2	188543	0.0	1.0	1.0
+chr2	188596	0.0	1.0	1.0
+chr2	188599	1.0	0.0	1.0
+chr2	188632	1.0	0.0	1.0
+chr2	188726	1.0	0.0	1.0
+chr2	188744	1.0	0.0	1.0
+chr2	188976	1.0	0.0	1.0
+chr2	189487	1.0	0.0	1.0
+chr2	189651	1.0	0.0	1.0
+chr2	189721	1.0	0.0	1.0
+chr2	189743	0.0	1.0	1.0
+chr2	189773	1.0	0.0	1.0
+chr2	190009	1.0	0.0	1.0
+chr2	190179	1.0	0.0	1.0
+chr2	190308	1.0	0.0	1.0
+chr2	190452	0.0	1.0	1.0
+chr2	190626	1.0	0.0	1.0
+chr2	190949	0.0	1.0	1.0
+chr2	191081	1.0	0.0	1.0
+chr2	191237	1.0	0.0	1.0
+chr2	191362	0.0	1.0	1.0
+chr2	191422	1.0	0.0	1.0
+chr2	191577	1.0	0.0	1.0
+chr2	191703	2.0	0.0	2.0
+chr2	191716	2.0	0.0	2.0
+chr2	191724	0.0	2.0	2.0
+chr2	191731	0.0	1.0	1.0
+chr2	191734	0.0	2.0	2.0
+chr2	191737	1.0	0.0	1.0
+chr2	191740	1.0	0.0	1.0
+chr2	191741	1.0	0.0	1.0
+chr2	191754	1.0	0.0	1.0
+chr2	192001	1.0	1.0	2.0
+chr2	192003	1.0	0.0	1.0
+chr2	192035	1.0	0.0	1.0
+chr2	192351	1.0	0.0	1.0
+chr2	192539	0.0	1.0	1.0
+chr2	192553	2.0	0.0	2.0
+chr2	192554	0.0	2.0	2.0
+chr2	192557	0.0	1.0	1.0
+chr2	192588	1.0	0.0	1.0
+chr2	192696	1.0	0.0	1.0
+chr2	192790	0.0	1.0	1.0
+chr2	193210	0.0	1.0	1.0
+chr2	193220	0.0	1.0	1.0
+chr2	193233	1.0	0.0	1.0
+chr2	193316	1.0	0.0	1.0
+chr2	193321	0.0	1.0	1.0
+chr2	193350	2.0	0.0	2.0
+chr2	193354	1.0	0.0	1.0
+chr2	193361	1.0	0.0	1.0
+chr2	193375	1.0	0.0	1.0
+chr2	193429	0.0	1.0	1.0
+chr2	193844	0.0	1.0	1.0
+chr2	193848	0.0	1.0	1.0
+chr2	193858	0.0	1.0	1.0
+chr2	193866	0.0	1.0	1.0
+chr2	193877	0.0	1.0	1.0
+chr2	193896	1.0	0.0	1.0
+chr2	193898	1.0	1.0	2.0
+chr2	193899	0.0	1.0	1.0
+chr2	193900	0.0	1.0	1.0
+chr2	193921	1.0	0.0	1.0
+chr2	193924	2.0	0.0	2.0
+chr2	193927	1.0	0.0	1.0
+chr2	193928	2.0	4.0	6.0
+chr2	193929	0.0	1.0	1.0
+chr2	193932	0.0	1.0	1.0
+chr2	193933	1.0	0.0	1.0
+chr2	193938	0.0	3.0	3.0
+chr2	193939	1.0	0.0	1.0
+chr2	193945	1.0	0.0	1.0
+chr2	193946	3.0	0.0	3.0
+chr2	193953	0.0	1.0	1.0
+chr2	193954	0.0	5.0	5.0
+chr2	193958	1.0	1.0	2.0
+chr2	193960	1.0	0.0	1.0
+chr2	193961	1.0	0.0	1.0
+chr2	193965	1.0	0.0	1.0
+chr2	193968	1.0	0.0	1.0
+chr2	193969	1.0	0.0	1.0
+chr2	193978	1.0	0.0	1.0
+chr2	193990	0.0	1.0	1.0
+chr2	193995	1.0	1.0	2.0
+chr2	194113	2.0	0.0	2.0
+chr2	194144	1.0	0.0	1.0
+chr2	194189	1.0	0.0	1.0
+chr2	194214	0.0	1.0	1.0
+chr2	194231	1.0	0.0	1.0
+chr2	194259	1.0	0.0	1.0
+chr2	194268	1.0	0.0	1.0
+chr2	194288	0.0	1.0	1.0
+chr2	194295	0.0	1.0	1.0
+chr2	194397	0.0	1.0	1.0
+chr2	194429	0.0	2.0	2.0
+chr2	194454	1.0	0.0	1.0
+chr2	194462	1.0	0.0	1.0
+chr2	194463	1.0	0.0	1.0
+chr2	194470	1.0	0.0	1.0
+chr2	194471	1.0	0.0	1.0
+chr2	194472	1.0	0.0	1.0
+chr2	194480	0.0	1.0	1.0
+chr2	194551	0.0	1.0	1.0
+chr2	194589	0.0	1.0	1.0
+chr2	194616	0.0	1.0	1.0
+chr2	194623	0.0	1.0	1.0
+chr2	194630	1.0	0.0	1.0
+chr2	194631	1.0	0.0	1.0
+chr2	194650	1.0	0.0	1.0
+chr2	194772	1.0	0.0	1.0
+chr2	194773	3.0	0.0	3.0
+chr2	194781	0.0	1.0	1.0
+chr2	194796	1.0	0.0	1.0
+chr2	194798	0.0	1.0	1.0
+chr2	194817	1.0	0.0	1.0
+chr2	194837	0.0	1.0	1.0
+chr2	194839	0.0	1.0	1.0
+chr2	194983	0.0	1.0	1.0
+chr2	195192	0.0	1.0	1.0
+chr2	195205	1.0	0.0	1.0
+chr2	195209	1.0	0.0	1.0
+chr2	195316	1.0	0.0	1.0
+chr2	195372	2.0	0.0	2.0
+chr2	195528	0.0	1.0	1.0
+chr2	195531	1.0	0.0	1.0
+chr2	195549	0.0	1.0	1.0
+chr2	195570	0.0	1.0	1.0
+chr2	195599	1.0	0.0	1.0
+chr2	195696	1.0	0.0	1.0
+chr2	195717	1.0	0.0	1.0
+chr2	195749	1.0	0.0	1.0
+chr2	195870	2.0	0.0	2.0
+chr2	196030	0.0	2.0	2.0
+chr2	196055	1.0	0.0	1.0
+chr2	196058	1.0	0.0	1.0
+chr2	196062	0.0	1.0	1.0
+chr2	196064	1.0	0.0	1.0
+chr2	196066	1.0	0.0	1.0
+chr2	196069	1.0	0.0	1.0
+chr2	196071	1.0	0.0	1.0
+chr2	196074	1.0	0.0	1.0
+chr2	196078	1.0	0.0	1.0
+chr2	196079	1.0	1.0	2.0
+chr2	196080	0.0	1.0	1.0
+chr2	196084	1.0	0.0	1.0
+chr2	196089	1.0	0.0	1.0
+chr2	196091	1.0	0.0	1.0
+chr2	196092	1.0	0.0	1.0
+chr2	196096	1.0	0.0	1.0
+chr2	196100	0.0	1.0	1.0
+chr2	196115	0.0	1.0	1.0
+chr2	196116	0.0	1.0	1.0
+chr2	196278	2.0	0.0	2.0
+chr2	196279	1.0	0.0	1.0
+chr2	196315	1.0	0.0	1.0
+chr2	196320	1.0	0.0	1.0
+chr2	196325	1.0	0.0	1.0
+chr2	196332	1.0	0.0	1.0
+chr2	196333	4.0	0.0	4.0
+chr2	196336	0.0	1.0	1.0
+chr2	196339	0.0	1.0	1.0
+chr2	196345	1.0	0.0	1.0
+chr2	196346	2.0	0.0	2.0
+chr2	196347	0.0	1.0	1.0
+chr2	196352	1.0	0.0	1.0
+chr2	196354	2.0	0.0	2.0
+chr2	196355	0.0	1.0	1.0
+chr2	196359	2.0	1.0	3.0
+chr2	196364	5.0	0.0	5.0
+chr2	196369	1.0	0.0	1.0
+chr2	196372	0.0	1.0	1.0
+chr2	196488	2.0	0.0	2.0
+chr2	196496	0.0	1.0	1.0
+chr2	196508	1.0	0.0	1.0
+chr2	196519	0.0	1.0	1.0
+chr2	196522	2.0	0.0	2.0
+chr2	196530	2.0	0.0	2.0
+chr2	196532	1.0	1.0	2.0
+chr2	196538	1.0	0.0	1.0
+chr2	196676	0.0	3.0	3.0
+chr2	196770	0.0	1.0	1.0
+chr2	196840	0.0	1.0	1.0
+chr2	196842	1.0	0.0	1.0
+chr2	196843	0.0	1.0	1.0
+chr2	196847	0.0	1.0	1.0
+chr2	196851	1.0	0.0	1.0
+chr2	196854	1.0	0.0	1.0
+chr2	196859	1.0	0.0	1.0
+chr2	196865	0.0	1.0	1.0
+chr2	197194	0.0	1.0	1.0
+chr2	197341	1.0	0.0	1.0
+chr2	197741	0.0	1.0	1.0
+chr2	197745	0.0	3.0	3.0
+chr2	197767	0.0	2.0	2.0
+chr2	197769	0.0	2.0	2.0
+chr2	197772	0.0	1.0	1.0
+chr2	197777	0.0	6.0	6.0
+chr2	197778	0.0	3.0	3.0
+chr2	197779	0.0	2.0	2.0
+chr2	197782	0.0	2.0	2.0
+chr2	197784	0.0	3.0	3.0
+chr2	197790	2.0	0.0	2.0
+chr2	197794	1.0	1.0	2.0
+chr2	197796	1.0	0.0	1.0
+chr2	197797	0.0	1.0	1.0
+chr2	197812	0.0	1.0	1.0
+chr2	197813	1.0	0.0	1.0
+chr2	197824	0.0	1.0	1.0
+chr2	197825	1.0	0.0	1.0
+chr2	197831	0.0	1.0	1.0
+chr2	197833	0.0	6.0	6.0
+chr2	197834	0.0	3.0	3.0
+chr2	197835	0.0	1.0	1.0
+chr2	197838	1.0	1.0	2.0
+chr2	197841	0.0	1.0	1.0
+chr2	197846	0.0	1.0	1.0
+chr2	197847	0.0	2.0	2.0
+chr2	197848	1.0	0.0	1.0
+chr2	197849	2.0	2.0	4.0
+chr2	197850	2.0	0.0	2.0
+chr2	197851	1.0	0.0	1.0
+chr2	197853	0.0	1.0	1.0
+chr2	197854	0.0	1.0	1.0
+chr2	197855	2.0	0.0	2.0
+chr2	197856	1.0	0.0	1.0
+chr2	197857	2.0	0.0	2.0
+chr2	197858	0.0	1.0	1.0
+chr2	197859	0.0	1.0	1.0
+chr2	197861	5.0	0.0	5.0
+chr2	197864	1.0	0.0	1.0
+chr2	197867	0.0	1.0	1.0
+chr2	197868	0.0	1.0	1.0
+chr2	197869	1.0	0.0	1.0
+chr2	197871	1.0	0.0	1.0
+chr2	197872	0.0	1.0	1.0
+chr2	197876	1.0	0.0	1.0
+chr2	197878	3.0	0.0	3.0
+chr2	197886	1.0	0.0	1.0
+chr2	197891	1.0	0.0	1.0
+chr2	197893	1.0	1.0	2.0
+chr2	197894	0.0	2.0	2.0
+chr2	197895	1.0	0.0	1.0
+chr2	197896	0.0	2.0	2.0
+chr2	197902	1.0	0.0	1.0
+chr2	197909	1.0	0.0	1.0
+chr2	197910	4.0	0.0	4.0
+chr2	197919	0.0	2.0	2.0
+chr2	197922	0.0	1.0	1.0
+chr2	197923	0.0	2.0	2.0
+chr2	197924	0.0	1.0	1.0
+chr2	197927	1.0	0.0	1.0
+chr2	197930	0.0	3.0	3.0
+chr2	197932	0.0	1.0	1.0
+chr2	197934	1.0	0.0	1.0
+chr2	197938	1.0	0.0	1.0
+chr2	197942	0.0	1.0	1.0
+chr2	197944	0.0	2.0	2.0
+chr2	197946	1.0	0.0	1.0
+chr2	197947	2.0	0.0	2.0
+chr2	197955	1.0	0.0	1.0
+chr2	197968	0.0	1.0	1.0
+chr2	197976	0.0	1.0	1.0
+chr2	197981	0.0	1.0	1.0
+chr2	197984	0.0	1.0	1.0
+chr2	197988	2.0	0.0	2.0
+chr2	197993	1.0	0.0	1.0
+chr2	198000	0.0	1.0	1.0
+chr2	198004	0.0	1.0	1.0
+chr2	198009	1.0	0.0	1.0
+chr2	198011	5.0	0.0	5.0
+chr2	198012	2.0	0.0	2.0
+chr2	198013	2.0	0.0	2.0
+chr2	198014	3.0	0.0	3.0
+chr2	198015	8.0	0.0	8.0
+chr2	198018	5.0	0.0	5.0
+chr2	198019	1.0	0.0	1.0
+chr2	198021	1.0	0.0	1.0
+chr2	198023	3.0	0.0	3.0
+chr2	198043	1.0	0.0	1.0
+chr2	198046	1.0	0.0	1.0
+chr2	198058	0.0	1.0	1.0
+chr2	198105	0.0	1.0	1.0
+chr2	198157	1.0	0.0	1.0
+chr2	198253	1.0	0.0	1.0
+chr2	198272	1.0	0.0	1.0
+chr2	198287	2.0	0.0	2.0
+chr2	198312	0.0	2.0	2.0
+chr2	198542	1.0	1.0	2.0
+chr2	198557	1.0	0.0	1.0
+chr2	198559	0.0	2.0	2.0
+chr2	198574	1.0	0.0	1.0
+chr2	198582	0.0	1.0	1.0
+chr2	198673	0.0	1.0	1.0
+chr2	198683	0.0	1.0	1.0
+chr2	198684	0.0	1.0	1.0
+chr2	198695	1.0	0.0	1.0
+chr2	198709	1.0	0.0	1.0
+chr2	198710	0.0	1.0	1.0
+chr2	198714	0.0	1.0	1.0
+chr2	198732	0.0	1.0	1.0
+chr2	198735	5.0	0.0	5.0
+chr2	198739	1.0	0.0	1.0
+chr2	198775	1.0	0.0	1.0
+chr2	198925	1.0	0.0	1.0
+chr2	198941	0.0	1.0	1.0
+chr2	198959	0.0	1.0	1.0
+chr2	199215	2.0	0.0	2.0
+chr2	199471	0.0	1.0	1.0
+chr2	199840	2.0	0.0	2.0
+chr2	200155	0.0	1.0	1.0
+chr2	200186	1.0	0.0	1.0
+chr2	200303	1.0	0.0	1.0
+chr2	200651	0.0	1.0	1.0
+chr2	200909	1.0	0.0	1.0
+chr2	200990	1.0	0.0	1.0
+chr2	201038	1.0	0.0	1.0
+chr2	201275	1.0	0.0	1.0
+chr2	201401	1.0	0.0	1.0
+chr2	201408	0.0	1.0	1.0
+chr2	201435	1.0	0.0	1.0
+chr2	201549	1.0	0.0	1.0
+chr2	201550	1.0	0.0	1.0
+chr2	201561	0.0	1.0	1.0
+chr2	201562	1.0	0.0	1.0
+chr2	201572	0.0	2.0	2.0
+chr2	201582	0.0	2.0	2.0
+chr2	201689	0.0	1.0	1.0
+chr2	201698	0.0	1.0	1.0
+chr2	201701	0.0	1.0	1.0
+chr2	201705	0.0	2.0	2.0
+chr2	201708	0.0	1.0	1.0
+chr2	201713	0.0	1.0	1.0
+chr2	201715	3.0	0.0	3.0
+chr2	201716	0.0	1.0	1.0
+chr2	201720	0.0	1.0	1.0
+chr2	201721	0.0	2.0	2.0
+chr2	201722	2.0	1.0	3.0
+chr2	201723	0.0	5.0	5.0
+chr2	201724	0.0	1.0	1.0
+chr2	201725	1.0	0.0	1.0
+chr2	201726	3.0	5.0	8.0
+chr2	201728	1.0	5.0	6.0
+chr2	201730	2.0	0.0	2.0
+chr2	201732	0.0	2.0	2.0
+chr2	201733	1.0	2.0	3.0
+chr2	201734	1.0	1.0	2.0
+chr2	201735	1.0	0.0	1.0
+chr2	201736	1.0	0.0	1.0
+chr2	201738	0.0	1.0	1.0
+chr2	201739	3.0	0.0	3.0
+chr2	201742	1.0	3.0	4.0
+chr2	201746	2.0	0.0	2.0
+chr2	201750	1.0	0.0	1.0
+chr2	201751	4.0	0.0	4.0
+chr2	201755	1.0	0.0	1.0
+chr2	201763	1.0	0.0	1.0
+chr2	201765	1.0	0.0	1.0
+chr2	201778	0.0	2.0	2.0
+chr2	201779	0.0	1.0	1.0
+chr2	201790	1.0	0.0	1.0
+chr2	201792	0.0	1.0	1.0
+chr2	201812	0.0	1.0	1.0
+chr2	202000	0.0	1.0	1.0
+chr2	202021	1.0	0.0	1.0
+chr2	202022	1.0	0.0	1.0
+chr2	202034	1.0	0.0	1.0
+chr2	202037	0.0	1.0	1.0
+chr2	202039	0.0	5.0	5.0
+chr2	202049	0.0	1.0	1.0
+chr2	202050	2.0	0.0	2.0
+chr2	202057	0.0	1.0	1.0
+chr2	202063	0.0	3.0	3.0
+chr2	202076	1.0	0.0	1.0
+chr2	202080	1.0	0.0	1.0
+chr2	202085	0.0	1.0	1.0
+chr2	202090	0.0	1.0	1.0
+chr2	202093	0.0	1.0	1.0
+chr2	202100	0.0	1.0	1.0
+chr2	202106	0.0	1.0	1.0
+chr2	202115	1.0	0.0	1.0
+chr2	202220	0.0	1.0	1.0
+chr2	202223	0.0	3.0	3.0
+chr2	202226	1.0	0.0	1.0
+chr2	202229	1.0	0.0	1.0
+chr2	202230	0.0	1.0	1.0
+chr2	202235	1.0	0.0	1.0
+chr2	202241	0.0	1.0	1.0
+chr2	202246	1.0	0.0	1.0
+chr2	202247	0.0	1.0	1.0
+chr2	202248	0.0	1.0	1.0
+chr2	202250	0.0	1.0	1.0
+chr2	202255	0.0	1.0	1.0
+chr2	202263	0.0	1.0	1.0
+chr2	202311	1.0	0.0	1.0
+chr2	202595	1.0	0.0	1.0
+chr2	202596	1.0	0.0	1.0
+chr2	202612	0.0	2.0	2.0
+chr2	202614	1.0	0.0	1.0
+chr2	202619	0.0	3.0	3.0
+chr2	202622	0.0	1.0	1.0
+chr2	202624	2.0	0.0	2.0
+chr2	202626	2.0	0.0	2.0
+chr2	202630	1.0	1.0	2.0
+chr2	202632	0.0	1.0	1.0
+chr2	202639	1.0	0.0	1.0
+chr2	202650	0.0	2.0	2.0
+chr2	202652	2.0	0.0	2.0
+chr2	202686	0.0	2.0	2.0
+chr2	202697	1.0	0.0	1.0
+chr2	202802	1.0	0.0	1.0
+chr2	202804	5.0	0.0	5.0
+chr2	202808	1.0	0.0	1.0
+chr2	202810	0.0	1.0	1.0
+chr2	202818	1.0	0.0	1.0
+chr2	202863	0.0	1.0	1.0
+chr2	202897	1.0	0.0	1.0
+chr2	202902	1.0	0.0	1.0
+chr2	202921	0.0	1.0	1.0
+chr2	203021	0.0	1.0	1.0
+chr2	203069	0.0	2.0	2.0
+chr2	203105	1.0	0.0	1.0
+chr2	203115	0.0	1.0	1.0
+chr2	203175	1.0	0.0	1.0
+chr2	203407	1.0	0.0	1.0
+chr2	203455	1.0	0.0	1.0
+chr2	203469	1.0	0.0	1.0
+chr2	203503	1.0	0.0	1.0
+chr2	203514	1.0	0.0	1.0
+chr2	203515	0.0	1.0	1.0
+chr2	203523	1.0	0.0	1.0
+chr2	203642	1.0	0.0	1.0
+chr2	203643	1.0	0.0	1.0
+chr2	203660	0.0	1.0	1.0
+chr2	203661	1.0	1.0	2.0
+chr2	203678	1.0	0.0	1.0
+chr2	203686	3.0	0.0	3.0
+chr2	203689	0.0	1.0	1.0
+chr2	203695	2.0	0.0	2.0
+chr2	203698	2.0	0.0	2.0
+chr2	203811	1.0	0.0	1.0
+chr2	203822	1.0	0.0	1.0
+chr2	203841	0.0	1.0	1.0
+chr2	203843	0.0	1.0	1.0
+chr2	203844	0.0	1.0	1.0
+chr2	203980	0.0	1.0	1.0
+chr2	204011	2.0	0.0	2.0
+chr2	204014	0.0	1.0	1.0
+chr2	204207	0.0	1.0	1.0
+chr2	204386	0.0	1.0	1.0
+chr2	204744	0.0	1.0	1.0
+chr2	205001	1.0	0.0	1.0
+chr2	205169	0.0	1.0	1.0
+chr2	205337	0.0	1.0	1.0
+chr2	205520	0.0	1.0	1.0
+chr2	205546	1.0	0.0	1.0
+chr2	205558	0.0	1.0	1.0
+chr2	205608	2.0	0.0	2.0
+chr2	205657	0.0	1.0	1.0
+chr2	205741	1.0	0.0	1.0
+chr2	205748	1.0	0.0	1.0
+chr2	205781	0.0	1.0	1.0
+chr2	205793	1.0	0.0	1.0
+chr2	205800	1.0	1.0	2.0
+chr2	205833	1.0	0.0	1.0
+chr2	205837	0.0	1.0	1.0
+chr2	205966	1.0	0.0	1.0
+chr2	206223	0.0	1.0	1.0
+chr2	206235	1.0	0.0	1.0
+chr2	206405	0.0	2.0	2.0
+chr2	206531	1.0	0.0	1.0
+chr2	206542	1.0	0.0	1.0
+chr2	206546	0.0	1.0	1.0
+chr2	206547	0.0	1.0	1.0
+chr2	206552	1.0	0.0	1.0
+chr2	206557	0.0	1.0	1.0
+chr2	206586	0.0	1.0	1.0
+chr2	206719	0.0	1.0	1.0
+chr2	206750	0.0	1.0	1.0
+chr2	206752	1.0	0.0	1.0
+chr2	206878	0.0	1.0	1.0
+chr2	206883	1.0	0.0	1.0
+chr2	206887	0.0	1.0	1.0
+chr2	206888	1.0	3.0	4.0
+chr2	206898	3.0	0.0	3.0
+chr2	206899	1.0	0.0	1.0
+chr2	206903	0.0	8.0	8.0
+chr2	206904	0.0	2.0	2.0
+chr2	206906	3.0	1.0	4.0
+chr2	206907	0.0	1.0	1.0
+chr2	206908	5.0	0.0	5.0
+chr2	206909	2.0	8.0	10.0
+chr2	206910	5.0	1.0	6.0
+chr2	206913	1.0	2.0	3.0
+chr2	206915	1.0	0.0	1.0
+chr2	206916	2.0	0.0	2.0
+chr2	206917	5.0	1.0	6.0
+chr2	206918	0.0	4.0	4.0
+chr2	206919	5.0	0.0	5.0
+chr2	206920	0.0	1.0	1.0
+chr2	206923	0.0	4.0	4.0
+chr2	206924	0.0	1.0	1.0
+chr2	206927	1.0	0.0	1.0
+chr2	206928	1.0	0.0	1.0
+chr2	206931	1.0	0.0	1.0
+chr2	206932	1.0	0.0	1.0
+chr2	206935	3.0	4.0	7.0
+chr2	206942	1.0	0.0	1.0
+chr2	206947	0.0	1.0	1.0
+chr2	206958	1.0	0.0	1.0
+chr2	206964	0.0	1.0	1.0
+chr2	207141	1.0	0.0	1.0
+chr2	207171	0.0	1.0	1.0
+chr2	207184	1.0	0.0	1.0
+chr2	207185	0.0	1.0	1.0
+chr2	207187	1.0	1.0	2.0
+chr2	207191	0.0	2.0	2.0
+chr2	207194	0.0	1.0	1.0
+chr2	207197	0.0	1.0	1.0
+chr2	207208	1.0	3.0	4.0
+chr2	207210	1.0	0.0	1.0
+chr2	207211	2.0	1.0	3.0
+chr2	207212	1.0	0.0	1.0
+chr2	207213	6.0	8.0	14.0
+chr2	207214	0.0	4.0	4.0
+chr2	207215	0.0	1.0	1.0
+chr2	207216	1.0	0.0	1.0
+chr2	207218	1.0	0.0	1.0
+chr2	207219	4.0	0.0	4.0
+chr2	207222	1.0	0.0	1.0
+chr2	207223	1.0	0.0	1.0
+chr2	207229	0.0	1.0	1.0
+chr2	207231	3.0	0.0	3.0
+chr2	207237	3.0	0.0	3.0
+chr2	207252	0.0	1.0	1.0
+chr2	207356	0.0	1.0	1.0
+chr2	207371	0.0	1.0	1.0
+chr2	207380	0.0	1.0	1.0
+chr2	207566	0.0	1.0	1.0
+chr2	207571	2.0	0.0	2.0
+chr2	207590	1.0	0.0	1.0
+chr2	207858	1.0	0.0	1.0
+chr2	207879	1.0	0.0	1.0
+chr2	207991	0.0	1.0	1.0
+chr2	208038	0.0	1.0	1.0
+chr2	208053	0.0	1.0	1.0
+chr2	208223	0.0	1.0	1.0
+chr2	208324	0.0	1.0	1.0
+chr2	208359	0.0	1.0	1.0
+chr2	208862	1.0	0.0	1.0
+chr2	208881	1.0	0.0	1.0
+chr2	208976	0.0	1.0	1.0
+chr2	209041	1.0	0.0	1.0
+chr2	209048	0.0	2.0	2.0
+chr2	209204	1.0	0.0	1.0
+chr2	209219	1.0	0.0	1.0
+chr2	209385	1.0	0.0	1.0
+chr2	209394	0.0	1.0	1.0
+chr2	209408	0.0	1.0	1.0
+chr2	209411	0.0	1.0	1.0
+chr2	209413	1.0	0.0	1.0
+chr2	209422	0.0	1.0	1.0
+chr2	209586	1.0	0.0	1.0
+chr2	209592	1.0	0.0	1.0
+chr2	209613	1.0	0.0	1.0
+chr2	209618	0.0	2.0	2.0
+chr2	209621	2.0	0.0	2.0
+chr2	209629	2.0	0.0	2.0
+chr2	209638	0.0	3.0	3.0
+chr2	209639	0.0	1.0	1.0
+chr2	209650	1.0	0.0	1.0
+chr2	209651	2.0	0.0	2.0
+chr2	209661	1.0	0.0	1.0
+chr2	209749	0.0	2.0	2.0
+chr2	209755	0.0	1.0	1.0
+chr2	209780	1.0	0.0	1.0
+chr2	209790	1.0	0.0	1.0
+chr2	209794	1.0	0.0	1.0
+chr2	209795	0.0	1.0	1.0
+chr2	209797	1.0	0.0	1.0
+chr2	209799	1.0	0.0	1.0
+chr2	209805	0.0	1.0	1.0
+chr2	209826	0.0	1.0	1.0
+chr2	209934	0.0	2.0	2.0
+chr2	209945	1.0	0.0	1.0
+chr2	209952	0.0	1.0	1.0
+chr2	209960	0.0	1.0	1.0
+chr2	209963	1.0	0.0	1.0
+chr2	209973	0.0	1.0	1.0
+chr2	209974	1.0	0.0	1.0
+chr2	209998	1.0	0.0	1.0
+chr2	210033	0.0	1.0	1.0
+chr2	210100	0.0	1.0	1.0
+chr2	210107	1.0	0.0	1.0
+chr2	210151	1.0	0.0	1.0
+chr2	210165	1.0	0.0	1.0
+chr2	210261	0.0	1.0	1.0
+chr2	210328	1.0	0.0	1.0
+chr2	210408	1.0	0.0	1.0
+chr2	210412	0.0	1.0	1.0
+chr2	210434	0.0	1.0	1.0
+chr2	210437	2.0	0.0	2.0
+chr2	210438	0.0	2.0	2.0
+chr2	210459	0.0	1.0	1.0
+chr2	210461	0.0	1.0	1.0
+chr2	210479	0.0	1.0	1.0
+chr2	210609	1.0	0.0	1.0
+chr2	210647	0.0	1.0	1.0
+chr2	210656	0.0	1.0	1.0
+chr2	210687	0.0	1.0	1.0
+chr2	210967	1.0	0.0	1.0
+chr2	210985	0.0	2.0	2.0
+chr2	211431	1.0	0.0	1.0
+chr2	211586	1.0	0.0	1.0
+chr2	211614	1.0	0.0	1.0
+chr2	211826	0.0	1.0	1.0
+chr2	211830	0.0	1.0	1.0
+chr2	212032	1.0	0.0	1.0
+chr2	212174	0.0	1.0	1.0
+chr2	212175	1.0	0.0	1.0
+chr2	212187	0.0	1.0	1.0
+chr2	212288	0.0	1.0	1.0
+chr2	212389	2.0	0.0	2.0
+chr2	212719	1.0	0.0	1.0
+chr2	213103	1.0	0.0	1.0
+chr2	213163	3.0	0.0	3.0
+chr2	213470	1.0	0.0	1.0
+chr2	213558	1.0	0.0	1.0
+chr2	214663	1.0	0.0	1.0
+chr2	214776	1.0	0.0	1.0
+chr2	214821	1.0	0.0	1.0
+chr2	214864	0.0	1.0	1.0
+chr2	215131	0.0	1.0	1.0
+chr2	215570	1.0	0.0	1.0
+chr2	215582	2.0	0.0	2.0
+chr2	215856	0.0	1.0	1.0
+chr2	215953	1.0	0.0	1.0
+chr2	216050	1.0	0.0	1.0
+chr2	216051	5.0	0.0	5.0
+chr2	216052	1.0	1.0	2.0
+chr2	216152	0.0	1.0	1.0
+chr2	216183	0.0	1.0	1.0
+chr2	216213	2.0	0.0	2.0
+chr2	216214	1.0	0.0	1.0
+chr2	216219	0.0	1.0	1.0
+chr2	216222	0.0	2.0	2.0
+chr2	216234	0.0	1.0	1.0
+chr2	216236	2.0	0.0	2.0
+chr2	216237	0.0	1.0	1.0
+chr2	216255	0.0	1.0	1.0
+chr2	216259	3.0	0.0	3.0
+chr2	216275	0.0	1.0	1.0
+chr2	216288	1.0	0.0	1.0
+chr2	216352	1.0	0.0	1.0
+chr2	216354	0.0	1.0	1.0
+chr2	216355	2.0	0.0	2.0
+chr2	216359	1.0	0.0	1.0
+chr2	216360	0.0	1.0	1.0
+chr2	216366	1.0	1.0	2.0
+chr2	216369	1.0	2.0	3.0
+chr2	216370	0.0	1.0	1.0
+chr2	216381	2.0	0.0	2.0
+chr2	216385	2.0	0.0	2.0
+chr2	216386	1.0	0.0	1.0
+chr2	216396	0.0	1.0	1.0
+chr2	216405	0.0	2.0	2.0
+chr2	216899	0.0	1.0	1.0
+chr2	216917	1.0	0.0	1.0
+chr2	216951	2.0	0.0	2.0
+chr2	217031	0.0	1.0	1.0
+chr2	217058	1.0	0.0	1.0
+chr2	217079	1.0	0.0	1.0
+chr2	217096	1.0	2.0	3.0
+chr2	217104	1.0	0.0	1.0
+chr2	217108	1.0	0.0	1.0
+chr2	217110	1.0	1.0	2.0
+chr2	217111	1.0	1.0	2.0
+chr2	217112	1.0	0.0	1.0
+chr2	217114	1.0	0.0	1.0
+chr2	217119	1.0	0.0	1.0
+chr2	217132	1.0	0.0	1.0
+chr2	217380	1.0	0.0	1.0
+chr2	217385	0.0	1.0	1.0
+chr2	217426	0.0	1.0	1.0
+chr2	217427	0.0	1.0	1.0
+chr2	217439	1.0	0.0	1.0
+chr2	217576	0.0	1.0	1.0
+chr2	217579	1.0	0.0	1.0
+chr2	217597	2.0	0.0	2.0
+chr2	217598	0.0	1.0	1.0
+chr2	217761	1.0	0.0	1.0
+chr2	218015	0.0	1.0	1.0
+chr2	218210	1.0	0.0	1.0
+chr2	220137	0.0	1.0	1.0
+chr2	220141	0.0	1.0	1.0
+chr2	220158	0.0	1.0	1.0
+chr2	220514	0.0	1.0	1.0
+chr2	220540	0.0	1.0	1.0
+chr2	220693	1.0	0.0	1.0
+chr2	220694	0.0	1.0	1.0
+chr2	220726	0.0	1.0	1.0
+chr2	221066	0.0	1.0	1.0
+chr2	221074	0.0	1.0	1.0
+chr2	221077	0.0	1.0	1.0
+chr2	221078	0.0	1.0	1.0
+chr2	221079	0.0	1.0	1.0
+chr2	221088	0.0	2.0	2.0
+chr2	221090	0.0	3.0	3.0
+chr2	221093	0.0	1.0	1.0
+chr2	221101	0.0	2.0	2.0
+chr2	221102	0.0	1.0	1.0
+chr2	221105	0.0	4.0	4.0
+chr2	221106	0.0	4.0	4.0
+chr2	221111	0.0	1.0	1.0
+chr2	221112	2.0	0.0	2.0
+chr2	221113	7.0	0.0	7.0
+chr2	221114	0.0	1.0	1.0
+chr2	221116	1.0	1.0	2.0
+chr2	221117	0.0	2.0	2.0
+chr2	221118	0.0	1.0	1.0
+chr2	221119	0.0	1.0	1.0
+chr2	221124	2.0	0.0	2.0
+chr2	221125	0.0	1.0	1.0
+chr2	221127	1.0	2.0	3.0
+chr2	221130	2.0	0.0	2.0
+chr2	221134	1.0	0.0	1.0
+chr2	221135	0.0	1.0	1.0
+chr2	221138	0.0	2.0	2.0
+chr2	221139	0.0	1.0	1.0
+chr2	221145	0.0	2.0	2.0
+chr2	221148	0.0	1.0	1.0
+chr2	221152	0.0	1.0	1.0
+chr2	221155	0.0	1.0	1.0
+chr2	221159	1.0	0.0	1.0
+chr2	221162	0.0	2.0	2.0
+chr2	221163	0.0	1.0	1.0
+chr2	221164	1.0	1.0	2.0
+chr2	221167	1.0	0.0	1.0
+chr2	221169	2.0	0.0	2.0
+chr2	221170	0.0	2.0	2.0
+chr2	221174	1.0	0.0	1.0
+chr2	221175	1.0	0.0	1.0
+chr2	221176	1.0	0.0	1.0
+chr2	221177	1.0	0.0	1.0
+chr2	221178	1.0	0.0	1.0
+chr2	221185	0.0	1.0	1.0
+chr2	221186	1.0	0.0	1.0
+chr2	221191	0.0	2.0	2.0
+chr2	221192	2.0	2.0	4.0
+chr2	221195	0.0	1.0	1.0
+chr2	221196	0.0	2.0	2.0
+chr2	221197	0.0	1.0	1.0
+chr2	221198	0.0	2.0	2.0
+chr2	221202	1.0	0.0	1.0
+chr2	221204	2.0	0.0	2.0
+chr2	221214	0.0	1.0	1.0
+chr2	221218	0.0	3.0	3.0
+chr2	221220	0.0	7.0	7.0
+chr2	221232	0.0	1.0	1.0
+chr2	221233	0.0	1.0	1.0
+chr2	221236	1.0	0.0	1.0
+chr2	221244	0.0	1.0	1.0
+chr2	221250	0.0	1.0	1.0
+chr2	221252	1.0	0.0	1.0
+chr2	221259	2.0	0.0	2.0
+chr2	221260	2.0	0.0	2.0
+chr2	221277	0.0	1.0	1.0
+chr2	221278	1.0	0.0	1.0
+chr2	221279	1.0	0.0	1.0
+chr2	221280	3.0	1.0	4.0
+chr2	221282	0.0	1.0	1.0
+chr2	221288	2.0	6.0	8.0
+chr2	221294	1.0	0.0	1.0
+chr2	221296	1.0	0.0	1.0
+chr2	221300	1.0	0.0	1.0
+chr2	221304	1.0	0.0	1.0
+chr2	221306	1.0	0.0	1.0
+chr2	221308	1.0	0.0	1.0
+chr2	221309	1.0	0.0	1.0
+chr2	221310	1.0	0.0	1.0
+chr2	221312	1.0	0.0	1.0
+chr2	221313	1.0	0.0	1.0
+chr2	221317	1.0	0.0	1.0
+chr2	221320	1.0	0.0	1.0
+chr2	221321	17.0	1.0	18.0
+chr2	221322	5.0	2.0	7.0
+chr2	221324	1.0	0.0	1.0
+chr2	221325	3.0	1.0	4.0
+chr2	221327	1.0	0.0	1.0
+chr2	221328	0.0	2.0	2.0
+chr2	221329	0.0	1.0	1.0
+chr2	221330	1.0	1.0	2.0
+chr2	221334	1.0	0.0	1.0
+chr2	221335	1.0	0.0	1.0
+chr2	221338	1.0	3.0	4.0
+chr2	221339	1.0	1.0	2.0
+chr2	221343	0.0	1.0	1.0
+chr2	221344	0.0	2.0	2.0
+chr2	221355	0.0	1.0	1.0
+chr2	221356	0.0	1.0	1.0
+chr2	221357	0.0	2.0	2.0
+chr2	221361	0.0	1.0	1.0
+chr2	221367	1.0	0.0	1.0
+chr2	221370	1.0	0.0	1.0
+chr2	221375	2.0	0.0	2.0
+chr2	221377	0.0	1.0	1.0
+chr2	221379	1.0	0.0	1.0
+chr2	221392	0.0	2.0	2.0
+chr2	221403	0.0	2.0	2.0
+chr2	221404	2.0	0.0	2.0
+chr2	221405	1.0	0.0	1.0
+chr2	221410	0.0	3.0	3.0
+chr2	221411	1.0	0.0	1.0
+chr2	221413	1.0	0.0	1.0
+chr2	221421	0.0	2.0	2.0
+chr2	221422	1.0	0.0	1.0
+chr2	221424	1.0	0.0	1.0
+chr2	221425	1.0	0.0	1.0
+chr2	221426	1.0	0.0	1.0
+chr2	221427	0.0	1.0	1.0
+chr2	221429	0.0	1.0	1.0
+chr2	221433	1.0	3.0	4.0
+chr2	221439	4.0	0.0	4.0
+chr2	221443	1.0	1.0	2.0
+chr2	221444	2.0	0.0	2.0
+chr2	221446	5.0	0.0	5.0
+chr2	221447	1.0	1.0	2.0
+chr2	221451	2.0	4.0	6.0
+chr2	221453	0.0	1.0	1.0
+chr2	221458	0.0	5.0	5.0
+chr2	221459	0.0	1.0	1.0
+chr2	221463	1.0	0.0	1.0
+chr2	221469	2.0	0.0	2.0
+chr2	221472	1.0	3.0	4.0
+chr2	221475	0.0	3.0	3.0
+chr2	221477	3.0	1.0	4.0
+chr2	221478	7.0	3.0	10.0
+chr2	221482	1.0	0.0	1.0
+chr2	221484	0.0	13.0	13.0
+chr2	221486	0.0	3.0	3.0
+chr2	221492	1.0	0.0	1.0
+chr2	221493	0.0	8.0	8.0
+chr2	221494	1.0	0.0	1.0
+chr2	221495	1.0	0.0	1.0
+chr2	221497	2.0	0.0	2.0
+chr2	221503	1.0	0.0	1.0
+chr2	221504	8.0	0.0	8.0
+chr2	221509	2.0	0.0	2.0
+chr2	221510	1.0	0.0	1.0
+chr2	221511	3.0	1.0	4.0
+chr2	221513	0.0	4.0	4.0
+chr2	221517	1.0	3.0	4.0
+chr2	221522	1.0	11.0	12.0
+chr2	221523	2.0	10.0	12.0
+chr2	221527	2.0	0.0	2.0
+chr2	221528	1.0	3.0	4.0
+chr2	221529	0.0	1.0	1.0
+chr2	221530	0.0	1.0	1.0
+chr2	221531	1.0	1.0	2.0
+chr2	221532	1.0	1.0	2.0
+chr2	221533	0.0	17.0	17.0
+chr2	221538	4.0	0.0	4.0
+chr2	221543	13.0	0.0	13.0
+chr2	221544	2.0	0.0	2.0
+chr2	221551	3.0	0.0	3.0
+chr2	221559	1.0	0.0	1.0
+chr2	221561	1.0	0.0	1.0
+chr2	221564	2.0	0.0	2.0
+chr2	221569	3.0	0.0	3.0
+chr2	221573	1.0	0.0	1.0
+chr2	221580	0.0	1.0	1.0
+chr2	221583	3.0	0.0	3.0
+chr2	221586	1.0	0.0	1.0
+chr2	221589	5.0	0.0	5.0
+chr2	221594	1.0	0.0	1.0
+chr2	221595	1.0	0.0	1.0
+chr2	221601	0.0	4.0	4.0
+chr2	221602	0.0	1.0	1.0
+chr2	221603	0.0	1.0	1.0
+chr2	221611	1.0	0.0	1.0
+chr2	221616	0.0	1.0	1.0
+chr2	221633	0.0	1.0	1.0
+chr2	221639	0.0	2.0	2.0
+chr2	221640	2.0	1.0	3.0
+chr2	221641	1.0	0.0	1.0
+chr2	221651	4.0	0.0	4.0
+chr2	221655	0.0	1.0	1.0
+chr2	221703	0.0	2.0	2.0
+chr2	221705	0.0	1.0	1.0
+chr2	221706	0.0	4.0	4.0
+chr2	221707	0.0	6.0	6.0
+chr2	221709	0.0	1.0	1.0
+chr2	221728	0.0	1.0	1.0
+chr2	221730	0.0	1.0	1.0
+chr2	221739	0.0	1.0	1.0
+chr2	221741	0.0	1.0	1.0
+chr2	221742	0.0	1.0	1.0
+chr2	221748	1.0	0.0	1.0
+chr2	221755	2.0	0.0	2.0
+chr2	221767	2.0	2.0	4.0
+chr2	221768	1.0	0.0	1.0
+chr2	221771	23.0	0.0	23.0
+chr2	221772	1.0	0.0	1.0
+chr2	221774	1.0	11.0	12.0
+chr2	221777	2.0	0.0	2.0
+chr2	221779	0.0	5.0	5.0
+chr2	221780	0.0	5.0	5.0
+chr2	221783	0.0	1.0	1.0
+chr2	221785	1.0	0.0	1.0
+chr2	221787	2.0	0.0	2.0
+chr2	221788	1.0	1.0	2.0
+chr2	221789	1.0	0.0	1.0
+chr2	221790	0.0	3.0	3.0
+chr2	221793	0.0	19.0	19.0
+chr2	221794	0.0	12.0	12.0
+chr2	221795	7.0	1.0	8.0
+chr2	221796	2.0	0.0	2.0
+chr2	221798	0.0	6.0	6.0
+chr2	221800	1.0	9.0	10.0
+chr2	221801	0.0	7.0	7.0
+chr2	221802	5.0	1.0	6.0
+chr2	221803	5.0	20.0	25.0
+chr2	221804	3.0	8.0	11.0
+chr2	221805	0.0	1.0	1.0
+chr2	221806	0.0	3.0	3.0
+chr2	221808	0.0	1.0	1.0
+chr2	221809	1.0	2.0	3.0
+chr2	221812	0.0	4.0	4.0
+chr2	221813	1.0	11.0	12.0
+chr2	221814	0.0	12.0	12.0
+chr2	221815	0.0	19.0	19.0
+chr2	221816	4.0	0.0	4.0
+chr2	221817	0.0	1.0	1.0
+chr2	221818	0.0	10.0	10.0
+chr2	221819	1.0	0.0	1.0
+chr2	221820	1.0	1.0	2.0
+chr2	221822	2.0	0.0	2.0
+chr2	221824	0.0	1.0	1.0
+chr2	221827	0.0	5.0	5.0
+chr2	221828	0.0	2.0	2.0
+chr2	221830	0.0	1.0	1.0
+chr2	221831	0.0	1.0	1.0
+chr2	221838	5.0	0.0	5.0
+chr2	221840	0.0	1.0	1.0
+chr2	221845	2.0	1.0	3.0
+chr2	221847	1.0	0.0	1.0
+chr2	221849	1.0	0.0	1.0
+chr2	221854	0.0	13.0	13.0
+chr2	221857	7.0	1.0	8.0
+chr2	221863	4.0	0.0	4.0
+chr2	221864	1.0	0.0	1.0
+chr2	221865	0.0	1.0	1.0
+chr2	221867	3.0	0.0	3.0
+chr2	221868	5.0	0.0	5.0
+chr2	221887	1.0	0.0	1.0
+chr2	221892	2.0	0.0	2.0
+chr2	221902	2.0	0.0	2.0
+chr2	221903	0.0	2.0	2.0
+chr2	221908	2.0	0.0	2.0
+chr2	221909	1.0	0.0	1.0
+chr2	221913	1.0	0.0	1.0
+chr2	221915	0.0	1.0	1.0
+chr2	221917	0.0	1.0	1.0
+chr2	221918	0.0	3.0	3.0
+chr2	221928	1.0	0.0	1.0
+chr2	221936	1.0	0.0	1.0
+chr2	221941	3.0	0.0	3.0
+chr2	221942	1.0	0.0	1.0
+chr2	221945	0.0	2.0	2.0
+chr2	221951	1.0	1.0	2.0
+chr2	221954	1.0	0.0	1.0
+chr2	221955	3.0	0.0	3.0
+chr2	221960	0.0	2.0	2.0
+chr2	221968	1.0	0.0	1.0
+chr2	221969	0.0	1.0	1.0
+chr2	221970	0.0	1.0	1.0
+chr2	221971	1.0	0.0	1.0
+chr2	221974	1.0	0.0	1.0
+chr2	221978	0.0	1.0	1.0
+chr2	221979	2.0	7.0	9.0
+chr2	221980	7.0	0.0	7.0
+chr2	221981	3.0	0.0	3.0
+chr2	221983	1.0	0.0	1.0
+chr2	221984	0.0	6.0	6.0
+chr2	221988	15.0	0.0	15.0
+chr2	221990	0.0	15.0	15.0
+chr2	221991	0.0	2.0	2.0
+chr2	221992	1.0	1.0	2.0
+chr2	221993	3.0	0.0	3.0
+chr2	221996	1.0	9.0	10.0
+chr2	222001	0.0	6.0	6.0
+chr2	222004	0.0	1.0	1.0
+chr2	222005	1.0	0.0	1.0
+chr2	222007	0.0	1.0	1.0
+chr2	222008	2.0	2.0	4.0
+chr2	222009	0.0	1.0	1.0
+chr2	222018	1.0	0.0	1.0
+chr2	222019	0.0	3.0	3.0
+chr2	222020	0.0	6.0	6.0
+chr2	222022	9.0	0.0	9.0
+chr2	222023	0.0	1.0	1.0
+chr2	222026	1.0	0.0	1.0
+chr2	222032	1.0	0.0	1.0
+chr2	222037	2.0	0.0	2.0
+chr2	222038	0.0	4.0	4.0
+chr2	222040	1.0	1.0	2.0
+chr2	222042	0.0	1.0	1.0
+chr2	222044	2.0	3.0	5.0
+chr2	222045	0.0	1.0	1.0
+chr2	222046	2.0	0.0	2.0
+chr2	222047	3.0	6.0	9.0
+chr2	222051	2.0	3.0	5.0
+chr2	222053	1.0	0.0	1.0
+chr2	222055	0.0	1.0	1.0
+chr2	222056	0.0	2.0	2.0
+chr2	222057	1.0	1.0	2.0
+chr2	222058	0.0	2.0	2.0
+chr2	222062	0.0	1.0	1.0
+chr2	222064	0.0	4.0	4.0
+chr2	222065	0.0	3.0	3.0
+chr2	222066	1.0	1.0	2.0
+chr2	222070	10.0	0.0	10.0
+chr2	222079	0.0	3.0	3.0
+chr2	222082	1.0	2.0	3.0
+chr2	222083	2.0	0.0	2.0
+chr2	222085	5.0	0.0	5.0
+chr2	222086	3.0	13.0	16.0
+chr2	222087	0.0	1.0	1.0
+chr2	222088	1.0	0.0	1.0
+chr2	222109	5.0	0.0	5.0
+chr2	222130	0.0	1.0	1.0
+chr2	222132	1.0	3.0	4.0
+chr2	222133	0.0	1.0	1.0
+chr2	222136	0.0	2.0	2.0
+chr2	222138	0.0	3.0	3.0
+chr2	222140	1.0	0.0	1.0
+chr2	222144	3.0	0.0	3.0
+chr2	222145	0.0	1.0	1.0
+chr2	222147	1.0	0.0	1.0
+chr2	222148	1.0	0.0	1.0
+chr2	222151	2.0	0.0	2.0
+chr2	222154	0.0	4.0	4.0
+chr2	222155	1.0	2.0	3.0
+chr2	222158	6.0	0.0	6.0
+chr2	222159	1.0	0.0	1.0
+chr2	222161	2.0	0.0	2.0
+chr2	222162	3.0	1.0	4.0
+chr2	222163	0.0	15.0	15.0
+chr2	222164	0.0	4.0	4.0
+chr2	222165	0.0	3.0	3.0
+chr2	222166	0.0	6.0	6.0
+chr2	222168	0.0	2.0	2.0
+chr2	222169	0.0	1.0	1.0
+chr2	222172	0.0	6.0	6.0
+chr2	222173	0.0	1.0	1.0
+chr2	222174	1.0	6.0	7.0
+chr2	222175	0.0	1.0	1.0
+chr2	222177	25.0	0.0	25.0
+chr2	222178	0.0	3.0	3.0
+chr2	222179	4.0	0.0	4.0
+chr2	222180	6.0	0.0	6.0
+chr2	222181	10.0	0.0	10.0
+chr2	222182	0.0	3.0	3.0
+chr2	222186	4.0	0.0	4.0
+chr2	222187	1.0	0.0	1.0
+chr2	222188	2.0	1.0	3.0
+chr2	222190	2.0	1.0	3.0
+chr2	222191	0.0	11.0	11.0
+chr2	222192	1.0	5.0	6.0
+chr2	222193	0.0	1.0	1.0
+chr2	222194	0.0	3.0	3.0
+chr2	222195	2.0	0.0	2.0
+chr2	222196	1.0	0.0	1.0
+chr2	222197	4.0	0.0	4.0
+chr2	222202	0.0	1.0	1.0
+chr2	222204	0.0	1.0	1.0
+chr2	222206	3.0	0.0	3.0
+chr2	222207	0.0	1.0	1.0
+chr2	222208	0.0	1.0	1.0
+chr2	222209	0.0	4.0	4.0
+chr2	222213	1.0	1.0	2.0
+chr2	222214	1.0	0.0	1.0
+chr2	222215	9.0	0.0	9.0
+chr2	222217	0.0	2.0	2.0
+chr2	222218	0.0	11.0	11.0
+chr2	222220	0.0	1.0	1.0
+chr2	222221	0.0	1.0	1.0
+chr2	222223	0.0	2.0	2.0
+chr2	222228	5.0	0.0	5.0
+chr2	222232	0.0	7.0	7.0
+chr2	222234	1.0	0.0	1.0
+chr2	222235	1.0	0.0	1.0
+chr2	222237	1.0	0.0	1.0
+chr2	222238	2.0	0.0	2.0
+chr2	222239	3.0	0.0	3.0
+chr2	222243	7.0	0.0	7.0
+chr2	222245	0.0	1.0	1.0
+chr2	222246	2.0	0.0	2.0
+chr2	222249	0.0	3.0	3.0
+chr2	222271	1.0	0.0	1.0
+chr2	222272	0.0	1.0	1.0
+chr2	222286	0.0	1.0	1.0
+chr2	222290	0.0	1.0	1.0
+chr2	222293	1.0	0.0	1.0
+chr2	222313	0.0	1.0	1.0
+chr2	222316	1.0	0.0	1.0
+chr2	222320	1.0	0.0	1.0
+chr2	222322	1.0	0.0	1.0
+chr2	222323	0.0	1.0	1.0
+chr2	222324	1.0	0.0	1.0
+chr2	222346	1.0	0.0	1.0
+chr2	222365	0.0	2.0	2.0
+chr2	222369	2.0	0.0	2.0
+chr2	222385	2.0	0.0	2.0
+chr2	222407	0.0	1.0	1.0
+chr2	222414	2.0	0.0	2.0
+chr2	222415	0.0	1.0	1.0
+chr2	222461	0.0	4.0	4.0
+chr2	222475	0.0	1.0	1.0
+chr2	222486	1.0	0.0	1.0
+chr2	222494	1.0	0.0	1.0
+chr2	222498	0.0	1.0	1.0
+chr2	222502	1.0	0.0	1.0
+chr2	222503	2.0	0.0	2.0
+chr2	222505	1.0	0.0	1.0
+chr2	222508	1.0	0.0	1.0
+chr2	222516	4.0	0.0	4.0
+chr2	222522	1.0	0.0	1.0
+chr2	222542	0.0	2.0	2.0
+chr2	222555	1.0	0.0	1.0
+chr2	222558	0.0	2.0	2.0
+chr2	222563	0.0	1.0	1.0
+chr2	222564	0.0	2.0	2.0
+chr2	222570	0.0	1.0	1.0
+chr2	222571	0.0	1.0	1.0
+chr2	222573	0.0	3.0	3.0
+chr2	222580	1.0	0.0	1.0
+chr2	222592	0.0	1.0	1.0
+chr2	222593	3.0	0.0	3.0
+chr2	222594	1.0	0.0	1.0
+chr2	222612	1.0	0.0	1.0
+chr2	222613	0.0	1.0	1.0
+chr2	222615	2.0	1.0	3.0
+chr2	222663	0.0	1.0	1.0
+chr2	222664	0.0	1.0	1.0
+chr2	222665	0.0	1.0	1.0
+chr2	222666	1.0	0.0	1.0
+chr2	222668	2.0	0.0	2.0
+chr2	222669	1.0	0.0	1.0
+chr2	222671	2.0	0.0	2.0
+chr2	222674	1.0	0.0	1.0
+chr2	222678	0.0	4.0	4.0
+chr2	222679	0.0	1.0	1.0
+chr2	222685	0.0	1.0	1.0
+chr2	222694	0.0	5.0	5.0
+chr2	222696	4.0	0.0	4.0
+chr2	222697	1.0	1.0	2.0
+chr2	222701	0.0	1.0	1.0
+chr2	222707	0.0	2.0	2.0
+chr2	222708	2.0	0.0	2.0
+chr2	222710	1.0	4.0	5.0
+chr2	222711	0.0	1.0	1.0
+chr2	222712	1.0	0.0	1.0
+chr2	222724	1.0	0.0	1.0
+chr2	222729	0.0	2.0	2.0
+chr2	222732	0.0	1.0	1.0
+chr2	222736	3.0	0.0	3.0
+chr2	222737	0.0	1.0	1.0
+chr2	222745	1.0	2.0	3.0
+chr2	222754	0.0	2.0	2.0
+chr2	222756	1.0	0.0	1.0
+chr2	222768	1.0	0.0	1.0
+chr2	222788	1.0	0.0	1.0
+chr2	222791	0.0	1.0	1.0
+chr2	222796	0.0	1.0	1.0
+chr2	222824	1.0	0.0	1.0
+chr2	222844	0.0	1.0	1.0
+chr2	222845	0.0	1.0	1.0
+chr2	222862	0.0	1.0	1.0
+chr2	222864	0.0	1.0	1.0
+chr2	222867	0.0	1.0	1.0
+chr2	222878	0.0	1.0	1.0
+chr2	222879	1.0	0.0	1.0
+chr2	222880	1.0	0.0	1.0
+chr2	222881	0.0	1.0	1.0
+chr2	222887	1.0	1.0	2.0
+chr2	222888	1.0	1.0	2.0
+chr2	222889	0.0	1.0	1.0
+chr2	222895	1.0	0.0	1.0
+chr2	222897	1.0	0.0	1.0
+chr2	222898	0.0	1.0	1.0
+chr2	222901	1.0	0.0	1.0
+chr2	222902	2.0	0.0	2.0
+chr2	222903	3.0	0.0	3.0
+chr2	222907	0.0	1.0	1.0
+chr2	222908	1.0	0.0	1.0
+chr2	222916	0.0	3.0	3.0
+chr2	222920	1.0	0.0	1.0
+chr2	222928	0.0	1.0	1.0
+chr2	222933	0.0	4.0	4.0
+chr2	222953	0.0	1.0	1.0
+chr2	222957	0.0	1.0	1.0
+chr2	222977	3.0	0.0	3.0
+chr2	222978	1.0	0.0	1.0
+chr2	222982	0.0	1.0	1.0
+chr2	222983	0.0	1.0	1.0
+chr2	222988	1.0	0.0	1.0
+chr2	223001	0.0	1.0	1.0
+chr2	223018	3.0	0.0	3.0
+chr2	223023	0.0	1.0	1.0
+chr2	223025	0.0	1.0	1.0
+chr2	223034	0.0	1.0	1.0
+chr2	223035	0.0	1.0	1.0
+chr2	223038	1.0	0.0	1.0
+chr2	223042	0.0	1.0	1.0
+chr2	223043	1.0	0.0	1.0
+chr2	223048	1.0	1.0	2.0
+chr2	223056	1.0	0.0	1.0
+chr2	223076	1.0	3.0	4.0
+chr2	223085	1.0	0.0	1.0
+chr2	223088	0.0	1.0	1.0
+chr2	223102	0.0	1.0	1.0
+chr2	223107	1.0	0.0	1.0
+chr2	223115	0.0	1.0	1.0
+chr2	223122	0.0	2.0	2.0
+chr2	223125	0.0	1.0	1.0
+chr2	223131	0.0	1.0	1.0
+chr2	223140	1.0	0.0	1.0
+chr2	223155	1.0	0.0	1.0
+chr2	223156	0.0	3.0	3.0
+chr2	223174	2.0	0.0	2.0
+chr2	223184	14.0	0.0	14.0
+chr2	223185	1.0	0.0	1.0
+chr2	223186	1.0	0.0	1.0
+chr2	223190	3.0	1.0	4.0
+chr2	223196	1.0	0.0	1.0
+chr2	223200	0.0	1.0	1.0
+chr2	223210	0.0	2.0	2.0
+chr2	223215	0.0	1.0	1.0
+chr2	223227	0.0	1.0	1.0
+chr2	223231	1.0	0.0	1.0
+chr2	223241	1.0	0.0	1.0
+chr2	223243	0.0	1.0	1.0
+chr2	223249	0.0	1.0	1.0
+chr2	223255	1.0	0.0	1.0
+chr2	223262	1.0	0.0	1.0
+chr2	223272	1.0	0.0	1.0
+chr2	223274	0.0	2.0	2.0
+chr2	223281	1.0	0.0	1.0
+chr2	223284	0.0	2.0	2.0
+chr2	223305	1.0	0.0	1.0
+chr2	223311	0.0	6.0	6.0
+chr2	223315	3.0	0.0	3.0
+chr2	223324	2.0	0.0	2.0
+chr2	223329	1.0	0.0	1.0
+chr2	223331	1.0	0.0	1.0
+chr2	223337	1.0	0.0	1.0
+chr2	223349	1.0	0.0	1.0
+chr2	223359	0.0	2.0	2.0
+chr2	223362	1.0	0.0	1.0
+chr2	223366	0.0	1.0	1.0
+chr2	223367	0.0	1.0	1.0
+chr2	223379	1.0	0.0	1.0
+chr2	223390	1.0	0.0	1.0
+chr2	223392	1.0	0.0	1.0
+chr2	223404	0.0	1.0	1.0
+chr2	223412	0.0	1.0	1.0
+chr2	223414	2.0	0.0	2.0
+chr2	223418	1.0	0.0	1.0
+chr2	223420	0.0	3.0	3.0
+chr2	223425	3.0	0.0	3.0
+chr2	223448	0.0	1.0	1.0
+chr2	223451	0.0	4.0	4.0
+chr2	223474	2.0	0.0	2.0
+chr2	223475	1.0	0.0	1.0
+chr2	223479	2.0	0.0	2.0
+chr2	223480	1.0	0.0	1.0
+chr2	223482	1.0	1.0	2.0
+chr2	223483	0.0	1.0	1.0
+chr2	223486	0.0	1.0	1.0
+chr2	223495	1.0	0.0	1.0
+chr2	223496	2.0	0.0	2.0
+chr2	223513	0.0	1.0	1.0
+chr2	223515	1.0	0.0	1.0
+chr2	223518	2.0	0.0	2.0
+chr2	223523	0.0	1.0	1.0
+chr2	223524	0.0	2.0	2.0
+chr2	223529	1.0	0.0	1.0
+chr2	223534	1.0	0.0	1.0
+chr2	223535	0.0	1.0	1.0
+chr2	223537	2.0	0.0	2.0
+chr2	223544	4.0	0.0	4.0
+chr2	223574	1.0	0.0	1.0
+chr2	223575	0.0	1.0	1.0
+chr2	223577	1.0	0.0	1.0
+chr2	223592	0.0	3.0	3.0
+chr2	223604	1.0	0.0	1.0
+chr2	223610	1.0	0.0	1.0
+chr2	223614	0.0	1.0	1.0
+chr2	223634	1.0	0.0	1.0
+chr2	223636	1.0	0.0	1.0
+chr2	223639	2.0	0.0	2.0
+chr2	223650	0.0	2.0	2.0
+chr2	223657	0.0	1.0	1.0
+chr2	223665	1.0	0.0	1.0
+chr2	223666	0.0	1.0	1.0
+chr2	223672	1.0	2.0	3.0
+chr2	223677	1.0	0.0	1.0
+chr2	223678	1.0	0.0	1.0
+chr2	223683	1.0	0.0	1.0
+chr2	223684	1.0	0.0	1.0
+chr2	223687	1.0	0.0	1.0
+chr2	223689	0.0	1.0	1.0
+chr2	223699	0.0	1.0	1.0
+chr2	223742	2.0	0.0	2.0
+chr2	223747	0.0	2.0	2.0
+chr2	223771	1.0	0.0	1.0
+chr2	223794	0.0	2.0	2.0
+chr2	223808	0.0	2.0	2.0
+chr2	223830	1.0	0.0	1.0
+chr2	223831	0.0	1.0	1.0
+chr2	223840	0.0	1.0	1.0
+chr2	223842	0.0	1.0	1.0
+chr2	223848	1.0	0.0	1.0
+chr2	223849	2.0	0.0	2.0
+chr2	223850	0.0	1.0	1.0
+chr2	223852	0.0	1.0	1.0
+chr2	223853	1.0	0.0	1.0
+chr2	223854	0.0	3.0	3.0
+chr2	223855	1.0	0.0	1.0
+chr2	223856	1.0	1.0	2.0
+chr2	223859	0.0	1.0	1.0
+chr2	223860	1.0	0.0	1.0
+chr2	223864	1.0	0.0	1.0
+chr2	223867	0.0	1.0	1.0
+chr2	223869	1.0	1.0	2.0
+chr2	223877	0.0	1.0	1.0
+chr2	223893	2.0	0.0	2.0
+chr2	223895	1.0	0.0	1.0
+chr2	223906	0.0	1.0	1.0
+chr2	223912	0.0	2.0	2.0
+chr2	223914	1.0	0.0	1.0
+chr2	223920	0.0	1.0	1.0
+chr2	223921	2.0	0.0	2.0
+chr2	223930	1.0	0.0	1.0
+chr2	223938	1.0	0.0	1.0
+chr2	223943	0.0	1.0	1.0
+chr2	223949	1.0	0.0	1.0
+chr2	223954	0.0	1.0	1.0
+chr2	223959	2.0	0.0	2.0
+chr2	223960	0.0	1.0	1.0
+chr2	223996	0.0	2.0	2.0
+chr2	223998	2.0	0.0	2.0
+chr2	223999	0.0	1.0	1.0
+chr2	224009	0.0	1.0	1.0
+chr2	224013	0.0	2.0	2.0
+chr2	224029	0.0	3.0	3.0
+chr2	224039	1.0	0.0	1.0
+chr2	224048	0.0	1.0	1.0
+chr2	224050	0.0	1.0	1.0
+chr2	224052	0.0	1.0	1.0
+chr2	224056	0.0	1.0	1.0
+chr2	224066	1.0	0.0	1.0
+chr2	224067	0.0	1.0	1.0
+chr2	224070	2.0	0.0	2.0
+chr2	224108	1.0	0.0	1.0
+chr2	224109	1.0	0.0	1.0
+chr2	224130	1.0	0.0	1.0
+chr2	224149	0.0	1.0	1.0
+chr2	224153	0.0	1.0	1.0
+chr2	224167	0.0	3.0	3.0
+chr2	224169	0.0	1.0	1.0
+chr2	224170	0.0	1.0	1.0
+chr2	224176	0.0	1.0	1.0
+chr2	224178	1.0	0.0	1.0
+chr2	224194	0.0	2.0	2.0
+chr2	224201	0.0	1.0	1.0
+chr2	224216	0.0	1.0	1.0
+chr2	224219	0.0	1.0	1.0
+chr2	224228	1.0	0.0	1.0
+chr2	224238	1.0	0.0	1.0
+chr2	224245	0.0	1.0	1.0
+chr2	224250	1.0	0.0	1.0
+chr2	224269	0.0	1.0	1.0
+chr2	224277	1.0	0.0	1.0
+chr2	224284	0.0	1.0	1.0
+chr2	224290	0.0	2.0	2.0
+chr2	224296	1.0	0.0	1.0
+chr2	224317	0.0	1.0	1.0
+chr2	224318	0.0	2.0	2.0
+chr2	224322	0.0	2.0	2.0
+chr2	224323	0.0	2.0	2.0
+chr2	224370	0.0	1.0	1.0
+chr2	224372	1.0	0.0	1.0
+chr2	224389	0.0	2.0	2.0
+chr2	224392	1.0	0.0	1.0
+chr2	224420	0.0	1.0	1.0
+chr2	224425	0.0	1.0	1.0
+chr2	224429	0.0	1.0	1.0
+chr2	224440	1.0	0.0	1.0
+chr2	224442	1.0	3.0	4.0
+chr2	224446	0.0	2.0	2.0
+chr2	224455	1.0	0.0	1.0
+chr2	224473	0.0	2.0	2.0
+chr2	224478	1.0	0.0	1.0
+chr2	224481	2.0	0.0	2.0
+chr2	224500	1.0	0.0	1.0
+chr2	224524	0.0	1.0	1.0
+chr2	224527	0.0	1.0	1.0
+chr2	224528	0.0	1.0	1.0
+chr2	224550	0.0	1.0	1.0
+chr2	224556	0.0	1.0	1.0
+chr2	224561	0.0	1.0	1.0
+chr2	224566	1.0	0.0	1.0
+chr2	224579	2.0	0.0	2.0
+chr2	224593	0.0	1.0	1.0
+chr2	224609	0.0	1.0	1.0
+chr2	224617	0.0	1.0	1.0
+chr2	224634	0.0	1.0	1.0
+chr2	224646	1.0	0.0	1.0
+chr2	224647	1.0	0.0	1.0
+chr2	224679	1.0	0.0	1.0
+chr2	224688	0.0	1.0	1.0
+chr2	224729	0.0	1.0	1.0
+chr2	224738	0.0	1.0	1.0
+chr2	224774	0.0	1.0	1.0
+chr2	224776	1.0	1.0	2.0
+chr2	224790	1.0	0.0	1.0
+chr2	224791	2.0	0.0	2.0
+chr2	224805	0.0	1.0	1.0
+chr2	224809	1.0	0.0	1.0
+chr2	224825	1.0	0.0	1.0
+chr2	224854	1.0	0.0	1.0
+chr2	224886	1.0	0.0	1.0
+chr2	224908	0.0	1.0	1.0
+chr2	224915	1.0	0.0	1.0
+chr2	224923	1.0	0.0	1.0
+chr2	224932	0.0	1.0	1.0
+chr2	224935	2.0	0.0	2.0
+chr2	224936	0.0	1.0	1.0
+chr2	224959	0.0	1.0	1.0
+chr2	224964	1.0	0.0	1.0
+chr2	224980	1.0	1.0	2.0
+chr2	225003	0.0	1.0	1.0
+chr2	225021	1.0	0.0	1.0
+chr2	225027	0.0	1.0	1.0
+chr2	225039	0.0	1.0	1.0
+chr2	225045	1.0	0.0	1.0
+chr2	225047	0.0	1.0	1.0
+chr2	225054	1.0	0.0	1.0
+chr2	225066	1.0	0.0	1.0
+chr2	225070	0.0	1.0	1.0
+chr2	225071	0.0	1.0	1.0
+chr2	225083	1.0	0.0	1.0
+chr2	225100	0.0	1.0	1.0
+chr2	225118	0.0	1.0	1.0
+chr2	225148	1.0	0.0	1.0
+chr2	225157	1.0	0.0	1.0
+chr2	225170	1.0	0.0	1.0
+chr2	225174	1.0	0.0	1.0
+chr2	225215	1.0	0.0	1.0
+chr2	225216	0.0	1.0	1.0
+chr2	225223	1.0	0.0	1.0
+chr2	225231	0.0	2.0	2.0
+chr2	225234	1.0	0.0	1.0
+chr2	225236	0.0	1.0	1.0
+chr2	225250	2.0	0.0	2.0
+chr2	225260	1.0	0.0	1.0
+chr2	225262	0.0	1.0	1.0
+chr2	225265	0.0	3.0	3.0
+chr2	225272	0.0	1.0	1.0
+chr2	225275	1.0	0.0	1.0
+chr2	225280	0.0	2.0	2.0
+chr2	225284	1.0	0.0	1.0
+chr2	225285	1.0	0.0	1.0
+chr2	225292	1.0	0.0	1.0
+chr2	225295	0.0	1.0	1.0
+chr2	225301	2.0	0.0	2.0
+chr2	225302	1.0	0.0	1.0
+chr2	225303	1.0	0.0	1.0
+chr2	225312	1.0	0.0	1.0
+chr2	225314	1.0	0.0	1.0
+chr2	225369	1.0	0.0	1.0
+chr2	225397	1.0	0.0	1.0
+chr2	225405	0.0	1.0	1.0
+chr2	225417	0.0	1.0	1.0
+chr2	225434	0.0	1.0	1.0
+chr2	225440	2.0	0.0	2.0
+chr2	225450	1.0	0.0	1.0
+chr2	225458	0.0	1.0	1.0
+chr2	225491	1.0	0.0	1.0
+chr2	225492	1.0	0.0	1.0
+chr2	225493	1.0	0.0	1.0
+chr2	225501	0.0	2.0	2.0
+chr2	225515	2.0	0.0	2.0
+chr2	225518	1.0	0.0	1.0
+chr2	225519	1.0	0.0	1.0
+chr2	225523	0.0	1.0	1.0
+chr2	225524	1.0	0.0	1.0
+chr2	225537	0.0	5.0	5.0
+chr2	225544	0.0	1.0	1.0
+chr2	225557	1.0	0.0	1.0
+chr2	225562	0.0	1.0	1.0
+chr2	225617	0.0	1.0	1.0
+chr2	225620	1.0	0.0	1.0
+chr2	225753	0.0	1.0	1.0
+chr2	225769	0.0	1.0	1.0
+chr2	225788	1.0	0.0	1.0
+chr2	225793	2.0	0.0	2.0
+chr2	225804	1.0	1.0	2.0
+chr2	225823	1.0	0.0	1.0
+chr2	225828	0.0	1.0	1.0
+chr2	225841	0.0	1.0	1.0
+chr2	225843	0.0	1.0	1.0
+chr2	225844	1.0	0.0	1.0
+chr2	225848	0.0	1.0	1.0
+chr2	225860	1.0	0.0	1.0
+chr2	225866	0.0	1.0	1.0
+chr2	225873	1.0	0.0	1.0
+chr2	225877	1.0	0.0	1.0
+chr2	225878	0.0	1.0	1.0
+chr2	225879	1.0	1.0	2.0
+chr2	225883	1.0	0.0	1.0
+chr2	225888	0.0	1.0	1.0
+chr2	225892	0.0	1.0	1.0
+chr2	225895	1.0	0.0	1.0
+chr2	225896	1.0	0.0	1.0
+chr2	225919	0.0	1.0	1.0
+chr2	225931	1.0	0.0	1.0
+chr2	225932	1.0	0.0	1.0
+chr2	225953	1.0	0.0	1.0
+chr2	225960	0.0	1.0	1.0
+chr2	226000	1.0	0.0	1.0
+chr2	226026	0.0	1.0	1.0
+chr2	226027	1.0	0.0	1.0
+chr2	226066	0.0	1.0	1.0
+chr2	226076	1.0	0.0	1.0
+chr2	226115	1.0	0.0	1.0
+chr2	226126	0.0	1.0	1.0
+chr2	226147	0.0	1.0	1.0
+chr2	226180	3.0	0.0	3.0
+chr2	226182	1.0	0.0	1.0
+chr2	226225	0.0	1.0	1.0
+chr2	226229	1.0	0.0	1.0
+chr2	226230	1.0	0.0	1.0
+chr2	226232	0.0	1.0	1.0
+chr2	226233	0.0	1.0	1.0
+chr2	226244	2.0	0.0	2.0
+chr2	226245	1.0	0.0	1.0
+chr2	226257	0.0	1.0	1.0
+chr2	226258	1.0	0.0	1.0
+chr2	226288	1.0	0.0	1.0
+chr2	226303	0.0	1.0	1.0
+chr2	226316	3.0	0.0	3.0
+chr2	226325	1.0	0.0	1.0
+chr2	226331	0.0	2.0	2.0
+chr2	226333	0.0	1.0	1.0
+chr2	226334	0.0	1.0	1.0
+chr2	226451	1.0	0.0	1.0
+chr2	226474	1.0	0.0	1.0
+chr2	226502	1.0	0.0	1.0
+chr2	226503	0.0	1.0	1.0
+chr2	226524	1.0	0.0	1.0
+chr2	226529	0.0	2.0	2.0
+chr2	226533	1.0	0.0	1.0
+chr2	226551	2.0	0.0	2.0
+chr2	226554	0.0	1.0	1.0
+chr2	226557	0.0	1.0	1.0
+chr2	226578	0.0	1.0	1.0
+chr2	226600	0.0	1.0	1.0
+chr2	226650	0.0	1.0	1.0
+chr2	226658	0.0	1.0	1.0
+chr2	226661	0.0	1.0	1.0
+chr2	226662	0.0	1.0	1.0
+chr2	226663	0.0	1.0	1.0
+chr2	226672	0.0	2.0	2.0
+chr2	226674	0.0	3.0	3.0
+chr2	226677	0.0	1.0	1.0
+chr2	226685	0.0	2.0	2.0
+chr2	226686	0.0	1.0	1.0
+chr2	226689	0.0	4.0	4.0
+chr2	226690	0.0	4.0	4.0
+chr2	226695	0.0	1.0	1.0
+chr2	226697	9.0	0.0	9.0
+chr2	226698	0.0	1.0	1.0
+chr2	226700	1.0	1.0	2.0
+chr2	226701	0.0	2.0	2.0
+chr2	226702	0.0	1.0	1.0
+chr2	226703	0.0	1.0	1.0
+chr2	226708	2.0	0.0	2.0
+chr2	226709	0.0	1.0	1.0
+chr2	226711	1.0	2.0	3.0
+chr2	226714	2.0	0.0	2.0
+chr2	226718	1.0	0.0	1.0
+chr2	226719	0.0	1.0	1.0
+chr2	226722	0.0	2.0	2.0
+chr2	226723	0.0	1.0	1.0
+chr2	226729	0.0	2.0	2.0
+chr2	226732	0.0	1.0	1.0
+chr2	226736	0.0	1.0	1.0
+chr2	226739	0.0	1.0	1.0
+chr2	226743	1.0	0.0	1.0
+chr2	226746	0.0	2.0	2.0
+chr2	226747	0.0	1.0	1.0
+chr2	226748	1.0	1.0	2.0
+chr2	226751	1.0	0.0	1.0
+chr2	226753	2.0	0.0	2.0
+chr2	226754	0.0	2.0	2.0
+chr2	226758	1.0	0.0	1.0
+chr2	226759	1.0	0.0	1.0
+chr2	226760	1.0	0.0	1.0
+chr2	226761	1.0	0.0	1.0
+chr2	226762	1.0	0.0	1.0
+chr2	226769	0.0	1.0	1.0
+chr2	226770	1.0	0.0	1.0
+chr2	226775	0.0	2.0	2.0
+chr2	226776	2.0	2.0	4.0
+chr2	226779	0.0	1.0	1.0
+chr2	226780	0.0	2.0	2.0
+chr2	226781	0.0	1.0	1.0
+chr2	226782	0.0	2.0	2.0
+chr2	226786	1.0	0.0	1.0
+chr2	226788	2.0	0.0	2.0
+chr2	226798	0.0	1.0	1.0
+chr2	226802	0.0	3.0	3.0
+chr2	226804	0.0	2.0	2.0
+chr2	226805	0.0	4.0	4.0
+chr2	226813	0.0	1.0	1.0
+chr2	226814	0.0	1.0	1.0
+chr2	226815	0.0	1.0	1.0
+chr2	226820	1.0	0.0	1.0
+chr2	226826	0.0	1.0	1.0
+chr2	226832	0.0	1.0	1.0
+chr2	226836	1.0	0.0	1.0
+chr2	226843	2.0	0.0	2.0
+chr2	226844	2.0	0.0	2.0
+chr2	226851	1.0	0.0	1.0
+chr2	226859	0.0	1.0	1.0
+chr2	226862	1.0	1.0	2.0
+chr2	226863	1.0	0.0	1.0
+chr2	226864	3.0	1.0	4.0
+chr2	226870	0.0	2.0	2.0
+chr2	226872	2.0	0.0	2.0
+chr2	226875	0.0	4.0	4.0
+chr2	226878	1.0	0.0	1.0
+chr2	226880	1.0	0.0	1.0
+chr2	226882	0.0	4.0	4.0
+chr2	226884	1.0	0.0	1.0
+chr2	226888	1.0	0.0	1.0
+chr2	226890	1.0	0.0	1.0
+chr2	226892	1.0	0.0	1.0
+chr2	226893	1.0	0.0	1.0
+chr2	226894	1.0	0.0	1.0
+chr2	226896	1.0	0.0	1.0
+chr2	226897	1.0	0.0	1.0
+chr2	226901	1.0	0.0	1.0
+chr2	226904	1.0	0.0	1.0
+chr2	226905	17.0	0.0	17.0
+chr2	226906	5.0	0.0	5.0
+chr2	226908	1.0	0.0	1.0
+chr2	226909	3.0	0.0	3.0
+chr2	226911	1.0	0.0	1.0
+chr2	226914	1.0	0.0	1.0
+chr2	226915	1.0	0.0	1.0
+chr2	226918	1.0	0.0	1.0
+chr2	226919	3.0	0.0	3.0
+chr2	226922	1.0	0.0	1.0
+chr2	226923	1.0	0.0	1.0
+chr2	226929	1.0	0.0	1.0
+chr2	226930	1.0	0.0	1.0
+chr2	226934	2.0	0.0	2.0
+chr2	227251	1.0	0.0	1.0
+chr2	227252	1.0	0.0	1.0
+chr2	227253	1.0	0.0	1.0
+chr2	227255	1.0	0.0	1.0
+chr2	227257	0.0	1.0	1.0
+chr2	227261	0.0	1.0	1.0
+chr2	227263	1.0	3.0	4.0
+chr2	227264	0.0	1.0	1.0
+chr2	227269	1.0	0.0	1.0
+chr2	227570	2.0	0.0	2.0
+chr2	227574	1.0	0.0	1.0
+chr2	227584	1.0	0.0	1.0
+chr2	227587	0.0	1.0	1.0
+chr2	227589	0.0	1.0	1.0
+chr2	227621	1.0	0.0	1.0
+chr2	227740	1.0	0.0	1.0
+chr2	227745	1.0	0.0	1.0
+chr2	227761	0.0	1.0	1.0
+chr2	228151	0.0	1.0	1.0
+chr2	228266	0.0	1.0	1.0
+chr2	228418	1.0	0.0	1.0
+chr2	228632	0.0	1.0	1.0
+chr2	229460	2.0	0.0	2.0
+chr2	229555	0.0	1.0	1.0
+chr2	229864	0.0	1.0	1.0
+chr2	231555	0.0	1.0	1.0
+chr2	231849	0.0	1.0	1.0
+chr2	232003	1.0	0.0	1.0
+chr2	232004	1.0	0.0	1.0
+chr2	232662	1.0	0.0	1.0
+chr2	232753	1.0	0.0	1.0
+chr2	233002	0.0	1.0	1.0
+chr2	233052	0.0	1.0	1.0
+chr2	234250	0.0	1.0	1.0
+chr2	234426	0.0	2.0	2.0
+chr2	234847	0.0	1.0	1.0
+chr2	235418	1.0	0.0	1.0
+chr2	235451	0.0	1.0	1.0
+chr2	235580	1.0	0.0	1.0
+chr2	235584	0.0	1.0	1.0
+chr2	235615	0.0	2.0	2.0
+chr2	235632	1.0	0.0	1.0
+chr2	235643	0.0	1.0	1.0
+chr2	235671	0.0	1.0	1.0
+chr2	235694	1.0	0.0	1.0
+chr2	235699	0.0	2.0	2.0
+chr2	235700	0.0	1.0	1.0
+chr2	235708	0.0	1.0	1.0
+chr2	235715	1.0	0.0	1.0
+chr2	235721	0.0	1.0	1.0
+chr2	235722	0.0	1.0	1.0
+chr2	235728	1.0	0.0	1.0
+chr2	235777	0.0	1.0	1.0
+chr2	235964	1.0	0.0	1.0
+chr2	236505	2.0	0.0	2.0
+chr2	236520	0.0	1.0	1.0
+chr2	236529	0.0	1.0	1.0
+chr2	236536	1.0	0.0	1.0
+chr2	236544	0.0	1.0	1.0
+chr2	236548	1.0	0.0	1.0
+chr2	236551	0.0	1.0	1.0
+chr2	236561	0.0	1.0	1.0
+chr2	236592	0.0	1.0	1.0
+chr2	236593	0.0	1.0	1.0
+chr2	236617	2.0	0.0	2.0
+chr2	236686	0.0	2.0	2.0
+chr2	236856	0.0	2.0	2.0
+chr2	237272	1.0	1.0	2.0
+chr2	237281	0.0	3.0	3.0
+chr2	237288	2.0	0.0	2.0
+chr2	237299	0.0	1.0	1.0
+chr2	237319	0.0	1.0	1.0
+chr2	237330	1.0	0.0	1.0
+chr2	237419	2.0	0.0	2.0
+chr2	237432	1.0	0.0	1.0
+chr2	237454	1.0	0.0	1.0
+chr2	237457	1.0	0.0	1.0
+chr2	237461	0.0	1.0	1.0
+chr2	237469	1.0	0.0	1.0
+chr2	237473	0.0	2.0	2.0
+chr2	237476	0.0	1.0	1.0
+chr2	237480	1.0	0.0	1.0
+chr2	237483	0.0	1.0	1.0
+chr2	237487	0.0	2.0	2.0
+chr2	237489	0.0	1.0	1.0
+chr2	237491	0.0	1.0	1.0
+chr2	237556	1.0	0.0	1.0
+chr2	237730	2.0	0.0	2.0
+chr2	237741	0.0	1.0	1.0
+chr2	237744	0.0	1.0	1.0
+chr2	237754	1.0	0.0	1.0
+chr2	238059	0.0	1.0	1.0
+chr2	238078	1.0	0.0	1.0
+chr2	238102	1.0	0.0	1.0
+chr2	238103	1.0	0.0	1.0
+chr2	238480	0.0	1.0	1.0
+chr2	238520	2.0	0.0	2.0
+chr2	238525	0.0	3.0	3.0
+chr2	238526	2.0	5.0	7.0
+chr2	238527	1.0	0.0	1.0
+chr2	238536	0.0	1.0	1.0
+chr2	238539	0.0	1.0	1.0
+chr2	238541	2.0	0.0	2.0
+chr2	238542	1.0	1.0	2.0
+chr2	238544	0.0	1.0	1.0
+chr2	238545	1.0	0.0	1.0
+chr2	238561	0.0	1.0	1.0
+chr2	238572	0.0	1.0	1.0
+chr2	238661	0.0	1.0	1.0
+chr2	238677	1.0	0.0	1.0
+chr2	238684	0.0	1.0	1.0
+chr2	238685	0.0	1.0	1.0
+chr2	238690	0.0	1.0	1.0
+chr2	238699	2.0	0.0	2.0
+chr2	238700	1.0	1.0	2.0
+chr2	239054	0.0	1.0	1.0
+chr2	239055	1.0	0.0	1.0
+chr2	239070	1.0	0.0	1.0
+chr2	239209	1.0	0.0	1.0
+chr2	239218	0.0	1.0	1.0
+chr2	239248	0.0	1.0	1.0
+chr2	239307	0.0	1.0	1.0
+chr2	240403	0.0	1.0	1.0
+chr2	240428	0.0	1.0	1.0
+chr2	240548	1.0	0.0	1.0
+chr2	240583	0.0	1.0	1.0
+chr2	240592	0.0	1.0	1.0
+chr2	240593	0.0	1.0	1.0
+chr2	240765	1.0	0.0	1.0
+chr2	240824	1.0	0.0	1.0
+chr2	240883	1.0	0.0	1.0
+chr2	240905	1.0	0.0	1.0
+chr2	241072	0.0	1.0	1.0
+chr2	241199	1.0	0.0	1.0
+chr2	241200	1.0	0.0	1.0
+chr2	241202	1.0	0.0	1.0
+chr2	241207	0.0	2.0	2.0
+chr2	241211	0.0	2.0	2.0
+chr2	241219	1.0	0.0	1.0
+chr2	241221	0.0	2.0	2.0
+chr2	241285	0.0	1.0	1.0
+chr2	241723	1.0	0.0	1.0
+chr2	241840	2.0	0.0	2.0
+chr2	241855	1.0	0.0	1.0
+chr2	241972	1.0	0.0	1.0
+chr2	242009	0.0	1.0	1.0
+chr2	242060	1.0	0.0	1.0
+chr2	242183	0.0	1.0	1.0
+chr2	242188	0.0	1.0	1.0
+chr2	242202	1.0	0.0	1.0
+chr2	242234	1.0	0.0	1.0
+chr2	242354	2.0	0.0	2.0
+chr2	242356	0.0	1.0	1.0
+chr2	242365	1.0	0.0	1.0
+chr2	242447	1.0	0.0	1.0
+chr2	242477	0.0	3.0	3.0
+chr2	242506	1.0	0.0	1.0
+chr2	242512	1.0	0.0	1.0
+chr2	242513	1.0	1.0	2.0
+chr2	242514	1.0	0.0	1.0
+chr2	242517	1.0	0.0	1.0
+chr2	242522	0.0	2.0	2.0
+chr2	242531	1.0	0.0	1.0
+chr2	242534	1.0	2.0	3.0
+chr2	242535	1.0	1.0	2.0
+chr2	242536	0.0	3.0	3.0
+chr2	242542	0.0	2.0	2.0
+chr2	242543	3.0	1.0	4.0
+chr2	242546	2.0	0.0	2.0
+chr2	242552	1.0	1.0	2.0
+chr2	242574	1.0	0.0	1.0
+chr2	242772	0.0	1.0	1.0
+chr2	242811	0.0	3.0	3.0
+chr2	242821	0.0	3.0	3.0
+chr2	242823	0.0	1.0	1.0
+chr2	242824	1.0	0.0	1.0
+chr2	242825	4.0	0.0	4.0
+chr2	242827	1.0	0.0	1.0
+chr2	242830	1.0	0.0	1.0
+chr2	242831	2.0	0.0	2.0
+chr2	242833	2.0	0.0	2.0
+chr2	242834	0.0	1.0	1.0
+chr2	242836	0.0	3.0	3.0
+chr2	242837	0.0	4.0	4.0
+chr2	242838	1.0	1.0	2.0
+chr2	242839	6.0	0.0	6.0
+chr2	242840	0.0	3.0	3.0
+chr2	242843	1.0	0.0	1.0
+chr2	242844	1.0	3.0	4.0
+chr2	242845	0.0	1.0	1.0
+chr2	242847	3.0	0.0	3.0
+chr2	242849	1.0	0.0	1.0
+chr2	242851	1.0	0.0	1.0
+chr2	242852	0.0	3.0	3.0
+chr2	242857	1.0	0.0	1.0
+chr2	242862	1.0	0.0	1.0
+chr2	242973	1.0	0.0	1.0
+chr2	242974	0.0	1.0	1.0
+chr2	242976	0.0	2.0	2.0
+chr2	242990	1.0	0.0	1.0
+chr2	243002	0.0	1.0	1.0
+chr2	243003	0.0	1.0	1.0
+chr2	243019	0.0	1.0	1.0
+chr2	243020	0.0	1.0	1.0
+chr2	243027	2.0	0.0	2.0
+chr2	243112	0.0	1.0	1.0
+chr2	243159	0.0	1.0	1.0
+chr2	243169	1.0	0.0	1.0
+chr2	243186	0.0	1.0	1.0
+chr2	243377	0.0	1.0	1.0
+chr2	243487	1.0	0.0	1.0
+chr2	243496	1.0	0.0	1.0
+chr2	243503	0.0	1.0	1.0
+chr2	243531	1.0	0.0	1.0
+chr2	243558	1.0	0.0	1.0
+chr2	243660	0.0	1.0	1.0
+chr2	243678	1.0	0.0	1.0
+chr2	243687	3.0	0.0	3.0
+chr2	243943	0.0	1.0	1.0
+chr2	244405	0.0	2.0	2.0
+chr2	244496	0.0	1.0	1.0
+chr2	244581	0.0	1.0	1.0
+chr2	244731	1.0	0.0	1.0
+chr2	245020	0.0	2.0	2.0
+chr2	245454	1.0	0.0	1.0
+chr2	245591	0.0	1.0	1.0
+chr2	245598	1.0	0.0	1.0
+chr2	245604	1.0	0.0	1.0
+chr2	245609	1.0	0.0	1.0
+chr2	245611	2.0	0.0	2.0
+chr2	245619	1.0	0.0	1.0
+chr2	245620	1.0	0.0	1.0
+chr2	245623	1.0	0.0	1.0
+chr2	245628	0.0	1.0	1.0
+chr2	245630	2.0	0.0	2.0
+chr2	245631	1.0	2.0	3.0
+chr2	245638	0.0	1.0	1.0
+chr2	245639	1.0	0.0	1.0
+chr2	245640	0.0	2.0	2.0
+chr2	245642	3.0	0.0	3.0
+chr2	245646	1.0	0.0	1.0
+chr2	245660	0.0	1.0	1.0
+chr2	245886	3.0	0.0	3.0
+chr2	245887	9.0	0.0	9.0
+chr2	245888	0.0	5.0	5.0
+chr2	245893	3.0	0.0	3.0
+chr2	245899	1.0	2.0	3.0
+chr2	245900	0.0	1.0	1.0
+chr2	245905	0.0	1.0	1.0
+chr2	245913	1.0	0.0	1.0
+chr2	245947	2.0	0.0	2.0
+chr2	245977	0.0	1.0	1.0
+chr2	246047	1.0	0.0	1.0
+chr2	246054	0.0	1.0	1.0
+chr2	246069	2.0	0.0	2.0
+chr2	246203	3.0	0.0	3.0
+chr2	246205	1.0	0.0	1.0
+chr2	246220	0.0	1.0	1.0
+chr2	246436	1.0	0.0	1.0
+chr2	246443	3.0	0.0	3.0
+chr2	246487	1.0	0.0	1.0
+chr2	246502	0.0	1.0	1.0
+chr2	246519	0.0	1.0	1.0
+chr2	246533	1.0	0.0	1.0
+chr2	246534	0.0	1.0	1.0
+chr2	246633	0.0	1.0	1.0
+chr2	246639	0.0	1.0	1.0
+chr2	246902	0.0	1.0	1.0
+chr2	246905	1.0	0.0	1.0
+chr2	246910	5.0	0.0	5.0
+chr2	246914	0.0	2.0	2.0
+chr2	246915	0.0	1.0	1.0
+chr2	246923	0.0	1.0	1.0
+chr2	246924	1.0	0.0	1.0
+chr2	246927	0.0	1.0	1.0
+chr2	246930	0.0	1.0	1.0
+chr2	247070	0.0	1.0	1.0
+chr2	247088	3.0	0.0	3.0
+chr2	247102	1.0	0.0	1.0
+chr2	247121	0.0	1.0	1.0
+chr2	247135	1.0	0.0	1.0
+chr2	247222	1.0	0.0	1.0
+chr2	247270	1.0	0.0	1.0
+chr2	247274	0.0	1.0	1.0
+chr2	247371	0.0	1.0	1.0
+chr2	247385	0.0	2.0	2.0
+chr2	247399	0.0	1.0	1.0
+chr2	247403	1.0	0.0	1.0
+chr2	247453	2.0	0.0	2.0
+chr2	247469	0.0	1.0	1.0
+chr2	247519	0.0	1.0	1.0
+chr2	247616	1.0	0.0	1.0
+chr2	247623	2.0	0.0	2.0
+chr2	247633	1.0	0.0	1.0
+chr2	247644	0.0	1.0	1.0
+chr2	247645	0.0	1.0	1.0
+chr2	247681	0.0	1.0	1.0
+chr2	247683	0.0	1.0	1.0
+chr2	247804	1.0	0.0	1.0
+chr2	247806	0.0	1.0	1.0
+chr2	247813	1.0	0.0	1.0
+chr2	247822	1.0	0.0	1.0
+chr2	247826	0.0	1.0	1.0
+chr2	247832	1.0	0.0	1.0
+chr2	247833	2.0	0.0	2.0
+chr2	247842	0.0	4.0	4.0
+chr2	247863	0.0	1.0	1.0
+chr2	247959	0.0	1.0	1.0
+chr2	248017	1.0	0.0	1.0
+chr2	248045	0.0	1.0	1.0
+chr2	248062	1.0	0.0	1.0
+chr2	248099	1.0	0.0	1.0
+chr2	248100	0.0	1.0	1.0
+chr2	248108	1.0	1.0	2.0
+chr2	248138	0.0	1.0	1.0
+chr2	248165	0.0	1.0	1.0
+chr2	248175	1.0	0.0	1.0
+chr2	248260	1.0	0.0	1.0
+chr2	248316	1.0	0.0	1.0
+chr2	248350	1.0	0.0	1.0
+chr2	248405	0.0	3.0	3.0
+chr2	248491	0.0	1.0	1.0
+chr2	248520	0.0	1.0	1.0
+chr2	248521	1.0	0.0	1.0
+chr2	248930	0.0	1.0	1.0
+chr2	249061	1.0	0.0	1.0
+chr2	249106	0.0	1.0	1.0
+chr2	249137	0.0	1.0	1.0
+chr2	249144	1.0	0.0	1.0
+chr2	249303	0.0	1.0	1.0
+chr2	250065	0.0	1.0	1.0
+chr2	250552	1.0	0.0	1.0
+chr2	250581	1.0	0.0	1.0
+chr2	250595	1.0	0.0	1.0
+chr2	250765	0.0	1.0	1.0
+chr2	250887	1.0	0.0	1.0
+chr2	250897	1.0	0.0	1.0
+chr2	250903	0.0	3.0	3.0
+chr2	250905	0.0	1.0	1.0
+chr2	250915	1.0	0.0	1.0
+chr2	250920	0.0	1.0	1.0
+chr2	250925	0.0	1.0	1.0
+chr2	250926	1.0	1.0	2.0
+chr2	250927	0.0	1.0	1.0
+chr2	250934	0.0	1.0	1.0
+chr2	250940	2.0	2.0	4.0
+chr2	251097	1.0	0.0	1.0
+chr2	251192	1.0	0.0	1.0
+chr2	251195	0.0	1.0	1.0
+chr2	251199	1.0	0.0	1.0
+chr2	251226	0.0	1.0	1.0
+chr2	251576	1.0	0.0	1.0
+chr2	251579	1.0	0.0	1.0
+chr2	251589	0.0	1.0	1.0
+chr2	251590	0.0	2.0	2.0
+chr2	251592	1.0	1.0	2.0
+chr2	251593	1.0	0.0	1.0
+chr2	251618	0.0	1.0	1.0
+chr2	251629	1.0	0.0	1.0
+chr2	251639	1.0	0.0	1.0
+chr2	251731	0.0	1.0	1.0
+chr2	251743	1.0	0.0	1.0
+chr2	251770	1.0	0.0	1.0
+chr2	251774	0.0	1.0	1.0
+chr2	251781	1.0	0.0	1.0
+chr2	251804	1.0	0.0	1.0
+chr2	251811	0.0	1.0	1.0
+chr2	251813	0.0	1.0	1.0
+chr2	251827	0.0	1.0	1.0
+chr2	251847	1.0	0.0	1.0
+chr2	251862	0.0	2.0	2.0
+chr2	251991	0.0	2.0	2.0
+chr2	251993	2.0	0.0	2.0
+chr2	252031	1.0	0.0	1.0
+chr2	252047	0.0	1.0	1.0
+chr2	252125	1.0	0.0	1.0
+chr2	252167	1.0	0.0	1.0
+chr2	252312	1.0	0.0	1.0
+chr2	252467	0.0	1.0	1.0
+chr2	252618	2.0	0.0	2.0
+chr2	252636	1.0	0.0	1.0
+chr2	252876	0.0	1.0	1.0
+chr2	252929	1.0	0.0	1.0
+chr2	252946	1.0	0.0	1.0
+chr2	252966	0.0	1.0	1.0
+chr2	252987	1.0	0.0	1.0
+chr2	253597	1.0	0.0	1.0
+chr2	253602	0.0	1.0	1.0
+chr2	253871	2.0	0.0	2.0
+chr2	253938	1.0	0.0	1.0
+chr2	254054	0.0	1.0	1.0
+chr2	254063	1.0	0.0	1.0
+chr2	254211	1.0	0.0	1.0
+chr2	254234	1.0	0.0	1.0
+chr2	254313	0.0	1.0	1.0
+chr2	254329	0.0	1.0	1.0
+chr2	254335	0.0	1.0	1.0
+chr2	254349	1.0	1.0	2.0
+chr2	254358	0.0	1.0	1.0
+chr2	254361	0.0	1.0	1.0
+chr2	254370	0.0	2.0	2.0
+chr2	254371	0.0	2.0	2.0
+chr2	254373	1.0	0.0	1.0
+chr2	254375	1.0	0.0	1.0
+chr2	254376	0.0	1.0	1.0
+chr2	254380	0.0	2.0	2.0
+chr2	254388	2.0	0.0	2.0
+chr2	254389	3.0	0.0	3.0
+chr2	254516	0.0	1.0	1.0
+chr2	254658	1.0	0.0	1.0
+chr2	254683	0.0	1.0	1.0
+chr2	254701	0.0	1.0	1.0
+chr2	254734	1.0	0.0	1.0
+chr2	254757	0.0	1.0	1.0
+chr2	254817	0.0	1.0	1.0
+chr2	254846	0.0	2.0	2.0
+chr2	254848	1.0	0.0	1.0
+chr2	254854	0.0	1.0	1.0
+chr2	254868	0.0	1.0	1.0
+chr2	254876	1.0	0.0	1.0
+chr2	254878	0.0	1.0	1.0
+chr2	254880	1.0	0.0	1.0
+chr2	254881	1.0	0.0	1.0
+chr2	255449	0.0	1.0	1.0
+chr2	255468	0.0	1.0	1.0
+chr2	255477	1.0	0.0	1.0
+chr2	255578	1.0	0.0	1.0
+chr2	255580	1.0	0.0	1.0
+chr2	255593	0.0	1.0	1.0
+chr2	255605	1.0	0.0	1.0
+chr2	255606	1.0	0.0	1.0
+chr2	255609	1.0	1.0	2.0
+chr2	255645	1.0	0.0	1.0
+chr2	255849	1.0	0.0	1.0
+chr2	256185	1.0	0.0	1.0
+chr2	256299	2.0	0.0	2.0
+chr2	256363	0.0	1.0	1.0
+chr2	256393	0.0	1.0	1.0
+chr2	256402	1.0	0.0	1.0
+chr2	256410	0.0	1.0	1.0
+chr2	256412	0.0	1.0	1.0
+chr2	256418	0.0	1.0	1.0
+chr2	256422	0.0	1.0	1.0
+chr2	256461	0.0	1.0	1.0
+chr2	256723	1.0	0.0	1.0
+chr2	257069	1.0	0.0	1.0
+chr2	257072	0.0	2.0	2.0
+chr2	257189	1.0	0.0	1.0
+chr2	257305	0.0	1.0	1.0
+chr2	257330	0.0	1.0	1.0
+chr2	257502	1.0	0.0	1.0
+chr2	257514	0.0	1.0	1.0
+chr2	257627	3.0	0.0	3.0
+chr2	257700	1.0	0.0	1.0
+chr2	257800	1.0	0.0	1.0
+chr2	257812	3.0	0.0	3.0
+chr2	257965	0.0	2.0	2.0
+chr2	257968	0.0	2.0	2.0
+chr2	257976	0.0	1.0	1.0
+chr2	257985	1.0	0.0	1.0
+chr2	257990	0.0	1.0	1.0
+chr2	257996	0.0	1.0	1.0
+chr2	257998	1.0	0.0	1.0
+chr2	258030	0.0	1.0	1.0
+chr2	258240	1.0	0.0	1.0
+chr2	258244	0.0	1.0	1.0
+chr2	258247	1.0	0.0	1.0
+chr2	258248	0.0	1.0	1.0
+chr2	258251	0.0	2.0	2.0
+chr2	258252	0.0	1.0	1.0
+chr2	258255	1.0	0.0	1.0
+chr2	258261	2.0	0.0	2.0
+chr2	258268	1.0	0.0	1.0
+chr2	258271	0.0	2.0	2.0
+chr2	258273	1.0	0.0	1.0
+chr2	258275	0.0	7.0	7.0
+chr2	258276	2.0	0.0	2.0
+chr2	258277	3.0	0.0	3.0
+chr2	258278	0.0	2.0	2.0
+chr2	258279	0.0	1.0	1.0
+chr2	258280	2.0	0.0	2.0
+chr2	258283	3.0	0.0	3.0
+chr2	258285	2.0	0.0	2.0
+chr2	258286	1.0	0.0	1.0
+chr2	258290	2.0	0.0	2.0
+chr2	258292	2.0	2.0	4.0
+chr2	258294	0.0	2.0	2.0
+chr2	258303	4.0	0.0	4.0
+chr2	258307	0.0	2.0	2.0
+chr2	258310	0.0	1.0	1.0
+chr2	258321	1.0	0.0	1.0
+chr2	258322	0.0	1.0	1.0
+chr2	258327	1.0	0.0	1.0
+chr2	258345	1.0	0.0	1.0
+chr2	258424	0.0	1.0	1.0
+chr2	258436	2.0	0.0	2.0
+chr2	258443	4.0	0.0	4.0
+chr2	258446	2.0	0.0	2.0
+chr2	258459	0.0	1.0	1.0
+chr2	258478	1.0	0.0	1.0
+chr2	258508	0.0	1.0	1.0
+chr2	258565	0.0	1.0	1.0
+chr2	258614	0.0	1.0	1.0
+chr2	258616	1.0	0.0	1.0
+chr2	258617	0.0	1.0	1.0
+chr2	258625	0.0	1.0	1.0
+chr2	258645	1.0	0.0	1.0
+chr2	258697	0.0	1.0	1.0
+chr2	258707	0.0	12.0	12.0
+chr2	258709	0.0	1.0	1.0
+chr2	258714	0.0	4.0	4.0
+chr2	258718	0.0	1.0	1.0
+chr2	258728	0.0	2.0	2.0
+chr2	258758	1.0	0.0	1.0
+chr2	258761	1.0	0.0	1.0
+chr2	258922	1.0	0.0	1.0
+chr2	258925	1.0	0.0	1.0
+chr2	259150	1.0	0.0	1.0
+chr2	259182	1.0	0.0	1.0
+chr2	259186	1.0	0.0	1.0
+chr2	259197	0.0	1.0	1.0
+chr2	259360	1.0	0.0	1.0
+chr2	259602	0.0	1.0	1.0
+chr2	259610	0.0	1.0	1.0
+chr2	259613	0.0	1.0	1.0
+chr2	259614	0.0	1.0	1.0
+chr2	259615	0.0	1.0	1.0
+chr2	259624	0.0	2.0	2.0
+chr2	259626	0.0	3.0	3.0
+chr2	259629	0.0	1.0	1.0
+chr2	259637	0.0	2.0	2.0
+chr2	259638	0.0	1.0	1.0
+chr2	259641	0.0	4.0	4.0
+chr2	259642	0.0	4.0	4.0
+chr2	259644	2.0	0.0	2.0
+chr2	259647	0.0	1.0	1.0
+chr2	259648	2.0	0.0	2.0
+chr2	259649	5.0	0.0	5.0
+chr2	259650	0.0	1.0	1.0
+chr2	259652	1.0	1.0	2.0
+chr2	259653	0.0	2.0	2.0
+chr2	259654	0.0	1.0	1.0
+chr2	259655	0.0	1.0	1.0
+chr2	259660	2.0	0.0	2.0
+chr2	259661	0.0	1.0	1.0
+chr2	259663	1.0	2.0	3.0
+chr2	259666	2.0	0.0	2.0
+chr2	259670	1.0	0.0	1.0
+chr2	259671	0.0	1.0	1.0
+chr2	259674	0.0	2.0	2.0
+chr2	259675	0.0	1.0	1.0
+chr2	259681	0.0	2.0	2.0
+chr2	259684	0.0	1.0	1.0
+chr2	259688	0.0	2.0	2.0
+chr2	259695	1.0	0.0	1.0
+chr2	259698	0.0	2.0	2.0
+chr2	259699	0.0	1.0	1.0
+chr2	259700	1.0	0.0	1.0
+chr2	259703	1.0	0.0	1.0
+chr2	259705	2.0	0.0	2.0
+chr2	259706	0.0	2.0	2.0
+chr2	259710	1.0	0.0	1.0
+chr2	259711	1.0	0.0	1.0
+chr2	259712	1.0	0.0	1.0
+chr2	259713	1.0	0.0	1.0
+chr2	259714	1.0	0.0	1.0
+chr2	259721	0.0	1.0	1.0
+chr2	259722	1.0	0.0	1.0
+chr2	259727	0.0	2.0	2.0
+chr2	259728	2.0	2.0	4.0
+chr2	259731	0.0	1.0	1.0
+chr2	259732	0.0	2.0	2.0
+chr2	259733	0.0	1.0	1.0
+chr2	259734	0.0	2.0	2.0
+chr2	259738	1.0	0.0	1.0
+chr2	259740	2.0	0.0	2.0
+chr2	259750	0.0	1.0	1.0
+chr2	259754	0.0	3.0	3.0
+chr2	259756	0.0	2.0	2.0
+chr2	259757	0.0	5.0	5.0
+chr2	259765	0.0	1.0	1.0
+chr2	259766	0.0	1.0	1.0
+chr2	259767	0.0	1.0	1.0
+chr2	259772	1.0	0.0	1.0
+chr2	259778	0.0	1.0	1.0
+chr2	259784	0.0	1.0	1.0
+chr2	259788	1.0	0.0	1.0
+chr2	259795	2.0	0.0	2.0
+chr2	259796	1.0	0.0	1.0
+chr2	259803	1.0	0.0	1.0
+chr2	259811	0.0	1.0	1.0
+chr2	259814	1.0	1.0	2.0
+chr2	259815	1.0	0.0	1.0
+chr2	259816	3.0	0.0	3.0
+chr2	259824	2.0	0.0	2.0
+chr2	259825	0.0	2.0	2.0
+chr2	259830	1.0	0.0	1.0
+chr2	259836	2.0	0.0	2.0
+chr2	259840	1.0	0.0	1.0
+chr2	259842	1.0	0.0	1.0
+chr2	259844	1.0	0.0	1.0
+chr2	259845	1.0	1.0	2.0
+chr2	259846	1.0	0.0	1.0
+chr2	259848	1.0	0.0	1.0
+chr2	259849	1.0	0.0	1.0
+chr2	259853	1.0	0.0	1.0
+chr2	259855	0.0	1.0	1.0
+chr2	259856	1.0	0.0	1.0
+chr2	259857	17.0	0.0	17.0
+chr2	259858	3.0	0.0	3.0
+chr2	259859	0.0	2.0	2.0
+chr2	259860	1.0	0.0	1.0
+chr2	259861	3.0	0.0	3.0
+chr2	259862	0.0	2.0	2.0
+chr2	259863	0.0	1.0	1.0
+chr2	259865	2.0	0.0	2.0
+chr2	259866	0.0	1.0	1.0
+chr2	259872	0.0	4.0	4.0
+chr2	259873	0.0	2.0	2.0
+chr2	259875	2.0	1.0	3.0
+chr2	259881	3.0	0.0	3.0
+chr2	259882	2.0	2.0	4.0
+chr2	259889	0.0	1.0	1.0
+chr2	259890	0.0	1.0	1.0
+chr2	259891	0.0	2.0	2.0
+chr2	259897	0.0	1.0	1.0
+chr2	259900	1.0	0.0	1.0
+chr2	259904	1.0	0.0	1.0
+chr2	259909	2.0	0.0	2.0
+chr2	259911	0.0	1.0	1.0
+chr2	259913	1.0	0.0	1.0
+chr2	259924	0.0	2.0	2.0
+chr2	259926	1.0	0.0	1.0
+chr2	259937	0.0	1.0	1.0
+chr2	259938	2.0	1.0	3.0
+chr2	259939	1.0	0.0	1.0
+chr2	259944	0.0	3.0	3.0
+chr2	259956	1.0	0.0	1.0
+chr2	259958	0.0	1.0	1.0
+chr2	259959	0.0	1.0	1.0
+chr2	259961	0.0	1.0	1.0
+chr2	259963	1.0	1.0	2.0
+chr2	259964	1.0	0.0	1.0
+chr2	259967	0.0	1.0	1.0
+chr2	259968	1.0	0.0	1.0
+chr2	259970	0.0	1.0	1.0
+chr2	259971	0.0	1.0	1.0
+chr2	259974	1.0	1.0	2.0
+chr2	259975	2.0	0.0	2.0
+chr2	259976	3.0	0.0	3.0
+chr2	259977	1.0	0.0	1.0
+chr2	259978	1.0	0.0	1.0
+chr2	259979	0.0	1.0	1.0
+chr2	259980	5.0	0.0	5.0
+chr2	259981	1.0	0.0	1.0
+chr2	259985	2.0	5.0	7.0
+chr2	259987	0.0	1.0	1.0
+chr2	259992	0.0	9.0	9.0
+chr2	259996	0.0	4.0	4.0
+chr2	259997	1.0	1.0	2.0
+chr2	259999	0.0	3.0	3.0
+chr2	260003	2.0	1.0	3.0
+chr2	260006	1.0	3.0	4.0
+chr2	260008	1.0	0.0	1.0
+chr2	260009	1.0	2.0	3.0
+chr2	260010	5.0	0.0	5.0
+chr2	260012	3.0	0.0	3.0
+chr2	260015	0.0	1.0	1.0
+chr2	260016	1.0	2.0	3.0
+chr2	260018	0.0	10.0	10.0
+chr2	260019	0.0	1.0	1.0
+chr2	260021	1.0	7.0	8.0
+chr2	260023	0.0	1.0	1.0
+chr2	260024	2.0	0.0	2.0
+chr2	260025	3.0	0.0	3.0
+chr2	260026	2.0	0.0	2.0
+chr2	260029	3.0	0.0	3.0
+chr2	260030	0.0	2.0	2.0
+chr2	260031	2.0	0.0	2.0
+chr2	260032	1.0	0.0	1.0
+chr2	260033	0.0	5.0	5.0
+chr2	260035	0.0	4.0	4.0
+chr2	260037	1.0	3.0	4.0
+chr2	260038	9.0	3.0	12.0
+chr2	260040	1.0	0.0	1.0
+chr2	260041	4.0	6.0	10.0
+chr2	260044	1.0	0.0	1.0
+chr2	260045	4.0	1.0	5.0
+chr2	260046	0.0	1.0	1.0
+chr2	260047	1.0	4.0	5.0
+chr2	260051	0.0	3.0	3.0
+chr2	260055	1.0	0.0	1.0
+chr2	260056	0.0	12.0	12.0
+chr2	260059	2.0	0.0	2.0
+chr2	260061	3.0	12.0	15.0
+chr2	260062	1.0	3.0	4.0
+chr2	260063	0.0	2.0	2.0
+chr2	260064	0.0	1.0	1.0
+chr2	260065	0.0	1.0	1.0
+chr2	260066	0.0	1.0	1.0
+chr2	260067	1.0	1.0	2.0
+chr2	260070	0.0	10.0	10.0
+chr2	260071	0.0	1.0	1.0
+chr2	260072	6.0	5.0	11.0
+chr2	260073	8.0	0.0	8.0
+chr2	260075	0.0	3.0	3.0
+chr2	260077	7.0	2.0	9.0
+chr2	260078	2.0	0.0	2.0
+chr2	260080	0.0	4.0	4.0
+chr2	260082	0.0	3.0	3.0
+chr2	260084	1.0	0.0	1.0
+chr2	260085	2.0	0.0	2.0
+chr2	260087	0.0	2.0	2.0
+chr2	260090	1.0	1.0	2.0
+chr2	260092	4.0	0.0	4.0
+chr2	260093	2.0	0.0	2.0
+chr2	260095	1.0	0.0	1.0
+chr2	260098	2.0	0.0	2.0
+chr2	260099	0.0	2.0	2.0
+chr2	260100	3.0	2.0	5.0
+chr2	260105	6.0	0.0	6.0
+chr2	260107	1.0	0.0	1.0
+chr2	260110	2.0	0.0	2.0
+chr2	260113	2.0	0.0	2.0
+chr2	260114	0.0	3.0	3.0
+chr2	260117	0.0	8.0	8.0
+chr2	260118	0.0	4.0	4.0
+chr2	260120	3.0	0.0	3.0
+chr2	260122	2.0	0.0	2.0
+chr2	260123	1.0	0.0	1.0
+chr2	260125	0.0	1.0	1.0
+chr2	260126	0.0	4.0	4.0
+chr2	260127	0.0	6.0	6.0
+chr2	260128	2.0	0.0	2.0
+chr2	260129	1.0	1.0	2.0
+chr2	260133	2.0	0.0	2.0
+chr2	260135	2.0	2.0	4.0
+chr2	260136	3.0	1.0	4.0
+chr2	260137	0.0	1.0	1.0
+chr2	260140	0.0	1.0	1.0
+chr2	260141	2.0	0.0	2.0
+chr2	260145	1.0	0.0	1.0
+chr2	260146	2.0	0.0	2.0
+chr2	260150	0.0	4.0	4.0
+chr2	260151	0.0	6.0	6.0
+chr2	260152	2.0	0.0	2.0
+chr2	260154	0.0	1.0	1.0
+chr2	260155	1.0	0.0	1.0
+chr2	260157	2.0	1.0	3.0
+chr2	260165	1.0	1.0	2.0
+chr2	260167	4.0	0.0	4.0
+chr2	260170	2.0	0.0	2.0
+chr2	260171	0.0	1.0	1.0
+chr2	260173	0.0	7.0	7.0
+chr2	260176	1.0	0.0	1.0
+chr2	260177	3.0	0.0	3.0
+chr2	260179	0.0	5.0	5.0
+chr2	260181	1.0	2.0	3.0
+chr2	260182	0.0	1.0	1.0
+chr2	260185	5.0	0.0	5.0
+chr2	260188	0.0	6.0	6.0
+chr2	260190	0.0	3.0	3.0
+chr2	260191	0.0	1.0	1.0
+chr2	260195	1.0	1.0	2.0
+chr2	260197	1.0	0.0	1.0
+chr2	260198	0.0	2.0	2.0
+chr2	260199	2.0	0.0	2.0
+chr2	260201	0.0	3.0	3.0
+chr2	260202	1.0	0.0	1.0
+chr2	260203	0.0	1.0	1.0
+chr2	260206	0.0	1.0	1.0
+chr2	260207	0.0	1.0	1.0
+chr2	260210	1.0	0.0	1.0
+chr2	260211	7.0	0.0	7.0
+chr2	260213	1.0	1.0	2.0
+chr2	260214	1.0	0.0	1.0
+chr2	260215	0.0	2.0	2.0
+chr2	260218	1.0	0.0	1.0
+chr2	260220	2.0	0.0	2.0
+chr2	260222	0.0	3.0	3.0
+chr2	260224	3.0	0.0	3.0
+chr2	260225	0.0	1.0	1.0
+chr2	260228	0.0	1.0	1.0
+chr2	260229	2.0	0.0	2.0
+chr2	260231	4.0	1.0	5.0
+chr2	260233	0.0	1.0	1.0
+chr2	260236	5.0	0.0	5.0
+chr2	260237	0.0	2.0	2.0
+chr2	260239	0.0	2.0	2.0
+chr2	260240	1.0	4.0	5.0
+chr2	260241	0.0	7.0	7.0
+chr2	260246	0.0	3.0	3.0
+chr2	260247	0.0	1.0	1.0
+chr2	260249	1.0	0.0	1.0
+chr2	260251	1.0	0.0	1.0
+chr2	260254	0.0	1.0	1.0
+chr2	260261	1.0	0.0	1.0
+chr2	260262	0.0	2.0	2.0
+chr2	260264	1.0	2.0	3.0
+chr2	260266	0.0	1.0	1.0
+chr2	260269	1.0	0.0	1.0
+chr2	260271	0.0	1.0	1.0
+chr2	260273	0.0	3.0	3.0
+chr2	260274	1.0	1.0	2.0
+chr2	260275	2.0	5.0	7.0
+chr2	260276	1.0	1.0	2.0
+chr2	260282	1.0	2.0	3.0
+chr2	260283	3.0	0.0	3.0
+chr2	260284	1.0	0.0	1.0
+chr2	260285	1.0	0.0	1.0
+chr2	260287	2.0	0.0	2.0
+chr2	260288	0.0	11.0	11.0
+chr2	260289	8.0	3.0	11.0
+chr2	260292	1.0	0.0	1.0
+chr2	260297	3.0	0.0	3.0
+chr2	260298	4.0	0.0	4.0
+chr2	260300	2.0	0.0	2.0
+chr2	260301	9.0	2.0	11.0
+chr2	260303	2.0	0.0	2.0
+chr2	260304	3.0	0.0	3.0
+chr2	260305	9.0	0.0	9.0
+chr2	260306	2.0	0.0	2.0
+chr2	260309	0.0	1.0	1.0
+chr2	260311	2.0	2.0	4.0
+chr2	260312	0.0	23.0	23.0
+chr2	260313	0.0	5.0	5.0
+chr2	260314	0.0	1.0	1.0
+chr2	260316	1.0	2.0	3.0
+chr2	260317	0.0	2.0	2.0
+chr2	260318	0.0	2.0	2.0
+chr2	260319	1.0	0.0	1.0
+chr2	260320	9.0	0.0	9.0
+chr2	260321	18.0	0.0	18.0
+chr2	260322	0.0	1.0	1.0
+chr2	260323	3.0	0.0	3.0
+chr2	260324	2.0	3.0	5.0
+chr2	260325	2.0	0.0	2.0
+chr2	260327	0.0	19.0	19.0
+chr2	260328	5.0	12.0	17.0
+chr2	260329	16.0	1.0	17.0
+chr2	260330	3.0	0.0	3.0
+chr2	260332	0.0	6.0	6.0
+chr2	260334	1.0	9.0	10.0
+chr2	260335	0.0	7.0	7.0
+chr2	260336	1.0	1.0	2.0
+chr2	260337	12.0	11.0	23.0
+chr2	260338	16.0	0.0	16.0
+chr2	260339	5.0	11.0	16.0
+chr2	260340	0.0	10.0	10.0
+chr2	260341	3.0	0.0	3.0
+chr2	260342	7.0	1.0	8.0
+chr2	260343	2.0	2.0	4.0
+chr2	260344	3.0	0.0	3.0
+chr2	260345	1.0	0.0	1.0
+chr2	260346	0.0	4.0	4.0
+chr2	260347	13.0	12.0	25.0
+chr2	260348	0.0	12.0	12.0
+chr2	260349	2.0	19.0	21.0
+chr2	260350	14.0	0.0	14.0
+chr2	260351	0.0	1.0	1.0
+chr2	260352	0.0	2.0	2.0
+chr2	260353	1.0	0.0	1.0
+chr2	260354	1.0	6.0	7.0
+chr2	260355	1.0	3.0	4.0
+chr2	260356	0.0	1.0	1.0
+chr2	260358	0.0	1.0	1.0
+chr2	260359	1.0	0.0	1.0
+chr2	260361	5.0	10.0	15.0
+chr2	260362	0.0	4.0	4.0
+chr2	260363	3.0	0.0	3.0
+chr2	260364	0.0	1.0	1.0
+chr2	260365	0.0	1.0	1.0
+chr2	260366	1.0	0.0	1.0
+chr2	260367	0.0	1.0	1.0
+chr2	260368	3.0	0.0	3.0
+chr2	260372	1.0	0.0	1.0
+chr2	260373	0.0	1.0	1.0
+chr2	260376	0.0	1.0	1.0
+chr2	260378	0.0	1.0	1.0
+chr2	260379	2.0	1.0	3.0
+chr2	260381	1.0	0.0	1.0
+chr2	260383	1.0	0.0	1.0
+chr2	260388	1.0	1.0	2.0
+chr2	260389	3.0	2.0	5.0
+chr2	260390	3.0	9.0	12.0
+chr2	260391	0.0	2.0	2.0
+chr2	260392	0.0	1.0	1.0
+chr2	260395	2.0	0.0	2.0
+chr2	260396	2.0	0.0	2.0
+chr2	260398	1.0	0.0	1.0
+chr2	260399	0.0	1.0	1.0
+chr2	260401	3.0	0.0	3.0
+chr2	260402	5.0	0.0	5.0
+chr2	260408	1.0	0.0	1.0
+chr2	260411	0.0	2.0	2.0
+chr2	260412	0.0	1.0	1.0
+chr2	260418	0.0	1.0	1.0
+chr2	260421	1.0	0.0	1.0
+chr2	260424	0.0	1.0	1.0
+chr2	260426	2.0	0.0	2.0
+chr2	260430	1.0	1.0	2.0
+chr2	260437	0.0	2.0	2.0
+chr2	260442	7.0	0.0	7.0
+chr2	260443	1.0	0.0	1.0
+chr2	260447	1.0	0.0	1.0
+chr2	260451	0.0	1.0	1.0
+chr2	260454	0.0	1.0	1.0
+chr2	260459	1.0	3.0	4.0
+chr2	260464	0.0	1.0	1.0
+chr2	260468	0.0	1.0	1.0
+chr2	260470	1.0	2.0	3.0
+chr2	260475	3.0	0.0	3.0
+chr2	260476	1.0	0.0	1.0
+chr2	260481	0.0	2.0	2.0
+chr2	260482	1.0	0.0	1.0
+chr2	260483	0.0	1.0	1.0
+chr2	260485	0.0	1.0	1.0
+chr2	260488	2.0	0.0	2.0
+chr2	260489	3.0	0.0	3.0
+chr2	260495	0.0	1.0	1.0
+chr2	260498	1.0	0.0	1.0
+chr2	260499	0.0	2.0	2.0
+chr2	260500	1.0	0.0	1.0
+chr2	260501	3.0	0.0	3.0
+chr2	260502	12.0	0.0	12.0
+chr2	260503	1.0	0.0	1.0
+chr2	260505	1.0	1.0	2.0
+chr2	260508	1.0	0.0	1.0
+chr2	260511	0.0	3.0	3.0
+chr2	260512	0.0	1.0	1.0
+chr2	260513	4.0	0.0	4.0
+chr2	260514	8.0	1.0	9.0
+chr2	260515	3.0	6.0	9.0
+chr2	260517	1.0	1.0	2.0
+chr2	260518	6.0	0.0	6.0
+chr2	260519	2.0	0.0	2.0
+chr2	260520	6.0	1.0	7.0
+chr2	260521	0.0	4.0	4.0
+chr2	260522	3.0	1.0	4.0
+chr2	260524	0.0	17.0	17.0
+chr2	260525	0.0	2.0	2.0
+chr2	260526	1.0	1.0	2.0
+chr2	260527	3.0	0.0	3.0
+chr2	260530	1.0	0.0	1.0
+chr2	260533	0.0	4.0	4.0
+chr2	260534	0.0	7.0	7.0
+chr2	260535	0.0	6.0	6.0
+chr2	260538	0.0	1.0	1.0
+chr2	260539	1.0	0.0	1.0
+chr2	260540	1.0	0.0	1.0
+chr2	260541	1.0	1.0	2.0
+chr2	260542	9.0	2.0	11.0
+chr2	260543	0.0	1.0	1.0
+chr2	260548	2.0	0.0	2.0
+chr2	260551	1.0	0.0	1.0
+chr2	260552	3.0	0.0	3.0
+chr2	260553	4.0	3.0	7.0
+chr2	260554	2.0	6.0	8.0
+chr2	260556	1.0	0.0	1.0
+chr2	260558	2.0	1.0	3.0
+chr2	260560	0.0	4.0	4.0
+chr2	260562	1.0	0.0	1.0
+chr2	260566	1.0	0.0	1.0
+chr2	260572	0.0	6.0	6.0
+chr2	260576	3.0	0.0	3.0
+chr2	260578	2.0	4.0	6.0
+chr2	260579	0.0	1.0	1.0
+chr2	260580	2.0	0.0	2.0
+chr2	260581	1.0	3.0	4.0
+chr2	260584	1.0	4.0	5.0
+chr2	260585	3.0	2.0	5.0
+chr2	260587	1.0	0.0	1.0
+chr2	260589	0.0	4.0	4.0
+chr2	260591	0.0	7.0	7.0
+chr2	260596	0.0	1.0	1.0
+chr2	260598	0.0	4.0	4.0
+chr2	260599	0.0	3.0	3.0
+chr2	260601	1.0	0.0	1.0
+chr2	260602	2.0	0.0	2.0
+chr2	260607	8.0	0.0	8.0
+chr2	260608	0.0	2.0	2.0
+chr2	260609	1.0	0.0	1.0
+chr2	260612	0.0	4.0	4.0
+chr2	260613	0.0	4.0	4.0
+chr2	260615	1.0	0.0	1.0
+chr2	260617	2.0	0.0	2.0
+chr2	260619	5.0	0.0	5.0
+chr2	260620	3.0	7.0	10.0
+chr2	260621	0.0	2.0	2.0
+chr2	260622	1.0	4.0	5.0
+chr2	260632	1.0	0.0	1.0
+chr2	260634	4.0	0.0	4.0
+chr2	260638	1.0	0.0	1.0
+chr2	260642	1.0	0.0	1.0
+chr2	260663	1.0	0.0	1.0
+chr2	260664	0.0	1.0	1.0
+chr2	260666	0.0	3.0	3.0
+chr2	260667	0.0	1.0	1.0
+chr2	260670	0.0	3.0	3.0
+chr2	260672	0.0	2.0	2.0
+chr2	260674	1.0	0.0	1.0
+chr2	260675	3.0	0.0	3.0
+chr2	260678	1.0	0.0	1.0
+chr2	260679	0.0	1.0	1.0
+chr2	260681	1.0	0.0	1.0
+chr2	260682	1.0	0.0	1.0
+chr2	260685	2.0	5.0	7.0
+chr2	260688	0.0	5.0	5.0
+chr2	260689	1.0	1.0	2.0
+chr2	260690	0.0	1.0	1.0
+chr2	260691	0.0	1.0	1.0
+chr2	260692	6.0	0.0	6.0
+chr2	260693	1.0	0.0	1.0
+chr2	260695	3.0	0.0	3.0
+chr2	260696	4.0	1.0	5.0
+chr2	260697	0.0	16.0	16.0
+chr2	260698	0.0	4.0	4.0
+chr2	260699	1.0	3.0	4.0
+chr2	260700	3.0	3.0	6.0
+chr2	260701	0.0	4.0	4.0
+chr2	260702	0.0	2.0	2.0
+chr2	260706	2.0	7.0	9.0
+chr2	260707	14.0	1.0	15.0
+chr2	260708	0.0	6.0	6.0
+chr2	260709	0.0	1.0	1.0
+chr2	260710	10.0	0.0	10.0
+chr2	260711	3.0	0.0	3.0
+chr2	260712	1.0	3.0	4.0
+chr2	260713	4.0	0.0	4.0
+chr2	260714	6.0	0.0	6.0
+chr2	260715	10.0	0.0	10.0
+chr2	260719	1.0	0.0	1.0
+chr2	260720	3.0	3.0	6.0
+chr2	260721	1.0	0.0	1.0
+chr2	260722	2.0	16.0	18.0
+chr2	260724	2.0	0.0	2.0
+chr2	260725	0.0	1.0	1.0
+chr2	260726	2.0	0.0	2.0
+chr2	260727	0.0	1.0	1.0
+chr2	260728	0.0	1.0	1.0
+chr2	260729	1.0	1.0	2.0
+chr2	260730	1.0	1.0	2.0
+chr2	260731	5.0	0.0	5.0
+chr2	260733	2.0	0.0	2.0
+chr2	260736	0.0	1.0	1.0
+chr2	260738	1.0	1.0	2.0
+chr2	260739	3.0	0.0	3.0
+chr2	260740	1.0	0.0	1.0
+chr2	260741	0.0	1.0	1.0
+chr2	260742	0.0	1.0	1.0
+chr2	260743	0.0	4.0	4.0
+chr2	260746	6.0	0.0	6.0
+chr2	260747	0.0	1.0	1.0
+chr2	260748	4.0	0.0	4.0
+chr2	260749	4.0	0.0	4.0
+chr2	260751	0.0	2.0	2.0
+chr2	260752	0.0	8.0	8.0
+chr2	260753	0.0	2.0	2.0
+chr2	260754	0.0	4.0	4.0
+chr2	260755	0.0	2.0	2.0
+chr2	260762	5.0	0.0	5.0
+chr2	260768	2.0	0.0	2.0
+chr2	260769	1.0	5.0	6.0
+chr2	260771	1.0	0.0	1.0
+chr2	260772	2.0	2.0	4.0
+chr2	260773	5.0	0.0	5.0
+chr2	260774	1.0	0.0	1.0
+chr2	260777	2.0	0.0	2.0
+chr2	260779	0.0	1.0	1.0
+chr2	260780	3.0	0.0	3.0
+chr2	260783	0.0	1.0	1.0
+chr2	260785	1.0	1.0	2.0
+chr2	260786	0.0	1.0	1.0
+chr2	260800	1.0	0.0	1.0
+chr2	260806	0.0	1.0	1.0
+chr2	260812	0.0	1.0	1.0
+chr2	260825	1.0	0.0	1.0
+chr2	260828	0.0	1.0	1.0
+chr2	260831	1.0	0.0	1.0
+chr2	260836	0.0	1.0	1.0
+chr2	260838	1.0	0.0	1.0
+chr2	260849	1.0	0.0	1.0
+chr2	260850	1.0	0.0	1.0
+chr2	260854	1.0	0.0	1.0
+chr2	260855	0.0	2.0	2.0
+chr2	260856	1.0	0.0	1.0
+chr2	260858	1.0	0.0	1.0
+chr2	260862	0.0	5.0	5.0
+chr2	260867	0.0	2.0	2.0
+chr2	260868	0.0	1.0	1.0
+chr2	260872	1.0	0.0	1.0
+chr2	260879	0.0	2.0	2.0
+chr2	260880	8.0	1.0	9.0
+chr2	260882	2.0	0.0	2.0
+chr2	260884	4.0	0.0	4.0
+chr2	260889	1.0	1.0	2.0
+chr2	260891	2.0	2.0	4.0
+chr2	260893	6.0	0.0	6.0
+chr2	260895	0.0	1.0	1.0
+chr2	260898	0.0	1.0	1.0
+chr2	260899	0.0	2.0	2.0
+chr2	260901	1.0	0.0	1.0
+chr2	260903	1.0	0.0	1.0
+chr2	260909	3.0	0.0	3.0
+chr2	260910	5.0	0.0	5.0
+chr2	260911	3.0	0.0	3.0
+chr2	260912	3.0	0.0	3.0
+chr2	260913	0.0	4.0	4.0
+chr2	260914	0.0	2.0	2.0
+chr2	260915	0.0	1.0	1.0
+chr2	260916	3.0	0.0	3.0
+chr2	260919	0.0	2.0	2.0
+chr2	260920	2.0	0.0	2.0
+chr2	260921	0.0	1.0	1.0
+chr2	260924	0.0	1.0	1.0
+chr2	260925	1.0	0.0	1.0
+chr2	260934	0.0	3.0	3.0
+chr2	260940	3.0	2.0	5.0
+chr2	260944	2.0	0.0	2.0
+chr2	260957	0.0	2.0	2.0
+chr2	260959	0.0	2.0	2.0
+chr2	260968	1.0	0.0	1.0
+chr2	260974	0.0	1.0	1.0
+chr2	260980	1.0	0.0	1.0
+chr2	260983	1.0	0.0	1.0
+chr2	260995	0.0	1.0	1.0
+chr2	261000	1.0	0.0	1.0
+chr2	261001	0.0	2.0	2.0
+chr2	261003	0.0	1.0	1.0
+chr2	261005	1.0	0.0	1.0
+chr2	261012	0.0	1.0	1.0
+chr2	261020	1.0	0.0	1.0
+chr2	261026	1.0	0.0	1.0
+chr2	261028	1.0	0.0	1.0
+chr2	261036	1.0	0.0	1.0
+chr2	261037	2.0	0.0	2.0
+chr2	261039	2.0	0.0	2.0
+chr2	261042	1.0	1.0	2.0
+chr2	261045	0.0	1.0	1.0
+chr2	261046	1.0	0.0	1.0
+chr2	261047	0.0	5.0	5.0
+chr2	261048	0.0	1.0	1.0
+chr2	261050	4.0	0.0	4.0
+chr2	261056	0.0	2.0	2.0
+chr2	261066	0.0	3.0	3.0
+chr2	261067	3.0	0.0	3.0
+chr2	261068	3.0	0.0	3.0
+chr2	261070	1.0	0.0	1.0
+chr2	261071	1.0	1.0	2.0
+chr2	261075	2.0	0.0	2.0
+chr2	261076	1.0	0.0	1.0
+chr2	261078	0.0	2.0	2.0
+chr2	261079	0.0	1.0	1.0
+chr2	261087	2.0	0.0	2.0
+chr2	261088	8.0	0.0	8.0
+chr2	261092	0.0	2.0	2.0
+chr2	261094	0.0	2.0	2.0
+chr2	261096	2.0	0.0	2.0
+chr2	261104	1.0	1.0	2.0
+chr2	261105	0.0	3.0	3.0
+chr2	261106	0.0	1.0	1.0
+chr2	261107	1.0	0.0	1.0
+chr2	261109	1.0	0.0	1.0
+chr2	261110	0.0	1.0	1.0
+chr2	261111	0.0	1.0	1.0
+chr2	261114	1.0	0.0	1.0
+chr2	261115	4.0	0.0	4.0
+chr2	261116	3.0	2.0	5.0
+chr2	261117	1.0	0.0	1.0
+chr2	261120	0.0	1.0	1.0
+chr2	261122	2.0	0.0	2.0
+chr2	261125	0.0	2.0	2.0
+chr2	261128	1.0	1.0	2.0
+chr2	261131	0.0	1.0	1.0
+chr2	261132	0.0	1.0	1.0
+chr2	261145	1.0	0.0	1.0
+chr2	261146	0.0	1.0	1.0
+chr2	261147	0.0	1.0	1.0
+chr2	261149	1.0	1.0	2.0
+chr2	261162	2.0	0.0	2.0
+chr2	261165	1.0	0.0	1.0
+chr2	261196	1.0	0.0	1.0
+chr2	261197	0.0	1.0	1.0
+chr2	261198	0.0	1.0	1.0
+chr2	261199	0.0	1.0	1.0
+chr2	261202	2.0	0.0	2.0
+chr2	261203	1.0	0.0	1.0
+chr2	261205	2.0	0.0	2.0
+chr2	261208	1.0	0.0	1.0
+chr2	261212	0.0	4.0	4.0
+chr2	261213	0.0	1.0	1.0
+chr2	261218	1.0	0.0	1.0
+chr2	261219	1.0	1.0	2.0
+chr2	261222	1.0	0.0	1.0
+chr2	261228	4.0	5.0	9.0
+chr2	261231	1.0	1.0	2.0
+chr2	261235	0.0	1.0	1.0
+chr2	261238	1.0	0.0	1.0
+chr2	261239	1.0	0.0	1.0
+chr2	261241	0.0	2.0	2.0
+chr2	261244	1.0	4.0	5.0
+chr2	261245	0.0	1.0	1.0
+chr2	261246	1.0	0.0	1.0
+chr2	261258	1.0	0.0	1.0
+chr2	261263	0.0	2.0	2.0
+chr2	261266	0.0	1.0	1.0
+chr2	261267	3.0	0.0	3.0
+chr2	261271	0.0	1.0	1.0
+chr2	261278	1.0	0.0	1.0
+chr2	261279	0.0	2.0	2.0
+chr2	261288	0.0	2.0	2.0
+chr2	261290	1.0	0.0	1.0
+chr2	261302	1.0	0.0	1.0
+chr2	261322	1.0	0.0	1.0
+chr2	261325	0.0	1.0	1.0
+chr2	261330	0.0	1.0	1.0
+chr2	261358	1.0	0.0	1.0
+chr2	261378	0.0	1.0	1.0
+chr2	261379	0.0	1.0	1.0
+chr2	261396	0.0	1.0	1.0
+chr2	261398	0.0	1.0	1.0
+chr2	261401	0.0	1.0	1.0
+chr2	261412	0.0	1.0	1.0
+chr2	261413	1.0	0.0	1.0
+chr2	261414	1.0	0.0	1.0
+chr2	261415	0.0	1.0	1.0
+chr2	261421	1.0	1.0	2.0
+chr2	261422	1.0	1.0	2.0
+chr2	261423	0.0	1.0	1.0
+chr2	261429	1.0	0.0	1.0
+chr2	261431	1.0	0.0	1.0
+chr2	261432	0.0	1.0	1.0
+chr2	261435	1.0	0.0	1.0
+chr2	261436	2.0	0.0	2.0
+chr2	261437	3.0	0.0	3.0
+chr2	261441	0.0	1.0	1.0
+chr2	261442	1.0	0.0	1.0
+chr2	261450	0.0	3.0	3.0
+chr2	261454	1.0	0.0	1.0
+chr2	261462	0.0	1.0	1.0
+chr2	261467	0.0	4.0	4.0
+chr2	261487	0.0	1.0	1.0
+chr2	261491	0.0	1.0	1.0
+chr2	261511	3.0	0.0	3.0
+chr2	261512	1.0	0.0	1.0
+chr2	261516	0.0	1.0	1.0
+chr2	261517	0.0	1.0	1.0
+chr2	261522	1.0	0.0	1.0
+chr2	261535	0.0	1.0	1.0
+chr2	261552	3.0	0.0	3.0
+chr2	261557	0.0	1.0	1.0
+chr2	261559	0.0	1.0	1.0
+chr2	261568	0.0	1.0	1.0
+chr2	261569	0.0	1.0	1.0
+chr2	261572	1.0	0.0	1.0
+chr2	261576	0.0	1.0	1.0
+chr2	261577	1.0	0.0	1.0
+chr2	261582	1.0	1.0	2.0
+chr2	261590	1.0	0.0	1.0
+chr2	261610	1.0	3.0	4.0
+chr2	261619	1.0	0.0	1.0
+chr2	261622	0.0	1.0	1.0
+chr2	261636	0.0	1.0	1.0
+chr2	261641	1.0	0.0	1.0
+chr2	261649	0.0	1.0	1.0
+chr2	261656	0.0	2.0	2.0
+chr2	261659	0.0	1.0	1.0
+chr2	261665	0.0	1.0	1.0
+chr2	261674	1.0	0.0	1.0
+chr2	261689	1.0	0.0	1.0
+chr2	261690	0.0	3.0	3.0
+chr2	261708	2.0	0.0	2.0
+chr2	261718	14.0	0.0	14.0
+chr2	261719	1.0	0.0	1.0
+chr2	261720	1.0	0.0	1.0
+chr2	261724	3.0	1.0	4.0
+chr2	261730	1.0	0.0	1.0
+chr2	261734	0.0	1.0	1.0
+chr2	261744	0.0	2.0	2.0
+chr2	261749	0.0	1.0	1.0
+chr2	261761	0.0	1.0	1.0
+chr2	261765	1.0	0.0	1.0
+chr2	261775	1.0	0.0	1.0
+chr2	261777	0.0	1.0	1.0
+chr2	261783	0.0	1.0	1.0
+chr2	261789	1.0	0.0	1.0
+chr2	261796	1.0	0.0	1.0
+chr2	261806	1.0	0.0	1.0
+chr2	261808	0.0	2.0	2.0
+chr2	261815	1.0	0.0	1.0
+chr2	261818	0.0	2.0	2.0
+chr2	261839	1.0	0.0	1.0
+chr2	261845	0.0	6.0	6.0
+chr2	261849	3.0	0.0	3.0
+chr2	261858	2.0	0.0	2.0
+chr2	261863	1.0	0.0	1.0
+chr2	261865	1.0	0.0	1.0
+chr2	261871	1.0	0.0	1.0
+chr2	261883	1.0	0.0	1.0
+chr2	261893	0.0	2.0	2.0
+chr2	261896	1.0	0.0	1.0
+chr2	261900	0.0	1.0	1.0
+chr2	261901	0.0	1.0	1.0
+chr2	261913	1.0	0.0	1.0
+chr2	261924	1.0	0.0	1.0
+chr2	261926	1.0	0.0	1.0
+chr2	261938	0.0	1.0	1.0
+chr2	261946	0.0	1.0	1.0
+chr2	261948	2.0	0.0	2.0
+chr2	261952	1.0	0.0	1.0
+chr2	261954	0.0	3.0	3.0
+chr2	261959	3.0	0.0	3.0
+chr2	261982	0.0	1.0	1.0
+chr2	261985	0.0	4.0	4.0
+chr2	262008	2.0	0.0	2.0
+chr2	262009	1.0	0.0	1.0
+chr2	262013	2.0	0.0	2.0
+chr2	262014	1.0	0.0	1.0
+chr2	262016	1.0	1.0	2.0
+chr2	262017	0.0	1.0	1.0
+chr2	262020	0.0	1.0	1.0
+chr2	262029	1.0	0.0	1.0
+chr2	262030	2.0	0.0	2.0
+chr2	262047	0.0	1.0	1.0
+chr2	262049	1.0	0.0	1.0
+chr2	262052	2.0	0.0	2.0
+chr2	262057	0.0	1.0	1.0
+chr2	262058	0.0	2.0	2.0
+chr2	262063	1.0	0.0	1.0
+chr2	262068	1.0	0.0	1.0
+chr2	262069	0.0	1.0	1.0
+chr2	262071	2.0	0.0	2.0
+chr2	262078	4.0	0.0	4.0
+chr2	262108	1.0	0.0	1.0
+chr2	262109	0.0	1.0	1.0
+chr2	262111	1.0	0.0	1.0
+chr2	262126	0.0	3.0	3.0
+chr2	262138	1.0	0.0	1.0
+chr2	262144	1.0	0.0	1.0
+chr2	262148	0.0	1.0	1.0
+chr2	262168	1.0	0.0	1.0
+chr2	262170	1.0	0.0	1.0
+chr2	262173	2.0	0.0	2.0
+chr2	262184	0.0	2.0	2.0
+chr2	262191	0.0	1.0	1.0
+chr2	262199	1.0	0.0	1.0
+chr2	262200	0.0	1.0	1.0
+chr2	262206	1.0	2.0	3.0
+chr2	262211	1.0	0.0	1.0
+chr2	262212	1.0	0.0	1.0
+chr2	262217	1.0	0.0	1.0
+chr2	262218	1.0	0.0	1.0
+chr2	262221	1.0	0.0	1.0
+chr2	262223	0.0	1.0	1.0
+chr2	262233	0.0	1.0	1.0
+chr2	262276	2.0	0.0	2.0
+chr2	262281	0.0	2.0	2.0
+chr2	262305	1.0	0.0	1.0
+chr2	262328	0.0	2.0	2.0
+chr2	262342	0.0	2.0	2.0
+chr2	262364	1.0	0.0	1.0
+chr2	262365	0.0	1.0	1.0
+chr2	262374	0.0	1.0	1.0
+chr2	262376	0.0	1.0	1.0
+chr2	262382	1.0	0.0	1.0
+chr2	262383	2.0	0.0	2.0
+chr2	262384	0.0	1.0	1.0
+chr2	262386	0.0	1.0	1.0
+chr2	262387	1.0	0.0	1.0
+chr2	262388	0.0	3.0	3.0
+chr2	262389	1.0	0.0	1.0
+chr2	262390	1.0	1.0	2.0
+chr2	262393	0.0	1.0	1.0
+chr2	262394	1.0	0.0	1.0
+chr2	262398	1.0	0.0	1.0
+chr2	262401	0.0	1.0	1.0
+chr2	262403	1.0	1.0	2.0
+chr2	262411	0.0	1.0	1.0
+chr2	262427	2.0	0.0	2.0
+chr2	262429	1.0	0.0	1.0
+chr2	262440	0.0	1.0	1.0
+chr2	262446	0.0	2.0	2.0
+chr2	262448	1.0	0.0	1.0
+chr2	262454	0.0	1.0	1.0
+chr2	262455	2.0	0.0	2.0
+chr2	262464	1.0	0.0	1.0
+chr2	262472	1.0	0.0	1.0
+chr2	262477	0.0	1.0	1.0
+chr2	262483	1.0	0.0	1.0
+chr2	262488	0.0	1.0	1.0
+chr2	262493	2.0	0.0	2.0
+chr2	262494	0.0	1.0	1.0
+chr2	262530	0.0	2.0	2.0
+chr2	262532	2.0	0.0	2.0
+chr2	262533	0.0	1.0	1.0
+chr2	262543	0.0	1.0	1.0
+chr2	262547	0.0	2.0	2.0
+chr2	262563	0.0	3.0	3.0
+chr2	262573	1.0	0.0	1.0
+chr2	262582	0.0	1.0	1.0
+chr2	262584	0.0	1.0	1.0
+chr2	262586	0.0	1.0	1.0
+chr2	262590	0.0	1.0	1.0
+chr2	262600	1.0	0.0	1.0
+chr2	262601	0.0	1.0	1.0
+chr2	262604	2.0	0.0	2.0
+chr2	262642	1.0	0.0	1.0
+chr2	262643	1.0	0.0	1.0
+chr2	262664	1.0	0.0	1.0
+chr2	262683	0.0	1.0	1.0
+chr2	262687	0.0	1.0	1.0
+chr2	262701	0.0	3.0	3.0
+chr2	262703	0.0	1.0	1.0
+chr2	262704	0.0	1.0	1.0
+chr2	262710	0.0	1.0	1.0
+chr2	262712	1.0	0.0	1.0
+chr2	262728	0.0	2.0	2.0
+chr2	262735	0.0	1.0	1.0
+chr2	262750	0.0	1.0	1.0
+chr2	262753	0.0	1.0	1.0
+chr2	262762	1.0	0.0	1.0
+chr2	262772	1.0	0.0	1.0
+chr2	262779	0.0	1.0	1.0
+chr2	262784	1.0	0.0	1.0
+chr2	262803	0.0	1.0	1.0
+chr2	262811	1.0	0.0	1.0
+chr2	262818	0.0	1.0	1.0
+chr2	262824	0.0	2.0	2.0
+chr2	262830	1.0	0.0	1.0
+chr2	262851	0.0	1.0	1.0
+chr2	262852	0.0	2.0	2.0
+chr2	262856	0.0	2.0	2.0
+chr2	262857	0.0	2.0	2.0
+chr2	262904	0.0	1.0	1.0
+chr2	262906	1.0	0.0	1.0
+chr2	262923	0.0	2.0	2.0
+chr2	262926	1.0	0.0	1.0
+chr2	262954	0.0	1.0	1.0
+chr2	262959	0.0	1.0	1.0
+chr2	262963	0.0	1.0	1.0
+chr2	262974	1.0	0.0	1.0
+chr2	262976	1.0	3.0	4.0
+chr2	262980	0.0	2.0	2.0
+chr2	262989	1.0	0.0	1.0
+chr2	263007	0.0	2.0	2.0
+chr2	263012	1.0	0.0	1.0
+chr2	263015	2.0	0.0	2.0
+chr2	263034	1.0	0.0	1.0
+chr2	263058	0.0	1.0	1.0
+chr2	263061	0.0	1.0	1.0
+chr2	263062	0.0	1.0	1.0
+chr2	263084	0.0	1.0	1.0
+chr2	263093	0.0	1.0	1.0
+chr2	263100	1.0	0.0	1.0
+chr2	263113	2.0	0.0	2.0
+chr2	263130	0.0	1.0	1.0
+chr2	263146	0.0	2.0	2.0
+chr2	263171	0.0	1.0	1.0
+chr2	263180	1.0	0.0	1.0
+chr2	263181	1.0	0.0	1.0
+chr2	263225	0.0	1.0	1.0
+chr2	263266	0.0	1.0	1.0
+chr2	263275	0.0	1.0	1.0
+chr2	263311	0.0	1.0	1.0
+chr2	263313	1.0	1.0	2.0
+chr2	263318	1.0	0.0	1.0
+chr2	263326	2.0	0.0	2.0
+chr2	263328	1.0	0.0	1.0
+chr2	263341	1.0	0.0	1.0
+chr2	263342	0.0	1.0	1.0
+chr2	263362	1.0	0.0	1.0
+chr2	263390	1.0	0.0	1.0
+chr2	263423	1.0	0.0	1.0
+chr2	263445	0.0	1.0	1.0
+chr2	263452	1.0	0.0	1.0
+chr2	263460	1.0	0.0	1.0
+chr2	263469	0.0	1.0	1.0
+chr2	263472	2.0	0.0	2.0
+chr2	263473	0.0	1.0	1.0
+chr2	263496	0.0	1.0	1.0
+chr2	263501	1.0	0.0	1.0
+chr2	263517	1.0	1.0	2.0
+chr2	263540	0.0	1.0	1.0
+chr2	263558	1.0	0.0	1.0
+chr2	263564	0.0	1.0	1.0
+chr2	263576	0.0	1.0	1.0
+chr2	263582	1.0	0.0	1.0
+chr2	263584	0.0	1.0	1.0
+chr2	263591	1.0	0.0	1.0
+chr2	263603	1.0	0.0	1.0
+chr2	263607	0.0	1.0	1.0
+chr2	263608	0.0	1.0	1.0
+chr2	263620	1.0	0.0	1.0
+chr2	263637	0.0	1.0	1.0
+chr2	263655	0.0	1.0	1.0
+chr2	263685	1.0	0.0	1.0
+chr2	263694	1.0	0.0	1.0
+chr2	263707	1.0	0.0	1.0
+chr2	263711	1.0	0.0	1.0
+chr2	263752	1.0	0.0	1.0
+chr2	263753	0.0	1.0	1.0
+chr2	263760	1.0	0.0	1.0
+chr2	263768	0.0	2.0	2.0
+chr2	263771	1.0	0.0	1.0
+chr2	263773	0.0	1.0	1.0
+chr2	263787	2.0	0.0	2.0
+chr2	263797	1.0	0.0	1.0
+chr2	263799	0.0	1.0	1.0
+chr2	263802	0.0	3.0	3.0
+chr2	263809	0.0	1.0	1.0
+chr2	263812	1.0	0.0	1.0
+chr2	263820	0.0	2.0	2.0
+chr2	263821	1.0	0.0	1.0
+chr2	263822	1.0	0.0	1.0
+chr2	263829	1.0	0.0	1.0
+chr2	263832	0.0	1.0	1.0
+chr2	263838	2.0	0.0	2.0
+chr2	263839	1.0	0.0	1.0
+chr2	263840	1.0	0.0	1.0
+chr2	263849	1.0	0.0	1.0
+chr2	263851	1.0	0.0	1.0
+chr2	263906	1.0	0.0	1.0
+chr2	263934	1.0	0.0	1.0
+chr2	263942	0.0	1.0	1.0
+chr2	263954	0.0	1.0	1.0
+chr2	263971	0.0	1.0	1.0
+chr2	263977	2.0	0.0	2.0
+chr2	263987	1.0	0.0	1.0
+chr2	263995	0.0	1.0	1.0
+chr2	264028	1.0	0.0	1.0
+chr2	264029	1.0	0.0	1.0
+chr2	264030	1.0	0.0	1.0
+chr2	264038	0.0	2.0	2.0
+chr2	264052	2.0	0.0	2.0
+chr2	264055	1.0	0.0	1.0
+chr2	264056	1.0	1.0	2.0
+chr2	264061	1.0	0.0	1.0
+chr2	264074	0.0	5.0	5.0
+chr2	264077	0.0	1.0	1.0
+chr2	264081	0.0	1.0	1.0
+chr2	264086	0.0	2.0	2.0
+chr2	264094	1.0	0.0	1.0
+chr2	264106	0.0	1.0	1.0
+chr2	264152	0.0	1.0	1.0
+chr2	264154	0.0	1.0	1.0
+chr2	264157	1.0	0.0	1.0
+chr2	264161	1.0	0.0	1.0
+chr2	264164	1.0	0.0	1.0
+chr2	264174	0.0	1.0	1.0
+chr2	264290	0.0	1.0	1.0
+chr2	264305	0.0	1.0	1.0
+chr2	264325	1.0	0.0	1.0
+chr2	264330	2.0	0.0	2.0
+chr2	264340	1.0	0.0	1.0
+chr2	264341	0.0	1.0	1.0
+chr2	264342	1.0	0.0	1.0
+chr2	264365	0.0	1.0	1.0
+chr2	264368	1.0	0.0	1.0
+chr2	264378	0.0	1.0	1.0
+chr2	264381	1.0	0.0	1.0
+chr2	264385	0.0	1.0	1.0
+chr2	264397	1.0	0.0	1.0
+chr2	264403	0.0	1.0	1.0
+chr2	264410	1.0	0.0	1.0
+chr2	264415	0.0	1.0	1.0
+chr2	264416	0.0	1.0	1.0
+chr2	264417	1.0	0.0	1.0
+chr2	264420	1.0	0.0	1.0
+chr2	264425	0.0	1.0	1.0
+chr2	264429	0.0	1.0	1.0
+chr2	264432	1.0	0.0	1.0
+chr2	264433	1.0	0.0	1.0
+chr2	264456	0.0	1.0	1.0
+chr2	264471	2.0	0.0	2.0
+chr2	264490	1.0	0.0	1.0
+chr2	264497	0.0	1.0	1.0
+chr2	264537	1.0	0.0	1.0
+chr2	264563	0.0	1.0	1.0
+chr2	264564	1.0	0.0	1.0
+chr2	264603	0.0	1.0	1.0
+chr2	264613	1.0	0.0	1.0
+chr2	264652	1.0	0.0	1.0
+chr2	264663	0.0	1.0	1.0
+chr2	264684	0.0	1.0	1.0
+chr2	264717	3.0	0.0	3.0
+chr2	264719	1.0	0.0	1.0
+chr2	264762	0.0	1.0	1.0
+chr2	264766	1.0	0.0	1.0
+chr2	264767	1.0	0.0	1.0
+chr2	264769	0.0	1.0	1.0
+chr2	264770	0.0	1.0	1.0
+chr2	264781	2.0	0.0	2.0
+chr2	264782	1.0	0.0	1.0
+chr2	264794	0.0	1.0	1.0
+chr2	264795	1.0	0.0	1.0
+chr2	264825	1.0	0.0	1.0
+chr2	264840	0.0	1.0	1.0
+chr2	264853	3.0	0.0	3.0
+chr2	264862	1.0	0.0	1.0
+chr2	264868	0.0	2.0	2.0
+chr2	264870	0.0	1.0	1.0
+chr2	264871	0.0	1.0	1.0
+chr2	264988	1.0	0.0	1.0
+chr2	265011	1.0	0.0	1.0
+chr2	265039	1.0	0.0	1.0
+chr2	265040	0.0	1.0	1.0
+chr2	265061	1.0	0.0	1.0
+chr2	265066	0.0	2.0	2.0
+chr2	265070	1.0	0.0	1.0
+chr2	265088	2.0	0.0	2.0
+chr2	265091	0.0	1.0	1.0
+chr2	265094	0.0	1.0	1.0
+chr2	265115	0.0	1.0	1.0
+chr2	265137	0.0	1.0	1.0
+chr2	265187	0.0	1.0	1.0
+chr2	265195	0.0	1.0	1.0
+chr2	265198	0.0	1.0	1.0
+chr2	265199	0.0	1.0	1.0
+chr2	265200	0.0	1.0	1.0
+chr2	265209	0.0	2.0	2.0
+chr2	265211	0.0	3.0	3.0
+chr2	265214	0.0	1.0	1.0
+chr2	265222	0.0	2.0	2.0
+chr2	265223	0.0	1.0	1.0
+chr2	265226	0.0	4.0	4.0
+chr2	265227	0.0	4.0	4.0
+chr2	265232	0.0	1.0	1.0
+chr2	265234	9.0	0.0	9.0
+chr2	265235	0.0	1.0	1.0
+chr2	265237	1.0	1.0	2.0
+chr2	265238	0.0	2.0	2.0
+chr2	265239	0.0	1.0	1.0
+chr2	265240	0.0	1.0	1.0
+chr2	265245	2.0	0.0	2.0
+chr2	265246	0.0	1.0	1.0
+chr2	265248	1.0	2.0	3.0
+chr2	265251	2.0	0.0	2.0
+chr2	265255	1.0	0.0	1.0
+chr2	265256	0.0	1.0	1.0
+chr2	265259	0.0	2.0	2.0
+chr2	265260	0.0	1.0	1.0
+chr2	265266	0.0	2.0	2.0
+chr2	265269	0.0	1.0	1.0
+chr2	265273	0.0	1.0	1.0
+chr2	265276	0.0	1.0	1.0
+chr2	265280	1.0	0.0	1.0
+chr2	265283	0.0	2.0	2.0
+chr2	265284	0.0	1.0	1.0
+chr2	265285	1.0	1.0	2.0
+chr2	265288	1.0	0.0	1.0
+chr2	265290	2.0	0.0	2.0
+chr2	265291	0.0	2.0	2.0
+chr2	265295	1.0	0.0	1.0
+chr2	265296	1.0	0.0	1.0
+chr2	265297	1.0	0.0	1.0
+chr2	265298	1.0	0.0	1.0
+chr2	265299	1.0	0.0	1.0
+chr2	265307	1.0	1.0	2.0
+chr2	265312	0.0	1.0	1.0
+chr2	265313	2.0	2.0	4.0
+chr2	265317	0.0	2.0	2.0
+chr2	265318	0.0	1.0	1.0
+chr2	265319	0.0	2.0	2.0
+chr2	265323	1.0	0.0	1.0
+chr2	265325	2.0	0.0	2.0
+chr2	265335	0.0	1.0	1.0
+chr2	265339	0.0	3.0	3.0
+chr2	265341	0.0	2.0	2.0
+chr2	265342	0.0	5.0	5.0
+chr2	265350	0.0	1.0	1.0
+chr2	265351	0.0	1.0	1.0
+chr2	265352	0.0	1.0	1.0
+chr2	265357	1.0	0.0	1.0
+chr2	265363	0.0	1.0	1.0
+chr2	265369	0.0	1.0	1.0
+chr2	265373	1.0	0.0	1.0
+chr2	265380	2.0	0.0	2.0
+chr2	265381	2.0	0.0	2.0
+chr2	265388	1.0	0.0	1.0
+chr2	265396	0.0	1.0	1.0
+chr2	265399	1.0	1.0	2.0
+chr2	265400	1.0	0.0	1.0
+chr2	265401	3.0	0.0	3.0
+chr2	265409	2.0	0.0	2.0
+chr2	265410	0.0	2.0	2.0
+chr2	265415	1.0	0.0	1.0
+chr2	265417	1.0	0.0	1.0
+chr2	265421	1.0	0.0	1.0
+chr2	265425	1.0	0.0	1.0
+chr2	265427	1.0	0.0	1.0
+chr2	265429	1.0	0.0	1.0
+chr2	265430	1.0	0.0	1.0
+chr2	265431	1.0	0.0	1.0
+chr2	265433	1.0	0.0	1.0
+chr2	265434	1.0	0.0	1.0
+chr2	265438	1.0	0.0	1.0
+chr2	265441	1.0	0.0	1.0
+chr2	265442	11.0	0.0	11.0
+chr2	265443	3.0	0.0	3.0
+chr2	265445	1.0	0.0	1.0
+chr2	265446	3.0	0.0	3.0
+chr2	265454	1.0	0.0	1.0
+chr2	265460	2.0	0.0	2.0
+chr2	265466	3.0	0.0	3.0
+chr2	265467	2.0	0.0	2.0
+chr2	265714	0.0	1.0	1.0
+chr2	265811	0.0	1.0	1.0
+chr2	265828	0.0	1.0	1.0
+chr2	265831	1.0	0.0	1.0
+chr2	265843	1.0	0.0	1.0
+chr2	265848	0.0	1.0	1.0
+chr2	265865	0.0	1.0	1.0
+chr2	265866	2.0	1.0	3.0
+chr2	265983	0.0	1.0	1.0
+chr2	266001	0.0	1.0	1.0
+chr2	266012	1.0	0.0	1.0
+chr2	266014	0.0	3.0	3.0
+chr2	266018	0.0	1.0	1.0
+chr2	266020	1.0	0.0	1.0
+chr2	266022	2.0	0.0	2.0
+chr2	266036	2.0	2.0	4.0
+chr2	266037	0.0	1.0	1.0
+chr2	266038	1.0	0.0	1.0
+chr2	266043	0.0	1.0	1.0
+chr2	266044	0.0	1.0	1.0
+chr2	266055	0.0	1.0	1.0
+chr2	266056	1.0	0.0	1.0
+chr2	266058	0.0	1.0	1.0
+chr2	266080	1.0	0.0	1.0
+chr2	266582	0.0	1.0	1.0
+chr2	266739	1.0	0.0	1.0
+chr2	266755	0.0	2.0	2.0
+chr2	266878	0.0	1.0	1.0
+chr2	266935	0.0	1.0	1.0
+chr2	267072	0.0	1.0	1.0
+chr2	267138	0.0	1.0	1.0
+chr2	267171	0.0	4.0	4.0
+chr2	267178	1.0	0.0	1.0
+chr2	267183	2.0	0.0	2.0
+chr2	267317	0.0	1.0	1.0
+chr2	267318	0.0	1.0	1.0
+chr2	267351	1.0	0.0	1.0
+chr2	267459	0.0	1.0	1.0
+chr2	267494	0.0	1.0	1.0
+chr2	267789	1.0	0.0	1.0
+chr2	268011	1.0	0.0	1.0
+chr2	268191	1.0	0.0	1.0
+chr2	268355	1.0	0.0	1.0
+chr2	268457	0.0	1.0	1.0
+chr2	268470	1.0	0.0	1.0
+chr2	268985	1.0	0.0	1.0
+chr2	269052	1.0	0.0	1.0
+chr2	269079	1.0	0.0	1.0
+chr2	269191	1.0	0.0	1.0
+chr2	269229	0.0	1.0	1.0
+chr2	269236	2.0	0.0	2.0
+chr2	269330	0.0	1.0	1.0
+chr2	269332	1.0	0.0	1.0
+chr2	269344	0.0	1.0	1.0
+chr2	269370	1.0	0.0	1.0
+chr2	269380	1.0	0.0	1.0
+chr2	269383	0.0	1.0	1.0
+chr2	269391	0.0	1.0	1.0
+chr2	269396	0.0	3.0	3.0
+chr2	269398	0.0	1.0	1.0
+chr2	269406	0.0	1.0	1.0
+chr2	269427	1.0	0.0	1.0
+chr2	269472	0.0	1.0	1.0
+chr2	269542	0.0	1.0	1.0
+chr2	269546	1.0	0.0	1.0
+chr2	269553	1.0	0.0	1.0
+chr2	269556	0.0	1.0	1.0
+chr2	269562	0.0	1.0	1.0
+chr2	269564	1.0	0.0	1.0
+chr2	269565	0.0	1.0	1.0
+chr2	269569	2.0	0.0	2.0
+chr2	269579	0.0	1.0	1.0
+chr2	269588	1.0	0.0	1.0
+chr2	269596	1.0	0.0	1.0
+chr2	269602	1.0	0.0	1.0
+chr2	269823	1.0	0.0	1.0
+chr2	269827	0.0	2.0	2.0
+chr2	269828	0.0	1.0	1.0
+chr2	269843	3.0	0.0	3.0
+chr2	269844	1.0	0.0	1.0
+chr2	269846	1.0	0.0	1.0
+chr2	269855	1.0	0.0	1.0
+chr2	269860	0.0	2.0	2.0
+chr2	269902	1.0	0.0	1.0
+chr2	269904	0.0	1.0	1.0
+chr2	269960	0.0	1.0	1.0
+chr2	269982	1.0	0.0	1.0
+chr2	269997	0.0	1.0	1.0
+chr2	270022	1.0	0.0	1.0
+chr2	270027	1.0	0.0	1.0
+chr2	270237	0.0	2.0	2.0
+chr2	270245	1.0	0.0	1.0
+chr2	270252	1.0	0.0	1.0
+chr2	270259	0.0	1.0	1.0
+chr2	270260	4.0	0.0	4.0
+chr2	270272	0.0	2.0	2.0
+chr2	270281	0.0	1.0	1.0
+chr2	270372	0.0	1.0	1.0
+chr2	270390	0.0	1.0	1.0
+chr2	270395	1.0	0.0	1.0
+chr2	270416	2.0	0.0	2.0
+chr2	270417	0.0	1.0	1.0
+chr2	270431	0.0	1.0	1.0
+chr2	270432	0.0	1.0	1.0
+chr2	270484	0.0	1.0	1.0
+chr2	270552	1.0	0.0	1.0
+chr2	270571	0.0	1.0	1.0
+chr2	270576	0.0	1.0	1.0
+chr2	270582	6.0	0.0	6.0
+chr2	270586	0.0	1.0	1.0
+chr2	270591	0.0	2.0	2.0
+chr2	270602	1.0	0.0	1.0
+chr2	271118	0.0	1.0	1.0
+chr2	271137	1.0	0.0	1.0
+chr2	271183	0.0	1.0	1.0
+chr2	271235	1.0	0.0	1.0
+chr2	271292	1.0	0.0	1.0
+chr2	271351	0.0	1.0	1.0
+chr2	271531	1.0	0.0	1.0
+chr2	271669	0.0	1.0	1.0
+chr2	271926	1.0	0.0	1.0
+chr2	271989	0.0	1.0	1.0
+chr2	272526	1.0	0.0	1.0
+chr2	272628	1.0	0.0	1.0
+chr2	272805	1.0	0.0	1.0
+chr2	273099	1.0	0.0	1.0
+chr2	273234	0.0	1.0	1.0
+chr2	273390	0.0	1.0	1.0
+chr2	273532	1.0	0.0	1.0
+chr2	273536	0.0	1.0	1.0
+chr2	273537	0.0	2.0	2.0
+chr2	273553	1.0	0.0	1.0
+chr2	273561	0.0	1.0	1.0
+chr2	273680	0.0	2.0	2.0
+chr2	273682	0.0	1.0	1.0
+chr2	273686	0.0	1.0	1.0
+chr2	273687	0.0	1.0	1.0
+chr2	273690	0.0	4.0	4.0
+chr2	273691	1.0	1.0	2.0
+chr2	273692	1.0	0.0	1.0
+chr2	273694	1.0	1.0	2.0
+chr2	273695	0.0	2.0	2.0
+chr2	273700	0.0	1.0	1.0
+chr2	273701	1.0	0.0	1.0
+chr2	273702	5.0	0.0	5.0
+chr2	273703	0.0	1.0	1.0
+chr2	273704	0.0	1.0	1.0
+chr2	273708	0.0	1.0	1.0
+chr2	273711	3.0	0.0	3.0
+chr2	273715	0.0	3.0	3.0
+chr2	273719	1.0	0.0	1.0
+chr2	273721	0.0	2.0	2.0
+chr2	273722	1.0	0.0	1.0
+chr2	273729	2.0	0.0	2.0
+chr2	273968	0.0	1.0	1.0
+chr2	273989	0.0	1.0	1.0
+chr2	274004	1.0	0.0	1.0
+chr2	274006	1.0	0.0	1.0
+chr2	274017	0.0	1.0	1.0
+chr2	274019	0.0	1.0	1.0
+chr2	274522	1.0	0.0	1.0
+chr2	274560	1.0	0.0	1.0
+chr2	274621	1.0	0.0	1.0
+chr2	274681	1.0	0.0	1.0
+chr2	274727	1.0	0.0	1.0
+chr2	274805	0.0	1.0	1.0
+chr2	274967	0.0	1.0	1.0
+chr2	275024	2.0	0.0	2.0
+chr2	275048	0.0	1.0	1.0
+chr2	275066	0.0	1.0	1.0
+chr2	275106	1.0	0.0	1.0
+chr2	275119	1.0	0.0	1.0
+chr2	275145	1.0	0.0	1.0
+chr2	275219	1.0	0.0	1.0
+chr2	275223	0.0	1.0	1.0
+chr2	275247	1.0	0.0	1.0
+chr2	275252	0.0	1.0	1.0
+chr2	275261	1.0	0.0	1.0
+chr2	275306	0.0	1.0	1.0
+chr2	275380	0.0	1.0	1.0
+chr2	275389	0.0	1.0	1.0
+chr2	275391	0.0	1.0	1.0
+chr2	275394	2.0	0.0	2.0
+chr2	275397	0.0	3.0	3.0
+chr2	275398	0.0	1.0	1.0
+chr2	275403	0.0	1.0	1.0
+chr2	275404	0.0	1.0	1.0
+chr2	275406	1.0	0.0	1.0
+chr2	275408	0.0	1.0	1.0
+chr2	275409	1.0	1.0	2.0
+chr2	275418	1.0	0.0	1.0
+chr2	275427	0.0	2.0	2.0
+chr2	275428	0.0	1.0	1.0
+chr2	275430	0.0	1.0	1.0
+chr2	275434	0.0	1.0	1.0
+chr2	275437	0.0	2.0	2.0
+chr2	275438	2.0	0.0	2.0
+chr2	275442	1.0	0.0	1.0
+chr2	275446	0.0	2.0	2.0
+chr2	275455	3.0	0.0	3.0
+chr2	275566	0.0	1.0	1.0
+chr2	275587	1.0	0.0	1.0
+chr2	275594	0.0	2.0	2.0
+chr2	275607	0.0	1.0	1.0
+chr2	275609	0.0	1.0	1.0
+chr2	275610	0.0	1.0	1.0
+chr2	275614	1.0	0.0	1.0
+chr2	275627	0.0	1.0	1.0
+chr2	275632	1.0	0.0	1.0
+chr2	275641	0.0	2.0	2.0
+chr2	275653	0.0	1.0	1.0
+chr2	275656	1.0	0.0	1.0
+chr2	275663	0.0	1.0	1.0
+chr2	275825	0.0	1.0	1.0
+chr2	275828	1.0	0.0	1.0
+chr2	275846	0.0	1.0	1.0
+chr2	275854	2.0	0.0	2.0
+chr2	275855	2.0	1.0	3.0
+chr2	275870	0.0	1.0	1.0
+chr2	275934	0.0	1.0	1.0
+chr2	276000	0.0	1.0	1.0
+chr2	276016	1.0	0.0	1.0
+chr2	276019	1.0	0.0	1.0
+chr2	276021	0.0	1.0	1.0
+chr2	276039	0.0	2.0	2.0
+chr2	276041	1.0	0.0	1.0
+chr2	276043	1.0	0.0	1.0
+chr2	276055	0.0	2.0	2.0
+chr2	276061	1.0	0.0	1.0
+chr2	276198	0.0	1.0	1.0
+chr2	276339	1.0	0.0	1.0
+chr2	276350	0.0	2.0	2.0
+chr2	276490	0.0	1.0	1.0
+chr2	276491	1.0	0.0	1.0
+chr2	276497	2.0	0.0	2.0
+chr2	276507	0.0	2.0	2.0
+chr2	276508	1.0	0.0	1.0
+chr2	276511	1.0	0.0	1.0
+chr2	276514	1.0	0.0	1.0
+chr2	276515	3.0	0.0	3.0
+chr2	276520	0.0	2.0	2.0
+chr2	276521	1.0	0.0	1.0
+chr2	276525	0.0	1.0	1.0
+chr2	276527	1.0	0.0	1.0
+chr2	276530	1.0	0.0	1.0
+chr2	276532	2.0	0.0	2.0
+chr2	276536	1.0	0.0	1.0
+chr2	276540	0.0	1.0	1.0
+chr2	276548	1.0	1.0	2.0
+chr2	276557	0.0	1.0	1.0
+chr2	276570	1.0	0.0	1.0
+chr2	276655	1.0	0.0	1.0
+chr2	276695	1.0	0.0	1.0
+chr2	276765	0.0	1.0	1.0
+chr2	276778	1.0	0.0	1.0
+chr2	276779	2.0	0.0	2.0
+chr2	276788	0.0	1.0	1.0
+chr2	276790	1.0	2.0	3.0
+chr2	276796	1.0	0.0	1.0
+chr2	276797	0.0	2.0	2.0
+chr2	276802	0.0	6.0	6.0
+chr2	276803	0.0	2.0	2.0
+chr2	276805	2.0	3.0	5.0
+chr2	276807	0.0	3.0	3.0
+chr2	276808	0.0	3.0	3.0
+chr2	276809	0.0	2.0	2.0
+chr2	276811	1.0	0.0	1.0
+chr2	276812	2.0	0.0	2.0
+chr2	276814	1.0	0.0	1.0
+chr2	276816	2.0	0.0	2.0
+chr2	276819	1.0	0.0	1.0
+chr2	276820	2.0	1.0	3.0
+chr2	276821	2.0	3.0	5.0
+chr2	276823	0.0	1.0	1.0
+chr2	276828	1.0	0.0	1.0
+chr2	276832	2.0	0.0	2.0
+chr2	276833	2.0	2.0	4.0
+chr2	276834	0.0	1.0	1.0
+chr2	276840	0.0	1.0	1.0
+chr2	276844	0.0	2.0	2.0
+chr2	276860	1.0	0.0	1.0
+chr2	276957	0.0	1.0	1.0
+chr2	276963	1.0	0.0	1.0
+chr2	276977	0.0	2.0	2.0
+chr2	276995	1.0	0.0	1.0
+chr2	277109	0.0	1.0	1.0
+chr2	277137	1.0	0.0	1.0
+chr2	277138	1.0	0.0	1.0
+chr2	277162	1.0	0.0	1.0
+chr2	277163	1.0	0.0	1.0
+chr2	277174	0.0	1.0	1.0
+chr2	277289	0.0	1.0	1.0
+chr2	277307	1.0	0.0	1.0
+chr2	277323	1.0	0.0	1.0
+chr2	277368	0.0	1.0	1.0
+chr2	277375	1.0	0.0	1.0
+chr2	277557	1.0	0.0	1.0
+chr2	277759	0.0	2.0	2.0
+chr2	277906	1.0	0.0	1.0
+chr2	277993	1.0	0.0	1.0
+chr2	278168	0.0	1.0	1.0
+chr2	278789	0.0	1.0	1.0
+chr2	278791	0.0	3.0	3.0
+chr2	278792	0.0	1.0	1.0
+chr2	278798	1.0	0.0	1.0
+chr2	278799	1.0	0.0	1.0
+chr2	278800	0.0	3.0	3.0
+chr2	278801	0.0	2.0	2.0
+chr2	279496	0.0	1.0	1.0
+chr2	279531	1.0	0.0	1.0
+chr2	279637	0.0	1.0	1.0
+chr2	279671	1.0	0.0	1.0
+chr2	279857	0.0	1.0	1.0
+chr2	279860	0.0	1.0	1.0
+chr2	279889	0.0	1.0	1.0
+chr2	280232	0.0	4.0	4.0
+chr2	280494	0.0	1.0	1.0
+chr2	280508	0.0	1.0	1.0
+chr2	280521	0.0	2.0	2.0
+chr2	280833	0.0	1.0	1.0
+chr2	280855	1.0	0.0	1.0
+chr2	280858	1.0	0.0	1.0
+chr2	280870	0.0	1.0	1.0
+chr2	280871	1.0	0.0	1.0
+chr2	280872	1.0	1.0	2.0
+chr2	280883	1.0	0.0	1.0
+chr2	280891	0.0	1.0	1.0
+chr2	280894	0.0	1.0	1.0
+chr2	281334	1.0	0.0	1.0
+chr2	281339	1.0	0.0	1.0
+chr2	281348	0.0	1.0	1.0
+chr2	281356	0.0	1.0	1.0
+chr2	281471	1.0	0.0	1.0
+chr2	281480	0.0	1.0	1.0
+chr2	281684	0.0	1.0	1.0
+chr2	281689	1.0	0.0	1.0
+chr2	281816	1.0	0.0	1.0
+chr2	281846	1.0	0.0	1.0
+chr2	281870	1.0	0.0	1.0
+chr2	281871	1.0	0.0	1.0
+chr2	281971	2.0	0.0	2.0
+chr2	282011	0.0	1.0	1.0
+chr2	282062	1.0	0.0	1.0
+chr2	282145	0.0	1.0	1.0
+chr2	282157	0.0	1.0	1.0
+chr2	282165	1.0	0.0	1.0
+chr2	282172	0.0	1.0	1.0
+chr2	282196	1.0	0.0	1.0
+chr2	282206	0.0	1.0	1.0
+chr2	282313	0.0	2.0	2.0
+chr2	282328	1.0	0.0	1.0
+chr2	282400	1.0	0.0	1.0
+chr2	282482	0.0	1.0	1.0
+chr2	282574	0.0	1.0	1.0
+chr2	282617	0.0	1.0	1.0
+chr2	282698	0.0	1.0	1.0
+chr2	282733	0.0	1.0	1.0
+chr2	282748	2.0	0.0	2.0
+chr2	282936	1.0	0.0	1.0
+chr2	283091	0.0	1.0	1.0
+chr2	283301	1.0	0.0	1.0
+chr2	283308	0.0	1.0	1.0
+chr2	283317	0.0	1.0	1.0
+chr2	283468	0.0	1.0	1.0
+chr2	283481	0.0	1.0	1.0
+chr2	283498	0.0	1.0	1.0
+chr2	283619	0.0	1.0	1.0
+chr2	283621	0.0	1.0	1.0
+chr2	283628	1.0	0.0	1.0
+chr2	283640	0.0	1.0	1.0
+chr2	283695	0.0	1.0	1.0
+chr2	283697	1.0	0.0	1.0
+chr2	283698	0.0	1.0	1.0
+chr2	283712	0.0	1.0	1.0
+chr2	283713	0.0	2.0	2.0
+chr2	283725	1.0	0.0	1.0
+chr2	283732	0.0	2.0	2.0
+chr2	283763	0.0	1.0	1.0
+chr2	283784	0.0	1.0	1.0
+chr2	283791	0.0	1.0	1.0
+chr2	283807	0.0	1.0	1.0
+chr2	283809	0.0	1.0	1.0
+chr2	283810	0.0	1.0	1.0
+chr2	283812	1.0	0.0	1.0
+chr2	283814	1.0	0.0	1.0
+chr2	283828	0.0	1.0	1.0
+chr2	283833	0.0	1.0	1.0
+chr2	283842	0.0	1.0	1.0
+chr2	283861	1.0	0.0	1.0
+chr2	283863	1.0	1.0	2.0
+chr2	283876	1.0	0.0	1.0
+chr2	283880	2.0	0.0	2.0
+chr2	283886	0.0	1.0	1.0
+chr2	283889	1.0	1.0	2.0
+chr2	283896	0.0	1.0	1.0
+chr2	283906	1.0	0.0	1.0
+chr2	283917	0.0	2.0	2.0
+chr2	283922	1.0	0.0	1.0
+chr2	283948	0.0	1.0	1.0
+chr2	284101	0.0	1.0	1.0
+chr2	284111	1.0	0.0	1.0
+chr2	284116	0.0	1.0	1.0
+chr2	284119	1.0	0.0	1.0
+chr2	284152	0.0	1.0	1.0
+chr2	284177	0.0	1.0	1.0
+chr2	284183	1.0	0.0	1.0
+chr2	284214	1.0	0.0	1.0
+chr2	284504	1.0	0.0	1.0
+chr2	284700	1.0	0.0	1.0
+chr2	284987	1.0	0.0	1.0
+chr2	285167	1.0	0.0	1.0
+chr2	285283	2.0	0.0	2.0
+chr2	285402	0.0	1.0	1.0
+chr2	285643	1.0	0.0	1.0
+chr2	285747	1.0	0.0	1.0
+chr2	285880	2.0	0.0	2.0
+chr2	286155	0.0	1.0	1.0
+chr2	286265	1.0	0.0	1.0
+chr2	286911	0.0	1.0	1.0
+chr2	287123	1.0	0.0	1.0
+chr2	287355	1.0	0.0	1.0
+chr2	287492	0.0	1.0	1.0
+chr2	287536	1.0	0.0	1.0
+chr2	287647	1.0	0.0	1.0
+chr2	287651	1.0	0.0	1.0
+chr2	287691	0.0	1.0	1.0
+chr2	287693	0.0	1.0	1.0
+chr2	287700	0.0	1.0	1.0
+chr2	287822	0.0	1.0	1.0
+chr2	287832	0.0	1.0	1.0
+chr2	287851	1.0	1.0	2.0
+chr2	287852	0.0	1.0	1.0
+chr2	287856	0.0	2.0	2.0
+chr2	287864	1.0	0.0	1.0
+chr2	287865	3.0	0.0	3.0
+chr2	287866	1.0	0.0	1.0
+chr2	287877	1.0	0.0	1.0
+chr2	287896	0.0	1.0	1.0
+chr2	288007	0.0	1.0	1.0
+chr2	288010	0.0	3.0	3.0
+chr2	288013	1.0	0.0	1.0
+chr2	288016	0.0	2.0	2.0
+chr2	288017	0.0	2.0	2.0
+chr2	288022	0.0	2.0	2.0
+chr2	288024	3.0	0.0	3.0
+chr2	288025	2.0	0.0	2.0
+chr2	288027	5.0	0.0	5.0
+chr2	288029	2.0	0.0	2.0
+chr2	288037	3.0	1.0	4.0
+chr2	288038	0.0	1.0	1.0
+chr2	288042	0.0	1.0	1.0
+chr2	288048	0.0	2.0	2.0
+chr2	288054	1.0	1.0	2.0
+chr2	288265	0.0	1.0	1.0
+chr2	288281	0.0	2.0	2.0
+chr2	288282	0.0	2.0	2.0
+chr2	288287	4.0	0.0	4.0
+chr2	288289	1.0	0.0	1.0
+chr2	288297	0.0	1.0	1.0
+chr2	288299	1.0	0.0	1.0
+chr2	288300	2.0	0.0	2.0
+chr2	288313	2.0	0.0	2.0
+chr2	288317	2.0	3.0	5.0
+chr2	288318	0.0	1.0	1.0
+chr2	288319	2.0	0.0	2.0
+chr2	288320	1.0	0.0	1.0
+chr2	288324	1.0	0.0	1.0
+chr2	288326	0.0	1.0	1.0
+chr2	288339	0.0	1.0	1.0
+chr2	288340	0.0	2.0	2.0
+chr2	288344	1.0	0.0	1.0
+chr2	288434	1.0	0.0	1.0
+chr2	288439	2.0	0.0	2.0
+chr2	288453	2.0	0.0	2.0
+chr2	288457	0.0	2.0	2.0
+chr2	288469	1.0	0.0	1.0
+chr2	288474	1.0	0.0	1.0
+chr2	288489	0.0	1.0	1.0
+chr2	288498	0.0	1.0	1.0
+chr2	288504	1.0	0.0	1.0
+chr2	288567	1.0	0.0	1.0
+chr2	288672	0.0	1.0	1.0
+chr2	288679	2.0	0.0	2.0
+chr2	288681	2.0	0.0	2.0
+chr2	288683	0.0	1.0	1.0
+chr2	288698	0.0	1.0	1.0
+chr2	288700	0.0	1.0	1.0
+chr2	288722	1.0	0.0	1.0
+chr2	288810	1.0	0.0	1.0
+chr2	288836	1.0	0.0	1.0
+chr2	288857	0.0	1.0	1.0
+chr2	288867	1.0	0.0	1.0
+chr2	288888	0.0	1.0	1.0
+chr2	288976	1.0	0.0	1.0
+chr2	288989	1.0	0.0	1.0
+chr2	288994	1.0	0.0	1.0
+chr2	289036	0.0	1.0	1.0
+chr2	289085	1.0	0.0	1.0
+chr2	289093	0.0	1.0	1.0
+chr2	289108	1.0	0.0	1.0
+chr2	289109	1.0	2.0	3.0
+chr2	289115	0.0	1.0	1.0
+chr2	289118	0.0	1.0	1.0
+chr2	289119	0.0	1.0	1.0
+chr2	289122	0.0	1.0	1.0
+chr2	289127	0.0	1.0	1.0
+chr2	289129	4.0	0.0	4.0
+chr2	289130	4.0	0.0	4.0
+chr2	289131	5.0	0.0	5.0
+chr2	289132	1.0	0.0	1.0
+chr2	289137	0.0	8.0	8.0
+chr2	289138	2.0	2.0	4.0
+chr2	289139	0.0	1.0	1.0
+chr2	289141	1.0	2.0	3.0
+chr2	289142	0.0	1.0	1.0
+chr2	289146	0.0	1.0	1.0
+chr2	289147	1.0	0.0	1.0
+chr2	289148	1.0	1.0	2.0
+chr2	289149	0.0	4.0	4.0
+chr2	289150	2.0	0.0	2.0
+chr2	289151	1.0	0.0	1.0
+chr2	289152	0.0	1.0	1.0
+chr2	289153	4.0	0.0	4.0
+chr2	289154	9.0	0.0	9.0
+chr2	289155	0.0	7.0	7.0
+chr2	289156	0.0	1.0	1.0
+chr2	289157	1.0	0.0	1.0
+chr2	289160	0.0	8.0	8.0
+chr2	289161	0.0	2.0	2.0
+chr2	289162	0.0	2.0	2.0
+chr2	289165	0.0	1.0	1.0
+chr2	289166	1.0	0.0	1.0
+chr2	289194	0.0	2.0	2.0
+chr2	289197	0.0	1.0	1.0
+chr2	289364	0.0	1.0	1.0
+chr2	289368	0.0	2.0	2.0
+chr2	289369	0.0	4.0	4.0
+chr2	289373	1.0	0.0	1.0
+chr2	289375	0.0	1.0	1.0
+chr2	289378	1.0	5.0	6.0
+chr2	289380	2.0	0.0	2.0
+chr2	289381	4.0	0.0	4.0
+chr2	289389	0.0	2.0	2.0
+chr2	289390	0.0	1.0	1.0
+chr2	289391	0.0	1.0	1.0
+chr2	289393	0.0	1.0	1.0
+chr2	289398	0.0	1.0	1.0
+chr2	289401	1.0	0.0	1.0
+chr2	289404	0.0	1.0	1.0
+chr2	289409	0.0	3.0	3.0
+chr2	289426	2.0	0.0	2.0
+chr2	289550	0.0	1.0	1.0
+chr2	289556	1.0	2.0	3.0
+chr2	289560	1.0	1.0	2.0
+chr2	289562	2.0	0.0	2.0
+chr2	289565	1.0	0.0	1.0
+chr2	289566	0.0	2.0	2.0
+chr2	289570	0.0	1.0	1.0
+chr2	289578	0.0	1.0	1.0
+chr2	289583	1.0	0.0	1.0
+chr2	289606	0.0	1.0	1.0
+chr2	289609	0.0	1.0	1.0
+chr2	289708	0.0	1.0	1.0
+chr2	289712	1.0	0.0	1.0
+chr2	289780	1.0	0.0	1.0
+chr2	289861	0.0	1.0	1.0
+chr2	289871	0.0	1.0	1.0
+chr2	289877	0.0	1.0	1.0
+chr2	289880	1.0	0.0	1.0
+chr2	289903	0.0	1.0	1.0
+chr2	289970	0.0	1.0	1.0
+chr2	289994	1.0	0.0	1.0
+chr2	290031	1.0	0.0	1.0
+chr2	290033	0.0	1.0	1.0
+chr2	290042	1.0	0.0	1.0
+chr2	290058	0.0	1.0	1.0
+chr2	290080	1.0	0.0	1.0
+chr2	290133	0.0	1.0	1.0
+chr2	290167	0.0	2.0	2.0
+chr2	290178	0.0	1.0	1.0
+chr2	290190	0.0	1.0	1.0
+chr2	290191	1.0	1.0	2.0
+chr2	290199	0.0	1.0	1.0
+chr2	290202	1.0	0.0	1.0
+chr2	290205	0.0	1.0	1.0
+chr2	290208	1.0	0.0	1.0
+chr2	290219	1.0	0.0	1.0
+chr2	290224	1.0	0.0	1.0
+chr2	290240	0.0	2.0	2.0
+chr2	290241	0.0	2.0	2.0
+chr2	290259	1.0	0.0	1.0
+chr2	290290	0.0	2.0	2.0
+chr2	290292	2.0	0.0	2.0
+chr2	290294	1.0	0.0	1.0
+chr2	290300	0.0	1.0	1.0
+chr2	290309	0.0	1.0	1.0
+chr2	290310	1.0	0.0	1.0
+chr2	290570	0.0	1.0	1.0
+chr2	290581	2.0	0.0	2.0
+chr2	290718	1.0	0.0	1.0
+chr2	290759	1.0	0.0	1.0
+chr2	290874	0.0	1.0	1.0
+chr2	291025	1.0	0.0	1.0
+chr2	291407	0.0	1.0	1.0
+chr2	291431	0.0	1.0	1.0
+chr2	291557	0.0	1.0	1.0
+chr2	291575	0.0	1.0	1.0
+chr2	291601	0.0	1.0	1.0
+chr2	291978	0.0	1.0	1.0
+chr2	292206	1.0	0.0	1.0
+chr2	292238	2.0	0.0	2.0
+chr2	292261	0.0	1.0	1.0
+chr2	292264	0.0	1.0	1.0
+chr2	292269	1.0	0.0	1.0
+chr2	292271	0.0	1.0	1.0
+chr2	292277	0.0	1.0	1.0
+chr2	292279	0.0	1.0	1.0
+chr2	292288	1.0	0.0	1.0
+chr2	292316	1.0	0.0	1.0
+chr2	292328	1.0	0.0	1.0
+chr2	292491	1.0	0.0	1.0
+chr2	292506	0.0	1.0	1.0
+chr2	292508	1.0	0.0	1.0
+chr2	292516	2.0	0.0	2.0
+chr2	292520	0.0	1.0	1.0
+chr2	292521	0.0	1.0	1.0
+chr2	292526	1.0	2.0	3.0
+chr2	292527	4.0	0.0	4.0
+chr2	292536	0.0	3.0	3.0
+chr2	292538	4.0	0.0	4.0
+chr2	292543	1.0	0.0	1.0
+chr2	292544	5.0	0.0	5.0
+chr2	292547	0.0	1.0	1.0
+chr2	292548	0.0	1.0	1.0
+chr2	292564	1.0	0.0	1.0
+chr2	292682	0.0	1.0	1.0
+chr2	292686	0.0	1.0	1.0
+chr2	292697	0.0	2.0	2.0
+chr2	292698	0.0	1.0	1.0
+chr2	292700	0.0	1.0	1.0
+chr2	292704	0.0	1.0	1.0
+chr2	292711	1.0	0.0	1.0
+chr2	292712	1.0	0.0	1.0
+chr2	292765	1.0	0.0	1.0
+chr2	292789	1.0	0.0	1.0
+chr2	292864	0.0	1.0	1.0
+chr2	292971	1.0	0.0	1.0
+chr2	293054	0.0	1.0	1.0
+chr2	293105	2.0	0.0	2.0
+chr2	293192	0.0	1.0	1.0
+chr2	293441	0.0	1.0	1.0
+chr2	293575	0.0	1.0	1.0
+chr2	293700	0.0	1.0	1.0
+chr2	293704	1.0	0.0	1.0
+chr2	293706	0.0	1.0	1.0
+chr2	293712	1.0	0.0	1.0
+chr2	293719	3.0	0.0	3.0
+chr2	293784	0.0	1.0	1.0
+chr2	293850	0.0	1.0	1.0
+chr2	293878	1.0	0.0	1.0
+chr2	293998	1.0	0.0	1.0
+chr2	294010	3.0	0.0	3.0
+chr2	294015	2.0	1.0	3.0
+chr2	294020	1.0	0.0	1.0
+chr2	294021	0.0	1.0	1.0
+chr2	294023	1.0	0.0	1.0
+chr2	294025	1.0	0.0	1.0
+chr2	294029	0.0	1.0	1.0
+chr2	294031	0.0	1.0	1.0
+chr2	294032	0.0	2.0	2.0
+chr2	294033	0.0	1.0	1.0
+chr2	294034	1.0	0.0	1.0
+chr2	294035	1.0	0.0	1.0
+chr2	294045	0.0	1.0	1.0
+chr2	294054	1.0	0.0	1.0
+chr2	294063	0.0	1.0	1.0
+chr2	294065	0.0	1.0	1.0
+chr2	294074	0.0	1.0	1.0
+chr2	294082	0.0	1.0	1.0
+chr2	294083	0.0	1.0	1.0
+chr2	294090	0.0	3.0	3.0
+chr2	294116	0.0	1.0	1.0
+chr2	294141	1.0	0.0	1.0
+chr2	294220	1.0	0.0	1.0
+chr2	294450	0.0	1.0	1.0
+chr2	294456	1.0	0.0	1.0
+chr2	294473	2.0	0.0	2.0
+chr2	294589	0.0	1.0	1.0
+chr2	294634	1.0	0.0	1.0
+chr2	294793	0.0	1.0	1.0
+chr2	295119	1.0	0.0	1.0
+chr2	295416	1.0	0.0	1.0
+chr2	295583	0.0	1.0	1.0
+chr2	295699	1.0	0.0	1.0
+chr2	295853	0.0	1.0	1.0
+chr2	295854	0.0	2.0	2.0
+chr2	295859	1.0	0.0	1.0
+chr2	295861	0.0	1.0	1.0
+chr2	295864	0.0	1.0	1.0
+chr2	295869	1.0	0.0	1.0
+chr2	295871	1.0	0.0	1.0
+chr2	295874	0.0	1.0	1.0
+chr2	295889	1.0	0.0	1.0
+chr2	295958	0.0	1.0	1.0
+chr2	295969	0.0	1.0	1.0
+chr2	296007	0.0	1.0	1.0
+chr2	296008	0.0	1.0	1.0
+chr2	296010	0.0	1.0	1.0
+chr2	296011	0.0	1.0	1.0
+chr2	296012	1.0	0.0	1.0
+chr2	296013	0.0	1.0	1.0
+chr2	296015	2.0	1.0	3.0
+chr2	296017	0.0	2.0	2.0
+chr2	296019	1.0	0.0	1.0
+chr2	296021	1.0	0.0	1.0
+chr2	296023	1.0	0.0	1.0
+chr2	296028	1.0	0.0	1.0
+chr2	296029	6.0	0.0	6.0
+chr2	296034	0.0	1.0	1.0
+chr2	296036	0.0	1.0	1.0
+chr2	296042	0.0	1.0	1.0
+chr2	296047	1.0	0.0	1.0
+chr2	296048	0.0	1.0	1.0
+chr2	296049	0.0	1.0	1.0
+chr2	296061	1.0	0.0	1.0
+chr2	296069	0.0	1.0	1.0
+chr2	296070	0.0	1.0	1.0
+chr2	296071	0.0	1.0	1.0
+chr2	296078	2.0	0.0	2.0
+chr2	296084	0.0	1.0	1.0
+chr2	296533	1.0	0.0	1.0
+chr2	296760	0.0	1.0	1.0
+chr2	296937	1.0	0.0	1.0
+chr2	297311	1.0	0.0	1.0
+chr2	297455	1.0	0.0	1.0
+chr2	297606	1.0	0.0	1.0
+chr2	297609	1.0	0.0	1.0
+chr2	297611	1.0	0.0	1.0
+chr2	297616	1.0	0.0	1.0
+chr2	297622	0.0	1.0	1.0
+chr2	297634	1.0	0.0	1.0
+chr2	297644	0.0	1.0	1.0
+chr2	297724	0.0	1.0	1.0
+chr2	297762	0.0	1.0	1.0
+chr2	297769	1.0	0.0	1.0
+chr2	297770	1.0	0.0	1.0
+chr2	297772	1.0	1.0	2.0
+chr2	297782	1.0	2.0	3.0
+chr2	297783	1.0	0.0	1.0
+chr2	297787	1.0	0.0	1.0
+chr2	297793	0.0	3.0	3.0
+chr2	297797	2.0	3.0	5.0
+chr2	297801	2.0	0.0	2.0
+chr2	297805	1.0	0.0	1.0
+chr2	297846	1.0	0.0	1.0
+chr2	297872	1.0	0.0	1.0
+chr2	297991	0.0	1.0	1.0
+chr2	298021	1.0	0.0	1.0
+chr2	298025	1.0	0.0	1.0
+chr2	298028	0.0	1.0	1.0
+chr2	298031	0.0	2.0	2.0
+chr2	298032	1.0	0.0	1.0
+chr2	298037	1.0	0.0	1.0
+chr2	298056	3.0	0.0	3.0
+chr2	298060	1.0	0.0	1.0
+chr2	298063	0.0	2.0	2.0
+chr2	298064	0.0	1.0	1.0
+chr2	298069	1.0	0.0	1.0
+chr2	298071	0.0	1.0	1.0
+chr2	298075	0.0	1.0	1.0
+chr2	298094	1.0	2.0	3.0
+chr2	298095	1.0	0.0	1.0
+chr2	298118	1.0	0.0	1.0
+chr2	298247	0.0	1.0	1.0
+chr2	298248	1.0	0.0	1.0
+chr2	298258	0.0	2.0	2.0
+chr2	298261	0.0	2.0	2.0
+chr2	298270	0.0	1.0	1.0
+chr2	298278	4.0	0.0	4.0
+chr2	298285	0.0	1.0	1.0
+chr2	298286	0.0	1.0	1.0
+chr2	298292	1.0	1.0	2.0
+chr2	298308	1.0	0.0	1.0
+chr2	298384	1.0	0.0	1.0
+chr2	298432	0.0	1.0	1.0
+chr2	298454	2.0	0.0	2.0
+chr2	298457	1.0	0.0	1.0
+chr2	298462	1.0	0.0	1.0
+chr2	298731	2.0	0.0	2.0
+chr2	298734	0.0	1.0	1.0
+chr2	298752	0.0	1.0	1.0
+chr2	299107	0.0	2.0	2.0
+chr2	299201	0.0	2.0	2.0
+chr2	299372	0.0	1.0	1.0
+chr2	299531	0.0	1.0	1.0
+chr2	299534	1.0	2.0	3.0
+chr2	299624	1.0	0.0	1.0
+chr2	299638	0.0	1.0	1.0
+chr2	299658	0.0	1.0	1.0
+chr2	299840	0.0	3.0	3.0
+chr2	299848	4.0	0.0	4.0
+chr2	299849	2.0	0.0	2.0
+chr2	299850	1.0	0.0	1.0
+chr2	299851	0.0	1.0	1.0
+chr2	299854	1.0	0.0	1.0
+chr2	299856	2.0	0.0	2.0
+chr2	299857	0.0	1.0	1.0
+chr2	299859	0.0	1.0	1.0
+chr2	299863	0.0	3.0	3.0
+chr2	299864	1.0	0.0	1.0
+chr2	299870	0.0	3.0	3.0
+chr2	299871	1.0	3.0	4.0
+chr2	299875	0.0	2.0	2.0
+chr2	299876	0.0	1.0	1.0
+chr2	299877	0.0	1.0	1.0
+chr2	299884	1.0	0.0	1.0
+chr2	300152	1.0	0.0	1.0
+chr2	300155	0.0	1.0	1.0
+chr2	300160	3.0	0.0	3.0
+chr2	300164	1.0	0.0	1.0
+chr2	300165	1.0	0.0	1.0
+chr2	300169	0.0	2.0	2.0
+chr2	300179	0.0	9.0	9.0
+chr2	300183	1.0	0.0	1.0
+chr2	300268	0.0	2.0	2.0
+chr2	300317	0.0	2.0	2.0
+chr2	300336	0.0	1.0	1.0
+chr2	300350	0.0	1.0	1.0
+chr2	300419	0.0	1.0	1.0
+chr2	300498	1.0	0.0	1.0
+chr2	300517	0.0	2.0	2.0
+chr2	300692	0.0	1.0	1.0
+chr2	300824	1.0	0.0	1.0
+chr2	300970	0.0	1.0	1.0
+chr2	301109	0.0	1.0	1.0
+chr2	301532	1.0	0.0	1.0
+chr2	301539	0.0	1.0	1.0
+chr2	301552	0.0	1.0	1.0
+chr2	301563	0.0	1.0	1.0
+chr2	301590	0.0	1.0	1.0
+chr2	301815	1.0	0.0	1.0
+chr2	301819	0.0	1.0	1.0
+chr2	301828	1.0	0.0	1.0
+chr2	301832	1.0	0.0	1.0
+chr2	301833	0.0	1.0	1.0
+chr2	301837	1.0	0.0	1.0
+chr2	301838	1.0	0.0	1.0
+chr2	301839	2.0	0.0	2.0
+chr2	301840	0.0	6.0	6.0
+chr2	301849	2.0	0.0	2.0
+chr2	301851	0.0	1.0	1.0
+chr2	301932	1.0	0.0	1.0
+chr2	302018	1.0	2.0	3.0
+chr2	302021	0.0	1.0	1.0
+chr2	302044	0.0	1.0	1.0
+chr2	302161	0.0	1.0	1.0
+chr2	302176	0.0	1.0	1.0
+chr2	302206	1.0	0.0	1.0
+chr2	302281	1.0	0.0	1.0
+chr2	302349	0.0	1.0	1.0
+chr2	302355	1.0	0.0	1.0
+chr2	302358	1.0	0.0	1.0
+chr2	302550	0.0	1.0	1.0
+chr2	302722	1.0	0.0	1.0
+chr2	302911	0.0	1.0	1.0
+chr2	302961	0.0	1.0	1.0
+chr2	303003	0.0	1.0	1.0
+chr2	303006	1.0	0.0	1.0
+chr2	303064	0.0	1.0	1.0
+chr2	303304	0.0	1.0	1.0
+chr2	303594	1.0	0.0	1.0
+chr2	303599	1.0	0.0	1.0
+chr2	303627	0.0	1.0	1.0
+chr2	303635	1.0	0.0	1.0
+chr2	303688	0.0	1.0	1.0
+chr2	303834	0.0	1.0	1.0
+chr2	303872	0.0	1.0	1.0
+chr2	303876	1.0	0.0	1.0
+chr2	303883	1.0	1.0	2.0
+chr2	303891	1.0	0.0	1.0
+chr2	303893	2.0	0.0	2.0
+chr2	303903	0.0	1.0	1.0
+chr2	304019	1.0	0.0	1.0
+chr2	304055	1.0	0.0	1.0
+chr2	304059	1.0	0.0	1.0
+chr2	304068	1.0	0.0	1.0
+chr2	304087	1.0	0.0	1.0
+chr2	304159	0.0	1.0	1.0
+chr2	304241	0.0	1.0	1.0
+chr2	304270	0.0	1.0	1.0
+chr2	304275	0.0	1.0	1.0
+chr2	304312	0.0	1.0	1.0
+chr2	304362	0.0	1.0	1.0
+chr2	304398	1.0	0.0	1.0
+chr2	304430	1.0	2.0	3.0
+chr2	304434	0.0	1.0	1.0
+chr2	304447	1.0	0.0	1.0
+chr2	304464	5.0	2.0	7.0
+chr2	304471	0.0	4.0	4.0
+chr2	304474	1.0	0.0	1.0
+chr2	304475	1.0	0.0	1.0
+chr2	304481	0.0	1.0	1.0
+chr2	304484	0.0	1.0	1.0
+chr2	304497	1.0	0.0	1.0
+chr2	304550	1.0	0.0	1.0
+chr2	305046	1.0	0.0	1.0
+chr2	305119	0.0	1.0	1.0
+chr2	305237	1.0	0.0	1.0
+chr2	305329	1.0	0.0	1.0
+chr2	305336	0.0	1.0	1.0
+chr2	305655	1.0	0.0	1.0
+chr2	305767	0.0	1.0	1.0
+chr2	305772	0.0	1.0	1.0
+chr2	305799	1.0	0.0	1.0
+chr2	305814	0.0	1.0	1.0
+chr2	305937	1.0	0.0	1.0
+chr2	305953	0.0	2.0	2.0
+chr2	305957	1.0	1.0	2.0
+chr2	305964	0.0	1.0	1.0
+chr2	305967	1.0	0.0	1.0
+chr2	305972	0.0	1.0	1.0
+chr2	305974	0.0	1.0	1.0
+chr2	305975	0.0	1.0	1.0
+chr2	305983	1.0	0.0	1.0
+chr2	306280	0.0	1.0	1.0
+chr2	306295	0.0	2.0	2.0
+chr2	306296	0.0	1.0	1.0
+chr2	306297	0.0	1.0	1.0
+chr2	306298	1.0	0.0	1.0
+chr2	306307	0.0	1.0	1.0
+chr2	306308	2.0	0.0	2.0
+chr2	306309	3.0	0.0	3.0
+chr2	306311	0.0	3.0	3.0
+chr2	306315	0.0	2.0	2.0
+chr2	306320	3.0	0.0	3.0
+chr2	306327	0.0	2.0	2.0
+chr2	306339	1.0	0.0	1.0
+chr2	306347	0.0	1.0	1.0
+chr2	306349	0.0	1.0	1.0
+chr2	306365	1.0	0.0	1.0
+chr2	306444	1.0	0.0	1.0
+chr2	306596	0.0	1.0	1.0
+chr2	306600	0.0	1.0	1.0
+chr2	306616	0.0	1.0	1.0
+chr2	306617	1.0	0.0	1.0
+chr2	306618	0.0	1.0	1.0
+chr2	306620	2.0	0.0	2.0
+chr2	306624	1.0	0.0	1.0
+chr2	306650	0.0	1.0	1.0
+chr2	306767	2.0	0.0	2.0
+chr2	306771	1.0	0.0	1.0
+chr2	306775	1.0	0.0	1.0
+chr2	306776	0.0	1.0	1.0
+chr2	306787	0.0	1.0	1.0
+chr2	306909	0.0	1.0	1.0
+chr2	306919	1.0	0.0	1.0
+chr2	306924	3.0	0.0	3.0
+chr2	306926	0.0	1.0	1.0
+chr2	306928	1.0	0.0	1.0
+chr2	306930	0.0	2.0	2.0
+chr2	306931	1.0	0.0	1.0
+chr2	306937	2.0	0.0	2.0
+chr2	306940	1.0	0.0	1.0
+chr2	306942	0.0	3.0	3.0
+chr2	306944	1.0	0.0	1.0
+chr2	306945	1.0	0.0	1.0
+chr2	306947	0.0	1.0	1.0
+chr2	306950	1.0	5.0	6.0
+chr2	306951	0.0	3.0	3.0
+chr2	306954	2.0	0.0	2.0
+chr2	306961	1.0	0.0	1.0
+chr2	306963	1.0	0.0	1.0
+chr2	306964	1.0	0.0	1.0
+chr2	306970	1.0	0.0	1.0
+chr2	306979	1.0	0.0	1.0
+chr2	307140	0.0	1.0	1.0
+chr2	307179	1.0	0.0	1.0
+chr2	307280	0.0	1.0	1.0
+chr2	307289	2.0	0.0	2.0
+chr2	307298	1.0	0.0	1.0
+chr2	307299	2.0	0.0	2.0
+chr2	307304	1.0	0.0	1.0
+chr2	307308	0.0	1.0	1.0
+chr2	307325	1.0	0.0	1.0
+chr2	307547	1.0	0.0	1.0
+chr2	307598	1.0	0.0	1.0
+chr2	307604	0.0	1.0	1.0
+chr2	307607	1.0	1.0	2.0
+chr2	307611	0.0	1.0	1.0
+chr2	307618	1.0	0.0	1.0
+chr2	307622	0.0	1.0	1.0
+chr2	307726	0.0	1.0	1.0
+chr2	307740	1.0	0.0	1.0
+chr2	307777	2.0	0.0	2.0
+chr2	307786	0.0	1.0	1.0
+chr2	307793	0.0	1.0	1.0
+chr2	307795	0.0	1.0	1.0
+chr2	307796	0.0	1.0	1.0
+chr2	307797	0.0	1.0	1.0
+chr2	308010	1.0	0.0	1.0
+chr2	308045	0.0	1.0	1.0
+chr2	308411	0.0	1.0	1.0
+chr2	308471	1.0	0.0	1.0
+chr2	308619	1.0	0.0	1.0
+chr2	308649	0.0	1.0	1.0
+chr2	308673	0.0	1.0	1.0
+chr2	308675	0.0	1.0	1.0
+chr2	309237	0.0	1.0	1.0
+chr2	309577	1.0	0.0	1.0
+chr2	309672	0.0	2.0	2.0
+chr2	309673	1.0	0.0	1.0
+chr2	309682	0.0	1.0	1.0
+chr2	309835	0.0	1.0	1.0
+chr2	309967	1.0	0.0	1.0
+chr2	309979	0.0	1.0	1.0
+chr2	309989	1.0	0.0	1.0
+chr2	309995	2.0	0.0	2.0
+chr2	310000	1.0	0.0	1.0
+chr2	310010	3.0	0.0	3.0
+chr2	310152	1.0	0.0	1.0
+chr2	310159	0.0	1.0	1.0
+chr2	310160	1.0	0.0	1.0
+chr2	310161	0.0	1.0	1.0
+chr2	310165	0.0	1.0	1.0
+chr2	310180	0.0	1.0	1.0
+chr2	310243	1.0	0.0	1.0
+chr2	310286	0.0	1.0	1.0
+chr2	310309	1.0	0.0	1.0
+chr2	310316	1.0	0.0	1.0
+chr2	310317	1.0	1.0	2.0
+chr2	310320	6.0	0.0	6.0
+chr2	310321	11.0	2.0	13.0
+chr2	310322	0.0	2.0	2.0
+chr2	310323	3.0	5.0	8.0
+chr2	310324	0.0	1.0	1.0
+chr2	310325	2.0	0.0	2.0
+chr2	310326	0.0	2.0	2.0
+chr2	310327	2.0	1.0	3.0
+chr2	310332	0.0	5.0	5.0
+chr2	310333	1.0	3.0	4.0
+chr2	310337	1.0	0.0	1.0
+chr2	310340	3.0	0.0	3.0
+chr2	310344	1.0	0.0	1.0
+chr2	310345	0.0	1.0	1.0
+chr2	310351	0.0	1.0	1.0
+chr2	310352	0.0	1.0	1.0
+chr2	310361	0.0	1.0	1.0
+chr2	310376	0.0	1.0	1.0
+chr2	310605	3.0	0.0	3.0
+chr2	310606	1.0	0.0	1.0
+chr2	310609	1.0	0.0	1.0
+chr2	310617	7.0	1.0	8.0
+chr2	310618	0.0	1.0	1.0
+chr2	310619	1.0	0.0	1.0
+chr2	310620	3.0	3.0	6.0
+chr2	310622	1.0	0.0	1.0
+chr2	310623	0.0	2.0	2.0
+chr2	310626	1.0	0.0	1.0
+chr2	310627	0.0	2.0	2.0
+chr2	310629	1.0	0.0	1.0
+chr2	310632	0.0	1.0	1.0
+chr2	310641	1.0	0.0	1.0
+chr2	310647	0.0	1.0	1.0
+chr2	310766	0.0	1.0	1.0
+chr2	310781	2.0	0.0	2.0
+chr2	310788	2.0	0.0	2.0
+chr2	310789	1.0	0.0	1.0
+chr2	310791	0.0	1.0	1.0
+chr2	310795	0.0	2.0	2.0
+chr2	310798	1.0	0.0	1.0
+chr2	310801	1.0	0.0	1.0
+chr2	310805	0.0	1.0	1.0
+chr2	310920	1.0	1.0	2.0
+chr2	310937	0.0	1.0	1.0
+chr2	311037	0.0	1.0	1.0
+chr2	311091	1.0	0.0	1.0
+chr2	311108	0.0	1.0	1.0
+chr2	311110	0.0	1.0	1.0
+chr2	311146	1.0	0.0	1.0
+chr2	311158	1.0	0.0	1.0
+chr2	311234	2.0	0.0	2.0
+chr2	311248	1.0	0.0	1.0
+chr2	311260	1.0	0.0	1.0
+chr2	311262	0.0	2.0	2.0
+chr2	311270	1.0	1.0	2.0
+chr2	311271	0.0	1.0	1.0
+chr2	311276	0.0	1.0	1.0
+chr2	311277	0.0	2.0	2.0
+chr2	311288	1.0	2.0	3.0
+chr2	311294	0.0	1.0	1.0
+chr2	311300	0.0	2.0	2.0
+chr2	311318	0.0	2.0	2.0
+chr2	311380	0.0	3.0	3.0
+chr2	311397	0.0	1.0	1.0
+chr2	311410	1.0	0.0	1.0
+chr2	311415	1.0	0.0	1.0
+chr2	311416	0.0	2.0	2.0
+chr2	311417	0.0	1.0	1.0
+chr2	311418	1.0	1.0	2.0
+chr2	311420	1.0	0.0	1.0
+chr2	311423	2.0	0.0	2.0
+chr2	311425	1.0	0.0	1.0
+chr2	311426	0.0	1.0	1.0
+chr2	311427	1.0	1.0	2.0
+chr2	311428	4.0	0.0	4.0
+chr2	311429	1.0	0.0	1.0
+chr2	311431	1.0	0.0	1.0
+chr2	311432	0.0	1.0	1.0
+chr2	311449	1.0	0.0	1.0
+chr2	311450	1.0	0.0	1.0
+chr2	311457	1.0	0.0	1.0
+chr2	311463	0.0	2.0	2.0
+chr2	311468	1.0	0.0	1.0
+chr2	311484	1.0	0.0	1.0
+chr2	311495	0.0	1.0	1.0
+chr2	311503	0.0	1.0	1.0
+chr2	311749	0.0	1.0	1.0
+chr2	311768	0.0	1.0	1.0
+chr2	311782	0.0	1.0	1.0
+chr2	311786	0.0	2.0	2.0
+chr2	311791	1.0	0.0	1.0
+chr2	311800	2.0	0.0	2.0
+chr2	311802	1.0	0.0	1.0
+chr2	311807	1.0	1.0	2.0
+chr2	311816	0.0	1.0	1.0
+chr2	311826	2.0	0.0	2.0
+chr2	311836	1.0	0.0	1.0
+chr2	311868	0.0	1.0	1.0
+chr2	311873	1.0	0.0	1.0
+chr2	311966	0.0	2.0	2.0
+chr2	311971	1.0	0.0	1.0
+chr2	311972	0.0	1.0	1.0
+chr2	312003	0.0	1.0	1.0
+chr2	312021	1.0	0.0	1.0
+chr2	312023	1.0	0.0	1.0
+chr2	312149	1.0	0.0	1.0
+chr2	312155	0.0	1.0	1.0
+chr2	312176	1.0	0.0	1.0
+chr2	312293	0.0	1.0	1.0
+chr2	312450	1.0	0.0	1.0
+chr2	312456	1.0	0.0	1.0
+chr2	312764	1.0	0.0	1.0
+chr2	312875	0.0	1.0	1.0
+chr2	312920	1.0	0.0	1.0
+chr2	312945	0.0	1.0	1.0
+chr2	313126	0.0	1.0	1.0
+chr2	313292	0.0	1.0	1.0
+chr2	313680	0.0	1.0	1.0
+chr2	314315	0.0	2.0	2.0
+chr2	314401	0.0	1.0	1.0
+chr2	314618	0.0	1.0	1.0
+chr2	314762	0.0	1.0	1.0
+chr2	315073	1.0	0.0	1.0
+chr2	315088	1.0	0.0	1.0
+chr2	315096	0.0	1.0	1.0
+chr2	315101	1.0	0.0	1.0
+chr2	315103	0.0	2.0	2.0
+chr2	315107	1.0	0.0	1.0
+chr2	315114	0.0	1.0	1.0
+chr2	315126	1.0	0.0	1.0
+chr2	315225	1.0	0.0	1.0
+chr2	315305	0.0	1.0	1.0
+chr2	315536	1.0	0.0	1.0
+chr2	315542	1.0	1.0	2.0
+chr2	315543	0.0	1.0	1.0
+chr2	315554	0.0	1.0	1.0
+chr2	315559	1.0	0.0	1.0
+chr2	315562	1.0	0.0	1.0
+chr2	315568	0.0	2.0	2.0
+chr2	315569	0.0	1.0	1.0
+chr2	315570	1.0	0.0	1.0
+chr2	315573	1.0	0.0	1.0
+chr2	315574	0.0	1.0	1.0
+chr2	315575	0.0	2.0	2.0
+chr2	315577	1.0	0.0	1.0
+chr2	315582	0.0	1.0	1.0
+chr2	315587	1.0	0.0	1.0
+chr2	315588	0.0	1.0	1.0
+chr2	315597	0.0	3.0	3.0
+chr2	315608	1.0	0.0	1.0
+chr2	315723	0.0	1.0	1.0
+chr2	315874	1.0	0.0	1.0
+chr2	315893	0.0	1.0	1.0
+chr2	315903	1.0	0.0	1.0
+chr2	316263	0.0	1.0	1.0
+chr2	316388	0.0	1.0	1.0
+chr2	316422	0.0	1.0	1.0
+chr2	316520	0.0	2.0	2.0
+chr2	316534	0.0	1.0	1.0
+chr2	316560	1.0	0.0	1.0
+chr2	316575	0.0	1.0	1.0
+chr2	316863	1.0	0.0	1.0
+chr2	317032	1.0	0.0	1.0
+chr2	317188	0.0	1.0	1.0
+chr2	317189	0.0	1.0	1.0
+chr2	317203	1.0	0.0	1.0
+chr2	317214	0.0	1.0	1.0
+chr2	317226	1.0	0.0	1.0
+chr2	317238	0.0	1.0	1.0
+chr2	317345	1.0	0.0	1.0
+chr2	317417	0.0	2.0	2.0
+chr2	317652	0.0	1.0	1.0
+chr2	317653	2.0	0.0	2.0
+chr2	317667	0.0	1.0	1.0
+chr2	318238	1.0	0.0	1.0
+chr2	318242	0.0	1.0	1.0
+chr2	318245	0.0	1.0	1.0
+chr2	318248	0.0	1.0	1.0
+chr2	318251	3.0	0.0	3.0
+chr2	318259	0.0	2.0	2.0
+chr2	318260	1.0	0.0	1.0
+chr2	318261	1.0	0.0	1.0
+chr2	318263	1.0	1.0	2.0
+chr2	318264	0.0	2.0	2.0
+chr2	318267	1.0	0.0	1.0
+chr2	318269	1.0	0.0	1.0
+chr2	318272	1.0	0.0	1.0
+chr2	318273	1.0	0.0	1.0
+chr2	318274	1.0	1.0	2.0
+chr2	318275	1.0	0.0	1.0
+chr2	318276	1.0	3.0	4.0
+chr2	318277	0.0	1.0	1.0
+chr2	318279	2.0	0.0	2.0
+chr2	318280	1.0	0.0	1.0
+chr2	318281	0.0	1.0	1.0
+chr2	318282	0.0	1.0	1.0
+chr2	318283	0.0	1.0	1.0
+chr2	318290	0.0	1.0	1.0
+chr2	318292	1.0	0.0	1.0
+chr2	318317	1.0	0.0	1.0
+chr2	318604	1.0	0.0	1.0
+chr2	318608	1.0	0.0	1.0
+chr2	318989	1.0	0.0	1.0
+chr2	319086	0.0	1.0	1.0
+chr2	319362	0.0	1.0	1.0
+chr2	319510	0.0	1.0	1.0
+chr2	319524	0.0	4.0	4.0
+chr2	319859	0.0	1.0	1.0
+chr2	319954	0.0	1.0	1.0
+chr2	319985	1.0	0.0	1.0
+chr2	320206	1.0	0.0	1.0
+chr2	320291	0.0	1.0	1.0
+chr2	320506	0.0	1.0	1.0
+chr2	320853	0.0	1.0	1.0
+chr2	320947	1.0	0.0	1.0
+chr2	321024	0.0	1.0	1.0
+chr2	321098	0.0	1.0	1.0
+chr2	321249	1.0	0.0	1.0
+chr2	321253	1.0	0.0	1.0
+chr2	321260	0.0	1.0	1.0
+chr2	321262	0.0	2.0	2.0
+chr2	321275	1.0	0.0	1.0
+chr2	321424	0.0	1.0	1.0
+chr2	321426	0.0	1.0	1.0
+chr2	321510	0.0	1.0	1.0
+chr2	321557	1.0	0.0	1.0
+chr2	321574	2.0	0.0	2.0
+chr2	321579	1.0	0.0	1.0
+chr2	321580	0.0	1.0	1.0
+chr2	321581	0.0	1.0	1.0
+chr2	321582	1.0	0.0	1.0
+chr2	321598	1.0	0.0	1.0
+chr2	321599	8.0	0.0	8.0
+chr2	321600	10.0	0.0	10.0
+chr2	321601	0.0	1.0	1.0
+chr2	321603	0.0	2.0	2.0
+chr2	321605	1.0	0.0	1.0
+chr2	321608	0.0	3.0	3.0
+chr2	321611	0.0	3.0	3.0
+chr2	321624	1.0	0.0	1.0
+chr2	321625	1.0	0.0	1.0
+chr2	321859	2.0	0.0	2.0
+chr2	321867	1.0	1.0	2.0
+chr2	321885	1.0	0.0	1.0
+chr2	322029	0.0	3.0	3.0
+chr2	322210	0.0	1.0	1.0
+chr2	322219	1.0	0.0	1.0
+chr2	322470	0.0	1.0	1.0
+chr2	322654	0.0	1.0	1.0
+chr2	322736	1.0	0.0	1.0
+chr2	322769	1.0	0.0	1.0
+chr2	322776	1.0	0.0	1.0
+chr2	322945	0.0	1.0	1.0
+chr2	322961	1.0	0.0	1.0
+chr2	323063	0.0	1.0	1.0
+chr2	323268	0.0	1.0	1.0
+chr2	323426	0.0	1.0	1.0
+chr2	323562	0.0	1.0	1.0
+chr2	323706	1.0	0.0	1.0
+chr2	323718	1.0	0.0	1.0
+chr2	323873	0.0	1.0	1.0
+chr2	323876	1.0	1.0	2.0
+chr2	323889	2.0	0.0	2.0
+chr2	323892	1.0	0.0	1.0
+chr2	323901	1.0	0.0	1.0
+chr2	324011	0.0	1.0	1.0
+chr2	324026	0.0	2.0	2.0
+chr2	324030	2.0	0.0	2.0
+chr2	324049	0.0	1.0	1.0
+chr2	324308	0.0	1.0	1.0
+chr2	324314	0.0	1.0	1.0
+chr2	324326	1.0	0.0	1.0
+chr2	324335	1.0	0.0	1.0
+chr2	324337	3.0	0.0	3.0
+chr2	324343	1.0	0.0	1.0
+chr2	324344	1.0	1.0	2.0
+chr2	324348	1.0	0.0	1.0
+chr2	324380	0.0	1.0	1.0
+chr2	324474	0.0	1.0	1.0
+chr2	324505	1.0	0.0	1.0
+chr2	324508	1.0	1.0	2.0
+chr2	324550	1.0	0.0	1.0
+chr2	324660	2.0	0.0	2.0
+chr2	324675	0.0	1.0	1.0
+chr2	324692	0.0	1.0	1.0
+chr2	324787	1.0	0.0	1.0
+chr2	324829	0.0	1.0	1.0
+chr2	324843	0.0	1.0	1.0
+chr2	324956	0.0	1.0	1.0
+chr2	325021	0.0	1.0	1.0
+chr2	325325	1.0	0.0	1.0
+chr2	325500	1.0	0.0	1.0
+chr2	325516	0.0	1.0	1.0
+chr2	325684	1.0	0.0	1.0
+chr2	325711	1.0	0.0	1.0
+chr2	325733	1.0	0.0	1.0
+chr2	325754	2.0	0.0	2.0
+chr2	325764	0.0	1.0	1.0
+chr2	325876	0.0	1.0	1.0
+chr2	325896	1.0	0.0	1.0
+chr2	325899	1.0	0.0	1.0
+chr2	325908	0.0	1.0	1.0
+chr2	325940	0.0	3.0	3.0
+chr2	326012	2.0	0.0	2.0
+chr2	326069	1.0	0.0	1.0
+chr2	326071	2.0	0.0	2.0
+chr2	326072	1.0	0.0	1.0
+chr2	326079	1.0	0.0	1.0
+chr2	326081	0.0	2.0	2.0
+chr2	326085	0.0	2.0	2.0
+chr2	326089	1.0	0.0	1.0
+chr2	326093	1.0	0.0	1.0
+chr2	326094	3.0	0.0	3.0
+chr2	326100	0.0	1.0	1.0
+chr2	326101	0.0	1.0	1.0
+chr2	326329	1.0	0.0	1.0
+chr2	326342	0.0	1.0	1.0
+chr2	326345	2.0	0.0	2.0
+chr2	326359	0.0	7.0	7.0
+chr2	326360	0.0	1.0	1.0
+chr2	326364	1.0	2.0	3.0
+chr2	326365	2.0	0.0	2.0
+chr2	326366	2.0	0.0	2.0
+chr2	326367	2.0	0.0	2.0
+chr2	326374	0.0	1.0	1.0
+chr2	326379	1.0	0.0	1.0
+chr2	326387	1.0	0.0	1.0
+chr2	326507	0.0	2.0	2.0
+chr2	326509	0.0	1.0	1.0
+chr2	326530	1.0	0.0	1.0
+chr2	326598	2.0	0.0	2.0
+chr2	326623	1.0	0.0	1.0
+chr2	326628	1.0	0.0	1.0
+chr2	326638	1.0	0.0	1.0
+chr2	326653	0.0	1.0	1.0
+chr2	326687	1.0	0.0	1.0
+chr2	326969	0.0	1.0	1.0
+chr2	327003	2.0	0.0	2.0
+chr2	327127	0.0	1.0	1.0
+chr2	327130	0.0	3.0	3.0
+chr2	327131	0.0	4.0	4.0
+chr2	327136	0.0	1.0	1.0
+chr2	327139	0.0	1.0	1.0
+chr2	327140	1.0	0.0	1.0
+chr2	327150	0.0	1.0	1.0
+chr2	327152	0.0	2.0	2.0
+chr2	327163	0.0	1.0	1.0
+chr2	327164	0.0	1.0	1.0
+chr2	327185	0.0	2.0	2.0
+chr2	327192	1.0	0.0	1.0
+chr2	327194	2.0	0.0	2.0
+chr2	327195	0.0	1.0	1.0
+chr2	327200	1.0	0.0	1.0
+chr2	327201	1.0	0.0	1.0
+chr2	327202	1.0	0.0	1.0
+chr2	327206	2.0	0.0	2.0
+chr2	327209	0.0	2.0	2.0
+chr2	327214	0.0	1.0	1.0
+chr2	327222	0.0	2.0	2.0
+chr2	327231	1.0	0.0	1.0
+chr2	327233	1.0	0.0	1.0
+chr2	327238	0.0	1.0	1.0
+chr2	327242	0.0	3.0	3.0
+chr2	327244	0.0	2.0	2.0
+chr2	327245	0.0	4.0	4.0
+chr2	327252	0.0	3.0	3.0
+chr2	327259	1.0	0.0	1.0
+chr2	327266	0.0	1.0	1.0
+chr2	327272	0.0	1.0	1.0
+chr2	327277	1.0	0.0	1.0
+chr2	327287	3.0	0.0	3.0
+chr2	327292	1.0	0.0	1.0
+chr2	327303	1.0	0.0	1.0
+chr2	327304	1.0	0.0	1.0
+chr2	327305	3.0	0.0	3.0
+chr2	327313	2.0	0.0	2.0
+chr2	327321	1.0	1.0	2.0
+chr2	327322	0.0	2.0	2.0
+chr2	327325	1.0	0.0	1.0
+chr2	327333	1.0	0.0	1.0
+chr2	327334	1.0	0.0	1.0
+chr2	327337	1.0	0.0	1.0
+chr2	327338	1.0	0.0	1.0
+chr2	327355	1.0	0.0	1.0
+chr2	327358	1.0	0.0	1.0
+chr2	327370	1.0	0.0	1.0
+chr2	327375	1.0	0.0	1.0
+chr2	327729	1.0	0.0	1.0
+chr2	327781	1.0	0.0	1.0
+chr2	327808	1.0	0.0	1.0
+chr2	327811	1.0	0.0	1.0
+chr2	327837	1.0	0.0	1.0
+chr2	327869	1.0	0.0	1.0
+chr2	327910	3.0	0.0	3.0
+chr2	327912	1.0	0.0	1.0
+chr2	327928	0.0	1.0	1.0
+chr2	327971	0.0	2.0	2.0
+chr2	328004	0.0	1.0	1.0
+chr2	328112	0.0	1.0	1.0
+chr2	328122	0.0	1.0	1.0
+chr2	328255	1.0	0.0	1.0
+chr2	328264	0.0	1.0	1.0
+chr2	328298	0.0	1.0	1.0
+chr2	328302	0.0	1.0	1.0
+chr2	328303	1.0	0.0	1.0
+chr2	328309	0.0	1.0	1.0
+chr2	328328	0.0	1.0	1.0
+chr2	328435	0.0	1.0	1.0
+chr2	328440	0.0	1.0	1.0
+chr2	328455	1.0	0.0	1.0
+chr2	328526	0.0	2.0	2.0
+chr2	328688	2.0	0.0	2.0
+chr2	328699	0.0	1.0	1.0
+chr2	328704	0.0	1.0	1.0
+chr2	328892	0.0	1.0	1.0
+chr2	328946	0.0	2.0	2.0
+chr2	329022	1.0	0.0	1.0
+chr2	329117	0.0	1.0	1.0
+chr2	329135	2.0	0.0	2.0
+chr2	329145	0.0	1.0	1.0
+chr2	329246	0.0	1.0	1.0
+chr2	329306	2.0	0.0	2.0
+chr2	329424	0.0	1.0	1.0
+chr2	329591	0.0	1.0	1.0
+chr2	329659	0.0	1.0	1.0
+chr2	329896	1.0	0.0	1.0
+chr2	330065	0.0	1.0	1.0
+chr2	330183	1.0	0.0	1.0
+chr2	330495	0.0	1.0	1.0
+chr2	330497	1.0	0.0	1.0
+chr2	330500	0.0	1.0	1.0
+chr2	330501	0.0	1.0	1.0
+chr2	330502	1.0	0.0	1.0
+chr2	330503	0.0	1.0	1.0
+chr2	330511	0.0	1.0	1.0
+chr2	330827	1.0	0.0	1.0
+chr2	330911	0.0	1.0	1.0
+chr2	330938	1.0	0.0	1.0
+chr2	331015	0.0	1.0	1.0
+chr2	331016	0.0	1.0	1.0
+chr2	331020	0.0	1.0	1.0
+chr2	331058	6.0	0.0	6.0
+chr2	331178	1.0	0.0	1.0
+chr2	331191	0.0	1.0	1.0
+chr2	331334	1.0	0.0	1.0
+chr2	331346	1.0	0.0	1.0
+chr2	331468	0.0	1.0	1.0
+chr2	331473	0.0	1.0	1.0
+chr2	331498	0.0	1.0	1.0
+chr2	331500	0.0	1.0	1.0
+chr2	331518	1.0	0.0	1.0
+chr2	331521	1.0	0.0	1.0
+chr2	331523	0.0	2.0	2.0
+chr2	331531	0.0	3.0	3.0
+chr2	331536	0.0	1.0	1.0
+chr2	331683	0.0	1.0	1.0
+chr2	331718	0.0	1.0	1.0
+chr2	331806	1.0	0.0	1.0
+chr2	331900	0.0	1.0	1.0
+chr2	331915	0.0	1.0	1.0
+chr2	331998	1.0	0.0	1.0
+chr2	332173	1.0	0.0	1.0
+chr2	332209	0.0	1.0	1.0
+chr2	332219	0.0	1.0	1.0
+chr2	332230	0.0	1.0	1.0
+chr2	332241	1.0	0.0	1.0
+chr2	332251	2.0	0.0	2.0
+chr2	332356	0.0	1.0	1.0
+chr2	333009	0.0	1.0	1.0
+chr2	333231	1.0	0.0	1.0
+chr2	333351	0.0	1.0	1.0
+chr2	333502	2.0	0.0	2.0
+chr2	334262	2.0	0.0	2.0
+chr2	334295	0.0	1.0	1.0
+chr2	334656	1.0	0.0	1.0
+chr2	334896	0.0	1.0	1.0
+chr2	335211	1.0	0.0	1.0
+chr2	335309	1.0	0.0	1.0
+chr2	335342	1.0	0.0	1.0
+chr2	335605	0.0	1.0	1.0
+chr2	335977	0.0	1.0	1.0
+chr2	336036	1.0	0.0	1.0
+chr2	336054	1.0	0.0	1.0
+chr2	336192	0.0	1.0	1.0
+chr2	336268	0.0	1.0	1.0
+chr2	336297	1.0	0.0	1.0
+chr2	336346	1.0	0.0	1.0
+chr2	336355	1.0	0.0	1.0
+chr2	336525	2.0	1.0	3.0
+chr2	336526	0.0	1.0	1.0
+chr2	336550	1.0	0.0	1.0
+chr2	336552	1.0	0.0	1.0
+chr2	336663	0.0	1.0	1.0
+chr2	336674	0.0	1.0	1.0
+chr2	336742	1.0	0.0	1.0
+chr2	336757	0.0	1.0	1.0
+chr2	336796	0.0	2.0	2.0
+chr2	336816	1.0	0.0	1.0
+chr2	336825	0.0	1.0	1.0
+chr2	336829	1.0	0.0	1.0
+chr2	336852	2.0	0.0	2.0
+chr2	336855	0.0	1.0	1.0
+chr2	336894	0.0	1.0	1.0
+chr2	336896	1.0	0.0	1.0
+chr2	336906	0.0	1.0	1.0
+chr2	336911	0.0	1.0	1.0
+chr2	336923	0.0	1.0	1.0
+chr2	337175	1.0	0.0	1.0
+chr2	337224	0.0	2.0	2.0
+chr2	337231	1.0	0.0	1.0
+chr2	337236	3.0	2.0	5.0
+chr2	337239	0.0	1.0	1.0
+chr2	337240	0.0	3.0	3.0
+chr2	337242	0.0	3.0	3.0
+chr2	337244	3.0	0.0	3.0
+chr2	337245	4.0	0.0	4.0
+chr2	337249	0.0	2.0	2.0
+chr2	337250	1.0	0.0	1.0
+chr2	337251	0.0	5.0	5.0
+chr2	337256	2.0	1.0	3.0
+chr2	337257	2.0	0.0	2.0
+chr2	337258	5.0	1.0	6.0
+chr2	337260	0.0	5.0	5.0
+chr2	337261	0.0	2.0	2.0
+chr2	337262	0.0	1.0	1.0
+chr2	337270	0.0	1.0	1.0
+chr2	337271	0.0	1.0	1.0
+chr2	337274	2.0	1.0	3.0
+chr2	337275	1.0	0.0	1.0
+chr2	337285	1.0	0.0	1.0
+chr2	337289	1.0	0.0	1.0
+chr2	337394	0.0	1.0	1.0
+chr2	337395	0.0	1.0	1.0
+chr2	337399	1.0	0.0	1.0
+chr2	337414	0.0	1.0	1.0
+chr2	337418	1.0	1.0	2.0
+chr2	337420	1.0	0.0	1.0
+chr2	337421	0.0	2.0	2.0
+chr2	337551	0.0	1.0	1.0
+chr2	337580	0.0	1.0	1.0
+chr2	337585	0.0	1.0	1.0
+chr2	337603	0.0	2.0	2.0
+chr2	337607	1.0	0.0	1.0
+chr2	337609	0.0	1.0	1.0
+chr2	337637	1.0	0.0	1.0
+chr2	337642	0.0	1.0	1.0
+chr2	337643	0.0	1.0	1.0
+chr2	337644	0.0	4.0	4.0
+chr2	337670	1.0	0.0	1.0
+chr2	337763	0.0	2.0	2.0
+chr2	337765	1.0	0.0	1.0
+chr2	337778	0.0	1.0	1.0
+chr2	337791	1.0	0.0	1.0
+chr2	337818	0.0	1.0	1.0
+chr2	337914	1.0	0.0	1.0
+chr2	337979	1.0	0.0	1.0
+chr2	338012	0.0	1.0	1.0
+chr2	338020	0.0	1.0	1.0
+chr2	338058	0.0	1.0	1.0
+chr2	338065	1.0	0.0	1.0
+chr2	338072	1.0	0.0	1.0
+chr2	338077	0.0	1.0	1.0
+chr2	338109	0.0	1.0	1.0
+chr2	338237	1.0	0.0	1.0
+chr2	338242	0.0	1.0	1.0
+chr2	338249	0.0	1.0	1.0
+chr2	338275	1.0	0.0	1.0
+chr2	338378	1.0	0.0	1.0
+chr2	338379	1.0	0.0	1.0
+chr2	338381	1.0	0.0	1.0
+chr2	338382	0.0	1.0	1.0
+chr2	338385	0.0	1.0	1.0
+chr2	338387	0.0	1.0	1.0
+chr2	338388	1.0	0.0	1.0
+chr2	338391	0.0	4.0	4.0
+chr2	338395	0.0	1.0	1.0
+chr2	338407	1.0	0.0	1.0
+chr2	338408	1.0	0.0	1.0
+chr2	338411	1.0	1.0	2.0
+chr2	338414	1.0	0.0	1.0
+chr2	338415	0.0	1.0	1.0
+chr2	338424	1.0	0.0	1.0
+chr2	338454	1.0	0.0	1.0
+chr2	338687	0.0	1.0	1.0
+chr2	338691	0.0	1.0	1.0
+chr2	338696	0.0	1.0	1.0
+chr2	338698	0.0	2.0	2.0
+chr2	338699	0.0	1.0	1.0
+chr2	338701	1.0	0.0	1.0
+chr2	338707	0.0	1.0	1.0
+chr2	338730	0.0	1.0	1.0
+chr2	338738	0.0	1.0	1.0
+chr2	338828	0.0	4.0	4.0
+chr2	338857	1.0	0.0	1.0
+chr2	338859	0.0	1.0	1.0
+chr2	338868	0.0	1.0	1.0
+chr2	338871	0.0	1.0	1.0
+chr2	338872	0.0	1.0	1.0
+chr2	338890	1.0	0.0	1.0
+chr2	339007	1.0	0.0	1.0
+chr2	339019	1.0	0.0	1.0
+chr2	339024	0.0	1.0	1.0
+chr2	339031	1.0	0.0	1.0
+chr2	339032	1.0	0.0	1.0
+chr2	339180	1.0	0.0	1.0
+chr2	339190	0.0	1.0	1.0
+chr2	339211	1.0	0.0	1.0
+chr2	339218	1.0	0.0	1.0
+chr2	339303	0.0	1.0	1.0
+chr2	339341	1.0	0.0	1.0
+chr2	339347	1.0	0.0	1.0
+chr2	339349	2.0	0.0	2.0
+chr2	339352	2.0	0.0	2.0
+chr2	339353	0.0	1.0	1.0
+chr2	339354	0.0	2.0	2.0
+chr2	339357	1.0	0.0	1.0
+chr2	339358	1.0	0.0	1.0
+chr2	339361	0.0	8.0	8.0
+chr2	339371	3.0	0.0	3.0
+chr2	339373	2.0	0.0	2.0
+chr2	339403	0.0	2.0	2.0
+chr2	339404	0.0	2.0	2.0
+chr2	339425	1.0	0.0	1.0
+chr2	339426	1.0	0.0	1.0
+chr2	339561	0.0	1.0	1.0
+chr2	339562	0.0	1.0	1.0
+chr2	339566	0.0	1.0	1.0
+chr2	339587	0.0	1.0	1.0
+chr2	339598	1.0	0.0	1.0
+chr2	339602	0.0	1.0	1.0
+chr2	339613	0.0	1.0	1.0
+chr2	339614	1.0	0.0	1.0
+chr2	339619	0.0	1.0	1.0
+chr2	339620	0.0	2.0	2.0
+chr2	339621	0.0	1.0	1.0
+chr2	339623	0.0	1.0	1.0
+chr2	339625	2.0	0.0	2.0
+chr2	339626	4.0	0.0	4.0
+chr2	339627	1.0	0.0	1.0
+chr2	339630	1.0	0.0	1.0
+chr2	339631	0.0	1.0	1.0
+chr2	339632	1.0	0.0	1.0
+chr2	339634	1.0	0.0	1.0
+chr2	339635	3.0	0.0	3.0
+chr2	339636	2.0	0.0	2.0
+chr2	339639	0.0	1.0	1.0
+chr2	339645	1.0	0.0	1.0
+chr2	339646	2.0	0.0	2.0
+chr2	339648	0.0	3.0	3.0
+chr2	339651	1.0	0.0	1.0
+chr2	339655	0.0	1.0	1.0
+chr2	339660	0.0	1.0	1.0
+chr2	339663	2.0	0.0	2.0
+chr2	339677	0.0	1.0	1.0
+chr2	339756	0.0	1.0	1.0
+chr2	339788	1.0	0.0	1.0
+chr2	339803	4.0	0.0	4.0
+chr2	339805	0.0	1.0	1.0
+chr2	339822	0.0	1.0	1.0
+chr2	339926	1.0	0.0	1.0
+chr2	339973	1.0	0.0	1.0
+chr2	340021	0.0	1.0	1.0
+chr2	340110	0.0	1.0	1.0
+chr2	340199	1.0	0.0	1.0
+chr2	340243	1.0	0.0	1.0
+chr2	340259	2.0	0.0	2.0
+chr2	340271	0.0	1.0	1.0
+chr2	340272	2.0	0.0	2.0
+chr2	340396	1.0	0.0	1.0
+chr2	340407	1.0	0.0	1.0
+chr2	340417	0.0	1.0	1.0
+chr2	340443	0.0	1.0	1.0
+chr2	340526	0.0	1.0	1.0
+chr2	340561	0.0	1.0	1.0
+chr2	340564	1.0	0.0	1.0
+chr2	340568	0.0	1.0	1.0
+chr2	340569	1.0	0.0	1.0
+chr2	340576	2.0	0.0	2.0
+chr2	340582	0.0	1.0	1.0
+chr2	340584	1.0	0.0	1.0
+chr2	340587	0.0	1.0	1.0
+chr2	340740	0.0	1.0	1.0
+chr2	341005	0.0	1.0	1.0
+chr2	341009	1.0	0.0	1.0
+chr2	341014	2.0	0.0	2.0
+chr2	341018	0.0	1.0	1.0
+chr2	341030	0.0	1.0	1.0
+chr2	341041	0.0	1.0	1.0
+chr2	341155	0.0	1.0	1.0
+chr2	341165	0.0	2.0	2.0
+chr2	341176	1.0	0.0	1.0
+chr2	341177	0.0	1.0	1.0
+chr2	341179	0.0	1.0	1.0
+chr2	341186	0.0	1.0	1.0
+chr2	341188	2.0	4.0	6.0
+chr2	341198	0.0	1.0	1.0
+chr2	341201	0.0	2.0	2.0
+chr2	341222	1.0	0.0	1.0
+chr2	341233	0.0	1.0	1.0
+chr2	341568	1.0	0.0	1.0
+chr2	341647	1.0	0.0	1.0
+chr2	341693	0.0	1.0	1.0
+chr2	341698	1.0	0.0	1.0
+chr2	341704	0.0	1.0	1.0
+chr2	341736	1.0	0.0	1.0
+chr2	341739	0.0	1.0	1.0
+chr2	341766	0.0	1.0	1.0
+chr2	341782	0.0	1.0	1.0
+chr2	341806	1.0	0.0	1.0
+chr2	341992	0.0	1.0	1.0
+chr2	342018	1.0	0.0	1.0
+chr2	342030	0.0	2.0	2.0
+chr2	342031	1.0	0.0	1.0
+chr2	342053	3.0	0.0	3.0
+chr2	342057	0.0	1.0	1.0
+chr2	342058	1.0	0.0	1.0
+chr2	342068	0.0	1.0	1.0
+chr2	342178	0.0	1.0	1.0
+chr2	342214	1.0	0.0	1.0
+chr2	342216	1.0	0.0	1.0
+chr2	342233	1.0	0.0	1.0
+chr2	342236	2.0	0.0	2.0
+chr2	342250	1.0	0.0	1.0
+chr2	342503	1.0	0.0	1.0
+chr2	342515	1.0	0.0	1.0
+chr2	342522	1.0	0.0	1.0
+chr2	342523	1.0	0.0	1.0
+chr2	342524	1.0	0.0	1.0
+chr2	342527	0.0	2.0	2.0
+chr2	342535	1.0	0.0	1.0
+chr2	342536	1.0	0.0	1.0
+chr2	342537	3.0	0.0	3.0
+chr2	342542	0.0	1.0	1.0
+chr2	342543	0.0	4.0	4.0
+chr2	342556	1.0	1.0	2.0
+chr2	342585	0.0	2.0	2.0
+chr2	342606	1.0	0.0	1.0
+chr2	342628	1.0	0.0	1.0
+chr2	342689	0.0	1.0	1.0
+chr2	343156	0.0	1.0	1.0
+chr2	343229	1.0	0.0	1.0
+chr2	343255	1.0	0.0	1.0
+chr2	343298	1.0	0.0	1.0
+chr2	343309	1.0	0.0	1.0
+chr2	343320	1.0	0.0	1.0
+chr2	343350	0.0	1.0	1.0
+chr2	343370	0.0	1.0	1.0
+chr2	343399	1.0	0.0	1.0
+chr2	343402	1.0	0.0	1.0
+chr2	343416	1.0	0.0	1.0
+chr2	343428	1.0	0.0	1.0
+chr2	343433	0.0	4.0	4.0
+chr2	343439	0.0	1.0	1.0
+chr2	343458	0.0	1.0	1.0
+chr2	343521	0.0	1.0	1.0
+chr2	343536	1.0	0.0	1.0
+chr2	343558	1.0	0.0	1.0
+chr2	343563	1.0	0.0	1.0
+chr2	343564	0.0	1.0	1.0
+chr2	343567	1.0	1.0	2.0
+chr2	343569	3.0	0.0	3.0
+chr2	343573	1.0	0.0	1.0
+chr2	343588	3.0	0.0	3.0
+chr2	343589	2.0	0.0	2.0
+chr2	343596	1.0	0.0	1.0
+chr2	343626	0.0	1.0	1.0
+chr2	343628	1.0	0.0	1.0
+chr2	343634	1.0	0.0	1.0
+chr2	343636	0.0	1.0	1.0
+chr2	343718	0.0	1.0	1.0
+chr2	343721	1.0	0.0	1.0
+chr2	343727	1.0	1.0	2.0
+chr2	343736	0.0	1.0	1.0
+chr2	343740	2.0	0.0	2.0
+chr2	343741	0.0	1.0	1.0
+chr2	343751	0.0	2.0	2.0
+chr2	343757	2.0	0.0	2.0
+chr2	343764	1.0	0.0	1.0
+chr2	343771	0.0	1.0	1.0
+chr2	343798	1.0	0.0	1.0
+chr2	343806	1.0	0.0	1.0
+chr2	343900	1.0	0.0	1.0
+chr2	343908	1.0	0.0	1.0
+chr2	343913	0.0	1.0	1.0
+chr2	343918	0.0	1.0	1.0
+chr2	343922	2.0	0.0	2.0
+chr2	343926	0.0	1.0	1.0
+chr2	343928	0.0	2.0	2.0
+chr2	343932	0.0	1.0	1.0
+chr2	343933	1.0	0.0	1.0
+chr2	344023	1.0	0.0	1.0
+chr2	344030	0.0	1.0	1.0
+chr2	344041	0.0	2.0	2.0
+chr2	344052	0.0	1.0	1.0
+chr2	344055	2.0	0.0	2.0
+chr2	344057	1.0	0.0	1.0
+chr2	344059	0.0	1.0	1.0
+chr2	344060	1.0	1.0	2.0
+chr2	344062	1.0	0.0	1.0
+chr2	344066	2.0	3.0	5.0
+chr2	344072	0.0	2.0	2.0
+chr2	344075	0.0	2.0	2.0
+chr2	344077	0.0	3.0	3.0
+chr2	344078	0.0	1.0	1.0
+chr2	344079	1.0	0.0	1.0
+chr2	344081	3.0	0.0	3.0
+chr2	344082	3.0	0.0	3.0
+chr2	344084	0.0	7.0	7.0
+chr2	344086	0.0	1.0	1.0
+chr2	344087	1.0	0.0	1.0
+chr2	344092	2.0	1.0	3.0
+chr2	344093	0.0	1.0	1.0
+chr2	344094	2.0	0.0	2.0
+chr2	344097	0.0	2.0	2.0
+chr2	344100	2.0	1.0	3.0
+chr2	344103	1.0	3.0	4.0
+chr2	344106	5.0	0.0	5.0
+chr2	344107	0.0	1.0	1.0
+chr2	344108	1.0	0.0	1.0
+chr2	344112	2.0	2.0	4.0
+chr2	344113	0.0	4.0	4.0
+chr2	344114	1.0	1.0	2.0
+chr2	344124	1.0	0.0	1.0
+chr2	344136	1.0	0.0	1.0
+chr2	344142	0.0	1.0	1.0
+chr2	344147	0.0	2.0	2.0
+chr2	344148	0.0	1.0	1.0
+chr2	344178	1.0	0.0	1.0
+chr2	344351	1.0	0.0	1.0
+chr2	344368	0.0	1.0	1.0
+chr2	344386	0.0	1.0	1.0
+chr2	344619	0.0	1.0	1.0
+chr2	344623	1.0	0.0	1.0
+chr2	344632	1.0	0.0	1.0
+chr2	344638	0.0	1.0	1.0
+chr2	344649	0.0	1.0	1.0
+chr2	344661	0.0	1.0	1.0
+chr2	344697	0.0	2.0	2.0
+chr2	344760	0.0	2.0	2.0
+chr2	344912	0.0	1.0	1.0
+chr2	344930	1.0	0.0	1.0
+chr2	345003	3.0	0.0	3.0
+chr2	345943	1.0	0.0	1.0
+chr2	345971	1.0	0.0	1.0
+chr2	346434	1.0	0.0	1.0
+chr2	346546	1.0	0.0	1.0
+chr2	346895	0.0	1.0	1.0
+chr2	346900	1.0	0.0	1.0
+chr2	346915	0.0	1.0	1.0
+chr2	346917	1.0	0.0	1.0
+chr2	346930	0.0	2.0	2.0
+chr2	346947	0.0	1.0	1.0
+chr2	347020	1.0	0.0	1.0
+chr2	347051	1.0	0.0	1.0
+chr2	347074	1.0	0.0	1.0
+chr2	347079	1.0	0.0	1.0
+chr2	347124	0.0	1.0	1.0
+chr2	347222	0.0	1.0	1.0
+chr2	347225	0.0	1.0	1.0
+chr2	347246	3.0	0.0	3.0
+chr2	347247	3.0	1.0	4.0
+chr2	347249	0.0	2.0	2.0
+chr2	347250	1.0	0.0	1.0
+chr2	347255	0.0	1.0	1.0
+chr2	347257	0.0	1.0	1.0
+chr2	347267	1.0	0.0	1.0
+chr2	347274	0.0	1.0	1.0
+chr2	347275	0.0	2.0	2.0
+chr2	347278	0.0	1.0	1.0
+chr2	347286	0.0	1.0	1.0
+chr2	347289	1.0	0.0	1.0
+chr2	347851	0.0	1.0	1.0
+chr2	347857	1.0	0.0	1.0
+chr2	347865	0.0	1.0	1.0
+chr2	347989	0.0	1.0	1.0
+chr2	347991	1.0	0.0	1.0
+chr2	347999	1.0	0.0	1.0
+chr2	348002	0.0	1.0	1.0
+chr2	348003	0.0	2.0	2.0
+chr2	348007	0.0	1.0	1.0
+chr2	348014	0.0	1.0	1.0
+chr2	348024	0.0	1.0	1.0
+chr2	348031	0.0	2.0	2.0
+chr2	348154	1.0	0.0	1.0
+chr2	348173	1.0	0.0	1.0
+chr2	348174	0.0	1.0	1.0
+chr2	348177	0.0	1.0	1.0
+chr2	348178	1.0	0.0	1.0
+chr2	348200	1.0	0.0	1.0
+chr2	348209	1.0	0.0	1.0
+chr2	348213	0.0	3.0	3.0
+chr2	348337	1.0	0.0	1.0
+chr2	348355	0.0	1.0	1.0
+chr2	348356	0.0	2.0	2.0
+chr2	348376	1.0	0.0	1.0
+chr2	348378	1.0	0.0	1.0
+chr2	348386	2.0	0.0	2.0
+chr2	348480	0.0	1.0	1.0
+chr2	348507	1.0	0.0	1.0
+chr2	348700	1.0	0.0	1.0
+chr2	348822	0.0	2.0	2.0
+chr2	348853	0.0	1.0	1.0
+chr2	349300	0.0	1.0	1.0
+chr2	349327	0.0	1.0	1.0
+chr2	349354	0.0	1.0	1.0
+chr2	349383	0.0	1.0	1.0
+chr2	349474	0.0	1.0	1.0
+chr2	349479	0.0	1.0	1.0
+chr2	349498	2.0	0.0	2.0
+chr2	349639	1.0	0.0	1.0
+chr2	349804	1.0	0.0	1.0
+chr2	349822	1.0	0.0	1.0
+chr2	349837	0.0	1.0	1.0
+chr2	349839	1.0	0.0	1.0
+chr2	349944	1.0	0.0	1.0
+chr2	349962	0.0	1.0	1.0
+chr2	349968	0.0	2.0	2.0
+chr2	349970	0.0	1.0	1.0
+chr2	349978	2.0	1.0	3.0
+chr2	349983	0.0	1.0	1.0
+chr2	350004	0.0	1.0	1.0
+chr2	350005	0.0	1.0	1.0
+chr2	350008	1.0	0.0	1.0
+chr2	350010	1.0	0.0	1.0
+chr2	350014	0.0	1.0	1.0
+chr2	350018	1.0	0.0	1.0
+chr2	350024	0.0	1.0	1.0
+chr2	350027	0.0	1.0	1.0
+chr2	350035	0.0	2.0	2.0
+chr2	350036	0.0	1.0	1.0
+chr2	350054	1.0	0.0	1.0
+chr2	350068	1.0	0.0	1.0
+chr2	350069	1.0	0.0	1.0
+chr2	350074	0.0	1.0	1.0
+chr2	350076	0.0	2.0	2.0
+chr2	350140	0.0	1.0	1.0
+chr2	350175	1.0	0.0	1.0
+chr2	350178	0.0	1.0	1.0
+chr2	350198	3.0	0.0	3.0
+chr2	350201	0.0	1.0	1.0
+chr2	350202	0.0	1.0	1.0
+chr2	350206	0.0	1.0	1.0
+chr2	350209	0.0	1.0	1.0
+chr2	350216	0.0	2.0	2.0
+chr2	350218	0.0	1.0	1.0
+chr2	350233	0.0	2.0	2.0
+chr2	350236	1.0	0.0	1.0
+chr2	350237	1.0	0.0	1.0
+chr2	350239	1.0	0.0	1.0
+chr2	350259	2.0	0.0	2.0
+chr2	350281	0.0	1.0	1.0
+chr2	350325	0.0	1.0	1.0
+chr2	350342	1.0	0.0	1.0
+chr2	350345	0.0	1.0	1.0
+chr2	350359	1.0	0.0	1.0
+chr2	350384	0.0	1.0	1.0
+chr2	350387	1.0	0.0	1.0
+chr2	350606	0.0	1.0	1.0
+chr2	350682	0.0	1.0	1.0
+chr2	350692	1.0	0.0	1.0
+chr2	351060	0.0	1.0	1.0
+chr2	351065	1.0	0.0	1.0
+chr2	351066	0.0	4.0	4.0
+chr2	351067	3.0	0.0	3.0
+chr2	351068	2.0	0.0	2.0
+chr2	351078	1.0	0.0	1.0
+chr2	351079	1.0	0.0	1.0
+chr2	351098	0.0	2.0	2.0
+chr2	351127	1.0	0.0	1.0
+chr2	351233	0.0	1.0	1.0
+chr2	351242	1.0	0.0	1.0
+chr2	351284	0.0	1.0	1.0
+chr2	351288	1.0	0.0	1.0
+chr2	351291	0.0	1.0	1.0
+chr2	351295	1.0	0.0	1.0
+chr2	351337	0.0	1.0	1.0
+chr2	351395	0.0	1.0	1.0
+chr2	351431	0.0	1.0	1.0
+chr2	351434	1.0	0.0	1.0
+chr2	351440	1.0	0.0	1.0
+chr2	351443	0.0	3.0	3.0
+chr2	351450	0.0	3.0	3.0
+chr2	351454	0.0	1.0	1.0
+chr2	351465	1.0	0.0	1.0
+chr2	351473	1.0	0.0	1.0
+chr2	351476	1.0	1.0	2.0
+chr2	351528	0.0	1.0	1.0
+chr2	351545	1.0	0.0	1.0
+chr2	351599	0.0	1.0	1.0
+chr2	351619	1.0	0.0	1.0
+chr2	351628	0.0	1.0	1.0
+chr2	351629	0.0	1.0	1.0
+chr2	351739	0.0	1.0	1.0
+chr2	351804	1.0	0.0	1.0
+chr2	351816	0.0	1.0	1.0
+chr2	353014	1.0	0.0	1.0
+chr2	353041	0.0	1.0	1.0
+chr2	353142	0.0	1.0	1.0
+chr2	353144	1.0	0.0	1.0
+chr2	353173	0.0	1.0	1.0
+chr2	353192	1.0	0.0	1.0
+chr2	353193	0.0	1.0	1.0
+chr2	353333	1.0	0.0	1.0
+chr2	353336	0.0	1.0	1.0
+chr2	353340	0.0	2.0	2.0
+chr2	353345	1.0	0.0	1.0
+chr2	353348	2.0	0.0	2.0
+chr2	353349	1.0	0.0	1.0
+chr2	353350	3.0	0.0	3.0
+chr2	353357	0.0	1.0	1.0
+chr2	353358	1.0	0.0	1.0
+chr2	353361	1.0	0.0	1.0
+chr2	353364	0.0	1.0	1.0
+chr2	353368	1.0	0.0	1.0
+chr2	353376	0.0	1.0	1.0
+chr2	353757	1.0	0.0	1.0
+chr2	353769	1.0	0.0	1.0
+chr2	353785	0.0	1.0	1.0
+chr2	353791	0.0	2.0	2.0
+chr2	353941	0.0	1.0	1.0
+chr2	354114	0.0	1.0	1.0
+chr2	354161	1.0	0.0	1.0
+chr2	354647	0.0	1.0	1.0
+chr2	354665	0.0	2.0	2.0
+chr2	354754	1.0	0.0	1.0
+chr2	354890	1.0	0.0	1.0
+chr2	355033	0.0	3.0	3.0
+chr2	355170	0.0	1.0	1.0
+chr2	355649	1.0	0.0	1.0
+chr2	355656	1.0	0.0	1.0
+chr2	355657	0.0	1.0	1.0
+chr2	355661	2.0	0.0	2.0
+chr2	355663	0.0	2.0	2.0
+chr2	355687	1.0	0.0	1.0
+chr2	355695	2.0	0.0	2.0
+chr2	355810	0.0	2.0	2.0
+chr2	355811	0.0	2.0	2.0
+chr2	355832	1.0	0.0	1.0
+chr2	355838	0.0	1.0	1.0
+chr2	355856	0.0	1.0	1.0
+chr2	355878	1.0	0.0	1.0
+chr2	355946	0.0	1.0	1.0
+chr2	355965	1.0	0.0	1.0
+chr2	355970	3.0	0.0	3.0
+chr2	355974	1.0	1.0	2.0
+chr2	355975	2.0	0.0	2.0
+chr2	355986	2.0	0.0	2.0
+chr2	355988	1.0	0.0	1.0
+chr2	355991	0.0	1.0	1.0
+chr2	355993	0.0	4.0	4.0
+chr2	355995	2.0	0.0	2.0
+chr2	355998	0.0	2.0	2.0
+chr2	356001	0.0	1.0	1.0
+chr2	356003	0.0	1.0	1.0
+chr2	356006	1.0	0.0	1.0
+chr2	356007	3.0	1.0	4.0
+chr2	356008	5.0	1.0	6.0
+chr2	356009	0.0	2.0	2.0
+chr2	356018	1.0	0.0	1.0
+chr2	356019	0.0	1.0	1.0
+chr2	356020	0.0	2.0	2.0
+chr2	356024	0.0	1.0	1.0
+chr2	356026	0.0	1.0	1.0
+chr2	356027	1.0	0.0	1.0
+chr2	356029	1.0	0.0	1.0
+chr2	356031	0.0	1.0	1.0
+chr2	356032	0.0	2.0	2.0
+chr2	356035	0.0	1.0	1.0
+chr2	356041	1.0	0.0	1.0
+chr2	356043	0.0	1.0	1.0
+chr2	356044	0.0	1.0	1.0
+chr2	356069	1.0	0.0	1.0
+chr2	356394	0.0	1.0	1.0
+chr2	356414	1.0	0.0	1.0
+chr2	356430	0.0	1.0	1.0
+chr2	356436	1.0	0.0	1.0
+chr2	356476	0.0	1.0	1.0
+chr2	356518	0.0	2.0	2.0
+chr2	356538	0.0	4.0	4.0
+chr2	356542	0.0	1.0	1.0
+chr2	356545	0.0	1.0	1.0
+chr2	356548	0.0	1.0	1.0
+chr2	356550	0.0	2.0	2.0
+chr2	356553	0.0	1.0	1.0
+chr2	356554	0.0	1.0	1.0
+chr2	356558	2.0	0.0	2.0
+chr2	356559	3.0	0.0	3.0
+chr2	356566	1.0	0.0	1.0
+chr2	356567	0.0	1.0	1.0
+chr2	356568	1.0	0.0	1.0
+chr2	356569	1.0	1.0	2.0
+chr2	356570	2.0	0.0	2.0
+chr2	356571	5.0	1.0	6.0
+chr2	356576	0.0	2.0	2.0
+chr2	356577	3.0	0.0	3.0
+chr2	356580	0.0	2.0	2.0
+chr2	356593	0.0	4.0	4.0
+chr2	356613	1.0	0.0	1.0
+chr2	356848	0.0	1.0	1.0
+chr2	356851	0.0	1.0	1.0
+chr2	356875	0.0	1.0	1.0
+chr2	356885	0.0	1.0	1.0
+chr2	356903	1.0	0.0	1.0
+chr2	356920	0.0	1.0	1.0
+chr2	356994	1.0	0.0	1.0
+chr2	357004	0.0	1.0	1.0
+chr2	357019	1.0	0.0	1.0
+chr2	357032	1.0	0.0	1.0
+chr2	357033	0.0	1.0	1.0
+chr2	357047	1.0	0.0	1.0
+chr2	357118	1.0	0.0	1.0
+chr2	357161	1.0	0.0	1.0
+chr2	358052	1.0	0.0	1.0
+chr2	358200	1.0	0.0	1.0
+chr2	358356	1.0	0.0	1.0
+chr2	358382	1.0	0.0	1.0
+chr2	358641	0.0	1.0	1.0
+chr2	358696	1.0	0.0	1.0
+chr2	358868	1.0	0.0	1.0
+chr2	359457	1.0	0.0	1.0
+chr2	359901	0.0	1.0	1.0
+chr2	360090	1.0	0.0	1.0
+chr2	360101	1.0	0.0	1.0
+chr2	360102	2.0	0.0	2.0
+chr2	360214	0.0	1.0	1.0
+chr2	360235	1.0	0.0	1.0
+chr2	360238	1.0	0.0	1.0
+chr2	360241	3.0	0.0	3.0
+chr2	360256	0.0	2.0	2.0
+chr2	360260	2.0	1.0	3.0
+chr2	360263	3.0	0.0	3.0
+chr2	360265	4.0	0.0	4.0
+chr2	360268	0.0	7.0	7.0
+chr2	360269	0.0	2.0	2.0
+chr2	360272	1.0	0.0	1.0
+chr2	360273	0.0	1.0	1.0
+chr2	360275	1.0	0.0	1.0
+chr2	360276	2.0	1.0	3.0
+chr2	360277	1.0	0.0	1.0
+chr2	360280	1.0	0.0	1.0
+chr2	360282	0.0	1.0	1.0
+chr2	360283	1.0	0.0	1.0
+chr2	360284	4.0	0.0	4.0
+chr2	360285	3.0	0.0	3.0
+chr2	360287	1.0	0.0	1.0
+chr2	360289	0.0	1.0	1.0
+chr2	360298	0.0	1.0	1.0
+chr2	360301	0.0	1.0	1.0
+chr2	360307	1.0	0.0	1.0
+chr2	360319	0.0	1.0	1.0
+chr2	360640	0.0	1.0	1.0
+chr2	360651	0.0	1.0	1.0
+chr2	360655	0.0	1.0	1.0
+chr2	360656	1.0	0.0	1.0
+chr2	360659	0.0	1.0	1.0
+chr2	360664	1.0	0.0	1.0
+chr2	360665	1.0	0.0	1.0
+chr2	360666	0.0	1.0	1.0
+chr2	360669	1.0	0.0	1.0
+chr2	360670	1.0	0.0	1.0
+chr2	360676	3.0	0.0	3.0
+chr2	360678	1.0	0.0	1.0
+chr2	360679	1.0	0.0	1.0
+chr2	360680	0.0	1.0	1.0
+chr2	360681	0.0	2.0	2.0
+chr2	360689	1.0	0.0	1.0
+chr2	360822	0.0	2.0	2.0
+chr2	360823	0.0	3.0	3.0
+chr2	360843	1.0	0.0	1.0
+chr2	360848	1.0	0.0	1.0
+chr2	360863	0.0	1.0	1.0
+chr2	360965	0.0	1.0	1.0
+chr2	360993	1.0	0.0	1.0
+chr2	361046	1.0	0.0	1.0
+chr2	361221	1.0	0.0	1.0
+chr2	361263	0.0	3.0	3.0
+chr2	361435	0.0	1.0	1.0
+chr2	361504	1.0	0.0	1.0
+chr2	362058	1.0	0.0	1.0
+chr2	362070	0.0	1.0	1.0
+chr2	362186	0.0	1.0	1.0
+chr2	362251	0.0	1.0	1.0
+chr2	362389	1.0	0.0	1.0
+chr2	362391	2.0	0.0	2.0
+chr2	362402	0.0	2.0	2.0
+chr2	362403	0.0	1.0	1.0
+chr2	362407	0.0	1.0	1.0
+chr2	362564	0.0	1.0	1.0
+chr2	362597	0.0	1.0	1.0
+chr2	362853	1.0	0.0	1.0
+chr2	362855	2.0	0.0	2.0
+chr2	362860	2.0	0.0	2.0
+chr2	362864	0.0	1.0	1.0
+chr2	362865	1.0	0.0	1.0
+chr2	362868	0.0	2.0	2.0
+chr2	362869	2.0	0.0	2.0
+chr2	362870	1.0	0.0	1.0
+chr2	362871	0.0	2.0	2.0
+chr2	362875	1.0	0.0	1.0
+chr2	362877	0.0	1.0	1.0
+chr2	362879	0.0	1.0	1.0
+chr2	362880	1.0	0.0	1.0
+chr2	362881	5.0	0.0	5.0
+chr2	362882	5.0	4.0	9.0
+chr2	362884	0.0	1.0	1.0
+chr2	362886	1.0	0.0	1.0
+chr2	362890	0.0	2.0	2.0
+chr2	362892	0.0	5.0	5.0
+chr2	362893	0.0	3.0	3.0
+chr2	362894	3.0	0.0	3.0
+chr2	362898	0.0	1.0	1.0
+chr2	362904	1.0	0.0	1.0
+chr2	362913	0.0	1.0	1.0
+chr2	362918	1.0	0.0	1.0
+chr2	362926	1.0	0.0	1.0
+chr2	362941	1.0	0.0	1.0
+chr2	363057	0.0	2.0	2.0
+chr2	363060	0.0	3.0	3.0
+chr2	363064	1.0	0.0	1.0
+chr2	363077	1.0	0.0	1.0
+chr2	363260	1.0	0.0	1.0
+chr2	363287	1.0	0.0	1.0
+chr2	363364	0.0	1.0	1.0
+chr2	363391	0.0	1.0	1.0
+chr2	363468	1.0	0.0	1.0
+chr2	363505	1.0	0.0	1.0
+chr2	363510	1.0	0.0	1.0
+chr2	363831	1.0	0.0	1.0
+chr2	363883	0.0	1.0	1.0
+chr2	364545	1.0	0.0	1.0
+chr2	364822	0.0	1.0	1.0
+chr2	364825	0.0	1.0	1.0
+chr2	364841	1.0	0.0	1.0
+chr2	364860	1.0	0.0	1.0
+chr2	364870	1.0	0.0	1.0
+chr2	365017	1.0	0.0	1.0
+chr2	365056	2.0	0.0	2.0
+chr2	365145	1.0	0.0	1.0
+chr2	365179	0.0	1.0	1.0
+chr2	365183	0.0	1.0	1.0
+chr2	365298	1.0	0.0	1.0
+chr2	365496	1.0	0.0	1.0
+chr2	365532	0.0	1.0	1.0
+chr2	365544	1.0	0.0	1.0
+chr2	365547	0.0	1.0	1.0
+chr2	365581	0.0	1.0	1.0
+chr2	365648	1.0	0.0	1.0
+chr2	365651	1.0	0.0	1.0
+chr2	365658	0.0	1.0	1.0
+chr2	365661	1.0	1.0	2.0
+chr2	365664	1.0	0.0	1.0
+chr2	365675	1.0	0.0	1.0
+chr2	365676	0.0	1.0	1.0
+chr2	365683	0.0	1.0	1.0
+chr2	365686	2.0	0.0	2.0
+chr2	365691	0.0	1.0	1.0
+chr2	365693	0.0	1.0	1.0
+chr2	365694	1.0	0.0	1.0
+chr2	365713	1.0	0.0	1.0
+chr2	365730	1.0	0.0	1.0
+chr2	365778	0.0	1.0	1.0
+chr2	365928	1.0	0.0	1.0
+chr2	365945	0.0	1.0	1.0
+chr2	366082	0.0	1.0	1.0
+chr2	366088	0.0	2.0	2.0
+chr2	366092	1.0	0.0	1.0
+chr2	366096	1.0	0.0	1.0
+chr2	366121	0.0	1.0	1.0
+chr2	366384	1.0	0.0	1.0
+chr2	366416	1.0	0.0	1.0
+chr2	366701	1.0	0.0	1.0
+chr2	366777	0.0	1.0	1.0
+chr2	366778	0.0	6.0	6.0
+chr2	366782	0.0	1.0	1.0
+chr2	366784	3.0	0.0	3.0
+chr2	366792	1.0	0.0	1.0
+chr2	366812	1.0	0.0	1.0
+chr2	366819	1.0	0.0	1.0
+chr2	366850	2.0	0.0	2.0
+chr2	367133	1.0	0.0	1.0
+chr2	367137	0.0	1.0	1.0
+chr2	367154	1.0	0.0	1.0
+chr2	367155	1.0	0.0	1.0
+chr2	367421	1.0	0.0	1.0
+chr2	367454	0.0	1.0	1.0
+chr2	367716	1.0	0.0	1.0
+chr2	367894	0.0	1.0	1.0
+chr2	367912	0.0	1.0	1.0
+chr2	368480	1.0	0.0	1.0
+chr2	368482	1.0	0.0	1.0
+chr2	368490	0.0	1.0	1.0
+chr2	368493	0.0	1.0	1.0
+chr2	368503	0.0	1.0	1.0
+chr2	368566	0.0	1.0	1.0
+chr2	368758	1.0	0.0	1.0
+chr2	368873	0.0	1.0	1.0
+chr2	369178	0.0	1.0	1.0
+chr2	369185	1.0	0.0	1.0
+chr2	369330	0.0	1.0	1.0
+chr2	369339	1.0	0.0	1.0
+chr2	369353	0.0	1.0	1.0
+chr2	369366	0.0	1.0	1.0
+chr2	369412	1.0	0.0	1.0
+chr2	369501	1.0	1.0	2.0
+chr2	369504	0.0	1.0	1.0
+chr2	369520	0.0	1.0	1.0
+chr2	369545	1.0	0.0	1.0
+chr2	369645	0.0	1.0	1.0
+chr2	369647	1.0	0.0	1.0
+chr2	369656	0.0	1.0	1.0
+chr2	369660	0.0	1.0	1.0
+chr2	369669	0.0	1.0	1.0
+chr2	369686	3.0	0.0	3.0
+chr2	369687	4.0	2.0	6.0
+chr2	369690	0.0	1.0	1.0
+chr2	369691	0.0	2.0	2.0
+chr2	369692	0.0	1.0	1.0
+chr2	369718	1.0	0.0	1.0
+chr2	369719	1.0	0.0	1.0
+chr2	369746	1.0	0.0	1.0
+chr2	369971	1.0	0.0	1.0
+chr2	369988	0.0	1.0	1.0
+chr2	369990	1.0	0.0	1.0
+chr2	369994	0.0	1.0	1.0
+chr2	369996	0.0	1.0	1.0
+chr2	370006	0.0	1.0	1.0
+chr2	370017	1.0	0.0	1.0
+chr2	370018	0.0	1.0	1.0
+chr2	370045	0.0	1.0	1.0
+chr2	370158	0.0	2.0	2.0
+chr2	370187	1.0	6.0	7.0
+chr2	370189	0.0	1.0	1.0
+chr2	370308	1.0	0.0	1.0
+chr2	370404	0.0	1.0	1.0
+chr2	370421	0.0	1.0	1.0
+chr2	370470	0.0	1.0	1.0
+chr2	370578	1.0	0.0	1.0
+chr2	370583	0.0	1.0	1.0
+chr2	370607	0.0	2.0	2.0
+chr2	370617	1.0	0.0	1.0
+chr2	370699	0.0	1.0	1.0
+chr2	370829	1.0	0.0	1.0
+chr2	370925	0.0	1.0	1.0
+chr2	370937	1.0	0.0	1.0
+chr2	370943	1.0	0.0	1.0
+chr2	370947	1.0	0.0	1.0
+chr2	370950	0.0	1.0	1.0
+chr2	371106	2.0	0.0	2.0
+chr2	371548	0.0	1.0	1.0
+chr2	371859	0.0	1.0	1.0
+chr2	371890	1.0	0.0	1.0
+chr2	371903	0.0	1.0	1.0
+chr2	371923	1.0	0.0	1.0
+chr2	372154	0.0	1.0	1.0
+chr2	372232	1.0	0.0	1.0
+chr2	372296	1.0	0.0	1.0
+chr2	372418	0.0	6.0	6.0
+chr2	372454	0.0	1.0	1.0
+chr2	372650	1.0	0.0	1.0
+chr2	372849	0.0	1.0	1.0
+chr2	372854	3.0	0.0	3.0
+chr2	372863	1.0	0.0	1.0
+chr2	373055	1.0	0.0	1.0
+chr2	373059	0.0	1.0	1.0
+chr2	373107	0.0	1.0	1.0
+chr2	373118	1.0	0.0	1.0
+chr2	373176	1.0	0.0	1.0
+chr2	373466	0.0	1.0	1.0
+chr2	373489	1.0	0.0	1.0
+chr2	373784	0.0	1.0	1.0
+chr2	374071	0.0	1.0	1.0
+chr2	374113	1.0	0.0	1.0
+chr2	374279	2.0	0.0	2.0
+chr2	374343	0.0	1.0	1.0
+chr2	374886	1.0	0.0	1.0
+chr2	375311	0.0	1.0	1.0
+chr2	376881	0.0	1.0	1.0
+chr2	377631	1.0	0.0	1.0
+chr2	378229	0.0	1.0	1.0
+chr2	378306	0.0	1.0	1.0
+chr2	379147	1.0	0.0	1.0
+chr2	379178	0.0	1.0	1.0
+chr2	379211	0.0	1.0	1.0
+chr2	379313	1.0	0.0	1.0
+chr2	379350	0.0	1.0	1.0
+chr2	379472	1.0	0.0	1.0
+chr2	379503	0.0	1.0	1.0
+chr2	379609	0.0	1.0	1.0
+chr2	379622	1.0	0.0	1.0
+chr2	379662	0.0	1.0	1.0
+chr2	379747	0.0	1.0	1.0
+chr2	379787	1.0	0.0	1.0
+chr2	379799	1.0	0.0	1.0
+chr2	379895	1.0	0.0	1.0
+chr2	379899	0.0	1.0	1.0
+chr2	379901	1.0	0.0	1.0
+chr2	379908	0.0	1.0	1.0
+chr2	379943	1.0	0.0	1.0
+chr2	379957	1.0	0.0	1.0
+chr2	379958	0.0	2.0	2.0
+chr2	379967	1.0	0.0	1.0
+chr2	379968	1.0	0.0	1.0
+chr2	379971	1.0	0.0	1.0
+chr2	379973	0.0	1.0	1.0
+chr2	379993	0.0	1.0	1.0
+chr2	379994	0.0	2.0	2.0
+chr2	380207	0.0	1.0	1.0
+chr2	380221	0.0	1.0	1.0
+chr2	380232	1.0	0.0	1.0
+chr2	380241	2.0	0.0	2.0
+chr2	380242	0.0	2.0	2.0
+chr2	380244	1.0	0.0	1.0
+chr2	380260	1.0	0.0	1.0
+chr2	380275	1.0	0.0	1.0
+chr2	380441	0.0	1.0	1.0
+chr2	380519	0.0	2.0	2.0
+chr2	380728	0.0	1.0	1.0
+chr2	380729	0.0	1.0	1.0
+chr2	380741	1.0	0.0	1.0
+chr2	380761	1.0	0.0	1.0
+chr2	380769	1.0	0.0	1.0
+chr2	380773	0.0	1.0	1.0
+chr2	380777	0.0	1.0	1.0
+chr2	380921	2.0	0.0	2.0
+chr2	380968	0.0	1.0	1.0
+chr2	381047	0.0	1.0	1.0
+chr2	381049	1.0	0.0	1.0
+chr2	381061	0.0	2.0	2.0
+chr2	381063	0.0	1.0	1.0
+chr2	381066	0.0	1.0	1.0
+chr2	381073	0.0	1.0	1.0
+chr2	381093	1.0	0.0	1.0
+chr2	381120	1.0	0.0	1.0
+chr2	381239	1.0	0.0	1.0
+chr2	381379	1.0	0.0	1.0
+chr2	381450	0.0	1.0	1.0
+chr2	381469	1.0	0.0	1.0
+chr2	381473	0.0	1.0	1.0
+chr2	381480	3.0	1.0	4.0
+chr2	381506	0.0	2.0	2.0
+chr2	381643	0.0	1.0	1.0
+chr2	381645	0.0	1.0	1.0
+chr2	381687	1.0	0.0	1.0
+chr2	381698	0.0	1.0	1.0
+chr2	381699	0.0	1.0	1.0
+chr2	381700	1.0	0.0	1.0
+chr2	381754	1.0	0.0	1.0
+chr2	381820	1.0	0.0	1.0
+chr2	381827	3.0	0.0	3.0
+chr2	381828	1.0	0.0	1.0
+chr2	381843	0.0	1.0	1.0
+chr2	381849	0.0	1.0	1.0
+chr2	381850	2.0	2.0	4.0
+chr2	381856	1.0	0.0	1.0
+chr2	381857	1.0	1.0	2.0
+chr2	381858	1.0	0.0	1.0
+chr2	381862	0.0	1.0	1.0
+chr2	381866	0.0	1.0	1.0
+chr2	381870	1.0	0.0	1.0
+chr2	382033	0.0	1.0	1.0
+chr2	382042	0.0	1.0	1.0
+chr2	382057	1.0	0.0	1.0
+chr2	382132	1.0	0.0	1.0
+chr2	382157	0.0	1.0	1.0
+chr2	382158	0.0	1.0	1.0
+chr2	382170	2.0	0.0	2.0
+chr2	382180	1.0	0.0	1.0
+chr2	382189	3.0	0.0	3.0
+chr2	382190	1.0	0.0	1.0
+chr2	382199	0.0	1.0	1.0
+chr2	382202	0.0	1.0	1.0
+chr2	382211	0.0	1.0	1.0
+chr2	382217	0.0	1.0	1.0
+chr2	382218	0.0	1.0	1.0
+chr2	382293	0.0	1.0	1.0
+chr2	382312	0.0	1.0	1.0
+chr2	382320	0.0	1.0	1.0
+chr2	382328	0.0	2.0	2.0
+chr2	382348	0.0	1.0	1.0
+chr2	382364	0.0	1.0	1.0
+chr2	382367	1.0	0.0	1.0
+chr2	382369	2.0	0.0	2.0
+chr2	382371	1.0	0.0	1.0
+chr2	382407	1.0	0.0	1.0
+chr2	382479	1.0	0.0	1.0
+chr2	382494	0.0	2.0	2.0
+chr2	382496	1.0	0.0	1.0
+chr2	382503	0.0	1.0	1.0
+chr2	382517	1.0	0.0	1.0
+chr2	382521	1.0	0.0	1.0
+chr2	382522	1.0	0.0	1.0
+chr2	382525	1.0	0.0	1.0
+chr2	382533	1.0	0.0	1.0
+chr2	382534	1.0	2.0	3.0
+chr2	382536	1.0	2.0	3.0
+chr2	382539	1.0	0.0	1.0
+chr2	382544	1.0	1.0	2.0
+chr2	382545	2.0	2.0	4.0
+chr2	382584	1.0	0.0	1.0
+chr2	382660	1.0	0.0	1.0
+chr2	382671	1.0	0.0	1.0
+chr2	382674	1.0	0.0	1.0
+chr2	382683	3.0	0.0	3.0
+chr2	382687	1.0	0.0	1.0
+chr2	382692	1.0	0.0	1.0
+chr2	382694	0.0	1.0	1.0
+chr2	382695	1.0	0.0	1.0
+chr2	382700	0.0	1.0	1.0
+chr2	382701	0.0	1.0	1.0
+chr2	382704	1.0	0.0	1.0
+chr2	382711	3.0	0.0	3.0
+chr2	382718	0.0	1.0	1.0
+chr2	382729	1.0	0.0	1.0
+chr2	382730	1.0	0.0	1.0
+chr2	382864	3.0	0.0	3.0
+chr2	382871	1.0	1.0	2.0
+chr2	382874	0.0	1.0	1.0
+chr2	382875	0.0	3.0	3.0
+chr2	382881	1.0	0.0	1.0
+chr2	382885	1.0	0.0	1.0
+chr2	382891	0.0	1.0	1.0
+chr2	382892	0.0	2.0	2.0
+chr2	382894	4.0	0.0	4.0
+chr2	382895	0.0	2.0	2.0
+chr2	382896	0.0	1.0	1.0
+chr2	382899	1.0	0.0	1.0
+chr2	382908	0.0	1.0	1.0
+chr2	382914	0.0	1.0	1.0
+chr2	382915	0.0	2.0	2.0
+chr2	382922	2.0	0.0	2.0
+chr2	383108	0.0	1.0	1.0
+chr2	383132	0.0	1.0	1.0
+chr2	383143	0.0	2.0	2.0
+chr2	383149	2.0	0.0	2.0
+chr2	383161	1.0	0.0	1.0
+chr2	383162	1.0	0.0	1.0
+chr2	383165	0.0	2.0	2.0
+chr2	383167	1.0	0.0	1.0
+chr2	383168	2.0	0.0	2.0
+chr2	383169	0.0	1.0	1.0
+chr2	383175	1.0	0.0	1.0
+chr2	383177	0.0	3.0	3.0
+chr2	383180	4.0	1.0	5.0
+chr2	383181	1.0	0.0	1.0
+chr2	383189	0.0	1.0	1.0
+chr2	383190	2.0	1.0	3.0
+chr2	383191	3.0	0.0	3.0
+chr2	383192	2.0	1.0	3.0
+chr2	383193	0.0	1.0	1.0
+chr2	383195	0.0	1.0	1.0
+chr2	383204	0.0	1.0	1.0
+chr2	383212	0.0	1.0	1.0
+chr2	383322	0.0	1.0	1.0
+chr2	383327	1.0	0.0	1.0
+chr2	383332	1.0	0.0	1.0
+chr2	383343	2.0	0.0	2.0
+chr2	383350	2.0	0.0	2.0
+chr2	383352	0.0	1.0	1.0
+chr2	383353	1.0	0.0	1.0
+chr2	383510	0.0	1.0	1.0
+chr2	383512	0.0	1.0	1.0
+chr2	383513	1.0	0.0	1.0
+chr2	383525	1.0	0.0	1.0
+chr2	383541	0.0	1.0	1.0
+chr2	383673	1.0	0.0	1.0
+chr2	383676	1.0	0.0	1.0
+chr2	383705	1.0	0.0	1.0
+chr2	383891	0.0	1.0	1.0
+chr2	383987	0.0	2.0	2.0
+chr2	384330	0.0	1.0	1.0
+chr2	384479	0.0	1.0	1.0
+chr2	384721	1.0	0.0	1.0
+chr2	385253	0.0	1.0	1.0
+chr2	385272	0.0	1.0	1.0
+chr2	385323	1.0	0.0	1.0
+chr2	385382	1.0	0.0	1.0
+chr2	385449	0.0	1.0	1.0
+chr2	385490	0.0	1.0	1.0
+chr2	385736	1.0	0.0	1.0
+chr2	385842	0.0	1.0	1.0
+chr2	385854	1.0	0.0	1.0
+chr2	385867	1.0	0.0	1.0
+chr2	385910	0.0	1.0	1.0
+chr2	385912	1.0	0.0	1.0
+chr2	386035	0.0	1.0	1.0
+chr2	386043	1.0	0.0	1.0
+chr2	386058	0.0	1.0	1.0
+chr2	386089	1.0	0.0	1.0
+chr2	386310	1.0	0.0	1.0
+chr2	386455	0.0	1.0	1.0
+chr2	386467	0.0	1.0	1.0
+chr2	386492	0.0	1.0	1.0
+chr2	386499	1.0	0.0	1.0
+chr2	386632	1.0	0.0	1.0
+chr2	386748	1.0	0.0	1.0
+chr2	386767	1.0	0.0	1.0
+chr2	386771	1.0	0.0	1.0
+chr2	386809	1.0	0.0	1.0
+chr2	386945	0.0	1.0	1.0
+chr2	387095	0.0	1.0	1.0
+chr2	387423	0.0	1.0	1.0
+chr2	387426	0.0	1.0	1.0
+chr2	387431	1.0	0.0	1.0
+chr2	387559	1.0	0.0	1.0
+chr2	387574	1.0	0.0	1.0
+chr2	387821	1.0	0.0	1.0
+chr2	387911	0.0	1.0	1.0
+chr2	388078	0.0	1.0	1.0
+chr2	388257	0.0	1.0	1.0
+chr2	388666	0.0	2.0	2.0
+chr2	388955	1.0	0.0	1.0
+chr2	389396	1.0	0.0	1.0
+chr2	389402	0.0	1.0	1.0
+chr2	389421	1.0	0.0	1.0
+chr2	389434	1.0	0.0	1.0
+chr2	389516	1.0	0.0	1.0
+chr2	389862	0.0	1.0	1.0
+chr2	389886	2.0	0.0	2.0
+chr2	389914	1.0	0.0	1.0
+chr2	390095	1.0	0.0	1.0
+chr2	390145	3.0	0.0	3.0
+chr2	390148	0.0	4.0	4.0
+chr2	390301	2.0	1.0	3.0
+chr2	390314	1.0	0.0	1.0
+chr2	390494	0.0	1.0	1.0
+chr2	390498	0.0	1.0	1.0
+chr2	390625	0.0	1.0	1.0
+chr2	390686	1.0	0.0	1.0
+chr2	390778	0.0	1.0	1.0
+chr2	390794	1.0	0.0	1.0
+chr2	390804	0.0	1.0	1.0
+chr2	390974	1.0	0.0	1.0
+chr2	390976	0.0	1.0	1.0
+chr2	391117	0.0	1.0	1.0
+chr2	391175	0.0	1.0	1.0
+chr2	391176	0.0	1.0	1.0
+chr2	391282	0.0	1.0	1.0
+chr2	391352	0.0	1.0	1.0
+chr2	391405	1.0	0.0	1.0
+chr2	391413	1.0	0.0	1.0
+chr2	391440	1.0	0.0	1.0
+chr2	391446	0.0	5.0	5.0
+chr2	391466	1.0	0.0	1.0
+chr2	391591	0.0	1.0	1.0
+chr2	391612	0.0	1.0	1.0
+chr2	391614	1.0	0.0	1.0
+chr2	391623	7.0	0.0	7.0
+chr2	391624	1.0	0.0	1.0
+chr2	391629	0.0	2.0	2.0
+chr2	391630	0.0	1.0	1.0
+chr2	391632	2.0	0.0	2.0
+chr2	391636	1.0	0.0	1.0
+chr2	391637	0.0	1.0	1.0
+chr2	391658	0.0	1.0	1.0
+chr2	391867	1.0	0.0	1.0
+chr2	391868	1.0	0.0	1.0
+chr2	391879	1.0	0.0	1.0
+chr2	391880	0.0	1.0	1.0
+chr2	391928	0.0	1.0	1.0
+chr2	391949	0.0	1.0	1.0
+chr2	392132	0.0	1.0	1.0
+chr2	392141	3.0	0.0	3.0
+chr2	392234	0.0	1.0	1.0
+chr2	392255	1.0	0.0	1.0
+chr2	392256	2.0	0.0	2.0
+chr2	392265	0.0	1.0	1.0
+chr2	392268	1.0	0.0	1.0
+chr2	392271	1.0	0.0	1.0
+chr2	392279	0.0	1.0	1.0
+chr2	392284	1.0	2.0	3.0
+chr2	392286	0.0	3.0	3.0
+chr2	392303	1.0	0.0	1.0
+chr2	392304	0.0	1.0	1.0
+chr2	392780	1.0	0.0	1.0
+chr2	392820	0.0	1.0	1.0
+chr2	392872	0.0	1.0	1.0
+chr2	393137	0.0	1.0	1.0
+chr2	393140	0.0	1.0	1.0
+chr2	393159	1.0	0.0	1.0
+chr2	393185	1.0	0.0	1.0
+chr2	393191	1.0	0.0	1.0
+chr2	393500	1.0	0.0	1.0
+chr2	393501	1.0	0.0	1.0
+chr2	393563	1.0	0.0	1.0
+chr2	393801	0.0	1.0	1.0
+chr2	393825	0.0	1.0	1.0
+chr2	393981	0.0	1.0	1.0
+chr2	394150	0.0	1.0	1.0
+chr2	394482	0.0	1.0	1.0
+chr2	394636	1.0	0.0	1.0
+chr2	395143	1.0	0.0	1.0
+chr2	395144	1.0	0.0	1.0
+chr2	396004	2.0	0.0	2.0
+chr2	396135	0.0	1.0	1.0
+chr2	396407	0.0	1.0	1.0
+chr2	397581	0.0	2.0	2.0
+chr2	397818	1.0	0.0	1.0
+chr2	397965	2.0	0.0	2.0
+chr2	398119	1.0	0.0	1.0
+chr2	398241	0.0	1.0	1.0
+chr2	398245	0.0	2.0	2.0
+chr2	398246	0.0	1.0	1.0
+chr2	398247	2.0	0.0	2.0
+chr2	398249	1.0	0.0	1.0
+chr2	398250	3.0	0.0	3.0
+chr2	398253	1.0	3.0	4.0
+chr2	398262	1.0	0.0	1.0
+chr2	398264	1.0	0.0	1.0
+chr2	398311	1.0	0.0	1.0
+chr2	398312	1.0	0.0	1.0
+chr2	398587	0.0	1.0	1.0
+chr2	398592	2.0	0.0	2.0
+chr2	399178	0.0	1.0	1.0
+chr2	399445	0.0	1.0	1.0
+chr2	399491	1.0	0.0	1.0
+chr2	399493	0.0	1.0	1.0
+chr2	399560	0.0	1.0	1.0
+chr2	399734	1.0	0.0	1.0
+chr2	400006	0.0	1.0	1.0
+chr2	400101	0.0	1.0	1.0
+chr2	400376	1.0	0.0	1.0
+chr2	400416	1.0	0.0	1.0
+chr2	400658	0.0	1.0	1.0
+chr2	400680	3.0	0.0	3.0
+chr2	400693	1.0	0.0	1.0
+chr2	400702	0.0	2.0	2.0
+chr2	400703	1.0	0.0	1.0
+chr2	400823	0.0	1.0	1.0
+chr2	400832	1.0	0.0	1.0
+chr2	400835	0.0	1.0	1.0
+chr2	400843	1.0	0.0	1.0
+chr2	400845	0.0	1.0	1.0
+chr2	400851	1.0	0.0	1.0
+chr2	400852	1.0	1.0	2.0
+chr2	400853	1.0	0.0	1.0
+chr2	400856	1.0	0.0	1.0
+chr2	400857	0.0	1.0	1.0
+chr2	400858	1.0	0.0	1.0
+chr2	400865	0.0	2.0	2.0
+chr2	400869	0.0	3.0	3.0
+chr2	400874	2.0	0.0	2.0
+chr2	400875	4.0	2.0	6.0
+chr2	400877	0.0	1.0	1.0
+chr2	400880	0.0	1.0	1.0
+chr2	400883	1.0	0.0	1.0
+chr2	400889	2.0	0.0	2.0
+chr2	400890	1.0	0.0	1.0
+chr2	401083	2.0	0.0	2.0
+chr2	401174	1.0	0.0	1.0
+chr2	401189	0.0	1.0	1.0
+chr2	401197	0.0	1.0	1.0
+chr2	401204	0.0	1.0	1.0
+chr2	401237	0.0	1.0	1.0
+chr2	401352	0.0	1.0	1.0
+chr2	401371	1.0	0.0	1.0
+chr2	401404	1.0	0.0	1.0
+chr2	401750	1.0	0.0	1.0
+chr2	401898	0.0	1.0	1.0
+chr2	402169	0.0	1.0	1.0
+chr2	402275	1.0	0.0	1.0
+chr2	402478	0.0	1.0	1.0
+chr2	403062	0.0	1.0	1.0
+chr2	403459	1.0	0.0	1.0
+chr2	403588	1.0	0.0	1.0
+chr2	405003	2.0	0.0	2.0
+chr2	405139	0.0	1.0	1.0
+chr2	405150	1.0	0.0	1.0
+chr2	405160	1.0	0.0	1.0
+chr2	405172	0.0	1.0	1.0
+chr2	405179	1.0	0.0	1.0
+chr2	405191	1.0	0.0	1.0
+chr2	405322	1.0	0.0	1.0
+chr2	405324	5.0	2.0	7.0
+chr2	405327	0.0	1.0	1.0
+chr2	405329	1.0	0.0	1.0
+chr2	405332	0.0	1.0	1.0
+chr2	405338	1.0	1.0	2.0
+chr2	405341	2.0	1.0	3.0
+chr2	405342	0.0	1.0	1.0
+chr2	405343	1.0	0.0	1.0
+chr2	405345	0.0	1.0	1.0
+chr2	405346	1.0	0.0	1.0
+chr2	405592	0.0	1.0	1.0
+chr2	405596	1.0	0.0	1.0
+chr2	405599	1.0	0.0	1.0
+chr2	406124	0.0	1.0	1.0
+chr2	406217	0.0	1.0	1.0
+chr2	406244	0.0	1.0	1.0
+chr2	406275	0.0	2.0	2.0
+chr2	406304	0.0	1.0	1.0
+chr2	406307	5.0	0.0	5.0
+chr2	406330	0.0	1.0	1.0
+chr2	406332	0.0	1.0	1.0
+chr2	406636	0.0	2.0	2.0
+chr2	406661	1.0	0.0	1.0
+chr2	406709	1.0	0.0	1.0
+chr2	406793	0.0	1.0	1.0
+chr2	406990	0.0	1.0	1.0
+chr2	407182	1.0	0.0	1.0
+chr2	407594	2.0	0.0	2.0
+chr2	407608	0.0	1.0	1.0
+chr2	407626	1.0	0.0	1.0
+chr2	407683	0.0	1.0	1.0
+chr2	407789	1.0	0.0	1.0
+chr2	407926	1.0	0.0	1.0
+chr2	408289	0.0	1.0	1.0
+chr2	408316	3.0	0.0	3.0
+chr2	408328	0.0	1.0	1.0
+chr2	408455	0.0	1.0	1.0
+chr2	408466	1.0	0.0	1.0
+chr2	408473	0.0	1.0	1.0
+chr2	408496	1.0	0.0	1.0
+chr2	408833	1.0	0.0	1.0
+chr2	408871	1.0	0.0	1.0
+chr2	408872	1.0	0.0	1.0
+chr2	408886	1.0	1.0	2.0
+chr2	408887	0.0	4.0	4.0
+chr2	408897	1.0	0.0	1.0
+chr2	408918	0.0	1.0	1.0
+chr2	408984	0.0	1.0	1.0
+chr2	409068	2.0	0.0	2.0
+chr2	409074	0.0	1.0	1.0
+chr2	409208	0.0	1.0	1.0
+chr2	409231	1.0	0.0	1.0
+chr2	409250	1.0	0.0	1.0
+chr2	409362	0.0	1.0	1.0
+chr2	409373	1.0	0.0	1.0
+chr2	409399	0.0	1.0	1.0
+chr2	409417	0.0	1.0	1.0
+chr2	409429	3.0	0.0	3.0
+chr2	409434	0.0	1.0	1.0
+chr2	409438	0.0	1.0	1.0
+chr2	409598	1.0	0.0	1.0
+chr2	409742	0.0	1.0	1.0
+chr2	409797	0.0	1.0	1.0
+chr2	410105	1.0	0.0	1.0
+chr2	410258	0.0	1.0	1.0
+chr2	410386	1.0	0.0	1.0
+chr2	410403	0.0	1.0	1.0
+chr2	410697	1.0	0.0	1.0
+chr2	410703	2.0	1.0	3.0
+chr2	410706	1.0	1.0	2.0
+chr2	410714	0.0	1.0	1.0
+chr2	410717	0.0	2.0	2.0
+chr2	410724	1.0	0.0	1.0
+chr2	410731	2.0	0.0	2.0
+chr2	410732	1.0	0.0	1.0
+chr2	410738	1.0	0.0	1.0
+chr2	411024	1.0	0.0	1.0
+chr2	411027	1.0	0.0	1.0
+chr2	411028	0.0	1.0	1.0
+chr2	411029	0.0	1.0	1.0
+chr2	411030	2.0	0.0	2.0
+chr2	411034	1.0	0.0	1.0
+chr2	411035	1.0	0.0	1.0
+chr2	411036	0.0	1.0	1.0
+chr2	411059	1.0	0.0	1.0
+chr2	411069	1.0	0.0	1.0
+chr2	411207	1.0	0.0	1.0
+chr2	411214	0.0	1.0	1.0
+chr2	411217	0.0	1.0	1.0
+chr2	411391	0.0	1.0	1.0
+chr2	411486	1.0	0.0	1.0
+chr2	411740	0.0	1.0	1.0
+chr2	412432	1.0	0.0	1.0
+chr2	412761	1.0	0.0	1.0
+chr2	412786	1.0	0.0	1.0
+chr2	413066	0.0	1.0	1.0
+chr2	413087	0.0	1.0	1.0
+chr2	413111	1.0	0.0	1.0
+chr2	413181	1.0	0.0	1.0
+chr2	413362	0.0	1.0	1.0
+chr2	413554	1.0	0.0	1.0
+chr2	413559	3.0	0.0	3.0
+chr2	413574	0.0	1.0	1.0
+chr2	413575	0.0	1.0	1.0
+chr2	413883	0.0	1.0	1.0
+chr2	413884	1.0	0.0	1.0
+chr2	413889	1.0	0.0	1.0
+chr2	413895	1.0	1.0	2.0
+chr2	413920	0.0	1.0	1.0
+chr2	414334	1.0	0.0	1.0
+chr2	414373	0.0	1.0	1.0
+chr2	414381	0.0	1.0	1.0
+chr2	414436	1.0	0.0	1.0
+chr2	414512	0.0	1.0	1.0
+chr2	414577	0.0	1.0	1.0
+chr2	414596	0.0	1.0	1.0
+chr2	414666	0.0	1.0	1.0
+chr2	414744	1.0	0.0	1.0
+chr2	415880	0.0	1.0	1.0
+chr2	415884	0.0	1.0	1.0
+chr2	415893	1.0	0.0	1.0
+chr2	415895	1.0	0.0	1.0
+chr2	415903	1.0	0.0	1.0
+chr2	415922	2.0	0.0	2.0
+chr2	415926	0.0	2.0	2.0
+chr2	415943	0.0	1.0	1.0
+chr2	415965	1.0	0.0	1.0
+chr2	415970	1.0	0.0	1.0
+chr2	415998	1.0	0.0	1.0
+chr2	416078	0.0	1.0	1.0
+chr2	416082	0.0	1.0	1.0
+chr2	416096	1.0	0.0	1.0
+chr2	416101	1.0	0.0	1.0
+chr2	416102	1.0	0.0	1.0
+chr2	416104	0.0	1.0	1.0
+chr2	416258	0.0	1.0	1.0
+chr2	416283	0.0	1.0	1.0
+chr2	416331	1.0	0.0	1.0
+chr2	416475	0.0	2.0	2.0
+chr2	416560	0.0	3.0	3.0
+chr2	416652	0.0	1.0	1.0
+chr2	416697	0.0	1.0	1.0
+chr2	416706	1.0	0.0	1.0
+chr2	416741	0.0	1.0	1.0
+chr2	416874	1.0	0.0	1.0
+chr2	416902	0.0	1.0	1.0
+chr2	417134	2.0	0.0	2.0
+chr2	417159	0.0	1.0	1.0
+chr2	417189	1.0	0.0	1.0
+chr2	417193	0.0	1.0	1.0
+chr2	417198	0.0	1.0	1.0
+chr2	417371	0.0	1.0	1.0
+chr2	417374	0.0	1.0	1.0
+chr2	417385	0.0	1.0	1.0
+chr2	417402	1.0	0.0	1.0
+chr2	417407	0.0	1.0	1.0
+chr2	417412	1.0	0.0	1.0
+chr2	417511	0.0	1.0	1.0
+chr2	417519	0.0	1.0	1.0
+chr2	417520	2.0	0.0	2.0
+chr2	417521	1.0	0.0	1.0
+chr2	417524	0.0	1.0	1.0
+chr2	417526	0.0	3.0	3.0
+chr2	417527	3.0	1.0	4.0
+chr2	417528	0.0	2.0	2.0
+chr2	417529	2.0	0.0	2.0
+chr2	417535	2.0	2.0	4.0
+chr2	417536	4.0	1.0	5.0
+chr2	417538	0.0	2.0	2.0
+chr2	417539	2.0	0.0	2.0
+chr2	417541	0.0	1.0	1.0
+chr2	417547	0.0	1.0	1.0
+chr2	417549	1.0	0.0	1.0
+chr2	417556	0.0	1.0	1.0
+chr2	417558	0.0	1.0	1.0
+chr2	417562	1.0	0.0	1.0
+chr2	417753	0.0	2.0	2.0
+chr2	417765	2.0	1.0	3.0
+chr2	417766	0.0	2.0	2.0
+chr2	417779	1.0	0.0	1.0
+chr2	417925	1.0	0.0	1.0
+chr2	417939	0.0	1.0	1.0
+chr2	417954	1.0	0.0	1.0
+chr2	417967	0.0	1.0	1.0
+chr2	417968	0.0	1.0	1.0
+chr2	418075	0.0	2.0	2.0
+chr2	418086	1.0	0.0	1.0
+chr2	418125	0.0	2.0	2.0
+chr2	418316	1.0	0.0	1.0
+chr2	418334	0.0	1.0	1.0
+chr2	418352	0.0	1.0	1.0
+chr2	418374	1.0	0.0	1.0
+chr2	418375	1.0	0.0	1.0
+chr2	418383	1.0	0.0	1.0
+chr2	418405	0.0	1.0	1.0
+chr2	418485	0.0	2.0	2.0
+chr2	418515	0.0	1.0	1.0
+chr2	418699	0.0	1.0	1.0
+chr2	418715	0.0	1.0	1.0
+chr2	418827	0.0	1.0	1.0
+chr2	418845	0.0	1.0	1.0
+chr2	418873	0.0	1.0	1.0
+chr2	418877	1.0	1.0	2.0
+chr2	419009	2.0	0.0	2.0
+chr2	419025	1.0	0.0	1.0
+chr2	419030	0.0	1.0	1.0
+chr2	419041	0.0	1.0	1.0
+chr2	419043	0.0	1.0	1.0
+chr2	419180	1.0	0.0	1.0
+chr2	419181	1.0	0.0	1.0
+chr2	419191	2.0	8.0	10.0
+chr2	419192	0.0	2.0	2.0
+chr2	419193	1.0	0.0	1.0
+chr2	419201	1.0	0.0	1.0
+chr2	419202	5.0	0.0	5.0
+chr2	419216	1.0	0.0	1.0
+chr2	419217	0.0	1.0	1.0
+chr2	419226	0.0	1.0	1.0
+chr2	419432	1.0	0.0	1.0
+chr2	419487	2.0	0.0	2.0
+chr2	419519	0.0	1.0	1.0
+chr2	419520	0.0	1.0	1.0
+chr2	419537	1.0	0.0	1.0
+chr2	419603	1.0	0.0	1.0
+chr2	419612	0.0	1.0	1.0
+chr2	419629	0.0	1.0	1.0
+chr2	419643	0.0	1.0	1.0
+chr2	419644	0.0	1.0	1.0
+chr2	419652	1.0	0.0	1.0
+chr2	419658	0.0	1.0	1.0
+chr2	419660	0.0	1.0	1.0
+chr2	419663	1.0	0.0	1.0
+chr2	419848	1.0	0.0	1.0
+chr2	419954	0.0	1.0	1.0
+chr2	419967	1.0	0.0	1.0
+chr2	419968	0.0	1.0	1.0
+chr2	419976	1.0	0.0	1.0
+chr2	420394	1.0	0.0	1.0
+chr2	420554	1.0	0.0	1.0
+chr2	420743	1.0	0.0	1.0
+chr2	420953	0.0	1.0	1.0
+chr2	421145	0.0	1.0	1.0
+chr2	421419	1.0	0.0	1.0
+chr2	421853	0.0	2.0	2.0
+chr2	422201	1.0	0.0	1.0
+chr2	422244	0.0	1.0	1.0
+chr2	422429	0.0	1.0	1.0
+chr2	423078	1.0	0.0	1.0
+chr2	423096	0.0	1.0	1.0
+chr2	423264	0.0	1.0	1.0
+chr2	423282	0.0	1.0	1.0
+chr2	423305	0.0	1.0	1.0
+chr2	423522	0.0	1.0	1.0
+chr2	423555	0.0	1.0	1.0
+chr2	423586	1.0	0.0	1.0
+chr2	423588	0.0	2.0	2.0
+chr2	423591	0.0	1.0	1.0
+chr2	423592	0.0	2.0	2.0
+chr2	423593	0.0	1.0	1.0
+chr2	423609	1.0	0.0	1.0
+chr2	423624	0.0	1.0	1.0
+chr2	423755	0.0	1.0	1.0
+chr2	423777	1.0	0.0	1.0
+chr2	423789	0.0	1.0	1.0
+chr2	423790	0.0	3.0	3.0
+chr2	423793	1.0	0.0	1.0
+chr2	423796	2.0	0.0	2.0
+chr2	423798	0.0	1.0	1.0
+chr2	423800	1.0	0.0	1.0
+chr2	423801	0.0	1.0	1.0
+chr2	423802	1.0	0.0	1.0
+chr2	423803	0.0	1.0	1.0
+chr2	423817	1.0	0.0	1.0
+chr2	423818	0.0	1.0	1.0
+chr2	423938	1.0	0.0	1.0
+chr2	424121	0.0	1.0	1.0
+chr2	424132	1.0	0.0	1.0
+chr2	424133	1.0	0.0	1.0
+chr2	424141	1.0	0.0	1.0
+chr2	424264	0.0	2.0	2.0
+chr2	424294	0.0	1.0	1.0
+chr2	424674	0.0	1.0	1.0
+chr2	425022	1.0	0.0	1.0
+chr2	425044	1.0	0.0	1.0
+chr2	425050	0.0	1.0	1.0
+chr2	425090	1.0	0.0	1.0
+chr2	425114	1.0	0.0	1.0
+chr2	425115	1.0	0.0	1.0
+chr2	425126	0.0	1.0	1.0
+chr2	425129	1.0	0.0	1.0
+chr2	425209	0.0	1.0	1.0
+chr2	425259	1.0	0.0	1.0
+chr2	425290	0.0	1.0	1.0
+chr2	425291	1.0	0.0	1.0
+chr2	425333	1.0	0.0	1.0
+chr2	425399	1.0	0.0	1.0
+chr2	425472	0.0	1.0	1.0
+chr2	425474	2.0	0.0	2.0
+chr2	425479	0.0	1.0	1.0
+chr2	425532	0.0	1.0	1.0
+chr2	425637	1.0	1.0	2.0
+chr2	425640	0.0	2.0	2.0
+chr2	425650	0.0	1.0	1.0
+chr2	425655	1.0	0.0	1.0
+chr2	425665	1.0	0.0	1.0
+chr2	425679	1.0	0.0	1.0
+chr2	425774	0.0	1.0	1.0
+chr2	425778	0.0	1.0	1.0
+chr2	425794	0.0	1.0	1.0
+chr2	425795	0.0	1.0	1.0
+chr2	425796	0.0	1.0	1.0
+chr2	425799	2.0	0.0	2.0
+chr2	425801	1.0	4.0	5.0
+chr2	425802	0.0	1.0	1.0
+chr2	425803	0.0	1.0	1.0
+chr2	425805	0.0	2.0	2.0
+chr2	425809	0.0	1.0	1.0
+chr2	425821	2.0	0.0	2.0
+chr2	425822	1.0	0.0	1.0
+chr2	425829	2.0	0.0	2.0
+chr2	425835	0.0	2.0	2.0
+chr2	426081	1.0	0.0	1.0
+chr2	426245	1.0	0.0	1.0
+chr2	426257	1.0	0.0	1.0
+chr2	426268	1.0	0.0	1.0
+chr2	426282	1.0	0.0	1.0
+chr2	426396	0.0	1.0	1.0
+chr2	426416	0.0	1.0	1.0
+chr2	426417	0.0	1.0	1.0
+chr2	426646	0.0	2.0	2.0
+chr2	426715	1.0	0.0	1.0
+chr2	426732	1.0	0.0	1.0
+chr2	426741	1.0	0.0	1.0
+chr2	426744	0.0	1.0	1.0
+chr2	426755	1.0	0.0	1.0
+chr2	426787	0.0	1.0	1.0
+chr2	426791	0.0	1.0	1.0
+chr2	426819	0.0	1.0	1.0
+chr2	426825	0.0	1.0	1.0
+chr2	426837	0.0	2.0	2.0
+chr2	426881	0.0	1.0	1.0
+chr2	427138	0.0	1.0	1.0
+chr2	427156	0.0	1.0	1.0
+chr2	427171	1.0	0.0	1.0
+chr2	427172	1.0	0.0	1.0
+chr2	427179	0.0	1.0	1.0
+chr2	427188	1.0	0.0	1.0
+chr2	427193	1.0	0.0	1.0
+chr2	427203	1.0	0.0	1.0
+chr2	427307	1.0	0.0	1.0
+chr2	427308	0.0	3.0	3.0
+chr2	427313	1.0	0.0	1.0
+chr2	427315	1.0	0.0	1.0
+chr2	427316	1.0	0.0	1.0
+chr2	427328	0.0	1.0	1.0
+chr2	427396	0.0	1.0	1.0
+chr2	427403	0.0	1.0	1.0
+chr2	427415	0.0	1.0	1.0
+chr2	427420	1.0	0.0	1.0
+chr2	427422	0.0	1.0	1.0
+chr2	427438	1.0	0.0	1.0
+chr2	427447	1.0	1.0	2.0
+chr2	427448	1.0	0.0	1.0
+chr2	427449	2.0	0.0	2.0
+chr2	427452	1.0	0.0	1.0
+chr2	427455	2.0	0.0	2.0
+chr2	427456	3.0	0.0	3.0
+chr2	427459	0.0	7.0	7.0
+chr2	427461	0.0	1.0	1.0
+chr2	427466	1.0	0.0	1.0
+chr2	427467	2.0	0.0	2.0
+chr2	427468	0.0	2.0	2.0
+chr2	427471	0.0	3.0	3.0
+chr2	427478	4.0	0.0	4.0
+chr2	427488	0.0	1.0	1.0
+chr2	427496	1.0	0.0	1.0
+chr2	427500	0.0	1.0	1.0
+chr2	427736	0.0	1.0	1.0
+chr2	427743	0.0	1.0	1.0
+chr2	427749	1.0	0.0	1.0
+chr2	427751	0.0	3.0	3.0
+chr2	427752	1.0	0.0	1.0
+chr2	427757	2.0	0.0	2.0
+chr2	427758	1.0	0.0	1.0
+chr2	427759	0.0	1.0	1.0
+chr2	427760	5.0	0.0	5.0
+chr2	427761	0.0	2.0	2.0
+chr2	427762	0.0	1.0	1.0
+chr2	427763	1.0	0.0	1.0
+chr2	427766	0.0	2.0	2.0
+chr2	427767	1.0	2.0	3.0
+chr2	427769	6.0	0.0	6.0
+chr2	427770	0.0	2.0	2.0
+chr2	427771	1.0	0.0	1.0
+chr2	427772	1.0	1.0	2.0
+chr2	427777	0.0	6.0	6.0
+chr2	427789	0.0	1.0	1.0
+chr2	427815	1.0	0.0	1.0
+chr2	427836	1.0	0.0	1.0
+chr2	427892	1.0	0.0	1.0
+chr2	427909	2.0	0.0	2.0
+chr2	427912	0.0	1.0	1.0
+chr2	427918	1.0	0.0	1.0
+chr2	427926	1.0	0.0	1.0
+chr2	427929	0.0	2.0	2.0
+chr2	427932	0.0	1.0	1.0
+chr2	427937	0.0	1.0	1.0
+chr2	427947	1.0	0.0	1.0
+chr2	427957	0.0	2.0	2.0
+chr2	427989	0.0	2.0	2.0
+chr2	428190	0.0	1.0	1.0
+chr2	428290	0.0	1.0	1.0
+chr2	428462	1.0	0.0	1.0
+chr2	428472	1.0	0.0	1.0
+chr2	428649	0.0	1.0	1.0
+chr2	428655	1.0	0.0	1.0
+chr2	428667	1.0	0.0	1.0
+chr2	428697	0.0	1.0	1.0
+chr2	428698	0.0	2.0	2.0
+chr2	428791	1.0	0.0	1.0
+chr2	428825	1.0	0.0	1.0
+chr2	428841	1.0	0.0	1.0
+chr2	428993	0.0	1.0	1.0
+chr2	429008	1.0	0.0	1.0
+chr2	429009	1.0	0.0	1.0
+chr2	429027	0.0	1.0	1.0
+chr2	429059	1.0	0.0	1.0
+chr2	429129	1.0	0.0	1.0
+chr2	429157	0.0	3.0	3.0
+chr2	429593	0.0	1.0	1.0
+chr2	429601	0.0	3.0	3.0
+chr2	429602	1.0	0.0	1.0
+chr2	429609	0.0	1.0	1.0
+chr2	429611	0.0	2.0	2.0
+chr2	429612	0.0	3.0	3.0
+chr2	429617	0.0	2.0	2.0
+chr2	429619	1.0	0.0	1.0
+chr2	429620	0.0	2.0	2.0
+chr2	429622	0.0	1.0	1.0
+chr2	429627	0.0	1.0	1.0
+chr2	429645	0.0	1.0	1.0
+chr2	429665	1.0	0.0	1.0
+chr2	429686	1.0	0.0	1.0
+chr2	429742	1.0	0.0	1.0
+chr2	429759	0.0	1.0	1.0
+chr2	429760	2.0	0.0	2.0
+chr2	429768	1.0	0.0	1.0
+chr2	429776	1.0	0.0	1.0
+chr2	429779	0.0	2.0	2.0
+chr2	429782	0.0	1.0	1.0
+chr2	429787	0.0	1.0	1.0
+chr2	429797	1.0	0.0	1.0
+chr2	429807	0.0	2.0	2.0
+chr2	429839	0.0	2.0	2.0
+chr2	429949	0.0	1.0	1.0
+chr2	429989	1.0	0.0	1.0
+chr2	430142	0.0	1.0	1.0
+chr2	430171	1.0	0.0	1.0
+chr2	430499	0.0	1.0	1.0
+chr2	430521	1.0	0.0	1.0
+chr2	430547	0.0	1.0	1.0
+chr2	430548	0.0	2.0	2.0
+chr2	430641	1.0	0.0	1.0
+chr2	431019	1.0	0.0	1.0
+chr2	431028	1.0	0.0	1.0
+chr2	431033	1.0	0.0	1.0
+chr2	431149	3.0	0.0	3.0
+chr2	431165	0.0	1.0	1.0
+chr2	431166	0.0	1.0	1.0
+chr2	431169	0.0	1.0	1.0
+chr2	431170	1.0	0.0	1.0
+chr2	431178	0.0	3.0	3.0
+chr2	431188	0.0	1.0	1.0
+chr2	431202	1.0	0.0	1.0
+chr2	431212	1.0	0.0	1.0
+chr2	431336	0.0	1.0	1.0
+chr2	431351	0.0	1.0	1.0
+chr2	431399	1.0	0.0	1.0
+chr2	431485	1.0	0.0	1.0
+chr2	431547	0.0	1.0	1.0
+chr2	431603	0.0	1.0	1.0
+chr2	431663	0.0	1.0	1.0
+chr2	431719	0.0	1.0	1.0
+chr2	431745	0.0	1.0	1.0
+chr2	431751	0.0	1.0	1.0
+chr2	431752	1.0	0.0	1.0
+chr2	431754	3.0	0.0	3.0
+chr2	431755	2.0	0.0	2.0
+chr2	431762	0.0	3.0	3.0
+chr2	431763	1.0	1.0	2.0
+chr2	431768	1.0	0.0	1.0
+chr2	431771	0.0	1.0	1.0
+chr2	431777	0.0	1.0	1.0
+chr2	431784	1.0	0.0	1.0
+chr2	431800	0.0	1.0	1.0
+chr2	431998	1.0	0.0	1.0
+chr2	431999	1.0	0.0	1.0
+chr2	432000	0.0	2.0	2.0
+chr2	432007	0.0	1.0	1.0
+chr2	432010	1.0	1.0	2.0
+chr2	432014	0.0	1.0	1.0
+chr2	432016	1.0	0.0	1.0
+chr2	432018	2.0	0.0	2.0
+chr2	432022	0.0	3.0	3.0
+chr2	432023	1.0	0.0	1.0
+chr2	432024	2.0	0.0	2.0
+chr2	432025	0.0	1.0	1.0
+chr2	432032	2.0	0.0	2.0
+chr2	432033	1.0	0.0	1.0
+chr2	432035	0.0	5.0	5.0
+chr2	432036	0.0	2.0	2.0
+chr2	432144	0.0	1.0	1.0
+chr2	432195	2.0	0.0	2.0
+chr2	432202	0.0	2.0	2.0
+chr2	432220	0.0	1.0	1.0
+chr2	432222	0.0	1.0	1.0
+chr2	432342	0.0	1.0	1.0
+chr2	432388	0.0	1.0	1.0
+chr2	432541	1.0	0.0	1.0
+chr2	432670	0.0	1.0	1.0
+chr2	432823	1.0	0.0	1.0
+chr2	433194	1.0	0.0	1.0
+chr2	433311	1.0	0.0	1.0
+chr2	433343	1.0	0.0	1.0
+chr2	433535	0.0	1.0	1.0
+chr2	433741	0.0	1.0	1.0
+chr2	433832	0.0	1.0	1.0
+chr2	434050	0.0	1.0	1.0
+chr2	434110	0.0	1.0	1.0
+chr2	434163	0.0	1.0	1.0
+chr2	434249	1.0	0.0	1.0
+chr2	434516	1.0	0.0	1.0
+chr2	434528	0.0	2.0	2.0
+chr2	434682	1.0	0.0	1.0
+chr2	434748	0.0	1.0	1.0
+chr2	435083	1.0	0.0	1.0
+chr2	435143	0.0	1.0	1.0
+chr2	435299	1.0	0.0	1.0
+chr2	435329	1.0	0.0	1.0
+chr2	435339	0.0	1.0	1.0
+chr2	435460	1.0	0.0	1.0
+chr2	435461	1.0	0.0	1.0
+chr2	435499	1.0	0.0	1.0
+chr2	435500	1.0	0.0	1.0
+chr2	435505	1.0	0.0	1.0
+chr2	435511	1.0	0.0	1.0
+chr2	435516	0.0	1.0	1.0
+chr2	435533	0.0	1.0	1.0
+chr2	435557	1.0	0.0	1.0
+chr2	435648	1.0	1.0	2.0
+chr2	435666	0.0	1.0	1.0
+chr2	435668	1.0	0.0	1.0
+chr2	435669	4.0	0.0	4.0
+chr2	435672	1.0	0.0	1.0
+chr2	435677	0.0	1.0	1.0
+chr2	435680	0.0	1.0	1.0
+chr2	435682	4.0	0.0	4.0
+chr2	435687	0.0	1.0	1.0
+chr2	435688	0.0	1.0	1.0
+chr2	435694	2.0	1.0	3.0
+chr2	435695	0.0	1.0	1.0
+chr2	435696	2.0	0.0	2.0
+chr2	435698	0.0	4.0	4.0
+chr2	435699	0.0	2.0	2.0
+chr2	435702	0.0	2.0	2.0
+chr2	435705	0.0	1.0	1.0
+chr2	435775	0.0	1.0	1.0
+chr2	435957	0.0	2.0	2.0
+chr2	435967	1.0	0.0	1.0
+chr2	435977	1.0	0.0	1.0
+chr2	435980	0.0	2.0	2.0
+chr2	435986	1.0	0.0	1.0
+chr2	436000	2.0	0.0	2.0
+chr2	436089	1.0	0.0	1.0
+chr2	436210	0.0	1.0	1.0
+chr2	436351	0.0	1.0	1.0
+chr2	436362	0.0	1.0	1.0
+chr2	436502	0.0	1.0	1.0
+chr2	436511	1.0	0.0	1.0
+chr2	436517	0.0	1.0	1.0
+chr2	436600	0.0	1.0	1.0
+chr2	436663	1.0	0.0	1.0
+chr2	436685	1.0	0.0	1.0
+chr2	436698	0.0	1.0	1.0
+chr2	436703	0.0	1.0	1.0
+chr2	436708	1.0	0.0	1.0
+chr2	436710	0.0	1.0	1.0
+chr2	436718	1.0	0.0	1.0
+chr2	436909	1.0	0.0	1.0
+chr2	436925	0.0	2.0	2.0
+chr2	436928	0.0	2.0	2.0
+chr2	436929	0.0	1.0	1.0
+chr2	436931	0.0	1.0	1.0
+chr2	436942	0.0	1.0	1.0
+chr2	436943	0.0	1.0	1.0
+chr2	436944	2.0	0.0	2.0
+chr2	436946	1.0	0.0	1.0
+chr2	436948	0.0	1.0	1.0
+chr2	436949	1.0	0.0	1.0
+chr2	436950	3.0	0.0	3.0
+chr2	436951	4.0	0.0	4.0
+chr2	436956	0.0	2.0	2.0
+chr2	436959	1.0	0.0	1.0
+chr2	436960	0.0	4.0	4.0
+chr2	436961	1.0	2.0	3.0
+chr2	436966	0.0	1.0	1.0
+chr2	436967	4.0	0.0	4.0
+chr2	436968	0.0	1.0	1.0
+chr2	436969	0.0	1.0	1.0
+chr2	436976	1.0	0.0	1.0
+chr2	436981	1.0	0.0	1.0
+chr2	436993	1.0	0.0	1.0
+chr2	436994	1.0	0.0	1.0
+chr2	436997	1.0	0.0	1.0
+chr2	437118	1.0	0.0	1.0
+chr2	437127	0.0	1.0	1.0
+chr2	437277	1.0	0.0	1.0
+chr2	437282	1.0	0.0	1.0
+chr2	437283	0.0	1.0	1.0
+chr2	437315	1.0	0.0	1.0
+chr2	437475	0.0	1.0	1.0
+chr2	437500	1.0	0.0	1.0
+chr2	437763	0.0	1.0	1.0
+chr2	437893	0.0	1.0	1.0
+chr2	437950	1.0	0.0	1.0
+chr2	438117	1.0	0.0	1.0
+chr2	438632	0.0	1.0	1.0
+chr2	438732	1.0	0.0	1.0
+chr2	438870	0.0	1.0	1.0
+chr2	439618	1.0	0.0	1.0
+chr2	439690	0.0	1.0	1.0
+chr2	440342	1.0	0.0	1.0
+chr2	440350	1.0	0.0	1.0
+chr2	440476	1.0	0.0	1.0
+chr2	440630	0.0	1.0	1.0
+chr2	440945	0.0	1.0	1.0
+chr2	441072	0.0	1.0	1.0
+chr2	441097	1.0	0.0	1.0
+chr2	441116	0.0	1.0	1.0
+chr2	441232	0.0	1.0	1.0
+chr2	441248	1.0	0.0	1.0
+chr2	441265	1.0	0.0	1.0
+chr2	441267	0.0	1.0	1.0
+chr2	441268	0.0	1.0	1.0
+chr2	441271	1.0	0.0	1.0
+chr2	441286	1.0	1.0	2.0
+chr2	441293	0.0	1.0	1.0
+chr2	441520	0.0	1.0	1.0
+chr2	441521	0.0	4.0	4.0
+chr2	441524	1.0	0.0	1.0
+chr2	441533	0.0	2.0	2.0
+chr2	441534	1.0	0.0	1.0
+chr2	441539	0.0	4.0	4.0
+chr2	441541	1.0	0.0	1.0
+chr2	441546	1.0	0.0	1.0
+chr2	441548	2.0	0.0	2.0
+chr2	441551	0.0	1.0	1.0
+chr2	441554	0.0	1.0	1.0
+chr2	441556	3.0	0.0	3.0
+chr2	441557	0.0	1.0	1.0
+chr2	441559	3.0	0.0	3.0
+chr2	441562	0.0	1.0	1.0
+chr2	441567	1.0	0.0	1.0
+chr2	441580	1.0	0.0	1.0
+chr2	441679	1.0	0.0	1.0
+chr2	441691	2.0	2.0	4.0
+chr2	441701	3.0	0.0	3.0
+chr2	441704	0.0	2.0	2.0
+chr2	441705	2.0	0.0	2.0
+chr2	441712	0.0	1.0	1.0
+chr2	441714	0.0	2.0	2.0
+chr2	441856	0.0	1.0	1.0
+chr2	441882	0.0	1.0	1.0
+chr2	441921	0.0	1.0	1.0
+chr2	442040	1.0	0.0	1.0
+chr2	442052	1.0	0.0	1.0
+chr2	442238	1.0	0.0	1.0
+chr2	442241	1.0	0.0	1.0
+chr2	442265	0.0	1.0	1.0
+chr2	442424	1.0	0.0	1.0
+chr2	442499	0.0	1.0	1.0
+chr2	442723	0.0	1.0	1.0
+chr2	442742	0.0	1.0	1.0
+chr2	442744	0.0	1.0	1.0
+chr2	442786	1.0	0.0	1.0
+chr2	442787	1.0	0.0	1.0
+chr2	442794	1.0	0.0	1.0
+chr2	442808	1.0	0.0	1.0
+chr2	443055	1.0	0.0	1.0
+chr2	443145	2.0	0.0	2.0
+chr2	443433	1.0	0.0	1.0
+chr2	443572	2.0	0.0	2.0
+chr2	444225	0.0	1.0	1.0
+chr2	444371	0.0	2.0	2.0
+chr2	444529	1.0	0.0	1.0
+chr2	444551	1.0	0.0	1.0
+chr2	444607	0.0	1.0	1.0
+chr2	444614	0.0	1.0	1.0
+chr2	444656	0.0	1.0	1.0
+chr2	444680	0.0	1.0	1.0
+chr2	444691	0.0	1.0	1.0
+chr2	444693	0.0	1.0	1.0
+chr2	444706	1.0	0.0	1.0
+chr2	444713	0.0	1.0	1.0
+chr2	444723	1.0	0.0	1.0
+chr2	444983	1.0	0.0	1.0
+chr2	444991	1.0	0.0	1.0
+chr2	444994	2.0	0.0	2.0
+chr2	445003	0.0	1.0	1.0
+chr2	445005	0.0	1.0	1.0
+chr2	445008	0.0	1.0	1.0
+chr2	445020	0.0	1.0	1.0
+chr2	445061	0.0	1.0	1.0
+chr2	445118	0.0	1.0	1.0
+chr2	445130	1.0	0.0	1.0
+chr2	445175	0.0	1.0	1.0
+chr2	445205	2.0	0.0	2.0
+chr2	445326	1.0	0.0	1.0
+chr2	445358	0.0	1.0	1.0
+chr2	445362	1.0	0.0	1.0
+chr2	446052	0.0	2.0	2.0
+chr2	446056	1.0	0.0	1.0
+chr2	446823	0.0	1.0	1.0
+chr2	446989	1.0	0.0	1.0
+chr2	446990	0.0	1.0	1.0
+chr2	447131	0.0	1.0	1.0
+chr2	447163	3.0	0.0	3.0
+chr2	447176	1.0	0.0	1.0
+chr2	447184	1.0	0.0	1.0
+chr2	447286	0.0	1.0	1.0
+chr2	447292	1.0	0.0	1.0
+chr2	447300	0.0	1.0	1.0
+chr2	447309	0.0	1.0	1.0
+chr2	447316	0.0	1.0	1.0
+chr2	447318	1.0	0.0	1.0
+chr2	447319	6.0	0.0	6.0
+chr2	447321	0.0	2.0	2.0
+chr2	447325	1.0	0.0	1.0
+chr2	447329	0.0	6.0	6.0
+chr2	447330	0.0	5.0	5.0
+chr2	447331	3.0	1.0	4.0
+chr2	447333	0.0	1.0	1.0
+chr2	447334	1.0	0.0	1.0
+chr2	447336	2.0	0.0	2.0
+chr2	447337	0.0	1.0	1.0
+chr2	447340	1.0	0.0	1.0
+chr2	447342	0.0	1.0	1.0
+chr2	447492	1.0	0.0	1.0
+chr2	447550	1.0	0.0	1.0
+chr2	447557	0.0	1.0	1.0
+chr2	447581	0.0	1.0	1.0
+chr2	447582	0.0	1.0	1.0
+chr2	447583	1.0	0.0	1.0
+chr2	447587	0.0	2.0	2.0
+chr2	447592	2.0	1.0	3.0
+chr2	447594	1.0	0.0	1.0
+chr2	447598	0.0	1.0	1.0
+chr2	447600	4.0	0.0	4.0
+chr2	447602	0.0	1.0	1.0
+chr2	447606	0.0	1.0	1.0
+chr2	447607	0.0	2.0	2.0
+chr2	447610	2.0	0.0	2.0
+chr2	447611	0.0	3.0	3.0
+chr2	447623	0.0	2.0	2.0
+chr2	447629	1.0	0.0	1.0
+chr2	447637	0.0	1.0	1.0
+chr2	447730	0.0	1.0	1.0
+chr2	447737	0.0	1.0	1.0
+chr2	447749	4.0	0.0	4.0
+chr2	447752	3.0	2.0	5.0
+chr2	447753	5.0	0.0	5.0
+chr2	447762	1.0	0.0	1.0
+chr2	447766	1.0	0.0	1.0
+chr2	447781	0.0	1.0	1.0
+chr2	447785	2.0	0.0	2.0
+chr2	447788	0.0	1.0	1.0
+chr2	447793	1.0	0.0	1.0
+chr2	447799	1.0	0.0	1.0
+chr2	447808	0.0	1.0	1.0
+chr2	447909	3.0	0.0	3.0
+chr2	447937	1.0	0.0	1.0
+chr2	447954	0.0	1.0	1.0
+chr2	448067	0.0	2.0	2.0
+chr2	448430	1.0	0.0	1.0
+chr2	448448	0.0	1.0	1.0
+chr2	448555	0.0	3.0	3.0
+chr2	448580	1.0	0.0	1.0
+chr2	448588	0.0	1.0	1.0
+chr2	448903	1.0	0.0	1.0
+chr2	448906	0.0	1.0	1.0
+chr2	448907	0.0	1.0	1.0
+chr2	448944	2.0	0.0	2.0
+chr2	449073	0.0	1.0	1.0
+chr2	449086	0.0	2.0	2.0
+chr2	449103	0.0	1.0	1.0
+chr2	449113	2.0	0.0	2.0
+chr2	449233	0.0	1.0	1.0
+chr2	449242	0.0	1.0	1.0
+chr2	449244	1.0	0.0	1.0
+chr2	449245	1.0	0.0	1.0
+chr2	449247	0.0	1.0	1.0
+chr2	449249	0.0	1.0	1.0
+chr2	449250	2.0	0.0	2.0
+chr2	449251	2.0	1.0	3.0
+chr2	449254	2.0	1.0	3.0
+chr2	449255	1.0	2.0	3.0
+chr2	449256	1.0	0.0	1.0
+chr2	449257	2.0	0.0	2.0
+chr2	449259	1.0	0.0	1.0
+chr2	449260	0.0	2.0	2.0
+chr2	449265	0.0	2.0	2.0
+chr2	449267	0.0	1.0	1.0
+chr2	449273	2.0	0.0	2.0
+chr2	449274	0.0	1.0	1.0
+chr2	449277	1.0	0.0	1.0
+chr2	449278	1.0	1.0	2.0
+chr2	449285	0.0	2.0	2.0
+chr2	449295	2.0	0.0	2.0
+chr2	449304	1.0	0.0	1.0
+chr2	449311	0.0	1.0	1.0
+chr2	449512	0.0	1.0	1.0
+chr2	449542	1.0	0.0	1.0
+chr2	449568	0.0	1.0	1.0
+chr2	449588	0.0	1.0	1.0
+chr2	449722	0.0	1.0	1.0
+chr2	449730	0.0	1.0	1.0
+chr2	449737	2.0	0.0	2.0
+chr2	449739	1.0	0.0	1.0
+chr2	449751	0.0	1.0	1.0
+chr2	449884	0.0	1.0	1.0
+chr2	449901	1.0	0.0	1.0
+chr2	449939	0.0	1.0	1.0
+chr2	449971	1.0	0.0	1.0
+chr2	450048	0.0	1.0	1.0
+chr2	450101	1.0	0.0	1.0
+chr2	450130	0.0	1.0	1.0
+chr2	450365	2.0	0.0	2.0
+chr2	450384	0.0	1.0	1.0
+chr2	450451	0.0	1.0	1.0
+chr2	450506	1.0	0.0	1.0
+chr2	450970	0.0	1.0	1.0
+chr2	451022	0.0	1.0	1.0
+chr2	451185	0.0	1.0	1.0
+chr2	451383	0.0	1.0	1.0
+chr2	451677	1.0	0.0	1.0
+chr2	451880	1.0	0.0	1.0
+chr2	451904	1.0	0.0	1.0
+chr2	451906	0.0	1.0	1.0
+chr2	451922	1.0	0.0	1.0
+chr2	451924	0.0	1.0	1.0
+chr2	452059	1.0	0.0	1.0
+chr2	452088	0.0	1.0	1.0
+chr2	452091	1.0	0.0	1.0
+chr2	452643	2.0	1.0	3.0
+chr2	452648	1.0	0.0	1.0
+chr2	452656	1.0	0.0	1.0
+chr2	452660	1.0	2.0	3.0
+chr2	452661	1.0	0.0	1.0
+chr2	452686	1.0	0.0	1.0
+chr2	452927	0.0	1.0	1.0
+chr2	453120	1.0	0.0	1.0
+chr2	453176	0.0	1.0	1.0
+chr2	453182	0.0	1.0	1.0
+chr2	453185	0.0	1.0	1.0
+chr2	453427	0.0	1.0	1.0
+chr2	453617	0.0	1.0	1.0
+chr2	453623	0.0	1.0	1.0
+chr2	453630	0.0	1.0	1.0
+chr2	453642	0.0	3.0	3.0
+chr2	453645	1.0	0.0	1.0
+chr2	453658	2.0	0.0	2.0
+chr2	453722	1.0	0.0	1.0
+chr2	453789	0.0	1.0	1.0
+chr2	453910	0.0	1.0	1.0
+chr2	453942	0.0	1.0	1.0
+chr2	453952	1.0	0.0	1.0
+chr2	453973	1.0	0.0	1.0
+chr2	454023	1.0	0.0	1.0
+chr2	454054	0.0	1.0	1.0
+chr2	454080	0.0	1.0	1.0
+chr2	454171	1.0	0.0	1.0
+chr2	454185	1.0	0.0	1.0
+chr2	454243	0.0	1.0	1.0
+chr2	454347	0.0	1.0	1.0
+chr2	454360	1.0	0.0	1.0
+chr2	454500	0.0	1.0	1.0
+chr2	454503	0.0	1.0	1.0
+chr2	454511	1.0	0.0	1.0
+chr2	454517	1.0	1.0	2.0
+chr2	454518	2.0	0.0	2.0
+chr2	454521	0.0	1.0	1.0
+chr2	454523	0.0	4.0	4.0
+chr2	454524	3.0	0.0	3.0
+chr2	454528	1.0	0.0	1.0
+chr2	454530	1.0	0.0	1.0
+chr2	454531	0.0	1.0	1.0
+chr2	454532	0.0	1.0	1.0
+chr2	454533	1.0	0.0	1.0
+chr2	454535	1.0	0.0	1.0
+chr2	454536	0.0	4.0	4.0
+chr2	454538	0.0	2.0	2.0
+chr2	454540	3.0	0.0	3.0
+chr2	454541	1.0	0.0	1.0
+chr2	454548	1.0	0.0	1.0
+chr2	454556	0.0	1.0	1.0
+chr2	454571	0.0	1.0	1.0
+chr2	454622	0.0	1.0	1.0
+chr2	454811	3.0	0.0	3.0
+chr2	454817	0.0	1.0	1.0
+chr2	454818	6.0	0.0	6.0
+chr2	454824	0.0	1.0	1.0
+chr2	454826	2.0	0.0	2.0
+chr2	454828	0.0	1.0	1.0
+chr2	454831	1.0	0.0	1.0
+chr2	454833	0.0	1.0	1.0
+chr2	454839	1.0	0.0	1.0
+chr2	454841	0.0	1.0	1.0
+chr2	454842	0.0	1.0	1.0
+chr2	454843	0.0	1.0	1.0
+chr2	454844	3.0	0.0	3.0
+chr2	454850	1.0	0.0	1.0
+chr2	454998	0.0	2.0	2.0
+chr2	455013	0.0	1.0	1.0
+chr2	455163	1.0	0.0	1.0
+chr2	455476	0.0	1.0	1.0
+chr2	455482	0.0	1.0	1.0
+chr2	455568	1.0	0.0	1.0
+chr2	455630	1.0	0.0	1.0
+chr2	455647	1.0	0.0	1.0
+chr2	455665	1.0	0.0	1.0
+chr2	455666	0.0	1.0	1.0
+chr2	455812	1.0	0.0	1.0
+chr2	455967	1.0	0.0	1.0
+chr2	456037	0.0	1.0	1.0
+chr2	456084	0.0	1.0	1.0
+chr2	456145	1.0	0.0	1.0
+chr2	456167	0.0	1.0	1.0
+chr2	456186	1.0	0.0	1.0
+chr2	456357	0.0	1.0	1.0
+chr2	456474	0.0	1.0	1.0
+chr2	456658	0.0	1.0	1.0
+chr2	457023	1.0	0.0	1.0
+chr2	457225	0.0	1.0	1.0
+chr2	457234	1.0	0.0	1.0
+chr2	457358	1.0	0.0	1.0
+chr2	457383	1.0	0.0	1.0
+chr2	457393	0.0	1.0	1.0
+chr2	457528	0.0	1.0	1.0
+chr2	457543	1.0	0.0	1.0
+chr2	457545	1.0	0.0	1.0
+chr2	457574	0.0	1.0	1.0
+chr2	457578	1.0	0.0	1.0
+chr2	458068	1.0	0.0	1.0
+chr2	458108	0.0	1.0	1.0
+chr2	458165	0.0	1.0	1.0
+chr2	458192	1.0	0.0	1.0
+chr2	458196	0.0	1.0	1.0
+chr2	458198	2.0	0.0	2.0
+chr2	458321	1.0	0.0	1.0
+chr2	458339	1.0	0.0	1.0
+chr2	458349	1.0	0.0	1.0
+chr2	458374	0.0	1.0	1.0
+chr2	458394	2.0	0.0	2.0
+chr2	458395	1.0	0.0	1.0
+chr2	458606	0.0	1.0	1.0
+chr2	458615	0.0	3.0	3.0
+chr2	458618	1.0	0.0	1.0
+chr2	458622	1.0	0.0	1.0
+chr2	458623	0.0	1.0	1.0
+chr2	458627	0.0	1.0	1.0
+chr2	458628	0.0	1.0	1.0
+chr2	458644	0.0	1.0	1.0
+chr2	458655	0.0	1.0	1.0
+chr2	458665	0.0	1.0	1.0
+chr2	458669	0.0	1.0	1.0
+chr2	458672	0.0	1.0	1.0
+chr2	458686	1.0	0.0	1.0
+chr2	458705	1.0	0.0	1.0
+chr2	458826	0.0	1.0	1.0
+chr2	458827	0.0	1.0	1.0
+chr2	458834	1.0	0.0	1.0
+chr2	458847	0.0	1.0	1.0
+chr2	458848	0.0	1.0	1.0
+chr2	458850	1.0	0.0	1.0
+chr2	458852	1.0	1.0	2.0
+chr2	458853	0.0	2.0	2.0
+chr2	458861	0.0	1.0	1.0
+chr2	459019	2.0	0.0	2.0
+chr2	459022	0.0	1.0	1.0
+chr2	459023	1.0	0.0	1.0
+chr2	459034	2.0	1.0	3.0
+chr2	459045	0.0	1.0	1.0
+chr2	459049	0.0	2.0	2.0
+chr2	459067	0.0	1.0	1.0
+chr2	459184	0.0	1.0	1.0
+chr2	459304	0.0	1.0	1.0
+chr2	459317	0.0	1.0	1.0
+chr2	459333	1.0	0.0	1.0
+chr2	459361	1.0	0.0	1.0
+chr2	460009	0.0	1.0	1.0
+chr2	460138	1.0	0.0	1.0
+chr2	460162	0.0	1.0	1.0
+chr2	460180	1.0	0.0	1.0
+chr2	460288	1.0	0.0	1.0
+chr2	460419	0.0	1.0	1.0
+chr2	460442	1.0	0.0	1.0
+chr2	460444	0.0	1.0	1.0
+chr2	460466	3.0	0.0	3.0
+chr2	460485	1.0	0.0	1.0
+chr2	460501	0.0	1.0	1.0
+chr2	460631	0.0	1.0	1.0
+chr2	460632	1.0	0.0	1.0
+chr2	460643	0.0	1.0	1.0
+chr2	460662	0.0	1.0	1.0
+chr2	460665	0.0	1.0	1.0
+chr2	460666	0.0	1.0	1.0
+chr2	460681	1.0	0.0	1.0
+chr2	460684	1.0	0.0	1.0
+chr2	460707	0.0	1.0	1.0
+chr2	460713	0.0	1.0	1.0
+chr2	460757	1.0	0.0	1.0
+chr2	460834	0.0	1.0	1.0
+chr2	460836	1.0	0.0	1.0
+chr2	460840	1.0	0.0	1.0
+chr2	460845	1.0	0.0	1.0
+chr2	460851	0.0	1.0	1.0
+chr2	460854	1.0	0.0	1.0
+chr2	460859	0.0	2.0	2.0
+chr2	460869	0.0	1.0	1.0
+chr2	460881	1.0	1.0	2.0
+chr2	461015	1.0	0.0	1.0
+chr2	461018	1.0	0.0	1.0
+chr2	461023	1.0	0.0	1.0
+chr2	461086	1.0	0.0	1.0
+chr2	461179	1.0	0.0	1.0
+chr2	461206	0.0	1.0	1.0
+chr2	461207	1.0	0.0	1.0
+chr2	461514	0.0	1.0	1.0
+chr2	461528	1.0	0.0	1.0
+chr2	461529	1.0	0.0	1.0
+chr2	461544	0.0	1.0	1.0
+chr2	461546	0.0	1.0	1.0
+chr2	461547	1.0	1.0	2.0
+chr2	461696	0.0	1.0	1.0
+chr2	461698	1.0	0.0	1.0
+chr2	461703	2.0	0.0	2.0
+chr2	461708	0.0	1.0	1.0
+chr2	461718	0.0	1.0	1.0
+chr2	461737	0.0	1.0	1.0
+chr2	461865	1.0	0.0	1.0
+chr2	461876	0.0	3.0	3.0
+chr2	461899	0.0	2.0	2.0
+chr2	461906	1.0	0.0	1.0
+chr2	461907	1.0	0.0	1.0
+chr2	461908	0.0	1.0	1.0
+chr2	461931	0.0	1.0	1.0
+chr2	461940	0.0	1.0	1.0
+chr2	462060	1.0	0.0	1.0
+chr2	462100	0.0	1.0	1.0
+chr2	462117	1.0	0.0	1.0
+chr2	462120	0.0	1.0	1.0
+chr2	462123	0.0	1.0	1.0
+chr2	462132	1.0	0.0	1.0
+chr2	462138	0.0	1.0	1.0
+chr2	462139	1.0	0.0	1.0
+chr2	462145	2.0	0.0	2.0
+chr2	462146	0.0	1.0	1.0
+chr2	462151	0.0	1.0	1.0
+chr2	462155	2.0	0.0	2.0
+chr2	462157	1.0	0.0	1.0
+chr2	462158	0.0	4.0	4.0
+chr2	462160	0.0	1.0	1.0
+chr2	462165	1.0	0.0	1.0
+chr2	462166	3.0	0.0	3.0
+chr2	462167	0.0	1.0	1.0
+chr2	462168	0.0	1.0	1.0
+chr2	462169	0.0	1.0	1.0
+chr2	462175	0.0	2.0	2.0
+chr2	462178	1.0	0.0	1.0
+chr2	462260	1.0	0.0	1.0
+chr2	462318	0.0	1.0	1.0
+chr2	462333	1.0	0.0	1.0
+chr2	462341	0.0	1.0	1.0
+chr2	462353	0.0	1.0	1.0
+chr2	462375	1.0	0.0	1.0
+chr2	462451	0.0	1.0	1.0
+chr2	463124	1.0	0.0	1.0
+chr2	463141	2.0	0.0	2.0
+chr2	464100	0.0	1.0	1.0
+chr2	464104	0.0	1.0	1.0
+chr2	464124	0.0	1.0	1.0
+chr2	464160	0.0	1.0	1.0
+chr2	464172	0.0	1.0	1.0
+chr2	464178	0.0	1.0	1.0
+chr2	464190	0.0	1.0	1.0
+chr2	464214	0.0	1.0	1.0
+chr2	465237	0.0	1.0	1.0
+chr2	465345	0.0	1.0	1.0
+chr2	465687	1.0	0.0	1.0
+chr2	465698	0.0	1.0	1.0
+chr2	465726	0.0	1.0	1.0
+chr2	465856	0.0	1.0	1.0
+chr2	465859	1.0	0.0	1.0
+chr2	465873	0.0	1.0	1.0
+chr2	465894	1.0	0.0	1.0
+chr2	465901	0.0	1.0	1.0
+chr2	465924	0.0	1.0	1.0
+chr2	465925	0.0	1.0	1.0
+chr2	465966	1.0	0.0	1.0
+chr2	466650	0.0	1.0	1.0
+chr2	466687	1.0	0.0	1.0
+chr2	466703	0.0	1.0	1.0
+chr2	466818	1.0	0.0	1.0
+chr2	466874	0.0	1.0	1.0
+chr2	466880	0.0	1.0	1.0
+chr2	467129	0.0	1.0	1.0
+chr2	467132	1.0	0.0	1.0
+chr2	467181	0.0	1.0	1.0
+chr2	467186	0.0	1.0	1.0
+chr2	467189	1.0	0.0	1.0
+chr2	467196	1.0	0.0	1.0
+chr2	467197	1.0	0.0	1.0
+chr2	467198	3.0	0.0	3.0
+chr2	467200	0.0	1.0	1.0
+chr2	467201	1.0	0.0	1.0
+chr2	467204	0.0	1.0	1.0
+chr2	467205	0.0	1.0	1.0
+chr2	467207	1.0	0.0	1.0
+chr2	467208	1.0	0.0	1.0
+chr2	467210	4.0	0.0	4.0
+chr2	467214	0.0	2.0	2.0
+chr2	467215	0.0	3.0	3.0
+chr2	467216	0.0	1.0	1.0
+chr2	467217	0.0	1.0	1.0
+chr2	467219	0.0	1.0	1.0
+chr2	467220	1.0	0.0	1.0
+chr2	467221	3.0	0.0	3.0
+chr2	467222	3.0	4.0	7.0
+chr2	467223	0.0	1.0	1.0
+chr2	467224	0.0	5.0	5.0
+chr2	467225	0.0	3.0	3.0
+chr2	467230	5.0	0.0	5.0
+chr2	467231	7.0	0.0	7.0
+chr2	467255	2.0	0.0	2.0
+chr2	467368	0.0	1.0	1.0
+chr2	467374	0.0	2.0	2.0
+chr2	467380	4.0	0.0	4.0
+chr2	467387	2.0	0.0	2.0
+chr2	467392	0.0	1.0	1.0
+chr2	467398	1.0	0.0	1.0
+chr2	467399	1.0	0.0	1.0
+chr2	467401	1.0	0.0	1.0
+chr2	467402	0.0	1.0	1.0
+chr2	467469	2.0	0.0	2.0
+chr2	467554	1.0	0.0	1.0
+chr2	467565	0.0	1.0	1.0
+chr2	467570	0.0	1.0	1.0
+chr2	467580	0.0	1.0	1.0
+chr2	467739	1.0	0.0	1.0
+chr2	467743	1.0	0.0	1.0
+chr2	467861	0.0	1.0	1.0
+chr2	467904	0.0	2.0	2.0
+chr2	468052	1.0	0.0	1.0
+chr2	468054	0.0	1.0	1.0
+chr2	468208	1.0	0.0	1.0
+chr2	468266	2.0	0.0	2.0
+chr2	468567	0.0	1.0	1.0
+chr2	468881	2.0	0.0	2.0
+chr2	468965	1.0	0.0	1.0
+chr2	469077	2.0	0.0	2.0
+chr2	469112	0.0	1.0	1.0
+chr2	469302	0.0	1.0	1.0
+chr2	469306	1.0	0.0	1.0
+chr2	469323	0.0	1.0	1.0
+chr2	469492	1.0	0.0	1.0
+chr2	469618	0.0	1.0	1.0
+chr2	470071	0.0	1.0	1.0
+chr2	470237	0.0	1.0	1.0
+chr2	470736	1.0	0.0	1.0
+chr2	471297	1.0	0.0	1.0
+chr2	471455	1.0	0.0	1.0
+chr2	471603	1.0	0.0	1.0
+chr2	471614	0.0	1.0	1.0
+chr2	472501	1.0	0.0	1.0
+chr2	472733	0.0	1.0	1.0
+chr2	472984	0.0	1.0	1.0
+chr2	473013	0.0	2.0	2.0
+chr2	473317	0.0	1.0	1.0
+chr2	473477	1.0	0.0	1.0
+chr2	473493	1.0	0.0	1.0
+chr2	473776	0.0	1.0	1.0
+chr2	473796	2.0	0.0	2.0
+chr2	473801	2.0	0.0	2.0
+chr2	473819	0.0	3.0	3.0
+chr2	473820	1.0	0.0	1.0
+chr2	473851	2.0	0.0	2.0
+chr2	474011	0.0	1.0	1.0
+chr2	474330	0.0	1.0	1.0
+chr2	474335	1.0	0.0	1.0
+chr2	474341	1.0	1.0	2.0
+chr2	474342	1.0	0.0	1.0
+chr2	474345	1.0	0.0	1.0
+chr2	474346	1.0	0.0	1.0
+chr2	474347	0.0	1.0	1.0
+chr2	474354	0.0	1.0	1.0
+chr2	474356	0.0	2.0	2.0
+chr2	474359	0.0	1.0	1.0
+chr2	474360	0.0	2.0	2.0
+chr2	474396	1.0	0.0	1.0
+chr2	474503	0.0	1.0	1.0
+chr2	474513	1.0	0.0	1.0
+chr2	474544	0.0	1.0	1.0
+chr2	474555	0.0	2.0	2.0
+chr2	474577	1.0	0.0	1.0
+chr2	474597	1.0	0.0	1.0
+chr2	474654	0.0	1.0	1.0
+chr2	474788	0.0	1.0	1.0
+chr2	474810	0.0	1.0	1.0
+chr2	474838	1.0	0.0	1.0
+chr2	474841	0.0	1.0	1.0
+chr2	474845	1.0	1.0	2.0
+chr2	474864	0.0	1.0	1.0
+chr2	474904	0.0	1.0	1.0
+chr2	474930	1.0	0.0	1.0
+chr2	474994	0.0	1.0	1.0
+chr2	475012	1.0	0.0	1.0
+chr2	475029	1.0	0.0	1.0
+chr2	475066	1.0	0.0	1.0
+chr2	475124	1.0	0.0	1.0
+chr2	475141	1.0	0.0	1.0
+chr2	475164	1.0	0.0	1.0
+chr2	475235	1.0	0.0	1.0
+chr2	475354	0.0	1.0	1.0
+chr2	475403	0.0	1.0	1.0
+chr2	475529	0.0	1.0	1.0
+chr2	475621	1.0	0.0	1.0
+chr2	475677	0.0	1.0	1.0
+chr2	475702	0.0	1.0	1.0
+chr2	475725	1.0	0.0	1.0
+chr2	475730	0.0	1.0	1.0
+chr2	475791	0.0	1.0	1.0
+chr2	475823	0.0	1.0	1.0
+chr2	475897	1.0	0.0	1.0
+chr2	475932	0.0	1.0	1.0
+chr2	475977	0.0	1.0	1.0
+chr2	475987	0.0	1.0	1.0
+chr2	476111	0.0	1.0	1.0
+chr2	476160	0.0	1.0	1.0
+chr2	476247	1.0	0.0	1.0
+chr2	476269	1.0	0.0	1.0
+chr2	476270	0.0	1.0	1.0
+chr2	476276	0.0	1.0	1.0
+chr2	476279	1.0	0.0	1.0
+chr2	476282	1.0	0.0	1.0
+chr2	476463	2.0	0.0	2.0
+chr2	476469	1.0	0.0	1.0
+chr2	476481	1.0	0.0	1.0
+chr2	476593	0.0	1.0	1.0
+chr2	476599	1.0	1.0	2.0
+chr2	476612	1.0	0.0	1.0
+chr2	476613	3.0	0.0	3.0
+chr2	476614	0.0	7.0	7.0
+chr2	476622	5.0	0.0	5.0
+chr2	476623	1.0	0.0	1.0
+chr2	476624	2.0	0.0	2.0
+chr2	476632	2.0	0.0	2.0
+chr2	476633	1.0	0.0	1.0
+chr2	476642	0.0	1.0	1.0
+chr2	476647	1.0	0.0	1.0
+chr2	476648	2.0	0.0	2.0
+chr2	476655	1.0	10.0	11.0
+chr2	476656	0.0	6.0	6.0
+chr2	476667	1.0	0.0	1.0
+chr2	476669	2.0	0.0	2.0
+chr2	476690	1.0	0.0	1.0
+chr2	476846	0.0	1.0	1.0
+chr2	476899	1.0	0.0	1.0
+chr2	477690	0.0	1.0	1.0
+chr2	478313	1.0	0.0	1.0
+chr2	478448	0.0	1.0	1.0
+chr2	478766	0.0	1.0	1.0
+chr2	478899	0.0	1.0	1.0
+chr2	479143	0.0	1.0	1.0
+chr2	479315	2.0	0.0	2.0
+chr2	479331	1.0	2.0	3.0
+chr2	479338	0.0	1.0	1.0
+chr2	479341	0.0	1.0	1.0
+chr2	479345	0.0	1.0	1.0
+chr2	479346	0.0	1.0	1.0
+chr2	479353	1.0	0.0	1.0
+chr2	479533	0.0	1.0	1.0
+chr2	479556	0.0	1.0	1.0
+chr2	479660	0.0	1.0	1.0
+chr2	479664	1.0	0.0	1.0
+chr2	479665	0.0	1.0	1.0
+chr2	479671	1.0	0.0	1.0
+chr2	479685	1.0	0.0	1.0
+chr2	479719	0.0	1.0	1.0
+chr2	479864	1.0	0.0	1.0
+chr2	479905	1.0	0.0	1.0
+chr2	479917	1.0	0.0	1.0
+chr2	480077	1.0	0.0	1.0
+chr2	480163	0.0	1.0	1.0
+chr2	480203	0.0	1.0	1.0
+chr2	480231	1.0	0.0	1.0
+chr2	480777	1.0	1.0	2.0
+chr2	480784	0.0	1.0	1.0
+chr2	480792	0.0	1.0	1.0
+chr2	480878	0.0	1.0	1.0
+chr2	480895	0.0	1.0	1.0
+chr2	480899	0.0	1.0	1.0
+chr2	480916	1.0	0.0	1.0
+chr2	480919	0.0	1.0	1.0
+chr2	480926	0.0	1.0	1.0
+chr2	480933	1.0	0.0	1.0
+chr2	480934	1.0	0.0	1.0
+chr2	480935	0.0	1.0	1.0
+chr2	480943	0.0	1.0	1.0
+chr2	480945	2.0	0.0	2.0
+chr2	480946	1.0	0.0	1.0
+chr2	480947	1.0	0.0	1.0
+chr2	480948	0.0	1.0	1.0
+chr2	480952	0.0	2.0	2.0
+chr2	480953	0.0	1.0	1.0
+chr2	480954	1.0	0.0	1.0
+chr2	480955	0.0	1.0	1.0
+chr2	480956	1.0	1.0	2.0
+chr2	480957	1.0	0.0	1.0
+chr2	480967	1.0	0.0	1.0
+chr2	480993	1.0	0.0	1.0
+chr2	480999	1.0	0.0	1.0
+chr2	481221	1.0	0.0	1.0
+chr2	481373	1.0	0.0	1.0
+chr2	481468	0.0	1.0	1.0
+chr2	481594	0.0	1.0	1.0
+chr2	481933	1.0	0.0	1.0
+chr2	482534	1.0	0.0	1.0
+chr2	482791	1.0	0.0	1.0
+chr2	482908	0.0	1.0	1.0
+chr2	482979	1.0	0.0	1.0
+chr2	483086	0.0	1.0	1.0
+chr2	483115	0.0	1.0	1.0
+chr2	483137	1.0	0.0	1.0
+chr2	483266	0.0	1.0	1.0
+chr2	483306	0.0	1.0	1.0
+chr2	483316	0.0	1.0	1.0
+chr2	483498	1.0	0.0	1.0
+chr2	483698	1.0	0.0	1.0
+chr2	483699	0.0	1.0	1.0
+chr2	483740	1.0	0.0	1.0
+chr2	483744	0.0	2.0	2.0
+chr2	483745	0.0	1.0	1.0
+chr2	483750	1.0	0.0	1.0
+chr2	483756	0.0	1.0	1.0
+chr2	483762	1.0	0.0	1.0
+chr2	483766	1.0	1.0	2.0
+chr2	483774	1.0	0.0	1.0
+chr2	483784	0.0	1.0	1.0
+chr2	483798	1.0	0.0	1.0
+chr2	483907	0.0	1.0	1.0
+chr2	483960	1.0	0.0	1.0
+chr2	484141	1.0	0.0	1.0
+chr2	484183	0.0	2.0	2.0
+chr2	484193	0.0	1.0	1.0
+chr2	484197	1.0	0.0	1.0
+chr2	484237	0.0	2.0	2.0
+chr2	484285	0.0	1.0	1.0
+chr2	484300	0.0	2.0	2.0
+chr2	484326	0.0	1.0	1.0
+chr2	484451	2.0	0.0	2.0
+chr2	484460	0.0	2.0	2.0
+chr2	484469	0.0	1.0	1.0
+chr2	484470	2.0	0.0	2.0
+chr2	484476	1.0	1.0	2.0
+chr2	484480	0.0	4.0	4.0
+chr2	484481	1.0	3.0	4.0
+chr2	484482	2.0	1.0	3.0
+chr2	484483	5.0	0.0	5.0
+chr2	484484	5.0	1.0	6.0
+chr2	484485	0.0	5.0	5.0
+chr2	484489	0.0	4.0	4.0
+chr2	484490	1.0	0.0	1.0
+chr2	484491	0.0	1.0	1.0
+chr2	484494	1.0	0.0	1.0
+chr2	484496	5.0	4.0	9.0
+chr2	484497	0.0	2.0	2.0
+chr2	484505	1.0	0.0	1.0
+chr2	484514	2.0	0.0	2.0
+chr2	484524	1.0	0.0	1.0
+chr2	484702	0.0	1.0	1.0
+chr2	484738	0.0	1.0	1.0
+chr2	484739	0.0	1.0	1.0
+chr2	484744	1.0	0.0	1.0
+chr2	484761	1.0	0.0	1.0
+chr2	484762	1.0	0.0	1.0
+chr2	484765	1.0	0.0	1.0
+chr2	484770	1.0	3.0	4.0
+chr2	484777	0.0	1.0	1.0
+chr2	484798	0.0	1.0	1.0
+chr2	484800	2.0	0.0	2.0
+chr2	484801	0.0	1.0	1.0
+chr2	484810	1.0	0.0	1.0
+chr2	484814	0.0	1.0	1.0
+chr2	484826	0.0	1.0	1.0
+chr2	484919	0.0	1.0	1.0
+chr2	484920	1.0	1.0	2.0
+chr2	484926	1.0	0.0	1.0
+chr2	484927	0.0	2.0	2.0
+chr2	484946	0.0	3.0	3.0
+chr2	484950	0.0	1.0	1.0
+chr2	484963	0.0	1.0	1.0
+chr2	485080	1.0	0.0	1.0
+chr2	485102	1.0	0.0	1.0
+chr2	485111	0.0	1.0	1.0
+chr2	485234	0.0	1.0	1.0
+chr2	485386	1.0	0.0	1.0
+chr2	485862	0.0	1.0	1.0
+chr2	486037	1.0	0.0	1.0
+chr2	486047	1.0	0.0	1.0
+chr2	486342	0.0	1.0	1.0
+chr2	486358	0.0	1.0	1.0
+chr2	486378	1.0	0.0	1.0
+chr2	486470	1.0	0.0	1.0
+chr2	486481	0.0	1.0	1.0
+chr2	486492	0.0	1.0	1.0
+chr2	486495	2.0	0.0	2.0
+chr2	486498	0.0	1.0	1.0
+chr2	486506	0.0	1.0	1.0
+chr2	486508	1.0	0.0	1.0
+chr2	486525	0.0	1.0	1.0
+chr2	486526	0.0	1.0	1.0
+chr2	486574	0.0	2.0	2.0
+chr2	486643	1.0	0.0	1.0
+chr2	486644	0.0	1.0	1.0
+chr2	486649	0.0	2.0	2.0
+chr2	486650	0.0	1.0	1.0
+chr2	486684	0.0	1.0	1.0
+chr2	486690	1.0	0.0	1.0
+chr2	486693	2.0	0.0	2.0
+chr2	486700	0.0	1.0	1.0
+chr2	486704	0.0	2.0	2.0
+chr2	486708	0.0	1.0	1.0
+chr2	486710	0.0	1.0	1.0
+chr2	486714	1.0	0.0	1.0
+chr2	487147	1.0	0.0	1.0
+chr2	487298	0.0	1.0	1.0
+chr2	487594	1.0	0.0	1.0
+chr2	487687	1.0	0.0	1.0
+chr2	487696	0.0	1.0	1.0
+chr2	487819	1.0	0.0	1.0
+chr2	487820	1.0	0.0	1.0
+chr2	487832	1.0	0.0	1.0
+chr2	488092	1.0	0.0	1.0
+chr2	488166	1.0	0.0	1.0
+chr2	488177	0.0	1.0	1.0
+chr2	488309	0.0	1.0	1.0
+chr2	488324	1.0	0.0	1.0
+chr2	488329	2.0	0.0	2.0
+chr2	488344	0.0	1.0	1.0
+chr2	488353	1.0	0.0	1.0
+chr2	488417	0.0	1.0	1.0
+chr2	488462	0.0	1.0	1.0
+chr2	488478	0.0	2.0	2.0
+chr2	488487	0.0	1.0	1.0
+chr2	488489	0.0	1.0	1.0
+chr2	488491	1.0	0.0	1.0
+chr2	488498	0.0	1.0	1.0
+chr2	488502	3.0	0.0	3.0
+chr2	488506	0.0	1.0	1.0
+chr2	488507	0.0	1.0	1.0
+chr2	488509	2.0	5.0	7.0
+chr2	488511	1.0	0.0	1.0
+chr2	488512	3.0	0.0	3.0
+chr2	488515	0.0	1.0	1.0
+chr2	488516	0.0	2.0	2.0
+chr2	488517	0.0	1.0	1.0
+chr2	488518	0.0	2.0	2.0
+chr2	488519	0.0	2.0	2.0
+chr2	488525	1.0	0.0	1.0
+chr2	488526	0.0	4.0	4.0
+chr2	488533	2.0	0.0	2.0
+chr2	488539	4.0	0.0	4.0
+chr2	488762	0.0	1.0	1.0
+chr2	488788	1.0	0.0	1.0
+chr2	488794	0.0	1.0	1.0
+chr2	488795	1.0	0.0	1.0
+chr2	488796	0.0	2.0	2.0
+chr2	488798	2.0	0.0	2.0
+chr2	488822	0.0	1.0	1.0
+chr2	488909	0.0	1.0	1.0
+chr2	488987	1.0	0.0	1.0
+chr2	489132	1.0	0.0	1.0
+chr2	489347	1.0	0.0	1.0
+chr2	489635	0.0	1.0	1.0
+chr2	489670	1.0	0.0	1.0
+chr2	489678	0.0	1.0	1.0
+chr2	489778	0.0	1.0	1.0
+chr2	489847	1.0	0.0	1.0
+chr2	490031	1.0	0.0	1.0
+chr2	490116	0.0	1.0	1.0
+chr2	490132	0.0	1.0	1.0
+chr2	490133	0.0	1.0	1.0
+chr2	490162	2.0	0.0	2.0
+chr2	490257	2.0	0.0	2.0
+chr2	490297	1.0	0.0	1.0
+chr2	490301	0.0	3.0	3.0
+chr2	490325	0.0	1.0	1.0
+chr2	490335	1.0	0.0	1.0
+chr2	490349	0.0	1.0	1.0
+chr2	490350	1.0	0.0	1.0
+chr2	490370	1.0	0.0	1.0
+chr2	490381	1.0	0.0	1.0
+chr2	490465	2.0	0.0	2.0
+chr2	490480	0.0	2.0	2.0
+chr2	490484	1.0	2.0	3.0
+chr2	490486	0.0	2.0	2.0
+chr2	490489	1.0	0.0	1.0
+chr2	490501	0.0	2.0	2.0
+chr2	490504	1.0	0.0	1.0
+chr2	490511	1.0	0.0	1.0
+chr2	490513	1.0	0.0	1.0
+chr2	490516	1.0	0.0	1.0
+chr2	490699	0.0	1.0	1.0
+chr2	490793	0.0	1.0	1.0
+chr2	490831	1.0	0.0	1.0
+chr2	490840	1.0	0.0	1.0
+chr2	490844	0.0	1.0	1.0
+chr2	490846	0.0	1.0	1.0
+chr2	490847	0.0	1.0	1.0
+chr2	490853	1.0	0.0	1.0
+chr2	490854	1.0	0.0	1.0
+chr2	490862	1.0	0.0	1.0
+chr2	491011	1.0	0.0	1.0
+chr2	491015	0.0	1.0	1.0
+chr2	491024	1.0	0.0	1.0
+chr2	491344	0.0	1.0	1.0
+chr2	491398	0.0	1.0	1.0
+chr2	491399	0.0	1.0	1.0
+chr2	491563	0.0	1.0	1.0
+chr2	491685	0.0	2.0	2.0
+chr2	491893	0.0	2.0	2.0
+chr2	491915	1.0	0.0	1.0
+chr2	492195	0.0	1.0	1.0
+chr2	492248	0.0	1.0	1.0
+chr2	492329	0.0	1.0	1.0
+chr2	492346	1.0	0.0	1.0
+chr2	492587	0.0	1.0	1.0
+chr2	492641	1.0	0.0	1.0
+chr2	492655	0.0	1.0	1.0
+chr2	492802	0.0	2.0	2.0
+chr2	492805	0.0	1.0	1.0
+chr2	492808	3.0	0.0	3.0
+chr2	492811	4.0	0.0	4.0
+chr2	492816	0.0	1.0	1.0
+chr2	492818	1.0	0.0	1.0
+chr2	492822	0.0	1.0	1.0
+chr2	492827	1.0	0.0	1.0
+chr2	492840	0.0	1.0	1.0
+chr2	493077	0.0	2.0	2.0
+chr2	493079	0.0	3.0	3.0
+chr2	493080	0.0	1.0	1.0
+chr2	493081	1.0	0.0	1.0
+chr2	493086	0.0	1.0	1.0
+chr2	493088	0.0	1.0	1.0
+chr2	493093	0.0	1.0	1.0
+chr2	493096	4.0	1.0	5.0
+chr2	493097	3.0	1.0	4.0
+chr2	493101	3.0	0.0	3.0
+chr2	493102	0.0	2.0	2.0
+chr2	493104	0.0	1.0	1.0
+chr2	493108	0.0	2.0	2.0
+chr2	493109	0.0	1.0	1.0
+chr2	493112	0.0	1.0	1.0
+chr2	493114	0.0	4.0	4.0
+chr2	493115	0.0	1.0	1.0
+chr2	493118	1.0	0.0	1.0
+chr2	493119	1.0	0.0	1.0
+chr2	493120	4.0	1.0	5.0
+chr2	493124	1.0	0.0	1.0
+chr2	493126	0.0	2.0	2.0
+chr2	493133	0.0	6.0	6.0
+chr2	493137	1.0	0.0	1.0
+chr2	493138	1.0	0.0	1.0
+chr2	493154	1.0	0.0	1.0
+chr2	493155	1.0	0.0	1.0
+chr2	493172	1.0	0.0	1.0
+chr2	493174	0.0	2.0	2.0
+chr2	493262	0.0	1.0	1.0
+chr2	493264	1.0	0.0	1.0
+chr2	493265	0.0	1.0	1.0
+chr2	493266	0.0	2.0	2.0
+chr2	493282	1.0	0.0	1.0
+chr2	493301	0.0	1.0	1.0
+chr2	493302	1.0	0.0	1.0
+chr2	493330	1.0	0.0	1.0
+chr2	493361	0.0	1.0	1.0
+chr2	493428	1.0	0.0	1.0
+chr2	493577	1.0	0.0	1.0
+chr2	493587	0.0	1.0	1.0
+chr2	493621	0.0	1.0	1.0
+chr2	493628	2.0	0.0	2.0
+chr2	493655	1.0	0.0	1.0
+chr2	493763	1.0	0.0	1.0
+chr2	493790	1.0	0.0	1.0
+chr2	493810	0.0	1.0	1.0
+chr2	493907	0.0	1.0	1.0
+chr2	493917	0.0	1.0	1.0
+chr2	493924	1.0	0.0	1.0
+chr2	493927	0.0	1.0	1.0
+chr2	493940	1.0	0.0	1.0
+chr2	493980	1.0	0.0	1.0
+chr2	494030	0.0	1.0	1.0
+chr2	494044	0.0	1.0	1.0
+chr2	494063	1.0	0.0	1.0
+chr2	494065	1.0	0.0	1.0
+chr2	494067	4.0	0.0	4.0
+chr2	494082	0.0	2.0	2.0
+chr2	494087	2.0	0.0	2.0
+chr2	494088	5.0	1.0	6.0
+chr2	494090	1.0	0.0	1.0
+chr2	494091	1.0	0.0	1.0
+chr2	494093	1.0	0.0	1.0
+chr2	494096	3.0	0.0	3.0
+chr2	494097	5.0	1.0	6.0
+chr2	494099	1.0	0.0	1.0
+chr2	494102	0.0	2.0	2.0
+chr2	494103	3.0	0.0	3.0
+chr2	494105	0.0	1.0	1.0
+chr2	494106	4.0	2.0	6.0
+chr2	494109	0.0	2.0	2.0
+chr2	494110	0.0	1.0	1.0
+chr2	494112	0.0	1.0	1.0
+chr2	494119	0.0	1.0	1.0
+chr2	494120	0.0	1.0	1.0
+chr2	494125	1.0	1.0	2.0
+chr2	494126	0.0	4.0	4.0
+chr2	494132	2.0	0.0	2.0
+chr2	494135	1.0	0.0	1.0
+chr2	494143	2.0	0.0	2.0
+chr2	494145	0.0	1.0	1.0
+chr2	494147	1.0	0.0	1.0
+chr2	494151	0.0	1.0	1.0
+chr2	494187	1.0	0.0	1.0
+chr2	494503	1.0	0.0	1.0
+chr2	494671	1.0	0.0	1.0
+chr2	494689	0.0	1.0	1.0
+chr2	494810	1.0	0.0	1.0
+chr2	494818	0.0	1.0	1.0
+chr2	494820	0.0	1.0	1.0
+chr2	494973	2.0	0.0	2.0
+chr2	494981	1.0	0.0	1.0
+chr2	494990	1.0	0.0	1.0
+chr2	494996	0.0	1.0	1.0
+chr2	495047	0.0	1.0	1.0
+chr2	495124	2.0	0.0	2.0
+chr2	495132	1.0	1.0	2.0
+chr2	495133	1.0	0.0	1.0
+chr2	495138	0.0	1.0	1.0
+chr2	495143	0.0	1.0	1.0
+chr2	495156	0.0	2.0	2.0
+chr2	495163	7.0	0.0	7.0
+chr2	495169	0.0	3.0	3.0
+chr2	495171	0.0	1.0	1.0
+chr2	495173	0.0	1.0	1.0
+chr2	495177	0.0	1.0	1.0
+chr2	495185	0.0	3.0	3.0
+chr2	495196	0.0	1.0	1.0
+chr2	495201	1.0	0.0	1.0
+chr2	495271	0.0	2.0	2.0
+chr2	495280	0.0	1.0	1.0
+chr2	495290	1.0	0.0	1.0
+chr2	495295	0.0	1.0	1.0
+chr2	495296	0.0	1.0	1.0
+chr2	495303	4.0	0.0	4.0
+chr2	495305	3.0	0.0	3.0
+chr2	495307	1.0	0.0	1.0
+chr2	495309	0.0	1.0	1.0
+chr2	495310	2.0	1.0	3.0
+chr2	495316	1.0	0.0	1.0
+chr2	495318	0.0	1.0	1.0
+chr2	495321	1.0	1.0	2.0
+chr2	495324	5.0	0.0	5.0
+chr2	495325	0.0	3.0	3.0
+chr2	495326	6.0	0.0	6.0
+chr2	495328	0.0	5.0	5.0
+chr2	495329	0.0	1.0	1.0
+chr2	495339	0.0	1.0	1.0
+chr2	495340	1.0	0.0	1.0
+chr2	495341	0.0	2.0	2.0
+chr2	495345	1.0	0.0	1.0
+chr2	495346	2.0	0.0	2.0
+chr2	495348	1.0	0.0	1.0
+chr2	495426	0.0	1.0	1.0
+chr2	495566	0.0	1.0	1.0
+chr2	495575	0.0	1.0	1.0
+chr2	495597	0.0	2.0	2.0
+chr2	495599	0.0	1.0	1.0
+chr2	495604	1.0	0.0	1.0
+chr2	495605	1.0	1.0	2.0
+chr2	495606	2.0	0.0	2.0
+chr2	495611	0.0	1.0	1.0
+chr2	495624	0.0	2.0	2.0
+chr2	495625	0.0	3.0	3.0
+chr2	495776	1.0	0.0	1.0
+chr2	495785	0.0	1.0	1.0
+chr2	495813	1.0	0.0	1.0
+chr2	495839	1.0	0.0	1.0
+chr2	496363	1.0	0.0	1.0
+chr2	496393	0.0	1.0	1.0
+chr2	496490	1.0	0.0	1.0
+chr2	496535	1.0	0.0	1.0
+chr2	496688	0.0	1.0	1.0
+chr2	496711	1.0	0.0	1.0
+chr2	496713	1.0	0.0	1.0
+chr2	496717	0.0	1.0	1.0
+chr2	496728	0.0	1.0	1.0
+chr2	496842	1.0	0.0	1.0
+chr2	496855	0.0	1.0	1.0
+chr2	496859	1.0	0.0	1.0
+chr2	496867	1.0	0.0	1.0
+chr2	496868	1.0	0.0	1.0
+chr2	496870	0.0	2.0	2.0
+chr2	496872	0.0	1.0	1.0
+chr2	496873	0.0	1.0	1.0
+chr2	496875	1.0	0.0	1.0
+chr2	496878	2.0	1.0	3.0
+chr2	496880	0.0	5.0	5.0
+chr2	496881	0.0	1.0	1.0
+chr2	496882	2.0	0.0	2.0
+chr2	496883	5.0	1.0	6.0
+chr2	496884	4.0	3.0	7.0
+chr2	496885	0.0	1.0	1.0
+chr2	496887	1.0	0.0	1.0
+chr2	496888	0.0	2.0	2.0
+chr2	496891	0.0	1.0	1.0
+chr2	496897	1.0	0.0	1.0
+chr2	496900	1.0	0.0	1.0
+chr2	497140	1.0	0.0	1.0
+chr2	497151	0.0	1.0	1.0
+chr2	497163	0.0	1.0	1.0
+chr2	497164	1.0	0.0	1.0
+chr2	497166	1.0	1.0	2.0
+chr2	497167	0.0	3.0	3.0
+chr2	497168	0.0	1.0	1.0
+chr2	497179	0.0	1.0	1.0
+chr2	497184	1.0	0.0	1.0
+chr2	497193	1.0	0.0	1.0
+chr2	497197	0.0	1.0	1.0
+chr2	497486	0.0	1.0	1.0
+chr2	497623	0.0	1.0	1.0
+chr2	497846	1.0	0.0	1.0
+chr2	498361	1.0	0.0	1.0
+chr2	498381	1.0	0.0	1.0
+chr2	498384	1.0	0.0	1.0
+chr2	498800	0.0	1.0	1.0
+chr2	499222	1.0	0.0	1.0
+chr2	499951	0.0	1.0	1.0
+chr2	500390	0.0	1.0	1.0
+chr2	500514	1.0	0.0	1.0
+chr2	500619	1.0	0.0	1.0
+chr2	500936	1.0	0.0	1.0
+chr2	501044	1.0	0.0	1.0
+chr2	501051	1.0	0.0	1.0
+chr2	501235	0.0	2.0	2.0
+chr2	501246	1.0	0.0	1.0
+chr2	501248	0.0	1.0	1.0
+chr2	501367	1.0	0.0	1.0
+chr2	501536	1.0	0.0	1.0
+chr2	501550	2.0	0.0	2.0
+chr2	501560	1.0	0.0	1.0
+chr2	501566	0.0	1.0	1.0
+chr2	501568	0.0	1.0	1.0
+chr2	501573	0.0	2.0	2.0
+chr2	501803	0.0	1.0	1.0
+chr2	501830	0.0	1.0	1.0
+chr2	501833	0.0	1.0	1.0
+chr2	501853	1.0	0.0	1.0
+chr2	501857	1.0	0.0	1.0
+chr2	501859	2.0	0.0	2.0
+chr2	501861	1.0	0.0	1.0
+chr2	501875	1.0	0.0	1.0
+chr2	501878	0.0	1.0	1.0
+chr2	502042	3.0	0.0	3.0
+chr2	502893	1.0	0.0	1.0
+chr2	503109	1.0	0.0	1.0
+chr2	503162	1.0	0.0	1.0
+chr2	503644	1.0	0.0	1.0
+chr2	504044	0.0	1.0	1.0
+chr2	504055	1.0	0.0	1.0
+chr2	504226	0.0	1.0	1.0
+chr2	504230	0.0	2.0	2.0
+chr2	504339	1.0	0.0	1.0
+chr2	504379	3.0	3.0	6.0
+chr2	504380	1.0	0.0	1.0
+chr2	504383	0.0	1.0	1.0
+chr2	504385	0.0	2.0	2.0
+chr2	504387	0.0	2.0	2.0
+chr2	504388	1.0	0.0	1.0
+chr2	504390	1.0	0.0	1.0
+chr2	504397	1.0	1.0	2.0
+chr2	504732	0.0	1.0	1.0
+chr2	504763	0.0	1.0	1.0
+chr2	504785	1.0	0.0	1.0
+chr2	504786	2.0	0.0	2.0
+chr2	504787	0.0	1.0	1.0
+chr2	504789	0.0	1.0	1.0
+chr2	504791	0.0	1.0	1.0
+chr2	504794	3.0	0.0	3.0
+chr2	504799	3.0	0.0	3.0
+chr2	504800	0.0	1.0	1.0
+chr2	504801	1.0	1.0	2.0
+chr2	504805	0.0	1.0	1.0
+chr2	504807	0.0	4.0	4.0
+chr2	504812	2.0	5.0	7.0
+chr2	504813	0.0	2.0	2.0
+chr2	504814	3.0	0.0	3.0
+chr2	504816	0.0	7.0	7.0
+chr2	504817	2.0	0.0	2.0
+chr2	504821	0.0	1.0	1.0
+chr2	504824	2.0	2.0	4.0
+chr2	504825	0.0	1.0	1.0
+chr2	504827	1.0	0.0	1.0
+chr2	504836	1.0	1.0	2.0
+chr2	504863	0.0	1.0	1.0
+chr2	504962	1.0	0.0	1.0
+chr2	504964	1.0	0.0	1.0
+chr2	504972	2.0	0.0	2.0
+chr2	504975	0.0	4.0	4.0
+chr2	504984	4.0	1.0	5.0
+chr2	504989	1.0	0.0	1.0
+chr2	505020	0.0	1.0	1.0
+chr2	505087	0.0	1.0	1.0
+chr2	505127	0.0	1.0	1.0
+chr2	505133	1.0	0.0	1.0
+chr2	505148	0.0	1.0	1.0
+chr2	505200	0.0	1.0	1.0
+chr2	505273	1.0	0.0	1.0
+chr2	505276	1.0	0.0	1.0
+chr2	505636	1.0	0.0	1.0
+chr2	505660	0.0	2.0	2.0
+chr2	505667	0.0	1.0	1.0
+chr2	505672	4.0	1.0	5.0
+chr2	505675	2.0	0.0	2.0
+chr2	505680	3.0	0.0	3.0
+chr2	505681	7.0	0.0	7.0
+chr2	505682	1.0	0.0	1.0
+chr2	505683	2.0	0.0	2.0
+chr2	505685	2.0	1.0	3.0
+chr2	505689	1.0	1.0	2.0
+chr2	505693	0.0	9.0	9.0
+chr2	505694	0.0	3.0	3.0
+chr2	505695	2.0	1.0	3.0
+chr2	505696	1.0	6.0	7.0
+chr2	505699	0.0	2.0	2.0
+chr2	505701	2.0	0.0	2.0
+chr2	505702	0.0	3.0	3.0
+chr2	505704	1.0	2.0	3.0
+chr2	505707	0.0	2.0	2.0
+chr2	505708	1.0	0.0	1.0
+chr2	505710	1.0	0.0	1.0
+chr2	505715	0.0	2.0	2.0
+chr2	505716	0.0	1.0	1.0
+chr2	505717	1.0	0.0	1.0
+chr2	505718	1.0	0.0	1.0
+chr2	505741	1.0	0.0	1.0
+chr2	505826	1.0	0.0	1.0
+chr2	505852	0.0	1.0	1.0
+chr2	505860	0.0	1.0	1.0
+chr2	505864	0.0	1.0	1.0
+chr2	505868	1.0	0.0	1.0
+chr2	505877	0.0	1.0	1.0
+chr2	506002	1.0	0.0	1.0
+chr2	506011	0.0	1.0	1.0
+chr2	506042	1.0	0.0	1.0
+chr2	506043	1.0	0.0	1.0
+chr2	506130	0.0	1.0	1.0
+chr2	506204	1.0	0.0	1.0
+chr2	506381	0.0	1.0	1.0
+chr2	506784	0.0	1.0	1.0
+chr2	506821	0.0	1.0	1.0
+chr2	506827	1.0	0.0	1.0
+chr2	506838	0.0	1.0	1.0
+chr2	506977	1.0	0.0	1.0
+chr2	507044	0.0	1.0	1.0
+chr2	507092	0.0	1.0	1.0
+chr2	507251	1.0	0.0	1.0
+chr2	507308	1.0	0.0	1.0
+chr2	507525	1.0	0.0	1.0
+chr2	507583	1.0	0.0	1.0
+chr2	508259	0.0	2.0	2.0
+chr2	508730	0.0	1.0	1.0
+chr2	509280	0.0	1.0	1.0
+chr2	509832	0.0	1.0	1.0
+chr2	509878	0.0	1.0	1.0
+chr2	510186	1.0	0.0	1.0
+chr2	510188	1.0	0.0	1.0
+chr2	510618	1.0	0.0	1.0
+chr2	510770	0.0	1.0	1.0
+chr2	510780	1.0	0.0	1.0
+chr2	510879	0.0	1.0	1.0
+chr2	510984	1.0	0.0	1.0
+chr2	511103	1.0	0.0	1.0
+chr2	511167	1.0	0.0	1.0
+chr2	511323	0.0	1.0	1.0
+chr2	511397	0.0	1.0	1.0
+chr2	511681	0.0	1.0	1.0
+chr2	511825	0.0	1.0	1.0
+chr2	511850	0.0	1.0	1.0
+chr2	511880	1.0	0.0	1.0
+chr2	511996	0.0	1.0	1.0
+chr2	512156	0.0	1.0	1.0
+chr2	512313	1.0	0.0	1.0
+chr2	512319	1.0	0.0	1.0
+chr2	512429	1.0	0.0	1.0
+chr2	512478	1.0	0.0	1.0
+chr2	512519	1.0	0.0	1.0
+chr2	512521	1.0	0.0	1.0
+chr2	512531	0.0	1.0	1.0
+chr2	512636	1.0	0.0	1.0
+chr2	512669	1.0	0.0	1.0
+chr2	512682	2.0	0.0	2.0
+chr2	512688	2.0	0.0	2.0
+chr2	512690	0.0	1.0	1.0
+chr2	512696	1.0	0.0	1.0
+chr2	512708	0.0	1.0	1.0
+chr2	512709	1.0	0.0	1.0
+chr2	512710	1.0	0.0	1.0
+chr2	512714	1.0	0.0	1.0
+chr2	512727	3.0	0.0	3.0
+chr2	512728	0.0	1.0	1.0
+chr2	512734	0.0	2.0	2.0
+chr2	512753	0.0	1.0	1.0
+chr2	512774	0.0	1.0	1.0
+chr2	512835	0.0	1.0	1.0
+chr2	512866	0.0	1.0	1.0
+chr2	512975	0.0	2.0	2.0
+chr2	513029	0.0	1.0	1.0
+chr2	513113	0.0	1.0	1.0
+chr2	513140	1.0	0.0	1.0
+chr2	513184	2.0	0.0	2.0
+chr2	513199	1.0	0.0	1.0
+chr2	513275	0.0	1.0	1.0
+chr2	513286	0.0	1.0	1.0
+chr2	513298	1.0	0.0	1.0
+chr2	513299	0.0	2.0	2.0
+chr2	513312	1.0	0.0	1.0
+chr2	513318	2.0	0.0	2.0
+chr2	513322	1.0	0.0	1.0
+chr2	513327	1.0	0.0	1.0
+chr2	513331	0.0	1.0	1.0
+chr2	513355	1.0	0.0	1.0
+chr2	513391	0.0	1.0	1.0
+chr2	513401	0.0	1.0	1.0
+chr2	513428	0.0	1.0	1.0
+chr2	513453	0.0	1.0	1.0
+chr2	513485	0.0	1.0	1.0
+chr2	513511	0.0	1.0	1.0
+chr2	513520	0.0	1.0	1.0
+chr2	513863	1.0	0.0	1.0
+chr2	513874	1.0	0.0	1.0
+chr2	514110	1.0	0.0	1.0
+chr2	514671	0.0	1.0	1.0
+chr2	514705	1.0	0.0	1.0
+chr2	514769	1.0	0.0	1.0
+chr2	514881	0.0	1.0	1.0
+chr2	515011	0.0	1.0	1.0
+chr2	515189	1.0	0.0	1.0
+chr2	515194	0.0	1.0	1.0
+chr2	515195	1.0	0.0	1.0
+chr2	515198	2.0	0.0	2.0
+chr2	515201	0.0	1.0	1.0
+chr2	515209	1.0	0.0	1.0
+chr2	515223	0.0	1.0	1.0
+chr2	515226	0.0	1.0	1.0
+chr2	515320	1.0	0.0	1.0
+chr2	515331	1.0	0.0	1.0
+chr2	515354	0.0	1.0	1.0
+chr2	515362	1.0	0.0	1.0
+chr2	515645	1.0	0.0	1.0
+chr2	515657	0.0	1.0	1.0
+chr2	515662	0.0	1.0	1.0
+chr2	515664	0.0	1.0	1.0
+chr2	515666	2.0	0.0	2.0
+chr2	515667	1.0	0.0	1.0
+chr2	515674	1.0	0.0	1.0
+chr2	515676	0.0	1.0	1.0
+chr2	515677	1.0	1.0	2.0
+chr2	515678	0.0	1.0	1.0
+chr2	515684	0.0	2.0	2.0
+chr2	515686	0.0	2.0	2.0
+chr2	515690	0.0	1.0	1.0
+chr2	515706	0.0	1.0	1.0
+chr2	515711	1.0	0.0	1.0
+chr2	515716	0.0	1.0	1.0
+chr2	515841	0.0	1.0	1.0
+chr2	515845	0.0	1.0	1.0
+chr2	515862	0.0	1.0	1.0
+chr2	516022	1.0	0.0	1.0
+chr2	516034	0.0	1.0	1.0
+chr2	516089	0.0	1.0	1.0
+chr2	516361	0.0	1.0	1.0
+chr2	516422	1.0	0.0	1.0
+chr2	516448	0.0	1.0	1.0
+chr2	516538	0.0	1.0	1.0
+chr2	516693	0.0	2.0	2.0
+chr2	516803	2.0	0.0	2.0
+chr2	516861	1.0	0.0	1.0
+chr2	516988	0.0	1.0	1.0
+chr2	516997	1.0	0.0	1.0
+chr2	517017	0.0	1.0	1.0
+chr2	517632	1.0	0.0	1.0
+chr2	517667	0.0	1.0	1.0
+chr2	517756	0.0	1.0	1.0
+chr2	517841	0.0	1.0	1.0
+chr2	518389	0.0	1.0	1.0
+chr2	518424	1.0	0.0	1.0
+chr2	518455	1.0	0.0	1.0
+chr2	518460	0.0	1.0	1.0
+chr2	519148	1.0	0.0	1.0
+chr2	519188	1.0	0.0	1.0
+chr2	519381	1.0	0.0	1.0
+chr2	519427	0.0	2.0	2.0
+chr2	519904	2.0	0.0	2.0
+chr2	519953	0.0	1.0	1.0
+chr2	521375	0.0	1.0	1.0
+chr2	523477	0.0	1.0	1.0
+chr2	524737	1.0	0.0	1.0
+chr2	525205	0.0	1.0	1.0
+chr2	525364	0.0	1.0	1.0
+chr2	525505	0.0	1.0	1.0
+chr2	525509	0.0	1.0	1.0
+chr2	525519	0.0	1.0	1.0
+chr2	526156	0.0	1.0	1.0
+chr2	526493	1.0	0.0	1.0
+chr2	526503	0.0	1.0	1.0
+chr2	526549	0.0	1.0	1.0
+chr2	526558	1.0	0.0	1.0
+chr2	526681	0.0	1.0	1.0
+chr2	526682	0.0	1.0	1.0
+chr2	526688	1.0	0.0	1.0
+chr2	526690	0.0	1.0	1.0
+chr2	526704	0.0	1.0	1.0
+chr2	526716	1.0	0.0	1.0
+chr2	526736	0.0	1.0	1.0
+chr2	526856	4.0	0.0	4.0
+chr2	526877	1.0	0.0	1.0
+chr2	527050	0.0	1.0	1.0
+chr2	527122	2.0	0.0	2.0
+chr2	527127	0.0	1.0	1.0
+chr2	527130	0.0	1.0	1.0
+chr2	527134	0.0	1.0	1.0
+chr2	527148	1.0	0.0	1.0
+chr2	527153	1.0	0.0	1.0
+chr2	527154	1.0	0.0	1.0
+chr2	527155	0.0	1.0	1.0
+chr2	527160	1.0	0.0	1.0
+chr2	527166	0.0	2.0	2.0
+chr2	527168	0.0	1.0	1.0
+chr2	527171	0.0	1.0	1.0
+chr2	527173	0.0	3.0	3.0
+chr2	527174	0.0	1.0	1.0
+chr2	527176	2.0	0.0	2.0
+chr2	527178	0.0	1.0	1.0
+chr2	527186	0.0	1.0	1.0
+chr2	527193	0.0	1.0	1.0
+chr2	527196	0.0	1.0	1.0
+chr2	527202	1.0	0.0	1.0
+chr2	527221	0.0	1.0	1.0
+chr2	527328	1.0	0.0	1.0
+chr2	527333	1.0	0.0	1.0
+chr2	527354	0.0	1.0	1.0
+chr2	527359	2.0	0.0	2.0
+chr2	527511	0.0	1.0	1.0
+chr2	527528	1.0	0.0	1.0
+chr2	527531	0.0	1.0	1.0
+chr2	527542	0.0	1.0	1.0
+chr2	527543	1.0	0.0	1.0
+chr2	527835	2.0	0.0	2.0
+chr2	527987	1.0	0.0	1.0
+chr2	527990	0.0	1.0	1.0
+chr2	527993	3.0	0.0	3.0
+chr2	527994	0.0	1.0	1.0
+chr2	527996	0.0	3.0	3.0
+chr2	527997	0.0	2.0	2.0
+chr2	527999	1.0	0.0	1.0
+chr2	528001	1.0	0.0	1.0
+chr2	528002	0.0	1.0	1.0
+chr2	528005	0.0	2.0	2.0
+chr2	528009	1.0	0.0	1.0
+chr2	528010	2.0	0.0	2.0
+chr2	528011	4.0	1.0	5.0
+chr2	528012	5.0	0.0	5.0
+chr2	528016	0.0	1.0	1.0
+chr2	528022	0.0	1.0	1.0
+chr2	528025	0.0	1.0	1.0
+chr2	528026	0.0	1.0	1.0
+chr2	528027	0.0	1.0	1.0
+chr2	528062	1.0	0.0	1.0
+chr2	528267	1.0	0.0	1.0
+chr2	528281	1.0	0.0	1.0
+chr2	528282	1.0	0.0	1.0
+chr2	528290	0.0	2.0	2.0
+chr2	528292	0.0	4.0	4.0
+chr2	528294	0.0	1.0	1.0
+chr2	528295	1.0	0.0	1.0
+chr2	528299	1.0	0.0	1.0
+chr2	528395	0.0	1.0	1.0
+chr2	528446	1.0	0.0	1.0
+chr2	528452	0.0	2.0	2.0
+chr2	528453	0.0	1.0	1.0
+chr2	528463	0.0	1.0	1.0
+chr2	528491	0.0	1.0	1.0
+chr2	528931	1.0	0.0	1.0
+chr2	529069	0.0	1.0	1.0
+chr2	529130	1.0	0.0	1.0
+chr2	529503	1.0	0.0	1.0
+chr2	530283	0.0	2.0	2.0
+chr2	531162	0.0	1.0	1.0
+chr2	531666	0.0	1.0	1.0
+chr2	532006	1.0	0.0	1.0
+chr2	532052	1.0	0.0	1.0
+chr2	532178	1.0	0.0	1.0
+chr2	532190	1.0	0.0	1.0
+chr2	532211	0.0	1.0	1.0
+chr2	532509	0.0	2.0	2.0
+chr2	532517	1.0	0.0	1.0
+chr2	532518	2.0	0.0	2.0
+chr2	532520	0.0	2.0	2.0
+chr2	532528	1.0	0.0	1.0
+chr2	532529	1.0	0.0	1.0
+chr2	532530	0.0	2.0	2.0
+chr2	532541	1.0	0.0	1.0
+chr2	532642	0.0	1.0	1.0
+chr2	532649	1.0	0.0	1.0
+chr2	532664	1.0	0.0	1.0
+chr2	532674	0.0	1.0	1.0
+chr2	532679	0.0	1.0	1.0
+chr2	532680	1.0	1.0	2.0
+chr2	532684	1.0	0.0	1.0
+chr2	532685	1.0	0.0	1.0
+chr2	532687	1.0	0.0	1.0
+chr2	532695	1.0	0.0	1.0
+chr2	532701	0.0	1.0	1.0
+chr2	532706	0.0	1.0	1.0
+chr2	532715	0.0	1.0	1.0
+chr2	532858	1.0	0.0	1.0
+chr2	532870	0.0	2.0	2.0
+chr2	532886	0.0	1.0	1.0
+chr2	532887	1.0	0.0	1.0
+chr2	532888	1.0	0.0	1.0
+chr2	533008	0.0	2.0	2.0
+chr2	533010	1.0	0.0	1.0
+chr2	533129	0.0	1.0	1.0
+chr2	533177	0.0	1.0	1.0
+chr2	533222	0.0	1.0	1.0
+chr2	533250	1.0	0.0	1.0
+chr2	533312	0.0	1.0	1.0
+chr2	533347	0.0	1.0	1.0
+chr2	533351	1.0	0.0	1.0
+chr2	533359	0.0	2.0	2.0
+chr2	533361	0.0	1.0	1.0
+chr2	533364	3.0	3.0	6.0
+chr2	533365	0.0	3.0	3.0
+chr2	533366	0.0	2.0	2.0
+chr2	533369	1.0	0.0	1.0
+chr2	533370	2.0	0.0	2.0
+chr2	533374	4.0	0.0	4.0
+chr2	533375	0.0	2.0	2.0
+chr2	533378	1.0	0.0	1.0
+chr2	533379	0.0	1.0	1.0
+chr2	533380	1.0	0.0	1.0
+chr2	533387	0.0	1.0	1.0
+chr2	533395	1.0	0.0	1.0
+chr2	533404	1.0	0.0	1.0
+chr2	533406	1.0	0.0	1.0
+chr2	533408	0.0	1.0	1.0
+chr2	533410	0.0	3.0	3.0
+chr2	533411	2.0	0.0	2.0
+chr2	533417	1.0	0.0	1.0
+chr2	533432	0.0	1.0	1.0
+chr2	533499	0.0	1.0	1.0
+chr2	533591	2.0	0.0	2.0
+chr2	533636	0.0	1.0	1.0
+chr2	533637	1.0	1.0	2.0
+chr2	533700	3.0	0.0	3.0
+chr2	533703	1.0	0.0	1.0
+chr2	533716	1.0	0.0	1.0
+chr2	533718	0.0	2.0	2.0
+chr2	533725	0.0	3.0	3.0
+chr2	533819	1.0	0.0	1.0
+chr2	533820	0.0	1.0	1.0
+chr2	533825	0.0	1.0	1.0
+chr2	533830	1.0	0.0	1.0
+chr2	533845	1.0	0.0	1.0
+chr2	533859	0.0	3.0	3.0
+chr2	533860	0.0	1.0	1.0
+chr2	533861	0.0	1.0	1.0
+chr2	533864	0.0	2.0	2.0
+chr2	533876	2.0	0.0	2.0
+chr2	533878	2.0	0.0	2.0
+chr2	533891	0.0	1.0	1.0
+chr2	533892	1.0	0.0	1.0
+chr2	533932	1.0	0.0	1.0
+chr2	533961	0.0	1.0	1.0
+chr2	533996	0.0	1.0	1.0
+chr2	534000	2.0	0.0	2.0
+chr2	534013	0.0	1.0	1.0
+chr2	534023	0.0	2.0	2.0
+chr2	534037	1.0	0.0	1.0
+chr2	534049	0.0	1.0	1.0
+chr2	534264	1.0	0.0	1.0
+chr2	534276	0.0	1.0	1.0
+chr2	534466	0.0	1.0	1.0
+chr2	534545	0.0	1.0	1.0
+chr2	534609	0.0	1.0	1.0
+chr2	534625	1.0	0.0	1.0
+chr2	534682	1.0	0.0	1.0
+chr2	534747	0.0	1.0	1.0
+chr2	534757	0.0	1.0	1.0
+chr2	534760	2.0	0.0	2.0
+chr2	534770	1.0	0.0	1.0
+chr2	534782	1.0	0.0	1.0
+chr2	534918	0.0	1.0	1.0
+chr2	534925	0.0	3.0	3.0
+chr2	534926	0.0	1.0	1.0
+chr2	534929	3.0	0.0	3.0
+chr2	534930	0.0	2.0	2.0
+chr2	534931	0.0	1.0	1.0
+chr2	534935	1.0	0.0	1.0
+chr2	534936	0.0	2.0	2.0
+chr2	534937	3.0	0.0	3.0
+chr2	534940	1.0	1.0	2.0
+chr2	534941	0.0	1.0	1.0
+chr2	534945	0.0	1.0	1.0
+chr2	534946	8.0	3.0	11.0
+chr2	534951	0.0	2.0	2.0
+chr2	534952	0.0	2.0	2.0
+chr2	534953	1.0	0.0	1.0
+chr2	534955	2.0	2.0	4.0
+chr2	534956	1.0	0.0	1.0
+chr2	534958	1.0	0.0	1.0
+chr2	534962	0.0	1.0	1.0
+chr2	534964	2.0	0.0	2.0
+chr2	534965	3.0	2.0	5.0
+chr2	534968	1.0	0.0	1.0
+chr2	534974	0.0	1.0	1.0
+chr2	534980	1.0	0.0	1.0
+chr2	534991	1.0	0.0	1.0
+chr2	535006	2.0	0.0	2.0
+chr2	535189	1.0	0.0	1.0
+chr2	535200	0.0	1.0	1.0
+chr2	535213	2.0	0.0	2.0
+chr2	535218	0.0	1.0	1.0
+chr2	535225	0.0	1.0	1.0
+chr2	535231	0.0	4.0	4.0
+chr2	535232	1.0	2.0	3.0
+chr2	535233	3.0	0.0	3.0
+chr2	535234	1.0	0.0	1.0
+chr2	535235	0.0	3.0	3.0
+chr2	535237	4.0	0.0	4.0
+chr2	535241	3.0	0.0	3.0
+chr2	535243	0.0	3.0	3.0
+chr2	535244	0.0	1.0	1.0
+chr2	535250	0.0	1.0	1.0
+chr2	535252	0.0	2.0	2.0
+chr2	535253	1.0	1.0	2.0
+chr2	535255	2.0	0.0	2.0
+chr2	535279	1.0	0.0	1.0
+chr2	535379	1.0	0.0	1.0
+chr2	535392	3.0	1.0	4.0
+chr2	535401	0.0	3.0	3.0
+chr2	535404	1.0	0.0	1.0
+chr2	535566	1.0	0.0	1.0
+chr2	535573	0.0	1.0	1.0
+chr2	535738	1.0	0.0	1.0
+chr2	535920	1.0	0.0	1.0
+chr2	536042	2.0	0.0	2.0
+chr2	536070	1.0	0.0	1.0
+chr2	536162	1.0	0.0	1.0
+chr2	536181	1.0	0.0	1.0
+chr2	536189	1.0	0.0	1.0
+chr2	536193	0.0	1.0	1.0
+chr2	536219	0.0	1.0	1.0
+chr2	536529	0.0	1.0	1.0
+chr2	536598	1.0	0.0	1.0
+chr2	536609	1.0	0.0	1.0
+chr2	536628	0.0	1.0	1.0
+chr2	536643	1.0	0.0	1.0
+chr2	536776	1.0	0.0	1.0
+chr2	536796	0.0	1.0	1.0
+chr2	536825	1.0	0.0	1.0
+chr2	536965	1.0	0.0	1.0
+chr2	536968	1.0	0.0	1.0
+chr2	537029	0.0	1.0	1.0
+chr2	537121	1.0	0.0	1.0
+chr2	537132	0.0	1.0	1.0
+chr2	537274	1.0	0.0	1.0
+chr2	537283	1.0	0.0	1.0
+chr2	537318	0.0	1.0	1.0
+chr2	537434	0.0	1.0	1.0
+chr2	537463	0.0	1.0	1.0
+chr2	537465	1.0	0.0	1.0
+chr2	537467	0.0	1.0	1.0
+chr2	537470	0.0	3.0	3.0
+chr2	537485	1.0	0.0	1.0
+chr2	537502	0.0	1.0	1.0
+chr2	537742	1.0	0.0	1.0
+chr2	537748	0.0	1.0	1.0
+chr2	537760	0.0	2.0	2.0
+chr2	537762	1.0	0.0	1.0
+chr2	537884	1.0	0.0	1.0
+chr2	537916	0.0	1.0	1.0
+chr2	537936	0.0	1.0	1.0
+chr2	537937	0.0	1.0	1.0
+chr2	538084	0.0	2.0	2.0
+chr2	538095	0.0	1.0	1.0
+chr2	538116	1.0	0.0	1.0
+chr2	538190	0.0	1.0	1.0
+chr2	538288	1.0	0.0	1.0
+chr2	538310	1.0	0.0	1.0
+chr2	538326	0.0	1.0	1.0
+chr2	538336	2.0	0.0	2.0
+chr2	538372	0.0	1.0	1.0
+chr2	538373	0.0	1.0	1.0
+chr2	538397	0.0	1.0	1.0
+chr2	538406	0.0	1.0	1.0
+chr2	538445	1.0	0.0	1.0
+chr2	538469	1.0	0.0	1.0
+chr2	538494	1.0	0.0	1.0
+chr2	538505	0.0	1.0	1.0
+chr2	538521	2.0	0.0	2.0
+chr2	538522	0.0	1.0	1.0
+chr2	538545	1.0	0.0	1.0
+chr2	538548	0.0	1.0	1.0
+chr2	538557	0.0	1.0	1.0
+chr2	538561	1.0	0.0	1.0
+chr2	538575	1.0	0.0	1.0
+chr2	538699	0.0	1.0	1.0
+chr2	538705	0.0	1.0	1.0
+chr2	538718	0.0	1.0	1.0
+chr2	538730	1.0	0.0	1.0
+chr2	538741	3.0	0.0	3.0
+chr2	538766	0.0	1.0	1.0
+chr2	538769	0.0	1.0	1.0
+chr2	538799	1.0	0.0	1.0
+chr2	538890	1.0	0.0	1.0
+chr2	539036	1.0	0.0	1.0
+chr2	539062	1.0	0.0	1.0
+chr2	539082	1.0	0.0	1.0
+chr2	539086	0.0	2.0	2.0
+chr2	539095	0.0	1.0	1.0
+chr2	539134	2.0	0.0	2.0
+chr2	539224	0.0	1.0	1.0
+chr2	539253	2.0	0.0	2.0
+chr2	539264	1.0	0.0	1.0
+chr2	539278	0.0	2.0	2.0
+chr2	539279	1.0	1.0	2.0
+chr2	539280	1.0	0.0	1.0
+chr2	539282	0.0	1.0	1.0
+chr2	539286	0.0	1.0	1.0
+chr2	539292	2.0	0.0	2.0
+chr2	539295	0.0	2.0	2.0
+chr2	539296	0.0	1.0	1.0
+chr2	539313	1.0	0.0	1.0
+chr2	539314	1.0	0.0	1.0
+chr2	539353	1.0	0.0	1.0
+chr2	539457	1.0	0.0	1.0
+chr2	539494	0.0	2.0	2.0
+chr2	539495	1.0	0.0	1.0
+chr2	539505	0.0	1.0	1.0
+chr2	539516	1.0	0.0	1.0
+chr2	539524	1.0	0.0	1.0
+chr2	539535	0.0	1.0	1.0
+chr2	539560	1.0	0.0	1.0
+chr2	539652	0.0	1.0	1.0
+chr2	539657	0.0	1.0	1.0
+chr2	539660	0.0	1.0	1.0
+chr2	539663	1.0	0.0	1.0
+chr2	539680	1.0	0.0	1.0
+chr2	539686	0.0	2.0	2.0
+chr2	539687	1.0	1.0	2.0
+chr2	539688	1.0	0.0	1.0
+chr2	539689	1.0	1.0	2.0
+chr2	539695	1.0	0.0	1.0
+chr2	539712	1.0	0.0	1.0
+chr2	539715	1.0	0.0	1.0
+chr2	539949	1.0	1.0	2.0
+chr2	539951	1.0	0.0	1.0
+chr2	539953	2.0	0.0	2.0
+chr2	539957	0.0	1.0	1.0
+chr2	539963	2.0	0.0	2.0
+chr2	539967	0.0	1.0	1.0
+chr2	539978	0.0	1.0	1.0
+chr2	539988	1.0	0.0	1.0
+chr2	539989	0.0	3.0	3.0
+chr2	540128	2.0	0.0	2.0
+chr2	540136	1.0	0.0	1.0
+chr2	540138	0.0	2.0	2.0
+chr2	540141	0.0	1.0	1.0
+chr2	540148	0.0	1.0	1.0
+chr2	540298	3.0	0.0	3.0
+chr2	540443	1.0	0.0	1.0
+chr2	540559	1.0	0.0	1.0
+chr2	540586	0.0	1.0	1.0
+chr2	540605	0.0	1.0	1.0
+chr2	540661	0.0	1.0	1.0
+chr2	540677	1.0	0.0	1.0
+chr2	540782	1.0	0.0	1.0
+chr2	540952	0.0	1.0	1.0
+chr2	540991	0.0	1.0	1.0
+chr2	541000	1.0	0.0	1.0
+chr2	541052	1.0	0.0	1.0
+chr2	541111	1.0	0.0	1.0
+chr2	541242	0.0	1.0	1.0
+chr2	541302	1.0	0.0	1.0
+chr2	541326	1.0	0.0	1.0
+chr2	541377	0.0	1.0	1.0
+chr2	541437	0.0	1.0	1.0
+chr2	541443	0.0	1.0	1.0
+chr2	541789	1.0	0.0	1.0
+chr2	541858	0.0	2.0	2.0
+chr2	541875	0.0	1.0	1.0
+chr2	541908	0.0	1.0	1.0
+chr2	541935	0.0	1.0	1.0
+chr2	542122	0.0	1.0	1.0
+chr2	542210	1.0	0.0	1.0
+chr2	542268	1.0	0.0	1.0
+chr2	542522	0.0	1.0	1.0
+chr2	542793	1.0	0.0	1.0
+chr2	543272	1.0	0.0	1.0
+chr2	543275	1.0	0.0	1.0
+chr2	543800	0.0	1.0	1.0
+chr2	543812	1.0	0.0	1.0
+chr2	543952	0.0	1.0	1.0
+chr2	544127	1.0	0.0	1.0
+chr2	544131	0.0	1.0	1.0
+chr2	544281	0.0	1.0	1.0
+chr2	544288	0.0	1.0	1.0
+chr2	544297	3.0	0.0	3.0
+chr2	544313	1.0	0.0	1.0
+chr2	544318	0.0	1.0	1.0
+chr2	544319	0.0	1.0	1.0
+chr2	544321	1.0	0.0	1.0
+chr2	544334	1.0	0.0	1.0
+chr2	544355	1.0	0.0	1.0
+chr2	544375	1.0	0.0	1.0
+chr2	544402	0.0	1.0	1.0
+chr2	544435	0.0	1.0	1.0
+chr2	544439	0.0	1.0	1.0
+chr2	544454	0.0	1.0	1.0
+chr2	544456	2.0	0.0	2.0
+chr2	544462	0.0	1.0	1.0
+chr2	544466	0.0	1.0	1.0
+chr2	544468	0.0	1.0	1.0
+chr2	544469	0.0	3.0	3.0
+chr2	544470	2.0	4.0	6.0
+chr2	544471	0.0	1.0	1.0
+chr2	544472	0.0	1.0	1.0
+chr2	544475	1.0	0.0	1.0
+chr2	544476	3.0	0.0	3.0
+chr2	544487	0.0	1.0	1.0
+chr2	544488	0.0	1.0	1.0
+chr2	544498	1.0	0.0	1.0
+chr2	544502	1.0	0.0	1.0
+chr2	544524	0.0	1.0	1.0
+chr2	544874	1.0	0.0	1.0
+chr2	544875	2.0	0.0	2.0
+chr2	544889	0.0	1.0	1.0
+chr2	544893	1.0	0.0	1.0
+chr2	544908	0.0	1.0	1.0
+chr2	544915	4.0	0.0	4.0
+chr2	544917	0.0	1.0	1.0
+chr2	544926	0.0	2.0	2.0
+chr2	544927	0.0	1.0	1.0
+chr2	544932	1.0	0.0	1.0
+chr2	544987	0.0	1.0	1.0
+chr2	545073	0.0	1.0	1.0
+chr2	545076	1.0	0.0	1.0
+chr2	545082	2.0	0.0	2.0
+chr2	545095	0.0	1.0	1.0
+chr2	545106	0.0	1.0	1.0
+chr2	545109	0.0	1.0	1.0
+chr2	545134	0.0	1.0	1.0
+chr2	545149	1.0	0.0	1.0
+chr2	545151	0.0	1.0	1.0
+chr2	545256	1.0	0.0	1.0
+chr2	545258	0.0	1.0	1.0
+chr2	545285	1.0	0.0	1.0
+chr2	545303	0.0	2.0	2.0
+chr2	545540	1.0	0.0	1.0
+chr2	545748	1.0	0.0	1.0
+chr2	545919	0.0	2.0	2.0
+chr2	545934	0.0	1.0	1.0
+chr2	545956	0.0	2.0	2.0
+chr2	545959	1.0	0.0	1.0
+chr2	546108	0.0	1.0	1.0
+chr2	546133	2.0	0.0	2.0
+chr2	546150	0.0	1.0	1.0
+chr2	546183	0.0	1.0	1.0
+chr2	546334	1.0	0.0	1.0
+chr2	546347	1.0	0.0	1.0
+chr2	546361	2.0	0.0	2.0
+chr2	546364	0.0	1.0	1.0
+chr2	546368	1.0	0.0	1.0
+chr2	546370	1.0	0.0	1.0
+chr2	546407	1.0	0.0	1.0
+chr2	546520	0.0	1.0	1.0
+chr2	546526	1.0	0.0	1.0
+chr2	546565	1.0	0.0	1.0
+chr2	546573	1.0	0.0	1.0
+chr2	546592	1.0	0.0	1.0
+chr2	546635	0.0	1.0	1.0
+chr2	546689	1.0	0.0	1.0
+chr2	546793	1.0	0.0	1.0
+chr2	546993	2.0	0.0	2.0
+chr2	547141	0.0	1.0	1.0
+chr2	547420	1.0	0.0	1.0
+chr2	547424	0.0	3.0	3.0
+chr2	547485	0.0	1.0	1.0
+chr2	547558	0.0	1.0	1.0
+chr2	547661	1.0	0.0	1.0
+chr2	547680	0.0	1.0	1.0
+chr2	547683	2.0	0.0	2.0
+chr2	547686	0.0	2.0	2.0
+chr2	547687	0.0	1.0	1.0
+chr2	547723	1.0	0.0	1.0
+chr2	547797	1.0	0.0	1.0
+chr2	547952	1.0	0.0	1.0
+chr2	547957	1.0	0.0	1.0
+chr2	548127	1.0	0.0	1.0
+chr2	548149	1.0	0.0	1.0
+chr2	548403	1.0	0.0	1.0
+chr2	548422	2.0	0.0	2.0
+chr2	548556	1.0	0.0	1.0
+chr2	548570	0.0	1.0	1.0
+chr2	548580	0.0	1.0	1.0
+chr2	548874	0.0	1.0	1.0
+chr2	548894	0.0	1.0	1.0
+chr2	548895	0.0	1.0	1.0
+chr2	548912	1.0	0.0	1.0
+chr2	548929	1.0	0.0	1.0
+chr2	549027	0.0	2.0	2.0
+chr2	549032	1.0	0.0	1.0
+chr2	549046	1.0	0.0	1.0
+chr2	549047	1.0	0.0	1.0
+chr2	549052	2.0	0.0	2.0
+chr2	549058	0.0	1.0	1.0
+chr2	549060	1.0	0.0	1.0
+chr2	549065	2.0	0.0	2.0
+chr2	549077	1.0	0.0	1.0
+chr2	549314	0.0	1.0	1.0
+chr2	549456	1.0	0.0	1.0
+chr2	549466	0.0	2.0	2.0
+chr2	549486	0.0	1.0	1.0
+chr2	549488	1.0	0.0	1.0
+chr2	549489	1.0	0.0	1.0
+chr2	549496	1.0	0.0	1.0
+chr2	549498	1.0	0.0	1.0
+chr2	549512	0.0	2.0	2.0
+chr2	549520	1.0	0.0	1.0
+chr2	549541	0.0	1.0	1.0
+chr2	549572	1.0	0.0	1.0
+chr2	549733	1.0	0.0	1.0
+chr2	549760	0.0	2.0	2.0
+chr2	549769	0.0	1.0	1.0
+chr2	549772	2.0	0.0	2.0
+chr2	549774	0.0	1.0	1.0
+chr2	549783	2.0	0.0	2.0
+chr2	549791	1.0	0.0	1.0
+chr2	549802	1.0	0.0	1.0
+chr2	549805	0.0	1.0	1.0
+chr2	549907	0.0	1.0	1.0
+chr2	549933	0.0	1.0	1.0
+chr2	549941	2.0	0.0	2.0
+chr2	550069	0.0	1.0	1.0
+chr2	550146	0.0	1.0	1.0
+chr2	550147	0.0	1.0	1.0
+chr2	550274	1.0	0.0	1.0
+chr2	550316	0.0	1.0	1.0
+chr2	550920	0.0	1.0	1.0
+chr2	551225	0.0	1.0	1.0
+chr2	551703	1.0	0.0	1.0
+chr2	552029	1.0	0.0	1.0
+chr2	552172	0.0	1.0	1.0
+chr2	552386	1.0	0.0	1.0
+chr2	552564	2.0	0.0	2.0
+chr2	552690	1.0	0.0	1.0
+chr2	553025	0.0	1.0	1.0
+chr2	553026	0.0	1.0	1.0
+chr2	553090	0.0	1.0	1.0
+chr2	553116	1.0	0.0	1.0
+chr2	553165	0.0	2.0	2.0
+chr2	553166	0.0	2.0	2.0
+chr2	553169	0.0	1.0	1.0
+chr2	553177	0.0	1.0	1.0
+chr2	553179	0.0	1.0	1.0
+chr2	553180	2.0	1.0	3.0
+chr2	553181	4.0	0.0	4.0
+chr2	553182	6.0	0.0	6.0
+chr2	553183	0.0	1.0	1.0
+chr2	553185	0.0	1.0	1.0
+chr2	553187	0.0	2.0	2.0
+chr2	553188	3.0	1.0	4.0
+chr2	553191	0.0	2.0	2.0
+chr2	553197	0.0	8.0	8.0
+chr2	553198	0.0	1.0	1.0
+chr2	553204	1.0	0.0	1.0
+chr2	553205	2.0	0.0	2.0
+chr2	553208	1.0	0.0	1.0
+chr2	553210	1.0	0.0	1.0
+chr2	553212	0.0	1.0	1.0
+chr2	553611	0.0	1.0	1.0
+chr2	553642	0.0	1.0	1.0
+chr2	553651	0.0	1.0	1.0
+chr2	554003	0.0	1.0	1.0
+chr2	554208	0.0	1.0	1.0
+chr2	554279	0.0	1.0	1.0
+chr2	554663	0.0	1.0	1.0
+chr2	554741	0.0	1.0	1.0
+chr2	554769	1.0	0.0	1.0
+chr2	554776	0.0	1.0	1.0
+chr2	555010	0.0	2.0	2.0
+chr2	555304	0.0	1.0	1.0
+chr2	556902	1.0	0.0	1.0
+chr2	556969	1.0	0.0	1.0
+chr2	557027	0.0	1.0	1.0
+chr2	557478	0.0	1.0	1.0
+chr2	557687	1.0	0.0	1.0
+chr2	557769	1.0	0.0	1.0
+chr2	557798	0.0	1.0	1.0
+chr2	558089	1.0	1.0	2.0
+chr2	558097	0.0	1.0	1.0
+chr2	558123	1.0	0.0	1.0
+chr2	558397	2.0	0.0	2.0
+chr2	558406	0.0	1.0	1.0
+chr2	558409	1.0	0.0	1.0
+chr2	558412	1.0	0.0	1.0
+chr2	558413	0.0	1.0	1.0
+chr2	558415	0.0	1.0	1.0
+chr2	558425	1.0	0.0	1.0
+chr2	558426	2.0	0.0	2.0
+chr2	558428	0.0	1.0	1.0
+chr2	558656	1.0	0.0	1.0
+chr2	558669	3.0	0.0	3.0
+chr2	558680	2.0	0.0	2.0
+chr2	558681	1.0	0.0	1.0
+chr2	558683	1.0	0.0	1.0
+chr2	558685	0.0	1.0	1.0
+chr2	558689	0.0	1.0	1.0
+chr2	558690	1.0	0.0	1.0
+chr2	558691	0.0	1.0	1.0
+chr2	558693	0.0	4.0	4.0
+chr2	558694	1.0	3.0	4.0
+chr2	558695	1.0	0.0	1.0
+chr2	558701	0.0	2.0	2.0
+chr2	558703	3.0	0.0	3.0
+chr2	558704	0.0	3.0	3.0
+chr2	558705	0.0	1.0	1.0
+chr2	558706	1.0	0.0	1.0
+chr2	558707	0.0	1.0	1.0
+chr2	558708	0.0	2.0	2.0
+chr2	558709	1.0	4.0	5.0
+chr2	558710	0.0	2.0	2.0
+chr2	558711	0.0	1.0	1.0
+chr2	558715	1.0	1.0	2.0
+chr2	558716	0.0	1.0	1.0
+chr2	558719	1.0	0.0	1.0
+chr2	558729	1.0	0.0	1.0
+chr2	558856	1.0	0.0	1.0
+chr2	558871	1.0	0.0	1.0
+chr2	558882	1.0	0.0	1.0
+chr2	558909	1.0	0.0	1.0
+chr2	559215	0.0	1.0	1.0
+chr2	559344	1.0	0.0	1.0
+chr2	559372	0.0	1.0	1.0
+chr2	559557	1.0	0.0	1.0
+chr2	559599	0.0	1.0	1.0
+chr2	559968	1.0	0.0	1.0
+chr2	559979	1.0	0.0	1.0
+chr2	559983	1.0	0.0	1.0
+chr2	559985	0.0	1.0	1.0
+chr2	559987	0.0	1.0	1.0
+chr2	559990	1.0	0.0	1.0
+chr2	559991	1.0	0.0	1.0
+chr2	560009	1.0	1.0	2.0
+chr2	560010	1.0	1.0	2.0
+chr2	560017	0.0	1.0	1.0
+chr2	560024	1.0	0.0	1.0
+chr2	560029	1.0	0.0	1.0
+chr2	560045	0.0	2.0	2.0
+chr2	560049	0.0	1.0	1.0
+chr2	560056	1.0	0.0	1.0
+chr2	560134	1.0	0.0	1.0
+chr2	560158	0.0	1.0	1.0
+chr2	560159	4.0	0.0	4.0
+chr2	560171	0.0	1.0	1.0
+chr2	560172	1.0	0.0	1.0
+chr2	560301	1.0	0.0	1.0
+chr2	560480	1.0	0.0	1.0
+chr2	560597	0.0	1.0	1.0
+chr2	560610	0.0	1.0	1.0
+chr2	560616	0.0	1.0	1.0
+chr2	560633	1.0	0.0	1.0
+chr2	560635	1.0	0.0	1.0
+chr2	560779	2.0	0.0	2.0
+chr2	560849	2.0	0.0	2.0
+chr2	560902	0.0	1.0	1.0
+chr2	560944	0.0	1.0	1.0
+chr2	560945	0.0	1.0	1.0
+chr2	560954	0.0	1.0	1.0
+chr2	560972	0.0	1.0	1.0
+chr2	560976	0.0	1.0	1.0
+chr2	561282	0.0	1.0	1.0
+chr2	561312	1.0	0.0	1.0
+chr2	561313	3.0	0.0	3.0
+chr2	561314	0.0	1.0	1.0
+chr2	561342	0.0	1.0	1.0
+chr2	561357	0.0	1.0	1.0
+chr2	561358	0.0	1.0	1.0
+chr2	561359	1.0	0.0	1.0
+chr2	561362	1.0	0.0	1.0
+chr2	561363	2.0	0.0	2.0
+chr2	561375	0.0	1.0	1.0
+chr2	561378	1.0	0.0	1.0
+chr2	561381	1.0	0.0	1.0
+chr2	561392	0.0	1.0	1.0
+chr2	561402	1.0	0.0	1.0
+chr2	561410	1.0	0.0	1.0
+chr2	561551	0.0	1.0	1.0
+chr2	561568	0.0	1.0	1.0
+chr2	561598	0.0	1.0	1.0
+chr2	561609	1.0	0.0	1.0
+chr2	561622	2.0	0.0	2.0
+chr2	561731	2.0	0.0	2.0
+chr2	561799	2.0	0.0	2.0
+chr2	561836	1.0	0.0	1.0
+chr2	561963	0.0	2.0	2.0
+chr2	562092	1.0	0.0	1.0
+chr2	562248	0.0	1.0	1.0
+chr2	562314	1.0	0.0	1.0
+chr2	562377	1.0	0.0	1.0
+chr2	562392	0.0	1.0	1.0
+chr2	562466	1.0	0.0	1.0
+chr2	562506	1.0	0.0	1.0
+chr2	562580	0.0	1.0	1.0
+chr2	562614	1.0	0.0	1.0
+chr2	562644	1.0	0.0	1.0
+chr2	563379	1.0	0.0	1.0
+chr2	563617	1.0	0.0	1.0
+chr2	563676	1.0	0.0	1.0
+chr2	563726	0.0	1.0	1.0
+chr2	563809	1.0	0.0	1.0
+chr2	564190	0.0	1.0	1.0
+chr2	564358	1.0	0.0	1.0
+chr2	564518	1.0	0.0	1.0
+chr2	564639	1.0	0.0	1.0
+chr2	564847	0.0	1.0	1.0
+chr2	565246	0.0	1.0	1.0
+chr2	565247	3.0	0.0	3.0
+chr2	565253	0.0	1.0	1.0
+chr2	565255	1.0	0.0	1.0
+chr2	565256	4.0	0.0	4.0
+chr2	565259	1.0	0.0	1.0
+chr2	565266	0.0	2.0	2.0
+chr2	565268	1.0	0.0	1.0
+chr2	565271	0.0	2.0	2.0
+chr2	565277	0.0	1.0	1.0
+chr2	565282	1.0	0.0	1.0
+chr2	565364	1.0	0.0	1.0
+chr2	565398	0.0	1.0	1.0
+chr2	565399	0.0	1.0	1.0
+chr2	565428	1.0	0.0	1.0
+chr2	565611	1.0	0.0	1.0
+chr2	565627	0.0	1.0	1.0
+chr2	565638	0.0	1.0	1.0
+chr2	565644	0.0	1.0	1.0
+chr2	565650	2.0	0.0	2.0
+chr2	565661	0.0	4.0	4.0
+chr2	565662	0.0	1.0	1.0
+chr2	565666	0.0	2.0	2.0
+chr2	565668	1.0	0.0	1.0
+chr2	565670	6.0	1.0	7.0
+chr2	565671	2.0	0.0	2.0
+chr2	565673	3.0	0.0	3.0
+chr2	565674	0.0	1.0	1.0
+chr2	565677	0.0	1.0	1.0
+chr2	565678	0.0	1.0	1.0
+chr2	565680	2.0	0.0	2.0
+chr2	565681	2.0	0.0	2.0
+chr2	565689	1.0	0.0	1.0
+chr2	565692	0.0	1.0	1.0
+chr2	565694	2.0	0.0	2.0
+chr2	565696	0.0	1.0	1.0
+chr2	565700	0.0	1.0	1.0
+chr2	565726	1.0	0.0	1.0
+chr2	565843	0.0	1.0	1.0
+chr2	565857	1.0	0.0	1.0
+chr2	565866	1.0	0.0	1.0
+chr2	565999	0.0	1.0	1.0
+chr2	566023	0.0	1.0	1.0
+chr2	566038	1.0	0.0	1.0
+chr2	566183	0.0	1.0	1.0
+chr2	566198	0.0	1.0	1.0
+chr2	566219	1.0	0.0	1.0
+chr2	566371	0.0	1.0	1.0
+chr2	566867	1.0	0.0	1.0
+chr2	567031	1.0	0.0	1.0
+chr2	567054	0.0	1.0	1.0
+chr2	567056	0.0	2.0	2.0
+chr2	567060	1.0	0.0	1.0
+chr2	567109	0.0	2.0	2.0
+chr2	567285	0.0	1.0	1.0
+chr2	567521	0.0	1.0	1.0
+chr2	567908	0.0	1.0	1.0
+chr2	567954	1.0	0.0	1.0
+chr2	568155	0.0	1.0	1.0
+chr2	568158	0.0	1.0	1.0
+chr2	568159	0.0	1.0	1.0
+chr2	568170	0.0	1.0	1.0
+chr2	568180	1.0	0.0	1.0
+chr2	568320	2.0	0.0	2.0
+chr2	568323	0.0	1.0	1.0
+chr2	568483	1.0	0.0	1.0
+chr2	568487	0.0	1.0	1.0
+chr2	568498	0.0	2.0	2.0
+chr2	568505	2.0	0.0	2.0
+chr2	568513	0.0	2.0	2.0
+chr2	568514	0.0	1.0	1.0
+chr2	568515	2.0	0.0	2.0
+chr2	568528	1.0	0.0	1.0
+chr2	568530	1.0	0.0	1.0
+chr2	568740	0.0	1.0	1.0
+chr2	568764	0.0	1.0	1.0
+chr2	568766	0.0	2.0	2.0
+chr2	568769	0.0	1.0	1.0
+chr2	568783	0.0	1.0	1.0
+chr2	568790	1.0	0.0	1.0
+chr2	568795	0.0	1.0	1.0
+chr2	568796	1.0	0.0	1.0
+chr2	568804	0.0	1.0	1.0
+chr2	568809	0.0	1.0	1.0
+chr2	568813	0.0	3.0	3.0
+chr2	568814	0.0	1.0	1.0
+chr2	568920	1.0	0.0	1.0
+chr2	568938	0.0	1.0	1.0
+chr2	568945	1.0	0.0	1.0
+chr2	568955	1.0	0.0	1.0
+chr2	568968	0.0	1.0	1.0
+chr2	568969	1.0	0.0	1.0
+chr2	569081	1.0	0.0	1.0
+chr2	569124	1.0	0.0	1.0
+chr2	569452	0.0	1.0	1.0
+chr2	569563	0.0	1.0	1.0
+chr2	569895	0.0	1.0	1.0
+chr2	569963	0.0	1.0	1.0
+chr2	570064	0.0	1.0	1.0
+chr2	570204	0.0	1.0	1.0
+chr2	570210	0.0	1.0	1.0
+chr2	570528	1.0	0.0	1.0
+chr2	570847	0.0	1.0	1.0
+chr2	570888	0.0	1.0	1.0
+chr2	570981	1.0	0.0	1.0
+chr2	571021	0.0	1.0	1.0
+chr2	571046	1.0	0.0	1.0
+chr2	571127	1.0	0.0	1.0
+chr2	571168	1.0	0.0	1.0
+chr2	571169	0.0	1.0	1.0
+chr2	571178	0.0	1.0	1.0
+chr2	571181	1.0	0.0	1.0
+chr2	571182	1.0	0.0	1.0
+chr2	571191	2.0	0.0	2.0
+chr2	571192	3.0	0.0	3.0
+chr2	571194	0.0	1.0	1.0
+chr2	571198	0.0	1.0	1.0
+chr2	571200	0.0	1.0	1.0
+chr2	571201	4.0	0.0	4.0
+chr2	571203	0.0	2.0	2.0
+chr2	571204	0.0	1.0	1.0
+chr2	571215	1.0	0.0	1.0
+chr2	571223	2.0	0.0	2.0
+chr2	571233	0.0	1.0	1.0
+chr2	571249	1.0	0.0	1.0
+chr2	571263	1.0	0.0	1.0
+chr2	571443	0.0	1.0	1.0
+chr2	571513	0.0	1.0	1.0
+chr2	571591	1.0	0.0	1.0
+chr2	571674	0.0	1.0	1.0
+chr2	571759	1.0	0.0	1.0
+chr2	571823	1.0	0.0	1.0
+chr2	571839	1.0	0.0	1.0
+chr2	571854	1.0	0.0	1.0
+chr2	571859	1.0	0.0	1.0
+chr2	571860	0.0	1.0	1.0
+chr2	571871	0.0	1.0	1.0
+chr2	571876	1.0	0.0	1.0
+chr2	571886	0.0	1.0	1.0
+chr2	571915	2.0	0.0	2.0
+chr2	572054	1.0	0.0	1.0
+chr2	572077	1.0	0.0	1.0
+chr2	572081	0.0	1.0	1.0
+chr2	572103	0.0	1.0	1.0
+chr2	572104	0.0	1.0	1.0
+chr2	572222	1.0	0.0	1.0
+chr2	572224	1.0	0.0	1.0
+chr2	572231	0.0	1.0	1.0
+chr2	572247	0.0	1.0	1.0
+chr2	572250	1.0	0.0	1.0
+chr2	572260	2.0	0.0	2.0
+chr2	572263	0.0	1.0	1.0
+chr2	572283	1.0	0.0	1.0
+chr2	572287	0.0	1.0	1.0
+chr2	572288	0.0	1.0	1.0
+chr2	572290	1.0	0.0	1.0
+chr2	572291	1.0	0.0	1.0
+chr2	572295	2.0	0.0	2.0
+chr2	572435	0.0	1.0	1.0
+chr2	572439	1.0	0.0	1.0
+chr2	572440	1.0	0.0	1.0
+chr2	572441	0.0	1.0	1.0
+chr2	572448	1.0	0.0	1.0
+chr2	572455	1.0	0.0	1.0
+chr2	572456	0.0	1.0	1.0
+chr2	572464	0.0	1.0	1.0
+chr2	572467	0.0	1.0	1.0
+chr2	572470	1.0	0.0	1.0
+chr2	572486	1.0	0.0	1.0
+chr2	572488	0.0	1.0	1.0
+chr2	572491	0.0	1.0	1.0
+chr2	572505	1.0	0.0	1.0
+chr2	572623	0.0	1.0	1.0
+chr2	572625	2.0	0.0	2.0
+chr2	572628	0.0	1.0	1.0
+chr2	572800	0.0	1.0	1.0
+chr2	572838	2.0	0.0	2.0
+chr2	573245	1.0	0.0	1.0
+chr2	573378	1.0	0.0	1.0
+chr2	573902	0.0	2.0	2.0
+chr2	573906	1.0	0.0	1.0
+chr2	574064	0.0	1.0	1.0
+chr2	574075	0.0	1.0	1.0
+chr2	574078	1.0	0.0	1.0
+chr2	574081	0.0	1.0	1.0
+chr2	574082	1.0	0.0	1.0
+chr2	574084	1.0	0.0	1.0
+chr2	574088	1.0	0.0	1.0
+chr2	574122	3.0	0.0	3.0
+chr2	574125	1.0	0.0	1.0
+chr2	574141	1.0	0.0	1.0
+chr2	574216	0.0	1.0	1.0
+chr2	574276	1.0	0.0	1.0
+chr2	574300	0.0	3.0	3.0
+chr2	574305	0.0	1.0	1.0
+chr2	574307	0.0	1.0	1.0
+chr2	574314	0.0	1.0	1.0
+chr2	574315	0.0	1.0	1.0
+chr2	574316	0.0	1.0	1.0
+chr2	574326	0.0	1.0	1.0
+chr2	574329	0.0	1.0	1.0
+chr2	574334	1.0	0.0	1.0
+chr2	574335	0.0	1.0	1.0
+chr2	574342	0.0	1.0	1.0
+chr2	574344	3.0	0.0	3.0
+chr2	574350	0.0	1.0	1.0
+chr2	574415	1.0	0.0	1.0
+chr2	574501	0.0	1.0	1.0
+chr2	574504	1.0	0.0	1.0
+chr2	574524	0.0	1.0	1.0
+chr2	574593	0.0	1.0	1.0
+chr2	574644	0.0	1.0	1.0
+chr2	574654	1.0	0.0	1.0
+chr2	574757	1.0	0.0	1.0
+chr2	574915	0.0	1.0	1.0
+chr2	574934	1.0	0.0	1.0
+chr2	575068	1.0	0.0	1.0
+chr2	575276	1.0	0.0	1.0
+chr2	575281	1.0	0.0	1.0
+chr2	575406	0.0	1.0	1.0
+chr2	575427	1.0	0.0	1.0
+chr2	575566	0.0	1.0	1.0
+chr2	575719	0.0	1.0	1.0
+chr2	575887	1.0	0.0	1.0
+chr2	575895	1.0	0.0	1.0
+chr2	575905	4.0	0.0	4.0
+chr2	575906	1.0	0.0	1.0
+chr2	575915	0.0	1.0	1.0
+chr2	575917	0.0	2.0	2.0
+chr2	575918	0.0	1.0	1.0
+chr2	576134	1.0	0.0	1.0
+chr2	576323	0.0	1.0	1.0
+chr2	576326	0.0	1.0	1.0
+chr2	576338	1.0	0.0	1.0
+chr2	576341	1.0	0.0	1.0
+chr2	576343	0.0	1.0	1.0
+chr2	576345	3.0	0.0	3.0
+chr2	576356	1.0	0.0	1.0
+chr2	576360	1.0	0.0	1.0
+chr2	576361	0.0	1.0	1.0
+chr2	576386	2.0	0.0	2.0
+chr2	576390	2.0	0.0	2.0
+chr2	576408	0.0	1.0	1.0
+chr2	576414	0.0	1.0	1.0
+chr2	576436	0.0	1.0	1.0
+chr2	576663	0.0	1.0	1.0
+chr2	576665	1.0	0.0	1.0
+chr2	576668	0.0	1.0	1.0
+chr2	576919	1.0	0.0	1.0
+chr2	577423	0.0	1.0	1.0
+chr2	577685	1.0	0.0	1.0
+chr2	577732	2.0	0.0	2.0
+chr2	577743	0.0	1.0	1.0
+chr2	577883	1.0	0.0	1.0
+chr2	577902	0.0	3.0	3.0
+chr2	577905	1.0	0.0	1.0
+chr2	577913	0.0	1.0	1.0
+chr2	578049	1.0	0.0	1.0
+chr2	578059	0.0	2.0	2.0
+chr2	578060	0.0	1.0	1.0
+chr2	578061	0.0	1.0	1.0
+chr2	578062	1.0	0.0	1.0
+chr2	578071	0.0	3.0	3.0
+chr2	578078	1.0	0.0	1.0
+chr2	578079	4.0	0.0	4.0
+chr2	578095	0.0	1.0	1.0
+chr2	578096	0.0	2.0	2.0
+chr2	578335	0.0	1.0	1.0
+chr2	578348	0.0	1.0	1.0
+chr2	578356	0.0	1.0	1.0
+chr2	578361	0.0	1.0	1.0
+chr2	578363	0.0	1.0	1.0
+chr2	578366	0.0	2.0	2.0
+chr2	578368	3.0	0.0	3.0
+chr2	578369	4.0	0.0	4.0
+chr2	578373	0.0	1.0	1.0
+chr2	578374	0.0	4.0	4.0
+chr2	578375	0.0	2.0	2.0
+chr2	578377	0.0	1.0	1.0
+chr2	578378	2.0	0.0	2.0
+chr2	578379	6.0	0.0	6.0
+chr2	578380	2.0	0.0	2.0
+chr2	578381	1.0	0.0	1.0
+chr2	578384	1.0	1.0	2.0
+chr2	578386	1.0	4.0	5.0
+chr2	578387	1.0	0.0	1.0
+chr2	578388	0.0	2.0	2.0
+chr2	578389	0.0	1.0	1.0
+chr2	578390	1.0	0.0	1.0
+chr2	578395	2.0	0.0	2.0
+chr2	578399	2.0	0.0	2.0
+chr2	578415	1.0	0.0	1.0
+chr2	578524	2.0	0.0	2.0
+chr2	578531	0.0	2.0	2.0
+chr2	578533	0.0	2.0	2.0
+chr2	578539	1.0	0.0	1.0
+chr2	578543	1.0	0.0	1.0
+chr2	578548	1.0	0.0	1.0
+chr2	578560	0.0	1.0	1.0
+chr2	578562	0.0	3.0	3.0
+chr2	578570	0.0	1.0	1.0
+chr2	578690	0.0	1.0	1.0
+chr2	578700	1.0	0.0	1.0
+chr2	578869	1.0	0.0	1.0
+chr2	578875	0.0	1.0	1.0
+chr2	578895	1.0	0.0	1.0
+chr2	579232	0.0	1.0	1.0
+chr2	579653	1.0	0.0	1.0
+chr2	579813	0.0	1.0	1.0
+chr2	580770	2.0	0.0	2.0
+chr2	580788	0.0	1.0	1.0
+chr2	580913	1.0	0.0	1.0
+chr2	581118	0.0	1.0	1.0
+chr2	581223	0.0	1.0	1.0
+chr2	581243	0.0	1.0	1.0
+chr2	581254	0.0	1.0	1.0
+chr2	581266	1.0	0.0	1.0
+chr2	581268	1.0	0.0	1.0
+chr2	581269	0.0	1.0	1.0
+chr2	581294	1.0	0.0	1.0
+chr2	581404	1.0	0.0	1.0
+chr2	581405	0.0	2.0	2.0
+chr2	581409	0.0	1.0	1.0
+chr2	581417	1.0	0.0	1.0
+chr2	581418	0.0	1.0	1.0
+chr2	581420	2.0	1.0	3.0
+chr2	581421	2.0	0.0	2.0
+chr2	581429	1.0	0.0	1.0
+chr2	581430	1.0	0.0	1.0
+chr2	581434	0.0	1.0	1.0
+chr2	581435	0.0	1.0	1.0
+chr2	581441	1.0	0.0	1.0
+chr2	581443	0.0	1.0	1.0
+chr2	581444	4.0	1.0	5.0
+chr2	581446	0.0	1.0	1.0
+chr2	581447	0.0	1.0	1.0
+chr2	581451	0.0	1.0	1.0
+chr2	581733	0.0	1.0	1.0
+chr2	581769	0.0	1.0	1.0
+chr2	581844	1.0	0.0	1.0
+chr2	582084	1.0	0.0	1.0
+chr2	582113	1.0	0.0	1.0
+chr2	582122	0.0	1.0	1.0
+chr2	582145	1.0	0.0	1.0
+chr2	582147	1.0	0.0	1.0
+chr2	582159	1.0	1.0	2.0
+chr2	582160	0.0	1.0	1.0
+chr2	582367	1.0	0.0	1.0
+chr2	582395	1.0	0.0	1.0
+chr2	582400	2.0	0.0	2.0
+chr2	582416	0.0	5.0	5.0
+chr2	582417	0.0	1.0	1.0
+chr2	582418	0.0	1.0	1.0
+chr2	582422	4.0	1.0	5.0
+chr2	582423	20.0	0.0	20.0
+chr2	582424	0.0	5.0	5.0
+chr2	582427	3.0	0.0	3.0
+chr2	582428	3.0	0.0	3.0
+chr2	582430	0.0	3.0	3.0
+chr2	582431	1.0	1.0	2.0
+chr2	582432	4.0	3.0	7.0
+chr2	582438	1.0	0.0	1.0
+chr2	582439	6.0	1.0	7.0
+chr2	582441	0.0	4.0	4.0
+chr2	582447	1.0	0.0	1.0
+chr2	582451	1.0	0.0	1.0
+chr2	582452	1.0	0.0	1.0
+chr2	582466	3.0	0.0	3.0
+chr2	582578	1.0	0.0	1.0
+chr2	582598	0.0	1.0	1.0
+chr2	582600	1.0	0.0	1.0
+chr2	582602	2.0	1.0	3.0
+chr2	582614	0.0	1.0	1.0
+chr2	582792	0.0	1.0	1.0
+chr2	582795	2.0	0.0	2.0
+chr2	583082	0.0	1.0	1.0
+chr2	583107	0.0	1.0	1.0
+chr2	583216	1.0	0.0	1.0
+chr2	583261	1.0	0.0	1.0
+chr2	583274	1.0	0.0	1.0
+chr2	583390	0.0	2.0	2.0
+chr2	583610	2.0	0.0	2.0
+chr2	583614	0.0	1.0	1.0
+chr2	583619	1.0	0.0	1.0
+chr2	583627	1.0	0.0	1.0
+chr2	583631	0.0	1.0	1.0
+chr2	583637	2.0	0.0	2.0
+chr2	583639	0.0	1.0	1.0
+chr2	583642	0.0	1.0	1.0
+chr2	583645	0.0	1.0	1.0
+chr2	583654	2.0	0.0	2.0
+chr2	583656	1.0	0.0	1.0
+chr2	583657	1.0	0.0	1.0
+chr2	583663	1.0	0.0	1.0
+chr2	583800	0.0	1.0	1.0
+chr2	583811	2.0	0.0	2.0
+chr2	583839	1.0	0.0	1.0
+chr2	583841	0.0	1.0	1.0
+chr2	583845	1.0	1.0	2.0
+chr2	583971	1.0	0.0	1.0
+chr2	584141	1.0	0.0	1.0
+chr2	584163	1.0	0.0	1.0
+chr2	584166	0.0	1.0	1.0
+chr2	584313	0.0	2.0	2.0
+chr2	584330	1.0	0.0	1.0
+chr2	584336	2.0	0.0	2.0
+chr2	584339	1.0	0.0	1.0
+chr2	584346	1.0	0.0	1.0
+chr2	584492	0.0	2.0	2.0
+chr2	584540	0.0	3.0	3.0
+chr2	584779	1.0	0.0	1.0
+chr2	584799	1.0	0.0	1.0
+chr2	584994	1.0	0.0	1.0
+chr2	585068	1.0	0.0	1.0
+chr2	585154	0.0	2.0	2.0
+chr2	585236	0.0	1.0	1.0
+chr2	585387	0.0	1.0	1.0
+chr2	585697	0.0	1.0	1.0
+chr2	585799	1.0	0.0	1.0
+chr2	585959	0.0	1.0	1.0
+chr2	586129	1.0	0.0	1.0
+chr2	586150	0.0	2.0	2.0
+chr2	586153	1.0	0.0	1.0
+chr2	586158	0.0	1.0	1.0
+chr2	586163	2.0	0.0	2.0
+chr2	586166	0.0	1.0	1.0
+chr2	586179	1.0	0.0	1.0
+chr2	586182	1.0	0.0	1.0
+chr2	586190	1.0	0.0	1.0
+chr2	586195	0.0	1.0	1.0
+chr2	586572	1.0	0.0	1.0
+chr2	586580	1.0	0.0	1.0
+chr2	586585	1.0	0.0	1.0
+chr2	586586	0.0	1.0	1.0
+chr2	586605	1.0	0.0	1.0
+chr2	586612	0.0	1.0	1.0
+chr2	586719	0.0	1.0	1.0
+chr2	586742	0.0	1.0	1.0
+chr2	586745	1.0	0.0	1.0
+chr2	586787	0.0	2.0	2.0
+chr2	586902	2.0	0.0	2.0
+chr2	587033	0.0	1.0	1.0
+chr2	587530	0.0	1.0	1.0
+chr2	587886	0.0	1.0	1.0
+chr2	588103	1.0	0.0	1.0
+chr2	588259	1.0	0.0	1.0
+chr2	588801	0.0	1.0	1.0
+chr2	588939	1.0	0.0	1.0
+chr2	588948	1.0	0.0	1.0
+chr2	588950	0.0	1.0	1.0
+chr2	588951	1.0	0.0	1.0
+chr2	588953	0.0	2.0	2.0
+chr2	588954	1.0	0.0	1.0
+chr2	588957	2.0	0.0	2.0
+chr2	588983	1.0	0.0	1.0
+chr2	588991	0.0	1.0	1.0
+chr2	589014	0.0	2.0	2.0
+chr2	589081	0.0	1.0	1.0
+chr2	589098	0.0	2.0	2.0
+chr2	589102	1.0	0.0	1.0
+chr2	589104	1.0	0.0	1.0
+chr2	589111	0.0	3.0	3.0
+chr2	589118	0.0	1.0	1.0
+chr2	589119	0.0	1.0	1.0
+chr2	589121	4.0	0.0	4.0
+chr2	589124	1.0	0.0	1.0
+chr2	589137	1.0	0.0	1.0
+chr2	589145	0.0	1.0	1.0
+chr2	589147	2.0	3.0	5.0
+chr2	589149	2.0	0.0	2.0
+chr2	589152	1.0	0.0	1.0
+chr2	589154	0.0	1.0	1.0
+chr2	589163	2.0	0.0	2.0
+chr2	589166	1.0	0.0	1.0
+chr2	589169	0.0	1.0	1.0
+chr2	589170	0.0	1.0	1.0
+chr2	589379	0.0	1.0	1.0
+chr2	589447	1.0	2.0	3.0
+chr2	589452	1.0	0.0	1.0
+chr2	589459	0.0	1.0	1.0
+chr2	589461	0.0	2.0	2.0
+chr2	589464	0.0	1.0	1.0
+chr2	589466	0.0	3.0	3.0
+chr2	589467	0.0	2.0	2.0
+chr2	589470	1.0	0.0	1.0
+chr2	589475	1.0	0.0	1.0
+chr2	589476	0.0	1.0	1.0
+chr2	589479	1.0	0.0	1.0
+chr2	589483	1.0	0.0	1.0
+chr2	589495	2.0	0.0	2.0
+chr2	589701	1.0	0.0	1.0
+chr2	589884	0.0	1.0	1.0
+chr2	589904	0.0	1.0	1.0
+chr2	590012	0.0	1.0	1.0
+chr2	590181	1.0	0.0	1.0
+chr2	590214	1.0	0.0	1.0
+chr2	590386	1.0	0.0	1.0
+chr2	590531	0.0	1.0	1.0
+chr2	590549	1.0	0.0	1.0
+chr2	590662	0.0	1.0	1.0
+chr2	590684	1.0	0.0	1.0
+chr2	590693	1.0	0.0	1.0
+chr2	590729	1.0	0.0	1.0
+chr2	590732	0.0	1.0	1.0
+chr2	590735	0.0	1.0	1.0
+chr2	590883	0.0	2.0	2.0
+chr2	590917	1.0	0.0	1.0
+chr2	590944	1.0	0.0	1.0
+chr2	590976	0.0	1.0	1.0
+chr2	591233	1.0	0.0	1.0
+chr2	591245	1.0	0.0	1.0
+chr2	591274	1.0	0.0	1.0
+chr2	591278	0.0	1.0	1.0
+chr2	591279	1.0	0.0	1.0
+chr2	591282	0.0	1.0	1.0
+chr2	591288	0.0	1.0	1.0
+chr2	591291	0.0	1.0	1.0
+chr2	591298	4.0	0.0	4.0
+chr2	591308	1.0	0.0	1.0
+chr2	591310	0.0	1.0	1.0
+chr2	591316	2.0	0.0	2.0
+chr2	591319	4.0	0.0	4.0
+chr2	591321	0.0	2.0	2.0
+chr2	591326	0.0	1.0	1.0
+chr2	591327	1.0	1.0	2.0
+chr2	591331	0.0	1.0	1.0
+chr2	591332	0.0	2.0	2.0
+chr2	591341	1.0	0.0	1.0
+chr2	591346	0.0	1.0	1.0
+chr2	591357	0.0	1.0	1.0
+chr2	591361	1.0	0.0	1.0
+chr2	591370	0.0	2.0	2.0
+chr2	592334	0.0	1.0	1.0
+chr2	592421	1.0	0.0	1.0
+chr2	592685	0.0	2.0	2.0
+chr2	592771	3.0	0.0	3.0
+chr2	593260	0.0	1.0	1.0
+chr2	593262	0.0	1.0	1.0
+chr2	593265	0.0	1.0	1.0
+chr2	593266	0.0	2.0	2.0
+chr2	593269	0.0	1.0	1.0
+chr2	593276	0.0	1.0	1.0
+chr2	593297	2.0	0.0	2.0
+chr2	593317	0.0	1.0	1.0
+chr2	593329	1.0	0.0	1.0
+chr2	593391	1.0	0.0	1.0
+chr2	593419	1.0	0.0	1.0
+chr2	593559	0.0	1.0	1.0
+chr2	593587	0.0	1.0	1.0
+chr2	593588	1.0	0.0	1.0
+chr2	593596	0.0	1.0	1.0
+chr2	593718	1.0	0.0	1.0
+chr2	593730	0.0	1.0	1.0
+chr2	593776	0.0	1.0	1.0
+chr2	593778	0.0	1.0	1.0
+chr2	593786	0.0	1.0	1.0
+chr2	593877	0.0	2.0	2.0
+chr2	593881	0.0	1.0	1.0
+chr2	593896	1.0	0.0	1.0
+chr2	593910	1.0	0.0	1.0
+chr2	593946	1.0	0.0	1.0
+chr2	593980	1.0	0.0	1.0
+chr2	594036	1.0	0.0	1.0
+chr2	594056	0.0	1.0	1.0
+chr2	594119	0.0	1.0	1.0
+chr2	594126	0.0	1.0	1.0
+chr2	594303	0.0	1.0	1.0
+chr2	594310	0.0	1.0	1.0
+chr2	594321	1.0	0.0	1.0
+chr2	594327	1.0	0.0	1.0
+chr2	594459	1.0	0.0	1.0
+chr2	594474	0.0	2.0	2.0
+chr2	594490	1.0	0.0	1.0
+chr2	594547	0.0	2.0	2.0
+chr2	594583	0.0	1.0	1.0
+chr2	594646	0.0	1.0	1.0
+chr2	594658	0.0	1.0	1.0
+chr2	594667	0.0	1.0	1.0
+chr2	594705	1.0	0.0	1.0
+chr2	594721	0.0	1.0	1.0
+chr2	594799	1.0	0.0	1.0
+chr2	594805	0.0	2.0	2.0
+chr2	594822	1.0	0.0	1.0
+chr2	594996	0.0	1.0	1.0
+chr2	595010	0.0	1.0	1.0
+chr2	595023	1.0	0.0	1.0
+chr2	595037	0.0	1.0	1.0
+chr2	595090	0.0	1.0	1.0
+chr2	595247	1.0	0.0	1.0
+chr2	595253	1.0	0.0	1.0
+chr2	595261	1.0	0.0	1.0
+chr2	595287	0.0	1.0	1.0
+chr2	595299	1.0	0.0	1.0
+chr2	595311	1.0	0.0	1.0
+chr2	595314	0.0	1.0	1.0
+chr2	595319	1.0	0.0	1.0
+chr2	595322	1.0	0.0	1.0
+chr2	595324	0.0	1.0	1.0
+chr2	595351	1.0	0.0	1.0
+chr2	595352	0.0	1.0	1.0
+chr2	595353	0.0	1.0	1.0
+chr2	595364	0.0	1.0	1.0
+chr2	595400	1.0	0.0	1.0
+chr2	595504	0.0	1.0	1.0
+chr2	595517	0.0	1.0	1.0
+chr2	595524	1.0	0.0	1.0
+chr2	595528	0.0	2.0	2.0
+chr2	595547	1.0	0.0	1.0
+chr2	595639	1.0	0.0	1.0
+chr2	596149	1.0	0.0	1.0
+chr2	596152	1.0	0.0	1.0
+chr2	596165	0.0	1.0	1.0
+chr2	596181	1.0	0.0	1.0
+chr2	596188	0.0	1.0	1.0
+chr2	596206	1.0	0.0	1.0
+chr2	596375	1.0	0.0	1.0
+chr2	596380	2.0	0.0	2.0
+chr2	596421	0.0	1.0	1.0
+chr2	596439	1.0	0.0	1.0
+chr2	596464	1.0	0.0	1.0
+chr2	596487	0.0	1.0	1.0
+chr2	596499	1.0	0.0	1.0
+chr2	596524	0.0	1.0	1.0
+chr2	596957	1.0	0.0	1.0
+chr2	596960	0.0	1.0	1.0
+chr2	596971	0.0	1.0	1.0
+chr2	596978	1.0	0.0	1.0
+chr2	597366	1.0	0.0	1.0
+chr2	597367	1.0	0.0	1.0
+chr2	597368	1.0	0.0	1.0
+chr2	597380	0.0	3.0	3.0
+chr2	597381	0.0	1.0	1.0
+chr2	597394	1.0	0.0	1.0
+chr2	597405	1.0	0.0	1.0
+chr2	597539	0.0	1.0	1.0
+chr2	597540	0.0	1.0	1.0
+chr2	597545	0.0	2.0	2.0
+chr2	597546	0.0	1.0	1.0
+chr2	597562	1.0	0.0	1.0
+chr2	597651	0.0	1.0	1.0
+chr2	597669	1.0	0.0	1.0
+chr2	597677	1.0	0.0	1.0
+chr2	597706	1.0	0.0	1.0
+chr2	597720	0.0	1.0	1.0
+chr2	597729	3.0	0.0	3.0
+chr2	597732	1.0	0.0	1.0
+chr2	597847	1.0	0.0	1.0
+chr2	597894	1.0	0.0	1.0
+chr2	598029	1.0	0.0	1.0
+chr2	598082	1.0	0.0	1.0
+chr2	598253	0.0	1.0	1.0
+chr2	598320	1.0	0.0	1.0
+chr2	598394	0.0	1.0	1.0
+chr2	598401	0.0	1.0	1.0
+chr2	598403	1.0	0.0	1.0
+chr2	598409	0.0	1.0	1.0
+chr2	598421	0.0	1.0	1.0
+chr2	598423	1.0	0.0	1.0
+chr2	598436	0.0	2.0	2.0
+chr2	598440	3.0	0.0	3.0
+chr2	598572	2.0	0.0	2.0
+chr2	598573	1.0	0.0	1.0
+chr2	598628	0.0	1.0	1.0
+chr2	598647	1.0	0.0	1.0
+chr2	598658	1.0	0.0	1.0
+chr2	598711	1.0	0.0	1.0
+chr2	598856	1.0	0.0	1.0
+chr2	599366	1.0	0.0	1.0
+chr2	599505	1.0	0.0	1.0
+chr2	599507	0.0	1.0	1.0
+chr2	599512	0.0	1.0	1.0
+chr2	599513	0.0	1.0	1.0
+chr2	599606	1.0	0.0	1.0
+chr2	599725	0.0	1.0	1.0
+chr2	599738	1.0	0.0	1.0
+chr2	599742	0.0	1.0	1.0
+chr2	599748	1.0	0.0	1.0
+chr2	599754	1.0	0.0	1.0
+chr2	599762	0.0	1.0	1.0
+chr2	599773	0.0	2.0	2.0
+chr2	599775	1.0	0.0	1.0
+chr2	599776	1.0	0.0	1.0
+chr2	599786	1.0	0.0	1.0
+chr2	599804	0.0	1.0	1.0
+chr2	599886	0.0	1.0	1.0
+chr2	599927	1.0	0.0	1.0
+chr2	599932	0.0	6.0	6.0
+chr2	599934	0.0	1.0	1.0
+chr2	599935	2.0	0.0	2.0
+chr2	599936	1.0	1.0	2.0
+chr2	599937	2.0	2.0	4.0
+chr2	599938	0.0	1.0	1.0
+chr2	599942	0.0	3.0	3.0
+chr2	599943	0.0	3.0	3.0
+chr2	599945	0.0	2.0	2.0
+chr2	599951	0.0	1.0	1.0
+chr2	599952	0.0	1.0	1.0
+chr2	599953	1.0	0.0	1.0
+chr2	599961	0.0	1.0	1.0
+chr2	599975	2.0	0.0	2.0
+chr2	600035	0.0	1.0	1.0
+chr2	600145	0.0	1.0	1.0
+chr2	600168	0.0	1.0	1.0
+chr2	600169	0.0	1.0	1.0
+chr2	600173	4.0	0.0	4.0
+chr2	600178	4.0	0.0	4.0
+chr2	600181	0.0	1.0	1.0
+chr2	600183	1.0	0.0	1.0
+chr2	600184	0.0	1.0	1.0
+chr2	600185	0.0	2.0	2.0
+chr2	600188	1.0	1.0	2.0
+chr2	600190	1.0	0.0	1.0
+chr2	600195	0.0	2.0	2.0
+chr2	600196	1.0	3.0	4.0
+chr2	600197	0.0	3.0	3.0
+chr2	600198	0.0	1.0	1.0
+chr2	600199	1.0	0.0	1.0
+chr2	600200	1.0	0.0	1.0
+chr2	600201	1.0	0.0	1.0
+chr2	600212	0.0	4.0	4.0
+chr2	600219	0.0	2.0	2.0
+chr2	600232	1.0	0.0	1.0
+chr2	600521	1.0	0.0	1.0
+chr2	600524	1.0	0.0	1.0
+chr2	600533	0.0	1.0	1.0
+chr2	600551	0.0	2.0	2.0
+chr2	600590	1.0	0.0	1.0
+chr2	600595	0.0	1.0	1.0
+chr2	600627	0.0	2.0	2.0
+chr2	600684	1.0	0.0	1.0
+chr2	600703	0.0	1.0	1.0
+chr2	600707	2.0	0.0	2.0
+chr2	600716	1.0	0.0	1.0
+chr2	600723	0.0	1.0	1.0
+chr2	600731	0.0	3.0	3.0
+chr2	600747	0.0	1.0	1.0
+chr2	600765	0.0	1.0	1.0
+chr2	600846	0.0	1.0	1.0
+chr2	600880	0.0	1.0	1.0
+chr2	601069	1.0	0.0	1.0
+chr2	601095	0.0	1.0	1.0
+chr2	601114	0.0	1.0	1.0
+chr2	601184	1.0	0.0	1.0
+chr2	601277	1.0	0.0	1.0
+chr2	602013	0.0	2.0	2.0
+chr2	602191	1.0	0.0	1.0
+chr2	602192	0.0	2.0	2.0
+chr2	602196	0.0	1.0	1.0
+chr2	602204	1.0	0.0	1.0
+chr2	602205	0.0	3.0	3.0
+chr2	602215	0.0	1.0	1.0
+chr2	602224	0.0	1.0	1.0
+chr2	602226	1.0	0.0	1.0
+chr2	602230	0.0	1.0	1.0
+chr2	602231	1.0	0.0	1.0
+chr2	602544	0.0	1.0	1.0
+chr2	602549	1.0	1.0	2.0
+chr2	602550	0.0	1.0	1.0
+chr2	602620	1.0	0.0	1.0
+chr2	602680	1.0	0.0	1.0
+chr2	602682	1.0	0.0	1.0
+chr2	602707	0.0	1.0	1.0
+chr2	602720	1.0	0.0	1.0
+chr2	602733	1.0	0.0	1.0
+chr2	602804	0.0	1.0	1.0
+chr2	602920	1.0	0.0	1.0
+chr2	603366	0.0	1.0	1.0
+chr2	603587	0.0	1.0	1.0
+chr2	603657	1.0	1.0	2.0
+chr2	603726	0.0	1.0	1.0
+chr2	603728	0.0	1.0	1.0
+chr2	603744	0.0	1.0	1.0
+chr2	603766	1.0	0.0	1.0
+chr2	603776	0.0	1.0	1.0
+chr2	603806	0.0	1.0	1.0
+chr2	603816	1.0	0.0	1.0
+chr2	603823	1.0	0.0	1.0
+chr2	603962	2.0	0.0	2.0
+chr2	603963	0.0	1.0	1.0
+chr2	604020	1.0	0.0	1.0
+chr2	604084	1.0	0.0	1.0
+chr2	604097	1.0	0.0	1.0
+chr2	604109	0.0	1.0	1.0
+chr2	604113	4.0	0.0	4.0
+chr2	604117	0.0	1.0	1.0
+chr2	604119	1.0	2.0	3.0
+chr2	604123	1.0	1.0	2.0
+chr2	604128	0.0	1.0	1.0
+chr2	604130	3.0	0.0	3.0
+chr2	604132	3.0	0.0	3.0
+chr2	604133	1.0	0.0	1.0
+chr2	604134	2.0	1.0	3.0
+chr2	604135	4.0	0.0	4.0
+chr2	604137	1.0	0.0	1.0
+chr2	604138	4.0	0.0	4.0
+chr2	604140	1.0	0.0	1.0
+chr2	604143	1.0	0.0	1.0
+chr2	604144	0.0	1.0	1.0
+chr2	604147	1.0	1.0	2.0
+chr2	604150	1.0	0.0	1.0
+chr2	604153	0.0	3.0	3.0
+chr2	604160	0.0	2.0	2.0
+chr2	604534	0.0	1.0	1.0
+chr2	604541	0.0	4.0	4.0
+chr2	605144	1.0	0.0	1.0
+chr2	605231	1.0	0.0	1.0
+chr2	605608	2.0	0.0	2.0
+chr2	605755	0.0	1.0	1.0
+chr2	605760	2.0	0.0	2.0
+chr2	605766	0.0	1.0	1.0
+chr2	605768	0.0	2.0	2.0
+chr2	605776	1.0	0.0	1.0
+chr2	605777	0.0	1.0	1.0
+chr2	606071	0.0	1.0	1.0
+chr2	606720	0.0	1.0	1.0
+chr2	606823	0.0	1.0	1.0
+chr2	607501	1.0	0.0	1.0
+chr2	607515	1.0	0.0	1.0
+chr2	607518	0.0	1.0	1.0
+chr2	607525	0.0	1.0	1.0
+chr2	607530	1.0	0.0	1.0
+chr2	607532	1.0	0.0	1.0
+chr2	607533	0.0	1.0	1.0
+chr2	607539	1.0	0.0	1.0
+chr2	607649	1.0	0.0	1.0
+chr2	607693	1.0	0.0	1.0
+chr2	607704	1.0	0.0	1.0
+chr2	608163	1.0	0.0	1.0
+chr2	608189	1.0	0.0	1.0
+chr2	609118	0.0	1.0	1.0
+chr2	609157	0.0	1.0	1.0
+chr2	609159	1.0	0.0	1.0
+chr2	609160	1.0	0.0	1.0
+chr2	609161	0.0	1.0	1.0
+chr2	609170	0.0	1.0	1.0
+chr2	609174	1.0	0.0	1.0
+chr2	609175	0.0	1.0	1.0
+chr2	609201	1.0	0.0	1.0
+chr2	609231	0.0	1.0	1.0
+chr2	609365	1.0	0.0	1.0
+chr2	609383	0.0	1.0	1.0
+chr2	609389	0.0	1.0	1.0
+chr2	609391	1.0	0.0	1.0
+chr2	609527	0.0	1.0	1.0
+chr2	609537	0.0	1.0	1.0
+chr2	609545	1.0	1.0	2.0
+chr2	609559	1.0	0.0	1.0
+chr2	609562	1.0	0.0	1.0
+chr2	609563	0.0	1.0	1.0
+chr2	609675	0.0	1.0	1.0
+chr2	609682	0.0	1.0	1.0
+chr2	609687	1.0	0.0	1.0
+chr2	609697	3.0	0.0	3.0
+chr2	609700	0.0	1.0	1.0
+chr2	609701	0.0	1.0	1.0
+chr2	609703	0.0	1.0	1.0
+chr2	609704	1.0	0.0	1.0
+chr2	609705	1.0	0.0	1.0
+chr2	609709	1.0	0.0	1.0
+chr2	609710	3.0	0.0	3.0
+chr2	609711	0.0	1.0	1.0
+chr2	609721	0.0	1.0	1.0
+chr2	609724	0.0	1.0	1.0
+chr2	609725	1.0	0.0	1.0
+chr2	609726	4.0	1.0	5.0
+chr2	609727	0.0	2.0	2.0
+chr2	609735	0.0	1.0	1.0
+chr2	609738	0.0	1.0	1.0
+chr2	609739	1.0	0.0	1.0
+chr2	609746	0.0	2.0	2.0
+chr2	609748	0.0	1.0	1.0
+chr2	609769	1.0	0.0	1.0
+chr2	609957	0.0	1.0	1.0
+chr2	610064	0.0	1.0	1.0
+chr2	610099	0.0	1.0	1.0
+chr2	610109	0.0	1.0	1.0
+chr2	610119	1.0	0.0	1.0
+chr2	610130	0.0	1.0	1.0
+chr2	610133	3.0	0.0	3.0
+chr2	610138	3.0	0.0	3.0
+chr2	610147	0.0	1.0	1.0
+chr2	610173	1.0	0.0	1.0
+chr2	610204	1.0	0.0	1.0
+chr2	610332	0.0	1.0	1.0
+chr2	610337	1.0	0.0	1.0
+chr2	610346	1.0	0.0	1.0
+chr2	610348	1.0	0.0	1.0
+chr2	610432	0.0	1.0	1.0
+chr2	610668	0.0	1.0	1.0
+chr2	611017	0.0	1.0	1.0
+chr2	611030	0.0	3.0	3.0
+chr2	611187	1.0	0.0	1.0
+chr2	611270	0.0	1.0	1.0
+chr2	611339	1.0	0.0	1.0
+chr2	611504	1.0	0.0	1.0
+chr2	611550	0.0	1.0	1.0
+chr2	611684	0.0	1.0	1.0
+chr2	611733	1.0	0.0	1.0
+chr2	611762	0.0	1.0	1.0
+chr2	611773	0.0	1.0	1.0
+chr2	611783	1.0	0.0	1.0
+chr2	611822	0.0	1.0	1.0
+chr2	611845	2.0	0.0	2.0
+chr2	611847	0.0	1.0	1.0
+chr2	611850	0.0	1.0	1.0
+chr2	611851	1.0	0.0	1.0
+chr2	611856	1.0	0.0	1.0
+chr2	611858	0.0	2.0	2.0
+chr2	611861	6.0	0.0	6.0
+chr2	611866	1.0	0.0	1.0
+chr2	611872	1.0	0.0	1.0
+chr2	611873	1.0	0.0	1.0
+chr2	611874	0.0	1.0	1.0
+chr2	611877	0.0	1.0	1.0
+chr2	611907	1.0	0.0	1.0
+chr2	611997	1.0	0.0	1.0
+chr2	612007	1.0	0.0	1.0
+chr2	612548	0.0	1.0	1.0
+chr2	612649	1.0	0.0	1.0
+chr2	612652	1.0	0.0	1.0
+chr2	612723	1.0	0.0	1.0
+chr2	612994	0.0	1.0	1.0
+chr2	613224	0.0	1.0	1.0
+chr2	613570	0.0	1.0	1.0
+chr2	613638	0.0	1.0	1.0
+chr2	614482	1.0	0.0	1.0
+chr2	614637	1.0	0.0	1.0
+chr2	614638	1.0	0.0	1.0
+chr2	615002	1.0	0.0	1.0
+chr2	615312	0.0	1.0	1.0
+chr2	615320	1.0	0.0	1.0
+chr2	615362	1.0	0.0	1.0
+chr2	615393	1.0	0.0	1.0
+chr2	615431	0.0	1.0	1.0
+chr2	615452	1.0	0.0	1.0
+chr2	615515	0.0	1.0	1.0
+chr2	615809	0.0	1.0	1.0
+chr2	615810	0.0	1.0	1.0
+chr2	615811	1.0	0.0	1.0
+chr2	615818	3.0	1.0	4.0
+chr2	615820	3.0	0.0	3.0
+chr2	615821	1.0	0.0	1.0
+chr2	615829	0.0	1.0	1.0
+chr2	615838	1.0	0.0	1.0
+chr2	616279	1.0	0.0	1.0
+chr2	616960	1.0	0.0	1.0
+chr2	616998	1.0	0.0	1.0
+chr2	617030	0.0	1.0	1.0
+chr2	617045	0.0	1.0	1.0
+chr2	618350	0.0	1.0	1.0
+chr2	618357	1.0	0.0	1.0
+chr2	618364	1.0	0.0	1.0
+chr2	618366	0.0	1.0	1.0
+chr2	618376	1.0	0.0	1.0
+chr2	618427	0.0	2.0	2.0
+chr2	618488	0.0	4.0	4.0
+chr2	618500	0.0	1.0	1.0
+chr2	618501	0.0	1.0	1.0
+chr2	618507	0.0	1.0	1.0
+chr2	618516	4.0	0.0	4.0
+chr2	618517	5.0	0.0	5.0
+chr2	618518	0.0	1.0	1.0
+chr2	618520	4.0	0.0	4.0
+chr2	618526	0.0	10.0	10.0
+chr2	618527	0.0	4.0	4.0
+chr2	618528	1.0	4.0	5.0
+chr2	618532	3.0	0.0	3.0
+chr2	618533	1.0	0.0	1.0
+chr2	618535	1.0	0.0	1.0
+chr2	618536	0.0	1.0	1.0
+chr2	618537	0.0	2.0	2.0
+chr2	618541	1.0	0.0	1.0
+chr2	618544	0.0	1.0	1.0
+chr2	618548	0.0	1.0	1.0
+chr2	618551	1.0	0.0	1.0
+chr2	618820	0.0	1.0	1.0
+chr2	618835	2.0	0.0	2.0
+chr2	618836	2.0	0.0	2.0
+chr2	618838	3.0	0.0	3.0
+chr2	618844	1.0	0.0	1.0
+chr2	618845	7.0	0.0	7.0
+chr2	618846	0.0	3.0	3.0
+chr2	618847	2.0	2.0	4.0
+chr2	618848	0.0	1.0	1.0
+chr2	618852	0.0	2.0	2.0
+chr2	618853	0.0	1.0	1.0
+chr2	618856	3.0	1.0	4.0
+chr2	618857	2.0	0.0	2.0
+chr2	618858	0.0	2.0	2.0
+chr2	618863	0.0	2.0	2.0
+chr2	618865	0.0	1.0	1.0
+chr2	618866	0.0	1.0	1.0
+chr2	618868	0.0	5.0	5.0
+chr2	618869	1.0	0.0	1.0
+chr2	618870	1.0	0.0	1.0
+chr2	618871	1.0	0.0	1.0
+chr2	618882	1.0	0.0	1.0
+chr2	618891	1.0	0.0	1.0
+chr2	618916	0.0	1.0	1.0
+chr2	618997	0.0	1.0	1.0
+chr2	619006	1.0	0.0	1.0
+chr2	619018	1.0	0.0	1.0
+chr2	619020	1.0	0.0	1.0
+chr2	619024	1.0	0.0	1.0
+chr2	619027	0.0	1.0	1.0
+chr2	619321	1.0	0.0	1.0
+chr2	619749	0.0	1.0	1.0
+chr2	619798	1.0	0.0	1.0
+chr2	619834	1.0	0.0	1.0
+chr2	620378	1.0	0.0	1.0
+chr2	620386	1.0	0.0	1.0
+chr2	620547	0.0	1.0	1.0
+chr2	620662	1.0	0.0	1.0
+chr2	620830	0.0	1.0	1.0
+chr2	620835	1.0	0.0	1.0
+chr2	620851	2.0	0.0	2.0
+chr2	620859	0.0	1.0	1.0
+chr2	620862	0.0	1.0	1.0
+chr2	620863	2.0	0.0	2.0
+chr2	620871	1.0	0.0	1.0
+chr2	620873	1.0	0.0	1.0
+chr2	620879	1.0	0.0	1.0
+chr2	620953	0.0	1.0	1.0
+chr2	620979	1.0	0.0	1.0
+chr2	620987	0.0	1.0	1.0
+chr2	620988	0.0	1.0	1.0
+chr2	620996	1.0	0.0	1.0
+chr2	620997	1.0	0.0	1.0
+chr2	621011	1.0	0.0	1.0
+chr2	621013	1.0	0.0	1.0
+chr2	621017	0.0	1.0	1.0
+chr2	621021	0.0	1.0	1.0
+chr2	621169	0.0	1.0	1.0
+chr2	621318	0.0	1.0	1.0
+chr2	621336	1.0	0.0	1.0
+chr2	621340	0.0	1.0	1.0
+chr2	621356	0.0	2.0	2.0
+chr2	621538	0.0	1.0	1.0
+chr2	623041	0.0	3.0	3.0
+chr2	623067	0.0	2.0	2.0
+chr2	623085	1.0	0.0	1.0
+chr2	623186	0.0	1.0	1.0
+chr2	623197	0.0	1.0	1.0
+chr2	623198	0.0	1.0	1.0
+chr2	623204	1.0	0.0	1.0
+chr2	623465	1.0	0.0	1.0
+chr2	623470	1.0	0.0	1.0
+chr2	623472	1.0	0.0	1.0
+chr2	623479	0.0	1.0	1.0
+chr2	623483	1.0	0.0	1.0
+chr2	623484	0.0	1.0	1.0
+chr2	623493	0.0	1.0	1.0
+chr2	623496	0.0	1.0	1.0
+chr2	623598	0.0	1.0	1.0
+chr2	623628	0.0	1.0	1.0
+chr2	623631	1.0	0.0	1.0
+chr2	623632	0.0	1.0	1.0
+chr2	623639	0.0	1.0	1.0
+chr2	623640	0.0	1.0	1.0
+chr2	623646	1.0	1.0	2.0
+chr2	623647	0.0	1.0	1.0
+chr2	623649	1.0	0.0	1.0
+chr2	623654	0.0	2.0	2.0
+chr2	623656	0.0	1.0	1.0
+chr2	623657	2.0	0.0	2.0
+chr2	623665	0.0	1.0	1.0
+chr2	623670	0.0	1.0	1.0
+chr2	623826	1.0	0.0	1.0
+chr2	623942	0.0	1.0	1.0
+chr2	623943	1.0	0.0	1.0
+chr2	623958	1.0	0.0	1.0
+chr2	623977	1.0	0.0	1.0
+chr2	624009	1.0	0.0	1.0
+chr2	624117	1.0	1.0	2.0
+chr2	624132	0.0	2.0	2.0
+chr2	624133	1.0	0.0	1.0
+chr2	624138	1.0	0.0	1.0
+chr2	624141	2.0	0.0	2.0
+chr2	624281	3.0	0.0	3.0
+chr2	624338	1.0	0.0	1.0
+chr2	624463	1.0	0.0	1.0
+chr2	624473	0.0	2.0	2.0
+chr2	624590	1.0	0.0	1.0
+chr2	624596	1.0	0.0	1.0
+chr2	624629	1.0	0.0	1.0
+chr2	624631	0.0	1.0	1.0
+chr2	624632	0.0	1.0	1.0
+chr2	624644	1.0	0.0	1.0
+chr2	624648	1.0	0.0	1.0
+chr2	624650	0.0	2.0	2.0
+chr2	624655	1.0	0.0	1.0
+chr2	624659	2.0	0.0	2.0
+chr2	624665	1.0	0.0	1.0
+chr2	624672	1.0	0.0	1.0
+chr2	624684	1.0	0.0	1.0
+chr2	624729	0.0	1.0	1.0
+chr2	624821	0.0	1.0	1.0
+chr2	624831	1.0	0.0	1.0
+chr2	624835	1.0	0.0	1.0
+chr2	624862	1.0	0.0	1.0
+chr2	624864	0.0	1.0	1.0
+chr2	624899	0.0	1.0	1.0
+chr2	624920	1.0	0.0	1.0
+chr2	624941	0.0	1.0	1.0
+chr2	624969	1.0	0.0	1.0
+chr2	624996	1.0	0.0	1.0
+chr2	625036	0.0	2.0	2.0
+chr2	625037	0.0	1.0	1.0
+chr2	625052	0.0	1.0	1.0
+chr2	625053	0.0	1.0	1.0
+chr2	625054	0.0	1.0	1.0
+chr2	625268	0.0	1.0	1.0
+chr2	625323	0.0	3.0	3.0
+chr2	625325	0.0	1.0	1.0
+chr2	625326	1.0	0.0	1.0
+chr2	625337	1.0	0.0	1.0
+chr2	625349	0.0	1.0	1.0
+chr2	625354	0.0	3.0	3.0
+chr2	625355	1.0	0.0	1.0
+chr2	625362	0.0	1.0	1.0
+chr2	625365	1.0	0.0	1.0
+chr2	625369	1.0	0.0	1.0
+chr2	625371	1.0	0.0	1.0
+chr2	625372	0.0	1.0	1.0
+chr2	625373	1.0	0.0	1.0
+chr2	625383	0.0	1.0	1.0
+chr2	625388	0.0	1.0	1.0
+chr2	625679	1.0	0.0	1.0
+chr2	625693	1.0	0.0	1.0
+chr2	625705	0.0	2.0	2.0
+chr2	625711	0.0	1.0	1.0
+chr2	625733	0.0	3.0	3.0
+chr2	625742	1.0	0.0	1.0
+chr2	625743	0.0	1.0	1.0
+chr2	625754	2.0	0.0	2.0
+chr2	625778	1.0	0.0	1.0
+chr2	625790	0.0	2.0	2.0
+chr2	625887	1.0	0.0	1.0
+chr2	625901	1.0	0.0	1.0
+chr2	625909	1.0	0.0	1.0
+chr2	626030	1.0	0.0	1.0
+chr2	626035	0.0	1.0	1.0
+chr2	626061	1.0	0.0	1.0
+chr2	626107	2.0	0.0	2.0
+chr2	626179	1.0	0.0	1.0
+chr2	626403	0.0	1.0	1.0
+chr2	626707	1.0	0.0	1.0
+chr2	626723	1.0	0.0	1.0
+chr2	626835	1.0	0.0	1.0
+chr2	626861	0.0	1.0	1.0
+chr2	626893	1.0	0.0	1.0
+chr2	626969	1.0	0.0	1.0
+chr2	627033	1.0	0.0	1.0
+chr2	627185	0.0	1.0	1.0
+chr2	627203	1.0	0.0	1.0
+chr2	627255	0.0	1.0	1.0
+chr2	627264	0.0	2.0	2.0
+chr2	627285	1.0	0.0	1.0
+chr2	627353	0.0	1.0	1.0
+chr2	627511	0.0	1.0	1.0
+chr2	627709	1.0	0.0	1.0
+chr2	627903	0.0	1.0	1.0
+chr2	628019	0.0	1.0	1.0
+chr2	628030	1.0	0.0	1.0
+chr2	628224	0.0	1.0	1.0
+chr2	628746	1.0	0.0	1.0
+chr2	628755	1.0	0.0	1.0
+chr2	628836	1.0	0.0	1.0
+chr2	628991	0.0	1.0	1.0
+chr2	629138	0.0	1.0	1.0
+chr2	629149	1.0	0.0	1.0
+chr2	629168	0.0	2.0	2.0
+chr2	629174	0.0	1.0	1.0
+chr2	629178	1.0	1.0	2.0
+chr2	629199	0.0	1.0	1.0
+chr2	629207	1.0	0.0	1.0
+chr2	629231	0.0	1.0	1.0
+chr2	629330	1.0	0.0	1.0
+chr2	629349	1.0	0.0	1.0
+chr2	629373	1.0	0.0	1.0
+chr2	629378	1.0	0.0	1.0
+chr2	629399	1.0	0.0	1.0
+chr2	629413	0.0	1.0	1.0
+chr2	629422	0.0	1.0	1.0
+chr2	629462	1.0	0.0	1.0
+chr2	629500	1.0	0.0	1.0
+chr2	629526	1.0	0.0	1.0
+chr2	629579	0.0	1.0	1.0
+chr2	629627	2.0	0.0	2.0
+chr2	629647	0.0	1.0	1.0
+chr2	629662	0.0	1.0	1.0
+chr2	629695	1.0	0.0	1.0
+chr2	629701	1.0	0.0	1.0
+chr2	629736	1.0	0.0	1.0
+chr2	629755	1.0	0.0	1.0
+chr2	629765	1.0	0.0	1.0
+chr2	629766	1.0	0.0	1.0
+chr2	629775	0.0	1.0	1.0
+chr2	629787	1.0	0.0	1.0
+chr2	629798	1.0	0.0	1.0
+chr2	629803	0.0	1.0	1.0
+chr2	629808	1.0	0.0	1.0
+chr2	629825	0.0	2.0	2.0
+chr2	629828	0.0	1.0	1.0
+chr2	629832	0.0	1.0	1.0
+chr2	629904	0.0	1.0	1.0
+chr2	629926	1.0	0.0	1.0
+chr2	629946	0.0	1.0	1.0
+chr2	629977	0.0	2.0	2.0
+chr2	629984	1.0	1.0	2.0
+chr2	630010	0.0	1.0	1.0
+chr2	630013	0.0	1.0	1.0
+chr2	630016	1.0	0.0	1.0
+chr2	630017	1.0	0.0	1.0
+chr2	630023	1.0	0.0	1.0
+chr2	630025	1.0	0.0	1.0
+chr2	630027	1.0	0.0	1.0
+chr2	630034	1.0	0.0	1.0
+chr2	630045	1.0	0.0	1.0
+chr2	630046	1.0	0.0	1.0
+chr2	630047	1.0	3.0	4.0
+chr2	630053	1.0	0.0	1.0
+chr2	630103	0.0	1.0	1.0
+chr2	630182	1.0	0.0	1.0
+chr2	630191	0.0	1.0	1.0
+chr2	630196	2.0	0.0	2.0
+chr2	630205	0.0	2.0	2.0
+chr2	630206	1.0	1.0	2.0
+chr2	630220	0.0	1.0	1.0
+chr2	630222	1.0	0.0	1.0
+chr2	630223	1.0	0.0	1.0
+chr2	630251	1.0	0.0	1.0
+chr2	630262	0.0	1.0	1.0
+chr2	630293	1.0	0.0	1.0
+chr2	630295	0.0	1.0	1.0
+chr2	630349	0.0	2.0	2.0
+chr2	630383	0.0	2.0	2.0
+chr2	630393	3.0	0.0	3.0
+chr2	630407	0.0	1.0	1.0
+chr2	630412	0.0	1.0	1.0
+chr2	630446	0.0	2.0	2.0
+chr2	630466	0.0	1.0	1.0
+chr2	630507	1.0	0.0	1.0
+chr2	630531	1.0	0.0	1.0
+chr2	630544	1.0	0.0	1.0
+chr2	630546	0.0	1.0	1.0
+chr2	630616	2.0	0.0	2.0
+chr2	630631	0.0	1.0	1.0
+chr2	630713	0.0	1.0	1.0
+chr2	630720	1.0	0.0	1.0
+chr2	630735	1.0	0.0	1.0
+chr2	630768	0.0	1.0	1.0
+chr2	630911	1.0	0.0	1.0
+chr2	630921	0.0	1.0	1.0
+chr2	630949	0.0	1.0	1.0
+chr2	630968	2.0	0.0	2.0
+chr2	630985	1.0	0.0	1.0
+chr2	631000	1.0	0.0	1.0
+chr2	631001	0.0	1.0	1.0
+chr2	631070	0.0	1.0	1.0
+chr2	631088	0.0	1.0	1.0
+chr2	631092	1.0	0.0	1.0
+chr2	631100	1.0	0.0	1.0
+chr2	631101	1.0	0.0	1.0
+chr2	631103	1.0	0.0	1.0
+chr2	631109	0.0	2.0	2.0
+chr2	631239	0.0	1.0	1.0
+chr2	631258	0.0	1.0	1.0
+chr2	631268	0.0	1.0	1.0
+chr2	631435	1.0	0.0	1.0
+chr2	631439	2.0	0.0	2.0
+chr2	631441	1.0	0.0	1.0
+chr2	631445	0.0	2.0	2.0
+chr2	631446	0.0	1.0	1.0
+chr2	631473	1.0	0.0	1.0
+chr2	631486	1.0	0.0	1.0
+chr2	631598	1.0	0.0	1.0
+chr2	631609	1.0	0.0	1.0
+chr2	631624	0.0	1.0	1.0
+chr2	631635	0.0	1.0	1.0
+chr2	631637	1.0	0.0	1.0
+chr2	631651	0.0	1.0	1.0
+chr2	631658	0.0	1.0	1.0
+chr2	631683	1.0	0.0	1.0
+chr2	631694	1.0	0.0	1.0
+chr2	631737	1.0	0.0	1.0
+chr2	631777	2.0	0.0	2.0
+chr2	631807	1.0	0.0	1.0
+chr2	631868	1.0	0.0	1.0
+chr2	631886	0.0	1.0	1.0
+chr2	631925	0.0	1.0	1.0
+chr2	631928	0.0	1.0	1.0
+chr2	631933	1.0	0.0	1.0
+chr2	631934	0.0	2.0	2.0
+chr2	631938	1.0	0.0	1.0
+chr2	632167	1.0	0.0	1.0
+chr2	632230	1.0	0.0	1.0
+chr2	632338	0.0	1.0	1.0
+chr2	632342	1.0	0.0	1.0
+chr2	632357	1.0	0.0	1.0
+chr2	632527	0.0	1.0	1.0
+chr2	632575	1.0	0.0	1.0
+chr2	632668	1.0	0.0	1.0
+chr2	632696	1.0	0.0	1.0
+chr2	632699	0.0	1.0	1.0
+chr2	632719	1.0	0.0	1.0
+chr2	632821	0.0	1.0	1.0
+chr2	632824	0.0	1.0	1.0
+chr2	632849	0.0	1.0	1.0
+chr2	632863	0.0	2.0	2.0
+chr2	632866	0.0	1.0	1.0
+chr2	632876	0.0	1.0	1.0
+chr2	632879	1.0	0.0	1.0
+chr2	632917	0.0	1.0	1.0
+chr2	632947	0.0	1.0	1.0
+chr2	633027	1.0	0.0	1.0
+chr2	633028	1.0	0.0	1.0
+chr2	633031	2.0	0.0	2.0
+chr2	633037	0.0	1.0	1.0
+chr2	633038	0.0	1.0	1.0
+chr2	633045	0.0	3.0	3.0
+chr2	633046	1.0	0.0	1.0
+chr2	633047	0.0	1.0	1.0
+chr2	633192	1.0	0.0	1.0
+chr2	633208	0.0	1.0	1.0
+chr2	633209	0.0	1.0	1.0
+chr2	633211	1.0	0.0	1.0
+chr2	633214	0.0	1.0	1.0
+chr2	633217	0.0	1.0	1.0
+chr2	633237	2.0	0.0	2.0
+chr2	633341	0.0	1.0	1.0
+chr2	633342	0.0	1.0	1.0
+chr2	633346	2.0	0.0	2.0
+chr2	633351	0.0	1.0	1.0
+chr2	633358	4.0	0.0	4.0
+chr2	633360	3.0	1.0	4.0
+chr2	633365	1.0	0.0	1.0
+chr2	633366	3.0	0.0	3.0
+chr2	633367	6.0	0.0	6.0
+chr2	633369	0.0	4.0	4.0
+chr2	633370	3.0	1.0	4.0
+chr2	633371	0.0	1.0	1.0
+chr2	633372	2.0	0.0	2.0
+chr2	633373	1.0	0.0	1.0
+chr2	633374	0.0	1.0	1.0
+chr2	633375	0.0	4.0	4.0
+chr2	633377	1.0	0.0	1.0
+chr2	633378	1.0	4.0	5.0
+chr2	633379	1.0	0.0	1.0
+chr2	633382	2.0	3.0	5.0
+chr2	633383	0.0	3.0	3.0
+chr2	633385	0.0	1.0	1.0
+chr2	633388	0.0	1.0	1.0
+chr2	633405	0.0	1.0	1.0
+chr2	633420	1.0	0.0	1.0
+chr2	633569	1.0	0.0	1.0
+chr2	633595	1.0	0.0	1.0
+chr2	633598	0.0	1.0	1.0
+chr2	633612	1.0	0.0	1.0
+chr2	633618	0.0	2.0	2.0
+chr2	633621	0.0	1.0	1.0
+chr2	633624	0.0	1.0	1.0
+chr2	633627	4.0	0.0	4.0
+chr2	633628	3.0	0.0	3.0
+chr2	633629	1.0	0.0	1.0
+chr2	633633	1.0	0.0	1.0
+chr2	633635	3.0	1.0	4.0
+chr2	633637	0.0	2.0	2.0
+chr2	633638	1.0	0.0	1.0
+chr2	633643	1.0	0.0	1.0
+chr2	633651	1.0	0.0	1.0
+chr2	633795	2.0	0.0	2.0
+chr2	633805	1.0	0.0	1.0
+chr2	633810	0.0	1.0	1.0
+chr2	633815	1.0	0.0	1.0
+chr2	633821	1.0	0.0	1.0
+chr2	633857	1.0	0.0	1.0
+chr2	633967	1.0	0.0	1.0
+chr2	633987	1.0	0.0	1.0
+chr2	634398	1.0	0.0	1.0
+chr2	634649	0.0	1.0	1.0
+chr2	634653	1.0	0.0	1.0
+chr2	634659	1.0	0.0	1.0
+chr2	634817	1.0	0.0	1.0
+chr2	634818	1.0	0.0	1.0
+chr2	634821	1.0	0.0	1.0
+chr2	634822	1.0	0.0	1.0
+chr2	634829	1.0	0.0	1.0
+chr2	634833	2.0	0.0	2.0
+chr2	634842	0.0	1.0	1.0
+chr2	634844	1.0	0.0	1.0
+chr2	634847	0.0	1.0	1.0
+chr2	634851	1.0	0.0	1.0
+chr2	634857	0.0	1.0	1.0
+chr2	634861	1.0	0.0	1.0
+chr2	635104	0.0	1.0	1.0
+chr2	635105	1.0	0.0	1.0
+chr2	635107	0.0	2.0	2.0
+chr2	635125	0.0	2.0	2.0
+chr2	635140	0.0	1.0	1.0
+chr2	635272	0.0	1.0	1.0
+chr2	635298	0.0	1.0	1.0
+chr2	635305	0.0	1.0	1.0
+chr2	635453	1.0	0.0	1.0
+chr2	636667	1.0	0.0	1.0
+chr2	636690	0.0	1.0	1.0
+chr2	636906	1.0	0.0	1.0
+chr2	636913	0.0	1.0	1.0
+chr2	636932	0.0	1.0	1.0
+chr2	636947	1.0	0.0	1.0
+chr2	637008	2.0	0.0	2.0
+chr2	637045	1.0	0.0	1.0
+chr2	637048	2.0	0.0	2.0
+chr2	637056	1.0	0.0	1.0
+chr2	637224	0.0	2.0	2.0
+chr2	637281	0.0	1.0	1.0
+chr2	637397	1.0	0.0	1.0
+chr2	638002	0.0	1.0	1.0
+chr2	638053	1.0	0.0	1.0
+chr2	638102	0.0	1.0	1.0
+chr2	638129	1.0	0.0	1.0
+chr2	638827	2.0	0.0	2.0
+chr2	639195	1.0	0.0	1.0
+chr2	639353	1.0	0.0	1.0
+chr2	639603	0.0	1.0	1.0
+chr2	639625	1.0	0.0	1.0
+chr2	639888	0.0	1.0	1.0
+chr2	640042	1.0	0.0	1.0
+chr2	640626	0.0	1.0	1.0
+chr2	640706	0.0	1.0	1.0
+chr2	640789	1.0	0.0	1.0
+chr2	641296	0.0	1.0	1.0
+chr2	641589	0.0	1.0	1.0
+chr2	641705	1.0	0.0	1.0
+chr2	641791	0.0	1.0	1.0
+chr2	641874	0.0	1.0	1.0
+chr2	641902	0.0	1.0	1.0
+chr2	641903	0.0	3.0	3.0
+chr2	641910	1.0	0.0	1.0
+chr2	641926	1.0	0.0	1.0
+chr2	641927	0.0	1.0	1.0
+chr2	641929	1.0	0.0	1.0
+chr2	641940	0.0	1.0	1.0
+chr2	641942	1.0	0.0	1.0
+chr2	641964	1.0	0.0	1.0
+chr2	642071	0.0	1.0	1.0
+chr2	642088	1.0	0.0	1.0
+chr2	642094	0.0	1.0	1.0
+chr2	642363	0.0	1.0	1.0
+chr2	642514	0.0	1.0	1.0
+chr2	642558	1.0	0.0	1.0
+chr2	642562	0.0	1.0	1.0
+chr2	642579	1.0	0.0	1.0
+chr2	642583	2.0	0.0	2.0
+chr2	642585	0.0	1.0	1.0
+chr2	642589	0.0	1.0	1.0
+chr2	642590	1.0	0.0	1.0
+chr2	642594	0.0	1.0	1.0
+chr2	642601	1.0	0.0	1.0
+chr2	642602	0.0	1.0	1.0
+chr2	642603	2.0	4.0	6.0
+chr2	642606	2.0	0.0	2.0
+chr2	642607	1.0	0.0	1.0
+chr2	642609	0.0	1.0	1.0
+chr2	642618	1.0	0.0	1.0
+chr2	642619	1.0	2.0	3.0
+chr2	642631	0.0	1.0	1.0
+chr2	642916	0.0	1.0	1.0
+chr2	643203	1.0	0.0	1.0
+chr2	643219	1.0	0.0	1.0
+chr2	643226	0.0	1.0	1.0
+chr2	643238	1.0	0.0	1.0
+chr2	643331	2.0	0.0	2.0
+chr2	643347	0.0	1.0	1.0
+chr2	643384	1.0	0.0	1.0
+chr2	643387	1.0	0.0	1.0
+chr2	643403	0.0	1.0	1.0
+chr2	643451	1.0	0.0	1.0
+chr2	643545	0.0	1.0	1.0
+chr2	643588	2.0	0.0	2.0
+chr2	643604	1.0	0.0	1.0
+chr2	643611	0.0	1.0	1.0
+chr2	643623	1.0	0.0	1.0
+chr2	643630	0.0	1.0	1.0
+chr2	643638	3.0	0.0	3.0
+chr2	643639	2.0	0.0	2.0
+chr2	643655	0.0	1.0	1.0
+chr2	643656	0.0	1.0	1.0
+chr2	643660	0.0	2.0	2.0
+chr2	643666	1.0	0.0	1.0
+chr2	643670	0.0	1.0	1.0
+chr2	643678	3.0	0.0	3.0
+chr2	643679	1.0	2.0	3.0
+chr2	643681	1.0	0.0	1.0
+chr2	643685	0.0	1.0	1.0
+chr2	643687	0.0	2.0	2.0
+chr2	643690	0.0	1.0	1.0
+chr2	643694	1.0	0.0	1.0
+chr2	643695	0.0	1.0	1.0
+chr2	643696	0.0	2.0	2.0
+chr2	643697	1.0	0.0	1.0
+chr2	643698	1.0	0.0	1.0
+chr2	643699	3.0	0.0	3.0
+chr2	643700	0.0	1.0	1.0
+chr2	643702	0.0	4.0	4.0
+chr2	643704	4.0	0.0	4.0
+chr2	643705	0.0	3.0	3.0
+chr2	643706	4.0	1.0	5.0
+chr2	643707	4.0	0.0	4.0
+chr2	643708	0.0	3.0	3.0
+chr2	643709	0.0	1.0	1.0
+chr2	643711	0.0	2.0	2.0
+chr2	643720	1.0	0.0	1.0
+chr2	643722	2.0	1.0	3.0
+chr2	643723	0.0	1.0	1.0
+chr2	643727	0.0	3.0	3.0
+chr2	643729	0.0	1.0	1.0
+chr2	643732	4.0	0.0	4.0
+chr2	643735	2.0	0.0	2.0
+chr2	643739	1.0	0.0	1.0
+chr2	643742	0.0	1.0	1.0
+chr2	643743	1.0	0.0	1.0
+chr2	643745	1.0	0.0	1.0
+chr2	643753	1.0	0.0	1.0
+chr2	643758	0.0	1.0	1.0
+chr2	643759	1.0	0.0	1.0
+chr2	643762	0.0	1.0	1.0
+chr2	643768	1.0	0.0	1.0
+chr2	643776	1.0	0.0	1.0
+chr2	643777	0.0	2.0	2.0
+chr2	643780	0.0	1.0	1.0
+chr2	643781	0.0	2.0	2.0
+chr2	643790	1.0	0.0	1.0
+chr2	643802	1.0	0.0	1.0
+chr2	643803	1.0	0.0	1.0
+chr2	643807	4.0	0.0	4.0
+chr2	643811	1.0	0.0	1.0
+chr2	643819	1.0	0.0	1.0
+chr2	643829	1.0	0.0	1.0
+chr2	643843	2.0	0.0	2.0
+chr2	644107	2.0	0.0	2.0
+chr2	644109	0.0	1.0	1.0
+chr2	644132	1.0	0.0	1.0
+chr2	644174	0.0	2.0	2.0
+chr2	644182	1.0	1.0	2.0
+chr2	644342	1.0	0.0	1.0
+chr2	644345	0.0	1.0	1.0
+chr2	644636	0.0	1.0	1.0
+chr2	644648	1.0	0.0	1.0
+chr2	644651	1.0	0.0	1.0
+chr2	644665	0.0	2.0	2.0
+chr2	644666	0.0	1.0	1.0
+chr2	644669	1.0	0.0	1.0
+chr2	644677	0.0	1.0	1.0
+chr2	644685	0.0	1.0	1.0
+chr2	644751	1.0	0.0	1.0
+chr2	644779	1.0	0.0	1.0
+chr2	644790	0.0	1.0	1.0
+chr2	644816	1.0	0.0	1.0
+chr2	644818	0.0	1.0	1.0
+chr2	644829	0.0	1.0	1.0
+chr2	644831	0.0	3.0	3.0
+chr2	644840	0.0	1.0	1.0
+chr2	644938	1.0	0.0	1.0
+chr2	644952	0.0	1.0	1.0
+chr2	644954	0.0	2.0	2.0
+chr2	644957	1.0	0.0	1.0
+chr2	644963	0.0	1.0	1.0
+chr2	644966	0.0	1.0	1.0
+chr2	644968	0.0	1.0	1.0
+chr2	644985	0.0	1.0	1.0
+chr2	644989	2.0	0.0	2.0
+chr2	644992	1.0	0.0	1.0
+chr2	644997	0.0	1.0	1.0
+chr2	645001	2.0	1.0	3.0
+chr2	645002	1.0	0.0	1.0
+chr2	645004	2.0	0.0	2.0
+chr2	645010	0.0	1.0	1.0
+chr2	645016	1.0	0.0	1.0
+chr2	645022	0.0	1.0	1.0
+chr2	645033	1.0	0.0	1.0
+chr2	645326	0.0	1.0	1.0
+chr2	645338	0.0	1.0	1.0
+chr2	645364	0.0	1.0	1.0
+chr2	645370	1.0	0.0	1.0
+chr2	645371	2.0	0.0	2.0
+chr2	645377	0.0	1.0	1.0
+chr2	645386	1.0	0.0	1.0
+chr2	645527	0.0	1.0	1.0
+chr2	645533	1.0	1.0	2.0
+chr2	645534	0.0	1.0	1.0
+chr2	645539	0.0	1.0	1.0
+chr2	645541	1.0	0.0	1.0
+chr2	645542	0.0	1.0	1.0
+chr2	645543	2.0	0.0	2.0
+chr2	645544	0.0	1.0	1.0
+chr2	645547	0.0	1.0	1.0
+chr2	645550	1.0	0.0	1.0
+chr2	645554	1.0	0.0	1.0
+chr2	645555	1.0	0.0	1.0
+chr2	645559	1.0	0.0	1.0
+chr2	645572	0.0	1.0	1.0
+chr2	645576	0.0	1.0	1.0
+chr2	645597	1.0	0.0	1.0
+chr2	645600	1.0	0.0	1.0
+chr2	645636	0.0	1.0	1.0
+chr2	645702	0.0	1.0	1.0
+chr2	645717	0.0	1.0	1.0
+chr2	645729	1.0	0.0	1.0
+chr2	645787	0.0	1.0	1.0
+chr2	645793	0.0	1.0	1.0
+chr2	645795	0.0	1.0	1.0
+chr2	645821	0.0	1.0	1.0
+chr2	645828	1.0	0.0	1.0
+chr2	645848	1.0	0.0	1.0
+chr2	646370	1.0	0.0	1.0
+chr2	646372	0.0	1.0	1.0
+chr2	647027	0.0	1.0	1.0
+chr2	647029	1.0	0.0	1.0
+chr2	647048	0.0	1.0	1.0
+chr2	647157	0.0	1.0	1.0
+chr2	647171	0.0	1.0	1.0
+chr2	647172	0.0	3.0	3.0
+chr2	647175	1.0	0.0	1.0
+chr2	647180	0.0	1.0	1.0
+chr2	647184	2.0	2.0	4.0
+chr2	647185	1.0	0.0	1.0
+chr2	647186	5.0	0.0	5.0
+chr2	647188	1.0	0.0	1.0
+chr2	647189	0.0	5.0	5.0
+chr2	647190	0.0	2.0	2.0
+chr2	647193	0.0	4.0	4.0
+chr2	647194	1.0	0.0	1.0
+chr2	647195	2.0	0.0	2.0
+chr2	647200	1.0	0.0	1.0
+chr2	647201	3.0	0.0	3.0
+chr2	647205	1.0	0.0	1.0
+chr2	647207	0.0	1.0	1.0
+chr2	647213	0.0	1.0	1.0
+chr2	647220	2.0	0.0	2.0
+chr2	647240	3.0	0.0	3.0
+chr2	647401	0.0	1.0	1.0
+chr2	647486	1.0	0.0	1.0
+chr2	647492	1.0	0.0	1.0
+chr2	647497	1.0	0.0	1.0
+chr2	647499	0.0	3.0	3.0
+chr2	647500	0.0	1.0	1.0
+chr2	647502	2.0	0.0	2.0
+chr2	647511	0.0	2.0	2.0
+chr2	647885	1.0	0.0	1.0
+chr2	647895	0.0	1.0	1.0
+chr2	647982	0.0	1.0	1.0
+chr2	647989	0.0	1.0	1.0
+chr2	647994	0.0	1.0	1.0
+chr2	648038	1.0	0.0	1.0
+chr2	648173	1.0	0.0	1.0
+chr2	648203	1.0	0.0	1.0
+chr2	648467	1.0	0.0	1.0
+chr2	649060	1.0	0.0	1.0
+chr2	649192	1.0	0.0	1.0
+chr2	649523	0.0	2.0	2.0
+chr2	649545	1.0	0.0	1.0
+chr2	649642	1.0	0.0	1.0
+chr2	649866	0.0	1.0	1.0
+chr2	650042	0.0	1.0	1.0
+chr2	650237	2.0	0.0	2.0
+chr2	650240	1.0	0.0	1.0
+chr2	650244	1.0	0.0	1.0
+chr2	650276	0.0	2.0	2.0
+chr2	650285	1.0	0.0	1.0
+chr2	650314	0.0	1.0	1.0
+chr2	650332	0.0	1.0	1.0
+chr2	650333	0.0	2.0	2.0
+chr2	650339	0.0	1.0	1.0
+chr2	650341	1.0	0.0	1.0
+chr2	650343	1.0	0.0	1.0
+chr2	650353	1.0	0.0	1.0
+chr2	650355	0.0	1.0	1.0
+chr2	650365	0.0	2.0	2.0
+chr2	650370	0.0	1.0	1.0
+chr2	650431	1.0	0.0	1.0
+chr2	650470	1.0	0.0	1.0
+chr2	650473	1.0	0.0	1.0
+chr2	650482	0.0	1.0	1.0
+chr2	650499	0.0	2.0	2.0
+chr2	650506	0.0	1.0	1.0
+chr2	650632	2.0	0.0	2.0
+chr2	650646	1.0	0.0	1.0
+chr2	650683	1.0	0.0	1.0
+chr2	650690	2.0	0.0	2.0
+chr2	650806	1.0	0.0	1.0
+chr2	650856	0.0	1.0	1.0
+chr2	650907	0.0	1.0	1.0
+chr2	650932	0.0	1.0	1.0
+chr2	650935	1.0	0.0	1.0
+chr2	651030	1.0	1.0	2.0
+chr2	651035	1.0	0.0	1.0
+chr2	651040	2.0	0.0	2.0
+chr2	651072	1.0	0.0	1.0
+chr2	651079	0.0	8.0	8.0
+chr2	651102	1.0	0.0	1.0
+chr2	651111	0.0	3.0	3.0
+chr2	651126	0.0	1.0	1.0
+chr2	651316	1.0	0.0	1.0
+chr2	651319	0.0	1.0	1.0
+chr2	651335	1.0	0.0	1.0
+chr2	651342	0.0	1.0	1.0
+chr2	651347	4.0	0.0	4.0
+chr2	651353	1.0	0.0	1.0
+chr2	651363	0.0	1.0	1.0
+chr2	651365	1.0	0.0	1.0
+chr2	651366	0.0	2.0	2.0
+chr2	651376	0.0	2.0	2.0
+chr2	651377	0.0	2.0	2.0
+chr2	651379	1.0	0.0	1.0
+chr2	651382	2.0	0.0	2.0
+chr2	651385	0.0	2.0	2.0
+chr2	651483	1.0	0.0	1.0
+chr2	651524	1.0	0.0	1.0
+chr2	651528	0.0	1.0	1.0
+chr2	651534	0.0	1.0	1.0
+chr2	651539	1.0	0.0	1.0
+chr2	651546	0.0	1.0	1.0
+chr2	651644	0.0	1.0	1.0
+chr2	651686	0.0	1.0	1.0
+chr2	651718	1.0	0.0	1.0
+chr2	651773	0.0	1.0	1.0
+chr2	651814	0.0	1.0	1.0
+chr2	651991	0.0	1.0	1.0
+chr2	652209	0.0	1.0	1.0
+chr2	652294	1.0	0.0	1.0
+chr2	652381	1.0	0.0	1.0
+chr2	652481	1.0	0.0	1.0
+chr2	652562	1.0	0.0	1.0
+chr2	652689	1.0	0.0	1.0
+chr2	652713	2.0	0.0	2.0
+chr2	652723	1.0	0.0	1.0
+chr2	652724	2.0	0.0	2.0
+chr2	652725	1.0	0.0	1.0
+chr2	652736	1.0	0.0	1.0
+chr2	652740	0.0	1.0	1.0
+chr2	652742	0.0	1.0	1.0
+chr2	652743	1.0	2.0	3.0
+chr2	652756	0.0	1.0	1.0
+chr2	652761	0.0	1.0	1.0
+chr2	652810	1.0	0.0	1.0
+chr2	652915	0.0	1.0	1.0
+chr2	652925	0.0	2.0	2.0
+chr2	652931	0.0	1.0	1.0
+chr2	652941	1.0	0.0	1.0
+chr2	652963	0.0	1.0	1.0
+chr2	653066	1.0	0.0	1.0
+chr2	653290	1.0	0.0	1.0
+chr2	653315	0.0	1.0	1.0
+chr2	653326	1.0	0.0	1.0
+chr2	653329	1.0	0.0	1.0
+chr2	653330	1.0	0.0	1.0
+chr2	653331	1.0	0.0	1.0
+chr2	653337	5.0	0.0	5.0
+chr2	653339	0.0	1.0	1.0
+chr2	653340	0.0	1.0	1.0
+chr2	653342	1.0	0.0	1.0
+chr2	653345	0.0	1.0	1.0
+chr2	653346	1.0	2.0	3.0
+chr2	653348	1.0	0.0	1.0
+chr2	653349	5.0	0.0	5.0
+chr2	653350	0.0	1.0	1.0
+chr2	653352	0.0	2.0	2.0
+chr2	653353	0.0	5.0	5.0
+chr2	653354	0.0	4.0	4.0
+chr2	653355	0.0	8.0	8.0
+chr2	653358	0.0	3.0	3.0
+chr2	653359	0.0	1.0	1.0
+chr2	653360	2.0	0.0	2.0
+chr2	653361	1.0	0.0	1.0
+chr2	653363	0.0	2.0	2.0
+chr2	653364	0.0	1.0	1.0
+chr2	653366	2.0	0.0	2.0
+chr2	653371	1.0	0.0	1.0
+chr2	653376	0.0	1.0	1.0
+chr2	653377	0.0	1.0	1.0
+chr2	653379	1.0	0.0	1.0
+chr2	653413	1.0	0.0	1.0
+chr2	653417	1.0	0.0	1.0
+chr2	653504	0.0	2.0	2.0
+chr2	653506	0.0	1.0	1.0
+chr2	653518	0.0	1.0	1.0
+chr2	653529	0.0	1.0	1.0
+chr2	653534	1.0	0.0	1.0
+chr2	653536	1.0	0.0	1.0
+chr2	653680	1.0	0.0	1.0
+chr2	653694	1.0	0.0	1.0
+chr2	653710	1.0	0.0	1.0
+chr2	653727	0.0	1.0	1.0
+chr2	653731	1.0	0.0	1.0
+chr2	653740	2.0	0.0	2.0
+chr2	653794	0.0	1.0	1.0
+chr2	654253	0.0	1.0	1.0
+chr2	654535	1.0	0.0	1.0
+chr2	655145	0.0	1.0	1.0
+chr2	655994	1.0	0.0	1.0
+chr2	656005	1.0	0.0	1.0
+chr2	656022	2.0	0.0	2.0
+chr2	656049	1.0	0.0	1.0
+chr2	656651	1.0	0.0	1.0
+chr2	656741	6.0	0.0	6.0
+chr2	656941	1.0	0.0	1.0
+chr2	657093	1.0	0.0	1.0
+chr2	657214	0.0	3.0	3.0
+chr2	657228	0.0	1.0	1.0
+chr2	657235	0.0	1.0	1.0
+chr2	657262	1.0	0.0	1.0
+chr2	657265	0.0	1.0	1.0
+chr2	657376	0.0	1.0	1.0
+chr2	657389	0.0	1.0	1.0
+chr2	657409	0.0	1.0	1.0
+chr2	657415	1.0	0.0	1.0
+chr2	657428	0.0	1.0	1.0
+chr2	657526	1.0	0.0	1.0
+chr2	657528	1.0	0.0	1.0
+chr2	657545	1.0	0.0	1.0
+chr2	657558	0.0	1.0	1.0
+chr2	657565	0.0	1.0	1.0
+chr2	657569	0.0	1.0	1.0
+chr2	657573	0.0	2.0	2.0
+chr2	657580	1.0	0.0	1.0
+chr2	657582	0.0	1.0	1.0
+chr2	657583	1.0	0.0	1.0
+chr2	657588	1.0	0.0	1.0
+chr2	657591	2.0	0.0	2.0
+chr2	657599	0.0	3.0	3.0
+chr2	657601	1.0	0.0	1.0
+chr2	657607	0.0	1.0	1.0
+chr2	657609	0.0	1.0	1.0
+chr2	657623	1.0	0.0	1.0
+chr2	657666	0.0	1.0	1.0
+chr2	657801	2.0	0.0	2.0
+chr2	657802	0.0	1.0	1.0
+chr2	657806	0.0	1.0	1.0
+chr2	657809	0.0	2.0	2.0
+chr2	657814	2.0	0.0	2.0
+chr2	657816	0.0	2.0	2.0
+chr2	657822	1.0	0.0	1.0
+chr2	657824	2.0	0.0	2.0
+chr2	657825	0.0	2.0	2.0
+chr2	657827	1.0	0.0	1.0
+chr2	657828	1.0	0.0	1.0
+chr2	657831	0.0	2.0	2.0
+chr2	657836	0.0	2.0	2.0
+chr2	657837	0.0	1.0	1.0
+chr2	657849	2.0	0.0	2.0
+chr2	657851	5.0	0.0	5.0
+chr2	657852	1.0	0.0	1.0
+chr2	657855	1.0	0.0	1.0
+chr2	657868	1.0	0.0	1.0
+chr2	657992	0.0	1.0	1.0
+chr2	657995	0.0	1.0	1.0
+chr2	657998	1.0	0.0	1.0
+chr2	657999	0.0	3.0	3.0
+chr2	658016	0.0	1.0	1.0
+chr2	658023	1.0	0.0	1.0
+chr2	658034	1.0	0.0	1.0
+chr2	658037	0.0	1.0	1.0
+chr2	658046	0.0	1.0	1.0
+chr2	658151	0.0	1.0	1.0
+chr2	658156	1.0	0.0	1.0
+chr2	658187	0.0	1.0	1.0
+chr2	658289	1.0	0.0	1.0
+chr2	658502	1.0	0.0	1.0
+chr2	658513	1.0	0.0	1.0
+chr2	658535	1.0	0.0	1.0
+chr2	658551	0.0	1.0	1.0
+chr2	658997	1.0	0.0	1.0
+chr2	659343	1.0	0.0	1.0
+chr2	659489	0.0	1.0	1.0
+chr2	659570	0.0	1.0	1.0
+chr2	659691	0.0	1.0	1.0
+chr2	660135	1.0	0.0	1.0
+chr2	660167	0.0	1.0	1.0
+chr2	660530	1.0	0.0	1.0
+chr2	660799	0.0	1.0	1.0
+chr2	660866	1.0	0.0	1.0
+chr2	660953	1.0	0.0	1.0
+chr2	660969	0.0	1.0	1.0
+chr2	661008	0.0	1.0	1.0
+chr2	661085	0.0	1.0	1.0
+chr2	661335	0.0	1.0	1.0
+chr2	661400	1.0	0.0	1.0
+chr2	661412	0.0	1.0	1.0
+chr2	661419	1.0	0.0	1.0
+chr2	661430	0.0	1.0	1.0
+chr2	661476	1.0	0.0	1.0
+chr2	661480	0.0	1.0	1.0
+chr2	661560	1.0	0.0	1.0
+chr2	661566	1.0	0.0	1.0
+chr2	661586	2.0	0.0	2.0
+chr2	661590	1.0	0.0	1.0
+chr2	661604	0.0	1.0	1.0
+chr2	661607	2.0	0.0	2.0
+chr2	661608	1.0	0.0	1.0
+chr2	661623	1.0	0.0	1.0
+chr2	661626	0.0	1.0	1.0
+chr2	661632	1.0	0.0	1.0
+chr2	661637	0.0	1.0	1.0
+chr2	661656	1.0	0.0	1.0
+chr2	661657	0.0	1.0	1.0
+chr2	661675	1.0	0.0	1.0
+chr2	661681	1.0	0.0	1.0
+chr2	661754	1.0	0.0	1.0
+chr2	661757	0.0	1.0	1.0
+chr2	661760	1.0	0.0	1.0
+chr2	661761	1.0	0.0	1.0
+chr2	661811	0.0	1.0	1.0
+chr2	661812	1.0	0.0	1.0
+chr2	661813	1.0	0.0	1.0
+chr2	661827	0.0	1.0	1.0
+chr2	661830	1.0	0.0	1.0
+chr2	661837	0.0	2.0	2.0
+chr2	661844	2.0	0.0	2.0
+chr2	661845	0.0	1.0	1.0
+chr2	661873	1.0	0.0	1.0
+chr2	661877	1.0	0.0	1.0
+chr2	662007	0.0	1.0	1.0
+chr2	662028	1.0	0.0	1.0
+chr2	662041	0.0	1.0	1.0
+chr2	662052	2.0	0.0	2.0
+chr2	662053	1.0	0.0	1.0
+chr2	662056	2.0	0.0	2.0
+chr2	662060	0.0	1.0	1.0
+chr2	662090	0.0	1.0	1.0
+chr2	662173	1.0	0.0	1.0
+chr2	662177	0.0	1.0	1.0
+chr2	662196	0.0	2.0	2.0
+chr2	662198	0.0	1.0	1.0
+chr2	662214	1.0	0.0	1.0
+chr2	662216	1.0	0.0	1.0
+chr2	662219	1.0	0.0	1.0
+chr2	662221	0.0	1.0	1.0
+chr2	662249	0.0	1.0	1.0
+chr2	662281	1.0	0.0	1.0
+chr2	662388	0.0	2.0	2.0
+chr2	662433	1.0	0.0	1.0
+chr2	662449	0.0	1.0	1.0
+chr2	662886	1.0	0.0	1.0
+chr2	662887	1.0	0.0	1.0
+chr2	662890	1.0	0.0	1.0
+chr2	662897	0.0	1.0	1.0
+chr2	662903	0.0	1.0	1.0
+chr2	662914	1.0	0.0	1.0
+chr2	662916	1.0	0.0	1.0
+chr2	662928	0.0	1.0	1.0
+chr2	662930	1.0	0.0	1.0
+chr2	662937	0.0	1.0	1.0
+chr2	663049	1.0	0.0	1.0
+chr2	663065	1.0	0.0	1.0
+chr2	663086	0.0	1.0	1.0
+chr2	663098	0.0	1.0	1.0
+chr2	663103	1.0	0.0	1.0
+chr2	663111	2.0	0.0	2.0
+chr2	663214	1.0	0.0	1.0
+chr2	663259	0.0	1.0	1.0
+chr2	663391	0.0	1.0	1.0
+chr2	663410	0.0	1.0	1.0
+chr2	663420	0.0	2.0	2.0
+chr2	663507	0.0	1.0	1.0
+chr2	663574	0.0	1.0	1.0
+chr2	663777	0.0	1.0	1.0
+chr2	663902	1.0	0.0	1.0
+chr2	664038	0.0	1.0	1.0
+chr2	664191	0.0	1.0	1.0
+chr2	664197	1.0	0.0	1.0
+chr2	664358	0.0	1.0	1.0
+chr2	664360	1.0	0.0	1.0
+chr2	664495	1.0	0.0	1.0
+chr2	664513	1.0	0.0	1.0
+chr2	664524	0.0	2.0	2.0
+chr2	664526	1.0	0.0	1.0
+chr2	664532	1.0	0.0	1.0
+chr2	664537	1.0	0.0	1.0
+chr2	664556	0.0	1.0	1.0
+chr2	664638	0.0	1.0	1.0
+chr2	664651	1.0	0.0	1.0
+chr2	664657	1.0	0.0	1.0
+chr2	664672	0.0	2.0	2.0
+chr2	664673	1.0	0.0	1.0
+chr2	664677	1.0	0.0	1.0
+chr2	664678	1.0	0.0	1.0
+chr2	664679	1.0	0.0	1.0
+chr2	664685	1.0	0.0	1.0
+chr2	664687	2.0	0.0	2.0
+chr2	664691	1.0	0.0	1.0
+chr2	664694	0.0	2.0	2.0
+chr2	664695	1.0	0.0	1.0
+chr2	664696	6.0	2.0	8.0
+chr2	664702	1.0	0.0	1.0
+chr2	664705	3.0	1.0	4.0
+chr2	664708	1.0	0.0	1.0
+chr2	664712	1.0	0.0	1.0
+chr2	664727	0.0	1.0	1.0
+chr2	664731	1.0	0.0	1.0
+chr2	664736	0.0	1.0	1.0
+chr2	664788	0.0	1.0	1.0
+chr2	664844	1.0	0.0	1.0
+chr2	665154	1.0	0.0	1.0
+chr2	665181	0.0	1.0	1.0
+chr2	665305	1.0	0.0	1.0
+chr2	665388	0.0	2.0	2.0
+chr2	665462	0.0	1.0	1.0
+chr2	665608	0.0	1.0	1.0
+chr2	665771	1.0	0.0	1.0
+chr2	665893	1.0	0.0	1.0
+chr2	666200	0.0	2.0	2.0
+chr2	666403	2.0	0.0	2.0
+chr2	666420	2.0	0.0	2.0
+chr2	666429	0.0	1.0	1.0
+chr2	666432	0.0	1.0	1.0
+chr2	666435	0.0	1.0	1.0
+chr2	666437	0.0	1.0	1.0
+chr2	666442	0.0	1.0	1.0
+chr2	666689	1.0	0.0	1.0
+chr2	666695	1.0	0.0	1.0
+chr2	666703	0.0	1.0	1.0
+chr2	666705	2.0	0.0	2.0
+chr2	666719	1.0	1.0	2.0
+chr2	666736	1.0	0.0	1.0
+chr2	666834	0.0	1.0	1.0
+chr2	666849	0.0	1.0	1.0
+chr2	666853	1.0	0.0	1.0
+chr2	667027	1.0	0.0	1.0
+chr2	667028	1.0	0.0	1.0
+chr2	667066	0.0	1.0	1.0
+chr2	667189	3.0	0.0	3.0
+chr2	667682	0.0	1.0	1.0
+chr2	667833	1.0	0.0	1.0
+chr2	667942	1.0	0.0	1.0
+chr2	667957	0.0	1.0	1.0
+chr2	668202	0.0	2.0	2.0
+chr2	668332	1.0	0.0	1.0
+chr2	668345	0.0	1.0	1.0
+chr2	668349	1.0	0.0	1.0
+chr2	668350	1.0	1.0	2.0
+chr2	668351	3.0	0.0	3.0
+chr2	668358	0.0	2.0	2.0
+chr2	668359	0.0	1.0	1.0
+chr2	668360	0.0	1.0	1.0
+chr2	668365	1.0	0.0	1.0
+chr2	668376	0.0	1.0	1.0
+chr2	668380	1.0	0.0	1.0
+chr2	668579	0.0	2.0	2.0
+chr2	668626	0.0	3.0	3.0
+chr2	668646	1.0	0.0	1.0
+chr2	668664	0.0	1.0	1.0
+chr2	668708	0.0	2.0	2.0
+chr2	668887	1.0	0.0	1.0
+chr2	668903	1.0	0.0	1.0
+chr2	668907	1.0	0.0	1.0
+chr2	668909	2.0	0.0	2.0
+chr2	668913	0.0	1.0	1.0
+chr2	668915	0.0	1.0	1.0
+chr2	668919	0.0	1.0	1.0
+chr2	668928	2.0	0.0	2.0
+chr2	668932	2.0	0.0	2.0
+chr2	668936	1.0	0.0	1.0
+chr2	668947	0.0	3.0	3.0
+chr2	669030	0.0	2.0	2.0
+chr2	669066	1.0	0.0	1.0
+chr2	669098	0.0	1.0	1.0
+chr2	669099	1.0	0.0	1.0
+chr2	669210	0.0	1.0	1.0
+chr2	669269	0.0	1.0	1.0
+chr2	669281	1.0	0.0	1.0
+chr2	669407	0.0	1.0	1.0
+chr2	669783	0.0	3.0	3.0
+chr2	669898	2.0	0.0	2.0
+chr2	669925	1.0	0.0	1.0
+chr2	669933	0.0	2.0	2.0
+chr2	669946	0.0	1.0	1.0
+chr2	669947	1.0	0.0	1.0
+chr2	669948	1.0	0.0	1.0
+chr2	670070	1.0	0.0	1.0
+chr2	670085	0.0	1.0	1.0
+chr2	670086	1.0	0.0	1.0
+chr2	670090	0.0	1.0	1.0
+chr2	670099	0.0	1.0	1.0
+chr2	670101	1.0	0.0	1.0
+chr2	670103	1.0	0.0	1.0
+chr2	670110	1.0	0.0	1.0
+chr2	670122	1.0	0.0	1.0
+chr2	670241	0.0	1.0	1.0
+chr2	670242	0.0	2.0	2.0
+chr2	670245	1.0	0.0	1.0
+chr2	670249	0.0	2.0	2.0
+chr2	670250	0.0	1.0	1.0
+chr2	670253	0.0	1.0	1.0
+chr2	670258	1.0	0.0	1.0
+chr2	670259	2.0	0.0	2.0
+chr2	670260	2.0	0.0	2.0
+chr2	670261	1.0	0.0	1.0
+chr2	670263	1.0	0.0	1.0
+chr2	670267	2.0	0.0	2.0
+chr2	670268	2.0	0.0	2.0
+chr2	670270	1.0	0.0	1.0
+chr2	670271	0.0	1.0	1.0
+chr2	670272	1.0	0.0	1.0
+chr2	670275	0.0	2.0	2.0
+chr2	670277	1.0	1.0	2.0
+chr2	670278	0.0	4.0	4.0
+chr2	670279	2.0	1.0	3.0
+chr2	670300	1.0	0.0	1.0
+chr2	670474	1.0	0.0	1.0
+chr2	670506	1.0	0.0	1.0
+chr2	670511	1.0	0.0	1.0
+chr2	670514	1.0	0.0	1.0
+chr2	670520	1.0	1.0	2.0
+chr2	670523	2.0	1.0	3.0
+chr2	670528	1.0	0.0	1.0
+chr2	670539	0.0	1.0	1.0
+chr2	670709	0.0	2.0	2.0
+chr2	670874	1.0	0.0	1.0
+chr2	671002	1.0	0.0	1.0
+chr2	671169	0.0	1.0	1.0
+chr2	672801	0.0	1.0	1.0
+chr2	672996	1.0	0.0	1.0
+chr2	673020	0.0	1.0	1.0
+chr2	673046	0.0	1.0	1.0
+chr2	673775	0.0	1.0	1.0
+chr2	673807	1.0	0.0	1.0
+chr2	673834	0.0	1.0	1.0
+chr2	674187	1.0	0.0	1.0
+chr2	674299	0.0	1.0	1.0
+chr2	674459	1.0	0.0	1.0
+chr2	674595	1.0	0.0	1.0
+chr2	674717	1.0	0.0	1.0
+chr2	674779	1.0	0.0	1.0
+chr2	674797	0.0	3.0	3.0
+chr2	674801	1.0	0.0	1.0
+chr2	674806	1.0	0.0	1.0
+chr2	674813	0.0	1.0	1.0
+chr2	674823	1.0	0.0	1.0
+chr2	674999	1.0	0.0	1.0
+chr2	675064	0.0	1.0	1.0
+chr2	675072	0.0	1.0	1.0
+chr2	675085	1.0	0.0	1.0
+chr2	675107	1.0	0.0	1.0
+chr2	675108	1.0	0.0	1.0
+chr2	675113	0.0	1.0	1.0
+chr2	675128	3.0	1.0	4.0
+chr2	675134	0.0	2.0	2.0
+chr2	675136	1.0	0.0	1.0
+chr2	675137	1.0	0.0	1.0
+chr2	675145	1.0	0.0	1.0
+chr2	675146	3.0	0.0	3.0
+chr2	675171	0.0	1.0	1.0
+chr2	675178	1.0	0.0	1.0
+chr2	675336	0.0	1.0	1.0
+chr2	675357	2.0	0.0	2.0
+chr2	675369	2.0	0.0	2.0
+chr2	675370	1.0	0.0	1.0
+chr2	675371	0.0	2.0	2.0
+chr2	675374	3.0	0.0	3.0
+chr2	675380	0.0	1.0	1.0
+chr2	675406	1.0	0.0	1.0
+chr2	675423	1.0	0.0	1.0
+chr2	675486	0.0	1.0	1.0
+chr2	675494	0.0	2.0	2.0
+chr2	675510	1.0	1.0	2.0
+chr2	675523	0.0	1.0	1.0
+chr2	675524	1.0	0.0	1.0
+chr2	675531	0.0	1.0	1.0
+chr2	675542	0.0	1.0	1.0
+chr2	675543	0.0	1.0	1.0
+chr2	675544	0.0	1.0	1.0
+chr2	675580	1.0	0.0	1.0
+chr2	675692	1.0	0.0	1.0
+chr2	675857	0.0	1.0	1.0
+chr2	676132	0.0	1.0	1.0
+chr2	676166	1.0	0.0	1.0
+chr2	676195	0.0	1.0	1.0
+chr2	676226	1.0	0.0	1.0
+chr2	676250	1.0	0.0	1.0
+chr2	676311	1.0	0.0	1.0
+chr2	676502	1.0	0.0	1.0
+chr2	676613	1.0	0.0	1.0
+chr2	677234	0.0	1.0	1.0
+chr2	677289	0.0	1.0	1.0
+chr2	677590	1.0	0.0	1.0
+chr2	677919	2.0	0.0	2.0
+chr2	678360	1.0	0.0	1.0
+chr2	678530	1.0	0.0	1.0
+chr2	678646	1.0	0.0	1.0
+chr2	678673	1.0	0.0	1.0
+chr2	678685	1.0	0.0	1.0
+chr2	678799	1.0	0.0	1.0
+chr2	678827	0.0	1.0	1.0
+chr2	678840	0.0	1.0	1.0
+chr2	678847	1.0	0.0	1.0
+chr2	678857	1.0	0.0	1.0
+chr2	678879	1.0	0.0	1.0
+chr2	679009	0.0	2.0	2.0
+chr2	679019	2.0	0.0	2.0
+chr2	679163	0.0	1.0	1.0
+chr2	679171	1.0	0.0	1.0
+chr2	679181	0.0	1.0	1.0
+chr2	679182	2.0	0.0	2.0
+chr2	679183	5.0	0.0	5.0
+chr2	679187	1.0	0.0	1.0
+chr2	679188	1.0	0.0	1.0
+chr2	679189	1.0	0.0	1.0
+chr2	679190	1.0	5.0	6.0
+chr2	679191	1.0	2.0	3.0
+chr2	679194	0.0	1.0	1.0
+chr2	679197	2.0	1.0	3.0
+chr2	679198	5.0	1.0	6.0
+chr2	679201	0.0	2.0	2.0
+chr2	679204	0.0	2.0	2.0
+chr2	679208	0.0	15.0	15.0
+chr2	679211	0.0	4.0	4.0
+chr2	679212	0.0	1.0	1.0
+chr2	679214	0.0	1.0	1.0
+chr2	679215	1.0	1.0	2.0
+chr2	679216	1.0	0.0	1.0
+chr2	679218	1.0	0.0	1.0
+chr2	679220	3.0	0.0	3.0
+chr2	679223	0.0	1.0	1.0
+chr2	679249	0.0	1.0	1.0
+chr2	679479	1.0	0.0	1.0
+chr2	679483	1.0	0.0	1.0
+chr2	679484	0.0	2.0	2.0
+chr2	679488	2.0	0.0	2.0
+chr2	679497	0.0	1.0	1.0
+chr2	679502	0.0	1.0	1.0
+chr2	679630	1.0	0.0	1.0
+chr2	679649	1.0	0.0	1.0
+chr2	679650	1.0	0.0	1.0
+chr2	679659	1.0	0.0	1.0
+chr2	679674	1.0	0.0	1.0
+chr2	679682	0.0	1.0	1.0
+chr2	679694	0.0	1.0	1.0
+chr2	679715	1.0	0.0	1.0
+chr2	679799	2.0	0.0	2.0
+chr2	679832	1.0	0.0	1.0
+chr2	679833	0.0	1.0	1.0
+chr2	679846	1.0	0.0	1.0
+chr2	679858	0.0	1.0	1.0
+chr2	679860	1.0	0.0	1.0
+chr2	679866	0.0	1.0	1.0
+chr2	679871	0.0	1.0	1.0
+chr2	679873	1.0	0.0	1.0
+chr2	680006	0.0	1.0	1.0
+chr2	680024	1.0	0.0	1.0
+chr2	680030	1.0	0.0	1.0
+chr2	680034	1.0	0.0	1.0
+chr2	680041	0.0	1.0	1.0
+chr2	680042	2.0	3.0	5.0
+chr2	680043	1.0	0.0	1.0
+chr2	680047	1.0	0.0	1.0
+chr2	680048	1.0	0.0	1.0
+chr2	680051	0.0	1.0	1.0
+chr2	680054	0.0	2.0	2.0
+chr2	680055	3.0	0.0	3.0
+chr2	680064	0.0	1.0	1.0
+chr2	680296	1.0	0.0	1.0
+chr2	680320	1.0	0.0	1.0
+chr2	680338	1.0	0.0	1.0
+chr2	680340	1.0	0.0	1.0
+chr2	680355	0.0	1.0	1.0
+chr2	680356	1.0	0.0	1.0
+chr2	680362	0.0	2.0	2.0
+chr2	680378	0.0	1.0	1.0
+chr2	680401	0.0	1.0	1.0
+chr2	680488	1.0	0.0	1.0
+chr2	680530	1.0	0.0	1.0
+chr2	680757	1.0	0.0	1.0
+chr2	681138	0.0	1.0	1.0
+chr2	681614	1.0	0.0	1.0
+chr2	682199	0.0	1.0	1.0
+chr2	682207	1.0	0.0	1.0
+chr2	682216	0.0	1.0	1.0
+chr2	682234	1.0	0.0	1.0
+chr2	682240	0.0	6.0	6.0
+chr2	682244	1.0	0.0	1.0
+chr2	682249	1.0	0.0	1.0
+chr2	682250	1.0	0.0	1.0
+chr2	682253	1.0	0.0	1.0
+chr2	682269	0.0	1.0	1.0
+chr2	682380	0.0	1.0	1.0
+chr2	682398	1.0	0.0	1.0
+chr2	682399	0.0	1.0	1.0
+chr2	682451	0.0	1.0	1.0
+chr2	682552	0.0	1.0	1.0
+chr2	682572	1.0	1.0	2.0
+chr2	682577	1.0	0.0	1.0
+chr2	682719	1.0	0.0	1.0
+chr2	682896	1.0	0.0	1.0
+chr2	682899	1.0	0.0	1.0
+chr2	682900	1.0	0.0	1.0
+chr2	682901	2.0	0.0	2.0
+chr2	682922	1.0	0.0	1.0
+chr2	682927	0.0	1.0	1.0
+chr2	682933	0.0	1.0	1.0
+chr2	682939	0.0	1.0	1.0
+chr2	683016	0.0	1.0	1.0
+chr2	683044	0.0	2.0	2.0
+chr2	683064	2.0	0.0	2.0
+chr2	683066	2.0	1.0	3.0
+chr2	683073	0.0	2.0	2.0
+chr2	683074	1.0	0.0	1.0
+chr2	683085	1.0	0.0	1.0
+chr2	683090	0.0	1.0	1.0
+chr2	683098	1.0	0.0	1.0
+chr2	683099	0.0	1.0	1.0
+chr2	683126	1.0	0.0	1.0
+chr2	683292	1.0	0.0	1.0
+chr2	683315	0.0	1.0	1.0
+chr2	683326	1.0	0.0	1.0
+chr2	683334	1.0	0.0	1.0
+chr2	683348	1.0	0.0	1.0
+chr2	683353	1.0	0.0	1.0
+chr2	683354	1.0	0.0	1.0
+chr2	683356	1.0	1.0	2.0
+chr2	683367	0.0	1.0	1.0
+chr2	683392	1.0	0.0	1.0
+chr2	683398	1.0	0.0	1.0
+chr2	683405	0.0	2.0	2.0
+chr2	683508	0.0	1.0	1.0
+chr2	683512	0.0	1.0	1.0
+chr2	683523	0.0	1.0	1.0
+chr2	683530	0.0	1.0	1.0
+chr2	683533	0.0	2.0	2.0
+chr2	683534	2.0	0.0	2.0
+chr2	683541	1.0	0.0	1.0
+chr2	683542	0.0	1.0	1.0
+chr2	683588	0.0	2.0	2.0
+chr2	683590	0.0	1.0	1.0
+chr2	683673	0.0	1.0	1.0
+chr2	683706	0.0	1.0	1.0
+chr2	683855	0.0	1.0	1.0
+chr2	683858	0.0	1.0	1.0
+chr2	683862	0.0	1.0	1.0
+chr2	683875	0.0	1.0	1.0
+chr2	683979	0.0	1.0	1.0
+chr2	684028	0.0	1.0	1.0
+chr2	684349	1.0	0.0	1.0
+chr2	684380	1.0	0.0	1.0
+chr2	684445	0.0	1.0	1.0
+chr2	684508	1.0	0.0	1.0
+chr2	684559	1.0	0.0	1.0
+chr2	684667	0.0	1.0	1.0
+chr2	684945	0.0	1.0	1.0
+chr2	684963	1.0	0.0	1.0
+chr2	684972	1.0	0.0	1.0
+chr2	684976	1.0	0.0	1.0
+chr2	684977	1.0	0.0	1.0
+chr2	684982	0.0	1.0	1.0
+chr2	684983	0.0	1.0	1.0
+chr2	684985	0.0	4.0	4.0
+chr2	684986	3.0	0.0	3.0
+chr2	684988	0.0	1.0	1.0
+chr2	684990	0.0	1.0	1.0
+chr2	684992	1.0	0.0	1.0
+chr2	684997	1.0	0.0	1.0
+chr2	684998	4.0	2.0	6.0
+chr2	685004	1.0	0.0	1.0
+chr2	685008	1.0	1.0	2.0
+chr2	685009	0.0	1.0	1.0
+chr2	685017	0.0	1.0	1.0
+chr2	685023	0.0	2.0	2.0
+chr2	685082	1.0	0.0	1.0
+chr2	685149	0.0	1.0	1.0
+chr2	685152	0.0	1.0	1.0
+chr2	685153	0.0	1.0	1.0
+chr2	685159	2.0	0.0	2.0
+chr2	685162	0.0	3.0	3.0
+chr2	685163	0.0	1.0	1.0
+chr2	685171	1.0	0.0	1.0
+chr2	685173	1.0	0.0	1.0
+chr2	685174	0.0	1.0	1.0
+chr2	685190	1.0	0.0	1.0
+chr2	685536	1.0	0.0	1.0
+chr2	685733	1.0	0.0	1.0
+chr2	685740	1.0	0.0	1.0
+chr2	685890	1.0	0.0	1.0
+chr2	686069	1.0	0.0	1.0
+chr2	686091	0.0	1.0	1.0
+chr2	686104	0.0	1.0	1.0
+chr2	686262	2.0	0.0	2.0
+chr2	686397	1.0	0.0	1.0
+chr2	686403	0.0	1.0	1.0
+chr2	686404	0.0	1.0	1.0
+chr2	686408	1.0	0.0	1.0
+chr2	686494	0.0	1.0	1.0
+chr2	686515	0.0	1.0	1.0
+chr2	686535	0.0	1.0	1.0
+chr2	686551	0.0	1.0	1.0
+chr2	686553	1.0	0.0	1.0
+chr2	686555	1.0	0.0	1.0
+chr2	686559	0.0	1.0	1.0
+chr2	686560	0.0	4.0	4.0
+chr2	686564	1.0	0.0	1.0
+chr2	686565	3.0	1.0	4.0
+chr2	686568	0.0	1.0	1.0
+chr2	686569	1.0	0.0	1.0
+chr2	686570	1.0	0.0	1.0
+chr2	686571	3.0	0.0	3.0
+chr2	686572	2.0	3.0	5.0
+chr2	686573	0.0	1.0	1.0
+chr2	686574	1.0	0.0	1.0
+chr2	686576	0.0	2.0	2.0
+chr2	686577	0.0	1.0	1.0
+chr2	686581	1.0	2.0	3.0
+chr2	686582	3.0	0.0	3.0
+chr2	686584	0.0	2.0	2.0
+chr2	686585	1.0	0.0	1.0
+chr2	686588	0.0	2.0	2.0
+chr2	686589	0.0	1.0	1.0
+chr2	686590	0.0	1.0	1.0
+chr2	686592	0.0	1.0	1.0
+chr2	686595	0.0	4.0	4.0
+chr2	686597	1.0	0.0	1.0
+chr2	686606	1.0	1.0	2.0
+chr2	686662	1.0	0.0	1.0
+chr2	686800	0.0	1.0	1.0
+chr2	686801	0.0	1.0	1.0
+chr2	686837	0.0	2.0	2.0
+chr2	686842	1.0	1.0	2.0
+chr2	686846	1.0	0.0	1.0
+chr2	686856	1.0	0.0	1.0
+chr2	686858	0.0	1.0	1.0
+chr2	686859	4.0	0.0	4.0
+chr2	686872	2.0	0.0	2.0
+chr2	686873	0.0	1.0	1.0
+chr2	686874	0.0	1.0	1.0
+chr2	686875	0.0	1.0	1.0
+chr2	686877	2.0	0.0	2.0
+chr2	686885	0.0	1.0	1.0
+chr2	686949	1.0	0.0	1.0
+chr2	687022	1.0	0.0	1.0
+chr2	687030	0.0	1.0	1.0
+chr2	687041	5.0	0.0	5.0
+chr2	687051	1.0	0.0	1.0
+chr2	687344	1.0	0.0	1.0
+chr2	687364	1.0	0.0	1.0
+chr2	687365	1.0	0.0	1.0
+chr2	687439	2.0	0.0	2.0
+chr2	687682	1.0	0.0	1.0
+chr2	688821	0.0	1.0	1.0
+chr2	689184	1.0	0.0	1.0
+chr2	689185	0.0	1.0	1.0
+chr2	689203	0.0	1.0	1.0
+chr2	689281	0.0	1.0	1.0
+chr2	689410	1.0	0.0	1.0
+chr2	689477	0.0	1.0	1.0
+chr2	689685	0.0	1.0	1.0
+chr2	689961	2.0	0.0	2.0
+chr2	689983	1.0	0.0	1.0
+chr2	690837	1.0	0.0	1.0
+chr2	690997	2.0	0.0	2.0
+chr2	691003	1.0	0.0	1.0
+chr2	691320	1.0	0.0	1.0
+chr2	691354	3.0	0.0	3.0
+chr2	691493	0.0	1.0	1.0
+chr2	691511	2.0	0.0	2.0
+chr2	691514	0.0	1.0	1.0
+chr2	691609	0.0	1.0	1.0
+chr2	691636	0.0	1.0	1.0
+chr2	691661	2.0	0.0	2.0
+chr2	691666	1.0	3.0	4.0
+chr2	691668	1.0	7.0	8.0
+chr2	691669	0.0	1.0	1.0
+chr2	691670	1.0	0.0	1.0
+chr2	691672	2.0	0.0	2.0
+chr2	691674	1.0	0.0	1.0
+chr2	691677	0.0	2.0	2.0
+chr2	691681	1.0	0.0	1.0
+chr2	691682	2.0	0.0	2.0
+chr2	691684	1.0	1.0	2.0
+chr2	691685	2.0	0.0	2.0
+chr2	691686	1.0	1.0	2.0
+chr2	691688	0.0	4.0	4.0
+chr2	691691	0.0	2.0	2.0
+chr2	691693	0.0	1.0	1.0
+chr2	691694	1.0	1.0	2.0
+chr2	691696	2.0	0.0	2.0
+chr2	691699	0.0	1.0	1.0
+chr2	691718	0.0	1.0	1.0
+chr2	691719	0.0	1.0	1.0
+chr2	691954	1.0	0.0	1.0
+chr2	691955	1.0	0.0	1.0
+chr2	691956	7.0	0.0	7.0
+chr2	691958	1.0	1.0	2.0
+chr2	691962	0.0	3.0	3.0
+chr2	691973	2.0	0.0	2.0
+chr2	691975	2.0	0.0	2.0
+chr2	691976	1.0	0.0	1.0
+chr2	691991	1.0	0.0	1.0
+chr2	691994	1.0	0.0	1.0
+chr2	692000	0.0	1.0	1.0
+chr2	692116	1.0	0.0	1.0
+chr2	692125	1.0	0.0	1.0
+chr2	692126	1.0	0.0	1.0
+chr2	692128	0.0	1.0	1.0
+chr2	692137	2.0	0.0	2.0
+chr2	692144	0.0	1.0	1.0
+chr2	692281	1.0	0.0	1.0
+chr2	692291	2.0	0.0	2.0
+chr2	692298	1.0	0.0	1.0
+chr2	692597	0.0	1.0	1.0
+chr2	692735	0.0	1.0	1.0
+chr2	692774	0.0	1.0	1.0
+chr2	692927	2.0	0.0	2.0
+chr2	693101	0.0	1.0	1.0
+chr2	693191	0.0	1.0	1.0
+chr2	693276	1.0	0.0	1.0
+chr2	693282	0.0	1.0	1.0
+chr2	693557	2.0	0.0	2.0
+chr2	693765	0.0	1.0	1.0
+chr2	694160	0.0	1.0	1.0
+chr2	694290	0.0	1.0	1.0
+chr2	695169	1.0	0.0	1.0
+chr2	695944	0.0	1.0	1.0
+chr2	696031	1.0	0.0	1.0
+chr2	696818	0.0	1.0	1.0
+chr2	697027	1.0	0.0	1.0
+chr2	697213	0.0	1.0	1.0
+chr2	697256	3.0	0.0	3.0
+chr2	697323	1.0	0.0	1.0
+chr2	697416	0.0	1.0	1.0
+chr2	697858	1.0	0.0	1.0
+chr2	697881	1.0	0.0	1.0
+chr2	697901	0.0	2.0	2.0
+chr2	697902	2.0	0.0	2.0
+chr2	697913	0.0	3.0	3.0
+chr2	697921	2.0	0.0	2.0
+chr2	697923	0.0	1.0	1.0
+chr2	697924	1.0	0.0	1.0
+chr2	697936	0.0	4.0	4.0
+chr2	697990	0.0	2.0	2.0
+chr2	698087	1.0	0.0	1.0
+chr2	698108	0.0	1.0	1.0
+chr2	698145	1.0	0.0	1.0
+chr2	698147	1.0	0.0	1.0
+chr2	698149	1.0	0.0	1.0
+chr2	698150	1.0	0.0	1.0
+chr2	698155	1.0	1.0	2.0
+chr2	698159	1.0	0.0	1.0
+chr2	698171	1.0	0.0	1.0
+chr2	698178	0.0	1.0	1.0
+chr2	698183	0.0	1.0	1.0
+chr2	698192	0.0	1.0	1.0
+chr2	698196	2.0	0.0	2.0
+chr2	698207	0.0	1.0	1.0
+chr2	698432	0.0	1.0	1.0
+chr2	698484	0.0	1.0	1.0
+chr2	698631	1.0	0.0	1.0
+chr2	698870	1.0	0.0	1.0
+chr2	698925	0.0	1.0	1.0
+chr2	698958	0.0	1.0	1.0
+chr2	699012	1.0	0.0	1.0
+chr2	699215	0.0	1.0	1.0
+chr2	699216	0.0	1.0	1.0
+chr2	699355	1.0	0.0	1.0
+chr2	699375	0.0	1.0	1.0
+chr2	699402	1.0	0.0	1.0
+chr2	699625	1.0	0.0	1.0
+chr2	699653	1.0	0.0	1.0
+chr2	699672	2.0	0.0	2.0
+chr2	699685	0.0	3.0	3.0
+chr2	699687	0.0	1.0	1.0
+chr2	699701	2.0	0.0	2.0
+chr2	699834	0.0	1.0	1.0
+chr2	699864	1.0	0.0	1.0
+chr2	699870	0.0	1.0	1.0
+chr2	699871	1.0	0.0	1.0
+chr2	699872	1.0	0.0	1.0
+chr2	699877	1.0	0.0	1.0
+chr2	699882	0.0	1.0	1.0
+chr2	699886	0.0	1.0	1.0
+chr2	700009	0.0	1.0	1.0
+chr2	700012	0.0	1.0	1.0
+chr2	700014	0.0	1.0	1.0
+chr2	700017	0.0	1.0	1.0
+chr2	700019	0.0	1.0	1.0
+chr2	700022	0.0	1.0	1.0
+chr2	700023	0.0	1.0	1.0
+chr2	700030	0.0	1.0	1.0
+chr2	700031	0.0	1.0	1.0
+chr2	700032	0.0	1.0	1.0
+chr2	700035	3.0	0.0	3.0
+chr2	700036	0.0	4.0	4.0
+chr2	700038	0.0	2.0	2.0
+chr2	700042	3.0	1.0	4.0
+chr2	700043	2.0	0.0	2.0
+chr2	700044	2.0	0.0	2.0
+chr2	700045	0.0	1.0	1.0
+chr2	700056	0.0	1.0	1.0
+chr2	700294	1.0	0.0	1.0
+chr2	700308	1.0	0.0	1.0
+chr2	700315	1.0	0.0	1.0
+chr2	700319	1.0	0.0	1.0
+chr2	700336	0.0	1.0	1.0
+chr2	700433	0.0	1.0	1.0
+chr2	700475	1.0	0.0	1.0
+chr2	700483	0.0	1.0	1.0
+chr2	700486	1.0	0.0	1.0
+chr2	700487	1.0	0.0	1.0
+chr2	700489	0.0	2.0	2.0
+chr2	700493	0.0	1.0	1.0
+chr2	700497	4.0	0.0	4.0
+chr2	700498	2.0	0.0	2.0
+chr2	700501	0.0	1.0	1.0
+chr2	700505	0.0	2.0	2.0
+chr2	700507	1.0	0.0	1.0
+chr2	700513	0.0	1.0	1.0
+chr2	700514	0.0	1.0	1.0
+chr2	700520	0.0	1.0	1.0
+chr2	700577	1.0	0.0	1.0
+chr2	700584	1.0	0.0	1.0
+chr2	700634	0.0	1.0	1.0
+chr2	700643	2.0	0.0	2.0
+chr2	700647	1.0	0.0	1.0
+chr2	700648	0.0	1.0	1.0
+chr2	700664	0.0	2.0	2.0
+chr2	700667	1.0	0.0	1.0
+chr2	700671	0.0	1.0	1.0
+chr2	700675	0.0	1.0	1.0
+chr2	700681	0.0	1.0	1.0
+chr2	700682	0.0	1.0	1.0
+chr2	700684	1.0	0.0	1.0
+chr2	700688	0.0	1.0	1.0
+chr2	700795	1.0	0.0	1.0
+chr2	700826	0.0	2.0	2.0
+chr2	700839	1.0	0.0	1.0
+chr2	700850	0.0	1.0	1.0
+chr2	700851	1.0	0.0	1.0
+chr2	700858	1.0	0.0	1.0
+chr2	700869	0.0	2.0	2.0
+chr2	700894	1.0	0.0	1.0
+chr2	700932	1.0	0.0	1.0
+chr2	700955	1.0	0.0	1.0
+chr2	700960	1.0	0.0	1.0
+chr2	700977	1.0	4.0	5.0
+chr2	701002	1.0	0.0	1.0
+chr2	701006	0.0	1.0	1.0
+chr2	701027	0.0	1.0	1.0
+chr2	701031	0.0	2.0	2.0
+chr2	701043	1.0	0.0	1.0
+chr2	701052	1.0	0.0	1.0
+chr2	701097	4.0	0.0	4.0
+chr2	701106	0.0	1.0	1.0
+chr2	701107	0.0	1.0	1.0
+chr2	701114	2.0	0.0	2.0
+chr2	701130	0.0	1.0	1.0
+chr2	701135	0.0	1.0	1.0
+chr2	701137	0.0	1.0	1.0
+chr2	701138	0.0	1.0	1.0
+chr2	701144	0.0	1.0	1.0
+chr2	701150	0.0	1.0	1.0
+chr2	701170	0.0	1.0	1.0
+chr2	701173	0.0	1.0	1.0
+chr2	701174	1.0	0.0	1.0
+chr2	701184	2.0	0.0	2.0
+chr2	701193	0.0	1.0	1.0
+chr2	701201	0.0	1.0	1.0
+chr2	701217	0.0	1.0	1.0
+chr2	701218	0.0	2.0	2.0
+chr2	701227	0.0	1.0	1.0
+chr2	701232	0.0	1.0	1.0
+chr2	701236	0.0	1.0	1.0
+chr2	701244	0.0	1.0	1.0
+chr2	701264	0.0	1.0	1.0
+chr2	701287	1.0	0.0	1.0
+chr2	701296	1.0	0.0	1.0
+chr2	701329	1.0	0.0	1.0
+chr2	701349	4.0	0.0	4.0
+chr2	701409	0.0	1.0	1.0
+chr2	701435	0.0	2.0	2.0
+chr2	701441	0.0	1.0	1.0
+chr2	701454	0.0	1.0	1.0
+chr2	701457	1.0	0.0	1.0
+chr2	701467	0.0	1.0	1.0
+chr2	701471	0.0	2.0	2.0
+chr2	701477	1.0	0.0	1.0
+chr2	701490	0.0	1.0	1.0
+chr2	701506	1.0	0.0	1.0
+chr2	701607	0.0	1.0	1.0
+chr2	701611	1.0	0.0	1.0
+chr2	701620	1.0	0.0	1.0
+chr2	701626	0.0	1.0	1.0
+chr2	701628	2.0	0.0	2.0
+chr2	701655	2.0	0.0	2.0
+chr2	701769	0.0	1.0	1.0
+chr2	701780	0.0	2.0	2.0
+chr2	701781	0.0	1.0	1.0
+chr2	701784	1.0	0.0	1.0
+chr2	701792	0.0	1.0	1.0
+chr2	701794	0.0	1.0	1.0
+chr2	701796	1.0	1.0	2.0
+chr2	701802	2.0	0.0	2.0
+chr2	701811	1.0	0.0	1.0
+chr2	701817	0.0	1.0	1.0
+chr2	701959	2.0	0.0	2.0
+chr2	702116	0.0	3.0	3.0
+chr2	702120	2.0	0.0	2.0
+chr2	702121	2.0	0.0	2.0
+chr2	702122	6.0	0.0	6.0
+chr2	702123	2.0	0.0	2.0
+chr2	702124	0.0	3.0	3.0
+chr2	702125	0.0	1.0	1.0
+chr2	702128	0.0	1.0	1.0
+chr2	702131	0.0	2.0	2.0
+chr2	702135	6.0	0.0	6.0
+chr2	702140	0.0	1.0	1.0
+chr2	702146	2.0	0.0	2.0
+chr2	702148	1.0	0.0	1.0
+chr2	702152	0.0	1.0	1.0
+chr2	702153	0.0	3.0	3.0
+chr2	702154	1.0	0.0	1.0
+chr2	702158	0.0	1.0	1.0
+chr2	702161	1.0	0.0	1.0
+chr2	702163	3.0	0.0	3.0
+chr2	702175	1.0	0.0	1.0
+chr2	702177	2.0	0.0	2.0
+chr2	702179	0.0	2.0	2.0
+chr2	702189	0.0	1.0	1.0
+chr2	702190	0.0	1.0	1.0
+chr2	702200	0.0	1.0	1.0
+chr2	702229	1.0	0.0	1.0
+chr2	702458	1.0	0.0	1.0
+chr2	702616	0.0	1.0	1.0
+chr2	702642	1.0	0.0	1.0
+chr2	702648	0.0	1.0	1.0
+chr2	702659	0.0	1.0	1.0
+chr2	702690	0.0	1.0	1.0
+chr2	702805	0.0	1.0	1.0
+chr2	702963	0.0	1.0	1.0
+chr2	703112	1.0	0.0	1.0
+chr2	703185	0.0	1.0	1.0
+chr2	703200	0.0	1.0	1.0
+chr2	703271	1.0	1.0	2.0
+chr2	703296	1.0	0.0	1.0
+chr2	703304	1.0	0.0	1.0
+chr2	703317	0.0	1.0	1.0
+chr2	703366	1.0	0.0	1.0
+chr2	703486	0.0	1.0	1.0
+chr2	703489	2.0	0.0	2.0
+chr2	703530	1.0	0.0	1.0
+chr2	703546	0.0	1.0	1.0
+chr2	703593	2.0	0.0	2.0
+chr2	703610	0.0	1.0	1.0
+chr2	703622	0.0	1.0	1.0
+chr2	703642	0.0	1.0	1.0
+chr2	703644	0.0	1.0	1.0
+chr2	703658	1.0	0.0	1.0
+chr2	703659	0.0	1.0	1.0
+chr2	703678	0.0	2.0	2.0
+chr2	703732	0.0	1.0	1.0
+chr2	703774	1.0	0.0	1.0
+chr2	703778	1.0	0.0	1.0
+chr2	703828	2.0	0.0	2.0
+chr2	703873	1.0	0.0	1.0
+chr2	703880	0.0	1.0	1.0
+chr2	703927	0.0	1.0	1.0
+chr2	703975	1.0	0.0	1.0
+chr2	703995	1.0	0.0	1.0
+chr2	704008	0.0	4.0	4.0
+chr2	704014	1.0	0.0	1.0
+chr2	704039	1.0	0.0	1.0
+chr2	704055	1.0	0.0	1.0
+chr2	704065	1.0	0.0	1.0
+chr2	704067	1.0	1.0	2.0
+chr2	704068	1.0	0.0	1.0
+chr2	704070	1.0	0.0	1.0
+chr2	704083	0.0	1.0	1.0
+chr2	704092	0.0	1.0	1.0
+chr2	704209	1.0	0.0	1.0
+chr2	704231	1.0	0.0	1.0
+chr2	704233	1.0	1.0	2.0
+chr2	704243	1.0	0.0	1.0
+chr2	704246	3.0	1.0	4.0
+chr2	704247	0.0	3.0	3.0
+chr2	704251	0.0	1.0	1.0
+chr2	704255	0.0	1.0	1.0
+chr2	704257	1.0	0.0	1.0
+chr2	704260	0.0	1.0	1.0
+chr2	704261	0.0	4.0	4.0
+chr2	704265	1.0	1.0	2.0
+chr2	704282	0.0	1.0	1.0
+chr2	704289	3.0	0.0	3.0
+chr2	704303	1.0	0.0	1.0
+chr2	704337	0.0	1.0	1.0
+chr2	704517	0.0	1.0	1.0
+chr2	704545	3.0	0.0	3.0
+chr2	704552	0.0	1.0	1.0
+chr2	704553	0.0	1.0	1.0
+chr2	704559	0.0	1.0	1.0
+chr2	704579	1.0	0.0	1.0
+chr2	704692	0.0	1.0	1.0
+chr2	704727	0.0	2.0	2.0
+chr2	704764	1.0	0.0	1.0
+chr2	704886	1.0	1.0	2.0
+chr2	704918	0.0	1.0	1.0
+chr2	704924	1.0	0.0	1.0
+chr2	704956	1.0	0.0	1.0
+chr2	705015	0.0	1.0	1.0
+chr2	705040	1.0	0.0	1.0
+chr2	705296	0.0	1.0	1.0
+chr2	705924	1.0	0.0	1.0
+chr2	706294	1.0	0.0	1.0
+chr2	706338	0.0	1.0	1.0
+chr2	706422	0.0	1.0	1.0
+chr2	706569	2.0	0.0	2.0
+chr2	706573	0.0	1.0	1.0
+chr2	706579	1.0	0.0	1.0
+chr2	706585	1.0	0.0	1.0
+chr2	706591	1.0	0.0	1.0
+chr2	706594	1.0	1.0	2.0
+chr2	706605	0.0	1.0	1.0
+chr2	706625	2.0	0.0	2.0
+chr2	706732	0.0	1.0	1.0
+chr2	706747	1.0	1.0	2.0
+chr2	706748	1.0	0.0	1.0
+chr2	706752	0.0	2.0	2.0
+chr2	706755	1.0	0.0	1.0
+chr2	706756	1.0	0.0	1.0
+chr2	706758	0.0	3.0	3.0
+chr2	706759	0.0	1.0	1.0
+chr2	706760	0.0	1.0	1.0
+chr2	706761	0.0	1.0	1.0
+chr2	706764	2.0	2.0	4.0
+chr2	706765	5.0	0.0	5.0
+chr2	706766	4.0	0.0	4.0
+chr2	706767	0.0	1.0	1.0
+chr2	706769	0.0	1.0	1.0
+chr2	706770	1.0	0.0	1.0
+chr2	706772	1.0	1.0	2.0
+chr2	706776	1.0	0.0	1.0
+chr2	706788	1.0	0.0	1.0
+chr2	706970	0.0	1.0	1.0
+chr2	707020	1.0	0.0	1.0
+chr2	707057	1.0	0.0	1.0
+chr2	707124	1.0	0.0	1.0
+chr2	707144	0.0	1.0	1.0
+chr2	707160	1.0	0.0	1.0
+chr2	707178	0.0	1.0	1.0
+chr2	707190	1.0	0.0	1.0
+chr2	707309	0.0	1.0	1.0
+chr2	707328	0.0	1.0	1.0
+chr2	707344	1.0	0.0	1.0
+chr2	707349	1.0	0.0	1.0
+chr2	707353	0.0	2.0	2.0
+chr2	707355	2.0	0.0	2.0
+chr2	707361	0.0	2.0	2.0
+chr2	707363	1.0	0.0	1.0
+chr2	707364	1.0	0.0	1.0
+chr2	707372	1.0	0.0	1.0
+chr2	707375	2.0	0.0	2.0
+chr2	707590	1.0	0.0	1.0
+chr2	707702	1.0	0.0	1.0
+chr2	707771	0.0	1.0	1.0
+chr2	708208	0.0	1.0	1.0
+chr2	708211	1.0	0.0	1.0
+chr2	708219	0.0	1.0	1.0
+chr2	708220	0.0	1.0	1.0
+chr2	708250	0.0	1.0	1.0
+chr2	708395	0.0	1.0	1.0
+chr2	708407	1.0	0.0	1.0
+chr2	708614	1.0	0.0	1.0
+chr2	708966	0.0	1.0	1.0
+chr2	708984	1.0	0.0	1.0
+chr2	710290	0.0	1.0	1.0
+chr2	710368	1.0	0.0	1.0
+chr2	710985	1.0	0.0	1.0
+chr2	711013	1.0	0.0	1.0
+chr2	711014	1.0	0.0	1.0
+chr2	711181	1.0	0.0	1.0
+chr2	711197	0.0	1.0	1.0
+chr2	711199	1.0	0.0	1.0
+chr2	711224	1.0	0.0	1.0
+chr2	711322	2.0	0.0	2.0
+chr2	711325	0.0	2.0	2.0
+chr2	711331	1.0	0.0	1.0
+chr2	711340	1.0	0.0	1.0
+chr2	711341	1.0	0.0	1.0
+chr2	711348	1.0	0.0	1.0
+chr2	711349	5.0	3.0	8.0
+chr2	711357	1.0	0.0	1.0
+chr2	711368	1.0	0.0	1.0
+chr2	711372	0.0	1.0	1.0
+chr2	711573	1.0	0.0	1.0
+chr2	711581	0.0	2.0	2.0
+chr2	711583	0.0	1.0	1.0
+chr2	711585	0.0	1.0	1.0
+chr2	711591	0.0	1.0	1.0
+chr2	711592	0.0	1.0	1.0
+chr2	711600	3.0	2.0	5.0
+chr2	711601	1.0	0.0	1.0
+chr2	711605	0.0	1.0	1.0
+chr2	711607	0.0	1.0	1.0
+chr2	711608	1.0	0.0	1.0
+chr2	711611	2.0	0.0	2.0
+chr2	711615	0.0	1.0	1.0
+chr2	711616	0.0	3.0	3.0
+chr2	711617	0.0	1.0	1.0
+chr2	711618	1.0	0.0	1.0
+chr2	711622	1.0	0.0	1.0
+chr2	711626	0.0	1.0	1.0
+chr2	711634	1.0	0.0	1.0
+chr2	711774	0.0	1.0	1.0
+chr2	711776	1.0	0.0	1.0
+chr2	711779	1.0	0.0	1.0
+chr2	711786	1.0	0.0	1.0
+chr2	711835	1.0	0.0	1.0
+chr2	711895	0.0	1.0	1.0
+chr2	712450	0.0	1.0	1.0
+chr2	712565	0.0	1.0	1.0
+chr2	713814	0.0	1.0	1.0
+chr2	713819	1.0	0.0	1.0
+chr2	713848	0.0	1.0	1.0
+chr2	713888	0.0	1.0	1.0
+chr2	713947	1.0	0.0	1.0
+chr2	713963	0.0	1.0	1.0
+chr2	714124	0.0	1.0	1.0
+chr2	714126	1.0	0.0	1.0
+chr2	714265	1.0	0.0	1.0
+chr2	714277	0.0	1.0	1.0
+chr2	714286	0.0	1.0	1.0
+chr2	714287	1.0	0.0	1.0
+chr2	714439	1.0	0.0	1.0
+chr2	714441	1.0	0.0	1.0
+chr2	714442	1.0	0.0	1.0
+chr2	714448	0.0	1.0	1.0
+chr2	714452	1.0	0.0	1.0
+chr2	714465	1.0	0.0	1.0
+chr2	714473	0.0	2.0	2.0
+chr2	714498	0.0	1.0	1.0
+chr2	714663	2.0	0.0	2.0
+chr2	714707	1.0	0.0	1.0
+chr2	714716	1.0	0.0	1.0
+chr2	714717	1.0	0.0	1.0
+chr2	714720	1.0	0.0	1.0
+chr2	714735	0.0	1.0	1.0
+chr2	714741	1.0	0.0	1.0
+chr2	714747	1.0	0.0	1.0
+chr2	714751	0.0	1.0	1.0
+chr2	714752	0.0	1.0	1.0
+chr2	714877	0.0	1.0	1.0
+chr2	714897	0.0	1.0	1.0
+chr2	714902	1.0	0.0	1.0
+chr2	714918	0.0	2.0	2.0
+chr2	714919	1.0	0.0	1.0
+chr2	714921	0.0	1.0	1.0
+chr2	714929	1.0	0.0	1.0
+chr2	714934	0.0	2.0	2.0
+chr2	714943	1.0	0.0	1.0
+chr2	715129	0.0	1.0	1.0
+chr2	715253	0.0	1.0	1.0
+chr2	715431	2.0	0.0	2.0
+chr2	715457	1.0	0.0	1.0
+chr2	715477	1.0	0.0	1.0
+chr2	715603	0.0	1.0	1.0
+chr2	715623	1.0	0.0	1.0
+chr2	715631	1.0	0.0	1.0
+chr2	715887	1.0	0.0	1.0
+chr2	716052	1.0	0.0	1.0
+chr2	716116	1.0	0.0	1.0
+chr2	716152	1.0	0.0	1.0
+chr2	716169	0.0	1.0	1.0
+chr2	716173	0.0	1.0	1.0
+chr2	716181	0.0	1.0	1.0
+chr2	716189	1.0	0.0	1.0
+chr2	716312	0.0	1.0	1.0
+chr2	716316	0.0	1.0	1.0
+chr2	716352	0.0	1.0	1.0
+chr2	716353	1.0	0.0	1.0
+chr2	716358	1.0	0.0	1.0
+chr2	716362	1.0	0.0	1.0
+chr2	716474	1.0	0.0	1.0
+chr2	716480	0.0	1.0	1.0
+chr2	716484	5.0	0.0	5.0
+chr2	716486	2.0	0.0	2.0
+chr2	716493	1.0	1.0	2.0
+chr2	716495	0.0	1.0	1.0
+chr2	716496	1.0	0.0	1.0
+chr2	716497	1.0	0.0	1.0
+chr2	716498	5.0	1.0	6.0
+chr2	716499	1.0	0.0	1.0
+chr2	716500	0.0	2.0	2.0
+chr2	716504	1.0	3.0	4.0
+chr2	716507	1.0	3.0	4.0
+chr2	716508	0.0	2.0	2.0
+chr2	716514	1.0	0.0	1.0
+chr2	716544	1.0	0.0	1.0
+chr2	716768	0.0	1.0	1.0
+chr2	716779	0.0	1.0	1.0
+chr2	716780	0.0	1.0	1.0
+chr2	716791	0.0	2.0	2.0
+chr2	716792	2.0	1.0	3.0
+chr2	716794	1.0	0.0	1.0
+chr2	716802	0.0	1.0	1.0
+chr2	716945	1.0	0.0	1.0
+chr2	716955	2.0	0.0	2.0
+chr2	716958	2.0	0.0	2.0
+chr2	716964	0.0	1.0	1.0
+chr2	716969	0.0	1.0	1.0
+chr2	716975	1.0	0.0	1.0
+chr2	717151	1.0	0.0	1.0
+chr2	717402	0.0	1.0	1.0
+chr2	717452	0.0	2.0	2.0
+chr2	717515	1.0	0.0	1.0
+chr2	717568	1.0	0.0	1.0
+chr2	717600	0.0	1.0	1.0
+chr2	717795	0.0	2.0	2.0
+chr2	717840	0.0	1.0	1.0
+chr2	717851	0.0	1.0	1.0
+chr2	717936	0.0	1.0	1.0
+chr2	717954	0.0	1.0	1.0
+chr2	718367	0.0	1.0	1.0
+chr2	718376	0.0	1.0	1.0
+chr2	718398	1.0	2.0	3.0
+chr2	718400	1.0	0.0	1.0
+chr2	718406	0.0	1.0	1.0
+chr2	718412	0.0	2.0	2.0
+chr2	718429	1.0	0.0	1.0
+chr2	718432	0.0	1.0	1.0
+chr2	718433	0.0	3.0	3.0
+chr2	718434	0.0	1.0	1.0
+chr2	718458	1.0	0.0	1.0
+chr2	718472	0.0	1.0	1.0
+chr2	718473	0.0	1.0	1.0
+chr2	718607	1.0	0.0	1.0
+chr2	718620	0.0	1.0	1.0
+chr2	718621	0.0	1.0	1.0
+chr2	718632	0.0	1.0	1.0
+chr2	718748	2.0	0.0	2.0
+chr2	718786	0.0	1.0	1.0
+chr2	718942	1.0	0.0	1.0
+chr2	718961	3.0	0.0	3.0
+chr2	718972	0.0	1.0	1.0
+chr2	718977	1.0	0.0	1.0
+chr2	718978	0.0	1.0	1.0
+chr2	718989	1.0	0.0	1.0
+chr2	719134	1.0	0.0	1.0
+chr2	719141	0.0	1.0	1.0
+chr2	719153	1.0	0.0	1.0
+chr2	719170	1.0	0.0	1.0
+chr2	719178	0.0	1.0	1.0
+chr2	719184	0.0	1.0	1.0
+chr2	719186	1.0	0.0	1.0
+chr2	719206	1.0	0.0	1.0
+chr2	719304	0.0	1.0	1.0
+chr2	719309	1.0	0.0	1.0
+chr2	719319	1.0	0.0	1.0
+chr2	719346	1.0	0.0	1.0
+chr2	719352	0.0	1.0	1.0
+chr2	719434	1.0	0.0	1.0
+chr2	719606	0.0	1.0	1.0
+chr2	719624	0.0	1.0	1.0
+chr2	719640	0.0	1.0	1.0
+chr2	719662	1.0	0.0	1.0
+chr2	719664	0.0	1.0	1.0
+chr2	719696	1.0	0.0	1.0
+chr2	719697	3.0	0.0	3.0
+chr2	719707	0.0	1.0	1.0
+chr2	719737	0.0	1.0	1.0
+chr2	719780	1.0	0.0	1.0
+chr2	719812	1.0	0.0	1.0
+chr2	719828	0.0	1.0	1.0
+chr2	719988	0.0	1.0	1.0
+chr2	720006	1.0	0.0	1.0
+chr2	720015	0.0	1.0	1.0
+chr2	720035	1.0	0.0	1.0
+chr2	720040	0.0	1.0	1.0
+chr2	720043	1.0	0.0	1.0
+chr2	720150	1.0	0.0	1.0
+chr2	720173	0.0	1.0	1.0
+chr2	720177	1.0	0.0	1.0
+chr2	720179	0.0	1.0	1.0
+chr2	720233	1.0	0.0	1.0
+chr2	720242	0.0	2.0	2.0
+chr2	720249	1.0	0.0	1.0
+chr2	720297	0.0	1.0	1.0
+chr2	720325	0.0	1.0	1.0
+chr2	720329	1.0	2.0	3.0
+chr2	720345	3.0	0.0	3.0
+chr2	720351	2.0	0.0	2.0
+chr2	720360	0.0	1.0	1.0
+chr2	720364	1.0	0.0	1.0
+chr2	720365	1.0	1.0	2.0
+chr2	720366	0.0	1.0	1.0
+chr2	720368	0.0	2.0	2.0
+chr2	720377	2.0	0.0	2.0
+chr2	720378	1.0	0.0	1.0
+chr2	720387	0.0	1.0	1.0
+chr2	720398	2.0	0.0	2.0
+chr2	720410	0.0	1.0	1.0
+chr2	720412	1.0	0.0	1.0
+chr2	720499	0.0	1.0	1.0
+chr2	720528	1.0	0.0	1.0
+chr2	720533	1.0	0.0	1.0
+chr2	720563	1.0	0.0	1.0
+chr2	720564	0.0	3.0	3.0
+chr2	720567	1.0	0.0	1.0
+chr2	720572	0.0	1.0	1.0
+chr2	720581	0.0	3.0	3.0
+chr2	720584	0.0	1.0	1.0
+chr2	720585	1.0	0.0	1.0
+chr2	720590	0.0	2.0	2.0
+chr2	720594	1.0	0.0	1.0
+chr2	720752	2.0	0.0	2.0
+chr2	720757	1.0	0.0	1.0
+chr2	720761	1.0	0.0	1.0
+chr2	720763	1.0	0.0	1.0
+chr2	720770	4.0	0.0	4.0
+chr2	720774	0.0	1.0	1.0
+chr2	720793	1.0	0.0	1.0
+chr2	720799	0.0	1.0	1.0
+chr2	720807	1.0	0.0	1.0
+chr2	720922	0.0	2.0	2.0
+chr2	720931	1.0	0.0	1.0
+chr2	720933	1.0	0.0	1.0
+chr2	720944	1.0	0.0	1.0
+chr2	720946	1.0	0.0	1.0
+chr2	720947	0.0	1.0	1.0
+chr2	720950	2.0	0.0	2.0
+chr2	720951	2.0	2.0	4.0
+chr2	720956	0.0	2.0	2.0
+chr2	720960	0.0	1.0	1.0
+chr2	721112	0.0	2.0	2.0
+chr2	721113	0.0	1.0	1.0
+chr2	721114	1.0	0.0	1.0
+chr2	721118	0.0	2.0	2.0
+chr2	721125	1.0	0.0	1.0
+chr2	721126	1.0	0.0	1.0
+chr2	721128	1.0	0.0	1.0
+chr2	721130	0.0	1.0	1.0
+chr2	721131	1.0	2.0	3.0
+chr2	721134	1.0	0.0	1.0
+chr2	721146	1.0	0.0	1.0
+chr2	721154	0.0	1.0	1.0
+chr2	721165	1.0	0.0	1.0
+chr2	721345	1.0	0.0	1.0
+chr2	721355	0.0	2.0	2.0
+chr2	721368	3.0	0.0	3.0
+chr2	721369	4.0	0.0	4.0
+chr2	721371	0.0	1.0	1.0
+chr2	721372	2.0	0.0	2.0
+chr2	721378	0.0	1.0	1.0
+chr2	721381	1.0	1.0	2.0
+chr2	721382	1.0	0.0	1.0
+chr2	721384	4.0	3.0	7.0
+chr2	721385	0.0	1.0	1.0
+chr2	721389	1.0	1.0	2.0
+chr2	721390	1.0	0.0	1.0
+chr2	721397	0.0	4.0	4.0
+chr2	721524	1.0	0.0	1.0
+chr2	721542	0.0	1.0	1.0
+chr2	721551	1.0	0.0	1.0
+chr2	721555	0.0	1.0	1.0
+chr2	721573	1.0	0.0	1.0
+chr2	721672	1.0	0.0	1.0
+chr2	721715	0.0	1.0	1.0
+chr2	722037	0.0	1.0	1.0
+chr2	722045	1.0	0.0	1.0
+chr2	722052	1.0	0.0	1.0
+chr2	722077	0.0	1.0	1.0
+chr2	722205	0.0	1.0	1.0
+chr2	722388	0.0	1.0	1.0
+chr2	722391	0.0	1.0	1.0
+chr2	722624	1.0	0.0	1.0
+chr2	722627	2.0	0.0	2.0
+chr2	722629	0.0	2.0	2.0
+chr2	722630	1.0	1.0	2.0
+chr2	722637	0.0	1.0	1.0
+chr2	722638	1.0	0.0	1.0
+chr2	722645	0.0	3.0	3.0
+chr2	722661	0.0	1.0	1.0
+chr2	722796	1.0	0.0	1.0
+chr2	722817	0.0	3.0	3.0
+chr2	722825	2.0	0.0	2.0
+chr2	722826	1.0	0.0	1.0
+chr2	722837	1.0	0.0	1.0
+chr2	722838	1.0	0.0	1.0
+chr2	722967	0.0	1.0	1.0
+chr2	722968	1.0	0.0	1.0
+chr2	722970	0.0	2.0	2.0
+chr2	722971	0.0	1.0	1.0
+chr2	722976	3.0	0.0	3.0
+chr2	722980	1.0	0.0	1.0
+chr2	722982	1.0	0.0	1.0
+chr2	722984	1.0	3.0	4.0
+chr2	722985	0.0	1.0	1.0
+chr2	722988	1.0	0.0	1.0
+chr2	723000	1.0	0.0	1.0
+chr2	723004	0.0	1.0	1.0
+chr2	723012	0.0	1.0	1.0
+chr2	723014	0.0	1.0	1.0
+chr2	723027	0.0	1.0	1.0
+chr2	723221	0.0	1.0	1.0
+chr2	723237	0.0	1.0	1.0
+chr2	723240	1.0	0.0	1.0
+chr2	723248	1.0	0.0	1.0
+chr2	723253	1.0	0.0	1.0
+chr2	723254	4.0	0.0	4.0
+chr2	723259	1.0	2.0	3.0
+chr2	723260	4.0	0.0	4.0
+chr2	723262	1.0	0.0	1.0
+chr2	723263	2.0	0.0	2.0
+chr2	723264	0.0	1.0	1.0
+chr2	723265	0.0	1.0	1.0
+chr2	723267	0.0	2.0	2.0
+chr2	723272	1.0	0.0	1.0
+chr2	723273	2.0	0.0	2.0
+chr2	723287	0.0	1.0	1.0
+chr2	723288	0.0	1.0	1.0
+chr2	723389	1.0	0.0	1.0
+chr2	723442	0.0	2.0	2.0
+chr2	723445	1.0	0.0	1.0
+chr2	723547	1.0	0.0	1.0
+chr2	723574	1.0	1.0	2.0
+chr2	723577	1.0	0.0	1.0
+chr2	723716	1.0	0.0	1.0
+chr2	723732	1.0	0.0	1.0
+chr2	723738	0.0	1.0	1.0
+chr2	723763	0.0	1.0	1.0
+chr2	723765	1.0	0.0	1.0
+chr2	723777	2.0	0.0	2.0
+chr2	723873	0.0	1.0	1.0
+chr2	723874	0.0	1.0	1.0
+chr2	723887	1.0	0.0	1.0
+chr2	723897	1.0	0.0	1.0
+chr2	724029	0.0	1.0	1.0
+chr2	724050	1.0	0.0	1.0
+chr2	724060	0.0	1.0	1.0
+chr2	724062	1.0	0.0	1.0
+chr2	724067	0.0	1.0	1.0
+chr2	724076	1.0	0.0	1.0
+chr2	724085	1.0	0.0	1.0
+chr2	724171	0.0	1.0	1.0
+chr2	724187	0.0	1.0	1.0
+chr2	724189	0.0	1.0	1.0
+chr2	724193	1.0	0.0	1.0
+chr2	724198	1.0	0.0	1.0
+chr2	724202	1.0	0.0	1.0
+chr2	724207	1.0	0.0	1.0
+chr2	724211	0.0	1.0	1.0
+chr2	724213	2.0	3.0	5.0
+chr2	724214	3.0	1.0	4.0
+chr2	724217	6.0	0.0	6.0
+chr2	724220	0.0	8.0	8.0
+chr2	724221	0.0	2.0	2.0
+chr2	724222	0.0	3.0	3.0
+chr2	724223	1.0	0.0	1.0
+chr2	724225	2.0	0.0	2.0
+chr2	724226	0.0	1.0	1.0
+chr2	724234	0.0	1.0	1.0
+chr2	724237	1.0	0.0	1.0
+chr2	724245	0.0	2.0	2.0
+chr2	724436	1.0	0.0	1.0
+chr2	724449	1.0	0.0	1.0
+chr2	724455	0.0	1.0	1.0
+chr2	724460	0.0	1.0	1.0
+chr2	724461	0.0	2.0	2.0
+chr2	724463	0.0	3.0	3.0
+chr2	724464	1.0	0.0	1.0
+chr2	724465	1.0	0.0	1.0
+chr2	724468	0.0	2.0	2.0
+chr2	724470	0.0	1.0	1.0
+chr2	724471	0.0	4.0	4.0
+chr2	724472	1.0	3.0	4.0
+chr2	724473	1.0	1.0	2.0
+chr2	724478	1.0	1.0	2.0
+chr2	724480	4.0	0.0	4.0
+chr2	724481	2.0	0.0	2.0
+chr2	724483	0.0	2.0	2.0
+chr2	724485	1.0	0.0	1.0
+chr2	724486	1.0	0.0	1.0
+chr2	724490	0.0	1.0	1.0
+chr2	724491	1.0	0.0	1.0
+chr2	724492	0.0	1.0	1.0
+chr2	724493	1.0	0.0	1.0
+chr2	724509	1.0	0.0	1.0
+chr2	724520	0.0	1.0	1.0
+chr2	724630	1.0	0.0	1.0
+chr2	724635	0.0	1.0	1.0
+chr2	724637	0.0	1.0	1.0
+chr2	724652	1.0	0.0	1.0
+chr2	724659	1.0	0.0	1.0
+chr2	724716	1.0	0.0	1.0
+chr2	724866	1.0	0.0	1.0
+chr2	725233	1.0	0.0	1.0
+chr2	725251	0.0	1.0	1.0
+chr2	725265	1.0	0.0	1.0
+chr2	725279	0.0	1.0	1.0
+chr2	725798	1.0	0.0	1.0
+chr2	725851	1.0	0.0	1.0
+chr2	725881	1.0	0.0	1.0
+chr2	725905	0.0	1.0	1.0
+chr2	726420	0.0	1.0	1.0
+chr2	726666	1.0	0.0	1.0
+chr2	726667	0.0	1.0	1.0
+chr2	726680	1.0	0.0	1.0
+chr2	726689	1.0	0.0	1.0
+chr2	726697	1.0	0.0	1.0
+chr2	726700	1.0	0.0	1.0
+chr2	726717	0.0	1.0	1.0
+chr2	726749	0.0	1.0	1.0
+chr2	726850	1.0	0.0	1.0
+chr2	726863	1.0	0.0	1.0
+chr2	726898	1.0	0.0	1.0
+chr2	726909	0.0	1.0	1.0
+chr2	727023	0.0	1.0	1.0
+chr2	727041	0.0	2.0	2.0
+chr2	727042	0.0	1.0	1.0
+chr2	727044	0.0	1.0	1.0
+chr2	727045	2.0	0.0	2.0
+chr2	727050	0.0	4.0	4.0
+chr2	727051	1.0	0.0	1.0
+chr2	727053	1.0	0.0	1.0
+chr2	727059	0.0	3.0	3.0
+chr2	727063	1.0	0.0	1.0
+chr2	727067	0.0	1.0	1.0
+chr2	727078	1.0	0.0	1.0
+chr2	727089	1.0	0.0	1.0
+chr2	727090	6.0	0.0	6.0
+chr2	727204	0.0	1.0	1.0
+chr2	727246	0.0	1.0	1.0
+chr2	727265	1.0	0.0	1.0
+chr2	727287	0.0	1.0	1.0
+chr2	727288	1.0	0.0	1.0
+chr2	727298	0.0	1.0	1.0
+chr2	727299	0.0	1.0	1.0
+chr2	727597	0.0	1.0	1.0
+chr2	727618	1.0	0.0	1.0
+chr2	727672	2.0	0.0	2.0
+chr2	727731	0.0	1.0	1.0
+chr2	727762	1.0	0.0	1.0
+chr2	727781	0.0	1.0	1.0
+chr2	727906	1.0	0.0	1.0
+chr2	727925	1.0	0.0	1.0
+chr2	727929	0.0	4.0	4.0
+chr2	727931	0.0	1.0	1.0
+chr2	727972	0.0	1.0	1.0
+chr2	728078	1.0	0.0	1.0
+chr2	728082	0.0	4.0	4.0
+chr2	728083	0.0	1.0	1.0
+chr2	728084	4.0	3.0	7.0
+chr2	728085	0.0	1.0	1.0
+chr2	728087	1.0	0.0	1.0
+chr2	728088	2.0	1.0	3.0
+chr2	728090	1.0	0.0	1.0
+chr2	728092	0.0	2.0	2.0
+chr2	728093	0.0	1.0	1.0
+chr2	728098	0.0	1.0	1.0
+chr2	728103	0.0	1.0	1.0
+chr2	728108	0.0	3.0	3.0
+chr2	728109	0.0	1.0	1.0
+chr2	728110	2.0	1.0	3.0
+chr2	728119	2.0	0.0	2.0
+chr2	728120	2.0	0.0	2.0
+chr2	728123	0.0	1.0	1.0
+chr2	728134	1.0	0.0	1.0
+chr2	728166	0.0	1.0	1.0
+chr2	728355	0.0	1.0	1.0
+chr2	728376	1.0	0.0	1.0
+chr2	728588	0.0	1.0	1.0
+chr2	728834	0.0	1.0	1.0
+chr2	728876	2.0	1.0	3.0
+chr2	728884	2.0	0.0	2.0
+chr2	728885	2.0	3.0	5.0
+chr2	728886	7.0	0.0	7.0
+chr2	728891	1.0	0.0	1.0
+chr2	728892	0.0	1.0	1.0
+chr2	728893	1.0	0.0	1.0
+chr2	728895	0.0	3.0	3.0
+chr2	728896	0.0	1.0	1.0
+chr2	728898	0.0	1.0	1.0
+chr2	728899	1.0	1.0	2.0
+chr2	728903	0.0	1.0	1.0
+chr2	728906	1.0	0.0	1.0
+chr2	728908	1.0	0.0	1.0
+chr2	728910	0.0	1.0	1.0
+chr2	728912	1.0	0.0	1.0
+chr2	728913	4.0	1.0	5.0
+chr2	728915	1.0	0.0	1.0
+chr2	728920	0.0	2.0	2.0
+chr2	728929	0.0	1.0	1.0
+chr2	728935	0.0	1.0	1.0
+chr2	729050	0.0	1.0	1.0
+chr2	729052	1.0	0.0	1.0
+chr2	729053	1.0	0.0	1.0
+chr2	729061	1.0	2.0	3.0
+chr2	729062	0.0	1.0	1.0
+chr2	729081	0.0	1.0	1.0
+chr2	729090	1.0	0.0	1.0
+chr2	729422	0.0	1.0	1.0
+chr2	729440	0.0	1.0	1.0
+chr2	729605	1.0	0.0	1.0
+chr2	729778	0.0	1.0	1.0
+chr2	729795	0.0	1.0	1.0
+chr2	729898	1.0	0.0	1.0
+chr2	729912	0.0	1.0	1.0
+chr2	729932	0.0	1.0	1.0
+chr2	729944	1.0	0.0	1.0
+chr2	729954	0.0	1.0	1.0
+chr2	729962	0.0	1.0	1.0
+chr2	729967	0.0	1.0	1.0
+chr2	730069	2.0	0.0	2.0
+chr2	730116	0.0	2.0	2.0
+chr2	730118	2.0	0.0	2.0
+chr2	730131	2.0	0.0	2.0
+chr2	730140	1.0	0.0	1.0
+chr2	730141	1.0	0.0	1.0
+chr2	730161	0.0	1.0	1.0
+chr2	730333	0.0	1.0	1.0
+chr2	730336	0.0	1.0	1.0
+chr2	730369	0.0	1.0	1.0
+chr2	730376	1.0	0.0	1.0
+chr2	730377	4.0	0.0	4.0
+chr2	730378	1.0	0.0	1.0
+chr2	730379	3.0	0.0	3.0
+chr2	730381	1.0	2.0	3.0
+chr2	730383	0.0	1.0	1.0
+chr2	730385	0.0	1.0	1.0
+chr2	730386	0.0	1.0	1.0
+chr2	730390	2.0	0.0	2.0
+chr2	730393	0.0	1.0	1.0
+chr2	730396	0.0	1.0	1.0
+chr2	730411	0.0	1.0	1.0
+chr2	730520	0.0	1.0	1.0
+chr2	730535	2.0	0.0	2.0
+chr2	730545	0.0	1.0	1.0
+chr2	730548	0.0	1.0	1.0
+chr2	730549	2.0	0.0	2.0
+chr2	730550	0.0	1.0	1.0
+chr2	730556	0.0	1.0	1.0
+chr2	730561	2.0	0.0	2.0
+chr2	730565	0.0	1.0	1.0
+chr2	730574	0.0	1.0	1.0
+chr2	730576	0.0	1.0	1.0
+chr2	730577	0.0	2.0	2.0
+chr2	730578	2.0	0.0	2.0
+chr2	730608	0.0	1.0	1.0
+chr2	730629	1.0	0.0	1.0
+chr2	730630	1.0	0.0	1.0
+chr2	730706	0.0	2.0	2.0
+chr2	730741	0.0	1.0	1.0
+chr2	730869	0.0	1.0	1.0
+chr2	730885	1.0	0.0	1.0
+chr2	731339	1.0	0.0	1.0
+chr2	731496	0.0	1.0	1.0
+chr2	731648	0.0	1.0	1.0
+chr2	732497	0.0	1.0	1.0
+chr2	732614	0.0	1.0	1.0
+chr2	732674	0.0	1.0	1.0
+chr2	732755	1.0	0.0	1.0
+chr2	732812	1.0	0.0	1.0
+chr2	732988	1.0	0.0	1.0
+chr2	732997	2.0	0.0	2.0
+chr2	733013	0.0	1.0	1.0
+chr2	733100	1.0	0.0	1.0
+chr2	733153	0.0	1.0	1.0
+chr2	733175	2.0	0.0	2.0
+chr2	733182	1.0	0.0	1.0
+chr2	733203	1.0	0.0	1.0
+chr2	733387	1.0	0.0	1.0
+chr2	733457	0.0	1.0	1.0
+chr2	733504	1.0	0.0	1.0
+chr2	733755	0.0	1.0	1.0
+chr2	733816	1.0	0.0	1.0
+chr2	734094	0.0	1.0	1.0
+chr2	734256	0.0	2.0	2.0
+chr2	734279	1.0	0.0	1.0
+chr2	734285	0.0	1.0	1.0
+chr2	734404	1.0	0.0	1.0
+chr2	734426	3.0	0.0	3.0
+chr2	734427	0.0	2.0	2.0
+chr2	734443	1.0	0.0	1.0
+chr2	734448	1.0	0.0	1.0
+chr2	734521	1.0	0.0	1.0
+chr2	734529	1.0	0.0	1.0
+chr2	734556	0.0	1.0	1.0
+chr2	734568	0.0	3.0	3.0
+chr2	734570	0.0	1.0	1.0
+chr2	734575	3.0	0.0	3.0
+chr2	734576	3.0	0.0	3.0
+chr2	734580	1.0	0.0	1.0
+chr2	734581	0.0	4.0	4.0
+chr2	734582	0.0	2.0	2.0
+chr2	734583	2.0	0.0	2.0
+chr2	734584	1.0	1.0	2.0
+chr2	734585	0.0	1.0	1.0
+chr2	734591	4.0	0.0	4.0
+chr2	734592	2.0	0.0	2.0
+chr2	734593	0.0	2.0	2.0
+chr2	734594	0.0	3.0	3.0
+chr2	734595	0.0	1.0	1.0
+chr2	734596	0.0	1.0	1.0
+chr2	734597	0.0	1.0	1.0
+chr2	734598	0.0	1.0	1.0
+chr2	734601	0.0	5.0	5.0
+chr2	734602	3.0	1.0	4.0
+chr2	734604	0.0	3.0	3.0
+chr2	734607	1.0	0.0	1.0
+chr2	734625	1.0	0.0	1.0
+chr2	734633	0.0	1.0	1.0
+chr2	734822	0.0	1.0	1.0
+chr2	734826	0.0	1.0	1.0
+chr2	734831	1.0	0.0	1.0
+chr2	734832	2.0	0.0	2.0
+chr2	734833	4.0	0.0	4.0
+chr2	734839	0.0	3.0	3.0
+chr2	734840	0.0	1.0	1.0
+chr2	734841	0.0	1.0	1.0
+chr2	734842	7.0	0.0	7.0
+chr2	734848	1.0	0.0	1.0
+chr2	734849	1.0	0.0	1.0
+chr2	734850	0.0	5.0	5.0
+chr2	734851	1.0	1.0	2.0
+chr2	734853	2.0	1.0	3.0
+chr2	734854	0.0	1.0	1.0
+chr2	734855	0.0	1.0	1.0
+chr2	734856	0.0	1.0	1.0
+chr2	734857	0.0	3.0	3.0
+chr2	734860	0.0	4.0	4.0
+chr2	734862	0.0	1.0	1.0
+chr2	734867	0.0	2.0	2.0
+chr2	734872	0.0	1.0	1.0
+chr2	734880	2.0	0.0	2.0
+chr2	734886	1.0	0.0	1.0
+chr2	734893	0.0	1.0	1.0
+chr2	734934	1.0	0.0	1.0
+chr2	734988	1.0	0.0	1.0
+chr2	735012	0.0	1.0	1.0
+chr2	735117	0.0	1.0	1.0
+chr2	735174	1.0	0.0	1.0
+chr2	735183	1.0	0.0	1.0
+chr2	735308	4.0	0.0	4.0
+chr2	735311	0.0	1.0	1.0
+chr2	735339	0.0	2.0	2.0
+chr2	735342	0.0	2.0	2.0
+chr2	735349	1.0	0.0	1.0
+chr2	735369	0.0	1.0	1.0
+chr2	735425	0.0	1.0	1.0
+chr2	735464	0.0	1.0	1.0
+chr2	735467	1.0	0.0	1.0
+chr2	735486	1.0	1.0	2.0
+chr2	735488	2.0	0.0	2.0
+chr2	735500	1.0	0.0	1.0
+chr2	735501	0.0	2.0	2.0
+chr2	735503	0.0	3.0	3.0
+chr2	735504	0.0	1.0	1.0
+chr2	735505	1.0	0.0	1.0
+chr2	735511	0.0	1.0	1.0
+chr2	735516	2.0	0.0	2.0
+chr2	735520	0.0	2.0	2.0
+chr2	735523	0.0	3.0	3.0
+chr2	735526	0.0	1.0	1.0
+chr2	735541	0.0	1.0	1.0
+chr2	735564	1.0	0.0	1.0
+chr2	735684	0.0	1.0	1.0
+chr2	735763	0.0	1.0	1.0
+chr2	735847	1.0	0.0	1.0
+chr2	735867	0.0	1.0	1.0
+chr2	735999	2.0	0.0	2.0
+chr2	736006	1.0	0.0	1.0
+chr2	736008	1.0	0.0	1.0
+chr2	736009	1.0	0.0	1.0
+chr2	736014	0.0	4.0	4.0
+chr2	736015	3.0	0.0	3.0
+chr2	736017	1.0	0.0	1.0
+chr2	736018	1.0	0.0	1.0
+chr2	736022	0.0	1.0	1.0
+chr2	736025	1.0	0.0	1.0
+chr2	736027	0.0	2.0	2.0
+chr2	736028	0.0	2.0	2.0
+chr2	736029	0.0	1.0	1.0
+chr2	736032	1.0	0.0	1.0
+chr2	736244	0.0	1.0	1.0
+chr2	736250	1.0	0.0	1.0
+chr2	736255	1.0	0.0	1.0
+chr2	736262	0.0	1.0	1.0
+chr2	736263	1.0	0.0	1.0
+chr2	736269	1.0	0.0	1.0
+chr2	736271	2.0	0.0	2.0
+chr2	736273	0.0	1.0	1.0
+chr2	736277	0.0	2.0	2.0
+chr2	736279	1.0	0.0	1.0
+chr2	736280	1.0	0.0	1.0
+chr2	736281	0.0	1.0	1.0
+chr2	736282	1.0	0.0	1.0
+chr2	736283	1.0	0.0	1.0
+chr2	736289	0.0	1.0	1.0
+chr2	736290	1.0	0.0	1.0
+chr2	736293	2.0	0.0	2.0
+chr2	736299	0.0	1.0	1.0
+chr2	736301	1.0	0.0	1.0
+chr2	736304	0.0	1.0	1.0
+chr2	736307	0.0	1.0	1.0
+chr2	736312	1.0	0.0	1.0
+chr2	736406	1.0	0.0	1.0
+chr2	736424	1.0	0.0	1.0
+chr2	736425	2.0	0.0	2.0
+chr2	736454	0.0	1.0	1.0
+chr2	736456	1.0	0.0	1.0
+chr2	736473	1.0	0.0	1.0
+chr2	736577	1.0	0.0	1.0
+chr2	736599	1.0	0.0	1.0
+chr2	736657	1.0	0.0	1.0
+chr2	736780	0.0	1.0	1.0
+chr2	736924	0.0	1.0	1.0
+chr2	737109	1.0	0.0	1.0
+chr2	737213	0.0	1.0	1.0
+chr2	737281	0.0	1.0	1.0
+chr2	737376	0.0	1.0	1.0
+chr2	737954	0.0	1.0	1.0
+chr2	737968	0.0	1.0	1.0
+chr2	737985	1.0	0.0	1.0
+chr2	737987	0.0	1.0	1.0
+chr2	738001	1.0	0.0	1.0
+chr2	738002	1.0	0.0	1.0
+chr2	738046	0.0	1.0	1.0
+chr2	738141	0.0	1.0	1.0
+chr2	738142	1.0	0.0	1.0
+chr2	738145	1.0	0.0	1.0
+chr2	738165	0.0	1.0	1.0
+chr2	738230	0.0	1.0	1.0
+chr2	738255	0.0	1.0	1.0
+chr2	738262	0.0	1.0	1.0
+chr2	738286	0.0	1.0	1.0
+chr2	738303	2.0	0.0	2.0
+chr2	738305	0.0	1.0	1.0
+chr2	738306	0.0	1.0	1.0
+chr2	738308	1.0	0.0	1.0
+chr2	738311	1.0	0.0	1.0
+chr2	738313	1.0	1.0	2.0
+chr2	738316	0.0	1.0	1.0
+chr2	738317	1.0	0.0	1.0
+chr2	738319	0.0	3.0	3.0
+chr2	738320	0.0	1.0	1.0
+chr2	738322	0.0	1.0	1.0
+chr2	738323	0.0	1.0	1.0
+chr2	738328	1.0	0.0	1.0
+chr2	738332	1.0	0.0	1.0
+chr2	738333	0.0	1.0	1.0
+chr2	738334	0.0	1.0	1.0
+chr2	738335	0.0	1.0	1.0
+chr2	738363	0.0	1.0	1.0
+chr2	738469	0.0	1.0	1.0
+chr2	738551	0.0	1.0	1.0
+chr2	738576	0.0	2.0	2.0
+chr2	738577	1.0	5.0	6.0
+chr2	738588	1.0	0.0	1.0
+chr2	738620	3.0	0.0	3.0
+chr2	738627	2.0	0.0	2.0
+chr2	738634	1.0	0.0	1.0
+chr2	738715	0.0	1.0	1.0
+chr2	738743	0.0	1.0	1.0
+chr2	738750	0.0	2.0	2.0
+chr2	738752	0.0	1.0	1.0
+chr2	738753	1.0	0.0	1.0
+chr2	738760	1.0	0.0	1.0
+chr2	738761	1.0	0.0	1.0
+chr2	738767	1.0	0.0	1.0
+chr2	738784	0.0	1.0	1.0
+chr2	738809	2.0	0.0	2.0
+chr2	738916	0.0	1.0	1.0
+chr2	738922	0.0	1.0	1.0
+chr2	738924	0.0	1.0	1.0
+chr2	739017	0.0	2.0	2.0
+chr2	739061	0.0	1.0	1.0
+chr2	739144	0.0	1.0	1.0
+chr2	739282	1.0	0.0	1.0
+chr2	739434	1.0	0.0	1.0
+chr2	739438	0.0	1.0	1.0
+chr2	739442	0.0	1.0	1.0
+chr2	739462	1.0	0.0	1.0
+chr2	739510	0.0	1.0	1.0
+chr2	739550	0.0	1.0	1.0
+chr2	739558	0.0	1.0	1.0
+chr2	739564	0.0	1.0	1.0
+chr2	739582	1.0	0.0	1.0
+chr2	739591	1.0	0.0	1.0
+chr2	739608	1.0	0.0	1.0
+chr2	739803	0.0	1.0	1.0
+chr2	739847	1.0	0.0	1.0
+chr2	739863	1.0	0.0	1.0
+chr2	739874	1.0	0.0	1.0
+chr2	739877	1.0	0.0	1.0
+chr2	739882	0.0	1.0	1.0
+chr2	739884	1.0	2.0	3.0
+chr2	740018	0.0	1.0	1.0
+chr2	740019	0.0	1.0	1.0
+chr2	740400	1.0	0.0	1.0
+chr2	740512	0.0	1.0	1.0
+chr2	740520	0.0	2.0	2.0
+chr2	740693	0.0	1.0	1.0
+chr2	741031	1.0	1.0	2.0
+chr2	741056	1.0	0.0	1.0
+chr2	741072	0.0	1.0	1.0
+chr2	741265	0.0	1.0	1.0
+chr2	741296	1.0	0.0	1.0
+chr2	741316	0.0	1.0	1.0
+chr2	741317	0.0	1.0	1.0
+chr2	741319	0.0	1.0	1.0
+chr2	741322	2.0	0.0	2.0
+chr2	741327	0.0	5.0	5.0
+chr2	741328	0.0	6.0	6.0
+chr2	741329	0.0	2.0	2.0
+chr2	741330	1.0	1.0	2.0
+chr2	741331	2.0	0.0	2.0
+chr2	741332	2.0	0.0	2.0
+chr2	741334	2.0	2.0	4.0
+chr2	741335	2.0	0.0	2.0
+chr2	741337	1.0	0.0	1.0
+chr2	741349	1.0	0.0	1.0
+chr2	741351	0.0	1.0	1.0
+chr2	741353	0.0	1.0	1.0
+chr2	741399	3.0	0.0	3.0
+chr2	741425	1.0	0.0	1.0
+chr2	741437	1.0	0.0	1.0
+chr2	741462	0.0	1.0	1.0
+chr2	741478	1.0	0.0	1.0
+chr2	741482	0.0	1.0	1.0
+chr2	741491	1.0	0.0	1.0
+chr2	741501	1.0	0.0	1.0
+chr2	741503	1.0	0.0	1.0
+chr2	741631	2.0	0.0	2.0
+chr2	741868	0.0	1.0	1.0
+chr2	741904	1.0	0.0	1.0
+chr2	741910	0.0	1.0	1.0
+chr2	741913	1.0	0.0	1.0
+chr2	741930	1.0	1.0	2.0
+chr2	741932	1.0	0.0	1.0
+chr2	741937	0.0	2.0	2.0
+chr2	741946	1.0	0.0	1.0
+chr2	741968	1.0	0.0	1.0
+chr2	742226	0.0	3.0	3.0
+chr2	742363	0.0	2.0	2.0
+chr2	742375	1.0	0.0	1.0
+chr2	742381	1.0	0.0	1.0
+chr2	742383	1.0	0.0	1.0
+chr2	742385	0.0	1.0	1.0
+chr2	742392	0.0	1.0	1.0
+chr2	742417	0.0	1.0	1.0
+chr2	742497	1.0	0.0	1.0
+chr2	742505	1.0	0.0	1.0
+chr2	742508	0.0	1.0	1.0
+chr2	742510	1.0	1.0	2.0
+chr2	742535	0.0	1.0	1.0
+chr2	742537	0.0	2.0	2.0
+chr2	742568	0.0	1.0	1.0
+chr2	742569	1.0	0.0	1.0
+chr2	742767	0.0	1.0	1.0
+chr2	742794	2.0	0.0	2.0
+chr2	742810	0.0	1.0	1.0
+chr2	742815	1.0	1.0	2.0
+chr2	742816	0.0	1.0	1.0
+chr2	742818	0.0	3.0	3.0
+chr2	742822	0.0	1.0	1.0
+chr2	742823	1.0	0.0	1.0
+chr2	742828	0.0	2.0	2.0
+chr2	742829	0.0	2.0	2.0
+chr2	742830	0.0	1.0	1.0
+chr2	742831	0.0	1.0	1.0
+chr2	742835	3.0	0.0	3.0
+chr2	742837	1.0	0.0	1.0
+chr2	742840	1.0	0.0	1.0
+chr2	742965	1.0	0.0	1.0
+chr2	743019	1.0	0.0	1.0
+chr2	743056	0.0	1.0	1.0
+chr2	743130	0.0	2.0	2.0
+chr2	743145	1.0	0.0	1.0
+chr2	743193	1.0	0.0	1.0
+chr2	743256	0.0	2.0	2.0
+chr2	743324	1.0	0.0	1.0
+chr2	743455	0.0	1.0	1.0
+chr2	743575	1.0	0.0	1.0
+chr2	743605	0.0	1.0	1.0
+chr2	743852	0.0	2.0	2.0
+chr2	743860	1.0	0.0	1.0
+chr2	743880	1.0	0.0	1.0
+chr2	744023	0.0	1.0	1.0
+chr2	744036	0.0	2.0	2.0
+chr2	744043	0.0	1.0	1.0
+chr2	744071	1.0	0.0	1.0
+chr2	744074	0.0	1.0	1.0
+chr2	744078	0.0	2.0	2.0
+chr2	744174	1.0	0.0	1.0
+chr2	744190	1.0	0.0	1.0
+chr2	744198	0.0	1.0	1.0
+chr2	744201	1.0	0.0	1.0
+chr2	744202	1.0	0.0	1.0
+chr2	744208	1.0	0.0	1.0
+chr2	744218	0.0	4.0	4.0
+chr2	744226	3.0	0.0	3.0
+chr2	744241	0.0	2.0	2.0
+chr2	744249	2.0	0.0	2.0
+chr2	744292	0.0	1.0	1.0
+chr2	744296	0.0	1.0	1.0
+chr2	744333	1.0	0.0	1.0
+chr2	744349	0.0	1.0	1.0
+chr2	744351	1.0	0.0	1.0
+chr2	744356	0.0	1.0	1.0
+chr2	744362	0.0	1.0	1.0
+chr2	744364	0.0	2.0	2.0
+chr2	744369	1.0	0.0	1.0
+chr2	744370	0.0	3.0	3.0
+chr2	744372	0.0	1.0	1.0
+chr2	744373	2.0	0.0	2.0
+chr2	744374	5.0	0.0	5.0
+chr2	744375	0.0	2.0	2.0
+chr2	744376	0.0	1.0	1.0
+chr2	744377	0.0	2.0	2.0
+chr2	744379	0.0	1.0	1.0
+chr2	744382	1.0	0.0	1.0
+chr2	744384	0.0	1.0	1.0
+chr2	744386	0.0	1.0	1.0
+chr2	744389	0.0	2.0	2.0
+chr2	744392	2.0	0.0	2.0
+chr2	744393	0.0	2.0	2.0
+chr2	744396	0.0	5.0	5.0
+chr2	744398	1.0	0.0	1.0
+chr2	744400	1.0	0.0	1.0
+chr2	744406	1.0	0.0	1.0
+chr2	744408	0.0	2.0	2.0
+chr2	744420	1.0	0.0	1.0
+chr2	744567	0.0	1.0	1.0
+chr2	744576	1.0	0.0	1.0
+chr2	744590	0.0	1.0	1.0
+chr2	744600	1.0	2.0	3.0
+chr2	744604	1.0	0.0	1.0
+chr2	744606	1.0	0.0	1.0
+chr2	744608	4.0	0.0	4.0
+chr2	744609	4.0	3.0	7.0
+chr2	744610	0.0	2.0	2.0
+chr2	744613	0.0	1.0	1.0
+chr2	744616	1.0	0.0	1.0
+chr2	744617	2.0	0.0	2.0
+chr2	744623	1.0	0.0	1.0
+chr2	744624	1.0	0.0	1.0
+chr2	744626	0.0	5.0	5.0
+chr2	744627	0.0	1.0	1.0
+chr2	744631	2.0	0.0	2.0
+chr2	744641	0.0	1.0	1.0
+chr2	744642	0.0	1.0	1.0
+chr2	744650	1.0	0.0	1.0
+chr2	744654	0.0	1.0	1.0
+chr2	744838	0.0	1.0	1.0
+chr2	744855	1.0	0.0	1.0
+chr2	744864	3.0	0.0	3.0
+chr2	744869	1.0	1.0	2.0
+chr2	744870	1.0	0.0	1.0
+chr2	744873	1.0	0.0	1.0
+chr2	744874	0.0	4.0	4.0
+chr2	744875	0.0	1.0	1.0
+chr2	744879	1.0	0.0	1.0
+chr2	744880	0.0	1.0	1.0
+chr2	744881	2.0	0.0	2.0
+chr2	744882	0.0	1.0	1.0
+chr2	744883	0.0	1.0	1.0
+chr2	744886	2.0	0.0	2.0
+chr2	744893	1.0	0.0	1.0
+chr2	744914	1.0	0.0	1.0
+chr2	744920	1.0	0.0	1.0
+chr2	744988	1.0	0.0	1.0
+chr2	745016	0.0	2.0	2.0
+chr2	745018	0.0	1.0	1.0
+chr2	745029	0.0	1.0	1.0
+chr2	745037	1.0	0.0	1.0
+chr2	745045	0.0	1.0	1.0
+chr2	745048	1.0	0.0	1.0
+chr2	745050	0.0	1.0	1.0
+chr2	745181	0.0	1.0	1.0
+chr2	745372	1.0	0.0	1.0
+chr2	745701	0.0	1.0	1.0
+chr2	745838	1.0	0.0	1.0
+chr2	746320	1.0	0.0	1.0
+chr2	746563	0.0	1.0	1.0
+chr2	746910	0.0	1.0	1.0
+chr2	746931	1.0	0.0	1.0
+chr2	747116	1.0	0.0	1.0
+chr2	747266	0.0	1.0	1.0
+chr2	747269	1.0	0.0	1.0
+chr2	747393	1.0	0.0	1.0
+chr2	747413	3.0	0.0	3.0
+chr2	747423	0.0	1.0	1.0
+chr2	747466	1.0	0.0	1.0
+chr2	747581	0.0	1.0	1.0
+chr2	747590	1.0	0.0	1.0
+chr2	747593	0.0	1.0	1.0
+chr2	747600	0.0	2.0	2.0
+chr2	747607	1.0	0.0	1.0
+chr2	747738	0.0	1.0	1.0
+chr2	747739	1.0	0.0	1.0
+chr2	747746	1.0	0.0	1.0
+chr2	747747	0.0	2.0	2.0
+chr2	747750	1.0	0.0	1.0
+chr2	747757	0.0	3.0	3.0
+chr2	747759	0.0	1.0	1.0
+chr2	747760	1.0	0.0	1.0
+chr2	747764	0.0	2.0	2.0
+chr2	747775	1.0	0.0	1.0
+chr2	747776	0.0	1.0	1.0
+chr2	747777	1.0	0.0	1.0
+chr2	747778	0.0	1.0	1.0
+chr2	747779	1.0	0.0	1.0
+chr2	747785	0.0	1.0	1.0
+chr2	747789	1.0	0.0	1.0
+chr2	747791	0.0	1.0	1.0
+chr2	747793	0.0	2.0	2.0
+chr2	748150	0.0	2.0	2.0
+chr2	748151	0.0	1.0	1.0
+chr2	748162	0.0	1.0	1.0
+chr2	748313	0.0	1.0	1.0
+chr2	748401	0.0	1.0	1.0
+chr2	748470	0.0	2.0	2.0
+chr2	748511	1.0	0.0	1.0
+chr2	748986	0.0	2.0	2.0
+chr2	748993	0.0	2.0	2.0
+chr2	749004	1.0	0.0	1.0
+chr2	749012	0.0	1.0	1.0
+chr2	749022	2.0	0.0	2.0
+chr2	749027	1.0	0.0	1.0
+chr2	749150	1.0	0.0	1.0
+chr2	749162	0.0	1.0	1.0
+chr2	749171	0.0	3.0	3.0
+chr2	749173	0.0	2.0	2.0
+chr2	749191	0.0	1.0	1.0
+chr2	749281	0.0	1.0	1.0
+chr2	749311	1.0	0.0	1.0
+chr2	749321	1.0	0.0	1.0
+chr2	749322	2.0	0.0	2.0
+chr2	749323	0.0	1.0	1.0
+chr2	749325	1.0	0.0	1.0
+chr2	749327	0.0	1.0	1.0
+chr2	749328	0.0	2.0	2.0
+chr2	749330	2.0	1.0	3.0
+chr2	749331	2.0	0.0	2.0
+chr2	749332	0.0	1.0	1.0
+chr2	749333	3.0	0.0	3.0
+chr2	749334	0.0	5.0	5.0
+chr2	749335	0.0	2.0	2.0
+chr2	749337	2.0	0.0	2.0
+chr2	749338	0.0	1.0	1.0
+chr2	749341	0.0	6.0	6.0
+chr2	749345	1.0	1.0	2.0
+chr2	749349	0.0	5.0	5.0
+chr2	749353	1.0	0.0	1.0
+chr2	749361	1.0	0.0	1.0
+chr2	749365	0.0	1.0	1.0
+chr2	749378	0.0	1.0	1.0
+chr2	749379	0.0	1.0	1.0
+chr2	749385	1.0	0.0	1.0
+chr2	749401	1.0	1.0	2.0
+chr2	749402	0.0	1.0	1.0
+chr2	749405	1.0	0.0	1.0
+chr2	749553	1.0	0.0	1.0
+chr2	749569	0.0	1.0	1.0
+chr2	749575	0.0	1.0	1.0
+chr2	749578	1.0	0.0	1.0
+chr2	749581	1.0	0.0	1.0
+chr2	749582	2.0	0.0	2.0
+chr2	749585	9.0	0.0	9.0
+chr2	749586	3.0	0.0	3.0
+chr2	749590	0.0	3.0	3.0
+chr2	749596	2.0	0.0	2.0
+chr2	749597	1.0	0.0	1.0
+chr2	749598	2.0	0.0	2.0
+chr2	749600	0.0	2.0	2.0
+chr2	749601	0.0	3.0	3.0
+chr2	749602	0.0	1.0	1.0
+chr2	749603	0.0	1.0	1.0
+chr2	749604	1.0	0.0	1.0
+chr2	749618	2.0	0.0	2.0
+chr2	749626	1.0	0.0	1.0
+chr2	749744	0.0	1.0	1.0
+chr2	749761	1.0	0.0	1.0
+chr2	749764	0.0	1.0	1.0
+chr2	749781	0.0	1.0	1.0
+chr2	749960	0.0	1.0	1.0
+chr2	750115	1.0	0.0	1.0
+chr2	750121	0.0	1.0	1.0
+chr2	750125	1.0	0.0	1.0
+chr2	750162	1.0	0.0	1.0
+chr2	750183	1.0	0.0	1.0
+chr2	750389	2.0	0.0	2.0
+chr2	750418	0.0	1.0	1.0
+chr2	750429	0.0	1.0	1.0
+chr2	750435	0.0	1.0	1.0
+chr2	750437	0.0	1.0	1.0
+chr2	750478	0.0	1.0	1.0
+chr2	750569	1.0	0.0	1.0
+chr2	750570	1.0	0.0	1.0
+chr2	750639	0.0	1.0	1.0
+chr2	751076	0.0	1.0	1.0
+chr2	751088	1.0	0.0	1.0
+chr2	751164	0.0	1.0	1.0
+chr2	751560	0.0	1.0	1.0
+chr2	751570	1.0	0.0	1.0
+chr2	751775	1.0	0.0	1.0
+chr2	752839	1.0	0.0	1.0
+chr2	752843	1.0	0.0	1.0
+chr2	753013	1.0	0.0	1.0
+chr2	753130	1.0	0.0	1.0
+chr2	753245	0.0	1.0	1.0
+chr2	753250	0.0	1.0	1.0
+chr2	753736	0.0	1.0	1.0
+chr2	754173	1.0	0.0	1.0
+chr2	754448	0.0	1.0	1.0
+chr2	754762	0.0	1.0	1.0
+chr2	754947	0.0	1.0	1.0
+chr2	755799	1.0	0.0	1.0
+chr2	756034	1.0	0.0	1.0
+chr2	756448	1.0	0.0	1.0
+chr2	756461	1.0	0.0	1.0
+chr2	756479	0.0	1.0	1.0
+chr2	756686	0.0	1.0	1.0
+chr2	756795	1.0	0.0	1.0
+chr2	756807	0.0	1.0	1.0
+chr2	756853	1.0	0.0	1.0
+chr2	756869	1.0	0.0	1.0
+chr2	756986	2.0	0.0	2.0
+chr2	756990	0.0	1.0	1.0
+chr2	757007	0.0	1.0	1.0
+chr2	757022	1.0	0.0	1.0
+chr2	757142	1.0	0.0	1.0
+chr2	757143	1.0	0.0	1.0
+chr2	757146	1.0	0.0	1.0
+chr2	757155	1.0	0.0	1.0
+chr2	757156	1.0	0.0	1.0
+chr2	757161	0.0	1.0	1.0
+chr2	757162	0.0	1.0	1.0
+chr2	757163	0.0	2.0	2.0
+chr2	757164	1.0	0.0	1.0
+chr2	757165	1.0	0.0	1.0
+chr2	757170	0.0	1.0	1.0
+chr2	757175	1.0	0.0	1.0
+chr2	757184	0.0	2.0	2.0
+chr2	757205	1.0	0.0	1.0
+chr2	757254	0.0	1.0	1.0
+chr2	757407	0.0	1.0	1.0
+chr2	757411	0.0	1.0	1.0
+chr2	757421	0.0	3.0	3.0
+chr2	757430	1.0	0.0	1.0
+chr2	757771	0.0	1.0	1.0
+chr2	757792	1.0	0.0	1.0
+chr2	757799	2.0	0.0	2.0
+chr2	757805	1.0	0.0	1.0
+chr2	757815	1.0	0.0	1.0
+chr2	757834	2.0	0.0	2.0
+chr2	758086	0.0	1.0	1.0
+chr2	759075	0.0	1.0	1.0
+chr2	759170	0.0	1.0	1.0
+chr2	759549	0.0	1.0	1.0
+chr2	759937	0.0	1.0	1.0
+chr2	760005	1.0	0.0	1.0
+chr2	760037	0.0	1.0	1.0
+chr2	760042	1.0	0.0	1.0
+chr2	760060	0.0	2.0	2.0
+chr2	760066	0.0	1.0	1.0
+chr2	760068	0.0	1.0	1.0
+chr2	760069	1.0	0.0	1.0
+chr2	760072	1.0	0.0	1.0
+chr2	760075	1.0	0.0	1.0
+chr2	760078	1.0	0.0	1.0
+chr2	760081	0.0	2.0	2.0
+chr2	760083	1.0	0.0	1.0
+chr2	760091	0.0	2.0	2.0
+chr2	760092	1.0	0.0	1.0
+chr2	760233	1.0	0.0	1.0
+chr2	760250	0.0	1.0	1.0
+chr2	760306	1.0	1.0	2.0
+chr2	760309	1.0	1.0	2.0
+chr2	760310	0.0	3.0	3.0
+chr2	760317	0.0	1.0	1.0
+chr2	760318	1.0	0.0	1.0
+chr2	760331	1.0	0.0	1.0
+chr2	760334	0.0	1.0	1.0
+chr2	760344	0.0	1.0	1.0
+chr2	760345	0.0	1.0	1.0
+chr2	760466	0.0	1.0	1.0
+chr2	760468	1.0	0.0	1.0
+chr2	760472	0.0	1.0	1.0
+chr2	760481	1.0	0.0	1.0
+chr2	760488	0.0	2.0	2.0
+chr2	760506	1.0	0.0	1.0
+chr2	760515	0.0	1.0	1.0
+chr2	760518	1.0	0.0	1.0
+chr2	760519	1.0	0.0	1.0
+chr2	760553	0.0	2.0	2.0
+chr2	760591	1.0	0.0	1.0
+chr2	760637	1.0	0.0	1.0
+chr2	760667	1.0	0.0	1.0
+chr2	760674	1.0	0.0	1.0
+chr2	760681	1.0	0.0	1.0
+chr2	760682	2.0	0.0	2.0
+chr2	760689	0.0	3.0	3.0
+chr2	760720	0.0	1.0	1.0
+chr2	760790	1.0	0.0	1.0
+chr2	760818	0.0	1.0	1.0
+chr2	760820	0.0	1.0	1.0
+chr2	760828	1.0	0.0	1.0
+chr2	760830	1.0	0.0	1.0
+chr2	760832	1.0	1.0	2.0
+chr2	760833	2.0	0.0	2.0
+chr2	760835	0.0	1.0	1.0
+chr2	760839	0.0	1.0	1.0
+chr2	760841	3.0	4.0	7.0
+chr2	760842	2.0	1.0	3.0
+chr2	760843	0.0	3.0	3.0
+chr2	760844	1.0	0.0	1.0
+chr2	760845	0.0	4.0	4.0
+chr2	760848	1.0	0.0	1.0
+chr2	760849	2.0	0.0	2.0
+chr2	760850	1.0	0.0	1.0
+chr2	760852	0.0	2.0	2.0
+chr2	760874	0.0	1.0	1.0
+chr2	760889	0.0	1.0	1.0
+chr2	760895	1.0	0.0	1.0
+chr2	760900	0.0	1.0	1.0
+chr2	761241	0.0	1.0	1.0
+chr2	761250	1.0	0.0	1.0
+chr2	761268	1.0	0.0	1.0
+chr2	761269	6.0	0.0	6.0
+chr2	761271	0.0	1.0	1.0
+chr2	761273	0.0	1.0	1.0
+chr2	761280	0.0	2.0	2.0
+chr2	761282	1.0	0.0	1.0
+chr2	761283	1.0	0.0	1.0
+chr2	761285	0.0	3.0	3.0
+chr2	761288	2.0	0.0	2.0
+chr2	761290	0.0	4.0	4.0
+chr2	761292	2.0	0.0	2.0
+chr2	761293	1.0	0.0	1.0
+chr2	761336	0.0	1.0	1.0
+chr2	761345	1.0	0.0	1.0
+chr2	761408	0.0	1.0	1.0
+chr2	761417	1.0	1.0	2.0
+chr2	761421	1.0	0.0	1.0
+chr2	761426	4.0	0.0	4.0
+chr2	761427	0.0	1.0	1.0
+chr2	761435	0.0	1.0	1.0
+chr2	761436	0.0	1.0	1.0
+chr2	761581	1.0	0.0	1.0
+chr2	761596	1.0	0.0	1.0
+chr2	761603	0.0	1.0	1.0
+chr2	761800	0.0	1.0	1.0
+chr2	761936	1.0	0.0	1.0
+chr2	762460	1.0	0.0	1.0
+chr2	762863	0.0	1.0	1.0
+chr2	762866	1.0	0.0	1.0
+chr2	762902	1.0	0.0	1.0
+chr2	762949	0.0	1.0	1.0
+chr2	763215	1.0	0.0	1.0
+chr2	763519	1.0	0.0	1.0
+chr2	763530	0.0	1.0	1.0
+chr2	763686	0.0	1.0	1.0
+chr2	763735	1.0	0.0	1.0
+chr2	763767	0.0	1.0	1.0
+chr2	763787	0.0	2.0	2.0
+chr2	763805	1.0	1.0	2.0
+chr2	763846	1.0	0.0	1.0
+chr2	763865	1.0	0.0	1.0
+chr2	763908	1.0	0.0	1.0
+chr2	763916	1.0	0.0	1.0
+chr2	763927	1.0	0.0	1.0
+chr2	763935	0.0	2.0	2.0
+chr2	763936	1.0	0.0	1.0
+chr2	763947	1.0	0.0	1.0
+chr2	763948	1.0	0.0	1.0
+chr2	764028	1.0	0.0	1.0
+chr2	764029	1.0	0.0	1.0
+chr2	764033	1.0	0.0	1.0
+chr2	764138	0.0	1.0	1.0
+chr2	764155	0.0	1.0	1.0
+chr2	764167	1.0	0.0	1.0
+chr2	764177	1.0	0.0	1.0
+chr2	764197	1.0	0.0	1.0
+chr2	764208	0.0	1.0	1.0
+chr2	764210	0.0	2.0	2.0
+chr2	764235	1.0	0.0	1.0
+chr2	764316	0.0	1.0	1.0
+chr2	764334	1.0	0.0	1.0
+chr2	764336	1.0	0.0	1.0
+chr2	764337	2.0	0.0	2.0
+chr2	764343	0.0	2.0	2.0
+chr2	764353	0.0	1.0	1.0
+chr2	764357	3.0	0.0	3.0
+chr2	764376	0.0	1.0	1.0
+chr2	764379	0.0	1.0	1.0
+chr2	764382	3.0	0.0	3.0
+chr2	764389	0.0	1.0	1.0
+chr2	764397	1.0	0.0	1.0
+chr2	764432	1.0	0.0	1.0
+chr2	764448	1.0	0.0	1.0
+chr2	764477	0.0	1.0	1.0
+chr2	764492	0.0	1.0	1.0
+chr2	764520	0.0	1.0	1.0
+chr2	764523	0.0	1.0	1.0
+chr2	764567	1.0	0.0	1.0
+chr2	764649	0.0	1.0	1.0
+chr2	764678	1.0	0.0	1.0
+chr2	764691	2.0	0.0	2.0
+chr2	764692	1.0	0.0	1.0
+chr2	764696	2.0	8.0	10.0
+chr2	764697	0.0	1.0	1.0
+chr2	764701	2.0	0.0	2.0
+chr2	764707	0.0	1.0	1.0
+chr2	764709	0.0	1.0	1.0
+chr2	764710	0.0	1.0	1.0
+chr2	765110	2.0	0.0	2.0
+chr2	765114	0.0	1.0	1.0
+chr2	765279	0.0	1.0	1.0
+chr2	765284	1.0	0.0	1.0
+chr2	765375	1.0	0.0	1.0
+chr2	765427	1.0	0.0	1.0
+chr2	765627	0.0	2.0	2.0
+chr2	766690	0.0	2.0	2.0
+chr2	766754	1.0	0.0	1.0
+chr2	767233	0.0	1.0	1.0
+chr2	767269	0.0	1.0	1.0
+chr2	767300	4.0	0.0	4.0
+chr2	767302	1.0	0.0	1.0
+chr2	767397	0.0	1.0	1.0
+chr2	767429	0.0	1.0	1.0
+chr2	767431	1.0	0.0	1.0
+chr2	767432	1.0	0.0	1.0
+chr2	767449	0.0	1.0	1.0
+chr2	767456	0.0	1.0	1.0
+chr2	767457	1.0	0.0	1.0
+chr2	767458	1.0	0.0	1.0
+chr2	767527	1.0	0.0	1.0
+chr2	767562	1.0	0.0	1.0
+chr2	767569	1.0	1.0	2.0
+chr2	767571	0.0	1.0	1.0
+chr2	767573	0.0	1.0	1.0
+chr2	767576	2.0	0.0	2.0
+chr2	767586	2.0	0.0	2.0
+chr2	767591	0.0	2.0	2.0
+chr2	767592	1.0	1.0	2.0
+chr2	767593	0.0	1.0	1.0
+chr2	767598	0.0	1.0	1.0
+chr2	767601	0.0	3.0	3.0
+chr2	767606	0.0	3.0	3.0
+chr2	767616	1.0	0.0	1.0
+chr2	767617	0.0	1.0	1.0
+chr2	767624	2.0	0.0	2.0
+chr2	767627	0.0	2.0	2.0
+chr2	767820	2.0	0.0	2.0
+chr2	767822	1.0	0.0	1.0
+chr2	767889	0.0	1.0	1.0
+chr2	767972	1.0	0.0	1.0
+chr2	767985	0.0	1.0	1.0
+chr2	768226	1.0	1.0	2.0
+chr2	768232	0.0	1.0	1.0
+chr2	768235	1.0	0.0	1.0
+chr2	768236	3.0	0.0	3.0
+chr2	768237	9.0	1.0	10.0
+chr2	768239	1.0	0.0	1.0
+chr2	768240	1.0	0.0	1.0
+chr2	768241	1.0	0.0	1.0
+chr2	768245	0.0	8.0	8.0
+chr2	768246	0.0	1.0	1.0
+chr2	768247	1.0	2.0	3.0
+chr2	768248	1.0	1.0	2.0
+chr2	768249	0.0	1.0	1.0
+chr2	768253	1.0	0.0	1.0
+chr2	768259	0.0	4.0	4.0
+chr2	768260	0.0	2.0	2.0
+chr2	768261	2.0	0.0	2.0
+chr2	768262	1.0	0.0	1.0
+chr2	768399	1.0	0.0	1.0
+chr2	768400	1.0	2.0	3.0
+chr2	768401	2.0	0.0	2.0
+chr2	768404	0.0	1.0	1.0
+chr2	768429	0.0	1.0	1.0
+chr2	768438	1.0	0.0	1.0
+chr2	768439	0.0	1.0	1.0
+chr2	768462	0.0	1.0	1.0
+chr2	768468	1.0	0.0	1.0
+chr2	768599	0.0	2.0	2.0
+chr2	768601	0.0	1.0	1.0
+chr2	768606	0.0	1.0	1.0
+chr2	768614	1.0	0.0	1.0
+chr2	769018	1.0	0.0	1.0
+chr2	769040	1.0	0.0	1.0
+chr2	769358	1.0	0.0	1.0
+chr2	770117	0.0	1.0	1.0
+chr2	770196	0.0	1.0	1.0
+chr2	770205	0.0	1.0	1.0
+chr2	770561	0.0	1.0	1.0
+chr2	770566	1.0	0.0	1.0
+chr2	770578	0.0	1.0	1.0
+chr2	770864	0.0	2.0	2.0
+chr2	770874	0.0	1.0	1.0
+chr2	770875	2.0	0.0	2.0
+chr2	770878	0.0	1.0	1.0
+chr2	770884	0.0	1.0	1.0
+chr2	770887	0.0	2.0	2.0
+chr2	770888	2.0	0.0	2.0
+chr2	770890	0.0	3.0	3.0
+chr2	770892	1.0	1.0	2.0
+chr2	770894	3.0	0.0	3.0
+chr2	770899	1.0	0.0	1.0
+chr2	770900	1.0	0.0	1.0
+chr2	770903	0.0	1.0	1.0
+chr2	770908	0.0	1.0	1.0
+chr2	770909	0.0	2.0	2.0
+chr2	770910	1.0	0.0	1.0
+chr2	770913	0.0	2.0	2.0
+chr2	770916	1.0	0.0	1.0
+chr2	770917	1.0	0.0	1.0
+chr2	770918	1.0	0.0	1.0
+chr2	770920	0.0	2.0	2.0
+chr2	770928	0.0	1.0	1.0
+chr2	770938	1.0	0.0	1.0
+chr2	771049	0.0	1.0	1.0
+chr2	771061	1.0	0.0	1.0
+chr2	771074	0.0	1.0	1.0
+chr2	771206	0.0	3.0	3.0
+chr2	771207	3.0	0.0	3.0
+chr2	771208	0.0	1.0	1.0
+chr2	771213	0.0	1.0	1.0
+chr2	771220	1.0	0.0	1.0
+chr2	771221	0.0	1.0	1.0
+chr2	771231	3.0	0.0	3.0
+chr2	771239	1.0	0.0	1.0
+chr2	771242	2.0	0.0	2.0
+chr2	771243	0.0	1.0	1.0
+chr2	771375	0.0	1.0	1.0
+chr2	771388	1.0	1.0	2.0
+chr2	771394	0.0	1.0	1.0
+chr2	771400	1.0	0.0	1.0
+chr2	771414	1.0	0.0	1.0
+chr2	771448	1.0	0.0	1.0
+chr2	771557	1.0	0.0	1.0
+chr2	771562	0.0	2.0	2.0
+chr2	771569	2.0	0.0	2.0
+chr2	771570	0.0	1.0	1.0
+chr2	771590	0.0	1.0	1.0
+chr2	771654	1.0	0.0	1.0
+chr2	771736	0.0	1.0	1.0
+chr2	771761	0.0	1.0	1.0
+chr2	771824	0.0	1.0	1.0
+chr2	771880	0.0	1.0	1.0
+chr2	771930	1.0	0.0	1.0
+chr2	772004	1.0	0.0	1.0
+chr2	772012	1.0	0.0	1.0
+chr2	772021	1.0	0.0	1.0
+chr2	772064	0.0	1.0	1.0
+chr2	772072	0.0	1.0	1.0
+chr2	772086	1.0	0.0	1.0
+chr2	772088	0.0	1.0	1.0
+chr2	772091	2.0	0.0	2.0
+chr2	772100	0.0	1.0	1.0
+chr2	772107	2.0	0.0	2.0
+chr2	772115	0.0	2.0	2.0
+chr2	772134	0.0	1.0	1.0
+chr2	772177	0.0	1.0	1.0
+chr2	772210	0.0	2.0	2.0
+chr2	772242	0.0	1.0	1.0
+chr2	772245	0.0	2.0	2.0
+chr2	772281	1.0	0.0	1.0
+chr2	772299	1.0	0.0	1.0
+chr2	772328	0.0	2.0	2.0
+chr2	772345	0.0	1.0	1.0
+chr2	772363	0.0	1.0	1.0
+chr2	772365	0.0	1.0	1.0
+chr2	772372	0.0	1.0	1.0
+chr2	772374	0.0	1.0	1.0
+chr2	772386	1.0	0.0	1.0
+chr2	772407	1.0	1.0	2.0
+chr2	772513	1.0	0.0	1.0
+chr2	772528	1.0	0.0	1.0
+chr2	772561	0.0	1.0	1.0
+chr2	772637	0.0	3.0	3.0
+chr2	772701	1.0	0.0	1.0
+chr2	772706	0.0	1.0	1.0
+chr2	772710	0.0	1.0	1.0
+chr2	772883	0.0	2.0	2.0
+chr2	772887	1.0	0.0	1.0
+chr2	772889	0.0	1.0	1.0
+chr2	772892	0.0	1.0	1.0
+chr2	772898	0.0	1.0	1.0
+chr2	772910	0.0	1.0	1.0
+chr2	773031	1.0	0.0	1.0
+chr2	773042	2.0	0.0	2.0
+chr2	773047	2.0	0.0	2.0
+chr2	773074	0.0	1.0	1.0
+chr2	773202	1.0	0.0	1.0
+chr2	773213	1.0	0.0	1.0
+chr2	773526	1.0	0.0	1.0
+chr2	773529	1.0	0.0	1.0
+chr2	773543	2.0	0.0	2.0
+chr2	773544	0.0	2.0	2.0
+chr2	773562	1.0	0.0	1.0
+chr2	773578	1.0	0.0	1.0
+chr2	773582	1.0	0.0	1.0
+chr2	773583	0.0	1.0	1.0
+chr2	773584	0.0	2.0	2.0
+chr2	773595	0.0	1.0	1.0
+chr2	773619	0.0	1.0	1.0
+chr2	773678	0.0	1.0	1.0
+chr2	773952	0.0	1.0	1.0
+chr2	774047	0.0	1.0	1.0
+chr2	774064	0.0	1.0	1.0
+chr2	774123	0.0	1.0	1.0
+chr2	774137	0.0	1.0	1.0
+chr2	774146	0.0	1.0	1.0
+chr2	774242	1.0	0.0	1.0
+chr2	774251	1.0	0.0	1.0
+chr2	774277	1.0	0.0	1.0
+chr2	774294	0.0	3.0	3.0
+chr2	774295	1.0	0.0	1.0
+chr2	774299	1.0	0.0	1.0
+chr2	774308	1.0	0.0	1.0
+chr2	774321	0.0	1.0	1.0
+chr2	774327	1.0	0.0	1.0
+chr2	774464	0.0	1.0	1.0
+chr2	774719	1.0	0.0	1.0
+chr2	774721	0.0	1.0	1.0
+chr2	774723	0.0	1.0	1.0
+chr2	774725	1.0	0.0	1.0
+chr2	774732	1.0	0.0	1.0
+chr2	774740	0.0	5.0	5.0
+chr2	774743	0.0	1.0	1.0
+chr2	774754	1.0	0.0	1.0
+chr2	774781	1.0	0.0	1.0
+chr2	774835	0.0	1.0	1.0
+chr2	774840	0.0	1.0	1.0
+chr2	774952	1.0	0.0	1.0
+chr2	775224	1.0	0.0	1.0
+chr2	775465	1.0	0.0	1.0
+chr2	775692	1.0	0.0	1.0
+chr2	775799	1.0	0.0	1.0
+chr2	776085	1.0	0.0	1.0
+chr2	776124	1.0	0.0	1.0
+chr2	776229	1.0	0.0	1.0
+chr2	776247	2.0	0.0	2.0
+chr2	776256	1.0	0.0	1.0
+chr2	776258	0.0	1.0	1.0
+chr2	776527	0.0	1.0	1.0
+chr2	776546	0.0	1.0	1.0
+chr2	776558	2.0	0.0	2.0
+chr2	776562	0.0	1.0	1.0
+chr2	776565	1.0	0.0	1.0
+chr2	776566	1.0	0.0	1.0
+chr2	776719	0.0	2.0	2.0
+chr2	776720	0.0	1.0	1.0
+chr2	776897	0.0	1.0	1.0
+chr2	777050	0.0	1.0	1.0
+chr2	777092	1.0	0.0	1.0
+chr2	777114	0.0	1.0	1.0
+chr2	777226	1.0	0.0	1.0
+chr2	777362	1.0	0.0	1.0
+chr2	777590	0.0	2.0	2.0
+chr2	777626	0.0	1.0	1.0
+chr2	778940	0.0	1.0	1.0
+chr2	778949	0.0	1.0	1.0
+chr2	779131	1.0	0.0	1.0
+chr2	779273	1.0	0.0	1.0
+chr2	779287	1.0	0.0	1.0
+chr2	779304	1.0	1.0	2.0
+chr2	779363	1.0	0.0	1.0
+chr2	779416	1.0	0.0	1.0
+chr2	779424	0.0	1.0	1.0
+chr2	779430	6.0	0.0	6.0
+chr2	779431	2.0	0.0	2.0
+chr2	779437	0.0	1.0	1.0
+chr2	779438	0.0	1.0	1.0
+chr2	779440	0.0	2.0	2.0
+chr2	779441	0.0	1.0	1.0
+chr2	779444	4.0	0.0	4.0
+chr2	779448	0.0	8.0	8.0
+chr2	779451	1.0	3.0	4.0
+chr2	779454	3.0	0.0	3.0
+chr2	779465	0.0	1.0	1.0
+chr2	779482	0.0	1.0	1.0
+chr2	779682	0.0	2.0	2.0
+chr2	779691	0.0	1.0	1.0
+chr2	779698	0.0	2.0	2.0
+chr2	779699	2.0	2.0	4.0
+chr2	779700	1.0	0.0	1.0
+chr2	779702	1.0	0.0	1.0
+chr2	779709	3.0	0.0	3.0
+chr2	779710	0.0	1.0	1.0
+chr2	779711	1.0	0.0	1.0
+chr2	779712	0.0	2.0	2.0
+chr2	779714	2.0	0.0	2.0
+chr2	779715	0.0	2.0	2.0
+chr2	779717	0.0	2.0	2.0
+chr2	779721	1.0	0.0	1.0
+chr2	779726	0.0	1.0	1.0
+chr2	779731	0.0	2.0	2.0
+chr2	779775	1.0	0.0	1.0
+chr2	779855	1.0	0.0	1.0
+chr2	779857	0.0	1.0	1.0
+chr2	779861	1.0	0.0	1.0
+chr2	779863	0.0	1.0	1.0
+chr2	779869	1.0	0.0	1.0
+chr2	779878	0.0	1.0	1.0
+chr2	780013	0.0	1.0	1.0
+chr2	780190	1.0	0.0	1.0
+chr2	780218	1.0	0.0	1.0
+chr2	780230	1.0	0.0	1.0
+chr2	780707	1.0	0.0	1.0
+chr2	780969	0.0	1.0	1.0
+chr2	781332	0.0	1.0	1.0
+chr2	781448	0.0	2.0	2.0
+chr2	781779	1.0	0.0	1.0
+chr2	782305	0.0	1.0	1.0
+chr2	782344	0.0	2.0	2.0
+chr2	782594	0.0	1.0	1.0
+chr2	782604	1.0	0.0	1.0
+chr2	782605	2.0	0.0	2.0
+chr2	782609	0.0	1.0	1.0
+chr2	782610	1.0	0.0	1.0
+chr2	782613	1.0	0.0	1.0
+chr2	782614	3.0	0.0	3.0
+chr2	782616	0.0	2.0	2.0
+chr2	782618	0.0	2.0	2.0
+chr2	782619	2.0	0.0	2.0
+chr2	782620	0.0	2.0	2.0
+chr2	782624	1.0	0.0	1.0
+chr2	782627	6.0	0.0	6.0
+chr2	782628	3.0	0.0	3.0
+chr2	782629	0.0	9.0	9.0
+chr2	782632	0.0	1.0	1.0
+chr2	782635	1.0	0.0	1.0
+chr2	782636	1.0	0.0	1.0
+chr2	782637	0.0	1.0	1.0
+chr2	782638	0.0	1.0	1.0
+chr2	782639	0.0	1.0	1.0
+chr2	782640	1.0	0.0	1.0
+chr2	782644	0.0	1.0	1.0
+chr2	782645	1.0	2.0	3.0
+chr2	782753	0.0	1.0	1.0
+chr2	782779	1.0	0.0	1.0
+chr2	782780	0.0	1.0	1.0
+chr2	782794	1.0	0.0	1.0
+chr2	782795	1.0	0.0	1.0
+chr2	782931	1.0	0.0	1.0
+chr2	782945	1.0	0.0	1.0
+chr2	783215	1.0	0.0	1.0
+chr2	783724	1.0	0.0	1.0
+chr2	783760	1.0	0.0	1.0
+chr2	783772	0.0	1.0	1.0
+chr2	783880	1.0	0.0	1.0
+chr2	783883	1.0	0.0	1.0
+chr2	783897	0.0	1.0	1.0
+chr2	784053	1.0	0.0	1.0
+chr2	784062	1.0	0.0	1.0
+chr2	784069	0.0	1.0	1.0
+chr2	784074	1.0	0.0	1.0
+chr2	784148	1.0	0.0	1.0
+chr2	784169	0.0	1.0	1.0
+chr2	784171	1.0	0.0	1.0
+chr2	784189	0.0	1.0	1.0
+chr2	784196	1.0	0.0	1.0
+chr2	784215	0.0	1.0	1.0
+chr2	784387	1.0	0.0	1.0
+chr2	784408	0.0	1.0	1.0
+chr2	784414	1.0	0.0	1.0
+chr2	784434	0.0	3.0	3.0
+chr2	784442	0.0	1.0	1.0
+chr2	784456	1.0	0.0	1.0
+chr2	784472	1.0	0.0	1.0
+chr2	784478	1.0	0.0	1.0
+chr2	784481	1.0	0.0	1.0
+chr2	784484	0.0	3.0	3.0
+chr2	784558	3.0	0.0	3.0
+chr2	784561	0.0	1.0	1.0
+chr2	784562	0.0	1.0	1.0
+chr2	784579	0.0	1.0	1.0
+chr2	784580	2.0	0.0	2.0
+chr2	784592	0.0	1.0	1.0
+chr2	784608	0.0	3.0	3.0
+chr2	784838	1.0	0.0	1.0
+chr2	784841	1.0	0.0	1.0
+chr2	784857	0.0	1.0	1.0
+chr2	784869	0.0	1.0	1.0
+chr2	784875	1.0	0.0	1.0
+chr2	784902	2.0	0.0	2.0
+chr2	784951	1.0	0.0	1.0
+chr2	785055	0.0	1.0	1.0
+chr2	785071	1.0	1.0	2.0
+chr2	785073	1.0	0.0	1.0
+chr2	785074	1.0	0.0	1.0
+chr2	785075	0.0	2.0	2.0
+chr2	785085	0.0	1.0	1.0
+chr2	785086	1.0	0.0	1.0
+chr2	785088	0.0	1.0	1.0
+chr2	785095	1.0	0.0	1.0
+chr2	785097	0.0	2.0	2.0
+chr2	785098	0.0	1.0	1.0
+chr2	785222	1.0	0.0	1.0
+chr2	785229	0.0	1.0	1.0
+chr2	785236	1.0	0.0	1.0
+chr2	785251	0.0	1.0	1.0
+chr2	785266	0.0	1.0	1.0
+chr2	785269	1.0	0.0	1.0
+chr2	785417	1.0	0.0	1.0
+chr2	785422	0.0	1.0	1.0
+chr2	785432	1.0	0.0	1.0
+chr2	785445	0.0	1.0	1.0
+chr2	785462	1.0	0.0	1.0
+chr2	785465	0.0	1.0	1.0
+chr2	785468	1.0	2.0	3.0
+chr2	785587	1.0	0.0	1.0
+chr2	785617	0.0	1.0	1.0
+chr2	785626	0.0	1.0	1.0
+chr2	785781	1.0	0.0	1.0
+chr2	785784	0.0	1.0	1.0
+chr2	785799	0.0	1.0	1.0
+chr2	785822	0.0	1.0	1.0
+chr2	785827	2.0	0.0	2.0
+chr2	785920	0.0	1.0	1.0
+chr2	785956	1.0	0.0	1.0
+chr2	785987	1.0	0.0	1.0
+chr2	785997	0.0	2.0	2.0
+chr2	786010	0.0	2.0	2.0
+chr2	786014	0.0	1.0	1.0
+chr2	786020	0.0	1.0	1.0
+chr2	786033	1.0	0.0	1.0
+chr2	786087	1.0	0.0	1.0
+chr2	786102	0.0	1.0	1.0
+chr2	786111	0.0	1.0	1.0
+chr2	786125	1.0	0.0	1.0
+chr2	786164	0.0	1.0	1.0
+chr2	786314	1.0	0.0	1.0
+chr2	786349	0.0	1.0	1.0
+chr2	786352	1.0	0.0	1.0
+chr2	786374	0.0	1.0	1.0
+chr2	786439	0.0	1.0	1.0
+chr2	786454	0.0	1.0	1.0
+chr2	786457	0.0	1.0	1.0
+chr2	786468	2.0	0.0	2.0
+chr2	786477	0.0	3.0	3.0
+chr2	786479	2.0	0.0	2.0
+chr2	786610	0.0	1.0	1.0
+chr2	786654	0.0	1.0	1.0
+chr2	786674	0.0	1.0	1.0
+chr2	786791	2.0	0.0	2.0
+chr2	786794	0.0	2.0	2.0
+chr2	786797	1.0	0.0	1.0
+chr2	786798	0.0	1.0	1.0
+chr2	786799	1.0	0.0	1.0
+chr2	786802	2.0	0.0	2.0
+chr2	786807	0.0	2.0	2.0
+chr2	786811	3.0	0.0	3.0
+chr2	786813	0.0	1.0	1.0
+chr2	786815	1.0	0.0	1.0
+chr2	786819	0.0	3.0	3.0
+chr2	786820	0.0	2.0	2.0
+chr2	786826	0.0	1.0	1.0
+chr2	786828	0.0	1.0	1.0
+chr2	786829	0.0	1.0	1.0
+chr2	786830	0.0	1.0	1.0
+chr2	786835	3.0	0.0	3.0
+chr2	786836	2.0	0.0	2.0
+chr2	786842	1.0	0.0	1.0
+chr2	787032	1.0	0.0	1.0
+chr2	787034	1.0	0.0	1.0
+chr2	787062	1.0	0.0	1.0
+chr2	787063	0.0	1.0	1.0
+chr2	787072	0.0	1.0	1.0
+chr2	787082	1.0	0.0	1.0
+chr2	787083	2.0	0.0	2.0
+chr2	787084	0.0	1.0	1.0
+chr2	787090	0.0	1.0	1.0
+chr2	787093	1.0	1.0	2.0
+chr2	787098	1.0	0.0	1.0
+chr2	787100	0.0	3.0	3.0
+chr2	787109	1.0	0.0	1.0
+chr2	787116	0.0	1.0	1.0
+chr2	787117	1.0	2.0	3.0
+chr2	787119	2.0	0.0	2.0
+chr2	787121	2.0	0.0	2.0
+chr2	787122	1.0	1.0	2.0
+chr2	787126	1.0	2.0	3.0
+chr2	787127	0.0	6.0	6.0
+chr2	787129	1.0	0.0	1.0
+chr2	787141	0.0	2.0	2.0
+chr2	787154	1.0	0.0	1.0
+chr2	787234	1.0	0.0	1.0
+chr2	787239	1.0	0.0	1.0
+chr2	787241	0.0	1.0	1.0
+chr2	787263	1.0	0.0	1.0
+chr2	787264	1.0	0.0	1.0
+chr2	787274	1.0	0.0	1.0
+chr2	787283	0.0	1.0	1.0
+chr2	787397	0.0	1.0	1.0
+chr2	787440	0.0	1.0	1.0
+chr2	787449	0.0	1.0	1.0
+chr2	787564	0.0	1.0	1.0
+chr2	787589	0.0	1.0	1.0
+chr2	787627	0.0	1.0	1.0
+chr2	787737	1.0	0.0	1.0
+chr2	787862	1.0	0.0	1.0
+chr2	787907	1.0	0.0	1.0
+chr2	788084	1.0	0.0	1.0
+chr2	788529	0.0	1.0	1.0
+chr2	788534	0.0	1.0	1.0
+chr2	788632	0.0	1.0	1.0
+chr2	788668	1.0	0.0	1.0
+chr2	788681	0.0	2.0	2.0
+chr2	788682	0.0	1.0	1.0
+chr2	788691	1.0	0.0	1.0
+chr2	788698	1.0	0.0	1.0
+chr2	788703	0.0	1.0	1.0
+chr2	788719	0.0	1.0	1.0
+chr2	788908	0.0	1.0	1.0
+chr2	788910	0.0	1.0	1.0
+chr2	788925	1.0	0.0	1.0
+chr2	788928	1.0	0.0	1.0
+chr2	788946	1.0	0.0	1.0
+chr2	788947	0.0	1.0	1.0
+chr2	788950	1.0	1.0	2.0
+chr2	788954	1.0	0.0	1.0
+chr2	788955	0.0	1.0	1.0
+chr2	789132	1.0	0.0	1.0
+chr2	789289	1.0	0.0	1.0
+chr2	789313	1.0	0.0	1.0
+chr2	789459	0.0	1.0	1.0
+chr2	789828	1.0	0.0	1.0
+chr2	789844	0.0	1.0	1.0
+chr2	789863	1.0	0.0	1.0
+chr2	789868	1.0	0.0	1.0
+chr2	790050	0.0	1.0	1.0
+chr2	790105	0.0	1.0	1.0
+chr2	790107	0.0	1.0	1.0
+chr2	790238	1.0	0.0	1.0
+chr2	790268	2.0	0.0	2.0
+chr2	790800	0.0	1.0	1.0
+chr2	790867	0.0	1.0	1.0
+chr2	790931	1.0	0.0	1.0
+chr2	791019	1.0	0.0	1.0
+chr2	791079	0.0	1.0	1.0
+chr2	791096	1.0	0.0	1.0
+chr2	791177	0.0	1.0	1.0
+chr2	791237	1.0	0.0	1.0
+chr2	791299	2.0	0.0	2.0
+chr2	791317	0.0	1.0	1.0
+chr2	791388	1.0	0.0	1.0
+chr2	791505	1.0	0.0	1.0
+chr2	791516	1.0	0.0	1.0
+chr2	791546	1.0	0.0	1.0
+chr2	791661	0.0	1.0	1.0
+chr2	791703	1.0	0.0	1.0
+chr2	791732	0.0	4.0	4.0
+chr2	791750	0.0	1.0	1.0
+chr2	792029	1.0	1.0	2.0
+chr2	792030	0.0	1.0	1.0
+chr2	792031	0.0	1.0	1.0
+chr2	792045	0.0	1.0	1.0
+chr2	792054	0.0	1.0	1.0
+chr2	792063	0.0	1.0	1.0
+chr2	792133	0.0	1.0	1.0
+chr2	792385	1.0	0.0	1.0
+chr2	792423	0.0	4.0	4.0
+chr2	792494	0.0	1.0	1.0
+chr2	792543	0.0	1.0	1.0
+chr2	792554	0.0	1.0	1.0
+chr2	792560	1.0	0.0	1.0
+chr2	792561	0.0	1.0	1.0
+chr2	792563	1.0	0.0	1.0
+chr2	792564	1.0	0.0	1.0
+chr2	792572	1.0	0.0	1.0
+chr2	792574	0.0	1.0	1.0
+chr2	792769	0.0	1.0	1.0
+chr2	792789	0.0	1.0	1.0
+chr2	792816	1.0	0.0	1.0
+chr2	792822	0.0	1.0	1.0
+chr2	792828	0.0	2.0	2.0
+chr2	792829	2.0	1.0	3.0
+chr2	792839	0.0	4.0	4.0
+chr2	792842	0.0	1.0	1.0
+chr2	792843	0.0	7.0	7.0
+chr2	792845	1.0	0.0	1.0
+chr2	792846	2.0	1.0	3.0
+chr2	792847	0.0	1.0	1.0
+chr2	792849	0.0	1.0	1.0
+chr2	792851	6.0	0.0	6.0
+chr2	792853	0.0	1.0	1.0
+chr2	792862	3.0	0.0	3.0
+chr2	792863	1.0	0.0	1.0
+chr2	792986	0.0	1.0	1.0
+chr2	792994	0.0	1.0	1.0
+chr2	792996	2.0	1.0	3.0
+chr2	792999	2.0	0.0	2.0
+chr2	793087	1.0	0.0	1.0
+chr2	793127	0.0	1.0	1.0
+chr2	793321	0.0	1.0	1.0
+chr2	793469	0.0	1.0	1.0
+chr2	793485	0.0	1.0	1.0
+chr2	793670	0.0	1.0	1.0
+chr2	793810	1.0	0.0	1.0
+chr2	793857	1.0	0.0	1.0
+chr2	793873	0.0	1.0	1.0
+chr2	793895	2.0	0.0	2.0
+chr2	793922	0.0	2.0	2.0
+chr2	794062	1.0	0.0	1.0
+chr2	794115	1.0	0.0	1.0
+chr2	794692	0.0	1.0	1.0
+chr2	794827	0.0	1.0	1.0
+chr2	794829	0.0	1.0	1.0
+chr2	795156	1.0	0.0	1.0
+chr2	795167	1.0	0.0	1.0
+chr2	795466	0.0	1.0	1.0
+chr2	795648	1.0	0.0	1.0
+chr2	795810	1.0	0.0	1.0
+chr2	795841	1.0	0.0	1.0
+chr2	795971	0.0	1.0	1.0
+chr2	796021	0.0	1.0	1.0
+chr2	796235	0.0	1.0	1.0
+chr2	796261	1.0	0.0	1.0
+chr2	796415	0.0	1.0	1.0
+chr2	796436	0.0	1.0	1.0
+chr2	796478	1.0	0.0	1.0
+chr2	796489	0.0	1.0	1.0
+chr2	796781	1.0	0.0	1.0
+chr2	796797	1.0	0.0	1.0
+chr2	796808	0.0	1.0	1.0
+chr2	796815	1.0	0.0	1.0
+chr2	796830	1.0	0.0	1.0
+chr2	796840	0.0	1.0	1.0
+chr2	796862	3.0	0.0	3.0
+chr2	796870	0.0	1.0	1.0
+chr2	796924	1.0	0.0	1.0
+chr2	796926	0.0	1.0	1.0
+chr2	796959	1.0	0.0	1.0
+chr2	796988	0.0	1.0	1.0
+chr2	796989	0.0	1.0	1.0
+chr2	796998	1.0	0.0	1.0
+chr2	797002	0.0	1.0	1.0
+chr2	797037	1.0	0.0	1.0
+chr2	797080	0.0	1.0	1.0
+chr2	797162	1.0	0.0	1.0
+chr2	797192	1.0	0.0	1.0
+chr2	797217	0.0	2.0	2.0
+chr2	797301	1.0	1.0	2.0
+chr2	797330	1.0	0.0	1.0
+chr2	797401	1.0	0.0	1.0
+chr2	797496	0.0	1.0	1.0
+chr2	797562	0.0	1.0	1.0
+chr2	797605	1.0	0.0	1.0
+chr2	797697	1.0	0.0	1.0
+chr2	797705	1.0	0.0	1.0
+chr2	797760	0.0	2.0	2.0
+chr2	797812	1.0	0.0	1.0
+chr2	797825	1.0	0.0	1.0
+chr2	797900	3.0	0.0	3.0
+chr2	797906	0.0	1.0	1.0
+chr2	797918	0.0	1.0	1.0
+chr2	797922	2.0	0.0	2.0
+chr2	798137	0.0	2.0	2.0
+chr2	798156	0.0	2.0	2.0
+chr2	798172	0.0	2.0	2.0
+chr2	798178	1.0	0.0	1.0
+chr2	798181	0.0	1.0	1.0
+chr2	798182	1.0	0.0	1.0
+chr2	798286	1.0	0.0	1.0
+chr2	798323	1.0	1.0	2.0
+chr2	798332	0.0	1.0	1.0
+chr2	798354	1.0	0.0	1.0
+chr2	798370	1.0	0.0	1.0
+chr2	798373	1.0	0.0	1.0
+chr2	798408	0.0	1.0	1.0
+chr2	798500	0.0	2.0	2.0
+chr2	798552	0.0	1.0	1.0
+chr2	798711	0.0	1.0	1.0
+chr2	798719	0.0	1.0	1.0
+chr2	798849	0.0	1.0	1.0
+chr2	798855	2.0	0.0	2.0
+chr2	798870	0.0	1.0	1.0
+chr2	798889	0.0	1.0	1.0
+chr2	798893	1.0	0.0	1.0
+chr2	799177	0.0	1.0	1.0
+chr2	799188	0.0	1.0	1.0
+chr2	799196	0.0	1.0	1.0
+chr2	799199	0.0	1.0	1.0
+chr2	799201	0.0	1.0	1.0
+chr2	799218	1.0	0.0	1.0
+chr2	799225	1.0	0.0	1.0
+chr2	799233	0.0	1.0	1.0
+chr2	799240	0.0	1.0	1.0
+chr2	799243	0.0	1.0	1.0
+chr2	799256	0.0	1.0	1.0
+chr2	799266	1.0	0.0	1.0
+chr2	799390	1.0	0.0	1.0
+chr2	799397	0.0	1.0	1.0
+chr2	799405	0.0	1.0	1.0
+chr2	799407	0.0	2.0	2.0
+chr2	799444	1.0	0.0	1.0
+chr2	799546	2.0	0.0	2.0
+chr2	799592	2.0	0.0	2.0
+chr2	799698	1.0	0.0	1.0
+chr2	799723	0.0	1.0	1.0
+chr2	799724	1.0	0.0	1.0
+chr2	799730	0.0	1.0	1.0
+chr2	799734	1.0	0.0	1.0
+chr2	799867	1.0	0.0	1.0
+chr2	799875	0.0	1.0	1.0
+chr2	799888	1.0	0.0	1.0
+chr2	799894	1.0	0.0	1.0
+chr2	799987	1.0	0.0	1.0
+chr2	800041	1.0	0.0	1.0
+chr2	800044	0.0	1.0	1.0
+chr2	800056	1.0	0.0	1.0
+chr2	800065	0.0	1.0	1.0
+chr2	800071	1.0	0.0	1.0
+chr2	800174	0.0	1.0	1.0
+chr2	800195	0.0	1.0	1.0
+chr2	800197	0.0	2.0	2.0
+chr2	800200	0.0	1.0	1.0
+chr2	800209	0.0	1.0	1.0
+chr2	800216	0.0	1.0	1.0
+chr2	800218	1.0	0.0	1.0
+chr2	800219	1.0	0.0	1.0
+chr2	800220	3.0	0.0	3.0
+chr2	800221	0.0	3.0	3.0
+chr2	800222	2.0	0.0	2.0
+chr2	800226	4.0	0.0	4.0
+chr2	800230	0.0	2.0	2.0
+chr2	800233	1.0	0.0	1.0
+chr2	800234	0.0	2.0	2.0
+chr2	800240	1.0	0.0	1.0
+chr2	800244	0.0	1.0	1.0
+chr2	800249	0.0	1.0	1.0
+chr2	800263	2.0	0.0	2.0
+chr2	800277	0.0	1.0	1.0
+chr2	800371	1.0	0.0	1.0
+chr2	800440	0.0	1.0	1.0
+chr2	800448	2.0	0.0	2.0
+chr2	800456	1.0	0.0	1.0
+chr2	800463	1.0	0.0	1.0
+chr2	800471	1.0	1.0	2.0
+chr2	800478	1.0	0.0	1.0
+chr2	800480	3.0	0.0	3.0
+chr2	800485	0.0	1.0	1.0
+chr2	800487	1.0	0.0	1.0
+chr2	800490	0.0	1.0	1.0
+chr2	800491	0.0	2.0	2.0
+chr2	800499	0.0	1.0	1.0
+chr2	800504	0.0	1.0	1.0
+chr2	800505	0.0	1.0	1.0
+chr2	800509	0.0	1.0	1.0
+chr2	800510	3.0	0.0	3.0
+chr2	800542	1.0	0.0	1.0
+chr2	800546	0.0	1.0	1.0
+chr2	800577	1.0	0.0	1.0
+chr2	800600	0.0	1.0	1.0
+chr2	800606	0.0	1.0	1.0
+chr2	800680	0.0	1.0	1.0
+chr2	800791	0.0	2.0	2.0
+chr2	800820	1.0	2.0	3.0
+chr2	800835	0.0	1.0	1.0
+chr2	800848	0.0	2.0	2.0
+chr2	800878	1.0	0.0	1.0
+chr2	800955	1.0	0.0	1.0
+chr2	800972	0.0	1.0	1.0
+chr2	800995	0.0	1.0	1.0
+chr2	800997	0.0	1.0	1.0
+chr2	800998	0.0	1.0	1.0
+chr2	801003	2.0	0.0	2.0
+chr2	801009	0.0	1.0	1.0
+chr2	801014	0.0	2.0	2.0
+chr2	801154	0.0	1.0	1.0
+chr2	801158	0.0	1.0	1.0
+chr2	801195	1.0	0.0	1.0
+chr2	801245	1.0	0.0	1.0
+chr2	801249	0.0	1.0	1.0
+chr2	801250	0.0	1.0	1.0
+chr2	801285	1.0	0.0	1.0
+chr2	801289	0.0	1.0	1.0
+chr2	801301	0.0	1.0	1.0
+chr2	801322	1.0	0.0	1.0
+chr2	801327	1.0	0.0	1.0
+chr2	801331	0.0	1.0	1.0
+chr2	801334	0.0	1.0	1.0
+chr2	801423	1.0	0.0	1.0
+chr2	801443	0.0	1.0	1.0
+chr2	801455	1.0	0.0	1.0
+chr2	801479	0.0	1.0	1.0
+chr2	801486	1.0	0.0	1.0
+chr2	801493	1.0	0.0	1.0
+chr2	801495	1.0	0.0	1.0
+chr2	801506	0.0	1.0	1.0
+chr2	801518	0.0	1.0	1.0
+chr2	801611	0.0	1.0	1.0
+chr2	801662	0.0	1.0	1.0
+chr2	801722	0.0	1.0	1.0
+chr2	801748	0.0	1.0	1.0
+chr2	801804	1.0	0.0	1.0
+chr2	801811	1.0	0.0	1.0
+chr2	801828	0.0	1.0	1.0
+chr2	801836	2.0	0.0	2.0
+chr2	801840	0.0	1.0	1.0
+chr2	801841	0.0	1.0	1.0
+chr2	801850	1.0	0.0	1.0
+chr2	801927	1.0	0.0	1.0
+chr2	801945	1.0	0.0	1.0
+chr2	801989	0.0	2.0	2.0
+chr2	802021	0.0	1.0	1.0
+chr2	802085	0.0	1.0	1.0
+chr2	802162	0.0	1.0	1.0
+chr2	802163	0.0	1.0	1.0
+chr2	802170	2.0	0.0	2.0
+chr2	802198	0.0	1.0	1.0
+chr2	802557	1.0	0.0	1.0
+chr2	802569	0.0	1.0	1.0
+chr2	802607	1.0	0.0	1.0
+chr2	802610	1.0	0.0	1.0
+chr2	803244	0.0	3.0	3.0
+chr2	803253	0.0	3.0	3.0
+chr2	803412	0.0	1.0	1.0
+chr2	803445	1.0	0.0	1.0
+chr2	803479	1.0	0.0	1.0
+chr2	803543	0.0	1.0	1.0
+chr2	803684	0.0	1.0	1.0
+chr2	803814	0.0	1.0	1.0
+chr2	803817	1.0	0.0	1.0
+chr2	803834	1.0	0.0	1.0
+chr2	803844	0.0	1.0	1.0
+chr2	803849	0.0	1.0	1.0
+chr2	803996	1.0	0.0	1.0
+chr2	803998	0.0	1.0	1.0
+chr2	804129	0.0	1.0	1.0
+chr2	804160	1.0	0.0	1.0
+chr2	804177	0.0	2.0	2.0
+chr2	804199	0.0	1.0	1.0
+chr2	804202	0.0	1.0	1.0
+chr2	804216	1.0	0.0	1.0
+chr2	804232	3.0	0.0	3.0
+chr2	804325	1.0	0.0	1.0
+chr2	804331	1.0	0.0	1.0
+chr2	804354	0.0	1.0	1.0
+chr2	804375	1.0	0.0	1.0
+chr2	804680	1.0	0.0	1.0
+chr2	804695	0.0	1.0	1.0
+chr2	804698	1.0	0.0	1.0
+chr2	804728	2.0	0.0	2.0
+chr2	804820	0.0	1.0	1.0
+chr2	804821	0.0	1.0	1.0
+chr2	804830	2.0	0.0	2.0
+chr2	804833	3.0	0.0	3.0
+chr2	804839	0.0	1.0	1.0
+chr2	804843	0.0	1.0	1.0
+chr2	804845	1.0	0.0	1.0
+chr2	804848	1.0	0.0	1.0
+chr2	804849	2.0	0.0	2.0
+chr2	804852	1.0	0.0	1.0
+chr2	804858	1.0	0.0	1.0
+chr2	804859	3.0	0.0	3.0
+chr2	804864	0.0	3.0	3.0
+chr2	804866	0.0	1.0	1.0
+chr2	804868	1.0	0.0	1.0
+chr2	804874	1.0	0.0	1.0
+chr2	804876	0.0	2.0	2.0
+chr2	804877	1.0	1.0	2.0
+chr2	804894	1.0	0.0	1.0
+chr2	804895	1.0	0.0	1.0
+chr2	804910	0.0	1.0	1.0
+chr2	804934	0.0	1.0	1.0
+chr2	805089	0.0	1.0	1.0
+chr2	805104	1.0	0.0	1.0
+chr2	805116	2.0	0.0	2.0
+chr2	805127	0.0	1.0	1.0
+chr2	805131	1.0	1.0	2.0
+chr2	805134	1.0	5.0	6.0
+chr2	805137	0.0	1.0	1.0
+chr2	805138	0.0	2.0	2.0
+chr2	805140	1.0	0.0	1.0
+chr2	805141	2.0	0.0	2.0
+chr2	805149	1.0	0.0	1.0
+chr2	805151	2.0	0.0	2.0
+chr2	805157	5.0	0.0	5.0
+chr2	805158	2.0	0.0	2.0
+chr2	805159	0.0	3.0	3.0
+chr2	805160	0.0	2.0	2.0
+chr2	805163	1.0	12.0	13.0
+chr2	805164	3.0	4.0	7.0
+chr2	805165	0.0	2.0	2.0
+chr2	805167	1.0	0.0	1.0
+chr2	805168	4.0	0.0	4.0
+chr2	805169	2.0	3.0	5.0
+chr2	805171	1.0	0.0	1.0
+chr2	805172	1.0	2.0	3.0
+chr2	805174	3.0	0.0	3.0
+chr2	805176	1.0	14.0	15.0
+chr2	805177	1.0	2.0	3.0
+chr2	805178	1.0	0.0	1.0
+chr2	805179	0.0	1.0	1.0
+chr2	805180	1.0	0.0	1.0
+chr2	805181	2.0	0.0	2.0
+chr2	805183	3.0	0.0	3.0
+chr2	805186	1.0	0.0	1.0
+chr2	805187	0.0	1.0	1.0
+chr2	805190	1.0	0.0	1.0
+chr2	805203	0.0	1.0	1.0
+chr2	805205	0.0	1.0	1.0
+chr2	805216	1.0	0.0	1.0
+chr2	805233	1.0	0.0	1.0
+chr2	805319	3.0	0.0	3.0
+chr2	805323	0.0	2.0	2.0
+chr2	805325	0.0	1.0	1.0
+chr2	805327	1.0	0.0	1.0
+chr2	805328	1.0	0.0	1.0
+chr2	805331	0.0	1.0	1.0
+chr2	805343	0.0	1.0	1.0
+chr2	805346	1.0	1.0	2.0
+chr2	805348	1.0	0.0	1.0
+chr2	805349	0.0	1.0	1.0
+chr2	805350	0.0	1.0	1.0
+chr2	805381	0.0	1.0	1.0
+chr2	805382	0.0	2.0	2.0
+chr2	805411	0.0	1.0	1.0
+chr2	805462	1.0	0.0	1.0
+chr2	805471	1.0	0.0	1.0
+chr2	805482	0.0	1.0	1.0
+chr2	805484	1.0	0.0	1.0
+chr2	805485	2.0	0.0	2.0
+chr2	805486	0.0	1.0	1.0
+chr2	805489	1.0	0.0	1.0
+chr2	805493	1.0	0.0	1.0
+chr2	805499	2.0	0.0	2.0
+chr2	805515	1.0	0.0	1.0
+chr2	805516	1.0	0.0	1.0
+chr2	805518	0.0	1.0	1.0
+chr2	805594	0.0	1.0	1.0
+chr2	805643	1.0	0.0	1.0
+chr2	805644	0.0	1.0	1.0
+chr2	805650	1.0	0.0	1.0
+chr2	805657	0.0	2.0	2.0
+chr2	805664	0.0	1.0	1.0
+chr2	805687	1.0	0.0	1.0
+chr2	805689	1.0	0.0	1.0
+chr2	805701	1.0	0.0	1.0
+chr2	805709	1.0	0.0	1.0
+chr2	805715	0.0	2.0	2.0
+chr2	805719	1.0	0.0	1.0
+chr2	805724	0.0	3.0	3.0
+chr2	805727	5.0	0.0	5.0
+chr2	805728	1.0	0.0	1.0
+chr2	805735	0.0	1.0	1.0
+chr2	805743	1.0	0.0	1.0
+chr2	805746	1.0	0.0	1.0
+chr2	805753	0.0	1.0	1.0
+chr2	805760	4.0	0.0	4.0
+chr2	805767	1.0	0.0	1.0
+chr2	805773	0.0	2.0	2.0
+chr2	805776	1.0	0.0	1.0
+chr2	805786	1.0	0.0	1.0
+chr2	805801	1.0	0.0	1.0
+chr2	805805	2.0	0.0	2.0
+chr2	805808	1.0	0.0	1.0
+chr2	805814	2.0	0.0	2.0
+chr2	805823	1.0	0.0	1.0
+chr2	805824	0.0	1.0	1.0
+chr2	805842	1.0	0.0	1.0
+chr2	805846	1.0	0.0	1.0
+chr2	805851	1.0	0.0	1.0
+chr2	805853	0.0	1.0	1.0
+chr2	805868	0.0	1.0	1.0
+chr2	805891	1.0	0.0	1.0
+chr2	805894	0.0	1.0	1.0
+chr2	805958	0.0	2.0	2.0
+chr2	805960	0.0	1.0	1.0
+chr2	805973	1.0	0.0	1.0
+chr2	805981	1.0	0.0	1.0
+chr2	805987	0.0	1.0	1.0
+chr2	805994	1.0	0.0	1.0
+chr2	806003	0.0	2.0	2.0
+chr2	806008	0.0	1.0	1.0
+chr2	806043	0.0	1.0	1.0
+chr2	806125	0.0	1.0	1.0
+chr2	806154	1.0	0.0	1.0
+chr2	806175	1.0	0.0	1.0
+chr2	806180	0.0	2.0	2.0
+chr2	806198	0.0	1.0	1.0
+chr2	806259	0.0	1.0	1.0
+chr2	806284	1.0	0.0	1.0
+chr2	806294	0.0	1.0	1.0
+chr2	806310	1.0	0.0	1.0
+chr2	806315	1.0	0.0	1.0
+chr2	806316	1.0	0.0	1.0
+chr2	806357	1.0	0.0	1.0
+chr2	806361	1.0	0.0	1.0
+chr2	806362	2.0	0.0	2.0
+chr2	806380	1.0	0.0	1.0
+chr2	806480	1.0	0.0	1.0
+chr2	806482	0.0	1.0	1.0
+chr2	806488	0.0	1.0	1.0
+chr2	806496	0.0	1.0	1.0
+chr2	806519	1.0	0.0	1.0
+chr2	806525	1.0	0.0	1.0
+chr2	806528	0.0	2.0	2.0
+chr2	806538	1.0	0.0	1.0
+chr2	806652	1.0	0.0	1.0
+chr2	806672	3.0	0.0	3.0
+chr2	806685	0.0	1.0	1.0
+chr2	806739	0.0	1.0	1.0
+chr2	806761	0.0	1.0	1.0
+chr2	806790	0.0	1.0	1.0
+chr2	806792	0.0	1.0	1.0
+chr2	806793	0.0	1.0	1.0
+chr2	806810	1.0	0.0	1.0
+chr2	806818	0.0	1.0	1.0
+chr2	806833	1.0	0.0	1.0
+chr2	806838	4.0	0.0	4.0
+chr2	806934	0.0	1.0	1.0
+chr2	806936	0.0	1.0	1.0
+chr2	806938	0.0	2.0	2.0
+chr2	806939	1.0	0.0	1.0
+chr2	806940	1.0	0.0	1.0
+chr2	806941	1.0	0.0	1.0
+chr2	806942	0.0	1.0	1.0
+chr2	806945	1.0	1.0	2.0
+chr2	806962	1.0	0.0	1.0
+chr2	806968	1.0	0.0	1.0
+chr2	806969	0.0	1.0	1.0
+chr2	806974	1.0	0.0	1.0
+chr2	806975	0.0	1.0	1.0
+chr2	806986	0.0	1.0	1.0
+chr2	806988	0.0	1.0	1.0
+chr2	807001	0.0	1.0	1.0
+chr2	807004	1.0	0.0	1.0
+chr2	807005	0.0	1.0	1.0
+chr2	807009	1.0	0.0	1.0
+chr2	807022	1.0	0.0	1.0
+chr2	807033	0.0	1.0	1.0
+chr2	807046	0.0	1.0	1.0
+chr2	807078	0.0	1.0	1.0
+chr2	807088	0.0	1.0	1.0
+chr2	807093	1.0	2.0	3.0
+chr2	807096	1.0	0.0	1.0
+chr2	807097	0.0	1.0	1.0
+chr2	807102	0.0	1.0	1.0
+chr2	807104	1.0	0.0	1.0
+chr2	807106	6.0	0.0	6.0
+chr2	807107	0.0	1.0	1.0
+chr2	807108	1.0	1.0	2.0
+chr2	807109	0.0	1.0	1.0
+chr2	807113	3.0	0.0	3.0
+chr2	807115	4.0	0.0	4.0
+chr2	807117	1.0	1.0	2.0
+chr2	807121	0.0	1.0	1.0
+chr2	807122	2.0	0.0	2.0
+chr2	807125	0.0	1.0	1.0
+chr2	807135	1.0	0.0	1.0
+chr2	807156	1.0	0.0	1.0
+chr2	807258	1.0	0.0	1.0
+chr2	807276	0.0	1.0	1.0
+chr2	807299	0.0	2.0	2.0
+chr2	807354	0.0	1.0	1.0
+chr2	807366	0.0	1.0	1.0
+chr2	807371	0.0	1.0	1.0
+chr2	807382	0.0	1.0	1.0
+chr2	807385	0.0	1.0	1.0
+chr2	807388	1.0	0.0	1.0
+chr2	807392	1.0	0.0	1.0
+chr2	807393	2.0	0.0	2.0
+chr2	807394	1.0	3.0	4.0
+chr2	807395	1.0	0.0	1.0
+chr2	807397	1.0	0.0	1.0
+chr2	807399	0.0	2.0	2.0
+chr2	807401	6.0	0.0	6.0
+chr2	807402	0.0	1.0	1.0
+chr2	807407	5.0	1.0	6.0
+chr2	807408	2.0	1.0	3.0
+chr2	807412	0.0	1.0	1.0
+chr2	807413	0.0	1.0	1.0
+chr2	807414	0.0	1.0	1.0
+chr2	807415	0.0	1.0	1.0
+chr2	807434	0.0	1.0	1.0
+chr2	807534	0.0	1.0	1.0
+chr2	807554	2.0	0.0	2.0
+chr2	807556	0.0	1.0	1.0
+chr2	807561	1.0	0.0	1.0
+chr2	807562	1.0	0.0	1.0
+chr2	807563	0.0	1.0	1.0
+chr2	807579	0.0	1.0	1.0
+chr2	807580	0.0	1.0	1.0
+chr2	807593	1.0	0.0	1.0
+chr2	807594	0.0	1.0	1.0
+chr2	807650	1.0	0.0	1.0
+chr2	807706	0.0	1.0	1.0
+chr2	807728	1.0	0.0	1.0
+chr2	807738	0.0	1.0	1.0
+chr2	807891	1.0	0.0	1.0
+chr2	807896	1.0	0.0	1.0
+chr2	807950	0.0	1.0	1.0
+chr2	808057	1.0	0.0	1.0
+chr2	808222	1.0	0.0	1.0
+chr2	808242	0.0	1.0	1.0
+chr2	808251	0.0	2.0	2.0
+chr2	808255	1.0	0.0	1.0
+chr2	808263	1.0	0.0	1.0
+chr2	808387	0.0	2.0	2.0
+chr2	808388	0.0	1.0	1.0
+chr2	808425	2.0	0.0	2.0
+chr2	808428	0.0	1.0	1.0
+chr2	808429	1.0	0.0	1.0
+chr2	808430	1.0	0.0	1.0
+chr2	808436	0.0	1.0	1.0
+chr2	808438	2.0	0.0	2.0
+chr2	808439	1.0	0.0	1.0
+chr2	808444	1.0	0.0	1.0
+chr2	808445	1.0	0.0	1.0
+chr2	808454	1.0	0.0	1.0
+chr2	808455	0.0	2.0	2.0
+chr2	808456	0.0	1.0	1.0
+chr2	808461	0.0	1.0	1.0
+chr2	808464	1.0	0.0	1.0
+chr2	808465	2.0	0.0	2.0
+chr2	808474	1.0	0.0	1.0
+chr2	808479	0.0	1.0	1.0
+chr2	808481	1.0	0.0	1.0
+chr2	808486	0.0	1.0	1.0
+chr2	808541	1.0	0.0	1.0
+chr2	808566	1.0	0.0	1.0
+chr2	808610	0.0	1.0	1.0
+chr2	808630	1.0	0.0	1.0
+chr2	808642	0.0	1.0	1.0
+chr2	808674	0.0	1.0	1.0
+chr2	808686	1.0	0.0	1.0
+chr2	808689	0.0	4.0	4.0
+chr2	808693	0.0	1.0	1.0
+chr2	808695	1.0	0.0	1.0
+chr2	808707	1.0	0.0	1.0
+chr2	808711	2.0	0.0	2.0
+chr2	808714	1.0	0.0	1.0
+chr2	808718	0.0	2.0	2.0
+chr2	808757	0.0	1.0	1.0
+chr2	808765	0.0	1.0	1.0
+chr2	808778	1.0	0.0	1.0
+chr2	808792	1.0	0.0	1.0
+chr2	808793	0.0	1.0	1.0
+chr2	808794	0.0	1.0	1.0
+chr2	808849	2.0	0.0	2.0
+chr2	808868	2.0	1.0	3.0
+chr2	808872	0.0	1.0	1.0
+chr2	808878	1.0	0.0	1.0
+chr2	808881	0.0	2.0	2.0
+chr2	808885	1.0	0.0	1.0
+chr2	808891	1.0	0.0	1.0
+chr2	808892	0.0	2.0	2.0
+chr2	808896	1.0	0.0	1.0
+chr2	808918	0.0	1.0	1.0
+chr2	808931	0.0	6.0	6.0
+chr2	808942	1.0	0.0	1.0
+chr2	808944	2.0	0.0	2.0
+chr2	808949	3.0	0.0	3.0
+chr2	808962	1.0	0.0	1.0
+chr2	808967	1.0	0.0	1.0
+chr2	808977	0.0	1.0	1.0
+chr2	808997	1.0	0.0	1.0
+chr2	809028	2.0	1.0	3.0
+chr2	809030	1.0	0.0	1.0
+chr2	809053	1.0	0.0	1.0
+chr2	809060	1.0	0.0	1.0
+chr2	809062	0.0	1.0	1.0
+chr2	809063	0.0	1.0	1.0
+chr2	809069	0.0	2.0	2.0
+chr2	809074	0.0	1.0	1.0
+chr2	809078	0.0	1.0	1.0
+chr2	809097	1.0	0.0	1.0
+chr2	809100	0.0	1.0	1.0
+chr2	809107	0.0	1.0	1.0
+chr2	809119	1.0	0.0	1.0
+chr2	809124	0.0	3.0	3.0
+chr2	809125	3.0	0.0	3.0
+chr2	809132	1.0	0.0	1.0
+chr2	809135	3.0	0.0	3.0
+chr2	809138	1.0	1.0	2.0
+chr2	809144	1.0	0.0	1.0
+chr2	809145	0.0	1.0	1.0
+chr2	809148	1.0	0.0	1.0
+chr2	809151	0.0	2.0	2.0
+chr2	809154	0.0	1.0	1.0
+chr2	809157	0.0	2.0	2.0
+chr2	809158	1.0	0.0	1.0
+chr2	809162	0.0	1.0	1.0
+chr2	809166	0.0	1.0	1.0
+chr2	809171	0.0	4.0	4.0
+chr2	809172	0.0	3.0	3.0
+chr2	809174	0.0	2.0	2.0
+chr2	809180	0.0	1.0	1.0
+chr2	809186	0.0	3.0	3.0
+chr2	809187	0.0	1.0	1.0
+chr2	809188	0.0	1.0	1.0
+chr2	809191	0.0	1.0	1.0
+chr2	809194	0.0	2.0	2.0
+chr2	809195	0.0	1.0	1.0
+chr2	809202	1.0	0.0	1.0
+chr2	809209	0.0	1.0	1.0
+chr2	809219	0.0	1.0	1.0
+chr2	809221	2.0	0.0	2.0
+chr2	809232	2.0	0.0	2.0
+chr2	809247	2.0	1.0	3.0
+chr2	809252	1.0	0.0	1.0
+chr2	809253	1.0	0.0	1.0
+chr2	809255	1.0	0.0	1.0
+chr2	809261	0.0	1.0	1.0
+chr2	809280	3.0	0.0	3.0
+chr2	809281	1.0	0.0	1.0
+chr2	809293	0.0	1.0	1.0
+chr2	809294	1.0	1.0	2.0
+chr2	809297	0.0	2.0	2.0
+chr2	809300	1.0	0.0	1.0
+chr2	809303	1.0	0.0	1.0
+chr2	809304	1.0	1.0	2.0
+chr2	809305	1.0	0.0	1.0
+chr2	809308	1.0	0.0	1.0
+chr2	809311	0.0	1.0	1.0
+chr2	809312	1.0	1.0	2.0
+chr2	809315	1.0	0.0	1.0
+chr2	809319	0.0	3.0	3.0
+chr2	809320	1.0	0.0	1.0
+chr2	809321	1.0	0.0	1.0
+chr2	809322	8.0	0.0	8.0
+chr2	809323	1.0	1.0	2.0
+chr2	809324	1.0	0.0	1.0
+chr2	809325	2.0	0.0	2.0
+chr2	809326	1.0	1.0	2.0
+chr2	809327	2.0	0.0	2.0
+chr2	809328	0.0	2.0	2.0
+chr2	809330	0.0	2.0	2.0
+chr2	809331	4.0	2.0	6.0
+chr2	809334	1.0	4.0	5.0
+chr2	809335	3.0	0.0	3.0
+chr2	809338	1.0	0.0	1.0
+chr2	809340	4.0	0.0	4.0
+chr2	809341	5.0	3.0	8.0
+chr2	809344	0.0	6.0	6.0
+chr2	809349	1.0	0.0	1.0
+chr2	809350	1.0	0.0	1.0
+chr2	809352	1.0	1.0	2.0
+chr2	809353	0.0	1.0	1.0
+chr2	809358	0.0	1.0	1.0
+chr2	809359	2.0	0.0	2.0
+chr2	809362	3.0	0.0	3.0
+chr2	809369	0.0	2.0	2.0
+chr2	809371	1.0	0.0	1.0
+chr2	809372	1.0	0.0	1.0
+chr2	809373	0.0	1.0	1.0
+chr2	809377	0.0	1.0	1.0
+chr2	809378	2.0	0.0	2.0
+chr2	809379	0.0	2.0	2.0
+chr2	809384	1.0	0.0	1.0
+chr2	809538	1.0	0.0	1.0
+chr2	809577	0.0	1.0	1.0
+chr2	809594	0.0	1.0	1.0
+chr2	809630	2.0	0.0	2.0
+chr2	809634	1.0	2.0	3.0
+chr2	809635	1.0	2.0	3.0
+chr2	809639	0.0	1.0	1.0
+chr2	809641	1.0	1.0	2.0
+chr2	809643	0.0	1.0	1.0
+chr2	809644	1.0	0.0	1.0
+chr2	809648	0.0	1.0	1.0
+chr2	809650	1.0	0.0	1.0
+chr2	809654	3.0	0.0	3.0
+chr2	809659	0.0	4.0	4.0
+chr2	809660	1.0	0.0	1.0
+chr2	809662	1.0	0.0	1.0
+chr2	809663	3.0	0.0	3.0
+chr2	809664	2.0	0.0	2.0
+chr2	809666	0.0	6.0	6.0
+chr2	809667	1.0	1.0	2.0
+chr2	809668	0.0	2.0	2.0
+chr2	809672	3.0	0.0	3.0
+chr2	809677	2.0	0.0	2.0
+chr2	809678	5.0	1.0	6.0
+chr2	809680	0.0	1.0	1.0
+chr2	809684	1.0	0.0	1.0
+chr2	809686	5.0	0.0	5.0
+chr2	809688	0.0	3.0	3.0
+chr2	809689	0.0	5.0	5.0
+chr2	809695	2.0	0.0	2.0
+chr2	809697	1.0	0.0	1.0
+chr2	809712	0.0	1.0	1.0
+chr2	809960	2.0	0.0	2.0
+chr2	809963	1.0	0.0	1.0
+chr2	809974	0.0	1.0	1.0
+chr2	809978	1.0	0.0	1.0
+chr2	809979	0.0	3.0	3.0
+chr2	809983	4.0	0.0	4.0
+chr2	809985	0.0	1.0	1.0
+chr2	809987	1.0	0.0	1.0
+chr2	809992	2.0	0.0	2.0
+chr2	809993	1.0	2.0	3.0
+chr2	810006	0.0	2.0	2.0
+chr2	810015	1.0	0.0	1.0
+chr2	810016	0.0	5.0	5.0
+chr2	810019	2.0	1.0	3.0
+chr2	810023	0.0	3.0	3.0
+chr2	810027	5.0	0.0	5.0
+chr2	810028	1.0	0.0	1.0
+chr2	810032	0.0	3.0	3.0
+chr2	810036	0.0	1.0	1.0
+chr2	810037	1.0	0.0	1.0
+chr2	810045	0.0	1.0	1.0
+chr2	810059	1.0	0.0	1.0
+chr2	810106	0.0	1.0	1.0
+chr2	810114	0.0	1.0	1.0
+chr2	810141	1.0	0.0	1.0
+chr2	810152	2.0	0.0	2.0
+chr2	810153	1.0	2.0	3.0
+chr2	810155	0.0	1.0	1.0
+chr2	810156	0.0	1.0	1.0
+chr2	810170	1.0	0.0	1.0
+chr2	810171	0.0	1.0	1.0
+chr2	810179	1.0	0.0	1.0
+chr2	810209	1.0	0.0	1.0
+chr2	810221	1.0	0.0	1.0
+chr2	810229	0.0	2.0	2.0
+chr2	810288	0.0	1.0	1.0
+chr2	810298	0.0	2.0	2.0
+chr2	810319	1.0	0.0	1.0
+chr2	810324	0.0	1.0	1.0
+chr2	810328	1.0	0.0	1.0
+chr2	810348	1.0	0.0	1.0
+chr2	810415	0.0	1.0	1.0
+chr2	810416	0.0	1.0	1.0
+chr2	810435	1.0	0.0	1.0
+chr2	810443	0.0	1.0	1.0
+chr2	810447	0.0	1.0	1.0
+chr2	810462	1.0	0.0	1.0
+chr2	810476	1.0	0.0	1.0
+chr2	810498	1.0	0.0	1.0
+chr2	810507	0.0	1.0	1.0
+chr2	810511	0.0	2.0	2.0
+chr2	810512	0.0	1.0	1.0
+chr2	810517	1.0	0.0	1.0
+chr2	810523	1.0	0.0	1.0
+chr2	810526	0.0	1.0	1.0
+chr2	810529	1.0	1.0	2.0
+chr2	810540	1.0	0.0	1.0
+chr2	810544	1.0	0.0	1.0
+chr2	810548	0.0	4.0	4.0
+chr2	810550	1.0	0.0	1.0
+chr2	810571	1.0	0.0	1.0
+chr2	810600	1.0	0.0	1.0
+chr2	810644	0.0	1.0	1.0
+chr2	810647	0.0	3.0	3.0
+chr2	810662	0.0	1.0	1.0
+chr2	810671	0.0	1.0	1.0
+chr2	810709	0.0	1.0	1.0
+chr2	810795	0.0	1.0	1.0
+chr2	810801	1.0	0.0	1.0
+chr2	810873	0.0	1.0	1.0
+chr2	810896	0.0	1.0	1.0
+chr2	810906	1.0	0.0	1.0
+chr2	810908	2.0	0.0	2.0
+chr2	810946	1.0	0.0	1.0
+chr2	810947	0.0	1.0	1.0
+chr2	810952	1.0	0.0	1.0
+chr2	810960	0.0	1.0	1.0
+chr2	810963	1.0	0.0	1.0
+chr2	810965	0.0	1.0	1.0
+chr2	810973	0.0	2.0	2.0
+chr2	810988	1.0	0.0	1.0
+chr2	811062	1.0	0.0	1.0
+chr2	811064	0.0	1.0	1.0
+chr2	811066	0.0	1.0	1.0
+chr2	811070	0.0	2.0	2.0
+chr2	811099	0.0	2.0	2.0
+chr2	811103	0.0	1.0	1.0
+chr2	811107	1.0	0.0	1.0
+chr2	811114	0.0	1.0	1.0
+chr2	811120	1.0	0.0	1.0
+chr2	811124	1.0	0.0	1.0
+chr2	811130	0.0	1.0	1.0
+chr2	811166	1.0	0.0	1.0
+chr2	811181	0.0	1.0	1.0
+chr2	811224	1.0	0.0	1.0
+chr2	811235	0.0	3.0	3.0
+chr2	811237	3.0	0.0	3.0
+chr2	811239	2.0	0.0	2.0
+chr2	811241	1.0	0.0	1.0
+chr2	811243	0.0	5.0	5.0
+chr2	811244	0.0	1.0	1.0
+chr2	811245	4.0	0.0	4.0
+chr2	811246	1.0	0.0	1.0
+chr2	811247	0.0	1.0	1.0
+chr2	811249	0.0	1.0	1.0
+chr2	811251	8.0	0.0	8.0
+chr2	811252	3.0	0.0	3.0
+chr2	811253	0.0	1.0	1.0
+chr2	811254	0.0	2.0	2.0
+chr2	811255	2.0	1.0	3.0
+chr2	811256	2.0	0.0	2.0
+chr2	811257	1.0	0.0	1.0
+chr2	811260	0.0	1.0	1.0
+chr2	811261	0.0	1.0	1.0
+chr2	811262	2.0	0.0	2.0
+chr2	811264	1.0	0.0	1.0
+chr2	811269	1.0	1.0	2.0
+chr2	811270	0.0	4.0	4.0
+chr2	811278	0.0	1.0	1.0
+chr2	811279	0.0	1.0	1.0
+chr2	811280	1.0	0.0	1.0
+chr2	811284	1.0	0.0	1.0
+chr2	811286	1.0	0.0	1.0
+chr2	811301	0.0	1.0	1.0
+chr2	811332	2.0	0.0	2.0
+chr2	811372	0.0	1.0	1.0
+chr2	811373	0.0	1.0	1.0
+chr2	811378	0.0	1.0	1.0
+chr2	811384	0.0	1.0	1.0
+chr2	811385	0.0	1.0	1.0
+chr2	811386	3.0	0.0	3.0
+chr2	811390	3.0	0.0	3.0
+chr2	811393	1.0	1.0	2.0
+chr2	811395	1.0	5.0	6.0
+chr2	811396	3.0	2.0	5.0
+chr2	811402	3.0	0.0	3.0
+chr2	811403	1.0	0.0	1.0
+chr2	811405	1.0	0.0	1.0
+chr2	811406	2.0	0.0	2.0
+chr2	811407	4.0	2.0	6.0
+chr2	811408	6.0	2.0	8.0
+chr2	811412	0.0	2.0	2.0
+chr2	811414	8.0	3.0	11.0
+chr2	811415	0.0	1.0	1.0
+chr2	811419	0.0	6.0	6.0
+chr2	811421	2.0	1.0	3.0
+chr2	811422	3.0	0.0	3.0
+chr2	811423	1.0	0.0	1.0
+chr2	811424	1.0	0.0	1.0
+chr2	811425	5.0	4.0	9.0
+chr2	811426	6.0	0.0	6.0
+chr2	811427	5.0	4.0	9.0
+chr2	811428	0.0	4.0	4.0
+chr2	811429	3.0	1.0	4.0
+chr2	811430	5.0	4.0	9.0
+chr2	811431	6.0	8.0	14.0
+chr2	811432	1.0	3.0	4.0
+chr2	811433	2.0	1.0	3.0
+chr2	811435	4.0	3.0	7.0
+chr2	811437	0.0	1.0	1.0
+chr2	811439	1.0	0.0	1.0
+chr2	811440	1.0	3.0	4.0
+chr2	811441	8.0	3.0	11.0
+chr2	811443	0.0	5.0	5.0
+chr2	811444	0.0	5.0	5.0
+chr2	811445	0.0	1.0	1.0
+chr2	811449	0.0	1.0	1.0
+chr2	811451	2.0	2.0	4.0
+chr2	811454	0.0	1.0	1.0
+chr2	811460	1.0	1.0	2.0
+chr2	811461	1.0	0.0	1.0
+chr2	811465	0.0	5.0	5.0
+chr2	811467	1.0	0.0	1.0
+chr2	811660	0.0	1.0	1.0
+chr2	811674	1.0	0.0	1.0
+chr2	811690	1.0	0.0	1.0
+chr2	811691	1.0	0.0	1.0
+chr2	811692	0.0	1.0	1.0
+chr2	811702	0.0	2.0	2.0
+chr2	811704	5.0	1.0	6.0
+chr2	811712	1.0	0.0	1.0
+chr2	811713	1.0	0.0	1.0
+chr2	811714	1.0	0.0	1.0
+chr2	811715	1.0	0.0	1.0
+chr2	811724	0.0	1.0	1.0
+chr2	811738	0.0	1.0	1.0
+chr2	811746	0.0	1.0	1.0
+chr2	811758	1.0	0.0	1.0
+chr2	811760	0.0	1.0	1.0
+chr2	811812	2.0	0.0	2.0
+chr2	811816	0.0	1.0	1.0
+chr2	811858	1.0	0.0	1.0
+chr2	811859	0.0	1.0	1.0
+chr2	811871	1.0	0.0	1.0
+chr2	811894	0.0	1.0	1.0
+chr2	811942	1.0	0.0	1.0
+chr2	811992	1.0	0.0	1.0
+chr2	811998	1.0	0.0	1.0
+chr2	812027	0.0	1.0	1.0
+chr2	812047	0.0	1.0	1.0
+chr2	812062	0.0	1.0	1.0
+chr2	812110	2.0	0.0	2.0
+chr2	812126	0.0	1.0	1.0
+chr2	812160	0.0	1.0	1.0
+chr2	812161	1.0	0.0	1.0
+chr2	812205	1.0	0.0	1.0
+chr2	812308	0.0	1.0	1.0
+chr2	812312	1.0	0.0	1.0
+chr2	812533	1.0	0.0	1.0
+chr2	812535	0.0	1.0	1.0
+chr2	812536	0.0	1.0	1.0
+chr2	812542	1.0	0.0	1.0
+chr2	812545	2.0	3.0	5.0
+chr2	812546	2.0	0.0	2.0
+chr2	812551	0.0	2.0	2.0
+chr2	812554	0.0	1.0	1.0
+chr2	812558	1.0	0.0	1.0
+chr2	812560	0.0	2.0	2.0
+chr2	812561	0.0	2.0	2.0
+chr2	812562	2.0	0.0	2.0
+chr2	812578	0.0	2.0	2.0
+chr2	812581	1.0	0.0	1.0
+chr2	812587	1.0	0.0	1.0
+chr2	812649	1.0	0.0	1.0
+chr2	812729	1.0	0.0	1.0
+chr2	812740	0.0	1.0	1.0
+chr2	812759	1.0	0.0	1.0
+chr2	812766	2.0	0.0	2.0
+chr2	812770	0.0	1.0	1.0
+chr2	812771	2.0	0.0	2.0
+chr2	812772	0.0	1.0	1.0
+chr2	812774	1.0	0.0	1.0
+chr2	812776	0.0	1.0	1.0
+chr2	812784	1.0	0.0	1.0
+chr2	812788	0.0	1.0	1.0
+chr2	812795	2.0	0.0	2.0
+chr2	812799	0.0	2.0	2.0
+chr2	812802	0.0	1.0	1.0
+chr2	812817	1.0	0.0	1.0
+chr2	812818	1.0	0.0	1.0
+chr2	812825	1.0	0.0	1.0
+chr2	812833	0.0	1.0	1.0
+chr2	812837	0.0	1.0	1.0
+chr2	812838	1.0	1.0	2.0
+chr2	812839	0.0	1.0	1.0
+chr2	812923	3.0	0.0	3.0
+chr2	812939	1.0	0.0	1.0
+chr2	812958	0.0	2.0	2.0
+chr3	212	1.0	0.0	1.0
+chr3	247	1.0	0.0	1.0
+chr3	329	1.0	0.0	1.0
+chr3	454	0.0	1.0	1.0
+chr3	535	2.0	0.0	2.0
+chr3	544	1.0	0.0	1.0
+chr3	547	0.0	1.0	1.0
+chr3	548	0.0	1.0	1.0
+chr3	623	0.0	1.0	1.0
+chr3	636	0.0	1.0	1.0
+chr3	643	0.0	1.0	1.0
+chr3	644	1.0	0.0	1.0
+chr3	649	0.0	1.0	1.0
+chr3	650	1.0	0.0	1.0
+chr3	666	1.0	0.0	1.0
+chr3	671	0.0	2.0	2.0
+chr3	672	0.0	1.0	1.0
+chr3	674	0.0	1.0	1.0
+chr3	675	5.0	0.0	5.0
+chr3	676	0.0	5.0	5.0
+chr3	677	0.0	4.0	4.0
+chr3	684	0.0	2.0	2.0
+chr3	686	1.0	0.0	1.0
+chr3	688	2.0	0.0	2.0
+chr3	689	0.0	1.0	1.0
+chr3	690	0.0	1.0	1.0
+chr3	702	0.0	2.0	2.0
+chr3	707	1.0	2.0	3.0
+chr3	718	0.0	1.0	1.0
+chr3	719	0.0	1.0	1.0
+chr3	732	1.0	0.0	1.0
+chr3	734	1.0	0.0	1.0
+chr3	735	1.0	0.0	1.0
+chr3	740	1.0	0.0	1.0
+chr3	744	1.0	0.0	1.0
+chr3	884	0.0	1.0	1.0
+chr3	890	0.0	1.0	1.0
+chr3	901	2.0	0.0	2.0
+chr3	908	1.0	0.0	1.0
+chr3	909	1.0	0.0	1.0
+chr3	910	0.0	1.0	1.0
+chr3	911	2.0	0.0	2.0
+chr3	917	1.0	0.0	1.0
+chr3	920	2.0	0.0	2.0
+chr3	925	0.0	2.0	2.0
+chr3	926	3.0	2.0	5.0
+chr3	929	0.0	1.0	1.0
+chr3	935	1.0	0.0	1.0
+chr3	936	1.0	0.0	1.0
+chr3	938	0.0	1.0	1.0
+chr3	1235	0.0	1.0	1.0
+chr3	1237	1.0	0.0	1.0
+chr3	1252	1.0	0.0	1.0
+chr3	1284	2.0	0.0	2.0
+chr3	1468	1.0	0.0	1.0
+chr3	2027	0.0	1.0	1.0
+chr3	2502	1.0	0.0	1.0
+chr3	2654	0.0	1.0	1.0
+chr3	3296	0.0	1.0	1.0
+chr3	3655	1.0	0.0	1.0
+chr3	4129	0.0	1.0	1.0
+chr3	4178	2.0	0.0	2.0
+chr3	4313	1.0	0.0	1.0
+chr3	4427	1.0	0.0	1.0
+chr3	4447	1.0	0.0	1.0
+chr3	4456	1.0	0.0	1.0
+chr3	4476	0.0	1.0	1.0
+chr3	4785	1.0	0.0	1.0
+chr3	4849	0.0	1.0	1.0
+chr3	5210	1.0	0.0	1.0
+chr3	5659	0.0	1.0	1.0
+chr3	5941	1.0	0.0	1.0
+chr3	6156	0.0	1.0	1.0
+chr3	6184	1.0	0.0	1.0
+chr3	6342	0.0	1.0	1.0
+chr3	6363	0.0	1.0	1.0
+chr3	6395	1.0	0.0	1.0
+chr3	6533	1.0	0.0	1.0
+chr3	6562	0.0	2.0	2.0
+chr3	6590	0.0	2.0	2.0
+chr3	6592	1.0	0.0	1.0
+chr3	6602	0.0	1.0	1.0
+chr3	6607	0.0	1.0	1.0
+chr3	6619	1.0	0.0	1.0
+chr3	6713	0.0	1.0	1.0
+chr3	6765	0.0	1.0	1.0
+chr3	6766	0.0	5.0	5.0
+chr3	6777	0.0	1.0	1.0
+chr3	6802	0.0	1.0	1.0
+chr3	6865	1.0	0.0	1.0
+chr3	6881	1.0	0.0	1.0
+chr3	6939	4.0	0.0	4.0
+chr3	6943	0.0	1.0	1.0
+chr3	7081	0.0	1.0	1.0
+chr3	7098	0.0	1.0	1.0
+chr3	7099	0.0	1.0	1.0
+chr3	7114	1.0	0.0	1.0
+chr3	7121	1.0	0.0	1.0
+chr3	7123	2.0	0.0	2.0
+chr3	7126	0.0	1.0	1.0
+chr3	7130	1.0	0.0	1.0
+chr3	7137	0.0	1.0	1.0
+chr3	7145	0.0	1.0	1.0
+chr3	7257	1.0	0.0	1.0
+chr3	7268	1.0	0.0	1.0
+chr3	7269	0.0	1.0	1.0
+chr3	7323	0.0	1.0	1.0
+chr3	7327	0.0	1.0	1.0
+chr3	7329	0.0	1.0	1.0
+chr3	7346	1.0	0.0	1.0
+chr3	7376	0.0	1.0	1.0
+chr3	7377	0.0	1.0	1.0
+chr3	7428	0.0	1.0	1.0
+chr3	7454	0.0	1.0	1.0
+chr3	7484	0.0	2.0	2.0
+chr3	7487	1.0	0.0	1.0
+chr3	7498	1.0	0.0	1.0
+chr3	7514	0.0	1.0	1.0
+chr3	7564	1.0	0.0	1.0
+chr3	7685	0.0	1.0	1.0
+chr3	7706	1.0	0.0	1.0
+chr3	7835	1.0	0.0	1.0
+chr3	7845	0.0	1.0	1.0
+chr3	7905	0.0	1.0	1.0
+chr3	7937	0.0	1.0	1.0
+chr3	7954	1.0	0.0	1.0
+chr3	7982	0.0	2.0	2.0
+chr3	8031	0.0	1.0	1.0
+chr3	8053	4.0	0.0	4.0
+chr3	8054	1.0	0.0	1.0
+chr3	8065	1.0	0.0	1.0
+chr3	8074	1.0	0.0	1.0
+chr3	8099	1.0	0.0	1.0
+chr3	8104	0.0	1.0	1.0
+chr3	8109	0.0	1.0	1.0
+chr3	8221	1.0	0.0	1.0
+chr3	8247	0.0	1.0	1.0
+chr3	8257	1.0	0.0	1.0
+chr3	8258	0.0	1.0	1.0
+chr3	8265	1.0	0.0	1.0
+chr3	8266	1.0	0.0	1.0
+chr3	8270	3.0	0.0	3.0
+chr3	8275	0.0	1.0	1.0
+chr3	8277	1.0	0.0	1.0
+chr3	8292	0.0	1.0	1.0
+chr3	8295	1.0	0.0	1.0
+chr3	8609	1.0	0.0	1.0
+chr3	8647	0.0	1.0	1.0
+chr3	8657	0.0	1.0	1.0
+chr3	8670	1.0	0.0	1.0
+chr3	8675	0.0	1.0	1.0
+chr3	8783	1.0	0.0	1.0
+chr3	8813	1.0	0.0	1.0
+chr3	8831	0.0	1.0	1.0
+chr3	8862	1.0	0.0	1.0
+chr3	8893	0.0	1.0	1.0
+chr3	8923	0.0	2.0	2.0
+chr3	8926	0.0	1.0	1.0
+chr3	8929	0.0	1.0	1.0
+chr3	8936	1.0	0.0	1.0
+chr3	8937	1.0	0.0	1.0
+chr3	8943	0.0	2.0	2.0
+chr3	8944	0.0	1.0	1.0
+chr3	8951	1.0	0.0	1.0
+chr3	8960	0.0	1.0	1.0
+chr3	8982	1.0	0.0	1.0
+chr3	8996	0.0	1.0	1.0
+chr3	9383	0.0	1.0	1.0
+chr3	9574	1.0	0.0	1.0
+chr3	9579	0.0	1.0	1.0
+chr3	9584	0.0	1.0	1.0
+chr3	9740	1.0	0.0	1.0
+chr3	10153	1.0	0.0	1.0
+chr3	10299	1.0	0.0	1.0
+chr3	10367	1.0	0.0	1.0
+chr3	10519	0.0	1.0	1.0
+chr3	10669	0.0	1.0	1.0
+chr3	10741	1.0	0.0	1.0
+chr3	10744	2.0	0.0	2.0
+chr3	10755	0.0	1.0	1.0
+chr3	10757	1.0	0.0	1.0
+chr3	10846	0.0	1.0	1.0
+chr3	10909	1.0	0.0	1.0
+chr3	10923	1.0	0.0	1.0
+chr3	10932	1.0	0.0	1.0
+chr3	10947	0.0	1.0	1.0
+chr3	10951	0.0	1.0	1.0
+chr3	10960	1.0	0.0	1.0
+chr3	10967	3.0	0.0	3.0
+chr3	10979	1.0	0.0	1.0
+chr3	10990	0.0	1.0	1.0
+chr3	10992	0.0	1.0	1.0
+chr3	11015	0.0	1.0	1.0
+chr3	11631	0.0	1.0	1.0
+chr3	11701	0.0	1.0	1.0
+chr3	11757	0.0	1.0	1.0
+chr3	11794	0.0	1.0	1.0
+chr3	11815	1.0	0.0	1.0
+chr3	11844	0.0	1.0	1.0
+chr3	11931	1.0	0.0	1.0
+chr3	11933	0.0	1.0	1.0
+chr3	11936	1.0	0.0	1.0
+chr3	11980	0.0	1.0	1.0
+chr3	12028	0.0	1.0	1.0
+chr3	12095	0.0	1.0	1.0
+chr3	12109	1.0	0.0	1.0
+chr3	12119	1.0	0.0	1.0
+chr3	12122	0.0	1.0	1.0
+chr3	12133	0.0	1.0	1.0
+chr3	12136	0.0	1.0	1.0
+chr3	12137	0.0	1.0	1.0
+chr3	12192	0.0	1.0	1.0
+chr3	12246	1.0	0.0	1.0
+chr3	12250	0.0	1.0	1.0
+chr3	12254	1.0	1.0	2.0
+chr3	12259	0.0	1.0	1.0
+chr3	12260	2.0	0.0	2.0
+chr3	12263	1.0	0.0	1.0
+chr3	12495	0.0	1.0	1.0
+chr3	12537	1.0	0.0	1.0
+chr3	12651	0.0	1.0	1.0
+chr3	12799	1.0	0.0	1.0
+chr3	12805	0.0	1.0	1.0
+chr3	12809	1.0	0.0	1.0
+chr3	12820	1.0	0.0	1.0
+chr3	12829	0.0	1.0	1.0
+chr3	12830	1.0	2.0	3.0
+chr3	12838	0.0	1.0	1.0
+chr3	12840	0.0	1.0	1.0
+chr3	12849	0.0	1.0	1.0
+chr3	12850	0.0	1.0	1.0
+chr3	12856	0.0	1.0	1.0
+chr3	13777	0.0	1.0	1.0
+chr3	13781	1.0	0.0	1.0
+chr3	13782	1.0	0.0	1.0
+chr3	13790	0.0	1.0	1.0
+chr3	13798	0.0	1.0	1.0
+chr3	13799	0.0	1.0	1.0
+chr3	13800	1.0	0.0	1.0
+chr3	13803	1.0	0.0	1.0
+chr3	13805	0.0	1.0	1.0
+chr3	13811	1.0	0.0	1.0
+chr3	13814	1.0	0.0	1.0
+chr3	13820	0.0	1.0	1.0
+chr3	13823	1.0	0.0	1.0
+chr3	13824	3.0	0.0	3.0
+chr3	13825	2.0	0.0	2.0
+chr3	13828	1.0	0.0	1.0
+chr3	13834	1.0	3.0	4.0
+chr3	13842	0.0	1.0	1.0
+chr3	13850	2.0	0.0	2.0
+chr3	13863	1.0	0.0	1.0
+chr3	13872	1.0	0.0	1.0
+chr3	13991	2.0	0.0	2.0
+chr3	14220	1.0	0.0	1.0
+chr3	14847	1.0	0.0	1.0
+chr3	16031	1.0	0.0	1.0
+chr3	16145	1.0	0.0	1.0
+chr3	16238	0.0	1.0	1.0
+chr3	16418	0.0	1.0	1.0
+chr3	16572	1.0	0.0	1.0
+chr3	16601	0.0	1.0	1.0
+chr3	16777	1.0	0.0	1.0
+chr3	16917	0.0	1.0	1.0
+chr3	16927	0.0	1.0	1.0
+chr3	16947	1.0	0.0	1.0
+chr3	16950	0.0	1.0	1.0
+chr3	17282	1.0	0.0	1.0
+chr3	17284	0.0	4.0	4.0
+chr3	17296	1.0	0.0	1.0
+chr3	17298	0.0	1.0	1.0
+chr3	17304	3.0	0.0	3.0
+chr3	17305	1.0	0.0	1.0
+chr3	17306	1.0	0.0	1.0
+chr3	17308	0.0	3.0	3.0
+chr3	17311	0.0	3.0	3.0
+chr3	17313	1.0	4.0	5.0
+chr3	17314	1.0	0.0	1.0
+chr3	17315	1.0	2.0	3.0
+chr3	17318	1.0	2.0	3.0
+chr3	17321	0.0	1.0	1.0
+chr3	17323	1.0	0.0	1.0
+chr3	17324	4.0	0.0	4.0
+chr3	17326	1.0	0.0	1.0
+chr3	17327	3.0	0.0	3.0
+chr3	17328	1.0	0.0	1.0
+chr3	17329	0.0	1.0	1.0
+chr3	17330	1.0	0.0	1.0
+chr3	17333	0.0	1.0	1.0
+chr3	17339	1.0	0.0	1.0
+chr3	17340	3.0	0.0	3.0
+chr3	17344	1.0	0.0	1.0
+chr3	17363	1.0	0.0	1.0
+chr3	17479	0.0	1.0	1.0
+chr3	17480	1.0	0.0	1.0
+chr3	17500	1.0	0.0	1.0
+chr3	17650	0.0	1.0	1.0
+chr3	17672	1.0	0.0	1.0
+chr3	17679	0.0	1.0	1.0
+chr3	17807	1.0	0.0	1.0
+chr3	18020	1.0	0.0	1.0
+chr3	18114	1.0	0.0	1.0
+chr3	18128	0.0	1.0	1.0
+chr3	18970	1.0	0.0	1.0
+chr3	19088	1.0	0.0	1.0
+chr3	19162	1.0	0.0	1.0
+chr3	19342	1.0	0.0	1.0
+chr3	19455	1.0	0.0	1.0
+chr3	19581	0.0	1.0	1.0
+chr3	19607	1.0	0.0	1.0
+chr3	19860	0.0	2.0	2.0
+chr3	20060	1.0	0.0	1.0
+chr3	20196	1.0	0.0	1.0
+chr3	20221	0.0	1.0	1.0
+chr3	20225	0.0	1.0	1.0
+chr3	20231	1.0	0.0	1.0
+chr3	20405	0.0	1.0	1.0
+chr3	20509	1.0	0.0	1.0
+chr3	20708	0.0	1.0	1.0
+chr3	20833	1.0	0.0	1.0
+chr3	20835	1.0	0.0	1.0
+chr3	20895	0.0	1.0	1.0
+chr3	20920	1.0	0.0	1.0
+chr3	21084	1.0	0.0	1.0
+chr3	21316	1.0	0.0	1.0
+chr3	21336	0.0	1.0	1.0
+chr3	21436	1.0	0.0	1.0
+chr3	21569	0.0	1.0	1.0
+chr3	21570	0.0	1.0	1.0
+chr3	21576	1.0	0.0	1.0
+chr3	21611	1.0	0.0	1.0
+chr3	21740	0.0	1.0	1.0
+chr3	21751	0.0	1.0	1.0
+chr3	21754	0.0	1.0	1.0
+chr3	21757	1.0	0.0	1.0
+chr3	21760	1.0	0.0	1.0
+chr3	21788	0.0	1.0	1.0
+chr3	21929	0.0	1.0	1.0
+chr3	21934	1.0	0.0	1.0
+chr3	21935	1.0	0.0	1.0
+chr3	21939	1.0	0.0	1.0
+chr3	21943	0.0	1.0	1.0
+chr3	21946	1.0	0.0	1.0
+chr3	21948	1.0	1.0	2.0
+chr3	21950	1.0	0.0	1.0
+chr3	21953	0.0	1.0	1.0
+chr3	22076	0.0	1.0	1.0
+chr3	22078	1.0	0.0	1.0
+chr3	22080	0.0	2.0	2.0
+chr3	22081	0.0	1.0	1.0
+chr3	22083	1.0	0.0	1.0
+chr3	22086	1.0	0.0	1.0
+chr3	22093	0.0	2.0	2.0
+chr3	22095	0.0	1.0	1.0
+chr3	22096	1.0	0.0	1.0
+chr3	22100	5.0	0.0	5.0
+chr3	22101	7.0	0.0	7.0
+chr3	22102	1.0	1.0	2.0
+chr3	22103	0.0	1.0	1.0
+chr3	22106	0.0	1.0	1.0
+chr3	22107	0.0	2.0	2.0
+chr3	22111	0.0	2.0	2.0
+chr3	22114	0.0	1.0	1.0
+chr3	22116	0.0	1.0	1.0
+chr3	22118	1.0	0.0	1.0
+chr3	22122	1.0	0.0	1.0
+chr3	22132	1.0	1.0	2.0
+chr3	22141	1.0	0.0	1.0
+chr3	22149	1.0	0.0	1.0
+chr3	22200	1.0	0.0	1.0
+chr3	22312	0.0	1.0	1.0
+chr3	22368	0.0	1.0	1.0
+chr3	22546	1.0	0.0	1.0
+chr3	22653	0.0	2.0	2.0
+chr3	22855	0.0	1.0	1.0
+chr3	22862	0.0	1.0	1.0
+chr3	22863	0.0	1.0	1.0
+chr3	23148	1.0	0.0	1.0
+chr3	23153	0.0	1.0	1.0
+chr3	23164	0.0	1.0	1.0
+chr3	23297	0.0	2.0	2.0
+chr3	23322	0.0	1.0	1.0
+chr3	23324	0.0	1.0	1.0
+chr3	23330	1.0	0.0	1.0
+chr3	23331	1.0	0.0	1.0
+chr3	23333	2.0	0.0	2.0
+chr3	23335	4.0	0.0	4.0
+chr3	23345	2.0	0.0	2.0
+chr3	23348	0.0	1.0	1.0
+chr3	23349	0.0	2.0	2.0
+chr3	23351	2.0	1.0	3.0
+chr3	23354	1.0	3.0	4.0
+chr3	23355	0.0	1.0	1.0
+chr3	23356	0.0	3.0	3.0
+chr3	23360	0.0	1.0	1.0
+chr3	23370	0.0	1.0	1.0
+chr3	23372	0.0	1.0	1.0
+chr3	23373	1.0	1.0	2.0
+chr3	23390	0.0	1.0	1.0
+chr3	23591	1.0	0.0	1.0
+chr3	23595	1.0	0.0	1.0
+chr3	23602	0.0	1.0	1.0
+chr3	23603	0.0	2.0	2.0
+chr3	23606	1.0	1.0	2.0
+chr3	23615	0.0	2.0	2.0
+chr3	23619	1.0	2.0	3.0
+chr3	23621	1.0	0.0	1.0
+chr3	23623	0.0	2.0	2.0
+chr3	23626	0.0	1.0	1.0
+chr3	23628	1.0	0.0	1.0
+chr3	23629	0.0	1.0	1.0
+chr3	23650	0.0	1.0	1.0
+chr3	23792	1.0	0.0	1.0
+chr3	23795	0.0	1.0	1.0
+chr3	23991	0.0	1.0	1.0
+chr3	24113	1.0	1.0	2.0
+chr3	24122	1.0	0.0	1.0
+chr3	24131	0.0	1.0	1.0
+chr3	24132	0.0	1.0	1.0
+chr3	24143	1.0	0.0	1.0
+chr3	24145	1.0	1.0	2.0
+chr3	24196	0.0	1.0	1.0
+chr3	24255	1.0	0.0	1.0
+chr3	24269	0.0	1.0	1.0
+chr3	24294	4.0	2.0	6.0
+chr3	24295	1.0	1.0	2.0
+chr3	24296	1.0	0.0	1.0
+chr3	24299	0.0	1.0	1.0
+chr3	24302	1.0	0.0	1.0
+chr3	24303	7.0	0.0	7.0
+chr3	24305	3.0	0.0	3.0
+chr3	24307	1.0	0.0	1.0
+chr3	24308	0.0	2.0	2.0
+chr3	24310	1.0	0.0	1.0
+chr3	24314	1.0	0.0	1.0
+chr3	24317	0.0	1.0	1.0
+chr3	24320	0.0	1.0	1.0
+chr3	24322	0.0	1.0	1.0
+chr3	24323	0.0	1.0	1.0
+chr3	24379	0.0	1.0	1.0
+chr3	24486	1.0	0.0	1.0
+chr3	24504	1.0	0.0	1.0
+chr3	24509	1.0	0.0	1.0
+chr3	24536	0.0	1.0	1.0
+chr3	24569	1.0	0.0	1.0
+chr3	24583	0.0	2.0	2.0
+chr3	24592	0.0	2.0	2.0
+chr3	24602	1.0	0.0	1.0
+chr3	24776	1.0	0.0	1.0
+chr3	24782	0.0	1.0	1.0
+chr3	24784	0.0	1.0	1.0
+chr3	24791	1.0	0.0	1.0
+chr3	24792	3.0	0.0	3.0
+chr3	24795	1.0	0.0	1.0
+chr3	24796	2.0	12.0	14.0
+chr3	24798	0.0	1.0	1.0
+chr3	24801	1.0	0.0	1.0
+chr3	24804	1.0	0.0	1.0
+chr3	24805	1.0	0.0	1.0
+chr3	24807	0.0	1.0	1.0
+chr3	24811	2.0	0.0	2.0
+chr3	24816	0.0	1.0	1.0
+chr3	24817	0.0	5.0	5.0
+chr3	24818	0.0	10.0	10.0
+chr3	24823	1.0	0.0	1.0
+chr3	24824	7.0	0.0	7.0
+chr3	24833	1.0	0.0	1.0
+chr3	24836	2.0	0.0	2.0
+chr3	24841	0.0	1.0	1.0
+chr3	24851	1.0	0.0	1.0
+chr3	24938	1.0	0.0	1.0
+chr3	24967	2.0	0.0	2.0
+chr3	24973	0.0	1.0	1.0
+chr3	24980	0.0	1.0	1.0
+chr3	24991	1.0	0.0	1.0
+chr3	25009	1.0	0.0	1.0
+chr3	25087	0.0	1.0	1.0
+chr3	25133	0.0	1.0	1.0
+chr3	25139	1.0	0.0	1.0
+chr3	25140	3.0	0.0	3.0
+chr3	25146	1.0	0.0	1.0
+chr3	25150	0.0	1.0	1.0
+chr3	25168	1.0	0.0	1.0
+chr3	25598	1.0	0.0	1.0
+chr3	25797	0.0	1.0	1.0
+chr3	26120	1.0	0.0	1.0
+chr3	26124	0.0	1.0	1.0
+chr3	26345	0.0	1.0	1.0
+chr3	26672	1.0	0.0	1.0
+chr3	26712	2.0	0.0	2.0
+chr3	26841	1.0	0.0	1.0
+chr3	27151	0.0	1.0	1.0
+chr3	27156	1.0	1.0	2.0
+chr3	27157	1.0	0.0	1.0
+chr3	27305	1.0	0.0	1.0
+chr3	27308	0.0	2.0	2.0
+chr3	27309	1.0	1.0	2.0
+chr3	27315	0.0	1.0	1.0
+chr3	27326	3.0	0.0	3.0
+chr3	27330	0.0	1.0	1.0
+chr3	27332	1.0	0.0	1.0
+chr3	27336	1.0	0.0	1.0
+chr3	27337	1.0	0.0	1.0
+chr3	27504	0.0	1.0	1.0
+chr3	27510	0.0	1.0	1.0
+chr3	27512	3.0	0.0	3.0
+chr3	27513	0.0	1.0	1.0
+chr3	27550	2.0	0.0	2.0
+chr3	27553	1.0	0.0	1.0
+chr3	27554	1.0	1.0	2.0
+chr3	27770	1.0	0.0	1.0
+chr3	27936	0.0	1.0	1.0
+chr3	27945	1.0	1.0	2.0
+chr3	27950	1.0	0.0	1.0
+chr3	27953	1.0	0.0	1.0
+chr3	27954	1.0	1.0	2.0
+chr3	27957	1.0	0.0	1.0
+chr3	27959	0.0	1.0	1.0
+chr3	27962	0.0	1.0	1.0
+chr3	27963	0.0	1.0	1.0
+chr3	27972	1.0	0.0	1.0
+chr3	27973	1.0	0.0	1.0
+chr3	27978	0.0	2.0	2.0
+chr3	28140	0.0	1.0	1.0
+chr3	28189	0.0	1.0	1.0
+chr3	28274	2.0	0.0	2.0
+chr3	28289	1.0	0.0	1.0
+chr3	28577	1.0	0.0	1.0
+chr3	28722	0.0	1.0	1.0
+chr3	28740	0.0	1.0	1.0
+chr3	28775	1.0	0.0	1.0
+chr3	28844	1.0	0.0	1.0
+chr3	29027	0.0	1.0	1.0
+chr3	29050	1.0	0.0	1.0
+chr3	29616	3.0	0.0	3.0
+chr3	30065	1.0	0.0	1.0
+chr3	30188	1.0	0.0	1.0
+chr3	30222	1.0	0.0	1.0
+chr3	30237	0.0	2.0	2.0
+chr3	30248	0.0	1.0	1.0
+chr3	30442	0.0	1.0	1.0
+chr3	30697	0.0	1.0	1.0
+chr3	30762	0.0	1.0	1.0
+chr3	30785	0.0	1.0	1.0
+chr3	30928	0.0	1.0	1.0
+chr3	30942	1.0	0.0	1.0
+chr3	30952	0.0	1.0	1.0
+chr3	31074	0.0	1.0	1.0
+chr3	31085	2.0	0.0	2.0
+chr3	31102	0.0	1.0	1.0
+chr3	31105	0.0	1.0	1.0
+chr3	31131	1.0	0.0	1.0
+chr3	31133	2.0	0.0	2.0
+chr3	31139	1.0	0.0	1.0
+chr3	31143	0.0	3.0	3.0
+chr3	31152	1.0	0.0	1.0
+chr3	31153	1.0	0.0	1.0
+chr3	31155	0.0	1.0	1.0
+chr3	31434	1.0	0.0	1.0
+chr3	31445	2.0	0.0	2.0
+chr3	31452	1.0	0.0	1.0
+chr3	31453	2.0	0.0	2.0
+chr3	31457	2.0	0.0	2.0
+chr3	31461	1.0	0.0	1.0
+chr3	31462	0.0	2.0	2.0
+chr3	31463	1.0	0.0	1.0
+chr3	31466	1.0	5.0	6.0
+chr3	31493	0.0	1.0	1.0
+chr3	31494	1.0	0.0	1.0
+chr3	31502	0.0	1.0	1.0
+chr3	31573	1.0	0.0	1.0
+chr3	31592	0.0	1.0	1.0
+chr3	31606	0.0	1.0	1.0
+chr3	31608	0.0	1.0	1.0
+chr3	31618	0.0	2.0	2.0
+chr3	31622	2.0	0.0	2.0
+chr3	31632	1.0	0.0	1.0
+chr3	31634	0.0	1.0	1.0
+chr3	31639	0.0	1.0	1.0
+chr3	31653	2.0	0.0	2.0
+chr3	31768	1.0	0.0	1.0
+chr3	31779	0.0	2.0	2.0
+chr3	31786	0.0	1.0	1.0
+chr3	31815	1.0	0.0	1.0
+chr3	31819	0.0	1.0	1.0
+chr3	31871	0.0	1.0	1.0
+chr3	31965	0.0	1.0	1.0
+chr3	32135	0.0	2.0	2.0
+chr3	32226	1.0	0.0	1.0
+chr3	32860	1.0	0.0	1.0
+chr3	32944	1.0	0.0	1.0
+chr3	32947	0.0	1.0	1.0
+chr3	33470	0.0	1.0	1.0
+chr3	33484	0.0	1.0	1.0
+chr3	33749	1.0	0.0	1.0
+chr3	34231	1.0	0.0	1.0
+chr3	34297	0.0	2.0	2.0
+chr3	34349	0.0	1.0	1.0
+chr3	34862	0.0	1.0	1.0
+chr3	34863	1.0	0.0	1.0
+chr3	34874	1.0	0.0	1.0
+chr3	34884	0.0	2.0	2.0
+chr3	34894	1.0	0.0	1.0
+chr3	35023	1.0	0.0	1.0
+chr3	35028	1.0	0.0	1.0
+chr3	35039	1.0	0.0	1.0
+chr3	35185	0.0	1.0	1.0
+chr3	35189	1.0	1.0	2.0
+chr3	35207	0.0	1.0	1.0
+chr3	35225	0.0	1.0	1.0
+chr3	35249	2.0	0.0	2.0
+chr3	35326	1.0	0.0	1.0
+chr3	35348	1.0	0.0	1.0
+chr3	35349	0.0	3.0	3.0
+chr3	35350	0.0	1.0	1.0
+chr3	35355	1.0	0.0	1.0
+chr3	35357	3.0	0.0	3.0
+chr3	35358	1.0	0.0	1.0
+chr3	35360	0.0	1.0	1.0
+chr3	35362	0.0	1.0	1.0
+chr3	35364	0.0	1.0	1.0
+chr3	35365	4.0	1.0	5.0
+chr3	35366	0.0	1.0	1.0
+chr3	35367	0.0	1.0	1.0
+chr3	35368	3.0	1.0	4.0
+chr3	35369	0.0	1.0	1.0
+chr3	35370	0.0	2.0	2.0
+chr3	35371	0.0	2.0	2.0
+chr3	35372	0.0	1.0	1.0
+chr3	35378	1.0	1.0	2.0
+chr3	35380	1.0	0.0	1.0
+chr3	35384	0.0	1.0	1.0
+chr3	35385	2.0	0.0	2.0
+chr3	35386	3.0	0.0	3.0
+chr3	35387	2.0	0.0	2.0
+chr3	35388	0.0	6.0	6.0
+chr3	35389	0.0	1.0	1.0
+chr3	35390	0.0	5.0	5.0
+chr3	35399	1.0	1.0	2.0
+chr3	35411	1.0	0.0	1.0
+chr3	35599	0.0	1.0	1.0
+chr3	35601	1.0	0.0	1.0
+chr3	35603	1.0	0.0	1.0
+chr3	35616	4.0	0.0	4.0
+chr3	35622	5.0	0.0	5.0
+chr3	35623	5.0	0.0	5.0
+chr3	35624	0.0	1.0	1.0
+chr3	35625	0.0	4.0	4.0
+chr3	35629	0.0	1.0	1.0
+chr3	35630	0.0	1.0	1.0
+chr3	35635	0.0	1.0	1.0
+chr3	35639	1.0	0.0	1.0
+chr3	35640	0.0	3.0	3.0
+chr3	35641	0.0	1.0	1.0
+chr3	35643	1.0	0.0	1.0
+chr3	35647	0.0	1.0	1.0
+chr3	35672	1.0	0.0	1.0
+chr3	35779	0.0	1.0	1.0
+chr3	35781	0.0	1.0	1.0
+chr3	35899	0.0	1.0	1.0
+chr3	35917	1.0	0.0	1.0
+chr3	35935	0.0	1.0	1.0
+chr3	35940	0.0	1.0	1.0
+chr3	35965	0.0	1.0	1.0
+chr3	36264	1.0	0.0	1.0
+chr3	36301	1.0	0.0	1.0
+chr3	36451	0.0	1.0	1.0
+chr3	36753	1.0	0.0	1.0
+chr3	36995	0.0	1.0	1.0
+chr3	37591	1.0	0.0	1.0
+chr3	37909	1.0	0.0	1.0
+chr3	37994	1.0	0.0	1.0
+chr3	38205	0.0	1.0	1.0
+chr3	38238	0.0	1.0	1.0
+chr3	38395	1.0	0.0	1.0
+chr3	38453	0.0	1.0	1.0
+chr3	38490	1.0	0.0	1.0
+chr3	38635	0.0	1.0	1.0
+chr3	38648	1.0	0.0	1.0
+chr3	38650	0.0	1.0	1.0
+chr3	38654	1.0	0.0	1.0
+chr3	38657	1.0	0.0	1.0
+chr3	38826	0.0	2.0	2.0
+chr3	39040	1.0	0.0	1.0
+chr3	39063	1.0	0.0	1.0
+chr3	39068	0.0	1.0	1.0
+chr3	39072	0.0	1.0	1.0
+chr3	39080	0.0	1.0	1.0
+chr3	39082	1.0	0.0	1.0
+chr3	39094	1.0	0.0	1.0
+chr3	39095	0.0	1.0	1.0
+chr3	39101	0.0	2.0	2.0
+chr3	39102	0.0	2.0	2.0
+chr3	39103	1.0	1.0	2.0
+chr3	39108	0.0	1.0	1.0
+chr3	39111	1.0	0.0	1.0
+chr3	39116	0.0	2.0	2.0
+chr3	39117	1.0	0.0	1.0
+chr3	39121	1.0	0.0	1.0
+chr3	39123	0.0	1.0	1.0
+chr3	39130	1.0	0.0	1.0
+chr3	39132	2.0	0.0	2.0
+chr3	39246	0.0	1.0	1.0
+chr3	39251	1.0	0.0	1.0
+chr3	39260	1.0	0.0	1.0
+chr3	39262	0.0	1.0	1.0
+chr3	39264	0.0	1.0	1.0
+chr3	39273	1.0	0.0	1.0
+chr3	39274	1.0	0.0	1.0
+chr3	39317	1.0	0.0	1.0
+chr3	39378	0.0	1.0	1.0
+chr3	39379	0.0	2.0	2.0
+chr3	39384	3.0	0.0	3.0
+chr3	39394	0.0	1.0	1.0
+chr3	39398	2.0	3.0	5.0
+chr3	39399	0.0	2.0	2.0
+chr3	39403	4.0	0.0	4.0
+chr3	39415	0.0	1.0	1.0
+chr3	39418	2.0	0.0	2.0
+chr3	39419	1.0	0.0	1.0
+chr3	39427	1.0	0.0	1.0
+chr3	39429	0.0	3.0	3.0
+chr3	39434	1.0	0.0	1.0
+chr3	39435	0.0	1.0	1.0
+chr3	39440	0.0	2.0	2.0
+chr3	39683	1.0	0.0	1.0
+chr3	39702	1.0	0.0	1.0
+chr3	39706	1.0	0.0	1.0
+chr3	39867	2.0	0.0	2.0
+chr3	39877	0.0	1.0	1.0
+chr3	39879	1.0	0.0	1.0
+chr3	39888	1.0	1.0	2.0
+chr3	39994	1.0	0.0	1.0
+chr3	40000	1.0	0.0	1.0
+chr3	40025	1.0	0.0	1.0
+chr3	40052	1.0	0.0	1.0
+chr3	40066	0.0	1.0	1.0
+chr3	40072	1.0	0.0	1.0
+chr3	40228	0.0	1.0	1.0
+chr3	40247	1.0	0.0	1.0
+chr3	40332	0.0	1.0	1.0
+chr3	40353	0.0	1.0	1.0
+chr3	40361	1.0	0.0	1.0
+chr3	40380	1.0	0.0	1.0
+chr3	40401	1.0	0.0	1.0
+chr3	40403	1.0	0.0	1.0
+chr3	40408	0.0	1.0	1.0
+chr3	40419	0.0	1.0	1.0
+chr3	40529	0.0	1.0	1.0
+chr3	40532	0.0	1.0	1.0
+chr3	40554	1.0	0.0	1.0
+chr3	40560	0.0	1.0	1.0
+chr3	40648	1.0	0.0	1.0
+chr3	40699	0.0	2.0	2.0
+chr3	40700	0.0	1.0	1.0
+chr3	40712	3.0	0.0	3.0
+chr3	40713	0.0	1.0	1.0
+chr3	40714	0.0	1.0	1.0
+chr3	40715	1.0	0.0	1.0
+chr3	40717	2.0	0.0	2.0
+chr3	40724	3.0	0.0	3.0
+chr3	40730	2.0	0.0	2.0
+chr3	40732	0.0	1.0	1.0
+chr3	40735	0.0	1.0	1.0
+chr3	40736	0.0	2.0	2.0
+chr3	40738	1.0	0.0	1.0
+chr3	40741	0.0	2.0	2.0
+chr3	40742	0.0	1.0	1.0
+chr3	40743	0.0	1.0	1.0
+chr3	40896	0.0	1.0	1.0
+chr3	40900	0.0	1.0	1.0
+chr3	40916	0.0	1.0	1.0
+chr3	40918	1.0	1.0	2.0
+chr3	40922	0.0	1.0	1.0
+chr3	40926	0.0	1.0	1.0
+chr3	40933	1.0	0.0	1.0
+chr3	40934	1.0	0.0	1.0
+chr3	40942	0.0	2.0	2.0
+chr3	40943	1.0	3.0	4.0
+chr3	40944	1.0	2.0	3.0
+chr3	40945	2.0	0.0	2.0
+chr3	40951	2.0	0.0	2.0
+chr3	40954	1.0	0.0	1.0
+chr3	40956	5.0	0.0	5.0
+chr3	40957	0.0	4.0	4.0
+chr3	40958	0.0	1.0	1.0
+chr3	40960	1.0	0.0	1.0
+chr3	40964	1.0	0.0	1.0
+chr3	40965	3.0	0.0	3.0
+chr3	40971	0.0	2.0	2.0
+chr3	40976	0.0	1.0	1.0
+chr3	40978	1.0	0.0	1.0
+chr3	40982	3.0	0.0	3.0
+chr3	40983	1.0	0.0	1.0
+chr3	40984	0.0	3.0	3.0
+chr3	40989	1.0	0.0	1.0
+chr3	40990	1.0	0.0	1.0
+chr3	40998	2.0	0.0	2.0
+chr3	41002	4.0	0.0	4.0
+chr3	41004	0.0	1.0	1.0
+chr3	41005	0.0	1.0	1.0
+chr3	41009	1.0	0.0	1.0
+chr3	41027	0.0	1.0	1.0
+chr3	41028	0.0	1.0	1.0
+chr3	41031	1.0	0.0	1.0
+chr3	41038	0.0	1.0	1.0
+chr3	41048	1.0	0.0	1.0
+chr3	41049	1.0	0.0	1.0
+chr3	41070	0.0	1.0	1.0
+chr3	41123	1.0	0.0	1.0
+chr3	41133	1.0	0.0	1.0
+chr3	41137	1.0	0.0	1.0
+chr3	41159	0.0	1.0	1.0
+chr3	41169	1.0	0.0	1.0
+chr3	41171	0.0	1.0	1.0
+chr3	41179	1.0	0.0	1.0
+chr3	41188	0.0	1.0	1.0
+chr3	41353	0.0	1.0	1.0
+chr3	41517	0.0	1.0	1.0
+chr3	41522	0.0	1.0	1.0
+chr3	41526	1.0	0.0	1.0
+chr3	41532	0.0	1.0	1.0
+chr3	41547	1.0	0.0	1.0
+chr3	41665	2.0	0.0	2.0
+chr3	41671	0.0	1.0	1.0
+chr3	41673	0.0	1.0	1.0
+chr3	41683	1.0	0.0	1.0
+chr3	41686	1.0	0.0	1.0
+chr3	41691	0.0	4.0	4.0
+chr3	41699	1.0	0.0	1.0
+chr3	41710	0.0	2.0	2.0
+chr3	42109	1.0	0.0	1.0
+chr3	42121	0.0	1.0	1.0
+chr3	42129	0.0	1.0	1.0
+chr3	42131	1.0	0.0	1.0
+chr3	42347	1.0	0.0	1.0
+chr3	42362	1.0	0.0	1.0
+chr3	42368	1.0	0.0	1.0
+chr3	42460	1.0	0.0	1.0
+chr3	42626	0.0	2.0	2.0
+chr3	42652	0.0	1.0	1.0
+chr3	42731	0.0	1.0	1.0
+chr3	42816	1.0	0.0	1.0
+chr3	42867	1.0	0.0	1.0
+chr3	42877	0.0	1.0	1.0
+chr3	42904	1.0	0.0	1.0
+chr3	43126	0.0	1.0	1.0
+chr3	43142	1.0	0.0	1.0
+chr3	43149	0.0	1.0	1.0
+chr3	43154	0.0	1.0	1.0
+chr3	43164	1.0	1.0	2.0
+chr3	43169	0.0	2.0	2.0
+chr3	43185	1.0	0.0	1.0
+chr3	43208	2.0	0.0	2.0
+chr3	43217	1.0	0.0	1.0
+chr3	43221	1.0	0.0	1.0
+chr3	43258	0.0	1.0	1.0
+chr3	43312	3.0	0.0	3.0
+chr3	43320	1.0	0.0	1.0
+chr3	43348	1.0	0.0	1.0
+chr3	43353	0.0	1.0	1.0
+chr3	43354	1.0	0.0	1.0
+chr3	43382	0.0	2.0	2.0
+chr3	43395	1.0	0.0	1.0
+chr3	43423	0.0	1.0	1.0
+chr3	43468	0.0	1.0	1.0
+chr3	43514	2.0	0.0	2.0
+chr3	43519	0.0	1.0	1.0
+chr3	43721	0.0	1.0	1.0
+chr3	43852	0.0	1.0	1.0
+chr3	43883	0.0	1.0	1.0
+chr3	43887	0.0	1.0	1.0
+chr3	43888	1.0	0.0	1.0
+chr3	43966	0.0	1.0	1.0
+chr3	43978	1.0	0.0	1.0
+chr3	43985	0.0	1.0	1.0
+chr3	44008	1.0	0.0	1.0
+chr3	44024	0.0	1.0	1.0
+chr3	44154	0.0	1.0	1.0
+chr3	44156	1.0	0.0	1.0
+chr3	44160	1.0	0.0	1.0
+chr3	44164	0.0	2.0	2.0
+chr3	44203	2.0	0.0	2.0
+chr3	44209	1.0	0.0	1.0
+chr3	44210	1.0	0.0	1.0
+chr3	44219	1.0	0.0	1.0
+chr3	44227	2.0	0.0	2.0
+chr3	44243	0.0	1.0	1.0
+chr3	44254	1.0	0.0	1.0
+chr3	44347	1.0	0.0	1.0
+chr3	44355	0.0	1.0	1.0
+chr3	44361	1.0	0.0	1.0
+chr3	44374	1.0	0.0	1.0
+chr3	44383	1.0	1.0	2.0
+chr3	44394	1.0	0.0	1.0
+chr3	44406	12.0	0.0	12.0
+chr3	44409	1.0	0.0	1.0
+chr3	44411	1.0	1.0	2.0
+chr3	44416	3.0	2.0	5.0
+chr3	44417	0.0	1.0	1.0
+chr3	44423	0.0	3.0	3.0
+chr3	44425	1.0	0.0	1.0
+chr3	44426	1.0	0.0	1.0
+chr3	44428	1.0	0.0	1.0
+chr3	44430	0.0	1.0	1.0
+chr3	44436	0.0	2.0	2.0
+chr3	44437	0.0	1.0	1.0
+chr3	44440	2.0	0.0	2.0
+chr3	44477	1.0	0.0	1.0
+chr3	44480	1.0	0.0	1.0
+chr3	44815	0.0	1.0	1.0
+chr3	44920	0.0	1.0	1.0
+chr3	44971	1.0	0.0	1.0
+chr3	45135	1.0	0.0	1.0
+chr3	45320	1.0	0.0	1.0
+chr3	45502	0.0	1.0	1.0
+chr3	46049	1.0	0.0	1.0
+chr3	46462	0.0	1.0	1.0
+chr3	46557	0.0	2.0	2.0
+chr3	46563	0.0	1.0	1.0
+chr3	46564	0.0	1.0	1.0
+chr3	46568	1.0	0.0	1.0
+chr3	46571	0.0	1.0	1.0
+chr3	46575	1.0	0.0	1.0
+chr3	46714	0.0	1.0	1.0
+chr3	46720	2.0	0.0	2.0
+chr3	46726	1.0	0.0	1.0
+chr3	46730	0.0	2.0	2.0
+chr3	46735	1.0	0.0	1.0
+chr3	46738	0.0	1.0	1.0
+chr3	46739	0.0	1.0	1.0
+chr3	46748	1.0	0.0	1.0
+chr3	46749	0.0	2.0	2.0
+chr3	46754	0.0	1.0	1.0
+chr3	46856	0.0	1.0	1.0
+chr3	46862	0.0	1.0	1.0
+chr3	46879	0.0	1.0	1.0
+chr3	46880	2.0	0.0	2.0
+chr3	46881	0.0	1.0	1.0
+chr3	46889	4.0	0.0	4.0
+chr3	46896	1.0	0.0	1.0
+chr3	46898	0.0	6.0	6.0
+chr3	46899	0.0	4.0	4.0
+chr3	46900	0.0	4.0	4.0
+chr3	46903	1.0	0.0	1.0
+chr3	46905	7.0	0.0	7.0
+chr3	46914	0.0	1.0	1.0
+chr3	46928	2.0	0.0	2.0
+chr3	47168	1.0	0.0	1.0
+chr3	47177	0.0	1.0	1.0
+chr3	47182	0.0	2.0	2.0
+chr3	47184	0.0	1.0	1.0
+chr3	47185	0.0	1.0	1.0
+chr3	47187	2.0	0.0	2.0
+chr3	47188	1.0	1.0	2.0
+chr3	47190	0.0	1.0	1.0
+chr3	47196	1.0	0.0	1.0
+chr3	47202	3.0	0.0	3.0
+chr3	47208	2.0	0.0	2.0
+chr3	47215	1.0	0.0	1.0
+chr3	47368	2.0	0.0	2.0
+chr3	47383	1.0	0.0	1.0
+chr3	47530	3.0	0.0	3.0
+chr3	47531	0.0	1.0	1.0
+chr3	47543	1.0	1.0	2.0
+chr3	47570	0.0	1.0	1.0
+chr3	47869	1.0	0.0	1.0
+chr3	47878	1.0	0.0	1.0
+chr3	47896	0.0	1.0	1.0
+chr3	47906	0.0	1.0	1.0
+chr3	47963	1.0	0.0	1.0
+chr3	48001	0.0	1.0	1.0
+chr3	48049	0.0	1.0	1.0
+chr3	48062	2.0	0.0	2.0
+chr3	48179	1.0	0.0	1.0
+chr3	48186	0.0	1.0	1.0
+chr3	48196	1.0	0.0	1.0
+chr3	48203	1.0	0.0	1.0
+chr3	48205	0.0	1.0	1.0
+chr3	48207	2.0	0.0	2.0
+chr3	48214	6.0	1.0	7.0
+chr3	48237	0.0	1.0	1.0
+chr3	48258	1.0	0.0	1.0
+chr3	48353	0.0	1.0	1.0
+chr3	48365	4.0	0.0	4.0
+chr3	48366	0.0	1.0	1.0
+chr3	48375	1.0	8.0	9.0
+chr3	48376	1.0	0.0	1.0
+chr3	48378	1.0	0.0	1.0
+chr3	48379	2.0	0.0	2.0
+chr3	48383	2.0	0.0	2.0
+chr3	48385	1.0	0.0	1.0
+chr3	48390	4.0	0.0	4.0
+chr3	48391	2.0	0.0	2.0
+chr3	48397	0.0	1.0	1.0
+chr3	48403	0.0	1.0	1.0
+chr3	48404	1.0	0.0	1.0
+chr3	48409	1.0	0.0	1.0
+chr3	48410	1.0	0.0	1.0
+chr3	48436	0.0	1.0	1.0
+chr3	48722	2.0	0.0	2.0
+chr3	49013	0.0	1.0	1.0
+chr3	49340	0.0	1.0	1.0
+chr3	49352	0.0	1.0	1.0
+chr3	49537	1.0	0.0	1.0
+chr3	49938	0.0	1.0	1.0
+chr3	50083	0.0	1.0	1.0
+chr3	50117	1.0	0.0	1.0
+chr3	50227	3.0	0.0	3.0
+chr3	50244	0.0	1.0	1.0
+chr3	50248	1.0	0.0	1.0
+chr3	50254	1.0	0.0	1.0
+chr3	50749	1.0	0.0	1.0
+chr3	50750	2.0	0.0	2.0
+chr3	50753	0.0	2.0	2.0
+chr3	50757	0.0	1.0	1.0
+chr3	50765	0.0	4.0	4.0
+chr3	50770	0.0	1.0	1.0
+chr3	50778	0.0	1.0	1.0
+chr3	50813	1.0	0.0	1.0
+chr3	50836	0.0	1.0	1.0
+chr3	50895	0.0	1.0	1.0
+chr3	50933	1.0	0.0	1.0
+chr3	51061	1.0	0.0	1.0
+chr3	51069	0.0	1.0	1.0
+chr3	51077	0.0	1.0	1.0
+chr3	51081	0.0	1.0	1.0
+chr3	51090	1.0	0.0	1.0
+chr3	51101	1.0	0.0	1.0
+chr3	51373	1.0	0.0	1.0
+chr3	51383	1.0	0.0	1.0
+chr3	51393	1.0	0.0	1.0
+chr3	51399	1.0	0.0	1.0
+chr3	51403	1.0	1.0	2.0
+chr3	51406	0.0	1.0	1.0
+chr3	51465	0.0	1.0	1.0
+chr3	51542	1.0	0.0	1.0
+chr3	51546	1.0	1.0	2.0
+chr3	51554	0.0	1.0	1.0
+chr3	51614	0.0	2.0	2.0
+chr3	51615	0.0	3.0	3.0
+chr3	51699	0.0	1.0	1.0
+chr3	51725	0.0	1.0	1.0
+chr3	51866	0.0	1.0	1.0
+chr3	51888	0.0	3.0	3.0
+chr3	51889	0.0	1.0	1.0
+chr3	52196	0.0	1.0	1.0
+chr3	52208	0.0	1.0	1.0
+chr3	52212	0.0	1.0	1.0
+chr3	52338	0.0	1.0	1.0
+chr3	52362	1.0	0.0	1.0
+chr3	52371	1.0	0.0	1.0
+chr3	52390	0.0	1.0	1.0
+chr3	52635	0.0	2.0	2.0
+chr3	52639	1.0	0.0	1.0
+chr3	52642	0.0	1.0	1.0
+chr3	52646	0.0	2.0	2.0
+chr3	52649	1.0	0.0	1.0
+chr3	52654	3.0	0.0	3.0
+chr3	52655	3.0	0.0	3.0
+chr3	52656	1.0	3.0	4.0
+chr3	52659	0.0	1.0	1.0
+chr3	52660	0.0	1.0	1.0
+chr3	52662	2.0	0.0	2.0
+chr3	52663	8.0	0.0	8.0
+chr3	52664	0.0	1.0	1.0
+chr3	52666	0.0	4.0	4.0
+chr3	52667	5.0	0.0	5.0
+chr3	52668	0.0	13.0	13.0
+chr3	52670	0.0	9.0	9.0
+chr3	52671	0.0	2.0	2.0
+chr3	52674	1.0	0.0	1.0
+chr3	52675	1.0	0.0	1.0
+chr3	52676	2.0	0.0	2.0
+chr3	52680	1.0	0.0	1.0
+chr3	52681	2.0	4.0	6.0
+chr3	52682	3.0	0.0	3.0
+chr3	52700	1.0	0.0	1.0
+chr3	52706	1.0	0.0	1.0
+chr3	52719	1.0	0.0	1.0
+chr3	52810	0.0	1.0	1.0
+chr3	52811	0.0	1.0	1.0
+chr3	52822	1.0	3.0	4.0
+chr3	52824	0.0	1.0	1.0
+chr3	52828	1.0	0.0	1.0
+chr3	52830	1.0	0.0	1.0
+chr3	52832	1.0	0.0	1.0
+chr3	52834	1.0	0.0	1.0
+chr3	52837	1.0	0.0	1.0
+chr3	52839	3.0	0.0	3.0
+chr3	52843	0.0	2.0	2.0
+chr3	52849	0.0	1.0	1.0
+chr3	52850	0.0	1.0	1.0
+chr3	52861	0.0	1.0	1.0
+chr3	52963	1.0	0.0	1.0
+chr3	52965	0.0	2.0	2.0
+chr3	52976	4.0	0.0	4.0
+chr3	52980	1.0	0.0	1.0
+chr3	53000	0.0	1.0	1.0
+chr3	53007	1.0	0.0	1.0
+chr3	53009	1.0	0.0	1.0
+chr3	53018	0.0	1.0	1.0
+chr3	53053	0.0	1.0	1.0
+chr3	53158	0.0	1.0	1.0
+chr3	53163	0.0	1.0	1.0
+chr3	53173	1.0	0.0	1.0
+chr3	53176	0.0	1.0	1.0
+chr3	53195	3.0	0.0	3.0
+chr3	53214	0.0	1.0	1.0
+chr3	53308	0.0	1.0	1.0
+chr3	53311	1.0	0.0	1.0
+chr3	53325	1.0	0.0	1.0
+chr3	53333	1.0	0.0	1.0
+chr3	53356	1.0	0.0	1.0
+chr3	53403	1.0	0.0	1.0
+chr3	53548	1.0	0.0	1.0
+chr3	53564	1.0	0.0	1.0
+chr3	53692	0.0	1.0	1.0
+chr3	53699	1.0	0.0	1.0
+chr3	53760	0.0	1.0	1.0
+chr3	53844	0.0	2.0	2.0
+chr3	53902	1.0	0.0	1.0
+chr3	54020	0.0	1.0	1.0
+chr3	54081	1.0	0.0	1.0
+chr3	54202	1.0	0.0	1.0
+chr3	54234	0.0	1.0	1.0
+chr3	54245	0.0	1.0	1.0
+chr3	54266	1.0	0.0	1.0
+chr3	54334	0.0	1.0	1.0
+chr3	54403	0.0	1.0	1.0
+chr3	54543	1.0	0.0	1.0
+chr3	54632	0.0	1.0	1.0
+chr3	54641	1.0	0.0	1.0
+chr3	54736	1.0	0.0	1.0
+chr3	54980	0.0	1.0	1.0
+chr3	55006	0.0	1.0	1.0
+chr3	55008	1.0	0.0	1.0
+chr3	55069	0.0	3.0	3.0
+chr3	55162	0.0	1.0	1.0
+chr3	55168	0.0	1.0	1.0
+chr3	55231	0.0	1.0	1.0
+chr3	55360	0.0	1.0	1.0
+chr3	55455	1.0	0.0	1.0
+chr3	55542	0.0	1.0	1.0
+chr3	55617	0.0	1.0	1.0
+chr3	55622	1.0	0.0	1.0
+chr3	55656	1.0	0.0	1.0
+chr3	55674	1.0	0.0	1.0
+chr3	55697	0.0	1.0	1.0
+chr3	55718	0.0	1.0	1.0
+chr3	55723	1.0	0.0	1.0
+chr3	55746	1.0	0.0	1.0
+chr3	55772	0.0	1.0	1.0
+chr3	55776	0.0	1.0	1.0
+chr3	55782	1.0	0.0	1.0
+chr3	55879	1.0	0.0	1.0
+chr3	55891	0.0	1.0	1.0
+chr3	55908	1.0	0.0	1.0
+chr3	56008	1.0	0.0	1.0
+chr3	56314	0.0	1.0	1.0
+chr3	56352	0.0	1.0	1.0
+chr3	56359	2.0	0.0	2.0
+chr3	56375	1.0	0.0	1.0
+chr3	56379	1.0	0.0	1.0
+chr3	56386	2.0	0.0	2.0
+chr3	56402	1.0	0.0	1.0
+chr3	56419	1.0	0.0	1.0
+chr3	56482	0.0	1.0	1.0
+chr3	56549	1.0	0.0	1.0
+chr3	56553	0.0	3.0	3.0
+chr3	56555	1.0	0.0	1.0
+chr3	56556	1.0	0.0	1.0
+chr3	56558	0.0	1.0	1.0
+chr3	56561	0.0	1.0	1.0
+chr3	56563	1.0	1.0	2.0
+chr3	56571	0.0	1.0	1.0
+chr3	56576	0.0	1.0	1.0
+chr3	56578	0.0	1.0	1.0
+chr3	56590	0.0	1.0	1.0
+chr3	57439	1.0	0.0	1.0
+chr3	57570	0.0	1.0	1.0
+chr3	58205	0.0	3.0	3.0
+chr3	58225	1.0	0.0	1.0
+chr3	58233	2.0	0.0	2.0
+chr3	58251	1.0	0.0	1.0
+chr3	58380	1.0	0.0	1.0
+chr3	58409	0.0	3.0	3.0
+chr3	58534	1.0	0.0	1.0
+chr3	58622	0.0	2.0	2.0
+chr3	58690	1.0	0.0	1.0
+chr3	58696	2.0	0.0	2.0
+chr3	58702	1.0	0.0	1.0
+chr3	58704	1.0	0.0	1.0
+chr3	58708	0.0	1.0	1.0
+chr3	58716	0.0	1.0	1.0
+chr3	58719	2.0	1.0	3.0
+chr3	58720	0.0	3.0	3.0
+chr3	58721	1.0	0.0	1.0
+chr3	58724	2.0	0.0	2.0
+chr3	58730	0.0	1.0	1.0
+chr3	58985	0.0	1.0	1.0
+chr3	59001	1.0	0.0	1.0
+chr3	59002	0.0	1.0	1.0
+chr3	59007	4.0	0.0	4.0
+chr3	59012	0.0	2.0	2.0
+chr3	59013	2.0	0.0	2.0
+chr3	59016	2.0	0.0	2.0
+chr3	59023	1.0	0.0	1.0
+chr3	59025	0.0	4.0	4.0
+chr3	59027	0.0	1.0	1.0
+chr3	59038	1.0	0.0	1.0
+chr3	59041	2.0	0.0	2.0
+chr3	59049	0.0	2.0	2.0
+chr3	59066	0.0	1.0	1.0
+chr3	59193	0.0	1.0	1.0
+chr3	59344	1.0	0.0	1.0
+chr3	59520	1.0	0.0	1.0
+chr3	59531	0.0	1.0	1.0
+chr3	59548	1.0	0.0	1.0
+chr3	59769	1.0	0.0	1.0
+chr3	59814	1.0	0.0	1.0
+chr3	60100	0.0	1.0	1.0
+chr3	60117	1.0	0.0	1.0
+chr3	60204	1.0	0.0	1.0
+chr3	60381	1.0	0.0	1.0
+chr3	60463	1.0	0.0	1.0
+chr3	60507	1.0	0.0	1.0
+chr3	60529	1.0	0.0	1.0
+chr3	60638	0.0	1.0	1.0
+chr3	60679	0.0	1.0	1.0
+chr3	60704	0.0	1.0	1.0
+chr3	60852	1.0	0.0	1.0
+chr3	60869	1.0	0.0	1.0
+chr3	60997	0.0	1.0	1.0
+chr3	61018	1.0	0.0	1.0
+chr3	61019	2.0	0.0	2.0
+chr3	61050	1.0	0.0	1.0
+chr3	61051	0.0	1.0	1.0
+chr3	61060	0.0	1.0	1.0
+chr3	61090	0.0	1.0	1.0
+chr3	61121	0.0	1.0	1.0
+chr3	61151	1.0	0.0	1.0
+chr3	61160	0.0	1.0	1.0
+chr3	61162	1.0	0.0	1.0
+chr3	61163	2.0	0.0	2.0
+chr3	61166	0.0	1.0	1.0
+chr3	61171	1.0	0.0	1.0
+chr3	61172	0.0	1.0	1.0
+chr3	61176	1.0	0.0	1.0
+chr3	61177	2.0	0.0	2.0
+chr3	61193	0.0	2.0	2.0
+chr3	61200	1.0	0.0	1.0
+chr3	61202	1.0	0.0	1.0
+chr3	61367	0.0	1.0	1.0
+chr3	61371	0.0	2.0	2.0
+chr3	61377	2.0	3.0	5.0
+chr3	61378	3.0	0.0	3.0
+chr3	61379	1.0	0.0	1.0
+chr3	61380	0.0	2.0	2.0
+chr3	61381	1.0	0.0	1.0
+chr3	61383	0.0	2.0	2.0
+chr3	61386	0.0	3.0	3.0
+chr3	61388	0.0	1.0	1.0
+chr3	61389	7.0	10.0	17.0
+chr3	61390	1.0	1.0	2.0
+chr3	61391	0.0	1.0	1.0
+chr3	61397	0.0	2.0	2.0
+chr3	61398	1.0	0.0	1.0
+chr3	61400	0.0	1.0	1.0
+chr3	61406	0.0	1.0	1.0
+chr3	61408	0.0	5.0	5.0
+chr3	61409	0.0	1.0	1.0
+chr3	61414	2.0	0.0	2.0
+chr3	61416	4.0	0.0	4.0
+chr3	61421	0.0	1.0	1.0
+chr3	61422	0.0	1.0	1.0
+chr3	61426	1.0	0.0	1.0
+chr3	61438	1.0	0.0	1.0
+chr3	61449	0.0	1.0	1.0
+chr3	61450	0.0	2.0	2.0
+chr3	61475	1.0	0.0	1.0
+chr3	61625	0.0	1.0	1.0
+chr3	61639	0.0	1.0	1.0
+chr3	61645	1.0	0.0	1.0
+chr3	61652	4.0	0.0	4.0
+chr3	61655	0.0	1.0	1.0
+chr3	61657	1.0	3.0	4.0
+chr3	61658	0.0	3.0	3.0
+chr3	61660	5.0	0.0	5.0
+chr3	61661	2.0	0.0	2.0
+chr3	61662	0.0	1.0	1.0
+chr3	61664	1.0	2.0	3.0
+chr3	61665	2.0	1.0	3.0
+chr3	61667	0.0	1.0	1.0
+chr3	61668	1.0	0.0	1.0
+chr3	61670	1.0	0.0	1.0
+chr3	61672	1.0	0.0	1.0
+chr3	61673	0.0	1.0	1.0
+chr3	61675	1.0	5.0	6.0
+chr3	61676	0.0	1.0	1.0
+chr3	61677	0.0	2.0	2.0
+chr3	61680	1.0	0.0	1.0
+chr3	61684	0.0	6.0	6.0
+chr3	61702	1.0	0.0	1.0
+chr3	61822	0.0	1.0	1.0
+chr3	61823	1.0	0.0	1.0
+chr3	61825	1.0	0.0	1.0
+chr3	61835	1.0	0.0	1.0
+chr3	61843	0.0	1.0	1.0
+chr3	61846	1.0	0.0	1.0
+chr3	61932	0.0	1.0	1.0
+chr3	61943	0.0	1.0	1.0
+chr3	61984	0.0	1.0	1.0
+chr3	62006	2.0	0.0	2.0
+chr3	62009	1.0	0.0	1.0
+chr3	62169	1.0	0.0	1.0
+chr3	62185	1.0	0.0	1.0
+chr3	62342	0.0	1.0	1.0
+chr3	62359	0.0	1.0	1.0
+chr3	62517	0.0	1.0	1.0
+chr3	62585	0.0	1.0	1.0
+chr3	62840	2.0	0.0	2.0
+chr3	62841	1.0	0.0	1.0
+chr3	62842	1.0	0.0	1.0
+chr3	62851	1.0	1.0	2.0
+chr3	62857	1.0	0.0	1.0
+chr3	62868	0.0	1.0	1.0
+chr3	62870	1.0	0.0	1.0
+chr3	62893	1.0	0.0	1.0
+chr3	62913	1.0	0.0	1.0
+chr3	63026	0.0	1.0	1.0
+chr3	63037	0.0	3.0	3.0
+chr3	63046	1.0	0.0	1.0
+chr3	63051	1.0	0.0	1.0
+chr3	63053	1.0	0.0	1.0
+chr3	63058	0.0	1.0	1.0
+chr3	63061	0.0	2.0	2.0
+chr3	63062	1.0	0.0	1.0
+chr3	63085	0.0	2.0	2.0
+chr3	63088	0.0	1.0	1.0
+chr3	63100	1.0	0.0	1.0
+chr3	63105	0.0	1.0	1.0
+chr3	63107	0.0	1.0	1.0
+chr3	63175	0.0	1.0	1.0
+chr3	63176	1.0	0.0	1.0
+chr3	63185	1.0	0.0	1.0
+chr3	63186	1.0	0.0	1.0
+chr3	63187	0.0	1.0	1.0
+chr3	63192	1.0	0.0	1.0
+chr3	63199	1.0	0.0	1.0
+chr3	63203	0.0	1.0	1.0
+chr3	63204	0.0	1.0	1.0
+chr3	63208	1.0	1.0	2.0
+chr3	63214	0.0	1.0	1.0
+chr3	63216	5.0	1.0	6.0
+chr3	63222	1.0	0.0	1.0
+chr3	63226	1.0	0.0	1.0
+chr3	63227	0.0	2.0	2.0
+chr3	63228	0.0	1.0	1.0
+chr3	63232	2.0	0.0	2.0
+chr3	63234	0.0	1.0	1.0
+chr3	63235	0.0	8.0	8.0
+chr3	63237	0.0	3.0	3.0
+chr3	63242	1.0	0.0	1.0
+chr3	63244	1.0	0.0	1.0
+chr3	63257	1.0	1.0	2.0
+chr3	63259	1.0	0.0	1.0
+chr3	63260	0.0	2.0	2.0
+chr3	63262	2.0	0.0	2.0
+chr3	63309	1.0	0.0	1.0
+chr3	63417	1.0	0.0	1.0
+chr3	63422	1.0	0.0	1.0
+chr3	63437	0.0	1.0	1.0
+chr3	63438	1.0	0.0	1.0
+chr3	63439	1.0	4.0	5.0
+chr3	63440	0.0	1.0	1.0
+chr3	63441	1.0	1.0	2.0
+chr3	63449	2.0	1.0	3.0
+chr3	63450	1.0	1.0	2.0
+chr3	63451	0.0	1.0	1.0
+chr3	63453	2.0	0.0	2.0
+chr3	63454	3.0	0.0	3.0
+chr3	63456	1.0	0.0	1.0
+chr3	63461	3.0	0.0	3.0
+chr3	63468	1.0	1.0	2.0
+chr3	63473	0.0	1.0	1.0
+chr3	63476	0.0	1.0	1.0
+chr3	63477	0.0	2.0	2.0
+chr3	63478	0.0	1.0	1.0
+chr3	63479	2.0	0.0	2.0
+chr3	63480	0.0	4.0	4.0
+chr3	63481	0.0	3.0	3.0
+chr3	63484	0.0	1.0	1.0
+chr3	63495	3.0	0.0	3.0
+chr3	63503	1.0	0.0	1.0
+chr3	63504	1.0	0.0	1.0
+chr3	63510	1.0	0.0	1.0
+chr3	63532	0.0	2.0	2.0
+chr3	63600	1.0	0.0	1.0
+chr3	63611	0.0	2.0	2.0
+chr3	63621	0.0	1.0	1.0
+chr3	63630	1.0	0.0	1.0
+chr3	63632	1.0	0.0	1.0
+chr3	63637	0.0	1.0	1.0
+chr3	63656	0.0	1.0	1.0
+chr3	63791	1.0	0.0	1.0
+chr3	63912	0.0	2.0	2.0
+chr3	63969	0.0	1.0	1.0
+chr3	64138	0.0	1.0	1.0
+chr3	64293	1.0	0.0	1.0
+chr3	64460	1.0	0.0	1.0
+chr3	64536	1.0	0.0	1.0
+chr3	65056	0.0	1.0	1.0
+chr3	65212	0.0	1.0	1.0
+chr3	65218	0.0	1.0	1.0
+chr3	65378	3.0	0.0	3.0
+chr3	65382	1.0	0.0	1.0
+chr3	65389	0.0	2.0	2.0
+chr3	65525	1.0	0.0	1.0
+chr3	65533	1.0	0.0	1.0
+chr3	65537	1.0	0.0	1.0
+chr3	65538	3.0	0.0	3.0
+chr3	65542	1.0	0.0	1.0
+chr3	65543	1.0	0.0	1.0
+chr3	65546	6.0	1.0	7.0
+chr3	65547	0.0	1.0	1.0
+chr3	65548	0.0	1.0	1.0
+chr3	65550	1.0	0.0	1.0
+chr3	65553	2.0	0.0	2.0
+chr3	65556	0.0	1.0	1.0
+chr3	65560	1.0	1.0	2.0
+chr3	65561	0.0	2.0	2.0
+chr3	65564	1.0	0.0	1.0
+chr3	65566	0.0	1.0	1.0
+chr3	65567	2.0	0.0	2.0
+chr3	65572	0.0	1.0	1.0
+chr3	65586	1.0	0.0	1.0
+chr3	65611	1.0	0.0	1.0
+chr3	65997	1.0	0.0	1.0
+chr3	66005	0.0	3.0	3.0
+chr3	66039	1.0	0.0	1.0
+chr3	66097	1.0	0.0	1.0
+chr3	66172	1.0	0.0	1.0
+chr3	66184	0.0	1.0	1.0
+chr3	66185	0.0	1.0	1.0
+chr3	66191	0.0	1.0	1.0
+chr3	66318	0.0	1.0	1.0
+chr3	66344	1.0	0.0	1.0
+chr3	66587	0.0	2.0	2.0
+chr3	66692	0.0	1.0	1.0
+chr3	66695	0.0	1.0	1.0
+chr3	66805	1.0	0.0	1.0
+chr3	66878	1.0	0.0	1.0
+chr3	66900	0.0	1.0	1.0
+chr3	66947	0.0	1.0	1.0
+chr3	66974	1.0	0.0	1.0
+chr3	66978	1.0	0.0	1.0
+chr3	67151	0.0	1.0	1.0
+chr3	67209	2.0	0.0	2.0
+chr3	67232	0.0	1.0	1.0
+chr3	67400	0.0	1.0	1.0
+chr3	67505	1.0	0.0	1.0
+chr3	67523	1.0	0.0	1.0
+chr3	67547	0.0	1.0	1.0
+chr3	67556	1.0	0.0	1.0
+chr3	67850	0.0	1.0	1.0
+chr3	67871	1.0	0.0	1.0
+chr3	67878	0.0	1.0	1.0
+chr3	67880	0.0	1.0	1.0
+chr3	68028	1.0	0.0	1.0
+chr3	68045	1.0	0.0	1.0
+chr3	68053	0.0	1.0	1.0
+chr3	68076	1.0	0.0	1.0
+chr3	68177	3.0	0.0	3.0
+chr3	68202	1.0	0.0	1.0
+chr3	68208	0.0	1.0	1.0
+chr3	68212	0.0	3.0	3.0
+chr3	68218	0.0	1.0	1.0
+chr3	68219	1.0	1.0	2.0
+chr3	68220	1.0	0.0	1.0
+chr3	68228	1.0	0.0	1.0
+chr3	68231	0.0	1.0	1.0
+chr3	68234	0.0	1.0	1.0
+chr3	68235	0.0	1.0	1.0
+chr3	68243	0.0	1.0	1.0
+chr3	68254	0.0	1.0	1.0
+chr3	68256	1.0	0.0	1.0
+chr3	68273	1.0	0.0	1.0
+chr3	68294	1.0	0.0	1.0
+chr3	68367	1.0	0.0	1.0
+chr3	68639	2.0	0.0	2.0
+chr3	68651	0.0	1.0	1.0
+chr3	68673	0.0	1.0	1.0
+chr3	68675	0.0	1.0	1.0
+chr3	68698	1.0	0.0	1.0
+chr3	68917	0.0	1.0	1.0
+chr3	68934	0.0	1.0	1.0
+chr3	68955	0.0	1.0	1.0
+chr3	68958	0.0	1.0	1.0
+chr3	68986	1.0	0.0	1.0
+chr3	69085	0.0	1.0	1.0
+chr3	69097	0.0	1.0	1.0
+chr3	69122	0.0	1.0	1.0
+chr3	69242	0.0	1.0	1.0
+chr3	69411	0.0	1.0	1.0
+chr3	69562	0.0	1.0	1.0
+chr3	69563	0.0	1.0	1.0
+chr3	69568	1.0	0.0	1.0
+chr3	69717	0.0	1.0	1.0
+chr3	69744	0.0	1.0	1.0
+chr3	69756	0.0	1.0	1.0
+chr3	69768	0.0	1.0	1.0
+chr3	69773	1.0	0.0	1.0
+chr3	69813	0.0	1.0	1.0
+chr3	69863	0.0	1.0	1.0
+chr3	69877	0.0	1.0	1.0
+chr3	69882	1.0	0.0	1.0
+chr3	69896	6.0	0.0	6.0
+chr3	69903	0.0	1.0	1.0
+chr3	69904	2.0	0.0	2.0
+chr3	69907	1.0	0.0	1.0
+chr3	69912	0.0	2.0	2.0
+chr3	69914	2.0	0.0	2.0
+chr3	69916	0.0	1.0	1.0
+chr3	69918	0.0	1.0	1.0
+chr3	69922	0.0	5.0	5.0
+chr3	69927	0.0	2.0	2.0
+chr3	69928	3.0	1.0	4.0
+chr3	69933	2.0	0.0	2.0
+chr3	69934	0.0	1.0	1.0
+chr3	69938	0.0	3.0	3.0
+chr3	69944	0.0	2.0	2.0
+chr3	69952	0.0	1.0	1.0
+chr3	69955	0.0	1.0	1.0
+chr3	69957	1.0	1.0	2.0
+chr3	69969	1.0	0.0	1.0
+chr3	69986	1.0	0.0	1.0
+chr3	69997	1.0	0.0	1.0
+chr3	70000	1.0	0.0	1.0
+chr3	70002	1.0	0.0	1.0
+chr3	70131	1.0	0.0	1.0
+chr3	70132	1.0	0.0	1.0
+chr3	70138	1.0	0.0	1.0
+chr3	70141	1.0	0.0	1.0
+chr3	70151	1.0	0.0	1.0
+chr3	70152	1.0	0.0	1.0
+chr3	70154	0.0	1.0	1.0
+chr3	70155	1.0	0.0	1.0
+chr3	70157	1.0	1.0	2.0
+chr3	70161	4.0	0.0	4.0
+chr3	70162	4.0	0.0	4.0
+chr3	70163	0.0	1.0	1.0
+chr3	70165	3.0	0.0	3.0
+chr3	70166	0.0	2.0	2.0
+chr3	70168	1.0	3.0	4.0
+chr3	70169	0.0	1.0	1.0
+chr3	70177	2.0	0.0	2.0
+chr3	70179	0.0	3.0	3.0
+chr3	70180	1.0	0.0	1.0
+chr3	70190	1.0	0.0	1.0
+chr3	70193	1.0	0.0	1.0
+chr3	70196	0.0	1.0	1.0
+chr3	70209	2.0	0.0	2.0
+chr3	70210	0.0	1.0	1.0
+chr3	70216	2.0	0.0	2.0
+chr3	70224	1.0	0.0	1.0
+chr3	70295	0.0	1.0	1.0
+chr3	70323	0.0	1.0	1.0
+chr3	70326	1.0	1.0	2.0
+chr3	70327	2.0	0.0	2.0
+chr3	70331	0.0	1.0	1.0
+chr3	70339	0.0	3.0	3.0
+chr3	70345	0.0	1.0	1.0
+chr3	70482	1.0	0.0	1.0
+chr3	70500	0.0	1.0	1.0
+chr3	70507	0.0	1.0	1.0
+chr3	70534	0.0	1.0	1.0
+chr3	70644	0.0	1.0	1.0
+chr3	70678	1.0	0.0	1.0
+chr3	70696	0.0	1.0	1.0
+chr3	70812	1.0	0.0	1.0
+chr3	70893	0.0	1.0	1.0
+chr3	70936	0.0	1.0	1.0
+chr3	70959	2.0	0.0	2.0
+chr3	70998	0.0	1.0	1.0
+chr3	71072	0.0	1.0	1.0
+chr3	71075	1.0	0.0	1.0
+chr3	71090	1.0	0.0	1.0
+chr3	71112	1.0	0.0	1.0
+chr3	71132	0.0	1.0	1.0
+chr3	71263	0.0	1.0	1.0
+chr3	71266	0.0	1.0	1.0
+chr3	71274	1.0	0.0	1.0
+chr3	71305	1.0	0.0	1.0
+chr3	71333	1.0	0.0	1.0
+chr3	71422	1.0	0.0	1.0
+chr3	71448	1.0	0.0	1.0
+chr3	71480	0.0	1.0	1.0
+chr3	71486	0.0	1.0	1.0
+chr3	71670	0.0	1.0	1.0
+chr3	71703	1.0	0.0	1.0
+chr3	71721	0.0	1.0	1.0
+chr3	71738	0.0	1.0	1.0
+chr3	71742	0.0	1.0	1.0
+chr3	71783	0.0	1.0	1.0
+chr3	71797	0.0	1.0	1.0
+chr3	71842	0.0	1.0	1.0
+chr3	71877	1.0	0.0	1.0
+chr3	71888	0.0	2.0	2.0
+chr3	71891	3.0	0.0	3.0
+chr3	71892	4.0	0.0	4.0
+chr3	71898	0.0	2.0	2.0
+chr3	71900	0.0	1.0	1.0
+chr3	71906	1.0	0.0	1.0
+chr3	71915	1.0	0.0	1.0
+chr3	71916	1.0	0.0	1.0
+chr3	71920	1.0	0.0	1.0
+chr3	71937	0.0	1.0	1.0
+chr3	72008	0.0	2.0	2.0
+chr3	72076	1.0	0.0	1.0
+chr3	72125	0.0	1.0	1.0
+chr3	72377	1.0	0.0	1.0
+chr3	72400	0.0	1.0	1.0
+chr3	72450	0.0	1.0	1.0
+chr3	72493	0.0	1.0	1.0
+chr3	72563	0.0	2.0	2.0
+chr3	72650	1.0	0.0	1.0
+chr3	72781	0.0	1.0	1.0
+chr3	72798	1.0	0.0	1.0
+chr3	72833	1.0	0.0	1.0
+chr3	72928	3.0	0.0	3.0
+chr3	72948	0.0	1.0	1.0
+chr3	72977	1.0	0.0	1.0
+chr3	73072	1.0	0.0	1.0
+chr3	73121	1.0	0.0	1.0
+chr3	73159	0.0	1.0	1.0
+chr3	73165	2.0	0.0	2.0
+chr3	73184	0.0	1.0	1.0
+chr3	73208	1.0	0.0	1.0
+chr3	73246	0.0	1.0	1.0
+chr3	73334	0.0	1.0	1.0
+chr3	73504	0.0	1.0	1.0
+chr3	73646	1.0	0.0	1.0
+chr3	73674	1.0	0.0	1.0
+chr3	73688	0.0	1.0	1.0
+chr3	73689	0.0	2.0	2.0
+chr3	73691	1.0	0.0	1.0
+chr3	73699	0.0	1.0	1.0
+chr3	73711	1.0	0.0	1.0
+chr3	73718	1.0	0.0	1.0
+chr3	73731	0.0	1.0	1.0
+chr3	73742	0.0	1.0	1.0
+chr3	73755	1.0	0.0	1.0
+chr3	73839	0.0	1.0	1.0
+chr3	73845	0.0	1.0	1.0
+chr3	73847	2.0	0.0	2.0
+chr3	73851	1.0	0.0	1.0
+chr3	73857	1.0	0.0	1.0
+chr3	73861	0.0	1.0	1.0
+chr3	73868	0.0	2.0	2.0
+chr3	73869	0.0	1.0	1.0
+chr3	73870	1.0	0.0	1.0
+chr3	73872	1.0	0.0	1.0
+chr3	73878	1.0	0.0	1.0
+chr3	73880	0.0	1.0	1.0
+chr3	73892	2.0	0.0	2.0
+chr3	73895	1.0	0.0	1.0
+chr3	73903	1.0	0.0	1.0
+chr3	73907	1.0	0.0	1.0
+chr3	73916	0.0	1.0	1.0
+chr3	73919	1.0	0.0	1.0
+chr3	73936	0.0	1.0	1.0
+chr3	74008	0.0	1.0	1.0
+chr3	74012	1.0	0.0	1.0
+chr3	74015	1.0	0.0	1.0
+chr3	74024	1.0	0.0	1.0
+chr3	74032	0.0	1.0	1.0
+chr3	74035	1.0	0.0	1.0
+chr3	74038	0.0	4.0	4.0
+chr3	74042	4.0	0.0	4.0
+chr3	74045	1.0	0.0	1.0
+chr3	74052	0.0	1.0	1.0
+chr3	74081	2.0	0.0	2.0
+chr3	74083	0.0	2.0	2.0
+chr3	74089	0.0	1.0	1.0
+chr3	74114	1.0	0.0	1.0
+chr3	74127	1.0	0.0	1.0
+chr3	74237	1.0	0.0	1.0
+chr3	74257	3.0	0.0	3.0
+chr3	74279	0.0	1.0	1.0
+chr3	74282	0.0	1.0	1.0
+chr3	74287	0.0	1.0	1.0
+chr3	74290	0.0	1.0	1.0
+chr3	74292	0.0	1.0	1.0
+chr3	74295	1.0	0.0	1.0
+chr3	74300	0.0	3.0	3.0
+chr3	74302	1.0	0.0	1.0
+chr3	74303	1.0	0.0	1.0
+chr3	74309	0.0	2.0	2.0
+chr3	74312	0.0	1.0	1.0
+chr3	74313	1.0	2.0	3.0
+chr3	74319	0.0	1.0	1.0
+chr3	74323	0.0	1.0	1.0
+chr3	74325	1.0	0.0	1.0
+chr3	74329	1.0	0.0	1.0
+chr3	74338	0.0	2.0	2.0
+chr3	74340	1.0	0.0	1.0
+chr3	74343	1.0	0.0	1.0
+chr3	74429	2.0	0.0	2.0
+chr3	74430	0.0	1.0	1.0
+chr3	74434	1.0	1.0	2.0
+chr3	74442	0.0	1.0	1.0
+chr3	74448	0.0	1.0	1.0
+chr3	74449	1.0	0.0	1.0
+chr3	74450	2.0	0.0	2.0
+chr3	74456	1.0	0.0	1.0
+chr3	74460	1.0	0.0	1.0
+chr3	74473	1.0	0.0	1.0
+chr3	74478	1.0	0.0	1.0
+chr3	74642	1.0	0.0	1.0
+chr3	74647	0.0	1.0	1.0
+chr3	74671	1.0	0.0	1.0
+chr3	74681	1.0	0.0	1.0
+chr3	74685	0.0	1.0	1.0
+chr3	74691	1.0	0.0	1.0
+chr3	74694	2.0	0.0	2.0
+chr3	74697	1.0	2.0	3.0
+chr3	74698	0.0	1.0	1.0
+chr3	74699	1.0	0.0	1.0
+chr3	74704	0.0	2.0	2.0
+chr3	74705	0.0	1.0	1.0
+chr3	74706	1.0	0.0	1.0
+chr3	74761	0.0	1.0	1.0
+chr3	74808	1.0	0.0	1.0
+chr3	74809	1.0	0.0	1.0
+chr3	74817	1.0	1.0	2.0
+chr3	74820	1.0	0.0	1.0
+chr3	74821	0.0	1.0	1.0
+chr3	74853	2.0	0.0	2.0
+chr3	74856	0.0	1.0	1.0
+chr3	74859	0.0	1.0	1.0
+chr3	74863	0.0	1.0	1.0
+chr3	74874	1.0	0.0	1.0
+chr3	74875	0.0	1.0	1.0
+chr3	74876	1.0	0.0	1.0
+chr3	74880	1.0	0.0	1.0
+chr3	74883	0.0	2.0	2.0
+chr3	74884	0.0	1.0	1.0
+chr3	74886	1.0	0.0	1.0
+chr3	74898	0.0	1.0	1.0
+chr3	74924	1.0	0.0	1.0
+chr3	75021	1.0	0.0	1.0
+chr3	75031	1.0	0.0	1.0
+chr3	75060	1.0	0.0	1.0
+chr3	75063	0.0	1.0	1.0
+chr3	75093	0.0	1.0	1.0
+chr3	75179	0.0	1.0	1.0
+chr3	75187	0.0	1.0	1.0
+chr3	75192	1.0	0.0	1.0
+chr3	75207	0.0	1.0	1.0
+chr3	75212	0.0	1.0	1.0
+chr3	75328	1.0	0.0	1.0
+chr3	75362	0.0	1.0	1.0
+chr3	75363	1.0	0.0	1.0
+chr3	75367	0.0	1.0	1.0
+chr3	75377	1.0	0.0	1.0
+chr3	75383	0.0	1.0	1.0
+chr3	75385	1.0	0.0	1.0
+chr3	75386	0.0	1.0	1.0
+chr3	75395	4.0	0.0	4.0
+chr3	75404	0.0	1.0	1.0
+chr3	75405	2.0	0.0	2.0
+chr3	75412	1.0	0.0	1.0
+chr3	75572	1.0	0.0	1.0
+chr3	75581	0.0	1.0	1.0
+chr3	75596	0.0	1.0	1.0
+chr3	75605	1.0	0.0	1.0
+chr3	75606	1.0	0.0	1.0
+chr3	75628	3.0	0.0	3.0
+chr3	75631	1.0	0.0	1.0
+chr3	75637	0.0	1.0	1.0
+chr3	75719	0.0	2.0	2.0
+chr3	75741	0.0	1.0	1.0
+chr3	75745	0.0	1.0	1.0
+chr3	75749	0.0	1.0	1.0
+chr3	75756	0.0	3.0	3.0
+chr3	75758	0.0	8.0	8.0
+chr3	75760	1.0	1.0	2.0
+chr3	75762	0.0	1.0	1.0
+chr3	75763	0.0	1.0	1.0
+chr3	75767	1.0	0.0	1.0
+chr3	75773	0.0	1.0	1.0
+chr3	75774	5.0	2.0	7.0
+chr3	75775	3.0	0.0	3.0
+chr3	75776	5.0	1.0	6.0
+chr3	75781	1.0	0.0	1.0
+chr3	75784	2.0	0.0	2.0
+chr3	75796	0.0	1.0	1.0
+chr3	75807	0.0	1.0	1.0
+chr3	75808	0.0	2.0	2.0
+chr3	75845	0.0	1.0	1.0
+chr3	75857	1.0	0.0	1.0
+chr3	76037	3.0	0.0	3.0
+chr3	76039	0.0	1.0	1.0
+chr3	76042	1.0	0.0	1.0
+chr3	76087	0.0	1.0	1.0
+chr3	76224	0.0	1.0	1.0
+chr3	76592	0.0	1.0	1.0
+chr3	76604	0.0	1.0	1.0
+chr3	76708	0.0	1.0	1.0
+chr3	76758	0.0	1.0	1.0
+chr3	77008	1.0	1.0	2.0
+chr3	77042	2.0	0.0	2.0
+chr3	77175	0.0	1.0	1.0
+chr3	77206	1.0	0.0	1.0
+chr3	77311	0.0	1.0	1.0
+chr3	77343	1.0	0.0	1.0
+chr3	77378	1.0	0.0	1.0
+chr3	77491	2.0	0.0	2.0
+chr3	77492	0.0	1.0	1.0
+chr3	77503	1.0	0.0	1.0
+chr3	77504	1.0	0.0	1.0
+chr3	77507	1.0	0.0	1.0
+chr3	77509	0.0	1.0	1.0
+chr3	77512	0.0	3.0	3.0
+chr3	77513	0.0	1.0	1.0
+chr3	77514	1.0	0.0	1.0
+chr3	77516	2.0	0.0	2.0
+chr3	77520	0.0	1.0	1.0
+chr3	77522	0.0	1.0	1.0
+chr3	77528	1.0	0.0	1.0
+chr3	77532	1.0	0.0	1.0
+chr3	77551	0.0	2.0	2.0
+chr3	77582	0.0	1.0	1.0
+chr3	77583	1.0	0.0	1.0
+chr3	77601	0.0	1.0	1.0
+chr3	77644	1.0	0.0	1.0
+chr3	77711	1.0	0.0	1.0
+chr3	77747	0.0	1.0	1.0
+chr3	77764	1.0	0.0	1.0
+chr3	77784	0.0	2.0	2.0
+chr3	77793	1.0	0.0	1.0
+chr3	77841	1.0	0.0	1.0
+chr3	77845	0.0	2.0	2.0
+chr3	77970	0.0	1.0	1.0
+chr3	78059	1.0	0.0	1.0
+chr3	78852	1.0	0.0	1.0
+chr3	78853	1.0	0.0	1.0
+chr3	79050	1.0	0.0	1.0
+chr3	79068	0.0	1.0	1.0
+chr3	79086	0.0	1.0	1.0
+chr3	79101	0.0	1.0	1.0
+chr3	79107	1.0	0.0	1.0
+chr3	79114	0.0	3.0	3.0
+chr3	79124	4.0	8.0	12.0
+chr3	79125	2.0	0.0	2.0
+chr3	79129	3.0	0.0	3.0
+chr3	79132	1.0	0.0	1.0
+chr3	79134	0.0	1.0	1.0
+chr3	79136	0.0	2.0	2.0
+chr3	79139	1.0	4.0	5.0
+chr3	79140	4.0	1.0	5.0
+chr3	79147	1.0	0.0	1.0
+chr3	79149	0.0	1.0	1.0
+chr3	79151	0.0	1.0	1.0
+chr3	79272	1.0	0.0	1.0
+chr3	79302	0.0	1.0	1.0
+chr3	79314	1.0	0.0	1.0
+chr3	79318	0.0	2.0	2.0
+chr3	79345	1.0	0.0	1.0
+chr3	79476	0.0	1.0	1.0
+chr3	79497	1.0	0.0	1.0
+chr3	79605	1.0	0.0	1.0
+chr3	79634	1.0	0.0	1.0
+chr3	79655	1.0	0.0	1.0
+chr3	79660	0.0	1.0	1.0
+chr3	79783	0.0	1.0	1.0
+chr3	79949	0.0	1.0	1.0
+chr3	80008	0.0	1.0	1.0
+chr3	80075	1.0	0.0	1.0
+chr3	80104	0.0	1.0	1.0
+chr3	80152	0.0	1.0	1.0
+chr3	80157	1.0	0.0	1.0
+chr3	80432	0.0	1.0	1.0
+chr3	80453	1.0	0.0	1.0
+chr3	80767	0.0	2.0	2.0
+chr3	80999	0.0	1.0	1.0
+chr3	81023	0.0	1.0	1.0
+chr3	81042	0.0	1.0	1.0
+chr3	81160	1.0	0.0	1.0
+chr3	81167	0.0	1.0	1.0
+chr3	81327	1.0	0.0	1.0
+chr3	81407	0.0	1.0	1.0
+chr3	81436	1.0	0.0	1.0
+chr3	81510	0.0	1.0	1.0
+chr3	81597	2.0	0.0	2.0
+chr3	81682	0.0	1.0	1.0
+chr3	81684	1.0	0.0	1.0
+chr3	81825	0.0	1.0	1.0
+chr3	81836	0.0	1.0	1.0
+chr3	81861	0.0	1.0	1.0
+chr3	81928	0.0	2.0	2.0
+chr3	81985	0.0	1.0	1.0
+chr3	82109	0.0	1.0	1.0
+chr3	82297	1.0	0.0	1.0
+chr3	82721	0.0	1.0	1.0
+chr3	82724	0.0	1.0	1.0
+chr3	82725	0.0	1.0	1.0
+chr3	82729	0.0	2.0	2.0
+chr3	82749	0.0	2.0	2.0
+chr3	82759	0.0	1.0	1.0
+chr3	82760	0.0	2.0	2.0
+chr3	82761	0.0	1.0	1.0
+chr3	82764	0.0	3.0	3.0
+chr3	82765	0.0	6.0	6.0
+chr3	82773	5.0	0.0	5.0
+chr3	82776	1.0	1.0	2.0
+chr3	82777	0.0	1.0	1.0
+chr3	82779	0.0	2.0	2.0
+chr3	82780	0.0	1.0	1.0
+chr3	82783	0.0	5.0	5.0
+chr3	82787	1.0	0.0	1.0
+chr3	82794	1.0	0.0	1.0
+chr3	82797	1.0	0.0	1.0
+chr3	82799	0.0	1.0	1.0
+chr3	82801	0.0	1.0	1.0
+chr3	82807	1.0	0.0	1.0
+chr3	82817	1.0	0.0	1.0
+chr3	82819	1.0	0.0	1.0
+chr3	82827	1.0	2.0	3.0
+chr3	82828	0.0	1.0	1.0
+chr3	82829	2.0	1.0	3.0
+chr3	82835	1.0	2.0	3.0
+chr3	82836	1.0	0.0	1.0
+chr3	82850	0.0	1.0	1.0
+chr3	82856	0.0	1.0	1.0
+chr3	82857	0.0	2.0	2.0
+chr3	82861	0.0	2.0	2.0
+chr3	82862	0.0	1.0	1.0
+chr3	82863	1.0	0.0	1.0
+chr3	82883	0.0	3.0	3.0
+chr3	82884	1.0	0.0	1.0
+chr3	82885	0.0	1.0	1.0
+chr3	82894	0.0	1.0	1.0
+chr3	82895	0.0	1.0	1.0
+chr3	82896	0.0	1.0	1.0
+chr3	82907	0.0	1.0	1.0
+chr3	82913	0.0	1.0	1.0
+chr3	82934	1.0	0.0	1.0
+chr3	82940	0.0	1.0	1.0
+chr3	82943	1.0	1.0	2.0
+chr3	82944	1.0	0.0	1.0
+chr3	82945	3.0	1.0	4.0
+chr3	82951	0.0	2.0	2.0
+chr3	82953	2.0	0.0	2.0
+chr3	82956	0.0	5.0	5.0
+chr3	82959	1.0	0.0	1.0
+chr3	82961	1.0	0.0	1.0
+chr3	82963	0.0	1.0	1.0
+chr3	82964	0.0	4.0	4.0
+chr3	82965	1.0	0.0	1.0
+chr3	82969	1.0	0.0	1.0
+chr3	82971	1.0	0.0	1.0
+chr3	82973	1.0	0.0	1.0
+chr3	82974	1.0	0.0	1.0
+chr3	82975	1.0	0.0	1.0
+chr3	82977	1.0	0.0	1.0
+chr3	82978	1.0	0.0	1.0
+chr3	82982	1.0	0.0	1.0
+chr3	82985	1.0	0.0	1.0
+chr3	82986	17.0	0.0	17.0
+chr3	82987	5.0	0.0	5.0
+chr3	82989	1.0	0.0	1.0
+chr3	82990	3.0	0.0	3.0
+chr3	82992	1.0	0.0	1.0
+chr3	82995	1.0	0.0	1.0
+chr3	82996	2.0	0.0	2.0
+chr3	82999	1.0	0.0	1.0
+chr3	83000	3.0	0.0	3.0
+chr3	83003	1.0	0.0	1.0
+chr3	83004	1.0	0.0	1.0
+chr3	83010	1.0	0.0	1.0
+chr3	83011	2.0	0.0	2.0
+chr3	83012	1.0	0.0	1.0
+chr3	83016	2.0	0.0	2.0
+chr3	83076	0.0	2.0	2.0
+chr3	83079	0.0	3.0	3.0
+chr3	83088	0.0	1.0	1.0
+chr3	83089	0.0	1.0	1.0
+chr3	83092	0.0	2.0	2.0
+chr3	83093	0.0	1.0	1.0
+chr3	83096	0.0	1.0	1.0
+chr3	83102	0.0	3.0	3.0
+chr3	83103	0.0	1.0	1.0
+chr3	83104	0.0	14.0	14.0
+chr3	83117	0.0	2.0	2.0
+chr3	83127	1.0	0.0	1.0
+chr3	83128	1.0	0.0	1.0
+chr3	83135	5.0	0.0	5.0
+chr3	83140	2.0	0.0	2.0
+chr3	83148	1.0	0.0	1.0
+chr3	83275	1.0	0.0	1.0
+chr3	83466	1.0	0.0	1.0
+chr3	83480	0.0	1.0	1.0
+chr3	83498	1.0	0.0	1.0
+chr3	83540	0.0	1.0	1.0
+chr3	83585	0.0	1.0	1.0
+chr3	83607	1.0	0.0	1.0
+chr3	83619	1.0	0.0	1.0
+chr3	83637	0.0	1.0	1.0
+chr3	83639	2.0	0.0	2.0
+chr3	83652	1.0	0.0	1.0
+chr3	83668	1.0	0.0	1.0
+chr3	83695	0.0	1.0	1.0
+chr3	83701	1.0	0.0	1.0
+chr3	83808	1.0	0.0	1.0
+chr3	83818	1.0	0.0	1.0
+chr3	83836	1.0	0.0	1.0
+chr3	83837	2.0	0.0	2.0
+chr3	83838	0.0	2.0	2.0
+chr3	83840	0.0	1.0	1.0
+chr3	83841	0.0	2.0	2.0
+chr3	83981	0.0	1.0	1.0
+chr3	83983	0.0	2.0	2.0
+chr3	83987	0.0	1.0	1.0
+chr3	83994	1.0	0.0	1.0
+chr3	84090	0.0	1.0	1.0
+chr3	84093	0.0	1.0	1.0
+chr3	84094	0.0	1.0	1.0
+chr3	84098	0.0	2.0	2.0
+chr3	84118	0.0	1.0	1.0
+chr3	84128	0.0	1.0	1.0
+chr3	84129	0.0	1.0	1.0
+chr3	84130	0.0	1.0	1.0
+chr3	84133	0.0	1.0	1.0
+chr3	84134	0.0	5.0	5.0
+chr3	84141	3.0	0.0	3.0
+chr3	84142	4.0	0.0	4.0
+chr3	84144	0.0	1.0	1.0
+chr3	84145	1.0	1.0	2.0
+chr3	84146	0.0	1.0	1.0
+chr3	84148	0.0	2.0	2.0
+chr3	84149	0.0	1.0	1.0
+chr3	84152	0.0	5.0	5.0
+chr3	84156	1.0	0.0	1.0
+chr3	84163	1.0	0.0	1.0
+chr3	84166	1.0	0.0	1.0
+chr3	84175	0.0	1.0	1.0
+chr3	84176	1.0	0.0	1.0
+chr3	84178	0.0	1.0	1.0
+chr3	84183	1.0	0.0	1.0
+chr3	84187	0.0	1.0	1.0
+chr3	84188	1.0	0.0	1.0
+chr3	84190	0.0	1.0	1.0
+chr3	84191	0.0	1.0	1.0
+chr3	84196	1.0	0.0	1.0
+chr3	84198	1.0	0.0	1.0
+chr3	84204	1.0	0.0	1.0
+chr3	84205	1.0	0.0	1.0
+chr3	84209	0.0	1.0	1.0
+chr3	84238	2.0	0.0	2.0
+chr3	84316	0.0	1.0	1.0
+chr3	84319	0.0	1.0	1.0
+chr3	84320	0.0	1.0	1.0
+chr3	84324	0.0	2.0	2.0
+chr3	84344	0.0	1.0	1.0
+chr3	84354	0.0	1.0	1.0
+chr3	84355	0.0	2.0	2.0
+chr3	84356	0.0	1.0	1.0
+chr3	84359	0.0	3.0	3.0
+chr3	84360	0.0	6.0	6.0
+chr3	84367	1.0	0.0	1.0
+chr3	84368	5.0	0.0	5.0
+chr3	84371	1.0	1.0	2.0
+chr3	84372	0.0	1.0	1.0
+chr3	84374	0.0	2.0	2.0
+chr3	84375	0.0	1.0	1.0
+chr3	84378	0.0	5.0	5.0
+chr3	84382	1.0	0.0	1.0
+chr3	84389	1.0	0.0	1.0
+chr3	84392	1.0	0.0	1.0
+chr3	84401	0.0	1.0	1.0
+chr3	84402	1.0	0.0	1.0
+chr3	84404	0.0	1.0	1.0
+chr3	84409	1.0	0.0	1.0
+chr3	84413	0.0	1.0	1.0
+chr3	84414	1.0	0.0	1.0
+chr3	84416	0.0	1.0	1.0
+chr3	84417	0.0	1.0	1.0
+chr3	84422	1.0	0.0	1.0
+chr3	84424	2.0	0.0	2.0
+chr3	84430	1.0	0.0	1.0
+chr3	84431	1.0	0.0	1.0
+chr3	84435	0.0	1.0	1.0
+chr3	84464	2.0	0.0	2.0
+chr3	84478	1.0	0.0	1.0
+chr3	84491	0.0	1.0	1.0
+chr3	84513	1.0	0.0	1.0
+chr3	84523	0.0	1.0	1.0
+chr3	84530	0.0	1.0	1.0
+chr3	84539	0.0	2.0	2.0
+chr3	84548	0.0	1.0	1.0
+chr3	84553	0.0	1.0	1.0
+chr3	84558	2.0	0.0	2.0
+chr3	84565	2.0	0.0	2.0
+chr3	84569	3.0	0.0	3.0
+chr3	84572	1.0	0.0	1.0
+chr3	84573	1.0	0.0	1.0
+chr3	84575	3.0	0.0	3.0
+chr3	84577	5.0	0.0	5.0
+chr3	84578	9.0	0.0	9.0
+chr3	84579	1.0	1.0	2.0
+chr3	84580	1.0	0.0	1.0
+chr3	84581	1.0	0.0	1.0
+chr3	84582	1.0	0.0	1.0
+chr3	84591	1.0	0.0	1.0
+chr3	84597	1.0	0.0	1.0
+chr3	84602	1.0	0.0	1.0
+chr3	84682	0.0	1.0	1.0
+chr3	84707	2.0	0.0	2.0
+chr3	84756	1.0	0.0	1.0
+chr3	84758	1.0	0.0	1.0
+chr3	84832	0.0	1.0	1.0
+chr3	84835	0.0	1.0	1.0
+chr3	84836	0.0	1.0	1.0
+chr3	84840	0.0	2.0	2.0
+chr3	84860	0.0	1.0	1.0
+chr3	84870	0.0	1.0	1.0
+chr3	84871	0.0	2.0	2.0
+chr3	84872	0.0	1.0	1.0
+chr3	84875	0.0	3.0	3.0
+chr3	84876	0.0	6.0	6.0
+chr3	84884	6.0	0.0	6.0
+chr3	84887	1.0	1.0	2.0
+chr3	84888	0.0	1.0	1.0
+chr3	84890	0.0	2.0	2.0
+chr3	84891	0.0	1.0	1.0
+chr3	84894	0.0	5.0	5.0
+chr3	84898	1.0	0.0	1.0
+chr3	84905	1.0	0.0	1.0
+chr3	84908	1.0	0.0	1.0
+chr3	84917	0.0	1.0	1.0
+chr3	84918	1.0	0.0	1.0
+chr3	84920	0.0	1.0	1.0
+chr3	84925	1.0	0.0	1.0
+chr3	84929	0.0	1.0	1.0
+chr3	84930	1.0	0.0	1.0
+chr3	84932	0.0	1.0	1.0
+chr3	84933	0.0	1.0	1.0
+chr3	84938	1.0	0.0	1.0
+chr3	84940	2.0	0.0	2.0
+chr3	84946	1.0	0.0	1.0
+chr3	84947	1.0	0.0	1.0
+chr3	84951	0.0	1.0	1.0
+chr3	84980	2.0	0.0	2.0
+chr3	85007	0.0	1.0	1.0
+chr3	85029	1.0	0.0	1.0
+chr3	85039	0.0	1.0	1.0
+chr3	85046	0.0	1.0	1.0
+chr3	85055	0.0	2.0	2.0
+chr3	85066	0.0	1.0	1.0
+chr3	85069	0.0	1.0	1.0
+chr3	85074	2.0	0.0	2.0
+chr3	85081	3.0	1.0	4.0
+chr3	85085	2.0	0.0	2.0
+chr3	85088	1.0	0.0	1.0
+chr3	85089	1.0	0.0	1.0
+chr3	85091	3.0	0.0	3.0
+chr3	85093	5.0	0.0	5.0
+chr3	85094	9.0	1.0	10.0
+chr3	85095	1.0	0.0	1.0
+chr3	85096	1.0	0.0	1.0
+chr3	85097	1.0	2.0	3.0
+chr3	85098	1.0	0.0	1.0
+chr3	85107	1.0	1.0	2.0
+chr3	85109	0.0	4.0	4.0
+chr3	85113	1.0	0.0	1.0
+chr3	85118	1.0	0.0	1.0
+chr3	85119	1.0	0.0	1.0
+chr3	85124	1.0	0.0	1.0
+chr3	85125	0.0	3.0	3.0
+chr3	85126	0.0	2.0	2.0
+chr3	85127	0.0	1.0	1.0
+chr3	85133	0.0	2.0	2.0
+chr3	85143	0.0	2.0	2.0
+chr3	85144	0.0	1.0	1.0
+chr3	85148	1.0	0.0	1.0
+chr3	85149	1.0	0.0	1.0
+chr3	85150	2.0	0.0	2.0
+chr3	85153	0.0	1.0	1.0
+chr3	85159	0.0	1.0	1.0
+chr3	85172	0.0	2.0	2.0
+chr3	85174	4.0	0.0	4.0
+chr3	85175	1.0	0.0	1.0
+chr3	85177	0.0	3.0	3.0
+chr3	85179	0.0	1.0	1.0
+chr3	85180	1.0	0.0	1.0
+chr3	85181	2.0	0.0	2.0
Index: /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/testdata/.gitignore
===================================================================
--- /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/testdata/.gitignore (revision 3)
+++ /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/testdata/.gitignore (revision 3)
@@ -0,0 +1,1 @@
+big*
Index: /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/testdata/test-users.csv
===================================================================
--- /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/testdata/test-users.csv (revision 3)
+++ /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/testdata/test-users.csv (revision 3)
@@ -0,0 +1,7 @@
+username,email,first_name,last_name,is_superuser
+admin,admin,Admin,User,yes
+demo,demo,Demo,User,no
+public,public,Public,User,no
+johndoe,johndoe@foo.bar,John,Doe,no
+janedoe,janedoe@foo.bar,Jane,Doe,no
+kiddoe,kiddoe@foo.bar,Kid,Doe,no
Index: /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/testdata/short-bad-input.gtrack
===================================================================
--- /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/testdata/short-bad-input.gtrack (revision 3)
+++ /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/testdata/short-bad-input.gtrack (revision 3)
@@ -0,0 +1,1 @@
+Results dataset
Index: /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/testdata/test-hdflib-input.bed
===================================================================
--- /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/testdata/test-hdflib-input.bed (revision 3)
+++ /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/testdata/test-hdflib-input.bed (revision 3)
@@ -0,0 +1,47139 @@
+chr1	114	146	b	b	-
+chr1	222	254	b	b	-
+chr1	222	254	b	b	-
+chr1	222	254	b	b	-
+chr1	287	319	b	b	-
+chr1	296	328	b	b	-
+chr1	298	330	b	b	-
+chr1	307	339	b	b	-
+chr1	341	373	a	a	+
+chr1	342	374	a	a	+
+chr1	313	345	b	b	-
+chr1	362	394	a	a	+
+chr1	363	395	a	a	+
+chr1	365	397	a	a	+
+chr1	335	367	b	b	-
+chr1	337	369	b	b	-
+chr1	337	369	b	b	-
+chr1	370	402	a	a	+
+chr1	371	403	a	a	+
+chr1	371	403	a	a	+
+chr1	371	403	a	a	+
+chr1	340	372	b	b	-
+chr1	340	372	b	b	-
+chr1	379	411	a	a	+
+chr1	385	417	a	a	+
+chr1	385	417	a	a	+
+chr1	353	385	b	b	-
+chr1	363	395	b	b	-
+chr1	370	402	b	b	-
+chr1	370	402	b	b	-
+chr1	370	402	b	b	-
+chr1	403	435	a	a	+
+chr1	379	411	b	b	-
+chr1	387	419	b	b	-
+chr1	395	427	b	b	-
+chr1	432	464	a	a	+
+chr1	432	464	a	a	+
+chr1	434	466	a	a	+
+chr1	411	443	b	b	-
+chr1	555	587	b	b	-
+chr1	561	593	b	b	-
+chr1	596	628	a	a	+
+chr1	575	607	b	b	-
+chr1	611	643	a	a	+
+chr1	612	644	a	a	+
+chr1	581	613	b	b	-
+chr1	614	646	a	a	+
+chr1	614	646	a	a	+
+chr1	620	652	a	a	+
+chr1	623	655	a	a	+
+chr1	623	655	a	a	+
+chr1	595	627	b	b	-
+chr1	595	627	b	b	-
+chr1	595	627	b	b	-
+chr1	595	627	b	b	-
+chr1	629	661	a	a	+
+chr1	629	661	a	a	+
+chr1	629	661	a	a	+
+chr1	600	632	b	b	-
+chr1	638	670	a	a	+
+chr1	639	671	a	a	+
+chr1	609	641	b	b	-
+chr1	829	861	b	b	-
+chr1	931	963	a	a	+
+chr1	1091	1123	a	a	+
+chr1	1180	1212	a	a	+
+chr1	1275	1307	b	b	-
+chr1	1337	1369	a	a	+
+chr1	1337	1369	a	a	+
+chr1	1317	1349	b	b	-
+chr1	1516	1548	a	a	+
+chr1	1559	1591	a	a	+
+chr1	1557	1589	b	b	-
+chr1	1557	1589	b	b	-
+chr1	1564	1596	b	b	-
+chr1	1573	1605	b	b	-
+chr1	1607	1639	a	a	+
+chr1	1644	1676	a	a	+
+chr1	1804	1836	b	b	-
+chr1	1810	1842	b	b	-
+chr1	1810	1842	b	b	-
+chr1	1812	1844	b	b	-
+chr1	1817	1849	b	b	-
+chr1	1826	1858	b	b	-
+chr1	1836	1868	b	b	-
+chr1	1869	1901	a	a	+
+chr1	1869	1901	a	a	+
+chr1	1869	1901	a	a	+
+chr1	1869	1901	a	a	+
+chr1	1869	1901	a	a	+
+chr1	1869	1901	a	a	+
+chr1	1838	1870	b	b	-
+chr1	1839	1871	b	b	-
+chr1	1875	1907	a	a	+
+chr1	1875	1907	a	a	+
+chr1	1879	1911	a	a	+
+chr1	1879	1911	a	a	+
+chr1	1879	1911	a	a	+
+chr1	1847	1879	b	b	-
+chr1	1847	1879	b	b	-
+chr1	1847	1879	b	b	-
+chr1	1847	1879	b	b	-
+chr1	1847	1879	b	b	-
+chr1	1848	1880	b	b	-
+chr1	1848	1880	b	b	-
+chr1	1848	1880	b	b	-
+chr1	1848	1880	b	b	-
+chr1	1850	1882	b	b	-
+chr1	1853	1885	b	b	-
+chr1	1853	1885	b	b	-
+chr1	1886	1918	a	a	+
+chr1	1886	1918	a	a	+
+chr1	1886	1918	a	a	+
+chr1	1886	1918	a	a	+
+chr1	1854	1886	b	b	-
+chr1	1889	1921	a	a	+
+chr1	1889	1921	a	a	+
+chr1	1857	1889	b	b	-
+chr1	1857	1889	b	b	-
+chr1	1857	1889	b	b	-
+chr1	1857	1889	b	b	-
+chr1	1890	1922	a	a	+
+chr1	1890	1922	a	a	+
+chr1	1892	1924	a	a	+
+chr1	1892	1924	a	a	+
+chr1	1861	1893	b	b	-
+chr1	1861	1893	b	b	-
+chr1	1894	1926	a	a	+
+chr1	1862	1894	b	b	-
+chr1	1863	1895	b	b	-
+chr1	1863	1895	b	b	-
+chr1	1864	1896	b	b	-
+chr1	1897	1929	a	a	+
+chr1	1865	1897	b	b	-
+chr1	1866	1898	b	b	-
+chr1	1866	1898	b	b	-
+chr1	1866	1898	b	b	-
+chr1	1867	1899	b	b	-
+chr1	1867	1899	b	b	-
+chr1	1867	1899	b	b	-
+chr1	1867	1899	b	b	-
+chr1	1867	1899	b	b	-
+chr1	1867	1899	b	b	-
+chr1	1868	1900	b	b	-
+chr1	1901	1933	a	a	+
+chr1	1901	1933	a	a	+
+chr1	1901	1933	a	a	+
+chr1	1870	1902	b	b	-
+chr1	1872	1904	b	b	-
+chr1	1908	1940	a	a	+
+chr1	1909	1941	a	a	+
+chr1	1878	1910	b	b	-
+chr1	1883	1915	b	b	-
+chr1	1916	1948	a	a	+
+chr1	1884	1916	b	b	-
+chr1	1885	1917	b	b	-
+chr1	1888	1920	b	b	-
+chr1	1921	1953	a	a	+
+chr1	1921	1953	a	a	+
+chr1	1893	1925	b	b	-
+chr1	1926	1958	a	a	+
+chr1	1927	1959	a	a	+
+chr1	1904	1936	b	b	-
+chr1	1907	1939	b	b	-
+chr1	1908	1940	b	b	-
+chr1	1910	1942	b	b	-
+chr1	1917	1949	b	b	-
+chr1	1959	1991	a	a	+
+chr1	1973	2005	a	a	+
+chr1	1941	1973	b	b	-
+chr1	1941	1973	b	b	-
+chr1	1983	2015	a	a	+
+chr1	1967	1999	b	b	-
+chr1	1967	1999	b	b	-
+chr1	2001	2033	a	a	+
+chr1	2010	2042	a	a	+
+chr1	2010	2042	a	a	+
+chr1	2011	2043	a	a	+
+chr1	2011	2043	a	a	+
+chr1	1986	2018	b	b	-
+chr1	1987	2019	b	b	-
+chr1	2025	2057	a	a	+
+chr1	2026	2058	a	a	+
+chr1	2026	2058	a	a	+
+chr1	2029	2061	a	a	+
+chr1	2032	2064	a	a	+
+chr1	2033	2065	a	a	+
+chr1	2034	2066	a	a	+
+chr1	2034	2066	a	a	+
+chr1	2034	2066	a	a	+
+chr1	2042	2074	a	a	+
+chr1	2052	2084	a	a	+
+chr1	2052	2084	a	a	+
+chr1	2052	2084	a	a	+
+chr1	2052	2084	a	a	+
+chr1	2052	2084	a	a	+
+chr1	2052	2084	a	a	+
+chr1	2052	2084	a	a	+
+chr1	2052	2084	a	a	+
+chr1	2054	2086	a	a	+
+chr1	2028	2060	b	b	-
+chr1	2063	2095	a	a	+
+chr1	2063	2095	a	a	+
+chr1	2066	2098	a	a	+
+chr1	2066	2098	a	a	+
+chr1	2066	2098	a	a	+
+chr1	2069	2101	a	a	+
+chr1	2040	2072	b	b	-
+chr1	2076	2108	a	a	+
+chr1	2044	2076	b	b	-
+chr1	2050	2082	b	b	-
+chr1	2053	2085	b	b	-
+chr1	2053	2085	b	b	-
+chr1	2053	2085	b	b	-
+chr1	2054	2086	b	b	-
+chr1	2090	2122	a	a	+
+chr1	2063	2095	b	b	-
+chr1	2063	2095	b	b	-
+chr1	2063	2095	b	b	-
+chr1	2096	2128	a	a	+
+chr1	2096	2128	a	a	+
+chr1	2096	2128	a	a	+
+chr1	2069	2101	b	b	-
+chr1	2113	2145	a	a	+
+chr1	2120	2152	a	a	+
+chr1	2091	2123	b	b	-
+chr1	2146	2178	a	a	+
+chr1	2158	2190	a	a	+
+chr1	2192	2224	a	a	+
+chr1	2198	2230	a	a	+
+chr1	2172	2204	b	b	-
+chr1	2209	2241	a	a	+
+chr1	2312	2344	b	b	-
+chr1	2326	2358	b	b	-
+chr1	2329	2361	b	b	-
+chr1	2329	2361	b	b	-
+chr1	2329	2361	b	b	-
+chr1	2329	2361	b	b	-
+chr1	2329	2361	b	b	-
+chr1	2336	2368	b	b	-
+chr1	2341	2373	b	b	-
+chr1	2341	2373	b	b	-
+chr1	2341	2373	b	b	-
+chr1	2341	2373	b	b	-
+chr1	2341	2373	b	b	-
+chr1	2341	2373	b	b	-
+chr1	2341	2373	b	b	-
+chr1	2341	2373	b	b	-
+chr1	2341	2373	b	b	-
+chr1	2341	2373	b	b	-
+chr1	2351	2383	b	b	-
+chr1	2351	2383	b	b	-
+chr1	2352	2384	b	b	-
+chr1	2352	2384	b	b	-
+chr1	2352	2384	b	b	-
+chr1	2352	2384	b	b	-
+chr1	2352	2384	b	b	-
+chr1	2353	2385	b	b	-
+chr1	2357	2389	b	b	-
+chr1	2358	2390	b	b	-
+chr1	2374	2406	b	b	-
+chr1	2380	2412	b	b	-
+chr1	2418	2450	a	a	+
+chr1	2419	2451	a	a	+
+chr1	2563	2595	a	a	+
+chr1	2620	2652	a	a	+
+chr1	2632	2664	a	a	+
+chr1	2634	2666	a	a	+
+chr1	2635	2667	a	a	+
+chr1	2635	2667	a	a	+
+chr1	2635	2667	a	a	+
+chr1	2635	2667	a	a	+
+chr1	2608	2640	b	b	-
+chr1	2608	2640	b	b	-
+chr1	2608	2640	b	b	-
+chr1	2608	2640	b	b	-
+chr1	2608	2640	b	b	-
+chr1	2608	2640	b	b	-
+chr1	2644	2676	a	a	+
+chr1	2649	2681	a	a	+
+chr1	2649	2681	a	a	+
+chr1	2649	2681	a	a	+
+chr1	2650	2682	a	a	+
+chr1	2651	2683	a	a	+
+chr1	2651	2683	a	a	+
+chr1	2660	2692	a	a	+
+chr1	2663	2695	a	a	+
+chr1	2663	2695	a	a	+
+chr1	2636	2668	b	b	-
+chr1	2636	2668	b	b	-
+chr1	2670	2702	a	a	+
+chr1	2670	2702	a	a	+
+chr1	2671	2703	a	a	+
+chr1	2671	2703	a	a	+
+chr1	2671	2703	a	a	+
+chr1	2671	2703	a	a	+
+chr1	2673	2705	a	a	+
+chr1	2641	2673	b	b	-
+chr1	2643	2675	b	b	-
+chr1	2643	2675	b	b	-
+chr1	2643	2675	b	b	-
+chr1	2643	2675	b	b	-
+chr1	2643	2675	b	b	-
+chr1	2678	2710	a	a	+
+chr1	2649	2681	b	b	-
+chr1	2650	2682	b	b	-
+chr1	2651	2683	b	b	-
+chr1	2651	2683	b	b	-
+chr1	2651	2683	b	b	-
+chr1	2651	2683	b	b	-
+chr1	2688	2720	a	a	+
+chr1	2665	2697	b	b	-
+chr1	2700	2732	a	a	+
+chr1	2702	2734	a	a	+
+chr1	2702	2734	a	a	+
+chr1	3003	3035	b	b	-
+chr1	3208	3240	a	a	+
+chr1	3295	3327	b	b	-
+chr1	3551	3583	b	b	-
+chr1	3551	3583	b	b	-
+chr1	3551	3583	b	b	-
+chr1	3813	3845	a	a	+
+chr1	3915	3947	a	a	+
+chr1	4021	4053	b	b	-
+chr1	4216	4248	b	b	-
+chr1	4296	4328	a	a	+
+chr1	4790	4822	b	b	-
+chr1	4829	4861	a	a	+
+chr1	4914	4946	a	a	+
+chr1	5301	5333	b	b	-
+chr1	5509	5541	a	a	+
+chr1	5481	5513	b	b	-
+chr1	5520	5552	a	a	+
+chr1	5520	5552	a	a	+
+chr1	5693	5725	b	b	-
+chr1	5716	5748	b	b	-
+chr1	5755	5787	a	a	+
+chr1	5731	5763	b	b	-
+chr1	5776	5808	a	a	+
+chr1	5807	5839	b	b	-
+chr1	5933	5965	a	a	+
+chr1	5954	5986	a	a	+
+chr1	5955	5987	a	a	+
+chr1	5943	5975	b	b	-
+chr1	5964	5996	b	b	-
+chr1	6067	6099	a	a	+
+chr1	6055	6087	b	b	-
+chr1	6129	6161	a	a	+
+chr1	6113	6145	b	b	-
+chr1	6160	6192	b	b	-
+chr1	6194	6226	a	a	+
+chr1	6197	6229	b	b	-
+chr1	6284	6316	a	a	+
+chr1	6285	6317	a	a	+
+chr1	6294	6326	a	a	+
+chr1	6298	6330	a	a	+
+chr1	6298	6330	a	a	+
+chr1	6274	6306	b	b	-
+chr1	6276	6308	b	b	-
+chr1	6276	6308	b	b	-
+chr1	6296	6328	b	b	-
+chr1	6344	6376	a	a	+
+chr1	6313	6345	b	b	-
+chr1	6397	6429	a	a	+
+chr1	6572	6604	a	a	+
+chr1	6551	6583	b	b	-
+chr1	6597	6629	a	a	+
+chr1	6601	6633	a	a	+
+chr1	6601	6633	a	a	+
+chr1	6601	6633	a	a	+
+chr1	6575	6607	b	b	-
+chr1	6608	6640	a	a	+
+chr1	6608	6640	b	b	-
+chr1	6926	6958	b	b	-
+chr1	7313	7345	a	a	+
+chr1	7309	7341	b	b	-
+chr1	7374	7406	a	a	+
+chr1	7410	7442	a	a	+
+chr1	7404	7436	b	b	-
+chr1	7441	7473	a	a	+
+chr1	7413	7445	b	b	-
+chr1	7458	7490	a	a	+
+chr1	7457	7489	b	b	-
+chr1	7545	7577	b	b	-
+chr1	7561	7593	b	b	-
+chr1	7673	7705	a	a	+
+chr1	7747	7779	a	a	+
+chr1	7791	7823	a	a	+
+chr1	7985	8017	a	a	+
+chr1	8035	8067	a	a	+
+chr1	8048	8080	b	b	-
+chr1	8082	8114	a	a	+
+chr1	8055	8087	b	b	-
+chr1	8094	8126	a	a	+
+chr1	8099	8131	a	a	+
+chr1	8101	8133	a	a	+
+chr1	8103	8135	a	a	+
+chr1	8115	8147	a	a	+
+chr1	8115	8147	a	a	+
+chr1	8115	8147	a	a	+
+chr1	8115	8147	a	a	+
+chr1	8122	8154	a	a	+
+chr1	8285	8317	a	a	+
+chr1	8289	8321	a	a	+
+chr1	8293	8325	a	a	+
+chr1	8276	8308	b	b	-
+chr1	8312	8344	a	a	+
+chr1	8292	8324	b	b	-
+chr1	8325	8357	a	a	+
+chr1	8328	8360	a	a	+
+chr1	8328	8360	a	a	+
+chr1	8336	8368	a	a	+
+chr1	8324	8356	b	b	-
+chr1	8324	8356	b	b	-
+chr1	8365	8397	b	b	-
+chr1	8457	8489	a	a	+
+chr1	8457	8489	a	a	+
+chr1	8432	8464	b	b	-
+chr1	8440	8472	b	b	-
+chr1	8477	8509	a	a	+
+chr1	8496	8528	a	a	+
+chr1	8533	8565	a	a	+
+chr1	8512	8544	b	b	-
+chr1	8674	8706	b	b	-
+chr1	8715	8747	a	a	+
+chr1	8716	8748	a	a	+
+chr1	8761	8793	a	a	+
+chr1	8817	8849	b	b	-
+chr1	8850	8882	b	b	-
+chr1	8906	8938	a	a	+
+chr1	8898	8930	b	b	-
+chr1	8906	8938	b	b	-
+chr1	8911	8943	b	b	-
+chr1	8912	8944	b	b	-
+chr1	8956	8988	a	a	+
+chr1	8998	9030	a	a	+
+chr1	9107	9139	a	a	+
+chr1	9134	9166	a	a	+
+chr1	9120	9152	b	b	-
+chr1	9121	9153	b	b	-
+chr1	9158	9190	a	a	+
+chr1	9179	9211	a	a	+
+chr1	9183	9215	b	b	-
+chr1	9199	9231	b	b	-
+chr1	9246	9278	a	a	+
+chr1	9220	9252	b	b	-
+chr1	9272	9304	a	a	+
+chr1	9329	9361	a	a	+
+chr1	9339	9371	a	a	+
+chr1	9339	9371	a	a	+
+chr1	9321	9353	b	b	-
+chr1	9358	9390	a	a	+
+chr1	9381	9413	a	a	+
+chr1	9349	9381	b	b	-
+chr1	9356	9388	b	b	-
+chr1	9394	9426	a	a	+
+chr1	9394	9426	a	a	+
+chr1	9395	9427	a	a	+
+chr1	9364	9396	b	b	-
+chr1	9369	9401	b	b	-
+chr1	9370	9402	b	b	-
+chr1	9409	9441	a	a	+
+chr1	9377	9409	b	b	-
+chr1	9422	9454	a	a	+
+chr1	9427	9459	a	a	+
+chr1	9402	9434	b	b	-
+chr1	9435	9467	a	a	+
+chr1	9409	9441	b	b	-
+chr1	9417	9449	b	b	-
+chr1	9418	9450	b	b	-
+chr1	9453	9485	a	a	+
+chr1	9453	9485	a	a	+
+chr1	9426	9458	b	b	-
+chr1	9466	9498	a	a	+
+chr1	9446	9478	b	b	-
+chr1	9581	9613	a	a	+
+chr1	9563	9595	b	b	-
+chr1	9580	9612	b	b	-
+chr1	9614	9646	a	a	+
+chr1	9614	9646	a	a	+
+chr1	9641	9673	a	a	+
+chr1	9681	9713	b	b	-
+chr1	9826	9858	a	a	+
+chr1	9908	9940	b	b	-
+chr1	9908	9940	b	b	-
+chr1	9909	9941	b	b	-
+chr1	9940	9972	b	b	-
+chr1	9974	10006	a	a	+
+chr1	9982	10014	a	a	+
+chr1	10154	10186	a	a	+
+chr1	10371	10403	b	b	-
+chr1	10371	10403	b	b	-
+chr1	10433	10465	a	a	+
+chr1	10433	10465	a	a	+
+chr1	10488	10520	a	a	+
+chr1	10482	10514	b	b	-
+chr1	10533	10565	a	a	+
+chr1	10519	10551	b	b	-
+chr1	10528	10560	b	b	-
+chr1	10529	10561	b	b	-
+chr1	10565	10597	a	a	+
+chr1	10543	10575	b	b	-
+chr1	10576	10608	a	a	+
+chr1	10752	10784	a	a	+
+chr1	10732	10764	b	b	-
+chr1	10732	10764	b	b	-
+chr1	10733	10765	b	b	-
+chr1	10733	10765	b	b	-
+chr1	10733	10765	b	b	-
+chr1	10733	10765	b	b	-
+chr1	10733	10765	b	b	-
+chr1	10734	10766	b	b	-
+chr1	10813	10845	a	a	+
+chr1	10855	10887	b	b	-
+chr1	10917	10949	a	a	+
+chr1	10917	10949	a	a	+
+chr1	10903	10935	b	b	-
+chr1	10937	10969	a	a	+
+chr1	10937	10969	a	a	+
+chr1	10919	10951	b	b	-
+chr1	10919	10951	b	b	-
+chr1	10967	10999	a	a	+
+chr1	10977	11009	a	a	+
+chr1	11074	11106	a	a	+
+chr1	11112	11144	a	a	+
+chr1	11302	11334	b	b	-
+chr1	11361	11393	a	a	+
+chr1	11369	11401	a	a	+
+chr1	11409	11441	a	a	+
+chr1	11532	11564	a	a	+
+chr1	11555	11587	a	a	+
+chr1	11582	11614	a	a	+
+chr1	11634	11666	b	b	-
+chr1	11649	11681	b	b	-
+chr1	11692	11724	a	a	+
+chr1	11667	11699	b	b	-
+chr1	11667	11699	b	b	-
+chr1	11671	11703	b	b	-
+chr1	11688	11720	b	b	-
+chr1	11724	11756	a	a	+
+chr1	11724	11756	a	a	+
+chr1	11694	11726	b	b	-
+chr1	11730	11762	a	a	+
+chr1	11699	11731	b	b	-
+chr1	11712	11744	b	b	-
+chr1	11745	11777	a	a	+
+chr1	11745	11777	a	a	+
+chr1	11745	11777	a	a	+
+chr1	11725	11757	b	b	-
+chr1	11760	11792	a	a	+
+chr1	11730	11762	b	b	-
+chr1	11731	11763	b	b	-
+chr1	11731	11763	b	b	-
+chr1	11731	11763	b	b	-
+chr1	11734	11766	b	b	-
+chr1	11768	11800	a	a	+
+chr1	11798	11830	a	a	+
+chr1	11858	11890	a	a	+
+chr1	11828	11860	b	b	-
+chr1	11875	11907	a	a	+
+chr1	11877	11909	a	a	+
+chr1	11847	11879	b	b	-
+chr1	11864	11896	b	b	-
+chr1	11898	11930	a	a	+
+chr1	11866	11898	b	b	-
+chr1	11900	11932	a	a	+
+chr1	11903	11935	a	a	+
+chr1	11873	11905	b	b	-
+chr1	11879	11911	b	b	-
+chr1	11879	11911	b	b	-
+chr1	11926	11958	a	a	+
+chr1	11930	11962	a	a	+
+chr1	11937	11969	a	a	+
+chr1	11905	11937	b	b	-
+chr1	11939	11971	a	a	+
+chr1	11912	11944	b	b	-
+chr1	11945	11977	a	a	+
+chr1	11914	11946	b	b	-
+chr1	11968	12000	a	a	+
+chr1	11969	12001	b	b	-
+chr1	11985	12017	b	b	-
+chr1	12049	12081	a	a	+
+chr1	12057	12089	a	a	+
+chr1	12037	12069	b	b	-
+chr1	12074	12106	a	a	+
+chr1	12075	12107	a	a	+
+chr1	12076	12108	a	a	+
+chr1	12082	12114	a	a	+
+chr1	12082	12114	a	a	+
+chr1	12050	12082	b	b	-
+chr1	12094	12126	a	a	+
+chr1	12098	12130	a	a	+
+chr1	12098	12130	a	a	+
+chr1	12098	12130	a	a	+
+chr1	12066	12098	b	b	-
+chr1	12066	12098	b	b	-
+chr1	12100	12132	a	a	+
+chr1	12084	12116	b	b	-
+chr1	12085	12117	b	b	-
+chr1	12152	12184	a	a	+
+chr1	12177	12209	a	a	+
+chr1	12246	12278	a	a	+
+chr1	12251	12283	a	a	+
+chr1	12254	12286	a	a	+
+chr1	12243	12275	b	b	-
+chr1	12281	12313	a	a	+
+chr1	12293	12325	a	a	+
+chr1	12299	12331	a	a	+
+chr1	12332	12364	a	a	+
+chr1	12339	12371	a	a	+
+chr1	12344	12376	a	a	+
+chr1	12338	12370	b	b	-
+chr1	12338	12370	b	b	-
+chr1	12391	12423	a	a	+
+chr1	12395	12427	a	a	+
+chr1	12378	12410	b	b	-
+chr1	12416	12448	a	a	+
+chr1	12388	12420	b	b	-
+chr1	12423	12455	a	a	+
+chr1	12424	12456	a	a	+
+chr1	12424	12456	a	a	+
+chr1	12393	12425	b	b	-
+chr1	12393	12425	b	b	-
+chr1	12394	12426	b	b	-
+chr1	12394	12426	b	b	-
+chr1	12394	12426	b	b	-
+chr1	12428	12460	a	a	+
+chr1	12428	12460	a	a	+
+chr1	12431	12463	a	a	+
+chr1	12431	12463	a	a	+
+chr1	12431	12463	a	a	+
+chr1	12408	12440	b	b	-
+chr1	12443	12475	a	a	+
+chr1	12446	12478	a	a	+
+chr1	12415	12447	b	b	-
+chr1	12415	12447	b	b	-
+chr1	12415	12447	b	b	-
+chr1	12417	12449	b	b	-
+chr1	12417	12449	b	b	-
+chr1	12459	12491	a	a	+
+chr1	12437	12469	b	b	-
+chr1	12444	12476	b	b	-
+chr1	12444	12476	b	b	-
+chr1	12444	12476	b	b	-
+chr1	12445	12477	b	b	-
+chr1	12446	12478	b	b	-
+chr1	12471	12503	b	b	-
+chr1	12471	12503	b	b	-
+chr1	12527	12559	a	a	+
+chr1	12515	12547	b	b	-
+chr1	12515	12547	b	b	-
+chr1	12560	12592	a	a	+
+chr1	12608	12640	a	a	+
+chr1	12635	12667	a	a	+
+chr1	12615	12647	b	b	-
+chr1	12615	12647	b	b	-
+chr1	12656	12688	a	a	+
+chr1	12659	12691	b	b	-
+chr1	12659	12691	b	b	-
+chr1	12704	12736	a	a	+
+chr1	12709	12741	b	b	-
+chr1	12709	12741	b	b	-
+chr1	12752	12784	a	a	+
+chr1	12779	12811	a	a	+
+chr1	12800	12832	a	a	+
+chr1	12780	12812	b	b	-
+chr1	12844	12876	b	b	-
+chr1	12881	12913	a	a	+
+chr1	12881	12913	a	a	+
+chr1	12881	12913	a	a	+
+chr1	12881	12913	a	a	+
+chr1	12868	12900	b	b	-
+chr1	12868	12900	b	b	-
+chr1	12868	12900	b	b	-
+chr1	12872	12904	b	b	-
+chr1	12872	12904	b	b	-
+chr1	12908	12940	a	a	+
+chr1	12910	12942	a	a	+
+chr1	12919	12951	a	a	+
+chr1	12893	12925	b	b	-
+chr1	12929	12961	a	a	+
+chr1	12901	12933	b	b	-
+chr1	12920	12952	b	b	-
+chr1	12932	12964	b	b	-
+chr1	13070	13102	a	a	+
+chr1	13208	13240	a	a	+
+chr1	13208	13240	a	a	+
+chr1	13185	13217	b	b	-
+chr1	13194	13226	b	b	-
+chr1	13212	13244	b	b	-
+chr1	13277	13309	a	a	+
+chr1	13286	13318	a	a	+
+chr1	13303	13335	a	a	+
+chr1	13272	13304	b	b	-
+chr1	13323	13355	b	b	-
+chr1	13347	13379	b	b	-
+chr1	13392	13424	b	b	-
+chr1	13433	13465	a	a	+
+chr1	13504	13536	b	b	-
+chr1	13600	13632	a	a	+
+chr1	13612	13644	a	a	+
+chr1	13614	13646	a	a	+
+chr1	13602	13634	b	b	-
+chr1	13638	13670	b	b	-
+chr1	13644	13676	b	b	-
+chr1	13681	13713	a	a	+
+chr1	13715	13747	a	a	+
+chr1	13746	13778	a	a	+
+chr1	13746	13778	a	a	+
+chr1	13827	13859	a	a	+
+chr1	13814	13846	b	b	-
+chr1	13838	13870	b	b	-
+chr1	13874	13906	a	a	+
+chr1	13878	13910	b	b	-
+chr1	13912	13944	b	b	-
+chr1	13919	13951	b	b	-
+chr1	13920	13952	b	b	-
+chr1	13971	14003	a	a	+
+chr1	13941	13973	b	b	-
+chr1	13985	14017	b	b	-
+chr1	14025	14057	b	b	-
+chr1	14066	14098	b	b	-
+chr1	14100	14132	a	a	+
+chr1	14113	14145	b	b	-
+chr1	14218	14250	a	a	+
+chr1	14228	14260	a	a	+
+chr1	14234	14266	b	b	-
+chr1	14299	14331	a	a	+
+chr1	14299	14331	a	a	+
+chr1	14269	14301	b	b	-
+chr1	14276	14308	b	b	-
+chr1	14278	14310	b	b	-
+chr1	14280	14312	b	b	-
+chr1	14280	14312	b	b	-
+chr1	14314	14346	a	a	+
+chr1	14315	14347	a	a	+
+chr1	14317	14349	a	a	+
+chr1	14286	14318	b	b	-
+chr1	14286	14318	b	b	-
+chr1	14290	14322	b	b	-
+chr1	14330	14362	a	a	+
+chr1	14419	14451	a	a	+
+chr1	14439	14471	b	b	-
+chr1	14445	14477	b	b	-
+chr1	14486	14518	a	a	+
+chr1	14462	14494	b	b	-
+chr1	14462	14494	b	b	-
+chr1	14505	14537	a	a	+
+chr1	14514	14546	a	a	+
+chr1	14546	14578	a	a	+
+chr1	14559	14591	a	a	+
+chr1	14559	14591	a	a	+
+chr1	14559	14591	a	a	+
+chr1	14623	14655	a	a	+
+chr1	14625	14657	a	a	+
+chr1	14596	14628	b	b	-
+chr1	14631	14663	a	a	+
+chr1	14603	14635	b	b	-
+chr1	14636	14668	a	a	+
+chr1	14609	14641	b	b	-
+chr1	14609	14641	b	b	-
+chr1	14609	14641	b	b	-
+chr1	14645	14677	a	a	+
+chr1	14645	14677	a	a	+
+chr1	14616	14648	b	b	-
+chr1	14650	14682	a	a	+
+chr1	14650	14682	a	a	+
+chr1	14634	14666	b	b	-
+chr1	14670	14702	a	a	+
+chr1	14671	14703	a	a	+
+chr1	14639	14671	b	b	-
+chr1	14639	14671	b	b	-
+chr1	14645	14677	b	b	-
+chr1	14645	14677	b	b	-
+chr1	14645	14677	b	b	-
+chr1	14648	14680	b	b	-
+chr1	14648	14680	b	b	-
+chr1	14648	14680	b	b	-
+chr1	14649	14681	b	b	-
+chr1	14965	14997	a	a	+
+chr1	14974	15006	a	a	+
+chr1	14981	15013	a	a	+
+chr1	14949	14981	b	b	-
+chr1	14957	14989	b	b	-
+chr1	14959	14991	b	b	-
+chr1	14967	14999	b	b	-
+chr1	14969	15001	b	b	-
+chr1	14970	15002	b	b	-
+chr1	15010	15042	a	a	+
+chr1	15015	15047	a	a	+
+chr1	14984	15016	b	b	-
+chr1	14991	15023	b	b	-
+chr1	14991	15023	b	b	-
+chr1	14993	15025	b	b	-
+chr1	15027	15059	a	a	+
+chr1	15027	15059	a	a	+
+chr1	14999	15031	b	b	-
+chr1	15034	15066	a	a	+
+chr1	15035	15067	a	a	+
+chr1	15036	15068	a	a	+
+chr1	15039	15071	a	a	+
+chr1	15039	15071	a	a	+
+chr1	15041	15073	a	a	+
+chr1	15009	15041	b	b	-
+chr1	15044	15076	a	a	+
+chr1	15044	15076	a	a	+
+chr1	15044	15076	a	a	+
+chr1	15013	15045	b	b	-
+chr1	15046	15078	a	a	+
+chr1	15047	15079	a	a	+
+chr1	15015	15047	b	b	-
+chr1	15053	15085	a	a	+
+chr1	15053	15085	a	a	+
+chr1	15022	15054	b	b	-
+chr1	15022	15054	b	b	-
+chr1	15023	15055	b	b	-
+chr1	15024	15056	b	b	-
+chr1	15031	15063	b	b	-
+chr1	15126	15158	b	b	-
+chr1	15216	15248	a	a	+
+chr1	15233	15265	b	b	-
+chr1	15233	15265	b	b	-
+chr1	15233	15265	b	b	-
+chr1	15233	15265	b	b	-
+chr1	15270	15302	b	b	-
+chr1	15342	15374	a	a	+
+chr1	15375	15407	a	a	+
+chr1	15349	15381	b	b	-
+chr1	15386	15418	a	a	+
+chr1	15368	15400	b	b	-
+chr1	15370	15402	b	b	-
+chr1	15370	15402	b	b	-
+chr1	15370	15402	b	b	-
+chr1	15512	15544	b	b	-
+chr1	15557	15589	a	a	+
+chr1	15577	15609	a	a	+
+chr1	15696	15728	a	a	+
+chr1	15704	15736	a	a	+
+chr1	15727	15759	a	a	+
+chr1	15731	15763	a	a	+
+chr1	15735	15767	a	a	+
+chr1	15721	15753	b	b	-
+chr1	15774	15806	a	a	+
+chr1	15783	15815	a	a	+
+chr1	16302	16334	a	a	+
+chr1	16302	16334	a	a	+
+chr1	16298	16330	b	b	-
+chr1	16322	16354	b	b	-
+chr1	16371	16403	a	a	+
+chr1	16481	16513	a	a	+
+chr1	16490	16522	a	a	+
+chr1	16557	16589	a	a	+
+chr1	16557	16589	a	a	+
+chr1	16562	16594	b	b	-
+chr1	16562	16594	b	b	-
+chr1	16634	16666	b	b	-
+chr1	16654	16686	b	b	-
+chr1	16827	16859	a	a	+
+chr1	16972	17004	a	a	+
+chr1	17001	17033	b	b	-
+chr1	17001	17033	b	b	-
+chr1	17001	17033	b	b	-
+chr1	17097	17129	b	b	-
+chr1	17229	17261	b	b	-
+chr1	17263	17295	b	b	-
+chr1	17263	17295	b	b	-
+chr1	17281	17313	b	b	-
+chr1	17293	17325	b	b	-
+chr1	17365	17397	a	a	+
+chr1	17522	17554	b	b	-
+chr1	17596	17628	b	b	-
+chr1	17606	17638	b	b	-
+chr1	17683	17715	a	a	+
+chr1	17690	17722	a	a	+
+chr1	17691	17723	a	a	+
+chr1	17674	17706	b	b	-
+chr1	17722	17754	b	b	-
+chr1	17735	17767	b	b	-
+chr1	17749	17781	b	b	-
+chr1	17749	17781	b	b	-
+chr1	17749	17781	b	b	-
+chr1	17749	17781	b	b	-
+chr1	17749	17781	b	b	-
+chr1	17788	17820	a	a	+
+chr1	17792	17824	a	a	+
+chr1	17793	17825	a	a	+
+chr1	17793	17825	a	a	+
+chr1	17763	17795	b	b	-
+chr1	17797	17829	a	a	+
+chr1	17802	17834	a	a	+
+chr1	17803	17835	a	a	+
+chr1	17804	17836	a	a	+
+chr1	17804	17836	a	a	+
+chr1	17804	17836	a	a	+
+chr1	17804	17836	a	a	+
+chr1	17805	17837	a	a	+
+chr1	17805	17837	a	a	+
+chr1	17805	17837	a	a	+
+chr1	17805	17837	a	a	+
+chr1	17805	17837	a	a	+
+chr1	17777	17809	b	b	-
+chr1	17777	17809	b	b	-
+chr1	17784	17816	b	b	-
+chr1	17818	17850	a	a	+
+chr1	17818	17850	a	a	+
+chr1	17788	17820	b	b	-
+chr1	17788	17820	b	b	-
+chr1	17827	17859	a	a	+
+chr1	17797	17829	b	b	-
+chr1	17838	17870	a	a	+
+chr1	17843	17875	a	a	+
+chr1	17823	17855	b	b	-
+chr1	17826	17858	b	b	-
+chr1	17826	17858	b	b	-
+chr1	17826	17858	b	b	-
+chr1	17826	17858	b	b	-
+chr1	17827	17859	b	b	-
+chr1	17828	17860	b	b	-
+chr1	17835	17867	b	b	-
+chr1	17835	17867	b	b	-
+chr1	17840	17872	b	b	-
+chr1	17843	17875	b	b	-
+chr1	17846	17878	b	b	-
+chr1	17852	17884	b	b	-
+chr1	17988	18020	a	a	+
+chr1	17980	18012	b	b	-
+chr1	18033	18065	a	a	+
+chr1	18033	18065	a	a	+
+chr1	18034	18066	a	a	+
+chr1	18035	18067	a	a	+
+chr1	18038	18070	a	a	+
+chr1	18038	18070	a	a	+
+chr1	18039	18071	a	a	+
+chr1	18012	18044	b	b	-
+chr1	18012	18044	b	b	-
+chr1	18057	18089	a	a	+
+chr1	18028	18060	b	b	-
+chr1	18028	18060	b	b	-
+chr1	18028	18060	b	b	-
+chr1	18031	18063	b	b	-
+chr1	18066	18098	a	a	+
+chr1	18066	18098	a	a	+
+chr1	18067	18099	a	a	+
+chr1	18041	18073	b	b	-
+chr1	18074	18106	a	a	+
+chr1	18154	18186	a	a	+
+chr1	18167	18199	b	b	-
+chr1	18169	18201	b	b	-
+chr1	18176	18208	b	b	-
+chr1	18176	18208	b	b	-
+chr1	18176	18208	b	b	-
+chr1	18176	18208	b	b	-
+chr1	18176	18208	b	b	-
+chr1	18176	18208	b	b	-
+chr1	18176	18208	b	b	-
+chr1	18176	18208	b	b	-
+chr1	18213	18245	a	a	+
+chr1	18182	18214	b	b	-
+chr1	18215	18247	a	a	+
+chr1	18187	18219	b	b	-
+chr1	18189	18221	b	b	-
+chr1	18190	18222	b	b	-
+chr1	18227	18259	a	a	+
+chr1	18228	18260	a	a	+
+chr1	18229	18261	a	a	+
+chr1	18199	18231	b	b	-
+chr1	18206	18238	b	b	-
+chr1	18206	18238	b	b	-
+chr1	18206	18238	b	b	-
+chr1	18242	18274	a	a	+
+chr1	18225	18257	b	b	-
+chr1	18233	18265	b	b	-
+chr1	18316	18348	b	b	-
+chr1	18323	18355	b	b	-
+chr1	18323	18355	b	b	-
+chr1	18368	18400	a	a	+
+chr1	18340	18372	b	b	-
+chr1	18373	18405	a	a	+
+chr1	18354	18386	b	b	-
+chr1	18356	18388	b	b	-
+chr1	18398	18430	a	a	+
+chr1	18398	18430	a	a	+
+chr1	18398	18430	a	a	+
+chr1	18379	18411	b	b	-
+chr1	18379	18411	b	b	-
+chr1	18388	18420	b	b	-
+chr1	18533	18565	b	b	-
+chr1	18533	18565	b	b	-
+chr1	18533	18565	b	b	-
+chr1	18537	18569	b	b	-
+chr1	18579	18611	a	a	+
+chr1	18561	18593	b	b	-
+chr1	18576	18608	b	b	-
+chr1	18613	18645	b	b	-
+chr1	18613	18645	b	b	-
+chr1	18651	18683	a	a	+
+chr1	18633	18665	b	b	-
+chr1	18666	18698	a	a	+
+chr1	18667	18699	a	a	+
+chr1	18674	18706	b	b	-
+chr1	18674	18706	b	b	-
+chr1	18674	18706	b	b	-
+chr1	18717	18749	a	a	+
+chr1	18690	18722	b	b	-
+chr1	18691	18723	b	b	-
+chr1	18692	18724	b	b	-
+chr1	18692	18724	b	b	-
+chr1	18696	18728	b	b	-
+chr1	18734	18766	a	a	+
+chr1	18742	18774	a	a	+
+chr1	18743	18775	a	a	+
+chr1	18743	18775	a	a	+
+chr1	18715	18747	b	b	-
+chr1	18718	18750	b	b	-
+chr1	18759	18791	b	b	-
+chr1	18795	18827	a	a	+
+chr1	18773	18805	b	b	-
+chr1	18773	18805	b	b	-
+chr1	18823	18855	b	b	-
+chr1	18871	18903	a	a	+
+chr1	18842	18874	b	b	-
+chr1	18879	18911	a	a	+
+chr1	18879	18911	a	a	+
+chr1	18879	18911	a	a	+
+chr1	18883	18915	a	a	+
+chr1	18884	18916	a	a	+
+chr1	18855	18887	b	b	-
+chr1	18888	18920	a	a	+
+chr1	18856	18888	b	b	-
+chr1	18898	18930	a	a	+
+chr1	18903	18935	a	a	+
+chr1	18905	18937	a	a	+
+chr1	18909	18941	b	b	-
+chr1	18943	18975	b	b	-
+chr1	19010	19042	b	b	-
+chr1	19061	19093	a	a	+
+chr1	19064	19096	a	a	+
+chr1	19032	19064	b	b	-
+chr1	19033	19065	b	b	-
+chr1	19071	19103	a	a	+
+chr1	19076	19108	a	a	+
+chr1	19044	19076	b	b	-
+chr1	19044	19076	b	b	-
+chr1	19057	19089	b	b	-
+chr1	19063	19095	b	b	-
+chr1	19099	19131	a	a	+
+chr1	19099	19131	a	a	+
+chr1	19099	19131	a	a	+
+chr1	19099	19131	a	a	+
+chr1	19071	19103	b	b	-
+chr1	19132	19164	b	b	-
+chr1	19161	19193	b	b	-
+chr1	19227	19259	a	a	+
+chr1	19230	19262	a	a	+
+chr1	19241	19273	a	a	+
+chr1	19242	19274	a	a	+
+chr1	19210	19242	b	b	-
+chr1	19215	19247	b	b	-
+chr1	19216	19248	b	b	-
+chr1	19260	19292	a	a	+
+chr1	19273	19305	a	a	+
+chr1	19248	19280	b	b	-
+chr1	19357	19389	b	b	-
+chr1	19364	19396	b	b	-
+chr1	19373	19405	b	b	-
+chr1	19406	19438	a	a	+
+chr1	19407	19439	a	a	+
+chr1	19407	19439	a	a	+
+chr1	19419	19451	a	a	+
+chr1	19420	19452	a	a	+
+chr1	19393	19425	b	b	-
+chr1	19395	19427	b	b	-
+chr1	19433	19465	a	a	+
+chr1	19401	19433	b	b	-
+chr1	19401	19433	b	b	-
+chr1	19436	19468	a	a	+
+chr1	19436	19468	a	a	+
+chr1	19408	19440	b	b	-
+chr1	19445	19477	a	a	+
+chr1	19414	19446	b	b	-
+chr1	19419	19451	b	b	-
+chr1	19455	19487	a	a	+
+chr1	19426	19458	b	b	-
+chr1	19426	19458	b	b	-
+chr1	19426	19458	b	b	-
+chr1	19436	19468	b	b	-
+chr1	19491	19523	a	a	+
+chr1	19532	19564	a	a	+
+chr1	19500	19532	b	b	-
+chr1	19506	19538	b	b	-
+chr1	19545	19577	a	a	+
+chr1	19514	19546	b	b	-
+chr1	19516	19548	b	b	-
+chr1	19555	19587	a	a	+
+chr1	19523	19555	b	b	-
+chr1	19523	19555	b	b	-
+chr1	19558	19590	a	a	+
+chr1	19558	19590	a	a	+
+chr1	19558	19590	a	a	+
+chr1	19558	19590	a	a	+
+chr1	19567	19599	a	a	+
+chr1	19537	19569	b	b	-
+chr1	19541	19573	b	b	-
+chr1	19574	19606	a	a	+
+chr1	19589	19621	a	a	+
+chr1	19560	19592	b	b	-
+chr1	19600	19632	a	a	+
+chr1	19605	19637	a	a	+
+chr1	19605	19637	a	a	+
+chr1	19605	19637	a	a	+
+chr1	19616	19648	a	a	+
+chr1	19627	19659	a	a	+
+chr1	19627	19659	a	a	+
+chr1	19627	19659	a	a	+
+chr1	19628	19660	a	a	+
+chr1	19600	19632	b	b	-
+chr1	19697	19729	a	a	+
+chr1	19698	19730	a	a	+
+chr1	19666	19698	b	b	-
+chr1	19666	19698	b	b	-
+chr1	19667	19699	b	b	-
+chr1	19667	19699	b	b	-
+chr1	19668	19700	b	b	-
+chr1	19701	19733	a	a	+
+chr1	19742	19774	a	a	+
+chr1	19719	19751	b	b	-
+chr1	19719	19751	b	b	-
+chr1	19719	19751	b	b	-
+chr1	19738	19770	b	b	-
+chr1	19742	19774	b	b	-
+chr1	19810	19842	a	a	+
+chr1	19813	19845	a	a	+
+chr1	19814	19846	a	a	+
+chr1	19880	19912	a	a	+
+chr1	19861	19893	b	b	-
+chr1	19904	19936	a	a	+
+chr1	19904	19936	a	a	+
+chr1	19892	19924	b	b	-
+chr1	19896	19928	b	b	-
+chr1	19896	19928	b	b	-
+chr1	19909	19941	b	b	-
+chr1	19910	19942	b	b	-
+chr1	19911	19943	b	b	-
+chr1	19946	19978	a	a	+
+chr1	19918	19950	b	b	-
+chr1	19953	19985	a	a	+
+chr1	19932	19964	b	b	-
+chr1	19932	19964	b	b	-
+chr1	19969	20001	b	b	-
+chr1	20003	20035	a	a	+
+chr1	20003	20035	a	a	+
+chr1	20011	20043	a	a	+
+chr1	20021	20053	a	a	+
+chr1	20036	20068	a	a	+
+chr1	20042	20074	b	b	-
+chr1	20042	20074	b	b	-
+chr1	20048	20080	b	b	-
+chr1	20082	20114	a	a	+
+chr1	20082	20114	a	a	+
+chr1	20102	20134	a	a	+
+chr1	20107	20139	a	a	+
+chr1	20112	20144	a	a	+
+chr1	20087	20119	b	b	-
+chr1	20121	20153	a	a	+
+chr1	20108	20140	b	b	-
+chr1	20108	20140	b	b	-
+chr1	20151	20183	a	a	+
+chr1	20171	20203	a	a	+
+chr1	20141	20173	b	b	-
+chr1	20168	20200	b	b	-
+chr1	20182	20214	b	b	-
+chr1	20224	20256	a	a	+
+chr1	20243	20275	a	a	+
+chr1	20233	20265	b	b	-
+chr1	20236	20268	b	b	-
+chr1	20282	20314	a	a	+
+chr1	20254	20286	b	b	-
+chr1	20288	20320	a	a	+
+chr1	20288	20320	a	a	+
+chr1	20260	20292	b	b	-
+chr1	20297	20329	a	a	+
+chr1	20297	20329	a	a	+
+chr1	20308	20340	a	a	+
+chr1	20308	20340	a	a	+
+chr1	20287	20319	b	b	-
+chr1	20289	20321	b	b	-
+chr1	20295	20327	b	b	-
+chr1	20333	20365	a	a	+
+chr1	20339	20371	a	a	+
+chr1	20458	20490	a	a	+
+chr1	20460	20492	a	a	+
+chr1	20430	20462	b	b	-
+chr1	20446	20478	b	b	-
+chr1	20461	20493	b	b	-
+chr1	20494	20526	a	a	+
+chr1	20494	20526	a	a	+
+chr1	20462	20494	b	b	-
+chr1	20518	20550	a	a	+
+chr1	20527	20559	a	a	+
+chr1	20495	20527	b	b	-
+chr1	20498	20530	b	b	-
+chr1	20505	20537	b	b	-
+chr1	20506	20538	b	b	-
+chr1	20575	20607	a	a	+
+chr1	20552	20584	b	b	-
+chr1	20585	20617	a	a	+
+chr1	20572	20604	b	b	-
+chr1	20620	20652	a	a	+
+chr1	20593	20625	b	b	-
+chr1	20595	20627	b	b	-
+chr1	20597	20629	b	b	-
+chr1	20597	20629	b	b	-
+chr1	20599	20631	b	b	-
+chr1	20607	20639	b	b	-
+chr1	20641	20673	a	a	+
+chr1	20626	20658	b	b	-
+chr1	20673	20705	a	a	+
+chr1	20642	20674	b	b	-
+chr1	20680	20712	a	a	+
+chr1	20741	20773	a	a	+
+chr1	20754	20786	b	b	-
+chr1	20788	20820	a	a	+
+chr1	20788	20820	a	a	+
+chr1	20791	20823	a	a	+
+chr1	20797	20829	a	a	+
+chr1	20799	20831	a	a	+
+chr1	20799	20831	a	a	+
+chr1	20810	20842	a	a	+
+chr1	20779	20811	b	b	-
+chr1	20779	20811	b	b	-
+chr1	20779	20811	b	b	-
+chr1	20780	20812	b	b	-
+chr1	20814	20846	a	a	+
+chr1	20814	20846	a	a	+
+chr1	20815	20847	a	a	+
+chr1	20815	20847	a	a	+
+chr1	20815	20847	a	a	+
+chr1	20815	20847	a	a	+
+chr1	20787	20819	b	b	-
+chr1	20788	20820	b	b	-
+chr1	20822	20854	a	a	+
+chr1	20823	20855	a	a	+
+chr1	20823	20855	a	a	+
+chr1	20792	20824	b	b	-
+chr1	20792	20824	b	b	-
+chr1	20792	20824	b	b	-
+chr1	20825	20857	a	a	+
+chr1	20825	20857	a	a	+
+chr1	20826	20858	a	a	+
+chr1	20828	20860	a	a	+
+chr1	20829	20861	a	a	+
+chr1	20829	20861	a	a	+
+chr1	20799	20831	b	b	-
+chr1	20799	20831	b	b	-
+chr1	20799	20831	b	b	-
+chr1	20813	20845	b	b	-
+chr1	20848	20880	a	a	+
+chr1	20832	20864	b	b	-
+chr1	20904	20936	a	a	+
+chr1	21032	21064	b	b	-
+chr1	21195	21227	a	a	+
+chr1	21199	21231	a	a	+
+chr1	21187	21219	b	b	-
+chr1	21266	21298	b	b	-
+chr1	21301	21333	a	a	+
+chr1	21271	21303	b	b	-
+chr1	21283	21315	b	b	-
+chr1	21283	21315	b	b	-
+chr1	21315	21347	b	b	-
+chr1	21348	21380	a	a	+
+chr1	21335	21367	b	b	-
+chr1	21377	21409	a	a	+
+chr1	21377	21409	a	a	+
+chr1	21395	21427	a	a	+
+chr1	21396	21428	a	a	+
+chr1	21399	21431	a	a	+
+chr1	21399	21431	a	a	+
+chr1	21407	21439	a	a	+
+chr1	21376	21408	b	b	-
+chr1	21377	21409	b	b	-
+chr1	21381	21413	b	b	-
+chr1	21384	21416	b	b	-
+chr1	21418	21450	a	a	+
+chr1	21387	21419	b	b	-
+chr1	21396	21428	b	b	-
+chr1	21396	21428	b	b	-
+chr1	21439	21471	a	a	+
+chr1	21455	21487	a	a	+
+chr1	21463	21495	a	a	+
+chr1	21462	21494	b	b	-
+chr1	21508	21540	a	a	+
+chr1	21508	21540	a	a	+
+chr1	21518	21550	a	a	+
+chr1	21489	21521	b	b	-
+chr1	21489	21521	b	b	-
+chr1	21489	21521	b	b	-
+chr1	21531	21563	a	a	+
+chr1	21539	21571	a	a	+
+chr1	21566	21598	a	a	+
+chr1	21536	21568	b	b	-
+chr1	21570	21602	a	a	+
+chr1	21577	21609	a	a	+
+chr1	21569	21601	b	b	-
+chr1	21576	21608	b	b	-
+chr1	21641	21673	b	b	-
+chr1	21641	21673	b	b	-
+chr1	21641	21673	b	b	-
+chr1	21702	21734	a	a	+
+chr1	21702	21734	a	a	+
+chr1	21677	21709	b	b	-
+chr1	21677	21709	b	b	-
+chr1	21682	21714	b	b	-
+chr1	21683	21715	b	b	-
+chr1	21716	21748	a	a	+
+chr1	21716	21748	a	a	+
+chr1	21726	21758	a	a	+
+chr1	21727	21759	a	a	+
+chr1	21727	21759	a	a	+
+chr1	21696	21728	b	b	-
+chr1	21697	21729	b	b	-
+chr1	21697	21729	b	b	-
+chr1	21735	21767	a	a	+
+chr1	21704	21736	b	b	-
+chr1	21705	21737	b	b	-
+chr1	21705	21737	b	b	-
+chr1	21712	21744	b	b	-
+chr1	21721	21753	b	b	-
+chr1	21722	21754	b	b	-
+chr1	21725	21757	b	b	-
+chr1	21734	21766	b	b	-
+chr1	21742	21774	b	b	-
+chr1	21797	21829	b	b	-
+chr1	21797	21829	b	b	-
+chr1	21847	21879	a	a	+
+chr1	21847	21879	a	a	+
+chr1	21848	21880	a	a	+
+chr1	21863	21895	a	a	+
+chr1	21883	21915	a	a	+
+chr1	21854	21886	b	b	-
+chr1	21872	21904	b	b	-
+chr1	21914	21946	a	a	+
+chr1	21897	21929	b	b	-
+chr1	21897	21929	b	b	-
+chr1	21901	21933	b	b	-
+chr1	21938	21970	a	a	+
+chr1	21961	21993	b	b	-
+chr1	22006	22038	a	a	+
+chr1	22018	22050	b	b	-
+chr1	22069	22101	a	a	+
+chr1	22077	22109	a	a	+
+chr1	22080	22112	a	a	+
+chr1	22062	22094	b	b	-
+chr1	22117	22149	b	b	-
+chr1	22117	22149	b	b	-
+chr1	22154	22186	a	a	+
+chr1	22155	22187	a	a	+
+chr1	22161	22193	a	a	+
+chr1	22162	22194	a	a	+
+chr1	22132	22164	b	b	-
+chr1	22143	22175	b	b	-
+chr1	22166	22198	b	b	-
+chr1	22167	22199	b	b	-
+chr1	22215	22247	a	a	+
+chr1	22218	22250	a	a	+
+chr1	22238	22270	a	a	+
+chr1	22211	22243	b	b	-
+chr1	22247	22279	a	a	+
+chr1	22247	22279	a	a	+
+chr1	22258	22290	a	a	+
+chr1	22233	22265	b	b	-
+chr1	22271	22303	a	a	+
+chr1	22271	22303	a	a	+
+chr1	22253	22285	b	b	-
+chr1	22306	22338	b	b	-
+chr1	22306	22338	b	b	-
+chr1	22306	22338	b	b	-
+chr1	22315	22347	b	b	-
+chr1	22343	22375	b	b	-
+chr1	22541	22573	b	b	-
+chr1	22578	22610	a	a	+
+chr1	22582	22614	a	a	+
+chr1	22603	22635	a	a	+
+chr1	22582	22614	b	b	-
+chr1	22649	22681	b	b	-
+chr1	22649	22681	b	b	-
+chr1	22697	22729	a	a	+
+chr1	22681	22713	b	b	-
+chr1	22714	22746	a	a	+
+chr1	22714	22746	a	a	+
+chr1	22714	22746	a	a	+
+chr1	22715	22747	a	a	+
+chr1	22698	22730	b	b	-
+chr1	22731	22763	a	a	+
+chr1	22733	22765	a	a	+
+chr1	22736	22768	a	a	+
+chr1	22736	22768	a	a	+
+chr1	22736	22768	a	a	+
+chr1	22736	22768	a	a	+
+chr1	22736	22768	a	a	+
+chr1	22704	22736	b	b	-
+chr1	22738	22770	a	a	+
+chr1	22738	22770	a	a	+
+chr1	22709	22741	b	b	-
+chr1	22710	22742	b	b	-
+chr1	22744	22776	a	a	+
+chr1	22759	22791	a	a	+
+chr1	22765	22797	a	a	+
+chr1	22744	22776	b	b	-
+chr1	22779	22811	b	b	-
+chr1	22779	22811	b	b	-
+chr1	22835	22867	a	a	+
+chr1	22817	22849	b	b	-
+chr1	22915	22947	b	b	-
+chr1	22915	22947	b	b	-
+chr1	22951	22983	b	b	-
+chr1	23004	23036	a	a	+
+chr1	22973	23005	b	b	-
+chr1	23008	23040	a	a	+
+chr1	23008	23040	a	a	+
+chr1	23011	23043	a	a	+
+chr1	23011	23043	a	a	+
+chr1	22979	23011	b	b	-
+chr1	22984	23016	b	b	-
+chr1	23021	23053	a	a	+
+chr1	23023	23055	a	a	+
+chr1	23031	23063	a	a	+
+chr1	23031	23063	a	a	+
+chr1	23031	23063	a	a	+
+chr1	22999	23031	b	b	-
+chr1	23002	23034	b	b	-
+chr1	23002	23034	b	b	-
+chr1	23003	23035	b	b	-
+chr1	23005	23037	b	b	-
+chr1	23007	23039	b	b	-
+chr1	23019	23051	b	b	-
+chr1	23019	23051	b	b	-
+chr1	23055	23087	a	a	+
+chr1	23055	23087	a	a	+
+chr1	23057	23089	a	a	+
+chr1	23026	23058	b	b	-
+chr1	23026	23058	b	b	-
+chr1	23076	23108	a	a	+
+chr1	23094	23126	a	a	+
+chr1	23094	23126	a	a	+
+chr1	23143	23175	a	a	+
+chr1	23114	23146	b	b	-
+chr1	23114	23146	b	b	-
+chr1	23163	23195	a	a	+
+chr1	23131	23163	b	b	-
+chr1	23171	23203	a	a	+
+chr1	23169	23201	b	b	-
+chr1	23171	23203	b	b	-
+chr1	23171	23203	b	b	-
+chr1	23206	23238	a	a	+
+chr1	23211	23243	a	a	+
+chr1	23187	23219	b	b	-
+chr1	23226	23258	a	a	+
+chr1	23232	23264	a	a	+
+chr1	23242	23274	a	a	+
+chr1	23242	23274	a	a	+
+chr1	23211	23243	b	b	-
+chr1	23211	23243	b	b	-
+chr1	23247	23279	a	a	+
+chr1	23215	23247	b	b	-
+chr1	23219	23251	b	b	-
+chr1	23252	23284	a	a	+
+chr1	23220	23252	b	b	-
+chr1	23253	23285	a	a	+
+chr1	23259	23291	a	a	+
+chr1	23265	23297	a	a	+
+chr1	23362	23394	b	b	-
+chr1	23404	23436	a	a	+
+chr1	23417	23449	a	a	+
+chr1	23424	23456	a	a	+
+chr1	23424	23456	a	a	+
+chr1	23399	23431	b	b	-
+chr1	23400	23432	b	b	-
+chr1	23445	23477	a	a	+
+chr1	23448	23480	a	a	+
+chr1	23472	23504	a	a	+
+chr1	23475	23507	a	a	+
+chr1	23459	23491	b	b	-
+chr1	23459	23491	b	b	-
+chr1	23480	23512	b	b	-
+chr1	23486	23518	b	b	-
+chr1	23524	23556	a	a	+
+chr1	23534	23566	a	a	+
+chr1	23512	23544	b	b	-
+chr1	23512	23544	b	b	-
+chr1	23513	23545	b	b	-
+chr1	23562	23594	a	a	+
+chr1	23538	23570	b	b	-
+chr1	23578	23610	a	a	+
+chr1	23578	23610	a	a	+
+chr1	23553	23585	b	b	-
+chr1	23556	23588	b	b	-
+chr1	23557	23589	b	b	-
+chr1	23557	23589	b	b	-
+chr1	23560	23592	b	b	-
+chr1	23565	23597	b	b	-
+chr1	23604	23636	a	a	+
+chr1	23573	23605	b	b	-
+chr1	23609	23641	a	a	+
+chr1	23615	23647	a	a	+
+chr1	23592	23624	b	b	-
+chr1	23593	23625	b	b	-
+chr1	23627	23659	a	a	+
+chr1	23628	23660	a	a	+
+chr1	23838	23870	a	a	+
+chr1	23813	23845	b	b	-
+chr1	23987	24019	a	a	+
+chr1	23988	24020	a	a	+
+chr1	23958	23990	b	b	-
+chr1	23971	24003	b	b	-
+chr1	23971	24003	b	b	-
+chr1	23974	24006	b	b	-
+chr1	23974	24006	b	b	-
+chr1	23975	24007	b	b	-
+chr1	23975	24007	b	b	-
+chr1	23979	24011	b	b	-
+chr1	23983	24015	b	b	-
+chr1	23983	24015	b	b	-
+chr1	24028	24060	a	a	+
+chr1	24028	24060	a	a	+
+chr1	24000	24032	b	b	-
+chr1	24003	24035	b	b	-
+chr1	24018	24050	b	b	-
+chr1	24051	24083	a	a	+
+chr1	24019	24051	b	b	-
+chr1	24021	24053	b	b	-
+chr1	24061	24093	a	a	+
+chr1	24034	24066	b	b	-
+chr1	24037	24069	b	b	-
+chr1	24048	24080	b	b	-
+chr1	24050	24082	b	b	-
+chr1	24050	24082	b	b	-
+chr1	24050	24082	b	b	-
+chr1	24081	24113	b	b	-
+chr1	24099	24131	b	b	-
+chr1	24099	24131	b	b	-
+chr1	24133	24165	a	a	+
+chr1	24103	24135	b	b	-
+chr1	24120	24152	b	b	-
+chr1	24154	24186	a	a	+
+chr1	24154	24186	a	a	+
+chr1	24126	24158	b	b	-
+chr1	24162	24194	a	a	+
+chr1	24131	24163	b	b	-
+chr1	24170	24202	a	a	+
+chr1	24173	24205	a	a	+
+chr1	24173	24205	a	a	+
+chr1	24144	24176	b	b	-
+chr1	24182	24214	a	a	+
+chr1	24185	24217	a	a	+
+chr1	24157	24189	b	b	-
+chr1	24162	24194	b	b	-
+chr1	24163	24195	b	b	-
+chr1	24163	24195	b	b	-
+chr1	24163	24195	b	b	-
+chr1	24166	24198	b	b	-
+chr1	24200	24232	a	a	+
+chr1	24230	24262	a	a	+
+chr1	24290	24322	a	a	+
+chr1	24260	24292	b	b	-
+chr1	24307	24339	a	a	+
+chr1	24309	24341	a	a	+
+chr1	24279	24311	b	b	-
+chr1	24296	24328	b	b	-
+chr1	24296	24328	b	b	-
+chr1	24330	24362	a	a	+
+chr1	24332	24364	a	a	+
+chr1	24335	24367	a	a	+
+chr1	24305	24337	b	b	-
+chr1	24311	24343	b	b	-
+chr1	24311	24343	b	b	-
+chr1	24358	24390	a	a	+
+chr1	24326	24358	b	b	-
+chr1	24362	24394	a	a	+
+chr1	24369	24401	a	a	+
+chr1	24337	24369	b	b	-
+chr1	24371	24403	a	a	+
+chr1	24344	24376	b	b	-
+chr1	24377	24409	a	a	+
+chr1	24346	24378	b	b	-
+chr1	24400	24432	a	a	+
+chr1	24401	24433	b	b	-
+chr1	24417	24449	b	b	-
+chr1	24481	24513	a	a	+
+chr1	24489	24521	a	a	+
+chr1	24469	24501	b	b	-
+chr1	24506	24538	a	a	+
+chr1	24507	24539	a	a	+
+chr1	24508	24540	a	a	+
+chr1	24514	24546	a	a	+
+chr1	24514	24546	a	a	+
+chr1	24482	24514	b	b	-
+chr1	24526	24558	a	a	+
+chr1	24530	24562	a	a	+
+chr1	24530	24562	a	a	+
+chr1	24530	24562	a	a	+
+chr1	24499	24531	b	b	-
+chr1	24532	24564	a	a	+
+chr1	24500	24532	b	b	-
+chr1	24516	24548	b	b	-
+chr1	24519	24551	b	b	-
+chr1	24584	24616	a	a	+
+chr1	24609	24641	a	a	+
+chr1	24678	24710	a	a	+
+chr1	24683	24715	a	a	+
+chr1	24686	24718	a	a	+
+chr1	24713	24745	a	a	+
+chr1	24725	24757	a	a	+
+chr1	24725	24757	a	a	+
+chr1	24693	24725	b	b	-
+chr1	24785	24817	a	a	+
+chr1	24792	24824	a	a	+
+chr1	24797	24829	a	a	+
+chr1	24791	24823	b	b	-
+chr1	24791	24823	b	b	-
+chr1	24844	24876	a	a	+
+chr1	24848	24880	a	a	+
+chr1	24831	24863	b	b	-
+chr1	24869	24901	a	a	+
+chr1	24841	24873	b	b	-
+chr1	24876	24908	a	a	+
+chr1	24877	24909	a	a	+
+chr1	24877	24909	a	a	+
+chr1	24846	24878	b	b	-
+chr1	24846	24878	b	b	-
+chr1	24847	24879	b	b	-
+chr1	24847	24879	b	b	-
+chr1	24847	24879	b	b	-
+chr1	24881	24913	a	a	+
+chr1	24881	24913	a	a	+
+chr1	24884	24916	a	a	+
+chr1	24884	24916	a	a	+
+chr1	24884	24916	a	a	+
+chr1	24896	24928	a	a	+
+chr1	24864	24896	b	b	-
+chr1	24899	24931	a	a	+
+chr1	24868	24900	b	b	-
+chr1	24868	24900	b	b	-
+chr1	24868	24900	b	b	-
+chr1	24870	24902	b	b	-
+chr1	24879	24911	b	b	-
+chr1	24912	24944	a	a	+
+chr1	24890	24922	b	b	-
+chr1	24897	24929	b	b	-
+chr1	24897	24929	b	b	-
+chr1	24897	24929	b	b	-
+chr1	24898	24930	b	b	-
+chr1	24910	24942	b	b	-
+chr1	24945	24977	b	b	-
+chr1	24980	25012	a	a	+
+chr1	25009	25041	b	b	-
+chr1	25046	25078	a	a	+
+chr1	25046	25078	a	a	+
+chr1	25046	25078	a	a	+
+chr1	25046	25078	a	a	+
+chr1	25033	25065	b	b	-
+chr1	25033	25065	b	b	-
+chr1	25033	25065	b	b	-
+chr1	25037	25069	b	b	-
+chr1	25037	25069	b	b	-
+chr1	25073	25105	a	a	+
+chr1	25075	25107	a	a	+
+chr1	25084	25116	a	a	+
+chr1	25058	25090	b	b	-
+chr1	25094	25126	a	a	+
+chr1	25066	25098	b	b	-
+chr1	25085	25117	b	b	-
+chr1	25097	25129	b	b	-
+chr1	25235	25267	a	a	+
+chr1	25373	25405	a	a	+
+chr1	25373	25405	a	a	+
+chr1	25394	25426	a	a	+
+chr1	25377	25409	b	b	-
+chr1	25443	25475	a	a	+
+chr1	25449	25481	a	a	+
+chr1	25437	25469	b	b	-
+chr1	25470	25502	a	a	+
+chr1	25476	25508	a	a	+
+chr1	25454	25486	b	b	-
+chr1	25500	25532	a	a	+
+chr1	25470	25502	b	b	-
+chr1	25550	25582	a	a	+
+chr1	25558	25590	a	a	+
+chr1	25528	25560	b	b	-
+chr1	25572	25604	a	a	+
+chr1	25542	25574	b	b	-
+chr1	25557	25589	b	b	-
+chr1	25601	25633	a	a	+
+chr1	25572	25604	b	b	-
+chr1	25575	25607	b	b	-
+chr1	25575	25607	b	b	-
+chr1	25609	25641	a	a	+
+chr1	25587	25619	b	b	-
+chr1	25633	25665	a	a	+
+chr1	25613	25645	b	b	-
+chr1	25617	25649	b	b	-
+chr1	25641	25673	b	b	-
+chr1	25682	25714	a	a	+
+chr1	25650	25682	b	b	-
+chr1	25686	25718	a	a	+
+chr1	25659	25691	b	b	-
+chr1	25693	25725	a	a	+
+chr1	25703	25735	a	a	+
+chr1	25675	25707	b	b	-
+chr1	25681	25713	b	b	-
+chr1	25734	25766	a	a	+
+chr1	25710	25742	b	b	-
+chr1	25748	25780	a	a	+
+chr1	25748	25780	a	a	+
+chr1	25748	25780	a	a	+
+chr1	25720	25752	b	b	-
+chr1	25765	25797	a	a	+
+chr1	25765	25797	a	a	+
+chr1	25769	25801	a	a	+
+chr1	25773	25805	a	a	+
+chr1	25748	25780	b	b	-
+chr1	25792	25824	a	a	+
+chr1	25792	25824	a	a	+
+chr1	25797	25829	a	a	+
+chr1	25767	25799	b	b	-
+chr1	25767	25799	b	b	-
+chr1	25776	25808	b	b	-
+chr1	25779	25811	b	b	-
+chr1	25824	25856	a	a	+
+chr1	25828	25860	a	a	+
+chr1	25832	25864	a	a	+
+chr1	25835	25867	a	a	+
+chr1	25810	25842	b	b	-
+chr1	25816	25848	b	b	-
+chr1	25845	25877	b	b	-
+chr1	25887	25919	a	a	+
+chr1	25887	25919	a	a	+
+chr1	25887	25919	a	a	+
+chr1	25855	25887	b	b	-
+chr1	25908	25940	a	a	+
+chr1	25883	25915	b	b	-
+chr1	25927	25959	a	a	+
+chr1	25927	25959	a	a	+
+chr1	25932	25964	a	a	+
+chr1	25904	25936	b	b	-
+chr1	25904	25936	b	b	-
+chr1	25911	25943	b	b	-
+chr1	25914	25946	b	b	-
+chr1	25959	25991	a	a	+
+chr1	25963	25995	a	a	+
+chr1	25967	25999	a	a	+
+chr1	25970	26002	a	a	+
+chr1	25945	25977	b	b	-
+chr1	25951	25983	b	b	-
+chr1	25954	25986	b	b	-
+chr1	25954	25986	b	b	-
+chr1	25980	26012	b	b	-
+chr1	26022	26054	a	a	+
+chr1	26022	26054	a	a	+
+chr1	26022	26054	a	a	+
+chr1	25990	26022	b	b	-
+chr1	26000	26032	b	b	-
+chr1	26035	26067	a	a	+
+chr1	26039	26071	a	a	+
+chr1	26039	26071	a	a	+
+chr1	26043	26075	a	a	+
+chr1	26046	26078	a	a	+
+chr1	26018	26050	b	b	-
+chr1	26062	26094	a	a	+
+chr1	26062	26094	a	a	+
+chr1	26067	26099	a	a	+
+chr1	26039	26071	b	b	-
+chr1	26039	26071	b	b	-
+chr1	26046	26078	b	b	-
+chr1	26094	26126	a	a	+
+chr1	26098	26130	a	a	+
+chr1	26102	26134	a	a	+
+chr1	26105	26137	a	a	+
+chr1	26078	26110	b	b	-
+chr1	26086	26118	b	b	-
+chr1	26089	26121	b	b	-
+chr1	26089	26121	b	b	-
+chr1	26090	26122	b	b	-
+chr1	26115	26147	b	b	-
+chr1	26157	26189	a	a	+
+chr1	26157	26189	a	a	+
+chr1	26157	26189	a	a	+
+chr1	26125	26157	b	b	-
+chr1	26135	26167	b	b	-
+chr1	26170	26202	a	a	+
+chr1	26174	26206	a	a	+
+chr1	26174	26206	a	a	+
+chr1	26178	26210	a	a	+
+chr1	26181	26213	a	a	+
+chr1	26153	26185	b	b	-
+chr1	26197	26229	a	a	+
+chr1	26197	26229	a	a	+
+chr1	26202	26234	a	a	+
+chr1	26174	26206	b	b	-
+chr1	26174	26206	b	b	-
+chr1	26181	26213	b	b	-
+chr1	26229	26261	a	a	+
+chr1	26233	26265	a	a	+
+chr1	26237	26269	a	a	+
+chr1	26246	26278	a	a	+
+chr1	26215	26247	b	b	-
+chr1	26221	26253	b	b	-
+chr1	26250	26282	b	b	-
+chr1	26292	26324	a	a	+
+chr1	26292	26324	a	a	+
+chr1	26292	26324	a	a	+
+chr1	26260	26292	b	b	-
+chr1	26305	26337	a	a	+
+chr1	26309	26341	a	a	+
+chr1	26309	26341	a	a	+
+chr1	26313	26345	a	a	+
+chr1	26286	26318	b	b	-
+chr1	26332	26364	a	a	+
+chr1	26332	26364	a	a	+
+chr1	26337	26369	a	a	+
+chr1	26307	26339	b	b	-
+chr1	26307	26339	b	b	-
+chr1	26316	26348	b	b	-
+chr1	26319	26351	b	b	-
+chr1	26364	26396	a	a	+
+chr1	26368	26400	a	a	+
+chr1	26372	26404	a	a	+
+chr1	26375	26407	a	a	+
+chr1	26350	26382	b	b	-
+chr1	26356	26388	b	b	-
+chr1	26385	26417	b	b	-
+chr1	26427	26459	a	a	+
+chr1	26427	26459	a	a	+
+chr1	26427	26459	a	a	+
+chr1	26395	26427	b	b	-
+chr1	26448	26480	a	a	+
+chr1	26421	26453	b	b	-
+chr1	26467	26499	a	a	+
+chr1	26467	26499	a	a	+
+chr1	26472	26504	a	a	+
+chr1	26444	26476	b	b	-
+chr1	26444	26476	b	b	-
+chr1	26444	26476	b	b	-
+chr1	26499	26531	a	a	+
+chr1	26503	26535	a	a	+
+chr1	26507	26539	a	a	+
+chr1	26510	26542	a	a	+
+chr1	26485	26517	b	b	-
+chr1	26491	26523	b	b	-
+chr1	26520	26552	b	b	-
+chr1	26562	26594	a	a	+
+chr1	26562	26594	a	a	+
+chr1	26562	26594	a	a	+
+chr1	26530	26562	b	b	-
+chr1	26575	26607	a	a	+
+chr1	26583	26615	a	a	+
+chr1	26556	26588	b	b	-
+chr1	26602	26634	a	a	+
+chr1	26602	26634	a	a	+
+chr1	26607	26639	a	a	+
+chr1	26579	26611	b	b	-
+chr1	26579	26611	b	b	-
+chr1	26579	26611	b	b	-
+chr1	26632	26664	a	a	+
+chr1	26638	26670	a	a	+
+chr1	26642	26674	a	a	+
+chr1	26645	26677	a	a	+
+chr1	26620	26652	b	b	-
+chr1	26626	26658	b	b	-
+chr1	26655	26687	b	b	-
+chr1	26697	26729	a	a	+
+chr1	26697	26729	a	a	+
+chr1	26697	26729	a	a	+
+chr1	26665	26697	b	b	-
+chr1	26710	26742	a	a	+
+chr1	26718	26750	a	a	+
+chr1	26691	26723	b	b	-
+chr1	26737	26769	a	a	+
+chr1	26737	26769	a	a	+
+chr1	26742	26774	a	a	+
+chr1	26714	26746	b	b	-
+chr1	26714	26746	b	b	-
+chr1	26714	26746	b	b	-
+chr1	26767	26799	a	a	+
+chr1	26773	26805	a	a	+
+chr1	26777	26809	a	a	+
+chr1	26780	26812	a	a	+
+chr1	26753	26785	b	b	-
+chr1	26761	26793	b	b	-
+chr1	26764	26796	b	b	-
+chr1	26790	26822	b	b	-
+chr1	26796	26828	b	b	-
+chr1	26832	26864	a	a	+
+chr1	26832	26864	a	a	+
+chr1	26832	26864	a	a	+
+chr1	26845	26877	a	a	+
+chr1	26853	26885	a	a	+
+chr1	26872	26904	a	a	+
+chr1	26872	26904	a	a	+
+chr1	26877	26909	a	a	+
+chr1	26849	26881	b	b	-
+chr1	26849	26881	b	b	-
+chr1	26902	26934	a	a	+
+chr1	26912	26944	a	a	+
+chr1	26896	26928	b	b	-
+chr1	26899	26931	b	b	-
+chr1	26907	26939	b	b	-
+chr1	26967	26999	a	a	+
+chr1	26967	26999	a	a	+
+chr1	26967	26999	a	a	+
+chr1	26935	26967	b	b	-
+chr1	26980	27012	a	a	+
+chr1	26988	27020	a	a	+
+chr1	27000	27032	a	a	+
+chr1	27003	27035	a	a	+
+chr1	26994	27026	b	b	-
+chr1	26994	27026	b	b	-
+chr1	26994	27026	b	b	-
+chr1	26997	27029	b	b	-
+chr1	27037	27069	a	a	+
+chr1	27047	27079	a	a	+
+chr1	27031	27063	b	b	-
+chr1	27034	27066	b	b	-
+chr1	27034	27066	b	b	-
+chr1	27034	27066	b	b	-
+chr1	27035	27067	b	b	-
+chr1	27081	27113	a	a	+
+chr1	27096	27128	a	a	+
+chr1	27115	27147	a	a	+
+chr1	27119	27151	a	a	+
+chr1	27123	27155	a	a	+
+chr1	27103	27135	b	b	-
+chr1	27103	27135	b	b	-
+chr1	27165	27197	a	a	+
+chr1	27304	27336	a	a	+
+chr1	27292	27324	b	b	-
+chr1	27317	27349	b	b	-
+chr1	27412	27444	a	a	+
+chr1	27446	27478	b	b	-
+chr1	27452	27484	b	b	-
+chr1	27522	27554	a	a	+
+chr1	27511	27543	b	b	-
+chr1	27554	27586	a	a	+
+chr1	27554	27586	a	a	+
+chr1	27534	27566	b	b	-
+chr1	27618	27650	b	b	-
+chr1	27674	27706	b	b	-
+chr1	27674	27706	b	b	-
+chr1	27742	27774	a	a	+
+chr1	27807	27839	b	b	-
+chr1	27869	27901	a	a	+
+chr1	27905	27937	b	b	-
+chr1	28276	28308	b	b	-
+chr1	28471	28503	a	a	+
+chr1	28492	28524	a	a	+
+chr1	28498	28530	a	a	+
+chr1	28502	28534	a	a	+
+chr1	28506	28538	a	a	+
+chr1	28507	28539	a	a	+
+chr1	28479	28511	b	b	-
+chr1	28769	28801	a	a	+
+chr1	28799	28831	a	a	+
+chr1	28792	28824	b	b	-
+chr1	28869	28901	a	a	+
+chr1	28847	28879	b	b	-
+chr1	28941	28973	a	a	+
+chr1	28942	28974	a	a	+
+chr1	29309	29341	b	b	-
+chr1	29359	29391	a	a	+
+chr1	29375	29407	a	a	+
+chr1	29467	29499	b	b	-
+chr1	29513	29545	a	a	+
+chr1	29548	29580	b	b	-
+chr1	29668	29700	a	a	+
+chr1	29668	29700	a	a	+
+chr1	29676	29708	a	a	+
+chr1	29649	29681	b	b	-
+chr1	29693	29725	a	a	+
+chr1	29696	29728	a	a	+
+chr1	29696	29728	a	a	+
+chr1	29696	29728	a	a	+
+chr1	29696	29728	a	a	+
+chr1	29669	29701	b	b	-
+chr1	29670	29702	b	b	-
+chr1	29670	29702	b	b	-
+chr1	29671	29703	b	b	-
+chr1	29709	29741	a	a	+
+chr1	29709	29741	a	a	+
+chr1	29709	29741	a	a	+
+chr1	29713	29745	a	a	+
+chr1	29715	29747	a	a	+
+chr1	29684	29716	b	b	-
+chr1	29719	29751	a	a	+
+chr1	29721	29753	a	a	+
+chr1	29723	29755	a	a	+
+chr1	29924	29956	b	b	-
+chr1	30001	30033	b	b	-
+chr1	30134	30166	b	b	-
+chr1	30187	30219	b	b	-
+chr1	30289	30321	a	a	+
+chr1	30293	30325	a	a	+
+chr1	30379	30411	a	a	+
+chr1	30359	30391	b	b	-
+chr1	30359	30391	b	b	-
+chr1	30377	30409	b	b	-
+chr1	30398	30430	b	b	-
+chr1	30454	30486	a	a	+
+chr1	30432	30464	b	b	-
+chr1	30488	30520	a	a	+
+chr1	30488	30520	a	a	+
+chr1	30629	30661	b	b	-
+chr1	30662	30694	a	a	+
+chr1	30662	30694	a	a	+
+chr1	30700	30732	a	a	+
+chr1	30675	30707	b	b	-
+chr1	30715	30747	a	a	+
+chr1	30893	30925	a	a	+
+chr1	30861	30893	b	b	-
+chr1	30861	30893	b	b	-
+chr1	30894	30926	a	a	+
+chr1	30894	30926	a	a	+
+chr1	31097	31129	a	a	+
+chr1	31097	31129	a	a	+
+chr1	31143	31175	b	b	-
+chr1	31216	31248	a	a	+
+chr1	31216	31248	a	a	+
+chr1	31327	31359	b	b	-
+chr1	31368	31400	a	a	+
+chr1	31337	31369	b	b	-
+chr1	31368	31400	b	b	-
+chr1	31510	31542	b	b	-
+chr1	31515	31547	b	b	-
+chr1	31515	31547	b	b	-
+chr1	31522	31554	b	b	-
+chr1	31583	31615	a	a	+
+chr1	31589	31621	a	a	+
+chr1	31673	31705	b	b	-
+chr1	31735	31767	a	a	+
+chr1	31736	31768	a	a	+
+chr1	31736	31768	a	a	+
+chr1	31752	31784	a	a	+
+chr1	31767	31799	a	a	+
+chr1	31779	31811	a	a	+
+chr1	31811	31843	a	a	+
+chr1	31814	31846	a	a	+
+chr1	31822	31854	a	a	+
+chr1	31822	31854	a	a	+
+chr1	31837	31869	a	a	+
+chr1	31843	31875	b	b	-
+chr1	31903	31935	a	a	+
+chr1	31925	31957	a	a	+
+chr1	31933	31965	a	a	+
+chr1	31915	31947	b	b	-
+chr1	31959	31991	a	a	+
+chr1	31963	31995	b	b	-
+chr1	32011	32043	a	a	+
+chr1	32067	32099	a	a	+
+chr1	32054	32086	b	b	-
+chr1	32096	32128	a	a	+
+chr1	32096	32128	a	a	+
+chr1	32101	32133	a	a	+
+chr1	32152	32184	a	a	+
+chr1	32155	32187	b	b	-
+chr1	32155	32187	b	b	-
+chr1	32200	32232	b	b	-
+chr1	32200	32232	b	b	-
+chr1	32237	32269	a	a	+
+chr1	32223	32255	b	b	-
+chr1	32267	32299	a	a	+
+chr1	32267	32299	a	a	+
+chr1	32278	32310	a	a	+
+chr1	32316	32348	a	a	+
+chr1	32341	32373	b	b	-
+chr1	32378	32410	b	b	-
+chr1	32412	32444	a	a	+
+chr1	32412	32444	a	a	+
+chr1	32445	32477	b	b	-
+chr1	32460	32492	b	b	-
+chr1	32460	32492	b	b	-
+chr1	32494	32526	a	a	+
+chr1	32497	32529	a	a	+
+chr1	32502	32534	a	a	+
+chr1	32503	32535	a	a	+
+chr1	32505	32537	a	a	+
+chr1	32514	32546	a	a	+
+chr1	32482	32514	b	b	-
+chr1	32518	32550	a	a	+
+chr1	32486	32518	b	b	-
+chr1	32524	32556	a	a	+
+chr1	32521	32553	b	b	-
+chr1	32543	32575	b	b	-
+chr1	32548	32580	b	b	-
+chr1	32575	32607	b	b	-
+chr1	32575	32607	b	b	-
+chr1	32647	32679	a	a	+
+chr1	32695	32727	a	a	+
+chr1	32697	32729	a	a	+
+chr1	32709	32741	a	a	+
+chr1	32718	32750	a	a	+
+chr1	32739	32771	a	a	+
+chr1	32739	32771	a	a	+
+chr1	32739	32771	a	a	+
+chr1	32744	32776	a	a	+
+chr1	32854	32886	b	b	-
+chr1	32888	32920	a	a	+
+chr1	32858	32890	b	b	-
+chr1	32861	32893	b	b	-
+chr1	32863	32895	b	b	-
+chr1	32864	32896	b	b	-
+chr1	32864	32896	b	b	-
+chr1	32864	32896	b	b	-
+chr1	32902	32934	a	a	+
+chr1	32902	32934	a	a	+
+chr1	32876	32908	b	b	-
+chr1	32921	32953	a	a	+
+chr1	32889	32921	b	b	-
+chr1	32922	32954	a	a	+
+chr1	32922	32954	a	a	+
+chr1	32925	32957	a	a	+
+chr1	32926	32958	a	a	+
+chr1	32926	32958	a	a	+
+chr1	32926	32958	a	a	+
+chr1	33127	33159	b	b	-
+chr1	33157	33189	b	b	-
+chr1	33165	33197	b	b	-
+chr1	33165	33197	b	b	-
+chr1	33165	33197	b	b	-
+chr1	33166	33198	b	b	-
+chr1	33199	33231	a	a	+
+chr1	33207	33239	a	a	+
+chr1	33210	33242	a	a	+
+chr1	33210	33242	a	a	+
+chr1	33178	33210	b	b	-
+chr1	33212	33244	a	a	+
+chr1	33212	33244	a	a	+
+chr1	33181	33213	b	b	-
+chr1	33182	33214	b	b	-
+chr1	33182	33214	b	b	-
+chr1	33182	33214	b	b	-
+chr1	33218	33250	a	a	+
+chr1	33218	33250	a	a	+
+chr1	33218	33250	a	a	+
+chr1	33218	33250	a	a	+
+chr1	33190	33222	b	b	-
+chr1	33192	33224	b	b	-
+chr1	33230	33262	a	a	+
+chr1	33230	33262	a	a	+
+chr1	33206	33238	b	b	-
+chr1	33206	33238	b	b	-
+chr1	33239	33271	a	a	+
+chr1	33210	33242	b	b	-
+chr1	33245	33277	a	a	+
+chr1	33245	33277	a	a	+
+chr1	33246	33278	a	a	+
+chr1	33246	33278	a	a	+
+chr1	33253	33285	a	a	+
+chr1	33222	33254	b	b	-
+chr1	33236	33268	b	b	-
+chr1	33269	33301	a	a	+
+chr1	33237	33269	b	b	-
+chr1	33265	33297	b	b	-
+chr1	33523	33555	b	b	-
+chr1	33563	33595	a	a	+
+chr1	33575	33607	a	a	+
+chr1	33565	33597	b	b	-
+chr1	33721	33753	a	a	+
+chr1	33727	33759	a	a	+
+chr1	33709	33741	b	b	-
+chr1	33759	33791	a	a	+
+chr1	33739	33771	b	b	-
+chr1	33875	33907	a	a	+
+chr1	33878	33910	b	b	-
+chr1	33996	34028	b	b	-
+chr1	34040	34072	a	a	+
+chr1	34009	34041	b	b	-
+chr1	34026	34058	b	b	-
+chr1	34109	34141	a	a	+
+chr1	34165	34197	a	a	+
+chr1	34178	34210	a	a	+
+chr1	34298	34330	a	a	+
+chr1	34314	34346	a	a	+
+chr1	34295	34327	b	b	-
+chr1	34372	34404	a	a	+
+chr1	34392	34424	a	a	+
+chr1	34418	34450	a	a	+
+chr1	34443	34475	a	a	+
+chr1	34422	34454	b	b	-
+chr1	34473	34505	a	a	+
+chr1	34473	34505	a	a	+
+chr1	34603	34635	b	b	-
+chr1	34647	34679	b	b	-
+chr1	34701	34733	a	a	+
+chr1	34721	34753	a	a	+
+chr1	34721	34753	a	a	+
+chr1	34721	34753	a	a	+
+chr1	34690	34722	b	b	-
+chr1	34736	34768	b	b	-
+chr1	34813	34845	b	b	-
+chr1	34833	34865	b	b	-
+chr1	34837	34869	b	b	-
+chr1	34881	34913	a	a	+
+chr1	34881	34913	a	a	+
+chr1	34881	34913	a	a	+
+chr1	34881	34913	a	a	+
+chr1	34973	35005	a	a	+
+chr1	34991	35023	a	a	+
+chr1	34992	35024	a	a	+
+chr1	34992	35024	a	a	+
+chr1	34964	34996	b	b	-
+chr1	34969	35001	b	b	-
+chr1	35010	35042	b	b	-
+chr1	35051	35083	a	a	+
+chr1	35027	35059	b	b	-
+chr1	35030	35062	b	b	-
+chr1	35171	35203	a	a	+
+chr1	35171	35203	a	a	+
+chr1	35171	35203	a	a	+
+chr1	35194	35226	a	a	+
+chr1	35215	35247	a	a	+
+chr1	35186	35218	b	b	-
+chr1	35187	35219	b	b	-
+chr1	35230	35262	a	a	+
+chr1	35200	35232	b	b	-
+chr1	35200	35232	b	b	-
+chr1	35200	35232	b	b	-
+chr1	35200	35232	b	b	-
+chr1	35204	35236	b	b	-
+chr1	35239	35271	a	a	+
+chr1	35212	35244	b	b	-
+chr1	35221	35253	b	b	-
+chr1	35221	35253	b	b	-
+chr1	35316	35348	b	b	-
+chr1	35401	35433	a	a	+
+chr1	35415	35447	a	a	+
+chr1	35462	35494	a	a	+
+chr1	35550	35582	a	a	+
+chr1	35534	35566	b	b	-
+chr1	35538	35570	b	b	-
+chr1	35586	35618	a	a	+
+chr1	35560	35592	b	b	-
+chr1	35603	35635	a	a	+
+chr1	35681	35713	a	a	+
+chr1	35659	35691	b	b	-
+chr1	35666	35698	b	b	-
+chr1	35667	35699	b	b	-
+chr1	35669	35701	b	b	-
+chr1	35673	35705	b	b	-
+chr1	35673	35705	b	b	-
+chr1	35673	35705	b	b	-
+chr1	35712	35744	a	a	+
+chr1	35726	35758	a	a	+
+chr1	35823	35855	b	b	-
+chr1	35823	35855	b	b	-
+chr1	35823	35855	b	b	-
+chr1	35823	35855	b	b	-
+chr1	35971	36003	a	a	+
+chr1	36114	36146	b	b	-
+chr1	36126	36158	b	b	-
+chr1	36184	36216	a	a	+
+chr1	36241	36273	b	b	-
+chr1	36295	36327	a	a	+
+chr1	36295	36327	a	a	+
+chr1	36301	36333	a	a	+
+chr1	36301	36333	a	a	+
+chr1	36276	36308	b	b	-
+chr1	36312	36344	a	a	+
+chr1	36312	36344	a	a	+
+chr1	36322	36354	a	a	+
+chr1	36311	36343	b	b	-
+chr1	36512	36544	b	b	-
+chr1	36571	36603	a	a	+
+chr1	36541	36573	b	b	-
+chr1	36541	36573	b	b	-
+chr1	36542	36574	b	b	-
+chr1	36542	36574	b	b	-
+chr1	36547	36579	b	b	-
+chr1	36550	36582	b	b	-
+chr1	36584	36616	a	a	+
+chr1	36586	36618	a	a	+
+chr1	36586	36618	a	a	+
+chr1	36554	36586	b	b	-
+chr1	36556	36588	b	b	-
+chr1	36556	36588	b	b	-
+chr1	36556	36588	b	b	-
+chr1	36556	36588	b	b	-
+chr1	36559	36591	b	b	-
+chr1	36559	36591	b	b	-
+chr1	36559	36591	b	b	-
+chr1	36559	36591	b	b	-
+chr1	36559	36591	b	b	-
+chr1	36559	36591	b	b	-
+chr1	36563	36595	b	b	-
+chr1	36569	36601	b	b	-
+chr1	36605	36637	a	a	+
+chr1	36605	36637	a	a	+
+chr1	36576	36608	b	b	-
+chr1	36609	36641	a	a	+
+chr1	36581	36613	b	b	-
+chr1	36622	36654	a	a	+
+chr1	36708	36740	b	b	-
+chr1	36708	36740	b	b	-
+chr1	36716	36748	b	b	-
+chr1	36750	36782	a	a	+
+chr1	36837	36869	b	b	-
+chr1	36849	36881	b	b	-
+chr1	36850	36882	b	b	-
+chr1	36932	36964	a	a	+
+chr1	37003	37035	a	a	+
+chr1	37159	37191	a	a	+
+chr1	37191	37223	a	a	+
+chr1	37375	37407	b	b	-
+chr1	37377	37409	b	b	-
+chr1	37433	37465	a	a	+
+chr1	37434	37466	a	a	+
+chr1	37405	37437	b	b	-
+chr1	37441	37473	a	a	+
+chr1	37441	37473	a	a	+
+chr1	37441	37473	a	a	+
+chr1	37447	37479	a	a	+
+chr1	37450	37482	a	a	+
+chr1	37419	37451	b	b	-
+chr1	37458	37490	a	a	+
+chr1	37427	37459	b	b	-
+chr1	37427	37459	b	b	-
+chr1	37427	37459	b	b	-
+chr1	37432	37464	b	b	-
+chr1	37436	37468	b	b	-
+chr1	37436	37468	b	b	-
+chr1	37436	37468	b	b	-
+chr1	37437	37469	b	b	-
+chr1	37469	37501	b	b	-
+chr1	37504	37536	a	a	+
+chr1	37542	37574	b	b	-
+chr1	37569	37601	b	b	-
+chr1	37607	37639	a	a	+
+chr1	37621	37653	a	a	+
+chr1	37596	37628	b	b	-
+chr1	37596	37628	b	b	-
+chr1	37603	37635	b	b	-
+chr1	37608	37640	b	b	-
+chr1	37608	37640	b	b	-
+chr1	37655	37687	a	a	+
+chr1	37655	37687	a	a	+
+chr1	37627	37659	b	b	-
+chr1	37627	37659	b	b	-
+chr1	37663	37695	a	a	+
+chr1	37663	37695	a	a	+
+chr1	37666	37698	a	a	+
+chr1	37666	37698	a	a	+
+chr1	37638	37670	b	b	-
+chr1	37638	37670	b	b	-
+chr1	37702	37734	b	b	-
+chr1	37755	37787	b	b	-
+chr1	37771	37803	b	b	-
+chr1	37771	37803	b	b	-
+chr1	37849	37881	a	a	+
+chr1	37835	37867	b	b	-
+chr1	37888	37920	a	a	+
+chr1	37889	37921	b	b	-
+chr1	37967	37999	a	a	+
+chr1	38122	38154	a	a	+
+chr1	38281	38313	a	a	+
+chr1	38291	38323	a	a	+
+chr1	38277	38309	b	b	-
+chr1	38277	38309	b	b	-
+chr1	38311	38343	a	a	+
+chr1	38642	38674	a	a	+
+chr1	38622	38654	b	b	-
+chr1	38685	38717	b	b	-
+chr1	38784	38816	a	a	+
+chr1	38770	38802	b	b	-
+chr1	38814	38846	a	a	+
+chr1	38814	38846	a	a	+
+chr1	38782	38814	b	b	-
+chr1	38965	38997	a	a	+
+chr1	38965	38997	a	a	+
+chr1	38965	38997	a	a	+
+chr1	38967	38999	a	a	+
+chr1	38942	38974	b	b	-
+chr1	38982	39014	a	a	+
+chr1	38983	39015	a	a	+
+chr1	39199	39231	b	b	-
+chr1	39232	39264	a	a	+
+chr1	39232	39264	a	a	+
+chr1	39208	39240	b	b	-
+chr1	39243	39275	a	a	+
+chr1	39243	39275	a	a	+
+chr1	39212	39244	b	b	-
+chr1	39212	39244	b	b	-
+chr1	39246	39278	a	a	+
+chr1	39249	39281	a	a	+
+chr1	39222	39254	b	b	-
+chr1	39223	39255	b	b	-
+chr1	39229	39261	b	b	-
+chr1	39229	39261	b	b	-
+chr1	39229	39261	b	b	-
+chr1	39229	39261	b	b	-
+chr1	39229	39261	b	b	-
+chr1	39230	39262	b	b	-
+chr1	39263	39295	a	a	+
+chr1	39263	39295	a	a	+
+chr1	39231	39263	b	b	-
+chr1	39231	39263	b	b	-
+chr1	39231	39263	b	b	-
+chr1	39265	39297	a	a	+
+chr1	39265	39297	a	a	+
+chr1	39265	39297	a	a	+
+chr1	39267	39299	a	a	+
+chr1	39268	39300	a	a	+
+chr1	39238	39270	b	b	-
+chr1	39241	39273	b	b	-
+chr1	39242	39274	b	b	-
+chr1	39242	39274	b	b	-
+chr1	39242	39274	b	b	-
+chr1	39242	39274	b	b	-
+chr1	39243	39275	b	b	-
+chr1	39278	39310	a	a	+
+chr1	39246	39278	b	b	-
+chr1	39279	39311	a	a	+
+chr1	39279	39311	a	a	+
+chr1	39252	39284	b	b	-
+chr1	39252	39284	b	b	-
+chr1	39252	39284	b	b	-
+chr1	39252	39284	b	b	-
+chr1	39288	39320	a	a	+
+chr1	39288	39320	a	a	+
+chr1	39288	39320	a	a	+
+chr1	39259	39291	b	b	-
+chr1	39259	39291	b	b	-
+chr1	39292	39324	a	a	+
+chr1	39294	39326	a	a	+
+chr1	39298	39330	a	a	+
+chr1	39288	39320	b	b	-
+chr1	39327	39359	a	a	+
+chr1	39408	39440	a	a	+
+chr1	39390	39422	b	b	-
+chr1	39431	39463	a	a	+
+chr1	39401	39433	b	b	-
+chr1	39439	39471	a	a	+
+chr1	39410	39442	b	b	-
+chr1	39443	39475	a	a	+
+chr1	39598	39630	a	a	+
+chr1	39566	39598	b	b	-
+chr1	39708	39740	b	b	-
+chr1	40293	40325	a	a	+
+chr1	40402	40434	a	a	+
+chr1	40765	40797	b	b	-
+chr1	40930	40962	b	b	-
+chr1	40973	41005	a	a	+
+chr1	41167	41199	b	b	-
+chr1	41356	41388	a	a	+
+chr1	41708	41740	b	b	-
+chr1	42180	42212	a	a	+
+chr1	42157	42189	b	b	-
+chr1	42160	42192	b	b	-
+chr1	42171	42203	b	b	-
+chr1	42171	42203	b	b	-
+chr1	42210	42242	a	a	+
+chr1	42186	42218	b	b	-
+chr1	42186	42218	b	b	-
+chr1	42221	42253	a	a	+
+chr1	42190	42222	b	b	-
+chr1	42191	42223	b	b	-
+chr1	42191	42223	b	b	-
+chr1	42191	42223	b	b	-
+chr1	42224	42256	a	a	+
+chr1	42194	42226	b	b	-
+chr1	42228	42260	a	a	+
+chr1	42231	42263	a	a	+
+chr1	42234	42266	a	a	+
+chr1	42247	42279	a	a	+
+chr1	42252	42284	a	a	+
+chr1	42268	42300	a	a	+
+chr1	42388	42420	a	a	+
+chr1	42356	42388	b	b	-
+chr1	42360	42392	b	b	-
+chr1	42393	42425	a	a	+
+chr1	42393	42425	a	a	+
+chr1	42401	42433	a	a	+
+chr1	42388	42420	b	b	-
+chr1	42399	42431	b	b	-
+chr1	42419	42451	b	b	-
+chr1	42419	42451	b	b	-
+chr1	42419	42451	b	b	-
+chr1	42468	42500	b	b	-
+chr1	42482	42514	b	b	-
+chr1	42539	42571	b	b	-
+chr1	42539	42571	b	b	-
+chr1	42582	42614	a	a	+
+chr1	42677	42709	a	a	+
+chr1	42855	42887	b	b	-
+chr1	42894	42926	a	a	+
+chr1	42864	42896	b	b	-
+chr1	42887	42919	b	b	-
+chr1	42887	42919	b	b	-
+chr1	42887	42919	b	b	-
+chr1	42890	42922	b	b	-
+chr1	42939	42971	a	a	+
+chr1	42939	42971	a	a	+
+chr1	42921	42953	b	b	-
+chr1	42921	42953	b	b	-
+chr1	43034	43066	a	a	+
+chr1	43034	43066	b	b	-
+chr1	43072	43104	a	a	+
+chr1	43072	43104	a	a	+
+chr1	43074	43106	a	a	+
+chr1	43048	43080	b	b	-
+chr1	43088	43120	a	a	+
+chr1	43088	43120	a	a	+
+chr1	43056	43088	b	b	-
+chr1	43056	43088	b	b	-
+chr1	43113	43145	a	a	+
+chr1	43113	43145	a	a	+
+chr1	43118	43150	a	a	+
+chr1	43090	43122	b	b	-
+chr1	43131	43163	a	a	+
+chr1	43099	43131	b	b	-
+chr1	43099	43131	b	b	-
+chr1	43099	43131	b	b	-
+chr1	43107	43139	b	b	-
+chr1	43150	43182	a	a	+
+chr1	43158	43190	a	a	+
+chr1	43134	43166	b	b	-
+chr1	43187	43219	a	a	+
+chr1	43226	43258	a	a	+
+chr1	43237	43269	a	a	+
+chr1	43237	43269	a	a	+
+chr1	43237	43269	a	a	+
+chr1	43237	43269	a	a	+
+chr1	43237	43269	a	a	+
+chr1	43205	43237	b	b	-
+chr1	43207	43239	b	b	-
+chr1	43211	43243	b	b	-
+chr1	43244	43276	a	a	+
+chr1	43246	43278	a	a	+
+chr1	43246	43278	a	a	+
+chr1	43214	43246	b	b	-
+chr1	43215	43247	b	b	-
+chr1	43250	43282	a	a	+
+chr1	43250	43282	a	a	+
+chr1	43260	43292	a	a	+
+chr1	43260	43292	a	a	+
+chr1	43260	43292	a	a	+
+chr1	43236	43268	b	b	-
+chr1	43271	43303	a	a	+
+chr1	43271	43303	a	a	+
+chr1	43273	43305	a	a	+
+chr1	43242	43274	b	b	-
+chr1	43243	43275	b	b	-
+chr1	43248	43280	b	b	-
+chr1	43281	43313	a	a	+
+chr1	43282	43314	a	a	+
+chr1	43285	43317	a	a	+
+chr1	43253	43285	b	b	-
+chr1	43300	43332	a	a	+
+chr1	43300	43332	a	a	+
+chr1	43300	43332	a	a	+
+chr1	43268	43300	b	b	-
+chr1	43277	43309	b	b	-
+chr1	43313	43345	a	a	+
+chr1	43285	43317	b	b	-
+chr1	43399	43431	b	b	-
+chr1	43408	43440	b	b	-
+chr1	43461	43493	a	a	+
+chr1	43461	43493	a	a	+
+chr1	43470	43502	a	a	+
+chr1	43474	43506	a	a	+
+chr1	43475	43507	a	a	+
+chr1	43448	43480	b	b	-
+chr1	43449	43481	b	b	-
+chr1	43449	43481	b	b	-
+chr1	43449	43481	b	b	-
+chr1	43449	43481	b	b	-
+chr1	43482	43514	a	a	+
+chr1	43451	43483	b	b	-
+chr1	43451	43483	b	b	-
+chr1	43484	43516	a	a	+
+chr1	43453	43485	b	b	-
+chr1	43453	43485	b	b	-
+chr1	43489	43521	a	a	+
+chr1	43489	43521	a	a	+
+chr1	43498	43530	a	a	+
+chr1	43504	43536	a	a	+
+chr1	43506	43538	a	a	+
+chr1	43513	43545	a	a	+
+chr1	43513	43545	a	a	+
+chr1	43487	43519	b	b	-
+chr1	43497	43529	b	b	-
+chr1	43499	43531	b	b	-
+chr1	43511	43543	b	b	-
+chr1	43511	43543	b	b	-
+chr1	43511	43543	b	b	-
+chr1	43513	43545	b	b	-
+chr1	43556	43588	a	a	+
+chr1	43573	43605	a	a	+
+chr1	43573	43605	a	a	+
+chr1	43579	43611	a	a	+
+chr1	43583	43615	a	a	+
+chr1	43604	43636	a	a	+
+chr1	43604	43636	a	a	+
+chr1	43612	43644	b	b	-
+chr1	43612	43644	b	b	-
+chr1	43612	43644	b	b	-
+chr1	43612	43644	b	b	-
+chr1	43612	43644	b	b	-
+chr1	43613	43645	b	b	-
+chr1	43620	43652	b	b	-
+chr1	43625	43657	b	b	-
+chr1	43685	43717	a	a	+
+chr1	43655	43687	b	b	-
+chr1	43705	43737	a	a	+
+chr1	43708	43740	b	b	-
+chr1	43749	43781	b	b	-
+chr1	43768	43800	b	b	-
+chr1	43769	43801	b	b	-
+chr1	43810	43842	a	a	+
+chr1	43782	43814	b	b	-
+chr1	43797	43829	b	b	-
+chr1	43949	43981	b	b	-
+chr1	43987	44019	a	a	+
+chr1	44003	44035	b	b	-
+chr1	44190	44222	a	a	+
+chr1	44254	44286	a	a	+
+chr1	44259	44291	b	b	-
+chr1	44415	44447	a	a	+
+chr1	44443	44475	a	a	+
+chr1	44443	44475	a	a	+
+chr1	44443	44475	a	a	+
+chr1	44576	44608	b	b	-
+chr1	44576	44608	b	b	-
+chr1	44644	44676	a	a	+
+chr1	44646	44678	a	a	+
+chr1	44652	44684	a	a	+
+chr1	44650	44682	b	b	-
+chr1	44650	44682	b	b	-
+chr1	44775	44807	b	b	-
+chr1	44776	44808	b	b	-
+chr1	44825	44857	a	a	+
+chr1	44826	44858	a	a	+
+chr1	44818	44850	b	b	-
+chr1	44977	45009	a	a	+
+chr1	44987	45019	a	a	+
+chr1	45017	45049	a	a	+
+chr1	45114	45146	b	b	-
+chr1	45115	45147	b	b	-
+chr1	45119	45151	b	b	-
+chr1	45119	45151	b	b	-
+chr1	45120	45152	b	b	-
+chr1	45153	45185	a	a	+
+chr1	45153	45185	a	a	+
+chr1	45164	45196	a	a	+
+chr1	45166	45198	a	a	+
+chr1	45166	45198	a	a	+
+chr1	45170	45202	a	a	+
+chr1	45142	45174	b	b	-
+chr1	45175	45207	a	a	+
+chr1	45176	45208	a	a	+
+chr1	45176	45208	a	a	+
+chr1	45144	45176	b	b	-
+chr1	45144	45176	b	b	-
+chr1	45144	45176	b	b	-
+chr1	45144	45176	b	b	-
+chr1	45145	45177	b	b	-
+chr1	45145	45177	b	b	-
+chr1	45145	45177	b	b	-
+chr1	45145	45177	b	b	-
+chr1	45150	45182	b	b	-
+chr1	45190	45222	a	a	+
+chr1	45160	45192	b	b	-
+chr1	45160	45192	b	b	-
+chr1	45160	45192	b	b	-
+chr1	45199	45231	a	a	+
+chr1	45208	45240	a	a	+
+chr1	45776	45808	a	a	+
+chr1	45797	45829	a	a	+
+chr1	45932	45964	b	b	-
+chr1	45933	45965	b	b	-
+chr1	45967	45999	a	a	+
+chr1	45968	46000	a	a	+
+chr1	45969	46001	a	a	+
+chr1	45969	46001	a	a	+
+chr1	45939	45971	b	b	-
+chr1	45939	45971	b	b	-
+chr1	45973	46005	a	a	+
+chr1	45946	45978	b	b	-
+chr1	45986	46018	a	a	+
+chr1	45956	45988	b	b	-
+chr1	46114	46146	b	b	-
+chr1	46279	46311	a	a	+
+chr1	46305	46337	a	a	+
+chr1	46334	46366	a	a	+
+chr1	46440	46472	a	a	+
+chr1	46650	46682	a	a	+
+chr1	47801	47833	a	a	+
+chr1	47920	47952	a	a	+
+chr1	47998	48030	b	b	-
+chr1	48517	48549	a	a	+
+chr1	48524	48556	a	a	+
+chr1	48528	48560	a	a	+
+chr1	48550	48582	a	a	+
+chr1	48520	48552	b	b	-
+chr1	48555	48587	a	a	+
+chr1	48525	48557	b	b	-
+chr1	48526	48558	b	b	-
+chr1	48526	48558	b	b	-
+chr1	48526	48558	b	b	-
+chr1	48562	48594	a	a	+
+chr1	48540	48572	b	b	-
+chr1	48573	48605	a	a	+
+chr1	48574	48606	a	a	+
+chr1	48574	48606	a	a	+
+chr1	48574	48606	a	a	+
+chr1	48574	48606	a	a	+
+chr1	48574	48606	a	a	+
+chr1	48580	48612	a	a	+
+chr1	48584	48616	a	a	+
+chr1	48585	48617	a	a	+
+chr1	48553	48585	b	b	-
+chr1	48554	48586	b	b	-
+chr1	48554	48586	b	b	-
+chr1	48587	48619	a	a	+
+chr1	48587	48619	a	a	+
+chr1	48555	48587	b	b	-
+chr1	48561	48593	b	b	-
+chr1	48595	48627	a	a	+
+chr1	48598	48630	a	a	+
+chr1	48570	48602	b	b	-
+chr1	48570	48602	b	b	-
+chr1	48570	48602	b	b	-
+chr1	48570	48602	b	b	-
+chr1	48570	48602	b	b	-
+chr1	48571	48603	b	b	-
+chr1	48572	48604	b	b	-
+chr1	48618	48650	a	a	+
+chr1	48619	48651	a	a	+
+chr1	48619	48651	a	a	+
+chr1	48619	48651	a	a	+
+chr1	48665	48697	a	a	+
+chr1	48753	48785	a	a	+
+chr1	48731	48763	b	b	-
+chr1	48766	48798	a	a	+
+chr1	48797	48829	a	a	+
+chr1	48792	48824	b	b	-
+chr1	49402	49434	a	a	+
+chr1	49402	49434	a	a	+
+chr1	49542	49574	a	a	+
+chr1	49542	49574	a	a	+
+chr1	50054	50086	a	a	+
+chr1	51273	51305	a	a	+
+chr1	51273	51305	a	a	+
+chr1	51278	51310	a	a	+
+chr1	51278	51310	a	a	+
+chr1	51346	51378	a	a	+
+chr1	51411	51443	a	a	+
+chr1	51425	51457	a	a	+
+chr1	51526	51558	b	b	-
+chr1	51833	51865	b	b	-
+chr1	51878	51910	b	b	-
+chr1	51888	51920	b	b	-
+chr1	52013	52045	a	a	+
+chr1	52048	52080	b	b	-
+chr1	52071	52103	b	b	-
+chr1	52123	52155	a	a	+
+chr1	52160	52192	b	b	-
+chr1	52252	52284	a	a	+
+chr1	52367	52399	a	a	+
+chr1	52421	52453	a	a	+
+chr1	52393	52425	b	b	-
+chr1	52393	52425	b	b	-
+chr1	52394	52426	b	b	-
+chr1	52439	52471	a	a	+
+chr1	52409	52441	b	b	-
+chr1	52495	52527	b	b	-
+chr1	52534	52566	b	b	-
+chr1	52535	52567	b	b	-
+chr1	52537	52569	b	b	-
+chr1	52537	52569	b	b	-
+chr1	52550	52582	b	b	-
+chr1	52550	52582	b	b	-
+chr1	52583	52615	a	a	+
+chr1	52584	52616	a	a	+
+chr1	52588	52620	a	a	+
+chr1	52556	52588	b	b	-
+chr1	52596	52628	a	a	+
+chr1	52596	52628	a	a	+
+chr1	52596	52628	a	a	+
+chr1	52564	52596	b	b	-
+chr1	52565	52597	b	b	-
+chr1	52598	52630	a	a	+
+chr1	52586	52618	b	b	-
+chr1	52620	52652	a	a	+
+chr1	52589	52621	b	b	-
+chr1	52857	52889	a	a	+
+chr1	52857	52889	a	a	+
+chr1	52858	52890	a	a	+
+chr1	52838	52870	b	b	-
+chr1	52841	52873	b	b	-
+chr1	52845	52877	b	b	-
+chr1	52845	52877	b	b	-
+chr1	52881	52913	a	a	+
+chr1	52881	52913	a	a	+
+chr1	52890	52922	a	a	+
+chr1	52995	53027	b	b	-
+chr1	52996	53028	b	b	-
+chr1	52996	53028	b	b	-
+chr1	53005	53037	b	b	-
+chr1	53015	53047	b	b	-
+chr1	53016	53048	b	b	-
+chr1	53022	53054	b	b	-
+chr1	53057	53089	a	a	+
+chr1	53058	53090	a	a	+
+chr1	53070	53102	a	a	+
+chr1	53071	53103	a	a	+
+chr1	53374	53406	a	a	+
+chr1	53351	53383	b	b	-
+chr1	53539	53571	a	a	+
+chr1	53646	53678	a	a	+
+chr1	53795	53827	b	b	-
+chr1	53894	53926	a	a	+
+chr1	53979	54011	a	a	+
+chr1	54021	54053	b	b	-
+chr1	54074	54106	a	a	+
+chr1	54161	54193	a	a	+
+chr1	54169	54201	b	b	-
+chr1	54198	54230	b	b	-
+chr1	54198	54230	b	b	-
+chr1	54213	54245	b	b	-
+chr1	54249	54281	a	a	+
+chr1	54264	54296	a	a	+
+chr1	54366	54398	b	b	-
+chr1	54370	54402	b	b	-
+chr1	54412	54444	a	a	+
+chr1	54414	54446	a	a	+
+chr1	54426	54458	a	a	+
+chr1	54430	54462	a	a	+
+chr1	54440	54472	a	a	+
+chr1	54528	54560	b	b	-
+chr1	54573	54605	a	a	+
+chr1	54542	54574	b	b	-
+chr1	54575	54607	a	a	+
+chr1	54544	54576	b	b	-
+chr1	54558	54590	b	b	-
+chr1	54594	54626	a	a	+
+chr1	54564	54596	b	b	-
+chr1	54615	54647	a	a	+
+chr1	54681	54713	b	b	-
+chr1	54684	54716	b	b	-
+chr1	54684	54716	b	b	-
+chr1	54717	54749	a	a	+
+chr1	54727	54759	a	a	+
+chr1	54732	54764	a	a	+
+chr1	54732	54764	a	a	+
+chr1	54732	54764	a	a	+
+chr1	54702	54734	b	b	-
+chr1	54702	54734	b	b	-
+chr1	54702	54734	b	b	-
+chr1	54737	54769	a	a	+
+chr1	54707	54739	b	b	-
+chr1	54708	54740	b	b	-
+chr1	54762	54794	a	a	+
+chr1	54730	54762	b	b	-
+chr1	54731	54763	b	b	-
+chr1	54778	54810	a	a	+
+chr1	54778	54810	a	a	+
+chr1	54780	54812	a	a	+
+chr1	54784	54816	a	a	+
+chr1	54801	54833	a	a	+
+chr1	55004	55036	a	a	+
+chr1	55078	55110	b	b	-
+chr1	55125	55157	a	a	+
+chr1	55100	55132	b	b	-
+chr1	55109	55141	b	b	-
+chr1	55116	55148	b	b	-
+chr1	55347	55379	a	a	+
+chr1	55699	55731	b	b	-
+chr1	55936	55968	b	b	-
+chr1	55989	56021	a	a	+
+chr1	56006	56038	a	a	+
+chr1	56133	56165	a	a	+
+chr1	56120	56152	b	b	-
+chr1	56250	56282	b	b	-
+chr1	56275	56307	b	b	-
+chr1	56312	56344	a	a	+
+chr1	56321	56353	a	a	+
+chr1	56452	56484	b	b	-
+chr1	56497	56529	a	a	+
+chr1	56466	56498	b	b	-
+chr1	56573	56605	b	b	-
+chr1	56573	56605	b	b	-
+chr1	56624	56656	a	a	+
+chr1	56628	56660	a	a	+
+chr1	56596	56628	b	b	-
+chr1	56596	56628	b	b	-
+chr1	56626	56658	b	b	-
+chr1	56626	56658	b	b	-
+chr1	56664	56696	a	a	+
+chr1	56645	56677	b	b	-
+chr1	56736	56768	b	b	-
+chr1	56757	56789	b	b	-
+chr1	56759	56791	b	b	-
+chr1	56799	56831	a	a	+
+chr1	56768	56800	b	b	-
+chr1	56769	56801	b	b	-
+chr1	56804	56836	a	a	+
+chr1	56805	56837	a	a	+
+chr1	56805	56837	a	a	+
+chr1	56805	56837	a	a	+
+chr1	56778	56810	b	b	-
+chr1	56781	56813	b	b	-
+chr1	56781	56813	b	b	-
+chr1	56781	56813	b	b	-
+chr1	56781	56813	b	b	-
+chr1	56814	56846	a	a	+
+chr1	56814	56846	a	a	+
+chr1	56785	56817	b	b	-
+chr1	56785	56817	b	b	-
+chr1	56818	56850	a	a	+
+chr1	56787	56819	b	b	-
+chr1	56787	56819	b	b	-
+chr1	56788	56820	b	b	-
+chr1	56821	56853	a	a	+
+chr1	56789	56821	b	b	-
+chr1	56822	56854	a	a	+
+chr1	56790	56822	b	b	-
+chr1	56825	56857	a	a	+
+chr1	56825	56857	a	a	+
+chr1	56825	56857	a	a	+
+chr1	56825	56857	a	a	+
+chr1	56793	56825	b	b	-
+chr1	56826	56858	a	a	+
+chr1	56826	56858	a	a	+
+chr1	56794	56826	b	b	-
+chr1	56832	56864	a	a	+
+chr1	56833	56865	a	a	+
+chr1	56801	56833	b	b	-
+chr1	56807	56839	b	b	-
+chr1	56840	56872	a	a	+
+chr1	56843	56875	a	a	+
+chr1	56843	56875	a	a	+
+chr1	56859	56891	a	a	+
+chr1	56859	56891	a	a	+
+chr1	57019	57051	a	a	+
+chr1	57020	57052	a	a	+
+chr1	56990	57022	b	b	-
+chr1	57002	57034	b	b	-
+chr1	57036	57068	a	a	+
+chr1	57036	57068	a	a	+
+chr1	57004	57036	b	b	-
+chr1	57004	57036	b	b	-
+chr1	57037	57069	a	a	+
+chr1	57037	57069	a	a	+
+chr1	57005	57037	b	b	-
+chr1	57038	57070	a	a	+
+chr1	57038	57070	a	a	+
+chr1	57038	57070	a	a	+
+chr1	57038	57070	a	a	+
+chr1	57038	57070	a	a	+
+chr1	57013	57045	b	b	-
+chr1	57014	57046	b	b	-
+chr1	57049	57081	a	a	+
+chr1	57063	57095	a	a	+
+chr1	57031	57063	b	b	-
+chr1	57072	57104	a	a	+
+chr1	57074	57106	a	a	+
+chr1	57105	57137	a	a	+
+chr1	57123	57155	b	b	-
+chr1	57134	57166	b	b	-
+chr1	57136	57168	b	b	-
+chr1	57172	57204	a	a	+
+chr1	57187	57219	a	a	+
+chr1	57156	57188	b	b	-
+chr1	57189	57221	a	a	+
+chr1	57157	57189	b	b	-
+chr1	57192	57224	a	a	+
+chr1	57197	57229	a	a	+
+chr1	57176	57208	b	b	-
+chr1	57176	57208	b	b	-
+chr1	57290	57322	b	b	-
+chr1	57328	57360	a	a	+
+chr1	57328	57360	a	a	+
+chr1	57296	57328	b	b	-
+chr1	57296	57328	b	b	-
+chr1	57330	57362	a	a	+
+chr1	57303	57335	b	b	-
+chr1	57336	57368	a	a	+
+chr1	57337	57369	a	a	+
+chr1	57337	57369	a	a	+
+chr1	57339	57371	a	a	+
+chr1	57339	57371	a	a	+
+chr1	57308	57340	b	b	-
+chr1	57308	57340	b	b	-
+chr1	57308	57340	b	b	-
+chr1	57308	57340	b	b	-
+chr1	57341	57373	a	a	+
+chr1	57342	57374	a	a	+
+chr1	57319	57351	b	b	-
+chr1	57325	57357	b	b	-
+chr1	57358	57390	a	a	+
+chr1	57328	57360	b	b	-
+chr1	57337	57369	b	b	-
+chr1	57337	57369	b	b	-
+chr1	57337	57369	b	b	-
+chr1	57337	57369	b	b	-
+chr1	57340	57372	b	b	-
+chr1	57379	57411	a	a	+
+chr1	57380	57412	a	a	+
+chr1	57491	57523	b	b	-
+chr1	57514	57546	b	b	-
+chr1	57548	57580	a	a	+
+chr1	57548	57580	a	a	+
+chr1	57516	57548	b	b	-
+chr1	57523	57555	b	b	-
+chr1	57524	57556	b	b	-
+chr1	57527	57559	b	b	-
+chr1	57531	57563	b	b	-
+chr1	57564	57596	a	a	+
+chr1	57564	57596	a	a	+
+chr1	57533	57565	b	b	-
+chr1	57567	57599	a	a	+
+chr1	57567	57599	a	a	+
+chr1	57535	57567	b	b	-
+chr1	57535	57567	b	b	-
+chr1	57535	57567	b	b	-
+chr1	57535	57567	b	b	-
+chr1	57535	57567	b	b	-
+chr1	57535	57567	b	b	-
+chr1	57535	57567	b	b	-
+chr1	57536	57568	b	b	-
+chr1	57536	57568	b	b	-
+chr1	57536	57568	b	b	-
+chr1	57536	57568	b	b	-
+chr1	57584	57616	a	a	+
+chr1	57586	57618	a	a	+
+chr1	57593	57625	a	a	+
+chr1	57687	57719	a	a	+
+chr1	57655	57687	b	b	-
+chr1	57660	57692	b	b	-
+chr1	57703	57735	a	a	+
+chr1	57687	57719	b	b	-
+chr1	57695	57727	b	b	-
+chr1	57700	57732	b	b	-
+chr1	57709	57741	b	b	-
+chr1	57709	57741	b	b	-
+chr1	57747	57779	a	a	+
+chr1	57747	57779	a	a	+
+chr1	57752	57784	a	a	+
+chr1	57727	57759	b	b	-
+chr1	57736	57768	b	b	-
+chr1	57798	57830	b	b	-
+chr1	57912	57944	b	b	-
+chr1	58003	58035	b	b	-
+chr1	58003	58035	b	b	-
+chr1	58070	58102	a	a	+
+chr1	58050	58082	b	b	-
+chr1	58050	58082	b	b	-
+chr1	58094	58126	a	a	+
+chr1	58095	58127	a	a	+
+chr1	58101	58133	a	a	+
+chr1	58221	58253	a	a	+
+chr1	58228	58260	a	a	+
+chr1	58235	58267	a	a	+
+chr1	58253	58285	a	a	+
+chr1	58225	58257	b	b	-
+chr1	58259	58291	a	a	+
+chr1	58230	58262	b	b	-
+chr1	58265	58297	a	a	+
+chr1	58244	58276	b	b	-
+chr1	58249	58281	b	b	-
+chr1	58264	58296	b	b	-
+chr1	58403	58435	a	a	+
+chr1	58371	58403	b	b	-
+chr1	58409	58441	a	a	+
+chr1	58384	58416	b	b	-
+chr1	58425	58457	a	a	+
+chr1	58425	58457	a	a	+
+chr1	58393	58425	b	b	-
+chr1	58398	58430	b	b	-
+chr1	58398	58430	b	b	-
+chr1	58399	58431	b	b	-
+chr1	58434	58466	a	a	+
+chr1	58402	58434	b	b	-
+chr1	58435	58467	a	a	+
+chr1	58439	58471	a	a	+
+chr1	58449	58481	a	a	+
+chr1	58449	58481	a	a	+
+chr1	58449	58481	a	a	+
+chr1	58420	58452	b	b	-
+chr1	58420	58452	b	b	-
+chr1	58453	58485	a	a	+
+chr1	58453	58485	a	a	+
+chr1	58438	58470	b	b	-
+chr1	58488	58520	a	a	+
+chr1	58669	58701	a	a	+
+chr1	58657	58689	b	b	-
+chr1	58672	58704	b	b	-
+chr1	58687	58719	b	b	-
+chr1	58722	58754	a	a	+
+chr1	58695	58727	b	b	-
+chr1	58706	58738	b	b	-
+chr1	58785	58817	b	b	-
+chr1	58809	58841	b	b	-
+chr1	58865	58897	b	b	-
+chr1	59046	59078	b	b	-
+chr1	59172	59204	a	a	+
+chr1	59189	59221	b	b	-
+chr1	59362	59394	b	b	-
+chr1	59551	59583	a	a	+
+chr1	59782	59814	a	a	+
+chr1	59989	60021	b	b	-
+chr1	60186	60218	b	b	-
+chr1	60366	60398	a	a	+
+chr1	60684	60716	a	a	+
+chr1	60684	60716	a	a	+
+chr1	60841	60873	a	a	+
+chr1	60851	60883	a	a	+
+chr1	60825	60857	b	b	-
+chr1	60830	60862	b	b	-
+chr1	60858	60890	b	b	-
+chr1	60996	61028	a	a	+
+chr1	61008	61040	a	a	+
+chr1	61010	61042	a	a	+
+chr1	61010	61042	a	a	+
+chr1	60978	61010	b	b	-
+chr1	61016	61048	a	a	+
+chr1	61017	61049	a	a	+
+chr1	61017	61049	a	a	+
+chr1	61017	61049	a	a	+
+chr1	60986	61018	b	b	-
+chr1	60987	61019	b	b	-
+chr1	61020	61052	a	a	+
+chr1	61021	61053	a	a	+
+chr1	61023	61055	a	a	+
+chr1	61024	61056	a	a	+
+chr1	61024	61056	a	a	+
+chr1	61024	61056	a	a	+
+chr1	61024	61056	a	a	+
+chr1	61024	61056	a	a	+
+chr1	61024	61056	a	a	+
+chr1	60994	61026	b	b	-
+chr1	60994	61026	b	b	-
+chr1	60994	61026	b	b	-
+chr1	61027	61059	a	a	+
+chr1	60995	61027	b	b	-
+chr1	60995	61027	b	b	-
+chr1	60995	61027	b	b	-
+chr1	61028	61060	a	a	+
+chr1	60997	61029	b	b	-
+chr1	60997	61029	b	b	-
+chr1	60999	61031	b	b	-
+chr1	61000	61032	b	b	-
+chr1	61002	61034	b	b	-
+chr1	61002	61034	b	b	-
+chr1	61002	61034	b	b	-
+chr1	61037	61069	a	a	+
+chr1	61038	61070	a	a	+
+chr1	61006	61038	b	b	-
+chr1	61006	61038	b	b	-
+chr1	61039	61071	a	a	+
+chr1	61039	61071	a	a	+
+chr1	61007	61039	b	b	-
+chr1	61009	61041	b	b	-
+chr1	61009	61041	b	b	-
+chr1	61009	61041	b	b	-
+chr1	61048	61080	a	a	+
+chr1	61018	61050	b	b	-
+chr1	61071	61103	a	a	+
+chr1	61100	61132	a	a	+
+chr1	61289	61321	a	a	+
+chr1	61311	61343	a	a	+
+chr1	61311	61343	a	a	+
+chr1	61311	61343	a	a	+
+chr1	61316	61348	a	a	+
+chr1	61316	61348	a	a	+
+chr1	61316	61348	a	a	+
+chr1	61320	61352	a	a	+
+chr1	61294	61326	b	b	-
+chr1	61327	61359	a	a	+
+chr1	61295	61327	b	b	-
+chr1	61299	61331	b	b	-
+chr1	61299	61331	b	b	-
+chr1	61299	61331	b	b	-
+chr1	61301	61333	b	b	-
+chr1	61301	61333	b	b	-
+chr1	61302	61334	b	b	-
+chr1	61302	61334	b	b	-
+chr1	61302	61334	b	b	-
+chr1	61303	61335	b	b	-
+chr1	61303	61335	b	b	-
+chr1	61336	61368	a	a	+
+chr1	61336	61368	a	a	+
+chr1	61336	61368	a	a	+
+chr1	61337	61369	a	a	+
+chr1	61337	61369	a	a	+
+chr1	61337	61369	a	a	+
+chr1	61337	61369	a	a	+
+chr1	61339	61371	a	a	+
+chr1	61339	61371	a	a	+
+chr1	61340	61372	a	a	+
+chr1	61340	61372	a	a	+
+chr1	61345	61377	a	a	+
+chr1	61314	61346	b	b	-
+chr1	61314	61346	b	b	-
+chr1	61348	61380	a	a	+
+chr1	61323	61355	b	b	-
+chr1	61324	61356	b	b	-
+chr1	61325	61357	b	b	-
+chr1	61362	61394	a	a	+
+chr1	61417	61449	b	b	-
+chr1	61418	61450	b	b	-
+chr1	61419	61451	b	b	-
+chr1	61427	61459	b	b	-
+chr1	61435	61467	b	b	-
+chr1	61493	61525	a	a	+
+chr1	61493	61525	a	a	+
+chr1	61461	61493	b	b	-
+chr1	61465	61497	b	b	-
+chr1	61508	61540	a	a	+
+chr1	61508	61540	a	a	+
+chr1	61508	61540	a	a	+
+chr1	61477	61509	b	b	-
+chr1	61482	61514	b	b	-
+chr1	61586	61618	b	b	-
+chr1	61610	61642	b	b	-
+chr1	61650	61682	a	a	+
+chr1	61806	61838	a	a	+
+chr1	61806	61838	a	a	+
+chr1	62162	62194	b	b	-
+chr1	62313	62345	b	b	-
+chr1	62457	62489	b	b	-
+chr1	62502	62534	a	a	+
+chr1	62475	62507	b	b	-
+chr1	62475	62507	b	b	-
+chr1	62475	62507	b	b	-
+chr1	62475	62507	b	b	-
+chr1	62475	62507	b	b	-
+chr1	62513	62545	a	a	+
+chr1	62495	62527	b	b	-
+chr1	62534	62566	a	a	+
+chr1	62502	62534	b	b	-
+chr1	62538	62570	a	a	+
+chr1	62539	62571	a	a	+
+chr1	62539	62571	a	a	+
+chr1	62542	62574	a	a	+
+chr1	62542	62574	a	a	+
+chr1	62594	62626	a	a	+
+chr1	62755	62787	b	b	-
+chr1	62789	62821	a	a	+
+chr1	62799	62831	a	a	+
+chr1	62799	62831	a	a	+
+chr1	62768	62800	b	b	-
+chr1	62768	62800	b	b	-
+chr1	62803	62835	a	a	+
+chr1	62771	62803	b	b	-
+chr1	62773	62805	b	b	-
+chr1	62773	62805	b	b	-
+chr1	62806	62838	a	a	+
+chr1	62806	62838	a	a	+
+chr1	62807	62839	a	a	+
+chr1	62807	62839	a	a	+
+chr1	62809	62841	a	a	+
+chr1	62809	62841	a	a	+
+chr1	62809	62841	a	a	+
+chr1	62809	62841	a	a	+
+chr1	62779	62811	b	b	-
+chr1	62780	62812	b	b	-
+chr1	62780	62812	b	b	-
+chr1	62780	62812	b	b	-
+chr1	62815	62847	a	a	+
+chr1	62784	62816	b	b	-
+chr1	62784	62816	b	b	-
+chr1	62784	62816	b	b	-
+chr1	62784	62816	b	b	-
+chr1	62784	62816	b	b	-
+chr1	62785	62817	b	b	-
+chr1	62819	62851	a	a	+
+chr1	62819	62851	a	a	+
+chr1	62819	62851	a	a	+
+chr1	62821	62853	a	a	+
+chr1	62789	62821	b	b	-
+chr1	62789	62821	b	b	-
+chr1	62826	62858	a	a	+
+chr1	62826	62858	a	a	+
+chr1	62826	62858	a	a	+
+chr1	62794	62826	b	b	-
+chr1	62827	62859	a	a	+
+chr1	62827	62859	a	a	+
+chr1	62830	62862	a	a	+
+chr1	62831	62863	a	a	+
+chr1	62801	62833	b	b	-
+chr1	62801	62833	b	b	-
+chr1	62801	62833	b	b	-
+chr1	62801	62833	b	b	-
+chr1	62802	62834	b	b	-
+chr1	62802	62834	b	b	-
+chr1	62814	62846	b	b	-
+chr1	62820	62852	b	b	-
+chr1	62951	62983	a	a	+
+chr1	62953	62985	a	a	+
+chr1	62921	62953	b	b	-
+chr1	62974	63006	a	a	+
+chr1	62969	63001	b	b	-
+chr1	63084	63116	b	b	-
+chr1	63134	63166	a	a	+
+chr1	63123	63155	b	b	-
+chr1	63159	63191	a	a	+
+chr1	63194	63226	a	a	+
+chr1	63289	63321	a	a	+
+chr1	63293	63325	b	b	-
+chr1	63449	63481	b	b	-
+chr1	63458	63490	b	b	-
+chr1	63496	63528	a	a	+
+chr1	63563	63595	b	b	-
+chr1	63884	63916	b	b	-
+chr1	63951	63983	a	a	+
+chr1	64057	64089	b	b	-
+chr1	64405	64437	a	a	+
+chr1	64499	64531	b	b	-
+chr1	64880	64912	b	b	-
+chr1	64950	64982	a	a	+
+chr1	65034	65066	a	a	+
+chr1	66032	66064	a	a	+
+chr1	66206	66238	a	a	+
+chr1	66338	66370	a	a	+
+chr1	66338	66370	a	a	+
+chr1	66936	66968	b	b	-
+chr1	66965	66997	b	b	-
+chr1	67105	67137	b	b	-
+chr1	67193	67225	a	a	+
+chr1	67284	67316	b	b	-
+chr1	67284	67316	b	b	-
+chr1	67457	67489	b	b	-
+chr1	67655	67687	a	a	+
+chr1	67752	67784	a	a	+
+chr1	67849	67881	a	a	+
+chr1	67974	68006	b	b	-
+chr1	68037	68069	a	a	+
+chr1	68041	68073	a	a	+
+chr1	68195	68227	b	b	-
+chr1	68195	68227	b	b	-
+chr1	68272	68304	a	a	+
+chr1	68272	68304	a	a	+
+chr1	68261	68293	b	b	-
+chr1	68706	68738	a	a	+
+chr1	68707	68739	a	a	+
+chr1	68715	68747	a	a	+
+chr1	68873	68905	a	a	+
+chr1	68873	68905	a	a	+
+chr1	68873	68905	a	a	+
+chr1	68873	68905	a	a	+
+chr1	68869	68901	b	b	-
+chr1	68907	68939	a	a	+
+chr1	68962	68994	a	a	+
+chr1	68993	69025	a	a	+
+chr1	69040	69072	a	a	+
+chr1	69032	69064	b	b	-
+chr1	69157	69189	b	b	-
+chr1	69212	69244	a	a	+
+chr1	69212	69244	a	a	+
+chr1	69240	69272	a	a	+
+chr1	69298	69330	a	a	+
+chr1	69350	69382	a	a	+
+chr1	69394	69426	a	a	+
+chr1	69420	69452	b	b	-
+chr1	69469	69501	a	a	+
+chr1	69480	69512	b	b	-
+chr1	69481	69513	b	b	-
+chr1	69481	69513	b	b	-
+chr1	69481	69513	b	b	-
+chr1	69481	69513	b	b	-
+chr1	69517	69549	a	a	+
+chr1	69519	69551	a	a	+
+chr1	69528	69560	a	a	+
+chr1	69497	69529	b	b	-
+chr1	69530	69562	a	a	+
+chr1	69530	69562	a	a	+
+chr1	69533	69565	a	a	+
+chr1	69505	69537	b	b	-
+chr1	69505	69537	b	b	-
+chr1	69540	69572	a	a	+
+chr1	69541	69573	a	a	+
+chr1	69510	69542	b	b	-
+chr1	69513	69545	b	b	-
+chr1	69935	69967	a	a	+
+chr1	69913	69945	b	b	-
+chr1	69926	69958	b	b	-
+chr1	69942	69974	b	b	-
+chr1	69980	70012	a	a	+
+chr1	69980	70012	a	a	+
+chr1	69980	70012	a	a	+
+chr1	69951	69983	b	b	-
+chr1	69951	69983	b	b	-
+chr1	70002	70034	a	a	+
+chr1	69983	70015	b	b	-
+chr1	70031	70063	a	a	+
+chr1	70057	70089	b	b	-
+chr1	70079	70111	b	b	-
+chr1	70105	70137	b	b	-
+chr1	70243	70275	b	b	-
+chr1	70243	70275	b	b	-
+chr1	70260	70292	b	b	-
+chr1	70261	70293	b	b	-
+chr1	70266	70298	b	b	-
+chr1	70281	70313	b	b	-
+chr1	70281	70313	b	b	-
+chr1	71447	71479	a	a	+
+chr1	71569	71601	b	b	-
+chr1	71785	71817	b	b	-
+chr1	71822	71854	a	a	+
+chr1	73055	73087	a	a	+
+chr1	73579	73611	b	b	-
+chr1	73618	73650	a	a	+
+chr1	73653	73685	a	a	+
+chr1	73653	73685	a	a	+
+chr1	73630	73662	b	b	-
+chr1	73714	73746	a	a	+
+chr1	73805	73837	b	b	-
+chr1	73867	73899	a	a	+
+chr1	73870	73902	a	a	+
+chr1	73881	73913	a	a	+
+chr1	73881	73913	a	a	+
+chr1	73886	73918	a	a	+
+chr1	73856	73888	b	b	-
+chr1	73889	73921	a	a	+
+chr1	73857	73889	b	b	-
+chr1	73857	73889	b	b	-
+chr1	73894	73926	a	a	+
+chr1	73907	73939	a	a	+
+chr1	74004	74036	b	b	-
+chr1	74018	74050	b	b	-
+chr1	74052	74084	a	a	+
+chr1	74052	74084	a	a	+
+chr1	74052	74084	a	a	+
+chr1	74052	74084	a	a	+
+chr1	74054	74086	a	a	+
+chr1	74029	74061	b	b	-
+chr1	74065	74097	a	a	+
+chr1	74155	74187	b	b	-
+chr1	74208	74240	a	a	+
+chr1	74178	74210	b	b	-
+chr1	74178	74210	b	b	-
+chr1	74231	74263	a	a	+
+chr1	74231	74263	a	a	+
+chr1	74246	74278	a	a	+
+chr1	74247	74279	a	a	+
+chr1	74217	74249	b	b	-
+chr1	74280	74312	a	a	+
+chr1	74280	74312	a	a	+
+chr1	74374	74406	b	b	-
+chr1	74376	74408	b	b	-
+chr1	74376	74408	b	b	-
+chr1	74379	74411	b	b	-
+chr1	74386	74418	b	b	-
+chr1	74386	74418	b	b	-
+chr1	74389	74421	b	b	-
+chr1	74394	74426	b	b	-
+chr1	74401	74433	b	b	-
+chr1	74613	74645	a	a	+
+chr1	74601	74633	b	b	-
+chr1	74683	74715	b	b	-
+chr1	74729	74761	a	a	+
+chr1	74717	74749	b	b	-
+chr1	74758	74790	a	a	+
+chr1	74736	74768	b	b	-
+chr1	75107	75139	a	a	+
+chr1	75137	75169	b	b	-
+chr1	75137	75169	b	b	-
+chr1	75271	75303	b	b	-
+chr1	75469	75501	b	b	-
+chr1	75494	75526	b	b	-
+chr1	75758	75790	b	b	-
+chr1	75776	75808	b	b	-
+chr1	75823	75855	a	a	+
+chr1	75798	75830	b	b	-
+chr1	75837	75869	b	b	-
+chr1	75946	75978	a	a	+
+chr1	75948	75980	b	b	-
+chr1	75949	75981	b	b	-
+chr1	75949	75981	b	b	-
+chr1	75990	76022	a	a	+
+chr1	75966	75998	b	b	-
+chr1	75966	75998	b	b	-
+chr1	76093	76125	b	b	-
+chr1	76093	76125	b	b	-
+chr1	76102	76134	b	b	-
+chr1	76102	76134	b	b	-
+chr1	76138	76170	a	a	+
+chr1	76138	76170	a	a	+
+chr1	76106	76138	b	b	-
+chr1	76106	76138	b	b	-
+chr1	76106	76138	b	b	-
+chr1	76111	76143	b	b	-
+chr1	76144	76176	a	a	+
+chr1	76145	76177	a	a	+
+chr1	76146	76178	a	a	+
+chr1	76146	76178	a	a	+
+chr1	76147	76179	a	a	+
+chr1	76147	76179	a	a	+
+chr1	76118	76150	b	b	-
+chr1	76119	76151	b	b	-
+chr1	76119	76151	b	b	-
+chr1	76119	76151	b	b	-
+chr1	76152	76184	a	a	+
+chr1	76152	76184	a	a	+
+chr1	76154	76186	a	a	+
+chr1	76122	76154	b	b	-
+chr1	76122	76154	b	b	-
+chr1	76155	76187	a	a	+
+chr1	76155	76187	a	a	+
+chr1	76155	76187	a	a	+
+chr1	76124	76156	b	b	-
+chr1	76124	76156	b	b	-
+chr1	76157	76189	a	a	+
+chr1	76129	76161	b	b	-
+chr1	76129	76161	b	b	-
+chr1	76130	76162	b	b	-
+chr1	76130	76162	b	b	-
+chr1	76130	76162	b	b	-
+chr1	76130	76162	b	b	-
+chr1	76163	76195	a	a	+
+chr1	76131	76163	b	b	-
+chr1	76131	76163	b	b	-
+chr1	76131	76163	b	b	-
+chr1	76131	76163	b	b	-
+chr1	76131	76163	b	b	-
+chr1	76131	76163	b	b	-
+chr1	76131	76163	b	b	-
+chr1	76170	76202	a	a	+
+chr1	76171	76203	a	a	+
+chr1	76139	76171	b	b	-
+chr1	76142	76174	b	b	-
+chr1	76143	76175	b	b	-
+chr1	76143	76175	b	b	-
+chr1	76160	76192	b	b	-
+chr1	76377	76409	b	b	-
+chr1	76414	76446	a	a	+
+chr1	76427	76459	a	a	+
+chr1	76404	76436	b	b	-
+chr1	76438	76470	a	a	+
+chr1	76438	76470	a	a	+
+chr1	76439	76471	a	a	+
+chr1	76439	76471	a	a	+
+chr1	76439	76471	a	a	+
+chr1	76441	76473	a	a	+
+chr1	76441	76473	a	a	+
+chr1	76441	76473	a	a	+
+chr1	76446	76478	a	a	+
+chr1	76447	76479	a	a	+
+chr1	76447	76479	a	a	+
+chr1	76447	76479	a	a	+
+chr1	76447	76479	a	a	+
+chr1	76416	76448	b	b	-
+chr1	76451	76483	a	a	+
+chr1	76421	76453	b	b	-
+chr1	76421	76453	b	b	-
+chr1	76421	76453	b	b	-
+chr1	76421	76453	b	b	-
+chr1	76421	76453	b	b	-
+chr1	76421	76453	b	b	-
+chr1	76421	76453	b	b	-
+chr1	76421	76453	b	b	-
+chr1	76421	76453	b	b	-
+chr1	76422	76454	b	b	-
+chr1	76422	76454	b	b	-
+chr1	76457	76489	a	a	+
+chr1	76459	76491	a	a	+
+chr1	76428	76460	b	b	-
+chr1	76430	76462	b	b	-
+chr1	76570	76602	b	b	-
+chr1	76711	76743	b	b	-
+chr1	76754	76786	a	a	+
+chr1	76769	76801	a	a	+
+chr1	76737	76769	b	b	-
+chr1	77480	77512	a	a	+
+chr1	77811	77843	b	b	-
+chr1	78565	78597	b	b	-
+chr1	78736	78768	b	b	-
+chr1	79402	79434	b	b	-
+chr1	79674	79706	b	b	-
+chr1	79710	79742	a	a	+
+chr1	79688	79720	b	b	-
+chr1	79688	79720	b	b	-
+chr1	79688	79720	b	b	-
+chr1	79690	79722	b	b	-
+chr1	79691	79723	b	b	-
+chr1	79691	79723	b	b	-
+chr1	79724	79756	a	a	+
+chr1	79725	79757	a	a	+
+chr1	79726	79758	a	a	+
+chr1	79729	79761	a	a	+
+chr1	79729	79761	a	a	+
+chr1	79697	79729	b	b	-
+chr1	79705	79737	b	b	-
+chr1	79705	79737	b	b	-
+chr1	79705	79737	b	b	-
+chr1	79705	79737	b	b	-
+chr1	79738	79770	a	a	+
+chr1	79738	79770	a	a	+
+chr1	79706	79738	b	b	-
+chr1	79739	79771	a	a	+
+chr1	79739	79771	a	a	+
+chr1	79739	79771	a	a	+
+chr1	79739	79771	a	a	+
+chr1	79739	79771	a	a	+
+chr1	79707	79739	b	b	-
+chr1	79707	79739	b	b	-
+chr1	79740	79772	a	a	+
+chr1	79712	79744	b	b	-
+chr1	79712	79744	b	b	-
+chr1	79712	79744	b	b	-
+chr1	79722	79754	b	b	-
+chr1	79755	79787	a	a	+
+chr1	79755	79787	a	a	+
+chr1	79756	79788	a	a	+
+chr1	79793	79825	a	a	+
+chr1	79812	79844	b	b	-
+chr1	79831	79863	b	b	-
+chr1	79831	79863	b	b	-
+chr1	79861	79893	b	b	-
+chr1	79894	79926	a	a	+
+chr1	79867	79899	b	b	-
+chr1	79901	79933	a	a	+
+chr1	79901	79933	a	a	+
+chr1	79901	79933	a	a	+
+chr1	79916	79948	a	a	+
+chr1	79916	79948	a	a	+
+chr1	79888	79920	b	b	-
+chr1	79932	79964	a	a	+
+chr1	79936	79968	a	a	+
+chr1	79936	79968	a	a	+
+chr1	79936	79968	a	a	+
+chr1	79936	79968	a	a	+
+chr1	79936	79968	a	a	+
+chr1	79936	79968	a	a	+
+chr1	80020	80052	b	b	-
+chr1	80086	80118	a	a	+
+chr1	80087	80119	a	a	+
+chr1	80067	80099	b	b	-
+chr1	80079	80111	b	b	-
+chr1	80129	80161	b	b	-
+chr1	80362	80394	b	b	-
+chr1	80365	80397	b	b	-
+chr1	80443	80475	a	a	+
+chr1	80443	80475	a	a	+
+chr1	80553	80585	a	a	+
+chr1	80553	80585	a	a	+
+chr1	80804	80836	a	a	+
+chr1	80858	80890	a	a	+
+chr1	80836	80868	b	b	-
+chr1	80910	80942	b	b	-
+chr1	81008	81040	b	b	-
+chr1	81163	81195	a	a	+
+chr1	81139	81171	b	b	-
+chr1	81939	81971	b	b	-
+chr1	81939	81971	b	b	-
+chr1	81942	81974	b	b	-
+chr1	81953	81985	b	b	-
+chr1	82178	82210	a	a	+
+chr1	82178	82210	b	b	-
+chr1	82236	82268	a	a	+
+chr1	82207	82239	b	b	-
+chr1	82210	82242	b	b	-
+chr1	82272	82304	a	a	+
+chr1	82298	82330	b	b	-
+chr1	82303	82335	b	b	-
+chr1	82317	82349	b	b	-
+chr1	82335	82367	b	b	-
+chr1	82375	82407	a	a	+
+chr1	82343	82375	b	b	-
+chr1	82343	82375	b	b	-
+chr1	82343	82375	b	b	-
+chr1	82504	82536	a	a	+
+chr1	82504	82536	a	a	+
+chr1	82504	82536	a	a	+
+chr1	82504	82536	a	a	+
+chr1	82504	82536	a	a	+
+chr1	82504	82536	a	a	+
+chr1	82504	82536	a	a	+
+chr1	82504	82536	a	a	+
+chr1	82475	82507	b	b	-
+chr1	82479	82511	b	b	-
+chr1	82479	82511	b	b	-
+chr1	82479	82511	b	b	-
+chr1	82481	82513	b	b	-
+chr1	82514	82546	a	a	+
+chr1	82514	82546	a	a	+
+chr1	82482	82514	b	b	-
+chr1	82482	82514	b	b	-
+chr1	82482	82514	b	b	-
+chr1	82482	82514	b	b	-
+chr1	82515	82547	a	a	+
+chr1	82489	82521	b	b	-
+chr1	82522	82554	a	a	+
+chr1	82525	82557	a	a	+
+chr1	82528	82560	a	a	+
+chr1	82528	82560	a	a	+
+chr1	82541	82573	a	a	+
+chr1	82541	82573	a	a	+
+chr1	82541	82573	a	a	+
+chr1	82541	82573	a	a	+
+chr1	82541	82573	a	a	+
+chr1	82541	82573	a	a	+
+chr1	82542	82574	a	a	+
+chr1	82510	82542	b	b	-
+chr1	82517	82549	b	b	-
+chr1	82553	82585	a	a	+
+chr1	82556	82588	a	a	+
+chr1	82526	82558	b	b	-
+chr1	82527	82559	b	b	-
+chr1	82561	82593	a	a	+
+chr1	82564	82596	a	a	+
+chr1	82576	82608	a	a	+
+chr1	82578	82610	a	a	+
+chr1	82693	82725	b	b	-
+chr1	82706	82738	b	b	-
+chr1	82715	82747	b	b	-
+chr1	82754	82786	a	a	+
+chr1	82754	82786	a	a	+
+chr1	82754	82786	a	a	+
+chr1	82726	82758	b	b	-
+chr1	82729	82761	b	b	-
+chr1	82729	82761	b	b	-
+chr1	82734	82766	b	b	-
+chr1	82734	82766	b	b	-
+chr1	82734	82766	b	b	-
+chr1	82734	82766	b	b	-
+chr1	82734	82766	b	b	-
+chr1	82735	82767	b	b	-
+chr1	82735	82767	b	b	-
+chr1	82735	82767	b	b	-
+chr1	82735	82767	b	b	-
+chr1	82736	82768	b	b	-
+chr1	82770	82802	a	a	+
+chr1	82750	82782	b	b	-
+chr1	82756	82788	b	b	-
+chr1	82792	82824	a	a	+
+chr1	82803	82835	a	a	+
+chr1	82810	82842	a	a	+
+chr1	82868	82900	b	b	-
+chr1	82909	82941	a	a	+
+chr1	82916	82948	a	a	+
+chr1	82916	82948	a	a	+
+chr1	82916	82948	a	a	+
+chr1	82916	82948	a	a	+
+chr1	82916	82948	a	a	+
+chr1	82916	82948	a	a	+
+chr1	82885	82917	b	b	-
+chr1	82886	82918	b	b	-
+chr1	82931	82963	a	a	+
+chr1	82935	82967	a	a	+
+chr1	83035	83067	a	a	+
+chr1	83069	83101	a	a	+
+chr1	83081	83113	a	a	+
+chr1	83264	83296	b	b	-
+chr1	83322	83354	b	b	-
+chr1	83360	83392	b	b	-
+chr1	83434	83466	a	a	+
+chr1	83451	83483	a	a	+
+chr1	83421	83453	b	b	-
+chr1	83577	83609	b	b	-
+chr1	83588	83620	b	b	-
+chr1	83644	83676	a	a	+
+chr1	83670	83702	a	a	+
+chr1	83772	83804	a	a	+
+chr1	83908	83940	b	b	-
+chr1	83959	83991	a	a	+
+chr1	84054	84086	b	b	-
+chr1	84054	84086	b	b	-
+chr1	84088	84120	a	a	+
+chr1	84105	84137	a	a	+
+chr1	84105	84137	a	a	+
+chr1	84074	84106	b	b	-
+chr1	84075	84107	b	b	-
+chr1	84112	84144	a	a	+
+chr1	84112	84144	a	a	+
+chr1	84133	84165	a	a	+
+chr1	84220	84252	b	b	-
+chr1	84220	84252	b	b	-
+chr1	84253	84285	a	a	+
+chr1	84262	84294	a	a	+
+chr1	84232	84264	b	b	-
+chr1	84232	84264	b	b	-
+chr1	84239	84271	b	b	-
+chr1	84239	84271	b	b	-
+chr1	84239	84271	b	b	-
+chr1	84272	84304	a	a	+
+chr1	84276	84308	a	a	+
+chr1	84255	84287	b	b	-
+chr1	84256	84288	b	b	-
+chr1	84261	84293	b	b	-
+chr1	84294	84326	a	a	+
+chr1	84262	84294	b	b	-
+chr1	84338	84370	a	a	+
+chr1	84364	84396	a	a	+
+chr1	84401	84433	a	a	+
+chr1	84402	84434	a	a	+
+chr1	84370	84402	b	b	-
+chr1	84389	84421	b	b	-
+chr1	84424	84456	a	a	+
+chr1	84424	84456	a	a	+
+chr1	84427	84459	a	a	+
+chr1	84427	84459	a	a	+
+chr1	84401	84433	b	b	-
+chr1	84435	84467	a	a	+
+chr1	84435	84467	a	a	+
+chr1	84436	84468	a	a	+
+chr1	84406	84438	b	b	-
+chr1	84406	84438	b	b	-
+chr1	84440	84472	a	a	+
+chr1	84441	84473	a	a	+
+chr1	84442	84474	a	a	+
+chr1	84442	84474	a	a	+
+chr1	84443	84475	a	a	+
+chr1	84443	84475	a	a	+
+chr1	84443	84475	a	a	+
+chr1	84443	84475	a	a	+
+chr1	84444	84476	a	a	+
+chr1	84444	84476	a	a	+
+chr1	84444	84476	a	a	+
+chr1	84444	84476	a	a	+
+chr1	84444	84476	a	a	+
+chr1	84444	84476	a	a	+
+chr1	84415	84447	b	b	-
+chr1	84415	84447	b	b	-
+chr1	84415	84447	b	b	-
+chr1	84418	84450	b	b	-
+chr1	84418	84450	b	b	-
+chr1	84451	84483	a	a	+
+chr1	84451	84483	a	a	+
+chr1	84422	84454	b	b	-
+chr1	84422	84454	b	b	-
+chr1	84422	84454	b	b	-
+chr1	84422	84454	b	b	-
+chr1	84422	84454	b	b	-
+chr1	84422	84454	b	b	-
+chr1	84422	84454	b	b	-
+chr1	84422	84454	b	b	-
+chr1	84422	84454	b	b	-
+chr1	84422	84454	b	b	-
+chr1	84422	84454	b	b	-
+chr1	84422	84454	b	b	-
+chr1	84422	84454	b	b	-
+chr1	84423	84455	b	b	-
+chr1	84456	84488	a	a	+
+chr1	84424	84456	b	b	-
+chr1	84424	84456	b	b	-
+chr1	84426	84458	b	b	-
+chr1	84463	84495	a	a	+
+chr1	84463	84495	a	a	+
+chr1	84431	84463	b	b	-
+chr1	84431	84463	b	b	-
+chr1	84431	84463	b	b	-
+chr1	84431	84463	b	b	-
+chr1	84464	84496	a	a	+
+chr1	84464	84496	a	a	+
+chr1	84464	84496	a	a	+
+chr1	84464	84496	a	a	+
+chr1	84432	84464	b	b	-
+chr1	84432	84464	b	b	-
+chr1	84432	84464	b	b	-
+chr1	84465	84497	a	a	+
+chr1	84465	84497	a	a	+
+chr1	84442	84474	b	b	-
+chr1	84475	84507	a	a	+
+chr1	84445	84477	b	b	-
+chr1	84517	84549	a	a	+
+chr1	84517	84549	a	a	+
+chr1	84889	84921	a	a	+
+chr1	84900	84932	a	a	+
+chr1	85017	85049	b	b	-
+chr1	85075	85107	a	a	+
+chr1	85218	85250	a	a	+
+chr1	85362	85394	a	a	+
+chr1	85539	85571	b	b	-
+chr1	85588	85620	a	a	+
+chr1	85632	85664	a	a	+
+chr1	85723	85755	a	a	+
+chr1	85877	85909	b	b	-
+chr1	86012	86044	b	b	-
+chr1	86019	86051	b	b	-
+chr1	86033	86065	b	b	-
+chr1	86227	86259	a	a	+
+chr1	86311	86343	b	b	-
+chr1	86515	86547	a	a	+
+chr1	86636	86668	b	b	-
+chr1	86658	86690	b	b	-
+chr1	86697	86729	a	a	+
+chr1	86702	86734	a	a	+
+chr1	86705	86737	a	a	+
+chr1	86675	86707	b	b	-
+chr1	86677	86709	b	b	-
+chr1	86677	86709	b	b	-
+chr1	86806	86838	b	b	-
+chr1	86812	86844	b	b	-
+chr1	86850	86882	b	b	-
+chr1	86850	86882	b	b	-
+chr1	86943	86975	b	b	-
+chr1	86943	86975	b	b	-
+chr1	86943	86975	b	b	-
+chr1	86978	87010	a	a	+
+chr1	86962	86994	b	b	-
+chr1	86962	86994	b	b	-
+chr1	86967	86999	b	b	-
+chr1	86967	86999	b	b	-
+chr1	86973	87005	b	b	-
+chr1	87008	87040	a	a	+
+chr1	86977	87009	b	b	-
+chr1	87010	87042	a	a	+
+chr1	87011	87043	a	a	+
+chr1	87011	87043	a	a	+
+chr1	87011	87043	a	a	+
+chr1	87012	87044	a	a	+
+chr1	87012	87044	a	a	+
+chr1	87012	87044	a	a	+
+chr1	87012	87044	a	a	+
+chr1	87012	87044	a	a	+
+chr1	87012	87044	a	a	+
+chr1	86980	87012	b	b	-
+chr1	86980	87012	b	b	-
+chr1	87013	87045	a	a	+
+chr1	87013	87045	a	a	+
+chr1	87013	87045	a	a	+
+chr1	87013	87045	a	a	+
+chr1	87013	87045	a	a	+
+chr1	86983	87015	b	b	-
+chr1	86983	87015	b	b	-
+chr1	86983	87015	b	b	-
+chr1	86984	87016	b	b	-
+chr1	86985	87017	b	b	-
+chr1	86985	87017	b	b	-
+chr1	86987	87019	b	b	-
+chr1	86987	87019	b	b	-
+chr1	87020	87052	a	a	+
+chr1	87020	87052	a	a	+
+chr1	87020	87052	a	a	+
+chr1	87020	87052	a	a	+
+chr1	87021	87053	a	a	+
+chr1	87021	87053	a	a	+
+chr1	87021	87053	a	a	+
+chr1	87022	87054	a	a	+
+chr1	86992	87024	b	b	-
+chr1	87026	87058	a	a	+
+chr1	87026	87058	a	a	+
+chr1	87028	87060	a	a	+
+chr1	87028	87060	a	a	+
+chr1	87028	87060	a	a	+
+chr1	87028	87060	a	a	+
+chr1	87028	87060	a	a	+
+chr1	87028	87060	a	a	+
+chr1	87028	87060	a	a	+
+chr1	87028	87060	a	a	+
+chr1	87028	87060	a	a	+
+chr1	87032	87064	a	a	+
+chr1	87032	87064	a	a	+
+chr1	87000	87032	b	b	-
+chr1	87000	87032	b	b	-
+chr1	87000	87032	b	b	-
+chr1	87000	87032	b	b	-
+chr1	87000	87032	b	b	-
+chr1	87000	87032	b	b	-
+chr1	87000	87032	b	b	-
+chr1	87000	87032	b	b	-
+chr1	87001	87033	b	b	-
+chr1	87001	87033	b	b	-
+chr1	87001	87033	b	b	-
+chr1	87001	87033	b	b	-
+chr1	87001	87033	b	b	-
+chr1	87001	87033	b	b	-
+chr1	87001	87033	b	b	-
+chr1	87001	87033	b	b	-
+chr1	87036	87068	a	a	+
+chr1	87005	87037	b	b	-
+chr1	87040	87072	a	a	+
+chr1	87040	87072	a	a	+
+chr1	87040	87072	a	a	+
+chr1	87008	87040	b	b	-
+chr1	87008	87040	b	b	-
+chr1	87011	87043	b	b	-
+chr1	87011	87043	b	b	-
+chr1	87011	87043	b	b	-
+chr1	87012	87044	b	b	-
+chr1	87012	87044	b	b	-
+chr1	87012	87044	b	b	-
+chr1	87013	87045	b	b	-
+chr1	87046	87078	a	a	+
+chr1	87015	87047	b	b	-
+chr1	87048	87080	a	a	+
+chr1	87016	87048	b	b	-
+chr1	87049	87081	a	a	+
+chr1	87052	87084	a	a	+
+chr1	87024	87056	b	b	-
+chr1	87024	87056	b	b	-
+chr1	87042	87074	b	b	-
+chr1	87288	87320	a	a	+
+chr1	87256	87288	b	b	-
+chr1	87258	87290	b	b	-
+chr1	87258	87290	b	b	-
+chr1	87258	87290	b	b	-
+chr1	87262	87294	b	b	-
+chr1	87302	87334	a	a	+
+chr1	87302	87334	a	a	+
+chr1	87306	87338	a	a	+
+chr1	87306	87338	a	a	+
+chr1	87306	87338	a	a	+
+chr1	87307	87339	a	a	+
+chr1	87307	87339	a	a	+
+chr1	87307	87339	a	a	+
+chr1	87275	87307	b	b	-
+chr1	87276	87308	b	b	-
+chr1	87276	87308	b	b	-
+chr1	87276	87308	b	b	-
+chr1	87309	87341	a	a	+
+chr1	87309	87341	a	a	+
+chr1	87309	87341	a	a	+
+chr1	87309	87341	a	a	+
+chr1	87309	87341	a	a	+
+chr1	87309	87341	a	a	+
+chr1	87278	87310	b	b	-
+chr1	87311	87343	a	a	+
+chr1	87311	87343	a	a	+
+chr1	87279	87311	b	b	-
+chr1	87279	87311	b	b	-
+chr1	87279	87311	b	b	-
+chr1	87279	87311	b	b	-
+chr1	87312	87344	a	a	+
+chr1	87312	87344	a	a	+
+chr1	87312	87344	a	a	+
+chr1	87313	87345	a	a	+
+chr1	87313	87345	a	a	+
+chr1	87313	87345	a	a	+
+chr1	87313	87345	a	a	+
+chr1	87313	87345	a	a	+
+chr1	87313	87345	a	a	+
+chr1	87313	87345	a	a	+
+chr1	87313	87345	a	a	+
+chr1	87313	87345	a	a	+
+chr1	87313	87345	a	a	+
+chr1	87313	87345	a	a	+
+chr1	87313	87345	a	a	+
+chr1	87313	87345	a	a	+
+chr1	87313	87345	a	a	+
+chr1	87313	87345	a	a	+
+chr1	87283	87315	b	b	-
+chr1	87316	87348	a	a	+
+chr1	87316	87348	a	a	+
+chr1	87316	87348	a	a	+
+chr1	87316	87348	a	a	+
+chr1	87285	87317	b	b	-
+chr1	87285	87317	b	b	-
+chr1	87285	87317	b	b	-
+chr1	87285	87317	b	b	-
+chr1	87285	87317	b	b	-
+chr1	87285	87317	b	b	-
+chr1	87285	87317	b	b	-
+chr1	87285	87317	b	b	-
+chr1	87285	87317	b	b	-
+chr1	87285	87317	b	b	-
+chr1	87285	87317	b	b	-
+chr1	87285	87317	b	b	-
+chr1	87285	87317	b	b	-
+chr1	87285	87317	b	b	-
+chr1	87285	87317	b	b	-
+chr1	87285	87317	b	b	-
+chr1	87286	87318	b	b	-
+chr1	87286	87318	b	b	-
+chr1	87286	87318	b	b	-
+chr1	87286	87318	b	b	-
+chr1	87286	87318	b	b	-
+chr1	87286	87318	b	b	-
+chr1	87286	87318	b	b	-
+chr1	87286	87318	b	b	-
+chr1	87286	87318	b	b	-
+chr1	87286	87318	b	b	-
+chr1	87286	87318	b	b	-
+chr1	87286	87318	b	b	-
+chr1	87286	87318	b	b	-
+chr1	87286	87318	b	b	-
+chr1	87286	87318	b	b	-
+chr1	87286	87318	b	b	-
+chr1	87320	87352	a	a	+
+chr1	87320	87352	a	a	+
+chr1	87320	87352	a	a	+
+chr1	87321	87353	a	a	+
+chr1	87321	87353	a	a	+
+chr1	87321	87353	a	a	+
+chr1	87289	87321	b	b	-
+chr1	87289	87321	b	b	-
+chr1	87290	87322	b	b	-
+chr1	87292	87324	b	b	-
+chr1	87292	87324	b	b	-
+chr1	87292	87324	b	b	-
+chr1	87292	87324	b	b	-
+chr1	87292	87324	b	b	-
+chr1	87293	87325	b	b	-
+chr1	87294	87326	b	b	-
+chr1	87300	87332	b	b	-
+chr1	87300	87332	b	b	-
+chr1	87300	87332	b	b	-
+chr1	87334	87366	a	a	+
+chr1	87302	87334	b	b	-
+chr1	87335	87367	a	a	+
+chr1	87309	87341	b	b	-
+chr1	87310	87342	b	b	-
+chr1	87317	87349	b	b	-
+chr1	87369	87401	a	a	+
+chr1	87399	87431	b	b	-
+chr1	87459	87491	b	b	-
+chr1	87466	87498	b	b	-
+chr1	87608	87640	b	b	-
+chr1	87608	87640	b	b	-
+chr1	87659	87691	a	a	+
+chr1	87659	87691	a	a	+
+chr1	87660	87692	a	a	+
+chr1	87661	87693	a	a	+
+chr1	87629	87661	b	b	-
+chr1	87695	87727	a	a	+
+chr1	87666	87698	b	b	-
+chr1	87969	88001	a	a	+
+chr1	87981	88013	b	b	-
+chr1	88028	88060	a	a	+
+chr1	88194	88226	b	b	-
+chr1	88349	88381	b	b	-
+chr1	88349	88381	b	b	-
+chr1	89184	89216	b	b	-
+chr1	89242	89274	a	a	+
+chr1	89554	89586	b	b	-
+chr1	90243	90275	b	b	-
+chr1	91080	91112	a	a	+
+chr1	91777	91809	a	a	+
+chr1	91978	92010	b	b	-
+chr1	91978	92010	b	b	-
+chr1	92045	92077	a	a	+
+chr1	92108	92140	a	a	+
+chr1	92242	92274	a	a	+
+chr1	92242	92274	a	a	+
+chr1	92242	92274	a	a	+
+chr1	92443	92475	b	b	-
+chr1	92444	92476	b	b	-
+chr1	92478	92510	a	a	+
+chr1	92463	92495	b	b	-
+chr1	92882	92914	a	a	+
+chr1	92883	92915	a	a	+
+chr1	92856	92888	b	b	-
+chr1	92889	92921	a	a	+
+chr1	92857	92889	b	b	-
+chr1	92857	92889	b	b	-
+chr1	92890	92922	a	a	+
+chr1	92894	92926	a	a	+
+chr1	92894	92926	a	a	+
+chr1	92862	92894	b	b	-
+chr1	92862	92894	b	b	-
+chr1	92862	92894	b	b	-
+chr1	92895	92927	a	a	+
+chr1	92896	92928	a	a	+
+chr1	92896	92928	a	a	+
+chr1	92866	92898	b	b	-
+chr1	92899	92931	a	a	+
+chr1	92899	92931	a	a	+
+chr1	92904	92936	a	a	+
+chr1	92904	92936	a	a	+
+chr1	92904	92936	a	a	+
+chr1	92872	92904	b	b	-
+chr1	92873	92905	b	b	-
+chr1	92873	92905	b	b	-
+chr1	92873	92905	b	b	-
+chr1	92875	92907	b	b	-
+chr1	92908	92940	a	a	+
+chr1	92876	92908	b	b	-
+chr1	92876	92908	b	b	-
+chr1	92877	92909	b	b	-
+chr1	92877	92909	b	b	-
+chr1	92912	92944	a	a	+
+chr1	92917	92949	a	a	+
+chr1	92922	92954	a	a	+
+chr1	92890	92922	b	b	-
+chr1	92890	92922	b	b	-
+chr1	92890	92922	b	b	-
+chr1	92890	92922	b	b	-
+chr1	92890	92922	b	b	-
+chr1	92923	92955	a	a	+
+chr1	92923	92955	a	a	+
+chr1	92923	92955	a	a	+
+chr1	92891	92923	b	b	-
+chr1	92926	92958	a	a	+
+chr1	92894	92926	b	b	-
+chr1	92896	92928	b	b	-
+chr1	92896	92928	b	b	-
+chr1	92897	92929	b	b	-
+chr1	92902	92934	b	b	-
+chr1	92935	92967	a	a	+
+chr1	92939	92971	a	a	+
+chr1	92942	92974	a	a	+
+chr1	92926	92958	b	b	-
+chr1	93005	93037	b	b	-
+chr1	93005	93037	b	b	-
+chr1	93056	93088	a	a	+
+chr1	93056	93088	a	a	+
+chr1	93025	93057	b	b	-
+chr1	93037	93069	b	b	-
+chr1	93070	93102	a	a	+
+chr1	93075	93107	a	a	+
+chr1	93076	93108	a	a	+
+chr1	93077	93109	a	a	+
+chr1	93049	93081	b	b	-
+chr1	93049	93081	b	b	-
+chr1	93049	93081	b	b	-
+chr1	93050	93082	b	b	-
+chr1	93050	93082	b	b	-
+chr1	93064	93096	b	b	-
+chr1	93076	93108	b	b	-
+chr1	93078	93110	b	b	-
+chr1	93121	93153	a	a	+
+chr1	93123	93155	a	a	+
+chr1	93130	93162	a	a	+
+chr1	93188	93220	b	b	-
+chr1	93207	93239	b	b	-
+chr1	93209	93241	b	b	-
+chr1	93249	93281	a	a	+
+chr1	93219	93251	b	b	-
+chr1	93238	93270	b	b	-
+chr1	93370	93402	a	a	+
+chr1	93390	93422	a	a	+
+chr1	93522	93554	b	b	-
+chr1	93559	93591	a	a	+
+chr1	93559	93591	a	a	+
+chr1	93571	93603	a	a	+
+chr1	93575	93607	a	a	+
+chr1	93595	93627	a	a	+
+chr1	93683	93715	a	a	+
+chr1	93711	93743	b	b	-
+chr1	93720	93752	b	b	-
+chr1	93887	93919	b	b	-
+chr1	94167	94199	a	a	+
+chr1	94167	94199	a	a	+
+chr1	94216	94248	b	b	-
+chr1	94217	94249	b	b	-
+chr1	94246	94278	b	b	-
+chr1	94354	94386	a	a	+
+chr1	94416	94448	b	b	-
+chr1	94594	94626	b	b	-
+chr1	94627	94659	a	a	+
+chr1	94628	94660	a	a	+
+chr1	94628	94660	a	a	+
+chr1	94628	94660	a	a	+
+chr1	94654	94686	a	a	+
+chr1	94656	94688	a	a	+
+chr1	94660	94692	a	a	+
+chr1	94628	94660	b	b	-
+chr1	94661	94693	a	a	+
+chr1	94633	94665	b	b	-
+chr1	94633	94665	b	b	-
+chr1	94639	94671	b	b	-
+chr1	94639	94671	b	b	-
+chr1	94672	94704	a	a	+
+chr1	94672	94704	a	a	+
+chr1	94641	94673	b	b	-
+chr1	94649	94681	b	b	-
+chr1	94689	94721	a	a	+
+chr1	94692	94724	a	a	+
+chr1	94694	94726	a	a	+
+chr1	94665	94697	b	b	-
+chr1	94668	94700	b	b	-
+chr1	94668	94700	b	b	-
+chr1	94674	94706	b	b	-
+chr1	94688	94720	b	b	-
+chr1	94688	94720	b	b	-
+chr1	94894	94926	b	b	-
+chr1	94955	94987	a	a	+
+chr1	94956	94988	a	a	+
+chr1	94980	95012	a	a	+
+chr1	94954	94986	b	b	-
+chr1	94955	94987	b	b	-
+chr1	95008	95040	a	a	+
+chr1	95043	95075	b	b	-
+chr1	95078	95110	a	a	+
+chr1	95078	95110	a	a	+
+chr1	95101	95133	a	a	+
+chr1	95073	95105	b	b	-
+chr1	95145	95177	b	b	-
+chr1	95152	95184	b	b	-
+chr1	95204	95236	a	a	+
+chr1	95289	95321	b	b	-
+chr1	95301	95333	b	b	-
+chr1	95320	95352	b	b	-
+chr1	95348	95380	b	b	-
+chr1	95364	95396	b	b	-
+chr1	95751	95783	b	b	-
+chr1	95751	95783	b	b	-
+chr1	96070	96102	b	b	-
+chr1	96070	96102	b	b	-
+chr1	96224	96256	b	b	-
+chr1	96224	96256	b	b	-
+chr1	96821	96853	a	a	+
+chr1	96821	96853	a	a	+
+chr1	97008	97040	a	a	+
+chr1	97150	97182	a	a	+
+chr1	97303	97335	b	b	-
+chr1	97389	97421	a	a	+
+chr1	97389	97421	a	a	+
+chr1	97703	97735	a	a	+
+chr1	97779	97811	b	b	-
+chr1	98228	98260	b	b	-
+chr1	98895	98927	b	b	-
+chr1	98941	98973	a	a	+
+chr1	99102	99134	a	a	+
+chr1	99161	99193	b	b	-
+chr1	99362	99394	b	b	-
+chr1	99413	99445	a	a	+
+chr1	99414	99446	a	a	+
+chr1	99566	99598	a	a	+
+chr1	99535	99567	b	b	-
+chr1	99536	99568	b	b	-
+chr1	99569	99601	a	a	+
+chr1	99574	99606	a	a	+
+chr1	99542	99574	b	b	-
+chr1	99578	99610	a	a	+
+chr1	99546	99578	b	b	-
+chr1	99547	99579	b	b	-
+chr1	99563	99595	b	b	-
+chr1	99565	99597	b	b	-
+chr1	99602	99634	a	a	+
+chr1	99622	99654	a	a	+
+chr1	99622	99654	a	a	+
+chr1	99682	99714	a	a	+
+chr1	99709	99741	a	a	+
+chr1	99710	99742	a	a	+
+chr1	99711	99743	a	a	+
+chr1	99716	99748	a	a	+
+chr1	99716	99748	a	a	+
+chr1	99716	99748	a	a	+
+chr1	99716	99748	a	a	+
+chr1	99716	99748	a	a	+
+chr1	99716	99748	a	a	+
+chr1	99716	99748	a	a	+
+chr1	99716	99748	a	a	+
+chr1	99716	99748	a	a	+
+chr1	99687	99719	b	b	-
+chr1	99688	99720	b	b	-
+chr1	99688	99720	b	b	-
+chr1	99688	99720	b	b	-
+chr1	99722	99754	a	a	+
+chr1	99728	99760	a	a	+
+chr1	99700	99732	b	b	-
+chr1	99733	99765	a	a	+
+chr1	99733	99765	a	a	+
+chr1	99733	99765	a	a	+
+chr1	99701	99733	b	b	-
+chr1	99701	99733	b	b	-
+chr1	99701	99733	b	b	-
+chr1	99701	99733	b	b	-
+chr1	99702	99734	b	b	-
+chr1	99704	99736	b	b	-
+chr1	99738	99770	a	a	+
+chr1	99738	99770	a	a	+
+chr1	99738	99770	a	a	+
+chr1	99738	99770	a	a	+
+chr1	99738	99770	a	a	+
+chr1	99706	99738	b	b	-
+chr1	99706	99738	b	b	-
+chr1	99706	99738	b	b	-
+chr1	99741	99773	a	a	+
+chr1	99709	99741	b	b	-
+chr1	99709	99741	b	b	-
+chr1	99709	99741	b	b	-
+chr1	99709	99741	b	b	-
+chr1	99709	99741	b	b	-
+chr1	99709	99741	b	b	-
+chr1	99709	99741	b	b	-
+chr1	99709	99741	b	b	-
+chr1	99709	99741	b	b	-
+chr1	99711	99743	b	b	-
+chr1	99711	99743	b	b	-
+chr1	99711	99743	b	b	-
+chr1	99745	99777	a	a	+
+chr1	99747	99779	a	a	+
+chr1	99747	99779	a	a	+
+chr1	99735	99767	b	b	-
+chr1	99771	99803	a	a	+
+chr1	100148	100180	b	b	-
+chr1	100184	100216	b	b	-
+chr1	100303	100335	a	a	+
+chr1	100770	100802	a	a	+
+chr1	100751	100783	b	b	-
+chr1	100816	100848	a	a	+
+chr1	100816	100848	a	a	+
+chr1	100822	100854	a	a	+
+chr1	100796	100828	b	b	-
+chr1	100902	100934	a	a	+
+chr1	100953	100985	a	a	+
+chr1	100969	101001	a	a	+
+chr1	100945	100977	b	b	-
+chr1	100946	100978	b	b	-
+chr1	100946	100978	b	b	-
+chr1	100947	100979	b	b	-
+chr1	100981	101013	a	a	+
+chr1	101084	101116	b	b	-
+chr1	101089	101121	b	b	-
+chr1	101091	101123	b	b	-
+chr1	101091	101123	b	b	-
+chr1	101093	101125	b	b	-
+chr1	101093	101125	b	b	-
+chr1	101126	101158	a	a	+
+chr1	101095	101127	b	b	-
+chr1	101128	101160	a	a	+
+chr1	101128	101160	a	a	+
+chr1	101128	101160	a	a	+
+chr1	101132	101164	a	a	+
+chr1	101100	101132	b	b	-
+chr1	101133	101165	a	a	+
+chr1	101133	101165	a	a	+
+chr1	101102	101134	b	b	-
+chr1	101102	101134	b	b	-
+chr1	101105	101137	b	b	-
+chr1	101143	101175	a	a	+
+chr1	101145	101177	a	a	+
+chr1	101146	101178	a	a	+
+chr1	101115	101147	b	b	-
+chr1	101115	101147	b	b	-
+chr1	101127	101159	b	b	-
+chr1	101162	101194	a	a	+
+chr1	101166	101198	a	a	+
+chr1	101170	101202	a	a	+
+chr1	101180	101212	a	a	+
+chr1	101182	101214	a	a	+
+chr1	101231	101263	a	a	+
+chr1	101610	101642	a	a	+
+chr1	101610	101642	a	a	+
+chr1	101610	101642	b	b	-
+chr1	101773	101805	b	b	-
+chr1	101999	102031	a	a	+
+chr1	101986	102018	b	b	-
+chr1	102343	102375	a	a	+
+chr1	102580	102612	b	b	-
+chr1	103010	103042	a	a	+
+chr1	103523	103555	a	a	+
+chr1	103536	103568	b	b	-
+chr1	103623	103655	a	a	+
+chr1	103609	103641	b	b	-
+chr1	103824	103856	b	b	-
+chr1	103824	103856	b	b	-
+chr1	103824	103856	b	b	-
+chr1	104290	104322	b	b	-
+chr1	104323	104355	a	a	+
+chr1	105112	105144	a	a	+
+chr1	105280	105312	a	a	+
+chr1	105289	105321	a	a	+
+chr1	105289	105321	a	a	+
+chr1	105289	105321	a	a	+
+chr1	105426	105458	a	a	+
+chr1	105531	105563	b	b	-
+chr1	105577	105609	b	b	-
+chr1	105577	105609	b	b	-
+chr1	105577	105609	b	b	-
+chr1	105577	105609	b	b	-
+chr1	105613	105645	a	a	+
+chr1	105705	105737	b	b	-
+chr1	105742	105774	a	a	+
+chr1	105714	105746	b	b	-
+chr1	105749	105781	a	a	+
+chr1	105721	105753	b	b	-
+chr1	105721	105753	b	b	-
+chr1	105721	105753	b	b	-
+chr1	105763	105795	a	a	+
+chr1	105773	105805	a	a	+
+chr1	105773	105805	a	a	+
+chr1	105773	105805	a	a	+
+chr1	105744	105776	b	b	-
+chr1	105845	105877	b	b	-
+chr1	105847	105879	b	b	-
+chr1	105847	105879	b	b	-
+chr1	105901	105933	a	a	+
+chr1	105902	105934	a	a	+
+chr1	105873	105905	b	b	-
+chr1	105908	105940	a	a	+
+chr1	105908	105940	a	a	+
+chr1	105909	105941	a	a	+
+chr1	105882	105914	b	b	-
+chr1	105885	105917	b	b	-
+chr1	105886	105918	b	b	-
+chr1	105886	105918	b	b	-
+chr1	105919	105951	a	a	+
+chr1	105889	105921	b	b	-
+chr1	105889	105921	b	b	-
+chr1	105922	105954	a	a	+
+chr1	105922	105954	a	a	+
+chr1	105922	105954	a	a	+
+chr1	105922	105954	a	a	+
+chr1	105923	105955	a	a	+
+chr1	105923	105955	a	a	+
+chr1	105923	105955	a	a	+
+chr1	105923	105955	a	a	+
+chr1	105923	105955	a	a	+
+chr1	105891	105923	b	b	-
+chr1	105891	105923	b	b	-
+chr1	105924	105956	a	a	+
+chr1	105924	105956	a	a	+
+chr1	105924	105956	a	a	+
+chr1	105924	105956	a	a	+
+chr1	105924	105956	a	a	+
+chr1	105925	105957	a	a	+
+chr1	105893	105925	b	b	-
+chr1	105893	105925	b	b	-
+chr1	105893	105925	b	b	-
+chr1	105893	105925	b	b	-
+chr1	105893	105925	b	b	-
+chr1	105927	105959	a	a	+
+chr1	105927	105959	a	a	+
+chr1	105927	105959	a	a	+
+chr1	105928	105960	a	a	+
+chr1	105896	105928	b	b	-
+chr1	105896	105928	b	b	-
+chr1	105896	105928	b	b	-
+chr1	105930	105962	a	a	+
+chr1	105899	105931	b	b	-
+chr1	105899	105931	b	b	-
+chr1	105901	105933	b	b	-
+chr1	105901	105933	b	b	-
+chr1	105901	105933	b	b	-
+chr1	105901	105933	b	b	-
+chr1	105901	105933	b	b	-
+chr1	105902	105934	b	b	-
+chr1	105902	105934	b	b	-
+chr1	105902	105934	b	b	-
+chr1	105937	105969	a	a	+
+chr1	105938	105970	a	a	+
+chr1	105908	105940	b	b	-
+chr1	105908	105940	b	b	-
+chr1	105941	105973	a	a	+
+chr1	105941	105973	a	a	+
+chr1	105941	105973	a	a	+
+chr1	105942	105974	a	a	+
+chr1	105942	105974	a	a	+
+chr1	105942	105974	a	a	+
+chr1	105942	105974	a	a	+
+chr1	105942	105974	a	a	+
+chr1	105942	105974	a	a	+
+chr1	105943	105975	a	a	+
+chr1	105945	105977	a	a	+
+chr1	105945	105977	a	a	+
+chr1	105945	105977	a	a	+
+chr1	105934	105966	b	b	-
+chr1	105976	106008	a	a	+
+chr1	105976	106008	a	a	+
+chr1	106004	106036	a	a	+
+chr1	106141	106173	b	b	-
+chr1	106163	106195	b	b	-
+chr1	106409	106441	a	a	+
+chr1	107494	107526	b	b	-
+chr1	107602	107634	a	a	+
+chr1	107839	107871	a	a	+
+chr1	108251	108283	a	a	+
+chr1	108254	108286	a	a	+
+chr1	108254	108286	a	a	+
+chr1	108368	108400	b	b	-
+chr1	108368	108400	b	b	-
+chr1	108433	108465	a	a	+
+chr1	108409	108441	b	b	-
+chr1	108434	108466	b	b	-
+chr1	108563	108595	a	a	+
+chr1	108543	108575	b	b	-
+chr1	108543	108575	b	b	-
+chr1	108577	108609	a	a	+
+chr1	108589	108621	a	a	+
+chr1	108593	108625	a	a	+
+chr1	108593	108625	a	a	+
+chr1	108594	108626	a	a	+
+chr1	108595	108627	a	a	+
+chr1	108595	108627	a	a	+
+chr1	108595	108627	a	a	+
+chr1	108595	108627	a	a	+
+chr1	108598	108630	a	a	+
+chr1	108566	108598	b	b	-
+chr1	108567	108599	b	b	-
+chr1	108568	108600	b	b	-
+chr1	108601	108633	a	a	+
+chr1	108601	108633	a	a	+
+chr1	108601	108633	a	a	+
+chr1	108601	108633	a	a	+
+chr1	108570	108602	b	b	-
+chr1	108570	108602	b	b	-
+chr1	108570	108602	b	b	-
+chr1	108603	108635	a	a	+
+chr1	108571	108603	b	b	-
+chr1	108571	108603	b	b	-
+chr1	108572	108604	b	b	-
+chr1	108572	108604	b	b	-
+chr1	108608	108640	a	a	+
+chr1	108608	108640	a	a	+
+chr1	108608	108640	a	a	+
+chr1	108608	108640	a	a	+
+chr1	108610	108642	a	a	+
+chr1	108613	108645	a	a	+
+chr1	108619	108651	a	a	+
+chr1	108589	108621	b	b	-
+chr1	108624	108656	a	a	+
+chr1	108629	108661	a	a	+
+chr1	108629	108661	a	a	+
+chr1	108608	108640	b	b	-
+chr1	108612	108644	b	b	-
+chr1	108615	108647	b	b	-
+chr1	108619	108651	b	b	-
+chr1	108915	108947	b	b	-
+chr1	109253	109285	b	b	-
+chr1	109291	109323	a	a	+
+chr1	109713	109745	b	b	-
+chr1	109725	109757	b	b	-
+chr1	109794	109826	a	a	+
+chr1	109778	109810	b	b	-
+chr1	109949	109981	a	a	+
+chr1	110062	110094	a	a	+
+chr1	110043	110075	b	b	-
+chr1	110081	110113	a	a	+
+chr1	110086	110118	a	a	+
+chr1	110202	110234	b	b	-
+chr1	110212	110244	b	b	-
+chr1	110228	110260	b	b	-
+chr1	110247	110279	b	b	-
+chr1	110316	110348	a	a	+
+chr1	110317	110349	b	b	-
+chr1	110325	110357	b	b	-
+chr1	110334	110366	b	b	-
+chr1	110372	110404	a	a	+
+chr1	110372	110404	a	a	+
+chr1	110372	110404	a	a	+
+chr1	110372	110404	a	a	+
+chr1	110340	110372	b	b	-
+chr1	110346	110378	b	b	-
+chr1	110384	110416	a	a	+
+chr1	110386	110418	a	a	+
+chr1	110386	110418	a	a	+
+chr1	110386	110418	a	a	+
+chr1	110386	110418	a	a	+
+chr1	110386	110418	a	a	+
+chr1	110354	110386	b	b	-
+chr1	110355	110387	b	b	-
+chr1	110388	110420	a	a	+
+chr1	110392	110424	a	a	+
+chr1	110392	110424	a	a	+
+chr1	110392	110424	a	a	+
+chr1	110360	110392	b	b	-
+chr1	110360	110392	b	b	-
+chr1	110362	110394	b	b	-
+chr1	110395	110427	a	a	+
+chr1	110395	110427	a	a	+
+chr1	110395	110427	a	a	+
+chr1	110395	110427	a	a	+
+chr1	110364	110396	b	b	-
+chr1	110398	110430	a	a	+
+chr1	110398	110430	a	a	+
+chr1	110401	110433	a	a	+
+chr1	110401	110433	a	a	+
+chr1	110401	110433	a	a	+
+chr1	110401	110433	a	a	+
+chr1	110406	110438	a	a	+
+chr1	110406	110438	a	a	+
+chr1	110375	110407	b	b	-
+chr1	110375	110407	b	b	-
+chr1	110375	110407	b	b	-
+chr1	110375	110407	b	b	-
+chr1	110375	110407	b	b	-
+chr1	110375	110407	b	b	-
+chr1	110375	110407	b	b	-
+chr1	110375	110407	b	b	-
+chr1	110375	110407	b	b	-
+chr1	110416	110448	a	a	+
+chr1	110417	110449	a	a	+
+chr1	110417	110449	a	a	+
+chr1	110417	110449	a	a	+
+chr1	110386	110418	b	b	-
+chr1	110386	110418	b	b	-
+chr1	110387	110419	b	b	-
+chr1	110394	110426	b	b	-
+chr1	110394	110426	b	b	-
+chr1	110427	110459	a	a	+
+chr1	110395	110427	b	b	-
+chr1	110428	110460	a	a	+
+chr1	110428	110460	a	a	+
+chr1	110428	110460	a	a	+
+chr1	110434	110466	a	a	+
+chr1	110461	110493	a	a	+
+chr1	110461	110493	a	a	+
+chr1	110461	110493	a	a	+
+chr1	110461	110493	a	a	+
+chr1	110790	110822	b	b	-
+chr1	111191	111223	b	b	-
+chr1	111278	111310	b	b	-
+chr1	111293	111325	b	b	-
+chr1	111439	111471	a	a	+
+chr1	111586	111618	b	b	-
+chr1	111728	111760	b	b	-
+chr1	111728	111760	b	b	-
+chr1	112053	112085	a	a	+
+chr1	112267	112299	a	a	+
+chr1	112527	112559	a	a	+
+chr1	112516	112548	b	b	-
+chr1	112878	112910	a	a	+
+chr1	112972	113004	b	b	-
+chr1	113014	113046	a	a	+
+chr1	113059	113091	a	a	+
+chr1	113072	113104	a	a	+
+chr1	113186	113218	a	a	+
+chr1	113154	113186	b	b	-
+chr1	113201	113233	a	a	+
+chr1	113197	113229	b	b	-
+chr1	113197	113229	b	b	-
+chr1	113312	113344	a	a	+
+chr1	113295	113327	b	b	-
+chr1	113302	113334	b	b	-
+chr1	113304	113336	b	b	-
+chr1	113338	113370	a	a	+
+chr1	113338	113370	a	a	+
+chr1	113339	113371	a	a	+
+chr1	113308	113340	b	b	-
+chr1	113309	113341	b	b	-
+chr1	113309	113341	b	b	-
+chr1	113342	113374	a	a	+
+chr1	113343	113375	a	a	+
+chr1	113344	113376	a	a	+
+chr1	113344	113376	a	a	+
+chr1	113314	113346	b	b	-
+chr1	113347	113379	a	a	+
+chr1	113348	113380	a	a	+
+chr1	113348	113380	a	a	+
+chr1	113351	113383	a	a	+
+chr1	113351	113383	a	a	+
+chr1	113351	113383	a	a	+
+chr1	113351	113383	a	a	+
+chr1	113351	113383	a	a	+
+chr1	113351	113383	a	a	+
+chr1	113351	113383	a	a	+
+chr1	113351	113383	a	a	+
+chr1	113321	113353	b	b	-
+chr1	113321	113353	b	b	-
+chr1	113321	113353	b	b	-
+chr1	113322	113354	b	b	-
+chr1	113322	113354	b	b	-
+chr1	113322	113354	b	b	-
+chr1	113355	113387	a	a	+
+chr1	113327	113359	b	b	-
+chr1	113327	113359	b	b	-
+chr1	113360	113392	a	a	+
+chr1	113360	113392	a	a	+
+chr1	113360	113392	a	a	+
+chr1	113328	113360	b	b	-
+chr1	113363	113395	a	a	+
+chr1	113331	113363	b	b	-
+chr1	113332	113364	b	b	-
+chr1	113332	113364	b	b	-
+chr1	113336	113368	b	b	-
+chr1	113336	113368	b	b	-
+chr1	113336	113368	b	b	-
+chr1	113337	113369	b	b	-
+chr1	113341	113373	b	b	-
+chr1	113341	113373	b	b	-
+chr1	113353	113385	b	b	-
+chr1	113356	113388	b	b	-
+chr1	113360	113392	b	b	-
+chr1	113563	113595	b	b	-
+chr1	113569	113601	b	b	-
+chr1	113605	113637	a	a	+
+chr1	113574	113606	b	b	-
+chr1	113610	113642	a	a	+
+chr1	113610	113642	a	a	+
+chr1	113615	113647	a	a	+
+chr1	113583	113615	b	b	-
+chr1	113583	113615	b	b	-
+chr1	113588	113620	b	b	-
+chr1	113621	113653	a	a	+
+chr1	113594	113626	b	b	-
+chr1	113594	113626	b	b	-
+chr1	113595	113627	b	b	-
+chr1	113596	113628	b	b	-
+chr1	113596	113628	b	b	-
+chr1	113596	113628	b	b	-
+chr1	113596	113628	b	b	-
+chr1	113596	113628	b	b	-
+chr1	113596	113628	b	b	-
+chr1	113596	113628	b	b	-
+chr1	113596	113628	b	b	-
+chr1	113596	113628	b	b	-
+chr1	113596	113628	b	b	-
+chr1	113596	113628	b	b	-
+chr1	113634	113666	a	a	+
+chr1	113635	113667	a	a	+
+chr1	113635	113667	a	a	+
+chr1	113640	113672	a	a	+
+chr1	113614	113646	b	b	-
+chr1	113655	113687	a	a	+
+chr1	113662	113694	a	a	+
+chr1	113671	113703	a	a	+
+chr1	113677	113709	a	a	+
+chr1	113752	113784	a	a	+
+chr1	113752	113784	a	a	+
+chr1	113761	113793	b	b	-
+chr1	113761	113793	b	b	-
+chr1	113799	113831	a	a	+
+chr1	113800	113832	a	a	+
+chr1	113922	113954	a	a	+
+chr1	113952	113984	a	a	+
+chr1	114062	114094	b	b	-
+chr1	114065	114097	b	b	-
+chr1	114109	114141	a	a	+
+chr1	114167	114199	a	a	+
+chr1	114167	114199	a	a	+
+chr1	114246	114278	b	b	-
+chr1	114256	114288	b	b	-
+chr1	114353	114385	b	b	-
+chr1	114393	114425	a	a	+
+chr1	114364	114396	b	b	-
+chr1	114416	114448	a	a	+
+chr1	114389	114421	b	b	-
+chr1	114389	114421	b	b	-
+chr1	114389	114421	b	b	-
+chr1	114389	114421	b	b	-
+chr1	114389	114421	b	b	-
+chr1	114440	114472	a	a	+
+chr1	114489	114521	b	b	-
+chr1	114497	114529	b	b	-
+chr1	114498	114530	b	b	-
+chr1	114506	114538	b	b	-
+chr1	114508	114540	b	b	-
+chr1	114542	114574	a	a	+
+chr1	114550	114582	a	a	+
+chr1	114550	114582	a	a	+
+chr1	114553	114585	a	a	+
+chr1	114564	114596	a	a	+
+chr1	114533	114565	b	b	-
+chr1	114567	114599	a	a	+
+chr1	114568	114600	a	a	+
+chr1	114569	114601	a	a	+
+chr1	114569	114601	a	a	+
+chr1	114538	114570	b	b	-
+chr1	114572	114604	a	a	+
+chr1	114572	114604	a	a	+
+chr1	114573	114605	a	a	+
+chr1	114575	114607	a	a	+
+chr1	114543	114575	b	b	-
+chr1	114543	114575	b	b	-
+chr1	114543	114575	b	b	-
+chr1	114545	114577	b	b	-
+chr1	114545	114577	b	b	-
+chr1	114579	114611	a	a	+
+chr1	114581	114613	a	a	+
+chr1	114582	114614	a	a	+
+chr1	114582	114614	a	a	+
+chr1	114582	114614	a	a	+
+chr1	114553	114585	b	b	-
+chr1	114553	114585	b	b	-
+chr1	114553	114585	b	b	-
+chr1	114553	114585	b	b	-
+chr1	114553	114585	b	b	-
+chr1	114555	114587	b	b	-
+chr1	114555	114587	b	b	-
+chr1	114561	114593	b	b	-
+chr1	114561	114593	b	b	-
+chr1	114561	114593	b	b	-
+chr1	114561	114593	b	b	-
+chr1	114561	114593	b	b	-
+chr1	114561	114593	b	b	-
+chr1	114562	114594	b	b	-
+chr1	114562	114594	b	b	-
+chr1	114573	114605	b	b	-
+chr1	114619	114651	a	a	+
+chr1	114674	114706	b	b	-
+chr1	114780	114812	a	a	+
+chr1	114766	114798	b	b	-
+chr1	114767	114799	b	b	-
+chr1	114775	114807	b	b	-
+chr1	114776	114808	b	b	-
+chr1	114795	114827	b	b	-
+chr1	114830	114862	a	a	+
+chr1	114830	114862	a	a	+
+chr1	114832	114864	a	a	+
+chr1	114832	114864	a	a	+
+chr1	114802	114834	b	b	-
+chr1	114802	114834	b	b	-
+chr1	114802	114834	b	b	-
+chr1	114838	114870	a	a	+
+chr1	114838	114870	a	a	+
+chr1	114838	114870	a	a	+
+chr1	114808	114840	b	b	-
+chr1	114853	114885	a	a	+
+chr1	114853	114885	a	a	+
+chr1	114853	114885	a	a	+
+chr1	114853	114885	a	a	+
+chr1	114853	114885	a	a	+
+chr1	114854	114886	a	a	+
+chr1	114854	114886	a	a	+
+chr1	114854	114886	a	a	+
+chr1	114823	114855	b	b	-
+chr1	114857	114889	a	a	+
+chr1	114858	114890	a	a	+
+chr1	114858	114890	a	a	+
+chr1	114826	114858	b	b	-
+chr1	114860	114892	a	a	+
+chr1	114860	114892	a	a	+
+chr1	114828	114860	b	b	-
+chr1	114828	114860	b	b	-
+chr1	114828	114860	b	b	-
+chr1	114828	114860	b	b	-
+chr1	114829	114861	b	b	-
+chr1	114829	114861	b	b	-
+chr1	114829	114861	b	b	-
+chr1	114829	114861	b	b	-
+chr1	114864	114896	a	a	+
+chr1	114832	114864	b	b	-
+chr1	114832	114864	b	b	-
+chr1	114865	114897	a	a	+
+chr1	114865	114897	a	a	+
+chr1	114865	114897	a	a	+
+chr1	114833	114865	b	b	-
+chr1	114833	114865	b	b	-
+chr1	114834	114866	b	b	-
+chr1	114842	114874	b	b	-
+chr1	114843	114875	b	b	-
+chr1	114843	114875	b	b	-
+chr1	114877	114909	a	a	+
+chr1	114846	114878	b	b	-
+chr1	114968	115000	b	b	-
+chr1	115012	115044	a	a	+
+chr1	115013	115045	a	a	+
+chr1	115016	115048	a	a	+
+chr1	115016	115048	a	a	+
+chr1	115018	115050	a	a	+
+chr1	114987	115019	b	b	-
+chr1	115021	115053	a	a	+
+chr1	115028	115060	a	a	+
+chr1	115028	115060	a	a	+
+chr1	114996	115028	b	b	-
+chr1	114996	115028	b	b	-
+chr1	114996	115028	b	b	-
+chr1	114997	115029	b	b	-
+chr1	115015	115047	b	b	-
+chr1	115016	115048	b	b	-
+chr1	115016	115048	b	b	-
+chr1	115024	115056	b	b	-
+chr1	115071	115103	a	a	+
+chr1	115137	115169	b	b	-
+chr1	115176	115208	a	a	+
+chr1	115179	115211	a	a	+
+chr1	115186	115218	b	b	-
+chr1	115226	115258	a	a	+
+chr1	115307	115339	b	b	-
+chr1	115327	115359	b	b	-
+chr1	115334	115366	b	b	-
+chr1	115382	115414	a	a	+
+chr1	115535	115567	a	a	+
+chr1	115539	115571	a	a	+
+chr1	115890	115922	b	b	-
+chr1	116062	116094	a	a	+
+chr1	116303	116335	a	a	+
+chr1	116385	116417	a	a	+
+chr1	116401	116433	b	b	-
+chr1	116931	116963	b	b	-
+chr1	117582	117614	a	a	+
+chr1	118077	118109	b	b	-
+chr1	118536	118568	a	a	+
+chr1	118587	118619	a	a	+
+chr1	118619	118651	b	b	-
+chr1	118650	118682	b	b	-
+chr1	118684	118716	a	a	+
+chr1	118684	118716	a	a	+
+chr1	118684	118716	a	a	+
+chr1	118699	118731	a	a	+
+chr1	118667	118699	b	b	-
+chr1	118670	118702	b	b	-
+chr1	118670	118702	b	b	-
+chr1	118684	118716	b	b	-
+chr1	118707	118739	b	b	-
+chr1	118745	118777	a	a	+
+chr1	118858	118890	b	b	-
+chr1	118870	118902	b	b	-
+chr1	118910	118942	b	b	-
+chr1	119085	119117	a	a	+
+chr1	119248	119280	a	a	+
+chr1	119386	119418	b	b	-
+chr1	119421	119453	a	a	+
+chr1	119417	119449	b	b	-
+chr1	119418	119450	b	b	-
+chr1	119582	119614	a	a	+
+chr1	119557	119589	b	b	-
+chr1	119557	119589	b	b	-
+chr1	119811	119843	b	b	-
+chr1	119846	119878	b	b	-
+chr1	119893	119925	a	a	+
+chr1	119893	119925	a	a	+
+chr1	119866	119898	b	b	-
+chr1	119871	119903	b	b	-
+chr1	119871	119903	b	b	-
+chr1	119871	119903	b	b	-
+chr1	119871	119903	b	b	-
+chr1	119871	119903	b	b	-
+chr1	119871	119903	b	b	-
+chr1	119871	119903	b	b	-
+chr1	119871	119903	b	b	-
+chr1	119871	119903	b	b	-
+chr1	119872	119904	b	b	-
+chr1	119872	119904	b	b	-
+chr1	119907	119939	a	a	+
+chr1	119908	119940	a	a	+
+chr1	119879	119911	b	b	-
+chr1	119912	119944	a	a	+
+chr1	119912	119944	a	a	+
+chr1	119912	119944	a	a	+
+chr1	119912	119944	a	a	+
+chr1	119913	119945	a	a	+
+chr1	119913	119945	a	a	+
+chr1	119913	119945	a	a	+
+chr1	119913	119945	a	a	+
+chr1	119913	119945	a	a	+
+chr1	119913	119945	a	a	+
+chr1	119913	119945	a	a	+
+chr1	119882	119914	b	b	-
+chr1	119884	119916	b	b	-
+chr1	119884	119916	b	b	-
+chr1	119884	119916	b	b	-
+chr1	119884	119916	b	b	-
+chr1	119884	119916	b	b	-
+chr1	119884	119916	b	b	-
+chr1	119885	119917	b	b	-
+chr1	119918	119950	a	a	+
+chr1	119920	119952	a	a	+
+chr1	119893	119925	b	b	-
+chr1	119893	119925	b	b	-
+chr1	119896	119928	b	b	-
+chr1	119932	119964	a	a	+
+chr1	119932	119964	a	a	+
+chr1	119933	119965	a	a	+
+chr1	119906	119938	b	b	-
+chr1	119943	119975	a	a	+
+chr1	119948	119980	a	a	+
+chr1	119948	119980	a	a	+
+chr1	120027	120059	b	b	-
+chr1	120067	120099	a	a	+
+chr1	120078	120110	a	a	+
+chr1	120108	120140	a	a	+
+chr1	120098	120130	b	b	-
+chr1	120227	120259	b	b	-
+chr1	120285	120317	a	a	+
+chr1	120300	120332	a	a	+
+chr1	120300	120332	a	a	+
+chr1	120367	120399	a	a	+
+chr1	120587	120619	b	b	-
+chr1	120587	120619	b	b	-
+chr1	120900	120932	a	a	+
+chr1	121033	121065	b	b	-
+chr1	121163	121195	a	a	+
+chr1	122210	122242	b	b	-
+chr1	122403	122435	a	a	+
+chr1	122384	122416	b	b	-
+chr1	122434	122466	a	a	+
+chr1	122498	122530	b	b	-
+chr1	123049	123081	a	a	+
+chr1	123068	123100	b	b	-
+chr1	123555	123587	b	b	-
+chr1	123653	123685	a	a	+
+chr1	124814	124846	a	a	+
+chr1	124792	124824	b	b	-
+chr1	124792	124824	b	b	-
+chr1	124830	124862	a	a	+
+chr1	124831	124863	a	a	+
+chr1	124831	124863	a	a	+
+chr1	124840	124872	a	a	+
+chr1	124840	124872	a	a	+
+chr1	124843	124875	a	a	+
+chr1	124843	124875	a	a	+
+chr1	124844	124876	a	a	+
+chr1	124844	124876	a	a	+
+chr1	124848	124880	a	a	+
+chr1	124821	124853	b	b	-
+chr1	124822	124854	b	b	-
+chr1	124822	124854	b	b	-
+chr1	124822	124854	b	b	-
+chr1	124822	124854	b	b	-
+chr1	124822	124854	b	b	-
+chr1	124822	124854	b	b	-
+chr1	124822	124854	b	b	-
+chr1	124822	124854	b	b	-
+chr1	124822	124854	b	b	-
+chr1	124825	124857	b	b	-
+chr1	124825	124857	b	b	-
+chr1	124859	124891	a	a	+
+chr1	124860	124892	a	a	+
+chr1	124828	124860	b	b	-
+chr1	124828	124860	b	b	-
+chr1	124828	124860	b	b	-
+chr1	124829	124861	b	b	-
+chr1	124829	124861	b	b	-
+chr1	124831	124863	b	b	-
+chr1	124831	124863	b	b	-
+chr1	124867	124899	a	a	+
+chr1	124869	124901	a	a	+
+chr1	124837	124869	b	b	-
+chr1	124954	124986	a	a	+
+chr1	124992	125024	a	a	+
+chr1	124977	125009	b	b	-
+chr1	124977	125009	b	b	-
+chr1	125428	125460	a	a	+
+chr1	125519	125551	a	a	+
+chr1	125797	125829	a	a	+
+chr1	126177	126209	b	b	-
+chr1	126322	126354	b	b	-
+chr1	126608	126640	a	a	+
+chr1	126917	126949	b	b	-
+chr1	126952	126984	b	b	-
+chr1	127000	127032	a	a	+
+chr1	127008	127040	a	a	+
+chr1	126995	127027	b	b	-
+chr1	127063	127095	a	a	+
+chr1	127072	127104	b	b	-
+chr1	127156	127188	a	a	+
+chr1	127165	127197	a	a	+
+chr1	127140	127172	b	b	-
+chr1	127145	127177	b	b	-
+chr1	127196	127228	b	b	-
+chr1	127292	127324	a	a	+
+chr1	127292	127324	a	a	+
+chr1	127295	127327	b	b	-
+chr1	127341	127373	a	a	+
+chr1	127352	127384	a	a	+
+chr1	127321	127353	b	b	-
+chr1	127322	127354	b	b	-
+chr1	127334	127366	b	b	-
+chr1	127340	127372	b	b	-
+chr1	127340	127372	b	b	-
+chr1	127347	127379	b	b	-
+chr1	127389	127421	a	a	+
+chr1	127432	127464	a	a	+
+chr1	127454	127486	b	b	-
+chr1	127510	127542	a	a	+
+chr1	127510	127542	a	a	+
+chr1	127518	127550	a	a	+
+chr1	127525	127557	a	a	+
+chr1	127495	127527	b	b	-
+chr1	127547	127579	b	b	-
+chr1	127633	127665	b	b	-
+chr1	127645	127677	b	b	-
+chr1	127680	127712	a	a	+
+chr1	127648	127680	b	b	-
+chr1	127648	127680	b	b	-
+chr1	127648	127680	b	b	-
+chr1	127648	127680	b	b	-
+chr1	127691	127723	a	a	+
+chr1	127698	127730	a	a	+
+chr1	127670	127702	b	b	-
+chr1	127684	127716	b	b	-
+chr1	127687	127719	b	b	-
+chr1	127700	127732	b	b	-
+chr1	127708	127740	b	b	-
+chr1	127807	127839	b	b	-
+chr1	127849	127881	a	a	+
+chr1	127856	127888	a	a	+
+chr1	127826	127858	b	b	-
+chr1	127827	127859	b	b	-
+chr1	127827	127859	b	b	-
+chr1	127827	127859	b	b	-
+chr1	127879	127911	a	a	+
+chr1	127884	127916	a	a	+
+chr1	127854	127886	b	b	-
+chr1	127854	127886	b	b	-
+chr1	127854	127886	b	b	-
+chr1	127859	127891	b	b	-
+chr1	127863	127895	b	b	-
+chr1	127897	127929	a	a	+
+chr1	127898	127930	a	a	+
+chr1	127898	127930	a	a	+
+chr1	127898	127930	a	a	+
+chr1	127906	127938	a	a	+
+chr1	127906	127938	a	a	+
+chr1	127907	127939	a	a	+
+chr1	127877	127909	b	b	-
+chr1	127889	127921	b	b	-
+chr1	127930	127962	a	a	+
+chr1	127957	127989	a	a	+
+chr1	127991	128023	b	b	-
+chr1	127998	128030	b	b	-
+chr1	128061	128093	a	a	+
+chr1	128071	128103	a	a	+
+chr1	128333	128365	a	a	+
+chr1	128359	128391	a	a	+
+chr1	128376	128408	a	a	+
+chr1	128392	128424	a	a	+
+chr1	128372	128404	b	b	-
+chr1	128632	128664	b	b	-
+chr1	128643	128675	b	b	-
+chr1	128643	128675	b	b	-
+chr1	128829	128861	a	a	+
+chr1	128830	128862	a	a	+
+chr1	128832	128864	a	a	+
+chr1	128809	128841	b	b	-
+chr1	128936	128968	b	b	-
+chr1	128936	128968	b	b	-
+chr1	128955	128987	b	b	-
+chr1	128988	129020	a	a	+
+chr1	128989	129021	a	a	+
+chr1	128990	129022	a	a	+
+chr1	128990	129022	a	a	+
+chr1	128991	129023	a	a	+
+chr1	128991	129023	a	a	+
+chr1	128959	128991	b	b	-
+chr1	128959	128991	b	b	-
+chr1	128959	128991	b	b	-
+chr1	128961	128993	b	b	-
+chr1	128961	128993	b	b	-
+chr1	128995	129027	a	a	+
+chr1	128995	129027	a	a	+
+chr1	128995	129027	a	a	+
+chr1	128997	129029	a	a	+
+chr1	128998	129030	a	a	+
+chr1	128966	128998	b	b	-
+chr1	128966	128998	b	b	-
+chr1	128966	128998	b	b	-
+chr1	128966	128998	b	b	-
+chr1	128973	129005	b	b	-
+chr1	128974	129006	b	b	-
+chr1	128975	129007	b	b	-
+chr1	128980	129012	b	b	-
+chr1	128981	129013	b	b	-
+chr1	128981	129013	b	b	-
+chr1	129015	129047	a	a	+
+chr1	128984	129016	b	b	-
+chr1	129023	129055	a	a	+
+chr1	129023	129055	a	a	+
+chr1	129026	129058	a	a	+
+chr1	129026	129058	a	a	+
+chr1	128997	129029	b	b	-
+chr1	129041	129073	a	a	+
+chr1	129029	129061	b	b	-
+chr1	129029	129061	b	b	-
+chr1	129029	129061	b	b	-
+chr1	129208	129240	b	b	-
+chr1	129247	129279	a	a	+
+chr1	129250	129282	a	a	+
+chr1	129238	129270	b	b	-
+chr1	129276	129308	a	a	+
+chr1	129276	129308	a	a	+
+chr1	129276	129308	a	a	+
+chr1	129244	129276	b	b	-
+chr1	129244	129276	b	b	-
+chr1	129277	129309	a	a	+
+chr1	129277	129309	a	a	+
+chr1	129277	129309	a	a	+
+chr1	129277	129309	a	a	+
+chr1	129277	129309	a	a	+
+chr1	129245	129277	b	b	-
+chr1	129279	129311	a	a	+
+chr1	129279	129311	a	a	+
+chr1	129279	129311	a	a	+
+chr1	129279	129311	a	a	+
+chr1	129279	129311	a	a	+
+chr1	129279	129311	a	a	+
+chr1	129281	129313	a	a	+
+chr1	129285	129317	a	a	+
+chr1	129253	129285	b	b	-
+chr1	129253	129285	b	b	-
+chr1	129253	129285	b	b	-
+chr1	129253	129285	b	b	-
+chr1	129253	129285	b	b	-
+chr1	129253	129285	b	b	-
+chr1	129286	129318	a	a	+
+chr1	129254	129286	b	b	-
+chr1	129256	129288	b	b	-
+chr1	129256	129288	b	b	-
+chr1	129256	129288	b	b	-
+chr1	129259	129291	b	b	-
+chr1	129292	129324	a	a	+
+chr1	129292	129324	a	a	+
+chr1	129294	129326	a	a	+
+chr1	129294	129326	a	a	+
+chr1	129295	129327	a	a	+
+chr1	129295	129327	a	a	+
+chr1	129295	129327	a	a	+
+chr1	129263	129295	b	b	-
+chr1	129263	129295	b	b	-
+chr1	129263	129295	b	b	-
+chr1	129263	129295	b	b	-
+chr1	129263	129295	b	b	-
+chr1	129263	129295	b	b	-
+chr1	129263	129295	b	b	-
+chr1	129264	129296	b	b	-
+chr1	129265	129297	b	b	-
+chr1	129265	129297	b	b	-
+chr1	129298	129330	a	a	+
+chr1	129298	129330	a	a	+
+chr1	129298	129330	a	a	+
+chr1	129298	129330	a	a	+
+chr1	129298	129330	a	a	+
+chr1	129268	129300	b	b	-
+chr1	129303	129335	a	a	+
+chr1	129276	129308	b	b	-
+chr1	129311	129343	a	a	+
+chr1	129280	129312	b	b	-
+chr1	129280	129312	b	b	-
+chr1	129343	129375	a	a	+
+chr1	129415	129447	b	b	-
+chr1	129415	129447	b	b	-
+chr1	129419	129451	b	b	-
+chr1	129424	129456	b	b	-
+chr1	129426	129458	b	b	-
+chr1	129427	129459	b	b	-
+chr1	129461	129493	a	a	+
+chr1	129462	129494	a	a	+
+chr1	129464	129496	a	a	+
+chr1	129470	129502	a	a	+
+chr1	129470	129502	a	a	+
+chr1	129471	129503	a	a	+
+chr1	129440	129472	b	b	-
+chr1	129478	129510	a	a	+
+chr1	129543	129575	b	b	-
+chr1	129553	129585	b	b	-
+chr1	129616	129648	a	a	+
+chr1	129607	129639	b	b	-
+chr1	129626	129658	b	b	-
+chr1	129808	129840	a	a	+
+chr1	129899	129931	b	b	-
+chr1	129948	129980	b	b	-
+chr1	130094	130126	a	a	+
+chr1	130071	130103	b	b	-
+chr1	130422	130454	b	b	-
+chr1	130688	130720	b	b	-
+chr1	130717	130749	b	b	-
+chr1	130754	130786	a	a	+
+chr1	130736	130768	b	b	-
+chr1	130736	130768	b	b	-
+chr1	130749	130781	b	b	-
+chr1	130749	130781	b	b	-
+chr1	130750	130782	b	b	-
+chr1	130809	130841	b	b	-
+chr1	131009	131041	a	a	+
+chr1	131063	131095	b	b	-
+chr1	131104	131136	a	a	+
+chr1	131137	131169	a	a	+
+chr1	131916	131948	b	b	-
+chr1	131940	131972	b	b	-
+chr1	132002	132034	a	a	+
+chr1	132177	132209	b	b	-
+chr1	132177	132209	b	b	-
+chr1	132184	132216	b	b	-
+chr1	132218	132250	a	a	+
+chr1	132218	132250	a	a	+
+chr1	132224	132256	a	a	+
+chr1	132224	132256	a	a	+
+chr1	132225	132257	a	a	+
+chr1	132226	132258	a	a	+
+chr1	132226	132258	a	a	+
+chr1	132226	132258	a	a	+
+chr1	132226	132258	a	a	+
+chr1	132226	132258	a	a	+
+chr1	132226	132258	a	a	+
+chr1	132195	132227	b	b	-
+chr1	132195	132227	b	b	-
+chr1	132195	132227	b	b	-
+chr1	132195	132227	b	b	-
+chr1	132195	132227	b	b	-
+chr1	132199	132231	b	b	-
+chr1	132199	132231	b	b	-
+chr1	132232	132264	a	a	+
+chr1	132232	132264	a	a	+
+chr1	132232	132264	a	a	+
+chr1	132232	132264	a	a	+
+chr1	132232	132264	a	a	+
+chr1	132233	132265	a	a	+
+chr1	132233	132265	a	a	+
+chr1	132233	132265	a	a	+
+chr1	132233	132265	a	a	+
+chr1	132233	132265	a	a	+
+chr1	132201	132233	b	b	-
+chr1	132201	132233	b	b	-
+chr1	132202	132234	b	b	-
+chr1	132203	132235	b	b	-
+chr1	132236	132268	a	a	+
+chr1	132204	132236	b	b	-
+chr1	132204	132236	b	b	-
+chr1	132237	132269	a	a	+
+chr1	132237	132269	a	a	+
+chr1	132237	132269	a	a	+
+chr1	132237	132269	a	a	+
+chr1	132206	132238	b	b	-
+chr1	132206	132238	b	b	-
+chr1	132206	132238	b	b	-
+chr1	132209	132241	b	b	-
+chr1	132210	132242	b	b	-
+chr1	132243	132275	a	a	+
+chr1	132243	132275	a	a	+
+chr1	132244	132276	a	a	+
+chr1	132244	132276	a	a	+
+chr1	132244	132276	a	a	+
+chr1	132244	132276	a	a	+
+chr1	132244	132276	a	a	+
+chr1	132212	132244	b	b	-
+chr1	132212	132244	b	b	-
+chr1	132212	132244	b	b	-
+chr1	132215	132247	b	b	-
+chr1	132215	132247	b	b	-
+chr1	132215	132247	b	b	-
+chr1	132217	132249	b	b	-
+chr1	132218	132250	b	b	-
+chr1	132218	132250	b	b	-
+chr1	132219	132251	b	b	-
+chr1	132219	132251	b	b	-
+chr1	132219	132251	b	b	-
+chr1	132253	132285	a	a	+
+chr1	132223	132255	b	b	-
+chr1	132224	132256	b	b	-
+chr1	132224	132256	b	b	-
+chr1	132224	132256	b	b	-
+chr1	132263	132295	a	a	+
+chr1	132237	132269	b	b	-
+chr1	132237	132269	b	b	-
+chr1	132349	132381	b	b	-
+chr1	132382	132414	a	a	+
+chr1	132387	132419	a	a	+
+chr1	132362	132394	b	b	-
+chr1	132362	132394	b	b	-
+chr1	132403	132435	a	a	+
+chr1	132403	132435	a	a	+
+chr1	132403	132435	a	a	+
+chr1	132404	132436	a	a	+
+chr1	132374	132406	b	b	-
+chr1	132378	132410	b	b	-
+chr1	132488	132520	b	b	-
+chr1	132543	132575	a	a	+
+chr1	132559	132591	a	a	+
+chr1	132566	132598	a	a	+
+chr1	132566	132598	a	a	+
+chr1	132566	132598	a	a	+
+chr1	132536	132568	b	b	-
+chr1	132545	132577	b	b	-
+chr1	132662	132694	a	a	+
+chr1	132662	132694	a	a	+
+chr1	132657	132689	b	b	-
+chr1	132692	132724	b	b	-
+chr1	132894	132926	a	a	+
+chr1	132914	132946	a	a	+
+chr1	133059	133091	b	b	-
+chr1	133059	133091	b	b	-
+chr1	133228	133260	a	a	+
+chr1	133589	133621	a	a	+
+chr1	134220	134252	a	a	+
+chr1	134220	134252	a	a	+
+chr1	134486	134518	b	b	-
+chr1	134585	134617	a	a	+
+chr1	134656	134688	a	a	+
+chr1	134637	134669	b	b	-
+chr1	134791	134823	b	b	-
+chr1	134799	134831	b	b	-
+chr1	134800	134832	b	b	-
+chr1	134828	134860	b	b	-
+chr1	135319	135351	a	a	+
+chr1	135319	135351	a	a	+
+chr1	135319	135351	a	a	+
+chr1	135291	135323	b	b	-
+chr1	135324	135356	a	a	+
+chr1	135337	135369	a	a	+
+chr1	135365	135397	a	a	+
+chr1	135477	135509	a	a	+
+chr1	135453	135485	b	b	-
+chr1	135453	135485	b	b	-
+chr1	135523	135555	a	a	+
+chr1	135549	135581	b	b	-
+chr1	135589	135621	b	b	-
+chr1	135589	135621	b	b	-
+chr1	135642	135674	a	a	+
+chr1	135642	135674	a	a	+
+chr1	135642	135674	a	a	+
+chr1	135642	135674	a	a	+
+chr1	135642	135674	a	a	+
+chr1	135610	135642	b	b	-
+chr1	135610	135642	b	b	-
+chr1	135614	135646	b	b	-
+chr1	135648	135680	a	a	+
+chr1	135618	135650	b	b	-
+chr1	135618	135650	b	b	-
+chr1	135621	135653	b	b	-
+chr1	135621	135653	b	b	-
+chr1	135623	135655	b	b	-
+chr1	135625	135657	b	b	-
+chr1	135625	135657	b	b	-
+chr1	135628	135660	b	b	-
+chr1	135628	135660	b	b	-
+chr1	135663	135695	a	a	+
+chr1	135663	135695	a	a	+
+chr1	135665	135697	a	a	+
+chr1	135637	135669	b	b	-
+chr1	135637	135669	b	b	-
+chr1	135671	135703	a	a	+
+chr1	135643	135675	b	b	-
+chr1	135643	135675	b	b	-
+chr1	135684	135716	a	a	+
+chr1	135684	135716	a	a	+
+chr1	135808	135840	b	b	-
+chr1	135808	135840	b	b	-
+chr1	135844	135876	a	a	+
+chr1	135851	135883	a	a	+
+chr1	135854	135886	a	a	+
+chr1	135826	135858	b	b	-
+chr1	135826	135858	b	b	-
+chr1	135826	135858	b	b	-
+chr1	135863	135895	a	a	+
+chr1	135831	135863	b	b	-
+chr1	135864	135896	a	a	+
+chr1	135864	135896	a	a	+
+chr1	135864	135896	a	a	+
+chr1	135832	135864	b	b	-
+chr1	135866	135898	a	a	+
+chr1	135834	135866	b	b	-
+chr1	135834	135866	b	b	-
+chr1	135837	135869	b	b	-
+chr1	135841	135873	b	b	-
+chr1	135877	135909	a	a	+
+chr1	135883	135915	a	a	+
+chr1	135884	135916	a	a	+
+chr1	135886	135918	a	a	+
+chr1	135886	135918	a	a	+
+chr1	135887	135919	a	a	+
+chr1	135856	135888	b	b	-
+chr1	135856	135888	b	b	-
+chr1	135857	135889	b	b	-
+chr1	135891	135923	a	a	+
+chr1	135859	135891	b	b	-
+chr1	135859	135891	b	b	-
+chr1	135859	135891	b	b	-
+chr1	135859	135891	b	b	-
+chr1	135899	135931	a	a	+
+chr1	135900	135932	a	a	+
+chr1	135904	135936	a	a	+
+chr1	135874	135906	b	b	-
+chr1	135876	135908	b	b	-
+chr1	135877	135909	b	b	-
+chr1	135921	135953	a	a	+
+chr1	135930	135962	a	a	+
+chr1	135946	135978	a	a	+
+chr1	135953	135985	b	b	-
+chr1	135986	136018	b	b	-
+chr1	135986	136018	b	b	-
+chr1	135993	136025	b	b	-
+chr1	135994	136026	b	b	-
+chr1	136041	136073	a	a	+
+chr1	136041	136073	a	a	+
+chr1	136042	136074	a	a	+
+chr1	136042	136074	a	a	+
+chr1	136012	136044	b	b	-
+chr1	136012	136044	b	b	-
+chr1	136054	136086	a	a	+
+chr1	136063	136095	a	a	+
+chr1	136064	136096	a	a	+
+chr1	136366	136398	a	a	+
+chr1	136485	136517	b	b	-
+chr1	136535	136567	a	a	+
+chr1	136540	136572	a	a	+
+chr1	136543	136575	a	a	+
+chr1	136544	136576	a	a	+
+chr1	136549	136581	a	a	+
+chr1	136549	136581	a	a	+
+chr1	136530	136562	b	b	-
+chr1	136530	136562	b	b	-
+chr1	136564	136596	a	a	+
+chr1	136673	136705	b	b	-
+chr1	136874	136906	a	a	+
+chr1	136845	136877	b	b	-
+chr1	136850	136882	b	b	-
+chr1	136891	136923	a	a	+
+chr1	136879	136911	b	b	-
+chr1	136914	136946	a	a	+
+chr1	136915	136947	a	a	+
+chr1	136915	136947	a	a	+
+chr1	136920	136952	a	a	+
+chr1	136889	136921	b	b	-
+chr1	136889	136921	b	b	-
+chr1	136890	136922	b	b	-
+chr1	136890	136922	b	b	-
+chr1	136901	136933	b	b	-
+chr1	136910	136942	b	b	-
+chr1	136929	136961	b	b	-
+chr1	137056	137088	a	a	+
+chr1	137070	137102	a	a	+
+chr1	137054	137086	b	b	-
+chr1	137058	137090	b	b	-
+chr1	137058	137090	b	b	-
+chr1	137094	137126	a	a	+
+chr1	137096	137128	a	a	+
+chr1	137103	137135	a	a	+
+chr1	137222	137254	a	a	+
+chr1	137233	137265	a	a	+
+chr1	137203	137235	b	b	-
+chr1	137277	137309	a	a	+
+chr1	137255	137287	b	b	-
+chr1	137303	137335	b	b	-
+chr1	137729	137761	b	b	-
+chr1	137753	137785	b	b	-
+chr1	137756	137788	b	b	-
+chr1	137866	137898	a	a	+
+chr1	137834	137866	b	b	-
+chr1	137902	137934	b	b	-
+chr1	137996	138028	b	b	-
+chr1	138143	138175	b	b	-
+chr1	138193	138225	a	a	+
+chr1	138196	138228	a	a	+
+chr1	138175	138207	b	b	-
+chr1	138179	138211	b	b	-
+chr1	138179	138211	b	b	-
+chr1	138179	138211	b	b	-
+chr1	138179	138211	b	b	-
+chr1	138179	138211	b	b	-
+chr1	138212	138244	a	a	+
+chr1	138185	138217	b	b	-
+chr1	138218	138250	a	a	+
+chr1	138194	138226	b	b	-
+chr1	138236	138268	a	a	+
+chr1	138263	138295	a	a	+
+chr1	138288	138320	a	a	+
+chr1	138337	138369	a	a	+
+chr1	138337	138369	a	a	+
+chr1	138346	138378	a	a	+
+chr1	138346	138378	a	a	+
+chr1	138346	138378	a	a	+
+chr1	138346	138378	a	a	+
+chr1	138319	138351	b	b	-
+chr1	138319	138351	b	b	-
+chr1	138322	138354	b	b	-
+chr1	138326	138358	b	b	-
+chr1	138359	138391	a	a	+
+chr1	138359	138391	a	a	+
+chr1	138327	138359	b	b	-
+chr1	138327	138359	b	b	-
+chr1	138360	138392	a	a	+
+chr1	138360	138392	a	a	+
+chr1	138360	138392	a	a	+
+chr1	138360	138392	a	a	+
+chr1	138328	138360	b	b	-
+chr1	138332	138364	b	b	-
+chr1	138332	138364	b	b	-
+chr1	138333	138365	b	b	-
+chr1	138333	138365	b	b	-
+chr1	138366	138398	a	a	+
+chr1	138334	138366	b	b	-
+chr1	138338	138370	b	b	-
+chr1	138339	138371	b	b	-
+chr1	138343	138375	b	b	-
+chr1	138344	138376	b	b	-
+chr1	138344	138376	b	b	-
+chr1	138377	138409	a	a	+
+chr1	138377	138409	a	a	+
+chr1	138377	138409	a	a	+
+chr1	138345	138377	b	b	-
+chr1	138379	138411	a	a	+
+chr1	138380	138412	a	a	+
+chr1	138382	138414	a	a	+
+chr1	138383	138415	a	a	+
+chr1	138353	138385	b	b	-
+chr1	138355	138387	b	b	-
+chr1	138355	138387	b	b	-
+chr1	138355	138387	b	b	-
+chr1	138356	138388	b	b	-
+chr1	138356	138388	b	b	-
+chr1	138357	138389	b	b	-
+chr1	138357	138389	b	b	-
+chr1	138390	138422	a	a	+
+chr1	138391	138423	a	a	+
+chr1	138391	138423	a	a	+
+chr1	138391	138423	a	a	+
+chr1	138391	138423	a	a	+
+chr1	138391	138423	a	a	+
+chr1	138391	138423	a	a	+
+chr1	138391	138423	a	a	+
+chr1	138391	138423	a	a	+
+chr1	138391	138423	a	a	+
+chr1	138391	138423	a	a	+
+chr1	138391	138423	a	a	+
+chr1	138391	138423	a	a	+
+chr1	138366	138398	b	b	-
+chr1	138366	138398	b	b	-
+chr1	138640	138672	a	a	+
+chr1	138643	138675	a	a	+
+chr1	138644	138676	a	a	+
+chr1	138626	138658	b	b	-
+chr1	138659	138691	a	a	+
+chr1	138629	138661	b	b	-
+chr1	138629	138661	b	b	-
+chr1	138629	138661	b	b	-
+chr1	138629	138661	b	b	-
+chr1	138645	138677	b	b	-
+chr1	138846	138878	a	a	+
+chr1	138827	138859	b	b	-
+chr1	138989	139021	a	a	+
+chr1	138986	139018	b	b	-
+chr1	139678	139710	b	b	-
+chr1	139757	139789	a	a	+
+chr1	139861	139893	b	b	-
+chr1	140034	140066	b	b	-
+chr1	140034	140066	b	b	-
+chr1	140041	140073	b	b	-
+chr1	140382	140414	a	a	+
+chr1	140457	140489	b	b	-
+chr1	140542	140574	b	b	-
+chr1	140639	140671	b	b	-
+chr1	140818	140850	a	a	+
+chr1	140821	140853	a	a	+
+chr1	140842	140874	a	a	+
+chr1	140815	140847	b	b	-
+chr1	140892	140924	a	a	+
+chr1	141051	141083	a	a	+
+chr1	141069	141101	a	a	+
+chr1	141191	141223	a	a	+
+chr1	141164	141196	b	b	-
+chr1	141239	141271	a	a	+
+chr1	141320	141352	b	b	-
+chr1	141328	141360	b	b	-
+chr1	141369	141401	a	a	+
+chr1	141370	141402	a	a	+
+chr1	141373	141405	a	a	+
+chr1	141374	141406	a	a	+
+chr1	141507	141539	b	b	-
+chr1	141604	141636	a	a	+
+chr1	141611	141643	a	a	+
+chr1	142801	142833	b	b	-
+chr1	143569	143601	b	b	-
+chr1	143625	143657	a	a	+
+chr1	143627	143659	a	a	+
+chr1	143627	143659	a	a	+
+chr1	143603	143635	b	b	-
+chr1	143620	143652	b	b	-
+chr1	143653	143685	a	a	+
+chr1	143653	143685	a	a	+
+chr1	143653	143685	a	a	+
+chr1	143631	143663	b	b	-
+chr1	143639	143671	b	b	-
+chr1	143639	143671	b	b	-
+chr1	143639	143671	b	b	-
+chr1	143639	143671	b	b	-
+chr1	143654	143686	b	b	-
+chr1	143765	143797	b	b	-
+chr1	143777	143809	b	b	-
+chr1	143777	143809	b	b	-
+chr1	143818	143850	a	a	+
+chr1	143915	143947	a	a	+
+chr1	144003	144035	a	a	+
+chr1	144008	144040	b	b	-
+chr1	144138	144170	a	a	+
+chr1	144168	144200	a	a	+
+chr1	144259	144291	b	b	-
+chr1	144333	144365	a	a	+
+chr1	144306	144338	b	b	-
+chr1	144619	144651	a	a	+
+chr1	144720	144752	b	b	-
+chr1	144766	144798	a	a	+
+chr1	144778	144810	a	a	+
+chr1	144775	144807	b	b	-
+chr1	145004	145036	b	b	-
+chr1	145402	145434	b	b	-
+chr1	145437	145469	b	b	-
+chr1	145613	145645	a	a	+
+chr1	145907	145939	b	b	-
+chr1	146751	146783	b	b	-
+chr1	147134	147166	b	b	-
+chr1	148264	148296	a	a	+
+chr1	148720	148752	a	a	+
+chr1	148862	148894	b	b	-
+chr1	148994	149026	a	a	+
+chr1	149205	149237	a	a	+
+chr1	149192	149224	b	b	-
+chr1	149687	149719	b	b	-
+chr1	149708	149740	b	b	-
+chr1	150214	150246	a	a	+
+chr1	150595	150627	b	b	-
+chr1	150630	150662	a	a	+
+chr1	150638	150670	a	a	+
+chr1	150938	150970	b	b	-
+chr1	150938	150970	b	b	-
+chr1	150946	150978	b	b	-
+chr1	151003	151035	a	a	+
+chr1	151128	151160	a	a	+
+chr1	151101	151133	b	b	-
+chr1	151136	151168	a	a	+
+chr1	151136	151168	a	a	+
+chr1	151137	151169	a	a	+
+chr1	151137	151169	a	a	+
+chr1	151137	151169	a	a	+
+chr1	151108	151140	b	b	-
+chr1	151109	151141	b	b	-
+chr1	151148	151180	a	a	+
+chr1	151149	151181	a	a	+
+chr1	151156	151188	a	a	+
+chr1	151126	151158	b	b	-
+chr1	151128	151160	b	b	-
+chr1	151203	151235	a	a	+
+chr1	151203	151235	a	a	+
+chr1	151203	151235	a	a	+
+chr1	151648	151680	b	b	-
+chr1	152213	152245	b	b	-
+chr1	152215	152247	b	b	-
+chr1	152215	152247	b	b	-
+chr1	152215	152247	b	b	-
+chr1	152217	152249	b	b	-
+chr1	152218	152250	b	b	-
+chr1	152218	152250	b	b	-
+chr1	152219	152251	b	b	-
+chr1	152219	152251	b	b	-
+chr1	152219	152251	b	b	-
+chr1	152219	152251	b	b	-
+chr1	152222	152254	b	b	-
+chr1	152226	152258	b	b	-
+chr1	152226	152258	b	b	-
+chr1	152226	152258	b	b	-
+chr1	152231	152263	b	b	-
+chr1	152264	152296	a	a	+
+chr1	152264	152296	a	a	+
+chr1	152264	152296	a	a	+
+chr1	152264	152296	a	a	+
+chr1	152264	152296	a	a	+
+chr1	152264	152296	a	a	+
+chr1	152264	152296	a	a	+
+chr1	152264	152296	a	a	+
+chr1	152264	152296	a	a	+
+chr1	152264	152296	a	a	+
+chr1	152264	152296	a	a	+
+chr1	152264	152296	a	a	+
+chr1	152264	152296	a	a	+
+chr1	152264	152296	a	a	+
+chr1	152264	152296	a	a	+
+chr1	152264	152296	a	a	+
+chr1	152265	152297	a	a	+
+chr1	152235	152267	b	b	-
+chr1	152235	152267	b	b	-
+chr1	152235	152267	b	b	-
+chr1	152269	152301	a	a	+
+chr1	152269	152301	a	a	+
+chr1	152270	152302	a	a	+
+chr1	152270	152302	a	a	+
+chr1	152270	152302	a	a	+
+chr1	152270	152302	a	a	+
+chr1	152270	152302	a	a	+
+chr1	152270	152302	a	a	+
+chr1	152270	152302	a	a	+
+chr1	152242	152274	b	b	-
+chr1	152279	152311	a	a	+
+chr1	152280	152312	a	a	+
+chr1	152250	152282	b	b	-
+chr1	152251	152283	b	b	-
+chr1	152299	152331	a	a	+
+chr1	152299	152331	a	a	+
+chr1	152443	152475	a	a	+
+chr1	152443	152475	a	a	+
+chr1	152581	152613	a	a	+
+chr1	153304	153336	b	b	-
+chr1	153432	153464	a	a	+
+chr1	153487	153519	b	b	-
+chr1	153530	153562	b	b	-
+chr1	153601	153633	a	a	+
+chr1	153601	153633	a	a	+
+chr1	153601	153633	a	a	+
+chr1	153749	153781	b	b	-
+chr1	154168	154200	a	a	+
+chr1	154181	154213	a	a	+
+chr1	154186	154218	a	a	+
+chr1	154200	154232	a	a	+
+chr1	154200	154232	a	a	+
+chr1	154200	154232	a	a	+
+chr1	154223	154255	a	a	+
+chr1	154302	154334	a	a	+
+chr1	154292	154324	b	b	-
+chr1	154336	154368	b	b	-
+chr1	154345	154377	b	b	-
+chr1	154351	154383	b	b	-
+chr1	154355	154387	b	b	-
+chr1	154390	154422	a	a	+
+chr1	154393	154425	a	a	+
+chr1	154515	154547	a	a	+
+chr1	154522	154554	b	b	-
+chr1	154523	154555	b	b	-
+chr1	154558	154590	a	a	+
+chr1	154564	154596	a	a	+
+chr1	154564	154596	a	a	+
+chr1	154645	154677	b	b	-
+chr1	154654	154686	b	b	-
+chr1	154691	154723	a	a	+
+chr1	154667	154699	b	b	-
+chr1	154704	154736	a	a	+
+chr1	154673	154705	b	b	-
+chr1	154673	154705	b	b	-
+chr1	154674	154706	b	b	-
+chr1	154686	154718	b	b	-
+chr1	154719	154751	a	a	+
+chr1	154719	154751	a	a	+
+chr1	154719	154751	a	a	+
+chr1	154719	154751	a	a	+
+chr1	154719	154751	a	a	+
+chr1	154719	154751	a	a	+
+chr1	154692	154724	b	b	-
+chr1	154693	154725	b	b	-
+chr1	154727	154759	a	a	+
+chr1	154728	154760	a	a	+
+chr1	154728	154760	a	a	+
+chr1	154728	154760	a	a	+
+chr1	154729	154761	a	a	+
+chr1	154729	154761	a	a	+
+chr1	154730	154762	a	a	+
+chr1	154730	154762	a	a	+
+chr1	154730	154762	a	a	+
+chr1	154730	154762	a	a	+
+chr1	154730	154762	a	a	+
+chr1	154730	154762	a	a	+
+chr1	154700	154732	b	b	-
+chr1	154741	154773	a	a	+
+chr1	154724	154756	b	b	-
+chr1	154758	154790	a	a	+
+chr1	154901	154933	b	b	-
+chr1	154926	154958	b	b	-
+chr1	154962	154994	a	a	+
+chr1	154931	154963	b	b	-
+chr1	154932	154964	b	b	-
+chr1	154936	154968	b	b	-
+chr1	154938	154970	b	b	-
+chr1	154938	154970	b	b	-
+chr1	154971	155003	a	a	+
+chr1	154941	154973	b	b	-
+chr1	154949	154981	b	b	-
+chr1	154954	154986	b	b	-
+chr1	154988	155020	a	a	+
+chr1	154989	155021	a	a	+
+chr1	154989	155021	a	a	+
+chr1	154989	155021	a	a	+
+chr1	154990	155022	a	a	+
+chr1	154990	155022	a	a	+
+chr1	154990	155022	a	a	+
+chr1	154990	155022	a	a	+
+chr1	154990	155022	a	a	+
+chr1	154990	155022	a	a	+
+chr1	154990	155022	a	a	+
+chr1	154959	154991	b	b	-
+chr1	154959	154991	b	b	-
+chr1	154959	154991	b	b	-
+chr1	154959	154991	b	b	-
+chr1	154959	154991	b	b	-
+chr1	154959	154991	b	b	-
+chr1	154959	154991	b	b	-
+chr1	154959	154991	b	b	-
+chr1	154992	155024	a	a	+
+chr1	154961	154993	b	b	-
+chr1	154961	154993	b	b	-
+chr1	154963	154995	b	b	-
+chr1	154963	154995	b	b	-
+chr1	154963	154995	b	b	-
+chr1	154963	154995	b	b	-
+chr1	154963	154995	b	b	-
+chr1	154963	154995	b	b	-
+chr1	154963	154995	b	b	-
+chr1	154997	155029	a	a	+
+chr1	154965	154997	b	b	-
+chr1	154969	155001	b	b	-
+chr1	154969	155001	b	b	-
+chr1	155003	155035	a	a	+
+chr1	155005	155037	a	a	+
+chr1	155006	155038	a	a	+
+chr1	155006	155038	a	a	+
+chr1	154980	155012	b	b	-
+chr1	154980	155012	b	b	-
+chr1	155050	155082	b	b	-
+chr1	155143	155175	a	a	+
+chr1	155148	155180	a	a	+
+chr1	155148	155180	a	a	+
+chr1	155148	155180	a	a	+
+chr1	155148	155180	a	a	+
+chr1	155150	155182	a	a	+
+chr1	155132	155164	b	b	-
+chr1	155278	155310	a	a	+
+chr1	155305	155337	a	a	+
+chr1	155305	155337	a	a	+
+chr1	155312	155344	a	a	+
+chr1	155336	155368	a	a	+
+chr1	155493	155525	a	a	+
+chr1	155493	155525	a	a	+
+chr1	155691	155723	b	b	-
+chr1	155771	155803	b	b	-
+chr1	156071	156103	b	b	-
+chr1	156504	156536	b	b	-
+chr1	156625	156657	a	a	+
+chr1	156643	156675	a	a	+
+chr1	156756	156788	b	b	-
+chr1	156981	157013	b	b	-
+chr1	157287	157319	b	b	-
+chr1	157434	157466	b	b	-
+chr1	157478	157510	a	a	+
+chr1	157532	157564	a	a	+
+chr1	157570	157602	b	b	-
+chr1	157981	158013	a	a	+
+chr1	158091	158123	b	b	-
+chr1	158132	158164	a	a	+
+chr1	158178	158210	a	a	+
+chr1	158288	158320	a	a	+
+chr1	158265	158297	b	b	-
+chr1	158477	158509	a	a	+
+chr1	158448	158480	b	b	-
+chr1	158482	158514	a	a	+
+chr1	158482	158514	a	a	+
+chr1	158586	158618	b	b	-
+chr1	158628	158660	a	a	+
+chr1	158628	158660	a	a	+
+chr1	158628	158660	a	a	+
+chr1	158629	158661	a	a	+
+chr1	158629	158661	a	a	+
+chr1	158630	158662	a	a	+
+chr1	158630	158662	a	a	+
+chr1	158630	158662	a	a	+
+chr1	158631	158663	a	a	+
+chr1	158604	158636	b	b	-
+chr1	158611	158643	b	b	-
+chr1	158611	158643	b	b	-
+chr1	158612	158644	b	b	-
+chr1	158612	158644	b	b	-
+chr1	158646	158678	a	a	+
+chr1	158646	158678	a	a	+
+chr1	158646	158678	a	a	+
+chr1	158616	158648	b	b	-
+chr1	158616	158648	b	b	-
+chr1	158617	158649	b	b	-
+chr1	158621	158653	b	b	-
+chr1	158666	158698	a	a	+
+chr1	158634	158666	b	b	-
+chr1	158853	158885	a	a	+
+chr1	158888	158920	a	a	+
+chr1	158888	158920	a	a	+
+chr1	158888	158920	a	a	+
+chr1	158888	158920	a	a	+
+chr1	158888	158920	a	a	+
+chr1	158888	158920	a	a	+
+chr1	158890	158922	a	a	+
+chr1	158858	158890	b	b	-
+chr1	158872	158904	b	b	-
+chr1	158872	158904	b	b	-
+chr1	158872	158904	b	b	-
+chr1	158872	158904	b	b	-
+chr1	158906	158938	a	a	+
+chr1	158907	158939	a	a	+
+chr1	158907	158939	a	a	+
+chr1	158875	158907	b	b	-
+chr1	158876	158908	b	b	-
+chr1	158877	158909	b	b	-
+chr1	158914	158946	a	a	+
+chr1	158914	158946	a	a	+
+chr1	158914	158946	a	a	+
+chr1	158914	158946	a	a	+
+chr1	158914	158946	a	a	+
+chr1	158915	158947	a	a	+
+chr1	158915	158947	a	a	+
+chr1	158915	158947	a	a	+
+chr1	158915	158947	a	a	+
+chr1	158915	158947	a	a	+
+chr1	158883	158915	b	b	-
+chr1	158883	158915	b	b	-
+chr1	158883	158915	b	b	-
+chr1	158884	158916	b	b	-
+chr1	158884	158916	b	b	-
+chr1	158884	158916	b	b	-
+chr1	158884	158916	b	b	-
+chr1	158917	158949	a	a	+
+chr1	158917	158949	a	a	+
+chr1	158885	158917	b	b	-
+chr1	158885	158917	b	b	-
+chr1	158918	158950	a	a	+
+chr1	158918	158950	a	a	+
+chr1	158918	158950	a	a	+
+chr1	158918	158950	a	a	+
+chr1	158919	158951	a	a	+
+chr1	158919	158951	a	a	+
+chr1	158919	158951	a	a	+
+chr1	158919	158951	a	a	+
+chr1	158919	158951	a	a	+
+chr1	158919	158951	a	a	+
+chr1	158919	158951	a	a	+
+chr1	158887	158919	b	b	-
+chr1	158890	158922	b	b	-
+chr1	158890	158922	b	b	-
+chr1	158924	158956	a	a	+
+chr1	158924	158956	a	a	+
+chr1	158924	158956	a	a	+
+chr1	158892	158924	b	b	-
+chr1	158893	158925	b	b	-
+chr1	158895	158927	b	b	-
+chr1	158895	158927	b	b	-
+chr1	158930	158962	a	a	+
+chr1	158931	158963	a	a	+
+chr1	158899	158931	b	b	-
+chr1	158899	158931	b	b	-
+chr1	158934	158966	a	a	+
+chr1	158934	158966	a	a	+
+chr1	158935	158967	a	a	+
+chr1	158903	158935	b	b	-
+chr1	158936	158968	a	a	+
+chr1	158936	158968	a	a	+
+chr1	158936	158968	a	a	+
+chr1	158936	158968	a	a	+
+chr1	158936	158968	a	a	+
+chr1	158906	158938	b	b	-
+chr1	158907	158939	b	b	-
+chr1	158908	158940	b	b	-
+chr1	158947	158979	a	a	+
+chr1	158947	158979	a	a	+
+chr1	158929	158961	b	b	-
+chr1	159021	159053	b	b	-
+chr1	159024	159056	b	b	-
+chr1	159025	159057	b	b	-
+chr1	159066	159098	a	a	+
+chr1	159034	159066	b	b	-
+chr1	159068	159100	a	a	+
+chr1	159069	159101	a	a	+
+chr1	159037	159069	b	b	-
+chr1	159071	159103	a	a	+
+chr1	159082	159114	a	a	+
+chr1	159082	159114	a	a	+
+chr1	159088	159120	a	a	+
+chr1	159088	159120	a	a	+
+chr1	159080	159112	b	b	-
+chr1	159080	159112	b	b	-
+chr1	159124	159156	a	a	+
+chr1	159231	159263	a	a	+
+chr1	159231	159263	a	a	+
+chr1	159231	159263	a	a	+
+chr1	159203	159235	b	b	-
+chr1	159238	159270	b	b	-
+chr1	159306	159338	b	b	-
+chr1	159388	159420	a	a	+
+chr1	159364	159396	b	b	-
+chr1	159485	159517	b	b	-
+chr1	159536	159568	a	a	+
+chr1	159525	159557	b	b	-
+chr1	159525	159557	b	b	-
+chr1	159603	159635	b	b	-
+chr1	159603	159635	b	b	-
+chr1	159660	159692	a	a	+
+chr1	159660	159692	a	a	+
+chr1	159691	159723	a	a	+
+chr1	159707	159739	a	a	+
+chr1	159680	159712	b	b	-
+chr1	159755	159787	b	b	-
+chr1	160038	160070	a	a	+
+chr1	160068	160100	a	a	+
+chr1	160049	160081	b	b	-
+chr1	160058	160090	b	b	-
+chr1	160058	160090	b	b	-
+chr1	160058	160090	b	b	-
+chr1	160094	160126	a	a	+
+chr1	160069	160101	b	b	-
+chr1	160105	160137	a	a	+
+chr1	160105	160137	a	a	+
+chr1	160105	160137	a	a	+
+chr1	160080	160112	b	b	-
+chr1	160120	160152	a	a	+
+chr1	160088	160120	b	b	-
+chr1	160227	160259	b	b	-
+chr1	160227	160259	b	b	-
+chr1	160232	160264	b	b	-
+chr1	160232	160264	b	b	-
+chr1	160233	160265	b	b	-
+chr1	160239	160271	b	b	-
+chr1	160240	160272	b	b	-
+chr1	160243	160275	b	b	-
+chr1	160243	160275	b	b	-
+chr1	160243	160275	b	b	-
+chr1	160244	160276	b	b	-
+chr1	160247	160279	b	b	-
+chr1	160247	160279	b	b	-
+chr1	160248	160280	b	b	-
+chr1	160251	160283	b	b	-
+chr1	160253	160285	b	b	-
+chr1	160253	160285	b	b	-
+chr1	160253	160285	b	b	-
+chr1	160254	160286	b	b	-
+chr1	160256	160288	b	b	-
+chr1	160256	160288	b	b	-
+chr1	160256	160288	b	b	-
+chr1	160256	160288	b	b	-
+chr1	160256	160288	b	b	-
+chr1	160257	160289	b	b	-
+chr1	160257	160289	b	b	-
+chr1	160257	160289	b	b	-
+chr1	160257	160289	b	b	-
+chr1	160257	160289	b	b	-
+chr1	160257	160289	b	b	-
+chr1	160257	160289	b	b	-
+chr1	160257	160289	b	b	-
+chr1	160257	160289	b	b	-
+chr1	160257	160289	b	b	-
+chr1	160257	160289	b	b	-
+chr1	160257	160289	b	b	-
+chr1	160257	160289	b	b	-
+chr1	160257	160289	b	b	-
+chr1	160257	160289	b	b	-
+chr1	160257	160289	b	b	-
+chr1	160257	160289	b	b	-
+chr1	160258	160290	b	b	-
+chr1	160261	160293	b	b	-
+chr1	160265	160297	b	b	-
+chr1	160266	160298	b	b	-
+chr1	160268	160300	b	b	-
+chr1	160269	160301	b	b	-
+chr1	160270	160302	b	b	-
+chr1	160272	160304	b	b	-
+chr1	160274	160306	b	b	-
+chr1	160278	160310	b	b	-
+chr1	160312	160344	a	a	+
+chr1	160312	160344	a	a	+
+chr1	160312	160344	a	a	+
+chr1	160312	160344	a	a	+
+chr1	160312	160344	a	a	+
+chr1	160282	160314	b	b	-
+chr1	160284	160316	b	b	-
+chr1	160319	160351	a	a	+
+chr1	160319	160351	a	a	+
+chr1	160319	160351	a	a	+
+chr1	160319	160351	a	a	+
+chr1	160319	160351	a	a	+
+chr1	160290	160322	b	b	-
+chr1	160290	160322	b	b	-
+chr1	160324	160356	a	a	+
+chr1	160324	160356	a	a	+
+chr1	160330	160362	a	a	+
+chr1	160298	160330	b	b	-
+chr1	160298	160330	b	b	-
+chr1	160298	160330	b	b	-
+chr1	160299	160331	b	b	-
+chr1	160332	160364	a	a	+
+chr1	160300	160332	b	b	-
+chr1	160335	160367	a	a	+
+chr1	160309	160341	b	b	-
+chr1	160362	160394	a	a	+
+chr1	160368	160400	a	a	+
+chr1	160379	160411	a	a	+
+chr1	160380	160412	a	a	+
+chr1	160381	160413	a	a	+
+chr1	160390	160422	a	a	+
+chr1	160359	160391	b	b	-
+chr1	160392	160424	a	a	+
+chr1	160392	160424	a	a	+
+chr1	160392	160424	a	a	+
+chr1	160380	160412	b	b	-
+chr1	160413	160445	a	a	+
+chr1	160414	160446	a	a	+
+chr1	160414	160446	a	a	+
+chr1	160418	160450	a	a	+
+chr1	160418	160450	a	a	+
+chr1	160419	160451	a	a	+
+chr1	160425	160457	a	a	+
+chr1	160407	160439	b	b	-
+chr1	160440	160472	a	a	+
+chr1	160440	160472	a	a	+
+chr1	160408	160440	b	b	-
+chr1	160446	160478	a	a	+
+chr1	160414	160446	b	b	-
+chr1	160414	160446	b	b	-
+chr1	160447	160479	a	a	+
+chr1	160448	160480	a	a	+
+chr1	160448	160480	a	a	+
+chr1	160416	160448	b	b	-
+chr1	160424	160456	b	b	-
+chr1	160426	160458	b	b	-
+chr1	160436	160468	b	b	-
+chr1	160474	160506	a	a	+
+chr1	160476	160508	a	a	+
+chr1	160446	160478	b	b	-
+chr1	160449	160481	b	b	-
+chr1	160456	160488	b	b	-
+chr1	160492	160524	a	a	+
+chr1	160492	160524	a	a	+
+chr1	160492	160524	a	a	+
+chr1	160492	160524	a	a	+
+chr1	160492	160524	a	a	+
+chr1	160495	160527	a	a	+
+chr1	160496	160528	a	a	+
+chr1	160496	160528	a	a	+
+chr1	160498	160530	a	a	+
+chr1	160499	160531	a	a	+
+chr1	160467	160499	b	b	-
+chr1	160470	160502	b	b	-
+chr1	160470	160502	b	b	-
+chr1	160470	160502	b	b	-
+chr1	160470	160502	b	b	-
+chr1	160470	160502	b	b	-
+chr1	160510	160542	a	a	+
+chr1	160510	160542	a	a	+
+chr1	160510	160542	a	a	+
+chr1	160510	160542	a	a	+
+chr1	160510	160542	a	a	+
+chr1	160510	160542	a	a	+
+chr1	160511	160543	a	a	+
+chr1	160511	160543	a	a	+
+chr1	160511	160543	a	a	+
+chr1	160514	160546	a	a	+
+chr1	160515	160547	a	a	+
+chr1	160515	160547	a	a	+
+chr1	160516	160548	a	a	+
+chr1	160526	160558	a	a	+
+chr1	160526	160558	a	a	+
+chr1	160546	160578	a	a	+
+chr1	160546	160578	a	a	+
+chr1	160550	160582	a	a	+
+chr1	160551	160583	a	a	+
+chr1	160554	160586	a	a	+
+chr1	160619	160651	a	a	+
+chr1	160642	160674	a	a	+
+chr1	160645	160677	a	a	+
+chr1	160616	160648	b	b	-
+chr1	160616	160648	b	b	-
+chr1	160633	160665	b	b	-
+chr1	160670	160702	a	a	+
+chr1	160670	160702	a	a	+
+chr1	160674	160706	a	a	+
+chr1	160696	160728	a	a	+
+chr1	160665	160697	b	b	-
+chr1	160699	160731	b	b	-
+chr1	160807	160839	a	a	+
+chr1	160813	160845	b	b	-
+chr1	160832	160864	b	b	-
+chr1	160832	160864	b	b	-
+chr1	160865	160897	a	a	+
+chr1	160866	160898	a	a	+
+chr1	160842	160874	b	b	-
+chr1	160851	160883	b	b	-
+chr1	160851	160883	b	b	-
+chr1	160851	160883	b	b	-
+chr1	160897	160929	a	a	+
+chr1	160879	160911	b	b	-
+chr1	160909	160941	b	b	-
+chr1	160942	160974	a	a	+
+chr1	160918	160950	b	b	-
+chr1	160923	160955	b	b	-
+chr1	160923	160955	b	b	-
+chr1	160933	160965	b	b	-
+chr1	160966	160998	a	a	+
+chr1	160967	160999	a	a	+
+chr1	160938	160970	b	b	-
+chr1	160975	161007	a	a	+
+chr1	160985	161017	b	b	-
+chr1	160989	161021	b	b	-
+chr1	160989	161021	b	b	-
+chr1	160994	161026	b	b	-
+chr1	161019	161051	b	b	-
+chr1	161031	161063	b	b	-
+chr1	161037	161069	b	b	-
+chr1	161037	161069	b	b	-
+chr1	161051	161083	b	b	-
+chr1	161060	161092	b	b	-
+chr1	161106	161138	a	a	+
+chr1	161091	161123	b	b	-
+chr1	161132	161164	a	a	+
+chr1	161136	161168	a	a	+
+chr1	161142	161174	a	a	+
+chr1	161170	161202	a	a	+
+chr1	161141	161173	b	b	-
+chr1	161175	161207	b	b	-
+chr1	161236	161268	a	a	+
+chr1	161214	161246	b	b	-
+chr1	161235	161267	b	b	-
+chr1	161237	161269	b	b	-
+chr1	161275	161307	a	a	+
+chr1	161271	161303	b	b	-
+chr1	161272	161304	b	b	-
+chr1	161311	161343	a	a	+
+chr1	161311	161343	a	a	+
+chr1	161283	161315	b	b	-
+chr1	161283	161315	b	b	-
+chr1	161317	161349	a	a	+
+chr1	161325	161357	a	a	+
+chr1	161295	161327	b	b	-
+chr1	161333	161365	a	a	+
+chr1	161307	161339	b	b	-
+chr1	161312	161344	b	b	-
+chr1	161351	161383	a	a	+
+chr1	161355	161387	a	a	+
+chr1	161323	161355	b	b	-
+chr1	161358	161390	a	a	+
+chr1	161336	161368	b	b	-
+chr1	161370	161402	a	a	+
+chr1	161350	161382	b	b	-
+chr1	161362	161394	b	b	-
+chr1	161395	161427	a	a	+
+chr1	161374	161406	b	b	-
+chr1	161375	161407	b	b	-
+chr1	161375	161407	b	b	-
+chr1	161394	161426	b	b	-
+chr1	161430	161462	a	a	+
+chr1	161446	161478	a	a	+
+chr1	161556	161588	a	a	+
+chr1	161540	161572	b	b	-
+chr1	161543	161575	b	b	-
+chr1	161577	161609	a	a	+
+chr1	161580	161612	a	a	+
+chr1	161630	161662	a	a	+
+chr1	161610	161642	b	b	-
+chr1	161650	161682	a	a	+
+chr1	161650	161682	a	a	+
+chr1	161655	161687	a	a	+
+chr1	161659	161691	a	a	+
+chr1	161662	161694	a	a	+
+chr1	161662	161694	a	a	+
+chr1	161662	161694	a	a	+
+chr1	161662	161694	a	a	+
+chr1	161662	161694	a	a	+
+chr1	161643	161675	b	b	-
+chr1	161680	161712	a	a	+
+chr1	161648	161680	b	b	-
+chr1	161649	161681	b	b	-
+chr1	161652	161684	b	b	-
+chr1	161652	161684	b	b	-
+chr1	161698	161730	a	a	+
+chr1	161698	161730	a	a	+
+chr1	161674	161706	b	b	-
+chr1	161675	161707	b	b	-
+chr1	161676	161708	b	b	-
+chr1	161741	161773	a	a	+
+chr1	161717	161749	b	b	-
+chr1	161727	161759	b	b	-
+chr1	161727	161759	b	b	-
+chr1	161765	161797	a	a	+
+chr1	161782	161814	a	a	+
+chr1	161794	161826	a	a	+
+chr1	161770	161802	b	b	-
+chr1	161794	161826	b	b	-
+chr1	161853	161885	b	b	-
+chr1	161855	161887	b	b	-
+chr1	161864	161896	b	b	-
+chr1	161865	161897	b	b	-
+chr1	161866	161898	b	b	-
+chr1	161866	161898	b	b	-
+chr1	161904	161936	a	a	+
+chr1	161882	161914	b	b	-
+chr1	161883	161915	b	b	-
+chr1	161892	161924	b	b	-
+chr1	161927	161959	a	a	+
+chr1	161934	161966	a	a	+
+chr1	161934	161966	a	a	+
+chr1	161937	161969	a	a	+
+chr1	161905	161937	b	b	-
+chr1	161917	161949	b	b	-
+chr1	161917	161949	b	b	-
+chr1	161933	161965	b	b	-
+chr1	161968	162000	a	a	+
+chr1	161944	161976	b	b	-
+chr1	161952	161984	b	b	-
+chr1	161993	162025	b	b	-
+chr1	161997	162029	b	b	-
+chr1	162010	162042	b	b	-
+chr1	162019	162051	b	b	-
+chr1	162085	162117	a	a	+
+chr1	162099	162131	a	a	+
+chr1	162084	162116	b	b	-
+chr1	162128	162160	a	a	+
+chr1	162129	162161	a	a	+
+chr1	162101	162133	b	b	-
+chr1	162113	162145	b	b	-
+chr1	162152	162184	a	a	+
+chr1	162122	162154	b	b	-
+chr1	162163	162195	a	a	+
+chr1	162172	162204	a	a	+
+chr1	162146	162178	b	b	-
+chr1	162196	162228	a	a	+
+chr1	162219	162251	a	a	+
+chr1	162187	162219	b	b	-
+chr1	162203	162235	b	b	-
+chr1	162240	162272	a	a	+
+chr1	162263	162295	a	a	+
+chr1	162232	162264	b	b	-
+chr1	162232	162264	b	b	-
+chr1	162267	162299	a	a	+
+chr1	162244	162276	b	b	-
+chr1	162252	162284	b	b	-
+chr1	162291	162323	a	a	+
+chr1	162281	162313	b	b	-
+chr1	162314	162346	b	b	-
+chr1	162344	162376	b	b	-
+chr1	162394	162426	a	a	+
+chr1	162363	162395	b	b	-
+chr1	162396	162428	a	a	+
+chr1	162376	162408	b	b	-
+chr1	162378	162410	b	b	-
+chr1	162378	162410	b	b	-
+chr1	162386	162418	b	b	-
+chr1	162423	162455	a	a	+
+chr1	162425	162457	a	a	+
+chr1	162394	162426	b	b	-
+chr1	162421	162453	b	b	-
+chr1	162421	162453	b	b	-
+chr1	162421	162453	b	b	-
+chr1	162461	162493	a	a	+
+chr1	162434	162466	b	b	-
+chr1	162469	162501	a	a	+
+chr1	162483	162515	a	a	+
+chr1	162497	162529	a	a	+
+chr1	162497	162529	a	a	+
+chr1	162492	162524	b	b	-
+chr1	162561	162593	a	a	+
+chr1	162564	162596	a	a	+
+chr1	162566	162598	a	a	+
+chr1	162541	162573	b	b	-
+chr1	162556	162588	b	b	-
+chr1	162617	162649	a	a	+
+chr1	162617	162649	a	a	+
+chr1	162588	162620	b	b	-
+chr1	162588	162620	b	b	-
+chr1	162632	162664	a	a	+
+chr1	162601	162633	b	b	-
+chr1	162635	162667	a	a	+
+chr1	162643	162675	a	a	+
+chr1	162649	162681	a	a	+
+chr1	162671	162703	a	a	+
+chr1	162672	162704	a	a	+
+chr1	162675	162707	a	a	+
+chr1	162667	162699	b	b	-
+chr1	162686	162718	b	b	-
+chr1	162686	162718	b	b	-
+chr1	162689	162721	b	b	-
+chr1	162726	162758	a	a	+
+chr1	162726	162758	a	a	+
+chr1	162712	162744	b	b	-
+chr1	162753	162785	a	a	+
+chr1	162753	162785	a	a	+
+chr1	162757	162789	a	a	+
+chr1	162757	162789	a	a	+
+chr1	162757	162789	a	a	+
+chr1	162725	162757	b	b	-
+chr1	162727	162759	b	b	-
+chr1	162772	162804	a	a	+
+chr1	162774	162806	a	a	+
+chr1	162779	162811	a	a	+
+chr1	162775	162807	b	b	-
+chr1	162810	162842	a	a	+
+chr1	162810	162842	a	a	+
+chr1	162795	162827	b	b	-
+chr1	162829	162861	a	a	+
+chr1	162876	162908	a	a	+
+chr1	162876	162908	a	a	+
+chr1	162877	162909	a	a	+
+chr1	162877	162909	a	a	+
+chr1	162881	162913	a	a	+
+chr1	162881	162913	a	a	+
+chr1	162882	162914	a	a	+
+chr1	162871	162903	b	b	-
+chr1	162908	162940	a	a	+
+chr1	162908	162940	a	a	+
+chr1	162915	162947	a	a	+
+chr1	162890	162922	b	b	-
+chr1	162930	162962	a	a	+
+chr1	162917	162949	b	b	-
+chr1	162954	162986	a	a	+
+chr1	162929	162961	b	b	-
+chr1	162931	162963	b	b	-
+chr1	162980	163012	a	a	+
+chr1	162983	163015	a	a	+
+chr1	162998	163030	a	a	+
+chr1	163005	163037	a	a	+
+chr1	163005	163037	a	a	+
+chr1	162989	163021	b	b	-
+chr1	163023	163055	a	a	+
+chr1	163029	163061	a	a	+
+chr1	163030	163062	a	a	+
+chr1	163032	163064	a	a	+
+chr1	163032	163064	a	a	+
+chr1	163032	163064	a	a	+
+chr1	163046	163078	a	a	+
+chr1	163050	163082	a	a	+
+chr1	163037	163069	b	b	-
+chr1	163058	163090	b	b	-
+chr1	163059	163091	b	b	-
+chr1	163097	163129	b	b	-
+chr1	163097	163129	b	b	-
+chr1	163131	163163	a	a	+
+chr1	163101	163133	b	b	-
+chr1	163143	163175	a	a	+
+chr1	163147	163179	a	a	+
+chr1	163149	163181	a	a	+
+chr1	163151	163183	a	a	+
+chr1	163128	163160	b	b	-
+chr1	163170	163202	a	a	+
+chr1	163170	163202	a	a	+
+chr1	163170	163202	a	a	+
+chr1	163186	163218	a	a	+
+chr1	163186	163218	a	a	+
+chr1	163190	163222	a	a	+
+chr1	163200	163232	a	a	+
+chr1	163169	163201	b	b	-
+chr1	163169	163201	b	b	-
+chr1	163203	163235	a	a	+
+chr1	163203	163235	a	a	+
+chr1	163239	163271	a	a	+
+chr1	163208	163240	b	b	-
+chr1	163208	163240	b	b	-
+chr1	163245	163277	a	a	+
+chr1	163218	163250	b	b	-
+chr1	163256	163288	a	a	+
+chr1	163229	163261	b	b	-
+chr1	163237	163269	b	b	-
+chr1	163246	163278	b	b	-
+chr1	163246	163278	b	b	-
+chr1	163279	163311	a	a	+
+chr1	163253	163285	b	b	-
+chr1	163287	163319	a	a	+
+chr1	163287	163319	a	a	+
+chr1	163293	163325	a	a	+
+chr1	163272	163304	b	b	-
+chr1	163274	163306	b	b	-
+chr1	163274	163306	b	b	-
+chr1	163322	163354	a	a	+
+chr1	163330	163362	a	a	+
+chr1	163298	163330	b	b	-
+chr1	163332	163364	a	a	+
+chr1	163303	163335	b	b	-
+chr1	163307	163339	b	b	-
+chr1	163340	163372	a	a	+
+chr1	163343	163375	a	a	+
+chr1	163311	163343	b	b	-
+chr1	163312	163344	b	b	-
+chr1	163345	163377	a	a	+
+chr1	163345	163377	a	a	+
+chr1	163345	163377	a	a	+
+chr1	163314	163346	b	b	-
+chr1	163347	163379	a	a	+
+chr1	163349	163381	a	a	+
+chr1	163318	163350	b	b	-
+chr1	163318	163350	b	b	-
+chr1	163319	163351	b	b	-
+chr1	163357	163389	a	a	+
+chr1	163359	163391	a	a	+
+chr1	163368	163400	a	a	+
+chr1	163337	163369	b	b	-
+chr1	163391	163423	a	a	+
+chr1	163391	163423	a	a	+
+chr1	163405	163437	a	a	+
+chr1	163405	163437	a	a	+
+chr1	163396	163428	b	b	-
+chr1	163452	163484	a	a	+
+chr1	163452	163484	a	a	+
+chr1	163425	163457	b	b	-
+chr1	163425	163457	b	b	-
+chr1	163500	163532	a	a	+
+chr1	163510	163542	a	a	+
+chr1	163480	163512	b	b	-
+chr1	163483	163515	b	b	-
+chr1	163484	163516	b	b	-
+chr1	163489	163521	b	b	-
+chr1	163490	163522	b	b	-
+chr1	163527	163559	a	a	+
+chr1	163527	163559	a	a	+
+chr1	163495	163527	b	b	-
+chr1	163533	163565	a	a	+
+chr1	163502	163534	b	b	-
+chr1	163542	163574	a	a	+
+chr1	163549	163581	a	a	+
+chr1	163549	163581	a	a	+
+chr1	163528	163560	b	b	-
+chr1	163528	163560	b	b	-
+chr1	163531	163563	b	b	-
+chr1	163533	163565	b	b	-
+chr1	163585	163617	a	a	+
+chr1	163557	163589	b	b	-
+chr1	163563	163595	b	b	-
+chr1	163607	163639	a	a	+
+chr1	163607	163639	a	a	+
+chr1	163607	163639	a	a	+
+chr1	163590	163622	b	b	-
+chr1	163624	163656	a	a	+
+chr1	163593	163625	b	b	-
+chr1	163623	163655	b	b	-
+chr1	163623	163655	b	b	-
+chr1	163623	163655	b	b	-
+chr1	163623	163655	b	b	-
+chr1	163630	163662	b	b	-
+chr1	163630	163662	b	b	-
+chr1	163664	163696	a	a	+
+chr1	163633	163665	b	b	-
+chr1	163638	163670	b	b	-
+chr1	163675	163707	a	a	+
+chr1	163675	163707	a	a	+
+chr1	163676	163708	a	a	+
+chr1	163649	163681	b	b	-
+chr1	163649	163681	b	b	-
+chr1	163652	163684	b	b	-
+chr1	163686	163718	a	a	+
+chr1	163669	163701	b	b	-
+chr1	163669	163701	b	b	-
+chr1	163669	163701	b	b	-
+chr1	163713	163745	a	a	+
+chr1	163716	163748	a	a	+
+chr1	163717	163749	a	a	+
+chr1	163685	163717	b	b	-
+chr1	163688	163720	b	b	-
+chr1	163688	163720	b	b	-
+chr1	163692	163724	b	b	-
+chr1	163748	163780	a	a	+
+chr1	163748	163780	a	a	+
+chr1	163748	163780	a	a	+
+chr1	163748	163780	a	a	+
+chr1	163751	163783	a	a	+
+chr1	163742	163774	b	b	-
+chr1	163742	163774	b	b	-
+chr1	163742	163774	b	b	-
+chr1	163779	163811	a	a	+
+chr1	163779	163811	a	a	+
+chr1	163779	163811	a	a	+
+chr1	163749	163781	b	b	-
+chr1	163753	163785	b	b	-
+chr1	163753	163785	b	b	-
+chr1	163787	163819	a	a	+
+chr1	163795	163827	a	a	+
+chr1	163775	163807	b	b	-
+chr1	163777	163809	b	b	-
+chr1	163788	163820	b	b	-
+chr1	163832	163864	a	a	+
+chr1	163833	163865	a	a	+
+chr1	163805	163837	b	b	-
+chr1	163840	163872	a	a	+
+chr1	163840	163872	a	a	+
+chr1	163818	163850	b	b	-
+chr1	163830	163862	b	b	-
+chr1	163836	163868	b	b	-
+chr1	163838	163870	b	b	-
+chr1	163843	163875	b	b	-
+chr1	163843	163875	b	b	-
+chr1	163852	163884	b	b	-
+chr1	163852	163884	b	b	-
+chr1	163852	163884	b	b	-
+chr1	163888	163920	a	a	+
+chr1	163888	163920	a	a	+
+chr1	163888	163920	a	a	+
+chr1	163888	163920	a	a	+
+chr1	163888	163920	a	a	+
+chr1	163888	163920	a	a	+
+chr1	163862	163894	b	b	-
+chr1	163915	163947	a	a	+
+chr1	163915	163947	a	a	+
+chr1	163886	163918	b	b	-
+chr1	163925	163957	a	a	+
+chr1	163925	163957	a	a	+
+chr1	163895	163927	b	b	-
+chr1	163905	163937	b	b	-
+chr1	163912	163944	b	b	-
+chr1	163950	163982	a	a	+
+chr1	163956	163988	a	a	+
+chr1	163926	163958	b	b	-
+chr1	163934	163966	b	b	-
+chr1	163972	164004	a	a	+
+chr1	163984	164016	a	a	+
+chr1	163989	164021	a	a	+
+chr1	163989	164021	a	a	+
+chr1	163999	164031	a	a	+
+chr1	163972	164004	b	b	-
+chr1	164009	164041	a	a	+
+chr1	163978	164010	b	b	-
+chr1	163978	164010	b	b	-
+chr1	163978	164010	b	b	-
+chr1	163982	164014	b	b	-
+chr1	163983	164015	b	b	-
+chr1	163984	164016	b	b	-
+chr1	163984	164016	b	b	-
+chr1	163984	164016	b	b	-
+chr1	163984	164016	b	b	-
+chr1	163984	164016	b	b	-
+chr1	163984	164016	b	b	-
+chr1	163984	164016	b	b	-
+chr1	163984	164016	b	b	-
+chr1	163984	164016	b	b	-
+chr1	163984	164016	b	b	-
+chr1	163984	164016	b	b	-
+chr1	163984	164016	b	b	-
+chr1	163984	164016	b	b	-
+chr1	163984	164016	b	b	-
+chr1	163994	164026	b	b	-
+chr1	163994	164026	b	b	-
+chr1	164043	164075	a	a	+
+chr1	164043	164075	a	a	+
+chr1	164043	164075	a	a	+
+chr1	164013	164045	b	b	-
+chr1	164028	164060	b	b	-
+chr1	164068	164100	a	a	+
+chr1	164074	164106	a	a	+
+chr1	164077	164109	a	a	+
+chr1	164077	164109	a	a	+
+chr1	164084	164116	a	a	+
+chr1	164061	164093	b	b	-
+chr1	164097	164129	a	a	+
+chr1	164112	164144	a	a	+
+chr1	164083	164115	b	b	-
+chr1	164124	164156	a	a	+
+chr1	164124	164156	a	a	+
+chr1	164124	164156	a	a	+
+chr1	164092	164124	b	b	-
+chr1	164112	164144	b	b	-
+chr1	164117	164149	b	b	-
+chr1	164152	164184	a	a	+
+chr1	164125	164157	b	b	-
+chr1	164158	164190	a	a	+
+chr1	164130	164162	b	b	-
+chr1	164165	164197	a	a	+
+chr1	164166	164198	a	a	+
+chr1	164175	164207	a	a	+
+chr1	164177	164209	a	a	+
+chr1	164150	164182	b	b	-
+chr1	164150	164182	b	b	-
+chr1	164150	164182	b	b	-
+chr1	164199	164231	a	a	+
+chr1	164180	164212	b	b	-
+chr1	164217	164249	a	a	+
+chr1	164218	164250	a	a	+
+chr1	164190	164222	b	b	-
+chr1	164191	164223	b	b	-
+chr1	164191	164223	b	b	-
+chr1	164191	164223	b	b	-
+chr1	164243	164275	a	a	+
+chr1	164247	164279	a	a	+
+chr1	164267	164299	a	a	+
+chr1	164267	164299	a	a	+
+chr1	164267	164299	a	a	+
+chr1	164267	164299	a	a	+
+chr1	164272	164304	a	a	+
+chr1	164248	164280	b	b	-
+chr1	164284	164316	a	a	+
+chr1	164284	164316	a	a	+
+chr1	164284	164316	a	a	+
+chr1	164260	164292	b	b	-
+chr1	164297	164329	a	a	+
+chr1	164265	164297	b	b	-
+chr1	164265	164297	b	b	-
+chr1	164265	164297	b	b	-
+chr1	164266	164298	b	b	-
+chr1	164266	164298	b	b	-
+chr1	164267	164299	b	b	-
+chr1	164302	164334	a	a	+
+chr1	164271	164303	b	b	-
+chr1	164273	164305	b	b	-
+chr1	164311	164343	a	a	+
+chr1	164312	164344	a	a	+
+chr1	164280	164312	b	b	-
+chr1	164313	164345	a	a	+
+chr1	164281	164313	b	b	-
+chr1	164319	164351	a	a	+
+chr1	164288	164320	b	b	-
+chr1	164289	164321	b	b	-
+chr1	164322	164354	a	a	+
+chr1	164333	164365	a	a	+
+chr1	164336	164368	a	a	+
+chr1	164338	164370	a	a	+
+chr1	164355	164387	a	a	+
+chr1	164356	164388	a	a	+
+chr1	164344	164376	b	b	-
+chr1	164404	164436	a	a	+
+chr1	164409	164441	a	a	+
+chr1	164380	164412	b	b	-
+chr1	164400	164432	b	b	-
+chr1	164412	164444	b	b	-
+chr1	164446	164478	a	a	+
+chr1	164446	164478	a	a	+
+chr1	164455	164487	a	a	+
+chr1	164455	164487	a	a	+
+chr1	164424	164456	b	b	-
+chr1	164463	164495	a	a	+
+chr1	164435	164467	b	b	-
+chr1	164435	164467	b	b	-
+chr1	164435	164467	b	b	-
+chr1	164468	164500	a	a	+
+chr1	164471	164503	a	a	+
+chr1	164471	164503	a	a	+
+chr1	164444	164476	b	b	-
+chr1	164456	164488	b	b	-
+chr1	164489	164521	a	a	+
+chr1	164490	164522	a	a	+
+chr1	164490	164522	a	a	+
+chr1	164490	164522	a	a	+
+chr1	164490	164522	a	a	+
+chr1	164458	164490	b	b	-
+chr1	164493	164525	a	a	+
+chr1	164493	164525	a	a	+
+chr1	164463	164495	b	b	-
+chr1	164464	164496	b	b	-
+chr1	164499	164531	a	a	+
+chr1	164503	164535	a	a	+
+chr1	164471	164503	b	b	-
+chr1	164506	164538	a	a	+
+chr1	164506	164538	a	a	+
+chr1	164506	164538	a	a	+
+chr1	164506	164538	a	a	+
+chr1	164506	164538	a	a	+
+chr1	164474	164506	b	b	-
+chr1	164474	164506	b	b	-
+chr1	164474	164506	b	b	-
+chr1	164474	164506	b	b	-
+chr1	164480	164512	b	b	-
+chr1	164515	164547	a	a	+
+chr1	164483	164515	b	b	-
+chr1	164484	164516	b	b	-
+chr1	164521	164553	a	a	+
+chr1	164522	164554	a	a	+
+chr1	164522	164554	a	a	+
+chr1	164522	164554	a	a	+
+chr1	164522	164554	a	a	+
+chr1	164494	164526	b	b	-
+chr1	164497	164529	b	b	-
+chr1	164497	164529	b	b	-
+chr1	164499	164531	b	b	-
+chr1	164500	164532	b	b	-
+chr1	164500	164532	b	b	-
+chr1	164535	164567	a	a	+
+chr1	164536	164568	a	a	+
+chr1	164537	164569	a	a	+
+chr1	164506	164538	b	b	-
+chr1	164537	164569	b	b	-
+chr1	164540	164572	b	b	-
+chr1	164540	164572	b	b	-
+chr1	164585	164617	a	a	+
+chr1	164553	164585	b	b	-
+chr1	164587	164619	a	a	+
+chr1	164588	164620	a	a	+
+chr1	164557	164589	b	b	-
+chr1	164602	164634	a	a	+
+chr1	164603	164635	a	a	+
+chr1	164606	164638	a	a	+
+chr1	164574	164606	b	b	-
+chr1	164609	164641	a	a	+
+chr1	164609	164641	a	a	+
+chr1	164580	164612	b	b	-
+chr1	164580	164612	b	b	-
+chr1	164614	164646	a	a	+
+chr1	164585	164617	b	b	-
+chr1	164618	164650	a	a	+
+chr1	164618	164650	a	a	+
+chr1	164586	164618	b	b	-
+chr1	164586	164618	b	b	-
+chr1	164586	164618	b	b	-
+chr1	164587	164619	b	b	-
+chr1	164587	164619	b	b	-
+chr1	164587	164619	b	b	-
+chr1	164587	164619	b	b	-
+chr1	164588	164620	b	b	-
+chr1	164623	164655	a	a	+
+chr1	164624	164656	a	a	+
+chr1	164593	164625	b	b	-
+chr1	164595	164627	b	b	-
+chr1	164628	164660	a	a	+
+chr1	164629	164661	a	a	+
+chr1	164629	164661	a	a	+
+chr1	164629	164661	a	a	+
+chr1	164630	164662	a	a	+
+chr1	164598	164630	b	b	-
+chr1	164606	164638	b	b	-
+chr1	164606	164638	b	b	-
+chr1	164640	164672	a	a	+
+chr1	164640	164672	a	a	+
+chr1	164642	164674	a	a	+
+chr1	164642	164674	a	a	+
+chr1	164614	164646	b	b	-
+chr1	164614	164646	b	b	-
+chr1	164614	164646	b	b	-
+chr1	164614	164646	b	b	-
+chr1	164614	164646	b	b	-
+chr1	164614	164646	b	b	-
+chr1	164614	164646	b	b	-
+chr1	164614	164646	b	b	-
+chr1	164615	164647	b	b	-
+chr1	164615	164647	b	b	-
+chr1	164655	164687	a	a	+
+chr1	164656	164688	a	a	+
+chr1	164656	164688	a	a	+
+chr1	164626	164658	b	b	-
+chr1	164627	164659	b	b	-
+chr1	164627	164659	b	b	-
+chr1	164663	164695	a	a	+
+chr1	164631	164663	b	b	-
+chr1	164632	164664	b	b	-
+chr1	164634	164666	b	b	-
+chr1	164634	164666	b	b	-
+chr1	164634	164666	b	b	-
+chr1	164635	164667	b	b	-
+chr1	164635	164667	b	b	-
+chr1	164635	164667	b	b	-
+chr1	164668	164700	a	a	+
+chr1	164668	164700	a	a	+
+chr1	164668	164700	a	a	+
+chr1	164678	164710	a	a	+
+chr1	164678	164710	a	a	+
+chr1	164652	164684	b	b	-
+chr1	164652	164684	b	b	-
+chr1	164652	164684	b	b	-
+chr1	164652	164684	b	b	-
+chr1	164686	164718	a	a	+
+chr1	164687	164719	a	a	+
+chr1	164687	164719	a	a	+
+chr1	164687	164719	a	a	+
+chr1	164687	164719	a	a	+
+chr1	164687	164719	a	a	+
+chr1	164656	164688	b	b	-
+chr1	164689	164721	a	a	+
+chr1	164692	164724	a	a	+
+chr1	164660	164692	b	b	-
+chr1	164663	164695	b	b	-
+chr1	164663	164695	b	b	-
+chr1	164665	164697	b	b	-
+chr1	164665	164697	b	b	-
+chr1	164666	164698	b	b	-
+chr1	164674	164706	b	b	-
+chr1	164676	164708	b	b	-
+chr1	164682	164714	b	b	-
+chr1	164722	164754	a	a	+
+chr1	164694	164726	b	b	-
+chr1	164731	164763	a	a	+
+chr1	164733	164765	a	a	+
+chr1	164733	164765	a	a	+
+chr1	164702	164734	b	b	-
+chr1	164739	164771	a	a	+
+chr1	164719	164751	b	b	-
+chr1	164722	164754	b	b	-
+chr1	164760	164792	a	a	+
+chr1	164734	164766	b	b	-
+chr1	164775	164807	a	a	+
+chr1	164777	164809	a	a	+
+chr1	164777	164809	a	a	+
+chr1	164758	164790	b	b	-
+chr1	164758	164790	b	b	-
+chr1	164794	164826	a	a	+
+chr1	164794	164826	a	a	+
+chr1	164762	164794	b	b	-
+chr1	164762	164794	b	b	-
+chr1	164762	164794	b	b	-
+chr1	164798	164830	a	a	+
+chr1	164800	164832	a	a	+
+chr1	164800	164832	a	a	+
+chr1	164800	164832	a	a	+
+chr1	164777	164809	b	b	-
+chr1	164810	164842	a	a	+
+chr1	164813	164845	a	a	+
+chr1	164782	164814	b	b	-
+chr1	164782	164814	b	b	-
+chr1	164815	164847	a	a	+
+chr1	164815	164847	a	a	+
+chr1	164786	164818	b	b	-
+chr1	164786	164818	b	b	-
+chr1	164786	164818	b	b	-
+chr1	164819	164851	a	a	+
+chr1	164820	164852	a	a	+
+chr1	164820	164852	a	a	+
+chr1	164821	164853	a	a	+
+chr1	164821	164853	a	a	+
+chr1	164821	164853	a	a	+
+chr1	164821	164853	a	a	+
+chr1	164790	164822	b	b	-
+chr1	164790	164822	b	b	-
+chr1	164790	164822	b	b	-
+chr1	164791	164823	b	b	-
+chr1	164791	164823	b	b	-
+chr1	164791	164823	b	b	-
+chr1	164792	164824	b	b	-
+chr1	164792	164824	b	b	-
+chr1	164792	164824	b	b	-
+chr1	164792	164824	b	b	-
+chr1	164792	164824	b	b	-
+chr1	164793	164825	b	b	-
+chr1	164793	164825	b	b	-
+chr1	164793	164825	b	b	-
+chr1	164799	164831	b	b	-
+chr1	164801	164833	b	b	-
+chr1	164835	164867	a	a	+
+chr1	164835	164867	a	a	+
+chr1	164836	164868	a	a	+
+chr1	164839	164871	a	a	+
+chr1	164809	164841	b	b	-
+chr1	164809	164841	b	b	-
+chr1	164809	164841	b	b	-
+chr1	164809	164841	b	b	-
+chr1	164809	164841	b	b	-
+chr1	164809	164841	b	b	-
+chr1	164843	164875	a	a	+
+chr1	164843	164875	a	a	+
+chr1	164811	164843	b	b	-
+chr1	164811	164843	b	b	-
+chr1	164845	164877	a	a	+
+chr1	164813	164845	b	b	-
+chr1	164818	164850	b	b	-
+chr1	164818	164850	b	b	-
+chr1	164818	164850	b	b	-
+chr1	164818	164850	b	b	-
+chr1	164820	164852	b	b	-
+chr1	164820	164852	b	b	-
+chr1	164854	164886	a	a	+
+chr1	164822	164854	b	b	-
+chr1	164822	164854	b	b	-
+chr1	164822	164854	b	b	-
+chr1	164822	164854	b	b	-
+chr1	164822	164854	b	b	-
+chr1	164822	164854	b	b	-
+chr1	164822	164854	b	b	-
+chr1	164822	164854	b	b	-
+chr1	164855	164887	a	a	+
+chr1	164855	164887	a	a	+
+chr1	164830	164862	b	b	-
+chr1	164866	164898	a	a	+
+chr1	164867	164899	a	a	+
+chr1	164867	164899	a	a	+
+chr1	164874	164906	a	a	+
+chr1	164874	164906	a	a	+
+chr1	164874	164906	a	a	+
+chr1	164874	164906	a	a	+
+chr1	164874	164906	a	a	+
+chr1	164844	164876	b	b	-
+chr1	164846	164878	b	b	-
+chr1	164879	164911	a	a	+
+chr1	164879	164911	a	a	+
+chr1	164848	164880	b	b	-
+chr1	164852	164884	b	b	-
+chr1	164853	164885	b	b	-
+chr1	164864	164896	b	b	-
+chr1	164898	164930	a	a	+
+chr1	164871	164903	b	b	-
+chr1	164906	164938	a	a	+
+chr1	164877	164909	b	b	-
+chr1	164922	164954	a	a	+
+chr1	164928	164960	a	a	+
+chr1	164902	164934	b	b	-
+chr1	164948	164980	a	a	+
+chr1	164949	164981	a	a	+
+chr1	164917	164949	b	b	-
+chr1	164951	164983	a	a	+
+chr1	164922	164954	b	b	-
+chr1	164922	164954	b	b	-
+chr1	164922	164954	b	b	-
+chr1	164955	164987	a	a	+
+chr1	164925	164957	b	b	-
+chr1	164925	164957	b	b	-
+chr1	164928	164960	b	b	-
+chr1	164929	164961	b	b	-
+chr1	164929	164961	b	b	-
+chr1	164929	164961	b	b	-
+chr1	164929	164961	b	b	-
+chr1	164929	164961	b	b	-
+chr1	164962	164994	a	a	+
+chr1	164962	164994	a	a	+
+chr1	164930	164962	b	b	-
+chr1	164930	164962	b	b	-
+chr1	164931	164963	b	b	-
+chr1	164965	164997	a	a	+
+chr1	164965	164997	a	a	+
+chr1	164965	164997	a	a	+
+chr1	164965	164997	a	a	+
+chr1	164965	164997	a	a	+
+chr1	164933	164965	b	b	-
+chr1	164934	164966	b	b	-
+chr1	164934	164966	b	b	-
+chr1	164940	164972	b	b	-
+chr1	164940	164972	b	b	-
+chr1	164940	164972	b	b	-
+chr1	164940	164972	b	b	-
+chr1	164940	164972	b	b	-
+chr1	164979	165011	a	a	+
+chr1	164979	165011	a	a	+
+chr1	164980	165012	a	a	+
+chr1	164980	165012	a	a	+
+chr1	164980	165012	a	a	+
+chr1	164980	165012	a	a	+
+chr1	164981	165013	a	a	+
+chr1	164981	165013	a	a	+
+chr1	164982	165014	a	a	+
+chr1	164982	165014	a	a	+
+chr1	164982	165014	a	a	+
+chr1	164982	165014	a	a	+
+chr1	164982	165014	a	a	+
+chr1	164982	165014	a	a	+
+chr1	164982	165014	a	a	+
+chr1	164982	165014	a	a	+
+chr1	164983	165015	a	a	+
+chr1	164983	165015	a	a	+
+chr1	164953	164985	b	b	-
+chr1	164953	164985	b	b	-
+chr1	164953	164985	b	b	-
+chr1	164953	164985	b	b	-
+chr1	164954	164986	b	b	-
+chr1	164954	164986	b	b	-
+chr1	164954	164986	b	b	-
+chr1	164954	164986	b	b	-
+chr1	164987	165019	a	a	+
+chr1	164956	164988	b	b	-
+chr1	164956	164988	b	b	-
+chr1	164956	164988	b	b	-
+chr1	164956	164988	b	b	-
+chr1	164956	164988	b	b	-
+chr1	164956	164988	b	b	-
+chr1	164991	165023	a	a	+
+chr1	164991	165023	a	a	+
+chr1	164991	165023	a	a	+
+chr1	164991	165023	a	a	+
+chr1	164992	165024	a	a	+
+chr1	164993	165025	a	a	+
+chr1	164962	164994	b	b	-
+chr1	164963	164995	b	b	-
+chr1	164963	164995	b	b	-
+chr1	164963	164995	b	b	-
+chr1	164996	165028	a	a	+
+chr1	164964	164996	b	b	-
+chr1	164998	165030	a	a	+
+chr1	164969	165001	b	b	-
+chr1	164969	165001	b	b	-
+chr1	164971	165003	b	b	-
+chr1	164971	165003	b	b	-
+chr1	164971	165003	b	b	-
+chr1	164971	165003	b	b	-
+chr1	164971	165003	b	b	-
+chr1	165004	165036	a	a	+
+chr1	164972	165004	b	b	-
+chr1	165005	165037	a	a	+
+chr1	164973	165005	b	b	-
+chr1	165006	165038	a	a	+
+chr1	165007	165039	a	a	+
+chr1	165008	165040	a	a	+
+chr1	165008	165040	a	a	+
+chr1	165008	165040	a	a	+
+chr1	165008	165040	a	a	+
+chr1	165008	165040	a	a	+
+chr1	164976	165008	b	b	-
+chr1	164976	165008	b	b	-
+chr1	165009	165041	a	a	+
+chr1	165009	165041	a	a	+
+chr1	165009	165041	a	a	+
+chr1	165009	165041	a	a	+
+chr1	165009	165041	a	a	+
+chr1	165009	165041	a	a	+
+chr1	165009	165041	a	a	+
+chr1	165009	165041	a	a	+
+chr1	165009	165041	a	a	+
+chr1	165009	165041	a	a	+
+chr1	165009	165041	a	a	+
+chr1	165010	165042	a	a	+
+chr1	164978	165010	b	b	-
+chr1	164978	165010	b	b	-
+chr1	165012	165044	a	a	+
+chr1	164980	165012	b	b	-
+chr1	164980	165012	b	b	-
+chr1	164981	165013	b	b	-
+chr1	165014	165046	a	a	+
+chr1	165014	165046	a	a	+
+chr1	165014	165046	a	a	+
+chr1	164982	165014	b	b	-
+chr1	164982	165014	b	b	-
+chr1	164982	165014	b	b	-
+chr1	164983	165015	b	b	-
+chr1	164987	165019	b	b	-
+chr1	164987	165019	b	b	-
+chr1	164987	165019	b	b	-
+chr1	164987	165019	b	b	-
+chr1	164987	165019	b	b	-
+chr1	164987	165019	b	b	-
+chr1	164987	165019	b	b	-
+chr1	164987	165019	b	b	-
+chr1	164987	165019	b	b	-
+chr1	164987	165019	b	b	-
+chr1	164988	165020	b	b	-
+chr1	164988	165020	b	b	-
+chr1	164988	165020	b	b	-
+chr1	164988	165020	b	b	-
+chr1	164988	165020	b	b	-
+chr1	164988	165020	b	b	-
+chr1	164989	165021	b	b	-
+chr1	164989	165021	b	b	-
+chr1	164989	165021	b	b	-
+chr1	164989	165021	b	b	-
+chr1	165022	165054	a	a	+
+chr1	165022	165054	a	a	+
+chr1	165022	165054	a	a	+
+chr1	164990	165022	b	b	-
+chr1	164991	165023	b	b	-
+chr1	164991	165023	b	b	-
+chr1	164991	165023	b	b	-
+chr1	164992	165024	b	b	-
+chr1	164992	165024	b	b	-
+chr1	164992	165024	b	b	-
+chr1	164992	165024	b	b	-
+chr1	164992	165024	b	b	-
+chr1	164992	165024	b	b	-
+chr1	164992	165024	b	b	-
+chr1	164992	165024	b	b	-
+chr1	164992	165024	b	b	-
+chr1	164992	165024	b	b	-
+chr1	165025	165057	a	a	+
+chr1	165026	165058	a	a	+
+chr1	165026	165058	a	a	+
+chr1	165026	165058	a	a	+
+chr1	165026	165058	a	a	+
+chr1	165026	165058	a	a	+
+chr1	165026	165058	a	a	+
+chr1	165027	165059	a	a	+
+chr1	164995	165027	b	b	-
+chr1	164995	165027	b	b	-
+chr1	164995	165027	b	b	-
+chr1	164995	165027	b	b	-
+chr1	164995	165027	b	b	-
+chr1	164995	165027	b	b	-
+chr1	164995	165027	b	b	-
+chr1	164995	165027	b	b	-
+chr1	164995	165027	b	b	-
+chr1	164995	165027	b	b	-
+chr1	164995	165027	b	b	-
+chr1	164995	165027	b	b	-
+chr1	164995	165027	b	b	-
+chr1	164995	165027	b	b	-
+chr1	165028	165060	a	a	+
+chr1	165028	165060	a	a	+
+chr1	165028	165060	a	a	+
+chr1	165028	165060	a	a	+
+chr1	165028	165060	a	a	+
+chr1	165028	165060	a	a	+
+chr1	165028	165060	a	a	+
+chr1	164996	165028	b	b	-
+chr1	164996	165028	b	b	-
+chr1	165032	165064	a	a	+
+chr1	165032	165064	a	a	+
+chr1	165033	165065	a	a	+
+chr1	165033	165065	a	a	+
+chr1	165033	165065	a	a	+
+chr1	165033	165065	a	a	+
+chr1	165034	165066	a	a	+
+chr1	165034	165066	a	a	+
+chr1	165034	165066	a	a	+
+chr1	165002	165034	b	b	-
+chr1	165002	165034	b	b	-
+chr1	165002	165034	b	b	-
+chr1	165035	165067	a	a	+
+chr1	165035	165067	a	a	+
+chr1	165035	165067	a	a	+
+chr1	165003	165035	b	b	-
+chr1	165036	165068	a	a	+
+chr1	165036	165068	a	a	+
+chr1	165036	165068	a	a	+
+chr1	165036	165068	a	a	+
+chr1	165037	165069	a	a	+
+chr1	165037	165069	a	a	+
+chr1	165037	165069	a	a	+
+chr1	165037	165069	a	a	+
+chr1	165037	165069	a	a	+
+chr1	165037	165069	a	a	+
+chr1	165037	165069	a	a	+
+chr1	165037	165069	a	a	+
+chr1	165037	165069	a	a	+
+chr1	165037	165069	a	a	+
+chr1	165037	165069	a	a	+
+chr1	165037	165069	a	a	+
+chr1	165037	165069	a	a	+
+chr1	165037	165069	a	a	+
+chr1	165037	165069	a	a	+
+chr1	165037	165069	a	a	+
+chr1	165038	165070	a	a	+
+chr1	165006	165038	b	b	-
+chr1	165006	165038	b	b	-
+chr1	165006	165038	b	b	-
+chr1	165006	165038	b	b	-
+chr1	165007	165039	b	b	-
+chr1	165007	165039	b	b	-
+chr1	165007	165039	b	b	-
+chr1	165009	165041	b	b	-
+chr1	165010	165042	b	b	-
+chr1	165010	165042	b	b	-
+chr1	165010	165042	b	b	-
+chr1	165010	165042	b	b	-
+chr1	165010	165042	b	b	-
+chr1	165010	165042	b	b	-
+chr1	165043	165075	a	a	+
+chr1	165044	165076	a	a	+
+chr1	165045	165077	a	a	+
+chr1	165013	165045	b	b	-
+chr1	165046	165078	a	a	+
+chr1	165046	165078	a	a	+
+chr1	165046	165078	a	a	+
+chr1	165046	165078	a	a	+
+chr1	165046	165078	a	a	+
+chr1	165049	165081	a	a	+
+chr1	165049	165081	a	a	+
+chr1	165049	165081	a	a	+
+chr1	165049	165081	a	a	+
+chr1	165049	165081	a	a	+
+chr1	165017	165049	b	b	-
+chr1	165017	165049	b	b	-
+chr1	165020	165052	b	b	-
+chr1	165021	165053	b	b	-
+chr1	165055	165087	a	a	+
+chr1	165024	165056	b	b	-
+chr1	165027	165059	b	b	-
+chr1	165027	165059	b	b	-
+chr1	165027	165059	b	b	-
+chr1	165028	165060	b	b	-
+chr1	165062	165094	a	a	+
+chr1	165062	165094	a	a	+
+chr1	165064	165096	a	a	+
+chr1	165064	165096	a	a	+
+chr1	165064	165096	a	a	+
+chr1	165067	165099	a	a	+
+chr1	165068	165100	a	a	+
+chr1	165068	165100	a	a	+
+chr1	165068	165100	a	a	+
+chr1	165070	165102	a	a	+
+chr1	165039	165071	b	b	-
+chr1	165060	165092	b	b	-
+chr1	165064	165096	b	b	-
+chr1	165068	165100	b	b	-
+chr1	165068	165100	b	b	-
+chr1	165068	165100	b	b	-
+chr1	165068	165100	b	b	-
+chr1	165070	165102	b	b	-
+chr1	165112	165144	a	a	+
+chr1	165112	165144	a	a	+
+chr1	165112	165144	a	a	+
+chr1	165112	165144	a	a	+
+chr1	165080	165112	b	b	-
+chr1	165113	165145	a	a	+
+chr1	165113	165145	a	a	+
+chr1	165114	165146	a	a	+
+chr1	165114	165146	a	a	+
+chr1	165114	165146	a	a	+
+chr1	165114	165146	a	a	+
+chr1	165114	165146	a	a	+
+chr1	165114	165146	a	a	+
+chr1	165114	165146	a	a	+
+chr1	165082	165114	b	b	-
+chr1	165082	165114	b	b	-
+chr1	165082	165114	b	b	-
+chr1	165083	165115	b	b	-
+chr1	165083	165115	b	b	-
+chr1	165083	165115	b	b	-
+chr1	165083	165115	b	b	-
+chr1	165083	165115	b	b	-
+chr1	165085	165117	b	b	-
+chr1	165085	165117	b	b	-
+chr1	165087	165119	b	b	-
+chr1	165121	165153	a	a	+
+chr1	165121	165153	a	a	+
+chr1	165121	165153	a	a	+
+chr1	165121	165153	a	a	+
+chr1	165122	165154	a	a	+
+chr1	165122	165154	a	a	+
+chr1	165122	165154	a	a	+
+chr1	165122	165154	a	a	+
+chr1	165126	165158	a	a	+
+chr1	165126	165158	a	a	+
+chr1	165098	165130	b	b	-
+chr1	165098	165130	b	b	-
+chr1	165098	165130	b	b	-
+chr1	165099	165131	b	b	-
+chr1	165099	165131	b	b	-
+chr1	165099	165131	b	b	-
+chr1	165099	165131	b	b	-
+chr1	165099	165131	b	b	-
+chr1	165099	165131	b	b	-
+chr1	165100	165132	b	b	-
+chr1	165100	165132	b	b	-
+chr1	165101	165133	b	b	-
+chr1	165135	165167	a	a	+
+chr1	165135	165167	a	a	+
+chr1	165135	165167	a	a	+
+chr1	165136	165168	a	a	+
+chr1	165136	165168	a	a	+
+chr1	165136	165168	a	a	+
+chr1	165136	165168	a	a	+
+chr1	165138	165170	a	a	+
+chr1	165143	165175	a	a	+
+chr1	165143	165175	a	a	+
+chr1	165143	165175	a	a	+
+chr1	165143	165175	a	a	+
+chr1	165143	165175	a	a	+
+chr1	165143	165175	a	a	+
+chr1	165143	165175	a	a	+
+chr1	165111	165143	b	b	-
+chr1	165145	165177	a	a	+
+chr1	165145	165177	a	a	+
+chr1	165145	165177	a	a	+
+chr1	165145	165177	a	a	+
+chr1	165115	165147	b	b	-
+chr1	165149	165181	a	a	+
+chr1	165149	165181	a	a	+
+chr1	165117	165149	b	b	-
+chr1	165117	165149	b	b	-
+chr1	165117	165149	b	b	-
+chr1	165150	165182	a	a	+
+chr1	165150	165182	a	a	+
+chr1	165150	165182	a	a	+
+chr1	165150	165182	a	a	+
+chr1	165118	165150	b	b	-
+chr1	165153	165185	a	a	+
+chr1	165153	165185	a	a	+
+chr1	165153	165185	a	a	+
+chr1	165121	165153	b	b	-
+chr1	165122	165154	b	b	-
+chr1	165122	165154	b	b	-
+chr1	165155	165187	a	a	+
+chr1	165156	165188	a	a	+
+chr1	165156	165188	a	a	+
+chr1	165156	165188	a	a	+
+chr1	165156	165188	a	a	+
+chr1	165124	165156	b	b	-
+chr1	165124	165156	b	b	-
+chr1	165126	165158	b	b	-
+chr1	165162	165194	a	a	+
+chr1	165162	165194	a	a	+
+chr1	165162	165194	a	a	+
+chr1	165162	165194	a	a	+
+chr1	165162	165194	a	a	+
+chr1	165162	165194	a	a	+
+chr1	165131	165163	b	b	-
+chr1	165131	165163	b	b	-
+chr1	165136	165168	b	b	-
+chr1	165140	165172	b	b	-
+chr1	165174	165206	a	a	+
+chr1	165174	165206	a	a	+
+chr1	165174	165206	a	a	+
+chr1	165174	165206	a	a	+
+chr1	165176	165208	a	a	+
+chr1	165144	165176	b	b	-
+chr1	165144	165176	b	b	-
+chr1	165146	165178	b	b	-
+chr1	165180	165212	a	a	+
+chr1	165180	165212	a	a	+
+chr1	165180	165212	a	a	+
+chr1	165180	165212	a	a	+
+chr1	165180	165212	a	a	+
+chr1	165180	165212	a	a	+
+chr1	165148	165180	b	b	-
+chr1	165148	165180	b	b	-
+chr1	165181	165213	a	a	+
+chr1	165181	165213	a	a	+
+chr1	165181	165213	a	a	+
+chr1	165149	165181	b	b	-
+chr1	165149	165181	b	b	-
+chr1	165149	165181	b	b	-
+chr1	165149	165181	b	b	-
+chr1	165150	165182	b	b	-
+chr1	165150	165182	b	b	-
+chr1	165150	165182	b	b	-
+chr1	165151	165183	b	b	-
+chr1	165154	165186	b	b	-
+chr1	165154	165186	b	b	-
+chr1	165191	165223	a	a	+
+chr1	165192	165224	a	a	+
+chr1	165192	165224	a	a	+
+chr1	165160	165192	b	b	-
+chr1	165160	165192	b	b	-
+chr1	165160	165192	b	b	-
+chr1	165160	165192	b	b	-
+chr1	165160	165192	b	b	-
+chr1	165160	165192	b	b	-
+chr1	165160	165192	b	b	-
+chr1	165160	165192	b	b	-
+chr1	165160	165192	b	b	-
+chr1	165193	165225	a	a	+
+chr1	165161	165193	b	b	-
+chr1	165162	165194	b	b	-
+chr1	165163	165195	b	b	-
+chr1	165196	165228	a	a	+
+chr1	165199	165231	a	a	+
+chr1	165199	165231	a	a	+
+chr1	165199	165231	a	a	+
+chr1	165199	165231	a	a	+
+chr1	165199	165231	a	a	+
+chr1	165199	165231	a	a	+
+chr1	165200	165232	a	a	+
+chr1	165200	165232	a	a	+
+chr1	165200	165232	a	a	+
+chr1	165200	165232	a	a	+
+chr1	165200	165232	a	a	+
+chr1	165200	165232	a	a	+
+chr1	165200	165232	a	a	+
+chr1	165201	165233	a	a	+
+chr1	165201	165233	a	a	+
+chr1	165201	165233	a	a	+
+chr1	165201	165233	a	a	+
+chr1	165172	165204	b	b	-
+chr1	165175	165207	b	b	-
+chr1	165175	165207	b	b	-
+chr1	165175	165207	b	b	-
+chr1	165208	165240	a	a	+
+chr1	165176	165208	b	b	-
+chr1	165209	165241	a	a	+
+chr1	165209	165241	a	a	+
+chr1	165210	165242	a	a	+
+chr1	165210	165242	a	a	+
+chr1	165210	165242	a	a	+
+chr1	165210	165242	a	a	+
+chr1	165210	165242	a	a	+
+chr1	165210	165242	a	a	+
+chr1	165210	165242	a	a	+
+chr1	165210	165242	a	a	+
+chr1	165210	165242	a	a	+
+chr1	165210	165242	a	a	+
+chr1	165210	165242	a	a	+
+chr1	165210	165242	a	a	+
+chr1	165210	165242	a	a	+
+chr1	165210	165242	a	a	+
+chr1	165210	165242	a	a	+
+chr1	165210	165242	a	a	+
+chr1	165210	165242	a	a	+
+chr1	165212	165244	a	a	+
+chr1	165180	165212	b	b	-
+chr1	165180	165212	b	b	-
+chr1	165180	165212	b	b	-
+chr1	165213	165245	a	a	+
+chr1	165213	165245	a	a	+
+chr1	165213	165245	a	a	+
+chr1	165213	165245	a	a	+
+chr1	165214	165246	a	a	+
+chr1	165182	165214	b	b	-
+chr1	165182	165214	b	b	-
+chr1	165182	165214	b	b	-
+chr1	165182	165214	b	b	-
+chr1	165182	165214	b	b	-
+chr1	165182	165214	b	b	-
+chr1	165183	165215	b	b	-
+chr1	165183	165215	b	b	-
+chr1	165184	165216	b	b	-
+chr1	165184	165216	b	b	-
+chr1	165184	165216	b	b	-
+chr1	165184	165216	b	b	-
+chr1	165184	165216	b	b	-
+chr1	165184	165216	b	b	-
+chr1	165217	165249	a	a	+
+chr1	165185	165217	b	b	-
+chr1	165219	165251	a	a	+
+chr1	165219	165251	a	a	+
+chr1	165219	165251	a	a	+
+chr1	165219	165251	a	a	+
+chr1	165219	165251	a	a	+
+chr1	165219	165251	a	a	+
+chr1	165187	165219	b	b	-
+chr1	165187	165219	b	b	-
+chr1	165187	165219	b	b	-
+chr1	165220	165252	a	a	+
+chr1	165188	165220	b	b	-
+chr1	165188	165220	b	b	-
+chr1	165188	165220	b	b	-
+chr1	165188	165220	b	b	-
+chr1	165188	165220	b	b	-
+chr1	165188	165220	b	b	-
+chr1	165188	165220	b	b	-
+chr1	165188	165220	b	b	-
+chr1	165189	165221	b	b	-
+chr1	165189	165221	b	b	-
+chr1	165189	165221	b	b	-
+chr1	165189	165221	b	b	-
+chr1	165222	165254	a	a	+
+chr1	165223	165255	a	a	+
+chr1	165223	165255	a	a	+
+chr1	165223	165255	a	a	+
+chr1	165194	165226	b	b	-
+chr1	165229	165261	a	a	+
+chr1	165197	165229	b	b	-
+chr1	165199	165231	b	b	-
+chr1	165200	165232	b	b	-
+chr1	165200	165232	b	b	-
+chr1	165200	165232	b	b	-
+chr1	165200	165232	b	b	-
+chr1	165200	165232	b	b	-
+chr1	165200	165232	b	b	-
+chr1	165200	165232	b	b	-
+chr1	165200	165232	b	b	-
+chr1	165200	165232	b	b	-
+chr1	165200	165232	b	b	-
+chr1	165200	165232	b	b	-
+chr1	165200	165232	b	b	-
+chr1	165201	165233	b	b	-
+chr1	165201	165233	b	b	-
+chr1	165201	165233	b	b	-
+chr1	165202	165234	b	b	-
+chr1	165235	165267	a	a	+
+chr1	165235	165267	a	a	+
+chr1	165204	165236	b	b	-
+chr1	165239	165271	a	a	+
+chr1	165213	165245	b	b	-
+chr1	165213	165245	b	b	-
+chr1	165213	165245	b	b	-
+chr1	165214	165246	b	b	-
+chr1	165214	165246	b	b	-
+chr1	165249	165281	a	a	+
+chr1	165251	165283	a	a	+
+chr1	165220	165252	b	b	-
+chr1	165253	165285	a	a	+
+chr1	165253	165285	a	a	+
+chr1	165226	165258	b	b	-
+chr1	165227	165259	b	b	-
+chr1	165227	165259	b	b	-
+chr1	165227	165259	b	b	-
+chr1	165264	165296	a	a	+
+chr1	165264	165296	a	a	+
+chr1	165232	165264	b	b	-
+chr1	165266	165298	a	a	+
+chr1	165270	165302	a	a	+
+chr1	165271	165303	a	a	+
+chr1	165272	165304	a	a	+
+chr1	165272	165304	a	a	+
+chr1	165243	165275	b	b	-
+chr1	165280	165312	a	a	+
+chr1	165283	165315	a	a	+
+chr1	165255	165287	b	b	-
+chr1	165259	165291	b	b	-
+chr1	165260	165292	b	b	-
+chr1	165260	165292	b	b	-
+chr1	165260	165292	b	b	-
+chr1	165260	165292	b	b	-
+chr1	165260	165292	b	b	-
+chr1	165260	165292	b	b	-
+chr1	165260	165292	b	b	-
+chr1	165297	165329	a	a	+
+chr1	165297	165329	a	a	+
+chr1	165304	165336	a	a	+
+chr1	165272	165304	b	b	-
+chr1	165276	165308	b	b	-
+chr1	165276	165308	b	b	-
+chr1	165309	165341	a	a	+
+chr1	165281	165313	b	b	-
+chr1	165316	165348	a	a	+
+chr1	165322	165354	a	a	+
+chr1	165323	165355	a	a	+
+chr1	165323	165355	a	a	+
+chr1	165294	165326	b	b	-
+chr1	165300	165332	b	b	-
+chr1	165300	165332	b	b	-
+chr1	165300	165332	b	b	-
+chr1	165300	165332	b	b	-
+chr1	165300	165332	b	b	-
+chr1	165301	165333	b	b	-
+chr1	165301	165333	b	b	-
+chr1	165301	165333	b	b	-
+chr1	165335	165367	a	a	+
+chr1	165304	165336	b	b	-
+chr1	165306	165338	b	b	-
+chr1	165306	165338	b	b	-
+chr1	165307	165339	b	b	-
+chr1	165307	165339	b	b	-
+chr1	165342	165374	a	a	+
+chr1	165343	165375	a	a	+
+chr1	165343	165375	a	a	+
+chr1	165344	165376	a	a	+
+chr1	165344	165376	a	a	+
+chr1	165344	165376	a	a	+
+chr1	165344	165376	a	a	+
+chr1	165344	165376	a	a	+
+chr1	165344	165376	a	a	+
+chr1	165344	165376	a	a	+
+chr1	165344	165376	a	a	+
+chr1	165344	165376	a	a	+
+chr1	165312	165344	b	b	-
+chr1	165312	165344	b	b	-
+chr1	165312	165344	b	b	-
+chr1	165345	165377	a	a	+
+chr1	165345	165377	a	a	+
+chr1	165313	165345	b	b	-
+chr1	165313	165345	b	b	-
+chr1	165313	165345	b	b	-
+chr1	165346	165378	a	a	+
+chr1	165314	165346	b	b	-
+chr1	165319	165351	b	b	-
+chr1	165321	165353	b	b	-
+chr1	165355	165387	a	a	+
+chr1	165323	165355	b	b	-
+chr1	165323	165355	b	b	-
+chr1	165356	165388	a	a	+
+chr1	165358	165390	a	a	+
+chr1	165361	165393	a	a	+
+chr1	165330	165362	b	b	-
+chr1	165334	165366	b	b	-
+chr1	165334	165366	b	b	-
+chr1	165334	165366	b	b	-
+chr1	165367	165399	a	a	+
+chr1	165336	165368	b	b	-
+chr1	165369	165401	a	a	+
+chr1	165370	165402	a	a	+
+chr1	165339	165371	b	b	-
+chr1	165339	165371	b	b	-
+chr1	165339	165371	b	b	-
+chr1	165372	165404	a	a	+
+chr1	165372	165404	a	a	+
+chr1	165372	165404	a	a	+
+chr1	165372	165404	a	a	+
+chr1	165373	165405	a	a	+
+chr1	165373	165405	a	a	+
+chr1	165373	165405	a	a	+
+chr1	165373	165405	a	a	+
+chr1	165373	165405	a	a	+
+chr1	165373	165405	a	a	+
+chr1	165373	165405	a	a	+
+chr1	165373	165405	a	a	+
+chr1	165373	165405	a	a	+
+chr1	165373	165405	a	a	+
+chr1	165341	165373	b	b	-
+chr1	165341	165373	b	b	-
+chr1	165341	165373	b	b	-
+chr1	165341	165373	b	b	-
+chr1	165341	165373	b	b	-
+chr1	165343	165375	b	b	-
+chr1	165376	165408	a	a	+
+chr1	165378	165410	a	a	+
+chr1	165379	165411	a	a	+
+chr1	165379	165411	a	a	+
+chr1	165379	165411	a	a	+
+chr1	165347	165379	b	b	-
+chr1	165380	165412	a	a	+
+chr1	165380	165412	a	a	+
+chr1	165380	165412	a	a	+
+chr1	165380	165412	a	a	+
+chr1	165380	165412	a	a	+
+chr1	165380	165412	a	a	+
+chr1	165348	165380	b	b	-
+chr1	165349	165381	b	b	-
+chr1	165382	165414	a	a	+
+chr1	165382	165414	a	a	+
+chr1	165383	165415	a	a	+
+chr1	165352	165384	b	b	-
+chr1	165352	165384	b	b	-
+chr1	165352	165384	b	b	-
+chr1	165352	165384	b	b	-
+chr1	165352	165384	b	b	-
+chr1	165352	165384	b	b	-
+chr1	165352	165384	b	b	-
+chr1	165352	165384	b	b	-
+chr1	165352	165384	b	b	-
+chr1	165352	165384	b	b	-
+chr1	165352	165384	b	b	-
+chr1	165352	165384	b	b	-
+chr1	165352	165384	b	b	-
+chr1	165352	165384	b	b	-
+chr1	165385	165417	a	a	+
+chr1	165385	165417	a	a	+
+chr1	165385	165417	a	a	+
+chr1	165385	165417	a	a	+
+chr1	165385	165417	a	a	+
+chr1	165385	165417	a	a	+
+chr1	165385	165417	a	a	+
+chr1	165385	165417	a	a	+
+chr1	165385	165417	a	a	+
+chr1	165385	165417	a	a	+
+chr1	165385	165417	a	a	+
+chr1	165385	165417	a	a	+
+chr1	165385	165417	a	a	+
+chr1	165385	165417	a	a	+
+chr1	165385	165417	a	a	+
+chr1	165385	165417	a	a	+
+chr1	165385	165417	a	a	+
+chr1	165385	165417	a	a	+
+chr1	165385	165417	a	a	+
+chr1	165353	165385	b	b	-
+chr1	165353	165385	b	b	-
+chr1	165386	165418	a	a	+
+chr1	165386	165418	a	a	+
+chr1	165386	165418	a	a	+
+chr1	165386	165418	a	a	+
+chr1	165386	165418	a	a	+
+chr1	165386	165418	a	a	+
+chr1	165386	165418	a	a	+
+chr1	165386	165418	a	a	+
+chr1	165386	165418	a	a	+
+chr1	165386	165418	a	a	+
+chr1	165386	165418	a	a	+
+chr1	165386	165418	a	a	+
+chr1	165387	165419	a	a	+
+chr1	165387	165419	a	a	+
+chr1	165387	165419	a	a	+
+chr1	165387	165419	a	a	+
+chr1	165387	165419	a	a	+
+chr1	165387	165419	a	a	+
+chr1	165387	165419	a	a	+
+chr1	165387	165419	a	a	+
+chr1	165387	165419	a	a	+
+chr1	165387	165419	a	a	+
+chr1	165387	165419	a	a	+
+chr1	165387	165419	a	a	+
+chr1	165355	165387	b	b	-
+chr1	165355	165387	b	b	-
+chr1	165355	165387	b	b	-
+chr1	165355	165387	b	b	-
+chr1	165355	165387	b	b	-
+chr1	165355	165387	b	b	-
+chr1	165355	165387	b	b	-
+chr1	165355	165387	b	b	-
+chr1	165355	165387	b	b	-
+chr1	165355	165387	b	b	-
+chr1	165355	165387	b	b	-
+chr1	165355	165387	b	b	-
+chr1	165355	165387	b	b	-
+chr1	165388	165420	a	a	+
+chr1	165388	165420	a	a	+
+chr1	165388	165420	a	a	+
+chr1	165388	165420	a	a	+
+chr1	165357	165389	b	b	-
+chr1	165358	165390	b	b	-
+chr1	165358	165390	b	b	-
+chr1	165358	165390	b	b	-
+chr1	165391	165423	a	a	+
+chr1	165391	165423	a	a	+
+chr1	165359	165391	b	b	-
+chr1	165359	165391	b	b	-
+chr1	165392	165424	a	a	+
+chr1	165360	165392	b	b	-
+chr1	165360	165392	b	b	-
+chr1	165360	165392	b	b	-
+chr1	165360	165392	b	b	-
+chr1	165360	165392	b	b	-
+chr1	165360	165392	b	b	-
+chr1	165360	165392	b	b	-
+chr1	165361	165393	b	b	-
+chr1	165361	165393	b	b	-
+chr1	165361	165393	b	b	-
+chr1	165394	165426	a	a	+
+chr1	165394	165426	a	a	+
+chr1	165394	165426	a	a	+
+chr1	165394	165426	a	a	+
+chr1	165394	165426	a	a	+
+chr1	165394	165426	a	a	+
+chr1	165394	165426	a	a	+
+chr1	165394	165426	a	a	+
+chr1	165394	165426	a	a	+
+chr1	165394	165426	a	a	+
+chr1	165395	165427	a	a	+
+chr1	165395	165427	a	a	+
+chr1	165395	165427	a	a	+
+chr1	165395	165427	a	a	+
+chr1	165395	165427	a	a	+
+chr1	165395	165427	a	a	+
+chr1	165395	165427	a	a	+
+chr1	165395	165427	a	a	+
+chr1	165395	165427	a	a	+
+chr1	165395	165427	a	a	+
+chr1	165395	165427	a	a	+
+chr1	165363	165395	b	b	-
+chr1	165363	165395	b	b	-
+chr1	165363	165395	b	b	-
+chr1	165363	165395	b	b	-
+chr1	165363	165395	b	b	-
+chr1	165364	165396	b	b	-
+chr1	165364	165396	b	b	-
+chr1	165364	165396	b	b	-
+chr1	165364	165396	b	b	-
+chr1	165364	165396	b	b	-
+chr1	165364	165396	b	b	-
+chr1	165364	165396	b	b	-
+chr1	165364	165396	b	b	-
+chr1	165364	165396	b	b	-
+chr1	165364	165396	b	b	-
+chr1	165364	165396	b	b	-
+chr1	165364	165396	b	b	-
+chr1	165364	165396	b	b	-
+chr1	165364	165396	b	b	-
+chr1	165364	165396	b	b	-
+chr1	165364	165396	b	b	-
+chr1	165397	165429	a	a	+
+chr1	165397	165429	a	a	+
+chr1	165397	165429	a	a	+
+chr1	165397	165429	a	a	+
+chr1	165397	165429	a	a	+
+chr1	165397	165429	a	a	+
+chr1	165397	165429	a	a	+
+chr1	165397	165429	a	a	+
+chr1	165397	165429	a	a	+
+chr1	165397	165429	a	a	+
+chr1	165397	165429	a	a	+
+chr1	165365	165397	b	b	-
+chr1	165365	165397	b	b	-
+chr1	165365	165397	b	b	-
+chr1	165365	165397	b	b	-
+chr1	165365	165397	b	b	-
+chr1	165365	165397	b	b	-
+chr1	165365	165397	b	b	-
+chr1	165365	165397	b	b	-
+chr1	165365	165397	b	b	-
+chr1	165365	165397	b	b	-
+chr1	165365	165397	b	b	-
+chr1	165365	165397	b	b	-
+chr1	165398	165430	a	a	+
+chr1	165366	165398	b	b	-
+chr1	165399	165431	a	a	+
+chr1	165399	165431	a	a	+
+chr1	165399	165431	a	a	+
+chr1	165399	165431	a	a	+
+chr1	165399	165431	a	a	+
+chr1	165399	165431	a	a	+
+chr1	165399	165431	a	a	+
+chr1	165400	165432	a	a	+
+chr1	165400	165432	a	a	+
+chr1	165400	165432	a	a	+
+chr1	165400	165432	a	a	+
+chr1	165400	165432	a	a	+
+chr1	165400	165432	a	a	+
+chr1	165400	165432	a	a	+
+chr1	165400	165432	a	a	+
+chr1	165400	165432	a	a	+
+chr1	165368	165400	b	b	-
+chr1	165402	165434	a	a	+
+chr1	165402	165434	a	a	+
+chr1	165402	165434	a	a	+
+chr1	165402	165434	a	a	+
+chr1	165402	165434	a	a	+
+chr1	165402	165434	a	a	+
+chr1	165372	165404	b	b	-
+chr1	165372	165404	b	b	-
+chr1	165372	165404	b	b	-
+chr1	165405	165437	a	a	+
+chr1	165373	165405	b	b	-
+chr1	165373	165405	b	b	-
+chr1	165373	165405	b	b	-
+chr1	165373	165405	b	b	-
+chr1	165373	165405	b	b	-
+chr1	165373	165405	b	b	-
+chr1	165373	165405	b	b	-
+chr1	165373	165405	b	b	-
+chr1	165373	165405	b	b	-
+chr1	165373	165405	b	b	-
+chr1	165373	165405	b	b	-
+chr1	165373	165405	b	b	-
+chr1	165373	165405	b	b	-
+chr1	165373	165405	b	b	-
+chr1	165373	165405	b	b	-
+chr1	165373	165405	b	b	-
+chr1	165406	165438	a	a	+
+chr1	165406	165438	a	a	+
+chr1	165406	165438	a	a	+
+chr1	165406	165438	a	a	+
+chr1	165406	165438	a	a	+
+chr1	165406	165438	a	a	+
+chr1	165406	165438	a	a	+
+chr1	165406	165438	a	a	+
+chr1	165406	165438	a	a	+
+chr1	165406	165438	a	a	+
+chr1	165406	165438	a	a	+
+chr1	165406	165438	a	a	+
+chr1	165374	165406	b	b	-
+chr1	165374	165406	b	b	-
+chr1	165374	165406	b	b	-
+chr1	165374	165406	b	b	-
+chr1	165374	165406	b	b	-
+chr1	165407	165439	a	a	+
+chr1	165407	165439	a	a	+
+chr1	165407	165439	a	a	+
+chr1	165407	165439	a	a	+
+chr1	165407	165439	a	a	+
+chr1	165407	165439	a	a	+
+chr1	165407	165439	a	a	+
+chr1	165407	165439	a	a	+
+chr1	165407	165439	a	a	+
+chr1	165407	165439	a	a	+
+chr1	165407	165439	a	a	+
+chr1	165407	165439	a	a	+
+chr1	165407	165439	a	a	+
+chr1	165407	165439	a	a	+
+chr1	165407	165439	a	a	+
+chr1	165407	165439	a	a	+
+chr1	165407	165439	a	a	+
+chr1	165407	165439	a	a	+
+chr1	165407	165439	a	a	+
+chr1	165377	165409	b	b	-
+chr1	165377	165409	b	b	-
+chr1	165410	165442	a	a	+
+chr1	165410	165442	a	a	+
+chr1	165410	165442	a	a	+
+chr1	165378	165410	b	b	-
+chr1	165378	165410	b	b	-
+chr1	165379	165411	b	b	-
+chr1	165379	165411	b	b	-
+chr1	165379	165411	b	b	-
+chr1	165412	165444	a	a	+
+chr1	165381	165413	b	b	-
+chr1	165381	165413	b	b	-
+chr1	165381	165413	b	b	-
+chr1	165381	165413	b	b	-
+chr1	165381	165413	b	b	-
+chr1	165381	165413	b	b	-
+chr1	165381	165413	b	b	-
+chr1	165381	165413	b	b	-
+chr1	165381	165413	b	b	-
+chr1	165381	165413	b	b	-
+chr1	165381	165413	b	b	-
+chr1	165381	165413	b	b	-
+chr1	165381	165413	b	b	-
+chr1	165381	165413	b	b	-
+chr1	165381	165413	b	b	-
+chr1	165381	165413	b	b	-
+chr1	165381	165413	b	b	-
+chr1	165381	165413	b	b	-
+chr1	165382	165414	b	b	-
+chr1	165382	165414	b	b	-
+chr1	165382	165414	b	b	-
+chr1	165382	165414	b	b	-
+chr1	165382	165414	b	b	-
+chr1	165382	165414	b	b	-
+chr1	165382	165414	b	b	-
+chr1	165382	165414	b	b	-
+chr1	165382	165414	b	b	-
+chr1	165383	165415	b	b	-
+chr1	165416	165448	a	a	+
+chr1	165416	165448	a	a	+
+chr1	165417	165449	a	a	+
+chr1	165417	165449	a	a	+
+chr1	165418	165450	a	a	+
+chr1	165418	165450	a	a	+
+chr1	165386	165418	b	b	-
+chr1	165420	165452	a	a	+
+chr1	165421	165453	a	a	+
+chr1	165421	165453	a	a	+
+chr1	165421	165453	a	a	+
+chr1	165421	165453	a	a	+
+chr1	165421	165453	a	a	+
+chr1	165422	165454	a	a	+
+chr1	165422	165454	a	a	+
+chr1	165422	165454	a	a	+
+chr1	165422	165454	a	a	+
+chr1	165422	165454	a	a	+
+chr1	165422	165454	a	a	+
+chr1	165422	165454	a	a	+
+chr1	165422	165454	a	a	+
+chr1	165422	165454	a	a	+
+chr1	165422	165454	a	a	+
+chr1	165422	165454	a	a	+
+chr1	165422	165454	a	a	+
+chr1	165422	165454	a	a	+
+chr1	165422	165454	a	a	+
+chr1	165422	165454	a	a	+
+chr1	165422	165454	a	a	+
+chr1	165422	165454	a	a	+
+chr1	165422	165454	a	a	+
+chr1	165422	165454	a	a	+
+chr1	165422	165454	a	a	+
+chr1	165422	165454	a	a	+
+chr1	165422	165454	a	a	+
+chr1	165422	165454	a	a	+
+chr1	165423	165455	a	a	+
+chr1	165423	165455	a	a	+
+chr1	165391	165423	b	b	-
+chr1	165391	165423	b	b	-
+chr1	165425	165457	a	a	+
+chr1	165396	165428	b	b	-
+chr1	165396	165428	b	b	-
+chr1	165397	165429	b	b	-
+chr1	165397	165429	b	b	-
+chr1	165397	165429	b	b	-
+chr1	165397	165429	b	b	-
+chr1	165397	165429	b	b	-
+chr1	165397	165429	b	b	-
+chr1	165397	165429	b	b	-
+chr1	165397	165429	b	b	-
+chr1	165397	165429	b	b	-
+chr1	165398	165430	b	b	-
+chr1	165398	165430	b	b	-
+chr1	165398	165430	b	b	-
+chr1	165399	165431	b	b	-
+chr1	165399	165431	b	b	-
+chr1	165433	165465	a	a	+
+chr1	165433	165465	a	a	+
+chr1	165401	165433	b	b	-
+chr1	165401	165433	b	b	-
+chr1	165401	165433	b	b	-
+chr1	165401	165433	b	b	-
+chr1	165401	165433	b	b	-
+chr1	165401	165433	b	b	-
+chr1	165401	165433	b	b	-
+chr1	165401	165433	b	b	-
+chr1	165401	165433	b	b	-
+chr1	165402	165434	b	b	-
+chr1	165402	165434	b	b	-
+chr1	165404	165436	b	b	-
+chr1	165404	165436	b	b	-
+chr1	165404	165436	b	b	-
+chr1	165404	165436	b	b	-
+chr1	165405	165437	b	b	-
+chr1	165405	165437	b	b	-
+chr1	165405	165437	b	b	-
+chr1	165410	165442	b	b	-
+chr1	165445	165477	a	a	+
+chr1	165445	165477	a	a	+
+chr1	165445	165477	a	a	+
+chr1	165413	165445	b	b	-
+chr1	165413	165445	b	b	-
+chr1	165413	165445	b	b	-
+chr1	165413	165445	b	b	-
+chr1	165413	165445	b	b	-
+chr1	165413	165445	b	b	-
+chr1	165413	165445	b	b	-
+chr1	165413	165445	b	b	-
+chr1	165446	165478	a	a	+
+chr1	165446	165478	a	a	+
+chr1	165446	165478	a	a	+
+chr1	165446	165478	a	a	+
+chr1	165446	165478	a	a	+
+chr1	165446	165478	a	a	+
+chr1	165446	165478	a	a	+
+chr1	165446	165478	a	a	+
+chr1	165446	165478	a	a	+
+chr1	165446	165478	a	a	+
+chr1	165446	165478	a	a	+
+chr1	165415	165447	b	b	-
+chr1	165415	165447	b	b	-
+chr1	165417	165449	b	b	-
+chr1	165418	165450	b	b	-
+chr1	165419	165451	b	b	-
+chr1	165419	165451	b	b	-
+chr1	165419	165451	b	b	-
+chr1	165452	165484	a	a	+
+chr1	165452	165484	a	a	+
+chr1	165420	165452	b	b	-
+chr1	165458	165490	a	a	+
+chr1	165426	165458	b	b	-
+chr1	165459	165491	a	a	+
+chr1	165459	165491	a	a	+
+chr1	165459	165491	a	a	+
+chr1	165459	165491	a	a	+
+chr1	165459	165491	a	a	+
+chr1	165427	165459	b	b	-
+chr1	165427	165459	b	b	-
+chr1	165460	165492	a	a	+
+chr1	165428	165460	b	b	-
+chr1	165461	165493	a	a	+
+chr1	165461	165493	a	a	+
+chr1	165461	165493	a	a	+
+chr1	165463	165495	a	a	+
+chr1	165433	165465	b	b	-
+chr1	165468	165500	a	a	+
+chr1	165470	165502	a	a	+
+chr1	165470	165502	a	a	+
+chr1	165438	165470	b	b	-
+chr1	165472	165504	a	a	+
+chr1	165472	165504	a	a	+
+chr1	165441	165473	b	b	-
+chr1	165480	165512	a	a	+
+chr1	165451	165483	b	b	-
+chr1	165453	165485	b	b	-
+chr1	165487	165519	a	a	+
+chr1	165488	165520	a	a	+
+chr1	165488	165520	a	a	+
+chr1	165488	165520	a	a	+
+chr1	165493	165525	a	a	+
+chr1	165493	165525	a	a	+
+chr1	165493	165525	a	a	+
+chr1	165493	165525	a	a	+
+chr1	165493	165525	a	a	+
+chr1	165493	165525	a	a	+
+chr1	165493	165525	a	a	+
+chr1	165494	165526	a	a	+
+chr1	165494	165526	a	a	+
+chr1	165494	165526	a	a	+
+chr1	165494	165526	a	a	+
+chr1	165462	165494	b	b	-
+chr1	165495	165527	a	a	+
+chr1	165495	165527	a	a	+
+chr1	165497	165529	a	a	+
+chr1	165497	165529	a	a	+
+chr1	165466	165498	b	b	-
+chr1	165466	165498	b	b	-
+chr1	165466	165498	b	b	-
+chr1	165466	165498	b	b	-
+chr1	165466	165498	b	b	-
+chr1	165501	165533	a	a	+
+chr1	165503	165535	a	a	+
+chr1	165471	165503	b	b	-
+chr1	165471	165503	b	b	-
+chr1	165471	165503	b	b	-
+chr1	165471	165503	b	b	-
+chr1	165473	165505	b	b	-
+chr1	165473	165505	b	b	-
+chr1	165506	165538	a	a	+
+chr1	165509	165541	a	a	+
+chr1	165478	165510	b	b	-
+chr1	165478	165510	b	b	-
+chr1	165478	165510	b	b	-
+chr1	165512	165544	a	a	+
+chr1	165512	165544	a	a	+
+chr1	165512	165544	a	a	+
+chr1	165482	165514	b	b	-
+chr1	165482	165514	b	b	-
+chr1	165484	165516	b	b	-
+chr1	165519	165551	a	a	+
+chr1	165519	165551	a	a	+
+chr1	165488	165520	b	b	-
+chr1	165521	165553	a	a	+
+chr1	165489	165521	b	b	-
+chr1	165491	165523	b	b	-
+chr1	165491	165523	b	b	-
+chr1	165491	165523	b	b	-
+chr1	165491	165523	b	b	-
+chr1	165491	165523	b	b	-
+chr1	165491	165523	b	b	-
+chr1	165491	165523	b	b	-
+chr1	165492	165524	b	b	-
+chr1	165527	165559	a	a	+
+chr1	165528	165560	a	a	+
+chr1	165531	165563	a	a	+
+chr1	165500	165532	b	b	-
+chr1	165533	165565	a	a	+
+chr1	165533	165565	a	a	+
+chr1	165533	165565	a	a	+
+chr1	165503	165535	b	b	-
+chr1	165503	165535	b	b	-
+chr1	165536	165568	a	a	+
+chr1	165536	165568	a	a	+
+chr1	165505	165537	b	b	-
+chr1	165539	165571	a	a	+
+chr1	165507	165539	b	b	-
+chr1	165543	165575	a	a	+
+chr1	165544	165576	a	a	+
+chr1	165544	165576	a	a	+
+chr1	165544	165576	a	a	+
+chr1	165546	165578	a	a	+
+chr1	165546	165578	a	a	+
+chr1	165546	165578	a	a	+
+chr1	165546	165578	a	a	+
+chr1	165546	165578	a	a	+
+chr1	165546	165578	a	a	+
+chr1	165517	165549	b	b	-
+chr1	165517	165549	b	b	-
+chr1	165517	165549	b	b	-
+chr1	165517	165549	b	b	-
+chr1	165517	165549	b	b	-
+chr1	165552	165584	a	a	+
+chr1	165553	165585	a	a	+
+chr1	165553	165585	a	a	+
+chr1	165521	165553	b	b	-
+chr1	165555	165587	a	a	+
+chr1	165555	165587	a	a	+
+chr1	165555	165587	a	a	+
+chr1	165555	165587	a	a	+
+chr1	165555	165587	a	a	+
+chr1	165525	165557	b	b	-
+chr1	165525	165557	b	b	-
+chr1	165525	165557	b	b	-
+chr1	165525	165557	b	b	-
+chr1	165528	165560	b	b	-
+chr1	165528	165560	b	b	-
+chr1	165561	165593	a	a	+
+chr1	165561	165593	a	a	+
+chr1	165561	165593	a	a	+
+chr1	165561	165593	a	a	+
+chr1	165561	165593	a	a	+
+chr1	165561	165593	a	a	+
+chr1	165561	165593	a	a	+
+chr1	165563	165595	a	a	+
+chr1	165535	165567	b	b	-
+chr1	165569	165601	a	a	+
+chr1	165543	165575	b	b	-
+chr1	165577	165609	a	a	+
+chr1	165580	165612	a	a	+
+chr1	165550	165582	b	b	-
+chr1	165583	165615	a	a	+
+chr1	165583	165615	a	a	+
+chr1	165583	165615	a	a	+
+chr1	165583	165615	a	a	+
+chr1	165583	165615	a	a	+
+chr1	165583	165615	a	a	+
+chr1	165584	165616	a	a	+
+chr1	165584	165616	a	a	+
+chr1	165584	165616	a	a	+
+chr1	165584	165616	a	a	+
+chr1	165594	165626	a	a	+
+chr1	165597	165629	a	a	+
+chr1	165598	165630	a	a	+
+chr1	165566	165598	b	b	-
+chr1	165566	165598	b	b	-
+chr1	165566	165598	b	b	-
+chr1	165599	165631	a	a	+
+chr1	165599	165631	a	a	+
+chr1	165567	165599	b	b	-
+chr1	165567	165599	b	b	-
+chr1	165569	165601	b	b	-
+chr1	165569	165601	b	b	-
+chr1	165605	165637	a	a	+
+chr1	165573	165605	b	b	-
+chr1	165574	165606	b	b	-
+chr1	165574	165606	b	b	-
+chr1	165607	165639	a	a	+
+chr1	165607	165639	a	a	+
+chr1	165607	165639	a	a	+
+chr1	165607	165639	a	a	+
+chr1	165607	165639	a	a	+
+chr1	165607	165639	a	a	+
+chr1	165608	165640	a	a	+
+chr1	165608	165640	a	a	+
+chr1	165608	165640	a	a	+
+chr1	165608	165640	a	a	+
+chr1	165609	165641	a	a	+
+chr1	165579	165611	b	b	-
+chr1	165580	165612	b	b	-
+chr1	165580	165612	b	b	-
+chr1	165582	165614	b	b	-
+chr1	165582	165614	b	b	-
+chr1	165616	165648	a	a	+
+chr1	165616	165648	a	a	+
+chr1	165616	165648	a	a	+
+chr1	165616	165648	a	a	+
+chr1	165617	165649	a	a	+
+chr1	165617	165649	a	a	+
+chr1	165617	165649	a	a	+
+chr1	165617	165649	a	a	+
+chr1	165617	165649	a	a	+
+chr1	165617	165649	a	a	+
+chr1	165617	165649	a	a	+
+chr1	165620	165652	a	a	+
+chr1	165589	165621	b	b	-
+chr1	165589	165621	b	b	-
+chr1	165592	165624	b	b	-
+chr1	165592	165624	b	b	-
+chr1	165595	165627	b	b	-
+chr1	165602	165634	b	b	-
+chr1	165602	165634	b	b	-
+chr1	165637	165669	a	a	+
+chr1	165637	165669	a	a	+
+chr1	165637	165669	a	a	+
+chr1	165637	165669	a	a	+
+chr1	165640	165672	a	a	+
+chr1	165611	165643	b	b	-
+chr1	165644	165676	a	a	+
+chr1	165647	165679	a	a	+
+chr1	165647	165679	a	a	+
+chr1	165652	165684	a	a	+
+chr1	165652	165684	a	a	+
+chr1	165652	165684	a	a	+
+chr1	165624	165656	b	b	-
+chr1	165624	165656	b	b	-
+chr1	165657	165689	a	a	+
+chr1	165657	165689	a	a	+
+chr1	165625	165657	b	b	-
+chr1	165625	165657	b	b	-
+chr1	165625	165657	b	b	-
+chr1	165625	165657	b	b	-
+chr1	165625	165657	b	b	-
+chr1	165625	165657	b	b	-
+chr1	165625	165657	b	b	-
+chr1	165629	165661	b	b	-
+chr1	165629	165661	b	b	-
+chr1	165629	165661	b	b	-
+chr1	165629	165661	b	b	-
+chr1	165629	165661	b	b	-
+chr1	165629	165661	b	b	-
+chr1	165629	165661	b	b	-
+chr1	165629	165661	b	b	-
+chr1	165662	165694	a	a	+
+chr1	165662	165694	a	a	+
+chr1	165662	165694	a	a	+
+chr1	165662	165694	a	a	+
+chr1	165662	165694	a	a	+
+chr1	165630	165662	b	b	-
+chr1	165630	165662	b	b	-
+chr1	165630	165662	b	b	-
+chr1	165630	165662	b	b	-
+chr1	165663	165695	a	a	+
+chr1	165664	165696	a	a	+
+chr1	165664	165696	a	a	+
+chr1	165664	165696	a	a	+
+chr1	165664	165696	a	a	+
+chr1	165664	165696	a	a	+
+chr1	165664	165696	a	a	+
+chr1	165664	165696	a	a	+
+chr1	165664	165696	a	a	+
+chr1	165667	165699	a	a	+
+chr1	165668	165700	a	a	+
+chr1	165636	165668	b	b	-
+chr1	165669	165701	a	a	+
+chr1	165637	165669	b	b	-
+chr1	165670	165702	a	a	+
+chr1	165671	165703	a	a	+
+chr1	165671	165703	a	a	+
+chr1	165672	165704	a	a	+
+chr1	165672	165704	a	a	+
+chr1	165672	165704	a	a	+
+chr1	165640	165672	b	b	-
+chr1	165673	165705	a	a	+
+chr1	165673	165705	a	a	+
+chr1	165673	165705	a	a	+
+chr1	165673	165705	a	a	+
+chr1	165673	165705	a	a	+
+chr1	165673	165705	a	a	+
+chr1	165673	165705	a	a	+
+chr1	165673	165705	a	a	+
+chr1	165673	165705	a	a	+
+chr1	165673	165705	a	a	+
+chr1	165673	165705	a	a	+
+chr1	165673	165705	a	a	+
+chr1	165641	165673	b	b	-
+chr1	165641	165673	b	b	-
+chr1	165645	165677	b	b	-
+chr1	165645	165677	b	b	-
+chr1	165646	165678	b	b	-
+chr1	165683	165715	a	a	+
+chr1	165683	165715	a	a	+
+chr1	165683	165715	a	a	+
+chr1	165683	165715	a	a	+
+chr1	165651	165683	b	b	-
+chr1	165657	165689	b	b	-
+chr1	165657	165689	b	b	-
+chr1	165657	165689	b	b	-
+chr1	165658	165690	b	b	-
+chr1	165661	165693	b	b	-
+chr1	165662	165694	b	b	-
+chr1	165664	165696	b	b	-
+chr1	165664	165696	b	b	-
+chr1	165664	165696	b	b	-
+chr1	165664	165696	b	b	-
+chr1	165664	165696	b	b	-
+chr1	165664	165696	b	b	-
+chr1	165664	165696	b	b	-
+chr1	165664	165696	b	b	-
+chr1	165664	165696	b	b	-
+chr1	165665	165697	b	b	-
+chr1	165699	165731	a	a	+
+chr1	165699	165731	a	a	+
+chr1	165699	165731	a	a	+
+chr1	165699	165731	a	a	+
+chr1	165699	165731	a	a	+
+chr1	165699	165731	a	a	+
+chr1	165701	165733	a	a	+
+chr1	165671	165703	b	b	-
+chr1	165671	165703	b	b	-
+chr1	165673	165705	b	b	-
+chr1	165673	165705	b	b	-
+chr1	165673	165705	b	b	-
+chr1	165708	165740	a	a	+
+chr1	165676	165708	b	b	-
+chr1	165676	165708	b	b	-
+chr1	165677	165709	b	b	-
+chr1	165710	165742	a	a	+
+chr1	165710	165742	a	a	+
+chr1	165681	165713	b	b	-
+chr1	165716	165748	a	a	+
+chr1	165716	165748	a	a	+
+chr1	165716	165748	a	a	+
+chr1	165716	165748	a	a	+
+chr1	165716	165748	a	a	+
+chr1	165716	165748	a	a	+
+chr1	165716	165748	a	a	+
+chr1	165716	165748	a	a	+
+chr1	165716	165748	a	a	+
+chr1	165716	165748	a	a	+
+chr1	165716	165748	a	a	+
+chr1	165716	165748	a	a	+
+chr1	165716	165748	a	a	+
+chr1	165716	165748	a	a	+
+chr1	165716	165748	a	a	+
+chr1	165716	165748	a	a	+
+chr1	165686	165718	b	b	-
+chr1	165722	165754	a	a	+
+chr1	165722	165754	a	a	+
+chr1	165722	165754	a	a	+
+chr1	165690	165722	b	b	-
+chr1	165690	165722	b	b	-
+chr1	165690	165722	b	b	-
+chr1	165723	165755	a	a	+
+chr1	165692	165724	b	b	-
+chr1	165692	165724	b	b	-
+chr1	165692	165724	b	b	-
+chr1	165692	165724	b	b	-
+chr1	165692	165724	b	b	-
+chr1	165725	165757	a	a	+
+chr1	165725	165757	a	a	+
+chr1	165725	165757	a	a	+
+chr1	165693	165725	b	b	-
+chr1	165694	165726	b	b	-
+chr1	165728	165760	a	a	+
+chr1	165728	165760	a	a	+
+chr1	165728	165760	a	a	+
+chr1	165696	165728	b	b	-
+chr1	165731	165763	a	a	+
+chr1	165699	165731	b	b	-
+chr1	165699	165731	b	b	-
+chr1	165735	165767	a	a	+
+chr1	165737	165769	a	a	+
+chr1	165705	165737	b	b	-
+chr1	165738	165770	a	a	+
+chr1	165738	165770	a	a	+
+chr1	165738	165770	a	a	+
+chr1	165738	165770	a	a	+
+chr1	165742	165774	a	a	+
+chr1	165747	165779	a	a	+
+chr1	165749	165781	a	a	+
+chr1	165749	165781	a	a	+
+chr1	165749	165781	a	a	+
+chr1	165749	165781	a	a	+
+chr1	165717	165749	b	b	-
+chr1	165717	165749	b	b	-
+chr1	165721	165753	b	b	-
+chr1	165722	165754	b	b	-
+chr1	165722	165754	b	b	-
+chr1	165722	165754	b	b	-
+chr1	165722	165754	b	b	-
+chr1	165722	165754	b	b	-
+chr1	165755	165787	a	a	+
+chr1	165724	165756	b	b	-
+chr1	165725	165757	b	b	-
+chr1	165726	165758	b	b	-
+chr1	165726	165758	b	b	-
+chr1	165726	165758	b	b	-
+chr1	165726	165758	b	b	-
+chr1	165726	165758	b	b	-
+chr1	165727	165759	b	b	-
+chr1	165760	165792	a	a	+
+chr1	165763	165795	a	a	+
+chr1	165764	165796	a	a	+
+chr1	165732	165764	b	b	-
+chr1	165732	165764	b	b	-
+chr1	165732	165764	b	b	-
+chr1	165767	165799	a	a	+
+chr1	165735	165767	b	b	-
+chr1	165735	165767	b	b	-
+chr1	165735	165767	b	b	-
+chr1	165771	165803	a	a	+
+chr1	165773	165805	a	a	+
+chr1	165742	165774	b	b	-
+chr1	165775	165807	a	a	+
+chr1	165743	165775	b	b	-
+chr1	165776	165808	a	a	+
+chr1	165744	165776	b	b	-
+chr1	165746	165778	b	b	-
+chr1	165755	165787	b	b	-
+chr1	165757	165789	b	b	-
+chr1	165790	165822	a	a	+
+chr1	165790	165822	a	a	+
+chr1	165790	165822	a	a	+
+chr1	165763	165795	b	b	-
+chr1	165796	165828	a	a	+
+chr1	165764	165796	b	b	-
+chr1	165764	165796	b	b	-
+chr1	165797	165829	a	a	+
+chr1	165765	165797	b	b	-
+chr1	165808	165840	a	a	+
+chr1	165808	165840	a	a	+
+chr1	165776	165808	b	b	-
+chr1	165789	165821	b	b	-
+chr1	165823	165855	a	a	+
+chr1	165793	165825	b	b	-
+chr1	165793	165825	b	b	-
+chr1	165798	165830	b	b	-
+chr1	165802	165834	b	b	-
+chr1	165837	165869	a	a	+
+chr1	165843	165875	a	a	+
+chr1	165843	165875	a	a	+
+chr1	165843	165875	a	a	+
+chr1	165844	165876	a	a	+
+chr1	165844	165876	a	a	+
+chr1	165845	165877	a	a	+
+chr1	165815	165847	b	b	-
+chr1	165815	165847	b	b	-
+chr1	165852	165884	a	a	+
+chr1	165852	165884	a	a	+
+chr1	165820	165852	b	b	-
+chr1	165820	165852	b	b	-
+chr1	165820	165852	b	b	-
+chr1	165821	165853	b	b	-
+chr1	165821	165853	b	b	-
+chr1	165859	165891	a	a	+
+chr1	165827	165859	b	b	-
+chr1	165828	165860	b	b	-
+chr1	165861	165893	a	a	+
+chr1	165861	165893	a	a	+
+chr1	165862	165894	a	a	+
+chr1	165862	165894	a	a	+
+chr1	165862	165894	a	a	+
+chr1	165862	165894	a	a	+
+chr1	165831	165863	b	b	-
+chr1	165831	165863	b	b	-
+chr1	165831	165863	b	b	-
+chr1	165832	165864	b	b	-
+chr1	165835	165867	b	b	-
+chr1	165835	165867	b	b	-
+chr1	165868	165900	a	a	+
+chr1	165836	165868	b	b	-
+chr1	165871	165903	a	a	+
+chr1	165839	165871	b	b	-
+chr1	165872	165904	a	a	+
+chr1	165872	165904	a	a	+
+chr1	165841	165873	b	b	-
+chr1	165841	165873	b	b	-
+chr1	165841	165873	b	b	-
+chr1	165842	165874	b	b	-
+chr1	165875	165907	a	a	+
+chr1	165875	165907	a	a	+
+chr1	165844	165876	b	b	-
+chr1	165844	165876	b	b	-
+chr1	165844	165876	b	b	-
+chr1	165844	165876	b	b	-
+chr1	165844	165876	b	b	-
+chr1	165845	165877	b	b	-
+chr1	165845	165877	b	b	-
+chr1	165845	165877	b	b	-
+chr1	165845	165877	b	b	-
+chr1	165845	165877	b	b	-
+chr1	165845	165877	b	b	-
+chr1	165845	165877	b	b	-
+chr1	165845	165877	b	b	-
+chr1	165845	165877	b	b	-
+chr1	165845	165877	b	b	-
+chr1	165845	165877	b	b	-
+chr1	165845	165877	b	b	-
+chr1	165845	165877	b	b	-
+chr1	165845	165877	b	b	-
+chr1	165845	165877	b	b	-
+chr1	165845	165877	b	b	-
+chr1	165845	165877	b	b	-
+chr1	165878	165910	a	a	+
+chr1	165878	165910	a	a	+
+chr1	165846	165878	b	b	-
+chr1	165879	165911	a	a	+
+chr1	165849	165881	b	b	-
+chr1	165853	165885	b	b	-
+chr1	165854	165886	b	b	-
+chr1	165856	165888	b	b	-
+chr1	165857	165889	b	b	-
+chr1	165858	165890	b	b	-
+chr1	165860	165892	b	b	-
+chr1	165862	165894	b	b	-
+chr1	165866	165898	b	b	-
+chr1	165900	165932	a	a	+
+chr1	165900	165932	a	a	+
+chr1	165900	165932	a	a	+
+chr1	165900	165932	a	a	+
+chr1	165900	165932	a	a	+
+chr1	165870	165902	b	b	-
+chr1	165872	165904	b	b	-
+chr1	165907	165939	a	a	+
+chr1	165907	165939	a	a	+
+chr1	165907	165939	a	a	+
+chr1	165907	165939	a	a	+
+chr1	165907	165939	a	a	+
+chr1	165878	165910	b	b	-
+chr1	165878	165910	b	b	-
+chr1	165912	165944	a	a	+
+chr1	165912	165944	a	a	+
+chr1	165918	165950	a	a	+
+chr1	165886	165918	b	b	-
+chr1	165886	165918	b	b	-
+chr1	165886	165918	b	b	-
+chr1	165887	165919	b	b	-
+chr1	165920	165952	a	a	+
+chr1	165888	165920	b	b	-
+chr1	165923	165955	a	a	+
+chr1	165897	165929	b	b	-
+chr1	165950	165982	a	a	+
+chr1	165956	165988	a	a	+
+chr1	165967	165999	a	a	+
+chr1	165968	166000	a	a	+
+chr1	165969	166001	a	a	+
+chr1	165978	166010	a	a	+
+chr1	165947	165979	b	b	-
+chr1	165980	166012	a	a	+
+chr1	165980	166012	a	a	+
+chr1	165980	166012	a	a	+
+chr1	165968	166000	b	b	-
+chr1	166001	166033	a	a	+
+chr1	166002	166034	a	a	+
+chr1	166002	166034	a	a	+
+chr1	166006	166038	a	a	+
+chr1	166006	166038	a	a	+
+chr1	166007	166039	a	a	+
+chr1	166013	166045	a	a	+
+chr1	165995	166027	b	b	-
+chr1	166028	166060	a	a	+
+chr1	166028	166060	a	a	+
+chr1	165996	166028	b	b	-
+chr1	166034	166066	a	a	+
+chr1	166002	166034	b	b	-
+chr1	166002	166034	b	b	-
+chr1	166035	166067	a	a	+
+chr1	166036	166068	a	a	+
+chr1	166036	166068	a	a	+
+chr1	166004	166036	b	b	-
+chr1	166012	166044	b	b	-
+chr1	166014	166046	b	b	-
+chr1	166024	166056	b	b	-
+chr1	166062	166094	a	a	+
+chr1	166064	166096	a	a	+
+chr1	166034	166066	b	b	-
+chr1	166037	166069	b	b	-
+chr1	166044	166076	b	b	-
+chr1	166080	166112	a	a	+
+chr1	166080	166112	a	a	+
+chr1	166080	166112	a	a	+
+chr1	166080	166112	a	a	+
+chr1	166080	166112	a	a	+
+chr1	166083	166115	a	a	+
+chr1	166084	166116	a	a	+
+chr1	166084	166116	a	a	+
+chr1	166086	166118	a	a	+
+chr1	166087	166119	a	a	+
+chr1	166055	166087	b	b	-
+chr1	166058	166090	b	b	-
+chr1	166058	166090	b	b	-
+chr1	166058	166090	b	b	-
+chr1	166058	166090	b	b	-
+chr1	166058	166090	b	b	-
+chr1	166098	166130	a	a	+
+chr1	166098	166130	a	a	+
+chr1	166098	166130	a	a	+
+chr1	166098	166130	a	a	+
+chr1	166098	166130	a	a	+
+chr1	166098	166130	a	a	+
+chr1	166099	166131	a	a	+
+chr1	166099	166131	a	a	+
+chr1	166099	166131	a	a	+
+chr1	166068	166100	b	b	-
+chr1	166102	166134	a	a	+
+chr1	166103	166135	a	a	+
+chr1	166103	166135	a	a	+
+chr1	166104	166136	a	a	+
+chr1	166114	166146	a	a	+
+chr1	166114	166146	a	a	+
+chr1	166134	166166	a	a	+
+chr1	166134	166166	a	a	+
+chr1	166138	166170	a	a	+
+chr1	166139	166171	a	a	+
+chr1	166142	166174	a	a	+
+chr1	166452	166484	a	a	+
+chr1	166698	166730	a	a	+
+chr1	166982	167014	b	b	-
+chr1	166982	167014	b	b	-
+chr1	167261	167293	a	a	+
+chr1	167286	167318	b	b	-
+chr1	167330	167362	a	a	+
+chr1	167330	167362	a	a	+
+chr1	167330	167362	a	a	+
+chr1	167358	167390	a	a	+
+chr1	167358	167390	a	a	+
+chr1	167411	167443	b	b	-
+chr1	167474	167506	a	a	+
+chr1	167551	167583	b	b	-
+chr1	168154	168186	a	a	+
+chr1	168128	168160	b	b	-
+chr1	168153	168185	b	b	-
+chr1	168294	168326	a	a	+
+chr1	168278	168310	b	b	-
+chr1	168595	168627	b	b	-
+chr1	168751	168783	b	b	-
+chr1	168752	168784	b	b	-
+chr1	168752	168784	b	b	-
+chr1	168793	168825	a	a	+
+chr1	168762	168794	b	b	-
+chr1	168806	168838	a	a	+
+chr1	168809	168841	a	a	+
+chr1	168809	168841	a	a	+
+chr1	168810	168842	a	a	+
+chr1	168858	168890	a	a	+
+chr1	168896	168928	b	b	-
+chr1	168898	168930	b	b	-
+chr1	168938	168970	a	a	+
+chr1	168946	168978	a	a	+
+chr1	168946	168978	a	a	+
+chr1	168946	168978	a	a	+
+chr1	168920	168952	b	b	-
+chr1	168926	168958	b	b	-
+chr1	168926	168958	b	b	-
+chr1	168929	168961	b	b	-
+chr1	168929	168961	b	b	-
+chr1	168929	168961	b	b	-
+chr1	168962	168994	a	a	+
+chr1	168962	168994	a	a	+
+chr1	168963	168995	a	a	+
+chr1	168963	168995	a	a	+
+chr1	168963	168995	a	a	+
+chr1	168964	168996	a	a	+
+chr1	168964	168996	a	a	+
+chr1	168966	168998	a	a	+
+chr1	168934	168966	b	b	-
+chr1	168934	168966	b	b	-
+chr1	168934	168966	b	b	-
+chr1	168967	168999	a	a	+
+chr1	168967	168999	a	a	+
+chr1	168967	168999	a	a	+
+chr1	168935	168967	b	b	-
+chr1	168968	169000	a	a	+
+chr1	168936	168968	b	b	-
+chr1	168936	168968	b	b	-
+chr1	168969	169001	a	a	+
+chr1	168969	169001	a	a	+
+chr1	168970	169002	a	a	+
+chr1	168970	169002	a	a	+
+chr1	168971	169003	a	a	+
+chr1	168971	169003	a	a	+
+chr1	168973	169005	a	a	+
+chr1	168973	169005	a	a	+
+chr1	168973	169005	a	a	+
+chr1	168973	169005	a	a	+
+chr1	168941	168973	b	b	-
+chr1	168941	168973	b	b	-
+chr1	168941	168973	b	b	-
+chr1	168941	168973	b	b	-
+chr1	168974	169006	a	a	+
+chr1	168974	169006	a	a	+
+chr1	168974	169006	a	a	+
+chr1	168974	169006	a	a	+
+chr1	168974	169006	a	a	+
+chr1	168975	169007	a	a	+
+chr1	168943	168975	b	b	-
+chr1	168944	168976	b	b	-
+chr1	168944	168976	b	b	-
+chr1	168944	168976	b	b	-
+chr1	168945	168977	b	b	-
+chr1	168981	169013	a	a	+
+chr1	168981	169013	a	a	+
+chr1	168982	169014	a	a	+
+chr1	168950	168982	b	b	-
+chr1	168950	168982	b	b	-
+chr1	168950	168982	b	b	-
+chr1	168950	168982	b	b	-
+chr1	168950	168982	b	b	-
+chr1	168950	168982	b	b	-
+chr1	168983	169015	a	a	+
+chr1	168951	168983	b	b	-
+chr1	168951	168983	b	b	-
+chr1	168951	168983	b	b	-
+chr1	168951	168983	b	b	-
+chr1	168984	169016	a	a	+
+chr1	168953	168985	b	b	-
+chr1	168953	168985	b	b	-
+chr1	168953	168985	b	b	-
+chr1	168988	169020	a	a	+
+chr1	168992	169024	a	a	+
+chr1	168994	169026	a	a	+
+chr1	168965	168997	b	b	-
+chr1	168969	169001	b	b	-
+chr1	168975	169007	b	b	-
+chr1	168975	169007	b	b	-
+chr1	168975	169007	b	b	-
+chr1	168975	169007	b	b	-
+chr1	169025	169057	a	a	+
+chr1	169263	169295	a	a	+
+chr1	169379	169411	b	b	-
+chr1	169381	169413	b	b	-
+chr1	169415	169447	a	a	+
+chr1	169388	169420	b	b	-
+chr1	169388	169420	b	b	-
+chr1	169435	169467	a	a	+
+chr1	169591	169623	a	a	+
+chr1	169569	169601	b	b	-
+chr1	169584	169616	b	b	-
+chr1	169584	169616	b	b	-
+chr1	169683	169715	b	b	-
+chr1	169779	169811	a	a	+
+chr1	169779	169811	a	a	+
+chr1	169872	169904	b	b	-
+chr1	169882	169914	b	b	-
+chr1	169912	169944	b	b	-
+chr1	170121	170153	b	b	-
+chr1	170321	170353	a	a	+
+chr1	170611	170643	b	b	-
+chr1	170659	170691	b	b	-
+chr1	170681	170713	b	b	-
+chr1	170830	170862	a	a	+
+chr1	170833	170865	b	b	-
+chr1	170862	170894	b	b	-
+chr1	170927	170959	b	b	-
+chr1	171015	171047	a	a	+
+chr1	171168	171200	a	a	+
+chr1	171235	171267	a	a	+
+chr1	171235	171267	a	a	+
+chr1	171239	171271	a	a	+
+chr1	171342	171374	b	b	-
+chr1	171442	171474	b	b	-
+chr1	171515	171547	a	a	+
+chr1	171524	171556	a	a	+
+chr1	171526	171558	a	a	+
+chr1	171530	171562	a	a	+
+chr1	171606	171638	b	b	-
+chr1	171611	171643	b	b	-
+chr1	171665	171697	a	a	+
+chr1	171633	171665	b	b	-
+chr1	171635	171667	b	b	-
+chr1	171637	171669	b	b	-
+chr1	171670	171702	a	a	+
+chr1	171670	171702	a	a	+
+chr1	171640	171672	b	b	-
+chr1	171640	171672	b	b	-
+chr1	171646	171678	b	b	-
+chr1	171682	171714	a	a	+
+chr1	171682	171714	a	a	+
+chr1	171683	171715	a	a	+
+chr1	171684	171716	a	a	+
+chr1	171684	171716	a	a	+
+chr1	171684	171716	a	a	+
+chr1	171685	171717	a	a	+
+chr1	171685	171717	a	a	+
+chr1	171686	171718	a	a	+
+chr1	171686	171718	a	a	+
+chr1	171663	171695	b	b	-
+chr1	171663	171695	b	b	-
+chr1	171664	171696	b	b	-
+chr1	171665	171697	b	b	-
+chr1	171671	171703	b	b	-
+chr1	171671	171703	b	b	-
+chr1	171671	171703	b	b	-
+chr1	171671	171703	b	b	-
+chr1	171671	171703	b	b	-
+chr1	171672	171704	b	b	-
+chr1	171705	171737	a	a	+
+chr1	171943	171975	a	a	+
+chr1	172279	172311	b	b	-
+chr1	172426	172458	b	b	-
+chr1	172448	172480	b	b	-
+chr1	172494	172526	a	a	+
+chr1	172811	172843	b	b	-
+chr1	172823	172855	b	b	-
+chr1	172961	172993	b	b	-
+chr1	172961	172993	b	b	-
+chr1	172961	172993	b	b	-
+chr1	173235	173267	a	a	+
+chr1	173410	173442	b	b	-
+chr1	174473	174505	a	a	+
+chr1	174674	174706	b	b	-
+chr1	174727	174759	b	b	-
+chr1	174768	174800	a	a	+
+chr1	174776	174808	a	a	+
+chr1	174755	174787	b	b	-
+chr1	174815	174847	a	a	+
+chr1	174935	174967	a	a	+
+chr1	174945	174977	a	a	+
+chr1	174921	174953	b	b	-
+chr1	175031	175063	b	b	-
+chr1	175046	175078	b	b	-
+chr1	175083	175115	a	a	+
+chr1	175054	175086	b	b	-
+chr1	175054	175086	b	b	-
+chr1	175060	175092	b	b	-
+chr1	175061	175093	b	b	-
+chr1	175094	175126	a	a	+
+chr1	175094	175126	a	a	+
+chr1	175062	175094	b	b	-
+chr1	175096	175128	a	a	+
+chr1	175065	175097	b	b	-
+chr1	175067	175099	b	b	-
+chr1	175101	175133	a	a	+
+chr1	175102	175134	a	a	+
+chr1	175102	175134	a	a	+
+chr1	175102	175134	a	a	+
+chr1	175102	175134	a	a	+
+chr1	175071	175103	b	b	-
+chr1	175104	175136	a	a	+
+chr1	175105	175137	a	a	+
+chr1	175105	175137	a	a	+
+chr1	175107	175139	a	a	+
+chr1	175107	175139	a	a	+
+chr1	175077	175109	b	b	-
+chr1	175110	175142	a	a	+
+chr1	175115	175147	a	a	+
+chr1	175115	175147	a	a	+
+chr1	175116	175148	a	a	+
+chr1	175116	175148	a	a	+
+chr1	175085	175117	b	b	-
+chr1	175088	175120	b	b	-
+chr1	175091	175123	b	b	-
+chr1	175091	175123	b	b	-
+chr1	175091	175123	b	b	-
+chr1	175091	175123	b	b	-
+chr1	175091	175123	b	b	-
+chr1	175091	175123	b	b	-
+chr1	175124	175156	a	a	+
+chr1	175094	175126	b	b	-
+chr1	175094	175126	b	b	-
+chr1	175095	175127	b	b	-
+chr1	175128	175160	a	a	+
+chr1	175097	175129	b	b	-
+chr1	175097	175129	b	b	-
+chr1	175097	175129	b	b	-
+chr1	175097	175129	b	b	-
+chr1	175097	175129	b	b	-
+chr1	175097	175129	b	b	-
+chr1	175130	175162	a	a	+
+chr1	175098	175130	b	b	-
+chr1	175100	175132	b	b	-
+chr1	175100	175132	b	b	-
+chr1	175100	175132	b	b	-
+chr1	175100	175132	b	b	-
+chr1	175101	175133	b	b	-
+chr1	175102	175134	b	b	-
+chr1	175102	175134	b	b	-
+chr1	175136	175168	a	a	+
+chr1	175136	175168	a	a	+
+chr1	175136	175168	a	a	+
+chr1	175136	175168	a	a	+
+chr1	175136	175168	a	a	+
+chr1	175136	175168	a	a	+
+chr1	175107	175139	b	b	-
+chr1	175107	175139	b	b	-
+chr1	175128	175160	b	b	-
+chr1	175172	175204	a	a	+
+chr1	175254	175286	b	b	-
+chr1	175292	175324	a	a	+
+chr1	175309	175341	a	a	+
+chr1	175311	175343	a	a	+
+chr1	175320	175352	a	a	+
+chr1	175320	175352	a	a	+
+chr1	175320	175352	a	a	+
+chr1	175326	175358	a	a	+
+chr1	175327	175359	a	a	+
+chr1	175295	175327	b	b	-
+chr1	175295	175327	b	b	-
+chr1	175328	175360	a	a	+
+chr1	175296	175328	b	b	-
+chr1	175329	175361	a	a	+
+chr1	175302	175334	b	b	-
+chr1	175302	175334	b	b	-
+chr1	175302	175334	b	b	-
+chr1	175302	175334	b	b	-
+chr1	175335	175367	a	a	+
+chr1	175336	175368	a	a	+
+chr1	175336	175368	a	a	+
+chr1	175305	175337	b	b	-
+chr1	175305	175337	b	b	-
+chr1	175307	175339	b	b	-
+chr1	175307	175339	b	b	-
+chr1	175310	175342	b	b	-
+chr1	175347	175379	a	a	+
+chr1	175347	175379	a	a	+
+chr1	175320	175352	b	b	-
+chr1	175320	175352	b	b	-
+chr1	175355	175387	a	a	+
+chr1	175355	175387	a	a	+
+chr1	175355	175387	a	a	+
+chr1	175323	175355	b	b	-
+chr1	175326	175358	b	b	-
+chr1	175328	175360	b	b	-
+chr1	175328	175360	b	b	-
+chr1	175328	175360	b	b	-
+chr1	175329	175361	b	b	-
+chr1	175363	175395	a	a	+
+chr1	175365	175397	a	a	+
+chr1	175335	175367	b	b	-
+chr1	175339	175371	b	b	-
+chr1	175339	175371	b	b	-
+chr1	175339	175371	b	b	-
+chr1	175339	175371	b	b	-
+chr1	175344	175376	b	b	-
+chr1	175379	175411	a	a	+
+chr1	175469	175501	b	b	-
+chr1	175469	175501	b	b	-
+chr1	175479	175511	b	b	-
+chr1	175480	175512	b	b	-
+chr1	175518	175550	a	a	+
+chr1	175493	175525	b	b	-
+chr1	175526	175558	a	a	+
+chr1	175499	175531	b	b	-
+chr1	175502	175534	b	b	-
+chr1	175548	175580	a	a	+
+chr1	175710	175742	a	a	+
+chr1	175681	175713	b	b	-
+chr1	176178	176210	a	a	+
+chr1	176339	176371	a	a	+
+chr1	176331	176363	b	b	-
+chr1	176331	176363	b	b	-
+chr1	176365	176397	a	a	+
+chr1	176371	176403	b	b	-
+chr1	176646	176678	b	b	-
+chr1	176654	176686	b	b	-
+chr1	176655	176687	b	b	-
+chr1	176672	176704	b	b	-
+chr1	176672	176704	b	b	-
+chr1	176672	176704	b	b	-
+chr1	176672	176704	b	b	-
+chr1	176675	176707	b	b	-
+chr1	176675	176707	b	b	-
+chr1	176716	176748	a	a	+
+chr1	176684	176716	b	b	-
+chr1	176685	176717	b	b	-
+chr1	176724	176756	a	a	+
+chr1	176724	176756	a	a	+
+chr1	176725	176757	a	a	+
+chr1	176725	176757	a	a	+
+chr1	176725	176757	a	a	+
+chr1	176693	176725	b	b	-
+chr1	176693	176725	b	b	-
+chr1	176693	176725	b	b	-
+chr1	176693	176725	b	b	-
+chr1	176693	176725	b	b	-
+chr1	176694	176726	b	b	-
+chr1	176694	176726	b	b	-
+chr1	176694	176726	b	b	-
+chr1	176694	176726	b	b	-
+chr1	176696	176728	b	b	-
+chr1	176699	176731	b	b	-
+chr1	176699	176731	b	b	-
+chr1	176699	176731	b	b	-
+chr1	176732	176764	a	a	+
+chr1	176732	176764	a	a	+
+chr1	176732	176764	a	a	+
+chr1	176732	176764	a	a	+
+chr1	176700	176732	b	b	-
+chr1	176735	176767	a	a	+
+chr1	176735	176767	a	a	+
+chr1	176703	176735	b	b	-
+chr1	176703	176735	b	b	-
+chr1	176736	176768	a	a	+
+chr1	176736	176768	a	a	+
+chr1	176704	176736	b	b	-
+chr1	176704	176736	b	b	-
+chr1	176738	176770	a	a	+
+chr1	176738	176770	a	a	+
+chr1	176707	176739	b	b	-
+chr1	176707	176739	b	b	-
+chr1	176740	176772	a	a	+
+chr1	176708	176740	b	b	-
+chr1	176709	176741	b	b	-
+chr1	176709	176741	b	b	-
+chr1	176709	176741	b	b	-
+chr1	176709	176741	b	b	-
+chr1	176709	176741	b	b	-
+chr1	176709	176741	b	b	-
+chr1	176709	176741	b	b	-
+chr1	176709	176741	b	b	-
+chr1	176709	176741	b	b	-
+chr1	176709	176741	b	b	-
+chr1	176709	176741	b	b	-
+chr1	176743	176775	a	a	+
+chr1	176713	176745	b	b	-
+chr1	176746	176778	a	a	+
+chr1	176714	176746	b	b	-
+chr1	176714	176746	b	b	-
+chr1	176747	176779	a	a	+
+chr1	176719	176751	b	b	-
+chr1	176721	176753	b	b	-
+chr1	176721	176753	b	b	-
+chr1	176721	176753	b	b	-
+chr1	176722	176754	b	b	-
+chr1	176756	176788	a	a	+
+chr1	176756	176788	a	a	+
+chr1	176724	176756	b	b	-
+chr1	176724	176756	b	b	-
+chr1	176757	176789	a	a	+
+chr1	176762	176794	a	a	+
+chr1	176762	176794	a	a	+
+chr1	176734	176766	b	b	-
+chr1	176769	176801	a	a	+
+chr1	176739	176771	b	b	-
+chr1	176775	176807	a	a	+
+chr1	176745	176777	b	b	-
+chr1	176780	176812	a	a	+
+chr1	176750	176782	b	b	-
+chr1	176759	176791	b	b	-
+chr1	176805	176837	a	a	+
+chr1	176779	176811	b	b	-
+chr1	176781	176813	b	b	-
+chr1	176782	176814	b	b	-
+chr1	176816	176848	a	a	+
+chr1	176790	176822	b	b	-
+chr1	176791	176823	b	b	-
+chr1	176826	176858	a	a	+
+chr1	176826	176858	a	a	+
+chr1	176804	176836	b	b	-
+chr1	176804	176836	b	b	-
+chr1	176813	176845	b	b	-
+chr1	176813	176845	b	b	-
+chr1	176856	176888	a	a	+
+chr1	176856	176888	a	a	+
+chr1	176856	176888	a	a	+
+chr1	176857	176889	a	a	+
+chr1	176857	176889	a	a	+
+chr1	176872	176904	a	a	+
+chr1	176872	176904	a	a	+
+chr1	176883	176915	a	a	+
+chr1	176889	176921	a	a	+
+chr1	176892	176924	a	a	+
+chr1	176894	176926	a	a	+
+chr1	176894	176926	a	a	+
+chr1	176894	176926	a	a	+
+chr1	176895	176927	a	a	+
+chr1	176895	176927	a	a	+
+chr1	176895	176927	a	a	+
+chr1	176895	176927	a	a	+
+chr1	176907	176939	a	a	+
+chr1	176912	176944	a	a	+
+chr1	176889	176921	b	b	-
+chr1	176925	176957	a	a	+
+chr1	176905	176937	b	b	-
+chr1	176905	176937	b	b	-
+chr1	176944	176976	a	a	+
+chr1	176915	176947	b	b	-
+chr1	176915	176947	b	b	-
+chr1	176916	176948	b	b	-
+chr1	176970	177002	a	a	+
+chr1	176976	177008	a	a	+
+chr1	176976	177008	a	a	+
+chr1	176949	176981	b	b	-
+chr1	176985	177017	a	a	+
+chr1	176988	177020	a	a	+
+chr1	176994	177026	a	a	+
+chr1	176996	177028	a	a	+
+chr1	176997	177029	a	a	+
+chr1	176997	177029	a	a	+
+chr1	177003	177035	a	a	+
+chr1	176972	177004	b	b	-
+chr1	176978	177010	b	b	-
+chr1	177012	177044	a	a	+
+chr1	177017	177049	b	b	-
+chr1	177111	177143	b	b	-
+chr1	177140	177172	b	b	-
+chr1	177155	177187	b	b	-
+chr1	177305	177337	a	a	+
+chr1	177286	177318	b	b	-
+chr1	177339	177371	a	a	+
+chr1	177340	177372	b	b	-
+chr1	177421	177453	a	a	+
+chr1	177567	177599	a	a	+
+chr1	177581	177613	a	a	+
+chr1	177583	177615	a	a	+
+chr1	177590	177622	a	a	+
+chr1	177559	177591	b	b	-
+chr1	177592	177624	a	a	+
+chr1	177601	177633	a	a	+
+chr1	177601	177633	a	a	+
+chr1	177602	177634	a	a	+
+chr1	177572	177604	b	b	-
+chr1	177651	177683	a	a	+
+chr1	177652	177684	a	a	+
+chr1	177701	177733	a	a	+
+chr1	177762	177794	a	a	+
+chr1	177764	177796	a	a	+
+chr1	177821	177853	a	a	+
+chr1	177821	177853	a	a	+
+chr1	177821	177853	a	a	+
+chr1	177806	177838	b	b	-
+chr1	177878	177910	a	a	+
+chr1	177876	177908	b	b	-
+chr1	177905	177937	b	b	-
+chr1	177947	177979	a	a	+
+chr1	178018	178050	b	b	-
+chr1	178018	178050	b	b	-
+chr1	178056	178088	b	b	-
+chr1	178134	178166	a	a	+
+chr1	178251	178283	a	a	+
+chr1	178293	178325	a	a	+
+chr1	178466	178498	b	b	-
+chr1	178554	178586	b	b	-
+chr1	178557	178589	b	b	-
+chr1	178734	178766	a	a	+
+chr1	178734	178766	a	a	+
+chr1	178741	178773	a	a	+
+chr1	178837	178869	b	b	-
+chr1	178877	178909	a	a	+
+chr1	178970	179002	a	a	+
+chr1	179031	179063	b	b	-
+chr1	179055	179087	b	b	-
+chr1	179322	179354	a	a	+
+chr1	179357	179389	a	a	+
+chr1	179358	179390	a	a	+
+chr1	179374	179406	a	a	+
+chr1	179347	179379	b	b	-
+chr1	179396	179428	a	a	+
+chr1	179412	179444	b	b	-
+chr1	179449	179481	a	a	+
+chr1	179478	179510	b	b	-
+chr1	179478	179510	b	b	-
+chr1	179478	179510	b	b	-
+chr1	179557	179589	a	a	+
+chr1	179558	179590	a	a	+
+chr1	179563	179595	a	a	+
+chr1	179620	179652	a	a	+
+chr1	179683	179715	a	a	+
+chr1	179660	179692	b	b	-
+chr1	179694	179726	a	a	+
+chr1	179703	179735	a	a	+
+chr1	179723	179755	a	a	+
+chr1	179732	179764	a	a	+
+chr1	179738	179770	a	a	+
+chr1	179729	179761	b	b	-
+chr1	179850	179882	a	a	+
+chr1	179862	179894	a	a	+
+chr1	179862	179894	a	a	+
+chr1	179836	179868	b	b	-
+chr1	179872	179904	a	a	+
+chr1	179875	179907	a	a	+
+chr1	179875	179907	a	a	+
+chr1	179897	179929	a	a	+
+chr1	179897	179929	a	a	+
+chr1	179897	179929	a	a	+
+chr1	179867	179899	b	b	-
+chr1	179900	179932	a	a	+
+chr1	179874	179906	b	b	-
+chr1	179875	179907	b	b	-
+chr1	179918	179950	a	a	+
+chr1	179918	179950	a	a	+
+chr1	179918	179950	a	a	+
+chr1	179918	179950	a	a	+
+chr1	180000	180032	a	a	+
+chr1	179975	180007	b	b	-
+chr1	179983	180015	b	b	-
+chr1	179986	180018	b	b	-
+chr1	180030	180062	a	a	+
+chr1	180013	180045	b	b	-
+chr1	180017	180049	b	b	-
+chr1	180055	180087	a	a	+
+chr1	180028	180060	b	b	-
+chr1	180029	180061	b	b	-
+chr1	180039	180071	b	b	-
+chr1	180088	180120	a	a	+
+chr1	180094	180126	a	a	+
+chr1	180275	180307	a	a	+
+chr1	180244	180276	b	b	-
+chr1	180264	180296	b	b	-
+chr1	180306	180338	a	a	+
+chr1	180314	180346	b	b	-
+chr1	180415	180447	a	a	+
+chr1	180396	180428	b	b	-
+chr1	180396	180428	b	b	-
+chr1	180438	180470	a	a	+
+chr1	180443	180475	a	a	+
+chr1	180443	180475	a	a	+
+chr1	180415	180447	b	b	-
+chr1	180451	180483	a	a	+
+chr1	180454	180486	a	a	+
+chr1	180454	180486	a	a	+
+chr1	180507	180539	a	a	+
+chr1	180538	180570	b	b	-
+chr1	180585	180617	a	a	+
+chr1	180579	180611	b	b	-
+chr1	180579	180611	b	b	-
+chr1	180579	180611	b	b	-
+chr1	180580	180612	b	b	-
+chr1	180615	180647	a	a	+
+chr1	180618	180650	a	a	+
+chr1	180600	180632	b	b	-
+chr1	180600	180632	b	b	-
+chr1	180643	180675	a	a	+
+chr1	180652	180684	a	a	+
+chr1	180767	180799	a	a	+
+chr1	180778	180810	a	a	+
+chr1	180780	180812	a	a	+
+chr1	180803	180835	a	a	+
+chr1	180803	180835	a	a	+
+chr1	180777	180809	b	b	-
+chr1	180777	180809	b	b	-
+chr1	180777	180809	b	b	-
+chr1	180824	180856	a	a	+
+chr1	180824	180856	a	a	+
+chr1	180919	180951	b	b	-
+chr1	180921	180953	b	b	-
+chr1	180928	180960	b	b	-
+chr1	180932	180964	b	b	-
+chr1	180969	181001	a	a	+
+chr1	180937	180969	b	b	-
+chr1	180937	180969	b	b	-
+chr1	180937	180969	b	b	-
+chr1	180937	180969	b	b	-
+chr1	180937	180969	b	b	-
+chr1	180937	180969	b	b	-
+chr1	180971	181003	a	a	+
+chr1	180939	180971	b	b	-
+chr1	180939	180971	b	b	-
+chr1	180974	181006	a	a	+
+chr1	180975	181007	a	a	+
+chr1	180976	181008	a	a	+
+chr1	180976	181008	a	a	+
+chr1	180976	181008	a	a	+
+chr1	180976	181008	a	a	+
+chr1	181004	181036	a	a	+
+chr1	181308	181340	b	b	-
+chr1	181308	181340	b	b	-
+chr1	181308	181340	b	b	-
+chr1	181317	181349	b	b	-
+chr1	181317	181349	b	b	-
+chr1	181317	181349	b	b	-
+chr1	181382	181414	a	a	+
+chr1	181382	181414	a	a	+
+chr1	181388	181420	a	a	+
+chr1	181389	181421	a	a	+
+chr1	181413	181445	a	a	+
+chr1	181382	181414	b	b	-
+chr1	181510	181542	a	a	+
+chr1	181489	181521	b	b	-
+chr1	181493	181525	b	b	-
+chr1	181511	181543	b	b	-
+chr1	181515	181547	b	b	-
+chr1	181548	181580	a	a	+
+chr1	181540	181572	b	b	-
+chr1	181553	181585	b	b	-
+chr1	181590	181622	a	a	+
+chr1	181590	181622	a	a	+
+chr1	181566	181598	b	b	-
+chr1	181667	181699	a	a	+
+chr1	181676	181708	a	a	+
+chr1	181685	181717	a	a	+
+chr1	181698	181730	a	a	+
+chr1	181699	181731	a	a	+
+chr1	181700	181732	a	a	+
+chr1	181702	181734	a	a	+
+chr1	181670	181702	b	b	-
+chr1	181670	181702	b	b	-
+chr1	181671	181703	b	b	-
+chr1	181706	181738	a	a	+
+chr1	181710	181742	a	a	+
+chr1	181710	181742	a	a	+
+chr1	181690	181722	b	b	-
+chr1	181691	181723	b	b	-
+chr1	181691	181723	b	b	-
+chr1	181756	181788	a	a	+
+chr1	181824	181856	b	b	-
+chr1	181824	181856	b	b	-
+chr1	181827	181859	b	b	-
+chr1	181871	181903	a	a	+
+chr1	181871	181903	a	a	+
+chr1	181843	181875	b	b	-
+chr1	181843	181875	b	b	-
+chr1	182009	182041	a	a	+
+chr1	182003	182035	b	b	-
+chr1	182036	182068	a	a	+
+chr1	182037	182069	a	a	+
+chr1	182052	182084	a	a	+
+chr1	182021	182053	b	b	-
+chr1	182021	182053	b	b	-
+chr1	182021	182053	b	b	-
+chr1	182088	182120	a	a	+
+chr1	182175	182207	a	a	+
+chr1	182186	182218	a	a	+
+chr1	182155	182187	b	b	-
+chr1	182167	182199	b	b	-
+chr1	182202	182234	a	a	+
+chr1	182176	182208	b	b	-
+chr1	182185	182217	b	b	-
+chr1	182185	182217	b	b	-
+chr1	182185	182217	b	b	-
+chr1	182185	182217	b	b	-
+chr1	182222	182254	a	a	+
+chr1	182222	182254	a	a	+
+chr1	182222	182254	a	a	+
+chr1	182222	182254	a	a	+
+chr1	182222	182254	a	a	+
+chr1	182222	182254	a	a	+
+chr1	182223	182255	a	a	+
+chr1	182223	182255	a	a	+
+chr1	182226	182258	a	a	+
+chr1	182226	182258	a	a	+
+chr1	182203	182235	b	b	-
+chr1	182203	182235	b	b	-
+chr1	182203	182235	b	b	-
+chr1	182204	182236	b	b	-
+chr1	182214	182246	b	b	-
+chr1	182214	182246	b	b	-
+chr1	182249	182281	a	a	+
+chr1	182258	182290	a	a	+
+chr1	182293	182325	b	b	-
+chr1	182310	182342	b	b	-
+chr1	182366	182398	a	a	+
+chr1	182355	182387	b	b	-
+chr1	182417	182449	a	a	+
+chr1	182606	182638	b	b	-
+chr1	182610	182642	b	b	-
+chr1	182612	182644	b	b	-
+chr1	182613	182645	b	b	-
+chr1	182627	182659	b	b	-
+chr1	182632	182664	b	b	-
+chr1	182632	182664	b	b	-
+chr1	182634	182666	b	b	-
+chr1	182634	182666	b	b	-
+chr1	182637	182669	b	b	-
+chr1	182642	182674	b	b	-
+chr1	182642	182674	b	b	-
+chr1	182642	182674	b	b	-
+chr1	182642	182674	b	b	-
+chr1	182642	182674	b	b	-
+chr1	182642	182674	b	b	-
+chr1	182643	182675	b	b	-
+chr1	182643	182675	b	b	-
+chr1	182643	182675	b	b	-
+chr1	182644	182676	b	b	-
+chr1	182644	182676	b	b	-
+chr1	182644	182676	b	b	-
+chr1	182644	182676	b	b	-
+chr1	182644	182676	b	b	-
+chr1	182644	182676	b	b	-
+chr1	182644	182676	b	b	-
+chr1	182686	182718	a	a	+
+chr1	182686	182718	a	a	+
+chr1	182658	182690	b	b	-
+chr1	182691	182723	a	a	+
+chr1	182693	182725	a	a	+
+chr1	182708	182740	a	a	+
+chr1	182676	182708	b	b	-
+chr1	182688	182720	b	b	-
+chr1	182695	182727	b	b	-
+chr1	182697	182729	b	b	-
+chr1	182697	182729	b	b	-
+chr1	182697	182729	b	b	-
+chr1	182697	182729	b	b	-
+chr1	182697	182729	b	b	-
+chr1	182697	182729	b	b	-
+chr1	182698	182730	b	b	-
+chr1	182698	182730	b	b	-
+chr1	182698	182730	b	b	-
+chr1	182699	182731	b	b	-
+chr1	182702	182734	b	b	-
+chr1	182735	182767	a	a	+
+chr1	182705	182737	b	b	-
+chr1	182710	182742	b	b	-
+chr1	182711	182743	b	b	-
+chr1	182711	182743	b	b	-
+chr1	182745	182777	a	a	+
+chr1	182713	182745	b	b	-
+chr1	182713	182745	b	b	-
+chr1	182746	182778	a	a	+
+chr1	182746	182778	a	a	+
+chr1	182747	182779	a	a	+
+chr1	182747	182779	a	a	+
+chr1	182748	182780	a	a	+
+chr1	182717	182749	b	b	-
+chr1	182718	182750	b	b	-
+chr1	182752	182784	a	a	+
+chr1	182752	182784	a	a	+
+chr1	182753	182785	a	a	+
+chr1	182754	182786	a	a	+
+chr1	182754	182786	a	a	+
+chr1	182722	182754	b	b	-
+chr1	182723	182755	b	b	-
+chr1	182758	182790	a	a	+
+chr1	182758	182790	a	a	+
+chr1	182758	182790	a	a	+
+chr1	182758	182790	a	a	+
+chr1	182758	182790	a	a	+
+chr1	182761	182793	a	a	+
+chr1	182731	182763	b	b	-
+chr1	182732	182764	b	b	-
+chr1	182766	182798	a	a	+
+chr1	182768	182800	a	a	+
+chr1	182736	182768	b	b	-
+chr1	182773	182805	a	a	+
+chr1	182775	182807	a	a	+
+chr1	182775	182807	a	a	+
+chr1	182775	182807	a	a	+
+chr1	182783	182815	a	a	+
+chr1	182786	182818	a	a	+
+chr1	182757	182789	b	b	-
+chr1	182758	182790	b	b	-
+chr1	182758	182790	b	b	-
+chr1	182792	182824	a	a	+
+chr1	182760	182792	b	b	-
+chr1	182760	182792	b	b	-
+chr1	182799	182831	a	a	+
+chr1	182806	182838	a	a	+
+chr1	182807	182839	a	a	+
+chr1	182807	182839	a	a	+
+chr1	182807	182839	a	a	+
+chr1	182807	182839	a	a	+
+chr1	182783	182815	b	b	-
+chr1	182783	182815	b	b	-
+chr1	182786	182818	b	b	-
+chr1	182787	182819	b	b	-
+chr1	182787	182819	b	b	-
+chr1	182788	182820	b	b	-
+chr1	182823	182855	a	a	+
+chr1	182794	182826	b	b	-
+chr1	182794	182826	b	b	-
+chr1	182794	182826	b	b	-
+chr1	182796	182828	b	b	-
+chr1	182830	182862	a	a	+
+chr1	182834	182866	a	a	+
+chr1	182806	182838	b	b	-
+chr1	182808	182840	b	b	-
+chr1	182808	182840	b	b	-
+chr1	182843	182875	a	a	+
+chr1	182843	182875	a	a	+
+chr1	182851	182883	a	a	+
+chr1	182832	182864	b	b	-
+chr1	182840	182872	b	b	-
+chr1	182845	182877	b	b	-
+chr1	182848	182880	b	b	-
+chr1	182884	182916	a	a	+
+chr1	182884	182916	a	a	+
+chr1	182889	182921	a	a	+
+chr1	182905	182937	a	a	+
+chr1	182907	182939	a	a	+
+chr1	182907	182939	a	a	+
+chr1	182907	182939	a	a	+
+chr1	182907	182939	a	a	+
+chr1	182907	182939	a	a	+
+chr1	182908	182940	a	a	+
+chr1	182908	182940	a	a	+
+chr1	182909	182941	a	a	+
+chr1	182909	182941	a	a	+
+chr1	182910	182942	a	a	+
+chr1	182910	182942	a	a	+
+chr1	182910	182942	a	a	+
+chr1	182911	182943	a	a	+
+chr1	182911	182943	a	a	+
+chr1	182911	182943	a	a	+
+chr1	182911	182943	a	a	+
+chr1	182911	182943	a	a	+
+chr1	182911	182943	a	a	+
+chr1	182911	182943	a	a	+
+chr1	182911	182943	a	a	+
+chr1	182914	182946	a	a	+
+chr1	182914	182946	a	a	+
+chr1	182914	182946	a	a	+
+chr1	182914	182946	a	a	+
+chr1	182914	182946	a	a	+
+chr1	182915	182947	a	a	+
+chr1	182917	182949	a	a	+
+chr1	182919	182951	a	a	+
+chr1	182919	182951	a	a	+
+chr1	182919	182951	a	a	+
+chr1	182932	182964	a	a	+
+chr1	182939	182971	a	a	+
+chr1	182919	182951	b	b	-
+chr1	183064	183096	b	b	-
+chr1	183130	183162	b	b	-
+chr1	183138	183170	b	b	-
+chr1	183142	183174	b	b	-
+chr1	183143	183175	b	b	-
+chr1	183152	183184	b	b	-
+chr1	183152	183184	b	b	-
+chr1	183154	183186	b	b	-
+chr1	183154	183186	b	b	-
+chr1	183154	183186	b	b	-
+chr1	183157	183189	b	b	-
+chr1	183165	183197	b	b	-
+chr1	183165	183197	b	b	-
+chr1	183166	183198	b	b	-
+chr1	183169	183201	b	b	-
+chr1	183169	183201	b	b	-
+chr1	183169	183201	b	b	-
+chr1	183170	183202	b	b	-
+chr1	183170	183202	b	b	-
+chr1	183170	183202	b	b	-
+chr1	183170	183202	b	b	-
+chr1	183173	183205	b	b	-
+chr1	183209	183241	a	a	+
+chr1	183209	183241	a	a	+
+chr1	183209	183241	a	a	+
+chr1	183209	183241	a	a	+
+chr1	183209	183241	a	a	+
+chr1	183209	183241	a	a	+
+chr1	183178	183210	b	b	-
+chr1	183212	183244	a	a	+
+chr1	183180	183212	b	b	-
+chr1	183182	183214	b	b	-
+chr1	183183	183215	b	b	-
+chr1	183220	183252	a	a	+
+chr1	183220	183252	a	a	+
+chr1	183223	183255	a	a	+
+chr1	183191	183223	b	b	-
+chr1	183226	183258	a	a	+
+chr1	183226	183258	a	a	+
+chr1	183230	183262	a	a	+
+chr1	183202	183234	b	b	-
+chr1	183202	183234	b	b	-
+chr1	183203	183235	b	b	-
+chr1	183209	183241	b	b	-
+chr1	183209	183241	b	b	-
+chr1	183212	183244	b	b	-
+chr1	183216	183248	b	b	-
+chr1	183217	183249	b	b	-
+chr1	183219	183251	b	b	-
+chr1	183219	183251	b	b	-
+chr1	183219	183251	b	b	-
+chr1	183255	183287	a	a	+
+chr1	183227	183259	b	b	-
+chr1	183228	183260	b	b	-
+chr1	183263	183295	a	a	+
+chr1	183265	183297	a	a	+
+chr1	183265	183297	a	a	+
+chr1	183234	183266	b	b	-
+chr1	183270	183302	a	a	+
+chr1	183248	183280	b	b	-
+chr1	183282	183314	a	a	+
+chr1	183282	183314	a	a	+
+chr1	183291	183323	a	a	+
+chr1	183259	183291	b	b	-
+chr1	183260	183292	b	b	-
+chr1	183260	183292	b	b	-
+chr1	183261	183293	b	b	-
+chr1	183261	183293	b	b	-
+chr1	183295	183327	a	a	+
+chr1	183304	183336	a	a	+
+chr1	183277	183309	b	b	-
+chr1	183277	183309	b	b	-
+chr1	183277	183309	b	b	-
+chr1	183277	183309	b	b	-
+chr1	183277	183309	b	b	-
+chr1	183277	183309	b	b	-
+chr1	183294	183326	b	b	-
+chr1	183295	183327	b	b	-
+chr1	183296	183328	b	b	-
+chr1	183307	183339	b	b	-
+chr1	183313	183345	b	b	-
+chr1	183348	183380	a	a	+
+chr1	183355	183387	a	a	+
+chr1	183355	183387	a	a	+
+chr1	183356	183388	a	a	+
+chr1	183374	183406	a	a	+
+chr1	183375	183407	a	a	+
+chr1	183343	183375	b	b	-
+chr1	183384	183416	a	a	+
+chr1	183384	183416	a	a	+
+chr1	183356	183388	b	b	-
+chr1	183390	183422	a	a	+
+chr1	183392	183424	a	a	+
+chr1	183365	183397	b	b	-
+chr1	183403	183435	a	a	+
+chr1	183403	183435	a	a	+
+chr1	183403	183435	a	a	+
+chr1	183407	183439	a	a	+
+chr1	183408	183440	a	a	+
+chr1	183409	183441	a	a	+
+chr1	183413	183445	a	a	+
+chr1	183416	183448	a	a	+
+chr1	183421	183453	a	a	+
+chr1	183421	183453	a	a	+
+chr1	183421	183453	a	a	+
+chr1	183421	183453	a	a	+
+chr1	183421	183453	a	a	+
+chr1	183421	183453	a	a	+
+chr1	183421	183453	a	a	+
+chr1	183421	183453	a	a	+
+chr1	183421	183453	a	a	+
+chr1	183421	183453	a	a	+
+chr1	183421	183453	a	a	+
+chr1	183421	183453	a	a	+
+chr1	183421	183453	a	a	+
+chr1	183421	183453	a	a	+
+chr1	183421	183453	a	a	+
+chr1	183421	183453	a	a	+
+chr1	183430	183462	a	a	+
+chr1	183431	183463	a	a	+
+chr1	183431	183463	a	a	+
+chr1	183431	183463	a	a	+
+chr1	183434	183466	a	a	+
+chr1	183435	183467	a	a	+
+chr1	183435	183467	a	a	+
+chr1	183435	183467	a	a	+
+chr1	183403	183435	b	b	-
+chr1	183438	183470	a	a	+
+chr1	183439	183471	a	a	+
+chr1	183408	183440	b	b	-
+chr1	183408	183440	b	b	-
+chr1	183443	183475	a	a	+
+chr1	183411	183443	b	b	-
+chr1	183447	183479	a	a	+
+chr1	183419	183451	b	b	-
+chr1	183421	183453	b	b	-
+chr1	183422	183454	b	b	-
+chr1	183423	183455	b	b	-
+chr1	183424	183456	b	b	-
+chr1	183425	183457	b	b	-
+chr1	183425	183457	b	b	-
+chr1	183433	183465	b	b	-
+chr1	183433	183465	b	b	-
+chr1	183433	183465	b	b	-
+chr1	183433	183465	b	b	-
+chr1	183433	183465	b	b	-
+chr1	183467	183499	a	a	+
+chr1	183435	183467	b	b	-
+chr1	183437	183469	b	b	-
+chr1	183437	183469	b	b	-
+chr1	183437	183469	b	b	-
+chr1	183437	183469	b	b	-
+chr1	183437	183469	b	b	-
+chr1	183471	183503	a	a	+
+chr1	183474	183506	a	a	+
+chr1	183485	183517	a	a	+
+chr1	183487	183519	a	a	+
+chr1	183487	183519	a	a	+
+chr1	183487	183519	a	a	+
+chr1	183455	183487	b	b	-
+chr1	183493	183525	a	a	+
+chr1	183528	183560	a	a	+
+chr1	183646	183678	a	a	+
+chr1	183714	183746	a	a	+
+chr1	183682	183714	b	b	-
+chr1	183689	183721	b	b	-
+chr1	183692	183724	b	b	-
+chr1	183696	183728	b	b	-
+chr1	183696	183728	b	b	-
+chr1	183732	183764	a	a	+
+chr1	183732	183764	a	a	+
+chr1	183733	183765	a	a	+
+chr1	183734	183766	a	a	+
+chr1	183745	183777	a	a	+
+chr1	183720	183752	b	b	-
+chr1	183756	183788	a	a	+
+chr1	183757	183789	a	a	+
+chr1	183738	183770	b	b	-
+chr1	183738	183770	b	b	-
+chr1	183738	183770	b	b	-
+chr1	183747	183779	b	b	-
+chr1	183747	183779	b	b	-
+chr1	183747	183779	b	b	-
+chr1	183747	183779	b	b	-
+chr1	183747	183779	b	b	-
+chr1	183783	183815	a	a	+
+chr1	183753	183785	b	b	-
+chr1	183761	183793	b	b	-
+chr1	183761	183793	b	b	-
+chr1	183761	183793	b	b	-
+chr1	183761	183793	b	b	-
+chr1	183806	183838	a	a	+
+chr1	183811	183843	a	a	+
+chr1	183820	183852	a	a	+
+chr1	183835	183867	b	b	-
+chr1	183880	183912	a	a	+
+chr1	183880	183912	a	a	+
+chr1	183877	183909	b	b	-
+chr1	184046	184078	b	b	-
+chr1	184046	184078	b	b	-
+chr1	184084	184116	a	a	+
+chr1	184094	184126	a	a	+
+chr1	184104	184136	a	a	+
+chr1	184088	184120	b	b	-
+chr1	184097	184129	b	b	-
+chr1	184100	184132	b	b	-
+chr1	184100	184132	b	b	-
+chr1	184159	184191	a	a	+
+chr1	184173	184205	a	a	+
+chr1	184279	184311	a	a	+
+chr1	184293	184325	a	a	+
+chr1	184287	184319	b	b	-
+chr1	184482	184514	a	a	+
+chr1	184482	184514	a	a	+
+chr1	184531	184563	b	b	-
+chr1	184531	184563	b	b	-
+chr1	184538	184570	b	b	-
+chr1	184586	184618	a	a	+
+chr1	184587	184619	a	a	+
+chr1	184579	184611	b	b	-
+chr1	184579	184611	b	b	-
+chr1	184579	184611	b	b	-
+chr1	184582	184614	b	b	-
+chr1	184617	184649	a	a	+
+chr1	184617	184649	a	a	+
+chr1	184618	184650	a	a	+
+chr1	184586	184618	b	b	-
+chr1	184621	184653	a	a	+
+chr1	184589	184621	b	b	-
+chr1	184624	184656	a	a	+
+chr1	184596	184628	b	b	-
+chr1	184596	184628	b	b	-
+chr1	184633	184665	a	a	+
+chr1	184639	184671	a	a	+
+chr1	184624	184656	b	b	-
+chr1	184665	184697	a	a	+
+chr1	184649	184681	b	b	-
+chr1	184737	184769	b	b	-
+chr1	184777	184809	a	a	+
+chr1	184745	184777	b	b	-
+chr1	184811	184843	b	b	-
+chr1	184815	184847	b	b	-
+chr1	184815	184847	b	b	-
+chr1	184865	184897	a	a	+
+chr1	184866	184898	a	a	+
+chr1	184866	184898	a	a	+
+chr1	184866	184898	a	a	+
+chr1	184866	184898	a	a	+
+chr1	184869	184901	a	a	+
+chr1	184874	184906	a	a	+
+chr1	184842	184874	b	b	-
+chr1	184842	184874	b	b	-
+chr1	184842	184874	b	b	-
+chr1	184842	184874	b	b	-
+chr1	184842	184874	b	b	-
+chr1	184842	184874	b	b	-
+chr1	184843	184875	b	b	-
+chr1	184843	184875	b	b	-
+chr1	184843	184875	b	b	-
+chr1	184847	184879	b	b	-
+chr1	184880	184912	a	a	+
+chr1	184881	184913	a	a	+
+chr1	184884	184916	a	a	+
+chr1	184884	184916	a	a	+
+chr1	184884	184916	a	a	+
+chr1	184885	184917	a	a	+
+chr1	184885	184917	a	a	+
+chr1	184885	184917	a	a	+
+chr1	184885	184917	a	a	+
+chr1	184854	184886	b	b	-
+chr1	184856	184888	b	b	-
+chr1	184856	184888	b	b	-
+chr1	184857	184889	b	b	-
+chr1	184890	184922	a	a	+
+chr1	184860	184892	b	b	-
+chr1	184860	184892	b	b	-
+chr1	184893	184925	a	a	+
+chr1	184893	184925	a	a	+
+chr1	184893	184925	a	a	+
+chr1	184861	184893	b	b	-
+chr1	184895	184927	a	a	+
+chr1	184895	184927	a	a	+
+chr1	184895	184927	a	a	+
+chr1	184869	184901	b	b	-
+chr1	184869	184901	b	b	-
+chr1	184903	184935	a	a	+
+chr1	184872	184904	b	b	-
+chr1	184872	184904	b	b	-
+chr1	184872	184904	b	b	-
+chr1	184873	184905	b	b	-
+chr1	184875	184907	b	b	-
+chr1	184875	184907	b	b	-
+chr1	184875	184907	b	b	-
+chr1	184875	184907	b	b	-
+chr1	184877	184909	b	b	-
+chr1	184877	184909	b	b	-
+chr1	184879	184911	b	b	-
+chr1	184884	184916	b	b	-
+chr1	184917	184949	a	a	+
+chr1	184885	184917	b	b	-
+chr1	184888	184920	b	b	-
+chr1	184890	184922	b	b	-
+chr1	184927	184959	a	a	+
+chr1	184938	184970	a	a	+
+chr1	185002	185034	a	a	+
+chr1	185002	185034	a	a	+
+chr1	185026	185058	a	a	+
+chr1	185026	185058	b	b	-
+chr1	185026	185058	b	b	-
+chr1	185059	185091	a	a	+
+chr1	185069	185101	a	a	+
+chr1	185044	185076	b	b	-
+chr1	185170	185202	a	a	+
+chr1	185191	185223	a	a	+
+chr1	185191	185223	a	a	+
+chr1	185191	185223	a	a	+
+chr1	185191	185223	a	a	+
+chr1	185204	185236	a	a	+
+chr1	185210	185242	a	a	+
+chr1	185227	185259	a	a	+
+chr1	185199	185231	b	b	-
+chr1	185353	185385	a	a	+
+chr1	185482	185514	b	b	-
+chr1	185521	185553	a	a	+
+chr1	185521	185553	a	a	+
+chr1	185495	185527	b	b	-
+chr1	185495	185527	b	b	-
+chr1	185495	185527	b	b	-
+chr1	185639	185671	b	b	-
+chr1	185644	185676	b	b	-
+chr1	185646	185678	b	b	-
+chr1	185646	185678	b	b	-
+chr1	185680	185712	a	a	+
+chr1	185680	185712	a	a	+
+chr1	185680	185712	a	a	+
+chr1	185649	185681	b	b	-
+chr1	185649	185681	b	b	-
+chr1	185650	185682	b	b	-
+chr1	185659	185691	b	b	-
+chr1	185674	185706	b	b	-
+chr1	185709	185741	a	a	+
+chr1	185729	185761	a	a	+
+chr1	185873	185905	b	b	-
+chr1	185885	185917	b	b	-
+chr1	185926	185958	a	a	+
+chr1	185902	185934	b	b	-
+chr1	185902	185934	b	b	-
+chr1	185938	185970	a	a	+
+chr1	185909	185941	b	b	-
+chr1	185918	185950	b	b	-
+chr1	185959	185991	a	a	+
+chr1	185951	185983	b	b	-
+chr1	186037	186069	b	b	-
+chr1	186069	186101	b	b	-
+chr1	186112	186144	a	a	+
+chr1	186126	186158	a	a	+
+chr1	186166	186198	a	a	+
+chr1	186203	186235	b	b	-
+chr1	186274	186306	b	b	-
+chr1	186319	186351	a	a	+
+chr1	186289	186321	b	b	-
+chr1	186544	186576	b	b	-
+chr1	186544	186576	b	b	-
+chr1	186590	186622	a	a	+
+chr1	186605	186637	a	a	+
+chr1	186574	186606	b	b	-
+chr1	186587	186619	b	b	-
+chr1	186587	186619	b	b	-
+chr1	186644	186676	a	a	+
+chr1	186697	186729	a	a	+
+chr1	186700	186732	b	b	-
+chr1	186724	186756	b	b	-
+chr1	186772	186804	a	a	+
+chr1	186741	186773	b	b	-
+chr1	186782	186814	a	a	+
+chr1	186790	186822	a	a	+
+chr1	186764	186796	b	b	-
+chr1	186764	186796	b	b	-
+chr1	186768	186800	b	b	-
+chr1	186898	186930	b	b	-
+chr1	186957	186989	a	a	+
+chr1	186925	186957	b	b	-
+chr1	186959	186991	a	a	+
+chr1	186941	186973	b	b	-
+chr1	186941	186973	b	b	-
+chr1	186977	187009	a	a	+
+chr1	186978	187010	a	a	+
+chr1	186979	187011	a	a	+
+chr1	186979	187011	a	a	+
+chr1	186987	187019	a	a	+
+chr1	186997	187029	a	a	+
+chr1	186970	187002	b	b	-
+chr1	186970	187002	b	b	-
+chr1	186970	187002	b	b	-
+chr1	186970	187002	b	b	-
+chr1	186971	187003	b	b	-
+chr1	186972	187004	b	b	-
+chr1	186972	187004	b	b	-
+chr1	187006	187038	a	a	+
+chr1	187007	187039	a	a	+
+chr1	187008	187040	a	a	+
+chr1	187009	187041	a	a	+
+chr1	187009	187041	a	a	+
+chr1	187011	187043	a	a	+
+chr1	187013	187045	a	a	+
+chr1	187013	187045	a	a	+
+chr1	187000	187032	b	b	-
+chr1	187000	187032	b	b	-
+chr1	187000	187032	b	b	-
+chr1	187000	187032	b	b	-
+chr1	187035	187067	a	a	+
+chr1	187035	187067	a	a	+
+chr1	187036	187068	a	a	+
+chr1	187017	187049	b	b	-
+chr1	187031	187063	b	b	-
+chr1	187043	187075	b	b	-
+chr1	187089	187121	a	a	+
+chr1	187090	187122	a	a	+
+chr1	187106	187138	a	a	+
+chr1	187106	187138	a	a	+
+chr1	187114	187146	a	a	+
+chr1	187094	187126	b	b	-
+chr1	187094	187126	b	b	-
+chr1	187094	187126	b	b	-
+chr1	187187	187219	a	a	+
+chr1	187195	187227	b	b	-
+chr1	187307	187339	a	a	+
+chr1	187289	187321	b	b	-
+chr1	187336	187368	b	b	-
+chr1	187376	187408	a	a	+
+chr1	187376	187408	a	a	+
+chr1	187344	187376	b	b	-
+chr1	187344	187376	b	b	-
+chr1	187344	187376	b	b	-
+chr1	187382	187414	a	a	+
+chr1	187382	187414	a	a	+
+chr1	187410	187442	a	a	+
+chr1	187379	187411	b	b	-
+chr1	187393	187425	b	b	-
+chr1	187402	187434	b	b	-
+chr1	187405	187437	b	b	-
+chr1	187438	187470	a	a	+
+chr1	187438	187470	a	a	+
+chr1	187455	187487	b	b	-
+chr1	187482	187514	b	b	-
+chr1	187483	187515	b	b	-
+chr1	187483	187515	b	b	-
+chr1	187562	187594	a	a	+
+chr1	187576	187608	a	a	+
+chr1	187594	187626	a	a	+
+chr1	187595	187627	b	b	-
+chr1	187638	187670	b	b	-
+chr1	187644	187676	b	b	-
+chr1	187644	187676	b	b	-
+chr1	187689	187721	a	a	+
+chr1	187666	187698	b	b	-
+chr1	187758	187790	a	a	+
+chr1	187779	187811	b	b	-
+chr1	187812	187844	a	a	+
+chr1	187791	187823	b	b	-
+chr1	187791	187823	b	b	-
+chr1	187824	187856	a	a	+
+chr1	187827	187859	a	a	+
+chr1	187830	187862	a	a	+
+chr1	187831	187863	a	a	+
+chr1	187831	187863	a	a	+
+chr1	187831	187863	a	a	+
+chr1	187831	187863	a	a	+
+chr1	187832	187864	a	a	+
+chr1	187832	187864	a	a	+
+chr1	187832	187864	a	a	+
+chr1	187832	187864	a	a	+
+chr1	187833	187865	a	a	+
+chr1	187835	187867	a	a	+
+chr1	187835	187867	a	a	+
+chr1	187804	187836	b	b	-
+chr1	187840	187872	a	a	+
+chr1	187840	187872	a	a	+
+chr1	187808	187840	b	b	-
+chr1	187812	187844	b	b	-
+chr1	187814	187846	b	b	-
+chr1	187816	187848	b	b	-
+chr1	187820	187852	b	b	-
+chr1	187820	187852	b	b	-
+chr1	187820	187852	b	b	-
+chr1	187820	187852	b	b	-
+chr1	187820	187852	b	b	-
+chr1	187820	187852	b	b	-
+chr1	187821	187853	b	b	-
+chr1	187821	187853	b	b	-
+chr1	187821	187853	b	b	-
+chr1	187823	187855	b	b	-
+chr1	187830	187862	b	b	-
+chr1	187853	187885	b	b	-
+chr1	187853	187885	b	b	-
+chr1	187854	187886	b	b	-
+chr1	187854	187886	b	b	-
+chr1	187854	187886	b	b	-
+chr1	187929	187961	b	b	-
+chr1	188017	188049	a	a	+
+chr1	187989	188021	b	b	-
+chr1	188031	188063	b	b	-
+chr1	188071	188103	a	a	+
+chr1	188071	188103	a	a	+
+chr1	188076	188108	a	a	+
+chr1	188078	188110	a	a	+
+chr1	188078	188110	a	a	+
+chr1	188046	188078	b	b	-
+chr1	188057	188089	b	b	-
+chr1	188057	188089	b	b	-
+chr1	188057	188089	b	b	-
+chr1	188057	188089	b	b	-
+chr1	188057	188089	b	b	-
+chr1	188057	188089	b	b	-
+chr1	188057	188089	b	b	-
+chr1	188057	188089	b	b	-
+chr1	188057	188089	b	b	-
+chr1	188057	188089	b	b	-
+chr1	188058	188090	b	b	-
+chr1	188093	188125	a	a	+
+chr1	188096	188128	a	a	+
+chr1	188096	188128	a	a	+
+chr1	188097	188129	a	a	+
+chr1	188097	188129	a	a	+
+chr1	188101	188133	a	a	+
+chr1	188110	188142	a	a	+
+chr1	188111	188143	a	a	+
+chr1	188111	188143	a	a	+
+chr1	188111	188143	a	a	+
+chr1	188111	188143	a	a	+
+chr1	188111	188143	a	a	+
+chr1	188111	188143	a	a	+
+chr1	188081	188113	b	b	-
+chr1	188116	188148	a	a	+
+chr1	188085	188117	b	b	-
+chr1	188085	188117	b	b	-
+chr1	188085	188117	b	b	-
+chr1	188085	188117	b	b	-
+chr1	188086	188118	b	b	-
+chr1	188086	188118	b	b	-
+chr1	188123	188155	b	b	-
+chr1	188166	188198	a	a	+
+chr1	188137	188169	b	b	-
+chr1	188174	188206	a	a	+
+chr1	188175	188207	a	a	+
+chr1	188178	188210	a	a	+
+chr1	188219	188251	a	a	+
+chr1	188242	188274	a	a	+
+chr1	188243	188275	b	b	-
+chr1	188286	188318	a	a	+
+chr1	188307	188339	b	b	-
+chr1	188344	188376	a	a	+
+chr1	188346	188378	b	b	-
+chr1	188360	188392	b	b	-
+chr1	188424	188456	a	a	+
+chr1	188425	188457	a	a	+
+chr1	188408	188440	b	b	-
+chr1	188454	188486	a	a	+
+chr1	188428	188460	b	b	-
+chr1	188428	188460	b	b	-
+chr1	188437	188469	b	b	-
+chr1	188440	188472	b	b	-
+chr1	188440	188472	b	b	-
+chr1	188491	188523	a	a	+
+chr1	188491	188523	a	a	+
+chr1	188492	188524	a	a	+
+chr1	188467	188499	b	b	-
+chr1	188508	188540	a	a	+
+chr1	188526	188558	a	a	+
+chr1	188574	188606	a	a	+
+chr1	188544	188576	b	b	-
+chr1	188544	188576	b	b	-
+chr1	188593	188625	a	a	+
+chr1	188593	188625	a	a	+
+chr1	188593	188625	a	a	+
+chr1	188600	188632	a	a	+
+chr1	188600	188632	a	a	+
+chr1	188571	188603	b	b	-
+chr1	188571	188603	b	b	-
+chr1	188574	188606	b	b	-
+chr1	188577	188609	b	b	-
+chr1	188577	188609	b	b	-
+chr1	188577	188609	b	b	-
+chr1	188580	188612	b	b	-
+chr1	188615	188647	a	a	+
+chr1	188584	188616	b	b	-
+chr1	188588	188620	b	b	-
+chr1	188621	188653	a	a	+
+chr1	188622	188654	a	a	+
+chr1	188591	188623	b	b	-
+chr1	188591	188623	b	b	-
+chr1	188591	188623	b	b	-
+chr1	188624	188656	a	a	+
+chr1	188596	188628	b	b	-
+chr1	188596	188628	b	b	-
+chr1	188636	188668	a	a	+
+chr1	188636	188668	a	a	+
+chr1	188636	188668	a	a	+
+chr1	188636	188668	a	a	+
+chr1	188636	188668	a	a	+
+chr1	188605	188637	b	b	-
+chr1	188611	188643	b	b	-
+chr1	188644	188676	a	a	+
+chr1	188650	188682	a	a	+
+chr1	188653	188685	a	a	+
+chr1	188621	188653	b	b	-
+chr1	188662	188694	a	a	+
+chr1	188630	188662	b	b	-
+chr1	188664	188696	a	a	+
+chr1	188671	188703	a	a	+
+chr1	188671	188703	a	a	+
+chr1	188643	188675	b	b	-
+chr1	188668	188700	b	b	-
+chr1	188668	188700	b	b	-
+chr1	188701	188733	a	a	+
+chr1	188681	188713	b	b	-
+chr1	188734	188766	a	a	+
+chr1	188746	188778	a	a	+
+chr1	188824	188856	a	a	+
+chr1	188828	188860	a	a	+
+chr1	188801	188833	b	b	-
+chr1	188816	188848	b	b	-
+chr1	188849	188881	a	a	+
+chr1	188823	188855	b	b	-
+chr1	188844	188876	b	b	-
+chr1	188877	188909	a	a	+
+chr1	188848	188880	b	b	-
+chr1	188873	188905	b	b	-
+chr1	188921	188953	a	a	+
+chr1	188898	188930	b	b	-
+chr1	188932	188964	a	a	+
+chr1	188932	188964	a	a	+
+chr1	188932	188964	a	a	+
+chr1	188933	188965	a	a	+
+chr1	188917	188949	b	b	-
+chr1	188952	188984	a	a	+
+chr1	188942	188974	b	b	-
+chr1	188942	188974	b	b	-
+chr1	188943	188975	b	b	-
+chr1	188943	188975	b	b	-
+chr1	188988	189020	a	a	+
+chr1	188960	188992	b	b	-
+chr1	188960	188992	b	b	-
+chr1	188964	188996	b	b	-
+chr1	188997	189029	a	a	+
+chr1	188997	189029	a	a	+
+chr1	188998	189030	a	a	+
+chr1	188998	189030	a	a	+
+chr1	188973	189005	b	b	-
+chr1	189006	189038	a	a	+
+chr1	188974	189006	b	b	-
+chr1	189007	189039	a	a	+
+chr1	189007	189039	a	a	+
+chr1	189008	189040	a	a	+
+chr1	189008	189040	a	a	+
+chr1	188978	189010	b	b	-
+chr1	188981	189013	b	b	-
+chr1	188981	189013	b	b	-
+chr1	188981	189013	b	b	-
+chr1	188981	189013	b	b	-
+chr1	188983	189015	b	b	-
+chr1	188984	189016	b	b	-
+chr1	188988	189020	b	b	-
+chr1	188989	189021	b	b	-
+chr1	189030	189062	a	a	+
+chr1	189031	189063	a	a	+
+chr1	189031	189063	a	a	+
+chr1	189031	189063	a	a	+
+chr1	189031	189063	a	a	+
+chr1	189031	189063	a	a	+
+chr1	189031	189063	a	a	+
+chr1	189000	189032	b	b	-
+chr1	189000	189032	b	b	-
+chr1	189000	189032	b	b	-
+chr1	189001	189033	b	b	-
+chr1	189001	189033	b	b	-
+chr1	189001	189033	b	b	-
+chr1	189038	189070	a	a	+
+chr1	189038	189070	a	a	+
+chr1	189047	189079	a	a	+
+chr1	189017	189049	b	b	-
+chr1	189052	189084	a	a	+
+chr1	189039	189071	b	b	-
+chr1	189079	189111	a	a	+
+chr1	189196	189228	a	a	+
+chr1	189173	189205	b	b	-
+chr1	189212	189244	a	a	+
+chr1	189368	189400	b	b	-
+chr1	189369	189401	b	b	-
+chr1	189405	189437	a	a	+
+chr1	189406	189438	a	a	+
+chr1	189409	189441	b	b	-
+chr1	189412	189444	b	b	-
+chr1	189413	189445	b	b	-
+chr1	189417	189449	b	b	-
+chr1	189417	189449	b	b	-
+chr1	189493	189525	a	a	+
+chr1	189493	189525	a	a	+
+chr1	189493	189525	a	a	+
+chr1	189493	189525	a	a	+
+chr1	189493	189525	a	a	+
+chr1	189493	189525	a	a	+
+chr1	189496	189528	a	a	+
+chr1	189464	189496	b	b	-
+chr1	189467	189499	b	b	-
+chr1	189467	189499	b	b	-
+chr1	189468	189500	b	b	-
+chr1	189471	189503	b	b	-
+chr1	189471	189503	b	b	-
+chr1	189471	189503	b	b	-
+chr1	189471	189503	b	b	-
+chr1	189471	189503	b	b	-
+chr1	189556	189588	a	a	+
+chr1	189528	189560	b	b	-
+chr1	189584	189616	b	b	-
+chr1	189638	189670	a	a	+
+chr1	189616	189648	b	b	-
+chr1	189623	189655	b	b	-
+chr1	189629	189661	b	b	-
+chr1	189629	189661	b	b	-
+chr1	189634	189666	b	b	-
+chr1	189634	189666	b	b	-
+chr1	189639	189671	b	b	-
+chr1	189639	189671	b	b	-
+chr1	189639	189671	b	b	-
+chr1	189639	189671	b	b	-
+chr1	189646	189678	b	b	-
+chr1	189683	189715	a	a	+
+chr1	189683	189715	a	a	+
+chr1	189690	189722	a	a	+
+chr1	189690	189722	a	a	+
+chr1	189690	189722	a	a	+
+chr1	189694	189726	a	a	+
+chr1	189694	189726	a	a	+
+chr1	189697	189729	a	a	+
+chr1	189698	189730	a	a	+
+chr1	189700	189732	a	a	+
+chr1	189700	189732	a	a	+
+chr1	189700	189732	a	a	+
+chr1	189702	189734	a	a	+
+chr1	189702	189734	a	a	+
+chr1	189702	189734	a	a	+
+chr1	189702	189734	a	a	+
+chr1	189702	189734	a	a	+
+chr1	189703	189735	a	a	+
+chr1	189703	189735	a	a	+
+chr1	189703	189735	a	a	+
+chr1	189703	189735	a	a	+
+chr1	189703	189735	a	a	+
+chr1	189703	189735	a	a	+
+chr1	189703	189735	a	a	+
+chr1	189703	189735	a	a	+
+chr1	189703	189735	a	a	+
+chr1	189705	189737	a	a	+
+chr1	189707	189739	a	a	+
+chr1	189680	189712	b	b	-
+chr1	189716	189748	a	a	+
+chr1	189716	189748	a	a	+
+chr1	189716	189748	a	a	+
+chr1	189717	189749	a	a	+
+chr1	189717	189749	a	a	+
+chr1	189720	189752	a	a	+
+chr1	189721	189753	a	a	+
+chr1	189728	189760	a	a	+
+chr1	189737	189769	a	a	+
+chr1	189843	189875	b	b	-
+chr1	189890	189922	a	a	+
+chr1	189870	189902	b	b	-
+chr1	189904	189936	a	a	+
+chr1	190031	190063	b	b	-
+chr1	190088	190120	a	a	+
+chr1	190193	190225	b	b	-
+chr1	190424	190456	b	b	-
+chr1	190459	190491	b	b	-
+chr1	190464	190496	b	b	-
+chr1	190464	190496	b	b	-
+chr1	190474	190506	b	b	-
+chr1	190507	190539	a	a	+
+chr1	190510	190542	a	a	+
+chr1	190534	190566	a	a	+
+chr1	190663	190695	a	a	+
+chr1	190696	190728	a	a	+
+chr1	190697	190729	a	a	+
+chr1	190709	190741	b	b	-
+chr1	190750	190782	a	a	+
+chr1	190758	190790	a	a	+
+chr1	190775	190807	a	a	+
+chr1	190754	190786	b	b	-
+chr1	190757	190789	b	b	-
+chr1	190838	190870	a	a	+
+chr1	190838	190870	a	a	+
+chr1	190859	190891	a	a	+
+chr1	190864	190896	a	a	+
+chr1	190833	190865	b	b	-
+chr1	190909	190941	a	a	+
+chr1	190965	190997	b	b	-
+chr1	191026	191058	a	a	+
+chr1	190994	191026	b	b	-
+chr1	191023	191055	b	b	-
+chr1	191025	191057	b	b	-
+chr1	191066	191098	b	b	-
+chr1	191136	191168	b	b	-
+chr1	191140	191172	b	b	-
+chr1	191142	191174	b	b	-
+chr1	191177	191209	a	a	+
+chr1	191156	191188	b	b	-
+chr1	191162	191194	b	b	-
+chr1	191168	191200	b	b	-
+chr1	191206	191238	a	a	+
+chr1	191294	191326	a	a	+
+chr1	191299	191331	b	b	-
+chr1	191302	191334	b	b	-
+chr1	191303	191335	b	b	-
+chr1	191310	191342	b	b	-
+chr1	191320	191352	b	b	-
+chr1	191334	191366	b	b	-
+chr1	191334	191366	b	b	-
+chr1	191403	191435	a	a	+
+chr1	191403	191435	a	a	+
+chr1	191373	191405	b	b	-
+chr1	191376	191408	b	b	-
+chr1	191420	191452	a	a	+
+chr1	191411	191443	b	b	-
+chr1	191454	191486	a	a	+
+chr1	191437	191469	b	b	-
+chr1	191579	191611	a	a	+
+chr1	191579	191611	a	a	+
+chr1	191592	191624	a	a	+
+chr1	191607	191639	a	a	+
+chr1	191607	191639	a	a	+
+chr1	191611	191643	a	a	+
+chr1	191611	191643	a	a	+
+chr1	191611	191643	a	a	+
+chr1	191611	191643	a	a	+
+chr1	191589	191621	b	b	-
+chr1	191589	191621	b	b	-
+chr1	191622	191654	a	a	+
+chr1	191622	191654	a	a	+
+chr1	191623	191655	a	a	+
+chr1	191623	191655	a	a	+
+chr1	191591	191623	b	b	-
+chr1	191625	191657	a	a	+
+chr1	191600	191632	b	b	-
+chr1	191601	191633	b	b	-
+chr1	191606	191638	b	b	-
+chr1	191622	191654	b	b	-
+chr1	191668	191700	a	a	+
+chr1	191679	191711	a	a	+
+chr1	191728	191760	a	a	+
+chr1	191741	191773	a	a	+
+chr1	191773	191805	a	a	+
+chr1	191773	191805	a	a	+
+chr1	191779	191811	a	a	+
+chr1	191780	191812	a	a	+
+chr1	191785	191817	a	a	+
+chr1	191785	191817	a	a	+
+chr1	191768	191800	b	b	-
+chr1	191771	191803	b	b	-
+chr1	191771	191803	b	b	-
+chr1	191786	191818	b	b	-
+chr1	191846	191878	a	a	+
+chr1	191934	191966	a	a	+
+chr1	191918	191950	b	b	-
+chr1	191936	191968	b	b	-
+chr1	191936	191968	b	b	-
+chr1	191969	192001	a	a	+
+chr1	192007	192039	a	a	+
+chr1	192080	192112	b	b	-
+chr1	192080	192112	b	b	-
+chr1	192081	192113	b	b	-
+chr1	192090	192122	b	b	-
+chr1	192168	192200	a	a	+
+chr1	192209	192241	a	a	+
+chr1	192255	192287	b	b	-
+chr1	192297	192329	a	a	+
+chr1	192301	192333	a	a	+
+chr1	192276	192308	b	b	-
+chr1	192276	192308	b	b	-
+chr1	192291	192323	b	b	-
+chr1	192293	192325	b	b	-
+chr1	192329	192361	a	a	+
+chr1	192594	192626	a	a	+
+chr1	192562	192594	b	b	-
+chr1	192562	192594	b	b	-
+chr1	192578	192610	b	b	-
+chr1	192578	192610	b	b	-
+chr1	192611	192643	a	a	+
+chr1	192579	192611	b	b	-
+chr1	192579	192611	b	b	-
+chr1	192613	192645	a	a	+
+chr1	192613	192645	a	a	+
+chr1	192613	192645	a	a	+
+chr1	192615	192647	a	a	+
+chr1	192615	192647	a	a	+
+chr1	192584	192616	b	b	-
+chr1	192619	192651	a	a	+
+chr1	192588	192620	b	b	-
+chr1	192588	192620	b	b	-
+chr1	192621	192653	a	a	+
+chr1	192621	192653	a	a	+
+chr1	192591	192623	b	b	-
+chr1	192591	192623	b	b	-
+chr1	192624	192656	a	a	+
+chr1	192597	192629	b	b	-
+chr1	192598	192630	b	b	-
+chr1	192598	192630	b	b	-
+chr1	192598	192630	b	b	-
+chr1	192631	192663	a	a	+
+chr1	192631	192663	a	a	+
+chr1	192632	192664	a	a	+
+chr1	192634	192666	a	a	+
+chr1	192634	192666	a	a	+
+chr1	192602	192634	b	b	-
+chr1	192602	192634	b	b	-
+chr1	192602	192634	b	b	-
+chr1	192637	192669	a	a	+
+chr1	192605	192637	b	b	-
+chr1	192638	192670	a	a	+
+chr1	192643	192675	a	a	+
+chr1	192756	192788	a	a	+
+chr1	192770	192802	a	a	+
+chr1	192771	192803	a	a	+
+chr1	192772	192804	a	a	+
+chr1	192753	192785	b	b	-
+chr1	192787	192819	a	a	+
+chr1	192787	192819	a	a	+
+chr1	192767	192799	b	b	-
+chr1	192807	192839	a	a	+
+chr1	192942	192974	a	a	+
+chr1	192913	192945	b	b	-
+chr1	193155	193187	a	a	+
+chr1	193366	193398	b	b	-
+chr1	194474	194506	a	a	+
+chr1	195016	195048	b	b	-
+chr1	195190	195222	a	a	+
+chr1	195283	195315	b	b	-
+chr1	195288	195320	b	b	-
+chr1	195334	195366	b	b	-
+chr1	195738	195770	a	a	+
+chr1	195841	195873	a	a	+
+chr1	196030	196062	b	b	-
+chr1	196240	196272	b	b	-
+chr1	196240	196272	b	b	-
+chr1	196871	196903	b	b	-
+chr1	196969	197001	b	b	-
+chr1	196969	197001	b	b	-
+chr1	197092	197124	a	a	+
+chr1	197092	197124	a	a	+
+chr1	197300	197332	a	a	+
+chr1	197270	197302	b	b	-
+chr1	197348	197380	b	b	-
+chr1	197622	197654	b	b	-
+chr1	197701	197733	a	a	+
+chr1	197845	197877	a	a	+
+chr1	197830	197862	b	b	-
+chr1	197877	197909	a	a	+
+chr1	197877	197909	a	a	+
+chr1	198044	198076	a	a	+
+chr1	198044	198076	a	a	+
+chr1	198050	198082	a	a	+
+chr1	198181	198213	b	b	-
+chr1	198347	198379	b	b	-
+chr1	198361	198393	b	b	-
+chr1	198395	198427	a	a	+
+chr1	198363	198395	b	b	-
+chr1	198374	198406	b	b	-
+chr1	198377	198409	b	b	-
+chr1	198396	198428	b	b	-
+chr1	198763	198795	a	a	+
+chr1	198773	198805	a	a	+
+chr1	198773	198805	a	a	+
+chr1	198778	198810	a	a	+
+chr1	198778	198810	a	a	+
+chr1	198787	198819	a	a	+
+chr1	198756	198788	b	b	-
+chr1	198757	198789	b	b	-
+chr1	198791	198823	a	a	+
+chr1	198764	198796	b	b	-
+chr1	198765	198797	b	b	-
+chr1	198798	198830	a	a	+
+chr1	198766	198798	b	b	-
+chr1	198767	198799	b	b	-
+chr1	198779	198811	b	b	-
+chr1	198779	198811	b	b	-
+chr1	198782	198814	b	b	-
+chr1	198822	198854	a	a	+
+chr1	198822	198854	a	a	+
+chr1	198838	198870	a	a	+
+chr1	198844	198876	a	a	+
+chr1	198839	198871	b	b	-
+chr1	198907	198939	a	a	+
+chr1	198888	198920	b	b	-
+chr1	198935	198967	a	a	+
+chr1	198938	198970	a	a	+
+chr1	198910	198942	b	b	-
+chr1	198943	198975	a	a	+
+chr1	198927	198959	b	b	-
+chr1	198927	198959	b	b	-
+chr1	198962	198994	a	a	+
+chr1	198976	199008	a	a	+
+chr1	198976	199008	a	a	+
+chr1	198976	199008	a	a	+
+chr1	199078	199110	b	b	-
+chr1	199119	199151	a	a	+
+chr1	199142	199174	a	a	+
+chr1	199152	199184	a	a	+
+chr1	199152	199184	a	a	+
+chr1	199170	199202	a	a	+
+chr1	199171	199203	a	a	+
+chr1	199208	199240	b	b	-
+chr1	199829	199861	a	a	+
+chr1	199808	199840	b	b	-
+chr1	199897	199929	a	a	+
+chr1	199897	199929	a	a	+
+chr1	199990	200022	a	a	+
+chr1	200020	200052	b	b	-
+chr1	200020	200052	b	b	-
+chr1	200174	200206	b	b	-
+chr1	200318	200350	b	b	-
+chr1	200354	200386	a	a	+
+chr1	200326	200358	b	b	-
+chr1	200328	200360	b	b	-
+chr1	200329	200361	b	b	-
+chr1	200364	200396	a	a	+
+chr1	200364	200396	a	a	+
+chr1	200364	200396	a	a	+
+chr1	200365	200397	a	a	+
+chr1	200334	200366	b	b	-
+chr1	200368	200400	a	a	+
+chr1	200368	200400	a	a	+
+chr1	200368	200400	a	a	+
+chr1	200369	200401	a	a	+
+chr1	200371	200403	a	a	+
+chr1	200371	200403	a	a	+
+chr1	200377	200409	a	a	+
+chr1	200346	200378	b	b	-
+chr1	200350	200382	b	b	-
+chr1	200350	200382	b	b	-
+chr1	200392	200424	a	a	+
+chr1	200405	200437	a	a	+
+chr1	200414	200446	a	a	+
+chr1	200606	200638	b	b	-
+chr1	200606	200638	b	b	-
+chr1	200606	200638	b	b	-
+chr1	200643	200675	a	a	+
+chr1	200617	200649	b	b	-
+chr1	200619	200651	b	b	-
+chr1	200655	200687	a	a	+
+chr1	200660	200692	a	a	+
+chr1	200660	200692	a	a	+
+chr1	200660	200692	a	a	+
+chr1	200660	200692	a	a	+
+chr1	200663	200695	a	a	+
+chr1	200632	200664	b	b	-
+chr1	200667	200699	a	a	+
+chr1	200667	200699	a	a	+
+chr1	200667	200699	a	a	+
+chr1	200637	200669	b	b	-
+chr1	200671	200703	a	a	+
+chr1	200671	200703	a	a	+
+chr1	200640	200672	b	b	-
+chr1	200647	200679	b	b	-
+chr1	200653	200685	b	b	-
+chr1	200694	200726	a	a	+
+chr1	200699	200731	a	a	+
+chr1	200704	200736	a	a	+
+chr1	200722	200754	a	a	+
+chr1	200695	200727	b	b	-
+chr1	200734	200766	a	a	+
+chr1	200753	200785	a	a	+
+chr1	200753	200785	a	a	+
+chr1	200753	200785	a	a	+
+chr1	200753	200785	a	a	+
+chr1	200767	200799	a	a	+
+chr1	200806	200838	a	a	+
+chr1	200795	200827	b	b	-
+chr1	200957	200989	a	a	+
+chr1	200954	200986	b	b	-
+chr1	200969	201001	b	b	-
+chr1	201150	201182	b	b	-
+chr1	201217	201249	b	b	-
+chr1	201245	201277	b	b	-
+chr1	201255	201287	b	b	-
+chr1	201302	201334	a	a	+
+chr1	201320	201352	a	a	+
+chr1	201368	201400	b	b	-
+chr1	201430	201462	b	b	-
+chr1	201787	201819	a	a	+
+chr1	201788	201820	a	a	+
+chr1	201810	201842	a	a	+
+chr1	201952	201984	a	a	+
+chr1	202185	202217	a	a	+
+chr1	202278	202310	a	a	+
+chr1	202278	202310	a	a	+
+chr1	202278	202310	b	b	-
+chr1	202312	202344	a	a	+
+chr1	202317	202349	a	a	+
+chr1	202334	202366	a	a	+
+chr1	202461	202493	a	a	+
+chr1	202467	202499	a	a	+
+chr1	202436	202468	b	b	-
+chr1	202473	202505	a	a	+
+chr1	202474	202506	a	a	+
+chr1	202474	202506	a	a	+
+chr1	202483	202515	a	a	+
+chr1	202483	202515	a	a	+
+chr1	202486	202518	a	a	+
+chr1	202487	202519	a	a	+
+chr1	202501	202533	a	a	+
+chr1	202470	202502	b	b	-
+chr1	202480	202512	b	b	-
+chr1	202538	202570	a	a	+
+chr1	202773	202805	a	a	+
+chr1	202780	202812	a	a	+
+chr1	202780	202812	a	a	+
+chr1	202781	202813	a	a	+
+chr1	202783	202815	a	a	+
+chr1	202759	202791	b	b	-
+chr1	202759	202791	b	b	-
+chr1	202795	202827	a	a	+
+chr1	202763	202795	b	b	-
+chr1	202807	202839	a	a	+
+chr1	202807	202839	a	a	+
+chr1	202807	202839	a	a	+
+chr1	202807	202839	a	a	+
+chr1	202808	202840	a	a	+
+chr1	202808	202840	a	a	+
+chr1	202779	202811	b	b	-
+chr1	202814	202846	a	a	+
+chr1	202783	202815	b	b	-
+chr1	202783	202815	b	b	-
+chr1	202784	202816	b	b	-
+chr1	202792	202824	b	b	-
+chr1	202795	202827	b	b	-
+chr1	202831	202863	a	a	+
+chr1	202840	202872	a	a	+
+chr1	202840	202872	a	a	+
+chr1	202855	202887	b	b	-
+chr1	202978	203010	a	a	+
+chr1	202994	203026	a	a	+
+chr1	202998	203030	a	a	+
+chr1	202967	202999	b	b	-
+chr1	203085	203117	b	b	-
+chr1	203168	203200	a	a	+
+chr1	203293	203325	a	a	+
+chr1	203314	203346	b	b	-
+chr1	203364	203396	a	a	+
+chr1	203426	203458	b	b	-
+chr1	203473	203505	a	a	+
+chr1	203488	203520	a	a	+
+chr1	203494	203526	a	a	+
+chr1	203494	203526	a	a	+
+chr1	203505	203537	a	a	+
+chr1	203592	203624	b	b	-
+chr1	203657	203689	a	a	+
+chr1	203657	203689	a	a	+
+chr1	203713	203745	a	a	+
+chr1	203794	203826	a	a	+
+chr1	203777	203809	b	b	-
+chr1	203777	203809	b	b	-
+chr1	203811	203843	a	a	+
+chr1	203920	203952	a	a	+
+chr1	203962	203994	a	a	+
+chr1	204018	204050	a	a	+
+chr1	204040	204072	a	a	+
+chr1	204027	204059	b	b	-
+chr1	204086	204118	b	b	-
+chr1	204096	204128	b	b	-
+chr1	204208	204240	b	b	-
+chr1	204212	204244	b	b	-
+chr1	204235	204267	b	b	-
+chr1	204250	204282	b	b	-
+chr1	204286	204318	a	a	+
+chr1	204289	204321	a	a	+
+chr1	204295	204327	a	a	+
+chr1	204297	204329	a	a	+
+chr1	204300	204332	a	a	+
+chr1	204284	204316	b	b	-
+chr1	204294	204326	b	b	-
+chr1	204334	204366	a	a	+
+chr1	204337	204369	a	a	+
+chr1	204337	204369	a	a	+
+chr1	204337	204369	a	a	+
+chr1	204328	204360	b	b	-
+chr1	204331	204363	b	b	-
+chr1	204343	204375	b	b	-
+chr1	204351	204383	b	b	-
+chr1	204396	204428	a	a	+
+chr1	204364	204396	b	b	-
+chr1	204364	204396	b	b	-
+chr1	204364	204396	b	b	-
+chr1	204424	204456	a	a	+
+chr1	204432	204464	a	a	+
+chr1	204435	204467	a	a	+
+chr1	204419	204451	b	b	-
+chr1	204429	204461	b	b	-
+chr1	204482	204514	a	a	+
+chr1	204482	204514	a	a	+
+chr1	204454	204486	b	b	-
+chr1	204459	204491	b	b	-
+chr1	204459	204491	b	b	-
+chr1	204478	204510	b	b	-
+chr1	204486	204518	b	b	-
+chr1	204499	204531	b	b	-
+chr1	204499	204531	b	b	-
+chr1	204499	204531	b	b	-
+chr1	204535	204567	a	a	+
+chr1	204541	204573	a	a	+
+chr1	204567	204599	a	a	+
+chr1	204570	204602	a	a	+
+chr1	204578	204610	a	a	+
+chr1	204551	204583	b	b	-
+chr1	204554	204586	b	b	-
+chr1	204558	204590	b	b	-
+chr1	204564	204596	b	b	-
+chr1	204617	204649	a	a	+
+chr1	204617	204649	a	a	+
+chr1	204617	204649	a	a	+
+chr1	204589	204621	b	b	-
+chr1	204594	204626	b	b	-
+chr1	204594	204626	b	b	-
+chr1	204640	204672	a	a	+
+chr1	204613	204645	b	b	-
+chr1	204621	204653	b	b	-
+chr1	204666	204698	a	a	+
+chr1	204634	204666	b	b	-
+chr1	204634	204666	b	b	-
+chr1	204634	204666	b	b	-
+chr1	204676	204708	a	a	+
+chr1	204705	204737	a	a	+
+chr1	204711	204743	a	a	+
+chr1	204686	204718	b	b	-
+chr1	204689	204721	b	b	-
+chr1	204693	204725	b	b	-
+chr1	204699	204731	b	b	-
+chr1	204752	204784	a	a	+
+chr1	204752	204784	a	a	+
+chr1	204752	204784	a	a	+
+chr1	204724	204756	b	b	-
+chr1	204729	204761	b	b	-
+chr1	204729	204761	b	b	-
+chr1	204775	204807	a	a	+
+chr1	204748	204780	b	b	-
+chr1	204756	204788	b	b	-
+chr1	204801	204833	a	a	+
+chr1	204769	204801	b	b	-
+chr1	204769	204801	b	b	-
+chr1	204769	204801	b	b	-
+chr1	204811	204843	a	a	+
+chr1	204840	204872	a	a	+
+chr1	204846	204878	a	a	+
+chr1	204821	204853	b	b	-
+chr1	204824	204856	b	b	-
+chr1	204828	204860	b	b	-
+chr1	204832	204864	b	b	-
+chr1	204887	204919	a	a	+
+chr1	204887	204919	a	a	+
+chr1	204887	204919	a	a	+
+chr1	204859	204891	b	b	-
+chr1	204864	204896	b	b	-
+chr1	204864	204896	b	b	-
+chr1	204910	204942	a	a	+
+chr1	204883	204915	b	b	-
+chr1	204936	204968	a	a	+
+chr1	204904	204936	b	b	-
+chr1	204904	204936	b	b	-
+chr1	204904	204936	b	b	-
+chr1	204946	204978	a	a	+
+chr1	204975	205007	a	a	+
+chr1	204981	205013	a	a	+
+chr1	204956	204988	b	b	-
+chr1	204959	204991	b	b	-
+chr1	204963	204995	b	b	-
+chr1	204967	204999	b	b	-
+chr1	205012	205044	a	a	+
+chr1	205015	205047	a	a	+
+chr1	205024	205056	a	a	+
+chr1	204994	205026	b	b	-
+chr1	204999	205031	b	b	-
+chr1	204999	205031	b	b	-
+chr1	205045	205077	a	a	+
+chr1	205018	205050	b	b	-
+chr1	205022	205054	b	b	-
+chr1	205022	205054	b	b	-
+chr1	205071	205103	a	a	+
+chr1	205039	205071	b	b	-
+chr1	205039	205071	b	b	-
+chr1	205039	205071	b	b	-
+chr1	205081	205113	a	a	+
+chr1	205116	205148	a	a	+
+chr1	205085	205117	b	b	-
+chr1	205094	205126	b	b	-
+chr1	205098	205130	b	b	-
+chr1	205102	205134	b	b	-
+chr1	205150	205182	a	a	+
+chr1	205157	205189	a	a	+
+chr1	205157	205189	a	a	+
+chr1	205129	205161	b	b	-
+chr1	205134	205166	b	b	-
+chr1	205134	205166	b	b	-
+chr1	205178	205210	a	a	+
+chr1	205150	205182	b	b	-
+chr1	205153	205185	b	b	-
+chr1	205157	205189	b	b	-
+chr1	205157	205189	b	b	-
+chr1	205161	205193	b	b	-
+chr1	205196	205228	a	a	+
+chr1	205206	205238	a	a	+
+chr1	205174	205206	b	b	-
+chr1	205174	205206	b	b	-
+chr1	205174	205206	b	b	-
+chr1	205216	205248	a	a	+
+chr1	205241	205273	a	a	+
+chr1	205242	205274	a	a	+
+chr1	205242	205274	a	a	+
+chr1	205245	205277	a	a	+
+chr1	205253	205285	a	a	+
+chr1	205226	205258	b	b	-
+chr1	205229	205261	b	b	-
+chr1	205233	205265	b	b	-
+chr1	205237	205269	b	b	-
+chr1	205285	205317	a	a	+
+chr1	205292	205324	a	a	+
+chr1	205292	205324	a	a	+
+chr1	205264	205296	b	b	-
+chr1	205269	205301	b	b	-
+chr1	205269	205301	b	b	-
+chr1	205313	205345	a	a	+
+chr1	205285	205317	b	b	-
+chr1	205288	205320	b	b	-
+chr1	205292	205324	b	b	-
+chr1	205292	205324	b	b	-
+chr1	205296	205328	b	b	-
+chr1	205331	205363	a	a	+
+chr1	205341	205373	a	a	+
+chr1	205309	205341	b	b	-
+chr1	205309	205341	b	b	-
+chr1	205309	205341	b	b	-
+chr1	205351	205383	a	a	+
+chr1	205377	205409	a	a	+
+chr1	205377	205409	a	a	+
+chr1	205380	205412	a	a	+
+chr1	205386	205418	a	a	+
+chr1	205361	205393	b	b	-
+chr1	205364	205396	b	b	-
+chr1	205368	205400	b	b	-
+chr1	205372	205404	b	b	-
+chr1	205417	205449	a	a	+
+chr1	205420	205452	a	a	+
+chr1	205427	205459	a	a	+
+chr1	205427	205459	a	a	+
+chr1	205399	205431	b	b	-
+chr1	205404	205436	b	b	-
+chr1	205404	205436	b	b	-
+chr1	205448	205480	a	a	+
+chr1	205423	205455	b	b	-
+chr1	205476	205508	a	a	+
+chr1	205444	205476	b	b	-
+chr1	205444	205476	b	b	-
+chr1	205444	205476	b	b	-
+chr1	205486	205518	a	a	+
+chr1	205515	205547	a	a	+
+chr1	205521	205553	a	a	+
+chr1	205496	205528	b	b	-
+chr1	205499	205531	b	b	-
+chr1	205503	205535	b	b	-
+chr1	205507	205539	b	b	-
+chr1	205552	205584	a	a	+
+chr1	205555	205587	a	a	+
+chr1	205564	205596	a	a	+
+chr1	205564	205596	a	a	+
+chr1	205534	205566	b	b	-
+chr1	205539	205571	b	b	-
+chr1	205539	205571	b	b	-
+chr1	205584	205616	a	a	+
+chr1	205558	205590	b	b	-
+chr1	205562	205594	b	b	-
+chr1	205566	205598	b	b	-
+chr1	205566	205598	b	b	-
+chr1	205611	205643	a	a	+
+chr1	205583	205615	b	b	-
+chr1	205583	205615	b	b	-
+chr1	205583	205615	b	b	-
+chr1	205621	205653	a	a	+
+chr1	205597	205629	b	b	-
+chr1	205650	205682	a	a	+
+chr1	205656	205688	a	a	+
+chr1	205628	205660	b	b	-
+chr1	205638	205670	b	b	-
+chr1	205672	205704	a	a	+
+chr1	205645	205677	b	b	-
+chr1	205681	205713	a	a	+
+chr1	205649	205681	b	b	-
+chr1	205690	205722	a	a	+
+chr1	205714	205746	a	a	+
+chr1	205718	205750	a	a	+
+chr1	205698	205730	b	b	-
+chr1	205744	205776	a	a	+
+chr1	205722	205754	b	b	-
+chr1	205756	205788	a	a	+
+chr1	205756	205788	a	a	+
+chr1	205759	205791	a	a	+
+chr1	205730	205762	b	b	-
+chr1	205774	205806	a	a	+
+chr1	205789	205821	a	a	+
+chr1	205763	205795	b	b	-
+chr1	205768	205800	b	b	-
+chr1	205803	205835	a	a	+
+chr1	205781	205813	b	b	-
+chr1	205825	205857	a	a	+
+chr1	205859	205891	a	a	+
+chr1	205859	205891	a	a	+
+chr1	205861	205893	a	a	+
+chr1	205833	205865	b	b	-
+chr1	205877	205909	a	a	+
+chr1	205857	205889	b	b	-
+chr1	205893	205925	a	a	+
+chr1	205894	205926	a	a	+
+chr1	205867	205899	b	b	-
+chr1	205906	205938	a	a	+
+chr1	205914	205946	a	a	+
+chr1	205914	205946	a	a	+
+chr1	205915	205947	a	a	+
+chr1	205918	205950	a	a	+
+chr1	205918	205950	a	a	+
+chr1	205924	205956	a	a	+
+chr1	205903	205935	b	b	-
+chr1	205938	205970	a	a	+
+chr1	205948	205980	a	a	+
+chr1	205960	205992	a	a	+
+chr1	205977	206009	a	a	+
+chr1	205988	206020	a	a	+
+chr1	205996	206028	a	a	+
+chr1	205968	206000	b	b	-
+chr1	206014	206046	a	a	+
+chr1	205990	206022	b	b	-
+chr1	206002	206034	b	b	-
+chr1	206044	206076	a	a	+
+chr1	206073	206105	a	a	+
+chr1	206041	206073	b	b	-
+chr1	206083	206115	a	a	+
+chr1	206051	206083	b	b	-
+chr1	206095	206127	a	a	+
+chr1	206129	206161	a	a	+
+chr1	206098	206130	b	b	-
+chr1	206131	206163	a	a	+
+chr1	206161	206193	a	a	+
+chr1	206161	206193	a	a	+
+chr1	206137	206169	b	b	-
+chr1	206179	206211	a	a	+
+chr1	206188	206220	a	a	+
+chr1	206188	206220	a	a	+
+chr1	206190	206222	a	a	+
+chr1	206167	206199	b	b	-
+chr1	206209	206241	a	a	+
+chr1	206179	206211	b	b	-
+chr1	206218	206250	a	a	+
+chr1	206189	206221	b	b	-
+chr1	206254	206286	a	a	+
+chr1	206258	206290	a	a	+
+chr1	206266	206298	a	a	+
+chr1	206236	206268	b	b	-
+chr1	206284	206316	a	a	+
+chr1	206262	206294	b	b	-
+chr1	206296	206328	a	a	+
+chr1	206296	206328	a	a	+
+chr1	206272	206304	b	b	-
+chr1	206314	206346	a	a	+
+chr1	206303	206335	b	b	-
+chr1	206311	206343	b	b	-
+chr1	206347	206379	a	a	+
+chr1	206321	206353	b	b	-
+chr1	206361	206393	a	a	+
+chr1	206374	206406	a	a	+
+chr1	206383	206415	a	a	+
+chr1	206399	206431	a	a	+
+chr1	206399	206431	a	a	+
+chr1	206401	206433	a	a	+
+chr1	206373	206405	b	b	-
+chr1	206417	206449	a	a	+
+chr1	206397	206429	b	b	-
+chr1	206431	206463	a	a	+
+chr1	206431	206463	a	a	+
+chr1	206405	206437	b	b	-
+chr1	206449	206481	a	a	+
+chr1	206464	206496	a	a	+
+chr1	206438	206470	b	b	-
+chr1	206443	206475	b	b	-
+chr1	206478	206510	a	a	+
+chr1	206449	206481	b	b	-
+chr1	206488	206520	a	a	+
+chr1	206459	206491	b	b	-
+chr1	206500	206532	a	a	+
+chr1	206534	206566	a	a	+
+chr1	206534	206566	a	a	+
+chr1	206506	206538	b	b	-
+chr1	206530	206562	b	b	-
+chr1	206589	206621	a	a	+
+chr1	206593	206625	a	a	+
+chr1	206593	206625	a	a	+
+chr1	206599	206631	a	a	+
+chr1	206615	206647	b	b	-
+chr1	206636	206668	b	b	-
+chr1	206636	206668	b	b	-
+chr1	206652	206684	b	b	-
+chr1	206690	206722	b	b	-
+chr1	206762	206794	b	b	-
+chr1	206879	206911	a	a	+
+chr1	206892	206924	a	a	+
+chr1	206870	206902	b	b	-
+chr1	206875	206907	b	b	-
+chr1	206909	206941	a	a	+
+chr1	206932	206964	a	a	+
+chr1	206932	206964	a	a	+
+chr1	206934	206966	a	a	+
+chr1	206934	206966	a	a	+
+chr1	206934	206966	a	a	+
+chr1	206920	206952	b	b	-
+chr1	206920	206952	b	b	-
+chr1	206920	206952	b	b	-
+chr1	206920	206952	b	b	-
+chr1	206958	206990	a	a	+
+chr1	207022	207054	a	a	+
+chr1	206990	207022	b	b	-
+chr1	207060	207092	a	a	+
+chr1	207072	207104	a	a	+
+chr1	207073	207105	a	a	+
+chr1	207073	207105	a	a	+
+chr1	207073	207105	a	a	+
+chr1	207080	207112	a	a	+
+chr1	207091	207123	a	a	+
+chr1	207062	207094	b	b	-
+chr1	207100	207132	a	a	+
+chr1	207102	207134	a	a	+
+chr1	207102	207134	a	a	+
+chr1	207102	207134	a	a	+
+chr1	207071	207103	b	b	-
+chr1	207074	207106	b	b	-
+chr1	207109	207141	a	a	+
+chr1	207079	207111	b	b	-
+chr1	207079	207111	b	b	-
+chr1	207079	207111	b	b	-
+chr1	207089	207121	b	b	-
+chr1	207089	207121	b	b	-
+chr1	207123	207155	a	a	+
+chr1	207123	207155	a	a	+
+chr1	207123	207155	a	a	+
+chr1	207124	207156	a	a	+
+chr1	207124	207156	a	a	+
+chr1	207093	207125	b	b	-
+chr1	207093	207125	b	b	-
+chr1	207094	207126	b	b	-
+chr1	207129	207161	a	a	+
+chr1	207101	207133	b	b	-
+chr1	207139	207171	a	a	+
+chr1	207118	207150	b	b	-
+chr1	207126	207158	b	b	-
+chr1	207179	207211	a	a	+
+chr1	207179	207211	a	a	+
+chr1	207218	207250	b	b	-
+chr1	207224	207256	b	b	-
+chr1	207224	207256	b	b	-
+chr1	207236	207268	b	b	-
+chr1	207274	207306	a	a	+
+chr1	207263	207295	b	b	-
+chr1	207266	207298	b	b	-
+chr1	207271	207303	b	b	-
+chr1	207340	207372	b	b	-
+chr1	207365	207397	b	b	-
+chr1	207430	207462	a	a	+
+chr1	207433	207465	a	a	+
+chr1	207417	207449	b	b	-
+chr1	207451	207483	a	a	+
+chr1	207451	207483	a	a	+
+chr1	207419	207451	b	b	-
+chr1	207419	207451	b	b	-
+chr1	207419	207451	b	b	-
+chr1	207423	207455	b	b	-
+chr1	207467	207499	a	a	+
+chr1	207435	207467	b	b	-
+chr1	207435	207467	b	b	-
+chr1	207441	207473	b	b	-
+chr1	207442	207474	b	b	-
+chr1	207443	207475	b	b	-
+chr1	207480	207512	a	a	+
+chr1	207460	207492	b	b	-
+chr1	207464	207496	b	b	-
+chr1	207532	207564	a	a	+
+chr1	207548	207580	a	a	+
+chr1	207549	207581	b	b	-
+chr1	207570	207602	b	b	-
+chr1	207570	207602	b	b	-
+chr1	207603	207635	a	a	+
+chr1	207605	207637	a	a	+
+chr1	207612	207644	a	a	+
+chr1	207621	207653	a	a	+
+chr1	207598	207630	b	b	-
+chr1	207600	207632	b	b	-
+chr1	207638	207670	a	a	+
+chr1	207638	207670	a	a	+
+chr1	207644	207676	a	a	+
+chr1	207651	207683	a	a	+
+chr1	207653	207685	a	a	+
+chr1	207641	207673	b	b	-
+chr1	207644	207676	b	b	-
+chr1	207646	207678	b	b	-
+chr1	207667	207699	b	b	-
+chr1	207669	207701	b	b	-
+chr1	207686	207718	b	b	-
+chr1	207746	207778	b	b	-
+chr1	207776	207808	b	b	-
+chr1	207812	207844	a	a	+
+chr1	207814	207846	a	a	+
+chr1	207814	207846	a	a	+
+chr1	207814	207846	a	a	+
+chr1	207814	207846	a	a	+
+chr1	207819	207851	a	a	+
+chr1	207791	207823	b	b	-
+chr1	207792	207824	b	b	-
+chr1	207832	207864	a	a	+
+chr1	207803	207835	b	b	-
+chr1	207803	207835	b	b	-
+chr1	207806	207838	b	b	-
+chr1	207845	207877	a	a	+
+chr1	207814	207846	b	b	-
+chr1	207850	207882	a	a	+
+chr1	207822	207854	b	b	-
+chr1	207822	207854	b	b	-
+chr1	207856	207888	a	a	+
+chr1	207873	207905	a	a	+
+chr1	207843	207875	b	b	-
+chr1	207877	207909	a	a	+
+chr1	207877	207909	a	a	+
+chr1	207895	207927	a	a	+
+chr1	207926	207958	a	a	+
+chr1	207926	207958	a	a	+
+chr1	207926	207958	a	a	+
+chr1	207928	207960	a	a	+
+chr1	207939	207971	a	a	+
+chr1	207942	207974	a	a	+
+chr1	207915	207947	b	b	-
+chr1	207925	207957	b	b	-
+chr1	207958	207990	a	a	+
+chr1	207958	207990	a	a	+
+chr1	207958	207990	a	a	+
+chr1	207973	208005	a	a	+
+chr1	207976	208008	a	a	+
+chr1	207948	207980	b	b	-
+chr1	207948	207980	b	b	-
+chr1	207993	208025	a	a	+
+chr1	207993	208025	a	a	+
+chr1	207997	208029	a	a	+
+chr1	208001	208033	a	a	+
+chr1	208001	208033	a	a	+
+chr1	208002	208034	a	a	+
+chr1	208002	208034	a	a	+
+chr1	208005	208037	a	a	+
+chr1	208005	208037	a	a	+
+chr1	208018	208050	a	a	+
+chr1	207988	208020	b	b	-
+chr1	207989	208021	b	b	-
+chr1	208163	208195	a	a	+
+chr1	208137	208169	b	b	-
+chr1	208336	208368	b	b	-
+chr1	208337	208369	b	b	-
+chr1	208371	208403	a	a	+
+chr1	208372	208404	a	a	+
+chr1	208349	208381	b	b	-
+chr1	208355	208387	b	b	-
+chr1	208389	208421	a	a	+
+chr1	208360	208392	b	b	-
+chr1	208399	208431	a	a	+
+chr1	208404	208436	a	a	+
+chr1	208407	208439	a	a	+
+chr1	208407	208439	a	a	+
+chr1	208408	208440	a	a	+
+chr1	208411	208443	a	a	+
+chr1	208386	208418	b	b	-
+chr1	208386	208418	b	b	-
+chr1	208433	208465	a	a	+
+chr1	208402	208434	b	b	-
+chr1	208451	208483	a	a	+
+chr1	208452	208484	a	a	+
+chr1	208452	208484	a	a	+
+chr1	208430	208462	b	b	-
+chr1	208440	208472	b	b	-
+chr1	208478	208510	a	a	+
+chr1	208484	208516	a	a	+
+chr1	208505	208537	a	a	+
+chr1	208505	208537	a	a	+
+chr1	208489	208521	b	b	-
+chr1	208492	208524	b	b	-
+chr1	208516	208548	b	b	-
+chr1	208519	208551	b	b	-
+chr1	208564	208596	a	a	+
+chr1	208565	208597	a	a	+
+chr1	208540	208572	b	b	-
+chr1	208540	208572	b	b	-
+chr1	208543	208575	b	b	-
+chr1	208560	208592	b	b	-
+chr1	208602	208634	a	a	+
+chr1	208696	208728	b	b	-
+chr1	208709	208741	b	b	-
+chr1	208744	208776	a	a	+
+chr1	208745	208777	a	a	+
+chr1	208749	208781	a	a	+
+chr1	208753	208785	a	a	+
+chr1	208753	208785	a	a	+
+chr1	208729	208761	b	b	-
+chr1	208735	208767	b	b	-
+chr1	208750	208782	b	b	-
+chr1	208755	208787	b	b	-
+chr1	208795	208827	a	a	+
+chr1	208795	208827	a	a	+
+chr1	208797	208829	a	a	+
+chr1	208790	208822	b	b	-
+chr1	208830	208862	a	a	+
+chr1	208798	208830	b	b	-
+chr1	208847	208879	a	a	+
+chr1	208847	208879	a	a	+
+chr1	208818	208850	b	b	-
+chr1	208867	208899	b	b	-
+chr1	208867	208899	b	b	-
+chr1	208885	208917	b	b	-
+chr1	208935	208967	a	a	+
+chr1	208935	208967	a	a	+
+chr1	208904	208936	b	b	-
+chr1	208906	208938	b	b	-
+chr1	208906	208938	b	b	-
+chr1	208942	208974	a	a	+
+chr1	208942	208974	a	a	+
+chr1	208954	208986	a	a	+
+chr1	208956	208988	a	a	+
+chr1	208958	208990	a	a	+
+chr1	208959	208991	a	a	+
+chr1	208959	208991	a	a	+
+chr1	208962	208994	a	a	+
+chr1	208930	208962	b	b	-
+chr1	208930	208962	b	b	-
+chr1	208930	208962	b	b	-
+chr1	208934	208966	b	b	-
+chr1	208940	208972	b	b	-
+chr1	208977	209009	a	a	+
+chr1	208982	209014	a	a	+
+chr1	208950	208982	b	b	-
+chr1	208950	208982	b	b	-
+chr1	208953	208985	b	b	-
+chr1	208953	208985	b	b	-
+chr1	208988	209020	a	a	+
+chr1	208957	208989	b	b	-
+chr1	209010	209042	a	a	+
+chr1	209046	209078	a	a	+
+chr1	209046	209078	a	a	+
+chr1	209144	209176	a	a	+
+chr1	209126	209158	b	b	-
+chr1	209182	209214	a	a	+
+chr1	209182	209214	a	a	+
+chr1	209182	209214	b	b	-
+chr1	209217	209249	a	a	+
+chr1	209196	209228	b	b	-
+chr1	209202	209234	b	b	-
+chr1	209216	209248	b	b	-
+chr1	209251	209283	a	a	+
+chr1	209252	209284	a	a	+
+chr1	209223	209255	b	b	-
+chr1	209223	209255	b	b	-
+chr1	209257	209289	a	a	+
+chr1	209225	209257	b	b	-
+chr1	209225	209257	b	b	-
+chr1	209225	209257	b	b	-
+chr1	209225	209257	b	b	-
+chr1	209225	209257	b	b	-
+chr1	209228	209260	b	b	-
+chr1	209231	209263	b	b	-
+chr1	209269	209301	a	a	+
+chr1	209246	209278	b	b	-
+chr1	209280	209312	a	a	+
+chr1	209253	209285	b	b	-
+chr1	209253	209285	b	b	-
+chr1	209254	209286	b	b	-
+chr1	209266	209298	b	b	-
+chr1	209312	209344	a	a	+
+chr1	209312	209344	a	a	+
+chr1	209379	209411	a	a	+
+chr1	209353	209385	b	b	-
+chr1	209387	209419	b	b	-
+chr1	209420	209452	a	a	+
+chr1	209391	209423	b	b	-
+chr1	209626	209658	a	a	+
+chr1	209619	209651	b	b	-
+chr1	209654	209686	a	a	+
+chr1	209663	209695	a	a	+
+chr1	209663	209695	a	a	+
+chr1	209663	209695	a	a	+
+chr1	209716	209748	a	a	+
+chr1	209698	209730	b	b	-
+chr1	209698	209730	b	b	-
+chr1	209736	209768	a	a	+
+chr1	209711	209743	b	b	-
+chr1	209722	209754	b	b	-
+chr1	209722	209754	b	b	-
+chr1	209758	209790	a	a	+
+chr1	209731	209763	b	b	-
+chr1	209751	209783	b	b	-
+chr1	209754	209786	b	b	-
+chr1	209802	209834	a	a	+
+chr1	209803	209835	a	a	+
+chr1	209826	209858	a	a	+
+chr1	209837	209869	a	a	+
+chr1	209807	209839	b	b	-
+chr1	209808	209840	b	b	-
+chr1	209814	209846	b	b	-
+chr1	209815	209847	b	b	-
+chr1	209852	209884	a	a	+
+chr1	209852	209884	a	a	+
+chr1	209907	209939	a	a	+
+chr1	209889	209921	b	b	-
+chr1	209892	209924	b	b	-
+chr1	209900	209932	b	b	-
+chr1	209951	209983	a	a	+
+chr1	209963	209995	b	b	-
+chr1	210006	210038	a	a	+
+chr1	210031	210063	b	b	-
+chr1	210068	210100	a	a	+
+chr1	210072	210104	a	a	+
+chr1	210072	210104	a	a	+
+chr1	210055	210087	b	b	-
+chr1	210097	210129	a	a	+
+chr1	210115	210147	a	a	+
+chr1	210086	210118	b	b	-
+chr1	210106	210138	b	b	-
+chr1	210121	210153	b	b	-
+chr1	210122	210154	b	b	-
+chr1	210125	210157	b	b	-
+chr1	210172	210204	a	a	+
+chr1	210172	210204	a	a	+
+chr1	210227	210259	a	a	+
+chr1	210235	210267	a	a	+
+chr1	210207	210239	b	b	-
+chr1	210243	210275	a	a	+
+chr1	210247	210279	a	a	+
+chr1	210248	210280	a	a	+
+chr1	210257	210289	a	a	+
+chr1	210264	210296	a	a	+
+chr1	210264	210296	a	a	+
+chr1	210265	210297	a	a	+
+chr1	210233	210265	b	b	-
+chr1	210241	210273	b	b	-
+chr1	210241	210273	b	b	-
+chr1	210242	210274	b	b	-
+chr1	210280	210312	a	a	+
+chr1	210280	210312	a	a	+
+chr1	210280	210312	a	a	+
+chr1	210252	210284	b	b	-
+chr1	210252	210284	b	b	-
+chr1	210286	210318	a	a	+
+chr1	210288	210320	a	a	+
+chr1	210292	210324	a	a	+
+chr1	210292	210324	a	a	+
+chr1	210266	210298	b	b	-
+chr1	210266	210298	b	b	-
+chr1	210316	210348	a	a	+
+chr1	210317	210349	a	a	+
+chr1	210317	210349	a	a	+
+chr1	210362	210394	a	a	+
+chr1	210340	210372	b	b	-
+chr1	210392	210424	a	a	+
+chr1	210399	210431	a	a	+
+chr1	210391	210423	b	b	-
+chr1	210398	210430	b	b	-
+chr1	210432	210464	a	a	+
+chr1	210402	210434	b	b	-
+chr1	210455	210487	a	a	+
+chr1	210433	210465	b	b	-
+chr1	210469	210501	a	a	+
+chr1	210437	210469	b	b	-
+chr1	210447	210479	b	b	-
+chr1	210480	210512	a	a	+
+chr1	210480	210512	a	a	+
+chr1	210480	210512	a	a	+
+chr1	210450	210482	b	b	-
+chr1	210465	210497	b	b	-
+chr1	210465	210497	b	b	-
+chr1	210505	210537	a	a	+
+chr1	210616	210648	a	a	+
+chr1	210635	210667	a	a	+
+chr1	210635	210667	a	a	+
+chr1	210608	210640	b	b	-
+chr1	210608	210640	b	b	-
+chr1	210608	210640	b	b	-
+chr1	210649	210681	a	a	+
+chr1	210651	210683	a	a	+
+chr1	210661	210693	a	a	+
+chr1	210640	210672	b	b	-
+chr1	210673	210705	a	a	+
+chr1	210682	210714	a	a	+
+chr1	210654	210686	b	b	-
+chr1	210689	210721	a	a	+
+chr1	210662	210694	b	b	-
+chr1	210662	210694	b	b	-
+chr1	210665	210697	b	b	-
+chr1	210666	210698	b	b	-
+chr1	210684	210716	b	b	-
+chr1	210684	210716	b	b	-
+chr1	210713	210745	b	b	-
+chr1	210746	210778	a	a	+
+chr1	210778	210810	a	a	+
+chr1	210778	210810	a	a	+
+chr1	210790	210822	a	a	+
+chr1	210760	210792	b	b	-
+chr1	210795	210827	a	a	+
+chr1	210874	210906	a	a	+
+chr1	210862	210894	b	b	-
+chr1	210867	210899	b	b	-
+chr1	211029	211061	a	a	+
+chr1	211157	211189	b	b	-
+chr1	211229	211261	a	a	+
+chr1	211244	211276	a	a	+
+chr1	211213	211245	b	b	-
+chr1	211262	211294	a	a	+
+chr1	211262	211294	a	a	+
+chr1	211262	211294	a	a	+
+chr1	211232	211264	b	b	-
+chr1	211232	211264	b	b	-
+chr1	211233	211265	b	b	-
+chr1	211235	211267	b	b	-
+chr1	211236	211268	b	b	-
+chr1	211236	211268	b	b	-
+chr1	211269	211301	a	a	+
+chr1	211269	211301	a	a	+
+chr1	211269	211301	a	a	+
+chr1	211238	211270	b	b	-
+chr1	211238	211270	b	b	-
+chr1	211239	211271	b	b	-
+chr1	211273	211305	a	a	+
+chr1	211274	211306	a	a	+
+chr1	211246	211278	b	b	-
+chr1	211246	211278	b	b	-
+chr1	211246	211278	b	b	-
+chr1	211246	211278	b	b	-
+chr1	211247	211279	b	b	-
+chr1	211247	211279	b	b	-
+chr1	211281	211313	a	a	+
+chr1	211282	211314	a	a	+
+chr1	211282	211314	a	a	+
+chr1	211282	211314	a	a	+
+chr1	211251	211283	b	b	-
+chr1	211262	211294	b	b	-
+chr1	211262	211294	b	b	-
+chr1	211264	211296	b	b	-
+chr1	211270	211302	b	b	-
+chr1	211307	211339	a	a	+
+chr1	211276	211308	b	b	-
+chr1	211276	211308	b	b	-
+chr1	211320	211352	b	b	-
+chr1	211381	211413	b	b	-
+chr1	211419	211451	a	a	+
+chr1	211388	211420	b	b	-
+chr1	211388	211420	b	b	-
+chr1	211427	211459	a	a	+
+chr1	211420	211452	b	b	-
+chr1	211454	211486	a	a	+
+chr1	211462	211494	a	a	+
+chr1	211464	211496	a	a	+
+chr1	211464	211496	a	a	+
+chr1	211466	211498	a	a	+
+chr1	211468	211500	a	a	+
+chr1	211441	211473	b	b	-
+chr1	211489	211521	a	a	+
+chr1	211476	211508	b	b	-
+chr1	211509	211541	a	a	+
+chr1	211486	211518	b	b	-
+chr1	211555	211587	a	a	+
+chr1	211556	211588	a	a	+
+chr1	211563	211595	a	a	+
+chr1	211566	211598	a	a	+
+chr1	211534	211566	b	b	-
+chr1	211543	211575	b	b	-
+chr1	211599	211631	a	a	+
+chr1	211567	211599	b	b	-
+chr1	211567	211599	b	b	-
+chr1	211600	211632	a	a	+
+chr1	211615	211647	a	a	+
+chr1	211631	211663	a	a	+
+chr1	211601	211633	b	b	-
+chr1	211603	211635	b	b	-
+chr1	211668	211700	b	b	-
+chr1	211724	211756	b	b	-
+chr1	211730	211762	b	b	-
+chr1	211766	211798	a	a	+
+chr1	211772	211804	a	a	+
+chr1	211774	211806	a	a	+
+chr1	211778	211810	a	a	+
+chr1	211755	211787	b	b	-
+chr1	211755	211787	b	b	-
+chr1	211793	211825	a	a	+
+chr1	211766	211798	b	b	-
+chr1	211766	211798	b	b	-
+chr1	211775	211807	b	b	-
+chr1	211775	211807	b	b	-
+chr1	211810	211842	a	a	+
+chr1	211781	211813	b	b	-
+chr1	211828	211860	a	a	+
+chr1	211831	211863	a	a	+
+chr1	211820	211852	b	b	-
+chr1	211833	211865	b	b	-
+chr1	211886	211918	a	a	+
+chr1	211895	211927	a	a	+
+chr1	211892	211924	b	b	-
+chr1	211931	211963	a	a	+
+chr1	211912	211944	b	b	-
+chr1	211955	211987	a	a	+
+chr1	211955	211987	a	a	+
+chr1	211942	211974	b	b	-
+chr1	211976	212008	a	a	+
+chr1	211951	211983	b	b	-
+chr1	211956	211988	b	b	-
+chr1	211961	211993	b	b	-
+chr1	211974	212006	b	b	-
+chr1	211974	212006	b	b	-
+chr1	212010	212042	a	a	+
+chr1	212021	212053	a	a	+
+chr1	212021	212053	a	a	+
+chr1	212030	212062	b	b	-
+chr1	212045	212077	b	b	-
+chr1	212059	212091	b	b	-
+chr1	212094	212126	a	a	+
+chr1	212063	212095	b	b	-
+chr1	212063	212095	b	b	-
+chr1	212086	212118	b	b	-
+chr1	212131	212163	a	a	+
+chr1	212131	212163	a	a	+
+chr1	212110	212142	b	b	-
+chr1	212153	212185	a	a	+
+chr1	212155	212187	a	a	+
+chr1	212155	212187	a	a	+
+chr1	212125	212157	b	b	-
+chr1	212168	212200	a	a	+
+chr1	212168	212200	a	a	+
+chr1	212172	212204	a	a	+
+chr1	212162	212194	b	b	-
+chr1	212162	212194	b	b	-
+chr1	212205	212237	a	a	+
+chr1	212186	212218	b	b	-
+chr1	212261	212293	b	b	-
+chr1	212262	212294	b	b	-
+chr1	212265	212297	b	b	-
+chr1	212324	212356	a	a	+
+chr1	212328	212360	a	a	+
+chr1	212347	212379	a	a	+
+chr1	212347	212379	a	a	+
+chr1	212347	212379	a	a	+
+chr1	212333	212365	b	b	-
+chr1	212371	212403	b	b	-
+chr1	212407	212439	a	a	+
+chr1	212408	212440	a	a	+
+chr1	212408	212440	a	a	+
+chr1	212409	212441	a	a	+
+chr1	212409	212441	a	a	+
+chr1	212377	212409	b	b	-
+chr1	212378	212410	b	b	-
+chr1	212465	212497	a	a	+
+chr1	212475	212507	a	a	+
+chr1	212447	212479	b	b	-
+chr1	212448	212480	b	b	-
+chr1	212448	212480	b	b	-
+chr1	212448	212480	b	b	-
+chr1	212459	212491	b	b	-
+chr1	212470	212502	b	b	-
+chr1	212470	212502	b	b	-
+chr1	212470	212502	b	b	-
+chr1	212475	212507	b	b	-
+chr1	212515	212547	a	a	+
+chr1	212486	212518	b	b	-
+chr1	212501	212533	b	b	-
+chr1	212534	212566	a	a	+
+chr1	212538	212570	a	a	+
+chr1	212508	212540	b	b	-
+chr1	212517	212549	b	b	-
+chr1	212517	212549	b	b	-
+chr1	212517	212549	b	b	-
+chr1	212517	212549	b	b	-
+chr1	212552	212584	a	a	+
+chr1	212552	212584	a	a	+
+chr1	212520	212552	b	b	-
+chr1	212559	212591	a	a	+
+chr1	212561	212593	a	a	+
+chr1	212530	212562	b	b	-
+chr1	212569	212601	a	a	+
+chr1	212575	212607	a	a	+
+chr1	212543	212575	b	b	-
+chr1	212583	212615	b	b	-
+chr1	212639	212671	a	a	+
+chr1	212649	212681	a	a	+
+chr1	212649	212681	a	a	+
+chr1	212649	212681	a	a	+
+chr1	212619	212651	b	b	-
+chr1	212656	212688	a	a	+
+chr1	212661	212693	a	a	+
+chr1	212629	212661	b	b	-
+chr1	212667	212699	a	a	+
+chr1	212638	212670	b	b	-
+chr1	212638	212670	b	b	-
+chr1	212641	212673	b	b	-
+chr1	212674	212706	a	a	+
+chr1	212674	212706	a	a	+
+chr1	212680	212712	a	a	+
+chr1	212682	212714	a	a	+
+chr1	212654	212686	b	b	-
+chr1	212655	212687	b	b	-
+chr1	212699	212731	a	a	+
+chr1	212667	212699	b	b	-
+chr1	212667	212699	b	b	-
+chr1	212700	212732	a	a	+
+chr1	212668	212700	b	b	-
+chr1	212711	212743	a	a	+
+chr1	212725	212757	a	a	+
+chr1	212826	212858	a	a	+
+chr1	212803	212835	b	b	-
+chr1	212814	212846	b	b	-
+chr1	212858	212890	a	a	+
+chr1	212859	212891	a	a	+
+chr1	212864	212896	a	a	+
+chr1	212832	212864	b	b	-
+chr1	212833	212865	b	b	-
+chr1	212844	212876	b	b	-
+chr1	212850	212882	b	b	-
+chr1	212913	212945	a	a	+
+chr1	212942	212974	a	a	+
+chr1	213003	213035	a	a	+
+chr1	212977	213009	b	b	-
+chr1	212977	213009	b	b	-
+chr1	212977	213009	b	b	-
+chr1	212977	213009	b	b	-
+chr1	213011	213043	a	a	+
+chr1	213017	213049	a	a	+
+chr1	213030	213062	a	a	+
+chr1	213030	213062	a	a	+
+chr1	213000	213032	b	b	-
+chr1	213036	213068	a	a	+
+chr1	213005	213037	b	b	-
+chr1	213041	213073	a	a	+
+chr1	213042	213074	a	a	+
+chr1	213012	213044	b	b	-
+chr1	213015	213047	b	b	-
+chr1	213064	213096	a	a	+
+chr1	213133	213165	a	a	+
+chr1	213167	213199	a	a	+
+chr1	213171	213203	b	b	-
+chr1	213173	213205	b	b	-
+chr1	213178	213210	b	b	-
+chr1	213220	213252	a	a	+
+chr1	213188	213220	b	b	-
+chr1	213221	213253	a	a	+
+chr1	213192	213224	b	b	-
+chr1	213193	213225	b	b	-
+chr1	213197	213229	b	b	-
+chr1	213197	213229	b	b	-
+chr1	213197	213229	b	b	-
+chr1	213234	213266	a	a	+
+chr1	213205	213237	b	b	-
+chr1	213213	213245	b	b	-
+chr1	213253	213285	a	a	+
+chr1	213297	213329	a	a	+
+chr1	213298	213330	a	a	+
+chr1	213281	213313	b	b	-
+chr1	213317	213349	a	a	+
+chr1	213358	213390	a	a	+
+chr1	213361	213393	a	a	+
+chr1	213333	213365	b	b	-
+chr1	213333	213365	b	b	-
+chr1	213334	213366	b	b	-
+chr1	213342	213374	b	b	-
+chr1	213380	213412	a	a	+
+chr1	213384	213416	a	a	+
+chr1	213384	213416	a	a	+
+chr1	213385	213417	a	a	+
+chr1	213386	213418	a	a	+
+chr1	213402	213434	a	a	+
+chr1	213402	213434	a	a	+
+chr1	213402	213434	a	a	+
+chr1	213441	213473	a	a	+
+chr1	213409	213441	b	b	-
+chr1	213410	213442	b	b	-
+chr1	213427	213459	b	b	-
+chr1	213463	213495	a	a	+
+chr1	213463	213495	a	a	+
+chr1	213500	213532	a	a	+
+chr1	213515	213547	a	a	+
+chr1	213506	213538	b	b	-
+chr1	213539	213571	a	a	+
+chr1	213543	213575	a	a	+
+chr1	213543	213575	a	a	+
+chr1	213543	213575	a	a	+
+chr1	213674	213706	a	a	+
+chr1	213680	213712	a	a	+
+chr1	213680	213712	a	a	+
+chr1	213665	213697	b	b	-
+chr1	213665	213697	b	b	-
+chr1	213665	213697	b	b	-
+chr1	213706	213738	a	a	+
+chr1	213708	213740	a	a	+
+chr1	213718	213750	a	a	+
+chr1	213690	213722	b	b	-
+chr1	213695	213727	b	b	-
+chr1	213739	213771	a	a	+
+chr1	213747	213779	a	a	+
+chr1	213747	213779	a	a	+
+chr1	213830	213862	a	a	+
+chr1	213838	213870	a	a	+
+chr1	213818	213850	b	b	-
+chr1	213857	213889	a	a	+
+chr1	213857	213889	a	a	+
+chr1	213857	213889	a	a	+
+chr1	213831	213863	b	b	-
+chr1	213864	213896	a	a	+
+chr1	213832	213864	b	b	-
+chr1	213833	213865	b	b	-
+chr1	213873	213905	a	a	+
+chr1	213874	213906	a	a	+
+chr1	213876	213908	a	a	+
+chr1	213845	213877	b	b	-
+chr1	213847	213879	b	b	-
+chr1	213881	213913	a	a	+
+chr1	213883	213915	a	a	+
+chr1	213884	213916	a	a	+
+chr1	213884	213916	a	a	+
+chr1	213884	213916	a	a	+
+chr1	213884	213916	a	a	+
+chr1	213884	213916	a	a	+
+chr1	213884	213916	a	a	+
+chr1	213887	213919	a	a	+
+chr1	213894	213926	a	a	+
+chr1	213896	213928	a	a	+
+chr1	213906	213938	b	b	-
+chr1	213986	214018	b	b	-
+chr1	214019	214051	a	a	+
+chr1	213993	214025	b	b	-
+chr1	213994	214026	b	b	-
+chr1	213994	214026	b	b	-
+chr1	214029	214061	a	a	+
+chr1	214032	214064	a	a	+
+chr1	214032	214064	a	a	+
+chr1	214032	214064	a	a	+
+chr1	214003	214035	b	b	-
+chr1	214042	214074	a	a	+
+chr1	214048	214080	a	a	+
+chr1	214048	214080	a	a	+
+chr1	214021	214053	b	b	-
+chr1	214022	214054	b	b	-
+chr1	214022	214054	b	b	-
+chr1	214025	214057	b	b	-
+chr1	214026	214058	b	b	-
+chr1	214027	214059	b	b	-
+chr1	214027	214059	b	b	-
+chr1	214080	214112	a	a	+
+chr1	214069	214101	b	b	-
+chr1	214208	214240	a	a	+
+chr1	214181	214213	b	b	-
+chr1	214181	214213	b	b	-
+chr1	214214	214246	a	a	+
+chr1	214217	214249	a	a	+
+chr1	214220	214252	a	a	+
+chr1	214221	214253	a	a	+
+chr1	214221	214253	a	a	+
+chr1	214232	214264	a	a	+
+chr1	214233	214265	a	a	+
+chr1	214233	214265	a	a	+
+chr1	214233	214265	a	a	+
+chr1	214234	214266	a	a	+
+chr1	214234	214266	a	a	+
+chr1	214237	214269	a	a	+
+chr1	214221	214253	b	b	-
+chr1	214226	214258	b	b	-
+chr1	214263	214295	a	a	+
+chr1	214237	214269	b	b	-
+chr1	214272	214304	a	a	+
+chr1	214272	214304	a	a	+
+chr1	214276	214308	a	a	+
+chr1	214246	214278	b	b	-
+chr1	214246	214278	b	b	-
+chr1	214283	214315	a	a	+
+chr1	214283	214315	a	a	+
+chr1	214259	214291	b	b	-
+chr1	214259	214291	b	b	-
+chr1	214259	214291	b	b	-
+chr1	214259	214291	b	b	-
+chr1	214259	214291	b	b	-
+chr1	214260	214292	b	b	-
+chr1	214260	214292	b	b	-
+chr1	214260	214292	b	b	-
+chr1	214260	214292	b	b	-
+chr1	214293	214325	a	a	+
+chr1	214261	214293	b	b	-
+chr1	214262	214294	b	b	-
+chr1	214267	214299	b	b	-
+chr1	214271	214303	b	b	-
+chr1	214271	214303	b	b	-
+chr1	214304	214336	a	a	+
+chr1	214272	214304	b	b	-
+chr1	214276	214308	b	b	-
+chr1	214311	214343	a	a	+
+chr1	214311	214343	a	a	+
+chr1	214311	214343	a	a	+
+chr1	214311	214343	a	a	+
+chr1	214311	214343	a	a	+
+chr1	214289	214321	b	b	-
+chr1	214325	214357	a	a	+
+chr1	214338	214370	a	a	+
+chr1	214390	214422	a	a	+
+chr1	214373	214405	b	b	-
+chr1	214374	214406	b	b	-
+chr1	214381	214413	b	b	-
+chr1	214458	214490	a	a	+
+chr1	214468	214500	a	a	+
+chr1	214542	214574	a	a	+
+chr1	214693	214725	b	b	-
+chr1	214706	214738	b	b	-
+chr1	214707	214739	b	b	-
+chr1	214707	214739	b	b	-
+chr1	214771	214803	a	a	+
+chr1	214801	214833	a	a	+
+chr1	214801	214833	a	a	+
+chr1	214831	214863	a	a	+
+chr1	214820	214852	b	b	-
+chr1	215175	215207	a	a	+
+chr1	215271	215303	a	a	+
+chr1	215271	215303	a	a	+
+chr1	215271	215303	a	a	+
+chr1	215300	215332	b	b	-
+chr1	215441	215473	b	b	-
+chr1	215614	215646	a	a	+
+chr1	215634	215666	a	a	+
+chr1	215706	215738	a	a	+
+chr1	215706	215738	a	a	+
+chr1	215708	215740	b	b	-
+chr1	215708	215740	b	b	-
+chr1	215776	215808	b	b	-
+chr1	215785	215817	b	b	-
+chr1	215895	215927	b	b	-
+chr1	215944	215976	a	a	+
+chr1	215968	216000	a	a	+
+chr1	215955	215987	b	b	-
+chr1	216007	216039	b	b	-
+chr1	216180	216212	a	a	+
+chr1	216463	216495	b	b	-
+chr1	216472	216504	b	b	-
+chr1	216526	216558	a	a	+
+chr1	216511	216543	b	b	-
+chr1	216515	216547	b	b	-
+chr1	216519	216551	b	b	-
+chr1	216542	216574	b	b	-
+chr1	216550	216582	b	b	-
+chr1	216672	216704	b	b	-
+chr1	216689	216721	b	b	-
+chr1	216728	216760	a	a	+
+chr1	216869	216901	a	a	+
+chr1	216874	216906	a	a	+
+chr1	216874	216906	a	a	+
+chr1	216878	216910	a	a	+
+chr1	216862	216894	b	b	-
+chr1	216895	216927	a	a	+
+chr1	216873	216905	b	b	-
+chr1	216906	216938	b	b	-
+chr1	216978	217010	a	a	+
+chr1	217015	217047	a	a	+
+chr1	217015	217047	a	a	+
+chr1	217015	217047	a	a	+
+chr1	217015	217047	a	a	+
+chr1	217032	217064	b	b	-
+chr1	217122	217154	a	a	+
+chr1	217217	217249	a	a	+
+chr1	217224	217256	a	a	+
+chr1	217225	217257	a	a	+
+chr1	217226	217258	a	a	+
+chr1	217226	217258	a	a	+
+chr1	217195	217227	b	b	-
+chr1	217195	217227	b	b	-
+chr1	217233	217265	a	a	+
+chr1	217201	217233	b	b	-
+chr1	217202	217234	b	b	-
+chr1	217235	217267	a	a	+
+chr1	217204	217236	b	b	-
+chr1	217204	217236	b	b	-
+chr1	217204	217236	b	b	-
+chr1	217207	217239	b	b	-
+chr1	217241	217273	a	a	+
+chr1	217209	217241	b	b	-
+chr1	217209	217241	b	b	-
+chr1	217212	217244	b	b	-
+chr1	217213	217245	b	b	-
+chr1	217214	217246	b	b	-
+chr1	217249	217281	a	a	+
+chr1	217252	217284	a	a	+
+chr1	217221	217253	b	b	-
+chr1	217221	217253	b	b	-
+chr1	217257	217289	a	a	+
+chr1	217257	217289	a	a	+
+chr1	217264	217296	a	a	+
+chr1	217233	217265	b	b	-
+chr1	217238	217270	b	b	-
+chr1	217278	217310	a	a	+
+chr1	217279	217311	a	a	+
+chr1	217281	217313	a	a	+
+chr1	217289	217321	a	a	+
+chr1	217291	217323	a	a	+
+chr1	217299	217331	a	a	+
+chr1	217267	217299	b	b	-
+chr1	217270	217302	b	b	-
+chr1	217285	217317	b	b	-
+chr1	217601	217633	a	a	+
+chr1	217602	217634	a	a	+
+chr1	217602	217634	a	a	+
+chr1	217602	217634	a	a	+
+chr1	217605	217637	a	a	+
+chr1	217605	217637	a	a	+
+chr1	217605	217637	a	a	+
+chr1	217578	217610	b	b	-
+chr1	217611	217643	a	a	+
+chr1	217611	217643	a	a	+
+chr1	217580	217612	b	b	-
+chr1	217616	217648	a	a	+
+chr1	217598	217630	b	b	-
+chr1	217599	217631	b	b	-
+chr1	217599	217631	b	b	-
+chr1	217634	217666	a	a	+
+chr1	217605	217637	b	b	-
+chr1	217606	217638	b	b	-
+chr1	217641	217673	a	a	+
+chr1	217641	217673	a	a	+
+chr1	217641	217673	a	a	+
+chr1	217613	217645	b	b	-
+chr1	217647	217679	a	a	+
+chr1	217618	217650	b	b	-
+chr1	217654	217686	a	a	+
+chr1	217624	217656	b	b	-
+chr1	217626	217658	b	b	-
+chr1	217690	217722	b	b	-
+chr1	217690	217722	b	b	-
+chr1	217690	217722	b	b	-
+chr1	217703	217735	b	b	-
+chr1	217735	217767	b	b	-
+chr1	217744	217776	b	b	-
+chr1	217787	217819	a	a	+
+chr1	217787	217819	a	a	+
+chr1	217763	217795	b	b	-
+chr1	217804	217836	a	a	+
+chr1	217809	217841	a	a	+
+chr1	217830	217862	b	b	-
+chr1	217919	217951	b	b	-
+chr1	217956	217988	a	a	+
+chr1	217963	217995	a	a	+
+chr1	217963	217995	a	a	+
+chr1	217932	217964	b	b	-
+chr1	217966	217998	a	a	+
+chr1	217966	217998	a	a	+
+chr1	217934	217966	b	b	-
+chr1	217935	217967	b	b	-
+chr1	217971	218003	a	a	+
+chr1	217973	218005	a	a	+
+chr1	217980	218012	a	a	+
+chr1	217950	217982	b	b	-
+chr1	217950	217982	b	b	-
+chr1	218015	218047	a	a	+
+chr1	218024	218056	a	a	+
+chr1	218021	218053	b	b	-
+chr1	218031	218063	b	b	-
+chr1	218136	218168	a	a	+
+chr1	218149	218181	b	b	-
+chr1	218183	218215	a	a	+
+chr1	218160	218192	b	b	-
+chr1	218224	218256	a	a	+
+chr1	218264	218296	a	a	+
+chr1	218251	218283	b	b	-
+chr1	218308	218340	a	a	+
+chr1	218282	218314	b	b	-
+chr1	218327	218359	a	a	+
+chr1	218334	218366	a	a	+
+chr1	218341	218373	a	a	+
+chr1	218375	218407	a	a	+
+chr1	218379	218411	b	b	-
+chr1	218415	218447	a	a	+
+chr1	218439	218471	a	a	+
+chr1	218425	218457	b	b	-
+chr1	218506	218538	b	b	-
+chr1	218506	218538	b	b	-
+chr1	218538	218570	b	b	-
+chr1	218608	218640	a	a	+
+chr1	218577	218609	b	b	-
+chr1	218614	218646	a	a	+
+chr1	218650	218682	a	a	+
+chr1	218663	218695	a	a	+
+chr1	218638	218670	b	b	-
+chr1	218648	218680	b	b	-
+chr1	218657	218689	b	b	-
+chr1	218748	218780	a	a	+
+chr1	218724	218756	b	b	-
+chr1	218768	218800	a	a	+
+chr1	218740	218772	b	b	-
+chr1	218775	218807	a	a	+
+chr1	218746	218778	b	b	-
+chr1	218746	218778	b	b	-
+chr1	218756	218788	b	b	-
+chr1	218809	218841	b	b	-
+chr1	218815	218847	b	b	-
+chr1	218821	218853	b	b	-
+chr1	218860	218892	a	a	+
+chr1	218905	218937	a	a	+
+chr1	218890	218922	b	b	-
+chr1	218929	218961	a	a	+
+chr1	218917	218949	b	b	-
+chr1	218974	219006	a	a	+
+chr1	218974	219006	a	a	+
+chr1	218974	219006	a	a	+
+chr1	218974	219006	a	a	+
+chr1	218975	219007	b	b	-
+chr1	219024	219056	a	a	+
+chr1	218992	219024	b	b	-
+chr1	219026	219058	a	a	+
+chr1	219001	219033	b	b	-
+chr1	219063	219095	a	a	+
+chr1	219078	219110	a	a	+
+chr1	219087	219119	a	a	+
+chr1	219070	219102	b	b	-
+chr1	219070	219102	b	b	-
+chr1	219086	219118	b	b	-
+chr1	219133	219165	b	b	-
+chr1	219246	219278	a	a	+
+chr1	219251	219283	a	a	+
+chr1	219221	219253	b	b	-
+chr1	219221	219253	b	b	-
+chr1	219235	219267	b	b	-
+chr1	219236	219268	b	b	-
+chr1	219282	219314	a	a	+
+chr1	219294	219326	a	a	+
+chr1	219401	219433	a	a	+
+chr1	219376	219408	b	b	-
+chr1	219389	219421	b	b	-
+chr1	219394	219426	b	b	-
+chr1	219405	219437	b	b	-
+chr1	219441	219473	a	a	+
+chr1	219409	219441	b	b	-
+chr1	219409	219441	b	b	-
+chr1	219442	219474	a	a	+
+chr1	219477	219509	a	a	+
+chr1	219485	219517	a	a	+
+chr1	219485	219517	a	a	+
+chr1	219515	219547	b	b	-
+chr1	219520	219552	b	b	-
+chr1	219533	219565	b	b	-
+chr1	219589	219621	a	a	+
+chr1	219589	219621	a	a	+
+chr1	219589	219621	a	a	+
+chr1	219593	219625	a	a	+
+chr1	219568	219600	b	b	-
+chr1	219574	219606	b	b	-
+chr1	219612	219644	a	a	+
+chr1	219582	219614	b	b	-
+chr1	219582	219614	b	b	-
+chr1	219615	219647	a	a	+
+chr1	219629	219661	a	a	+
+chr1	219601	219633	b	b	-
+chr1	219645	219677	a	a	+
+chr1	219633	219665	b	b	-
+chr1	219709	219741	b	b	-
+chr1	219742	219774	a	a	+
+chr1	219754	219786	a	a	+
+chr1	219727	219759	b	b	-
+chr1	219727	219759	b	b	-
+chr1	219764	219796	a	a	+
+chr1	219761	219793	b	b	-
+chr1	219786	219818	b	b	-
+chr1	219806	219838	b	b	-
+chr1	219831	219863	b	b	-
+chr1	219868	219900	a	a	+
+chr1	219907	219939	a	a	+
+chr1	219908	219940	a	a	+
+chr1	219908	219940	a	a	+
+chr1	219882	219914	b	b	-
+chr1	219926	219958	a	a	+
+chr1	219902	219934	b	b	-
+chr1	219933	219965	b	b	-
+chr1	219973	220005	a	a	+
+chr1	219973	220005	a	a	+
+chr1	220065	220097	b	b	-
+chr1	220065	220097	b	b	-
+chr1	220122	220154	a	a	+
+chr1	220133	220165	a	a	+
+chr1	220128	220160	b	b	-
+chr1	220175	220207	a	a	+
+chr1	220143	220175	b	b	-
+chr1	220143	220175	b	b	-
+chr1	220177	220209	b	b	-
+chr1	220375	220407	b	b	-
+chr1	220454	220486	a	a	+
+chr1	220505	220537	a	a	+
+chr1	220505	220537	a	a	+
+chr1	220480	220512	b	b	-
+chr1	220513	220545	a	a	+
+chr1	220484	220516	b	b	-
+chr1	220529	220561	a	a	+
+chr1	220500	220532	b	b	-
+chr1	220500	220532	b	b	-
+chr1	220500	220532	b	b	-
+chr1	220503	220535	b	b	-
+chr1	220519	220551	b	b	-
+chr1	220519	220551	b	b	-
+chr1	220519	220551	b	b	-
+chr1	220567	220599	a	a	+
+chr1	220546	220578	b	b	-
+chr1	220589	220621	a	a	+
+chr1	220576	220608	b	b	-
+chr1	220731	220763	a	a	+
+chr1	220736	220768	a	a	+
+chr1	220707	220739	b	b	-
+chr1	220707	220739	b	b	-
+chr1	220717	220749	b	b	-
+chr1	220896	220928	a	a	+
+chr1	220880	220912	b	b	-
+chr1	220881	220913	b	b	-
+chr1	220915	220947	a	a	+
+chr1	220922	220954	a	a	+
+chr1	220922	220954	a	a	+
+chr1	220891	220923	b	b	-
+chr1	221060	221092	a	a	+
+chr1	221079	221111	a	a	+
+chr1	221087	221119	a	a	+
+chr1	221066	221098	b	b	-
+chr1	221109	221141	a	a	+
+chr1	221089	221121	b	b	-
+chr1	221091	221123	b	b	-
+chr1	221093	221125	b	b	-
+chr1	221095	221127	b	b	-
+chr1	221129	221161	a	a	+
+chr1	221129	221161	a	a	+
+chr1	221134	221166	a	a	+
+chr1	221134	221166	a	a	+
+chr1	221135	221167	a	a	+
+chr1	221152	221184	a	a	+
+chr1	221164	221196	a	a	+
+chr1	221132	221164	b	b	-
+chr1	221166	221198	a	a	+
+chr1	221186	221218	a	a	+
+chr1	221156	221188	b	b	-
+chr1	221200	221232	a	a	+
+chr1	221174	221206	b	b	-
+chr1	221216	221248	a	a	+
+chr1	221300	221332	a	a	+
+chr1	221329	221361	a	a	+
+chr1	221349	221381	a	a	+
+chr1	221349	221381	a	a	+
+chr1	221397	221429	a	a	+
+chr1	221409	221441	a	a	+
+chr1	221388	221420	b	b	-
+chr1	221388	221420	b	b	-
+chr1	221388	221420	b	b	-
+chr1	221591	221623	a	a	+
+chr1	221574	221606	b	b	-
+chr1	221612	221644	a	a	+
+chr1	221626	221658	a	a	+
+chr1	221640	221672	a	a	+
+chr1	221640	221672	a	a	+
+chr1	221679	221711	b	b	-
+chr1	221725	221757	a	a	+
+chr1	221757	221789	a	a	+
+chr1	221772	221804	a	a	+
+chr1	221785	221817	b	b	-
+chr1	221790	221822	b	b	-
+chr1	221849	221881	a	a	+
+chr1	221996	222028	a	a	+
+chr1	221970	222002	b	b	-
+chr1	221970	222002	b	b	-
+chr1	222131	222163	b	b	-
+chr1	222131	222163	b	b	-
+chr1	222253	222285	a	a	+
+chr1	222300	222332	a	a	+
+chr1	222300	222332	a	a	+
+chr1	222310	222342	a	a	+
+chr1	222454	222486	a	a	+
+chr1	222470	222502	a	a	+
+chr1	222471	222503	a	a	+
+chr1	222452	222484	b	b	-
+chr1	222496	222528	a	a	+
+chr1	222468	222500	b	b	-
+chr1	222523	222555	a	a	+
+chr1	222618	222650	b	b	-
+chr1	222655	222687	a	a	+
+chr1	222655	222687	a	a	+
+chr1	222656	222688	a	a	+
+chr1	222681	222713	a	a	+
+chr1	222690	222722	a	a	+
+chr1	222658	222690	b	b	-
+chr1	222726	222758	a	a	+
+chr1	222749	222781	a	a	+
+chr1	222751	222783	a	a	+
+chr1	222740	222772	b	b	-
+chr1	222786	222818	a	a	+
+chr1	222761	222793	b	b	-
+chr1	222805	222837	a	a	+
+chr1	222805	222837	a	a	+
+chr1	222774	222806	b	b	-
+chr1	222775	222807	b	b	-
+chr1	222808	222840	a	a	+
+chr1	222808	222840	a	a	+
+chr1	222812	222844	a	a	+
+chr1	222812	222844	a	a	+
+chr1	222812	222844	a	a	+
+chr1	222784	222816	b	b	-
+chr1	222784	222816	b	b	-
+chr1	222819	222851	a	a	+
+chr1	222820	222852	a	a	+
+chr1	222788	222820	b	b	-
+chr1	222788	222820	b	b	-
+chr1	222788	222820	b	b	-
+chr1	222788	222820	b	b	-
+chr1	222789	222821	b	b	-
+chr1	222790	222822	b	b	-
+chr1	222790	222822	b	b	-
+chr1	222823	222855	a	a	+
+chr1	222823	222855	a	a	+
+chr1	222791	222823	b	b	-
+chr1	222794	222826	b	b	-
+chr1	222806	222838	b	b	-
+chr1	222807	222839	b	b	-
+chr1	222807	222839	b	b	-
+chr1	222840	222872	a	a	+
+chr1	222840	222872	a	a	+
+chr1	222842	222874	a	a	+
+chr1	222844	222876	a	a	+
+chr1	222847	222879	a	a	+
+chr1	222847	222879	a	a	+
+chr1	222847	222879	a	a	+
+chr1	222848	222880	a	a	+
+chr1	222848	222880	a	a	+
+chr1	222817	222849	b	b	-
+chr1	222821	222853	b	b	-
+chr1	222821	222853	b	b	-
+chr1	222821	222853	b	b	-
+chr1	222821	222853	b	b	-
+chr1	222821	222853	b	b	-
+chr1	222855	222887	a	a	+
+chr1	222856	222888	a	a	+
+chr1	222855	222887	b	b	-
+chr1	222977	223009	a	a	+
+chr1	223011	223043	a	a	+
+chr1	223011	223043	a	a	+
+chr1	223013	223045	a	a	+
+chr1	222990	223022	b	b	-
+chr1	222990	223022	b	b	-
+chr1	222990	223022	b	b	-
+chr1	222990	223022	b	b	-
+chr1	222991	223023	b	b	-
+chr1	223026	223058	a	a	+
+chr1	222999	223031	b	b	-
+chr1	223007	223039	b	b	-
+chr1	223011	223043	b	b	-
+chr1	223044	223076	a	a	+
+chr1	223048	223080	a	a	+
+chr1	223048	223080	a	a	+
+chr1	223070	223102	a	a	+
+chr1	223225	223257	b	b	-
+chr1	223256	223288	b	b	-
+chr1	223260	223292	b	b	-
+chr1	223275	223307	b	b	-
+chr1	223275	223307	b	b	-
+chr1	223313	223345	a	a	+
+chr1	223314	223346	a	a	+
+chr1	223314	223346	a	a	+
+chr1	223315	223347	a	a	+
+chr1	223283	223315	b	b	-
+chr1	223283	223315	b	b	-
+chr1	223283	223315	b	b	-
+chr1	223316	223348	a	a	+
+chr1	223284	223316	b	b	-
+chr1	223285	223317	b	b	-
+chr1	223321	223353	a	a	+
+chr1	223321	223353	a	a	+
+chr1	223321	223353	a	a	+
+chr1	223321	223353	a	a	+
+chr1	223321	223353	a	a	+
+chr1	223321	223353	a	a	+
+chr1	223321	223353	a	a	+
+chr1	223322	223354	a	a	+
+chr1	223322	223354	a	a	+
+chr1	223322	223354	a	a	+
+chr1	223322	223354	a	a	+
+chr1	223322	223354	a	a	+
+chr1	223322	223354	a	a	+
+chr1	223322	223354	a	a	+
+chr1	223322	223354	a	a	+
+chr1	223322	223354	a	a	+
+chr1	223322	223354	a	a	+
+chr1	223322	223354	a	a	+
+chr1	223290	223322	b	b	-
+chr1	223290	223322	b	b	-
+chr1	223291	223323	b	b	-
+chr1	223324	223356	a	a	+
+chr1	223324	223356	a	a	+
+chr1	223324	223356	a	a	+
+chr1	223293	223325	b	b	-
+chr1	223293	223325	b	b	-
+chr1	223293	223325	b	b	-
+chr1	223293	223325	b	b	-
+chr1	223326	223358	a	a	+
+chr1	223326	223358	a	a	+
+chr1	223327	223359	a	a	+
+chr1	223327	223359	a	a	+
+chr1	223327	223359	a	a	+
+chr1	223296	223328	b	b	-
+chr1	223296	223328	b	b	-
+chr1	223296	223328	b	b	-
+chr1	223296	223328	b	b	-
+chr1	223296	223328	b	b	-
+chr1	223296	223328	b	b	-
+chr1	223296	223328	b	b	-
+chr1	223297	223329	b	b	-
+chr1	223297	223329	b	b	-
+chr1	223297	223329	b	b	-
+chr1	223297	223329	b	b	-
+chr1	223330	223362	a	a	+
+chr1	223330	223362	a	a	+
+chr1	223332	223364	a	a	+
+chr1	223332	223364	a	a	+
+chr1	223332	223364	a	a	+
+chr1	223332	223364	a	a	+
+chr1	223332	223364	a	a	+
+chr1	223334	223366	a	a	+
+chr1	223302	223334	b	b	-
+chr1	223302	223334	b	b	-
+chr1	223302	223334	b	b	-
+chr1	223302	223334	b	b	-
+chr1	223302	223334	b	b	-
+chr1	223302	223334	b	b	-
+chr1	223302	223334	b	b	-
+chr1	223304	223336	b	b	-
+chr1	223304	223336	b	b	-
+chr1	223304	223336	b	b	-
+chr1	223304	223336	b	b	-
+chr1	223304	223336	b	b	-
+chr1	223304	223336	b	b	-
+chr1	223305	223337	b	b	-
+chr1	223305	223337	b	b	-
+chr1	223305	223337	b	b	-
+chr1	223338	223370	a	a	+
+chr1	223346	223378	a	a	+
+chr1	223348	223380	a	a	+
+chr1	223317	223349	b	b	-
+chr1	223377	223409	a	a	+
+chr1	223377	223409	a	a	+
+chr1	223518	223550	a	a	+
+chr1	223518	223550	a	a	+
+chr1	223518	223550	a	a	+
+chr1	223650	223682	a	a	+
+chr1	223650	223682	a	a	+
+chr1	223629	223661	b	b	-
+chr1	223664	223696	a	a	+
+chr1	223642	223674	b	b	-
+chr1	223675	223707	a	a	+
+chr1	223859	223891	a	a	+
+chr1	223831	223863	b	b	-
+chr1	223901	223933	a	a	+
+chr1	223905	223937	a	a	+
+chr1	223873	223905	b	b	-
+chr1	223907	223939	a	a	+
+chr1	223877	223909	b	b	-
+chr1	223881	223913	b	b	-
+chr1	223881	223913	b	b	-
+chr1	223914	223946	a	a	+
+chr1	223914	223946	a	a	+
+chr1	223914	223946	a	a	+
+chr1	223882	223914	b	b	-
+chr1	223882	223914	b	b	-
+chr1	223882	223914	b	b	-
+chr1	223925	223957	a	a	+
+chr1	223935	223967	a	a	+
+chr1	223912	223944	b	b	-
+chr1	224056	224088	a	a	+
+chr1	224066	224098	a	a	+
+chr1	224040	224072	b	b	-
+chr1	224044	224076	b	b	-
+chr1	224046	224078	b	b	-
+chr1	224047	224079	b	b	-
+chr1	224048	224080	b	b	-
+chr1	224052	224084	b	b	-
+chr1	224086	224118	a	a	+
+chr1	224086	224118	a	a	+
+chr1	224086	224118	a	a	+
+chr1	224086	224118	a	a	+
+chr1	224086	224118	a	a	+
+chr1	224086	224118	a	a	+
+chr1	224086	224118	a	a	+
+chr1	224056	224088	b	b	-
+chr1	224103	224135	a	a	+
+chr1	224103	224135	a	a	+
+chr1	224104	224136	a	a	+
+chr1	224117	224149	b	b	-
+chr1	224171	224203	b	b	-
+chr1	224196	224228	b	b	-
+chr1	224201	224233	b	b	-
+chr1	224235	224267	a	a	+
+chr1	224237	224269	a	a	+
+chr1	224205	224237	b	b	-
+chr1	224209	224241	b	b	-
+chr1	224211	224243	b	b	-
+chr1	224211	224243	b	b	-
+chr1	224244	224276	a	a	+
+chr1	224244	224276	a	a	+
+chr1	224212	224244	b	b	-
+chr1	224212	224244	b	b	-
+chr1	224213	224245	b	b	-
+chr1	224247	224279	a	a	+
+chr1	224255	224287	a	a	+
+chr1	224255	224287	a	a	+
+chr1	224227	224259	b	b	-
+chr1	224229	224261	b	b	-
+chr1	224229	224261	b	b	-
+chr1	224236	224268	b	b	-
+chr1	224236	224268	b	b	-
+chr1	224269	224301	a	a	+
+chr1	224244	224276	b	b	-
+chr1	224254	224286	b	b	-
+chr1	224294	224326	a	a	+
+chr1	224315	224347	a	a	+
+chr1	224371	224403	b	b	-
+chr1	224377	224409	b	b	-
+chr1	224416	224448	a	a	+
+chr1	224416	224448	a	a	+
+chr1	224417	224449	a	a	+
+chr1	224400	224432	b	b	-
+chr1	224400	224432	b	b	-
+chr1	224437	224469	a	a	+
+chr1	224437	224469	a	a	+
+chr1	224406	224438	b	b	-
+chr1	224445	224477	b	b	-
+chr1	224502	224534	a	a	+
+chr1	224471	224503	b	b	-
+chr1	224481	224513	b	b	-
+chr1	224489	224521	b	b	-
+chr1	224542	224574	b	b	-
+chr1	224575	224607	a	a	+
+chr1	224589	224621	a	a	+
+chr1	224558	224590	b	b	-
+chr1	224559	224591	b	b	-
+chr1	224595	224627	a	a	+
+chr1	224576	224608	b	b	-
+chr1	224576	224608	b	b	-
+chr1	224593	224625	b	b	-
+chr1	224617	224649	b	b	-
+chr1	224634	224666	b	b	-
+chr1	224676	224708	a	a	+
+chr1	224692	224724	a	a	+
+chr1	224660	224692	b	b	-
+chr1	224704	224736	a	a	+
+chr1	224758	224790	a	a	+
+chr1	224733	224765	b	b	-
+chr1	224782	224814	a	a	+
+chr1	224782	224814	a	a	+
+chr1	224782	224814	a	a	+
+chr1	224909	224941	a	a	+
+chr1	224909	224941	a	a	+
+chr1	224886	224918	b	b	-
+chr1	224923	224955	a	a	+
+chr1	224894	224926	b	b	-
+chr1	224895	224927	b	b	-
+chr1	224934	224966	a	a	+
+chr1	224934	224966	a	a	+
+chr1	224943	224975	a	a	+
+chr1	224916	224948	b	b	-
+chr1	224951	224983	a	a	+
+chr1	224953	224985	a	a	+
+chr1	225000	225032	a	a	+
+chr1	225105	225137	b	b	-
+chr1	225105	225137	b	b	-
+chr1	225105	225137	b	b	-
+chr1	225168	225200	a	a	+
+chr1	225177	225209	a	a	+
+chr1	225146	225178	b	b	-
+chr1	225147	225179	b	b	-
+chr1	225147	225179	b	b	-
+chr1	225185	225217	a	a	+
+chr1	225155	225187	b	b	-
+chr1	225155	225187	b	b	-
+chr1	225155	225187	b	b	-
+chr1	225156	225188	b	b	-
+chr1	225158	225190	b	b	-
+chr1	225192	225224	a	a	+
+chr1	225193	225225	a	a	+
+chr1	225193	225225	a	a	+
+chr1	225162	225194	b	b	-
+chr1	225163	225195	b	b	-
+chr1	225163	225195	b	b	-
+chr1	225198	225230	a	a	+
+chr1	225166	225198	b	b	-
+chr1	225203	225235	a	a	+
+chr1	225203	225235	a	a	+
+chr1	225171	225203	b	b	-
+chr1	225171	225203	b	b	-
+chr1	225205	225237	a	a	+
+chr1	225208	225240	a	a	+
+chr1	225192	225224	b	b	-
+chr1	225193	225225	b	b	-
+chr1	225327	225359	a	a	+
+chr1	225333	225365	a	a	+
+chr1	225306	225338	b	b	-
+chr1	225306	225338	b	b	-
+chr1	225350	225382	a	a	+
+chr1	225350	225382	a	a	+
+chr1	225350	225382	a	a	+
+chr1	225357	225389	a	a	+
+chr1	225358	225390	a	a	+
+chr1	225333	225365	b	b	-
+chr1	225346	225378	b	b	-
+chr1	225350	225382	b	b	-
+chr1	225350	225382	b	b	-
+chr1	225363	225395	b	b	-
+chr1	225413	225445	a	a	+
+chr1	225390	225422	b	b	-
+chr1	225453	225485	b	b	-
+chr1	225528	225560	a	a	+
+chr1	225528	225560	a	a	+
+chr1	225512	225544	b	b	-
+chr1	225512	225544	b	b	-
+chr1	225519	225551	b	b	-
+chr1	225553	225585	a	a	+
+chr1	225710	225742	a	a	+
+chr1	225682	225714	b	b	-
+chr1	225682	225714	b	b	-
+chr1	225727	225759	a	a	+
+chr1	225759	225791	a	a	+
+chr1	225842	225874	b	b	-
+chr1	225888	225920	a	a	+
+chr1	225897	225929	a	a	+
+chr1	226163	226195	a	a	+
+chr1	226301	226333	b	b	-
+chr1	226448	226480	a	a	+
+chr1	226589	226621	a	a	+
+chr1	226589	226621	a	a	+
+chr1	226567	226599	b	b	-
+chr1	226609	226641	a	a	+
+chr1	226588	226620	b	b	-
+chr1	226596	226628	b	b	-
+chr1	226604	226636	b	b	-
+chr1	226604	226636	b	b	-
+chr1	226637	226669	a	a	+
+chr1	226622	226654	b	b	-
+chr1	226678	226710	b	b	-
+chr1	226697	226729	b	b	-
+chr1	226750	226782	a	a	+
+chr1	226769	226801	a	a	+
+chr1	226743	226775	b	b	-
+chr1	226745	226777	b	b	-
+chr1	226745	226777	b	b	-
+chr1	226745	226777	b	b	-
+chr1	226745	226777	b	b	-
+chr1	226745	226777	b	b	-
+chr1	226745	226777	b	b	-
+chr1	226778	226810	a	a	+
+chr1	226778	226810	a	a	+
+chr1	226778	226810	a	a	+
+chr1	226779	226811	a	a	+
+chr1	226779	226811	a	a	+
+chr1	226751	226783	b	b	-
+chr1	226751	226783	b	b	-
+chr1	226751	226783	b	b	-
+chr1	226751	226783	b	b	-
+chr1	226751	226783	b	b	-
+chr1	226751	226783	b	b	-
+chr1	226751	226783	b	b	-
+chr1	226751	226783	b	b	-
+chr1	226784	226816	a	a	+
+chr1	226784	226816	a	a	+
+chr1	226784	226816	a	a	+
+chr1	226785	226817	a	a	+
+chr1	226785	226817	a	a	+
+chr1	226754	226786	b	b	-
+chr1	226787	226819	a	a	+
+chr1	226795	226827	a	a	+
+chr1	226795	226827	a	a	+
+chr1	226795	226827	a	a	+
+chr1	226803	226835	a	a	+
+chr1	226814	226846	a	a	+
+chr1	226993	227025	a	a	+
+chr1	227043	227075	a	a	+
+chr1	227052	227084	a	a	+
+chr1	227052	227084	a	a	+
+chr1	227022	227054	b	b	-
+chr1	227038	227070	b	b	-
+chr1	227067	227099	b	b	-
+chr1	227165	227197	b	b	-
+chr1	227198	227230	a	a	+
+chr1	227198	227230	a	a	+
+chr1	227167	227199	b	b	-
+chr1	227171	227203	b	b	-
+chr1	227172	227204	b	b	-
+chr1	227174	227206	b	b	-
+chr1	227174	227206	b	b	-
+chr1	227208	227240	a	a	+
+chr1	227208	227240	a	a	+
+chr1	227221	227253	a	a	+
+chr1	227221	227253	a	a	+
+chr1	227222	227254	a	a	+
+chr1	227222	227254	a	a	+
+chr1	227222	227254	a	a	+
+chr1	227223	227255	a	a	+
+chr1	227223	227255	a	a	+
+chr1	227191	227223	b	b	-
+chr1	227191	227223	b	b	-
+chr1	227191	227223	b	b	-
+chr1	227193	227225	b	b	-
+chr1	227194	227226	b	b	-
+chr1	227229	227261	a	a	+
+chr1	227230	227262	a	a	+
+chr1	227230	227262	a	a	+
+chr1	227232	227264	a	a	+
+chr1	227233	227265	a	a	+
+chr1	227233	227265	a	a	+
+chr1	227204	227236	b	b	-
+chr1	227204	227236	b	b	-
+chr1	227213	227245	b	b	-
+chr1	227246	227278	a	a	+
+chr1	227216	227248	b	b	-
+chr1	227251	227283	a	a	+
+chr1	227261	227293	a	a	+
+chr1	227265	227297	a	a	+
+chr1	227247	227279	b	b	-
+chr1	227455	227487	b	b	-
+chr1	227464	227496	b	b	-
+chr1	227472	227504	b	b	-
+chr1	227472	227504	b	b	-
+chr1	227474	227506	b	b	-
+chr1	227514	227546	a	a	+
+chr1	227493	227525	b	b	-
+chr1	227493	227525	b	b	-
+chr1	227494	227526	b	b	-
+chr1	227533	227565	a	a	+
+chr1	227505	227537	b	b	-
+chr1	227541	227573	a	a	+
+chr1	227681	227713	b	b	-
+chr1	227745	227777	a	a	+
+chr1	227744	227776	b	b	-
+chr1	227802	227834	a	a	+
+chr1	227873	227905	a	a	+
+chr1	228015	228047	a	a	+
+chr1	228071	228103	a	a	+
+chr1	228089	228121	a	a	+
+chr1	228092	228124	b	b	-
+chr1	228303	228335	b	b	-
+chr1	228303	228335	b	b	-
+chr1	228314	228346	b	b	-
+chr1	228314	228346	b	b	-
+chr1	228419	228451	a	a	+
+chr1	228481	228513	a	a	+
+chr1	228592	228624	b	b	-
+chr1	228671	228703	a	a	+
+chr1	228839	228871	b	b	-
+chr1	228876	228908	a	a	+
+chr1	228987	229019	a	a	+
+chr1	228965	228997	b	b	-
+chr1	229062	229094	b	b	-
+chr1	229127	229159	b	b	-
+chr1	229571	229603	b	b	-
+chr1	229916	229948	a	a	+
+chr1	229916	229948	a	a	+
+chr2	47	79	b	b	-
+chr2	88	120	a	a	+
+chr2	144	176	a	a	+
+chr2	146	178	a	a	+
+chr2	114	146	b	b	-
+chr2	136	168	b	b	-
+chr2	138	170	b	b	-
+chr2	176	208	a	a	+
+chr2	176	208	a	a	+
+chr2	144	176	b	b	-
+chr2	144	176	b	b	-
+chr2	177	209	a	a	+
+chr2	177	209	a	a	+
+chr2	177	209	a	a	+
+chr2	177	209	a	a	+
+chr2	145	177	b	b	-
+chr2	182	214	a	a	+
+chr2	167	199	b	b	-
+chr2	200	232	a	a	+
+chr2	200	232	a	a	+
+chr2	200	232	a	a	+
+chr2	200	232	a	a	+
+chr2	200	232	a	a	+
+chr2	201	233	a	a	+
+chr2	204	236	a	a	+
+chr2	204	236	a	a	+
+chr2	204	236	a	a	+
+chr2	204	236	a	a	+
+chr2	175	207	b	b	-
+chr2	175	207	b	b	-
+chr2	175	207	b	b	-
+chr2	179	211	b	b	-
+chr2	181	213	b	b	-
+chr2	215	247	a	a	+
+chr2	215	247	a	a	+
+chr2	184	216	b	b	-
+chr2	187	219	b	b	-
+chr2	222	254	a	a	+
+chr2	222	254	a	a	+
+chr2	198	230	b	b	-
+chr2	202	234	b	b	-
+chr2	204	236	b	b	-
+chr2	204	236	b	b	-
+chr2	204	236	b	b	-
+chr2	204	236	b	b	-
+chr2	204	236	b	b	-
+chr2	204	236	b	b	-
+chr2	204	236	b	b	-
+chr2	237	269	a	a	+
+chr2	205	237	b	b	-
+chr2	208	240	b	b	-
+chr2	208	240	b	b	-
+chr2	208	240	b	b	-
+chr2	208	240	b	b	-
+chr2	212	244	b	b	-
+chr2	212	244	b	b	-
+chr2	247	279	a	a	+
+chr2	247	279	a	a	+
+chr2	247	279	a	a	+
+chr2	258	290	a	a	+
+chr2	258	290	a	a	+
+chr2	258	290	a	a	+
+chr2	232	264	b	b	-
+chr2	232	264	b	b	-
+chr2	249	281	b	b	-
+chr2	249	281	b	b	-
+chr2	249	281	b	b	-
+chr2	308	340	a	a	+
+chr2	303	335	b	b	-
+chr2	339	371	a	a	+
+chr2	340	372	a	a	+
+chr2	340	372	a	a	+
+chr2	340	372	a	a	+
+chr2	355	387	a	a	+
+chr2	326	358	b	b	-
+chr2	332	364	b	b	-
+chr2	370	402	a	a	+
+chr2	370	402	a	a	+
+chr2	373	405	a	a	+
+chr2	343	375	b	b	-
+chr2	350	382	b	b	-
+chr2	358	390	b	b	-
+chr2	359	391	b	b	-
+chr2	397	429	a	a	+
+chr2	398	430	a	a	+
+chr2	399	431	a	a	+
+chr2	399	431	a	a	+
+chr2	399	431	a	a	+
+chr2	399	431	a	a	+
+chr2	399	431	a	a	+
+chr2	367	399	b	b	-
+chr2	367	399	b	b	-
+chr2	367	399	b	b	-
+chr2	402	434	a	a	+
+chr2	402	434	a	a	+
+chr2	402	434	a	a	+
+chr2	402	434	a	a	+
+chr2	402	434	a	a	+
+chr2	402	434	a	a	+
+chr2	403	435	a	a	+
+chr2	403	435	a	a	+
+chr2	404	436	a	a	+
+chr2	404	436	a	a	+
+chr2	404	436	a	a	+
+chr2	407	439	a	a	+
+chr2	407	439	a	a	+
+chr2	377	409	b	b	-
+chr2	377	409	b	b	-
+chr2	377	409	b	b	-
+chr2	377	409	b	b	-
+chr2	378	410	b	b	-
+chr2	378	410	b	b	-
+chr2	378	410	b	b	-
+chr2	411	443	a	a	+
+chr2	413	445	a	a	+
+chr2	382	414	b	b	-
+chr2	382	414	b	b	-
+chr2	383	415	b	b	-
+chr2	384	416	b	b	-
+chr2	384	416	b	b	-
+chr2	417	449	a	a	+
+chr2	385	417	b	b	-
+chr2	385	417	b	b	-
+chr2	419	451	a	a	+
+chr2	389	421	b	b	-
+chr2	424	456	a	a	+
+chr2	392	424	b	b	-
+chr2	427	459	a	a	+
+chr2	427	459	a	a	+
+chr2	395	427	b	b	-
+chr2	428	460	a	a	+
+chr2	428	460	a	a	+
+chr2	428	460	a	a	+
+chr2	428	460	a	a	+
+chr2	428	460	a	a	+
+chr2	429	461	a	a	+
+chr2	429	461	a	a	+
+chr2	430	462	a	a	+
+chr2	430	462	a	a	+
+chr2	430	462	a	a	+
+chr2	399	431	b	b	-
+chr2	400	432	b	b	-
+chr2	400	432	b	b	-
+chr2	437	469	a	a	+
+chr2	405	437	b	b	-
+chr2	438	470	a	a	+
+chr2	439	471	a	a	+
+chr2	440	472	a	a	+
+chr2	445	477	a	a	+
+chr2	416	448	b	b	-
+chr2	449	481	a	a	+
+chr2	424	456	b	b	-
+chr2	424	456	b	b	-
+chr2	424	456	b	b	-
+chr2	425	457	b	b	-
+chr2	426	458	b	b	-
+chr2	468	500	a	a	+
+chr2	437	469	b	b	-
+chr2	440	472	b	b	-
+chr2	447	479	b	b	-
+chr2	461	493	b	b	-
+chr2	506	538	a	a	+
+chr2	506	538	a	a	+
+chr2	484	516	b	b	-
+chr2	485	517	b	b	-
+chr2	529	561	a	a	+
+chr2	503	535	b	b	-
+chr2	513	545	b	b	-
+chr2	513	545	b	b	-
+chr2	514	546	b	b	-
+chr2	514	546	b	b	-
+chr2	515	547	b	b	-
+chr2	548	580	a	a	+
+chr2	558	590	a	a	+
+chr2	564	596	a	a	+
+chr2	564	596	a	a	+
+chr2	533	565	b	b	-
+chr2	567	599	a	a	+
+chr2	552	584	b	b	-
+chr2	587	619	a	a	+
+chr2	589	621	a	a	+
+chr2	589	621	a	a	+
+chr2	592	624	a	a	+
+chr2	592	624	a	a	+
+chr2	595	627	a	a	+
+chr2	563	595	b	b	-
+chr2	568	600	b	b	-
+chr2	569	601	b	b	-
+chr2	569	601	b	b	-
+chr2	570	602	b	b	-
+chr2	570	602	b	b	-
+chr2	604	636	a	a	+
+chr2	610	642	a	a	+
+chr2	611	643	a	a	+
+chr2	581	613	b	b	-
+chr2	615	647	a	a	+
+chr2	589	621	b	b	-
+chr2	628	660	a	a	+
+chr2	630	662	a	a	+
+chr2	599	631	b	b	-
+chr2	608	640	b	b	-
+chr2	643	675	a	a	+
+chr2	616	648	b	b	-
+chr2	617	649	b	b	-
+chr2	659	691	a	a	+
+chr2	641	673	b	b	-
+chr2	683	715	a	a	+
+chr2	654	686	b	b	-
+chr2	654	686	b	b	-
+chr2	687	719	a	a	+
+chr2	661	693	b	b	-
+chr2	661	693	b	b	-
+chr2	696	728	a	a	+
+chr2	672	704	b	b	-
+chr2	684	716	b	b	-
+chr2	686	718	b	b	-
+chr2	695	727	b	b	-
+chr2	744	776	a	a	+
+chr2	748	780	a	a	+
+chr2	749	781	a	a	+
+chr2	722	754	b	b	-
+chr2	722	754	b	b	-
+chr2	724	756	b	b	-
+chr2	724	756	b	b	-
+chr2	724	756	b	b	-
+chr2	724	756	b	b	-
+chr2	728	760	b	b	-
+chr2	729	761	b	b	-
+chr2	733	765	b	b	-
+chr2	767	799	a	a	+
+chr2	747	779	b	b	-
+chr2	782	814	a	a	+
+chr2	750	782	b	b	-
+chr2	803	835	a	a	+
+chr2	803	835	a	a	+
+chr2	826	858	a	a	+
+chr2	842	874	a	a	+
+chr2	842	874	a	a	+
+chr2	852	884	a	a	+
+chr2	824	856	b	b	-
+chr2	830	862	b	b	-
+chr2	831	863	b	b	-
+chr2	873	905	a	a	+
+chr2	847	879	b	b	-
+chr2	849	881	b	b	-
+chr2	877	909	b	b	-
+chr2	899	931	b	b	-
+chr2	939	971	a	a	+
+chr2	940	972	a	a	+
+chr2	940	972	a	a	+
+chr2	909	941	b	b	-
+chr2	919	951	b	b	-
+chr2	921	953	b	b	-
+chr2	954	986	a	a	+
+chr2	924	956	b	b	-
+chr2	924	956	b	b	-
+chr2	962	994	a	a	+
+chr2	950	982	b	b	-
+chr2	952	984	b	b	-
+chr2	974	1006	b	b	-
+chr2	978	1010	b	b	-
+chr2	1023	1055	a	a	+
+chr2	998	1030	b	b	-
+chr2	1007	1039	b	b	-
+chr2	1048	1080	a	a	+
+chr2	1075	1107	a	a	+
+chr2	1088	1120	a	a	+
+chr2	1090	1122	a	a	+
+chr2	1071	1103	b	b	-
+chr2	1112	1144	a	a	+
+chr2	1081	1113	b	b	-
+chr2	1081	1113	b	b	-
+chr2	1091	1123	b	b	-
+chr2	1107	1139	b	b	-
+chr2	1115	1147	b	b	-
+chr2	1142	1174	b	b	-
+chr2	1142	1174	b	b	-
+chr2	1142	1174	b	b	-
+chr2	1145	1177	b	b	-
+chr2	1145	1177	b	b	-
+chr2	1189	1221	a	a	+
+chr2	1174	1206	b	b	-
+chr2	1191	1223	b	b	-
+chr2	1247	1279	a	a	+
+chr2	1230	1262	b	b	-
+chr2	1243	1275	b	b	-
+chr2	1274	1306	b	b	-
+chr2	1285	1317	b	b	-
+chr2	1358	1390	a	a	+
+chr2	1373	1405	a	a	+
+chr2	1354	1386	b	b	-
+chr2	1406	1438	a	a	+
+chr2	1375	1407	b	b	-
+chr2	1409	1441	a	a	+
+chr2	1410	1442	a	a	+
+chr2	1386	1418	b	b	-
+chr2	1389	1421	b	b	-
+chr2	1414	1446	b	b	-
+chr2	1449	1481	a	a	+
+chr2	1455	1487	a	a	+
+chr2	1441	1473	b	b	-
+chr2	1483	1515	a	a	+
+chr2	1489	1521	a	a	+
+chr2	1471	1503	b	b	-
+chr2	1473	1505	b	b	-
+chr2	1473	1505	b	b	-
+chr2	1473	1505	b	b	-
+chr2	1477	1509	b	b	-
+chr2	1477	1509	b	b	-
+chr2	1477	1509	b	b	-
+chr2	1479	1511	b	b	-
+chr2	1479	1511	b	b	-
+chr2	1512	1544	a	a	+
+chr2	1482	1514	b	b	-
+chr2	1484	1516	b	b	-
+chr2	1484	1516	b	b	-
+chr2	1485	1517	b	b	-
+chr2	1485	1517	b	b	-
+chr2	1488	1520	b	b	-
+chr2	1497	1529	b	b	-
+chr2	1503	1535	b	b	-
+chr2	1537	1569	a	a	+
+chr2	1509	1541	b	b	-
+chr2	1513	1545	b	b	-
+chr2	1515	1547	b	b	-
+chr2	1515	1547	b	b	-
+chr2	1520	1552	b	b	-
+chr2	1520	1552	b	b	-
+chr2	1521	1553	b	b	-
+chr2	1521	1553	b	b	-
+chr2	1524	1556	b	b	-
+chr2	1559	1591	a	a	+
+chr2	1531	1563	b	b	-
+chr2	1531	1563	b	b	-
+chr2	1533	1565	b	b	-
+chr2	1568	1600	a	a	+
+chr2	1536	1568	b	b	-
+chr2	1570	1602	a	a	+
+chr2	1571	1603	a	a	+
+chr2	1571	1603	a	a	+
+chr2	1571	1603	a	a	+
+chr2	1577	1609	a	a	+
+chr2	1545	1577	b	b	-
+chr2	1545	1577	b	b	-
+chr2	1551	1583	b	b	-
+chr2	1585	1617	a	a	+
+chr2	1585	1617	a	a	+
+chr2	1554	1586	b	b	-
+chr2	1588	1620	a	a	+
+chr2	1604	1636	a	a	+
+chr2	1607	1639	a	a	+
+chr2	1607	1639	a	a	+
+chr2	1579	1611	b	b	-
+chr2	1613	1645	a	a	+
+chr2	1581	1613	b	b	-
+chr2	1585	1617	b	b	-
+chr2	1585	1617	b	b	-
+chr2	1586	1618	b	b	-
+chr2	1587	1619	b	b	-
+chr2	1621	1653	a	a	+
+chr2	1621	1653	a	a	+
+chr2	1593	1625	b	b	-
+chr2	1596	1628	b	b	-
+chr2	1603	1635	b	b	-
+chr2	1605	1637	b	b	-
+chr2	1640	1672	a	a	+
+chr2	1643	1675	a	a	+
+chr2	1611	1643	b	b	-
+chr2	1644	1676	a	a	+
+chr2	1644	1676	a	a	+
+chr2	1649	1681	a	a	+
+chr2	1649	1681	a	a	+
+chr2	1617	1649	b	b	-
+chr2	1652	1684	a	a	+
+chr2	1621	1653	b	b	-
+chr2	1623	1655	b	b	-
+chr2	1623	1655	b	b	-
+chr2	1657	1689	a	a	+
+chr2	1658	1690	a	a	+
+chr2	1626	1658	b	b	-
+chr2	1628	1660	b	b	-
+chr2	1628	1660	b	b	-
+chr2	1629	1661	b	b	-
+chr2	1663	1695	a	a	+
+chr2	1680	1712	a	a	+
+chr2	1680	1712	a	a	+
+chr2	1653	1685	b	b	-
+chr2	1653	1685	b	b	-
+chr2	1657	1689	b	b	-
+chr2	1658	1690	b	b	-
+chr2	1663	1695	b	b	-
+chr2	1663	1695	b	b	-
+chr2	1663	1695	b	b	-
+chr2	1699	1731	a	a	+
+chr2	1672	1704	b	b	-
+chr2	1672	1704	b	b	-
+chr2	1680	1712	b	b	-
+chr2	1714	1746	a	a	+
+chr2	1715	1747	a	a	+
+chr2	1689	1721	b	b	-
+chr2	1693	1725	b	b	-
+chr2	1695	1727	b	b	-
+chr2	1695	1727	b	b	-
+chr2	1698	1730	b	b	-
+chr2	1698	1730	b	b	-
+chr2	1698	1730	b	b	-
+chr2	1706	1738	b	b	-
+chr2	1739	1771	a	a	+
+chr2	1739	1771	a	a	+
+chr2	1748	1780	a	a	+
+chr2	1723	1755	b	b	-
+chr2	1725	1757	b	b	-
+chr2	1725	1757	b	b	-
+chr2	1760	1792	a	a	+
+chr2	1760	1792	a	a	+
+chr2	1761	1793	a	a	+
+chr2	1729	1761	b	b	-
+chr2	1729	1761	b	b	-
+chr2	1729	1761	b	b	-
+chr2	1731	1763	b	b	-
+chr2	1731	1763	b	b	-
+chr2	1734	1766	b	b	-
+chr2	1734	1766	b	b	-
+chr2	1734	1766	b	b	-
+chr2	1742	1774	b	b	-
+chr2	1749	1781	b	b	-
+chr2	1782	1814	a	a	+
+chr2	1785	1817	a	a	+
+chr2	1788	1820	a	a	+
+chr2	1788	1820	a	a	+
+chr2	1759	1791	b	b	-
+chr2	1793	1825	a	a	+
+chr2	1793	1825	a	a	+
+chr2	1761	1793	b	b	-
+chr2	1761	1793	b	b	-
+chr2	1796	1828	a	a	+
+chr2	1765	1797	b	b	-
+chr2	1765	1797	b	b	-
+chr2	1767	1799	b	b	-
+chr2	1767	1799	b	b	-
+chr2	1801	1833	a	a	+
+chr2	1802	1834	a	a	+
+chr2	1770	1802	b	b	-
+chr2	1770	1802	b	b	-
+chr2	1807	1839	a	a	+
+chr2	1807	1839	a	a	+
+chr2	1778	1810	b	b	-
+chr2	1818	1850	a	a	+
+chr2	1820	1852	a	a	+
+chr2	1823	1855	a	a	+
+chr2	1824	1856	a	a	+
+chr2	1829	1861	a	a	+
+chr2	1829	1861	a	a	+
+chr2	1797	1829	b	b	-
+chr2	1832	1864	a	a	+
+chr2	1801	1833	b	b	-
+chr2	1802	1834	b	b	-
+chr2	1803	1835	b	b	-
+chr2	1807	1839	b	b	-
+chr2	1807	1839	b	b	-
+chr2	1840	1872	a	a	+
+chr2	1840	1872	a	a	+
+chr2	1845	1877	a	a	+
+chr2	1819	1851	b	b	-
+chr2	1856	1888	a	a	+
+chr2	1859	1891	a	a	+
+chr2	1859	1891	a	a	+
+chr2	1859	1891	a	a	+
+chr2	1868	1900	a	a	+
+chr2	1837	1869	b	b	-
+chr2	1837	1869	b	b	-
+chr2	1839	1871	b	b	-
+chr2	1842	1874	b	b	-
+chr2	1842	1874	b	b	-
+chr2	1842	1874	b	b	-
+chr2	1894	1926	a	a	+
+chr2	1895	1927	a	a	+
+chr2	1895	1927	a	a	+
+chr2	1869	1901	b	b	-
+chr2	1873	1905	b	b	-
+chr2	1874	1906	b	b	-
+chr2	1879	1911	b	b	-
+chr2	1879	1911	b	b	-
+chr2	1884	1916	b	b	-
+chr2	1891	1923	b	b	-
+chr2	1891	1923	b	b	-
+chr2	1891	1923	b	b	-
+chr2	1891	1923	b	b	-
+chr2	1928	1960	a	a	+
+chr2	1929	1961	a	a	+
+chr2	1930	1962	a	a	+
+chr2	1931	1963	a	a	+
+chr2	1931	1963	a	a	+
+chr2	1932	1964	a	a	+
+chr2	1932	1964	a	a	+
+chr2	1940	1972	a	a	+
+chr2	1932	1964	b	b	-
+chr2	1965	1997	a	a	+
+chr2	1966	1998	a	a	+
+chr2	1967	1999	a	a	+
+chr2	1941	1973	b	b	-
+chr2	1941	1973	b	b	-
+chr2	1947	1979	b	b	-
+chr2	1947	1979	b	b	-
+chr2	1950	1982	b	b	-
+chr2	1950	1982	b	b	-
+chr2	1950	1982	b	b	-
+chr2	2005	2037	a	a	+
+chr2	1981	2013	b	b	-
+chr2	1987	2019	b	b	-
+chr2	1987	2019	b	b	-
+chr2	1987	2019	b	b	-
+chr2	1992	2024	b	b	-
+chr2	2001	2033	b	b	-
+chr2	2037	2069	a	a	+
+chr2	2039	2071	a	a	+
+chr2	2040	2072	a	a	+
+chr2	2040	2072	a	a	+
+chr2	2011	2043	b	b	-
+chr2	2045	2077	a	a	+
+chr2	2013	2045	b	b	-
+chr2	2013	2045	b	b	-
+chr2	2013	2045	b	b	-
+chr2	2013	2045	b	b	-
+chr2	2013	2045	b	b	-
+chr2	2013	2045	b	b	-
+chr2	2019	2051	b	b	-
+chr2	2019	2051	b	b	-
+chr2	2053	2085	a	a	+
+chr2	2022	2054	b	b	-
+chr2	2022	2054	b	b	-
+chr2	2022	2054	b	b	-
+chr2	2030	2062	b	b	-
+chr2	2077	2109	a	a	+
+chr2	2083	2115	a	a	+
+chr2	2053	2085	b	b	-
+chr2	2054	2086	b	b	-
+chr2	2089	2121	a	a	+
+chr2	2059	2091	b	b	-
+chr2	2064	2096	b	b	-
+chr2	2071	2103	b	b	-
+chr2	2071	2103	b	b	-
+chr2	2073	2105	b	b	-
+chr2	2108	2140	a	a	+
+chr2	2076	2108	b	b	-
+chr2	2110	2142	a	a	+
+chr2	2111	2143	a	a	+
+chr2	2111	2143	a	a	+
+chr2	2083	2115	b	b	-
+chr2	2085	2117	b	b	-
+chr2	2085	2117	b	b	-
+chr2	2085	2117	b	b	-
+chr2	2085	2117	b	b	-
+chr2	2085	2117	b	b	-
+chr2	2085	2117	b	b	-
+chr2	2121	2153	a	a	+
+chr2	2091	2123	b	b	-
+chr2	2091	2123	b	b	-
+chr2	2094	2126	b	b	-
+chr2	2094	2126	b	b	-
+chr2	2094	2126	b	b	-
+chr2	2102	2134	b	b	-
+chr2	2146	2178	a	a	+
+chr2	2147	2179	a	a	+
+chr2	2156	2188	a	a	+
+chr2	2157	2189	a	a	+
+chr2	2125	2157	b	b	-
+chr2	2126	2158	b	b	-
+chr2	2161	2193	a	a	+
+chr2	2161	2193	a	a	+
+chr2	2131	2163	b	b	-
+chr2	2136	2168	b	b	-
+chr2	2143	2175	b	b	-
+chr2	2143	2175	b	b	-
+chr2	2145	2177	b	b	-
+chr2	2180	2212	a	a	+
+chr2	2148	2180	b	b	-
+chr2	2182	2214	a	a	+
+chr2	2183	2215	a	a	+
+chr2	2183	2215	a	a	+
+chr2	2155	2187	b	b	-
+chr2	2157	2189	b	b	-
+chr2	2157	2189	b	b	-
+chr2	2157	2189	b	b	-
+chr2	2193	2225	a	a	+
+chr2	2161	2193	b	b	-
+chr2	2161	2193	b	b	-
+chr2	2162	2194	b	b	-
+chr2	2162	2194	b	b	-
+chr2	2163	2195	b	b	-
+chr2	2168	2200	b	b	-
+chr2	2168	2200	b	b	-
+chr2	2169	2201	b	b	-
+chr2	2218	2250	a	a	+
+chr2	2219	2251	a	a	+
+chr2	2193	2225	b	b	-
+chr2	2193	2225	b	b	-
+chr2	2229	2261	a	a	+
+chr2	2199	2231	b	b	-
+chr2	2199	2231	b	b	-
+chr2	2233	2265	a	a	+
+chr2	2233	2265	a	a	+
+chr2	2202	2234	b	b	-
+chr2	2202	2234	b	b	-
+chr2	2202	2234	b	b	-
+chr2	2217	2249	b	b	-
+chr2	2252	2284	a	a	+
+chr2	2254	2286	a	a	+
+chr2	2255	2287	a	a	+
+chr2	2255	2287	a	a	+
+chr2	2227	2259	b	b	-
+chr2	2229	2261	b	b	-
+chr2	2229	2261	b	b	-
+chr2	2229	2261	b	b	-
+chr2	2235	2267	b	b	-
+chr2	2235	2267	b	b	-
+chr2	2238	2270	b	b	-
+chr2	2238	2270	b	b	-
+chr2	2246	2278	b	b	-
+chr2	2253	2285	b	b	-
+chr2	2289	2321	a	a	+
+chr2	2290	2322	a	a	+
+chr2	2291	2323	a	a	+
+chr2	2292	2324	a	a	+
+chr2	2292	2324	a	a	+
+chr2	2263	2295	b	b	-
+chr2	2297	2329	a	a	+
+chr2	2297	2329	a	a	+
+chr2	2265	2297	b	b	-
+chr2	2265	2297	b	b	-
+chr2	2300	2332	a	a	+
+chr2	2269	2301	b	b	-
+chr2	2269	2301	b	b	-
+chr2	2270	2302	b	b	-
+chr2	2271	2303	b	b	-
+chr2	2305	2337	a	a	+
+chr2	2306	2338	a	a	+
+chr2	2275	2307	b	b	-
+chr2	2275	2307	b	b	-
+chr2	2308	2340	a	a	+
+chr2	2308	2340	a	a	+
+chr2	2322	2354	a	a	+
+chr2	2327	2359	a	a	+
+chr2	2328	2360	a	a	+
+chr2	2333	2365	a	a	+
+chr2	2333	2365	a	a	+
+chr2	2336	2368	a	a	+
+chr2	2341	2373	a	a	+
+chr2	2342	2374	a	a	+
+chr2	2347	2379	a	a	+
+chr2	2347	2379	a	a	+
+chr2	2320	2352	b	b	-
+chr2	2360	2392	a	a	+
+chr2	2363	2395	a	a	+
+chr2	2363	2395	a	a	+
+chr2	2357	2389	b	b	-
+chr2	2396	2428	a	a	+
+chr2	2428	2460	a	a	+
+chr2	2407	2439	b	b	-
+chr2	2417	2449	b	b	-
+chr2	2418	2450	b	b	-
+chr2	2421	2453	b	b	-
+chr2	2432	2464	b	b	-
+chr2	2468	2500	a	a	+
+chr2	2485	2517	a	a	+
+chr2	2485	2517	a	a	+
+chr2	2485	2517	a	a	+
+chr2	2453	2485	b	b	-
+chr2	2486	2518	a	a	+
+chr2	2498	2530	a	a	+
+chr2	2498	2530	a	a	+
+chr2	2498	2530	a	a	+
+chr2	2500	2532	a	a	+
+chr2	2504	2536	a	a	+
+chr2	2533	2565	a	a	+
+chr2	2539	2571	a	a	+
+chr2	2542	2574	a	a	+
+chr2	2512	2544	b	b	-
+chr2	2521	2553	b	b	-
+chr2	2530	2562	b	b	-
+chr2	2543	2575	b	b	-
+chr2	2552	2584	b	b	-
+chr2	2595	2627	a	a	+
+chr2	2573	2605	b	b	-
+chr2	2577	2609	b	b	-
+chr2	2597	2629	b	b	-
+chr2	2601	2633	b	b	-
+chr2	2641	2673	a	a	+
+chr2	2610	2642	b	b	-
+chr2	2662	2694	a	a	+
+chr2	2634	2666	b	b	-
+chr2	2638	2670	b	b	-
+chr2	2641	2673	b	b	-
+chr2	2687	2719	a	a	+
+chr2	2673	2705	b	b	-
+chr2	2692	2724	b	b	-
+chr2	2699	2731	b	b	-
+chr2	2742	2774	a	a	+
+chr2	2725	2757	b	b	-
+chr2	2746	2778	b	b	-
+chr2	2782	2814	a	a	+
+chr2	2768	2800	b	b	-
+chr2	2769	2801	b	b	-
+chr2	2793	2825	b	b	-
+chr2	2804	2836	b	b	-
+chr2	2810	2842	b	b	-
+chr2	2851	2883	a	a	+
+chr2	2906	2938	a	a	+
+chr2	2906	2938	a	a	+
+chr2	2912	2944	a	a	+
+chr2	2912	2944	a	a	+
+chr2	2888	2920	b	b	-
+chr2	2927	2959	a	a	+
+chr2	2934	2966	a	a	+
+chr2	2934	2966	a	a	+
+chr2	2939	2971	a	a	+
+chr2	2914	2946	b	b	-
+chr2	2918	2950	b	b	-
+chr2	2951	2983	a	a	+
+chr2	2972	3004	a	a	+
+chr2	2941	2973	b	b	-
+chr2	2984	3016	a	a	+
+chr2	2955	2987	b	b	-
+chr2	2955	2987	b	b	-
+chr2	2955	2987	b	b	-
+chr2	2956	2988	b	b	-
+chr2	2997	3029	a	a	+
+chr2	2970	3002	b	b	-
+chr2	3013	3045	a	a	+
+chr2	3013	3045	a	a	+
+chr2	2983	3015	b	b	-
+chr2	3000	3032	b	b	-
+chr2	3010	3042	b	b	-
+chr2	3067	3099	a	a	+
+chr2	3067	3099	a	a	+
+chr2	3080	3112	a	a	+
+chr2	3083	3115	a	a	+
+chr2	3058	3090	b	b	-
+chr2	3058	3090	b	b	-
+chr2	3103	3135	a	a	+
+chr2	3078	3110	b	b	-
+chr2	3136	3168	a	a	+
+chr2	3152	3184	a	a	+
+chr2	3152	3184	a	a	+
+chr2	3152	3184	a	a	+
+chr2	3120	3152	b	b	-
+chr2	3120	3152	b	b	-
+chr2	3155	3187	a	a	+
+chr2	3170	3202	a	a	+
+chr2	3171	3203	a	a	+
+chr2	3171	3203	a	a	+
+chr2	3180	3212	a	a	+
+chr2	3161	3193	b	b	-
+chr2	3167	3199	b	b	-
+chr2	3168	3200	b	b	-
+chr2	3189	3221	b	b	-
+chr2	3191	3223	b	b	-
+chr2	3201	3233	b	b	-
+chr2	3234	3266	a	a	+
+chr2	3215	3247	b	b	-
+chr2	3216	3248	b	b	-
+chr2	3249	3281	a	a	+
+chr2	3217	3249	b	b	-
+chr2	3217	3249	b	b	-
+chr2	3217	3249	b	b	-
+chr2	3218	3250	b	b	-
+chr2	3218	3250	b	b	-
+chr2	3223	3255	b	b	-
+chr2	3228	3260	b	b	-
+chr2	3228	3260	b	b	-
+chr2	3229	3261	b	b	-
+chr2	3235	3267	b	b	-
+chr2	3272	3304	a	a	+
+chr2	3272	3304	a	a	+
+chr2	3243	3275	b	b	-
+chr2	3243	3275	b	b	-
+chr2	3244	3276	b	b	-
+chr2	3244	3276	b	b	-
+chr2	3279	3311	a	a	+
+chr2	3253	3285	b	b	-
+chr2	3253	3285	b	b	-
+chr2	3287	3319	a	a	+
+chr2	3255	3287	b	b	-
+chr2	3290	3322	a	a	+
+chr2	3266	3298	b	b	-
+chr2	3309	3341	a	a	+
+chr2	3314	3346	a	a	+
+chr2	3314	3346	a	a	+
+chr2	3282	3314	b	b	-
+chr2	3318	3350	a	a	+
+chr2	3366	3398	b	b	-
+chr2	3366	3398	b	b	-
+chr2	3368	3400	b	b	-
+chr2	3402	3434	a	a	+
+chr2	3415	3447	a	a	+
+chr2	3425	3457	a	a	+
+chr2	3393	3425	b	b	-
+chr2	3427	3459	a	a	+
+chr2	3428	3460	a	a	+
+chr2	3428	3460	a	a	+
+chr2	3428	3460	a	a	+
+chr2	3428	3460	a	a	+
+chr2	3433	3465	a	a	+
+chr2	3437	3469	a	a	+
+chr2	3437	3469	a	a	+
+chr2	3437	3469	a	a	+
+chr2	3437	3469	a	a	+
+chr2	3407	3439	b	b	-
+chr2	3411	3443	b	b	-
+chr2	3413	3445	b	b	-
+chr2	3414	3446	b	b	-
+chr2	3448	3480	a	a	+
+chr2	3449	3481	a	a	+
+chr2	3449	3481	a	a	+
+chr2	3417	3449	b	b	-
+chr2	3421	3453	b	b	-
+chr2	3455	3487	a	a	+
+chr2	3462	3494	a	a	+
+chr2	3434	3466	b	b	-
+chr2	3443	3475	b	b	-
+chr2	3443	3475	b	b	-
+chr2	3476	3508	a	a	+
+chr2	3477	3509	a	a	+
+chr2	3485	3517	a	a	+
+chr2	3459	3491	b	b	-
+chr2	3494	3526	a	a	+
+chr2	3462	3494	b	b	-
+chr2	3467	3499	b	b	-
+chr2	3477	3509	b	b	-
+chr2	3487	3519	b	b	-
+chr2	3494	3526	b	b	-
+chr2	3555	3587	a	a	+
+chr2	3531	3563	b	b	-
+chr2	3531	3563	b	b	-
+chr2	3544	3576	b	b	-
+chr2	3549	3581	b	b	-
+chr2	3552	3584	b	b	-
+chr2	3590	3622	a	a	+
+chr2	3562	3594	b	b	-
+chr2	3562	3594	b	b	-
+chr2	3595	3627	a	a	+
+chr2	3596	3628	a	a	+
+chr2	3565	3597	b	b	-
+chr2	3565	3597	b	b	-
+chr2	3565	3597	b	b	-
+chr2	3565	3597	b	b	-
+chr2	3600	3632	a	a	+
+chr2	3600	3632	a	a	+
+chr2	3600	3632	a	a	+
+chr2	3600	3632	a	a	+
+chr2	3600	3632	a	a	+
+chr2	3568	3600	b	b	-
+chr2	3568	3600	b	b	-
+chr2	3568	3600	b	b	-
+chr2	3602	3634	a	a	+
+chr2	3603	3635	a	a	+
+chr2	3605	3637	a	a	+
+chr2	3608	3640	a	a	+
+chr2	3581	3613	b	b	-
+chr2	3615	3647	a	a	+
+chr2	3583	3615	b	b	-
+chr2	3583	3615	b	b	-
+chr2	3583	3615	b	b	-
+chr2	3583	3615	b	b	-
+chr2	3583	3615	b	b	-
+chr2	3583	3615	b	b	-
+chr2	3583	3615	b	b	-
+chr2	3583	3615	b	b	-
+chr2	3583	3615	b	b	-
+chr2	3583	3615	b	b	-
+chr2	3583	3615	b	b	-
+chr2	3583	3615	b	b	-
+chr2	3616	3648	a	a	+
+chr2	3616	3648	a	a	+
+chr2	3616	3648	a	a	+
+chr2	3616	3648	a	a	+
+chr2	3616	3648	a	a	+
+chr2	3616	3648	a	a	+
+chr2	3584	3616	b	b	-
+chr2	3584	3616	b	b	-
+chr2	3584	3616	b	b	-
+chr2	3617	3649	a	a	+
+chr2	3617	3649	a	a	+
+chr2	3617	3649	a	a	+
+chr2	3617	3649	a	a	+
+chr2	3617	3649	a	a	+
+chr2	3617	3649	a	a	+
+chr2	3617	3649	a	a	+
+chr2	3619	3651	a	a	+
+chr2	3619	3651	a	a	+
+chr2	3621	3653	a	a	+
+chr2	3621	3653	a	a	+
+chr2	3621	3653	a	a	+
+chr2	3622	3654	a	a	+
+chr2	3622	3654	a	a	+
+chr2	3622	3654	a	a	+
+chr2	3623	3655	a	a	+
+chr2	3623	3655	a	a	+
+chr2	3624	3656	a	a	+
+chr2	3624	3656	a	a	+
+chr2	3624	3656	a	a	+
+chr2	3592	3624	b	b	-
+chr2	3626	3658	a	a	+
+chr2	3594	3626	b	b	-
+chr2	3629	3661	a	a	+
+chr2	3597	3629	b	b	-
+chr2	3597	3629	b	b	-
+chr2	3597	3629	b	b	-
+chr2	3597	3629	b	b	-
+chr2	3597	3629	b	b	-
+chr2	3630	3662	a	a	+
+chr2	3630	3662	a	a	+
+chr2	3598	3630	b	b	-
+chr2	3633	3665	a	a	+
+chr2	3601	3633	b	b	-
+chr2	3605	3637	b	b	-
+chr2	3641	3673	a	a	+
+chr2	3641	3673	a	a	+
+chr2	3610	3642	b	b	-
+chr2	3610	3642	b	b	-
+chr2	3610	3642	b	b	-
+chr2	3612	3644	b	b	-
+chr2	3645	3677	a	a	+
+chr2	3613	3645	b	b	-
+chr2	3613	3645	b	b	-
+chr2	3646	3678	a	a	+
+chr2	3651	3683	a	a	+
+chr2	3652	3684	a	a	+
+chr2	3652	3684	a	a	+
+chr2	3655	3687	a	a	+
+chr2	3656	3688	a	a	+
+chr2	3656	3688	a	a	+
+chr2	3669	3701	a	a	+
+chr2	3672	3704	a	a	+
+chr2	3646	3678	b	b	-
+chr2	3648	3680	b	b	-
+chr2	3660	3692	b	b	-
+chr2	3678	3710	b	b	-
+chr2	3687	3719	b	b	-
+chr2	3689	3721	b	b	-
+chr2	3722	3754	a	a	+
+chr2	3690	3722	b	b	-
+chr2	3690	3722	b	b	-
+chr2	3690	3722	b	b	-
+chr2	3691	3723	b	b	-
+chr2	3732	3764	a	a	+
+chr2	3700	3732	b	b	-
+chr2	3702	3734	b	b	-
+chr2	3706	3738	b	b	-
+chr2	3706	3738	b	b	-
+chr2	3706	3738	b	b	-
+chr2	3739	3771	a	a	+
+chr2	3713	3745	b	b	-
+chr2	3715	3747	b	b	-
+chr2	3715	3747	b	b	-
+chr2	3715	3747	b	b	-
+chr2	3715	3747	b	b	-
+chr2	3715	3747	b	b	-
+chr2	3715	3747	b	b	-
+chr2	3749	3781	a	a	+
+chr2	3750	3782	a	a	+
+chr2	3750	3782	a	a	+
+chr2	3750	3782	a	a	+
+chr2	3750	3782	a	a	+
+chr2	3750	3782	a	a	+
+chr2	3750	3782	a	a	+
+chr2	3750	3782	a	a	+
+chr2	3750	3782	a	a	+
+chr2	3750	3782	a	a	+
+chr2	3751	3783	a	a	+
+chr2	3752	3784	a	a	+
+chr2	3752	3784	a	a	+
+chr2	3720	3752	b	b	-
+chr2	3720	3752	b	b	-
+chr2	3753	3785	a	a	+
+chr2	3721	3753	b	b	-
+chr2	3721	3753	b	b	-
+chr2	3721	3753	b	b	-
+chr2	3755	3787	a	a	+
+chr2	3724	3756	b	b	-
+chr2	3762	3794	a	a	+
+chr2	3762	3794	a	a	+
+chr2	3762	3794	a	a	+
+chr2	3762	3794	a	a	+
+chr2	3762	3794	a	a	+
+chr2	3762	3794	a	a	+
+chr2	3762	3794	a	a	+
+chr2	3762	3794	a	a	+
+chr2	3763	3795	a	a	+
+chr2	3763	3795	a	a	+
+chr2	3763	3795	a	a	+
+chr2	3731	3763	b	b	-
+chr2	3732	3764	b	b	-
+chr2	3732	3764	b	b	-
+chr2	3732	3764	b	b	-
+chr2	3732	3764	b	b	-
+chr2	3732	3764	b	b	-
+chr2	3732	3764	b	b	-
+chr2	3732	3764	b	b	-
+chr2	3732	3764	b	b	-
+chr2	3732	3764	b	b	-
+chr2	3732	3764	b	b	-
+chr2	3732	3764	b	b	-
+chr2	3732	3764	b	b	-
+chr2	3732	3764	b	b	-
+chr2	3732	3764	b	b	-
+chr2	3732	3764	b	b	-
+chr2	3732	3764	b	b	-
+chr2	3732	3764	b	b	-
+chr2	3733	3765	b	b	-
+chr2	3733	3765	b	b	-
+chr2	3733	3765	b	b	-
+chr2	3733	3765	b	b	-
+chr2	3733	3765	b	b	-
+chr2	3733	3765	b	b	-
+chr2	3733	3765	b	b	-
+chr2	3766	3798	a	a	+
+chr2	3766	3798	a	a	+
+chr2	3766	3798	a	a	+
+chr2	3766	3798	a	a	+
+chr2	3734	3766	b	b	-
+chr2	3734	3766	b	b	-
+chr2	3767	3799	a	a	+
+chr2	3767	3799	a	a	+
+chr2	3767	3799	a	a	+
+chr2	3767	3799	a	a	+
+chr2	3767	3799	a	a	+
+chr2	3767	3799	a	a	+
+chr2	3767	3799	a	a	+
+chr2	3767	3799	a	a	+
+chr2	3767	3799	a	a	+
+chr2	3767	3799	a	a	+
+chr2	3767	3799	a	a	+
+chr2	3767	3799	a	a	+
+chr2	3767	3799	a	a	+
+chr2	3767	3799	a	a	+
+chr2	3768	3800	a	a	+
+chr2	3736	3768	b	b	-
+chr2	3736	3768	b	b	-
+chr2	3737	3769	b	b	-
+chr2	3770	3802	a	a	+
+chr2	3770	3802	a	a	+
+chr2	3770	3802	a	a	+
+chr2	3770	3802	a	a	+
+chr2	3738	3770	b	b	-
+chr2	3738	3770	b	b	-
+chr2	3738	3770	b	b	-
+chr2	3738	3770	b	b	-
+chr2	3738	3770	b	b	-
+chr2	3738	3770	b	b	-
+chr2	3738	3770	b	b	-
+chr2	3738	3770	b	b	-
+chr2	3738	3770	b	b	-
+chr2	3738	3770	b	b	-
+chr2	3738	3770	b	b	-
+chr2	3738	3770	b	b	-
+chr2	3739	3771	b	b	-
+chr2	3739	3771	b	b	-
+chr2	3739	3771	b	b	-
+chr2	3739	3771	b	b	-
+chr2	3739	3771	b	b	-
+chr2	3772	3804	a	a	+
+chr2	3740	3772	b	b	-
+chr2	3741	3773	b	b	-
+chr2	3741	3773	b	b	-
+chr2	3775	3807	a	a	+
+chr2	3776	3808	a	a	+
+chr2	3776	3808	a	a	+
+chr2	3776	3808	a	a	+
+chr2	3776	3808	a	a	+
+chr2	3776	3808	a	a	+
+chr2	3776	3808	a	a	+
+chr2	3776	3808	a	a	+
+chr2	3776	3808	a	a	+
+chr2	3776	3808	a	a	+
+chr2	3776	3808	a	a	+
+chr2	3776	3808	a	a	+
+chr2	3776	3808	a	a	+
+chr2	3776	3808	a	a	+
+chr2	3776	3808	a	a	+
+chr2	3776	3808	a	a	+
+chr2	3776	3808	a	a	+
+chr2	3776	3808	a	a	+
+chr2	3776	3808	a	a	+
+chr2	3776	3808	a	a	+
+chr2	3776	3808	a	a	+
+chr2	3776	3808	a	a	+
+chr2	3776	3808	a	a	+
+chr2	3776	3808	a	a	+
+chr2	3776	3808	a	a	+
+chr2	3776	3808	a	a	+
+chr2	3776	3808	a	a	+
+chr2	3776	3808	a	a	+
+chr2	3777	3809	a	a	+
+chr2	3777	3809	a	a	+
+chr2	3777	3809	a	a	+
+chr2	3777	3809	a	a	+
+chr2	3777	3809	a	a	+
+chr2	3777	3809	a	a	+
+chr2	3777	3809	a	a	+
+chr2	3777	3809	a	a	+
+chr2	3777	3809	a	a	+
+chr2	3777	3809	a	a	+
+chr2	3777	3809	a	a	+
+chr2	3777	3809	a	a	+
+chr2	3777	3809	a	a	+
+chr2	3777	3809	a	a	+
+chr2	3777	3809	a	a	+
+chr2	3777	3809	a	a	+
+chr2	3777	3809	a	a	+
+chr2	3778	3810	a	a	+
+chr2	3778	3810	a	a	+
+chr2	3778	3810	a	a	+
+chr2	3779	3811	a	a	+
+chr2	3779	3811	a	a	+
+chr2	3779	3811	a	a	+
+chr2	3779	3811	a	a	+
+chr2	3779	3811	a	a	+
+chr2	3747	3779	b	b	-
+chr2	3747	3779	b	b	-
+chr2	3747	3779	b	b	-
+chr2	3747	3779	b	b	-
+chr2	3747	3779	b	b	-
+chr2	3747	3779	b	b	-
+chr2	3747	3779	b	b	-
+chr2	3747	3779	b	b	-
+chr2	3747	3779	b	b	-
+chr2	3780	3812	a	a	+
+chr2	3780	3812	a	a	+
+chr2	3780	3812	a	a	+
+chr2	3780	3812	a	a	+
+chr2	3780	3812	a	a	+
+chr2	3780	3812	a	a	+
+chr2	3780	3812	a	a	+
+chr2	3780	3812	a	a	+
+chr2	3780	3812	a	a	+
+chr2	3780	3812	a	a	+
+chr2	3780	3812	a	a	+
+chr2	3780	3812	a	a	+
+chr2	3780	3812	a	a	+
+chr2	3780	3812	a	a	+
+chr2	3780	3812	a	a	+
+chr2	3780	3812	a	a	+
+chr2	3780	3812	a	a	+
+chr2	3780	3812	a	a	+
+chr2	3780	3812	a	a	+
+chr2	3780	3812	a	a	+
+chr2	3780	3812	a	a	+
+chr2	3780	3812	a	a	+
+chr2	3780	3812	a	a	+
+chr2	3780	3812	a	a	+
+chr2	3780	3812	a	a	+
+chr2	3780	3812	a	a	+
+chr2	3780	3812	a	a	+
+chr2	3780	3812	a	a	+
+chr2	3780	3812	a	a	+
+chr2	3780	3812	a	a	+
+chr2	3780	3812	a	a	+
+chr2	3780	3812	a	a	+
+chr2	3780	3812	a	a	+
+chr2	3780	3812	a	a	+
+chr2	3780	3812	a	a	+
+chr2	3780	3812	a	a	+
+chr2	3780	3812	a	a	+
+chr2	3780	3812	a	a	+
+chr2	3780	3812	a	a	+
+chr2	3780	3812	a	a	+
+chr2	3780	3812	a	a	+
+chr2	3780	3812	a	a	+
+chr2	3780	3812	a	a	+
+chr2	3780	3812	a	a	+
+chr2	3780	3812	a	a	+
+chr2	3780	3812	a	a	+
+chr2	3780	3812	a	a	+
+chr2	3780	3812	a	a	+
+chr2	3780	3812	a	a	+
+chr2	3780	3812	a	a	+
+chr2	3780	3812	a	a	+
+chr2	3781	3813	a	a	+
+chr2	3781	3813	a	a	+
+chr2	3781	3813	a	a	+
+chr2	3781	3813	a	a	+
+chr2	3782	3814	a	a	+
+chr2	3782	3814	a	a	+
+chr2	3782	3814	a	a	+
+chr2	3782	3814	a	a	+
+chr2	3782	3814	a	a	+
+chr2	3783	3815	a	a	+
+chr2	3783	3815	a	a	+
+chr2	3751	3783	b	b	-
+chr2	3751	3783	b	b	-
+chr2	3751	3783	b	b	-
+chr2	3751	3783	b	b	-
+chr2	3785	3817	a	a	+
+chr2	3785	3817	a	a	+
+chr2	3753	3785	b	b	-
+chr2	3753	3785	b	b	-
+chr2	3754	3786	b	b	-
+chr2	3754	3786	b	b	-
+chr2	3754	3786	b	b	-
+chr2	3754	3786	b	b	-
+chr2	3754	3786	b	b	-
+chr2	3754	3786	b	b	-
+chr2	3754	3786	b	b	-
+chr2	3754	3786	b	b	-
+chr2	3787	3819	a	a	+
+chr2	3787	3819	a	a	+
+chr2	3787	3819	a	a	+
+chr2	3788	3820	a	a	+
+chr2	3788	3820	a	a	+
+chr2	3788	3820	a	a	+
+chr2	3788	3820	a	a	+
+chr2	3788	3820	a	a	+
+chr2	3788	3820	a	a	+
+chr2	3788	3820	a	a	+
+chr2	3788	3820	a	a	+
+chr2	3788	3820	a	a	+
+chr2	3788	3820	a	a	+
+chr2	3756	3788	b	b	-
+chr2	3756	3788	b	b	-
+chr2	3756	3788	b	b	-
+chr2	3756	3788	b	b	-
+chr2	3756	3788	b	b	-
+chr2	3756	3788	b	b	-
+chr2	3756	3788	b	b	-
+chr2	3756	3788	b	b	-
+chr2	3756	3788	b	b	-
+chr2	3756	3788	b	b	-
+chr2	3756	3788	b	b	-
+chr2	3756	3788	b	b	-
+chr2	3757	3789	b	b	-
+chr2	3757	3789	b	b	-
+chr2	3757	3789	b	b	-
+chr2	3757	3789	b	b	-
+chr2	3757	3789	b	b	-
+chr2	3757	3789	b	b	-
+chr2	3757	3789	b	b	-
+chr2	3757	3789	b	b	-
+chr2	3757	3789	b	b	-
+chr2	3757	3789	b	b	-
+chr2	3757	3789	b	b	-
+chr2	3757	3789	b	b	-
+chr2	3757	3789	b	b	-
+chr2	3757	3789	b	b	-
+chr2	3757	3789	b	b	-
+chr2	3757	3789	b	b	-
+chr2	3757	3789	b	b	-
+chr2	3757	3789	b	b	-
+chr2	3757	3789	b	b	-
+chr2	3757	3789	b	b	-
+chr2	3757	3789	b	b	-
+chr2	3757	3789	b	b	-
+chr2	3757	3789	b	b	-
+chr2	3757	3789	b	b	-
+chr2	3757	3789	b	b	-
+chr2	3757	3789	b	b	-
+chr2	3757	3789	b	b	-
+chr2	3757	3789	b	b	-
+chr2	3757	3789	b	b	-
+chr2	3757	3789	b	b	-
+chr2	3757	3789	b	b	-
+chr2	3757	3789	b	b	-
+chr2	3757	3789	b	b	-
+chr2	3757	3789	b	b	-
+chr2	3757	3789	b	b	-
+chr2	3757	3789	b	b	-
+chr2	3757	3789	b	b	-
+chr2	3757	3789	b	b	-
+chr2	3757	3789	b	b	-
+chr2	3757	3789	b	b	-
+chr2	3757	3789	b	b	-
+chr2	3757	3789	b	b	-
+chr2	3757	3789	b	b	-
+chr2	3758	3790	b	b	-
+chr2	3758	3790	b	b	-
+chr2	3758	3790	b	b	-
+chr2	3758	3790	b	b	-
+chr2	3758	3790	b	b	-
+chr2	3758	3790	b	b	-
+chr2	3758	3790	b	b	-
+chr2	3758	3790	b	b	-
+chr2	3758	3790	b	b	-
+chr2	3758	3790	b	b	-
+chr2	3758	3790	b	b	-
+chr2	3758	3790	b	b	-
+chr2	3758	3790	b	b	-
+chr2	3758	3790	b	b	-
+chr2	3758	3790	b	b	-
+chr2	3758	3790	b	b	-
+chr2	3758	3790	b	b	-
+chr2	3758	3790	b	b	-
+chr2	3758	3790	b	b	-
+chr2	3758	3790	b	b	-
+chr2	3758	3790	b	b	-
+chr2	3758	3790	b	b	-
+chr2	3758	3790	b	b	-
+chr2	3758	3790	b	b	-
+chr2	3758	3790	b	b	-
+chr2	3758	3790	b	b	-
+chr2	3758	3790	b	b	-
+chr2	3758	3790	b	b	-
+chr2	3758	3790	b	b	-
+chr2	3758	3790	b	b	-
+chr2	3758	3790	b	b	-
+chr2	3758	3790	b	b	-
+chr2	3758	3790	b	b	-
+chr2	3758	3790	b	b	-
+chr2	3758	3790	b	b	-
+chr2	3758	3790	b	b	-
+chr2	3758	3790	b	b	-
+chr2	3758	3790	b	b	-
+chr2	3758	3790	b	b	-
+chr2	3758	3790	b	b	-
+chr2	3758	3790	b	b	-
+chr2	3758	3790	b	b	-
+chr2	3758	3790	b	b	-
+chr2	3758	3790	b	b	-
+chr2	3758	3790	b	b	-
+chr2	3758	3790	b	b	-
+chr2	3758	3790	b	b	-
+chr2	3758	3790	b	b	-
+chr2	3758	3790	b	b	-
+chr2	3758	3790	b	b	-
+chr2	3758	3790	b	b	-
+chr2	3758	3790	b	b	-
+chr2	3758	3790	b	b	-
+chr2	3758	3790	b	b	-
+chr2	3758	3790	b	b	-
+chr2	3758	3790	b	b	-
+chr2	3758	3790	b	b	-
+chr2	3758	3790	b	b	-
+chr2	3791	3823	a	a	+
+chr2	3791	3823	a	a	+
+chr2	3791	3823	a	a	+
+chr2	3759	3791	b	b	-
+chr2	3759	3791	b	b	-
+chr2	3759	3791	b	b	-
+chr2	3759	3791	b	b	-
+chr2	3759	3791	b	b	-
+chr2	3759	3791	b	b	-
+chr2	3759	3791	b	b	-
+chr2	3759	3791	b	b	-
+chr2	3759	3791	b	b	-
+chr2	3759	3791	b	b	-
+chr2	3759	3791	b	b	-
+chr2	3792	3824	a	a	+
+chr2	3792	3824	a	a	+
+chr2	3792	3824	a	a	+
+chr2	3760	3792	b	b	-
+chr2	3760	3792	b	b	-
+chr2	3793	3825	a	a	+
+chr2	3793	3825	a	a	+
+chr2	3793	3825	a	a	+
+chr2	3793	3825	a	a	+
+chr2	3793	3825	a	a	+
+chr2	3793	3825	a	a	+
+chr2	3793	3825	a	a	+
+chr2	3793	3825	a	a	+
+chr2	3793	3825	a	a	+
+chr2	3794	3826	a	a	+
+chr2	3794	3826	a	a	+
+chr2	3794	3826	a	a	+
+chr2	3794	3826	a	a	+
+chr2	3794	3826	a	a	+
+chr2	3794	3826	a	a	+
+chr2	3794	3826	a	a	+
+chr2	3794	3826	a	a	+
+chr2	3794	3826	a	a	+
+chr2	3794	3826	a	a	+
+chr2	3794	3826	a	a	+
+chr2	3794	3826	a	a	+
+chr2	3794	3826	a	a	+
+chr2	3794	3826	a	a	+
+chr2	3794	3826	a	a	+
+chr2	3794	3826	a	a	+
+chr2	3794	3826	a	a	+
+chr2	3794	3826	a	a	+
+chr2	3794	3826	a	a	+
+chr2	3794	3826	a	a	+
+chr2	3794	3826	a	a	+
+chr2	3794	3826	a	a	+
+chr2	3794	3826	a	a	+
+chr2	3794	3826	a	a	+
+chr2	3794	3826	a	a	+
+chr2	3794	3826	a	a	+
+chr2	3794	3826	a	a	+
+chr2	3794	3826	a	a	+
+chr2	3794	3826	a	a	+
+chr2	3762	3794	b	b	-
+chr2	3762	3794	b	b	-
+chr2	3762	3794	b	b	-
+chr2	3762	3794	b	b	-
+chr2	3795	3827	a	a	+
+chr2	3795	3827	a	a	+
+chr2	3795	3827	a	a	+
+chr2	3795	3827	a	a	+
+chr2	3795	3827	a	a	+
+chr2	3795	3827	a	a	+
+chr2	3795	3827	a	a	+
+chr2	3795	3827	a	a	+
+chr2	3795	3827	a	a	+
+chr2	3795	3827	a	a	+
+chr2	3795	3827	a	a	+
+chr2	3795	3827	a	a	+
+chr2	3795	3827	a	a	+
+chr2	3795	3827	a	a	+
+chr2	3763	3795	b	b	-
+chr2	3763	3795	b	b	-
+chr2	3763	3795	b	b	-
+chr2	3763	3795	b	b	-
+chr2	3763	3795	b	b	-
+chr2	3764	3796	b	b	-
+chr2	3764	3796	b	b	-
+chr2	3764	3796	b	b	-
+chr2	3764	3796	b	b	-
+chr2	3764	3796	b	b	-
+chr2	3764	3796	b	b	-
+chr2	3797	3829	a	a	+
+chr2	3797	3829	a	a	+
+chr2	3797	3829	a	a	+
+chr2	3797	3829	a	a	+
+chr2	3797	3829	a	a	+
+chr2	3797	3829	a	a	+
+chr2	3797	3829	a	a	+
+chr2	3797	3829	a	a	+
+chr2	3798	3830	a	a	+
+chr2	3798	3830	a	a	+
+chr2	3798	3830	a	a	+
+chr2	3767	3799	b	b	-
+chr2	3767	3799	b	b	-
+chr2	3767	3799	b	b	-
+chr2	3767	3799	b	b	-
+chr2	3767	3799	b	b	-
+chr2	3768	3800	b	b	-
+chr2	3768	3800	b	b	-
+chr2	3768	3800	b	b	-
+chr2	3770	3802	b	b	-
+chr2	3770	3802	b	b	-
+chr2	3804	3836	a	a	+
+chr2	3804	3836	a	a	+
+chr2	3804	3836	a	a	+
+chr2	3804	3836	a	a	+
+chr2	3804	3836	a	a	+
+chr2	3804	3836	a	a	+
+chr2	3804	3836	a	a	+
+chr2	3804	3836	a	a	+
+chr2	3804	3836	a	a	+
+chr2	3804	3836	a	a	+
+chr2	3772	3804	b	b	-
+chr2	3772	3804	b	b	-
+chr2	3772	3804	b	b	-
+chr2	3772	3804	b	b	-
+chr2	3772	3804	b	b	-
+chr2	3805	3837	a	a	+
+chr2	3805	3837	a	a	+
+chr2	3805	3837	a	a	+
+chr2	3805	3837	a	a	+
+chr2	3805	3837	a	a	+
+chr2	3805	3837	a	a	+
+chr2	3805	3837	a	a	+
+chr2	3805	3837	a	a	+
+chr2	3807	3839	a	a	+
+chr2	3808	3840	a	a	+
+chr2	3809	3841	a	a	+
+chr2	3809	3841	a	a	+
+chr2	3809	3841	a	a	+
+chr2	3809	3841	a	a	+
+chr2	3809	3841	a	a	+
+chr2	3809	3841	a	a	+
+chr2	3809	3841	a	a	+
+chr2	3810	3842	a	a	+
+chr2	3810	3842	a	a	+
+chr2	3810	3842	a	a	+
+chr2	3810	3842	a	a	+
+chr2	3810	3842	a	a	+
+chr2	3810	3842	a	a	+
+chr2	3810	3842	a	a	+
+chr2	3810	3842	a	a	+
+chr2	3810	3842	a	a	+
+chr2	3810	3842	a	a	+
+chr2	3810	3842	a	a	+
+chr2	3810	3842	a	a	+
+chr2	3778	3810	b	b	-
+chr2	3778	3810	b	b	-
+chr2	3780	3812	b	b	-
+chr2	3780	3812	b	b	-
+chr2	3780	3812	b	b	-
+chr2	3780	3812	b	b	-
+chr2	3780	3812	b	b	-
+chr2	3780	3812	b	b	-
+chr2	3780	3812	b	b	-
+chr2	3782	3814	b	b	-
+chr2	3784	3816	b	b	-
+chr2	3788	3820	b	b	-
+chr2	3788	3820	b	b	-
+chr2	3788	3820	b	b	-
+chr2	3788	3820	b	b	-
+chr2	3788	3820	b	b	-
+chr2	3788	3820	b	b	-
+chr2	3788	3820	b	b	-
+chr2	3788	3820	b	b	-
+chr2	3788	3820	b	b	-
+chr2	3788	3820	b	b	-
+chr2	3788	3820	b	b	-
+chr2	3789	3821	b	b	-
+chr2	3790	3822	b	b	-
+chr2	3794	3826	b	b	-
+chr2	3827	3859	a	a	+
+chr2	3796	3828	b	b	-
+chr2	3796	3828	b	b	-
+chr2	3829	3861	a	a	+
+chr2	3829	3861	a	a	+
+chr2	3797	3829	b	b	-
+chr2	3797	3829	b	b	-
+chr2	3797	3829	b	b	-
+chr2	3798	3830	b	b	-
+chr2	3833	3865	a	a	+
+chr2	3835	3867	a	a	+
+chr2	3803	3835	b	b	-
+chr2	3803	3835	b	b	-
+chr2	3803	3835	b	b	-
+chr2	3806	3838	b	b	-
+chr2	3806	3838	b	b	-
+chr2	3808	3840	b	b	-
+chr2	3813	3845	b	b	-
+chr2	3847	3879	a	a	+
+chr2	3847	3879	a	a	+
+chr2	3816	3848	b	b	-
+chr2	3816	3848	b	b	-
+chr2	3817	3849	b	b	-
+chr2	3855	3887	a	a	+
+chr2	3859	3891	a	a	+
+chr2	3863	3895	a	a	+
+chr2	3863	3895	a	a	+
+chr2	3863	3895	a	a	+
+chr2	3869	3901	a	a	+
+chr2	3847	3879	b	b	-
+chr2	3849	3881	b	b	-
+chr2	3896	3928	a	a	+
+chr2	3867	3899	b	b	-
+chr2	3900	3932	a	a	+
+chr2	3869	3901	b	b	-
+chr2	3873	3905	b	b	-
+chr2	3877	3909	b	b	-
+chr2	3921	3953	a	a	+
+chr2	3937	3969	a	a	+
+chr2	3907	3939	b	b	-
+chr2	3992	4024	a	a	+
+chr2	3998	4030	a	a	+
+chr2	3998	4030	a	a	+
+chr2	3998	4030	a	a	+
+chr2	3998	4030	a	a	+
+chr2	3980	4012	b	b	-
+chr2	3980	4012	b	b	-
+chr2	3982	4014	b	b	-
+chr2	3987	4019	b	b	-
+chr2	4021	4053	a	a	+
+chr2	3992	4024	b	b	-
+chr2	4028	4060	a	a	+
+chr2	4028	4060	a	a	+
+chr2	4028	4060	a	a	+
+chr2	4034	4066	a	a	+
+chr2	4034	4066	a	a	+
+chr2	4040	4072	a	a	+
+chr2	4013	4045	b	b	-
+chr2	4014	4046	b	b	-
+chr2	4047	4079	a	a	+
+chr2	4015	4047	b	b	-
+chr2	4048	4080	a	a	+
+chr2	4016	4048	b	b	-
+chr2	4016	4048	b	b	-
+chr2	4017	4049	b	b	-
+chr2	4017	4049	b	b	-
+chr2	4050	4082	a	a	+
+chr2	4018	4050	b	b	-
+chr2	4051	4083	a	a	+
+chr2	4051	4083	a	a	+
+chr2	4051	4083	a	a	+
+chr2	4051	4083	a	a	+
+chr2	4051	4083	a	a	+
+chr2	4051	4083	a	a	+
+chr2	4051	4083	a	a	+
+chr2	4051	4083	a	a	+
+chr2	4023	4055	b	b	-
+chr2	4023	4055	b	b	-
+chr2	4023	4055	b	b	-
+chr2	4023	4055	b	b	-
+chr2	4056	4088	a	a	+
+chr2	4024	4056	b	b	-
+chr2	4057	4089	a	a	+
+chr2	4057	4089	a	a	+
+chr2	4057	4089	a	a	+
+chr2	4057	4089	a	a	+
+chr2	4057	4089	a	a	+
+chr2	4057	4089	a	a	+
+chr2	4057	4089	a	a	+
+chr2	4025	4057	b	b	-
+chr2	4060	4092	a	a	+
+chr2	4060	4092	a	a	+
+chr2	4060	4092	a	a	+
+chr2	4028	4060	b	b	-
+chr2	4029	4061	b	b	-
+chr2	4029	4061	b	b	-
+chr2	4029	4061	b	b	-
+chr2	4030	4062	b	b	-
+chr2	4030	4062	b	b	-
+chr2	4030	4062	b	b	-
+chr2	4063	4095	a	a	+
+chr2	4063	4095	a	a	+
+chr2	4063	4095	a	a	+
+chr2	4031	4063	b	b	-
+chr2	4064	4096	a	a	+
+chr2	4064	4096	a	a	+
+chr2	4064	4096	a	a	+
+chr2	4064	4096	a	a	+
+chr2	4064	4096	a	a	+
+chr2	4064	4096	a	a	+
+chr2	4067	4099	a	a	+
+chr2	4067	4099	a	a	+
+chr2	4068	4100	a	a	+
+chr2	4068	4100	a	a	+
+chr2	4068	4100	a	a	+
+chr2	4068	4100	a	a	+
+chr2	4036	4068	b	b	-
+chr2	4036	4068	b	b	-
+chr2	4037	4069	b	b	-
+chr2	4037	4069	b	b	-
+chr2	4037	4069	b	b	-
+chr2	4037	4069	b	b	-
+chr2	4037	4069	b	b	-
+chr2	4037	4069	b	b	-
+chr2	4037	4069	b	b	-
+chr2	4037	4069	b	b	-
+chr2	4038	4070	b	b	-
+chr2	4075	4107	a	a	+
+chr2	4075	4107	a	a	+
+chr2	4076	4108	a	a	+
+chr2	4076	4108	a	a	+
+chr2	4044	4076	b	b	-
+chr2	4045	4077	b	b	-
+chr2	4045	4077	b	b	-
+chr2	4045	4077	b	b	-
+chr2	4078	4110	a	a	+
+chr2	4079	4111	a	a	+
+chr2	4079	4111	a	a	+
+chr2	4047	4079	b	b	-
+chr2	4047	4079	b	b	-
+chr2	4047	4079	b	b	-
+chr2	4047	4079	b	b	-
+chr2	4047	4079	b	b	-
+chr2	4047	4079	b	b	-
+chr2	4047	4079	b	b	-
+chr2	4047	4079	b	b	-
+chr2	4047	4079	b	b	-
+chr2	4047	4079	b	b	-
+chr2	4047	4079	b	b	-
+chr2	4047	4079	b	b	-
+chr2	4047	4079	b	b	-
+chr2	4084	4116	a	a	+
+chr2	4090	4122	a	a	+
+chr2	4094	4126	a	a	+
+chr2	4094	4126	a	a	+
+chr2	4094	4126	a	a	+
+chr2	4095	4127	a	a	+
+chr2	4095	4127	a	a	+
+chr2	4095	4127	a	a	+
+chr2	4102	4134	a	a	+
+chr2	4070	4102	b	b	-
+chr2	4070	4102	b	b	-
+chr2	4070	4102	b	b	-
+chr2	4070	4102	b	b	-
+chr2	4077	4109	b	b	-
+chr2	4077	4109	b	b	-
+chr2	4112	4144	a	a	+
+chr2	4174	4206	a	a	+
+chr2	4183	4215	a	a	+
+chr2	4157	4189	b	b	-
+chr2	4169	4201	b	b	-
+chr2	4203	4235	a	a	+
+chr2	4209	4241	a	a	+
+chr2	4209	4241	a	a	+
+chr2	4179	4211	b	b	-
+chr2	4179	4211	b	b	-
+chr2	4196	4228	b	b	-
+chr2	4197	4229	b	b	-
+chr2	4200	4232	b	b	-
+chr2	4233	4265	a	a	+
+chr2	4233	4265	a	a	+
+chr2	4234	4266	a	a	+
+chr2	4234	4266	a	a	+
+chr2	4236	4268	a	a	+
+chr2	4236	4268	a	a	+
+chr2	4207	4239	b	b	-
+chr2	4218	4250	b	b	-
+chr2	4220	4252	b	b	-
+chr2	4220	4252	b	b	-
+chr2	4224	4256	b	b	-
+chr2	4229	4261	b	b	-
+chr2	4229	4261	b	b	-
+chr2	4231	4263	b	b	-
+chr2	4232	4264	b	b	-
+chr2	4267	4299	a	a	+
+chr2	4267	4299	a	a	+
+chr2	4270	4302	a	a	+
+chr2	4251	4283	b	b	-
+chr2	4251	4283	b	b	-
+chr2	4251	4283	b	b	-
+chr2	4285	4317	a	a	+
+chr2	4253	4285	b	b	-
+chr2	4286	4318	a	a	+
+chr2	4255	4287	b	b	-
+chr2	4257	4289	b	b	-
+chr2	4292	4324	a	a	+
+chr2	4294	4326	a	a	+
+chr2	4295	4327	a	a	+
+chr2	4296	4328	a	a	+
+chr2	4304	4336	a	a	+
+chr2	4281	4313	b	b	-
+chr2	4287	4319	b	b	-
+chr2	4287	4319	b	b	-
+chr2	4290	4322	b	b	-
+chr2	4291	4323	b	b	-
+chr2	4324	4356	a	a	+
+chr2	4294	4326	b	b	-
+chr2	4294	4326	b	b	-
+chr2	4303	4335	b	b	-
+chr2	4342	4374	a	a	+
+chr2	4312	4344	b	b	-
+chr2	4313	4345	b	b	-
+chr2	4314	4346	b	b	-
+chr2	4351	4383	a	a	+
+chr2	4324	4356	b	b	-
+chr2	4357	4389	a	a	+
+chr2	4359	4391	a	a	+
+chr2	4359	4391	a	a	+
+chr2	4331	4363	b	b	-
+chr2	4368	4400	a	a	+
+chr2	4340	4372	b	b	-
+chr2	4376	4408	a	a	+
+chr2	4347	4379	b	b	-
+chr2	4381	4413	a	a	+
+chr2	4381	4413	a	a	+
+chr2	4381	4413	a	a	+
+chr2	4382	4414	a	a	+
+chr2	4382	4414	a	a	+
+chr2	4355	4387	b	b	-
+chr2	4388	4420	a	a	+
+chr2	4388	4420	a	a	+
+chr2	4357	4389	b	b	-
+chr2	4359	4391	b	b	-
+chr2	4359	4391	b	b	-
+chr2	4360	4392	b	b	-
+chr2	4396	4428	a	a	+
+chr2	4401	4433	a	a	+
+chr2	4373	4405	b	b	-
+chr2	4406	4438	a	a	+
+chr2	4377	4409	b	b	-
+chr2	4377	4409	b	b	-
+chr2	4410	4442	a	a	+
+chr2	4412	4444	a	a	+
+chr2	4388	4420	b	b	-
+chr2	4423	4455	a	a	+
+chr2	4423	4455	a	a	+
+chr2	4391	4423	b	b	-
+chr2	4426	4458	a	a	+
+chr2	4399	4431	b	b	-
+chr2	4401	4433	b	b	-
+chr2	4401	4433	b	b	-
+chr2	4401	4433	b	b	-
+chr2	4434	4466	a	a	+
+chr2	4435	4467	a	a	+
+chr2	4450	4482	a	a	+
+chr2	4418	4450	b	b	-
+chr2	4456	4488	a	a	+
+chr2	4460	4492	a	a	+
+chr2	4428	4460	b	b	-
+chr2	4428	4460	b	b	-
+chr2	4428	4460	b	b	-
+chr2	4428	4460	b	b	-
+chr2	4428	4460	b	b	-
+chr2	4428	4460	b	b	-
+chr2	4428	4460	b	b	-
+chr2	4465	4497	a	a	+
+chr2	4465	4497	a	a	+
+chr2	4465	4497	a	a	+
+chr2	4469	4501	a	a	+
+chr2	4473	4505	a	a	+
+chr2	4476	4508	a	a	+
+chr2	4481	4513	a	a	+
+chr2	4456	4488	b	b	-
+chr2	4456	4488	b	b	-
+chr2	4457	4489	b	b	-
+chr2	4493	4525	a	a	+
+chr2	4465	4497	b	b	-
+chr2	4467	4499	b	b	-
+chr2	4503	4535	a	a	+
+chr2	4505	4537	a	a	+
+chr2	4505	4537	a	a	+
+chr2	4506	4538	a	a	+
+chr2	4506	4538	a	a	+
+chr2	4506	4538	a	a	+
+chr2	4511	4543	a	a	+
+chr2	4511	4543	a	a	+
+chr2	4512	4544	a	a	+
+chr2	4512	4544	a	a	+
+chr2	4512	4544	a	a	+
+chr2	4512	4544	a	a	+
+chr2	4491	4523	b	b	-
+chr2	4505	4537	b	b	-
+chr2	4540	4572	a	a	+
+chr2	4540	4572	a	a	+
+chr2	4540	4572	a	a	+
+chr2	4543	4575	a	a	+
+chr2	4516	4548	b	b	-
+chr2	4557	4589	a	a	+
+chr2	4560	4592	a	a	+
+chr2	4531	4563	b	b	-
+chr2	4532	4564	b	b	-
+chr2	4532	4564	b	b	-
+chr2	4569	4601	a	a	+
+chr2	4569	4601	a	a	+
+chr2	4578	4610	a	a	+
+chr2	4579	4611	a	a	+
+chr2	4581	4613	a	a	+
+chr2	4561	4593	b	b	-
+chr2	4602	4634	a	a	+
+chr2	4606	4638	a	a	+
+chr2	4610	4642	a	a	+
+chr2	4581	4613	b	b	-
+chr2	4581	4613	b	b	-
+chr2	4587	4619	b	b	-
+chr2	4630	4662	a	a	+
+chr2	4631	4663	a	a	+
+chr2	4601	4633	b	b	-
+chr2	4641	4673	a	a	+
+chr2	4641	4673	a	a	+
+chr2	4653	4685	a	a	+
+chr2	4653	4685	a	a	+
+chr2	4653	4685	a	a	+
+chr2	4653	4685	a	a	+
+chr2	4653	4685	a	a	+
+chr2	4653	4685	a	a	+
+chr2	4629	4661	b	b	-
+chr2	4635	4667	b	b	-
+chr2	4636	4668	b	b	-
+chr2	4669	4701	a	a	+
+chr2	4673	4705	a	a	+
+chr2	4673	4705	a	a	+
+chr2	4642	4674	b	b	-
+chr2	4642	4674	b	b	-
+chr2	4642	4674	b	b	-
+chr2	4642	4674	b	b	-
+chr2	4679	4711	a	a	+
+chr2	4648	4680	b	b	-
+chr2	4650	4682	b	b	-
+chr2	4689	4721	a	a	+
+chr2	4691	4723	a	a	+
+chr2	4691	4723	a	a	+
+chr2	4696	4728	a	a	+
+chr2	4701	4733	a	a	+
+chr2	4701	4733	a	a	+
+chr2	4701	4733	a	a	+
+chr2	4669	4701	b	b	-
+chr2	4669	4701	b	b	-
+chr2	4669	4701	b	b	-
+chr2	4706	4738	a	a	+
+chr2	4707	4739	a	a	+
+chr2	4676	4708	b	b	-
+chr2	4676	4708	b	b	-
+chr2	4676	4708	b	b	-
+chr2	4676	4708	b	b	-
+chr2	4677	4709	b	b	-
+chr2	4677	4709	b	b	-
+chr2	4715	4747	a	a	+
+chr2	4715	4747	a	a	+
+chr2	4683	4715	b	b	-
+chr2	4684	4716	b	b	-
+chr2	4725	4757	a	a	+
+chr2	4725	4757	a	a	+
+chr2	4693	4725	b	b	-
+chr2	4727	4759	a	a	+
+chr2	4728	4760	a	a	+
+chr2	4729	4761	a	a	+
+chr2	4706	4738	b	b	-
+chr2	4706	4738	b	b	-
+chr2	4707	4739	b	b	-
+chr2	4743	4775	a	a	+
+chr2	4722	4754	b	b	-
+chr2	4726	4758	b	b	-
+chr2	4737	4769	b	b	-
+chr2	4754	4786	b	b	-
+chr2	4796	4828	a	a	+
+chr2	4797	4829	a	a	+
+chr2	4765	4797	b	b	-
+chr2	4766	4798	b	b	-
+chr2	4768	4800	b	b	-
+chr2	4820	4852	a	a	+
+chr2	4788	4820	b	b	-
+chr2	4793	4825	b	b	-
+chr2	4794	4826	b	b	-
+chr2	4798	4830	b	b	-
+chr2	4832	4864	a	a	+
+chr2	4835	4867	a	a	+
+chr2	4808	4840	b	b	-
+chr2	4813	4845	b	b	-
+chr2	4848	4880	a	a	+
+chr2	4817	4849	b	b	-
+chr2	4821	4853	b	b	-
+chr2	4855	4887	a	a	+
+chr2	4825	4857	b	b	-
+chr2	4825	4857	b	b	-
+chr2	4830	4862	b	b	-
+chr2	4830	4862	b	b	-
+chr2	4832	4864	b	b	-
+chr2	4865	4897	a	a	+
+chr2	4833	4865	b	b	-
+chr2	4834	4866	b	b	-
+chr2	4834	4866	b	b	-
+chr2	4867	4899	a	a	+
+chr2	4868	4900	a	a	+
+chr2	4868	4900	a	a	+
+chr2	4837	4869	b	b	-
+chr2	4870	4902	a	a	+
+chr2	4838	4870	b	b	-
+chr2	4838	4870	b	b	-
+chr2	4871	4903	a	a	+
+chr2	4839	4871	b	b	-
+chr2	4839	4871	b	b	-
+chr2	4872	4904	a	a	+
+chr2	4840	4872	b	b	-
+chr2	4873	4905	a	a	+
+chr2	4873	4905	a	a	+
+chr2	4880	4912	a	a	+
+chr2	4881	4913	a	a	+
+chr2	4852	4884	b	b	-
+chr2	4885	4917	a	a	+
+chr2	4886	4918	a	a	+
+chr2	4886	4918	a	a	+
+chr2	4886	4918	a	a	+
+chr2	4854	4886	b	b	-
+chr2	4854	4886	b	b	-
+chr2	4854	4886	b	b	-
+chr2	4854	4886	b	b	-
+chr2	4854	4886	b	b	-
+chr2	4855	4887	b	b	-
+chr2	4890	4922	a	a	+
+chr2	4891	4923	a	a	+
+chr2	4891	4923	a	a	+
+chr2	4891	4923	a	a	+
+chr2	4860	4892	b	b	-
+chr2	4863	4895	b	b	-
+chr2	4863	4895	b	b	-
+chr2	4863	4895	b	b	-
+chr2	4897	4929	a	a	+
+chr2	4872	4904	b	b	-
+chr2	4873	4905	b	b	-
+chr2	4907	4939	a	a	+
+chr2	4908	4940	a	a	+
+chr2	4908	4940	a	a	+
+chr2	4909	4941	a	a	+
+chr2	4909	4941	a	a	+
+chr2	4909	4941	a	a	+
+chr2	4909	4941	a	a	+
+chr2	4909	4941	a	a	+
+chr2	4910	4942	a	a	+
+chr2	4910	4942	a	a	+
+chr2	4910	4942	a	a	+
+chr2	4878	4910	b	b	-
+chr2	4879	4911	b	b	-
+chr2	4879	4911	b	b	-
+chr2	4882	4914	b	b	-
+chr2	4882	4914	b	b	-
+chr2	4882	4914	b	b	-
+chr2	4883	4915	b	b	-
+chr2	4917	4949	a	a	+
+chr2	4917	4949	a	a	+
+chr2	4889	4921	b	b	-
+chr2	4889	4921	b	b	-
+chr2	4889	4921	b	b	-
+chr2	4889	4921	b	b	-
+chr2	4889	4921	b	b	-
+chr2	4889	4921	b	b	-
+chr2	4890	4922	b	b	-
+chr2	4923	4955	a	a	+
+chr2	4925	4957	a	a	+
+chr2	4925	4957	a	a	+
+chr2	4925	4957	a	a	+
+chr2	4925	4957	a	a	+
+chr2	4925	4957	a	a	+
+chr2	4925	4957	a	a	+
+chr2	4925	4957	a	a	+
+chr2	4925	4957	a	a	+
+chr2	4895	4927	b	b	-
+chr2	4896	4928	b	b	-
+chr2	4896	4928	b	b	-
+chr2	4899	4931	b	b	-
+chr2	4933	4965	a	a	+
+chr2	4934	4966	a	a	+
+chr2	4934	4966	a	a	+
+chr2	4935	4967	a	a	+
+chr2	4903	4935	b	b	-
+chr2	4903	4935	b	b	-
+chr2	4916	4948	b	b	-
+chr2	4959	4991	a	a	+
+chr2	4973	5005	a	a	+
+chr2	4944	4976	b	b	-
+chr2	4987	5019	a	a	+
+chr2	5004	5036	a	a	+
+chr2	4981	5013	b	b	-
+chr2	5020	5052	a	a	+
+chr2	5023	5055	a	a	+
+chr2	5005	5037	b	b	-
+chr2	5005	5037	b	b	-
+chr2	5006	5038	b	b	-
+chr2	5006	5038	b	b	-
+chr2	5047	5079	a	a	+
+chr2	5067	5099	b	b	-
+chr2	5077	5109	b	b	-
+chr2	5116	5148	a	a	+
+chr2	5116	5148	a	a	+
+chr2	5094	5126	b	b	-
+chr2	5095	5127	b	b	-
+chr2	5097	5129	b	b	-
+chr2	5097	5129	b	b	-
+chr2	5097	5129	b	b	-
+chr2	5097	5129	b	b	-
+chr2	5100	5132	b	b	-
+chr2	5107	5139	b	b	-
+chr2	5113	5145	b	b	-
+chr2	5116	5148	b	b	-
+chr2	5162	5194	a	a	+
+chr2	5130	5162	b	b	-
+chr2	5168	5200	a	a	+
+chr2	5168	5200	a	a	+
+chr2	5168	5200	a	a	+
+chr2	5146	5178	b	b	-
+chr2	5146	5178	b	b	-
+chr2	5146	5178	b	b	-
+chr2	5188	5220	a	a	+
+chr2	5157	5189	b	b	-
+chr2	5191	5223	a	a	+
+chr2	5195	5227	a	a	+
+chr2	5195	5227	a	a	+
+chr2	5165	5197	b	b	-
+chr2	5200	5232	a	a	+
+chr2	5200	5232	a	a	+
+chr2	5200	5232	a	a	+
+chr2	5171	5203	b	b	-
+chr2	5178	5210	b	b	-
+chr2	5211	5243	a	a	+
+chr2	5211	5243	a	a	+
+chr2	5211	5243	a	a	+
+chr2	5183	5215	b	b	-
+chr2	5218	5250	a	a	+
+chr2	5218	5250	a	a	+
+chr2	5218	5250	a	a	+
+chr2	5218	5250	a	a	+
+chr2	5218	5250	a	a	+
+chr2	5188	5220	b	b	-
+chr2	5221	5253	a	a	+
+chr2	5222	5254	a	a	+
+chr2	5191	5223	b	b	-
+chr2	5224	5256	a	a	+
+chr2	5230	5262	a	a	+
+chr2	5231	5263	a	a	+
+chr2	5231	5263	a	a	+
+chr2	5231	5263	a	a	+
+chr2	5231	5263	a	a	+
+chr2	5236	5268	a	a	+
+chr2	5237	5269	a	a	+
+chr2	5207	5239	b	b	-
+chr2	5207	5239	b	b	-
+chr2	5207	5239	b	b	-
+chr2	5207	5239	b	b	-
+chr2	5208	5240	b	b	-
+chr2	5208	5240	b	b	-
+chr2	5208	5240	b	b	-
+chr2	5244	5276	a	a	+
+chr2	5244	5276	a	a	+
+chr2	5246	5278	a	a	+
+chr2	5246	5278	a	a	+
+chr2	5246	5278	a	a	+
+chr2	5216	5248	b	b	-
+chr2	5216	5248	b	b	-
+chr2	5249	5281	a	a	+
+chr2	5250	5282	a	a	+
+chr2	5224	5256	b	b	-
+chr2	5224	5256	b	b	-
+chr2	5224	5256	b	b	-
+chr2	5258	5290	a	a	+
+chr2	5228	5260	b	b	-
+chr2	5228	5260	b	b	-
+chr2	5229	5261	b	b	-
+chr2	5229	5261	b	b	-
+chr2	5237	5269	b	b	-
+chr2	5238	5270	b	b	-
+chr2	5241	5273	b	b	-
+chr2	5279	5311	a	a	+
+chr2	5248	5280	b	b	-
+chr2	5287	5319	a	a	+
+chr2	5287	5319	a	a	+
+chr2	5288	5320	a	a	+
+chr2	5290	5322	a	a	+
+chr2	5290	5322	a	a	+
+chr2	5290	5322	a	a	+
+chr2	5290	5322	a	a	+
+chr2	5290	5322	a	a	+
+chr2	5290	5322	a	a	+
+chr2	5291	5323	a	a	+
+chr2	5291	5323	a	a	+
+chr2	5291	5323	a	a	+
+chr2	5259	5291	b	b	-
+chr2	5260	5292	b	b	-
+chr2	5260	5292	b	b	-
+chr2	5260	5292	b	b	-
+chr2	5295	5327	a	a	+
+chr2	5295	5327	a	a	+
+chr2	5296	5328	a	a	+
+chr2	5268	5300	b	b	-
+chr2	5268	5300	b	b	-
+chr2	5308	5340	a	a	+
+chr2	5294	5326	b	b	-
+chr2	5294	5326	b	b	-
+chr2	5330	5362	a	a	+
+chr2	5299	5331	b	b	-
+chr2	5334	5366	a	a	+
+chr2	5335	5367	a	a	+
+chr2	5336	5368	a	a	+
+chr2	5304	5336	b	b	-
+chr2	5304	5336	b	b	-
+chr2	5304	5336	b	b	-
+chr2	5339	5371	a	a	+
+chr2	5343	5375	a	a	+
+chr2	5343	5375	a	a	+
+chr2	5347	5379	a	a	+
+chr2	5349	5381	a	a	+
+chr2	5350	5382	a	a	+
+chr2	5350	5382	a	a	+
+chr2	5319	5351	b	b	-
+chr2	5320	5352	b	b	-
+chr2	5353	5385	a	a	+
+chr2	5322	5354	b	b	-
+chr2	5323	5355	b	b	-
+chr2	5323	5355	b	b	-
+chr2	5323	5355	b	b	-
+chr2	5323	5355	b	b	-
+chr2	5323	5355	b	b	-
+chr2	5323	5355	b	b	-
+chr2	5323	5355	b	b	-
+chr2	5323	5355	b	b	-
+chr2	5323	5355	b	b	-
+chr2	5323	5355	b	b	-
+chr2	5323	5355	b	b	-
+chr2	5323	5355	b	b	-
+chr2	5324	5356	b	b	-
+chr2	5324	5356	b	b	-
+chr2	5325	5357	b	b	-
+chr2	5325	5357	b	b	-
+chr2	5325	5357	b	b	-
+chr2	5325	5357	b	b	-
+chr2	5325	5357	b	b	-
+chr2	5325	5357	b	b	-
+chr2	5358	5390	a	a	+
+chr2	5326	5358	b	b	-
+chr2	5327	5359	b	b	-
+chr2	5328	5360	b	b	-
+chr2	5362	5394	a	a	+
+chr2	5362	5394	a	a	+
+chr2	5362	5394	a	a	+
+chr2	5362	5394	a	a	+
+chr2	5362	5394	a	a	+
+chr2	5362	5394	a	a	+
+chr2	5362	5394	a	a	+
+chr2	5362	5394	a	a	+
+chr2	5362	5394	a	a	+
+chr2	5331	5363	b	b	-
+chr2	5331	5363	b	b	-
+chr2	5331	5363	b	b	-
+chr2	5332	5364	b	b	-
+chr2	5332	5364	b	b	-
+chr2	5365	5397	a	a	+
+chr2	5365	5397	a	a	+
+chr2	5365	5397	a	a	+
+chr2	5365	5397	a	a	+
+chr2	5365	5397	a	a	+
+chr2	5365	5397	a	a	+
+chr2	5365	5397	a	a	+
+chr2	5333	5365	b	b	-
+chr2	5335	5367	b	b	-
+chr2	5335	5367	b	b	-
+chr2	5335	5367	b	b	-
+chr2	5335	5367	b	b	-
+chr2	5335	5367	b	b	-
+chr2	5336	5368	b	b	-
+chr2	5336	5368	b	b	-
+chr2	5336	5368	b	b	-
+chr2	5336	5368	b	b	-
+chr2	5336	5368	b	b	-
+chr2	5336	5368	b	b	-
+chr2	5369	5401	a	a	+
+chr2	5337	5369	b	b	-
+chr2	5337	5369	b	b	-
+chr2	5370	5402	a	a	+
+chr2	5339	5371	b	b	-
+chr2	5339	5371	b	b	-
+chr2	5339	5371	b	b	-
+chr2	5339	5371	b	b	-
+chr2	5340	5372	b	b	-
+chr2	5341	5373	b	b	-
+chr2	5341	5373	b	b	-
+chr2	5341	5373	b	b	-
+chr2	5341	5373	b	b	-
+chr2	5341	5373	b	b	-
+chr2	5374	5406	a	a	+
+chr2	5374	5406	a	a	+
+chr2	5374	5406	a	a	+
+chr2	5374	5406	a	a	+
+chr2	5374	5406	a	a	+
+chr2	5374	5406	a	a	+
+chr2	5342	5374	b	b	-
+chr2	5375	5407	a	a	+
+chr2	5375	5407	a	a	+
+chr2	5375	5407	a	a	+
+chr2	5343	5375	b	b	-
+chr2	5344	5376	b	b	-
+chr2	5346	5378	b	b	-
+chr2	5346	5378	b	b	-
+chr2	5353	5385	b	b	-
+chr2	5353	5385	b	b	-
+chr2	5353	5385	b	b	-
+chr2	5353	5385	b	b	-
+chr2	5353	5385	b	b	-
+chr2	5354	5386	b	b	-
+chr2	5356	5388	b	b	-
+chr2	5356	5388	b	b	-
+chr2	5356	5388	b	b	-
+chr2	5391	5423	a	a	+
+chr2	5391	5423	a	a	+
+chr2	5391	5423	a	a	+
+chr2	5392	5424	a	a	+
+chr2	5393	5425	a	a	+
+chr2	5393	5425	a	a	+
+chr2	5393	5425	a	a	+
+chr2	5393	5425	a	a	+
+chr2	5393	5425	a	a	+
+chr2	5393	5425	a	a	+
+chr2	5393	5425	a	a	+
+chr2	5393	5425	a	a	+
+chr2	5393	5425	a	a	+
+chr2	5393	5425	a	a	+
+chr2	5393	5425	a	a	+
+chr2	5393	5425	a	a	+
+chr2	5393	5425	a	a	+
+chr2	5395	5427	a	a	+
+chr2	5363	5395	b	b	-
+chr2	5396	5428	a	a	+
+chr2	5396	5428	a	a	+
+chr2	5396	5428	a	a	+
+chr2	5396	5428	a	a	+
+chr2	5396	5428	a	a	+
+chr2	5396	5428	a	a	+
+chr2	5396	5428	a	a	+
+chr2	5396	5428	a	a	+
+chr2	5396	5428	a	a	+
+chr2	5396	5428	a	a	+
+chr2	5396	5428	a	a	+
+chr2	5396	5428	a	a	+
+chr2	5396	5428	a	a	+
+chr2	5396	5428	a	a	+
+chr2	5396	5428	a	a	+
+chr2	5396	5428	a	a	+
+chr2	5396	5428	a	a	+
+chr2	5368	5400	b	b	-
+chr2	5368	5400	b	b	-
+chr2	5368	5400	b	b	-
+chr2	5368	5400	b	b	-
+chr2	5368	5400	b	b	-
+chr2	5369	5401	b	b	-
+chr2	5403	5435	a	a	+
+chr2	5403	5435	a	a	+
+chr2	5403	5435	a	a	+
+chr2	5403	5435	a	a	+
+chr2	5403	5435	a	a	+
+chr2	5376	5408	b	b	-
+chr2	5376	5408	b	b	-
+chr2	5376	5408	b	b	-
+chr2	5376	5408	b	b	-
+chr2	5376	5408	b	b	-
+chr2	5376	5408	b	b	-
+chr2	5376	5408	b	b	-
+chr2	5376	5408	b	b	-
+chr2	5377	5409	b	b	-
+chr2	5377	5409	b	b	-
+chr2	5377	5409	b	b	-
+chr2	5377	5409	b	b	-
+chr2	5377	5409	b	b	-
+chr2	5410	5442	a	a	+
+chr2	5410	5442	a	a	+
+chr2	5410	5442	a	a	+
+chr2	5410	5442	a	a	+
+chr2	5410	5442	a	a	+
+chr2	5410	5442	a	a	+
+chr2	5410	5442	a	a	+
+chr2	5378	5410	b	b	-
+chr2	5378	5410	b	b	-
+chr2	5411	5443	a	a	+
+chr2	5411	5443	a	a	+
+chr2	5411	5443	a	a	+
+chr2	5411	5443	a	a	+
+chr2	5411	5443	a	a	+
+chr2	5412	5444	a	a	+
+chr2	5412	5444	a	a	+
+chr2	5415	5447	a	a	+
+chr2	5416	5448	a	a	+
+chr2	5416	5448	a	a	+
+chr2	5384	5416	b	b	-
+chr2	5417	5449	a	a	+
+chr2	5417	5449	a	a	+
+chr2	5417	5449	a	a	+
+chr2	5420	5452	a	a	+
+chr2	5420	5452	a	a	+
+chr2	5421	5453	a	a	+
+chr2	5421	5453	a	a	+
+chr2	5421	5453	a	a	+
+chr2	5421	5453	a	a	+
+chr2	5422	5454	a	a	+
+chr2	5422	5454	a	a	+
+chr2	5422	5454	a	a	+
+chr2	5422	5454	a	a	+
+chr2	5422	5454	a	a	+
+chr2	5422	5454	a	a	+
+chr2	5422	5454	a	a	+
+chr2	5422	5454	a	a	+
+chr2	5422	5454	a	a	+
+chr2	5422	5454	a	a	+
+chr2	5422	5454	a	a	+
+chr2	5422	5454	a	a	+
+chr2	5422	5454	a	a	+
+chr2	5422	5454	a	a	+
+chr2	5422	5454	a	a	+
+chr2	5422	5454	a	a	+
+chr2	5422	5454	a	a	+
+chr2	5422	5454	a	a	+
+chr2	5423	5455	a	a	+
+chr2	5423	5455	a	a	+
+chr2	5423	5455	a	a	+
+chr2	5423	5455	a	a	+
+chr2	5423	5455	a	a	+
+chr2	5423	5455	a	a	+
+chr2	5423	5455	a	a	+
+chr2	5423	5455	a	a	+
+chr2	5423	5455	a	a	+
+chr2	5423	5455	a	a	+
+chr2	5423	5455	a	a	+
+chr2	5423	5455	a	a	+
+chr2	5423	5455	a	a	+
+chr2	5423	5455	a	a	+
+chr2	5423	5455	a	a	+
+chr2	5423	5455	a	a	+
+chr2	5424	5456	a	a	+
+chr2	5426	5458	a	a	+
+chr2	5426	5458	a	a	+
+chr2	5426	5458	a	a	+
+chr2	5426	5458	a	a	+
+chr2	5426	5458	a	a	+
+chr2	5427	5459	a	a	+
+chr2	5427	5459	a	a	+
+chr2	5427	5459	a	a	+
+chr2	5427	5459	a	a	+
+chr2	5430	5462	a	a	+
+chr2	5430	5462	a	a	+
+chr2	5435	5467	a	a	+
+chr2	5438	5470	a	a	+
+chr2	5438	5470	a	a	+
+chr2	5439	5471	a	a	+
+chr2	5439	5471	a	a	+
+chr2	5407	5439	b	b	-
+chr2	5408	5440	b	b	-
+chr2	5443	5475	a	a	+
+chr2	5443	5475	a	a	+
+chr2	5443	5475	a	a	+
+chr2	5443	5475	a	a	+
+chr2	5444	5476	a	a	+
+chr2	5444	5476	a	a	+
+chr2	5444	5476	a	a	+
+chr2	5444	5476	a	a	+
+chr2	5444	5476	a	a	+
+chr2	5446	5478	a	a	+
+chr2	5447	5479	a	a	+
+chr2	5458	5490	a	a	+
+chr2	5460	5492	a	a	+
+chr2	5484	5516	a	a	+
+chr2	5616	5648	a	a	+
+chr2	5623	5655	b	b	-
+chr2	5682	5714	b	b	-
+chr2	5747	5779	a	a	+
+chr2	5733	5765	b	b	-
+chr2	5733	5765	b	b	-
+chr2	5813	5845	a	a	+
+chr2	5909	5941	b	b	-
+chr2	5966	5998	a	a	+
+chr2	5975	6007	b	b	-
+chr2	5975	6007	b	b	-
+chr2	6022	6054	a	a	+
+chr2	6022	6054	a	a	+
+chr2	5994	6026	b	b	-
+chr2	5998	6030	b	b	-
+chr2	6031	6063	a	a	+
+chr2	6036	6068	a	a	+
+chr2	6010	6042	b	b	-
+chr2	6044	6076	a	a	+
+chr2	6026	6058	b	b	-
+chr2	6026	6058	b	b	-
+chr2	6026	6058	b	b	-
+chr2	6102	6134	b	b	-
+chr2	6106	6138	b	b	-
+chr2	6113	6145	b	b	-
+chr2	6146	6178	a	a	+
+chr2	6146	6178	a	a	+
+chr2	6146	6178	a	a	+
+chr2	6148	6180	a	a	+
+chr2	6119	6151	b	b	-
+chr2	6141	6173	b	b	-
+chr2	6141	6173	b	b	-
+chr2	6142	6174	b	b	-
+chr2	6146	6178	b	b	-
+chr2	6146	6178	b	b	-
+chr2	6146	6178	b	b	-
+chr2	6182	6214	a	a	+
+chr2	6190	6222	a	a	+
+chr2	6190	6222	a	a	+
+chr2	6204	6236	a	a	+
+chr2	6205	6237	a	a	+
+chr2	6205	6237	a	a	+
+chr2	6177	6209	b	b	-
+chr2	6177	6209	b	b	-
+chr2	6177	6209	b	b	-
+chr2	6189	6221	b	b	-
+chr2	6194	6226	b	b	-
+chr2	6194	6226	b	b	-
+chr2	6231	6263	a	a	+
+chr2	6237	6269	a	a	+
+chr2	6218	6250	b	b	-
+chr2	6221	6253	b	b	-
+chr2	6277	6309	a	a	+
+chr2	6300	6332	b	b	-
+chr2	6362	6394	b	b	-
+chr2	6368	6400	b	b	-
+chr2	6403	6435	a	a	+
+chr2	6403	6435	a	a	+
+chr2	6382	6414	b	b	-
+chr2	6418	6450	a	a	+
+chr2	6419	6451	a	a	+
+chr2	6387	6419	b	b	-
+chr2	6388	6420	b	b	-
+chr2	6421	6453	a	a	+
+chr2	6421	6453	a	a	+
+chr2	6389	6421	b	b	-
+chr2	6427	6459	a	a	+
+chr2	6430	6462	a	a	+
+chr2	6430	6462	a	a	+
+chr2	6403	6435	b	b	-
+chr2	6403	6435	b	b	-
+chr2	6436	6468	a	a	+
+chr2	6436	6468	a	a	+
+chr2	6436	6468	a	a	+
+chr2	6404	6436	b	b	-
+chr2	6404	6436	b	b	-
+chr2	6404	6436	b	b	-
+chr2	6445	6477	a	a	+
+chr2	6446	6478	a	a	+
+chr2	6416	6448	b	b	-
+chr2	6635	6667	b	b	-
+chr2	6669	6701	a	a	+
+chr2	6673	6705	a	a	+
+chr2	6648	6680	b	b	-
+chr2	6693	6725	a	a	+
+chr2	6733	6765	a	a	+
+chr2	6897	6929	a	a	+
+chr2	7079	7111	b	b	-
+chr2	7139	7171	a	a	+
+chr2	7139	7171	a	a	+
+chr2	7321	7353	a	a	+
+chr2	7362	7394	a	a	+
+chr2	7361	7393	b	b	-
+chr2	7361	7393	b	b	-
+chr2	7368	7400	b	b	-
+chr2	7407	7439	a	a	+
+chr2	7375	7407	b	b	-
+chr2	7448	7480	a	a	+
+chr2	7602	7634	b	b	-
+chr2	7608	7640	b	b	-
+chr2	7608	7640	b	b	-
+chr2	7614	7646	b	b	-
+chr2	7647	7679	a	a	+
+chr2	7647	7679	a	a	+
+chr2	7615	7647	b	b	-
+chr2	7649	7681	a	a	+
+chr2	7649	7681	a	a	+
+chr2	7624	7656	b	b	-
+chr2	7624	7656	b	b	-
+chr2	7627	7659	b	b	-
+chr2	7665	7697	a	a	+
+chr2	7666	7698	a	a	+
+chr2	7634	7666	b	b	-
+chr2	7636	7668	b	b	-
+chr2	7637	7669	b	b	-
+chr2	7645	7677	b	b	-
+chr2	7645	7677	b	b	-
+chr2	7645	7677	b	b	-
+chr2	7645	7677	b	b	-
+chr2	7645	7677	b	b	-
+chr2	7678	7710	a	a	+
+chr2	7678	7710	a	a	+
+chr2	7678	7710	a	a	+
+chr2	7678	7710	a	a	+
+chr2	7678	7710	a	a	+
+chr2	7646	7678	b	b	-
+chr2	7646	7678	b	b	-
+chr2	7646	7678	b	b	-
+chr2	7646	7678	b	b	-
+chr2	7648	7680	b	b	-
+chr2	7651	7683	b	b	-
+chr2	7651	7683	b	b	-
+chr2	7651	7683	b	b	-
+chr2	7684	7716	a	a	+
+chr2	7684	7716	a	a	+
+chr2	7684	7716	a	a	+
+chr2	7684	7716	a	a	+
+chr2	7652	7684	b	b	-
+chr2	7687	7719	a	a	+
+chr2	7687	7719	a	a	+
+chr2	7655	7687	b	b	-
+chr2	7655	7687	b	b	-
+chr2	7655	7687	b	b	-
+chr2	7655	7687	b	b	-
+chr2	7688	7720	a	a	+
+chr2	7688	7720	a	a	+
+chr2	7690	7722	a	a	+
+chr2	7690	7722	a	a	+
+chr2	7659	7691	b	b	-
+chr2	7659	7691	b	b	-
+chr2	7692	7724	a	a	+
+chr2	7660	7692	b	b	-
+chr2	7661	7693	b	b	-
+chr2	7661	7693	b	b	-
+chr2	7662	7694	b	b	-
+chr2	7695	7727	a	a	+
+chr2	7663	7695	b	b	-
+chr2	7664	7696	b	b	-
+chr2	7664	7696	b	b	-
+chr2	7664	7696	b	b	-
+chr2	7665	7697	b	b	-
+chr2	7665	7697	b	b	-
+chr2	7665	7697	b	b	-
+chr2	7665	7697	b	b	-
+chr2	7665	7697	b	b	-
+chr2	7665	7697	b	b	-
+chr2	7666	7698	b	b	-
+chr2	7699	7731	a	a	+
+chr2	7699	7731	a	a	+
+chr2	7699	7731	a	a	+
+chr2	7668	7700	b	b	-
+chr2	7670	7702	b	b	-
+chr2	7706	7738	a	a	+
+chr2	7707	7739	a	a	+
+chr2	7676	7708	b	b	-
+chr2	7681	7713	b	b	-
+chr2	7714	7746	a	a	+
+chr2	7714	7746	a	a	+
+chr2	7682	7714	b	b	-
+chr2	7683	7715	b	b	-
+chr2	7686	7718	b	b	-
+chr2	7719	7751	a	a	+
+chr2	7719	7751	a	a	+
+chr2	7691	7723	b	b	-
+chr2	7724	7756	a	a	+
+chr2	7725	7757	a	a	+
+chr2	7702	7734	b	b	-
+chr2	7705	7737	b	b	-
+chr2	7706	7738	b	b	-
+chr2	7706	7738	b	b	-
+chr2	7708	7740	b	b	-
+chr2	7715	7747	b	b	-
+chr2	7757	7789	a	a	+
+chr2	7731	7763	b	b	-
+chr2	7733	7765	b	b	-
+chr2	7734	7766	b	b	-
+chr2	7771	7803	a	a	+
+chr2	7739	7771	b	b	-
+chr2	7739	7771	b	b	-
+chr2	7781	7813	a	a	+
+chr2	7795	7827	a	a	+
+chr2	7765	7797	b	b	-
+chr2	7765	7797	b	b	-
+chr2	7808	7840	a	a	+
+chr2	7808	7840	a	a	+
+chr2	7809	7841	a	a	+
+chr2	7809	7841	a	a	+
+chr2	7784	7816	b	b	-
+chr2	7785	7817	b	b	-
+chr2	7823	7855	a	a	+
+chr2	7824	7856	a	a	+
+chr2	7824	7856	a	a	+
+chr2	7827	7859	a	a	+
+chr2	7830	7862	a	a	+
+chr2	7831	7863	a	a	+
+chr2	7832	7864	a	a	+
+chr2	7832	7864	a	a	+
+chr2	7832	7864	a	a	+
+chr2	7840	7872	a	a	+
+chr2	7850	7882	a	a	+
+chr2	7850	7882	a	a	+
+chr2	7850	7882	a	a	+
+chr2	7850	7882	a	a	+
+chr2	7850	7882	a	a	+
+chr2	7850	7882	a	a	+
+chr2	7850	7882	a	a	+
+chr2	7850	7882	a	a	+
+chr2	7852	7884	a	a	+
+chr2	7827	7859	b	b	-
+chr2	7861	7893	a	a	+
+chr2	7861	7893	a	a	+
+chr2	7864	7896	a	a	+
+chr2	7864	7896	a	a	+
+chr2	7864	7896	a	a	+
+chr2	7867	7899	a	a	+
+chr2	7839	7871	b	b	-
+chr2	7874	7906	a	a	+
+chr2	7843	7875	b	b	-
+chr2	7849	7881	b	b	-
+chr2	7852	7884	b	b	-
+chr2	7852	7884	b	b	-
+chr2	7852	7884	b	b	-
+chr2	7853	7885	b	b	-
+chr2	7888	7920	a	a	+
+chr2	7894	7926	a	a	+
+chr2	7894	7926	a	a	+
+chr2	7894	7926	a	a	+
+chr2	7862	7894	b	b	-
+chr2	7862	7894	b	b	-
+chr2	7862	7894	b	b	-
+chr2	7868	7900	b	b	-
+chr2	7911	7943	a	a	+
+chr2	7918	7950	a	a	+
+chr2	7890	7922	b	b	-
+chr2	7944	7976	a	a	+
+chr2	7956	7988	a	a	+
+chr2	7927	7959	b	b	-
+chr2	7934	7966	b	b	-
+chr2	7991	8023	a	a	+
+chr2	8042	8074	a	a	+
+chr2	8016	8048	b	b	-
+chr2	8017	8049	b	b	-
+chr2	8017	8049	b	b	-
+chr2	8061	8093	b	b	-
+chr2	8124	8156	a	a	+
+chr2	8101	8133	b	b	-
+chr2	8101	8133	b	b	-
+chr2	8115	8147	b	b	-
+chr2	8161	8193	a	a	+
+chr2	8129	8161	b	b	-
+chr2	8162	8194	a	a	+
+chr2	8132	8164	b	b	-
+chr2	8166	8198	a	a	+
+chr2	8134	8166	b	b	-
+chr2	8134	8166	b	b	-
+chr2	8136	8168	b	b	-
+chr2	8136	8168	b	b	-
+chr2	8170	8202	a	a	+
+chr2	8139	8171	b	b	-
+chr2	8173	8205	a	a	+
+chr2	8174	8206	a	a	+
+chr2	8174	8206	a	a	+
+chr2	8177	8209	a	a	+
+chr2	8178	8210	a	a	+
+chr2	8178	8210	a	a	+
+chr2	8179	8211	a	a	+
+chr2	8149	8181	b	b	-
+chr2	8149	8181	b	b	-
+chr2	8149	8181	b	b	-
+chr2	8149	8181	b	b	-
+chr2	8182	8214	a	a	+
+chr2	8182	8214	a	a	+
+chr2	8150	8182	b	b	-
+chr2	8150	8182	b	b	-
+chr2	8183	8215	a	a	+
+chr2	8183	8215	a	a	+
+chr2	8152	8184	b	b	-
+chr2	8152	8184	b	b	-
+chr2	8152	8184	b	b	-
+chr2	8152	8184	b	b	-
+chr2	8186	8218	a	a	+
+chr2	8154	8186	b	b	-
+chr2	8154	8186	b	b	-
+chr2	8154	8186	b	b	-
+chr2	8155	8187	b	b	-
+chr2	8155	8187	b	b	-
+chr2	8155	8187	b	b	-
+chr2	8155	8187	b	b	-
+chr2	8155	8187	b	b	-
+chr2	8156	8188	b	b	-
+chr2	8160	8192	b	b	-
+chr2	8161	8193	b	b	-
+chr2	8197	8229	a	a	+
+chr2	8198	8230	a	a	+
+chr2	8198	8230	a	a	+
+chr2	8201	8233	a	a	+
+chr2	8201	8233	a	a	+
+chr2	8201	8233	a	a	+
+chr2	8201	8233	a	a	+
+chr2	8177	8209	b	b	-
+chr2	8213	8245	a	a	+
+chr2	8182	8214	b	b	-
+chr2	8221	8253	a	a	+
+chr2	8222	8254	a	a	+
+chr2	8344	8376	b	b	-
+chr2	8347	8379	b	b	-
+chr2	8392	8424	a	a	+
+chr2	8377	8409	b	b	-
+chr2	8439	8471	a	a	+
+chr2	8440	8472	a	a	+
+chr2	8440	8472	a	a	+
+chr2	8411	8443	b	b	-
+chr2	8412	8444	b	b	-
+chr2	8449	8481	a	a	+
+chr2	8454	8486	a	a	+
+chr2	8455	8487	a	a	+
+chr2	8432	8464	b	b	-
+chr2	8471	8503	a	a	+
+chr2	8439	8471	b	b	-
+chr2	8439	8471	b	b	-
+chr2	8443	8475	b	b	-
+chr2	8446	8478	b	b	-
+chr2	8448	8480	b	b	-
+chr2	8482	8514	a	a	+
+chr2	8450	8482	b	b	-
+chr2	8452	8484	b	b	-
+chr2	8452	8484	b	b	-
+chr2	8453	8485	b	b	-
+chr2	8453	8485	b	b	-
+chr2	8459	8491	b	b	-
+chr2	8494	8526	a	a	+
+chr2	8494	8526	a	a	+
+chr2	8481	8513	b	b	-
+chr2	8481	8513	b	b	-
+chr2	8603	8635	a	a	+
+chr2	8625	8657	a	a	+
+chr2	8641	8673	a	a	+
+chr2	8616	8648	b	b	-
+chr2	8787	8819	b	b	-
+chr2	9082	9114	b	b	-
+chr2	9085	9117	b	b	-
+chr2	9086	9118	b	b	-
+chr2	9090	9122	b	b	-
+chr2	9090	9122	b	b	-
+chr2	9110	9142	b	b	-
+chr2	9120	9152	b	b	-
+chr2	9121	9153	b	b	-
+chr2	9121	9153	b	b	-
+chr2	9122	9154	b	b	-
+chr2	9125	9157	b	b	-
+chr2	9125	9157	b	b	-
+chr2	9125	9157	b	b	-
+chr2	9126	9158	b	b	-
+chr2	9126	9158	b	b	-
+chr2	9126	9158	b	b	-
+chr2	9126	9158	b	b	-
+chr2	9126	9158	b	b	-
+chr2	9126	9158	b	b	-
+chr2	9165	9197	a	a	+
+chr2	9165	9197	a	a	+
+chr2	9165	9197	a	a	+
+chr2	9166	9198	a	a	+
+chr2	9166	9198	a	a	+
+chr2	9166	9198	a	a	+
+chr2	9166	9198	a	a	+
+chr2	9169	9201	a	a	+
+chr2	9137	9169	b	b	-
+chr2	9138	9170	b	b	-
+chr2	9140	9172	b	b	-
+chr2	9140	9172	b	b	-
+chr2	9141	9173	b	b	-
+chr2	9144	9176	b	b	-
+chr2	9144	9176	b	b	-
+chr2	9144	9176	b	b	-
+chr2	9144	9176	b	b	-
+chr2	9144	9176	b	b	-
+chr2	9180	9212	a	a	+
+chr2	9187	9219	a	a	+
+chr2	9190	9222	a	a	+
+chr2	9167	9199	b	b	-
+chr2	9200	9232	a	a	+
+chr2	9170	9202	b	b	-
+chr2	9207	9239	a	a	+
+chr2	9179	9211	b	b	-
+chr2	9212	9244	a	a	+
+chr2	9182	9214	b	b	-
+chr2	9183	9215	b	b	-
+chr2	9220	9252	a	a	+
+chr2	9222	9254	a	a	+
+chr2	9222	9254	a	a	+
+chr2	9228	9260	a	a	+
+chr2	9229	9261	a	a	+
+chr2	9201	9233	b	b	-
+chr2	9262	9294	a	a	+
+chr2	9262	9294	a	a	+
+chr2	9257	9289	b	b	-
+chr2	9311	9343	a	a	+
+chr2	9289	9321	b	b	-
+chr2	9296	9328	b	b	-
+chr2	9296	9328	b	b	-
+chr2	9305	9337	b	b	-
+chr2	9305	9337	b	b	-
+chr2	9316	9348	b	b	-
+chr2	9319	9351	b	b	-
+chr2	9319	9351	b	b	-
+chr2	9356	9388	a	a	+
+chr2	9356	9388	a	a	+
+chr2	9363	9395	a	a	+
+chr2	9363	9395	a	a	+
+chr2	9363	9395	a	a	+
+chr2	9367	9399	a	a	+
+chr2	9367	9399	a	a	+
+chr2	9370	9402	a	a	+
+chr2	9371	9403	a	a	+
+chr2	9373	9405	a	a	+
+chr2	9373	9405	a	a	+
+chr2	9373	9405	a	a	+
+chr2	9375	9407	a	a	+
+chr2	9375	9407	a	a	+
+chr2	9375	9407	a	a	+
+chr2	9375	9407	a	a	+
+chr2	9375	9407	a	a	+
+chr2	9376	9408	a	a	+
+chr2	9376	9408	a	a	+
+chr2	9376	9408	a	a	+
+chr2	9376	9408	a	a	+
+chr2	9376	9408	a	a	+
+chr2	9376	9408	a	a	+
+chr2	9376	9408	a	a	+
+chr2	9376	9408	a	a	+
+chr2	9376	9408	a	a	+
+chr2	9377	9409	a	a	+
+chr2	9377	9409	a	a	+
+chr2	9377	9409	a	a	+
+chr2	9378	9410	a	a	+
+chr2	9379	9411	a	a	+
+chr2	9380	9412	a	a	+
+chr2	9380	9412	a	a	+
+chr2	9389	9421	a	a	+
+chr2	9390	9422	a	a	+
+chr2	9394	9426	a	a	+
+chr2	9395	9427	a	a	+
+chr2	9400	9432	a	a	+
+chr2	9401	9433	a	a	+
+chr2	9406	9438	a	a	+
+chr2	9406	9438	a	a	+
+chr2	9432	9464	a	a	+
+chr2	9401	9433	b	b	-
+chr2	9401	9433	b	b	-
+chr2	9401	9433	b	b	-
+chr2	9950	9982	a	a	+
+chr2	9965	9997	a	a	+
+chr2	9973	10005	a	a	+
+chr2	9973	10005	a	a	+
+chr2	9973	10005	a	a	+
+chr2	9985	10017	a	a	+
+chr2	9989	10021	a	a	+
+chr2	9989	10021	a	a	+
+chr2	9961	9993	b	b	-
+chr2	10091	10123	b	b	-
+chr2	10091	10123	b	b	-
+chr2	10134	10166	a	a	+
+chr2	10311	10343	b	b	-
+chr2	10347	10379	a	a	+
+chr2	10413	10445	a	a	+
+chr2	10455	10487	a	a	+
+chr2	10434	10466	b	b	-
+chr2	10435	10467	b	b	-
+chr2	10435	10467	b	b	-
+chr2	10477	10509	a	a	+
+chr2	10477	10509	a	a	+
+chr2	10445	10477	b	b	-
+chr2	10482	10514	a	a	+
+chr2	10453	10485	b	b	-
+chr2	10453	10485	b	b	-
+chr2	10461	10493	b	b	-
+chr2	10464	10496	b	b	-
+chr2	10464	10496	b	b	-
+chr2	10498	10530	a	a	+
+chr2	10498	10530	a	a	+
+chr2	10467	10499	b	b	-
+chr2	10467	10499	b	b	-
+chr2	10467	10499	b	b	-
+chr2	10470	10502	b	b	-
+chr2	10483	10515	b	b	-
+chr2	10489	10521	b	b	-
+chr2	10541	10573	a	a	+
+chr2	10545	10577	a	a	+
+chr2	10721	10753	b	b	-
+chr2	10721	10753	b	b	-
+chr2	10725	10757	b	b	-
+chr2	10744	10776	b	b	-
+chr2	10780	10812	a	a	+
+chr2	10783	10815	a	a	+
+chr2	10751	10783	b	b	-
+chr2	10788	10820	a	a	+
+chr2	10788	10820	a	a	+
+chr2	10788	10820	a	a	+
+chr2	10789	10821	a	a	+
+chr2	10789	10821	a	a	+
+chr2	10761	10793	b	b	-
+chr2	10761	10793	b	b	-
+chr2	10764	10796	b	b	-
+chr2	10764	10796	b	b	-
+chr2	10768	10800	b	b	-
+chr2	10825	10857	a	a	+
+chr2	10901	10933	b	b	-
+chr2	10918	10950	b	b	-
+chr2	10918	10950	b	b	-
+chr2	11334	11366	b	b	-
+chr2	11406	11438	a	a	+
+chr2	11642	11674	b	b	-
+chr2	11642	11674	b	b	-
+chr2	11682	11714	a	a	+
+chr2	11877	11909	b	b	-
+chr2	12129	12161	b	b	-
+chr2	12303	12335	a	a	+
+chr2	12821	12853	a	a	+
+chr2	12919	12951	b	b	-
+chr2	12939	12971	b	b	-
+chr2	13492	13524	a	a	+
+chr2	13574	13606	a	a	+
+chr2	13666	13698	a	a	+
+chr2	13656	13688	b	b	-
+chr2	13675	13707	b	b	-
+chr2	13749	13781	a	a	+
+chr2	13818	13850	a	a	+
+chr2	13853	13885	b	b	-
+chr2	14352	14384	a	a	+
+chr2	14448	14480	a	a	+
+chr2	14491	14523	b	b	-
+chr2	15306	15338	b	b	-
+chr2	15457	15489	a	a	+
+chr2	15496	15528	b	b	-
+chr2	15673	15705	b	b	-
+chr2	15686	15718	b	b	-
+chr2	15991	16023	a	a	+
+chr2	16332	16364	a	a	+
+chr2	16816	16848	a	a	+
+chr2	17055	17087	a	a	+
+chr2	17741	17773	a	a	+
+chr2	17833	17865	b	b	-
+chr2	17842	17874	b	b	-
+chr2	17887	17919	a	a	+
+chr2	17859	17891	b	b	-
+chr2	17892	17924	a	a	+
+chr2	17892	17924	a	a	+
+chr2	17892	17924	a	a	+
+chr2	17892	17924	a	a	+
+chr2	17893	17925	a	a	+
+chr2	17893	17925	a	a	+
+chr2	17893	17925	a	a	+
+chr2	17893	17925	a	a	+
+chr2	17893	17925	a	a	+
+chr2	17893	17925	a	a	+
+chr2	17862	17894	b	b	-
+chr2	17862	17894	b	b	-
+chr2	17862	17894	b	b	-
+chr2	17862	17894	b	b	-
+chr2	17895	17927	a	a	+
+chr2	17895	17927	a	a	+
+chr2	17863	17895	b	b	-
+chr2	17864	17896	b	b	-
+chr2	17897	17929	a	a	+
+chr2	17865	17897	b	b	-
+chr2	17898	17930	a	a	+
+chr2	17899	17931	a	a	+
+chr2	17899	17931	a	a	+
+chr2	17899	17931	a	a	+
+chr2	17899	17931	a	a	+
+chr2	17899	17931	a	a	+
+chr2	17899	17931	a	a	+
+chr2	17899	17931	a	a	+
+chr2	17899	17931	a	a	+
+chr2	17899	17931	a	a	+
+chr2	17899	17931	a	a	+
+chr2	17899	17931	a	a	+
+chr2	17899	17931	a	a	+
+chr2	17868	17900	b	b	-
+chr2	17868	17900	b	b	-
+chr2	17870	17902	b	b	-
+chr2	17873	17905	b	b	-
+chr2	17873	17905	b	b	-
+chr2	17873	17905	b	b	-
+chr2	17873	17905	b	b	-
+chr2	17874	17906	b	b	-
+chr2	17874	17906	b	b	-
+chr2	17875	17907	b	b	-
+chr2	17877	17909	b	b	-
+chr2	17878	17910	b	b	-
+chr2	17917	17949	a	a	+
+chr2	17885	17917	b	b	-
+chr2	17890	17922	b	b	-
+chr2	17925	17957	a	a	+
+chr2	17907	17939	b	b	-
+chr2	18175	18207	a	a	+
+chr2	18144	18176	b	b	-
+chr2	18154	18186	b	b	-
+chr2	18154	18186	b	b	-
+chr2	18159	18191	b	b	-
+chr2	18167	18199	b	b	-
+chr2	18214	18246	a	a	+
+chr2	18216	18248	a	a	+
+chr2	18241	18273	a	a	+
+chr2	18241	18273	a	a	+
+chr2	18323	18355	b	b	-
+chr2	18332	18364	b	b	-
+chr2	18332	18364	b	b	-
+chr2	18380	18412	a	a	+
+chr2	18652	18684	b	b	-
+chr2	18662	18694	b	b	-
+chr2	18851	18883	a	a	+
+chr2	18834	18866	b	b	-
+chr2	18834	18866	b	b	-
+chr2	18923	18955	a	a	+
+chr2	19060	19092	a	a	+
+chr2	20242	20274	b	b	-
+chr2	20264	20296	b	b	-
+chr2	20418	20450	b	b	-
+chr2	20426	20458	b	b	-
+chr2	21030	21062	a	a	+
+chr2	21075	21107	a	a	+
+chr2	21244	21276	a	a	+
+chr2	21244	21276	a	a	+
+chr2	21213	21245	b	b	-
+chr2	21248	21280	a	a	+
+chr2	21248	21280	a	a	+
+chr2	21221	21253	b	b	-
+chr2	21221	21253	b	b	-
+chr2	21221	21253	b	b	-
+chr2	21221	21253	b	b	-
+chr2	21221	21253	b	b	-
+chr2	21260	21292	a	a	+
+chr2	21260	21292	a	a	+
+chr2	21260	21292	a	a	+
+chr2	21228	21260	b	b	-
+chr2	21261	21293	a	a	+
+chr2	21232	21264	b	b	-
+chr2	21234	21266	b	b	-
+chr2	21243	21275	b	b	-
+chr2	21276	21308	a	a	+
+chr2	21276	21308	a	a	+
+chr2	21250	21282	b	b	-
+chr2	21251	21283	b	b	-
+chr2	21384	21416	b	b	-
+chr2	21453	21485	a	a	+
+chr2	21478	21510	a	a	+
+chr2	21447	21479	b	b	-
+chr2	21491	21523	a	a	+
+chr2	21475	21507	b	b	-
+chr2	21521	21553	a	a	+
+chr2	21493	21525	b	b	-
+chr2	21529	21561	a	a	+
+chr2	21529	21561	a	a	+
+chr2	21529	21561	a	a	+
+chr2	21497	21529	b	b	-
+chr2	22187	22219	b	b	-
+chr2	23100	23132	a	a	+
+chr2	23100	23132	a	a	+
+chr2	23113	23145	a	a	+
+chr2	23196	23228	b	b	-
+chr2	23458	23490	a	a	+
+chr2	23535	23567	b	b	-
+chr2	23654	23686	b	b	-
+chr2	23724	23756	a	a	+
+chr2	23724	23756	a	a	+
+chr2	23695	23727	b	b	-
+chr2	23697	23729	b	b	-
+chr2	23734	23766	a	a	+
+chr2	23734	23766	a	a	+
+chr2	23734	23766	a	a	+
+chr2	23738	23770	a	a	+
+chr2	23709	23741	b	b	-
+chr2	23709	23741	b	b	-
+chr2	23709	23741	b	b	-
+chr2	23743	23775	a	a	+
+chr2	23743	23775	a	a	+
+chr2	23711	23743	b	b	-
+chr2	23711	23743	b	b	-
+chr2	23712	23744	b	b	-
+chr2	23712	23744	b	b	-
+chr2	23749	23781	a	a	+
+chr2	23750	23782	a	a	+
+chr2	23750	23782	a	a	+
+chr2	23752	23784	a	a	+
+chr2	23752	23784	a	a	+
+chr2	23721	23753	b	b	-
+chr2	23721	23753	b	b	-
+chr2	23721	23753	b	b	-
+chr2	23721	23753	b	b	-
+chr2	23722	23754	b	b	-
+chr2	23722	23754	b	b	-
+chr2	23760	23792	a	a	+
+chr2	23739	23771	b	b	-
+chr2	24004	24036	a	a	+
+chr2	23991	24023	b	b	-
+chr2	24031	24063	a	a	+
+chr2	24041	24073	a	a	+
+chr2	24010	24042	b	b	-
+chr2	24010	24042	b	b	-
+chr2	24021	24053	b	b	-
+chr2	24023	24055	b	b	-
+chr2	24023	24055	b	b	-
+chr2	24026	24058	b	b	-
+chr2	24061	24093	a	a	+
+chr2	24088	24120	a	a	+
+chr2	24172	24204	a	a	+
+chr2	24194	24226	a	a	+
+chr2	24399	24431	a	a	+
+chr2	24493	24525	a	a	+
+chr2	24515	24547	a	a	+
+chr2	24497	24529	b	b	-
+chr2	24508	24540	b	b	-
+chr2	24635	24667	b	b	-
+chr2	24659	24691	b	b	-
+chr2	24712	24744	b	b	-
+chr2	25018	25050	a	a	+
+chr2	25011	25043	b	b	-
+chr2	25201	25233	a	a	+
+chr2	25221	25253	a	a	+
+chr2	25194	25226	b	b	-
+chr2	25916	25948	b	b	-
+chr2	25957	25989	b	b	-
+chr2	26086	26118	b	b	-
+chr2	26307	26339	a	a	+
+chr2	26713	26745	a	a	+
+chr2	26927	26959	a	a	+
+chr2	27072	27104	b	b	-
+chr2	27382	27414	b	b	-
+chr2	27444	27476	a	a	+
+chr2	27444	27476	a	a	+
+chr2	27545	27577	b	b	-
+chr2	27545	27577	b	b	-
+chr2	27887	27919	b	b	-
+chr2	27902	27934	b	b	-
+chr2	27959	27991	a	a	+
+chr2	27970	28002	a	a	+
+chr2	27982	28014	a	a	+
+chr2	27959	27991	b	b	-
+chr2	27959	27991	b	b	-
+chr2	27959	27991	b	b	-
+chr2	27959	27991	b	b	-
+chr2	27959	27991	b	b	-
+chr2	28028	28060	a	a	+
+chr2	28028	28060	a	a	+
+chr2	28122	28154	b	b	-
+chr2	28175	28207	a	a	+
+chr2	28190	28222	a	a	+
+chr2	28190	28222	a	a	+
+chr2	28179	28211	b	b	-
+chr2	28225	28257	a	a	+
+chr2	28225	28257	a	a	+
+chr2	28264	28296	a	a	+
+chr2	28283	28315	a	a	+
+chr2	28285	28317	a	a	+
+chr2	28271	28303	b	b	-
+chr2	28284	28316	b	b	-
+chr2	28323	28355	a	a	+
+chr2	28324	28356	a	a	+
+chr2	28325	28357	a	a	+
+chr2	28325	28357	a	a	+
+chr2	28315	28347	b	b	-
+chr2	28315	28347	b	b	-
+chr2	28315	28347	b	b	-
+chr2	28315	28347	b	b	-
+chr2	28324	28356	b	b	-
+chr2	28326	28358	b	b	-
+chr2	28380	28412	a	a	+
+chr2	28353	28385	b	b	-
+chr2	28369	28401	b	b	-
+chr2	28511	28543	b	b	-
+chr2	28565	28597	a	a	+
+chr2	28574	28606	a	a	+
+chr2	28587	28619	a	a	+
+chr2	28591	28623	a	a	+
+chr2	28565	28597	b	b	-
+chr2	28608	28640	a	a	+
+chr2	28612	28644	a	a	+
+chr2	28722	28754	b	b	-
+chr2	28843	28875	a	a	+
+chr2	28846	28878	b	b	-
+chr2	28882	28914	b	b	-
+chr2	29097	29129	a	a	+
+chr2	29076	29108	b	b	-
+chr2	29110	29142	a	a	+
+chr2	29110	29142	a	a	+
+chr2	29078	29110	b	b	-
+chr2	29079	29111	b	b	-
+chr2	29083	29115	b	b	-
+chr2	29089	29121	b	b	-
+chr2	29126	29158	a	a	+
+chr2	29095	29127	b	b	-
+chr2	29269	29301	a	a	+
+chr2	29270	29302	a	a	+
+chr2	29245	29277	b	b	-
+chr2	29294	29326	a	a	+
+chr2	29318	29350	a	a	+
+chr2	29418	29450	b	b	-
+chr2	29503	29535	a	a	+
+chr2	29471	29503	b	b	-
+chr2	29475	29507	b	b	-
+chr2	29475	29507	b	b	-
+chr2	29483	29515	b	b	-
+chr2	29484	29516	b	b	-
+chr2	29518	29550	a	a	+
+chr2	29518	29550	a	a	+
+chr2	29540	29572	a	a	+
+chr2	29541	29573	a	a	+
+chr2	29584	29616	a	a	+
+chr2	29630	29662	b	b	-
+chr2	29633	29665	b	b	-
+chr2	29634	29666	b	b	-
+chr2	29638	29670	b	b	-
+chr2	29638	29670	b	b	-
+chr2	29658	29690	b	b	-
+chr2	29668	29700	b	b	-
+chr2	29669	29701	b	b	-
+chr2	29669	29701	b	b	-
+chr2	29669	29701	b	b	-
+chr2	29670	29702	b	b	-
+chr2	29673	29705	b	b	-
+chr2	29673	29705	b	b	-
+chr2	29673	29705	b	b	-
+chr2	29674	29706	b	b	-
+chr2	29674	29706	b	b	-
+chr2	29674	29706	b	b	-
+chr2	29674	29706	b	b	-
+chr2	29674	29706	b	b	-
+chr2	29674	29706	b	b	-
+chr2	29679	29711	b	b	-
+chr2	29713	29745	a	a	+
+chr2	29713	29745	a	a	+
+chr2	29713	29745	a	a	+
+chr2	29714	29746	a	a	+
+chr2	29714	29746	a	a	+
+chr2	29714	29746	a	a	+
+chr2	29714	29746	a	a	+
+chr2	29684	29716	b	b	-
+chr2	29717	29749	a	a	+
+chr2	29685	29717	b	b	-
+chr2	29686	29718	b	b	-
+chr2	29686	29718	b	b	-
+chr2	29686	29718	b	b	-
+chr2	29686	29718	b	b	-
+chr2	29688	29720	b	b	-
+chr2	29688	29720	b	b	-
+chr2	29689	29721	b	b	-
+chr2	29692	29724	b	b	-
+chr2	29692	29724	b	b	-
+chr2	29692	29724	b	b	-
+chr2	29692	29724	b	b	-
+chr2	29692	29724	b	b	-
+chr2	29728	29760	a	a	+
+chr2	29735	29767	a	a	+
+chr2	29738	29770	a	a	+
+chr2	29715	29747	b	b	-
+chr2	29748	29780	a	a	+
+chr2	29718	29750	b	b	-
+chr2	29755	29787	a	a	+
+chr2	29727	29759	b	b	-
+chr2	29760	29792	a	a	+
+chr2	29730	29762	b	b	-
+chr2	29763	29795	a	a	+
+chr2	29731	29763	b	b	-
+chr2	29765	29797	a	a	+
+chr2	29768	29800	a	a	+
+chr2	29770	29802	a	a	+
+chr2	29770	29802	a	a	+
+chr2	29775	29807	a	a	+
+chr2	29776	29808	a	a	+
+chr2	29777	29809	a	a	+
+chr2	29779	29811	a	a	+
+chr2	29779	29811	a	a	+
+chr2	29749	29781	b	b	-
+chr2	29810	29842	a	a	+
+chr2	29810	29842	a	a	+
+chr2	29805	29837	b	b	-
+chr2	29859	29891	a	a	+
+chr2	29837	29869	b	b	-
+chr2	29844	29876	b	b	-
+chr2	29853	29885	b	b	-
+chr2	29853	29885	b	b	-
+chr2	29864	29896	b	b	-
+chr2	29867	29899	b	b	-
+chr2	29867	29899	b	b	-
+chr2	29904	29936	a	a	+
+chr2	29904	29936	a	a	+
+chr2	29911	29943	a	a	+
+chr2	29911	29943	a	a	+
+chr2	29911	29943	a	a	+
+chr2	29879	29911	b	b	-
+chr2	29915	29947	a	a	+
+chr2	29915	29947	a	a	+
+chr2	29918	29950	a	a	+
+chr2	29919	29951	a	a	+
+chr2	29921	29953	a	a	+
+chr2	29921	29953	a	a	+
+chr2	29921	29953	a	a	+
+chr2	29923	29955	a	a	+
+chr2	29923	29955	a	a	+
+chr2	29923	29955	a	a	+
+chr2	29923	29955	a	a	+
+chr2	29923	29955	a	a	+
+chr2	29892	29924	b	b	-
+chr2	29892	29924	b	b	-
+chr2	29925	29957	a	a	+
+chr2	29926	29958	a	a	+
+chr2	29927	29959	a	a	+
+chr2	29895	29927	b	b	-
+chr2	29895	29927	b	b	-
+chr2	29928	29960	a	a	+
+chr2	29928	29960	a	a	+
+chr2	29899	29931	b	b	-
+chr2	29904	29936	b	b	-
+chr2	29904	29936	b	b	-
+chr2	29904	29936	b	b	-
+chr2	29904	29936	b	b	-
+chr2	29904	29936	b	b	-
+chr2	29904	29936	b	b	-
+chr2	29937	29969	a	a	+
+chr2	29938	29970	a	a	+
+chr2	29942	29974	a	a	+
+chr2	29943	29975	a	a	+
+chr2	29948	29980	a	a	+
+chr2	29949	29981	a	a	+
+chr2	29953	29985	a	a	+
+chr2	29954	29986	a	a	+
+chr2	29923	29955	b	b	-
+chr2	29923	29955	b	b	-
+chr2	29923	29955	b	b	-
+chr2	29924	29956	b	b	-
+chr2	29924	29956	b	b	-
+chr2	29931	29963	b	b	-
+chr2	29931	29963	b	b	-
+chr2	29941	29973	b	b	-
+chr2	29941	29973	b	b	-
+chr2	29942	29974	b	b	-
+chr2	29978	30010	a	a	+
+chr2	29978	30010	a	a	+
+chr2	29979	30011	a	a	+
+chr2	29980	30012	a	a	+
+chr2	29980	30012	a	a	+
+chr2	29951	29983	b	b	-
+chr2	29957	29989	b	b	-
+chr2	30000	30032	a	a	+
+chr2	29970	30002	b	b	-
+chr2	29970	30002	b	b	-
+chr2	30003	30035	a	a	+
+chr2	30003	30035	a	a	+
+chr2	30004	30036	a	a	+
+chr2	30005	30037	a	a	+
+chr2	29975	30007	b	b	-
+chr2	29975	30007	b	b	-
+chr2	29975	30007	b	b	-
+chr2	29977	30009	b	b	-
+chr2	30010	30042	a	a	+
+chr2	30011	30043	a	a	+
+chr2	30011	30043	a	a	+
+chr2	29984	30016	b	b	-
+chr2	29987	30019	b	b	-
+chr2	30021	30053	a	a	+
+chr2	30024	30056	a	a	+
+chr2	30029	30061	a	a	+
+chr2	30030	30062	a	a	+
+chr2	30030	30062	a	a	+
+chr2	30000	30032	b	b	-
+chr2	30002	30034	b	b	-
+chr2	30004	30036	b	b	-
+chr2	30007	30039	b	b	-
+chr2	30007	30039	b	b	-
+chr2	30012	30044	b	b	-
+chr2	30046	30078	a	a	+
+chr2	30046	30078	a	a	+
+chr2	30014	30046	b	b	-
+chr2	30050	30082	a	a	+
+chr2	30018	30050	b	b	-
+chr2	30018	30050	b	b	-
+chr2	30018	30050	b	b	-
+chr2	30021	30053	b	b	-
+chr2	30025	30057	b	b	-
+chr2	30025	30057	b	b	-
+chr2	30026	30058	b	b	-
+chr2	30026	30058	b	b	-
+chr2	30026	30058	b	b	-
+chr2	30026	30058	b	b	-
+chr2	30029	30061	b	b	-
+chr2	30029	30061	b	b	-
+chr2	30030	30062	b	b	-
+chr2	30030	30062	b	b	-
+chr2	30033	30065	b	b	-
+chr2	30067	30099	a	a	+
+chr2	30068	30100	a	a	+
+chr2	30068	30100	a	a	+
+chr2	30037	30069	b	b	-
+chr2	30073	30105	a	a	+
+chr2	30074	30106	a	a	+
+chr2	30042	30074	b	b	-
+chr2	30075	30107	a	a	+
+chr2	30075	30107	a	a	+
+chr2	30079	30111	a	a	+
+chr2	30049	30081	b	b	-
+chr2	30051	30083	b	b	-
+chr2	30051	30083	b	b	-
+chr2	30051	30083	b	b	-
+chr2	30051	30083	b	b	-
+chr2	30051	30083	b	b	-
+chr2	30051	30083	b	b	-
+chr2	30051	30083	b	b	-
+chr2	30051	30083	b	b	-
+chr2	30052	30084	b	b	-
+chr2	30052	30084	b	b	-
+chr2	30054	30086	b	b	-
+chr2	30054	30086	b	b	-
+chr2	30054	30086	b	b	-
+chr2	30054	30086	b	b	-
+chr2	30054	30086	b	b	-
+chr2	30054	30086	b	b	-
+chr2	30054	30086	b	b	-
+chr2	30056	30088	b	b	-
+chr2	30089	30121	a	a	+
+chr2	30089	30121	a	a	+
+chr2	30090	30122	a	a	+
+chr2	30090	30122	a	a	+
+chr2	30091	30123	a	a	+
+chr2	30091	30123	a	a	+
+chr2	30094	30126	a	a	+
+chr2	30094	30126	a	a	+
+chr2	30063	30095	b	b	-
+chr2	30063	30095	b	b	-
+chr2	30096	30128	a	a	+
+chr2	30097	30129	a	a	+
+chr2	30097	30129	a	a	+
+chr2	30066	30098	b	b	-
+chr2	30066	30098	b	b	-
+chr2	30066	30098	b	b	-
+chr2	30066	30098	b	b	-
+chr2	30066	30098	b	b	-
+chr2	30066	30098	b	b	-
+chr2	30068	30100	b	b	-
+chr2	30068	30100	b	b	-
+chr2	30068	30100	b	b	-
+chr2	30068	30100	b	b	-
+chr2	30069	30101	b	b	-
+chr2	30102	30134	a	a	+
+chr2	30070	30102	b	b	-
+chr2	30070	30102	b	b	-
+chr2	30070	30102	b	b	-
+chr2	30103	30135	a	a	+
+chr2	30103	30135	a	a	+
+chr2	30103	30135	a	a	+
+chr2	30071	30103	b	b	-
+chr2	30072	30104	b	b	-
+chr2	30106	30138	a	a	+
+chr2	30106	30138	a	a	+
+chr2	30106	30138	a	a	+
+chr2	30109	30141	a	a	+
+chr2	30110	30142	a	a	+
+chr2	30110	30142	a	a	+
+chr2	30110	30142	a	a	+
+chr2	30110	30142	a	a	+
+chr2	30079	30111	b	b	-
+chr2	30079	30111	b	b	-
+chr2	30083	30115	b	b	-
+chr2	30083	30115	b	b	-
+chr2	30083	30115	b	b	-
+chr2	30083	30115	b	b	-
+chr2	30083	30115	b	b	-
+chr2	30086	30118	b	b	-
+chr2	30089	30121	b	b	-
+chr2	30089	30121	b	b	-
+chr2	30089	30121	b	b	-
+chr2	30089	30121	b	b	-
+chr2	30089	30121	b	b	-
+chr2	30089	30121	b	b	-
+chr2	30089	30121	b	b	-
+chr2	30089	30121	b	b	-
+chr2	30089	30121	b	b	-
+chr2	30089	30121	b	b	-
+chr2	30089	30121	b	b	-
+chr2	30122	30154	a	a	+
+chr2	30123	30155	a	a	+
+chr2	30123	30155	a	a	+
+chr2	30123	30155	a	a	+
+chr2	30123	30155	a	a	+
+chr2	30123	30155	a	a	+
+chr2	30124	30156	a	a	+
+chr2	30125	30157	a	a	+
+chr2	30094	30126	b	b	-
+chr2	30094	30126	b	b	-
+chr2	30094	30126	b	b	-
+chr2	30094	30126	b	b	-
+chr2	30094	30126	b	b	-
+chr2	30095	30127	b	b	-
+chr2	30095	30127	b	b	-
+chr2	30096	30128	b	b	-
+chr2	30097	30129	b	b	-
+chr2	30097	30129	b	b	-
+chr2	30097	30129	b	b	-
+chr2	30097	30129	b	b	-
+chr2	30098	30130	b	b	-
+chr2	30099	30131	b	b	-
+chr2	30100	30132	b	b	-
+chr2	30101	30133	b	b	-
+chr2	30101	30133	b	b	-
+chr2	30101	30133	b	b	-
+chr2	30101	30133	b	b	-
+chr2	30101	30133	b	b	-
+chr2	30101	30133	b	b	-
+chr2	30101	30133	b	b	-
+chr2	30101	30133	b	b	-
+chr2	30101	30133	b	b	-
+chr2	30101	30133	b	b	-
+chr2	30101	30133	b	b	-
+chr2	30101	30133	b	b	-
+chr2	30101	30133	b	b	-
+chr2	30101	30133	b	b	-
+chr2	30136	30168	a	a	+
+chr2	30137	30169	a	a	+
+chr2	30137	30169	a	a	+
+chr2	30137	30169	a	a	+
+chr2	30106	30138	b	b	-
+chr2	30141	30173	a	a	+
+chr2	30109	30141	b	b	-
+chr2	30109	30141	b	b	-
+chr2	30109	30141	b	b	-
+chr2	30142	30174	a	a	+
+chr2	30142	30174	a	a	+
+chr2	30142	30174	a	a	+
+chr2	30142	30174	a	a	+
+chr2	30142	30174	a	a	+
+chr2	30142	30174	a	a	+
+chr2	30142	30174	a	a	+
+chr2	30142	30174	a	a	+
+chr2	30142	30174	a	a	+
+chr2	30142	30174	a	a	+
+chr2	30142	30174	a	a	+
+chr2	30143	30175	a	a	+
+chr2	30143	30175	a	a	+
+chr2	30143	30175	a	a	+
+chr2	30146	30178	a	a	+
+chr2	30114	30146	b	b	-
+chr2	30114	30146	b	b	-
+chr2	30115	30147	b	b	-
+chr2	30115	30147	b	b	-
+chr2	30149	30181	a	a	+
+chr2	30149	30181	a	a	+
+chr2	30150	30182	a	a	+
+chr2	30119	30151	b	b	-
+chr2	30119	30151	b	b	-
+chr2	30154	30186	a	a	+
+chr2	30124	30156	b	b	-
+chr2	30158	30190	a	a	+
+chr2	30158	30190	a	a	+
+chr2	30158	30190	a	a	+
+chr2	30158	30190	a	a	+
+chr2	30127	30159	b	b	-
+chr2	30163	30195	a	a	+
+chr2	30163	30195	a	a	+
+chr2	30163	30195	a	a	+
+chr2	30132	30164	b	b	-
+chr2	30166	30198	a	a	+
+chr2	30166	30198	a	a	+
+chr2	30166	30198	a	a	+
+chr2	30166	30198	a	a	+
+chr2	30134	30166	b	b	-
+chr2	30134	30166	b	b	-
+chr2	30134	30166	b	b	-
+chr2	30168	30200	a	a	+
+chr2	30170	30202	a	a	+
+chr2	30141	30173	b	b	-
+chr2	30147	30179	b	b	-
+chr2	30147	30179	b	b	-
+chr2	30148	30180	b	b	-
+chr2	30150	30182	b	b	-
+chr2	30150	30182	b	b	-
+chr2	30150	30182	b	b	-
+chr2	30185	30217	a	a	+
+chr2	30185	30217	a	a	+
+chr2	30154	30186	b	b	-
+chr2	30188	30220	a	a	+
+chr2	30160	30192	b	b	-
+chr2	30193	30225	a	a	+
+chr2	30194	30226	a	a	+
+chr2	30165	30197	b	b	-
+chr2	30167	30199	b	b	-
+chr2	30167	30199	b	b	-
+chr2	30167	30199	b	b	-
+chr2	30167	30199	b	b	-
+chr2	30200	30232	a	a	+
+chr2	30169	30201	b	b	-
+chr2	30169	30201	b	b	-
+chr2	30205	30237	a	a	+
+chr2	30210	30242	a	a	+
+chr2	30211	30243	a	a	+
+chr2	30180	30212	b	b	-
+chr2	30180	30212	b	b	-
+chr2	30215	30247	a	a	+
+chr2	30217	30249	a	a	+
+chr2	30186	30218	b	b	-
+chr2	30186	30218	b	b	-
+chr2	30187	30219	b	b	-
+chr2	30187	30219	b	b	-
+chr2	30187	30219	b	b	-
+chr2	30187	30219	b	b	-
+chr2	30187	30219	b	b	-
+chr2	30187	30219	b	b	-
+chr2	30187	30219	b	b	-
+chr2	30220	30252	a	a	+
+chr2	30220	30252	a	a	+
+chr2	30190	30222	b	b	-
+chr2	30223	30255	a	a	+
+chr2	30226	30258	a	a	+
+chr2	30232	30264	a	a	+
+chr2	30232	30264	a	a	+
+chr2	30235	30267	a	a	+
+chr2	30235	30267	a	a	+
+chr2	30236	30268	a	a	+
+chr2	30206	30238	b	b	-
+chr2	30208	30240	b	b	-
+chr2	30208	30240	b	b	-
+chr2	30208	30240	b	b	-
+chr2	30208	30240	b	b	-
+chr2	30208	30240	b	b	-
+chr2	30241	30273	a	a	+
+chr2	30241	30273	a	a	+
+chr2	30244	30276	a	a	+
+chr2	30250	30282	a	a	+
+chr2	30250	30282	a	a	+
+chr2	30251	30283	a	a	+
+chr2	30219	30251	b	b	-
+chr2	30219	30251	b	b	-
+chr2	30220	30252	b	b	-
+chr2	30253	30285	a	a	+
+chr2	30221	30253	b	b	-
+chr2	30255	30287	a	a	+
+chr2	30223	30255	b	b	-
+chr2	30224	30256	b	b	-
+chr2	30224	30256	b	b	-
+chr2	30257	30289	a	a	+
+chr2	30257	30289	a	a	+
+chr2	30225	30257	b	b	-
+chr2	30225	30257	b	b	-
+chr2	30225	30257	b	b	-
+chr2	30225	30257	b	b	-
+chr2	30225	30257	b	b	-
+chr2	30258	30290	a	a	+
+chr2	30258	30290	a	a	+
+chr2	30262	30294	a	a	+
+chr2	30262	30294	a	a	+
+chr2	30264	30296	a	a	+
+chr2	30264	30296	a	a	+
+chr2	30233	30265	b	b	-
+chr2	30268	30300	a	a	+
+chr2	30236	30268	b	b	-
+chr2	30236	30268	b	b	-
+chr2	30238	30270	b	b	-
+chr2	30240	30272	b	b	-
+chr2	30240	30272	b	b	-
+chr2	30276	30308	a	a	+
+chr2	30276	30308	a	a	+
+chr2	30276	30308	a	a	+
+chr2	30276	30308	a	a	+
+chr2	30276	30308	a	a	+
+chr2	30281	30313	a	a	+
+chr2	30284	30316	a	a	+
+chr2	30284	30316	a	a	+
+chr2	30252	30284	b	b	-
+chr2	30252	30284	b	b	-
+chr2	30252	30284	b	b	-
+chr2	30252	30284	b	b	-
+chr2	30252	30284	b	b	-
+chr2	30253	30285	b	b	-
+chr2	30289	30321	a	a	+
+chr2	30258	30290	b	b	-
+chr2	30293	30325	a	a	+
+chr2	30293	30325	a	a	+
+chr2	30293	30325	a	a	+
+chr2	30293	30325	a	a	+
+chr2	30294	30326	a	a	+
+chr2	30294	30326	a	a	+
+chr2	30294	30326	a	a	+
+chr2	30294	30326	a	a	+
+chr2	30262	30294	b	b	-
+chr2	30263	30295	b	b	-
+chr2	30267	30299	b	b	-
+chr2	30269	30301	b	b	-
+chr2	30302	30334	a	a	+
+chr2	30302	30334	a	a	+
+chr2	30302	30334	a	a	+
+chr2	30303	30335	a	a	+
+chr2	30303	30335	a	a	+
+chr2	30303	30335	a	a	+
+chr2	30303	30335	a	a	+
+chr2	30271	30303	b	b	-
+chr2	30271	30303	b	b	-
+chr2	30271	30303	b	b	-
+chr2	30272	30304	b	b	-
+chr2	30272	30304	b	b	-
+chr2	30305	30337	a	a	+
+chr2	30273	30305	b	b	-
+chr2	30275	30307	b	b	-
+chr2	30278	30310	b	b	-
+chr2	30278	30310	b	b	-
+chr2	30280	30312	b	b	-
+chr2	30313	30345	a	a	+
+chr2	30282	30314	b	b	-
+chr2	30282	30314	b	b	-
+chr2	30315	30347	a	a	+
+chr2	30315	30347	a	a	+
+chr2	30315	30347	a	a	+
+chr2	30284	30316	b	b	-
+chr2	30284	30316	b	b	-
+chr2	30321	30353	a	a	+
+chr2	30322	30354	a	a	+
+chr2	30293	30325	b	b	-
+chr2	30293	30325	b	b	-
+chr2	30326	30358	a	a	+
+chr2	30326	30358	a	a	+
+chr2	30297	30329	b	b	-
+chr2	30297	30329	b	b	-
+chr2	30330	30362	a	a	+
+chr2	30332	30364	a	a	+
+chr2	30333	30365	a	a	+
+chr2	30303	30335	b	b	-
+chr2	30311	30343	b	b	-
+chr2	30312	30344	b	b	-
+chr2	30348	30380	a	a	+
+chr2	30316	30348	b	b	-
+chr2	30353	30385	a	a	+
+chr2	30353	30385	a	a	+
+chr2	30322	30354	b	b	-
+chr2	30323	30355	b	b	-
+chr2	30357	30389	a	a	+
+chr2	30330	30362	b	b	-
+chr2	30332	30364	b	b	-
+chr2	30367	30399	a	a	+
+chr2	30368	30400	a	a	+
+chr2	30368	30400	a	a	+
+chr2	30336	30368	b	b	-
+chr2	30369	30401	a	a	+
+chr2	30369	30401	a	a	+
+chr2	30369	30401	a	a	+
+chr2	30370	30402	a	a	+
+chr2	30370	30402	a	a	+
+chr2	30370	30402	a	a	+
+chr2	30370	30402	a	a	+
+chr2	30370	30402	a	a	+
+chr2	30370	30402	a	a	+
+chr2	30370	30402	a	a	+
+chr2	30371	30403	a	a	+
+chr2	30339	30371	b	b	-
+chr2	30372	30404	a	a	+
+chr2	30372	30404	a	a	+
+chr2	30373	30405	a	a	+
+chr2	30373	30405	a	a	+
+chr2	30373	30405	a	a	+
+chr2	30374	30406	a	a	+
+chr2	30342	30374	b	b	-
+chr2	30346	30378	b	b	-
+chr2	30347	30379	b	b	-
+chr2	30347	30379	b	b	-
+chr2	30382	30414	a	a	+
+chr2	30350	30382	b	b	-
+chr2	30350	30382	b	b	-
+chr2	30350	30382	b	b	-
+chr2	30351	30383	b	b	-
+chr2	30351	30383	b	b	-
+chr2	30352	30384	b	b	-
+chr2	30352	30384	b	b	-
+chr2	30386	30418	a	a	+
+chr2	30386	30418	a	a	+
+chr2	30386	30418	a	a	+
+chr2	30387	30419	a	a	+
+chr2	30387	30419	a	a	+
+chr2	30387	30419	a	a	+
+chr2	30387	30419	a	a	+
+chr2	30387	30419	a	a	+
+chr2	30355	30387	b	b	-
+chr2	30355	30387	b	b	-
+chr2	30355	30387	b	b	-
+chr2	30388	30420	a	a	+
+chr2	30388	30420	a	a	+
+chr2	30388	30420	a	a	+
+chr2	30388	30420	a	a	+
+chr2	30388	30420	a	a	+
+chr2	30388	30420	a	a	+
+chr2	30388	30420	a	a	+
+chr2	30388	30420	a	a	+
+chr2	30388	30420	a	a	+
+chr2	30388	30420	a	a	+
+chr2	30356	30388	b	b	-
+chr2	30356	30388	b	b	-
+chr2	30357	30389	b	b	-
+chr2	30357	30389	b	b	-
+chr2	30358	30390	b	b	-
+chr2	30358	30390	b	b	-
+chr2	30358	30390	b	b	-
+chr2	30363	30395	b	b	-
+chr2	30363	30395	b	b	-
+chr2	30364	30396	b	b	-
+chr2	30366	30398	b	b	-
+chr2	30366	30398	b	b	-
+chr2	30399	30431	a	a	+
+chr2	30367	30399	b	b	-
+chr2	30368	30400	b	b	-
+chr2	30368	30400	b	b	-
+chr2	30369	30401	b	b	-
+chr2	30370	30402	b	b	-
+chr2	30370	30402	b	b	-
+chr2	30370	30402	b	b	-
+chr2	30403	30435	a	a	+
+chr2	30403	30435	a	a	+
+chr2	30403	30435	a	a	+
+chr2	30403	30435	a	a	+
+chr2	30404	30436	a	a	+
+chr2	30404	30436	a	a	+
+chr2	30404	30436	a	a	+
+chr2	30404	30436	a	a	+
+chr2	30405	30437	a	a	+
+chr2	30405	30437	a	a	+
+chr2	30405	30437	a	a	+
+chr2	30405	30437	a	a	+
+chr2	30405	30437	a	a	+
+chr2	30405	30437	a	a	+
+chr2	30405	30437	a	a	+
+chr2	30375	30407	b	b	-
+chr2	30379	30411	b	b	-
+chr2	30414	30446	a	a	+
+chr2	30383	30415	b	b	-
+chr2	30416	30448	a	a	+
+chr2	30416	30448	a	a	+
+chr2	30416	30448	a	a	+
+chr2	30384	30416	b	b	-
+chr2	30419	30451	a	a	+
+chr2	30422	30454	a	a	+
+chr2	30422	30454	a	a	+
+chr2	30391	30423	b	b	-
+chr2	30425	30457	a	a	+
+chr2	30394	30426	b	b	-
+chr2	30427	30459	a	a	+
+chr2	30427	30459	a	a	+
+chr2	30397	30429	b	b	-
+chr2	30430	30462	a	a	+
+chr2	30399	30431	b	b	-
+chr2	30399	30431	b	b	-
+chr2	30400	30432	b	b	-
+chr2	30400	30432	b	b	-
+chr2	30400	30432	b	b	-
+chr2	30437	30469	a	a	+
+chr2	30412	30444	b	b	-
+chr2	30434	30466	b	b	-
+chr2	30435	30467	b	b	-
+chr2	30446	30478	b	b	-
+chr2	30482	30514	a	a	+
+chr2	30458	30490	b	b	-
+chr2	30469	30501	b	b	-
+chr2	30525	30557	a	a	+
+chr2	30506	30538	b	b	-
+chr2	30516	30548	b	b	-
+chr2	30516	30548	b	b	-
+chr2	30516	30548	b	b	-
+chr2	30519	30551	b	b	-
+chr2	30555	30587	a	a	+
+chr2	30557	30589	a	a	+
+chr2	30527	30559	b	b	-
+chr2	30570	30602	a	a	+
+chr2	30570	30602	a	a	+
+chr2	30570	30602	a	a	+
+chr2	30570	30602	a	a	+
+chr2	30541	30573	b	b	-
+chr2	30575	30607	a	a	+
+chr2	30579	30611	a	a	+
+chr2	30579	30611	a	a	+
+chr2	30580	30612	a	a	+
+chr2	30560	30592	b	b	-
+chr2	30560	30592	b	b	-
+chr2	30561	30593	b	b	-
+chr2	30561	30593	b	b	-
+chr2	30562	30594	b	b	-
+chr2	30595	30627	a	a	+
+chr2	30598	30630	a	a	+
+chr2	30598	30630	a	a	+
+chr2	30599	30631	a	a	+
+chr2	30600	30632	a	a	+
+chr2	30600	30632	a	a	+
+chr2	30600	30632	a	a	+
+chr2	30569	30601	b	b	-
+chr2	30569	30601	b	b	-
+chr2	30605	30637	a	a	+
+chr2	30605	30637	a	a	+
+chr2	30605	30637	a	a	+
+chr2	30605	30637	a	a	+
+chr2	30605	30637	a	a	+
+chr2	30606	30638	a	a	+
+chr2	30606	30638	a	a	+
+chr2	30606	30638	a	a	+
+chr2	30574	30606	b	b	-
+chr2	30611	30643	a	a	+
+chr2	30581	30613	b	b	-
+chr2	30581	30613	b	b	-
+chr2	30615	30647	a	a	+
+chr2	30583	30615	b	b	-
+chr2	30586	30618	b	b	-
+chr2	30586	30618	b	b	-
+chr2	30586	30618	b	b	-
+chr2	30586	30618	b	b	-
+chr2	30619	30651	a	a	+
+chr2	30587	30619	b	b	-
+chr2	30587	30619	b	b	-
+chr2	30620	30652	a	a	+
+chr2	30620	30652	a	a	+
+chr2	30620	30652	a	a	+
+chr2	30625	30657	a	a	+
+chr2	30593	30625	b	b	-
+chr2	30593	30625	b	b	-
+chr2	30593	30625	b	b	-
+chr2	30594	30626	b	b	-
+chr2	30597	30629	b	b	-
+chr2	30598	30630	b	b	-
+chr2	30632	30664	a	a	+
+chr2	30601	30633	b	b	-
+chr2	30601	30633	b	b	-
+chr2	30601	30633	b	b	-
+chr2	30634	30666	a	a	+
+chr2	30605	30637	b	b	-
+chr2	30640	30672	a	a	+
+chr2	30608	30640	b	b	-
+chr2	30609	30641	b	b	-
+chr2	30610	30642	b	b	-
+chr2	30652	30684	a	a	+
+chr2	30652	30684	a	a	+
+chr2	30652	30684	a	a	+
+chr2	30656	30688	a	a	+
+chr2	30667	30699	a	a	+
+chr2	30671	30703	b	b	-
+chr2	30705	30737	a	a	+
+chr2	30675	30707	b	b	-
+chr2	30677	30709	b	b	-
+chr2	30714	30746	a	a	+
+chr2	30686	30718	b	b	-
+chr2	30694	30726	b	b	-
+chr2	30727	30759	a	a	+
+chr2	30730	30762	a	a	+
+chr2	30732	30764	a	a	+
+chr2	30704	30736	b	b	-
+chr2	30705	30737	b	b	-
+chr2	30706	30738	b	b	-
+chr2	30739	30771	a	a	+
+chr2	30711	30743	b	b	-
+chr2	30713	30745	b	b	-
+chr2	30715	30747	b	b	-
+chr2	30748	30780	a	a	+
+chr2	30716	30748	b	b	-
+chr2	30716	30748	b	b	-
+chr2	30749	30781	a	a	+
+chr2	30749	30781	a	a	+
+chr2	30717	30749	b	b	-
+chr2	30717	30749	b	b	-
+chr2	30755	30787	a	a	+
+chr2	30755	30787	a	a	+
+chr2	30755	30787	a	a	+
+chr2	30757	30789	a	a	+
+chr2	30725	30757	b	b	-
+chr2	30733	30765	b	b	-
+chr2	30735	30767	b	b	-
+chr2	30735	30767	b	b	-
+chr2	30735	30767	b	b	-
+chr2	30768	30800	a	a	+
+chr2	30736	30768	b	b	-
+chr2	30742	30774	b	b	-
+chr2	30775	30807	a	a	+
+chr2	30775	30807	a	a	+
+chr2	30775	30807	a	a	+
+chr2	30744	30776	b	b	-
+chr2	30777	30809	a	a	+
+chr2	30777	30809	a	a	+
+chr2	30746	30778	b	b	-
+chr2	30779	30811	a	a	+
+chr2	30747	30779	b	b	-
+chr2	30780	30812	a	a	+
+chr2	30781	30813	a	a	+
+chr2	30749	30781	b	b	-
+chr2	30749	30781	b	b	-
+chr2	30749	30781	b	b	-
+chr2	30750	30782	b	b	-
+chr2	30783	30815	a	a	+
+chr2	30784	30816	a	a	+
+chr2	30784	30816	a	a	+
+chr2	30784	30816	a	a	+
+chr2	30784	30816	a	a	+
+chr2	30755	30787	b	b	-
+chr2	30789	30821	a	a	+
+chr2	30792	30824	a	a	+
+chr2	30792	30824	a	a	+
+chr2	30792	30824	a	a	+
+chr2	30794	30826	a	a	+
+chr2	30794	30826	a	a	+
+chr2	30794	30826	a	a	+
+chr2	30794	30826	a	a	+
+chr2	30764	30796	b	b	-
+chr2	30764	30796	b	b	-
+chr2	30764	30796	b	b	-
+chr2	30764	30796	b	b	-
+chr2	30764	30796	b	b	-
+chr2	30797	30829	a	a	+
+chr2	30797	30829	a	a	+
+chr2	30797	30829	a	a	+
+chr2	30801	30833	a	a	+
+chr2	30802	30834	a	a	+
+chr2	30802	30834	a	a	+
+chr2	30802	30834	a	a	+
+chr2	30802	30834	a	a	+
+chr2	30802	30834	a	a	+
+chr2	30771	30803	b	b	-
+chr2	30773	30805	b	b	-
+chr2	30773	30805	b	b	-
+chr2	30807	30839	a	a	+
+chr2	30775	30807	b	b	-
+chr2	30814	30846	a	a	+
+chr2	30817	30849	a	a	+
+chr2	30817	30849	a	a	+
+chr2	30790	30822	b	b	-
+chr2	30836	30868	a	a	+
+chr2	30814	30846	b	b	-
+chr2	30827	30859	b	b	-
+chr2	30827	30859	b	b	-
+chr2	30860	30892	a	a	+
+chr2	30828	30860	b	b	-
+chr2	30861	30893	a	a	+
+chr2	30863	30895	a	a	+
+chr2	30863	30895	a	a	+
+chr2	30863	30895	a	a	+
+chr2	30839	30871	b	b	-
+chr2	30840	30872	b	b	-
+chr2	30840	30872	b	b	-
+chr2	30845	30877	b	b	-
+chr2	30845	30877	b	b	-
+chr2	30878	30910	a	a	+
+chr2	30852	30884	b	b	-
+chr2	30886	30918	a	a	+
+chr2	30886	30918	a	a	+
+chr2	30888	30920	a	a	+
+chr2	30888	30920	a	a	+
+chr2	30888	30920	a	a	+
+chr2	30889	30921	a	a	+
+chr2	30860	30892	b	b	-
+chr2	30860	30892	b	b	-
+chr2	30861	30893	b	b	-
+chr2	30896	30928	a	a	+
+chr2	30896	30928	a	a	+
+chr2	30872	30904	b	b	-
+chr2	30905	30937	a	a	+
+chr2	30874	30906	b	b	-
+chr2	30915	30947	a	a	+
+chr2	30883	30915	b	b	-
+chr2	30920	30952	a	a	+
+chr2	30924	30956	a	a	+
+chr2	30893	30925	b	b	-
+chr2	30930	30962	a	a	+
+chr2	30930	30962	a	a	+
+chr2	30930	30962	a	a	+
+chr2	30931	30963	a	a	+
+chr2	30936	30968	a	a	+
+chr2	30937	30969	a	a	+
+chr2	30943	30975	a	a	+
+chr2	30911	30943	b	b	-
+chr2	30912	30944	b	b	-
+chr2	30945	30977	a	a	+
+chr2	30914	30946	b	b	-
+chr2	30916	30948	b	b	-
+chr2	30959	30991	a	a	+
+chr2	30960	30992	a	a	+
+chr2	30931	30963	b	b	-
+chr2	30933	30965	b	b	-
+chr2	30970	31002	a	a	+
+chr2	30970	31002	a	a	+
+chr2	30939	30971	b	b	-
+chr2	30939	30971	b	b	-
+chr2	30940	30972	b	b	-
+chr2	30975	31007	a	a	+
+chr2	30948	30980	b	b	-
+chr2	30989	31021	a	a	+
+chr2	30993	31025	a	a	+
+chr2	30984	31016	b	b	-
+chr2	31032	31064	a	a	+
+chr2	31033	31065	a	a	+
+chr2	31033	31065	a	a	+
+chr2	31033	31065	a	a	+
+chr2	31018	31050	b	b	-
+chr2	31018	31050	b	b	-
+chr2	31053	31085	a	a	+
+chr2	31026	31058	b	b	-
+chr2	31026	31058	b	b	-
+chr2	31026	31058	b	b	-
+chr2	31061	31093	a	a	+
+chr2	31063	31095	a	a	+
+chr2	31031	31063	b	b	-
+chr2	31031	31063	b	b	-
+chr2	31035	31067	b	b	-
+chr2	31037	31069	b	b	-
+chr2	31071	31103	a	a	+
+chr2	31078	31110	a	a	+
+chr2	31080	31112	a	a	+
+chr2	31081	31113	a	a	+
+chr2	31081	31113	a	a	+
+chr2	31081	31113	a	a	+
+chr2	31049	31081	b	b	-
+chr2	31050	31082	b	b	-
+chr2	31083	31115	a	a	+
+chr2	31051	31083	b	b	-
+chr2	31051	31083	b	b	-
+chr2	31054	31086	b	b	-
+chr2	31054	31086	b	b	-
+chr2	31054	31086	b	b	-
+chr2	31054	31086	b	b	-
+chr2	31054	31086	b	b	-
+chr2	31091	31123	a	a	+
+chr2	31091	31123	a	a	+
+chr2	31092	31124	a	a	+
+chr2	31061	31093	b	b	-
+chr2	31061	31093	b	b	-
+chr2	31064	31096	b	b	-
+chr2	31065	31097	b	b	-
+chr2	31098	31130	a	a	+
+chr2	31098	31130	a	a	+
+chr2	31099	31131	a	a	+
+chr2	31099	31131	a	a	+
+chr2	31067	31099	b	b	-
+chr2	31102	31134	a	a	+
+chr2	31102	31134	a	a	+
+chr2	31102	31134	a	a	+
+chr2	31102	31134	a	a	+
+chr2	31102	31134	a	a	+
+chr2	31070	31102	b	b	-
+chr2	31070	31102	b	b	-
+chr2	31070	31102	b	b	-
+chr2	31070	31102	b	b	-
+chr2	31070	31102	b	b	-
+chr2	31070	31102	b	b	-
+chr2	31070	31102	b	b	-
+chr2	31070	31102	b	b	-
+chr2	31103	31135	a	a	+
+chr2	31103	31135	a	a	+
+chr2	31103	31135	a	a	+
+chr2	31104	31136	a	a	+
+chr2	31106	31138	a	a	+
+chr2	31106	31138	a	a	+
+chr2	31074	31106	b	b	-
+chr2	31109	31141	a	a	+
+chr2	31109	31141	a	a	+
+chr2	31078	31110	b	b	-
+chr2	31079	31111	b	b	-
+chr2	31079	31111	b	b	-
+chr2	31080	31112	b	b	-
+chr2	31081	31113	b	b	-
+chr2	31081	31113	b	b	-
+chr2	31114	31146	a	a	+
+chr2	31114	31146	a	a	+
+chr2	31083	31115	b	b	-
+chr2	31118	31150	a	a	+
+chr2	31118	31150	a	a	+
+chr2	31088	31120	b	b	-
+chr2	31088	31120	b	b	-
+chr2	31090	31122	b	b	-
+chr2	31127	31159	a	a	+
+chr2	31100	31132	b	b	-
+chr2	31100	31132	b	b	-
+chr2	31101	31133	b	b	-
+chr2	31134	31166	a	a	+
+chr2	31105	31137	b	b	-
+chr2	31141	31173	a	a	+
+chr2	31109	31141	b	b	-
+chr2	31112	31144	b	b	-
+chr2	31118	31150	b	b	-
+chr2	31151	31183	a	a	+
+chr2	31151	31183	a	a	+
+chr2	31151	31183	a	a	+
+chr2	31157	31189	a	a	+
+chr2	31157	31189	a	a	+
+chr2	31128	31160	b	b	-
+chr2	31165	31197	a	a	+
+chr2	31133	31165	b	b	-
+chr2	31133	31165	b	b	-
+chr2	31166	31198	a	a	+
+chr2	31166	31198	a	a	+
+chr2	31188	31220	b	b	-
+chr2	31223	31255	a	a	+
+chr2	31234	31266	a	a	+
+chr2	31208	31240	b	b	-
+chr2	31246	31278	a	a	+
+chr2	31246	31278	a	a	+
+chr2	31246	31278	a	a	+
+chr2	31248	31280	a	a	+
+chr2	31251	31283	a	a	+
+chr2	31253	31285	a	a	+
+chr2	31223	31255	b	b	-
+chr2	31225	31257	b	b	-
+chr2	31233	31265	b	b	-
+chr2	31236	31268	b	b	-
+chr2	31269	31301	a	a	+
+chr2	31271	31303	a	a	+
+chr2	31271	31303	a	a	+
+chr2	31273	31305	a	a	+
+chr2	31274	31306	a	a	+
+chr2	31274	31306	a	a	+
+chr2	31274	31306	a	a	+
+chr2	31274	31306	a	a	+
+chr2	31274	31306	a	a	+
+chr2	31274	31306	a	a	+
+chr2	31274	31306	a	a	+
+chr2	31274	31306	a	a	+
+chr2	31246	31278	b	b	-
+chr2	31279	31311	a	a	+
+chr2	31279	31311	a	a	+
+chr2	31279	31311	a	a	+
+chr2	31249	31281	b	b	-
+chr2	31249	31281	b	b	-
+chr2	31250	31282	b	b	-
+chr2	31250	31282	b	b	-
+chr2	31283	31315	a	a	+
+chr2	31283	31315	a	a	+
+chr2	31283	31315	a	a	+
+chr2	31283	31315	a	a	+
+chr2	31256	31288	b	b	-
+chr2	31256	31288	b	b	-
+chr2	31256	31288	b	b	-
+chr2	31256	31288	b	b	-
+chr2	31256	31288	b	b	-
+chr2	31257	31289	b	b	-
+chr2	31291	31323	a	a	+
+chr2	31260	31292	b	b	-
+chr2	31263	31295	b	b	-
+chr2	31263	31295	b	b	-
+chr2	31263	31295	b	b	-
+chr2	31264	31296	b	b	-
+chr2	31264	31296	b	b	-
+chr2	31264	31296	b	b	-
+chr2	31264	31296	b	b	-
+chr2	31298	31330	a	a	+
+chr2	31273	31305	b	b	-
+chr2	31313	31345	a	a	+
+chr2	31282	31314	b	b	-
+chr2	31282	31314	b	b	-
+chr2	31320	31352	a	a	+
+chr2	31321	31353	a	a	+
+chr2	31321	31353	a	a	+
+chr2	31290	31322	b	b	-
+chr2	31293	31325	b	b	-
+chr2	31296	31328	b	b	-
+chr2	31303	31335	b	b	-
+chr2	31337	31369	a	a	+
+chr2	31337	31369	a	a	+
+chr2	31345	31377	a	a	+
+chr2	31316	31348	b	b	-
+chr2	31316	31348	b	b	-
+chr2	31316	31348	b	b	-
+chr2	31352	31384	a	a	+
+chr2	31356	31388	a	a	+
+chr2	31373	31405	a	a	+
+chr2	31351	31383	b	b	-
+chr2	31386	31418	a	a	+
+chr2	31386	31418	a	a	+
+chr2	31354	31386	b	b	-
+chr2	31376	31408	b	b	-
+chr2	31379	31411	b	b	-
+chr2	31416	31448	a	a	+
+chr2	31418	31450	a	a	+
+chr2	31424	31456	a	a	+
+chr2	31392	31424	b	b	-
+chr2	31392	31424	b	b	-
+chr2	31414	31446	b	b	-
+chr2	31448	31480	a	a	+
+chr2	31416	31448	b	b	-
+chr2	31450	31482	a	a	+
+chr2	31451	31483	a	a	+
+chr2	31457	31489	a	a	+
+chr2	31439	31471	b	b	-
+chr2	31451	31483	b	b	-
+chr2	31484	31516	a	a	+
+chr2	31490	31522	a	a	+
+chr2	31495	31527	a	a	+
+chr2	31464	31496	b	b	-
+chr2	31476	31508	b	b	-
+chr2	31484	31516	b	b	-
+chr2	31510	31542	b	b	-
+chr2	31528	31560	b	b	-
+chr2	31579	31611	a	a	+
+chr2	31579	31611	a	a	+
+chr2	31572	31604	b	b	-
+chr2	31585	31617	b	b	-
+chr2	31639	31671	b	b	-
+chr2	31642	31674	b	b	-
+chr2	31649	31681	b	b	-
+chr2	31684	31716	a	a	+
+chr2	31664	31696	b	b	-
+chr2	31726	31758	a	a	+
+chr2	31694	31726	b	b	-
+chr2	31740	31772	a	a	+
+chr2	31740	31772	a	a	+
+chr2	31740	31772	a	a	+
+chr2	31740	31772	a	a	+
+chr2	31741	31773	a	a	+
+chr2	31711	31743	b	b	-
+chr2	31715	31747	b	b	-
+chr2	31715	31747	b	b	-
+chr2	31778	31810	a	a	+
+chr2	31778	31810	a	a	+
+chr2	31778	31810	a	a	+
+chr2	31778	31810	a	a	+
+chr2	31778	31810	a	a	+
+chr2	31755	31787	b	b	-
+chr2	31795	31827	a	a	+
+chr2	31783	31815	b	b	-
+chr2	31794	31826	b	b	-
+chr2	31795	31827	b	b	-
+chr2	31857	31889	a	a	+
+chr2	31863	31895	a	a	+
+chr2	31863	31895	a	a	+
+chr2	31840	31872	b	b	-
+chr2	31840	31872	b	b	-
+chr2	31878	31910	a	a	+
+chr2	31885	31917	a	a	+
+chr2	31890	31922	a	a	+
+chr2	31897	31929	a	a	+
+chr2	31867	31899	b	b	-
+chr2	31867	31899	b	b	-
+chr2	31867	31899	b	b	-
+chr2	31867	31899	b	b	-
+chr2	31867	31899	b	b	-
+chr2	31902	31934	a	a	+
+chr2	31870	31902	b	b	-
+chr2	31915	31947	a	a	+
+chr2	31915	31947	a	a	+
+chr2	31916	31948	a	a	+
+chr2	31918	31950	a	a	+
+chr2	31888	31920	b	b	-
+chr2	31888	31920	b	b	-
+chr2	31923	31955	b	b	-
+chr2	31966	31998	a	a	+
+chr2	31966	31998	a	a	+
+chr2	31966	31998	a	a	+
+chr2	31978	32010	a	a	+
+chr2	31959	31991	b	b	-
+chr2	32007	32039	a	a	+
+chr2	32007	32039	a	a	+
+chr2	32007	32039	a	a	+
+chr2	32007	32039	b	b	-
+chr2	32057	32089	a	a	+
+chr2	32059	32091	a	a	+
+chr2	32063	32095	a	a	+
+chr2	32039	32071	b	b	-
+chr2	32045	32077	b	b	-
+chr2	32083	32115	a	a	+
+chr2	32083	32115	a	a	+
+chr2	32052	32084	b	b	-
+chr2	32063	32095	b	b	-
+chr2	32105	32137	a	a	+
+chr2	32090	32122	b	b	-
+chr2	32160	32192	a	a	+
+chr2	32138	32170	b	b	-
+chr2	32174	32206	a	a	+
+chr2	32146	32178	b	b	-
+chr2	32194	32226	a	a	+
+chr2	32187	32219	b	b	-
+chr2	32191	32223	b	b	-
+chr2	32226	32258	a	a	+
+chr2	32196	32228	b	b	-
+chr2	32196	32228	b	b	-
+chr2	32196	32228	b	b	-
+chr2	32200	32232	b	b	-
+chr2	32236	32268	a	a	+
+chr2	32207	32239	b	b	-
+chr2	32221	32253	b	b	-
+chr2	32258	32290	a	a	+
+chr2	32258	32290	a	a	+
+chr2	32227	32259	b	b	-
+chr2	32269	32301	a	a	+
+chr2	32330	32362	a	a	+
+chr2	32330	32362	a	a	+
+chr2	32300	32332	b	b	-
+chr2	32300	32332	b	b	-
+chr2	32300	32332	b	b	-
+chr2	32344	32376	a	a	+
+chr2	32355	32387	a	a	+
+chr2	32345	32377	b	b	-
+chr2	32416	32448	a	a	+
+chr2	32418	32450	a	a	+
+chr2	32422	32454	a	a	+
+chr2	32403	32435	b	b	-
+chr2	32406	32438	b	b	-
+chr2	32406	32438	b	b	-
+chr2	32408	32440	b	b	-
+chr2	32442	32474	a	a	+
+chr2	32411	32443	b	b	-
+chr2	32414	32446	b	b	-
+chr2	32417	32449	b	b	-
+chr2	32418	32450	b	b	-
+chr2	32421	32453	b	b	-
+chr2	32461	32493	b	b	-
+chr2	32463	32495	b	b	-
+chr2	32463	32495	b	b	-
+chr2	32476	32508	b	b	-
+chr2	32536	32568	a	a	+
+chr2	32508	32540	b	b	-
+chr2	32509	32541	b	b	-
+chr2	32546	32578	a	a	+
+chr2	32546	32578	a	a	+
+chr2	32552	32584	a	a	+
+chr2	32546	32578	b	b	-
+chr2	32572	32604	b	b	-
+chr2	32600	32632	b	b	-
+chr2	32674	32706	a	a	+
+chr2	32687	32719	b	b	-
+chr2	32763	32795	b	b	-
+chr2	32769	32801	b	b	-
+chr2	32788	32820	b	b	-
+chr2	32888	32920	a	a	+
+chr2	32888	32920	a	a	+
+chr2	32895	32927	a	a	+
+chr2	32895	32927	a	a	+
+chr2	32933	32965	a	a	+
+chr2	32955	32987	a	a	+
+chr2	32956	32988	a	a	+
+chr2	33015	33047	a	a	+
+chr2	33015	33047	a	a	+
+chr2	33044	33076	a	a	+
+chr2	33045	33077	a	a	+
+chr2	33014	33046	b	b	-
+chr2	33034	33066	b	b	-
+chr2	33034	33066	b	b	-
+chr2	33047	33079	b	b	-
+chr2	33101	33133	b	b	-
+chr2	33168	33200	a	a	+
+chr2	33168	33200	a	a	+
+chr2	33146	33178	b	b	-
+chr2	33162	33194	b	b	-
+chr2	33197	33229	a	a	+
+chr2	33212	33244	a	a	+
+chr2	33212	33244	a	a	+
+chr2	33212	33244	a	a	+
+chr2	33212	33244	a	a	+
+chr2	33227	33259	b	b	-
+chr2	33229	33261	b	b	-
+chr2	33282	33314	a	a	+
+chr2	33295	33327	a	a	+
+chr2	33326	33358	a	a	+
+chr2	33327	33359	a	a	+
+chr2	33391	33423	a	a	+
+chr2	33434	33466	a	a	+
+chr2	33415	33447	b	b	-
+chr2	33417	33449	b	b	-
+chr2	33451	33483	a	a	+
+chr2	33530	33562	a	a	+
+chr2	33526	33558	b	b	-
+chr2	33563	33595	a	a	+
+chr2	33565	33597	a	a	+
+chr2	33579	33611	a	a	+
+chr2	33579	33611	a	a	+
+chr2	33548	33580	b	b	-
+chr2	33604	33636	a	a	+
+chr2	33609	33641	a	a	+
+chr2	33583	33615	b	b	-
+chr2	33627	33659	a	a	+
+chr2	33651	33683	a	a	+
+chr2	33706	33738	a	a	+
+chr2	33687	33719	b	b	-
+chr2	33708	33740	b	b	-
+chr2	33797	33829	a	a	+
+chr2	33816	33848	a	a	+
+chr2	33849	33881	a	a	+
+chr2	33867	33899	a	a	+
+chr2	33843	33875	b	b	-
+chr2	33848	33880	b	b	-
+chr2	33882	33914	a	a	+
+chr2	33894	33926	a	a	+
+chr2	33871	33903	b	b	-
+chr2	33877	33909	b	b	-
+chr2	33928	33960	a	a	+
+chr2	33929	33961	a	a	+
+chr2	33935	33967	a	a	+
+chr2	33903	33935	b	b	-
+chr2	33912	33944	b	b	-
+chr2	33912	33944	b	b	-
+chr2	33945	33977	a	a	+
+chr2	33945	33977	a	a	+
+chr2	33946	33978	a	a	+
+chr2	33951	33983	a	a	+
+chr2	33923	33955	b	b	-
+chr2	33958	33990	a	a	+
+chr2	33995	34027	a	a	+
+chr2	33995	34027	a	a	+
+chr2	34011	34043	a	a	+
+chr2	34018	34050	a	a	+
+chr2	34035	34067	a	a	+
+chr2	34029	34061	b	b	-
+chr2	34046	34078	b	b	-
+chr2	34086	34118	a	a	+
+chr2	34086	34118	a	a	+
+chr2	34135	34167	a	a	+
+chr2	34136	34168	a	a	+
+chr2	34137	34169	a	a	+
+chr2	34139	34171	a	a	+
+chr2	34108	34140	b	b	-
+chr2	34113	34145	b	b	-
+chr2	34113	34145	b	b	-
+chr2	34161	34193	b	b	-
+chr2	34201	34233	a	a	+
+chr2	34181	34213	b	b	-
+chr2	34228	34260	a	a	+
+chr2	34231	34263	b	b	-
+chr2	34234	34266	b	b	-
+chr2	34268	34300	a	a	+
+chr2	34271	34303	a	a	+
+chr2	34255	34287	b	b	-
+chr2	34365	34397	b	b	-
+chr2	34381	34413	b	b	-
+chr2	34417	34449	a	a	+
+chr2	34436	34468	a	a	+
+chr2	34436	34468	a	a	+
+chr2	34437	34469	a	a	+
+chr2	34415	34447	b	b	-
+chr2	34449	34481	a	a	+
+chr2	34457	34489	a	a	+
+chr2	34441	34473	b	b	-
+chr2	34475	34507	a	a	+
+chr2	34453	34485	b	b	-
+chr2	34488	34520	a	a	+
+chr2	34456	34488	b	b	-
+chr2	34460	34492	b	b	-
+chr2	34499	34531	a	a	+
+chr2	34504	34536	a	a	+
+chr2	34478	34510	b	b	-
+chr2	34516	34548	a	a	+
+chr2	34486	34518	b	b	-
+chr2	34494	34526	b	b	-
+chr2	34528	34560	a	a	+
+chr2	34528	34560	a	a	+
+chr2	34500	34532	b	b	-
+chr2	34500	34532	b	b	-
+chr2	34539	34571	a	a	+
+chr2	34540	34572	a	a	+
+chr2	34536	34568	b	b	-
+chr2	34575	34607	a	a	+
+chr2	34576	34608	a	a	+
+chr2	34597	34629	a	a	+
+chr2	34575	34607	b	b	-
+chr2	34636	34668	a	a	+
+chr2	34670	34702	a	a	+
+chr2	34641	34673	b	b	-
+chr2	34670	34702	b	b	-
+chr2	34675	34707	b	b	-
+chr2	34679	34711	b	b	-
+chr2	34720	34752	a	a	+
+chr2	34705	34737	b	b	-
+chr2	34751	34783	a	a	+
+chr2	34760	34792	a	a	+
+chr2	34774	34806	a	a	+
+chr2	34774	34806	a	a	+
+chr2	34780	34812	a	a	+
+chr2	34748	34780	b	b	-
+chr2	34792	34824	a	a	+
+chr2	34824	34856	a	a	+
+chr2	34824	34856	a	a	+
+chr2	34824	34856	a	a	+
+chr2	34826	34858	a	a	+
+chr2	34836	34868	b	b	-
+chr2	34836	34868	b	b	-
+chr2	34837	34869	b	b	-
+chr2	34874	34906	a	a	+
+chr2	34888	34920	a	a	+
+chr2	34888	34920	a	a	+
+chr2	34889	34921	a	a	+
+chr2	34902	34934	a	a	+
+chr2	34878	34910	b	b	-
+chr2	34914	34946	b	b	-
+chr2	34952	34984	a	a	+
+chr2	34952	34984	a	a	+
+chr2	34952	34984	a	a	+
+chr2	34969	35001	a	a	+
+chr2	34979	35011	a	a	+
+chr2	34979	35011	a	a	+
+chr2	34957	34989	b	b	-
+chr2	34994	35026	a	a	+
+chr2	35009	35041	a	a	+
+chr2	35004	35036	b	b	-
+chr2	35037	35069	a	a	+
+chr2	35044	35076	a	a	+
+chr2	35112	35144	a	a	+
+chr2	35146	35178	a	a	+
+chr2	35115	35147	b	b	-
+chr2	35137	35169	b	b	-
+chr2	35141	35173	b	b	-
+chr2	35141	35173	b	b	-
+chr2	35178	35210	a	a	+
+chr2	35195	35227	a	a	+
+chr2	35195	35227	a	a	+
+chr2	35166	35198	b	b	-
+chr2	35169	35201	b	b	-
+chr2	35192	35224	b	b	-
+chr2	35257	35289	b	b	-
+chr2	35260	35292	b	b	-
+chr2	35261	35293	b	b	-
+chr2	35265	35297	b	b	-
+chr2	35265	35297	b	b	-
+chr2	35285	35317	b	b	-
+chr2	35295	35327	b	b	-
+chr2	35296	35328	b	b	-
+chr2	35296	35328	b	b	-
+chr2	35296	35328	b	b	-
+chr2	35297	35329	b	b	-
+chr2	35300	35332	b	b	-
+chr2	35300	35332	b	b	-
+chr2	35300	35332	b	b	-
+chr2	35301	35333	b	b	-
+chr2	35301	35333	b	b	-
+chr2	35301	35333	b	b	-
+chr2	35301	35333	b	b	-
+chr2	35301	35333	b	b	-
+chr2	35301	35333	b	b	-
+chr2	35306	35338	b	b	-
+chr2	35341	35373	a	a	+
+chr2	35341	35373	a	a	+
+chr2	35341	35373	a	a	+
+chr2	35341	35373	a	a	+
+chr2	35341	35373	a	a	+
+chr2	35341	35373	a	a	+
+chr2	35311	35343	b	b	-
+chr2	35344	35376	a	a	+
+chr2	35312	35344	b	b	-
+chr2	35313	35345	b	b	-
+chr2	35313	35345	b	b	-
+chr2	35313	35345	b	b	-
+chr2	35313	35345	b	b	-
+chr2	35315	35347	b	b	-
+chr2	35315	35347	b	b	-
+chr2	35316	35348	b	b	-
+chr2	35319	35351	b	b	-
+chr2	35319	35351	b	b	-
+chr2	35319	35351	b	b	-
+chr2	35319	35351	b	b	-
+chr2	35319	35351	b	b	-
+chr2	35355	35387	a	a	+
+chr2	35362	35394	a	a	+
+chr2	35365	35397	a	a	+
+chr2	35342	35374	b	b	-
+chr2	35375	35407	a	a	+
+chr2	35345	35377	b	b	-
+chr2	35382	35414	a	a	+
+chr2	35354	35386	b	b	-
+chr2	35387	35419	a	a	+
+chr2	35357	35389	b	b	-
+chr2	35390	35422	a	a	+
+chr2	35358	35390	b	b	-
+chr2	35392	35424	a	a	+
+chr2	35395	35427	a	a	+
+chr2	35397	35429	a	a	+
+chr2	35397	35429	a	a	+
+chr2	35402	35434	a	a	+
+chr2	35403	35435	a	a	+
+chr2	35404	35436	a	a	+
+chr2	35406	35438	a	a	+
+chr2	35406	35438	a	a	+
+chr2	35376	35408	b	b	-
+chr2	35437	35469	a	a	+
+chr2	35437	35469	a	a	+
+chr2	35432	35464	b	b	-
+chr2	35486	35518	a	a	+
+chr2	35464	35496	b	b	-
+chr2	35471	35503	b	b	-
+chr2	35480	35512	b	b	-
+chr2	35480	35512	b	b	-
+chr2	35491	35523	b	b	-
+chr2	35494	35526	b	b	-
+chr2	35495	35527	b	b	-
+chr2	35531	35563	a	a	+
+chr2	35531	35563	a	a	+
+chr2	35538	35570	a	a	+
+chr2	35538	35570	a	a	+
+chr2	35538	35570	a	a	+
+chr2	35542	35574	a	a	+
+chr2	35542	35574	a	a	+
+chr2	35545	35577	a	a	+
+chr2	35546	35578	a	a	+
+chr2	35548	35580	a	a	+
+chr2	35548	35580	a	a	+
+chr2	35550	35582	a	a	+
+chr2	35550	35582	a	a	+
+chr2	35550	35582	a	a	+
+chr2	35550	35582	a	a	+
+chr2	35550	35582	a	a	+
+chr2	35556	35588	a	a	+
+chr2	35556	35588	a	a	+
+chr2	35556	35588	a	a	+
+chr2	35564	35596	a	a	+
+chr2	35565	35597	a	a	+
+chr2	35569	35601	a	a	+
+chr2	35570	35602	a	a	+
+chr2	35575	35607	a	a	+
+chr2	35576	35608	a	a	+
+chr2	35580	35612	a	a	+
+chr2	35581	35613	a	a	+
+chr2	35647	35679	b	b	-
+chr2	35693	35725	a	a	+
+chr2	35671	35703	b	b	-
+chr2	35721	35753	a	a	+
+chr2	35698	35730	b	b	-
+chr2	35698	35730	b	b	-
+chr2	35878	35910	b	b	-
+chr2	35953	35985	a	a	+
+chr2	35953	35985	a	a	+
+chr2	35969	36001	a	a	+
+chr2	35944	35976	b	b	-
+chr2	35988	36020	a	a	+
+chr2	35963	35995	b	b	-
+chr2	36003	36035	a	a	+
+chr2	36003	36035	a	a	+
+chr2	36003	36035	a	a	+
+chr2	36004	36036	a	a	+
+chr2	36004	36036	a	a	+
+chr2	35988	36020	b	b	-
+chr2	35989	36021	b	b	-
+chr2	35993	36025	b	b	-
+chr2	35993	36025	b	b	-
+chr2	36031	36063	a	a	+
+chr2	36003	36035	b	b	-
+chr2	36043	36075	a	a	+
+chr2	36043	36075	a	a	+
+chr2	36043	36075	a	a	+
+chr2	36044	36076	a	a	+
+chr2	36012	36044	b	b	-
+chr2	36012	36044	b	b	-
+chr2	36046	36078	a	a	+
+chr2	36018	36050	b	b	-
+chr2	36020	36052	b	b	-
+chr2	36020	36052	b	b	-
+chr2	36023	36055	b	b	-
+chr2	36059	36091	a	a	+
+chr2	36028	36060	b	b	-
+chr2	36029	36061	b	b	-
+chr2	36029	36061	b	b	-
+chr2	36062	36094	a	a	+
+chr2	36063	36095	a	a	+
+chr2	36064	36096	a	a	+
+chr2	36064	36096	a	a	+
+chr2	36064	36096	a	a	+
+chr2	36033	36065	b	b	-
+chr2	36035	36067	b	b	-
+chr2	36035	36067	b	b	-
+chr2	36035	36067	b	b	-
+chr2	36035	36067	b	b	-
+chr2	36069	36101	a	a	+
+chr2	36069	36101	a	a	+
+chr2	36069	36101	a	a	+
+chr2	36069	36101	a	a	+
+chr2	36038	36070	b	b	-
+chr2	36038	36070	b	b	-
+chr2	36038	36070	b	b	-
+chr2	36071	36103	a	a	+
+chr2	36071	36103	a	a	+
+chr2	36071	36103	a	a	+
+chr2	36071	36103	a	a	+
+chr2	36039	36071	b	b	-
+chr2	36072	36104	a	a	+
+chr2	36072	36104	a	a	+
+chr2	36072	36104	a	a	+
+chr2	36072	36104	a	a	+
+chr2	36041	36073	b	b	-
+chr2	36041	36073	b	b	-
+chr2	36041	36073	b	b	-
+chr2	36042	36074	b	b	-
+chr2	36044	36076	b	b	-
+chr2	36044	36076	b	b	-
+chr2	36085	36117	a	a	+
+chr2	36087	36119	a	a	+
+chr2	36087	36119	a	a	+
+chr2	36055	36087	b	b	-
+chr2	36056	36088	b	b	-
+chr2	36060	36092	b	b	-
+chr2	36060	36092	b	b	-
+chr2	36060	36092	b	b	-
+chr2	36097	36129	a	a	+
+chr2	36097	36129	a	a	+
+chr2	36097	36129	a	a	+
+chr2	36097	36129	a	a	+
+chr2	36065	36097	b	b	-
+chr2	36100	36132	a	a	+
+chr2	36100	36132	a	a	+
+chr2	36104	36136	a	a	+
+chr2	36075	36107	b	b	-
+chr2	36108	36140	a	a	+
+chr2	36110	36142	a	a	+
+chr2	36118	36150	a	a	+
+chr2	36091	36123	b	b	-
+chr2	36124	36156	a	a	+
+chr2	36095	36127	b	b	-
+chr2	36133	36165	a	a	+
+chr2	36141	36173	a	a	+
+chr2	36110	36142	b	b	-
+chr2	36110	36142	b	b	-
+chr2	36113	36145	b	b	-
+chr2	36113	36145	b	b	-
+chr2	36113	36145	b	b	-
+chr2	36155	36187	a	a	+
+chr2	36167	36199	a	a	+
+chr2	36168	36200	a	a	+
+chr2	36172	36204	a	a	+
+chr2	36172	36204	a	a	+
+chr2	36172	36204	a	a	+
+chr2	36172	36204	a	a	+
+chr2	36176	36208	a	a	+
+chr2	36184	36216	a	a	+
+chr2	36194	36226	a	a	+
+chr2	36208	36240	a	a	+
+chr2	36208	36240	a	a	+
+chr2	36208	36240	a	a	+
+chr2	36214	36246	a	a	+
+chr2	36228	36260	a	a	+
+chr2	36196	36228	b	b	-
+chr2	36235	36267	a	a	+
+chr2	36203	36235	b	b	-
+chr2	36206	36238	b	b	-
+chr2	36212	36244	b	b	-
+chr2	36230	36262	b	b	-
+chr2	36765	36797	a	a	+
+chr2	36765	36797	a	a	+
+chr2	36736	36768	b	b	-
+chr2	36740	36772	b	b	-
+chr2	36740	36772	b	b	-
+chr2	36958	36990	a	a	+
+chr2	37073	37105	b	b	-
+chr2	37086	37118	b	b	-
+chr2	37804	37836	a	a	+
+chr2	37805	37837	a	a	+
+chr2	37805	37837	a	a	+
+chr2	37832	37864	a	a	+
+chr2	38072	38104	b	b	-
+chr2	39112	39144	b	b	-
+chr2	39128	39160	b	b	-
+chr2	39162	39194	a	a	+
+chr2	39131	39163	b	b	-
+chr2	39132	39164	b	b	-
+chr2	39132	39164	b	b	-
+chr2	39166	39198	a	a	+
+chr2	39167	39199	a	a	+
+chr2	39174	39206	a	a	+
+chr2	39181	39213	a	a	+
+chr2	39181	39213	a	a	+
+chr2	39187	39219	a	a	+
+chr2	39187	39219	a	a	+
+chr2	39160	39192	b	b	-
+chr2	39163	39195	b	b	-
+chr2	39163	39195	b	b	-
+chr2	39163	39195	b	b	-
+chr2	39330	39362	a	a	+
+chr2	39331	39363	b	b	-
+chr2	39369	39401	a	a	+
+chr2	39345	39377	b	b	-
+chr2	39422	39454	a	a	+
+chr2	39458	39490	b	b	-
+chr2	39459	39491	b	b	-
+chr2	39459	39491	b	b	-
+chr2	39469	39501	b	b	-
+chr2	39626	39658	b	b	-
+chr2	39642	39674	b	b	-
+chr2	39703	39735	a	a	+
+chr2	39797	39829	a	a	+
+chr2	39802	39834	a	a	+
+chr2	39810	39842	a	a	+
+chr2	39785	39817	b	b	-
+chr2	39821	39853	a	a	+
+chr2	39800	39832	b	b	-
+chr2	39827	39859	b	b	-
+chr2	39841	39873	b	b	-
+chr2	39958	39990	b	b	-
+chr2	40014	40046	a	a	+
+chr2	39990	40022	b	b	-
+chr2	40024	40056	a	a	+
+chr2	40024	40056	a	a	+
+chr2	40024	40056	a	a	+
+chr2	39999	40031	b	b	-
+chr2	40000	40032	b	b	-
+chr2	40000	40032	b	b	-
+chr2	40040	40072	a	a	+
+chr2	40043	40075	a	a	+
+chr2	40043	40075	a	a	+
+chr2	40043	40075	a	a	+
+chr2	40044	40076	a	a	+
+chr2	40044	40076	a	a	+
+chr2	40044	40076	a	a	+
+chr2	40014	40046	b	b	-
+chr2	40014	40046	b	b	-
+chr2	40014	40046	b	b	-
+chr2	40015	40047	b	b	-
+chr2	40015	40047	b	b	-
+chr2	40015	40047	b	b	-
+chr2	40015	40047	b	b	-
+chr2	40049	40081	a	a	+
+chr2	40039	40071	b	b	-
+chr2	40072	40104	a	a	+
+chr2	40041	40073	b	b	-
+chr2	40126	40158	a	a	+
+chr2	40199	40231	a	a	+
+chr2	40199	40231	a	a	+
+chr2	40227	40259	a	a	+
+chr2	40358	40390	a	a	+
+chr2	40487	40519	a	a	+
+chr2	40459	40491	b	b	-
+chr2	40460	40492	b	b	-
+chr2	40460	40492	b	b	-
+chr2	40474	40506	b	b	-
+chr2	40476	40508	b	b	-
+chr2	40476	40508	b	b	-
+chr2	40511	40543	a	a	+
+chr2	40511	40543	a	a	+
+chr2	40483	40515	b	b	-
+chr2	40519	40551	a	a	+
+chr2	40521	40553	a	a	+
+chr2	40522	40554	a	a	+
+chr2	40525	40557	a	a	+
+chr2	40525	40557	a	a	+
+chr2	40526	40558	a	a	+
+chr2	40526	40558	a	a	+
+chr2	40545	40577	a	a	+
+chr2	40726	40758	b	b	-
+chr2	40776	40808	a	a	+
+chr2	40794	40826	a	a	+
+chr2	40762	40794	b	b	-
+chr2	40795	40827	a	a	+
+chr2	40795	40827	a	a	+
+chr2	40799	40831	a	a	+
+chr2	40769	40801	b	b	-
+chr2	40769	40801	b	b	-
+chr2	40772	40804	b	b	-
+chr2	40772	40804	b	b	-
+chr2	40805	40837	a	a	+
+chr2	40773	40805	b	b	-
+chr2	40773	40805	b	b	-
+chr2	40774	40806	b	b	-
+chr2	40810	40842	a	a	+
+chr2	40811	40843	a	a	+
+chr2	40813	40845	a	a	+
+chr2	40783	40815	b	b	-
+chr2	40783	40815	b	b	-
+chr2	40817	40849	a	a	+
+chr2	40818	40850	a	a	+
+chr2	40786	40818	b	b	-
+chr2	40789	40821	b	b	-
+chr2	40826	40858	a	a	+
+chr2	40826	40858	a	a	+
+chr2	40826	40858	a	a	+
+chr2	40826	40858	a	a	+
+chr2	40837	40869	a	a	+
+chr2	40934	40966	b	b	-
+chr2	40970	41002	a	a	+
+chr2	40948	40980	b	b	-
+chr2	40948	40980	b	b	-
+chr2	40982	41014	a	a	+
+chr2	40999	41031	a	a	+
+chr2	40969	41001	b	b	-
+chr2	41116	41148	a	a	+
+chr2	41085	41117	b	b	-
+chr2	41086	41118	b	b	-
+chr2	41108	41140	b	b	-
+chr2	41156	41188	a	a	+
+chr2	41280	41312	b	b	-
+chr2	41452	41484	a	a	+
+chr2	41469	41501	a	a	+
+chr2	41909	41941	b	b	-
+chr2	42071	42103	a	a	+
+chr2	42199	42231	a	a	+
+chr2	42445	42477	a	a	+
+chr2	42419	42451	b	b	-
+chr2	42542	42574	a	a	+
+chr2	42580	42612	a	a	+
+chr2	42671	42703	a	a	+
+chr2	42817	42849	a	a	+
+chr2	42844	42876	a	a	+
+chr2	42845	42877	a	a	+
+chr2	42858	42890	a	a	+
+chr2	42881	42913	a	a	+
+chr2	42940	42972	b	b	-
+chr2	42988	43020	a	a	+
+chr2	42959	42991	b	b	-
+chr2	42972	43004	b	b	-
+chr2	43010	43042	a	a	+
+chr2	42984	43016	b	b	-
+chr2	42984	43016	b	b	-
+chr2	43025	43057	a	a	+
+chr2	43026	43058	a	a	+
+chr2	42994	43026	b	b	-
+chr2	42994	43026	b	b	-
+chr2	42997	43029	b	b	-
+chr2	42997	43029	b	b	-
+chr2	43236	43268	b	b	-
+chr2	43256	43288	b	b	-
+chr2	43302	43334	a	a	+
+chr2	43303	43335	a	a	+
+chr2	43275	43307	b	b	-
+chr2	43275	43307	b	b	-
+chr2	43275	43307	b	b	-
+chr2	43309	43341	a	a	+
+chr2	43309	43341	a	a	+
+chr2	43287	43319	b	b	-
+chr2	43290	43322	b	b	-
+chr2	43290	43322	b	b	-
+chr2	43294	43326	b	b	-
+chr2	43437	43469	b	b	-
+chr2	43470	43502	a	a	+
+chr2	43475	43507	a	a	+
+chr2	43625	43657	b	b	-
+chr2	43850	43882	b	b	-
+chr2	44243	44275	b	b	-
+chr2	44428	44460	b	b	-
+chr2	44468	44500	a	a	+
+chr2	44480	44512	b	b	-
+chr2	44609	44641	a	a	+
+chr2	44718	44750	b	b	-
+chr2	44816	44848	a	a	+
+chr2	44809	44841	b	b	-
+chr2	44833	44865	b	b	-
+chr2	44949	44981	a	a	+
+chr2	44969	45001	a	a	+
+chr2	44972	45004	a	a	+
+chr2	44944	44976	b	b	-
+chr2	44944	44976	b	b	-
+chr2	44944	44976	b	b	-
+chr2	44945	44977	b	b	-
+chr2	44945	44977	b	b	-
+chr2	44951	44983	b	b	-
+chr2	44985	45017	a	a	+
+chr2	44993	45025	a	a	+
+chr2	44964	44996	b	b	-
+chr2	45000	45032	a	a	+
+chr2	45005	45037	a	a	+
+chr2	44977	45009	b	b	-
+chr2	44977	45009	b	b	-
+chr2	45022	45054	a	a	+
+chr2	45022	45054	a	a	+
+chr2	45027	45059	a	a	+
+chr2	45763	45795	a	a	+
+chr2	45766	45798	a	a	+
+chr2	45795	45827	b	b	-
+chr2	46028	46060	b	b	-
+chr2	46088	46120	b	b	-
+chr2	46576	46608	a	a	+
+chr2	46618	46650	a	a	+
+chr2	46620	46652	a	a	+
+chr2	46588	46620	b	b	-
+chr2	46588	46620	b	b	-
+chr2	46595	46627	b	b	-
+chr2	46595	46627	b	b	-
+chr2	46632	46664	a	a	+
+chr2	46605	46637	b	b	-
+chr2	46607	46639	b	b	-
+chr2	46645	46677	a	a	+
+chr2	46646	46678	a	a	+
+chr2	46684	46716	a	a	+
+chr2	46764	46796	a	a	+
+chr2	46786	46818	a	a	+
+chr2	46755	46787	b	b	-
+chr2	46770	46802	b	b	-
+chr2	46811	46843	a	a	+
+chr2	46811	46843	a	a	+
+chr2	46786	46818	b	b	-
+chr2	46823	46855	a	a	+
+chr2	46825	46857	a	a	+
+chr2	46931	46963	b	b	-
+chr2	46965	46997	a	a	+
+chr2	46989	47021	a	a	+
+chr2	46957	46989	b	b	-
+chr2	47113	47145	a	a	+
+chr2	47121	47153	a	a	+
+chr2	47122	47154	a	a	+
+chr2	47122	47154	a	a	+
+chr2	47090	47122	b	b	-
+chr2	47091	47123	b	b	-
+chr2	47096	47128	b	b	-
+chr2	47097	47129	b	b	-
+chr2	47102	47134	b	b	-
+chr2	47137	47169	a	a	+
+chr2	47106	47138	b	b	-
+chr2	47110	47142	b	b	-
+chr2	47145	47177	a	a	+
+chr2	47145	47177	a	a	+
+chr2	47145	47177	a	a	+
+chr2	47149	47181	a	a	+
+chr2	47149	47181	a	a	+
+chr2	47150	47182	a	a	+
+chr2	47164	47196	a	a	+
+chr2	47164	47196	a	a	+
+chr2	47132	47164	b	b	-
+chr2	47144	47176	b	b	-
+chr2	47344	47376	b	b	-
+chr2	47379	47411	a	a	+
+chr2	47379	47411	a	a	+
+chr2	47396	47428	a	a	+
+chr2	47401	47433	a	a	+
+chr2	47424	47456	a	a	+
+chr2	47486	47518	a	a	+
+chr2	47547	47579	a	a	+
+chr2	47634	47666	a	a	+
+chr2	48259	48291	a	a	+
+chr2	48375	48407	b	b	-
+chr2	48427	48459	a	a	+
+chr2	48466	48498	a	a	+
+chr2	48542	48574	b	b	-
+chr2	48543	48575	b	b	-
+chr2	48545	48577	b	b	-
+chr2	48578	48610	a	a	+
+chr2	48583	48615	a	a	+
+chr2	48585	48617	a	a	+
+chr2	48586	48618	a	a	+
+chr2	48587	48619	a	a	+
+chr2	48587	48619	a	a	+
+chr2	48588	48620	a	a	+
+chr2	48588	48620	a	a	+
+chr2	48568	48600	b	b	-
+chr2	48570	48602	b	b	-
+chr2	48570	48602	b	b	-
+chr2	48570	48602	b	b	-
+chr2	48570	48602	b	b	-
+chr2	48570	48602	b	b	-
+chr2	48570	48602	b	b	-
+chr2	48570	48602	b	b	-
+chr2	48571	48603	b	b	-
+chr2	48609	48641	a	a	+
+chr2	48585	48617	b	b	-
+chr2	48586	48618	b	b	-
+chr2	48599	48631	b	b	-
+chr2	48647	48679	a	a	+
+chr2	48628	48660	b	b	-
+chr2	48743	48775	b	b	-
+chr2	48758	48790	b	b	-
+chr2	48820	48852	a	a	+
+chr2	48794	48826	b	b	-
+chr2	48803	48835	b	b	-
+chr2	48837	48869	a	a	+
+chr2	48837	48869	a	a	+
+chr2	48837	48869	a	a	+
+chr2	48839	48871	a	a	+
+chr2	48839	48871	a	a	+
+chr2	48839	48871	a	a	+
+chr2	48839	48871	a	a	+
+chr2	48839	48871	a	a	+
+chr2	48839	48871	a	a	+
+chr2	48808	48840	b	b	-
+chr2	48809	48841	b	b	-
+chr2	48809	48841	b	b	-
+chr2	48809	48841	b	b	-
+chr2	48809	48841	b	b	-
+chr2	48812	48844	b	b	-
+chr2	48812	48844	b	b	-
+chr2	48812	48844	b	b	-
+chr2	48850	48882	a	a	+
+chr2	48852	48884	a	a	+
+chr2	48820	48852	b	b	-
+chr2	48820	48852	b	b	-
+chr2	48820	48852	b	b	-
+chr2	48820	48852	b	b	-
+chr2	48820	48852	b	b	-
+chr2	48820	48852	b	b	-
+chr2	48856	48888	a	a	+
+chr2	48858	48890	a	a	+
+chr2	48827	48859	b	b	-
+chr2	48860	48892	a	a	+
+chr2	48861	48893	a	a	+
+chr2	48832	48864	b	b	-
+chr2	48887	48919	a	a	+
+chr2	48893	48925	a	a	+
+chr2	48873	48905	b	b	-
+chr2	48995	49027	a	a	+
+chr2	49002	49034	a	a	+
+chr2	48984	49016	b	b	-
+chr2	48997	49029	b	b	-
+chr2	49030	49062	a	a	+
+chr2	48999	49031	b	b	-
+chr2	48999	49031	b	b	-
+chr2	49005	49037	b	b	-
+chr2	49007	49039	b	b	-
+chr2	49092	49124	a	a	+
+chr2	49177	49209	b	b	-
+chr2	49233	49265	a	a	+
+chr2	49340	49372	a	a	+
+chr2	49310	49342	b	b	-
+chr2	49321	49353	b	b	-
+chr2	49356	49388	a	a	+
+chr2	49357	49389	a	a	+
+chr2	49357	49389	a	a	+
+chr2	49360	49392	a	a	+
+chr2	49361	49393	a	a	+
+chr2	49333	49365	b	b	-
+chr2	49333	49365	b	b	-
+chr2	49367	49399	a	a	+
+chr2	49367	49399	a	a	+
+chr2	49370	49402	a	a	+
+chr2	49372	49404	a	a	+
+chr2	49340	49372	b	b	-
+chr2	49373	49405	a	a	+
+chr2	49373	49405	a	a	+
+chr2	49342	49374	b	b	-
+chr2	49343	49375	b	b	-
+chr2	49343	49375	b	b	-
+chr2	49343	49375	b	b	-
+chr2	49344	49376	b	b	-
+chr2	49345	49377	b	b	-
+chr2	49345	49377	b	b	-
+chr2	49345	49377	b	b	-
+chr2	49357	49389	b	b	-
+chr2	49398	49430	a	a	+
+chr2	49557	49589	a	a	+
+chr2	49566	49598	a	a	+
+chr2	49547	49579	b	b	-
+chr2	49547	49579	b	b	-
+chr2	49547	49579	b	b	-
+chr2	49582	49614	a	a	+
+chr2	49583	49615	a	a	+
+chr2	49583	49615	a	a	+
+chr2	49584	49616	a	a	+
+chr2	49584	49616	a	a	+
+chr2	49589	49621	a	a	+
+chr2	49589	49621	a	a	+
+chr2	49589	49621	a	a	+
+chr2	49589	49621	a	a	+
+chr2	49589	49621	a	a	+
+chr2	49589	49621	a	a	+
+chr2	49592	49624	a	a	+
+chr2	49562	49594	b	b	-
+chr2	49563	49595	b	b	-
+chr2	49565	49597	b	b	-
+chr2	49600	49632	a	a	+
+chr2	49572	49604	b	b	-
+chr2	49575	49607	b	b	-
+chr2	49575	49607	b	b	-
+chr2	49575	49607	b	b	-
+chr2	49575	49607	b	b	-
+chr2	49610	49642	a	a	+
+chr2	49610	49642	a	a	+
+chr2	49610	49642	a	a	+
+chr2	49610	49642	a	a	+
+chr2	49578	49610	b	b	-
+chr2	49578	49610	b	b	-
+chr2	49578	49610	b	b	-
+chr2	49612	49644	a	a	+
+chr2	49612	49644	a	a	+
+chr2	49584	49616	b	b	-
+chr2	49619	49651	a	a	+
+chr2	49597	49629	b	b	-
+chr2	49597	49629	b	b	-
+chr2	49600	49632	b	b	-
+chr2	49686	49718	a	a	+
+chr2	49757	49789	a	a	+
+chr2	49732	49764	b	b	-
+chr2	49735	49767	b	b	-
+chr2	49735	49767	b	b	-
+chr2	49778	49810	a	a	+
+chr2	49787	49819	a	a	+
+chr2	49755	49787	b	b	-
+chr2	49922	49954	a	a	+
+chr2	49896	49928	b	b	-
+chr2	49924	49956	b	b	-
+chr2	49965	49997	b	b	-
+chr2	50010	50042	a	a	+
+chr2	50140	50172	b	b	-
+chr2	50140	50172	b	b	-
+chr2	50201	50233	a	a	+
+chr2	50253	50285	a	a	+
+chr2	50252	50284	b	b	-
+chr2	50353	50385	a	a	+
+chr2	50380	50412	a	a	+
+chr2	50425	50457	a	a	+
+chr2	50641	50673	a	a	+
+chr2	50648	50680	a	a	+
+chr2	50629	50661	b	b	-
+chr2	50665	50697	a	a	+
+chr2	50702	50734	a	a	+
+chr2	50679	50711	b	b	-
+chr2	50687	50719	b	b	-
+chr2	50885	50917	b	b	-
+chr2	51498	51530	a	a	+
+chr2	51534	51566	a	a	+
+chr2	51509	51541	b	b	-
+chr2	51516	51548	b	b	-
+chr2	51572	51604	a	a	+
+chr2	51789	51821	b	b	-
+chr2	51789	51821	b	b	-
+chr2	52062	52094	b	b	-
+chr2	52331	52363	a	a	+
+chr2	53355	53387	b	b	-
+chr2	54022	54054	a	a	+
+chr2	55628	55660	a	a	+
+chr2	55754	55786	a	a	+
+chr2	55754	55786	a	a	+
+chr2	55897	55929	a	a	+
+chr2	55939	55971	a	a	+
+chr2	56479	56511	a	a	+
+chr2	56609	56641	a	a	+
+chr2	56609	56641	a	a	+
+chr2	56687	56719	a	a	+
+chr2	56942	56974	a	a	+
+chr2	57371	57403	a	a	+
+chr2	57616	57648	a	a	+
+chr2	57604	57636	b	b	-
+chr2	58160	58192	a	a	+
+chr2	58959	58991	b	b	-
+chr2	59076	59108	a	a	+
+chr2	59174	59206	a	a	+
+chr2	59188	59220	a	a	+
+chr2	59193	59225	a	a	+
+chr2	59193	59225	a	a	+
+chr2	59193	59225	a	a	+
+chr2	59177	59209	b	b	-
+chr2	59223	59255	a	a	+
+chr2	59191	59223	b	b	-
+chr2	59246	59278	b	b	-
+chr2	59285	59317	a	a	+
+chr2	59285	59317	a	a	+
+chr2	59285	59317	a	a	+
+chr2	59285	59317	a	a	+
+chr2	59289	59321	a	a	+
+chr2	59322	59354	a	a	+
+chr2	59299	59331	b	b	-
+chr2	59301	59333	b	b	-
+chr2	59355	59387	a	a	+
+chr2	59324	59356	b	b	-
+chr2	59366	59398	a	a	+
+chr2	59347	59379	b	b	-
+chr2	59348	59380	b	b	-
+chr2	59352	59384	b	b	-
+chr2	59357	59389	b	b	-
+chr2	59357	59389	b	b	-
+chr2	59390	59422	a	a	+
+chr2	59392	59424	a	a	+
+chr2	59375	59407	b	b	-
+chr2	59415	59447	a	a	+
+chr2	59420	59452	b	b	-
+chr2	59504	59536	a	a	+
+chr2	59506	59538	b	b	-
+chr2	59539	59571	a	a	+
+chr2	59523	59555	b	b	-
+chr2	59525	59557	b	b	-
+chr2	59526	59558	b	b	-
+chr2	59561	59593	a	a	+
+chr2	59565	59597	a	a	+
+chr2	59853	59885	a	a	+
+chr2	59847	59879	b	b	-
+chr2	59849	59881	b	b	-
+chr2	59902	59934	a	a	+
+chr2	61220	61252	a	a	+
+chr2	61229	61261	a	a	+
+chr2	61229	61261	a	a	+
+chr2	61201	61233	b	b	-
+chr2	61202	61234	b	b	-
+chr2	61202	61234	b	b	-
+chr2	61383	61415	a	a	+
+chr2	61354	61386	b	b	-
+chr2	61389	61421	a	a	+
+chr2	61378	61410	b	b	-
+chr2	61419	61451	a	a	+
+chr2	61524	61556	a	a	+
+chr2	61511	61543	b	b	-
+chr2	61692	61724	a	a	+
+chr2	61733	61765	a	a	+
+chr2	62000	62032	a	a	+
+chr2	62074	62106	b	b	-
+chr2	62291	62323	a	a	+
+chr2	62260	62292	b	b	-
+chr2	62297	62329	a	a	+
+chr2	62307	62339	a	a	+
+chr2	62313	62345	a	a	+
+chr2	62348	62380	b	b	-
+chr2	62408	62440	b	b	-
+chr2	62449	62481	a	a	+
+chr2	62417	62449	b	b	-
+chr2	62417	62449	b	b	-
+chr2	62451	62483	a	a	+
+chr2	62452	62484	a	a	+
+chr2	62452	62484	a	a	+
+chr2	62455	62487	a	a	+
+chr2	62455	62487	a	a	+
+chr2	62455	62487	a	a	+
+chr2	62455	62487	a	a	+
+chr2	62455	62487	a	a	+
+chr2	62427	62459	b	b	-
+chr2	62427	62459	b	b	-
+chr2	62428	62460	b	b	-
+chr2	62461	62493	a	a	+
+chr2	62461	62493	a	a	+
+chr2	62433	62465	b	b	-
+chr2	62436	62468	b	b	-
+chr2	62436	62468	b	b	-
+chr2	62438	62470	b	b	-
+chr2	62438	62470	b	b	-
+chr2	62438	62470	b	b	-
+chr2	62438	62470	b	b	-
+chr2	62438	62470	b	b	-
+chr2	62442	62474	b	b	-
+chr2	62477	62509	a	a	+
+chr2	62478	62510	a	a	+
+chr2	62478	62510	a	a	+
+chr2	62478	62510	a	a	+
+chr2	62448	62480	b	b	-
+chr2	62448	62480	b	b	-
+chr2	62481	62513	a	a	+
+chr2	62485	62517	a	a	+
+chr2	62453	62485	b	b	-
+chr2	62454	62486	b	b	-
+chr2	62488	62520	a	a	+
+chr2	62457	62489	b	b	-
+chr2	62503	62535	a	a	+
+chr2	62473	62505	b	b	-
+chr2	62584	62616	b	b	-
+chr2	62621	62653	a	a	+
+chr2	62590	62622	b	b	-
+chr2	62626	62658	a	a	+
+chr2	62629	62661	a	a	+
+chr2	62637	62669	a	a	+
+chr2	62637	62669	a	a	+
+chr2	62645	62677	a	a	+
+chr2	62615	62647	b	b	-
+chr2	62615	62647	b	b	-
+chr2	62667	62699	a	a	+
+chr2	62667	62699	a	a	+
+chr2	62678	62710	a	a	+
+chr2	62698	62730	a	a	+
+chr2	62895	62927	a	a	+
+chr2	62925	62957	a	a	+
+chr2	63077	63109	b	b	-
+chr2	63189	63221	a	a	+
+chr2	63191	63223	a	a	+
+chr2	63172	63204	b	b	-
+chr2	63172	63204	b	b	-
+chr2	63440	63472	b	b	-
+chr2	63506	63538	a	a	+
+chr2	63510	63542	b	b	-
+chr2	63651	63683	b	b	-
+chr2	63669	63701	b	b	-
+chr2	63702	63734	a	a	+
+chr2	63703	63735	a	a	+
+chr2	63706	63738	a	a	+
+chr2	63679	63711	b	b	-
+chr2	63685	63717	b	b	-
+chr2	63685	63717	b	b	-
+chr2	63720	63752	a	a	+
+chr2	63720	63752	a	a	+
+chr2	63720	63752	a	a	+
+chr2	63694	63726	b	b	-
+chr2	63728	63760	a	a	+
+chr2	63699	63731	b	b	-
+chr2	63738	63770	a	a	+
+chr2	63739	63771	a	a	+
+chr2	63739	63771	a	a	+
+chr2	63707	63739	b	b	-
+chr2	63741	63773	a	a	+
+chr2	63741	63773	a	a	+
+chr2	63741	63773	a	a	+
+chr2	63713	63745	b	b	-
+chr2	63716	63748	b	b	-
+chr2	63779	63811	a	a	+
+chr2	63821	63853	a	a	+
+chr2	63847	63879	b	b	-
+chr2	63862	63894	b	b	-
+chr2	63862	63894	b	b	-
+chr2	63864	63896	b	b	-
+chr2	63974	64006	a	a	+
+chr2	64067	64099	a	a	+
+chr2	64187	64219	a	a	+
+chr2	64198	64230	b	b	-
+chr2	64248	64280	b	b	-
+chr2	64360	64392	a	a	+
+chr2	64398	64430	a	a	+
+chr2	64970	65002	b	b	-
+chr2	64970	65002	b	b	-
+chr2	65522	65554	b	b	-
+chr2	66714	66746	a	a	+
+chr2	66740	66772	a	a	+
+chr2	66952	66984	a	a	+
+chr2	67195	67227	b	b	-
+chr2	67234	67266	b	b	-
+chr2	67293	67325	b	b	-
+chr2	67584	67616	b	b	-
+chr2	67748	67780	b	b	-
+chr2	68607	68639	a	a	+
+chr2	69045	69077	a	a	+
+chr2	69109	69141	b	b	-
+chr2	69148	69180	a	a	+
+chr2	69116	69148	b	b	-
+chr2	69152	69184	a	a	+
+chr2	69152	69184	a	a	+
+chr2	69139	69171	b	b	-
+chr2	69179	69211	a	a	+
+chr2	69204	69236	a	a	+
+chr2	69267	69299	b	b	-
+chr2	69304	69336	a	a	+
+chr2	69273	69305	b	b	-
+chr2	69306	69338	a	a	+
+chr2	69281	69313	b	b	-
+chr2	69282	69314	b	b	-
+chr2	69320	69352	a	a	+
+chr2	69292	69324	b	b	-
+chr2	69296	69328	b	b	-
+chr2	69301	69333	b	b	-
+chr2	69317	69349	b	b	-
+chr2	69317	69349	b	b	-
+chr2	69317	69349	b	b	-
+chr2	69356	69388	a	a	+
+chr2	69335	69367	b	b	-
+chr2	69460	69492	a	a	+
+chr2	69429	69461	b	b	-
+chr2	69464	69496	a	a	+
+chr2	69434	69466	b	b	-
+chr2	69471	69503	a	a	+
+chr2	69477	69509	a	a	+
+chr2	69477	69509	a	a	+
+chr2	69446	69478	b	b	-
+chr2	69447	69479	b	b	-
+chr2	69447	69479	b	b	-
+chr2	69481	69513	a	a	+
+chr2	69456	69488	b	b	-
+chr2	69456	69488	b	b	-
+chr2	69465	69497	b	b	-
+chr2	69465	69497	b	b	-
+chr2	69501	69533	a	a	+
+chr2	69507	69539	a	a	+
+chr2	69507	69539	a	a	+
+chr2	69507	69539	a	a	+
+chr2	69481	69513	b	b	-
+chr2	69514	69546	a	a	+
+chr2	69484	69516	b	b	-
+chr2	69484	69516	b	b	-
+chr2	69485	69517	b	b	-
+chr2	69524	69556	a	a	+
+chr2	69528	69560	a	a	+
+chr2	69534	69566	a	a	+
+chr2	69738	69770	b	b	-
+chr2	69772	69804	a	a	+
+chr2	69772	69804	a	a	+
+chr2	69772	69804	a	a	+
+chr2	69774	69806	a	a	+
+chr2	69747	69779	b	b	-
+chr2	69793	69825	a	a	+
+chr2	69801	69833	a	a	+
+chr2	70114	70146	a	a	+
+chr2	70475	70507	b	b	-
+chr2	70476	70508	b	b	-
+chr2	70511	70543	a	a	+
+chr2	70683	70715	a	a	+
+chr2	70790	70822	a	a	+
+chr2	70790	70822	a	a	+
+chr2	70765	70797	b	b	-
+chr2	70765	70797	b	b	-
+chr2	70813	70845	a	a	+
+chr2	70781	70813	b	b	-
+chr2	70793	70825	b	b	-
+chr2	70794	70826	b	b	-
+chr2	70935	70967	a	a	+
+chr2	70954	70986	a	a	+
+chr2	70952	70984	b	b	-
+chr2	71060	71092	b	b	-
+chr2	71060	71092	b	b	-
+chr2	71095	71127	a	a	+
+chr2	71095	71127	a	a	+
+chr2	71095	71127	a	a	+
+chr2	71100	71132	a	a	+
+chr2	71109	71141	a	a	+
+chr2	71110	71142	a	a	+
+chr2	71110	71142	a	a	+
+chr2	71110	71142	a	a	+
+chr2	71110	71142	a	a	+
+chr2	71111	71143	a	a	+
+chr2	71112	71144	a	a	+
+chr2	71112	71144	a	a	+
+chr2	71081	71113	b	b	-
+chr2	71081	71113	b	b	-
+chr2	71081	71113	b	b	-
+chr2	71114	71146	a	a	+
+chr2	71115	71147	a	a	+
+chr2	71084	71116	b	b	-
+chr2	71084	71116	b	b	-
+chr2	71084	71116	b	b	-
+chr2	71084	71116	b	b	-
+chr2	71085	71117	b	b	-
+chr2	71118	71150	a	a	+
+chr2	71087	71119	b	b	-
+chr2	71087	71119	b	b	-
+chr2	71088	71120	b	b	-
+chr2	71089	71121	b	b	-
+chr2	71089	71121	b	b	-
+chr2	71089	71121	b	b	-
+chr2	71124	71156	a	a	+
+chr2	71127	71159	a	a	+
+chr2	71095	71127	b	b	-
+chr2	71128	71160	a	a	+
+chr2	71099	71131	b	b	-
+chr2	71102	71134	b	b	-
+chr2	71104	71136	b	b	-
+chr2	71140	71172	a	a	+
+chr2	71113	71145	b	b	-
+chr2	71129	71161	b	b	-
+chr2	71134	71166	b	b	-
+chr2	71168	71200	a	a	+
+chr2	71137	71169	b	b	-
+chr2	71292	71324	a	a	+
+chr2	71314	71346	a	a	+
+chr2	71301	71333	b	b	-
+chr2	71302	71334	b	b	-
+chr2	71302	71334	b	b	-
+chr2	71303	71335	b	b	-
+chr2	71341	71373	a	a	+
+chr2	71341	71373	a	a	+
+chr2	71341	71373	a	a	+
+chr2	71341	71373	a	a	+
+chr2	71341	71373	a	a	+
+chr2	71341	71373	a	a	+
+chr2	71341	71373	a	a	+
+chr2	71341	71373	a	a	+
+chr2	71309	71341	b	b	-
+chr2	71309	71341	b	b	-
+chr2	71309	71341	b	b	-
+chr2	71309	71341	b	b	-
+chr2	71309	71341	b	b	-
+chr2	71343	71375	a	a	+
+chr2	71343	71375	a	a	+
+chr2	71343	71375	a	a	+
+chr2	71346	71378	a	a	+
+chr2	71314	71346	b	b	-
+chr2	71314	71346	b	b	-
+chr2	71314	71346	b	b	-
+chr2	71318	71350	b	b	-
+chr2	71320	71352	b	b	-
+chr2	71353	71385	a	a	+
+chr2	71325	71357	b	b	-
+chr2	71325	71357	b	b	-
+chr2	71360	71392	a	a	+
+chr2	71360	71392	a	a	+
+chr2	71330	71362	b	b	-
+chr2	71330	71362	b	b	-
+chr2	71330	71362	b	b	-
+chr2	71340	71372	b	b	-
+chr2	71340	71372	b	b	-
+chr2	71340	71372	b	b	-
+chr2	71340	71372	b	b	-
+chr2	71376	71408	a	a	+
+chr2	71381	71413	a	a	+
+chr2	71382	71414	a	a	+
+chr2	71398	71430	a	a	+
+chr2	71402	71434	a	a	+
+chr2	71557	71589	b	b	-
+chr2	71603	71635	a	a	+
+chr2	71604	71636	a	a	+
+chr2	71604	71636	a	a	+
+chr2	71574	71606	b	b	-
+chr2	71574	71606	b	b	-
+chr2	71576	71608	b	b	-
+chr2	71623	71655	a	a	+
+chr2	71593	71625	b	b	-
+chr2	71596	71628	b	b	-
+chr2	71596	71628	b	b	-
+chr2	71596	71628	b	b	-
+chr2	71620	71652	b	b	-
+chr2	71731	71763	a	a	+
+chr2	71913	71945	b	b	-
+chr2	71968	72000	a	a	+
+chr2	72721	72753	b	b	-
+chr2	72773	72805	a	a	+
+chr2	72773	72805	a	a	+
+chr2	72955	72987	b	b	-
+chr2	73651	73683	a	a	+
+chr2	73651	73683	a	a	+
+chr2	73639	73671	b	b	-
+chr2	73860	73892	a	a	+
+chr2	73962	73994	a	a	+
+chr2	73999	74031	b	b	-
+chr2	74070	74102	a	a	+
+chr2	74180	74212	a	a	+
+chr2	74182	74214	a	a	+
+chr2	74198	74230	a	a	+
+chr2	74167	74199	b	b	-
+chr2	74220	74252	b	b	-
+chr2	74346	74378	a	a	+
+chr2	74347	74379	a	a	+
+chr2	74320	74352	b	b	-
+chr2	74321	74353	b	b	-
+chr2	74369	74401	a	a	+
+chr2	74369	74401	a	a	+
+chr2	74337	74369	b	b	-
+chr2	74381	74413	b	b	-
+chr2	74417	74449	a	a	+
+chr2	74425	74457	b	b	-
+chr2	74479	74511	a	a	+
+chr2	74453	74485	b	b	-
+chr2	74470	74502	b	b	-
+chr2	74478	74510	b	b	-
+chr2	74481	74513	b	b	-
+chr2	74520	74552	a	a	+
+chr2	74520	74552	a	a	+
+chr2	74499	74531	b	b	-
+chr2	74499	74531	b	b	-
+chr2	74502	74534	b	b	-
+chr2	74504	74536	b	b	-
+chr2	74565	74597	a	a	+
+chr2	74536	74568	b	b	-
+chr2	74536	74568	b	b	-
+chr2	74663	74695	a	a	+
+chr2	74637	74669	b	b	-
+chr2	74670	74702	a	a	+
+chr2	74682	74714	a	a	+
+chr2	74654	74686	b	b	-
+chr2	74687	74719	a	a	+
+chr2	74687	74719	a	a	+
+chr2	74656	74688	b	b	-
+chr2	74656	74688	b	b	-
+chr2	74656	74688	b	b	-
+chr2	74656	74688	b	b	-
+chr2	74689	74721	a	a	+
+chr2	74689	74721	a	a	+
+chr2	74689	74721	a	a	+
+chr2	74689	74721	a	a	+
+chr2	74689	74721	a	a	+
+chr2	74696	74728	a	a	+
+chr2	74698	74730	a	a	+
+chr2	74698	74730	a	a	+
+chr2	74699	74731	a	a	+
+chr2	74699	74731	a	a	+
+chr2	74671	74703	b	b	-
+chr2	74675	74707	b	b	-
+chr2	74675	74707	b	b	-
+chr2	74675	74707	b	b	-
+chr2	74675	74707	b	b	-
+chr2	74675	74707	b	b	-
+chr2	74676	74708	b	b	-
+chr2	74676	74708	b	b	-
+chr2	74676	74708	b	b	-
+chr2	74676	74708	b	b	-
+chr2	74712	74744	a	a	+
+chr2	74719	74751	a	a	+
+chr2	74687	74719	b	b	-
+chr2	74725	74757	a	a	+
+chr2	74730	74762	a	a	+
+chr2	74748	74780	a	a	+
+chr2	74895	74927	b	b	-
+chr2	74913	74945	b	b	-
+chr2	74958	74990	a	a	+
+chr2	74960	74992	a	a	+
+chr2	74931	74963	b	b	-
+chr2	74964	74996	a	a	+
+chr2	74934	74966	b	b	-
+chr2	74967	74999	a	a	+
+chr2	74935	74967	b	b	-
+chr2	74968	75000	a	a	+
+chr2	74968	75000	a	a	+
+chr2	74968	75000	a	a	+
+chr2	74968	75000	a	a	+
+chr2	74970	75002	a	a	+
+chr2	74940	74972	b	b	-
+chr2	74946	74978	b	b	-
+chr2	74946	74978	b	b	-
+chr2	74948	74980	b	b	-
+chr2	74998	75030	a	a	+
+chr2	75215	75247	a	a	+
+chr2	75222	75254	a	a	+
+chr2	75195	75227	b	b	-
+chr2	75229	75261	a	a	+
+chr2	75197	75229	b	b	-
+chr2	75197	75229	b	b	-
+chr2	75197	75229	b	b	-
+chr2	75197	75229	b	b	-
+chr2	75198	75230	b	b	-
+chr2	75231	75263	a	a	+
+chr2	75232	75264	a	a	+
+chr2	75232	75264	a	a	+
+chr2	75232	75264	a	a	+
+chr2	75234	75266	a	a	+
+chr2	75202	75234	b	b	-
+chr2	75203	75235	b	b	-
+chr2	75236	75268	a	a	+
+chr2	75204	75236	b	b	-
+chr2	75237	75269	a	a	+
+chr2	75237	75269	a	a	+
+chr2	75237	75269	a	a	+
+chr2	75237	75269	a	a	+
+chr2	75205	75237	b	b	-
+chr2	75206	75238	b	b	-
+chr2	75239	75271	a	a	+
+chr2	75239	75271	a	a	+
+chr2	75209	75241	b	b	-
+chr2	75209	75241	b	b	-
+chr2	75209	75241	b	b	-
+chr2	75242	75274	a	a	+
+chr2	75211	75243	b	b	-
+chr2	75246	75278	a	a	+
+chr2	75247	75279	a	a	+
+chr2	75256	75288	a	a	+
+chr2	75225	75257	b	b	-
+chr2	75225	75257	b	b	-
+chr2	75226	75258	b	b	-
+chr2	75227	75259	b	b	-
+chr2	75227	75259	b	b	-
+chr2	75363	75395	b	b	-
+chr2	75407	75439	a	a	+
+chr2	75408	75440	a	a	+
+chr2	75411	75443	a	a	+
+chr2	75411	75443	a	a	+
+chr2	75412	75444	a	a	+
+chr2	75415	75447	a	a	+
+chr2	75415	75447	a	a	+
+chr2	75415	75447	a	a	+
+chr2	75385	75417	b	b	-
+chr2	75385	75417	b	b	-
+chr2	75385	75417	b	b	-
+chr2	75421	75453	a	a	+
+chr2	75393	75425	b	b	-
+chr2	75394	75426	b	b	-
+chr2	75418	75450	b	b	-
+chr2	75495	75527	a	a	+
+chr2	75589	75621	a	a	+
+chr2	75589	75621	a	a	+
+chr2	75563	75595	b	b	-
+chr2	75674	75706	a	a	+
+chr2	75666	75698	b	b	-
+chr2	75717	75749	a	a	+
+chr2	75940	75972	a	a	+
+chr2	76448	76480	b	b	-
+chr2	76458	76490	b	b	-
+chr2	76897	76929	a	a	+
+chr2	77228	77260	b	b	-
+chr2	77228	77260	b	b	-
+chr2	77442	77474	a	a	+
+chr2	77432	77464	b	b	-
+chr2	77668	77700	a	a	+
+chr2	77866	77898	a	a	+
+chr2	78795	78827	b	b	-
+chr2	78941	78973	a	a	+
+chr2	79666	79698	a	a	+
+chr2	80127	80159	b	b	-
+chr2	80328	80360	b	b	-
+chr2	80387	80419	b	b	-
+chr2	80522	80554	a	a	+
+chr2	80534	80566	a	a	+
+chr2	80544	80576	a	a	+
+chr2	80519	80551	b	b	-
+chr2	80519	80551	b	b	-
+chr2	80519	80551	b	b	-
+chr2	80557	80589	a	a	+
+chr2	80527	80559	b	b	-
+chr2	80527	80559	b	b	-
+chr2	80560	80592	a	a	+
+chr2	80561	80593	a	a	+
+chr2	80561	80593	a	a	+
+chr2	80561	80593	a	a	+
+chr2	80561	80593	a	a	+
+chr2	80561	80593	a	a	+
+chr2	80566	80598	a	a	+
+chr2	80534	80566	b	b	-
+chr2	80534	80566	b	b	-
+chr2	80542	80574	b	b	-
+chr2	80576	80608	a	a	+
+chr2	80621	80653	b	b	-
+chr2	80633	80665	b	b	-
+chr2	80681	80713	a	a	+
+chr2	80665	80697	b	b	-
+chr2	80665	80697	b	b	-
+chr2	80665	80697	b	b	-
+chr2	80712	80744	a	a	+
+chr2	80712	80744	a	a	+
+chr2	80717	80749	a	a	+
+chr2	80723	80755	a	a	+
+chr2	80723	80755	a	a	+
+chr2	80726	80758	a	a	+
+chr2	80701	80733	b	b	-
+chr2	80703	80735	b	b	-
+chr2	80715	80747	b	b	-
+chr2	81183	81215	a	a	+
+chr2	81297	81329	b	b	-
+chr2	81950	81982	a	a	+
+chr2	81950	81982	a	a	+
+chr2	82733	82765	a	a	+
+chr2	84033	84065	b	b	-
+chr2	84069	84101	a	a	+
+chr2	84075	84107	a	a	+
+chr2	84077	84109	a	a	+
+chr2	84050	84082	b	b	-
+chr2	84051	84083	b	b	-
+chr2	84089	84121	a	a	+
+chr2	84176	84208	b	b	-
+chr2	84214	84246	a	a	+
+chr2	84184	84216	b	b	-
+chr2	84204	84236	b	b	-
+chr2	84213	84245	b	b	-
+chr2	84280	84312	a	a	+
+chr2	84542	84574	a	a	+
+chr2	84519	84551	b	b	-
+chr2	84525	84557	b	b	-
+chr2	84560	84592	a	a	+
+chr2	84528	84560	b	b	-
+chr2	84528	84560	b	b	-
+chr2	84528	84560	b	b	-
+chr2	84528	84560	b	b	-
+chr2	84528	84560	b	b	-
+chr2	84528	84560	b	b	-
+chr2	84528	84560	b	b	-
+chr2	84528	84560	b	b	-
+chr2	84529	84561	b	b	-
+chr2	84530	84562	b	b	-
+chr2	84563	84595	a	a	+
+chr2	84568	84600	a	a	+
+chr2	84568	84600	a	a	+
+chr2	84568	84600	a	a	+
+chr2	84568	84600	a	a	+
+chr2	84536	84568	b	b	-
+chr2	84569	84601	a	a	+
+chr2	84569	84601	a	a	+
+chr2	84570	84602	a	a	+
+chr2	84538	84570	b	b	-
+chr2	84538	84570	b	b	-
+chr2	84538	84570	b	b	-
+chr2	84573	84605	a	a	+
+chr2	84573	84605	a	a	+
+chr2	84574	84606	a	a	+
+chr2	84574	84606	a	a	+
+chr2	84542	84574	b	b	-
+chr2	84542	84574	b	b	-
+chr2	84542	84574	b	b	-
+chr2	84542	84574	b	b	-
+chr2	84543	84575	b	b	-
+chr2	84548	84580	b	b	-
+chr2	84548	84580	b	b	-
+chr2	84548	84580	b	b	-
+chr2	84548	84580	b	b	-
+chr2	84548	84580	b	b	-
+chr2	84584	84616	a	a	+
+chr2	84588	84620	a	a	+
+chr2	84588	84620	a	a	+
+chr2	84588	84620	a	a	+
+chr2	84565	84597	b	b	-
+chr2	84565	84597	b	b	-
+chr2	84598	84630	b	b	-
+chr2	84653	84685	a	a	+
+chr2	84711	84743	a	a	+
+chr2	84694	84726	b	b	-
+chr2	84706	84738	b	b	-
+chr2	84743	84775	a	a	+
+chr2	84743	84775	a	a	+
+chr2	84754	84786	a	a	+
+chr2	84764	84796	a	a	+
+chr2	84888	84920	a	a	+
+chr2	84871	84903	b	b	-
+chr2	84912	84944	a	a	+
+chr2	84889	84921	b	b	-
+chr2	84901	84933	b	b	-
+chr2	85044	85076	b	b	-
+chr2	85044	85076	b	b	-
+chr2	85055	85087	b	b	-
+chr2	85070	85102	b	b	-
+chr2	85256	85288	a	a	+
+chr2	85272	85304	a	a	+
+chr2	85272	85304	a	a	+
+chr2	85251	85283	b	b	-
+chr2	85537	85569	a	a	+
+chr2	85828	85860	a	a	+
+chr2	85831	85863	a	a	+
+chr2	86027	86059	a	a	+
+chr2	86386	86418	a	a	+
+chr2	86956	86988	a	a	+
+chr2	87045	87077	a	a	+
+chr2	87090	87122	a	a	+
+chr2	87225	87257	a	a	+
+chr2	87459	87491	a	a	+
+chr2	87551	87583	b	b	-
+chr2	87590	87622	a	a	+
+chr2	87593	87625	a	a	+
+chr2	87569	87601	b	b	-
+chr2	87592	87624	b	b	-
+chr2	87731	87763	a	a	+
+chr2	87735	87767	a	a	+
+chr2	87736	87768	a	a	+
+chr2	87739	87771	a	a	+
+chr2	87751	87783	a	a	+
+chr2	87765	87797	a	a	+
+chr2	87772	87804	a	a	+
+chr2	87772	87804	a	a	+
+chr2	87772	87804	a	a	+
+chr2	87774	87806	a	a	+
+chr2	87748	87780	b	b	-
+chr2	87752	87784	b	b	-
+chr2	87753	87785	b	b	-
+chr2	87757	87789	b	b	-
+chr2	87758	87790	b	b	-
+chr2	87758	87790	b	b	-
+chr2	87797	87829	a	a	+
+chr2	87772	87804	b	b	-
+chr2	87970	88002	b	b	-
+chr2	88003	88035	b	b	-
+chr2	88081	88113	b	b	-
+chr2	88890	88922	b	b	-
+chr2	89112	89144	a	a	+
+chr2	89122	89154	a	a	+
+chr2	89410	89442	b	b	-
+chr2	89969	90001	a	a	+
+chr2	89971	90003	a	a	+
+chr2	89942	89974	b	b	-
+chr2	89956	89988	b	b	-
+chr2	89989	90021	a	a	+
+chr2	89991	90023	a	a	+
+chr2	89991	90023	a	a	+
+chr2	89965	89997	b	b	-
+chr2	89969	90001	b	b	-
+chr2	90013	90045	a	a	+
+chr2	90013	90045	a	a	+
+chr2	90025	90057	a	a	+
+chr2	90034	90066	a	a	+
+chr2	90093	90125	b	b	-
+chr2	90137	90169	b	b	-
+chr2	90387	90419	a	a	+
+chr2	90407	90439	b	b	-
+chr2	90411	90443	b	b	-
+chr2	90445	90477	a	a	+
+chr2	90415	90447	b	b	-
+chr2	90476	90508	a	a	+
+chr2	90476	90508	a	a	+
+chr2	90453	90485	b	b	-
+chr2	90684	90716	a	a	+
+chr2	90698	90730	a	a	+
+chr2	90706	90738	a	a	+
+chr2	90706	90738	a	a	+
+chr2	90674	90706	b	b	-
+chr2	90687	90719	b	b	-
+chr2	90689	90721	b	b	-
+chr2	90689	90721	b	b	-
+chr2	90689	90721	b	b	-
+chr2	90723	90755	a	a	+
+chr2	90723	90755	a	a	+
+chr2	90727	90759	a	a	+
+chr2	90709	90741	b	b	-
+chr2	90710	90742	b	b	-
+chr2	90710	90742	b	b	-
+chr2	90744	90776	a	a	+
+chr2	90762	90794	a	a	+
+chr2	90800	90832	b	b	-
+chr2	90800	90832	b	b	-
+chr2	90853	90885	a	a	+
+chr2	90853	90885	a	a	+
+chr2	90829	90861	b	b	-
+chr2	90868	90900	a	a	+
+chr2	90870	90902	a	a	+
+chr2	90888	90920	a	a	+
+chr2	91023	91055	a	a	+
+chr2	91163	91195	b	b	-
+chr2	91367	91399	a	a	+
+chr2	91401	91433	a	a	+
+chr2	91401	91433	a	a	+
+chr2	91471	91503	b	b	-
+chr2	91471	91503	b	b	-
+chr2	91471	91503	b	b	-
+chr2	91497	91529	b	b	-
+chr2	91497	91529	b	b	-
+chr2	91620	91652	b	b	-
+chr2	91809	91841	b	b	-
+chr2	91962	91994	b	b	-
+chr2	91971	92003	b	b	-
+chr2	91971	92003	b	b	-
+chr2	92014	92046	a	a	+
+chr2	92102	92134	b	b	-
+chr2	92144	92176	a	a	+
+chr2	92113	92145	b	b	-
+chr2	92114	92146	b	b	-
+chr2	92147	92179	a	a	+
+chr2	92117	92149	b	b	-
+chr2	92117	92149	b	b	-
+chr2	92150	92182	a	a	+
+chr2	92119	92151	b	b	-
+chr2	92122	92154	b	b	-
+chr2	92122	92154	b	b	-
+chr2	92122	92154	b	b	-
+chr2	92123	92155	b	b	-
+chr2	92125	92157	b	b	-
+chr2	92158	92190	a	a	+
+chr2	92158	92190	a	a	+
+chr2	92159	92191	a	a	+
+chr2	92160	92192	a	a	+
+chr2	92160	92192	a	a	+
+chr2	92161	92193	a	a	+
+chr2	92161	92193	a	a	+
+chr2	92134	92166	b	b	-
+chr2	92134	92166	b	b	-
+chr2	92135	92167	b	b	-
+chr2	92171	92203	a	a	+
+chr2	92139	92171	b	b	-
+chr2	92139	92171	b	b	-
+chr2	92139	92171	b	b	-
+chr2	92147	92179	b	b	-
+chr2	92158	92190	b	b	-
+chr2	92237	92269	b	b	-
+chr2	92320	92352	a	a	+
+chr2	92320	92352	a	a	+
+chr2	92401	92433	a	a	+
+chr2	92402	92434	a	a	+
+chr2	92402	92434	a	a	+
+chr2	92371	92403	b	b	-
+chr2	92407	92439	a	a	+
+chr2	92375	92407	b	b	-
+chr2	92408	92440	a	a	+
+chr2	92408	92440	a	a	+
+chr2	92414	92446	a	a	+
+chr2	92417	92449	a	a	+
+chr2	92417	92449	a	a	+
+chr2	92386	92418	b	b	-
+chr2	92421	92453	a	a	+
+chr2	92389	92421	b	b	-
+chr2	92389	92421	b	b	-
+chr2	92389	92421	b	b	-
+chr2	92397	92429	b	b	-
+chr2	92397	92429	b	b	-
+chr2	92398	92430	b	b	-
+chr2	92436	92468	a	a	+
+chr2	92408	92440	b	b	-
+chr2	92474	92506	a	a	+
+chr2	92521	92553	b	b	-
+chr2	92536	92568	b	b	-
+chr2	92572	92604	a	a	+
+chr2	92572	92604	a	a	+
+chr2	92541	92573	b	b	-
+chr2	92548	92580	b	b	-
+chr2	92583	92615	a	a	+
+chr2	92587	92619	a	a	+
+chr2	92757	92789	a	a	+
+chr2	92940	92972	b	b	-
+chr2	92971	93003	b	b	-
+chr2	93153	93185	a	a	+
+chr2	93162	93194	a	a	+
+chr2	93196	93228	a	a	+
+chr2	93198	93230	a	a	+
+chr2	93331	93363	b	b	-
+chr2	93334	93366	b	b	-
+chr2	93369	93401	a	a	+
+chr2	93948	93980	b	b	-
+chr2	94398	94430	b	b	-
+chr2	94442	94474	a	a	+
+chr2	94442	94474	a	a	+
+chr2	95275	95307	b	b	-
+chr2	95311	95343	b	b	-
+chr2	95414	95446	b	b	-
+chr2	95414	95446	b	b	-
+chr2	95736	95768	b	b	-
+chr2	95900	95932	b	b	-
+chr2	95902	95934	b	b	-
+chr2	95935	95967	a	a	+
+chr2	95935	95967	a	a	+
+chr2	95904	95936	b	b	-
+chr2	96054	96086	b	b	-
+chr2	96054	96086	b	b	-
+chr2	96054	96086	b	b	-
+chr2	96054	96086	b	b	-
+chr2	96060	96092	b	b	-
+chr2	96100	96132	a	a	+
+chr2	96101	96133	a	a	+
+chr2	96104	96136	a	a	+
+chr2	96082	96114	b	b	-
+chr2	96358	96390	a	a	+
+chr2	96358	96390	a	a	+
+chr2	96496	96528	b	b	-
+chr2	96696	96728	b	b	-
+chr2	96754	96786	a	a	+
+chr2	97174	97206	b	b	-
+chr2	97544	97576	a	a	+
+chr2	97544	97576	a	a	+
+chr2	98145	98177	b	b	-
+chr2	98409	98441	a	a	+
+chr2	98949	98981	b	b	-
+chr2	99148	99180	b	b	-
+chr2	99148	99180	b	b	-
+chr2	99363	99395	a	a	+
+chr2	99378	99410	b	b	-
+chr2	99590	99622	b	b	-
+chr2	99659	99691	a	a	+
+chr2	99742	99774	b	b	-
+chr2	99777	99809	a	a	+
+chr2	99937	99969	a	a	+
+chr2	99924	99956	b	b	-
+chr2	99930	99962	b	b	-
+chr2	99933	99965	b	b	-
+chr2	99969	100001	a	a	+
+chr2	99979	100011	a	a	+
+chr2	99995	100027	a	a	+
+chr2	100006	100038	a	a	+
+chr2	100040	100072	b	b	-
+chr2	100085	100117	a	a	+
+chr2	100060	100092	b	b	-
+chr2	100060	100092	b	b	-
+chr2	100061	100093	b	b	-
+chr2	100066	100098	b	b	-
+chr2	100099	100131	a	a	+
+chr2	100068	100100	b	b	-
+chr2	100102	100134	a	a	+
+chr2	100106	100138	a	a	+
+chr2	100113	100145	a	a	+
+chr2	100114	100146	a	a	+
+chr2	100114	100146	a	a	+
+chr2	100114	100146	a	a	+
+chr2	100086	100118	b	b	-
+chr2	100086	100118	b	b	-
+chr2	100086	100118	b	b	-
+chr2	100119	100151	a	a	+
+chr2	100088	100120	b	b	-
+chr2	100088	100120	b	b	-
+chr2	100088	100120	b	b	-
+chr2	100088	100120	b	b	-
+chr2	100122	100154	a	a	+
+chr2	100090	100122	b	b	-
+chr2	100099	100131	b	b	-
+chr2	100156	100188	a	a	+
+chr2	100358	100390	b	b	-
+chr2	100394	100426	a	a	+
+chr2	100384	100416	b	b	-
+chr2	100384	100416	b	b	-
+chr2	100413	100445	b	b	-
+chr2	100526	100558	b	b	-
+chr2	100550	100582	b	b	-
+chr2	100550	100582	b	b	-
+chr2	100662	100694	b	b	-
+chr2	100749	100781	b	b	-
+chr2	100795	100827	b	b	-
+chr2	100837	100869	a	a	+
+chr2	100837	100869	a	a	+
+chr2	100841	100873	a	a	+
+chr2	100841	100873	a	a	+
+chr2	100853	100885	a	a	+
+chr2	100826	100858	b	b	-
+chr2	100856	100888	b	b	-
+chr2	100991	101023	a	a	+
+chr2	100994	101026	a	a	+
+chr2	100974	101006	b	b	-
+chr2	100977	101009	b	b	-
+chr2	100979	101011	b	b	-
+chr2	100986	101018	b	b	-
+chr2	100986	101018	b	b	-
+chr2	100998	101030	b	b	-
+chr2	101100	101132	b	b	-
+chr2	101106	101138	b	b	-
+chr2	101112	101144	b	b	-
+chr2	101112	101144	b	b	-
+chr2	101112	101144	b	b	-
+chr2	101113	101145	b	b	-
+chr2	101116	101148	b	b	-
+chr2	101150	101182	a	a	+
+chr2	101150	101182	a	a	+
+chr2	101150	101182	a	a	+
+chr2	101155	101187	a	a	+
+chr2	101125	101157	b	b	-
+chr2	101127	101159	b	b	-
+chr2	101161	101193	a	a	+
+chr2	101161	101193	a	a	+
+chr2	101161	101193	a	a	+
+chr2	101164	101196	a	a	+
+chr2	101165	101197	a	a	+
+chr2	101133	101165	b	b	-
+chr2	101167	101199	a	a	+
+chr2	101167	101199	a	a	+
+chr2	101137	101169	b	b	-
+chr2	101137	101169	b	b	-
+chr2	101138	101170	b	b	-
+chr2	101178	101210	a	a	+
+chr2	101178	101210	a	a	+
+chr2	101147	101179	b	b	-
+chr2	101156	101188	b	b	-
+chr2	101156	101188	b	b	-
+chr2	101156	101188	b	b	-
+chr2	101194	101226	a	a	+
+chr2	101169	101201	b	b	-
+chr2	101169	101201	b	b	-
+chr2	101484	101516	b	b	-
+chr2	101628	101660	a	a	+
+chr2	101630	101662	a	a	+
+chr2	101631	101663	b	b	-
+chr2	101638	101670	b	b	-
+chr2	101690	101722	a	a	+
+chr2	101824	101856	a	a	+
+chr2	101865	101897	b	b	-
+chr2	101869	101901	b	b	-
+chr2	101871	101903	b	b	-
+chr2	101871	101903	b	b	-
+chr2	101871	101903	b	b	-
+chr2	101872	101904	b	b	-
+chr2	101907	101939	a	a	+
+chr2	101907	101939	a	a	+
+chr2	101875	101907	b	b	-
+chr2	101875	101907	b	b	-
+chr2	101875	101907	b	b	-
+chr2	101875	101907	b	b	-
+chr2	101908	101940	a	a	+
+chr2	101908	101940	a	a	+
+chr2	101910	101942	a	a	+
+chr2	101910	101942	a	a	+
+chr2	101911	101943	a	a	+
+chr2	101911	101943	a	a	+
+chr2	101911	101943	a	a	+
+chr2	101912	101944	a	a	+
+chr2	101912	101944	a	a	+
+chr2	101914	101946	a	a	+
+chr2	101882	101914	b	b	-
+chr2	101916	101948	a	a	+
+chr2	101916	101948	a	a	+
+chr2	101919	101951	a	a	+
+chr2	101919	101951	a	a	+
+chr2	101919	101951	a	a	+
+chr2	101919	101951	a	a	+
+chr2	101920	101952	a	a	+
+chr2	101920	101952	a	a	+
+chr2	101888	101920	b	b	-
+chr2	101888	101920	b	b	-
+chr2	101888	101920	b	b	-
+chr2	101890	101922	b	b	-
+chr2	101890	101922	b	b	-
+chr2	101892	101924	b	b	-
+chr2	101892	101924	b	b	-
+chr2	101892	101924	b	b	-
+chr2	101892	101924	b	b	-
+chr2	101892	101924	b	b	-
+chr2	101892	101924	b	b	-
+chr2	101892	101924	b	b	-
+chr2	101906	101938	b	b	-
+chr2	101939	101971	a	a	+
+chr2	101939	101971	a	a	+
+chr2	101940	101972	a	a	+
+chr2	101940	101972	a	a	+
+chr2	101908	101940	b	b	-
+chr2	101908	101940	b	b	-
+chr2	101909	101941	b	b	-
+chr2	101909	101941	b	b	-
+chr2	101945	101977	a	a	+
+chr2	101949	101981	a	a	+
+chr2	101955	101987	a	a	+
+chr2	101958	101990	a	a	+
+chr2	101941	101973	b	b	-
+chr2	102056	102088	a	a	+
+chr2	102071	102103	a	a	+
+chr2	102071	102103	a	a	+
+chr2	102091	102123	a	a	+
+chr2	102092	102124	a	a	+
+chr2	102060	102092	b	b	-
+chr2	102109	102141	a	a	+
+chr2	102127	102159	a	a	+
+chr2	102246	102278	a	a	+
+chr2	102214	102246	b	b	-
+chr2	102264	102296	a	a	+
+chr2	102513	102545	a	a	+
+chr2	102548	102580	a	a	+
+chr2	102568	102600	a	a	+
+chr2	102582	102614	a	a	+
+chr2	102582	102614	a	a	+
+chr2	102638	102670	b	b	-
+chr2	102714	102746	b	b	-
+chr2	102767	102799	a	a	+
+chr2	102767	102799	a	a	+
+chr2	102868	102900	a	a	+
+chr2	102928	102960	a	a	+
+chr2	103269	103301	a	a	+
+chr2	103269	103301	b	b	-
+chr2	103269	103301	b	b	-
+chr2	103965	103997	a	a	+
+chr2	104011	104043	a	a	+
+chr2	104121	104153	a	a	+
+chr2	104724	104756	b	b	-
+chr2	105835	105867	a	a	+
+chr2	106778	106810	a	a	+
+chr2	106830	106862	a	a	+
+chr2	106934	106966	a	a	+
+chr2	107231	107263	b	b	-
+chr2	107276	107308	a	a	+
+chr2	107260	107292	b	b	-
+chr2	107299	107331	a	a	+
+chr2	107299	107331	a	a	+
+chr2	107366	107398	a	a	+
+chr2	107404	107436	b	b	-
+chr2	107407	107439	b	b	-
+chr2	107407	107439	b	b	-
+chr2	107407	107439	b	b	-
+chr2	107444	107476	a	a	+
+chr2	107444	107476	a	a	+
+chr2	107418	107450	b	b	-
+chr2	107454	107486	a	a	+
+chr2	107455	107487	a	a	+
+chr2	107456	107488	a	a	+
+chr2	107424	107456	b	b	-
+chr2	107458	107490	a	a	+
+chr2	107426	107458	b	b	-
+chr2	107437	107469	b	b	-
+chr2	107444	107476	b	b	-
+chr2	107457	107489	b	b	-
+chr2	107665	107697	b	b	-
+chr2	107700	107732	a	a	+
+chr2	107700	107732	a	a	+
+chr2	107713	107745	a	a	+
+chr2	107717	107749	a	a	+
+chr2	107687	107719	b	b	-
+chr2	107724	107756	a	a	+
+chr2	107727	107759	a	a	+
+chr2	107695	107727	b	b	-
+chr2	107695	107727	b	b	-
+chr2	107758	107790	a	a	+
+chr2	107743	107775	b	b	-
+chr2	107905	107937	a	a	+
+chr2	107923	107955	a	a	+
+chr2	107898	107930	b	b	-
+chr2	107898	107930	b	b	-
+chr2	107935	107967	a	a	+
+chr2	107942	107974	a	a	+
+chr2	107942	107974	a	a	+
+chr2	107945	107977	a	a	+
+chr2	107945	107977	a	a	+
+chr2	107945	107977	a	a	+
+chr2	107923	107955	b	b	-
+chr2	107930	107962	b	b	-
+chr2	107940	107972	b	b	-
+chr2	108021	108053	b	b	-
+chr2	108074	108106	b	b	-
+chr2	108107	108139	a	a	+
+chr2	108085	108117	b	b	-
+chr2	108229	108261	b	b	-
+chr2	108265	108297	a	a	+
+chr2	108265	108297	a	a	+
+chr2	108235	108267	b	b	-
+chr2	108419	108451	a	a	+
+chr2	108406	108438	b	b	-
+chr2	108406	108438	b	b	-
+chr2	108406	108438	b	b	-
+chr2	108909	108941	b	b	-
+chr2	109062	109094	b	b	-
+chr2	109286	109318	b	b	-
+chr2	109487	109519	b	b	-
+chr2	109545	109577	b	b	-
+chr2	109608	109640	a	a	+
+chr2	110120	110152	a	a	+
+chr2	110109	110141	b	b	-
+chr2	110127	110159	b	b	-
+chr2	110140	110172	b	b	-
+chr2	110184	110216	b	b	-
+chr2	110184	110216	b	b	-
+chr2	110266	110298	b	b	-
+chr2	110305	110337	b	b	-
+chr2	110341	110373	a	a	+
+chr2	110455	110487	b	b	-
+chr2	110502	110534	a	a	+
+chr2	110502	110534	a	a	+
+chr2	110502	110534	a	a	+
+chr2	110472	110504	b	b	-
+chr2	110480	110512	b	b	-
+chr2	110481	110513	b	b	-
+chr2	110481	110513	b	b	-
+chr2	110482	110514	b	b	-
+chr2	110517	110549	a	a	+
+chr2	110488	110520	b	b	-
+chr2	110525	110557	a	a	+
+chr2	110526	110558	a	a	+
+chr2	110495	110527	b	b	-
+chr2	110533	110565	a	a	+
+chr2	110533	110565	a	a	+
+chr2	110689	110721	b	b	-
+chr2	110703	110735	b	b	-
+chr2	110707	110739	b	b	-
+chr2	110745	110777	a	a	+
+chr2	110745	110777	a	a	+
+chr2	110745	110777	a	a	+
+chr2	110715	110747	b	b	-
+chr2	110721	110753	b	b	-
+chr2	110769	110801	a	a	+
+chr2	111011	111043	b	b	-
+chr2	111106	111138	b	b	-
+chr2	111106	111138	b	b	-
+chr2	111106	111138	b	b	-
+chr2	111161	111193	a	a	+
+chr2	111129	111161	b	b	-
+chr2	111131	111163	b	b	-
+chr2	111164	111196	a	a	+
+chr2	111137	111169	b	b	-
+chr2	111156	111188	b	b	-
+chr2	111196	111228	a	a	+
+chr2	111165	111197	b	b	-
+chr2	111436	111468	a	a	+
+chr2	111436	111468	a	a	+
+chr2	111439	111471	a	a	+
+chr2	111439	111471	a	a	+
+chr2	111439	111471	a	a	+
+chr2	111407	111439	b	b	-
+chr2	111407	111439	b	b	-
+chr2	111441	111473	a	a	+
+chr2	111442	111474	a	a	+
+chr2	111442	111474	a	a	+
+chr2	111443	111475	a	a	+
+chr2	111443	111475	a	a	+
+chr2	111443	111475	a	a	+
+chr2	111415	111447	b	b	-
+chr2	111448	111480	a	a	+
+chr2	111449	111481	a	a	+
+chr2	111449	111481	a	a	+
+chr2	111417	111449	b	b	-
+chr2	111419	111451	b	b	-
+chr2	111419	111451	b	b	-
+chr2	111419	111451	b	b	-
+chr2	111456	111488	a	a	+
+chr2	111457	111489	a	a	+
+chr2	111426	111458	b	b	-
+chr2	111459	111491	a	a	+
+chr2	111428	111460	b	b	-
+chr2	111428	111460	b	b	-
+chr2	111428	111460	b	b	-
+chr2	111428	111460	b	b	-
+chr2	111428	111460	b	b	-
+chr2	111428	111460	b	b	-
+chr2	111461	111493	a	a	+
+chr2	111429	111461	b	b	-
+chr2	111429	111461	b	b	-
+chr2	111429	111461	b	b	-
+chr2	111430	111462	b	b	-
+chr2	111431	111463	b	b	-
+chr2	111432	111464	b	b	-
+chr2	111468	111500	a	a	+
+chr2	111437	111469	b	b	-
+chr2	111470	111502	a	a	+
+chr2	111470	111502	a	a	+
+chr2	111470	111502	a	a	+
+chr2	111470	111502	a	a	+
+chr2	111470	111502	a	a	+
+chr2	111472	111504	a	a	+
+chr2	111472	111504	a	a	+
+chr2	111443	111475	b	b	-
+chr2	111476	111508	a	a	+
+chr2	111444	111476	b	b	-
+chr2	111591	111623	b	b	-
+chr2	111592	111624	b	b	-
+chr2	111592	111624	b	b	-
+chr2	111592	111624	b	b	-
+chr2	111625	111657	a	a	+
+chr2	111600	111632	b	b	-
+chr2	111634	111666	a	a	+
+chr2	111634	111666	a	a	+
+chr2	111615	111647	b	b	-
+chr2	112085	112117	b	b	-
+chr2	112265	112297	b	b	-
+chr2	112265	112297	b	b	-
+chr2	112329	112361	a	a	+
+chr2	112329	112361	a	a	+
+chr2	112329	112361	a	a	+
+chr2	113020	113052	b	b	-
+chr2	113022	113054	b	b	-
+chr2	113090	113122	a	a	+
+chr2	113163	113195	a	a	+
+chr2	113216	113248	a	a	+
+chr2	113222	113254	a	a	+
+chr2	113229	113261	a	a	+
+chr2	113253	113285	a	a	+
+chr2	113253	113285	a	a	+
+chr2	113222	113254	b	b	-
+chr2	113289	113321	b	b	-
+chr2	113357	113389	b	b	-
+chr2	113357	113389	b	b	-
+chr2	113392	113424	a	a	+
+chr2	113392	113424	a	a	+
+chr2	113360	113392	b	b	-
+chr2	113395	113427	a	a	+
+chr2	113395	113427	a	a	+
+chr2	113363	113395	b	b	-
+chr2	113364	113396	b	b	-
+chr2	113397	113429	a	a	+
+chr2	113398	113430	a	a	+
+chr2	113401	113433	a	a	+
+chr2	113401	113433	a	a	+
+chr2	113401	113433	a	a	+
+chr2	113406	113438	a	a	+
+chr2	113374	113406	b	b	-
+chr2	113375	113407	b	b	-
+chr2	113409	113441	a	a	+
+chr2	113379	113411	b	b	-
+chr2	113413	113445	a	a	+
+chr2	113388	113420	b	b	-
+chr2	113389	113421	b	b	-
+chr2	113389	113421	b	b	-
+chr2	113395	113427	b	b	-
+chr2	113429	113461	a	a	+
+chr2	113429	113461	a	a	+
+chr2	113408	113440	b	b	-
+chr2	113607	113639	b	b	-
+chr2	113669	113701	a	a	+
+chr2	113678	113710	a	a	+
+chr2	113649	113681	b	b	-
+chr2	113684	113716	a	a	+
+chr2	113685	113717	a	a	+
+chr2	113653	113685	b	b	-
+chr2	113657	113689	b	b	-
+chr2	113692	113724	a	a	+
+chr2	113692	113724	a	a	+
+chr2	113692	113724	a	a	+
+chr2	113660	113692	b	b	-
+chr2	113660	113692	b	b	-
+chr2	113693	113725	a	a	+
+chr2	113693	113725	a	a	+
+chr2	113694	113726	a	a	+
+chr2	113694	113726	a	a	+
+chr2	113694	113726	a	a	+
+chr2	113694	113726	a	a	+
+chr2	113694	113726	a	a	+
+chr2	113694	113726	a	a	+
+chr2	113697	113729	a	a	+
+chr2	113667	113699	b	b	-
+chr2	113667	113699	b	b	-
+chr2	113671	113703	b	b	-
+chr2	113678	113710	b	b	-
+chr2	113678	113710	b	b	-
+chr2	113679	113711	b	b	-
+chr2	113679	113711	b	b	-
+chr2	113750	113782	a	a	+
+chr2	113796	113828	b	b	-
+chr2	113805	113837	b	b	-
+chr2	113851	113883	a	a	+
+chr2	113858	113890	a	a	+
+chr2	113858	113890	a	a	+
+chr2	113858	113890	a	a	+
+chr2	113827	113859	b	b	-
+chr2	113827	113859	b	b	-
+chr2	113827	113859	b	b	-
+chr2	113828	113860	b	b	-
+chr2	113831	113863	b	b	-
+chr2	113866	113898	a	a	+
+chr2	113836	113868	b	b	-
+chr2	113836	113868	b	b	-
+chr2	113836	113868	b	b	-
+chr2	113836	113868	b	b	-
+chr2	113836	113868	b	b	-
+chr2	113837	113869	b	b	-
+chr2	113838	113870	b	b	-
+chr2	113873	113905	a	a	+
+chr2	113850	113882	b	b	-
+chr2	113850	113882	b	b	-
+chr2	113885	113917	a	a	+
+chr2	113979	114011	b	b	-
+chr2	114023	114055	a	a	+
+chr2	114529	114561	a	a	+
+chr2	115046	115078	b	b	-
+chr2	115178	115210	a	a	+
+chr2	115192	115224	a	a	+
+chr2	115549	115581	b	b	-
+chr2	115827	115859	b	b	-
+chr2	115827	115859	b	b	-
+chr2	115827	115859	b	b	-
+chr2	115838	115870	b	b	-
+chr2	115841	115873	b	b	-
+chr2	116180	116212	a	a	+
+chr2	116314	116346	a	a	+
+chr2	116338	116370	a	a	+
+chr2	116472	116504	a	a	+
+chr2	116516	116548	a	a	+
+chr2	116649	116681	a	a	+
+chr2	116667	116699	a	a	+
+chr2	116639	116671	b	b	-
+chr2	116773	116805	b	b	-
+chr2	116787	116819	b	b	-
+chr2	116796	116828	b	b	-
+chr2	116796	116828	b	b	-
+chr2	116797	116829	b	b	-
+chr2	116836	116868	a	a	+
+chr2	116805	116837	b	b	-
+chr2	116840	116872	a	a	+
+chr2	116808	116840	b	b	-
+chr2	116810	116842	b	b	-
+chr2	116844	116876	a	a	+
+chr2	116816	116848	b	b	-
+chr2	116818	116850	b	b	-
+chr2	116826	116858	b	b	-
+chr2	116832	116864	b	b	-
+chr2	116832	116864	b	b	-
+chr2	116867	116899	a	a	+
+chr2	116864	116896	b	b	-
+chr2	117135	117167	a	a	+
+chr2	117122	117154	b	b	-
+chr2	117122	117154	b	b	-
+chr2	117133	117165	b	b	-
+chr2	117143	117175	b	b	-
+chr2	117143	117175	b	b	-
+chr2	117185	117217	a	a	+
+chr2	117222	117254	a	a	+
+chr2	117401	117433	b	b	-
+chr2	117426	117458	b	b	-
+chr2	117426	117458	b	b	-
+chr2	117426	117458	b	b	-
+chr2	117427	117459	b	b	-
+chr2	117432	117464	b	b	-
+chr2	117454	117486	b	b	-
+chr2	117468	117500	b	b	-
+chr2	117468	117500	b	b	-
+chr2	117469	117501	b	b	-
+chr2	117469	117501	b	b	-
+chr2	117607	117639	a	a	+
+chr2	117582	117614	b	b	-
+chr2	117624	117656	a	a	+
+chr2	117604	117636	b	b	-
+chr2	117606	117638	b	b	-
+chr2	117618	117650	b	b	-
+chr2	117656	117688	a	a	+
+chr2	117788	117820	a	a	+
+chr2	117798	117830	a	a	+
+chr2	117785	117817	b	b	-
+chr2	117789	117821	b	b	-
+chr2	117990	118022	b	b	-
+chr2	118453	118485	a	a	+
+chr2	118594	118626	b	b	-
+chr2	119005	119037	b	b	-
+chr2	119494	119526	b	b	-
+chr2	119494	119526	b	b	-
+chr2	119523	119555	b	b	-
+chr2	119864	119896	a	a	+
+chr2	120116	120148	b	b	-
+chr2	121208	121240	a	a	+
+chr2	121371	121403	b	b	-
+chr2	121725	121757	a	a	+
+chr2	121878	121910	b	b	-
+chr2	121878	121910	b	b	-
+chr2	121914	121946	a	a	+
+chr2	121945	121977	a	a	+
+chr2	122063	122095	a	a	+
+chr2	122064	122096	a	a	+
+chr2	122064	122096	a	a	+
+chr2	122038	122070	b	b	-
+chr2	122071	122103	a	a	+
+chr2	122072	122104	a	a	+
+chr2	122042	122074	b	b	-
+chr2	122042	122074	b	b	-
+chr2	122042	122074	b	b	-
+chr2	122049	122081	b	b	-
+chr2	122052	122084	b	b	-
+chr2	122052	122084	b	b	-
+chr2	122058	122090	b	b	-
+chr2	122058	122090	b	b	-
+chr2	122059	122091	b	b	-
+chr2	122093	122125	a	a	+
+chr2	122093	122125	a	a	+
+chr2	122064	122096	b	b	-
+chr2	122064	122096	b	b	-
+chr2	122100	122132	a	a	+
+chr2	122068	122100	b	b	-
+chr2	122105	122137	a	a	+
+chr2	122110	122142	a	a	+
+chr2	122091	122123	b	b	-
+chr2	122129	122161	a	a	+
+chr2	122133	122165	a	a	+
+chr2	122134	122166	a	a	+
+chr2	122134	122166	a	a	+
+chr2	123048	123080	b	b	-
+chr2	123327	123359	a	a	+
+chr2	123620	123652	b	b	-
+chr2	123787	123819	b	b	-
+chr2	124004	124036	b	b	-
+chr2	124243	124275	b	b	-
+chr2	124300	124332	a	a	+
+chr2	124390	124422	b	b	-
+chr2	124397	124429	b	b	-
+chr2	124397	124429	b	b	-
+chr2	124564	124596	b	b	-
+chr2	124577	124609	b	b	-
+chr2	124613	124645	a	a	+
+chr2	124588	124620	b	b	-
+chr2	124637	124669	a	a	+
+chr2	124669	124701	b	b	-
+chr2	124707	124739	b	b	-
+chr2	124707	124739	b	b	-
+chr2	124758	124790	a	a	+
+chr2	124735	124767	b	b	-
+chr2	124774	124806	a	a	+
+chr2	124742	124774	b	b	-
+chr2	124743	124775	b	b	-
+chr2	124743	124775	b	b	-
+chr2	124743	124775	b	b	-
+chr2	124743	124775	b	b	-
+chr2	124744	124776	b	b	-
+chr2	124744	124776	b	b	-
+chr2	124778	124810	a	a	+
+chr2	124778	124810	a	a	+
+chr2	124778	124810	a	a	+
+chr2	124778	124810	a	a	+
+chr2	124778	124810	a	a	+
+chr2	124778	124810	a	a	+
+chr2	124779	124811	a	a	+
+chr2	124779	124811	a	a	+
+chr2	124779	124811	a	a	+
+chr2	124780	124812	a	a	+
+chr2	124780	124812	a	a	+
+chr2	124780	124812	a	a	+
+chr2	124783	124815	a	a	+
+chr2	124783	124815	a	a	+
+chr2	124784	124816	a	a	+
+chr2	124785	124817	a	a	+
+chr2	124753	124785	b	b	-
+chr2	124754	124786	b	b	-
+chr2	124787	124819	a	a	+
+chr2	124756	124788	b	b	-
+chr2	124756	124788	b	b	-
+chr2	124756	124788	b	b	-
+chr2	124756	124788	b	b	-
+chr2	124757	124789	b	b	-
+chr2	124757	124789	b	b	-
+chr2	124757	124789	b	b	-
+chr2	124757	124789	b	b	-
+chr2	124757	124789	b	b	-
+chr2	124757	124789	b	b	-
+chr2	124757	124789	b	b	-
+chr2	124792	124824	a	a	+
+chr2	124792	124824	a	a	+
+chr2	124793	124825	a	a	+
+chr2	124795	124827	a	a	+
+chr2	124796	124828	a	a	+
+chr2	124766	124798	b	b	-
+chr2	124768	124800	b	b	-
+chr2	124768	124800	b	b	-
+chr2	124809	124841	a	a	+
+chr2	124788	124820	b	b	-
+chr2	125019	125051	b	b	-
+chr2	125028	125060	b	b	-
+chr2	125028	125060	b	b	-
+chr2	125037	125069	b	b	-
+chr2	125041	125073	b	b	-
+chr2	125041	125073	b	b	-
+chr2	125042	125074	b	b	-
+chr2	125042	125074	b	b	-
+chr2	125042	125074	b	b	-
+chr2	125042	125074	b	b	-
+chr2	125075	125107	a	a	+
+chr2	125080	125112	a	a	+
+chr2	125081	125113	a	a	+
+chr2	125081	125113	a	a	+
+chr2	125081	125113	a	a	+
+chr2	125081	125113	a	a	+
+chr2	125050	125082	b	b	-
+chr2	125086	125118	a	a	+
+chr2	125054	125086	b	b	-
+chr2	125054	125086	b	b	-
+chr2	125054	125086	b	b	-
+chr2	125054	125086	b	b	-
+chr2	125092	125124	a	a	+
+chr2	125092	125124	a	a	+
+chr2	125061	125093	b	b	-
+chr2	125061	125093	b	b	-
+chr2	125061	125093	b	b	-
+chr2	125095	125127	a	a	+
+chr2	125095	125127	a	a	+
+chr2	125095	125127	a	a	+
+chr2	125095	125127	a	a	+
+chr2	125095	125127	a	a	+
+chr2	125095	125127	a	a	+
+chr2	125095	125127	a	a	+
+chr2	125065	125097	b	b	-
+chr2	125066	125098	b	b	-
+chr2	125066	125098	b	b	-
+chr2	125066	125098	b	b	-
+chr2	125066	125098	b	b	-
+chr2	125066	125098	b	b	-
+chr2	125067	125099	b	b	-
+chr2	125067	125099	b	b	-
+chr2	125067	125099	b	b	-
+chr2	125067	125099	b	b	-
+chr2	125067	125099	b	b	-
+chr2	125067	125099	b	b	-
+chr2	125067	125099	b	b	-
+chr2	125067	125099	b	b	-
+chr2	125067	125099	b	b	-
+chr2	125067	125099	b	b	-
+chr2	125101	125133	a	a	+
+chr2	125069	125101	b	b	-
+chr2	125069	125101	b	b	-
+chr2	125103	125135	a	a	+
+chr2	125106	125138	a	a	+
+chr2	125106	125138	a	a	+
+chr2	125075	125107	b	b	-
+chr2	125111	125143	a	a	+
+chr2	125111	125143	a	a	+
+chr2	125111	125143	a	a	+
+chr2	125080	125112	b	b	-
+chr2	125083	125115	b	b	-
+chr2	125083	125115	b	b	-
+chr2	125198	125230	b	b	-
+chr2	125212	125244	b	b	-
+chr2	125222	125254	b	b	-
+chr2	125255	125287	a	a	+
+chr2	125254	125286	b	b	-
+chr2	125407	125439	a	a	+
+chr2	125435	125467	b	b	-
+chr2	125435	125467	b	b	-
+chr2	125633	125665	b	b	-
+chr2	125633	125665	b	b	-
+chr2	125860	125892	a	a	+
+chr2	125894	125926	a	a	+
+chr2	125902	125934	a	a	+
+chr2	126337	126369	a	a	+
+chr2	126415	126447	b	b	-
+chr2	126415	126447	b	b	-
+chr2	126449	126481	b	b	-
+chr2	126465	126497	b	b	-
+chr2	126465	126497	b	b	-
+chr2	126532	126564	a	a	+
+chr2	126571	126603	a	a	+
+chr2	126689	126721	b	b	-
+chr2	126689	126721	b	b	-
+chr2	126789	126821	a	a	+
+chr2	126933	126965	a	a	+
+chr2	126935	126967	b	b	-
+chr2	126965	126997	b	b	-
+chr2	127110	127142	b	b	-
+chr2	127119	127151	b	b	-
+chr2	127119	127151	b	b	-
+chr2	127161	127193	a	a	+
+chr2	127161	127193	a	a	+
+chr2	127161	127193	a	a	+
+chr2	127161	127193	a	a	+
+chr2	127153	127185	b	b	-
+chr2	127203	127235	a	a	+
+chr2	127339	127371	a	a	+
+chr2	127343	127375	a	a	+
+chr2	127343	127375	a	a	+
+chr2	127320	127352	b	b	-
+chr2	127360	127392	a	a	+
+chr2	127360	127392	a	a	+
+chr2	127328	127360	b	b	-
+chr2	127444	127476	a	a	+
+chr2	127511	127543	a	a	+
+chr2	127529	127561	a	a	+
+chr2	127569	127601	a	a	+
+chr2	127571	127603	a	a	+
+chr2	127556	127588	b	b	-
+chr2	127851	127883	b	b	-
+chr2	127857	127889	b	b	-
+chr2	127951	127983	a	a	+
+chr2	128077	128109	a	a	+
+chr2	128821	128853	b	b	-
+chr2	129030	129062	b	b	-
+chr2	129038	129070	b	b	-
+chr2	129076	129108	b	b	-
+chr2	129110	129142	a	a	+
+chr2	129294	129326	a	a	+
+chr2	129362	129394	a	a	+
+chr2	129619	129651	a	a	+
+chr2	129622	129654	a	a	+
+chr2	130720	130752	b	b	-
+chr2	131452	131484	a	a	+
+chr2	131551	131583	a	a	+
+chr2	131598	131630	b	b	-
+chr2	131756	131788	b	b	-
+chr2	131756	131788	b	b	-
+chr2	131917	131949	b	b	-
+chr2	131945	131977	b	b	-
+chr2	131949	131981	b	b	-
+chr2	131960	131992	b	b	-
+chr2	131995	132027	a	a	+
+chr2	132125	132157	a	a	+
+chr2	132104	132136	b	b	-
+chr2	132109	132141	b	b	-
+chr2	132144	132176	a	a	+
+chr2	132145	132177	a	a	+
+chr2	132145	132177	a	a	+
+chr2	132116	132148	b	b	-
+chr2	132116	132148	b	b	-
+chr2	132116	132148	b	b	-
+chr2	132149	132181	a	a	+
+chr2	132158	132190	a	a	+
+chr2	132159	132191	a	a	+
+chr2	132159	132191	a	a	+
+chr2	132128	132160	b	b	-
+chr2	132161	132193	a	a	+
+chr2	132131	132163	b	b	-
+chr2	132132	132164	b	b	-
+chr2	132165	132197	a	a	+
+chr2	132141	132173	b	b	-
+chr2	132141	132173	b	b	-
+chr2	132141	132173	b	b	-
+chr2	132143	132175	b	b	-
+chr2	132146	132178	b	b	-
+chr2	132418	132450	b	b	-
+chr2	132451	132483	a	a	+
+chr2	132421	132453	b	b	-
+chr2	132455	132487	a	a	+
+chr2	132455	132487	a	a	+
+chr2	132423	132455	b	b	-
+chr2	132426	132458	b	b	-
+chr2	132459	132491	a	a	+
+chr2	132459	132491	a	a	+
+chr2	132461	132493	a	a	+
+chr2	132462	132494	a	a	+
+chr2	132462	132494	a	a	+
+chr2	132430	132462	b	b	-
+chr2	132430	132462	b	b	-
+chr2	132430	132462	b	b	-
+chr2	132430	132462	b	b	-
+chr2	132430	132462	b	b	-
+chr2	132430	132462	b	b	-
+chr2	132468	132500	a	a	+
+chr2	132471	132503	a	a	+
+chr2	132448	132480	b	b	-
+chr2	132448	132480	b	b	-
+chr2	132452	132484	b	b	-
+chr2	132453	132485	b	b	-
+chr2	132496	132528	a	a	+
+chr2	132467	132499	b	b	-
+chr2	132467	132499	b	b	-
+chr2	132477	132509	b	b	-
+chr2	132609	132641	a	a	+
+chr2	132626	132658	a	a	+
+chr2	132606	132638	b	b	-
+chr2	132664	132696	b	b	-
+chr2	132761	132793	b	b	-
+chr2	132761	132793	b	b	-
+chr2	132761	132793	b	b	-
+chr2	132816	132848	a	a	+
+chr2	133507	133539	a	a	+
+chr2	133507	133539	a	a	+
+chr2	133507	133539	a	a	+
+chr2	133560	133592	a	a	+
+chr2	133629	133661	a	a	+
+chr2	134663	134695	b	b	-
+chr2	135172	135204	a	a	+
+chr2	135400	135432	a	a	+
+chr2	135454	135486	b	b	-
+chr2	135454	135486	b	b	-
+chr2	135455	135487	b	b	-
+chr2	135488	135520	a	a	+
+chr2	135500	135532	a	a	+
+chr2	135629	135661	a	a	+
+chr2	135663	135695	a	a	+
+chr2	135663	135695	a	a	+
+chr2	135663	135695	a	a	+
+chr2	135665	135697	a	a	+
+chr2	135635	135667	b	b	-
+chr2	135638	135670	b	b	-
+chr2	135641	135673	b	b	-
+chr2	135674	135706	a	a	+
+chr2	135674	135706	a	a	+
+chr2	135674	135706	a	a	+
+chr2	135674	135706	a	a	+
+chr2	135646	135678	b	b	-
+chr2	135679	135711	a	a	+
+chr2	135647	135679	b	b	-
+chr2	135647	135679	b	b	-
+chr2	135647	135679	b	b	-
+chr2	135647	135679	b	b	-
+chr2	135682	135714	a	a	+
+chr2	135682	135714	a	a	+
+chr2	135658	135690	b	b	-
+chr2	135706	135738	a	a	+
+chr2	136059	136091	b	b	-
+chr2	136145	136177	b	b	-
+chr2	136276	136308	a	a	+
+chr2	136273	136305	b	b	-
+chr2	136291	136323	b	b	-
+chr2	136342	136374	a	a	+
+chr2	136347	136379	a	a	+
+chr2	136334	136366	b	b	-
+chr2	136335	136367	b	b	-
+chr2	136368	136400	a	a	+
+chr2	136368	136400	a	a	+
+chr2	136368	136400	a	a	+
+chr2	136337	136369	b	b	-
+chr2	136338	136370	b	b	-
+chr2	136350	136382	b	b	-
+chr2	136352	136384	b	b	-
+chr2	136387	136419	a	a	+
+chr2	136387	136419	a	a	+
+chr2	136388	136420	a	a	+
+chr2	136356	136388	b	b	-
+chr2	136356	136388	b	b	-
+chr2	136358	136390	b	b	-
+chr2	136361	136393	b	b	-
+chr2	136363	136395	b	b	-
+chr2	136369	136401	b	b	-
+chr2	136371	136403	b	b	-
+chr2	136404	136436	a	a	+
+chr2	136422	136454	a	a	+
+chr2	136422	136454	a	a	+
+chr2	136430	136462	a	a	+
+chr2	136495	136527	b	b	-
+chr2	136520	136552	b	b	-
+chr2	136567	136599	a	a	+
+chr2	136573	136605	a	a	+
+chr2	136572	136604	b	b	-
+chr2	136579	136611	b	b	-
+chr2	136654	136686	b	b	-
+chr2	136682	136714	b	b	-
+chr2	136724	136756	a	a	+
+chr2	136729	136761	a	a	+
+chr2	136699	136731	b	b	-
+chr2	136701	136733	b	b	-
+chr2	136701	136733	b	b	-
+chr2	136734	136766	a	a	+
+chr2	136702	136734	b	b	-
+chr2	136717	136749	b	b	-
+chr2	136728	136760	b	b	-
+chr2	136728	136760	b	b	-
+chr2	136728	136760	b	b	-
+chr2	136765	136797	a	a	+
+chr2	136775	136807	a	a	+
+chr2	136776	136808	a	a	+
+chr2	136776	136808	a	a	+
+chr2	136776	136808	a	a	+
+chr2	136798	136830	a	a	+
+chr2	136802	136834	a	a	+
+chr2	136804	136836	a	a	+
+chr2	136875	136907	a	a	+
+chr2	136876	136908	b	b	-
+chr2	136922	136954	a	a	+
+chr2	136902	136934	b	b	-
+chr2	136935	136967	a	a	+
+chr2	136936	136968	a	a	+
+chr2	136937	136969	a	a	+
+chr2	136925	136957	b	b	-
+chr2	136989	137021	b	b	-
+chr2	137025	137057	b	b	-
+chr2	137081	137113	a	a	+
+chr2	137051	137083	b	b	-
+chr2	137105	137137	a	a	+
+chr2	137079	137111	b	b	-
+chr2	137130	137162	b	b	-
+chr2	137165	137197	a	a	+
+chr2	137144	137176	b	b	-
+chr2	137212	137244	a	a	+
+chr2	137212	137244	a	a	+
+chr2	137212	137244	a	a	+
+chr2	137184	137216	b	b	-
+chr2	137184	137216	b	b	-
+chr2	137236	137268	a	a	+
+chr2	137220	137252	b	b	-
+chr2	137220	137252	b	b	-
+chr2	137220	137252	b	b	-
+chr2	137220	137252	b	b	-
+chr2	137260	137292	a	a	+
+chr2	137262	137294	a	a	+
+chr2	137262	137294	a	a	+
+chr2	137265	137297	a	a	+
+chr2	137265	137297	a	a	+
+chr2	137265	137297	a	a	+
+chr2	137269	137301	b	b	-
+chr2	137303	137335	a	a	+
+chr2	137327	137359	a	a	+
+chr2	137348	137380	a	a	+
+chr2	137354	137386	a	a	+
+chr2	137324	137356	b	b	-
+chr2	137362	137394	a	a	+
+chr2	137331	137363	b	b	-
+chr2	137376	137408	a	a	+
+chr2	137347	137379	b	b	-
+chr2	137347	137379	b	b	-
+chr2	137347	137379	b	b	-
+chr2	137384	137416	a	a	+
+chr2	137394	137426	a	a	+
+chr2	137395	137427	a	a	+
+chr2	137400	137432	a	a	+
+chr2	137403	137435	a	a	+
+chr2	137416	137448	a	a	+
+chr2	137450	137482	a	a	+
+chr2	137421	137453	b	b	-
+chr2	137457	137489	a	a	+
+chr2	137446	137478	b	b	-
+chr2	137508	137540	b	b	-
+chr2	137508	137540	b	b	-
+chr2	137548	137580	a	a	+
+chr2	137548	137580	a	a	+
+chr2	137516	137548	b	b	-
+chr2	137746	137778	b	b	-
+chr2	137749	137781	b	b	-
+chr2	137750	137782	b	b	-
+chr2	137763	137795	b	b	-
+chr2	137785	137817	b	b	-
+chr2	137886	137918	a	a	+
+chr2	137857	137889	b	b	-
+chr2	137873	137905	b	b	-
+chr2	137889	137921	b	b	-
+chr2	137923	137955	a	a	+
+chr2	137927	137959	a	a	+
+chr2	137928	137960	a	a	+
+chr2	137928	137960	a	a	+
+chr2	137928	137960	a	a	+
+chr2	137902	137934	b	b	-
+chr2	137911	137943	b	b	-
+chr2	137913	137945	b	b	-
+chr2	137947	137979	a	a	+
+chr2	137947	137979	a	a	+
+chr2	137917	137949	b	b	-
+chr2	137969	138001	a	a	+
+chr2	137965	137997	b	b	-
+chr2	138101	138133	b	b	-
+chr2	138104	138136	b	b	-
+chr2	138154	138186	a	a	+
+chr2	138136	138168	b	b	-
+chr2	138381	138413	b	b	-
+chr2	138466	138498	b	b	-
+chr2	138654	138686	a	a	+
+chr2	139256	139288	a	a	+
+chr2	139268	139300	a	a	+
+chr2	139247	139279	b	b	-
+chr2	139277	139309	b	b	-
+chr2	139429	139461	b	b	-
+chr2	139589	139621	b	b	-
+chr2	139753	139785	b	b	-
+chr2	139783	139815	b	b	-
+chr2	139846	139878	a	a	+
+chr2	139868	139900	b	b	-
+chr2	139986	140018	b	b	-
+chr2	140052	140084	b	b	-
+chr2	140162	140194	a	a	+
+chr2	140130	140162	b	b	-
+chr2	140245	140277	b	b	-
+chr2	140300	140332	a	a	+
+chr2	140281	140313	b	b	-
+chr2	140281	140313	b	b	-
+chr2	140319	140351	a	a	+
+chr2	140323	140355	a	a	+
+chr2	140329	140361	a	a	+
+chr2	140337	140369	a	a	+
+chr2	140312	140344	b	b	-
+chr2	140312	140344	b	b	-
+chr2	140870	140902	b	b	-
+chr2	140876	140908	b	b	-
+chr2	140876	140908	b	b	-
+chr2	140920	140952	a	a	+
+chr2	140934	140966	a	a	+
+chr2	140934	140966	a	a	+
+chr2	140945	140977	a	a	+
+chr2	140954	140986	a	a	+
+chr2	140932	140964	b	b	-
+chr2	140932	140964	b	b	-
+chr2	140979	141011	a	a	+
+chr2	140981	141013	a	a	+
+chr2	140995	141027	a	a	+
+chr2	141208	141240	b	b	-
+chr2	141249	141281	a	a	+
+chr2	141222	141254	b	b	-
+chr2	141222	141254	b	b	-
+chr2	141223	141255	b	b	-
+chr2	141263	141295	a	a	+
+chr2	141263	141295	a	a	+
+chr2	141231	141263	b	b	-
+chr2	141268	141300	a	a	+
+chr2	141268	141300	a	a	+
+chr2	141244	141276	b	b	-
+chr2	141244	141276	b	b	-
+chr2	141245	141277	b	b	-
+chr2	141281	141313	a	a	+
+chr2	141254	141286	b	b	-
+chr2	141254	141286	b	b	-
+chr2	141254	141286	b	b	-
+chr2	141255	141287	b	b	-
+chr2	141288	141320	a	a	+
+chr2	141300	141332	a	a	+
+chr2	141269	141301	b	b	-
+chr2	141315	141347	b	b	-
+chr2	141392	141424	a	a	+
+chr2	141391	141423	b	b	-
+chr2	141391	141423	b	b	-
+chr2	141391	141423	b	b	-
+chr2	141392	141424	b	b	-
+chr2	141555	141587	b	b	-
+chr2	142234	142266	b	b	-
+chr2	142361	142393	a	a	+
+chr2	142496	142528	a	a	+
+chr2	142464	142496	b	b	-
+chr2	142488	142520	b	b	-
+chr2	142488	142520	b	b	-
+chr2	142521	142553	a	a	+
+chr2	142489	142521	b	b	-
+chr2	142655	142687	a	a	+
+chr2	142637	142669	b	b	-
+chr2	142671	142703	a	a	+
+chr2	142672	142704	a	a	+
+chr2	142653	142685	b	b	-
+chr2	142691	142723	a	a	+
+chr2	142674	142706	b	b	-
+chr2	142674	142706	b	b	-
+chr2	142676	142708	b	b	-
+chr2	142776	142808	b	b	-
+chr2	142821	142853	a	a	+
+chr2	142824	142856	a	a	+
+chr2	142796	142828	b	b	-
+chr2	142846	142878	a	a	+
+chr2	142846	142878	a	a	+
+chr2	142847	142879	a	a	+
+chr2	142853	142885	a	a	+
+chr2	142854	142886	a	a	+
+chr2	142822	142854	b	b	-
+chr2	142856	142888	a	a	+
+chr2	142824	142856	b	b	-
+chr2	142824	142856	b	b	-
+chr2	142824	142856	b	b	-
+chr2	142824	142856	b	b	-
+chr2	142858	142890	a	a	+
+chr2	142862	142894	a	a	+
+chr2	142862	142894	a	a	+
+chr2	142865	142897	a	a	+
+chr2	142866	142898	a	a	+
+chr2	142870	142902	a	a	+
+chr2	142842	142874	b	b	-
+chr2	142843	142875	b	b	-
+chr2	142854	142886	b	b	-
+chr2	142943	142975	a	a	+
+chr2	143000	143032	b	b	-
+chr2	143007	143039	b	b	-
+chr2	143054	143086	a	a	+
+chr2	143073	143105	a	a	+
+chr2	143043	143075	b	b	-
+chr2	143043	143075	b	b	-
+chr2	143043	143075	b	b	-
+chr2	143043	143075	b	b	-
+chr2	143043	143075	b	b	-
+chr2	143061	143093	b	b	-
+chr2	143128	143160	a	a	+
+chr2	143147	143179	a	a	+
+chr2	143118	143150	b	b	-
+chr2	143120	143152	b	b	-
+chr2	143121	143153	b	b	-
+chr2	143121	143153	b	b	-
+chr2	143129	143161	b	b	-
+chr2	143192	143224	a	a	+
+chr2	143198	143230	a	a	+
+chr2	143327	143359	a	a	+
+chr2	143349	143381	a	a	+
+chr2	143377	143409	b	b	-
+chr2	143515	143547	a	a	+
+chr2	143515	143547	a	a	+
+chr2	144484	144516	b	b	-
+chr2	144540	144572	b	b	-
+chr2	145060	145092	b	b	-
+chr2	145143	145175	a	a	+
+chr2	145225	145257	b	b	-
+chr2	145371	145403	a	a	+
+chr2	145432	145464	a	a	+
+chr2	145414	145446	b	b	-
+chr2	145542	145574	b	b	-
+chr2	145570	145602	b	b	-
+chr2	145570	145602	b	b	-
+chr2	145570	145602	b	b	-
+chr2	145611	145643	a	a	+
+chr2	145579	145611	b	b	-
+chr2	145701	145733	a	a	+
+chr2	145697	145729	b	b	-
+chr2	145731	145763	a	a	+
+chr2	145726	145758	b	b	-
+chr2	145726	145758	b	b	-
+chr2	145759	145791	a	a	+
+chr2	145728	145760	b	b	-
+chr2	145766	145798	a	a	+
+chr2	145766	145798	a	a	+
+chr2	145773	145805	a	a	+
+chr2	145774	145806	a	a	+
+chr2	145746	145778	b	b	-
+chr2	146094	146126	b	b	-
+chr2	146105	146137	b	b	-
+chr2	146109	146141	b	b	-
+chr2	146109	146141	b	b	-
+chr2	146111	146143	b	b	-
+chr2	146145	146177	a	a	+
+chr2	146118	146150	b	b	-
+chr2	146151	146183	a	a	+
+chr2	146151	146183	a	a	+
+chr2	146151	146183	a	a	+
+chr2	146120	146152	b	b	-
+chr2	146153	146185	a	a	+
+chr2	146153	146185	a	a	+
+chr2	146153	146185	a	a	+
+chr2	146159	146191	a	a	+
+chr2	146160	146192	a	a	+
+chr2	146163	146195	a	a	+
+chr2	146135	146167	b	b	-
+chr2	146136	146168	b	b	-
+chr2	146173	146205	a	a	+
+chr2	146146	146178	b	b	-
+chr2	146179	146211	a	a	+
+chr2	146162	146194	b	b	-
+chr2	146276	146308	a	a	+
+chr2	146322	146354	a	a	+
+chr2	146293	146325	b	b	-
+chr2	146293	146325	b	b	-
+chr2	146293	146325	b	b	-
+chr2	146300	146332	b	b	-
+chr2	146419	146451	b	b	-
+chr2	146864	146896	b	b	-
+chr2	146870	146902	b	b	-
+chr2	146903	146935	a	a	+
+chr2	146909	146941	a	a	+
+chr2	147091	147123	a	a	+
+chr2	147082	147114	b	b	-
+chr2	147100	147132	b	b	-
+chr2	147143	147175	a	a	+
+chr2	147152	147184	a	a	+
+chr2	147152	147184	a	a	+
+chr2	147122	147154	b	b	-
+chr2	147155	147187	a	a	+
+chr2	147126	147158	b	b	-
+chr2	147126	147158	b	b	-
+chr2	147126	147158	b	b	-
+chr2	147126	147158	b	b	-
+chr2	147136	147168	b	b	-
+chr2	147169	147201	a	a	+
+chr2	147171	147203	a	a	+
+chr2	147171	147203	a	a	+
+chr2	147171	147203	a	a	+
+chr2	147139	147171	b	b	-
+chr2	147173	147205	a	a	+
+chr2	147175	147207	a	a	+
+chr2	147177	147209	a	a	+
+chr2	147182	147214	a	a	+
+chr2	147182	147214	a	a	+
+chr2	147185	147217	a	a	+
+chr2	147186	147218	a	a	+
+chr2	147186	147218	a	a	+
+chr2	147186	147218	a	a	+
+chr2	147281	147313	a	a	+
+chr2	147308	147340	a	a	+
+chr2	147315	147347	a	a	+
+chr2	147331	147363	a	a	+
+chr2	147303	147335	b	b	-
+chr2	147349	147381	a	a	+
+chr2	147362	147394	a	a	+
+chr2	147463	147495	a	a	+
+chr2	147537	147569	a	a	+
+chr2	147681	147713	a	a	+
+chr2	147652	147684	b	b	-
+chr2	147921	147953	b	b	-
+chr2	148149	148181	a	a	+
+chr2	148217	148249	b	b	-
+chr2	148585	148617	a	a	+
+chr2	148939	148971	a	a	+
+chr2	148915	148947	b	b	-
+chr2	149019	149051	a	a	+
+chr2	149010	149042	b	b	-
+chr2	149168	149200	b	b	-
+chr2	149234	149266	b	b	-
+chr2	149759	149791	b	b	-
+chr2	149858	149890	b	b	-
+chr2	149981	150013	b	b	-
+chr2	150167	150199	a	a	+
+chr2	150218	150250	a	a	+
+chr2	150527	150559	a	a	+
+chr2	150607	150639	a	a	+
+chr2	150801	150833	a	a	+
+chr2	150872	150904	a	a	+
+chr2	151002	151034	a	a	+
+chr2	151013	151045	a	a	+
+chr2	151013	151045	a	a	+
+chr2	151035	151067	b	b	-
+chr2	151129	151161	b	b	-
+chr2	151129	151161	b	b	-
+chr2	151137	151169	b	b	-
+chr2	151175	151207	a	a	+
+chr2	151179	151211	a	a	+
+chr2	151147	151179	b	b	-
+chr2	151147	151179	b	b	-
+chr2	151147	151179	b	b	-
+chr2	151154	151186	b	b	-
+chr2	151155	151187	b	b	-
+chr2	151195	151227	a	a	+
+chr2	151196	151228	a	a	+
+chr2	151167	151199	b	b	-
+chr2	151203	151235	a	a	+
+chr2	151171	151203	b	b	-
+chr2	151171	151203	b	b	-
+chr2	151173	151205	b	b	-
+chr2	151207	151239	a	a	+
+chr2	151175	151207	b	b	-
+chr2	151218	151250	a	a	+
+chr2	151475	151507	a	a	+
+chr2	151475	151507	a	a	+
+chr2	151476	151508	a	a	+
+chr2	151476	151508	a	a	+
+chr2	151476	151508	a	a	+
+chr2	151476	151508	a	a	+
+chr2	151476	151508	a	a	+
+chr2	151478	151510	a	a	+
+chr2	151449	151481	b	b	-
+chr2	151482	151514	a	a	+
+chr2	151451	151483	b	b	-
+chr2	151457	151489	b	b	-
+chr2	151457	151489	b	b	-
+chr2	151460	151492	b	b	-
+chr2	151460	151492	b	b	-
+chr2	151470	151502	b	b	-
+chr2	151470	151502	b	b	-
+chr2	151510	151542	a	a	+
+chr2	151510	151542	a	a	+
+chr2	151510	151542	a	a	+
+chr2	151510	151542	a	a	+
+chr2	151510	151542	a	a	+
+chr2	151481	151513	b	b	-
+chr2	151481	151513	b	b	-
+chr2	151514	151546	a	a	+
+chr2	151516	151548	a	a	+
+chr2	151516	151548	a	a	+
+chr2	151522	151554	a	a	+
+chr2	151561	151593	a	a	+
+chr2	151538	151570	b	b	-
+chr2	151575	151607	a	a	+
+chr2	151629	151661	b	b	-
+chr2	151637	151669	b	b	-
+chr2	151637	151669	b	b	-
+chr2	152071	152103	b	b	-
+chr2	152081	152113	b	b	-
+chr2	152195	152227	a	a	+
+chr2	152251	152283	a	a	+
+chr2	152469	152501	a	a	+
+chr2	152447	152479	b	b	-
+chr2	152514	152546	b	b	-
+chr2	152555	152587	b	b	-
+chr2	152599	152631	b	b	-
+chr2	152650	152682	a	a	+
+chr2	152624	152656	b	b	-
+chr2	152768	152800	a	a	+
+chr2	152861	152893	a	a	+
+chr2	152997	153029	a	a	+
+chr2	153141	153173	a	a	+
+chr2	153153	153185	b	b	-
+chr2	153298	153330	a	a	+
+chr2	153288	153320	b	b	-
+chr2	153288	153320	b	b	-
+chr2	153348	153380	a	a	+
+chr2	153459	153491	a	a	+
+chr2	153490	153522	a	a	+
+chr2	153490	153522	a	a	+
+chr2	153495	153527	a	a	+
+chr2	153496	153528	a	a	+
+chr2	153497	153529	a	a	+
+chr2	153476	153508	b	b	-
+chr2	153476	153508	b	b	-
+chr2	153477	153509	b	b	-
+chr2	153477	153509	b	b	-
+chr2	153511	153543	a	a	+
+chr2	153541	153573	a	a	+
+chr2	153595	153627	b	b	-
+chr2	153646	153678	a	a	+
+chr2	153641	153673	b	b	-
+chr2	153748	153780	b	b	-
+chr2	153915	153947	b	b	-
+chr2	153959	153991	a	a	+
+chr2	153930	153962	b	b	-
+chr2	153968	154000	a	a	+
+chr2	153979	154011	a	a	+
+chr2	153949	153981	b	b	-
+chr2	153986	154018	a	a	+
+chr2	153958	153990	b	b	-
+chr2	153999	154031	a	a	+
+chr2	154011	154043	a	a	+
+chr2	154104	154136	b	b	-
+chr2	154110	154142	b	b	-
+chr2	154302	154334	b	b	-
+chr2	154508	154540	a	a	+
+chr2	155348	155380	b	b	-
+chr2	155552	155584	a	a	+
+chr2	155562	155594	b	b	-
+chr2	156062	156094	a	a	+
+chr2	156127	156159	a	a	+
+chr2	156274	156306	b	b	-
+chr2	156274	156306	b	b	-
+chr2	156274	156306	b	b	-
+chr2	157152	157184	a	a	+
+chr2	157233	157265	a	a	+
+chr2	157407	157439	b	b	-
+chr2	158066	158098	a	a	+
+chr2	158074	158106	a	a	+
+chr2	158075	158107	a	a	+
+chr2	158078	158110	a	a	+
+chr2	158064	158096	b	b	-
+chr2	158102	158134	a	a	+
+chr2	158139	158171	a	a	+
+chr2	158139	158171	a	a	+
+chr2	158166	158198	b	b	-
+chr2	158226	158258	a	a	+
+chr2	158226	158258	a	a	+
+chr2	158226	158258	a	a	+
+chr2	158226	158258	a	a	+
+chr2	158214	158246	b	b	-
+chr2	158217	158249	b	b	-
+chr2	158250	158282	a	a	+
+chr2	158250	158282	a	a	+
+chr2	158250	158282	a	a	+
+chr2	158250	158282	a	a	+
+chr2	158250	158282	a	a	+
+chr2	158250	158282	a	a	+
+chr2	158227	158259	b	b	-
+chr2	158234	158266	b	b	-
+chr2	158234	158266	b	b	-
+chr2	158270	158302	a	a	+
+chr2	158271	158303	a	a	+
+chr2	158240	158272	b	b	-
+chr2	158242	158274	b	b	-
+chr2	158281	158313	a	a	+
+chr2	158323	158355	a	a	+
+chr2	158386	158418	a	a	+
+chr2	158407	158439	a	a	+
+chr2	158375	158407	b	b	-
+chr2	158375	158407	b	b	-
+chr2	158377	158409	b	b	-
+chr2	158377	158409	b	b	-
+chr2	158377	158409	b	b	-
+chr2	158410	158442	a	a	+
+chr2	158378	158410	b	b	-
+chr2	158378	158410	b	b	-
+chr2	158412	158444	a	a	+
+chr2	158382	158414	b	b	-
+chr2	158415	158447	a	a	+
+chr2	158416	158448	a	a	+
+chr2	158384	158416	b	b	-
+chr2	158423	158455	a	a	+
+chr2	158424	158456	a	a	+
+chr2	158424	158456	a	a	+
+chr2	158424	158456	a	a	+
+chr2	158424	158456	a	a	+
+chr2	158424	158456	a	a	+
+chr2	158424	158456	a	a	+
+chr2	158429	158461	a	a	+
+chr2	158431	158463	a	a	+
+chr2	158402	158434	b	b	-
+chr2	158403	158435	b	b	-
+chr2	158403	158435	b	b	-
+chr2	158403	158435	b	b	-
+chr2	158441	158473	a	a	+
+chr2	158441	158473	a	a	+
+chr2	158446	158478	a	a	+
+chr2	158446	158478	a	a	+
+chr2	158450	158482	a	a	+
+chr2	158452	158484	a	a	+
+chr2	158677	158709	a	a	+
+chr2	158654	158686	b	b	-
+chr2	158662	158694	b	b	-
+chr2	158664	158696	b	b	-
+chr2	158672	158704	b	b	-
+chr2	158707	158739	a	a	+
+chr2	158678	158710	b	b	-
+chr2	158678	158710	b	b	-
+chr2	158678	158710	b	b	-
+chr2	158679	158711	b	b	-
+chr2	158679	158711	b	b	-
+chr2	158682	158714	b	b	-
+chr2	158717	158749	a	a	+
+chr2	158717	158749	a	a	+
+chr2	158717	158749	a	a	+
+chr2	158717	158749	a	a	+
+chr2	158717	158749	a	a	+
+chr2	158718	158750	a	a	+
+chr2	158718	158750	a	a	+
+chr2	158718	158750	a	a	+
+chr2	158686	158718	b	b	-
+chr2	158686	158718	b	b	-
+chr2	158686	158718	b	b	-
+chr2	158686	158718	b	b	-
+chr2	158686	158718	b	b	-
+chr2	158690	158722	b	b	-
+chr2	158727	158759	a	a	+
+chr2	158697	158729	b	b	-
+chr2	158697	158729	b	b	-
+chr2	158697	158729	b	b	-
+chr2	158699	158731	b	b	-
+chr2	158701	158733	b	b	-
+chr2	158701	158733	b	b	-
+chr2	158701	158733	b	b	-
+chr2	158701	158733	b	b	-
+chr2	158701	158733	b	b	-
+chr2	158701	158733	b	b	-
+chr2	158701	158733	b	b	-
+chr2	158702	158734	b	b	-
+chr2	158736	158768	a	a	+
+chr2	158736	158768	a	a	+
+chr2	158737	158769	a	a	+
+chr2	158738	158770	a	a	+
+chr2	158707	158739	b	b	-
+chr2	158749	158781	a	a	+
+chr2	158865	158897	a	a	+
+chr2	158868	158900	a	a	+
+chr2	158881	158913	a	a	+
+chr2	158990	159022	a	a	+
+chr2	159005	159037	a	a	+
+chr2	159048	159080	a	a	+
+chr2	159074	159106	a	a	+
+chr2	159147	159179	b	b	-
+chr2	159147	159179	b	b	-
+chr2	159330	159362	a	a	+
+chr2	159428	159460	a	a	+
+chr2	159507	159539	a	a	+
+chr2	159509	159541	a	a	+
+chr2	159510	159542	a	a	+
+chr2	159646	159678	a	a	+
+chr2	159662	159694	a	a	+
+chr2	159631	159663	b	b	-
+chr2	159631	159663	b	b	-
+chr2	159672	159704	a	a	+
+chr2	159672	159704	a	a	+
+chr2	159672	159704	a	a	+
+chr2	159640	159672	b	b	-
+chr2	159674	159706	a	a	+
+chr2	159664	159696	b	b	-
+chr2	159670	159702	b	b	-
+chr2	160076	160108	b	b	-
+chr2	160091	160123	b	b	-
+chr2	160098	160130	b	b	-
+chr2	160138	160170	a	a	+
+chr2	160138	160170	a	a	+
+chr2	160140	160172	a	a	+
+chr2	160143	160175	a	a	+
+chr2	160144	160176	a	a	+
+chr2	160149	160181	a	a	+
+chr2	160117	160149	b	b	-
+chr2	160117	160149	b	b	-
+chr2	160117	160149	b	b	-
+chr2	160117	160149	b	b	-
+chr2	160118	160150	b	b	-
+chr2	160119	160151	b	b	-
+chr2	160154	160186	a	a	+
+chr2	160154	160186	a	a	+
+chr2	160155	160187	a	a	+
+chr2	160155	160187	a	a	+
+chr2	160124	160156	b	b	-
+chr2	160124	160156	b	b	-
+chr2	160124	160156	b	b	-
+chr2	160124	160156	b	b	-
+chr2	160124	160156	b	b	-
+chr2	160124	160156	b	b	-
+chr2	160124	160156	b	b	-
+chr2	160126	160158	b	b	-
+chr2	160126	160158	b	b	-
+chr2	160126	160158	b	b	-
+chr2	160126	160158	b	b	-
+chr2	160162	160194	a	a	+
+chr2	160130	160162	b	b	-
+chr2	160130	160162	b	b	-
+chr2	160130	160162	b	b	-
+chr2	160130	160162	b	b	-
+chr2	160130	160162	b	b	-
+chr2	160130	160162	b	b	-
+chr2	160163	160195	a	a	+
+chr2	160131	160163	b	b	-
+chr2	160131	160163	b	b	-
+chr2	160131	160163	b	b	-
+chr2	160164	160196	a	a	+
+chr2	160165	160197	a	a	+
+chr2	160165	160197	a	a	+
+chr2	160165	160197	a	a	+
+chr2	160172	160204	a	a	+
+chr2	160172	160204	a	a	+
+chr2	160145	160177	b	b	-
+chr2	160148	160180	b	b	-
+chr2	160310	160342	a	a	+
+chr2	160310	160342	a	a	+
+chr2	160311	160343	a	a	+
+chr2	160315	160347	a	a	+
+chr2	160287	160319	b	b	-
+chr2	160287	160319	b	b	-
+chr2	160287	160319	b	b	-
+chr2	160287	160319	b	b	-
+chr2	160460	160492	b	b	-
+chr2	160460	160492	b	b	-
+chr2	160496	160528	a	a	+
+chr2	160639	160671	a	a	+
+chr2	160663	160695	a	a	+
+chr2	160675	160707	a	a	+
+chr2	160689	160721	a	a	+
+chr2	160754	160786	b	b	-
+chr2	160798	160830	a	a	+
+chr2	160913	160945	b	b	-
+chr2	160959	160991	a	a	+
+chr2	160975	161007	a	a	+
+chr2	161263	161295	a	a	+
+chr2	161278	161310	a	a	+
+chr2	161294	161326	a	a	+
+chr2	161411	161443	a	a	+
+chr2	161414	161446	a	a	+
+chr2	161676	161708	b	b	-
+chr2	161677	161709	b	b	-
+chr2	161677	161709	b	b	-
+chr2	161711	161743	a	a	+
+chr2	161684	161716	b	b	-
+chr2	161684	161716	b	b	-
+chr2	161684	161716	b	b	-
+chr2	161719	161751	a	a	+
+chr2	161720	161752	a	a	+
+chr2	161688	161720	b	b	-
+chr2	161688	161720	b	b	-
+chr2	161724	161756	a	a	+
+chr2	161725	161757	a	a	+
+chr2	161725	161757	a	a	+
+chr2	161725	161757	a	a	+
+chr2	161725	161757	a	a	+
+chr2	161693	161725	b	b	-
+chr2	161693	161725	b	b	-
+chr2	161693	161725	b	b	-
+chr2	161726	161758	a	a	+
+chr2	161726	161758	a	a	+
+chr2	161726	161758	a	a	+
+chr2	161726	161758	a	a	+
+chr2	161694	161726	b	b	-
+chr2	161695	161727	b	b	-
+chr2	161728	161760	a	a	+
+chr2	161728	161760	a	a	+
+chr2	161728	161760	a	a	+
+chr2	161728	161760	a	a	+
+chr2	161730	161762	a	a	+
+chr2	161699	161731	b	b	-
+chr2	161732	161764	a	a	+
+chr2	161700	161732	b	b	-
+chr2	161700	161732	b	b	-
+chr2	161735	161767	a	a	+
+chr2	161735	161767	a	a	+
+chr2	161735	161767	a	a	+
+chr2	161735	161767	a	a	+
+chr2	161735	161767	a	a	+
+chr2	161735	161767	a	a	+
+chr2	161705	161737	b	b	-
+chr2	161707	161739	b	b	-
+chr2	161860	161892	b	b	-
+chr2	161867	161899	b	b	-
+chr2	161900	161932	a	a	+
+chr2	162046	162078	a	a	+
+chr2	162049	162081	a	a	+
+chr2	162045	162077	b	b	-
+chr2	162061	162093	b	b	-
+chr2	162223	162255	b	b	-
+chr2	162261	162293	a	a	+
+chr2	162426	162458	a	a	+
+chr2	162440	162472	a	a	+
+chr2	162440	162472	a	a	+
+chr2	162421	162453	b	b	-
+chr2	162475	162507	b	b	-
+chr2	162570	162602	a	a	+
+chr2	162554	162586	b	b	-
+chr2	162607	162639	a	a	+
+chr2	162619	162651	b	b	-
+chr2	162636	162668	b	b	-
+chr2	163210	163242	a	a	+
+chr2	163199	163231	b	b	-
+chr2	163292	163324	a	a	+
+chr2	163405	163437	b	b	-
+chr2	163464	163496	a	a	+
+chr2	163464	163496	a	a	+
+chr2	163464	163496	a	a	+
+chr2	163464	163496	a	a	+
+chr2	163581	163613	b	b	-
+chr2	163661	163693	a	a	+
+chr2	163686	163718	a	a	+
+chr2	163810	163842	b	b	-
+chr2	163811	163843	b	b	-
+chr2	163811	163843	b	b	-
+chr2	163816	163848	b	b	-
+chr2	163969	164001	a	a	+
+chr2	163969	164001	a	a	+
+chr2	164006	164038	a	a	+
+chr2	164010	164042	b	b	-
+chr2	164068	164100	b	b	-
+chr2	164071	164103	b	b	-
+chr2	164145	164177	b	b	-
+chr2	164163	164195	b	b	-
+chr2	164163	164195	b	b	-
+chr2	164201	164233	b	b	-
+chr2	164209	164241	b	b	-
+chr2	164231	164263	b	b	-
+chr2	164281	164313	a	a	+
+chr2	164281	164313	a	a	+
+chr2	164281	164313	a	a	+
+chr2	164506	164538	a	a	+
+chr2	164506	164538	a	a	+
+chr2	164508	164540	a	a	+
+chr2	164511	164543	a	a	+
+chr2	164511	164543	a	a	+
+chr2	164511	164543	a	a	+
+chr2	164489	164521	b	b	-
+chr2	164495	164527	b	b	-
+chr2	164534	164566	a	a	+
+chr2	164502	164534	b	b	-
+chr2	164535	164567	a	a	+
+chr2	164536	164568	a	a	+
+chr2	164504	164536	b	b	-
+chr2	164538	164570	a	a	+
+chr2	164516	164548	b	b	-
+chr2	164521	164553	b	b	-
+chr2	164616	164648	a	a	+
+chr2	164633	164665	b	b	-
+chr2	164695	164727	a	a	+
+chr2	164705	164737	a	a	+
+chr2	164673	164705	b	b	-
+chr2	164780	164812	b	b	-
+chr2	164808	164840	b	b	-
+chr2	164809	164841	b	b	-
+chr2	164820	164852	b	b	-
+chr2	164824	164856	b	b	-
+chr2	164859	164891	a	a	+
+chr2	164831	164863	b	b	-
+chr2	164864	164896	a	a	+
+chr2	164842	164874	b	b	-
+chr2	164842	164874	b	b	-
+chr2	164843	164875	b	b	-
+chr2	164878	164910	a	a	+
+chr2	164878	164910	a	a	+
+chr2	164883	164915	a	a	+
+chr2	164856	164888	b	b	-
+chr2	164858	164890	b	b	-
+chr2	164891	164923	a	a	+
+chr2	164901	164933	a	a	+
+chr2	165519	165551	a	a	+
+chr2	165487	165519	b	b	-
+chr2	165520	165552	a	a	+
+chr2	165546	165578	b	b	-
+chr2	165645	165677	b	b	-
+chr2	165744	165776	b	b	-
+chr2	165746	165778	b	b	-
+chr2	165788	165820	a	a	+
+chr2	165761	165793	b	b	-
+chr2	165762	165794	b	b	-
+chr2	165780	165812	b	b	-
+chr2	165823	165855	a	a	+
+chr2	166023	166055	a	a	+
+chr2	165998	166030	b	b	-
+chr2	166152	166184	b	b	-
+chr2	166203	166235	b	b	-
+chr2	166260	166292	a	a	+
+chr2	166232	166264	b	b	-
+chr2	166251	166283	b	b	-
+chr2	166275	166307	b	b	-
+chr2	166474	166506	a	a	+
+chr2	166496	166528	b	b	-
+chr2	166562	166594	a	a	+
+chr2	166530	166562	b	b	-
+chr2	166532	166564	b	b	-
+chr2	166550	166582	b	b	-
+chr2	166571	166603	b	b	-
+chr2	166595	166627	b	b	-
+chr2	166692	166724	a	a	+
+chr2	166699	166731	a	a	+
+chr2	166668	166700	b	b	-
+chr2	166699	166731	b	b	-
+chr2	166699	166731	b	b	-
+chr2	166741	166773	a	a	+
+chr2	166744	166776	a	a	+
+chr2	166712	166744	b	b	-
+chr2	166764	166796	a	a	+
+chr2	166737	166769	b	b	-
+chr2	166798	166830	b	b	-
+chr2	166838	166870	a	a	+
+chr2	166855	166887	b	b	-
+chr2	166866	166898	b	b	-
+chr2	166875	166907	b	b	-
+chr2	166876	166908	b	b	-
+chr2	166876	166908	b	b	-
+chr2	166927	166959	a	a	+
+chr2	166898	166930	b	b	-
+chr2	166898	166930	b	b	-
+chr2	166898	166930	b	b	-
+chr2	166898	166930	b	b	-
+chr2	166899	166931	b	b	-
+chr2	166914	166946	b	b	-
+chr2	166914	166946	b	b	-
+chr2	166925	166957	b	b	-
+chr2	166966	166998	a	a	+
+chr2	166982	167014	b	b	-
+chr2	167073	167105	a	a	+
+chr2	167062	167094	b	b	-
+chr2	167062	167094	b	b	-
+chr2	167138	167170	b	b	-
+chr2	167173	167205	a	a	+
+chr2	167147	167179	b	b	-
+chr2	167156	167188	b	b	-
+chr2	167190	167222	a	a	+
+chr2	167190	167222	a	a	+
+chr2	167190	167222	a	a	+
+chr2	167161	167193	b	b	-
+chr2	167195	167227	a	a	+
+chr2	167174	167206	b	b	-
+chr2	167175	167207	b	b	-
+chr2	167624	167656	b	b	-
+chr2	167624	167656	b	b	-
+chr2	167823	167855	a	a	+
+chr2	167792	167824	b	b	-
+chr2	167825	167857	a	a	+
+chr2	167795	167827	b	b	-
+chr2	167801	167833	b	b	-
+chr2	167814	167846	b	b	-
+chr2	167815	167847	b	b	-
+chr2	167818	167850	b	b	-
+chr2	167851	167883	a	a	+
+chr2	168895	168927	a	a	+
+chr2	168964	168996	a	a	+
+chr2	168981	169013	a	a	+
+chr2	169051	169083	a	a	+
+chr2	169091	169123	b	b	-
+chr2	169178	169210	a	a	+
+chr2	169186	169218	a	a	+
+chr2	169193	169225	b	b	-
+chr2	169547	169579	b	b	-
+chr2	169547	169579	b	b	-
+chr2	169667	169699	a	a	+
+chr2	169692	169724	a	a	+
+chr2	169708	169740	b	b	-
+chr2	169708	169740	b	b	-
+chr2	169799	169831	a	a	+
+chr2	169800	169832	a	a	+
+chr2	169776	169808	b	b	-
+chr2	169776	169808	b	b	-
+chr2	169795	169827	b	b	-
+chr2	169830	169862	b	b	-
+chr2	169832	169864	b	b	-
+chr2	169832	169864	b	b	-
+chr2	169836	169868	b	b	-
+chr2	169872	169904	a	a	+
+chr2	169849	169881	b	b	-
+chr2	169882	169914	a	a	+
+chr2	169853	169885	b	b	-
+chr2	169887	169919	a	a	+
+chr2	169887	169919	a	a	+
+chr2	169887	169919	a	a	+
+chr2	169888	169920	a	a	+
+chr2	169890	169922	a	a	+
+chr2	169890	169922	a	a	+
+chr2	169892	169924	a	a	+
+chr2	169862	169894	b	b	-
+chr2	169900	169932	a	a	+
+chr2	169869	169901	b	b	-
+chr2	169869	169901	b	b	-
+chr2	169918	169950	a	a	+
+chr2	169918	169950	a	a	+
+chr2	169918	169950	a	a	+
+chr2	169918	169950	a	a	+
+chr2	169894	169926	b	b	-
+chr2	169957	169989	a	a	+
+chr2	169964	169996	a	a	+
+chr2	170097	170129	b	b	-
+chr2	170097	170129	b	b	-
+chr2	170111	170143	b	b	-
+chr2	170174	170206	b	b	-
+chr2	170355	170387	a	a	+
+chr2	170356	170388	a	a	+
+chr2	170357	170389	a	a	+
+chr2	170363	170395	b	b	-
+chr2	170397	170429	a	a	+
+chr2	170570	170602	b	b	-
+chr2	170571	170603	b	b	-
+chr2	170576	170608	b	b	-
+chr2	170576	170608	b	b	-
+chr2	170583	170615	b	b	-
+chr2	170584	170616	b	b	-
+chr2	170584	170616	b	b	-
+chr2	170617	170649	a	a	+
+chr2	170617	170649	a	a	+
+chr2	170585	170617	b	b	-
+chr2	170620	170652	a	a	+
+chr2	170620	170652	a	a	+
+chr2	170620	170652	a	a	+
+chr2	170620	170652	a	a	+
+chr2	170626	170658	a	a	+
+chr2	170600	170632	b	b	-
+chr2	170601	170633	b	b	-
+chr2	170639	170671	a	a	+
+chr2	170607	170639	b	b	-
+chr2	170647	170679	a	a	+
+chr2	170650	170682	a	a	+
+chr2	170709	170741	b	b	-
+chr2	170713	170745	b	b	-
+chr2	170713	170745	b	b	-
+chr2	170729	170761	b	b	-
+chr2	170744	170776	b	b	-
+chr2	170749	170781	b	b	-
+chr2	170767	170799	b	b	-
+chr2	170767	170799	b	b	-
+chr2	170810	170842	a	a	+
+chr2	170810	170842	a	a	+
+chr2	170933	170965	a	a	+
+chr2	170938	170970	b	b	-
+chr2	171207	171239	a	a	+
+chr2	171211	171243	a	a	+
+chr2	171211	171243	a	a	+
+chr2	171211	171243	a	a	+
+chr2	171181	171213	b	b	-
+chr2	171219	171251	a	a	+
+chr2	171189	171221	b	b	-
+chr2	171222	171254	a	a	+
+chr2	171226	171258	a	a	+
+chr2	171226	171258	a	a	+
+chr2	171226	171258	a	a	+
+chr2	171197	171229	b	b	-
+chr2	171200	171232	b	b	-
+chr2	171200	171232	b	b	-
+chr2	171201	171233	b	b	-
+chr2	171246	171278	a	a	+
+chr2	171261	171293	a	a	+
+chr2	171422	171454	b	b	-
+chr2	171434	171466	b	b	-
+chr2	171472	171504	a	a	+
+chr2	171472	171504	a	a	+
+chr2	171474	171506	a	a	+
+chr2	171474	171506	a	a	+
+chr2	171482	171514	a	a	+
+chr2	171452	171484	b	b	-
+chr2	171464	171496	b	b	-
+chr2	171506	171538	a	a	+
+chr2	171581	171613	b	b	-
+chr2	171595	171627	b	b	-
+chr2	171631	171663	a	a	+
+chr2	171631	171663	a	a	+
+chr2	171613	171645	b	b	-
+chr2	171617	171649	b	b	-
+chr2	171617	171649	b	b	-
+chr2	171617	171649	b	b	-
+chr2	171618	171650	b	b	-
+chr2	171639	171671	b	b	-
+chr2	171676	171708	a	a	+
+chr2	171819	171851	a	a	+
+chr2	171828	171860	a	a	+
+chr2	171808	171840	b	b	-
+chr2	171866	171898	b	b	-
+chr2	172053	172085	a	a	+
+chr2	172090	172122	a	a	+
+chr2	172174	172206	b	b	-
+chr2	172179	172211	b	b	-
+chr2	172214	172246	a	a	+
+chr2	172195	172227	b	b	-
+chr2	172234	172266	a	a	+
+chr2	172215	172247	b	b	-
+chr2	172270	172302	a	a	+
+chr2	172270	172302	a	a	+
+chr2	172515	172547	a	a	+
+chr2	172487	172519	b	b	-
+chr2	172522	172554	a	a	+
+chr2	172492	172524	b	b	-
+chr2	172495	172527	b	b	-
+chr2	172500	172532	b	b	-
+chr2	172533	172565	a	a	+
+chr2	172502	172534	b	b	-
+chr2	172535	172567	a	a	+
+chr2	172538	172570	a	a	+
+chr2	172539	172571	a	a	+
+chr2	172539	172571	a	a	+
+chr2	172507	172539	b	b	-
+chr2	172540	172572	a	a	+
+chr2	172508	172540	b	b	-
+chr2	172546	172578	a	a	+
+chr2	172547	172579	a	a	+
+chr2	172515	172547	b	b	-
+chr2	172548	172580	a	a	+
+chr2	172548	172580	a	a	+
+chr2	172520	172552	b	b	-
+chr2	172554	172586	a	a	+
+chr2	172523	172555	b	b	-
+chr2	172523	172555	b	b	-
+chr2	172524	172556	b	b	-
+chr2	172557	172589	a	a	+
+chr2	172563	172595	a	a	+
+chr2	172566	172598	a	a	+
+chr2	172574	172606	a	a	+
+chr2	172629	172661	a	a	+
+chr2	172632	172664	b	b	-
+chr2	172668	172700	b	b	-
+chr2	172704	172736	a	a	+
+chr2	172673	172705	b	b	-
+chr2	172769	172801	a	a	+
+chr2	172804	172836	b	b	-
+chr2	172829	172861	b	b	-
+chr2	173087	173119	b	b	-
+chr2	173890	173922	a	a	+
+chr2	174529	174561	b	b	-
+chr2	174598	174630	b	b	-
+chr2	175118	175150	b	b	-
+chr2	175210	175242	b	b	-
+chr2	175259	175291	b	b	-
+chr2	175296	175328	b	b	-
+chr2	175450	175482	b	b	-
+chr2	175450	175482	b	b	-
+chr2	175450	175482	b	b	-
+chr2	175553	175585	a	a	+
+chr2	175842	175874	b	b	-
+chr2	175930	175962	a	a	+
+chr2	175900	175932	b	b	-
+chr2	175900	175932	b	b	-
+chr2	176128	176160	b	b	-
+chr2	176378	176410	a	a	+
+chr2	176394	176426	a	a	+
+chr2	176484	176516	b	b	-
+chr2	176484	176516	b	b	-
+chr2	176992	177024	b	b	-
+chr2	177154	177186	b	b	-
+chr2	177233	177265	b	b	-
+chr2	177337	177369	b	b	-
+chr2	177337	177369	b	b	-
+chr2	177337	177369	b	b	-
+chr2	177388	177420	a	a	+
+chr2	177391	177423	a	a	+
+chr2	177398	177430	a	a	+
+chr2	177371	177403	b	b	-
+chr2	177406	177438	a	a	+
+chr2	177383	177415	b	b	-
+chr2	177386	177418	b	b	-
+chr2	177442	177474	a	a	+
+chr2	177523	177555	a	a	+
+chr2	177523	177555	a	a	+
+chr2	177523	177555	a	a	+
+chr2	177511	177543	b	b	-
+chr2	177513	177545	b	b	-
+chr2	177523	177555	b	b	-
+chr2	177595	177627	a	a	+
+chr2	177609	177641	a	a	+
+chr2	177626	177658	a	a	+
+chr2	177994	178026	a	a	+
+chr2	178175	178207	b	b	-
+chr2	178484	178516	b	b	-
+chr2	178484	178516	b	b	-
+chr2	180232	180264	b	b	-
+chr2	180366	180398	a	a	+
+chr2	180405	180437	a	a	+
+chr2	180500	180532	b	b	-
+chr2	180540	180572	a	a	+
+chr2	180559	180591	a	a	+
+chr2	180971	181003	b	b	-
+chr2	181018	181050	a	a	+
+chr2	180997	181029	b	b	-
+chr2	181163	181195	b	b	-
+chr2	181172	181204	b	b	-
+chr2	181178	181210	b	b	-
+chr2	181350	181382	a	a	+
+chr2	181351	181383	a	a	+
+chr2	181351	181383	a	a	+
+chr2	181351	181383	a	a	+
+chr2	181351	181383	a	a	+
+chr2	181323	181355	b	b	-
+chr2	181323	181355	b	b	-
+chr2	181356	181388	a	a	+
+chr2	181359	181391	a	a	+
+chr2	181359	181391	a	a	+
+chr2	181330	181362	b	b	-
+chr2	181363	181395	a	a	+
+chr2	181363	181395	a	a	+
+chr2	181364	181396	a	a	+
+chr2	181366	181398	a	a	+
+chr2	181334	181366	b	b	-
+chr2	181335	181367	b	b	-
+chr2	181335	181367	b	b	-
+chr2	181335	181367	b	b	-
+chr2	181336	181368	b	b	-
+chr2	181371	181403	a	a	+
+chr2	181371	181403	a	a	+
+chr2	181371	181403	a	a	+
+chr2	181348	181380	b	b	-
+chr2	181348	181380	b	b	-
+chr2	181348	181380	b	b	-
+chr2	181349	181381	b	b	-
+chr2	181349	181381	b	b	-
+chr2	181352	181384	b	b	-
+chr2	181353	181385	b	b	-
+chr2	181353	181385	b	b	-
+chr2	181360	181392	b	b	-
+chr2	181424	181456	a	a	+
+chr2	181583	181615	b	b	-
+chr2	181585	181617	b	b	-
+chr2	181644	181676	a	a	+
+chr2	181652	181684	a	a	+
+chr2	181911	181943	a	a	+
+chr2	181885	181917	b	b	-
+chr2	181928	181960	a	a	+
+chr2	181925	181957	b	b	-
+chr2	181992	182024	b	b	-
+chr2	182024	182056	b	b	-
+chr2	182024	182056	b	b	-
+chr2	182058	182090	a	a	+
+chr2	182063	182095	a	a	+
+chr2	182066	182098	a	a	+
+chr2	182066	182098	a	a	+
+chr2	182066	182098	a	a	+
+chr2	182034	182066	b	b	-
+chr2	182034	182066	b	b	-
+chr2	182034	182066	b	b	-
+chr2	182067	182099	a	a	+
+chr2	182067	182099	a	a	+
+chr2	182067	182099	a	a	+
+chr2	182071	182103	a	a	+
+chr2	182044	182076	b	b	-
+chr2	182044	182076	b	b	-
+chr2	182044	182076	b	b	-
+chr2	182044	182076	b	b	-
+chr2	182079	182111	a	a	+
+chr2	182049	182081	b	b	-
+chr2	182053	182085	b	b	-
+chr2	182087	182119	a	a	+
+chr2	182066	182098	b	b	-
+chr2	182249	182281	b	b	-
+chr2	182249	182281	b	b	-
+chr2	182343	182375	a	a	+
+chr2	182343	182375	a	a	+
+chr2	182312	182344	b	b	-
+chr2	182345	182377	a	a	+
+chr2	182318	182350	b	b	-
+chr2	182357	182389	a	a	+
+chr2	182328	182360	b	b	-
+chr2	182331	182363	b	b	-
+chr2	182332	182364	b	b	-
+chr2	182336	182368	b	b	-
+chr2	182339	182371	b	b	-
+chr2	182344	182376	b	b	-
+chr2	182512	182544	a	a	+
+chr2	182528	182560	a	a	+
+chr2	182528	182560	a	a	+
+chr2	182528	182560	a	a	+
+chr2	182518	182550	b	b	-
+chr2	182641	182673	b	b	-
+chr2	182641	182673	b	b	-
+chr2	182712	182744	a	a	+
+chr2	182684	182716	b	b	-
+chr2	182871	182903	b	b	-
+chr2	183003	183035	a	a	+
+chr2	182993	183025	b	b	-
+chr2	183029	183061	a	a	+
+chr2	183008	183040	b	b	-
+chr2	183064	183096	a	a	+
+chr2	183228	183260	a	a	+
+chr2	183709	183741	a	a	+
+chr2	183825	183857	a	a	+
+chr2	183977	184009	a	a	+
+chr2	184305	184337	b	b	-
+chr2	184340	184372	a	a	+
+chr2	184313	184345	b	b	-
+chr2	184313	184345	b	b	-
+chr2	184349	184381	a	a	+
+chr2	184321	184353	b	b	-
+chr2	184354	184386	a	a	+
+chr2	184324	184356	b	b	-
+chr2	184328	184360	b	b	-
+chr2	184328	184360	b	b	-
+chr2	184329	184361	b	b	-
+chr2	184365	184397	a	a	+
+chr2	184368	184400	a	a	+
+chr2	184369	184401	a	a	+
+chr2	184338	184370	b	b	-
+chr2	184340	184372	b	b	-
+chr2	184342	184374	b	b	-
+chr2	184345	184377	b	b	-
+chr2	184378	184410	a	a	+
+chr2	184347	184379	b	b	-
+chr2	184356	184388	b	b	-
+chr2	184356	184388	b	b	-
+chr2	184392	184424	a	a	+
+chr2	184417	184449	a	a	+
+chr2	184484	184516	b	b	-
+chr2	184487	184519	b	b	-
+chr2	184530	184562	a	a	+
+chr2	184537	184569	a	a	+
+chr2	184537	184569	a	a	+
+chr2	184537	184569	a	a	+
+chr2	184508	184540	b	b	-
+chr2	184515	184547	b	b	-
+chr2	184557	184589	a	a	+
+chr2	184548	184580	b	b	-
+chr2	184565	184597	b	b	-
+chr2	184594	184626	b	b	-
+chr2	184594	184626	b	b	-
+chr2	184694	184726	a	a	+
+chr2	184694	184726	a	a	+
+chr2	184683	184715	b	b	-
+chr2	184691	184723	b	b	-
+chr2	184728	184760	a	a	+
+chr2	184711	184743	b	b	-
+chr2	184748	184780	a	a	+
+chr2	184766	184798	a	a	+
+chr2	184867	184899	a	a	+
+chr2	184856	184888	b	b	-
+chr2	184914	184946	a	a	+
+chr2	184907	184939	b	b	-
+chr2	184941	184973	a	a	+
+chr2	185005	185037	b	b	-
+chr2	185008	185040	b	b	-
+chr2	185041	185073	a	a	+
+chr2	185030	185062	b	b	-
+chr2	185067	185099	a	a	+
+chr2	185079	185111	a	a	+
+chr2	185062	185094	b	b	-
+chr2	185100	185132	a	a	+
+chr2	185100	185132	a	a	+
+chr2	185100	185132	a	a	+
+chr2	185104	185136	a	a	+
+chr2	185104	185136	a	a	+
+chr2	185144	185176	a	a	+
+chr2	185168	185200	b	b	-
+chr2	185213	185245	b	b	-
+chr2	185280	185312	a	a	+
+chr2	185404	185436	b	b	-
+chr2	185593	185625	a	a	+
+chr2	185604	185636	a	a	+
+chr2	185604	185636	a	a	+
+chr2	185583	185615	b	b	-
+chr2	185693	185725	a	a	+
+chr2	185714	185746	a	a	+
+chr2	185714	185746	a	a	+
+chr2	185724	185756	b	b	-
+chr2	185770	185802	a	a	+
+chr2	185770	185802	a	a	+
+chr2	185772	185804	a	a	+
+chr2	185746	185778	b	b	-
+chr2	185799	185831	a	a	+
+chr2	185767	185799	b	b	-
+chr2	185837	185869	a	a	+
+chr2	186012	186044	b	b	-
+chr2	186072	186104	b	b	-
+chr2	186128	186160	b	b	-
+chr2	186279	186311	a	a	+
+chr2	186248	186280	b	b	-
+chr2	186251	186283	b	b	-
+chr2	186252	186284	b	b	-
+chr2	186252	186284	b	b	-
+chr2	186286	186318	a	a	+
+chr2	186291	186323	a	a	+
+chr2	186291	186323	a	a	+
+chr2	186299	186331	a	a	+
+chr2	186299	186331	a	a	+
+chr2	186300	186332	a	a	+
+chr2	186275	186307	b	b	-
+chr2	186277	186309	b	b	-
+chr2	186277	186309	b	b	-
+chr2	186317	186349	a	a	+
+chr2	186324	186356	a	a	+
+chr2	186407	186439	b	b	-
+chr2	186407	186439	b	b	-
+chr2	186412	186444	b	b	-
+chr2	186415	186447	b	b	-
+chr2	186427	186459	b	b	-
+chr2	186460	186492	a	a	+
+chr2	186461	186493	a	a	+
+chr2	186461	186493	a	a	+
+chr2	186437	186469	b	b	-
+chr2	186440	186472	b	b	-
+chr2	186443	186475	b	b	-
+chr2	186443	186475	b	b	-
+chr2	186443	186475	b	b	-
+chr2	186443	186475	b	b	-
+chr2	186443	186475	b	b	-
+chr2	186448	186480	b	b	-
+chr2	186451	186483	b	b	-
+chr2	186506	186538	a	a	+
+chr2	186528	186560	a	a	+
+chr2	186690	186722	b	b	-
+chr2	186735	186767	a	a	+
+chr2	186746	186778	a	a	+
+chr2	186714	186746	b	b	-
+chr2	186725	186757	b	b	-
+chr2	186729	186761	b	b	-
+chr2	186731	186763	b	b	-
+chr2	186736	186768	b	b	-
+chr2	186741	186773	b	b	-
+chr2	186741	186773	b	b	-
+chr2	186810	186842	a	a	+
+chr2	186889	186921	b	b	-
+chr2	186935	186967	a	a	+
+chr2	186922	186954	b	b	-
+chr2	187224	187256	a	a	+
+chr2	187233	187265	b	b	-
+chr2	187233	187265	b	b	-
+chr2	187315	187347	a	a	+
+chr2	187599	187631	b	b	-
+chr2	187788	187820	b	b	-
+chr2	187858	187890	a	a	+
+chr2	188022	188054	a	a	+
+chr2	188089	188121	a	a	+
+chr2	188172	188204	a	a	+
+chr2	188172	188204	a	a	+
+chr2	188400	188432	b	b	-
+chr2	188461	188493	a	a	+
+chr2	188460	188492	b	b	-
+chr2	188460	188492	b	b	-
+chr2	188460	188492	b	b	-
+chr2	188463	188495	b	b	-
+chr2	188472	188504	b	b	-
+chr2	188511	188543	b	b	-
+chr2	188564	188596	b	b	-
+chr2	188599	188631	a	a	+
+chr2	188632	188664	a	a	+
+chr2	188726	188758	a	a	+
+chr2	188744	188776	a	a	+
+chr2	188976	189008	a	a	+
+chr2	189487	189519	a	a	+
+chr2	189651	189683	a	a	+
+chr2	189721	189753	a	a	+
+chr2	189711	189743	b	b	-
+chr2	189773	189805	a	a	+
+chr2	190009	190041	a	a	+
+chr2	190179	190211	a	a	+
+chr2	190308	190340	a	a	+
+chr2	190420	190452	b	b	-
+chr2	190626	190658	a	a	+
+chr2	190917	190949	b	b	-
+chr2	191081	191113	a	a	+
+chr2	191237	191269	a	a	+
+chr2	191330	191362	b	b	-
+chr2	191422	191454	a	a	+
+chr2	191577	191609	a	a	+
+chr2	191703	191735	a	a	+
+chr2	191703	191735	a	a	+
+chr2	191716	191748	a	a	+
+chr2	191716	191748	a	a	+
+chr2	191692	191724	b	b	-
+chr2	191692	191724	b	b	-
+chr2	191699	191731	b	b	-
+chr2	191702	191734	b	b	-
+chr2	191702	191734	b	b	-
+chr2	191737	191769	a	a	+
+chr2	191740	191772	a	a	+
+chr2	191741	191773	a	a	+
+chr2	191754	191786	a	a	+
+chr2	192001	192033	a	a	+
+chr2	191969	192001	b	b	-
+chr2	192003	192035	a	a	+
+chr2	192035	192067	a	a	+
+chr2	192351	192383	a	a	+
+chr2	192507	192539	b	b	-
+chr2	192553	192585	a	a	+
+chr2	192553	192585	a	a	+
+chr2	192522	192554	b	b	-
+chr2	192522	192554	b	b	-
+chr2	192525	192557	b	b	-
+chr2	192588	192620	a	a	+
+chr2	192696	192728	a	a	+
+chr2	192758	192790	b	b	-
+chr2	193178	193210	b	b	-
+chr2	193188	193220	b	b	-
+chr2	193233	193265	a	a	+
+chr2	193316	193348	a	a	+
+chr2	193289	193321	b	b	-
+chr2	193350	193382	a	a	+
+chr2	193350	193382	a	a	+
+chr2	193354	193386	a	a	+
+chr2	193361	193393	a	a	+
+chr2	193375	193407	a	a	+
+chr2	193397	193429	b	b	-
+chr2	193812	193844	b	b	-
+chr2	193816	193848	b	b	-
+chr2	193826	193858	b	b	-
+chr2	193834	193866	b	b	-
+chr2	193845	193877	b	b	-
+chr2	193896	193928	a	a	+
+chr2	193898	193930	a	a	+
+chr2	193866	193898	b	b	-
+chr2	193867	193899	b	b	-
+chr2	193868	193900	b	b	-
+chr2	193921	193953	a	a	+
+chr2	193924	193956	a	a	+
+chr2	193924	193956	a	a	+
+chr2	193927	193959	a	a	+
+chr2	193928	193960	a	a	+
+chr2	193928	193960	a	a	+
+chr2	193896	193928	b	b	-
+chr2	193896	193928	b	b	-
+chr2	193896	193928	b	b	-
+chr2	193896	193928	b	b	-
+chr2	193897	193929	b	b	-
+chr2	193900	193932	b	b	-
+chr2	193933	193965	a	a	+
+chr2	193906	193938	b	b	-
+chr2	193906	193938	b	b	-
+chr2	193906	193938	b	b	-
+chr2	193939	193971	a	a	+
+chr2	193945	193977	a	a	+
+chr2	193946	193978	a	a	+
+chr2	193946	193978	a	a	+
+chr2	193946	193978	a	a	+
+chr2	193921	193953	b	b	-
+chr2	193922	193954	b	b	-
+chr2	193922	193954	b	b	-
+chr2	193922	193954	b	b	-
+chr2	193922	193954	b	b	-
+chr2	193922	193954	b	b	-
+chr2	193958	193990	a	a	+
+chr2	193926	193958	b	b	-
+chr2	193960	193992	a	a	+
+chr2	193961	193993	a	a	+
+chr2	193965	193997	a	a	+
+chr2	193968	194000	a	a	+
+chr2	193969	194001	a	a	+
+chr2	193978	194010	a	a	+
+chr2	193958	193990	b	b	-
+chr2	193995	194027	a	a	+
+chr2	193963	193995	b	b	-
+chr2	194113	194145	a	a	+
+chr2	194113	194145	a	a	+
+chr2	194144	194176	a	a	+
+chr2	194189	194221	a	a	+
+chr2	194182	194214	b	b	-
+chr2	194231	194263	a	a	+
+chr2	194259	194291	a	a	+
+chr2	194268	194300	a	a	+
+chr2	194256	194288	b	b	-
+chr2	194263	194295	b	b	-
+chr2	194365	194397	b	b	-
+chr2	194397	194429	b	b	-
+chr2	194397	194429	b	b	-
+chr2	194454	194486	a	a	+
+chr2	194462	194494	a	a	+
+chr2	194463	194495	a	a	+
+chr2	194470	194502	a	a	+
+chr2	194471	194503	a	a	+
+chr2	194472	194504	a	a	+
+chr2	194448	194480	b	b	-
+chr2	194519	194551	b	b	-
+chr2	194557	194589	b	b	-
+chr2	194584	194616	b	b	-
+chr2	194591	194623	b	b	-
+chr2	194630	194662	a	a	+
+chr2	194631	194663	a	a	+
+chr2	194650	194682	a	a	+
+chr2	194772	194804	a	a	+
+chr2	194773	194805	a	a	+
+chr2	194773	194805	a	a	+
+chr2	194773	194805	a	a	+
+chr2	194749	194781	b	b	-
+chr2	194796	194828	a	a	+
+chr2	194766	194798	b	b	-
+chr2	194817	194849	a	a	+
+chr2	194805	194837	b	b	-
+chr2	194807	194839	b	b	-
+chr2	194951	194983	b	b	-
+chr2	195160	195192	b	b	-
+chr2	195205	195237	a	a	+
+chr2	195209	195241	a	a	+
+chr2	195316	195348	a	a	+
+chr2	195372	195404	a	a	+
+chr2	195372	195404	a	a	+
+chr2	195496	195528	b	b	-
+chr2	195531	195563	a	a	+
+chr2	195517	195549	b	b	-
+chr2	195538	195570	b	b	-
+chr2	195599	195631	a	a	+
+chr2	195696	195728	a	a	+
+chr2	195717	195749	a	a	+
+chr2	195749	195781	a	a	+
+chr2	195870	195902	a	a	+
+chr2	195870	195902	a	a	+
+chr2	195998	196030	b	b	-
+chr2	195998	196030	b	b	-
+chr2	196055	196087	a	a	+
+chr2	196058	196090	a	a	+
+chr2	196030	196062	b	b	-
+chr2	196064	196096	a	a	+
+chr2	196066	196098	a	a	+
+chr2	196069	196101	a	a	+
+chr2	196071	196103	a	a	+
+chr2	196074	196106	a	a	+
+chr2	196078	196110	a	a	+
+chr2	196079	196111	a	a	+
+chr2	196047	196079	b	b	-
+chr2	196048	196080	b	b	-
+chr2	196084	196116	a	a	+
+chr2	196089	196121	a	a	+
+chr2	196091	196123	a	a	+
+chr2	196092	196124	a	a	+
+chr2	196096	196128	a	a	+
+chr2	196068	196100	b	b	-
+chr2	196083	196115	b	b	-
+chr2	196084	196116	b	b	-
+chr2	196278	196310	a	a	+
+chr2	196278	196310	a	a	+
+chr2	196279	196311	a	a	+
+chr2	196315	196347	a	a	+
+chr2	196320	196352	a	a	+
+chr2	196325	196357	a	a	+
+chr2	196332	196364	a	a	+
+chr2	196333	196365	a	a	+
+chr2	196333	196365	a	a	+
+chr2	196333	196365	a	a	+
+chr2	196333	196365	a	a	+
+chr2	196304	196336	b	b	-
+chr2	196307	196339	b	b	-
+chr2	196345	196377	a	a	+
+chr2	196346	196378	a	a	+
+chr2	196346	196378	a	a	+
+chr2	196315	196347	b	b	-
+chr2	196352	196384	a	a	+
+chr2	196354	196386	a	a	+
+chr2	196354	196386	a	a	+
+chr2	196323	196355	b	b	-
+chr2	196359	196391	a	a	+
+chr2	196359	196391	a	a	+
+chr2	196327	196359	b	b	-
+chr2	196364	196396	a	a	+
+chr2	196364	196396	a	a	+
+chr2	196364	196396	a	a	+
+chr2	196364	196396	a	a	+
+chr2	196364	196396	a	a	+
+chr2	196369	196401	a	a	+
+chr2	196340	196372	b	b	-
+chr2	196488	196520	a	a	+
+chr2	196488	196520	a	a	+
+chr2	196464	196496	b	b	-
+chr2	196508	196540	a	a	+
+chr2	196487	196519	b	b	-
+chr2	196522	196554	a	a	+
+chr2	196522	196554	a	a	+
+chr2	196530	196562	a	a	+
+chr2	196530	196562	a	a	+
+chr2	196532	196564	a	a	+
+chr2	196500	196532	b	b	-
+chr2	196538	196570	a	a	+
+chr2	196644	196676	b	b	-
+chr2	196644	196676	b	b	-
+chr2	196644	196676	b	b	-
+chr2	196738	196770	b	b	-
+chr2	196808	196840	b	b	-
+chr2	196842	196874	a	a	+
+chr2	196811	196843	b	b	-
+chr2	196815	196847	b	b	-
+chr2	196851	196883	a	a	+
+chr2	196854	196886	a	a	+
+chr2	196859	196891	a	a	+
+chr2	196833	196865	b	b	-
+chr2	197162	197194	b	b	-
+chr2	197341	197373	a	a	+
+chr2	197709	197741	b	b	-
+chr2	197713	197745	b	b	-
+chr2	197713	197745	b	b	-
+chr2	197713	197745	b	b	-
+chr2	197735	197767	b	b	-
+chr2	197735	197767	b	b	-
+chr2	197737	197769	b	b	-
+chr2	197737	197769	b	b	-
+chr2	197740	197772	b	b	-
+chr2	197745	197777	b	b	-
+chr2	197745	197777	b	b	-
+chr2	197745	197777	b	b	-
+chr2	197745	197777	b	b	-
+chr2	197745	197777	b	b	-
+chr2	197745	197777	b	b	-
+chr2	197746	197778	b	b	-
+chr2	197746	197778	b	b	-
+chr2	197746	197778	b	b	-
+chr2	197747	197779	b	b	-
+chr2	197747	197779	b	b	-
+chr2	197750	197782	b	b	-
+chr2	197750	197782	b	b	-
+chr2	197752	197784	b	b	-
+chr2	197752	197784	b	b	-
+chr2	197752	197784	b	b	-
+chr2	197790	197822	a	a	+
+chr2	197790	197822	a	a	+
+chr2	197794	197826	a	a	+
+chr2	197762	197794	b	b	-
+chr2	197796	197828	a	a	+
+chr2	197765	197797	b	b	-
+chr2	197780	197812	b	b	-
+chr2	197813	197845	a	a	+
+chr2	197792	197824	b	b	-
+chr2	197825	197857	a	a	+
+chr2	197799	197831	b	b	-
+chr2	197801	197833	b	b	-
+chr2	197801	197833	b	b	-
+chr2	197801	197833	b	b	-
+chr2	197801	197833	b	b	-
+chr2	197801	197833	b	b	-
+chr2	197801	197833	b	b	-
+chr2	197802	197834	b	b	-
+chr2	197802	197834	b	b	-
+chr2	197802	197834	b	b	-
+chr2	197803	197835	b	b	-
+chr2	197838	197870	a	a	+
+chr2	197806	197838	b	b	-
+chr2	197809	197841	b	b	-
+chr2	197814	197846	b	b	-
+chr2	197815	197847	b	b	-
+chr2	197815	197847	b	b	-
+chr2	197848	197880	a	a	+
+chr2	197849	197881	a	a	+
+chr2	197849	197881	a	a	+
+chr2	197817	197849	b	b	-
+chr2	197817	197849	b	b	-
+chr2	197850	197882	a	a	+
+chr2	197850	197882	a	a	+
+chr2	197851	197883	a	a	+
+chr2	197821	197853	b	b	-
+chr2	197822	197854	b	b	-
+chr2	197855	197887	a	a	+
+chr2	197855	197887	a	a	+
+chr2	197856	197888	a	a	+
+chr2	197857	197889	a	a	+
+chr2	197857	197889	a	a	+
+chr2	197826	197858	b	b	-
+chr2	197827	197859	b	b	-
+chr2	197861	197893	a	a	+
+chr2	197861	197893	a	a	+
+chr2	197861	197893	a	a	+
+chr2	197861	197893	a	a	+
+chr2	197861	197893	a	a	+
+chr2	197864	197896	a	a	+
+chr2	197835	197867	b	b	-
+chr2	197836	197868	b	b	-
+chr2	197869	197901	a	a	+
+chr2	197871	197903	a	a	+
+chr2	197840	197872	b	b	-
+chr2	197876	197908	a	a	+
+chr2	197878	197910	a	a	+
+chr2	197878	197910	a	a	+
+chr2	197878	197910	a	a	+
+chr2	197886	197918	a	a	+
+chr2	197891	197923	a	a	+
+chr2	197893	197925	a	a	+
+chr2	197861	197893	b	b	-
+chr2	197862	197894	b	b	-
+chr2	197862	197894	b	b	-
+chr2	197895	197927	a	a	+
+chr2	197864	197896	b	b	-
+chr2	197864	197896	b	b	-
+chr2	197902	197934	a	a	+
+chr2	197909	197941	a	a	+
+chr2	197910	197942	a	a	+
+chr2	197910	197942	a	a	+
+chr2	197910	197942	a	a	+
+chr2	197910	197942	a	a	+
+chr2	197887	197919	b	b	-
+chr2	197887	197919	b	b	-
+chr2	197890	197922	b	b	-
+chr2	197891	197923	b	b	-
+chr2	197891	197923	b	b	-
+chr2	197892	197924	b	b	-
+chr2	197927	197959	a	a	+
+chr2	197898	197930	b	b	-
+chr2	197898	197930	b	b	-
+chr2	197898	197930	b	b	-
+chr2	197900	197932	b	b	-
+chr2	197934	197966	a	a	+
+chr2	197938	197970	a	a	+
+chr2	197910	197942	b	b	-
+chr2	197912	197944	b	b	-
+chr2	197912	197944	b	b	-
+chr2	197946	197978	a	a	+
+chr2	197947	197979	a	a	+
+chr2	197947	197979	a	a	+
+chr2	197955	197987	a	a	+
+chr2	197936	197968	b	b	-
+chr2	197944	197976	b	b	-
+chr2	197949	197981	b	b	-
+chr2	197952	197984	b	b	-
+chr2	197988	198020	a	a	+
+chr2	197988	198020	a	a	+
+chr2	197993	198025	a	a	+
+chr2	197968	198000	b	b	-
+chr2	197972	198004	b	b	-
+chr2	198009	198041	a	a	+
+chr2	198011	198043	a	a	+
+chr2	198011	198043	a	a	+
+chr2	198011	198043	a	a	+
+chr2	198011	198043	a	a	+
+chr2	198011	198043	a	a	+
+chr2	198012	198044	a	a	+
+chr2	198012	198044	a	a	+
+chr2	198013	198045	a	a	+
+chr2	198013	198045	a	a	+
+chr2	198014	198046	a	a	+
+chr2	198014	198046	a	a	+
+chr2	198014	198046	a	a	+
+chr2	198015	198047	a	a	+
+chr2	198015	198047	a	a	+
+chr2	198015	198047	a	a	+
+chr2	198015	198047	a	a	+
+chr2	198015	198047	a	a	+
+chr2	198015	198047	a	a	+
+chr2	198015	198047	a	a	+
+chr2	198015	198047	a	a	+
+chr2	198018	198050	a	a	+
+chr2	198018	198050	a	a	+
+chr2	198018	198050	a	a	+
+chr2	198018	198050	a	a	+
+chr2	198018	198050	a	a	+
+chr2	198019	198051	a	a	+
+chr2	198021	198053	a	a	+
+chr2	198023	198055	a	a	+
+chr2	198023	198055	a	a	+
+chr2	198023	198055	a	a	+
+chr2	198043	198075	a	a	+
+chr2	198046	198078	a	a	+
+chr2	198026	198058	b	b	-
+chr2	198073	198105	b	b	-
+chr2	198157	198189	a	a	+
+chr2	198253	198285	a	a	+
+chr2	198272	198304	a	a	+
+chr2	198287	198319	a	a	+
+chr2	198287	198319	a	a	+
+chr2	198280	198312	b	b	-
+chr2	198280	198312	b	b	-
+chr2	198542	198574	a	a	+
+chr2	198510	198542	b	b	-
+chr2	198557	198589	a	a	+
+chr2	198527	198559	b	b	-
+chr2	198527	198559	b	b	-
+chr2	198574	198606	a	a	+
+chr2	198550	198582	b	b	-
+chr2	198641	198673	b	b	-
+chr2	198651	198683	b	b	-
+chr2	198652	198684	b	b	-
+chr2	198695	198727	a	a	+
+chr2	198709	198741	a	a	+
+chr2	198678	198710	b	b	-
+chr2	198682	198714	b	b	-
+chr2	198700	198732	b	b	-
+chr2	198735	198767	a	a	+
+chr2	198735	198767	a	a	+
+chr2	198735	198767	a	a	+
+chr2	198735	198767	a	a	+
+chr2	198735	198767	a	a	+
+chr2	198739	198771	a	a	+
+chr2	198775	198807	a	a	+
+chr2	198925	198957	a	a	+
+chr2	198909	198941	b	b	-
+chr2	198927	198959	b	b	-
+chr2	199215	199247	a	a	+
+chr2	199215	199247	a	a	+
+chr2	199439	199471	b	b	-
+chr2	199840	199872	a	a	+
+chr2	199840	199872	a	a	+
+chr2	200123	200155	b	b	-
+chr2	200186	200218	a	a	+
+chr2	200303	200335	a	a	+
+chr2	200619	200651	b	b	-
+chr2	200909	200941	a	a	+
+chr2	200990	201022	a	a	+
+chr2	201038	201070	a	a	+
+chr2	201275	201307	a	a	+
+chr2	201401	201433	a	a	+
+chr2	201376	201408	b	b	-
+chr2	201435	201467	a	a	+
+chr2	201549	201581	a	a	+
+chr2	201550	201582	a	a	+
+chr2	201529	201561	b	b	-
+chr2	201562	201594	a	a	+
+chr2	201540	201572	b	b	-
+chr2	201540	201572	b	b	-
+chr2	201550	201582	b	b	-
+chr2	201550	201582	b	b	-
+chr2	201657	201689	b	b	-
+chr2	201666	201698	b	b	-
+chr2	201669	201701	b	b	-
+chr2	201673	201705	b	b	-
+chr2	201673	201705	b	b	-
+chr2	201676	201708	b	b	-
+chr2	201681	201713	b	b	-
+chr2	201715	201747	a	a	+
+chr2	201715	201747	a	a	+
+chr2	201715	201747	a	a	+
+chr2	201684	201716	b	b	-
+chr2	201688	201720	b	b	-
+chr2	201689	201721	b	b	-
+chr2	201689	201721	b	b	-
+chr2	201722	201754	a	a	+
+chr2	201722	201754	a	a	+
+chr2	201690	201722	b	b	-
+chr2	201691	201723	b	b	-
+chr2	201691	201723	b	b	-
+chr2	201691	201723	b	b	-
+chr2	201691	201723	b	b	-
+chr2	201691	201723	b	b	-
+chr2	201692	201724	b	b	-
+chr2	201725	201757	a	a	+
+chr2	201726	201758	a	a	+
+chr2	201726	201758	a	a	+
+chr2	201726	201758	a	a	+
+chr2	201694	201726	b	b	-
+chr2	201694	201726	b	b	-
+chr2	201694	201726	b	b	-
+chr2	201694	201726	b	b	-
+chr2	201694	201726	b	b	-
+chr2	201728	201760	a	a	+
+chr2	201696	201728	b	b	-
+chr2	201696	201728	b	b	-
+chr2	201696	201728	b	b	-
+chr2	201696	201728	b	b	-
+chr2	201696	201728	b	b	-
+chr2	201730	201762	a	a	+
+chr2	201730	201762	a	a	+
+chr2	201700	201732	b	b	-
+chr2	201700	201732	b	b	-
+chr2	201733	201765	a	a	+
+chr2	201701	201733	b	b	-
+chr2	201701	201733	b	b	-
+chr2	201734	201766	a	a	+
+chr2	201702	201734	b	b	-
+chr2	201735	201767	a	a	+
+chr2	201736	201768	a	a	+
+chr2	201706	201738	b	b	-
+chr2	201739	201771	a	a	+
+chr2	201739	201771	a	a	+
+chr2	201739	201771	a	a	+
+chr2	201742	201774	a	a	+
+chr2	201710	201742	b	b	-
+chr2	201710	201742	b	b	-
+chr2	201710	201742	b	b	-
+chr2	201746	201778	a	a	+
+chr2	201746	201778	a	a	+
+chr2	201750	201782	a	a	+
+chr2	201751	201783	a	a	+
+chr2	201751	201783	a	a	+
+chr2	201751	201783	a	a	+
+chr2	201751	201783	a	a	+
+chr2	201755	201787	a	a	+
+chr2	201763	201795	a	a	+
+chr2	201765	201797	a	a	+
+chr2	201746	201778	b	b	-
+chr2	201746	201778	b	b	-
+chr2	201747	201779	b	b	-
+chr2	201790	201822	a	a	+
+chr2	201760	201792	b	b	-
+chr2	201780	201812	b	b	-
+chr2	201968	202000	b	b	-
+chr2	202021	202053	a	a	+
+chr2	202022	202054	a	a	+
+chr2	202034	202066	a	a	+
+chr2	202005	202037	b	b	-
+chr2	202007	202039	b	b	-
+chr2	202007	202039	b	b	-
+chr2	202007	202039	b	b	-
+chr2	202007	202039	b	b	-
+chr2	202007	202039	b	b	-
+chr2	202017	202049	b	b	-
+chr2	202050	202082	a	a	+
+chr2	202050	202082	a	a	+
+chr2	202025	202057	b	b	-
+chr2	202031	202063	b	b	-
+chr2	202031	202063	b	b	-
+chr2	202031	202063	b	b	-
+chr2	202076	202108	a	a	+
+chr2	202080	202112	a	a	+
+chr2	202053	202085	b	b	-
+chr2	202058	202090	b	b	-
+chr2	202061	202093	b	b	-
+chr2	202068	202100	b	b	-
+chr2	202074	202106	b	b	-
+chr2	202115	202147	a	a	+
+chr2	202188	202220	b	b	-
+chr2	202191	202223	b	b	-
+chr2	202191	202223	b	b	-
+chr2	202191	202223	b	b	-
+chr2	202226	202258	a	a	+
+chr2	202229	202261	a	a	+
+chr2	202198	202230	b	b	-
+chr2	202235	202267	a	a	+
+chr2	202209	202241	b	b	-
+chr2	202246	202278	a	a	+
+chr2	202215	202247	b	b	-
+chr2	202216	202248	b	b	-
+chr2	202218	202250	b	b	-
+chr2	202223	202255	b	b	-
+chr2	202231	202263	b	b	-
+chr2	202311	202343	a	a	+
+chr2	202595	202627	a	a	+
+chr2	202596	202628	a	a	+
+chr2	202580	202612	b	b	-
+chr2	202580	202612	b	b	-
+chr2	202614	202646	a	a	+
+chr2	202587	202619	b	b	-
+chr2	202587	202619	b	b	-
+chr2	202587	202619	b	b	-
+chr2	202590	202622	b	b	-
+chr2	202624	202656	a	a	+
+chr2	202624	202656	a	a	+
+chr2	202626	202658	a	a	+
+chr2	202626	202658	a	a	+
+chr2	202630	202662	a	a	+
+chr2	202598	202630	b	b	-
+chr2	202600	202632	b	b	-
+chr2	202639	202671	a	a	+
+chr2	202618	202650	b	b	-
+chr2	202618	202650	b	b	-
+chr2	202652	202684	a	a	+
+chr2	202652	202684	a	a	+
+chr2	202654	202686	b	b	-
+chr2	202654	202686	b	b	-
+chr2	202697	202729	a	a	+
+chr2	202802	202834	a	a	+
+chr2	202804	202836	a	a	+
+chr2	202804	202836	a	a	+
+chr2	202804	202836	a	a	+
+chr2	202804	202836	a	a	+
+chr2	202804	202836	a	a	+
+chr2	202808	202840	a	a	+
+chr2	202778	202810	b	b	-
+chr2	202818	202850	a	a	+
+chr2	202831	202863	b	b	-
+chr2	202897	202929	a	a	+
+chr2	202902	202934	a	a	+
+chr2	202889	202921	b	b	-
+chr2	202989	203021	b	b	-
+chr2	203037	203069	b	b	-
+chr2	203037	203069	b	b	-
+chr2	203105	203137	a	a	+
+chr2	203083	203115	b	b	-
+chr2	203175	203207	a	a	+
+chr2	203407	203439	a	a	+
+chr2	203455	203487	a	a	+
+chr2	203469	203501	a	a	+
+chr2	203503	203535	a	a	+
+chr2	203514	203546	a	a	+
+chr2	203483	203515	b	b	-
+chr2	203523	203555	a	a	+
+chr2	203642	203674	a	a	+
+chr2	203643	203675	a	a	+
+chr2	203628	203660	b	b	-
+chr2	203661	203693	a	a	+
+chr2	203629	203661	b	b	-
+chr2	203678	203710	a	a	+
+chr2	203686	203718	a	a	+
+chr2	203686	203718	a	a	+
+chr2	203686	203718	a	a	+
+chr2	203657	203689	b	b	-
+chr2	203695	203727	a	a	+
+chr2	203695	203727	a	a	+
+chr2	203698	203730	a	a	+
+chr2	203698	203730	a	a	+
+chr2	203811	203843	a	a	+
+chr2	203822	203854	a	a	+
+chr2	203809	203841	b	b	-
+chr2	203811	203843	b	b	-
+chr2	203812	203844	b	b	-
+chr2	203948	203980	b	b	-
+chr2	204011	204043	a	a	+
+chr2	204011	204043	a	a	+
+chr2	203982	204014	b	b	-
+chr2	204175	204207	b	b	-
+chr2	204354	204386	b	b	-
+chr2	204712	204744	b	b	-
+chr2	205001	205033	a	a	+
+chr2	205137	205169	b	b	-
+chr2	205305	205337	b	b	-
+chr2	205488	205520	b	b	-
+chr2	205546	205578	a	a	+
+chr2	205526	205558	b	b	-
+chr2	205608	205640	a	a	+
+chr2	205608	205640	a	a	+
+chr2	205625	205657	b	b	-
+chr2	205741	205773	a	a	+
+chr2	205748	205780	a	a	+
+chr2	205749	205781	b	b	-
+chr2	205793	205825	a	a	+
+chr2	205800	205832	a	a	+
+chr2	205768	205800	b	b	-
+chr2	205833	205865	a	a	+
+chr2	205805	205837	b	b	-
+chr2	205966	205998	a	a	+
+chr2	206191	206223	b	b	-
+chr2	206235	206267	a	a	+
+chr2	206373	206405	b	b	-
+chr2	206373	206405	b	b	-
+chr2	206531	206563	a	a	+
+chr2	206542	206574	a	a	+
+chr2	206514	206546	b	b	-
+chr2	206515	206547	b	b	-
+chr2	206552	206584	a	a	+
+chr2	206525	206557	b	b	-
+chr2	206554	206586	b	b	-
+chr2	206687	206719	b	b	-
+chr2	206718	206750	b	b	-
+chr2	206752	206784	a	a	+
+chr2	206846	206878	b	b	-
+chr2	206883	206915	a	a	+
+chr2	206855	206887	b	b	-
+chr2	206888	206920	a	a	+
+chr2	206856	206888	b	b	-
+chr2	206856	206888	b	b	-
+chr2	206856	206888	b	b	-
+chr2	206898	206930	a	a	+
+chr2	206898	206930	a	a	+
+chr2	206898	206930	a	a	+
+chr2	206899	206931	a	a	+
+chr2	206871	206903	b	b	-
+chr2	206871	206903	b	b	-
+chr2	206871	206903	b	b	-
+chr2	206871	206903	b	b	-
+chr2	206871	206903	b	b	-
+chr2	206871	206903	b	b	-
+chr2	206871	206903	b	b	-
+chr2	206871	206903	b	b	-
+chr2	206872	206904	b	b	-
+chr2	206872	206904	b	b	-
+chr2	206906	206938	a	a	+
+chr2	206906	206938	a	a	+
+chr2	206906	206938	a	a	+
+chr2	206874	206906	b	b	-
+chr2	206875	206907	b	b	-
+chr2	206908	206940	a	a	+
+chr2	206908	206940	a	a	+
+chr2	206908	206940	a	a	+
+chr2	206908	206940	a	a	+
+chr2	206908	206940	a	a	+
+chr2	206909	206941	a	a	+
+chr2	206909	206941	a	a	+
+chr2	206877	206909	b	b	-
+chr2	206877	206909	b	b	-
+chr2	206877	206909	b	b	-
+chr2	206877	206909	b	b	-
+chr2	206877	206909	b	b	-
+chr2	206877	206909	b	b	-
+chr2	206877	206909	b	b	-
+chr2	206877	206909	b	b	-
+chr2	206910	206942	a	a	+
+chr2	206910	206942	a	a	+
+chr2	206910	206942	a	a	+
+chr2	206910	206942	a	a	+
+chr2	206910	206942	a	a	+
+chr2	206878	206910	b	b	-
+chr2	206913	206945	a	a	+
+chr2	206881	206913	b	b	-
+chr2	206881	206913	b	b	-
+chr2	206915	206947	a	a	+
+chr2	206916	206948	a	a	+
+chr2	206916	206948	a	a	+
+chr2	206917	206949	a	a	+
+chr2	206917	206949	a	a	+
+chr2	206917	206949	a	a	+
+chr2	206917	206949	a	a	+
+chr2	206917	206949	a	a	+
+chr2	206885	206917	b	b	-
+chr2	206886	206918	b	b	-
+chr2	206886	206918	b	b	-
+chr2	206886	206918	b	b	-
+chr2	206886	206918	b	b	-
+chr2	206919	206951	a	a	+
+chr2	206919	206951	a	a	+
+chr2	206919	206951	a	a	+
+chr2	206919	206951	a	a	+
+chr2	206919	206951	a	a	+
+chr2	206888	206920	b	b	-
+chr2	206891	206923	b	b	-
+chr2	206891	206923	b	b	-
+chr2	206891	206923	b	b	-
+chr2	206891	206923	b	b	-
+chr2	206892	206924	b	b	-
+chr2	206927	206959	a	a	+
+chr2	206928	206960	a	a	+
+chr2	206931	206963	a	a	+
+chr2	206932	206964	a	a	+
+chr2	206935	206967	a	a	+
+chr2	206935	206967	a	a	+
+chr2	206935	206967	a	a	+
+chr2	206903	206935	b	b	-
+chr2	206903	206935	b	b	-
+chr2	206903	206935	b	b	-
+chr2	206903	206935	b	b	-
+chr2	206942	206974	a	a	+
+chr2	206915	206947	b	b	-
+chr2	206958	206990	a	a	+
+chr2	206932	206964	b	b	-
+chr2	207141	207173	a	a	+
+chr2	207139	207171	b	b	-
+chr2	207184	207216	a	a	+
+chr2	207153	207185	b	b	-
+chr2	207187	207219	a	a	+
+chr2	207155	207187	b	b	-
+chr2	207159	207191	b	b	-
+chr2	207159	207191	b	b	-
+chr2	207162	207194	b	b	-
+chr2	207165	207197	b	b	-
+chr2	207208	207240	a	a	+
+chr2	207176	207208	b	b	-
+chr2	207176	207208	b	b	-
+chr2	207176	207208	b	b	-
+chr2	207210	207242	a	a	+
+chr2	207211	207243	a	a	+
+chr2	207211	207243	a	a	+
+chr2	207179	207211	b	b	-
+chr2	207212	207244	a	a	+
+chr2	207213	207245	a	a	+
+chr2	207213	207245	a	a	+
+chr2	207213	207245	a	a	+
+chr2	207213	207245	a	a	+
+chr2	207213	207245	a	a	+
+chr2	207213	207245	a	a	+
+chr2	207181	207213	b	b	-
+chr2	207181	207213	b	b	-
+chr2	207181	207213	b	b	-
+chr2	207181	207213	b	b	-
+chr2	207181	207213	b	b	-
+chr2	207181	207213	b	b	-
+chr2	207181	207213	b	b	-
+chr2	207181	207213	b	b	-
+chr2	207182	207214	b	b	-
+chr2	207182	207214	b	b	-
+chr2	207182	207214	b	b	-
+chr2	207182	207214	b	b	-
+chr2	207183	207215	b	b	-
+chr2	207216	207248	a	a	+
+chr2	207218	207250	a	a	+
+chr2	207219	207251	a	a	+
+chr2	207219	207251	a	a	+
+chr2	207219	207251	a	a	+
+chr2	207219	207251	a	a	+
+chr2	207222	207254	a	a	+
+chr2	207223	207255	a	a	+
+chr2	207197	207229	b	b	-
+chr2	207231	207263	a	a	+
+chr2	207231	207263	a	a	+
+chr2	207231	207263	a	a	+
+chr2	207237	207269	a	a	+
+chr2	207237	207269	a	a	+
+chr2	207237	207269	a	a	+
+chr2	207220	207252	b	b	-
+chr2	207324	207356	b	b	-
+chr2	207339	207371	b	b	-
+chr2	207348	207380	b	b	-
+chr2	207534	207566	b	b	-
+chr2	207571	207603	a	a	+
+chr2	207571	207603	a	a	+
+chr2	207590	207622	a	a	+
+chr2	207858	207890	a	a	+
+chr2	207879	207911	a	a	+
+chr2	207959	207991	b	b	-
+chr2	208006	208038	b	b	-
+chr2	208021	208053	b	b	-
+chr2	208191	208223	b	b	-
+chr2	208292	208324	b	b	-
+chr2	208327	208359	b	b	-
+chr2	208862	208894	a	a	+
+chr2	208881	208913	a	a	+
+chr2	208944	208976	b	b	-
+chr2	209041	209073	a	a	+
+chr2	209016	209048	b	b	-
+chr2	209016	209048	b	b	-
+chr2	209204	209236	a	a	+
+chr2	209219	209251	a	a	+
+chr2	209385	209417	a	a	+
+chr2	209362	209394	b	b	-
+chr2	209376	209408	b	b	-
+chr2	209379	209411	b	b	-
+chr2	209413	209445	a	a	+
+chr2	209390	209422	b	b	-
+chr2	209586	209618	a	a	+
+chr2	209592	209624	a	a	+
+chr2	209613	209645	a	a	+
+chr2	209586	209618	b	b	-
+chr2	209586	209618	b	b	-
+chr2	209621	209653	a	a	+
+chr2	209621	209653	a	a	+
+chr2	209629	209661	a	a	+
+chr2	209629	209661	a	a	+
+chr2	209606	209638	b	b	-
+chr2	209606	209638	b	b	-
+chr2	209606	209638	b	b	-
+chr2	209607	209639	b	b	-
+chr2	209650	209682	a	a	+
+chr2	209651	209683	a	a	+
+chr2	209651	209683	a	a	+
+chr2	209661	209693	a	a	+
+chr2	209717	209749	b	b	-
+chr2	209717	209749	b	b	-
+chr2	209723	209755	b	b	-
+chr2	209780	209812	a	a	+
+chr2	209790	209822	a	a	+
+chr2	209794	209826	a	a	+
+chr2	209763	209795	b	b	-
+chr2	209797	209829	a	a	+
+chr2	209799	209831	a	a	+
+chr2	209773	209805	b	b	-
+chr2	209794	209826	b	b	-
+chr2	209902	209934	b	b	-
+chr2	209902	209934	b	b	-
+chr2	209945	209977	a	a	+
+chr2	209920	209952	b	b	-
+chr2	209928	209960	b	b	-
+chr2	209963	209995	a	a	+
+chr2	209941	209973	b	b	-
+chr2	209974	210006	a	a	+
+chr2	209998	210030	a	a	+
+chr2	210001	210033	b	b	-
+chr2	210068	210100	b	b	-
+chr2	210107	210139	a	a	+
+chr2	210151	210183	a	a	+
+chr2	210165	210197	a	a	+
+chr2	210229	210261	b	b	-
+chr2	210328	210360	a	a	+
+chr2	210408	210440	a	a	+
+chr2	210380	210412	b	b	-
+chr2	210402	210434	b	b	-
+chr2	210437	210469	a	a	+
+chr2	210437	210469	a	a	+
+chr2	210406	210438	b	b	-
+chr2	210406	210438	b	b	-
+chr2	210427	210459	b	b	-
+chr2	210429	210461	b	b	-
+chr2	210447	210479	b	b	-
+chr2	210609	210641	a	a	+
+chr2	210615	210647	b	b	-
+chr2	210624	210656	b	b	-
+chr2	210655	210687	b	b	-
+chr2	210967	210999	a	a	+
+chr2	210953	210985	b	b	-
+chr2	210953	210985	b	b	-
+chr2	211431	211463	a	a	+
+chr2	211586	211618	a	a	+
+chr2	211614	211646	a	a	+
+chr2	211794	211826	b	b	-
+chr2	211798	211830	b	b	-
+chr2	212032	212064	a	a	+
+chr2	212142	212174	b	b	-
+chr2	212175	212207	a	a	+
+chr2	212155	212187	b	b	-
+chr2	212256	212288	b	b	-
+chr2	212389	212421	a	a	+
+chr2	212389	212421	a	a	+
+chr2	212719	212751	a	a	+
+chr2	213103	213135	a	a	+
+chr2	213163	213195	a	a	+
+chr2	213163	213195	a	a	+
+chr2	213163	213195	a	a	+
+chr2	213470	213502	a	a	+
+chr2	213558	213590	a	a	+
+chr2	214663	214695	a	a	+
+chr2	214776	214808	a	a	+
+chr2	214821	214853	a	a	+
+chr2	214832	214864	b	b	-
+chr2	215099	215131	b	b	-
+chr2	215570	215602	a	a	+
+chr2	215582	215614	a	a	+
+chr2	215582	215614	a	a	+
+chr2	215824	215856	b	b	-
+chr2	215953	215985	a	a	+
+chr2	216050	216082	a	a	+
+chr2	216051	216083	a	a	+
+chr2	216051	216083	a	a	+
+chr2	216051	216083	a	a	+
+chr2	216051	216083	a	a	+
+chr2	216051	216083	a	a	+
+chr2	216052	216084	a	a	+
+chr2	216020	216052	b	b	-
+chr2	216120	216152	b	b	-
+chr2	216151	216183	b	b	-
+chr2	216213	216245	a	a	+
+chr2	216213	216245	a	a	+
+chr2	216214	216246	a	a	+
+chr2	216187	216219	b	b	-
+chr2	216190	216222	b	b	-
+chr2	216190	216222	b	b	-
+chr2	216202	216234	b	b	-
+chr2	216236	216268	a	a	+
+chr2	216236	216268	a	a	+
+chr2	216205	216237	b	b	-
+chr2	216223	216255	b	b	-
+chr2	216259	216291	a	a	+
+chr2	216259	216291	a	a	+
+chr2	216259	216291	a	a	+
+chr2	216243	216275	b	b	-
+chr2	216288	216320	a	a	+
+chr2	216352	216384	a	a	+
+chr2	216322	216354	b	b	-
+chr2	216355	216387	a	a	+
+chr2	216355	216387	a	a	+
+chr2	216359	216391	a	a	+
+chr2	216328	216360	b	b	-
+chr2	216366	216398	a	a	+
+chr2	216334	216366	b	b	-
+chr2	216369	216401	a	a	+
+chr2	216337	216369	b	b	-
+chr2	216337	216369	b	b	-
+chr2	216338	216370	b	b	-
+chr2	216381	216413	a	a	+
+chr2	216381	216413	a	a	+
+chr2	216385	216417	a	a	+
+chr2	216385	216417	a	a	+
+chr2	216386	216418	a	a	+
+chr2	216364	216396	b	b	-
+chr2	216373	216405	b	b	-
+chr2	216373	216405	b	b	-
+chr2	216867	216899	b	b	-
+chr2	216917	216949	a	a	+
+chr2	216951	216983	a	a	+
+chr2	216951	216983	a	a	+
+chr2	216999	217031	b	b	-
+chr2	217058	217090	a	a	+
+chr2	217079	217111	a	a	+
+chr2	217096	217128	a	a	+
+chr2	217064	217096	b	b	-
+chr2	217064	217096	b	b	-
+chr2	217104	217136	a	a	+
+chr2	217108	217140	a	a	+
+chr2	217110	217142	a	a	+
+chr2	217078	217110	b	b	-
+chr2	217111	217143	a	a	+
+chr2	217079	217111	b	b	-
+chr2	217112	217144	a	a	+
+chr2	217114	217146	a	a	+
+chr2	217119	217151	a	a	+
+chr2	217132	217164	a	a	+
+chr2	217380	217412	a	a	+
+chr2	217353	217385	b	b	-
+chr2	217394	217426	b	b	-
+chr2	217395	217427	b	b	-
+chr2	217439	217471	a	a	+
+chr2	217544	217576	b	b	-
+chr2	217579	217611	a	a	+
+chr2	217597	217629	a	a	+
+chr2	217597	217629	a	a	+
+chr2	217566	217598	b	b	-
+chr2	217761	217793	a	a	+
+chr2	217983	218015	b	b	-
+chr2	218210	218242	a	a	+
+chr2	220105	220137	b	b	-
+chr2	220109	220141	b	b	-
+chr2	220126	220158	b	b	-
+chr2	220482	220514	b	b	-
+chr2	220508	220540	b	b	-
+chr2	220693	220725	a	a	+
+chr2	220662	220694	b	b	-
+chr2	220694	220726	b	b	-
+chr2	221034	221066	b	b	-
+chr2	221042	221074	b	b	-
+chr2	221045	221077	b	b	-
+chr2	221046	221078	b	b	-
+chr2	221047	221079	b	b	-
+chr2	221056	221088	b	b	-
+chr2	221056	221088	b	b	-
+chr2	221058	221090	b	b	-
+chr2	221058	221090	b	b	-
+chr2	221058	221090	b	b	-
+chr2	221061	221093	b	b	-
+chr2	221069	221101	b	b	-
+chr2	221069	221101	b	b	-
+chr2	221070	221102	b	b	-
+chr2	221073	221105	b	b	-
+chr2	221073	221105	b	b	-
+chr2	221073	221105	b	b	-
+chr2	221073	221105	b	b	-
+chr2	221074	221106	b	b	-
+chr2	221074	221106	b	b	-
+chr2	221074	221106	b	b	-
+chr2	221074	221106	b	b	-
+chr2	221079	221111	b	b	-
+chr2	221112	221144	a	a	+
+chr2	221112	221144	a	a	+
+chr2	221113	221145	a	a	+
+chr2	221113	221145	a	a	+
+chr2	221113	221145	a	a	+
+chr2	221113	221145	a	a	+
+chr2	221113	221145	a	a	+
+chr2	221113	221145	a	a	+
+chr2	221113	221145	a	a	+
+chr2	221082	221114	b	b	-
+chr2	221116	221148	a	a	+
+chr2	221084	221116	b	b	-
+chr2	221085	221117	b	b	-
+chr2	221085	221117	b	b	-
+chr2	221086	221118	b	b	-
+chr2	221087	221119	b	b	-
+chr2	221124	221156	a	a	+
+chr2	221124	221156	a	a	+
+chr2	221093	221125	b	b	-
+chr2	221127	221159	a	a	+
+chr2	221095	221127	b	b	-
+chr2	221095	221127	b	b	-
+chr2	221130	221162	a	a	+
+chr2	221130	221162	a	a	+
+chr2	221134	221166	a	a	+
+chr2	221103	221135	b	b	-
+chr2	221106	221138	b	b	-
+chr2	221106	221138	b	b	-
+chr2	221107	221139	b	b	-
+chr2	221113	221145	b	b	-
+chr2	221113	221145	b	b	-
+chr2	221116	221148	b	b	-
+chr2	221120	221152	b	b	-
+chr2	221123	221155	b	b	-
+chr2	221159	221191	a	a	+
+chr2	221130	221162	b	b	-
+chr2	221130	221162	b	b	-
+chr2	221131	221163	b	b	-
+chr2	221164	221196	a	a	+
+chr2	221132	221164	b	b	-
+chr2	221167	221199	a	a	+
+chr2	221169	221201	a	a	+
+chr2	221169	221201	a	a	+
+chr2	221138	221170	b	b	-
+chr2	221138	221170	b	b	-
+chr2	221174	221206	a	a	+
+chr2	221175	221207	a	a	+
+chr2	221176	221208	a	a	+
+chr2	221177	221209	a	a	+
+chr2	221178	221210	a	a	+
+chr2	221153	221185	b	b	-
+chr2	221186	221218	a	a	+
+chr2	221159	221191	b	b	-
+chr2	221159	221191	b	b	-
+chr2	221192	221224	a	a	+
+chr2	221192	221224	a	a	+
+chr2	221160	221192	b	b	-
+chr2	221160	221192	b	b	-
+chr2	221163	221195	b	b	-
+chr2	221164	221196	b	b	-
+chr2	221164	221196	b	b	-
+chr2	221165	221197	b	b	-
+chr2	221166	221198	b	b	-
+chr2	221166	221198	b	b	-
+chr2	221202	221234	a	a	+
+chr2	221204	221236	a	a	+
+chr2	221204	221236	a	a	+
+chr2	221182	221214	b	b	-
+chr2	221186	221218	b	b	-
+chr2	221186	221218	b	b	-
+chr2	221186	221218	b	b	-
+chr2	221188	221220	b	b	-
+chr2	221188	221220	b	b	-
+chr2	221188	221220	b	b	-
+chr2	221188	221220	b	b	-
+chr2	221188	221220	b	b	-
+chr2	221188	221220	b	b	-
+chr2	221188	221220	b	b	-
+chr2	221200	221232	b	b	-
+chr2	221201	221233	b	b	-
+chr2	221236	221268	a	a	+
+chr2	221212	221244	b	b	-
+chr2	221218	221250	b	b	-
+chr2	221252	221284	a	a	+
+chr2	221259	221291	a	a	+
+chr2	221259	221291	a	a	+
+chr2	221260	221292	a	a	+
+chr2	221260	221292	a	a	+
+chr2	221245	221277	b	b	-
+chr2	221278	221310	a	a	+
+chr2	221279	221311	a	a	+
+chr2	221280	221312	a	a	+
+chr2	221280	221312	a	a	+
+chr2	221280	221312	a	a	+
+chr2	221248	221280	b	b	-
+chr2	221250	221282	b	b	-
+chr2	221288	221320	a	a	+
+chr2	221288	221320	a	a	+
+chr2	221256	221288	b	b	-
+chr2	221256	221288	b	b	-
+chr2	221256	221288	b	b	-
+chr2	221256	221288	b	b	-
+chr2	221256	221288	b	b	-
+chr2	221256	221288	b	b	-
+chr2	221294	221326	a	a	+
+chr2	221296	221328	a	a	+
+chr2	221300	221332	a	a	+
+chr2	221304	221336	a	a	+
+chr2	221306	221338	a	a	+
+chr2	221308	221340	a	a	+
+chr2	221309	221341	a	a	+
+chr2	221310	221342	a	a	+
+chr2	221312	221344	a	a	+
+chr2	221313	221345	a	a	+
+chr2	221317	221349	a	a	+
+chr2	221320	221352	a	a	+
+chr2	221321	221353	a	a	+
+chr2	221321	221353	a	a	+
+chr2	221321	221353	a	a	+
+chr2	221321	221353	a	a	+
+chr2	221321	221353	a	a	+
+chr2	221321	221353	a	a	+
+chr2	221321	221353	a	a	+
+chr2	221321	221353	a	a	+
+chr2	221321	221353	a	a	+
+chr2	221321	221353	a	a	+
+chr2	221321	221353	a	a	+
+chr2	221321	221353	a	a	+
+chr2	221321	221353	a	a	+
+chr2	221321	221353	a	a	+
+chr2	221321	221353	a	a	+
+chr2	221321	221353	a	a	+
+chr2	221321	221353	a	a	+
+chr2	221289	221321	b	b	-
+chr2	221322	221354	a	a	+
+chr2	221322	221354	a	a	+
+chr2	221322	221354	a	a	+
+chr2	221322	221354	a	a	+
+chr2	221322	221354	a	a	+
+chr2	221290	221322	b	b	-
+chr2	221290	221322	b	b	-
+chr2	221324	221356	a	a	+
+chr2	221325	221357	a	a	+
+chr2	221325	221357	a	a	+
+chr2	221325	221357	a	a	+
+chr2	221293	221325	b	b	-
+chr2	221327	221359	a	a	+
+chr2	221296	221328	b	b	-
+chr2	221296	221328	b	b	-
+chr2	221297	221329	b	b	-
+chr2	221330	221362	a	a	+
+chr2	221298	221330	b	b	-
+chr2	221334	221366	a	a	+
+chr2	221335	221367	a	a	+
+chr2	221338	221370	a	a	+
+chr2	221306	221338	b	b	-
+chr2	221306	221338	b	b	-
+chr2	221306	221338	b	b	-
+chr2	221339	221371	a	a	+
+chr2	221307	221339	b	b	-
+chr2	221311	221343	b	b	-
+chr2	221312	221344	b	b	-
+chr2	221312	221344	b	b	-
+chr2	221323	221355	b	b	-
+chr2	221324	221356	b	b	-
+chr2	221325	221357	b	b	-
+chr2	221325	221357	b	b	-
+chr2	221329	221361	b	b	-
+chr2	221367	221399	a	a	+
+chr2	221370	221402	a	a	+
+chr2	221375	221407	a	a	+
+chr2	221375	221407	a	a	+
+chr2	221345	221377	b	b	-
+chr2	221379	221411	a	a	+
+chr2	221360	221392	b	b	-
+chr2	221360	221392	b	b	-
+chr2	221371	221403	b	b	-
+chr2	221371	221403	b	b	-
+chr2	221404	221436	a	a	+
+chr2	221404	221436	a	a	+
+chr2	221405	221437	a	a	+
+chr2	221378	221410	b	b	-
+chr2	221378	221410	b	b	-
+chr2	221378	221410	b	b	-
+chr2	221411	221443	a	a	+
+chr2	221413	221445	a	a	+
+chr2	221389	221421	b	b	-
+chr2	221389	221421	b	b	-
+chr2	221422	221454	a	a	+
+chr2	221424	221456	a	a	+
+chr2	221425	221457	a	a	+
+chr2	221426	221458	a	a	+
+chr2	221395	221427	b	b	-
+chr2	221397	221429	b	b	-
+chr2	221433	221465	a	a	+
+chr2	221401	221433	b	b	-
+chr2	221401	221433	b	b	-
+chr2	221401	221433	b	b	-
+chr2	221439	221471	a	a	+
+chr2	221439	221471	a	a	+
+chr2	221439	221471	a	a	+
+chr2	221439	221471	a	a	+
+chr2	221443	221475	a	a	+
+chr2	221411	221443	b	b	-
+chr2	221444	221476	a	a	+
+chr2	221444	221476	a	a	+
+chr2	221446	221478	a	a	+
+chr2	221446	221478	a	a	+
+chr2	221446	221478	a	a	+
+chr2	221446	221478	a	a	+
+chr2	221446	221478	a	a	+
+chr2	221447	221479	a	a	+
+chr2	221415	221447	b	b	-
+chr2	221451	221483	a	a	+
+chr2	221451	221483	a	a	+
+chr2	221419	221451	b	b	-
+chr2	221419	221451	b	b	-
+chr2	221419	221451	b	b	-
+chr2	221419	221451	b	b	-
+chr2	221421	221453	b	b	-
+chr2	221426	221458	b	b	-
+chr2	221426	221458	b	b	-
+chr2	221426	221458	b	b	-
+chr2	221426	221458	b	b	-
+chr2	221426	221458	b	b	-
+chr2	221427	221459	b	b	-
+chr2	221463	221495	a	a	+
+chr2	221469	221501	a	a	+
+chr2	221469	221501	a	a	+
+chr2	221472	221504	a	a	+
+chr2	221440	221472	b	b	-
+chr2	221440	221472	b	b	-
+chr2	221440	221472	b	b	-
+chr2	221443	221475	b	b	-
+chr2	221443	221475	b	b	-
+chr2	221443	221475	b	b	-
+chr2	221477	221509	a	a	+
+chr2	221477	221509	a	a	+
+chr2	221477	221509	a	a	+
+chr2	221445	221477	b	b	-
+chr2	221478	221510	a	a	+
+chr2	221478	221510	a	a	+
+chr2	221478	221510	a	a	+
+chr2	221478	221510	a	a	+
+chr2	221478	221510	a	a	+
+chr2	221478	221510	a	a	+
+chr2	221478	221510	a	a	+
+chr2	221446	221478	b	b	-
+chr2	221446	221478	b	b	-
+chr2	221446	221478	b	b	-
+chr2	221482	221514	a	a	+
+chr2	221452	221484	b	b	-
+chr2	221452	221484	b	b	-
+chr2	221452	221484	b	b	-
+chr2	221452	221484	b	b	-
+chr2	221452	221484	b	b	-
+chr2	221452	221484	b	b	-
+chr2	221452	221484	b	b	-
+chr2	221452	221484	b	b	-
+chr2	221452	221484	b	b	-
+chr2	221452	221484	b	b	-
+chr2	221452	221484	b	b	-
+chr2	221452	221484	b	b	-
+chr2	221452	221484	b	b	-
+chr2	221454	221486	b	b	-
+chr2	221454	221486	b	b	-
+chr2	221454	221486	b	b	-
+chr2	221492	221524	a	a	+
+chr2	221461	221493	b	b	-
+chr2	221461	221493	b	b	-
+chr2	221461	221493	b	b	-
+chr2	221461	221493	b	b	-
+chr2	221461	221493	b	b	-
+chr2	221461	221493	b	b	-
+chr2	221461	221493	b	b	-
+chr2	221461	221493	b	b	-
+chr2	221494	221526	a	a	+
+chr2	221495	221527	a	a	+
+chr2	221497	221529	a	a	+
+chr2	221497	221529	a	a	+
+chr2	221503	221535	a	a	+
+chr2	221504	221536	a	a	+
+chr2	221504	221536	a	a	+
+chr2	221504	221536	a	a	+
+chr2	221504	221536	a	a	+
+chr2	221504	221536	a	a	+
+chr2	221504	221536	a	a	+
+chr2	221504	221536	a	a	+
+chr2	221504	221536	a	a	+
+chr2	221509	221541	a	a	+
+chr2	221509	221541	a	a	+
+chr2	221510	221542	a	a	+
+chr2	221511	221543	a	a	+
+chr2	221511	221543	a	a	+
+chr2	221511	221543	a	a	+
+chr2	221479	221511	b	b	-
+chr2	221481	221513	b	b	-
+chr2	221481	221513	b	b	-
+chr2	221481	221513	b	b	-
+chr2	221481	221513	b	b	-
+chr2	221517	221549	a	a	+
+chr2	221485	221517	b	b	-
+chr2	221485	221517	b	b	-
+chr2	221485	221517	b	b	-
+chr2	221522	221554	a	a	+
+chr2	221490	221522	b	b	-
+chr2	221490	221522	b	b	-
+chr2	221490	221522	b	b	-
+chr2	221490	221522	b	b	-
+chr2	221490	221522	b	b	-
+chr2	221490	221522	b	b	-
+chr2	221490	221522	b	b	-
+chr2	221490	221522	b	b	-
+chr2	221490	221522	b	b	-
+chr2	221490	221522	b	b	-
+chr2	221490	221522	b	b	-
+chr2	221523	221555	a	a	+
+chr2	221523	221555	a	a	+
+chr2	221491	221523	b	b	-
+chr2	221491	221523	b	b	-
+chr2	221491	221523	b	b	-
+chr2	221491	221523	b	b	-
+chr2	221491	221523	b	b	-
+chr2	221491	221523	b	b	-
+chr2	221491	221523	b	b	-
+chr2	221491	221523	b	b	-
+chr2	221491	221523	b	b	-
+chr2	221491	221523	b	b	-
+chr2	221527	221559	a	a	+
+chr2	221527	221559	a	a	+
+chr2	221528	221560	a	a	+
+chr2	221496	221528	b	b	-
+chr2	221496	221528	b	b	-
+chr2	221496	221528	b	b	-
+chr2	221497	221529	b	b	-
+chr2	221498	221530	b	b	-
+chr2	221531	221563	a	a	+
+chr2	221499	221531	b	b	-
+chr2	221532	221564	a	a	+
+chr2	221500	221532	b	b	-
+chr2	221501	221533	b	b	-
+chr2	221501	221533	b	b	-
+chr2	221501	221533	b	b	-
+chr2	221501	221533	b	b	-
+chr2	221501	221533	b	b	-
+chr2	221501	221533	b	b	-
+chr2	221501	221533	b	b	-
+chr2	221501	221533	b	b	-
+chr2	221501	221533	b	b	-
+chr2	221501	221533	b	b	-
+chr2	221501	221533	b	b	-
+chr2	221501	221533	b	b	-
+chr2	221501	221533	b	b	-
+chr2	221501	221533	b	b	-
+chr2	221501	221533	b	b	-
+chr2	221501	221533	b	b	-
+chr2	221501	221533	b	b	-
+chr2	221538	221570	a	a	+
+chr2	221538	221570	a	a	+
+chr2	221538	221570	a	a	+
+chr2	221538	221570	a	a	+
+chr2	221543	221575	a	a	+
+chr2	221543	221575	a	a	+
+chr2	221543	221575	a	a	+
+chr2	221543	221575	a	a	+
+chr2	221543	221575	a	a	+
+chr2	221543	221575	a	a	+
+chr2	221543	221575	a	a	+
+chr2	221543	221575	a	a	+
+chr2	221543	221575	a	a	+
+chr2	221543	221575	a	a	+
+chr2	221543	221575	a	a	+
+chr2	221543	221575	a	a	+
+chr2	221543	221575	a	a	+
+chr2	221544	221576	a	a	+
+chr2	221544	221576	a	a	+
+chr2	221551	221583	a	a	+
+chr2	221551	221583	a	a	+
+chr2	221551	221583	a	a	+
+chr2	221559	221591	a	a	+
+chr2	221561	221593	a	a	+
+chr2	221564	221596	a	a	+
+chr2	221564	221596	a	a	+
+chr2	221569	221601	a	a	+
+chr2	221569	221601	a	a	+
+chr2	221569	221601	a	a	+
+chr2	221573	221605	a	a	+
+chr2	221548	221580	b	b	-
+chr2	221583	221615	a	a	+
+chr2	221583	221615	a	a	+
+chr2	221583	221615	a	a	+
+chr2	221586	221618	a	a	+
+chr2	221589	221621	a	a	+
+chr2	221589	221621	a	a	+
+chr2	221589	221621	a	a	+
+chr2	221589	221621	a	a	+
+chr2	221589	221621	a	a	+
+chr2	221594	221626	a	a	+
+chr2	221595	221627	a	a	+
+chr2	221569	221601	b	b	-
+chr2	221569	221601	b	b	-
+chr2	221569	221601	b	b	-
+chr2	221569	221601	b	b	-
+chr2	221570	221602	b	b	-
+chr2	221571	221603	b	b	-
+chr2	221611	221643	a	a	+
+chr2	221584	221616	b	b	-
+chr2	221601	221633	b	b	-
+chr2	221607	221639	b	b	-
+chr2	221607	221639	b	b	-
+chr2	221640	221672	a	a	+
+chr2	221640	221672	a	a	+
+chr2	221608	221640	b	b	-
+chr2	221641	221673	a	a	+
+chr2	221651	221683	a	a	+
+chr2	221651	221683	a	a	+
+chr2	221651	221683	a	a	+
+chr2	221651	221683	a	a	+
+chr2	221623	221655	b	b	-
+chr2	221671	221703	b	b	-
+chr2	221671	221703	b	b	-
+chr2	221673	221705	b	b	-
+chr2	221674	221706	b	b	-
+chr2	221674	221706	b	b	-
+chr2	221674	221706	b	b	-
+chr2	221674	221706	b	b	-
+chr2	221675	221707	b	b	-
+chr2	221675	221707	b	b	-
+chr2	221675	221707	b	b	-
+chr2	221675	221707	b	b	-
+chr2	221675	221707	b	b	-
+chr2	221675	221707	b	b	-
+chr2	221677	221709	b	b	-
+chr2	221696	221728	b	b	-
+chr2	221698	221730	b	b	-
+chr2	221707	221739	b	b	-
+chr2	221709	221741	b	b	-
+chr2	221710	221742	b	b	-
+chr2	221748	221780	a	a	+
+chr2	221755	221787	a	a	+
+chr2	221755	221787	a	a	+
+chr2	221767	221799	a	a	+
+chr2	221767	221799	a	a	+
+chr2	221735	221767	b	b	-
+chr2	221735	221767	b	b	-
+chr2	221768	221800	a	a	+
+chr2	221771	221803	a	a	+
+chr2	221771	221803	a	a	+
+chr2	221771	221803	a	a	+
+chr2	221771	221803	a	a	+
+chr2	221771	221803	a	a	+
+chr2	221771	221803	a	a	+
+chr2	221771	221803	a	a	+
+chr2	221771	221803	a	a	+
+chr2	221771	221803	a	a	+
+chr2	221771	221803	a	a	+
+chr2	221771	221803	a	a	+
+chr2	221771	221803	a	a	+
+chr2	221771	221803	a	a	+
+chr2	221771	221803	a	a	+
+chr2	221771	221803	a	a	+
+chr2	221771	221803	a	a	+
+chr2	221771	221803	a	a	+
+chr2	221771	221803	a	a	+
+chr2	221771	221803	a	a	+
+chr2	221771	221803	a	a	+
+chr2	221771	221803	a	a	+
+chr2	221771	221803	a	a	+
+chr2	221771	221803	a	a	+
+chr2	221772	221804	a	a	+
+chr2	221774	221806	a	a	+
+chr2	221742	221774	b	b	-
+chr2	221742	221774	b	b	-
+chr2	221742	221774	b	b	-
+chr2	221742	221774	b	b	-
+chr2	221742	221774	b	b	-
+chr2	221742	221774	b	b	-
+chr2	221742	221774	b	b	-
+chr2	221742	221774	b	b	-
+chr2	221742	221774	b	b	-
+chr2	221742	221774	b	b	-
+chr2	221742	221774	b	b	-
+chr2	221777	221809	a	a	+
+chr2	221777	221809	a	a	+
+chr2	221747	221779	b	b	-
+chr2	221747	221779	b	b	-
+chr2	221747	221779	b	b	-
+chr2	221747	221779	b	b	-
+chr2	221747	221779	b	b	-
+chr2	221748	221780	b	b	-
+chr2	221748	221780	b	b	-
+chr2	221748	221780	b	b	-
+chr2	221748	221780	b	b	-
+chr2	221748	221780	b	b	-
+chr2	221751	221783	b	b	-
+chr2	221785	221817	a	a	+
+chr2	221787	221819	a	a	+
+chr2	221787	221819	a	a	+
+chr2	221788	221820	a	a	+
+chr2	221756	221788	b	b	-
+chr2	221789	221821	a	a	+
+chr2	221758	221790	b	b	-
+chr2	221758	221790	b	b	-
+chr2	221758	221790	b	b	-
+chr2	221761	221793	b	b	-
+chr2	221761	221793	b	b	-
+chr2	221761	221793	b	b	-
+chr2	221761	221793	b	b	-
+chr2	221761	221793	b	b	-
+chr2	221761	221793	b	b	-
+chr2	221761	221793	b	b	-
+chr2	221761	221793	b	b	-
+chr2	221761	221793	b	b	-
+chr2	221761	221793	b	b	-
+chr2	221761	221793	b	b	-
+chr2	221761	221793	b	b	-
+chr2	221761	221793	b	b	-
+chr2	221761	221793	b	b	-
+chr2	221761	221793	b	b	-
+chr2	221761	221793	b	b	-
+chr2	221761	221793	b	b	-
+chr2	221761	221793	b	b	-
+chr2	221761	221793	b	b	-
+chr2	221762	221794	b	b	-
+chr2	221762	221794	b	b	-
+chr2	221762	221794	b	b	-
+chr2	221762	221794	b	b	-
+chr2	221762	221794	b	b	-
+chr2	221762	221794	b	b	-
+chr2	221762	221794	b	b	-
+chr2	221762	221794	b	b	-
+chr2	221762	221794	b	b	-
+chr2	221762	221794	b	b	-
+chr2	221762	221794	b	b	-
+chr2	221762	221794	b	b	-
+chr2	221795	221827	a	a	+
+chr2	221795	221827	a	a	+
+chr2	221795	221827	a	a	+
+chr2	221795	221827	a	a	+
+chr2	221795	221827	a	a	+
+chr2	221795	221827	a	a	+
+chr2	221795	221827	a	a	+
+chr2	221763	221795	b	b	-
+chr2	221796	221828	a	a	+
+chr2	221796	221828	a	a	+
+chr2	221766	221798	b	b	-
+chr2	221766	221798	b	b	-
+chr2	221766	221798	b	b	-
+chr2	221766	221798	b	b	-
+chr2	221766	221798	b	b	-
+chr2	221766	221798	b	b	-
+chr2	221800	221832	a	a	+
+chr2	221768	221800	b	b	-
+chr2	221768	221800	b	b	-
+chr2	221768	221800	b	b	-
+chr2	221768	221800	b	b	-
+chr2	221768	221800	b	b	-
+chr2	221768	221800	b	b	-
+chr2	221768	221800	b	b	-
+chr2	221768	221800	b	b	-
+chr2	221768	221800	b	b	-
+chr2	221769	221801	b	b	-
+chr2	221769	221801	b	b	-
+chr2	221769	221801	b	b	-
+chr2	221769	221801	b	b	-
+chr2	221769	221801	b	b	-
+chr2	221769	221801	b	b	-
+chr2	221769	221801	b	b	-
+chr2	221802	221834	a	a	+
+chr2	221802	221834	a	a	+
+chr2	221802	221834	a	a	+
+chr2	221802	221834	a	a	+
+chr2	221802	221834	a	a	+
+chr2	221770	221802	b	b	-
+chr2	221803	221835	a	a	+
+chr2	221803	221835	a	a	+
+chr2	221803	221835	a	a	+
+chr2	221803	221835	a	a	+
+chr2	221803	221835	a	a	+
+chr2	221771	221803	b	b	-
+chr2	221771	221803	b	b	-
+chr2	221771	221803	b	b	-
+chr2	221771	221803	b	b	-
+chr2	221771	221803	b	b	-
+chr2	221771	221803	b	b	-
+chr2	221771	221803	b	b	-
+chr2	221771	221803	b	b	-
+chr2	221771	221803	b	b	-
+chr2	221771	221803	b	b	-
+chr2	221771	221803	b	b	-
+chr2	221771	221803	b	b	-
+chr2	221771	221803	b	b	-
+chr2	221771	221803	b	b	-
+chr2	221771	221803	b	b	-
+chr2	221771	221803	b	b	-
+chr2	221771	221803	b	b	-
+chr2	221771	221803	b	b	-
+chr2	221771	221803	b	b	-
+chr2	221771	221803	b	b	-
+chr2	221804	221836	a	a	+
+chr2	221804	221836	a	a	+
+chr2	221804	221836	a	a	+
+chr2	221772	221804	b	b	-
+chr2	221772	221804	b	b	-
+chr2	221772	221804	b	b	-
+chr2	221772	221804	b	b	-
+chr2	221772	221804	b	b	-
+chr2	221772	221804	b	b	-
+chr2	221772	221804	b	b	-
+chr2	221772	221804	b	b	-
+chr2	221773	221805	b	b	-
+chr2	221774	221806	b	b	-
+chr2	221774	221806	b	b	-
+chr2	221774	221806	b	b	-
+chr2	221776	221808	b	b	-
+chr2	221809	221841	a	a	+
+chr2	221777	221809	b	b	-
+chr2	221777	221809	b	b	-
+chr2	221780	221812	b	b	-
+chr2	221780	221812	b	b	-
+chr2	221780	221812	b	b	-
+chr2	221780	221812	b	b	-
+chr2	221813	221845	a	a	+
+chr2	221781	221813	b	b	-
+chr2	221781	221813	b	b	-
+chr2	221781	221813	b	b	-
+chr2	221781	221813	b	b	-
+chr2	221781	221813	b	b	-
+chr2	221781	221813	b	b	-
+chr2	221781	221813	b	b	-
+chr2	221781	221813	b	b	-
+chr2	221781	221813	b	b	-
+chr2	221781	221813	b	b	-
+chr2	221781	221813	b	b	-
+chr2	221782	221814	b	b	-
+chr2	221782	221814	b	b	-
+chr2	221782	221814	b	b	-
+chr2	221782	221814	b	b	-
+chr2	221782	221814	b	b	-
+chr2	221782	221814	b	b	-
+chr2	221782	221814	b	b	-
+chr2	221782	221814	b	b	-
+chr2	221782	221814	b	b	-
+chr2	221782	221814	b	b	-
+chr2	221782	221814	b	b	-
+chr2	221782	221814	b	b	-
+chr2	221783	221815	b	b	-
+chr2	221783	221815	b	b	-
+chr2	221783	221815	b	b	-
+chr2	221783	221815	b	b	-
+chr2	221783	221815	b	b	-
+chr2	221783	221815	b	b	-
+chr2	221783	221815	b	b	-
+chr2	221783	221815	b	b	-
+chr2	221783	221815	b	b	-
+chr2	221783	221815	b	b	-
+chr2	221783	221815	b	b	-
+chr2	221783	221815	b	b	-
+chr2	221783	221815	b	b	-
+chr2	221783	221815	b	b	-
+chr2	221783	221815	b	b	-
+chr2	221783	221815	b	b	-
+chr2	221783	221815	b	b	-
+chr2	221783	221815	b	b	-
+chr2	221783	221815	b	b	-
+chr2	221816	221848	a	a	+
+chr2	221816	221848	a	a	+
+chr2	221816	221848	a	a	+
+chr2	221816	221848	a	a	+
+chr2	221785	221817	b	b	-
+chr2	221786	221818	b	b	-
+chr2	221786	221818	b	b	-
+chr2	221786	221818	b	b	-
+chr2	221786	221818	b	b	-
+chr2	221786	221818	b	b	-
+chr2	221786	221818	b	b	-
+chr2	221786	221818	b	b	-
+chr2	221786	221818	b	b	-
+chr2	221786	221818	b	b	-
+chr2	221786	221818	b	b	-
+chr2	221819	221851	a	a	+
+chr2	221820	221852	a	a	+
+chr2	221788	221820	b	b	-
+chr2	221822	221854	a	a	+
+chr2	221822	221854	a	a	+
+chr2	221792	221824	b	b	-
+chr2	221795	221827	b	b	-
+chr2	221795	221827	b	b	-
+chr2	221795	221827	b	b	-
+chr2	221795	221827	b	b	-
+chr2	221795	221827	b	b	-
+chr2	221796	221828	b	b	-
+chr2	221796	221828	b	b	-
+chr2	221798	221830	b	b	-
+chr2	221799	221831	b	b	-
+chr2	221838	221870	a	a	+
+chr2	221838	221870	a	a	+
+chr2	221838	221870	a	a	+
+chr2	221838	221870	a	a	+
+chr2	221838	221870	a	a	+
+chr2	221808	221840	b	b	-
+chr2	221845	221877	a	a	+
+chr2	221845	221877	a	a	+
+chr2	221813	221845	b	b	-
+chr2	221847	221879	a	a	+
+chr2	221849	221881	a	a	+
+chr2	221822	221854	b	b	-
+chr2	221822	221854	b	b	-
+chr2	221822	221854	b	b	-
+chr2	221822	221854	b	b	-
+chr2	221822	221854	b	b	-
+chr2	221822	221854	b	b	-
+chr2	221822	221854	b	b	-
+chr2	221822	221854	b	b	-
+chr2	221822	221854	b	b	-
+chr2	221822	221854	b	b	-
+chr2	221822	221854	b	b	-
+chr2	221822	221854	b	b	-
+chr2	221822	221854	b	b	-
+chr2	221857	221889	a	a	+
+chr2	221857	221889	a	a	+
+chr2	221857	221889	a	a	+
+chr2	221857	221889	a	a	+
+chr2	221857	221889	a	a	+
+chr2	221857	221889	a	a	+
+chr2	221857	221889	a	a	+
+chr2	221825	221857	b	b	-
+chr2	221863	221895	a	a	+
+chr2	221863	221895	a	a	+
+chr2	221863	221895	a	a	+
+chr2	221863	221895	a	a	+
+chr2	221864	221896	a	a	+
+chr2	221833	221865	b	b	-
+chr2	221867	221899	a	a	+
+chr2	221867	221899	a	a	+
+chr2	221867	221899	a	a	+
+chr2	221868	221900	a	a	+
+chr2	221868	221900	a	a	+
+chr2	221868	221900	a	a	+
+chr2	221868	221900	a	a	+
+chr2	221868	221900	a	a	+
+chr2	221887	221919	a	a	+
+chr2	221892	221924	a	a	+
+chr2	221892	221924	a	a	+
+chr2	221902	221934	a	a	+
+chr2	221902	221934	a	a	+
+chr2	221871	221903	b	b	-
+chr2	221871	221903	b	b	-
+chr2	221908	221940	a	a	+
+chr2	221908	221940	a	a	+
+chr2	221909	221941	a	a	+
+chr2	221913	221945	a	a	+
+chr2	221883	221915	b	b	-
+chr2	221885	221917	b	b	-
+chr2	221886	221918	b	b	-
+chr2	221886	221918	b	b	-
+chr2	221886	221918	b	b	-
+chr2	221928	221960	a	a	+
+chr2	221936	221968	a	a	+
+chr2	221941	221973	a	a	+
+chr2	221941	221973	a	a	+
+chr2	221941	221973	a	a	+
+chr2	221942	221974	a	a	+
+chr2	221913	221945	b	b	-
+chr2	221913	221945	b	b	-
+chr2	221951	221983	a	a	+
+chr2	221919	221951	b	b	-
+chr2	221954	221986	a	a	+
+chr2	221955	221987	a	a	+
+chr2	221955	221987	a	a	+
+chr2	221955	221987	a	a	+
+chr2	221928	221960	b	b	-
+chr2	221928	221960	b	b	-
+chr2	221968	222000	a	a	+
+chr2	221937	221969	b	b	-
+chr2	221938	221970	b	b	-
+chr2	221971	222003	a	a	+
+chr2	221974	222006	a	a	+
+chr2	221946	221978	b	b	-
+chr2	221979	222011	a	a	+
+chr2	221979	222011	a	a	+
+chr2	221947	221979	b	b	-
+chr2	221947	221979	b	b	-
+chr2	221947	221979	b	b	-
+chr2	221947	221979	b	b	-
+chr2	221947	221979	b	b	-
+chr2	221947	221979	b	b	-
+chr2	221947	221979	b	b	-
+chr2	221980	222012	a	a	+
+chr2	221980	222012	a	a	+
+chr2	221980	222012	a	a	+
+chr2	221980	222012	a	a	+
+chr2	221980	222012	a	a	+
+chr2	221980	222012	a	a	+
+chr2	221980	222012	a	a	+
+chr2	221981	222013	a	a	+
+chr2	221981	222013	a	a	+
+chr2	221981	222013	a	a	+
+chr2	221983	222015	a	a	+
+chr2	221952	221984	b	b	-
+chr2	221952	221984	b	b	-
+chr2	221952	221984	b	b	-
+chr2	221952	221984	b	b	-
+chr2	221952	221984	b	b	-
+chr2	221952	221984	b	b	-
+chr2	221988	222020	a	a	+
+chr2	221988	222020	a	a	+
+chr2	221988	222020	a	a	+
+chr2	221988	222020	a	a	+
+chr2	221988	222020	a	a	+
+chr2	221988	222020	a	a	+
+chr2	221988	222020	a	a	+
+chr2	221988	222020	a	a	+
+chr2	221988	222020	a	a	+
+chr2	221988	222020	a	a	+
+chr2	221988	222020	a	a	+
+chr2	221988	222020	a	a	+
+chr2	221988	222020	a	a	+
+chr2	221988	222020	a	a	+
+chr2	221988	222020	a	a	+
+chr2	221958	221990	b	b	-
+chr2	221958	221990	b	b	-
+chr2	221958	221990	b	b	-
+chr2	221958	221990	b	b	-
+chr2	221958	221990	b	b	-
+chr2	221958	221990	b	b	-
+chr2	221958	221990	b	b	-
+chr2	221958	221990	b	b	-
+chr2	221958	221990	b	b	-
+chr2	221958	221990	b	b	-
+chr2	221958	221990	b	b	-
+chr2	221958	221990	b	b	-
+chr2	221958	221990	b	b	-
+chr2	221958	221990	b	b	-
+chr2	221958	221990	b	b	-
+chr2	221959	221991	b	b	-
+chr2	221959	221991	b	b	-
+chr2	221992	222024	a	a	+
+chr2	221960	221992	b	b	-
+chr2	221993	222025	a	a	+
+chr2	221993	222025	a	a	+
+chr2	221993	222025	a	a	+
+chr2	221996	222028	a	a	+
+chr2	221964	221996	b	b	-
+chr2	221964	221996	b	b	-
+chr2	221964	221996	b	b	-
+chr2	221964	221996	b	b	-
+chr2	221964	221996	b	b	-
+chr2	221964	221996	b	b	-
+chr2	221964	221996	b	b	-
+chr2	221964	221996	b	b	-
+chr2	221964	221996	b	b	-
+chr2	221969	222001	b	b	-
+chr2	221969	222001	b	b	-
+chr2	221969	222001	b	b	-
+chr2	221969	222001	b	b	-
+chr2	221969	222001	b	b	-
+chr2	221969	222001	b	b	-
+chr2	221972	222004	b	b	-
+chr2	222005	222037	a	a	+
+chr2	221975	222007	b	b	-
+chr2	222008	222040	a	a	+
+chr2	222008	222040	a	a	+
+chr2	221976	222008	b	b	-
+chr2	221976	222008	b	b	-
+chr2	221977	222009	b	b	-
+chr2	222018	222050	a	a	+
+chr2	221987	222019	b	b	-
+chr2	221987	222019	b	b	-
+chr2	221987	222019	b	b	-
+chr2	221988	222020	b	b	-
+chr2	221988	222020	b	b	-
+chr2	221988	222020	b	b	-
+chr2	221988	222020	b	b	-
+chr2	221988	222020	b	b	-
+chr2	221988	222020	b	b	-
+chr2	222022	222054	a	a	+
+chr2	222022	222054	a	a	+
+chr2	222022	222054	a	a	+
+chr2	222022	222054	a	a	+
+chr2	222022	222054	a	a	+
+chr2	222022	222054	a	a	+
+chr2	222022	222054	a	a	+
+chr2	222022	222054	a	a	+
+chr2	222022	222054	a	a	+
+chr2	221991	222023	b	b	-
+chr2	222026	222058	a	a	+
+chr2	222032	222064	a	a	+
+chr2	222037	222069	a	a	+
+chr2	222037	222069	a	a	+
+chr2	222006	222038	b	b	-
+chr2	222006	222038	b	b	-
+chr2	222006	222038	b	b	-
+chr2	222006	222038	b	b	-
+chr2	222040	222072	a	a	+
+chr2	222008	222040	b	b	-
+chr2	222010	222042	b	b	-
+chr2	222044	222076	a	a	+
+chr2	222044	222076	a	a	+
+chr2	222012	222044	b	b	-
+chr2	222012	222044	b	b	-
+chr2	222012	222044	b	b	-
+chr2	222013	222045	b	b	-
+chr2	222046	222078	a	a	+
+chr2	222046	222078	a	a	+
+chr2	222047	222079	a	a	+
+chr2	222047	222079	a	a	+
+chr2	222047	222079	a	a	+
+chr2	222015	222047	b	b	-
+chr2	222015	222047	b	b	-
+chr2	222015	222047	b	b	-
+chr2	222015	222047	b	b	-
+chr2	222015	222047	b	b	-
+chr2	222015	222047	b	b	-
+chr2	222051	222083	a	a	+
+chr2	222051	222083	a	a	+
+chr2	222019	222051	b	b	-
+chr2	222019	222051	b	b	-
+chr2	222019	222051	b	b	-
+chr2	222053	222085	a	a	+
+chr2	222023	222055	b	b	-
+chr2	222024	222056	b	b	-
+chr2	222024	222056	b	b	-
+chr2	222057	222089	a	a	+
+chr2	222025	222057	b	b	-
+chr2	222026	222058	b	b	-
+chr2	222026	222058	b	b	-
+chr2	222030	222062	b	b	-
+chr2	222032	222064	b	b	-
+chr2	222032	222064	b	b	-
+chr2	222032	222064	b	b	-
+chr2	222032	222064	b	b	-
+chr2	222033	222065	b	b	-
+chr2	222033	222065	b	b	-
+chr2	222033	222065	b	b	-
+chr2	222066	222098	a	a	+
+chr2	222034	222066	b	b	-
+chr2	222070	222102	a	a	+
+chr2	222070	222102	a	a	+
+chr2	222070	222102	a	a	+
+chr2	222070	222102	a	a	+
+chr2	222070	222102	a	a	+
+chr2	222070	222102	a	a	+
+chr2	222070	222102	a	a	+
+chr2	222070	222102	a	a	+
+chr2	222070	222102	a	a	+
+chr2	222070	222102	a	a	+
+chr2	222047	222079	b	b	-
+chr2	222047	222079	b	b	-
+chr2	222047	222079	b	b	-
+chr2	222082	222114	a	a	+
+chr2	222050	222082	b	b	-
+chr2	222050	222082	b	b	-
+chr2	222083	222115	a	a	+
+chr2	222083	222115	a	a	+
+chr2	222085	222117	a	a	+
+chr2	222085	222117	a	a	+
+chr2	222085	222117	a	a	+
+chr2	222085	222117	a	a	+
+chr2	222085	222117	a	a	+
+chr2	222086	222118	a	a	+
+chr2	222086	222118	a	a	+
+chr2	222086	222118	a	a	+
+chr2	222054	222086	b	b	-
+chr2	222054	222086	b	b	-
+chr2	222054	222086	b	b	-
+chr2	222054	222086	b	b	-
+chr2	222054	222086	b	b	-
+chr2	222054	222086	b	b	-
+chr2	222054	222086	b	b	-
+chr2	222054	222086	b	b	-
+chr2	222054	222086	b	b	-
+chr2	222054	222086	b	b	-
+chr2	222054	222086	b	b	-
+chr2	222054	222086	b	b	-
+chr2	222054	222086	b	b	-
+chr2	222055	222087	b	b	-
+chr2	222088	222120	a	a	+
+chr2	222109	222141	a	a	+
+chr2	222109	222141	a	a	+
+chr2	222109	222141	a	a	+
+chr2	222109	222141	a	a	+
+chr2	222109	222141	a	a	+
+chr2	222098	222130	b	b	-
+chr2	222132	222164	a	a	+
+chr2	222100	222132	b	b	-
+chr2	222100	222132	b	b	-
+chr2	222100	222132	b	b	-
+chr2	222101	222133	b	b	-
+chr2	222104	222136	b	b	-
+chr2	222104	222136	b	b	-
+chr2	222106	222138	b	b	-
+chr2	222106	222138	b	b	-
+chr2	222106	222138	b	b	-
+chr2	222140	222172	a	a	+
+chr2	222144	222176	a	a	+
+chr2	222144	222176	a	a	+
+chr2	222144	222176	a	a	+
+chr2	222113	222145	b	b	-
+chr2	222147	222179	a	a	+
+chr2	222148	222180	a	a	+
+chr2	222151	222183	a	a	+
+chr2	222151	222183	a	a	+
+chr2	222122	222154	b	b	-
+chr2	222122	222154	b	b	-
+chr2	222122	222154	b	b	-
+chr2	222122	222154	b	b	-
+chr2	222155	222187	a	a	+
+chr2	222123	222155	b	b	-
+chr2	222123	222155	b	b	-
+chr2	222158	222190	a	a	+
+chr2	222158	222190	a	a	+
+chr2	222158	222190	a	a	+
+chr2	222158	222190	a	a	+
+chr2	222158	222190	a	a	+
+chr2	222158	222190	a	a	+
+chr2	222159	222191	a	a	+
+chr2	222161	222193	a	a	+
+chr2	222161	222193	a	a	+
+chr2	222162	222194	a	a	+
+chr2	222162	222194	a	a	+
+chr2	222162	222194	a	a	+
+chr2	222130	222162	b	b	-
+chr2	222131	222163	b	b	-
+chr2	222131	222163	b	b	-
+chr2	222131	222163	b	b	-
+chr2	222131	222163	b	b	-
+chr2	222131	222163	b	b	-
+chr2	222131	222163	b	b	-
+chr2	222131	222163	b	b	-
+chr2	222131	222163	b	b	-
+chr2	222131	222163	b	b	-
+chr2	222131	222163	b	b	-
+chr2	222131	222163	b	b	-
+chr2	222131	222163	b	b	-
+chr2	222131	222163	b	b	-
+chr2	222131	222163	b	b	-
+chr2	222131	222163	b	b	-
+chr2	222132	222164	b	b	-
+chr2	222132	222164	b	b	-
+chr2	222132	222164	b	b	-
+chr2	222132	222164	b	b	-
+chr2	222133	222165	b	b	-
+chr2	222133	222165	b	b	-
+chr2	222133	222165	b	b	-
+chr2	222134	222166	b	b	-
+chr2	222134	222166	b	b	-
+chr2	222134	222166	b	b	-
+chr2	222134	222166	b	b	-
+chr2	222134	222166	b	b	-
+chr2	222134	222166	b	b	-
+chr2	222136	222168	b	b	-
+chr2	222136	222168	b	b	-
+chr2	222137	222169	b	b	-
+chr2	222140	222172	b	b	-
+chr2	222140	222172	b	b	-
+chr2	222140	222172	b	b	-
+chr2	222140	222172	b	b	-
+chr2	222140	222172	b	b	-
+chr2	222140	222172	b	b	-
+chr2	222141	222173	b	b	-
+chr2	222174	222206	a	a	+
+chr2	222142	222174	b	b	-
+chr2	222142	222174	b	b	-
+chr2	222142	222174	b	b	-
+chr2	222142	222174	b	b	-
+chr2	222142	222174	b	b	-
+chr2	222142	222174	b	b	-
+chr2	222143	222175	b	b	-
+chr2	222177	222209	a	a	+
+chr2	222177	222209	a	a	+
+chr2	222177	222209	a	a	+
+chr2	222177	222209	a	a	+
+chr2	222177	222209	a	a	+
+chr2	222177	222209	a	a	+
+chr2	222177	222209	a	a	+
+chr2	222177	222209	a	a	+
+chr2	222177	222209	a	a	+
+chr2	222177	222209	a	a	+
+chr2	222177	222209	a	a	+
+chr2	222177	222209	a	a	+
+chr2	222177	222209	a	a	+
+chr2	222177	222209	a	a	+
+chr2	222177	222209	a	a	+
+chr2	222177	222209	a	a	+
+chr2	222177	222209	a	a	+
+chr2	222177	222209	a	a	+
+chr2	222177	222209	a	a	+
+chr2	222177	222209	a	a	+
+chr2	222177	222209	a	a	+
+chr2	222177	222209	a	a	+
+chr2	222177	222209	a	a	+
+chr2	222177	222209	a	a	+
+chr2	222177	222209	a	a	+
+chr2	222146	222178	b	b	-
+chr2	222146	222178	b	b	-
+chr2	222146	222178	b	b	-
+chr2	222179	222211	a	a	+
+chr2	222179	222211	a	a	+
+chr2	222179	222211	a	a	+
+chr2	222179	222211	a	a	+
+chr2	222180	222212	a	a	+
+chr2	222180	222212	a	a	+
+chr2	222180	222212	a	a	+
+chr2	222180	222212	a	a	+
+chr2	222180	222212	a	a	+
+chr2	222180	222212	a	a	+
+chr2	222181	222213	a	a	+
+chr2	222181	222213	a	a	+
+chr2	222181	222213	a	a	+
+chr2	222181	222213	a	a	+
+chr2	222181	222213	a	a	+
+chr2	222181	222213	a	a	+
+chr2	222181	222213	a	a	+
+chr2	222181	222213	a	a	+
+chr2	222181	222213	a	a	+
+chr2	222181	222213	a	a	+
+chr2	222150	222182	b	b	-
+chr2	222150	222182	b	b	-
+chr2	222150	222182	b	b	-
+chr2	222186	222218	a	a	+
+chr2	222186	222218	a	a	+
+chr2	222186	222218	a	a	+
+chr2	222186	222218	a	a	+
+chr2	222187	222219	a	a	+
+chr2	222188	222220	a	a	+
+chr2	222188	222220	a	a	+
+chr2	222156	222188	b	b	-
+chr2	222190	222222	a	a	+
+chr2	222190	222222	a	a	+
+chr2	222158	222190	b	b	-
+chr2	222159	222191	b	b	-
+chr2	222159	222191	b	b	-
+chr2	222159	222191	b	b	-
+chr2	222159	222191	b	b	-
+chr2	222159	222191	b	b	-
+chr2	222159	222191	b	b	-
+chr2	222159	222191	b	b	-
+chr2	222159	222191	b	b	-
+chr2	222159	222191	b	b	-
+chr2	222159	222191	b	b	-
+chr2	222159	222191	b	b	-
+chr2	222192	222224	a	a	+
+chr2	222160	222192	b	b	-
+chr2	222160	222192	b	b	-
+chr2	222160	222192	b	b	-
+chr2	222160	222192	b	b	-
+chr2	222160	222192	b	b	-
+chr2	222161	222193	b	b	-
+chr2	222162	222194	b	b	-
+chr2	222162	222194	b	b	-
+chr2	222162	222194	b	b	-
+chr2	222195	222227	a	a	+
+chr2	222195	222227	a	a	+
+chr2	222196	222228	a	a	+
+chr2	222197	222229	a	a	+
+chr2	222197	222229	a	a	+
+chr2	222197	222229	a	a	+
+chr2	222197	222229	a	a	+
+chr2	222170	222202	b	b	-
+chr2	222172	222204	b	b	-
+chr2	222206	222238	a	a	+
+chr2	222206	222238	a	a	+
+chr2	222206	222238	a	a	+
+chr2	222175	222207	b	b	-
+chr2	222176	222208	b	b	-
+chr2	222177	222209	b	b	-
+chr2	222177	222209	b	b	-
+chr2	222177	222209	b	b	-
+chr2	222177	222209	b	b	-
+chr2	222213	222245	a	a	+
+chr2	222181	222213	b	b	-
+chr2	222214	222246	a	a	+
+chr2	222215	222247	a	a	+
+chr2	222215	222247	a	a	+
+chr2	222215	222247	a	a	+
+chr2	222215	222247	a	a	+
+chr2	222215	222247	a	a	+
+chr2	222215	222247	a	a	+
+chr2	222215	222247	a	a	+
+chr2	222215	222247	a	a	+
+chr2	222215	222247	a	a	+
+chr2	222185	222217	b	b	-
+chr2	222185	222217	b	b	-
+chr2	222186	222218	b	b	-
+chr2	222186	222218	b	b	-
+chr2	222186	222218	b	b	-
+chr2	222186	222218	b	b	-
+chr2	222186	222218	b	b	-
+chr2	222186	222218	b	b	-
+chr2	222186	222218	b	b	-
+chr2	222186	222218	b	b	-
+chr2	222186	222218	b	b	-
+chr2	222186	222218	b	b	-
+chr2	222186	222218	b	b	-
+chr2	222188	222220	b	b	-
+chr2	222189	222221	b	b	-
+chr2	222191	222223	b	b	-
+chr2	222191	222223	b	b	-
+chr2	222228	222260	a	a	+
+chr2	222228	222260	a	a	+
+chr2	222228	222260	a	a	+
+chr2	222228	222260	a	a	+
+chr2	222228	222260	a	a	+
+chr2	222200	222232	b	b	-
+chr2	222200	222232	b	b	-
+chr2	222200	222232	b	b	-
+chr2	222200	222232	b	b	-
+chr2	222200	222232	b	b	-
+chr2	222200	222232	b	b	-
+chr2	222200	222232	b	b	-
+chr2	222234	222266	a	a	+
+chr2	222235	222267	a	a	+
+chr2	222237	222269	a	a	+
+chr2	222238	222270	a	a	+
+chr2	222238	222270	a	a	+
+chr2	222239	222271	a	a	+
+chr2	222239	222271	a	a	+
+chr2	222239	222271	a	a	+
+chr2	222243	222275	a	a	+
+chr2	222243	222275	a	a	+
+chr2	222243	222275	a	a	+
+chr2	222243	222275	a	a	+
+chr2	222243	222275	a	a	+
+chr2	222243	222275	a	a	+
+chr2	222243	222275	a	a	+
+chr2	222213	222245	b	b	-
+chr2	222246	222278	a	a	+
+chr2	222246	222278	a	a	+
+chr2	222217	222249	b	b	-
+chr2	222217	222249	b	b	-
+chr2	222217	222249	b	b	-
+chr2	222271	222303	a	a	+
+chr2	222240	222272	b	b	-
+chr2	222254	222286	b	b	-
+chr2	222258	222290	b	b	-
+chr2	222293	222325	a	a	+
+chr2	222281	222313	b	b	-
+chr2	222316	222348	a	a	+
+chr2	222320	222352	a	a	+
+chr2	222322	222354	a	a	+
+chr2	222291	222323	b	b	-
+chr2	222324	222356	a	a	+
+chr2	222346	222378	a	a	+
+chr2	222333	222365	b	b	-
+chr2	222333	222365	b	b	-
+chr2	222369	222401	a	a	+
+chr2	222369	222401	a	a	+
+chr2	222385	222417	a	a	+
+chr2	222385	222417	a	a	+
+chr2	222375	222407	b	b	-
+chr2	222414	222446	a	a	+
+chr2	222414	222446	a	a	+
+chr2	222383	222415	b	b	-
+chr2	222429	222461	b	b	-
+chr2	222429	222461	b	b	-
+chr2	222429	222461	b	b	-
+chr2	222429	222461	b	b	-
+chr2	222443	222475	b	b	-
+chr2	222486	222518	a	a	+
+chr2	222494	222526	a	a	+
+chr2	222466	222498	b	b	-
+chr2	222502	222534	a	a	+
+chr2	222503	222535	a	a	+
+chr2	222503	222535	a	a	+
+chr2	222505	222537	a	a	+
+chr2	222508	222540	a	a	+
+chr2	222516	222548	a	a	+
+chr2	222516	222548	a	a	+
+chr2	222516	222548	a	a	+
+chr2	222516	222548	a	a	+
+chr2	222522	222554	a	a	+
+chr2	222510	222542	b	b	-
+chr2	222510	222542	b	b	-
+chr2	222555	222587	a	a	+
+chr2	222526	222558	b	b	-
+chr2	222526	222558	b	b	-
+chr2	222531	222563	b	b	-
+chr2	222532	222564	b	b	-
+chr2	222532	222564	b	b	-
+chr2	222538	222570	b	b	-
+chr2	222539	222571	b	b	-
+chr2	222541	222573	b	b	-
+chr2	222541	222573	b	b	-
+chr2	222541	222573	b	b	-
+chr2	222580	222612	a	a	+
+chr2	222560	222592	b	b	-
+chr2	222593	222625	a	a	+
+chr2	222593	222625	a	a	+
+chr2	222593	222625	a	a	+
+chr2	222594	222626	a	a	+
+chr2	222612	222644	a	a	+
+chr2	222581	222613	b	b	-
+chr2	222615	222647	a	a	+
+chr2	222615	222647	a	a	+
+chr2	222583	222615	b	b	-
+chr2	222631	222663	b	b	-
+chr2	222632	222664	b	b	-
+chr2	222633	222665	b	b	-
+chr2	222666	222698	a	a	+
+chr2	222668	222700	a	a	+
+chr2	222668	222700	a	a	+
+chr2	222669	222701	a	a	+
+chr2	222671	222703	a	a	+
+chr2	222671	222703	a	a	+
+chr2	222674	222706	a	a	+
+chr2	222646	222678	b	b	-
+chr2	222646	222678	b	b	-
+chr2	222646	222678	b	b	-
+chr2	222646	222678	b	b	-
+chr2	222647	222679	b	b	-
+chr2	222653	222685	b	b	-
+chr2	222662	222694	b	b	-
+chr2	222662	222694	b	b	-
+chr2	222662	222694	b	b	-
+chr2	222662	222694	b	b	-
+chr2	222662	222694	b	b	-
+chr2	222696	222728	a	a	+
+chr2	222696	222728	a	a	+
+chr2	222696	222728	a	a	+
+chr2	222696	222728	a	a	+
+chr2	222697	222729	a	a	+
+chr2	222665	222697	b	b	-
+chr2	222669	222701	b	b	-
+chr2	222675	222707	b	b	-
+chr2	222675	222707	b	b	-
+chr2	222708	222740	a	a	+
+chr2	222708	222740	a	a	+
+chr2	222710	222742	a	a	+
+chr2	222678	222710	b	b	-
+chr2	222678	222710	b	b	-
+chr2	222678	222710	b	b	-
+chr2	222678	222710	b	b	-
+chr2	222679	222711	b	b	-
+chr2	222712	222744	a	a	+
+chr2	222724	222756	a	a	+
+chr2	222697	222729	b	b	-
+chr2	222697	222729	b	b	-
+chr2	222700	222732	b	b	-
+chr2	222736	222768	a	a	+
+chr2	222736	222768	a	a	+
+chr2	222736	222768	a	a	+
+chr2	222705	222737	b	b	-
+chr2	222745	222777	a	a	+
+chr2	222713	222745	b	b	-
+chr2	222713	222745	b	b	-
+chr2	222722	222754	b	b	-
+chr2	222722	222754	b	b	-
+chr2	222756	222788	a	a	+
+chr2	222768	222800	a	a	+
+chr2	222788	222820	a	a	+
+chr2	222759	222791	b	b	-
+chr2	222764	222796	b	b	-
+chr2	222824	222856	a	a	+
+chr2	222812	222844	b	b	-
+chr2	222813	222845	b	b	-
+chr2	222830	222862	b	b	-
+chr2	222832	222864	b	b	-
+chr2	222835	222867	b	b	-
+chr2	222846	222878	b	b	-
+chr2	222879	222911	a	a	+
+chr2	222880	222912	a	a	+
+chr2	222849	222881	b	b	-
+chr2	222887	222919	a	a	+
+chr2	222855	222887	b	b	-
+chr2	222888	222920	a	a	+
+chr2	222856	222888	b	b	-
+chr2	222857	222889	b	b	-
+chr2	222895	222927	a	a	+
+chr2	222897	222929	a	a	+
+chr2	222866	222898	b	b	-
+chr2	222901	222933	a	a	+
+chr2	222902	222934	a	a	+
+chr2	222902	222934	a	a	+
+chr2	222903	222935	a	a	+
+chr2	222903	222935	a	a	+
+chr2	222903	222935	a	a	+
+chr2	222875	222907	b	b	-
+chr2	222908	222940	a	a	+
+chr2	222884	222916	b	b	-
+chr2	222884	222916	b	b	-
+chr2	222884	222916	b	b	-
+chr2	222920	222952	a	a	+
+chr2	222896	222928	b	b	-
+chr2	222901	222933	b	b	-
+chr2	222901	222933	b	b	-
+chr2	222901	222933	b	b	-
+chr2	222901	222933	b	b	-
+chr2	222921	222953	b	b	-
+chr2	222925	222957	b	b	-
+chr2	222977	223009	a	a	+
+chr2	222977	223009	a	a	+
+chr2	222977	223009	a	a	+
+chr2	222978	223010	a	a	+
+chr2	222950	222982	b	b	-
+chr2	222951	222983	b	b	-
+chr2	222988	223020	a	a	+
+chr2	222969	223001	b	b	-
+chr2	223018	223050	a	a	+
+chr2	223018	223050	a	a	+
+chr2	223018	223050	a	a	+
+chr2	222991	223023	b	b	-
+chr2	222993	223025	b	b	-
+chr2	223002	223034	b	b	-
+chr2	223003	223035	b	b	-
+chr2	223038	223070	a	a	+
+chr2	223010	223042	b	b	-
+chr2	223043	223075	a	a	+
+chr2	223048	223080	a	a	+
+chr2	223016	223048	b	b	-
+chr2	223056	223088	a	a	+
+chr2	223076	223108	a	a	+
+chr2	223044	223076	b	b	-
+chr2	223044	223076	b	b	-
+chr2	223044	223076	b	b	-
+chr2	223085	223117	a	a	+
+chr2	223056	223088	b	b	-
+chr2	223070	223102	b	b	-
+chr2	223107	223139	a	a	+
+chr2	223083	223115	b	b	-
+chr2	223090	223122	b	b	-
+chr2	223090	223122	b	b	-
+chr2	223093	223125	b	b	-
+chr2	223099	223131	b	b	-
+chr2	223140	223172	a	a	+
+chr2	223155	223187	a	a	+
+chr2	223124	223156	b	b	-
+chr2	223124	223156	b	b	-
+chr2	223124	223156	b	b	-
+chr2	223174	223206	a	a	+
+chr2	223174	223206	a	a	+
+chr2	223184	223216	a	a	+
+chr2	223184	223216	a	a	+
+chr2	223184	223216	a	a	+
+chr2	223184	223216	a	a	+
+chr2	223184	223216	a	a	+
+chr2	223184	223216	a	a	+
+chr2	223184	223216	a	a	+
+chr2	223184	223216	a	a	+
+chr2	223184	223216	a	a	+
+chr2	223184	223216	a	a	+
+chr2	223184	223216	a	a	+
+chr2	223184	223216	a	a	+
+chr2	223184	223216	a	a	+
+chr2	223184	223216	a	a	+
+chr2	223185	223217	a	a	+
+chr2	223186	223218	a	a	+
+chr2	223190	223222	a	a	+
+chr2	223190	223222	a	a	+
+chr2	223190	223222	a	a	+
+chr2	223158	223190	b	b	-
+chr2	223196	223228	a	a	+
+chr2	223168	223200	b	b	-
+chr2	223178	223210	b	b	-
+chr2	223178	223210	b	b	-
+chr2	223183	223215	b	b	-
+chr2	223195	223227	b	b	-
+chr2	223231	223263	a	a	+
+chr2	223241	223273	a	a	+
+chr2	223211	223243	b	b	-
+chr2	223217	223249	b	b	-
+chr2	223255	223287	a	a	+
+chr2	223262	223294	a	a	+
+chr2	223272	223304	a	a	+
+chr2	223242	223274	b	b	-
+chr2	223242	223274	b	b	-
+chr2	223281	223313	a	a	+
+chr2	223252	223284	b	b	-
+chr2	223252	223284	b	b	-
+chr2	223305	223337	a	a	+
+chr2	223279	223311	b	b	-
+chr2	223279	223311	b	b	-
+chr2	223279	223311	b	b	-
+chr2	223279	223311	b	b	-
+chr2	223279	223311	b	b	-
+chr2	223279	223311	b	b	-
+chr2	223315	223347	a	a	+
+chr2	223315	223347	a	a	+
+chr2	223315	223347	a	a	+
+chr2	223324	223356	a	a	+
+chr2	223324	223356	a	a	+
+chr2	223329	223361	a	a	+
+chr2	223331	223363	a	a	+
+chr2	223337	223369	a	a	+
+chr2	223349	223381	a	a	+
+chr2	223327	223359	b	b	-
+chr2	223327	223359	b	b	-
+chr2	223362	223394	a	a	+
+chr2	223334	223366	b	b	-
+chr2	223335	223367	b	b	-
+chr2	223379	223411	a	a	+
+chr2	223390	223422	a	a	+
+chr2	223392	223424	a	a	+
+chr2	223372	223404	b	b	-
+chr2	223380	223412	b	b	-
+chr2	223414	223446	a	a	+
+chr2	223414	223446	a	a	+
+chr2	223418	223450	a	a	+
+chr2	223388	223420	b	b	-
+chr2	223388	223420	b	b	-
+chr2	223388	223420	b	b	-
+chr2	223425	223457	a	a	+
+chr2	223425	223457	a	a	+
+chr2	223425	223457	a	a	+
+chr2	223416	223448	b	b	-
+chr2	223419	223451	b	b	-
+chr2	223419	223451	b	b	-
+chr2	223419	223451	b	b	-
+chr2	223419	223451	b	b	-
+chr2	223474	223506	a	a	+
+chr2	223474	223506	a	a	+
+chr2	223475	223507	a	a	+
+chr2	223479	223511	a	a	+
+chr2	223479	223511	a	a	+
+chr2	223480	223512	a	a	+
+chr2	223482	223514	a	a	+
+chr2	223450	223482	b	b	-
+chr2	223451	223483	b	b	-
+chr2	223454	223486	b	b	-
+chr2	223495	223527	a	a	+
+chr2	223496	223528	a	a	+
+chr2	223496	223528	a	a	+
+chr2	223481	223513	b	b	-
+chr2	223515	223547	a	a	+
+chr2	223518	223550	a	a	+
+chr2	223518	223550	a	a	+
+chr2	223491	223523	b	b	-
+chr2	223492	223524	b	b	-
+chr2	223492	223524	b	b	-
+chr2	223529	223561	a	a	+
+chr2	223534	223566	a	a	+
+chr2	223503	223535	b	b	-
+chr2	223537	223569	a	a	+
+chr2	223537	223569	a	a	+
+chr2	223544	223576	a	a	+
+chr2	223544	223576	a	a	+
+chr2	223544	223576	a	a	+
+chr2	223544	223576	a	a	+
+chr2	223574	223606	a	a	+
+chr2	223543	223575	b	b	-
+chr2	223577	223609	a	a	+
+chr2	223560	223592	b	b	-
+chr2	223560	223592	b	b	-
+chr2	223560	223592	b	b	-
+chr2	223604	223636	a	a	+
+chr2	223610	223642	a	a	+
+chr2	223582	223614	b	b	-
+chr2	223634	223666	a	a	+
+chr2	223636	223668	a	a	+
+chr2	223639	223671	a	a	+
+chr2	223639	223671	a	a	+
+chr2	223618	223650	b	b	-
+chr2	223618	223650	b	b	-
+chr2	223625	223657	b	b	-
+chr2	223665	223697	a	a	+
+chr2	223634	223666	b	b	-
+chr2	223672	223704	a	a	+
+chr2	223640	223672	b	b	-
+chr2	223640	223672	b	b	-
+chr2	223677	223709	a	a	+
+chr2	223678	223710	a	a	+
+chr2	223683	223715	a	a	+
+chr2	223684	223716	a	a	+
+chr2	223687	223719	a	a	+
+chr2	223657	223689	b	b	-
+chr2	223667	223699	b	b	-
+chr2	223742	223774	a	a	+
+chr2	223742	223774	a	a	+
+chr2	223715	223747	b	b	-
+chr2	223715	223747	b	b	-
+chr2	223771	223803	a	a	+
+chr2	223762	223794	b	b	-
+chr2	223762	223794	b	b	-
+chr2	223776	223808	b	b	-
+chr2	223776	223808	b	b	-
+chr2	223830	223862	a	a	+
+chr2	223799	223831	b	b	-
+chr2	223808	223840	b	b	-
+chr2	223810	223842	b	b	-
+chr2	223848	223880	a	a	+
+chr2	223849	223881	a	a	+
+chr2	223849	223881	a	a	+
+chr2	223818	223850	b	b	-
+chr2	223820	223852	b	b	-
+chr2	223853	223885	a	a	+
+chr2	223822	223854	b	b	-
+chr2	223822	223854	b	b	-
+chr2	223822	223854	b	b	-
+chr2	223855	223887	a	a	+
+chr2	223856	223888	a	a	+
+chr2	223824	223856	b	b	-
+chr2	223827	223859	b	b	-
+chr2	223860	223892	a	a	+
+chr2	223864	223896	a	a	+
+chr2	223835	223867	b	b	-
+chr2	223869	223901	a	a	+
+chr2	223837	223869	b	b	-
+chr2	223845	223877	b	b	-
+chr2	223893	223925	a	a	+
+chr2	223893	223925	a	a	+
+chr2	223895	223927	a	a	+
+chr2	223874	223906	b	b	-
+chr2	223880	223912	b	b	-
+chr2	223880	223912	b	b	-
+chr2	223914	223946	a	a	+
+chr2	223888	223920	b	b	-
+chr2	223921	223953	a	a	+
+chr2	223921	223953	a	a	+
+chr2	223930	223962	a	a	+
+chr2	223938	223970	a	a	+
+chr2	223911	223943	b	b	-
+chr2	223949	223981	a	a	+
+chr2	223922	223954	b	b	-
+chr2	223959	223991	a	a	+
+chr2	223959	223991	a	a	+
+chr2	223928	223960	b	b	-
+chr2	223964	223996	b	b	-
+chr2	223964	223996	b	b	-
+chr2	223998	224030	a	a	+
+chr2	223998	224030	a	a	+
+chr2	223967	223999	b	b	-
+chr2	223977	224009	b	b	-
+chr2	223981	224013	b	b	-
+chr2	223981	224013	b	b	-
+chr2	223997	224029	b	b	-
+chr2	223997	224029	b	b	-
+chr2	223997	224029	b	b	-
+chr2	224039	224071	a	a	+
+chr2	224016	224048	b	b	-
+chr2	224018	224050	b	b	-
+chr2	224020	224052	b	b	-
+chr2	224024	224056	b	b	-
+chr2	224066	224098	a	a	+
+chr2	224035	224067	b	b	-
+chr2	224070	224102	a	a	+
+chr2	224070	224102	a	a	+
+chr2	224108	224140	a	a	+
+chr2	224109	224141	a	a	+
+chr2	224130	224162	a	a	+
+chr2	224117	224149	b	b	-
+chr2	224121	224153	b	b	-
+chr2	224135	224167	b	b	-
+chr2	224135	224167	b	b	-
+chr2	224135	224167	b	b	-
+chr2	224137	224169	b	b	-
+chr2	224138	224170	b	b	-
+chr2	224144	224176	b	b	-
+chr2	224178	224210	a	a	+
+chr2	224162	224194	b	b	-
+chr2	224162	224194	b	b	-
+chr2	224169	224201	b	b	-
+chr2	224184	224216	b	b	-
+chr2	224187	224219	b	b	-
+chr2	224228	224260	a	a	+
+chr2	224238	224270	a	a	+
+chr2	224213	224245	b	b	-
+chr2	224250	224282	a	a	+
+chr2	224237	224269	b	b	-
+chr2	224277	224309	a	a	+
+chr2	224252	224284	b	b	-
+chr2	224258	224290	b	b	-
+chr2	224258	224290	b	b	-
+chr2	224296	224328	a	a	+
+chr2	224285	224317	b	b	-
+chr2	224286	224318	b	b	-
+chr2	224286	224318	b	b	-
+chr2	224290	224322	b	b	-
+chr2	224290	224322	b	b	-
+chr2	224291	224323	b	b	-
+chr2	224291	224323	b	b	-
+chr2	224338	224370	b	b	-
+chr2	224372	224404	a	a	+
+chr2	224357	224389	b	b	-
+chr2	224357	224389	b	b	-
+chr2	224392	224424	a	a	+
+chr2	224388	224420	b	b	-
+chr2	224393	224425	b	b	-
+chr2	224397	224429	b	b	-
+chr2	224440	224472	a	a	+
+chr2	224442	224474	a	a	+
+chr2	224410	224442	b	b	-
+chr2	224410	224442	b	b	-
+chr2	224410	224442	b	b	-
+chr2	224414	224446	b	b	-
+chr2	224414	224446	b	b	-
+chr2	224455	224487	a	a	+
+chr2	224441	224473	b	b	-
+chr2	224441	224473	b	b	-
+chr2	224478	224510	a	a	+
+chr2	224481	224513	a	a	+
+chr2	224481	224513	a	a	+
+chr2	224500	224532	a	a	+
+chr2	224492	224524	b	b	-
+chr2	224495	224527	b	b	-
+chr2	224496	224528	b	b	-
+chr2	224518	224550	b	b	-
+chr2	224524	224556	b	b	-
+chr2	224529	224561	b	b	-
+chr2	224566	224598	a	a	+
+chr2	224579	224611	a	a	+
+chr2	224579	224611	a	a	+
+chr2	224561	224593	b	b	-
+chr2	224577	224609	b	b	-
+chr2	224585	224617	b	b	-
+chr2	224602	224634	b	b	-
+chr2	224646	224678	a	a	+
+chr2	224647	224679	a	a	+
+chr2	224679	224711	a	a	+
+chr2	224656	224688	b	b	-
+chr2	224697	224729	b	b	-
+chr2	224706	224738	b	b	-
+chr2	224742	224774	b	b	-
+chr2	224776	224808	a	a	+
+chr2	224744	224776	b	b	-
+chr2	224790	224822	a	a	+
+chr2	224791	224823	a	a	+
+chr2	224791	224823	a	a	+
+chr2	224773	224805	b	b	-
+chr2	224809	224841	a	a	+
+chr2	224825	224857	a	a	+
+chr2	224854	224886	a	a	+
+chr2	224886	224918	a	a	+
+chr2	224876	224908	b	b	-
+chr2	224915	224947	a	a	+
+chr2	224923	224955	a	a	+
+chr2	224900	224932	b	b	-
+chr2	224935	224967	a	a	+
+chr2	224935	224967	a	a	+
+chr2	224904	224936	b	b	-
+chr2	224927	224959	b	b	-
+chr2	224964	224996	a	a	+
+chr2	224980	225012	a	a	+
+chr2	224948	224980	b	b	-
+chr2	224971	225003	b	b	-
+chr2	225021	225053	a	a	+
+chr2	224995	225027	b	b	-
+chr2	225007	225039	b	b	-
+chr2	225045	225077	a	a	+
+chr2	225015	225047	b	b	-
+chr2	225054	225086	a	a	+
+chr2	225066	225098	a	a	+
+chr2	225038	225070	b	b	-
+chr2	225039	225071	b	b	-
+chr2	225083	225115	a	a	+
+chr2	225068	225100	b	b	-
+chr2	225086	225118	b	b	-
+chr2	225148	225180	a	a	+
+chr2	225157	225189	a	a	+
+chr2	225170	225202	a	a	+
+chr2	225174	225206	a	a	+
+chr2	225215	225247	a	a	+
+chr2	225184	225216	b	b	-
+chr2	225223	225255	a	a	+
+chr2	225199	225231	b	b	-
+chr2	225199	225231	b	b	-
+chr2	225234	225266	a	a	+
+chr2	225204	225236	b	b	-
+chr2	225250	225282	a	a	+
+chr2	225250	225282	a	a	+
+chr2	225260	225292	a	a	+
+chr2	225230	225262	b	b	-
+chr2	225233	225265	b	b	-
+chr2	225233	225265	b	b	-
+chr2	225233	225265	b	b	-
+chr2	225240	225272	b	b	-
+chr2	225275	225307	a	a	+
+chr2	225248	225280	b	b	-
+chr2	225248	225280	b	b	-
+chr2	225284	225316	a	a	+
+chr2	225285	225317	a	a	+
+chr2	225292	225324	a	a	+
+chr2	225263	225295	b	b	-
+chr2	225301	225333	a	a	+
+chr2	225301	225333	a	a	+
+chr2	225302	225334	a	a	+
+chr2	225303	225335	a	a	+
+chr2	225312	225344	a	a	+
+chr2	225314	225346	a	a	+
+chr2	225369	225401	a	a	+
+chr2	225397	225429	a	a	+
+chr2	225373	225405	b	b	-
+chr2	225385	225417	b	b	-
+chr2	225402	225434	b	b	-
+chr2	225440	225472	a	a	+
+chr2	225440	225472	a	a	+
+chr2	225450	225482	a	a	+
+chr2	225426	225458	b	b	-
+chr2	225491	225523	a	a	+
+chr2	225492	225524	a	a	+
+chr2	225493	225525	a	a	+
+chr2	225469	225501	b	b	-
+chr2	225469	225501	b	b	-
+chr2	225515	225547	a	a	+
+chr2	225515	225547	a	a	+
+chr2	225518	225550	a	a	+
+chr2	225519	225551	a	a	+
+chr2	225491	225523	b	b	-
+chr2	225524	225556	a	a	+
+chr2	225505	225537	b	b	-
+chr2	225505	225537	b	b	-
+chr2	225505	225537	b	b	-
+chr2	225505	225537	b	b	-
+chr2	225505	225537	b	b	-
+chr2	225512	225544	b	b	-
+chr2	225557	225589	a	a	+
+chr2	225530	225562	b	b	-
+chr2	225585	225617	b	b	-
+chr2	225620	225652	a	a	+
+chr2	225721	225753	b	b	-
+chr2	225737	225769	b	b	-
+chr2	225788	225820	a	a	+
+chr2	225793	225825	a	a	+
+chr2	225793	225825	a	a	+
+chr2	225804	225836	a	a	+
+chr2	225772	225804	b	b	-
+chr2	225823	225855	a	a	+
+chr2	225796	225828	b	b	-
+chr2	225809	225841	b	b	-
+chr2	225811	225843	b	b	-
+chr2	225844	225876	a	a	+
+chr2	225816	225848	b	b	-
+chr2	225860	225892	a	a	+
+chr2	225834	225866	b	b	-
+chr2	225873	225905	a	a	+
+chr2	225877	225909	a	a	+
+chr2	225846	225878	b	b	-
+chr2	225879	225911	a	a	+
+chr2	225847	225879	b	b	-
+chr2	225883	225915	a	a	+
+chr2	225856	225888	b	b	-
+chr2	225860	225892	b	b	-
+chr2	225895	225927	a	a	+
+chr2	225896	225928	a	a	+
+chr2	225887	225919	b	b	-
+chr2	225931	225963	a	a	+
+chr2	225932	225964	a	a	+
+chr2	225953	225985	a	a	+
+chr2	225928	225960	b	b	-
+chr2	226000	226032	a	a	+
+chr2	225994	226026	b	b	-
+chr2	226027	226059	a	a	+
+chr2	226034	226066	b	b	-
+chr2	226076	226108	a	a	+
+chr2	226115	226147	a	a	+
+chr2	226094	226126	b	b	-
+chr2	226115	226147	b	b	-
+chr2	226180	226212	a	a	+
+chr2	226180	226212	a	a	+
+chr2	226180	226212	a	a	+
+chr2	226182	226214	a	a	+
+chr2	226193	226225	b	b	-
+chr2	226229	226261	a	a	+
+chr2	226230	226262	a	a	+
+chr2	226200	226232	b	b	-
+chr2	226201	226233	b	b	-
+chr2	226244	226276	a	a	+
+chr2	226244	226276	a	a	+
+chr2	226245	226277	a	a	+
+chr2	226225	226257	b	b	-
+chr2	226258	226290	a	a	+
+chr2	226288	226320	a	a	+
+chr2	226271	226303	b	b	-
+chr2	226316	226348	a	a	+
+chr2	226316	226348	a	a	+
+chr2	226316	226348	a	a	+
+chr2	226325	226357	a	a	+
+chr2	226299	226331	b	b	-
+chr2	226299	226331	b	b	-
+chr2	226301	226333	b	b	-
+chr2	226302	226334	b	b	-
+chr2	226451	226483	a	a	+
+chr2	226474	226506	a	a	+
+chr2	226502	226534	a	a	+
+chr2	226471	226503	b	b	-
+chr2	226524	226556	a	a	+
+chr2	226497	226529	b	b	-
+chr2	226497	226529	b	b	-
+chr2	226533	226565	a	a	+
+chr2	226551	226583	a	a	+
+chr2	226551	226583	a	a	+
+chr2	226522	226554	b	b	-
+chr2	226525	226557	b	b	-
+chr2	226546	226578	b	b	-
+chr2	226568	226600	b	b	-
+chr2	226618	226650	b	b	-
+chr2	226626	226658	b	b	-
+chr2	226629	226661	b	b	-
+chr2	226630	226662	b	b	-
+chr2	226631	226663	b	b	-
+chr2	226640	226672	b	b	-
+chr2	226640	226672	b	b	-
+chr2	226642	226674	b	b	-
+chr2	226642	226674	b	b	-
+chr2	226642	226674	b	b	-
+chr2	226645	226677	b	b	-
+chr2	226653	226685	b	b	-
+chr2	226653	226685	b	b	-
+chr2	226654	226686	b	b	-
+chr2	226657	226689	b	b	-
+chr2	226657	226689	b	b	-
+chr2	226657	226689	b	b	-
+chr2	226657	226689	b	b	-
+chr2	226658	226690	b	b	-
+chr2	226658	226690	b	b	-
+chr2	226658	226690	b	b	-
+chr2	226658	226690	b	b	-
+chr2	226663	226695	b	b	-
+chr2	226697	226729	a	a	+
+chr2	226697	226729	a	a	+
+chr2	226697	226729	a	a	+
+chr2	226697	226729	a	a	+
+chr2	226697	226729	a	a	+
+chr2	226697	226729	a	a	+
+chr2	226697	226729	a	a	+
+chr2	226697	226729	a	a	+
+chr2	226697	226729	a	a	+
+chr2	226666	226698	b	b	-
+chr2	226700	226732	a	a	+
+chr2	226668	226700	b	b	-
+chr2	226669	226701	b	b	-
+chr2	226669	226701	b	b	-
+chr2	226670	226702	b	b	-
+chr2	226671	226703	b	b	-
+chr2	226708	226740	a	a	+
+chr2	226708	226740	a	a	+
+chr2	226677	226709	b	b	-
+chr2	226711	226743	a	a	+
+chr2	226679	226711	b	b	-
+chr2	226679	226711	b	b	-
+chr2	226714	226746	a	a	+
+chr2	226714	226746	a	a	+
+chr2	226718	226750	a	a	+
+chr2	226687	226719	b	b	-
+chr2	226690	226722	b	b	-
+chr2	226690	226722	b	b	-
+chr2	226691	226723	b	b	-
+chr2	226697	226729	b	b	-
+chr2	226697	226729	b	b	-
+chr2	226700	226732	b	b	-
+chr2	226704	226736	b	b	-
+chr2	226707	226739	b	b	-
+chr2	226743	226775	a	a	+
+chr2	226714	226746	b	b	-
+chr2	226714	226746	b	b	-
+chr2	226715	226747	b	b	-
+chr2	226748	226780	a	a	+
+chr2	226716	226748	b	b	-
+chr2	226751	226783	a	a	+
+chr2	226753	226785	a	a	+
+chr2	226753	226785	a	a	+
+chr2	226722	226754	b	b	-
+chr2	226722	226754	b	b	-
+chr2	226758	226790	a	a	+
+chr2	226759	226791	a	a	+
+chr2	226760	226792	a	a	+
+chr2	226761	226793	a	a	+
+chr2	226762	226794	a	a	+
+chr2	226737	226769	b	b	-
+chr2	226770	226802	a	a	+
+chr2	226743	226775	b	b	-
+chr2	226743	226775	b	b	-
+chr2	226776	226808	a	a	+
+chr2	226776	226808	a	a	+
+chr2	226744	226776	b	b	-
+chr2	226744	226776	b	b	-
+chr2	226747	226779	b	b	-
+chr2	226748	226780	b	b	-
+chr2	226748	226780	b	b	-
+chr2	226749	226781	b	b	-
+chr2	226750	226782	b	b	-
+chr2	226750	226782	b	b	-
+chr2	226786	226818	a	a	+
+chr2	226788	226820	a	a	+
+chr2	226788	226820	a	a	+
+chr2	226766	226798	b	b	-
+chr2	226770	226802	b	b	-
+chr2	226770	226802	b	b	-
+chr2	226770	226802	b	b	-
+chr2	226772	226804	b	b	-
+chr2	226772	226804	b	b	-
+chr2	226773	226805	b	b	-
+chr2	226773	226805	b	b	-
+chr2	226773	226805	b	b	-
+chr2	226773	226805	b	b	-
+chr2	226781	226813	b	b	-
+chr2	226782	226814	b	b	-
+chr2	226783	226815	b	b	-
+chr2	226820	226852	a	a	+
+chr2	226794	226826	b	b	-
+chr2	226800	226832	b	b	-
+chr2	226836	226868	a	a	+
+chr2	226843	226875	a	a	+
+chr2	226843	226875	a	a	+
+chr2	226844	226876	a	a	+
+chr2	226844	226876	a	a	+
+chr2	226851	226883	a	a	+
+chr2	226827	226859	b	b	-
+chr2	226862	226894	a	a	+
+chr2	226830	226862	b	b	-
+chr2	226863	226895	a	a	+
+chr2	226864	226896	a	a	+
+chr2	226864	226896	a	a	+
+chr2	226864	226896	a	a	+
+chr2	226832	226864	b	b	-
+chr2	226838	226870	b	b	-
+chr2	226838	226870	b	b	-
+chr2	226872	226904	a	a	+
+chr2	226872	226904	a	a	+
+chr2	226843	226875	b	b	-
+chr2	226843	226875	b	b	-
+chr2	226843	226875	b	b	-
+chr2	226843	226875	b	b	-
+chr2	226878	226910	a	a	+
+chr2	226880	226912	a	a	+
+chr2	226850	226882	b	b	-
+chr2	226850	226882	b	b	-
+chr2	226850	226882	b	b	-
+chr2	226850	226882	b	b	-
+chr2	226884	226916	a	a	+
+chr2	226888	226920	a	a	+
+chr2	226890	226922	a	a	+
+chr2	226892	226924	a	a	+
+chr2	226893	226925	a	a	+
+chr2	226894	226926	a	a	+
+chr2	226896	226928	a	a	+
+chr2	226897	226929	a	a	+
+chr2	226901	226933	a	a	+
+chr2	226904	226936	a	a	+
+chr2	226905	226937	a	a	+
+chr2	226905	226937	a	a	+
+chr2	226905	226937	a	a	+
+chr2	226905	226937	a	a	+
+chr2	226905	226937	a	a	+
+chr2	226905	226937	a	a	+
+chr2	226905	226937	a	a	+
+chr2	226905	226937	a	a	+
+chr2	226905	226937	a	a	+
+chr2	226905	226937	a	a	+
+chr2	226905	226937	a	a	+
+chr2	226905	226937	a	a	+
+chr2	226905	226937	a	a	+
+chr2	226905	226937	a	a	+
+chr2	226905	226937	a	a	+
+chr2	226905	226937	a	a	+
+chr2	226905	226937	a	a	+
+chr2	226906	226938	a	a	+
+chr2	226906	226938	a	a	+
+chr2	226906	226938	a	a	+
+chr2	226906	226938	a	a	+
+chr2	226906	226938	a	a	+
+chr2	226908	226940	a	a	+
+chr2	226909	226941	a	a	+
+chr2	226909	226941	a	a	+
+chr2	226909	226941	a	a	+
+chr2	226911	226943	a	a	+
+chr2	226914	226946	a	a	+
+chr2	226915	226947	a	a	+
+chr2	226918	226950	a	a	+
+chr2	226919	226951	a	a	+
+chr2	226919	226951	a	a	+
+chr2	226919	226951	a	a	+
+chr2	226922	226954	a	a	+
+chr2	226923	226955	a	a	+
+chr2	226929	226961	a	a	+
+chr2	226930	226962	a	a	+
+chr2	226934	226966	a	a	+
+chr2	226934	226966	a	a	+
+chr2	227251	227283	a	a	+
+chr2	227252	227284	a	a	+
+chr2	227253	227285	a	a	+
+chr2	227255	227287	a	a	+
+chr2	227225	227257	b	b	-
+chr2	227229	227261	b	b	-
+chr2	227263	227295	a	a	+
+chr2	227231	227263	b	b	-
+chr2	227231	227263	b	b	-
+chr2	227231	227263	b	b	-
+chr2	227232	227264	b	b	-
+chr2	227269	227301	a	a	+
+chr2	227570	227602	a	a	+
+chr2	227570	227602	a	a	+
+chr2	227574	227606	a	a	+
+chr2	227584	227616	a	a	+
+chr2	227555	227587	b	b	-
+chr2	227557	227589	b	b	-
+chr2	227621	227653	a	a	+
+chr2	227740	227772	a	a	+
+chr2	227745	227777	a	a	+
+chr2	227729	227761	b	b	-
+chr2	228119	228151	b	b	-
+chr2	228234	228266	b	b	-
+chr2	228418	228450	a	a	+
+chr2	228600	228632	b	b	-
+chr2	229460	229492	a	a	+
+chr2	229460	229492	a	a	+
+chr2	229523	229555	b	b	-
+chr2	229832	229864	b	b	-
+chr2	231523	231555	b	b	-
+chr2	231817	231849	b	b	-
+chr2	232003	232035	a	a	+
+chr2	232004	232036	a	a	+
+chr2	232662	232694	a	a	+
+chr2	232753	232785	a	a	+
+chr2	232970	233002	b	b	-
+chr2	233020	233052	b	b	-
+chr2	234218	234250	b	b	-
+chr2	234394	234426	b	b	-
+chr2	234394	234426	b	b	-
+chr2	234815	234847	b	b	-
+chr2	235418	235450	a	a	+
+chr2	235419	235451	b	b	-
+chr2	235580	235612	a	a	+
+chr2	235552	235584	b	b	-
+chr2	235583	235615	b	b	-
+chr2	235583	235615	b	b	-
+chr2	235632	235664	a	a	+
+chr2	235611	235643	b	b	-
+chr2	235639	235671	b	b	-
+chr2	235694	235726	a	a	+
+chr2	235667	235699	b	b	-
+chr2	235667	235699	b	b	-
+chr2	235668	235700	b	b	-
+chr2	235676	235708	b	b	-
+chr2	235715	235747	a	a	+
+chr2	235689	235721	b	b	-
+chr2	235690	235722	b	b	-
+chr2	235728	235760	a	a	+
+chr2	235745	235777	b	b	-
+chr2	235964	235996	a	a	+
+chr2	236505	236537	a	a	+
+chr2	236505	236537	a	a	+
+chr2	236488	236520	b	b	-
+chr2	236497	236529	b	b	-
+chr2	236536	236568	a	a	+
+chr2	236512	236544	b	b	-
+chr2	236548	236580	a	a	+
+chr2	236519	236551	b	b	-
+chr2	236529	236561	b	b	-
+chr2	236560	236592	b	b	-
+chr2	236561	236593	b	b	-
+chr2	236617	236649	a	a	+
+chr2	236617	236649	a	a	+
+chr2	236654	236686	b	b	-
+chr2	236654	236686	b	b	-
+chr2	236824	236856	b	b	-
+chr2	236824	236856	b	b	-
+chr2	237272	237304	a	a	+
+chr2	237240	237272	b	b	-
+chr2	237249	237281	b	b	-
+chr2	237249	237281	b	b	-
+chr2	237249	237281	b	b	-
+chr2	237288	237320	a	a	+
+chr2	237288	237320	a	a	+
+chr2	237267	237299	b	b	-
+chr2	237287	237319	b	b	-
+chr2	237330	237362	a	a	+
+chr2	237419	237451	a	a	+
+chr2	237419	237451	a	a	+
+chr2	237432	237464	a	a	+
+chr2	237454	237486	a	a	+
+chr2	237457	237489	a	a	+
+chr2	237429	237461	b	b	-
+chr2	237469	237501	a	a	+
+chr2	237441	237473	b	b	-
+chr2	237441	237473	b	b	-
+chr2	237444	237476	b	b	-
+chr2	237480	237512	a	a	+
+chr2	237451	237483	b	b	-
+chr2	237455	237487	b	b	-
+chr2	237455	237487	b	b	-
+chr2	237457	237489	b	b	-
+chr2	237459	237491	b	b	-
+chr2	237556	237588	a	a	+
+chr2	237730	237762	a	a	+
+chr2	237730	237762	a	a	+
+chr2	237709	237741	b	b	-
+chr2	237712	237744	b	b	-
+chr2	237754	237786	a	a	+
+chr2	238027	238059	b	b	-
+chr2	238078	238110	a	a	+
+chr2	238102	238134	a	a	+
+chr2	238103	238135	a	a	+
+chr2	238448	238480	b	b	-
+chr2	238520	238552	a	a	+
+chr2	238520	238552	a	a	+
+chr2	238493	238525	b	b	-
+chr2	238493	238525	b	b	-
+chr2	238493	238525	b	b	-
+chr2	238526	238558	a	a	+
+chr2	238526	238558	a	a	+
+chr2	238494	238526	b	b	-
+chr2	238494	238526	b	b	-
+chr2	238494	238526	b	b	-
+chr2	238494	238526	b	b	-
+chr2	238494	238526	b	b	-
+chr2	238527	238559	a	a	+
+chr2	238504	238536	b	b	-
+chr2	238507	238539	b	b	-
+chr2	238541	238573	a	a	+
+chr2	238541	238573	a	a	+
+chr2	238542	238574	a	a	+
+chr2	238510	238542	b	b	-
+chr2	238512	238544	b	b	-
+chr2	238545	238577	a	a	+
+chr2	238529	238561	b	b	-
+chr2	238540	238572	b	b	-
+chr2	238629	238661	b	b	-
+chr2	238677	238709	a	a	+
+chr2	238652	238684	b	b	-
+chr2	238653	238685	b	b	-
+chr2	238658	238690	b	b	-
+chr2	238699	238731	a	a	+
+chr2	238699	238731	a	a	+
+chr2	238700	238732	a	a	+
+chr2	238668	238700	b	b	-
+chr2	239022	239054	b	b	-
+chr2	239055	239087	a	a	+
+chr2	239070	239102	a	a	+
+chr2	239209	239241	a	a	+
+chr2	239186	239218	b	b	-
+chr2	239216	239248	b	b	-
+chr2	239275	239307	b	b	-
+chr2	240371	240403	b	b	-
+chr2	240396	240428	b	b	-
+chr2	240548	240580	a	a	+
+chr2	240551	240583	b	b	-
+chr2	240560	240592	b	b	-
+chr2	240561	240593	b	b	-
+chr2	240765	240797	a	a	+
+chr2	240824	240856	a	a	+
+chr2	240883	240915	a	a	+
+chr2	240905	240937	a	a	+
+chr2	241040	241072	b	b	-
+chr2	241199	241231	a	a	+
+chr2	241200	241232	a	a	+
+chr2	241202	241234	a	a	+
+chr2	241175	241207	b	b	-
+chr2	241175	241207	b	b	-
+chr2	241179	241211	b	b	-
+chr2	241179	241211	b	b	-
+chr2	241219	241251	a	a	+
+chr2	241189	241221	b	b	-
+chr2	241189	241221	b	b	-
+chr2	241253	241285	b	b	-
+chr2	241723	241755	a	a	+
+chr2	241840	241872	a	a	+
+chr2	241840	241872	a	a	+
+chr2	241855	241887	a	a	+
+chr2	241972	242004	a	a	+
+chr2	241977	242009	b	b	-
+chr2	242060	242092	a	a	+
+chr2	242151	242183	b	b	-
+chr2	242156	242188	b	b	-
+chr2	242202	242234	a	a	+
+chr2	242234	242266	a	a	+
+chr2	242354	242386	a	a	+
+chr2	242354	242386	a	a	+
+chr2	242324	242356	b	b	-
+chr2	242365	242397	a	a	+
+chr2	242447	242479	a	a	+
+chr2	242445	242477	b	b	-
+chr2	242445	242477	b	b	-
+chr2	242445	242477	b	b	-
+chr2	242506	242538	a	a	+
+chr2	242512	242544	a	a	+
+chr2	242513	242545	a	a	+
+chr2	242481	242513	b	b	-
+chr2	242514	242546	a	a	+
+chr2	242517	242549	a	a	+
+chr2	242490	242522	b	b	-
+chr2	242490	242522	b	b	-
+chr2	242531	242563	a	a	+
+chr2	242534	242566	a	a	+
+chr2	242502	242534	b	b	-
+chr2	242502	242534	b	b	-
+chr2	242535	242567	a	a	+
+chr2	242503	242535	b	b	-
+chr2	242504	242536	b	b	-
+chr2	242504	242536	b	b	-
+chr2	242504	242536	b	b	-
+chr2	242510	242542	b	b	-
+chr2	242510	242542	b	b	-
+chr2	242543	242575	a	a	+
+chr2	242543	242575	a	a	+
+chr2	242543	242575	a	a	+
+chr2	242511	242543	b	b	-
+chr2	242546	242578	a	a	+
+chr2	242546	242578	a	a	+
+chr2	242552	242584	a	a	+
+chr2	242520	242552	b	b	-
+chr2	242574	242606	a	a	+
+chr2	242740	242772	b	b	-
+chr2	242779	242811	b	b	-
+chr2	242779	242811	b	b	-
+chr2	242779	242811	b	b	-
+chr2	242789	242821	b	b	-
+chr2	242789	242821	b	b	-
+chr2	242789	242821	b	b	-
+chr2	242791	242823	b	b	-
+chr2	242824	242856	a	a	+
+chr2	242825	242857	a	a	+
+chr2	242825	242857	a	a	+
+chr2	242825	242857	a	a	+
+chr2	242825	242857	a	a	+
+chr2	242827	242859	a	a	+
+chr2	242830	242862	a	a	+
+chr2	242831	242863	a	a	+
+chr2	242831	242863	a	a	+
+chr2	242833	242865	a	a	+
+chr2	242833	242865	a	a	+
+chr2	242802	242834	b	b	-
+chr2	242804	242836	b	b	-
+chr2	242804	242836	b	b	-
+chr2	242804	242836	b	b	-
+chr2	242805	242837	b	b	-
+chr2	242805	242837	b	b	-
+chr2	242805	242837	b	b	-
+chr2	242805	242837	b	b	-
+chr2	242838	242870	a	a	+
+chr2	242806	242838	b	b	-
+chr2	242839	242871	a	a	+
+chr2	242839	242871	a	a	+
+chr2	242839	242871	a	a	+
+chr2	242839	242871	a	a	+
+chr2	242839	242871	a	a	+
+chr2	242839	242871	a	a	+
+chr2	242808	242840	b	b	-
+chr2	242808	242840	b	b	-
+chr2	242808	242840	b	b	-
+chr2	242843	242875	a	a	+
+chr2	242844	242876	a	a	+
+chr2	242812	242844	b	b	-
+chr2	242812	242844	b	b	-
+chr2	242812	242844	b	b	-
+chr2	242813	242845	b	b	-
+chr2	242847	242879	a	a	+
+chr2	242847	242879	a	a	+
+chr2	242847	242879	a	a	+
+chr2	242849	242881	a	a	+
+chr2	242851	242883	a	a	+
+chr2	242820	242852	b	b	-
+chr2	242820	242852	b	b	-
+chr2	242820	242852	b	b	-
+chr2	242857	242889	a	a	+
+chr2	242862	242894	a	a	+
+chr2	242973	243005	a	a	+
+chr2	242942	242974	b	b	-
+chr2	242944	242976	b	b	-
+chr2	242944	242976	b	b	-
+chr2	242990	243022	a	a	+
+chr2	242970	243002	b	b	-
+chr2	242971	243003	b	b	-
+chr2	242987	243019	b	b	-
+chr2	242988	243020	b	b	-
+chr2	243027	243059	a	a	+
+chr2	243027	243059	a	a	+
+chr2	243080	243112	b	b	-
+chr2	243127	243159	b	b	-
+chr2	243169	243201	a	a	+
+chr2	243154	243186	b	b	-
+chr2	243345	243377	b	b	-
+chr2	243487	243519	a	a	+
+chr2	243496	243528	a	a	+
+chr2	243471	243503	b	b	-
+chr2	243531	243563	a	a	+
+chr2	243558	243590	a	a	+
+chr2	243628	243660	b	b	-
+chr2	243678	243710	a	a	+
+chr2	243687	243719	a	a	+
+chr2	243687	243719	a	a	+
+chr2	243687	243719	a	a	+
+chr2	243911	243943	b	b	-
+chr2	244373	244405	b	b	-
+chr2	244373	244405	b	b	-
+chr2	244464	244496	b	b	-
+chr2	244549	244581	b	b	-
+chr2	244731	244763	a	a	+
+chr2	244988	245020	b	b	-
+chr2	244988	245020	b	b	-
+chr2	245454	245486	a	a	+
+chr2	245559	245591	b	b	-
+chr2	245598	245630	a	a	+
+chr2	245604	245636	a	a	+
+chr2	245609	245641	a	a	+
+chr2	245611	245643	a	a	+
+chr2	245611	245643	a	a	+
+chr2	245619	245651	a	a	+
+chr2	245620	245652	a	a	+
+chr2	245623	245655	a	a	+
+chr2	245596	245628	b	b	-
+chr2	245630	245662	a	a	+
+chr2	245630	245662	a	a	+
+chr2	245631	245663	a	a	+
+chr2	245599	245631	b	b	-
+chr2	245599	245631	b	b	-
+chr2	245606	245638	b	b	-
+chr2	245639	245671	a	a	+
+chr2	245608	245640	b	b	-
+chr2	245608	245640	b	b	-
+chr2	245642	245674	a	a	+
+chr2	245642	245674	a	a	+
+chr2	245642	245674	a	a	+
+chr2	245646	245678	a	a	+
+chr2	245628	245660	b	b	-
+chr2	245886	245918	a	a	+
+chr2	245886	245918	a	a	+
+chr2	245886	245918	a	a	+
+chr2	245887	245919	a	a	+
+chr2	245887	245919	a	a	+
+chr2	245887	245919	a	a	+
+chr2	245887	245919	a	a	+
+chr2	245887	245919	a	a	+
+chr2	245887	245919	a	a	+
+chr2	245887	245919	a	a	+
+chr2	245887	245919	a	a	+
+chr2	245887	245919	a	a	+
+chr2	245856	245888	b	b	-
+chr2	245856	245888	b	b	-
+chr2	245856	245888	b	b	-
+chr2	245856	245888	b	b	-
+chr2	245856	245888	b	b	-
+chr2	245893	245925	a	a	+
+chr2	245893	245925	a	a	+
+chr2	245893	245925	a	a	+
+chr2	245899	245931	a	a	+
+chr2	245867	245899	b	b	-
+chr2	245867	245899	b	b	-
+chr2	245868	245900	b	b	-
+chr2	245873	245905	b	b	-
+chr2	245913	245945	a	a	+
+chr2	245947	245979	a	a	+
+chr2	245947	245979	a	a	+
+chr2	245945	245977	b	b	-
+chr2	246047	246079	a	a	+
+chr2	246022	246054	b	b	-
+chr2	246069	246101	a	a	+
+chr2	246069	246101	a	a	+
+chr2	246203	246235	a	a	+
+chr2	246203	246235	a	a	+
+chr2	246203	246235	a	a	+
+chr2	246205	246237	a	a	+
+chr2	246188	246220	b	b	-
+chr2	246436	246468	a	a	+
+chr2	246443	246475	a	a	+
+chr2	246443	246475	a	a	+
+chr2	246443	246475	a	a	+
+chr2	246487	246519	a	a	+
+chr2	246470	246502	b	b	-
+chr2	246487	246519	b	b	-
+chr2	246533	246565	a	a	+
+chr2	246502	246534	b	b	-
+chr2	246601	246633	b	b	-
+chr2	246607	246639	b	b	-
+chr2	246870	246902	b	b	-
+chr2	246905	246937	a	a	+
+chr2	246910	246942	a	a	+
+chr2	246910	246942	a	a	+
+chr2	246910	246942	a	a	+
+chr2	246910	246942	a	a	+
+chr2	246910	246942	a	a	+
+chr2	246882	246914	b	b	-
+chr2	246882	246914	b	b	-
+chr2	246883	246915	b	b	-
+chr2	246891	246923	b	b	-
+chr2	246924	246956	a	a	+
+chr2	246895	246927	b	b	-
+chr2	246898	246930	b	b	-
+chr2	247038	247070	b	b	-
+chr2	247088	247120	a	a	+
+chr2	247088	247120	a	a	+
+chr2	247088	247120	a	a	+
+chr2	247102	247134	a	a	+
+chr2	247089	247121	b	b	-
+chr2	247135	247167	a	a	+
+chr2	247222	247254	a	a	+
+chr2	247270	247302	a	a	+
+chr2	247242	247274	b	b	-
+chr2	247339	247371	b	b	-
+chr2	247353	247385	b	b	-
+chr2	247353	247385	b	b	-
+chr2	247367	247399	b	b	-
+chr2	247403	247435	a	a	+
+chr2	247453	247485	a	a	+
+chr2	247453	247485	a	a	+
+chr2	247437	247469	b	b	-
+chr2	247487	247519	b	b	-
+chr2	247616	247648	a	a	+
+chr2	247623	247655	a	a	+
+chr2	247623	247655	a	a	+
+chr2	247633	247665	a	a	+
+chr2	247612	247644	b	b	-
+chr2	247613	247645	b	b	-
+chr2	247649	247681	b	b	-
+chr2	247651	247683	b	b	-
+chr2	247804	247836	a	a	+
+chr2	247774	247806	b	b	-
+chr2	247813	247845	a	a	+
+chr2	247822	247854	a	a	+
+chr2	247794	247826	b	b	-
+chr2	247832	247864	a	a	+
+chr2	247833	247865	a	a	+
+chr2	247833	247865	a	a	+
+chr2	247810	247842	b	b	-
+chr2	247810	247842	b	b	-
+chr2	247810	247842	b	b	-
+chr2	247810	247842	b	b	-
+chr2	247831	247863	b	b	-
+chr2	247927	247959	b	b	-
+chr2	248017	248049	a	a	+
+chr2	248013	248045	b	b	-
+chr2	248062	248094	a	a	+
+chr2	248099	248131	a	a	+
+chr2	248068	248100	b	b	-
+chr2	248108	248140	a	a	+
+chr2	248076	248108	b	b	-
+chr2	248106	248138	b	b	-
+chr2	248133	248165	b	b	-
+chr2	248175	248207	a	a	+
+chr2	248260	248292	a	a	+
+chr2	248316	248348	a	a	+
+chr2	248350	248382	a	a	+
+chr2	248373	248405	b	b	-
+chr2	248373	248405	b	b	-
+chr2	248373	248405	b	b	-
+chr2	248459	248491	b	b	-
+chr2	248488	248520	b	b	-
+chr2	248521	248553	a	a	+
+chr2	248898	248930	b	b	-
+chr2	249061	249093	a	a	+
+chr2	249074	249106	b	b	-
+chr2	249105	249137	b	b	-
+chr2	249144	249176	a	a	+
+chr2	249271	249303	b	b	-
+chr2	250033	250065	b	b	-
+chr2	250552	250584	a	a	+
+chr2	250581	250613	a	a	+
+chr2	250595	250627	a	a	+
+chr2	250733	250765	b	b	-
+chr2	250887	250919	a	a	+
+chr2	250897	250929	a	a	+
+chr2	250871	250903	b	b	-
+chr2	250871	250903	b	b	-
+chr2	250871	250903	b	b	-
+chr2	250873	250905	b	b	-
+chr2	250915	250947	a	a	+
+chr2	250888	250920	b	b	-
+chr2	250893	250925	b	b	-
+chr2	250926	250958	a	a	+
+chr2	250894	250926	b	b	-
+chr2	250895	250927	b	b	-
+chr2	250902	250934	b	b	-
+chr2	250940	250972	a	a	+
+chr2	250940	250972	a	a	+
+chr2	250908	250940	b	b	-
+chr2	250908	250940	b	b	-
+chr2	251097	251129	a	a	+
+chr2	251192	251224	a	a	+
+chr2	251163	251195	b	b	-
+chr2	251199	251231	a	a	+
+chr2	251194	251226	b	b	-
+chr2	251576	251608	a	a	+
+chr2	251579	251611	a	a	+
+chr2	251557	251589	b	b	-
+chr2	251558	251590	b	b	-
+chr2	251558	251590	b	b	-
+chr2	251592	251624	a	a	+
+chr2	251560	251592	b	b	-
+chr2	251593	251625	a	a	+
+chr2	251586	251618	b	b	-
+chr2	251629	251661	a	a	+
+chr2	251639	251671	a	a	+
+chr2	251699	251731	b	b	-
+chr2	251743	251775	a	a	+
+chr2	251770	251802	a	a	+
+chr2	251742	251774	b	b	-
+chr2	251781	251813	a	a	+
+chr2	251804	251836	a	a	+
+chr2	251779	251811	b	b	-
+chr2	251781	251813	b	b	-
+chr2	251795	251827	b	b	-
+chr2	251847	251879	a	a	+
+chr2	251830	251862	b	b	-
+chr2	251830	251862	b	b	-
+chr2	251959	251991	b	b	-
+chr2	251959	251991	b	b	-
+chr2	251993	252025	a	a	+
+chr2	251993	252025	a	a	+
+chr2	252031	252063	a	a	+
+chr2	252015	252047	b	b	-
+chr2	252125	252157	a	a	+
+chr2	252167	252199	a	a	+
+chr2	252312	252344	a	a	+
+chr2	252435	252467	b	b	-
+chr2	252618	252650	a	a	+
+chr2	252618	252650	a	a	+
+chr2	252636	252668	a	a	+
+chr2	252844	252876	b	b	-
+chr2	252929	252961	a	a	+
+chr2	252946	252978	a	a	+
+chr2	252934	252966	b	b	-
+chr2	252987	253019	a	a	+
+chr2	253597	253629	a	a	+
+chr2	253570	253602	b	b	-
+chr2	253871	253903	a	a	+
+chr2	253871	253903	a	a	+
+chr2	253938	253970	a	a	+
+chr2	254022	254054	b	b	-
+chr2	254063	254095	a	a	+
+chr2	254211	254243	a	a	+
+chr2	254234	254266	a	a	+
+chr2	254281	254313	b	b	-
+chr2	254297	254329	b	b	-
+chr2	254303	254335	b	b	-
+chr2	254349	254381	a	a	+
+chr2	254317	254349	b	b	-
+chr2	254326	254358	b	b	-
+chr2	254329	254361	b	b	-
+chr2	254338	254370	b	b	-
+chr2	254338	254370	b	b	-
+chr2	254339	254371	b	b	-
+chr2	254339	254371	b	b	-
+chr2	254373	254405	a	a	+
+chr2	254375	254407	a	a	+
+chr2	254344	254376	b	b	-
+chr2	254348	254380	b	b	-
+chr2	254348	254380	b	b	-
+chr2	254388	254420	a	a	+
+chr2	254388	254420	a	a	+
+chr2	254389	254421	a	a	+
+chr2	254389	254421	a	a	+
+chr2	254389	254421	a	a	+
+chr2	254484	254516	b	b	-
+chr2	254658	254690	a	a	+
+chr2	254651	254683	b	b	-
+chr2	254669	254701	b	b	-
+chr2	254734	254766	a	a	+
+chr2	254725	254757	b	b	-
+chr2	254785	254817	b	b	-
+chr2	254814	254846	b	b	-
+chr2	254814	254846	b	b	-
+chr2	254848	254880	a	a	+
+chr2	254822	254854	b	b	-
+chr2	254836	254868	b	b	-
+chr2	254876	254908	a	a	+
+chr2	254846	254878	b	b	-
+chr2	254880	254912	a	a	+
+chr2	254881	254913	a	a	+
+chr2	255417	255449	b	b	-
+chr2	255436	255468	b	b	-
+chr2	255477	255509	a	a	+
+chr2	255578	255610	a	a	+
+chr2	255580	255612	a	a	+
+chr2	255561	255593	b	b	-
+chr2	255605	255637	a	a	+
+chr2	255606	255638	a	a	+
+chr2	255609	255641	a	a	+
+chr2	255577	255609	b	b	-
+chr2	255645	255677	a	a	+
+chr2	255849	255881	a	a	+
+chr2	256185	256217	a	a	+
+chr2	256299	256331	a	a	+
+chr2	256299	256331	a	a	+
+chr2	256331	256363	b	b	-
+chr2	256361	256393	b	b	-
+chr2	256402	256434	a	a	+
+chr2	256378	256410	b	b	-
+chr2	256380	256412	b	b	-
+chr2	256386	256418	b	b	-
+chr2	256390	256422	b	b	-
+chr2	256429	256461	b	b	-
+chr2	256723	256755	a	a	+
+chr2	257069	257101	a	a	+
+chr2	257040	257072	b	b	-
+chr2	257040	257072	b	b	-
+chr2	257189	257221	a	a	+
+chr2	257273	257305	b	b	-
+chr2	257298	257330	b	b	-
+chr2	257502	257534	a	a	+
+chr2	257482	257514	b	b	-
+chr2	257627	257659	a	a	+
+chr2	257627	257659	a	a	+
+chr2	257627	257659	a	a	+
+chr2	257700	257732	a	a	+
+chr2	257800	257832	a	a	+
+chr2	257812	257844	a	a	+
+chr2	257812	257844	a	a	+
+chr2	257812	257844	a	a	+
+chr2	257933	257965	b	b	-
+chr2	257933	257965	b	b	-
+chr2	257936	257968	b	b	-
+chr2	257936	257968	b	b	-
+chr2	257944	257976	b	b	-
+chr2	257985	258017	a	a	+
+chr2	257958	257990	b	b	-
+chr2	257964	257996	b	b	-
+chr2	257998	258030	a	a	+
+chr2	257998	258030	b	b	-
+chr2	258240	258272	a	a	+
+chr2	258212	258244	b	b	-
+chr2	258247	258279	a	a	+
+chr2	258216	258248	b	b	-
+chr2	258219	258251	b	b	-
+chr2	258219	258251	b	b	-
+chr2	258220	258252	b	b	-
+chr2	258255	258287	a	a	+
+chr2	258261	258293	a	a	+
+chr2	258261	258293	a	a	+
+chr2	258268	258300	a	a	+
+chr2	258239	258271	b	b	-
+chr2	258239	258271	b	b	-
+chr2	258273	258305	a	a	+
+chr2	258243	258275	b	b	-
+chr2	258243	258275	b	b	-
+chr2	258243	258275	b	b	-
+chr2	258243	258275	b	b	-
+chr2	258243	258275	b	b	-
+chr2	258243	258275	b	b	-
+chr2	258243	258275	b	b	-
+chr2	258276	258308	a	a	+
+chr2	258276	258308	a	a	+
+chr2	258277	258309	a	a	+
+chr2	258277	258309	a	a	+
+chr2	258277	258309	a	a	+
+chr2	258246	258278	b	b	-
+chr2	258246	258278	b	b	-
+chr2	258247	258279	b	b	-
+chr2	258280	258312	a	a	+
+chr2	258280	258312	a	a	+
+chr2	258283	258315	a	a	+
+chr2	258283	258315	a	a	+
+chr2	258283	258315	a	a	+
+chr2	258285	258317	a	a	+
+chr2	258285	258317	a	a	+
+chr2	258286	258318	a	a	+
+chr2	258290	258322	a	a	+
+chr2	258290	258322	a	a	+
+chr2	258292	258324	a	a	+
+chr2	258292	258324	a	a	+
+chr2	258260	258292	b	b	-
+chr2	258260	258292	b	b	-
+chr2	258262	258294	b	b	-
+chr2	258262	258294	b	b	-
+chr2	258303	258335	a	a	+
+chr2	258303	258335	a	a	+
+chr2	258303	258335	a	a	+
+chr2	258303	258335	a	a	+
+chr2	258275	258307	b	b	-
+chr2	258275	258307	b	b	-
+chr2	258278	258310	b	b	-
+chr2	258321	258353	a	a	+
+chr2	258290	258322	b	b	-
+chr2	258327	258359	a	a	+
+chr2	258345	258377	a	a	+
+chr2	258392	258424	b	b	-
+chr2	258436	258468	a	a	+
+chr2	258436	258468	a	a	+
+chr2	258443	258475	a	a	+
+chr2	258443	258475	a	a	+
+chr2	258443	258475	a	a	+
+chr2	258443	258475	a	a	+
+chr2	258446	258478	a	a	+
+chr2	258446	258478	a	a	+
+chr2	258427	258459	b	b	-
+chr2	258478	258510	a	a	+
+chr2	258476	258508	b	b	-
+chr2	258533	258565	b	b	-
+chr2	258582	258614	b	b	-
+chr2	258616	258648	a	a	+
+chr2	258585	258617	b	b	-
+chr2	258593	258625	b	b	-
+chr2	258645	258677	a	a	+
+chr2	258665	258697	b	b	-
+chr2	258675	258707	b	b	-
+chr2	258675	258707	b	b	-
+chr2	258675	258707	b	b	-
+chr2	258675	258707	b	b	-
+chr2	258675	258707	b	b	-
+chr2	258675	258707	b	b	-
+chr2	258675	258707	b	b	-
+chr2	258675	258707	b	b	-
+chr2	258675	258707	b	b	-
+chr2	258675	258707	b	b	-
+chr2	258675	258707	b	b	-
+chr2	258675	258707	b	b	-
+chr2	258677	258709	b	b	-
+chr2	258682	258714	b	b	-
+chr2	258682	258714	b	b	-
+chr2	258682	258714	b	b	-
+chr2	258682	258714	b	b	-
+chr2	258686	258718	b	b	-
+chr2	258696	258728	b	b	-
+chr2	258696	258728	b	b	-
+chr2	258758	258790	a	a	+
+chr2	258761	258793	a	a	+
+chr2	258922	258954	a	a	+
+chr2	258925	258957	a	a	+
+chr2	259150	259182	a	a	+
+chr2	259182	259214	a	a	+
+chr2	259186	259218	a	a	+
+chr2	259165	259197	b	b	-
+chr2	259360	259392	a	a	+
+chr2	259570	259602	b	b	-
+chr2	259578	259610	b	b	-
+chr2	259581	259613	b	b	-
+chr2	259582	259614	b	b	-
+chr2	259583	259615	b	b	-
+chr2	259592	259624	b	b	-
+chr2	259592	259624	b	b	-
+chr2	259594	259626	b	b	-
+chr2	259594	259626	b	b	-
+chr2	259594	259626	b	b	-
+chr2	259597	259629	b	b	-
+chr2	259605	259637	b	b	-
+chr2	259605	259637	b	b	-
+chr2	259606	259638	b	b	-
+chr2	259609	259641	b	b	-
+chr2	259609	259641	b	b	-
+chr2	259609	259641	b	b	-
+chr2	259609	259641	b	b	-
+chr2	259610	259642	b	b	-
+chr2	259610	259642	b	b	-
+chr2	259610	259642	b	b	-
+chr2	259610	259642	b	b	-
+chr2	259644	259676	a	a	+
+chr2	259644	259676	a	a	+
+chr2	259615	259647	b	b	-
+chr2	259648	259680	a	a	+
+chr2	259648	259680	a	a	+
+chr2	259649	259681	a	a	+
+chr2	259649	259681	a	a	+
+chr2	259649	259681	a	a	+
+chr2	259649	259681	a	a	+
+chr2	259649	259681	a	a	+
+chr2	259618	259650	b	b	-
+chr2	259652	259684	a	a	+
+chr2	259620	259652	b	b	-
+chr2	259621	259653	b	b	-
+chr2	259621	259653	b	b	-
+chr2	259622	259654	b	b	-
+chr2	259623	259655	b	b	-
+chr2	259660	259692	a	a	+
+chr2	259660	259692	a	a	+
+chr2	259629	259661	b	b	-
+chr2	259663	259695	a	a	+
+chr2	259631	259663	b	b	-
+chr2	259631	259663	b	b	-
+chr2	259666	259698	a	a	+
+chr2	259666	259698	a	a	+
+chr2	259670	259702	a	a	+
+chr2	259639	259671	b	b	-
+chr2	259642	259674	b	b	-
+chr2	259642	259674	b	b	-
+chr2	259643	259675	b	b	-
+chr2	259649	259681	b	b	-
+chr2	259649	259681	b	b	-
+chr2	259652	259684	b	b	-
+chr2	259656	259688	b	b	-
+chr2	259656	259688	b	b	-
+chr2	259695	259727	a	a	+
+chr2	259666	259698	b	b	-
+chr2	259666	259698	b	b	-
+chr2	259667	259699	b	b	-
+chr2	259700	259732	a	a	+
+chr2	259703	259735	a	a	+
+chr2	259705	259737	a	a	+
+chr2	259705	259737	a	a	+
+chr2	259674	259706	b	b	-
+chr2	259674	259706	b	b	-
+chr2	259710	259742	a	a	+
+chr2	259711	259743	a	a	+
+chr2	259712	259744	a	a	+
+chr2	259713	259745	a	a	+
+chr2	259714	259746	a	a	+
+chr2	259689	259721	b	b	-
+chr2	259722	259754	a	a	+
+chr2	259695	259727	b	b	-
+chr2	259695	259727	b	b	-
+chr2	259728	259760	a	a	+
+chr2	259728	259760	a	a	+
+chr2	259696	259728	b	b	-
+chr2	259696	259728	b	b	-
+chr2	259699	259731	b	b	-
+chr2	259700	259732	b	b	-
+chr2	259700	259732	b	b	-
+chr2	259701	259733	b	b	-
+chr2	259702	259734	b	b	-
+chr2	259702	259734	b	b	-
+chr2	259738	259770	a	a	+
+chr2	259740	259772	a	a	+
+chr2	259740	259772	a	a	+
+chr2	259718	259750	b	b	-
+chr2	259722	259754	b	b	-
+chr2	259722	259754	b	b	-
+chr2	259722	259754	b	b	-
+chr2	259724	259756	b	b	-
+chr2	259724	259756	b	b	-
+chr2	259725	259757	b	b	-
+chr2	259725	259757	b	b	-
+chr2	259725	259757	b	b	-
+chr2	259725	259757	b	b	-
+chr2	259725	259757	b	b	-
+chr2	259733	259765	b	b	-
+chr2	259734	259766	b	b	-
+chr2	259735	259767	b	b	-
+chr2	259772	259804	a	a	+
+chr2	259746	259778	b	b	-
+chr2	259752	259784	b	b	-
+chr2	259788	259820	a	a	+
+chr2	259795	259827	a	a	+
+chr2	259795	259827	a	a	+
+chr2	259796	259828	a	a	+
+chr2	259803	259835	a	a	+
+chr2	259779	259811	b	b	-
+chr2	259814	259846	a	a	+
+chr2	259782	259814	b	b	-
+chr2	259815	259847	a	a	+
+chr2	259816	259848	a	a	+
+chr2	259816	259848	a	a	+
+chr2	259816	259848	a	a	+
+chr2	259824	259856	a	a	+
+chr2	259824	259856	a	a	+
+chr2	259793	259825	b	b	-
+chr2	259793	259825	b	b	-
+chr2	259830	259862	a	a	+
+chr2	259836	259868	a	a	+
+chr2	259836	259868	a	a	+
+chr2	259840	259872	a	a	+
+chr2	259842	259874	a	a	+
+chr2	259844	259876	a	a	+
+chr2	259845	259877	a	a	+
+chr2	259813	259845	b	b	-
+chr2	259846	259878	a	a	+
+chr2	259848	259880	a	a	+
+chr2	259849	259881	a	a	+
+chr2	259853	259885	a	a	+
+chr2	259823	259855	b	b	-
+chr2	259856	259888	a	a	+
+chr2	259857	259889	a	a	+
+chr2	259857	259889	a	a	+
+chr2	259857	259889	a	a	+
+chr2	259857	259889	a	a	+
+chr2	259857	259889	a	a	+
+chr2	259857	259889	a	a	+
+chr2	259857	259889	a	a	+
+chr2	259857	259889	a	a	+
+chr2	259857	259889	a	a	+
+chr2	259857	259889	a	a	+
+chr2	259857	259889	a	a	+
+chr2	259857	259889	a	a	+
+chr2	259857	259889	a	a	+
+chr2	259857	259889	a	a	+
+chr2	259857	259889	a	a	+
+chr2	259857	259889	a	a	+
+chr2	259857	259889	a	a	+
+chr2	259858	259890	a	a	+
+chr2	259858	259890	a	a	+
+chr2	259858	259890	a	a	+
+chr2	259827	259859	b	b	-
+chr2	259827	259859	b	b	-
+chr2	259860	259892	a	a	+
+chr2	259861	259893	a	a	+
+chr2	259861	259893	a	a	+
+chr2	259861	259893	a	a	+
+chr2	259830	259862	b	b	-
+chr2	259830	259862	b	b	-
+chr2	259831	259863	b	b	-
+chr2	259865	259897	a	a	+
+chr2	259865	259897	a	a	+
+chr2	259834	259866	b	b	-
+chr2	259840	259872	b	b	-
+chr2	259840	259872	b	b	-
+chr2	259840	259872	b	b	-
+chr2	259840	259872	b	b	-
+chr2	259841	259873	b	b	-
+chr2	259841	259873	b	b	-
+chr2	259875	259907	a	a	+
+chr2	259875	259907	a	a	+
+chr2	259843	259875	b	b	-
+chr2	259881	259913	a	a	+
+chr2	259881	259913	a	a	+
+chr2	259881	259913	a	a	+
+chr2	259882	259914	a	a	+
+chr2	259882	259914	a	a	+
+chr2	259850	259882	b	b	-
+chr2	259850	259882	b	b	-
+chr2	259857	259889	b	b	-
+chr2	259858	259890	b	b	-
+chr2	259859	259891	b	b	-
+chr2	259859	259891	b	b	-
+chr2	259865	259897	b	b	-
+chr2	259900	259932	a	a	+
+chr2	259904	259936	a	a	+
+chr2	259909	259941	a	a	+
+chr2	259909	259941	a	a	+
+chr2	259879	259911	b	b	-
+chr2	259913	259945	a	a	+
+chr2	259892	259924	b	b	-
+chr2	259892	259924	b	b	-
+chr2	259926	259958	a	a	+
+chr2	259905	259937	b	b	-
+chr2	259938	259970	a	a	+
+chr2	259938	259970	a	a	+
+chr2	259906	259938	b	b	-
+chr2	259939	259971	a	a	+
+chr2	259912	259944	b	b	-
+chr2	259912	259944	b	b	-
+chr2	259912	259944	b	b	-
+chr2	259956	259988	a	a	+
+chr2	259926	259958	b	b	-
+chr2	259927	259959	b	b	-
+chr2	259929	259961	b	b	-
+chr2	259963	259995	a	a	+
+chr2	259931	259963	b	b	-
+chr2	259964	259996	a	a	+
+chr2	259935	259967	b	b	-
+chr2	259968	260000	a	a	+
+chr2	259938	259970	b	b	-
+chr2	259939	259971	b	b	-
+chr2	259974	260006	a	a	+
+chr2	259942	259974	b	b	-
+chr2	259975	260007	a	a	+
+chr2	259975	260007	a	a	+
+chr2	259976	260008	a	a	+
+chr2	259976	260008	a	a	+
+chr2	259976	260008	a	a	+
+chr2	259977	260009	a	a	+
+chr2	259978	260010	a	a	+
+chr2	259947	259979	b	b	-
+chr2	259980	260012	a	a	+
+chr2	259980	260012	a	a	+
+chr2	259980	260012	a	a	+
+chr2	259980	260012	a	a	+
+chr2	259980	260012	a	a	+
+chr2	259981	260013	a	a	+
+chr2	259985	260017	a	a	+
+chr2	259985	260017	a	a	+
+chr2	259953	259985	b	b	-
+chr2	259953	259985	b	b	-
+chr2	259953	259985	b	b	-
+chr2	259953	259985	b	b	-
+chr2	259953	259985	b	b	-
+chr2	259955	259987	b	b	-
+chr2	259960	259992	b	b	-
+chr2	259960	259992	b	b	-
+chr2	259960	259992	b	b	-
+chr2	259960	259992	b	b	-
+chr2	259960	259992	b	b	-
+chr2	259960	259992	b	b	-
+chr2	259960	259992	b	b	-
+chr2	259960	259992	b	b	-
+chr2	259960	259992	b	b	-
+chr2	259964	259996	b	b	-
+chr2	259964	259996	b	b	-
+chr2	259964	259996	b	b	-
+chr2	259964	259996	b	b	-
+chr2	259997	260029	a	a	+
+chr2	259965	259997	b	b	-
+chr2	259967	259999	b	b	-
+chr2	259967	259999	b	b	-
+chr2	259967	259999	b	b	-
+chr2	260003	260035	a	a	+
+chr2	260003	260035	a	a	+
+chr2	259971	260003	b	b	-
+chr2	260006	260038	a	a	+
+chr2	259974	260006	b	b	-
+chr2	259974	260006	b	b	-
+chr2	259974	260006	b	b	-
+chr2	260008	260040	a	a	+
+chr2	260009	260041	a	a	+
+chr2	259977	260009	b	b	-
+chr2	259977	260009	b	b	-
+chr2	260010	260042	a	a	+
+chr2	260010	260042	a	a	+
+chr2	260010	260042	a	a	+
+chr2	260010	260042	a	a	+
+chr2	260010	260042	a	a	+
+chr2	260012	260044	a	a	+
+chr2	260012	260044	a	a	+
+chr2	260012	260044	a	a	+
+chr2	259983	260015	b	b	-
+chr2	260016	260048	a	a	+
+chr2	259984	260016	b	b	-
+chr2	259984	260016	b	b	-
+chr2	259986	260018	b	b	-
+chr2	259986	260018	b	b	-
+chr2	259986	260018	b	b	-
+chr2	259986	260018	b	b	-
+chr2	259986	260018	b	b	-
+chr2	259986	260018	b	b	-
+chr2	259986	260018	b	b	-
+chr2	259986	260018	b	b	-
+chr2	259986	260018	b	b	-
+chr2	259986	260018	b	b	-
+chr2	259987	260019	b	b	-
+chr2	260021	260053	a	a	+
+chr2	259989	260021	b	b	-
+chr2	259989	260021	b	b	-
+chr2	259989	260021	b	b	-
+chr2	259989	260021	b	b	-
+chr2	259989	260021	b	b	-
+chr2	259989	260021	b	b	-
+chr2	259989	260021	b	b	-
+chr2	259991	260023	b	b	-
+chr2	260024	260056	a	a	+
+chr2	260024	260056	a	a	+
+chr2	260025	260057	a	a	+
+chr2	260025	260057	a	a	+
+chr2	260025	260057	a	a	+
+chr2	260026	260058	a	a	+
+chr2	260026	260058	a	a	+
+chr2	260029	260061	a	a	+
+chr2	260029	260061	a	a	+
+chr2	260029	260061	a	a	+
+chr2	259998	260030	b	b	-
+chr2	259998	260030	b	b	-
+chr2	260031	260063	a	a	+
+chr2	260031	260063	a	a	+
+chr2	260032	260064	a	a	+
+chr2	260001	260033	b	b	-
+chr2	260001	260033	b	b	-
+chr2	260001	260033	b	b	-
+chr2	260001	260033	b	b	-
+chr2	260001	260033	b	b	-
+chr2	260003	260035	b	b	-
+chr2	260003	260035	b	b	-
+chr2	260003	260035	b	b	-
+chr2	260003	260035	b	b	-
+chr2	260037	260069	a	a	+
+chr2	260005	260037	b	b	-
+chr2	260005	260037	b	b	-
+chr2	260005	260037	b	b	-
+chr2	260038	260070	a	a	+
+chr2	260038	260070	a	a	+
+chr2	260038	260070	a	a	+
+chr2	260038	260070	a	a	+
+chr2	260038	260070	a	a	+
+chr2	260038	260070	a	a	+
+chr2	260038	260070	a	a	+
+chr2	260038	260070	a	a	+
+chr2	260038	260070	a	a	+
+chr2	260006	260038	b	b	-
+chr2	260006	260038	b	b	-
+chr2	260006	260038	b	b	-
+chr2	260040	260072	a	a	+
+chr2	260041	260073	a	a	+
+chr2	260041	260073	a	a	+
+chr2	260041	260073	a	a	+
+chr2	260041	260073	a	a	+
+chr2	260009	260041	b	b	-
+chr2	260009	260041	b	b	-
+chr2	260009	260041	b	b	-
+chr2	260009	260041	b	b	-
+chr2	260009	260041	b	b	-
+chr2	260009	260041	b	b	-
+chr2	260044	260076	a	a	+
+chr2	260045	260077	a	a	+
+chr2	260045	260077	a	a	+
+chr2	260045	260077	a	a	+
+chr2	260045	260077	a	a	+
+chr2	260013	260045	b	b	-
+chr2	260014	260046	b	b	-
+chr2	260047	260079	a	a	+
+chr2	260015	260047	b	b	-
+chr2	260015	260047	b	b	-
+chr2	260015	260047	b	b	-
+chr2	260015	260047	b	b	-
+chr2	260019	260051	b	b	-
+chr2	260019	260051	b	b	-
+chr2	260019	260051	b	b	-
+chr2	260055	260087	a	a	+
+chr2	260024	260056	b	b	-
+chr2	260024	260056	b	b	-
+chr2	260024	260056	b	b	-
+chr2	260024	260056	b	b	-
+chr2	260024	260056	b	b	-
+chr2	260024	260056	b	b	-
+chr2	260024	260056	b	b	-
+chr2	260024	260056	b	b	-
+chr2	260024	260056	b	b	-
+chr2	260024	260056	b	b	-
+chr2	260024	260056	b	b	-
+chr2	260024	260056	b	b	-
+chr2	260059	260091	a	a	+
+chr2	260059	260091	a	a	+
+chr2	260061	260093	a	a	+
+chr2	260061	260093	a	a	+
+chr2	260061	260093	a	a	+
+chr2	260029	260061	b	b	-
+chr2	260029	260061	b	b	-
+chr2	260029	260061	b	b	-
+chr2	260029	260061	b	b	-
+chr2	260029	260061	b	b	-
+chr2	260029	260061	b	b	-
+chr2	260029	260061	b	b	-
+chr2	260029	260061	b	b	-
+chr2	260029	260061	b	b	-
+chr2	260029	260061	b	b	-
+chr2	260029	260061	b	b	-
+chr2	260029	260061	b	b	-
+chr2	260062	260094	a	a	+
+chr2	260030	260062	b	b	-
+chr2	260030	260062	b	b	-
+chr2	260030	260062	b	b	-
+chr2	260031	260063	b	b	-
+chr2	260031	260063	b	b	-
+chr2	260032	260064	b	b	-
+chr2	260033	260065	b	b	-
+chr2	260034	260066	b	b	-
+chr2	260067	260099	a	a	+
+chr2	260035	260067	b	b	-
+chr2	260038	260070	b	b	-
+chr2	260038	260070	b	b	-
+chr2	260038	260070	b	b	-
+chr2	260038	260070	b	b	-
+chr2	260038	260070	b	b	-
+chr2	260038	260070	b	b	-
+chr2	260038	260070	b	b	-
+chr2	260038	260070	b	b	-
+chr2	260038	260070	b	b	-
+chr2	260038	260070	b	b	-
+chr2	260039	260071	b	b	-
+chr2	260072	260104	a	a	+
+chr2	260072	260104	a	a	+
+chr2	260072	260104	a	a	+
+chr2	260072	260104	a	a	+
+chr2	260072	260104	a	a	+
+chr2	260072	260104	a	a	+
+chr2	260040	260072	b	b	-
+chr2	260040	260072	b	b	-
+chr2	260040	260072	b	b	-
+chr2	260040	260072	b	b	-
+chr2	260040	260072	b	b	-
+chr2	260073	260105	a	a	+
+chr2	260073	260105	a	a	+
+chr2	260073	260105	a	a	+
+chr2	260073	260105	a	a	+
+chr2	260073	260105	a	a	+
+chr2	260073	260105	a	a	+
+chr2	260073	260105	a	a	+
+chr2	260073	260105	a	a	+
+chr2	260043	260075	b	b	-
+chr2	260043	260075	b	b	-
+chr2	260043	260075	b	b	-
+chr2	260077	260109	a	a	+
+chr2	260077	260109	a	a	+
+chr2	260077	260109	a	a	+
+chr2	260077	260109	a	a	+
+chr2	260077	260109	a	a	+
+chr2	260077	260109	a	a	+
+chr2	260077	260109	a	a	+
+chr2	260045	260077	b	b	-
+chr2	260045	260077	b	b	-
+chr2	260078	260110	a	a	+
+chr2	260078	260110	a	a	+
+chr2	260048	260080	b	b	-
+chr2	260048	260080	b	b	-
+chr2	260048	260080	b	b	-
+chr2	260048	260080	b	b	-
+chr2	260050	260082	b	b	-
+chr2	260050	260082	b	b	-
+chr2	260050	260082	b	b	-
+chr2	260084	260116	a	a	+
+chr2	260085	260117	a	a	+
+chr2	260085	260117	a	a	+
+chr2	260055	260087	b	b	-
+chr2	260055	260087	b	b	-
+chr2	260090	260122	a	a	+
+chr2	260058	260090	b	b	-
+chr2	260092	260124	a	a	+
+chr2	260092	260124	a	a	+
+chr2	260092	260124	a	a	+
+chr2	260092	260124	a	a	+
+chr2	260093	260125	a	a	+
+chr2	260093	260125	a	a	+
+chr2	260095	260127	a	a	+
+chr2	260098	260130	a	a	+
+chr2	260098	260130	a	a	+
+chr2	260067	260099	b	b	-
+chr2	260067	260099	b	b	-
+chr2	260100	260132	a	a	+
+chr2	260100	260132	a	a	+
+chr2	260100	260132	a	a	+
+chr2	260068	260100	b	b	-
+chr2	260068	260100	b	b	-
+chr2	260105	260137	a	a	+
+chr2	260105	260137	a	a	+
+chr2	260105	260137	a	a	+
+chr2	260105	260137	a	a	+
+chr2	260105	260137	a	a	+
+chr2	260105	260137	a	a	+
+chr2	260107	260139	a	a	+
+chr2	260110	260142	a	a	+
+chr2	260110	260142	a	a	+
+chr2	260113	260145	a	a	+
+chr2	260113	260145	a	a	+
+chr2	260082	260114	b	b	-
+chr2	260082	260114	b	b	-
+chr2	260082	260114	b	b	-
+chr2	260085	260117	b	b	-
+chr2	260085	260117	b	b	-
+chr2	260085	260117	b	b	-
+chr2	260085	260117	b	b	-
+chr2	260085	260117	b	b	-
+chr2	260085	260117	b	b	-
+chr2	260085	260117	b	b	-
+chr2	260085	260117	b	b	-
+chr2	260086	260118	b	b	-
+chr2	260086	260118	b	b	-
+chr2	260086	260118	b	b	-
+chr2	260086	260118	b	b	-
+chr2	260120	260152	a	a	+
+chr2	260120	260152	a	a	+
+chr2	260120	260152	a	a	+
+chr2	260122	260154	a	a	+
+chr2	260122	260154	a	a	+
+chr2	260123	260155	a	a	+
+chr2	260093	260125	b	b	-
+chr2	260094	260126	b	b	-
+chr2	260094	260126	b	b	-
+chr2	260094	260126	b	b	-
+chr2	260094	260126	b	b	-
+chr2	260095	260127	b	b	-
+chr2	260095	260127	b	b	-
+chr2	260095	260127	b	b	-
+chr2	260095	260127	b	b	-
+chr2	260095	260127	b	b	-
+chr2	260095	260127	b	b	-
+chr2	260128	260160	a	a	+
+chr2	260128	260160	a	a	+
+chr2	260129	260161	a	a	+
+chr2	260097	260129	b	b	-
+chr2	260133	260165	a	a	+
+chr2	260133	260165	a	a	+
+chr2	260135	260167	a	a	+
+chr2	260135	260167	a	a	+
+chr2	260103	260135	b	b	-
+chr2	260103	260135	b	b	-
+chr2	260136	260168	a	a	+
+chr2	260136	260168	a	a	+
+chr2	260136	260168	a	a	+
+chr2	260104	260136	b	b	-
+chr2	260105	260137	b	b	-
+chr2	260108	260140	b	b	-
+chr2	260141	260173	a	a	+
+chr2	260141	260173	a	a	+
+chr2	260145	260177	a	a	+
+chr2	260146	260178	a	a	+
+chr2	260146	260178	a	a	+
+chr2	260118	260150	b	b	-
+chr2	260118	260150	b	b	-
+chr2	260118	260150	b	b	-
+chr2	260118	260150	b	b	-
+chr2	260119	260151	b	b	-
+chr2	260119	260151	b	b	-
+chr2	260119	260151	b	b	-
+chr2	260119	260151	b	b	-
+chr2	260119	260151	b	b	-
+chr2	260119	260151	b	b	-
+chr2	260152	260184	a	a	+
+chr2	260152	260184	a	a	+
+chr2	260122	260154	b	b	-
+chr2	260155	260187	a	a	+
+chr2	260157	260189	a	a	+
+chr2	260157	260189	a	a	+
+chr2	260125	260157	b	b	-
+chr2	260165	260197	a	a	+
+chr2	260133	260165	b	b	-
+chr2	260167	260199	a	a	+
+chr2	260167	260199	a	a	+
+chr2	260167	260199	a	a	+
+chr2	260167	260199	a	a	+
+chr2	260170	260202	a	a	+
+chr2	260170	260202	a	a	+
+chr2	260139	260171	b	b	-
+chr2	260141	260173	b	b	-
+chr2	260141	260173	b	b	-
+chr2	260141	260173	b	b	-
+chr2	260141	260173	b	b	-
+chr2	260141	260173	b	b	-
+chr2	260141	260173	b	b	-
+chr2	260141	260173	b	b	-
+chr2	260176	260208	a	a	+
+chr2	260177	260209	a	a	+
+chr2	260177	260209	a	a	+
+chr2	260177	260209	a	a	+
+chr2	260147	260179	b	b	-
+chr2	260147	260179	b	b	-
+chr2	260147	260179	b	b	-
+chr2	260147	260179	b	b	-
+chr2	260147	260179	b	b	-
+chr2	260181	260213	a	a	+
+chr2	260149	260181	b	b	-
+chr2	260149	260181	b	b	-
+chr2	260150	260182	b	b	-
+chr2	260185	260217	a	a	+
+chr2	260185	260217	a	a	+
+chr2	260185	260217	a	a	+
+chr2	260185	260217	a	a	+
+chr2	260185	260217	a	a	+
+chr2	260156	260188	b	b	-
+chr2	260156	260188	b	b	-
+chr2	260156	260188	b	b	-
+chr2	260156	260188	b	b	-
+chr2	260156	260188	b	b	-
+chr2	260156	260188	b	b	-
+chr2	260158	260190	b	b	-
+chr2	260158	260190	b	b	-
+chr2	260158	260190	b	b	-
+chr2	260159	260191	b	b	-
+chr2	260195	260227	a	a	+
+chr2	260163	260195	b	b	-
+chr2	260197	260229	a	a	+
+chr2	260166	260198	b	b	-
+chr2	260166	260198	b	b	-
+chr2	260199	260231	a	a	+
+chr2	260199	260231	a	a	+
+chr2	260169	260201	b	b	-
+chr2	260169	260201	b	b	-
+chr2	260169	260201	b	b	-
+chr2	260202	260234	a	a	+
+chr2	260171	260203	b	b	-
+chr2	260174	260206	b	b	-
+chr2	260175	260207	b	b	-
+chr2	260210	260242	a	a	+
+chr2	260211	260243	a	a	+
+chr2	260211	260243	a	a	+
+chr2	260211	260243	a	a	+
+chr2	260211	260243	a	a	+
+chr2	260211	260243	a	a	+
+chr2	260211	260243	a	a	+
+chr2	260211	260243	a	a	+
+chr2	260213	260245	a	a	+
+chr2	260181	260213	b	b	-
+chr2	260214	260246	a	a	+
+chr2	260183	260215	b	b	-
+chr2	260183	260215	b	b	-
+chr2	260218	260250	a	a	+
+chr2	260220	260252	a	a	+
+chr2	260220	260252	a	a	+
+chr2	260190	260222	b	b	-
+chr2	260190	260222	b	b	-
+chr2	260190	260222	b	b	-
+chr2	260224	260256	a	a	+
+chr2	260224	260256	a	a	+
+chr2	260224	260256	a	a	+
+chr2	260193	260225	b	b	-
+chr2	260196	260228	b	b	-
+chr2	260229	260261	a	a	+
+chr2	260229	260261	a	a	+
+chr2	260231	260263	a	a	+
+chr2	260231	260263	a	a	+
+chr2	260231	260263	a	a	+
+chr2	260231	260263	a	a	+
+chr2	260199	260231	b	b	-
+chr2	260201	260233	b	b	-
+chr2	260236	260268	a	a	+
+chr2	260236	260268	a	a	+
+chr2	260236	260268	a	a	+
+chr2	260236	260268	a	a	+
+chr2	260236	260268	a	a	+
+chr2	260205	260237	b	b	-
+chr2	260205	260237	b	b	-
+chr2	260207	260239	b	b	-
+chr2	260207	260239	b	b	-
+chr2	260240	260272	a	a	+
+chr2	260208	260240	b	b	-
+chr2	260208	260240	b	b	-
+chr2	260208	260240	b	b	-
+chr2	260208	260240	b	b	-
+chr2	260209	260241	b	b	-
+chr2	260209	260241	b	b	-
+chr2	260209	260241	b	b	-
+chr2	260209	260241	b	b	-
+chr2	260209	260241	b	b	-
+chr2	260209	260241	b	b	-
+chr2	260209	260241	b	b	-
+chr2	260214	260246	b	b	-
+chr2	260214	260246	b	b	-
+chr2	260214	260246	b	b	-
+chr2	260215	260247	b	b	-
+chr2	260249	260281	a	a	+
+chr2	260251	260283	a	a	+
+chr2	260222	260254	b	b	-
+chr2	260261	260293	a	a	+
+chr2	260230	260262	b	b	-
+chr2	260230	260262	b	b	-
+chr2	260264	260296	a	a	+
+chr2	260232	260264	b	b	-
+chr2	260232	260264	b	b	-
+chr2	260234	260266	b	b	-
+chr2	260269	260301	a	a	+
+chr2	260239	260271	b	b	-
+chr2	260241	260273	b	b	-
+chr2	260241	260273	b	b	-
+chr2	260241	260273	b	b	-
+chr2	260274	260306	a	a	+
+chr2	260242	260274	b	b	-
+chr2	260275	260307	a	a	+
+chr2	260275	260307	a	a	+
+chr2	260243	260275	b	b	-
+chr2	260243	260275	b	b	-
+chr2	260243	260275	b	b	-
+chr2	260243	260275	b	b	-
+chr2	260243	260275	b	b	-
+chr2	260276	260308	a	a	+
+chr2	260244	260276	b	b	-
+chr2	260282	260314	a	a	+
+chr2	260250	260282	b	b	-
+chr2	260250	260282	b	b	-
+chr2	260283	260315	a	a	+
+chr2	260283	260315	a	a	+
+chr2	260283	260315	a	a	+
+chr2	260284	260316	a	a	+
+chr2	260285	260317	a	a	+
+chr2	260287	260319	a	a	+
+chr2	260287	260319	a	a	+
+chr2	260256	260288	b	b	-
+chr2	260256	260288	b	b	-
+chr2	260256	260288	b	b	-
+chr2	260256	260288	b	b	-
+chr2	260256	260288	b	b	-
+chr2	260256	260288	b	b	-
+chr2	260256	260288	b	b	-
+chr2	260256	260288	b	b	-
+chr2	260256	260288	b	b	-
+chr2	260256	260288	b	b	-
+chr2	260256	260288	b	b	-
+chr2	260289	260321	a	a	+
+chr2	260289	260321	a	a	+
+chr2	260289	260321	a	a	+
+chr2	260289	260321	a	a	+
+chr2	260289	260321	a	a	+
+chr2	260289	260321	a	a	+
+chr2	260289	260321	a	a	+
+chr2	260289	260321	a	a	+
+chr2	260257	260289	b	b	-
+chr2	260257	260289	b	b	-
+chr2	260257	260289	b	b	-
+chr2	260292	260324	a	a	+
+chr2	260297	260329	a	a	+
+chr2	260297	260329	a	a	+
+chr2	260297	260329	a	a	+
+chr2	260298	260330	a	a	+
+chr2	260298	260330	a	a	+
+chr2	260298	260330	a	a	+
+chr2	260298	260330	a	a	+
+chr2	260300	260332	a	a	+
+chr2	260300	260332	a	a	+
+chr2	260301	260333	a	a	+
+chr2	260301	260333	a	a	+
+chr2	260301	260333	a	a	+
+chr2	260301	260333	a	a	+
+chr2	260301	260333	a	a	+
+chr2	260301	260333	a	a	+
+chr2	260301	260333	a	a	+
+chr2	260301	260333	a	a	+
+chr2	260301	260333	a	a	+
+chr2	260269	260301	b	b	-
+chr2	260269	260301	b	b	-
+chr2	260303	260335	a	a	+
+chr2	260303	260335	a	a	+
+chr2	260304	260336	a	a	+
+chr2	260304	260336	a	a	+
+chr2	260304	260336	a	a	+
+chr2	260305	260337	a	a	+
+chr2	260305	260337	a	a	+
+chr2	260305	260337	a	a	+
+chr2	260305	260337	a	a	+
+chr2	260305	260337	a	a	+
+chr2	260305	260337	a	a	+
+chr2	260305	260337	a	a	+
+chr2	260305	260337	a	a	+
+chr2	260305	260337	a	a	+
+chr2	260306	260338	a	a	+
+chr2	260306	260338	a	a	+
+chr2	260277	260309	b	b	-
+chr2	260311	260343	a	a	+
+chr2	260311	260343	a	a	+
+chr2	260279	260311	b	b	-
+chr2	260279	260311	b	b	-
+chr2	260280	260312	b	b	-
+chr2	260280	260312	b	b	-
+chr2	260280	260312	b	b	-
+chr2	260280	260312	b	b	-
+chr2	260280	260312	b	b	-
+chr2	260280	260312	b	b	-
+chr2	260280	260312	b	b	-
+chr2	260280	260312	b	b	-
+chr2	260280	260312	b	b	-
+chr2	260280	260312	b	b	-
+chr2	260280	260312	b	b	-
+chr2	260280	260312	b	b	-
+chr2	260280	260312	b	b	-
+chr2	260280	260312	b	b	-
+chr2	260280	260312	b	b	-
+chr2	260280	260312	b	b	-
+chr2	260280	260312	b	b	-
+chr2	260280	260312	b	b	-
+chr2	260280	260312	b	b	-
+chr2	260280	260312	b	b	-
+chr2	260280	260312	b	b	-
+chr2	260280	260312	b	b	-
+chr2	260280	260312	b	b	-
+chr2	260281	260313	b	b	-
+chr2	260281	260313	b	b	-
+chr2	260281	260313	b	b	-
+chr2	260281	260313	b	b	-
+chr2	260281	260313	b	b	-
+chr2	260282	260314	b	b	-
+chr2	260316	260348	a	a	+
+chr2	260284	260316	b	b	-
+chr2	260284	260316	b	b	-
+chr2	260285	260317	b	b	-
+chr2	260285	260317	b	b	-
+chr2	260286	260318	b	b	-
+chr2	260286	260318	b	b	-
+chr2	260319	260351	a	a	+
+chr2	260320	260352	a	a	+
+chr2	260320	260352	a	a	+
+chr2	260320	260352	a	a	+
+chr2	260320	260352	a	a	+
+chr2	260320	260352	a	a	+
+chr2	260320	260352	a	a	+
+chr2	260320	260352	a	a	+
+chr2	260320	260352	a	a	+
+chr2	260320	260352	a	a	+
+chr2	260321	260353	a	a	+
+chr2	260321	260353	a	a	+
+chr2	260321	260353	a	a	+
+chr2	260321	260353	a	a	+
+chr2	260321	260353	a	a	+
+chr2	260321	260353	a	a	+
+chr2	260321	260353	a	a	+
+chr2	260321	260353	a	a	+
+chr2	260321	260353	a	a	+
+chr2	260321	260353	a	a	+
+chr2	260321	260353	a	a	+
+chr2	260321	260353	a	a	+
+chr2	260321	260353	a	a	+
+chr2	260321	260353	a	a	+
+chr2	260321	260353	a	a	+
+chr2	260321	260353	a	a	+
+chr2	260321	260353	a	a	+
+chr2	260321	260353	a	a	+
+chr2	260290	260322	b	b	-
+chr2	260323	260355	a	a	+
+chr2	260323	260355	a	a	+
+chr2	260323	260355	a	a	+
+chr2	260324	260356	a	a	+
+chr2	260324	260356	a	a	+
+chr2	260292	260324	b	b	-
+chr2	260292	260324	b	b	-
+chr2	260292	260324	b	b	-
+chr2	260325	260357	a	a	+
+chr2	260325	260357	a	a	+
+chr2	260295	260327	b	b	-
+chr2	260295	260327	b	b	-
+chr2	260295	260327	b	b	-
+chr2	260295	260327	b	b	-
+chr2	260295	260327	b	b	-
+chr2	260295	260327	b	b	-
+chr2	260295	260327	b	b	-
+chr2	260295	260327	b	b	-
+chr2	260295	260327	b	b	-
+chr2	260295	260327	b	b	-
+chr2	260295	260327	b	b	-
+chr2	260295	260327	b	b	-
+chr2	260295	260327	b	b	-
+chr2	260295	260327	b	b	-
+chr2	260295	260327	b	b	-
+chr2	260295	260327	b	b	-
+chr2	260295	260327	b	b	-
+chr2	260295	260327	b	b	-
+chr2	260295	260327	b	b	-
+chr2	260328	260360	a	a	+
+chr2	260328	260360	a	a	+
+chr2	260328	260360	a	a	+
+chr2	260328	260360	a	a	+
+chr2	260328	260360	a	a	+
+chr2	260296	260328	b	b	-
+chr2	260296	260328	b	b	-
+chr2	260296	260328	b	b	-
+chr2	260296	260328	b	b	-
+chr2	260296	260328	b	b	-
+chr2	260296	260328	b	b	-
+chr2	260296	260328	b	b	-
+chr2	260296	260328	b	b	-
+chr2	260296	260328	b	b	-
+chr2	260296	260328	b	b	-
+chr2	260296	260328	b	b	-
+chr2	260296	260328	b	b	-
+chr2	260329	260361	a	a	+
+chr2	260329	260361	a	a	+
+chr2	260329	260361	a	a	+
+chr2	260329	260361	a	a	+
+chr2	260329	260361	a	a	+
+chr2	260329	260361	a	a	+
+chr2	260329	260361	a	a	+
+chr2	260329	260361	a	a	+
+chr2	260329	260361	a	a	+
+chr2	260329	260361	a	a	+
+chr2	260329	260361	a	a	+
+chr2	260329	260361	a	a	+
+chr2	260329	260361	a	a	+
+chr2	260329	260361	a	a	+
+chr2	260329	260361	a	a	+
+chr2	260329	260361	a	a	+
+chr2	260297	260329	b	b	-
+chr2	260330	260362	a	a	+
+chr2	260330	260362	a	a	+
+chr2	260330	260362	a	a	+
+chr2	260300	260332	b	b	-
+chr2	260300	260332	b	b	-
+chr2	260300	260332	b	b	-
+chr2	260300	260332	b	b	-
+chr2	260300	260332	b	b	-
+chr2	260300	260332	b	b	-
+chr2	260334	260366	a	a	+
+chr2	260302	260334	b	b	-
+chr2	260302	260334	b	b	-
+chr2	260302	260334	b	b	-
+chr2	260302	260334	b	b	-
+chr2	260302	260334	b	b	-
+chr2	260302	260334	b	b	-
+chr2	260302	260334	b	b	-
+chr2	260302	260334	b	b	-
+chr2	260302	260334	b	b	-
+chr2	260303	260335	b	b	-
+chr2	260303	260335	b	b	-
+chr2	260303	260335	b	b	-
+chr2	260303	260335	b	b	-
+chr2	260303	260335	b	b	-
+chr2	260303	260335	b	b	-
+chr2	260303	260335	b	b	-
+chr2	260336	260368	a	a	+
+chr2	260304	260336	b	b	-
+chr2	260337	260369	a	a	+
+chr2	260337	260369	a	a	+
+chr2	260337	260369	a	a	+
+chr2	260337	260369	a	a	+
+chr2	260337	260369	a	a	+
+chr2	260337	260369	a	a	+
+chr2	260337	260369	a	a	+
+chr2	260337	260369	a	a	+
+chr2	260337	260369	a	a	+
+chr2	260337	260369	a	a	+
+chr2	260337	260369	a	a	+
+chr2	260337	260369	a	a	+
+chr2	260305	260337	b	b	-
+chr2	260305	260337	b	b	-
+chr2	260305	260337	b	b	-
+chr2	260305	260337	b	b	-
+chr2	260305	260337	b	b	-
+chr2	260305	260337	b	b	-
+chr2	260305	260337	b	b	-
+chr2	260305	260337	b	b	-
+chr2	260305	260337	b	b	-
+chr2	260305	260337	b	b	-
+chr2	260305	260337	b	b	-
+chr2	260338	260370	a	a	+
+chr2	260338	260370	a	a	+
+chr2	260338	260370	a	a	+
+chr2	260338	260370	a	a	+
+chr2	260338	260370	a	a	+
+chr2	260338	260370	a	a	+
+chr2	260338	260370	a	a	+
+chr2	260338	260370	a	a	+
+chr2	260338	260370	a	a	+
+chr2	260338	260370	a	a	+
+chr2	260338	260370	a	a	+
+chr2	260338	260370	a	a	+
+chr2	260338	260370	a	a	+
+chr2	260338	260370	a	a	+
+chr2	260338	260370	a	a	+
+chr2	260338	260370	a	a	+
+chr2	260339	260371	a	a	+
+chr2	260339	260371	a	a	+
+chr2	260339	260371	a	a	+
+chr2	260339	260371	a	a	+
+chr2	260339	260371	a	a	+
+chr2	260307	260339	b	b	-
+chr2	260307	260339	b	b	-
+chr2	260307	260339	b	b	-
+chr2	260307	260339	b	b	-
+chr2	260307	260339	b	b	-
+chr2	260307	260339	b	b	-
+chr2	260307	260339	b	b	-
+chr2	260307	260339	b	b	-
+chr2	260307	260339	b	b	-
+chr2	260307	260339	b	b	-
+chr2	260307	260339	b	b	-
+chr2	260308	260340	b	b	-
+chr2	260308	260340	b	b	-
+chr2	260308	260340	b	b	-
+chr2	260308	260340	b	b	-
+chr2	260308	260340	b	b	-
+chr2	260308	260340	b	b	-
+chr2	260308	260340	b	b	-
+chr2	260308	260340	b	b	-
+chr2	260308	260340	b	b	-
+chr2	260308	260340	b	b	-
+chr2	260341	260373	a	a	+
+chr2	260341	260373	a	a	+
+chr2	260341	260373	a	a	+
+chr2	260342	260374	a	a	+
+chr2	260342	260374	a	a	+
+chr2	260342	260374	a	a	+
+chr2	260342	260374	a	a	+
+chr2	260342	260374	a	a	+
+chr2	260342	260374	a	a	+
+chr2	260342	260374	a	a	+
+chr2	260310	260342	b	b	-
+chr2	260343	260375	a	a	+
+chr2	260343	260375	a	a	+
+chr2	260311	260343	b	b	-
+chr2	260311	260343	b	b	-
+chr2	260344	260376	a	a	+
+chr2	260344	260376	a	a	+
+chr2	260344	260376	a	a	+
+chr2	260345	260377	a	a	+
+chr2	260314	260346	b	b	-
+chr2	260314	260346	b	b	-
+chr2	260314	260346	b	b	-
+chr2	260314	260346	b	b	-
+chr2	260347	260379	a	a	+
+chr2	260347	260379	a	a	+
+chr2	260347	260379	a	a	+
+chr2	260347	260379	a	a	+
+chr2	260347	260379	a	a	+
+chr2	260347	260379	a	a	+
+chr2	260347	260379	a	a	+
+chr2	260347	260379	a	a	+
+chr2	260347	260379	a	a	+
+chr2	260347	260379	a	a	+
+chr2	260347	260379	a	a	+
+chr2	260347	260379	a	a	+
+chr2	260347	260379	a	a	+
+chr2	260315	260347	b	b	-
+chr2	260315	260347	b	b	-
+chr2	260315	260347	b	b	-
+chr2	260315	260347	b	b	-
+chr2	260315	260347	b	b	-
+chr2	260315	260347	b	b	-
+chr2	260315	260347	b	b	-
+chr2	260315	260347	b	b	-
+chr2	260315	260347	b	b	-
+chr2	260315	260347	b	b	-
+chr2	260315	260347	b	b	-
+chr2	260315	260347	b	b	-
+chr2	260316	260348	b	b	-
+chr2	260316	260348	b	b	-
+chr2	260316	260348	b	b	-
+chr2	260316	260348	b	b	-
+chr2	260316	260348	b	b	-
+chr2	260316	260348	b	b	-
+chr2	260316	260348	b	b	-
+chr2	260316	260348	b	b	-
+chr2	260316	260348	b	b	-
+chr2	260316	260348	b	b	-
+chr2	260316	260348	b	b	-
+chr2	260316	260348	b	b	-
+chr2	260349	260381	a	a	+
+chr2	260349	260381	a	a	+
+chr2	260317	260349	b	b	-
+chr2	260317	260349	b	b	-
+chr2	260317	260349	b	b	-
+chr2	260317	260349	b	b	-
+chr2	260317	260349	b	b	-
+chr2	260317	260349	b	b	-
+chr2	260317	260349	b	b	-
+chr2	260317	260349	b	b	-
+chr2	260317	260349	b	b	-
+chr2	260317	260349	b	b	-
+chr2	260317	260349	b	b	-
+chr2	260317	260349	b	b	-
+chr2	260317	260349	b	b	-
+chr2	260317	260349	b	b	-
+chr2	260317	260349	b	b	-
+chr2	260317	260349	b	b	-
+chr2	260317	260349	b	b	-
+chr2	260317	260349	b	b	-
+chr2	260317	260349	b	b	-
+chr2	260350	260382	a	a	+
+chr2	260350	260382	a	a	+
+chr2	260350	260382	a	a	+
+chr2	260350	260382	a	a	+
+chr2	260350	260382	a	a	+
+chr2	260350	260382	a	a	+
+chr2	260350	260382	a	a	+
+chr2	260350	260382	a	a	+
+chr2	260350	260382	a	a	+
+chr2	260350	260382	a	a	+
+chr2	260350	260382	a	a	+
+chr2	260350	260382	a	a	+
+chr2	260350	260382	a	a	+
+chr2	260350	260382	a	a	+
+chr2	260319	260351	b	b	-
+chr2	260320	260352	b	b	-
+chr2	260320	260352	b	b	-
+chr2	260353	260385	a	a	+
+chr2	260354	260386	a	a	+
+chr2	260322	260354	b	b	-
+chr2	260322	260354	b	b	-
+chr2	260322	260354	b	b	-
+chr2	260322	260354	b	b	-
+chr2	260322	260354	b	b	-
+chr2	260322	260354	b	b	-
+chr2	260355	260387	a	a	+
+chr2	260323	260355	b	b	-
+chr2	260323	260355	b	b	-
+chr2	260323	260355	b	b	-
+chr2	260324	260356	b	b	-
+chr2	260326	260358	b	b	-
+chr2	260359	260391	a	a	+
+chr2	260361	260393	a	a	+
+chr2	260361	260393	a	a	+
+chr2	260361	260393	a	a	+
+chr2	260361	260393	a	a	+
+chr2	260361	260393	a	a	+
+chr2	260329	260361	b	b	-
+chr2	260329	260361	b	b	-
+chr2	260329	260361	b	b	-
+chr2	260329	260361	b	b	-
+chr2	260329	260361	b	b	-
+chr2	260329	260361	b	b	-
+chr2	260329	260361	b	b	-
+chr2	260329	260361	b	b	-
+chr2	260329	260361	b	b	-
+chr2	260329	260361	b	b	-
+chr2	260330	260362	b	b	-
+chr2	260330	260362	b	b	-
+chr2	260330	260362	b	b	-
+chr2	260330	260362	b	b	-
+chr2	260363	260395	a	a	+
+chr2	260363	260395	a	a	+
+chr2	260363	260395	a	a	+
+chr2	260332	260364	b	b	-
+chr2	260333	260365	b	b	-
+chr2	260366	260398	a	a	+
+chr2	260335	260367	b	b	-
+chr2	260368	260400	a	a	+
+chr2	260368	260400	a	a	+
+chr2	260368	260400	a	a	+
+chr2	260372	260404	a	a	+
+chr2	260341	260373	b	b	-
+chr2	260344	260376	b	b	-
+chr2	260346	260378	b	b	-
+chr2	260379	260411	a	a	+
+chr2	260379	260411	a	a	+
+chr2	260347	260379	b	b	-
+chr2	260381	260413	a	a	+
+chr2	260383	260415	a	a	+
+chr2	260388	260420	a	a	+
+chr2	260356	260388	b	b	-
+chr2	260389	260421	a	a	+
+chr2	260389	260421	a	a	+
+chr2	260389	260421	a	a	+
+chr2	260357	260389	b	b	-
+chr2	260357	260389	b	b	-
+chr2	260390	260422	a	a	+
+chr2	260390	260422	a	a	+
+chr2	260390	260422	a	a	+
+chr2	260358	260390	b	b	-
+chr2	260358	260390	b	b	-
+chr2	260358	260390	b	b	-
+chr2	260358	260390	b	b	-
+chr2	260358	260390	b	b	-
+chr2	260358	260390	b	b	-
+chr2	260358	260390	b	b	-
+chr2	260358	260390	b	b	-
+chr2	260358	260390	b	b	-
+chr2	260359	260391	b	b	-
+chr2	260359	260391	b	b	-
+chr2	260360	260392	b	b	-
+chr2	260395	260427	a	a	+
+chr2	260395	260427	a	a	+
+chr2	260396	260428	a	a	+
+chr2	260396	260428	a	a	+
+chr2	260398	260430	a	a	+
+chr2	260367	260399	b	b	-
+chr2	260401	260433	a	a	+
+chr2	260401	260433	a	a	+
+chr2	260401	260433	a	a	+
+chr2	260402	260434	a	a	+
+chr2	260402	260434	a	a	+
+chr2	260402	260434	a	a	+
+chr2	260402	260434	a	a	+
+chr2	260402	260434	a	a	+
+chr2	260408	260440	a	a	+
+chr2	260379	260411	b	b	-
+chr2	260379	260411	b	b	-
+chr2	260380	260412	b	b	-
+chr2	260386	260418	b	b	-
+chr2	260421	260453	a	a	+
+chr2	260392	260424	b	b	-
+chr2	260426	260458	a	a	+
+chr2	260426	260458	a	a	+
+chr2	260430	260462	a	a	+
+chr2	260398	260430	b	b	-
+chr2	260405	260437	b	b	-
+chr2	260405	260437	b	b	-
+chr2	260442	260474	a	a	+
+chr2	260442	260474	a	a	+
+chr2	260442	260474	a	a	+
+chr2	260442	260474	a	a	+
+chr2	260442	260474	a	a	+
+chr2	260442	260474	a	a	+
+chr2	260442	260474	a	a	+
+chr2	260443	260475	a	a	+
+chr2	260447	260479	a	a	+
+chr2	260419	260451	b	b	-
+chr2	260422	260454	b	b	-
+chr2	260459	260491	a	a	+
+chr2	260427	260459	b	b	-
+chr2	260427	260459	b	b	-
+chr2	260427	260459	b	b	-
+chr2	260432	260464	b	b	-
+chr2	260436	260468	b	b	-
+chr2	260470	260502	a	a	+
+chr2	260438	260470	b	b	-
+chr2	260438	260470	b	b	-
+chr2	260475	260507	a	a	+
+chr2	260475	260507	a	a	+
+chr2	260475	260507	a	a	+
+chr2	260476	260508	a	a	+
+chr2	260449	260481	b	b	-
+chr2	260449	260481	b	b	-
+chr2	260482	260514	a	a	+
+chr2	260451	260483	b	b	-
+chr2	260453	260485	b	b	-
+chr2	260488	260520	a	a	+
+chr2	260488	260520	a	a	+
+chr2	260489	260521	a	a	+
+chr2	260489	260521	a	a	+
+chr2	260489	260521	a	a	+
+chr2	260463	260495	b	b	-
+chr2	260498	260530	a	a	+
+chr2	260467	260499	b	b	-
+chr2	260467	260499	b	b	-
+chr2	260500	260532	a	a	+
+chr2	260501	260533	a	a	+
+chr2	260501	260533	a	a	+
+chr2	260501	260533	a	a	+
+chr2	260502	260534	a	a	+
+chr2	260502	260534	a	a	+
+chr2	260502	260534	a	a	+
+chr2	260502	260534	a	a	+
+chr2	260502	260534	a	a	+
+chr2	260502	260534	a	a	+
+chr2	260502	260534	a	a	+
+chr2	260502	260534	a	a	+
+chr2	260502	260534	a	a	+
+chr2	260502	260534	a	a	+
+chr2	260502	260534	a	a	+
+chr2	260502	260534	a	a	+
+chr2	260503	260535	a	a	+
+chr2	260505	260537	a	a	+
+chr2	260473	260505	b	b	-
+chr2	260508	260540	a	a	+
+chr2	260479	260511	b	b	-
+chr2	260479	260511	b	b	-
+chr2	260479	260511	b	b	-
+chr2	260480	260512	b	b	-
+chr2	260513	260545	a	a	+
+chr2	260513	260545	a	a	+
+chr2	260513	260545	a	a	+
+chr2	260513	260545	a	a	+
+chr2	260514	260546	a	a	+
+chr2	260514	260546	a	a	+
+chr2	260514	260546	a	a	+
+chr2	260514	260546	a	a	+
+chr2	260514	260546	a	a	+
+chr2	260514	260546	a	a	+
+chr2	260514	260546	a	a	+
+chr2	260514	260546	a	a	+
+chr2	260482	260514	b	b	-
+chr2	260515	260547	a	a	+
+chr2	260515	260547	a	a	+
+chr2	260515	260547	a	a	+
+chr2	260483	260515	b	b	-
+chr2	260483	260515	b	b	-
+chr2	260483	260515	b	b	-
+chr2	260483	260515	b	b	-
+chr2	260483	260515	b	b	-
+chr2	260483	260515	b	b	-
+chr2	260517	260549	a	a	+
+chr2	260485	260517	b	b	-
+chr2	260518	260550	a	a	+
+chr2	260518	260550	a	a	+
+chr2	260518	260550	a	a	+
+chr2	260518	260550	a	a	+
+chr2	260518	260550	a	a	+
+chr2	260518	260550	a	a	+
+chr2	260519	260551	a	a	+
+chr2	260519	260551	a	a	+
+chr2	260520	260552	a	a	+
+chr2	260520	260552	a	a	+
+chr2	260520	260552	a	a	+
+chr2	260520	260552	a	a	+
+chr2	260520	260552	a	a	+
+chr2	260520	260552	a	a	+
+chr2	260488	260520	b	b	-
+chr2	260489	260521	b	b	-
+chr2	260489	260521	b	b	-
+chr2	260489	260521	b	b	-
+chr2	260489	260521	b	b	-
+chr2	260522	260554	a	a	+
+chr2	260522	260554	a	a	+
+chr2	260522	260554	a	a	+
+chr2	260490	260522	b	b	-
+chr2	260492	260524	b	b	-
+chr2	260492	260524	b	b	-
+chr2	260492	260524	b	b	-
+chr2	260492	260524	b	b	-
+chr2	260492	260524	b	b	-
+chr2	260492	260524	b	b	-
+chr2	260492	260524	b	b	-
+chr2	260492	260524	b	b	-
+chr2	260492	260524	b	b	-
+chr2	260492	260524	b	b	-
+chr2	260492	260524	b	b	-
+chr2	260492	260524	b	b	-
+chr2	260492	260524	b	b	-
+chr2	260492	260524	b	b	-
+chr2	260492	260524	b	b	-
+chr2	260492	260524	b	b	-
+chr2	260492	260524	b	b	-
+chr2	260493	260525	b	b	-
+chr2	260493	260525	b	b	-
+chr2	260526	260558	a	a	+
+chr2	260494	260526	b	b	-
+chr2	260527	260559	a	a	+
+chr2	260527	260559	a	a	+
+chr2	260527	260559	a	a	+
+chr2	260530	260562	a	a	+
+chr2	260501	260533	b	b	-
+chr2	260501	260533	b	b	-
+chr2	260501	260533	b	b	-
+chr2	260501	260533	b	b	-
+chr2	260502	260534	b	b	-
+chr2	260502	260534	b	b	-
+chr2	260502	260534	b	b	-
+chr2	260502	260534	b	b	-
+chr2	260502	260534	b	b	-
+chr2	260502	260534	b	b	-
+chr2	260502	260534	b	b	-
+chr2	260503	260535	b	b	-
+chr2	260503	260535	b	b	-
+chr2	260503	260535	b	b	-
+chr2	260503	260535	b	b	-
+chr2	260503	260535	b	b	-
+chr2	260503	260535	b	b	-
+chr2	260506	260538	b	b	-
+chr2	260539	260571	a	a	+
+chr2	260540	260572	a	a	+
+chr2	260541	260573	a	a	+
+chr2	260509	260541	b	b	-
+chr2	260542	260574	a	a	+
+chr2	260542	260574	a	a	+
+chr2	260542	260574	a	a	+
+chr2	260542	260574	a	a	+
+chr2	260542	260574	a	a	+
+chr2	260542	260574	a	a	+
+chr2	260542	260574	a	a	+
+chr2	260542	260574	a	a	+
+chr2	260542	260574	a	a	+
+chr2	260510	260542	b	b	-
+chr2	260510	260542	b	b	-
+chr2	260511	260543	b	b	-
+chr2	260548	260580	a	a	+
+chr2	260548	260580	a	a	+
+chr2	260551	260583	a	a	+
+chr2	260552	260584	a	a	+
+chr2	260552	260584	a	a	+
+chr2	260552	260584	a	a	+
+chr2	260553	260585	a	a	+
+chr2	260553	260585	a	a	+
+chr2	260553	260585	a	a	+
+chr2	260553	260585	a	a	+
+chr2	260521	260553	b	b	-
+chr2	260521	260553	b	b	-
+chr2	260521	260553	b	b	-
+chr2	260554	260586	a	a	+
+chr2	260554	260586	a	a	+
+chr2	260522	260554	b	b	-
+chr2	260522	260554	b	b	-
+chr2	260522	260554	b	b	-
+chr2	260522	260554	b	b	-
+chr2	260522	260554	b	b	-
+chr2	260522	260554	b	b	-
+chr2	260556	260588	a	a	+
+chr2	260558	260590	a	a	+
+chr2	260558	260590	a	a	+
+chr2	260526	260558	b	b	-
+chr2	260528	260560	b	b	-
+chr2	260528	260560	b	b	-
+chr2	260528	260560	b	b	-
+chr2	260528	260560	b	b	-
+chr2	260562	260594	a	a	+
+chr2	260566	260598	a	a	+
+chr2	260540	260572	b	b	-
+chr2	260540	260572	b	b	-
+chr2	260540	260572	b	b	-
+chr2	260540	260572	b	b	-
+chr2	260540	260572	b	b	-
+chr2	260540	260572	b	b	-
+chr2	260576	260608	a	a	+
+chr2	260576	260608	a	a	+
+chr2	260576	260608	a	a	+
+chr2	260578	260610	a	a	+
+chr2	260578	260610	a	a	+
+chr2	260546	260578	b	b	-
+chr2	260546	260578	b	b	-
+chr2	260546	260578	b	b	-
+chr2	260546	260578	b	b	-
+chr2	260547	260579	b	b	-
+chr2	260580	260612	a	a	+
+chr2	260580	260612	a	a	+
+chr2	260581	260613	a	a	+
+chr2	260549	260581	b	b	-
+chr2	260549	260581	b	b	-
+chr2	260549	260581	b	b	-
+chr2	260584	260616	a	a	+
+chr2	260552	260584	b	b	-
+chr2	260552	260584	b	b	-
+chr2	260552	260584	b	b	-
+chr2	260552	260584	b	b	-
+chr2	260585	260617	a	a	+
+chr2	260585	260617	a	a	+
+chr2	260585	260617	a	a	+
+chr2	260553	260585	b	b	-
+chr2	260553	260585	b	b	-
+chr2	260587	260619	a	a	+
+chr2	260557	260589	b	b	-
+chr2	260557	260589	b	b	-
+chr2	260557	260589	b	b	-
+chr2	260557	260589	b	b	-
+chr2	260559	260591	b	b	-
+chr2	260559	260591	b	b	-
+chr2	260559	260591	b	b	-
+chr2	260559	260591	b	b	-
+chr2	260559	260591	b	b	-
+chr2	260559	260591	b	b	-
+chr2	260559	260591	b	b	-
+chr2	260564	260596	b	b	-
+chr2	260566	260598	b	b	-
+chr2	260566	260598	b	b	-
+chr2	260566	260598	b	b	-
+chr2	260566	260598	b	b	-
+chr2	260567	260599	b	b	-
+chr2	260567	260599	b	b	-
+chr2	260567	260599	b	b	-
+chr2	260601	260633	a	a	+
+chr2	260602	260634	a	a	+
+chr2	260602	260634	a	a	+
+chr2	260607	260639	a	a	+
+chr2	260607	260639	a	a	+
+chr2	260607	260639	a	a	+
+chr2	260607	260639	a	a	+
+chr2	260607	260639	a	a	+
+chr2	260607	260639	a	a	+
+chr2	260607	260639	a	a	+
+chr2	260607	260639	a	a	+
+chr2	260576	260608	b	b	-
+chr2	260576	260608	b	b	-
+chr2	260609	260641	a	a	+
+chr2	260580	260612	b	b	-
+chr2	260580	260612	b	b	-
+chr2	260580	260612	b	b	-
+chr2	260580	260612	b	b	-
+chr2	260581	260613	b	b	-
+chr2	260581	260613	b	b	-
+chr2	260581	260613	b	b	-
+chr2	260581	260613	b	b	-
+chr2	260615	260647	a	a	+
+chr2	260617	260649	a	a	+
+chr2	260617	260649	a	a	+
+chr2	260619	260651	a	a	+
+chr2	260619	260651	a	a	+
+chr2	260619	260651	a	a	+
+chr2	260619	260651	a	a	+
+chr2	260619	260651	a	a	+
+chr2	260620	260652	a	a	+
+chr2	260620	260652	a	a	+
+chr2	260620	260652	a	a	+
+chr2	260588	260620	b	b	-
+chr2	260588	260620	b	b	-
+chr2	260588	260620	b	b	-
+chr2	260588	260620	b	b	-
+chr2	260588	260620	b	b	-
+chr2	260588	260620	b	b	-
+chr2	260588	260620	b	b	-
+chr2	260589	260621	b	b	-
+chr2	260589	260621	b	b	-
+chr2	260622	260654	a	a	+
+chr2	260590	260622	b	b	-
+chr2	260590	260622	b	b	-
+chr2	260590	260622	b	b	-
+chr2	260590	260622	b	b	-
+chr2	260632	260664	a	a	+
+chr2	260634	260666	a	a	+
+chr2	260634	260666	a	a	+
+chr2	260634	260666	a	a	+
+chr2	260634	260666	a	a	+
+chr2	260638	260670	a	a	+
+chr2	260642	260674	a	a	+
+chr2	260663	260695	a	a	+
+chr2	260632	260664	b	b	-
+chr2	260634	260666	b	b	-
+chr2	260634	260666	b	b	-
+chr2	260634	260666	b	b	-
+chr2	260635	260667	b	b	-
+chr2	260638	260670	b	b	-
+chr2	260638	260670	b	b	-
+chr2	260638	260670	b	b	-
+chr2	260640	260672	b	b	-
+chr2	260640	260672	b	b	-
+chr2	260674	260706	a	a	+
+chr2	260675	260707	a	a	+
+chr2	260675	260707	a	a	+
+chr2	260675	260707	a	a	+
+chr2	260678	260710	a	a	+
+chr2	260647	260679	b	b	-
+chr2	260681	260713	a	a	+
+chr2	260682	260714	a	a	+
+chr2	260685	260717	a	a	+
+chr2	260685	260717	a	a	+
+chr2	260653	260685	b	b	-
+chr2	260653	260685	b	b	-
+chr2	260653	260685	b	b	-
+chr2	260653	260685	b	b	-
+chr2	260653	260685	b	b	-
+chr2	260656	260688	b	b	-
+chr2	260656	260688	b	b	-
+chr2	260656	260688	b	b	-
+chr2	260656	260688	b	b	-
+chr2	260656	260688	b	b	-
+chr2	260689	260721	a	a	+
+chr2	260657	260689	b	b	-
+chr2	260658	260690	b	b	-
+chr2	260659	260691	b	b	-
+chr2	260692	260724	a	a	+
+chr2	260692	260724	a	a	+
+chr2	260692	260724	a	a	+
+chr2	260692	260724	a	a	+
+chr2	260692	260724	a	a	+
+chr2	260692	260724	a	a	+
+chr2	260693	260725	a	a	+
+chr2	260695	260727	a	a	+
+chr2	260695	260727	a	a	+
+chr2	260695	260727	a	a	+
+chr2	260696	260728	a	a	+
+chr2	260696	260728	a	a	+
+chr2	260696	260728	a	a	+
+chr2	260696	260728	a	a	+
+chr2	260664	260696	b	b	-
+chr2	260665	260697	b	b	-
+chr2	260665	260697	b	b	-
+chr2	260665	260697	b	b	-
+chr2	260665	260697	b	b	-
+chr2	260665	260697	b	b	-
+chr2	260665	260697	b	b	-
+chr2	260665	260697	b	b	-
+chr2	260665	260697	b	b	-
+chr2	260665	260697	b	b	-
+chr2	260665	260697	b	b	-
+chr2	260665	260697	b	b	-
+chr2	260665	260697	b	b	-
+chr2	260665	260697	b	b	-
+chr2	260665	260697	b	b	-
+chr2	260665	260697	b	b	-
+chr2	260665	260697	b	b	-
+chr2	260666	260698	b	b	-
+chr2	260666	260698	b	b	-
+chr2	260666	260698	b	b	-
+chr2	260666	260698	b	b	-
+chr2	260699	260731	a	a	+
+chr2	260667	260699	b	b	-
+chr2	260667	260699	b	b	-
+chr2	260667	260699	b	b	-
+chr2	260700	260732	a	a	+
+chr2	260700	260732	a	a	+
+chr2	260700	260732	a	a	+
+chr2	260668	260700	b	b	-
+chr2	260668	260700	b	b	-
+chr2	260668	260700	b	b	-
+chr2	260669	260701	b	b	-
+chr2	260669	260701	b	b	-
+chr2	260669	260701	b	b	-
+chr2	260669	260701	b	b	-
+chr2	260670	260702	b	b	-
+chr2	260670	260702	b	b	-
+chr2	260706	260738	a	a	+
+chr2	260706	260738	a	a	+
+chr2	260674	260706	b	b	-
+chr2	260674	260706	b	b	-
+chr2	260674	260706	b	b	-
+chr2	260674	260706	b	b	-
+chr2	260674	260706	b	b	-
+chr2	260674	260706	b	b	-
+chr2	260674	260706	b	b	-
+chr2	260707	260739	a	a	+
+chr2	260707	260739	a	a	+
+chr2	260707	260739	a	a	+
+chr2	260707	260739	a	a	+
+chr2	260707	260739	a	a	+
+chr2	260707	260739	a	a	+
+chr2	260707	260739	a	a	+
+chr2	260707	260739	a	a	+
+chr2	260707	260739	a	a	+
+chr2	260707	260739	a	a	+
+chr2	260707	260739	a	a	+
+chr2	260707	260739	a	a	+
+chr2	260707	260739	a	a	+
+chr2	260707	260739	a	a	+
+chr2	260675	260707	b	b	-
+chr2	260676	260708	b	b	-
+chr2	260676	260708	b	b	-
+chr2	260676	260708	b	b	-
+chr2	260676	260708	b	b	-
+chr2	260676	260708	b	b	-
+chr2	260676	260708	b	b	-
+chr2	260677	260709	b	b	-
+chr2	260710	260742	a	a	+
+chr2	260710	260742	a	a	+
+chr2	260710	260742	a	a	+
+chr2	260710	260742	a	a	+
+chr2	260710	260742	a	a	+
+chr2	260710	260742	a	a	+
+chr2	260710	260742	a	a	+
+chr2	260710	260742	a	a	+
+chr2	260710	260742	a	a	+
+chr2	260710	260742	a	a	+
+chr2	260711	260743	a	a	+
+chr2	260711	260743	a	a	+
+chr2	260711	260743	a	a	+
+chr2	260712	260744	a	a	+
+chr2	260680	260712	b	b	-
+chr2	260680	260712	b	b	-
+chr2	260680	260712	b	b	-
+chr2	260713	260745	a	a	+
+chr2	260713	260745	a	a	+
+chr2	260713	260745	a	a	+
+chr2	260713	260745	a	a	+
+chr2	260714	260746	a	a	+
+chr2	260714	260746	a	a	+
+chr2	260714	260746	a	a	+
+chr2	260714	260746	a	a	+
+chr2	260714	260746	a	a	+
+chr2	260714	260746	a	a	+
+chr2	260715	260747	a	a	+
+chr2	260715	260747	a	a	+
+chr2	260715	260747	a	a	+
+chr2	260715	260747	a	a	+
+chr2	260715	260747	a	a	+
+chr2	260715	260747	a	a	+
+chr2	260715	260747	a	a	+
+chr2	260715	260747	a	a	+
+chr2	260715	260747	a	a	+
+chr2	260715	260747	a	a	+
+chr2	260719	260751	a	a	+
+chr2	260720	260752	a	a	+
+chr2	260720	260752	a	a	+
+chr2	260720	260752	a	a	+
+chr2	260688	260720	b	b	-
+chr2	260688	260720	b	b	-
+chr2	260688	260720	b	b	-
+chr2	260721	260753	a	a	+
+chr2	260722	260754	a	a	+
+chr2	260722	260754	a	a	+
+chr2	260690	260722	b	b	-
+chr2	260690	260722	b	b	-
+chr2	260690	260722	b	b	-
+chr2	260690	260722	b	b	-
+chr2	260690	260722	b	b	-
+chr2	260690	260722	b	b	-
+chr2	260690	260722	b	b	-
+chr2	260690	260722	b	b	-
+chr2	260690	260722	b	b	-
+chr2	260690	260722	b	b	-
+chr2	260690	260722	b	b	-
+chr2	260690	260722	b	b	-
+chr2	260690	260722	b	b	-
+chr2	260690	260722	b	b	-
+chr2	260690	260722	b	b	-
+chr2	260690	260722	b	b	-
+chr2	260724	260756	a	a	+
+chr2	260724	260756	a	a	+
+chr2	260693	260725	b	b	-
+chr2	260726	260758	a	a	+
+chr2	260726	260758	a	a	+
+chr2	260695	260727	b	b	-
+chr2	260696	260728	b	b	-
+chr2	260729	260761	a	a	+
+chr2	260697	260729	b	b	-
+chr2	260730	260762	a	a	+
+chr2	260698	260730	b	b	-
+chr2	260731	260763	a	a	+
+chr2	260731	260763	a	a	+
+chr2	260731	260763	a	a	+
+chr2	260731	260763	a	a	+
+chr2	260731	260763	a	a	+
+chr2	260733	260765	a	a	+
+chr2	260733	260765	a	a	+
+chr2	260704	260736	b	b	-
+chr2	260738	260770	a	a	+
+chr2	260706	260738	b	b	-
+chr2	260739	260771	a	a	+
+chr2	260739	260771	a	a	+
+chr2	260739	260771	a	a	+
+chr2	260740	260772	a	a	+
+chr2	260709	260741	b	b	-
+chr2	260710	260742	b	b	-
+chr2	260711	260743	b	b	-
+chr2	260711	260743	b	b	-
+chr2	260711	260743	b	b	-
+chr2	260711	260743	b	b	-
+chr2	260746	260778	a	a	+
+chr2	260746	260778	a	a	+
+chr2	260746	260778	a	a	+
+chr2	260746	260778	a	a	+
+chr2	260746	260778	a	a	+
+chr2	260746	260778	a	a	+
+chr2	260715	260747	b	b	-
+chr2	260748	260780	a	a	+
+chr2	260748	260780	a	a	+
+chr2	260748	260780	a	a	+
+chr2	260748	260780	a	a	+
+chr2	260749	260781	a	a	+
+chr2	260749	260781	a	a	+
+chr2	260749	260781	a	a	+
+chr2	260749	260781	a	a	+
+chr2	260719	260751	b	b	-
+chr2	260719	260751	b	b	-
+chr2	260720	260752	b	b	-
+chr2	260720	260752	b	b	-
+chr2	260720	260752	b	b	-
+chr2	260720	260752	b	b	-
+chr2	260720	260752	b	b	-
+chr2	260720	260752	b	b	-
+chr2	260720	260752	b	b	-
+chr2	260720	260752	b	b	-
+chr2	260721	260753	b	b	-
+chr2	260721	260753	b	b	-
+chr2	260722	260754	b	b	-
+chr2	260722	260754	b	b	-
+chr2	260722	260754	b	b	-
+chr2	260722	260754	b	b	-
+chr2	260723	260755	b	b	-
+chr2	260723	260755	b	b	-
+chr2	260762	260794	a	a	+
+chr2	260762	260794	a	a	+
+chr2	260762	260794	a	a	+
+chr2	260762	260794	a	a	+
+chr2	260762	260794	a	a	+
+chr2	260768	260800	a	a	+
+chr2	260768	260800	a	a	+
+chr2	260769	260801	a	a	+
+chr2	260737	260769	b	b	-
+chr2	260737	260769	b	b	-
+chr2	260737	260769	b	b	-
+chr2	260737	260769	b	b	-
+chr2	260737	260769	b	b	-
+chr2	260771	260803	a	a	+
+chr2	260772	260804	a	a	+
+chr2	260772	260804	a	a	+
+chr2	260740	260772	b	b	-
+chr2	260740	260772	b	b	-
+chr2	260773	260805	a	a	+
+chr2	260773	260805	a	a	+
+chr2	260773	260805	a	a	+
+chr2	260773	260805	a	a	+
+chr2	260773	260805	a	a	+
+chr2	260774	260806	a	a	+
+chr2	260777	260809	a	a	+
+chr2	260777	260809	a	a	+
+chr2	260747	260779	b	b	-
+chr2	260780	260812	a	a	+
+chr2	260780	260812	a	a	+
+chr2	260780	260812	a	a	+
+chr2	260751	260783	b	b	-
+chr2	260785	260817	a	a	+
+chr2	260753	260785	b	b	-
+chr2	260754	260786	b	b	-
+chr2	260800	260832	a	a	+
+chr2	260774	260806	b	b	-
+chr2	260780	260812	b	b	-
+chr2	260825	260857	a	a	+
+chr2	260796	260828	b	b	-
+chr2	260831	260863	a	a	+
+chr2	260804	260836	b	b	-
+chr2	260838	260870	a	a	+
+chr2	260849	260881	a	a	+
+chr2	260850	260882	a	a	+
+chr2	260854	260886	a	a	+
+chr2	260823	260855	b	b	-
+chr2	260823	260855	b	b	-
+chr2	260856	260888	a	a	+
+chr2	260858	260890	a	a	+
+chr2	260830	260862	b	b	-
+chr2	260830	260862	b	b	-
+chr2	260830	260862	b	b	-
+chr2	260830	260862	b	b	-
+chr2	260830	260862	b	b	-
+chr2	260835	260867	b	b	-
+chr2	260835	260867	b	b	-
+chr2	260836	260868	b	b	-
+chr2	260872	260904	a	a	+
+chr2	260847	260879	b	b	-
+chr2	260847	260879	b	b	-
+chr2	260880	260912	a	a	+
+chr2	260880	260912	a	a	+
+chr2	260880	260912	a	a	+
+chr2	260880	260912	a	a	+
+chr2	260880	260912	a	a	+
+chr2	260880	260912	a	a	+
+chr2	260880	260912	a	a	+
+chr2	260880	260912	a	a	+
+chr2	260848	260880	b	b	-
+chr2	260882	260914	a	a	+
+chr2	260882	260914	a	a	+
+chr2	260884	260916	a	a	+
+chr2	260884	260916	a	a	+
+chr2	260884	260916	a	a	+
+chr2	260884	260916	a	a	+
+chr2	260889	260921	a	a	+
+chr2	260857	260889	b	b	-
+chr2	260891	260923	a	a	+
+chr2	260891	260923	a	a	+
+chr2	260859	260891	b	b	-
+chr2	260859	260891	b	b	-
+chr2	260893	260925	a	a	+
+chr2	260893	260925	a	a	+
+chr2	260893	260925	a	a	+
+chr2	260893	260925	a	a	+
+chr2	260893	260925	a	a	+
+chr2	260893	260925	a	a	+
+chr2	260863	260895	b	b	-
+chr2	260866	260898	b	b	-
+chr2	260867	260899	b	b	-
+chr2	260867	260899	b	b	-
+chr2	260901	260933	a	a	+
+chr2	260903	260935	a	a	+
+chr2	260909	260941	a	a	+
+chr2	260909	260941	a	a	+
+chr2	260909	260941	a	a	+
+chr2	260910	260942	a	a	+
+chr2	260910	260942	a	a	+
+chr2	260910	260942	a	a	+
+chr2	260910	260942	a	a	+
+chr2	260910	260942	a	a	+
+chr2	260911	260943	a	a	+
+chr2	260911	260943	a	a	+
+chr2	260911	260943	a	a	+
+chr2	260912	260944	a	a	+
+chr2	260912	260944	a	a	+
+chr2	260912	260944	a	a	+
+chr2	260881	260913	b	b	-
+chr2	260881	260913	b	b	-
+chr2	260881	260913	b	b	-
+chr2	260881	260913	b	b	-
+chr2	260882	260914	b	b	-
+chr2	260882	260914	b	b	-
+chr2	260883	260915	b	b	-
+chr2	260916	260948	a	a	+
+chr2	260916	260948	a	a	+
+chr2	260916	260948	a	a	+
+chr2	260887	260919	b	b	-
+chr2	260887	260919	b	b	-
+chr2	260920	260952	a	a	+
+chr2	260920	260952	a	a	+
+chr2	260889	260921	b	b	-
+chr2	260892	260924	b	b	-
+chr2	260925	260957	a	a	+
+chr2	260902	260934	b	b	-
+chr2	260902	260934	b	b	-
+chr2	260902	260934	b	b	-
+chr2	260940	260972	a	a	+
+chr2	260940	260972	a	a	+
+chr2	260940	260972	a	a	+
+chr2	260908	260940	b	b	-
+chr2	260908	260940	b	b	-
+chr2	260944	260976	a	a	+
+chr2	260944	260976	a	a	+
+chr2	260925	260957	b	b	-
+chr2	260925	260957	b	b	-
+chr2	260927	260959	b	b	-
+chr2	260927	260959	b	b	-
+chr2	260968	261000	a	a	+
+chr2	260942	260974	b	b	-
+chr2	260980	261012	a	a	+
+chr2	260983	261015	a	a	+
+chr2	260963	260995	b	b	-
+chr2	261000	261032	a	a	+
+chr2	260969	261001	b	b	-
+chr2	260969	261001	b	b	-
+chr2	260971	261003	b	b	-
+chr2	261005	261037	a	a	+
+chr2	260980	261012	b	b	-
+chr2	261020	261052	a	a	+
+chr2	261026	261058	a	a	+
+chr2	261028	261060	a	a	+
+chr2	261036	261068	a	a	+
+chr2	261037	261069	a	a	+
+chr2	261037	261069	a	a	+
+chr2	261039	261071	a	a	+
+chr2	261039	261071	a	a	+
+chr2	261042	261074	a	a	+
+chr2	261010	261042	b	b	-
+chr2	261013	261045	b	b	-
+chr2	261046	261078	a	a	+
+chr2	261015	261047	b	b	-
+chr2	261015	261047	b	b	-
+chr2	261015	261047	b	b	-
+chr2	261015	261047	b	b	-
+chr2	261015	261047	b	b	-
+chr2	261016	261048	b	b	-
+chr2	261050	261082	a	a	+
+chr2	261050	261082	a	a	+
+chr2	261050	261082	a	a	+
+chr2	261050	261082	a	a	+
+chr2	261024	261056	b	b	-
+chr2	261024	261056	b	b	-
+chr2	261034	261066	b	b	-
+chr2	261034	261066	b	b	-
+chr2	261034	261066	b	b	-
+chr2	261067	261099	a	a	+
+chr2	261067	261099	a	a	+
+chr2	261067	261099	a	a	+
+chr2	261068	261100	a	a	+
+chr2	261068	261100	a	a	+
+chr2	261068	261100	a	a	+
+chr2	261070	261102	a	a	+
+chr2	261071	261103	a	a	+
+chr2	261039	261071	b	b	-
+chr2	261075	261107	a	a	+
+chr2	261075	261107	a	a	+
+chr2	261076	261108	a	a	+
+chr2	261046	261078	b	b	-
+chr2	261046	261078	b	b	-
+chr2	261047	261079	b	b	-
+chr2	261087	261119	a	a	+
+chr2	261087	261119	a	a	+
+chr2	261088	261120	a	a	+
+chr2	261088	261120	a	a	+
+chr2	261088	261120	a	a	+
+chr2	261088	261120	a	a	+
+chr2	261088	261120	a	a	+
+chr2	261088	261120	a	a	+
+chr2	261088	261120	a	a	+
+chr2	261088	261120	a	a	+
+chr2	261060	261092	b	b	-
+chr2	261060	261092	b	b	-
+chr2	261062	261094	b	b	-
+chr2	261062	261094	b	b	-
+chr2	261096	261128	a	a	+
+chr2	261096	261128	a	a	+
+chr2	261104	261136	a	a	+
+chr2	261072	261104	b	b	-
+chr2	261073	261105	b	b	-
+chr2	261073	261105	b	b	-
+chr2	261073	261105	b	b	-
+chr2	261074	261106	b	b	-
+chr2	261107	261139	a	a	+
+chr2	261109	261141	a	a	+
+chr2	261078	261110	b	b	-
+chr2	261079	261111	b	b	-
+chr2	261114	261146	a	a	+
+chr2	261115	261147	a	a	+
+chr2	261115	261147	a	a	+
+chr2	261115	261147	a	a	+
+chr2	261115	261147	a	a	+
+chr2	261116	261148	a	a	+
+chr2	261116	261148	a	a	+
+chr2	261116	261148	a	a	+
+chr2	261084	261116	b	b	-
+chr2	261084	261116	b	b	-
+chr2	261117	261149	a	a	+
+chr2	261088	261120	b	b	-
+chr2	261122	261154	a	a	+
+chr2	261122	261154	a	a	+
+chr2	261093	261125	b	b	-
+chr2	261093	261125	b	b	-
+chr2	261128	261160	a	a	+
+chr2	261096	261128	b	b	-
+chr2	261099	261131	b	b	-
+chr2	261100	261132	b	b	-
+chr2	261145	261177	a	a	+
+chr2	261114	261146	b	b	-
+chr2	261115	261147	b	b	-
+chr2	261149	261181	a	a	+
+chr2	261117	261149	b	b	-
+chr2	261162	261194	a	a	+
+chr2	261162	261194	a	a	+
+chr2	261165	261197	a	a	+
+chr2	261196	261228	a	a	+
+chr2	261165	261197	b	b	-
+chr2	261166	261198	b	b	-
+chr2	261167	261199	b	b	-
+chr2	261202	261234	a	a	+
+chr2	261202	261234	a	a	+
+chr2	261203	261235	a	a	+
+chr2	261205	261237	a	a	+
+chr2	261205	261237	a	a	+
+chr2	261208	261240	a	a	+
+chr2	261180	261212	b	b	-
+chr2	261180	261212	b	b	-
+chr2	261180	261212	b	b	-
+chr2	261180	261212	b	b	-
+chr2	261181	261213	b	b	-
+chr2	261218	261250	a	a	+
+chr2	261219	261251	a	a	+
+chr2	261187	261219	b	b	-
+chr2	261222	261254	a	a	+
+chr2	261228	261260	a	a	+
+chr2	261228	261260	a	a	+
+chr2	261228	261260	a	a	+
+chr2	261228	261260	a	a	+
+chr2	261196	261228	b	b	-
+chr2	261196	261228	b	b	-
+chr2	261196	261228	b	b	-
+chr2	261196	261228	b	b	-
+chr2	261196	261228	b	b	-
+chr2	261231	261263	a	a	+
+chr2	261199	261231	b	b	-
+chr2	261203	261235	b	b	-
+chr2	261238	261270	a	a	+
+chr2	261239	261271	a	a	+
+chr2	261209	261241	b	b	-
+chr2	261209	261241	b	b	-
+chr2	261244	261276	a	a	+
+chr2	261212	261244	b	b	-
+chr2	261212	261244	b	b	-
+chr2	261212	261244	b	b	-
+chr2	261212	261244	b	b	-
+chr2	261213	261245	b	b	-
+chr2	261246	261278	a	a	+
+chr2	261258	261290	a	a	+
+chr2	261231	261263	b	b	-
+chr2	261231	261263	b	b	-
+chr2	261234	261266	b	b	-
+chr2	261267	261299	a	a	+
+chr2	261267	261299	a	a	+
+chr2	261267	261299	a	a	+
+chr2	261239	261271	b	b	-
+chr2	261278	261310	a	a	+
+chr2	261247	261279	b	b	-
+chr2	261247	261279	b	b	-
+chr2	261256	261288	b	b	-
+chr2	261256	261288	b	b	-
+chr2	261290	261322	a	a	+
+chr2	261302	261334	a	a	+
+chr2	261322	261354	a	a	+
+chr2	261293	261325	b	b	-
+chr2	261298	261330	b	b	-
+chr2	261358	261390	a	a	+
+chr2	261346	261378	b	b	-
+chr2	261347	261379	b	b	-
+chr2	261364	261396	b	b	-
+chr2	261366	261398	b	b	-
+chr2	261369	261401	b	b	-
+chr2	261380	261412	b	b	-
+chr2	261413	261445	a	a	+
+chr2	261414	261446	a	a	+
+chr2	261383	261415	b	b	-
+chr2	261421	261453	a	a	+
+chr2	261389	261421	b	b	-
+chr2	261422	261454	a	a	+
+chr2	261390	261422	b	b	-
+chr2	261391	261423	b	b	-
+chr2	261429	261461	a	a	+
+chr2	261431	261463	a	a	+
+chr2	261400	261432	b	b	-
+chr2	261435	261467	a	a	+
+chr2	261436	261468	a	a	+
+chr2	261436	261468	a	a	+
+chr2	261437	261469	a	a	+
+chr2	261437	261469	a	a	+
+chr2	261437	261469	a	a	+
+chr2	261409	261441	b	b	-
+chr2	261442	261474	a	a	+
+chr2	261418	261450	b	b	-
+chr2	261418	261450	b	b	-
+chr2	261418	261450	b	b	-
+chr2	261454	261486	a	a	+
+chr2	261430	261462	b	b	-
+chr2	261435	261467	b	b	-
+chr2	261435	261467	b	b	-
+chr2	261435	261467	b	b	-
+chr2	261435	261467	b	b	-
+chr2	261455	261487	b	b	-
+chr2	261459	261491	b	b	-
+chr2	261511	261543	a	a	+
+chr2	261511	261543	a	a	+
+chr2	261511	261543	a	a	+
+chr2	261512	261544	a	a	+
+chr2	261484	261516	b	b	-
+chr2	261485	261517	b	b	-
+chr2	261522	261554	a	a	+
+chr2	261503	261535	b	b	-
+chr2	261552	261584	a	a	+
+chr2	261552	261584	a	a	+
+chr2	261552	261584	a	a	+
+chr2	261525	261557	b	b	-
+chr2	261527	261559	b	b	-
+chr2	261536	261568	b	b	-
+chr2	261537	261569	b	b	-
+chr2	261572	261604	a	a	+
+chr2	261544	261576	b	b	-
+chr2	261577	261609	a	a	+
+chr2	261582	261614	a	a	+
+chr2	261550	261582	b	b	-
+chr2	261590	261622	a	a	+
+chr2	261610	261642	a	a	+
+chr2	261578	261610	b	b	-
+chr2	261578	261610	b	b	-
+chr2	261578	261610	b	b	-
+chr2	261619	261651	a	a	+
+chr2	261590	261622	b	b	-
+chr2	261604	261636	b	b	-
+chr2	261641	261673	a	a	+
+chr2	261617	261649	b	b	-
+chr2	261624	261656	b	b	-
+chr2	261624	261656	b	b	-
+chr2	261627	261659	b	b	-
+chr2	261633	261665	b	b	-
+chr2	261674	261706	a	a	+
+chr2	261689	261721	a	a	+
+chr2	261658	261690	b	b	-
+chr2	261658	261690	b	b	-
+chr2	261658	261690	b	b	-
+chr2	261708	261740	a	a	+
+chr2	261708	261740	a	a	+
+chr2	261718	261750	a	a	+
+chr2	261718	261750	a	a	+
+chr2	261718	261750	a	a	+
+chr2	261718	261750	a	a	+
+chr2	261718	261750	a	a	+
+chr2	261718	261750	a	a	+
+chr2	261718	261750	a	a	+
+chr2	261718	261750	a	a	+
+chr2	261718	261750	a	a	+
+chr2	261718	261750	a	a	+
+chr2	261718	261750	a	a	+
+chr2	261718	261750	a	a	+
+chr2	261718	261750	a	a	+
+chr2	261718	261750	a	a	+
+chr2	261719	261751	a	a	+
+chr2	261720	261752	a	a	+
+chr2	261724	261756	a	a	+
+chr2	261724	261756	a	a	+
+chr2	261724	261756	a	a	+
+chr2	261692	261724	b	b	-
+chr2	261730	261762	a	a	+
+chr2	261702	261734	b	b	-
+chr2	261712	261744	b	b	-
+chr2	261712	261744	b	b	-
+chr2	261717	261749	b	b	-
+chr2	261729	261761	b	b	-
+chr2	261765	261797	a	a	+
+chr2	261775	261807	a	a	+
+chr2	261745	261777	b	b	-
+chr2	261751	261783	b	b	-
+chr2	261789	261821	a	a	+
+chr2	261796	261828	a	a	+
+chr2	261806	261838	a	a	+
+chr2	261776	261808	b	b	-
+chr2	261776	261808	b	b	-
+chr2	261815	261847	a	a	+
+chr2	261786	261818	b	b	-
+chr2	261786	261818	b	b	-
+chr2	261839	261871	a	a	+
+chr2	261813	261845	b	b	-
+chr2	261813	261845	b	b	-
+chr2	261813	261845	b	b	-
+chr2	261813	261845	b	b	-
+chr2	261813	261845	b	b	-
+chr2	261813	261845	b	b	-
+chr2	261849	261881	a	a	+
+chr2	261849	261881	a	a	+
+chr2	261849	261881	a	a	+
+chr2	261858	261890	a	a	+
+chr2	261858	261890	a	a	+
+chr2	261863	261895	a	a	+
+chr2	261865	261897	a	a	+
+chr2	261871	261903	a	a	+
+chr2	261883	261915	a	a	+
+chr2	261861	261893	b	b	-
+chr2	261861	261893	b	b	-
+chr2	261896	261928	a	a	+
+chr2	261868	261900	b	b	-
+chr2	261869	261901	b	b	-
+chr2	261913	261945	a	a	+
+chr2	261924	261956	a	a	+
+chr2	261926	261958	a	a	+
+chr2	261906	261938	b	b	-
+chr2	261914	261946	b	b	-
+chr2	261948	261980	a	a	+
+chr2	261948	261980	a	a	+
+chr2	261952	261984	a	a	+
+chr2	261922	261954	b	b	-
+chr2	261922	261954	b	b	-
+chr2	261922	261954	b	b	-
+chr2	261959	261991	a	a	+
+chr2	261959	261991	a	a	+
+chr2	261959	261991	a	a	+
+chr2	261950	261982	b	b	-
+chr2	261953	261985	b	b	-
+chr2	261953	261985	b	b	-
+chr2	261953	261985	b	b	-
+chr2	261953	261985	b	b	-
+chr2	262008	262040	a	a	+
+chr2	262008	262040	a	a	+
+chr2	262009	262041	a	a	+
+chr2	262013	262045	a	a	+
+chr2	262013	262045	a	a	+
+chr2	262014	262046	a	a	+
+chr2	262016	262048	a	a	+
+chr2	261984	262016	b	b	-
+chr2	261985	262017	b	b	-
+chr2	261988	262020	b	b	-
+chr2	262029	262061	a	a	+
+chr2	262030	262062	a	a	+
+chr2	262030	262062	a	a	+
+chr2	262015	262047	b	b	-
+chr2	262049	262081	a	a	+
+chr2	262052	262084	a	a	+
+chr2	262052	262084	a	a	+
+chr2	262025	262057	b	b	-
+chr2	262026	262058	b	b	-
+chr2	262026	262058	b	b	-
+chr2	262063	262095	a	a	+
+chr2	262068	262100	a	a	+
+chr2	262037	262069	b	b	-
+chr2	262071	262103	a	a	+
+chr2	262071	262103	a	a	+
+chr2	262078	262110	a	a	+
+chr2	262078	262110	a	a	+
+chr2	262078	262110	a	a	+
+chr2	262078	262110	a	a	+
+chr2	262108	262140	a	a	+
+chr2	262077	262109	b	b	-
+chr2	262111	262143	a	a	+
+chr2	262094	262126	b	b	-
+chr2	262094	262126	b	b	-
+chr2	262094	262126	b	b	-
+chr2	262138	262170	a	a	+
+chr2	262144	262176	a	a	+
+chr2	262116	262148	b	b	-
+chr2	262168	262200	a	a	+
+chr2	262170	262202	a	a	+
+chr2	262173	262205	a	a	+
+chr2	262173	262205	a	a	+
+chr2	262152	262184	b	b	-
+chr2	262152	262184	b	b	-
+chr2	262159	262191	b	b	-
+chr2	262199	262231	a	a	+
+chr2	262168	262200	b	b	-
+chr2	262206	262238	a	a	+
+chr2	262174	262206	b	b	-
+chr2	262174	262206	b	b	-
+chr2	262211	262243	a	a	+
+chr2	262212	262244	a	a	+
+chr2	262217	262249	a	a	+
+chr2	262218	262250	a	a	+
+chr2	262221	262253	a	a	+
+chr2	262191	262223	b	b	-
+chr2	262201	262233	b	b	-
+chr2	262276	262308	a	a	+
+chr2	262276	262308	a	a	+
+chr2	262249	262281	b	b	-
+chr2	262249	262281	b	b	-
+chr2	262305	262337	a	a	+
+chr2	262296	262328	b	b	-
+chr2	262296	262328	b	b	-
+chr2	262310	262342	b	b	-
+chr2	262310	262342	b	b	-
+chr2	262364	262396	a	a	+
+chr2	262333	262365	b	b	-
+chr2	262342	262374	b	b	-
+chr2	262344	262376	b	b	-
+chr2	262382	262414	a	a	+
+chr2	262383	262415	a	a	+
+chr2	262383	262415	a	a	+
+chr2	262352	262384	b	b	-
+chr2	262354	262386	b	b	-
+chr2	262387	262419	a	a	+
+chr2	262356	262388	b	b	-
+chr2	262356	262388	b	b	-
+chr2	262356	262388	b	b	-
+chr2	262389	262421	a	a	+
+chr2	262390	262422	a	a	+
+chr2	262358	262390	b	b	-
+chr2	262361	262393	b	b	-
+chr2	262394	262426	a	a	+
+chr2	262398	262430	a	a	+
+chr2	262369	262401	b	b	-
+chr2	262403	262435	a	a	+
+chr2	262371	262403	b	b	-
+chr2	262379	262411	b	b	-
+chr2	262427	262459	a	a	+
+chr2	262427	262459	a	a	+
+chr2	262429	262461	a	a	+
+chr2	262408	262440	b	b	-
+chr2	262414	262446	b	b	-
+chr2	262414	262446	b	b	-
+chr2	262448	262480	a	a	+
+chr2	262422	262454	b	b	-
+chr2	262455	262487	a	a	+
+chr2	262455	262487	a	a	+
+chr2	262464	262496	a	a	+
+chr2	262472	262504	a	a	+
+chr2	262445	262477	b	b	-
+chr2	262483	262515	a	a	+
+chr2	262456	262488	b	b	-
+chr2	262493	262525	a	a	+
+chr2	262493	262525	a	a	+
+chr2	262462	262494	b	b	-
+chr2	262498	262530	b	b	-
+chr2	262498	262530	b	b	-
+chr2	262532	262564	a	a	+
+chr2	262532	262564	a	a	+
+chr2	262501	262533	b	b	-
+chr2	262511	262543	b	b	-
+chr2	262515	262547	b	b	-
+chr2	262515	262547	b	b	-
+chr2	262531	262563	b	b	-
+chr2	262531	262563	b	b	-
+chr2	262531	262563	b	b	-
+chr2	262573	262605	a	a	+
+chr2	262550	262582	b	b	-
+chr2	262552	262584	b	b	-
+chr2	262554	262586	b	b	-
+chr2	262558	262590	b	b	-
+chr2	262600	262632	a	a	+
+chr2	262569	262601	b	b	-
+chr2	262604	262636	a	a	+
+chr2	262604	262636	a	a	+
+chr2	262642	262674	a	a	+
+chr2	262643	262675	a	a	+
+chr2	262664	262696	a	a	+
+chr2	262651	262683	b	b	-
+chr2	262655	262687	b	b	-
+chr2	262669	262701	b	b	-
+chr2	262669	262701	b	b	-
+chr2	262669	262701	b	b	-
+chr2	262671	262703	b	b	-
+chr2	262672	262704	b	b	-
+chr2	262678	262710	b	b	-
+chr2	262712	262744	a	a	+
+chr2	262696	262728	b	b	-
+chr2	262696	262728	b	b	-
+chr2	262703	262735	b	b	-
+chr2	262718	262750	b	b	-
+chr2	262721	262753	b	b	-
+chr2	262762	262794	a	a	+
+chr2	262772	262804	a	a	+
+chr2	262747	262779	b	b	-
+chr2	262784	262816	a	a	+
+chr2	262771	262803	b	b	-
+chr2	262811	262843	a	a	+
+chr2	262786	262818	b	b	-
+chr2	262792	262824	b	b	-
+chr2	262792	262824	b	b	-
+chr2	262830	262862	a	a	+
+chr2	262819	262851	b	b	-
+chr2	262820	262852	b	b	-
+chr2	262820	262852	b	b	-
+chr2	262824	262856	b	b	-
+chr2	262824	262856	b	b	-
+chr2	262825	262857	b	b	-
+chr2	262825	262857	b	b	-
+chr2	262872	262904	b	b	-
+chr2	262906	262938	a	a	+
+chr2	262891	262923	b	b	-
+chr2	262891	262923	b	b	-
+chr2	262926	262958	a	a	+
+chr2	262922	262954	b	b	-
+chr2	262927	262959	b	b	-
+chr2	262931	262963	b	b	-
+chr2	262974	263006	a	a	+
+chr2	262976	263008	a	a	+
+chr2	262944	262976	b	b	-
+chr2	262944	262976	b	b	-
+chr2	262944	262976	b	b	-
+chr2	262948	262980	b	b	-
+chr2	262948	262980	b	b	-
+chr2	262989	263021	a	a	+
+chr2	262975	263007	b	b	-
+chr2	262975	263007	b	b	-
+chr2	263012	263044	a	a	+
+chr2	263015	263047	a	a	+
+chr2	263015	263047	a	a	+
+chr2	263034	263066	a	a	+
+chr2	263026	263058	b	b	-
+chr2	263029	263061	b	b	-
+chr2	263030	263062	b	b	-
+chr2	263052	263084	b	b	-
+chr2	263061	263093	b	b	-
+chr2	263100	263132	a	a	+
+chr2	263113	263145	a	a	+
+chr2	263113	263145	a	a	+
+chr2	263098	263130	b	b	-
+chr2	263114	263146	b	b	-
+chr2	263114	263146	b	b	-
+chr2	263139	263171	b	b	-
+chr2	263180	263212	a	a	+
+chr2	263181	263213	a	a	+
+chr2	263193	263225	b	b	-
+chr2	263234	263266	b	b	-
+chr2	263243	263275	b	b	-
+chr2	263279	263311	b	b	-
+chr2	263313	263345	a	a	+
+chr2	263281	263313	b	b	-
+chr2	263318	263350	a	a	+
+chr2	263326	263358	a	a	+
+chr2	263326	263358	a	a	+
+chr2	263328	263360	a	a	+
+chr2	263341	263373	a	a	+
+chr2	263310	263342	b	b	-
+chr2	263362	263394	a	a	+
+chr2	263390	263422	a	a	+
+chr2	263423	263455	a	a	+
+chr2	263413	263445	b	b	-
+chr2	263452	263484	a	a	+
+chr2	263460	263492	a	a	+
+chr2	263437	263469	b	b	-
+chr2	263472	263504	a	a	+
+chr2	263472	263504	a	a	+
+chr2	263441	263473	b	b	-
+chr2	263464	263496	b	b	-
+chr2	263501	263533	a	a	+
+chr2	263517	263549	a	a	+
+chr2	263485	263517	b	b	-
+chr2	263508	263540	b	b	-
+chr2	263558	263590	a	a	+
+chr2	263532	263564	b	b	-
+chr2	263544	263576	b	b	-
+chr2	263582	263614	a	a	+
+chr2	263552	263584	b	b	-
+chr2	263591	263623	a	a	+
+chr2	263603	263635	a	a	+
+chr2	263575	263607	b	b	-
+chr2	263576	263608	b	b	-
+chr2	263620	263652	a	a	+
+chr2	263605	263637	b	b	-
+chr2	263623	263655	b	b	-
+chr2	263685	263717	a	a	+
+chr2	263694	263726	a	a	+
+chr2	263707	263739	a	a	+
+chr2	263711	263743	a	a	+
+chr2	263752	263784	a	a	+
+chr2	263721	263753	b	b	-
+chr2	263760	263792	a	a	+
+chr2	263736	263768	b	b	-
+chr2	263736	263768	b	b	-
+chr2	263771	263803	a	a	+
+chr2	263741	263773	b	b	-
+chr2	263787	263819	a	a	+
+chr2	263787	263819	a	a	+
+chr2	263797	263829	a	a	+
+chr2	263767	263799	b	b	-
+chr2	263770	263802	b	b	-
+chr2	263770	263802	b	b	-
+chr2	263770	263802	b	b	-
+chr2	263777	263809	b	b	-
+chr2	263812	263844	a	a	+
+chr2	263788	263820	b	b	-
+chr2	263788	263820	b	b	-
+chr2	263821	263853	a	a	+
+chr2	263822	263854	a	a	+
+chr2	263829	263861	a	a	+
+chr2	263800	263832	b	b	-
+chr2	263838	263870	a	a	+
+chr2	263838	263870	a	a	+
+chr2	263839	263871	a	a	+
+chr2	263840	263872	a	a	+
+chr2	263849	263881	a	a	+
+chr2	263851	263883	a	a	+
+chr2	263906	263938	a	a	+
+chr2	263934	263966	a	a	+
+chr2	263910	263942	b	b	-
+chr2	263922	263954	b	b	-
+chr2	263939	263971	b	b	-
+chr2	263977	264009	a	a	+
+chr2	263977	264009	a	a	+
+chr2	263987	264019	a	a	+
+chr2	263963	263995	b	b	-
+chr2	264028	264060	a	a	+
+chr2	264029	264061	a	a	+
+chr2	264030	264062	a	a	+
+chr2	264006	264038	b	b	-
+chr2	264006	264038	b	b	-
+chr2	264052	264084	a	a	+
+chr2	264052	264084	a	a	+
+chr2	264055	264087	a	a	+
+chr2	264056	264088	a	a	+
+chr2	264024	264056	b	b	-
+chr2	264061	264093	a	a	+
+chr2	264042	264074	b	b	-
+chr2	264042	264074	b	b	-
+chr2	264042	264074	b	b	-
+chr2	264042	264074	b	b	-
+chr2	264042	264074	b	b	-
+chr2	264045	264077	b	b	-
+chr2	264049	264081	b	b	-
+chr2	264054	264086	b	b	-
+chr2	264054	264086	b	b	-
+chr2	264094	264126	a	a	+
+chr2	264074	264106	b	b	-
+chr2	264120	264152	b	b	-
+chr2	264122	264154	b	b	-
+chr2	264157	264189	a	a	+
+chr2	264161	264193	a	a	+
+chr2	264164	264196	a	a	+
+chr2	264142	264174	b	b	-
+chr2	264258	264290	b	b	-
+chr2	264273	264305	b	b	-
+chr2	264325	264357	a	a	+
+chr2	264330	264362	a	a	+
+chr2	264330	264362	a	a	+
+chr2	264340	264372	a	a	+
+chr2	264309	264341	b	b	-
+chr2	264342	264374	a	a	+
+chr2	264333	264365	b	b	-
+chr2	264368	264400	a	a	+
+chr2	264346	264378	b	b	-
+chr2	264381	264413	a	a	+
+chr2	264353	264385	b	b	-
+chr2	264397	264429	a	a	+
+chr2	264371	264403	b	b	-
+chr2	264410	264442	a	a	+
+chr2	264383	264415	b	b	-
+chr2	264384	264416	b	b	-
+chr2	264417	264449	a	a	+
+chr2	264420	264452	a	a	+
+chr2	264393	264425	b	b	-
+chr2	264397	264429	b	b	-
+chr2	264432	264464	a	a	+
+chr2	264433	264465	a	a	+
+chr2	264424	264456	b	b	-
+chr2	264471	264503	a	a	+
+chr2	264471	264503	a	a	+
+chr2	264490	264522	a	a	+
+chr2	264465	264497	b	b	-
+chr2	264537	264569	a	a	+
+chr2	264531	264563	b	b	-
+chr2	264564	264596	a	a	+
+chr2	264571	264603	b	b	-
+chr2	264613	264645	a	a	+
+chr2	264652	264684	a	a	+
+chr2	264631	264663	b	b	-
+chr2	264652	264684	b	b	-
+chr2	264717	264749	a	a	+
+chr2	264717	264749	a	a	+
+chr2	264717	264749	a	a	+
+chr2	264719	264751	a	a	+
+chr2	264730	264762	b	b	-
+chr2	264766	264798	a	a	+
+chr2	264767	264799	a	a	+
+chr2	264737	264769	b	b	-
+chr2	264738	264770	b	b	-
+chr2	264781	264813	a	a	+
+chr2	264781	264813	a	a	+
+chr2	264782	264814	a	a	+
+chr2	264762	264794	b	b	-
+chr2	264795	264827	a	a	+
+chr2	264825	264857	a	a	+
+chr2	264808	264840	b	b	-
+chr2	264853	264885	a	a	+
+chr2	264853	264885	a	a	+
+chr2	264853	264885	a	a	+
+chr2	264862	264894	a	a	+
+chr2	264836	264868	b	b	-
+chr2	264836	264868	b	b	-
+chr2	264838	264870	b	b	-
+chr2	264839	264871	b	b	-
+chr2	264988	265020	a	a	+
+chr2	265011	265043	a	a	+
+chr2	265039	265071	a	a	+
+chr2	265008	265040	b	b	-
+chr2	265061	265093	a	a	+
+chr2	265034	265066	b	b	-
+chr2	265034	265066	b	b	-
+chr2	265070	265102	a	a	+
+chr2	265088	265120	a	a	+
+chr2	265088	265120	a	a	+
+chr2	265059	265091	b	b	-
+chr2	265062	265094	b	b	-
+chr2	265083	265115	b	b	-
+chr2	265105	265137	b	b	-
+chr2	265155	265187	b	b	-
+chr2	265163	265195	b	b	-
+chr2	265166	265198	b	b	-
+chr2	265167	265199	b	b	-
+chr2	265168	265200	b	b	-
+chr2	265177	265209	b	b	-
+chr2	265177	265209	b	b	-
+chr2	265179	265211	b	b	-
+chr2	265179	265211	b	b	-
+chr2	265179	265211	b	b	-
+chr2	265182	265214	b	b	-
+chr2	265190	265222	b	b	-
+chr2	265190	265222	b	b	-
+chr2	265191	265223	b	b	-
+chr2	265194	265226	b	b	-
+chr2	265194	265226	b	b	-
+chr2	265194	265226	b	b	-
+chr2	265194	265226	b	b	-
+chr2	265195	265227	b	b	-
+chr2	265195	265227	b	b	-
+chr2	265195	265227	b	b	-
+chr2	265195	265227	b	b	-
+chr2	265200	265232	b	b	-
+chr2	265234	265266	a	a	+
+chr2	265234	265266	a	a	+
+chr2	265234	265266	a	a	+
+chr2	265234	265266	a	a	+
+chr2	265234	265266	a	a	+
+chr2	265234	265266	a	a	+
+chr2	265234	265266	a	a	+
+chr2	265234	265266	a	a	+
+chr2	265234	265266	a	a	+
+chr2	265203	265235	b	b	-
+chr2	265237	265269	a	a	+
+chr2	265205	265237	b	b	-
+chr2	265206	265238	b	b	-
+chr2	265206	265238	b	b	-
+chr2	265207	265239	b	b	-
+chr2	265208	265240	b	b	-
+chr2	265245	265277	a	a	+
+chr2	265245	265277	a	a	+
+chr2	265214	265246	b	b	-
+chr2	265248	265280	a	a	+
+chr2	265216	265248	b	b	-
+chr2	265216	265248	b	b	-
+chr2	265251	265283	a	a	+
+chr2	265251	265283	a	a	+
+chr2	265255	265287	a	a	+
+chr2	265224	265256	b	b	-
+chr2	265227	265259	b	b	-
+chr2	265227	265259	b	b	-
+chr2	265228	265260	b	b	-
+chr2	265234	265266	b	b	-
+chr2	265234	265266	b	b	-
+chr2	265237	265269	b	b	-
+chr2	265241	265273	b	b	-
+chr2	265244	265276	b	b	-
+chr2	265280	265312	a	a	+
+chr2	265251	265283	b	b	-
+chr2	265251	265283	b	b	-
+chr2	265252	265284	b	b	-
+chr2	265285	265317	a	a	+
+chr2	265253	265285	b	b	-
+chr2	265288	265320	a	a	+
+chr2	265290	265322	a	a	+
+chr2	265290	265322	a	a	+
+chr2	265259	265291	b	b	-
+chr2	265259	265291	b	b	-
+chr2	265295	265327	a	a	+
+chr2	265296	265328	a	a	+
+chr2	265297	265329	a	a	+
+chr2	265298	265330	a	a	+
+chr2	265299	265331	a	a	+
+chr2	265307	265339	a	a	+
+chr2	265275	265307	b	b	-
+chr2	265280	265312	b	b	-
+chr2	265313	265345	a	a	+
+chr2	265313	265345	a	a	+
+chr2	265281	265313	b	b	-
+chr2	265281	265313	b	b	-
+chr2	265285	265317	b	b	-
+chr2	265285	265317	b	b	-
+chr2	265286	265318	b	b	-
+chr2	265287	265319	b	b	-
+chr2	265287	265319	b	b	-
+chr2	265323	265355	a	a	+
+chr2	265325	265357	a	a	+
+chr2	265325	265357	a	a	+
+chr2	265303	265335	b	b	-
+chr2	265307	265339	b	b	-
+chr2	265307	265339	b	b	-
+chr2	265307	265339	b	b	-
+chr2	265309	265341	b	b	-
+chr2	265309	265341	b	b	-
+chr2	265310	265342	b	b	-
+chr2	265310	265342	b	b	-
+chr2	265310	265342	b	b	-
+chr2	265310	265342	b	b	-
+chr2	265310	265342	b	b	-
+chr2	265318	265350	b	b	-
+chr2	265319	265351	b	b	-
+chr2	265320	265352	b	b	-
+chr2	265357	265389	a	a	+
+chr2	265331	265363	b	b	-
+chr2	265337	265369	b	b	-
+chr2	265373	265405	a	a	+
+chr2	265380	265412	a	a	+
+chr2	265380	265412	a	a	+
+chr2	265381	265413	a	a	+
+chr2	265381	265413	a	a	+
+chr2	265388	265420	a	a	+
+chr2	265364	265396	b	b	-
+chr2	265399	265431	a	a	+
+chr2	265367	265399	b	b	-
+chr2	265400	265432	a	a	+
+chr2	265401	265433	a	a	+
+chr2	265401	265433	a	a	+
+chr2	265401	265433	a	a	+
+chr2	265409	265441	a	a	+
+chr2	265409	265441	a	a	+
+chr2	265378	265410	b	b	-
+chr2	265378	265410	b	b	-
+chr2	265415	265447	a	a	+
+chr2	265417	265449	a	a	+
+chr2	265421	265453	a	a	+
+chr2	265425	265457	a	a	+
+chr2	265427	265459	a	a	+
+chr2	265429	265461	a	a	+
+chr2	265430	265462	a	a	+
+chr2	265431	265463	a	a	+
+chr2	265433	265465	a	a	+
+chr2	265434	265466	a	a	+
+chr2	265438	265470	a	a	+
+chr2	265441	265473	a	a	+
+chr2	265442	265474	a	a	+
+chr2	265442	265474	a	a	+
+chr2	265442	265474	a	a	+
+chr2	265442	265474	a	a	+
+chr2	265442	265474	a	a	+
+chr2	265442	265474	a	a	+
+chr2	265442	265474	a	a	+
+chr2	265442	265474	a	a	+
+chr2	265442	265474	a	a	+
+chr2	265442	265474	a	a	+
+chr2	265442	265474	a	a	+
+chr2	265443	265475	a	a	+
+chr2	265443	265475	a	a	+
+chr2	265443	265475	a	a	+
+chr2	265445	265477	a	a	+
+chr2	265446	265478	a	a	+
+chr2	265446	265478	a	a	+
+chr2	265446	265478	a	a	+
+chr2	265454	265486	a	a	+
+chr2	265460	265492	a	a	+
+chr2	265460	265492	a	a	+
+chr2	265466	265498	a	a	+
+chr2	265466	265498	a	a	+
+chr2	265466	265498	a	a	+
+chr2	265467	265499	a	a	+
+chr2	265467	265499	a	a	+
+chr2	265682	265714	b	b	-
+chr2	265779	265811	b	b	-
+chr2	265796	265828	b	b	-
+chr2	265831	265863	a	a	+
+chr2	265843	265875	a	a	+
+chr2	265816	265848	b	b	-
+chr2	265833	265865	b	b	-
+chr2	265866	265898	a	a	+
+chr2	265866	265898	a	a	+
+chr2	265834	265866	b	b	-
+chr2	265951	265983	b	b	-
+chr2	265969	266001	b	b	-
+chr2	266012	266044	a	a	+
+chr2	265982	266014	b	b	-
+chr2	265982	266014	b	b	-
+chr2	265982	266014	b	b	-
+chr2	265986	266018	b	b	-
+chr2	266020	266052	a	a	+
+chr2	266022	266054	a	a	+
+chr2	266022	266054	a	a	+
+chr2	266036	266068	a	a	+
+chr2	266036	266068	a	a	+
+chr2	266004	266036	b	b	-
+chr2	266004	266036	b	b	-
+chr2	266005	266037	b	b	-
+chr2	266038	266070	a	a	+
+chr2	266011	266043	b	b	-
+chr2	266012	266044	b	b	-
+chr2	266023	266055	b	b	-
+chr2	266056	266088	a	a	+
+chr2	266026	266058	b	b	-
+chr2	266080	266112	a	a	+
+chr2	266550	266582	b	b	-
+chr2	266739	266771	a	a	+
+chr2	266723	266755	b	b	-
+chr2	266723	266755	b	b	-
+chr2	266846	266878	b	b	-
+chr2	266903	266935	b	b	-
+chr2	267040	267072	b	b	-
+chr2	267106	267138	b	b	-
+chr2	267139	267171	b	b	-
+chr2	267139	267171	b	b	-
+chr2	267139	267171	b	b	-
+chr2	267139	267171	b	b	-
+chr2	267178	267210	a	a	+
+chr2	267183	267215	a	a	+
+chr2	267183	267215	a	a	+
+chr2	267285	267317	b	b	-
+chr2	267286	267318	b	b	-
+chr2	267351	267383	a	a	+
+chr2	267427	267459	b	b	-
+chr2	267462	267494	b	b	-
+chr2	267789	267821	a	a	+
+chr2	268011	268043	a	a	+
+chr2	268191	268223	a	a	+
+chr2	268355	268387	a	a	+
+chr2	268425	268457	b	b	-
+chr2	268470	268502	a	a	+
+chr2	268985	269017	a	a	+
+chr2	269052	269084	a	a	+
+chr2	269079	269111	a	a	+
+chr2	269191	269223	a	a	+
+chr2	269197	269229	b	b	-
+chr2	269236	269268	a	a	+
+chr2	269236	269268	a	a	+
+chr2	269298	269330	b	b	-
+chr2	269332	269364	a	a	+
+chr2	269312	269344	b	b	-
+chr2	269370	269402	a	a	+
+chr2	269380	269412	a	a	+
+chr2	269351	269383	b	b	-
+chr2	269359	269391	b	b	-
+chr2	269364	269396	b	b	-
+chr2	269364	269396	b	b	-
+chr2	269364	269396	b	b	-
+chr2	269366	269398	b	b	-
+chr2	269374	269406	b	b	-
+chr2	269427	269459	a	a	+
+chr2	269440	269472	b	b	-
+chr2	269510	269542	b	b	-
+chr2	269546	269578	a	a	+
+chr2	269553	269585	a	a	+
+chr2	269524	269556	b	b	-
+chr2	269530	269562	b	b	-
+chr2	269564	269596	a	a	+
+chr2	269533	269565	b	b	-
+chr2	269569	269601	a	a	+
+chr2	269569	269601	a	a	+
+chr2	269547	269579	b	b	-
+chr2	269588	269620	a	a	+
+chr2	269596	269628	a	a	+
+chr2	269602	269634	a	a	+
+chr2	269823	269855	a	a	+
+chr2	269795	269827	b	b	-
+chr2	269795	269827	b	b	-
+chr2	269796	269828	b	b	-
+chr2	269843	269875	a	a	+
+chr2	269843	269875	a	a	+
+chr2	269843	269875	a	a	+
+chr2	269844	269876	a	a	+
+chr2	269846	269878	a	a	+
+chr2	269855	269887	a	a	+
+chr2	269828	269860	b	b	-
+chr2	269828	269860	b	b	-
+chr2	269902	269934	a	a	+
+chr2	269872	269904	b	b	-
+chr2	269928	269960	b	b	-
+chr2	269982	270014	a	a	+
+chr2	269965	269997	b	b	-
+chr2	270022	270054	a	a	+
+chr2	270027	270059	a	a	+
+chr2	270205	270237	b	b	-
+chr2	270205	270237	b	b	-
+chr2	270245	270277	a	a	+
+chr2	270252	270284	a	a	+
+chr2	270227	270259	b	b	-
+chr2	270260	270292	a	a	+
+chr2	270260	270292	a	a	+
+chr2	270260	270292	a	a	+
+chr2	270260	270292	a	a	+
+chr2	270240	270272	b	b	-
+chr2	270240	270272	b	b	-
+chr2	270249	270281	b	b	-
+chr2	270340	270372	b	b	-
+chr2	270358	270390	b	b	-
+chr2	270395	270427	a	a	+
+chr2	270416	270448	a	a	+
+chr2	270416	270448	a	a	+
+chr2	270385	270417	b	b	-
+chr2	270399	270431	b	b	-
+chr2	270400	270432	b	b	-
+chr2	270452	270484	b	b	-
+chr2	270552	270584	a	a	+
+chr2	270539	270571	b	b	-
+chr2	270544	270576	b	b	-
+chr2	270582	270614	a	a	+
+chr2	270582	270614	a	a	+
+chr2	270582	270614	a	a	+
+chr2	270582	270614	a	a	+
+chr2	270582	270614	a	a	+
+chr2	270582	270614	a	a	+
+chr2	270554	270586	b	b	-
+chr2	270559	270591	b	b	-
+chr2	270559	270591	b	b	-
+chr2	270602	270634	a	a	+
+chr2	271086	271118	b	b	-
+chr2	271137	271169	a	a	+
+chr2	271151	271183	b	b	-
+chr2	271235	271267	a	a	+
+chr2	271292	271324	a	a	+
+chr2	271319	271351	b	b	-
+chr2	271531	271563	a	a	+
+chr2	271637	271669	b	b	-
+chr2	271926	271958	a	a	+
+chr2	271957	271989	b	b	-
+chr2	272526	272558	a	a	+
+chr2	272628	272660	a	a	+
+chr2	272805	272837	a	a	+
+chr2	273099	273131	a	a	+
+chr2	273202	273234	b	b	-
+chr2	273358	273390	b	b	-
+chr2	273532	273564	a	a	+
+chr2	273504	273536	b	b	-
+chr2	273505	273537	b	b	-
+chr2	273505	273537	b	b	-
+chr2	273553	273585	a	a	+
+chr2	273529	273561	b	b	-
+chr2	273648	273680	b	b	-
+chr2	273648	273680	b	b	-
+chr2	273650	273682	b	b	-
+chr2	273654	273686	b	b	-
+chr2	273655	273687	b	b	-
+chr2	273658	273690	b	b	-
+chr2	273658	273690	b	b	-
+chr2	273658	273690	b	b	-
+chr2	273658	273690	b	b	-
+chr2	273691	273723	a	a	+
+chr2	273659	273691	b	b	-
+chr2	273692	273724	a	a	+
+chr2	273694	273726	a	a	+
+chr2	273662	273694	b	b	-
+chr2	273663	273695	b	b	-
+chr2	273663	273695	b	b	-
+chr2	273668	273700	b	b	-
+chr2	273701	273733	a	a	+
+chr2	273702	273734	a	a	+
+chr2	273702	273734	a	a	+
+chr2	273702	273734	a	a	+
+chr2	273702	273734	a	a	+
+chr2	273702	273734	a	a	+
+chr2	273671	273703	b	b	-
+chr2	273672	273704	b	b	-
+chr2	273676	273708	b	b	-
+chr2	273711	273743	a	a	+
+chr2	273711	273743	a	a	+
+chr2	273711	273743	a	a	+
+chr2	273683	273715	b	b	-
+chr2	273683	273715	b	b	-
+chr2	273683	273715	b	b	-
+chr2	273719	273751	a	a	+
+chr2	273689	273721	b	b	-
+chr2	273689	273721	b	b	-
+chr2	273722	273754	a	a	+
+chr2	273729	273761	a	a	+
+chr2	273729	273761	a	a	+
+chr2	273936	273968	b	b	-
+chr2	273957	273989	b	b	-
+chr2	274004	274036	a	a	+
+chr2	274006	274038	a	a	+
+chr2	273985	274017	b	b	-
+chr2	273987	274019	b	b	-
+chr2	274522	274554	a	a	+
+chr2	274560	274592	a	a	+
+chr2	274621	274653	a	a	+
+chr2	274681	274713	a	a	+
+chr2	274727	274759	a	a	+
+chr2	274773	274805	b	b	-
+chr2	274935	274967	b	b	-
+chr2	275024	275056	a	a	+
+chr2	275024	275056	a	a	+
+chr2	275016	275048	b	b	-
+chr2	275034	275066	b	b	-
+chr2	275106	275138	a	a	+
+chr2	275119	275151	a	a	+
+chr2	275145	275177	a	a	+
+chr2	275219	275251	a	a	+
+chr2	275191	275223	b	b	-
+chr2	275247	275279	a	a	+
+chr2	275220	275252	b	b	-
+chr2	275261	275293	a	a	+
+chr2	275274	275306	b	b	-
+chr2	275348	275380	b	b	-
+chr2	275357	275389	b	b	-
+chr2	275359	275391	b	b	-
+chr2	275394	275426	a	a	+
+chr2	275394	275426	a	a	+
+chr2	275365	275397	b	b	-
+chr2	275365	275397	b	b	-
+chr2	275365	275397	b	b	-
+chr2	275366	275398	b	b	-
+chr2	275371	275403	b	b	-
+chr2	275372	275404	b	b	-
+chr2	275406	275438	a	a	+
+chr2	275376	275408	b	b	-
+chr2	275409	275441	a	a	+
+chr2	275377	275409	b	b	-
+chr2	275418	275450	a	a	+
+chr2	275395	275427	b	b	-
+chr2	275395	275427	b	b	-
+chr2	275396	275428	b	b	-
+chr2	275398	275430	b	b	-
+chr2	275402	275434	b	b	-
+chr2	275405	275437	b	b	-
+chr2	275405	275437	b	b	-
+chr2	275438	275470	a	a	+
+chr2	275438	275470	a	a	+
+chr2	275442	275474	a	a	+
+chr2	275414	275446	b	b	-
+chr2	275414	275446	b	b	-
+chr2	275455	275487	a	a	+
+chr2	275455	275487	a	a	+
+chr2	275455	275487	a	a	+
+chr2	275534	275566	b	b	-
+chr2	275587	275619	a	a	+
+chr2	275562	275594	b	b	-
+chr2	275562	275594	b	b	-
+chr2	275575	275607	b	b	-
+chr2	275577	275609	b	b	-
+chr2	275578	275610	b	b	-
+chr2	275614	275646	a	a	+
+chr2	275595	275627	b	b	-
+chr2	275632	275664	a	a	+
+chr2	275609	275641	b	b	-
+chr2	275609	275641	b	b	-
+chr2	275621	275653	b	b	-
+chr2	275656	275688	a	a	+
+chr2	275631	275663	b	b	-
+chr2	275793	275825	b	b	-
+chr2	275828	275860	a	a	+
+chr2	275814	275846	b	b	-
+chr2	275854	275886	a	a	+
+chr2	275854	275886	a	a	+
+chr2	275855	275887	a	a	+
+chr2	275855	275887	a	a	+
+chr2	275823	275855	b	b	-
+chr2	275838	275870	b	b	-
+chr2	275902	275934	b	b	-
+chr2	275968	276000	b	b	-
+chr2	276016	276048	a	a	+
+chr2	276019	276051	a	a	+
+chr2	275989	276021	b	b	-
+chr2	276007	276039	b	b	-
+chr2	276007	276039	b	b	-
+chr2	276041	276073	a	a	+
+chr2	276043	276075	a	a	+
+chr2	276023	276055	b	b	-
+chr2	276023	276055	b	b	-
+chr2	276061	276093	a	a	+
+chr2	276166	276198	b	b	-
+chr2	276339	276371	a	a	+
+chr2	276318	276350	b	b	-
+chr2	276318	276350	b	b	-
+chr2	276458	276490	b	b	-
+chr2	276491	276523	a	a	+
+chr2	276497	276529	a	a	+
+chr2	276497	276529	a	a	+
+chr2	276475	276507	b	b	-
+chr2	276475	276507	b	b	-
+chr2	276508	276540	a	a	+
+chr2	276511	276543	a	a	+
+chr2	276514	276546	a	a	+
+chr2	276515	276547	a	a	+
+chr2	276515	276547	a	a	+
+chr2	276515	276547	a	a	+
+chr2	276488	276520	b	b	-
+chr2	276488	276520	b	b	-
+chr2	276521	276553	a	a	+
+chr2	276493	276525	b	b	-
+chr2	276527	276559	a	a	+
+chr2	276530	276562	a	a	+
+chr2	276532	276564	a	a	+
+chr2	276532	276564	a	a	+
+chr2	276536	276568	a	a	+
+chr2	276508	276540	b	b	-
+chr2	276548	276580	a	a	+
+chr2	276516	276548	b	b	-
+chr2	276525	276557	b	b	-
+chr2	276570	276602	a	a	+
+chr2	276655	276687	a	a	+
+chr2	276695	276727	a	a	+
+chr2	276733	276765	b	b	-
+chr2	276778	276810	a	a	+
+chr2	276779	276811	a	a	+
+chr2	276779	276811	a	a	+
+chr2	276756	276788	b	b	-
+chr2	276790	276822	a	a	+
+chr2	276758	276790	b	b	-
+chr2	276758	276790	b	b	-
+chr2	276796	276828	a	a	+
+chr2	276765	276797	b	b	-
+chr2	276765	276797	b	b	-
+chr2	276770	276802	b	b	-
+chr2	276770	276802	b	b	-
+chr2	276770	276802	b	b	-
+chr2	276770	276802	b	b	-
+chr2	276770	276802	b	b	-
+chr2	276770	276802	b	b	-
+chr2	276771	276803	b	b	-
+chr2	276771	276803	b	b	-
+chr2	276805	276837	a	a	+
+chr2	276805	276837	a	a	+
+chr2	276773	276805	b	b	-
+chr2	276773	276805	b	b	-
+chr2	276773	276805	b	b	-
+chr2	276775	276807	b	b	-
+chr2	276775	276807	b	b	-
+chr2	276775	276807	b	b	-
+chr2	276776	276808	b	b	-
+chr2	276776	276808	b	b	-
+chr2	276776	276808	b	b	-
+chr2	276777	276809	b	b	-
+chr2	276777	276809	b	b	-
+chr2	276811	276843	a	a	+
+chr2	276812	276844	a	a	+
+chr2	276812	276844	a	a	+
+chr2	276814	276846	a	a	+
+chr2	276816	276848	a	a	+
+chr2	276816	276848	a	a	+
+chr2	276819	276851	a	a	+
+chr2	276820	276852	a	a	+
+chr2	276820	276852	a	a	+
+chr2	276788	276820	b	b	-
+chr2	276821	276853	a	a	+
+chr2	276821	276853	a	a	+
+chr2	276789	276821	b	b	-
+chr2	276789	276821	b	b	-
+chr2	276789	276821	b	b	-
+chr2	276791	276823	b	b	-
+chr2	276828	276860	a	a	+
+chr2	276832	276864	a	a	+
+chr2	276832	276864	a	a	+
+chr2	276833	276865	a	a	+
+chr2	276833	276865	a	a	+
+chr2	276801	276833	b	b	-
+chr2	276801	276833	b	b	-
+chr2	276802	276834	b	b	-
+chr2	276808	276840	b	b	-
+chr2	276812	276844	b	b	-
+chr2	276812	276844	b	b	-
+chr2	276860	276892	a	a	+
+chr2	276925	276957	b	b	-
+chr2	276963	276995	a	a	+
+chr2	276945	276977	b	b	-
+chr2	276945	276977	b	b	-
+chr2	276995	277027	a	a	+
+chr2	277077	277109	b	b	-
+chr2	277137	277169	a	a	+
+chr2	277138	277170	a	a	+
+chr2	277162	277194	a	a	+
+chr2	277163	277195	a	a	+
+chr2	277142	277174	b	b	-
+chr2	277257	277289	b	b	-
+chr2	277307	277339	a	a	+
+chr2	277323	277355	a	a	+
+chr2	277336	277368	b	b	-
+chr2	277375	277407	a	a	+
+chr2	277557	277589	a	a	+
+chr2	277727	277759	b	b	-
+chr2	277727	277759	b	b	-
+chr2	277906	277938	a	a	+
+chr2	277993	278025	a	a	+
+chr2	278136	278168	b	b	-
+chr2	278757	278789	b	b	-
+chr2	278759	278791	b	b	-
+chr2	278759	278791	b	b	-
+chr2	278759	278791	b	b	-
+chr2	278760	278792	b	b	-
+chr2	278798	278830	a	a	+
+chr2	278799	278831	a	a	+
+chr2	278768	278800	b	b	-
+chr2	278768	278800	b	b	-
+chr2	278768	278800	b	b	-
+chr2	278769	278801	b	b	-
+chr2	278769	278801	b	b	-
+chr2	279464	279496	b	b	-
+chr2	279531	279563	a	a	+
+chr2	279605	279637	b	b	-
+chr2	279671	279703	a	a	+
+chr2	279825	279857	b	b	-
+chr2	279828	279860	b	b	-
+chr2	279857	279889	b	b	-
+chr2	280200	280232	b	b	-
+chr2	280200	280232	b	b	-
+chr2	280200	280232	b	b	-
+chr2	280200	280232	b	b	-
+chr2	280462	280494	b	b	-
+chr2	280476	280508	b	b	-
+chr2	280489	280521	b	b	-
+chr2	280489	280521	b	b	-
+chr2	280801	280833	b	b	-
+chr2	280855	280887	a	a	+
+chr2	280858	280890	a	a	+
+chr2	280838	280870	b	b	-
+chr2	280871	280903	a	a	+
+chr2	280872	280904	a	a	+
+chr2	280840	280872	b	b	-
+chr2	280883	280915	a	a	+
+chr2	280859	280891	b	b	-
+chr2	280862	280894	b	b	-
+chr2	281334	281366	a	a	+
+chr2	281339	281371	a	a	+
+chr2	281316	281348	b	b	-
+chr2	281324	281356	b	b	-
+chr2	281471	281503	a	a	+
+chr2	281448	281480	b	b	-
+chr2	281652	281684	b	b	-
+chr2	281689	281721	a	a	+
+chr2	281816	281848	a	a	+
+chr2	281846	281878	a	a	+
+chr2	281870	281902	a	a	+
+chr2	281871	281903	a	a	+
+chr2	281971	282003	a	a	+
+chr2	281971	282003	a	a	+
+chr2	281979	282011	b	b	-
+chr2	282062	282094	a	a	+
+chr2	282113	282145	b	b	-
+chr2	282125	282157	b	b	-
+chr2	282165	282197	a	a	+
+chr2	282140	282172	b	b	-
+chr2	282196	282228	a	a	+
+chr2	282174	282206	b	b	-
+chr2	282281	282313	b	b	-
+chr2	282281	282313	b	b	-
+chr2	282328	282360	a	a	+
+chr2	282400	282432	a	a	+
+chr2	282450	282482	b	b	-
+chr2	282542	282574	b	b	-
+chr2	282585	282617	b	b	-
+chr2	282666	282698	b	b	-
+chr2	282701	282733	b	b	-
+chr2	282748	282780	a	a	+
+chr2	282748	282780	a	a	+
+chr2	282936	282968	a	a	+
+chr2	283059	283091	b	b	-
+chr2	283301	283333	a	a	+
+chr2	283276	283308	b	b	-
+chr2	283285	283317	b	b	-
+chr2	283436	283468	b	b	-
+chr2	283449	283481	b	b	-
+chr2	283466	283498	b	b	-
+chr2	283587	283619	b	b	-
+chr2	283589	283621	b	b	-
+chr2	283628	283660	a	a	+
+chr2	283608	283640	b	b	-
+chr2	283663	283695	b	b	-
+chr2	283697	283729	a	a	+
+chr2	283666	283698	b	b	-
+chr2	283680	283712	b	b	-
+chr2	283681	283713	b	b	-
+chr2	283681	283713	b	b	-
+chr2	283725	283757	a	a	+
+chr2	283700	283732	b	b	-
+chr2	283700	283732	b	b	-
+chr2	283731	283763	b	b	-
+chr2	283752	283784	b	b	-
+chr2	283759	283791	b	b	-
+chr2	283775	283807	b	b	-
+chr2	283777	283809	b	b	-
+chr2	283778	283810	b	b	-
+chr2	283812	283844	a	a	+
+chr2	283814	283846	a	a	+
+chr2	283796	283828	b	b	-
+chr2	283801	283833	b	b	-
+chr2	283810	283842	b	b	-
+chr2	283861	283893	a	a	+
+chr2	283863	283895	a	a	+
+chr2	283831	283863	b	b	-
+chr2	283876	283908	a	a	+
+chr2	283880	283912	a	a	+
+chr2	283880	283912	a	a	+
+chr2	283854	283886	b	b	-
+chr2	283889	283921	a	a	+
+chr2	283857	283889	b	b	-
+chr2	283864	283896	b	b	-
+chr2	283906	283938	a	a	+
+chr2	283885	283917	b	b	-
+chr2	283885	283917	b	b	-
+chr2	283922	283954	a	a	+
+chr2	283916	283948	b	b	-
+chr2	284069	284101	b	b	-
+chr2	284111	284143	a	a	+
+chr2	284084	284116	b	b	-
+chr2	284119	284151	a	a	+
+chr2	284120	284152	b	b	-
+chr2	284145	284177	b	b	-
+chr2	284183	284215	a	a	+
+chr2	284214	284246	a	a	+
+chr2	284504	284536	a	a	+
+chr2	284700	284732	a	a	+
+chr2	284987	285019	a	a	+
+chr2	285167	285199	a	a	+
+chr2	285283	285315	a	a	+
+chr2	285283	285315	a	a	+
+chr2	285370	285402	b	b	-
+chr2	285643	285675	a	a	+
+chr2	285747	285779	a	a	+
+chr2	285880	285912	a	a	+
+chr2	285880	285912	a	a	+
+chr2	286123	286155	b	b	-
+chr2	286265	286297	a	a	+
+chr2	286879	286911	b	b	-
+chr2	287123	287155	a	a	+
+chr2	287355	287387	a	a	+
+chr2	287460	287492	b	b	-
+chr2	287536	287568	a	a	+
+chr2	287647	287679	a	a	+
+chr2	287651	287683	a	a	+
+chr2	287659	287691	b	b	-
+chr2	287661	287693	b	b	-
+chr2	287668	287700	b	b	-
+chr2	287790	287822	b	b	-
+chr2	287800	287832	b	b	-
+chr2	287851	287883	a	a	+
+chr2	287819	287851	b	b	-
+chr2	287820	287852	b	b	-
+chr2	287824	287856	b	b	-
+chr2	287824	287856	b	b	-
+chr2	287864	287896	a	a	+
+chr2	287865	287897	a	a	+
+chr2	287865	287897	a	a	+
+chr2	287865	287897	a	a	+
+chr2	287866	287898	a	a	+
+chr2	287877	287909	a	a	+
+chr2	287864	287896	b	b	-
+chr2	287975	288007	b	b	-
+chr2	287978	288010	b	b	-
+chr2	287978	288010	b	b	-
+chr2	287978	288010	b	b	-
+chr2	288013	288045	a	a	+
+chr2	287984	288016	b	b	-
+chr2	287984	288016	b	b	-
+chr2	287985	288017	b	b	-
+chr2	287985	288017	b	b	-
+chr2	287990	288022	b	b	-
+chr2	287990	288022	b	b	-
+chr2	288024	288056	a	a	+
+chr2	288024	288056	a	a	+
+chr2	288024	288056	a	a	+
+chr2	288025	288057	a	a	+
+chr2	288025	288057	a	a	+
+chr2	288027	288059	a	a	+
+chr2	288027	288059	a	a	+
+chr2	288027	288059	a	a	+
+chr2	288027	288059	a	a	+
+chr2	288027	288059	a	a	+
+chr2	288029	288061	a	a	+
+chr2	288029	288061	a	a	+
+chr2	288037	288069	a	a	+
+chr2	288037	288069	a	a	+
+chr2	288037	288069	a	a	+
+chr2	288005	288037	b	b	-
+chr2	288006	288038	b	b	-
+chr2	288010	288042	b	b	-
+chr2	288016	288048	b	b	-
+chr2	288016	288048	b	b	-
+chr2	288054	288086	a	a	+
+chr2	288022	288054	b	b	-
+chr2	288233	288265	b	b	-
+chr2	288249	288281	b	b	-
+chr2	288249	288281	b	b	-
+chr2	288250	288282	b	b	-
+chr2	288250	288282	b	b	-
+chr2	288287	288319	a	a	+
+chr2	288287	288319	a	a	+
+chr2	288287	288319	a	a	+
+chr2	288287	288319	a	a	+
+chr2	288289	288321	a	a	+
+chr2	288265	288297	b	b	-
+chr2	288299	288331	a	a	+
+chr2	288300	288332	a	a	+
+chr2	288300	288332	a	a	+
+chr2	288313	288345	a	a	+
+chr2	288313	288345	a	a	+
+chr2	288317	288349	a	a	+
+chr2	288317	288349	a	a	+
+chr2	288285	288317	b	b	-
+chr2	288285	288317	b	b	-
+chr2	288285	288317	b	b	-
+chr2	288286	288318	b	b	-
+chr2	288319	288351	a	a	+
+chr2	288319	288351	a	a	+
+chr2	288320	288352	a	a	+
+chr2	288324	288356	a	a	+
+chr2	288294	288326	b	b	-
+chr2	288307	288339	b	b	-
+chr2	288308	288340	b	b	-
+chr2	288308	288340	b	b	-
+chr2	288344	288376	a	a	+
+chr2	288434	288466	a	a	+
+chr2	288439	288471	a	a	+
+chr2	288439	288471	a	a	+
+chr2	288453	288485	a	a	+
+chr2	288453	288485	a	a	+
+chr2	288425	288457	b	b	-
+chr2	288425	288457	b	b	-
+chr2	288469	288501	a	a	+
+chr2	288474	288506	a	a	+
+chr2	288457	288489	b	b	-
+chr2	288466	288498	b	b	-
+chr2	288504	288536	a	a	+
+chr2	288567	288599	a	a	+
+chr2	288640	288672	b	b	-
+chr2	288679	288711	a	a	+
+chr2	288679	288711	a	a	+
+chr2	288681	288713	a	a	+
+chr2	288681	288713	a	a	+
+chr2	288651	288683	b	b	-
+chr2	288666	288698	b	b	-
+chr2	288668	288700	b	b	-
+chr2	288722	288754	a	a	+
+chr2	288810	288842	a	a	+
+chr2	288836	288868	a	a	+
+chr2	288825	288857	b	b	-
+chr2	288867	288899	a	a	+
+chr2	288856	288888	b	b	-
+chr2	288976	289008	a	a	+
+chr2	288989	289021	a	a	+
+chr2	288994	289026	a	a	+
+chr2	289004	289036	b	b	-
+chr2	289085	289117	a	a	+
+chr2	289061	289093	b	b	-
+chr2	289108	289140	a	a	+
+chr2	289109	289141	a	a	+
+chr2	289077	289109	b	b	-
+chr2	289077	289109	b	b	-
+chr2	289083	289115	b	b	-
+chr2	289086	289118	b	b	-
+chr2	289087	289119	b	b	-
+chr2	289090	289122	b	b	-
+chr2	289095	289127	b	b	-
+chr2	289129	289161	a	a	+
+chr2	289129	289161	a	a	+
+chr2	289129	289161	a	a	+
+chr2	289129	289161	a	a	+
+chr2	289130	289162	a	a	+
+chr2	289130	289162	a	a	+
+chr2	289130	289162	a	a	+
+chr2	289130	289162	a	a	+
+chr2	289131	289163	a	a	+
+chr2	289131	289163	a	a	+
+chr2	289131	289163	a	a	+
+chr2	289131	289163	a	a	+
+chr2	289131	289163	a	a	+
+chr2	289132	289164	a	a	+
+chr2	289105	289137	b	b	-
+chr2	289105	289137	b	b	-
+chr2	289105	289137	b	b	-
+chr2	289105	289137	b	b	-
+chr2	289105	289137	b	b	-
+chr2	289105	289137	b	b	-
+chr2	289105	289137	b	b	-
+chr2	289105	289137	b	b	-
+chr2	289138	289170	a	a	+
+chr2	289138	289170	a	a	+
+chr2	289106	289138	b	b	-
+chr2	289106	289138	b	b	-
+chr2	289107	289139	b	b	-
+chr2	289141	289173	a	a	+
+chr2	289109	289141	b	b	-
+chr2	289109	289141	b	b	-
+chr2	289110	289142	b	b	-
+chr2	289114	289146	b	b	-
+chr2	289147	289179	a	a	+
+chr2	289148	289180	a	a	+
+chr2	289116	289148	b	b	-
+chr2	289117	289149	b	b	-
+chr2	289117	289149	b	b	-
+chr2	289117	289149	b	b	-
+chr2	289117	289149	b	b	-
+chr2	289150	289182	a	a	+
+chr2	289150	289182	a	a	+
+chr2	289151	289183	a	a	+
+chr2	289120	289152	b	b	-
+chr2	289153	289185	a	a	+
+chr2	289153	289185	a	a	+
+chr2	289153	289185	a	a	+
+chr2	289153	289185	a	a	+
+chr2	289154	289186	a	a	+
+chr2	289154	289186	a	a	+
+chr2	289154	289186	a	a	+
+chr2	289154	289186	a	a	+
+chr2	289154	289186	a	a	+
+chr2	289154	289186	a	a	+
+chr2	289154	289186	a	a	+
+chr2	289154	289186	a	a	+
+chr2	289154	289186	a	a	+
+chr2	289123	289155	b	b	-
+chr2	289123	289155	b	b	-
+chr2	289123	289155	b	b	-
+chr2	289123	289155	b	b	-
+chr2	289123	289155	b	b	-
+chr2	289123	289155	b	b	-
+chr2	289123	289155	b	b	-
+chr2	289124	289156	b	b	-
+chr2	289157	289189	a	a	+
+chr2	289128	289160	b	b	-
+chr2	289128	289160	b	b	-
+chr2	289128	289160	b	b	-
+chr2	289128	289160	b	b	-
+chr2	289128	289160	b	b	-
+chr2	289128	289160	b	b	-
+chr2	289128	289160	b	b	-
+chr2	289128	289160	b	b	-
+chr2	289129	289161	b	b	-
+chr2	289129	289161	b	b	-
+chr2	289130	289162	b	b	-
+chr2	289130	289162	b	b	-
+chr2	289133	289165	b	b	-
+chr2	289166	289198	a	a	+
+chr2	289162	289194	b	b	-
+chr2	289162	289194	b	b	-
+chr2	289165	289197	b	b	-
+chr2	289332	289364	b	b	-
+chr2	289336	289368	b	b	-
+chr2	289336	289368	b	b	-
+chr2	289337	289369	b	b	-
+chr2	289337	289369	b	b	-
+chr2	289337	289369	b	b	-
+chr2	289337	289369	b	b	-
+chr2	289373	289405	a	a	+
+chr2	289343	289375	b	b	-
+chr2	289378	289410	a	a	+
+chr2	289346	289378	b	b	-
+chr2	289346	289378	b	b	-
+chr2	289346	289378	b	b	-
+chr2	289346	289378	b	b	-
+chr2	289346	289378	b	b	-
+chr2	289380	289412	a	a	+
+chr2	289380	289412	a	a	+
+chr2	289381	289413	a	a	+
+chr2	289381	289413	a	a	+
+chr2	289381	289413	a	a	+
+chr2	289381	289413	a	a	+
+chr2	289357	289389	b	b	-
+chr2	289357	289389	b	b	-
+chr2	289358	289390	b	b	-
+chr2	289359	289391	b	b	-
+chr2	289361	289393	b	b	-
+chr2	289366	289398	b	b	-
+chr2	289401	289433	a	a	+
+chr2	289372	289404	b	b	-
+chr2	289377	289409	b	b	-
+chr2	289377	289409	b	b	-
+chr2	289377	289409	b	b	-
+chr2	289426	289458	a	a	+
+chr2	289426	289458	a	a	+
+chr2	289518	289550	b	b	-
+chr2	289556	289588	a	a	+
+chr2	289524	289556	b	b	-
+chr2	289524	289556	b	b	-
+chr2	289560	289592	a	a	+
+chr2	289528	289560	b	b	-
+chr2	289562	289594	a	a	+
+chr2	289562	289594	a	a	+
+chr2	289565	289597	a	a	+
+chr2	289534	289566	b	b	-
+chr2	289534	289566	b	b	-
+chr2	289538	289570	b	b	-
+chr2	289546	289578	b	b	-
+chr2	289583	289615	a	a	+
+chr2	289574	289606	b	b	-
+chr2	289577	289609	b	b	-
+chr2	289676	289708	b	b	-
+chr2	289712	289744	a	a	+
+chr2	289780	289812	a	a	+
+chr2	289829	289861	b	b	-
+chr2	289839	289871	b	b	-
+chr2	289845	289877	b	b	-
+chr2	289880	289912	a	a	+
+chr2	289871	289903	b	b	-
+chr2	289938	289970	b	b	-
+chr2	289994	290026	a	a	+
+chr2	290031	290063	a	a	+
+chr2	290001	290033	b	b	-
+chr2	290042	290074	a	a	+
+chr2	290026	290058	b	b	-
+chr2	290080	290112	a	a	+
+chr2	290101	290133	b	b	-
+chr2	290135	290167	b	b	-
+chr2	290135	290167	b	b	-
+chr2	290146	290178	b	b	-
+chr2	290158	290190	b	b	-
+chr2	290191	290223	a	a	+
+chr2	290159	290191	b	b	-
+chr2	290167	290199	b	b	-
+chr2	290202	290234	a	a	+
+chr2	290173	290205	b	b	-
+chr2	290208	290240	a	a	+
+chr2	290219	290251	a	a	+
+chr2	290224	290256	a	a	+
+chr2	290208	290240	b	b	-
+chr2	290208	290240	b	b	-
+chr2	290209	290241	b	b	-
+chr2	290209	290241	b	b	-
+chr2	290259	290291	a	a	+
+chr2	290258	290290	b	b	-
+chr2	290258	290290	b	b	-
+chr2	290292	290324	a	a	+
+chr2	290292	290324	a	a	+
+chr2	290294	290326	a	a	+
+chr2	290268	290300	b	b	-
+chr2	290277	290309	b	b	-
+chr2	290310	290342	a	a	+
+chr2	290538	290570	b	b	-
+chr2	290581	290613	a	a	+
+chr2	290581	290613	a	a	+
+chr2	290718	290750	a	a	+
+chr2	290759	290791	a	a	+
+chr2	290842	290874	b	b	-
+chr2	291025	291057	a	a	+
+chr2	291375	291407	b	b	-
+chr2	291399	291431	b	b	-
+chr2	291525	291557	b	b	-
+chr2	291543	291575	b	b	-
+chr2	291569	291601	b	b	-
+chr2	291946	291978	b	b	-
+chr2	292206	292238	a	a	+
+chr2	292238	292270	a	a	+
+chr2	292238	292270	a	a	+
+chr2	292229	292261	b	b	-
+chr2	292232	292264	b	b	-
+chr2	292269	292301	a	a	+
+chr2	292239	292271	b	b	-
+chr2	292245	292277	b	b	-
+chr2	292247	292279	b	b	-
+chr2	292288	292320	a	a	+
+chr2	292316	292348	a	a	+
+chr2	292328	292360	a	a	+
+chr2	292491	292523	a	a	+
+chr2	292474	292506	b	b	-
+chr2	292508	292540	a	a	+
+chr2	292516	292548	a	a	+
+chr2	292516	292548	a	a	+
+chr2	292488	292520	b	b	-
+chr2	292489	292521	b	b	-
+chr2	292526	292558	a	a	+
+chr2	292494	292526	b	b	-
+chr2	292494	292526	b	b	-
+chr2	292527	292559	a	a	+
+chr2	292527	292559	a	a	+
+chr2	292527	292559	a	a	+
+chr2	292527	292559	a	a	+
+chr2	292504	292536	b	b	-
+chr2	292504	292536	b	b	-
+chr2	292504	292536	b	b	-
+chr2	292538	292570	a	a	+
+chr2	292538	292570	a	a	+
+chr2	292538	292570	a	a	+
+chr2	292538	292570	a	a	+
+chr2	292543	292575	a	a	+
+chr2	292544	292576	a	a	+
+chr2	292544	292576	a	a	+
+chr2	292544	292576	a	a	+
+chr2	292544	292576	a	a	+
+chr2	292544	292576	a	a	+
+chr2	292515	292547	b	b	-
+chr2	292516	292548	b	b	-
+chr2	292564	292596	a	a	+
+chr2	292650	292682	b	b	-
+chr2	292654	292686	b	b	-
+chr2	292665	292697	b	b	-
+chr2	292665	292697	b	b	-
+chr2	292666	292698	b	b	-
+chr2	292668	292700	b	b	-
+chr2	292672	292704	b	b	-
+chr2	292711	292743	a	a	+
+chr2	292712	292744	a	a	+
+chr2	292765	292797	a	a	+
+chr2	292789	292821	a	a	+
+chr2	292832	292864	b	b	-
+chr2	292971	293003	a	a	+
+chr2	293022	293054	b	b	-
+chr2	293105	293137	a	a	+
+chr2	293105	293137	a	a	+
+chr2	293160	293192	b	b	-
+chr2	293409	293441	b	b	-
+chr2	293543	293575	b	b	-
+chr2	293668	293700	b	b	-
+chr2	293704	293736	a	a	+
+chr2	293674	293706	b	b	-
+chr2	293712	293744	a	a	+
+chr2	293719	293751	a	a	+
+chr2	293719	293751	a	a	+
+chr2	293719	293751	a	a	+
+chr2	293752	293784	b	b	-
+chr2	293818	293850	b	b	-
+chr2	293878	293910	a	a	+
+chr2	293998	294030	a	a	+
+chr2	294010	294042	a	a	+
+chr2	294010	294042	a	a	+
+chr2	294010	294042	a	a	+
+chr2	294015	294047	a	a	+
+chr2	294015	294047	a	a	+
+chr2	293983	294015	b	b	-
+chr2	294020	294052	a	a	+
+chr2	293989	294021	b	b	-
+chr2	294023	294055	a	a	+
+chr2	294025	294057	a	a	+
+chr2	293997	294029	b	b	-
+chr2	293999	294031	b	b	-
+chr2	294000	294032	b	b	-
+chr2	294000	294032	b	b	-
+chr2	294001	294033	b	b	-
+chr2	294034	294066	a	a	+
+chr2	294035	294067	a	a	+
+chr2	294013	294045	b	b	-
+chr2	294054	294086	a	a	+
+chr2	294031	294063	b	b	-
+chr2	294033	294065	b	b	-
+chr2	294042	294074	b	b	-
+chr2	294050	294082	b	b	-
+chr2	294051	294083	b	b	-
+chr2	294058	294090	b	b	-
+chr2	294058	294090	b	b	-
+chr2	294058	294090	b	b	-
+chr2	294084	294116	b	b	-
+chr2	294141	294173	a	a	+
+chr2	294220	294252	a	a	+
+chr2	294418	294450	b	b	-
+chr2	294456	294488	a	a	+
+chr2	294473	294505	a	a	+
+chr2	294473	294505	a	a	+
+chr2	294557	294589	b	b	-
+chr2	294634	294666	a	a	+
+chr2	294761	294793	b	b	-
+chr2	295119	295151	a	a	+
+chr2	295416	295448	a	a	+
+chr2	295551	295583	b	b	-
+chr2	295699	295731	a	a	+
+chr2	295821	295853	b	b	-
+chr2	295822	295854	b	b	-
+chr2	295822	295854	b	b	-
+chr2	295859	295891	a	a	+
+chr2	295829	295861	b	b	-
+chr2	295832	295864	b	b	-
+chr2	295869	295901	a	a	+
+chr2	295871	295903	a	a	+
+chr2	295842	295874	b	b	-
+chr2	295889	295921	a	a	+
+chr2	295926	295958	b	b	-
+chr2	295937	295969	b	b	-
+chr2	295975	296007	b	b	-
+chr2	295976	296008	b	b	-
+chr2	295978	296010	b	b	-
+chr2	295979	296011	b	b	-
+chr2	296012	296044	a	a	+
+chr2	295981	296013	b	b	-
+chr2	296015	296047	a	a	+
+chr2	296015	296047	a	a	+
+chr2	295983	296015	b	b	-
+chr2	295985	296017	b	b	-
+chr2	295985	296017	b	b	-
+chr2	296019	296051	a	a	+
+chr2	296021	296053	a	a	+
+chr2	296023	296055	a	a	+
+chr2	296028	296060	a	a	+
+chr2	296029	296061	a	a	+
+chr2	296029	296061	a	a	+
+chr2	296029	296061	a	a	+
+chr2	296029	296061	a	a	+
+chr2	296029	296061	a	a	+
+chr2	296029	296061	a	a	+
+chr2	296002	296034	b	b	-
+chr2	296004	296036	b	b	-
+chr2	296010	296042	b	b	-
+chr2	296047	296079	a	a	+
+chr2	296016	296048	b	b	-
+chr2	296017	296049	b	b	-
+chr2	296061	296093	a	a	+
+chr2	296037	296069	b	b	-
+chr2	296038	296070	b	b	-
+chr2	296039	296071	b	b	-
+chr2	296078	296110	a	a	+
+chr2	296078	296110	a	a	+
+chr2	296052	296084	b	b	-
+chr2	296533	296565	a	a	+
+chr2	296728	296760	b	b	-
+chr2	296937	296969	a	a	+
+chr2	297311	297343	a	a	+
+chr2	297455	297487	a	a	+
+chr2	297606	297638	a	a	+
+chr2	297609	297641	a	a	+
+chr2	297611	297643	a	a	+
+chr2	297616	297648	a	a	+
+chr2	297590	297622	b	b	-
+chr2	297634	297666	a	a	+
+chr2	297612	297644	b	b	-
+chr2	297692	297724	b	b	-
+chr2	297730	297762	b	b	-
+chr2	297769	297801	a	a	+
+chr2	297770	297802	a	a	+
+chr2	297772	297804	a	a	+
+chr2	297740	297772	b	b	-
+chr2	297782	297814	a	a	+
+chr2	297750	297782	b	b	-
+chr2	297750	297782	b	b	-
+chr2	297783	297815	a	a	+
+chr2	297787	297819	a	a	+
+chr2	297761	297793	b	b	-
+chr2	297761	297793	b	b	-
+chr2	297761	297793	b	b	-
+chr2	297797	297829	a	a	+
+chr2	297797	297829	a	a	+
+chr2	297765	297797	b	b	-
+chr2	297765	297797	b	b	-
+chr2	297765	297797	b	b	-
+chr2	297801	297833	a	a	+
+chr2	297801	297833	a	a	+
+chr2	297805	297837	a	a	+
+chr2	297846	297878	a	a	+
+chr2	297872	297904	a	a	+
+chr2	297959	297991	b	b	-
+chr2	298021	298053	a	a	+
+chr2	298025	298057	a	a	+
+chr2	297996	298028	b	b	-
+chr2	297999	298031	b	b	-
+chr2	297999	298031	b	b	-
+chr2	298032	298064	a	a	+
+chr2	298037	298069	a	a	+
+chr2	298056	298088	a	a	+
+chr2	298056	298088	a	a	+
+chr2	298056	298088	a	a	+
+chr2	298060	298092	a	a	+
+chr2	298031	298063	b	b	-
+chr2	298031	298063	b	b	-
+chr2	298032	298064	b	b	-
+chr2	298069	298101	a	a	+
+chr2	298039	298071	b	b	-
+chr2	298043	298075	b	b	-
+chr2	298094	298126	a	a	+
+chr2	298062	298094	b	b	-
+chr2	298062	298094	b	b	-
+chr2	298095	298127	a	a	+
+chr2	298118	298150	a	a	+
+chr2	298215	298247	b	b	-
+chr2	298248	298280	a	a	+
+chr2	298226	298258	b	b	-
+chr2	298226	298258	b	b	-
+chr2	298229	298261	b	b	-
+chr2	298229	298261	b	b	-
+chr2	298238	298270	b	b	-
+chr2	298278	298310	a	a	+
+chr2	298278	298310	a	a	+
+chr2	298278	298310	a	a	+
+chr2	298278	298310	a	a	+
+chr2	298253	298285	b	b	-
+chr2	298254	298286	b	b	-
+chr2	298292	298324	a	a	+
+chr2	298260	298292	b	b	-
+chr2	298308	298340	a	a	+
+chr2	298384	298416	a	a	+
+chr2	298400	298432	b	b	-
+chr2	298454	298486	a	a	+
+chr2	298454	298486	a	a	+
+chr2	298457	298489	a	a	+
+chr2	298462	298494	a	a	+
+chr2	298731	298763	a	a	+
+chr2	298731	298763	a	a	+
+chr2	298702	298734	b	b	-
+chr2	298720	298752	b	b	-
+chr2	299075	299107	b	b	-
+chr2	299075	299107	b	b	-
+chr2	299169	299201	b	b	-
+chr2	299169	299201	b	b	-
+chr2	299340	299372	b	b	-
+chr2	299499	299531	b	b	-
+chr2	299534	299566	a	a	+
+chr2	299502	299534	b	b	-
+chr2	299502	299534	b	b	-
+chr2	299624	299656	a	a	+
+chr2	299606	299638	b	b	-
+chr2	299626	299658	b	b	-
+chr2	299808	299840	b	b	-
+chr2	299808	299840	b	b	-
+chr2	299808	299840	b	b	-
+chr2	299848	299880	a	a	+
+chr2	299848	299880	a	a	+
+chr2	299848	299880	a	a	+
+chr2	299848	299880	a	a	+
+chr2	299849	299881	a	a	+
+chr2	299849	299881	a	a	+
+chr2	299850	299882	a	a	+
+chr2	299819	299851	b	b	-
+chr2	299854	299886	a	a	+
+chr2	299856	299888	a	a	+
+chr2	299856	299888	a	a	+
+chr2	299825	299857	b	b	-
+chr2	299827	299859	b	b	-
+chr2	299831	299863	b	b	-
+chr2	299831	299863	b	b	-
+chr2	299831	299863	b	b	-
+chr2	299864	299896	a	a	+
+chr2	299838	299870	b	b	-
+chr2	299838	299870	b	b	-
+chr2	299838	299870	b	b	-
+chr2	299871	299903	a	a	+
+chr2	299839	299871	b	b	-
+chr2	299839	299871	b	b	-
+chr2	299839	299871	b	b	-
+chr2	299843	299875	b	b	-
+chr2	299843	299875	b	b	-
+chr2	299844	299876	b	b	-
+chr2	299845	299877	b	b	-
+chr2	299884	299916	a	a	+
+chr2	300152	300184	a	a	+
+chr2	300123	300155	b	b	-
+chr2	300160	300192	a	a	+
+chr2	300160	300192	a	a	+
+chr2	300160	300192	a	a	+
+chr2	300164	300196	a	a	+
+chr2	300165	300197	a	a	+
+chr2	300137	300169	b	b	-
+chr2	300137	300169	b	b	-
+chr2	300147	300179	b	b	-
+chr2	300147	300179	b	b	-
+chr2	300147	300179	b	b	-
+chr2	300147	300179	b	b	-
+chr2	300147	300179	b	b	-
+chr2	300147	300179	b	b	-
+chr2	300147	300179	b	b	-
+chr2	300147	300179	b	b	-
+chr2	300147	300179	b	b	-
+chr2	300183	300215	a	a	+
+chr2	300236	300268	b	b	-
+chr2	300236	300268	b	b	-
+chr2	300285	300317	b	b	-
+chr2	300285	300317	b	b	-
+chr2	300304	300336	b	b	-
+chr2	300318	300350	b	b	-
+chr2	300387	300419	b	b	-
+chr2	300498	300530	a	a	+
+chr2	300485	300517	b	b	-
+chr2	300485	300517	b	b	-
+chr2	300660	300692	b	b	-
+chr2	300824	300856	a	a	+
+chr2	300938	300970	b	b	-
+chr2	301077	301109	b	b	-
+chr2	301532	301564	a	a	+
+chr2	301507	301539	b	b	-
+chr2	301520	301552	b	b	-
+chr2	301531	301563	b	b	-
+chr2	301558	301590	b	b	-
+chr2	301815	301847	a	a	+
+chr2	301787	301819	b	b	-
+chr2	301828	301860	a	a	+
+chr2	301832	301864	a	a	+
+chr2	301801	301833	b	b	-
+chr2	301837	301869	a	a	+
+chr2	301838	301870	a	a	+
+chr2	301839	301871	a	a	+
+chr2	301839	301871	a	a	+
+chr2	301808	301840	b	b	-
+chr2	301808	301840	b	b	-
+chr2	301808	301840	b	b	-
+chr2	301808	301840	b	b	-
+chr2	301808	301840	b	b	-
+chr2	301808	301840	b	b	-
+chr2	301849	301881	a	a	+
+chr2	301849	301881	a	a	+
+chr2	301819	301851	b	b	-
+chr2	301932	301964	a	a	+
+chr2	302018	302050	a	a	+
+chr2	301986	302018	b	b	-
+chr2	301986	302018	b	b	-
+chr2	301989	302021	b	b	-
+chr2	302012	302044	b	b	-
+chr2	302129	302161	b	b	-
+chr2	302144	302176	b	b	-
+chr2	302206	302238	a	a	+
+chr2	302281	302313	a	a	+
+chr2	302317	302349	b	b	-
+chr2	302355	302387	a	a	+
+chr2	302358	302390	a	a	+
+chr2	302518	302550	b	b	-
+chr2	302722	302754	a	a	+
+chr2	302879	302911	b	b	-
+chr2	302929	302961	b	b	-
+chr2	302971	303003	b	b	-
+chr2	303006	303038	a	a	+
+chr2	303032	303064	b	b	-
+chr2	303272	303304	b	b	-
+chr2	303594	303626	a	a	+
+chr2	303599	303631	a	a	+
+chr2	303595	303627	b	b	-
+chr2	303635	303667	a	a	+
+chr2	303656	303688	b	b	-
+chr2	303802	303834	b	b	-
+chr2	303840	303872	b	b	-
+chr2	303876	303908	a	a	+
+chr2	303883	303915	a	a	+
+chr2	303851	303883	b	b	-
+chr2	303891	303923	a	a	+
+chr2	303893	303925	a	a	+
+chr2	303893	303925	a	a	+
+chr2	303871	303903	b	b	-
+chr2	304019	304051	a	a	+
+chr2	304055	304087	a	a	+
+chr2	304059	304091	a	a	+
+chr2	304068	304100	a	a	+
+chr2	304087	304119	a	a	+
+chr2	304127	304159	b	b	-
+chr2	304209	304241	b	b	-
+chr2	304238	304270	b	b	-
+chr2	304243	304275	b	b	-
+chr2	304280	304312	b	b	-
+chr2	304330	304362	b	b	-
+chr2	304398	304430	a	a	+
+chr2	304430	304462	a	a	+
+chr2	304398	304430	b	b	-
+chr2	304398	304430	b	b	-
+chr2	304402	304434	b	b	-
+chr2	304447	304479	a	a	+
+chr2	304464	304496	a	a	+
+chr2	304464	304496	a	a	+
+chr2	304464	304496	a	a	+
+chr2	304464	304496	a	a	+
+chr2	304464	304496	a	a	+
+chr2	304432	304464	b	b	-
+chr2	304432	304464	b	b	-
+chr2	304439	304471	b	b	-
+chr2	304439	304471	b	b	-
+chr2	304439	304471	b	b	-
+chr2	304439	304471	b	b	-
+chr2	304474	304506	a	a	+
+chr2	304475	304507	a	a	+
+chr2	304449	304481	b	b	-
+chr2	304452	304484	b	b	-
+chr2	304497	304529	a	a	+
+chr2	304550	304582	a	a	+
+chr2	305046	305078	a	a	+
+chr2	305087	305119	b	b	-
+chr2	305237	305269	a	a	+
+chr2	305329	305361	a	a	+
+chr2	305304	305336	b	b	-
+chr2	305655	305687	a	a	+
+chr2	305735	305767	b	b	-
+chr2	305740	305772	b	b	-
+chr2	305799	305831	a	a	+
+chr2	305782	305814	b	b	-
+chr2	305937	305969	a	a	+
+chr2	305921	305953	b	b	-
+chr2	305921	305953	b	b	-
+chr2	305957	305989	a	a	+
+chr2	305925	305957	b	b	-
+chr2	305932	305964	b	b	-
+chr2	305967	305999	a	a	+
+chr2	305940	305972	b	b	-
+chr2	305942	305974	b	b	-
+chr2	305943	305975	b	b	-
+chr2	305983	306015	a	a	+
+chr2	306248	306280	b	b	-
+chr2	306263	306295	b	b	-
+chr2	306263	306295	b	b	-
+chr2	306264	306296	b	b	-
+chr2	306265	306297	b	b	-
+chr2	306298	306330	a	a	+
+chr2	306275	306307	b	b	-
+chr2	306308	306340	a	a	+
+chr2	306308	306340	a	a	+
+chr2	306309	306341	a	a	+
+chr2	306309	306341	a	a	+
+chr2	306309	306341	a	a	+
+chr2	306279	306311	b	b	-
+chr2	306279	306311	b	b	-
+chr2	306279	306311	b	b	-
+chr2	306283	306315	b	b	-
+chr2	306283	306315	b	b	-
+chr2	306320	306352	a	a	+
+chr2	306320	306352	a	a	+
+chr2	306320	306352	a	a	+
+chr2	306295	306327	b	b	-
+chr2	306295	306327	b	b	-
+chr2	306339	306371	a	a	+
+chr2	306315	306347	b	b	-
+chr2	306317	306349	b	b	-
+chr2	306365	306397	a	a	+
+chr2	306444	306476	a	a	+
+chr2	306564	306596	b	b	-
+chr2	306568	306600	b	b	-
+chr2	306584	306616	b	b	-
+chr2	306617	306649	a	a	+
+chr2	306586	306618	b	b	-
+chr2	306620	306652	a	a	+
+chr2	306620	306652	a	a	+
+chr2	306624	306656	a	a	+
+chr2	306618	306650	b	b	-
+chr2	306767	306799	a	a	+
+chr2	306767	306799	a	a	+
+chr2	306771	306803	a	a	+
+chr2	306775	306807	a	a	+
+chr2	306744	306776	b	b	-
+chr2	306755	306787	b	b	-
+chr2	306877	306909	b	b	-
+chr2	306919	306951	a	a	+
+chr2	306924	306956	a	a	+
+chr2	306924	306956	a	a	+
+chr2	306924	306956	a	a	+
+chr2	306894	306926	b	b	-
+chr2	306928	306960	a	a	+
+chr2	306898	306930	b	b	-
+chr2	306898	306930	b	b	-
+chr2	306931	306963	a	a	+
+chr2	306937	306969	a	a	+
+chr2	306937	306969	a	a	+
+chr2	306940	306972	a	a	+
+chr2	306910	306942	b	b	-
+chr2	306910	306942	b	b	-
+chr2	306910	306942	b	b	-
+chr2	306944	306976	a	a	+
+chr2	306945	306977	a	a	+
+chr2	306915	306947	b	b	-
+chr2	306950	306982	a	a	+
+chr2	306918	306950	b	b	-
+chr2	306918	306950	b	b	-
+chr2	306918	306950	b	b	-
+chr2	306918	306950	b	b	-
+chr2	306918	306950	b	b	-
+chr2	306919	306951	b	b	-
+chr2	306919	306951	b	b	-
+chr2	306919	306951	b	b	-
+chr2	306954	306986	a	a	+
+chr2	306954	306986	a	a	+
+chr2	306961	306993	a	a	+
+chr2	306963	306995	a	a	+
+chr2	306964	306996	a	a	+
+chr2	306970	307002	a	a	+
+chr2	306979	307011	a	a	+
+chr2	307108	307140	b	b	-
+chr2	307179	307211	a	a	+
+chr2	307248	307280	b	b	-
+chr2	307289	307321	a	a	+
+chr2	307289	307321	a	a	+
+chr2	307298	307330	a	a	+
+chr2	307299	307331	a	a	+
+chr2	307299	307331	a	a	+
+chr2	307304	307336	a	a	+
+chr2	307276	307308	b	b	-
+chr2	307325	307357	a	a	+
+chr2	307547	307579	a	a	+
+chr2	307598	307630	a	a	+
+chr2	307572	307604	b	b	-
+chr2	307607	307639	a	a	+
+chr2	307575	307607	b	b	-
+chr2	307579	307611	b	b	-
+chr2	307618	307650	a	a	+
+chr2	307590	307622	b	b	-
+chr2	307694	307726	b	b	-
+chr2	307740	307772	a	a	+
+chr2	307777	307809	a	a	+
+chr2	307777	307809	a	a	+
+chr2	307754	307786	b	b	-
+chr2	307761	307793	b	b	-
+chr2	307763	307795	b	b	-
+chr2	307764	307796	b	b	-
+chr2	307765	307797	b	b	-
+chr2	308010	308042	a	a	+
+chr2	308013	308045	b	b	-
+chr2	308379	308411	b	b	-
+chr2	308471	308503	a	a	+
+chr2	308619	308651	a	a	+
+chr2	308617	308649	b	b	-
+chr2	308641	308673	b	b	-
+chr2	308643	308675	b	b	-
+chr2	309205	309237	b	b	-
+chr2	309577	309609	a	a	+
+chr2	309640	309672	b	b	-
+chr2	309640	309672	b	b	-
+chr2	309673	309705	a	a	+
+chr2	309650	309682	b	b	-
+chr2	309803	309835	b	b	-
+chr2	309967	309999	a	a	+
+chr2	309947	309979	b	b	-
+chr2	309989	310021	a	a	+
+chr2	309995	310027	a	a	+
+chr2	309995	310027	a	a	+
+chr2	310000	310032	a	a	+
+chr2	310010	310042	a	a	+
+chr2	310010	310042	a	a	+
+chr2	310010	310042	a	a	+
+chr2	310152	310184	a	a	+
+chr2	310127	310159	b	b	-
+chr2	310160	310192	a	a	+
+chr2	310129	310161	b	b	-
+chr2	310133	310165	b	b	-
+chr2	310148	310180	b	b	-
+chr2	310243	310275	a	a	+
+chr2	310254	310286	b	b	-
+chr2	310309	310341	a	a	+
+chr2	310316	310348	a	a	+
+chr2	310317	310349	a	a	+
+chr2	310285	310317	b	b	-
+chr2	310320	310352	a	a	+
+chr2	310320	310352	a	a	+
+chr2	310320	310352	a	a	+
+chr2	310320	310352	a	a	+
+chr2	310320	310352	a	a	+
+chr2	310320	310352	a	a	+
+chr2	310321	310353	a	a	+
+chr2	310321	310353	a	a	+
+chr2	310321	310353	a	a	+
+chr2	310321	310353	a	a	+
+chr2	310321	310353	a	a	+
+chr2	310321	310353	a	a	+
+chr2	310321	310353	a	a	+
+chr2	310321	310353	a	a	+
+chr2	310321	310353	a	a	+
+chr2	310321	310353	a	a	+
+chr2	310321	310353	a	a	+
+chr2	310289	310321	b	b	-
+chr2	310289	310321	b	b	-
+chr2	310290	310322	b	b	-
+chr2	310290	310322	b	b	-
+chr2	310323	310355	a	a	+
+chr2	310323	310355	a	a	+
+chr2	310323	310355	a	a	+
+chr2	310291	310323	b	b	-
+chr2	310291	310323	b	b	-
+chr2	310291	310323	b	b	-
+chr2	310291	310323	b	b	-
+chr2	310291	310323	b	b	-
+chr2	310292	310324	b	b	-
+chr2	310325	310357	a	a	+
+chr2	310325	310357	a	a	+
+chr2	310294	310326	b	b	-
+chr2	310294	310326	b	b	-
+chr2	310327	310359	a	a	+
+chr2	310327	310359	a	a	+
+chr2	310295	310327	b	b	-
+chr2	310300	310332	b	b	-
+chr2	310300	310332	b	b	-
+chr2	310300	310332	b	b	-
+chr2	310300	310332	b	b	-
+chr2	310300	310332	b	b	-
+chr2	310333	310365	a	a	+
+chr2	310301	310333	b	b	-
+chr2	310301	310333	b	b	-
+chr2	310301	310333	b	b	-
+chr2	310337	310369	a	a	+
+chr2	310340	310372	a	a	+
+chr2	310340	310372	a	a	+
+chr2	310340	310372	a	a	+
+chr2	310344	310376	a	a	+
+chr2	310313	310345	b	b	-
+chr2	310319	310351	b	b	-
+chr2	310320	310352	b	b	-
+chr2	310329	310361	b	b	-
+chr2	310344	310376	b	b	-
+chr2	310605	310637	a	a	+
+chr2	310605	310637	a	a	+
+chr2	310605	310637	a	a	+
+chr2	310606	310638	a	a	+
+chr2	310609	310641	a	a	+
+chr2	310617	310649	a	a	+
+chr2	310617	310649	a	a	+
+chr2	310617	310649	a	a	+
+chr2	310617	310649	a	a	+
+chr2	310617	310649	a	a	+
+chr2	310617	310649	a	a	+
+chr2	310617	310649	a	a	+
+chr2	310585	310617	b	b	-
+chr2	310586	310618	b	b	-
+chr2	310619	310651	a	a	+
+chr2	310620	310652	a	a	+
+chr2	310620	310652	a	a	+
+chr2	310620	310652	a	a	+
+chr2	310588	310620	b	b	-
+chr2	310588	310620	b	b	-
+chr2	310588	310620	b	b	-
+chr2	310622	310654	a	a	+
+chr2	310591	310623	b	b	-
+chr2	310591	310623	b	b	-
+chr2	310626	310658	a	a	+
+chr2	310595	310627	b	b	-
+chr2	310595	310627	b	b	-
+chr2	310629	310661	a	a	+
+chr2	310600	310632	b	b	-
+chr2	310641	310673	a	a	+
+chr2	310615	310647	b	b	-
+chr2	310734	310766	b	b	-
+chr2	310781	310813	a	a	+
+chr2	310781	310813	a	a	+
+chr2	310788	310820	a	a	+
+chr2	310788	310820	a	a	+
+chr2	310789	310821	a	a	+
+chr2	310759	310791	b	b	-
+chr2	310763	310795	b	b	-
+chr2	310763	310795	b	b	-
+chr2	310798	310830	a	a	+
+chr2	310801	310833	a	a	+
+chr2	310773	310805	b	b	-
+chr2	310920	310952	a	a	+
+chr2	310888	310920	b	b	-
+chr2	310905	310937	b	b	-
+chr2	311005	311037	b	b	-
+chr2	311091	311123	a	a	+
+chr2	311076	311108	b	b	-
+chr2	311078	311110	b	b	-
+chr2	311146	311178	a	a	+
+chr2	311158	311190	a	a	+
+chr2	311234	311266	a	a	+
+chr2	311234	311266	a	a	+
+chr2	311248	311280	a	a	+
+chr2	311260	311292	a	a	+
+chr2	311230	311262	b	b	-
+chr2	311230	311262	b	b	-
+chr2	311270	311302	a	a	+
+chr2	311238	311270	b	b	-
+chr2	311239	311271	b	b	-
+chr2	311244	311276	b	b	-
+chr2	311245	311277	b	b	-
+chr2	311245	311277	b	b	-
+chr2	311288	311320	a	a	+
+chr2	311256	311288	b	b	-
+chr2	311256	311288	b	b	-
+chr2	311262	311294	b	b	-
+chr2	311268	311300	b	b	-
+chr2	311268	311300	b	b	-
+chr2	311286	311318	b	b	-
+chr2	311286	311318	b	b	-
+chr2	311348	311380	b	b	-
+chr2	311348	311380	b	b	-
+chr2	311348	311380	b	b	-
+chr2	311365	311397	b	b	-
+chr2	311410	311442	a	a	+
+chr2	311415	311447	a	a	+
+chr2	311384	311416	b	b	-
+chr2	311384	311416	b	b	-
+chr2	311385	311417	b	b	-
+chr2	311418	311450	a	a	+
+chr2	311386	311418	b	b	-
+chr2	311420	311452	a	a	+
+chr2	311423	311455	a	a	+
+chr2	311423	311455	a	a	+
+chr2	311425	311457	a	a	+
+chr2	311394	311426	b	b	-
+chr2	311427	311459	a	a	+
+chr2	311395	311427	b	b	-
+chr2	311428	311460	a	a	+
+chr2	311428	311460	a	a	+
+chr2	311428	311460	a	a	+
+chr2	311428	311460	a	a	+
+chr2	311429	311461	a	a	+
+chr2	311431	311463	a	a	+
+chr2	311400	311432	b	b	-
+chr2	311449	311481	a	a	+
+chr2	311450	311482	a	a	+
+chr2	311457	311489	a	a	+
+chr2	311431	311463	b	b	-
+chr2	311431	311463	b	b	-
+chr2	311468	311500	a	a	+
+chr2	311484	311516	a	a	+
+chr2	311463	311495	b	b	-
+chr2	311471	311503	b	b	-
+chr2	311717	311749	b	b	-
+chr2	311736	311768	b	b	-
+chr2	311750	311782	b	b	-
+chr2	311754	311786	b	b	-
+chr2	311754	311786	b	b	-
+chr2	311791	311823	a	a	+
+chr2	311800	311832	a	a	+
+chr2	311800	311832	a	a	+
+chr2	311802	311834	a	a	+
+chr2	311807	311839	a	a	+
+chr2	311775	311807	b	b	-
+chr2	311784	311816	b	b	-
+chr2	311826	311858	a	a	+
+chr2	311826	311858	a	a	+
+chr2	311836	311868	a	a	+
+chr2	311836	311868	b	b	-
+chr2	311873	311905	a	a	+
+chr2	311934	311966	b	b	-
+chr2	311934	311966	b	b	-
+chr2	311971	312003	a	a	+
+chr2	311940	311972	b	b	-
+chr2	311971	312003	b	b	-
+chr2	312021	312053	a	a	+
+chr2	312023	312055	a	a	+
+chr2	312149	312181	a	a	+
+chr2	312123	312155	b	b	-
+chr2	312176	312208	a	a	+
+chr2	312261	312293	b	b	-
+chr2	312450	312482	a	a	+
+chr2	312456	312488	a	a	+
+chr2	312764	312796	a	a	+
+chr2	312843	312875	b	b	-
+chr2	312920	312952	a	a	+
+chr2	312913	312945	b	b	-
+chr2	313094	313126	b	b	-
+chr2	313260	313292	b	b	-
+chr2	313648	313680	b	b	-
+chr2	314283	314315	b	b	-
+chr2	314283	314315	b	b	-
+chr2	314369	314401	b	b	-
+chr2	314586	314618	b	b	-
+chr2	314730	314762	b	b	-
+chr2	315073	315105	a	a	+
+chr2	315088	315120	a	a	+
+chr2	315064	315096	b	b	-
+chr2	315101	315133	a	a	+
+chr2	315071	315103	b	b	-
+chr2	315071	315103	b	b	-
+chr2	315107	315139	a	a	+
+chr2	315082	315114	b	b	-
+chr2	315126	315158	a	a	+
+chr2	315225	315257	a	a	+
+chr2	315273	315305	b	b	-
+chr2	315536	315568	a	a	+
+chr2	315542	315574	a	a	+
+chr2	315510	315542	b	b	-
+chr2	315511	315543	b	b	-
+chr2	315522	315554	b	b	-
+chr2	315559	315591	a	a	+
+chr2	315562	315594	a	a	+
+chr2	315536	315568	b	b	-
+chr2	315536	315568	b	b	-
+chr2	315537	315569	b	b	-
+chr2	315570	315602	a	a	+
+chr2	315573	315605	a	a	+
+chr2	315542	315574	b	b	-
+chr2	315543	315575	b	b	-
+chr2	315543	315575	b	b	-
+chr2	315577	315609	a	a	+
+chr2	315550	315582	b	b	-
+chr2	315587	315619	a	a	+
+chr2	315556	315588	b	b	-
+chr2	315565	315597	b	b	-
+chr2	315565	315597	b	b	-
+chr2	315565	315597	b	b	-
+chr2	315608	315640	a	a	+
+chr2	315691	315723	b	b	-
+chr2	315874	315906	a	a	+
+chr2	315861	315893	b	b	-
+chr2	315903	315935	a	a	+
+chr2	316231	316263	b	b	-
+chr2	316356	316388	b	b	-
+chr2	316390	316422	b	b	-
+chr2	316488	316520	b	b	-
+chr2	316488	316520	b	b	-
+chr2	316502	316534	b	b	-
+chr2	316560	316592	a	a	+
+chr2	316543	316575	b	b	-
+chr2	316863	316895	a	a	+
+chr2	317032	317064	a	a	+
+chr2	317156	317188	b	b	-
+chr2	317157	317189	b	b	-
+chr2	317203	317235	a	a	+
+chr2	317182	317214	b	b	-
+chr2	317226	317258	a	a	+
+chr2	317206	317238	b	b	-
+chr2	317345	317377	a	a	+
+chr2	317385	317417	b	b	-
+chr2	317385	317417	b	b	-
+chr2	317620	317652	b	b	-
+chr2	317653	317685	a	a	+
+chr2	317653	317685	a	a	+
+chr2	317635	317667	b	b	-
+chr2	318238	318270	a	a	+
+chr2	318210	318242	b	b	-
+chr2	318213	318245	b	b	-
+chr2	318216	318248	b	b	-
+chr2	318251	318283	a	a	+
+chr2	318251	318283	a	a	+
+chr2	318251	318283	a	a	+
+chr2	318227	318259	b	b	-
+chr2	318227	318259	b	b	-
+chr2	318260	318292	a	a	+
+chr2	318261	318293	a	a	+
+chr2	318263	318295	a	a	+
+chr2	318231	318263	b	b	-
+chr2	318232	318264	b	b	-
+chr2	318232	318264	b	b	-
+chr2	318267	318299	a	a	+
+chr2	318269	318301	a	a	+
+chr2	318272	318304	a	a	+
+chr2	318273	318305	a	a	+
+chr2	318274	318306	a	a	+
+chr2	318242	318274	b	b	-
+chr2	318275	318307	a	a	+
+chr2	318276	318308	a	a	+
+chr2	318244	318276	b	b	-
+chr2	318244	318276	b	b	-
+chr2	318244	318276	b	b	-
+chr2	318245	318277	b	b	-
+chr2	318279	318311	a	a	+
+chr2	318279	318311	a	a	+
+chr2	318280	318312	a	a	+
+chr2	318249	318281	b	b	-
+chr2	318250	318282	b	b	-
+chr2	318251	318283	b	b	-
+chr2	318258	318290	b	b	-
+chr2	318292	318324	a	a	+
+chr2	318317	318349	a	a	+
+chr2	318604	318636	a	a	+
+chr2	318608	318640	a	a	+
+chr2	318989	319021	a	a	+
+chr2	319054	319086	b	b	-
+chr2	319330	319362	b	b	-
+chr2	319478	319510	b	b	-
+chr2	319492	319524	b	b	-
+chr2	319492	319524	b	b	-
+chr2	319492	319524	b	b	-
+chr2	319492	319524	b	b	-
+chr2	319827	319859	b	b	-
+chr2	319922	319954	b	b	-
+chr2	319985	320017	a	a	+
+chr2	320206	320238	a	a	+
+chr2	320259	320291	b	b	-
+chr2	320474	320506	b	b	-
+chr2	320821	320853	b	b	-
+chr2	320947	320979	a	a	+
+chr2	320992	321024	b	b	-
+chr2	321066	321098	b	b	-
+chr2	321249	321281	a	a	+
+chr2	321253	321285	a	a	+
+chr2	321228	321260	b	b	-
+chr2	321230	321262	b	b	-
+chr2	321230	321262	b	b	-
+chr2	321275	321307	a	a	+
+chr2	321392	321424	b	b	-
+chr2	321394	321426	b	b	-
+chr2	321478	321510	b	b	-
+chr2	321557	321589	a	a	+
+chr2	321574	321606	a	a	+
+chr2	321574	321606	a	a	+
+chr2	321579	321611	a	a	+
+chr2	321548	321580	b	b	-
+chr2	321549	321581	b	b	-
+chr2	321582	321614	a	a	+
+chr2	321598	321630	a	a	+
+chr2	321599	321631	a	a	+
+chr2	321599	321631	a	a	+
+chr2	321599	321631	a	a	+
+chr2	321599	321631	a	a	+
+chr2	321599	321631	a	a	+
+chr2	321599	321631	a	a	+
+chr2	321599	321631	a	a	+
+chr2	321599	321631	a	a	+
+chr2	321600	321632	a	a	+
+chr2	321600	321632	a	a	+
+chr2	321600	321632	a	a	+
+chr2	321600	321632	a	a	+
+chr2	321600	321632	a	a	+
+chr2	321600	321632	a	a	+
+chr2	321600	321632	a	a	+
+chr2	321600	321632	a	a	+
+chr2	321600	321632	a	a	+
+chr2	321600	321632	a	a	+
+chr2	321569	321601	b	b	-
+chr2	321571	321603	b	b	-
+chr2	321571	321603	b	b	-
+chr2	321605	321637	a	a	+
+chr2	321576	321608	b	b	-
+chr2	321576	321608	b	b	-
+chr2	321576	321608	b	b	-
+chr2	321579	321611	b	b	-
+chr2	321579	321611	b	b	-
+chr2	321579	321611	b	b	-
+chr2	321624	321656	a	a	+
+chr2	321625	321657	a	a	+
+chr2	321859	321891	a	a	+
+chr2	321859	321891	a	a	+
+chr2	321867	321899	a	a	+
+chr2	321835	321867	b	b	-
+chr2	321885	321917	a	a	+
+chr2	321997	322029	b	b	-
+chr2	321997	322029	b	b	-
+chr2	321997	322029	b	b	-
+chr2	322178	322210	b	b	-
+chr2	322219	322251	a	a	+
+chr2	322438	322470	b	b	-
+chr2	322622	322654	b	b	-
+chr2	322736	322768	a	a	+
+chr2	322769	322801	a	a	+
+chr2	322776	322808	a	a	+
+chr2	322913	322945	b	b	-
+chr2	322961	322993	a	a	+
+chr2	323031	323063	b	b	-
+chr2	323236	323268	b	b	-
+chr2	323394	323426	b	b	-
+chr2	323530	323562	b	b	-
+chr2	323706	323738	a	a	+
+chr2	323718	323750	a	a	+
+chr2	323841	323873	b	b	-
+chr2	323876	323908	a	a	+
+chr2	323844	323876	b	b	-
+chr2	323889	323921	a	a	+
+chr2	323889	323921	a	a	+
+chr2	323892	323924	a	a	+
+chr2	323901	323933	a	a	+
+chr2	323979	324011	b	b	-
+chr2	323994	324026	b	b	-
+chr2	323994	324026	b	b	-
+chr2	324030	324062	a	a	+
+chr2	324030	324062	a	a	+
+chr2	324017	324049	b	b	-
+chr2	324276	324308	b	b	-
+chr2	324282	324314	b	b	-
+chr2	324326	324358	a	a	+
+chr2	324335	324367	a	a	+
+chr2	324337	324369	a	a	+
+chr2	324337	324369	a	a	+
+chr2	324337	324369	a	a	+
+chr2	324343	324375	a	a	+
+chr2	324344	324376	a	a	+
+chr2	324312	324344	b	b	-
+chr2	324348	324380	a	a	+
+chr2	324348	324380	b	b	-
+chr2	324442	324474	b	b	-
+chr2	324505	324537	a	a	+
+chr2	324508	324540	a	a	+
+chr2	324476	324508	b	b	-
+chr2	324550	324582	a	a	+
+chr2	324660	324692	a	a	+
+chr2	324660	324692	a	a	+
+chr2	324643	324675	b	b	-
+chr2	324660	324692	b	b	-
+chr2	324787	324819	a	a	+
+chr2	324797	324829	b	b	-
+chr2	324811	324843	b	b	-
+chr2	324924	324956	b	b	-
+chr2	324989	325021	b	b	-
+chr2	325325	325357	a	a	+
+chr2	325500	325532	a	a	+
+chr2	325484	325516	b	b	-
+chr2	325684	325716	a	a	+
+chr2	325711	325743	a	a	+
+chr2	325733	325765	a	a	+
+chr2	325754	325786	a	a	+
+chr2	325754	325786	a	a	+
+chr2	325732	325764	b	b	-
+chr2	325844	325876	b	b	-
+chr2	325896	325928	a	a	+
+chr2	325899	325931	a	a	+
+chr2	325876	325908	b	b	-
+chr2	325908	325940	b	b	-
+chr2	325908	325940	b	b	-
+chr2	325908	325940	b	b	-
+chr2	326012	326044	a	a	+
+chr2	326012	326044	a	a	+
+chr2	326069	326101	a	a	+
+chr2	326071	326103	a	a	+
+chr2	326071	326103	a	a	+
+chr2	326072	326104	a	a	+
+chr2	326079	326111	a	a	+
+chr2	326049	326081	b	b	-
+chr2	326049	326081	b	b	-
+chr2	326053	326085	b	b	-
+chr2	326053	326085	b	b	-
+chr2	326089	326121	a	a	+
+chr2	326093	326125	a	a	+
+chr2	326094	326126	a	a	+
+chr2	326094	326126	a	a	+
+chr2	326094	326126	a	a	+
+chr2	326068	326100	b	b	-
+chr2	326069	326101	b	b	-
+chr2	326329	326361	a	a	+
+chr2	326310	326342	b	b	-
+chr2	326345	326377	a	a	+
+chr2	326345	326377	a	a	+
+chr2	326327	326359	b	b	-
+chr2	326327	326359	b	b	-
+chr2	326327	326359	b	b	-
+chr2	326327	326359	b	b	-
+chr2	326327	326359	b	b	-
+chr2	326327	326359	b	b	-
+chr2	326327	326359	b	b	-
+chr2	326328	326360	b	b	-
+chr2	326364	326396	a	a	+
+chr2	326332	326364	b	b	-
+chr2	326332	326364	b	b	-
+chr2	326365	326397	a	a	+
+chr2	326365	326397	a	a	+
+chr2	326366	326398	a	a	+
+chr2	326366	326398	a	a	+
+chr2	326367	326399	a	a	+
+chr2	326367	326399	a	a	+
+chr2	326342	326374	b	b	-
+chr2	326379	326411	a	a	+
+chr2	326387	326419	a	a	+
+chr2	326475	326507	b	b	-
+chr2	326475	326507	b	b	-
+chr2	326477	326509	b	b	-
+chr2	326530	326562	a	a	+
+chr2	326598	326630	a	a	+
+chr2	326598	326630	a	a	+
+chr2	326623	326655	a	a	+
+chr2	326628	326660	a	a	+
+chr2	326638	326670	a	a	+
+chr2	326621	326653	b	b	-
+chr2	326687	326719	a	a	+
+chr2	326937	326969	b	b	-
+chr2	327003	327035	a	a	+
+chr2	327003	327035	a	a	+
+chr2	327095	327127	b	b	-
+chr2	327098	327130	b	b	-
+chr2	327098	327130	b	b	-
+chr2	327098	327130	b	b	-
+chr2	327099	327131	b	b	-
+chr2	327099	327131	b	b	-
+chr2	327099	327131	b	b	-
+chr2	327099	327131	b	b	-
+chr2	327104	327136	b	b	-
+chr2	327107	327139	b	b	-
+chr2	327140	327172	a	a	+
+chr2	327118	327150	b	b	-
+chr2	327120	327152	b	b	-
+chr2	327120	327152	b	b	-
+chr2	327131	327163	b	b	-
+chr2	327132	327164	b	b	-
+chr2	327153	327185	b	b	-
+chr2	327153	327185	b	b	-
+chr2	327192	327224	a	a	+
+chr2	327194	327226	a	a	+
+chr2	327194	327226	a	a	+
+chr2	327163	327195	b	b	-
+chr2	327200	327232	a	a	+
+chr2	327201	327233	a	a	+
+chr2	327202	327234	a	a	+
+chr2	327206	327238	a	a	+
+chr2	327206	327238	a	a	+
+chr2	327177	327209	b	b	-
+chr2	327177	327209	b	b	-
+chr2	327182	327214	b	b	-
+chr2	327190	327222	b	b	-
+chr2	327190	327222	b	b	-
+chr2	327231	327263	a	a	+
+chr2	327233	327265	a	a	+
+chr2	327206	327238	b	b	-
+chr2	327210	327242	b	b	-
+chr2	327210	327242	b	b	-
+chr2	327210	327242	b	b	-
+chr2	327212	327244	b	b	-
+chr2	327212	327244	b	b	-
+chr2	327213	327245	b	b	-
+chr2	327213	327245	b	b	-
+chr2	327213	327245	b	b	-
+chr2	327213	327245	b	b	-
+chr2	327220	327252	b	b	-
+chr2	327220	327252	b	b	-
+chr2	327220	327252	b	b	-
+chr2	327259	327291	a	a	+
+chr2	327234	327266	b	b	-
+chr2	327240	327272	b	b	-
+chr2	327277	327309	a	a	+
+chr2	327287	327319	a	a	+
+chr2	327287	327319	a	a	+
+chr2	327287	327319	a	a	+
+chr2	327292	327324	a	a	+
+chr2	327303	327335	a	a	+
+chr2	327304	327336	a	a	+
+chr2	327305	327337	a	a	+
+chr2	327305	327337	a	a	+
+chr2	327305	327337	a	a	+
+chr2	327313	327345	a	a	+
+chr2	327313	327345	a	a	+
+chr2	327321	327353	a	a	+
+chr2	327289	327321	b	b	-
+chr2	327290	327322	b	b	-
+chr2	327290	327322	b	b	-
+chr2	327325	327357	a	a	+
+chr2	327333	327365	a	a	+
+chr2	327334	327366	a	a	+
+chr2	327337	327369	a	a	+
+chr2	327338	327370	a	a	+
+chr2	327355	327387	a	a	+
+chr2	327358	327390	a	a	+
+chr2	327370	327402	a	a	+
+chr2	327375	327407	a	a	+
+chr2	327729	327761	a	a	+
+chr2	327781	327813	a	a	+
+chr2	327808	327840	a	a	+
+chr2	327811	327843	a	a	+
+chr2	327837	327869	a	a	+
+chr2	327869	327901	a	a	+
+chr2	327910	327942	a	a	+
+chr2	327910	327942	a	a	+
+chr2	327910	327942	a	a	+
+chr2	327912	327944	a	a	+
+chr2	327896	327928	b	b	-
+chr2	327939	327971	b	b	-
+chr2	327939	327971	b	b	-
+chr2	327972	328004	b	b	-
+chr2	328080	328112	b	b	-
+chr2	328090	328122	b	b	-
+chr2	328255	328287	a	a	+
+chr2	328232	328264	b	b	-
+chr2	328266	328298	b	b	-
+chr2	328270	328302	b	b	-
+chr2	328303	328335	a	a	+
+chr2	328277	328309	b	b	-
+chr2	328296	328328	b	b	-
+chr2	328403	328435	b	b	-
+chr2	328408	328440	b	b	-
+chr2	328455	328487	a	a	+
+chr2	328494	328526	b	b	-
+chr2	328494	328526	b	b	-
+chr2	328688	328720	a	a	+
+chr2	328688	328720	a	a	+
+chr2	328667	328699	b	b	-
+chr2	328672	328704	b	b	-
+chr2	328860	328892	b	b	-
+chr2	328914	328946	b	b	-
+chr2	328914	328946	b	b	-
+chr2	329022	329054	a	a	+
+chr2	329085	329117	b	b	-
+chr2	329135	329167	a	a	+
+chr2	329135	329167	a	a	+
+chr2	329113	329145	b	b	-
+chr2	329214	329246	b	b	-
+chr2	329306	329338	a	a	+
+chr2	329306	329338	a	a	+
+chr2	329392	329424	b	b	-
+chr2	329559	329591	b	b	-
+chr2	329627	329659	b	b	-
+chr2	329896	329928	a	a	+
+chr2	330033	330065	b	b	-
+chr2	330183	330215	a	a	+
+chr2	330463	330495	b	b	-
+chr2	330497	330529	a	a	+
+chr2	330468	330500	b	b	-
+chr2	330469	330501	b	b	-
+chr2	330502	330534	a	a	+
+chr2	330471	330503	b	b	-
+chr2	330479	330511	b	b	-
+chr2	330827	330859	a	a	+
+chr2	330879	330911	b	b	-
+chr2	330938	330970	a	a	+
+chr2	330983	331015	b	b	-
+chr2	330984	331016	b	b	-
+chr2	330988	331020	b	b	-
+chr2	331058	331090	a	a	+
+chr2	331058	331090	a	a	+
+chr2	331058	331090	a	a	+
+chr2	331058	331090	a	a	+
+chr2	331058	331090	a	a	+
+chr2	331058	331090	a	a	+
+chr2	331178	331210	a	a	+
+chr2	331159	331191	b	b	-
+chr2	331334	331366	a	a	+
+chr2	331346	331378	a	a	+
+chr2	331436	331468	b	b	-
+chr2	331441	331473	b	b	-
+chr2	331466	331498	b	b	-
+chr2	331468	331500	b	b	-
+chr2	331518	331550	a	a	+
+chr2	331521	331553	a	a	+
+chr2	331491	331523	b	b	-
+chr2	331491	331523	b	b	-
+chr2	331499	331531	b	b	-
+chr2	331499	331531	b	b	-
+chr2	331499	331531	b	b	-
+chr2	331504	331536	b	b	-
+chr2	331651	331683	b	b	-
+chr2	331686	331718	b	b	-
+chr2	331806	331838	a	a	+
+chr2	331868	331900	b	b	-
+chr2	331883	331915	b	b	-
+chr2	331998	332030	a	a	+
+chr2	332173	332205	a	a	+
+chr2	332177	332209	b	b	-
+chr2	332187	332219	b	b	-
+chr2	332198	332230	b	b	-
+chr2	332241	332273	a	a	+
+chr2	332251	332283	a	a	+
+chr2	332251	332283	a	a	+
+chr2	332324	332356	b	b	-
+chr2	332977	333009	b	b	-
+chr2	333231	333263	a	a	+
+chr2	333319	333351	b	b	-
+chr2	333502	333534	a	a	+
+chr2	333502	333534	a	a	+
+chr2	334262	334294	a	a	+
+chr2	334262	334294	a	a	+
+chr2	334263	334295	b	b	-
+chr2	334656	334688	a	a	+
+chr2	334864	334896	b	b	-
+chr2	335211	335243	a	a	+
+chr2	335309	335341	a	a	+
+chr2	335342	335374	a	a	+
+chr2	335573	335605	b	b	-
+chr2	335945	335977	b	b	-
+chr2	336036	336068	a	a	+
+chr2	336054	336086	a	a	+
+chr2	336160	336192	b	b	-
+chr2	336236	336268	b	b	-
+chr2	336297	336329	a	a	+
+chr2	336346	336378	a	a	+
+chr2	336355	336387	a	a	+
+chr2	336525	336557	a	a	+
+chr2	336525	336557	a	a	+
+chr2	336493	336525	b	b	-
+chr2	336494	336526	b	b	-
+chr2	336550	336582	a	a	+
+chr2	336552	336584	a	a	+
+chr2	336631	336663	b	b	-
+chr2	336642	336674	b	b	-
+chr2	336742	336774	a	a	+
+chr2	336725	336757	b	b	-
+chr2	336764	336796	b	b	-
+chr2	336764	336796	b	b	-
+chr2	336816	336848	a	a	+
+chr2	336793	336825	b	b	-
+chr2	336829	336861	a	a	+
+chr2	336852	336884	a	a	+
+chr2	336852	336884	a	a	+
+chr2	336823	336855	b	b	-
+chr2	336862	336894	b	b	-
+chr2	336896	336928	a	a	+
+chr2	336874	336906	b	b	-
+chr2	336879	336911	b	b	-
+chr2	336891	336923	b	b	-
+chr2	337175	337207	a	a	+
+chr2	337192	337224	b	b	-
+chr2	337192	337224	b	b	-
+chr2	337231	337263	a	a	+
+chr2	337236	337268	a	a	+
+chr2	337236	337268	a	a	+
+chr2	337236	337268	a	a	+
+chr2	337204	337236	b	b	-
+chr2	337204	337236	b	b	-
+chr2	337207	337239	b	b	-
+chr2	337208	337240	b	b	-
+chr2	337208	337240	b	b	-
+chr2	337208	337240	b	b	-
+chr2	337210	337242	b	b	-
+chr2	337210	337242	b	b	-
+chr2	337210	337242	b	b	-
+chr2	337244	337276	a	a	+
+chr2	337244	337276	a	a	+
+chr2	337244	337276	a	a	+
+chr2	337245	337277	a	a	+
+chr2	337245	337277	a	a	+
+chr2	337245	337277	a	a	+
+chr2	337245	337277	a	a	+
+chr2	337217	337249	b	b	-
+chr2	337217	337249	b	b	-
+chr2	337250	337282	a	a	+
+chr2	337219	337251	b	b	-
+chr2	337219	337251	b	b	-
+chr2	337219	337251	b	b	-
+chr2	337219	337251	b	b	-
+chr2	337219	337251	b	b	-
+chr2	337256	337288	a	a	+
+chr2	337256	337288	a	a	+
+chr2	337224	337256	b	b	-
+chr2	337257	337289	a	a	+
+chr2	337257	337289	a	a	+
+chr2	337258	337290	a	a	+
+chr2	337258	337290	a	a	+
+chr2	337258	337290	a	a	+
+chr2	337258	337290	a	a	+
+chr2	337258	337290	a	a	+
+chr2	337226	337258	b	b	-
+chr2	337228	337260	b	b	-
+chr2	337228	337260	b	b	-
+chr2	337228	337260	b	b	-
+chr2	337228	337260	b	b	-
+chr2	337228	337260	b	b	-
+chr2	337229	337261	b	b	-
+chr2	337229	337261	b	b	-
+chr2	337230	337262	b	b	-
+chr2	337238	337270	b	b	-
+chr2	337239	337271	b	b	-
+chr2	337274	337306	a	a	+
+chr2	337274	337306	a	a	+
+chr2	337242	337274	b	b	-
+chr2	337275	337307	a	a	+
+chr2	337285	337317	a	a	+
+chr2	337289	337321	a	a	+
+chr2	337362	337394	b	b	-
+chr2	337363	337395	b	b	-
+chr2	337399	337431	a	a	+
+chr2	337382	337414	b	b	-
+chr2	337418	337450	a	a	+
+chr2	337386	337418	b	b	-
+chr2	337420	337452	a	a	+
+chr2	337389	337421	b	b	-
+chr2	337389	337421	b	b	-
+chr2	337519	337551	b	b	-
+chr2	337548	337580	b	b	-
+chr2	337553	337585	b	b	-
+chr2	337571	337603	b	b	-
+chr2	337571	337603	b	b	-
+chr2	337607	337639	a	a	+
+chr2	337577	337609	b	b	-
+chr2	337637	337669	a	a	+
+chr2	337610	337642	b	b	-
+chr2	337611	337643	b	b	-
+chr2	337612	337644	b	b	-
+chr2	337612	337644	b	b	-
+chr2	337612	337644	b	b	-
+chr2	337612	337644	b	b	-
+chr2	337670	337702	a	a	+
+chr2	337731	337763	b	b	-
+chr2	337731	337763	b	b	-
+chr2	337765	337797	a	a	+
+chr2	337746	337778	b	b	-
+chr2	337791	337823	a	a	+
+chr2	337786	337818	b	b	-
+chr2	337914	337946	a	a	+
+chr2	337979	338011	a	a	+
+chr2	337980	338012	b	b	-
+chr2	337988	338020	b	b	-
+chr2	338026	338058	b	b	-
+chr2	338065	338097	a	a	+
+chr2	338072	338104	a	a	+
+chr2	338045	338077	b	b	-
+chr2	338077	338109	b	b	-
+chr2	338237	338269	a	a	+
+chr2	338210	338242	b	b	-
+chr2	338217	338249	b	b	-
+chr2	338275	338307	a	a	+
+chr2	338378	338410	a	a	+
+chr2	338379	338411	a	a	+
+chr2	338381	338413	a	a	+
+chr2	338350	338382	b	b	-
+chr2	338353	338385	b	b	-
+chr2	338355	338387	b	b	-
+chr2	338388	338420	a	a	+
+chr2	338359	338391	b	b	-
+chr2	338359	338391	b	b	-
+chr2	338359	338391	b	b	-
+chr2	338359	338391	b	b	-
+chr2	338363	338395	b	b	-
+chr2	338407	338439	a	a	+
+chr2	338408	338440	a	a	+
+chr2	338411	338443	a	a	+
+chr2	338379	338411	b	b	-
+chr2	338414	338446	a	a	+
+chr2	338383	338415	b	b	-
+chr2	338424	338456	a	a	+
+chr2	338454	338486	a	a	+
+chr2	338655	338687	b	b	-
+chr2	338659	338691	b	b	-
+chr2	338664	338696	b	b	-
+chr2	338666	338698	b	b	-
+chr2	338666	338698	b	b	-
+chr2	338667	338699	b	b	-
+chr2	338701	338733	a	a	+
+chr2	338675	338707	b	b	-
+chr2	338698	338730	b	b	-
+chr2	338706	338738	b	b	-
+chr2	338796	338828	b	b	-
+chr2	338796	338828	b	b	-
+chr2	338796	338828	b	b	-
+chr2	338796	338828	b	b	-
+chr2	338857	338889	a	a	+
+chr2	338827	338859	b	b	-
+chr2	338836	338868	b	b	-
+chr2	338839	338871	b	b	-
+chr2	338840	338872	b	b	-
+chr2	338890	338922	a	a	+
+chr2	339007	339039	a	a	+
+chr2	339019	339051	a	a	+
+chr2	338992	339024	b	b	-
+chr2	339031	339063	a	a	+
+chr2	339032	339064	a	a	+
+chr2	339180	339212	a	a	+
+chr2	339158	339190	b	b	-
+chr2	339211	339243	a	a	+
+chr2	339218	339250	a	a	+
+chr2	339271	339303	b	b	-
+chr2	339341	339373	a	a	+
+chr2	339347	339379	a	a	+
+chr2	339349	339381	a	a	+
+chr2	339349	339381	a	a	+
+chr2	339352	339384	a	a	+
+chr2	339352	339384	a	a	+
+chr2	339321	339353	b	b	-
+chr2	339322	339354	b	b	-
+chr2	339322	339354	b	b	-
+chr2	339357	339389	a	a	+
+chr2	339358	339390	a	a	+
+chr2	339329	339361	b	b	-
+chr2	339329	339361	b	b	-
+chr2	339329	339361	b	b	-
+chr2	339329	339361	b	b	-
+chr2	339329	339361	b	b	-
+chr2	339329	339361	b	b	-
+chr2	339329	339361	b	b	-
+chr2	339329	339361	b	b	-
+chr2	339371	339403	a	a	+
+chr2	339371	339403	a	a	+
+chr2	339371	339403	a	a	+
+chr2	339373	339405	a	a	+
+chr2	339373	339405	a	a	+
+chr2	339371	339403	b	b	-
+chr2	339371	339403	b	b	-
+chr2	339372	339404	b	b	-
+chr2	339372	339404	b	b	-
+chr2	339425	339457	a	a	+
+chr2	339426	339458	a	a	+
+chr2	339529	339561	b	b	-
+chr2	339530	339562	b	b	-
+chr2	339534	339566	b	b	-
+chr2	339555	339587	b	b	-
+chr2	339598	339630	a	a	+
+chr2	339570	339602	b	b	-
+chr2	339581	339613	b	b	-
+chr2	339614	339646	a	a	+
+chr2	339587	339619	b	b	-
+chr2	339588	339620	b	b	-
+chr2	339588	339620	b	b	-
+chr2	339589	339621	b	b	-
+chr2	339591	339623	b	b	-
+chr2	339625	339657	a	a	+
+chr2	339625	339657	a	a	+
+chr2	339626	339658	a	a	+
+chr2	339626	339658	a	a	+
+chr2	339626	339658	a	a	+
+chr2	339626	339658	a	a	+
+chr2	339627	339659	a	a	+
+chr2	339630	339662	a	a	+
+chr2	339599	339631	b	b	-
+chr2	339632	339664	a	a	+
+chr2	339634	339666	a	a	+
+chr2	339635	339667	a	a	+
+chr2	339635	339667	a	a	+
+chr2	339635	339667	a	a	+
+chr2	339636	339668	a	a	+
+chr2	339636	339668	a	a	+
+chr2	339607	339639	b	b	-
+chr2	339645	339677	a	a	+
+chr2	339646	339678	a	a	+
+chr2	339646	339678	a	a	+
+chr2	339616	339648	b	b	-
+chr2	339616	339648	b	b	-
+chr2	339616	339648	b	b	-
+chr2	339651	339683	a	a	+
+chr2	339623	339655	b	b	-
+chr2	339628	339660	b	b	-
+chr2	339663	339695	a	a	+
+chr2	339663	339695	a	a	+
+chr2	339645	339677	b	b	-
+chr2	339724	339756	b	b	-
+chr2	339788	339820	a	a	+
+chr2	339803	339835	a	a	+
+chr2	339803	339835	a	a	+
+chr2	339803	339835	a	a	+
+chr2	339803	339835	a	a	+
+chr2	339773	339805	b	b	-
+chr2	339790	339822	b	b	-
+chr2	339926	339958	a	a	+
+chr2	339973	340005	a	a	+
+chr2	339989	340021	b	b	-
+chr2	340078	340110	b	b	-
+chr2	340199	340231	a	a	+
+chr2	340243	340275	a	a	+
+chr2	340259	340291	a	a	+
+chr2	340259	340291	a	a	+
+chr2	340239	340271	b	b	-
+chr2	340272	340304	a	a	+
+chr2	340272	340304	a	a	+
+chr2	340396	340428	a	a	+
+chr2	340407	340439	a	a	+
+chr2	340385	340417	b	b	-
+chr2	340411	340443	b	b	-
+chr2	340494	340526	b	b	-
+chr2	340529	340561	b	b	-
+chr2	340564	340596	a	a	+
+chr2	340536	340568	b	b	-
+chr2	340569	340601	a	a	+
+chr2	340576	340608	a	a	+
+chr2	340576	340608	a	a	+
+chr2	340550	340582	b	b	-
+chr2	340584	340616	a	a	+
+chr2	340555	340587	b	b	-
+chr2	340708	340740	b	b	-
+chr2	340973	341005	b	b	-
+chr2	341009	341041	a	a	+
+chr2	341014	341046	a	a	+
+chr2	341014	341046	a	a	+
+chr2	340986	341018	b	b	-
+chr2	340998	341030	b	b	-
+chr2	341009	341041	b	b	-
+chr2	341123	341155	b	b	-
+chr2	341133	341165	b	b	-
+chr2	341133	341165	b	b	-
+chr2	341176	341208	a	a	+
+chr2	341145	341177	b	b	-
+chr2	341147	341179	b	b	-
+chr2	341154	341186	b	b	-
+chr2	341188	341220	a	a	+
+chr2	341188	341220	a	a	+
+chr2	341156	341188	b	b	-
+chr2	341156	341188	b	b	-
+chr2	341156	341188	b	b	-
+chr2	341156	341188	b	b	-
+chr2	341166	341198	b	b	-
+chr2	341169	341201	b	b	-
+chr2	341169	341201	b	b	-
+chr2	341222	341254	a	a	+
+chr2	341201	341233	b	b	-
+chr2	341568	341600	a	a	+
+chr2	341647	341679	a	a	+
+chr2	341661	341693	b	b	-
+chr2	341698	341730	a	a	+
+chr2	341672	341704	b	b	-
+chr2	341736	341768	a	a	+
+chr2	341707	341739	b	b	-
+chr2	341734	341766	b	b	-
+chr2	341750	341782	b	b	-
+chr2	341806	341838	a	a	+
+chr2	341960	341992	b	b	-
+chr2	342018	342050	a	a	+
+chr2	341998	342030	b	b	-
+chr2	341998	342030	b	b	-
+chr2	342031	342063	a	a	+
+chr2	342053	342085	a	a	+
+chr2	342053	342085	a	a	+
+chr2	342053	342085	a	a	+
+chr2	342025	342057	b	b	-
+chr2	342058	342090	a	a	+
+chr2	342036	342068	b	b	-
+chr2	342146	342178	b	b	-
+chr2	342214	342246	a	a	+
+chr2	342216	342248	a	a	+
+chr2	342233	342265	a	a	+
+chr2	342236	342268	a	a	+
+chr2	342236	342268	a	a	+
+chr2	342250	342282	a	a	+
+chr2	342503	342535	a	a	+
+chr2	342515	342547	a	a	+
+chr2	342522	342554	a	a	+
+chr2	342523	342555	a	a	+
+chr2	342524	342556	a	a	+
+chr2	342495	342527	b	b	-
+chr2	342495	342527	b	b	-
+chr2	342535	342567	a	a	+
+chr2	342536	342568	a	a	+
+chr2	342537	342569	a	a	+
+chr2	342537	342569	a	a	+
+chr2	342537	342569	a	a	+
+chr2	342510	342542	b	b	-
+chr2	342511	342543	b	b	-
+chr2	342511	342543	b	b	-
+chr2	342511	342543	b	b	-
+chr2	342511	342543	b	b	-
+chr2	342556	342588	a	a	+
+chr2	342524	342556	b	b	-
+chr2	342553	342585	b	b	-
+chr2	342553	342585	b	b	-
+chr2	342606	342638	a	a	+
+chr2	342628	342660	a	a	+
+chr2	342657	342689	b	b	-
+chr2	343124	343156	b	b	-
+chr2	343229	343261	a	a	+
+chr2	343255	343287	a	a	+
+chr2	343298	343330	a	a	+
+chr2	343309	343341	a	a	+
+chr2	343320	343352	a	a	+
+chr2	343318	343350	b	b	-
+chr2	343338	343370	b	b	-
+chr2	343399	343431	a	a	+
+chr2	343402	343434	a	a	+
+chr2	343416	343448	a	a	+
+chr2	343428	343460	a	a	+
+chr2	343401	343433	b	b	-
+chr2	343401	343433	b	b	-
+chr2	343401	343433	b	b	-
+chr2	343401	343433	b	b	-
+chr2	343407	343439	b	b	-
+chr2	343426	343458	b	b	-
+chr2	343489	343521	b	b	-
+chr2	343536	343568	a	a	+
+chr2	343558	343590	a	a	+
+chr2	343563	343595	a	a	+
+chr2	343532	343564	b	b	-
+chr2	343567	343599	a	a	+
+chr2	343535	343567	b	b	-
+chr2	343569	343601	a	a	+
+chr2	343569	343601	a	a	+
+chr2	343569	343601	a	a	+
+chr2	343573	343605	a	a	+
+chr2	343588	343620	a	a	+
+chr2	343588	343620	a	a	+
+chr2	343588	343620	a	a	+
+chr2	343589	343621	a	a	+
+chr2	343589	343621	a	a	+
+chr2	343596	343628	a	a	+
+chr2	343594	343626	b	b	-
+chr2	343628	343660	a	a	+
+chr2	343634	343666	a	a	+
+chr2	343604	343636	b	b	-
+chr2	343686	343718	b	b	-
+chr2	343721	343753	a	a	+
+chr2	343727	343759	a	a	+
+chr2	343695	343727	b	b	-
+chr2	343704	343736	b	b	-
+chr2	343740	343772	a	a	+
+chr2	343740	343772	a	a	+
+chr2	343709	343741	b	b	-
+chr2	343719	343751	b	b	-
+chr2	343719	343751	b	b	-
+chr2	343757	343789	a	a	+
+chr2	343757	343789	a	a	+
+chr2	343764	343796	a	a	+
+chr2	343739	343771	b	b	-
+chr2	343798	343830	a	a	+
+chr2	343806	343838	a	a	+
+chr2	343900	343932	a	a	+
+chr2	343908	343940	a	a	+
+chr2	343881	343913	b	b	-
+chr2	343886	343918	b	b	-
+chr2	343922	343954	a	a	+
+chr2	343922	343954	a	a	+
+chr2	343894	343926	b	b	-
+chr2	343896	343928	b	b	-
+chr2	343896	343928	b	b	-
+chr2	343900	343932	b	b	-
+chr2	343933	343965	a	a	+
+chr2	344023	344055	a	a	+
+chr2	343998	344030	b	b	-
+chr2	344009	344041	b	b	-
+chr2	344009	344041	b	b	-
+chr2	344020	344052	b	b	-
+chr2	344055	344087	a	a	+
+chr2	344055	344087	a	a	+
+chr2	344057	344089	a	a	+
+chr2	344027	344059	b	b	-
+chr2	344060	344092	a	a	+
+chr2	344028	344060	b	b	-
+chr2	344062	344094	a	a	+
+chr2	344066	344098	a	a	+
+chr2	344066	344098	a	a	+
+chr2	344034	344066	b	b	-
+chr2	344034	344066	b	b	-
+chr2	344034	344066	b	b	-
+chr2	344040	344072	b	b	-
+chr2	344040	344072	b	b	-
+chr2	344043	344075	b	b	-
+chr2	344043	344075	b	b	-
+chr2	344045	344077	b	b	-
+chr2	344045	344077	b	b	-
+chr2	344045	344077	b	b	-
+chr2	344046	344078	b	b	-
+chr2	344079	344111	a	a	+
+chr2	344081	344113	a	a	+
+chr2	344081	344113	a	a	+
+chr2	344081	344113	a	a	+
+chr2	344082	344114	a	a	+
+chr2	344082	344114	a	a	+
+chr2	344082	344114	a	a	+
+chr2	344052	344084	b	b	-
+chr2	344052	344084	b	b	-
+chr2	344052	344084	b	b	-
+chr2	344052	344084	b	b	-
+chr2	344052	344084	b	b	-
+chr2	344052	344084	b	b	-
+chr2	344052	344084	b	b	-
+chr2	344054	344086	b	b	-
+chr2	344087	344119	a	a	+
+chr2	344092	344124	a	a	+
+chr2	344092	344124	a	a	+
+chr2	344060	344092	b	b	-
+chr2	344061	344093	b	b	-
+chr2	344094	344126	a	a	+
+chr2	344094	344126	a	a	+
+chr2	344065	344097	b	b	-
+chr2	344065	344097	b	b	-
+chr2	344100	344132	a	a	+
+chr2	344100	344132	a	a	+
+chr2	344068	344100	b	b	-
+chr2	344103	344135	a	a	+
+chr2	344071	344103	b	b	-
+chr2	344071	344103	b	b	-
+chr2	344071	344103	b	b	-
+chr2	344106	344138	a	a	+
+chr2	344106	344138	a	a	+
+chr2	344106	344138	a	a	+
+chr2	344106	344138	a	a	+
+chr2	344106	344138	a	a	+
+chr2	344075	344107	b	b	-
+chr2	344108	344140	a	a	+
+chr2	344112	344144	a	a	+
+chr2	344112	344144	a	a	+
+chr2	344080	344112	b	b	-
+chr2	344080	344112	b	b	-
+chr2	344081	344113	b	b	-
+chr2	344081	344113	b	b	-
+chr2	344081	344113	b	b	-
+chr2	344081	344113	b	b	-
+chr2	344114	344146	a	a	+
+chr2	344082	344114	b	b	-
+chr2	344124	344156	a	a	+
+chr2	344136	344168	a	a	+
+chr2	344110	344142	b	b	-
+chr2	344115	344147	b	b	-
+chr2	344115	344147	b	b	-
+chr2	344116	344148	b	b	-
+chr2	344178	344210	a	a	+
+chr2	344351	344383	a	a	+
+chr2	344336	344368	b	b	-
+chr2	344354	344386	b	b	-
+chr2	344587	344619	b	b	-
+chr2	344623	344655	a	a	+
+chr2	344632	344664	a	a	+
+chr2	344606	344638	b	b	-
+chr2	344617	344649	b	b	-
+chr2	344629	344661	b	b	-
+chr2	344665	344697	b	b	-
+chr2	344665	344697	b	b	-
+chr2	344728	344760	b	b	-
+chr2	344728	344760	b	b	-
+chr2	344880	344912	b	b	-
+chr2	344930	344962	a	a	+
+chr2	345003	345035	a	a	+
+chr2	345003	345035	a	a	+
+chr2	345003	345035	a	a	+
+chr2	345943	345975	a	a	+
+chr2	345971	346003	a	a	+
+chr2	346434	346466	a	a	+
+chr2	346546	346578	a	a	+
+chr2	346863	346895	b	b	-
+chr2	346900	346932	a	a	+
+chr2	346883	346915	b	b	-
+chr2	346917	346949	a	a	+
+chr2	346898	346930	b	b	-
+chr2	346898	346930	b	b	-
+chr2	346915	346947	b	b	-
+chr2	347020	347052	a	a	+
+chr2	347051	347083	a	a	+
+chr2	347074	347106	a	a	+
+chr2	347079	347111	a	a	+
+chr2	347092	347124	b	b	-
+chr2	347190	347222	b	b	-
+chr2	347193	347225	b	b	-
+chr2	347246	347278	a	a	+
+chr2	347246	347278	a	a	+
+chr2	347246	347278	a	a	+
+chr2	347247	347279	a	a	+
+chr2	347247	347279	a	a	+
+chr2	347247	347279	a	a	+
+chr2	347215	347247	b	b	-
+chr2	347217	347249	b	b	-
+chr2	347217	347249	b	b	-
+chr2	347250	347282	a	a	+
+chr2	347223	347255	b	b	-
+chr2	347225	347257	b	b	-
+chr2	347267	347299	a	a	+
+chr2	347242	347274	b	b	-
+chr2	347243	347275	b	b	-
+chr2	347243	347275	b	b	-
+chr2	347246	347278	b	b	-
+chr2	347254	347286	b	b	-
+chr2	347289	347321	a	a	+
+chr2	347819	347851	b	b	-
+chr2	347857	347889	a	a	+
+chr2	347833	347865	b	b	-
+chr2	347957	347989	b	b	-
+chr2	347991	348023	a	a	+
+chr2	347999	348031	a	a	+
+chr2	347970	348002	b	b	-
+chr2	347971	348003	b	b	-
+chr2	347971	348003	b	b	-
+chr2	347975	348007	b	b	-
+chr2	347982	348014	b	b	-
+chr2	347992	348024	b	b	-
+chr2	347999	348031	b	b	-
+chr2	347999	348031	b	b	-
+chr2	348154	348186	a	a	+
+chr2	348173	348205	a	a	+
+chr2	348142	348174	b	b	-
+chr2	348145	348177	b	b	-
+chr2	348178	348210	a	a	+
+chr2	348200	348232	a	a	+
+chr2	348209	348241	a	a	+
+chr2	348181	348213	b	b	-
+chr2	348181	348213	b	b	-
+chr2	348181	348213	b	b	-
+chr2	348337	348369	a	a	+
+chr2	348323	348355	b	b	-
+chr2	348324	348356	b	b	-
+chr2	348324	348356	b	b	-
+chr2	348376	348408	a	a	+
+chr2	348378	348410	a	a	+
+chr2	348386	348418	a	a	+
+chr2	348386	348418	a	a	+
+chr2	348448	348480	b	b	-
+chr2	348507	348539	a	a	+
+chr2	348700	348732	a	a	+
+chr2	348790	348822	b	b	-
+chr2	348790	348822	b	b	-
+chr2	348821	348853	b	b	-
+chr2	349268	349300	b	b	-
+chr2	349295	349327	b	b	-
+chr2	349322	349354	b	b	-
+chr2	349351	349383	b	b	-
+chr2	349442	349474	b	b	-
+chr2	349447	349479	b	b	-
+chr2	349498	349530	a	a	+
+chr2	349498	349530	a	a	+
+chr2	349639	349671	a	a	+
+chr2	349804	349836	a	a	+
+chr2	349822	349854	a	a	+
+chr2	349805	349837	b	b	-
+chr2	349839	349871	a	a	+
+chr2	349944	349976	a	a	+
+chr2	349930	349962	b	b	-
+chr2	349936	349968	b	b	-
+chr2	349936	349968	b	b	-
+chr2	349938	349970	b	b	-
+chr2	349978	350010	a	a	+
+chr2	349978	350010	a	a	+
+chr2	349946	349978	b	b	-
+chr2	349951	349983	b	b	-
+chr2	349972	350004	b	b	-
+chr2	349973	350005	b	b	-
+chr2	350008	350040	a	a	+
+chr2	350010	350042	a	a	+
+chr2	349982	350014	b	b	-
+chr2	350018	350050	a	a	+
+chr2	349992	350024	b	b	-
+chr2	349995	350027	b	b	-
+chr2	350003	350035	b	b	-
+chr2	350003	350035	b	b	-
+chr2	350004	350036	b	b	-
+chr2	350054	350086	a	a	+
+chr2	350068	350100	a	a	+
+chr2	350069	350101	a	a	+
+chr2	350042	350074	b	b	-
+chr2	350044	350076	b	b	-
+chr2	350044	350076	b	b	-
+chr2	350108	350140	b	b	-
+chr2	350175	350207	a	a	+
+chr2	350146	350178	b	b	-
+chr2	350198	350230	a	a	+
+chr2	350198	350230	a	a	+
+chr2	350198	350230	a	a	+
+chr2	350169	350201	b	b	-
+chr2	350170	350202	b	b	-
+chr2	350174	350206	b	b	-
+chr2	350177	350209	b	b	-
+chr2	350184	350216	b	b	-
+chr2	350184	350216	b	b	-
+chr2	350186	350218	b	b	-
+chr2	350201	350233	b	b	-
+chr2	350201	350233	b	b	-
+chr2	350236	350268	a	a	+
+chr2	350237	350269	a	a	+
+chr2	350239	350271	a	a	+
+chr2	350259	350291	a	a	+
+chr2	350259	350291	a	a	+
+chr2	350249	350281	b	b	-
+chr2	350293	350325	b	b	-
+chr2	350342	350374	a	a	+
+chr2	350313	350345	b	b	-
+chr2	350359	350391	a	a	+
+chr2	350352	350384	b	b	-
+chr2	350387	350419	a	a	+
+chr2	350574	350606	b	b	-
+chr2	350650	350682	b	b	-
+chr2	350692	350724	a	a	+
+chr2	351028	351060	b	b	-
+chr2	351065	351097	a	a	+
+chr2	351034	351066	b	b	-
+chr2	351034	351066	b	b	-
+chr2	351034	351066	b	b	-
+chr2	351034	351066	b	b	-
+chr2	351067	351099	a	a	+
+chr2	351067	351099	a	a	+
+chr2	351067	351099	a	a	+
+chr2	351068	351100	a	a	+
+chr2	351068	351100	a	a	+
+chr2	351078	351110	a	a	+
+chr2	351079	351111	a	a	+
+chr2	351066	351098	b	b	-
+chr2	351066	351098	b	b	-
+chr2	351127	351159	a	a	+
+chr2	351201	351233	b	b	-
+chr2	351242	351274	a	a	+
+chr2	351252	351284	b	b	-
+chr2	351288	351320	a	a	+
+chr2	351259	351291	b	b	-
+chr2	351295	351327	a	a	+
+chr2	351305	351337	b	b	-
+chr2	351363	351395	b	b	-
+chr2	351399	351431	b	b	-
+chr2	351434	351466	a	a	+
+chr2	351440	351472	a	a	+
+chr2	351411	351443	b	b	-
+chr2	351411	351443	b	b	-
+chr2	351411	351443	b	b	-
+chr2	351418	351450	b	b	-
+chr2	351418	351450	b	b	-
+chr2	351418	351450	b	b	-
+chr2	351422	351454	b	b	-
+chr2	351465	351497	a	a	+
+chr2	351473	351505	a	a	+
+chr2	351476	351508	a	a	+
+chr2	351444	351476	b	b	-
+chr2	351496	351528	b	b	-
+chr2	351545	351577	a	a	+
+chr2	351567	351599	b	b	-
+chr2	351619	351651	a	a	+
+chr2	351596	351628	b	b	-
+chr2	351597	351629	b	b	-
+chr2	351707	351739	b	b	-
+chr2	351804	351836	a	a	+
+chr2	351784	351816	b	b	-
+chr2	353014	353046	a	a	+
+chr2	353009	353041	b	b	-
+chr2	353110	353142	b	b	-
+chr2	353144	353176	a	a	+
+chr2	353141	353173	b	b	-
+chr2	353192	353224	a	a	+
+chr2	353161	353193	b	b	-
+chr2	353333	353365	a	a	+
+chr2	353304	353336	b	b	-
+chr2	353308	353340	b	b	-
+chr2	353308	353340	b	b	-
+chr2	353345	353377	a	a	+
+chr2	353348	353380	a	a	+
+chr2	353348	353380	a	a	+
+chr2	353349	353381	a	a	+
+chr2	353350	353382	a	a	+
+chr2	353350	353382	a	a	+
+chr2	353350	353382	a	a	+
+chr2	353325	353357	b	b	-
+chr2	353358	353390	a	a	+
+chr2	353361	353393	a	a	+
+chr2	353332	353364	b	b	-
+chr2	353368	353400	a	a	+
+chr2	353344	353376	b	b	-
+chr2	353757	353789	a	a	+
+chr2	353769	353801	a	a	+
+chr2	353753	353785	b	b	-
+chr2	353759	353791	b	b	-
+chr2	353759	353791	b	b	-
+chr2	353909	353941	b	b	-
+chr2	354082	354114	b	b	-
+chr2	354161	354193	a	a	+
+chr2	354615	354647	b	b	-
+chr2	354633	354665	b	b	-
+chr2	354633	354665	b	b	-
+chr2	354754	354786	a	a	+
+chr2	354890	354922	a	a	+
+chr2	355001	355033	b	b	-
+chr2	355001	355033	b	b	-
+chr2	355001	355033	b	b	-
+chr2	355138	355170	b	b	-
+chr2	355649	355681	a	a	+
+chr2	355656	355688	a	a	+
+chr2	355625	355657	b	b	-
+chr2	355661	355693	a	a	+
+chr2	355661	355693	a	a	+
+chr2	355631	355663	b	b	-
+chr2	355631	355663	b	b	-
+chr2	355687	355719	a	a	+
+chr2	355695	355727	a	a	+
+chr2	355695	355727	a	a	+
+chr2	355778	355810	b	b	-
+chr2	355778	355810	b	b	-
+chr2	355779	355811	b	b	-
+chr2	355779	355811	b	b	-
+chr2	355832	355864	a	a	+
+chr2	355806	355838	b	b	-
+chr2	355824	355856	b	b	-
+chr2	355878	355910	a	a	+
+chr2	355914	355946	b	b	-
+chr2	355965	355997	a	a	+
+chr2	355970	356002	a	a	+
+chr2	355970	356002	a	a	+
+chr2	355970	356002	a	a	+
+chr2	355974	356006	a	a	+
+chr2	355942	355974	b	b	-
+chr2	355975	356007	a	a	+
+chr2	355975	356007	a	a	+
+chr2	355986	356018	a	a	+
+chr2	355986	356018	a	a	+
+chr2	355988	356020	a	a	+
+chr2	355959	355991	b	b	-
+chr2	355961	355993	b	b	-
+chr2	355961	355993	b	b	-
+chr2	355961	355993	b	b	-
+chr2	355961	355993	b	b	-
+chr2	355995	356027	a	a	+
+chr2	355995	356027	a	a	+
+chr2	355966	355998	b	b	-
+chr2	355966	355998	b	b	-
+chr2	355969	356001	b	b	-
+chr2	355971	356003	b	b	-
+chr2	356006	356038	a	a	+
+chr2	356007	356039	a	a	+
+chr2	356007	356039	a	a	+
+chr2	356007	356039	a	a	+
+chr2	355975	356007	b	b	-
+chr2	356008	356040	a	a	+
+chr2	356008	356040	a	a	+
+chr2	356008	356040	a	a	+
+chr2	356008	356040	a	a	+
+chr2	356008	356040	a	a	+
+chr2	355976	356008	b	b	-
+chr2	355977	356009	b	b	-
+chr2	355977	356009	b	b	-
+chr2	356018	356050	a	a	+
+chr2	355987	356019	b	b	-
+chr2	355988	356020	b	b	-
+chr2	355988	356020	b	b	-
+chr2	355992	356024	b	b	-
+chr2	355994	356026	b	b	-
+chr2	356027	356059	a	a	+
+chr2	356029	356061	a	a	+
+chr2	355999	356031	b	b	-
+chr2	356000	356032	b	b	-
+chr2	356000	356032	b	b	-
+chr2	356003	356035	b	b	-
+chr2	356041	356073	a	a	+
+chr2	356011	356043	b	b	-
+chr2	356012	356044	b	b	-
+chr2	356069	356101	a	a	+
+chr2	356362	356394	b	b	-
+chr2	356414	356446	a	a	+
+chr2	356398	356430	b	b	-
+chr2	356436	356468	a	a	+
+chr2	356444	356476	b	b	-
+chr2	356486	356518	b	b	-
+chr2	356486	356518	b	b	-
+chr2	356506	356538	b	b	-
+chr2	356506	356538	b	b	-
+chr2	356506	356538	b	b	-
+chr2	356506	356538	b	b	-
+chr2	356510	356542	b	b	-
+chr2	356513	356545	b	b	-
+chr2	356516	356548	b	b	-
+chr2	356518	356550	b	b	-
+chr2	356518	356550	b	b	-
+chr2	356521	356553	b	b	-
+chr2	356522	356554	b	b	-
+chr2	356558	356590	a	a	+
+chr2	356558	356590	a	a	+
+chr2	356559	356591	a	a	+
+chr2	356559	356591	a	a	+
+chr2	356559	356591	a	a	+
+chr2	356566	356598	a	a	+
+chr2	356535	356567	b	b	-
+chr2	356568	356600	a	a	+
+chr2	356569	356601	a	a	+
+chr2	356537	356569	b	b	-
+chr2	356570	356602	a	a	+
+chr2	356570	356602	a	a	+
+chr2	356571	356603	a	a	+
+chr2	356571	356603	a	a	+
+chr2	356571	356603	a	a	+
+chr2	356571	356603	a	a	+
+chr2	356571	356603	a	a	+
+chr2	356539	356571	b	b	-
+chr2	356544	356576	b	b	-
+chr2	356544	356576	b	b	-
+chr2	356577	356609	a	a	+
+chr2	356577	356609	a	a	+
+chr2	356577	356609	a	a	+
+chr2	356548	356580	b	b	-
+chr2	356548	356580	b	b	-
+chr2	356561	356593	b	b	-
+chr2	356561	356593	b	b	-
+chr2	356561	356593	b	b	-
+chr2	356561	356593	b	b	-
+chr2	356613	356645	a	a	+
+chr2	356816	356848	b	b	-
+chr2	356819	356851	b	b	-
+chr2	356843	356875	b	b	-
+chr2	356853	356885	b	b	-
+chr2	356903	356935	a	a	+
+chr2	356888	356920	b	b	-
+chr2	356994	357026	a	a	+
+chr2	356972	357004	b	b	-
+chr2	357019	357051	a	a	+
+chr2	357032	357064	a	a	+
+chr2	357001	357033	b	b	-
+chr2	357047	357079	a	a	+
+chr2	357118	357150	a	a	+
+chr2	357161	357193	a	a	+
+chr2	358052	358084	a	a	+
+chr2	358200	358232	a	a	+
+chr2	358356	358388	a	a	+
+chr2	358382	358414	a	a	+
+chr2	358609	358641	b	b	-
+chr2	358696	358728	a	a	+
+chr2	358868	358900	a	a	+
+chr2	359457	359489	a	a	+
+chr2	359869	359901	b	b	-
+chr2	360090	360122	a	a	+
+chr2	360101	360133	a	a	+
+chr2	360102	360134	a	a	+
+chr2	360102	360134	a	a	+
+chr2	360182	360214	b	b	-
+chr2	360235	360267	a	a	+
+chr2	360238	360270	a	a	+
+chr2	360241	360273	a	a	+
+chr2	360241	360273	a	a	+
+chr2	360241	360273	a	a	+
+chr2	360224	360256	b	b	-
+chr2	360224	360256	b	b	-
+chr2	360260	360292	a	a	+
+chr2	360260	360292	a	a	+
+chr2	360228	360260	b	b	-
+chr2	360263	360295	a	a	+
+chr2	360263	360295	a	a	+
+chr2	360263	360295	a	a	+
+chr2	360265	360297	a	a	+
+chr2	360265	360297	a	a	+
+chr2	360265	360297	a	a	+
+chr2	360265	360297	a	a	+
+chr2	360236	360268	b	b	-
+chr2	360236	360268	b	b	-
+chr2	360236	360268	b	b	-
+chr2	360236	360268	b	b	-
+chr2	360236	360268	b	b	-
+chr2	360236	360268	b	b	-
+chr2	360236	360268	b	b	-
+chr2	360237	360269	b	b	-
+chr2	360237	360269	b	b	-
+chr2	360272	360304	a	a	+
+chr2	360241	360273	b	b	-
+chr2	360275	360307	a	a	+
+chr2	360276	360308	a	a	+
+chr2	360276	360308	a	a	+
+chr2	360244	360276	b	b	-
+chr2	360277	360309	a	a	+
+chr2	360280	360312	a	a	+
+chr2	360250	360282	b	b	-
+chr2	360283	360315	a	a	+
+chr2	360284	360316	a	a	+
+chr2	360284	360316	a	a	+
+chr2	360284	360316	a	a	+
+chr2	360284	360316	a	a	+
+chr2	360285	360317	a	a	+
+chr2	360285	360317	a	a	+
+chr2	360285	360317	a	a	+
+chr2	360287	360319	a	a	+
+chr2	360257	360289	b	b	-
+chr2	360266	360298	b	b	-
+chr2	360269	360301	b	b	-
+chr2	360307	360339	a	a	+
+chr2	360287	360319	b	b	-
+chr2	360608	360640	b	b	-
+chr2	360619	360651	b	b	-
+chr2	360623	360655	b	b	-
+chr2	360656	360688	a	a	+
+chr2	360627	360659	b	b	-
+chr2	360664	360696	a	a	+
+chr2	360665	360697	a	a	+
+chr2	360634	360666	b	b	-
+chr2	360669	360701	a	a	+
+chr2	360670	360702	a	a	+
+chr2	360676	360708	a	a	+
+chr2	360676	360708	a	a	+
+chr2	360676	360708	a	a	+
+chr2	360678	360710	a	a	+
+chr2	360679	360711	a	a	+
+chr2	360648	360680	b	b	-
+chr2	360649	360681	b	b	-
+chr2	360649	360681	b	b	-
+chr2	360689	360721	a	a	+
+chr2	360790	360822	b	b	-
+chr2	360790	360822	b	b	-
+chr2	360791	360823	b	b	-
+chr2	360791	360823	b	b	-
+chr2	360791	360823	b	b	-
+chr2	360843	360875	a	a	+
+chr2	360848	360880	a	a	+
+chr2	360831	360863	b	b	-
+chr2	360933	360965	b	b	-
+chr2	360993	361025	a	a	+
+chr2	361046	361078	a	a	+
+chr2	361221	361253	a	a	+
+chr2	361231	361263	b	b	-
+chr2	361231	361263	b	b	-
+chr2	361231	361263	b	b	-
+chr2	361403	361435	b	b	-
+chr2	361504	361536	a	a	+
+chr2	362058	362090	a	a	+
+chr2	362038	362070	b	b	-
+chr2	362154	362186	b	b	-
+chr2	362219	362251	b	b	-
+chr2	362389	362421	a	a	+
+chr2	362391	362423	a	a	+
+chr2	362391	362423	a	a	+
+chr2	362370	362402	b	b	-
+chr2	362370	362402	b	b	-
+chr2	362371	362403	b	b	-
+chr2	362375	362407	b	b	-
+chr2	362532	362564	b	b	-
+chr2	362565	362597	b	b	-
+chr2	362853	362885	a	a	+
+chr2	362855	362887	a	a	+
+chr2	362855	362887	a	a	+
+chr2	362860	362892	a	a	+
+chr2	362860	362892	a	a	+
+chr2	362832	362864	b	b	-
+chr2	362865	362897	a	a	+
+chr2	362836	362868	b	b	-
+chr2	362836	362868	b	b	-
+chr2	362869	362901	a	a	+
+chr2	362869	362901	a	a	+
+chr2	362870	362902	a	a	+
+chr2	362839	362871	b	b	-
+chr2	362839	362871	b	b	-
+chr2	362875	362907	a	a	+
+chr2	362845	362877	b	b	-
+chr2	362847	362879	b	b	-
+chr2	362880	362912	a	a	+
+chr2	362881	362913	a	a	+
+chr2	362881	362913	a	a	+
+chr2	362881	362913	a	a	+
+chr2	362881	362913	a	a	+
+chr2	362881	362913	a	a	+
+chr2	362882	362914	a	a	+
+chr2	362882	362914	a	a	+
+chr2	362882	362914	a	a	+
+chr2	362882	362914	a	a	+
+chr2	362882	362914	a	a	+
+chr2	362850	362882	b	b	-
+chr2	362850	362882	b	b	-
+chr2	362850	362882	b	b	-
+chr2	362850	362882	b	b	-
+chr2	362852	362884	b	b	-
+chr2	362886	362918	a	a	+
+chr2	362858	362890	b	b	-
+chr2	362858	362890	b	b	-
+chr2	362860	362892	b	b	-
+chr2	362860	362892	b	b	-
+chr2	362860	362892	b	b	-
+chr2	362860	362892	b	b	-
+chr2	362860	362892	b	b	-
+chr2	362861	362893	b	b	-
+chr2	362861	362893	b	b	-
+chr2	362861	362893	b	b	-
+chr2	362894	362926	a	a	+
+chr2	362894	362926	a	a	+
+chr2	362894	362926	a	a	+
+chr2	362866	362898	b	b	-
+chr2	362904	362936	a	a	+
+chr2	362881	362913	b	b	-
+chr2	362918	362950	a	a	+
+chr2	362926	362958	a	a	+
+chr2	362941	362973	a	a	+
+chr2	363025	363057	b	b	-
+chr2	363025	363057	b	b	-
+chr2	363028	363060	b	b	-
+chr2	363028	363060	b	b	-
+chr2	363028	363060	b	b	-
+chr2	363064	363096	a	a	+
+chr2	363077	363109	a	a	+
+chr2	363260	363292	a	a	+
+chr2	363287	363319	a	a	+
+chr2	363332	363364	b	b	-
+chr2	363359	363391	b	b	-
+chr2	363468	363500	a	a	+
+chr2	363505	363537	a	a	+
+chr2	363510	363542	a	a	+
+chr2	363831	363863	a	a	+
+chr2	363851	363883	b	b	-
+chr2	364545	364577	a	a	+
+chr2	364790	364822	b	b	-
+chr2	364793	364825	b	b	-
+chr2	364841	364873	a	a	+
+chr2	364860	364892	a	a	+
+chr2	364870	364902	a	a	+
+chr2	365017	365049	a	a	+
+chr2	365056	365088	a	a	+
+chr2	365056	365088	a	a	+
+chr2	365145	365177	a	a	+
+chr2	365147	365179	b	b	-
+chr2	365151	365183	b	b	-
+chr2	365298	365330	a	a	+
+chr2	365496	365528	a	a	+
+chr2	365500	365532	b	b	-
+chr2	365544	365576	a	a	+
+chr2	365515	365547	b	b	-
+chr2	365549	365581	b	b	-
+chr2	365648	365680	a	a	+
+chr2	365651	365683	a	a	+
+chr2	365626	365658	b	b	-
+chr2	365661	365693	a	a	+
+chr2	365629	365661	b	b	-
+chr2	365664	365696	a	a	+
+chr2	365675	365707	a	a	+
+chr2	365644	365676	b	b	-
+chr2	365651	365683	b	b	-
+chr2	365686	365718	a	a	+
+chr2	365686	365718	a	a	+
+chr2	365659	365691	b	b	-
+chr2	365661	365693	b	b	-
+chr2	365694	365726	a	a	+
+chr2	365713	365745	a	a	+
+chr2	365730	365762	a	a	+
+chr2	365746	365778	b	b	-
+chr2	365928	365960	a	a	+
+chr2	365913	365945	b	b	-
+chr2	366050	366082	b	b	-
+chr2	366056	366088	b	b	-
+chr2	366056	366088	b	b	-
+chr2	366092	366124	a	a	+
+chr2	366096	366128	a	a	+
+chr2	366089	366121	b	b	-
+chr2	366384	366416	a	a	+
+chr2	366416	366448	a	a	+
+chr2	366701	366733	a	a	+
+chr2	366745	366777	b	b	-
+chr2	366746	366778	b	b	-
+chr2	366746	366778	b	b	-
+chr2	366746	366778	b	b	-
+chr2	366746	366778	b	b	-
+chr2	366746	366778	b	b	-
+chr2	366746	366778	b	b	-
+chr2	366750	366782	b	b	-
+chr2	366784	366816	a	a	+
+chr2	366784	366816	a	a	+
+chr2	366784	366816	a	a	+
+chr2	366792	366824	a	a	+
+chr2	366812	366844	a	a	+
+chr2	366819	366851	a	a	+
+chr2	366850	366882	a	a	+
+chr2	366850	366882	a	a	+
+chr2	367133	367165	a	a	+
+chr2	367105	367137	b	b	-
+chr2	367154	367186	a	a	+
+chr2	367155	367187	a	a	+
+chr2	367421	367453	a	a	+
+chr2	367422	367454	b	b	-
+chr2	367716	367748	a	a	+
+chr2	367862	367894	b	b	-
+chr2	367880	367912	b	b	-
+chr2	368480	368512	a	a	+
+chr2	368482	368514	a	a	+
+chr2	368458	368490	b	b	-
+chr2	368461	368493	b	b	-
+chr2	368471	368503	b	b	-
+chr2	368534	368566	b	b	-
+chr2	368758	368790	a	a	+
+chr2	368841	368873	b	b	-
+chr2	369146	369178	b	b	-
+chr2	369185	369217	a	a	+
+chr2	369298	369330	b	b	-
+chr2	369339	369371	a	a	+
+chr2	369321	369353	b	b	-
+chr2	369334	369366	b	b	-
+chr2	369412	369444	a	a	+
+chr2	369501	369533	a	a	+
+chr2	369469	369501	b	b	-
+chr2	369472	369504	b	b	-
+chr2	369488	369520	b	b	-
+chr2	369545	369577	a	a	+
+chr2	369613	369645	b	b	-
+chr2	369647	369679	a	a	+
+chr2	369624	369656	b	b	-
+chr2	369628	369660	b	b	-
+chr2	369637	369669	b	b	-
+chr2	369686	369718	a	a	+
+chr2	369686	369718	a	a	+
+chr2	369686	369718	a	a	+
+chr2	369687	369719	a	a	+
+chr2	369687	369719	a	a	+
+chr2	369687	369719	a	a	+
+chr2	369687	369719	a	a	+
+chr2	369655	369687	b	b	-
+chr2	369655	369687	b	b	-
+chr2	369658	369690	b	b	-
+chr2	369659	369691	b	b	-
+chr2	369659	369691	b	b	-
+chr2	369660	369692	b	b	-
+chr2	369718	369750	a	a	+
+chr2	369719	369751	a	a	+
+chr2	369746	369778	a	a	+
+chr2	369971	370003	a	a	+
+chr2	369956	369988	b	b	-
+chr2	369990	370022	a	a	+
+chr2	369962	369994	b	b	-
+chr2	369964	369996	b	b	-
+chr2	369974	370006	b	b	-
+chr2	370017	370049	a	a	+
+chr2	369986	370018	b	b	-
+chr2	370013	370045	b	b	-
+chr2	370126	370158	b	b	-
+chr2	370126	370158	b	b	-
+chr2	370187	370219	a	a	+
+chr2	370155	370187	b	b	-
+chr2	370155	370187	b	b	-
+chr2	370155	370187	b	b	-
+chr2	370155	370187	b	b	-
+chr2	370155	370187	b	b	-
+chr2	370155	370187	b	b	-
+chr2	370157	370189	b	b	-
+chr2	370308	370340	a	a	+
+chr2	370372	370404	b	b	-
+chr2	370389	370421	b	b	-
+chr2	370438	370470	b	b	-
+chr2	370578	370610	a	a	+
+chr2	370551	370583	b	b	-
+chr2	370575	370607	b	b	-
+chr2	370575	370607	b	b	-
+chr2	370617	370649	a	a	+
+chr2	370667	370699	b	b	-
+chr2	370829	370861	a	a	+
+chr2	370893	370925	b	b	-
+chr2	370937	370969	a	a	+
+chr2	370943	370975	a	a	+
+chr2	370947	370979	a	a	+
+chr2	370918	370950	b	b	-
+chr2	371106	371138	a	a	+
+chr2	371106	371138	a	a	+
+chr2	371516	371548	b	b	-
+chr2	371827	371859	b	b	-
+chr2	371890	371922	a	a	+
+chr2	371871	371903	b	b	-
+chr2	371923	371955	a	a	+
+chr2	372122	372154	b	b	-
+chr2	372232	372264	a	a	+
+chr2	372296	372328	a	a	+
+chr2	372386	372418	b	b	-
+chr2	372386	372418	b	b	-
+chr2	372386	372418	b	b	-
+chr2	372386	372418	b	b	-
+chr2	372386	372418	b	b	-
+chr2	372386	372418	b	b	-
+chr2	372422	372454	b	b	-
+chr2	372650	372682	a	a	+
+chr2	372817	372849	b	b	-
+chr2	372854	372886	a	a	+
+chr2	372854	372886	a	a	+
+chr2	372854	372886	a	a	+
+chr2	372863	372895	a	a	+
+chr2	373055	373087	a	a	+
+chr2	373027	373059	b	b	-
+chr2	373075	373107	b	b	-
+chr2	373118	373150	a	a	+
+chr2	373176	373208	a	a	+
+chr2	373434	373466	b	b	-
+chr2	373489	373521	a	a	+
+chr2	373752	373784	b	b	-
+chr2	374039	374071	b	b	-
+chr2	374113	374145	a	a	+
+chr2	374279	374311	a	a	+
+chr2	374279	374311	a	a	+
+chr2	374311	374343	b	b	-
+chr2	374886	374918	a	a	+
+chr2	375279	375311	b	b	-
+chr2	376849	376881	b	b	-
+chr2	377631	377663	a	a	+
+chr2	378197	378229	b	b	-
+chr2	378274	378306	b	b	-
+chr2	379147	379179	a	a	+
+chr2	379146	379178	b	b	-
+chr2	379179	379211	b	b	-
+chr2	379313	379345	a	a	+
+chr2	379318	379350	b	b	-
+chr2	379472	379504	a	a	+
+chr2	379471	379503	b	b	-
+chr2	379577	379609	b	b	-
+chr2	379622	379654	a	a	+
+chr2	379630	379662	b	b	-
+chr2	379715	379747	b	b	-
+chr2	379787	379819	a	a	+
+chr2	379799	379831	a	a	+
+chr2	379895	379927	a	a	+
+chr2	379867	379899	b	b	-
+chr2	379901	379933	a	a	+
+chr2	379876	379908	b	b	-
+chr2	379943	379975	a	a	+
+chr2	379957	379989	a	a	+
+chr2	379926	379958	b	b	-
+chr2	379926	379958	b	b	-
+chr2	379967	379999	a	a	+
+chr2	379968	380000	a	a	+
+chr2	379971	380003	a	a	+
+chr2	379941	379973	b	b	-
+chr2	379961	379993	b	b	-
+chr2	379962	379994	b	b	-
+chr2	379962	379994	b	b	-
+chr2	380175	380207	b	b	-
+chr2	380189	380221	b	b	-
+chr2	380232	380264	a	a	+
+chr2	380241	380273	a	a	+
+chr2	380241	380273	a	a	+
+chr2	380210	380242	b	b	-
+chr2	380210	380242	b	b	-
+chr2	380244	380276	a	a	+
+chr2	380260	380292	a	a	+
+chr2	380275	380307	a	a	+
+chr2	380409	380441	b	b	-
+chr2	380487	380519	b	b	-
+chr2	380487	380519	b	b	-
+chr2	380696	380728	b	b	-
+chr2	380697	380729	b	b	-
+chr2	380741	380773	a	a	+
+chr2	380761	380793	a	a	+
+chr2	380769	380801	a	a	+
+chr2	380741	380773	b	b	-
+chr2	380745	380777	b	b	-
+chr2	380921	380953	a	a	+
+chr2	380921	380953	a	a	+
+chr2	380936	380968	b	b	-
+chr2	381015	381047	b	b	-
+chr2	381049	381081	a	a	+
+chr2	381029	381061	b	b	-
+chr2	381029	381061	b	b	-
+chr2	381031	381063	b	b	-
+chr2	381034	381066	b	b	-
+chr2	381041	381073	b	b	-
+chr2	381093	381125	a	a	+
+chr2	381120	381152	a	a	+
+chr2	381239	381271	a	a	+
+chr2	381379	381411	a	a	+
+chr2	381418	381450	b	b	-
+chr2	381469	381501	a	a	+
+chr2	381441	381473	b	b	-
+chr2	381480	381512	a	a	+
+chr2	381480	381512	a	a	+
+chr2	381480	381512	a	a	+
+chr2	381448	381480	b	b	-
+chr2	381474	381506	b	b	-
+chr2	381474	381506	b	b	-
+chr2	381611	381643	b	b	-
+chr2	381613	381645	b	b	-
+chr2	381687	381719	a	a	+
+chr2	381666	381698	b	b	-
+chr2	381667	381699	b	b	-
+chr2	381700	381732	a	a	+
+chr2	381754	381786	a	a	+
+chr2	381820	381852	a	a	+
+chr2	381827	381859	a	a	+
+chr2	381827	381859	a	a	+
+chr2	381827	381859	a	a	+
+chr2	381828	381860	a	a	+
+chr2	381811	381843	b	b	-
+chr2	381817	381849	b	b	-
+chr2	381850	381882	a	a	+
+chr2	381850	381882	a	a	+
+chr2	381818	381850	b	b	-
+chr2	381818	381850	b	b	-
+chr2	381856	381888	a	a	+
+chr2	381857	381889	a	a	+
+chr2	381825	381857	b	b	-
+chr2	381858	381890	a	a	+
+chr2	381830	381862	b	b	-
+chr2	381834	381866	b	b	-
+chr2	381870	381902	a	a	+
+chr2	382001	382033	b	b	-
+chr2	382010	382042	b	b	-
+chr2	382057	382089	a	a	+
+chr2	382132	382164	a	a	+
+chr2	382125	382157	b	b	-
+chr2	382126	382158	b	b	-
+chr2	382170	382202	a	a	+
+chr2	382170	382202	a	a	+
+chr2	382180	382212	a	a	+
+chr2	382189	382221	a	a	+
+chr2	382189	382221	a	a	+
+chr2	382189	382221	a	a	+
+chr2	382190	382222	a	a	+
+chr2	382167	382199	b	b	-
+chr2	382170	382202	b	b	-
+chr2	382179	382211	b	b	-
+chr2	382185	382217	b	b	-
+chr2	382186	382218	b	b	-
+chr2	382261	382293	b	b	-
+chr2	382280	382312	b	b	-
+chr2	382288	382320	b	b	-
+chr2	382296	382328	b	b	-
+chr2	382296	382328	b	b	-
+chr2	382316	382348	b	b	-
+chr2	382332	382364	b	b	-
+chr2	382367	382399	a	a	+
+chr2	382369	382401	a	a	+
+chr2	382369	382401	a	a	+
+chr2	382371	382403	a	a	+
+chr2	382407	382439	a	a	+
+chr2	382479	382511	a	a	+
+chr2	382462	382494	b	b	-
+chr2	382462	382494	b	b	-
+chr2	382496	382528	a	a	+
+chr2	382471	382503	b	b	-
+chr2	382517	382549	a	a	+
+chr2	382521	382553	a	a	+
+chr2	382522	382554	a	a	+
+chr2	382525	382557	a	a	+
+chr2	382533	382565	a	a	+
+chr2	382534	382566	a	a	+
+chr2	382502	382534	b	b	-
+chr2	382502	382534	b	b	-
+chr2	382536	382568	a	a	+
+chr2	382504	382536	b	b	-
+chr2	382504	382536	b	b	-
+chr2	382539	382571	a	a	+
+chr2	382544	382576	a	a	+
+chr2	382512	382544	b	b	-
+chr2	382545	382577	a	a	+
+chr2	382545	382577	a	a	+
+chr2	382513	382545	b	b	-
+chr2	382513	382545	b	b	-
+chr2	382584	382616	a	a	+
+chr2	382660	382692	a	a	+
+chr2	382671	382703	a	a	+
+chr2	382674	382706	a	a	+
+chr2	382683	382715	a	a	+
+chr2	382683	382715	a	a	+
+chr2	382683	382715	a	a	+
+chr2	382687	382719	a	a	+
+chr2	382692	382724	a	a	+
+chr2	382662	382694	b	b	-
+chr2	382695	382727	a	a	+
+chr2	382668	382700	b	b	-
+chr2	382669	382701	b	b	-
+chr2	382704	382736	a	a	+
+chr2	382711	382743	a	a	+
+chr2	382711	382743	a	a	+
+chr2	382711	382743	a	a	+
+chr2	382686	382718	b	b	-
+chr2	382729	382761	a	a	+
+chr2	382730	382762	a	a	+
+chr2	382864	382896	a	a	+
+chr2	382864	382896	a	a	+
+chr2	382864	382896	a	a	+
+chr2	382871	382903	a	a	+
+chr2	382839	382871	b	b	-
+chr2	382842	382874	b	b	-
+chr2	382843	382875	b	b	-
+chr2	382843	382875	b	b	-
+chr2	382843	382875	b	b	-
+chr2	382881	382913	a	a	+
+chr2	382885	382917	a	a	+
+chr2	382859	382891	b	b	-
+chr2	382860	382892	b	b	-
+chr2	382860	382892	b	b	-
+chr2	382894	382926	a	a	+
+chr2	382894	382926	a	a	+
+chr2	382894	382926	a	a	+
+chr2	382894	382926	a	a	+
+chr2	382863	382895	b	b	-
+chr2	382863	382895	b	b	-
+chr2	382864	382896	b	b	-
+chr2	382899	382931	a	a	+
+chr2	382876	382908	b	b	-
+chr2	382882	382914	b	b	-
+chr2	382883	382915	b	b	-
+chr2	382883	382915	b	b	-
+chr2	382922	382954	a	a	+
+chr2	382922	382954	a	a	+
+chr2	383076	383108	b	b	-
+chr2	383100	383132	b	b	-
+chr2	383111	383143	b	b	-
+chr2	383111	383143	b	b	-
+chr2	383149	383181	a	a	+
+chr2	383149	383181	a	a	+
+chr2	383161	383193	a	a	+
+chr2	383162	383194	a	a	+
+chr2	383133	383165	b	b	-
+chr2	383133	383165	b	b	-
+chr2	383167	383199	a	a	+
+chr2	383168	383200	a	a	+
+chr2	383168	383200	a	a	+
+chr2	383137	383169	b	b	-
+chr2	383175	383207	a	a	+
+chr2	383145	383177	b	b	-
+chr2	383145	383177	b	b	-
+chr2	383145	383177	b	b	-
+chr2	383180	383212	a	a	+
+chr2	383180	383212	a	a	+
+chr2	383180	383212	a	a	+
+chr2	383180	383212	a	a	+
+chr2	383148	383180	b	b	-
+chr2	383181	383213	a	a	+
+chr2	383157	383189	b	b	-
+chr2	383190	383222	a	a	+
+chr2	383190	383222	a	a	+
+chr2	383158	383190	b	b	-
+chr2	383191	383223	a	a	+
+chr2	383191	383223	a	a	+
+chr2	383191	383223	a	a	+
+chr2	383192	383224	a	a	+
+chr2	383192	383224	a	a	+
+chr2	383160	383192	b	b	-
+chr2	383161	383193	b	b	-
+chr2	383163	383195	b	b	-
+chr2	383172	383204	b	b	-
+chr2	383180	383212	b	b	-
+chr2	383290	383322	b	b	-
+chr2	383327	383359	a	a	+
+chr2	383332	383364	a	a	+
+chr2	383343	383375	a	a	+
+chr2	383343	383375	a	a	+
+chr2	383350	383382	a	a	+
+chr2	383350	383382	a	a	+
+chr2	383320	383352	b	b	-
+chr2	383353	383385	a	a	+
+chr2	383478	383510	b	b	-
+chr2	383480	383512	b	b	-
+chr2	383513	383545	a	a	+
+chr2	383525	383557	a	a	+
+chr2	383509	383541	b	b	-
+chr2	383673	383705	a	a	+
+chr2	383676	383708	a	a	+
+chr2	383705	383737	a	a	+
+chr2	383859	383891	b	b	-
+chr2	383955	383987	b	b	-
+chr2	383955	383987	b	b	-
+chr2	384298	384330	b	b	-
+chr2	384447	384479	b	b	-
+chr2	384721	384753	a	a	+
+chr2	385221	385253	b	b	-
+chr2	385240	385272	b	b	-
+chr2	385323	385355	a	a	+
+chr2	385382	385414	a	a	+
+chr2	385417	385449	b	b	-
+chr2	385458	385490	b	b	-
+chr2	385736	385768	a	a	+
+chr2	385810	385842	b	b	-
+chr2	385854	385886	a	a	+
+chr2	385867	385899	a	a	+
+chr2	385878	385910	b	b	-
+chr2	385912	385944	a	a	+
+chr2	386003	386035	b	b	-
+chr2	386043	386075	a	a	+
+chr2	386026	386058	b	b	-
+chr2	386089	386121	a	a	+
+chr2	386310	386342	a	a	+
+chr2	386423	386455	b	b	-
+chr2	386435	386467	b	b	-
+chr2	386460	386492	b	b	-
+chr2	386499	386531	a	a	+
+chr2	386632	386664	a	a	+
+chr2	386748	386780	a	a	+
+chr2	386767	386799	a	a	+
+chr2	386771	386803	a	a	+
+chr2	386809	386841	a	a	+
+chr2	386913	386945	b	b	-
+chr2	387063	387095	b	b	-
+chr2	387391	387423	b	b	-
+chr2	387394	387426	b	b	-
+chr2	387431	387463	a	a	+
+chr2	387559	387591	a	a	+
+chr2	387574	387606	a	a	+
+chr2	387821	387853	a	a	+
+chr2	387879	387911	b	b	-
+chr2	388046	388078	b	b	-
+chr2	388225	388257	b	b	-
+chr2	388634	388666	b	b	-
+chr2	388634	388666	b	b	-
+chr2	388955	388987	a	a	+
+chr2	389396	389428	a	a	+
+chr2	389370	389402	b	b	-
+chr2	389421	389453	a	a	+
+chr2	389434	389466	a	a	+
+chr2	389516	389548	a	a	+
+chr2	389830	389862	b	b	-
+chr2	389886	389918	a	a	+
+chr2	389886	389918	a	a	+
+chr2	389914	389946	a	a	+
+chr2	390095	390127	a	a	+
+chr2	390145	390177	a	a	+
+chr2	390145	390177	a	a	+
+chr2	390145	390177	a	a	+
+chr2	390116	390148	b	b	-
+chr2	390116	390148	b	b	-
+chr2	390116	390148	b	b	-
+chr2	390116	390148	b	b	-
+chr2	390301	390333	a	a	+
+chr2	390301	390333	a	a	+
+chr2	390269	390301	b	b	-
+chr2	390314	390346	a	a	+
+chr2	390462	390494	b	b	-
+chr2	390466	390498	b	b	-
+chr2	390593	390625	b	b	-
+chr2	390686	390718	a	a	+
+chr2	390746	390778	b	b	-
+chr2	390794	390826	a	a	+
+chr2	390772	390804	b	b	-
+chr2	390974	391006	a	a	+
+chr2	390944	390976	b	b	-
+chr2	391085	391117	b	b	-
+chr2	391143	391175	b	b	-
+chr2	391144	391176	b	b	-
+chr2	391250	391282	b	b	-
+chr2	391320	391352	b	b	-
+chr2	391405	391437	a	a	+
+chr2	391413	391445	a	a	+
+chr2	391440	391472	a	a	+
+chr2	391414	391446	b	b	-
+chr2	391414	391446	b	b	-
+chr2	391414	391446	b	b	-
+chr2	391414	391446	b	b	-
+chr2	391414	391446	b	b	-
+chr2	391466	391498	a	a	+
+chr2	391559	391591	b	b	-
+chr2	391580	391612	b	b	-
+chr2	391614	391646	a	a	+
+chr2	391623	391655	a	a	+
+chr2	391623	391655	a	a	+
+chr2	391623	391655	a	a	+
+chr2	391623	391655	a	a	+
+chr2	391623	391655	a	a	+
+chr2	391623	391655	a	a	+
+chr2	391623	391655	a	a	+
+chr2	391624	391656	a	a	+
+chr2	391597	391629	b	b	-
+chr2	391597	391629	b	b	-
+chr2	391598	391630	b	b	-
+chr2	391632	391664	a	a	+
+chr2	391632	391664	a	a	+
+chr2	391636	391668	a	a	+
+chr2	391605	391637	b	b	-
+chr2	391626	391658	b	b	-
+chr2	391867	391899	a	a	+
+chr2	391868	391900	a	a	+
+chr2	391879	391911	a	a	+
+chr2	391848	391880	b	b	-
+chr2	391896	391928	b	b	-
+chr2	391917	391949	b	b	-
+chr2	392100	392132	b	b	-
+chr2	392141	392173	a	a	+
+chr2	392141	392173	a	a	+
+chr2	392141	392173	a	a	+
+chr2	392202	392234	b	b	-
+chr2	392255	392287	a	a	+
+chr2	392256	392288	a	a	+
+chr2	392256	392288	a	a	+
+chr2	392233	392265	b	b	-
+chr2	392268	392300	a	a	+
+chr2	392271	392303	a	a	+
+chr2	392247	392279	b	b	-
+chr2	392284	392316	a	a	+
+chr2	392252	392284	b	b	-
+chr2	392252	392284	b	b	-
+chr2	392254	392286	b	b	-
+chr2	392254	392286	b	b	-
+chr2	392254	392286	b	b	-
+chr2	392303	392335	a	a	+
+chr2	392272	392304	b	b	-
+chr2	392780	392812	a	a	+
+chr2	392788	392820	b	b	-
+chr2	392840	392872	b	b	-
+chr2	393105	393137	b	b	-
+chr2	393108	393140	b	b	-
+chr2	393159	393191	a	a	+
+chr2	393185	393217	a	a	+
+chr2	393191	393223	a	a	+
+chr2	393500	393532	a	a	+
+chr2	393501	393533	a	a	+
+chr2	393563	393595	a	a	+
+chr2	393769	393801	b	b	-
+chr2	393793	393825	b	b	-
+chr2	393949	393981	b	b	-
+chr2	394118	394150	b	b	-
+chr2	394450	394482	b	b	-
+chr2	394636	394668	a	a	+
+chr2	395143	395175	a	a	+
+chr2	395144	395176	a	a	+
+chr2	396004	396036	a	a	+
+chr2	396004	396036	a	a	+
+chr2	396103	396135	b	b	-
+chr2	396375	396407	b	b	-
+chr2	397549	397581	b	b	-
+chr2	397549	397581	b	b	-
+chr2	397818	397850	a	a	+
+chr2	397965	397997	a	a	+
+chr2	397965	397997	a	a	+
+chr2	398119	398151	a	a	+
+chr2	398209	398241	b	b	-
+chr2	398213	398245	b	b	-
+chr2	398213	398245	b	b	-
+chr2	398214	398246	b	b	-
+chr2	398247	398279	a	a	+
+chr2	398247	398279	a	a	+
+chr2	398249	398281	a	a	+
+chr2	398250	398282	a	a	+
+chr2	398250	398282	a	a	+
+chr2	398250	398282	a	a	+
+chr2	398253	398285	a	a	+
+chr2	398221	398253	b	b	-
+chr2	398221	398253	b	b	-
+chr2	398221	398253	b	b	-
+chr2	398262	398294	a	a	+
+chr2	398264	398296	a	a	+
+chr2	398311	398343	a	a	+
+chr2	398312	398344	a	a	+
+chr2	398555	398587	b	b	-
+chr2	398592	398624	a	a	+
+chr2	398592	398624	a	a	+
+chr2	399146	399178	b	b	-
+chr2	399413	399445	b	b	-
+chr2	399491	399523	a	a	+
+chr2	399461	399493	b	b	-
+chr2	399528	399560	b	b	-
+chr2	399734	399766	a	a	+
+chr2	399974	400006	b	b	-
+chr2	400069	400101	b	b	-
+chr2	400376	400408	a	a	+
+chr2	400416	400448	a	a	+
+chr2	400626	400658	b	b	-
+chr2	400680	400712	a	a	+
+chr2	400680	400712	a	a	+
+chr2	400680	400712	a	a	+
+chr2	400693	400725	a	a	+
+chr2	400670	400702	b	b	-
+chr2	400670	400702	b	b	-
+chr2	400703	400735	a	a	+
+chr2	400791	400823	b	b	-
+chr2	400832	400864	a	a	+
+chr2	400803	400835	b	b	-
+chr2	400843	400875	a	a	+
+chr2	400813	400845	b	b	-
+chr2	400851	400883	a	a	+
+chr2	400852	400884	a	a	+
+chr2	400820	400852	b	b	-
+chr2	400853	400885	a	a	+
+chr2	400856	400888	a	a	+
+chr2	400825	400857	b	b	-
+chr2	400858	400890	a	a	+
+chr2	400833	400865	b	b	-
+chr2	400833	400865	b	b	-
+chr2	400837	400869	b	b	-
+chr2	400837	400869	b	b	-
+chr2	400837	400869	b	b	-
+chr2	400874	400906	a	a	+
+chr2	400874	400906	a	a	+
+chr2	400875	400907	a	a	+
+chr2	400875	400907	a	a	+
+chr2	400875	400907	a	a	+
+chr2	400875	400907	a	a	+
+chr2	400843	400875	b	b	-
+chr2	400843	400875	b	b	-
+chr2	400845	400877	b	b	-
+chr2	400848	400880	b	b	-
+chr2	400883	400915	a	a	+
+chr2	400889	400921	a	a	+
+chr2	400889	400921	a	a	+
+chr2	400890	400922	a	a	+
+chr2	401083	401115	a	a	+
+chr2	401083	401115	a	a	+
+chr2	401174	401206	a	a	+
+chr2	401157	401189	b	b	-
+chr2	401165	401197	b	b	-
+chr2	401172	401204	b	b	-
+chr2	401205	401237	b	b	-
+chr2	401320	401352	b	b	-
+chr2	401371	401403	a	a	+
+chr2	401404	401436	a	a	+
+chr2	401750	401782	a	a	+
+chr2	401866	401898	b	b	-
+chr2	402137	402169	b	b	-
+chr2	402275	402307	a	a	+
+chr2	402446	402478	b	b	-
+chr2	403030	403062	b	b	-
+chr2	403459	403491	a	a	+
+chr2	403588	403620	a	a	+
+chr2	405003	405035	a	a	+
+chr2	405003	405035	a	a	+
+chr2	405107	405139	b	b	-
+chr2	405150	405182	a	a	+
+chr2	405160	405192	a	a	+
+chr2	405140	405172	b	b	-
+chr2	405179	405211	a	a	+
+chr2	405191	405223	a	a	+
+chr2	405322	405354	a	a	+
+chr2	405324	405356	a	a	+
+chr2	405324	405356	a	a	+
+chr2	405324	405356	a	a	+
+chr2	405324	405356	a	a	+
+chr2	405324	405356	a	a	+
+chr2	405292	405324	b	b	-
+chr2	405292	405324	b	b	-
+chr2	405295	405327	b	b	-
+chr2	405329	405361	a	a	+
+chr2	405300	405332	b	b	-
+chr2	405338	405370	a	a	+
+chr2	405306	405338	b	b	-
+chr2	405341	405373	a	a	+
+chr2	405341	405373	a	a	+
+chr2	405309	405341	b	b	-
+chr2	405310	405342	b	b	-
+chr2	405343	405375	a	a	+
+chr2	405313	405345	b	b	-
+chr2	405346	405378	a	a	+
+chr2	405560	405592	b	b	-
+chr2	405596	405628	a	a	+
+chr2	405599	405631	a	a	+
+chr2	406092	406124	b	b	-
+chr2	406185	406217	b	b	-
+chr2	406212	406244	b	b	-
+chr2	406243	406275	b	b	-
+chr2	406243	406275	b	b	-
+chr2	406272	406304	b	b	-
+chr2	406307	406339	a	a	+
+chr2	406307	406339	a	a	+
+chr2	406307	406339	a	a	+
+chr2	406307	406339	a	a	+
+chr2	406307	406339	a	a	+
+chr2	406298	406330	b	b	-
+chr2	406300	406332	b	b	-
+chr2	406604	406636	b	b	-
+chr2	406604	406636	b	b	-
+chr2	406661	406693	a	a	+
+chr2	406709	406741	a	a	+
+chr2	406761	406793	b	b	-
+chr2	406958	406990	b	b	-
+chr2	407182	407214	a	a	+
+chr2	407594	407626	a	a	+
+chr2	407594	407626	a	a	+
+chr2	407576	407608	b	b	-
+chr2	407626	407658	a	a	+
+chr2	407651	407683	b	b	-
+chr2	407789	407821	a	a	+
+chr2	407926	407958	a	a	+
+chr2	408257	408289	b	b	-
+chr2	408316	408348	a	a	+
+chr2	408316	408348	a	a	+
+chr2	408316	408348	a	a	+
+chr2	408296	408328	b	b	-
+chr2	408423	408455	b	b	-
+chr2	408466	408498	a	a	+
+chr2	408441	408473	b	b	-
+chr2	408496	408528	a	a	+
+chr2	408833	408865	a	a	+
+chr2	408871	408903	a	a	+
+chr2	408872	408904	a	a	+
+chr2	408886	408918	a	a	+
+chr2	408854	408886	b	b	-
+chr2	408855	408887	b	b	-
+chr2	408855	408887	b	b	-
+chr2	408855	408887	b	b	-
+chr2	408855	408887	b	b	-
+chr2	408897	408929	a	a	+
+chr2	408886	408918	b	b	-
+chr2	408952	408984	b	b	-
+chr2	409068	409100	a	a	+
+chr2	409068	409100	a	a	+
+chr2	409042	409074	b	b	-
+chr2	409176	409208	b	b	-
+chr2	409231	409263	a	a	+
+chr2	409250	409282	a	a	+
+chr2	409330	409362	b	b	-
+chr2	409373	409405	a	a	+
+chr2	409367	409399	b	b	-
+chr2	409385	409417	b	b	-
+chr2	409429	409461	a	a	+
+chr2	409429	409461	a	a	+
+chr2	409429	409461	a	a	+
+chr2	409402	409434	b	b	-
+chr2	409406	409438	b	b	-
+chr2	409598	409630	a	a	+
+chr2	409710	409742	b	b	-
+chr2	409765	409797	b	b	-
+chr2	410105	410137	a	a	+
+chr2	410226	410258	b	b	-
+chr2	410386	410418	a	a	+
+chr2	410371	410403	b	b	-
+chr2	410697	410729	a	a	+
+chr2	410703	410735	a	a	+
+chr2	410703	410735	a	a	+
+chr2	410671	410703	b	b	-
+chr2	410706	410738	a	a	+
+chr2	410674	410706	b	b	-
+chr2	410682	410714	b	b	-
+chr2	410685	410717	b	b	-
+chr2	410685	410717	b	b	-
+chr2	410724	410756	a	a	+
+chr2	410731	410763	a	a	+
+chr2	410731	410763	a	a	+
+chr2	410732	410764	a	a	+
+chr2	410738	410770	a	a	+
+chr2	411024	411056	a	a	+
+chr2	411027	411059	a	a	+
+chr2	410996	411028	b	b	-
+chr2	410997	411029	b	b	-
+chr2	411030	411062	a	a	+
+chr2	411030	411062	a	a	+
+chr2	411034	411066	a	a	+
+chr2	411035	411067	a	a	+
+chr2	411004	411036	b	b	-
+chr2	411059	411091	a	a	+
+chr2	411069	411101	a	a	+
+chr2	411207	411239	a	a	+
+chr2	411182	411214	b	b	-
+chr2	411185	411217	b	b	-
+chr2	411359	411391	b	b	-
+chr2	411486	411518	a	a	+
+chr2	411708	411740	b	b	-
+chr2	412432	412464	a	a	+
+chr2	412761	412793	a	a	+
+chr2	412786	412818	a	a	+
+chr2	413034	413066	b	b	-
+chr2	413055	413087	b	b	-
+chr2	413111	413143	a	a	+
+chr2	413181	413213	a	a	+
+chr2	413330	413362	b	b	-
+chr2	413554	413586	a	a	+
+chr2	413559	413591	a	a	+
+chr2	413559	413591	a	a	+
+chr2	413559	413591	a	a	+
+chr2	413542	413574	b	b	-
+chr2	413543	413575	b	b	-
+chr2	413851	413883	b	b	-
+chr2	413884	413916	a	a	+
+chr2	413889	413921	a	a	+
+chr2	413895	413927	a	a	+
+chr2	413863	413895	b	b	-
+chr2	413888	413920	b	b	-
+chr2	414334	414366	a	a	+
+chr2	414341	414373	b	b	-
+chr2	414349	414381	b	b	-
+chr2	414436	414468	a	a	+
+chr2	414480	414512	b	b	-
+chr2	414545	414577	b	b	-
+chr2	414564	414596	b	b	-
+chr2	414634	414666	b	b	-
+chr2	414744	414776	a	a	+
+chr2	415848	415880	b	b	-
+chr2	415852	415884	b	b	-
+chr2	415893	415925	a	a	+
+chr2	415895	415927	a	a	+
+chr2	415903	415935	a	a	+
+chr2	415922	415954	a	a	+
+chr2	415922	415954	a	a	+
+chr2	415894	415926	b	b	-
+chr2	415894	415926	b	b	-
+chr2	415911	415943	b	b	-
+chr2	415965	415997	a	a	+
+chr2	415970	416002	a	a	+
+chr2	415998	416030	a	a	+
+chr2	416046	416078	b	b	-
+chr2	416050	416082	b	b	-
+chr2	416096	416128	a	a	+
+chr2	416101	416133	a	a	+
+chr2	416102	416134	a	a	+
+chr2	416072	416104	b	b	-
+chr2	416226	416258	b	b	-
+chr2	416251	416283	b	b	-
+chr2	416331	416363	a	a	+
+chr2	416443	416475	b	b	-
+chr2	416443	416475	b	b	-
+chr2	416528	416560	b	b	-
+chr2	416528	416560	b	b	-
+chr2	416528	416560	b	b	-
+chr2	416620	416652	b	b	-
+chr2	416665	416697	b	b	-
+chr2	416706	416738	a	a	+
+chr2	416709	416741	b	b	-
+chr2	416874	416906	a	a	+
+chr2	416870	416902	b	b	-
+chr2	417134	417166	a	a	+
+chr2	417134	417166	a	a	+
+chr2	417127	417159	b	b	-
+chr2	417189	417221	a	a	+
+chr2	417161	417193	b	b	-
+chr2	417166	417198	b	b	-
+chr2	417339	417371	b	b	-
+chr2	417342	417374	b	b	-
+chr2	417353	417385	b	b	-
+chr2	417402	417434	a	a	+
+chr2	417375	417407	b	b	-
+chr2	417412	417444	a	a	+
+chr2	417479	417511	b	b	-
+chr2	417487	417519	b	b	-
+chr2	417520	417552	a	a	+
+chr2	417520	417552	a	a	+
+chr2	417521	417553	a	a	+
+chr2	417492	417524	b	b	-
+chr2	417494	417526	b	b	-
+chr2	417494	417526	b	b	-
+chr2	417494	417526	b	b	-
+chr2	417527	417559	a	a	+
+chr2	417527	417559	a	a	+
+chr2	417527	417559	a	a	+
+chr2	417495	417527	b	b	-
+chr2	417496	417528	b	b	-
+chr2	417496	417528	b	b	-
+chr2	417529	417561	a	a	+
+chr2	417529	417561	a	a	+
+chr2	417535	417567	a	a	+
+chr2	417535	417567	a	a	+
+chr2	417503	417535	b	b	-
+chr2	417503	417535	b	b	-
+chr2	417536	417568	a	a	+
+chr2	417536	417568	a	a	+
+chr2	417536	417568	a	a	+
+chr2	417536	417568	a	a	+
+chr2	417504	417536	b	b	-
+chr2	417506	417538	b	b	-
+chr2	417506	417538	b	b	-
+chr2	417539	417571	a	a	+
+chr2	417539	417571	a	a	+
+chr2	417509	417541	b	b	-
+chr2	417515	417547	b	b	-
+chr2	417549	417581	a	a	+
+chr2	417524	417556	b	b	-
+chr2	417526	417558	b	b	-
+chr2	417562	417594	a	a	+
+chr2	417721	417753	b	b	-
+chr2	417721	417753	b	b	-
+chr2	417765	417797	a	a	+
+chr2	417765	417797	a	a	+
+chr2	417733	417765	b	b	-
+chr2	417734	417766	b	b	-
+chr2	417734	417766	b	b	-
+chr2	417779	417811	a	a	+
+chr2	417925	417957	a	a	+
+chr2	417907	417939	b	b	-
+chr2	417954	417986	a	a	+
+chr2	417935	417967	b	b	-
+chr2	417936	417968	b	b	-
+chr2	418043	418075	b	b	-
+chr2	418043	418075	b	b	-
+chr2	418086	418118	a	a	+
+chr2	418093	418125	b	b	-
+chr2	418093	418125	b	b	-
+chr2	418316	418348	a	a	+
+chr2	418302	418334	b	b	-
+chr2	418320	418352	b	b	-
+chr2	418374	418406	a	a	+
+chr2	418375	418407	a	a	+
+chr2	418383	418415	a	a	+
+chr2	418373	418405	b	b	-
+chr2	418453	418485	b	b	-
+chr2	418453	418485	b	b	-
+chr2	418483	418515	b	b	-
+chr2	418667	418699	b	b	-
+chr2	418683	418715	b	b	-
+chr2	418795	418827	b	b	-
+chr2	418813	418845	b	b	-
+chr2	418841	418873	b	b	-
+chr2	418877	418909	a	a	+
+chr2	418845	418877	b	b	-
+chr2	419009	419041	a	a	+
+chr2	419009	419041	a	a	+
+chr2	419025	419057	a	a	+
+chr2	418998	419030	b	b	-
+chr2	419009	419041	b	b	-
+chr2	419011	419043	b	b	-
+chr2	419180	419212	a	a	+
+chr2	419181	419213	a	a	+
+chr2	419191	419223	a	a	+
+chr2	419191	419223	a	a	+
+chr2	419159	419191	b	b	-
+chr2	419159	419191	b	b	-
+chr2	419159	419191	b	b	-
+chr2	419159	419191	b	b	-
+chr2	419159	419191	b	b	-
+chr2	419159	419191	b	b	-
+chr2	419159	419191	b	b	-
+chr2	419159	419191	b	b	-
+chr2	419160	419192	b	b	-
+chr2	419160	419192	b	b	-
+chr2	419193	419225	a	a	+
+chr2	419201	419233	a	a	+
+chr2	419202	419234	a	a	+
+chr2	419202	419234	a	a	+
+chr2	419202	419234	a	a	+
+chr2	419202	419234	a	a	+
+chr2	419202	419234	a	a	+
+chr2	419216	419248	a	a	+
+chr2	419185	419217	b	b	-
+chr2	419194	419226	b	b	-
+chr2	419432	419464	a	a	+
+chr2	419487	419519	a	a	+
+chr2	419487	419519	a	a	+
+chr2	419487	419519	b	b	-
+chr2	419488	419520	b	b	-
+chr2	419537	419569	a	a	+
+chr2	419603	419635	a	a	+
+chr2	419580	419612	b	b	-
+chr2	419597	419629	b	b	-
+chr2	419611	419643	b	b	-
+chr2	419612	419644	b	b	-
+chr2	419652	419684	a	a	+
+chr2	419626	419658	b	b	-
+chr2	419628	419660	b	b	-
+chr2	419663	419695	a	a	+
+chr2	419848	419880	a	a	+
+chr2	419922	419954	b	b	-
+chr2	419967	419999	a	a	+
+chr2	419936	419968	b	b	-
+chr2	419976	420008	a	a	+
+chr2	420394	420426	a	a	+
+chr2	420554	420586	a	a	+
+chr2	420743	420775	a	a	+
+chr2	420921	420953	b	b	-
+chr2	421113	421145	b	b	-
+chr2	421419	421451	a	a	+
+chr2	421821	421853	b	b	-
+chr2	421821	421853	b	b	-
+chr2	422201	422233	a	a	+
+chr2	422212	422244	b	b	-
+chr2	422397	422429	b	b	-
+chr2	423078	423110	a	a	+
+chr2	423064	423096	b	b	-
+chr2	423232	423264	b	b	-
+chr2	423250	423282	b	b	-
+chr2	423273	423305	b	b	-
+chr2	423490	423522	b	b	-
+chr2	423523	423555	b	b	-
+chr2	423586	423618	a	a	+
+chr2	423556	423588	b	b	-
+chr2	423556	423588	b	b	-
+chr2	423559	423591	b	b	-
+chr2	423560	423592	b	b	-
+chr2	423560	423592	b	b	-
+chr2	423561	423593	b	b	-
+chr2	423609	423641	a	a	+
+chr2	423592	423624	b	b	-
+chr2	423723	423755	b	b	-
+chr2	423777	423809	a	a	+
+chr2	423757	423789	b	b	-
+chr2	423758	423790	b	b	-
+chr2	423758	423790	b	b	-
+chr2	423758	423790	b	b	-
+chr2	423793	423825	a	a	+
+chr2	423796	423828	a	a	+
+chr2	423796	423828	a	a	+
+chr2	423766	423798	b	b	-
+chr2	423800	423832	a	a	+
+chr2	423769	423801	b	b	-
+chr2	423802	423834	a	a	+
+chr2	423771	423803	b	b	-
+chr2	423817	423849	a	a	+
+chr2	423786	423818	b	b	-
+chr2	423938	423970	a	a	+
+chr2	424089	424121	b	b	-
+chr2	424132	424164	a	a	+
+chr2	424133	424165	a	a	+
+chr2	424141	424173	a	a	+
+chr2	424232	424264	b	b	-
+chr2	424232	424264	b	b	-
+chr2	424262	424294	b	b	-
+chr2	424642	424674	b	b	-
+chr2	425022	425054	a	a	+
+chr2	425044	425076	a	a	+
+chr2	425018	425050	b	b	-
+chr2	425090	425122	a	a	+
+chr2	425114	425146	a	a	+
+chr2	425115	425147	a	a	+
+chr2	425094	425126	b	b	-
+chr2	425129	425161	a	a	+
+chr2	425177	425209	b	b	-
+chr2	425259	425291	a	a	+
+chr2	425258	425290	b	b	-
+chr2	425291	425323	a	a	+
+chr2	425333	425365	a	a	+
+chr2	425399	425431	a	a	+
+chr2	425440	425472	b	b	-
+chr2	425474	425506	a	a	+
+chr2	425474	425506	a	a	+
+chr2	425447	425479	b	b	-
+chr2	425500	425532	b	b	-
+chr2	425637	425669	a	a	+
+chr2	425605	425637	b	b	-
+chr2	425608	425640	b	b	-
+chr2	425608	425640	b	b	-
+chr2	425618	425650	b	b	-
+chr2	425655	425687	a	a	+
+chr2	425665	425697	a	a	+
+chr2	425679	425711	a	a	+
+chr2	425742	425774	b	b	-
+chr2	425746	425778	b	b	-
+chr2	425762	425794	b	b	-
+chr2	425763	425795	b	b	-
+chr2	425764	425796	b	b	-
+chr2	425799	425831	a	a	+
+chr2	425799	425831	a	a	+
+chr2	425801	425833	a	a	+
+chr2	425769	425801	b	b	-
+chr2	425769	425801	b	b	-
+chr2	425769	425801	b	b	-
+chr2	425769	425801	b	b	-
+chr2	425770	425802	b	b	-
+chr2	425771	425803	b	b	-
+chr2	425773	425805	b	b	-
+chr2	425773	425805	b	b	-
+chr2	425777	425809	b	b	-
+chr2	425821	425853	a	a	+
+chr2	425821	425853	a	a	+
+chr2	425822	425854	a	a	+
+chr2	425829	425861	a	a	+
+chr2	425829	425861	a	a	+
+chr2	425803	425835	b	b	-
+chr2	425803	425835	b	b	-
+chr2	426081	426113	a	a	+
+chr2	426245	426277	a	a	+
+chr2	426257	426289	a	a	+
+chr2	426268	426300	a	a	+
+chr2	426282	426314	a	a	+
+chr2	426364	426396	b	b	-
+chr2	426384	426416	b	b	-
+chr2	426385	426417	b	b	-
+chr2	426614	426646	b	b	-
+chr2	426614	426646	b	b	-
+chr2	426715	426747	a	a	+
+chr2	426732	426764	a	a	+
+chr2	426741	426773	a	a	+
+chr2	426712	426744	b	b	-
+chr2	426755	426787	a	a	+
+chr2	426755	426787	b	b	-
+chr2	426759	426791	b	b	-
+chr2	426787	426819	b	b	-
+chr2	426793	426825	b	b	-
+chr2	426805	426837	b	b	-
+chr2	426805	426837	b	b	-
+chr2	426849	426881	b	b	-
+chr2	427106	427138	b	b	-
+chr2	427124	427156	b	b	-
+chr2	427171	427203	a	a	+
+chr2	427172	427204	a	a	+
+chr2	427147	427179	b	b	-
+chr2	427188	427220	a	a	+
+chr2	427193	427225	a	a	+
+chr2	427203	427235	a	a	+
+chr2	427307	427339	a	a	+
+chr2	427276	427308	b	b	-
+chr2	427276	427308	b	b	-
+chr2	427276	427308	b	b	-
+chr2	427313	427345	a	a	+
+chr2	427315	427347	a	a	+
+chr2	427316	427348	a	a	+
+chr2	427296	427328	b	b	-
+chr2	427364	427396	b	b	-
+chr2	427371	427403	b	b	-
+chr2	427383	427415	b	b	-
+chr2	427420	427452	a	a	+
+chr2	427390	427422	b	b	-
+chr2	427438	427470	a	a	+
+chr2	427447	427479	a	a	+
+chr2	427415	427447	b	b	-
+chr2	427448	427480	a	a	+
+chr2	427449	427481	a	a	+
+chr2	427449	427481	a	a	+
+chr2	427452	427484	a	a	+
+chr2	427455	427487	a	a	+
+chr2	427455	427487	a	a	+
+chr2	427456	427488	a	a	+
+chr2	427456	427488	a	a	+
+chr2	427456	427488	a	a	+
+chr2	427427	427459	b	b	-
+chr2	427427	427459	b	b	-
+chr2	427427	427459	b	b	-
+chr2	427427	427459	b	b	-
+chr2	427427	427459	b	b	-
+chr2	427427	427459	b	b	-
+chr2	427427	427459	b	b	-
+chr2	427429	427461	b	b	-
+chr2	427466	427498	a	a	+
+chr2	427467	427499	a	a	+
+chr2	427467	427499	a	a	+
+chr2	427436	427468	b	b	-
+chr2	427436	427468	b	b	-
+chr2	427439	427471	b	b	-
+chr2	427439	427471	b	b	-
+chr2	427439	427471	b	b	-
+chr2	427478	427510	a	a	+
+chr2	427478	427510	a	a	+
+chr2	427478	427510	a	a	+
+chr2	427478	427510	a	a	+
+chr2	427456	427488	b	b	-
+chr2	427496	427528	a	a	+
+chr2	427468	427500	b	b	-
+chr2	427704	427736	b	b	-
+chr2	427711	427743	b	b	-
+chr2	427749	427781	a	a	+
+chr2	427719	427751	b	b	-
+chr2	427719	427751	b	b	-
+chr2	427719	427751	b	b	-
+chr2	427752	427784	a	a	+
+chr2	427757	427789	a	a	+
+chr2	427757	427789	a	a	+
+chr2	427758	427790	a	a	+
+chr2	427727	427759	b	b	-
+chr2	427760	427792	a	a	+
+chr2	427760	427792	a	a	+
+chr2	427760	427792	a	a	+
+chr2	427760	427792	a	a	+
+chr2	427760	427792	a	a	+
+chr2	427729	427761	b	b	-
+chr2	427729	427761	b	b	-
+chr2	427730	427762	b	b	-
+chr2	427763	427795	a	a	+
+chr2	427734	427766	b	b	-
+chr2	427734	427766	b	b	-
+chr2	427767	427799	a	a	+
+chr2	427735	427767	b	b	-
+chr2	427735	427767	b	b	-
+chr2	427769	427801	a	a	+
+chr2	427769	427801	a	a	+
+chr2	427769	427801	a	a	+
+chr2	427769	427801	a	a	+
+chr2	427769	427801	a	a	+
+chr2	427769	427801	a	a	+
+chr2	427738	427770	b	b	-
+chr2	427738	427770	b	b	-
+chr2	427771	427803	a	a	+
+chr2	427772	427804	a	a	+
+chr2	427740	427772	b	b	-
+chr2	427745	427777	b	b	-
+chr2	427745	427777	b	b	-
+chr2	427745	427777	b	b	-
+chr2	427745	427777	b	b	-
+chr2	427745	427777	b	b	-
+chr2	427745	427777	b	b	-
+chr2	427757	427789	b	b	-
+chr2	427815	427847	a	a	+
+chr2	427836	427868	a	a	+
+chr2	427892	427924	a	a	+
+chr2	427909	427941	a	a	+
+chr2	427909	427941	a	a	+
+chr2	427880	427912	b	b	-
+chr2	427918	427950	a	a	+
+chr2	427926	427958	a	a	+
+chr2	427897	427929	b	b	-
+chr2	427897	427929	b	b	-
+chr2	427900	427932	b	b	-
+chr2	427905	427937	b	b	-
+chr2	427947	427979	a	a	+
+chr2	427925	427957	b	b	-
+chr2	427925	427957	b	b	-
+chr2	427957	427989	b	b	-
+chr2	427957	427989	b	b	-
+chr2	428158	428190	b	b	-
+chr2	428258	428290	b	b	-
+chr2	428462	428494	a	a	+
+chr2	428472	428504	a	a	+
+chr2	428617	428649	b	b	-
+chr2	428655	428687	a	a	+
+chr2	428667	428699	a	a	+
+chr2	428665	428697	b	b	-
+chr2	428666	428698	b	b	-
+chr2	428666	428698	b	b	-
+chr2	428791	428823	a	a	+
+chr2	428825	428857	a	a	+
+chr2	428841	428873	a	a	+
+chr2	428961	428993	b	b	-
+chr2	429008	429040	a	a	+
+chr2	429009	429041	a	a	+
+chr2	428995	429027	b	b	-
+chr2	429059	429091	a	a	+
+chr2	429129	429161	a	a	+
+chr2	429125	429157	b	b	-
+chr2	429125	429157	b	b	-
+chr2	429125	429157	b	b	-
+chr2	429561	429593	b	b	-
+chr2	429569	429601	b	b	-
+chr2	429569	429601	b	b	-
+chr2	429569	429601	b	b	-
+chr2	429602	429634	a	a	+
+chr2	429577	429609	b	b	-
+chr2	429579	429611	b	b	-
+chr2	429579	429611	b	b	-
+chr2	429580	429612	b	b	-
+chr2	429580	429612	b	b	-
+chr2	429580	429612	b	b	-
+chr2	429585	429617	b	b	-
+chr2	429585	429617	b	b	-
+chr2	429619	429651	a	a	+
+chr2	429588	429620	b	b	-
+chr2	429588	429620	b	b	-
+chr2	429590	429622	b	b	-
+chr2	429595	429627	b	b	-
+chr2	429613	429645	b	b	-
+chr2	429665	429697	a	a	+
+chr2	429686	429718	a	a	+
+chr2	429742	429774	a	a	+
+chr2	429727	429759	b	b	-
+chr2	429760	429792	a	a	+
+chr2	429760	429792	a	a	+
+chr2	429768	429800	a	a	+
+chr2	429776	429808	a	a	+
+chr2	429747	429779	b	b	-
+chr2	429747	429779	b	b	-
+chr2	429750	429782	b	b	-
+chr2	429755	429787	b	b	-
+chr2	429797	429829	a	a	+
+chr2	429775	429807	b	b	-
+chr2	429775	429807	b	b	-
+chr2	429807	429839	b	b	-
+chr2	429807	429839	b	b	-
+chr2	429917	429949	b	b	-
+chr2	429989	430021	a	a	+
+chr2	430110	430142	b	b	-
+chr2	430171	430203	a	a	+
+chr2	430467	430499	b	b	-
+chr2	430521	430553	a	a	+
+chr2	430515	430547	b	b	-
+chr2	430516	430548	b	b	-
+chr2	430516	430548	b	b	-
+chr2	430641	430673	a	a	+
+chr2	431019	431051	a	a	+
+chr2	431028	431060	a	a	+
+chr2	431033	431065	a	a	+
+chr2	431149	431181	a	a	+
+chr2	431149	431181	a	a	+
+chr2	431149	431181	a	a	+
+chr2	431133	431165	b	b	-
+chr2	431134	431166	b	b	-
+chr2	431137	431169	b	b	-
+chr2	431170	431202	a	a	+
+chr2	431146	431178	b	b	-
+chr2	431146	431178	b	b	-
+chr2	431146	431178	b	b	-
+chr2	431156	431188	b	b	-
+chr2	431202	431234	a	a	+
+chr2	431212	431244	a	a	+
+chr2	431304	431336	b	b	-
+chr2	431319	431351	b	b	-
+chr2	431399	431431	a	a	+
+chr2	431485	431517	a	a	+
+chr2	431515	431547	b	b	-
+chr2	431571	431603	b	b	-
+chr2	431631	431663	b	b	-
+chr2	431687	431719	b	b	-
+chr2	431713	431745	b	b	-
+chr2	431719	431751	b	b	-
+chr2	431752	431784	a	a	+
+chr2	431754	431786	a	a	+
+chr2	431754	431786	a	a	+
+chr2	431754	431786	a	a	+
+chr2	431755	431787	a	a	+
+chr2	431755	431787	a	a	+
+chr2	431730	431762	b	b	-
+chr2	431730	431762	b	b	-
+chr2	431730	431762	b	b	-
+chr2	431763	431795	a	a	+
+chr2	431731	431763	b	b	-
+chr2	431768	431800	a	a	+
+chr2	431739	431771	b	b	-
+chr2	431745	431777	b	b	-
+chr2	431784	431816	a	a	+
+chr2	431768	431800	b	b	-
+chr2	431998	432030	a	a	+
+chr2	431999	432031	a	a	+
+chr2	431968	432000	b	b	-
+chr2	431968	432000	b	b	-
+chr2	431975	432007	b	b	-
+chr2	432010	432042	a	a	+
+chr2	431978	432010	b	b	-
+chr2	431982	432014	b	b	-
+chr2	432016	432048	a	a	+
+chr2	432018	432050	a	a	+
+chr2	432018	432050	a	a	+
+chr2	431990	432022	b	b	-
+chr2	431990	432022	b	b	-
+chr2	431990	432022	b	b	-
+chr2	432023	432055	a	a	+
+chr2	432024	432056	a	a	+
+chr2	432024	432056	a	a	+
+chr2	431993	432025	b	b	-
+chr2	432032	432064	a	a	+
+chr2	432032	432064	a	a	+
+chr2	432033	432065	a	a	+
+chr2	432003	432035	b	b	-
+chr2	432003	432035	b	b	-
+chr2	432003	432035	b	b	-
+chr2	432003	432035	b	b	-
+chr2	432003	432035	b	b	-
+chr2	432004	432036	b	b	-
+chr2	432004	432036	b	b	-
+chr2	432112	432144	b	b	-
+chr2	432195	432227	a	a	+
+chr2	432195	432227	a	a	+
+chr2	432170	432202	b	b	-
+chr2	432170	432202	b	b	-
+chr2	432188	432220	b	b	-
+chr2	432190	432222	b	b	-
+chr2	432310	432342	b	b	-
+chr2	432356	432388	b	b	-
+chr2	432541	432573	a	a	+
+chr2	432638	432670	b	b	-
+chr2	432823	432855	a	a	+
+chr2	433194	433226	a	a	+
+chr2	433311	433343	a	a	+
+chr2	433343	433375	a	a	+
+chr2	433503	433535	b	b	-
+chr2	433709	433741	b	b	-
+chr2	433800	433832	b	b	-
+chr2	434018	434050	b	b	-
+chr2	434078	434110	b	b	-
+chr2	434131	434163	b	b	-
+chr2	434249	434281	a	a	+
+chr2	434516	434548	a	a	+
+chr2	434496	434528	b	b	-
+chr2	434496	434528	b	b	-
+chr2	434682	434714	a	a	+
+chr2	434716	434748	b	b	-
+chr2	435083	435115	a	a	+
+chr2	435111	435143	b	b	-
+chr2	435299	435331	a	a	+
+chr2	435329	435361	a	a	+
+chr2	435307	435339	b	b	-
+chr2	435460	435492	a	a	+
+chr2	435461	435493	a	a	+
+chr2	435499	435531	a	a	+
+chr2	435500	435532	a	a	+
+chr2	435505	435537	a	a	+
+chr2	435511	435543	a	a	+
+chr2	435484	435516	b	b	-
+chr2	435501	435533	b	b	-
+chr2	435557	435589	a	a	+
+chr2	435648	435680	a	a	+
+chr2	435616	435648	b	b	-
+chr2	435634	435666	b	b	-
+chr2	435668	435700	a	a	+
+chr2	435669	435701	a	a	+
+chr2	435669	435701	a	a	+
+chr2	435669	435701	a	a	+
+chr2	435669	435701	a	a	+
+chr2	435672	435704	a	a	+
+chr2	435645	435677	b	b	-
+chr2	435648	435680	b	b	-
+chr2	435682	435714	a	a	+
+chr2	435682	435714	a	a	+
+chr2	435682	435714	a	a	+
+chr2	435682	435714	a	a	+
+chr2	435655	435687	b	b	-
+chr2	435656	435688	b	b	-
+chr2	435694	435726	a	a	+
+chr2	435694	435726	a	a	+
+chr2	435662	435694	b	b	-
+chr2	435663	435695	b	b	-
+chr2	435696	435728	a	a	+
+chr2	435696	435728	a	a	+
+chr2	435666	435698	b	b	-
+chr2	435666	435698	b	b	-
+chr2	435666	435698	b	b	-
+chr2	435666	435698	b	b	-
+chr2	435667	435699	b	b	-
+chr2	435667	435699	b	b	-
+chr2	435670	435702	b	b	-
+chr2	435670	435702	b	b	-
+chr2	435673	435705	b	b	-
+chr2	435743	435775	b	b	-
+chr2	435925	435957	b	b	-
+chr2	435925	435957	b	b	-
+chr2	435967	435999	a	a	+
+chr2	435977	436009	a	a	+
+chr2	435948	435980	b	b	-
+chr2	435948	435980	b	b	-
+chr2	435986	436018	a	a	+
+chr2	436000	436032	a	a	+
+chr2	436000	436032	a	a	+
+chr2	436089	436121	a	a	+
+chr2	436178	436210	b	b	-
+chr2	436319	436351	b	b	-
+chr2	436330	436362	b	b	-
+chr2	436470	436502	b	b	-
+chr2	436511	436543	a	a	+
+chr2	436485	436517	b	b	-
+chr2	436568	436600	b	b	-
+chr2	436663	436695	a	a	+
+chr2	436685	436717	a	a	+
+chr2	436666	436698	b	b	-
+chr2	436671	436703	b	b	-
+chr2	436708	436740	a	a	+
+chr2	436678	436710	b	b	-
+chr2	436718	436750	a	a	+
+chr2	436909	436941	a	a	+
+chr2	436893	436925	b	b	-
+chr2	436893	436925	b	b	-
+chr2	436896	436928	b	b	-
+chr2	436896	436928	b	b	-
+chr2	436897	436929	b	b	-
+chr2	436899	436931	b	b	-
+chr2	436910	436942	b	b	-
+chr2	436911	436943	b	b	-
+chr2	436944	436976	a	a	+
+chr2	436944	436976	a	a	+
+chr2	436946	436978	a	a	+
+chr2	436916	436948	b	b	-
+chr2	436949	436981	a	a	+
+chr2	436950	436982	a	a	+
+chr2	436950	436982	a	a	+
+chr2	436950	436982	a	a	+
+chr2	436951	436983	a	a	+
+chr2	436951	436983	a	a	+
+chr2	436951	436983	a	a	+
+chr2	436951	436983	a	a	+
+chr2	436924	436956	b	b	-
+chr2	436924	436956	b	b	-
+chr2	436959	436991	a	a	+
+chr2	436928	436960	b	b	-
+chr2	436928	436960	b	b	-
+chr2	436928	436960	b	b	-
+chr2	436928	436960	b	b	-
+chr2	436961	436993	a	a	+
+chr2	436929	436961	b	b	-
+chr2	436929	436961	b	b	-
+chr2	436934	436966	b	b	-
+chr2	436967	436999	a	a	+
+chr2	436967	436999	a	a	+
+chr2	436967	436999	a	a	+
+chr2	436967	436999	a	a	+
+chr2	436936	436968	b	b	-
+chr2	436937	436969	b	b	-
+chr2	436976	437008	a	a	+
+chr2	436981	437013	a	a	+
+chr2	436993	437025	a	a	+
+chr2	436994	437026	a	a	+
+chr2	436997	437029	a	a	+
+chr2	437118	437150	a	a	+
+chr2	437095	437127	b	b	-
+chr2	437277	437309	a	a	+
+chr2	437282	437314	a	a	+
+chr2	437251	437283	b	b	-
+chr2	437315	437347	a	a	+
+chr2	437443	437475	b	b	-
+chr2	437500	437532	a	a	+
+chr2	437731	437763	b	b	-
+chr2	437861	437893	b	b	-
+chr2	437950	437982	a	a	+
+chr2	438117	438149	a	a	+
+chr2	438600	438632	b	b	-
+chr2	438732	438764	a	a	+
+chr2	438838	438870	b	b	-
+chr2	439618	439650	a	a	+
+chr2	439658	439690	b	b	-
+chr2	440342	440374	a	a	+
+chr2	440350	440382	a	a	+
+chr2	440476	440508	a	a	+
+chr2	440598	440630	b	b	-
+chr2	440913	440945	b	b	-
+chr2	441040	441072	b	b	-
+chr2	441097	441129	a	a	+
+chr2	441084	441116	b	b	-
+chr2	441200	441232	b	b	-
+chr2	441248	441280	a	a	+
+chr2	441265	441297	a	a	+
+chr2	441235	441267	b	b	-
+chr2	441236	441268	b	b	-
+chr2	441271	441303	a	a	+
+chr2	441286	441318	a	a	+
+chr2	441254	441286	b	b	-
+chr2	441261	441293	b	b	-
+chr2	441488	441520	b	b	-
+chr2	441489	441521	b	b	-
+chr2	441489	441521	b	b	-
+chr2	441489	441521	b	b	-
+chr2	441489	441521	b	b	-
+chr2	441524	441556	a	a	+
+chr2	441501	441533	b	b	-
+chr2	441501	441533	b	b	-
+chr2	441534	441566	a	a	+
+chr2	441507	441539	b	b	-
+chr2	441507	441539	b	b	-
+chr2	441507	441539	b	b	-
+chr2	441507	441539	b	b	-
+chr2	441541	441573	a	a	+
+chr2	441546	441578	a	a	+
+chr2	441548	441580	a	a	+
+chr2	441548	441580	a	a	+
+chr2	441519	441551	b	b	-
+chr2	441522	441554	b	b	-
+chr2	441556	441588	a	a	+
+chr2	441556	441588	a	a	+
+chr2	441556	441588	a	a	+
+chr2	441525	441557	b	b	-
+chr2	441559	441591	a	a	+
+chr2	441559	441591	a	a	+
+chr2	441559	441591	a	a	+
+chr2	441530	441562	b	b	-
+chr2	441567	441599	a	a	+
+chr2	441580	441612	a	a	+
+chr2	441679	441711	a	a	+
+chr2	441691	441723	a	a	+
+chr2	441691	441723	a	a	+
+chr2	441659	441691	b	b	-
+chr2	441659	441691	b	b	-
+chr2	441701	441733	a	a	+
+chr2	441701	441733	a	a	+
+chr2	441701	441733	a	a	+
+chr2	441672	441704	b	b	-
+chr2	441672	441704	b	b	-
+chr2	441705	441737	a	a	+
+chr2	441705	441737	a	a	+
+chr2	441680	441712	b	b	-
+chr2	441682	441714	b	b	-
+chr2	441682	441714	b	b	-
+chr2	441824	441856	b	b	-
+chr2	441850	441882	b	b	-
+chr2	441889	441921	b	b	-
+chr2	442040	442072	a	a	+
+chr2	442052	442084	a	a	+
+chr2	442238	442270	a	a	+
+chr2	442241	442273	a	a	+
+chr2	442233	442265	b	b	-
+chr2	442424	442456	a	a	+
+chr2	442467	442499	b	b	-
+chr2	442691	442723	b	b	-
+chr2	442710	442742	b	b	-
+chr2	442712	442744	b	b	-
+chr2	442786	442818	a	a	+
+chr2	442787	442819	a	a	+
+chr2	442794	442826	a	a	+
+chr2	442808	442840	a	a	+
+chr2	443055	443087	a	a	+
+chr2	443145	443177	a	a	+
+chr2	443145	443177	a	a	+
+chr2	443433	443465	a	a	+
+chr2	443572	443604	a	a	+
+chr2	443572	443604	a	a	+
+chr2	444193	444225	b	b	-
+chr2	444339	444371	b	b	-
+chr2	444339	444371	b	b	-
+chr2	444529	444561	a	a	+
+chr2	444551	444583	a	a	+
+chr2	444575	444607	b	b	-
+chr2	444582	444614	b	b	-
+chr2	444624	444656	b	b	-
+chr2	444648	444680	b	b	-
+chr2	444659	444691	b	b	-
+chr2	444661	444693	b	b	-
+chr2	444706	444738	a	a	+
+chr2	444681	444713	b	b	-
+chr2	444723	444755	a	a	+
+chr2	444983	445015	a	a	+
+chr2	444991	445023	a	a	+
+chr2	444994	445026	a	a	+
+chr2	444994	445026	a	a	+
+chr2	444971	445003	b	b	-
+chr2	444973	445005	b	b	-
+chr2	444976	445008	b	b	-
+chr2	444988	445020	b	b	-
+chr2	445029	445061	b	b	-
+chr2	445086	445118	b	b	-
+chr2	445130	445162	a	a	+
+chr2	445143	445175	b	b	-
+chr2	445205	445237	a	a	+
+chr2	445205	445237	a	a	+
+chr2	445326	445358	a	a	+
+chr2	445326	445358	b	b	-
+chr2	445362	445394	a	a	+
+chr2	446020	446052	b	b	-
+chr2	446020	446052	b	b	-
+chr2	446056	446088	a	a	+
+chr2	446791	446823	b	b	-
+chr2	446989	447021	a	a	+
+chr2	446958	446990	b	b	-
+chr2	447099	447131	b	b	-
+chr2	447163	447195	a	a	+
+chr2	447163	447195	a	a	+
+chr2	447163	447195	a	a	+
+chr2	447176	447208	a	a	+
+chr2	447184	447216	a	a	+
+chr2	447254	447286	b	b	-
+chr2	447292	447324	a	a	+
+chr2	447268	447300	b	b	-
+chr2	447277	447309	b	b	-
+chr2	447284	447316	b	b	-
+chr2	447318	447350	a	a	+
+chr2	447319	447351	a	a	+
+chr2	447319	447351	a	a	+
+chr2	447319	447351	a	a	+
+chr2	447319	447351	a	a	+
+chr2	447319	447351	a	a	+
+chr2	447319	447351	a	a	+
+chr2	447289	447321	b	b	-
+chr2	447289	447321	b	b	-
+chr2	447325	447357	a	a	+
+chr2	447297	447329	b	b	-
+chr2	447297	447329	b	b	-
+chr2	447297	447329	b	b	-
+chr2	447297	447329	b	b	-
+chr2	447297	447329	b	b	-
+chr2	447297	447329	b	b	-
+chr2	447298	447330	b	b	-
+chr2	447298	447330	b	b	-
+chr2	447298	447330	b	b	-
+chr2	447298	447330	b	b	-
+chr2	447298	447330	b	b	-
+chr2	447331	447363	a	a	+
+chr2	447331	447363	a	a	+
+chr2	447331	447363	a	a	+
+chr2	447299	447331	b	b	-
+chr2	447301	447333	b	b	-
+chr2	447334	447366	a	a	+
+chr2	447336	447368	a	a	+
+chr2	447336	447368	a	a	+
+chr2	447305	447337	b	b	-
+chr2	447340	447372	a	a	+
+chr2	447310	447342	b	b	-
+chr2	447492	447524	a	a	+
+chr2	447550	447582	a	a	+
+chr2	447525	447557	b	b	-
+chr2	447549	447581	b	b	-
+chr2	447550	447582	b	b	-
+chr2	447583	447615	a	a	+
+chr2	447555	447587	b	b	-
+chr2	447555	447587	b	b	-
+chr2	447592	447624	a	a	+
+chr2	447592	447624	a	a	+
+chr2	447560	447592	b	b	-
+chr2	447594	447626	a	a	+
+chr2	447566	447598	b	b	-
+chr2	447600	447632	a	a	+
+chr2	447600	447632	a	a	+
+chr2	447600	447632	a	a	+
+chr2	447600	447632	a	a	+
+chr2	447570	447602	b	b	-
+chr2	447574	447606	b	b	-
+chr2	447575	447607	b	b	-
+chr2	447575	447607	b	b	-
+chr2	447610	447642	a	a	+
+chr2	447610	447642	a	a	+
+chr2	447579	447611	b	b	-
+chr2	447579	447611	b	b	-
+chr2	447579	447611	b	b	-
+chr2	447591	447623	b	b	-
+chr2	447591	447623	b	b	-
+chr2	447629	447661	a	a	+
+chr2	447605	447637	b	b	-
+chr2	447698	447730	b	b	-
+chr2	447705	447737	b	b	-
+chr2	447749	447781	a	a	+
+chr2	447749	447781	a	a	+
+chr2	447749	447781	a	a	+
+chr2	447749	447781	a	a	+
+chr2	447752	447784	a	a	+
+chr2	447752	447784	a	a	+
+chr2	447752	447784	a	a	+
+chr2	447720	447752	b	b	-
+chr2	447720	447752	b	b	-
+chr2	447753	447785	a	a	+
+chr2	447753	447785	a	a	+
+chr2	447753	447785	a	a	+
+chr2	447753	447785	a	a	+
+chr2	447753	447785	a	a	+
+chr2	447762	447794	a	a	+
+chr2	447766	447798	a	a	+
+chr2	447749	447781	b	b	-
+chr2	447785	447817	a	a	+
+chr2	447785	447817	a	a	+
+chr2	447756	447788	b	b	-
+chr2	447793	447825	a	a	+
+chr2	447799	447831	a	a	+
+chr2	447776	447808	b	b	-
+chr2	447909	447941	a	a	+
+chr2	447909	447941	a	a	+
+chr2	447909	447941	a	a	+
+chr2	447937	447969	a	a	+
+chr2	447922	447954	b	b	-
+chr2	448035	448067	b	b	-
+chr2	448035	448067	b	b	-
+chr2	448430	448462	a	a	+
+chr2	448416	448448	b	b	-
+chr2	448523	448555	b	b	-
+chr2	448523	448555	b	b	-
+chr2	448523	448555	b	b	-
+chr2	448580	448612	a	a	+
+chr2	448556	448588	b	b	-
+chr2	448903	448935	a	a	+
+chr2	448874	448906	b	b	-
+chr2	448875	448907	b	b	-
+chr2	448944	448976	a	a	+
+chr2	448944	448976	a	a	+
+chr2	449041	449073	b	b	-
+chr2	449054	449086	b	b	-
+chr2	449054	449086	b	b	-
+chr2	449071	449103	b	b	-
+chr2	449113	449145	a	a	+
+chr2	449113	449145	a	a	+
+chr2	449201	449233	b	b	-
+chr2	449210	449242	b	b	-
+chr2	449244	449276	a	a	+
+chr2	449245	449277	a	a	+
+chr2	449215	449247	b	b	-
+chr2	449217	449249	b	b	-
+chr2	449250	449282	a	a	+
+chr2	449250	449282	a	a	+
+chr2	449251	449283	a	a	+
+chr2	449251	449283	a	a	+
+chr2	449219	449251	b	b	-
+chr2	449254	449286	a	a	+
+chr2	449254	449286	a	a	+
+chr2	449222	449254	b	b	-
+chr2	449255	449287	a	a	+
+chr2	449223	449255	b	b	-
+chr2	449223	449255	b	b	-
+chr2	449256	449288	a	a	+
+chr2	449257	449289	a	a	+
+chr2	449257	449289	a	a	+
+chr2	449259	449291	a	a	+
+chr2	449228	449260	b	b	-
+chr2	449228	449260	b	b	-
+chr2	449233	449265	b	b	-
+chr2	449233	449265	b	b	-
+chr2	449235	449267	b	b	-
+chr2	449273	449305	a	a	+
+chr2	449273	449305	a	a	+
+chr2	449242	449274	b	b	-
+chr2	449277	449309	a	a	+
+chr2	449278	449310	a	a	+
+chr2	449246	449278	b	b	-
+chr2	449253	449285	b	b	-
+chr2	449253	449285	b	b	-
+chr2	449295	449327	a	a	+
+chr2	449295	449327	a	a	+
+chr2	449304	449336	a	a	+
+chr2	449279	449311	b	b	-
+chr2	449480	449512	b	b	-
+chr2	449542	449574	a	a	+
+chr2	449536	449568	b	b	-
+chr2	449556	449588	b	b	-
+chr2	449690	449722	b	b	-
+chr2	449698	449730	b	b	-
+chr2	449737	449769	a	a	+
+chr2	449737	449769	a	a	+
+chr2	449739	449771	a	a	+
+chr2	449719	449751	b	b	-
+chr2	449852	449884	b	b	-
+chr2	449901	449933	a	a	+
+chr2	449907	449939	b	b	-
+chr2	449971	450003	a	a	+
+chr2	450016	450048	b	b	-
+chr2	450101	450133	a	a	+
+chr2	450098	450130	b	b	-
+chr2	450365	450397	a	a	+
+chr2	450365	450397	a	a	+
+chr2	450352	450384	b	b	-
+chr2	450419	450451	b	b	-
+chr2	450506	450538	a	a	+
+chr2	450938	450970	b	b	-
+chr2	450990	451022	b	b	-
+chr2	451153	451185	b	b	-
+chr2	451351	451383	b	b	-
+chr2	451677	451709	a	a	+
+chr2	451880	451912	a	a	+
+chr2	451904	451936	a	a	+
+chr2	451874	451906	b	b	-
+chr2	451922	451954	a	a	+
+chr2	451892	451924	b	b	-
+chr2	452059	452091	a	a	+
+chr2	452056	452088	b	b	-
+chr2	452091	452123	a	a	+
+chr2	452643	452675	a	a	+
+chr2	452643	452675	a	a	+
+chr2	452611	452643	b	b	-
+chr2	452648	452680	a	a	+
+chr2	452656	452688	a	a	+
+chr2	452660	452692	a	a	+
+chr2	452628	452660	b	b	-
+chr2	452628	452660	b	b	-
+chr2	452661	452693	a	a	+
+chr2	452686	452718	a	a	+
+chr2	452895	452927	b	b	-
+chr2	453120	453152	a	a	+
+chr2	453144	453176	b	b	-
+chr2	453150	453182	b	b	-
+chr2	453153	453185	b	b	-
+chr2	453395	453427	b	b	-
+chr2	453585	453617	b	b	-
+chr2	453591	453623	b	b	-
+chr2	453598	453630	b	b	-
+chr2	453610	453642	b	b	-
+chr2	453610	453642	b	b	-
+chr2	453610	453642	b	b	-
+chr2	453645	453677	a	a	+
+chr2	453658	453690	a	a	+
+chr2	453658	453690	a	a	+
+chr2	453722	453754	a	a	+
+chr2	453757	453789	b	b	-
+chr2	453878	453910	b	b	-
+chr2	453910	453942	b	b	-
+chr2	453952	453984	a	a	+
+chr2	453973	454005	a	a	+
+chr2	454023	454055	a	a	+
+chr2	454022	454054	b	b	-
+chr2	454048	454080	b	b	-
+chr2	454171	454203	a	a	+
+chr2	454185	454217	a	a	+
+chr2	454211	454243	b	b	-
+chr2	454315	454347	b	b	-
+chr2	454360	454392	a	a	+
+chr2	454468	454500	b	b	-
+chr2	454471	454503	b	b	-
+chr2	454511	454543	a	a	+
+chr2	454517	454549	a	a	+
+chr2	454485	454517	b	b	-
+chr2	454518	454550	a	a	+
+chr2	454518	454550	a	a	+
+chr2	454489	454521	b	b	-
+chr2	454491	454523	b	b	-
+chr2	454491	454523	b	b	-
+chr2	454491	454523	b	b	-
+chr2	454491	454523	b	b	-
+chr2	454524	454556	a	a	+
+chr2	454524	454556	a	a	+
+chr2	454524	454556	a	a	+
+chr2	454528	454560	a	a	+
+chr2	454530	454562	a	a	+
+chr2	454499	454531	b	b	-
+chr2	454500	454532	b	b	-
+chr2	454533	454565	a	a	+
+chr2	454535	454567	a	a	+
+chr2	454504	454536	b	b	-
+chr2	454504	454536	b	b	-
+chr2	454504	454536	b	b	-
+chr2	454504	454536	b	b	-
+chr2	454506	454538	b	b	-
+chr2	454506	454538	b	b	-
+chr2	454540	454572	a	a	+
+chr2	454540	454572	a	a	+
+chr2	454540	454572	a	a	+
+chr2	454541	454573	a	a	+
+chr2	454548	454580	a	a	+
+chr2	454524	454556	b	b	-
+chr2	454539	454571	b	b	-
+chr2	454590	454622	b	b	-
+chr2	454811	454843	a	a	+
+chr2	454811	454843	a	a	+
+chr2	454811	454843	a	a	+
+chr2	454785	454817	b	b	-
+chr2	454818	454850	a	a	+
+chr2	454818	454850	a	a	+
+chr2	454818	454850	a	a	+
+chr2	454818	454850	a	a	+
+chr2	454818	454850	a	a	+
+chr2	454818	454850	a	a	+
+chr2	454792	454824	b	b	-
+chr2	454826	454858	a	a	+
+chr2	454826	454858	a	a	+
+chr2	454796	454828	b	b	-
+chr2	454831	454863	a	a	+
+chr2	454801	454833	b	b	-
+chr2	454839	454871	a	a	+
+chr2	454809	454841	b	b	-
+chr2	454810	454842	b	b	-
+chr2	454811	454843	b	b	-
+chr2	454844	454876	a	a	+
+chr2	454844	454876	a	a	+
+chr2	454844	454876	a	a	+
+chr2	454850	454882	a	a	+
+chr2	454966	454998	b	b	-
+chr2	454966	454998	b	b	-
+chr2	454981	455013	b	b	-
+chr2	455163	455195	a	a	+
+chr2	455444	455476	b	b	-
+chr2	455450	455482	b	b	-
+chr2	455568	455600	a	a	+
+chr2	455630	455662	a	a	+
+chr2	455647	455679	a	a	+
+chr2	455665	455697	a	a	+
+chr2	455634	455666	b	b	-
+chr2	455812	455844	a	a	+
+chr2	455967	455999	a	a	+
+chr2	456005	456037	b	b	-
+chr2	456052	456084	b	b	-
+chr2	456145	456177	a	a	+
+chr2	456135	456167	b	b	-
+chr2	456186	456218	a	a	+
+chr2	456325	456357	b	b	-
+chr2	456442	456474	b	b	-
+chr2	456626	456658	b	b	-
+chr2	457023	457055	a	a	+
+chr2	457193	457225	b	b	-
+chr2	457234	457266	a	a	+
+chr2	457358	457390	a	a	+
+chr2	457383	457415	a	a	+
+chr2	457361	457393	b	b	-
+chr2	457496	457528	b	b	-
+chr2	457543	457575	a	a	+
+chr2	457545	457577	a	a	+
+chr2	457542	457574	b	b	-
+chr2	457578	457610	a	a	+
+chr2	458068	458100	a	a	+
+chr2	458076	458108	b	b	-
+chr2	458133	458165	b	b	-
+chr2	458192	458224	a	a	+
+chr2	458164	458196	b	b	-
+chr2	458198	458230	a	a	+
+chr2	458198	458230	a	a	+
+chr2	458321	458353	a	a	+
+chr2	458339	458371	a	a	+
+chr2	458349	458381	a	a	+
+chr2	458342	458374	b	b	-
+chr2	458394	458426	a	a	+
+chr2	458394	458426	a	a	+
+chr2	458395	458427	a	a	+
+chr2	458574	458606	b	b	-
+chr2	458583	458615	b	b	-
+chr2	458583	458615	b	b	-
+chr2	458583	458615	b	b	-
+chr2	458618	458650	a	a	+
+chr2	458622	458654	a	a	+
+chr2	458591	458623	b	b	-
+chr2	458595	458627	b	b	-
+chr2	458596	458628	b	b	-
+chr2	458612	458644	b	b	-
+chr2	458623	458655	b	b	-
+chr2	458633	458665	b	b	-
+chr2	458637	458669	b	b	-
+chr2	458640	458672	b	b	-
+chr2	458686	458718	a	a	+
+chr2	458705	458737	a	a	+
+chr2	458794	458826	b	b	-
+chr2	458795	458827	b	b	-
+chr2	458834	458866	a	a	+
+chr2	458815	458847	b	b	-
+chr2	458816	458848	b	b	-
+chr2	458850	458882	a	a	+
+chr2	458852	458884	a	a	+
+chr2	458820	458852	b	b	-
+chr2	458821	458853	b	b	-
+chr2	458821	458853	b	b	-
+chr2	458829	458861	b	b	-
+chr2	459019	459051	a	a	+
+chr2	459019	459051	a	a	+
+chr2	458990	459022	b	b	-
+chr2	459023	459055	a	a	+
+chr2	459034	459066	a	a	+
+chr2	459034	459066	a	a	+
+chr2	459002	459034	b	b	-
+chr2	459013	459045	b	b	-
+chr2	459017	459049	b	b	-
+chr2	459017	459049	b	b	-
+chr2	459035	459067	b	b	-
+chr2	459152	459184	b	b	-
+chr2	459272	459304	b	b	-
+chr2	459285	459317	b	b	-
+chr2	459333	459365	a	a	+
+chr2	459361	459393	a	a	+
+chr2	459977	460009	b	b	-
+chr2	460138	460170	a	a	+
+chr2	460130	460162	b	b	-
+chr2	460180	460212	a	a	+
+chr2	460288	460320	a	a	+
+chr2	460387	460419	b	b	-
+chr2	460442	460474	a	a	+
+chr2	460412	460444	b	b	-
+chr2	460466	460498	a	a	+
+chr2	460466	460498	a	a	+
+chr2	460466	460498	a	a	+
+chr2	460485	460517	a	a	+
+chr2	460469	460501	b	b	-
+chr2	460599	460631	b	b	-
+chr2	460632	460664	a	a	+
+chr2	460611	460643	b	b	-
+chr2	460630	460662	b	b	-
+chr2	460633	460665	b	b	-
+chr2	460634	460666	b	b	-
+chr2	460681	460713	a	a	+
+chr2	460684	460716	a	a	+
+chr2	460675	460707	b	b	-
+chr2	460681	460713	b	b	-
+chr2	460757	460789	a	a	+
+chr2	460802	460834	b	b	-
+chr2	460836	460868	a	a	+
+chr2	460840	460872	a	a	+
+chr2	460845	460877	a	a	+
+chr2	460819	460851	b	b	-
+chr2	460854	460886	a	a	+
+chr2	460827	460859	b	b	-
+chr2	460827	460859	b	b	-
+chr2	460837	460869	b	b	-
+chr2	460881	460913	a	a	+
+chr2	460849	460881	b	b	-
+chr2	461015	461047	a	a	+
+chr2	461018	461050	a	a	+
+chr2	461023	461055	a	a	+
+chr2	461086	461118	a	a	+
+chr2	461179	461211	a	a	+
+chr2	461174	461206	b	b	-
+chr2	461207	461239	a	a	+
+chr2	461482	461514	b	b	-
+chr2	461528	461560	a	a	+
+chr2	461529	461561	a	a	+
+chr2	461512	461544	b	b	-
+chr2	461514	461546	b	b	-
+chr2	461547	461579	a	a	+
+chr2	461515	461547	b	b	-
+chr2	461664	461696	b	b	-
+chr2	461698	461730	a	a	+
+chr2	461703	461735	a	a	+
+chr2	461703	461735	a	a	+
+chr2	461676	461708	b	b	-
+chr2	461686	461718	b	b	-
+chr2	461705	461737	b	b	-
+chr2	461865	461897	a	a	+
+chr2	461844	461876	b	b	-
+chr2	461844	461876	b	b	-
+chr2	461844	461876	b	b	-
+chr2	461867	461899	b	b	-
+chr2	461867	461899	b	b	-
+chr2	461906	461938	a	a	+
+chr2	461907	461939	a	a	+
+chr2	461876	461908	b	b	-
+chr2	461899	461931	b	b	-
+chr2	461908	461940	b	b	-
+chr2	462060	462092	a	a	+
+chr2	462068	462100	b	b	-
+chr2	462117	462149	a	a	+
+chr2	462088	462120	b	b	-
+chr2	462091	462123	b	b	-
+chr2	462132	462164	a	a	+
+chr2	462106	462138	b	b	-
+chr2	462139	462171	a	a	+
+chr2	462145	462177	a	a	+
+chr2	462145	462177	a	a	+
+chr2	462114	462146	b	b	-
+chr2	462119	462151	b	b	-
+chr2	462155	462187	a	a	+
+chr2	462155	462187	a	a	+
+chr2	462157	462189	a	a	+
+chr2	462126	462158	b	b	-
+chr2	462126	462158	b	b	-
+chr2	462126	462158	b	b	-
+chr2	462126	462158	b	b	-
+chr2	462128	462160	b	b	-
+chr2	462165	462197	a	a	+
+chr2	462166	462198	a	a	+
+chr2	462166	462198	a	a	+
+chr2	462166	462198	a	a	+
+chr2	462135	462167	b	b	-
+chr2	462136	462168	b	b	-
+chr2	462137	462169	b	b	-
+chr2	462143	462175	b	b	-
+chr2	462143	462175	b	b	-
+chr2	462178	462210	a	a	+
+chr2	462260	462292	a	a	+
+chr2	462286	462318	b	b	-
+chr2	462333	462365	a	a	+
+chr2	462309	462341	b	b	-
+chr2	462321	462353	b	b	-
+chr2	462375	462407	a	a	+
+chr2	462419	462451	b	b	-
+chr2	463124	463156	a	a	+
+chr2	463141	463173	a	a	+
+chr2	463141	463173	a	a	+
+chr2	464068	464100	b	b	-
+chr2	464072	464104	b	b	-
+chr2	464092	464124	b	b	-
+chr2	464128	464160	b	b	-
+chr2	464140	464172	b	b	-
+chr2	464146	464178	b	b	-
+chr2	464158	464190	b	b	-
+chr2	464182	464214	b	b	-
+chr2	465205	465237	b	b	-
+chr2	465313	465345	b	b	-
+chr2	465687	465719	a	a	+
+chr2	465666	465698	b	b	-
+chr2	465694	465726	b	b	-
+chr2	465824	465856	b	b	-
+chr2	465859	465891	a	a	+
+chr2	465841	465873	b	b	-
+chr2	465894	465926	a	a	+
+chr2	465869	465901	b	b	-
+chr2	465892	465924	b	b	-
+chr2	465893	465925	b	b	-
+chr2	465966	465998	a	a	+
+chr2	466618	466650	b	b	-
+chr2	466687	466719	a	a	+
+chr2	466671	466703	b	b	-
+chr2	466818	466850	a	a	+
+chr2	466842	466874	b	b	-
+chr2	466848	466880	b	b	-
+chr2	467097	467129	b	b	-
+chr2	467132	467164	a	a	+
+chr2	467149	467181	b	b	-
+chr2	467154	467186	b	b	-
+chr2	467189	467221	a	a	+
+chr2	467196	467228	a	a	+
+chr2	467197	467229	a	a	+
+chr2	467198	467230	a	a	+
+chr2	467198	467230	a	a	+
+chr2	467198	467230	a	a	+
+chr2	467168	467200	b	b	-
+chr2	467201	467233	a	a	+
+chr2	467172	467204	b	b	-
+chr2	467173	467205	b	b	-
+chr2	467207	467239	a	a	+
+chr2	467208	467240	a	a	+
+chr2	467210	467242	a	a	+
+chr2	467210	467242	a	a	+
+chr2	467210	467242	a	a	+
+chr2	467210	467242	a	a	+
+chr2	467182	467214	b	b	-
+chr2	467182	467214	b	b	-
+chr2	467183	467215	b	b	-
+chr2	467183	467215	b	b	-
+chr2	467183	467215	b	b	-
+chr2	467184	467216	b	b	-
+chr2	467185	467217	b	b	-
+chr2	467187	467219	b	b	-
+chr2	467220	467252	a	a	+
+chr2	467221	467253	a	a	+
+chr2	467221	467253	a	a	+
+chr2	467221	467253	a	a	+
+chr2	467222	467254	a	a	+
+chr2	467222	467254	a	a	+
+chr2	467222	467254	a	a	+
+chr2	467190	467222	b	b	-
+chr2	467190	467222	b	b	-
+chr2	467190	467222	b	b	-
+chr2	467190	467222	b	b	-
+chr2	467191	467223	b	b	-
+chr2	467192	467224	b	b	-
+chr2	467192	467224	b	b	-
+chr2	467192	467224	b	b	-
+chr2	467192	467224	b	b	-
+chr2	467192	467224	b	b	-
+chr2	467193	467225	b	b	-
+chr2	467193	467225	b	b	-
+chr2	467193	467225	b	b	-
+chr2	467230	467262	a	a	+
+chr2	467230	467262	a	a	+
+chr2	467230	467262	a	a	+
+chr2	467230	467262	a	a	+
+chr2	467230	467262	a	a	+
+chr2	467231	467263	a	a	+
+chr2	467231	467263	a	a	+
+chr2	467231	467263	a	a	+
+chr2	467231	467263	a	a	+
+chr2	467231	467263	a	a	+
+chr2	467231	467263	a	a	+
+chr2	467231	467263	a	a	+
+chr2	467255	467287	a	a	+
+chr2	467255	467287	a	a	+
+chr2	467336	467368	b	b	-
+chr2	467342	467374	b	b	-
+chr2	467342	467374	b	b	-
+chr2	467380	467412	a	a	+
+chr2	467380	467412	a	a	+
+chr2	467380	467412	a	a	+
+chr2	467380	467412	a	a	+
+chr2	467387	467419	a	a	+
+chr2	467387	467419	a	a	+
+chr2	467360	467392	b	b	-
+chr2	467398	467430	a	a	+
+chr2	467399	467431	a	a	+
+chr2	467401	467433	a	a	+
+chr2	467370	467402	b	b	-
+chr2	467469	467501	a	a	+
+chr2	467469	467501	a	a	+
+chr2	467554	467586	a	a	+
+chr2	467533	467565	b	b	-
+chr2	467538	467570	b	b	-
+chr2	467548	467580	b	b	-
+chr2	467739	467771	a	a	+
+chr2	467743	467775	a	a	+
+chr2	467829	467861	b	b	-
+chr2	467872	467904	b	b	-
+chr2	467872	467904	b	b	-
+chr2	468052	468084	a	a	+
+chr2	468022	468054	b	b	-
+chr2	468208	468240	a	a	+
+chr2	468266	468298	a	a	+
+chr2	468266	468298	a	a	+
+chr2	468535	468567	b	b	-
+chr2	468881	468913	a	a	+
+chr2	468881	468913	a	a	+
+chr2	468965	468997	a	a	+
+chr2	469077	469109	a	a	+
+chr2	469077	469109	a	a	+
+chr2	469080	469112	b	b	-
+chr2	469270	469302	b	b	-
+chr2	469306	469338	a	a	+
+chr2	469291	469323	b	b	-
+chr2	469492	469524	a	a	+
+chr2	469586	469618	b	b	-
+chr2	470039	470071	b	b	-
+chr2	470205	470237	b	b	-
+chr2	470736	470768	a	a	+
+chr2	471297	471329	a	a	+
+chr2	471455	471487	a	a	+
+chr2	471603	471635	a	a	+
+chr2	471582	471614	b	b	-
+chr2	472501	472533	a	a	+
+chr2	472701	472733	b	b	-
+chr2	472952	472984	b	b	-
+chr2	472981	473013	b	b	-
+chr2	472981	473013	b	b	-
+chr2	473285	473317	b	b	-
+chr2	473477	473509	a	a	+
+chr2	473493	473525	a	a	+
+chr2	473744	473776	b	b	-
+chr2	473796	473828	a	a	+
+chr2	473796	473828	a	a	+
+chr2	473801	473833	a	a	+
+chr2	473801	473833	a	a	+
+chr2	473787	473819	b	b	-
+chr2	473787	473819	b	b	-
+chr2	473787	473819	b	b	-
+chr2	473820	473852	a	a	+
+chr2	473851	473883	a	a	+
+chr2	473851	473883	a	a	+
+chr2	473979	474011	b	b	-
+chr2	474298	474330	b	b	-
+chr2	474335	474367	a	a	+
+chr2	474341	474373	a	a	+
+chr2	474309	474341	b	b	-
+chr2	474342	474374	a	a	+
+chr2	474345	474377	a	a	+
+chr2	474346	474378	a	a	+
+chr2	474315	474347	b	b	-
+chr2	474322	474354	b	b	-
+chr2	474324	474356	b	b	-
+chr2	474324	474356	b	b	-
+chr2	474327	474359	b	b	-
+chr2	474328	474360	b	b	-
+chr2	474328	474360	b	b	-
+chr2	474396	474428	a	a	+
+chr2	474471	474503	b	b	-
+chr2	474513	474545	a	a	+
+chr2	474512	474544	b	b	-
+chr2	474523	474555	b	b	-
+chr2	474523	474555	b	b	-
+chr2	474577	474609	a	a	+
+chr2	474597	474629	a	a	+
+chr2	474622	474654	b	b	-
+chr2	474756	474788	b	b	-
+chr2	474778	474810	b	b	-
+chr2	474838	474870	a	a	+
+chr2	474809	474841	b	b	-
+chr2	474845	474877	a	a	+
+chr2	474813	474845	b	b	-
+chr2	474832	474864	b	b	-
+chr2	474872	474904	b	b	-
+chr2	474930	474962	a	a	+
+chr2	474962	474994	b	b	-
+chr2	475012	475044	a	a	+
+chr2	475029	475061	a	a	+
+chr2	475066	475098	a	a	+
+chr2	475124	475156	a	a	+
+chr2	475141	475173	a	a	+
+chr2	475164	475196	a	a	+
+chr2	475235	475267	a	a	+
+chr2	475322	475354	b	b	-
+chr2	475371	475403	b	b	-
+chr2	475497	475529	b	b	-
+chr2	475621	475653	a	a	+
+chr2	475645	475677	b	b	-
+chr2	475670	475702	b	b	-
+chr2	475725	475757	a	a	+
+chr2	475698	475730	b	b	-
+chr2	475759	475791	b	b	-
+chr2	475791	475823	b	b	-
+chr2	475897	475929	a	a	+
+chr2	475900	475932	b	b	-
+chr2	475945	475977	b	b	-
+chr2	475955	475987	b	b	-
+chr2	476079	476111	b	b	-
+chr2	476128	476160	b	b	-
+chr2	476247	476279	a	a	+
+chr2	476269	476301	a	a	+
+chr2	476238	476270	b	b	-
+chr2	476244	476276	b	b	-
+chr2	476279	476311	a	a	+
+chr2	476282	476314	a	a	+
+chr2	476463	476495	a	a	+
+chr2	476463	476495	a	a	+
+chr2	476469	476501	a	a	+
+chr2	476481	476513	a	a	+
+chr2	476561	476593	b	b	-
+chr2	476599	476631	a	a	+
+chr2	476567	476599	b	b	-
+chr2	476612	476644	a	a	+
+chr2	476613	476645	a	a	+
+chr2	476613	476645	a	a	+
+chr2	476613	476645	a	a	+
+chr2	476582	476614	b	b	-
+chr2	476582	476614	b	b	-
+chr2	476582	476614	b	b	-
+chr2	476582	476614	b	b	-
+chr2	476582	476614	b	b	-
+chr2	476582	476614	b	b	-
+chr2	476582	476614	b	b	-
+chr2	476622	476654	a	a	+
+chr2	476622	476654	a	a	+
+chr2	476622	476654	a	a	+
+chr2	476622	476654	a	a	+
+chr2	476622	476654	a	a	+
+chr2	476623	476655	a	a	+
+chr2	476624	476656	a	a	+
+chr2	476624	476656	a	a	+
+chr2	476632	476664	a	a	+
+chr2	476632	476664	a	a	+
+chr2	476633	476665	a	a	+
+chr2	476610	476642	b	b	-
+chr2	476647	476679	a	a	+
+chr2	476648	476680	a	a	+
+chr2	476648	476680	a	a	+
+chr2	476655	476687	a	a	+
+chr2	476623	476655	b	b	-
+chr2	476623	476655	b	b	-
+chr2	476623	476655	b	b	-
+chr2	476623	476655	b	b	-
+chr2	476623	476655	b	b	-
+chr2	476623	476655	b	b	-
+chr2	476623	476655	b	b	-
+chr2	476623	476655	b	b	-
+chr2	476623	476655	b	b	-
+chr2	476623	476655	b	b	-
+chr2	476624	476656	b	b	-
+chr2	476624	476656	b	b	-
+chr2	476624	476656	b	b	-
+chr2	476624	476656	b	b	-
+chr2	476624	476656	b	b	-
+chr2	476624	476656	b	b	-
+chr2	476667	476699	a	a	+
+chr2	476669	476701	a	a	+
+chr2	476669	476701	a	a	+
+chr2	476690	476722	a	a	+
+chr2	476814	476846	b	b	-
+chr2	476899	476931	a	a	+
+chr2	477658	477690	b	b	-
+chr2	478313	478345	a	a	+
+chr2	478416	478448	b	b	-
+chr2	478734	478766	b	b	-
+chr2	478867	478899	b	b	-
+chr2	479111	479143	b	b	-
+chr2	479315	479347	a	a	+
+chr2	479315	479347	a	a	+
+chr2	479331	479363	a	a	+
+chr2	479299	479331	b	b	-
+chr2	479299	479331	b	b	-
+chr2	479306	479338	b	b	-
+chr2	479309	479341	b	b	-
+chr2	479313	479345	b	b	-
+chr2	479314	479346	b	b	-
+chr2	479353	479385	a	a	+
+chr2	479501	479533	b	b	-
+chr2	479524	479556	b	b	-
+chr2	479628	479660	b	b	-
+chr2	479664	479696	a	a	+
+chr2	479633	479665	b	b	-
+chr2	479671	479703	a	a	+
+chr2	479685	479717	a	a	+
+chr2	479687	479719	b	b	-
+chr2	479864	479896	a	a	+
+chr2	479905	479937	a	a	+
+chr2	479917	479949	a	a	+
+chr2	480077	480109	a	a	+
+chr2	480131	480163	b	b	-
+chr2	480171	480203	b	b	-
+chr2	480231	480263	a	a	+
+chr2	480777	480809	a	a	+
+chr2	480745	480777	b	b	-
+chr2	480752	480784	b	b	-
+chr2	480760	480792	b	b	-
+chr2	480846	480878	b	b	-
+chr2	480863	480895	b	b	-
+chr2	480867	480899	b	b	-
+chr2	480916	480948	a	a	+
+chr2	480887	480919	b	b	-
+chr2	480894	480926	b	b	-
+chr2	480933	480965	a	a	+
+chr2	480934	480966	a	a	+
+chr2	480903	480935	b	b	-
+chr2	480911	480943	b	b	-
+chr2	480945	480977	a	a	+
+chr2	480945	480977	a	a	+
+chr2	480946	480978	a	a	+
+chr2	480947	480979	a	a	+
+chr2	480916	480948	b	b	-
+chr2	480920	480952	b	b	-
+chr2	480920	480952	b	b	-
+chr2	480921	480953	b	b	-
+chr2	480954	480986	a	a	+
+chr2	480923	480955	b	b	-
+chr2	480956	480988	a	a	+
+chr2	480924	480956	b	b	-
+chr2	480957	480989	a	a	+
+chr2	480967	480999	a	a	+
+chr2	480993	481025	a	a	+
+chr2	480999	481031	a	a	+
+chr2	481221	481253	a	a	+
+chr2	481373	481405	a	a	+
+chr2	481436	481468	b	b	-
+chr2	481562	481594	b	b	-
+chr2	481933	481965	a	a	+
+chr2	482534	482566	a	a	+
+chr2	482791	482823	a	a	+
+chr2	482876	482908	b	b	-
+chr2	482979	483011	a	a	+
+chr2	483054	483086	b	b	-
+chr2	483083	483115	b	b	-
+chr2	483137	483169	a	a	+
+chr2	483234	483266	b	b	-
+chr2	483274	483306	b	b	-
+chr2	483284	483316	b	b	-
+chr2	483498	483530	a	a	+
+chr2	483698	483730	a	a	+
+chr2	483667	483699	b	b	-
+chr2	483740	483772	a	a	+
+chr2	483712	483744	b	b	-
+chr2	483712	483744	b	b	-
+chr2	483713	483745	b	b	-
+chr2	483750	483782	a	a	+
+chr2	483724	483756	b	b	-
+chr2	483762	483794	a	a	+
+chr2	483766	483798	a	a	+
+chr2	483734	483766	b	b	-
+chr2	483774	483806	a	a	+
+chr2	483752	483784	b	b	-
+chr2	483798	483830	a	a	+
+chr2	483875	483907	b	b	-
+chr2	483960	483992	a	a	+
+chr2	484141	484173	a	a	+
+chr2	484151	484183	b	b	-
+chr2	484151	484183	b	b	-
+chr2	484161	484193	b	b	-
+chr2	484197	484229	a	a	+
+chr2	484205	484237	b	b	-
+chr2	484205	484237	b	b	-
+chr2	484253	484285	b	b	-
+chr2	484268	484300	b	b	-
+chr2	484268	484300	b	b	-
+chr2	484294	484326	b	b	-
+chr2	484451	484483	a	a	+
+chr2	484451	484483	a	a	+
+chr2	484428	484460	b	b	-
+chr2	484428	484460	b	b	-
+chr2	484437	484469	b	b	-
+chr2	484470	484502	a	a	+
+chr2	484470	484502	a	a	+
+chr2	484476	484508	a	a	+
+chr2	484444	484476	b	b	-
+chr2	484448	484480	b	b	-
+chr2	484448	484480	b	b	-
+chr2	484448	484480	b	b	-
+chr2	484448	484480	b	b	-
+chr2	484481	484513	a	a	+
+chr2	484449	484481	b	b	-
+chr2	484449	484481	b	b	-
+chr2	484449	484481	b	b	-
+chr2	484482	484514	a	a	+
+chr2	484482	484514	a	a	+
+chr2	484450	484482	b	b	-
+chr2	484483	484515	a	a	+
+chr2	484483	484515	a	a	+
+chr2	484483	484515	a	a	+
+chr2	484483	484515	a	a	+
+chr2	484483	484515	a	a	+
+chr2	484484	484516	a	a	+
+chr2	484484	484516	a	a	+
+chr2	484484	484516	a	a	+
+chr2	484484	484516	a	a	+
+chr2	484484	484516	a	a	+
+chr2	484452	484484	b	b	-
+chr2	484453	484485	b	b	-
+chr2	484453	484485	b	b	-
+chr2	484453	484485	b	b	-
+chr2	484453	484485	b	b	-
+chr2	484453	484485	b	b	-
+chr2	484457	484489	b	b	-
+chr2	484457	484489	b	b	-
+chr2	484457	484489	b	b	-
+chr2	484457	484489	b	b	-
+chr2	484490	484522	a	a	+
+chr2	484459	484491	b	b	-
+chr2	484494	484526	a	a	+
+chr2	484496	484528	a	a	+
+chr2	484496	484528	a	a	+
+chr2	484496	484528	a	a	+
+chr2	484496	484528	a	a	+
+chr2	484496	484528	a	a	+
+chr2	484464	484496	b	b	-
+chr2	484464	484496	b	b	-
+chr2	484464	484496	b	b	-
+chr2	484464	484496	b	b	-
+chr2	484465	484497	b	b	-
+chr2	484465	484497	b	b	-
+chr2	484505	484537	a	a	+
+chr2	484514	484546	a	a	+
+chr2	484514	484546	a	a	+
+chr2	484524	484556	a	a	+
+chr2	484670	484702	b	b	-
+chr2	484706	484738	b	b	-
+chr2	484707	484739	b	b	-
+chr2	484744	484776	a	a	+
+chr2	484761	484793	a	a	+
+chr2	484762	484794	a	a	+
+chr2	484765	484797	a	a	+
+chr2	484770	484802	a	a	+
+chr2	484738	484770	b	b	-
+chr2	484738	484770	b	b	-
+chr2	484738	484770	b	b	-
+chr2	484745	484777	b	b	-
+chr2	484766	484798	b	b	-
+chr2	484800	484832	a	a	+
+chr2	484800	484832	a	a	+
+chr2	484769	484801	b	b	-
+chr2	484810	484842	a	a	+
+chr2	484782	484814	b	b	-
+chr2	484794	484826	b	b	-
+chr2	484887	484919	b	b	-
+chr2	484920	484952	a	a	+
+chr2	484888	484920	b	b	-
+chr2	484926	484958	a	a	+
+chr2	484895	484927	b	b	-
+chr2	484895	484927	b	b	-
+chr2	484914	484946	b	b	-
+chr2	484914	484946	b	b	-
+chr2	484914	484946	b	b	-
+chr2	484918	484950	b	b	-
+chr2	484931	484963	b	b	-
+chr2	485080	485112	a	a	+
+chr2	485102	485134	a	a	+
+chr2	485079	485111	b	b	-
+chr2	485202	485234	b	b	-
+chr2	485386	485418	a	a	+
+chr2	485830	485862	b	b	-
+chr2	486037	486069	a	a	+
+chr2	486047	486079	a	a	+
+chr2	486310	486342	b	b	-
+chr2	486326	486358	b	b	-
+chr2	486378	486410	a	a	+
+chr2	486470	486502	a	a	+
+chr2	486449	486481	b	b	-
+chr2	486460	486492	b	b	-
+chr2	486495	486527	a	a	+
+chr2	486495	486527	a	a	+
+chr2	486466	486498	b	b	-
+chr2	486474	486506	b	b	-
+chr2	486508	486540	a	a	+
+chr2	486493	486525	b	b	-
+chr2	486494	486526	b	b	-
+chr2	486542	486574	b	b	-
+chr2	486542	486574	b	b	-
+chr2	486643	486675	a	a	+
+chr2	486612	486644	b	b	-
+chr2	486617	486649	b	b	-
+chr2	486617	486649	b	b	-
+chr2	486618	486650	b	b	-
+chr2	486652	486684	b	b	-
+chr2	486690	486722	a	a	+
+chr2	486693	486725	a	a	+
+chr2	486693	486725	a	a	+
+chr2	486668	486700	b	b	-
+chr2	486672	486704	b	b	-
+chr2	486672	486704	b	b	-
+chr2	486676	486708	b	b	-
+chr2	486678	486710	b	b	-
+chr2	486714	486746	a	a	+
+chr2	487147	487179	a	a	+
+chr2	487266	487298	b	b	-
+chr2	487594	487626	a	a	+
+chr2	487687	487719	a	a	+
+chr2	487664	487696	b	b	-
+chr2	487819	487851	a	a	+
+chr2	487820	487852	a	a	+
+chr2	487832	487864	a	a	+
+chr2	488092	488124	a	a	+
+chr2	488166	488198	a	a	+
+chr2	488145	488177	b	b	-
+chr2	488277	488309	b	b	-
+chr2	488324	488356	a	a	+
+chr2	488329	488361	a	a	+
+chr2	488329	488361	a	a	+
+chr2	488312	488344	b	b	-
+chr2	488353	488385	a	a	+
+chr2	488385	488417	b	b	-
+chr2	488430	488462	b	b	-
+chr2	488446	488478	b	b	-
+chr2	488446	488478	b	b	-
+chr2	488455	488487	b	b	-
+chr2	488457	488489	b	b	-
+chr2	488491	488523	a	a	+
+chr2	488466	488498	b	b	-
+chr2	488502	488534	a	a	+
+chr2	488502	488534	a	a	+
+chr2	488502	488534	a	a	+
+chr2	488474	488506	b	b	-
+chr2	488475	488507	b	b	-
+chr2	488509	488541	a	a	+
+chr2	488509	488541	a	a	+
+chr2	488477	488509	b	b	-
+chr2	488477	488509	b	b	-
+chr2	488477	488509	b	b	-
+chr2	488477	488509	b	b	-
+chr2	488477	488509	b	b	-
+chr2	488511	488543	a	a	+
+chr2	488512	488544	a	a	+
+chr2	488512	488544	a	a	+
+chr2	488512	488544	a	a	+
+chr2	488483	488515	b	b	-
+chr2	488484	488516	b	b	-
+chr2	488484	488516	b	b	-
+chr2	488485	488517	b	b	-
+chr2	488486	488518	b	b	-
+chr2	488486	488518	b	b	-
+chr2	488487	488519	b	b	-
+chr2	488487	488519	b	b	-
+chr2	488525	488557	a	a	+
+chr2	488494	488526	b	b	-
+chr2	488494	488526	b	b	-
+chr2	488494	488526	b	b	-
+chr2	488494	488526	b	b	-
+chr2	488533	488565	a	a	+
+chr2	488533	488565	a	a	+
+chr2	488539	488571	a	a	+
+chr2	488539	488571	a	a	+
+chr2	488539	488571	a	a	+
+chr2	488539	488571	a	a	+
+chr2	488730	488762	b	b	-
+chr2	488788	488820	a	a	+
+chr2	488762	488794	b	b	-
+chr2	488795	488827	a	a	+
+chr2	488764	488796	b	b	-
+chr2	488764	488796	b	b	-
+chr2	488798	488830	a	a	+
+chr2	488798	488830	a	a	+
+chr2	488790	488822	b	b	-
+chr2	488877	488909	b	b	-
+chr2	488987	489019	a	a	+
+chr2	489132	489164	a	a	+
+chr2	489347	489379	a	a	+
+chr2	489603	489635	b	b	-
+chr2	489670	489702	a	a	+
+chr2	489646	489678	b	b	-
+chr2	489746	489778	b	b	-
+chr2	489847	489879	a	a	+
+chr2	490031	490063	a	a	+
+chr2	490084	490116	b	b	-
+chr2	490100	490132	b	b	-
+chr2	490101	490133	b	b	-
+chr2	490162	490194	a	a	+
+chr2	490162	490194	a	a	+
+chr2	490257	490289	a	a	+
+chr2	490257	490289	a	a	+
+chr2	490297	490329	a	a	+
+chr2	490269	490301	b	b	-
+chr2	490269	490301	b	b	-
+chr2	490269	490301	b	b	-
+chr2	490293	490325	b	b	-
+chr2	490335	490367	a	a	+
+chr2	490317	490349	b	b	-
+chr2	490350	490382	a	a	+
+chr2	490370	490402	a	a	+
+chr2	490381	490413	a	a	+
+chr2	490465	490497	a	a	+
+chr2	490465	490497	a	a	+
+chr2	490448	490480	b	b	-
+chr2	490448	490480	b	b	-
+chr2	490484	490516	a	a	+
+chr2	490452	490484	b	b	-
+chr2	490452	490484	b	b	-
+chr2	490454	490486	b	b	-
+chr2	490454	490486	b	b	-
+chr2	490489	490521	a	a	+
+chr2	490469	490501	b	b	-
+chr2	490469	490501	b	b	-
+chr2	490504	490536	a	a	+
+chr2	490511	490543	a	a	+
+chr2	490513	490545	a	a	+
+chr2	490516	490548	a	a	+
+chr2	490667	490699	b	b	-
+chr2	490761	490793	b	b	-
+chr2	490831	490863	a	a	+
+chr2	490840	490872	a	a	+
+chr2	490812	490844	b	b	-
+chr2	490814	490846	b	b	-
+chr2	490815	490847	b	b	-
+chr2	490853	490885	a	a	+
+chr2	490854	490886	a	a	+
+chr2	490862	490894	a	a	+
+chr2	491011	491043	a	a	+
+chr2	490983	491015	b	b	-
+chr2	491024	491056	a	a	+
+chr2	491312	491344	b	b	-
+chr2	491366	491398	b	b	-
+chr2	491367	491399	b	b	-
+chr2	491531	491563	b	b	-
+chr2	491653	491685	b	b	-
+chr2	491653	491685	b	b	-
+chr2	491861	491893	b	b	-
+chr2	491861	491893	b	b	-
+chr2	491915	491947	a	a	+
+chr2	492163	492195	b	b	-
+chr2	492216	492248	b	b	-
+chr2	492297	492329	b	b	-
+chr2	492346	492378	a	a	+
+chr2	492555	492587	b	b	-
+chr2	492641	492673	a	a	+
+chr2	492623	492655	b	b	-
+chr2	492770	492802	b	b	-
+chr2	492770	492802	b	b	-
+chr2	492773	492805	b	b	-
+chr2	492808	492840	a	a	+
+chr2	492808	492840	a	a	+
+chr2	492808	492840	a	a	+
+chr2	492811	492843	a	a	+
+chr2	492811	492843	a	a	+
+chr2	492811	492843	a	a	+
+chr2	492811	492843	a	a	+
+chr2	492784	492816	b	b	-
+chr2	492818	492850	a	a	+
+chr2	492790	492822	b	b	-
+chr2	492827	492859	a	a	+
+chr2	492808	492840	b	b	-
+chr2	493045	493077	b	b	-
+chr2	493045	493077	b	b	-
+chr2	493047	493079	b	b	-
+chr2	493047	493079	b	b	-
+chr2	493047	493079	b	b	-
+chr2	493048	493080	b	b	-
+chr2	493081	493113	a	a	+
+chr2	493054	493086	b	b	-
+chr2	493056	493088	b	b	-
+chr2	493061	493093	b	b	-
+chr2	493096	493128	a	a	+
+chr2	493096	493128	a	a	+
+chr2	493096	493128	a	a	+
+chr2	493096	493128	a	a	+
+chr2	493064	493096	b	b	-
+chr2	493097	493129	a	a	+
+chr2	493097	493129	a	a	+
+chr2	493097	493129	a	a	+
+chr2	493065	493097	b	b	-
+chr2	493101	493133	a	a	+
+chr2	493101	493133	a	a	+
+chr2	493101	493133	a	a	+
+chr2	493070	493102	b	b	-
+chr2	493070	493102	b	b	-
+chr2	493072	493104	b	b	-
+chr2	493076	493108	b	b	-
+chr2	493076	493108	b	b	-
+chr2	493077	493109	b	b	-
+chr2	493080	493112	b	b	-
+chr2	493082	493114	b	b	-
+chr2	493082	493114	b	b	-
+chr2	493082	493114	b	b	-
+chr2	493082	493114	b	b	-
+chr2	493083	493115	b	b	-
+chr2	493118	493150	a	a	+
+chr2	493119	493151	a	a	+
+chr2	493120	493152	a	a	+
+chr2	493120	493152	a	a	+
+chr2	493120	493152	a	a	+
+chr2	493120	493152	a	a	+
+chr2	493088	493120	b	b	-
+chr2	493124	493156	a	a	+
+chr2	493094	493126	b	b	-
+chr2	493094	493126	b	b	-
+chr2	493101	493133	b	b	-
+chr2	493101	493133	b	b	-
+chr2	493101	493133	b	b	-
+chr2	493101	493133	b	b	-
+chr2	493101	493133	b	b	-
+chr2	493101	493133	b	b	-
+chr2	493137	493169	a	a	+
+chr2	493138	493170	a	a	+
+chr2	493154	493186	a	a	+
+chr2	493155	493187	a	a	+
+chr2	493172	493204	a	a	+
+chr2	493142	493174	b	b	-
+chr2	493142	493174	b	b	-
+chr2	493230	493262	b	b	-
+chr2	493264	493296	a	a	+
+chr2	493233	493265	b	b	-
+chr2	493234	493266	b	b	-
+chr2	493234	493266	b	b	-
+chr2	493282	493314	a	a	+
+chr2	493269	493301	b	b	-
+chr2	493302	493334	a	a	+
+chr2	493330	493362	a	a	+
+chr2	493329	493361	b	b	-
+chr2	493428	493460	a	a	+
+chr2	493577	493609	a	a	+
+chr2	493555	493587	b	b	-
+chr2	493589	493621	b	b	-
+chr2	493628	493660	a	a	+
+chr2	493628	493660	a	a	+
+chr2	493655	493687	a	a	+
+chr2	493763	493795	a	a	+
+chr2	493790	493822	a	a	+
+chr2	493778	493810	b	b	-
+chr2	493875	493907	b	b	-
+chr2	493885	493917	b	b	-
+chr2	493924	493956	a	a	+
+chr2	493895	493927	b	b	-
+chr2	493940	493972	a	a	+
+chr2	493980	494012	a	a	+
+chr2	493998	494030	b	b	-
+chr2	494012	494044	b	b	-
+chr2	494063	494095	a	a	+
+chr2	494065	494097	a	a	+
+chr2	494067	494099	a	a	+
+chr2	494067	494099	a	a	+
+chr2	494067	494099	a	a	+
+chr2	494067	494099	a	a	+
+chr2	494050	494082	b	b	-
+chr2	494050	494082	b	b	-
+chr2	494087	494119	a	a	+
+chr2	494087	494119	a	a	+
+chr2	494088	494120	a	a	+
+chr2	494088	494120	a	a	+
+chr2	494088	494120	a	a	+
+chr2	494088	494120	a	a	+
+chr2	494088	494120	a	a	+
+chr2	494056	494088	b	b	-
+chr2	494090	494122	a	a	+
+chr2	494091	494123	a	a	+
+chr2	494093	494125	a	a	+
+chr2	494096	494128	a	a	+
+chr2	494096	494128	a	a	+
+chr2	494096	494128	a	a	+
+chr2	494097	494129	a	a	+
+chr2	494097	494129	a	a	+
+chr2	494097	494129	a	a	+
+chr2	494097	494129	a	a	+
+chr2	494097	494129	a	a	+
+chr2	494065	494097	b	b	-
+chr2	494099	494131	a	a	+
+chr2	494070	494102	b	b	-
+chr2	494070	494102	b	b	-
+chr2	494103	494135	a	a	+
+chr2	494103	494135	a	a	+
+chr2	494103	494135	a	a	+
+chr2	494073	494105	b	b	-
+chr2	494106	494138	a	a	+
+chr2	494106	494138	a	a	+
+chr2	494106	494138	a	a	+
+chr2	494106	494138	a	a	+
+chr2	494074	494106	b	b	-
+chr2	494074	494106	b	b	-
+chr2	494077	494109	b	b	-
+chr2	494077	494109	b	b	-
+chr2	494078	494110	b	b	-
+chr2	494080	494112	b	b	-
+chr2	494087	494119	b	b	-
+chr2	494088	494120	b	b	-
+chr2	494125	494157	a	a	+
+chr2	494093	494125	b	b	-
+chr2	494094	494126	b	b	-
+chr2	494094	494126	b	b	-
+chr2	494094	494126	b	b	-
+chr2	494094	494126	b	b	-
+chr2	494132	494164	a	a	+
+chr2	494132	494164	a	a	+
+chr2	494135	494167	a	a	+
+chr2	494143	494175	a	a	+
+chr2	494143	494175	a	a	+
+chr2	494113	494145	b	b	-
+chr2	494147	494179	a	a	+
+chr2	494119	494151	b	b	-
+chr2	494187	494219	a	a	+
+chr2	494503	494535	a	a	+
+chr2	494671	494703	a	a	+
+chr2	494657	494689	b	b	-
+chr2	494810	494842	a	a	+
+chr2	494786	494818	b	b	-
+chr2	494788	494820	b	b	-
+chr2	494973	495005	a	a	+
+chr2	494973	495005	a	a	+
+chr2	494981	495013	a	a	+
+chr2	494990	495022	a	a	+
+chr2	494964	494996	b	b	-
+chr2	495015	495047	b	b	-
+chr2	495124	495156	a	a	+
+chr2	495124	495156	a	a	+
+chr2	495132	495164	a	a	+
+chr2	495100	495132	b	b	-
+chr2	495133	495165	a	a	+
+chr2	495106	495138	b	b	-
+chr2	495111	495143	b	b	-
+chr2	495124	495156	b	b	-
+chr2	495124	495156	b	b	-
+chr2	495163	495195	a	a	+
+chr2	495163	495195	a	a	+
+chr2	495163	495195	a	a	+
+chr2	495163	495195	a	a	+
+chr2	495163	495195	a	a	+
+chr2	495163	495195	a	a	+
+chr2	495163	495195	a	a	+
+chr2	495137	495169	b	b	-
+chr2	495137	495169	b	b	-
+chr2	495137	495169	b	b	-
+chr2	495139	495171	b	b	-
+chr2	495141	495173	b	b	-
+chr2	495145	495177	b	b	-
+chr2	495153	495185	b	b	-
+chr2	495153	495185	b	b	-
+chr2	495153	495185	b	b	-
+chr2	495164	495196	b	b	-
+chr2	495201	495233	a	a	+
+chr2	495239	495271	b	b	-
+chr2	495239	495271	b	b	-
+chr2	495248	495280	b	b	-
+chr2	495290	495322	a	a	+
+chr2	495263	495295	b	b	-
+chr2	495264	495296	b	b	-
+chr2	495303	495335	a	a	+
+chr2	495303	495335	a	a	+
+chr2	495303	495335	a	a	+
+chr2	495303	495335	a	a	+
+chr2	495305	495337	a	a	+
+chr2	495305	495337	a	a	+
+chr2	495305	495337	a	a	+
+chr2	495307	495339	a	a	+
+chr2	495277	495309	b	b	-
+chr2	495310	495342	a	a	+
+chr2	495310	495342	a	a	+
+chr2	495278	495310	b	b	-
+chr2	495316	495348	a	a	+
+chr2	495286	495318	b	b	-
+chr2	495321	495353	a	a	+
+chr2	495289	495321	b	b	-
+chr2	495324	495356	a	a	+
+chr2	495324	495356	a	a	+
+chr2	495324	495356	a	a	+
+chr2	495324	495356	a	a	+
+chr2	495324	495356	a	a	+
+chr2	495293	495325	b	b	-
+chr2	495293	495325	b	b	-
+chr2	495293	495325	b	b	-
+chr2	495326	495358	a	a	+
+chr2	495326	495358	a	a	+
+chr2	495326	495358	a	a	+
+chr2	495326	495358	a	a	+
+chr2	495326	495358	a	a	+
+chr2	495326	495358	a	a	+
+chr2	495296	495328	b	b	-
+chr2	495296	495328	b	b	-
+chr2	495296	495328	b	b	-
+chr2	495296	495328	b	b	-
+chr2	495296	495328	b	b	-
+chr2	495297	495329	b	b	-
+chr2	495307	495339	b	b	-
+chr2	495340	495372	a	a	+
+chr2	495309	495341	b	b	-
+chr2	495309	495341	b	b	-
+chr2	495345	495377	a	a	+
+chr2	495346	495378	a	a	+
+chr2	495346	495378	a	a	+
+chr2	495348	495380	a	a	+
+chr2	495394	495426	b	b	-
+chr2	495534	495566	b	b	-
+chr2	495543	495575	b	b	-
+chr2	495565	495597	b	b	-
+chr2	495565	495597	b	b	-
+chr2	495567	495599	b	b	-
+chr2	495604	495636	a	a	+
+chr2	495605	495637	a	a	+
+chr2	495573	495605	b	b	-
+chr2	495606	495638	a	a	+
+chr2	495606	495638	a	a	+
+chr2	495579	495611	b	b	-
+chr2	495592	495624	b	b	-
+chr2	495592	495624	b	b	-
+chr2	495593	495625	b	b	-
+chr2	495593	495625	b	b	-
+chr2	495593	495625	b	b	-
+chr2	495776	495808	a	a	+
+chr2	495753	495785	b	b	-
+chr2	495813	495845	a	a	+
+chr2	495839	495871	a	a	+
+chr2	496363	496395	a	a	+
+chr2	496361	496393	b	b	-
+chr2	496490	496522	a	a	+
+chr2	496535	496567	a	a	+
+chr2	496656	496688	b	b	-
+chr2	496711	496743	a	a	+
+chr2	496713	496745	a	a	+
+chr2	496685	496717	b	b	-
+chr2	496696	496728	b	b	-
+chr2	496842	496874	a	a	+
+chr2	496823	496855	b	b	-
+chr2	496859	496891	a	a	+
+chr2	496867	496899	a	a	+
+chr2	496868	496900	a	a	+
+chr2	496838	496870	b	b	-
+chr2	496838	496870	b	b	-
+chr2	496840	496872	b	b	-
+chr2	496841	496873	b	b	-
+chr2	496875	496907	a	a	+
+chr2	496878	496910	a	a	+
+chr2	496878	496910	a	a	+
+chr2	496846	496878	b	b	-
+chr2	496848	496880	b	b	-
+chr2	496848	496880	b	b	-
+chr2	496848	496880	b	b	-
+chr2	496848	496880	b	b	-
+chr2	496848	496880	b	b	-
+chr2	496849	496881	b	b	-
+chr2	496882	496914	a	a	+
+chr2	496882	496914	a	a	+
+chr2	496883	496915	a	a	+
+chr2	496883	496915	a	a	+
+chr2	496883	496915	a	a	+
+chr2	496883	496915	a	a	+
+chr2	496883	496915	a	a	+
+chr2	496851	496883	b	b	-
+chr2	496884	496916	a	a	+
+chr2	496884	496916	a	a	+
+chr2	496884	496916	a	a	+
+chr2	496884	496916	a	a	+
+chr2	496852	496884	b	b	-
+chr2	496852	496884	b	b	-
+chr2	496852	496884	b	b	-
+chr2	496853	496885	b	b	-
+chr2	496887	496919	a	a	+
+chr2	496856	496888	b	b	-
+chr2	496856	496888	b	b	-
+chr2	496859	496891	b	b	-
+chr2	496897	496929	a	a	+
+chr2	496900	496932	a	a	+
+chr2	497140	497172	a	a	+
+chr2	497119	497151	b	b	-
+chr2	497131	497163	b	b	-
+chr2	497164	497196	a	a	+
+chr2	497166	497198	a	a	+
+chr2	497134	497166	b	b	-
+chr2	497135	497167	b	b	-
+chr2	497135	497167	b	b	-
+chr2	497135	497167	b	b	-
+chr2	497136	497168	b	b	-
+chr2	497147	497179	b	b	-
+chr2	497184	497216	a	a	+
+chr2	497193	497225	a	a	+
+chr2	497165	497197	b	b	-
+chr2	497454	497486	b	b	-
+chr2	497591	497623	b	b	-
+chr2	497846	497878	a	a	+
+chr2	498361	498393	a	a	+
+chr2	498381	498413	a	a	+
+chr2	498384	498416	a	a	+
+chr2	498768	498800	b	b	-
+chr2	499222	499254	a	a	+
+chr2	499919	499951	b	b	-
+chr2	500358	500390	b	b	-
+chr2	500514	500546	a	a	+
+chr2	500619	500651	a	a	+
+chr2	500936	500968	a	a	+
+chr2	501044	501076	a	a	+
+chr2	501051	501083	a	a	+
+chr2	501203	501235	b	b	-
+chr2	501203	501235	b	b	-
+chr2	501246	501278	a	a	+
+chr2	501216	501248	b	b	-
+chr2	501367	501399	a	a	+
+chr2	501536	501568	a	a	+
+chr2	501550	501582	a	a	+
+chr2	501550	501582	a	a	+
+chr2	501560	501592	a	a	+
+chr2	501534	501566	b	b	-
+chr2	501536	501568	b	b	-
+chr2	501541	501573	b	b	-
+chr2	501541	501573	b	b	-
+chr2	501771	501803	b	b	-
+chr2	501798	501830	b	b	-
+chr2	501801	501833	b	b	-
+chr2	501853	501885	a	a	+
+chr2	501857	501889	a	a	+
+chr2	501859	501891	a	a	+
+chr2	501859	501891	a	a	+
+chr2	501861	501893	a	a	+
+chr2	501875	501907	a	a	+
+chr2	501846	501878	b	b	-
+chr2	502042	502074	a	a	+
+chr2	502042	502074	a	a	+
+chr2	502042	502074	a	a	+
+chr2	502893	502925	a	a	+
+chr2	503109	503141	a	a	+
+chr2	503162	503194	a	a	+
+chr2	503644	503676	a	a	+
+chr2	504012	504044	b	b	-
+chr2	504055	504087	a	a	+
+chr2	504194	504226	b	b	-
+chr2	504198	504230	b	b	-
+chr2	504198	504230	b	b	-
+chr2	504339	504371	a	a	+
+chr2	504379	504411	a	a	+
+chr2	504379	504411	a	a	+
+chr2	504379	504411	a	a	+
+chr2	504347	504379	b	b	-
+chr2	504347	504379	b	b	-
+chr2	504347	504379	b	b	-
+chr2	504380	504412	a	a	+
+chr2	504351	504383	b	b	-
+chr2	504353	504385	b	b	-
+chr2	504353	504385	b	b	-
+chr2	504355	504387	b	b	-
+chr2	504355	504387	b	b	-
+chr2	504388	504420	a	a	+
+chr2	504390	504422	a	a	+
+chr2	504397	504429	a	a	+
+chr2	504365	504397	b	b	-
+chr2	504700	504732	b	b	-
+chr2	504731	504763	b	b	-
+chr2	504785	504817	a	a	+
+chr2	504786	504818	a	a	+
+chr2	504786	504818	a	a	+
+chr2	504755	504787	b	b	-
+chr2	504757	504789	b	b	-
+chr2	504759	504791	b	b	-
+chr2	504794	504826	a	a	+
+chr2	504794	504826	a	a	+
+chr2	504794	504826	a	a	+
+chr2	504799	504831	a	a	+
+chr2	504799	504831	a	a	+
+chr2	504799	504831	a	a	+
+chr2	504768	504800	b	b	-
+chr2	504801	504833	a	a	+
+chr2	504769	504801	b	b	-
+chr2	504773	504805	b	b	-
+chr2	504775	504807	b	b	-
+chr2	504775	504807	b	b	-
+chr2	504775	504807	b	b	-
+chr2	504775	504807	b	b	-
+chr2	504812	504844	a	a	+
+chr2	504812	504844	a	a	+
+chr2	504780	504812	b	b	-
+chr2	504780	504812	b	b	-
+chr2	504780	504812	b	b	-
+chr2	504780	504812	b	b	-
+chr2	504780	504812	b	b	-
+chr2	504781	504813	b	b	-
+chr2	504781	504813	b	b	-
+chr2	504814	504846	a	a	+
+chr2	504814	504846	a	a	+
+chr2	504814	504846	a	a	+
+chr2	504784	504816	b	b	-
+chr2	504784	504816	b	b	-
+chr2	504784	504816	b	b	-
+chr2	504784	504816	b	b	-
+chr2	504784	504816	b	b	-
+chr2	504784	504816	b	b	-
+chr2	504784	504816	b	b	-
+chr2	504817	504849	a	a	+
+chr2	504817	504849	a	a	+
+chr2	504789	504821	b	b	-
+chr2	504824	504856	a	a	+
+chr2	504824	504856	a	a	+
+chr2	504792	504824	b	b	-
+chr2	504792	504824	b	b	-
+chr2	504793	504825	b	b	-
+chr2	504827	504859	a	a	+
+chr2	504836	504868	a	a	+
+chr2	504804	504836	b	b	-
+chr2	504831	504863	b	b	-
+chr2	504962	504994	a	a	+
+chr2	504964	504996	a	a	+
+chr2	504972	505004	a	a	+
+chr2	504972	505004	a	a	+
+chr2	504943	504975	b	b	-
+chr2	504943	504975	b	b	-
+chr2	504943	504975	b	b	-
+chr2	504943	504975	b	b	-
+chr2	504984	505016	a	a	+
+chr2	504984	505016	a	a	+
+chr2	504984	505016	a	a	+
+chr2	504984	505016	a	a	+
+chr2	504952	504984	b	b	-
+chr2	504989	505021	a	a	+
+chr2	504988	505020	b	b	-
+chr2	505055	505087	b	b	-
+chr2	505095	505127	b	b	-
+chr2	505133	505165	a	a	+
+chr2	505116	505148	b	b	-
+chr2	505168	505200	b	b	-
+chr2	505273	505305	a	a	+
+chr2	505276	505308	a	a	+
+chr2	505636	505668	a	a	+
+chr2	505628	505660	b	b	-
+chr2	505628	505660	b	b	-
+chr2	505635	505667	b	b	-
+chr2	505672	505704	a	a	+
+chr2	505672	505704	a	a	+
+chr2	505672	505704	a	a	+
+chr2	505672	505704	a	a	+
+chr2	505640	505672	b	b	-
+chr2	505675	505707	a	a	+
+chr2	505675	505707	a	a	+
+chr2	505680	505712	a	a	+
+chr2	505680	505712	a	a	+
+chr2	505680	505712	a	a	+
+chr2	505681	505713	a	a	+
+chr2	505681	505713	a	a	+
+chr2	505681	505713	a	a	+
+chr2	505681	505713	a	a	+
+chr2	505681	505713	a	a	+
+chr2	505681	505713	a	a	+
+chr2	505681	505713	a	a	+
+chr2	505682	505714	a	a	+
+chr2	505683	505715	a	a	+
+chr2	505683	505715	a	a	+
+chr2	505685	505717	a	a	+
+chr2	505685	505717	a	a	+
+chr2	505653	505685	b	b	-
+chr2	505689	505721	a	a	+
+chr2	505657	505689	b	b	-
+chr2	505661	505693	b	b	-
+chr2	505661	505693	b	b	-
+chr2	505661	505693	b	b	-
+chr2	505661	505693	b	b	-
+chr2	505661	505693	b	b	-
+chr2	505661	505693	b	b	-
+chr2	505661	505693	b	b	-
+chr2	505661	505693	b	b	-
+chr2	505661	505693	b	b	-
+chr2	505662	505694	b	b	-
+chr2	505662	505694	b	b	-
+chr2	505662	505694	b	b	-
+chr2	505695	505727	a	a	+
+chr2	505695	505727	a	a	+
+chr2	505663	505695	b	b	-
+chr2	505696	505728	a	a	+
+chr2	505664	505696	b	b	-
+chr2	505664	505696	b	b	-
+chr2	505664	505696	b	b	-
+chr2	505664	505696	b	b	-
+chr2	505664	505696	b	b	-
+chr2	505664	505696	b	b	-
+chr2	505667	505699	b	b	-
+chr2	505667	505699	b	b	-
+chr2	505701	505733	a	a	+
+chr2	505701	505733	a	a	+
+chr2	505670	505702	b	b	-
+chr2	505670	505702	b	b	-
+chr2	505670	505702	b	b	-
+chr2	505704	505736	a	a	+
+chr2	505672	505704	b	b	-
+chr2	505672	505704	b	b	-
+chr2	505675	505707	b	b	-
+chr2	505675	505707	b	b	-
+chr2	505708	505740	a	a	+
+chr2	505710	505742	a	a	+
+chr2	505683	505715	b	b	-
+chr2	505683	505715	b	b	-
+chr2	505684	505716	b	b	-
+chr2	505717	505749	a	a	+
+chr2	505718	505750	a	a	+
+chr2	505741	505773	a	a	+
+chr2	505826	505858	a	a	+
+chr2	505820	505852	b	b	-
+chr2	505828	505860	b	b	-
+chr2	505832	505864	b	b	-
+chr2	505868	505900	a	a	+
+chr2	505845	505877	b	b	-
+chr2	506002	506034	a	a	+
+chr2	505979	506011	b	b	-
+chr2	506042	506074	a	a	+
+chr2	506043	506075	a	a	+
+chr2	506098	506130	b	b	-
+chr2	506204	506236	a	a	+
+chr2	506349	506381	b	b	-
+chr2	506752	506784	b	b	-
+chr2	506789	506821	b	b	-
+chr2	506827	506859	a	a	+
+chr2	506806	506838	b	b	-
+chr2	506977	507009	a	a	+
+chr2	507012	507044	b	b	-
+chr2	507060	507092	b	b	-
+chr2	507251	507283	a	a	+
+chr2	507308	507340	a	a	+
+chr2	507525	507557	a	a	+
+chr2	507583	507615	a	a	+
+chr2	508227	508259	b	b	-
+chr2	508227	508259	b	b	-
+chr2	508698	508730	b	b	-
+chr2	509248	509280	b	b	-
+chr2	509800	509832	b	b	-
+chr2	509846	509878	b	b	-
+chr2	510186	510218	a	a	+
+chr2	510188	510220	a	a	+
+chr2	510618	510650	a	a	+
+chr2	510738	510770	b	b	-
+chr2	510780	510812	a	a	+
+chr2	510847	510879	b	b	-
+chr2	510984	511016	a	a	+
+chr2	511103	511135	a	a	+
+chr2	511167	511199	a	a	+
+chr2	511291	511323	b	b	-
+chr2	511365	511397	b	b	-
+chr2	511649	511681	b	b	-
+chr2	511793	511825	b	b	-
+chr2	511818	511850	b	b	-
+chr2	511880	511912	a	a	+
+chr2	511964	511996	b	b	-
+chr2	512124	512156	b	b	-
+chr2	512313	512345	a	a	+
+chr2	512319	512351	a	a	+
+chr2	512429	512461	a	a	+
+chr2	512478	512510	a	a	+
+chr2	512519	512551	a	a	+
+chr2	512521	512553	a	a	+
+chr2	512499	512531	b	b	-
+chr2	512636	512668	a	a	+
+chr2	512669	512701	a	a	+
+chr2	512682	512714	a	a	+
+chr2	512682	512714	a	a	+
+chr2	512688	512720	a	a	+
+chr2	512688	512720	a	a	+
+chr2	512658	512690	b	b	-
+chr2	512696	512728	a	a	+
+chr2	512676	512708	b	b	-
+chr2	512709	512741	a	a	+
+chr2	512710	512742	a	a	+
+chr2	512714	512746	a	a	+
+chr2	512727	512759	a	a	+
+chr2	512727	512759	a	a	+
+chr2	512727	512759	a	a	+
+chr2	512696	512728	b	b	-
+chr2	512702	512734	b	b	-
+chr2	512702	512734	b	b	-
+chr2	512721	512753	b	b	-
+chr2	512742	512774	b	b	-
+chr2	512803	512835	b	b	-
+chr2	512834	512866	b	b	-
+chr2	512943	512975	b	b	-
+chr2	512943	512975	b	b	-
+chr2	512997	513029	b	b	-
+chr2	513081	513113	b	b	-
+chr2	513140	513172	a	a	+
+chr2	513184	513216	a	a	+
+chr2	513184	513216	a	a	+
+chr2	513199	513231	a	a	+
+chr2	513243	513275	b	b	-
+chr2	513254	513286	b	b	-
+chr2	513298	513330	a	a	+
+chr2	513267	513299	b	b	-
+chr2	513267	513299	b	b	-
+chr2	513312	513344	a	a	+
+chr2	513318	513350	a	a	+
+chr2	513318	513350	a	a	+
+chr2	513322	513354	a	a	+
+chr2	513327	513359	a	a	+
+chr2	513299	513331	b	b	-
+chr2	513355	513387	a	a	+
+chr2	513359	513391	b	b	-
+chr2	513369	513401	b	b	-
+chr2	513396	513428	b	b	-
+chr2	513421	513453	b	b	-
+chr2	513453	513485	b	b	-
+chr2	513479	513511	b	b	-
+chr2	513488	513520	b	b	-
+chr2	513863	513895	a	a	+
+chr2	513874	513906	a	a	+
+chr2	514110	514142	a	a	+
+chr2	514639	514671	b	b	-
+chr2	514705	514737	a	a	+
+chr2	514769	514801	a	a	+
+chr2	514849	514881	b	b	-
+chr2	514979	515011	b	b	-
+chr2	515189	515221	a	a	+
+chr2	515162	515194	b	b	-
+chr2	515195	515227	a	a	+
+chr2	515198	515230	a	a	+
+chr2	515198	515230	a	a	+
+chr2	515169	515201	b	b	-
+chr2	515209	515241	a	a	+
+chr2	515191	515223	b	b	-
+chr2	515194	515226	b	b	-
+chr2	515320	515352	a	a	+
+chr2	515331	515363	a	a	+
+chr2	515322	515354	b	b	-
+chr2	515362	515394	a	a	+
+chr2	515645	515677	a	a	+
+chr2	515625	515657	b	b	-
+chr2	515630	515662	b	b	-
+chr2	515632	515664	b	b	-
+chr2	515666	515698	a	a	+
+chr2	515666	515698	a	a	+
+chr2	515667	515699	a	a	+
+chr2	515674	515706	a	a	+
+chr2	515644	515676	b	b	-
+chr2	515677	515709	a	a	+
+chr2	515645	515677	b	b	-
+chr2	515646	515678	b	b	-
+chr2	515652	515684	b	b	-
+chr2	515652	515684	b	b	-
+chr2	515654	515686	b	b	-
+chr2	515654	515686	b	b	-
+chr2	515658	515690	b	b	-
+chr2	515674	515706	b	b	-
+chr2	515711	515743	a	a	+
+chr2	515684	515716	b	b	-
+chr2	515809	515841	b	b	-
+chr2	515813	515845	b	b	-
+chr2	515830	515862	b	b	-
+chr2	516022	516054	a	a	+
+chr2	516002	516034	b	b	-
+chr2	516057	516089	b	b	-
+chr2	516329	516361	b	b	-
+chr2	516422	516454	a	a	+
+chr2	516416	516448	b	b	-
+chr2	516506	516538	b	b	-
+chr2	516661	516693	b	b	-
+chr2	516661	516693	b	b	-
+chr2	516803	516835	a	a	+
+chr2	516803	516835	a	a	+
+chr2	516861	516893	a	a	+
+chr2	516956	516988	b	b	-
+chr2	516997	517029	a	a	+
+chr2	516985	517017	b	b	-
+chr2	517632	517664	a	a	+
+chr2	517635	517667	b	b	-
+chr2	517724	517756	b	b	-
+chr2	517809	517841	b	b	-
+chr2	518357	518389	b	b	-
+chr2	518424	518456	a	a	+
+chr2	518455	518487	a	a	+
+chr2	518428	518460	b	b	-
+chr2	519148	519180	a	a	+
+chr2	519188	519220	a	a	+
+chr2	519381	519413	a	a	+
+chr2	519395	519427	b	b	-
+chr2	519395	519427	b	b	-
+chr2	519904	519936	a	a	+
+chr2	519904	519936	a	a	+
+chr2	519921	519953	b	b	-
+chr2	521343	521375	b	b	-
+chr2	523445	523477	b	b	-
+chr2	524737	524769	a	a	+
+chr2	525173	525205	b	b	-
+chr2	525332	525364	b	b	-
+chr2	525473	525505	b	b	-
+chr2	525477	525509	b	b	-
+chr2	525487	525519	b	b	-
+chr2	526124	526156	b	b	-
+chr2	526493	526525	a	a	+
+chr2	526471	526503	b	b	-
+chr2	526517	526549	b	b	-
+chr2	526558	526590	a	a	+
+chr2	526649	526681	b	b	-
+chr2	526650	526682	b	b	-
+chr2	526688	526720	a	a	+
+chr2	526658	526690	b	b	-
+chr2	526672	526704	b	b	-
+chr2	526716	526748	a	a	+
+chr2	526704	526736	b	b	-
+chr2	526856	526888	a	a	+
+chr2	526856	526888	a	a	+
+chr2	526856	526888	a	a	+
+chr2	526856	526888	a	a	+
+chr2	526877	526909	a	a	+
+chr2	527018	527050	b	b	-
+chr2	527122	527154	a	a	+
+chr2	527122	527154	a	a	+
+chr2	527095	527127	b	b	-
+chr2	527098	527130	b	b	-
+chr2	527102	527134	b	b	-
+chr2	527148	527180	a	a	+
+chr2	527153	527185	a	a	+
+chr2	527154	527186	a	a	+
+chr2	527123	527155	b	b	-
+chr2	527160	527192	a	a	+
+chr2	527134	527166	b	b	-
+chr2	527134	527166	b	b	-
+chr2	527136	527168	b	b	-
+chr2	527139	527171	b	b	-
+chr2	527141	527173	b	b	-
+chr2	527141	527173	b	b	-
+chr2	527141	527173	b	b	-
+chr2	527142	527174	b	b	-
+chr2	527176	527208	a	a	+
+chr2	527176	527208	a	a	+
+chr2	527146	527178	b	b	-
+chr2	527154	527186	b	b	-
+chr2	527161	527193	b	b	-
+chr2	527164	527196	b	b	-
+chr2	527202	527234	a	a	+
+chr2	527189	527221	b	b	-
+chr2	527328	527360	a	a	+
+chr2	527333	527365	a	a	+
+chr2	527322	527354	b	b	-
+chr2	527359	527391	a	a	+
+chr2	527359	527391	a	a	+
+chr2	527479	527511	b	b	-
+chr2	527528	527560	a	a	+
+chr2	527499	527531	b	b	-
+chr2	527510	527542	b	b	-
+chr2	527543	527575	a	a	+
+chr2	527835	527867	a	a	+
+chr2	527835	527867	a	a	+
+chr2	527987	528019	a	a	+
+chr2	527958	527990	b	b	-
+chr2	527993	528025	a	a	+
+chr2	527993	528025	a	a	+
+chr2	527993	528025	a	a	+
+chr2	527962	527994	b	b	-
+chr2	527964	527996	b	b	-
+chr2	527964	527996	b	b	-
+chr2	527964	527996	b	b	-
+chr2	527965	527997	b	b	-
+chr2	527965	527997	b	b	-
+chr2	527999	528031	a	a	+
+chr2	528001	528033	a	a	+
+chr2	527970	528002	b	b	-
+chr2	527973	528005	b	b	-
+chr2	527973	528005	b	b	-
+chr2	528009	528041	a	a	+
+chr2	528010	528042	a	a	+
+chr2	528010	528042	a	a	+
+chr2	528011	528043	a	a	+
+chr2	528011	528043	a	a	+
+chr2	528011	528043	a	a	+
+chr2	528011	528043	a	a	+
+chr2	527979	528011	b	b	-
+chr2	528012	528044	a	a	+
+chr2	528012	528044	a	a	+
+chr2	528012	528044	a	a	+
+chr2	528012	528044	a	a	+
+chr2	528012	528044	a	a	+
+chr2	527984	528016	b	b	-
+chr2	527990	528022	b	b	-
+chr2	527993	528025	b	b	-
+chr2	527994	528026	b	b	-
+chr2	527995	528027	b	b	-
+chr2	528062	528094	a	a	+
+chr2	528267	528299	a	a	+
+chr2	528281	528313	a	a	+
+chr2	528282	528314	a	a	+
+chr2	528258	528290	b	b	-
+chr2	528258	528290	b	b	-
+chr2	528260	528292	b	b	-
+chr2	528260	528292	b	b	-
+chr2	528260	528292	b	b	-
+chr2	528260	528292	b	b	-
+chr2	528262	528294	b	b	-
+chr2	528295	528327	a	a	+
+chr2	528299	528331	a	a	+
+chr2	528363	528395	b	b	-
+chr2	528446	528478	a	a	+
+chr2	528420	528452	b	b	-
+chr2	528420	528452	b	b	-
+chr2	528421	528453	b	b	-
+chr2	528431	528463	b	b	-
+chr2	528459	528491	b	b	-
+chr2	528931	528963	a	a	+
+chr2	529037	529069	b	b	-
+chr2	529130	529162	a	a	+
+chr2	529503	529535	a	a	+
+chr2	530251	530283	b	b	-
+chr2	530251	530283	b	b	-
+chr2	531130	531162	b	b	-
+chr2	531634	531666	b	b	-
+chr2	532006	532038	a	a	+
+chr2	532052	532084	a	a	+
+chr2	532178	532210	a	a	+
+chr2	532190	532222	a	a	+
+chr2	532179	532211	b	b	-
+chr2	532477	532509	b	b	-
+chr2	532477	532509	b	b	-
+chr2	532517	532549	a	a	+
+chr2	532518	532550	a	a	+
+chr2	532518	532550	a	a	+
+chr2	532488	532520	b	b	-
+chr2	532488	532520	b	b	-
+chr2	532528	532560	a	a	+
+chr2	532529	532561	a	a	+
+chr2	532498	532530	b	b	-
+chr2	532498	532530	b	b	-
+chr2	532541	532573	a	a	+
+chr2	532610	532642	b	b	-
+chr2	532649	532681	a	a	+
+chr2	532664	532696	a	a	+
+chr2	532642	532674	b	b	-
+chr2	532647	532679	b	b	-
+chr2	532680	532712	a	a	+
+chr2	532648	532680	b	b	-
+chr2	532684	532716	a	a	+
+chr2	532685	532717	a	a	+
+chr2	532687	532719	a	a	+
+chr2	532695	532727	a	a	+
+chr2	532669	532701	b	b	-
+chr2	532674	532706	b	b	-
+chr2	532683	532715	b	b	-
+chr2	532858	532890	a	a	+
+chr2	532838	532870	b	b	-
+chr2	532838	532870	b	b	-
+chr2	532854	532886	b	b	-
+chr2	532887	532919	a	a	+
+chr2	532888	532920	a	a	+
+chr2	532976	533008	b	b	-
+chr2	532976	533008	b	b	-
+chr2	533010	533042	a	a	+
+chr2	533097	533129	b	b	-
+chr2	533145	533177	b	b	-
+chr2	533190	533222	b	b	-
+chr2	533250	533282	a	a	+
+chr2	533280	533312	b	b	-
+chr2	533315	533347	b	b	-
+chr2	533351	533383	a	a	+
+chr2	533327	533359	b	b	-
+chr2	533327	533359	b	b	-
+chr2	533329	533361	b	b	-
+chr2	533364	533396	a	a	+
+chr2	533364	533396	a	a	+
+chr2	533364	533396	a	a	+
+chr2	533332	533364	b	b	-
+chr2	533332	533364	b	b	-
+chr2	533332	533364	b	b	-
+chr2	533333	533365	b	b	-
+chr2	533333	533365	b	b	-
+chr2	533333	533365	b	b	-
+chr2	533334	533366	b	b	-
+chr2	533334	533366	b	b	-
+chr2	533369	533401	a	a	+
+chr2	533370	533402	a	a	+
+chr2	533370	533402	a	a	+
+chr2	533374	533406	a	a	+
+chr2	533374	533406	a	a	+
+chr2	533374	533406	a	a	+
+chr2	533374	533406	a	a	+
+chr2	533343	533375	b	b	-
+chr2	533343	533375	b	b	-
+chr2	533378	533410	a	a	+
+chr2	533347	533379	b	b	-
+chr2	533380	533412	a	a	+
+chr2	533355	533387	b	b	-
+chr2	533395	533427	a	a	+
+chr2	533404	533436	a	a	+
+chr2	533406	533438	a	a	+
+chr2	533376	533408	b	b	-
+chr2	533378	533410	b	b	-
+chr2	533378	533410	b	b	-
+chr2	533378	533410	b	b	-
+chr2	533411	533443	a	a	+
+chr2	533411	533443	a	a	+
+chr2	533417	533449	a	a	+
+chr2	533400	533432	b	b	-
+chr2	533467	533499	b	b	-
+chr2	533591	533623	a	a	+
+chr2	533591	533623	a	a	+
+chr2	533604	533636	b	b	-
+chr2	533637	533669	a	a	+
+chr2	533605	533637	b	b	-
+chr2	533700	533732	a	a	+
+chr2	533700	533732	a	a	+
+chr2	533700	533732	a	a	+
+chr2	533703	533735	a	a	+
+chr2	533716	533748	a	a	+
+chr2	533686	533718	b	b	-
+chr2	533686	533718	b	b	-
+chr2	533693	533725	b	b	-
+chr2	533693	533725	b	b	-
+chr2	533693	533725	b	b	-
+chr2	533819	533851	a	a	+
+chr2	533788	533820	b	b	-
+chr2	533793	533825	b	b	-
+chr2	533830	533862	a	a	+
+chr2	533845	533877	a	a	+
+chr2	533827	533859	b	b	-
+chr2	533827	533859	b	b	-
+chr2	533827	533859	b	b	-
+chr2	533828	533860	b	b	-
+chr2	533829	533861	b	b	-
+chr2	533832	533864	b	b	-
+chr2	533832	533864	b	b	-
+chr2	533876	533908	a	a	+
+chr2	533876	533908	a	a	+
+chr2	533878	533910	a	a	+
+chr2	533878	533910	a	a	+
+chr2	533859	533891	b	b	-
+chr2	533892	533924	a	a	+
+chr2	533932	533964	a	a	+
+chr2	533929	533961	b	b	-
+chr2	533964	533996	b	b	-
+chr2	534000	534032	a	a	+
+chr2	534000	534032	a	a	+
+chr2	533981	534013	b	b	-
+chr2	533991	534023	b	b	-
+chr2	533991	534023	b	b	-
+chr2	534037	534069	a	a	+
+chr2	534017	534049	b	b	-
+chr2	534264	534296	a	a	+
+chr2	534244	534276	b	b	-
+chr2	534434	534466	b	b	-
+chr2	534513	534545	b	b	-
+chr2	534577	534609	b	b	-
+chr2	534625	534657	a	a	+
+chr2	534682	534714	a	a	+
+chr2	534715	534747	b	b	-
+chr2	534725	534757	b	b	-
+chr2	534760	534792	a	a	+
+chr2	534760	534792	a	a	+
+chr2	534770	534802	a	a	+
+chr2	534782	534814	a	a	+
+chr2	534886	534918	b	b	-
+chr2	534893	534925	b	b	-
+chr2	534893	534925	b	b	-
+chr2	534893	534925	b	b	-
+chr2	534894	534926	b	b	-
+chr2	534929	534961	a	a	+
+chr2	534929	534961	a	a	+
+chr2	534929	534961	a	a	+
+chr2	534898	534930	b	b	-
+chr2	534898	534930	b	b	-
+chr2	534899	534931	b	b	-
+chr2	534935	534967	a	a	+
+chr2	534904	534936	b	b	-
+chr2	534904	534936	b	b	-
+chr2	534937	534969	a	a	+
+chr2	534937	534969	a	a	+
+chr2	534937	534969	a	a	+
+chr2	534940	534972	a	a	+
+chr2	534908	534940	b	b	-
+chr2	534909	534941	b	b	-
+chr2	534913	534945	b	b	-
+chr2	534946	534978	a	a	+
+chr2	534946	534978	a	a	+
+chr2	534946	534978	a	a	+
+chr2	534946	534978	a	a	+
+chr2	534946	534978	a	a	+
+chr2	534946	534978	a	a	+
+chr2	534946	534978	a	a	+
+chr2	534946	534978	a	a	+
+chr2	534914	534946	b	b	-
+chr2	534914	534946	b	b	-
+chr2	534914	534946	b	b	-
+chr2	534919	534951	b	b	-
+chr2	534919	534951	b	b	-
+chr2	534920	534952	b	b	-
+chr2	534920	534952	b	b	-
+chr2	534953	534985	a	a	+
+chr2	534955	534987	a	a	+
+chr2	534955	534987	a	a	+
+chr2	534923	534955	b	b	-
+chr2	534923	534955	b	b	-
+chr2	534956	534988	a	a	+
+chr2	534958	534990	a	a	+
+chr2	534930	534962	b	b	-
+chr2	534964	534996	a	a	+
+chr2	534964	534996	a	a	+
+chr2	534965	534997	a	a	+
+chr2	534965	534997	a	a	+
+chr2	534965	534997	a	a	+
+chr2	534933	534965	b	b	-
+chr2	534933	534965	b	b	-
+chr2	534968	535000	a	a	+
+chr2	534942	534974	b	b	-
+chr2	534980	535012	a	a	+
+chr2	534991	535023	a	a	+
+chr2	535006	535038	a	a	+
+chr2	535006	535038	a	a	+
+chr2	535189	535221	a	a	+
+chr2	535168	535200	b	b	-
+chr2	535213	535245	a	a	+
+chr2	535213	535245	a	a	+
+chr2	535186	535218	b	b	-
+chr2	535193	535225	b	b	-
+chr2	535199	535231	b	b	-
+chr2	535199	535231	b	b	-
+chr2	535199	535231	b	b	-
+chr2	535199	535231	b	b	-
+chr2	535232	535264	a	a	+
+chr2	535200	535232	b	b	-
+chr2	535200	535232	b	b	-
+chr2	535233	535265	a	a	+
+chr2	535233	535265	a	a	+
+chr2	535233	535265	a	a	+
+chr2	535234	535266	a	a	+
+chr2	535203	535235	b	b	-
+chr2	535203	535235	b	b	-
+chr2	535203	535235	b	b	-
+chr2	535237	535269	a	a	+
+chr2	535237	535269	a	a	+
+chr2	535237	535269	a	a	+
+chr2	535237	535269	a	a	+
+chr2	535241	535273	a	a	+
+chr2	535241	535273	a	a	+
+chr2	535241	535273	a	a	+
+chr2	535211	535243	b	b	-
+chr2	535211	535243	b	b	-
+chr2	535211	535243	b	b	-
+chr2	535212	535244	b	b	-
+chr2	535218	535250	b	b	-
+chr2	535220	535252	b	b	-
+chr2	535220	535252	b	b	-
+chr2	535253	535285	a	a	+
+chr2	535221	535253	b	b	-
+chr2	535255	535287	a	a	+
+chr2	535255	535287	a	a	+
+chr2	535279	535311	a	a	+
+chr2	535379	535411	a	a	+
+chr2	535392	535424	a	a	+
+chr2	535392	535424	a	a	+
+chr2	535392	535424	a	a	+
+chr2	535360	535392	b	b	-
+chr2	535369	535401	b	b	-
+chr2	535369	535401	b	b	-
+chr2	535369	535401	b	b	-
+chr2	535404	535436	a	a	+
+chr2	535566	535598	a	a	+
+chr2	535541	535573	b	b	-
+chr2	535738	535770	a	a	+
+chr2	535920	535952	a	a	+
+chr2	536042	536074	a	a	+
+chr2	536042	536074	a	a	+
+chr2	536070	536102	a	a	+
+chr2	536162	536194	a	a	+
+chr2	536181	536213	a	a	+
+chr2	536189	536221	a	a	+
+chr2	536161	536193	b	b	-
+chr2	536187	536219	b	b	-
+chr2	536497	536529	b	b	-
+chr2	536598	536630	a	a	+
+chr2	536609	536641	a	a	+
+chr2	536596	536628	b	b	-
+chr2	536643	536675	a	a	+
+chr2	536776	536808	a	a	+
+chr2	536764	536796	b	b	-
+chr2	536825	536857	a	a	+
+chr2	536965	536997	a	a	+
+chr2	536968	537000	a	a	+
+chr2	536997	537029	b	b	-
+chr2	537121	537153	a	a	+
+chr2	537100	537132	b	b	-
+chr2	537274	537306	a	a	+
+chr2	537283	537315	a	a	+
+chr2	537286	537318	b	b	-
+chr2	537402	537434	b	b	-
+chr2	537431	537463	b	b	-
+chr2	537465	537497	a	a	+
+chr2	537435	537467	b	b	-
+chr2	537438	537470	b	b	-
+chr2	537438	537470	b	b	-
+chr2	537438	537470	b	b	-
+chr2	537485	537517	a	a	+
+chr2	537470	537502	b	b	-
+chr2	537742	537774	a	a	+
+chr2	537716	537748	b	b	-
+chr2	537728	537760	b	b	-
+chr2	537728	537760	b	b	-
+chr2	537762	537794	a	a	+
+chr2	537884	537916	a	a	+
+chr2	537884	537916	b	b	-
+chr2	537904	537936	b	b	-
+chr2	537905	537937	b	b	-
+chr2	538052	538084	b	b	-
+chr2	538052	538084	b	b	-
+chr2	538063	538095	b	b	-
+chr2	538116	538148	a	a	+
+chr2	538158	538190	b	b	-
+chr2	538288	538320	a	a	+
+chr2	538310	538342	a	a	+
+chr2	538294	538326	b	b	-
+chr2	538336	538368	a	a	+
+chr2	538336	538368	a	a	+
+chr2	538340	538372	b	b	-
+chr2	538341	538373	b	b	-
+chr2	538365	538397	b	b	-
+chr2	538374	538406	b	b	-
+chr2	538445	538477	a	a	+
+chr2	538469	538501	a	a	+
+chr2	538494	538526	a	a	+
+chr2	538473	538505	b	b	-
+chr2	538521	538553	a	a	+
+chr2	538521	538553	a	a	+
+chr2	538490	538522	b	b	-
+chr2	538545	538577	a	a	+
+chr2	538516	538548	b	b	-
+chr2	538525	538557	b	b	-
+chr2	538561	538593	a	a	+
+chr2	538575	538607	a	a	+
+chr2	538667	538699	b	b	-
+chr2	538673	538705	b	b	-
+chr2	538686	538718	b	b	-
+chr2	538730	538762	a	a	+
+chr2	538741	538773	a	a	+
+chr2	538741	538773	a	a	+
+chr2	538741	538773	a	a	+
+chr2	538734	538766	b	b	-
+chr2	538737	538769	b	b	-
+chr2	538799	538831	a	a	+
+chr2	538890	538922	a	a	+
+chr2	539036	539068	a	a	+
+chr2	539062	539094	a	a	+
+chr2	539082	539114	a	a	+
+chr2	539054	539086	b	b	-
+chr2	539054	539086	b	b	-
+chr2	539063	539095	b	b	-
+chr2	539134	539166	a	a	+
+chr2	539134	539166	a	a	+
+chr2	539192	539224	b	b	-
+chr2	539253	539285	a	a	+
+chr2	539253	539285	a	a	+
+chr2	539264	539296	a	a	+
+chr2	539246	539278	b	b	-
+chr2	539246	539278	b	b	-
+chr2	539279	539311	a	a	+
+chr2	539247	539279	b	b	-
+chr2	539280	539312	a	a	+
+chr2	539250	539282	b	b	-
+chr2	539254	539286	b	b	-
+chr2	539292	539324	a	a	+
+chr2	539292	539324	a	a	+
+chr2	539263	539295	b	b	-
+chr2	539263	539295	b	b	-
+chr2	539264	539296	b	b	-
+chr2	539313	539345	a	a	+
+chr2	539314	539346	a	a	+
+chr2	539353	539385	a	a	+
+chr2	539457	539489	a	a	+
+chr2	539462	539494	b	b	-
+chr2	539462	539494	b	b	-
+chr2	539495	539527	a	a	+
+chr2	539473	539505	b	b	-
+chr2	539516	539548	a	a	+
+chr2	539524	539556	a	a	+
+chr2	539503	539535	b	b	-
+chr2	539560	539592	a	a	+
+chr2	539620	539652	b	b	-
+chr2	539625	539657	b	b	-
+chr2	539628	539660	b	b	-
+chr2	539663	539695	a	a	+
+chr2	539680	539712	a	a	+
+chr2	539654	539686	b	b	-
+chr2	539654	539686	b	b	-
+chr2	539687	539719	a	a	+
+chr2	539655	539687	b	b	-
+chr2	539688	539720	a	a	+
+chr2	539689	539721	a	a	+
+chr2	539657	539689	b	b	-
+chr2	539695	539727	a	a	+
+chr2	539712	539744	a	a	+
+chr2	539715	539747	a	a	+
+chr2	539949	539981	a	a	+
+chr2	539917	539949	b	b	-
+chr2	539951	539983	a	a	+
+chr2	539953	539985	a	a	+
+chr2	539953	539985	a	a	+
+chr2	539925	539957	b	b	-
+chr2	539963	539995	a	a	+
+chr2	539963	539995	a	a	+
+chr2	539935	539967	b	b	-
+chr2	539946	539978	b	b	-
+chr2	539988	540020	a	a	+
+chr2	539957	539989	b	b	-
+chr2	539957	539989	b	b	-
+chr2	539957	539989	b	b	-
+chr2	540128	540160	a	a	+
+chr2	540128	540160	a	a	+
+chr2	540136	540168	a	a	+
+chr2	540106	540138	b	b	-
+chr2	540106	540138	b	b	-
+chr2	540109	540141	b	b	-
+chr2	540116	540148	b	b	-
+chr2	540298	540330	a	a	+
+chr2	540298	540330	a	a	+
+chr2	540298	540330	a	a	+
+chr2	540443	540475	a	a	+
+chr2	540559	540591	a	a	+
+chr2	540554	540586	b	b	-
+chr2	540573	540605	b	b	-
+chr2	540629	540661	b	b	-
+chr2	540677	540709	a	a	+
+chr2	540782	540814	a	a	+
+chr2	540920	540952	b	b	-
+chr2	540959	540991	b	b	-
+chr2	541000	541032	a	a	+
+chr2	541052	541084	a	a	+
+chr2	541111	541143	a	a	+
+chr2	541210	541242	b	b	-
+chr2	541302	541334	a	a	+
+chr2	541326	541358	a	a	+
+chr2	541345	541377	b	b	-
+chr2	541405	541437	b	b	-
+chr2	541411	541443	b	b	-
+chr2	541789	541821	a	a	+
+chr2	541826	541858	b	b	-
+chr2	541826	541858	b	b	-
+chr2	541843	541875	b	b	-
+chr2	541876	541908	b	b	-
+chr2	541903	541935	b	b	-
+chr2	542090	542122	b	b	-
+chr2	542210	542242	a	a	+
+chr2	542268	542300	a	a	+
+chr2	542490	542522	b	b	-
+chr2	542793	542825	a	a	+
+chr2	543272	543304	a	a	+
+chr2	543275	543307	a	a	+
+chr2	543768	543800	b	b	-
+chr2	543812	543844	a	a	+
+chr2	543920	543952	b	b	-
+chr2	544127	544159	a	a	+
+chr2	544099	544131	b	b	-
+chr2	544249	544281	b	b	-
+chr2	544256	544288	b	b	-
+chr2	544297	544329	a	a	+
+chr2	544297	544329	a	a	+
+chr2	544297	544329	a	a	+
+chr2	544313	544345	a	a	+
+chr2	544286	544318	b	b	-
+chr2	544287	544319	b	b	-
+chr2	544321	544353	a	a	+
+chr2	544334	544366	a	a	+
+chr2	544355	544387	a	a	+
+chr2	544375	544407	a	a	+
+chr2	544370	544402	b	b	-
+chr2	544403	544435	b	b	-
+chr2	544407	544439	b	b	-
+chr2	544422	544454	b	b	-
+chr2	544456	544488	a	a	+
+chr2	544456	544488	a	a	+
+chr2	544430	544462	b	b	-
+chr2	544434	544466	b	b	-
+chr2	544436	544468	b	b	-
+chr2	544437	544469	b	b	-
+chr2	544437	544469	b	b	-
+chr2	544437	544469	b	b	-
+chr2	544470	544502	a	a	+
+chr2	544470	544502	a	a	+
+chr2	544438	544470	b	b	-
+chr2	544438	544470	b	b	-
+chr2	544438	544470	b	b	-
+chr2	544438	544470	b	b	-
+chr2	544439	544471	b	b	-
+chr2	544440	544472	b	b	-
+chr2	544475	544507	a	a	+
+chr2	544476	544508	a	a	+
+chr2	544476	544508	a	a	+
+chr2	544476	544508	a	a	+
+chr2	544455	544487	b	b	-
+chr2	544456	544488	b	b	-
+chr2	544498	544530	a	a	+
+chr2	544502	544534	a	a	+
+chr2	544492	544524	b	b	-
+chr2	544874	544906	a	a	+
+chr2	544875	544907	a	a	+
+chr2	544875	544907	a	a	+
+chr2	544857	544889	b	b	-
+chr2	544893	544925	a	a	+
+chr2	544876	544908	b	b	-
+chr2	544915	544947	a	a	+
+chr2	544915	544947	a	a	+
+chr2	544915	544947	a	a	+
+chr2	544915	544947	a	a	+
+chr2	544885	544917	b	b	-
+chr2	544894	544926	b	b	-
+chr2	544894	544926	b	b	-
+chr2	544895	544927	b	b	-
+chr2	544932	544964	a	a	+
+chr2	544955	544987	b	b	-
+chr2	545041	545073	b	b	-
+chr2	545076	545108	a	a	+
+chr2	545082	545114	a	a	+
+chr2	545082	545114	a	a	+
+chr2	545063	545095	b	b	-
+chr2	545074	545106	b	b	-
+chr2	545077	545109	b	b	-
+chr2	545102	545134	b	b	-
+chr2	545149	545181	a	a	+
+chr2	545119	545151	b	b	-
+chr2	545256	545288	a	a	+
+chr2	545226	545258	b	b	-
+chr2	545285	545317	a	a	+
+chr2	545271	545303	b	b	-
+chr2	545271	545303	b	b	-
+chr2	545540	545572	a	a	+
+chr2	545748	545780	a	a	+
+chr2	545887	545919	b	b	-
+chr2	545887	545919	b	b	-
+chr2	545902	545934	b	b	-
+chr2	545924	545956	b	b	-
+chr2	545924	545956	b	b	-
+chr2	545959	545991	a	a	+
+chr2	546076	546108	b	b	-
+chr2	546133	546165	a	a	+
+chr2	546133	546165	a	a	+
+chr2	546118	546150	b	b	-
+chr2	546151	546183	b	b	-
+chr2	546334	546366	a	a	+
+chr2	546347	546379	a	a	+
+chr2	546361	546393	a	a	+
+chr2	546361	546393	a	a	+
+chr2	546332	546364	b	b	-
+chr2	546368	546400	a	a	+
+chr2	546370	546402	a	a	+
+chr2	546407	546439	a	a	+
+chr2	546488	546520	b	b	-
+chr2	546526	546558	a	a	+
+chr2	546565	546597	a	a	+
+chr2	546573	546605	a	a	+
+chr2	546592	546624	a	a	+
+chr2	546603	546635	b	b	-
+chr2	546689	546721	a	a	+
+chr2	546793	546825	a	a	+
+chr2	546993	547025	a	a	+
+chr2	546993	547025	a	a	+
+chr2	547109	547141	b	b	-
+chr2	547420	547452	a	a	+
+chr2	547392	547424	b	b	-
+chr2	547392	547424	b	b	-
+chr2	547392	547424	b	b	-
+chr2	547453	547485	b	b	-
+chr2	547526	547558	b	b	-
+chr2	547661	547693	a	a	+
+chr2	547648	547680	b	b	-
+chr2	547683	547715	a	a	+
+chr2	547683	547715	a	a	+
+chr2	547654	547686	b	b	-
+chr2	547654	547686	b	b	-
+chr2	547655	547687	b	b	-
+chr2	547723	547755	a	a	+
+chr2	547797	547829	a	a	+
+chr2	547952	547984	a	a	+
+chr2	547957	547989	a	a	+
+chr2	548127	548159	a	a	+
+chr2	548149	548181	a	a	+
+chr2	548403	548435	a	a	+
+chr2	548422	548454	a	a	+
+chr2	548422	548454	a	a	+
+chr2	548556	548588	a	a	+
+chr2	548538	548570	b	b	-
+chr2	548548	548580	b	b	-
+chr2	548842	548874	b	b	-
+chr2	548862	548894	b	b	-
+chr2	548863	548895	b	b	-
+chr2	548912	548944	a	a	+
+chr2	548929	548961	a	a	+
+chr2	548995	549027	b	b	-
+chr2	548995	549027	b	b	-
+chr2	549032	549064	a	a	+
+chr2	549046	549078	a	a	+
+chr2	549047	549079	a	a	+
+chr2	549052	549084	a	a	+
+chr2	549052	549084	a	a	+
+chr2	549026	549058	b	b	-
+chr2	549060	549092	a	a	+
+chr2	549065	549097	a	a	+
+chr2	549065	549097	a	a	+
+chr2	549077	549109	a	a	+
+chr2	549282	549314	b	b	-
+chr2	549456	549488	a	a	+
+chr2	549434	549466	b	b	-
+chr2	549434	549466	b	b	-
+chr2	549454	549486	b	b	-
+chr2	549488	549520	a	a	+
+chr2	549489	549521	a	a	+
+chr2	549496	549528	a	a	+
+chr2	549498	549530	a	a	+
+chr2	549480	549512	b	b	-
+chr2	549480	549512	b	b	-
+chr2	549520	549552	a	a	+
+chr2	549509	549541	b	b	-
+chr2	549572	549604	a	a	+
+chr2	549733	549765	a	a	+
+chr2	549728	549760	b	b	-
+chr2	549728	549760	b	b	-
+chr2	549737	549769	b	b	-
+chr2	549772	549804	a	a	+
+chr2	549772	549804	a	a	+
+chr2	549742	549774	b	b	-
+chr2	549783	549815	a	a	+
+chr2	549783	549815	a	a	+
+chr2	549791	549823	a	a	+
+chr2	549802	549834	a	a	+
+chr2	549773	549805	b	b	-
+chr2	549875	549907	b	b	-
+chr2	549901	549933	b	b	-
+chr2	549941	549973	a	a	+
+chr2	549941	549973	a	a	+
+chr2	550037	550069	b	b	-
+chr2	550114	550146	b	b	-
+chr2	550115	550147	b	b	-
+chr2	550274	550306	a	a	+
+chr2	550284	550316	b	b	-
+chr2	550888	550920	b	b	-
+chr2	551193	551225	b	b	-
+chr2	551703	551735	a	a	+
+chr2	552029	552061	a	a	+
+chr2	552140	552172	b	b	-
+chr2	552386	552418	a	a	+
+chr2	552564	552596	a	a	+
+chr2	552564	552596	a	a	+
+chr2	552690	552722	a	a	+
+chr2	552993	553025	b	b	-
+chr2	552994	553026	b	b	-
+chr2	553058	553090	b	b	-
+chr2	553116	553148	a	a	+
+chr2	553133	553165	b	b	-
+chr2	553133	553165	b	b	-
+chr2	553134	553166	b	b	-
+chr2	553134	553166	b	b	-
+chr2	553137	553169	b	b	-
+chr2	553145	553177	b	b	-
+chr2	553147	553179	b	b	-
+chr2	553180	553212	a	a	+
+chr2	553180	553212	a	a	+
+chr2	553148	553180	b	b	-
+chr2	553181	553213	a	a	+
+chr2	553181	553213	a	a	+
+chr2	553181	553213	a	a	+
+chr2	553181	553213	a	a	+
+chr2	553182	553214	a	a	+
+chr2	553182	553214	a	a	+
+chr2	553182	553214	a	a	+
+chr2	553182	553214	a	a	+
+chr2	553182	553214	a	a	+
+chr2	553182	553214	a	a	+
+chr2	553151	553183	b	b	-
+chr2	553153	553185	b	b	-
+chr2	553155	553187	b	b	-
+chr2	553155	553187	b	b	-
+chr2	553188	553220	a	a	+
+chr2	553188	553220	a	a	+
+chr2	553188	553220	a	a	+
+chr2	553156	553188	b	b	-
+chr2	553159	553191	b	b	-
+chr2	553159	553191	b	b	-
+chr2	553165	553197	b	b	-
+chr2	553165	553197	b	b	-
+chr2	553165	553197	b	b	-
+chr2	553165	553197	b	b	-
+chr2	553165	553197	b	b	-
+chr2	553165	553197	b	b	-
+chr2	553165	553197	b	b	-
+chr2	553165	553197	b	b	-
+chr2	553166	553198	b	b	-
+chr2	553204	553236	a	a	+
+chr2	553205	553237	a	a	+
+chr2	553205	553237	a	a	+
+chr2	553208	553240	a	a	+
+chr2	553210	553242	a	a	+
+chr2	553180	553212	b	b	-
+chr2	553579	553611	b	b	-
+chr2	553610	553642	b	b	-
+chr2	553619	553651	b	b	-
+chr2	553971	554003	b	b	-
+chr2	554176	554208	b	b	-
+chr2	554247	554279	b	b	-
+chr2	554631	554663	b	b	-
+chr2	554709	554741	b	b	-
+chr2	554769	554801	a	a	+
+chr2	554744	554776	b	b	-
+chr2	554978	555010	b	b	-
+chr2	554978	555010	b	b	-
+chr2	555272	555304	b	b	-
+chr2	556902	556934	a	a	+
+chr2	556969	557001	a	a	+
+chr2	556995	557027	b	b	-
+chr2	557446	557478	b	b	-
+chr2	557687	557719	a	a	+
+chr2	557769	557801	a	a	+
+chr2	557766	557798	b	b	-
+chr2	558089	558121	a	a	+
+chr2	558057	558089	b	b	-
+chr2	558065	558097	b	b	-
+chr2	558123	558155	a	a	+
+chr2	558397	558429	a	a	+
+chr2	558397	558429	a	a	+
+chr2	558374	558406	b	b	-
+chr2	558409	558441	a	a	+
+chr2	558412	558444	a	a	+
+chr2	558381	558413	b	b	-
+chr2	558383	558415	b	b	-
+chr2	558425	558457	a	a	+
+chr2	558426	558458	a	a	+
+chr2	558426	558458	a	a	+
+chr2	558396	558428	b	b	-
+chr2	558656	558688	a	a	+
+chr2	558669	558701	a	a	+
+chr2	558669	558701	a	a	+
+chr2	558669	558701	a	a	+
+chr2	558680	558712	a	a	+
+chr2	558680	558712	a	a	+
+chr2	558681	558713	a	a	+
+chr2	558683	558715	a	a	+
+chr2	558653	558685	b	b	-
+chr2	558657	558689	b	b	-
+chr2	558690	558722	a	a	+
+chr2	558659	558691	b	b	-
+chr2	558661	558693	b	b	-
+chr2	558661	558693	b	b	-
+chr2	558661	558693	b	b	-
+chr2	558661	558693	b	b	-
+chr2	558694	558726	a	a	+
+chr2	558662	558694	b	b	-
+chr2	558662	558694	b	b	-
+chr2	558662	558694	b	b	-
+chr2	558695	558727	a	a	+
+chr2	558669	558701	b	b	-
+chr2	558669	558701	b	b	-
+chr2	558703	558735	a	a	+
+chr2	558703	558735	a	a	+
+chr2	558703	558735	a	a	+
+chr2	558672	558704	b	b	-
+chr2	558672	558704	b	b	-
+chr2	558672	558704	b	b	-
+chr2	558673	558705	b	b	-
+chr2	558706	558738	a	a	+
+chr2	558675	558707	b	b	-
+chr2	558676	558708	b	b	-
+chr2	558676	558708	b	b	-
+chr2	558709	558741	a	a	+
+chr2	558677	558709	b	b	-
+chr2	558677	558709	b	b	-
+chr2	558677	558709	b	b	-
+chr2	558677	558709	b	b	-
+chr2	558678	558710	b	b	-
+chr2	558678	558710	b	b	-
+chr2	558679	558711	b	b	-
+chr2	558715	558747	a	a	+
+chr2	558683	558715	b	b	-
+chr2	558684	558716	b	b	-
+chr2	558719	558751	a	a	+
+chr2	558729	558761	a	a	+
+chr2	558856	558888	a	a	+
+chr2	558871	558903	a	a	+
+chr2	558882	558914	a	a	+
+chr2	558909	558941	a	a	+
+chr2	559183	559215	b	b	-
+chr2	559344	559376	a	a	+
+chr2	559340	559372	b	b	-
+chr2	559557	559589	a	a	+
+chr2	559567	559599	b	b	-
+chr2	559968	560000	a	a	+
+chr2	559979	560011	a	a	+
+chr2	559983	560015	a	a	+
+chr2	559953	559985	b	b	-
+chr2	559955	559987	b	b	-
+chr2	559990	560022	a	a	+
+chr2	559991	560023	a	a	+
+chr2	560009	560041	a	a	+
+chr2	559977	560009	b	b	-
+chr2	560010	560042	a	a	+
+chr2	559978	560010	b	b	-
+chr2	559985	560017	b	b	-
+chr2	560024	560056	a	a	+
+chr2	560029	560061	a	a	+
+chr2	560013	560045	b	b	-
+chr2	560013	560045	b	b	-
+chr2	560017	560049	b	b	-
+chr2	560056	560088	a	a	+
+chr2	560134	560166	a	a	+
+chr2	560126	560158	b	b	-
+chr2	560159	560191	a	a	+
+chr2	560159	560191	a	a	+
+chr2	560159	560191	a	a	+
+chr2	560159	560191	a	a	+
+chr2	560139	560171	b	b	-
+chr2	560172	560204	a	a	+
+chr2	560301	560333	a	a	+
+chr2	560480	560512	a	a	+
+chr2	560565	560597	b	b	-
+chr2	560578	560610	b	b	-
+chr2	560584	560616	b	b	-
+chr2	560633	560665	a	a	+
+chr2	560635	560667	a	a	+
+chr2	560779	560811	a	a	+
+chr2	560779	560811	a	a	+
+chr2	560849	560881	a	a	+
+chr2	560849	560881	a	a	+
+chr2	560870	560902	b	b	-
+chr2	560912	560944	b	b	-
+chr2	560913	560945	b	b	-
+chr2	560922	560954	b	b	-
+chr2	560940	560972	b	b	-
+chr2	560944	560976	b	b	-
+chr2	561250	561282	b	b	-
+chr2	561312	561344	a	a	+
+chr2	561313	561345	a	a	+
+chr2	561313	561345	a	a	+
+chr2	561313	561345	a	a	+
+chr2	561282	561314	b	b	-
+chr2	561310	561342	b	b	-
+chr2	561325	561357	b	b	-
+chr2	561326	561358	b	b	-
+chr2	561359	561391	a	a	+
+chr2	561362	561394	a	a	+
+chr2	561363	561395	a	a	+
+chr2	561363	561395	a	a	+
+chr2	561343	561375	b	b	-
+chr2	561378	561410	a	a	+
+chr2	561381	561413	a	a	+
+chr2	561360	561392	b	b	-
+chr2	561402	561434	a	a	+
+chr2	561410	561442	a	a	+
+chr2	561519	561551	b	b	-
+chr2	561536	561568	b	b	-
+chr2	561566	561598	b	b	-
+chr2	561609	561641	a	a	+
+chr2	561622	561654	a	a	+
+chr2	561622	561654	a	a	+
+chr2	561731	561763	a	a	+
+chr2	561731	561763	a	a	+
+chr2	561799	561831	a	a	+
+chr2	561799	561831	a	a	+
+chr2	561836	561868	a	a	+
+chr2	561931	561963	b	b	-
+chr2	561931	561963	b	b	-
+chr2	562092	562124	a	a	+
+chr2	562216	562248	b	b	-
+chr2	562314	562346	a	a	+
+chr2	562377	562409	a	a	+
+chr2	562360	562392	b	b	-
+chr2	562466	562498	a	a	+
+chr2	562506	562538	a	a	+
+chr2	562548	562580	b	b	-
+chr2	562614	562646	a	a	+
+chr2	562644	562676	a	a	+
+chr2	563379	563411	a	a	+
+chr2	563617	563649	a	a	+
+chr2	563676	563708	a	a	+
+chr2	563694	563726	b	b	-
+chr2	563809	563841	a	a	+
+chr2	564158	564190	b	b	-
+chr2	564358	564390	a	a	+
+chr2	564518	564550	a	a	+
+chr2	564639	564671	a	a	+
+chr2	564815	564847	b	b	-
+chr2	565214	565246	b	b	-
+chr2	565247	565279	a	a	+
+chr2	565247	565279	a	a	+
+chr2	565247	565279	a	a	+
+chr2	565221	565253	b	b	-
+chr2	565255	565287	a	a	+
+chr2	565256	565288	a	a	+
+chr2	565256	565288	a	a	+
+chr2	565256	565288	a	a	+
+chr2	565256	565288	a	a	+
+chr2	565259	565291	a	a	+
+chr2	565234	565266	b	b	-
+chr2	565234	565266	b	b	-
+chr2	565268	565300	a	a	+
+chr2	565239	565271	b	b	-
+chr2	565239	565271	b	b	-
+chr2	565245	565277	b	b	-
+chr2	565282	565314	a	a	+
+chr2	565364	565396	a	a	+
+chr2	565366	565398	b	b	-
+chr2	565367	565399	b	b	-
+chr2	565428	565460	a	a	+
+chr2	565611	565643	a	a	+
+chr2	565595	565627	b	b	-
+chr2	565606	565638	b	b	-
+chr2	565612	565644	b	b	-
+chr2	565650	565682	a	a	+
+chr2	565650	565682	a	a	+
+chr2	565629	565661	b	b	-
+chr2	565629	565661	b	b	-
+chr2	565629	565661	b	b	-
+chr2	565629	565661	b	b	-
+chr2	565630	565662	b	b	-
+chr2	565634	565666	b	b	-
+chr2	565634	565666	b	b	-
+chr2	565668	565700	a	a	+
+chr2	565670	565702	a	a	+
+chr2	565670	565702	a	a	+
+chr2	565670	565702	a	a	+
+chr2	565670	565702	a	a	+
+chr2	565670	565702	a	a	+
+chr2	565670	565702	a	a	+
+chr2	565638	565670	b	b	-
+chr2	565671	565703	a	a	+
+chr2	565671	565703	a	a	+
+chr2	565673	565705	a	a	+
+chr2	565673	565705	a	a	+
+chr2	565673	565705	a	a	+
+chr2	565642	565674	b	b	-
+chr2	565645	565677	b	b	-
+chr2	565646	565678	b	b	-
+chr2	565680	565712	a	a	+
+chr2	565680	565712	a	a	+
+chr2	565681	565713	a	a	+
+chr2	565681	565713	a	a	+
+chr2	565689	565721	a	a	+
+chr2	565660	565692	b	b	-
+chr2	565694	565726	a	a	+
+chr2	565694	565726	a	a	+
+chr2	565664	565696	b	b	-
+chr2	565668	565700	b	b	-
+chr2	565726	565758	a	a	+
+chr2	565811	565843	b	b	-
+chr2	565857	565889	a	a	+
+chr2	565866	565898	a	a	+
+chr2	565967	565999	b	b	-
+chr2	565991	566023	b	b	-
+chr2	566038	566070	a	a	+
+chr2	566151	566183	b	b	-
+chr2	566166	566198	b	b	-
+chr2	566219	566251	a	a	+
+chr2	566339	566371	b	b	-
+chr2	566867	566899	a	a	+
+chr2	567031	567063	a	a	+
+chr2	567022	567054	b	b	-
+chr2	567024	567056	b	b	-
+chr2	567024	567056	b	b	-
+chr2	567060	567092	a	a	+
+chr2	567077	567109	b	b	-
+chr2	567077	567109	b	b	-
+chr2	567253	567285	b	b	-
+chr2	567489	567521	b	b	-
+chr2	567876	567908	b	b	-
+chr2	567954	567986	a	a	+
+chr2	568123	568155	b	b	-
+chr2	568126	568158	b	b	-
+chr2	568127	568159	b	b	-
+chr2	568138	568170	b	b	-
+chr2	568180	568212	a	a	+
+chr2	568320	568352	a	a	+
+chr2	568320	568352	a	a	+
+chr2	568291	568323	b	b	-
+chr2	568483	568515	a	a	+
+chr2	568455	568487	b	b	-
+chr2	568466	568498	b	b	-
+chr2	568466	568498	b	b	-
+chr2	568505	568537	a	a	+
+chr2	568505	568537	a	a	+
+chr2	568481	568513	b	b	-
+chr2	568481	568513	b	b	-
+chr2	568482	568514	b	b	-
+chr2	568515	568547	a	a	+
+chr2	568515	568547	a	a	+
+chr2	568528	568560	a	a	+
+chr2	568530	568562	a	a	+
+chr2	568708	568740	b	b	-
+chr2	568732	568764	b	b	-
+chr2	568734	568766	b	b	-
+chr2	568734	568766	b	b	-
+chr2	568737	568769	b	b	-
+chr2	568751	568783	b	b	-
+chr2	568790	568822	a	a	+
+chr2	568763	568795	b	b	-
+chr2	568796	568828	a	a	+
+chr2	568772	568804	b	b	-
+chr2	568777	568809	b	b	-
+chr2	568781	568813	b	b	-
+chr2	568781	568813	b	b	-
+chr2	568781	568813	b	b	-
+chr2	568782	568814	b	b	-
+chr2	568920	568952	a	a	+
+chr2	568906	568938	b	b	-
+chr2	568945	568977	a	a	+
+chr2	568955	568987	a	a	+
+chr2	568936	568968	b	b	-
+chr2	568969	569001	a	a	+
+chr2	569081	569113	a	a	+
+chr2	569124	569156	a	a	+
+chr2	569420	569452	b	b	-
+chr2	569531	569563	b	b	-
+chr2	569863	569895	b	b	-
+chr2	569931	569963	b	b	-
+chr2	570032	570064	b	b	-
+chr2	570172	570204	b	b	-
+chr2	570178	570210	b	b	-
+chr2	570528	570560	a	a	+
+chr2	570815	570847	b	b	-
+chr2	570856	570888	b	b	-
+chr2	570981	571013	a	a	+
+chr2	570989	571021	b	b	-
+chr2	571046	571078	a	a	+
+chr2	571127	571159	a	a	+
+chr2	571168	571200	a	a	+
+chr2	571137	571169	b	b	-
+chr2	571146	571178	b	b	-
+chr2	571181	571213	a	a	+
+chr2	571182	571214	a	a	+
+chr2	571191	571223	a	a	+
+chr2	571191	571223	a	a	+
+chr2	571192	571224	a	a	+
+chr2	571192	571224	a	a	+
+chr2	571192	571224	a	a	+
+chr2	571162	571194	b	b	-
+chr2	571166	571198	b	b	-
+chr2	571168	571200	b	b	-
+chr2	571201	571233	a	a	+
+chr2	571201	571233	a	a	+
+chr2	571201	571233	a	a	+
+chr2	571201	571233	a	a	+
+chr2	571171	571203	b	b	-
+chr2	571171	571203	b	b	-
+chr2	571172	571204	b	b	-
+chr2	571215	571247	a	a	+
+chr2	571223	571255	a	a	+
+chr2	571223	571255	a	a	+
+chr2	571201	571233	b	b	-
+chr2	571249	571281	a	a	+
+chr2	571263	571295	a	a	+
+chr2	571411	571443	b	b	-
+chr2	571481	571513	b	b	-
+chr2	571591	571623	a	a	+
+chr2	571642	571674	b	b	-
+chr2	571759	571791	a	a	+
+chr2	571823	571855	a	a	+
+chr2	571839	571871	a	a	+
+chr2	571854	571886	a	a	+
+chr2	571859	571891	a	a	+
+chr2	571828	571860	b	b	-
+chr2	571839	571871	b	b	-
+chr2	571876	571908	a	a	+
+chr2	571854	571886	b	b	-
+chr2	571915	571947	a	a	+
+chr2	571915	571947	a	a	+
+chr2	572054	572086	a	a	+
+chr2	572077	572109	a	a	+
+chr2	572049	572081	b	b	-
+chr2	572071	572103	b	b	-
+chr2	572072	572104	b	b	-
+chr2	572222	572254	a	a	+
+chr2	572224	572256	a	a	+
+chr2	572199	572231	b	b	-
+chr2	572215	572247	b	b	-
+chr2	572250	572282	a	a	+
+chr2	572260	572292	a	a	+
+chr2	572260	572292	a	a	+
+chr2	572231	572263	b	b	-
+chr2	572283	572315	a	a	+
+chr2	572255	572287	b	b	-
+chr2	572256	572288	b	b	-
+chr2	572290	572322	a	a	+
+chr2	572291	572323	a	a	+
+chr2	572295	572327	a	a	+
+chr2	572295	572327	a	a	+
+chr2	572403	572435	b	b	-
+chr2	572439	572471	a	a	+
+chr2	572440	572472	a	a	+
+chr2	572409	572441	b	b	-
+chr2	572448	572480	a	a	+
+chr2	572455	572487	a	a	+
+chr2	572424	572456	b	b	-
+chr2	572432	572464	b	b	-
+chr2	572435	572467	b	b	-
+chr2	572470	572502	a	a	+
+chr2	572486	572518	a	a	+
+chr2	572456	572488	b	b	-
+chr2	572459	572491	b	b	-
+chr2	572505	572537	a	a	+
+chr2	572591	572623	b	b	-
+chr2	572625	572657	a	a	+
+chr2	572625	572657	a	a	+
+chr2	572596	572628	b	b	-
+chr2	572768	572800	b	b	-
+chr2	572838	572870	a	a	+
+chr2	572838	572870	a	a	+
+chr2	573245	573277	a	a	+
+chr2	573378	573410	a	a	+
+chr2	573870	573902	b	b	-
+chr2	573870	573902	b	b	-
+chr2	573906	573938	a	a	+
+chr2	574032	574064	b	b	-
+chr2	574043	574075	b	b	-
+chr2	574078	574110	a	a	+
+chr2	574049	574081	b	b	-
+chr2	574082	574114	a	a	+
+chr2	574084	574116	a	a	+
+chr2	574088	574120	a	a	+
+chr2	574122	574154	a	a	+
+chr2	574122	574154	a	a	+
+chr2	574122	574154	a	a	+
+chr2	574125	574157	a	a	+
+chr2	574141	574173	a	a	+
+chr2	574184	574216	b	b	-
+chr2	574276	574308	a	a	+
+chr2	574268	574300	b	b	-
+chr2	574268	574300	b	b	-
+chr2	574268	574300	b	b	-
+chr2	574273	574305	b	b	-
+chr2	574275	574307	b	b	-
+chr2	574282	574314	b	b	-
+chr2	574283	574315	b	b	-
+chr2	574284	574316	b	b	-
+chr2	574294	574326	b	b	-
+chr2	574297	574329	b	b	-
+chr2	574334	574366	a	a	+
+chr2	574303	574335	b	b	-
+chr2	574310	574342	b	b	-
+chr2	574344	574376	a	a	+
+chr2	574344	574376	a	a	+
+chr2	574344	574376	a	a	+
+chr2	574318	574350	b	b	-
+chr2	574415	574447	a	a	+
+chr2	574469	574501	b	b	-
+chr2	574504	574536	a	a	+
+chr2	574492	574524	b	b	-
+chr2	574561	574593	b	b	-
+chr2	574612	574644	b	b	-
+chr2	574654	574686	a	a	+
+chr2	574757	574789	a	a	+
+chr2	574883	574915	b	b	-
+chr2	574934	574966	a	a	+
+chr2	575068	575100	a	a	+
+chr2	575276	575308	a	a	+
+chr2	575281	575313	a	a	+
+chr2	575374	575406	b	b	-
+chr2	575427	575459	a	a	+
+chr2	575534	575566	b	b	-
+chr2	575687	575719	b	b	-
+chr2	575887	575919	a	a	+
+chr2	575895	575927	a	a	+
+chr2	575905	575937	a	a	+
+chr2	575905	575937	a	a	+
+chr2	575905	575937	a	a	+
+chr2	575905	575937	a	a	+
+chr2	575906	575938	a	a	+
+chr2	575883	575915	b	b	-
+chr2	575885	575917	b	b	-
+chr2	575885	575917	b	b	-
+chr2	575886	575918	b	b	-
+chr2	576134	576166	a	a	+
+chr2	576291	576323	b	b	-
+chr2	576294	576326	b	b	-
+chr2	576338	576370	a	a	+
+chr2	576341	576373	a	a	+
+chr2	576311	576343	b	b	-
+chr2	576345	576377	a	a	+
+chr2	576345	576377	a	a	+
+chr2	576345	576377	a	a	+
+chr2	576356	576388	a	a	+
+chr2	576360	576392	a	a	+
+chr2	576329	576361	b	b	-
+chr2	576386	576418	a	a	+
+chr2	576386	576418	a	a	+
+chr2	576390	576422	a	a	+
+chr2	576390	576422	a	a	+
+chr2	576376	576408	b	b	-
+chr2	576382	576414	b	b	-
+chr2	576404	576436	b	b	-
+chr2	576631	576663	b	b	-
+chr2	576665	576697	a	a	+
+chr2	576636	576668	b	b	-
+chr2	576919	576951	a	a	+
+chr2	577391	577423	b	b	-
+chr2	577685	577717	a	a	+
+chr2	577732	577764	a	a	+
+chr2	577732	577764	a	a	+
+chr2	577711	577743	b	b	-
+chr2	577883	577915	a	a	+
+chr2	577870	577902	b	b	-
+chr2	577870	577902	b	b	-
+chr2	577870	577902	b	b	-
+chr2	577905	577937	a	a	+
+chr2	577881	577913	b	b	-
+chr2	578049	578081	a	a	+
+chr2	578027	578059	b	b	-
+chr2	578027	578059	b	b	-
+chr2	578028	578060	b	b	-
+chr2	578029	578061	b	b	-
+chr2	578062	578094	a	a	+
+chr2	578039	578071	b	b	-
+chr2	578039	578071	b	b	-
+chr2	578039	578071	b	b	-
+chr2	578078	578110	a	a	+
+chr2	578079	578111	a	a	+
+chr2	578079	578111	a	a	+
+chr2	578079	578111	a	a	+
+chr2	578079	578111	a	a	+
+chr2	578063	578095	b	b	-
+chr2	578064	578096	b	b	-
+chr2	578064	578096	b	b	-
+chr2	578303	578335	b	b	-
+chr2	578316	578348	b	b	-
+chr2	578324	578356	b	b	-
+chr2	578329	578361	b	b	-
+chr2	578331	578363	b	b	-
+chr2	578334	578366	b	b	-
+chr2	578334	578366	b	b	-
+chr2	578368	578400	a	a	+
+chr2	578368	578400	a	a	+
+chr2	578368	578400	a	a	+
+chr2	578369	578401	a	a	+
+chr2	578369	578401	a	a	+
+chr2	578369	578401	a	a	+
+chr2	578369	578401	a	a	+
+chr2	578341	578373	b	b	-
+chr2	578342	578374	b	b	-
+chr2	578342	578374	b	b	-
+chr2	578342	578374	b	b	-
+chr2	578342	578374	b	b	-
+chr2	578343	578375	b	b	-
+chr2	578343	578375	b	b	-
+chr2	578345	578377	b	b	-
+chr2	578378	578410	a	a	+
+chr2	578378	578410	a	a	+
+chr2	578379	578411	a	a	+
+chr2	578379	578411	a	a	+
+chr2	578379	578411	a	a	+
+chr2	578379	578411	a	a	+
+chr2	578379	578411	a	a	+
+chr2	578379	578411	a	a	+
+chr2	578380	578412	a	a	+
+chr2	578380	578412	a	a	+
+chr2	578381	578413	a	a	+
+chr2	578384	578416	a	a	+
+chr2	578352	578384	b	b	-
+chr2	578386	578418	a	a	+
+chr2	578354	578386	b	b	-
+chr2	578354	578386	b	b	-
+chr2	578354	578386	b	b	-
+chr2	578354	578386	b	b	-
+chr2	578387	578419	a	a	+
+chr2	578356	578388	b	b	-
+chr2	578356	578388	b	b	-
+chr2	578357	578389	b	b	-
+chr2	578390	578422	a	a	+
+chr2	578395	578427	a	a	+
+chr2	578395	578427	a	a	+
+chr2	578399	578431	a	a	+
+chr2	578399	578431	a	a	+
+chr2	578415	578447	a	a	+
+chr2	578524	578556	a	a	+
+chr2	578524	578556	a	a	+
+chr2	578499	578531	b	b	-
+chr2	578499	578531	b	b	-
+chr2	578501	578533	b	b	-
+chr2	578501	578533	b	b	-
+chr2	578539	578571	a	a	+
+chr2	578543	578575	a	a	+
+chr2	578548	578580	a	a	+
+chr2	578528	578560	b	b	-
+chr2	578530	578562	b	b	-
+chr2	578530	578562	b	b	-
+chr2	578530	578562	b	b	-
+chr2	578538	578570	b	b	-
+chr2	578658	578690	b	b	-
+chr2	578700	578732	a	a	+
+chr2	578869	578901	a	a	+
+chr2	578843	578875	b	b	-
+chr2	578895	578927	a	a	+
+chr2	579200	579232	b	b	-
+chr2	579653	579685	a	a	+
+chr2	579781	579813	b	b	-
+chr2	580770	580802	a	a	+
+chr2	580770	580802	a	a	+
+chr2	580756	580788	b	b	-
+chr2	580913	580945	a	a	+
+chr2	581086	581118	b	b	-
+chr2	581191	581223	b	b	-
+chr2	581211	581243	b	b	-
+chr2	581222	581254	b	b	-
+chr2	581266	581298	a	a	+
+chr2	581268	581300	a	a	+
+chr2	581237	581269	b	b	-
+chr2	581294	581326	a	a	+
+chr2	581404	581436	a	a	+
+chr2	581373	581405	b	b	-
+chr2	581373	581405	b	b	-
+chr2	581377	581409	b	b	-
+chr2	581417	581449	a	a	+
+chr2	581386	581418	b	b	-
+chr2	581420	581452	a	a	+
+chr2	581420	581452	a	a	+
+chr2	581388	581420	b	b	-
+chr2	581421	581453	a	a	+
+chr2	581421	581453	a	a	+
+chr2	581429	581461	a	a	+
+chr2	581430	581462	a	a	+
+chr2	581402	581434	b	b	-
+chr2	581403	581435	b	b	-
+chr2	581441	581473	a	a	+
+chr2	581411	581443	b	b	-
+chr2	581444	581476	a	a	+
+chr2	581444	581476	a	a	+
+chr2	581444	581476	a	a	+
+chr2	581444	581476	a	a	+
+chr2	581412	581444	b	b	-
+chr2	581414	581446	b	b	-
+chr2	581415	581447	b	b	-
+chr2	581419	581451	b	b	-
+chr2	581701	581733	b	b	-
+chr2	581737	581769	b	b	-
+chr2	581844	581876	a	a	+
+chr2	582084	582116	a	a	+
+chr2	582113	582145	a	a	+
+chr2	582090	582122	b	b	-
+chr2	582145	582177	a	a	+
+chr2	582147	582179	a	a	+
+chr2	582159	582191	a	a	+
+chr2	582127	582159	b	b	-
+chr2	582128	582160	b	b	-
+chr2	582367	582399	a	a	+
+chr2	582395	582427	a	a	+
+chr2	582400	582432	a	a	+
+chr2	582400	582432	a	a	+
+chr2	582384	582416	b	b	-
+chr2	582384	582416	b	b	-
+chr2	582384	582416	b	b	-
+chr2	582384	582416	b	b	-
+chr2	582384	582416	b	b	-
+chr2	582385	582417	b	b	-
+chr2	582386	582418	b	b	-
+chr2	582422	582454	a	a	+
+chr2	582422	582454	a	a	+
+chr2	582422	582454	a	a	+
+chr2	582422	582454	a	a	+
+chr2	582390	582422	b	b	-
+chr2	582423	582455	a	a	+
+chr2	582423	582455	a	a	+
+chr2	582423	582455	a	a	+
+chr2	582423	582455	a	a	+
+chr2	582423	582455	a	a	+
+chr2	582423	582455	a	a	+
+chr2	582423	582455	a	a	+
+chr2	582423	582455	a	a	+
+chr2	582423	582455	a	a	+
+chr2	582423	582455	a	a	+
+chr2	582423	582455	a	a	+
+chr2	582423	582455	a	a	+
+chr2	582423	582455	a	a	+
+chr2	582423	582455	a	a	+
+chr2	582423	582455	a	a	+
+chr2	582423	582455	a	a	+
+chr2	582423	582455	a	a	+
+chr2	582423	582455	a	a	+
+chr2	582423	582455	a	a	+
+chr2	582423	582455	a	a	+
+chr2	582392	582424	b	b	-
+chr2	582392	582424	b	b	-
+chr2	582392	582424	b	b	-
+chr2	582392	582424	b	b	-
+chr2	582392	582424	b	b	-
+chr2	582427	582459	a	a	+
+chr2	582427	582459	a	a	+
+chr2	582427	582459	a	a	+
+chr2	582428	582460	a	a	+
+chr2	582428	582460	a	a	+
+chr2	582428	582460	a	a	+
+chr2	582398	582430	b	b	-
+chr2	582398	582430	b	b	-
+chr2	582398	582430	b	b	-
+chr2	582431	582463	a	a	+
+chr2	582399	582431	b	b	-
+chr2	582432	582464	a	a	+
+chr2	582432	582464	a	a	+
+chr2	582432	582464	a	a	+
+chr2	582432	582464	a	a	+
+chr2	582400	582432	b	b	-
+chr2	582400	582432	b	b	-
+chr2	582400	582432	b	b	-
+chr2	582438	582470	a	a	+
+chr2	582439	582471	a	a	+
+chr2	582439	582471	a	a	+
+chr2	582439	582471	a	a	+
+chr2	582439	582471	a	a	+
+chr2	582439	582471	a	a	+
+chr2	582439	582471	a	a	+
+chr2	582407	582439	b	b	-
+chr2	582409	582441	b	b	-
+chr2	582409	582441	b	b	-
+chr2	582409	582441	b	b	-
+chr2	582409	582441	b	b	-
+chr2	582447	582479	a	a	+
+chr2	582451	582483	a	a	+
+chr2	582452	582484	a	a	+
+chr2	582466	582498	a	a	+
+chr2	582466	582498	a	a	+
+chr2	582466	582498	a	a	+
+chr2	582578	582610	a	a	+
+chr2	582566	582598	b	b	-
+chr2	582600	582632	a	a	+
+chr2	582602	582634	a	a	+
+chr2	582602	582634	a	a	+
+chr2	582570	582602	b	b	-
+chr2	582582	582614	b	b	-
+chr2	582760	582792	b	b	-
+chr2	582795	582827	a	a	+
+chr2	582795	582827	a	a	+
+chr2	583050	583082	b	b	-
+chr2	583075	583107	b	b	-
+chr2	583216	583248	a	a	+
+chr2	583261	583293	a	a	+
+chr2	583274	583306	a	a	+
+chr2	583358	583390	b	b	-
+chr2	583358	583390	b	b	-
+chr2	583610	583642	a	a	+
+chr2	583610	583642	a	a	+
+chr2	583582	583614	b	b	-
+chr2	583619	583651	a	a	+
+chr2	583627	583659	a	a	+
+chr2	583599	583631	b	b	-
+chr2	583637	583669	a	a	+
+chr2	583637	583669	a	a	+
+chr2	583607	583639	b	b	-
+chr2	583610	583642	b	b	-
+chr2	583613	583645	b	b	-
+chr2	583654	583686	a	a	+
+chr2	583654	583686	a	a	+
+chr2	583656	583688	a	a	+
+chr2	583657	583689	a	a	+
+chr2	583663	583695	a	a	+
+chr2	583768	583800	b	b	-
+chr2	583811	583843	a	a	+
+chr2	583811	583843	a	a	+
+chr2	583839	583871	a	a	+
+chr2	583809	583841	b	b	-
+chr2	583845	583877	a	a	+
+chr2	583813	583845	b	b	-
+chr2	583971	584003	a	a	+
+chr2	584141	584173	a	a	+
+chr2	584163	584195	a	a	+
+chr2	584134	584166	b	b	-
+chr2	584281	584313	b	b	-
+chr2	584281	584313	b	b	-
+chr2	584330	584362	a	a	+
+chr2	584336	584368	a	a	+
+chr2	584336	584368	a	a	+
+chr2	584339	584371	a	a	+
+chr2	584346	584378	a	a	+
+chr2	584460	584492	b	b	-
+chr2	584460	584492	b	b	-
+chr2	584508	584540	b	b	-
+chr2	584508	584540	b	b	-
+chr2	584508	584540	b	b	-
+chr2	584779	584811	a	a	+
+chr2	584799	584831	a	a	+
+chr2	584994	585026	a	a	+
+chr2	585068	585100	a	a	+
+chr2	585122	585154	b	b	-
+chr2	585122	585154	b	b	-
+chr2	585204	585236	b	b	-
+chr2	585355	585387	b	b	-
+chr2	585665	585697	b	b	-
+chr2	585799	585831	a	a	+
+chr2	585927	585959	b	b	-
+chr2	586129	586161	a	a	+
+chr2	586118	586150	b	b	-
+chr2	586118	586150	b	b	-
+chr2	586153	586185	a	a	+
+chr2	586126	586158	b	b	-
+chr2	586163	586195	a	a	+
+chr2	586163	586195	a	a	+
+chr2	586134	586166	b	b	-
+chr2	586179	586211	a	a	+
+chr2	586182	586214	a	a	+
+chr2	586190	586222	a	a	+
+chr2	586163	586195	b	b	-
+chr2	586572	586604	a	a	+
+chr2	586580	586612	a	a	+
+chr2	586585	586617	a	a	+
+chr2	586554	586586	b	b	-
+chr2	586605	586637	a	a	+
+chr2	586580	586612	b	b	-
+chr2	586687	586719	b	b	-
+chr2	586710	586742	b	b	-
+chr2	586745	586777	a	a	+
+chr2	586755	586787	b	b	-
+chr2	586755	586787	b	b	-
+chr2	586902	586934	a	a	+
+chr2	586902	586934	a	a	+
+chr2	587001	587033	b	b	-
+chr2	587498	587530	b	b	-
+chr2	587854	587886	b	b	-
+chr2	588103	588135	a	a	+
+chr2	588259	588291	a	a	+
+chr2	588769	588801	b	b	-
+chr2	588939	588971	a	a	+
+chr2	588948	588980	a	a	+
+chr2	588918	588950	b	b	-
+chr2	588951	588983	a	a	+
+chr2	588921	588953	b	b	-
+chr2	588921	588953	b	b	-
+chr2	588954	588986	a	a	+
+chr2	588957	588989	a	a	+
+chr2	588957	588989	a	a	+
+chr2	588983	589015	a	a	+
+chr2	588959	588991	b	b	-
+chr2	588982	589014	b	b	-
+chr2	588982	589014	b	b	-
+chr2	589049	589081	b	b	-
+chr2	589066	589098	b	b	-
+chr2	589066	589098	b	b	-
+chr2	589102	589134	a	a	+
+chr2	589104	589136	a	a	+
+chr2	589079	589111	b	b	-
+chr2	589079	589111	b	b	-
+chr2	589079	589111	b	b	-
+chr2	589086	589118	b	b	-
+chr2	589087	589119	b	b	-
+chr2	589121	589153	a	a	+
+chr2	589121	589153	a	a	+
+chr2	589121	589153	a	a	+
+chr2	589121	589153	a	a	+
+chr2	589124	589156	a	a	+
+chr2	589137	589169	a	a	+
+chr2	589113	589145	b	b	-
+chr2	589147	589179	a	a	+
+chr2	589147	589179	a	a	+
+chr2	589115	589147	b	b	-
+chr2	589115	589147	b	b	-
+chr2	589115	589147	b	b	-
+chr2	589149	589181	a	a	+
+chr2	589149	589181	a	a	+
+chr2	589152	589184	a	a	+
+chr2	589122	589154	b	b	-
+chr2	589163	589195	a	a	+
+chr2	589163	589195	a	a	+
+chr2	589166	589198	a	a	+
+chr2	589137	589169	b	b	-
+chr2	589138	589170	b	b	-
+chr2	589347	589379	b	b	-
+chr2	589447	589479	a	a	+
+chr2	589415	589447	b	b	-
+chr2	589415	589447	b	b	-
+chr2	589452	589484	a	a	+
+chr2	589427	589459	b	b	-
+chr2	589429	589461	b	b	-
+chr2	589429	589461	b	b	-
+chr2	589432	589464	b	b	-
+chr2	589434	589466	b	b	-
+chr2	589434	589466	b	b	-
+chr2	589434	589466	b	b	-
+chr2	589435	589467	b	b	-
+chr2	589435	589467	b	b	-
+chr2	589470	589502	a	a	+
+chr2	589475	589507	a	a	+
+chr2	589444	589476	b	b	-
+chr2	589479	589511	a	a	+
+chr2	589483	589515	a	a	+
+chr2	589495	589527	a	a	+
+chr2	589495	589527	a	a	+
+chr2	589701	589733	a	a	+
+chr2	589852	589884	b	b	-
+chr2	589872	589904	b	b	-
+chr2	589980	590012	b	b	-
+chr2	590181	590213	a	a	+
+chr2	590214	590246	a	a	+
+chr2	590386	590418	a	a	+
+chr2	590499	590531	b	b	-
+chr2	590549	590581	a	a	+
+chr2	590630	590662	b	b	-
+chr2	590684	590716	a	a	+
+chr2	590693	590725	a	a	+
+chr2	590729	590761	a	a	+
+chr2	590700	590732	b	b	-
+chr2	590703	590735	b	b	-
+chr2	590851	590883	b	b	-
+chr2	590851	590883	b	b	-
+chr2	590917	590949	a	a	+
+chr2	590944	590976	a	a	+
+chr2	590944	590976	b	b	-
+chr2	591233	591265	a	a	+
+chr2	591245	591277	a	a	+
+chr2	591274	591306	a	a	+
+chr2	591246	591278	b	b	-
+chr2	591279	591311	a	a	+
+chr2	591250	591282	b	b	-
+chr2	591256	591288	b	b	-
+chr2	591259	591291	b	b	-
+chr2	591298	591330	a	a	+
+chr2	591298	591330	a	a	+
+chr2	591298	591330	a	a	+
+chr2	591298	591330	a	a	+
+chr2	591308	591340	a	a	+
+chr2	591278	591310	b	b	-
+chr2	591316	591348	a	a	+
+chr2	591316	591348	a	a	+
+chr2	591319	591351	a	a	+
+chr2	591319	591351	a	a	+
+chr2	591319	591351	a	a	+
+chr2	591319	591351	a	a	+
+chr2	591289	591321	b	b	-
+chr2	591289	591321	b	b	-
+chr2	591294	591326	b	b	-
+chr2	591327	591359	a	a	+
+chr2	591295	591327	b	b	-
+chr2	591299	591331	b	b	-
+chr2	591300	591332	b	b	-
+chr2	591300	591332	b	b	-
+chr2	591341	591373	a	a	+
+chr2	591314	591346	b	b	-
+chr2	591325	591357	b	b	-
+chr2	591361	591393	a	a	+
+chr2	591338	591370	b	b	-
+chr2	591338	591370	b	b	-
+chr2	592302	592334	b	b	-
+chr2	592421	592453	a	a	+
+chr2	592653	592685	b	b	-
+chr2	592653	592685	b	b	-
+chr2	592771	592803	a	a	+
+chr2	592771	592803	a	a	+
+chr2	592771	592803	a	a	+
+chr2	593228	593260	b	b	-
+chr2	593230	593262	b	b	-
+chr2	593233	593265	b	b	-
+chr2	593234	593266	b	b	-
+chr2	593234	593266	b	b	-
+chr2	593237	593269	b	b	-
+chr2	593244	593276	b	b	-
+chr2	593297	593329	a	a	+
+chr2	593297	593329	a	a	+
+chr2	593285	593317	b	b	-
+chr2	593329	593361	a	a	+
+chr2	593391	593423	a	a	+
+chr2	593419	593451	a	a	+
+chr2	593527	593559	b	b	-
+chr2	593555	593587	b	b	-
+chr2	593588	593620	a	a	+
+chr2	593564	593596	b	b	-
+chr2	593718	593750	a	a	+
+chr2	593698	593730	b	b	-
+chr2	593744	593776	b	b	-
+chr2	593746	593778	b	b	-
+chr2	593754	593786	b	b	-
+chr2	593845	593877	b	b	-
+chr2	593845	593877	b	b	-
+chr2	593849	593881	b	b	-
+chr2	593896	593928	a	a	+
+chr2	593910	593942	a	a	+
+chr2	593946	593978	a	a	+
+chr2	593980	594012	a	a	+
+chr2	594036	594068	a	a	+
+chr2	594024	594056	b	b	-
+chr2	594087	594119	b	b	-
+chr2	594094	594126	b	b	-
+chr2	594271	594303	b	b	-
+chr2	594278	594310	b	b	-
+chr2	594321	594353	a	a	+
+chr2	594327	594359	a	a	+
+chr2	594459	594491	a	a	+
+chr2	594442	594474	b	b	-
+chr2	594442	594474	b	b	-
+chr2	594490	594522	a	a	+
+chr2	594515	594547	b	b	-
+chr2	594515	594547	b	b	-
+chr2	594551	594583	b	b	-
+chr2	594614	594646	b	b	-
+chr2	594626	594658	b	b	-
+chr2	594635	594667	b	b	-
+chr2	594705	594737	a	a	+
+chr2	594689	594721	b	b	-
+chr2	594799	594831	a	a	+
+chr2	594773	594805	b	b	-
+chr2	594773	594805	b	b	-
+chr2	594822	594854	a	a	+
+chr2	594964	594996	b	b	-
+chr2	594978	595010	b	b	-
+chr2	595023	595055	a	a	+
+chr2	595005	595037	b	b	-
+chr2	595058	595090	b	b	-
+chr2	595247	595279	a	a	+
+chr2	595253	595285	a	a	+
+chr2	595261	595293	a	a	+
+chr2	595255	595287	b	b	-
+chr2	595299	595331	a	a	+
+chr2	595311	595343	a	a	+
+chr2	595282	595314	b	b	-
+chr2	595319	595351	a	a	+
+chr2	595322	595354	a	a	+
+chr2	595292	595324	b	b	-
+chr2	595351	595383	a	a	+
+chr2	595320	595352	b	b	-
+chr2	595321	595353	b	b	-
+chr2	595332	595364	b	b	-
+chr2	595400	595432	a	a	+
+chr2	595472	595504	b	b	-
+chr2	595485	595517	b	b	-
+chr2	595524	595556	a	a	+
+chr2	595496	595528	b	b	-
+chr2	595496	595528	b	b	-
+chr2	595547	595579	a	a	+
+chr2	595639	595671	a	a	+
+chr2	596149	596181	a	a	+
+chr2	596152	596184	a	a	+
+chr2	596133	596165	b	b	-
+chr2	596181	596213	a	a	+
+chr2	596156	596188	b	b	-
+chr2	596206	596238	a	a	+
+chr2	596375	596407	a	a	+
+chr2	596380	596412	a	a	+
+chr2	596380	596412	a	a	+
+chr2	596389	596421	b	b	-
+chr2	596439	596471	a	a	+
+chr2	596464	596496	a	a	+
+chr2	596455	596487	b	b	-
+chr2	596499	596531	a	a	+
+chr2	596492	596524	b	b	-
+chr2	596957	596989	a	a	+
+chr2	596928	596960	b	b	-
+chr2	596939	596971	b	b	-
+chr2	596978	597010	a	a	+
+chr2	597366	597398	a	a	+
+chr2	597367	597399	a	a	+
+chr2	597368	597400	a	a	+
+chr2	597348	597380	b	b	-
+chr2	597348	597380	b	b	-
+chr2	597348	597380	b	b	-
+chr2	597349	597381	b	b	-
+chr2	597394	597426	a	a	+
+chr2	597405	597437	a	a	+
+chr2	597507	597539	b	b	-
+chr2	597508	597540	b	b	-
+chr2	597513	597545	b	b	-
+chr2	597513	597545	b	b	-
+chr2	597514	597546	b	b	-
+chr2	597562	597594	a	a	+
+chr2	597619	597651	b	b	-
+chr2	597669	597701	a	a	+
+chr2	597677	597709	a	a	+
+chr2	597706	597738	a	a	+
+chr2	597688	597720	b	b	-
+chr2	597729	597761	a	a	+
+chr2	597729	597761	a	a	+
+chr2	597729	597761	a	a	+
+chr2	597732	597764	a	a	+
+chr2	597847	597879	a	a	+
+chr2	597894	597926	a	a	+
+chr2	598029	598061	a	a	+
+chr2	598082	598114	a	a	+
+chr2	598221	598253	b	b	-
+chr2	598320	598352	a	a	+
+chr2	598362	598394	b	b	-
+chr2	598369	598401	b	b	-
+chr2	598403	598435	a	a	+
+chr2	598377	598409	b	b	-
+chr2	598389	598421	b	b	-
+chr2	598423	598455	a	a	+
+chr2	598404	598436	b	b	-
+chr2	598404	598436	b	b	-
+chr2	598440	598472	a	a	+
+chr2	598440	598472	a	a	+
+chr2	598440	598472	a	a	+
+chr2	598572	598604	a	a	+
+chr2	598572	598604	a	a	+
+chr2	598573	598605	a	a	+
+chr2	598596	598628	b	b	-
+chr2	598647	598679	a	a	+
+chr2	598658	598690	a	a	+
+chr2	598711	598743	a	a	+
+chr2	598856	598888	a	a	+
+chr2	599366	599398	a	a	+
+chr2	599505	599537	a	a	+
+chr2	599475	599507	b	b	-
+chr2	599480	599512	b	b	-
+chr2	599481	599513	b	b	-
+chr2	599606	599638	a	a	+
+chr2	599693	599725	b	b	-
+chr2	599738	599770	a	a	+
+chr2	599710	599742	b	b	-
+chr2	599748	599780	a	a	+
+chr2	599754	599786	a	a	+
+chr2	599730	599762	b	b	-
+chr2	599741	599773	b	b	-
+chr2	599741	599773	b	b	-
+chr2	599775	599807	a	a	+
+chr2	599776	599808	a	a	+
+chr2	599786	599818	a	a	+
+chr2	599772	599804	b	b	-
+chr2	599854	599886	b	b	-
+chr2	599927	599959	a	a	+
+chr2	599900	599932	b	b	-
+chr2	599900	599932	b	b	-
+chr2	599900	599932	b	b	-
+chr2	599900	599932	b	b	-
+chr2	599900	599932	b	b	-
+chr2	599900	599932	b	b	-
+chr2	599902	599934	b	b	-
+chr2	599935	599967	a	a	+
+chr2	599935	599967	a	a	+
+chr2	599936	599968	a	a	+
+chr2	599904	599936	b	b	-
+chr2	599937	599969	a	a	+
+chr2	599937	599969	a	a	+
+chr2	599905	599937	b	b	-
+chr2	599905	599937	b	b	-
+chr2	599906	599938	b	b	-
+chr2	599910	599942	b	b	-
+chr2	599910	599942	b	b	-
+chr2	599910	599942	b	b	-
+chr2	599911	599943	b	b	-
+chr2	599911	599943	b	b	-
+chr2	599911	599943	b	b	-
+chr2	599913	599945	b	b	-
+chr2	599913	599945	b	b	-
+chr2	599919	599951	b	b	-
+chr2	599920	599952	b	b	-
+chr2	599953	599985	a	a	+
+chr2	599929	599961	b	b	-
+chr2	599975	600007	a	a	+
+chr2	599975	600007	a	a	+
+chr2	600003	600035	b	b	-
+chr2	600113	600145	b	b	-
+chr2	600136	600168	b	b	-
+chr2	600137	600169	b	b	-
+chr2	600173	600205	a	a	+
+chr2	600173	600205	a	a	+
+chr2	600173	600205	a	a	+
+chr2	600173	600205	a	a	+
+chr2	600178	600210	a	a	+
+chr2	600178	600210	a	a	+
+chr2	600178	600210	a	a	+
+chr2	600178	600210	a	a	+
+chr2	600149	600181	b	b	-
+chr2	600183	600215	a	a	+
+chr2	600152	600184	b	b	-
+chr2	600153	600185	b	b	-
+chr2	600153	600185	b	b	-
+chr2	600188	600220	a	a	+
+chr2	600156	600188	b	b	-
+chr2	600190	600222	a	a	+
+chr2	600163	600195	b	b	-
+chr2	600163	600195	b	b	-
+chr2	600196	600228	a	a	+
+chr2	600164	600196	b	b	-
+chr2	600164	600196	b	b	-
+chr2	600164	600196	b	b	-
+chr2	600165	600197	b	b	-
+chr2	600165	600197	b	b	-
+chr2	600165	600197	b	b	-
+chr2	600166	600198	b	b	-
+chr2	600199	600231	a	a	+
+chr2	600200	600232	a	a	+
+chr2	600201	600233	a	a	+
+chr2	600180	600212	b	b	-
+chr2	600180	600212	b	b	-
+chr2	600180	600212	b	b	-
+chr2	600180	600212	b	b	-
+chr2	600187	600219	b	b	-
+chr2	600187	600219	b	b	-
+chr2	600232	600264	a	a	+
+chr2	600521	600553	a	a	+
+chr2	600524	600556	a	a	+
+chr2	600501	600533	b	b	-
+chr2	600519	600551	b	b	-
+chr2	600519	600551	b	b	-
+chr2	600590	600622	a	a	+
+chr2	600563	600595	b	b	-
+chr2	600595	600627	b	b	-
+chr2	600595	600627	b	b	-
+chr2	600684	600716	a	a	+
+chr2	600671	600703	b	b	-
+chr2	600707	600739	a	a	+
+chr2	600707	600739	a	a	+
+chr2	600716	600748	a	a	+
+chr2	600691	600723	b	b	-
+chr2	600699	600731	b	b	-
+chr2	600699	600731	b	b	-
+chr2	600699	600731	b	b	-
+chr2	600715	600747	b	b	-
+chr2	600733	600765	b	b	-
+chr2	600814	600846	b	b	-
+chr2	600848	600880	b	b	-
+chr2	601069	601101	a	a	+
+chr2	601063	601095	b	b	-
+chr2	601082	601114	b	b	-
+chr2	601184	601216	a	a	+
+chr2	601277	601309	a	a	+
+chr2	601981	602013	b	b	-
+chr2	601981	602013	b	b	-
+chr2	602191	602223	a	a	+
+chr2	602160	602192	b	b	-
+chr2	602160	602192	b	b	-
+chr2	602164	602196	b	b	-
+chr2	602204	602236	a	a	+
+chr2	602173	602205	b	b	-
+chr2	602173	602205	b	b	-
+chr2	602173	602205	b	b	-
+chr2	602183	602215	b	b	-
+chr2	602192	602224	b	b	-
+chr2	602226	602258	a	a	+
+chr2	602198	602230	b	b	-
+chr2	602231	602263	a	a	+
+chr2	602512	602544	b	b	-
+chr2	602549	602581	a	a	+
+chr2	602517	602549	b	b	-
+chr2	602518	602550	b	b	-
+chr2	602620	602652	a	a	+
+chr2	602680	602712	a	a	+
+chr2	602682	602714	a	a	+
+chr2	602675	602707	b	b	-
+chr2	602720	602752	a	a	+
+chr2	602733	602765	a	a	+
+chr2	602772	602804	b	b	-
+chr2	602920	602952	a	a	+
+chr2	603334	603366	b	b	-
+chr2	603555	603587	b	b	-
+chr2	603657	603689	a	a	+
+chr2	603625	603657	b	b	-
+chr2	603694	603726	b	b	-
+chr2	603696	603728	b	b	-
+chr2	603712	603744	b	b	-
+chr2	603766	603798	a	a	+
+chr2	603744	603776	b	b	-
+chr2	603774	603806	b	b	-
+chr2	603816	603848	a	a	+
+chr2	603823	603855	a	a	+
+chr2	603962	603994	a	a	+
+chr2	603962	603994	a	a	+
+chr2	603931	603963	b	b	-
+chr2	604020	604052	a	a	+
+chr2	604084	604116	a	a	+
+chr2	604097	604129	a	a	+
+chr2	604077	604109	b	b	-
+chr2	604113	604145	a	a	+
+chr2	604113	604145	a	a	+
+chr2	604113	604145	a	a	+
+chr2	604113	604145	a	a	+
+chr2	604085	604117	b	b	-
+chr2	604119	604151	a	a	+
+chr2	604087	604119	b	b	-
+chr2	604087	604119	b	b	-
+chr2	604123	604155	a	a	+
+chr2	604091	604123	b	b	-
+chr2	604096	604128	b	b	-
+chr2	604130	604162	a	a	+
+chr2	604130	604162	a	a	+
+chr2	604130	604162	a	a	+
+chr2	604132	604164	a	a	+
+chr2	604132	604164	a	a	+
+chr2	604132	604164	a	a	+
+chr2	604133	604165	a	a	+
+chr2	604134	604166	a	a	+
+chr2	604134	604166	a	a	+
+chr2	604102	604134	b	b	-
+chr2	604135	604167	a	a	+
+chr2	604135	604167	a	a	+
+chr2	604135	604167	a	a	+
+chr2	604135	604167	a	a	+
+chr2	604137	604169	a	a	+
+chr2	604138	604170	a	a	+
+chr2	604138	604170	a	a	+
+chr2	604138	604170	a	a	+
+chr2	604138	604170	a	a	+
+chr2	604140	604172	a	a	+
+chr2	604143	604175	a	a	+
+chr2	604112	604144	b	b	-
+chr2	604147	604179	a	a	+
+chr2	604115	604147	b	b	-
+chr2	604150	604182	a	a	+
+chr2	604121	604153	b	b	-
+chr2	604121	604153	b	b	-
+chr2	604121	604153	b	b	-
+chr2	604128	604160	b	b	-
+chr2	604128	604160	b	b	-
+chr2	604502	604534	b	b	-
+chr2	604509	604541	b	b	-
+chr2	604509	604541	b	b	-
+chr2	604509	604541	b	b	-
+chr2	604509	604541	b	b	-
+chr2	605144	605176	a	a	+
+chr2	605231	605263	a	a	+
+chr2	605608	605640	a	a	+
+chr2	605608	605640	a	a	+
+chr2	605723	605755	b	b	-
+chr2	605760	605792	a	a	+
+chr2	605760	605792	a	a	+
+chr2	605734	605766	b	b	-
+chr2	605736	605768	b	b	-
+chr2	605736	605768	b	b	-
+chr2	605776	605808	a	a	+
+chr2	605745	605777	b	b	-
+chr2	606039	606071	b	b	-
+chr2	606688	606720	b	b	-
+chr2	606791	606823	b	b	-
+chr2	607501	607533	a	a	+
+chr2	607515	607547	a	a	+
+chr2	607486	607518	b	b	-
+chr2	607493	607525	b	b	-
+chr2	607530	607562	a	a	+
+chr2	607532	607564	a	a	+
+chr2	607501	607533	b	b	-
+chr2	607539	607571	a	a	+
+chr2	607649	607681	a	a	+
+chr2	607693	607725	a	a	+
+chr2	607704	607736	a	a	+
+chr2	608163	608195	a	a	+
+chr2	608189	608221	a	a	+
+chr2	609086	609118	b	b	-
+chr2	609125	609157	b	b	-
+chr2	609159	609191	a	a	+
+chr2	609160	609192	a	a	+
+chr2	609129	609161	b	b	-
+chr2	609138	609170	b	b	-
+chr2	609174	609206	a	a	+
+chr2	609143	609175	b	b	-
+chr2	609201	609233	a	a	+
+chr2	609199	609231	b	b	-
+chr2	609365	609397	a	a	+
+chr2	609351	609383	b	b	-
+chr2	609357	609389	b	b	-
+chr2	609391	609423	a	a	+
+chr2	609495	609527	b	b	-
+chr2	609505	609537	b	b	-
+chr2	609545	609577	a	a	+
+chr2	609513	609545	b	b	-
+chr2	609559	609591	a	a	+
+chr2	609562	609594	a	a	+
+chr2	609531	609563	b	b	-
+chr2	609643	609675	b	b	-
+chr2	609650	609682	b	b	-
+chr2	609687	609719	a	a	+
+chr2	609697	609729	a	a	+
+chr2	609697	609729	a	a	+
+chr2	609697	609729	a	a	+
+chr2	609668	609700	b	b	-
+chr2	609669	609701	b	b	-
+chr2	609671	609703	b	b	-
+chr2	609704	609736	a	a	+
+chr2	609705	609737	a	a	+
+chr2	609709	609741	a	a	+
+chr2	609710	609742	a	a	+
+chr2	609710	609742	a	a	+
+chr2	609710	609742	a	a	+
+chr2	609679	609711	b	b	-
+chr2	609689	609721	b	b	-
+chr2	609692	609724	b	b	-
+chr2	609725	609757	a	a	+
+chr2	609726	609758	a	a	+
+chr2	609726	609758	a	a	+
+chr2	609726	609758	a	a	+
+chr2	609726	609758	a	a	+
+chr2	609694	609726	b	b	-
+chr2	609695	609727	b	b	-
+chr2	609695	609727	b	b	-
+chr2	609703	609735	b	b	-
+chr2	609706	609738	b	b	-
+chr2	609739	609771	a	a	+
+chr2	609714	609746	b	b	-
+chr2	609714	609746	b	b	-
+chr2	609716	609748	b	b	-
+chr2	609769	609801	a	a	+
+chr2	609925	609957	b	b	-
+chr2	610032	610064	b	b	-
+chr2	610067	610099	b	b	-
+chr2	610077	610109	b	b	-
+chr2	610119	610151	a	a	+
+chr2	610098	610130	b	b	-
+chr2	610133	610165	a	a	+
+chr2	610133	610165	a	a	+
+chr2	610133	610165	a	a	+
+chr2	610138	610170	a	a	+
+chr2	610138	610170	a	a	+
+chr2	610138	610170	a	a	+
+chr2	610115	610147	b	b	-
+chr2	610173	610205	a	a	+
+chr2	610204	610236	a	a	+
+chr2	610300	610332	b	b	-
+chr2	610337	610369	a	a	+
+chr2	610346	610378	a	a	+
+chr2	610348	610380	a	a	+
+chr2	610400	610432	b	b	-
+chr2	610636	610668	b	b	-
+chr2	610985	611017	b	b	-
+chr2	610998	611030	b	b	-
+chr2	610998	611030	b	b	-
+chr2	610998	611030	b	b	-
+chr2	611187	611219	a	a	+
+chr2	611238	611270	b	b	-
+chr2	611339	611371	a	a	+
+chr2	611504	611536	a	a	+
+chr2	611518	611550	b	b	-
+chr2	611652	611684	b	b	-
+chr2	611733	611765	a	a	+
+chr2	611730	611762	b	b	-
+chr2	611741	611773	b	b	-
+chr2	611783	611815	a	a	+
+chr2	611790	611822	b	b	-
+chr2	611845	611877	a	a	+
+chr2	611845	611877	a	a	+
+chr2	611815	611847	b	b	-
+chr2	611818	611850	b	b	-
+chr2	611851	611883	a	a	+
+chr2	611856	611888	a	a	+
+chr2	611826	611858	b	b	-
+chr2	611826	611858	b	b	-
+chr2	611861	611893	a	a	+
+chr2	611861	611893	a	a	+
+chr2	611861	611893	a	a	+
+chr2	611861	611893	a	a	+
+chr2	611861	611893	a	a	+
+chr2	611861	611893	a	a	+
+chr2	611866	611898	a	a	+
+chr2	611872	611904	a	a	+
+chr2	611873	611905	a	a	+
+chr2	611842	611874	b	b	-
+chr2	611845	611877	b	b	-
+chr2	611907	611939	a	a	+
+chr2	611997	612029	a	a	+
+chr2	612007	612039	a	a	+
+chr2	612516	612548	b	b	-
+chr2	612649	612681	a	a	+
+chr2	612652	612684	a	a	+
+chr2	612723	612755	a	a	+
+chr2	612962	612994	b	b	-
+chr2	613192	613224	b	b	-
+chr2	613538	613570	b	b	-
+chr2	613606	613638	b	b	-
+chr2	614482	614514	a	a	+
+chr2	614637	614669	a	a	+
+chr2	614638	614670	a	a	+
+chr2	615002	615034	a	a	+
+chr2	615280	615312	b	b	-
+chr2	615320	615352	a	a	+
+chr2	615362	615394	a	a	+
+chr2	615393	615425	a	a	+
+chr2	615399	615431	b	b	-
+chr2	615452	615484	a	a	+
+chr2	615483	615515	b	b	-
+chr2	615777	615809	b	b	-
+chr2	615778	615810	b	b	-
+chr2	615811	615843	a	a	+
+chr2	615818	615850	a	a	+
+chr2	615818	615850	a	a	+
+chr2	615818	615850	a	a	+
+chr2	615786	615818	b	b	-
+chr2	615820	615852	a	a	+
+chr2	615820	615852	a	a	+
+chr2	615820	615852	a	a	+
+chr2	615821	615853	a	a	+
+chr2	615797	615829	b	b	-
+chr2	615838	615870	a	a	+
+chr2	616279	616311	a	a	+
+chr2	616960	616992	a	a	+
+chr2	616998	617030	a	a	+
+chr2	616998	617030	b	b	-
+chr2	617013	617045	b	b	-
+chr2	618318	618350	b	b	-
+chr2	618357	618389	a	a	+
+chr2	618364	618396	a	a	+
+chr2	618334	618366	b	b	-
+chr2	618376	618408	a	a	+
+chr2	618395	618427	b	b	-
+chr2	618395	618427	b	b	-
+chr2	618456	618488	b	b	-
+chr2	618456	618488	b	b	-
+chr2	618456	618488	b	b	-
+chr2	618456	618488	b	b	-
+chr2	618468	618500	b	b	-
+chr2	618469	618501	b	b	-
+chr2	618475	618507	b	b	-
+chr2	618516	618548	a	a	+
+chr2	618516	618548	a	a	+
+chr2	618516	618548	a	a	+
+chr2	618516	618548	a	a	+
+chr2	618517	618549	a	a	+
+chr2	618517	618549	a	a	+
+chr2	618517	618549	a	a	+
+chr2	618517	618549	a	a	+
+chr2	618517	618549	a	a	+
+chr2	618486	618518	b	b	-
+chr2	618520	618552	a	a	+
+chr2	618520	618552	a	a	+
+chr2	618520	618552	a	a	+
+chr2	618520	618552	a	a	+
+chr2	618494	618526	b	b	-
+chr2	618494	618526	b	b	-
+chr2	618494	618526	b	b	-
+chr2	618494	618526	b	b	-
+chr2	618494	618526	b	b	-
+chr2	618494	618526	b	b	-
+chr2	618494	618526	b	b	-
+chr2	618494	618526	b	b	-
+chr2	618494	618526	b	b	-
+chr2	618494	618526	b	b	-
+chr2	618495	618527	b	b	-
+chr2	618495	618527	b	b	-
+chr2	618495	618527	b	b	-
+chr2	618495	618527	b	b	-
+chr2	618528	618560	a	a	+
+chr2	618496	618528	b	b	-
+chr2	618496	618528	b	b	-
+chr2	618496	618528	b	b	-
+chr2	618496	618528	b	b	-
+chr2	618532	618564	a	a	+
+chr2	618532	618564	a	a	+
+chr2	618532	618564	a	a	+
+chr2	618533	618565	a	a	+
+chr2	618535	618567	a	a	+
+chr2	618504	618536	b	b	-
+chr2	618505	618537	b	b	-
+chr2	618505	618537	b	b	-
+chr2	618541	618573	a	a	+
+chr2	618512	618544	b	b	-
+chr2	618516	618548	b	b	-
+chr2	618551	618583	a	a	+
+chr2	618788	618820	b	b	-
+chr2	618835	618867	a	a	+
+chr2	618835	618867	a	a	+
+chr2	618836	618868	a	a	+
+chr2	618836	618868	a	a	+
+chr2	618838	618870	a	a	+
+chr2	618838	618870	a	a	+
+chr2	618838	618870	a	a	+
+chr2	618844	618876	a	a	+
+chr2	618845	618877	a	a	+
+chr2	618845	618877	a	a	+
+chr2	618845	618877	a	a	+
+chr2	618845	618877	a	a	+
+chr2	618845	618877	a	a	+
+chr2	618845	618877	a	a	+
+chr2	618845	618877	a	a	+
+chr2	618814	618846	b	b	-
+chr2	618814	618846	b	b	-
+chr2	618814	618846	b	b	-
+chr2	618847	618879	a	a	+
+chr2	618847	618879	a	a	+
+chr2	618815	618847	b	b	-
+chr2	618815	618847	b	b	-
+chr2	618816	618848	b	b	-
+chr2	618820	618852	b	b	-
+chr2	618820	618852	b	b	-
+chr2	618821	618853	b	b	-
+chr2	618856	618888	a	a	+
+chr2	618856	618888	a	a	+
+chr2	618856	618888	a	a	+
+chr2	618824	618856	b	b	-
+chr2	618857	618889	a	a	+
+chr2	618857	618889	a	a	+
+chr2	618826	618858	b	b	-
+chr2	618826	618858	b	b	-
+chr2	618831	618863	b	b	-
+chr2	618831	618863	b	b	-
+chr2	618833	618865	b	b	-
+chr2	618834	618866	b	b	-
+chr2	618836	618868	b	b	-
+chr2	618836	618868	b	b	-
+chr2	618836	618868	b	b	-
+chr2	618836	618868	b	b	-
+chr2	618836	618868	b	b	-
+chr2	618869	618901	a	a	+
+chr2	618870	618902	a	a	+
+chr2	618871	618903	a	a	+
+chr2	618882	618914	a	a	+
+chr2	618891	618923	a	a	+
+chr2	618884	618916	b	b	-
+chr2	618965	618997	b	b	-
+chr2	619006	619038	a	a	+
+chr2	619018	619050	a	a	+
+chr2	619020	619052	a	a	+
+chr2	619024	619056	a	a	+
+chr2	618995	619027	b	b	-
+chr2	619321	619353	a	a	+
+chr2	619717	619749	b	b	-
+chr2	619798	619830	a	a	+
+chr2	619834	619866	a	a	+
+chr2	620378	620410	a	a	+
+chr2	620386	620418	a	a	+
+chr2	620515	620547	b	b	-
+chr2	620662	620694	a	a	+
+chr2	620798	620830	b	b	-
+chr2	620835	620867	a	a	+
+chr2	620851	620883	a	a	+
+chr2	620851	620883	a	a	+
+chr2	620827	620859	b	b	-
+chr2	620830	620862	b	b	-
+chr2	620863	620895	a	a	+
+chr2	620863	620895	a	a	+
+chr2	620871	620903	a	a	+
+chr2	620873	620905	a	a	+
+chr2	620879	620911	a	a	+
+chr2	620921	620953	b	b	-
+chr2	620979	621011	a	a	+
+chr2	620955	620987	b	b	-
+chr2	620956	620988	b	b	-
+chr2	620996	621028	a	a	+
+chr2	620997	621029	a	a	+
+chr2	621011	621043	a	a	+
+chr2	621013	621045	a	a	+
+chr2	620985	621017	b	b	-
+chr2	620989	621021	b	b	-
+chr2	621137	621169	b	b	-
+chr2	621286	621318	b	b	-
+chr2	621336	621368	a	a	+
+chr2	621308	621340	b	b	-
+chr2	621324	621356	b	b	-
+chr2	621324	621356	b	b	-
+chr2	621506	621538	b	b	-
+chr2	623009	623041	b	b	-
+chr2	623009	623041	b	b	-
+chr2	623009	623041	b	b	-
+chr2	623035	623067	b	b	-
+chr2	623035	623067	b	b	-
+chr2	623085	623117	a	a	+
+chr2	623154	623186	b	b	-
+chr2	623165	623197	b	b	-
+chr2	623166	623198	b	b	-
+chr2	623204	623236	a	a	+
+chr2	623465	623497	a	a	+
+chr2	623470	623502	a	a	+
+chr2	623472	623504	a	a	+
+chr2	623447	623479	b	b	-
+chr2	623483	623515	a	a	+
+chr2	623452	623484	b	b	-
+chr2	623461	623493	b	b	-
+chr2	623464	623496	b	b	-
+chr2	623566	623598	b	b	-
+chr2	623596	623628	b	b	-
+chr2	623631	623663	a	a	+
+chr2	623600	623632	b	b	-
+chr2	623607	623639	b	b	-
+chr2	623608	623640	b	b	-
+chr2	623646	623678	a	a	+
+chr2	623614	623646	b	b	-
+chr2	623615	623647	b	b	-
+chr2	623649	623681	a	a	+
+chr2	623622	623654	b	b	-
+chr2	623622	623654	b	b	-
+chr2	623624	623656	b	b	-
+chr2	623657	623689	a	a	+
+chr2	623657	623689	a	a	+
+chr2	623633	623665	b	b	-
+chr2	623638	623670	b	b	-
+chr2	623826	623858	a	a	+
+chr2	623910	623942	b	b	-
+chr2	623943	623975	a	a	+
+chr2	623958	623990	a	a	+
+chr2	623977	624009	a	a	+
+chr2	624009	624041	a	a	+
+chr2	624117	624149	a	a	+
+chr2	624085	624117	b	b	-
+chr2	624100	624132	b	b	-
+chr2	624100	624132	b	b	-
+chr2	624133	624165	a	a	+
+chr2	624138	624170	a	a	+
+chr2	624141	624173	a	a	+
+chr2	624141	624173	a	a	+
+chr2	624281	624313	a	a	+
+chr2	624281	624313	a	a	+
+chr2	624281	624313	a	a	+
+chr2	624338	624370	a	a	+
+chr2	624463	624495	a	a	+
+chr2	624441	624473	b	b	-
+chr2	624441	624473	b	b	-
+chr2	624590	624622	a	a	+
+chr2	624596	624628	a	a	+
+chr2	624629	624661	a	a	+
+chr2	624599	624631	b	b	-
+chr2	624600	624632	b	b	-
+chr2	624644	624676	a	a	+
+chr2	624648	624680	a	a	+
+chr2	624618	624650	b	b	-
+chr2	624618	624650	b	b	-
+chr2	624655	624687	a	a	+
+chr2	624659	624691	a	a	+
+chr2	624659	624691	a	a	+
+chr2	624665	624697	a	a	+
+chr2	624672	624704	a	a	+
+chr2	624684	624716	a	a	+
+chr2	624697	624729	b	b	-
+chr2	624789	624821	b	b	-
+chr2	624831	624863	a	a	+
+chr2	624835	624867	a	a	+
+chr2	624862	624894	a	a	+
+chr2	624832	624864	b	b	-
+chr2	624867	624899	b	b	-
+chr2	624920	624952	a	a	+
+chr2	624909	624941	b	b	-
+chr2	624969	625001	a	a	+
+chr2	624996	625028	a	a	+
+chr2	625004	625036	b	b	-
+chr2	625004	625036	b	b	-
+chr2	625005	625037	b	b	-
+chr2	625020	625052	b	b	-
+chr2	625021	625053	b	b	-
+chr2	625022	625054	b	b	-
+chr2	625236	625268	b	b	-
+chr2	625291	625323	b	b	-
+chr2	625291	625323	b	b	-
+chr2	625291	625323	b	b	-
+chr2	625293	625325	b	b	-
+chr2	625326	625358	a	a	+
+chr2	625337	625369	a	a	+
+chr2	625317	625349	b	b	-
+chr2	625322	625354	b	b	-
+chr2	625322	625354	b	b	-
+chr2	625322	625354	b	b	-
+chr2	625355	625387	a	a	+
+chr2	625330	625362	b	b	-
+chr2	625365	625397	a	a	+
+chr2	625369	625401	a	a	+
+chr2	625371	625403	a	a	+
+chr2	625340	625372	b	b	-
+chr2	625373	625405	a	a	+
+chr2	625351	625383	b	b	-
+chr2	625356	625388	b	b	-
+chr2	625679	625711	a	a	+
+chr2	625693	625725	a	a	+
+chr2	625673	625705	b	b	-
+chr2	625673	625705	b	b	-
+chr2	625679	625711	b	b	-
+chr2	625701	625733	b	b	-
+chr2	625701	625733	b	b	-
+chr2	625701	625733	b	b	-
+chr2	625742	625774	a	a	+
+chr2	625711	625743	b	b	-
+chr2	625754	625786	a	a	+
+chr2	625754	625786	a	a	+
+chr2	625778	625810	a	a	+
+chr2	625758	625790	b	b	-
+chr2	625758	625790	b	b	-
+chr2	625887	625919	a	a	+
+chr2	625901	625933	a	a	+
+chr2	625909	625941	a	a	+
+chr2	626030	626062	a	a	+
+chr2	626003	626035	b	b	-
+chr2	626061	626093	a	a	+
+chr2	626107	626139	a	a	+
+chr2	626107	626139	a	a	+
+chr2	626179	626211	a	a	+
+chr2	626371	626403	b	b	-
+chr2	626707	626739	a	a	+
+chr2	626723	626755	a	a	+
+chr2	626835	626867	a	a	+
+chr2	626829	626861	b	b	-
+chr2	626893	626925	a	a	+
+chr2	626969	627001	a	a	+
+chr2	627033	627065	a	a	+
+chr2	627153	627185	b	b	-
+chr2	627203	627235	a	a	+
+chr2	627223	627255	b	b	-
+chr2	627232	627264	b	b	-
+chr2	627232	627264	b	b	-
+chr2	627285	627317	a	a	+
+chr2	627321	627353	b	b	-
+chr2	627479	627511	b	b	-
+chr2	627709	627741	a	a	+
+chr2	627871	627903	b	b	-
+chr2	627987	628019	b	b	-
+chr2	628030	628062	a	a	+
+chr2	628192	628224	b	b	-
+chr2	628746	628778	a	a	+
+chr2	628755	628787	a	a	+
+chr2	628836	628868	a	a	+
+chr2	628959	628991	b	b	-
+chr2	629106	629138	b	b	-
+chr2	629149	629181	a	a	+
+chr2	629136	629168	b	b	-
+chr2	629136	629168	b	b	-
+chr2	629142	629174	b	b	-
+chr2	629178	629210	a	a	+
+chr2	629146	629178	b	b	-
+chr2	629167	629199	b	b	-
+chr2	629207	629239	a	a	+
+chr2	629199	629231	b	b	-
+chr2	629330	629362	a	a	+
+chr2	629349	629381	a	a	+
+chr2	629373	629405	a	a	+
+chr2	629378	629410	a	a	+
+chr2	629399	629431	a	a	+
+chr2	629381	629413	b	b	-
+chr2	629390	629422	b	b	-
+chr2	629462	629494	a	a	+
+chr2	629500	629532	a	a	+
+chr2	629526	629558	a	a	+
+chr2	629547	629579	b	b	-
+chr2	629627	629659	a	a	+
+chr2	629627	629659	a	a	+
+chr2	629615	629647	b	b	-
+chr2	629630	629662	b	b	-
+chr2	629695	629727	a	a	+
+chr2	629701	629733	a	a	+
+chr2	629736	629768	a	a	+
+chr2	629755	629787	a	a	+
+chr2	629765	629797	a	a	+
+chr2	629766	629798	a	a	+
+chr2	629743	629775	b	b	-
+chr2	629787	629819	a	a	+
+chr2	629798	629830	a	a	+
+chr2	629771	629803	b	b	-
+chr2	629808	629840	a	a	+
+chr2	629793	629825	b	b	-
+chr2	629793	629825	b	b	-
+chr2	629796	629828	b	b	-
+chr2	629800	629832	b	b	-
+chr2	629872	629904	b	b	-
+chr2	629926	629958	a	a	+
+chr2	629914	629946	b	b	-
+chr2	629945	629977	b	b	-
+chr2	629945	629977	b	b	-
+chr2	629984	630016	a	a	+
+chr2	629952	629984	b	b	-
+chr2	629978	630010	b	b	-
+chr2	629981	630013	b	b	-
+chr2	630016	630048	a	a	+
+chr2	630017	630049	a	a	+
+chr2	630023	630055	a	a	+
+chr2	630025	630057	a	a	+
+chr2	630027	630059	a	a	+
+chr2	630034	630066	a	a	+
+chr2	630045	630077	a	a	+
+chr2	630046	630078	a	a	+
+chr2	630047	630079	a	a	+
+chr2	630015	630047	b	b	-
+chr2	630015	630047	b	b	-
+chr2	630015	630047	b	b	-
+chr2	630053	630085	a	a	+
+chr2	630071	630103	b	b	-
+chr2	630182	630214	a	a	+
+chr2	630159	630191	b	b	-
+chr2	630196	630228	a	a	+
+chr2	630196	630228	a	a	+
+chr2	630173	630205	b	b	-
+chr2	630173	630205	b	b	-
+chr2	630206	630238	a	a	+
+chr2	630174	630206	b	b	-
+chr2	630188	630220	b	b	-
+chr2	630222	630254	a	a	+
+chr2	630223	630255	a	a	+
+chr2	630251	630283	a	a	+
+chr2	630230	630262	b	b	-
+chr2	630293	630325	a	a	+
+chr2	630263	630295	b	b	-
+chr2	630317	630349	b	b	-
+chr2	630317	630349	b	b	-
+chr2	630351	630383	b	b	-
+chr2	630351	630383	b	b	-
+chr2	630393	630425	a	a	+
+chr2	630393	630425	a	a	+
+chr2	630393	630425	a	a	+
+chr2	630375	630407	b	b	-
+chr2	630380	630412	b	b	-
+chr2	630414	630446	b	b	-
+chr2	630414	630446	b	b	-
+chr2	630434	630466	b	b	-
+chr2	630507	630539	a	a	+
+chr2	630531	630563	a	a	+
+chr2	630544	630576	a	a	+
+chr2	630514	630546	b	b	-
+chr2	630616	630648	a	a	+
+chr2	630616	630648	a	a	+
+chr2	630599	630631	b	b	-
+chr2	630681	630713	b	b	-
+chr2	630720	630752	a	a	+
+chr2	630735	630767	a	a	+
+chr2	630736	630768	b	b	-
+chr2	630911	630943	a	a	+
+chr2	630889	630921	b	b	-
+chr2	630917	630949	b	b	-
+chr2	630968	631000	a	a	+
+chr2	630968	631000	a	a	+
+chr2	630985	631017	a	a	+
+chr2	631000	631032	a	a	+
+chr2	630969	631001	b	b	-
+chr2	631038	631070	b	b	-
+chr2	631056	631088	b	b	-
+chr2	631092	631124	a	a	+
+chr2	631100	631132	a	a	+
+chr2	631101	631133	a	a	+
+chr2	631103	631135	a	a	+
+chr2	631077	631109	b	b	-
+chr2	631077	631109	b	b	-
+chr2	631207	631239	b	b	-
+chr2	631226	631258	b	b	-
+chr2	631236	631268	b	b	-
+chr2	631435	631467	a	a	+
+chr2	631439	631471	a	a	+
+chr2	631439	631471	a	a	+
+chr2	631441	631473	a	a	+
+chr2	631413	631445	b	b	-
+chr2	631413	631445	b	b	-
+chr2	631414	631446	b	b	-
+chr2	631473	631505	a	a	+
+chr2	631486	631518	a	a	+
+chr2	631598	631630	a	a	+
+chr2	631609	631641	a	a	+
+chr2	631592	631624	b	b	-
+chr2	631603	631635	b	b	-
+chr2	631637	631669	a	a	+
+chr2	631619	631651	b	b	-
+chr2	631626	631658	b	b	-
+chr2	631683	631715	a	a	+
+chr2	631694	631726	a	a	+
+chr2	631737	631769	a	a	+
+chr2	631777	631809	a	a	+
+chr2	631777	631809	a	a	+
+chr2	631807	631839	a	a	+
+chr2	631868	631900	a	a	+
+chr2	631854	631886	b	b	-
+chr2	631893	631925	b	b	-
+chr2	631896	631928	b	b	-
+chr2	631933	631965	a	a	+
+chr2	631902	631934	b	b	-
+chr2	631902	631934	b	b	-
+chr2	631938	631970	a	a	+
+chr2	632167	632199	a	a	+
+chr2	632230	632262	a	a	+
+chr2	632306	632338	b	b	-
+chr2	632342	632374	a	a	+
+chr2	632357	632389	a	a	+
+chr2	632495	632527	b	b	-
+chr2	632575	632607	a	a	+
+chr2	632668	632700	a	a	+
+chr2	632696	632728	a	a	+
+chr2	632667	632699	b	b	-
+chr2	632719	632751	a	a	+
+chr2	632789	632821	b	b	-
+chr2	632792	632824	b	b	-
+chr2	632817	632849	b	b	-
+chr2	632831	632863	b	b	-
+chr2	632831	632863	b	b	-
+chr2	632834	632866	b	b	-
+chr2	632844	632876	b	b	-
+chr2	632879	632911	a	a	+
+chr2	632885	632917	b	b	-
+chr2	632915	632947	b	b	-
+chr2	633027	633059	a	a	+
+chr2	633028	633060	a	a	+
+chr2	633031	633063	a	a	+
+chr2	633031	633063	a	a	+
+chr2	633005	633037	b	b	-
+chr2	633006	633038	b	b	-
+chr2	633013	633045	b	b	-
+chr2	633013	633045	b	b	-
+chr2	633013	633045	b	b	-
+chr2	633046	633078	a	a	+
+chr2	633015	633047	b	b	-
+chr2	633192	633224	a	a	+
+chr2	633176	633208	b	b	-
+chr2	633177	633209	b	b	-
+chr2	633211	633243	a	a	+
+chr2	633182	633214	b	b	-
+chr2	633185	633217	b	b	-
+chr2	633237	633269	a	a	+
+chr2	633237	633269	a	a	+
+chr2	633309	633341	b	b	-
+chr2	633310	633342	b	b	-
+chr2	633346	633378	a	a	+
+chr2	633346	633378	a	a	+
+chr2	633319	633351	b	b	-
+chr2	633358	633390	a	a	+
+chr2	633358	633390	a	a	+
+chr2	633358	633390	a	a	+
+chr2	633358	633390	a	a	+
+chr2	633360	633392	a	a	+
+chr2	633360	633392	a	a	+
+chr2	633360	633392	a	a	+
+chr2	633328	633360	b	b	-
+chr2	633365	633397	a	a	+
+chr2	633366	633398	a	a	+
+chr2	633366	633398	a	a	+
+chr2	633366	633398	a	a	+
+chr2	633367	633399	a	a	+
+chr2	633367	633399	a	a	+
+chr2	633367	633399	a	a	+
+chr2	633367	633399	a	a	+
+chr2	633367	633399	a	a	+
+chr2	633367	633399	a	a	+
+chr2	633337	633369	b	b	-
+chr2	633337	633369	b	b	-
+chr2	633337	633369	b	b	-
+chr2	633337	633369	b	b	-
+chr2	633370	633402	a	a	+
+chr2	633370	633402	a	a	+
+chr2	633370	633402	a	a	+
+chr2	633338	633370	b	b	-
+chr2	633339	633371	b	b	-
+chr2	633372	633404	a	a	+
+chr2	633372	633404	a	a	+
+chr2	633373	633405	a	a	+
+chr2	633342	633374	b	b	-
+chr2	633343	633375	b	b	-
+chr2	633343	633375	b	b	-
+chr2	633343	633375	b	b	-
+chr2	633343	633375	b	b	-
+chr2	633377	633409	a	a	+
+chr2	633378	633410	a	a	+
+chr2	633346	633378	b	b	-
+chr2	633346	633378	b	b	-
+chr2	633346	633378	b	b	-
+chr2	633346	633378	b	b	-
+chr2	633379	633411	a	a	+
+chr2	633382	633414	a	a	+
+chr2	633382	633414	a	a	+
+chr2	633350	633382	b	b	-
+chr2	633350	633382	b	b	-
+chr2	633350	633382	b	b	-
+chr2	633351	633383	b	b	-
+chr2	633351	633383	b	b	-
+chr2	633351	633383	b	b	-
+chr2	633353	633385	b	b	-
+chr2	633356	633388	b	b	-
+chr2	633373	633405	b	b	-
+chr2	633420	633452	a	a	+
+chr2	633569	633601	a	a	+
+chr2	633595	633627	a	a	+
+chr2	633566	633598	b	b	-
+chr2	633612	633644	a	a	+
+chr2	633586	633618	b	b	-
+chr2	633586	633618	b	b	-
+chr2	633589	633621	b	b	-
+chr2	633592	633624	b	b	-
+chr2	633627	633659	a	a	+
+chr2	633627	633659	a	a	+
+chr2	633627	633659	a	a	+
+chr2	633627	633659	a	a	+
+chr2	633628	633660	a	a	+
+chr2	633628	633660	a	a	+
+chr2	633628	633660	a	a	+
+chr2	633629	633661	a	a	+
+chr2	633633	633665	a	a	+
+chr2	633635	633667	a	a	+
+chr2	633635	633667	a	a	+
+chr2	633635	633667	a	a	+
+chr2	633603	633635	b	b	-
+chr2	633605	633637	b	b	-
+chr2	633605	633637	b	b	-
+chr2	633638	633670	a	a	+
+chr2	633643	633675	a	a	+
+chr2	633651	633683	a	a	+
+chr2	633795	633827	a	a	+
+chr2	633795	633827	a	a	+
+chr2	633805	633837	a	a	+
+chr2	633778	633810	b	b	-
+chr2	633815	633847	a	a	+
+chr2	633821	633853	a	a	+
+chr2	633857	633889	a	a	+
+chr2	633967	633999	a	a	+
+chr2	633987	634019	a	a	+
+chr2	634398	634430	a	a	+
+chr2	634617	634649	b	b	-
+chr2	634653	634685	a	a	+
+chr2	634659	634691	a	a	+
+chr2	634817	634849	a	a	+
+chr2	634818	634850	a	a	+
+chr2	634821	634853	a	a	+
+chr2	634822	634854	a	a	+
+chr2	634829	634861	a	a	+
+chr2	634833	634865	a	a	+
+chr2	634833	634865	a	a	+
+chr2	634810	634842	b	b	-
+chr2	634844	634876	a	a	+
+chr2	634815	634847	b	b	-
+chr2	634851	634883	a	a	+
+chr2	634825	634857	b	b	-
+chr2	634861	634893	a	a	+
+chr2	635072	635104	b	b	-
+chr2	635105	635137	a	a	+
+chr2	635075	635107	b	b	-
+chr2	635075	635107	b	b	-
+chr2	635093	635125	b	b	-
+chr2	635093	635125	b	b	-
+chr2	635108	635140	b	b	-
+chr2	635240	635272	b	b	-
+chr2	635266	635298	b	b	-
+chr2	635273	635305	b	b	-
+chr2	635453	635485	a	a	+
+chr2	636667	636699	a	a	+
+chr2	636658	636690	b	b	-
+chr2	636906	636938	a	a	+
+chr2	636881	636913	b	b	-
+chr2	636900	636932	b	b	-
+chr2	636947	636979	a	a	+
+chr2	637008	637040	a	a	+
+chr2	637008	637040	a	a	+
+chr2	637045	637077	a	a	+
+chr2	637048	637080	a	a	+
+chr2	637048	637080	a	a	+
+chr2	637056	637088	a	a	+
+chr2	637192	637224	b	b	-
+chr2	637192	637224	b	b	-
+chr2	637249	637281	b	b	-
+chr2	637397	637429	a	a	+
+chr2	637970	638002	b	b	-
+chr2	638053	638085	a	a	+
+chr2	638070	638102	b	b	-
+chr2	638129	638161	a	a	+
+chr2	638827	638859	a	a	+
+chr2	638827	638859	a	a	+
+chr2	639195	639227	a	a	+
+chr2	639353	639385	a	a	+
+chr2	639571	639603	b	b	-
+chr2	639625	639657	a	a	+
+chr2	639856	639888	b	b	-
+chr2	640042	640074	a	a	+
+chr2	640594	640626	b	b	-
+chr2	640674	640706	b	b	-
+chr2	640789	640821	a	a	+
+chr2	641264	641296	b	b	-
+chr2	641557	641589	b	b	-
+chr2	641705	641737	a	a	+
+chr2	641759	641791	b	b	-
+chr2	641842	641874	b	b	-
+chr2	641870	641902	b	b	-
+chr2	641871	641903	b	b	-
+chr2	641871	641903	b	b	-
+chr2	641871	641903	b	b	-
+chr2	641910	641942	a	a	+
+chr2	641926	641958	a	a	+
+chr2	641895	641927	b	b	-
+chr2	641929	641961	a	a	+
+chr2	641908	641940	b	b	-
+chr2	641942	641974	a	a	+
+chr2	641964	641996	a	a	+
+chr2	642039	642071	b	b	-
+chr2	642088	642120	a	a	+
+chr2	642062	642094	b	b	-
+chr2	642331	642363	b	b	-
+chr2	642482	642514	b	b	-
+chr2	642558	642590	a	a	+
+chr2	642530	642562	b	b	-
+chr2	642579	642611	a	a	+
+chr2	642583	642615	a	a	+
+chr2	642583	642615	a	a	+
+chr2	642553	642585	b	b	-
+chr2	642557	642589	b	b	-
+chr2	642590	642622	a	a	+
+chr2	642562	642594	b	b	-
+chr2	642601	642633	a	a	+
+chr2	642570	642602	b	b	-
+chr2	642603	642635	a	a	+
+chr2	642603	642635	a	a	+
+chr2	642571	642603	b	b	-
+chr2	642571	642603	b	b	-
+chr2	642571	642603	b	b	-
+chr2	642571	642603	b	b	-
+chr2	642606	642638	a	a	+
+chr2	642606	642638	a	a	+
+chr2	642607	642639	a	a	+
+chr2	642577	642609	b	b	-
+chr2	642618	642650	a	a	+
+chr2	642619	642651	a	a	+
+chr2	642587	642619	b	b	-
+chr2	642587	642619	b	b	-
+chr2	642599	642631	b	b	-
+chr2	642884	642916	b	b	-
+chr2	643203	643235	a	a	+
+chr2	643219	643251	a	a	+
+chr2	643194	643226	b	b	-
+chr2	643238	643270	a	a	+
+chr2	643331	643363	a	a	+
+chr2	643331	643363	a	a	+
+chr2	643315	643347	b	b	-
+chr2	643384	643416	a	a	+
+chr2	643387	643419	a	a	+
+chr2	643371	643403	b	b	-
+chr2	643451	643483	a	a	+
+chr2	643513	643545	b	b	-
+chr2	643588	643620	a	a	+
+chr2	643588	643620	a	a	+
+chr2	643604	643636	a	a	+
+chr2	643579	643611	b	b	-
+chr2	643623	643655	a	a	+
+chr2	643598	643630	b	b	-
+chr2	643638	643670	a	a	+
+chr2	643638	643670	a	a	+
+chr2	643638	643670	a	a	+
+chr2	643639	643671	a	a	+
+chr2	643639	643671	a	a	+
+chr2	643623	643655	b	b	-
+chr2	643624	643656	b	b	-
+chr2	643628	643660	b	b	-
+chr2	643628	643660	b	b	-
+chr2	643666	643698	a	a	+
+chr2	643638	643670	b	b	-
+chr2	643678	643710	a	a	+
+chr2	643678	643710	a	a	+
+chr2	643678	643710	a	a	+
+chr2	643679	643711	a	a	+
+chr2	643647	643679	b	b	-
+chr2	643647	643679	b	b	-
+chr2	643681	643713	a	a	+
+chr2	643653	643685	b	b	-
+chr2	643655	643687	b	b	-
+chr2	643655	643687	b	b	-
+chr2	643658	643690	b	b	-
+chr2	643694	643726	a	a	+
+chr2	643663	643695	b	b	-
+chr2	643664	643696	b	b	-
+chr2	643664	643696	b	b	-
+chr2	643697	643729	a	a	+
+chr2	643698	643730	a	a	+
+chr2	643699	643731	a	a	+
+chr2	643699	643731	a	a	+
+chr2	643699	643731	a	a	+
+chr2	643668	643700	b	b	-
+chr2	643670	643702	b	b	-
+chr2	643670	643702	b	b	-
+chr2	643670	643702	b	b	-
+chr2	643670	643702	b	b	-
+chr2	643704	643736	a	a	+
+chr2	643704	643736	a	a	+
+chr2	643704	643736	a	a	+
+chr2	643704	643736	a	a	+
+chr2	643673	643705	b	b	-
+chr2	643673	643705	b	b	-
+chr2	643673	643705	b	b	-
+chr2	643706	643738	a	a	+
+chr2	643706	643738	a	a	+
+chr2	643706	643738	a	a	+
+chr2	643706	643738	a	a	+
+chr2	643674	643706	b	b	-
+chr2	643707	643739	a	a	+
+chr2	643707	643739	a	a	+
+chr2	643707	643739	a	a	+
+chr2	643707	643739	a	a	+
+chr2	643676	643708	b	b	-
+chr2	643676	643708	b	b	-
+chr2	643676	643708	b	b	-
+chr2	643677	643709	b	b	-
+chr2	643679	643711	b	b	-
+chr2	643679	643711	b	b	-
+chr2	643720	643752	a	a	+
+chr2	643722	643754	a	a	+
+chr2	643722	643754	a	a	+
+chr2	643690	643722	b	b	-
+chr2	643691	643723	b	b	-
+chr2	643695	643727	b	b	-
+chr2	643695	643727	b	b	-
+chr2	643695	643727	b	b	-
+chr2	643697	643729	b	b	-
+chr2	643732	643764	a	a	+
+chr2	643732	643764	a	a	+
+chr2	643732	643764	a	a	+
+chr2	643732	643764	a	a	+
+chr2	643735	643767	a	a	+
+chr2	643735	643767	a	a	+
+chr2	643739	643771	a	a	+
+chr2	643710	643742	b	b	-
+chr2	643743	643775	a	a	+
+chr2	643745	643777	a	a	+
+chr2	643753	643785	a	a	+
+chr2	643726	643758	b	b	-
+chr2	643759	643791	a	a	+
+chr2	643730	643762	b	b	-
+chr2	643768	643800	a	a	+
+chr2	643776	643808	a	a	+
+chr2	643745	643777	b	b	-
+chr2	643745	643777	b	b	-
+chr2	643748	643780	b	b	-
+chr2	643749	643781	b	b	-
+chr2	643749	643781	b	b	-
+chr2	643790	643822	a	a	+
+chr2	643802	643834	a	a	+
+chr2	643803	643835	a	a	+
+chr2	643807	643839	a	a	+
+chr2	643807	643839	a	a	+
+chr2	643807	643839	a	a	+
+chr2	643807	643839	a	a	+
+chr2	643811	643843	a	a	+
+chr2	643819	643851	a	a	+
+chr2	643829	643861	a	a	+
+chr2	643843	643875	a	a	+
+chr2	643843	643875	a	a	+
+chr2	644107	644139	a	a	+
+chr2	644107	644139	a	a	+
+chr2	644077	644109	b	b	-
+chr2	644132	644164	a	a	+
+chr2	644142	644174	b	b	-
+chr2	644142	644174	b	b	-
+chr2	644182	644214	a	a	+
+chr2	644150	644182	b	b	-
+chr2	644342	644374	a	a	+
+chr2	644313	644345	b	b	-
+chr2	644604	644636	b	b	-
+chr2	644648	644680	a	a	+
+chr2	644651	644683	a	a	+
+chr2	644633	644665	b	b	-
+chr2	644633	644665	b	b	-
+chr2	644634	644666	b	b	-
+chr2	644669	644701	a	a	+
+chr2	644645	644677	b	b	-
+chr2	644653	644685	b	b	-
+chr2	644751	644783	a	a	+
+chr2	644779	644811	a	a	+
+chr2	644758	644790	b	b	-
+chr2	644816	644848	a	a	+
+chr2	644786	644818	b	b	-
+chr2	644797	644829	b	b	-
+chr2	644799	644831	b	b	-
+chr2	644799	644831	b	b	-
+chr2	644799	644831	b	b	-
+chr2	644808	644840	b	b	-
+chr2	644938	644970	a	a	+
+chr2	644920	644952	b	b	-
+chr2	644922	644954	b	b	-
+chr2	644922	644954	b	b	-
+chr2	644957	644989	a	a	+
+chr2	644931	644963	b	b	-
+chr2	644934	644966	b	b	-
+chr2	644936	644968	b	b	-
+chr2	644953	644985	b	b	-
+chr2	644989	645021	a	a	+
+chr2	644989	645021	a	a	+
+chr2	644992	645024	a	a	+
+chr2	644965	644997	b	b	-
+chr2	645001	645033	a	a	+
+chr2	645001	645033	a	a	+
+chr2	644969	645001	b	b	-
+chr2	645002	645034	a	a	+
+chr2	645004	645036	a	a	+
+chr2	645004	645036	a	a	+
+chr2	644978	645010	b	b	-
+chr2	645016	645048	a	a	+
+chr2	644990	645022	b	b	-
+chr2	645033	645065	a	a	+
+chr2	645294	645326	b	b	-
+chr2	645306	645338	b	b	-
+chr2	645332	645364	b	b	-
+chr2	645370	645402	a	a	+
+chr2	645371	645403	a	a	+
+chr2	645371	645403	a	a	+
+chr2	645345	645377	b	b	-
+chr2	645386	645418	a	a	+
+chr2	645495	645527	b	b	-
+chr2	645533	645565	a	a	+
+chr2	645501	645533	b	b	-
+chr2	645502	645534	b	b	-
+chr2	645507	645539	b	b	-
+chr2	645541	645573	a	a	+
+chr2	645510	645542	b	b	-
+chr2	645543	645575	a	a	+
+chr2	645543	645575	a	a	+
+chr2	645512	645544	b	b	-
+chr2	645515	645547	b	b	-
+chr2	645550	645582	a	a	+
+chr2	645554	645586	a	a	+
+chr2	645555	645587	a	a	+
+chr2	645559	645591	a	a	+
+chr2	645540	645572	b	b	-
+chr2	645544	645576	b	b	-
+chr2	645597	645629	a	a	+
+chr2	645600	645632	a	a	+
+chr2	645604	645636	b	b	-
+chr2	645670	645702	b	b	-
+chr2	645685	645717	b	b	-
+chr2	645729	645761	a	a	+
+chr2	645755	645787	b	b	-
+chr2	645761	645793	b	b	-
+chr2	645763	645795	b	b	-
+chr2	645789	645821	b	b	-
+chr2	645828	645860	a	a	+
+chr2	645848	645880	a	a	+
+chr2	646370	646402	a	a	+
+chr2	646340	646372	b	b	-
+chr2	646995	647027	b	b	-
+chr2	647029	647061	a	a	+
+chr2	647016	647048	b	b	-
+chr2	647125	647157	b	b	-
+chr2	647139	647171	b	b	-
+chr2	647140	647172	b	b	-
+chr2	647140	647172	b	b	-
+chr2	647140	647172	b	b	-
+chr2	647175	647207	a	a	+
+chr2	647148	647180	b	b	-
+chr2	647184	647216	a	a	+
+chr2	647184	647216	a	a	+
+chr2	647152	647184	b	b	-
+chr2	647152	647184	b	b	-
+chr2	647185	647217	a	a	+
+chr2	647186	647218	a	a	+
+chr2	647186	647218	a	a	+
+chr2	647186	647218	a	a	+
+chr2	647186	647218	a	a	+
+chr2	647186	647218	a	a	+
+chr2	647188	647220	a	a	+
+chr2	647157	647189	b	b	-
+chr2	647157	647189	b	b	-
+chr2	647157	647189	b	b	-
+chr2	647157	647189	b	b	-
+chr2	647157	647189	b	b	-
+chr2	647158	647190	b	b	-
+chr2	647158	647190	b	b	-
+chr2	647161	647193	b	b	-
+chr2	647161	647193	b	b	-
+chr2	647161	647193	b	b	-
+chr2	647161	647193	b	b	-
+chr2	647194	647226	a	a	+
+chr2	647195	647227	a	a	+
+chr2	647195	647227	a	a	+
+chr2	647200	647232	a	a	+
+chr2	647201	647233	a	a	+
+chr2	647201	647233	a	a	+
+chr2	647201	647233	a	a	+
+chr2	647205	647237	a	a	+
+chr2	647175	647207	b	b	-
+chr2	647181	647213	b	b	-
+chr2	647220	647252	a	a	+
+chr2	647220	647252	a	a	+
+chr2	647240	647272	a	a	+
+chr2	647240	647272	a	a	+
+chr2	647240	647272	a	a	+
+chr2	647369	647401	b	b	-
+chr2	647486	647518	a	a	+
+chr2	647492	647524	a	a	+
+chr2	647497	647529	a	a	+
+chr2	647467	647499	b	b	-
+chr2	647467	647499	b	b	-
+chr2	647467	647499	b	b	-
+chr2	647468	647500	b	b	-
+chr2	647502	647534	a	a	+
+chr2	647502	647534	a	a	+
+chr2	647479	647511	b	b	-
+chr2	647479	647511	b	b	-
+chr2	647885	647917	a	a	+
+chr2	647863	647895	b	b	-
+chr2	647950	647982	b	b	-
+chr2	647957	647989	b	b	-
+chr2	647962	647994	b	b	-
+chr2	648038	648070	a	a	+
+chr2	648173	648205	a	a	+
+chr2	648203	648235	a	a	+
+chr2	648467	648499	a	a	+
+chr2	649060	649092	a	a	+
+chr2	649192	649224	a	a	+
+chr2	649491	649523	b	b	-
+chr2	649491	649523	b	b	-
+chr2	649545	649577	a	a	+
+chr2	649642	649674	a	a	+
+chr2	649834	649866	b	b	-
+chr2	650010	650042	b	b	-
+chr2	650237	650269	a	a	+
+chr2	650237	650269	a	a	+
+chr2	650240	650272	a	a	+
+chr2	650244	650276	a	a	+
+chr2	650244	650276	b	b	-
+chr2	650244	650276	b	b	-
+chr2	650285	650317	a	a	+
+chr2	650282	650314	b	b	-
+chr2	650300	650332	b	b	-
+chr2	650301	650333	b	b	-
+chr2	650301	650333	b	b	-
+chr2	650307	650339	b	b	-
+chr2	650341	650373	a	a	+
+chr2	650343	650375	a	a	+
+chr2	650353	650385	a	a	+
+chr2	650323	650355	b	b	-
+chr2	650333	650365	b	b	-
+chr2	650333	650365	b	b	-
+chr2	650338	650370	b	b	-
+chr2	650431	650463	a	a	+
+chr2	650470	650502	a	a	+
+chr2	650473	650505	a	a	+
+chr2	650450	650482	b	b	-
+chr2	650467	650499	b	b	-
+chr2	650467	650499	b	b	-
+chr2	650474	650506	b	b	-
+chr2	650632	650664	a	a	+
+chr2	650632	650664	a	a	+
+chr2	650646	650678	a	a	+
+chr2	650683	650715	a	a	+
+chr2	650690	650722	a	a	+
+chr2	650690	650722	a	a	+
+chr2	650806	650838	a	a	+
+chr2	650824	650856	b	b	-
+chr2	650875	650907	b	b	-
+chr2	650900	650932	b	b	-
+chr2	650935	650967	a	a	+
+chr2	651030	651062	a	a	+
+chr2	650998	651030	b	b	-
+chr2	651035	651067	a	a	+
+chr2	651040	651072	a	a	+
+chr2	651040	651072	a	a	+
+chr2	651072	651104	a	a	+
+chr2	651047	651079	b	b	-
+chr2	651047	651079	b	b	-
+chr2	651047	651079	b	b	-
+chr2	651047	651079	b	b	-
+chr2	651047	651079	b	b	-
+chr2	651047	651079	b	b	-
+chr2	651047	651079	b	b	-
+chr2	651047	651079	b	b	-
+chr2	651102	651134	a	a	+
+chr2	651079	651111	b	b	-
+chr2	651079	651111	b	b	-
+chr2	651079	651111	b	b	-
+chr2	651094	651126	b	b	-
+chr2	651316	651348	a	a	+
+chr2	651287	651319	b	b	-
+chr2	651335	651367	a	a	+
+chr2	651310	651342	b	b	-
+chr2	651347	651379	a	a	+
+chr2	651347	651379	a	a	+
+chr2	651347	651379	a	a	+
+chr2	651347	651379	a	a	+
+chr2	651353	651385	a	a	+
+chr2	651331	651363	b	b	-
+chr2	651365	651397	a	a	+
+chr2	651334	651366	b	b	-
+chr2	651334	651366	b	b	-
+chr2	651344	651376	b	b	-
+chr2	651344	651376	b	b	-
+chr2	651345	651377	b	b	-
+chr2	651345	651377	b	b	-
+chr2	651379	651411	a	a	+
+chr2	651382	651414	a	a	+
+chr2	651382	651414	a	a	+
+chr2	651353	651385	b	b	-
+chr2	651353	651385	b	b	-
+chr2	651483	651515	a	a	+
+chr2	651524	651556	a	a	+
+chr2	651496	651528	b	b	-
+chr2	651502	651534	b	b	-
+chr2	651539	651571	a	a	+
+chr2	651514	651546	b	b	-
+chr2	651612	651644	b	b	-
+chr2	651654	651686	b	b	-
+chr2	651718	651750	a	a	+
+chr2	651741	651773	b	b	-
+chr2	651782	651814	b	b	-
+chr2	651959	651991	b	b	-
+chr2	652177	652209	b	b	-
+chr2	652294	652326	a	a	+
+chr2	652381	652413	a	a	+
+chr2	652481	652513	a	a	+
+chr2	652562	652594	a	a	+
+chr2	652689	652721	a	a	+
+chr2	652713	652745	a	a	+
+chr2	652713	652745	a	a	+
+chr2	652723	652755	a	a	+
+chr2	652724	652756	a	a	+
+chr2	652724	652756	a	a	+
+chr2	652725	652757	a	a	+
+chr2	652736	652768	a	a	+
+chr2	652708	652740	b	b	-
+chr2	652710	652742	b	b	-
+chr2	652743	652775	a	a	+
+chr2	652711	652743	b	b	-
+chr2	652711	652743	b	b	-
+chr2	652724	652756	b	b	-
+chr2	652729	652761	b	b	-
+chr2	652810	652842	a	a	+
+chr2	652883	652915	b	b	-
+chr2	652893	652925	b	b	-
+chr2	652893	652925	b	b	-
+chr2	652899	652931	b	b	-
+chr2	652941	652973	a	a	+
+chr2	652931	652963	b	b	-
+chr2	653066	653098	a	a	+
+chr2	653290	653322	a	a	+
+chr2	653283	653315	b	b	-
+chr2	653326	653358	a	a	+
+chr2	653329	653361	a	a	+
+chr2	653330	653362	a	a	+
+chr2	653331	653363	a	a	+
+chr2	653337	653369	a	a	+
+chr2	653337	653369	a	a	+
+chr2	653337	653369	a	a	+
+chr2	653337	653369	a	a	+
+chr2	653337	653369	a	a	+
+chr2	653307	653339	b	b	-
+chr2	653308	653340	b	b	-
+chr2	653342	653374	a	a	+
+chr2	653313	653345	b	b	-
+chr2	653346	653378	a	a	+
+chr2	653314	653346	b	b	-
+chr2	653314	653346	b	b	-
+chr2	653348	653380	a	a	+
+chr2	653349	653381	a	a	+
+chr2	653349	653381	a	a	+
+chr2	653349	653381	a	a	+
+chr2	653349	653381	a	a	+
+chr2	653349	653381	a	a	+
+chr2	653318	653350	b	b	-
+chr2	653320	653352	b	b	-
+chr2	653320	653352	b	b	-
+chr2	653321	653353	b	b	-
+chr2	653321	653353	b	b	-
+chr2	653321	653353	b	b	-
+chr2	653321	653353	b	b	-
+chr2	653321	653353	b	b	-
+chr2	653322	653354	b	b	-
+chr2	653322	653354	b	b	-
+chr2	653322	653354	b	b	-
+chr2	653322	653354	b	b	-
+chr2	653323	653355	b	b	-
+chr2	653323	653355	b	b	-
+chr2	653323	653355	b	b	-
+chr2	653323	653355	b	b	-
+chr2	653323	653355	b	b	-
+chr2	653323	653355	b	b	-
+chr2	653323	653355	b	b	-
+chr2	653323	653355	b	b	-
+chr2	653326	653358	b	b	-
+chr2	653326	653358	b	b	-
+chr2	653326	653358	b	b	-
+chr2	653327	653359	b	b	-
+chr2	653360	653392	a	a	+
+chr2	653360	653392	a	a	+
+chr2	653361	653393	a	a	+
+chr2	653331	653363	b	b	-
+chr2	653331	653363	b	b	-
+chr2	653332	653364	b	b	-
+chr2	653366	653398	a	a	+
+chr2	653366	653398	a	a	+
+chr2	653371	653403	a	a	+
+chr2	653344	653376	b	b	-
+chr2	653345	653377	b	b	-
+chr2	653379	653411	a	a	+
+chr2	653413	653445	a	a	+
+chr2	653417	653449	a	a	+
+chr2	653472	653504	b	b	-
+chr2	653472	653504	b	b	-
+chr2	653474	653506	b	b	-
+chr2	653486	653518	b	b	-
+chr2	653497	653529	b	b	-
+chr2	653534	653566	a	a	+
+chr2	653536	653568	a	a	+
+chr2	653680	653712	a	a	+
+chr2	653694	653726	a	a	+
+chr2	653710	653742	a	a	+
+chr2	653695	653727	b	b	-
+chr2	653731	653763	a	a	+
+chr2	653740	653772	a	a	+
+chr2	653740	653772	a	a	+
+chr2	653762	653794	b	b	-
+chr2	654221	654253	b	b	-
+chr2	654535	654567	a	a	+
+chr2	655113	655145	b	b	-
+chr2	655994	656026	a	a	+
+chr2	656005	656037	a	a	+
+chr2	656022	656054	a	a	+
+chr2	656022	656054	a	a	+
+chr2	656049	656081	a	a	+
+chr2	656651	656683	a	a	+
+chr2	656741	656773	a	a	+
+chr2	656741	656773	a	a	+
+chr2	656741	656773	a	a	+
+chr2	656741	656773	a	a	+
+chr2	656741	656773	a	a	+
+chr2	656741	656773	a	a	+
+chr2	656941	656973	a	a	+
+chr2	657093	657125	a	a	+
+chr2	657182	657214	b	b	-
+chr2	657182	657214	b	b	-
+chr2	657182	657214	b	b	-
+chr2	657196	657228	b	b	-
+chr2	657203	657235	b	b	-
+chr2	657262	657294	a	a	+
+chr2	657233	657265	b	b	-
+chr2	657344	657376	b	b	-
+chr2	657357	657389	b	b	-
+chr2	657377	657409	b	b	-
+chr2	657415	657447	a	a	+
+chr2	657396	657428	b	b	-
+chr2	657526	657558	a	a	+
+chr2	657528	657560	a	a	+
+chr2	657545	657577	a	a	+
+chr2	657526	657558	b	b	-
+chr2	657533	657565	b	b	-
+chr2	657537	657569	b	b	-
+chr2	657541	657573	b	b	-
+chr2	657541	657573	b	b	-
+chr2	657580	657612	a	a	+
+chr2	657550	657582	b	b	-
+chr2	657583	657615	a	a	+
+chr2	657588	657620	a	a	+
+chr2	657591	657623	a	a	+
+chr2	657591	657623	a	a	+
+chr2	657567	657599	b	b	-
+chr2	657567	657599	b	b	-
+chr2	657567	657599	b	b	-
+chr2	657601	657633	a	a	+
+chr2	657575	657607	b	b	-
+chr2	657577	657609	b	b	-
+chr2	657623	657655	a	a	+
+chr2	657634	657666	b	b	-
+chr2	657801	657833	a	a	+
+chr2	657801	657833	a	a	+
+chr2	657770	657802	b	b	-
+chr2	657774	657806	b	b	-
+chr2	657777	657809	b	b	-
+chr2	657777	657809	b	b	-
+chr2	657814	657846	a	a	+
+chr2	657814	657846	a	a	+
+chr2	657784	657816	b	b	-
+chr2	657784	657816	b	b	-
+chr2	657822	657854	a	a	+
+chr2	657824	657856	a	a	+
+chr2	657824	657856	a	a	+
+chr2	657793	657825	b	b	-
+chr2	657793	657825	b	b	-
+chr2	657827	657859	a	a	+
+chr2	657828	657860	a	a	+
+chr2	657799	657831	b	b	-
+chr2	657799	657831	b	b	-
+chr2	657804	657836	b	b	-
+chr2	657804	657836	b	b	-
+chr2	657805	657837	b	b	-
+chr2	657849	657881	a	a	+
+chr2	657849	657881	a	a	+
+chr2	657851	657883	a	a	+
+chr2	657851	657883	a	a	+
+chr2	657851	657883	a	a	+
+chr2	657851	657883	a	a	+
+chr2	657851	657883	a	a	+
+chr2	657852	657884	a	a	+
+chr2	657855	657887	a	a	+
+chr2	657868	657900	a	a	+
+chr2	657960	657992	b	b	-
+chr2	657963	657995	b	b	-
+chr2	657998	658030	a	a	+
+chr2	657967	657999	b	b	-
+chr2	657967	657999	b	b	-
+chr2	657967	657999	b	b	-
+chr2	657984	658016	b	b	-
+chr2	658023	658055	a	a	+
+chr2	658034	658066	a	a	+
+chr2	658005	658037	b	b	-
+chr2	658014	658046	b	b	-
+chr2	658119	658151	b	b	-
+chr2	658156	658188	a	a	+
+chr2	658155	658187	b	b	-
+chr2	658289	658321	a	a	+
+chr2	658502	658534	a	a	+
+chr2	658513	658545	a	a	+
+chr2	658535	658567	a	a	+
+chr2	658519	658551	b	b	-
+chr2	658997	659029	a	a	+
+chr2	659343	659375	a	a	+
+chr2	659457	659489	b	b	-
+chr2	659538	659570	b	b	-
+chr2	659659	659691	b	b	-
+chr2	660135	660167	a	a	+
+chr2	660135	660167	b	b	-
+chr2	660530	660562	a	a	+
+chr2	660767	660799	b	b	-
+chr2	660866	660898	a	a	+
+chr2	660953	660985	a	a	+
+chr2	660937	660969	b	b	-
+chr2	660976	661008	b	b	-
+chr2	661053	661085	b	b	-
+chr2	661303	661335	b	b	-
+chr2	661400	661432	a	a	+
+chr2	661380	661412	b	b	-
+chr2	661419	661451	a	a	+
+chr2	661398	661430	b	b	-
+chr2	661476	661508	a	a	+
+chr2	661448	661480	b	b	-
+chr2	661560	661592	a	a	+
+chr2	661566	661598	a	a	+
+chr2	661586	661618	a	a	+
+chr2	661586	661618	a	a	+
+chr2	661590	661622	a	a	+
+chr2	661572	661604	b	b	-
+chr2	661607	661639	a	a	+
+chr2	661607	661639	a	a	+
+chr2	661608	661640	a	a	+
+chr2	661623	661655	a	a	+
+chr2	661594	661626	b	b	-
+chr2	661632	661664	a	a	+
+chr2	661605	661637	b	b	-
+chr2	661656	661688	a	a	+
+chr2	661625	661657	b	b	-
+chr2	661675	661707	a	a	+
+chr2	661681	661713	a	a	+
+chr2	661754	661786	a	a	+
+chr2	661725	661757	b	b	-
+chr2	661760	661792	a	a	+
+chr2	661761	661793	a	a	+
+chr2	661779	661811	b	b	-
+chr2	661812	661844	a	a	+
+chr2	661813	661845	a	a	+
+chr2	661795	661827	b	b	-
+chr2	661830	661862	a	a	+
+chr2	661805	661837	b	b	-
+chr2	661805	661837	b	b	-
+chr2	661844	661876	a	a	+
+chr2	661844	661876	a	a	+
+chr2	661813	661845	b	b	-
+chr2	661873	661905	a	a	+
+chr2	661877	661909	a	a	+
+chr2	661975	662007	b	b	-
+chr2	662028	662060	a	a	+
+chr2	662009	662041	b	b	-
+chr2	662052	662084	a	a	+
+chr2	662052	662084	a	a	+
+chr2	662053	662085	a	a	+
+chr2	662056	662088	a	a	+
+chr2	662056	662088	a	a	+
+chr2	662028	662060	b	b	-
+chr2	662058	662090	b	b	-
+chr2	662173	662205	a	a	+
+chr2	662145	662177	b	b	-
+chr2	662164	662196	b	b	-
+chr2	662164	662196	b	b	-
+chr2	662166	662198	b	b	-
+chr2	662214	662246	a	a	+
+chr2	662216	662248	a	a	+
+chr2	662219	662251	a	a	+
+chr2	662189	662221	b	b	-
+chr2	662217	662249	b	b	-
+chr2	662281	662313	a	a	+
+chr2	662356	662388	b	b	-
+chr2	662356	662388	b	b	-
+chr2	662433	662465	a	a	+
+chr2	662417	662449	b	b	-
+chr2	662886	662918	a	a	+
+chr2	662887	662919	a	a	+
+chr2	662890	662922	a	a	+
+chr2	662865	662897	b	b	-
+chr2	662871	662903	b	b	-
+chr2	662914	662946	a	a	+
+chr2	662916	662948	a	a	+
+chr2	662896	662928	b	b	-
+chr2	662930	662962	a	a	+
+chr2	662905	662937	b	b	-
+chr2	663049	663081	a	a	+
+chr2	663065	663097	a	a	+
+chr2	663054	663086	b	b	-
+chr2	663066	663098	b	b	-
+chr2	663103	663135	a	a	+
+chr2	663111	663143	a	a	+
+chr2	663111	663143	a	a	+
+chr2	663214	663246	a	a	+
+chr2	663227	663259	b	b	-
+chr2	663359	663391	b	b	-
+chr2	663378	663410	b	b	-
+chr2	663388	663420	b	b	-
+chr2	663388	663420	b	b	-
+chr2	663475	663507	b	b	-
+chr2	663542	663574	b	b	-
+chr2	663745	663777	b	b	-
+chr2	663902	663934	a	a	+
+chr2	664006	664038	b	b	-
+chr2	664159	664191	b	b	-
+chr2	664197	664229	a	a	+
+chr2	664326	664358	b	b	-
+chr2	664360	664392	a	a	+
+chr2	664495	664527	a	a	+
+chr2	664513	664545	a	a	+
+chr2	664492	664524	b	b	-
+chr2	664492	664524	b	b	-
+chr2	664526	664558	a	a	+
+chr2	664532	664564	a	a	+
+chr2	664537	664569	a	a	+
+chr2	664524	664556	b	b	-
+chr2	664606	664638	b	b	-
+chr2	664651	664683	a	a	+
+chr2	664657	664689	a	a	+
+chr2	664640	664672	b	b	-
+chr2	664640	664672	b	b	-
+chr2	664673	664705	a	a	+
+chr2	664677	664709	a	a	+
+chr2	664678	664710	a	a	+
+chr2	664679	664711	a	a	+
+chr2	664685	664717	a	a	+
+chr2	664687	664719	a	a	+
+chr2	664687	664719	a	a	+
+chr2	664691	664723	a	a	+
+chr2	664662	664694	b	b	-
+chr2	664662	664694	b	b	-
+chr2	664695	664727	a	a	+
+chr2	664696	664728	a	a	+
+chr2	664696	664728	a	a	+
+chr2	664696	664728	a	a	+
+chr2	664696	664728	a	a	+
+chr2	664696	664728	a	a	+
+chr2	664696	664728	a	a	+
+chr2	664664	664696	b	b	-
+chr2	664664	664696	b	b	-
+chr2	664702	664734	a	a	+
+chr2	664705	664737	a	a	+
+chr2	664705	664737	a	a	+
+chr2	664705	664737	a	a	+
+chr2	664673	664705	b	b	-
+chr2	664708	664740	a	a	+
+chr2	664712	664744	a	a	+
+chr2	664695	664727	b	b	-
+chr2	664731	664763	a	a	+
+chr2	664704	664736	b	b	-
+chr2	664756	664788	b	b	-
+chr2	664844	664876	a	a	+
+chr2	665154	665186	a	a	+
+chr2	665149	665181	b	b	-
+chr2	665305	665337	a	a	+
+chr2	665356	665388	b	b	-
+chr2	665356	665388	b	b	-
+chr2	665430	665462	b	b	-
+chr2	665576	665608	b	b	-
+chr2	665771	665803	a	a	+
+chr2	665893	665925	a	a	+
+chr2	666168	666200	b	b	-
+chr2	666168	666200	b	b	-
+chr2	666403	666435	a	a	+
+chr2	666403	666435	a	a	+
+chr2	666420	666452	a	a	+
+chr2	666420	666452	a	a	+
+chr2	666397	666429	b	b	-
+chr2	666400	666432	b	b	-
+chr2	666403	666435	b	b	-
+chr2	666405	666437	b	b	-
+chr2	666410	666442	b	b	-
+chr2	666689	666721	a	a	+
+chr2	666695	666727	a	a	+
+chr2	666671	666703	b	b	-
+chr2	666705	666737	a	a	+
+chr2	666705	666737	a	a	+
+chr2	666719	666751	a	a	+
+chr2	666687	666719	b	b	-
+chr2	666736	666768	a	a	+
+chr2	666802	666834	b	b	-
+chr2	666817	666849	b	b	-
+chr2	666853	666885	a	a	+
+chr2	667027	667059	a	a	+
+chr2	667028	667060	a	a	+
+chr2	667034	667066	b	b	-
+chr2	667189	667221	a	a	+
+chr2	667189	667221	a	a	+
+chr2	667189	667221	a	a	+
+chr2	667650	667682	b	b	-
+chr2	667833	667865	a	a	+
+chr2	667942	667974	a	a	+
+chr2	667925	667957	b	b	-
+chr2	668170	668202	b	b	-
+chr2	668170	668202	b	b	-
+chr2	668332	668364	a	a	+
+chr2	668313	668345	b	b	-
+chr2	668349	668381	a	a	+
+chr2	668350	668382	a	a	+
+chr2	668318	668350	b	b	-
+chr2	668351	668383	a	a	+
+chr2	668351	668383	a	a	+
+chr2	668351	668383	a	a	+
+chr2	668326	668358	b	b	-
+chr2	668326	668358	b	b	-
+chr2	668327	668359	b	b	-
+chr2	668328	668360	b	b	-
+chr2	668365	668397	a	a	+
+chr2	668344	668376	b	b	-
+chr2	668380	668412	a	a	+
+chr2	668547	668579	b	b	-
+chr2	668547	668579	b	b	-
+chr2	668594	668626	b	b	-
+chr2	668594	668626	b	b	-
+chr2	668594	668626	b	b	-
+chr2	668646	668678	a	a	+
+chr2	668632	668664	b	b	-
+chr2	668676	668708	b	b	-
+chr2	668676	668708	b	b	-
+chr2	668887	668919	a	a	+
+chr2	668903	668935	a	a	+
+chr2	668907	668939	a	a	+
+chr2	668909	668941	a	a	+
+chr2	668909	668941	a	a	+
+chr2	668881	668913	b	b	-
+chr2	668883	668915	b	b	-
+chr2	668887	668919	b	b	-
+chr2	668928	668960	a	a	+
+chr2	668928	668960	a	a	+
+chr2	668932	668964	a	a	+
+chr2	668932	668964	a	a	+
+chr2	668936	668968	a	a	+
+chr2	668915	668947	b	b	-
+chr2	668915	668947	b	b	-
+chr2	668915	668947	b	b	-
+chr2	668998	669030	b	b	-
+chr2	668998	669030	b	b	-
+chr2	669066	669098	a	a	+
+chr2	669066	669098	b	b	-
+chr2	669099	669131	a	a	+
+chr2	669178	669210	b	b	-
+chr2	669237	669269	b	b	-
+chr2	669281	669313	a	a	+
+chr2	669375	669407	b	b	-
+chr2	669751	669783	b	b	-
+chr2	669751	669783	b	b	-
+chr2	669751	669783	b	b	-
+chr2	669898	669930	a	a	+
+chr2	669898	669930	a	a	+
+chr2	669925	669957	a	a	+
+chr2	669901	669933	b	b	-
+chr2	669901	669933	b	b	-
+chr2	669914	669946	b	b	-
+chr2	669947	669979	a	a	+
+chr2	669948	669980	a	a	+
+chr2	670070	670102	a	a	+
+chr2	670053	670085	b	b	-
+chr2	670086	670118	a	a	+
+chr2	670058	670090	b	b	-
+chr2	670067	670099	b	b	-
+chr2	670101	670133	a	a	+
+chr2	670103	670135	a	a	+
+chr2	670110	670142	a	a	+
+chr2	670122	670154	a	a	+
+chr2	670209	670241	b	b	-
+chr2	670210	670242	b	b	-
+chr2	670210	670242	b	b	-
+chr2	670245	670277	a	a	+
+chr2	670217	670249	b	b	-
+chr2	670217	670249	b	b	-
+chr2	670218	670250	b	b	-
+chr2	670221	670253	b	b	-
+chr2	670258	670290	a	a	+
+chr2	670259	670291	a	a	+
+chr2	670259	670291	a	a	+
+chr2	670260	670292	a	a	+
+chr2	670260	670292	a	a	+
+chr2	670261	670293	a	a	+
+chr2	670263	670295	a	a	+
+chr2	670267	670299	a	a	+
+chr2	670267	670299	a	a	+
+chr2	670268	670300	a	a	+
+chr2	670268	670300	a	a	+
+chr2	670270	670302	a	a	+
+chr2	670239	670271	b	b	-
+chr2	670272	670304	a	a	+
+chr2	670243	670275	b	b	-
+chr2	670243	670275	b	b	-
+chr2	670277	670309	a	a	+
+chr2	670245	670277	b	b	-
+chr2	670246	670278	b	b	-
+chr2	670246	670278	b	b	-
+chr2	670246	670278	b	b	-
+chr2	670246	670278	b	b	-
+chr2	670279	670311	a	a	+
+chr2	670279	670311	a	a	+
+chr2	670247	670279	b	b	-
+chr2	670300	670332	a	a	+
+chr2	670474	670506	a	a	+
+chr2	670506	670538	a	a	+
+chr2	670511	670543	a	a	+
+chr2	670514	670546	a	a	+
+chr2	670520	670552	a	a	+
+chr2	670488	670520	b	b	-
+chr2	670523	670555	a	a	+
+chr2	670523	670555	a	a	+
+chr2	670491	670523	b	b	-
+chr2	670528	670560	a	a	+
+chr2	670507	670539	b	b	-
+chr2	670677	670709	b	b	-
+chr2	670677	670709	b	b	-
+chr2	670874	670906	a	a	+
+chr2	671002	671034	a	a	+
+chr2	671137	671169	b	b	-
+chr2	672769	672801	b	b	-
+chr2	672996	673028	a	a	+
+chr2	672988	673020	b	b	-
+chr2	673014	673046	b	b	-
+chr2	673743	673775	b	b	-
+chr2	673807	673839	a	a	+
+chr2	673802	673834	b	b	-
+chr2	674187	674219	a	a	+
+chr2	674267	674299	b	b	-
+chr2	674459	674491	a	a	+
+chr2	674595	674627	a	a	+
+chr2	674717	674749	a	a	+
+chr2	674779	674811	a	a	+
+chr2	674765	674797	b	b	-
+chr2	674765	674797	b	b	-
+chr2	674765	674797	b	b	-
+chr2	674801	674833	a	a	+
+chr2	674806	674838	a	a	+
+chr2	674781	674813	b	b	-
+chr2	674823	674855	a	a	+
+chr2	674999	675031	a	a	+
+chr2	675032	675064	b	b	-
+chr2	675040	675072	b	b	-
+chr2	675085	675117	a	a	+
+chr2	675107	675139	a	a	+
+chr2	675108	675140	a	a	+
+chr2	675081	675113	b	b	-
+chr2	675128	675160	a	a	+
+chr2	675128	675160	a	a	+
+chr2	675128	675160	a	a	+
+chr2	675096	675128	b	b	-
+chr2	675102	675134	b	b	-
+chr2	675102	675134	b	b	-
+chr2	675136	675168	a	a	+
+chr2	675137	675169	a	a	+
+chr2	675145	675177	a	a	+
+chr2	675146	675178	a	a	+
+chr2	675146	675178	a	a	+
+chr2	675146	675178	a	a	+
+chr2	675139	675171	b	b	-
+chr2	675178	675210	a	a	+
+chr2	675304	675336	b	b	-
+chr2	675357	675389	a	a	+
+chr2	675357	675389	a	a	+
+chr2	675369	675401	a	a	+
+chr2	675369	675401	a	a	+
+chr2	675370	675402	a	a	+
+chr2	675339	675371	b	b	-
+chr2	675339	675371	b	b	-
+chr2	675374	675406	a	a	+
+chr2	675374	675406	a	a	+
+chr2	675374	675406	a	a	+
+chr2	675348	675380	b	b	-
+chr2	675406	675438	a	a	+
+chr2	675423	675455	a	a	+
+chr2	675454	675486	b	b	-
+chr2	675462	675494	b	b	-
+chr2	675462	675494	b	b	-
+chr2	675510	675542	a	a	+
+chr2	675478	675510	b	b	-
+chr2	675491	675523	b	b	-
+chr2	675524	675556	a	a	+
+chr2	675499	675531	b	b	-
+chr2	675510	675542	b	b	-
+chr2	675511	675543	b	b	-
+chr2	675512	675544	b	b	-
+chr2	675580	675612	a	a	+
+chr2	675692	675724	a	a	+
+chr2	675825	675857	b	b	-
+chr2	676100	676132	b	b	-
+chr2	676166	676198	a	a	+
+chr2	676163	676195	b	b	-
+chr2	676226	676258	a	a	+
+chr2	676250	676282	a	a	+
+chr2	676311	676343	a	a	+
+chr2	676502	676534	a	a	+
+chr2	676613	676645	a	a	+
+chr2	677202	677234	b	b	-
+chr2	677257	677289	b	b	-
+chr2	677590	677622	a	a	+
+chr2	677919	677951	a	a	+
+chr2	677919	677951	a	a	+
+chr2	678360	678392	a	a	+
+chr2	678530	678562	a	a	+
+chr2	678646	678678	a	a	+
+chr2	678673	678705	a	a	+
+chr2	678685	678717	a	a	+
+chr2	678799	678831	a	a	+
+chr2	678795	678827	b	b	-
+chr2	678808	678840	b	b	-
+chr2	678847	678879	a	a	+
+chr2	678857	678889	a	a	+
+chr2	678879	678911	a	a	+
+chr2	678977	679009	b	b	-
+chr2	678977	679009	b	b	-
+chr2	679019	679051	a	a	+
+chr2	679019	679051	a	a	+
+chr2	679131	679163	b	b	-
+chr2	679171	679203	a	a	+
+chr2	679149	679181	b	b	-
+chr2	679182	679214	a	a	+
+chr2	679182	679214	a	a	+
+chr2	679183	679215	a	a	+
+chr2	679183	679215	a	a	+
+chr2	679183	679215	a	a	+
+chr2	679183	679215	a	a	+
+chr2	679183	679215	a	a	+
+chr2	679187	679219	a	a	+
+chr2	679188	679220	a	a	+
+chr2	679189	679221	a	a	+
+chr2	679190	679222	a	a	+
+chr2	679158	679190	b	b	-
+chr2	679158	679190	b	b	-
+chr2	679158	679190	b	b	-
+chr2	679158	679190	b	b	-
+chr2	679158	679190	b	b	-
+chr2	679191	679223	a	a	+
+chr2	679159	679191	b	b	-
+chr2	679159	679191	b	b	-
+chr2	679162	679194	b	b	-
+chr2	679197	679229	a	a	+
+chr2	679197	679229	a	a	+
+chr2	679165	679197	b	b	-
+chr2	679198	679230	a	a	+
+chr2	679198	679230	a	a	+
+chr2	679198	679230	a	a	+
+chr2	679198	679230	a	a	+
+chr2	679198	679230	a	a	+
+chr2	679166	679198	b	b	-
+chr2	679169	679201	b	b	-
+chr2	679169	679201	b	b	-
+chr2	679172	679204	b	b	-
+chr2	679172	679204	b	b	-
+chr2	679176	679208	b	b	-
+chr2	679176	679208	b	b	-
+chr2	679176	679208	b	b	-
+chr2	679176	679208	b	b	-
+chr2	679176	679208	b	b	-
+chr2	679176	679208	b	b	-
+chr2	679176	679208	b	b	-
+chr2	679176	679208	b	b	-
+chr2	679176	679208	b	b	-
+chr2	679176	679208	b	b	-
+chr2	679176	679208	b	b	-
+chr2	679176	679208	b	b	-
+chr2	679176	679208	b	b	-
+chr2	679176	679208	b	b	-
+chr2	679176	679208	b	b	-
+chr2	679179	679211	b	b	-
+chr2	679179	679211	b	b	-
+chr2	679179	679211	b	b	-
+chr2	679179	679211	b	b	-
+chr2	679180	679212	b	b	-
+chr2	679182	679214	b	b	-
+chr2	679215	679247	a	a	+
+chr2	679183	679215	b	b	-
+chr2	679216	679248	a	a	+
+chr2	679218	679250	a	a	+
+chr2	679220	679252	a	a	+
+chr2	679220	679252	a	a	+
+chr2	679220	679252	a	a	+
+chr2	679191	679223	b	b	-
+chr2	679217	679249	b	b	-
+chr2	679479	679511	a	a	+
+chr2	679483	679515	a	a	+
+chr2	679452	679484	b	b	-
+chr2	679452	679484	b	b	-
+chr2	679488	679520	a	a	+
+chr2	679488	679520	a	a	+
+chr2	679465	679497	b	b	-
+chr2	679470	679502	b	b	-
+chr2	679630	679662	a	a	+
+chr2	679649	679681	a	a	+
+chr2	679650	679682	a	a	+
+chr2	679659	679691	a	a	+
+chr2	679674	679706	a	a	+
+chr2	679650	679682	b	b	-
+chr2	679662	679694	b	b	-
+chr2	679715	679747	a	a	+
+chr2	679799	679831	a	a	+
+chr2	679799	679831	a	a	+
+chr2	679832	679864	a	a	+
+chr2	679801	679833	b	b	-
+chr2	679846	679878	a	a	+
+chr2	679826	679858	b	b	-
+chr2	679860	679892	a	a	+
+chr2	679834	679866	b	b	-
+chr2	679839	679871	b	b	-
+chr2	679873	679905	a	a	+
+chr2	679974	680006	b	b	-
+chr2	680024	680056	a	a	+
+chr2	680030	680062	a	a	+
+chr2	680034	680066	a	a	+
+chr2	680009	680041	b	b	-
+chr2	680042	680074	a	a	+
+chr2	680042	680074	a	a	+
+chr2	680010	680042	b	b	-
+chr2	680010	680042	b	b	-
+chr2	680010	680042	b	b	-
+chr2	680043	680075	a	a	+
+chr2	680047	680079	a	a	+
+chr2	680048	680080	a	a	+
+chr2	680019	680051	b	b	-
+chr2	680022	680054	b	b	-
+chr2	680022	680054	b	b	-
+chr2	680055	680087	a	a	+
+chr2	680055	680087	a	a	+
+chr2	680055	680087	a	a	+
+chr2	680032	680064	b	b	-
+chr2	680296	680328	a	a	+
+chr2	680320	680352	a	a	+
+chr2	680338	680370	a	a	+
+chr2	680340	680372	a	a	+
+chr2	680323	680355	b	b	-
+chr2	680356	680388	a	a	+
+chr2	680330	680362	b	b	-
+chr2	680330	680362	b	b	-
+chr2	680346	680378	b	b	-
+chr2	680369	680401	b	b	-
+chr2	680488	680520	a	a	+
+chr2	680530	680562	a	a	+
+chr2	680757	680789	a	a	+
+chr2	681106	681138	b	b	-
+chr2	681614	681646	a	a	+
+chr2	682167	682199	b	b	-
+chr2	682207	682239	a	a	+
+chr2	682184	682216	b	b	-
+chr2	682234	682266	a	a	+
+chr2	682208	682240	b	b	-
+chr2	682208	682240	b	b	-
+chr2	682208	682240	b	b	-
+chr2	682208	682240	b	b	-
+chr2	682208	682240	b	b	-
+chr2	682208	682240	b	b	-
+chr2	682244	682276	a	a	+
+chr2	682249	682281	a	a	+
+chr2	682250	682282	a	a	+
+chr2	682253	682285	a	a	+
+chr2	682237	682269	b	b	-
+chr2	682348	682380	b	b	-
+chr2	682398	682430	a	a	+
+chr2	682367	682399	b	b	-
+chr2	682419	682451	b	b	-
+chr2	682520	682552	b	b	-
+chr2	682572	682604	a	a	+
+chr2	682540	682572	b	b	-
+chr2	682577	682609	a	a	+
+chr2	682719	682751	a	a	+
+chr2	682896	682928	a	a	+
+chr2	682899	682931	a	a	+
+chr2	682900	682932	a	a	+
+chr2	682901	682933	a	a	+
+chr2	682901	682933	a	a	+
+chr2	682922	682954	a	a	+
+chr2	682895	682927	b	b	-
+chr2	682901	682933	b	b	-
+chr2	682907	682939	b	b	-
+chr2	682984	683016	b	b	-
+chr2	683012	683044	b	b	-
+chr2	683012	683044	b	b	-
+chr2	683064	683096	a	a	+
+chr2	683064	683096	a	a	+
+chr2	683066	683098	a	a	+
+chr2	683066	683098	a	a	+
+chr2	683034	683066	b	b	-
+chr2	683041	683073	b	b	-
+chr2	683041	683073	b	b	-
+chr2	683074	683106	a	a	+
+chr2	683085	683117	a	a	+
+chr2	683058	683090	b	b	-
+chr2	683098	683130	a	a	+
+chr2	683067	683099	b	b	-
+chr2	683126	683158	a	a	+
+chr2	683292	683324	a	a	+
+chr2	683283	683315	b	b	-
+chr2	683326	683358	a	a	+
+chr2	683334	683366	a	a	+
+chr2	683348	683380	a	a	+
+chr2	683353	683385	a	a	+
+chr2	683354	683386	a	a	+
+chr2	683356	683388	a	a	+
+chr2	683324	683356	b	b	-
+chr2	683335	683367	b	b	-
+chr2	683392	683424	a	a	+
+chr2	683398	683430	a	a	+
+chr2	683373	683405	b	b	-
+chr2	683373	683405	b	b	-
+chr2	683476	683508	b	b	-
+chr2	683480	683512	b	b	-
+chr2	683491	683523	b	b	-
+chr2	683498	683530	b	b	-
+chr2	683501	683533	b	b	-
+chr2	683501	683533	b	b	-
+chr2	683534	683566	a	a	+
+chr2	683534	683566	a	a	+
+chr2	683541	683573	a	a	+
+chr2	683510	683542	b	b	-
+chr2	683556	683588	b	b	-
+chr2	683556	683588	b	b	-
+chr2	683558	683590	b	b	-
+chr2	683641	683673	b	b	-
+chr2	683674	683706	b	b	-
+chr2	683823	683855	b	b	-
+chr2	683826	683858	b	b	-
+chr2	683830	683862	b	b	-
+chr2	683843	683875	b	b	-
+chr2	683947	683979	b	b	-
+chr2	683996	684028	b	b	-
+chr2	684349	684381	a	a	+
+chr2	684380	684412	a	a	+
+chr2	684413	684445	b	b	-
+chr2	684508	684540	a	a	+
+chr2	684559	684591	a	a	+
+chr2	684635	684667	b	b	-
+chr2	684913	684945	b	b	-
+chr2	684963	684995	a	a	+
+chr2	684972	685004	a	a	+
+chr2	684976	685008	a	a	+
+chr2	684977	685009	a	a	+
+chr2	684950	684982	b	b	-
+chr2	684951	684983	b	b	-
+chr2	684953	684985	b	b	-
+chr2	684953	684985	b	b	-
+chr2	684953	684985	b	b	-
+chr2	684953	684985	b	b	-
+chr2	684986	685018	a	a	+
+chr2	684986	685018	a	a	+
+chr2	684986	685018	a	a	+
+chr2	684956	684988	b	b	-
+chr2	684958	684990	b	b	-
+chr2	684992	685024	a	a	+
+chr2	684997	685029	a	a	+
+chr2	684998	685030	a	a	+
+chr2	684998	685030	a	a	+
+chr2	684998	685030	a	a	+
+chr2	684998	685030	a	a	+
+chr2	684966	684998	b	b	-
+chr2	684966	684998	b	b	-
+chr2	685004	685036	a	a	+
+chr2	685008	685040	a	a	+
+chr2	684976	685008	b	b	-
+chr2	684977	685009	b	b	-
+chr2	684985	685017	b	b	-
+chr2	684991	685023	b	b	-
+chr2	684991	685023	b	b	-
+chr2	685082	685114	a	a	+
+chr2	685117	685149	b	b	-
+chr2	685120	685152	b	b	-
+chr2	685121	685153	b	b	-
+chr2	685159	685191	a	a	+
+chr2	685159	685191	a	a	+
+chr2	685130	685162	b	b	-
+chr2	685130	685162	b	b	-
+chr2	685130	685162	b	b	-
+chr2	685131	685163	b	b	-
+chr2	685171	685203	a	a	+
+chr2	685173	685205	a	a	+
+chr2	685142	685174	b	b	-
+chr2	685190	685222	a	a	+
+chr2	685536	685568	a	a	+
+chr2	685733	685765	a	a	+
+chr2	685740	685772	a	a	+
+chr2	685890	685922	a	a	+
+chr2	686069	686101	a	a	+
+chr2	686059	686091	b	b	-
+chr2	686072	686104	b	b	-
+chr2	686262	686294	a	a	+
+chr2	686262	686294	a	a	+
+chr2	686397	686429	a	a	+
+chr2	686371	686403	b	b	-
+chr2	686372	686404	b	b	-
+chr2	686408	686440	a	a	+
+chr2	686462	686494	b	b	-
+chr2	686483	686515	b	b	-
+chr2	686503	686535	b	b	-
+chr2	686519	686551	b	b	-
+chr2	686553	686585	a	a	+
+chr2	686555	686587	a	a	+
+chr2	686527	686559	b	b	-
+chr2	686528	686560	b	b	-
+chr2	686528	686560	b	b	-
+chr2	686528	686560	b	b	-
+chr2	686528	686560	b	b	-
+chr2	686564	686596	a	a	+
+chr2	686565	686597	a	a	+
+chr2	686565	686597	a	a	+
+chr2	686565	686597	a	a	+
+chr2	686533	686565	b	b	-
+chr2	686536	686568	b	b	-
+chr2	686569	686601	a	a	+
+chr2	686570	686602	a	a	+
+chr2	686571	686603	a	a	+
+chr2	686571	686603	a	a	+
+chr2	686571	686603	a	a	+
+chr2	686572	686604	a	a	+
+chr2	686572	686604	a	a	+
+chr2	686540	686572	b	b	-
+chr2	686540	686572	b	b	-
+chr2	686540	686572	b	b	-
+chr2	686541	686573	b	b	-
+chr2	686574	686606	a	a	+
+chr2	686544	686576	b	b	-
+chr2	686544	686576	b	b	-
+chr2	686545	686577	b	b	-
+chr2	686581	686613	a	a	+
+chr2	686549	686581	b	b	-
+chr2	686549	686581	b	b	-
+chr2	686582	686614	a	a	+
+chr2	686582	686614	a	a	+
+chr2	686582	686614	a	a	+
+chr2	686552	686584	b	b	-
+chr2	686552	686584	b	b	-
+chr2	686585	686617	a	a	+
+chr2	686556	686588	b	b	-
+chr2	686556	686588	b	b	-
+chr2	686557	686589	b	b	-
+chr2	686558	686590	b	b	-
+chr2	686560	686592	b	b	-
+chr2	686563	686595	b	b	-
+chr2	686563	686595	b	b	-
+chr2	686563	686595	b	b	-
+chr2	686563	686595	b	b	-
+chr2	686597	686629	a	a	+
+chr2	686606	686638	a	a	+
+chr2	686574	686606	b	b	-
+chr2	686662	686694	a	a	+
+chr2	686768	686800	b	b	-
+chr2	686769	686801	b	b	-
+chr2	686805	686837	b	b	-
+chr2	686805	686837	b	b	-
+chr2	686842	686874	a	a	+
+chr2	686810	686842	b	b	-
+chr2	686846	686878	a	a	+
+chr2	686856	686888	a	a	+
+chr2	686826	686858	b	b	-
+chr2	686859	686891	a	a	+
+chr2	686859	686891	a	a	+
+chr2	686859	686891	a	a	+
+chr2	686859	686891	a	a	+
+chr2	686872	686904	a	a	+
+chr2	686872	686904	a	a	+
+chr2	686841	686873	b	b	-
+chr2	686842	686874	b	b	-
+chr2	686843	686875	b	b	-
+chr2	686877	686909	a	a	+
+chr2	686877	686909	a	a	+
+chr2	686853	686885	b	b	-
+chr2	686949	686981	a	a	+
+chr2	687022	687054	a	a	+
+chr2	686998	687030	b	b	-
+chr2	687041	687073	a	a	+
+chr2	687041	687073	a	a	+
+chr2	687041	687073	a	a	+
+chr2	687041	687073	a	a	+
+chr2	687041	687073	a	a	+
+chr2	687051	687083	a	a	+
+chr2	687344	687376	a	a	+
+chr2	687364	687396	a	a	+
+chr2	687365	687397	a	a	+
+chr2	687439	687471	a	a	+
+chr2	687439	687471	a	a	+
+chr2	687682	687714	a	a	+
+chr2	688789	688821	b	b	-
+chr2	689184	689216	a	a	+
+chr2	689153	689185	b	b	-
+chr2	689171	689203	b	b	-
+chr2	689249	689281	b	b	-
+chr2	689410	689442	a	a	+
+chr2	689445	689477	b	b	-
+chr2	689653	689685	b	b	-
+chr2	689961	689993	a	a	+
+chr2	689961	689993	a	a	+
+chr2	689983	690015	a	a	+
+chr2	690837	690869	a	a	+
+chr2	690997	691029	a	a	+
+chr2	690997	691029	a	a	+
+chr2	691003	691035	a	a	+
+chr2	691320	691352	a	a	+
+chr2	691354	691386	a	a	+
+chr2	691354	691386	a	a	+
+chr2	691354	691386	a	a	+
+chr2	691461	691493	b	b	-
+chr2	691511	691543	a	a	+
+chr2	691511	691543	a	a	+
+chr2	691482	691514	b	b	-
+chr2	691577	691609	b	b	-
+chr2	691604	691636	b	b	-
+chr2	691661	691693	a	a	+
+chr2	691661	691693	a	a	+
+chr2	691666	691698	a	a	+
+chr2	691634	691666	b	b	-
+chr2	691634	691666	b	b	-
+chr2	691634	691666	b	b	-
+chr2	691668	691700	a	a	+
+chr2	691636	691668	b	b	-
+chr2	691636	691668	b	b	-
+chr2	691636	691668	b	b	-
+chr2	691636	691668	b	b	-
+chr2	691636	691668	b	b	-
+chr2	691636	691668	b	b	-
+chr2	691636	691668	b	b	-
+chr2	691637	691669	b	b	-
+chr2	691670	691702	a	a	+
+chr2	691672	691704	a	a	+
+chr2	691672	691704	a	a	+
+chr2	691674	691706	a	a	+
+chr2	691645	691677	b	b	-
+chr2	691645	691677	b	b	-
+chr2	691681	691713	a	a	+
+chr2	691682	691714	a	a	+
+chr2	691682	691714	a	a	+
+chr2	691684	691716	a	a	+
+chr2	691652	691684	b	b	-
+chr2	691685	691717	a	a	+
+chr2	691685	691717	a	a	+
+chr2	691686	691718	a	a	+
+chr2	691654	691686	b	b	-
+chr2	691656	691688	b	b	-
+chr2	691656	691688	b	b	-
+chr2	691656	691688	b	b	-
+chr2	691656	691688	b	b	-
+chr2	691659	691691	b	b	-
+chr2	691659	691691	b	b	-
+chr2	691661	691693	b	b	-
+chr2	691694	691726	a	a	+
+chr2	691662	691694	b	b	-
+chr2	691696	691728	a	a	+
+chr2	691696	691728	a	a	+
+chr2	691667	691699	b	b	-
+chr2	691686	691718	b	b	-
+chr2	691687	691719	b	b	-
+chr2	691954	691986	a	a	+
+chr2	691955	691987	a	a	+
+chr2	691956	691988	a	a	+
+chr2	691956	691988	a	a	+
+chr2	691956	691988	a	a	+
+chr2	691956	691988	a	a	+
+chr2	691956	691988	a	a	+
+chr2	691956	691988	a	a	+
+chr2	691956	691988	a	a	+
+chr2	691958	691990	a	a	+
+chr2	691926	691958	b	b	-
+chr2	691930	691962	b	b	-
+chr2	691930	691962	b	b	-
+chr2	691930	691962	b	b	-
+chr2	691973	692005	a	a	+
+chr2	691973	692005	a	a	+
+chr2	691975	692007	a	a	+
+chr2	691975	692007	a	a	+
+chr2	691976	692008	a	a	+
+chr2	691991	692023	a	a	+
+chr2	691994	692026	a	a	+
+chr2	691968	692000	b	b	-
+chr2	692116	692148	a	a	+
+chr2	692125	692157	a	a	+
+chr2	692126	692158	a	a	+
+chr2	692096	692128	b	b	-
+chr2	692137	692169	a	a	+
+chr2	692137	692169	a	a	+
+chr2	692112	692144	b	b	-
+chr2	692281	692313	a	a	+
+chr2	692291	692323	a	a	+
+chr2	692291	692323	a	a	+
+chr2	692298	692330	a	a	+
+chr2	692565	692597	b	b	-
+chr2	692703	692735	b	b	-
+chr2	692742	692774	b	b	-
+chr2	692927	692959	a	a	+
+chr2	692927	692959	a	a	+
+chr2	693069	693101	b	b	-
+chr2	693159	693191	b	b	-
+chr2	693276	693308	a	a	+
+chr2	693250	693282	b	b	-
+chr2	693557	693589	a	a	+
+chr2	693557	693589	a	a	+
+chr2	693733	693765	b	b	-
+chr2	694128	694160	b	b	-
+chr2	694258	694290	b	b	-
+chr2	695169	695201	a	a	+
+chr2	695912	695944	b	b	-
+chr2	696031	696063	a	a	+
+chr2	696786	696818	b	b	-
+chr2	697027	697059	a	a	+
+chr2	697181	697213	b	b	-
+chr2	697256	697288	a	a	+
+chr2	697256	697288	a	a	+
+chr2	697256	697288	a	a	+
+chr2	697323	697355	a	a	+
+chr2	697384	697416	b	b	-
+chr2	697858	697890	a	a	+
+chr2	697881	697913	a	a	+
+chr2	697869	697901	b	b	-
+chr2	697869	697901	b	b	-
+chr2	697902	697934	a	a	+
+chr2	697902	697934	a	a	+
+chr2	697881	697913	b	b	-
+chr2	697881	697913	b	b	-
+chr2	697881	697913	b	b	-
+chr2	697921	697953	a	a	+
+chr2	697921	697953	a	a	+
+chr2	697891	697923	b	b	-
+chr2	697924	697956	a	a	+
+chr2	697904	697936	b	b	-
+chr2	697904	697936	b	b	-
+chr2	697904	697936	b	b	-
+chr2	697904	697936	b	b	-
+chr2	697958	697990	b	b	-
+chr2	697958	697990	b	b	-
+chr2	698087	698119	a	a	+
+chr2	698076	698108	b	b	-
+chr2	698145	698177	a	a	+
+chr2	698147	698179	a	a	+
+chr2	698149	698181	a	a	+
+chr2	698150	698182	a	a	+
+chr2	698155	698187	a	a	+
+chr2	698123	698155	b	b	-
+chr2	698159	698191	a	a	+
+chr2	698171	698203	a	a	+
+chr2	698146	698178	b	b	-
+chr2	698151	698183	b	b	-
+chr2	698160	698192	b	b	-
+chr2	698196	698228	a	a	+
+chr2	698196	698228	a	a	+
+chr2	698175	698207	b	b	-
+chr2	698400	698432	b	b	-
+chr2	698452	698484	b	b	-
+chr2	698631	698663	a	a	+
+chr2	698870	698902	a	a	+
+chr2	698893	698925	b	b	-
+chr2	698926	698958	b	b	-
+chr2	699012	699044	a	a	+
+chr2	699183	699215	b	b	-
+chr2	699184	699216	b	b	-
+chr2	699355	699387	a	a	+
+chr2	699343	699375	b	b	-
+chr2	699402	699434	a	a	+
+chr2	699625	699657	a	a	+
+chr2	699653	699685	a	a	+
+chr2	699672	699704	a	a	+
+chr2	699672	699704	a	a	+
+chr2	699653	699685	b	b	-
+chr2	699653	699685	b	b	-
+chr2	699653	699685	b	b	-
+chr2	699655	699687	b	b	-
+chr2	699701	699733	a	a	+
+chr2	699701	699733	a	a	+
+chr2	699802	699834	b	b	-
+chr2	699864	699896	a	a	+
+chr2	699838	699870	b	b	-
+chr2	699871	699903	a	a	+
+chr2	699872	699904	a	a	+
+chr2	699877	699909	a	a	+
+chr2	699850	699882	b	b	-
+chr2	699854	699886	b	b	-
+chr2	699977	700009	b	b	-
+chr2	699980	700012	b	b	-
+chr2	699982	700014	b	b	-
+chr2	699985	700017	b	b	-
+chr2	699987	700019	b	b	-
+chr2	699990	700022	b	b	-
+chr2	699991	700023	b	b	-
+chr2	699998	700030	b	b	-
+chr2	699999	700031	b	b	-
+chr2	700000	700032	b	b	-
+chr2	700035	700067	a	a	+
+chr2	700035	700067	a	a	+
+chr2	700035	700067	a	a	+
+chr2	700004	700036	b	b	-
+chr2	700004	700036	b	b	-
+chr2	700004	700036	b	b	-
+chr2	700004	700036	b	b	-
+chr2	700006	700038	b	b	-
+chr2	700006	700038	b	b	-
+chr2	700042	700074	a	a	+
+chr2	700042	700074	a	a	+
+chr2	700042	700074	a	a	+
+chr2	700010	700042	b	b	-
+chr2	700043	700075	a	a	+
+chr2	700043	700075	a	a	+
+chr2	700044	700076	a	a	+
+chr2	700044	700076	a	a	+
+chr2	700013	700045	b	b	-
+chr2	700024	700056	b	b	-
+chr2	700294	700326	a	a	+
+chr2	700308	700340	a	a	+
+chr2	700315	700347	a	a	+
+chr2	700319	700351	a	a	+
+chr2	700304	700336	b	b	-
+chr2	700401	700433	b	b	-
+chr2	700475	700507	a	a	+
+chr2	700451	700483	b	b	-
+chr2	700486	700518	a	a	+
+chr2	700487	700519	a	a	+
+chr2	700457	700489	b	b	-
+chr2	700457	700489	b	b	-
+chr2	700461	700493	b	b	-
+chr2	700497	700529	a	a	+
+chr2	700497	700529	a	a	+
+chr2	700497	700529	a	a	+
+chr2	700497	700529	a	a	+
+chr2	700498	700530	a	a	+
+chr2	700498	700530	a	a	+
+chr2	700469	700501	b	b	-
+chr2	700473	700505	b	b	-
+chr2	700473	700505	b	b	-
+chr2	700507	700539	a	a	+
+chr2	700481	700513	b	b	-
+chr2	700482	700514	b	b	-
+chr2	700488	700520	b	b	-
+chr2	700577	700609	a	a	+
+chr2	700584	700616	a	a	+
+chr2	700602	700634	b	b	-
+chr2	700643	700675	a	a	+
+chr2	700643	700675	a	a	+
+chr2	700647	700679	a	a	+
+chr2	700616	700648	b	b	-
+chr2	700632	700664	b	b	-
+chr2	700632	700664	b	b	-
+chr2	700667	700699	a	a	+
+chr2	700639	700671	b	b	-
+chr2	700643	700675	b	b	-
+chr2	700649	700681	b	b	-
+chr2	700650	700682	b	b	-
+chr2	700684	700716	a	a	+
+chr2	700656	700688	b	b	-
+chr2	700795	700827	a	a	+
+chr2	700794	700826	b	b	-
+chr2	700794	700826	b	b	-
+chr2	700839	700871	a	a	+
+chr2	700818	700850	b	b	-
+chr2	700851	700883	a	a	+
+chr2	700858	700890	a	a	+
+chr2	700837	700869	b	b	-
+chr2	700837	700869	b	b	-
+chr2	700894	700926	a	a	+
+chr2	700932	700964	a	a	+
+chr2	700955	700987	a	a	+
+chr2	700960	700992	a	a	+
+chr2	700977	701009	a	a	+
+chr2	700945	700977	b	b	-
+chr2	700945	700977	b	b	-
+chr2	700945	700977	b	b	-
+chr2	700945	700977	b	b	-
+chr2	701002	701034	a	a	+
+chr2	700974	701006	b	b	-
+chr2	700995	701027	b	b	-
+chr2	700999	701031	b	b	-
+chr2	700999	701031	b	b	-
+chr2	701043	701075	a	a	+
+chr2	701052	701084	a	a	+
+chr2	701097	701129	a	a	+
+chr2	701097	701129	a	a	+
+chr2	701097	701129	a	a	+
+chr2	701097	701129	a	a	+
+chr2	701074	701106	b	b	-
+chr2	701075	701107	b	b	-
+chr2	701114	701146	a	a	+
+chr2	701114	701146	a	a	+
+chr2	701098	701130	b	b	-
+chr2	701103	701135	b	b	-
+chr2	701105	701137	b	b	-
+chr2	701106	701138	b	b	-
+chr2	701112	701144	b	b	-
+chr2	701118	701150	b	b	-
+chr2	701138	701170	b	b	-
+chr2	701141	701173	b	b	-
+chr2	701174	701206	a	a	+
+chr2	701184	701216	a	a	+
+chr2	701184	701216	a	a	+
+chr2	701161	701193	b	b	-
+chr2	701169	701201	b	b	-
+chr2	701185	701217	b	b	-
+chr2	701186	701218	b	b	-
+chr2	701186	701218	b	b	-
+chr2	701195	701227	b	b	-
+chr2	701200	701232	b	b	-
+chr2	701204	701236	b	b	-
+chr2	701212	701244	b	b	-
+chr2	701232	701264	b	b	-
+chr2	701287	701319	a	a	+
+chr2	701296	701328	a	a	+
+chr2	701329	701361	a	a	+
+chr2	701349	701381	a	a	+
+chr2	701349	701381	a	a	+
+chr2	701349	701381	a	a	+
+chr2	701349	701381	a	a	+
+chr2	701377	701409	b	b	-
+chr2	701403	701435	b	b	-
+chr2	701403	701435	b	b	-
+chr2	701409	701441	b	b	-
+chr2	701422	701454	b	b	-
+chr2	701457	701489	a	a	+
+chr2	701435	701467	b	b	-
+chr2	701439	701471	b	b	-
+chr2	701439	701471	b	b	-
+chr2	701477	701509	a	a	+
+chr2	701458	701490	b	b	-
+chr2	701506	701538	a	a	+
+chr2	701575	701607	b	b	-
+chr2	701611	701643	a	a	+
+chr2	701620	701652	a	a	+
+chr2	701594	701626	b	b	-
+chr2	701628	701660	a	a	+
+chr2	701628	701660	a	a	+
+chr2	701655	701687	a	a	+
+chr2	701655	701687	a	a	+
+chr2	701737	701769	b	b	-
+chr2	701748	701780	b	b	-
+chr2	701748	701780	b	b	-
+chr2	701749	701781	b	b	-
+chr2	701784	701816	a	a	+
+chr2	701760	701792	b	b	-
+chr2	701762	701794	b	b	-
+chr2	701796	701828	a	a	+
+chr2	701764	701796	b	b	-
+chr2	701802	701834	a	a	+
+chr2	701802	701834	a	a	+
+chr2	701811	701843	a	a	+
+chr2	701785	701817	b	b	-
+chr2	701959	701991	a	a	+
+chr2	701959	701991	a	a	+
+chr2	702084	702116	b	b	-
+chr2	702084	702116	b	b	-
+chr2	702084	702116	b	b	-
+chr2	702120	702152	a	a	+
+chr2	702120	702152	a	a	+
+chr2	702121	702153	a	a	+
+chr2	702121	702153	a	a	+
+chr2	702122	702154	a	a	+
+chr2	702122	702154	a	a	+
+chr2	702122	702154	a	a	+
+chr2	702122	702154	a	a	+
+chr2	702122	702154	a	a	+
+chr2	702122	702154	a	a	+
+chr2	702123	702155	a	a	+
+chr2	702123	702155	a	a	+
+chr2	702092	702124	b	b	-
+chr2	702092	702124	b	b	-
+chr2	702092	702124	b	b	-
+chr2	702093	702125	b	b	-
+chr2	702096	702128	b	b	-
+chr2	702099	702131	b	b	-
+chr2	702099	702131	b	b	-
+chr2	702135	702167	a	a	+
+chr2	702135	702167	a	a	+
+chr2	702135	702167	a	a	+
+chr2	702135	702167	a	a	+
+chr2	702135	702167	a	a	+
+chr2	702135	702167	a	a	+
+chr2	702108	702140	b	b	-
+chr2	702146	702178	a	a	+
+chr2	702146	702178	a	a	+
+chr2	702148	702180	a	a	+
+chr2	702120	702152	b	b	-
+chr2	702121	702153	b	b	-
+chr2	702121	702153	b	b	-
+chr2	702121	702153	b	b	-
+chr2	702154	702186	a	a	+
+chr2	702126	702158	b	b	-
+chr2	702161	702193	a	a	+
+chr2	702163	702195	a	a	+
+chr2	702163	702195	a	a	+
+chr2	702163	702195	a	a	+
+chr2	702175	702207	a	a	+
+chr2	702177	702209	a	a	+
+chr2	702177	702209	a	a	+
+chr2	702147	702179	b	b	-
+chr2	702147	702179	b	b	-
+chr2	702157	702189	b	b	-
+chr2	702158	702190	b	b	-
+chr2	702168	702200	b	b	-
+chr2	702229	702261	a	a	+
+chr2	702458	702490	a	a	+
+chr2	702584	702616	b	b	-
+chr2	702642	702674	a	a	+
+chr2	702616	702648	b	b	-
+chr2	702627	702659	b	b	-
+chr2	702658	702690	b	b	-
+chr2	702773	702805	b	b	-
+chr2	702931	702963	b	b	-
+chr2	703112	703144	a	a	+
+chr2	703153	703185	b	b	-
+chr2	703168	703200	b	b	-
+chr2	703271	703303	a	a	+
+chr2	703239	703271	b	b	-
+chr2	703296	703328	a	a	+
+chr2	703304	703336	a	a	+
+chr2	703285	703317	b	b	-
+chr2	703366	703398	a	a	+
+chr2	703454	703486	b	b	-
+chr2	703489	703521	a	a	+
+chr2	703489	703521	a	a	+
+chr2	703530	703562	a	a	+
+chr2	703514	703546	b	b	-
+chr2	703593	703625	a	a	+
+chr2	703593	703625	a	a	+
+chr2	703578	703610	b	b	-
+chr2	703590	703622	b	b	-
+chr2	703610	703642	b	b	-
+chr2	703612	703644	b	b	-
+chr2	703658	703690	a	a	+
+chr2	703627	703659	b	b	-
+chr2	703646	703678	b	b	-
+chr2	703646	703678	b	b	-
+chr2	703700	703732	b	b	-
+chr2	703774	703806	a	a	+
+chr2	703778	703810	a	a	+
+chr2	703828	703860	a	a	+
+chr2	703828	703860	a	a	+
+chr2	703873	703905	a	a	+
+chr2	703848	703880	b	b	-
+chr2	703895	703927	b	b	-
+chr2	703975	704007	a	a	+
+chr2	703995	704027	a	a	+
+chr2	703976	704008	b	b	-
+chr2	703976	704008	b	b	-
+chr2	703976	704008	b	b	-
+chr2	703976	704008	b	b	-
+chr2	704014	704046	a	a	+
+chr2	704039	704071	a	a	+
+chr2	704055	704087	a	a	+
+chr2	704065	704097	a	a	+
+chr2	704067	704099	a	a	+
+chr2	704035	704067	b	b	-
+chr2	704068	704100	a	a	+
+chr2	704070	704102	a	a	+
+chr2	704051	704083	b	b	-
+chr2	704060	704092	b	b	-
+chr2	704209	704241	a	a	+
+chr2	704231	704263	a	a	+
+chr2	704233	704265	a	a	+
+chr2	704201	704233	b	b	-
+chr2	704243	704275	a	a	+
+chr2	704246	704278	a	a	+
+chr2	704246	704278	a	a	+
+chr2	704246	704278	a	a	+
+chr2	704214	704246	b	b	-
+chr2	704215	704247	b	b	-
+chr2	704215	704247	b	b	-
+chr2	704215	704247	b	b	-
+chr2	704219	704251	b	b	-
+chr2	704223	704255	b	b	-
+chr2	704257	704289	a	a	+
+chr2	704228	704260	b	b	-
+chr2	704229	704261	b	b	-
+chr2	704229	704261	b	b	-
+chr2	704229	704261	b	b	-
+chr2	704229	704261	b	b	-
+chr2	704265	704297	a	a	+
+chr2	704233	704265	b	b	-
+chr2	704250	704282	b	b	-
+chr2	704289	704321	a	a	+
+chr2	704289	704321	a	a	+
+chr2	704289	704321	a	a	+
+chr2	704303	704335	a	a	+
+chr2	704305	704337	b	b	-
+chr2	704485	704517	b	b	-
+chr2	704545	704577	a	a	+
+chr2	704545	704577	a	a	+
+chr2	704545	704577	a	a	+
+chr2	704520	704552	b	b	-
+chr2	704521	704553	b	b	-
+chr2	704527	704559	b	b	-
+chr2	704579	704611	a	a	+
+chr2	704660	704692	b	b	-
+chr2	704695	704727	b	b	-
+chr2	704695	704727	b	b	-
+chr2	704764	704796	a	a	+
+chr2	704886	704918	a	a	+
+chr2	704854	704886	b	b	-
+chr2	704886	704918	b	b	-
+chr2	704924	704956	a	a	+
+chr2	704956	704988	a	a	+
+chr2	704983	705015	b	b	-
+chr2	705040	705072	a	a	+
+chr2	705264	705296	b	b	-
+chr2	705924	705956	a	a	+
+chr2	706294	706326	a	a	+
+chr2	706306	706338	b	b	-
+chr2	706390	706422	b	b	-
+chr2	706569	706601	a	a	+
+chr2	706569	706601	a	a	+
+chr2	706541	706573	b	b	-
+chr2	706579	706611	a	a	+
+chr2	706585	706617	a	a	+
+chr2	706591	706623	a	a	+
+chr2	706594	706626	a	a	+
+chr2	706562	706594	b	b	-
+chr2	706573	706605	b	b	-
+chr2	706625	706657	a	a	+
+chr2	706625	706657	a	a	+
+chr2	706700	706732	b	b	-
+chr2	706747	706779	a	a	+
+chr2	706715	706747	b	b	-
+chr2	706748	706780	a	a	+
+chr2	706720	706752	b	b	-
+chr2	706720	706752	b	b	-
+chr2	706755	706787	a	a	+
+chr2	706756	706788	a	a	+
+chr2	706726	706758	b	b	-
+chr2	706726	706758	b	b	-
+chr2	706726	706758	b	b	-
+chr2	706727	706759	b	b	-
+chr2	706728	706760	b	b	-
+chr2	706729	706761	b	b	-
+chr2	706764	706796	a	a	+
+chr2	706764	706796	a	a	+
+chr2	706732	706764	b	b	-
+chr2	706732	706764	b	b	-
+chr2	706765	706797	a	a	+
+chr2	706765	706797	a	a	+
+chr2	706765	706797	a	a	+
+chr2	706765	706797	a	a	+
+chr2	706765	706797	a	a	+
+chr2	706766	706798	a	a	+
+chr2	706766	706798	a	a	+
+chr2	706766	706798	a	a	+
+chr2	706766	706798	a	a	+
+chr2	706735	706767	b	b	-
+chr2	706737	706769	b	b	-
+chr2	706770	706802	a	a	+
+chr2	706772	706804	a	a	+
+chr2	706740	706772	b	b	-
+chr2	706776	706808	a	a	+
+chr2	706788	706820	a	a	+
+chr2	706938	706970	b	b	-
+chr2	707020	707052	a	a	+
+chr2	707057	707089	a	a	+
+chr2	707124	707156	a	a	+
+chr2	707112	707144	b	b	-
+chr2	707160	707192	a	a	+
+chr2	707146	707178	b	b	-
+chr2	707190	707222	a	a	+
+chr2	707277	707309	b	b	-
+chr2	707296	707328	b	b	-
+chr2	707344	707376	a	a	+
+chr2	707349	707381	a	a	+
+chr2	707321	707353	b	b	-
+chr2	707321	707353	b	b	-
+chr2	707355	707387	a	a	+
+chr2	707355	707387	a	a	+
+chr2	707329	707361	b	b	-
+chr2	707329	707361	b	b	-
+chr2	707363	707395	a	a	+
+chr2	707364	707396	a	a	+
+chr2	707372	707404	a	a	+
+chr2	707375	707407	a	a	+
+chr2	707375	707407	a	a	+
+chr2	707590	707622	a	a	+
+chr2	707702	707734	a	a	+
+chr2	707739	707771	b	b	-
+chr2	708176	708208	b	b	-
+chr2	708211	708243	a	a	+
+chr2	708187	708219	b	b	-
+chr2	708188	708220	b	b	-
+chr2	708218	708250	b	b	-
+chr2	708363	708395	b	b	-
+chr2	708407	708439	a	a	+
+chr2	708614	708646	a	a	+
+chr2	708934	708966	b	b	-
+chr2	708984	709016	a	a	+
+chr2	710258	710290	b	b	-
+chr2	710368	710400	a	a	+
+chr2	710985	711017	a	a	+
+chr2	711013	711045	a	a	+
+chr2	711014	711046	a	a	+
+chr2	711181	711213	a	a	+
+chr2	711165	711197	b	b	-
+chr2	711199	711231	a	a	+
+chr2	711224	711256	a	a	+
+chr2	711322	711354	a	a	+
+chr2	711322	711354	a	a	+
+chr2	711293	711325	b	b	-
+chr2	711293	711325	b	b	-
+chr2	711331	711363	a	a	+
+chr2	711340	711372	a	a	+
+chr2	711341	711373	a	a	+
+chr2	711348	711380	a	a	+
+chr2	711349	711381	a	a	+
+chr2	711349	711381	a	a	+
+chr2	711349	711381	a	a	+
+chr2	711349	711381	a	a	+
+chr2	711349	711381	a	a	+
+chr2	711317	711349	b	b	-
+chr2	711317	711349	b	b	-
+chr2	711317	711349	b	b	-
+chr2	711357	711389	a	a	+
+chr2	711368	711400	a	a	+
+chr2	711340	711372	b	b	-
+chr2	711573	711605	a	a	+
+chr2	711549	711581	b	b	-
+chr2	711549	711581	b	b	-
+chr2	711551	711583	b	b	-
+chr2	711553	711585	b	b	-
+chr2	711559	711591	b	b	-
+chr2	711560	711592	b	b	-
+chr2	711600	711632	a	a	+
+chr2	711600	711632	a	a	+
+chr2	711600	711632	a	a	+
+chr2	711568	711600	b	b	-
+chr2	711568	711600	b	b	-
+chr2	711601	711633	a	a	+
+chr2	711573	711605	b	b	-
+chr2	711575	711607	b	b	-
+chr2	711608	711640	a	a	+
+chr2	711611	711643	a	a	+
+chr2	711611	711643	a	a	+
+chr2	711583	711615	b	b	-
+chr2	711584	711616	b	b	-
+chr2	711584	711616	b	b	-
+chr2	711584	711616	b	b	-
+chr2	711585	711617	b	b	-
+chr2	711618	711650	a	a	+
+chr2	711622	711654	a	a	+
+chr2	711594	711626	b	b	-
+chr2	711634	711666	a	a	+
+chr2	711742	711774	b	b	-
+chr2	711776	711808	a	a	+
+chr2	711779	711811	a	a	+
+chr2	711786	711818	a	a	+
+chr2	711835	711867	a	a	+
+chr2	711863	711895	b	b	-
+chr2	712418	712450	b	b	-
+chr2	712533	712565	b	b	-
+chr2	713782	713814	b	b	-
+chr2	713819	713851	a	a	+
+chr2	713816	713848	b	b	-
+chr2	713856	713888	b	b	-
+chr2	713947	713979	a	a	+
+chr2	713931	713963	b	b	-
+chr2	714092	714124	b	b	-
+chr2	714126	714158	a	a	+
+chr2	714265	714297	a	a	+
+chr2	714245	714277	b	b	-
+chr2	714254	714286	b	b	-
+chr2	714287	714319	a	a	+
+chr2	714439	714471	a	a	+
+chr2	714441	714473	a	a	+
+chr2	714442	714474	a	a	+
+chr2	714416	714448	b	b	-
+chr2	714452	714484	a	a	+
+chr2	714465	714497	a	a	+
+chr2	714441	714473	b	b	-
+chr2	714441	714473	b	b	-
+chr2	714466	714498	b	b	-
+chr2	714663	714695	a	a	+
+chr2	714663	714695	a	a	+
+chr2	714707	714739	a	a	+
+chr2	714716	714748	a	a	+
+chr2	714717	714749	a	a	+
+chr2	714720	714752	a	a	+
+chr2	714703	714735	b	b	-
+chr2	714741	714773	a	a	+
+chr2	714747	714779	a	a	+
+chr2	714719	714751	b	b	-
+chr2	714720	714752	b	b	-
+chr2	714845	714877	b	b	-
+chr2	714865	714897	b	b	-
+chr2	714902	714934	a	a	+
+chr2	714886	714918	b	b	-
+chr2	714886	714918	b	b	-
+chr2	714919	714951	a	a	+
+chr2	714889	714921	b	b	-
+chr2	714929	714961	a	a	+
+chr2	714902	714934	b	b	-
+chr2	714902	714934	b	b	-
+chr2	714943	714975	a	a	+
+chr2	715097	715129	b	b	-
+chr2	715221	715253	b	b	-
+chr2	715431	715463	a	a	+
+chr2	715431	715463	a	a	+
+chr2	715457	715489	a	a	+
+chr2	715477	715509	a	a	+
+chr2	715571	715603	b	b	-
+chr2	715623	715655	a	a	+
+chr2	715631	715663	a	a	+
+chr2	715887	715919	a	a	+
+chr2	716052	716084	a	a	+
+chr2	716116	716148	a	a	+
+chr2	716152	716184	a	a	+
+chr2	716137	716169	b	b	-
+chr2	716141	716173	b	b	-
+chr2	716149	716181	b	b	-
+chr2	716189	716221	a	a	+
+chr2	716280	716312	b	b	-
+chr2	716284	716316	b	b	-
+chr2	716320	716352	b	b	-
+chr2	716353	716385	a	a	+
+chr2	716358	716390	a	a	+
+chr2	716362	716394	a	a	+
+chr2	716474	716506	a	a	+
+chr2	716448	716480	b	b	-
+chr2	716484	716516	a	a	+
+chr2	716484	716516	a	a	+
+chr2	716484	716516	a	a	+
+chr2	716484	716516	a	a	+
+chr2	716484	716516	a	a	+
+chr2	716486	716518	a	a	+
+chr2	716486	716518	a	a	+
+chr2	716493	716525	a	a	+
+chr2	716461	716493	b	b	-
+chr2	716463	716495	b	b	-
+chr2	716496	716528	a	a	+
+chr2	716497	716529	a	a	+
+chr2	716498	716530	a	a	+
+chr2	716498	716530	a	a	+
+chr2	716498	716530	a	a	+
+chr2	716498	716530	a	a	+
+chr2	716498	716530	a	a	+
+chr2	716466	716498	b	b	-
+chr2	716499	716531	a	a	+
+chr2	716468	716500	b	b	-
+chr2	716468	716500	b	b	-
+chr2	716504	716536	a	a	+
+chr2	716472	716504	b	b	-
+chr2	716472	716504	b	b	-
+chr2	716472	716504	b	b	-
+chr2	716507	716539	a	a	+
+chr2	716475	716507	b	b	-
+chr2	716475	716507	b	b	-
+chr2	716475	716507	b	b	-
+chr2	716476	716508	b	b	-
+chr2	716476	716508	b	b	-
+chr2	716514	716546	a	a	+
+chr2	716544	716576	a	a	+
+chr2	716736	716768	b	b	-
+chr2	716747	716779	b	b	-
+chr2	716748	716780	b	b	-
+chr2	716759	716791	b	b	-
+chr2	716759	716791	b	b	-
+chr2	716792	716824	a	a	+
+chr2	716792	716824	a	a	+
+chr2	716760	716792	b	b	-
+chr2	716794	716826	a	a	+
+chr2	716770	716802	b	b	-
+chr2	716945	716977	a	a	+
+chr2	716955	716987	a	a	+
+chr2	716955	716987	a	a	+
+chr2	716958	716990	a	a	+
+chr2	716958	716990	a	a	+
+chr2	716932	716964	b	b	-
+chr2	716937	716969	b	b	-
+chr2	716975	717007	a	a	+
+chr2	717151	717183	a	a	+
+chr2	717370	717402	b	b	-
+chr2	717420	717452	b	b	-
+chr2	717420	717452	b	b	-
+chr2	717515	717547	a	a	+
+chr2	717568	717600	a	a	+
+chr2	717568	717600	b	b	-
+chr2	717763	717795	b	b	-
+chr2	717763	717795	b	b	-
+chr2	717808	717840	b	b	-
+chr2	717819	717851	b	b	-
+chr2	717904	717936	b	b	-
+chr2	717922	717954	b	b	-
+chr2	718335	718367	b	b	-
+chr2	718344	718376	b	b	-
+chr2	718398	718430	a	a	+
+chr2	718366	718398	b	b	-
+chr2	718366	718398	b	b	-
+chr2	718400	718432	a	a	+
+chr2	718374	718406	b	b	-
+chr2	718380	718412	b	b	-
+chr2	718380	718412	b	b	-
+chr2	718429	718461	a	a	+
+chr2	718400	718432	b	b	-
+chr2	718401	718433	b	b	-
+chr2	718401	718433	b	b	-
+chr2	718401	718433	b	b	-
+chr2	718402	718434	b	b	-
+chr2	718458	718490	a	a	+
+chr2	718440	718472	b	b	-
+chr2	718441	718473	b	b	-
+chr2	718607	718639	a	a	+
+chr2	718588	718620	b	b	-
+chr2	718589	718621	b	b	-
+chr2	718600	718632	b	b	-
+chr2	718748	718780	a	a	+
+chr2	718748	718780	a	a	+
+chr2	718754	718786	b	b	-
+chr2	718942	718974	a	a	+
+chr2	718961	718993	a	a	+
+chr2	718961	718993	a	a	+
+chr2	718961	718993	a	a	+
+chr2	718940	718972	b	b	-
+chr2	718977	719009	a	a	+
+chr2	718946	718978	b	b	-
+chr2	718989	719021	a	a	+
+chr2	719134	719166	a	a	+
+chr2	719109	719141	b	b	-
+chr2	719153	719185	a	a	+
+chr2	719170	719202	a	a	+
+chr2	719146	719178	b	b	-
+chr2	719152	719184	b	b	-
+chr2	719186	719218	a	a	+
+chr2	719206	719238	a	a	+
+chr2	719272	719304	b	b	-
+chr2	719309	719341	a	a	+
+chr2	719319	719351	a	a	+
+chr2	719346	719378	a	a	+
+chr2	719320	719352	b	b	-
+chr2	719434	719466	a	a	+
+chr2	719574	719606	b	b	-
+chr2	719592	719624	b	b	-
+chr2	719608	719640	b	b	-
+chr2	719662	719694	a	a	+
+chr2	719632	719664	b	b	-
+chr2	719696	719728	a	a	+
+chr2	719697	719729	a	a	+
+chr2	719697	719729	a	a	+
+chr2	719697	719729	a	a	+
+chr2	719675	719707	b	b	-
+chr2	719705	719737	b	b	-
+chr2	719780	719812	a	a	+
+chr2	719812	719844	a	a	+
+chr2	719796	719828	b	b	-
+chr2	719956	719988	b	b	-
+chr2	720006	720038	a	a	+
+chr2	719983	720015	b	b	-
+chr2	720035	720067	a	a	+
+chr2	720008	720040	b	b	-
+chr2	720043	720075	a	a	+
+chr2	720150	720182	a	a	+
+chr2	720141	720173	b	b	-
+chr2	720177	720209	a	a	+
+chr2	720147	720179	b	b	-
+chr2	720233	720265	a	a	+
+chr2	720210	720242	b	b	-
+chr2	720210	720242	b	b	-
+chr2	720249	720281	a	a	+
+chr2	720265	720297	b	b	-
+chr2	720293	720325	b	b	-
+chr2	720329	720361	a	a	+
+chr2	720297	720329	b	b	-
+chr2	720297	720329	b	b	-
+chr2	720345	720377	a	a	+
+chr2	720345	720377	a	a	+
+chr2	720345	720377	a	a	+
+chr2	720351	720383	a	a	+
+chr2	720351	720383	a	a	+
+chr2	720328	720360	b	b	-
+chr2	720364	720396	a	a	+
+chr2	720365	720397	a	a	+
+chr2	720333	720365	b	b	-
+chr2	720334	720366	b	b	-
+chr2	720336	720368	b	b	-
+chr2	720336	720368	b	b	-
+chr2	720377	720409	a	a	+
+chr2	720377	720409	a	a	+
+chr2	720378	720410	a	a	+
+chr2	720355	720387	b	b	-
+chr2	720398	720430	a	a	+
+chr2	720398	720430	a	a	+
+chr2	720378	720410	b	b	-
+chr2	720412	720444	a	a	+
+chr2	720467	720499	b	b	-
+chr2	720528	720560	a	a	+
+chr2	720533	720565	a	a	+
+chr2	720563	720595	a	a	+
+chr2	720532	720564	b	b	-
+chr2	720532	720564	b	b	-
+chr2	720532	720564	b	b	-
+chr2	720567	720599	a	a	+
+chr2	720540	720572	b	b	-
+chr2	720549	720581	b	b	-
+chr2	720549	720581	b	b	-
+chr2	720549	720581	b	b	-
+chr2	720552	720584	b	b	-
+chr2	720585	720617	a	a	+
+chr2	720558	720590	b	b	-
+chr2	720558	720590	b	b	-
+chr2	720594	720626	a	a	+
+chr2	720752	720784	a	a	+
+chr2	720752	720784	a	a	+
+chr2	720757	720789	a	a	+
+chr2	720761	720793	a	a	+
+chr2	720763	720795	a	a	+
+chr2	720770	720802	a	a	+
+chr2	720770	720802	a	a	+
+chr2	720770	720802	a	a	+
+chr2	720770	720802	a	a	+
+chr2	720742	720774	b	b	-
+chr2	720793	720825	a	a	+
+chr2	720767	720799	b	b	-
+chr2	720807	720839	a	a	+
+chr2	720890	720922	b	b	-
+chr2	720890	720922	b	b	-
+chr2	720931	720963	a	a	+
+chr2	720933	720965	a	a	+
+chr2	720944	720976	a	a	+
+chr2	720946	720978	a	a	+
+chr2	720915	720947	b	b	-
+chr2	720950	720982	a	a	+
+chr2	720950	720982	a	a	+
+chr2	720951	720983	a	a	+
+chr2	720951	720983	a	a	+
+chr2	720919	720951	b	b	-
+chr2	720919	720951	b	b	-
+chr2	720924	720956	b	b	-
+chr2	720924	720956	b	b	-
+chr2	720928	720960	b	b	-
+chr2	721080	721112	b	b	-
+chr2	721080	721112	b	b	-
+chr2	721081	721113	b	b	-
+chr2	721114	721146	a	a	+
+chr2	721086	721118	b	b	-
+chr2	721086	721118	b	b	-
+chr2	721125	721157	a	a	+
+chr2	721126	721158	a	a	+
+chr2	721128	721160	a	a	+
+chr2	721098	721130	b	b	-
+chr2	721131	721163	a	a	+
+chr2	721099	721131	b	b	-
+chr2	721099	721131	b	b	-
+chr2	721134	721166	a	a	+
+chr2	721146	721178	a	a	+
+chr2	721122	721154	b	b	-
+chr2	721165	721197	a	a	+
+chr2	721345	721377	a	a	+
+chr2	721323	721355	b	b	-
+chr2	721323	721355	b	b	-
+chr2	721368	721400	a	a	+
+chr2	721368	721400	a	a	+
+chr2	721368	721400	a	a	+
+chr2	721369	721401	a	a	+
+chr2	721369	721401	a	a	+
+chr2	721369	721401	a	a	+
+chr2	721369	721401	a	a	+
+chr2	721339	721371	b	b	-
+chr2	721372	721404	a	a	+
+chr2	721372	721404	a	a	+
+chr2	721346	721378	b	b	-
+chr2	721381	721413	a	a	+
+chr2	721349	721381	b	b	-
+chr2	721382	721414	a	a	+
+chr2	721384	721416	a	a	+
+chr2	721384	721416	a	a	+
+chr2	721384	721416	a	a	+
+chr2	721384	721416	a	a	+
+chr2	721352	721384	b	b	-
+chr2	721352	721384	b	b	-
+chr2	721352	721384	b	b	-
+chr2	721353	721385	b	b	-
+chr2	721389	721421	a	a	+
+chr2	721357	721389	b	b	-
+chr2	721390	721422	a	a	+
+chr2	721365	721397	b	b	-
+chr2	721365	721397	b	b	-
+chr2	721365	721397	b	b	-
+chr2	721365	721397	b	b	-
+chr2	721524	721556	a	a	+
+chr2	721510	721542	b	b	-
+chr2	721551	721583	a	a	+
+chr2	721523	721555	b	b	-
+chr2	721573	721605	a	a	+
+chr2	721672	721704	a	a	+
+chr2	721683	721715	b	b	-
+chr2	722005	722037	b	b	-
+chr2	722045	722077	a	a	+
+chr2	722052	722084	a	a	+
+chr2	722045	722077	b	b	-
+chr2	722173	722205	b	b	-
+chr2	722356	722388	b	b	-
+chr2	722359	722391	b	b	-
+chr2	722624	722656	a	a	+
+chr2	722627	722659	a	a	+
+chr2	722627	722659	a	a	+
+chr2	722597	722629	b	b	-
+chr2	722597	722629	b	b	-
+chr2	722630	722662	a	a	+
+chr2	722598	722630	b	b	-
+chr2	722605	722637	b	b	-
+chr2	722638	722670	a	a	+
+chr2	722613	722645	b	b	-
+chr2	722613	722645	b	b	-
+chr2	722613	722645	b	b	-
+chr2	722629	722661	b	b	-
+chr2	722796	722828	a	a	+
+chr2	722785	722817	b	b	-
+chr2	722785	722817	b	b	-
+chr2	722785	722817	b	b	-
+chr2	722825	722857	a	a	+
+chr2	722825	722857	a	a	+
+chr2	722826	722858	a	a	+
+chr2	722837	722869	a	a	+
+chr2	722838	722870	a	a	+
+chr2	722935	722967	b	b	-
+chr2	722968	723000	a	a	+
+chr2	722938	722970	b	b	-
+chr2	722938	722970	b	b	-
+chr2	722939	722971	b	b	-
+chr2	722976	723008	a	a	+
+chr2	722976	723008	a	a	+
+chr2	722976	723008	a	a	+
+chr2	722980	723012	a	a	+
+chr2	722982	723014	a	a	+
+chr2	722984	723016	a	a	+
+chr2	722952	722984	b	b	-
+chr2	722952	722984	b	b	-
+chr2	722952	722984	b	b	-
+chr2	722953	722985	b	b	-
+chr2	722988	723020	a	a	+
+chr2	723000	723032	a	a	+
+chr2	722972	723004	b	b	-
+chr2	722980	723012	b	b	-
+chr2	722982	723014	b	b	-
+chr2	722995	723027	b	b	-
+chr2	723189	723221	b	b	-
+chr2	723205	723237	b	b	-
+chr2	723240	723272	a	a	+
+chr2	723248	723280	a	a	+
+chr2	723253	723285	a	a	+
+chr2	723254	723286	a	a	+
+chr2	723254	723286	a	a	+
+chr2	723254	723286	a	a	+
+chr2	723254	723286	a	a	+
+chr2	723259	723291	a	a	+
+chr2	723227	723259	b	b	-
+chr2	723227	723259	b	b	-
+chr2	723260	723292	a	a	+
+chr2	723260	723292	a	a	+
+chr2	723260	723292	a	a	+
+chr2	723260	723292	a	a	+
+chr2	723262	723294	a	a	+
+chr2	723263	723295	a	a	+
+chr2	723263	723295	a	a	+
+chr2	723232	723264	b	b	-
+chr2	723233	723265	b	b	-
+chr2	723235	723267	b	b	-
+chr2	723235	723267	b	b	-
+chr2	723272	723304	a	a	+
+chr2	723273	723305	a	a	+
+chr2	723273	723305	a	a	+
+chr2	723255	723287	b	b	-
+chr2	723256	723288	b	b	-
+chr2	723389	723421	a	a	+
+chr2	723410	723442	b	b	-
+chr2	723410	723442	b	b	-
+chr2	723445	723477	a	a	+
+chr2	723547	723579	a	a	+
+chr2	723574	723606	a	a	+
+chr2	723542	723574	b	b	-
+chr2	723577	723609	a	a	+
+chr2	723716	723748	a	a	+
+chr2	723732	723764	a	a	+
+chr2	723706	723738	b	b	-
+chr2	723731	723763	b	b	-
+chr2	723765	723797	a	a	+
+chr2	723777	723809	a	a	+
+chr2	723777	723809	a	a	+
+chr2	723841	723873	b	b	-
+chr2	723842	723874	b	b	-
+chr2	723887	723919	a	a	+
+chr2	723897	723929	a	a	+
+chr2	723997	724029	b	b	-
+chr2	724050	724082	a	a	+
+chr2	724028	724060	b	b	-
+chr2	724062	724094	a	a	+
+chr2	724035	724067	b	b	-
+chr2	724076	724108	a	a	+
+chr2	724085	724117	a	a	+
+chr2	724139	724171	b	b	-
+chr2	724155	724187	b	b	-
+chr2	724157	724189	b	b	-
+chr2	724193	724225	a	a	+
+chr2	724198	724230	a	a	+
+chr2	724202	724234	a	a	+
+chr2	724207	724239	a	a	+
+chr2	724179	724211	b	b	-
+chr2	724213	724245	a	a	+
+chr2	724213	724245	a	a	+
+chr2	724181	724213	b	b	-
+chr2	724181	724213	b	b	-
+chr2	724181	724213	b	b	-
+chr2	724214	724246	a	a	+
+chr2	724214	724246	a	a	+
+chr2	724214	724246	a	a	+
+chr2	724182	724214	b	b	-
+chr2	724217	724249	a	a	+
+chr2	724217	724249	a	a	+
+chr2	724217	724249	a	a	+
+chr2	724217	724249	a	a	+
+chr2	724217	724249	a	a	+
+chr2	724217	724249	a	a	+
+chr2	724188	724220	b	b	-
+chr2	724188	724220	b	b	-
+chr2	724188	724220	b	b	-
+chr2	724188	724220	b	b	-
+chr2	724188	724220	b	b	-
+chr2	724188	724220	b	b	-
+chr2	724188	724220	b	b	-
+chr2	724188	724220	b	b	-
+chr2	724189	724221	b	b	-
+chr2	724189	724221	b	b	-
+chr2	724190	724222	b	b	-
+chr2	724190	724222	b	b	-
+chr2	724190	724222	b	b	-
+chr2	724223	724255	a	a	+
+chr2	724225	724257	a	a	+
+chr2	724225	724257	a	a	+
+chr2	724194	724226	b	b	-
+chr2	724202	724234	b	b	-
+chr2	724237	724269	a	a	+
+chr2	724213	724245	b	b	-
+chr2	724213	724245	b	b	-
+chr2	724436	724468	a	a	+
+chr2	724449	724481	a	a	+
+chr2	724423	724455	b	b	-
+chr2	724428	724460	b	b	-
+chr2	724429	724461	b	b	-
+chr2	724429	724461	b	b	-
+chr2	724431	724463	b	b	-
+chr2	724431	724463	b	b	-
+chr2	724431	724463	b	b	-
+chr2	724464	724496	a	a	+
+chr2	724465	724497	a	a	+
+chr2	724436	724468	b	b	-
+chr2	724436	724468	b	b	-
+chr2	724438	724470	b	b	-
+chr2	724439	724471	b	b	-
+chr2	724439	724471	b	b	-
+chr2	724439	724471	b	b	-
+chr2	724439	724471	b	b	-
+chr2	724472	724504	a	a	+
+chr2	724440	724472	b	b	-
+chr2	724440	724472	b	b	-
+chr2	724440	724472	b	b	-
+chr2	724473	724505	a	a	+
+chr2	724441	724473	b	b	-
+chr2	724478	724510	a	a	+
+chr2	724446	724478	b	b	-
+chr2	724480	724512	a	a	+
+chr2	724480	724512	a	a	+
+chr2	724480	724512	a	a	+
+chr2	724480	724512	a	a	+
+chr2	724481	724513	a	a	+
+chr2	724481	724513	a	a	+
+chr2	724451	724483	b	b	-
+chr2	724451	724483	b	b	-
+chr2	724485	724517	a	a	+
+chr2	724486	724518	a	a	+
+chr2	724458	724490	b	b	-
+chr2	724491	724523	a	a	+
+chr2	724460	724492	b	b	-
+chr2	724493	724525	a	a	+
+chr2	724509	724541	a	a	+
+chr2	724488	724520	b	b	-
+chr2	724630	724662	a	a	+
+chr2	724603	724635	b	b	-
+chr2	724605	724637	b	b	-
+chr2	724652	724684	a	a	+
+chr2	724659	724691	a	a	+
+chr2	724716	724748	a	a	+
+chr2	724866	724898	a	a	+
+chr2	725233	725265	a	a	+
+chr2	725219	725251	b	b	-
+chr2	725265	725297	a	a	+
+chr2	725247	725279	b	b	-
+chr2	725798	725830	a	a	+
+chr2	725851	725883	a	a	+
+chr2	725881	725913	a	a	+
+chr2	725873	725905	b	b	-
+chr2	726388	726420	b	b	-
+chr2	726666	726698	a	a	+
+chr2	726635	726667	b	b	-
+chr2	726680	726712	a	a	+
+chr2	726689	726721	a	a	+
+chr2	726697	726729	a	a	+
+chr2	726700	726732	a	a	+
+chr2	726685	726717	b	b	-
+chr2	726717	726749	b	b	-
+chr2	726850	726882	a	a	+
+chr2	726863	726895	a	a	+
+chr2	726898	726930	a	a	+
+chr2	726877	726909	b	b	-
+chr2	726991	727023	b	b	-
+chr2	727009	727041	b	b	-
+chr2	727009	727041	b	b	-
+chr2	727010	727042	b	b	-
+chr2	727012	727044	b	b	-
+chr2	727045	727077	a	a	+
+chr2	727045	727077	a	a	+
+chr2	727018	727050	b	b	-
+chr2	727018	727050	b	b	-
+chr2	727018	727050	b	b	-
+chr2	727018	727050	b	b	-
+chr2	727051	727083	a	a	+
+chr2	727053	727085	a	a	+
+chr2	727027	727059	b	b	-
+chr2	727027	727059	b	b	-
+chr2	727027	727059	b	b	-
+chr2	727063	727095	a	a	+
+chr2	727035	727067	b	b	-
+chr2	727078	727110	a	a	+
+chr2	727089	727121	a	a	+
+chr2	727090	727122	a	a	+
+chr2	727090	727122	a	a	+
+chr2	727090	727122	a	a	+
+chr2	727090	727122	a	a	+
+chr2	727090	727122	a	a	+
+chr2	727090	727122	a	a	+
+chr2	727172	727204	b	b	-
+chr2	727214	727246	b	b	-
+chr2	727265	727297	a	a	+
+chr2	727255	727287	b	b	-
+chr2	727288	727320	a	a	+
+chr2	727266	727298	b	b	-
+chr2	727267	727299	b	b	-
+chr2	727565	727597	b	b	-
+chr2	727618	727650	a	a	+
+chr2	727672	727704	a	a	+
+chr2	727672	727704	a	a	+
+chr2	727699	727731	b	b	-
+chr2	727762	727794	a	a	+
+chr2	727749	727781	b	b	-
+chr2	727906	727938	a	a	+
+chr2	727925	727957	a	a	+
+chr2	727897	727929	b	b	-
+chr2	727897	727929	b	b	-
+chr2	727897	727929	b	b	-
+chr2	727897	727929	b	b	-
+chr2	727899	727931	b	b	-
+chr2	727940	727972	b	b	-
+chr2	728078	728110	a	a	+
+chr2	728050	728082	b	b	-
+chr2	728050	728082	b	b	-
+chr2	728050	728082	b	b	-
+chr2	728050	728082	b	b	-
+chr2	728051	728083	b	b	-
+chr2	728084	728116	a	a	+
+chr2	728084	728116	a	a	+
+chr2	728084	728116	a	a	+
+chr2	728084	728116	a	a	+
+chr2	728052	728084	b	b	-
+chr2	728052	728084	b	b	-
+chr2	728052	728084	b	b	-
+chr2	728053	728085	b	b	-
+chr2	728087	728119	a	a	+
+chr2	728088	728120	a	a	+
+chr2	728088	728120	a	a	+
+chr2	728056	728088	b	b	-
+chr2	728090	728122	a	a	+
+chr2	728060	728092	b	b	-
+chr2	728060	728092	b	b	-
+chr2	728061	728093	b	b	-
+chr2	728066	728098	b	b	-
+chr2	728071	728103	b	b	-
+chr2	728076	728108	b	b	-
+chr2	728076	728108	b	b	-
+chr2	728076	728108	b	b	-
+chr2	728077	728109	b	b	-
+chr2	728110	728142	a	a	+
+chr2	728110	728142	a	a	+
+chr2	728078	728110	b	b	-
+chr2	728119	728151	a	a	+
+chr2	728119	728151	a	a	+
+chr2	728120	728152	a	a	+
+chr2	728120	728152	a	a	+
+chr2	728091	728123	b	b	-
+chr2	728134	728166	a	a	+
+chr2	728134	728166	b	b	-
+chr2	728323	728355	b	b	-
+chr2	728376	728408	a	a	+
+chr2	728556	728588	b	b	-
+chr2	728802	728834	b	b	-
+chr2	728876	728908	a	a	+
+chr2	728876	728908	a	a	+
+chr2	728844	728876	b	b	-
+chr2	728884	728916	a	a	+
+chr2	728884	728916	a	a	+
+chr2	728885	728917	a	a	+
+chr2	728885	728917	a	a	+
+chr2	728853	728885	b	b	-
+chr2	728853	728885	b	b	-
+chr2	728853	728885	b	b	-
+chr2	728886	728918	a	a	+
+chr2	728886	728918	a	a	+
+chr2	728886	728918	a	a	+
+chr2	728886	728918	a	a	+
+chr2	728886	728918	a	a	+
+chr2	728886	728918	a	a	+
+chr2	728886	728918	a	a	+
+chr2	728891	728923	a	a	+
+chr2	728860	728892	b	b	-
+chr2	728893	728925	a	a	+
+chr2	728863	728895	b	b	-
+chr2	728863	728895	b	b	-
+chr2	728863	728895	b	b	-
+chr2	728864	728896	b	b	-
+chr2	728866	728898	b	b	-
+chr2	728899	728931	a	a	+
+chr2	728867	728899	b	b	-
+chr2	728871	728903	b	b	-
+chr2	728906	728938	a	a	+
+chr2	728908	728940	a	a	+
+chr2	728878	728910	b	b	-
+chr2	728912	728944	a	a	+
+chr2	728913	728945	a	a	+
+chr2	728913	728945	a	a	+
+chr2	728913	728945	a	a	+
+chr2	728913	728945	a	a	+
+chr2	728881	728913	b	b	-
+chr2	728915	728947	a	a	+
+chr2	728888	728920	b	b	-
+chr2	728888	728920	b	b	-
+chr2	728897	728929	b	b	-
+chr2	728903	728935	b	b	-
+chr2	729018	729050	b	b	-
+chr2	729052	729084	a	a	+
+chr2	729053	729085	a	a	+
+chr2	729061	729093	a	a	+
+chr2	729029	729061	b	b	-
+chr2	729029	729061	b	b	-
+chr2	729030	729062	b	b	-
+chr2	729049	729081	b	b	-
+chr2	729090	729122	a	a	+
+chr2	729390	729422	b	b	-
+chr2	729408	729440	b	b	-
+chr2	729605	729637	a	a	+
+chr2	729746	729778	b	b	-
+chr2	729763	729795	b	b	-
+chr2	729898	729930	a	a	+
+chr2	729880	729912	b	b	-
+chr2	729900	729932	b	b	-
+chr2	729944	729976	a	a	+
+chr2	729922	729954	b	b	-
+chr2	729930	729962	b	b	-
+chr2	729935	729967	b	b	-
+chr2	730069	730101	a	a	+
+chr2	730069	730101	a	a	+
+chr2	730084	730116	b	b	-
+chr2	730084	730116	b	b	-
+chr2	730118	730150	a	a	+
+chr2	730118	730150	a	a	+
+chr2	730131	730163	a	a	+
+chr2	730131	730163	a	a	+
+chr2	730140	730172	a	a	+
+chr2	730141	730173	a	a	+
+chr2	730129	730161	b	b	-
+chr2	730301	730333	b	b	-
+chr2	730304	730336	b	b	-
+chr2	730337	730369	b	b	-
+chr2	730376	730408	a	a	+
+chr2	730377	730409	a	a	+
+chr2	730377	730409	a	a	+
+chr2	730377	730409	a	a	+
+chr2	730377	730409	a	a	+
+chr2	730378	730410	a	a	+
+chr2	730379	730411	a	a	+
+chr2	730379	730411	a	a	+
+chr2	730379	730411	a	a	+
+chr2	730381	730413	a	a	+
+chr2	730349	730381	b	b	-
+chr2	730349	730381	b	b	-
+chr2	730351	730383	b	b	-
+chr2	730353	730385	b	b	-
+chr2	730354	730386	b	b	-
+chr2	730390	730422	a	a	+
+chr2	730390	730422	a	a	+
+chr2	730361	730393	b	b	-
+chr2	730364	730396	b	b	-
+chr2	730379	730411	b	b	-
+chr2	730488	730520	b	b	-
+chr2	730535	730567	a	a	+
+chr2	730535	730567	a	a	+
+chr2	730513	730545	b	b	-
+chr2	730516	730548	b	b	-
+chr2	730549	730581	a	a	+
+chr2	730549	730581	a	a	+
+chr2	730518	730550	b	b	-
+chr2	730524	730556	b	b	-
+chr2	730561	730593	a	a	+
+chr2	730561	730593	a	a	+
+chr2	730533	730565	b	b	-
+chr2	730542	730574	b	b	-
+chr2	730544	730576	b	b	-
+chr2	730545	730577	b	b	-
+chr2	730545	730577	b	b	-
+chr2	730578	730610	a	a	+
+chr2	730578	730610	a	a	+
+chr2	730576	730608	b	b	-
+chr2	730629	730661	a	a	+
+chr2	730630	730662	a	a	+
+chr2	730674	730706	b	b	-
+chr2	730674	730706	b	b	-
+chr2	730709	730741	b	b	-
+chr2	730837	730869	b	b	-
+chr2	730885	730917	a	a	+
+chr2	731339	731371	a	a	+
+chr2	731464	731496	b	b	-
+chr2	731616	731648	b	b	-
+chr2	732465	732497	b	b	-
+chr2	732582	732614	b	b	-
+chr2	732642	732674	b	b	-
+chr2	732755	732787	a	a	+
+chr2	732812	732844	a	a	+
+chr2	732988	733020	a	a	+
+chr2	732997	733029	a	a	+
+chr2	732997	733029	a	a	+
+chr2	732981	733013	b	b	-
+chr2	733100	733132	a	a	+
+chr2	733121	733153	b	b	-
+chr2	733175	733207	a	a	+
+chr2	733175	733207	a	a	+
+chr2	733182	733214	a	a	+
+chr2	733203	733235	a	a	+
+chr2	733387	733419	a	a	+
+chr2	733425	733457	b	b	-
+chr2	733504	733536	a	a	+
+chr2	733723	733755	b	b	-
+chr2	733816	733848	a	a	+
+chr2	734062	734094	b	b	-
+chr2	734224	734256	b	b	-
+chr2	734224	734256	b	b	-
+chr2	734279	734311	a	a	+
+chr2	734253	734285	b	b	-
+chr2	734404	734436	a	a	+
+chr2	734426	734458	a	a	+
+chr2	734426	734458	a	a	+
+chr2	734426	734458	a	a	+
+chr2	734395	734427	b	b	-
+chr2	734395	734427	b	b	-
+chr2	734443	734475	a	a	+
+chr2	734448	734480	a	a	+
+chr2	734521	734553	a	a	+
+chr2	734529	734561	a	a	+
+chr2	734524	734556	b	b	-
+chr2	734536	734568	b	b	-
+chr2	734536	734568	b	b	-
+chr2	734536	734568	b	b	-
+chr2	734538	734570	b	b	-
+chr2	734575	734607	a	a	+
+chr2	734575	734607	a	a	+
+chr2	734575	734607	a	a	+
+chr2	734576	734608	a	a	+
+chr2	734576	734608	a	a	+
+chr2	734576	734608	a	a	+
+chr2	734580	734612	a	a	+
+chr2	734549	734581	b	b	-
+chr2	734549	734581	b	b	-
+chr2	734549	734581	b	b	-
+chr2	734549	734581	b	b	-
+chr2	734550	734582	b	b	-
+chr2	734550	734582	b	b	-
+chr2	734583	734615	a	a	+
+chr2	734583	734615	a	a	+
+chr2	734584	734616	a	a	+
+chr2	734552	734584	b	b	-
+chr2	734553	734585	b	b	-
+chr2	734591	734623	a	a	+
+chr2	734591	734623	a	a	+
+chr2	734591	734623	a	a	+
+chr2	734591	734623	a	a	+
+chr2	734592	734624	a	a	+
+chr2	734592	734624	a	a	+
+chr2	734561	734593	b	b	-
+chr2	734561	734593	b	b	-
+chr2	734562	734594	b	b	-
+chr2	734562	734594	b	b	-
+chr2	734562	734594	b	b	-
+chr2	734563	734595	b	b	-
+chr2	734564	734596	b	b	-
+chr2	734565	734597	b	b	-
+chr2	734566	734598	b	b	-
+chr2	734569	734601	b	b	-
+chr2	734569	734601	b	b	-
+chr2	734569	734601	b	b	-
+chr2	734569	734601	b	b	-
+chr2	734569	734601	b	b	-
+chr2	734602	734634	a	a	+
+chr2	734602	734634	a	a	+
+chr2	734602	734634	a	a	+
+chr2	734570	734602	b	b	-
+chr2	734572	734604	b	b	-
+chr2	734572	734604	b	b	-
+chr2	734572	734604	b	b	-
+chr2	734607	734639	a	a	+
+chr2	734625	734657	a	a	+
+chr2	734601	734633	b	b	-
+chr2	734790	734822	b	b	-
+chr2	734794	734826	b	b	-
+chr2	734831	734863	a	a	+
+chr2	734832	734864	a	a	+
+chr2	734832	734864	a	a	+
+chr2	734833	734865	a	a	+
+chr2	734833	734865	a	a	+
+chr2	734833	734865	a	a	+
+chr2	734833	734865	a	a	+
+chr2	734807	734839	b	b	-
+chr2	734807	734839	b	b	-
+chr2	734807	734839	b	b	-
+chr2	734808	734840	b	b	-
+chr2	734809	734841	b	b	-
+chr2	734842	734874	a	a	+
+chr2	734842	734874	a	a	+
+chr2	734842	734874	a	a	+
+chr2	734842	734874	a	a	+
+chr2	734842	734874	a	a	+
+chr2	734842	734874	a	a	+
+chr2	734842	734874	a	a	+
+chr2	734848	734880	a	a	+
+chr2	734849	734881	a	a	+
+chr2	734818	734850	b	b	-
+chr2	734818	734850	b	b	-
+chr2	734818	734850	b	b	-
+chr2	734818	734850	b	b	-
+chr2	734818	734850	b	b	-
+chr2	734851	734883	a	a	+
+chr2	734819	734851	b	b	-
+chr2	734853	734885	a	a	+
+chr2	734853	734885	a	a	+
+chr2	734821	734853	b	b	-
+chr2	734822	734854	b	b	-
+chr2	734823	734855	b	b	-
+chr2	734824	734856	b	b	-
+chr2	734825	734857	b	b	-
+chr2	734825	734857	b	b	-
+chr2	734825	734857	b	b	-
+chr2	734828	734860	b	b	-
+chr2	734828	734860	b	b	-
+chr2	734828	734860	b	b	-
+chr2	734828	734860	b	b	-
+chr2	734830	734862	b	b	-
+chr2	734835	734867	b	b	-
+chr2	734835	734867	b	b	-
+chr2	734840	734872	b	b	-
+chr2	734880	734912	a	a	+
+chr2	734880	734912	a	a	+
+chr2	734886	734918	a	a	+
+chr2	734861	734893	b	b	-
+chr2	734934	734966	a	a	+
+chr2	734988	735020	a	a	+
+chr2	734980	735012	b	b	-
+chr2	735085	735117	b	b	-
+chr2	735174	735206	a	a	+
+chr2	735183	735215	a	a	+
+chr2	735308	735340	a	a	+
+chr2	735308	735340	a	a	+
+chr2	735308	735340	a	a	+
+chr2	735308	735340	a	a	+
+chr2	735279	735311	b	b	-
+chr2	735307	735339	b	b	-
+chr2	735307	735339	b	b	-
+chr2	735310	735342	b	b	-
+chr2	735310	735342	b	b	-
+chr2	735349	735381	a	a	+
+chr2	735337	735369	b	b	-
+chr2	735393	735425	b	b	-
+chr2	735432	735464	b	b	-
+chr2	735467	735499	a	a	+
+chr2	735486	735518	a	a	+
+chr2	735454	735486	b	b	-
+chr2	735488	735520	a	a	+
+chr2	735488	735520	a	a	+
+chr2	735500	735532	a	a	+
+chr2	735469	735501	b	b	-
+chr2	735469	735501	b	b	-
+chr2	735471	735503	b	b	-
+chr2	735471	735503	b	b	-
+chr2	735471	735503	b	b	-
+chr2	735472	735504	b	b	-
+chr2	735505	735537	a	a	+
+chr2	735479	735511	b	b	-
+chr2	735516	735548	a	a	+
+chr2	735516	735548	a	a	+
+chr2	735488	735520	b	b	-
+chr2	735488	735520	b	b	-
+chr2	735491	735523	b	b	-
+chr2	735491	735523	b	b	-
+chr2	735491	735523	b	b	-
+chr2	735494	735526	b	b	-
+chr2	735509	735541	b	b	-
+chr2	735564	735596	a	a	+
+chr2	735652	735684	b	b	-
+chr2	735731	735763	b	b	-
+chr2	735847	735879	a	a	+
+chr2	735835	735867	b	b	-
+chr2	735999	736031	a	a	+
+chr2	735999	736031	a	a	+
+chr2	736006	736038	a	a	+
+chr2	736008	736040	a	a	+
+chr2	736009	736041	a	a	+
+chr2	735982	736014	b	b	-
+chr2	735982	736014	b	b	-
+chr2	735982	736014	b	b	-
+chr2	735982	736014	b	b	-
+chr2	736015	736047	a	a	+
+chr2	736015	736047	a	a	+
+chr2	736015	736047	a	a	+
+chr2	736017	736049	a	a	+
+chr2	736018	736050	a	a	+
+chr2	735990	736022	b	b	-
+chr2	736025	736057	a	a	+
+chr2	735995	736027	b	b	-
+chr2	735995	736027	b	b	-
+chr2	735996	736028	b	b	-
+chr2	735996	736028	b	b	-
+chr2	735997	736029	b	b	-
+chr2	736032	736064	a	a	+
+chr2	736212	736244	b	b	-
+chr2	736250	736282	a	a	+
+chr2	736255	736287	a	a	+
+chr2	736230	736262	b	b	-
+chr2	736263	736295	a	a	+
+chr2	736269	736301	a	a	+
+chr2	736271	736303	a	a	+
+chr2	736271	736303	a	a	+
+chr2	736241	736273	b	b	-
+chr2	736245	736277	b	b	-
+chr2	736245	736277	b	b	-
+chr2	736279	736311	a	a	+
+chr2	736280	736312	a	a	+
+chr2	736249	736281	b	b	-
+chr2	736282	736314	a	a	+
+chr2	736283	736315	a	a	+
+chr2	736257	736289	b	b	-
+chr2	736290	736322	a	a	+
+chr2	736293	736325	a	a	+
+chr2	736293	736325	a	a	+
+chr2	736267	736299	b	b	-
+chr2	736301	736333	a	a	+
+chr2	736272	736304	b	b	-
+chr2	736275	736307	b	b	-
+chr2	736312	736344	a	a	+
+chr2	736406	736438	a	a	+
+chr2	736424	736456	a	a	+
+chr2	736425	736457	a	a	+
+chr2	736425	736457	a	a	+
+chr2	736422	736454	b	b	-
+chr2	736456	736488	a	a	+
+chr2	736473	736505	a	a	+
+chr2	736577	736609	a	a	+
+chr2	736599	736631	a	a	+
+chr2	736657	736689	a	a	+
+chr2	736748	736780	b	b	-
+chr2	736892	736924	b	b	-
+chr2	737109	737141	a	a	+
+chr2	737181	737213	b	b	-
+chr2	737249	737281	b	b	-
+chr2	737344	737376	b	b	-
+chr2	737922	737954	b	b	-
+chr2	737936	737968	b	b	-
+chr2	737985	738017	a	a	+
+chr2	737955	737987	b	b	-
+chr2	738001	738033	a	a	+
+chr2	738002	738034	a	a	+
+chr2	738014	738046	b	b	-
+chr2	738109	738141	b	b	-
+chr2	738142	738174	a	a	+
+chr2	738145	738177	a	a	+
+chr2	738133	738165	b	b	-
+chr2	738198	738230	b	b	-
+chr2	738223	738255	b	b	-
+chr2	738230	738262	b	b	-
+chr2	738254	738286	b	b	-
+chr2	738303	738335	a	a	+
+chr2	738303	738335	a	a	+
+chr2	738273	738305	b	b	-
+chr2	738274	738306	b	b	-
+chr2	738308	738340	a	a	+
+chr2	738311	738343	a	a	+
+chr2	738313	738345	a	a	+
+chr2	738281	738313	b	b	-
+chr2	738284	738316	b	b	-
+chr2	738317	738349	a	a	+
+chr2	738287	738319	b	b	-
+chr2	738287	738319	b	b	-
+chr2	738287	738319	b	b	-
+chr2	738288	738320	b	b	-
+chr2	738290	738322	b	b	-
+chr2	738291	738323	b	b	-
+chr2	738328	738360	a	a	+
+chr2	738332	738364	a	a	+
+chr2	738301	738333	b	b	-
+chr2	738302	738334	b	b	-
+chr2	738303	738335	b	b	-
+chr2	738331	738363	b	b	-
+chr2	738437	738469	b	b	-
+chr2	738519	738551	b	b	-
+chr2	738544	738576	b	b	-
+chr2	738544	738576	b	b	-
+chr2	738577	738609	a	a	+
+chr2	738545	738577	b	b	-
+chr2	738545	738577	b	b	-
+chr2	738545	738577	b	b	-
+chr2	738545	738577	b	b	-
+chr2	738545	738577	b	b	-
+chr2	738588	738620	a	a	+
+chr2	738620	738652	a	a	+
+chr2	738620	738652	a	a	+
+chr2	738620	738652	a	a	+
+chr2	738627	738659	a	a	+
+chr2	738627	738659	a	a	+
+chr2	738634	738666	a	a	+
+chr2	738683	738715	b	b	-
+chr2	738711	738743	b	b	-
+chr2	738718	738750	b	b	-
+chr2	738718	738750	b	b	-
+chr2	738720	738752	b	b	-
+chr2	738753	738785	a	a	+
+chr2	738760	738792	a	a	+
+chr2	738761	738793	a	a	+
+chr2	738767	738799	a	a	+
+chr2	738752	738784	b	b	-
+chr2	738809	738841	a	a	+
+chr2	738809	738841	a	a	+
+chr2	738884	738916	b	b	-
+chr2	738890	738922	b	b	-
+chr2	738892	738924	b	b	-
+chr2	738985	739017	b	b	-
+chr2	738985	739017	b	b	-
+chr2	739029	739061	b	b	-
+chr2	739112	739144	b	b	-
+chr2	739282	739314	a	a	+
+chr2	739434	739466	a	a	+
+chr2	739406	739438	b	b	-
+chr2	739410	739442	b	b	-
+chr2	739462	739494	a	a	+
+chr2	739478	739510	b	b	-
+chr2	739518	739550	b	b	-
+chr2	739526	739558	b	b	-
+chr2	739532	739564	b	b	-
+chr2	739582	739614	a	a	+
+chr2	739591	739623	a	a	+
+chr2	739608	739640	a	a	+
+chr2	739771	739803	b	b	-
+chr2	739847	739879	a	a	+
+chr2	739863	739895	a	a	+
+chr2	739874	739906	a	a	+
+chr2	739877	739909	a	a	+
+chr2	739850	739882	b	b	-
+chr2	739884	739916	a	a	+
+chr2	739852	739884	b	b	-
+chr2	739852	739884	b	b	-
+chr2	739986	740018	b	b	-
+chr2	739987	740019	b	b	-
+chr2	740400	740432	a	a	+
+chr2	740480	740512	b	b	-
+chr2	740488	740520	b	b	-
+chr2	740488	740520	b	b	-
+chr2	740661	740693	b	b	-
+chr2	741031	741063	a	a	+
+chr2	740999	741031	b	b	-
+chr2	741056	741088	a	a	+
+chr2	741040	741072	b	b	-
+chr2	741233	741265	b	b	-
+chr2	741296	741328	a	a	+
+chr2	741284	741316	b	b	-
+chr2	741285	741317	b	b	-
+chr2	741287	741319	b	b	-
+chr2	741322	741354	a	a	+
+chr2	741322	741354	a	a	+
+chr2	741295	741327	b	b	-
+chr2	741295	741327	b	b	-
+chr2	741295	741327	b	b	-
+chr2	741295	741327	b	b	-
+chr2	741295	741327	b	b	-
+chr2	741296	741328	b	b	-
+chr2	741296	741328	b	b	-
+chr2	741296	741328	b	b	-
+chr2	741296	741328	b	b	-
+chr2	741296	741328	b	b	-
+chr2	741296	741328	b	b	-
+chr2	741297	741329	b	b	-
+chr2	741297	741329	b	b	-
+chr2	741330	741362	a	a	+
+chr2	741298	741330	b	b	-
+chr2	741331	741363	a	a	+
+chr2	741331	741363	a	a	+
+chr2	741332	741364	a	a	+
+chr2	741332	741364	a	a	+
+chr2	741334	741366	a	a	+
+chr2	741334	741366	a	a	+
+chr2	741302	741334	b	b	-
+chr2	741302	741334	b	b	-
+chr2	741335	741367	a	a	+
+chr2	741335	741367	a	a	+
+chr2	741337	741369	a	a	+
+chr2	741349	741381	a	a	+
+chr2	741319	741351	b	b	-
+chr2	741321	741353	b	b	-
+chr2	741399	741431	a	a	+
+chr2	741399	741431	a	a	+
+chr2	741399	741431	a	a	+
+chr2	741425	741457	a	a	+
+chr2	741437	741469	a	a	+
+chr2	741430	741462	b	b	-
+chr2	741478	741510	a	a	+
+chr2	741450	741482	b	b	-
+chr2	741491	741523	a	a	+
+chr2	741501	741533	a	a	+
+chr2	741503	741535	a	a	+
+chr2	741631	741663	a	a	+
+chr2	741631	741663	a	a	+
+chr2	741836	741868	b	b	-
+chr2	741904	741936	a	a	+
+chr2	741878	741910	b	b	-
+chr2	741913	741945	a	a	+
+chr2	741930	741962	a	a	+
+chr2	741898	741930	b	b	-
+chr2	741932	741964	a	a	+
+chr2	741905	741937	b	b	-
+chr2	741905	741937	b	b	-
+chr2	741946	741978	a	a	+
+chr2	741968	742000	a	a	+
+chr2	742194	742226	b	b	-
+chr2	742194	742226	b	b	-
+chr2	742194	742226	b	b	-
+chr2	742331	742363	b	b	-
+chr2	742331	742363	b	b	-
+chr2	742375	742407	a	a	+
+chr2	742381	742413	a	a	+
+chr2	742383	742415	a	a	+
+chr2	742353	742385	b	b	-
+chr2	742360	742392	b	b	-
+chr2	742385	742417	b	b	-
+chr2	742497	742529	a	a	+
+chr2	742505	742537	a	a	+
+chr2	742476	742508	b	b	-
+chr2	742510	742542	a	a	+
+chr2	742478	742510	b	b	-
+chr2	742503	742535	b	b	-
+chr2	742505	742537	b	b	-
+chr2	742505	742537	b	b	-
+chr2	742536	742568	b	b	-
+chr2	742569	742601	a	a	+
+chr2	742735	742767	b	b	-
+chr2	742794	742826	a	a	+
+chr2	742794	742826	a	a	+
+chr2	742778	742810	b	b	-
+chr2	742815	742847	a	a	+
+chr2	742783	742815	b	b	-
+chr2	742784	742816	b	b	-
+chr2	742786	742818	b	b	-
+chr2	742786	742818	b	b	-
+chr2	742786	742818	b	b	-
+chr2	742790	742822	b	b	-
+chr2	742823	742855	a	a	+
+chr2	742796	742828	b	b	-
+chr2	742796	742828	b	b	-
+chr2	742797	742829	b	b	-
+chr2	742797	742829	b	b	-
+chr2	742798	742830	b	b	-
+chr2	742799	742831	b	b	-
+chr2	742835	742867	a	a	+
+chr2	742835	742867	a	a	+
+chr2	742835	742867	a	a	+
+chr2	742837	742869	a	a	+
+chr2	742840	742872	a	a	+
+chr2	742965	742997	a	a	+
+chr2	743019	743051	a	a	+
+chr2	743024	743056	b	b	-
+chr2	743098	743130	b	b	-
+chr2	743098	743130	b	b	-
+chr2	743145	743177	a	a	+
+chr2	743193	743225	a	a	+
+chr2	743224	743256	b	b	-
+chr2	743224	743256	b	b	-
+chr2	743324	743356	a	a	+
+chr2	743423	743455	b	b	-
+chr2	743575	743607	a	a	+
+chr2	743573	743605	b	b	-
+chr2	743820	743852	b	b	-
+chr2	743820	743852	b	b	-
+chr2	743860	743892	a	a	+
+chr2	743880	743912	a	a	+
+chr2	743991	744023	b	b	-
+chr2	744004	744036	b	b	-
+chr2	744004	744036	b	b	-
+chr2	744011	744043	b	b	-
+chr2	744071	744103	a	a	+
+chr2	744042	744074	b	b	-
+chr2	744046	744078	b	b	-
+chr2	744046	744078	b	b	-
+chr2	744174	744206	a	a	+
+chr2	744190	744222	a	a	+
+chr2	744166	744198	b	b	-
+chr2	744201	744233	a	a	+
+chr2	744202	744234	a	a	+
+chr2	744208	744240	a	a	+
+chr2	744186	744218	b	b	-
+chr2	744186	744218	b	b	-
+chr2	744186	744218	b	b	-
+chr2	744186	744218	b	b	-
+chr2	744226	744258	a	a	+
+chr2	744226	744258	a	a	+
+chr2	744226	744258	a	a	+
+chr2	744209	744241	b	b	-
+chr2	744209	744241	b	b	-
+chr2	744249	744281	a	a	+
+chr2	744249	744281	a	a	+
+chr2	744260	744292	b	b	-
+chr2	744264	744296	b	b	-
+chr2	744333	744365	a	a	+
+chr2	744317	744349	b	b	-
+chr2	744351	744383	a	a	+
+chr2	744324	744356	b	b	-
+chr2	744330	744362	b	b	-
+chr2	744332	744364	b	b	-
+chr2	744332	744364	b	b	-
+chr2	744369	744401	a	a	+
+chr2	744338	744370	b	b	-
+chr2	744338	744370	b	b	-
+chr2	744338	744370	b	b	-
+chr2	744340	744372	b	b	-
+chr2	744373	744405	a	a	+
+chr2	744373	744405	a	a	+
+chr2	744374	744406	a	a	+
+chr2	744374	744406	a	a	+
+chr2	744374	744406	a	a	+
+chr2	744374	744406	a	a	+
+chr2	744374	744406	a	a	+
+chr2	744343	744375	b	b	-
+chr2	744343	744375	b	b	-
+chr2	744344	744376	b	b	-
+chr2	744345	744377	b	b	-
+chr2	744345	744377	b	b	-
+chr2	744347	744379	b	b	-
+chr2	744382	744414	a	a	+
+chr2	744352	744384	b	b	-
+chr2	744354	744386	b	b	-
+chr2	744357	744389	b	b	-
+chr2	744357	744389	b	b	-
+chr2	744392	744424	a	a	+
+chr2	744392	744424	a	a	+
+chr2	744361	744393	b	b	-
+chr2	744361	744393	b	b	-
+chr2	744364	744396	b	b	-
+chr2	744364	744396	b	b	-
+chr2	744364	744396	b	b	-
+chr2	744364	744396	b	b	-
+chr2	744364	744396	b	b	-
+chr2	744398	744430	a	a	+
+chr2	744400	744432	a	a	+
+chr2	744406	744438	a	a	+
+chr2	744376	744408	b	b	-
+chr2	744376	744408	b	b	-
+chr2	744420	744452	a	a	+
+chr2	744535	744567	b	b	-
+chr2	744576	744608	a	a	+
+chr2	744558	744590	b	b	-
+chr2	744600	744632	a	a	+
+chr2	744568	744600	b	b	-
+chr2	744568	744600	b	b	-
+chr2	744604	744636	a	a	+
+chr2	744606	744638	a	a	+
+chr2	744608	744640	a	a	+
+chr2	744608	744640	a	a	+
+chr2	744608	744640	a	a	+
+chr2	744608	744640	a	a	+
+chr2	744609	744641	a	a	+
+chr2	744609	744641	a	a	+
+chr2	744609	744641	a	a	+
+chr2	744609	744641	a	a	+
+chr2	744577	744609	b	b	-
+chr2	744577	744609	b	b	-
+chr2	744577	744609	b	b	-
+chr2	744578	744610	b	b	-
+chr2	744578	744610	b	b	-
+chr2	744581	744613	b	b	-
+chr2	744616	744648	a	a	+
+chr2	744617	744649	a	a	+
+chr2	744617	744649	a	a	+
+chr2	744623	744655	a	a	+
+chr2	744624	744656	a	a	+
+chr2	744594	744626	b	b	-
+chr2	744594	744626	b	b	-
+chr2	744594	744626	b	b	-
+chr2	744594	744626	b	b	-
+chr2	744594	744626	b	b	-
+chr2	744595	744627	b	b	-
+chr2	744631	744663	a	a	+
+chr2	744631	744663	a	a	+
+chr2	744609	744641	b	b	-
+chr2	744610	744642	b	b	-
+chr2	744650	744682	a	a	+
+chr2	744622	744654	b	b	-
+chr2	744806	744838	b	b	-
+chr2	744855	744887	a	a	+
+chr2	744864	744896	a	a	+
+chr2	744864	744896	a	a	+
+chr2	744864	744896	a	a	+
+chr2	744869	744901	a	a	+
+chr2	744837	744869	b	b	-
+chr2	744870	744902	a	a	+
+chr2	744873	744905	a	a	+
+chr2	744842	744874	b	b	-
+chr2	744842	744874	b	b	-
+chr2	744842	744874	b	b	-
+chr2	744842	744874	b	b	-
+chr2	744843	744875	b	b	-
+chr2	744879	744911	a	a	+
+chr2	744848	744880	b	b	-
+chr2	744881	744913	a	a	+
+chr2	744881	744913	a	a	+
+chr2	744850	744882	b	b	-
+chr2	744851	744883	b	b	-
+chr2	744886	744918	a	a	+
+chr2	744886	744918	a	a	+
+chr2	744893	744925	a	a	+
+chr2	744914	744946	a	a	+
+chr2	744920	744952	a	a	+
+chr2	744988	745020	a	a	+
+chr2	744984	745016	b	b	-
+chr2	744984	745016	b	b	-
+chr2	744986	745018	b	b	-
+chr2	744997	745029	b	b	-
+chr2	745037	745069	a	a	+
+chr2	745013	745045	b	b	-
+chr2	745048	745080	a	a	+
+chr2	745018	745050	b	b	-
+chr2	745149	745181	b	b	-
+chr2	745372	745404	a	a	+
+chr2	745669	745701	b	b	-
+chr2	745838	745870	a	a	+
+chr2	746320	746352	a	a	+
+chr2	746531	746563	b	b	-
+chr2	746878	746910	b	b	-
+chr2	746931	746963	a	a	+
+chr2	747116	747148	a	a	+
+chr2	747234	747266	b	b	-
+chr2	747269	747301	a	a	+
+chr2	747393	747425	a	a	+
+chr2	747413	747445	a	a	+
+chr2	747413	747445	a	a	+
+chr2	747413	747445	a	a	+
+chr2	747391	747423	b	b	-
+chr2	747466	747498	a	a	+
+chr2	747549	747581	b	b	-
+chr2	747590	747622	a	a	+
+chr2	747561	747593	b	b	-
+chr2	747568	747600	b	b	-
+chr2	747568	747600	b	b	-
+chr2	747607	747639	a	a	+
+chr2	747706	747738	b	b	-
+chr2	747739	747771	a	a	+
+chr2	747746	747778	a	a	+
+chr2	747715	747747	b	b	-
+chr2	747715	747747	b	b	-
+chr2	747750	747782	a	a	+
+chr2	747725	747757	b	b	-
+chr2	747725	747757	b	b	-
+chr2	747725	747757	b	b	-
+chr2	747727	747759	b	b	-
+chr2	747760	747792	a	a	+
+chr2	747732	747764	b	b	-
+chr2	747732	747764	b	b	-
+chr2	747775	747807	a	a	+
+chr2	747744	747776	b	b	-
+chr2	747777	747809	a	a	+
+chr2	747746	747778	b	b	-
+chr2	747779	747811	a	a	+
+chr2	747753	747785	b	b	-
+chr2	747789	747821	a	a	+
+chr2	747759	747791	b	b	-
+chr2	747761	747793	b	b	-
+chr2	747761	747793	b	b	-
+chr2	748118	748150	b	b	-
+chr2	748118	748150	b	b	-
+chr2	748119	748151	b	b	-
+chr2	748130	748162	b	b	-
+chr2	748281	748313	b	b	-
+chr2	748369	748401	b	b	-
+chr2	748438	748470	b	b	-
+chr2	748438	748470	b	b	-
+chr2	748511	748543	a	a	+
+chr2	748954	748986	b	b	-
+chr2	748954	748986	b	b	-
+chr2	748961	748993	b	b	-
+chr2	748961	748993	b	b	-
+chr2	749004	749036	a	a	+
+chr2	748980	749012	b	b	-
+chr2	749022	749054	a	a	+
+chr2	749022	749054	a	a	+
+chr2	749027	749059	a	a	+
+chr2	749150	749182	a	a	+
+chr2	749130	749162	b	b	-
+chr2	749139	749171	b	b	-
+chr2	749139	749171	b	b	-
+chr2	749139	749171	b	b	-
+chr2	749141	749173	b	b	-
+chr2	749141	749173	b	b	-
+chr2	749159	749191	b	b	-
+chr2	749249	749281	b	b	-
+chr2	749311	749343	a	a	+
+chr2	749321	749353	a	a	+
+chr2	749322	749354	a	a	+
+chr2	749322	749354	a	a	+
+chr2	749291	749323	b	b	-
+chr2	749325	749357	a	a	+
+chr2	749295	749327	b	b	-
+chr2	749296	749328	b	b	-
+chr2	749296	749328	b	b	-
+chr2	749330	749362	a	a	+
+chr2	749330	749362	a	a	+
+chr2	749298	749330	b	b	-
+chr2	749331	749363	a	a	+
+chr2	749331	749363	a	a	+
+chr2	749300	749332	b	b	-
+chr2	749333	749365	a	a	+
+chr2	749333	749365	a	a	+
+chr2	749333	749365	a	a	+
+chr2	749302	749334	b	b	-
+chr2	749302	749334	b	b	-
+chr2	749302	749334	b	b	-
+chr2	749302	749334	b	b	-
+chr2	749302	749334	b	b	-
+chr2	749303	749335	b	b	-
+chr2	749303	749335	b	b	-
+chr2	749337	749369	a	a	+
+chr2	749337	749369	a	a	+
+chr2	749306	749338	b	b	-
+chr2	749309	749341	b	b	-
+chr2	749309	749341	b	b	-
+chr2	749309	749341	b	b	-
+chr2	749309	749341	b	b	-
+chr2	749309	749341	b	b	-
+chr2	749309	749341	b	b	-
+chr2	749345	749377	a	a	+
+chr2	749313	749345	b	b	-
+chr2	749317	749349	b	b	-
+chr2	749317	749349	b	b	-
+chr2	749317	749349	b	b	-
+chr2	749317	749349	b	b	-
+chr2	749317	749349	b	b	-
+chr2	749353	749385	a	a	+
+chr2	749361	749393	a	a	+
+chr2	749333	749365	b	b	-
+chr2	749346	749378	b	b	-
+chr2	749347	749379	b	b	-
+chr2	749385	749417	a	a	+
+chr2	749401	749433	a	a	+
+chr2	749369	749401	b	b	-
+chr2	749370	749402	b	b	-
+chr2	749405	749437	a	a	+
+chr2	749553	749585	a	a	+
+chr2	749537	749569	b	b	-
+chr2	749543	749575	b	b	-
+chr2	749578	749610	a	a	+
+chr2	749581	749613	a	a	+
+chr2	749582	749614	a	a	+
+chr2	749582	749614	a	a	+
+chr2	749585	749617	a	a	+
+chr2	749585	749617	a	a	+
+chr2	749585	749617	a	a	+
+chr2	749585	749617	a	a	+
+chr2	749585	749617	a	a	+
+chr2	749585	749617	a	a	+
+chr2	749585	749617	a	a	+
+chr2	749585	749617	a	a	+
+chr2	749585	749617	a	a	+
+chr2	749586	749618	a	a	+
+chr2	749586	749618	a	a	+
+chr2	749586	749618	a	a	+
+chr2	749558	749590	b	b	-
+chr2	749558	749590	b	b	-
+chr2	749558	749590	b	b	-
+chr2	749596	749628	a	a	+
+chr2	749596	749628	a	a	+
+chr2	749597	749629	a	a	+
+chr2	749598	749630	a	a	+
+chr2	749598	749630	a	a	+
+chr2	749568	749600	b	b	-
+chr2	749568	749600	b	b	-
+chr2	749569	749601	b	b	-
+chr2	749569	749601	b	b	-
+chr2	749569	749601	b	b	-
+chr2	749570	749602	b	b	-
+chr2	749571	749603	b	b	-
+chr2	749604	749636	a	a	+
+chr2	749618	749650	a	a	+
+chr2	749618	749650	a	a	+
+chr2	749626	749658	a	a	+
+chr2	749712	749744	b	b	-
+chr2	749761	749793	a	a	+
+chr2	749732	749764	b	b	-
+chr2	749749	749781	b	b	-
+chr2	749928	749960	b	b	-
+chr2	750115	750147	a	a	+
+chr2	750089	750121	b	b	-
+chr2	750125	750157	a	a	+
+chr2	750162	750194	a	a	+
+chr2	750183	750215	a	a	+
+chr2	750389	750421	a	a	+
+chr2	750389	750421	a	a	+
+chr2	750386	750418	b	b	-
+chr2	750397	750429	b	b	-
+chr2	750403	750435	b	b	-
+chr2	750405	750437	b	b	-
+chr2	750446	750478	b	b	-
+chr2	750569	750601	a	a	+
+chr2	750570	750602	a	a	+
+chr2	750607	750639	b	b	-
+chr2	751044	751076	b	b	-
+chr2	751088	751120	a	a	+
+chr2	751132	751164	b	b	-
+chr2	751528	751560	b	b	-
+chr2	751570	751602	a	a	+
+chr2	751775	751807	a	a	+
+chr2	752839	752871	a	a	+
+chr2	752843	752875	a	a	+
+chr2	753013	753045	a	a	+
+chr2	753130	753162	a	a	+
+chr2	753213	753245	b	b	-
+chr2	753218	753250	b	b	-
+chr2	753704	753736	b	b	-
+chr2	754173	754205	a	a	+
+chr2	754416	754448	b	b	-
+chr2	754730	754762	b	b	-
+chr2	754915	754947	b	b	-
+chr2	755799	755831	a	a	+
+chr2	756034	756066	a	a	+
+chr2	756448	756480	a	a	+
+chr2	756461	756493	a	a	+
+chr2	756447	756479	b	b	-
+chr2	756654	756686	b	b	-
+chr2	756795	756827	a	a	+
+chr2	756775	756807	b	b	-
+chr2	756853	756885	a	a	+
+chr2	756869	756901	a	a	+
+chr2	756986	757018	a	a	+
+chr2	756986	757018	a	a	+
+chr2	756958	756990	b	b	-
+chr2	756975	757007	b	b	-
+chr2	757022	757054	a	a	+
+chr2	757142	757174	a	a	+
+chr2	757143	757175	a	a	+
+chr2	757146	757178	a	a	+
+chr2	757155	757187	a	a	+
+chr2	757156	757188	a	a	+
+chr2	757129	757161	b	b	-
+chr2	757130	757162	b	b	-
+chr2	757131	757163	b	b	-
+chr2	757131	757163	b	b	-
+chr2	757164	757196	a	a	+
+chr2	757165	757197	a	a	+
+chr2	757138	757170	b	b	-
+chr2	757175	757207	a	a	+
+chr2	757152	757184	b	b	-
+chr2	757152	757184	b	b	-
+chr2	757205	757237	a	a	+
+chr2	757222	757254	b	b	-
+chr2	757375	757407	b	b	-
+chr2	757379	757411	b	b	-
+chr2	757389	757421	b	b	-
+chr2	757389	757421	b	b	-
+chr2	757389	757421	b	b	-
+chr2	757430	757462	a	a	+
+chr2	757739	757771	b	b	-
+chr2	757792	757824	a	a	+
+chr2	757799	757831	a	a	+
+chr2	757799	757831	a	a	+
+chr2	757805	757837	a	a	+
+chr2	757815	757847	a	a	+
+chr2	757834	757866	a	a	+
+chr2	757834	757866	a	a	+
+chr2	758054	758086	b	b	-
+chr2	759043	759075	b	b	-
+chr2	759138	759170	b	b	-
+chr2	759517	759549	b	b	-
+chr2	759905	759937	b	b	-
+chr2	760005	760037	a	a	+
+chr2	760005	760037	b	b	-
+chr2	760042	760074	a	a	+
+chr2	760028	760060	b	b	-
+chr2	760028	760060	b	b	-
+chr2	760034	760066	b	b	-
+chr2	760036	760068	b	b	-
+chr2	760069	760101	a	a	+
+chr2	760072	760104	a	a	+
+chr2	760075	760107	a	a	+
+chr2	760078	760110	a	a	+
+chr2	760049	760081	b	b	-
+chr2	760049	760081	b	b	-
+chr2	760083	760115	a	a	+
+chr2	760059	760091	b	b	-
+chr2	760059	760091	b	b	-
+chr2	760092	760124	a	a	+
+chr2	760233	760265	a	a	+
+chr2	760218	760250	b	b	-
+chr2	760306	760338	a	a	+
+chr2	760274	760306	b	b	-
+chr2	760309	760341	a	a	+
+chr2	760277	760309	b	b	-
+chr2	760278	760310	b	b	-
+chr2	760278	760310	b	b	-
+chr2	760278	760310	b	b	-
+chr2	760285	760317	b	b	-
+chr2	760318	760350	a	a	+
+chr2	760331	760363	a	a	+
+chr2	760302	760334	b	b	-
+chr2	760312	760344	b	b	-
+chr2	760313	760345	b	b	-
+chr2	760434	760466	b	b	-
+chr2	760468	760500	a	a	+
+chr2	760440	760472	b	b	-
+chr2	760481	760513	a	a	+
+chr2	760456	760488	b	b	-
+chr2	760456	760488	b	b	-
+chr2	760506	760538	a	a	+
+chr2	760483	760515	b	b	-
+chr2	760518	760550	a	a	+
+chr2	760519	760551	a	a	+
+chr2	760521	760553	b	b	-
+chr2	760521	760553	b	b	-
+chr2	760591	760623	a	a	+
+chr2	760637	760669	a	a	+
+chr2	760667	760699	a	a	+
+chr2	760674	760706	a	a	+
+chr2	760681	760713	a	a	+
+chr2	760682	760714	a	a	+
+chr2	760682	760714	a	a	+
+chr2	760657	760689	b	b	-
+chr2	760657	760689	b	b	-
+chr2	760657	760689	b	b	-
+chr2	760688	760720	b	b	-
+chr2	760790	760822	a	a	+
+chr2	760786	760818	b	b	-
+chr2	760788	760820	b	b	-
+chr2	760828	760860	a	a	+
+chr2	760830	760862	a	a	+
+chr2	760832	760864	a	a	+
+chr2	760800	760832	b	b	-
+chr2	760833	760865	a	a	+
+chr2	760833	760865	a	a	+
+chr2	760803	760835	b	b	-
+chr2	760807	760839	b	b	-
+chr2	760841	760873	a	a	+
+chr2	760841	760873	a	a	+
+chr2	760841	760873	a	a	+
+chr2	760809	760841	b	b	-
+chr2	760809	760841	b	b	-
+chr2	760809	760841	b	b	-
+chr2	760809	760841	b	b	-
+chr2	760842	760874	a	a	+
+chr2	760842	760874	a	a	+
+chr2	760810	760842	b	b	-
+chr2	760811	760843	b	b	-
+chr2	760811	760843	b	b	-
+chr2	760811	760843	b	b	-
+chr2	760844	760876	a	a	+
+chr2	760813	760845	b	b	-
+chr2	760813	760845	b	b	-
+chr2	760813	760845	b	b	-
+chr2	760813	760845	b	b	-
+chr2	760848	760880	a	a	+
+chr2	760849	760881	a	a	+
+chr2	760849	760881	a	a	+
+chr2	760850	760882	a	a	+
+chr2	760820	760852	b	b	-
+chr2	760820	760852	b	b	-
+chr2	760842	760874	b	b	-
+chr2	760857	760889	b	b	-
+chr2	760895	760927	a	a	+
+chr2	760868	760900	b	b	-
+chr2	761209	761241	b	b	-
+chr2	761250	761282	a	a	+
+chr2	761268	761300	a	a	+
+chr2	761269	761301	a	a	+
+chr2	761269	761301	a	a	+
+chr2	761269	761301	a	a	+
+chr2	761269	761301	a	a	+
+chr2	761269	761301	a	a	+
+chr2	761269	761301	a	a	+
+chr2	761239	761271	b	b	-
+chr2	761241	761273	b	b	-
+chr2	761248	761280	b	b	-
+chr2	761248	761280	b	b	-
+chr2	761282	761314	a	a	+
+chr2	761283	761315	a	a	+
+chr2	761253	761285	b	b	-
+chr2	761253	761285	b	b	-
+chr2	761253	761285	b	b	-
+chr2	761288	761320	a	a	+
+chr2	761288	761320	a	a	+
+chr2	761258	761290	b	b	-
+chr2	761258	761290	b	b	-
+chr2	761258	761290	b	b	-
+chr2	761258	761290	b	b	-
+chr2	761292	761324	a	a	+
+chr2	761292	761324	a	a	+
+chr2	761293	761325	a	a	+
+chr2	761304	761336	b	b	-
+chr2	761345	761377	a	a	+
+chr2	761376	761408	b	b	-
+chr2	761417	761449	a	a	+
+chr2	761385	761417	b	b	-
+chr2	761421	761453	a	a	+
+chr2	761426	761458	a	a	+
+chr2	761426	761458	a	a	+
+chr2	761426	761458	a	a	+
+chr2	761426	761458	a	a	+
+chr2	761395	761427	b	b	-
+chr2	761403	761435	b	b	-
+chr2	761404	761436	b	b	-
+chr2	761581	761613	a	a	+
+chr2	761596	761628	a	a	+
+chr2	761571	761603	b	b	-
+chr2	761768	761800	b	b	-
+chr2	761936	761968	a	a	+
+chr2	762460	762492	a	a	+
+chr2	762831	762863	b	b	-
+chr2	762866	762898	a	a	+
+chr2	762902	762934	a	a	+
+chr2	762917	762949	b	b	-
+chr2	763215	763247	a	a	+
+chr2	763519	763551	a	a	+
+chr2	763498	763530	b	b	-
+chr2	763654	763686	b	b	-
+chr2	763735	763767	a	a	+
+chr2	763735	763767	b	b	-
+chr2	763755	763787	b	b	-
+chr2	763755	763787	b	b	-
+chr2	763805	763837	a	a	+
+chr2	763773	763805	b	b	-
+chr2	763846	763878	a	a	+
+chr2	763865	763897	a	a	+
+chr2	763908	763940	a	a	+
+chr2	763916	763948	a	a	+
+chr2	763927	763959	a	a	+
+chr2	763903	763935	b	b	-
+chr2	763903	763935	b	b	-
+chr2	763936	763968	a	a	+
+chr2	763947	763979	a	a	+
+chr2	763948	763980	a	a	+
+chr2	764028	764060	a	a	+
+chr2	764029	764061	a	a	+
+chr2	764033	764065	a	a	+
+chr2	764106	764138	b	b	-
+chr2	764123	764155	b	b	-
+chr2	764167	764199	a	a	+
+chr2	764177	764209	a	a	+
+chr2	764197	764229	a	a	+
+chr2	764176	764208	b	b	-
+chr2	764178	764210	b	b	-
+chr2	764178	764210	b	b	-
+chr2	764235	764267	a	a	+
+chr2	764284	764316	b	b	-
+chr2	764334	764366	a	a	+
+chr2	764336	764368	a	a	+
+chr2	764337	764369	a	a	+
+chr2	764337	764369	a	a	+
+chr2	764311	764343	b	b	-
+chr2	764311	764343	b	b	-
+chr2	764321	764353	b	b	-
+chr2	764357	764389	a	a	+
+chr2	764357	764389	a	a	+
+chr2	764357	764389	a	a	+
+chr2	764344	764376	b	b	-
+chr2	764347	764379	b	b	-
+chr2	764382	764414	a	a	+
+chr2	764382	764414	a	a	+
+chr2	764382	764414	a	a	+
+chr2	764357	764389	b	b	-
+chr2	764397	764429	a	a	+
+chr2	764432	764464	a	a	+
+chr2	764448	764480	a	a	+
+chr2	764445	764477	b	b	-
+chr2	764460	764492	b	b	-
+chr2	764488	764520	b	b	-
+chr2	764491	764523	b	b	-
+chr2	764567	764599	a	a	+
+chr2	764617	764649	b	b	-
+chr2	764678	764710	a	a	+
+chr2	764691	764723	a	a	+
+chr2	764691	764723	a	a	+
+chr2	764692	764724	a	a	+
+chr2	764696	764728	a	a	+
+chr2	764696	764728	a	a	+
+chr2	764664	764696	b	b	-
+chr2	764664	764696	b	b	-
+chr2	764664	764696	b	b	-
+chr2	764664	764696	b	b	-
+chr2	764664	764696	b	b	-
+chr2	764664	764696	b	b	-
+chr2	764664	764696	b	b	-
+chr2	764664	764696	b	b	-
+chr2	764665	764697	b	b	-
+chr2	764701	764733	a	a	+
+chr2	764701	764733	a	a	+
+chr2	764675	764707	b	b	-
+chr2	764677	764709	b	b	-
+chr2	764678	764710	b	b	-
+chr2	765110	765142	a	a	+
+chr2	765110	765142	a	a	+
+chr2	765082	765114	b	b	-
+chr2	765247	765279	b	b	-
+chr2	765284	765316	a	a	+
+chr2	765375	765407	a	a	+
+chr2	765427	765459	a	a	+
+chr2	765595	765627	b	b	-
+chr2	765595	765627	b	b	-
+chr2	766658	766690	b	b	-
+chr2	766658	766690	b	b	-
+chr2	766754	766786	a	a	+
+chr2	767201	767233	b	b	-
+chr2	767237	767269	b	b	-
+chr2	767300	767332	a	a	+
+chr2	767300	767332	a	a	+
+chr2	767300	767332	a	a	+
+chr2	767300	767332	a	a	+
+chr2	767302	767334	a	a	+
+chr2	767365	767397	b	b	-
+chr2	767397	767429	b	b	-
+chr2	767431	767463	a	a	+
+chr2	767432	767464	a	a	+
+chr2	767417	767449	b	b	-
+chr2	767424	767456	b	b	-
+chr2	767457	767489	a	a	+
+chr2	767458	767490	a	a	+
+chr2	767527	767559	a	a	+
+chr2	767562	767594	a	a	+
+chr2	767569	767601	a	a	+
+chr2	767537	767569	b	b	-
+chr2	767539	767571	b	b	-
+chr2	767541	767573	b	b	-
+chr2	767576	767608	a	a	+
+chr2	767576	767608	a	a	+
+chr2	767586	767618	a	a	+
+chr2	767586	767618	a	a	+
+chr2	767559	767591	b	b	-
+chr2	767559	767591	b	b	-
+chr2	767592	767624	a	a	+
+chr2	767560	767592	b	b	-
+chr2	767561	767593	b	b	-
+chr2	767566	767598	b	b	-
+chr2	767569	767601	b	b	-
+chr2	767569	767601	b	b	-
+chr2	767569	767601	b	b	-
+chr2	767574	767606	b	b	-
+chr2	767574	767606	b	b	-
+chr2	767574	767606	b	b	-
+chr2	767616	767648	a	a	+
+chr2	767585	767617	b	b	-
+chr2	767624	767656	a	a	+
+chr2	767624	767656	a	a	+
+chr2	767595	767627	b	b	-
+chr2	767595	767627	b	b	-
+chr2	767820	767852	a	a	+
+chr2	767820	767852	a	a	+
+chr2	767822	767854	a	a	+
+chr2	767857	767889	b	b	-
+chr2	767972	768004	a	a	+
+chr2	767953	767985	b	b	-
+chr2	768226	768258	a	a	+
+chr2	768194	768226	b	b	-
+chr2	768200	768232	b	b	-
+chr2	768235	768267	a	a	+
+chr2	768236	768268	a	a	+
+chr2	768236	768268	a	a	+
+chr2	768236	768268	a	a	+
+chr2	768237	768269	a	a	+
+chr2	768237	768269	a	a	+
+chr2	768237	768269	a	a	+
+chr2	768237	768269	a	a	+
+chr2	768237	768269	a	a	+
+chr2	768237	768269	a	a	+
+chr2	768237	768269	a	a	+
+chr2	768237	768269	a	a	+
+chr2	768237	768269	a	a	+
+chr2	768205	768237	b	b	-
+chr2	768239	768271	a	a	+
+chr2	768240	768272	a	a	+
+chr2	768241	768273	a	a	+
+chr2	768213	768245	b	b	-
+chr2	768213	768245	b	b	-
+chr2	768213	768245	b	b	-
+chr2	768213	768245	b	b	-
+chr2	768213	768245	b	b	-
+chr2	768213	768245	b	b	-
+chr2	768213	768245	b	b	-
+chr2	768213	768245	b	b	-
+chr2	768214	768246	b	b	-
+chr2	768247	768279	a	a	+
+chr2	768215	768247	b	b	-
+chr2	768215	768247	b	b	-
+chr2	768248	768280	a	a	+
+chr2	768216	768248	b	b	-
+chr2	768217	768249	b	b	-
+chr2	768253	768285	a	a	+
+chr2	768227	768259	b	b	-
+chr2	768227	768259	b	b	-
+chr2	768227	768259	b	b	-
+chr2	768227	768259	b	b	-
+chr2	768228	768260	b	b	-
+chr2	768228	768260	b	b	-
+chr2	768261	768293	a	a	+
+chr2	768261	768293	a	a	+
+chr2	768262	768294	a	a	+
+chr2	768399	768431	a	a	+
+chr2	768400	768432	a	a	+
+chr2	768368	768400	b	b	-
+chr2	768368	768400	b	b	-
+chr2	768401	768433	a	a	+
+chr2	768401	768433	a	a	+
+chr2	768372	768404	b	b	-
+chr2	768397	768429	b	b	-
+chr2	768438	768470	a	a	+
+chr2	768407	768439	b	b	-
+chr2	768430	768462	b	b	-
+chr2	768468	768500	a	a	+
+chr2	768567	768599	b	b	-
+chr2	768567	768599	b	b	-
+chr2	768569	768601	b	b	-
+chr2	768574	768606	b	b	-
+chr2	768614	768646	a	a	+
+chr2	769018	769050	a	a	+
+chr2	769040	769072	a	a	+
+chr2	769358	769390	a	a	+
+chr2	770085	770117	b	b	-
+chr2	770164	770196	b	b	-
+chr2	770173	770205	b	b	-
+chr2	770529	770561	b	b	-
+chr2	770566	770598	a	a	+
+chr2	770546	770578	b	b	-
+chr2	770832	770864	b	b	-
+chr2	770832	770864	b	b	-
+chr2	770842	770874	b	b	-
+chr2	770875	770907	a	a	+
+chr2	770875	770907	a	a	+
+chr2	770846	770878	b	b	-
+chr2	770852	770884	b	b	-
+chr2	770855	770887	b	b	-
+chr2	770855	770887	b	b	-
+chr2	770888	770920	a	a	+
+chr2	770888	770920	a	a	+
+chr2	770858	770890	b	b	-
+chr2	770858	770890	b	b	-
+chr2	770858	770890	b	b	-
+chr2	770892	770924	a	a	+
+chr2	770860	770892	b	b	-
+chr2	770894	770926	a	a	+
+chr2	770894	770926	a	a	+
+chr2	770894	770926	a	a	+
+chr2	770899	770931	a	a	+
+chr2	770900	770932	a	a	+
+chr2	770871	770903	b	b	-
+chr2	770876	770908	b	b	-
+chr2	770877	770909	b	b	-
+chr2	770877	770909	b	b	-
+chr2	770910	770942	a	a	+
+chr2	770881	770913	b	b	-
+chr2	770881	770913	b	b	-
+chr2	770916	770948	a	a	+
+chr2	770917	770949	a	a	+
+chr2	770918	770950	a	a	+
+chr2	770888	770920	b	b	-
+chr2	770888	770920	b	b	-
+chr2	770896	770928	b	b	-
+chr2	770938	770970	a	a	+
+chr2	771017	771049	b	b	-
+chr2	771061	771093	a	a	+
+chr2	771042	771074	b	b	-
+chr2	771174	771206	b	b	-
+chr2	771174	771206	b	b	-
+chr2	771174	771206	b	b	-
+chr2	771207	771239	a	a	+
+chr2	771207	771239	a	a	+
+chr2	771207	771239	a	a	+
+chr2	771176	771208	b	b	-
+chr2	771181	771213	b	b	-
+chr2	771220	771252	a	a	+
+chr2	771189	771221	b	b	-
+chr2	771231	771263	a	a	+
+chr2	771231	771263	a	a	+
+chr2	771231	771263	a	a	+
+chr2	771239	771271	a	a	+
+chr2	771242	771274	a	a	+
+chr2	771242	771274	a	a	+
+chr2	771211	771243	b	b	-
+chr2	771343	771375	b	b	-
+chr2	771388	771420	a	a	+
+chr2	771356	771388	b	b	-
+chr2	771362	771394	b	b	-
+chr2	771400	771432	a	a	+
+chr2	771414	771446	a	a	+
+chr2	771448	771480	a	a	+
+chr2	771557	771589	a	a	+
+chr2	771530	771562	b	b	-
+chr2	771530	771562	b	b	-
+chr2	771569	771601	a	a	+
+chr2	771569	771601	a	a	+
+chr2	771538	771570	b	b	-
+chr2	771558	771590	b	b	-
+chr2	771654	771686	a	a	+
+chr2	771704	771736	b	b	-
+chr2	771729	771761	b	b	-
+chr2	771792	771824	b	b	-
+chr2	771848	771880	b	b	-
+chr2	771930	771962	a	a	+
+chr2	772004	772036	a	a	+
+chr2	772012	772044	a	a	+
+chr2	772021	772053	a	a	+
+chr2	772032	772064	b	b	-
+chr2	772040	772072	b	b	-
+chr2	772086	772118	a	a	+
+chr2	772056	772088	b	b	-
+chr2	772091	772123	a	a	+
+chr2	772091	772123	a	a	+
+chr2	772068	772100	b	b	-
+chr2	772107	772139	a	a	+
+chr2	772107	772139	a	a	+
+chr2	772083	772115	b	b	-
+chr2	772083	772115	b	b	-
+chr2	772102	772134	b	b	-
+chr2	772145	772177	b	b	-
+chr2	772178	772210	b	b	-
+chr2	772178	772210	b	b	-
+chr2	772210	772242	b	b	-
+chr2	772213	772245	b	b	-
+chr2	772213	772245	b	b	-
+chr2	772281	772313	a	a	+
+chr2	772299	772331	a	a	+
+chr2	772296	772328	b	b	-
+chr2	772296	772328	b	b	-
+chr2	772313	772345	b	b	-
+chr2	772331	772363	b	b	-
+chr2	772333	772365	b	b	-
+chr2	772340	772372	b	b	-
+chr2	772342	772374	b	b	-
+chr2	772386	772418	a	a	+
+chr2	772407	772439	a	a	+
+chr2	772375	772407	b	b	-
+chr2	772513	772545	a	a	+
+chr2	772528	772560	a	a	+
+chr2	772529	772561	b	b	-
+chr2	772605	772637	b	b	-
+chr2	772605	772637	b	b	-
+chr2	772605	772637	b	b	-
+chr2	772701	772733	a	a	+
+chr2	772674	772706	b	b	-
+chr2	772678	772710	b	b	-
+chr2	772851	772883	b	b	-
+chr2	772851	772883	b	b	-
+chr2	772887	772919	a	a	+
+chr2	772857	772889	b	b	-
+chr2	772860	772892	b	b	-
+chr2	772866	772898	b	b	-
+chr2	772878	772910	b	b	-
+chr2	773031	773063	a	a	+
+chr2	773042	773074	a	a	+
+chr2	773042	773074	a	a	+
+chr2	773047	773079	a	a	+
+chr2	773047	773079	a	a	+
+chr2	773042	773074	b	b	-
+chr2	773202	773234	a	a	+
+chr2	773213	773245	a	a	+
+chr2	773526	773558	a	a	+
+chr2	773529	773561	a	a	+
+chr2	773543	773575	a	a	+
+chr2	773543	773575	a	a	+
+chr2	773512	773544	b	b	-
+chr2	773512	773544	b	b	-
+chr2	773562	773594	a	a	+
+chr2	773578	773610	a	a	+
+chr2	773582	773614	a	a	+
+chr2	773551	773583	b	b	-
+chr2	773552	773584	b	b	-
+chr2	773552	773584	b	b	-
+chr2	773563	773595	b	b	-
+chr2	773587	773619	b	b	-
+chr2	773646	773678	b	b	-
+chr2	773920	773952	b	b	-
+chr2	774015	774047	b	b	-
+chr2	774032	774064	b	b	-
+chr2	774091	774123	b	b	-
+chr2	774105	774137	b	b	-
+chr2	774114	774146	b	b	-
+chr2	774242	774274	a	a	+
+chr2	774251	774283	a	a	+
+chr2	774277	774309	a	a	+
+chr2	774262	774294	b	b	-
+chr2	774262	774294	b	b	-
+chr2	774262	774294	b	b	-
+chr2	774295	774327	a	a	+
+chr2	774299	774331	a	a	+
+chr2	774308	774340	a	a	+
+chr2	774289	774321	b	b	-
+chr2	774327	774359	a	a	+
+chr2	774432	774464	b	b	-
+chr2	774719	774751	a	a	+
+chr2	774689	774721	b	b	-
+chr2	774691	774723	b	b	-
+chr2	774725	774757	a	a	+
+chr2	774732	774764	a	a	+
+chr2	774708	774740	b	b	-
+chr2	774708	774740	b	b	-
+chr2	774708	774740	b	b	-
+chr2	774708	774740	b	b	-
+chr2	774708	774740	b	b	-
+chr2	774711	774743	b	b	-
+chr2	774754	774786	a	a	+
+chr2	774781	774813	a	a	+
+chr2	774803	774835	b	b	-
+chr2	774808	774840	b	b	-
+chr2	774952	774984	a	a	+
+chr2	775224	775256	a	a	+
+chr2	775465	775497	a	a	+
+chr2	775692	775724	a	a	+
+chr2	775799	775831	a	a	+
+chr2	776085	776117	a	a	+
+chr2	776124	776156	a	a	+
+chr2	776229	776261	a	a	+
+chr2	776247	776279	a	a	+
+chr2	776247	776279	a	a	+
+chr2	776256	776288	a	a	+
+chr2	776226	776258	b	b	-
+chr2	776495	776527	b	b	-
+chr2	776514	776546	b	b	-
+chr2	776558	776590	a	a	+
+chr2	776558	776590	a	a	+
+chr2	776530	776562	b	b	-
+chr2	776565	776597	a	a	+
+chr2	776566	776598	a	a	+
+chr2	776687	776719	b	b	-
+chr2	776687	776719	b	b	-
+chr2	776688	776720	b	b	-
+chr2	776865	776897	b	b	-
+chr2	777018	777050	b	b	-
+chr2	777092	777124	a	a	+
+chr2	777082	777114	b	b	-
+chr2	777226	777258	a	a	+
+chr2	777362	777394	a	a	+
+chr2	777558	777590	b	b	-
+chr2	777558	777590	b	b	-
+chr2	777594	777626	b	b	-
+chr2	778908	778940	b	b	-
+chr2	778917	778949	b	b	-
+chr2	779131	779163	a	a	+
+chr2	779273	779305	a	a	+
+chr2	779287	779319	a	a	+
+chr2	779304	779336	a	a	+
+chr2	779272	779304	b	b	-
+chr2	779363	779395	a	a	+
+chr2	779416	779448	a	a	+
+chr2	779392	779424	b	b	-
+chr2	779430	779462	a	a	+
+chr2	779430	779462	a	a	+
+chr2	779430	779462	a	a	+
+chr2	779430	779462	a	a	+
+chr2	779430	779462	a	a	+
+chr2	779430	779462	a	a	+
+chr2	779431	779463	a	a	+
+chr2	779431	779463	a	a	+
+chr2	779405	779437	b	b	-
+chr2	779406	779438	b	b	-
+chr2	779408	779440	b	b	-
+chr2	779408	779440	b	b	-
+chr2	779409	779441	b	b	-
+chr2	779444	779476	a	a	+
+chr2	779444	779476	a	a	+
+chr2	779444	779476	a	a	+
+chr2	779444	779476	a	a	+
+chr2	779416	779448	b	b	-
+chr2	779416	779448	b	b	-
+chr2	779416	779448	b	b	-
+chr2	779416	779448	b	b	-
+chr2	779416	779448	b	b	-
+chr2	779416	779448	b	b	-
+chr2	779416	779448	b	b	-
+chr2	779416	779448	b	b	-
+chr2	779451	779483	a	a	+
+chr2	779419	779451	b	b	-
+chr2	779419	779451	b	b	-
+chr2	779419	779451	b	b	-
+chr2	779454	779486	a	a	+
+chr2	779454	779486	a	a	+
+chr2	779454	779486	a	a	+
+chr2	779433	779465	b	b	-
+chr2	779450	779482	b	b	-
+chr2	779650	779682	b	b	-
+chr2	779650	779682	b	b	-
+chr2	779659	779691	b	b	-
+chr2	779666	779698	b	b	-
+chr2	779666	779698	b	b	-
+chr2	779699	779731	a	a	+
+chr2	779699	779731	a	a	+
+chr2	779667	779699	b	b	-
+chr2	779667	779699	b	b	-
+chr2	779700	779732	a	a	+
+chr2	779702	779734	a	a	+
+chr2	779709	779741	a	a	+
+chr2	779709	779741	a	a	+
+chr2	779709	779741	a	a	+
+chr2	779678	779710	b	b	-
+chr2	779711	779743	a	a	+
+chr2	779680	779712	b	b	-
+chr2	779680	779712	b	b	-
+chr2	779714	779746	a	a	+
+chr2	779714	779746	a	a	+
+chr2	779683	779715	b	b	-
+chr2	779683	779715	b	b	-
+chr2	779685	779717	b	b	-
+chr2	779685	779717	b	b	-
+chr2	779721	779753	a	a	+
+chr2	779694	779726	b	b	-
+chr2	779699	779731	b	b	-
+chr2	779699	779731	b	b	-
+chr2	779775	779807	a	a	+
+chr2	779855	779887	a	a	+
+chr2	779825	779857	b	b	-
+chr2	779861	779893	a	a	+
+chr2	779831	779863	b	b	-
+chr2	779869	779901	a	a	+
+chr2	779846	779878	b	b	-
+chr2	779981	780013	b	b	-
+chr2	780190	780222	a	a	+
+chr2	780218	780250	a	a	+
+chr2	780230	780262	a	a	+
+chr2	780707	780739	a	a	+
+chr2	780937	780969	b	b	-
+chr2	781300	781332	b	b	-
+chr2	781416	781448	b	b	-
+chr2	781416	781448	b	b	-
+chr2	781779	781811	a	a	+
+chr2	782273	782305	b	b	-
+chr2	782312	782344	b	b	-
+chr2	782312	782344	b	b	-
+chr2	782562	782594	b	b	-
+chr2	782604	782636	a	a	+
+chr2	782605	782637	a	a	+
+chr2	782605	782637	a	a	+
+chr2	782577	782609	b	b	-
+chr2	782610	782642	a	a	+
+chr2	782613	782645	a	a	+
+chr2	782614	782646	a	a	+
+chr2	782614	782646	a	a	+
+chr2	782614	782646	a	a	+
+chr2	782584	782616	b	b	-
+chr2	782584	782616	b	b	-
+chr2	782586	782618	b	b	-
+chr2	782586	782618	b	b	-
+chr2	782619	782651	a	a	+
+chr2	782619	782651	a	a	+
+chr2	782588	782620	b	b	-
+chr2	782588	782620	b	b	-
+chr2	782624	782656	a	a	+
+chr2	782627	782659	a	a	+
+chr2	782627	782659	a	a	+
+chr2	782627	782659	a	a	+
+chr2	782627	782659	a	a	+
+chr2	782627	782659	a	a	+
+chr2	782627	782659	a	a	+
+chr2	782628	782660	a	a	+
+chr2	782628	782660	a	a	+
+chr2	782628	782660	a	a	+
+chr2	782597	782629	b	b	-
+chr2	782597	782629	b	b	-
+chr2	782597	782629	b	b	-
+chr2	782597	782629	b	b	-
+chr2	782597	782629	b	b	-
+chr2	782597	782629	b	b	-
+chr2	782597	782629	b	b	-
+chr2	782597	782629	b	b	-
+chr2	782597	782629	b	b	-
+chr2	782600	782632	b	b	-
+chr2	782635	782667	a	a	+
+chr2	782636	782668	a	a	+
+chr2	782605	782637	b	b	-
+chr2	782606	782638	b	b	-
+chr2	782607	782639	b	b	-
+chr2	782640	782672	a	a	+
+chr2	782612	782644	b	b	-
+chr2	782645	782677	a	a	+
+chr2	782613	782645	b	b	-
+chr2	782613	782645	b	b	-
+chr2	782721	782753	b	b	-
+chr2	782779	782811	a	a	+
+chr2	782748	782780	b	b	-
+chr2	782794	782826	a	a	+
+chr2	782795	782827	a	a	+
+chr2	782931	782963	a	a	+
+chr2	782945	782977	a	a	+
+chr2	783215	783247	a	a	+
+chr2	783724	783756	a	a	+
+chr2	783760	783792	a	a	+
+chr2	783740	783772	b	b	-
+chr2	783880	783912	a	a	+
+chr2	783883	783915	a	a	+
+chr2	783865	783897	b	b	-
+chr2	784053	784085	a	a	+
+chr2	784062	784094	a	a	+
+chr2	784037	784069	b	b	-
+chr2	784074	784106	a	a	+
+chr2	784148	784180	a	a	+
+chr2	784137	784169	b	b	-
+chr2	784171	784203	a	a	+
+chr2	784157	784189	b	b	-
+chr2	784196	784228	a	a	+
+chr2	784183	784215	b	b	-
+chr2	784387	784419	a	a	+
+chr2	784376	784408	b	b	-
+chr2	784414	784446	a	a	+
+chr2	784402	784434	b	b	-
+chr2	784402	784434	b	b	-
+chr2	784402	784434	b	b	-
+chr2	784410	784442	b	b	-
+chr2	784456	784488	a	a	+
+chr2	784472	784504	a	a	+
+chr2	784478	784510	a	a	+
+chr2	784481	784513	a	a	+
+chr2	784452	784484	b	b	-
+chr2	784452	784484	b	b	-
+chr2	784452	784484	b	b	-
+chr2	784558	784590	a	a	+
+chr2	784558	784590	a	a	+
+chr2	784558	784590	a	a	+
+chr2	784529	784561	b	b	-
+chr2	784530	784562	b	b	-
+chr2	784547	784579	b	b	-
+chr2	784580	784612	a	a	+
+chr2	784580	784612	a	a	+
+chr2	784560	784592	b	b	-
+chr2	784576	784608	b	b	-
+chr2	784576	784608	b	b	-
+chr2	784576	784608	b	b	-
+chr2	784838	784870	a	a	+
+chr2	784841	784873	a	a	+
+chr2	784825	784857	b	b	-
+chr2	784837	784869	b	b	-
+chr2	784875	784907	a	a	+
+chr2	784902	784934	a	a	+
+chr2	784902	784934	a	a	+
+chr2	784951	784983	a	a	+
+chr2	785023	785055	b	b	-
+chr2	785071	785103	a	a	+
+chr2	785039	785071	b	b	-
+chr2	785073	785105	a	a	+
+chr2	785074	785106	a	a	+
+chr2	785043	785075	b	b	-
+chr2	785043	785075	b	b	-
+chr2	785053	785085	b	b	-
+chr2	785086	785118	a	a	+
+chr2	785056	785088	b	b	-
+chr2	785095	785127	a	a	+
+chr2	785065	785097	b	b	-
+chr2	785065	785097	b	b	-
+chr2	785066	785098	b	b	-
+chr2	785222	785254	a	a	+
+chr2	785197	785229	b	b	-
+chr2	785236	785268	a	a	+
+chr2	785219	785251	b	b	-
+chr2	785234	785266	b	b	-
+chr2	785269	785301	a	a	+
+chr2	785417	785449	a	a	+
+chr2	785390	785422	b	b	-
+chr2	785432	785464	a	a	+
+chr2	785413	785445	b	b	-
+chr2	785462	785494	a	a	+
+chr2	785433	785465	b	b	-
+chr2	785468	785500	a	a	+
+chr2	785436	785468	b	b	-
+chr2	785436	785468	b	b	-
+chr2	785587	785619	a	a	+
+chr2	785585	785617	b	b	-
+chr2	785594	785626	b	b	-
+chr2	785781	785813	a	a	+
+chr2	785752	785784	b	b	-
+chr2	785767	785799	b	b	-
+chr2	785790	785822	b	b	-
+chr2	785827	785859	a	a	+
+chr2	785827	785859	a	a	+
+chr2	785888	785920	b	b	-
+chr2	785956	785988	a	a	+
+chr2	785987	786019	a	a	+
+chr2	785965	785997	b	b	-
+chr2	785965	785997	b	b	-
+chr2	785978	786010	b	b	-
+chr2	785978	786010	b	b	-
+chr2	785982	786014	b	b	-
+chr2	785988	786020	b	b	-
+chr2	786033	786065	a	a	+
+chr2	786087	786119	a	a	+
+chr2	786070	786102	b	b	-
+chr2	786079	786111	b	b	-
+chr2	786125	786157	a	a	+
+chr2	786132	786164	b	b	-
+chr2	786314	786346	a	a	+
+chr2	786317	786349	b	b	-
+chr2	786352	786384	a	a	+
+chr2	786342	786374	b	b	-
+chr2	786407	786439	b	b	-
+chr2	786422	786454	b	b	-
+chr2	786425	786457	b	b	-
+chr2	786468	786500	a	a	+
+chr2	786468	786500	a	a	+
+chr2	786445	786477	b	b	-
+chr2	786445	786477	b	b	-
+chr2	786445	786477	b	b	-
+chr2	786479	786511	a	a	+
+chr2	786479	786511	a	a	+
+chr2	786578	786610	b	b	-
+chr2	786622	786654	b	b	-
+chr2	786642	786674	b	b	-
+chr2	786791	786823	a	a	+
+chr2	786791	786823	a	a	+
+chr2	786762	786794	b	b	-
+chr2	786762	786794	b	b	-
+chr2	786797	786829	a	a	+
+chr2	786766	786798	b	b	-
+chr2	786799	786831	a	a	+
+chr2	786802	786834	a	a	+
+chr2	786802	786834	a	a	+
+chr2	786775	786807	b	b	-
+chr2	786775	786807	b	b	-
+chr2	786811	786843	a	a	+
+chr2	786811	786843	a	a	+
+chr2	786811	786843	a	a	+
+chr2	786781	786813	b	b	-
+chr2	786815	786847	a	a	+
+chr2	786787	786819	b	b	-
+chr2	786787	786819	b	b	-
+chr2	786787	786819	b	b	-
+chr2	786788	786820	b	b	-
+chr2	786788	786820	b	b	-
+chr2	786794	786826	b	b	-
+chr2	786796	786828	b	b	-
+chr2	786797	786829	b	b	-
+chr2	786798	786830	b	b	-
+chr2	786835	786867	a	a	+
+chr2	786835	786867	a	a	+
+chr2	786835	786867	a	a	+
+chr2	786836	786868	a	a	+
+chr2	786836	786868	a	a	+
+chr2	786842	786874	a	a	+
+chr2	787032	787064	a	a	+
+chr2	787034	787066	a	a	+
+chr2	787062	787094	a	a	+
+chr2	787031	787063	b	b	-
+chr2	787040	787072	b	b	-
+chr2	787082	787114	a	a	+
+chr2	787083	787115	a	a	+
+chr2	787083	787115	a	a	+
+chr2	787052	787084	b	b	-
+chr2	787058	787090	b	b	-
+chr2	787093	787125	a	a	+
+chr2	787061	787093	b	b	-
+chr2	787098	787130	a	a	+
+chr2	787068	787100	b	b	-
+chr2	787068	787100	b	b	-
+chr2	787068	787100	b	b	-
+chr2	787109	787141	a	a	+
+chr2	787084	787116	b	b	-
+chr2	787117	787149	a	a	+
+chr2	787085	787117	b	b	-
+chr2	787085	787117	b	b	-
+chr2	787119	787151	a	a	+
+chr2	787119	787151	a	a	+
+chr2	787121	787153	a	a	+
+chr2	787121	787153	a	a	+
+chr2	787122	787154	a	a	+
+chr2	787090	787122	b	b	-
+chr2	787126	787158	a	a	+
+chr2	787094	787126	b	b	-
+chr2	787094	787126	b	b	-
+chr2	787095	787127	b	b	-
+chr2	787095	787127	b	b	-
+chr2	787095	787127	b	b	-
+chr2	787095	787127	b	b	-
+chr2	787095	787127	b	b	-
+chr2	787095	787127	b	b	-
+chr2	787129	787161	a	a	+
+chr2	787109	787141	b	b	-
+chr2	787109	787141	b	b	-
+chr2	787154	787186	a	a	+
+chr2	787234	787266	a	a	+
+chr2	787239	787271	a	a	+
+chr2	787209	787241	b	b	-
+chr2	787263	787295	a	a	+
+chr2	787264	787296	a	a	+
+chr2	787274	787306	a	a	+
+chr2	787251	787283	b	b	-
+chr2	787365	787397	b	b	-
+chr2	787408	787440	b	b	-
+chr2	787417	787449	b	b	-
+chr2	787532	787564	b	b	-
+chr2	787557	787589	b	b	-
+chr2	787595	787627	b	b	-
+chr2	787737	787769	a	a	+
+chr2	787862	787894	a	a	+
+chr2	787907	787939	a	a	+
+chr2	788084	788116	a	a	+
+chr2	788497	788529	b	b	-
+chr2	788502	788534	b	b	-
+chr2	788600	788632	b	b	-
+chr2	788668	788700	a	a	+
+chr2	788649	788681	b	b	-
+chr2	788649	788681	b	b	-
+chr2	788650	788682	b	b	-
+chr2	788691	788723	a	a	+
+chr2	788698	788730	a	a	+
+chr2	788671	788703	b	b	-
+chr2	788687	788719	b	b	-
+chr2	788876	788908	b	b	-
+chr2	788878	788910	b	b	-
+chr2	788925	788957	a	a	+
+chr2	788928	788960	a	a	+
+chr2	788946	788978	a	a	+
+chr2	788915	788947	b	b	-
+chr2	788950	788982	a	a	+
+chr2	788918	788950	b	b	-
+chr2	788954	788986	a	a	+
+chr2	788923	788955	b	b	-
+chr2	789132	789164	a	a	+
+chr2	789289	789321	a	a	+
+chr2	789313	789345	a	a	+
+chr2	789427	789459	b	b	-
+chr2	789828	789860	a	a	+
+chr2	789812	789844	b	b	-
+chr2	789863	789895	a	a	+
+chr2	789868	789900	a	a	+
+chr2	790018	790050	b	b	-
+chr2	790073	790105	b	b	-
+chr2	790075	790107	b	b	-
+chr2	790238	790270	a	a	+
+chr2	790268	790300	a	a	+
+chr2	790268	790300	a	a	+
+chr2	790768	790800	b	b	-
+chr2	790835	790867	b	b	-
+chr2	790931	790963	a	a	+
+chr2	791019	791051	a	a	+
+chr2	791047	791079	b	b	-
+chr2	791096	791128	a	a	+
+chr2	791145	791177	b	b	-
+chr2	791237	791269	a	a	+
+chr2	791299	791331	a	a	+
+chr2	791299	791331	a	a	+
+chr2	791285	791317	b	b	-
+chr2	791388	791420	a	a	+
+chr2	791505	791537	a	a	+
+chr2	791516	791548	a	a	+
+chr2	791546	791578	a	a	+
+chr2	791629	791661	b	b	-
+chr2	791703	791735	a	a	+
+chr2	791700	791732	b	b	-
+chr2	791700	791732	b	b	-
+chr2	791700	791732	b	b	-
+chr2	791700	791732	b	b	-
+chr2	791718	791750	b	b	-
+chr2	792029	792061	a	a	+
+chr2	791997	792029	b	b	-
+chr2	791998	792030	b	b	-
+chr2	791999	792031	b	b	-
+chr2	792013	792045	b	b	-
+chr2	792022	792054	b	b	-
+chr2	792031	792063	b	b	-
+chr2	792101	792133	b	b	-
+chr2	792385	792417	a	a	+
+chr2	792391	792423	b	b	-
+chr2	792391	792423	b	b	-
+chr2	792391	792423	b	b	-
+chr2	792391	792423	b	b	-
+chr2	792462	792494	b	b	-
+chr2	792511	792543	b	b	-
+chr2	792522	792554	b	b	-
+chr2	792560	792592	a	a	+
+chr2	792529	792561	b	b	-
+chr2	792563	792595	a	a	+
+chr2	792564	792596	a	a	+
+chr2	792572	792604	a	a	+
+chr2	792542	792574	b	b	-
+chr2	792737	792769	b	b	-
+chr2	792757	792789	b	b	-
+chr2	792816	792848	a	a	+
+chr2	792790	792822	b	b	-
+chr2	792796	792828	b	b	-
+chr2	792796	792828	b	b	-
+chr2	792829	792861	a	a	+
+chr2	792829	792861	a	a	+
+chr2	792797	792829	b	b	-
+chr2	792807	792839	b	b	-
+chr2	792807	792839	b	b	-
+chr2	792807	792839	b	b	-
+chr2	792807	792839	b	b	-
+chr2	792810	792842	b	b	-
+chr2	792811	792843	b	b	-
+chr2	792811	792843	b	b	-
+chr2	792811	792843	b	b	-
+chr2	792811	792843	b	b	-
+chr2	792811	792843	b	b	-
+chr2	792811	792843	b	b	-
+chr2	792811	792843	b	b	-
+chr2	792845	792877	a	a	+
+chr2	792846	792878	a	a	+
+chr2	792846	792878	a	a	+
+chr2	792814	792846	b	b	-
+chr2	792815	792847	b	b	-
+chr2	792817	792849	b	b	-
+chr2	792851	792883	a	a	+
+chr2	792851	792883	a	a	+
+chr2	792851	792883	a	a	+
+chr2	792851	792883	a	a	+
+chr2	792851	792883	a	a	+
+chr2	792851	792883	a	a	+
+chr2	792821	792853	b	b	-
+chr2	792862	792894	a	a	+
+chr2	792862	792894	a	a	+
+chr2	792862	792894	a	a	+
+chr2	792863	792895	a	a	+
+chr2	792954	792986	b	b	-
+chr2	792962	792994	b	b	-
+chr2	792996	793028	a	a	+
+chr2	792996	793028	a	a	+
+chr2	792964	792996	b	b	-
+chr2	792999	793031	a	a	+
+chr2	792999	793031	a	a	+
+chr2	793087	793119	a	a	+
+chr2	793095	793127	b	b	-
+chr2	793289	793321	b	b	-
+chr2	793437	793469	b	b	-
+chr2	793453	793485	b	b	-
+chr2	793638	793670	b	b	-
+chr2	793810	793842	a	a	+
+chr2	793857	793889	a	a	+
+chr2	793841	793873	b	b	-
+chr2	793895	793927	a	a	+
+chr2	793895	793927	a	a	+
+chr2	793890	793922	b	b	-
+chr2	793890	793922	b	b	-
+chr2	794062	794094	a	a	+
+chr2	794115	794147	a	a	+
+chr2	794660	794692	b	b	-
+chr2	794795	794827	b	b	-
+chr2	794797	794829	b	b	-
+chr2	795156	795188	a	a	+
+chr2	795167	795199	a	a	+
+chr2	795434	795466	b	b	-
+chr2	795648	795680	a	a	+
+chr2	795810	795842	a	a	+
+chr2	795841	795873	a	a	+
+chr2	795939	795971	b	b	-
+chr2	795989	796021	b	b	-
+chr2	796203	796235	b	b	-
+chr2	796261	796293	a	a	+
+chr2	796383	796415	b	b	-
+chr2	796404	796436	b	b	-
+chr2	796478	796510	a	a	+
+chr2	796457	796489	b	b	-
+chr2	796781	796813	a	a	+
+chr2	796797	796829	a	a	+
+chr2	796776	796808	b	b	-
+chr2	796815	796847	a	a	+
+chr2	796830	796862	a	a	+
+chr2	796808	796840	b	b	-
+chr2	796862	796894	a	a	+
+chr2	796862	796894	a	a	+
+chr2	796862	796894	a	a	+
+chr2	796838	796870	b	b	-
+chr2	796924	796956	a	a	+
+chr2	796894	796926	b	b	-
+chr2	796959	796991	a	a	+
+chr2	796956	796988	b	b	-
+chr2	796957	796989	b	b	-
+chr2	796998	797030	a	a	+
+chr2	796970	797002	b	b	-
+chr2	797037	797069	a	a	+
+chr2	797048	797080	b	b	-
+chr2	797162	797194	a	a	+
+chr2	797192	797224	a	a	+
+chr2	797185	797217	b	b	-
+chr2	797185	797217	b	b	-
+chr2	797301	797333	a	a	+
+chr2	797269	797301	b	b	-
+chr2	797330	797362	a	a	+
+chr2	797401	797433	a	a	+
+chr2	797464	797496	b	b	-
+chr2	797530	797562	b	b	-
+chr2	797605	797637	a	a	+
+chr2	797697	797729	a	a	+
+chr2	797705	797737	a	a	+
+chr2	797728	797760	b	b	-
+chr2	797728	797760	b	b	-
+chr2	797812	797844	a	a	+
+chr2	797825	797857	a	a	+
+chr2	797900	797932	a	a	+
+chr2	797900	797932	a	a	+
+chr2	797900	797932	a	a	+
+chr2	797874	797906	b	b	-
+chr2	797886	797918	b	b	-
+chr2	797922	797954	a	a	+
+chr2	797922	797954	a	a	+
+chr2	798105	798137	b	b	-
+chr2	798105	798137	b	b	-
+chr2	798124	798156	b	b	-
+chr2	798124	798156	b	b	-
+chr2	798140	798172	b	b	-
+chr2	798140	798172	b	b	-
+chr2	798178	798210	a	a	+
+chr2	798149	798181	b	b	-
+chr2	798182	798214	a	a	+
+chr2	798286	798318	a	a	+
+chr2	798323	798355	a	a	+
+chr2	798291	798323	b	b	-
+chr2	798300	798332	b	b	-
+chr2	798354	798386	a	a	+
+chr2	798370	798402	a	a	+
+chr2	798373	798405	a	a	+
+chr2	798376	798408	b	b	-
+chr2	798468	798500	b	b	-
+chr2	798468	798500	b	b	-
+chr2	798520	798552	b	b	-
+chr2	798679	798711	b	b	-
+chr2	798687	798719	b	b	-
+chr2	798817	798849	b	b	-
+chr2	798855	798887	a	a	+
+chr2	798855	798887	a	a	+
+chr2	798838	798870	b	b	-
+chr2	798857	798889	b	b	-
+chr2	798893	798925	a	a	+
+chr2	799145	799177	b	b	-
+chr2	799156	799188	b	b	-
+chr2	799164	799196	b	b	-
+chr2	799167	799199	b	b	-
+chr2	799169	799201	b	b	-
+chr2	799218	799250	a	a	+
+chr2	799225	799257	a	a	+
+chr2	799201	799233	b	b	-
+chr2	799208	799240	b	b	-
+chr2	799211	799243	b	b	-
+chr2	799224	799256	b	b	-
+chr2	799266	799298	a	a	+
+chr2	799390	799422	a	a	+
+chr2	799365	799397	b	b	-
+chr2	799373	799405	b	b	-
+chr2	799375	799407	b	b	-
+chr2	799375	799407	b	b	-
+chr2	799444	799476	a	a	+
+chr2	799546	799578	a	a	+
+chr2	799546	799578	a	a	+
+chr2	799592	799624	a	a	+
+chr2	799592	799624	a	a	+
+chr2	799698	799730	a	a	+
+chr2	799691	799723	b	b	-
+chr2	799724	799756	a	a	+
+chr2	799698	799730	b	b	-
+chr2	799734	799766	a	a	+
+chr2	799867	799899	a	a	+
+chr2	799843	799875	b	b	-
+chr2	799888	799920	a	a	+
+chr2	799894	799926	a	a	+
+chr2	799987	800019	a	a	+
+chr2	800041	800073	a	a	+
+chr2	800012	800044	b	b	-
+chr2	800056	800088	a	a	+
+chr2	800033	800065	b	b	-
+chr2	800071	800103	a	a	+
+chr2	800142	800174	b	b	-
+chr2	800163	800195	b	b	-
+chr2	800165	800197	b	b	-
+chr2	800165	800197	b	b	-
+chr2	800168	800200	b	b	-
+chr2	800177	800209	b	b	-
+chr2	800184	800216	b	b	-
+chr2	800218	800250	a	a	+
+chr2	800219	800251	a	a	+
+chr2	800220	800252	a	a	+
+chr2	800220	800252	a	a	+
+chr2	800220	800252	a	a	+
+chr2	800189	800221	b	b	-
+chr2	800189	800221	b	b	-
+chr2	800189	800221	b	b	-
+chr2	800222	800254	a	a	+
+chr2	800222	800254	a	a	+
+chr2	800226	800258	a	a	+
+chr2	800226	800258	a	a	+
+chr2	800226	800258	a	a	+
+chr2	800226	800258	a	a	+
+chr2	800198	800230	b	b	-
+chr2	800198	800230	b	b	-
+chr2	800233	800265	a	a	+
+chr2	800202	800234	b	b	-
+chr2	800202	800234	b	b	-
+chr2	800240	800272	a	a	+
+chr2	800212	800244	b	b	-
+chr2	800217	800249	b	b	-
+chr2	800263	800295	a	a	+
+chr2	800263	800295	a	a	+
+chr2	800245	800277	b	b	-
+chr2	800371	800403	a	a	+
+chr2	800408	800440	b	b	-
+chr2	800448	800480	a	a	+
+chr2	800448	800480	a	a	+
+chr2	800456	800488	a	a	+
+chr2	800463	800495	a	a	+
+chr2	800471	800503	a	a	+
+chr2	800439	800471	b	b	-
+chr2	800478	800510	a	a	+
+chr2	800480	800512	a	a	+
+chr2	800480	800512	a	a	+
+chr2	800480	800512	a	a	+
+chr2	800453	800485	b	b	-
+chr2	800487	800519	a	a	+
+chr2	800458	800490	b	b	-
+chr2	800459	800491	b	b	-
+chr2	800459	800491	b	b	-
+chr2	800467	800499	b	b	-
+chr2	800472	800504	b	b	-
+chr2	800473	800505	b	b	-
+chr2	800477	800509	b	b	-
+chr2	800510	800542	a	a	+
+chr2	800510	800542	a	a	+
+chr2	800510	800542	a	a	+
+chr2	800542	800574	a	a	+
+chr2	800514	800546	b	b	-
+chr2	800577	800609	a	a	+
+chr2	800568	800600	b	b	-
+chr2	800574	800606	b	b	-
+chr2	800648	800680	b	b	-
+chr2	800759	800791	b	b	-
+chr2	800759	800791	b	b	-
+chr2	800820	800852	a	a	+
+chr2	800788	800820	b	b	-
+chr2	800788	800820	b	b	-
+chr2	800803	800835	b	b	-
+chr2	800816	800848	b	b	-
+chr2	800816	800848	b	b	-
+chr2	800878	800910	a	a	+
+chr2	800955	800987	a	a	+
+chr2	800940	800972	b	b	-
+chr2	800963	800995	b	b	-
+chr2	800965	800997	b	b	-
+chr2	800966	800998	b	b	-
+chr2	801003	801035	a	a	+
+chr2	801003	801035	a	a	+
+chr2	800977	801009	b	b	-
+chr2	800982	801014	b	b	-
+chr2	800982	801014	b	b	-
+chr2	801122	801154	b	b	-
+chr2	801126	801158	b	b	-
+chr2	801195	801227	a	a	+
+chr2	801245	801277	a	a	+
+chr2	801217	801249	b	b	-
+chr2	801218	801250	b	b	-
+chr2	801285	801317	a	a	+
+chr2	801257	801289	b	b	-
+chr2	801269	801301	b	b	-
+chr2	801322	801354	a	a	+
+chr2	801327	801359	a	a	+
+chr2	801299	801331	b	b	-
+chr2	801302	801334	b	b	-
+chr2	801423	801455	a	a	+
+chr2	801411	801443	b	b	-
+chr2	801455	801487	a	a	+
+chr2	801447	801479	b	b	-
+chr2	801486	801518	a	a	+
+chr2	801493	801525	a	a	+
+chr2	801495	801527	a	a	+
+chr2	801474	801506	b	b	-
+chr2	801486	801518	b	b	-
+chr2	801579	801611	b	b	-
+chr2	801630	801662	b	b	-
+chr2	801690	801722	b	b	-
+chr2	801716	801748	b	b	-
+chr2	801804	801836	a	a	+
+chr2	801811	801843	a	a	+
+chr2	801796	801828	b	b	-
+chr2	801836	801868	a	a	+
+chr2	801836	801868	a	a	+
+chr2	801808	801840	b	b	-
+chr2	801809	801841	b	b	-
+chr2	801850	801882	a	a	+
+chr2	801927	801959	a	a	+
+chr2	801945	801977	a	a	+
+chr2	801957	801989	b	b	-
+chr2	801957	801989	b	b	-
+chr2	801989	802021	b	b	-
+chr2	802053	802085	b	b	-
+chr2	802130	802162	b	b	-
+chr2	802131	802163	b	b	-
+chr2	802170	802202	a	a	+
+chr2	802170	802202	a	a	+
+chr2	802166	802198	b	b	-
+chr2	802557	802589	a	a	+
+chr2	802537	802569	b	b	-
+chr2	802607	802639	a	a	+
+chr2	802610	802642	a	a	+
+chr2	803212	803244	b	b	-
+chr2	803212	803244	b	b	-
+chr2	803212	803244	b	b	-
+chr2	803221	803253	b	b	-
+chr2	803221	803253	b	b	-
+chr2	803221	803253	b	b	-
+chr2	803380	803412	b	b	-
+chr2	803445	803477	a	a	+
+chr2	803479	803511	a	a	+
+chr2	803511	803543	b	b	-
+chr2	803652	803684	b	b	-
+chr2	803782	803814	b	b	-
+chr2	803817	803849	a	a	+
+chr2	803834	803866	a	a	+
+chr2	803812	803844	b	b	-
+chr2	803817	803849	b	b	-
+chr2	803996	804028	a	a	+
+chr2	803966	803998	b	b	-
+chr2	804097	804129	b	b	-
+chr2	804160	804192	a	a	+
+chr2	804145	804177	b	b	-
+chr2	804145	804177	b	b	-
+chr2	804167	804199	b	b	-
+chr2	804170	804202	b	b	-
+chr2	804216	804248	a	a	+
+chr2	804232	804264	a	a	+
+chr2	804232	804264	a	a	+
+chr2	804232	804264	a	a	+
+chr2	804325	804357	a	a	+
+chr2	804331	804363	a	a	+
+chr2	804322	804354	b	b	-
+chr2	804375	804407	a	a	+
+chr2	804680	804712	a	a	+
+chr2	804663	804695	b	b	-
+chr2	804698	804730	a	a	+
+chr2	804728	804760	a	a	+
+chr2	804728	804760	a	a	+
+chr2	804788	804820	b	b	-
+chr2	804789	804821	b	b	-
+chr2	804830	804862	a	a	+
+chr2	804830	804862	a	a	+
+chr2	804833	804865	a	a	+
+chr2	804833	804865	a	a	+
+chr2	804833	804865	a	a	+
+chr2	804807	804839	b	b	-
+chr2	804811	804843	b	b	-
+chr2	804845	804877	a	a	+
+chr2	804848	804880	a	a	+
+chr2	804849	804881	a	a	+
+chr2	804849	804881	a	a	+
+chr2	804852	804884	a	a	+
+chr2	804858	804890	a	a	+
+chr2	804859	804891	a	a	+
+chr2	804859	804891	a	a	+
+chr2	804859	804891	a	a	+
+chr2	804832	804864	b	b	-
+chr2	804832	804864	b	b	-
+chr2	804832	804864	b	b	-
+chr2	804834	804866	b	b	-
+chr2	804868	804900	a	a	+
+chr2	804874	804906	a	a	+
+chr2	804844	804876	b	b	-
+chr2	804844	804876	b	b	-
+chr2	804877	804909	a	a	+
+chr2	804845	804877	b	b	-
+chr2	804894	804926	a	a	+
+chr2	804895	804927	a	a	+
+chr2	804878	804910	b	b	-
+chr2	804902	804934	b	b	-
+chr2	805057	805089	b	b	-
+chr2	805104	805136	a	a	+
+chr2	805116	805148	a	a	+
+chr2	805116	805148	a	a	+
+chr2	805095	805127	b	b	-
+chr2	805131	805163	a	a	+
+chr2	805099	805131	b	b	-
+chr2	805134	805166	a	a	+
+chr2	805102	805134	b	b	-
+chr2	805102	805134	b	b	-
+chr2	805102	805134	b	b	-
+chr2	805102	805134	b	b	-
+chr2	805102	805134	b	b	-
+chr2	805105	805137	b	b	-
+chr2	805106	805138	b	b	-
+chr2	805106	805138	b	b	-
+chr2	805140	805172	a	a	+
+chr2	805141	805173	a	a	+
+chr2	805141	805173	a	a	+
+chr2	805149	805181	a	a	+
+chr2	805151	805183	a	a	+
+chr2	805151	805183	a	a	+
+chr2	805157	805189	a	a	+
+chr2	805157	805189	a	a	+
+chr2	805157	805189	a	a	+
+chr2	805157	805189	a	a	+
+chr2	805157	805189	a	a	+
+chr2	805158	805190	a	a	+
+chr2	805158	805190	a	a	+
+chr2	805127	805159	b	b	-
+chr2	805127	805159	b	b	-
+chr2	805127	805159	b	b	-
+chr2	805128	805160	b	b	-
+chr2	805128	805160	b	b	-
+chr2	805163	805195	a	a	+
+chr2	805131	805163	b	b	-
+chr2	805131	805163	b	b	-
+chr2	805131	805163	b	b	-
+chr2	805131	805163	b	b	-
+chr2	805131	805163	b	b	-
+chr2	805131	805163	b	b	-
+chr2	805131	805163	b	b	-
+chr2	805131	805163	b	b	-
+chr2	805131	805163	b	b	-
+chr2	805131	805163	b	b	-
+chr2	805131	805163	b	b	-
+chr2	805131	805163	b	b	-
+chr2	805164	805196	a	a	+
+chr2	805164	805196	a	a	+
+chr2	805164	805196	a	a	+
+chr2	805132	805164	b	b	-
+chr2	805132	805164	b	b	-
+chr2	805132	805164	b	b	-
+chr2	805132	805164	b	b	-
+chr2	805133	805165	b	b	-
+chr2	805133	805165	b	b	-
+chr2	805167	805199	a	a	+
+chr2	805168	805200	a	a	+
+chr2	805168	805200	a	a	+
+chr2	805168	805200	a	a	+
+chr2	805168	805200	a	a	+
+chr2	805169	805201	a	a	+
+chr2	805169	805201	a	a	+
+chr2	805137	805169	b	b	-
+chr2	805137	805169	b	b	-
+chr2	805137	805169	b	b	-
+chr2	805171	805203	a	a	+
+chr2	805172	805204	a	a	+
+chr2	805140	805172	b	b	-
+chr2	805140	805172	b	b	-
+chr2	805174	805206	a	a	+
+chr2	805174	805206	a	a	+
+chr2	805174	805206	a	a	+
+chr2	805176	805208	a	a	+
+chr2	805144	805176	b	b	-
+chr2	805144	805176	b	b	-
+chr2	805144	805176	b	b	-
+chr2	805144	805176	b	b	-
+chr2	805144	805176	b	b	-
+chr2	805144	805176	b	b	-
+chr2	805144	805176	b	b	-
+chr2	805144	805176	b	b	-
+chr2	805144	805176	b	b	-
+chr2	805144	805176	b	b	-
+chr2	805144	805176	b	b	-
+chr2	805144	805176	b	b	-
+chr2	805144	805176	b	b	-
+chr2	805144	805176	b	b	-
+chr2	805177	805209	a	a	+
+chr2	805145	805177	b	b	-
+chr2	805145	805177	b	b	-
+chr2	805178	805210	a	a	+
+chr2	805147	805179	b	b	-
+chr2	805180	805212	a	a	+
+chr2	805181	805213	a	a	+
+chr2	805181	805213	a	a	+
+chr2	805183	805215	a	a	+
+chr2	805183	805215	a	a	+
+chr2	805183	805215	a	a	+
+chr2	805186	805218	a	a	+
+chr2	805155	805187	b	b	-
+chr2	805190	805222	a	a	+
+chr2	805171	805203	b	b	-
+chr2	805173	805205	b	b	-
+chr2	805216	805248	a	a	+
+chr2	805233	805265	a	a	+
+chr2	805319	805351	a	a	+
+chr2	805319	805351	a	a	+
+chr2	805319	805351	a	a	+
+chr2	805291	805323	b	b	-
+chr2	805291	805323	b	b	-
+chr2	805293	805325	b	b	-
+chr2	805327	805359	a	a	+
+chr2	805328	805360	a	a	+
+chr2	805299	805331	b	b	-
+chr2	805311	805343	b	b	-
+chr2	805346	805378	a	a	+
+chr2	805314	805346	b	b	-
+chr2	805348	805380	a	a	+
+chr2	805317	805349	b	b	-
+chr2	805318	805350	b	b	-
+chr2	805349	805381	b	b	-
+chr2	805350	805382	b	b	-
+chr2	805350	805382	b	b	-
+chr2	805379	805411	b	b	-
+chr2	805462	805494	a	a	+
+chr2	805471	805503	a	a	+
+chr2	805450	805482	b	b	-
+chr2	805484	805516	a	a	+
+chr2	805485	805517	a	a	+
+chr2	805485	805517	a	a	+
+chr2	805454	805486	b	b	-
+chr2	805489	805521	a	a	+
+chr2	805493	805525	a	a	+
+chr2	805499	805531	a	a	+
+chr2	805499	805531	a	a	+
+chr2	805515	805547	a	a	+
+chr2	805516	805548	a	a	+
+chr2	805486	805518	b	b	-
+chr2	805562	805594	b	b	-
+chr2	805643	805675	a	a	+
+chr2	805612	805644	b	b	-
+chr2	805650	805682	a	a	+
+chr2	805625	805657	b	b	-
+chr2	805625	805657	b	b	-
+chr2	805632	805664	b	b	-
+chr2	805687	805719	a	a	+
+chr2	805689	805721	a	a	+
+chr2	805701	805733	a	a	+
+chr2	805709	805741	a	a	+
+chr2	805683	805715	b	b	-
+chr2	805683	805715	b	b	-
+chr2	805719	805751	a	a	+
+chr2	805692	805724	b	b	-
+chr2	805692	805724	b	b	-
+chr2	805692	805724	b	b	-
+chr2	805727	805759	a	a	+
+chr2	805727	805759	a	a	+
+chr2	805727	805759	a	a	+
+chr2	805727	805759	a	a	+
+chr2	805727	805759	a	a	+
+chr2	805728	805760	a	a	+
+chr2	805703	805735	b	b	-
+chr2	805743	805775	a	a	+
+chr2	805746	805778	a	a	+
+chr2	805721	805753	b	b	-
+chr2	805760	805792	a	a	+
+chr2	805760	805792	a	a	+
+chr2	805760	805792	a	a	+
+chr2	805760	805792	a	a	+
+chr2	805767	805799	a	a	+
+chr2	805741	805773	b	b	-
+chr2	805741	805773	b	b	-
+chr2	805776	805808	a	a	+
+chr2	805786	805818	a	a	+
+chr2	805801	805833	a	a	+
+chr2	805805	805837	a	a	+
+chr2	805805	805837	a	a	+
+chr2	805808	805840	a	a	+
+chr2	805814	805846	a	a	+
+chr2	805814	805846	a	a	+
+chr2	805823	805855	a	a	+
+chr2	805792	805824	b	b	-
+chr2	805842	805874	a	a	+
+chr2	805846	805878	a	a	+
+chr2	805851	805883	a	a	+
+chr2	805821	805853	b	b	-
+chr2	805836	805868	b	b	-
+chr2	805891	805923	a	a	+
+chr2	805862	805894	b	b	-
+chr2	805926	805958	b	b	-
+chr2	805926	805958	b	b	-
+chr2	805928	805960	b	b	-
+chr2	805973	806005	a	a	+
+chr2	805981	806013	a	a	+
+chr2	805955	805987	b	b	-
+chr2	805994	806026	a	a	+
+chr2	805971	806003	b	b	-
+chr2	805971	806003	b	b	-
+chr2	805976	806008	b	b	-
+chr2	806011	806043	b	b	-
+chr2	806093	806125	b	b	-
+chr2	806154	806186	a	a	+
+chr2	806175	806207	a	a	+
+chr2	806148	806180	b	b	-
+chr2	806148	806180	b	b	-
+chr2	806166	806198	b	b	-
+chr2	806227	806259	b	b	-
+chr2	806284	806316	a	a	+
+chr2	806262	806294	b	b	-
+chr2	806310	806342	a	a	+
+chr2	806315	806347	a	a	+
+chr2	806316	806348	a	a	+
+chr2	806357	806389	a	a	+
+chr2	806361	806393	a	a	+
+chr2	806362	806394	a	a	+
+chr2	806362	806394	a	a	+
+chr2	806380	806412	a	a	+
+chr2	806480	806512	a	a	+
+chr2	806450	806482	b	b	-
+chr2	806456	806488	b	b	-
+chr2	806464	806496	b	b	-
+chr2	806519	806551	a	a	+
+chr2	806525	806557	a	a	+
+chr2	806496	806528	b	b	-
+chr2	806496	806528	b	b	-
+chr2	806538	806570	a	a	+
+chr2	806652	806684	a	a	+
+chr2	806672	806704	a	a	+
+chr2	806672	806704	a	a	+
+chr2	806672	806704	a	a	+
+chr2	806653	806685	b	b	-
+chr2	806707	806739	b	b	-
+chr2	806729	806761	b	b	-
+chr2	806758	806790	b	b	-
+chr2	806760	806792	b	b	-
+chr2	806761	806793	b	b	-
+chr2	806810	806842	a	a	+
+chr2	806786	806818	b	b	-
+chr2	806833	806865	a	a	+
+chr2	806838	806870	a	a	+
+chr2	806838	806870	a	a	+
+chr2	806838	806870	a	a	+
+chr2	806838	806870	a	a	+
+chr2	806902	806934	b	b	-
+chr2	806904	806936	b	b	-
+chr2	806906	806938	b	b	-
+chr2	806906	806938	b	b	-
+chr2	806939	806971	a	a	+
+chr2	806940	806972	a	a	+
+chr2	806941	806973	a	a	+
+chr2	806910	806942	b	b	-
+chr2	806945	806977	a	a	+
+chr2	806913	806945	b	b	-
+chr2	806962	806994	a	a	+
+chr2	806968	807000	a	a	+
+chr2	806937	806969	b	b	-
+chr2	806974	807006	a	a	+
+chr2	806943	806975	b	b	-
+chr2	806954	806986	b	b	-
+chr2	806956	806988	b	b	-
+chr2	806969	807001	b	b	-
+chr2	807004	807036	a	a	+
+chr2	806973	807005	b	b	-
+chr2	807009	807041	a	a	+
+chr2	807022	807054	a	a	+
+chr2	807001	807033	b	b	-
+chr2	807014	807046	b	b	-
+chr2	807046	807078	b	b	-
+chr2	807056	807088	b	b	-
+chr2	807093	807125	a	a	+
+chr2	807061	807093	b	b	-
+chr2	807061	807093	b	b	-
+chr2	807096	807128	a	a	+
+chr2	807065	807097	b	b	-
+chr2	807070	807102	b	b	-
+chr2	807104	807136	a	a	+
+chr2	807106	807138	a	a	+
+chr2	807106	807138	a	a	+
+chr2	807106	807138	a	a	+
+chr2	807106	807138	a	a	+
+chr2	807106	807138	a	a	+
+chr2	807106	807138	a	a	+
+chr2	807075	807107	b	b	-
+chr2	807108	807140	a	a	+
+chr2	807076	807108	b	b	-
+chr2	807077	807109	b	b	-
+chr2	807113	807145	a	a	+
+chr2	807113	807145	a	a	+
+chr2	807113	807145	a	a	+
+chr2	807115	807147	a	a	+
+chr2	807115	807147	a	a	+
+chr2	807115	807147	a	a	+
+chr2	807115	807147	a	a	+
+chr2	807117	807149	a	a	+
+chr2	807085	807117	b	b	-
+chr2	807089	807121	b	b	-
+chr2	807122	807154	a	a	+
+chr2	807122	807154	a	a	+
+chr2	807093	807125	b	b	-
+chr2	807135	807167	a	a	+
+chr2	807156	807188	a	a	+
+chr2	807258	807290	a	a	+
+chr2	807244	807276	b	b	-
+chr2	807267	807299	b	b	-
+chr2	807267	807299	b	b	-
+chr2	807322	807354	b	b	-
+chr2	807334	807366	b	b	-
+chr2	807339	807371	b	b	-
+chr2	807350	807382	b	b	-
+chr2	807353	807385	b	b	-
+chr2	807388	807420	a	a	+
+chr2	807392	807424	a	a	+
+chr2	807393	807425	a	a	+
+chr2	807393	807425	a	a	+
+chr2	807394	807426	a	a	+
+chr2	807362	807394	b	b	-
+chr2	807362	807394	b	b	-
+chr2	807362	807394	b	b	-
+chr2	807395	807427	a	a	+
+chr2	807397	807429	a	a	+
+chr2	807367	807399	b	b	-
+chr2	807367	807399	b	b	-
+chr2	807401	807433	a	a	+
+chr2	807401	807433	a	a	+
+chr2	807401	807433	a	a	+
+chr2	807401	807433	a	a	+
+chr2	807401	807433	a	a	+
+chr2	807401	807433	a	a	+
+chr2	807370	807402	b	b	-
+chr2	807407	807439	a	a	+
+chr2	807407	807439	a	a	+
+chr2	807407	807439	a	a	+
+chr2	807407	807439	a	a	+
+chr2	807407	807439	a	a	+
+chr2	807375	807407	b	b	-
+chr2	807408	807440	a	a	+
+chr2	807408	807440	a	a	+
+chr2	807376	807408	b	b	-
+chr2	807380	807412	b	b	-
+chr2	807381	807413	b	b	-
+chr2	807382	807414	b	b	-
+chr2	807383	807415	b	b	-
+chr2	807402	807434	b	b	-
+chr2	807502	807534	b	b	-
+chr2	807554	807586	a	a	+
+chr2	807554	807586	a	a	+
+chr2	807524	807556	b	b	-
+chr2	807561	807593	a	a	+
+chr2	807562	807594	a	a	+
+chr2	807531	807563	b	b	-
+chr2	807547	807579	b	b	-
+chr2	807548	807580	b	b	-
+chr2	807593	807625	a	a	+
+chr2	807562	807594	b	b	-
+chr2	807650	807682	a	a	+
+chr2	807674	807706	b	b	-
+chr2	807728	807760	a	a	+
+chr2	807706	807738	b	b	-
+chr2	807891	807923	a	a	+
+chr2	807896	807928	a	a	+
+chr2	807918	807950	b	b	-
+chr2	808057	808089	a	a	+
+chr2	808222	808254	a	a	+
+chr2	808210	808242	b	b	-
+chr2	808219	808251	b	b	-
+chr2	808219	808251	b	b	-
+chr2	808255	808287	a	a	+
+chr2	808263	808295	a	a	+
+chr2	808355	808387	b	b	-
+chr2	808355	808387	b	b	-
+chr2	808356	808388	b	b	-
+chr2	808425	808457	a	a	+
+chr2	808425	808457	a	a	+
+chr2	808396	808428	b	b	-
+chr2	808429	808461	a	a	+
+chr2	808430	808462	a	a	+
+chr2	808404	808436	b	b	-
+chr2	808438	808470	a	a	+
+chr2	808438	808470	a	a	+
+chr2	808439	808471	a	a	+
+chr2	808444	808476	a	a	+
+chr2	808445	808477	a	a	+
+chr2	808454	808486	a	a	+
+chr2	808423	808455	b	b	-
+chr2	808423	808455	b	b	-
+chr2	808424	808456	b	b	-
+chr2	808429	808461	b	b	-
+chr2	808464	808496	a	a	+
+chr2	808465	808497	a	a	+
+chr2	808465	808497	a	a	+
+chr2	808474	808506	a	a	+
+chr2	808447	808479	b	b	-
+chr2	808481	808513	a	a	+
+chr2	808454	808486	b	b	-
+chr2	808541	808573	a	a	+
+chr2	808566	808598	a	a	+
+chr2	808578	808610	b	b	-
+chr2	808630	808662	a	a	+
+chr2	808610	808642	b	b	-
+chr2	808642	808674	b	b	-
+chr2	808686	808718	a	a	+
+chr2	808657	808689	b	b	-
+chr2	808657	808689	b	b	-
+chr2	808657	808689	b	b	-
+chr2	808657	808689	b	b	-
+chr2	808661	808693	b	b	-
+chr2	808695	808727	a	a	+
+chr2	808707	808739	a	a	+
+chr2	808711	808743	a	a	+
+chr2	808711	808743	a	a	+
+chr2	808714	808746	a	a	+
+chr2	808686	808718	b	b	-
+chr2	808686	808718	b	b	-
+chr2	808725	808757	b	b	-
+chr2	808733	808765	b	b	-
+chr2	808778	808810	a	a	+
+chr2	808792	808824	a	a	+
+chr2	808761	808793	b	b	-
+chr2	808762	808794	b	b	-
+chr2	808849	808881	a	a	+
+chr2	808849	808881	a	a	+
+chr2	808868	808900	a	a	+
+chr2	808868	808900	a	a	+
+chr2	808836	808868	b	b	-
+chr2	808840	808872	b	b	-
+chr2	808878	808910	a	a	+
+chr2	808849	808881	b	b	-
+chr2	808849	808881	b	b	-
+chr2	808885	808917	a	a	+
+chr2	808891	808923	a	a	+
+chr2	808860	808892	b	b	-
+chr2	808860	808892	b	b	-
+chr2	808896	808928	a	a	+
+chr2	808886	808918	b	b	-
+chr2	808899	808931	b	b	-
+chr2	808899	808931	b	b	-
+chr2	808899	808931	b	b	-
+chr2	808899	808931	b	b	-
+chr2	808899	808931	b	b	-
+chr2	808899	808931	b	b	-
+chr2	808942	808974	a	a	+
+chr2	808944	808976	a	a	+
+chr2	808944	808976	a	a	+
+chr2	808949	808981	a	a	+
+chr2	808949	808981	a	a	+
+chr2	808949	808981	a	a	+
+chr2	808962	808994	a	a	+
+chr2	808967	808999	a	a	+
+chr2	808945	808977	b	b	-
+chr2	808997	809029	a	a	+
+chr2	809028	809060	a	a	+
+chr2	809028	809060	a	a	+
+chr2	808996	809028	b	b	-
+chr2	809030	809062	a	a	+
+chr2	809053	809085	a	a	+
+chr2	809060	809092	a	a	+
+chr2	809030	809062	b	b	-
+chr2	809031	809063	b	b	-
+chr2	809037	809069	b	b	-
+chr2	809037	809069	b	b	-
+chr2	809042	809074	b	b	-
+chr2	809046	809078	b	b	-
+chr2	809097	809129	a	a	+
+chr2	809068	809100	b	b	-
+chr2	809075	809107	b	b	-
+chr2	809119	809151	a	a	+
+chr2	809092	809124	b	b	-
+chr2	809092	809124	b	b	-
+chr2	809092	809124	b	b	-
+chr2	809125	809157	a	a	+
+chr2	809125	809157	a	a	+
+chr2	809125	809157	a	a	+
+chr2	809132	809164	a	a	+
+chr2	809135	809167	a	a	+
+chr2	809135	809167	a	a	+
+chr2	809135	809167	a	a	+
+chr2	809138	809170	a	a	+
+chr2	809106	809138	b	b	-
+chr2	809144	809176	a	a	+
+chr2	809113	809145	b	b	-
+chr2	809148	809180	a	a	+
+chr2	809119	809151	b	b	-
+chr2	809119	809151	b	b	-
+chr2	809122	809154	b	b	-
+chr2	809125	809157	b	b	-
+chr2	809125	809157	b	b	-
+chr2	809158	809190	a	a	+
+chr2	809130	809162	b	b	-
+chr2	809134	809166	b	b	-
+chr2	809139	809171	b	b	-
+chr2	809139	809171	b	b	-
+chr2	809139	809171	b	b	-
+chr2	809139	809171	b	b	-
+chr2	809140	809172	b	b	-
+chr2	809140	809172	b	b	-
+chr2	809140	809172	b	b	-
+chr2	809142	809174	b	b	-
+chr2	809142	809174	b	b	-
+chr2	809148	809180	b	b	-
+chr2	809154	809186	b	b	-
+chr2	809154	809186	b	b	-
+chr2	809154	809186	b	b	-
+chr2	809155	809187	b	b	-
+chr2	809156	809188	b	b	-
+chr2	809159	809191	b	b	-
+chr2	809162	809194	b	b	-
+chr2	809162	809194	b	b	-
+chr2	809163	809195	b	b	-
+chr2	809202	809234	a	a	+
+chr2	809177	809209	b	b	-
+chr2	809187	809219	b	b	-
+chr2	809221	809253	a	a	+
+chr2	809221	809253	a	a	+
+chr2	809232	809264	a	a	+
+chr2	809232	809264	a	a	+
+chr2	809247	809279	a	a	+
+chr2	809247	809279	a	a	+
+chr2	809215	809247	b	b	-
+chr2	809252	809284	a	a	+
+chr2	809253	809285	a	a	+
+chr2	809255	809287	a	a	+
+chr2	809229	809261	b	b	-
+chr2	809280	809312	a	a	+
+chr2	809280	809312	a	a	+
+chr2	809280	809312	a	a	+
+chr2	809281	809313	a	a	+
+chr2	809261	809293	b	b	-
+chr2	809294	809326	a	a	+
+chr2	809262	809294	b	b	-
+chr2	809265	809297	b	b	-
+chr2	809265	809297	b	b	-
+chr2	809300	809332	a	a	+
+chr2	809303	809335	a	a	+
+chr2	809304	809336	a	a	+
+chr2	809272	809304	b	b	-
+chr2	809305	809337	a	a	+
+chr2	809308	809340	a	a	+
+chr2	809279	809311	b	b	-
+chr2	809312	809344	a	a	+
+chr2	809280	809312	b	b	-
+chr2	809315	809347	a	a	+
+chr2	809287	809319	b	b	-
+chr2	809287	809319	b	b	-
+chr2	809287	809319	b	b	-
+chr2	809320	809352	a	a	+
+chr2	809321	809353	a	a	+
+chr2	809322	809354	a	a	+
+chr2	809322	809354	a	a	+
+chr2	809322	809354	a	a	+
+chr2	809322	809354	a	a	+
+chr2	809322	809354	a	a	+
+chr2	809322	809354	a	a	+
+chr2	809322	809354	a	a	+
+chr2	809322	809354	a	a	+
+chr2	809323	809355	a	a	+
+chr2	809291	809323	b	b	-
+chr2	809324	809356	a	a	+
+chr2	809325	809357	a	a	+
+chr2	809325	809357	a	a	+
+chr2	809326	809358	a	a	+
+chr2	809294	809326	b	b	-
+chr2	809327	809359	a	a	+
+chr2	809327	809359	a	a	+
+chr2	809296	809328	b	b	-
+chr2	809296	809328	b	b	-
+chr2	809298	809330	b	b	-
+chr2	809298	809330	b	b	-
+chr2	809331	809363	a	a	+
+chr2	809331	809363	a	a	+
+chr2	809331	809363	a	a	+
+chr2	809331	809363	a	a	+
+chr2	809299	809331	b	b	-
+chr2	809299	809331	b	b	-
+chr2	809334	809366	a	a	+
+chr2	809302	809334	b	b	-
+chr2	809302	809334	b	b	-
+chr2	809302	809334	b	b	-
+chr2	809302	809334	b	b	-
+chr2	809335	809367	a	a	+
+chr2	809335	809367	a	a	+
+chr2	809335	809367	a	a	+
+chr2	809338	809370	a	a	+
+chr2	809340	809372	a	a	+
+chr2	809340	809372	a	a	+
+chr2	809340	809372	a	a	+
+chr2	809340	809372	a	a	+
+chr2	809341	809373	a	a	+
+chr2	809341	809373	a	a	+
+chr2	809341	809373	a	a	+
+chr2	809341	809373	a	a	+
+chr2	809341	809373	a	a	+
+chr2	809309	809341	b	b	-
+chr2	809309	809341	b	b	-
+chr2	809309	809341	b	b	-
+chr2	809312	809344	b	b	-
+chr2	809312	809344	b	b	-
+chr2	809312	809344	b	b	-
+chr2	809312	809344	b	b	-
+chr2	809312	809344	b	b	-
+chr2	809312	809344	b	b	-
+chr2	809349	809381	a	a	+
+chr2	809350	809382	a	a	+
+chr2	809352	809384	a	a	+
+chr2	809320	809352	b	b	-
+chr2	809321	809353	b	b	-
+chr2	809326	809358	b	b	-
+chr2	809359	809391	a	a	+
+chr2	809359	809391	a	a	+
+chr2	809362	809394	a	a	+
+chr2	809362	809394	a	a	+
+chr2	809362	809394	a	a	+
+chr2	809337	809369	b	b	-
+chr2	809337	809369	b	b	-
+chr2	809371	809403	a	a	+
+chr2	809372	809404	a	a	+
+chr2	809341	809373	b	b	-
+chr2	809345	809377	b	b	-
+chr2	809378	809410	a	a	+
+chr2	809378	809410	a	a	+
+chr2	809347	809379	b	b	-
+chr2	809347	809379	b	b	-
+chr2	809384	809416	a	a	+
+chr2	809538	809570	a	a	+
+chr2	809545	809577	b	b	-
+chr2	809562	809594	b	b	-
+chr2	809630	809662	a	a	+
+chr2	809630	809662	a	a	+
+chr2	809634	809666	a	a	+
+chr2	809602	809634	b	b	-
+chr2	809602	809634	b	b	-
+chr2	809635	809667	a	a	+
+chr2	809603	809635	b	b	-
+chr2	809603	809635	b	b	-
+chr2	809607	809639	b	b	-
+chr2	809641	809673	a	a	+
+chr2	809609	809641	b	b	-
+chr2	809611	809643	b	b	-
+chr2	809644	809676	a	a	+
+chr2	809616	809648	b	b	-
+chr2	809650	809682	a	a	+
+chr2	809654	809686	a	a	+
+chr2	809654	809686	a	a	+
+chr2	809654	809686	a	a	+
+chr2	809627	809659	b	b	-
+chr2	809627	809659	b	b	-
+chr2	809627	809659	b	b	-
+chr2	809627	809659	b	b	-
+chr2	809660	809692	a	a	+
+chr2	809662	809694	a	a	+
+chr2	809663	809695	a	a	+
+chr2	809663	809695	a	a	+
+chr2	809663	809695	a	a	+
+chr2	809664	809696	a	a	+
+chr2	809664	809696	a	a	+
+chr2	809634	809666	b	b	-
+chr2	809634	809666	b	b	-
+chr2	809634	809666	b	b	-
+chr2	809634	809666	b	b	-
+chr2	809634	809666	b	b	-
+chr2	809634	809666	b	b	-
+chr2	809667	809699	a	a	+
+chr2	809635	809667	b	b	-
+chr2	809636	809668	b	b	-
+chr2	809636	809668	b	b	-
+chr2	809672	809704	a	a	+
+chr2	809672	809704	a	a	+
+chr2	809672	809704	a	a	+
+chr2	809677	809709	a	a	+
+chr2	809677	809709	a	a	+
+chr2	809678	809710	a	a	+
+chr2	809678	809710	a	a	+
+chr2	809678	809710	a	a	+
+chr2	809678	809710	a	a	+
+chr2	809678	809710	a	a	+
+chr2	809646	809678	b	b	-
+chr2	809648	809680	b	b	-
+chr2	809684	809716	a	a	+
+chr2	809686	809718	a	a	+
+chr2	809686	809718	a	a	+
+chr2	809686	809718	a	a	+
+chr2	809686	809718	a	a	+
+chr2	809686	809718	a	a	+
+chr2	809656	809688	b	b	-
+chr2	809656	809688	b	b	-
+chr2	809656	809688	b	b	-
+chr2	809657	809689	b	b	-
+chr2	809657	809689	b	b	-
+chr2	809657	809689	b	b	-
+chr2	809657	809689	b	b	-
+chr2	809657	809689	b	b	-
+chr2	809695	809727	a	a	+
+chr2	809695	809727	a	a	+
+chr2	809697	809729	a	a	+
+chr2	809680	809712	b	b	-
+chr2	809960	809992	a	a	+
+chr2	809960	809992	a	a	+
+chr2	809963	809995	a	a	+
+chr2	809942	809974	b	b	-
+chr2	809978	810010	a	a	+
+chr2	809947	809979	b	b	-
+chr2	809947	809979	b	b	-
+chr2	809947	809979	b	b	-
+chr2	809983	810015	a	a	+
+chr2	809983	810015	a	a	+
+chr2	809983	810015	a	a	+
+chr2	809983	810015	a	a	+
+chr2	809953	809985	b	b	-
+chr2	809987	810019	a	a	+
+chr2	809992	810024	a	a	+
+chr2	809992	810024	a	a	+
+chr2	809993	810025	a	a	+
+chr2	809961	809993	b	b	-
+chr2	809961	809993	b	b	-
+chr2	809974	810006	b	b	-
+chr2	809974	810006	b	b	-
+chr2	810015	810047	a	a	+
+chr2	809984	810016	b	b	-
+chr2	809984	810016	b	b	-
+chr2	809984	810016	b	b	-
+chr2	809984	810016	b	b	-
+chr2	809984	810016	b	b	-
+chr2	810019	810051	a	a	+
+chr2	810019	810051	a	a	+
+chr2	809987	810019	b	b	-
+chr2	809991	810023	b	b	-
+chr2	809991	810023	b	b	-
+chr2	809991	810023	b	b	-
+chr2	810027	810059	a	a	+
+chr2	810027	810059	a	a	+
+chr2	810027	810059	a	a	+
+chr2	810027	810059	a	a	+
+chr2	810027	810059	a	a	+
+chr2	810028	810060	a	a	+
+chr2	810000	810032	b	b	-
+chr2	810000	810032	b	b	-
+chr2	810000	810032	b	b	-
+chr2	810004	810036	b	b	-
+chr2	810037	810069	a	a	+
+chr2	810013	810045	b	b	-
+chr2	810059	810091	a	a	+
+chr2	810074	810106	b	b	-
+chr2	810082	810114	b	b	-
+chr2	810141	810173	a	a	+
+chr2	810152	810184	a	a	+
+chr2	810152	810184	a	a	+
+chr2	810153	810185	a	a	+
+chr2	810121	810153	b	b	-
+chr2	810121	810153	b	b	-
+chr2	810123	810155	b	b	-
+chr2	810124	810156	b	b	-
+chr2	810170	810202	a	a	+
+chr2	810139	810171	b	b	-
+chr2	810179	810211	a	a	+
+chr2	810209	810241	a	a	+
+chr2	810221	810253	a	a	+
+chr2	810197	810229	b	b	-
+chr2	810197	810229	b	b	-
+chr2	810256	810288	b	b	-
+chr2	810266	810298	b	b	-
+chr2	810266	810298	b	b	-
+chr2	810319	810351	a	a	+
+chr2	810292	810324	b	b	-
+chr2	810328	810360	a	a	+
+chr2	810348	810380	a	a	+
+chr2	810383	810415	b	b	-
+chr2	810384	810416	b	b	-
+chr2	810435	810467	a	a	+
+chr2	810411	810443	b	b	-
+chr2	810415	810447	b	b	-
+chr2	810462	810494	a	a	+
+chr2	810476	810508	a	a	+
+chr2	810498	810530	a	a	+
+chr2	810475	810507	b	b	-
+chr2	810479	810511	b	b	-
+chr2	810479	810511	b	b	-
+chr2	810480	810512	b	b	-
+chr2	810517	810549	a	a	+
+chr2	810523	810555	a	a	+
+chr2	810494	810526	b	b	-
+chr2	810529	810561	a	a	+
+chr2	810497	810529	b	b	-
+chr2	810540	810572	a	a	+
+chr2	810544	810576	a	a	+
+chr2	810516	810548	b	b	-
+chr2	810516	810548	b	b	-
+chr2	810516	810548	b	b	-
+chr2	810516	810548	b	b	-
+chr2	810550	810582	a	a	+
+chr2	810571	810603	a	a	+
+chr2	810600	810632	a	a	+
+chr2	810612	810644	b	b	-
+chr2	810615	810647	b	b	-
+chr2	810615	810647	b	b	-
+chr2	810615	810647	b	b	-
+chr2	810630	810662	b	b	-
+chr2	810639	810671	b	b	-
+chr2	810677	810709	b	b	-
+chr2	810763	810795	b	b	-
+chr2	810801	810833	a	a	+
+chr2	810841	810873	b	b	-
+chr2	810864	810896	b	b	-
+chr2	810906	810938	a	a	+
+chr2	810908	810940	a	a	+
+chr2	810908	810940	a	a	+
+chr2	810946	810978	a	a	+
+chr2	810915	810947	b	b	-
+chr2	810952	810984	a	a	+
+chr2	810928	810960	b	b	-
+chr2	810963	810995	a	a	+
+chr2	810933	810965	b	b	-
+chr2	810941	810973	b	b	-
+chr2	810941	810973	b	b	-
+chr2	810988	811020	a	a	+
+chr2	811062	811094	a	a	+
+chr2	811032	811064	b	b	-
+chr2	811034	811066	b	b	-
+chr2	811038	811070	b	b	-
+chr2	811038	811070	b	b	-
+chr2	811067	811099	b	b	-
+chr2	811067	811099	b	b	-
+chr2	811071	811103	b	b	-
+chr2	811107	811139	a	a	+
+chr2	811082	811114	b	b	-
+chr2	811120	811152	a	a	+
+chr2	811124	811156	a	a	+
+chr2	811098	811130	b	b	-
+chr2	811166	811198	a	a	+
+chr2	811149	811181	b	b	-
+chr2	811224	811256	a	a	+
+chr2	811203	811235	b	b	-
+chr2	811203	811235	b	b	-
+chr2	811203	811235	b	b	-
+chr2	811237	811269	a	a	+
+chr2	811237	811269	a	a	+
+chr2	811237	811269	a	a	+
+chr2	811239	811271	a	a	+
+chr2	811239	811271	a	a	+
+chr2	811241	811273	a	a	+
+chr2	811211	811243	b	b	-
+chr2	811211	811243	b	b	-
+chr2	811211	811243	b	b	-
+chr2	811211	811243	b	b	-
+chr2	811211	811243	b	b	-
+chr2	811212	811244	b	b	-
+chr2	811245	811277	a	a	+
+chr2	811245	811277	a	a	+
+chr2	811245	811277	a	a	+
+chr2	811245	811277	a	a	+
+chr2	811246	811278	a	a	+
+chr2	811215	811247	b	b	-
+chr2	811217	811249	b	b	-
+chr2	811251	811283	a	a	+
+chr2	811251	811283	a	a	+
+chr2	811251	811283	a	a	+
+chr2	811251	811283	a	a	+
+chr2	811251	811283	a	a	+
+chr2	811251	811283	a	a	+
+chr2	811251	811283	a	a	+
+chr2	811251	811283	a	a	+
+chr2	811252	811284	a	a	+
+chr2	811252	811284	a	a	+
+chr2	811252	811284	a	a	+
+chr2	811221	811253	b	b	-
+chr2	811222	811254	b	b	-
+chr2	811222	811254	b	b	-
+chr2	811255	811287	a	a	+
+chr2	811255	811287	a	a	+
+chr2	811223	811255	b	b	-
+chr2	811256	811288	a	a	+
+chr2	811256	811288	a	a	+
+chr2	811257	811289	a	a	+
+chr2	811228	811260	b	b	-
+chr2	811229	811261	b	b	-
+chr2	811262	811294	a	a	+
+chr2	811262	811294	a	a	+
+chr2	811264	811296	a	a	+
+chr2	811269	811301	a	a	+
+chr2	811237	811269	b	b	-
+chr2	811238	811270	b	b	-
+chr2	811238	811270	b	b	-
+chr2	811238	811270	b	b	-
+chr2	811238	811270	b	b	-
+chr2	811246	811278	b	b	-
+chr2	811247	811279	b	b	-
+chr2	811280	811312	a	a	+
+chr2	811284	811316	a	a	+
+chr2	811286	811318	a	a	+
+chr2	811269	811301	b	b	-
+chr2	811332	811364	a	a	+
+chr2	811332	811364	a	a	+
+chr2	811340	811372	b	b	-
+chr2	811341	811373	b	b	-
+chr2	811346	811378	b	b	-
+chr2	811352	811384	b	b	-
+chr2	811353	811385	b	b	-
+chr2	811386	811418	a	a	+
+chr2	811386	811418	a	a	+
+chr2	811386	811418	a	a	+
+chr2	811390	811422	a	a	+
+chr2	811390	811422	a	a	+
+chr2	811390	811422	a	a	+
+chr2	811393	811425	a	a	+
+chr2	811361	811393	b	b	-
+chr2	811395	811427	a	a	+
+chr2	811363	811395	b	b	-
+chr2	811363	811395	b	b	-
+chr2	811363	811395	b	b	-
+chr2	811363	811395	b	b	-
+chr2	811363	811395	b	b	-
+chr2	811396	811428	a	a	+
+chr2	811396	811428	a	a	+
+chr2	811396	811428	a	a	+
+chr2	811364	811396	b	b	-
+chr2	811364	811396	b	b	-
+chr2	811402	811434	a	a	+
+chr2	811402	811434	a	a	+
+chr2	811402	811434	a	a	+
+chr2	811403	811435	a	a	+
+chr2	811405	811437	a	a	+
+chr2	811406	811438	a	a	+
+chr2	811406	811438	a	a	+
+chr2	811407	811439	a	a	+
+chr2	811407	811439	a	a	+
+chr2	811407	811439	a	a	+
+chr2	811407	811439	a	a	+
+chr2	811375	811407	b	b	-
+chr2	811375	811407	b	b	-
+chr2	811408	811440	a	a	+
+chr2	811408	811440	a	a	+
+chr2	811408	811440	a	a	+
+chr2	811408	811440	a	a	+
+chr2	811408	811440	a	a	+
+chr2	811408	811440	a	a	+
+chr2	811376	811408	b	b	-
+chr2	811376	811408	b	b	-
+chr2	811380	811412	b	b	-
+chr2	811380	811412	b	b	-
+chr2	811414	811446	a	a	+
+chr2	811414	811446	a	a	+
+chr2	811414	811446	a	a	+
+chr2	811414	811446	a	a	+
+chr2	811414	811446	a	a	+
+chr2	811414	811446	a	a	+
+chr2	811414	811446	a	a	+
+chr2	811414	811446	a	a	+
+chr2	811382	811414	b	b	-
+chr2	811382	811414	b	b	-
+chr2	811382	811414	b	b	-
+chr2	811383	811415	b	b	-
+chr2	811387	811419	b	b	-
+chr2	811387	811419	b	b	-
+chr2	811387	811419	b	b	-
+chr2	811387	811419	b	b	-
+chr2	811387	811419	b	b	-
+chr2	811387	811419	b	b	-
+chr2	811421	811453	a	a	+
+chr2	811421	811453	a	a	+
+chr2	811389	811421	b	b	-
+chr2	811422	811454	a	a	+
+chr2	811422	811454	a	a	+
+chr2	811422	811454	a	a	+
+chr2	811423	811455	a	a	+
+chr2	811424	811456	a	a	+
+chr2	811425	811457	a	a	+
+chr2	811425	811457	a	a	+
+chr2	811425	811457	a	a	+
+chr2	811425	811457	a	a	+
+chr2	811425	811457	a	a	+
+chr2	811393	811425	b	b	-
+chr2	811393	811425	b	b	-
+chr2	811393	811425	b	b	-
+chr2	811393	811425	b	b	-
+chr2	811426	811458	a	a	+
+chr2	811426	811458	a	a	+
+chr2	811426	811458	a	a	+
+chr2	811426	811458	a	a	+
+chr2	811426	811458	a	a	+
+chr2	811426	811458	a	a	+
+chr2	811427	811459	a	a	+
+chr2	811427	811459	a	a	+
+chr2	811427	811459	a	a	+
+chr2	811427	811459	a	a	+
+chr2	811427	811459	a	a	+
+chr2	811395	811427	b	b	-
+chr2	811395	811427	b	b	-
+chr2	811395	811427	b	b	-
+chr2	811395	811427	b	b	-
+chr2	811396	811428	b	b	-
+chr2	811396	811428	b	b	-
+chr2	811396	811428	b	b	-
+chr2	811396	811428	b	b	-
+chr2	811429	811461	a	a	+
+chr2	811429	811461	a	a	+
+chr2	811429	811461	a	a	+
+chr2	811397	811429	b	b	-
+chr2	811430	811462	a	a	+
+chr2	811430	811462	a	a	+
+chr2	811430	811462	a	a	+
+chr2	811430	811462	a	a	+
+chr2	811430	811462	a	a	+
+chr2	811398	811430	b	b	-
+chr2	811398	811430	b	b	-
+chr2	811398	811430	b	b	-
+chr2	811398	811430	b	b	-
+chr2	811431	811463	a	a	+
+chr2	811431	811463	a	a	+
+chr2	811431	811463	a	a	+
+chr2	811431	811463	a	a	+
+chr2	811431	811463	a	a	+
+chr2	811431	811463	a	a	+
+chr2	811399	811431	b	b	-
+chr2	811399	811431	b	b	-
+chr2	811399	811431	b	b	-
+chr2	811399	811431	b	b	-
+chr2	811399	811431	b	b	-
+chr2	811399	811431	b	b	-
+chr2	811399	811431	b	b	-
+chr2	811399	811431	b	b	-
+chr2	811432	811464	a	a	+
+chr2	811400	811432	b	b	-
+chr2	811400	811432	b	b	-
+chr2	811400	811432	b	b	-
+chr2	811433	811465	a	a	+
+chr2	811433	811465	a	a	+
+chr2	811401	811433	b	b	-
+chr2	811435	811467	a	a	+
+chr2	811435	811467	a	a	+
+chr2	811435	811467	a	a	+
+chr2	811435	811467	a	a	+
+chr2	811403	811435	b	b	-
+chr2	811403	811435	b	b	-
+chr2	811403	811435	b	b	-
+chr2	811405	811437	b	b	-
+chr2	811439	811471	a	a	+
+chr2	811440	811472	a	a	+
+chr2	811408	811440	b	b	-
+chr2	811408	811440	b	b	-
+chr2	811408	811440	b	b	-
+chr2	811441	811473	a	a	+
+chr2	811441	811473	a	a	+
+chr2	811441	811473	a	a	+
+chr2	811441	811473	a	a	+
+chr2	811441	811473	a	a	+
+chr2	811441	811473	a	a	+
+chr2	811441	811473	a	a	+
+chr2	811441	811473	a	a	+
+chr2	811409	811441	b	b	-
+chr2	811409	811441	b	b	-
+chr2	811409	811441	b	b	-
+chr2	811411	811443	b	b	-
+chr2	811411	811443	b	b	-
+chr2	811411	811443	b	b	-
+chr2	811411	811443	b	b	-
+chr2	811411	811443	b	b	-
+chr2	811412	811444	b	b	-
+chr2	811412	811444	b	b	-
+chr2	811412	811444	b	b	-
+chr2	811412	811444	b	b	-
+chr2	811412	811444	b	b	-
+chr2	811413	811445	b	b	-
+chr2	811417	811449	b	b	-
+chr2	811451	811483	a	a	+
+chr2	811451	811483	a	a	+
+chr2	811419	811451	b	b	-
+chr2	811419	811451	b	b	-
+chr2	811422	811454	b	b	-
+chr2	811460	811492	a	a	+
+chr2	811428	811460	b	b	-
+chr2	811461	811493	a	a	+
+chr2	811433	811465	b	b	-
+chr2	811433	811465	b	b	-
+chr2	811433	811465	b	b	-
+chr2	811433	811465	b	b	-
+chr2	811433	811465	b	b	-
+chr2	811467	811499	a	a	+
+chr2	811628	811660	b	b	-
+chr2	811674	811706	a	a	+
+chr2	811690	811722	a	a	+
+chr2	811691	811723	a	a	+
+chr2	811660	811692	b	b	-
+chr2	811670	811702	b	b	-
+chr2	811670	811702	b	b	-
+chr2	811704	811736	a	a	+
+chr2	811704	811736	a	a	+
+chr2	811704	811736	a	a	+
+chr2	811704	811736	a	a	+
+chr2	811704	811736	a	a	+
+chr2	811672	811704	b	b	-
+chr2	811712	811744	a	a	+
+chr2	811713	811745	a	a	+
+chr2	811714	811746	a	a	+
+chr2	811715	811747	a	a	+
+chr2	811692	811724	b	b	-
+chr2	811706	811738	b	b	-
+chr2	811714	811746	b	b	-
+chr2	811758	811790	a	a	+
+chr2	811728	811760	b	b	-
+chr2	811812	811844	a	a	+
+chr2	811812	811844	a	a	+
+chr2	811784	811816	b	b	-
+chr2	811858	811890	a	a	+
+chr2	811827	811859	b	b	-
+chr2	811871	811903	a	a	+
+chr2	811862	811894	b	b	-
+chr2	811942	811974	a	a	+
+chr2	811992	812024	a	a	+
+chr2	811998	812030	a	a	+
+chr2	811995	812027	b	b	-
+chr2	812015	812047	b	b	-
+chr2	812030	812062	b	b	-
+chr2	812110	812142	a	a	+
+chr2	812110	812142	a	a	+
+chr2	812094	812126	b	b	-
+chr2	812128	812160	b	b	-
+chr2	812161	812193	a	a	+
+chr2	812205	812237	a	a	+
+chr2	812276	812308	b	b	-
+chr2	812312	812344	a	a	+
+chr2	812533	812565	a	a	+
+chr2	812503	812535	b	b	-
+chr2	812504	812536	b	b	-
+chr2	812542	812574	a	a	+
+chr2	812545	812577	a	a	+
+chr2	812545	812577	a	a	+
+chr2	812513	812545	b	b	-
+chr2	812513	812545	b	b	-
+chr2	812513	812545	b	b	-
+chr2	812546	812578	a	a	+
+chr2	812546	812578	a	a	+
+chr2	812519	812551	b	b	-
+chr2	812519	812551	b	b	-
+chr2	812522	812554	b	b	-
+chr2	812558	812590	a	a	+
+chr2	812528	812560	b	b	-
+chr2	812528	812560	b	b	-
+chr2	812529	812561	b	b	-
+chr2	812529	812561	b	b	-
+chr2	812562	812594	a	a	+
+chr2	812562	812594	a	a	+
+chr2	812546	812578	b	b	-
+chr2	812546	812578	b	b	-
+chr2	812581	812613	a	a	+
+chr2	812587	812619	a	a	+
+chr2	812649	812681	a	a	+
+chr2	812729	812761	a	a	+
+chr2	812708	812740	b	b	-
+chr2	812759	812791	a	a	+
+chr2	812766	812798	a	a	+
+chr2	812766	812798	a	a	+
+chr2	812738	812770	b	b	-
+chr2	812771	812803	a	a	+
+chr2	812771	812803	a	a	+
+chr2	812740	812772	b	b	-
+chr2	812774	812806	a	a	+
+chr2	812744	812776	b	b	-
+chr2	812784	812816	a	a	+
+chr2	812756	812788	b	b	-
+chr2	812795	812827	a	a	+
+chr2	812795	812827	a	a	+
+chr2	812767	812799	b	b	-
+chr2	812767	812799	b	b	-
+chr2	812770	812802	b	b	-
+chr2	812817	812849	a	a	+
+chr2	812818	812850	a	a	+
+chr2	812825	812857	a	a	+
+chr2	812801	812833	b	b	-
+chr2	812805	812837	b	b	-
+chr2	812838	812870	a	a	+
+chr2	812806	812838	b	b	-
+chr2	812807	812839	b	b	-
+chr2	812923	812955	a	a	+
+chr2	812923	812955	a	a	+
+chr2	812923	812955	a	a	+
+chr2	812939	812971	a	a	+
+chr2	812926	812958	b	b	-
+chr2	812926	812958	b	b	-
+chr3	212	244	a	a	+
+chr3	247	279	a	a	+
+chr3	329	361	a	a	+
+chr3	422	454	b	b	-
+chr3	535	567	a	a	+
+chr3	535	567	a	a	+
+chr3	544	576	a	a	+
+chr3	515	547	b	b	-
+chr3	516	548	b	b	-
+chr3	591	623	b	b	-
+chr3	604	636	b	b	-
+chr3	611	643	b	b	-
+chr3	644	676	a	a	+
+chr3	617	649	b	b	-
+chr3	650	682	a	a	+
+chr3	666	698	a	a	+
+chr3	639	671	b	b	-
+chr3	639	671	b	b	-
+chr3	640	672	b	b	-
+chr3	642	674	b	b	-
+chr3	675	707	a	a	+
+chr3	675	707	a	a	+
+chr3	675	707	a	a	+
+chr3	675	707	a	a	+
+chr3	675	707	a	a	+
+chr3	644	676	b	b	-
+chr3	644	676	b	b	-
+chr3	644	676	b	b	-
+chr3	644	676	b	b	-
+chr3	644	676	b	b	-
+chr3	645	677	b	b	-
+chr3	645	677	b	b	-
+chr3	645	677	b	b	-
+chr3	645	677	b	b	-
+chr3	652	684	b	b	-
+chr3	652	684	b	b	-
+chr3	686	718	a	a	+
+chr3	688	720	a	a	+
+chr3	688	720	a	a	+
+chr3	657	689	b	b	-
+chr3	658	690	b	b	-
+chr3	670	702	b	b	-
+chr3	670	702	b	b	-
+chr3	707	739	a	a	+
+chr3	675	707	b	b	-
+chr3	675	707	b	b	-
+chr3	686	718	b	b	-
+chr3	687	719	b	b	-
+chr3	732	764	a	a	+
+chr3	734	766	a	a	+
+chr3	735	767	a	a	+
+chr3	740	772	a	a	+
+chr3	744	776	a	a	+
+chr3	852	884	b	b	-
+chr3	858	890	b	b	-
+chr3	901	933	a	a	+
+chr3	901	933	a	a	+
+chr3	908	940	a	a	+
+chr3	909	941	a	a	+
+chr3	878	910	b	b	-
+chr3	911	943	a	a	+
+chr3	911	943	a	a	+
+chr3	917	949	a	a	+
+chr3	920	952	a	a	+
+chr3	920	952	a	a	+
+chr3	893	925	b	b	-
+chr3	893	925	b	b	-
+chr3	926	958	a	a	+
+chr3	926	958	a	a	+
+chr3	926	958	a	a	+
+chr3	894	926	b	b	-
+chr3	894	926	b	b	-
+chr3	897	929	b	b	-
+chr3	935	967	a	a	+
+chr3	936	968	a	a	+
+chr3	906	938	b	b	-
+chr3	1203	1235	b	b	-
+chr3	1237	1269	a	a	+
+chr3	1252	1284	a	a	+
+chr3	1284	1316	a	a	+
+chr3	1284	1316	a	a	+
+chr3	1468	1500	a	a	+
+chr3	1995	2027	b	b	-
+chr3	2502	2534	a	a	+
+chr3	2622	2654	b	b	-
+chr3	3264	3296	b	b	-
+chr3	3655	3687	a	a	+
+chr3	4097	4129	b	b	-
+chr3	4178	4210	a	a	+
+chr3	4178	4210	a	a	+
+chr3	4313	4345	a	a	+
+chr3	4427	4459	a	a	+
+chr3	4447	4479	a	a	+
+chr3	4456	4488	a	a	+
+chr3	4444	4476	b	b	-
+chr3	4785	4817	a	a	+
+chr3	4817	4849	b	b	-
+chr3	5210	5242	a	a	+
+chr3	5627	5659	b	b	-
+chr3	5941	5973	a	a	+
+chr3	6124	6156	b	b	-
+chr3	6184	6216	a	a	+
+chr3	6310	6342	b	b	-
+chr3	6331	6363	b	b	-
+chr3	6395	6427	a	a	+
+chr3	6533	6565	a	a	+
+chr3	6530	6562	b	b	-
+chr3	6530	6562	b	b	-
+chr3	6558	6590	b	b	-
+chr3	6558	6590	b	b	-
+chr3	6592	6624	a	a	+
+chr3	6570	6602	b	b	-
+chr3	6575	6607	b	b	-
+chr3	6619	6651	a	a	+
+chr3	6681	6713	b	b	-
+chr3	6733	6765	b	b	-
+chr3	6734	6766	b	b	-
+chr3	6734	6766	b	b	-
+chr3	6734	6766	b	b	-
+chr3	6734	6766	b	b	-
+chr3	6734	6766	b	b	-
+chr3	6745	6777	b	b	-
+chr3	6770	6802	b	b	-
+chr3	6865	6897	a	a	+
+chr3	6881	6913	a	a	+
+chr3	6939	6971	a	a	+
+chr3	6939	6971	a	a	+
+chr3	6939	6971	a	a	+
+chr3	6939	6971	a	a	+
+chr3	6911	6943	b	b	-
+chr3	7049	7081	b	b	-
+chr3	7066	7098	b	b	-
+chr3	7067	7099	b	b	-
+chr3	7114	7146	a	a	+
+chr3	7121	7153	a	a	+
+chr3	7123	7155	a	a	+
+chr3	7123	7155	a	a	+
+chr3	7094	7126	b	b	-
+chr3	7130	7162	a	a	+
+chr3	7105	7137	b	b	-
+chr3	7113	7145	b	b	-
+chr3	7257	7289	a	a	+
+chr3	7268	7300	a	a	+
+chr3	7237	7269	b	b	-
+chr3	7291	7323	b	b	-
+chr3	7295	7327	b	b	-
+chr3	7297	7329	b	b	-
+chr3	7346	7378	a	a	+
+chr3	7344	7376	b	b	-
+chr3	7345	7377	b	b	-
+chr3	7396	7428	b	b	-
+chr3	7422	7454	b	b	-
+chr3	7452	7484	b	b	-
+chr3	7452	7484	b	b	-
+chr3	7487	7519	a	a	+
+chr3	7498	7530	a	a	+
+chr3	7482	7514	b	b	-
+chr3	7564	7596	a	a	+
+chr3	7653	7685	b	b	-
+chr3	7706	7738	a	a	+
+chr3	7835	7867	a	a	+
+chr3	7813	7845	b	b	-
+chr3	7873	7905	b	b	-
+chr3	7905	7937	b	b	-
+chr3	7954	7986	a	a	+
+chr3	7950	7982	b	b	-
+chr3	7950	7982	b	b	-
+chr3	7999	8031	b	b	-
+chr3	8053	8085	a	a	+
+chr3	8053	8085	a	a	+
+chr3	8053	8085	a	a	+
+chr3	8053	8085	a	a	+
+chr3	8054	8086	a	a	+
+chr3	8065	8097	a	a	+
+chr3	8074	8106	a	a	+
+chr3	8099	8131	a	a	+
+chr3	8072	8104	b	b	-
+chr3	8077	8109	b	b	-
+chr3	8221	8253	a	a	+
+chr3	8215	8247	b	b	-
+chr3	8257	8289	a	a	+
+chr3	8226	8258	b	b	-
+chr3	8265	8297	a	a	+
+chr3	8266	8298	a	a	+
+chr3	8270	8302	a	a	+
+chr3	8270	8302	a	a	+
+chr3	8270	8302	a	a	+
+chr3	8243	8275	b	b	-
+chr3	8277	8309	a	a	+
+chr3	8260	8292	b	b	-
+chr3	8295	8327	a	a	+
+chr3	8609	8641	a	a	+
+chr3	8615	8647	b	b	-
+chr3	8625	8657	b	b	-
+chr3	8670	8702	a	a	+
+chr3	8643	8675	b	b	-
+chr3	8783	8815	a	a	+
+chr3	8813	8845	a	a	+
+chr3	8799	8831	b	b	-
+chr3	8862	8894	a	a	+
+chr3	8861	8893	b	b	-
+chr3	8891	8923	b	b	-
+chr3	8891	8923	b	b	-
+chr3	8894	8926	b	b	-
+chr3	8897	8929	b	b	-
+chr3	8936	8968	a	a	+
+chr3	8937	8969	a	a	+
+chr3	8911	8943	b	b	-
+chr3	8911	8943	b	b	-
+chr3	8912	8944	b	b	-
+chr3	8951	8983	a	a	+
+chr3	8928	8960	b	b	-
+chr3	8982	9014	a	a	+
+chr3	8964	8996	b	b	-
+chr3	9351	9383	b	b	-
+chr3	9574	9606	a	a	+
+chr3	9547	9579	b	b	-
+chr3	9552	9584	b	b	-
+chr3	9740	9772	a	a	+
+chr3	10153	10185	a	a	+
+chr3	10299	10331	a	a	+
+chr3	10367	10399	a	a	+
+chr3	10487	10519	b	b	-
+chr3	10637	10669	b	b	-
+chr3	10741	10773	a	a	+
+chr3	10744	10776	a	a	+
+chr3	10744	10776	a	a	+
+chr3	10723	10755	b	b	-
+chr3	10757	10789	a	a	+
+chr3	10814	10846	b	b	-
+chr3	10909	10941	a	a	+
+chr3	10923	10955	a	a	+
+chr3	10932	10964	a	a	+
+chr3	10915	10947	b	b	-
+chr3	10919	10951	b	b	-
+chr3	10960	10992	a	a	+
+chr3	10967	10999	a	a	+
+chr3	10967	10999	a	a	+
+chr3	10967	10999	a	a	+
+chr3	10979	11011	a	a	+
+chr3	10958	10990	b	b	-
+chr3	10960	10992	b	b	-
+chr3	10983	11015	b	b	-
+chr3	11599	11631	b	b	-
+chr3	11669	11701	b	b	-
+chr3	11725	11757	b	b	-
+chr3	11762	11794	b	b	-
+chr3	11815	11847	a	a	+
+chr3	11812	11844	b	b	-
+chr3	11931	11963	a	a	+
+chr3	11901	11933	b	b	-
+chr3	11936	11968	a	a	+
+chr3	11948	11980	b	b	-
+chr3	11996	12028	b	b	-
+chr3	12063	12095	b	b	-
+chr3	12109	12141	a	a	+
+chr3	12119	12151	a	a	+
+chr3	12090	12122	b	b	-
+chr3	12101	12133	b	b	-
+chr3	12104	12136	b	b	-
+chr3	12105	12137	b	b	-
+chr3	12160	12192	b	b	-
+chr3	12246	12278	a	a	+
+chr3	12218	12250	b	b	-
+chr3	12254	12286	a	a	+
+chr3	12222	12254	b	b	-
+chr3	12227	12259	b	b	-
+chr3	12260	12292	a	a	+
+chr3	12260	12292	a	a	+
+chr3	12263	12295	a	a	+
+chr3	12463	12495	b	b	-
+chr3	12537	12569	a	a	+
+chr3	12619	12651	b	b	-
+chr3	12799	12831	a	a	+
+chr3	12773	12805	b	b	-
+chr3	12809	12841	a	a	+
+chr3	12820	12852	a	a	+
+chr3	12797	12829	b	b	-
+chr3	12830	12862	a	a	+
+chr3	12798	12830	b	b	-
+chr3	12798	12830	b	b	-
+chr3	12806	12838	b	b	-
+chr3	12808	12840	b	b	-
+chr3	12817	12849	b	b	-
+chr3	12818	12850	b	b	-
+chr3	12824	12856	b	b	-
+chr3	13745	13777	b	b	-
+chr3	13781	13813	a	a	+
+chr3	13782	13814	a	a	+
+chr3	13758	13790	b	b	-
+chr3	13766	13798	b	b	-
+chr3	13767	13799	b	b	-
+chr3	13800	13832	a	a	+
+chr3	13803	13835	a	a	+
+chr3	13773	13805	b	b	-
+chr3	13811	13843	a	a	+
+chr3	13814	13846	a	a	+
+chr3	13788	13820	b	b	-
+chr3	13823	13855	a	a	+
+chr3	13824	13856	a	a	+
+chr3	13824	13856	a	a	+
+chr3	13824	13856	a	a	+
+chr3	13825	13857	a	a	+
+chr3	13825	13857	a	a	+
+chr3	13828	13860	a	a	+
+chr3	13834	13866	a	a	+
+chr3	13802	13834	b	b	-
+chr3	13802	13834	b	b	-
+chr3	13802	13834	b	b	-
+chr3	13810	13842	b	b	-
+chr3	13850	13882	a	a	+
+chr3	13850	13882	a	a	+
+chr3	13863	13895	a	a	+
+chr3	13872	13904	a	a	+
+chr3	13991	14023	a	a	+
+chr3	13991	14023	a	a	+
+chr3	14220	14252	a	a	+
+chr3	14847	14879	a	a	+
+chr3	16031	16063	a	a	+
+chr3	16145	16177	a	a	+
+chr3	16206	16238	b	b	-
+chr3	16386	16418	b	b	-
+chr3	16572	16604	a	a	+
+chr3	16569	16601	b	b	-
+chr3	16777	16809	a	a	+
+chr3	16885	16917	b	b	-
+chr3	16895	16927	b	b	-
+chr3	16947	16979	a	a	+
+chr3	16918	16950	b	b	-
+chr3	17282	17314	a	a	+
+chr3	17252	17284	b	b	-
+chr3	17252	17284	b	b	-
+chr3	17252	17284	b	b	-
+chr3	17252	17284	b	b	-
+chr3	17296	17328	a	a	+
+chr3	17266	17298	b	b	-
+chr3	17304	17336	a	a	+
+chr3	17304	17336	a	a	+
+chr3	17304	17336	a	a	+
+chr3	17305	17337	a	a	+
+chr3	17306	17338	a	a	+
+chr3	17276	17308	b	b	-
+chr3	17276	17308	b	b	-
+chr3	17276	17308	b	b	-
+chr3	17279	17311	b	b	-
+chr3	17279	17311	b	b	-
+chr3	17279	17311	b	b	-
+chr3	17313	17345	a	a	+
+chr3	17281	17313	b	b	-
+chr3	17281	17313	b	b	-
+chr3	17281	17313	b	b	-
+chr3	17281	17313	b	b	-
+chr3	17314	17346	a	a	+
+chr3	17315	17347	a	a	+
+chr3	17283	17315	b	b	-
+chr3	17283	17315	b	b	-
+chr3	17318	17350	a	a	+
+chr3	17286	17318	b	b	-
+chr3	17286	17318	b	b	-
+chr3	17289	17321	b	b	-
+chr3	17323	17355	a	a	+
+chr3	17324	17356	a	a	+
+chr3	17324	17356	a	a	+
+chr3	17324	17356	a	a	+
+chr3	17324	17356	a	a	+
+chr3	17326	17358	a	a	+
+chr3	17327	17359	a	a	+
+chr3	17327	17359	a	a	+
+chr3	17327	17359	a	a	+
+chr3	17328	17360	a	a	+
+chr3	17297	17329	b	b	-
+chr3	17330	17362	a	a	+
+chr3	17301	17333	b	b	-
+chr3	17339	17371	a	a	+
+chr3	17340	17372	a	a	+
+chr3	17340	17372	a	a	+
+chr3	17340	17372	a	a	+
+chr3	17344	17376	a	a	+
+chr3	17363	17395	a	a	+
+chr3	17447	17479	b	b	-
+chr3	17480	17512	a	a	+
+chr3	17500	17532	a	a	+
+chr3	17618	17650	b	b	-
+chr3	17672	17704	a	a	+
+chr3	17647	17679	b	b	-
+chr3	17807	17839	a	a	+
+chr3	18020	18052	a	a	+
+chr3	18114	18146	a	a	+
+chr3	18096	18128	b	b	-
+chr3	18970	19002	a	a	+
+chr3	19088	19120	a	a	+
+chr3	19162	19194	a	a	+
+chr3	19342	19374	a	a	+
+chr3	19455	19487	a	a	+
+chr3	19549	19581	b	b	-
+chr3	19607	19639	a	a	+
+chr3	19828	19860	b	b	-
+chr3	19828	19860	b	b	-
+chr3	20060	20092	a	a	+
+chr3	20196	20228	a	a	+
+chr3	20189	20221	b	b	-
+chr3	20193	20225	b	b	-
+chr3	20231	20263	a	a	+
+chr3	20373	20405	b	b	-
+chr3	20509	20541	a	a	+
+chr3	20676	20708	b	b	-
+chr3	20833	20865	a	a	+
+chr3	20835	20867	a	a	+
+chr3	20863	20895	b	b	-
+chr3	20920	20952	a	a	+
+chr3	21084	21116	a	a	+
+chr3	21316	21348	a	a	+
+chr3	21304	21336	b	b	-
+chr3	21436	21468	a	a	+
+chr3	21537	21569	b	b	-
+chr3	21538	21570	b	b	-
+chr3	21576	21608	a	a	+
+chr3	21611	21643	a	a	+
+chr3	21708	21740	b	b	-
+chr3	21719	21751	b	b	-
+chr3	21722	21754	b	b	-
+chr3	21757	21789	a	a	+
+chr3	21760	21792	a	a	+
+chr3	21756	21788	b	b	-
+chr3	21897	21929	b	b	-
+chr3	21934	21966	a	a	+
+chr3	21935	21967	a	a	+
+chr3	21939	21971	a	a	+
+chr3	21911	21943	b	b	-
+chr3	21946	21978	a	a	+
+chr3	21948	21980	a	a	+
+chr3	21916	21948	b	b	-
+chr3	21950	21982	a	a	+
+chr3	21921	21953	b	b	-
+chr3	22044	22076	b	b	-
+chr3	22078	22110	a	a	+
+chr3	22048	22080	b	b	-
+chr3	22048	22080	b	b	-
+chr3	22049	22081	b	b	-
+chr3	22083	22115	a	a	+
+chr3	22086	22118	a	a	+
+chr3	22061	22093	b	b	-
+chr3	22061	22093	b	b	-
+chr3	22063	22095	b	b	-
+chr3	22096	22128	a	a	+
+chr3	22100	22132	a	a	+
+chr3	22100	22132	a	a	+
+chr3	22100	22132	a	a	+
+chr3	22100	22132	a	a	+
+chr3	22100	22132	a	a	+
+chr3	22101	22133	a	a	+
+chr3	22101	22133	a	a	+
+chr3	22101	22133	a	a	+
+chr3	22101	22133	a	a	+
+chr3	22101	22133	a	a	+
+chr3	22101	22133	a	a	+
+chr3	22101	22133	a	a	+
+chr3	22102	22134	a	a	+
+chr3	22070	22102	b	b	-
+chr3	22071	22103	b	b	-
+chr3	22074	22106	b	b	-
+chr3	22075	22107	b	b	-
+chr3	22075	22107	b	b	-
+chr3	22079	22111	b	b	-
+chr3	22079	22111	b	b	-
+chr3	22082	22114	b	b	-
+chr3	22084	22116	b	b	-
+chr3	22118	22150	a	a	+
+chr3	22122	22154	a	a	+
+chr3	22132	22164	a	a	+
+chr3	22100	22132	b	b	-
+chr3	22141	22173	a	a	+
+chr3	22149	22181	a	a	+
+chr3	22200	22232	a	a	+
+chr3	22280	22312	b	b	-
+chr3	22336	22368	b	b	-
+chr3	22546	22578	a	a	+
+chr3	22621	22653	b	b	-
+chr3	22621	22653	b	b	-
+chr3	22823	22855	b	b	-
+chr3	22830	22862	b	b	-
+chr3	22831	22863	b	b	-
+chr3	23148	23180	a	a	+
+chr3	23121	23153	b	b	-
+chr3	23132	23164	b	b	-
+chr3	23265	23297	b	b	-
+chr3	23265	23297	b	b	-
+chr3	23290	23322	b	b	-
+chr3	23292	23324	b	b	-
+chr3	23330	23362	a	a	+
+chr3	23331	23363	a	a	+
+chr3	23333	23365	a	a	+
+chr3	23333	23365	a	a	+
+chr3	23335	23367	a	a	+
+chr3	23335	23367	a	a	+
+chr3	23335	23367	a	a	+
+chr3	23335	23367	a	a	+
+chr3	23345	23377	a	a	+
+chr3	23345	23377	a	a	+
+chr3	23316	23348	b	b	-
+chr3	23317	23349	b	b	-
+chr3	23317	23349	b	b	-
+chr3	23351	23383	a	a	+
+chr3	23351	23383	a	a	+
+chr3	23319	23351	b	b	-
+chr3	23354	23386	a	a	+
+chr3	23322	23354	b	b	-
+chr3	23322	23354	b	b	-
+chr3	23322	23354	b	b	-
+chr3	23323	23355	b	b	-
+chr3	23324	23356	b	b	-
+chr3	23324	23356	b	b	-
+chr3	23324	23356	b	b	-
+chr3	23328	23360	b	b	-
+chr3	23338	23370	b	b	-
+chr3	23340	23372	b	b	-
+chr3	23373	23405	a	a	+
+chr3	23341	23373	b	b	-
+chr3	23358	23390	b	b	-
+chr3	23591	23623	a	a	+
+chr3	23595	23627	a	a	+
+chr3	23570	23602	b	b	-
+chr3	23571	23603	b	b	-
+chr3	23571	23603	b	b	-
+chr3	23606	23638	a	a	+
+chr3	23574	23606	b	b	-
+chr3	23583	23615	b	b	-
+chr3	23583	23615	b	b	-
+chr3	23619	23651	a	a	+
+chr3	23587	23619	b	b	-
+chr3	23587	23619	b	b	-
+chr3	23621	23653	a	a	+
+chr3	23591	23623	b	b	-
+chr3	23591	23623	b	b	-
+chr3	23594	23626	b	b	-
+chr3	23628	23660	a	a	+
+chr3	23597	23629	b	b	-
+chr3	23618	23650	b	b	-
+chr3	23792	23824	a	a	+
+chr3	23763	23795	b	b	-
+chr3	23959	23991	b	b	-
+chr3	24113	24145	a	a	+
+chr3	24081	24113	b	b	-
+chr3	24122	24154	a	a	+
+chr3	24099	24131	b	b	-
+chr3	24100	24132	b	b	-
+chr3	24143	24175	a	a	+
+chr3	24145	24177	a	a	+
+chr3	24113	24145	b	b	-
+chr3	24164	24196	b	b	-
+chr3	24255	24287	a	a	+
+chr3	24237	24269	b	b	-
+chr3	24294	24326	a	a	+
+chr3	24294	24326	a	a	+
+chr3	24294	24326	a	a	+
+chr3	24294	24326	a	a	+
+chr3	24262	24294	b	b	-
+chr3	24262	24294	b	b	-
+chr3	24295	24327	a	a	+
+chr3	24263	24295	b	b	-
+chr3	24296	24328	a	a	+
+chr3	24267	24299	b	b	-
+chr3	24302	24334	a	a	+
+chr3	24303	24335	a	a	+
+chr3	24303	24335	a	a	+
+chr3	24303	24335	a	a	+
+chr3	24303	24335	a	a	+
+chr3	24303	24335	a	a	+
+chr3	24303	24335	a	a	+
+chr3	24303	24335	a	a	+
+chr3	24305	24337	a	a	+
+chr3	24305	24337	a	a	+
+chr3	24305	24337	a	a	+
+chr3	24307	24339	a	a	+
+chr3	24276	24308	b	b	-
+chr3	24276	24308	b	b	-
+chr3	24310	24342	a	a	+
+chr3	24314	24346	a	a	+
+chr3	24285	24317	b	b	-
+chr3	24288	24320	b	b	-
+chr3	24290	24322	b	b	-
+chr3	24291	24323	b	b	-
+chr3	24347	24379	b	b	-
+chr3	24486	24518	a	a	+
+chr3	24504	24536	a	a	+
+chr3	24509	24541	a	a	+
+chr3	24504	24536	b	b	-
+chr3	24569	24601	a	a	+
+chr3	24551	24583	b	b	-
+chr3	24551	24583	b	b	-
+chr3	24560	24592	b	b	-
+chr3	24560	24592	b	b	-
+chr3	24602	24634	a	a	+
+chr3	24776	24808	a	a	+
+chr3	24750	24782	b	b	-
+chr3	24752	24784	b	b	-
+chr3	24791	24823	a	a	+
+chr3	24792	24824	a	a	+
+chr3	24792	24824	a	a	+
+chr3	24792	24824	a	a	+
+chr3	24795	24827	a	a	+
+chr3	24796	24828	a	a	+
+chr3	24796	24828	a	a	+
+chr3	24764	24796	b	b	-
+chr3	24764	24796	b	b	-
+chr3	24764	24796	b	b	-
+chr3	24764	24796	b	b	-
+chr3	24764	24796	b	b	-
+chr3	24764	24796	b	b	-
+chr3	24764	24796	b	b	-
+chr3	24764	24796	b	b	-
+chr3	24764	24796	b	b	-
+chr3	24764	24796	b	b	-
+chr3	24764	24796	b	b	-
+chr3	24764	24796	b	b	-
+chr3	24766	24798	b	b	-
+chr3	24801	24833	a	a	+
+chr3	24804	24836	a	a	+
+chr3	24805	24837	a	a	+
+chr3	24775	24807	b	b	-
+chr3	24811	24843	a	a	+
+chr3	24811	24843	a	a	+
+chr3	24784	24816	b	b	-
+chr3	24785	24817	b	b	-
+chr3	24785	24817	b	b	-
+chr3	24785	24817	b	b	-
+chr3	24785	24817	b	b	-
+chr3	24785	24817	b	b	-
+chr3	24786	24818	b	b	-
+chr3	24786	24818	b	b	-
+chr3	24786	24818	b	b	-
+chr3	24786	24818	b	b	-
+chr3	24786	24818	b	b	-
+chr3	24786	24818	b	b	-
+chr3	24786	24818	b	b	-
+chr3	24786	24818	b	b	-
+chr3	24786	24818	b	b	-
+chr3	24786	24818	b	b	-
+chr3	24823	24855	a	a	+
+chr3	24824	24856	a	a	+
+chr3	24824	24856	a	a	+
+chr3	24824	24856	a	a	+
+chr3	24824	24856	a	a	+
+chr3	24824	24856	a	a	+
+chr3	24824	24856	a	a	+
+chr3	24824	24856	a	a	+
+chr3	24833	24865	a	a	+
+chr3	24836	24868	a	a	+
+chr3	24836	24868	a	a	+
+chr3	24809	24841	b	b	-
+chr3	24851	24883	a	a	+
+chr3	24938	24970	a	a	+
+chr3	24967	24999	a	a	+
+chr3	24967	24999	a	a	+
+chr3	24941	24973	b	b	-
+chr3	24948	24980	b	b	-
+chr3	24991	25023	a	a	+
+chr3	25009	25041	a	a	+
+chr3	25055	25087	b	b	-
+chr3	25101	25133	b	b	-
+chr3	25139	25171	a	a	+
+chr3	25140	25172	a	a	+
+chr3	25140	25172	a	a	+
+chr3	25140	25172	a	a	+
+chr3	25146	25178	a	a	+
+chr3	25118	25150	b	b	-
+chr3	25168	25200	a	a	+
+chr3	25598	25630	a	a	+
+chr3	25765	25797	b	b	-
+chr3	26120	26152	a	a	+
+chr3	26092	26124	b	b	-
+chr3	26313	26345	b	b	-
+chr3	26672	26704	a	a	+
+chr3	26712	26744	a	a	+
+chr3	26712	26744	a	a	+
+chr3	26841	26873	a	a	+
+chr3	27119	27151	b	b	-
+chr3	27156	27188	a	a	+
+chr3	27124	27156	b	b	-
+chr3	27157	27189	a	a	+
+chr3	27305	27337	a	a	+
+chr3	27276	27308	b	b	-
+chr3	27276	27308	b	b	-
+chr3	27309	27341	a	a	+
+chr3	27277	27309	b	b	-
+chr3	27283	27315	b	b	-
+chr3	27326	27358	a	a	+
+chr3	27326	27358	a	a	+
+chr3	27326	27358	a	a	+
+chr3	27298	27330	b	b	-
+chr3	27332	27364	a	a	+
+chr3	27336	27368	a	a	+
+chr3	27337	27369	a	a	+
+chr3	27472	27504	b	b	-
+chr3	27478	27510	b	b	-
+chr3	27512	27544	a	a	+
+chr3	27512	27544	a	a	+
+chr3	27512	27544	a	a	+
+chr3	27481	27513	b	b	-
+chr3	27550	27582	a	a	+
+chr3	27550	27582	a	a	+
+chr3	27553	27585	a	a	+
+chr3	27554	27586	a	a	+
+chr3	27522	27554	b	b	-
+chr3	27770	27802	a	a	+
+chr3	27904	27936	b	b	-
+chr3	27945	27977	a	a	+
+chr3	27913	27945	b	b	-
+chr3	27950	27982	a	a	+
+chr3	27953	27985	a	a	+
+chr3	27954	27986	a	a	+
+chr3	27922	27954	b	b	-
+chr3	27957	27989	a	a	+
+chr3	27927	27959	b	b	-
+chr3	27930	27962	b	b	-
+chr3	27931	27963	b	b	-
+chr3	27972	28004	a	a	+
+chr3	27973	28005	a	a	+
+chr3	27946	27978	b	b	-
+chr3	27946	27978	b	b	-
+chr3	28108	28140	b	b	-
+chr3	28157	28189	b	b	-
+chr3	28274	28306	a	a	+
+chr3	28274	28306	a	a	+
+chr3	28289	28321	a	a	+
+chr3	28577	28609	a	a	+
+chr3	28690	28722	b	b	-
+chr3	28708	28740	b	b	-
+chr3	28775	28807	a	a	+
+chr3	28844	28876	a	a	+
+chr3	28995	29027	b	b	-
+chr3	29050	29082	a	a	+
+chr3	29616	29648	a	a	+
+chr3	29616	29648	a	a	+
+chr3	29616	29648	a	a	+
+chr3	30065	30097	a	a	+
+chr3	30188	30220	a	a	+
+chr3	30222	30254	a	a	+
+chr3	30205	30237	b	b	-
+chr3	30205	30237	b	b	-
+chr3	30216	30248	b	b	-
+chr3	30410	30442	b	b	-
+chr3	30665	30697	b	b	-
+chr3	30730	30762	b	b	-
+chr3	30753	30785	b	b	-
+chr3	30896	30928	b	b	-
+chr3	30942	30974	a	a	+
+chr3	30920	30952	b	b	-
+chr3	31042	31074	b	b	-
+chr3	31085	31117	a	a	+
+chr3	31085	31117	a	a	+
+chr3	31070	31102	b	b	-
+chr3	31073	31105	b	b	-
+chr3	31131	31163	a	a	+
+chr3	31133	31165	a	a	+
+chr3	31133	31165	a	a	+
+chr3	31139	31171	a	a	+
+chr3	31111	31143	b	b	-
+chr3	31111	31143	b	b	-
+chr3	31111	31143	b	b	-
+chr3	31152	31184	a	a	+
+chr3	31153	31185	a	a	+
+chr3	31123	31155	b	b	-
+chr3	31434	31466	a	a	+
+chr3	31445	31477	a	a	+
+chr3	31445	31477	a	a	+
+chr3	31452	31484	a	a	+
+chr3	31453	31485	a	a	+
+chr3	31453	31485	a	a	+
+chr3	31457	31489	a	a	+
+chr3	31457	31489	a	a	+
+chr3	31461	31493	a	a	+
+chr3	31430	31462	b	b	-
+chr3	31430	31462	b	b	-
+chr3	31463	31495	a	a	+
+chr3	31466	31498	a	a	+
+chr3	31434	31466	b	b	-
+chr3	31434	31466	b	b	-
+chr3	31434	31466	b	b	-
+chr3	31434	31466	b	b	-
+chr3	31434	31466	b	b	-
+chr3	31461	31493	b	b	-
+chr3	31494	31526	a	a	+
+chr3	31470	31502	b	b	-
+chr3	31573	31605	a	a	+
+chr3	31560	31592	b	b	-
+chr3	31574	31606	b	b	-
+chr3	31576	31608	b	b	-
+chr3	31586	31618	b	b	-
+chr3	31586	31618	b	b	-
+chr3	31622	31654	a	a	+
+chr3	31622	31654	a	a	+
+chr3	31632	31664	a	a	+
+chr3	31602	31634	b	b	-
+chr3	31607	31639	b	b	-
+chr3	31653	31685	a	a	+
+chr3	31653	31685	a	a	+
+chr3	31768	31800	a	a	+
+chr3	31747	31779	b	b	-
+chr3	31747	31779	b	b	-
+chr3	31754	31786	b	b	-
+chr3	31815	31847	a	a	+
+chr3	31787	31819	b	b	-
+chr3	31839	31871	b	b	-
+chr3	31933	31965	b	b	-
+chr3	32103	32135	b	b	-
+chr3	32103	32135	b	b	-
+chr3	32226	32258	a	a	+
+chr3	32860	32892	a	a	+
+chr3	32944	32976	a	a	+
+chr3	32915	32947	b	b	-
+chr3	33438	33470	b	b	-
+chr3	33452	33484	b	b	-
+chr3	33749	33781	a	a	+
+chr3	34231	34263	a	a	+
+chr3	34265	34297	b	b	-
+chr3	34265	34297	b	b	-
+chr3	34317	34349	b	b	-
+chr3	34830	34862	b	b	-
+chr3	34863	34895	a	a	+
+chr3	34874	34906	a	a	+
+chr3	34852	34884	b	b	-
+chr3	34852	34884	b	b	-
+chr3	34894	34926	a	a	+
+chr3	35023	35055	a	a	+
+chr3	35028	35060	a	a	+
+chr3	35039	35071	a	a	+
+chr3	35153	35185	b	b	-
+chr3	35189	35221	a	a	+
+chr3	35157	35189	b	b	-
+chr3	35175	35207	b	b	-
+chr3	35193	35225	b	b	-
+chr3	35249	35281	a	a	+
+chr3	35249	35281	a	a	+
+chr3	35326	35358	a	a	+
+chr3	35348	35380	a	a	+
+chr3	35317	35349	b	b	-
+chr3	35317	35349	b	b	-
+chr3	35317	35349	b	b	-
+chr3	35318	35350	b	b	-
+chr3	35355	35387	a	a	+
+chr3	35357	35389	a	a	+
+chr3	35357	35389	a	a	+
+chr3	35357	35389	a	a	+
+chr3	35358	35390	a	a	+
+chr3	35328	35360	b	b	-
+chr3	35330	35362	b	b	-
+chr3	35332	35364	b	b	-
+chr3	35365	35397	a	a	+
+chr3	35365	35397	a	a	+
+chr3	35365	35397	a	a	+
+chr3	35365	35397	a	a	+
+chr3	35333	35365	b	b	-
+chr3	35334	35366	b	b	-
+chr3	35335	35367	b	b	-
+chr3	35368	35400	a	a	+
+chr3	35368	35400	a	a	+
+chr3	35368	35400	a	a	+
+chr3	35336	35368	b	b	-
+chr3	35337	35369	b	b	-
+chr3	35338	35370	b	b	-
+chr3	35338	35370	b	b	-
+chr3	35339	35371	b	b	-
+chr3	35339	35371	b	b	-
+chr3	35340	35372	b	b	-
+chr3	35378	35410	a	a	+
+chr3	35346	35378	b	b	-
+chr3	35380	35412	a	a	+
+chr3	35352	35384	b	b	-
+chr3	35385	35417	a	a	+
+chr3	35385	35417	a	a	+
+chr3	35386	35418	a	a	+
+chr3	35386	35418	a	a	+
+chr3	35386	35418	a	a	+
+chr3	35387	35419	a	a	+
+chr3	35387	35419	a	a	+
+chr3	35356	35388	b	b	-
+chr3	35356	35388	b	b	-
+chr3	35356	35388	b	b	-
+chr3	35356	35388	b	b	-
+chr3	35356	35388	b	b	-
+chr3	35356	35388	b	b	-
+chr3	35357	35389	b	b	-
+chr3	35358	35390	b	b	-
+chr3	35358	35390	b	b	-
+chr3	35358	35390	b	b	-
+chr3	35358	35390	b	b	-
+chr3	35358	35390	b	b	-
+chr3	35399	35431	a	a	+
+chr3	35367	35399	b	b	-
+chr3	35411	35443	a	a	+
+chr3	35567	35599	b	b	-
+chr3	35601	35633	a	a	+
+chr3	35603	35635	a	a	+
+chr3	35616	35648	a	a	+
+chr3	35616	35648	a	a	+
+chr3	35616	35648	a	a	+
+chr3	35616	35648	a	a	+
+chr3	35622	35654	a	a	+
+chr3	35622	35654	a	a	+
+chr3	35622	35654	a	a	+
+chr3	35622	35654	a	a	+
+chr3	35622	35654	a	a	+
+chr3	35623	35655	a	a	+
+chr3	35623	35655	a	a	+
+chr3	35623	35655	a	a	+
+chr3	35623	35655	a	a	+
+chr3	35623	35655	a	a	+
+chr3	35592	35624	b	b	-
+chr3	35593	35625	b	b	-
+chr3	35593	35625	b	b	-
+chr3	35593	35625	b	b	-
+chr3	35593	35625	b	b	-
+chr3	35597	35629	b	b	-
+chr3	35598	35630	b	b	-
+chr3	35603	35635	b	b	-
+chr3	35639	35671	a	a	+
+chr3	35608	35640	b	b	-
+chr3	35608	35640	b	b	-
+chr3	35608	35640	b	b	-
+chr3	35609	35641	b	b	-
+chr3	35643	35675	a	a	+
+chr3	35615	35647	b	b	-
+chr3	35672	35704	a	a	+
+chr3	35747	35779	b	b	-
+chr3	35749	35781	b	b	-
+chr3	35867	35899	b	b	-
+chr3	35917	35949	a	a	+
+chr3	35903	35935	b	b	-
+chr3	35908	35940	b	b	-
+chr3	35933	35965	b	b	-
+chr3	36264	36296	a	a	+
+chr3	36301	36333	a	a	+
+chr3	36419	36451	b	b	-
+chr3	36753	36785	a	a	+
+chr3	36963	36995	b	b	-
+chr3	37591	37623	a	a	+
+chr3	37909	37941	a	a	+
+chr3	37994	38026	a	a	+
+chr3	38173	38205	b	b	-
+chr3	38206	38238	b	b	-
+chr3	38395	38427	a	a	+
+chr3	38421	38453	b	b	-
+chr3	38490	38522	a	a	+
+chr3	38603	38635	b	b	-
+chr3	38648	38680	a	a	+
+chr3	38618	38650	b	b	-
+chr3	38654	38686	a	a	+
+chr3	38657	38689	a	a	+
+chr3	38794	38826	b	b	-
+chr3	38794	38826	b	b	-
+chr3	39040	39072	a	a	+
+chr3	39063	39095	a	a	+
+chr3	39036	39068	b	b	-
+chr3	39040	39072	b	b	-
+chr3	39048	39080	b	b	-
+chr3	39082	39114	a	a	+
+chr3	39094	39126	a	a	+
+chr3	39063	39095	b	b	-
+chr3	39069	39101	b	b	-
+chr3	39069	39101	b	b	-
+chr3	39070	39102	b	b	-
+chr3	39070	39102	b	b	-
+chr3	39103	39135	a	a	+
+chr3	39071	39103	b	b	-
+chr3	39076	39108	b	b	-
+chr3	39111	39143	a	a	+
+chr3	39084	39116	b	b	-
+chr3	39084	39116	b	b	-
+chr3	39117	39149	a	a	+
+chr3	39121	39153	a	a	+
+chr3	39091	39123	b	b	-
+chr3	39130	39162	a	a	+
+chr3	39132	39164	a	a	+
+chr3	39132	39164	a	a	+
+chr3	39214	39246	b	b	-
+chr3	39251	39283	a	a	+
+chr3	39260	39292	a	a	+
+chr3	39230	39262	b	b	-
+chr3	39232	39264	b	b	-
+chr3	39273	39305	a	a	+
+chr3	39274	39306	a	a	+
+chr3	39317	39349	a	a	+
+chr3	39346	39378	b	b	-
+chr3	39347	39379	b	b	-
+chr3	39347	39379	b	b	-
+chr3	39384	39416	a	a	+
+chr3	39384	39416	a	a	+
+chr3	39384	39416	a	a	+
+chr3	39362	39394	b	b	-
+chr3	39398	39430	a	a	+
+chr3	39398	39430	a	a	+
+chr3	39366	39398	b	b	-
+chr3	39366	39398	b	b	-
+chr3	39366	39398	b	b	-
+chr3	39367	39399	b	b	-
+chr3	39367	39399	b	b	-
+chr3	39403	39435	a	a	+
+chr3	39403	39435	a	a	+
+chr3	39403	39435	a	a	+
+chr3	39403	39435	a	a	+
+chr3	39383	39415	b	b	-
+chr3	39418	39450	a	a	+
+chr3	39418	39450	a	a	+
+chr3	39419	39451	a	a	+
+chr3	39427	39459	a	a	+
+chr3	39397	39429	b	b	-
+chr3	39397	39429	b	b	-
+chr3	39397	39429	b	b	-
+chr3	39434	39466	a	a	+
+chr3	39403	39435	b	b	-
+chr3	39408	39440	b	b	-
+chr3	39408	39440	b	b	-
+chr3	39683	39715	a	a	+
+chr3	39702	39734	a	a	+
+chr3	39706	39738	a	a	+
+chr3	39867	39899	a	a	+
+chr3	39867	39899	a	a	+
+chr3	39845	39877	b	b	-
+chr3	39879	39911	a	a	+
+chr3	39888	39920	a	a	+
+chr3	39856	39888	b	b	-
+chr3	39994	40026	a	a	+
+chr3	40000	40032	a	a	+
+chr3	40025	40057	a	a	+
+chr3	40052	40084	a	a	+
+chr3	40034	40066	b	b	-
+chr3	40072	40104	a	a	+
+chr3	40196	40228	b	b	-
+chr3	40247	40279	a	a	+
+chr3	40300	40332	b	b	-
+chr3	40321	40353	b	b	-
+chr3	40361	40393	a	a	+
+chr3	40380	40412	a	a	+
+chr3	40401	40433	a	a	+
+chr3	40403	40435	a	a	+
+chr3	40376	40408	b	b	-
+chr3	40387	40419	b	b	-
+chr3	40497	40529	b	b	-
+chr3	40500	40532	b	b	-
+chr3	40554	40586	a	a	+
+chr3	40528	40560	b	b	-
+chr3	40648	40680	a	a	+
+chr3	40667	40699	b	b	-
+chr3	40667	40699	b	b	-
+chr3	40668	40700	b	b	-
+chr3	40712	40744	a	a	+
+chr3	40712	40744	a	a	+
+chr3	40712	40744	a	a	+
+chr3	40681	40713	b	b	-
+chr3	40682	40714	b	b	-
+chr3	40715	40747	a	a	+
+chr3	40717	40749	a	a	+
+chr3	40717	40749	a	a	+
+chr3	40724	40756	a	a	+
+chr3	40724	40756	a	a	+
+chr3	40724	40756	a	a	+
+chr3	40730	40762	a	a	+
+chr3	40730	40762	a	a	+
+chr3	40700	40732	b	b	-
+chr3	40703	40735	b	b	-
+chr3	40704	40736	b	b	-
+chr3	40704	40736	b	b	-
+chr3	40738	40770	a	a	+
+chr3	40709	40741	b	b	-
+chr3	40709	40741	b	b	-
+chr3	40710	40742	b	b	-
+chr3	40711	40743	b	b	-
+chr3	40864	40896	b	b	-
+chr3	40868	40900	b	b	-
+chr3	40884	40916	b	b	-
+chr3	40918	40950	a	a	+
+chr3	40886	40918	b	b	-
+chr3	40890	40922	b	b	-
+chr3	40894	40926	b	b	-
+chr3	40933	40965	a	a	+
+chr3	40934	40966	a	a	+
+chr3	40910	40942	b	b	-
+chr3	40910	40942	b	b	-
+chr3	40943	40975	a	a	+
+chr3	40911	40943	b	b	-
+chr3	40911	40943	b	b	-
+chr3	40911	40943	b	b	-
+chr3	40944	40976	a	a	+
+chr3	40912	40944	b	b	-
+chr3	40912	40944	b	b	-
+chr3	40945	40977	a	a	+
+chr3	40945	40977	a	a	+
+chr3	40951	40983	a	a	+
+chr3	40951	40983	a	a	+
+chr3	40954	40986	a	a	+
+chr3	40956	40988	a	a	+
+chr3	40956	40988	a	a	+
+chr3	40956	40988	a	a	+
+chr3	40956	40988	a	a	+
+chr3	40956	40988	a	a	+
+chr3	40925	40957	b	b	-
+chr3	40925	40957	b	b	-
+chr3	40925	40957	b	b	-
+chr3	40925	40957	b	b	-
+chr3	40926	40958	b	b	-
+chr3	40960	40992	a	a	+
+chr3	40964	40996	a	a	+
+chr3	40965	40997	a	a	+
+chr3	40965	40997	a	a	+
+chr3	40965	40997	a	a	+
+chr3	40939	40971	b	b	-
+chr3	40939	40971	b	b	-
+chr3	40944	40976	b	b	-
+chr3	40978	41010	a	a	+
+chr3	40982	41014	a	a	+
+chr3	40982	41014	a	a	+
+chr3	40982	41014	a	a	+
+chr3	40983	41015	a	a	+
+chr3	40952	40984	b	b	-
+chr3	40952	40984	b	b	-
+chr3	40952	40984	b	b	-
+chr3	40989	41021	a	a	+
+chr3	40990	41022	a	a	+
+chr3	40998	41030	a	a	+
+chr3	40998	41030	a	a	+
+chr3	41002	41034	a	a	+
+chr3	41002	41034	a	a	+
+chr3	41002	41034	a	a	+
+chr3	41002	41034	a	a	+
+chr3	40972	41004	b	b	-
+chr3	40973	41005	b	b	-
+chr3	41009	41041	a	a	+
+chr3	40995	41027	b	b	-
+chr3	40996	41028	b	b	-
+chr3	41031	41063	a	a	+
+chr3	41006	41038	b	b	-
+chr3	41048	41080	a	a	+
+chr3	41049	41081	a	a	+
+chr3	41038	41070	b	b	-
+chr3	41123	41155	a	a	+
+chr3	41133	41165	a	a	+
+chr3	41137	41169	a	a	+
+chr3	41127	41159	b	b	-
+chr3	41169	41201	a	a	+
+chr3	41139	41171	b	b	-
+chr3	41179	41211	a	a	+
+chr3	41156	41188	b	b	-
+chr3	41321	41353	b	b	-
+chr3	41485	41517	b	b	-
+chr3	41490	41522	b	b	-
+chr3	41526	41558	a	a	+
+chr3	41500	41532	b	b	-
+chr3	41547	41579	a	a	+
+chr3	41665	41697	a	a	+
+chr3	41665	41697	a	a	+
+chr3	41639	41671	b	b	-
+chr3	41641	41673	b	b	-
+chr3	41683	41715	a	a	+
+chr3	41686	41718	a	a	+
+chr3	41659	41691	b	b	-
+chr3	41659	41691	b	b	-
+chr3	41659	41691	b	b	-
+chr3	41659	41691	b	b	-
+chr3	41699	41731	a	a	+
+chr3	41678	41710	b	b	-
+chr3	41678	41710	b	b	-
+chr3	42109	42141	a	a	+
+chr3	42089	42121	b	b	-
+chr3	42097	42129	b	b	-
+chr3	42131	42163	a	a	+
+chr3	42347	42379	a	a	+
+chr3	42362	42394	a	a	+
+chr3	42368	42400	a	a	+
+chr3	42460	42492	a	a	+
+chr3	42594	42626	b	b	-
+chr3	42594	42626	b	b	-
+chr3	42620	42652	b	b	-
+chr3	42699	42731	b	b	-
+chr3	42816	42848	a	a	+
+chr3	42867	42899	a	a	+
+chr3	42845	42877	b	b	-
+chr3	42904	42936	a	a	+
+chr3	43094	43126	b	b	-
+chr3	43142	43174	a	a	+
+chr3	43117	43149	b	b	-
+chr3	43122	43154	b	b	-
+chr3	43164	43196	a	a	+
+chr3	43132	43164	b	b	-
+chr3	43137	43169	b	b	-
+chr3	43137	43169	b	b	-
+chr3	43185	43217	a	a	+
+chr3	43208	43240	a	a	+
+chr3	43208	43240	a	a	+
+chr3	43217	43249	a	a	+
+chr3	43221	43253	a	a	+
+chr3	43226	43258	b	b	-
+chr3	43312	43344	a	a	+
+chr3	43312	43344	a	a	+
+chr3	43312	43344	a	a	+
+chr3	43320	43352	a	a	+
+chr3	43348	43380	a	a	+
+chr3	43321	43353	b	b	-
+chr3	43354	43386	a	a	+
+chr3	43350	43382	b	b	-
+chr3	43350	43382	b	b	-
+chr3	43395	43427	a	a	+
+chr3	43391	43423	b	b	-
+chr3	43436	43468	b	b	-
+chr3	43514	43546	a	a	+
+chr3	43514	43546	a	a	+
+chr3	43487	43519	b	b	-
+chr3	43689	43721	b	b	-
+chr3	43820	43852	b	b	-
+chr3	43851	43883	b	b	-
+chr3	43855	43887	b	b	-
+chr3	43888	43920	a	a	+
+chr3	43934	43966	b	b	-
+chr3	43978	44010	a	a	+
+chr3	43953	43985	b	b	-
+chr3	44008	44040	a	a	+
+chr3	43992	44024	b	b	-
+chr3	44122	44154	b	b	-
+chr3	44156	44188	a	a	+
+chr3	44160	44192	a	a	+
+chr3	44132	44164	b	b	-
+chr3	44132	44164	b	b	-
+chr3	44203	44235	a	a	+
+chr3	44203	44235	a	a	+
+chr3	44209	44241	a	a	+
+chr3	44210	44242	a	a	+
+chr3	44219	44251	a	a	+
+chr3	44227	44259	a	a	+
+chr3	44227	44259	a	a	+
+chr3	44211	44243	b	b	-
+chr3	44254	44286	a	a	+
+chr3	44347	44379	a	a	+
+chr3	44323	44355	b	b	-
+chr3	44361	44393	a	a	+
+chr3	44374	44406	a	a	+
+chr3	44383	44415	a	a	+
+chr3	44351	44383	b	b	-
+chr3	44394	44426	a	a	+
+chr3	44406	44438	a	a	+
+chr3	44406	44438	a	a	+
+chr3	44406	44438	a	a	+
+chr3	44406	44438	a	a	+
+chr3	44406	44438	a	a	+
+chr3	44406	44438	a	a	+
+chr3	44406	44438	a	a	+
+chr3	44406	44438	a	a	+
+chr3	44406	44438	a	a	+
+chr3	44406	44438	a	a	+
+chr3	44406	44438	a	a	+
+chr3	44406	44438	a	a	+
+chr3	44409	44441	a	a	+
+chr3	44411	44443	a	a	+
+chr3	44379	44411	b	b	-
+chr3	44416	44448	a	a	+
+chr3	44416	44448	a	a	+
+chr3	44416	44448	a	a	+
+chr3	44384	44416	b	b	-
+chr3	44384	44416	b	b	-
+chr3	44385	44417	b	b	-
+chr3	44391	44423	b	b	-
+chr3	44391	44423	b	b	-
+chr3	44391	44423	b	b	-
+chr3	44425	44457	a	a	+
+chr3	44426	44458	a	a	+
+chr3	44428	44460	a	a	+
+chr3	44398	44430	b	b	-
+chr3	44404	44436	b	b	-
+chr3	44404	44436	b	b	-
+chr3	44405	44437	b	b	-
+chr3	44440	44472	a	a	+
+chr3	44440	44472	a	a	+
+chr3	44477	44509	a	a	+
+chr3	44480	44512	a	a	+
+chr3	44783	44815	b	b	-
+chr3	44888	44920	b	b	-
+chr3	44971	45003	a	a	+
+chr3	45135	45167	a	a	+
+chr3	45320	45352	a	a	+
+chr3	45470	45502	b	b	-
+chr3	46049	46081	a	a	+
+chr3	46430	46462	b	b	-
+chr3	46525	46557	b	b	-
+chr3	46525	46557	b	b	-
+chr3	46531	46563	b	b	-
+chr3	46532	46564	b	b	-
+chr3	46568	46600	a	a	+
+chr3	46539	46571	b	b	-
+chr3	46575	46607	a	a	+
+chr3	46682	46714	b	b	-
+chr3	46720	46752	a	a	+
+chr3	46720	46752	a	a	+
+chr3	46726	46758	a	a	+
+chr3	46698	46730	b	b	-
+chr3	46698	46730	b	b	-
+chr3	46735	46767	a	a	+
+chr3	46706	46738	b	b	-
+chr3	46707	46739	b	b	-
+chr3	46748	46780	a	a	+
+chr3	46717	46749	b	b	-
+chr3	46717	46749	b	b	-
+chr3	46722	46754	b	b	-
+chr3	46824	46856	b	b	-
+chr3	46830	46862	b	b	-
+chr3	46847	46879	b	b	-
+chr3	46880	46912	a	a	+
+chr3	46880	46912	a	a	+
+chr3	46849	46881	b	b	-
+chr3	46889	46921	a	a	+
+chr3	46889	46921	a	a	+
+chr3	46889	46921	a	a	+
+chr3	46889	46921	a	a	+
+chr3	46896	46928	a	a	+
+chr3	46866	46898	b	b	-
+chr3	46866	46898	b	b	-
+chr3	46866	46898	b	b	-
+chr3	46866	46898	b	b	-
+chr3	46866	46898	b	b	-
+chr3	46866	46898	b	b	-
+chr3	46867	46899	b	b	-
+chr3	46867	46899	b	b	-
+chr3	46867	46899	b	b	-
+chr3	46867	46899	b	b	-
+chr3	46868	46900	b	b	-
+chr3	46868	46900	b	b	-
+chr3	46868	46900	b	b	-
+chr3	46868	46900	b	b	-
+chr3	46903	46935	a	a	+
+chr3	46905	46937	a	a	+
+chr3	46905	46937	a	a	+
+chr3	46905	46937	a	a	+
+chr3	46905	46937	a	a	+
+chr3	46905	46937	a	a	+
+chr3	46905	46937	a	a	+
+chr3	46905	46937	a	a	+
+chr3	46882	46914	b	b	-
+chr3	46928	46960	a	a	+
+chr3	46928	46960	a	a	+
+chr3	47168	47200	a	a	+
+chr3	47145	47177	b	b	-
+chr3	47150	47182	b	b	-
+chr3	47150	47182	b	b	-
+chr3	47152	47184	b	b	-
+chr3	47153	47185	b	b	-
+chr3	47187	47219	a	a	+
+chr3	47187	47219	a	a	+
+chr3	47188	47220	a	a	+
+chr3	47156	47188	b	b	-
+chr3	47158	47190	b	b	-
+chr3	47196	47228	a	a	+
+chr3	47202	47234	a	a	+
+chr3	47202	47234	a	a	+
+chr3	47202	47234	a	a	+
+chr3	47208	47240	a	a	+
+chr3	47208	47240	a	a	+
+chr3	47215	47247	a	a	+
+chr3	47368	47400	a	a	+
+chr3	47368	47400	a	a	+
+chr3	47383	47415	a	a	+
+chr3	47530	47562	a	a	+
+chr3	47530	47562	a	a	+
+chr3	47530	47562	a	a	+
+chr3	47499	47531	b	b	-
+chr3	47543	47575	a	a	+
+chr3	47511	47543	b	b	-
+chr3	47538	47570	b	b	-
+chr3	47869	47901	a	a	+
+chr3	47878	47910	a	a	+
+chr3	47864	47896	b	b	-
+chr3	47874	47906	b	b	-
+chr3	47963	47995	a	a	+
+chr3	47969	48001	b	b	-
+chr3	48017	48049	b	b	-
+chr3	48062	48094	a	a	+
+chr3	48062	48094	a	a	+
+chr3	48179	48211	a	a	+
+chr3	48154	48186	b	b	-
+chr3	48196	48228	a	a	+
+chr3	48203	48235	a	a	+
+chr3	48173	48205	b	b	-
+chr3	48207	48239	a	a	+
+chr3	48207	48239	a	a	+
+chr3	48214	48246	a	a	+
+chr3	48214	48246	a	a	+
+chr3	48214	48246	a	a	+
+chr3	48214	48246	a	a	+
+chr3	48214	48246	a	a	+
+chr3	48214	48246	a	a	+
+chr3	48182	48214	b	b	-
+chr3	48205	48237	b	b	-
+chr3	48258	48290	a	a	+
+chr3	48321	48353	b	b	-
+chr3	48365	48397	a	a	+
+chr3	48365	48397	a	a	+
+chr3	48365	48397	a	a	+
+chr3	48365	48397	a	a	+
+chr3	48334	48366	b	b	-
+chr3	48375	48407	a	a	+
+chr3	48343	48375	b	b	-
+chr3	48343	48375	b	b	-
+chr3	48343	48375	b	b	-
+chr3	48343	48375	b	b	-
+chr3	48343	48375	b	b	-
+chr3	48343	48375	b	b	-
+chr3	48343	48375	b	b	-
+chr3	48343	48375	b	b	-
+chr3	48376	48408	a	a	+
+chr3	48378	48410	a	a	+
+chr3	48379	48411	a	a	+
+chr3	48379	48411	a	a	+
+chr3	48383	48415	a	a	+
+chr3	48383	48415	a	a	+
+chr3	48385	48417	a	a	+
+chr3	48390	48422	a	a	+
+chr3	48390	48422	a	a	+
+chr3	48390	48422	a	a	+
+chr3	48390	48422	a	a	+
+chr3	48391	48423	a	a	+
+chr3	48391	48423	a	a	+
+chr3	48365	48397	b	b	-
+chr3	48371	48403	b	b	-
+chr3	48404	48436	a	a	+
+chr3	48409	48441	a	a	+
+chr3	48410	48442	a	a	+
+chr3	48404	48436	b	b	-
+chr3	48722	48754	a	a	+
+chr3	48722	48754	a	a	+
+chr3	48981	49013	b	b	-
+chr3	49308	49340	b	b	-
+chr3	49320	49352	b	b	-
+chr3	49537	49569	a	a	+
+chr3	49906	49938	b	b	-
+chr3	50051	50083	b	b	-
+chr3	50117	50149	a	a	+
+chr3	50227	50259	a	a	+
+chr3	50227	50259	a	a	+
+chr3	50227	50259	a	a	+
+chr3	50212	50244	b	b	-
+chr3	50248	50280	a	a	+
+chr3	50254	50286	a	a	+
+chr3	50749	50781	a	a	+
+chr3	50750	50782	a	a	+
+chr3	50750	50782	a	a	+
+chr3	50721	50753	b	b	-
+chr3	50721	50753	b	b	-
+chr3	50725	50757	b	b	-
+chr3	50733	50765	b	b	-
+chr3	50733	50765	b	b	-
+chr3	50733	50765	b	b	-
+chr3	50733	50765	b	b	-
+chr3	50738	50770	b	b	-
+chr3	50746	50778	b	b	-
+chr3	50813	50845	a	a	+
+chr3	50804	50836	b	b	-
+chr3	50863	50895	b	b	-
+chr3	50933	50965	a	a	+
+chr3	51061	51093	a	a	+
+chr3	51037	51069	b	b	-
+chr3	51045	51077	b	b	-
+chr3	51049	51081	b	b	-
+chr3	51090	51122	a	a	+
+chr3	51101	51133	a	a	+
+chr3	51373	51405	a	a	+
+chr3	51383	51415	a	a	+
+chr3	51393	51425	a	a	+
+chr3	51399	51431	a	a	+
+chr3	51403	51435	a	a	+
+chr3	51371	51403	b	b	-
+chr3	51374	51406	b	b	-
+chr3	51433	51465	b	b	-
+chr3	51542	51574	a	a	+
+chr3	51546	51578	a	a	+
+chr3	51514	51546	b	b	-
+chr3	51522	51554	b	b	-
+chr3	51582	51614	b	b	-
+chr3	51582	51614	b	b	-
+chr3	51583	51615	b	b	-
+chr3	51583	51615	b	b	-
+chr3	51583	51615	b	b	-
+chr3	51667	51699	b	b	-
+chr3	51693	51725	b	b	-
+chr3	51834	51866	b	b	-
+chr3	51856	51888	b	b	-
+chr3	51856	51888	b	b	-
+chr3	51856	51888	b	b	-
+chr3	51857	51889	b	b	-
+chr3	52164	52196	b	b	-
+chr3	52176	52208	b	b	-
+chr3	52180	52212	b	b	-
+chr3	52306	52338	b	b	-
+chr3	52362	52394	a	a	+
+chr3	52371	52403	a	a	+
+chr3	52358	52390	b	b	-
+chr3	52603	52635	b	b	-
+chr3	52603	52635	b	b	-
+chr3	52639	52671	a	a	+
+chr3	52610	52642	b	b	-
+chr3	52614	52646	b	b	-
+chr3	52614	52646	b	b	-
+chr3	52649	52681	a	a	+
+chr3	52654	52686	a	a	+
+chr3	52654	52686	a	a	+
+chr3	52654	52686	a	a	+
+chr3	52655	52687	a	a	+
+chr3	52655	52687	a	a	+
+chr3	52655	52687	a	a	+
+chr3	52656	52688	a	a	+
+chr3	52624	52656	b	b	-
+chr3	52624	52656	b	b	-
+chr3	52624	52656	b	b	-
+chr3	52627	52659	b	b	-
+chr3	52628	52660	b	b	-
+chr3	52662	52694	a	a	+
+chr3	52662	52694	a	a	+
+chr3	52663	52695	a	a	+
+chr3	52663	52695	a	a	+
+chr3	52663	52695	a	a	+
+chr3	52663	52695	a	a	+
+chr3	52663	52695	a	a	+
+chr3	52663	52695	a	a	+
+chr3	52663	52695	a	a	+
+chr3	52663	52695	a	a	+
+chr3	52632	52664	b	b	-
+chr3	52634	52666	b	b	-
+chr3	52634	52666	b	b	-
+chr3	52634	52666	b	b	-
+chr3	52634	52666	b	b	-
+chr3	52667	52699	a	a	+
+chr3	52667	52699	a	a	+
+chr3	52667	52699	a	a	+
+chr3	52667	52699	a	a	+
+chr3	52667	52699	a	a	+
+chr3	52636	52668	b	b	-
+chr3	52636	52668	b	b	-
+chr3	52636	52668	b	b	-
+chr3	52636	52668	b	b	-
+chr3	52636	52668	b	b	-
+chr3	52636	52668	b	b	-
+chr3	52636	52668	b	b	-
+chr3	52636	52668	b	b	-
+chr3	52636	52668	b	b	-
+chr3	52636	52668	b	b	-
+chr3	52636	52668	b	b	-
+chr3	52636	52668	b	b	-
+chr3	52636	52668	b	b	-
+chr3	52638	52670	b	b	-
+chr3	52638	52670	b	b	-
+chr3	52638	52670	b	b	-
+chr3	52638	52670	b	b	-
+chr3	52638	52670	b	b	-
+chr3	52638	52670	b	b	-
+chr3	52638	52670	b	b	-
+chr3	52638	52670	b	b	-
+chr3	52638	52670	b	b	-
+chr3	52639	52671	b	b	-
+chr3	52639	52671	b	b	-
+chr3	52674	52706	a	a	+
+chr3	52675	52707	a	a	+
+chr3	52676	52708	a	a	+
+chr3	52676	52708	a	a	+
+chr3	52680	52712	a	a	+
+chr3	52681	52713	a	a	+
+chr3	52681	52713	a	a	+
+chr3	52649	52681	b	b	-
+chr3	52649	52681	b	b	-
+chr3	52649	52681	b	b	-
+chr3	52649	52681	b	b	-
+chr3	52682	52714	a	a	+
+chr3	52682	52714	a	a	+
+chr3	52682	52714	a	a	+
+chr3	52700	52732	a	a	+
+chr3	52706	52738	a	a	+
+chr3	52719	52751	a	a	+
+chr3	52778	52810	b	b	-
+chr3	52779	52811	b	b	-
+chr3	52822	52854	a	a	+
+chr3	52790	52822	b	b	-
+chr3	52790	52822	b	b	-
+chr3	52790	52822	b	b	-
+chr3	52792	52824	b	b	-
+chr3	52828	52860	a	a	+
+chr3	52830	52862	a	a	+
+chr3	52832	52864	a	a	+
+chr3	52834	52866	a	a	+
+chr3	52837	52869	a	a	+
+chr3	52839	52871	a	a	+
+chr3	52839	52871	a	a	+
+chr3	52839	52871	a	a	+
+chr3	52811	52843	b	b	-
+chr3	52811	52843	b	b	-
+chr3	52817	52849	b	b	-
+chr3	52818	52850	b	b	-
+chr3	52829	52861	b	b	-
+chr3	52963	52995	a	a	+
+chr3	52933	52965	b	b	-
+chr3	52933	52965	b	b	-
+chr3	52976	53008	a	a	+
+chr3	52976	53008	a	a	+
+chr3	52976	53008	a	a	+
+chr3	52976	53008	a	a	+
+chr3	52980	53012	a	a	+
+chr3	52968	53000	b	b	-
+chr3	53007	53039	a	a	+
+chr3	53009	53041	a	a	+
+chr3	52986	53018	b	b	-
+chr3	53021	53053	b	b	-
+chr3	53126	53158	b	b	-
+chr3	53131	53163	b	b	-
+chr3	53173	53205	a	a	+
+chr3	53144	53176	b	b	-
+chr3	53195	53227	a	a	+
+chr3	53195	53227	a	a	+
+chr3	53195	53227	a	a	+
+chr3	53182	53214	b	b	-
+chr3	53276	53308	b	b	-
+chr3	53311	53343	a	a	+
+chr3	53325	53357	a	a	+
+chr3	53333	53365	a	a	+
+chr3	53356	53388	a	a	+
+chr3	53403	53435	a	a	+
+chr3	53548	53580	a	a	+
+chr3	53564	53596	a	a	+
+chr3	53660	53692	b	b	-
+chr3	53699	53731	a	a	+
+chr3	53728	53760	b	b	-
+chr3	53812	53844	b	b	-
+chr3	53812	53844	b	b	-
+chr3	53902	53934	a	a	+
+chr3	53988	54020	b	b	-
+chr3	54081	54113	a	a	+
+chr3	54202	54234	a	a	+
+chr3	54202	54234	b	b	-
+chr3	54213	54245	b	b	-
+chr3	54266	54298	a	a	+
+chr3	54302	54334	b	b	-
+chr3	54371	54403	b	b	-
+chr3	54543	54575	a	a	+
+chr3	54600	54632	b	b	-
+chr3	54641	54673	a	a	+
+chr3	54736	54768	a	a	+
+chr3	54948	54980	b	b	-
+chr3	54974	55006	b	b	-
+chr3	55008	55040	a	a	+
+chr3	55037	55069	b	b	-
+chr3	55037	55069	b	b	-
+chr3	55037	55069	b	b	-
+chr3	55130	55162	b	b	-
+chr3	55136	55168	b	b	-
+chr3	55199	55231	b	b	-
+chr3	55328	55360	b	b	-
+chr3	55455	55487	a	a	+
+chr3	55510	55542	b	b	-
+chr3	55585	55617	b	b	-
+chr3	55622	55654	a	a	+
+chr3	55656	55688	a	a	+
+chr3	55674	55706	a	a	+
+chr3	55665	55697	b	b	-
+chr3	55686	55718	b	b	-
+chr3	55723	55755	a	a	+
+chr3	55746	55778	a	a	+
+chr3	55740	55772	b	b	-
+chr3	55744	55776	b	b	-
+chr3	55782	55814	a	a	+
+chr3	55879	55911	a	a	+
+chr3	55859	55891	b	b	-
+chr3	55908	55940	a	a	+
+chr3	56008	56040	a	a	+
+chr3	56282	56314	b	b	-
+chr3	56320	56352	b	b	-
+chr3	56359	56391	a	a	+
+chr3	56359	56391	a	a	+
+chr3	56375	56407	a	a	+
+chr3	56379	56411	a	a	+
+chr3	56386	56418	a	a	+
+chr3	56386	56418	a	a	+
+chr3	56402	56434	a	a	+
+chr3	56419	56451	a	a	+
+chr3	56450	56482	b	b	-
+chr3	56549	56581	a	a	+
+chr3	56521	56553	b	b	-
+chr3	56521	56553	b	b	-
+chr3	56521	56553	b	b	-
+chr3	56555	56587	a	a	+
+chr3	56556	56588	a	a	+
+chr3	56526	56558	b	b	-
+chr3	56529	56561	b	b	-
+chr3	56563	56595	a	a	+
+chr3	56531	56563	b	b	-
+chr3	56539	56571	b	b	-
+chr3	56544	56576	b	b	-
+chr3	56546	56578	b	b	-
+chr3	56558	56590	b	b	-
+chr3	57439	57471	a	a	+
+chr3	57538	57570	b	b	-
+chr3	58173	58205	b	b	-
+chr3	58173	58205	b	b	-
+chr3	58173	58205	b	b	-
+chr3	58225	58257	a	a	+
+chr3	58233	58265	a	a	+
+chr3	58233	58265	a	a	+
+chr3	58251	58283	a	a	+
+chr3	58380	58412	a	a	+
+chr3	58377	58409	b	b	-
+chr3	58377	58409	b	b	-
+chr3	58377	58409	b	b	-
+chr3	58534	58566	a	a	+
+chr3	58590	58622	b	b	-
+chr3	58590	58622	b	b	-
+chr3	58690	58722	a	a	+
+chr3	58696	58728	a	a	+
+chr3	58696	58728	a	a	+
+chr3	58702	58734	a	a	+
+chr3	58704	58736	a	a	+
+chr3	58676	58708	b	b	-
+chr3	58684	58716	b	b	-
+chr3	58719	58751	a	a	+
+chr3	58719	58751	a	a	+
+chr3	58687	58719	b	b	-
+chr3	58688	58720	b	b	-
+chr3	58688	58720	b	b	-
+chr3	58688	58720	b	b	-
+chr3	58721	58753	a	a	+
+chr3	58724	58756	a	a	+
+chr3	58724	58756	a	a	+
+chr3	58698	58730	b	b	-
+chr3	58953	58985	b	b	-
+chr3	59001	59033	a	a	+
+chr3	58970	59002	b	b	-
+chr3	59007	59039	a	a	+
+chr3	59007	59039	a	a	+
+chr3	59007	59039	a	a	+
+chr3	59007	59039	a	a	+
+chr3	58980	59012	b	b	-
+chr3	58980	59012	b	b	-
+chr3	59013	59045	a	a	+
+chr3	59013	59045	a	a	+
+chr3	59016	59048	a	a	+
+chr3	59016	59048	a	a	+
+chr3	59023	59055	a	a	+
+chr3	58993	59025	b	b	-
+chr3	58993	59025	b	b	-
+chr3	58993	59025	b	b	-
+chr3	58993	59025	b	b	-
+chr3	58995	59027	b	b	-
+chr3	59038	59070	a	a	+
+chr3	59041	59073	a	a	+
+chr3	59041	59073	a	a	+
+chr3	59017	59049	b	b	-
+chr3	59017	59049	b	b	-
+chr3	59034	59066	b	b	-
+chr3	59161	59193	b	b	-
+chr3	59344	59376	a	a	+
+chr3	59520	59552	a	a	+
+chr3	59499	59531	b	b	-
+chr3	59548	59580	a	a	+
+chr3	59769	59801	a	a	+
+chr3	59814	59846	a	a	+
+chr3	60068	60100	b	b	-
+chr3	60117	60149	a	a	+
+chr3	60204	60236	a	a	+
+chr3	60381	60413	a	a	+
+chr3	60463	60495	a	a	+
+chr3	60507	60539	a	a	+
+chr3	60529	60561	a	a	+
+chr3	60606	60638	b	b	-
+chr3	60647	60679	b	b	-
+chr3	60672	60704	b	b	-
+chr3	60852	60884	a	a	+
+chr3	60869	60901	a	a	+
+chr3	60965	60997	b	b	-
+chr3	61018	61050	a	a	+
+chr3	61019	61051	a	a	+
+chr3	61019	61051	a	a	+
+chr3	61050	61082	a	a	+
+chr3	61019	61051	b	b	-
+chr3	61028	61060	b	b	-
+chr3	61058	61090	b	b	-
+chr3	61089	61121	b	b	-
+chr3	61151	61183	a	a	+
+chr3	61128	61160	b	b	-
+chr3	61162	61194	a	a	+
+chr3	61163	61195	a	a	+
+chr3	61163	61195	a	a	+
+chr3	61134	61166	b	b	-
+chr3	61171	61203	a	a	+
+chr3	61140	61172	b	b	-
+chr3	61176	61208	a	a	+
+chr3	61177	61209	a	a	+
+chr3	61177	61209	a	a	+
+chr3	61161	61193	b	b	-
+chr3	61161	61193	b	b	-
+chr3	61200	61232	a	a	+
+chr3	61202	61234	a	a	+
+chr3	61335	61367	b	b	-
+chr3	61339	61371	b	b	-
+chr3	61339	61371	b	b	-
+chr3	61377	61409	a	a	+
+chr3	61377	61409	a	a	+
+chr3	61345	61377	b	b	-
+chr3	61345	61377	b	b	-
+chr3	61345	61377	b	b	-
+chr3	61378	61410	a	a	+
+chr3	61378	61410	a	a	+
+chr3	61378	61410	a	a	+
+chr3	61379	61411	a	a	+
+chr3	61348	61380	b	b	-
+chr3	61348	61380	b	b	-
+chr3	61381	61413	a	a	+
+chr3	61351	61383	b	b	-
+chr3	61351	61383	b	b	-
+chr3	61354	61386	b	b	-
+chr3	61354	61386	b	b	-
+chr3	61354	61386	b	b	-
+chr3	61356	61388	b	b	-
+chr3	61389	61421	a	a	+
+chr3	61389	61421	a	a	+
+chr3	61389	61421	a	a	+
+chr3	61389	61421	a	a	+
+chr3	61389	61421	a	a	+
+chr3	61389	61421	a	a	+
+chr3	61389	61421	a	a	+
+chr3	61357	61389	b	b	-
+chr3	61357	61389	b	b	-
+chr3	61357	61389	b	b	-
+chr3	61357	61389	b	b	-
+chr3	61357	61389	b	b	-
+chr3	61357	61389	b	b	-
+chr3	61357	61389	b	b	-
+chr3	61357	61389	b	b	-
+chr3	61357	61389	b	b	-
+chr3	61357	61389	b	b	-
+chr3	61390	61422	a	a	+
+chr3	61358	61390	b	b	-
+chr3	61359	61391	b	b	-
+chr3	61365	61397	b	b	-
+chr3	61365	61397	b	b	-
+chr3	61398	61430	a	a	+
+chr3	61368	61400	b	b	-
+chr3	61374	61406	b	b	-
+chr3	61376	61408	b	b	-
+chr3	61376	61408	b	b	-
+chr3	61376	61408	b	b	-
+chr3	61376	61408	b	b	-
+chr3	61376	61408	b	b	-
+chr3	61377	61409	b	b	-
+chr3	61414	61446	a	a	+
+chr3	61414	61446	a	a	+
+chr3	61416	61448	a	a	+
+chr3	61416	61448	a	a	+
+chr3	61416	61448	a	a	+
+chr3	61416	61448	a	a	+
+chr3	61389	61421	b	b	-
+chr3	61390	61422	b	b	-
+chr3	61426	61458	a	a	+
+chr3	61438	61470	a	a	+
+chr3	61417	61449	b	b	-
+chr3	61418	61450	b	b	-
+chr3	61418	61450	b	b	-
+chr3	61475	61507	a	a	+
+chr3	61593	61625	b	b	-
+chr3	61607	61639	b	b	-
+chr3	61645	61677	a	a	+
+chr3	61652	61684	a	a	+
+chr3	61652	61684	a	a	+
+chr3	61652	61684	a	a	+
+chr3	61652	61684	a	a	+
+chr3	61623	61655	b	b	-
+chr3	61657	61689	a	a	+
+chr3	61625	61657	b	b	-
+chr3	61625	61657	b	b	-
+chr3	61625	61657	b	b	-
+chr3	61626	61658	b	b	-
+chr3	61626	61658	b	b	-
+chr3	61626	61658	b	b	-
+chr3	61660	61692	a	a	+
+chr3	61660	61692	a	a	+
+chr3	61660	61692	a	a	+
+chr3	61660	61692	a	a	+
+chr3	61660	61692	a	a	+
+chr3	61661	61693	a	a	+
+chr3	61661	61693	a	a	+
+chr3	61630	61662	b	b	-
+chr3	61664	61696	a	a	+
+chr3	61632	61664	b	b	-
+chr3	61632	61664	b	b	-
+chr3	61665	61697	a	a	+
+chr3	61665	61697	a	a	+
+chr3	61633	61665	b	b	-
+chr3	61635	61667	b	b	-
+chr3	61668	61700	a	a	+
+chr3	61670	61702	a	a	+
+chr3	61672	61704	a	a	+
+chr3	61641	61673	b	b	-
+chr3	61675	61707	a	a	+
+chr3	61643	61675	b	b	-
+chr3	61643	61675	b	b	-
+chr3	61643	61675	b	b	-
+chr3	61643	61675	b	b	-
+chr3	61643	61675	b	b	-
+chr3	61644	61676	b	b	-
+chr3	61645	61677	b	b	-
+chr3	61645	61677	b	b	-
+chr3	61680	61712	a	a	+
+chr3	61652	61684	b	b	-
+chr3	61652	61684	b	b	-
+chr3	61652	61684	b	b	-
+chr3	61652	61684	b	b	-
+chr3	61652	61684	b	b	-
+chr3	61652	61684	b	b	-
+chr3	61702	61734	a	a	+
+chr3	61790	61822	b	b	-
+chr3	61823	61855	a	a	+
+chr3	61825	61857	a	a	+
+chr3	61835	61867	a	a	+
+chr3	61811	61843	b	b	-
+chr3	61846	61878	a	a	+
+chr3	61900	61932	b	b	-
+chr3	61911	61943	b	b	-
+chr3	61952	61984	b	b	-
+chr3	62006	62038	a	a	+
+chr3	62006	62038	a	a	+
+chr3	62009	62041	a	a	+
+chr3	62169	62201	a	a	+
+chr3	62185	62217	a	a	+
+chr3	62310	62342	b	b	-
+chr3	62327	62359	b	b	-
+chr3	62485	62517	b	b	-
+chr3	62553	62585	b	b	-
+chr3	62840	62872	a	a	+
+chr3	62840	62872	a	a	+
+chr3	62841	62873	a	a	+
+chr3	62842	62874	a	a	+
+chr3	62851	62883	a	a	+
+chr3	62819	62851	b	b	-
+chr3	62857	62889	a	a	+
+chr3	62836	62868	b	b	-
+chr3	62870	62902	a	a	+
+chr3	62893	62925	a	a	+
+chr3	62913	62945	a	a	+
+chr3	62994	63026	b	b	-
+chr3	63005	63037	b	b	-
+chr3	63005	63037	b	b	-
+chr3	63005	63037	b	b	-
+chr3	63046	63078	a	a	+
+chr3	63051	63083	a	a	+
+chr3	63053	63085	a	a	+
+chr3	63026	63058	b	b	-
+chr3	63029	63061	b	b	-
+chr3	63029	63061	b	b	-
+chr3	63062	63094	a	a	+
+chr3	63053	63085	b	b	-
+chr3	63053	63085	b	b	-
+chr3	63056	63088	b	b	-
+chr3	63100	63132	a	a	+
+chr3	63073	63105	b	b	-
+chr3	63075	63107	b	b	-
+chr3	63143	63175	b	b	-
+chr3	63176	63208	a	a	+
+chr3	63185	63217	a	a	+
+chr3	63186	63218	a	a	+
+chr3	63155	63187	b	b	-
+chr3	63192	63224	a	a	+
+chr3	63199	63231	a	a	+
+chr3	63171	63203	b	b	-
+chr3	63172	63204	b	b	-
+chr3	63208	63240	a	a	+
+chr3	63176	63208	b	b	-
+chr3	63182	63214	b	b	-
+chr3	63216	63248	a	a	+
+chr3	63216	63248	a	a	+
+chr3	63216	63248	a	a	+
+chr3	63216	63248	a	a	+
+chr3	63216	63248	a	a	+
+chr3	63184	63216	b	b	-
+chr3	63222	63254	a	a	+
+chr3	63226	63258	a	a	+
+chr3	63195	63227	b	b	-
+chr3	63195	63227	b	b	-
+chr3	63196	63228	b	b	-
+chr3	63232	63264	a	a	+
+chr3	63232	63264	a	a	+
+chr3	63202	63234	b	b	-
+chr3	63203	63235	b	b	-
+chr3	63203	63235	b	b	-
+chr3	63203	63235	b	b	-
+chr3	63203	63235	b	b	-
+chr3	63203	63235	b	b	-
+chr3	63203	63235	b	b	-
+chr3	63203	63235	b	b	-
+chr3	63203	63235	b	b	-
+chr3	63205	63237	b	b	-
+chr3	63205	63237	b	b	-
+chr3	63205	63237	b	b	-
+chr3	63242	63274	a	a	+
+chr3	63244	63276	a	a	+
+chr3	63257	63289	a	a	+
+chr3	63225	63257	b	b	-
+chr3	63259	63291	a	a	+
+chr3	63228	63260	b	b	-
+chr3	63228	63260	b	b	-
+chr3	63262	63294	a	a	+
+chr3	63262	63294	a	a	+
+chr3	63309	63341	a	a	+
+chr3	63417	63449	a	a	+
+chr3	63422	63454	a	a	+
+chr3	63405	63437	b	b	-
+chr3	63438	63470	a	a	+
+chr3	63439	63471	a	a	+
+chr3	63407	63439	b	b	-
+chr3	63407	63439	b	b	-
+chr3	63407	63439	b	b	-
+chr3	63407	63439	b	b	-
+chr3	63408	63440	b	b	-
+chr3	63441	63473	a	a	+
+chr3	63409	63441	b	b	-
+chr3	63449	63481	a	a	+
+chr3	63449	63481	a	a	+
+chr3	63417	63449	b	b	-
+chr3	63450	63482	a	a	+
+chr3	63418	63450	b	b	-
+chr3	63419	63451	b	b	-
+chr3	63453	63485	a	a	+
+chr3	63453	63485	a	a	+
+chr3	63454	63486	a	a	+
+chr3	63454	63486	a	a	+
+chr3	63454	63486	a	a	+
+chr3	63456	63488	a	a	+
+chr3	63461	63493	a	a	+
+chr3	63461	63493	a	a	+
+chr3	63461	63493	a	a	+
+chr3	63468	63500	a	a	+
+chr3	63436	63468	b	b	-
+chr3	63441	63473	b	b	-
+chr3	63444	63476	b	b	-
+chr3	63445	63477	b	b	-
+chr3	63445	63477	b	b	-
+chr3	63446	63478	b	b	-
+chr3	63479	63511	a	a	+
+chr3	63479	63511	a	a	+
+chr3	63448	63480	b	b	-
+chr3	63448	63480	b	b	-
+chr3	63448	63480	b	b	-
+chr3	63448	63480	b	b	-
+chr3	63449	63481	b	b	-
+chr3	63449	63481	b	b	-
+chr3	63449	63481	b	b	-
+chr3	63452	63484	b	b	-
+chr3	63495	63527	a	a	+
+chr3	63495	63527	a	a	+
+chr3	63495	63527	a	a	+
+chr3	63503	63535	a	a	+
+chr3	63504	63536	a	a	+
+chr3	63510	63542	a	a	+
+chr3	63500	63532	b	b	-
+chr3	63500	63532	b	b	-
+chr3	63600	63632	a	a	+
+chr3	63579	63611	b	b	-
+chr3	63579	63611	b	b	-
+chr3	63589	63621	b	b	-
+chr3	63630	63662	a	a	+
+chr3	63632	63664	a	a	+
+chr3	63605	63637	b	b	-
+chr3	63624	63656	b	b	-
+chr3	63791	63823	a	a	+
+chr3	63880	63912	b	b	-
+chr3	63880	63912	b	b	-
+chr3	63937	63969	b	b	-
+chr3	64106	64138	b	b	-
+chr3	64293	64325	a	a	+
+chr3	64460	64492	a	a	+
+chr3	64536	64568	a	a	+
+chr3	65024	65056	b	b	-
+chr3	65180	65212	b	b	-
+chr3	65186	65218	b	b	-
+chr3	65378	65410	a	a	+
+chr3	65378	65410	a	a	+
+chr3	65378	65410	a	a	+
+chr3	65382	65414	a	a	+
+chr3	65357	65389	b	b	-
+chr3	65357	65389	b	b	-
+chr3	65525	65557	a	a	+
+chr3	65533	65565	a	a	+
+chr3	65537	65569	a	a	+
+chr3	65538	65570	a	a	+
+chr3	65538	65570	a	a	+
+chr3	65538	65570	a	a	+
+chr3	65542	65574	a	a	+
+chr3	65543	65575	a	a	+
+chr3	65546	65578	a	a	+
+chr3	65546	65578	a	a	+
+chr3	65546	65578	a	a	+
+chr3	65546	65578	a	a	+
+chr3	65546	65578	a	a	+
+chr3	65546	65578	a	a	+
+chr3	65514	65546	b	b	-
+chr3	65515	65547	b	b	-
+chr3	65516	65548	b	b	-
+chr3	65550	65582	a	a	+
+chr3	65553	65585	a	a	+
+chr3	65553	65585	a	a	+
+chr3	65524	65556	b	b	-
+chr3	65560	65592	a	a	+
+chr3	65528	65560	b	b	-
+chr3	65529	65561	b	b	-
+chr3	65529	65561	b	b	-
+chr3	65564	65596	a	a	+
+chr3	65534	65566	b	b	-
+chr3	65567	65599	a	a	+
+chr3	65567	65599	a	a	+
+chr3	65540	65572	b	b	-
+chr3	65586	65618	a	a	+
+chr3	65611	65643	a	a	+
+chr3	65997	66029	a	a	+
+chr3	65973	66005	b	b	-
+chr3	65973	66005	b	b	-
+chr3	65973	66005	b	b	-
+chr3	66039	66071	a	a	+
+chr3	66097	66129	a	a	+
+chr3	66172	66204	a	a	+
+chr3	66152	66184	b	b	-
+chr3	66153	66185	b	b	-
+chr3	66159	66191	b	b	-
+chr3	66286	66318	b	b	-
+chr3	66344	66376	a	a	+
+chr3	66555	66587	b	b	-
+chr3	66555	66587	b	b	-
+chr3	66660	66692	b	b	-
+chr3	66663	66695	b	b	-
+chr3	66805	66837	a	a	+
+chr3	66878	66910	a	a	+
+chr3	66868	66900	b	b	-
+chr3	66915	66947	b	b	-
+chr3	66974	67006	a	a	+
+chr3	66978	67010	a	a	+
+chr3	67119	67151	b	b	-
+chr3	67209	67241	a	a	+
+chr3	67209	67241	a	a	+
+chr3	67200	67232	b	b	-
+chr3	67368	67400	b	b	-
+chr3	67505	67537	a	a	+
+chr3	67523	67555	a	a	+
+chr3	67515	67547	b	b	-
+chr3	67556	67588	a	a	+
+chr3	67818	67850	b	b	-
+chr3	67871	67903	a	a	+
+chr3	67846	67878	b	b	-
+chr3	67848	67880	b	b	-
+chr3	68028	68060	a	a	+
+chr3	68045	68077	a	a	+
+chr3	68021	68053	b	b	-
+chr3	68076	68108	a	a	+
+chr3	68177	68209	a	a	+
+chr3	68177	68209	a	a	+
+chr3	68177	68209	a	a	+
+chr3	68202	68234	a	a	+
+chr3	68176	68208	b	b	-
+chr3	68180	68212	b	b	-
+chr3	68180	68212	b	b	-
+chr3	68180	68212	b	b	-
+chr3	68186	68218	b	b	-
+chr3	68219	68251	a	a	+
+chr3	68187	68219	b	b	-
+chr3	68220	68252	a	a	+
+chr3	68228	68260	a	a	+
+chr3	68199	68231	b	b	-
+chr3	68202	68234	b	b	-
+chr3	68203	68235	b	b	-
+chr3	68211	68243	b	b	-
+chr3	68222	68254	b	b	-
+chr3	68256	68288	a	a	+
+chr3	68273	68305	a	a	+
+chr3	68294	68326	a	a	+
+chr3	68367	68399	a	a	+
+chr3	68639	68671	a	a	+
+chr3	68639	68671	a	a	+
+chr3	68619	68651	b	b	-
+chr3	68641	68673	b	b	-
+chr3	68643	68675	b	b	-
+chr3	68698	68730	a	a	+
+chr3	68885	68917	b	b	-
+chr3	68902	68934	b	b	-
+chr3	68923	68955	b	b	-
+chr3	68926	68958	b	b	-
+chr3	68986	69018	a	a	+
+chr3	69053	69085	b	b	-
+chr3	69065	69097	b	b	-
+chr3	69090	69122	b	b	-
+chr3	69210	69242	b	b	-
+chr3	69379	69411	b	b	-
+chr3	69530	69562	b	b	-
+chr3	69531	69563	b	b	-
+chr3	69568	69600	a	a	+
+chr3	69685	69717	b	b	-
+chr3	69712	69744	b	b	-
+chr3	69724	69756	b	b	-
+chr3	69736	69768	b	b	-
+chr3	69773	69805	a	a	+
+chr3	69781	69813	b	b	-
+chr3	69831	69863	b	b	-
+chr3	69845	69877	b	b	-
+chr3	69882	69914	a	a	+
+chr3	69896	69928	a	a	+
+chr3	69896	69928	a	a	+
+chr3	69896	69928	a	a	+
+chr3	69896	69928	a	a	+
+chr3	69896	69928	a	a	+
+chr3	69896	69928	a	a	+
+chr3	69871	69903	b	b	-
+chr3	69904	69936	a	a	+
+chr3	69904	69936	a	a	+
+chr3	69907	69939	a	a	+
+chr3	69880	69912	b	b	-
+chr3	69880	69912	b	b	-
+chr3	69914	69946	a	a	+
+chr3	69914	69946	a	a	+
+chr3	69884	69916	b	b	-
+chr3	69886	69918	b	b	-
+chr3	69890	69922	b	b	-
+chr3	69890	69922	b	b	-
+chr3	69890	69922	b	b	-
+chr3	69890	69922	b	b	-
+chr3	69890	69922	b	b	-
+chr3	69895	69927	b	b	-
+chr3	69895	69927	b	b	-
+chr3	69928	69960	a	a	+
+chr3	69928	69960	a	a	+
+chr3	69928	69960	a	a	+
+chr3	69896	69928	b	b	-
+chr3	69933	69965	a	a	+
+chr3	69933	69965	a	a	+
+chr3	69902	69934	b	b	-
+chr3	69906	69938	b	b	-
+chr3	69906	69938	b	b	-
+chr3	69906	69938	b	b	-
+chr3	69912	69944	b	b	-
+chr3	69912	69944	b	b	-
+chr3	69920	69952	b	b	-
+chr3	69923	69955	b	b	-
+chr3	69957	69989	a	a	+
+chr3	69925	69957	b	b	-
+chr3	69969	70001	a	a	+
+chr3	69986	70018	a	a	+
+chr3	69997	70029	a	a	+
+chr3	70000	70032	a	a	+
+chr3	70002	70034	a	a	+
+chr3	70131	70163	a	a	+
+chr3	70132	70164	a	a	+
+chr3	70138	70170	a	a	+
+chr3	70141	70173	a	a	+
+chr3	70151	70183	a	a	+
+chr3	70152	70184	a	a	+
+chr3	70122	70154	b	b	-
+chr3	70155	70187	a	a	+
+chr3	70157	70189	a	a	+
+chr3	70125	70157	b	b	-
+chr3	70161	70193	a	a	+
+chr3	70161	70193	a	a	+
+chr3	70161	70193	a	a	+
+chr3	70161	70193	a	a	+
+chr3	70162	70194	a	a	+
+chr3	70162	70194	a	a	+
+chr3	70162	70194	a	a	+
+chr3	70162	70194	a	a	+
+chr3	70131	70163	b	b	-
+chr3	70165	70197	a	a	+
+chr3	70165	70197	a	a	+
+chr3	70165	70197	a	a	+
+chr3	70134	70166	b	b	-
+chr3	70134	70166	b	b	-
+chr3	70168	70200	a	a	+
+chr3	70136	70168	b	b	-
+chr3	70136	70168	b	b	-
+chr3	70136	70168	b	b	-
+chr3	70137	70169	b	b	-
+chr3	70177	70209	a	a	+
+chr3	70177	70209	a	a	+
+chr3	70147	70179	b	b	-
+chr3	70147	70179	b	b	-
+chr3	70147	70179	b	b	-
+chr3	70180	70212	a	a	+
+chr3	70190	70222	a	a	+
+chr3	70193	70225	a	a	+
+chr3	70164	70196	b	b	-
+chr3	70209	70241	a	a	+
+chr3	70209	70241	a	a	+
+chr3	70178	70210	b	b	-
+chr3	70216	70248	a	a	+
+chr3	70216	70248	a	a	+
+chr3	70224	70256	a	a	+
+chr3	70263	70295	b	b	-
+chr3	70291	70323	b	b	-
+chr3	70326	70358	a	a	+
+chr3	70294	70326	b	b	-
+chr3	70327	70359	a	a	+
+chr3	70327	70359	a	a	+
+chr3	70299	70331	b	b	-
+chr3	70307	70339	b	b	-
+chr3	70307	70339	b	b	-
+chr3	70307	70339	b	b	-
+chr3	70313	70345	b	b	-
+chr3	70482	70514	a	a	+
+chr3	70468	70500	b	b	-
+chr3	70475	70507	b	b	-
+chr3	70502	70534	b	b	-
+chr3	70612	70644	b	b	-
+chr3	70678	70710	a	a	+
+chr3	70664	70696	b	b	-
+chr3	70812	70844	a	a	+
+chr3	70861	70893	b	b	-
+chr3	70904	70936	b	b	-
+chr3	70959	70991	a	a	+
+chr3	70959	70991	a	a	+
+chr3	70966	70998	b	b	-
+chr3	71040	71072	b	b	-
+chr3	71075	71107	a	a	+
+chr3	71090	71122	a	a	+
+chr3	71112	71144	a	a	+
+chr3	71100	71132	b	b	-
+chr3	71231	71263	b	b	-
+chr3	71234	71266	b	b	-
+chr3	71274	71306	a	a	+
+chr3	71305	71337	a	a	+
+chr3	71333	71365	a	a	+
+chr3	71422	71454	a	a	+
+chr3	71448	71480	a	a	+
+chr3	71448	71480	b	b	-
+chr3	71454	71486	b	b	-
+chr3	71638	71670	b	b	-
+chr3	71703	71735	a	a	+
+chr3	71689	71721	b	b	-
+chr3	71706	71738	b	b	-
+chr3	71710	71742	b	b	-
+chr3	71751	71783	b	b	-
+chr3	71765	71797	b	b	-
+chr3	71810	71842	b	b	-
+chr3	71877	71909	a	a	+
+chr3	71856	71888	b	b	-
+chr3	71856	71888	b	b	-
+chr3	71891	71923	a	a	+
+chr3	71891	71923	a	a	+
+chr3	71891	71923	a	a	+
+chr3	71892	71924	a	a	+
+chr3	71892	71924	a	a	+
+chr3	71892	71924	a	a	+
+chr3	71892	71924	a	a	+
+chr3	71866	71898	b	b	-
+chr3	71866	71898	b	b	-
+chr3	71868	71900	b	b	-
+chr3	71906	71938	a	a	+
+chr3	71915	71947	a	a	+
+chr3	71916	71948	a	a	+
+chr3	71920	71952	a	a	+
+chr3	71905	71937	b	b	-
+chr3	71976	72008	b	b	-
+chr3	71976	72008	b	b	-
+chr3	72076	72108	a	a	+
+chr3	72093	72125	b	b	-
+chr3	72377	72409	a	a	+
+chr3	72368	72400	b	b	-
+chr3	72418	72450	b	b	-
+chr3	72461	72493	b	b	-
+chr3	72531	72563	b	b	-
+chr3	72531	72563	b	b	-
+chr3	72650	72682	a	a	+
+chr3	72749	72781	b	b	-
+chr3	72798	72830	a	a	+
+chr3	72833	72865	a	a	+
+chr3	72928	72960	a	a	+
+chr3	72928	72960	a	a	+
+chr3	72928	72960	a	a	+
+chr3	72916	72948	b	b	-
+chr3	72977	73009	a	a	+
+chr3	73072	73104	a	a	+
+chr3	73121	73153	a	a	+
+chr3	73127	73159	b	b	-
+chr3	73165	73197	a	a	+
+chr3	73165	73197	a	a	+
+chr3	73152	73184	b	b	-
+chr3	73208	73240	a	a	+
+chr3	73214	73246	b	b	-
+chr3	73302	73334	b	b	-
+chr3	73472	73504	b	b	-
+chr3	73646	73678	a	a	+
+chr3	73674	73706	a	a	+
+chr3	73656	73688	b	b	-
+chr3	73657	73689	b	b	-
+chr3	73657	73689	b	b	-
+chr3	73691	73723	a	a	+
+chr3	73667	73699	b	b	-
+chr3	73711	73743	a	a	+
+chr3	73718	73750	a	a	+
+chr3	73699	73731	b	b	-
+chr3	73710	73742	b	b	-
+chr3	73755	73787	a	a	+
+chr3	73807	73839	b	b	-
+chr3	73813	73845	b	b	-
+chr3	73847	73879	a	a	+
+chr3	73847	73879	a	a	+
+chr3	73851	73883	a	a	+
+chr3	73857	73889	a	a	+
+chr3	73829	73861	b	b	-
+chr3	73836	73868	b	b	-
+chr3	73836	73868	b	b	-
+chr3	73837	73869	b	b	-
+chr3	73870	73902	a	a	+
+chr3	73872	73904	a	a	+
+chr3	73878	73910	a	a	+
+chr3	73848	73880	b	b	-
+chr3	73892	73924	a	a	+
+chr3	73892	73924	a	a	+
+chr3	73895	73927	a	a	+
+chr3	73903	73935	a	a	+
+chr3	73907	73939	a	a	+
+chr3	73884	73916	b	b	-
+chr3	73919	73951	a	a	+
+chr3	73904	73936	b	b	-
+chr3	73976	74008	b	b	-
+chr3	74012	74044	a	a	+
+chr3	74015	74047	a	a	+
+chr3	74024	74056	a	a	+
+chr3	74000	74032	b	b	-
+chr3	74035	74067	a	a	+
+chr3	74006	74038	b	b	-
+chr3	74006	74038	b	b	-
+chr3	74006	74038	b	b	-
+chr3	74006	74038	b	b	-
+chr3	74042	74074	a	a	+
+chr3	74042	74074	a	a	+
+chr3	74042	74074	a	a	+
+chr3	74042	74074	a	a	+
+chr3	74045	74077	a	a	+
+chr3	74020	74052	b	b	-
+chr3	74081	74113	a	a	+
+chr3	74081	74113	a	a	+
+chr3	74051	74083	b	b	-
+chr3	74051	74083	b	b	-
+chr3	74057	74089	b	b	-
+chr3	74114	74146	a	a	+
+chr3	74127	74159	a	a	+
+chr3	74237	74269	a	a	+
+chr3	74257	74289	a	a	+
+chr3	74257	74289	a	a	+
+chr3	74257	74289	a	a	+
+chr3	74247	74279	b	b	-
+chr3	74250	74282	b	b	-
+chr3	74255	74287	b	b	-
+chr3	74258	74290	b	b	-
+chr3	74260	74292	b	b	-
+chr3	74295	74327	a	a	+
+chr3	74268	74300	b	b	-
+chr3	74268	74300	b	b	-
+chr3	74268	74300	b	b	-
+chr3	74302	74334	a	a	+
+chr3	74303	74335	a	a	+
+chr3	74277	74309	b	b	-
+chr3	74277	74309	b	b	-
+chr3	74280	74312	b	b	-
+chr3	74313	74345	a	a	+
+chr3	74281	74313	b	b	-
+chr3	74281	74313	b	b	-
+chr3	74287	74319	b	b	-
+chr3	74291	74323	b	b	-
+chr3	74325	74357	a	a	+
+chr3	74329	74361	a	a	+
+chr3	74306	74338	b	b	-
+chr3	74306	74338	b	b	-
+chr3	74340	74372	a	a	+
+chr3	74343	74375	a	a	+
+chr3	74429	74461	a	a	+
+chr3	74429	74461	a	a	+
+chr3	74398	74430	b	b	-
+chr3	74434	74466	a	a	+
+chr3	74402	74434	b	b	-
+chr3	74410	74442	b	b	-
+chr3	74416	74448	b	b	-
+chr3	74449	74481	a	a	+
+chr3	74450	74482	a	a	+
+chr3	74450	74482	a	a	+
+chr3	74456	74488	a	a	+
+chr3	74460	74492	a	a	+
+chr3	74473	74505	a	a	+
+chr3	74478	74510	a	a	+
+chr3	74642	74674	a	a	+
+chr3	74615	74647	b	b	-
+chr3	74671	74703	a	a	+
+chr3	74681	74713	a	a	+
+chr3	74653	74685	b	b	-
+chr3	74691	74723	a	a	+
+chr3	74694	74726	a	a	+
+chr3	74694	74726	a	a	+
+chr3	74697	74729	a	a	+
+chr3	74665	74697	b	b	-
+chr3	74665	74697	b	b	-
+chr3	74666	74698	b	b	-
+chr3	74699	74731	a	a	+
+chr3	74672	74704	b	b	-
+chr3	74672	74704	b	b	-
+chr3	74673	74705	b	b	-
+chr3	74706	74738	a	a	+
+chr3	74729	74761	b	b	-
+chr3	74808	74840	a	a	+
+chr3	74809	74841	a	a	+
+chr3	74817	74849	a	a	+
+chr3	74785	74817	b	b	-
+chr3	74820	74852	a	a	+
+chr3	74789	74821	b	b	-
+chr3	74853	74885	a	a	+
+chr3	74853	74885	a	a	+
+chr3	74824	74856	b	b	-
+chr3	74827	74859	b	b	-
+chr3	74831	74863	b	b	-
+chr3	74874	74906	a	a	+
+chr3	74843	74875	b	b	-
+chr3	74876	74908	a	a	+
+chr3	74880	74912	a	a	+
+chr3	74851	74883	b	b	-
+chr3	74851	74883	b	b	-
+chr3	74852	74884	b	b	-
+chr3	74886	74918	a	a	+
+chr3	74866	74898	b	b	-
+chr3	74924	74956	a	a	+
+chr3	75021	75053	a	a	+
+chr3	75031	75063	a	a	+
+chr3	75060	75092	a	a	+
+chr3	75031	75063	b	b	-
+chr3	75061	75093	b	b	-
+chr3	75147	75179	b	b	-
+chr3	75155	75187	b	b	-
+chr3	75192	75224	a	a	+
+chr3	75175	75207	b	b	-
+chr3	75180	75212	b	b	-
+chr3	75328	75360	a	a	+
+chr3	75330	75362	b	b	-
+chr3	75363	75395	a	a	+
+chr3	75335	75367	b	b	-
+chr3	75377	75409	a	a	+
+chr3	75351	75383	b	b	-
+chr3	75385	75417	a	a	+
+chr3	75354	75386	b	b	-
+chr3	75395	75427	a	a	+
+chr3	75395	75427	a	a	+
+chr3	75395	75427	a	a	+
+chr3	75395	75427	a	a	+
+chr3	75372	75404	b	b	-
+chr3	75405	75437	a	a	+
+chr3	75405	75437	a	a	+
+chr3	75412	75444	a	a	+
+chr3	75572	75604	a	a	+
+chr3	75549	75581	b	b	-
+chr3	75564	75596	b	b	-
+chr3	75605	75637	a	a	+
+chr3	75606	75638	a	a	+
+chr3	75628	75660	a	a	+
+chr3	75628	75660	a	a	+
+chr3	75628	75660	a	a	+
+chr3	75631	75663	a	a	+
+chr3	75605	75637	b	b	-
+chr3	75687	75719	b	b	-
+chr3	75687	75719	b	b	-
+chr3	75709	75741	b	b	-
+chr3	75713	75745	b	b	-
+chr3	75717	75749	b	b	-
+chr3	75724	75756	b	b	-
+chr3	75724	75756	b	b	-
+chr3	75724	75756	b	b	-
+chr3	75726	75758	b	b	-
+chr3	75726	75758	b	b	-
+chr3	75726	75758	b	b	-
+chr3	75726	75758	b	b	-
+chr3	75726	75758	b	b	-
+chr3	75726	75758	b	b	-
+chr3	75726	75758	b	b	-
+chr3	75726	75758	b	b	-
+chr3	75760	75792	a	a	+
+chr3	75728	75760	b	b	-
+chr3	75730	75762	b	b	-
+chr3	75731	75763	b	b	-
+chr3	75767	75799	a	a	+
+chr3	75741	75773	b	b	-
+chr3	75774	75806	a	a	+
+chr3	75774	75806	a	a	+
+chr3	75774	75806	a	a	+
+chr3	75774	75806	a	a	+
+chr3	75774	75806	a	a	+
+chr3	75742	75774	b	b	-
+chr3	75742	75774	b	b	-
+chr3	75775	75807	a	a	+
+chr3	75775	75807	a	a	+
+chr3	75775	75807	a	a	+
+chr3	75776	75808	a	a	+
+chr3	75776	75808	a	a	+
+chr3	75776	75808	a	a	+
+chr3	75776	75808	a	a	+
+chr3	75776	75808	a	a	+
+chr3	75744	75776	b	b	-
+chr3	75781	75813	a	a	+
+chr3	75784	75816	a	a	+
+chr3	75784	75816	a	a	+
+chr3	75764	75796	b	b	-
+chr3	75775	75807	b	b	-
+chr3	75776	75808	b	b	-
+chr3	75776	75808	b	b	-
+chr3	75813	75845	b	b	-
+chr3	75857	75889	a	a	+
+chr3	76037	76069	a	a	+
+chr3	76037	76069	a	a	+
+chr3	76037	76069	a	a	+
+chr3	76007	76039	b	b	-
+chr3	76042	76074	a	a	+
+chr3	76055	76087	b	b	-
+chr3	76192	76224	b	b	-
+chr3	76560	76592	b	b	-
+chr3	76572	76604	b	b	-
+chr3	76676	76708	b	b	-
+chr3	76726	76758	b	b	-
+chr3	77008	77040	a	a	+
+chr3	76976	77008	b	b	-
+chr3	77042	77074	a	a	+
+chr3	77042	77074	a	a	+
+chr3	77143	77175	b	b	-
+chr3	77206	77238	a	a	+
+chr3	77279	77311	b	b	-
+chr3	77343	77375	a	a	+
+chr3	77378	77410	a	a	+
+chr3	77491	77523	a	a	+
+chr3	77491	77523	a	a	+
+chr3	77460	77492	b	b	-
+chr3	77503	77535	a	a	+
+chr3	77504	77536	a	a	+
+chr3	77507	77539	a	a	+
+chr3	77477	77509	b	b	-
+chr3	77480	77512	b	b	-
+chr3	77480	77512	b	b	-
+chr3	77480	77512	b	b	-
+chr3	77481	77513	b	b	-
+chr3	77514	77546	a	a	+
+chr3	77516	77548	a	a	+
+chr3	77516	77548	a	a	+
+chr3	77488	77520	b	b	-
+chr3	77490	77522	b	b	-
+chr3	77528	77560	a	a	+
+chr3	77532	77564	a	a	+
+chr3	77519	77551	b	b	-
+chr3	77519	77551	b	b	-
+chr3	77550	77582	b	b	-
+chr3	77583	77615	a	a	+
+chr3	77569	77601	b	b	-
+chr3	77644	77676	a	a	+
+chr3	77711	77743	a	a	+
+chr3	77715	77747	b	b	-
+chr3	77764	77796	a	a	+
+chr3	77752	77784	b	b	-
+chr3	77752	77784	b	b	-
+chr3	77793	77825	a	a	+
+chr3	77841	77873	a	a	+
+chr3	77813	77845	b	b	-
+chr3	77813	77845	b	b	-
+chr3	77938	77970	b	b	-
+chr3	78059	78091	a	a	+
+chr3	78852	78884	a	a	+
+chr3	78853	78885	a	a	+
+chr3	79050	79082	a	a	+
+chr3	79036	79068	b	b	-
+chr3	79054	79086	b	b	-
+chr3	79069	79101	b	b	-
+chr3	79107	79139	a	a	+
+chr3	79082	79114	b	b	-
+chr3	79082	79114	b	b	-
+chr3	79082	79114	b	b	-
+chr3	79124	79156	a	a	+
+chr3	79124	79156	a	a	+
+chr3	79124	79156	a	a	+
+chr3	79124	79156	a	a	+
+chr3	79092	79124	b	b	-
+chr3	79092	79124	b	b	-
+chr3	79092	79124	b	b	-
+chr3	79092	79124	b	b	-
+chr3	79092	79124	b	b	-
+chr3	79092	79124	b	b	-
+chr3	79092	79124	b	b	-
+chr3	79092	79124	b	b	-
+chr3	79125	79157	a	a	+
+chr3	79125	79157	a	a	+
+chr3	79129	79161	a	a	+
+chr3	79129	79161	a	a	+
+chr3	79129	79161	a	a	+
+chr3	79132	79164	a	a	+
+chr3	79102	79134	b	b	-
+chr3	79104	79136	b	b	-
+chr3	79104	79136	b	b	-
+chr3	79139	79171	a	a	+
+chr3	79107	79139	b	b	-
+chr3	79107	79139	b	b	-
+chr3	79107	79139	b	b	-
+chr3	79107	79139	b	b	-
+chr3	79140	79172	a	a	+
+chr3	79140	79172	a	a	+
+chr3	79140	79172	a	a	+
+chr3	79140	79172	a	a	+
+chr3	79108	79140	b	b	-
+chr3	79147	79179	a	a	+
+chr3	79117	79149	b	b	-
+chr3	79119	79151	b	b	-
+chr3	79272	79304	a	a	+
+chr3	79270	79302	b	b	-
+chr3	79314	79346	a	a	+
+chr3	79286	79318	b	b	-
+chr3	79286	79318	b	b	-
+chr3	79345	79377	a	a	+
+chr3	79444	79476	b	b	-
+chr3	79497	79529	a	a	+
+chr3	79605	79637	a	a	+
+chr3	79634	79666	a	a	+
+chr3	79655	79687	a	a	+
+chr3	79628	79660	b	b	-
+chr3	79751	79783	b	b	-
+chr3	79917	79949	b	b	-
+chr3	79976	80008	b	b	-
+chr3	80075	80107	a	a	+
+chr3	80072	80104	b	b	-
+chr3	80120	80152	b	b	-
+chr3	80157	80189	a	a	+
+chr3	80400	80432	b	b	-
+chr3	80453	80485	a	a	+
+chr3	80735	80767	b	b	-
+chr3	80735	80767	b	b	-
+chr3	80967	80999	b	b	-
+chr3	80991	81023	b	b	-
+chr3	81010	81042	b	b	-
+chr3	81160	81192	a	a	+
+chr3	81135	81167	b	b	-
+chr3	81327	81359	a	a	+
+chr3	81375	81407	b	b	-
+chr3	81436	81468	a	a	+
+chr3	81478	81510	b	b	-
+chr3	81597	81629	a	a	+
+chr3	81597	81629	a	a	+
+chr3	81650	81682	b	b	-
+chr3	81684	81716	a	a	+
+chr3	81793	81825	b	b	-
+chr3	81804	81836	b	b	-
+chr3	81829	81861	b	b	-
+chr3	81896	81928	b	b	-
+chr3	81896	81928	b	b	-
+chr3	81953	81985	b	b	-
+chr3	82077	82109	b	b	-
+chr3	82297	82329	a	a	+
+chr3	82689	82721	b	b	-
+chr3	82692	82724	b	b	-
+chr3	82693	82725	b	b	-
+chr3	82697	82729	b	b	-
+chr3	82697	82729	b	b	-
+chr3	82717	82749	b	b	-
+chr3	82717	82749	b	b	-
+chr3	82727	82759	b	b	-
+chr3	82728	82760	b	b	-
+chr3	82728	82760	b	b	-
+chr3	82729	82761	b	b	-
+chr3	82732	82764	b	b	-
+chr3	82732	82764	b	b	-
+chr3	82732	82764	b	b	-
+chr3	82733	82765	b	b	-
+chr3	82733	82765	b	b	-
+chr3	82733	82765	b	b	-
+chr3	82733	82765	b	b	-
+chr3	82733	82765	b	b	-
+chr3	82733	82765	b	b	-
+chr3	82773	82805	a	a	+
+chr3	82773	82805	a	a	+
+chr3	82773	82805	a	a	+
+chr3	82773	82805	a	a	+
+chr3	82773	82805	a	a	+
+chr3	82776	82808	a	a	+
+chr3	82744	82776	b	b	-
+chr3	82745	82777	b	b	-
+chr3	82747	82779	b	b	-
+chr3	82747	82779	b	b	-
+chr3	82748	82780	b	b	-
+chr3	82751	82783	b	b	-
+chr3	82751	82783	b	b	-
+chr3	82751	82783	b	b	-
+chr3	82751	82783	b	b	-
+chr3	82751	82783	b	b	-
+chr3	82787	82819	a	a	+
+chr3	82794	82826	a	a	+
+chr3	82797	82829	a	a	+
+chr3	82767	82799	b	b	-
+chr3	82769	82801	b	b	-
+chr3	82807	82839	a	a	+
+chr3	82817	82849	a	a	+
+chr3	82819	82851	a	a	+
+chr3	82827	82859	a	a	+
+chr3	82795	82827	b	b	-
+chr3	82795	82827	b	b	-
+chr3	82796	82828	b	b	-
+chr3	82829	82861	a	a	+
+chr3	82829	82861	a	a	+
+chr3	82797	82829	b	b	-
+chr3	82835	82867	a	a	+
+chr3	82803	82835	b	b	-
+chr3	82803	82835	b	b	-
+chr3	82836	82868	a	a	+
+chr3	82818	82850	b	b	-
+chr3	82824	82856	b	b	-
+chr3	82825	82857	b	b	-
+chr3	82825	82857	b	b	-
+chr3	82829	82861	b	b	-
+chr3	82829	82861	b	b	-
+chr3	82830	82862	b	b	-
+chr3	82863	82895	a	a	+
+chr3	82851	82883	b	b	-
+chr3	82851	82883	b	b	-
+chr3	82851	82883	b	b	-
+chr3	82884	82916	a	a	+
+chr3	82853	82885	b	b	-
+chr3	82862	82894	b	b	-
+chr3	82863	82895	b	b	-
+chr3	82864	82896	b	b	-
+chr3	82875	82907	b	b	-
+chr3	82881	82913	b	b	-
+chr3	82934	82966	a	a	+
+chr3	82908	82940	b	b	-
+chr3	82943	82975	a	a	+
+chr3	82911	82943	b	b	-
+chr3	82944	82976	a	a	+
+chr3	82945	82977	a	a	+
+chr3	82945	82977	a	a	+
+chr3	82945	82977	a	a	+
+chr3	82913	82945	b	b	-
+chr3	82919	82951	b	b	-
+chr3	82919	82951	b	b	-
+chr3	82953	82985	a	a	+
+chr3	82953	82985	a	a	+
+chr3	82924	82956	b	b	-
+chr3	82924	82956	b	b	-
+chr3	82924	82956	b	b	-
+chr3	82924	82956	b	b	-
+chr3	82924	82956	b	b	-
+chr3	82959	82991	a	a	+
+chr3	82961	82993	a	a	+
+chr3	82931	82963	b	b	-
+chr3	82932	82964	b	b	-
+chr3	82932	82964	b	b	-
+chr3	82932	82964	b	b	-
+chr3	82932	82964	b	b	-
+chr3	82965	82997	a	a	+
+chr3	82969	83001	a	a	+
+chr3	82971	83003	a	a	+
+chr3	82973	83005	a	a	+
+chr3	82974	83006	a	a	+
+chr3	82975	83007	a	a	+
+chr3	82977	83009	a	a	+
+chr3	82978	83010	a	a	+
+chr3	82982	83014	a	a	+
+chr3	82985	83017	a	a	+
+chr3	82986	83018	a	a	+
+chr3	82986	83018	a	a	+
+chr3	82986	83018	a	a	+
+chr3	82986	83018	a	a	+
+chr3	82986	83018	a	a	+
+chr3	82986	83018	a	a	+
+chr3	82986	83018	a	a	+
+chr3	82986	83018	a	a	+
+chr3	82986	83018	a	a	+
+chr3	82986	83018	a	a	+
+chr3	82986	83018	a	a	+
+chr3	82986	83018	a	a	+
+chr3	82986	83018	a	a	+
+chr3	82986	83018	a	a	+
+chr3	82986	83018	a	a	+
+chr3	82986	83018	a	a	+
+chr3	82986	83018	a	a	+
+chr3	82987	83019	a	a	+
+chr3	82987	83019	a	a	+
+chr3	82987	83019	a	a	+
+chr3	82987	83019	a	a	+
+chr3	82987	83019	a	a	+
+chr3	82989	83021	a	a	+
+chr3	82990	83022	a	a	+
+chr3	82990	83022	a	a	+
+chr3	82990	83022	a	a	+
+chr3	82992	83024	a	a	+
+chr3	82995	83027	a	a	+
+chr3	82996	83028	a	a	+
+chr3	82996	83028	a	a	+
+chr3	82999	83031	a	a	+
+chr3	83000	83032	a	a	+
+chr3	83000	83032	a	a	+
+chr3	83000	83032	a	a	+
+chr3	83003	83035	a	a	+
+chr3	83004	83036	a	a	+
+chr3	83010	83042	a	a	+
+chr3	83011	83043	a	a	+
+chr3	83011	83043	a	a	+
+chr3	83012	83044	a	a	+
+chr3	83016	83048	a	a	+
+chr3	83016	83048	a	a	+
+chr3	83044	83076	b	b	-
+chr3	83044	83076	b	b	-
+chr3	83047	83079	b	b	-
+chr3	83047	83079	b	b	-
+chr3	83047	83079	b	b	-
+chr3	83056	83088	b	b	-
+chr3	83057	83089	b	b	-
+chr3	83060	83092	b	b	-
+chr3	83060	83092	b	b	-
+chr3	83061	83093	b	b	-
+chr3	83064	83096	b	b	-
+chr3	83070	83102	b	b	-
+chr3	83070	83102	b	b	-
+chr3	83070	83102	b	b	-
+chr3	83071	83103	b	b	-
+chr3	83072	83104	b	b	-
+chr3	83072	83104	b	b	-
+chr3	83072	83104	b	b	-
+chr3	83072	83104	b	b	-
+chr3	83072	83104	b	b	-
+chr3	83072	83104	b	b	-
+chr3	83072	83104	b	b	-
+chr3	83072	83104	b	b	-
+chr3	83072	83104	b	b	-
+chr3	83072	83104	b	b	-
+chr3	83072	83104	b	b	-
+chr3	83072	83104	b	b	-
+chr3	83072	83104	b	b	-
+chr3	83072	83104	b	b	-
+chr3	83085	83117	b	b	-
+chr3	83085	83117	b	b	-
+chr3	83127	83159	a	a	+
+chr3	83128	83160	a	a	+
+chr3	83135	83167	a	a	+
+chr3	83135	83167	a	a	+
+chr3	83135	83167	a	a	+
+chr3	83135	83167	a	a	+
+chr3	83135	83167	a	a	+
+chr3	83140	83172	a	a	+
+chr3	83140	83172	a	a	+
+chr3	83148	83180	a	a	+
+chr3	83275	83307	a	a	+
+chr3	83466	83498	a	a	+
+chr3	83448	83480	b	b	-
+chr3	83498	83530	a	a	+
+chr3	83508	83540	b	b	-
+chr3	83553	83585	b	b	-
+chr3	83607	83639	a	a	+
+chr3	83619	83651	a	a	+
+chr3	83605	83637	b	b	-
+chr3	83639	83671	a	a	+
+chr3	83639	83671	a	a	+
+chr3	83652	83684	a	a	+
+chr3	83668	83700	a	a	+
+chr3	83663	83695	b	b	-
+chr3	83701	83733	a	a	+
+chr3	83808	83840	a	a	+
+chr3	83818	83850	a	a	+
+chr3	83836	83868	a	a	+
+chr3	83837	83869	a	a	+
+chr3	83837	83869	a	a	+
+chr3	83806	83838	b	b	-
+chr3	83806	83838	b	b	-
+chr3	83808	83840	b	b	-
+chr3	83809	83841	b	b	-
+chr3	83809	83841	b	b	-
+chr3	83949	83981	b	b	-
+chr3	83951	83983	b	b	-
+chr3	83951	83983	b	b	-
+chr3	83955	83987	b	b	-
+chr3	83994	84026	a	a	+
+chr3	84058	84090	b	b	-
+chr3	84061	84093	b	b	-
+chr3	84062	84094	b	b	-
+chr3	84066	84098	b	b	-
+chr3	84066	84098	b	b	-
+chr3	84086	84118	b	b	-
+chr3	84096	84128	b	b	-
+chr3	84097	84129	b	b	-
+chr3	84098	84130	b	b	-
+chr3	84101	84133	b	b	-
+chr3	84102	84134	b	b	-
+chr3	84102	84134	b	b	-
+chr3	84102	84134	b	b	-
+chr3	84102	84134	b	b	-
+chr3	84102	84134	b	b	-
+chr3	84141	84173	a	a	+
+chr3	84141	84173	a	a	+
+chr3	84141	84173	a	a	+
+chr3	84142	84174	a	a	+
+chr3	84142	84174	a	a	+
+chr3	84142	84174	a	a	+
+chr3	84142	84174	a	a	+
+chr3	84112	84144	b	b	-
+chr3	84145	84177	a	a	+
+chr3	84113	84145	b	b	-
+chr3	84114	84146	b	b	-
+chr3	84116	84148	b	b	-
+chr3	84116	84148	b	b	-
+chr3	84117	84149	b	b	-
+chr3	84120	84152	b	b	-
+chr3	84120	84152	b	b	-
+chr3	84120	84152	b	b	-
+chr3	84120	84152	b	b	-
+chr3	84120	84152	b	b	-
+chr3	84156	84188	a	a	+
+chr3	84163	84195	a	a	+
+chr3	84166	84198	a	a	+
+chr3	84143	84175	b	b	-
+chr3	84176	84208	a	a	+
+chr3	84146	84178	b	b	-
+chr3	84183	84215	a	a	+
+chr3	84155	84187	b	b	-
+chr3	84188	84220	a	a	+
+chr3	84158	84190	b	b	-
+chr3	84159	84191	b	b	-
+chr3	84196	84228	a	a	+
+chr3	84198	84230	a	a	+
+chr3	84204	84236	a	a	+
+chr3	84205	84237	a	a	+
+chr3	84177	84209	b	b	-
+chr3	84238	84270	a	a	+
+chr3	84238	84270	a	a	+
+chr3	84284	84316	b	b	-
+chr3	84287	84319	b	b	-
+chr3	84288	84320	b	b	-
+chr3	84292	84324	b	b	-
+chr3	84292	84324	b	b	-
+chr3	84312	84344	b	b	-
+chr3	84322	84354	b	b	-
+chr3	84323	84355	b	b	-
+chr3	84323	84355	b	b	-
+chr3	84324	84356	b	b	-
+chr3	84327	84359	b	b	-
+chr3	84327	84359	b	b	-
+chr3	84327	84359	b	b	-
+chr3	84328	84360	b	b	-
+chr3	84328	84360	b	b	-
+chr3	84328	84360	b	b	-
+chr3	84328	84360	b	b	-
+chr3	84328	84360	b	b	-
+chr3	84328	84360	b	b	-
+chr3	84367	84399	a	a	+
+chr3	84368	84400	a	a	+
+chr3	84368	84400	a	a	+
+chr3	84368	84400	a	a	+
+chr3	84368	84400	a	a	+
+chr3	84368	84400	a	a	+
+chr3	84371	84403	a	a	+
+chr3	84339	84371	b	b	-
+chr3	84340	84372	b	b	-
+chr3	84342	84374	b	b	-
+chr3	84342	84374	b	b	-
+chr3	84343	84375	b	b	-
+chr3	84346	84378	b	b	-
+chr3	84346	84378	b	b	-
+chr3	84346	84378	b	b	-
+chr3	84346	84378	b	b	-
+chr3	84346	84378	b	b	-
+chr3	84382	84414	a	a	+
+chr3	84389	84421	a	a	+
+chr3	84392	84424	a	a	+
+chr3	84369	84401	b	b	-
+chr3	84402	84434	a	a	+
+chr3	84372	84404	b	b	-
+chr3	84409	84441	a	a	+
+chr3	84381	84413	b	b	-
+chr3	84414	84446	a	a	+
+chr3	84384	84416	b	b	-
+chr3	84385	84417	b	b	-
+chr3	84422	84454	a	a	+
+chr3	84424	84456	a	a	+
+chr3	84424	84456	a	a	+
+chr3	84430	84462	a	a	+
+chr3	84431	84463	a	a	+
+chr3	84403	84435	b	b	-
+chr3	84464	84496	a	a	+
+chr3	84464	84496	a	a	+
+chr3	84478	84510	a	a	+
+chr3	84459	84491	b	b	-
+chr3	84513	84545	a	a	+
+chr3	84491	84523	b	b	-
+chr3	84498	84530	b	b	-
+chr3	84507	84539	b	b	-
+chr3	84507	84539	b	b	-
+chr3	84516	84548	b	b	-
+chr3	84521	84553	b	b	-
+chr3	84558	84590	a	a	+
+chr3	84558	84590	a	a	+
+chr3	84565	84597	a	a	+
+chr3	84565	84597	a	a	+
+chr3	84569	84601	a	a	+
+chr3	84569	84601	a	a	+
+chr3	84569	84601	a	a	+
+chr3	84572	84604	a	a	+
+chr3	84573	84605	a	a	+
+chr3	84575	84607	a	a	+
+chr3	84575	84607	a	a	+
+chr3	84575	84607	a	a	+
+chr3	84577	84609	a	a	+
+chr3	84577	84609	a	a	+
+chr3	84577	84609	a	a	+
+chr3	84577	84609	a	a	+
+chr3	84577	84609	a	a	+
+chr3	84578	84610	a	a	+
+chr3	84578	84610	a	a	+
+chr3	84578	84610	a	a	+
+chr3	84578	84610	a	a	+
+chr3	84578	84610	a	a	+
+chr3	84578	84610	a	a	+
+chr3	84578	84610	a	a	+
+chr3	84578	84610	a	a	+
+chr3	84578	84610	a	a	+
+chr3	84579	84611	a	a	+
+chr3	84547	84579	b	b	-
+chr3	84580	84612	a	a	+
+chr3	84581	84613	a	a	+
+chr3	84582	84614	a	a	+
+chr3	84591	84623	a	a	+
+chr3	84597	84629	a	a	+
+chr3	84602	84634	a	a	+
+chr3	84650	84682	b	b	-
+chr3	84707	84739	a	a	+
+chr3	84707	84739	a	a	+
+chr3	84756	84788	a	a	+
+chr3	84758	84790	a	a	+
+chr3	84800	84832	b	b	-
+chr3	84803	84835	b	b	-
+chr3	84804	84836	b	b	-
+chr3	84808	84840	b	b	-
+chr3	84808	84840	b	b	-
+chr3	84828	84860	b	b	-
+chr3	84838	84870	b	b	-
+chr3	84839	84871	b	b	-
+chr3	84839	84871	b	b	-
+chr3	84840	84872	b	b	-
+chr3	84843	84875	b	b	-
+chr3	84843	84875	b	b	-
+chr3	84843	84875	b	b	-
+chr3	84844	84876	b	b	-
+chr3	84844	84876	b	b	-
+chr3	84844	84876	b	b	-
+chr3	84844	84876	b	b	-
+chr3	84844	84876	b	b	-
+chr3	84844	84876	b	b	-
+chr3	84884	84916	a	a	+
+chr3	84884	84916	a	a	+
+chr3	84884	84916	a	a	+
+chr3	84884	84916	a	a	+
+chr3	84884	84916	a	a	+
+chr3	84884	84916	a	a	+
+chr3	84887	84919	a	a	+
+chr3	84855	84887	b	b	-
+chr3	84856	84888	b	b	-
+chr3	84858	84890	b	b	-
+chr3	84858	84890	b	b	-
+chr3	84859	84891	b	b	-
+chr3	84862	84894	b	b	-
+chr3	84862	84894	b	b	-
+chr3	84862	84894	b	b	-
+chr3	84862	84894	b	b	-
+chr3	84862	84894	b	b	-
+chr3	84898	84930	a	a	+
+chr3	84905	84937	a	a	+
+chr3	84908	84940	a	a	+
+chr3	84885	84917	b	b	-
+chr3	84918	84950	a	a	+
+chr3	84888	84920	b	b	-
+chr3	84925	84957	a	a	+
+chr3	84897	84929	b	b	-
+chr3	84930	84962	a	a	+
+chr3	84900	84932	b	b	-
+chr3	84901	84933	b	b	-
+chr3	84938	84970	a	a	+
+chr3	84940	84972	a	a	+
+chr3	84940	84972	a	a	+
+chr3	84946	84978	a	a	+
+chr3	84947	84979	a	a	+
+chr3	84919	84951	b	b	-
+chr3	84980	85012	a	a	+
+chr3	84980	85012	a	a	+
+chr3	84975	85007	b	b	-
+chr3	85029	85061	a	a	+
+chr3	85007	85039	b	b	-
+chr3	85014	85046	b	b	-
+chr3	85023	85055	b	b	-
+chr3	85023	85055	b	b	-
+chr3	85034	85066	b	b	-
+chr3	85037	85069	b	b	-
+chr3	85074	85106	a	a	+
+chr3	85074	85106	a	a	+
+chr3	85081	85113	a	a	+
+chr3	85081	85113	a	a	+
+chr3	85081	85113	a	a	+
+chr3	85049	85081	b	b	-
+chr3	85085	85117	a	a	+
+chr3	85085	85117	a	a	+
+chr3	85088	85120	a	a	+
+chr3	85089	85121	a	a	+
+chr3	85091	85123	a	a	+
+chr3	85091	85123	a	a	+
+chr3	85091	85123	a	a	+
+chr3	85093	85125	a	a	+
+chr3	85093	85125	a	a	+
+chr3	85093	85125	a	a	+
+chr3	85093	85125	a	a	+
+chr3	85093	85125	a	a	+
+chr3	85094	85126	a	a	+
+chr3	85094	85126	a	a	+
+chr3	85094	85126	a	a	+
+chr3	85094	85126	a	a	+
+chr3	85094	85126	a	a	+
+chr3	85094	85126	a	a	+
+chr3	85094	85126	a	a	+
+chr3	85094	85126	a	a	+
+chr3	85094	85126	a	a	+
+chr3	85062	85094	b	b	-
+chr3	85095	85127	a	a	+
+chr3	85096	85128	a	a	+
+chr3	85097	85129	a	a	+
+chr3	85065	85097	b	b	-
+chr3	85065	85097	b	b	-
+chr3	85098	85130	a	a	+
+chr3	85107	85139	a	a	+
+chr3	85075	85107	b	b	-
+chr3	85077	85109	b	b	-
+chr3	85077	85109	b	b	-
+chr3	85077	85109	b	b	-
+chr3	85077	85109	b	b	-
+chr3	85113	85145	a	a	+
+chr3	85118	85150	a	a	+
+chr3	85119	85151	a	a	+
+chr3	85124	85156	a	a	+
+chr3	85093	85125	b	b	-
+chr3	85093	85125	b	b	-
+chr3	85093	85125	b	b	-
+chr3	85094	85126	b	b	-
+chr3	85094	85126	b	b	-
+chr3	85095	85127	b	b	-
+chr3	85101	85133	b	b	-
+chr3	85101	85133	b	b	-
+chr3	85111	85143	b	b	-
+chr3	85111	85143	b	b	-
+chr3	85112	85144	b	b	-
+chr3	85148	85180	a	a	+
+chr3	85149	85181	a	a	+
+chr3	85150	85182	a	a	+
+chr3	85150	85182	a	a	+
+chr3	85121	85153	b	b	-
+chr3	85127	85159	b	b	-
+chr3	85140	85172	b	b	-
+chr3	85140	85172	b	b	-
+chr3	85174	85206	a	a	+
+chr3	85174	85206	a	a	+
+chr3	85174	85206	a	a	+
+chr3	85174	85206	a	a	+
+chr3	85175	85207	a	a	+
+chr3	85145	85177	b	b	-
+chr3	85145	85177	b	b	-
+chr3	85145	85177	b	b	-
+chr3	85147	85179	b	b	-
+chr3	85180	85212	a	a	+
+chr3	85181	85213	a	a	+
+chr3	85181	85213	a	a	+
Index: /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/testdata/short-good-input.gtrack
===================================================================
--- /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/testdata/short-good-input.gtrack (revision 3)
+++ /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/testdata/short-good-input.gtrack (revision 3)
@@ -0,0 +1,30106 @@
+#
+# this is the internal genetrack internal file format 
+#
+# optimized for the highest possibly throughput
+#
+# it starts with comment lines that are ignored then a header
+#
+# no comments are allowed once the data starts
+#
+chrom	index	forward	reverse	value
+chr1	146	0.0	1.0	1.0
+chr1	254	0.0	3.0	3.0
+chr1	319	0.0	1.0	1.0
+chr1	328	0.0	1.0	1.0
+chr1	330	0.0	1.0	1.0
+chr1	339	0.0	1.0	1.0
+chr1	341	1.0	0.0	1.0
+chr1	342	1.0	0.0	1.0
+chr1	345	0.0	1.0	1.0
+chr1	362	1.0	0.0	1.0
+chr1	363	1.0	0.0	1.0
+chr1	365	1.0	0.0	1.0
+chr1	367	0.0	1.0	1.0
+chr1	369	0.0	2.0	2.0
+chr1	370	1.0	0.0	1.0
+chr1	371	3.0	0.0	3.0
+chr1	372	0.0	2.0	2.0
+chr1	379	1.0	0.0	1.0
+chr1	385	2.0	1.0	3.0
+chr1	395	0.0	1.0	1.0
+chr1	402	0.0	3.0	3.0
+chr1	403	1.0	0.0	1.0
+chr1	411	0.0	1.0	1.0
+chr1	419	0.0	1.0	1.0
+chr1	427	0.0	1.0	1.0
+chr1	432	2.0	0.0	2.0
+chr1	434	1.0	0.0	1.0
+chr1	443	0.0	1.0	1.0
+chr1	587	0.0	1.0	1.0
+chr1	593	0.0	1.0	1.0
+chr1	596	1.0	0.0	1.0
+chr1	607	0.0	1.0	1.0
+chr1	611	1.0	0.0	1.0
+chr1	612	1.0	0.0	1.0
+chr1	613	0.0	1.0	1.0
+chr1	614	2.0	0.0	2.0
+chr1	620	1.0	0.0	1.0
+chr1	623	2.0	0.0	2.0
+chr1	627	0.0	4.0	4.0
+chr1	629	3.0	0.0	3.0
+chr1	632	0.0	1.0	1.0
+chr1	638	1.0	0.0	1.0
+chr1	639	1.0	0.0	1.0
+chr1	641	0.0	1.0	1.0
+chr1	861	0.0	1.0	1.0
+chr1	931	1.0	0.0	1.0
+chr1	1091	1.0	0.0	1.0
+chr1	1180	1.0	0.0	1.0
+chr1	1307	0.0	1.0	1.0
+chr1	1337	2.0	0.0	2.0
+chr1	1349	0.0	1.0	1.0
+chr1	1516	1.0	0.0	1.0
+chr1	1559	1.0	0.0	1.0
+chr1	1589	0.0	2.0	2.0
+chr1	1596	0.0	1.0	1.0
+chr1	1605	0.0	1.0	1.0
+chr1	1607	1.0	0.0	1.0
+chr1	1644	1.0	0.0	1.0
+chr1	1836	0.0	1.0	1.0
+chr1	1842	0.0	2.0	2.0
+chr1	1844	0.0	1.0	1.0
+chr1	1849	0.0	1.0	1.0
+chr1	1858	0.0	1.0	1.0
+chr1	1868	0.0	1.0	1.0
+chr1	1869	6.0	0.0	6.0
+chr1	1870	0.0	1.0	1.0
+chr1	1871	0.0	1.0	1.0
+chr1	1875	2.0	0.0	2.0
+chr1	1879	3.0	5.0	8.0
+chr1	1880	0.0	4.0	4.0
+chr1	1882	0.0	1.0	1.0
+chr1	1885	0.0	2.0	2.0
+chr1	1886	4.0	1.0	5.0
+chr1	1889	2.0	4.0	6.0
+chr1	1890	2.0	0.0	2.0
+chr1	1892	2.0	0.0	2.0
+chr1	1893	0.0	2.0	2.0
+chr1	1894	1.0	1.0	2.0
+chr1	1895	0.0	2.0	2.0
+chr1	1896	0.0	1.0	1.0
+chr1	1897	1.0	1.0	2.0
+chr1	1898	0.0	3.0	3.0
+chr1	1899	0.0	6.0	6.0
+chr1	1900	0.0	1.0	1.0
+chr1	1901	3.0	0.0	3.0
+chr1	1902	0.0	1.0	1.0
+chr1	1904	0.0	1.0	1.0
+chr1	1908	1.0	0.0	1.0
+chr1	1909	1.0	0.0	1.0
+chr1	1910	0.0	1.0	1.0
+chr1	1915	0.0	1.0	1.0
+chr1	1916	1.0	1.0	2.0
+chr1	1917	0.0	1.0	1.0
+chr1	1920	0.0	1.0	1.0
+chr1	1921	2.0	0.0	2.0
+chr1	1925	0.0	1.0	1.0
+chr1	1926	1.0	0.0	1.0
+chr1	1927	1.0	0.0	1.0
+chr1	1936	0.0	1.0	1.0
+chr1	1939	0.0	1.0	1.0
+chr1	1940	0.0	1.0	1.0
+chr1	1942	0.0	1.0	1.0
+chr1	1949	0.0	1.0	1.0
+chr1	1959	1.0	0.0	1.0
+chr1	1973	1.0	2.0	3.0
+chr1	1983	1.0	0.0	1.0
+chr1	1999	0.0	2.0	2.0
+chr1	2001	1.0	0.0	1.0
+chr1	2010	2.0	0.0	2.0
+chr1	2011	2.0	0.0	2.0
+chr1	2018	0.0	1.0	1.0
+chr1	2019	0.0	1.0	1.0
+chr1	2025	1.0	0.0	1.0
+chr1	2026	2.0	0.0	2.0
+chr1	2029	1.0	0.0	1.0
+chr1	2032	1.0	0.0	1.0
+chr1	2033	1.0	0.0	1.0
+chr1	2034	3.0	0.0	3.0
+chr1	2042	1.0	0.0	1.0
+chr1	2052	8.0	0.0	8.0
+chr1	2054	1.0	0.0	1.0
+chr1	2060	0.0	1.0	1.0
+chr1	2063	2.0	0.0	2.0
+chr1	2066	3.0	0.0	3.0
+chr1	2069	1.0	0.0	1.0
+chr1	2072	0.0	1.0	1.0
+chr1	2076	1.0	1.0	2.0
+chr1	2082	0.0	1.0	1.0
+chr1	2085	0.0	3.0	3.0
+chr1	2086	0.0	1.0	1.0
+chr1	2090	1.0	0.0	1.0
+chr1	2095	0.0	3.0	3.0
+chr1	2096	3.0	0.0	3.0
+chr1	2101	0.0	1.0	1.0
+chr1	2113	1.0	0.0	1.0
+chr1	2120	1.0	0.0	1.0
+chr1	2123	0.0	1.0	1.0
+chr1	2146	1.0	0.0	1.0
+chr1	2158	1.0	0.0	1.0
+chr1	2192	1.0	0.0	1.0
+chr1	2198	1.0	0.0	1.0
+chr1	2204	0.0	1.0	1.0
+chr1	2209	1.0	0.0	1.0
+chr1	2344	0.0	1.0	1.0
+chr1	2358	0.0	1.0	1.0
+chr1	2361	0.0	5.0	5.0
+chr1	2368	0.0	1.0	1.0
+chr1	2373	0.0	10.0	10.0
+chr1	2383	0.0	2.0	2.0
+chr1	2384	0.0	5.0	5.0
+chr1	2385	0.0	1.0	1.0
+chr1	2389	0.0	1.0	1.0
+chr1	2390	0.0	1.0	1.0
+chr1	2406	0.0	1.0	1.0
+chr1	2412	0.0	1.0	1.0
+chr1	2418	1.0	0.0	1.0
+chr1	2419	1.0	0.0	1.0
+chr1	2563	1.0	0.0	1.0
+chr1	2620	1.0	0.0	1.0
+chr1	2632	1.0	0.0	1.0
+chr1	2634	1.0	0.0	1.0
+chr1	2635	4.0	0.0	4.0
+chr1	2640	0.0	6.0	6.0
+chr1	2644	1.0	0.0	1.0
+chr1	2649	3.0	0.0	3.0
+chr1	2650	1.0	0.0	1.0
+chr1	2651	2.0	0.0	2.0
+chr1	2660	1.0	0.0	1.0
+chr1	2663	2.0	0.0	2.0
+chr1	2668	0.0	2.0	2.0
+chr1	2670	2.0	0.0	2.0
+chr1	2671	4.0	0.0	4.0
+chr1	2673	1.0	1.0	2.0
+chr1	2675	0.0	5.0	5.0
+chr1	2678	1.0	0.0	1.0
+chr1	2681	0.0	1.0	1.0
+chr1	2682	0.0	1.0	1.0
+chr1	2683	0.0	4.0	4.0
+chr1	2688	1.0	0.0	1.0
+chr1	2697	0.0	1.0	1.0
+chr1	2700	1.0	0.0	1.0
+chr1	2702	2.0	0.0	2.0
+chr1	3035	0.0	1.0	1.0
+chr1	3208	1.0	0.0	1.0
+chr1	3327	0.0	1.0	1.0
+chr1	3583	0.0	3.0	3.0
+chr1	3813	1.0	0.0	1.0
+chr1	3915	1.0	0.0	1.0
+chr1	4053	0.0	1.0	1.0
+chr1	4248	0.0	1.0	1.0
+chr1	4296	1.0	0.0	1.0
+chr1	4822	0.0	1.0	1.0
+chr1	4829	1.0	0.0	1.0
+chr1	4914	1.0	0.0	1.0
+chr1	5333	0.0	1.0	1.0
+chr1	5509	1.0	0.0	1.0
+chr1	5513	0.0	1.0	1.0
+chr1	5520	2.0	0.0	2.0
+chr1	5725	0.0	1.0	1.0
+chr1	5748	0.0	1.0	1.0
+chr1	5755	1.0	0.0	1.0
+chr1	5763	0.0	1.0	1.0
+chr1	5776	1.0	0.0	1.0
+chr1	5839	0.0	1.0	1.0
+chr1	5933	1.0	0.0	1.0
+chr1	5954	1.0	0.0	1.0
+chr1	5955	1.0	0.0	1.0
+chr1	5975	0.0	1.0	1.0
+chr1	5996	0.0	1.0	1.0
+chr1	6067	1.0	0.0	1.0
+chr1	6087	0.0	1.0	1.0
+chr1	6129	1.0	0.0	1.0
+chr1	6145	0.0	1.0	1.0
+chr1	6192	0.0	1.0	1.0
+chr1	6194	1.0	0.0	1.0
+chr1	6229	0.0	1.0	1.0
+chr1	6284	1.0	0.0	1.0
+chr1	6285	1.0	0.0	1.0
+chr1	6294	1.0	0.0	1.0
+chr1	6298	2.0	0.0	2.0
+chr1	6306	0.0	1.0	1.0
+chr1	6308	0.0	2.0	2.0
+chr1	6328	0.0	1.0	1.0
+chr1	6344	1.0	0.0	1.0
+chr1	6345	0.0	1.0	1.0
+chr1	6397	1.0	0.0	1.0
+chr1	6572	1.0	0.0	1.0
+chr1	6583	0.0	1.0	1.0
+chr1	6597	1.0	0.0	1.0
+chr1	6601	3.0	0.0	3.0
+chr1	6607	0.0	1.0	1.0
+chr1	6608	1.0	0.0	1.0
+chr1	6640	0.0	1.0	1.0
+chr1	6958	0.0	1.0	1.0
+chr1	7313	1.0	0.0	1.0
+chr1	7341	0.0	1.0	1.0
+chr1	7374	1.0	0.0	1.0
+chr1	7410	1.0	0.0	1.0
+chr1	7436	0.0	1.0	1.0
+chr1	7441	1.0	0.0	1.0
+chr1	7445	0.0	1.0	1.0
+chr1	7458	1.0	0.0	1.0
+chr1	7489	0.0	1.0	1.0
+chr1	7577	0.0	1.0	1.0
+chr1	7593	0.0	1.0	1.0
+chr1	7673	1.0	0.0	1.0
+chr1	7747	1.0	0.0	1.0
+chr1	7791	1.0	0.0	1.0
+chr1	7985	1.0	0.0	1.0
+chr1	8035	1.0	0.0	1.0
+chr1	8080	0.0	1.0	1.0
+chr1	8082	1.0	0.0	1.0
+chr1	8087	0.0	1.0	1.0
+chr1	8094	1.0	0.0	1.0
+chr1	8099	1.0	0.0	1.0
+chr1	8101	1.0	0.0	1.0
+chr1	8103	1.0	0.0	1.0
+chr1	8115	4.0	0.0	4.0
+chr1	8122	1.0	0.0	1.0
+chr1	8285	1.0	0.0	1.0
+chr1	8289	1.0	0.0	1.0
+chr1	8293	1.0	0.0	1.0
+chr1	8308	0.0	1.0	1.0
+chr1	8312	1.0	0.0	1.0
+chr1	8324	0.0	1.0	1.0
+chr1	8325	1.0	0.0	1.0
+chr1	8328	2.0	0.0	2.0
+chr1	8336	1.0	0.0	1.0
+chr1	8356	0.0	2.0	2.0
+chr1	8397	0.0	1.0	1.0
+chr1	8457	2.0	0.0	2.0
+chr1	8464	0.0	1.0	1.0
+chr1	8472	0.0	1.0	1.0
+chr1	8477	1.0	0.0	1.0
+chr1	8496	1.0	0.0	1.0
+chr1	8533	1.0	0.0	1.0
+chr1	8544	0.0	1.0	1.0
+chr1	8706	0.0	1.0	1.0
+chr1	8715	1.0	0.0	1.0
+chr1	8716	1.0	0.0	1.0
+chr1	8761	1.0	0.0	1.0
+chr1	8849	0.0	1.0	1.0
+chr1	8882	0.0	1.0	1.0
+chr1	8906	1.0	0.0	1.0
+chr1	8930	0.0	1.0	1.0
+chr1	8938	0.0	1.0	1.0
+chr1	8943	0.0	1.0	1.0
+chr1	8944	0.0	1.0	1.0
+chr1	8956	1.0	0.0	1.0
+chr1	8998	1.0	0.0	1.0
+chr1	9107	1.0	0.0	1.0
+chr1	9134	1.0	0.0	1.0
+chr1	9152	0.0	1.0	1.0
+chr1	9153	0.0	1.0	1.0
+chr1	9158	1.0	0.0	1.0
+chr1	9179	1.0	0.0	1.0
+chr1	9215	0.0	1.0	1.0
+chr1	9231	0.0	1.0	1.0
+chr1	9246	1.0	0.0	1.0
+chr1	9252	0.0	1.0	1.0
+chr1	9272	1.0	0.0	1.0
+chr1	9329	1.0	0.0	1.0
+chr1	9339	2.0	0.0	2.0
+chr1	9353	0.0	1.0	1.0
+chr1	9358	1.0	0.0	1.0
+chr1	9381	1.0	1.0	2.0
+chr1	9388	0.0	1.0	1.0
+chr1	9394	2.0	0.0	2.0
+chr1	9395	1.0	0.0	1.0
+chr1	9396	0.0	1.0	1.0
+chr1	9401	0.0	1.0	1.0
+chr1	9402	0.0	1.0	1.0
+chr1	9409	1.0	1.0	2.0
+chr1	9422	1.0	0.0	1.0
+chr1	9427	1.0	0.0	1.0
+chr1	9434	0.0	1.0	1.0
+chr1	9435	1.0	0.0	1.0
+chr1	9441	0.0	1.0	1.0
+chr1	9449	0.0	1.0	1.0
+chr1	9450	0.0	1.0	1.0
+chr1	9453	2.0	0.0	2.0
+chr1	9458	0.0	1.0	1.0
+chr1	9466	1.0	0.0	1.0
+chr1	9478	0.0	1.0	1.0
+chr1	9581	1.0	0.0	1.0
+chr1	9595	0.0	1.0	1.0
+chr1	9612	0.0	1.0	1.0
+chr1	9614	2.0	0.0	2.0
+chr1	9641	1.0	0.0	1.0
+chr1	9713	0.0	1.0	1.0
+chr1	9826	1.0	0.0	1.0
+chr1	9940	0.0	2.0	2.0
+chr1	9941	0.0	1.0	1.0
+chr1	9972	0.0	1.0	1.0
+chr1	9974	1.0	0.0	1.0
+chr1	9982	1.0	0.0	1.0
+chr1	10154	1.0	0.0	1.0
+chr1	10403	0.0	2.0	2.0
+chr1	10433	2.0	0.0	2.0
+chr1	10488	1.0	0.0	1.0
+chr1	10514	0.0	1.0	1.0
+chr1	10533	1.0	0.0	1.0
+chr1	10551	0.0	1.0	1.0
+chr1	10560	0.0	1.0	1.0
+chr1	10561	0.0	1.0	1.0
+chr1	10565	1.0	0.0	1.0
+chr1	10575	0.0	1.0	1.0
+chr1	10576	1.0	0.0	1.0
+chr1	10752	1.0	0.0	1.0
+chr1	10764	0.0	2.0	2.0
+chr1	10765	0.0	5.0	5.0
+chr1	10766	0.0	1.0	1.0
+chr1	10813	1.0	0.0	1.0
+chr1	10887	0.0	1.0	1.0
+chr1	10917	2.0	0.0	2.0
+chr1	10935	0.0	1.0	1.0
+chr1	10937	2.0	0.0	2.0
+chr1	10951	0.0	2.0	2.0
+chr1	10967	1.0	0.0	1.0
+chr1	10977	1.0	0.0	1.0
+chr1	11074	1.0	0.0	1.0
+chr1	11112	1.0	0.0	1.0
+chr1	11334	0.0	1.0	1.0
+chr1	11361	1.0	0.0	1.0
+chr1	11369	1.0	0.0	1.0
+chr1	11409	1.0	0.0	1.0
+chr1	11532	1.0	0.0	1.0
+chr1	11555	1.0	0.0	1.0
+chr1	11582	1.0	0.0	1.0
+chr1	11666	0.0	1.0	1.0
+chr1	11681	0.0	1.0	1.0
+chr1	11692	1.0	0.0	1.0
+chr1	11699	0.0	2.0	2.0
+chr1	11703	0.0	1.0	1.0
+chr1	11720	0.0	1.0	1.0
+chr1	11724	2.0	0.0	2.0
+chr1	11726	0.0	1.0	1.0
+chr1	11730	1.0	0.0	1.0
+chr1	11731	0.0	1.0	1.0
+chr1	11744	0.0	1.0	1.0
+chr1	11745	3.0	0.0	3.0
+chr1	11757	0.0	1.0	1.0
+chr1	11760	1.0	0.0	1.0
+chr1	11762	0.0	1.0	1.0
+chr1	11763	0.0	3.0	3.0
+chr1	11766	0.0	1.0	1.0
+chr1	11768	1.0	0.0	1.0
+chr1	11798	1.0	0.0	1.0
+chr1	11858	1.0	0.0	1.0
+chr1	11860	0.0	1.0	1.0
+chr1	11875	1.0	0.0	1.0
+chr1	11877	1.0	0.0	1.0
+chr1	11879	0.0	1.0	1.0
+chr1	11896	0.0	1.0	1.0
+chr1	11898	1.0	1.0	2.0
+chr1	11900	1.0	0.0	1.0
+chr1	11903	1.0	0.0	1.0
+chr1	11905	0.0	1.0	1.0
+chr1	11911	0.0	2.0	2.0
+chr1	11926	1.0	0.0	1.0
+chr1	11930	1.0	0.0	1.0
+chr1	11937	1.0	1.0	2.0
+chr1	11939	1.0	0.0	1.0
+chr1	11944	0.0	1.0	1.0
+chr1	11945	1.0	0.0	1.0
+chr1	11946	0.0	1.0	1.0
+chr1	11968	1.0	0.0	1.0
+chr1	12001	0.0	1.0	1.0
+chr1	12017	0.0	1.0	1.0
+chr1	12049	1.0	0.0	1.0
+chr1	12057	1.0	0.0	1.0
+chr1	12069	0.0	1.0	1.0
+chr1	12074	1.0	0.0	1.0
+chr1	12075	1.0	0.0	1.0
+chr1	12076	1.0	0.0	1.0
+chr1	12082	2.0	1.0	3.0
+chr1	12094	1.0	0.0	1.0
+chr1	12098	3.0	2.0	5.0
+chr1	12100	1.0	0.0	1.0
+chr1	12116	0.0	1.0	1.0
+chr1	12117	0.0	1.0	1.0
+chr1	12152	1.0	0.0	1.0
+chr1	12177	1.0	0.0	1.0
+chr1	12246	1.0	0.0	1.0
+chr1	12251	1.0	0.0	1.0
+chr1	12254	1.0	0.0	1.0
+chr1	12275	0.0	1.0	1.0
+chr1	12281	1.0	0.0	1.0
+chr1	12293	1.0	0.0	1.0
+chr1	12299	1.0	0.0	1.0
+chr1	12332	1.0	0.0	1.0
+chr1	12339	1.0	0.0	1.0
+chr1	12344	1.0	0.0	1.0
+chr1	12370	0.0	2.0	2.0
+chr1	12391	1.0	0.0	1.0
+chr1	12395	1.0	0.0	1.0
+chr1	12410	0.0	1.0	1.0
+chr1	12416	1.0	0.0	1.0
+chr1	12420	0.0	1.0	1.0
+chr1	12423	1.0	0.0	1.0
+chr1	12424	2.0	0.0	2.0
+chr1	12425	0.0	2.0	2.0
+chr1	12426	0.0	3.0	3.0
+chr1	12428	2.0	0.0	2.0
+chr1	12431	3.0	0.0	3.0
+chr1	12440	0.0	1.0	1.0
+chr1	12443	1.0	0.0	1.0
+chr1	12446	1.0	0.0	1.0
+chr1	12447	0.0	3.0	3.0
+chr1	12449	0.0	2.0	2.0
+chr1	12459	1.0	0.0	1.0
+chr1	12469	0.0	1.0	1.0
+chr1	12476	0.0	3.0	3.0
+chr1	12477	0.0	1.0	1.0
+chr1	12478	0.0	1.0	1.0
+chr1	12503	0.0	2.0	2.0
+chr1	12527	1.0	0.0	1.0
+chr1	12547	0.0	2.0	2.0
+chr1	12560	1.0	0.0	1.0
+chr1	12608	1.0	0.0	1.0
+chr1	12635	1.0	0.0	1.0
+chr1	12647	0.0	2.0	2.0
+chr1	12656	1.0	0.0	1.0
+chr1	12691	0.0	2.0	2.0
+chr1	12704	1.0	0.0	1.0
+chr1	12741	0.0	2.0	2.0
+chr1	12752	1.0	0.0	1.0
+chr1	12779	1.0	0.0	1.0
+chr1	12800	1.0	0.0	1.0
+chr1	12812	0.0	1.0	1.0
+chr1	12876	0.0	1.0	1.0
+chr1	12881	4.0	0.0	4.0
+chr1	12900	0.0	3.0	3.0
+chr1	12904	0.0	2.0	2.0
+chr1	12908	1.0	0.0	1.0
+chr1	12910	1.0	0.0	1.0
+chr1	12919	1.0	0.0	1.0
+chr1	12925	0.0	1.0	1.0
+chr1	12929	1.0	0.0	1.0
+chr1	12933	0.0	1.0	1.0
+chr1	12952	0.0	1.0	1.0
+chr1	12964	0.0	1.0	1.0
+chr1	13070	1.0	0.0	1.0
+chr1	13208	2.0	0.0	2.0
+chr1	13217	0.0	1.0	1.0
+chr1	13226	0.0	1.0	1.0
+chr1	13244	0.0	1.0	1.0
+chr1	13277	1.0	0.0	1.0
+chr1	13286	1.0	0.0	1.0
+chr1	13303	1.0	0.0	1.0
+chr1	13304	0.0	1.0	1.0
+chr1	13355	0.0	1.0	1.0
+chr1	13379	0.0	1.0	1.0
+chr1	13424	0.0	1.0	1.0
+chr1	13433	1.0	0.0	1.0
+chr1	13536	0.0	1.0	1.0
+chr1	13600	1.0	0.0	1.0
+chr1	13612	1.0	0.0	1.0
+chr1	13614	1.0	0.0	1.0
+chr1	13634	0.0	1.0	1.0
+chr1	13670	0.0	1.0	1.0
+chr1	13676	0.0	1.0	1.0
+chr1	13681	1.0	0.0	1.0
+chr1	13715	1.0	0.0	1.0
+chr1	13746	2.0	0.0	2.0
+chr1	13827	1.0	0.0	1.0
+chr1	13846	0.0	1.0	1.0
+chr1	13870	0.0	1.0	1.0
+chr1	13874	1.0	0.0	1.0
+chr1	13910	0.0	1.0	1.0
+chr1	13944	0.0	1.0	1.0
+chr1	13951	0.0	1.0	1.0
+chr1	13952	0.0	1.0	1.0
+chr1	13971	1.0	0.0	1.0
+chr1	13973	0.0	1.0	1.0
+chr1	14017	0.0	1.0	1.0
+chr1	14057	0.0	1.0	1.0
+chr1	14098	0.0	1.0	1.0
+chr1	14100	1.0	0.0	1.0
+chr1	14145	0.0	1.0	1.0
+chr1	14218	1.0	0.0	1.0
+chr1	14228	1.0	0.0	1.0
+chr1	14266	0.0	1.0	1.0
+chr1	14299	2.0	0.0	2.0
+chr1	14301	0.0	1.0	1.0
+chr1	14308	0.0	1.0	1.0
+chr1	14310	0.0	1.0	1.0
+chr1	14312	0.0	2.0	2.0
+chr1	14314	1.0	0.0	1.0
+chr1	14315	1.0	0.0	1.0
+chr1	14317	1.0	0.0	1.0
+chr1	14318	0.0	2.0	2.0
+chr1	14322	0.0	1.0	1.0
+chr1	14330	1.0	0.0	1.0
+chr1	14419	1.0	0.0	1.0
+chr1	14471	0.0	1.0	1.0
+chr1	14477	0.0	1.0	1.0
+chr1	14486	1.0	0.0	1.0
+chr1	14494	0.0	2.0	2.0
+chr1	14505	1.0	0.0	1.0
+chr1	14514	1.0	0.0	1.0
+chr1	14546	1.0	0.0	1.0
+chr1	14559	3.0	0.0	3.0
+chr1	14623	1.0	0.0	1.0
+chr1	14625	1.0	0.0	1.0
+chr1	14628	0.0	1.0	1.0
+chr1	14631	1.0	0.0	1.0
+chr1	14635	0.0	1.0	1.0
+chr1	14636	1.0	0.0	1.0
+chr1	14641	0.0	3.0	3.0
+chr1	14645	2.0	0.0	2.0
+chr1	14648	0.0	1.0	1.0
+chr1	14650	2.0	0.0	2.0
+chr1	14666	0.0	1.0	1.0
+chr1	14670	1.0	0.0	1.0
+chr1	14671	1.0	2.0	3.0
+chr1	14677	0.0	3.0	3.0
+chr1	14680	0.0	3.0	3.0
+chr1	14681	0.0	1.0	1.0
+chr1	14965	1.0	0.0	1.0
+chr1	14974	1.0	0.0	1.0
+chr1	14981	1.0	1.0	2.0
+chr1	14989	0.0	1.0	1.0
+chr1	14991	0.0	1.0	1.0
+chr1	14999	0.0	1.0	1.0
+chr1	15001	0.0	1.0	1.0
+chr1	15002	0.0	1.0	1.0
+chr1	15010	1.0	0.0	1.0
+chr1	15015	1.0	0.0	1.0
+chr1	15016	0.0	1.0	1.0
+chr1	15023	0.0	2.0	2.0
+chr1	15025	0.0	1.0	1.0
+chr1	15027	2.0	0.0	2.0
+chr1	15031	0.0	1.0	1.0
+chr1	15034	1.0	0.0	1.0
+chr1	15035	1.0	0.0	1.0
+chr1	15036	1.0	0.0	1.0
+chr1	15039	2.0	0.0	2.0
+chr1	15041	1.0	1.0	2.0
+chr1	15044	3.0	0.0	3.0
+chr1	15045	0.0	1.0	1.0
+chr1	15046	1.0	0.0	1.0
+chr1	15047	1.0	1.0	2.0
+chr1	15053	2.0	0.0	2.0
+chr1	15054	0.0	2.0	2.0
+chr1	15055	0.0	1.0	1.0
+chr1	15056	0.0	1.0	1.0
+chr1	15063	0.0	1.0	1.0
+chr1	15158	0.0	1.0	1.0
+chr1	15216	1.0	0.0	1.0
+chr1	15265	0.0	4.0	4.0
+chr1	15302	0.0	1.0	1.0
+chr1	15342	1.0	0.0	1.0
+chr1	15375	1.0	0.0	1.0
+chr1	15381	0.0	1.0	1.0
+chr1	15386	1.0	0.0	1.0
+chr1	15400	0.0	1.0	1.0
+chr1	15402	0.0	3.0	3.0
+chr1	15544	0.0	1.0	1.0
+chr1	15557	1.0	0.0	1.0
+chr1	15577	1.0	0.0	1.0
+chr1	15696	1.0	0.0	1.0
+chr1	15704	1.0	0.0	1.0
+chr1	15727	1.0	0.0	1.0
+chr1	15731	1.0	0.0	1.0
+chr1	15735	1.0	0.0	1.0
+chr1	15753	0.0	1.0	1.0
+chr1	15774	1.0	0.0	1.0
+chr1	15783	1.0	0.0	1.0
+chr1	16302	2.0	0.0	2.0
+chr1	16330	0.0	1.0	1.0
+chr1	16354	0.0	1.0	1.0
+chr1	16371	1.0	0.0	1.0
+chr1	16481	1.0	0.0	1.0
+chr1	16490	1.0	0.0	1.0
+chr1	16557	2.0	0.0	2.0
+chr1	16594	0.0	2.0	2.0
+chr1	16666	0.0	1.0	1.0
+chr1	16686	0.0	1.0	1.0
+chr1	16827	1.0	0.0	1.0
+chr1	16972	1.0	0.0	1.0
+chr1	17033	0.0	3.0	3.0
+chr1	17129	0.0	1.0	1.0
+chr1	17261	0.0	1.0	1.0
+chr1	17295	0.0	2.0	2.0
+chr1	17313	0.0	1.0	1.0
+chr1	17325	0.0	1.0	1.0
+chr1	17365	1.0	0.0	1.0
+chr1	17554	0.0	1.0	1.0
+chr1	17628	0.0	1.0	1.0
+chr1	17638	0.0	1.0	1.0
+chr1	17683	1.0	0.0	1.0
+chr1	17690	1.0	0.0	1.0
+chr1	17691	1.0	0.0	1.0
+chr1	17706	0.0	1.0	1.0
+chr1	17754	0.0	1.0	1.0
+chr1	17767	0.0	1.0	1.0
+chr1	17781	0.0	5.0	5.0
+chr1	17788	1.0	0.0	1.0
+chr1	17792	1.0	0.0	1.0
+chr1	17793	2.0	0.0	2.0
+chr1	17795	0.0	1.0	1.0
+chr1	17797	1.0	0.0	1.0
+chr1	17802	1.0	0.0	1.0
+chr1	17803	1.0	0.0	1.0
+chr1	17804	4.0	0.0	4.0
+chr1	17805	5.0	0.0	5.0
+chr1	17809	0.0	2.0	2.0
+chr1	17816	0.0	1.0	1.0
+chr1	17818	2.0	0.0	2.0
+chr1	17820	0.0	2.0	2.0
+chr1	17827	1.0	0.0	1.0
+chr1	17829	0.0	1.0	1.0
+chr1	17838	1.0	0.0	1.0
+chr1	17843	1.0	0.0	1.0
+chr1	17855	0.0	1.0	1.0
+chr1	17858	0.0	4.0	4.0
+chr1	17859	0.0	1.0	1.0
+chr1	17860	0.0	1.0	1.0
+chr1	17867	0.0	2.0	2.0
+chr1	17872	0.0	1.0	1.0
+chr1	17875	0.0	1.0	1.0
+chr1	17878	0.0	1.0	1.0
+chr1	17884	0.0	1.0	1.0
+chr1	17988	1.0	0.0	1.0
+chr1	18012	0.0	1.0	1.0
+chr1	18033	2.0	0.0	2.0
+chr1	18034	1.0	0.0	1.0
+chr1	18035	1.0	0.0	1.0
+chr1	18038	2.0	0.0	2.0
+chr1	18039	1.0	0.0	1.0
+chr1	18044	0.0	2.0	2.0
+chr1	18057	1.0	0.0	1.0
+chr1	18060	0.0	3.0	3.0
+chr1	18063	0.0	1.0	1.0
+chr1	18066	2.0	0.0	2.0
+chr1	18067	1.0	0.0	1.0
+chr1	18073	0.0	1.0	1.0
+chr1	18074	1.0	0.0	1.0
+chr1	18154	1.0	0.0	1.0
+chr1	18199	0.0	1.0	1.0
+chr1	18201	0.0	1.0	1.0
+chr1	18208	0.0	8.0	8.0
+chr1	18213	1.0	0.0	1.0
+chr1	18214	0.0	1.0	1.0
+chr1	18215	1.0	0.0	1.0
+chr1	18219	0.0	1.0	1.0
+chr1	18221	0.0	1.0	1.0
+chr1	18222	0.0	1.0	1.0
+chr1	18227	1.0	0.0	1.0
+chr1	18228	1.0	0.0	1.0
+chr1	18229	1.0	0.0	1.0
+chr1	18231	0.0	1.0	1.0
+chr1	18238	0.0	3.0	3.0
+chr1	18242	1.0	0.0	1.0
+chr1	18257	0.0	1.0	1.0
+chr1	18265	0.0	1.0	1.0
+chr1	18348	0.0	1.0	1.0
+chr1	18355	0.0	2.0	2.0
+chr1	18368	1.0	0.0	1.0
+chr1	18372	0.0	1.0	1.0
+chr1	18373	1.0	0.0	1.0
+chr1	18386	0.0	1.0	1.0
+chr1	18388	0.0	1.0	1.0
+chr1	18398	3.0	0.0	3.0
+chr1	18411	0.0	2.0	2.0
+chr1	18420	0.0	1.0	1.0
+chr1	18565	0.0	3.0	3.0
+chr1	18569	0.0	1.0	1.0
+chr1	18579	1.0	0.0	1.0
+chr1	18593	0.0	1.0	1.0
+chr1	18608	0.0	1.0	1.0
+chr1	18645	0.0	2.0	2.0
+chr1	18651	1.0	0.0	1.0
+chr1	18665	0.0	1.0	1.0
+chr1	18666	1.0	0.0	1.0
+chr1	18667	1.0	0.0	1.0
+chr1	18706	0.0	3.0	3.0
+chr1	18717	1.0	0.0	1.0
+chr1	18722	0.0	1.0	1.0
+chr1	18723	0.0	1.0	1.0
+chr1	18724	0.0	2.0	2.0
+chr1	18728	0.0	1.0	1.0
+chr1	18734	1.0	0.0	1.0
+chr1	18742	1.0	0.0	1.0
+chr1	18743	2.0	0.0	2.0
+chr1	18747	0.0	1.0	1.0
+chr1	18750	0.0	1.0	1.0
+chr1	18791	0.0	1.0	1.0
+chr1	18795	1.0	0.0	1.0
+chr1	18805	0.0	2.0	2.0
+chr1	18855	0.0	1.0	1.0
+chr1	18871	1.0	0.0	1.0
+chr1	18874	0.0	1.0	1.0
+chr1	18879	3.0	0.0	3.0
+chr1	18883	1.0	0.0	1.0
+chr1	18884	1.0	0.0	1.0
+chr1	18887	0.0	1.0	1.0
+chr1	18888	1.0	1.0	2.0
+chr1	18898	1.0	0.0	1.0
+chr1	18903	1.0	0.0	1.0
+chr1	18905	1.0	0.0	1.0
+chr1	18941	0.0	1.0	1.0
+chr1	18975	0.0	1.0	1.0
+chr1	19042	0.0	1.0	1.0
+chr1	19061	1.0	0.0	1.0
+chr1	19064	1.0	1.0	2.0
+chr1	19065	0.0	1.0	1.0
+chr1	19071	1.0	0.0	1.0
+chr1	19076	1.0	2.0	3.0
+chr1	19089	0.0	1.0	1.0
+chr1	19095	0.0	1.0	1.0
+chr1	19099	4.0	0.0	4.0
+chr1	19103	0.0	1.0	1.0
+chr1	19164	0.0	1.0	1.0
+chr1	19193	0.0	1.0	1.0
+chr1	19227	1.0	0.0	1.0
+chr1	19230	1.0	0.0	1.0
+chr1	19241	1.0	0.0	1.0
+chr1	19242	1.0	1.0	2.0
+chr1	19247	0.0	1.0	1.0
+chr1	19248	0.0	1.0	1.0
+chr1	19260	1.0	0.0	1.0
+chr1	19273	1.0	0.0	1.0
+chr1	19280	0.0	1.0	1.0
+chr1	19389	0.0	1.0	1.0
+chr1	19396	0.0	1.0	1.0
+chr1	19405	0.0	1.0	1.0
+chr1	19406	1.0	0.0	1.0
+chr1	19407	2.0	0.0	2.0
+chr1	19419	1.0	0.0	1.0
+chr1	19420	1.0	0.0	1.0
+chr1	19425	0.0	1.0	1.0
+chr1	19427	0.0	1.0	1.0
+chr1	19433	1.0	2.0	3.0
+chr1	19436	2.0	0.0	2.0
+chr1	19440	0.0	1.0	1.0
+chr1	19445	1.0	0.0	1.0
+chr1	19446	0.0	1.0	1.0
+chr1	19451	0.0	1.0	1.0
+chr1	19455	1.0	0.0	1.0
+chr1	19458	0.0	3.0	3.0
+chr1	19468	0.0	1.0	1.0
+chr1	19491	1.0	0.0	1.0
+chr1	19532	1.0	1.0	2.0
+chr1	19538	0.0	1.0	1.0
+chr1	19545	1.0	0.0	1.0
+chr1	19546	0.0	1.0	1.0
+chr1	19548	0.0	1.0	1.0
+chr1	19555	1.0	2.0	3.0
+chr1	19558	4.0	0.0	4.0
+chr1	19567	1.0	0.0	1.0
+chr1	19569	0.0	1.0	1.0
+chr1	19573	0.0	1.0	1.0
+chr1	19574	1.0	0.0	1.0
+chr1	19589	1.0	0.0	1.0
+chr1	19592	0.0	1.0	1.0
+chr1	19600	1.0	0.0	1.0
+chr1	19605	3.0	0.0	3.0
+chr1	19616	1.0	0.0	1.0
+chr1	19627	3.0	0.0	3.0
+chr1	19628	1.0	0.0	1.0
+chr1	19632	0.0	1.0	1.0
+chr1	19697	1.0	0.0	1.0
+chr1	19698	1.0	2.0	3.0
+chr1	19699	0.0	2.0	2.0
+chr1	19700	0.0	1.0	1.0
+chr1	19701	1.0	0.0	1.0
+chr1	19742	1.0	0.0	1.0
+chr1	19751	0.0	3.0	3.0
+chr1	19770	0.0	1.0	1.0
+chr1	19774	0.0	1.0	1.0
+chr1	19810	1.0	0.0	1.0
+chr1	19813	1.0	0.0	1.0
+chr1	19814	1.0	0.0	1.0
+chr1	19880	1.0	0.0	1.0
+chr1	19893	0.0	1.0	1.0
+chr1	19904	2.0	0.0	2.0
+chr1	19924	0.0	1.0	1.0
+chr1	19928	0.0	2.0	2.0
+chr1	19941	0.0	1.0	1.0
+chr1	19942	0.0	1.0	1.0
+chr1	19943	0.0	1.0	1.0
+chr1	19946	1.0	0.0	1.0
+chr1	19950	0.0	1.0	1.0
+chr1	19953	1.0	0.0	1.0
+chr1	19964	0.0	2.0	2.0
+chr1	20001	0.0	1.0	1.0
+chr1	20003	2.0	0.0	2.0
+chr1	20011	1.0	0.0	1.0
+chr1	20021	1.0	0.0	1.0
+chr1	20036	1.0	0.0	1.0
+chr1	20074	0.0	2.0	2.0
+chr1	20080	0.0	1.0	1.0
+chr1	20082	2.0	0.0	2.0
+chr1	20102	1.0	0.0	1.0
+chr1	20107	1.0	0.0	1.0
+chr1	20112	1.0	0.0	1.0
+chr1	20119	0.0	1.0	1.0
+chr1	20121	1.0	0.0	1.0
+chr1	20140	0.0	2.0	2.0
+chr1	20151	1.0	0.0	1.0
+chr1	20171	1.0	0.0	1.0
+chr1	20173	0.0	1.0	1.0
+chr1	20200	0.0	1.0	1.0
+chr1	20214	0.0	1.0	1.0
+chr1	20224	1.0	0.0	1.0
+chr1	20243	1.0	0.0	1.0
+chr1	20265	0.0	1.0	1.0
+chr1	20268	0.0	1.0	1.0
+chr1	20282	1.0	0.0	1.0
+chr1	20286	0.0	1.0	1.0
+chr1	20288	2.0	0.0	2.0
+chr1	20292	0.0	1.0	1.0
+chr1	20297	2.0	0.0	2.0
+chr1	20308	2.0	0.0	2.0
+chr1	20319	0.0	1.0	1.0
+chr1	20321	0.0	1.0	1.0
+chr1	20327	0.0	1.0	1.0
+chr1	20333	1.0	0.0	1.0
+chr1	20339	1.0	0.0	1.0
+chr1	20458	1.0	0.0	1.0
+chr1	20460	1.0	0.0	1.0
+chr1	20462	0.0	1.0	1.0
+chr1	20478	0.0	1.0	1.0
+chr1	20493	0.0	1.0	1.0
+chr1	20494	2.0	1.0	3.0
+chr1	20518	1.0	0.0	1.0
+chr1	20527	1.0	1.0	2.0
+chr1	20530	0.0	1.0	1.0
+chr1	20537	0.0	1.0	1.0
+chr1	20538	0.0	1.0	1.0
+chr1	20575	1.0	0.0	1.0
+chr1	20584	0.0	1.0	1.0
+chr1	20585	1.0	0.0	1.0
+chr1	20604	0.0	1.0	1.0
+chr1	20620	1.0	0.0	1.0
+chr1	20625	0.0	1.0	1.0
+chr1	20627	0.0	1.0	1.0
+chr1	20629	0.0	2.0	2.0
+chr1	20631	0.0	1.0	1.0
+chr1	20639	0.0	1.0	1.0
+chr1	20641	1.0	0.0	1.0
+chr1	20658	0.0	1.0	1.0
+chr1	20673	1.0	0.0	1.0
+chr1	20674	0.0	1.0	1.0
+chr1	20680	1.0	0.0	1.0
+chr1	20741	1.0	0.0	1.0
+chr1	20786	0.0	1.0	1.0
+chr1	20788	2.0	0.0	2.0
+chr1	20791	1.0	0.0	1.0
+chr1	20797	1.0	0.0	1.0
+chr1	20799	2.0	0.0	2.0
+chr1	20810	1.0	0.0	1.0
+chr1	20811	0.0	3.0	3.0
+chr1	20812	0.0	1.0	1.0
+chr1	20814	2.0	0.0	2.0
+chr1	20815	4.0	0.0	4.0
+chr1	20819	0.0	1.0	1.0
+chr1	20820	0.0	1.0	1.0
+chr1	20822	1.0	0.0	1.0
+chr1	20823	2.0	0.0	2.0
+chr1	20824	0.0	3.0	3.0
+chr1	20825	2.0	0.0	2.0
+chr1	20826	1.0	0.0	1.0
+chr1	20828	1.0	0.0	1.0
+chr1	20829	2.0	0.0	2.0
+chr1	20831	0.0	3.0	3.0
+chr1	20845	0.0	1.0	1.0
+chr1	20848	1.0	0.0	1.0
+chr1	20864	0.0	1.0	1.0
+chr1	20904	1.0	0.0	1.0
+chr1	21064	0.0	1.0	1.0
+chr1	21195	1.0	0.0	1.0
+chr1	21199	1.0	0.0	1.0
+chr1	21219	0.0	1.0	1.0
+chr1	21298	0.0	1.0	1.0
+chr1	21301	1.0	0.0	1.0
+chr1	21303	0.0	1.0	1.0
+chr1	21315	0.0	2.0	2.0
+chr1	21347	0.0	1.0	1.0
+chr1	21348	1.0	0.0	1.0
+chr1	21367	0.0	1.0	1.0
+chr1	21377	2.0	0.0	2.0
+chr1	21395	1.0	0.0	1.0
+chr1	21396	1.0	0.0	1.0
+chr1	21399	2.0	0.0	2.0
+chr1	21407	1.0	0.0	1.0
+chr1	21408	0.0	1.0	1.0
+chr1	21409	0.0	1.0	1.0
+chr1	21413	0.0	1.0	1.0
+chr1	21416	0.0	1.0	1.0
+chr1	21418	1.0	0.0	1.0
+chr1	21419	0.0	1.0	1.0
+chr1	21428	0.0	2.0	2.0
+chr1	21439	1.0	0.0	1.0
+chr1	21455	1.0	0.0	1.0
+chr1	21463	1.0	0.0	1.0
+chr1	21494	0.0	1.0	1.0
+chr1	21508	2.0	0.0	2.0
+chr1	21518	1.0	0.0	1.0
+chr1	21521	0.0	3.0	3.0
+chr1	21531	1.0	0.0	1.0
+chr1	21539	1.0	0.0	1.0
+chr1	21566	1.0	0.0	1.0
+chr1	21568	0.0	1.0	1.0
+chr1	21570	1.0	0.0	1.0
+chr1	21577	1.0	0.0	1.0
+chr1	21601	0.0	1.0	1.0
+chr1	21608	0.0	1.0	1.0
+chr1	21673	0.0	3.0	3.0
+chr1	21702	2.0	0.0	2.0
+chr1	21709	0.0	2.0	2.0
+chr1	21714	0.0	1.0	1.0
+chr1	21715	0.0	1.0	1.0
+chr1	21716	2.0	0.0	2.0
+chr1	21726	1.0	0.0	1.0
+chr1	21727	2.0	0.0	2.0
+chr1	21728	0.0	1.0	1.0
+chr1	21729	0.0	2.0	2.0
+chr1	21735	1.0	0.0	1.0
+chr1	21736	0.0	1.0	1.0
+chr1	21737	0.0	2.0	2.0
+chr1	21744	0.0	1.0	1.0
+chr1	21753	0.0	1.0	1.0
+chr1	21754	0.0	1.0	1.0
+chr1	21757	0.0	1.0	1.0
+chr1	21766	0.0	1.0	1.0
+chr1	21774	0.0	1.0	1.0
+chr1	21829	0.0	2.0	2.0
+chr1	21847	2.0	0.0	2.0
+chr1	21848	1.0	0.0	1.0
+chr1	21863	1.0	0.0	1.0
+chr1	21883	1.0	0.0	1.0
+chr1	21886	0.0	1.0	1.0
+chr1	21904	0.0	1.0	1.0
+chr1	21914	1.0	0.0	1.0
+chr1	21929	0.0	2.0	2.0
+chr1	21933	0.0	1.0	1.0
+chr1	21938	1.0	0.0	1.0
+chr1	21993	0.0	1.0	1.0
+chr1	22006	1.0	0.0	1.0
+chr1	22050	0.0	1.0	1.0
+chr1	22069	1.0	0.0	1.0
+chr1	22077	1.0	0.0	1.0
+chr1	22080	1.0	0.0	1.0
+chr1	22094	0.0	1.0	1.0
+chr1	22149	0.0	2.0	2.0
+chr1	22154	1.0	0.0	1.0
+chr1	22155	1.0	0.0	1.0
+chr1	22161	1.0	0.0	1.0
+chr1	22162	1.0	0.0	1.0
+chr1	22164	0.0	1.0	1.0
+chr1	22175	0.0	1.0	1.0
+chr1	22198	0.0	1.0	1.0
+chr1	22199	0.0	1.0	1.0
+chr1	22215	1.0	0.0	1.0
+chr1	22218	1.0	0.0	1.0
+chr1	22238	1.0	0.0	1.0
+chr1	22243	0.0	1.0	1.0
+chr1	22247	2.0	0.0	2.0
+chr1	22258	1.0	0.0	1.0
+chr1	22265	0.0	1.0	1.0
+chr1	22271	2.0	0.0	2.0
+chr1	22285	0.0	1.0	1.0
+chr1	22338	0.0	3.0	3.0
+chr1	22347	0.0	1.0	1.0
+chr1	22375	0.0	1.0	1.0
+chr1	22573	0.0	1.0	1.0
+chr1	22578	1.0	0.0	1.0
+chr1	22582	1.0	0.0	1.0
+chr1	22603	1.0	0.0	1.0
+chr1	22614	0.0	1.0	1.0
+chr1	22681	0.0	2.0	2.0
+chr1	22697	1.0	0.0	1.0
+chr1	22713	0.0	1.0	1.0
+chr1	22714	3.0	0.0	3.0
+chr1	22715	1.0	0.0	1.0
+chr1	22730	0.0	1.0	1.0
+chr1	22731	1.0	0.0	1.0
+chr1	22733	1.0	0.0	1.0
+chr1	22736	5.0	1.0	6.0
+chr1	22738	2.0	0.0	2.0
+chr1	22741	0.0	1.0	1.0
+chr1	22742	0.0	1.0	1.0
+chr1	22744	1.0	0.0	1.0
+chr1	22759	1.0	0.0	1.0
+chr1	22765	1.0	0.0	1.0
+chr1	22776	0.0	1.0	1.0
+chr1	22811	0.0	2.0	2.0
+chr1	22835	1.0	0.0	1.0
+chr1	22849	0.0	1.0	1.0
+chr1	22947	0.0	2.0	2.0
+chr1	22983	0.0	1.0	1.0
+chr1	23004	1.0	0.0	1.0
+chr1	23005	0.0	1.0	1.0
+chr1	23008	2.0	0.0	2.0
+chr1	23011	2.0	1.0	3.0
+chr1	23016	0.0	1.0	1.0
+chr1	23021	1.0	0.0	1.0
+chr1	23023	1.0	0.0	1.0
+chr1	23031	3.0	1.0	4.0
+chr1	23034	0.0	2.0	2.0
+chr1	23035	0.0	1.0	1.0
+chr1	23037	0.0	1.0	1.0
+chr1	23039	0.0	1.0	1.0
+chr1	23051	0.0	2.0	2.0
+chr1	23055	2.0	0.0	2.0
+chr1	23057	1.0	0.0	1.0
+chr1	23058	0.0	2.0	2.0
+chr1	23076	1.0	0.0	1.0
+chr1	23094	2.0	0.0	2.0
+chr1	23143	1.0	0.0	1.0
+chr1	23146	0.0	2.0	2.0
+chr1	23163	1.0	1.0	2.0
+chr1	23171	1.0	0.0	1.0
+chr1	23201	0.0	1.0	1.0
+chr1	23203	0.0	2.0	2.0
+chr1	23206	1.0	0.0	1.0
+chr1	23211	1.0	0.0	1.0
+chr1	23219	0.0	1.0	1.0
+chr1	23226	1.0	0.0	1.0
+chr1	23232	1.0	0.0	1.0
+chr1	23242	2.0	0.0	2.0
+chr1	23243	0.0	2.0	2.0
+chr1	23247	1.0	1.0	2.0
+chr1	23251	0.0	1.0	1.0
+chr1	23252	1.0	1.0	2.0
+chr1	23253	1.0	0.0	1.0
+chr1	23259	1.0	0.0	1.0
+chr1	23265	1.0	0.0	1.0
+chr1	23394	0.0	1.0	1.0
+chr1	23404	1.0	0.0	1.0
+chr1	23417	1.0	0.0	1.0
+chr1	23424	2.0	0.0	2.0
+chr1	23431	0.0	1.0	1.0
+chr1	23432	0.0	1.0	1.0
+chr1	23445	1.0	0.0	1.0
+chr1	23448	1.0	0.0	1.0
+chr1	23472	1.0	0.0	1.0
+chr1	23475	1.0	0.0	1.0
+chr1	23491	0.0	2.0	2.0
+chr1	23512	0.0	1.0	1.0
+chr1	23518	0.0	1.0	1.0
+chr1	23524	1.0	0.0	1.0
+chr1	23534	1.0	0.0	1.0
+chr1	23544	0.0	2.0	2.0
+chr1	23545	0.0	1.0	1.0
+chr1	23562	1.0	0.0	1.0
+chr1	23570	0.0	1.0	1.0
+chr1	23578	2.0	0.0	2.0
+chr1	23585	0.0	1.0	1.0
+chr1	23588	0.0	1.0	1.0
+chr1	23589	0.0	2.0	2.0
+chr1	23592	0.0	1.0	1.0
+chr1	23597	0.0	1.0	1.0
+chr1	23604	1.0	0.0	1.0
+chr1	23605	0.0	1.0	1.0
+chr1	23609	1.0	0.0	1.0
+chr1	23615	1.0	0.0	1.0
+chr1	23624	0.0	1.0	1.0
+chr1	23625	0.0	1.0	1.0
+chr1	23627	1.0	0.0	1.0
+chr1	23628	1.0	0.0	1.0
+chr1	23838	1.0	0.0	1.0
+chr1	23845	0.0	1.0	1.0
+chr1	23987	1.0	0.0	1.0
+chr1	23988	1.0	0.0	1.0
+chr1	23990	0.0	1.0	1.0
+chr1	24003	0.0	2.0	2.0
+chr1	24006	0.0	2.0	2.0
+chr1	24007	0.0	2.0	2.0
+chr1	24011	0.0	1.0	1.0
+chr1	24015	0.0	2.0	2.0
+chr1	24028	2.0	0.0	2.0
+chr1	24032	0.0	1.0	1.0
+chr1	24035	0.0	1.0	1.0
+chr1	24050	0.0	1.0	1.0
+chr1	24051	1.0	1.0	2.0
+chr1	24053	0.0	1.0	1.0
+chr1	24061	1.0	0.0	1.0
+chr1	24066	0.0	1.0	1.0
+chr1	24069	0.0	1.0	1.0
+chr1	24080	0.0	1.0	1.0
+chr1	24082	0.0	3.0	3.0
+chr1	24113	0.0	1.0	1.0
+chr1	24131	0.0	2.0	2.0
+chr1	24133	1.0	0.0	1.0
+chr1	24135	0.0	1.0	1.0
+chr1	24152	0.0	1.0	1.0
+chr1	24154	2.0	0.0	2.0
+chr1	24158	0.0	1.0	1.0
+chr1	24162	1.0	0.0	1.0
+chr1	24163	0.0	1.0	1.0
+chr1	24170	1.0	0.0	1.0
+chr1	24173	2.0	0.0	2.0
+chr1	24176	0.0	1.0	1.0
+chr1	24182	1.0	0.0	1.0
+chr1	24185	1.0	0.0	1.0
+chr1	24189	0.0	1.0	1.0
+chr1	24194	0.0	1.0	1.0
+chr1	24195	0.0	3.0	3.0
+chr1	24198	0.0	1.0	1.0
+chr1	24200	1.0	0.0	1.0
+chr1	24230	1.0	0.0	1.0
+chr1	24290	1.0	0.0	1.0
+chr1	24292	0.0	1.0	1.0
+chr1	24307	1.0	0.0	1.0
+chr1	24309	1.0	0.0	1.0
+chr1	24311	0.0	1.0	1.0
+chr1	24328	0.0	2.0	2.0
+chr1	24330	1.0	0.0	1.0
+chr1	24332	1.0	0.0	1.0
+chr1	24335	1.0	0.0	1.0
+chr1	24337	0.0	1.0	1.0
+chr1	24343	0.0	2.0	2.0
+chr1	24358	1.0	1.0	2.0
+chr1	24362	1.0	0.0	1.0
+chr1	24369	1.0	1.0	2.0
+chr1	24371	1.0	0.0	1.0
+chr1	24376	0.0	1.0	1.0
+chr1	24377	1.0	0.0	1.0
+chr1	24378	0.0	1.0	1.0
+chr1	24400	1.0	0.0	1.0
+chr1	24433	0.0	1.0	1.0
+chr1	24449	0.0	1.0	1.0
+chr1	24481	1.0	0.0	1.0
+chr1	24489	1.0	0.0	1.0
+chr1	24501	0.0	1.0	1.0
+chr1	24506	1.0	0.0	1.0
+chr1	24507	1.0	0.0	1.0
+chr1	24508	1.0	0.0	1.0
+chr1	24514	2.0	1.0	3.0
+chr1	24526	1.0	0.0	1.0
+chr1	24530	3.0	0.0	3.0
+chr1	24531	0.0	1.0	1.0
+chr1	24532	1.0	1.0	2.0
+chr1	24548	0.0	1.0	1.0
+chr1	24551	0.0	1.0	1.0
+chr1	24584	1.0	0.0	1.0
+chr1	24609	1.0	0.0	1.0
+chr1	24678	1.0	0.0	1.0
+chr1	24683	1.0	0.0	1.0
+chr1	24686	1.0	0.0	1.0
+chr1	24713	1.0	0.0	1.0
+chr1	24725	2.0	1.0	3.0
+chr1	24785	1.0	0.0	1.0
+chr1	24792	1.0	0.0	1.0
+chr1	24797	1.0	0.0	1.0
+chr1	24823	0.0	2.0	2.0
+chr1	24844	1.0	0.0	1.0
+chr1	24848	1.0	0.0	1.0
+chr1	24863	0.0	1.0	1.0
+chr1	24869	1.0	0.0	1.0
+chr1	24873	0.0	1.0	1.0
+chr1	24876	1.0	0.0	1.0
+chr1	24877	2.0	0.0	2.0
+chr1	24878	0.0	2.0	2.0
+chr1	24879	0.0	3.0	3.0
+chr1	24881	2.0	0.0	2.0
+chr1	24884	3.0	0.0	3.0
+chr1	24896	1.0	1.0	2.0
+chr1	24899	1.0	0.0	1.0
+chr1	24900	0.0	3.0	3.0
+chr1	24902	0.0	1.0	1.0
+chr1	24911	0.0	1.0	1.0
+chr1	24912	1.0	0.0	1.0
+chr1	24922	0.0	1.0	1.0
+chr1	24929	0.0	3.0	3.0
+chr1	24930	0.0	1.0	1.0
+chr1	24942	0.0	1.0	1.0
+chr1	24977	0.0	1.0	1.0
+chr1	24980	1.0	0.0	1.0
+chr1	25041	0.0	1.0	1.0
+chr1	25046	4.0	0.0	4.0
+chr1	25065	0.0	3.0	3.0
+chr1	25069	0.0	2.0	2.0
+chr1	25073	1.0	0.0	1.0
+chr1	25075	1.0	0.0	1.0
+chr1	25084	1.0	0.0	1.0
+chr1	25090	0.0	1.0	1.0
+chr1	25094	1.0	0.0	1.0
+chr1	25098	0.0	1.0	1.0
+chr1	25117	0.0	1.0	1.0
+chr1	25129	0.0	1.0	1.0
+chr1	25235	1.0	0.0	1.0
+chr1	25373	2.0	0.0	2.0
+chr1	25394	1.0	0.0	1.0
+chr1	25409	0.0	1.0	1.0
+chr1	25443	1.0	0.0	1.0
+chr1	25449	1.0	0.0	1.0
+chr1	25469	0.0	1.0	1.0
+chr1	25470	1.0	0.0	1.0
+chr1	25476	1.0	0.0	1.0
+chr1	25486	0.0	1.0	1.0
+chr1	25500	1.0	0.0	1.0
+chr1	25502	0.0	1.0	1.0
+chr1	25550	1.0	0.0	1.0
+chr1	25558	1.0	0.0	1.0
+chr1	25560	0.0	1.0	1.0
+chr1	25572	1.0	0.0	1.0
+chr1	25574	0.0	1.0	1.0
+chr1	25589	0.0	1.0	1.0
+chr1	25601	1.0	0.0	1.0
+chr1	25604	0.0	1.0	1.0
+chr1	25607	0.0	2.0	2.0
+chr1	25609	1.0	0.0	1.0
+chr1	25619	0.0	1.0	1.0
+chr1	25633	1.0	0.0	1.0
+chr1	25645	0.0	1.0	1.0
+chr1	25649	0.0	1.0	1.0
+chr1	25673	0.0	1.0	1.0
+chr1	25682	1.0	1.0	2.0
+chr1	25686	1.0	0.0	1.0
+chr1	25691	0.0	1.0	1.0
+chr1	25693	1.0	0.0	1.0
+chr1	25703	1.0	0.0	1.0
+chr1	25707	0.0	1.0	1.0
+chr1	25713	0.0	1.0	1.0
+chr1	25734	1.0	0.0	1.0
+chr1	25742	0.0	1.0	1.0
+chr1	25748	3.0	0.0	3.0
+chr1	25752	0.0	1.0	1.0
+chr1	25765	2.0	0.0	2.0
+chr1	25769	1.0	0.0	1.0
+chr1	25773	1.0	0.0	1.0
+chr1	25780	0.0	1.0	1.0
+chr1	25792	2.0	0.0	2.0
+chr1	25797	1.0	0.0	1.0
+chr1	25799	0.0	2.0	2.0
+chr1	25808	0.0	1.0	1.0
+chr1	25811	0.0	1.0	1.0
+chr1	25824	1.0	0.0	1.0
+chr1	25828	1.0	0.0	1.0
+chr1	25832	1.0	0.0	1.0
+chr1	25835	1.0	0.0	1.0
+chr1	25842	0.0	1.0	1.0
+chr1	25848	0.0	1.0	1.0
+chr1	25877	0.0	1.0	1.0
+chr1	25887	3.0	1.0	4.0
+chr1	25908	1.0	0.0	1.0
+chr1	25915	0.0	1.0	1.0
+chr1	25927	2.0	0.0	2.0
+chr1	25932	1.0	0.0	1.0
+chr1	25936	0.0	2.0	2.0
+chr1	25943	0.0	1.0	1.0
+chr1	25946	0.0	1.0	1.0
+chr1	25959	1.0	0.0	1.0
+chr1	25963	1.0	0.0	1.0
+chr1	25967	1.0	0.0	1.0
+chr1	25970	1.0	0.0	1.0
+chr1	25977	0.0	1.0	1.0
+chr1	25983	0.0	1.0	1.0
+chr1	25986	0.0	2.0	2.0
+chr1	26012	0.0	1.0	1.0
+chr1	26022	3.0	1.0	4.0
+chr1	26032	0.0	1.0	1.0
+chr1	26035	1.0	0.0	1.0
+chr1	26039	2.0	0.0	2.0
+chr1	26043	1.0	0.0	1.0
+chr1	26046	1.0	0.0	1.0
+chr1	26050	0.0	1.0	1.0
+chr1	26062	2.0	0.0	2.0
+chr1	26067	1.0	0.0	1.0
+chr1	26071	0.0	2.0	2.0
+chr1	26078	0.0	1.0	1.0
+chr1	26094	1.0	0.0	1.0
+chr1	26098	1.0	0.0	1.0
+chr1	26102	1.0	0.0	1.0
+chr1	26105	1.0	0.0	1.0
+chr1	26110	0.0	1.0	1.0
+chr1	26118	0.0	1.0	1.0
+chr1	26121	0.0	2.0	2.0
+chr1	26122	0.0	1.0	1.0
+chr1	26147	0.0	1.0	1.0
+chr1	26157	3.0	1.0	4.0
+chr1	26167	0.0	1.0	1.0
+chr1	26170	1.0	0.0	1.0
+chr1	26174	2.0	0.0	2.0
+chr1	26178	1.0	0.0	1.0
+chr1	26181	1.0	0.0	1.0
+chr1	26185	0.0	1.0	1.0
+chr1	26197	2.0	0.0	2.0
+chr1	26202	1.0	0.0	1.0
+chr1	26206	0.0	2.0	2.0
+chr1	26213	0.0	1.0	1.0
+chr1	26229	1.0	0.0	1.0
+chr1	26233	1.0	0.0	1.0
+chr1	26237	1.0	0.0	1.0
+chr1	26246	1.0	0.0	1.0
+chr1	26247	0.0	1.0	1.0
+chr1	26253	0.0	1.0	1.0
+chr1	26282	0.0	1.0	1.0
+chr1	26292	3.0	1.0	4.0
+chr1	26305	1.0	0.0	1.0
+chr1	26309	2.0	0.0	2.0
+chr1	26313	1.0	0.0	1.0
+chr1	26318	0.0	1.0	1.0
+chr1	26332	2.0	0.0	2.0
+chr1	26337	1.0	0.0	1.0
+chr1	26339	0.0	2.0	2.0
+chr1	26348	0.0	1.0	1.0
+chr1	26351	0.0	1.0	1.0
+chr1	26364	1.0	0.0	1.0
+chr1	26368	1.0	0.0	1.0
+chr1	26372	1.0	0.0	1.0
+chr1	26375	1.0	0.0	1.0
+chr1	26382	0.0	1.0	1.0
+chr1	26388	0.0	1.0	1.0
+chr1	26417	0.0	1.0	1.0
+chr1	26427	3.0	1.0	4.0
+chr1	26448	1.0	0.0	1.0
+chr1	26453	0.0	1.0	1.0
+chr1	26467	2.0	0.0	2.0
+chr1	26472	1.0	0.0	1.0
+chr1	26476	0.0	3.0	3.0
+chr1	26499	1.0	0.0	1.0
+chr1	26503	1.0	0.0	1.0
+chr1	26507	1.0	0.0	1.0
+chr1	26510	1.0	0.0	1.0
+chr1	26517	0.0	1.0	1.0
+chr1	26523	0.0	1.0	1.0
+chr1	26552	0.0	1.0	1.0
+chr1	26562	3.0	1.0	4.0
+chr1	26575	1.0	0.0	1.0
+chr1	26583	1.0	0.0	1.0
+chr1	26588	0.0	1.0	1.0
+chr1	26602	2.0	0.0	2.0
+chr1	26607	1.0	0.0	1.0
+chr1	26611	0.0	3.0	3.0
+chr1	26632	1.0	0.0	1.0
+chr1	26638	1.0	0.0	1.0
+chr1	26642	1.0	0.0	1.0
+chr1	26645	1.0	0.0	1.0
+chr1	26652	0.0	1.0	1.0
+chr1	26658	0.0	1.0	1.0
+chr1	26687	0.0	1.0	1.0
+chr1	26697	3.0	1.0	4.0
+chr1	26710	1.0	0.0	1.0
+chr1	26718	1.0	0.0	1.0
+chr1	26723	0.0	1.0	1.0
+chr1	26737	2.0	0.0	2.0
+chr1	26742	1.0	0.0	1.0
+chr1	26746	0.0	3.0	3.0
+chr1	26767	1.0	0.0	1.0
+chr1	26773	1.0	0.0	1.0
+chr1	26777	1.0	0.0	1.0
+chr1	26780	1.0	0.0	1.0
+chr1	26785	0.0	1.0	1.0
+chr1	26793	0.0	1.0	1.0
+chr1	26796	0.0	1.0	1.0
+chr1	26822	0.0	1.0	1.0
+chr1	26828	0.0	1.0	1.0
+chr1	26832	3.0	0.0	3.0
+chr1	26845	1.0	0.0	1.0
+chr1	26853	1.0	0.0	1.0
+chr1	26872	2.0	0.0	2.0
+chr1	26877	1.0	0.0	1.0
+chr1	26881	0.0	2.0	2.0
+chr1	26902	1.0	0.0	1.0
+chr1	26912	1.0	0.0	1.0
+chr1	26928	0.0	1.0	1.0
+chr1	26931	0.0	1.0	1.0
+chr1	26939	0.0	1.0	1.0
+chr1	26967	3.0	1.0	4.0
+chr1	26980	1.0	0.0	1.0
+chr1	26988	1.0	0.0	1.0
+chr1	27000	1.0	0.0	1.0
+chr1	27003	1.0	0.0	1.0
+chr1	27026	0.0	3.0	3.0
+chr1	27029	0.0	1.0	1.0
+chr1	27037	1.0	0.0	1.0
+chr1	27047	1.0	0.0	1.0
+chr1	27063	0.0	1.0	1.0
+chr1	27066	0.0	3.0	3.0
+chr1	27067	0.0	1.0	1.0
+chr1	27081	1.0	0.0	1.0
+chr1	27096	1.0	0.0	1.0
+chr1	27115	1.0	0.0	1.0
+chr1	27119	1.0	0.0	1.0
+chr1	27123	1.0	0.0	1.0
+chr1	27135	0.0	2.0	2.0
+chr1	27165	1.0	0.0	1.0
+chr1	27304	1.0	0.0	1.0
+chr1	27324	0.0	1.0	1.0
+chr1	27349	0.0	1.0	1.0
+chr1	27412	1.0	0.0	1.0
+chr1	27478	0.0	1.0	1.0
+chr1	27484	0.0	1.0	1.0
+chr1	27522	1.0	0.0	1.0
+chr1	27543	0.0	1.0	1.0
+chr1	27554	2.0	0.0	2.0
+chr1	27566	0.0	1.0	1.0
+chr1	27650	0.0	1.0	1.0
+chr1	27706	0.0	2.0	2.0
+chr1	27742	1.0	0.0	1.0
+chr1	27839	0.0	1.0	1.0
+chr1	27869	1.0	0.0	1.0
+chr1	27937	0.0	1.0	1.0
+chr1	28308	0.0	1.0	1.0
+chr1	28471	1.0	0.0	1.0
+chr1	28492	1.0	0.0	1.0
+chr1	28498	1.0	0.0	1.0
+chr1	28502	1.0	0.0	1.0
+chr1	28506	1.0	0.0	1.0
+chr1	28507	1.0	0.0	1.0
+chr1	28511	0.0	1.0	1.0
+chr1	28769	1.0	0.0	1.0
+chr1	28799	1.0	0.0	1.0
+chr1	28824	0.0	1.0	1.0
+chr1	28869	1.0	0.0	1.0
+chr1	28879	0.0	1.0	1.0
+chr1	28941	1.0	0.0	1.0
+chr1	28942	1.0	0.0	1.0
+chr1	29341	0.0	1.0	1.0
+chr1	29359	1.0	0.0	1.0
+chr1	29375	1.0	0.0	1.0
+chr1	29499	0.0	1.0	1.0
+chr1	29513	1.0	0.0	1.0
+chr1	29580	0.0	1.0	1.0
+chr1	29668	2.0	0.0	2.0
+chr1	29676	1.0	0.0	1.0
+chr1	29681	0.0	1.0	1.0
+chr1	29693	1.0	0.0	1.0
+chr1	29696	4.0	0.0	4.0
+chr1	29701	0.0	1.0	1.0
+chr1	29702	0.0	2.0	2.0
+chr1	29703	0.0	1.0	1.0
+chr1	29709	3.0	0.0	3.0
+chr1	29713	1.0	0.0	1.0
+chr1	29715	1.0	0.0	1.0
+chr1	29716	0.0	1.0	1.0
+chr1	29719	1.0	0.0	1.0
+chr1	29721	1.0	0.0	1.0
+chr1	29723	1.0	0.0	1.0
+chr1	29956	0.0	1.0	1.0
+chr1	30033	0.0	1.0	1.0
+chr1	30166	0.0	1.0	1.0
+chr1	30219	0.0	1.0	1.0
+chr1	30289	1.0	0.0	1.0
+chr1	30293	1.0	0.0	1.0
+chr1	30379	1.0	0.0	1.0
+chr1	30391	0.0	2.0	2.0
+chr1	30409	0.0	1.0	1.0
+chr1	30430	0.0	1.0	1.0
+chr1	30454	1.0	0.0	1.0
+chr1	30464	0.0	1.0	1.0
+chr1	30488	2.0	0.0	2.0
+chr1	30661	0.0	1.0	1.0
+chr1	30662	2.0	0.0	2.0
+chr1	30700	1.0	0.0	1.0
+chr1	30707	0.0	1.0	1.0
+chr1	30715	1.0	0.0	1.0
+chr1	30893	1.0	2.0	3.0
+chr1	30894	2.0	0.0	2.0
+chr1	31097	2.0	0.0	2.0
+chr1	31175	0.0	1.0	1.0
+chr1	31216	2.0	0.0	2.0
+chr1	31359	0.0	1.0	1.0
+chr1	31368	1.0	0.0	1.0
+chr1	31369	0.0	1.0	1.0
+chr1	31400	0.0	1.0	1.0
+chr1	31542	0.0	1.0	1.0
+chr1	31547	0.0	2.0	2.0
+chr1	31554	0.0	1.0	1.0
+chr1	31583	1.0	0.0	1.0
+chr1	31589	1.0	0.0	1.0
+chr1	31705	0.0	1.0	1.0
+chr1	31735	1.0	0.0	1.0
+chr1	31736	2.0	0.0	2.0
+chr1	31752	1.0	0.0	1.0
+chr1	31767	1.0	0.0	1.0
+chr1	31779	1.0	0.0	1.0
+chr1	31811	1.0	0.0	1.0
+chr1	31814	1.0	0.0	1.0
+chr1	31822	2.0	0.0	2.0
+chr1	31837	1.0	0.0	1.0
+chr1	31875	0.0	1.0	1.0
+chr1	31903	1.0	0.0	1.0
+chr1	31925	1.0	0.0	1.0
+chr1	31933	1.0	0.0	1.0
+chr1	31947	0.0	1.0	1.0
+chr1	31959	1.0	0.0	1.0
+chr1	31995	0.0	1.0	1.0
+chr1	32011	1.0	0.0	1.0
+chr1	32067	1.0	0.0	1.0
+chr1	32086	0.0	1.0	1.0
+chr1	32096	2.0	0.0	2.0
+chr1	32101	1.0	0.0	1.0
+chr1	32152	1.0	0.0	1.0
+chr1	32187	0.0	2.0	2.0
+chr1	32232	0.0	2.0	2.0
+chr1	32237	1.0	0.0	1.0
+chr1	32255	0.0	1.0	1.0
+chr1	32267	2.0	0.0	2.0
+chr1	32278	1.0	0.0	1.0
+chr1	32316	1.0	0.0	1.0
+chr1	32373	0.0	1.0	1.0
+chr1	32410	0.0	1.0	1.0
+chr1	32412	2.0	0.0	2.0
+chr1	32477	0.0	1.0	1.0
+chr1	32492	0.0	2.0	2.0
+chr1	32494	1.0	0.0	1.0
+chr1	32497	1.0	0.0	1.0
+chr1	32502	1.0	0.0	1.0
+chr1	32503	1.0	0.0	1.0
+chr1	32505	1.0	0.0	1.0
+chr1	32514	1.0	1.0	2.0
+chr1	32518	1.0	1.0	2.0
+chr1	32524	1.0	0.0	1.0
+chr1	32553	0.0	1.0	1.0
+chr1	32575	0.0	1.0	1.0
+chr1	32580	0.0	1.0	1.0
+chr1	32607	0.0	2.0	2.0
+chr1	32647	1.0	0.0	1.0
+chr1	32695	1.0	0.0	1.0
+chr1	32697	1.0	0.0	1.0
+chr1	32709	1.0	0.0	1.0
+chr1	32718	1.0	0.0	1.0
+chr1	32739	3.0	0.0	3.0
+chr1	32744	1.0	0.0	1.0
+chr1	32886	0.0	1.0	1.0
+chr1	32888	1.0	0.0	1.0
+chr1	32890	0.0	1.0	1.0
+chr1	32893	0.0	1.0	1.0
+chr1	32895	0.0	1.0	1.0
+chr1	32896	0.0	3.0	3.0
+chr1	32902	2.0	0.0	2.0
+chr1	32908	0.0	1.0	1.0
+chr1	32921	1.0	1.0	2.0
+chr1	32922	2.0	0.0	2.0
+chr1	32925	1.0	0.0	1.0
+chr1	32926	3.0	0.0	3.0
+chr1	33159	0.0	1.0	1.0
+chr1	33189	0.0	1.0	1.0
+chr1	33197	0.0	3.0	3.0
+chr1	33198	0.0	1.0	1.0
+chr1	33199	1.0	0.0	1.0
+chr1	33207	1.0	0.0	1.0
+chr1	33210	2.0	1.0	3.0
+chr1	33212	2.0	0.0	2.0
+chr1	33213	0.0	1.0	1.0
+chr1	33214	0.0	3.0	3.0
+chr1	33218	4.0	0.0	4.0
+chr1	33222	0.0	1.0	1.0
+chr1	33224	0.0	1.0	1.0
+chr1	33230	2.0	0.0	2.0
+chr1	33238	0.0	2.0	2.0
+chr1	33239	1.0	0.0	1.0
+chr1	33242	0.0	1.0	1.0
+chr1	33245	2.0	0.0	2.0
+chr1	33246	2.0	0.0	2.0
+chr1	33253	1.0	0.0	1.0
+chr1	33254	0.0	1.0	1.0
+chr1	33268	0.0	1.0	1.0
+chr1	33269	1.0	1.0	2.0
+chr1	33297	0.0	1.0	1.0
+chr1	33555	0.0	1.0	1.0
+chr1	33563	1.0	0.0	1.0
+chr1	33575	1.0	0.0	1.0
+chr1	33597	0.0	1.0	1.0
+chr1	33721	1.0	0.0	1.0
+chr1	33727	1.0	0.0	1.0
+chr1	33741	0.0	1.0	1.0
+chr1	33759	1.0	0.0	1.0
+chr1	33771	0.0	1.0	1.0
+chr1	33875	1.0	0.0	1.0
+chr1	33910	0.0	1.0	1.0
+chr1	34028	0.0	1.0	1.0
+chr1	34040	1.0	0.0	1.0
+chr1	34041	0.0	1.0	1.0
+chr1	34058	0.0	1.0	1.0
+chr1	34109	1.0	0.0	1.0
+chr1	34165	1.0	0.0	1.0
+chr1	34178	1.0	0.0	1.0
+chr1	34298	1.0	0.0	1.0
+chr1	34314	1.0	0.0	1.0
+chr1	34327	0.0	1.0	1.0
+chr1	34372	1.0	0.0	1.0
+chr1	34392	1.0	0.0	1.0
+chr1	34418	1.0	0.0	1.0
+chr1	34443	1.0	0.0	1.0
+chr1	34454	0.0	1.0	1.0
+chr1	34473	2.0	0.0	2.0
+chr1	34635	0.0	1.0	1.0
+chr1	34679	0.0	1.0	1.0
+chr1	34701	1.0	0.0	1.0
+chr1	34721	3.0	0.0	3.0
+chr1	34722	0.0	1.0	1.0
+chr1	34768	0.0	1.0	1.0
+chr1	34845	0.0	1.0	1.0
+chr1	34865	0.0	1.0	1.0
+chr1	34869	0.0	1.0	1.0
+chr1	34881	4.0	0.0	4.0
+chr1	34973	1.0	0.0	1.0
+chr1	34991	1.0	0.0	1.0
+chr1	34992	2.0	0.0	2.0
+chr1	34996	0.0	1.0	1.0
+chr1	35001	0.0	1.0	1.0
+chr1	35042	0.0	1.0	1.0
+chr1	35051	1.0	0.0	1.0
+chr1	35059	0.0	1.0	1.0
+chr1	35062	0.0	1.0	1.0
+chr1	35171	3.0	0.0	3.0
+chr1	35194	1.0	0.0	1.0
+chr1	35215	1.0	0.0	1.0
+chr1	35218	0.0	1.0	1.0
+chr1	35219	0.0	1.0	1.0
+chr1	35230	1.0	0.0	1.0
+chr1	35232	0.0	4.0	4.0
+chr1	35236	0.0	1.0	1.0
+chr1	35239	1.0	0.0	1.0
+chr1	35244	0.0	1.0	1.0
+chr1	35253	0.0	2.0	2.0
+chr1	35348	0.0	1.0	1.0
+chr1	35401	1.0	0.0	1.0
+chr1	35415	1.0	0.0	1.0
+chr1	35462	1.0	0.0	1.0
+chr1	35550	1.0	0.0	1.0
+chr1	35566	0.0	1.0	1.0
+chr1	35570	0.0	1.0	1.0
+chr1	35586	1.0	0.0	1.0
+chr1	35592	0.0	1.0	1.0
+chr1	35603	1.0	0.0	1.0
+chr1	35681	1.0	0.0	1.0
+chr1	35691	0.0	1.0	1.0
+chr1	35698	0.0	1.0	1.0
+chr1	35699	0.0	1.0	1.0
+chr1	35701	0.0	1.0	1.0
+chr1	35705	0.0	3.0	3.0
+chr1	35712	1.0	0.0	1.0
+chr1	35726	1.0	0.0	1.0
+chr1	35855	0.0	4.0	4.0
+chr1	35971	1.0	0.0	1.0
+chr1	36146	0.0	1.0	1.0
+chr1	36158	0.0	1.0	1.0
+chr1	36184	1.0	0.0	1.0
+chr1	36273	0.0	1.0	1.0
+chr1	36295	2.0	0.0	2.0
+chr1	36301	2.0	0.0	2.0
+chr1	36308	0.0	1.0	1.0
+chr1	36312	2.0	0.0	2.0
+chr1	36322	1.0	0.0	1.0
+chr1	36343	0.0	1.0	1.0
+chr1	36544	0.0	1.0	1.0
+chr1	36571	1.0	0.0	1.0
+chr1	36573	0.0	2.0	2.0
+chr1	36574	0.0	2.0	2.0
+chr1	36579	0.0	1.0	1.0
+chr1	36582	0.0	1.0	1.0
+chr1	36584	1.0	0.0	1.0
+chr1	36586	2.0	1.0	3.0
+chr1	36588	0.0	4.0	4.0
+chr1	36591	0.0	6.0	6.0
+chr1	36595	0.0	1.0	1.0
+chr1	36601	0.0	1.0	1.0
+chr1	36605	2.0	0.0	2.0
+chr1	36608	0.0	1.0	1.0
+chr1	36609	1.0	0.0	1.0
+chr1	36613	0.0	1.0	1.0
+chr1	36622	1.0	0.0	1.0
+chr1	36740	0.0	2.0	2.0
+chr1	36748	0.0	1.0	1.0
+chr1	36750	1.0	0.0	1.0
+chr1	36869	0.0	1.0	1.0
+chr1	36881	0.0	1.0	1.0
+chr1	36882	0.0	1.0	1.0
+chr1	36932	1.0	0.0	1.0
+chr1	37003	1.0	0.0	1.0
+chr1	37159	1.0	0.0	1.0
+chr1	37191	1.0	0.0	1.0
+chr1	37407	0.0	1.0	1.0
+chr1	37409	0.0	1.0	1.0
+chr1	37433	1.0	0.0	1.0
+chr1	37434	1.0	0.0	1.0
+chr1	37437	0.0	1.0	1.0
+chr1	37441	3.0	0.0	3.0
+chr1	37447	1.0	0.0	1.0
+chr1	37450	1.0	0.0	1.0
+chr1	37451	0.0	1.0	1.0
+chr1	37458	1.0	0.0	1.0
+chr1	37459	0.0	3.0	3.0
+chr1	37464	0.0	1.0	1.0
+chr1	37468	0.0	3.0	3.0
+chr1	37469	0.0	1.0	1.0
+chr1	37501	0.0	1.0	1.0
+chr1	37504	1.0	0.0	1.0
+chr1	37574	0.0	1.0	1.0
+chr1	37601	0.0	1.0	1.0
+chr1	37607	1.0	0.0	1.0
+chr1	37621	1.0	0.0	1.0
+chr1	37628	0.0	2.0	2.0
+chr1	37635	0.0	1.0	1.0
+chr1	37640	0.0	2.0	2.0
+chr1	37655	2.0	0.0	2.0
+chr1	37659	0.0	2.0	2.0
+chr1	37663	2.0	0.0	2.0
+chr1	37666	2.0	0.0	2.0
+chr1	37670	0.0	2.0	2.0
+chr1	37734	0.0	1.0	1.0
+chr1	37787	0.0	1.0	1.0
+chr1	37803	0.0	2.0	2.0
+chr1	37849	1.0	0.0	1.0
+chr1	37867	0.0	1.0	1.0
+chr1	37888	1.0	0.0	1.0
+chr1	37921	0.0	1.0	1.0
+chr1	37967	1.0	0.0	1.0
+chr1	38122	1.0	0.0	1.0
+chr1	38281	1.0	0.0	1.0
+chr1	38291	1.0	0.0	1.0
+chr1	38309	0.0	2.0	2.0
+chr1	38311	1.0	0.0	1.0
+chr1	38642	1.0	0.0	1.0
+chr1	38654	0.0	1.0	1.0
+chr1	38717	0.0	1.0	1.0
+chr1	38784	1.0	0.0	1.0
+chr1	38802	0.0	1.0	1.0
+chr1	38814	2.0	1.0	3.0
+chr1	38965	3.0	0.0	3.0
+chr1	38967	1.0	0.0	1.0
+chr1	38974	0.0	1.0	1.0
+chr1	38982	1.0	0.0	1.0
+chr1	38983	1.0	0.0	1.0
+chr1	39231	0.0	1.0	1.0
+chr1	39232	2.0	0.0	2.0
+chr1	39240	0.0	1.0	1.0
+chr1	39243	2.0	0.0	2.0
+chr1	39244	0.0	2.0	2.0
+chr1	39246	1.0	0.0	1.0
+chr1	39249	1.0	0.0	1.0
+chr1	39254	0.0	1.0	1.0
+chr1	39255	0.0	1.0	1.0
+chr1	39261	0.0	5.0	5.0
+chr1	39262	0.0	1.0	1.0
+chr1	39263	2.0	3.0	5.0
+chr1	39265	3.0	0.0	3.0
+chr1	39267	1.0	0.0	1.0
+chr1	39268	1.0	0.0	1.0
+chr1	39270	0.0	1.0	1.0
+chr1	39273	0.0	1.0	1.0
+chr1	39274	0.0	4.0	4.0
+chr1	39275	0.0	1.0	1.0
+chr1	39278	1.0	1.0	2.0
+chr1	39279	2.0	0.0	2.0
+chr1	39284	0.0	4.0	4.0
+chr1	39288	3.0	0.0	3.0
+chr1	39291	0.0	2.0	2.0
+chr1	39292	1.0	0.0	1.0
+chr1	39294	1.0	0.0	1.0
+chr1	39298	1.0	0.0	1.0
+chr1	39320	0.0	1.0	1.0
+chr1	39327	1.0	0.0	1.0
+chr1	39408	1.0	0.0	1.0
+chr1	39422	0.0	1.0	1.0
+chr1	39431	1.0	0.0	1.0
+chr1	39433	0.0	1.0	1.0
+chr1	39439	1.0	0.0	1.0
+chr1	39442	0.0	1.0	1.0
+chr1	39443	1.0	0.0	1.0
+chr1	39598	1.0	1.0	2.0
+chr1	39740	0.0	1.0	1.0
+chr1	40293	1.0	0.0	1.0
+chr1	40402	1.0	0.0	1.0
+chr1	40797	0.0	1.0	1.0
+chr1	40962	0.0	1.0	1.0
+chr1	40973	1.0	0.0	1.0
+chr1	41199	0.0	1.0	1.0
+chr1	41356	1.0	0.0	1.0
+chr1	41740	0.0	1.0	1.0
+chr1	42180	1.0	0.0	1.0
+chr1	42189	0.0	1.0	1.0
+chr1	42192	0.0	1.0	1.0
+chr1	42203	0.0	2.0	2.0
+chr1	42210	1.0	0.0	1.0
+chr1	42218	0.0	2.0	2.0
+chr1	42221	1.0	0.0	1.0
+chr1	42222	0.0	1.0	1.0
+chr1	42223	0.0	3.0	3.0
+chr1	42224	1.0	0.0	1.0
+chr1	42226	0.0	1.0	1.0
+chr1	42228	1.0	0.0	1.0
+chr1	42231	1.0	0.0	1.0
+chr1	42234	1.0	0.0	1.0
+chr1	42247	1.0	0.0	1.0
+chr1	42252	1.0	0.0	1.0
+chr1	42268	1.0	0.0	1.0
+chr1	42388	1.0	1.0	2.0
+chr1	42392	0.0	1.0	1.0
+chr1	42393	2.0	0.0	2.0
+chr1	42401	1.0	0.0	1.0
+chr1	42420	0.0	1.0	1.0
+chr1	42431	0.0	1.0	1.0
+chr1	42451	0.0	3.0	3.0
+chr1	42500	0.0	1.0	1.0
+chr1	42514	0.0	1.0	1.0
+chr1	42571	0.0	2.0	2.0
+chr1	42582	1.0	0.0	1.0
+chr1	42677	1.0	0.0	1.0
+chr1	42887	0.0	1.0	1.0
+chr1	42894	1.0	0.0	1.0
+chr1	42896	0.0	1.0	1.0
+chr1	42919	0.0	3.0	3.0
+chr1	42922	0.0	1.0	1.0
+chr1	42939	2.0	0.0	2.0
+chr1	42953	0.0	2.0	2.0
+chr1	43034	1.0	0.0	1.0
+chr1	43066	0.0	1.0	1.0
+chr1	43072	2.0	0.0	2.0
+chr1	43074	1.0	0.0	1.0
+chr1	43080	0.0	1.0	1.0
+chr1	43088	2.0	2.0	4.0
+chr1	43113	2.0	0.0	2.0
+chr1	43118	1.0	0.0	1.0
+chr1	43122	0.0	1.0	1.0
+chr1	43131	1.0	3.0	4.0
+chr1	43139	0.0	1.0	1.0
+chr1	43150	1.0	0.0	1.0
+chr1	43158	1.0	0.0	1.0
+chr1	43166	0.0	1.0	1.0
+chr1	43187	1.0	0.0	1.0
+chr1	43226	1.0	0.0	1.0
+chr1	43237	5.0	1.0	6.0
+chr1	43239	0.0	1.0	1.0
+chr1	43243	0.0	1.0	1.0
+chr1	43244	1.0	0.0	1.0
+chr1	43246	2.0	1.0	3.0
+chr1	43247	0.0	1.0	1.0
+chr1	43250	2.0	0.0	2.0
+chr1	43260	3.0	0.0	3.0
+chr1	43268	0.0	1.0	1.0
+chr1	43271	2.0	0.0	2.0
+chr1	43273	1.0	0.0	1.0
+chr1	43274	0.0	1.0	1.0
+chr1	43275	0.0	1.0	1.0
+chr1	43280	0.0	1.0	1.0
+chr1	43281	1.0	0.0	1.0
+chr1	43282	1.0	0.0	1.0
+chr1	43285	1.0	1.0	2.0
+chr1	43300	3.0	1.0	4.0
+chr1	43309	0.0	1.0	1.0
+chr1	43313	1.0	0.0	1.0
+chr1	43317	0.0	1.0	1.0
+chr1	43431	0.0	1.0	1.0
+chr1	43440	0.0	1.0	1.0
+chr1	43461	2.0	0.0	2.0
+chr1	43470	1.0	0.0	1.0
+chr1	43474	1.0	0.0	1.0
+chr1	43475	1.0	0.0	1.0
+chr1	43480	0.0	1.0	1.0
+chr1	43481	0.0	4.0	4.0
+chr1	43482	1.0	0.0	1.0
+chr1	43483	0.0	2.0	2.0
+chr1	43484	1.0	0.0	1.0
+chr1	43485	0.0	2.0	2.0
+chr1	43489	2.0	0.0	2.0
+chr1	43498	1.0	0.0	1.0
+chr1	43504	1.0	0.0	1.0
+chr1	43506	1.0	0.0	1.0
+chr1	43513	2.0	0.0	2.0
+chr1	43519	0.0	1.0	1.0
+chr1	43529	0.0	1.0	1.0
+chr1	43531	0.0	1.0	1.0
+chr1	43543	0.0	3.0	3.0
+chr1	43545	0.0	1.0	1.0
+chr1	43556	1.0	0.0	1.0
+chr1	43573	2.0	0.0	2.0
+chr1	43579	1.0	0.0	1.0
+chr1	43583	1.0	0.0	1.0
+chr1	43604	2.0	0.0	2.0
+chr1	43644	0.0	5.0	5.0
+chr1	43645	0.0	1.0	1.0
+chr1	43652	0.0	1.0	1.0
+chr1	43657	0.0	1.0	1.0
+chr1	43685	1.0	0.0	1.0
+chr1	43687	0.0	1.0	1.0
+chr1	43705	1.0	0.0	1.0
+chr1	43740	0.0	1.0	1.0
+chr1	43781	0.0	1.0	1.0
+chr1	43800	0.0	1.0	1.0
+chr1	43801	0.0	1.0	1.0
+chr1	43810	1.0	0.0	1.0
+chr1	43814	0.0	1.0	1.0
+chr1	43829	0.0	1.0	1.0
+chr1	43981	0.0	1.0	1.0
+chr1	43987	1.0	0.0	1.0
+chr1	44035	0.0	1.0	1.0
+chr1	44190	1.0	0.0	1.0
+chr1	44254	1.0	0.0	1.0
+chr1	44291	0.0	1.0	1.0
+chr1	44415	1.0	0.0	1.0
+chr1	44443	3.0	0.0	3.0
+chr1	44608	0.0	2.0	2.0
+chr1	44644	1.0	0.0	1.0
+chr1	44646	1.0	0.0	1.0
+chr1	44652	1.0	0.0	1.0
+chr1	44682	0.0	2.0	2.0
+chr1	44807	0.0	1.0	1.0
+chr1	44808	0.0	1.0	1.0
+chr1	44825	1.0	0.0	1.0
+chr1	44826	1.0	0.0	1.0
+chr1	44850	0.0	1.0	1.0
+chr1	44977	1.0	0.0	1.0
+chr1	44987	1.0	0.0	1.0
+chr1	45017	1.0	0.0	1.0
+chr1	45146	0.0	1.0	1.0
+chr1	45147	0.0	1.0	1.0
+chr1	45151	0.0	2.0	2.0
+chr1	45152	0.0	1.0	1.0
+chr1	45153	2.0	0.0	2.0
+chr1	45164	1.0	0.0	1.0
+chr1	45166	2.0	0.0	2.0
+chr1	45170	1.0	0.0	1.0
+chr1	45174	0.0	1.0	1.0
+chr1	45175	1.0	0.0	1.0
+chr1	45176	2.0	4.0	6.0
+chr1	45177	0.0	4.0	4.0
+chr1	45182	0.0	1.0	1.0
+chr1	45190	1.0	0.0	1.0
+chr1	45192	0.0	3.0	3.0
+chr1	45199	1.0	0.0	1.0
+chr1	45208	1.0	0.0	1.0
+chr1	45776	1.0	0.0	1.0
+chr1	45797	1.0	0.0	1.0
+chr1	45964	0.0	1.0	1.0
+chr1	45965	0.0	1.0	1.0
+chr1	45967	1.0	0.0	1.0
+chr1	45968	1.0	0.0	1.0
+chr1	45969	2.0	0.0	2.0
+chr1	45971	0.0	2.0	2.0
+chr1	45973	1.0	0.0	1.0
+chr1	45978	0.0	1.0	1.0
+chr1	45986	1.0	0.0	1.0
+chr1	45988	0.0	1.0	1.0
+chr1	46146	0.0	1.0	1.0
+chr1	46279	1.0	0.0	1.0
+chr1	46305	1.0	0.0	1.0
+chr1	46334	1.0	0.0	1.0
+chr1	46440	1.0	0.0	1.0
+chr1	46650	1.0	0.0	1.0
+chr1	47801	1.0	0.0	1.0
+chr1	47920	1.0	0.0	1.0
+chr1	48030	0.0	1.0	1.0
+chr1	48517	1.0	0.0	1.0
+chr1	48524	1.0	0.0	1.0
+chr1	48528	1.0	0.0	1.0
+chr1	48550	1.0	0.0	1.0
+chr1	48552	0.0	1.0	1.0
+chr1	48555	1.0	0.0	1.0
+chr1	48557	0.0	1.0	1.0
+chr1	48558	0.0	3.0	3.0
+chr1	48562	1.0	0.0	1.0
+chr1	48572	0.0	1.0	1.0
+chr1	48573	1.0	0.0	1.0
+chr1	48574	5.0	0.0	5.0
+chr1	48580	1.0	0.0	1.0
+chr1	48584	1.0	0.0	1.0
+chr1	48585	1.0	1.0	2.0
+chr1	48586	0.0	2.0	2.0
+chr1	48587	2.0	1.0	3.0
+chr1	48593	0.0	1.0	1.0
+chr1	48595	1.0	0.0	1.0
+chr1	48598	1.0	0.0	1.0
+chr1	48602	0.0	5.0	5.0
+chr1	48603	0.0	1.0	1.0
+chr1	48604	0.0	1.0	1.0
+chr1	48618	1.0	0.0	1.0
+chr1	48619	3.0	0.0	3.0
+chr1	48665	1.0	0.0	1.0
+chr1	48753	1.0	0.0	1.0
+chr1	48763	0.0	1.0	1.0
+chr1	48766	1.0	0.0	1.0
+chr1	48797	1.0	0.0	1.0
+chr1	48824	0.0	1.0	1.0
+chr1	49402	2.0	0.0	2.0
+chr1	49542	2.0	0.0	2.0
+chr1	50054	1.0	0.0	1.0
+chr1	51273	2.0	0.0	2.0
+chr1	51278	2.0	0.0	2.0
+chr1	51346	1.0	0.0	1.0
+chr1	51411	1.0	0.0	1.0
+chr1	51425	1.0	0.0	1.0
+chr1	51558	0.0	1.0	1.0
+chr1	51865	0.0	1.0	1.0
+chr1	51910	0.0	1.0	1.0
+chr1	51920	0.0	1.0	1.0
+chr1	52013	1.0	0.0	1.0
+chr1	52080	0.0	1.0	1.0
+chr1	52103	0.0	1.0	1.0
+chr1	52123	1.0	0.0	1.0
+chr1	52192	0.0	1.0	1.0
+chr1	52252	1.0	0.0	1.0
+chr1	52367	1.0	0.0	1.0
+chr1	52421	1.0	0.0	1.0
+chr1	52425	0.0	2.0	2.0
+chr1	52426	0.0	1.0	1.0
+chr1	52439	1.0	0.0	1.0
+chr1	52441	0.0	1.0	1.0
+chr1	52527	0.0	1.0	1.0
+chr1	52566	0.0	1.0	1.0
+chr1	52567	0.0	1.0	1.0
+chr1	52569	0.0	2.0	2.0
+chr1	52582	0.0	2.0	2.0
+chr1	52583	1.0	0.0	1.0
+chr1	52584	1.0	0.0	1.0
+chr1	52588	1.0	1.0	2.0
+chr1	52596	3.0	1.0	4.0
+chr1	52597	0.0	1.0	1.0
+chr1	52598	1.0	0.0	1.0
+chr1	52618	0.0	1.0	1.0
+chr1	52620	1.0	0.0	1.0
+chr1	52621	0.0	1.0	1.0
+chr1	52857	2.0	0.0	2.0
+chr1	52858	1.0	0.0	1.0
+chr1	52870	0.0	1.0	1.0
+chr1	52873	0.0	1.0	1.0
+chr1	52877	0.0	2.0	2.0
+chr1	52881	2.0	0.0	2.0
+chr1	52890	1.0	0.0	1.0
+chr1	53027	0.0	1.0	1.0
+chr1	53028	0.0	2.0	2.0
+chr1	53037	0.0	1.0	1.0
+chr1	53047	0.0	1.0	1.0
+chr1	53048	0.0	1.0	1.0
+chr1	53054	0.0	1.0	1.0
+chr1	53057	1.0	0.0	1.0
+chr1	53058	1.0	0.0	1.0
+chr1	53070	1.0	0.0	1.0
+chr1	53071	1.0	0.0	1.0
+chr1	53374	1.0	0.0	1.0
+chr1	53383	0.0	1.0	1.0
+chr1	53539	1.0	0.0	1.0
+chr1	53646	1.0	0.0	1.0
+chr1	53827	0.0	1.0	1.0
+chr1	53894	1.0	0.0	1.0
+chr1	53979	1.0	0.0	1.0
+chr1	54053	0.0	1.0	1.0
+chr1	54074	1.0	0.0	1.0
+chr1	54161	1.0	0.0	1.0
+chr1	54201	0.0	1.0	1.0
+chr1	54230	0.0	2.0	2.0
+chr1	54245	0.0	1.0	1.0
+chr1	54249	1.0	0.0	1.0
+chr1	54264	1.0	0.0	1.0
+chr1	54398	0.0	1.0	1.0
+chr1	54402	0.0	1.0	1.0
+chr1	54412	1.0	0.0	1.0
+chr1	54414	1.0	0.0	1.0
+chr1	54426	1.0	0.0	1.0
+chr1	54430	1.0	0.0	1.0
+chr1	54440	1.0	0.0	1.0
+chr1	54560	0.0	1.0	1.0
+chr1	54573	1.0	0.0	1.0
+chr1	54574	0.0	1.0	1.0
+chr1	54575	1.0	0.0	1.0
+chr1	54576	0.0	1.0	1.0
+chr1	54590	0.0	1.0	1.0
+chr1	54594	1.0	0.0	1.0
+chr1	54596	0.0	1.0	1.0
+chr1	54615	1.0	0.0	1.0
+chr1	54713	0.0	1.0	1.0
+chr1	54716	0.0	2.0	2.0
+chr1	54717	1.0	0.0	1.0
+chr1	54727	1.0	0.0	1.0
+chr1	54732	3.0	0.0	3.0
+chr1	54734	0.0	3.0	3.0
+chr1	54737	1.0	0.0	1.0
+chr1	54739	0.0	1.0	1.0
+chr1	54740	0.0	1.0	1.0
+chr1	54762	1.0	1.0	2.0
+chr1	54763	0.0	1.0	1.0
+chr1	54778	2.0	0.0	2.0
+chr1	54780	1.0	0.0	1.0
+chr1	54784	1.0	0.0	1.0
+chr1	54801	1.0	0.0	1.0
+chr1	55004	1.0	0.0	1.0
+chr1	55110	0.0	1.0	1.0
+chr1	55125	1.0	0.0	1.0
+chr1	55132	0.0	1.0	1.0
+chr1	55141	0.0	1.0	1.0
+chr1	55148	0.0	1.0	1.0
+chr1	55347	1.0	0.0	1.0
+chr1	55731	0.0	1.0	1.0
+chr1	55968	0.0	1.0	1.0
+chr1	55989	1.0	0.0	1.0
+chr1	56006	1.0	0.0	1.0
+chr1	56133	1.0	0.0	1.0
+chr1	56152	0.0	1.0	1.0
+chr1	56282	0.0	1.0	1.0
+chr1	56307	0.0	1.0	1.0
+chr1	56312	1.0	0.0	1.0
+chr1	56321	1.0	0.0	1.0
+chr1	56484	0.0	1.0	1.0
+chr1	56497	1.0	0.0	1.0
+chr1	56498	0.0	1.0	1.0
+chr1	56605	0.0	2.0	2.0
+chr1	56624	1.0	0.0	1.0
+chr1	56628	1.0	2.0	3.0
+chr1	56658	0.0	2.0	2.0
+chr1	56664	1.0	0.0	1.0
+chr1	56677	0.0	1.0	1.0
+chr1	56768	0.0	1.0	1.0
+chr1	56789	0.0	1.0	1.0
+chr1	56791	0.0	1.0	1.0
+chr1	56799	1.0	0.0	1.0
+chr1	56800	0.0	1.0	1.0
+chr1	56801	0.0	1.0	1.0
+chr1	56804	1.0	0.0	1.0
+chr1	56805	3.0	0.0	3.0
+chr1	56810	0.0	1.0	1.0
+chr1	56813	0.0	4.0	4.0
+chr1	56814	2.0	0.0	2.0
+chr1	56817	0.0	2.0	2.0
+chr1	56818	1.0	0.0	1.0
+chr1	56819	0.0	2.0	2.0
+chr1	56820	0.0	1.0	1.0
+chr1	56821	1.0	1.0	2.0
+chr1	56822	1.0	1.0	2.0
+chr1	56825	4.0	1.0	5.0
+chr1	56826	2.0	1.0	3.0
+chr1	56832	1.0	0.0	1.0
+chr1	56833	1.0	1.0	2.0
+chr1	56839	0.0	1.0	1.0
+chr1	56840	1.0	0.0	1.0
+chr1	56843	2.0	0.0	2.0
+chr1	56859	2.0	0.0	2.0
+chr1	57019	1.0	0.0	1.0
+chr1	57020	1.0	0.0	1.0
+chr1	57022	0.0	1.0	1.0
+chr1	57034	0.0	1.0	1.0
+chr1	57036	2.0	2.0	4.0
+chr1	57037	2.0	1.0	3.0
+chr1	57038	5.0	0.0	5.0
+chr1	57045	0.0	1.0	1.0
+chr1	57046	0.0	1.0	1.0
+chr1	57049	1.0	0.0	1.0
+chr1	57063	1.0	1.0	2.0
+chr1	57072	1.0	0.0	1.0
+chr1	57074	1.0	0.0	1.0
+chr1	57105	1.0	0.0	1.0
+chr1	57155	0.0	1.0	1.0
+chr1	57166	0.0	1.0	1.0
+chr1	57168	0.0	1.0	1.0
+chr1	57172	1.0	0.0	1.0
+chr1	57187	1.0	0.0	1.0
+chr1	57188	0.0	1.0	1.0
+chr1	57189	1.0	1.0	2.0
+chr1	57192	1.0	0.0	1.0
+chr1	57197	1.0	0.0	1.0
+chr1	57208	0.0	2.0	2.0
+chr1	57322	0.0	1.0	1.0
+chr1	57328	2.0	2.0	4.0
+chr1	57330	1.0	0.0	1.0
+chr1	57335	0.0	1.0	1.0
+chr1	57336	1.0	0.0	1.0
+chr1	57337	2.0	0.0	2.0
+chr1	57339	2.0	0.0	2.0
+chr1	57340	0.0	4.0	4.0
+chr1	57341	1.0	0.0	1.0
+chr1	57342	1.0	0.0	1.0
+chr1	57351	0.0	1.0	1.0
+chr1	57357	0.0	1.0	1.0
+chr1	57358	1.0	0.0	1.0
+chr1	57360	0.0	1.0	1.0
+chr1	57369	0.0	4.0	4.0
+chr1	57372	0.0	1.0	1.0
+chr1	57379	1.0	0.0	1.0
+chr1	57380	1.0	0.0	1.0
+chr1	57523	0.0	1.0	1.0
+chr1	57546	0.0	1.0	1.0
+chr1	57548	2.0	1.0	3.0
+chr1	57555	0.0	1.0	1.0
+chr1	57556	0.0	1.0	1.0
+chr1	57559	0.0	1.0	1.0
+chr1	57563	0.0	1.0	1.0
+chr1	57564	2.0	0.0	2.0
+chr1	57565	0.0	1.0	1.0
+chr1	57567	2.0	7.0	9.0
+chr1	57568	0.0	4.0	4.0
+chr1	57584	1.0	0.0	1.0
+chr1	57586	1.0	0.0	1.0
+chr1	57593	1.0	0.0	1.0
+chr1	57687	1.0	1.0	2.0
+chr1	57692	0.0	1.0	1.0
+chr1	57703	1.0	0.0	1.0
+chr1	57719	0.0	1.0	1.0
+chr1	57727	0.0	1.0	1.0
+chr1	57732	0.0	1.0	1.0
+chr1	57741	0.0	2.0	2.0
+chr1	57747	2.0	0.0	2.0
+chr1	57752	1.0	0.0	1.0
+chr1	57759	0.0	1.0	1.0
+chr1	57768	0.0	1.0	1.0
+chr1	57830	0.0	1.0	1.0
+chr1	57944	0.0	1.0	1.0
+chr1	58035	0.0	2.0	2.0
+chr1	58070	1.0	0.0	1.0
+chr1	58082	0.0	2.0	2.0
+chr1	58094	1.0	0.0	1.0
+chr1	58095	1.0	0.0	1.0
+chr1	58101	1.0	0.0	1.0
+chr1	58221	1.0	0.0	1.0
+chr1	58228	1.0	0.0	1.0
+chr1	58235	1.0	0.0	1.0
+chr1	58253	1.0	0.0	1.0
+chr1	58257	0.0	1.0	1.0
+chr1	58259	1.0	0.0	1.0
+chr1	58262	0.0	1.0	1.0
+chr1	58265	1.0	0.0	1.0
+chr1	58276	0.0	1.0	1.0
+chr1	58281	0.0	1.0	1.0
+chr1	58296	0.0	1.0	1.0
+chr1	58403	1.0	1.0	2.0
+chr1	58409	1.0	0.0	1.0
+chr1	58416	0.0	1.0	1.0
+chr1	58425	2.0	1.0	3.0
+chr1	58430	0.0	2.0	2.0
+chr1	58431	0.0	1.0	1.0
+chr1	58434	1.0	1.0	2.0
+chr1	58435	1.0	0.0	1.0
+chr1	58439	1.0	0.0	1.0
+chr1	58449	3.0	0.0	3.0
+chr1	58452	0.0	2.0	2.0
+chr1	58453	2.0	0.0	2.0
+chr1	58470	0.0	1.0	1.0
+chr1	58488	1.0	0.0	1.0
+chr1	58669	1.0	0.0	1.0
+chr1	58689	0.0	1.0	1.0
+chr1	58704	0.0	1.0	1.0
+chr1	58719	0.0	1.0	1.0
+chr1	58722	1.0	0.0	1.0
+chr1	58727	0.0	1.0	1.0
+chr1	58738	0.0	1.0	1.0
+chr1	58817	0.0	1.0	1.0
+chr1	58841	0.0	1.0	1.0
+chr1	58897	0.0	1.0	1.0
+chr1	59078	0.0	1.0	1.0
+chr1	59172	1.0	0.0	1.0
+chr1	59221	0.0	1.0	1.0
+chr1	59394	0.0	1.0	1.0
+chr1	59551	1.0	0.0	1.0
+chr1	59782	1.0	0.0	1.0
+chr1	60021	0.0	1.0	1.0
+chr1	60218	0.0	1.0	1.0
+chr1	60366	1.0	0.0	1.0
+chr1	60684	2.0	0.0	2.0
+chr1	60841	1.0	0.0	1.0
+chr1	60851	1.0	0.0	1.0
+chr1	60857	0.0	1.0	1.0
+chr1	60862	0.0	1.0	1.0
+chr1	60890	0.0	1.0	1.0
+chr1	60996	1.0	0.0	1.0
+chr1	61008	1.0	0.0	1.0
+chr1	61010	2.0	1.0	3.0
+chr1	61016	1.0	0.0	1.0
+chr1	61017	3.0	0.0	3.0
+chr1	61018	0.0	1.0	1.0
+chr1	61019	0.0	1.0	1.0
+chr1	61020	1.0	0.0	1.0
+chr1	61021	1.0	0.0	1.0
+chr1	61023	1.0	0.0	1.0
+chr1	61024	6.0	0.0	6.0
+chr1	61026	0.0	3.0	3.0
+chr1	61027	1.0	3.0	4.0
+chr1	61028	1.0	0.0	1.0
+chr1	61029	0.0	2.0	2.0
+chr1	61031	0.0	1.0	1.0
+chr1	61032	0.0	1.0	1.0
+chr1	61034	0.0	3.0	3.0
+chr1	61037	1.0	0.0	1.0
+chr1	61038	1.0	2.0	3.0
+chr1	61039	2.0	1.0	3.0
+chr1	61041	0.0	3.0	3.0
+chr1	61048	1.0	0.0	1.0
+chr1	61050	0.0	1.0	1.0
+chr1	61071	1.0	0.0	1.0
+chr1	61100	1.0	0.0	1.0
+chr1	61289	1.0	0.0	1.0
+chr1	61311	3.0	0.0	3.0
+chr1	61316	3.0	0.0	3.0
+chr1	61320	1.0	0.0	1.0
+chr1	61326	0.0	1.0	1.0
+chr1	61327	1.0	1.0	2.0
+chr1	61331	0.0	3.0	3.0
+chr1	61333	0.0	2.0	2.0
+chr1	61334	0.0	3.0	3.0
+chr1	61335	0.0	2.0	2.0
+chr1	61336	3.0	0.0	3.0
+chr1	61337	4.0	0.0	4.0
+chr1	61339	2.0	0.0	2.0
+chr1	61340	2.0	0.0	2.0
+chr1	61345	1.0	0.0	1.0
+chr1	61346	0.0	2.0	2.0
+chr1	61348	1.0	0.0	1.0
+chr1	61355	0.0	1.0	1.0
+chr1	61356	0.0	1.0	1.0
+chr1	61357	0.0	1.0	1.0
+chr1	61362	1.0	0.0	1.0
+chr1	61449	0.0	1.0	1.0
+chr1	61450	0.0	1.0	1.0
+chr1	61451	0.0	1.0	1.0
+chr1	61459	0.0	1.0	1.0
+chr1	61467	0.0	1.0	1.0
+chr1	61493	2.0	1.0	3.0
+chr1	61497	0.0	1.0	1.0
+chr1	61508	3.0	0.0	3.0
+chr1	61509	0.0	1.0	1.0
+chr1	61514	0.0	1.0	1.0
+chr1	61618	0.0	1.0	1.0
+chr1	61642	0.0	1.0	1.0
+chr1	61650	1.0	0.0	1.0
+chr1	61806	2.0	0.0	2.0
+chr1	62194	0.0	1.0	1.0
+chr1	62345	0.0	1.0	1.0
+chr1	62489	0.0	1.0	1.0
+chr1	62502	1.0	0.0	1.0
+chr1	62507	0.0	5.0	5.0
+chr1	62513	1.0	0.0	1.0
+chr1	62527	0.0	1.0	1.0
+chr1	62534	1.0	1.0	2.0
+chr1	62538	1.0	0.0	1.0
+chr1	62539	2.0	0.0	2.0
+chr1	62542	2.0	0.0	2.0
+chr1	62594	1.0	0.0	1.0
+chr1	62787	0.0	1.0	1.0
+chr1	62789	1.0	0.0	1.0
+chr1	62799	2.0	0.0	2.0
+chr1	62800	0.0	2.0	2.0
+chr1	62803	1.0	1.0	2.0
+chr1	62805	0.0	2.0	2.0
+chr1	62806	2.0	0.0	2.0
+chr1	62807	2.0	0.0	2.0
+chr1	62809	4.0	0.0	4.0
+chr1	62811	0.0	1.0	1.0
+chr1	62812	0.0	3.0	3.0
+chr1	62815	1.0	0.0	1.0
+chr1	62816	0.0	5.0	5.0
+chr1	62817	0.0	1.0	1.0
+chr1	62819	3.0	0.0	3.0
+chr1	62821	1.0	2.0	3.0
+chr1	62826	3.0	1.0	4.0
+chr1	62827	2.0	0.0	2.0
+chr1	62830	1.0	0.0	1.0
+chr1	62831	1.0	0.0	1.0
+chr1	62833	0.0	4.0	4.0
+chr1	62834	0.0	2.0	2.0
+chr1	62846	0.0	1.0	1.0
+chr1	62852	0.0	1.0	1.0
+chr1	62951	1.0	0.0	1.0
+chr1	62953	1.0	1.0	2.0
+chr1	62974	1.0	0.0	1.0
+chr1	63001	0.0	1.0	1.0
+chr1	63116	0.0	1.0	1.0
+chr1	63134	1.0	0.0	1.0
+chr1	63155	0.0	1.0	1.0
+chr1	63159	1.0	0.0	1.0
+chr1	63194	1.0	0.0	1.0
+chr1	63289	1.0	0.0	1.0
+chr1	63325	0.0	1.0	1.0
+chr1	63481	0.0	1.0	1.0
+chr1	63490	0.0	1.0	1.0
+chr1	63496	1.0	0.0	1.0
+chr1	63595	0.0	1.0	1.0
+chr1	63916	0.0	1.0	1.0
+chr1	63951	1.0	0.0	1.0
+chr1	64089	0.0	1.0	1.0
+chr1	64405	1.0	0.0	1.0
+chr1	64531	0.0	1.0	1.0
+chr1	64912	0.0	1.0	1.0
+chr1	64950	1.0	0.0	1.0
+chr1	65034	1.0	0.0	1.0
+chr1	66032	1.0	0.0	1.0
+chr1	66206	1.0	0.0	1.0
+chr1	66338	2.0	0.0	2.0
+chr1	66968	0.0	1.0	1.0
+chr1	66997	0.0	1.0	1.0
+chr1	67137	0.0	1.0	1.0
+chr1	67193	1.0	0.0	1.0
+chr1	67316	0.0	2.0	2.0
+chr1	67489	0.0	1.0	1.0
+chr1	67655	1.0	0.0	1.0
+chr1	67752	1.0	0.0	1.0
+chr1	67849	1.0	0.0	1.0
+chr1	68006	0.0	1.0	1.0
+chr1	68037	1.0	0.0	1.0
+chr1	68041	1.0	0.0	1.0
+chr1	68227	0.0	2.0	2.0
+chr1	68272	2.0	0.0	2.0
+chr1	68293	0.0	1.0	1.0
+chr1	68706	1.0	0.0	1.0
+chr1	68707	1.0	0.0	1.0
+chr1	68715	1.0	0.0	1.0
+chr1	68873	4.0	0.0	4.0
+chr1	68901	0.0	1.0	1.0
+chr1	68907	1.0	0.0	1.0
+chr1	68962	1.0	0.0	1.0
+chr1	68993	1.0	0.0	1.0
+chr1	69040	1.0	0.0	1.0
+chr1	69064	0.0	1.0	1.0
+chr1	69189	0.0	1.0	1.0
+chr1	69212	2.0	0.0	2.0
+chr1	69240	1.0	0.0	1.0
+chr1	69298	1.0	0.0	1.0
+chr1	69350	1.0	0.0	1.0
+chr1	69394	1.0	0.0	1.0
+chr1	69452	0.0	1.0	1.0
+chr1	69469	1.0	0.0	1.0
+chr1	69512	0.0	1.0	1.0
+chr1	69513	0.0	4.0	4.0
+chr1	69517	1.0	0.0	1.0
+chr1	69519	1.0	0.0	1.0
+chr1	69528	1.0	0.0	1.0
+chr1	69529	0.0	1.0	1.0
+chr1	69530	2.0	0.0	2.0
+chr1	69533	1.0	0.0	1.0
+chr1	69537	0.0	2.0	2.0
+chr1	69540	1.0	0.0	1.0
+chr1	69541	1.0	0.0	1.0
+chr1	69542	0.0	1.0	1.0
+chr1	69545	0.0	1.0	1.0
+chr1	69935	1.0	0.0	1.0
+chr1	69945	0.0	1.0	1.0
+chr1	69958	0.0	1.0	1.0
+chr1	69974	0.0	1.0	1.0
+chr1	69980	3.0	0.0	3.0
+chr1	69983	0.0	2.0	2.0
+chr1	70002	1.0	0.0	1.0
+chr1	70015	0.0	1.0	1.0
+chr1	70031	1.0	0.0	1.0
+chr1	70089	0.0	1.0	1.0
+chr1	70111	0.0	1.0	1.0
+chr1	70137	0.0	1.0	1.0
+chr1	70275	0.0	2.0	2.0
+chr1	70292	0.0	1.0	1.0
+chr1	70293	0.0	1.0	1.0
+chr1	70298	0.0	1.0	1.0
+chr1	70313	0.0	2.0	2.0
+chr1	71447	1.0	0.0	1.0
+chr1	71601	0.0	1.0	1.0
+chr1	71817	0.0	1.0	1.0
+chr1	71822	1.0	0.0	1.0
+chr1	73055	1.0	0.0	1.0
+chr1	73611	0.0	1.0	1.0
+chr1	73618	1.0	0.0	1.0
+chr1	73653	2.0	0.0	2.0
+chr1	73662	0.0	1.0	1.0
+chr1	73714	1.0	0.0	1.0
+chr1	73837	0.0	1.0	1.0
+chr1	73867	1.0	0.0	1.0
+chr1	73870	1.0	0.0	1.0
+chr1	73881	2.0	0.0	2.0
+chr1	73886	1.0	0.0	1.0
+chr1	73888	0.0	1.0	1.0
+chr1	73889	1.0	2.0	3.0
+chr1	73894	1.0	0.0	1.0
+chr1	73907	1.0	0.0	1.0
+chr1	74036	0.0	1.0	1.0
+chr1	74050	0.0	1.0	1.0
+chr1	74052	4.0	0.0	4.0
+chr1	74054	1.0	0.0	1.0
+chr1	74061	0.0	1.0	1.0
+chr1	74065	1.0	0.0	1.0
+chr1	74187	0.0	1.0	1.0
+chr1	74208	1.0	0.0	1.0
+chr1	74210	0.0	2.0	2.0
+chr1	74231	2.0	0.0	2.0
+chr1	74246	1.0	0.0	1.0
+chr1	74247	1.0	0.0	1.0
+chr1	74249	0.0	1.0	1.0
+chr1	74280	2.0	0.0	2.0
+chr1	74406	0.0	1.0	1.0
+chr1	74408	0.0	2.0	2.0
+chr1	74411	0.0	1.0	1.0
+chr1	74418	0.0	2.0	2.0
+chr1	74421	0.0	1.0	1.0
+chr1	74426	0.0	1.0	1.0
+chr1	74433	0.0	1.0	1.0
+chr1	74613	1.0	0.0	1.0
+chr1	74633	0.0	1.0	1.0
+chr1	74715	0.0	1.0	1.0
+chr1	74729	1.0	0.0	1.0
+chr1	74749	0.0	1.0	1.0
+chr1	74758	1.0	0.0	1.0
+chr1	74768	0.0	1.0	1.0
+chr1	75107	1.0	0.0	1.0
+chr1	75169	0.0	2.0	2.0
+chr1	75303	0.0	1.0	1.0
+chr1	75501	0.0	1.0	1.0
+chr1	75526	0.0	1.0	1.0
+chr1	75790	0.0	1.0	1.0
+chr1	75808	0.0	1.0	1.0
+chr1	75823	1.0	0.0	1.0
+chr1	75830	0.0	1.0	1.0
+chr1	75869	0.0	1.0	1.0
+chr1	75946	1.0	0.0	1.0
+chr1	75980	0.0	1.0	1.0
+chr1	75981	0.0	2.0	2.0
+chr1	75990	1.0	0.0	1.0
+chr1	75998	0.0	2.0	2.0
+chr1	76125	0.0	2.0	2.0
+chr1	76134	0.0	2.0	2.0
+chr1	76138	2.0	3.0	5.0
+chr1	76143	0.0	1.0	1.0
+chr1	76144	1.0	0.0	1.0
+chr1	76145	1.0	0.0	1.0
+chr1	76146	2.0	0.0	2.0
+chr1	76147	2.0	0.0	2.0
+chr1	76150	0.0	1.0	1.0
+chr1	76151	0.0	3.0	3.0
+chr1	76152	2.0	0.0	2.0
+chr1	76154	1.0	2.0	3.0
+chr1	76155	3.0	0.0	3.0
+chr1	76156	0.0	2.0	2.0
+chr1	76157	1.0	0.0	1.0
+chr1	76161	0.0	2.0	2.0
+chr1	76162	0.0	4.0	4.0
+chr1	76163	1.0	7.0	8.0
+chr1	76170	1.0	0.0	1.0
+chr1	76171	1.0	1.0	2.0
+chr1	76174	0.0	1.0	1.0
+chr1	76175	0.0	2.0	2.0
+chr1	76192	0.0	1.0	1.0
+chr1	76409	0.0	1.0	1.0
+chr1	76414	1.0	0.0	1.0
+chr1	76427	1.0	0.0	1.0
+chr1	76436	0.0	1.0	1.0
+chr1	76438	2.0	0.0	2.0
+chr1	76439	3.0	0.0	3.0
+chr1	76441	3.0	0.0	3.0
+chr1	76446	1.0	0.0	1.0
+chr1	76447	4.0	0.0	4.0
+chr1	76448	0.0	1.0	1.0
+chr1	76451	1.0	0.0	1.0
+chr1	76453	0.0	9.0	9.0
+chr1	76454	0.0	2.0	2.0
+chr1	76457	1.0	0.0	1.0
+chr1	76459	1.0	0.0	1.0
+chr1	76460	0.0	1.0	1.0
+chr1	76462	0.0	1.0	1.0
+chr1	76602	0.0	1.0	1.0
+chr1	76743	0.0	1.0	1.0
+chr1	76754	1.0	0.0	1.0
+chr1	76769	1.0	1.0	2.0
+chr1	77480	1.0	0.0	1.0
+chr1	77843	0.0	1.0	1.0
+chr1	78597	0.0	1.0	1.0
+chr1	78768	0.0	1.0	1.0
+chr1	79434	0.0	1.0	1.0
+chr1	79706	0.0	1.0	1.0
+chr1	79710	1.0	0.0	1.0
+chr1	79720	0.0	3.0	3.0
+chr1	79722	0.0	1.0	1.0
+chr1	79723	0.0	2.0	2.0
+chr1	79724	1.0	0.0	1.0
+chr1	79725	1.0	0.0	1.0
+chr1	79726	1.0	0.0	1.0
+chr1	79729	2.0	1.0	3.0
+chr1	79737	0.0	4.0	4.0
+chr1	79738	2.0	1.0	3.0
+chr1	79739	5.0	2.0	7.0
+chr1	79740	1.0	0.0	1.0
+chr1	79744	0.0	3.0	3.0
+chr1	79754	0.0	1.0	1.0
+chr1	79755	2.0	0.0	2.0
+chr1	79756	1.0	0.0	1.0
+chr1	79793	1.0	0.0	1.0
+chr1	79844	0.0	1.0	1.0
+chr1	79863	0.0	2.0	2.0
+chr1	79893	0.0	1.0	1.0
+chr1	79894	1.0	0.0	1.0
+chr1	79899	0.0	1.0	1.0
+chr1	79901	3.0	0.0	3.0
+chr1	79916	2.0	0.0	2.0
+chr1	79920	0.0	1.0	1.0
+chr1	79932	1.0	0.0	1.0
+chr1	79936	6.0	0.0	6.0
+chr1	80052	0.0	1.0	1.0
+chr1	80086	1.0	0.0	1.0
+chr1	80087	1.0	0.0	1.0
+chr1	80099	0.0	1.0	1.0
+chr1	80111	0.0	1.0	1.0
+chr1	80161	0.0	1.0	1.0
+chr1	80394	0.0	1.0	1.0
+chr1	80397	0.0	1.0	1.0
+chr1	80443	2.0	0.0	2.0
+chr1	80553	2.0	0.0	2.0
+chr1	80804	1.0	0.0	1.0
+chr1	80858	1.0	0.0	1.0
+chr1	80868	0.0	1.0	1.0
+chr1	80942	0.0	1.0	1.0
+chr1	81040	0.0	1.0	1.0
+chr1	81163	1.0	0.0	1.0
+chr1	81171	0.0	1.0	1.0
+chr1	81971	0.0	2.0	2.0
+chr1	81974	0.0	1.0	1.0
+chr1	81985	0.0	1.0	1.0
+chr1	82178	1.0	0.0	1.0
+chr1	82210	0.0	1.0	1.0
+chr1	82236	1.0	0.0	1.0
+chr1	82239	0.0	1.0	1.0
+chr1	82242	0.0	1.0	1.0
+chr1	82272	1.0	0.0	1.0
+chr1	82330	0.0	1.0	1.0
+chr1	82335	0.0	1.0	1.0
+chr1	82349	0.0	1.0	1.0
+chr1	82367	0.0	1.0	1.0
+chr1	82375	1.0	3.0	4.0
+chr1	82504	8.0	0.0	8.0
+chr1	82507	0.0	1.0	1.0
+chr1	82511	0.0	3.0	3.0
+chr1	82513	0.0	1.0	1.0
+chr1	82514	2.0	4.0	6.0
+chr1	82515	1.0	0.0	1.0
+chr1	82521	0.0	1.0	1.0
+chr1	82522	1.0	0.0	1.0
+chr1	82525	1.0	0.0	1.0
+chr1	82528	2.0	0.0	2.0
+chr1	82541	6.0	0.0	6.0
+chr1	82542	1.0	1.0	2.0
+chr1	82549	0.0	1.0	1.0
+chr1	82553	1.0	0.0	1.0
+chr1	82556	1.0	0.0	1.0
+chr1	82558	0.0	1.0	1.0
+chr1	82559	0.0	1.0	1.0
+chr1	82561	1.0	0.0	1.0
+chr1	82564	1.0	0.0	1.0
+chr1	82576	1.0	0.0	1.0
+chr1	82578	1.0	0.0	1.0
+chr1	82725	0.0	1.0	1.0
+chr1	82738	0.0	1.0	1.0
+chr1	82747	0.0	1.0	1.0
+chr1	82754	3.0	0.0	3.0
+chr1	82758	0.0	1.0	1.0
+chr1	82761	0.0	2.0	2.0
+chr1	82766	0.0	5.0	5.0
+chr1	82767	0.0	4.0	4.0
+chr1	82768	0.0	1.0	1.0
+chr1	82770	1.0	0.0	1.0
+chr1	82782	0.0	1.0	1.0
+chr1	82788	0.0	1.0	1.0
+chr1	82792	1.0	0.0	1.0
+chr1	82803	1.0	0.0	1.0
+chr1	82810	1.0	0.0	1.0
+chr1	82900	0.0	1.0	1.0
+chr1	82909	1.0	0.0	1.0
+chr1	82916	6.0	0.0	6.0
+chr1	82917	0.0	1.0	1.0
+chr1	82918	0.0	1.0	1.0
+chr1	82931	1.0	0.0	1.0
+chr1	82935	1.0	0.0	1.0
+chr1	83035	1.0	0.0	1.0
+chr1	83069	1.0	0.0	1.0
+chr1	83081	1.0	0.0	1.0
+chr1	83296	0.0	1.0	1.0
+chr1	83354	0.0	1.0	1.0
+chr1	83392	0.0	1.0	1.0
+chr1	83434	1.0	0.0	1.0
+chr1	83451	1.0	0.0	1.0
+chr1	83453	0.0	1.0	1.0
+chr1	83609	0.0	1.0	1.0
+chr1	83620	0.0	1.0	1.0
+chr1	83644	1.0	0.0	1.0
+chr1	83670	1.0	0.0	1.0
+chr1	83772	1.0	0.0	1.0
+chr1	83940	0.0	1.0	1.0
+chr1	83959	1.0	0.0	1.0
+chr1	84086	0.0	2.0	2.0
+chr1	84088	1.0	0.0	1.0
+chr1	84105	2.0	0.0	2.0
+chr1	84106	0.0	1.0	1.0
+chr1	84107	0.0	1.0	1.0
+chr1	84112	2.0	0.0	2.0
+chr1	84133	1.0	0.0	1.0
+chr1	84252	0.0	2.0	2.0
+chr1	84253	1.0	0.0	1.0
+chr1	84262	1.0	0.0	1.0
+chr1	84264	0.0	2.0	2.0
+chr1	84271	0.0	3.0	3.0
+chr1	84272	1.0	0.0	1.0
+chr1	84276	1.0	0.0	1.0
+chr1	84287	0.0	1.0	1.0
+chr1	84288	0.0	1.0	1.0
+chr1	84293	0.0	1.0	1.0
+chr1	84294	1.0	1.0	2.0
+chr1	84338	1.0	0.0	1.0
+chr1	84364	1.0	0.0	1.0
+chr1	84401	1.0	0.0	1.0
+chr1	84402	1.0	1.0	2.0
+chr1	84421	0.0	1.0	1.0
+chr1	84424	2.0	0.0	2.0
+chr1	84427	2.0	0.0	2.0
+chr1	84433	0.0	1.0	1.0
+chr1	84435	2.0	0.0	2.0
+chr1	84436	1.0	0.0	1.0
+chr1	84438	0.0	2.0	2.0
+chr1	84440	1.0	0.0	1.0
+chr1	84441	1.0	0.0	1.0
+chr1	84442	2.0	0.0	2.0
+chr1	84443	4.0	0.0	4.0
+chr1	84444	6.0	0.0	6.0
+chr1	84447	0.0	3.0	3.0
+chr1	84450	0.0	2.0	2.0
+chr1	84451	2.0	0.0	2.0
+chr1	84454	0.0	13.0	13.0
+chr1	84455	0.0	1.0	1.0
+chr1	84456	1.0	2.0	3.0
+chr1	84458	0.0	1.0	1.0
+chr1	84463	2.0	4.0	6.0
+chr1	84464	4.0	3.0	7.0
+chr1	84465	2.0	0.0	2.0
+chr1	84474	0.0	1.0	1.0
+chr1	84475	1.0	0.0	1.0
+chr1	84477	0.0	1.0	1.0
+chr1	84517	2.0	0.0	2.0
+chr1	84889	1.0	0.0	1.0
+chr1	84900	1.0	0.0	1.0
+chr1	85049	0.0	1.0	1.0
+chr1	85075	1.0	0.0	1.0
+chr1	85218	1.0	0.0	1.0
+chr1	85362	1.0	0.0	1.0
+chr1	85571	0.0	1.0	1.0
+chr1	85588	1.0	0.0	1.0
+chr1	85632	1.0	0.0	1.0
+chr1	85723	1.0	0.0	1.0
+chr1	85909	0.0	1.0	1.0
+chr1	86044	0.0	1.0	1.0
+chr1	86051	0.0	1.0	1.0
+chr1	86065	0.0	1.0	1.0
+chr1	86227	1.0	0.0	1.0
+chr1	86343	0.0	1.0	1.0
+chr1	86515	1.0	0.0	1.0
+chr1	86668	0.0	1.0	1.0
+chr1	86690	0.0	1.0	1.0
+chr1	86697	1.0	0.0	1.0
+chr1	86702	1.0	0.0	1.0
+chr1	86705	1.0	0.0	1.0
+chr1	86707	0.0	1.0	1.0
+chr1	86709	0.0	2.0	2.0
+chr1	86838	0.0	1.0	1.0
+chr1	86844	0.0	1.0	1.0
+chr1	86882	0.0	2.0	2.0
+chr1	86975	0.0	3.0	3.0
+chr1	86978	1.0	0.0	1.0
+chr1	86994	0.0	2.0	2.0
+chr1	86999	0.0	2.0	2.0
+chr1	87005	0.0	1.0	1.0
+chr1	87008	1.0	0.0	1.0
+chr1	87009	0.0	1.0	1.0
+chr1	87010	1.0	0.0	1.0
+chr1	87011	3.0	0.0	3.0
+chr1	87012	6.0	2.0	8.0
+chr1	87013	5.0	0.0	5.0
+chr1	87015	0.0	3.0	3.0
+chr1	87016	0.0	1.0	1.0
+chr1	87017	0.0	2.0	2.0
+chr1	87019	0.0	2.0	2.0
+chr1	87020	4.0	0.0	4.0
+chr1	87021	3.0	0.0	3.0
+chr1	87022	1.0	0.0	1.0
+chr1	87024	0.0	1.0	1.0
+chr1	87026	2.0	0.0	2.0
+chr1	87028	9.0	0.0	9.0
+chr1	87032	2.0	8.0	10.0
+chr1	87033	0.0	8.0	8.0
+chr1	87036	1.0	0.0	1.0
+chr1	87037	0.0	1.0	1.0
+chr1	87040	3.0	2.0	5.0
+chr1	87043	0.0	3.0	3.0
+chr1	87044	0.0	3.0	3.0
+chr1	87045	0.0	1.0	1.0
+chr1	87046	1.0	0.0	1.0
+chr1	87047	0.0	1.0	1.0
+chr1	87048	1.0	1.0	2.0
+chr1	87049	1.0	0.0	1.0
+chr1	87052	1.0	0.0	1.0
+chr1	87056	0.0	2.0	2.0
+chr1	87074	0.0	1.0	1.0
+chr1	87288	1.0	1.0	2.0
+chr1	87290	0.0	3.0	3.0
+chr1	87294	0.0	1.0	1.0
+chr1	87302	2.0	0.0	2.0
+chr1	87306	3.0	0.0	3.0
+chr1	87307	3.0	1.0	4.0
+chr1	87308	0.0	3.0	3.0
+chr1	87309	6.0	0.0	6.0
+chr1	87310	0.0	1.0	1.0
+chr1	87311	2.0	4.0	6.0
+chr1	87312	3.0	0.0	3.0
+chr1	87313	15.0	0.0	15.0
+chr1	87315	0.0	1.0	1.0
+chr1	87316	4.0	0.0	4.0
+chr1	87317	0.0	16.0	16.0
+chr1	87318	0.0	16.0	16.0
+chr1	87320	3.0	0.0	3.0
+chr1	87321	3.0	2.0	5.0
+chr1	87322	0.0	1.0	1.0
+chr1	87324	0.0	5.0	5.0
+chr1	87325	0.0	1.0	1.0
+chr1	87326	0.0	1.0	1.0
+chr1	87332	0.0	3.0	3.0
+chr1	87334	1.0	1.0	2.0
+chr1	87335	1.0	0.0	1.0
+chr1	87341	0.0	1.0	1.0
+chr1	87342	0.0	1.0	1.0
+chr1	87349	0.0	1.0	1.0
+chr1	87369	1.0	0.0	1.0
+chr1	87431	0.0	1.0	1.0
+chr1	87491	0.0	1.0	1.0
+chr1	87498	0.0	1.0	1.0
+chr1	87640	0.0	2.0	2.0
+chr1	87659	2.0	0.0	2.0
+chr1	87660	1.0	0.0	1.0
+chr1	87661	1.0	1.0	2.0
+chr1	87695	1.0	0.0	1.0
+chr1	87698	0.0	1.0	1.0
+chr1	87969	1.0	0.0	1.0
+chr1	88013	0.0	1.0	1.0
+chr1	88028	1.0	0.0	1.0
+chr1	88226	0.0	1.0	1.0
+chr1	88381	0.0	2.0	2.0
+chr1	89216	0.0	1.0	1.0
+chr1	89242	1.0	0.0	1.0
+chr1	89586	0.0	1.0	1.0
+chr1	90275	0.0	1.0	1.0
+chr1	91080	1.0	0.0	1.0
+chr1	91777	1.0	0.0	1.0
+chr1	92010	0.0	2.0	2.0
+chr1	92045	1.0	0.0	1.0
+chr1	92108	1.0	0.0	1.0
+chr1	92242	3.0	0.0	3.0
+chr1	92475	0.0	1.0	1.0
+chr1	92476	0.0	1.0	1.0
+chr1	92478	1.0	0.0	1.0
+chr1	92495	0.0	1.0	1.0
+chr1	92882	1.0	0.0	1.0
+chr1	92883	1.0	0.0	1.0
+chr1	92888	0.0	1.0	1.0
+chr1	92889	1.0	2.0	3.0
+chr1	92890	1.0	0.0	1.0
+chr1	92894	2.0	3.0	5.0
+chr1	92895	1.0	0.0	1.0
+chr1	92896	2.0	0.0	2.0
+chr1	92898	0.0	1.0	1.0
+chr1	92899	2.0	0.0	2.0
+chr1	92904	3.0	1.0	4.0
+chr1	92905	0.0	3.0	3.0
+chr1	92907	0.0	1.0	1.0
+chr1	92908	1.0	2.0	3.0
+chr1	92909	0.0	2.0	2.0
+chr1	92912	1.0	0.0	1.0
+chr1	92917	1.0	0.0	1.0
+chr1	92922	1.0	5.0	6.0
+chr1	92923	3.0	1.0	4.0
+chr1	92926	1.0	1.0	2.0
+chr1	92928	0.0	2.0	2.0
+chr1	92929	0.0	1.0	1.0
+chr1	92934	0.0	1.0	1.0
+chr1	92935	1.0	0.0	1.0
+chr1	92939	1.0	0.0	1.0
+chr1	92942	1.0	0.0	1.0
+chr1	92958	0.0	1.0	1.0
+chr1	93037	0.0	2.0	2.0
+chr1	93056	2.0	0.0	2.0
+chr1	93057	0.0	1.0	1.0
+chr1	93069	0.0	1.0	1.0
+chr1	93070	1.0	0.0	1.0
+chr1	93075	1.0	0.0	1.0
+chr1	93076	1.0	0.0	1.0
+chr1	93077	1.0	0.0	1.0
+chr1	93081	0.0	3.0	3.0
+chr1	93082	0.0	2.0	2.0
+chr1	93096	0.0	1.0	1.0
+chr1	93108	0.0	1.0	1.0
+chr1	93110	0.0	1.0	1.0
+chr1	93121	1.0	0.0	1.0
+chr1	93123	1.0	0.0	1.0
+chr1	93130	1.0	0.0	1.0
+chr1	93220	0.0	1.0	1.0
+chr1	93239	0.0	1.0	1.0
+chr1	93241	0.0	1.0	1.0
+chr1	93249	1.0	0.0	1.0
+chr1	93251	0.0	1.0	1.0
+chr1	93270	0.0	1.0	1.0
+chr1	93370	1.0	0.0	1.0
+chr1	93390	1.0	0.0	1.0
+chr1	93554	0.0	1.0	1.0
+chr1	93559	2.0	0.0	2.0
+chr1	93571	1.0	0.0	1.0
+chr1	93575	1.0	0.0	1.0
+chr1	93595	1.0	0.0	1.0
+chr1	93683	1.0	0.0	1.0
+chr1	93743	0.0	1.0	1.0
+chr1	93752	0.0	1.0	1.0
+chr1	93919	0.0	1.0	1.0
+chr1	94167	2.0	0.0	2.0
+chr1	94248	0.0	1.0	1.0
+chr1	94249	0.0	1.0	1.0
+chr1	94278	0.0	1.0	1.0
+chr1	94354	1.0	0.0	1.0
+chr1	94448	0.0	1.0	1.0
+chr1	94626	0.0	1.0	1.0
+chr1	94627	1.0	0.0	1.0
+chr1	94628	3.0	0.0	3.0
+chr1	94654	1.0	0.0	1.0
+chr1	94656	1.0	0.0	1.0
+chr1	94660	1.0	1.0	2.0
+chr1	94661	1.0	0.0	1.0
+chr1	94665	0.0	2.0	2.0
+chr1	94671	0.0	2.0	2.0
+chr1	94672	2.0	0.0	2.0
+chr1	94673	0.0	1.0	1.0
+chr1	94681	0.0	1.0	1.0
+chr1	94689	1.0	0.0	1.0
+chr1	94692	1.0	0.0	1.0
+chr1	94694	1.0	0.0	1.0
+chr1	94697	0.0	1.0	1.0
+chr1	94700	0.0	2.0	2.0
+chr1	94706	0.0	1.0	1.0
+chr1	94720	0.0	2.0	2.0
+chr1	94926	0.0	1.0	1.0
+chr1	94955	1.0	0.0	1.0
+chr1	94956	1.0	0.0	1.0
+chr1	94980	1.0	0.0	1.0
+chr1	94986	0.0	1.0	1.0
+chr1	94987	0.0	1.0	1.0
+chr1	95008	1.0	0.0	1.0
+chr1	95075	0.0	1.0	1.0
+chr1	95078	2.0	0.0	2.0
+chr1	95101	1.0	0.0	1.0
+chr1	95105	0.0	1.0	1.0
+chr1	95177	0.0	1.0	1.0
+chr1	95184	0.0	1.0	1.0
+chr1	95204	1.0	0.0	1.0
+chr1	95321	0.0	1.0	1.0
+chr1	95333	0.0	1.0	1.0
+chr1	95352	0.0	1.0	1.0
+chr1	95380	0.0	1.0	1.0
+chr1	95396	0.0	1.0	1.0
+chr1	95783	0.0	2.0	2.0
+chr1	96102	0.0	2.0	2.0
+chr1	96256	0.0	2.0	2.0
+chr1	96821	2.0	0.0	2.0
+chr1	97008	1.0	0.0	1.0
+chr1	97150	1.0	0.0	1.0
+chr1	97335	0.0	1.0	1.0
+chr1	97389	2.0	0.0	2.0
+chr1	97703	1.0	0.0	1.0
+chr1	97811	0.0	1.0	1.0
+chr1	98260	0.0	1.0	1.0
+chr1	98927	0.0	1.0	1.0
+chr1	98941	1.0	0.0	1.0
+chr1	99102	1.0	0.0	1.0
+chr1	99193	0.0	1.0	1.0
+chr1	99394	0.0	1.0	1.0
+chr1	99413	1.0	0.0	1.0
+chr1	99414	1.0	0.0	1.0
+chr1	99566	1.0	0.0	1.0
+chr1	99567	0.0	1.0	1.0
+chr1	99568	0.0	1.0	1.0
+chr1	99569	1.0	0.0	1.0
+chr1	99574	1.0	1.0	2.0
+chr1	99578	1.0	1.0	2.0
+chr1	99579	0.0	1.0	1.0
+chr1	99595	0.0	1.0	1.0
+chr1	99597	0.0	1.0	1.0
+chr1	99602	1.0	0.0	1.0
+chr1	99622	2.0	0.0	2.0
+chr1	99682	1.0	0.0	1.0
+chr1	99709	1.0	0.0	1.0
+chr1	99710	1.0	0.0	1.0
+chr1	99711	1.0	0.0	1.0
+chr1	99716	9.0	0.0	9.0
+chr1	99719	0.0	1.0	1.0
+chr1	99720	0.0	3.0	3.0
+chr1	99722	1.0	0.0	1.0
+chr1	99728	1.0	0.0	1.0
+chr1	99732	0.0	1.0	1.0
+chr1	99733	3.0	4.0	7.0
+chr1	99734	0.0	1.0	1.0
+chr1	99736	0.0	1.0	1.0
+chr1	99738	5.0	3.0	8.0
+chr1	99741	1.0	9.0	10.0
+chr1	99743	0.0	3.0	3.0
+chr1	99745	1.0	0.0	1.0
+chr1	99747	2.0	0.0	2.0
+chr1	99767	0.0	1.0	1.0
+chr1	99771	1.0	0.0	1.0
+chr1	100180	0.0	1.0	1.0
+chr1	100216	0.0	1.0	1.0
+chr1	100303	1.0	0.0	1.0
+chr1	100770	1.0	0.0	1.0
+chr1	100783	0.0	1.0	1.0
+chr1	100816	2.0	0.0	2.0
+chr1	100822	1.0	0.0	1.0
+chr1	100828	0.0	1.0	1.0
+chr1	100902	1.0	0.0	1.0
+chr1	100953	1.0	0.0	1.0
+chr1	100969	1.0	0.0	1.0
+chr1	100977	0.0	1.0	1.0
+chr1	100978	0.0	2.0	2.0
+chr1	100979	0.0	1.0	1.0
+chr1	100981	1.0	0.0	1.0
+chr1	101116	0.0	1.0	1.0
+chr1	101121	0.0	1.0	1.0
+chr1	101123	0.0	2.0	2.0
+chr1	101125	0.0	2.0	2.0
+chr1	101126	1.0	0.0	1.0
+chr1	101127	0.0	1.0	1.0
+chr1	101128	3.0	0.0	3.0
+chr1	101132	1.0	1.0	2.0
+chr1	101133	2.0	0.0	2.0
+chr1	101134	0.0	2.0	2.0
+chr1	101137	0.0	1.0	1.0
+chr1	101143	1.0	0.0	1.0
+chr1	101145	1.0	0.0	1.0
+chr1	101146	1.0	0.0	1.0
+chr1	101147	0.0	2.0	2.0
+chr1	101159	0.0	1.0	1.0
+chr1	101162	1.0	0.0	1.0
+chr1	101166	1.0	0.0	1.0
+chr1	101170	1.0	0.0	1.0
+chr1	101180	1.0	0.0	1.0
+chr1	101182	1.0	0.0	1.0
+chr1	101231	1.0	0.0	1.0
+chr1	101610	2.0	0.0	2.0
+chr1	101642	0.0	1.0	1.0
+chr1	101805	0.0	1.0	1.0
+chr1	101999	1.0	0.0	1.0
+chr1	102018	0.0	1.0	1.0
+chr1	102343	1.0	0.0	1.0
+chr1	102612	0.0	1.0	1.0
+chr1	103010	1.0	0.0	1.0
+chr1	103523	1.0	0.0	1.0
+chr1	103568	0.0	1.0	1.0
+chr1	103623	1.0	0.0	1.0
+chr1	103641	0.0	1.0	1.0
+chr1	103856	0.0	3.0	3.0
+chr1	104322	0.0	1.0	1.0
+chr1	104323	1.0	0.0	1.0
+chr1	105112	1.0	0.0	1.0
+chr1	105280	1.0	0.0	1.0
+chr1	105289	3.0	0.0	3.0
+chr1	105426	1.0	0.0	1.0
+chr1	105563	0.0	1.0	1.0
+chr1	105609	0.0	4.0	4.0
+chr1	105613	1.0	0.0	1.0
+chr1	105737	0.0	1.0	1.0
+chr1	105742	1.0	0.0	1.0
+chr1	105746	0.0	1.0	1.0
+chr1	105749	1.0	0.0	1.0
+chr1	105753	0.0	3.0	3.0
+chr1	105763	1.0	0.0	1.0
+chr1	105773	3.0	0.0	3.0
+chr1	105776	0.0	1.0	1.0
+chr1	105877	0.0	1.0	1.0
+chr1	105879	0.0	2.0	2.0
+chr1	105901	1.0	0.0	1.0
+chr1	105902	1.0	0.0	1.0
+chr1	105905	0.0	1.0	1.0
+chr1	105908	2.0	0.0	2.0
+chr1	105909	1.0	0.0	1.0
+chr1	105914	0.0	1.0	1.0
+chr1	105917	0.0	1.0	1.0
+chr1	105918	0.0	2.0	2.0
+chr1	105919	1.0	0.0	1.0
+chr1	105921	0.0	2.0	2.0
+chr1	105922	4.0	0.0	4.0
+chr1	105923	5.0	2.0	7.0
+chr1	105924	5.0	0.0	5.0
+chr1	105925	1.0	5.0	6.0
+chr1	105927	3.0	0.0	3.0
+chr1	105928	1.0	3.0	4.0
+chr1	105930	1.0	0.0	1.0
+chr1	105931	0.0	2.0	2.0
+chr1	105933	0.0	5.0	5.0
+chr1	105934	0.0	3.0	3.0
+chr1	105937	1.0	0.0	1.0
+chr1	105938	1.0	0.0	1.0
+chr1	105940	0.0	2.0	2.0
+chr1	105941	3.0	0.0	3.0
+chr1	105942	6.0	0.0	6.0
+chr1	105943	1.0	0.0	1.0
+chr1	105945	3.0	0.0	3.0
+chr1	105966	0.0	1.0	1.0
+chr1	105976	2.0	0.0	2.0
+chr1	106004	1.0	0.0	1.0
+chr1	106173	0.0	1.0	1.0
+chr1	106195	0.0	1.0	1.0
+chr1	106409	1.0	0.0	1.0
+chr1	107526	0.0	1.0	1.0
+chr1	107602	1.0	0.0	1.0
+chr1	107839	1.0	0.0	1.0
+chr1	108251	1.0	0.0	1.0
+chr1	108254	2.0	0.0	2.0
+chr1	108400	0.0	2.0	2.0
+chr1	108433	1.0	0.0	1.0
+chr1	108441	0.0	1.0	1.0
+chr1	108466	0.0	1.0	1.0
+chr1	108563	1.0	0.0	1.0
+chr1	108575	0.0	2.0	2.0
+chr1	108577	1.0	0.0	1.0
+chr1	108589	1.0	0.0	1.0
+chr1	108593	2.0	0.0	2.0
+chr1	108594	1.0	0.0	1.0
+chr1	108595	4.0	0.0	4.0
+chr1	108598	1.0	1.0	2.0
+chr1	108599	0.0	1.0	1.0
+chr1	108600	0.0	1.0	1.0
+chr1	108601	4.0	0.0	4.0
+chr1	108602	0.0	3.0	3.0
+chr1	108603	1.0	2.0	3.0
+chr1	108604	0.0	2.0	2.0
+chr1	108608	4.0	0.0	4.0
+chr1	108610	1.0	0.0	1.0
+chr1	108613	1.0	0.0	1.0
+chr1	108619	1.0	0.0	1.0
+chr1	108621	0.0	1.0	1.0
+chr1	108624	1.0	0.0	1.0
+chr1	108629	2.0	0.0	2.0
+chr1	108640	0.0	1.0	1.0
+chr1	108644	0.0	1.0	1.0
+chr1	108647	0.0	1.0	1.0
+chr1	108651	0.0	1.0	1.0
+chr1	108947	0.0	1.0	1.0
+chr1	109285	0.0	1.0	1.0
+chr1	109291	1.0	0.0	1.0
+chr1	109745	0.0	1.0	1.0
+chr1	109757	0.0	1.0	1.0
+chr1	109794	1.0	0.0	1.0
+chr1	109810	0.0	1.0	1.0
+chr1	109949	1.0	0.0	1.0
+chr1	110062	1.0	0.0	1.0
+chr1	110075	0.0	1.0	1.0
+chr1	110081	1.0	0.0	1.0
+chr1	110086	1.0	0.0	1.0
+chr1	110234	0.0	1.0	1.0
+chr1	110244	0.0	1.0	1.0
+chr1	110260	0.0	1.0	1.0
+chr1	110279	0.0	1.0	1.0
+chr1	110316	1.0	0.0	1.0
+chr1	110349	0.0	1.0	1.0
+chr1	110357	0.0	1.0	1.0
+chr1	110366	0.0	1.0	1.0
+chr1	110372	4.0	1.0	5.0
+chr1	110378	0.0	1.0	1.0
+chr1	110384	1.0	0.0	1.0
+chr1	110386	5.0	1.0	6.0
+chr1	110387	0.0	1.0	1.0
+chr1	110388	1.0	0.0	1.0
+chr1	110392	3.0	2.0	5.0
+chr1	110394	0.0	1.0	1.0
+chr1	110395	4.0	0.0	4.0
+chr1	110396	0.0	1.0	1.0
+chr1	110398	2.0	0.0	2.0
+chr1	110401	4.0	0.0	4.0
+chr1	110406	2.0	0.0	2.0
+chr1	110407	0.0	9.0	9.0
+chr1	110416	1.0	0.0	1.0
+chr1	110417	3.0	0.0	3.0
+chr1	110418	0.0	2.0	2.0
+chr1	110419	0.0	1.0	1.0
+chr1	110426	0.0	2.0	2.0
+chr1	110427	1.0	1.0	2.0
+chr1	110428	3.0	0.0	3.0
+chr1	110434	1.0	0.0	1.0
+chr1	110461	4.0	0.0	4.0
+chr1	110822	0.0	1.0	1.0
+chr1	111223	0.0	1.0	1.0
+chr1	111310	0.0	1.0	1.0
+chr1	111325	0.0	1.0	1.0
+chr1	111439	1.0	0.0	1.0
+chr1	111618	0.0	1.0	1.0
+chr1	111760	0.0	2.0	2.0
+chr1	112053	1.0	0.0	1.0
+chr1	112267	1.0	0.0	1.0
+chr1	112527	1.0	0.0	1.0
+chr1	112548	0.0	1.0	1.0
+chr1	112878	1.0	0.0	1.0
+chr1	113004	0.0	1.0	1.0
+chr1	113014	1.0	0.0	1.0
+chr1	113059	1.0	0.0	1.0
+chr1	113072	1.0	0.0	1.0
+chr1	113186	1.0	1.0	2.0
+chr1	113201	1.0	0.0	1.0
+chr1	113229	0.0	2.0	2.0
+chr1	113312	1.0	0.0	1.0
+chr1	113327	0.0	1.0	1.0
+chr1	113334	0.0	1.0	1.0
+chr1	113336	0.0	1.0	1.0
+chr1	113338	2.0	0.0	2.0
+chr1	113339	1.0	0.0	1.0
+chr1	113340	0.0	1.0	1.0
+chr1	113341	0.0	2.0	2.0
+chr1	113342	1.0	0.0	1.0
+chr1	113343	1.0	0.0	1.0
+chr1	113344	2.0	0.0	2.0
+chr1	113346	0.0	1.0	1.0
+chr1	113347	1.0	0.0	1.0
+chr1	113348	2.0	0.0	2.0
+chr1	113351	8.0	0.0	8.0
+chr1	113353	0.0	3.0	3.0
+chr1	113354	0.0	3.0	3.0
+chr1	113355	1.0	0.0	1.0
+chr1	113359	0.0	2.0	2.0
+chr1	113360	3.0	1.0	4.0
+chr1	113363	1.0	1.0	2.0
+chr1	113364	0.0	2.0	2.0
+chr1	113368	0.0	3.0	3.0
+chr1	113369	0.0	1.0	1.0
+chr1	113373	0.0	2.0	2.0
+chr1	113385	0.0	1.0	1.0
+chr1	113388	0.0	1.0	1.0
+chr1	113392	0.0	1.0	1.0
+chr1	113595	0.0	1.0	1.0
+chr1	113601	0.0	1.0	1.0
+chr1	113605	1.0	0.0	1.0
+chr1	113606	0.0	1.0	1.0
+chr1	113610	2.0	0.0	2.0
+chr1	113615	1.0	2.0	3.0
+chr1	113620	0.0	1.0	1.0
+chr1	113621	1.0	0.0	1.0
+chr1	113626	0.0	2.0	2.0
+chr1	113627	0.0	1.0	1.0
+chr1	113628	0.0	11.0	11.0
+chr1	113634	1.0	0.0	1.0
+chr1	113635	2.0	0.0	2.0
+chr1	113640	1.0	0.0	1.0
+chr1	113646	0.0	1.0	1.0
+chr1	113655	1.0	0.0	1.0
+chr1	113662	1.0	0.0	1.0
+chr1	113671	1.0	0.0	1.0
+chr1	113677	1.0	0.0	1.0
+chr1	113752	2.0	0.0	2.0
+chr1	113793	0.0	2.0	2.0
+chr1	113799	1.0	0.0	1.0
+chr1	113800	1.0	0.0	1.0
+chr1	113922	1.0	0.0	1.0
+chr1	113952	1.0	0.0	1.0
+chr1	114094	0.0	1.0	1.0
+chr1	114097	0.0	1.0	1.0
+chr1	114109	1.0	0.0	1.0
+chr1	114167	2.0	0.0	2.0
+chr1	114278	0.0	1.0	1.0
+chr1	114288	0.0	1.0	1.0
+chr1	114385	0.0	1.0	1.0
+chr1	114393	1.0	0.0	1.0
+chr1	114396	0.0	1.0	1.0
+chr1	114416	1.0	0.0	1.0
+chr1	114421	0.0	5.0	5.0
+chr1	114440	1.0	0.0	1.0
+chr1	114521	0.0	1.0	1.0
+chr1	114529	0.0	1.0	1.0
+chr1	114530	0.0	1.0	1.0
+chr1	114538	0.0	1.0	1.0
+chr1	114540	0.0	1.0	1.0
+chr1	114542	1.0	0.0	1.0
+chr1	114550	2.0	0.0	2.0
+chr1	114553	1.0	0.0	1.0
+chr1	114564	1.0	0.0	1.0
+chr1	114565	0.0	1.0	1.0
+chr1	114567	1.0	0.0	1.0
+chr1	114568	1.0	0.0	1.0
+chr1	114569	2.0	0.0	2.0
+chr1	114570	0.0	1.0	1.0
+chr1	114572	2.0	0.0	2.0
+chr1	114573	1.0	0.0	1.0
+chr1	114575	1.0	3.0	4.0
+chr1	114577	0.0	2.0	2.0
+chr1	114579	1.0	0.0	1.0
+chr1	114581	1.0	0.0	1.0
+chr1	114582	3.0	0.0	3.0
+chr1	114585	0.0	5.0	5.0
+chr1	114587	0.0	2.0	2.0
+chr1	114593	0.0	6.0	6.0
+chr1	114594	0.0	2.0	2.0
+chr1	114605	0.0	1.0	1.0
+chr1	114619	1.0	0.0	1.0
+chr1	114706	0.0	1.0	1.0
+chr1	114780	1.0	0.0	1.0
+chr1	114798	0.0	1.0	1.0
+chr1	114799	0.0	1.0	1.0
+chr1	114807	0.0	1.0	1.0
+chr1	114808	0.0	1.0	1.0
+chr1	114827	0.0	1.0	1.0
+chr1	114830	2.0	0.0	2.0
+chr1	114832	2.0	0.0	2.0
+chr1	114834	0.0	3.0	3.0
+chr1	114838	3.0	0.0	3.0
+chr1	114840	0.0	1.0	1.0
+chr1	114853	5.0	0.0	5.0
+chr1	114854	3.0	0.0	3.0
+chr1	114855	0.0	1.0	1.0
+chr1	114857	1.0	0.0	1.0
+chr1	114858	2.0	1.0	3.0
+chr1	114860	2.0	4.0	6.0
+chr1	114861	0.0	4.0	4.0
+chr1	114864	1.0	2.0	3.0
+chr1	114865	3.0	2.0	5.0
+chr1	114866	0.0	1.0	1.0
+chr1	114874	0.0	1.0	1.0
+chr1	114875	0.0	2.0	2.0
+chr1	114877	1.0	0.0	1.0
+chr1	114878	0.0	1.0	1.0
+chr1	115000	0.0	1.0	1.0
+chr1	115012	1.0	0.0	1.0
+chr1	115013	1.0	0.0	1.0
+chr1	115016	2.0	0.0	2.0
+chr1	115018	1.0	0.0	1.0
+chr1	115019	0.0	1.0	1.0
+chr1	115021	1.0	0.0	1.0
+chr1	115028	2.0	3.0	5.0
+chr1	115029	0.0	1.0	1.0
+chr1	115047	0.0	1.0	1.0
+chr1	115048	0.0	2.0	2.0
+chr1	115056	0.0	1.0	1.0
+chr1	115071	1.0	0.0	1.0
+chr1	115169	0.0	1.0	1.0
+chr1	115176	1.0	0.0	1.0
+chr1	115179	1.0	0.0	1.0
+chr1	115218	0.0	1.0	1.0
+chr1	115226	1.0	0.0	1.0
+chr1	115339	0.0	1.0	1.0
+chr1	115359	0.0	1.0	1.0
+chr1	115366	0.0	1.0	1.0
+chr1	115382	1.0	0.0	1.0
+chr1	115535	1.0	0.0	1.0
+chr1	115539	1.0	0.0	1.0
+chr1	115922	0.0	1.0	1.0
+chr1	116062	1.0	0.0	1.0
+chr1	116303	1.0	0.0	1.0
+chr1	116385	1.0	0.0	1.0
+chr1	116433	0.0	1.0	1.0
+chr1	116963	0.0	1.0	1.0
+chr1	117582	1.0	0.0	1.0
+chr1	118109	0.0	1.0	1.0
+chr1	118536	1.0	0.0	1.0
+chr1	118587	1.0	0.0	1.0
+chr1	118651	0.0	1.0	1.0
+chr1	118682	0.0	1.0	1.0
+chr1	118684	3.0	0.0	3.0
+chr1	118699	1.0	1.0	2.0
+chr1	118702	0.0	2.0	2.0
+chr1	118716	0.0	1.0	1.0
+chr1	118739	0.0	1.0	1.0
+chr1	118745	1.0	0.0	1.0
+chr1	118890	0.0	1.0	1.0
+chr1	118902	0.0	1.0	1.0
+chr1	118942	0.0	1.0	1.0
+chr1	119085	1.0	0.0	1.0
+chr1	119248	1.0	0.0	1.0
+chr1	119418	0.0	1.0	1.0
+chr1	119421	1.0	0.0	1.0
+chr1	119449	0.0	1.0	1.0
+chr1	119450	0.0	1.0	1.0
+chr1	119582	1.0	0.0	1.0
+chr1	119589	0.0	2.0	2.0
+chr1	119843	0.0	1.0	1.0
+chr1	119878	0.0	1.0	1.0
+chr1	119893	2.0	0.0	2.0
+chr1	119898	0.0	1.0	1.0
+chr1	119903	0.0	9.0	9.0
+chr1	119904	0.0	2.0	2.0
+chr1	119907	1.0	0.0	1.0
+chr1	119908	1.0	0.0	1.0
+chr1	119911	0.0	1.0	1.0
+chr1	119912	4.0	0.0	4.0
+chr1	119913	7.0	0.0	7.0
+chr1	119914	0.0	1.0	1.0
+chr1	119916	0.0	6.0	6.0
+chr1	119917	0.0	1.0	1.0
+chr1	119918	1.0	0.0	1.0
+chr1	119920	1.0	0.0	1.0
+chr1	119925	0.0	2.0	2.0
+chr1	119928	0.0	1.0	1.0
+chr1	119932	2.0	0.0	2.0
+chr1	119933	1.0	0.0	1.0
+chr1	119938	0.0	1.0	1.0
+chr1	119943	1.0	0.0	1.0
+chr1	119948	2.0	0.0	2.0
+chr1	120059	0.0	1.0	1.0
+chr1	120067	1.0	0.0	1.0
+chr1	120078	1.0	0.0	1.0
+chr1	120108	1.0	0.0	1.0
+chr1	120130	0.0	1.0	1.0
+chr1	120259	0.0	1.0	1.0
+chr1	120285	1.0	0.0	1.0
+chr1	120300	2.0	0.0	2.0
+chr1	120367	1.0	0.0	1.0
+chr1	120619	0.0	2.0	2.0
+chr1	120900	1.0	0.0	1.0
+chr1	121065	0.0	1.0	1.0
+chr1	121163	1.0	0.0	1.0
+chr1	122242	0.0	1.0	1.0
+chr1	122403	1.0	0.0	1.0
+chr1	122416	0.0	1.0	1.0
+chr1	122434	1.0	0.0	1.0
+chr1	122530	0.0	1.0	1.0
+chr1	123049	1.0	0.0	1.0
+chr1	123100	0.0	1.0	1.0
+chr1	123587	0.0	1.0	1.0
+chr1	123653	1.0	0.0	1.0
+chr1	124814	1.0	0.0	1.0
+chr1	124824	0.0	2.0	2.0
+chr1	124830	1.0	0.0	1.0
+chr1	124831	2.0	0.0	2.0
+chr1	124840	2.0	0.0	2.0
+chr1	124843	2.0	0.0	2.0
+chr1	124844	2.0	0.0	2.0
+chr1	124848	1.0	0.0	1.0
+chr1	124853	0.0	1.0	1.0
+chr1	124854	0.0	9.0	9.0
+chr1	124857	0.0	2.0	2.0
+chr1	124859	1.0	0.0	1.0
+chr1	124860	1.0	3.0	4.0
+chr1	124861	0.0	2.0	2.0
+chr1	124863	0.0	2.0	2.0
+chr1	124867	1.0	0.0	1.0
+chr1	124869	1.0	1.0	2.0
+chr1	124954	1.0	0.0	1.0
+chr1	124992	1.0	0.0	1.0
+chr1	125009	0.0	2.0	2.0
+chr1	125428	1.0	0.0	1.0
+chr1	125519	1.0	0.0	1.0
+chr1	125797	1.0	0.0	1.0
+chr1	126209	0.0	1.0	1.0
+chr1	126354	0.0	1.0	1.0
+chr1	126608	1.0	0.0	1.0
+chr1	126949	0.0	1.0	1.0
+chr1	126984	0.0	1.0	1.0
+chr1	127000	1.0	0.0	1.0
+chr1	127008	1.0	0.0	1.0
+chr1	127027	0.0	1.0	1.0
+chr1	127063	1.0	0.0	1.0
+chr1	127104	0.0	1.0	1.0
+chr1	127156	1.0	0.0	1.0
+chr1	127165	1.0	0.0	1.0
+chr1	127172	0.0	1.0	1.0
+chr1	127177	0.0	1.0	1.0
+chr1	127228	0.0	1.0	1.0
+chr1	127292	2.0	0.0	2.0
+chr1	127327	0.0	1.0	1.0
+chr1	127341	1.0	0.0	1.0
+chr1	127352	1.0	0.0	1.0
+chr1	127353	0.0	1.0	1.0
+chr1	127354	0.0	1.0	1.0
+chr1	127366	0.0	1.0	1.0
+chr1	127372	0.0	2.0	2.0
+chr1	127379	0.0	1.0	1.0
+chr1	127389	1.0	0.0	1.0
+chr1	127432	1.0	0.0	1.0
+chr1	127486	0.0	1.0	1.0
+chr1	127510	2.0	0.0	2.0
+chr1	127518	1.0	0.0	1.0
+chr1	127525	1.0	0.0	1.0
+chr1	127527	0.0	1.0	1.0
+chr1	127579	0.0	1.0	1.0
+chr1	127665	0.0	1.0	1.0
+chr1	127677	0.0	1.0	1.0
+chr1	127680	1.0	4.0	5.0
+chr1	127691	1.0	0.0	1.0
+chr1	127698	1.0	0.0	1.0
+chr1	127702	0.0	1.0	1.0
+chr1	127716	0.0	1.0	1.0
+chr1	127719	0.0	1.0	1.0
+chr1	127732	0.0	1.0	1.0
+chr1	127740	0.0	1.0	1.0
+chr1	127839	0.0	1.0	1.0
+chr1	127849	1.0	0.0	1.0
+chr1	127856	1.0	0.0	1.0
+chr1	127858	0.0	1.0	1.0
+chr1	127859	0.0	3.0	3.0
+chr1	127879	1.0	0.0	1.0
+chr1	127884	1.0	0.0	1.0
+chr1	127886	0.0	3.0	3.0
+chr1	127891	0.0	1.0	1.0
+chr1	127895	0.0	1.0	1.0
+chr1	127897	1.0	0.0	1.0
+chr1	127898	3.0	0.0	3.0
+chr1	127906	2.0	0.0	2.0
+chr1	127907	1.0	0.0	1.0
+chr1	127909	0.0	1.0	1.0
+chr1	127921	0.0	1.0	1.0
+chr1	127930	1.0	0.0	1.0
+chr1	127957	1.0	0.0	1.0
+chr1	128023	0.0	1.0	1.0
+chr1	128030	0.0	1.0	1.0
+chr1	128061	1.0	0.0	1.0
+chr1	128071	1.0	0.0	1.0
+chr1	128333	1.0	0.0	1.0
+chr1	128359	1.0	0.0	1.0
+chr1	128376	1.0	0.0	1.0
+chr1	128392	1.0	0.0	1.0
+chr1	128404	0.0	1.0	1.0
+chr1	128664	0.0	1.0	1.0
+chr1	128675	0.0	2.0	2.0
+chr1	128829	1.0	0.0	1.0
+chr1	128830	1.0	0.0	1.0
+chr1	128832	1.0	0.0	1.0
+chr1	128841	0.0	1.0	1.0
+chr1	128968	0.0	2.0	2.0
+chr1	128987	0.0	1.0	1.0
+chr1	128988	1.0	0.0	1.0
+chr1	128989	1.0	0.0	1.0
+chr1	128990	2.0	0.0	2.0
+chr1	128991	2.0	3.0	5.0
+chr1	128993	0.0	2.0	2.0
+chr1	128995	3.0	0.0	3.0
+chr1	128997	1.0	0.0	1.0
+chr1	128998	1.0	4.0	5.0
+chr1	129005	0.0	1.0	1.0
+chr1	129006	0.0	1.0	1.0
+chr1	129007	0.0	1.0	1.0
+chr1	129012	0.0	1.0	1.0
+chr1	129013	0.0	2.0	2.0
+chr1	129015	1.0	0.0	1.0
+chr1	129016	0.0	1.0	1.0
+chr1	129023	2.0	0.0	2.0
+chr1	129026	2.0	0.0	2.0
+chr1	129029	0.0	1.0	1.0
+chr1	129041	1.0	0.0	1.0
+chr1	129061	0.0	3.0	3.0
+chr1	129240	0.0	1.0	1.0
+chr1	129247	1.0	0.0	1.0
+chr1	129250	1.0	0.0	1.0
+chr1	129270	0.0	1.0	1.0
+chr1	129276	3.0	2.0	5.0
+chr1	129277	5.0	1.0	6.0
+chr1	129279	6.0	0.0	6.0
+chr1	129281	1.0	0.0	1.0
+chr1	129285	1.0	6.0	7.0
+chr1	129286	1.0	1.0	2.0
+chr1	129288	0.0	3.0	3.0
+chr1	129291	0.0	1.0	1.0
+chr1	129292	2.0	0.0	2.0
+chr1	129294	2.0	0.0	2.0
+chr1	129295	3.0	7.0	10.0
+chr1	129296	0.0	1.0	1.0
+chr1	129297	0.0	2.0	2.0
+chr1	129298	5.0	0.0	5.0
+chr1	129300	0.0	1.0	1.0
+chr1	129303	1.0	0.0	1.0
+chr1	129308	0.0	1.0	1.0
+chr1	129311	1.0	0.0	1.0
+chr1	129312	0.0	2.0	2.0
+chr1	129343	1.0	0.0	1.0
+chr1	129447	0.0	2.0	2.0
+chr1	129451	0.0	1.0	1.0
+chr1	129456	0.0	1.0	1.0
+chr1	129458	0.0	1.0	1.0
+chr1	129459	0.0	1.0	1.0
+chr1	129461	1.0	0.0	1.0
+chr1	129462	1.0	0.0	1.0
+chr1	129464	1.0	0.0	1.0
+chr1	129470	2.0	0.0	2.0
+chr1	129471	1.0	0.0	1.0
+chr1	129472	0.0	1.0	1.0
+chr1	129478	1.0	0.0	1.0
+chr1	129575	0.0	1.0	1.0
+chr1	129585	0.0	1.0	1.0
+chr1	129616	1.0	0.0	1.0
+chr1	129639	0.0	1.0	1.0
+chr1	129658	0.0	1.0	1.0
+chr1	129808	1.0	0.0	1.0
+chr1	129931	0.0	1.0	1.0
+chr1	129980	0.0	1.0	1.0
+chr1	130094	1.0	0.0	1.0
+chr1	130103	0.0	1.0	1.0
+chr1	130454	0.0	1.0	1.0
+chr1	130720	0.0	1.0	1.0
+chr1	130749	0.0	1.0	1.0
+chr1	130754	1.0	0.0	1.0
+chr1	130768	0.0	2.0	2.0
+chr1	130781	0.0	2.0	2.0
+chr1	130782	0.0	1.0	1.0
+chr1	130841	0.0	1.0	1.0
+chr1	131009	1.0	0.0	1.0
+chr1	131095	0.0	1.0	1.0
+chr1	131104	1.0	0.0	1.0
+chr1	131137	1.0	0.0	1.0
+chr1	131948	0.0	1.0	1.0
+chr1	131972	0.0	1.0	1.0
+chr1	132002	1.0	0.0	1.0
+chr1	132209	0.0	2.0	2.0
+chr1	132216	0.0	1.0	1.0
+chr1	132218	2.0	0.0	2.0
+chr1	132224	2.0	0.0	2.0
+chr1	132225	1.0	0.0	1.0
+chr1	132226	6.0	0.0	6.0
+chr1	132227	0.0	5.0	5.0
+chr1	132231	0.0	2.0	2.0
+chr1	132232	5.0	0.0	5.0
+chr1	132233	5.0	2.0	7.0
+chr1	132234	0.0	1.0	1.0
+chr1	132235	0.0	1.0	1.0
+chr1	132236	1.0	2.0	3.0
+chr1	132237	4.0	0.0	4.0
+chr1	132238	0.0	3.0	3.0
+chr1	132241	0.0	1.0	1.0
+chr1	132242	0.0	1.0	1.0
+chr1	132243	2.0	0.0	2.0
+chr1	132244	5.0	3.0	8.0
+chr1	132247	0.0	3.0	3.0
+chr1	132249	0.0	1.0	1.0
+chr1	132250	0.0	2.0	2.0
+chr1	132251	0.0	3.0	3.0
+chr1	132253	1.0	0.0	1.0
+chr1	132255	0.0	1.0	1.0
+chr1	132256	0.0	3.0	3.0
+chr1	132263	1.0	0.0	1.0
+chr1	132269	0.0	2.0	2.0
+chr1	132381	0.0	1.0	1.0
+chr1	132382	1.0	0.0	1.0
+chr1	132387	1.0	0.0	1.0
+chr1	132394	0.0	2.0	2.0
+chr1	132403	3.0	0.0	3.0
+chr1	132404	1.0	0.0	1.0
+chr1	132406	0.0	1.0	1.0
+chr1	132410	0.0	1.0	1.0
+chr1	132520	0.0	1.0	1.0
+chr1	132543	1.0	0.0	1.0
+chr1	132559	1.0	0.0	1.0
+chr1	132566	3.0	0.0	3.0
+chr1	132568	0.0	1.0	1.0
+chr1	132577	0.0	1.0	1.0
+chr1	132662	2.0	0.0	2.0
+chr1	132689	0.0	1.0	1.0
+chr1	132724	0.0	1.0	1.0
+chr1	132894	1.0	0.0	1.0
+chr1	132914	1.0	0.0	1.0
+chr1	133091	0.0	2.0	2.0
+chr1	133228	1.0	0.0	1.0
+chr1	133589	1.0	0.0	1.0
+chr1	134220	2.0	0.0	2.0
+chr1	134518	0.0	1.0	1.0
+chr1	134585	1.0	0.0	1.0
+chr1	134656	1.0	0.0	1.0
+chr1	134669	0.0	1.0	1.0
+chr1	134823	0.0	1.0	1.0
+chr1	134831	0.0	1.0	1.0
+chr1	134832	0.0	1.0	1.0
+chr1	134860	0.0	1.0	1.0
+chr1	135319	3.0	0.0	3.0
+chr1	135323	0.0	1.0	1.0
+chr1	135324	1.0	0.0	1.0
+chr1	135337	1.0	0.0	1.0
+chr1	135365	1.0	0.0	1.0
+chr1	135477	1.0	0.0	1.0
+chr1	135485	0.0	2.0	2.0
+chr1	135523	1.0	0.0	1.0
+chr1	135581	0.0	1.0	1.0
+chr1	135621	0.0	2.0	2.0
+chr1	135642	5.0	2.0	7.0
+chr1	135646	0.0	1.0	1.0
+chr1	135648	1.0	0.0	1.0
+chr1	135650	0.0	2.0	2.0
+chr1	135653	0.0	2.0	2.0
+chr1	135655	0.0	1.0	1.0
+chr1	135657	0.0	2.0	2.0
+chr1	135660	0.0	2.0	2.0
+chr1	135663	2.0	0.0	2.0
+chr1	135665	1.0	0.0	1.0
+chr1	135669	0.0	2.0	2.0
+chr1	135671	1.0	0.0	1.0
+chr1	135675	0.0	2.0	2.0
+chr1	135684	2.0	0.0	2.0
+chr1	135840	0.0	2.0	2.0
+chr1	135844	1.0	0.0	1.0
+chr1	135851	1.0	0.0	1.0
+chr1	135854	1.0	0.0	1.0
+chr1	135858	0.0	3.0	3.0
+chr1	135863	1.0	1.0	2.0
+chr1	135864	3.0	1.0	4.0
+chr1	135866	1.0	2.0	3.0
+chr1	135869	0.0	1.0	1.0
+chr1	135873	0.0	1.0	1.0
+chr1	135877	1.0	0.0	1.0
+chr1	135883	1.0	0.0	1.0
+chr1	135884	1.0	0.0	1.0
+chr1	135886	2.0	0.0	2.0
+chr1	135887	1.0	0.0	1.0
+chr1	135888	0.0	2.0	2.0
+chr1	135889	0.0	1.0	1.0
+chr1	135891	1.0	4.0	5.0
+chr1	135899	1.0	0.0	1.0
+chr1	135900	1.0	0.0	1.0
+chr1	135904	1.0	0.0	1.0
+chr1	135906	0.0	1.0	1.0
+chr1	135908	0.0	1.0	1.0
+chr1	135909	0.0	1.0	1.0
+chr1	135921	1.0	0.0	1.0
+chr1	135930	1.0	0.0	1.0
+chr1	135946	1.0	0.0	1.0
+chr1	135985	0.0	1.0	1.0
+chr1	136018	0.0	2.0	2.0
+chr1	136025	0.0	1.0	1.0
+chr1	136026	0.0	1.0	1.0
+chr1	136041	2.0	0.0	2.0
+chr1	136042	2.0	0.0	2.0
+chr1	136044	0.0	2.0	2.0
+chr1	136054	1.0	0.0	1.0
+chr1	136063	1.0	0.0	1.0
+chr1	136064	1.0	0.0	1.0
+chr1	136366	1.0	0.0	1.0
+chr1	136517	0.0	1.0	1.0
+chr1	136535	1.0	0.0	1.0
+chr1	136540	1.0	0.0	1.0
+chr1	136543	1.0	0.0	1.0
+chr1	136544	1.0	0.0	1.0
+chr1	136549	2.0	0.0	2.0
+chr1	136562	0.0	2.0	2.0
+chr1	136564	1.0	0.0	1.0
+chr1	136705	0.0	1.0	1.0
+chr1	136874	1.0	0.0	1.0
+chr1	136877	0.0	1.0	1.0
+chr1	136882	0.0	1.0	1.0
+chr1	136891	1.0	0.0	1.0
+chr1	136911	0.0	1.0	1.0
+chr1	136914	1.0	0.0	1.0
+chr1	136915	2.0	0.0	2.0
+chr1	136920	1.0	0.0	1.0
+chr1	136921	0.0	2.0	2.0
+chr1	136922	0.0	2.0	2.0
+chr1	136933	0.0	1.0	1.0
+chr1	136942	0.0	1.0	1.0
+chr1	136961	0.0	1.0	1.0
+chr1	137056	1.0	0.0	1.0
+chr1	137070	1.0	0.0	1.0
+chr1	137086	0.0	1.0	1.0
+chr1	137090	0.0	2.0	2.0
+chr1	137094	1.0	0.0	1.0
+chr1	137096	1.0	0.0	1.0
+chr1	137103	1.0	0.0	1.0
+chr1	137222	1.0	0.0	1.0
+chr1	137233	1.0	0.0	1.0
+chr1	137235	0.0	1.0	1.0
+chr1	137277	1.0	0.0	1.0
+chr1	137287	0.0	1.0	1.0
+chr1	137335	0.0	1.0	1.0
+chr1	137761	0.0	1.0	1.0
+chr1	137785	0.0	1.0	1.0
+chr1	137788	0.0	1.0	1.0
+chr1	137866	1.0	1.0	2.0
+chr1	137934	0.0	1.0	1.0
+chr1	138028	0.0	1.0	1.0
+chr1	138175	0.0	1.0	1.0
+chr1	138193	1.0	0.0	1.0
+chr1	138196	1.0	0.0	1.0
+chr1	138207	0.0	1.0	1.0
+chr1	138211	0.0	5.0	5.0
+chr1	138212	1.0	0.0	1.0
+chr1	138217	0.0	1.0	1.0
+chr1	138218	1.0	0.0	1.0
+chr1	138226	0.0	1.0	1.0
+chr1	138236	1.0	0.0	1.0
+chr1	138263	1.0	0.0	1.0
+chr1	138288	1.0	0.0	1.0
+chr1	138337	2.0	0.0	2.0
+chr1	138346	4.0	0.0	4.0
+chr1	138351	0.0	2.0	2.0
+chr1	138354	0.0	1.0	1.0
+chr1	138358	0.0	1.0	1.0
+chr1	138359	2.0	2.0	4.0
+chr1	138360	4.0	1.0	5.0
+chr1	138364	0.0	2.0	2.0
+chr1	138365	0.0	2.0	2.0
+chr1	138366	1.0	1.0	2.0
+chr1	138370	0.0	1.0	1.0
+chr1	138371	0.0	1.0	1.0
+chr1	138375	0.0	1.0	1.0
+chr1	138376	0.0	2.0	2.0
+chr1	138377	3.0	1.0	4.0
+chr1	138379	1.0	0.0	1.0
+chr1	138380	1.0	0.0	1.0
+chr1	138382	1.0	0.0	1.0
+chr1	138383	1.0	0.0	1.0
+chr1	138385	0.0	1.0	1.0
+chr1	138387	0.0	3.0	3.0
+chr1	138388	0.0	2.0	2.0
+chr1	138389	0.0	2.0	2.0
+chr1	138390	1.0	0.0	1.0
+chr1	138391	12.0	0.0	12.0
+chr1	138398	0.0	2.0	2.0
+chr1	138640	1.0	0.0	1.0
+chr1	138643	1.0	0.0	1.0
+chr1	138644	1.0	0.0	1.0
+chr1	138658	0.0	1.0	1.0
+chr1	138659	1.0	0.0	1.0
+chr1	138661	0.0	4.0	4.0
+chr1	138677	0.0	1.0	1.0
+chr1	138846	1.0	0.0	1.0
+chr1	138859	0.0	1.0	1.0
+chr1	138989	1.0	0.0	1.0
+chr1	139018	0.0	1.0	1.0
+chr1	139710	0.0	1.0	1.0
+chr1	139757	1.0	0.0	1.0
+chr1	139893	0.0	1.0	1.0
+chr1	140066	0.0	2.0	2.0
+chr1	140073	0.0	1.0	1.0
+chr1	140382	1.0	0.0	1.0
+chr1	140489	0.0	1.0	1.0
+chr1	140574	0.0	1.0	1.0
+chr1	140671	0.0	1.0	1.0
+chr1	140818	1.0	0.0	1.0
+chr1	140821	1.0	0.0	1.0
+chr1	140842	1.0	0.0	1.0
+chr1	140847	0.0	1.0	1.0
+chr1	140892	1.0	0.0	1.0
+chr1	141051	1.0	0.0	1.0
+chr1	141069	1.0	0.0	1.0
+chr1	141191	1.0	0.0	1.0
+chr1	141196	0.0	1.0	1.0
+chr1	141239	1.0	0.0	1.0
+chr1	141352	0.0	1.0	1.0
+chr1	141360	0.0	1.0	1.0
+chr1	141369	1.0	0.0	1.0
+chr1	141370	1.0	0.0	1.0
+chr1	141373	1.0	0.0	1.0
+chr1	141374	1.0	0.0	1.0
+chr1	141539	0.0	1.0	1.0
+chr1	141604	1.0	0.0	1.0
+chr1	141611	1.0	0.0	1.0
+chr1	142833	0.0	1.0	1.0
+chr1	143601	0.0	1.0	1.0
+chr1	143625	1.0	0.0	1.0
+chr1	143627	2.0	0.0	2.0
+chr1	143635	0.0	1.0	1.0
+chr1	143652	0.0	1.0	1.0
+chr1	143653	3.0	0.0	3.0
+chr1	143663	0.0	1.0	1.0
+chr1	143671	0.0	4.0	4.0
+chr1	143686	0.0	1.0	1.0
+chr1	143797	0.0	1.0	1.0
+chr1	143809	0.0	2.0	2.0
+chr1	143818	1.0	0.0	1.0
+chr1	143915	1.0	0.0	1.0
+chr1	144003	1.0	0.0	1.0
+chr1	144040	0.0	1.0	1.0
+chr1	144138	1.0	0.0	1.0
+chr1	144168	1.0	0.0	1.0
+chr1	144291	0.0	1.0	1.0
+chr1	144333	1.0	0.0	1.0
+chr1	144338	0.0	1.0	1.0
+chr1	144619	1.0	0.0	1.0
+chr1	144752	0.0	1.0	1.0
+chr1	144766	1.0	0.0	1.0
+chr1	144778	1.0	0.0	1.0
+chr1	144807	0.0	1.0	1.0
+chr1	145036	0.0	1.0	1.0
+chr1	145434	0.0	1.0	1.0
+chr1	145469	0.0	1.0	1.0
+chr1	145613	1.0	0.0	1.0
+chr1	145939	0.0	1.0	1.0
+chr1	146783	0.0	1.0	1.0
+chr1	147166	0.0	1.0	1.0
+chr1	148264	1.0	0.0	1.0
+chr1	148720	1.0	0.0	1.0
+chr1	148894	0.0	1.0	1.0
+chr1	148994	1.0	0.0	1.0
+chr1	149205	1.0	0.0	1.0
+chr1	149224	0.0	1.0	1.0
+chr1	149719	0.0	1.0	1.0
+chr1	149740	0.0	1.0	1.0
+chr1	150214	1.0	0.0	1.0
+chr1	150627	0.0	1.0	1.0
+chr1	150630	1.0	0.0	1.0
+chr1	150638	1.0	0.0	1.0
+chr1	150970	0.0	2.0	2.0
+chr1	150978	0.0	1.0	1.0
+chr1	151003	1.0	0.0	1.0
+chr1	151128	1.0	0.0	1.0
+chr1	151133	0.0	1.0	1.0
+chr1	151136	2.0	0.0	2.0
+chr1	151137	3.0	0.0	3.0
+chr1	151140	0.0	1.0	1.0
+chr1	151141	0.0	1.0	1.0
+chr1	151148	1.0	0.0	1.0
+chr1	151149	1.0	0.0	1.0
+chr1	151156	1.0	0.0	1.0
+chr1	151158	0.0	1.0	1.0
+chr1	151160	0.0	1.0	1.0
+chr1	151203	3.0	0.0	3.0
+chr1	151680	0.0	1.0	1.0
+chr1	152245	0.0	1.0	1.0
+chr1	152247	0.0	3.0	3.0
+chr1	152249	0.0	1.0	1.0
+chr1	152250	0.0	2.0	2.0
+chr1	152251	0.0	4.0	4.0
+chr1	152254	0.0	1.0	1.0
+chr1	152258	0.0	3.0	3.0
+chr1	152263	0.0	1.0	1.0
+chr1	152264	16.0	0.0	16.0
+chr1	152265	1.0	0.0	1.0
+chr1	152267	0.0	3.0	3.0
+chr1	152269	2.0	0.0	2.0
+chr1	152270	7.0	0.0	7.0
+chr1	152274	0.0	1.0	1.0
+chr1	152279	1.0	0.0	1.0
+chr1	152280	1.0	0.0	1.0
+chr1	152282	0.0	1.0	1.0
+chr1	152283	0.0	1.0	1.0
+chr1	152299	2.0	0.0	2.0
+chr1	152443	2.0	0.0	2.0
+chr1	152581	1.0	0.0	1.0
+chr1	153336	0.0	1.0	1.0
+chr1	153432	1.0	0.0	1.0
+chr1	153519	0.0	1.0	1.0
+chr1	153562	0.0	1.0	1.0
+chr1	153601	3.0	0.0	3.0
+chr1	153781	0.0	1.0	1.0
+chr1	154168	1.0	0.0	1.0
+chr1	154181	1.0	0.0	1.0
+chr1	154186	1.0	0.0	1.0
+chr1	154200	3.0	0.0	3.0
+chr1	154223	1.0	0.0	1.0
+chr1	154302	1.0	0.0	1.0
+chr1	154324	0.0	1.0	1.0
+chr1	154368	0.0	1.0	1.0
+chr1	154377	0.0	1.0	1.0
+chr1	154383	0.0	1.0	1.0
+chr1	154387	0.0	1.0	1.0
+chr1	154390	1.0	0.0	1.0
+chr1	154393	1.0	0.0	1.0
+chr1	154515	1.0	0.0	1.0
+chr1	154554	0.0	1.0	1.0
+chr1	154555	0.0	1.0	1.0
+chr1	154558	1.0	0.0	1.0
+chr1	154564	2.0	0.0	2.0
+chr1	154677	0.0	1.0	1.0
+chr1	154686	0.0	1.0	1.0
+chr1	154691	1.0	0.0	1.0
+chr1	154699	0.0	1.0	1.0
+chr1	154704	1.0	0.0	1.0
+chr1	154705	0.0	2.0	2.0
+chr1	154706	0.0	1.0	1.0
+chr1	154718	0.0	1.0	1.0
+chr1	154719	6.0	0.0	6.0
+chr1	154724	0.0	1.0	1.0
+chr1	154725	0.0	1.0	1.0
+chr1	154727	1.0	0.0	1.0
+chr1	154728	3.0	0.0	3.0
+chr1	154729	2.0	0.0	2.0
+chr1	154730	6.0	0.0	6.0
+chr1	154732	0.0	1.0	1.0
+chr1	154741	1.0	0.0	1.0
+chr1	154756	0.0	1.0	1.0
+chr1	154758	1.0	0.0	1.0
+chr1	154933	0.0	1.0	1.0
+chr1	154958	0.0	1.0	1.0
+chr1	154962	1.0	0.0	1.0
+chr1	154963	0.0	1.0	1.0
+chr1	154964	0.0	1.0	1.0
+chr1	154968	0.0	1.0	1.0
+chr1	154970	0.0	2.0	2.0
+chr1	154971	1.0	0.0	1.0
+chr1	154973	0.0	1.0	1.0
+chr1	154981	0.0	1.0	1.0
+chr1	154986	0.0	1.0	1.0
+chr1	154988	1.0	0.0	1.0
+chr1	154989	3.0	0.0	3.0
+chr1	154990	7.0	0.0	7.0
+chr1	154991	0.0	8.0	8.0
+chr1	154992	1.0	0.0	1.0
+chr1	154993	0.0	2.0	2.0
+chr1	154995	0.0	7.0	7.0
+chr1	154997	1.0	1.0	2.0
+chr1	155001	0.0	2.0	2.0
+chr1	155003	1.0	0.0	1.0
+chr1	155005	1.0	0.0	1.0
+chr1	155006	2.0	0.0	2.0
+chr1	155012	0.0	2.0	2.0
+chr1	155082	0.0	1.0	1.0
+chr1	155143	1.0	0.0	1.0
+chr1	155148	4.0	0.0	4.0
+chr1	155150	1.0	0.0	1.0
+chr1	155164	0.0	1.0	1.0
+chr1	155278	1.0	0.0	1.0
+chr1	155305	2.0	0.0	2.0
+chr1	155312	1.0	0.0	1.0
+chr1	155336	1.0	0.0	1.0
+chr1	155493	2.0	0.0	2.0
+chr1	155723	0.0	1.0	1.0
+chr1	155803	0.0	1.0	1.0
+chr1	156103	0.0	1.0	1.0
+chr1	156536	0.0	1.0	1.0
+chr1	156625	1.0	0.0	1.0
+chr1	156643	1.0	0.0	1.0
+chr1	156788	0.0	1.0	1.0
+chr1	157013	0.0	1.0	1.0
+chr1	157319	0.0	1.0	1.0
+chr1	157466	0.0	1.0	1.0
+chr1	157478	1.0	0.0	1.0
+chr1	157532	1.0	0.0	1.0
+chr1	157602	0.0	1.0	1.0
+chr1	157981	1.0	0.0	1.0
+chr1	158123	0.0	1.0	1.0
+chr1	158132	1.0	0.0	1.0
+chr1	158178	1.0	0.0	1.0
+chr1	158288	1.0	0.0	1.0
+chr1	158297	0.0	1.0	1.0
+chr1	158477	1.0	0.0	1.0
+chr1	158480	0.0	1.0	1.0
+chr1	158482	2.0	0.0	2.0
+chr1	158618	0.0	1.0	1.0
+chr1	158628	3.0	0.0	3.0
+chr1	158629	2.0	0.0	2.0
+chr1	158630	3.0	0.0	3.0
+chr1	158631	1.0	0.0	1.0
+chr1	158636	0.0	1.0	1.0
+chr1	158643	0.0	2.0	2.0
+chr1	158644	0.0	2.0	2.0
+chr1	158646	3.0	0.0	3.0
+chr1	158648	0.0	2.0	2.0
+chr1	158649	0.0	1.0	1.0
+chr1	158653	0.0	1.0	1.0
+chr1	158666	1.0	1.0	2.0
+chr1	158853	1.0	0.0	1.0
+chr1	158888	6.0	0.0	6.0
+chr1	158890	1.0	1.0	2.0
+chr1	158904	0.0	4.0	4.0
+chr1	158906	1.0	0.0	1.0
+chr1	158907	2.0	1.0	3.0
+chr1	158908	0.0	1.0	1.0
+chr1	158909	0.0	1.0	1.0
+chr1	158914	5.0	0.0	5.0
+chr1	158915	5.0	3.0	8.0
+chr1	158916	0.0	4.0	4.0
+chr1	158917	2.0	2.0	4.0
+chr1	158918	4.0	0.0	4.0
+chr1	158919	7.0	1.0	8.0
+chr1	158922	0.0	2.0	2.0
+chr1	158924	3.0	1.0	4.0
+chr1	158925	0.0	1.0	1.0
+chr1	158927	0.0	2.0	2.0
+chr1	158930	1.0	0.0	1.0
+chr1	158931	1.0	2.0	3.0
+chr1	158934	2.0	0.0	2.0
+chr1	158935	1.0	1.0	2.0
+chr1	158936	5.0	0.0	5.0
+chr1	158938	0.0	1.0	1.0
+chr1	158939	0.0	1.0	1.0
+chr1	158940	0.0	1.0	1.0
+chr1	158947	2.0	0.0	2.0
+chr1	158961	0.0	1.0	1.0
+chr1	159053	0.0	1.0	1.0
+chr1	159056	0.0	1.0	1.0
+chr1	159057	0.0	1.0	1.0
+chr1	159066	1.0	1.0	2.0
+chr1	159068	1.0	0.0	1.0
+chr1	159069	1.0	1.0	2.0
+chr1	159071	1.0	0.0	1.0
+chr1	159082	2.0	0.0	2.0
+chr1	159088	2.0	0.0	2.0
+chr1	159112	0.0	2.0	2.0
+chr1	159124	1.0	0.0	1.0
+chr1	159231	3.0	0.0	3.0
+chr1	159235	0.0	1.0	1.0
+chr1	159270	0.0	1.0	1.0
+chr1	159338	0.0	1.0	1.0
+chr1	159388	1.0	0.0	1.0
+chr1	159396	0.0	1.0	1.0
+chr1	159517	0.0	1.0	1.0
+chr1	159536	1.0	0.0	1.0
+chr1	159557	0.0	2.0	2.0
+chr1	159635	0.0	2.0	2.0
+chr1	159660	2.0	0.0	2.0
+chr1	159691	1.0	0.0	1.0
+chr1	159707	1.0	0.0	1.0
+chr1	159712	0.0	1.0	1.0
+chr1	159787	0.0	1.0	1.0
+chr1	160038	1.0	0.0	1.0
+chr1	160068	1.0	0.0	1.0
+chr1	160081	0.0	1.0	1.0
+chr1	160090	0.0	3.0	3.0
+chr1	160094	1.0	0.0	1.0
+chr1	160101	0.0	1.0	1.0
+chr1	160105	3.0	0.0	3.0
+chr1	160112	0.0	1.0	1.0
+chr1	160120	1.0	1.0	2.0
+chr1	160259	0.0	2.0	2.0
+chr1	160264	0.0	2.0	2.0
+chr1	160265	0.0	1.0	1.0
+chr1	160271	0.0	1.0	1.0
+chr1	160272	0.0	1.0	1.0
+chr1	160275	0.0	3.0	3.0
+chr1	160276	0.0	1.0	1.0
+chr1	160279	0.0	2.0	2.0
+chr1	160280	0.0	1.0	1.0
+chr1	160283	0.0	1.0	1.0
+chr1	160285	0.0	3.0	3.0
+chr1	160286	0.0	1.0	1.0
+chr1	160288	0.0	5.0	5.0
+chr1	160289	0.0	17.0	17.0
+chr1	160290	0.0	1.0	1.0
+chr1	160293	0.0	1.0	1.0
+chr1	160297	0.0	1.0	1.0
+chr1	160298	0.0	1.0	1.0
+chr1	160300	0.0	1.0	1.0
+chr1	160301	0.0	1.0	1.0
+chr1	160302	0.0	1.0	1.0
+chr1	160304	0.0	1.0	1.0
+chr1	160306	0.0	1.0	1.0
+chr1	160310	0.0	1.0	1.0
+chr1	160312	5.0	0.0	5.0
+chr1	160314	0.0	1.0	1.0
+chr1	160316	0.0	1.0	1.0
+chr1	160319	5.0	0.0	5.0
+chr1	160322	0.0	2.0	2.0
+chr1	160324	2.0	0.0	2.0
+chr1	160330	1.0	3.0	4.0
+chr1	160331	0.0	1.0	1.0
+chr1	160332	1.0	1.0	2.0
+chr1	160335	1.0	0.0	1.0
+chr1	160341	0.0	1.0	1.0
+chr1	160362	1.0	0.0	1.0
+chr1	160368	1.0	0.0	1.0
+chr1	160379	1.0	0.0	1.0
+chr1	160380	1.0	0.0	1.0
+chr1	160381	1.0	0.0	1.0
+chr1	160390	1.0	0.0	1.0
+chr1	160391	0.0	1.0	1.0
+chr1	160392	3.0	0.0	3.0
+chr1	160412	0.0	1.0	1.0
+chr1	160413	1.0	0.0	1.0
+chr1	160414	2.0	0.0	2.0
+chr1	160418	2.0	0.0	2.0
+chr1	160419	1.0	0.0	1.0
+chr1	160425	1.0	0.0	1.0
+chr1	160439	0.0	1.0	1.0
+chr1	160440	2.0	1.0	3.0
+chr1	160446	1.0	2.0	3.0
+chr1	160447	1.0	0.0	1.0
+chr1	160448	2.0	1.0	3.0
+chr1	160456	0.0	1.0	1.0
+chr1	160458	0.0	1.0	1.0
+chr1	160468	0.0	1.0	1.0
+chr1	160474	1.0	0.0	1.0
+chr1	160476	1.0	0.0	1.0
+chr1	160478	0.0	1.0	1.0
+chr1	160481	0.0	1.0	1.0
+chr1	160488	0.0	1.0	1.0
+chr1	160492	5.0	0.0	5.0
+chr1	160495	1.0	0.0	1.0
+chr1	160496	2.0	0.0	2.0
+chr1	160498	1.0	0.0	1.0
+chr1	160499	1.0	1.0	2.0
+chr1	160502	0.0	5.0	5.0
+chr1	160510	6.0	0.0	6.0
+chr1	160511	3.0	0.0	3.0
+chr1	160514	1.0	0.0	1.0
+chr1	160515	2.0	0.0	2.0
+chr1	160516	1.0	0.0	1.0
+chr1	160526	2.0	0.0	2.0
+chr1	160546	2.0	0.0	2.0
+chr1	160550	1.0	0.0	1.0
+chr1	160551	1.0	0.0	1.0
+chr1	160554	1.0	0.0	1.0
+chr1	160619	1.0	0.0	1.0
+chr1	160642	1.0	0.0	1.0
+chr1	160645	1.0	0.0	1.0
+chr1	160648	0.0	2.0	2.0
+chr1	160665	0.0	1.0	1.0
+chr1	160670	2.0	0.0	2.0
+chr1	160674	1.0	0.0	1.0
+chr1	160696	1.0	0.0	1.0
+chr1	160697	0.0	1.0	1.0
+chr1	160731	0.0	1.0	1.0
+chr1	160807	1.0	0.0	1.0
+chr1	160845	0.0	1.0	1.0
+chr1	160864	0.0	2.0	2.0
+chr1	160865	1.0	0.0	1.0
+chr1	160866	1.0	0.0	1.0
+chr1	160874	0.0	1.0	1.0
+chr1	160883	0.0	3.0	3.0
+chr1	160897	1.0	0.0	1.0
+chr1	160911	0.0	1.0	1.0
+chr1	160941	0.0	1.0	1.0
+chr1	160942	1.0	0.0	1.0
+chr1	160950	0.0	1.0	1.0
+chr1	160955	0.0	2.0	2.0
+chr1	160965	0.0	1.0	1.0
+chr1	160966	1.0	0.0	1.0
+chr1	160967	1.0	0.0	1.0
+chr1	160970	0.0	1.0	1.0
+chr1	160975	1.0	0.0	1.0
+chr1	161017	0.0	1.0	1.0
+chr1	161021	0.0	2.0	2.0
+chr1	161026	0.0	1.0	1.0
+chr1	161051	0.0	1.0	1.0
+chr1	161063	0.0	1.0	1.0
+chr1	161069	0.0	2.0	2.0
+chr1	161083	0.0	1.0	1.0
+chr1	161092	0.0	1.0	1.0
+chr1	161106	1.0	0.0	1.0
+chr1	161123	0.0	1.0	1.0
+chr1	161132	1.0	0.0	1.0
+chr1	161136	1.0	0.0	1.0
+chr1	161142	1.0	0.0	1.0
+chr1	161170	1.0	0.0	1.0
+chr1	161173	0.0	1.0	1.0
+chr1	161207	0.0	1.0	1.0
+chr1	161236	1.0	0.0	1.0
+chr1	161246	0.0	1.0	1.0
+chr1	161267	0.0	1.0	1.0
+chr1	161269	0.0	1.0	1.0
+chr1	161275	1.0	0.0	1.0
+chr1	161303	0.0	1.0	1.0
+chr1	161304	0.0	1.0	1.0
+chr1	161311	2.0	0.0	2.0
+chr1	161315	0.0	2.0	2.0
+chr1	161317	1.0	0.0	1.0
+chr1	161325	1.0	0.0	1.0
+chr1	161327	0.0	1.0	1.0
+chr1	161333	1.0	0.0	1.0
+chr1	161339	0.0	1.0	1.0
+chr1	161344	0.0	1.0	1.0
+chr1	161351	1.0	0.0	1.0
+chr1	161355	1.0	1.0	2.0
+chr1	161358	1.0	0.0	1.0
+chr1	161368	0.0	1.0	1.0
+chr1	161370	1.0	0.0	1.0
+chr1	161382	0.0	1.0	1.0
+chr1	161394	0.0	1.0	1.0
+chr1	161395	1.0	0.0	1.0
+chr1	161406	0.0	1.0	1.0
+chr1	161407	0.0	2.0	2.0
+chr1	161426	0.0	1.0	1.0
+chr1	161430	1.0	0.0	1.0
+chr1	161446	1.0	0.0	1.0
+chr1	161556	1.0	0.0	1.0
+chr1	161572	0.0	1.0	1.0
+chr1	161575	0.0	1.0	1.0
+chr1	161577	1.0	0.0	1.0
+chr1	161580	1.0	0.0	1.0
+chr1	161630	1.0	0.0	1.0
+chr1	161642	0.0	1.0	1.0
+chr1	161650	2.0	0.0	2.0
+chr1	161655	1.0	0.0	1.0
+chr1	161659	1.0	0.0	1.0
+chr1	161662	5.0	0.0	5.0
+chr1	161675	0.0	1.0	1.0
+chr1	161680	1.0	1.0	2.0
+chr1	161681	0.0	1.0	1.0
+chr1	161684	0.0	2.0	2.0
+chr1	161698	2.0	0.0	2.0
+chr1	161706	0.0	1.0	1.0
+chr1	161707	0.0	1.0	1.0
+chr1	161708	0.0	1.0	1.0
+chr1	161741	1.0	0.0	1.0
+chr1	161749	0.0	1.0	1.0
+chr1	161759	0.0	2.0	2.0
+chr1	161765	1.0	0.0	1.0
+chr1	161782	1.0	0.0	1.0
+chr1	161794	1.0	0.0	1.0
+chr1	161802	0.0	1.0	1.0
+chr1	161826	0.0	1.0	1.0
+chr1	161885	0.0	1.0	1.0
+chr1	161887	0.0	1.0	1.0
+chr1	161896	0.0	1.0	1.0
+chr1	161897	0.0	1.0	1.0
+chr1	161898	0.0	2.0	2.0
+chr1	161904	1.0	0.0	1.0
+chr1	161914	0.0	1.0	1.0
+chr1	161915	0.0	1.0	1.0
+chr1	161924	0.0	1.0	1.0
+chr1	161927	1.0	0.0	1.0
+chr1	161934	2.0	0.0	2.0
+chr1	161937	1.0	1.0	2.0
+chr1	161949	0.0	2.0	2.0
+chr1	161965	0.0	1.0	1.0
+chr1	161968	1.0	0.0	1.0
+chr1	161976	0.0	1.0	1.0
+chr1	161984	0.0	1.0	1.0
+chr1	162025	0.0	1.0	1.0
+chr1	162029	0.0	1.0	1.0
+chr1	162042	0.0	1.0	1.0
+chr1	162051	0.0	1.0	1.0
+chr1	162085	1.0	0.0	1.0
+chr1	162099	1.0	0.0	1.0
+chr1	162116	0.0	1.0	1.0
+chr1	162128	1.0	0.0	1.0
+chr1	162129	1.0	0.0	1.0
+chr1	162133	0.0	1.0	1.0
+chr1	162145	0.0	1.0	1.0
+chr1	162152	1.0	0.0	1.0
+chr1	162154	0.0	1.0	1.0
+chr1	162163	1.0	0.0	1.0
+chr1	162172	1.0	0.0	1.0
+chr1	162178	0.0	1.0	1.0
+chr1	162196	1.0	0.0	1.0
+chr1	162219	1.0	1.0	2.0
+chr1	162235	0.0	1.0	1.0
+chr1	162240	1.0	0.0	1.0
+chr1	162263	1.0	0.0	1.0
+chr1	162264	0.0	2.0	2.0
+chr1	162267	1.0	0.0	1.0
+chr1	162276	0.0	1.0	1.0
+chr1	162284	0.0	1.0	1.0
+chr1	162291	1.0	0.0	1.0
+chr1	162313	0.0	1.0	1.0
+chr1	162346	0.0	1.0	1.0
+chr1	162376	0.0	1.0	1.0
+chr1	162394	1.0	0.0	1.0
+chr1	162395	0.0	1.0	1.0
+chr1	162396	1.0	0.0	1.0
+chr1	162408	0.0	1.0	1.0
+chr1	162410	0.0	2.0	2.0
+chr1	162418	0.0	1.0	1.0
+chr1	162423	1.0	0.0	1.0
+chr1	162425	1.0	0.0	1.0
+chr1	162426	0.0	1.0	1.0
+chr1	162453	0.0	3.0	3.0
+chr1	162461	1.0	0.0	1.0
+chr1	162466	0.0	1.0	1.0
+chr1	162469	1.0	0.0	1.0
+chr1	162483	1.0	0.0	1.0
+chr1	162497	2.0	0.0	2.0
+chr1	162524	0.0	1.0	1.0
+chr1	162561	1.0	0.0	1.0
+chr1	162564	1.0	0.0	1.0
+chr1	162566	1.0	0.0	1.0
+chr1	162573	0.0	1.0	1.0
+chr1	162588	0.0	1.0	1.0
+chr1	162617	2.0	0.0	2.0
+chr1	162620	0.0	2.0	2.0
+chr1	162632	1.0	0.0	1.0
+chr1	162633	0.0	1.0	1.0
+chr1	162635	1.0	0.0	1.0
+chr1	162643	1.0	0.0	1.0
+chr1	162649	1.0	0.0	1.0
+chr1	162671	1.0	0.0	1.0
+chr1	162672	1.0	0.0	1.0
+chr1	162675	1.0	0.0	1.0
+chr1	162699	0.0	1.0	1.0
+chr1	162718	0.0	2.0	2.0
+chr1	162721	0.0	1.0	1.0
+chr1	162726	2.0	0.0	2.0
+chr1	162744	0.0	1.0	1.0
+chr1	162753	2.0	0.0	2.0
+chr1	162757	3.0	1.0	4.0
+chr1	162759	0.0	1.0	1.0
+chr1	162772	1.0	0.0	1.0
+chr1	162774	1.0	0.0	1.0
+chr1	162779	1.0	0.0	1.0
+chr1	162807	0.0	1.0	1.0
+chr1	162810	2.0	0.0	2.0
+chr1	162827	0.0	1.0	1.0
+chr1	162829	1.0	0.0	1.0
+chr1	162876	2.0	0.0	2.0
+chr1	162877	2.0	0.0	2.0
+chr1	162881	2.0	0.0	2.0
+chr1	162882	1.0	0.0	1.0
+chr1	162903	0.0	1.0	1.0
+chr1	162908	2.0	0.0	2.0
+chr1	162915	1.0	0.0	1.0
+chr1	162922	0.0	1.0	1.0
+chr1	162930	1.0	0.0	1.0
+chr1	162949	0.0	1.0	1.0
+chr1	162954	1.0	0.0	1.0
+chr1	162961	0.0	1.0	1.0
+chr1	162963	0.0	1.0	1.0
+chr1	162980	1.0	0.0	1.0
+chr1	162983	1.0	0.0	1.0
+chr1	162998	1.0	0.0	1.0
+chr1	163005	2.0	0.0	2.0
+chr1	163021	0.0	1.0	1.0
+chr1	163023	1.0	0.0	1.0
+chr1	163029	1.0	0.0	1.0
+chr1	163030	1.0	0.0	1.0
+chr1	163032	3.0	0.0	3.0
+chr1	163046	1.0	0.0	1.0
+chr1	163050	1.0	0.0	1.0
+chr1	163069	0.0	1.0	1.0
+chr1	163090	0.0	1.0	1.0
+chr1	163091	0.0	1.0	1.0
+chr1	163129	0.0	2.0	2.0
+chr1	163131	1.0	0.0	1.0
+chr1	163133	0.0	1.0	1.0
+chr1	163143	1.0	0.0	1.0
+chr1	163147	1.0	0.0	1.0
+chr1	163149	1.0	0.0	1.0
+chr1	163151	1.0	0.0	1.0
+chr1	163160	0.0	1.0	1.0
+chr1	163170	3.0	0.0	3.0
+chr1	163186	2.0	0.0	2.0
+chr1	163190	1.0	0.0	1.0
+chr1	163200	1.0	0.0	1.0
+chr1	163201	0.0	2.0	2.0
+chr1	163203	2.0	0.0	2.0
+chr1	163239	1.0	0.0	1.0
+chr1	163240	0.0	2.0	2.0
+chr1	163245	1.0	0.0	1.0
+chr1	163250	0.0	1.0	1.0
+chr1	163256	1.0	0.0	1.0
+chr1	163261	0.0	1.0	1.0
+chr1	163269	0.0	1.0	1.0
+chr1	163278	0.0	2.0	2.0
+chr1	163279	1.0	0.0	1.0
+chr1	163285	0.0	1.0	1.0
+chr1	163287	2.0	0.0	2.0
+chr1	163293	1.0	0.0	1.0
+chr1	163304	0.0	1.0	1.0
+chr1	163306	0.0	2.0	2.0
+chr1	163322	1.0	0.0	1.0
+chr1	163330	1.0	1.0	2.0
+chr1	163332	1.0	0.0	1.0
+chr1	163335	0.0	1.0	1.0
+chr1	163339	0.0	1.0	1.0
+chr1	163340	1.0	0.0	1.0
+chr1	163343	1.0	1.0	2.0
+chr1	163344	0.0	1.0	1.0
+chr1	163345	3.0	0.0	3.0
+chr1	163346	0.0	1.0	1.0
+chr1	163347	1.0	0.0	1.0
+chr1	163349	1.0	0.0	1.0
+chr1	163350	0.0	2.0	2.0
+chr1	163351	0.0	1.0	1.0
+chr1	163357	1.0	0.0	1.0
+chr1	163359	1.0	0.0	1.0
+chr1	163368	1.0	0.0	1.0
+chr1	163369	0.0	1.0	1.0
+chr1	163391	2.0	0.0	2.0
+chr1	163405	2.0	0.0	2.0
+chr1	163428	0.0	1.0	1.0
+chr1	163452	2.0	0.0	2.0
+chr1	163457	0.0	2.0	2.0
+chr1	163500	1.0	0.0	1.0
+chr1	163510	1.0	0.0	1.0
+chr1	163512	0.0	1.0	1.0
+chr1	163515	0.0	1.0	1.0
+chr1	163516	0.0	1.0	1.0
+chr1	163521	0.0	1.0	1.0
+chr1	163522	0.0	1.0	1.0
+chr1	163527	2.0	1.0	3.0
+chr1	163533	1.0	0.0	1.0
+chr1	163534	0.0	1.0	1.0
+chr1	163542	1.0	0.0	1.0
+chr1	163549	2.0	0.0	2.0
+chr1	163560	0.0	2.0	2.0
+chr1	163563	0.0	1.0	1.0
+chr1	163565	0.0	1.0	1.0
+chr1	163585	1.0	0.0	1.0
+chr1	163589	0.0	1.0	1.0
+chr1	163595	0.0	1.0	1.0
+chr1	163607	3.0	0.0	3.0
+chr1	163622	0.0	1.0	1.0
+chr1	163624	1.0	0.0	1.0
+chr1	163625	0.0	1.0	1.0
+chr1	163655	0.0	4.0	4.0
+chr1	163662	0.0	2.0	2.0
+chr1	163664	1.0	0.0	1.0
+chr1	163665	0.0	1.0	1.0
+chr1	163670	0.0	1.0	1.0
+chr1	163675	2.0	0.0	2.0
+chr1	163676	1.0	0.0	1.0
+chr1	163681	0.0	2.0	2.0
+chr1	163684	0.0	1.0	1.0
+chr1	163686	1.0	0.0	1.0
+chr1	163701	0.0	3.0	3.0
+chr1	163713	1.0	0.0	1.0
+chr1	163716	1.0	0.0	1.0
+chr1	163717	1.0	1.0	2.0
+chr1	163720	0.0	2.0	2.0
+chr1	163724	0.0	1.0	1.0
+chr1	163748	4.0	0.0	4.0
+chr1	163751	1.0	0.0	1.0
+chr1	163774	0.0	3.0	3.0
+chr1	163779	3.0	0.0	3.0
+chr1	163781	0.0	1.0	1.0
+chr1	163785	0.0	2.0	2.0
+chr1	163787	1.0	0.0	1.0
+chr1	163795	1.0	0.0	1.0
+chr1	163807	0.0	1.0	1.0
+chr1	163809	0.0	1.0	1.0
+chr1	163820	0.0	1.0	1.0
+chr1	163832	1.0	0.0	1.0
+chr1	163833	1.0	0.0	1.0
+chr1	163837	0.0	1.0	1.0
+chr1	163840	2.0	0.0	2.0
+chr1	163850	0.0	1.0	1.0
+chr1	163862	0.0	1.0	1.0
+chr1	163868	0.0	1.0	1.0
+chr1	163870	0.0	1.0	1.0
+chr1	163875	0.0	2.0	2.0
+chr1	163884	0.0	3.0	3.0
+chr1	163888	6.0	0.0	6.0
+chr1	163894	0.0	1.0	1.0
+chr1	163915	2.0	0.0	2.0
+chr1	163918	0.0	1.0	1.0
+chr1	163925	2.0	0.0	2.0
+chr1	163927	0.0	1.0	1.0
+chr1	163937	0.0	1.0	1.0
+chr1	163944	0.0	1.0	1.0
+chr1	163950	1.0	0.0	1.0
+chr1	163956	1.0	0.0	1.0
+chr1	163958	0.0	1.0	1.0
+chr1	163966	0.0	1.0	1.0
+chr1	163972	1.0	0.0	1.0
+chr1	163984	1.0	0.0	1.0
+chr1	163989	2.0	0.0	2.0
+chr1	163999	1.0	0.0	1.0
+chr1	164004	0.0	1.0	1.0
+chr1	164009	1.0	0.0	1.0
+chr1	164010	0.0	3.0	3.0
+chr1	164014	0.0	1.0	1.0
+chr1	164015	0.0	1.0	1.0
+chr1	164016	0.0	14.0	14.0
+chr1	164026	0.0	2.0	2.0
+chr1	164043	3.0	0.0	3.0
+chr1	164045	0.0	1.0	1.0
+chr1	164060	0.0	1.0	1.0
+chr1	164068	1.0	0.0	1.0
+chr1	164074	1.0	0.0	1.0
+chr1	164077	2.0	0.0	2.0
+chr1	164084	1.0	0.0	1.0
+chr1	164093	0.0	1.0	1.0
+chr1	164097	1.0	0.0	1.0
+chr1	164112	1.0	0.0	1.0
+chr1	164115	0.0	1.0	1.0
+chr1	164124	3.0	1.0	4.0
+chr1	164144	0.0	1.0	1.0
+chr1	164149	0.0	1.0	1.0
+chr1	164152	1.0	0.0	1.0
+chr1	164157	0.0	1.0	1.0
+chr1	164158	1.0	0.0	1.0
+chr1	164162	0.0	1.0	1.0
+chr1	164165	1.0	0.0	1.0
+chr1	164166	1.0	0.0	1.0
+chr1	164175	1.0	0.0	1.0
+chr1	164177	1.0	0.0	1.0
+chr1	164182	0.0	3.0	3.0
+chr1	164199	1.0	0.0	1.0
+chr1	164212	0.0	1.0	1.0
+chr1	164217	1.0	0.0	1.0
+chr1	164218	1.0	0.0	1.0
+chr1	164222	0.0	1.0	1.0
+chr1	164223	0.0	3.0	3.0
+chr1	164243	1.0	0.0	1.0
+chr1	164247	1.0	0.0	1.0
+chr1	164267	4.0	0.0	4.0
+chr1	164272	1.0	0.0	1.0
+chr1	164280	0.0	1.0	1.0
+chr1	164284	3.0	0.0	3.0
+chr1	164292	0.0	1.0	1.0
+chr1	164297	1.0	3.0	4.0
+chr1	164298	0.0	2.0	2.0
+chr1	164299	0.0	1.0	1.0
+chr1	164302	1.0	0.0	1.0
+chr1	164303	0.0	1.0	1.0
+chr1	164305	0.0	1.0	1.0
+chr1	164311	1.0	0.0	1.0
+chr1	164312	1.0	1.0	2.0
+chr1	164313	1.0	1.0	2.0
+chr1	164319	1.0	0.0	1.0
+chr1	164320	0.0	1.0	1.0
+chr1	164321	0.0	1.0	1.0
+chr1	164322	1.0	0.0	1.0
+chr1	164333	1.0	0.0	1.0
+chr1	164336	1.0	0.0	1.0
+chr1	164338	1.0	0.0	1.0
+chr1	164355	1.0	0.0	1.0
+chr1	164356	1.0	0.0	1.0
+chr1	164376	0.0	1.0	1.0
+chr1	164404	1.0	0.0	1.0
+chr1	164409	1.0	0.0	1.0
+chr1	164412	0.0	1.0	1.0
+chr1	164432	0.0	1.0	1.0
+chr1	164444	0.0	1.0	1.0
+chr1	164446	2.0	0.0	2.0
+chr1	164455	2.0	0.0	2.0
+chr1	164456	0.0	1.0	1.0
+chr1	164463	1.0	0.0	1.0
+chr1	164467	0.0	3.0	3.0
+chr1	164468	1.0	0.0	1.0
+chr1	164471	2.0	0.0	2.0
+chr1	164476	0.0	1.0	1.0
+chr1	164488	0.0	1.0	1.0
+chr1	164489	1.0	0.0	1.0
+chr1	164490	4.0	1.0	5.0
+chr1	164493	2.0	0.0	2.0
+chr1	164495	0.0	1.0	1.0
+chr1	164496	0.0	1.0	1.0
+chr1	164499	1.0	0.0	1.0
+chr1	164503	1.0	1.0	2.0
+chr1	164506	5.0	4.0	9.0
+chr1	164512	0.0	1.0	1.0
+chr1	164515	1.0	1.0	2.0
+chr1	164516	0.0	1.0	1.0
+chr1	164521	1.0	0.0	1.0
+chr1	164522	4.0	0.0	4.0
+chr1	164526	0.0	1.0	1.0
+chr1	164529	0.0	2.0	2.0
+chr1	164531	0.0	1.0	1.0
+chr1	164532	0.0	2.0	2.0
+chr1	164535	1.0	0.0	1.0
+chr1	164536	1.0	0.0	1.0
+chr1	164537	1.0	0.0	1.0
+chr1	164538	0.0	1.0	1.0
+chr1	164569	0.0	1.0	1.0
+chr1	164572	0.0	2.0	2.0
+chr1	164585	1.0	1.0	2.0
+chr1	164587	1.0	0.0	1.0
+chr1	164588	1.0	0.0	1.0
+chr1	164589	0.0	1.0	1.0
+chr1	164602	1.0	0.0	1.0
+chr1	164603	1.0	0.0	1.0
+chr1	164606	1.0	1.0	2.0
+chr1	164609	2.0	0.0	2.0
+chr1	164612	0.0	2.0	2.0
+chr1	164614	1.0	0.0	1.0
+chr1	164617	0.0	1.0	1.0
+chr1	164618	2.0	3.0	5.0
+chr1	164619	0.0	4.0	4.0
+chr1	164620	0.0	1.0	1.0
+chr1	164623	1.0	0.0	1.0
+chr1	164624	1.0	0.0	1.0
+chr1	164625	0.0	1.0	1.0
+chr1	164627	0.0	1.0	1.0
+chr1	164628	1.0	0.0	1.0
+chr1	164629	3.0	0.0	3.0
+chr1	164630	1.0	1.0	2.0
+chr1	164638	0.0	2.0	2.0
+chr1	164640	2.0	0.0	2.0
+chr1	164642	2.0	0.0	2.0
+chr1	164646	0.0	8.0	8.0
+chr1	164647	0.0	2.0	2.0
+chr1	164655	1.0	0.0	1.0
+chr1	164656	2.0	0.0	2.0
+chr1	164658	0.0	1.0	1.0
+chr1	164659	0.0	2.0	2.0
+chr1	164663	1.0	1.0	2.0
+chr1	164664	0.0	1.0	1.0
+chr1	164666	0.0	3.0	3.0
+chr1	164667	0.0	3.0	3.0
+chr1	164668	3.0	0.0	3.0
+chr1	164678	2.0	0.0	2.0
+chr1	164684	0.0	4.0	4.0
+chr1	164686	1.0	0.0	1.0
+chr1	164687	5.0	0.0	5.0
+chr1	164688	0.0	1.0	1.0
+chr1	164689	1.0	0.0	1.0
+chr1	164692	1.0	1.0	2.0
+chr1	164695	0.0	2.0	2.0
+chr1	164697	0.0	2.0	2.0
+chr1	164698	0.0	1.0	1.0
+chr1	164706	0.0	1.0	1.0
+chr1	164708	0.0	1.0	1.0
+chr1	164714	0.0	1.0	1.0
+chr1	164722	1.0	0.0	1.0
+chr1	164726	0.0	1.0	1.0
+chr1	164731	1.0	0.0	1.0
+chr1	164733	2.0	0.0	2.0
+chr1	164734	0.0	1.0	1.0
+chr1	164739	1.0	0.0	1.0
+chr1	164751	0.0	1.0	1.0
+chr1	164754	0.0	1.0	1.0
+chr1	164760	1.0	0.0	1.0
+chr1	164766	0.0	1.0	1.0
+chr1	164775	1.0	0.0	1.0
+chr1	164777	2.0	0.0	2.0
+chr1	164790	0.0	2.0	2.0
+chr1	164794	2.0	3.0	5.0
+chr1	164798	1.0	0.0	1.0
+chr1	164800	3.0	0.0	3.0
+chr1	164809	0.0	1.0	1.0
+chr1	164810	1.0	0.0	1.0
+chr1	164813	1.0	0.0	1.0
+chr1	164814	0.0	2.0	2.0
+chr1	164815	2.0	0.0	2.0
+chr1	164818	0.0	3.0	3.0
+chr1	164819	1.0	0.0	1.0
+chr1	164820	2.0	0.0	2.0
+chr1	164821	4.0	0.0	4.0
+chr1	164822	0.0	3.0	3.0
+chr1	164823	0.0	3.0	3.0
+chr1	164824	0.0	5.0	5.0
+chr1	164825	0.0	3.0	3.0
+chr1	164831	0.0	1.0	1.0
+chr1	164833	0.0	1.0	1.0
+chr1	164835	2.0	0.0	2.0
+chr1	164836	1.0	0.0	1.0
+chr1	164839	1.0	0.0	1.0
+chr1	164841	0.0	6.0	6.0
+chr1	164843	2.0	2.0	4.0
+chr1	164845	1.0	1.0	2.0
+chr1	164850	0.0	4.0	4.0
+chr1	164852	0.0	2.0	2.0
+chr1	164854	1.0	8.0	9.0
+chr1	164855	2.0	0.0	2.0
+chr1	164862	0.0	1.0	1.0
+chr1	164866	1.0	0.0	1.0
+chr1	164867	2.0	0.0	2.0
+chr1	164874	5.0	0.0	5.0
+chr1	164876	0.0	1.0	1.0
+chr1	164878	0.0	1.0	1.0
+chr1	164879	2.0	0.0	2.0
+chr1	164880	0.0	1.0	1.0
+chr1	164884	0.0	1.0	1.0
+chr1	164885	0.0	1.0	1.0
+chr1	164896	0.0	1.0	1.0
+chr1	164898	1.0	0.0	1.0
+chr1	164903	0.0	1.0	1.0
+chr1	164906	1.0	0.0	1.0
+chr1	164909	0.0	1.0	1.0
+chr1	164922	1.0	0.0	1.0
+chr1	164928	1.0	0.0	1.0
+chr1	164934	0.0	1.0	1.0
+chr1	164948	1.0	0.0	1.0
+chr1	164949	1.0	1.0	2.0
+chr1	164951	1.0	0.0	1.0
+chr1	164954	0.0	3.0	3.0
+chr1	164955	1.0	0.0	1.0
+chr1	164957	0.0	2.0	2.0
+chr1	164960	0.0	1.0	1.0
+chr1	164961	0.0	5.0	5.0
+chr1	164962	2.0	2.0	4.0
+chr1	164963	0.0	1.0	1.0
+chr1	164965	5.0	1.0	6.0
+chr1	164966	0.0	2.0	2.0
+chr1	164972	0.0	5.0	5.0
+chr1	164979	2.0	0.0	2.0
+chr1	164980	4.0	0.0	4.0
+chr1	164981	2.0	0.0	2.0
+chr1	164982	8.0	0.0	8.0
+chr1	164983	2.0	0.0	2.0
+chr1	164985	0.0	4.0	4.0
+chr1	164986	0.0	4.0	4.0
+chr1	164987	1.0	0.0	1.0
+chr1	164988	0.0	6.0	6.0
+chr1	164991	4.0	0.0	4.0
+chr1	164992	1.0	0.0	1.0
+chr1	164993	1.0	0.0	1.0
+chr1	164994	0.0	1.0	1.0
+chr1	164995	0.0	3.0	3.0
+chr1	164996	1.0	1.0	2.0
+chr1	164998	1.0	0.0	1.0
+chr1	165001	0.0	2.0	2.0
+chr1	165003	0.0	5.0	5.0
+chr1	165004	1.0	1.0	2.0
+chr1	165005	1.0	1.0	2.0
+chr1	165006	1.0	0.0	1.0
+chr1	165007	1.0	0.0	1.0
+chr1	165008	5.0	2.0	7.0
+chr1	165009	11.0	0.0	11.0
+chr1	165010	1.0	2.0	3.0
+chr1	165012	1.0	2.0	3.0
+chr1	165013	0.0	1.0	1.0
+chr1	165014	3.0	3.0	6.0
+chr1	165015	0.0	1.0	1.0
+chr1	165019	0.0	10.0	10.0
+chr1	165020	0.0	6.0	6.0
+chr1	165021	0.0	4.0	4.0
+chr1	165022	3.0	1.0	4.0
+chr1	165023	0.0	3.0	3.0
+chr1	165024	0.0	10.0	10.0
+chr1	165025	1.0	0.0	1.0
+chr1	165026	6.0	0.0	6.0
+chr1	165027	1.0	14.0	15.0
+chr1	165028	7.0	2.0	9.0
+chr1	165032	2.0	0.0	2.0
+chr1	165033	4.0	0.0	4.0
+chr1	165034	3.0	3.0	6.0
+chr1	165035	3.0	1.0	4.0
+chr1	165036	4.0	0.0	4.0
+chr1	165037	16.0	0.0	16.0
+chr1	165038	1.0	4.0	5.0
+chr1	165039	0.0	3.0	3.0
+chr1	165041	0.0	1.0	1.0
+chr1	165042	0.0	6.0	6.0
+chr1	165043	1.0	0.0	1.0
+chr1	165044	1.0	0.0	1.0
+chr1	165045	1.0	1.0	2.0
+chr1	165046	5.0	0.0	5.0
+chr1	165049	5.0	2.0	7.0
+chr1	165052	0.0	1.0	1.0
+chr1	165053	0.0	1.0	1.0
+chr1	165055	1.0	0.0	1.0
+chr1	165056	0.0	1.0	1.0
+chr1	165059	0.0	3.0	3.0
+chr1	165060	0.0	1.0	1.0
+chr1	165062	2.0	0.0	2.0
+chr1	165064	3.0	0.0	3.0
+chr1	165067	1.0	0.0	1.0
+chr1	165068	3.0	0.0	3.0
+chr1	165070	1.0	0.0	1.0
+chr1	165071	0.0	1.0	1.0
+chr1	165092	0.0	1.0	1.0
+chr1	165096	0.0	1.0	1.0
+chr1	165100	0.0	4.0	4.0
+chr1	165102	0.0	1.0	1.0
+chr1	165112	4.0	1.0	5.0
+chr1	165113	2.0	0.0	2.0
+chr1	165114	7.0	3.0	10.0
+chr1	165115	0.0	5.0	5.0
+chr1	165117	0.0	2.0	2.0
+chr1	165119	0.0	1.0	1.0
+chr1	165121	4.0	0.0	4.0
+chr1	165122	4.0	0.0	4.0
+chr1	165126	2.0	0.0	2.0
+chr1	165130	0.0	3.0	3.0
+chr1	165131	0.0	6.0	6.0
+chr1	165132	0.0	2.0	2.0
+chr1	165133	0.0	1.0	1.0
+chr1	165135	3.0	0.0	3.0
+chr1	165136	4.0	0.0	4.0
+chr1	165138	1.0	0.0	1.0
+chr1	165143	7.0	1.0	8.0
+chr1	165145	4.0	0.0	4.0
+chr1	165147	0.0	1.0	1.0
+chr1	165149	2.0	3.0	5.0
+chr1	165150	4.0	1.0	5.0
+chr1	165153	3.0	1.0	4.0
+chr1	165154	0.0	2.0	2.0
+chr1	165155	1.0	0.0	1.0
+chr1	165156	4.0	2.0	6.0
+chr1	165158	0.0	1.0	1.0
+chr1	165162	6.0	0.0	6.0
+chr1	165163	0.0	2.0	2.0
+chr1	165168	0.0	1.0	1.0
+chr1	165172	0.0	1.0	1.0
+chr1	165174	4.0	0.0	4.0
+chr1	165176	1.0	2.0	3.0
+chr1	165178	0.0	1.0	1.0
+chr1	165180	6.0	2.0	8.0
+chr1	165181	3.0	4.0	7.0
+chr1	165182	0.0	3.0	3.0
+chr1	165183	0.0	1.0	1.0
+chr1	165186	0.0	2.0	2.0
+chr1	165191	1.0	0.0	1.0
+chr1	165192	2.0	9.0	11.0
+chr1	165193	1.0	1.0	2.0
+chr1	165194	0.0	1.0	1.0
+chr1	165195	0.0	1.0	1.0
+chr1	165196	1.0	0.0	1.0
+chr1	165199	6.0	0.0	6.0
+chr1	165200	7.0	0.0	7.0
+chr1	165201	4.0	0.0	4.0
+chr1	165204	0.0	1.0	1.0
+chr1	165207	0.0	3.0	3.0
+chr1	165208	1.0	1.0	2.0
+chr1	165209	2.0	0.0	2.0
+chr1	165210	17.0	0.0	17.0
+chr1	165212	1.0	3.0	4.0
+chr1	165213	4.0	0.0	4.0
+chr1	165214	1.0	6.0	7.0
+chr1	165215	0.0	2.0	2.0
+chr1	165216	0.0	6.0	6.0
+chr1	165217	1.0	1.0	2.0
+chr1	165219	6.0	3.0	9.0
+chr1	165220	1.0	8.0	9.0
+chr1	165221	0.0	4.0	4.0
+chr1	165222	1.0	0.0	1.0
+chr1	165223	3.0	0.0	3.0
+chr1	165226	0.0	1.0	1.0
+chr1	165229	1.0	1.0	2.0
+chr1	165231	0.0	1.0	1.0
+chr1	165232	0.0	12.0	12.0
+chr1	165233	0.0	3.0	3.0
+chr1	165234	0.0	1.0	1.0
+chr1	165235	2.0	0.0	2.0
+chr1	165236	0.0	1.0	1.0
+chr1	165239	1.0	0.0	1.0
+chr1	165245	0.0	3.0	3.0
+chr1	165246	0.0	2.0	2.0
+chr1	165249	1.0	0.0	1.0
+chr1	165251	1.0	0.0	1.0
+chr1	165252	0.0	1.0	1.0
+chr1	165253	2.0	0.0	2.0
+chr1	165258	0.0	1.0	1.0
+chr1	165259	0.0	3.0	3.0
+chr1	165264	2.0	1.0	3.0
+chr1	165266	1.0	0.0	1.0
+chr1	165270	1.0	0.0	1.0
+chr1	165271	1.0	0.0	1.0
+chr1	165272	2.0	0.0	2.0
+chr1	165275	0.0	1.0	1.0
+chr1	165280	1.0	0.0	1.0
+chr1	165283	1.0	0.0	1.0
+chr1	165287	0.0	1.0	1.0
+chr1	165291	0.0	1.0	1.0
+chr1	165292	0.0	7.0	7.0
+chr1	165297	2.0	0.0	2.0
+chr1	165304	1.0	1.0	2.0
+chr1	165308	0.0	2.0	2.0
+chr1	165309	1.0	0.0	1.0
+chr1	165313	0.0	1.0	1.0
+chr1	165316	1.0	0.0	1.0
+chr1	165322	1.0	0.0	1.0
+chr1	165323	2.0	0.0	2.0
+chr1	165326	0.0	1.0	1.0
+chr1	165332	0.0	5.0	5.0
+chr1	165333	0.0	3.0	3.0
+chr1	165335	1.0	0.0	1.0
+chr1	165336	0.0	1.0	1.0
+chr1	165338	0.0	2.0	2.0
+chr1	165339	0.0	2.0	2.0
+chr1	165342	1.0	0.0	1.0
+chr1	165343	2.0	0.0	2.0
+chr1	165344	9.0	3.0	12.0
+chr1	165345	2.0	3.0	5.0
+chr1	165346	1.0	1.0	2.0
+chr1	165351	0.0	1.0	1.0
+chr1	165353	0.0	1.0	1.0
+chr1	165355	1.0	2.0	3.0
+chr1	165356	1.0	0.0	1.0
+chr1	165358	1.0	0.0	1.0
+chr1	165361	1.0	0.0	1.0
+chr1	165362	0.0	1.0	1.0
+chr1	165366	0.0	3.0	3.0
+chr1	165367	1.0	0.0	1.0
+chr1	165368	0.0	1.0	1.0
+chr1	165369	1.0	0.0	1.0
+chr1	165370	1.0	0.0	1.0
+chr1	165371	0.0	3.0	3.0
+chr1	165372	4.0	0.0	4.0
+chr1	165373	10.0	5.0	15.0
+chr1	165375	0.0	1.0	1.0
+chr1	165376	1.0	0.0	1.0
+chr1	165378	1.0	0.0	1.0
+chr1	165379	3.0	1.0	4.0
+chr1	165380	6.0	1.0	7.0
+chr1	165381	0.0	1.0	1.0
+chr1	165382	2.0	0.0	2.0
+chr1	165383	1.0	0.0	1.0
+chr1	165384	0.0	14.0	14.0
+chr1	165385	19.0	2.0	21.0
+chr1	165386	12.0	0.0	12.0
+chr1	165387	12.0	13.0	25.0
+chr1	165388	4.0	0.0	4.0
+chr1	165389	0.0	1.0	1.0
+chr1	165390	0.0	3.0	3.0
+chr1	165391	2.0	2.0	4.0
+chr1	165392	1.0	7.0	8.0
+chr1	165393	0.0	3.0	3.0
+chr1	165394	10.0	0.0	10.0
+chr1	165395	11.0	5.0	16.0
+chr1	165396	0.0	16.0	16.0
+chr1	165397	11.0	12.0	23.0
+chr1	165398	1.0	1.0	2.0
+chr1	165399	7.0	0.0	7.0
+chr1	165400	9.0	1.0	10.0
+chr1	165402	6.0	0.0	6.0
+chr1	165404	0.0	3.0	3.0
+chr1	165405	1.0	16.0	17.0
+chr1	165406	12.0	5.0	17.0
+chr1	165407	19.0	0.0	19.0
+chr1	165409	0.0	2.0	2.0
+chr1	165410	3.0	2.0	5.0
+chr1	165411	0.0	3.0	3.0
+chr1	165412	1.0	0.0	1.0
+chr1	165413	0.0	18.0	18.0
+chr1	165414	0.0	9.0	9.0
+chr1	165415	0.0	1.0	1.0
+chr1	165416	2.0	0.0	2.0
+chr1	165417	2.0	0.0	2.0
+chr1	165418	2.0	1.0	3.0
+chr1	165420	1.0	0.0	1.0
+chr1	165421	5.0	0.0	5.0
+chr1	165422	23.0	0.0	23.0
+chr1	165423	2.0	2.0	4.0
+chr1	165425	1.0	0.0	1.0
+chr1	165428	0.0	2.0	2.0
+chr1	165429	0.0	9.0	9.0
+chr1	165430	0.0	3.0	3.0
+chr1	165431	0.0	2.0	2.0
+chr1	165433	2.0	9.0	11.0
+chr1	165434	0.0	2.0	2.0
+chr1	165436	0.0	4.0	4.0
+chr1	165437	0.0	3.0	3.0
+chr1	165442	0.0	1.0	1.0
+chr1	165445	3.0	8.0	11.0
+chr1	165446	11.0	0.0	11.0
+chr1	165447	0.0	2.0	2.0
+chr1	165449	0.0	1.0	1.0
+chr1	165450	0.0	1.0	1.0
+chr1	165451	0.0	3.0	3.0
+chr1	165452	2.0	1.0	3.0
+chr1	165458	1.0	1.0	2.0
+chr1	165459	5.0	2.0	7.0
+chr1	165460	1.0	1.0	2.0
+chr1	165461	3.0	0.0	3.0
+chr1	165463	1.0	0.0	1.0
+chr1	165465	0.0	1.0	1.0
+chr1	165468	1.0	0.0	1.0
+chr1	165470	2.0	1.0	3.0
+chr1	165472	2.0	0.0	2.0
+chr1	165473	0.0	1.0	1.0
+chr1	165480	1.0	0.0	1.0
+chr1	165483	0.0	1.0	1.0
+chr1	165485	0.0	1.0	1.0
+chr1	165487	1.0	0.0	1.0
+chr1	165488	3.0	0.0	3.0
+chr1	165493	7.0	0.0	7.0
+chr1	165494	4.0	1.0	5.0
+chr1	165495	2.0	0.0	2.0
+chr1	165497	2.0	0.0	2.0
+chr1	165498	0.0	5.0	5.0
+chr1	165501	1.0	0.0	1.0
+chr1	165503	1.0	4.0	5.0
+chr1	165505	0.0	2.0	2.0
+chr1	165506	1.0	0.0	1.0
+chr1	165509	1.0	0.0	1.0
+chr1	165510	0.0	3.0	3.0
+chr1	165512	3.0	0.0	3.0
+chr1	165514	0.0	2.0	2.0
+chr1	165516	0.0	1.0	1.0
+chr1	165519	2.0	0.0	2.0
+chr1	165520	0.0	1.0	1.0
+chr1	165521	1.0	1.0	2.0
+chr1	165523	0.0	7.0	7.0
+chr1	165524	0.0	1.0	1.0
+chr1	165527	1.0	0.0	1.0
+chr1	165528	1.0	0.0	1.0
+chr1	165531	1.0	0.0	1.0
+chr1	165532	0.0	1.0	1.0
+chr1	165533	3.0	0.0	3.0
+chr1	165535	0.0	2.0	2.0
+chr1	165536	2.0	0.0	2.0
+chr1	165537	0.0	1.0	1.0
+chr1	165539	1.0	1.0	2.0
+chr1	165543	1.0	0.0	1.0
+chr1	165544	3.0	0.0	3.0
+chr1	165546	6.0	0.0	6.0
+chr1	165549	0.0	5.0	5.0
+chr1	165552	1.0	0.0	1.0
+chr1	165553	2.0	1.0	3.0
+chr1	165555	5.0	0.0	5.0
+chr1	165557	0.0	4.0	4.0
+chr1	165560	0.0	2.0	2.0
+chr1	165561	7.0	0.0	7.0
+chr1	165563	1.0	0.0	1.0
+chr1	165567	0.0	1.0	1.0
+chr1	165569	1.0	0.0	1.0
+chr1	165575	0.0	1.0	1.0
+chr1	165577	1.0	0.0	1.0
+chr1	165580	1.0	0.0	1.0
+chr1	165582	0.0	1.0	1.0
+chr1	165583	6.0	0.0	6.0
+chr1	165584	4.0	0.0	4.0
+chr1	165594	1.0	0.0	1.0
+chr1	165597	1.0	0.0	1.0
+chr1	165598	1.0	3.0	4.0
+chr1	165599	2.0	2.0	4.0
+chr1	165601	0.0	2.0	2.0
+chr1	165605	1.0	1.0	2.0
+chr1	165606	0.0	2.0	2.0
+chr1	165607	6.0	0.0	6.0
+chr1	165608	4.0	0.0	4.0
+chr1	165609	1.0	0.0	1.0
+chr1	165611	0.0	1.0	1.0
+chr1	165612	0.0	2.0	2.0
+chr1	165614	0.0	2.0	2.0
+chr1	165616	4.0	0.0	4.0
+chr1	165617	7.0	0.0	7.0
+chr1	165620	1.0	0.0	1.0
+chr1	165621	0.0	2.0	2.0
+chr1	165624	0.0	2.0	2.0
+chr1	165627	0.0	1.0	1.0
+chr1	165634	0.0	2.0	2.0
+chr1	165637	4.0	0.0	4.0
+chr1	165640	1.0	0.0	1.0
+chr1	165643	0.0	1.0	1.0
+chr1	165644	1.0	0.0	1.0
+chr1	165647	2.0	0.0	2.0
+chr1	165652	3.0	0.0	3.0
+chr1	165656	0.0	2.0	2.0
+chr1	165657	2.0	7.0	9.0
+chr1	165661	0.0	8.0	8.0
+chr1	165662	5.0	4.0	9.0
+chr1	165663	1.0	0.0	1.0
+chr1	165664	8.0	0.0	8.0
+chr1	165667	1.0	0.0	1.0
+chr1	165668	1.0	1.0	2.0
+chr1	165669	1.0	1.0	2.0
+chr1	165670	1.0	0.0	1.0
+chr1	165671	2.0	0.0	2.0
+chr1	165672	3.0	1.0	4.0
+chr1	165673	12.0	2.0	14.0
+chr1	165677	0.0	2.0	2.0
+chr1	165678	0.0	1.0	1.0
+chr1	165683	4.0	1.0	5.0
+chr1	165689	0.0	3.0	3.0
+chr1	165690	0.0	1.0	1.0
+chr1	165693	0.0	1.0	1.0
+chr1	165694	0.0	1.0	1.0
+chr1	165696	0.0	9.0	9.0
+chr1	165697	0.0	1.0	1.0
+chr1	165699	6.0	0.0	6.0
+chr1	165701	1.0	0.0	1.0
+chr1	165703	0.0	2.0	2.0
+chr1	165705	0.0	3.0	3.0
+chr1	165708	1.0	2.0	3.0
+chr1	165709	0.0	1.0	1.0
+chr1	165710	2.0	0.0	2.0
+chr1	165713	0.0	1.0	1.0
+chr1	165716	16.0	0.0	16.0
+chr1	165718	0.0	1.0	1.0
+chr1	165722	3.0	3.0	6.0
+chr1	165723	1.0	0.0	1.0
+chr1	165724	0.0	5.0	5.0
+chr1	165725	3.0	1.0	4.0
+chr1	165726	0.0	1.0	1.0
+chr1	165728	3.0	1.0	4.0
+chr1	165731	1.0	2.0	3.0
+chr1	165735	1.0	0.0	1.0
+chr1	165737	1.0	1.0	2.0
+chr1	165738	4.0	0.0	4.0
+chr1	165742	1.0	0.0	1.0
+chr1	165747	1.0	0.0	1.0
+chr1	165749	4.0	2.0	6.0
+chr1	165753	0.0	1.0	1.0
+chr1	165754	0.0	5.0	5.0
+chr1	165755	1.0	0.0	1.0
+chr1	165756	0.0	1.0	1.0
+chr1	165757	0.0	1.0	1.0
+chr1	165758	0.0	5.0	5.0
+chr1	165759	0.0	1.0	1.0
+chr1	165760	1.0	0.0	1.0
+chr1	165763	1.0	0.0	1.0
+chr1	165764	1.0	3.0	4.0
+chr1	165767	1.0	3.0	4.0
+chr1	165771	1.0	0.0	1.0
+chr1	165773	1.0	0.0	1.0
+chr1	165774	0.0	1.0	1.0
+chr1	165775	1.0	1.0	2.0
+chr1	165776	1.0	1.0	2.0
+chr1	165778	0.0	1.0	1.0
+chr1	165787	0.0	1.0	1.0
+chr1	165789	0.0	1.0	1.0
+chr1	165790	3.0	0.0	3.0
+chr1	165795	0.0	1.0	1.0
+chr1	165796	1.0	2.0	3.0
+chr1	165797	1.0	1.0	2.0
+chr1	165808	2.0	1.0	3.0
+chr1	165821	0.0	1.0	1.0
+chr1	165823	1.0	0.0	1.0
+chr1	165825	0.0	2.0	2.0
+chr1	165830	0.0	1.0	1.0
+chr1	165834	0.0	1.0	1.0
+chr1	165837	1.0	0.0	1.0
+chr1	165843	3.0	0.0	3.0
+chr1	165844	2.0	0.0	2.0
+chr1	165845	1.0	0.0	1.0
+chr1	165847	0.0	2.0	2.0
+chr1	165852	2.0	3.0	5.0
+chr1	165853	0.0	2.0	2.0
+chr1	165859	1.0	1.0	2.0
+chr1	165860	0.0	1.0	1.0
+chr1	165861	2.0	0.0	2.0
+chr1	165862	4.0	0.0	4.0
+chr1	165863	0.0	3.0	3.0
+chr1	165864	0.0	1.0	1.0
+chr1	165867	0.0	2.0	2.0
+chr1	165868	1.0	1.0	2.0
+chr1	165871	1.0	1.0	2.0
+chr1	165872	2.0	0.0	2.0
+chr1	165873	0.0	3.0	3.0
+chr1	165874	0.0	1.0	1.0
+chr1	165875	2.0	0.0	2.0
+chr1	165876	0.0	5.0	5.0
+chr1	165877	0.0	17.0	17.0
+chr1	165878	2.0	1.0	3.0
+chr1	165879	1.0	0.0	1.0
+chr1	165881	0.0	1.0	1.0
+chr1	165885	0.0	1.0	1.0
+chr1	165886	0.0	1.0	1.0
+chr1	165888	0.0	1.0	1.0
+chr1	165889	0.0	1.0	1.0
+chr1	165890	0.0	1.0	1.0
+chr1	165892	0.0	1.0	1.0
+chr1	165894	0.0	1.0	1.0
+chr1	165898	0.0	1.0	1.0
+chr1	165900	5.0	0.0	5.0
+chr1	165902	0.0	1.0	1.0
+chr1	165904	0.0	1.0	1.0
+chr1	165907	5.0	0.0	5.0
+chr1	165910	0.0	2.0	2.0
+chr1	165912	2.0	0.0	2.0
+chr1	165918	1.0	3.0	4.0
+chr1	165919	0.0	1.0	1.0
+chr1	165920	1.0	1.0	2.0
+chr1	165923	1.0	0.0	1.0
+chr1	165929	0.0	1.0	1.0
+chr1	165950	1.0	0.0	1.0
+chr1	165956	1.0	0.0	1.0
+chr1	165967	1.0	0.0	1.0
+chr1	165968	1.0	0.0	1.0
+chr1	165969	1.0	0.0	1.0
+chr1	165978	1.0	0.0	1.0
+chr1	165979	0.0	1.0	1.0
+chr1	165980	3.0	0.0	3.0
+chr1	166000	0.0	1.0	1.0
+chr1	166001	1.0	0.0	1.0
+chr1	166002	2.0	0.0	2.0
+chr1	166006	2.0	0.0	2.0
+chr1	166007	1.0	0.0	1.0
+chr1	166013	1.0	0.0	1.0
+chr1	166027	0.0	1.0	1.0
+chr1	166028	2.0	1.0	3.0
+chr1	166034	1.0	2.0	3.0
+chr1	166035	1.0	0.0	1.0
+chr1	166036	2.0	1.0	3.0
+chr1	166044	0.0	1.0	1.0
+chr1	166046	0.0	1.0	1.0
+chr1	166056	0.0	1.0	1.0
+chr1	166062	1.0	0.0	1.0
+chr1	166064	1.0	0.0	1.0
+chr1	166066	0.0	1.0	1.0
+chr1	166069	0.0	1.0	1.0
+chr1	166076	0.0	1.0	1.0
+chr1	166080	5.0	0.0	5.0
+chr1	166083	1.0	0.0	1.0
+chr1	166084	2.0	0.0	2.0
+chr1	166086	1.0	0.0	1.0
+chr1	166087	1.0	1.0	2.0
+chr1	166090	0.0	5.0	5.0
+chr1	166098	6.0	0.0	6.0
+chr1	166099	3.0	0.0	3.0
+chr1	166100	0.0	1.0	1.0
+chr1	166102	1.0	0.0	1.0
+chr1	166103	2.0	0.0	2.0
+chr1	166104	1.0	0.0	1.0
+chr1	166114	2.0	0.0	2.0
+chr1	166134	2.0	0.0	2.0
+chr1	166138	1.0	0.0	1.0
+chr1	166139	1.0	0.0	1.0
+chr1	166142	1.0	0.0	1.0
+chr1	166452	1.0	0.0	1.0
+chr1	166698	1.0	0.0	1.0
+chr1	167014	0.0	2.0	2.0
+chr1	167261	1.0	0.0	1.0
+chr1	167318	0.0	1.0	1.0
+chr1	167330	3.0	0.0	3.0
+chr1	167358	2.0	0.0	2.0
+chr1	167443	0.0	1.0	1.0
+chr1	167474	1.0	0.0	1.0
+chr1	167583	0.0	1.0	1.0
+chr1	168154	1.0	0.0	1.0
+chr1	168160	0.0	1.0	1.0
+chr1	168185	0.0	1.0	1.0
+chr1	168294	1.0	0.0	1.0
+chr1	168310	0.0	1.0	1.0
+chr1	168627	0.0	1.0	1.0
+chr1	168783	0.0	1.0	1.0
+chr1	168784	0.0	2.0	2.0
+chr1	168793	1.0	0.0	1.0
+chr1	168794	0.0	1.0	1.0
+chr1	168806	1.0	0.0	1.0
+chr1	168809	2.0	0.0	2.0
+chr1	168810	1.0	0.0	1.0
+chr1	168858	1.0	0.0	1.0
+chr1	168928	0.0	1.0	1.0
+chr1	168930	0.0	1.0	1.0
+chr1	168938	1.0	0.0	1.0
+chr1	168946	3.0	0.0	3.0
+chr1	168952	0.0	1.0	1.0
+chr1	168958	0.0	2.0	2.0
+chr1	168961	0.0	3.0	3.0
+chr1	168962	2.0	0.0	2.0
+chr1	168963	3.0	0.0	3.0
+chr1	168964	2.0	0.0	2.0
+chr1	168966	1.0	3.0	4.0
+chr1	168967	3.0	1.0	4.0
+chr1	168968	1.0	2.0	3.0
+chr1	168969	2.0	0.0	2.0
+chr1	168970	2.0	0.0	2.0
+chr1	168971	2.0	0.0	2.0
+chr1	168973	4.0	4.0	8.0
+chr1	168974	5.0	0.0	5.0
+chr1	168975	1.0	1.0	2.0
+chr1	168976	0.0	3.0	3.0
+chr1	168977	0.0	1.0	1.0
+chr1	168981	2.0	0.0	2.0
+chr1	168982	1.0	6.0	7.0
+chr1	168983	1.0	4.0	5.0
+chr1	168984	1.0	0.0	1.0
+chr1	168985	0.0	3.0	3.0
+chr1	168988	1.0	0.0	1.0
+chr1	168992	1.0	0.0	1.0
+chr1	168994	1.0	0.0	1.0
+chr1	168997	0.0	1.0	1.0
+chr1	169001	0.0	1.0	1.0
+chr1	169007	0.0	4.0	4.0
+chr1	169025	1.0	0.0	1.0
+chr1	169263	1.0	0.0	1.0
+chr1	169411	0.0	1.0	1.0
+chr1	169413	0.0	1.0	1.0
+chr1	169415	1.0	0.0	1.0
+chr1	169420	0.0	2.0	2.0
+chr1	169435	1.0	0.0	1.0
+chr1	169591	1.0	0.0	1.0
+chr1	169601	0.0	1.0	1.0
+chr1	169616	0.0	2.0	2.0
+chr1	169715	0.0	1.0	1.0
+chr1	169779	2.0	0.0	2.0
+chr1	169904	0.0	1.0	1.0
+chr1	169914	0.0	1.0	1.0
+chr1	169944	0.0	1.0	1.0
+chr1	170153	0.0	1.0	1.0
+chr1	170321	1.0	0.0	1.0
+chr1	170643	0.0	1.0	1.0
+chr1	170691	0.0	1.0	1.0
+chr1	170713	0.0	1.0	1.0
+chr1	170830	1.0	0.0	1.0
+chr1	170865	0.0	1.0	1.0
+chr1	170894	0.0	1.0	1.0
+chr1	170959	0.0	1.0	1.0
+chr1	171015	1.0	0.0	1.0
+chr1	171168	1.0	0.0	1.0
+chr1	171235	2.0	0.0	2.0
+chr1	171239	1.0	0.0	1.0
+chr1	171374	0.0	1.0	1.0
+chr1	171474	0.0	1.0	1.0
+chr1	171515	1.0	0.0	1.0
+chr1	171524	1.0	0.0	1.0
+chr1	171526	1.0	0.0	1.0
+chr1	171530	1.0	0.0	1.0
+chr1	171638	0.0	1.0	1.0
+chr1	171643	0.0	1.0	1.0
+chr1	171665	1.0	1.0	2.0
+chr1	171667	0.0	1.0	1.0
+chr1	171669	0.0	1.0	1.0
+chr1	171670	2.0	0.0	2.0
+chr1	171672	0.0	2.0	2.0
+chr1	171678	0.0	1.0	1.0
+chr1	171682	2.0	0.0	2.0
+chr1	171683	1.0	0.0	1.0
+chr1	171684	3.0	0.0	3.0
+chr1	171685	2.0	0.0	2.0
+chr1	171686	2.0	0.0	2.0
+chr1	171695	0.0	2.0	2.0
+chr1	171696	0.0	1.0	1.0
+chr1	171697	0.0	1.0	1.0
+chr1	171703	0.0	5.0	5.0
+chr1	171704	0.0	1.0	1.0
+chr1	171705	1.0	0.0	1.0
+chr1	171943	1.0	0.0	1.0
+chr1	172311	0.0	1.0	1.0
+chr1	172458	0.0	1.0	1.0
+chr1	172480	0.0	1.0	1.0
+chr1	172494	1.0	0.0	1.0
+chr1	172843	0.0	1.0	1.0
+chr1	172855	0.0	1.0	1.0
+chr1	172993	0.0	3.0	3.0
+chr1	173235	1.0	0.0	1.0
+chr1	173442	0.0	1.0	1.0
+chr1	174473	1.0	0.0	1.0
+chr1	174706	0.0	1.0	1.0
+chr1	174759	0.0	1.0	1.0
+chr1	174768	1.0	0.0	1.0
+chr1	174776	1.0	0.0	1.0
+chr1	174787	0.0	1.0	1.0
+chr1	174815	1.0	0.0	1.0
+chr1	174935	1.0	0.0	1.0
+chr1	174945	1.0	0.0	1.0
+chr1	174953	0.0	1.0	1.0
+chr1	175063	0.0	1.0	1.0
+chr1	175078	0.0	1.0	1.0
+chr1	175083	1.0	0.0	1.0
+chr1	175086	0.0	2.0	2.0
+chr1	175092	0.0	1.0	1.0
+chr1	175093	0.0	1.0	1.0
+chr1	175094	2.0	1.0	3.0
+chr1	175096	1.0	0.0	1.0
+chr1	175097	0.0	1.0	1.0
+chr1	175099	0.0	1.0	1.0
+chr1	175101	1.0	0.0	1.0
+chr1	175102	4.0	0.0	4.0
+chr1	175103	0.0	1.0	1.0
+chr1	175104	1.0	0.0	1.0
+chr1	175105	2.0	0.0	2.0
+chr1	175107	2.0	0.0	2.0
+chr1	175109	0.0	1.0	1.0
+chr1	175110	1.0	0.0	1.0
+chr1	175115	2.0	0.0	2.0
+chr1	175116	2.0	0.0	2.0
+chr1	175117	0.0	1.0	1.0
+chr1	175120	0.0	1.0	1.0
+chr1	175123	0.0	6.0	6.0
+chr1	175124	1.0	0.0	1.0
+chr1	175126	0.0	2.0	2.0
+chr1	175127	0.0	1.0	1.0
+chr1	175128	1.0	0.0	1.0
+chr1	175129	0.0	6.0	6.0
+chr1	175130	1.0	1.0	2.0
+chr1	175132	0.0	4.0	4.0
+chr1	175133	0.0	1.0	1.0
+chr1	175134	0.0	2.0	2.0
+chr1	175136	6.0	0.0	6.0
+chr1	175139	0.0	2.0	2.0
+chr1	175160	0.0	1.0	1.0
+chr1	175172	1.0	0.0	1.0
+chr1	175286	0.0	1.0	1.0
+chr1	175292	1.0	0.0	1.0
+chr1	175309	1.0	0.0	1.0
+chr1	175311	1.0	0.0	1.0
+chr1	175320	3.0	0.0	3.0
+chr1	175326	1.0	0.0	1.0
+chr1	175327	1.0	2.0	3.0
+chr1	175328	1.0	1.0	2.0
+chr1	175329	1.0	0.0	1.0
+chr1	175334	0.0	4.0	4.0
+chr1	175335	1.0	0.0	1.0
+chr1	175336	2.0	0.0	2.0
+chr1	175337	0.0	2.0	2.0
+chr1	175339	0.0	2.0	2.0
+chr1	175342	0.0	1.0	1.0
+chr1	175347	2.0	0.0	2.0
+chr1	175352	0.0	2.0	2.0
+chr1	175355	3.0	1.0	4.0
+chr1	175358	0.0	1.0	1.0
+chr1	175360	0.0	3.0	3.0
+chr1	175361	0.0	1.0	1.0
+chr1	175363	1.0	0.0	1.0
+chr1	175365	1.0	0.0	1.0
+chr1	175367	0.0	1.0	1.0
+chr1	175371	0.0	4.0	4.0
+chr1	175376	0.0	1.0	1.0
+chr1	175379	1.0	0.0	1.0
+chr1	175501	0.0	2.0	2.0
+chr1	175511	0.0	1.0	1.0
+chr1	175512	0.0	1.0	1.0
+chr1	175518	1.0	0.0	1.0
+chr1	175525	0.0	1.0	1.0
+chr1	175526	1.0	0.0	1.0
+chr1	175531	0.0	1.0	1.0
+chr1	175534	0.0	1.0	1.0
+chr1	175548	1.0	0.0	1.0
+chr1	175710	1.0	0.0	1.0
+chr1	175713	0.0	1.0	1.0
+chr1	176178	1.0	0.0	1.0
+chr1	176339	1.0	0.0	1.0
+chr1	176363	0.0	2.0	2.0
+chr1	176365	1.0	0.0	1.0
+chr1	176403	0.0	1.0	1.0
+chr1	176678	0.0	1.0	1.0
+chr1	176686	0.0	1.0	1.0
+chr1	176687	0.0	1.0	1.0
+chr1	176704	0.0	4.0	4.0
+chr1	176707	0.0	2.0	2.0
+chr1	176716	1.0	1.0	2.0
+chr1	176717	0.0	1.0	1.0
+chr1	176724	2.0	0.0	2.0
+chr1	176725	3.0	5.0	8.0
+chr1	176726	0.0	4.0	4.0
+chr1	176728	0.0	1.0	1.0
+chr1	176731	0.0	3.0	3.0
+chr1	176732	4.0	1.0	5.0
+chr1	176735	2.0	2.0	4.0
+chr1	176736	2.0	2.0	4.0
+chr1	176738	2.0	0.0	2.0
+chr1	176739	0.0	2.0	2.0
+chr1	176740	1.0	1.0	2.0
+chr1	176741	0.0	11.0	11.0
+chr1	176743	1.0	0.0	1.0
+chr1	176745	0.0	1.0	1.0
+chr1	176746	1.0	2.0	3.0
+chr1	176747	1.0	0.0	1.0
+chr1	176751	0.0	1.0	1.0
+chr1	176753	0.0	3.0	3.0
+chr1	176754	0.0	1.0	1.0
+chr1	176756	2.0	2.0	4.0
+chr1	176757	1.0	0.0	1.0
+chr1	176762	2.0	0.0	2.0
+chr1	176766	0.0	1.0	1.0
+chr1	176769	1.0	0.0	1.0
+chr1	176771	0.0	1.0	1.0
+chr1	176775	1.0	0.0	1.0
+chr1	176777	0.0	1.0	1.0
+chr1	176780	1.0	0.0	1.0
+chr1	176782	0.0	1.0	1.0
+chr1	176791	0.0	1.0	1.0
+chr1	176805	1.0	0.0	1.0
+chr1	176811	0.0	1.0	1.0
+chr1	176813	0.0	1.0	1.0
+chr1	176814	0.0	1.0	1.0
+chr1	176816	1.0	0.0	1.0
+chr1	176822	0.0	1.0	1.0
+chr1	176823	0.0	1.0	1.0
+chr1	176826	2.0	0.0	2.0
+chr1	176836	0.0	2.0	2.0
+chr1	176845	0.0	2.0	2.0
+chr1	176856	3.0	0.0	3.0
+chr1	176857	2.0	0.0	2.0
+chr1	176872	2.0	0.0	2.0
+chr1	176883	1.0	0.0	1.0
+chr1	176889	1.0	0.0	1.0
+chr1	176892	1.0	0.0	1.0
+chr1	176894	3.0	0.0	3.0
+chr1	176895	4.0	0.0	4.0
+chr1	176907	1.0	0.0	1.0
+chr1	176912	1.0	0.0	1.0
+chr1	176921	0.0	1.0	1.0
+chr1	176925	1.0	0.0	1.0
+chr1	176937	0.0	2.0	2.0
+chr1	176944	1.0	0.0	1.0
+chr1	176947	0.0	2.0	2.0
+chr1	176948	0.0	1.0	1.0
+chr1	176970	1.0	0.0	1.0
+chr1	176976	2.0	0.0	2.0
+chr1	176981	0.0	1.0	1.0
+chr1	176985	1.0	0.0	1.0
+chr1	176988	1.0	0.0	1.0
+chr1	176994	1.0	0.0	1.0
+chr1	176996	1.0	0.0	1.0
+chr1	176997	2.0	0.0	2.0
+chr1	177003	1.0	0.0	1.0
+chr1	177004	0.0	1.0	1.0
+chr1	177010	0.0	1.0	1.0
+chr1	177012	1.0	0.0	1.0
+chr1	177049	0.0	1.0	1.0
+chr1	177143	0.0	1.0	1.0
+chr1	177172	0.0	1.0	1.0
+chr1	177187	0.0	1.0	1.0
+chr1	177305	1.0	0.0	1.0
+chr1	177318	0.0	1.0	1.0
+chr1	177339	1.0	0.0	1.0
+chr1	177372	0.0	1.0	1.0
+chr1	177421	1.0	0.0	1.0
+chr1	177567	1.0	0.0	1.0
+chr1	177581	1.0	0.0	1.0
+chr1	177583	1.0	0.0	1.0
+chr1	177590	1.0	0.0	1.0
+chr1	177591	0.0	1.0	1.0
+chr1	177592	1.0	0.0	1.0
+chr1	177601	2.0	0.0	2.0
+chr1	177602	1.0	0.0	1.0
+chr1	177604	0.0	1.0	1.0
+chr1	177651	1.0	0.0	1.0
+chr1	177652	1.0	0.0	1.0
+chr1	177701	1.0	0.0	1.0
+chr1	177762	1.0	0.0	1.0
+chr1	177764	1.0	0.0	1.0
+chr1	177821	3.0	0.0	3.0
+chr1	177838	0.0	1.0	1.0
+chr1	177878	1.0	0.0	1.0
+chr1	177908	0.0	1.0	1.0
+chr1	177937	0.0	1.0	1.0
+chr1	177947	1.0	0.0	1.0
+chr1	178050	0.0	2.0	2.0
+chr1	178088	0.0	1.0	1.0
+chr1	178134	1.0	0.0	1.0
+chr1	178251	1.0	0.0	1.0
+chr1	178293	1.0	0.0	1.0
+chr1	178498	0.0	1.0	1.0
+chr1	178586	0.0	1.0	1.0
+chr1	178589	0.0	1.0	1.0
+chr1	178734	2.0	0.0	2.0
+chr1	178741	1.0	0.0	1.0
+chr1	178869	0.0	1.0	1.0
+chr1	178877	1.0	0.0	1.0
+chr1	178970	1.0	0.0	1.0
+chr1	179063	0.0	1.0	1.0
+chr1	179087	0.0	1.0	1.0
+chr1	179322	1.0	0.0	1.0
+chr1	179357	1.0	0.0	1.0
+chr1	179358	1.0	0.0	1.0
+chr1	179374	1.0	0.0	1.0
+chr1	179379	0.0	1.0	1.0
+chr1	179396	1.0	0.0	1.0
+chr1	179444	0.0	1.0	1.0
+chr1	179449	1.0	0.0	1.0
+chr1	179510	0.0	3.0	3.0
+chr1	179557	1.0	0.0	1.0
+chr1	179558	1.0	0.0	1.0
+chr1	179563	1.0	0.0	1.0
+chr1	179620	1.0	0.0	1.0
+chr1	179683	1.0	0.0	1.0
+chr1	179692	0.0	1.0	1.0
+chr1	179694	1.0	0.0	1.0
+chr1	179703	1.0	0.0	1.0
+chr1	179723	1.0	0.0	1.0
+chr1	179732	1.0	0.0	1.0
+chr1	179738	1.0	0.0	1.0
+chr1	179761	0.0	1.0	1.0
+chr1	179850	1.0	0.0	1.0
+chr1	179862	2.0	0.0	2.0
+chr1	179868	0.0	1.0	1.0
+chr1	179872	1.0	0.0	1.0
+chr1	179875	2.0	0.0	2.0
+chr1	179897	3.0	0.0	3.0
+chr1	179899	0.0	1.0	1.0
+chr1	179900	1.0	0.0	1.0
+chr1	179906	0.0	1.0	1.0
+chr1	179907	0.0	1.0	1.0
+chr1	179918	4.0	0.0	4.0
+chr1	180000	1.0	0.0	1.0
+chr1	180007	0.0	1.0	1.0
+chr1	180015	0.0	1.0	1.0
+chr1	180018	0.0	1.0	1.0
+chr1	180030	1.0	0.0	1.0
+chr1	180045	0.0	1.0	1.0
+chr1	180049	0.0	1.0	1.0
+chr1	180055	1.0	0.0	1.0
+chr1	180060	0.0	1.0	1.0
+chr1	180061	0.0	1.0	1.0
+chr1	180071	0.0	1.0	1.0
+chr1	180088	1.0	0.0	1.0
+chr1	180094	1.0	0.0	1.0
+chr1	180275	1.0	0.0	1.0
+chr1	180276	0.0	1.0	1.0
+chr1	180296	0.0	1.0	1.0
+chr1	180306	1.0	0.0	1.0
+chr1	180346	0.0	1.0	1.0
+chr1	180415	1.0	0.0	1.0
+chr1	180428	0.0	2.0	2.0
+chr1	180438	1.0	0.0	1.0
+chr1	180443	2.0	0.0	2.0
+chr1	180447	0.0	1.0	1.0
+chr1	180451	1.0	0.0	1.0
+chr1	180454	2.0	0.0	2.0
+chr1	180507	1.0	0.0	1.0
+chr1	180570	0.0	1.0	1.0
+chr1	180585	1.0	0.0	1.0
+chr1	180611	0.0	3.0	3.0
+chr1	180612	0.0	1.0	1.0
+chr1	180615	1.0	0.0	1.0
+chr1	180618	1.0	0.0	1.0
+chr1	180632	0.0	2.0	2.0
+chr1	180643	1.0	0.0	1.0
+chr1	180652	1.0	0.0	1.0
+chr1	180767	1.0	0.0	1.0
+chr1	180778	1.0	0.0	1.0
+chr1	180780	1.0	0.0	1.0
+chr1	180803	2.0	0.0	2.0
+chr1	180809	0.0	3.0	3.0
+chr1	180824	2.0	0.0	2.0
+chr1	180951	0.0	1.0	1.0
+chr1	180953	0.0	1.0	1.0
+chr1	180960	0.0	1.0	1.0
+chr1	180964	0.0	1.0	1.0
+chr1	180969	1.0	6.0	7.0
+chr1	180971	1.0	2.0	3.0
+chr1	180974	1.0	0.0	1.0
+chr1	180975	1.0	0.0	1.0
+chr1	180976	4.0	0.0	4.0
+chr1	181004	1.0	0.0	1.0
+chr1	181340	0.0	3.0	3.0
+chr1	181349	0.0	3.0	3.0
+chr1	181382	2.0	0.0	2.0
+chr1	181388	1.0	0.0	1.0
+chr1	181389	1.0	0.0	1.0
+chr1	181413	1.0	0.0	1.0
+chr1	181414	0.0	1.0	1.0
+chr1	181510	1.0	0.0	1.0
+chr1	181521	0.0	1.0	1.0
+chr1	181525	0.0	1.0	1.0
+chr1	181543	0.0	1.0	1.0
+chr1	181547	0.0	1.0	1.0
+chr1	181548	1.0	0.0	1.0
+chr1	181572	0.0	1.0	1.0
+chr1	181585	0.0	1.0	1.0
+chr1	181590	2.0	0.0	2.0
+chr1	181598	0.0	1.0	1.0
+chr1	181667	1.0	0.0	1.0
+chr1	181676	1.0	0.0	1.0
+chr1	181685	1.0	0.0	1.0
+chr1	181698	1.0	0.0	1.0
+chr1	181699	1.0	0.0	1.0
+chr1	181700	1.0	0.0	1.0
+chr1	181702	1.0	2.0	3.0
+chr1	181703	0.0	1.0	1.0
+chr1	181706	1.0	0.0	1.0
+chr1	181710	2.0	0.0	2.0
+chr1	181722	0.0	1.0	1.0
+chr1	181723	0.0	2.0	2.0
+chr1	181756	1.0	0.0	1.0
+chr1	181856	0.0	2.0	2.0
+chr1	181859	0.0	1.0	1.0
+chr1	181871	2.0	0.0	2.0
+chr1	181875	0.0	2.0	2.0
+chr1	182009	1.0	0.0	1.0
+chr1	182035	0.0	1.0	1.0
+chr1	182036	1.0	0.0	1.0
+chr1	182037	1.0	0.0	1.0
+chr1	182052	1.0	0.0	1.0
+chr1	182053	0.0	3.0	3.0
+chr1	182088	1.0	0.0	1.0
+chr1	182175	1.0	0.0	1.0
+chr1	182186	1.0	0.0	1.0
+chr1	182187	0.0	1.0	1.0
+chr1	182199	0.0	1.0	1.0
+chr1	182202	1.0	0.0	1.0
+chr1	182208	0.0	1.0	1.0
+chr1	182217	0.0	4.0	4.0
+chr1	182222	6.0	0.0	6.0
+chr1	182223	2.0	0.0	2.0
+chr1	182226	2.0	0.0	2.0
+chr1	182235	0.0	3.0	3.0
+chr1	182236	0.0	1.0	1.0
+chr1	182246	0.0	2.0	2.0
+chr1	182249	1.0	0.0	1.0
+chr1	182258	1.0	0.0	1.0
+chr1	182325	0.0	1.0	1.0
+chr1	182342	0.0	1.0	1.0
+chr1	182366	1.0	0.0	1.0
+chr1	182387	0.0	1.0	1.0
+chr1	182417	1.0	0.0	1.0
+chr1	182638	0.0	1.0	1.0
+chr1	182642	0.0	1.0	1.0
+chr1	182644	0.0	1.0	1.0
+chr1	182645	0.0	1.0	1.0
+chr1	182659	0.0	1.0	1.0
+chr1	182664	0.0	2.0	2.0
+chr1	182666	0.0	2.0	2.0
+chr1	182669	0.0	1.0	1.0
+chr1	182674	0.0	6.0	6.0
+chr1	182675	0.0	3.0	3.0
+chr1	182676	0.0	7.0	7.0
+chr1	182686	2.0	0.0	2.0
+chr1	182690	0.0	1.0	1.0
+chr1	182691	1.0	0.0	1.0
+chr1	182693	1.0	0.0	1.0
+chr1	182708	1.0	1.0	2.0
+chr1	182720	0.0	1.0	1.0
+chr1	182727	0.0	1.0	1.0
+chr1	182729	0.0	6.0	6.0
+chr1	182730	0.0	3.0	3.0
+chr1	182731	0.0	1.0	1.0
+chr1	182734	0.0	1.0	1.0
+chr1	182735	1.0	0.0	1.0
+chr1	182737	0.0	1.0	1.0
+chr1	182742	0.0	1.0	1.0
+chr1	182743	0.0	2.0	2.0
+chr1	182745	1.0	2.0	3.0
+chr1	182746	2.0	0.0	2.0
+chr1	182747	2.0	0.0	2.0
+chr1	182748	1.0	0.0	1.0
+chr1	182749	0.0	1.0	1.0
+chr1	182750	0.0	1.0	1.0
+chr1	182752	2.0	0.0	2.0
+chr1	182753	1.0	0.0	1.0
+chr1	182754	2.0	1.0	3.0
+chr1	182755	0.0	1.0	1.0
+chr1	182758	5.0	0.0	5.0
+chr1	182761	1.0	0.0	1.0
+chr1	182763	0.0	1.0	1.0
+chr1	182764	0.0	1.0	1.0
+chr1	182766	1.0	0.0	1.0
+chr1	182768	1.0	1.0	2.0
+chr1	182773	1.0	0.0	1.0
+chr1	182775	3.0	0.0	3.0
+chr1	182783	1.0	0.0	1.0
+chr1	182786	1.0	0.0	1.0
+chr1	182789	0.0	1.0	1.0
+chr1	182790	0.0	2.0	2.0
+chr1	182792	1.0	2.0	3.0
+chr1	182799	1.0	0.0	1.0
+chr1	182806	1.0	0.0	1.0
+chr1	182807	4.0	0.0	4.0
+chr1	182815	0.0	2.0	2.0
+chr1	182818	0.0	1.0	1.0
+chr1	182819	0.0	2.0	2.0
+chr1	182820	0.0	1.0	1.0
+chr1	182823	1.0	0.0	1.0
+chr1	182826	0.0	3.0	3.0
+chr1	182828	0.0	1.0	1.0
+chr1	182830	1.0	0.0	1.0
+chr1	182834	1.0	0.0	1.0
+chr1	182838	0.0	1.0	1.0
+chr1	182840	0.0	2.0	2.0
+chr1	182843	2.0	0.0	2.0
+chr1	182851	1.0	0.0	1.0
+chr1	182864	0.0	1.0	1.0
+chr1	182872	0.0	1.0	1.0
+chr1	182877	0.0	1.0	1.0
+chr1	182880	0.0	1.0	1.0
+chr1	182884	2.0	0.0	2.0
+chr1	182889	1.0	0.0	1.0
+chr1	182905	1.0	0.0	1.0
+chr1	182907	5.0	0.0	5.0
+chr1	182908	2.0	0.0	2.0
+chr1	182909	2.0	0.0	2.0
+chr1	182910	3.0	0.0	3.0
+chr1	182911	8.0	0.0	8.0
+chr1	182914	5.0	0.0	5.0
+chr1	182915	1.0	0.0	1.0
+chr1	182917	1.0	0.0	1.0
+chr1	182919	3.0	0.0	3.0
+chr1	182932	1.0	0.0	1.0
+chr1	182939	1.0	0.0	1.0
+chr1	182951	0.0	1.0	1.0
+chr1	183096	0.0	1.0	1.0
+chr1	183162	0.0	1.0	1.0
+chr1	183170	0.0	1.0	1.0
+chr1	183174	0.0	1.0	1.0
+chr1	183175	0.0	1.0	1.0
+chr1	183184	0.0	2.0	2.0
+chr1	183186	0.0	3.0	3.0
+chr1	183189	0.0	1.0	1.0
+chr1	183197	0.0	2.0	2.0
+chr1	183198	0.0	1.0	1.0
+chr1	183201	0.0	3.0	3.0
+chr1	183202	0.0	4.0	4.0
+chr1	183205	0.0	1.0	1.0
+chr1	183209	6.0	0.0	6.0
+chr1	183210	0.0	1.0	1.0
+chr1	183212	1.0	1.0	2.0
+chr1	183214	0.0	1.0	1.0
+chr1	183215	0.0	1.0	1.0
+chr1	183220	2.0	0.0	2.0
+chr1	183223	1.0	1.0	2.0
+chr1	183226	2.0	0.0	2.0
+chr1	183230	1.0	0.0	1.0
+chr1	183234	0.0	2.0	2.0
+chr1	183235	0.0	1.0	1.0
+chr1	183241	0.0	2.0	2.0
+chr1	183244	0.0	1.0	1.0
+chr1	183248	0.0	1.0	1.0
+chr1	183249	0.0	1.0	1.0
+chr1	183251	0.0	3.0	3.0
+chr1	183255	1.0	0.0	1.0
+chr1	183259	0.0	1.0	1.0
+chr1	183260	0.0	1.0	1.0
+chr1	183263	1.0	0.0	1.0
+chr1	183265	2.0	0.0	2.0
+chr1	183266	0.0	1.0	1.0
+chr1	183270	1.0	0.0	1.0
+chr1	183280	0.0	1.0	1.0
+chr1	183282	2.0	0.0	2.0
+chr1	183291	1.0	1.0	2.0
+chr1	183292	0.0	2.0	2.0
+chr1	183293	0.0	2.0	2.0
+chr1	183295	1.0	0.0	1.0
+chr1	183304	1.0	0.0	1.0
+chr1	183309	0.0	6.0	6.0
+chr1	183326	0.0	1.0	1.0
+chr1	183327	0.0	1.0	1.0
+chr1	183328	0.0	1.0	1.0
+chr1	183339	0.0	1.0	1.0
+chr1	183345	0.0	1.0	1.0
+chr1	183348	1.0	0.0	1.0
+chr1	183355	2.0	0.0	2.0
+chr1	183356	1.0	0.0	1.0
+chr1	183374	1.0	0.0	1.0
+chr1	183375	1.0	1.0	2.0
+chr1	183384	2.0	0.0	2.0
+chr1	183388	0.0	1.0	1.0
+chr1	183390	1.0	0.0	1.0
+chr1	183392	1.0	0.0	1.0
+chr1	183397	0.0	1.0	1.0
+chr1	183403	3.0	0.0	3.0
+chr1	183407	1.0	0.0	1.0
+chr1	183408	1.0	0.0	1.0
+chr1	183409	1.0	0.0	1.0
+chr1	183413	1.0	0.0	1.0
+chr1	183416	1.0	0.0	1.0
+chr1	183421	16.0	0.0	16.0
+chr1	183430	1.0	0.0	1.0
+chr1	183431	3.0	0.0	3.0
+chr1	183434	1.0	0.0	1.0
+chr1	183435	3.0	1.0	4.0
+chr1	183438	1.0	0.0	1.0
+chr1	183439	1.0	0.0	1.0
+chr1	183440	0.0	2.0	2.0
+chr1	183443	1.0	1.0	2.0
+chr1	183447	1.0	0.0	1.0
+chr1	183451	0.0	1.0	1.0
+chr1	183453	0.0	1.0	1.0
+chr1	183454	0.0	1.0	1.0
+chr1	183455	0.0	1.0	1.0
+chr1	183456	0.0	1.0	1.0
+chr1	183457	0.0	2.0	2.0
+chr1	183465	0.0	5.0	5.0
+chr1	183467	1.0	1.0	2.0
+chr1	183469	0.0	5.0	5.0
+chr1	183471	1.0	0.0	1.0
+chr1	183474	1.0	0.0	1.0
+chr1	183485	1.0	0.0	1.0
+chr1	183487	3.0	1.0	4.0
+chr1	183493	1.0	0.0	1.0
+chr1	183528	1.0	0.0	1.0
+chr1	183646	1.0	0.0	1.0
+chr1	183714	1.0	1.0	2.0
+chr1	183721	0.0	1.0	1.0
+chr1	183724	0.0	1.0	1.0
+chr1	183728	0.0	2.0	2.0
+chr1	183732	2.0	0.0	2.0
+chr1	183733	1.0	0.0	1.0
+chr1	183734	1.0	0.0	1.0
+chr1	183745	1.0	0.0	1.0
+chr1	183752	0.0	1.0	1.0
+chr1	183756	1.0	0.0	1.0
+chr1	183757	1.0	0.0	1.0
+chr1	183770	0.0	3.0	3.0
+chr1	183779	0.0	5.0	5.0
+chr1	183783	1.0	0.0	1.0
+chr1	183785	0.0	1.0	1.0
+chr1	183793	0.0	4.0	4.0
+chr1	183806	1.0	0.0	1.0
+chr1	183811	1.0	0.0	1.0
+chr1	183820	1.0	0.0	1.0
+chr1	183867	0.0	1.0	1.0
+chr1	183880	2.0	0.0	2.0
+chr1	183909	0.0	1.0	1.0
+chr1	184078	0.0	2.0	2.0
+chr1	184084	1.0	0.0	1.0
+chr1	184094	1.0	0.0	1.0
+chr1	184104	1.0	0.0	1.0
+chr1	184120	0.0	1.0	1.0
+chr1	184129	0.0	1.0	1.0
+chr1	184132	0.0	2.0	2.0
+chr1	184159	1.0	0.0	1.0
+chr1	184173	1.0	0.0	1.0
+chr1	184279	1.0	0.0	1.0
+chr1	184293	1.0	0.0	1.0
+chr1	184319	0.0	1.0	1.0
+chr1	184482	2.0	0.0	2.0
+chr1	184563	0.0	2.0	2.0
+chr1	184570	0.0	1.0	1.0
+chr1	184586	1.0	0.0	1.0
+chr1	184587	1.0	0.0	1.0
+chr1	184611	0.0	3.0	3.0
+chr1	184614	0.0	1.0	1.0
+chr1	184617	2.0	0.0	2.0
+chr1	184618	1.0	1.0	2.0
+chr1	184621	1.0	1.0	2.0
+chr1	184624	1.0	0.0	1.0
+chr1	184628	0.0	2.0	2.0
+chr1	184633	1.0	0.0	1.0
+chr1	184639	1.0	0.0	1.0
+chr1	184656	0.0	1.0	1.0
+chr1	184665	1.0	0.0	1.0
+chr1	184681	0.0	1.0	1.0
+chr1	184769	0.0	1.0	1.0
+chr1	184777	1.0	1.0	2.0
+chr1	184843	0.0	1.0	1.0
+chr1	184847	0.0	2.0	2.0
+chr1	184865	1.0	0.0	1.0
+chr1	184866	4.0	0.0	4.0
+chr1	184869	1.0	0.0	1.0
+chr1	184874	1.0	6.0	7.0
+chr1	184875	0.0	3.0	3.0
+chr1	184879	0.0	1.0	1.0
+chr1	184880	1.0	0.0	1.0
+chr1	184881	1.0	0.0	1.0
+chr1	184884	3.0	0.0	3.0
+chr1	184885	4.0	0.0	4.0
+chr1	184886	0.0	1.0	1.0
+chr1	184888	0.0	2.0	2.0
+chr1	184889	0.0	1.0	1.0
+chr1	184890	1.0	0.0	1.0
+chr1	184892	0.0	2.0	2.0
+chr1	184893	3.0	1.0	4.0
+chr1	184895	3.0	0.0	3.0
+chr1	184901	0.0	2.0	2.0
+chr1	184903	1.0	0.0	1.0
+chr1	184904	0.0	3.0	3.0
+chr1	184905	0.0	1.0	1.0
+chr1	184907	0.0	4.0	4.0
+chr1	184909	0.0	2.0	2.0
+chr1	184911	0.0	1.0	1.0
+chr1	184916	0.0	1.0	1.0
+chr1	184917	1.0	1.0	2.0
+chr1	184920	0.0	1.0	1.0
+chr1	184922	0.0	1.0	1.0
+chr1	184927	1.0	0.0	1.0
+chr1	184938	1.0	0.0	1.0
+chr1	185002	2.0	0.0	2.0
+chr1	185026	1.0	0.0	1.0
+chr1	185058	0.0	2.0	2.0
+chr1	185059	1.0	0.0	1.0
+chr1	185069	1.0	0.0	1.0
+chr1	185076	0.0	1.0	1.0
+chr1	185170	1.0	0.0	1.0
+chr1	185191	4.0	0.0	4.0
+chr1	185204	1.0	0.0	1.0
+chr1	185210	1.0	0.0	1.0
+chr1	185227	1.0	0.0	1.0
+chr1	185231	0.0	1.0	1.0
+chr1	185353	1.0	0.0	1.0
+chr1	185514	0.0	1.0	1.0
+chr1	185521	2.0	0.0	2.0
+chr1	185527	0.0	3.0	3.0
+chr1	185671	0.0	1.0	1.0
+chr1	185676	0.0	1.0	1.0
+chr1	185678	0.0	2.0	2.0
+chr1	185680	3.0	0.0	3.0
+chr1	185681	0.0	2.0	2.0
+chr1	185682	0.0	1.0	1.0
+chr1	185691	0.0	1.0	1.0
+chr1	185706	0.0	1.0	1.0
+chr1	185709	1.0	0.0	1.0
+chr1	185729	1.0	0.0	1.0
+chr1	185905	0.0	1.0	1.0
+chr1	185917	0.0	1.0	1.0
+chr1	185926	1.0	0.0	1.0
+chr1	185934	0.0	2.0	2.0
+chr1	185938	1.0	0.0	1.0
+chr1	185941	0.0	1.0	1.0
+chr1	185950	0.0	1.0	1.0
+chr1	185959	1.0	0.0	1.0
+chr1	185983	0.0	1.0	1.0
+chr1	186069	0.0	1.0	1.0
+chr1	186101	0.0	1.0	1.0
+chr1	186112	1.0	0.0	1.0
+chr1	186126	1.0	0.0	1.0
+chr1	186166	1.0	0.0	1.0
+chr1	186235	0.0	1.0	1.0
+chr1	186306	0.0	1.0	1.0
+chr1	186319	1.0	0.0	1.0
+chr1	186321	0.0	1.0	1.0
+chr1	186576	0.0	2.0	2.0
+chr1	186590	1.0	0.0	1.0
+chr1	186605	1.0	0.0	1.0
+chr1	186606	0.0	1.0	1.0
+chr1	186619	0.0	2.0	2.0
+chr1	186644	1.0	0.0	1.0
+chr1	186697	1.0	0.0	1.0
+chr1	186732	0.0	1.0	1.0
+chr1	186756	0.0	1.0	1.0
+chr1	186772	1.0	0.0	1.0
+chr1	186773	0.0	1.0	1.0
+chr1	186782	1.0	0.0	1.0
+chr1	186790	1.0	0.0	1.0
+chr1	186796	0.0	2.0	2.0
+chr1	186800	0.0	1.0	1.0
+chr1	186930	0.0	1.0	1.0
+chr1	186957	1.0	1.0	2.0
+chr1	186959	1.0	0.0	1.0
+chr1	186973	0.0	2.0	2.0
+chr1	186977	1.0	0.0	1.0
+chr1	186978	1.0	0.0	1.0
+chr1	186979	2.0	0.0	2.0
+chr1	186987	1.0	0.0	1.0
+chr1	186997	1.0	0.0	1.0
+chr1	187002	0.0	4.0	4.0
+chr1	187003	0.0	1.0	1.0
+chr1	187004	0.0	2.0	2.0
+chr1	187006	1.0	0.0	1.0
+chr1	187007	1.0	0.0	1.0
+chr1	187008	1.0	0.0	1.0
+chr1	187009	2.0	0.0	2.0
+chr1	187011	1.0	0.0	1.0
+chr1	187013	2.0	0.0	2.0
+chr1	187032	0.0	4.0	4.0
+chr1	187035	2.0	0.0	2.0
+chr1	187036	1.0	0.0	1.0
+chr1	187049	0.0	1.0	1.0
+chr1	187063	0.0	1.0	1.0
+chr1	187075	0.0	1.0	1.0
+chr1	187089	1.0	0.0	1.0
+chr1	187090	1.0	0.0	1.0
+chr1	187106	2.0	0.0	2.0
+chr1	187114	1.0	0.0	1.0
+chr1	187126	0.0	3.0	3.0
+chr1	187187	1.0	0.0	1.0
+chr1	187227	0.0	1.0	1.0
+chr1	187307	1.0	0.0	1.0
+chr1	187321	0.0	1.0	1.0
+chr1	187368	0.0	1.0	1.0
+chr1	187376	2.0	3.0	5.0
+chr1	187382	2.0	0.0	2.0
+chr1	187410	1.0	0.0	1.0
+chr1	187411	0.0	1.0	1.0
+chr1	187425	0.0	1.0	1.0
+chr1	187434	0.0	1.0	1.0
+chr1	187437	0.0	1.0	1.0
+chr1	187438	2.0	0.0	2.0
+chr1	187487	0.0	1.0	1.0
+chr1	187514	0.0	1.0	1.0
+chr1	187515	0.0	2.0	2.0
+chr1	187562	1.0	0.0	1.0
+chr1	187576	1.0	0.0	1.0
+chr1	187594	1.0	0.0	1.0
+chr1	187627	0.0	1.0	1.0
+chr1	187670	0.0	1.0	1.0
+chr1	187676	0.0	2.0	2.0
+chr1	187689	1.0	0.0	1.0
+chr1	187698	0.0	1.0	1.0
+chr1	187758	1.0	0.0	1.0
+chr1	187811	0.0	1.0	1.0
+chr1	187812	1.0	0.0	1.0
+chr1	187823	0.0	2.0	2.0
+chr1	187824	1.0	0.0	1.0
+chr1	187827	1.0	0.0	1.0
+chr1	187830	1.0	0.0	1.0
+chr1	187831	4.0	0.0	4.0
+chr1	187832	4.0	0.0	4.0
+chr1	187833	1.0	0.0	1.0
+chr1	187835	2.0	0.0	2.0
+chr1	187836	0.0	1.0	1.0
+chr1	187840	2.0	1.0	3.0
+chr1	187844	0.0	1.0	1.0
+chr1	187846	0.0	1.0	1.0
+chr1	187848	0.0	1.0	1.0
+chr1	187852	0.0	6.0	6.0
+chr1	187853	0.0	3.0	3.0
+chr1	187855	0.0	1.0	1.0
+chr1	187862	0.0	1.0	1.0
+chr1	187885	0.0	2.0	2.0
+chr1	187886	0.0	3.0	3.0
+chr1	187961	0.0	1.0	1.0
+chr1	188017	1.0	0.0	1.0
+chr1	188021	0.0	1.0	1.0
+chr1	188063	0.0	1.0	1.0
+chr1	188071	2.0	0.0	2.0
+chr1	188076	1.0	0.0	1.0
+chr1	188078	2.0	1.0	3.0
+chr1	188089	0.0	10.0	10.0
+chr1	188090	0.0	1.0	1.0
+chr1	188093	1.0	0.0	1.0
+chr1	188096	2.0	0.0	2.0
+chr1	188097	2.0	0.0	2.0
+chr1	188101	1.0	0.0	1.0
+chr1	188110	1.0	0.0	1.0
+chr1	188111	6.0	0.0	6.0
+chr1	188113	0.0	1.0	1.0
+chr1	188116	1.0	0.0	1.0
+chr1	188117	0.0	4.0	4.0
+chr1	188118	0.0	2.0	2.0
+chr1	188155	0.0	1.0	1.0
+chr1	188166	1.0	0.0	1.0
+chr1	188169	0.0	1.0	1.0
+chr1	188174	1.0	0.0	1.0
+chr1	188175	1.0	0.0	1.0
+chr1	188178	1.0	0.0	1.0
+chr1	188219	1.0	0.0	1.0
+chr1	188242	1.0	0.0	1.0
+chr1	188275	0.0	1.0	1.0
+chr1	188286	1.0	0.0	1.0
+chr1	188339	0.0	1.0	1.0
+chr1	188344	1.0	0.0	1.0
+chr1	188378	0.0	1.0	1.0
+chr1	188392	0.0	1.0	1.0
+chr1	188424	1.0	0.0	1.0
+chr1	188425	1.0	0.0	1.0
+chr1	188440	0.0	1.0	1.0
+chr1	188454	1.0	0.0	1.0
+chr1	188460	0.0	2.0	2.0
+chr1	188469	0.0	1.0	1.0
+chr1	188472	0.0	2.0	2.0
+chr1	188491	2.0	0.0	2.0
+chr1	188492	1.0	0.0	1.0
+chr1	188499	0.0	1.0	1.0
+chr1	188508	1.0	0.0	1.0
+chr1	188526	1.0	0.0	1.0
+chr1	188574	1.0	0.0	1.0
+chr1	188576	0.0	2.0	2.0
+chr1	188593	3.0	0.0	3.0
+chr1	188600	2.0	0.0	2.0
+chr1	188603	0.0	2.0	2.0
+chr1	188606	0.0	1.0	1.0
+chr1	188609	0.0	3.0	3.0
+chr1	188612	0.0	1.0	1.0
+chr1	188615	1.0	0.0	1.0
+chr1	188616	0.0	1.0	1.0
+chr1	188620	0.0	1.0	1.0
+chr1	188621	1.0	0.0	1.0
+chr1	188622	1.0	0.0	1.0
+chr1	188623	0.0	3.0	3.0
+chr1	188624	1.0	0.0	1.0
+chr1	188628	0.0	2.0	2.0
+chr1	188636	5.0	0.0	5.0
+chr1	188637	0.0	1.0	1.0
+chr1	188643	0.0	1.0	1.0
+chr1	188644	1.0	0.0	1.0
+chr1	188650	1.0	0.0	1.0
+chr1	188653	1.0	1.0	2.0
+chr1	188662	1.0	1.0	2.0
+chr1	188664	1.0	0.0	1.0
+chr1	188671	2.0	0.0	2.0
+chr1	188675	0.0	1.0	1.0
+chr1	188700	0.0	2.0	2.0
+chr1	188701	1.0	0.0	1.0
+chr1	188713	0.0	1.0	1.0
+chr1	188734	1.0	0.0	1.0
+chr1	188746	1.0	0.0	1.0
+chr1	188824	1.0	0.0	1.0
+chr1	188828	1.0	0.0	1.0
+chr1	188833	0.0	1.0	1.0
+chr1	188848	0.0	1.0	1.0
+chr1	188849	1.0	0.0	1.0
+chr1	188855	0.0	1.0	1.0
+chr1	188876	0.0	1.0	1.0
+chr1	188877	1.0	0.0	1.0
+chr1	188880	0.0	1.0	1.0
+chr1	188905	0.0	1.0	1.0
+chr1	188921	1.0	0.0	1.0
+chr1	188930	0.0	1.0	1.0
+chr1	188932	3.0	0.0	3.0
+chr1	188933	1.0	0.0	1.0
+chr1	188949	0.0	1.0	1.0
+chr1	188952	1.0	0.0	1.0
+chr1	188974	0.0	2.0	2.0
+chr1	188975	0.0	2.0	2.0
+chr1	188988	1.0	0.0	1.0
+chr1	188992	0.0	2.0	2.0
+chr1	188996	0.0	1.0	1.0
+chr1	188997	2.0	0.0	2.0
+chr1	188998	2.0	0.0	2.0
+chr1	189005	0.0	1.0	1.0
+chr1	189006	1.0	1.0	2.0
+chr1	189007	2.0	0.0	2.0
+chr1	189008	2.0	0.0	2.0
+chr1	189010	0.0	1.0	1.0
+chr1	189013	0.0	4.0	4.0
+chr1	189015	0.0	1.0	1.0
+chr1	189016	0.0	1.0	1.0
+chr1	189020	0.0	1.0	1.0
+chr1	189021	0.0	1.0	1.0
+chr1	189030	1.0	0.0	1.0
+chr1	189031	6.0	0.0	6.0
+chr1	189032	0.0	3.0	3.0
+chr1	189033	0.0	3.0	3.0
+chr1	189038	2.0	0.0	2.0
+chr1	189047	1.0	0.0	1.0
+chr1	189049	0.0	1.0	1.0
+chr1	189052	1.0	0.0	1.0
+chr1	189071	0.0	1.0	1.0
+chr1	189079	1.0	0.0	1.0
+chr1	189196	1.0	0.0	1.0
+chr1	189205	0.0	1.0	1.0
+chr1	189212	1.0	0.0	1.0
+chr1	189400	0.0	1.0	1.0
+chr1	189401	0.0	1.0	1.0
+chr1	189405	1.0	0.0	1.0
+chr1	189406	1.0	0.0	1.0
+chr1	189441	0.0	1.0	1.0
+chr1	189444	0.0	1.0	1.0
+chr1	189445	0.0	1.0	1.0
+chr1	189449	0.0	2.0	2.0
+chr1	189493	6.0	0.0	6.0
+chr1	189496	1.0	1.0	2.0
+chr1	189499	0.0	2.0	2.0
+chr1	189500	0.0	1.0	1.0
+chr1	189503	0.0	5.0	5.0
+chr1	189556	1.0	0.0	1.0
+chr1	189560	0.0	1.0	1.0
+chr1	189616	0.0	1.0	1.0
+chr1	189638	1.0	0.0	1.0
+chr1	189648	0.0	1.0	1.0
+chr1	189655	0.0	1.0	1.0
+chr1	189661	0.0	2.0	2.0
+chr1	189666	0.0	2.0	2.0
+chr1	189671	0.0	4.0	4.0
+chr1	189678	0.0	1.0	1.0
+chr1	189683	2.0	0.0	2.0
+chr1	189690	3.0	0.0	3.0
+chr1	189694	2.0	0.0	2.0
+chr1	189697	1.0	0.0	1.0
+chr1	189698	1.0	0.0	1.0
+chr1	189700	3.0	0.0	3.0
+chr1	189702	5.0	0.0	5.0
+chr1	189703	9.0	0.0	9.0
+chr1	189705	1.0	0.0	1.0
+chr1	189707	1.0	0.0	1.0
+chr1	189712	0.0	1.0	1.0
+chr1	189716	3.0	0.0	3.0
+chr1	189717	2.0	0.0	2.0
+chr1	189720	1.0	0.0	1.0
+chr1	189721	1.0	0.0	1.0
+chr1	189728	1.0	0.0	1.0
+chr1	189737	1.0	0.0	1.0
+chr1	189875	0.0	1.0	1.0
+chr1	189890	1.0	0.0	1.0
+chr1	189902	0.0	1.0	1.0
+chr1	189904	1.0	0.0	1.0
+chr1	190063	0.0	1.0	1.0
+chr1	190088	1.0	0.0	1.0
+chr1	190225	0.0	1.0	1.0
+chr1	190456	0.0	1.0	1.0
+chr1	190491	0.0	1.0	1.0
+chr1	190496	0.0	2.0	2.0
+chr1	190506	0.0	1.0	1.0
+chr1	190507	1.0	0.0	1.0
+chr1	190510	1.0	0.0	1.0
+chr1	190534	1.0	0.0	1.0
+chr1	190663	1.0	0.0	1.0
+chr1	190696	1.0	0.0	1.0
+chr1	190697	1.0	0.0	1.0
+chr1	190741	0.0	1.0	1.0
+chr1	190750	1.0	0.0	1.0
+chr1	190758	1.0	0.0	1.0
+chr1	190775	1.0	0.0	1.0
+chr1	190786	0.0	1.0	1.0
+chr1	190789	0.0	1.0	1.0
+chr1	190838	2.0	0.0	2.0
+chr1	190859	1.0	0.0	1.0
+chr1	190864	1.0	0.0	1.0
+chr1	190865	0.0	1.0	1.0
+chr1	190909	1.0	0.0	1.0
+chr1	190997	0.0	1.0	1.0
+chr1	191026	1.0	1.0	2.0
+chr1	191055	0.0	1.0	1.0
+chr1	191057	0.0	1.0	1.0
+chr1	191098	0.0	1.0	1.0
+chr1	191168	0.0	1.0	1.0
+chr1	191172	0.0	1.0	1.0
+chr1	191174	0.0	1.0	1.0
+chr1	191177	1.0	0.0	1.0
+chr1	191188	0.0	1.0	1.0
+chr1	191194	0.0	1.0	1.0
+chr1	191200	0.0	1.0	1.0
+chr1	191206	1.0	0.0	1.0
+chr1	191294	1.0	0.0	1.0
+chr1	191331	0.0	1.0	1.0
+chr1	191334	0.0	1.0	1.0
+chr1	191335	0.0	1.0	1.0
+chr1	191342	0.0	1.0	1.0
+chr1	191352	0.0	1.0	1.0
+chr1	191366	0.0	2.0	2.0
+chr1	191403	2.0	0.0	2.0
+chr1	191405	0.0	1.0	1.0
+chr1	191408	0.0	1.0	1.0
+chr1	191420	1.0	0.0	1.0
+chr1	191443	0.0	1.0	1.0
+chr1	191454	1.0	0.0	1.0
+chr1	191469	0.0	1.0	1.0
+chr1	191579	2.0	0.0	2.0
+chr1	191592	1.0	0.0	1.0
+chr1	191607	2.0	0.0	2.0
+chr1	191611	4.0	0.0	4.0
+chr1	191621	0.0	2.0	2.0
+chr1	191622	2.0	0.0	2.0
+chr1	191623	2.0	1.0	3.0
+chr1	191625	1.0	0.0	1.0
+chr1	191632	0.0	1.0	1.0
+chr1	191633	0.0	1.0	1.0
+chr1	191638	0.0	1.0	1.0
+chr1	191654	0.0	1.0	1.0
+chr1	191668	1.0	0.0	1.0
+chr1	191679	1.0	0.0	1.0
+chr1	191728	1.0	0.0	1.0
+chr1	191741	1.0	0.0	1.0
+chr1	191773	2.0	0.0	2.0
+chr1	191779	1.0	0.0	1.0
+chr1	191780	1.0	0.0	1.0
+chr1	191785	2.0	0.0	2.0
+chr1	191800	0.0	1.0	1.0
+chr1	191803	0.0	2.0	2.0
+chr1	191818	0.0	1.0	1.0
+chr1	191846	1.0	0.0	1.0
+chr1	191934	1.0	0.0	1.0
+chr1	191950	0.0	1.0	1.0
+chr1	191968	0.0	2.0	2.0
+chr1	191969	1.0	0.0	1.0
+chr1	192007	1.0	0.0	1.0
+chr1	192112	0.0	2.0	2.0
+chr1	192113	0.0	1.0	1.0
+chr1	192122	0.0	1.0	1.0
+chr1	192168	1.0	0.0	1.0
+chr1	192209	1.0	0.0	1.0
+chr1	192287	0.0	1.0	1.0
+chr1	192297	1.0	0.0	1.0
+chr1	192301	1.0	0.0	1.0
+chr1	192308	0.0	2.0	2.0
+chr1	192323	0.0	1.0	1.0
+chr1	192325	0.0	1.0	1.0
+chr1	192329	1.0	0.0	1.0
+chr1	192594	1.0	2.0	3.0
+chr1	192610	0.0	2.0	2.0
+chr1	192611	1.0	2.0	3.0
+chr1	192613	3.0	0.0	3.0
+chr1	192615	2.0	0.0	2.0
+chr1	192616	0.0	1.0	1.0
+chr1	192619	1.0	0.0	1.0
+chr1	192620	0.0	2.0	2.0
+chr1	192621	2.0	0.0	2.0
+chr1	192623	0.0	2.0	2.0
+chr1	192624	1.0	0.0	1.0
+chr1	192629	0.0	1.0	1.0
+chr1	192630	0.0	3.0	3.0
+chr1	192631	2.0	0.0	2.0
+chr1	192632	1.0	0.0	1.0
+chr1	192634	2.0	3.0	5.0
+chr1	192637	1.0	1.0	2.0
+chr1	192638	1.0	0.0	1.0
+chr1	192643	1.0	0.0	1.0
+chr1	192756	1.0	0.0	1.0
+chr1	192770	1.0	0.0	1.0
+chr1	192771	1.0	0.0	1.0
+chr1	192772	1.0	0.0	1.0
+chr1	192785	0.0	1.0	1.0
+chr1	192787	2.0	0.0	2.0
+chr1	192799	0.0	1.0	1.0
+chr1	192807	1.0	0.0	1.0
+chr1	192942	1.0	0.0	1.0
+chr1	192945	0.0	1.0	1.0
+chr1	193155	1.0	0.0	1.0
+chr1	193398	0.0	1.0	1.0
+chr1	194474	1.0	0.0	1.0
+chr1	195048	0.0	1.0	1.0
+chr1	195190	1.0	0.0	1.0
+chr1	195315	0.0	1.0	1.0
+chr1	195320	0.0	1.0	1.0
+chr1	195366	0.0	1.0	1.0
+chr1	195738	1.0	0.0	1.0
+chr1	195841	1.0	0.0	1.0
+chr1	196062	0.0	1.0	1.0
+chr1	196272	0.0	2.0	2.0
+chr1	196903	0.0	1.0	1.0
+chr1	197001	0.0	2.0	2.0
+chr1	197092	2.0	0.0	2.0
+chr1	197300	1.0	0.0	1.0
+chr1	197302	0.0	1.0	1.0
+chr1	197380	0.0	1.0	1.0
+chr1	197654	0.0	1.0	1.0
+chr1	197701	1.0	0.0	1.0
+chr1	197845	1.0	0.0	1.0
+chr1	197862	0.0	1.0	1.0
+chr1	197877	2.0	0.0	2.0
+chr1	198044	2.0	0.0	2.0
+chr1	198050	1.0	0.0	1.0
+chr1	198213	0.0	1.0	1.0
+chr1	198379	0.0	1.0	1.0
+chr1	198393	0.0	1.0	1.0
+chr1	198395	1.0	1.0	2.0
+chr1	198406	0.0	1.0	1.0
+chr1	198409	0.0	1.0	1.0
+chr1	198428	0.0	1.0	1.0
+chr1	198763	1.0	0.0	1.0
+chr1	198773	2.0	0.0	2.0
+chr1	198778	2.0	0.0	2.0
+chr1	198787	1.0	0.0	1.0
+chr1	198788	0.0	1.0	1.0
+chr1	198789	0.0	1.0	1.0
+chr1	198791	1.0	0.0	1.0
+chr1	198796	0.0	1.0	1.0
+chr1	198797	0.0	1.0	1.0
+chr1	198798	1.0	1.0	2.0
+chr1	198799	0.0	1.0	1.0
+chr1	198811	0.0	2.0	2.0
+chr1	198814	0.0	1.0	1.0
+chr1	198822	2.0	0.0	2.0
+chr1	198838	1.0	0.0	1.0
+chr1	198844	1.0	0.0	1.0
+chr1	198871	0.0	1.0	1.0
+chr1	198907	1.0	0.0	1.0
+chr1	198920	0.0	1.0	1.0
+chr1	198935	1.0	0.0	1.0
+chr1	198938	1.0	0.0	1.0
+chr1	198942	0.0	1.0	1.0
+chr1	198943	1.0	0.0	1.0
+chr1	198959	0.0	2.0	2.0
+chr1	198962	1.0	0.0	1.0
+chr1	198976	3.0	0.0	3.0
+chr1	199110	0.0	1.0	1.0
+chr1	199119	1.0	0.0	1.0
+chr1	199142	1.0	0.0	1.0
+chr1	199152	2.0	0.0	2.0
+chr1	199170	1.0	0.0	1.0
+chr1	199171	1.0	0.0	1.0
+chr1	199240	0.0	1.0	1.0
+chr1	199829	1.0	0.0	1.0
+chr1	199840	0.0	1.0	1.0
+chr1	199897	2.0	0.0	2.0
+chr1	199990	1.0	0.0	1.0
+chr1	200052	0.0	2.0	2.0
+chr1	200206	0.0	1.0	1.0
+chr1	200350	0.0	1.0	1.0
+chr1	200354	1.0	0.0	1.0
+chr1	200358	0.0	1.0	1.0
+chr1	200360	0.0	1.0	1.0
+chr1	200361	0.0	1.0	1.0
+chr1	200364	3.0	0.0	3.0
+chr1	200365	1.0	0.0	1.0
+chr1	200366	0.0	1.0	1.0
+chr1	200368	3.0	0.0	3.0
+chr1	200369	1.0	0.0	1.0
+chr1	200371	2.0	0.0	2.0
+chr1	200377	1.0	0.0	1.0
+chr1	200378	0.0	1.0	1.0
+chr1	200382	0.0	2.0	2.0
+chr1	200392	1.0	0.0	1.0
+chr1	200405	1.0	0.0	1.0
+chr1	200414	1.0	0.0	1.0
+chr1	200638	0.0	3.0	3.0
+chr1	200643	1.0	0.0	1.0
+chr1	200649	0.0	1.0	1.0
+chr1	200651	0.0	1.0	1.0
+chr1	200655	1.0	0.0	1.0
+chr1	200660	4.0	0.0	4.0
+chr1	200663	1.0	0.0	1.0
+chr1	200664	0.0	1.0	1.0
+chr1	200667	3.0	0.0	3.0
+chr1	200669	0.0	1.0	1.0
+chr1	200671	2.0	0.0	2.0
+chr1	200672	0.0	1.0	1.0
+chr1	200679	0.0	1.0	1.0
+chr1	200685	0.0	1.0	1.0
+chr1	200694	1.0	0.0	1.0
+chr1	200699	1.0	0.0	1.0
+chr1	200704	1.0	0.0	1.0
+chr1	200722	1.0	0.0	1.0
+chr1	200727	0.0	1.0	1.0
+chr1	200734	1.0	0.0	1.0
+chr1	200753	4.0	0.0	4.0
+chr1	200767	1.0	0.0	1.0
+chr1	200806	1.0	0.0	1.0
+chr1	200827	0.0	1.0	1.0
+chr1	200957	1.0	0.0	1.0
+chr1	200986	0.0	1.0	1.0
+chr1	201001	0.0	1.0	1.0
+chr1	201182	0.0	1.0	1.0
+chr1	201249	0.0	1.0	1.0
+chr1	201277	0.0	1.0	1.0
+chr1	201287	0.0	1.0	1.0
+chr1	201302	1.0	0.0	1.0
+chr1	201320	1.0	0.0	1.0
+chr1	201400	0.0	1.0	1.0
+chr1	201462	0.0	1.0	1.0
+chr1	201787	1.0	0.0	1.0
+chr1	201788	1.0	0.0	1.0
+chr1	201810	1.0	0.0	1.0
+chr1	201952	1.0	0.0	1.0
+chr1	202185	1.0	0.0	1.0
+chr1	202278	2.0	0.0	2.0
+chr1	202310	0.0	1.0	1.0
+chr1	202312	1.0	0.0	1.0
+chr1	202317	1.0	0.0	1.0
+chr1	202334	1.0	0.0	1.0
+chr1	202461	1.0	0.0	1.0
+chr1	202467	1.0	0.0	1.0
+chr1	202468	0.0	1.0	1.0
+chr1	202473	1.0	0.0	1.0
+chr1	202474	2.0	0.0	2.0
+chr1	202483	2.0	0.0	2.0
+chr1	202486	1.0	0.0	1.0
+chr1	202487	1.0	0.0	1.0
+chr1	202501	1.0	0.0	1.0
+chr1	202502	0.0	1.0	1.0
+chr1	202512	0.0	1.0	1.0
+chr1	202538	1.0	0.0	1.0
+chr1	202773	1.0	0.0	1.0
+chr1	202780	2.0	0.0	2.0
+chr1	202781	1.0	0.0	1.0
+chr1	202783	1.0	0.0	1.0
+chr1	202791	0.0	2.0	2.0
+chr1	202795	1.0	1.0	2.0
+chr1	202807	4.0	0.0	4.0
+chr1	202808	2.0	0.0	2.0
+chr1	202811	0.0	1.0	1.0
+chr1	202814	1.0	0.0	1.0
+chr1	202815	0.0	2.0	2.0
+chr1	202816	0.0	1.0	1.0
+chr1	202824	0.0	1.0	1.0
+chr1	202827	0.0	1.0	1.0
+chr1	202831	1.0	0.0	1.0
+chr1	202840	2.0	0.0	2.0
+chr1	202887	0.0	1.0	1.0
+chr1	202978	1.0	0.0	1.0
+chr1	202994	1.0	0.0	1.0
+chr1	202998	1.0	0.0	1.0
+chr1	202999	0.0	1.0	1.0
+chr1	203117	0.0	1.0	1.0
+chr1	203168	1.0	0.0	1.0
+chr1	203293	1.0	0.0	1.0
+chr1	203346	0.0	1.0	1.0
+chr1	203364	1.0	0.0	1.0
+chr1	203458	0.0	1.0	1.0
+chr1	203473	1.0	0.0	1.0
+chr1	203488	1.0	0.0	1.0
+chr1	203494	2.0	0.0	2.0
+chr1	203505	1.0	0.0	1.0
+chr1	203624	0.0	1.0	1.0
+chr1	203657	2.0	0.0	2.0
+chr1	203713	1.0	0.0	1.0
+chr1	203794	1.0	0.0	1.0
+chr1	203809	0.0	2.0	2.0
+chr1	203811	1.0	0.0	1.0
+chr1	203920	1.0	0.0	1.0
+chr1	203962	1.0	0.0	1.0
+chr1	204018	1.0	0.0	1.0
+chr1	204040	1.0	0.0	1.0
+chr1	204059	0.0	1.0	1.0
+chr1	204118	0.0	1.0	1.0
+chr1	204128	0.0	1.0	1.0
+chr1	204240	0.0	1.0	1.0
+chr1	204244	0.0	1.0	1.0
+chr1	204267	0.0	1.0	1.0
+chr1	204282	0.0	1.0	1.0
+chr1	204286	1.0	0.0	1.0
+chr1	204289	1.0	0.0	1.0
+chr1	204295	1.0	0.0	1.0
+chr1	204297	1.0	0.0	1.0
+chr1	204300	1.0	0.0	1.0
+chr1	204316	0.0	1.0	1.0
+chr1	204326	0.0	1.0	1.0
+chr1	204334	1.0	0.0	1.0
+chr1	204337	3.0	0.0	3.0
+chr1	204360	0.0	1.0	1.0
+chr1	204363	0.0	1.0	1.0
+chr1	204375	0.0	1.0	1.0
+chr1	204383	0.0	1.0	1.0
+chr1	204396	1.0	3.0	4.0
+chr1	204424	1.0	0.0	1.0
+chr1	204432	1.0	0.0	1.0
+chr1	204435	1.0	0.0	1.0
+chr1	204451	0.0	1.0	1.0
+chr1	204461	0.0	1.0	1.0
+chr1	204482	2.0	0.0	2.0
+chr1	204486	0.0	1.0	1.0
+chr1	204491	0.0	2.0	2.0
+chr1	204510	0.0	1.0	1.0
+chr1	204518	0.0	1.0	1.0
+chr1	204531	0.0	3.0	3.0
+chr1	204535	1.0	0.0	1.0
+chr1	204541	1.0	0.0	1.0
+chr1	204567	1.0	0.0	1.0
+chr1	204570	1.0	0.0	1.0
+chr1	204578	1.0	0.0	1.0
+chr1	204583	0.0	1.0	1.0
+chr1	204586	0.0	1.0	1.0
+chr1	204590	0.0	1.0	1.0
+chr1	204596	0.0	1.0	1.0
+chr1	204617	3.0	0.0	3.0
+chr1	204621	0.0	1.0	1.0
+chr1	204626	0.0	2.0	2.0
+chr1	204640	1.0	0.0	1.0
+chr1	204645	0.0	1.0	1.0
+chr1	204653	0.0	1.0	1.0
+chr1	204666	1.0	3.0	4.0
+chr1	204676	1.0	0.0	1.0
+chr1	204705	1.0	0.0	1.0
+chr1	204711	1.0	0.0	1.0
+chr1	204718	0.0	1.0	1.0
+chr1	204721	0.0	1.0	1.0
+chr1	204725	0.0	1.0	1.0
+chr1	204731	0.0	1.0	1.0
+chr1	204752	3.0	0.0	3.0
+chr1	204756	0.0	1.0	1.0
+chr1	204761	0.0	2.0	2.0
+chr1	204775	1.0	0.0	1.0
+chr1	204780	0.0	1.0	1.0
+chr1	204788	0.0	1.0	1.0
+chr1	204801	1.0	3.0	4.0
+chr1	204811	1.0	0.0	1.0
+chr1	204840	1.0	0.0	1.0
+chr1	204846	1.0	0.0	1.0
+chr1	204853	0.0	1.0	1.0
+chr1	204856	0.0	1.0	1.0
+chr1	204860	0.0	1.0	1.0
+chr1	204864	0.0	1.0	1.0
+chr1	204887	3.0	0.0	3.0
+chr1	204891	0.0	1.0	1.0
+chr1	204896	0.0	2.0	2.0
+chr1	204910	1.0	0.0	1.0
+chr1	204915	0.0	1.0	1.0
+chr1	204936	1.0	3.0	4.0
+chr1	204946	1.0	0.0	1.0
+chr1	204975	1.0	0.0	1.0
+chr1	204981	1.0	0.0	1.0
+chr1	204988	0.0	1.0	1.0
+chr1	204991	0.0	1.0	1.0
+chr1	204995	0.0	1.0	1.0
+chr1	204999	0.0	1.0	1.0
+chr1	205012	1.0	0.0	1.0
+chr1	205015	1.0	0.0	1.0
+chr1	205024	1.0	0.0	1.0
+chr1	205026	0.0	1.0	1.0
+chr1	205031	0.0	2.0	2.0
+chr1	205045	1.0	0.0	1.0
+chr1	205050	0.0	1.0	1.0
+chr1	205054	0.0	2.0	2.0
+chr1	205071	1.0	3.0	4.0
+chr1	205081	1.0	0.0	1.0
+chr1	205116	1.0	0.0	1.0
+chr1	205117	0.0	1.0	1.0
+chr1	205126	0.0	1.0	1.0
+chr1	205130	0.0	1.0	1.0
+chr1	205134	0.0	1.0	1.0
+chr1	205150	1.0	0.0	1.0
+chr1	205157	2.0	0.0	2.0
+chr1	205161	0.0	1.0	1.0
+chr1	205166	0.0	2.0	2.0
+chr1	205178	1.0	0.0	1.0
+chr1	205182	0.0	1.0	1.0
+chr1	205185	0.0	1.0	1.0
+chr1	205189	0.0	2.0	2.0
+chr1	205193	0.0	1.0	1.0
+chr1	205196	1.0	0.0	1.0
+chr1	205206	1.0	3.0	4.0
+chr1	205216	1.0	0.0	1.0
+chr1	205241	1.0	0.0	1.0
+chr1	205242	2.0	0.0	2.0
+chr1	205245	1.0	0.0	1.0
+chr1	205253	1.0	0.0	1.0
+chr1	205258	0.0	1.0	1.0
+chr1	205261	0.0	1.0	1.0
+chr1	205265	0.0	1.0	1.0
+chr1	205269	0.0	1.0	1.0
+chr1	205285	1.0	0.0	1.0
+chr1	205292	2.0	0.0	2.0
+chr1	205296	0.0	1.0	1.0
+chr1	205301	0.0	2.0	2.0
+chr1	205313	1.0	0.0	1.0
+chr1	205317	0.0	1.0	1.0
+chr1	205320	0.0	1.0	1.0
+chr1	205324	0.0	2.0	2.0
+chr1	205328	0.0	1.0	1.0
+chr1	205331	1.0	0.0	1.0
+chr1	205341	1.0	3.0	4.0
+chr1	205351	1.0	0.0	1.0
+chr1	205377	2.0	0.0	2.0
+chr1	205380	1.0	0.0	1.0
+chr1	205386	1.0	0.0	1.0
+chr1	205393	0.0	1.0	1.0
+chr1	205396	0.0	1.0	1.0
+chr1	205400	0.0	1.0	1.0
+chr1	205404	0.0	1.0	1.0
+chr1	205417	1.0	0.0	1.0
+chr1	205420	1.0	0.0	1.0
+chr1	205427	2.0	0.0	2.0
+chr1	205431	0.0	1.0	1.0
+chr1	205436	0.0	2.0	2.0
+chr1	205448	1.0	0.0	1.0
+chr1	205455	0.0	1.0	1.0
+chr1	205476	1.0	3.0	4.0
+chr1	205486	1.0	0.0	1.0
+chr1	205515	1.0	0.0	1.0
+chr1	205521	1.0	0.0	1.0
+chr1	205528	0.0	1.0	1.0
+chr1	205531	0.0	1.0	1.0
+chr1	205535	0.0	1.0	1.0
+chr1	205539	0.0	1.0	1.0
+chr1	205552	1.0	0.0	1.0
+chr1	205555	1.0	0.0	1.0
+chr1	205564	2.0	0.0	2.0
+chr1	205566	0.0	1.0	1.0
+chr1	205571	0.0	2.0	2.0
+chr1	205584	1.0	0.0	1.0
+chr1	205590	0.0	1.0	1.0
+chr1	205594	0.0	1.0	1.0
+chr1	205598	0.0	2.0	2.0
+chr1	205611	1.0	0.0	1.0
+chr1	205615	0.0	3.0	3.0
+chr1	205621	1.0	0.0	1.0
+chr1	205629	0.0	1.0	1.0
+chr1	205650	1.0	0.0	1.0
+chr1	205656	1.0	0.0	1.0
+chr1	205660	0.0	1.0	1.0
+chr1	205670	0.0	1.0	1.0
+chr1	205672	1.0	0.0	1.0
+chr1	205677	0.0	1.0	1.0
+chr1	205681	1.0	1.0	2.0
+chr1	205690	1.0	0.0	1.0
+chr1	205714	1.0	0.0	1.0
+chr1	205718	1.0	0.0	1.0
+chr1	205730	0.0	1.0	1.0
+chr1	205744	1.0	0.0	1.0
+chr1	205754	0.0	1.0	1.0
+chr1	205756	2.0	0.0	2.0
+chr1	205759	1.0	0.0	1.0
+chr1	205762	0.0	1.0	1.0
+chr1	205774	1.0	0.0	1.0
+chr1	205789	1.0	0.0	1.0
+chr1	205795	0.0	1.0	1.0
+chr1	205800	0.0	1.0	1.0
+chr1	205803	1.0	0.0	1.0
+chr1	205813	0.0	1.0	1.0
+chr1	205825	1.0	0.0	1.0
+chr1	205859	2.0	0.0	2.0
+chr1	205861	1.0	0.0	1.0
+chr1	205865	0.0	1.0	1.0
+chr1	205877	1.0	0.0	1.0
+chr1	205889	0.0	1.0	1.0
+chr1	205893	1.0	0.0	1.0
+chr1	205894	1.0	0.0	1.0
+chr1	205899	0.0	1.0	1.0
+chr1	205906	1.0	0.0	1.0
+chr1	205914	2.0	0.0	2.0
+chr1	205915	1.0	0.0	1.0
+chr1	205918	2.0	0.0	2.0
+chr1	205924	1.0	0.0	1.0
+chr1	205935	0.0	1.0	1.0
+chr1	205938	1.0	0.0	1.0
+chr1	205948	1.0	0.0	1.0
+chr1	205960	1.0	0.0	1.0
+chr1	205977	1.0	0.0	1.0
+chr1	205988	1.0	0.0	1.0
+chr1	205996	1.0	0.0	1.0
+chr1	206000	0.0	1.0	1.0
+chr1	206014	1.0	0.0	1.0
+chr1	206022	0.0	1.0	1.0
+chr1	206034	0.0	1.0	1.0
+chr1	206044	1.0	0.0	1.0
+chr1	206073	1.0	1.0	2.0
+chr1	206083	1.0	1.0	2.0
+chr1	206095	1.0	0.0	1.0
+chr1	206129	1.0	0.0	1.0
+chr1	206130	0.0	1.0	1.0
+chr1	206131	1.0	0.0	1.0
+chr1	206161	2.0	0.0	2.0
+chr1	206169	0.0	1.0	1.0
+chr1	206179	1.0	0.0	1.0
+chr1	206188	2.0	0.0	2.0
+chr1	206190	1.0	0.0	1.0
+chr1	206199	0.0	1.0	1.0
+chr1	206209	1.0	0.0	1.0
+chr1	206211	0.0	1.0	1.0
+chr1	206218	1.0	0.0	1.0
+chr1	206221	0.0	1.0	1.0
+chr1	206254	1.0	0.0	1.0
+chr1	206258	1.0	0.0	1.0
+chr1	206266	1.0	0.0	1.0
+chr1	206268	0.0	1.0	1.0
+chr1	206284	1.0	0.0	1.0
+chr1	206294	0.0	1.0	1.0
+chr1	206296	2.0	0.0	2.0
+chr1	206304	0.0	1.0	1.0
+chr1	206314	1.0	0.0	1.0
+chr1	206335	0.0	1.0	1.0
+chr1	206343	0.0	1.0	1.0
+chr1	206347	1.0	0.0	1.0
+chr1	206353	0.0	1.0	1.0
+chr1	206361	1.0	0.0	1.0
+chr1	206374	1.0	0.0	1.0
+chr1	206383	1.0	0.0	1.0
+chr1	206399	2.0	0.0	2.0
+chr1	206401	1.0	0.0	1.0
+chr1	206405	0.0	1.0	1.0
+chr1	206417	1.0	0.0	1.0
+chr1	206429	0.0	1.0	1.0
+chr1	206431	2.0	0.0	2.0
+chr1	206437	0.0	1.0	1.0
+chr1	206449	1.0	0.0	1.0
+chr1	206464	1.0	0.0	1.0
+chr1	206470	0.0	1.0	1.0
+chr1	206475	0.0	1.0	1.0
+chr1	206478	1.0	0.0	1.0
+chr1	206481	0.0	1.0	1.0
+chr1	206488	1.0	0.0	1.0
+chr1	206491	0.0	1.0	1.0
+chr1	206500	1.0	0.0	1.0
+chr1	206534	2.0	0.0	2.0
+chr1	206538	0.0	1.0	1.0
+chr1	206562	0.0	1.0	1.0
+chr1	206589	1.0	0.0	1.0
+chr1	206593	2.0	0.0	2.0
+chr1	206599	1.0	0.0	1.0
+chr1	206647	0.0	1.0	1.0
+chr1	206668	0.0	2.0	2.0
+chr1	206684	0.0	1.0	1.0
+chr1	206722	0.0	1.0	1.0
+chr1	206794	0.0	1.0	1.0
+chr1	206879	1.0	0.0	1.0
+chr1	206892	1.0	0.0	1.0
+chr1	206902	0.0	1.0	1.0
+chr1	206907	0.0	1.0	1.0
+chr1	206909	1.0	0.0	1.0
+chr1	206932	2.0	0.0	2.0
+chr1	206934	3.0	0.0	3.0
+chr1	206952	0.0	4.0	4.0
+chr1	206958	1.0	0.0	1.0
+chr1	207022	1.0	1.0	2.0
+chr1	207060	1.0	0.0	1.0
+chr1	207072	1.0	0.0	1.0
+chr1	207073	3.0	0.0	3.0
+chr1	207080	1.0	0.0	1.0
+chr1	207091	1.0	0.0	1.0
+chr1	207094	0.0	1.0	1.0
+chr1	207100	1.0	0.0	1.0
+chr1	207102	3.0	0.0	3.0
+chr1	207103	0.0	1.0	1.0
+chr1	207106	0.0	1.0	1.0
+chr1	207109	1.0	0.0	1.0
+chr1	207111	0.0	3.0	3.0
+chr1	207121	0.0	2.0	2.0
+chr1	207123	3.0	0.0	3.0
+chr1	207124	2.0	0.0	2.0
+chr1	207125	0.0	2.0	2.0
+chr1	207126	0.0	1.0	1.0
+chr1	207129	1.0	0.0	1.0
+chr1	207133	0.0	1.0	1.0
+chr1	207139	1.0	0.0	1.0
+chr1	207150	0.0	1.0	1.0
+chr1	207158	0.0	1.0	1.0
+chr1	207179	2.0	0.0	2.0
+chr1	207250	0.0	1.0	1.0
+chr1	207256	0.0	2.0	2.0
+chr1	207268	0.0	1.0	1.0
+chr1	207274	1.0	0.0	1.0
+chr1	207295	0.0	1.0	1.0
+chr1	207298	0.0	1.0	1.0
+chr1	207303	0.0	1.0	1.0
+chr1	207372	0.0	1.0	1.0
+chr1	207397	0.0	1.0	1.0
+chr1	207430	1.0	0.0	1.0
+chr1	207433	1.0	0.0	1.0
+chr1	207449	0.0	1.0	1.0
+chr1	207451	2.0	3.0	5.0
+chr1	207455	0.0	1.0	1.0
+chr1	207467	1.0	2.0	3.0
+chr1	207473	0.0	1.0	1.0
+chr1	207474	0.0	1.0	1.0
+chr1	207475	0.0	1.0	1.0
+chr1	207480	1.0	0.0	1.0
+chr1	207492	0.0	1.0	1.0
+chr1	207496	0.0	1.0	1.0
+chr1	207532	1.0	0.0	1.0
+chr1	207548	1.0	0.0	1.0
+chr1	207581	0.0	1.0	1.0
+chr1	207602	0.0	2.0	2.0
+chr1	207603	1.0	0.0	1.0
+chr1	207605	1.0	0.0	1.0
+chr1	207612	1.0	0.0	1.0
+chr1	207621	1.0	0.0	1.0
+chr1	207630	0.0	1.0	1.0
+chr1	207632	0.0	1.0	1.0
+chr1	207638	2.0	0.0	2.0
+chr1	207644	1.0	0.0	1.0
+chr1	207651	1.0	0.0	1.0
+chr1	207653	1.0	0.0	1.0
+chr1	207673	0.0	1.0	1.0
+chr1	207676	0.0	1.0	1.0
+chr1	207678	0.0	1.0	1.0
+chr1	207699	0.0	1.0	1.0
+chr1	207701	0.0	1.0	1.0
+chr1	207718	0.0	1.0	1.0
+chr1	207778	0.0	1.0	1.0
+chr1	207808	0.0	1.0	1.0
+chr1	207812	1.0	0.0	1.0
+chr1	207814	4.0	0.0	4.0
+chr1	207819	1.0	0.0	1.0
+chr1	207823	0.0	1.0	1.0
+chr1	207824	0.0	1.0	1.0
+chr1	207832	1.0	0.0	1.0
+chr1	207835	0.0	2.0	2.0
+chr1	207838	0.0	1.0	1.0
+chr1	207845	1.0	0.0	1.0
+chr1	207846	0.0	1.0	1.0
+chr1	207850	1.0	0.0	1.0
+chr1	207854	0.0	2.0	2.0
+chr1	207856	1.0	0.0	1.0
+chr1	207873	1.0	0.0	1.0
+chr1	207875	0.0	1.0	1.0
+chr1	207877	2.0	0.0	2.0
+chr1	207895	1.0	0.0	1.0
+chr1	207926	3.0	0.0	3.0
+chr1	207928	1.0	0.0	1.0
+chr1	207939	1.0	0.0	1.0
+chr1	207942	1.0	0.0	1.0
+chr1	207947	0.0	1.0	1.0
+chr1	207957	0.0	1.0	1.0
+chr1	207958	3.0	0.0	3.0
+chr1	207973	1.0	0.0	1.0
+chr1	207976	1.0	0.0	1.0
+chr1	207980	0.0	2.0	2.0
+chr1	207993	2.0	0.0	2.0
+chr1	207997	1.0	0.0	1.0
+chr1	208001	2.0	0.0	2.0
+chr1	208002	2.0	0.0	2.0
+chr1	208005	2.0	0.0	2.0
+chr1	208018	1.0	0.0	1.0
+chr1	208020	0.0	1.0	1.0
+chr1	208021	0.0	1.0	1.0
+chr1	208163	1.0	0.0	1.0
+chr1	208169	0.0	1.0	1.0
+chr1	208368	0.0	1.0	1.0
+chr1	208369	0.0	1.0	1.0
+chr1	208371	1.0	0.0	1.0
+chr1	208372	1.0	0.0	1.0
+chr1	208381	0.0	1.0	1.0
+chr1	208387	0.0	1.0	1.0
+chr1	208389	1.0	0.0	1.0
+chr1	208392	0.0	1.0	1.0
+chr1	208399	1.0	0.0	1.0
+chr1	208404	1.0	0.0	1.0
+chr1	208407	2.0	0.0	2.0
+chr1	208408	1.0	0.0	1.0
+chr1	208411	1.0	0.0	1.0
+chr1	208418	0.0	2.0	2.0
+chr1	208433	1.0	0.0	1.0
+chr1	208434	0.0	1.0	1.0
+chr1	208451	1.0	0.0	1.0
+chr1	208452	2.0	0.0	2.0
+chr1	208462	0.0	1.0	1.0
+chr1	208472	0.0	1.0	1.0
+chr1	208478	1.0	0.0	1.0
+chr1	208484	1.0	0.0	1.0
+chr1	208505	2.0	0.0	2.0
+chr1	208521	0.0	1.0	1.0
+chr1	208524	0.0	1.0	1.0
+chr1	208548	0.0	1.0	1.0
+chr1	208551	0.0	1.0	1.0
+chr1	208564	1.0	0.0	1.0
+chr1	208565	1.0	0.0	1.0
+chr1	208572	0.0	2.0	2.0
+chr1	208575	0.0	1.0	1.0
+chr1	208592	0.0	1.0	1.0
+chr1	208602	1.0	0.0	1.0
+chr1	208728	0.0	1.0	1.0
+chr1	208741	0.0	1.0	1.0
+chr1	208744	1.0	0.0	1.0
+chr1	208745	1.0	0.0	1.0
+chr1	208749	1.0	0.0	1.0
+chr1	208753	2.0	0.0	2.0
+chr1	208761	0.0	1.0	1.0
+chr1	208767	0.0	1.0	1.0
+chr1	208782	0.0	1.0	1.0
+chr1	208787	0.0	1.0	1.0
+chr1	208795	2.0	0.0	2.0
+chr1	208797	1.0	0.0	1.0
+chr1	208822	0.0	1.0	1.0
+chr1	208830	1.0	1.0	2.0
+chr1	208847	2.0	0.0	2.0
+chr1	208850	0.0	1.0	1.0
+chr1	208899	0.0	2.0	2.0
+chr1	208917	0.0	1.0	1.0
+chr1	208935	2.0	0.0	2.0
+chr1	208936	0.0	1.0	1.0
+chr1	208938	0.0	2.0	2.0
+chr1	208942	2.0	0.0	2.0
+chr1	208954	1.0	0.0	1.0
+chr1	208956	1.0	0.0	1.0
+chr1	208958	1.0	0.0	1.0
+chr1	208959	2.0	0.0	2.0
+chr1	208962	1.0	3.0	4.0
+chr1	208966	0.0	1.0	1.0
+chr1	208972	0.0	1.0	1.0
+chr1	208977	1.0	0.0	1.0
+chr1	208982	1.0	2.0	3.0
+chr1	208985	0.0	2.0	2.0
+chr1	208988	1.0	0.0	1.0
+chr1	208989	0.0	1.0	1.0
+chr1	209010	1.0	0.0	1.0
+chr1	209046	2.0	0.0	2.0
+chr1	209144	1.0	0.0	1.0
+chr1	209158	0.0	1.0	1.0
+chr1	209182	2.0	0.0	2.0
+chr1	209214	0.0	1.0	1.0
+chr1	209217	1.0	0.0	1.0
+chr1	209228	0.0	1.0	1.0
+chr1	209234	0.0	1.0	1.0
+chr1	209248	0.0	1.0	1.0
+chr1	209251	1.0	0.0	1.0
+chr1	209252	1.0	0.0	1.0
+chr1	209255	0.0	2.0	2.0
+chr1	209257	1.0	5.0	6.0
+chr1	209260	0.0	1.0	1.0
+chr1	209263	0.0	1.0	1.0
+chr1	209269	1.0	0.0	1.0
+chr1	209278	0.0	1.0	1.0
+chr1	209280	1.0	0.0	1.0
+chr1	209285	0.0	2.0	2.0
+chr1	209286	0.0	1.0	1.0
+chr1	209298	0.0	1.0	1.0
+chr1	209312	2.0	0.0	2.0
+chr1	209379	1.0	0.0	1.0
+chr1	209385	0.0	1.0	1.0
+chr1	209419	0.0	1.0	1.0
+chr1	209420	1.0	0.0	1.0
+chr1	209423	0.0	1.0	1.0
+chr1	209626	1.0	0.0	1.0
+chr1	209651	0.0	1.0	1.0
+chr1	209654	1.0	0.0	1.0
+chr1	209663	3.0	0.0	3.0
+chr1	209716	1.0	0.0	1.0
+chr1	209730	0.0	2.0	2.0
+chr1	209736	1.0	0.0	1.0
+chr1	209743	0.0	1.0	1.0
+chr1	209754	0.0	2.0	2.0
+chr1	209758	1.0	0.0	1.0
+chr1	209763	0.0	1.0	1.0
+chr1	209783	0.0	1.0	1.0
+chr1	209786	0.0	1.0	1.0
+chr1	209802	1.0	0.0	1.0
+chr1	209803	1.0	0.0	1.0
+chr1	209826	1.0	0.0	1.0
+chr1	209837	1.0	0.0	1.0
+chr1	209839	0.0	1.0	1.0
+chr1	209840	0.0	1.0	1.0
+chr1	209846	0.0	1.0	1.0
+chr1	209847	0.0	1.0	1.0
+chr1	209852	2.0	0.0	2.0
+chr1	209907	1.0	0.0	1.0
+chr1	209921	0.0	1.0	1.0
+chr1	209924	0.0	1.0	1.0
+chr1	209932	0.0	1.0	1.0
+chr1	209951	1.0	0.0	1.0
+chr1	209995	0.0	1.0	1.0
+chr1	210006	1.0	0.0	1.0
+chr1	210063	0.0	1.0	1.0
+chr1	210068	1.0	0.0	1.0
+chr1	210072	2.0	0.0	2.0
+chr1	210087	0.0	1.0	1.0
+chr1	210097	1.0	0.0	1.0
+chr1	210115	1.0	0.0	1.0
+chr1	210118	0.0	1.0	1.0
+chr1	210138	0.0	1.0	1.0
+chr1	210153	0.0	1.0	1.0
+chr1	210154	0.0	1.0	1.0
+chr1	210157	0.0	1.0	1.0
+chr1	210172	2.0	0.0	2.0
+chr1	210227	1.0	0.0	1.0
+chr1	210235	1.0	0.0	1.0
+chr1	210239	0.0	1.0	1.0
+chr1	210243	1.0	0.0	1.0
+chr1	210247	1.0	0.0	1.0
+chr1	210248	1.0	0.0	1.0
+chr1	210257	1.0	0.0	1.0
+chr1	210264	2.0	0.0	2.0
+chr1	210265	1.0	1.0	2.0
+chr1	210273	0.0	2.0	2.0
+chr1	210274	0.0	1.0	1.0
+chr1	210280	3.0	0.0	3.0
+chr1	210284	0.0	2.0	2.0
+chr1	210286	1.0	0.0	1.0
+chr1	210288	1.0	0.0	1.0
+chr1	210292	2.0	0.0	2.0
+chr1	210298	0.0	2.0	2.0
+chr1	210316	1.0	0.0	1.0
+chr1	210317	2.0	0.0	2.0
+chr1	210362	1.0	0.0	1.0
+chr1	210372	0.0	1.0	1.0
+chr1	210392	1.0	0.0	1.0
+chr1	210399	1.0	0.0	1.0
+chr1	210423	0.0	1.0	1.0
+chr1	210430	0.0	1.0	1.0
+chr1	210432	1.0	0.0	1.0
+chr1	210434	0.0	1.0	1.0
+chr1	210455	1.0	0.0	1.0
+chr1	210465	0.0	1.0	1.0
+chr1	210469	1.0	1.0	2.0
+chr1	210479	0.0	1.0	1.0
+chr1	210480	3.0	0.0	3.0
+chr1	210482	0.0	1.0	1.0
+chr1	210497	0.0	2.0	2.0
+chr1	210505	1.0	0.0	1.0
+chr1	210616	1.0	0.0	1.0
+chr1	210635	2.0	0.0	2.0
+chr1	210640	0.0	3.0	3.0
+chr1	210649	1.0	0.0	1.0
+chr1	210651	1.0	0.0	1.0
+chr1	210661	1.0	0.0	1.0
+chr1	210672	0.0	1.0	1.0
+chr1	210673	1.0	0.0	1.0
+chr1	210682	1.0	0.0	1.0
+chr1	210686	0.0	1.0	1.0
+chr1	210689	1.0	0.0	1.0
+chr1	210694	0.0	2.0	2.0
+chr1	210697	0.0	1.0	1.0
+chr1	210698	0.0	1.0	1.0
+chr1	210716	0.0	2.0	2.0
+chr1	210745	0.0	1.0	1.0
+chr1	210746	1.0	0.0	1.0
+chr1	210778	2.0	0.0	2.0
+chr1	210790	1.0	0.0	1.0
+chr1	210792	0.0	1.0	1.0
+chr1	210795	1.0	0.0	1.0
+chr1	210874	1.0	0.0	1.0
+chr1	210894	0.0	1.0	1.0
+chr1	210899	0.0	1.0	1.0
+chr1	211029	1.0	0.0	1.0
+chr1	211189	0.0	1.0	1.0
+chr1	211229	1.0	0.0	1.0
+chr1	211244	1.0	0.0	1.0
+chr1	211245	0.0	1.0	1.0
+chr1	211262	3.0	0.0	3.0
+chr1	211264	0.0	2.0	2.0
+chr1	211265	0.0	1.0	1.0
+chr1	211267	0.0	1.0	1.0
+chr1	211268	0.0	2.0	2.0
+chr1	211269	3.0	0.0	3.0
+chr1	211270	0.0	2.0	2.0
+chr1	211271	0.0	1.0	1.0
+chr1	211273	1.0	0.0	1.0
+chr1	211274	1.0	0.0	1.0
+chr1	211278	0.0	4.0	4.0
+chr1	211279	0.0	2.0	2.0
+chr1	211281	1.0	0.0	1.0
+chr1	211282	3.0	0.0	3.0
+chr1	211283	0.0	1.0	1.0
+chr1	211294	0.0	2.0	2.0
+chr1	211296	0.0	1.0	1.0
+chr1	211302	0.0	1.0	1.0
+chr1	211307	1.0	0.0	1.0
+chr1	211308	0.0	2.0	2.0
+chr1	211352	0.0	1.0	1.0
+chr1	211413	0.0	1.0	1.0
+chr1	211419	1.0	0.0	1.0
+chr1	211420	0.0	2.0	2.0
+chr1	211427	1.0	0.0	1.0
+chr1	211452	0.0	1.0	1.0
+chr1	211454	1.0	0.0	1.0
+chr1	211462	1.0	0.0	1.0
+chr1	211464	2.0	0.0	2.0
+chr1	211466	1.0	0.0	1.0
+chr1	211468	1.0	0.0	1.0
+chr1	211473	0.0	1.0	1.0
+chr1	211489	1.0	0.0	1.0
+chr1	211508	0.0	1.0	1.0
+chr1	211509	1.0	0.0	1.0
+chr1	211518	0.0	1.0	1.0
+chr1	211555	1.0	0.0	1.0
+chr1	211556	1.0	0.0	1.0
+chr1	211563	1.0	0.0	1.0
+chr1	211566	1.0	1.0	2.0
+chr1	211575	0.0	1.0	1.0
+chr1	211599	1.0	2.0	3.0
+chr1	211600	1.0	0.0	1.0
+chr1	211615	1.0	0.0	1.0
+chr1	211631	1.0	0.0	1.0
+chr1	211633	0.0	1.0	1.0
+chr1	211635	0.0	1.0	1.0
+chr1	211700	0.0	1.0	1.0
+chr1	211756	0.0	1.0	1.0
+chr1	211762	0.0	1.0	1.0
+chr1	211766	1.0	0.0	1.0
+chr1	211772	1.0	0.0	1.0
+chr1	211774	1.0	0.0	1.0
+chr1	211778	1.0	0.0	1.0
+chr1	211787	0.0	2.0	2.0
+chr1	211793	1.0	0.0	1.0
+chr1	211798	0.0	2.0	2.0
+chr1	211807	0.0	2.0	2.0
+chr1	211810	1.0	0.0	1.0
+chr1	211813	0.0	1.0	1.0
+chr1	211828	1.0	0.0	1.0
+chr1	211831	1.0	0.0	1.0
+chr1	211852	0.0	1.0	1.0
+chr1	211865	0.0	1.0	1.0
+chr1	211886	1.0	0.0	1.0
+chr1	211895	1.0	0.0	1.0
+chr1	211924	0.0	1.0	1.0
+chr1	211931	1.0	0.0	1.0
+chr1	211944	0.0	1.0	1.0
+chr1	211955	2.0	0.0	2.0
+chr1	211974	0.0	1.0	1.0
+chr1	211976	1.0	0.0	1.0
+chr1	211983	0.0	1.0	1.0
+chr1	211988	0.0	1.0	1.0
+chr1	211993	0.0	1.0	1.0
+chr1	212006	0.0	2.0	2.0
+chr1	212010	1.0	0.0	1.0
+chr1	212021	2.0	0.0	2.0
+chr1	212062	0.0	1.0	1.0
+chr1	212077	0.0	1.0	1.0
+chr1	212091	0.0	1.0	1.0
+chr1	212094	1.0	0.0	1.0
+chr1	212095	0.0	2.0	2.0
+chr1	212118	0.0	1.0	1.0
+chr1	212131	2.0	0.0	2.0
+chr1	212142	0.0	1.0	1.0
+chr1	212153	1.0	0.0	1.0
+chr1	212155	2.0	0.0	2.0
+chr1	212157	0.0	1.0	1.0
+chr1	212168	2.0	0.0	2.0
+chr1	212172	1.0	0.0	1.0
+chr1	212194	0.0	2.0	2.0
+chr1	212205	1.0	0.0	1.0
+chr1	212218	0.0	1.0	1.0
+chr1	212293	0.0	1.0	1.0
+chr1	212294	0.0	1.0	1.0
+chr1	212297	0.0	1.0	1.0
+chr1	212324	1.0	0.0	1.0
+chr1	212328	1.0	0.0	1.0
+chr1	212347	3.0	0.0	3.0
+chr1	212365	0.0	1.0	1.0
+chr1	212403	0.0	1.0	1.0
+chr1	212407	1.0	0.0	1.0
+chr1	212408	2.0	0.0	2.0
+chr1	212409	2.0	1.0	3.0
+chr1	212410	0.0	1.0	1.0
+chr1	212465	1.0	0.0	1.0
+chr1	212475	1.0	0.0	1.0
+chr1	212479	0.0	1.0	1.0
+chr1	212480	0.0	3.0	3.0
+chr1	212491	0.0	1.0	1.0
+chr1	212502	0.0	3.0	3.0
+chr1	212507	0.0	1.0	1.0
+chr1	212515	1.0	0.0	1.0
+chr1	212518	0.0	1.0	1.0
+chr1	212533	0.0	1.0	1.0
+chr1	212534	1.0	0.0	1.0
+chr1	212538	1.0	0.0	1.0
+chr1	212540	0.0	1.0	1.0
+chr1	212549	0.0	4.0	4.0
+chr1	212552	2.0	1.0	3.0
+chr1	212559	1.0	0.0	1.0
+chr1	212561	1.0	0.0	1.0
+chr1	212562	0.0	1.0	1.0
+chr1	212569	1.0	0.0	1.0
+chr1	212575	1.0	1.0	2.0
+chr1	212615	0.0	1.0	1.0
+chr1	212639	1.0	0.0	1.0
+chr1	212649	3.0	0.0	3.0
+chr1	212651	0.0	1.0	1.0
+chr1	212656	1.0	0.0	1.0
+chr1	212661	1.0	1.0	2.0
+chr1	212667	1.0	0.0	1.0
+chr1	212670	0.0	2.0	2.0
+chr1	212673	0.0	1.0	1.0
+chr1	212674	2.0	0.0	2.0
+chr1	212680	1.0	0.0	1.0
+chr1	212682	1.0	0.0	1.0
+chr1	212686	0.0	1.0	1.0
+chr1	212687	0.0	1.0	1.0
+chr1	212699	1.0	2.0	3.0
+chr1	212700	1.0	1.0	2.0
+chr1	212711	1.0	0.0	1.0
+chr1	212725	1.0	0.0	1.0
+chr1	212826	1.0	0.0	1.0
+chr1	212835	0.0	1.0	1.0
+chr1	212846	0.0	1.0	1.0
+chr1	212858	1.0	0.0	1.0
+chr1	212859	1.0	0.0	1.0
+chr1	212864	1.0	1.0	2.0
+chr1	212865	0.0	1.0	1.0
+chr1	212876	0.0	1.0	1.0
+chr1	212882	0.0	1.0	1.0
+chr1	212913	1.0	0.0	1.0
+chr1	212942	1.0	0.0	1.0
+chr1	213003	1.0	0.0	1.0
+chr1	213009	0.0	4.0	4.0
+chr1	213011	1.0	0.0	1.0
+chr1	213017	1.0	0.0	1.0
+chr1	213030	2.0	0.0	2.0
+chr1	213032	0.0	1.0	1.0
+chr1	213036	1.0	0.0	1.0
+chr1	213037	0.0	1.0	1.0
+chr1	213041	1.0	0.0	1.0
+chr1	213042	1.0	0.0	1.0
+chr1	213044	0.0	1.0	1.0
+chr1	213047	0.0	1.0	1.0
+chr1	213064	1.0	0.0	1.0
+chr1	213133	1.0	0.0	1.0
+chr1	213167	1.0	0.0	1.0
+chr1	213203	0.0	1.0	1.0
+chr1	213205	0.0	1.0	1.0
+chr1	213210	0.0	1.0	1.0
+chr1	213220	1.0	1.0	2.0
+chr1	213221	1.0	0.0	1.0
+chr1	213224	0.0	1.0	1.0
+chr1	213225	0.0	1.0	1.0
+chr1	213229	0.0	3.0	3.0
+chr1	213234	1.0	0.0	1.0
+chr1	213237	0.0	1.0	1.0
+chr1	213245	0.0	1.0	1.0
+chr1	213253	1.0	0.0	1.0
+chr1	213297	1.0	0.0	1.0
+chr1	213298	1.0	0.0	1.0
+chr1	213313	0.0	1.0	1.0
+chr1	213317	1.0	0.0	1.0
+chr1	213358	1.0	0.0	1.0
+chr1	213361	1.0	0.0	1.0
+chr1	213365	0.0	2.0	2.0
+chr1	213366	0.0	1.0	1.0
+chr1	213374	0.0	1.0	1.0
+chr1	213380	1.0	0.0	1.0
+chr1	213384	2.0	0.0	2.0
+chr1	213385	1.0	0.0	1.0
+chr1	213386	1.0	0.0	1.0
+chr1	213402	3.0	0.0	3.0
+chr1	213441	1.0	1.0	2.0
+chr1	213442	0.0	1.0	1.0
+chr1	213459	0.0	1.0	1.0
+chr1	213463	2.0	0.0	2.0
+chr1	213500	1.0	0.0	1.0
+chr1	213515	1.0	0.0	1.0
+chr1	213538	0.0	1.0	1.0
+chr1	213539	1.0	0.0	1.0
+chr1	213543	3.0	0.0	3.0
+chr1	213674	1.0	0.0	1.0
+chr1	213680	2.0	0.0	2.0
+chr1	213697	0.0	3.0	3.0
+chr1	213706	1.0	0.0	1.0
+chr1	213708	1.0	0.0	1.0
+chr1	213718	1.0	0.0	1.0
+chr1	213722	0.0	1.0	1.0
+chr1	213727	0.0	1.0	1.0
+chr1	213739	1.0	0.0	1.0
+chr1	213747	2.0	0.0	2.0
+chr1	213830	1.0	0.0	1.0
+chr1	213838	1.0	0.0	1.0
+chr1	213850	0.0	1.0	1.0
+chr1	213857	3.0	0.0	3.0
+chr1	213863	0.0	1.0	1.0
+chr1	213864	1.0	1.0	2.0
+chr1	213865	0.0	1.0	1.0
+chr1	213873	1.0	0.0	1.0
+chr1	213874	1.0	0.0	1.0
+chr1	213876	1.0	0.0	1.0
+chr1	213877	0.0	1.0	1.0
+chr1	213879	0.0	1.0	1.0
+chr1	213881	1.0	0.0	1.0
+chr1	213883	1.0	0.0	1.0
+chr1	213884	6.0	0.0	6.0
+chr1	213887	1.0	0.0	1.0
+chr1	213894	1.0	0.0	1.0
+chr1	213896	1.0	0.0	1.0
+chr1	213938	0.0	1.0	1.0
+chr1	214018	0.0	1.0	1.0
+chr1	214019	1.0	0.0	1.0
+chr1	214025	0.0	1.0	1.0
+chr1	214026	0.0	2.0	2.0
+chr1	214029	1.0	0.0	1.0
+chr1	214032	3.0	0.0	3.0
+chr1	214035	0.0	1.0	1.0
+chr1	214042	1.0	0.0	1.0
+chr1	214048	2.0	0.0	2.0
+chr1	214053	0.0	1.0	1.0
+chr1	214054	0.0	2.0	2.0
+chr1	214057	0.0	1.0	1.0
+chr1	214058	0.0	1.0	1.0
+chr1	214059	0.0	2.0	2.0
+chr1	214080	1.0	0.0	1.0
+chr1	214101	0.0	1.0	1.0
+chr1	214208	1.0	0.0	1.0
+chr1	214213	0.0	2.0	2.0
+chr1	214214	1.0	0.0	1.0
+chr1	214217	1.0	0.0	1.0
+chr1	214220	1.0	0.0	1.0
+chr1	214221	2.0	0.0	2.0
+chr1	214232	1.0	0.0	1.0
+chr1	214233	3.0	0.0	3.0
+chr1	214234	2.0	0.0	2.0
+chr1	214237	1.0	0.0	1.0
+chr1	214253	0.0	1.0	1.0
+chr1	214258	0.0	1.0	1.0
+chr1	214263	1.0	0.0	1.0
+chr1	214269	0.0	1.0	1.0
+chr1	214272	2.0	0.0	2.0
+chr1	214276	1.0	0.0	1.0
+chr1	214278	0.0	2.0	2.0
+chr1	214283	2.0	0.0	2.0
+chr1	214291	0.0	5.0	5.0
+chr1	214292	0.0	4.0	4.0
+chr1	214293	1.0	1.0	2.0
+chr1	214294	0.0	1.0	1.0
+chr1	214299	0.0	1.0	1.0
+chr1	214303	0.0	2.0	2.0
+chr1	214304	1.0	1.0	2.0
+chr1	214308	0.0	1.0	1.0
+chr1	214311	5.0	0.0	5.0
+chr1	214321	0.0	1.0	1.0
+chr1	214325	1.0	0.0	1.0
+chr1	214338	1.0	0.0	1.0
+chr1	214390	1.0	0.0	1.0
+chr1	214405	0.0	1.0	1.0
+chr1	214406	0.0	1.0	1.0
+chr1	214413	0.0	1.0	1.0
+chr1	214458	1.0	0.0	1.0
+chr1	214468	1.0	0.0	1.0
+chr1	214542	1.0	0.0	1.0
+chr1	214725	0.0	1.0	1.0
+chr1	214738	0.0	1.0	1.0
+chr1	214739	0.0	2.0	2.0
+chr1	214771	1.0	0.0	1.0
+chr1	214801	2.0	0.0	2.0
+chr1	214831	1.0	0.0	1.0
+chr1	214852	0.0	1.0	1.0
+chr1	215175	1.0	0.0	1.0
+chr1	215271	3.0	0.0	3.0
+chr1	215332	0.0	1.0	1.0
+chr1	215473	0.0	1.0	1.0
+chr1	215614	1.0	0.0	1.0
+chr1	215634	1.0	0.0	1.0
+chr1	215706	2.0	0.0	2.0
+chr1	215740	0.0	2.0	2.0
+chr1	215808	0.0	1.0	1.0
+chr1	215817	0.0	1.0	1.0
+chr1	215927	0.0	1.0	1.0
+chr1	215944	1.0	0.0	1.0
+chr1	215968	1.0	0.0	1.0
+chr1	215987	0.0	1.0	1.0
+chr1	216039	0.0	1.0	1.0
+chr1	216180	1.0	0.0	1.0
+chr1	216495	0.0	1.0	1.0
+chr1	216504	0.0	1.0	1.0
+chr1	216526	1.0	0.0	1.0
+chr1	216543	0.0	1.0	1.0
+chr1	216547	0.0	1.0	1.0
+chr1	216551	0.0	1.0	1.0
+chr1	216574	0.0	1.0	1.0
+chr1	216582	0.0	1.0	1.0
+chr1	216704	0.0	1.0	1.0
+chr1	216721	0.0	1.0	1.0
+chr1	216728	1.0	0.0	1.0
+chr1	216869	1.0	0.0	1.0
+chr1	216874	2.0	0.0	2.0
+chr1	216878	1.0	0.0	1.0
+chr1	216894	0.0	1.0	1.0
+chr1	216895	1.0	0.0	1.0
+chr1	216905	0.0	1.0	1.0
+chr1	216938	0.0	1.0	1.0
+chr1	216978	1.0	0.0	1.0
+chr1	217015	4.0	0.0	4.0
+chr1	217064	0.0	1.0	1.0
+chr1	217122	1.0	0.0	1.0
+chr1	217217	1.0	0.0	1.0
+chr1	217224	1.0	0.0	1.0
+chr1	217225	1.0	0.0	1.0
+chr1	217226	2.0	0.0	2.0
+chr1	217227	0.0	2.0	2.0
+chr1	217233	1.0	1.0	2.0
+chr1	217234	0.0	1.0	1.0
+chr1	217235	1.0	0.0	1.0
+chr1	217236	0.0	3.0	3.0
+chr1	217239	0.0	1.0	1.0
+chr1	217241	1.0	2.0	3.0
+chr1	217244	0.0	1.0	1.0
+chr1	217245	0.0	1.0	1.0
+chr1	217246	0.0	1.0	1.0
+chr1	217249	1.0	0.0	1.0
+chr1	217252	1.0	0.0	1.0
+chr1	217253	0.0	2.0	2.0
+chr1	217257	2.0	0.0	2.0
+chr1	217264	1.0	0.0	1.0
+chr1	217265	0.0	1.0	1.0
+chr1	217270	0.0	1.0	1.0
+chr1	217278	1.0	0.0	1.0
+chr1	217279	1.0	0.0	1.0
+chr1	217281	1.0	0.0	1.0
+chr1	217289	1.0	0.0	1.0
+chr1	217291	1.0	0.0	1.0
+chr1	217299	1.0	1.0	2.0
+chr1	217302	0.0	1.0	1.0
+chr1	217317	0.0	1.0	1.0
+chr1	217601	1.0	0.0	1.0
+chr1	217602	3.0	0.0	3.0
+chr1	217605	3.0	0.0	3.0
+chr1	217610	0.0	1.0	1.0
+chr1	217611	2.0	0.0	2.0
+chr1	217612	0.0	1.0	1.0
+chr1	217616	1.0	0.0	1.0
+chr1	217630	0.0	1.0	1.0
+chr1	217631	0.0	2.0	2.0
+chr1	217634	1.0	0.0	1.0
+chr1	217637	0.0	1.0	1.0
+chr1	217638	0.0	1.0	1.0
+chr1	217641	3.0	0.0	3.0
+chr1	217645	0.0	1.0	1.0
+chr1	217647	1.0	0.0	1.0
+chr1	217650	0.0	1.0	1.0
+chr1	217654	1.0	0.0	1.0
+chr1	217656	0.0	1.0	1.0
+chr1	217658	0.0	1.0	1.0
+chr1	217722	0.0	3.0	3.0
+chr1	217735	0.0	1.0	1.0
+chr1	217767	0.0	1.0	1.0
+chr1	217776	0.0	1.0	1.0
+chr1	217787	2.0	0.0	2.0
+chr1	217795	0.0	1.0	1.0
+chr1	217804	1.0	0.0	1.0
+chr1	217809	1.0	0.0	1.0
+chr1	217862	0.0	1.0	1.0
+chr1	217951	0.0	1.0	1.0
+chr1	217956	1.0	0.0	1.0
+chr1	217963	2.0	0.0	2.0
+chr1	217964	0.0	1.0	1.0
+chr1	217966	2.0	1.0	3.0
+chr1	217967	0.0	1.0	1.0
+chr1	217971	1.0	0.0	1.0
+chr1	217973	1.0	0.0	1.0
+chr1	217980	1.0	0.0	1.0
+chr1	217982	0.0	2.0	2.0
+chr1	218015	1.0	0.0	1.0
+chr1	218024	1.0	0.0	1.0
+chr1	218053	0.0	1.0	1.0
+chr1	218063	0.0	1.0	1.0
+chr1	218136	1.0	0.0	1.0
+chr1	218181	0.0	1.0	1.0
+chr1	218183	1.0	0.0	1.0
+chr1	218192	0.0	1.0	1.0
+chr1	218224	1.0	0.0	1.0
+chr1	218264	1.0	0.0	1.0
+chr1	218283	0.0	1.0	1.0
+chr1	218308	1.0	0.0	1.0
+chr1	218314	0.0	1.0	1.0
+chr1	218327	1.0	0.0	1.0
+chr1	218334	1.0	0.0	1.0
+chr1	218341	1.0	0.0	1.0
+chr1	218375	1.0	0.0	1.0
+chr1	218411	0.0	1.0	1.0
+chr1	218415	1.0	0.0	1.0
+chr1	218439	1.0	0.0	1.0
+chr1	218457	0.0	1.0	1.0
+chr1	218538	0.0	2.0	2.0
+chr1	218570	0.0	1.0	1.0
+chr1	218608	1.0	0.0	1.0
+chr1	218609	0.0	1.0	1.0
+chr1	218614	1.0	0.0	1.0
+chr1	218650	1.0	0.0	1.0
+chr1	218663	1.0	0.0	1.0
+chr1	218670	0.0	1.0	1.0
+chr1	218680	0.0	1.0	1.0
+chr1	218689	0.0	1.0	1.0
+chr1	218748	1.0	0.0	1.0
+chr1	218756	0.0	1.0	1.0
+chr1	218768	1.0	0.0	1.0
+chr1	218772	0.0	1.0	1.0
+chr1	218775	1.0	0.0	1.0
+chr1	218778	0.0	2.0	2.0
+chr1	218788	0.0	1.0	1.0
+chr1	218841	0.0	1.0	1.0
+chr1	218847	0.0	1.0	1.0
+chr1	218853	0.0	1.0	1.0
+chr1	218860	1.0	0.0	1.0
+chr1	218905	1.0	0.0	1.0
+chr1	218922	0.0	1.0	1.0
+chr1	218929	1.0	0.0	1.0
+chr1	218949	0.0	1.0	1.0
+chr1	218974	4.0	0.0	4.0
+chr1	219007	0.0	1.0	1.0
+chr1	219024	1.0	1.0	2.0
+chr1	219026	1.0	0.0	1.0
+chr1	219033	0.0	1.0	1.0
+chr1	219063	1.0	0.0	1.0
+chr1	219078	1.0	0.0	1.0
+chr1	219087	1.0	0.0	1.0
+chr1	219102	0.0	2.0	2.0
+chr1	219118	0.0	1.0	1.0
+chr1	219165	0.0	1.0	1.0
+chr1	219246	1.0	0.0	1.0
+chr1	219251	1.0	0.0	1.0
+chr1	219253	0.0	2.0	2.0
+chr1	219267	0.0	1.0	1.0
+chr1	219268	0.0	1.0	1.0
+chr1	219282	1.0	0.0	1.0
+chr1	219294	1.0	0.0	1.0
+chr1	219401	1.0	0.0	1.0
+chr1	219408	0.0	1.0	1.0
+chr1	219421	0.0	1.0	1.0
+chr1	219426	0.0	1.0	1.0
+chr1	219437	0.0	1.0	1.0
+chr1	219441	1.0	2.0	3.0
+chr1	219442	1.0	0.0	1.0
+chr1	219477	1.0	0.0	1.0
+chr1	219485	2.0	0.0	2.0
+chr1	219547	0.0	1.0	1.0
+chr1	219552	0.0	1.0	1.0
+chr1	219565	0.0	1.0	1.0
+chr1	219589	3.0	0.0	3.0
+chr1	219593	1.0	0.0	1.0
+chr1	219600	0.0	1.0	1.0
+chr1	219606	0.0	1.0	1.0
+chr1	219612	1.0	0.0	1.0
+chr1	219614	0.0	2.0	2.0
+chr1	219615	1.0	0.0	1.0
+chr1	219629	1.0	0.0	1.0
+chr1	219633	0.0	1.0	1.0
+chr1	219645	1.0	0.0	1.0
+chr1	219665	0.0	1.0	1.0
+chr1	219741	0.0	1.0	1.0
+chr1	219742	1.0	0.0	1.0
+chr1	219754	1.0	0.0	1.0
+chr1	219759	0.0	2.0	2.0
+chr1	219764	1.0	0.0	1.0
+chr1	219793	0.0	1.0	1.0
+chr1	219818	0.0	1.0	1.0
+chr1	219838	0.0	1.0	1.0
+chr1	219863	0.0	1.0	1.0
+chr1	219868	1.0	0.0	1.0
+chr1	219907	1.0	0.0	1.0
+chr1	219908	2.0	0.0	2.0
+chr1	219914	0.0	1.0	1.0
+chr1	219926	1.0	0.0	1.0
+chr1	219934	0.0	1.0	1.0
+chr1	219965	0.0	1.0	1.0
+chr1	219973	2.0	0.0	2.0
+chr1	220097	0.0	2.0	2.0
+chr1	220122	1.0	0.0	1.0
+chr1	220133	1.0	0.0	1.0
+chr1	220160	0.0	1.0	1.0
+chr1	220175	1.0	2.0	3.0
+chr1	220209	0.0	1.0	1.0
+chr1	220407	0.0	1.0	1.0
+chr1	220454	1.0	0.0	1.0
+chr1	220505	2.0	0.0	2.0
+chr1	220512	0.0	1.0	1.0
+chr1	220513	1.0	0.0	1.0
+chr1	220516	0.0	1.0	1.0
+chr1	220529	1.0	0.0	1.0
+chr1	220532	0.0	3.0	3.0
+chr1	220535	0.0	1.0	1.0
+chr1	220551	0.0	3.0	3.0
+chr1	220567	1.0	0.0	1.0
+chr1	220578	0.0	1.0	1.0
+chr1	220589	1.0	0.0	1.0
+chr1	220608	0.0	1.0	1.0
+chr1	220731	1.0	0.0	1.0
+chr1	220736	1.0	0.0	1.0
+chr1	220739	0.0	2.0	2.0
+chr1	220749	0.0	1.0	1.0
+chr1	220896	1.0	0.0	1.0
+chr1	220912	0.0	1.0	1.0
+chr1	220913	0.0	1.0	1.0
+chr1	220915	1.0	0.0	1.0
+chr1	220922	2.0	0.0	2.0
+chr1	220923	0.0	1.0	1.0
+chr1	221060	1.0	0.0	1.0
+chr1	221079	1.0	0.0	1.0
+chr1	221087	1.0	0.0	1.0
+chr1	221098	0.0	1.0	1.0
+chr1	221109	1.0	0.0	1.0
+chr1	221121	0.0	1.0	1.0
+chr1	221123	0.0	1.0	1.0
+chr1	221125	0.0	1.0	1.0
+chr1	221127	0.0	1.0	1.0
+chr1	221129	2.0	0.0	2.0
+chr1	221134	2.0	0.0	2.0
+chr1	221135	1.0	0.0	1.0
+chr1	221152	1.0	0.0	1.0
+chr1	221164	1.0	1.0	2.0
+chr1	221166	1.0	0.0	1.0
+chr1	221186	1.0	0.0	1.0
+chr1	221188	0.0	1.0	1.0
+chr1	221200	1.0	0.0	1.0
+chr1	221206	0.0	1.0	1.0
+chr1	221216	1.0	0.0	1.0
+chr1	221300	1.0	0.0	1.0
+chr1	221329	1.0	0.0	1.0
+chr1	221349	2.0	0.0	2.0
+chr1	221397	1.0	0.0	1.0
+chr1	221409	1.0	0.0	1.0
+chr1	221420	0.0	3.0	3.0
+chr1	221591	1.0	0.0	1.0
+chr1	221606	0.0	1.0	1.0
+chr1	221612	1.0	0.0	1.0
+chr1	221626	1.0	0.0	1.0
+chr1	221640	2.0	0.0	2.0
+chr1	221711	0.0	1.0	1.0
+chr1	221725	1.0	0.0	1.0
+chr1	221757	1.0	0.0	1.0
+chr1	221772	1.0	0.0	1.0
+chr1	221817	0.0	1.0	1.0
+chr1	221822	0.0	1.0	1.0
+chr1	221849	1.0	0.0	1.0
+chr1	221996	1.0	0.0	1.0
+chr1	222002	0.0	2.0	2.0
+chr1	222163	0.0	2.0	2.0
+chr1	222253	1.0	0.0	1.0
+chr1	222300	2.0	0.0	2.0
+chr1	222310	1.0	0.0	1.0
+chr1	222454	1.0	0.0	1.0
+chr1	222470	1.0	0.0	1.0
+chr1	222471	1.0	0.0	1.0
+chr1	222484	0.0	1.0	1.0
+chr1	222496	1.0	0.0	1.0
+chr1	222500	0.0	1.0	1.0
+chr1	222523	1.0	0.0	1.0
+chr1	222650	0.0	1.0	1.0
+chr1	222655	2.0	0.0	2.0
+chr1	222656	1.0	0.0	1.0
+chr1	222681	1.0	0.0	1.0
+chr1	222690	1.0	1.0	2.0
+chr1	222726	1.0	0.0	1.0
+chr1	222749	1.0	0.0	1.0
+chr1	222751	1.0	0.0	1.0
+chr1	222772	0.0	1.0	1.0
+chr1	222786	1.0	0.0	1.0
+chr1	222793	0.0	1.0	1.0
+chr1	222805	2.0	0.0	2.0
+chr1	222806	0.0	1.0	1.0
+chr1	222807	0.0	1.0	1.0
+chr1	222808	2.0	0.0	2.0
+chr1	222812	3.0	0.0	3.0
+chr1	222816	0.0	2.0	2.0
+chr1	222819	1.0	0.0	1.0
+chr1	222820	1.0	4.0	5.0
+chr1	222821	0.0	1.0	1.0
+chr1	222822	0.0	2.0	2.0
+chr1	222823	2.0	1.0	3.0
+chr1	222826	0.0	1.0	1.0
+chr1	222838	0.0	1.0	1.0
+chr1	222839	0.0	2.0	2.0
+chr1	222840	2.0	0.0	2.0
+chr1	222842	1.0	0.0	1.0
+chr1	222844	1.0	0.0	1.0
+chr1	222847	3.0	0.0	3.0
+chr1	222848	2.0	0.0	2.0
+chr1	222849	0.0	1.0	1.0
+chr1	222853	0.0	5.0	5.0
+chr1	222855	1.0	0.0	1.0
+chr1	222856	1.0	0.0	1.0
+chr1	222887	0.0	1.0	1.0
+chr1	222977	1.0	0.0	1.0
+chr1	223011	2.0	0.0	2.0
+chr1	223013	1.0	0.0	1.0
+chr1	223022	0.0	4.0	4.0
+chr1	223023	0.0	1.0	1.0
+chr1	223026	1.0	0.0	1.0
+chr1	223031	0.0	1.0	1.0
+chr1	223039	0.0	1.0	1.0
+chr1	223043	0.0	1.0	1.0
+chr1	223044	1.0	0.0	1.0
+chr1	223048	2.0	0.0	2.0
+chr1	223070	1.0	0.0	1.0
+chr1	223257	0.0	1.0	1.0
+chr1	223288	0.0	1.0	1.0
+chr1	223292	0.0	1.0	1.0
+chr1	223307	0.0	2.0	2.0
+chr1	223313	1.0	0.0	1.0
+chr1	223314	2.0	0.0	2.0
+chr1	223315	1.0	3.0	4.0
+chr1	223316	1.0	1.0	2.0
+chr1	223317	0.0	1.0	1.0
+chr1	223321	7.0	0.0	7.0
+chr1	223322	11.0	2.0	13.0
+chr1	223323	0.0	1.0	1.0
+chr1	223324	3.0	0.0	3.0
+chr1	223325	0.0	4.0	4.0
+chr1	223326	2.0	0.0	2.0
+chr1	223327	3.0	0.0	3.0
+chr1	223328	0.0	7.0	7.0
+chr1	223329	0.0	4.0	4.0
+chr1	223330	2.0	0.0	2.0
+chr1	223332	5.0	0.0	5.0
+chr1	223334	1.0	7.0	8.0
+chr1	223336	0.0	6.0	6.0
+chr1	223337	0.0	3.0	3.0
+chr1	223338	1.0	0.0	1.0
+chr1	223346	1.0	0.0	1.0
+chr1	223348	1.0	0.0	1.0
+chr1	223349	0.0	1.0	1.0
+chr1	223377	2.0	0.0	2.0
+chr1	223518	3.0	0.0	3.0
+chr1	223650	2.0	0.0	2.0
+chr1	223661	0.0	1.0	1.0
+chr1	223664	1.0	0.0	1.0
+chr1	223674	0.0	1.0	1.0
+chr1	223675	1.0	0.0	1.0
+chr1	223859	1.0	0.0	1.0
+chr1	223863	0.0	1.0	1.0
+chr1	223901	1.0	0.0	1.0
+chr1	223905	1.0	1.0	2.0
+chr1	223907	1.0	0.0	1.0
+chr1	223909	0.0	1.0	1.0
+chr1	223913	0.0	2.0	2.0
+chr1	223914	3.0	3.0	6.0
+chr1	223925	1.0	0.0	1.0
+chr1	223935	1.0	0.0	1.0
+chr1	223944	0.0	1.0	1.0
+chr1	224056	1.0	0.0	1.0
+chr1	224066	1.0	0.0	1.0
+chr1	224072	0.0	1.0	1.0
+chr1	224076	0.0	1.0	1.0
+chr1	224078	0.0	1.0	1.0
+chr1	224079	0.0	1.0	1.0
+chr1	224080	0.0	1.0	1.0
+chr1	224084	0.0	1.0	1.0
+chr1	224086	7.0	0.0	7.0
+chr1	224088	0.0	1.0	1.0
+chr1	224103	2.0	0.0	2.0
+chr1	224104	1.0	0.0	1.0
+chr1	224149	0.0	1.0	1.0
+chr1	224203	0.0	1.0	1.0
+chr1	224228	0.0	1.0	1.0
+chr1	224233	0.0	1.0	1.0
+chr1	224235	1.0	0.0	1.0
+chr1	224237	1.0	1.0	2.0
+chr1	224241	0.0	1.0	1.0
+chr1	224243	0.0	2.0	2.0
+chr1	224244	2.0	2.0	4.0
+chr1	224245	0.0	1.0	1.0
+chr1	224247	1.0	0.0	1.0
+chr1	224255	2.0	0.0	2.0
+chr1	224259	0.0	1.0	1.0
+chr1	224261	0.0	2.0	2.0
+chr1	224268	0.0	2.0	2.0
+chr1	224269	1.0	0.0	1.0
+chr1	224276	0.0	1.0	1.0
+chr1	224286	0.0	1.0	1.0
+chr1	224294	1.0	0.0	1.0
+chr1	224315	1.0	0.0	1.0
+chr1	224403	0.0	1.0	1.0
+chr1	224409	0.0	1.0	1.0
+chr1	224416	2.0	0.0	2.0
+chr1	224417	1.0	0.0	1.0
+chr1	224432	0.0	2.0	2.0
+chr1	224437	2.0	0.0	2.0
+chr1	224438	0.0	1.0	1.0
+chr1	224477	0.0	1.0	1.0
+chr1	224502	1.0	0.0	1.0
+chr1	224503	0.0	1.0	1.0
+chr1	224513	0.0	1.0	1.0
+chr1	224521	0.0	1.0	1.0
+chr1	224574	0.0	1.0	1.0
+chr1	224575	1.0	0.0	1.0
+chr1	224589	1.0	0.0	1.0
+chr1	224590	0.0	1.0	1.0
+chr1	224591	0.0	1.0	1.0
+chr1	224595	1.0	0.0	1.0
+chr1	224608	0.0	2.0	2.0
+chr1	224625	0.0	1.0	1.0
+chr1	224649	0.0	1.0	1.0
+chr1	224666	0.0	1.0	1.0
+chr1	224676	1.0	0.0	1.0
+chr1	224692	1.0	1.0	2.0
+chr1	224704	1.0	0.0	1.0
+chr1	224758	1.0	0.0	1.0
+chr1	224765	0.0	1.0	1.0
+chr1	224782	3.0	0.0	3.0
+chr1	224909	2.0	0.0	2.0
+chr1	224918	0.0	1.0	1.0
+chr1	224923	1.0	0.0	1.0
+chr1	224926	0.0	1.0	1.0
+chr1	224927	0.0	1.0	1.0
+chr1	224934	2.0	0.0	2.0
+chr1	224943	1.0	0.0	1.0
+chr1	224948	0.0	1.0	1.0
+chr1	224951	1.0	0.0	1.0
+chr1	224953	1.0	0.0	1.0
+chr1	225000	1.0	0.0	1.0
+chr1	225137	0.0	3.0	3.0
+chr1	225168	1.0	0.0	1.0
+chr1	225177	1.0	0.0	1.0
+chr1	225178	0.0	1.0	1.0
+chr1	225179	0.0	2.0	2.0
+chr1	225185	1.0	0.0	1.0
+chr1	225187	0.0	3.0	3.0
+chr1	225188	0.0	1.0	1.0
+chr1	225190	0.0	1.0	1.0
+chr1	225192	1.0	0.0	1.0
+chr1	225193	2.0	0.0	2.0
+chr1	225194	0.0	1.0	1.0
+chr1	225195	0.0	2.0	2.0
+chr1	225198	1.0	1.0	2.0
+chr1	225203	2.0	2.0	4.0
+chr1	225205	1.0	0.0	1.0
+chr1	225208	1.0	0.0	1.0
+chr1	225224	0.0	1.0	1.0
+chr1	225225	0.0	1.0	1.0
+chr1	225327	1.0	0.0	1.0
+chr1	225333	1.0	0.0	1.0
+chr1	225338	0.0	2.0	2.0
+chr1	225350	3.0	0.0	3.0
+chr1	225357	1.0	0.0	1.0
+chr1	225358	1.0	0.0	1.0
+chr1	225365	0.0	1.0	1.0
+chr1	225378	0.0	1.0	1.0
+chr1	225382	0.0	2.0	2.0
+chr1	225395	0.0	1.0	1.0
+chr1	225413	1.0	0.0	1.0
+chr1	225422	0.0	1.0	1.0
+chr1	225485	0.0	1.0	1.0
+chr1	225528	2.0	0.0	2.0
+chr1	225544	0.0	2.0	2.0
+chr1	225551	0.0	1.0	1.0
+chr1	225553	1.0	0.0	1.0
+chr1	225710	1.0	0.0	1.0
+chr1	225714	0.0	2.0	2.0
+chr1	225727	1.0	0.0	1.0
+chr1	225759	1.0	0.0	1.0
+chr1	225874	0.0	1.0	1.0
+chr1	225888	1.0	0.0	1.0
+chr1	225897	1.0	0.0	1.0
+chr1	226163	1.0	0.0	1.0
+chr1	226333	0.0	1.0	1.0
+chr1	226448	1.0	0.0	1.0
+chr1	226589	2.0	0.0	2.0
+chr1	226599	0.0	1.0	1.0
+chr1	226609	1.0	0.0	1.0
+chr1	226620	0.0	1.0	1.0
+chr1	226628	0.0	1.0	1.0
+chr1	226636	0.0	2.0	2.0
+chr1	226637	1.0	0.0	1.0
+chr1	226654	0.0	1.0	1.0
+chr1	226710	0.0	1.0	1.0
+chr1	226729	0.0	1.0	1.0
+chr1	226750	1.0	0.0	1.0
+chr1	226769	1.0	0.0	1.0
+chr1	226775	0.0	1.0	1.0
+chr1	226777	0.0	6.0	6.0
+chr1	226778	3.0	0.0	3.0
+chr1	226779	2.0	0.0	2.0
+chr1	226783	0.0	8.0	8.0
+chr1	226784	3.0	0.0	3.0
+chr1	226785	2.0	0.0	2.0
+chr1	226786	0.0	1.0	1.0
+chr1	226787	1.0	0.0	1.0
+chr1	226795	3.0	0.0	3.0
+chr1	226803	1.0	0.0	1.0
+chr1	226814	1.0	0.0	1.0
+chr1	226993	1.0	0.0	1.0
+chr1	227043	1.0	0.0	1.0
+chr1	227052	2.0	0.0	2.0
+chr1	227054	0.0	1.0	1.0
+chr1	227070	0.0	1.0	1.0
+chr1	227099	0.0	1.0	1.0
+chr1	227197	0.0	1.0	1.0
+chr1	227198	2.0	0.0	2.0
+chr1	227199	0.0	1.0	1.0
+chr1	227203	0.0	1.0	1.0
+chr1	227204	0.0	1.0	1.0
+chr1	227206	0.0	2.0	2.0
+chr1	227208	2.0	0.0	2.0
+chr1	227221	2.0	0.0	2.0
+chr1	227222	3.0	0.0	3.0
+chr1	227223	2.0	3.0	5.0
+chr1	227225	0.0	1.0	1.0
+chr1	227226	0.0	1.0	1.0
+chr1	227229	1.0	0.0	1.0
+chr1	227230	2.0	0.0	2.0
+chr1	227232	1.0	0.0	1.0
+chr1	227233	2.0	0.0	2.0
+chr1	227236	0.0	2.0	2.0
+chr1	227245	0.0	1.0	1.0
+chr1	227246	1.0	0.0	1.0
+chr1	227248	0.0	1.0	1.0
+chr1	227251	1.0	0.0	1.0
+chr1	227261	1.0	0.0	1.0
+chr1	227265	1.0	0.0	1.0
+chr1	227279	0.0	1.0	1.0
+chr1	227487	0.0	1.0	1.0
+chr1	227496	0.0	1.0	1.0
+chr1	227504	0.0	2.0	2.0
+chr1	227506	0.0	1.0	1.0
+chr1	227514	1.0	0.0	1.0
+chr1	227525	0.0	2.0	2.0
+chr1	227526	0.0	1.0	1.0
+chr1	227533	1.0	0.0	1.0
+chr1	227537	0.0	1.0	1.0
+chr1	227541	1.0	0.0	1.0
+chr1	227713	0.0	1.0	1.0
+chr1	227745	1.0	0.0	1.0
+chr1	227776	0.0	1.0	1.0
+chr1	227802	1.0	0.0	1.0
+chr1	227873	1.0	0.0	1.0
+chr1	228015	1.0	0.0	1.0
+chr1	228071	1.0	0.0	1.0
+chr1	228089	1.0	0.0	1.0
+chr1	228124	0.0	1.0	1.0
+chr1	228335	0.0	2.0	2.0
+chr1	228346	0.0	2.0	2.0
+chr1	228419	1.0	0.0	1.0
+chr1	228481	1.0	0.0	1.0
+chr1	228624	0.0	1.0	1.0
+chr1	228671	1.0	0.0	1.0
+chr1	228871	0.0	1.0	1.0
+chr1	228876	1.0	0.0	1.0
+chr1	228987	1.0	0.0	1.0
+chr1	228997	0.0	1.0	1.0
+chr1	229094	0.0	1.0	1.0
+chr1	229159	0.0	1.0	1.0
+chr1	229603	0.0	1.0	1.0
+chr1	229916	2.0	0.0	2.0
+chr2	79	0.0	1.0	1.0
+chr2	88	1.0	0.0	1.0
+chr2	144	1.0	0.0	1.0
+chr2	146	1.0	1.0	2.0
+chr2	168	0.0	1.0	1.0
+chr2	170	0.0	1.0	1.0
+chr2	176	2.0	2.0	4.0
+chr2	177	4.0	1.0	5.0
+chr2	182	1.0	0.0	1.0
+chr2	199	0.0	1.0	1.0
+chr2	200	5.0	0.0	5.0
+chr2	201	1.0	0.0	1.0
+chr2	204	4.0	0.0	4.0
+chr2	207	0.0	3.0	3.0
+chr2	211	0.0	1.0	1.0
+chr2	213	0.0	1.0	1.0
+chr2	215	2.0	0.0	2.0
+chr2	216	0.0	1.0	1.0
+chr2	219	0.0	1.0	1.0
+chr2	222	2.0	0.0	2.0
+chr2	230	0.0	1.0	1.0
+chr2	234	0.0	1.0	1.0
+chr2	236	0.0	7.0	7.0
+chr2	237	1.0	1.0	2.0
+chr2	240	0.0	4.0	4.0
+chr2	244	0.0	2.0	2.0
+chr2	247	3.0	0.0	3.0
+chr2	258	3.0	0.0	3.0
+chr2	264	0.0	2.0	2.0
+chr2	281	0.0	3.0	3.0
+chr2	308	1.0	0.0	1.0
+chr2	335	0.0	1.0	1.0
+chr2	339	1.0	0.0	1.0
+chr2	340	3.0	0.0	3.0
+chr2	355	1.0	0.0	1.0
+chr2	358	0.0	1.0	1.0
+chr2	364	0.0	1.0	1.0
+chr2	370	2.0	0.0	2.0
+chr2	373	1.0	0.0	1.0
+chr2	375	0.0	1.0	1.0
+chr2	382	0.0	1.0	1.0
+chr2	390	0.0	1.0	1.0
+chr2	391	0.0	1.0	1.0
+chr2	397	1.0	0.0	1.0
+chr2	398	1.0	0.0	1.0
+chr2	399	5.0	3.0	8.0
+chr2	402	6.0	0.0	6.0
+chr2	403	2.0	0.0	2.0
+chr2	404	3.0	0.0	3.0
+chr2	407	2.0	0.0	2.0
+chr2	409	0.0	4.0	4.0
+chr2	410	0.0	3.0	3.0
+chr2	411	1.0	0.0	1.0
+chr2	413	1.0	0.0	1.0
+chr2	414	0.0	2.0	2.0
+chr2	415	0.0	1.0	1.0
+chr2	416	0.0	2.0	2.0
+chr2	417	1.0	2.0	3.0
+chr2	419	1.0	0.0	1.0
+chr2	421	0.0	1.0	1.0
+chr2	424	1.0	1.0	2.0
+chr2	427	2.0	1.0	3.0
+chr2	428	5.0	0.0	5.0
+chr2	429	2.0	0.0	2.0
+chr2	430	3.0	0.0	3.0
+chr2	431	0.0	1.0	1.0
+chr2	432	0.0	2.0	2.0
+chr2	437	1.0	1.0	2.0
+chr2	438	1.0	0.0	1.0
+chr2	439	1.0	0.0	1.0
+chr2	440	1.0	0.0	1.0
+chr2	445	1.0	0.0	1.0
+chr2	448	0.0	1.0	1.0
+chr2	449	1.0	0.0	1.0
+chr2	456	0.0	3.0	3.0
+chr2	457	0.0	1.0	1.0
+chr2	458	0.0	1.0	1.0
+chr2	468	1.0	0.0	1.0
+chr2	469	0.0	1.0	1.0
+chr2	472	0.0	1.0	1.0
+chr2	479	0.0	1.0	1.0
+chr2	493	0.0	1.0	1.0
+chr2	506	2.0	0.0	2.0
+chr2	516	0.0	1.0	1.0
+chr2	517	0.0	1.0	1.0
+chr2	529	1.0	0.0	1.0
+chr2	535	0.0	1.0	1.0
+chr2	545	0.0	2.0	2.0
+chr2	546	0.0	2.0	2.0
+chr2	547	0.0	1.0	1.0
+chr2	548	1.0	0.0	1.0
+chr2	558	1.0	0.0	1.0
+chr2	564	2.0	0.0	2.0
+chr2	565	0.0	1.0	1.0
+chr2	567	1.0	0.0	1.0
+chr2	584	0.0	1.0	1.0
+chr2	587	1.0	0.0	1.0
+chr2	589	2.0	0.0	2.0
+chr2	592	2.0	0.0	2.0
+chr2	595	1.0	1.0	2.0
+chr2	600	0.0	1.0	1.0
+chr2	601	0.0	2.0	2.0
+chr2	602	0.0	2.0	2.0
+chr2	604	1.0	0.0	1.0
+chr2	610	1.0	0.0	1.0
+chr2	611	1.0	0.0	1.0
+chr2	613	0.0	1.0	1.0
+chr2	615	1.0	0.0	1.0
+chr2	621	0.0	1.0	1.0
+chr2	628	1.0	0.0	1.0
+chr2	630	1.0	0.0	1.0
+chr2	631	0.0	1.0	1.0
+chr2	640	0.0	1.0	1.0
+chr2	643	1.0	0.0	1.0
+chr2	648	0.0	1.0	1.0
+chr2	649	0.0	1.0	1.0
+chr2	659	1.0	0.0	1.0
+chr2	673	0.0	1.0	1.0
+chr2	683	1.0	0.0	1.0
+chr2	686	0.0	2.0	2.0
+chr2	687	1.0	0.0	1.0
+chr2	693	0.0	2.0	2.0
+chr2	696	1.0	0.0	1.0
+chr2	704	0.0	1.0	1.0
+chr2	716	0.0	1.0	1.0
+chr2	718	0.0	1.0	1.0
+chr2	727	0.0	1.0	1.0
+chr2	744	1.0	0.0	1.0
+chr2	748	1.0	0.0	1.0
+chr2	749	1.0	0.0	1.0
+chr2	754	0.0	2.0	2.0
+chr2	756	0.0	4.0	4.0
+chr2	760	0.0	1.0	1.0
+chr2	761	0.0	1.0	1.0
+chr2	765	0.0	1.0	1.0
+chr2	767	1.0	0.0	1.0
+chr2	779	0.0	1.0	1.0
+chr2	782	1.0	1.0	2.0
+chr2	803	2.0	0.0	2.0
+chr2	826	1.0	0.0	1.0
+chr2	842	2.0	0.0	2.0
+chr2	852	1.0	0.0	1.0
+chr2	856	0.0	1.0	1.0
+chr2	862	0.0	1.0	1.0
+chr2	863	0.0	1.0	1.0
+chr2	873	1.0	0.0	1.0
+chr2	879	0.0	1.0	1.0
+chr2	881	0.0	1.0	1.0
+chr2	909	0.0	1.0	1.0
+chr2	931	0.0	1.0	1.0
+chr2	939	1.0	0.0	1.0
+chr2	940	2.0	0.0	2.0
+chr2	941	0.0	1.0	1.0
+chr2	951	0.0	1.0	1.0
+chr2	953	0.0	1.0	1.0
+chr2	954	1.0	0.0	1.0
+chr2	956	0.0	2.0	2.0
+chr2	962	1.0	0.0	1.0
+chr2	982	0.0	1.0	1.0
+chr2	984	0.0	1.0	1.0
+chr2	1006	0.0	1.0	1.0
+chr2	1010	0.0	1.0	1.0
+chr2	1023	1.0	0.0	1.0
+chr2	1030	0.0	1.0	1.0
+chr2	1039	0.0	1.0	1.0
+chr2	1048	1.0	0.0	1.0
+chr2	1075	1.0	0.0	1.0
+chr2	1088	1.0	0.0	1.0
+chr2	1090	1.0	0.0	1.0
+chr2	1103	0.0	1.0	1.0
+chr2	1112	1.0	0.0	1.0
+chr2	1113	0.0	2.0	2.0
+chr2	1123	0.0	1.0	1.0
+chr2	1139	0.0	1.0	1.0
+chr2	1147	0.0	1.0	1.0
+chr2	1174	0.0	3.0	3.0
+chr2	1177	0.0	2.0	2.0
+chr2	1189	1.0	0.0	1.0
+chr2	1206	0.0	1.0	1.0
+chr2	1223	0.0	1.0	1.0
+chr2	1247	1.0	0.0	1.0
+chr2	1262	0.0	1.0	1.0
+chr2	1275	0.0	1.0	1.0
+chr2	1306	0.0	1.0	1.0
+chr2	1317	0.0	1.0	1.0
+chr2	1358	1.0	0.0	1.0
+chr2	1373	1.0	0.0	1.0
+chr2	1386	0.0	1.0	1.0
+chr2	1406	1.0	0.0	1.0
+chr2	1407	0.0	1.0	1.0
+chr2	1409	1.0	0.0	1.0
+chr2	1410	1.0	0.0	1.0
+chr2	1418	0.0	1.0	1.0
+chr2	1421	0.0	1.0	1.0
+chr2	1446	0.0	1.0	1.0
+chr2	1449	1.0	0.0	1.0
+chr2	1455	1.0	0.0	1.0
+chr2	1473	0.0	1.0	1.0
+chr2	1483	1.0	0.0	1.0
+chr2	1489	1.0	0.0	1.0
+chr2	1503	0.0	1.0	1.0
+chr2	1505	0.0	3.0	3.0
+chr2	1509	0.0	3.0	3.0
+chr2	1511	0.0	2.0	2.0
+chr2	1512	1.0	0.0	1.0
+chr2	1514	0.0	1.0	1.0
+chr2	1516	0.0	2.0	2.0
+chr2	1517	0.0	2.0	2.0
+chr2	1520	0.0	1.0	1.0
+chr2	1529	0.0	1.0	1.0
+chr2	1535	0.0	1.0	1.0
+chr2	1537	1.0	0.0	1.0
+chr2	1541	0.0	1.0	1.0
+chr2	1545	0.0	1.0	1.0
+chr2	1547	0.0	2.0	2.0
+chr2	1552	0.0	2.0	2.0
+chr2	1553	0.0	2.0	2.0
+chr2	1556	0.0	1.0	1.0
+chr2	1559	1.0	0.0	1.0
+chr2	1563	0.0	2.0	2.0
+chr2	1565	0.0	1.0	1.0
+chr2	1568	1.0	1.0	2.0
+chr2	1570	1.0	0.0	1.0
+chr2	1571	3.0	0.0	3.0
+chr2	1577	1.0	2.0	3.0
+chr2	1583	0.0	1.0	1.0
+chr2	1585	2.0	0.0	2.0
+chr2	1586	0.0	1.0	1.0
+chr2	1588	1.0	0.0	1.0
+chr2	1604	1.0	0.0	1.0
+chr2	1607	2.0	0.0	2.0
+chr2	1611	0.0	1.0	1.0
+chr2	1613	1.0	1.0	2.0
+chr2	1617	0.0	2.0	2.0
+chr2	1618	0.0	1.0	1.0
+chr2	1619	0.0	1.0	1.0
+chr2	1621	2.0	0.0	2.0
+chr2	1625	0.0	1.0	1.0
+chr2	1628	0.0	1.0	1.0
+chr2	1635	0.0	1.0	1.0
+chr2	1637	0.0	1.0	1.0
+chr2	1640	1.0	0.0	1.0
+chr2	1643	1.0	1.0	2.0
+chr2	1644	2.0	0.0	2.0
+chr2	1649	2.0	1.0	3.0
+chr2	1652	1.0	0.0	1.0
+chr2	1653	0.0	1.0	1.0
+chr2	1655	0.0	2.0	2.0
+chr2	1657	1.0	0.0	1.0
+chr2	1658	1.0	1.0	2.0
+chr2	1660	0.0	2.0	2.0
+chr2	1661	0.0	1.0	1.0
+chr2	1663	1.0	0.0	1.0
+chr2	1680	2.0	0.0	2.0
+chr2	1685	0.0	2.0	2.0
+chr2	1689	0.0	1.0	1.0
+chr2	1690	0.0	1.0	1.0
+chr2	1695	0.0	3.0	3.0
+chr2	1699	1.0	0.0	1.0
+chr2	1704	0.0	2.0	2.0
+chr2	1712	0.0	1.0	1.0
+chr2	1714	1.0	0.0	1.0
+chr2	1715	1.0	0.0	1.0
+chr2	1721	0.0	1.0	1.0
+chr2	1725	0.0	1.0	1.0
+chr2	1727	0.0	2.0	2.0
+chr2	1730	0.0	3.0	3.0
+chr2	1738	0.0	1.0	1.0
+chr2	1739	2.0	0.0	2.0
+chr2	1748	1.0	0.0	1.0
+chr2	1755	0.0	1.0	1.0
+chr2	1757	0.0	2.0	2.0
+chr2	1760	2.0	0.0	2.0
+chr2	1761	1.0	3.0	4.0
+chr2	1763	0.0	2.0	2.0
+chr2	1766	0.0	3.0	3.0
+chr2	1774	0.0	1.0	1.0
+chr2	1781	0.0	1.0	1.0
+chr2	1782	1.0	0.0	1.0
+chr2	1785	1.0	0.0	1.0
+chr2	1788	2.0	0.0	2.0
+chr2	1791	0.0	1.0	1.0
+chr2	1793	2.0	2.0	4.0
+chr2	1796	1.0	0.0	1.0
+chr2	1797	0.0	2.0	2.0
+chr2	1799	0.0	2.0	2.0
+chr2	1801	1.0	0.0	1.0
+chr2	1802	1.0	2.0	3.0
+chr2	1807	2.0	0.0	2.0
+chr2	1810	0.0	1.0	1.0
+chr2	1818	1.0	0.0	1.0
+chr2	1820	1.0	0.0	1.0
+chr2	1823	1.0	0.0	1.0
+chr2	1824	1.0	0.0	1.0
+chr2	1829	2.0	1.0	3.0
+chr2	1832	1.0	0.0	1.0
+chr2	1833	0.0	1.0	1.0
+chr2	1834	0.0	1.0	1.0
+chr2	1835	0.0	1.0	1.0
+chr2	1839	0.0	2.0	2.0
+chr2	1840	2.0	0.0	2.0
+chr2	1845	1.0	0.0	1.0
+chr2	1851	0.0	1.0	1.0
+chr2	1856	1.0	0.0	1.0
+chr2	1859	3.0	0.0	3.0
+chr2	1868	1.0	0.0	1.0
+chr2	1869	0.0	2.0	2.0
+chr2	1871	0.0	1.0	1.0
+chr2	1874	0.0	3.0	3.0
+chr2	1894	1.0	0.0	1.0
+chr2	1895	2.0	0.0	2.0
+chr2	1901	0.0	1.0	1.0
+chr2	1905	0.0	1.0	1.0
+chr2	1906	0.0	1.0	1.0
+chr2	1911	0.0	2.0	2.0
+chr2	1916	0.0	1.0	1.0
+chr2	1923	0.0	4.0	4.0
+chr2	1928	1.0	0.0	1.0
+chr2	1929	1.0	0.0	1.0
+chr2	1930	1.0	0.0	1.0
+chr2	1931	2.0	0.0	2.0
+chr2	1932	2.0	0.0	2.0
+chr2	1940	1.0	0.0	1.0
+chr2	1964	0.0	1.0	1.0
+chr2	1965	1.0	0.0	1.0
+chr2	1966	1.0	0.0	1.0
+chr2	1967	1.0	0.0	1.0
+chr2	1973	0.0	2.0	2.0
+chr2	1979	0.0	2.0	2.0
+chr2	1982	0.0	3.0	3.0
+chr2	2005	1.0	0.0	1.0
+chr2	2013	0.0	1.0	1.0
+chr2	2019	0.0	3.0	3.0
+chr2	2024	0.0	1.0	1.0
+chr2	2033	0.0	1.0	1.0
+chr2	2037	1.0	0.0	1.0
+chr2	2039	1.0	0.0	1.0
+chr2	2040	2.0	0.0	2.0
+chr2	2043	0.0	1.0	1.0
+chr2	2045	1.0	6.0	7.0
+chr2	2051	0.0	2.0	2.0
+chr2	2053	1.0	0.0	1.0
+chr2	2054	0.0	3.0	3.0
+chr2	2062	0.0	1.0	1.0
+chr2	2077	1.0	0.0	1.0
+chr2	2083	1.0	0.0	1.0
+chr2	2085	0.0	1.0	1.0
+chr2	2086	0.0	1.0	1.0
+chr2	2089	1.0	0.0	1.0
+chr2	2091	0.0	1.0	1.0
+chr2	2096	0.0	1.0	1.0
+chr2	2103	0.0	2.0	2.0
+chr2	2105	0.0	1.0	1.0
+chr2	2108	1.0	1.0	2.0
+chr2	2110	1.0	0.0	1.0
+chr2	2111	2.0	0.0	2.0
+chr2	2115	0.0	1.0	1.0
+chr2	2117	0.0	6.0	6.0
+chr2	2121	1.0	0.0	1.0
+chr2	2123	0.0	2.0	2.0
+chr2	2126	0.0	3.0	3.0
+chr2	2134	0.0	1.0	1.0
+chr2	2146	1.0	0.0	1.0
+chr2	2147	1.0	0.0	1.0
+chr2	2156	1.0	0.0	1.0
+chr2	2157	1.0	1.0	2.0
+chr2	2158	0.0	1.0	1.0
+chr2	2161	2.0	0.0	2.0
+chr2	2163	0.0	1.0	1.0
+chr2	2168	0.0	1.0	1.0
+chr2	2175	0.0	2.0	2.0
+chr2	2177	0.0	1.0	1.0
+chr2	2180	1.0	1.0	2.0
+chr2	2182	1.0	0.0	1.0
+chr2	2183	2.0	0.0	2.0
+chr2	2187	0.0	1.0	1.0
+chr2	2189	0.0	3.0	3.0
+chr2	2193	1.0	2.0	3.0
+chr2	2194	0.0	2.0	2.0
+chr2	2195	0.0	1.0	1.0
+chr2	2200	0.0	2.0	2.0
+chr2	2201	0.0	1.0	1.0
+chr2	2218	1.0	0.0	1.0
+chr2	2219	1.0	0.0	1.0
+chr2	2225	0.0	2.0	2.0
+chr2	2229	1.0	0.0	1.0
+chr2	2231	0.0	2.0	2.0
+chr2	2233	2.0	0.0	2.0
+chr2	2234	0.0	3.0	3.0
+chr2	2249	0.0	1.0	1.0
+chr2	2252	1.0	0.0	1.0
+chr2	2254	1.0	0.0	1.0
+chr2	2255	2.0	0.0	2.0
+chr2	2259	0.0	1.0	1.0
+chr2	2261	0.0	3.0	3.0
+chr2	2267	0.0	2.0	2.0
+chr2	2270	0.0	2.0	2.0
+chr2	2278	0.0	1.0	1.0
+chr2	2285	0.0	1.0	1.0
+chr2	2289	1.0	0.0	1.0
+chr2	2290	1.0	0.0	1.0
+chr2	2291	1.0	0.0	1.0
+chr2	2292	2.0	0.0	2.0
+chr2	2295	0.0	1.0	1.0
+chr2	2297	2.0	2.0	4.0
+chr2	2300	1.0	0.0	1.0
+chr2	2301	0.0	2.0	2.0
+chr2	2302	0.0	1.0	1.0
+chr2	2303	0.0	1.0	1.0
+chr2	2305	1.0	0.0	1.0
+chr2	2306	1.0	0.0	1.0
+chr2	2307	0.0	2.0	2.0
+chr2	2308	2.0	0.0	2.0
+chr2	2322	1.0	0.0	1.0
+chr2	2327	1.0	0.0	1.0
+chr2	2328	1.0	0.0	1.0
+chr2	2333	2.0	0.0	2.0
+chr2	2336	1.0	0.0	1.0
+chr2	2341	1.0	0.0	1.0
+chr2	2342	1.0	0.0	1.0
+chr2	2347	2.0	0.0	2.0
+chr2	2352	0.0	1.0	1.0
+chr2	2360	1.0	0.0	1.0
+chr2	2363	2.0	0.0	2.0
+chr2	2389	0.0	1.0	1.0
+chr2	2396	1.0	0.0	1.0
+chr2	2428	1.0	0.0	1.0
+chr2	2439	0.0	1.0	1.0
+chr2	2449	0.0	1.0	1.0
+chr2	2450	0.0	1.0	1.0
+chr2	2453	0.0	1.0	1.0
+chr2	2464	0.0	1.0	1.0
+chr2	2468	1.0	0.0	1.0
+chr2	2485	3.0	1.0	4.0
+chr2	2486	1.0	0.0	1.0
+chr2	2498	3.0	0.0	3.0
+chr2	2500	1.0	0.0	1.0
+chr2	2504	1.0	0.0	1.0
+chr2	2533	1.0	0.0	1.0
+chr2	2539	1.0	0.0	1.0
+chr2	2542	1.0	0.0	1.0
+chr2	2544	0.0	1.0	1.0
+chr2	2553	0.0	1.0	1.0
+chr2	2562	0.0	1.0	1.0
+chr2	2575	0.0	1.0	1.0
+chr2	2584	0.0	1.0	1.0
+chr2	2595	1.0	0.0	1.0
+chr2	2605	0.0	1.0	1.0
+chr2	2609	0.0	1.0	1.0
+chr2	2629	0.0	1.0	1.0
+chr2	2633	0.0	1.0	1.0
+chr2	2641	1.0	0.0	1.0
+chr2	2642	0.0	1.0	1.0
+chr2	2662	1.0	0.0	1.0
+chr2	2666	0.0	1.0	1.0
+chr2	2670	0.0	1.0	1.0
+chr2	2673	0.0	1.0	1.0
+chr2	2687	1.0	0.0	1.0
+chr2	2705	0.0	1.0	1.0
+chr2	2724	0.0	1.0	1.0
+chr2	2731	0.0	1.0	1.0
+chr2	2742	1.0	0.0	1.0
+chr2	2757	0.0	1.0	1.0
+chr2	2778	0.0	1.0	1.0
+chr2	2782	1.0	0.0	1.0
+chr2	2800	0.0	1.0	1.0
+chr2	2801	0.0	1.0	1.0
+chr2	2825	0.0	1.0	1.0
+chr2	2836	0.0	1.0	1.0
+chr2	2842	0.0	1.0	1.0
+chr2	2851	1.0	0.0	1.0
+chr2	2906	2.0	0.0	2.0
+chr2	2912	2.0	0.0	2.0
+chr2	2920	0.0	1.0	1.0
+chr2	2927	1.0	0.0	1.0
+chr2	2934	2.0	0.0	2.0
+chr2	2939	1.0	0.0	1.0
+chr2	2946	0.0	1.0	1.0
+chr2	2950	0.0	1.0	1.0
+chr2	2951	1.0	0.0	1.0
+chr2	2972	1.0	0.0	1.0
+chr2	2973	0.0	1.0	1.0
+chr2	2984	1.0	0.0	1.0
+chr2	2987	0.0	3.0	3.0
+chr2	2988	0.0	1.0	1.0
+chr2	2997	1.0	0.0	1.0
+chr2	3002	0.0	1.0	1.0
+chr2	3013	2.0	0.0	2.0
+chr2	3015	0.0	1.0	1.0
+chr2	3032	0.0	1.0	1.0
+chr2	3042	0.0	1.0	1.0
+chr2	3067	2.0	0.0	2.0
+chr2	3080	1.0	0.0	1.0
+chr2	3083	1.0	0.0	1.0
+chr2	3090	0.0	2.0	2.0
+chr2	3103	1.0	0.0	1.0
+chr2	3110	0.0	1.0	1.0
+chr2	3136	1.0	0.0	1.0
+chr2	3152	3.0	2.0	5.0
+chr2	3155	1.0	0.0	1.0
+chr2	3170	1.0	0.0	1.0
+chr2	3171	2.0	0.0	2.0
+chr2	3180	1.0	0.0	1.0
+chr2	3193	0.0	1.0	1.0
+chr2	3199	0.0	1.0	1.0
+chr2	3200	0.0	1.0	1.0
+chr2	3221	0.0	1.0	1.0
+chr2	3223	0.0	1.0	1.0
+chr2	3233	0.0	1.0	1.0
+chr2	3234	1.0	0.0	1.0
+chr2	3247	0.0	1.0	1.0
+chr2	3248	0.0	1.0	1.0
+chr2	3249	1.0	3.0	4.0
+chr2	3250	0.0	2.0	2.0
+chr2	3255	0.0	1.0	1.0
+chr2	3260	0.0	2.0	2.0
+chr2	3261	0.0	1.0	1.0
+chr2	3267	0.0	1.0	1.0
+chr2	3272	2.0	0.0	2.0
+chr2	3275	0.0	2.0	2.0
+chr2	3276	0.0	2.0	2.0
+chr2	3279	1.0	0.0	1.0
+chr2	3285	0.0	2.0	2.0
+chr2	3287	1.0	1.0	2.0
+chr2	3290	1.0	0.0	1.0
+chr2	3298	0.0	1.0	1.0
+chr2	3309	1.0	0.0	1.0
+chr2	3314	2.0	1.0	3.0
+chr2	3318	1.0	0.0	1.0
+chr2	3398	0.0	2.0	2.0
+chr2	3400	0.0	1.0	1.0
+chr2	3402	1.0	0.0	1.0
+chr2	3415	1.0	0.0	1.0
+chr2	3425	1.0	1.0	2.0
+chr2	3427	1.0	0.0	1.0
+chr2	3428	4.0	0.0	4.0
+chr2	3433	1.0	0.0	1.0
+chr2	3437	4.0	0.0	4.0
+chr2	3439	0.0	1.0	1.0
+chr2	3443	0.0	1.0	1.0
+chr2	3445	0.0	1.0	1.0
+chr2	3446	0.0	1.0	1.0
+chr2	3448	1.0	0.0	1.0
+chr2	3449	2.0	1.0	3.0
+chr2	3453	0.0	1.0	1.0
+chr2	3455	1.0	0.0	1.0
+chr2	3462	1.0	0.0	1.0
+chr2	3466	0.0	1.0	1.0
+chr2	3475	0.0	2.0	2.0
+chr2	3476	1.0	0.0	1.0
+chr2	3477	1.0	0.0	1.0
+chr2	3485	1.0	0.0	1.0
+chr2	3491	0.0	1.0	1.0
+chr2	3494	1.0	1.0	2.0
+chr2	3499	0.0	1.0	1.0
+chr2	3509	0.0	1.0	1.0
+chr2	3519	0.0	1.0	1.0
+chr2	3526	0.0	1.0	1.0
+chr2	3555	1.0	0.0	1.0
+chr2	3563	0.0	2.0	2.0
+chr2	3576	0.0	1.0	1.0
+chr2	3581	0.0	1.0	1.0
+chr2	3584	0.0	1.0	1.0
+chr2	3590	1.0	0.0	1.0
+chr2	3594	0.0	2.0	2.0
+chr2	3595	1.0	0.0	1.0
+chr2	3596	1.0	0.0	1.0
+chr2	3597	0.0	4.0	4.0
+chr2	3600	5.0	3.0	8.0
+chr2	3602	1.0	0.0	1.0
+chr2	3603	1.0	0.0	1.0
+chr2	3605	1.0	0.0	1.0
+chr2	3608	1.0	0.0	1.0
+chr2	3613	0.0	1.0	1.0
+chr2	3615	1.0	12.0	13.0
+chr2	3616	6.0	3.0	9.0
+chr2	3617	7.0	0.0	7.0
+chr2	3619	2.0	0.0	2.0
+chr2	3621	3.0	0.0	3.0
+chr2	3622	3.0	0.0	3.0
+chr2	3623	2.0	0.0	2.0
+chr2	3624	3.0	1.0	4.0
+chr2	3626	1.0	1.0	2.0
+chr2	3629	1.0	5.0	6.0
+chr2	3630	2.0	1.0	3.0
+chr2	3633	1.0	1.0	2.0
+chr2	3637	0.0	1.0	1.0
+chr2	3641	2.0	0.0	2.0
+chr2	3642	0.0	3.0	3.0
+chr2	3644	0.0	1.0	1.0
+chr2	3645	1.0	2.0	3.0
+chr2	3646	1.0	0.0	1.0
+chr2	3651	1.0	0.0	1.0
+chr2	3652	2.0	0.0	2.0
+chr2	3655	1.0	0.0	1.0
+chr2	3656	2.0	0.0	2.0
+chr2	3669	1.0	0.0	1.0
+chr2	3672	1.0	0.0	1.0
+chr2	3678	0.0	1.0	1.0
+chr2	3680	0.0	1.0	1.0
+chr2	3692	0.0	1.0	1.0
+chr2	3710	0.0	1.0	1.0
+chr2	3719	0.0	1.0	1.0
+chr2	3721	0.0	1.0	1.0
+chr2	3722	1.0	3.0	4.0
+chr2	3723	0.0	1.0	1.0
+chr2	3732	1.0	1.0	2.0
+chr2	3734	0.0	1.0	1.0
+chr2	3738	0.0	3.0	3.0
+chr2	3739	1.0	0.0	1.0
+chr2	3745	0.0	1.0	1.0
+chr2	3747	0.0	6.0	6.0
+chr2	3749	1.0	0.0	1.0
+chr2	3750	9.0	0.0	9.0
+chr2	3751	1.0	0.0	1.0
+chr2	3752	2.0	2.0	4.0
+chr2	3753	1.0	3.0	4.0
+chr2	3755	1.0	0.0	1.0
+chr2	3756	0.0	1.0	1.0
+chr2	3762	8.0	0.0	8.0
+chr2	3763	3.0	1.0	4.0
+chr2	3764	0.0	17.0	17.0
+chr2	3765	0.0	7.0	7.0
+chr2	3766	4.0	2.0	6.0
+chr2	3767	14.0	0.0	14.0
+chr2	3768	1.0	2.0	3.0
+chr2	3769	0.0	1.0	1.0
+chr2	3770	4.0	12.0	16.0
+chr2	3771	0.0	5.0	5.0
+chr2	3772	1.0	1.0	2.0
+chr2	3773	0.0	2.0	2.0
+chr2	3775	1.0	0.0	1.0
+chr2	3776	27.0	0.0	27.0
+chr2	3777	17.0	0.0	17.0
+chr2	3778	3.0	0.0	3.0
+chr2	3779	5.0	9.0	14.0
+chr2	3780	51.0	0.0	51.0
+chr2	3781	4.0	0.0	4.0
+chr2	3782	5.0	0.0	5.0
+chr2	3783	2.0	4.0	6.0
+chr2	3785	2.0	2.0	4.0
+chr2	3786	0.0	8.0	8.0
+chr2	3787	3.0	0.0	3.0
+chr2	3788	10.0	12.0	22.0
+chr2	3789	0.0	43.0	43.0
+chr2	3790	0.0	58.0	58.0
+chr2	3791	3.0	11.0	14.0
+chr2	3792	3.0	2.0	5.0
+chr2	3793	9.0	0.0	9.0
+chr2	3794	29.0	4.0	33.0
+chr2	3795	14.0	5.0	19.0
+chr2	3796	0.0	6.0	6.0
+chr2	3797	8.0	0.0	8.0
+chr2	3798	3.0	0.0	3.0
+chr2	3799	0.0	5.0	5.0
+chr2	3800	0.0	3.0	3.0
+chr2	3802	0.0	2.0	2.0
+chr2	3804	10.0	5.0	15.0
+chr2	3805	8.0	0.0	8.0
+chr2	3807	1.0	0.0	1.0
+chr2	3808	1.0	0.0	1.0
+chr2	3809	7.0	0.0	7.0
+chr2	3810	12.0	2.0	14.0
+chr2	3812	0.0	7.0	7.0
+chr2	3814	0.0	1.0	1.0
+chr2	3816	0.0	1.0	1.0
+chr2	3820	0.0	11.0	11.0
+chr2	3821	0.0	1.0	1.0
+chr2	3822	0.0	1.0	1.0
+chr2	3826	0.0	1.0	1.0
+chr2	3827	1.0	0.0	1.0
+chr2	3828	0.0	2.0	2.0
+chr2	3829	2.0	3.0	5.0
+chr2	3830	0.0	1.0	1.0
+chr2	3833	1.0	0.0	1.0
+chr2	3835	1.0	3.0	4.0
+chr2	3838	0.0	2.0	2.0
+chr2	3840	0.0	1.0	1.0
+chr2	3845	0.0	1.0	1.0
+chr2	3847	2.0	0.0	2.0
+chr2	3848	0.0	2.0	2.0
+chr2	3849	0.0	1.0	1.0
+chr2	3855	1.0	0.0	1.0
+chr2	3859	1.0	0.0	1.0
+chr2	3863	3.0	0.0	3.0
+chr2	3869	1.0	0.0	1.0
+chr2	3879	0.0	1.0	1.0
+chr2	3881	0.0	1.0	1.0
+chr2	3896	1.0	0.0	1.0
+chr2	3899	0.0	1.0	1.0
+chr2	3900	1.0	0.0	1.0
+chr2	3901	0.0	1.0	1.0
+chr2	3905	0.0	1.0	1.0
+chr2	3909	0.0	1.0	1.0
+chr2	3921	1.0	0.0	1.0
+chr2	3937	1.0	0.0	1.0
+chr2	3939	0.0	1.0	1.0
+chr2	3992	1.0	0.0	1.0
+chr2	3998	4.0	0.0	4.0
+chr2	4012	0.0	2.0	2.0
+chr2	4014	0.0	1.0	1.0
+chr2	4019	0.0	1.0	1.0
+chr2	4021	1.0	0.0	1.0
+chr2	4024	0.0	1.0	1.0
+chr2	4028	3.0	0.0	3.0
+chr2	4034	2.0	0.0	2.0
+chr2	4040	1.0	0.0	1.0
+chr2	4045	0.0	1.0	1.0
+chr2	4046	0.0	1.0	1.0
+chr2	4047	1.0	1.0	2.0
+chr2	4048	1.0	2.0	3.0
+chr2	4049	0.0	2.0	2.0
+chr2	4050	1.0	1.0	2.0
+chr2	4051	8.0	0.0	8.0
+chr2	4055	0.0	4.0	4.0
+chr2	4056	1.0	1.0	2.0
+chr2	4057	7.0	1.0	8.0
+chr2	4060	3.0	1.0	4.0
+chr2	4061	0.0	3.0	3.0
+chr2	4062	0.0	3.0	3.0
+chr2	4063	3.0	1.0	4.0
+chr2	4064	6.0	0.0	6.0
+chr2	4067	2.0	0.0	2.0
+chr2	4068	4.0	2.0	6.0
+chr2	4069	0.0	8.0	8.0
+chr2	4070	0.0	1.0	1.0
+chr2	4075	2.0	0.0	2.0
+chr2	4076	2.0	1.0	3.0
+chr2	4077	0.0	3.0	3.0
+chr2	4078	1.0	0.0	1.0
+chr2	4079	2.0	13.0	15.0
+chr2	4084	1.0	0.0	1.0
+chr2	4090	1.0	0.0	1.0
+chr2	4094	3.0	0.0	3.0
+chr2	4095	3.0	0.0	3.0
+chr2	4102	1.0	4.0	5.0
+chr2	4109	0.0	2.0	2.0
+chr2	4112	1.0	0.0	1.0
+chr2	4174	1.0	0.0	1.0
+chr2	4183	1.0	0.0	1.0
+chr2	4189	0.0	1.0	1.0
+chr2	4201	0.0	1.0	1.0
+chr2	4203	1.0	0.0	1.0
+chr2	4209	2.0	0.0	2.0
+chr2	4211	0.0	2.0	2.0
+chr2	4228	0.0	1.0	1.0
+chr2	4229	0.0	1.0	1.0
+chr2	4232	0.0	1.0	1.0
+chr2	4233	2.0	0.0	2.0
+chr2	4234	2.0	0.0	2.0
+chr2	4236	2.0	0.0	2.0
+chr2	4239	0.0	1.0	1.0
+chr2	4250	0.0	1.0	1.0
+chr2	4252	0.0	2.0	2.0
+chr2	4256	0.0	1.0	1.0
+chr2	4261	0.0	2.0	2.0
+chr2	4263	0.0	1.0	1.0
+chr2	4264	0.0	1.0	1.0
+chr2	4267	2.0	0.0	2.0
+chr2	4270	1.0	0.0	1.0
+chr2	4283	0.0	3.0	3.0
+chr2	4285	1.0	1.0	2.0
+chr2	4286	1.0	0.0	1.0
+chr2	4287	0.0	1.0	1.0
+chr2	4289	0.0	1.0	1.0
+chr2	4292	1.0	0.0	1.0
+chr2	4294	1.0	0.0	1.0
+chr2	4295	1.0	0.0	1.0
+chr2	4296	1.0	0.0	1.0
+chr2	4304	1.0	0.0	1.0
+chr2	4313	0.0	1.0	1.0
+chr2	4319	0.0	2.0	2.0
+chr2	4322	0.0	1.0	1.0
+chr2	4323	0.0	1.0	1.0
+chr2	4324	1.0	0.0	1.0
+chr2	4326	0.0	2.0	2.0
+chr2	4335	0.0	1.0	1.0
+chr2	4342	1.0	0.0	1.0
+chr2	4344	0.0	1.0	1.0
+chr2	4345	0.0	1.0	1.0
+chr2	4346	0.0	1.0	1.0
+chr2	4351	1.0	0.0	1.0
+chr2	4356	0.0	1.0	1.0
+chr2	4357	1.0	0.0	1.0
+chr2	4359	2.0	0.0	2.0
+chr2	4363	0.0	1.0	1.0
+chr2	4368	1.0	0.0	1.0
+chr2	4372	0.0	1.0	1.0
+chr2	4376	1.0	0.0	1.0
+chr2	4379	0.0	1.0	1.0
+chr2	4381	3.0	0.0	3.0
+chr2	4382	2.0	0.0	2.0
+chr2	4387	0.0	1.0	1.0
+chr2	4388	2.0	0.0	2.0
+chr2	4389	0.0	1.0	1.0
+chr2	4391	0.0	2.0	2.0
+chr2	4392	0.0	1.0	1.0
+chr2	4396	1.0	0.0	1.0
+chr2	4401	1.0	0.0	1.0
+chr2	4405	0.0	1.0	1.0
+chr2	4406	1.0	0.0	1.0
+chr2	4409	0.0	2.0	2.0
+chr2	4410	1.0	0.0	1.0
+chr2	4412	1.0	0.0	1.0
+chr2	4420	0.0	1.0	1.0
+chr2	4423	2.0	1.0	3.0
+chr2	4426	1.0	0.0	1.0
+chr2	4431	0.0	1.0	1.0
+chr2	4433	0.0	3.0	3.0
+chr2	4434	1.0	0.0	1.0
+chr2	4435	1.0	0.0	1.0
+chr2	4450	1.0	1.0	2.0
+chr2	4456	1.0	0.0	1.0
+chr2	4460	1.0	7.0	8.0
+chr2	4465	3.0	0.0	3.0
+chr2	4469	1.0	0.0	1.0
+chr2	4473	1.0	0.0	1.0
+chr2	4476	1.0	0.0	1.0
+chr2	4481	1.0	0.0	1.0
+chr2	4488	0.0	2.0	2.0
+chr2	4489	0.0	1.0	1.0
+chr2	4493	1.0	0.0	1.0
+chr2	4497	0.0	1.0	1.0
+chr2	4499	0.0	1.0	1.0
+chr2	4503	1.0	0.0	1.0
+chr2	4505	2.0	0.0	2.0
+chr2	4506	3.0	0.0	3.0
+chr2	4511	2.0	0.0	2.0
+chr2	4512	4.0	0.0	4.0
+chr2	4523	0.0	1.0	1.0
+chr2	4537	0.0	1.0	1.0
+chr2	4540	3.0	0.0	3.0
+chr2	4543	1.0	0.0	1.0
+chr2	4548	0.0	1.0	1.0
+chr2	4557	1.0	0.0	1.0
+chr2	4560	1.0	0.0	1.0
+chr2	4563	0.0	1.0	1.0
+chr2	4564	0.0	2.0	2.0
+chr2	4569	2.0	0.0	2.0
+chr2	4578	1.0	0.0	1.0
+chr2	4579	1.0	0.0	1.0
+chr2	4581	1.0	0.0	1.0
+chr2	4593	0.0	1.0	1.0
+chr2	4602	1.0	0.0	1.0
+chr2	4606	1.0	0.0	1.0
+chr2	4610	1.0	0.0	1.0
+chr2	4613	0.0	2.0	2.0
+chr2	4619	0.0	1.0	1.0
+chr2	4630	1.0	0.0	1.0
+chr2	4631	1.0	0.0	1.0
+chr2	4633	0.0	1.0	1.0
+chr2	4641	2.0	0.0	2.0
+chr2	4653	6.0	0.0	6.0
+chr2	4661	0.0	1.0	1.0
+chr2	4667	0.0	1.0	1.0
+chr2	4668	0.0	1.0	1.0
+chr2	4669	1.0	0.0	1.0
+chr2	4673	2.0	0.0	2.0
+chr2	4674	0.0	4.0	4.0
+chr2	4679	1.0	0.0	1.0
+chr2	4680	0.0	1.0	1.0
+chr2	4682	0.0	1.0	1.0
+chr2	4689	1.0	0.0	1.0
+chr2	4691	2.0	0.0	2.0
+chr2	4696	1.0	0.0	1.0
+chr2	4701	3.0	3.0	6.0
+chr2	4706	1.0	0.0	1.0
+chr2	4707	1.0	0.0	1.0
+chr2	4708	0.0	4.0	4.0
+chr2	4709	0.0	2.0	2.0
+chr2	4715	2.0	1.0	3.0
+chr2	4716	0.0	1.0	1.0
+chr2	4725	2.0	1.0	3.0
+chr2	4727	1.0	0.0	1.0
+chr2	4728	1.0	0.0	1.0
+chr2	4729	1.0	0.0	1.0
+chr2	4738	0.0	2.0	2.0
+chr2	4739	0.0	1.0	1.0
+chr2	4743	1.0	0.0	1.0
+chr2	4754	0.0	1.0	1.0
+chr2	4758	0.0	1.0	1.0
+chr2	4769	0.0	1.0	1.0
+chr2	4786	0.0	1.0	1.0
+chr2	4796	1.0	0.0	1.0
+chr2	4797	1.0	1.0	2.0
+chr2	4798	0.0	1.0	1.0
+chr2	4800	0.0	1.0	1.0
+chr2	4820	1.0	1.0	2.0
+chr2	4825	0.0	1.0	1.0
+chr2	4826	0.0	1.0	1.0
+chr2	4830	0.0	1.0	1.0
+chr2	4832	1.0	0.0	1.0
+chr2	4835	1.0	0.0	1.0
+chr2	4840	0.0	1.0	1.0
+chr2	4845	0.0	1.0	1.0
+chr2	4848	1.0	0.0	1.0
+chr2	4849	0.0	1.0	1.0
+chr2	4853	0.0	1.0	1.0
+chr2	4855	1.0	0.0	1.0
+chr2	4857	0.0	2.0	2.0
+chr2	4862	0.0	2.0	2.0
+chr2	4864	0.0	1.0	1.0
+chr2	4865	1.0	1.0	2.0
+chr2	4866	0.0	2.0	2.0
+chr2	4867	1.0	0.0	1.0
+chr2	4868	2.0	0.0	2.0
+chr2	4869	0.0	1.0	1.0
+chr2	4870	1.0	2.0	3.0
+chr2	4871	1.0	2.0	3.0
+chr2	4872	1.0	1.0	2.0
+chr2	4873	2.0	0.0	2.0
+chr2	4880	1.0	0.0	1.0
+chr2	4881	1.0	0.0	1.0
+chr2	4884	0.0	1.0	1.0
+chr2	4885	1.0	0.0	1.0
+chr2	4886	3.0	5.0	8.0
+chr2	4887	0.0	1.0	1.0
+chr2	4890	1.0	0.0	1.0
+chr2	4891	3.0	0.0	3.0
+chr2	4892	0.0	1.0	1.0
+chr2	4895	0.0	3.0	3.0
+chr2	4897	1.0	0.0	1.0
+chr2	4904	0.0	1.0	1.0
+chr2	4905	0.0	1.0	1.0
+chr2	4907	1.0	0.0	1.0
+chr2	4908	2.0	0.0	2.0
+chr2	4909	5.0	0.0	5.0
+chr2	4910	3.0	1.0	4.0
+chr2	4911	0.0	2.0	2.0
+chr2	4914	0.0	3.0	3.0
+chr2	4915	0.0	1.0	1.0
+chr2	4917	2.0	0.0	2.0
+chr2	4921	0.0	6.0	6.0
+chr2	4922	0.0	1.0	1.0
+chr2	4923	1.0	0.0	1.0
+chr2	4925	8.0	0.0	8.0
+chr2	4927	0.0	1.0	1.0
+chr2	4928	0.0	2.0	2.0
+chr2	4931	0.0	1.0	1.0
+chr2	4933	1.0	0.0	1.0
+chr2	4934	2.0	0.0	2.0
+chr2	4935	1.0	2.0	3.0
+chr2	4948	0.0	1.0	1.0
+chr2	4959	1.0	0.0	1.0
+chr2	4973	1.0	0.0	1.0
+chr2	4976	0.0	1.0	1.0
+chr2	4987	1.0	0.0	1.0
+chr2	5004	1.0	0.0	1.0
+chr2	5013	0.0	1.0	1.0
+chr2	5020	1.0	0.0	1.0
+chr2	5023	1.0	0.0	1.0
+chr2	5037	0.0	2.0	2.0
+chr2	5038	0.0	2.0	2.0
+chr2	5047	1.0	0.0	1.0
+chr2	5099	0.0	1.0	1.0
+chr2	5109	0.0	1.0	1.0
+chr2	5116	2.0	0.0	2.0
+chr2	5126	0.0	1.0	1.0
+chr2	5127	0.0	1.0	1.0
+chr2	5129	0.0	4.0	4.0
+chr2	5132	0.0	1.0	1.0
+chr2	5139	0.0	1.0	1.0
+chr2	5145	0.0	1.0	1.0
+chr2	5148	0.0	1.0	1.0
+chr2	5162	1.0	1.0	2.0
+chr2	5168	3.0	0.0	3.0
+chr2	5178	0.0	3.0	3.0
+chr2	5188	1.0	0.0	1.0
+chr2	5189	0.0	1.0	1.0
+chr2	5191	1.0	0.0	1.0
+chr2	5195	2.0	0.0	2.0
+chr2	5197	0.0	1.0	1.0
+chr2	5200	3.0	0.0	3.0
+chr2	5203	0.0	1.0	1.0
+chr2	5210	0.0	1.0	1.0
+chr2	5211	3.0	0.0	3.0
+chr2	5215	0.0	1.0	1.0
+chr2	5218	5.0	0.0	5.0
+chr2	5220	0.0	1.0	1.0
+chr2	5221	1.0	0.0	1.0
+chr2	5222	1.0	0.0	1.0
+chr2	5223	0.0	1.0	1.0
+chr2	5224	1.0	0.0	1.0
+chr2	5230	1.0	0.0	1.0
+chr2	5231	4.0	0.0	4.0
+chr2	5236	1.0	0.0	1.0
+chr2	5237	1.0	0.0	1.0
+chr2	5239	0.0	4.0	4.0
+chr2	5240	0.0	3.0	3.0
+chr2	5244	2.0	0.0	2.0
+chr2	5246	3.0	0.0	3.0
+chr2	5248	0.0	2.0	2.0
+chr2	5249	1.0	0.0	1.0
+chr2	5250	1.0	0.0	1.0
+chr2	5256	0.0	3.0	3.0
+chr2	5258	1.0	0.0	1.0
+chr2	5260	0.0	2.0	2.0
+chr2	5261	0.0	2.0	2.0
+chr2	5269	0.0	1.0	1.0
+chr2	5270	0.0	1.0	1.0
+chr2	5273	0.0	1.0	1.0
+chr2	5279	1.0	0.0	1.0
+chr2	5280	0.0	1.0	1.0
+chr2	5287	2.0	0.0	2.0
+chr2	5288	1.0	0.0	1.0
+chr2	5290	6.0	0.0	6.0
+chr2	5291	3.0	1.0	4.0
+chr2	5292	0.0	3.0	3.0
+chr2	5295	2.0	0.0	2.0
+chr2	5296	1.0	0.0	1.0
+chr2	5300	0.0	2.0	2.0
+chr2	5308	1.0	0.0	1.0
+chr2	5326	0.0	2.0	2.0
+chr2	5330	1.0	0.0	1.0
+chr2	5331	0.0	1.0	1.0
+chr2	5334	1.0	0.0	1.0
+chr2	5335	1.0	0.0	1.0
+chr2	5336	1.0	3.0	4.0
+chr2	5339	1.0	0.0	1.0
+chr2	5343	2.0	0.0	2.0
+chr2	5347	1.0	0.0	1.0
+chr2	5349	1.0	0.0	1.0
+chr2	5350	2.0	0.0	2.0
+chr2	5351	0.0	1.0	1.0
+chr2	5352	0.0	1.0	1.0
+chr2	5353	1.0	0.0	1.0
+chr2	5354	0.0	1.0	1.0
+chr2	5355	0.0	12.0	12.0
+chr2	5356	0.0	2.0	2.0
+chr2	5357	0.0	6.0	6.0
+chr2	5358	1.0	1.0	2.0
+chr2	5359	0.0	1.0	1.0
+chr2	5360	0.0	1.0	1.0
+chr2	5362	9.0	0.0	9.0
+chr2	5363	0.0	3.0	3.0
+chr2	5364	0.0	2.0	2.0
+chr2	5365	7.0	1.0	8.0
+chr2	5367	0.0	5.0	5.0
+chr2	5368	0.0	6.0	6.0
+chr2	5369	1.0	2.0	3.0
+chr2	5370	1.0	0.0	1.0
+chr2	5371	0.0	4.0	4.0
+chr2	5372	0.0	1.0	1.0
+chr2	5373	0.0	5.0	5.0
+chr2	5374	6.0	1.0	7.0
+chr2	5375	3.0	1.0	4.0
+chr2	5376	0.0	1.0	1.0
+chr2	5378	0.0	2.0	2.0
+chr2	5385	0.0	5.0	5.0
+chr2	5386	0.0	1.0	1.0
+chr2	5388	0.0	3.0	3.0
+chr2	5391	3.0	0.0	3.0
+chr2	5392	1.0	0.0	1.0
+chr2	5393	13.0	0.0	13.0
+chr2	5395	1.0	1.0	2.0
+chr2	5396	17.0	0.0	17.0
+chr2	5400	0.0	5.0	5.0
+chr2	5401	0.0	1.0	1.0
+chr2	5403	5.0	0.0	5.0
+chr2	5408	0.0	8.0	8.0
+chr2	5409	0.0	5.0	5.0
+chr2	5410	7.0	2.0	9.0
+chr2	5411	5.0	0.0	5.0
+chr2	5412	2.0	0.0	2.0
+chr2	5415	1.0	0.0	1.0
+chr2	5416	2.0	1.0	3.0
+chr2	5417	3.0	0.0	3.0
+chr2	5420	2.0	0.0	2.0
+chr2	5421	4.0	0.0	4.0
+chr2	5422	18.0	0.0	18.0
+chr2	5423	16.0	0.0	16.0
+chr2	5424	1.0	0.0	1.0
+chr2	5426	5.0	0.0	5.0
+chr2	5427	4.0	0.0	4.0
+chr2	5430	2.0	0.0	2.0
+chr2	5435	1.0	0.0	1.0
+chr2	5438	2.0	0.0	2.0
+chr2	5439	2.0	1.0	3.0
+chr2	5440	0.0	1.0	1.0
+chr2	5443	4.0	0.0	4.0
+chr2	5444	5.0	0.0	5.0
+chr2	5446	1.0	0.0	1.0
+chr2	5447	1.0	0.0	1.0
+chr2	5458	1.0	0.0	1.0
+chr2	5460	1.0	0.0	1.0
+chr2	5484	1.0	0.0	1.0
+chr2	5616	1.0	0.0	1.0
+chr2	5655	0.0	1.0	1.0
+chr2	5714	0.0	1.0	1.0
+chr2	5747	1.0	0.0	1.0
+chr2	5765	0.0	2.0	2.0
+chr2	5813	1.0	0.0	1.0
+chr2	5941	0.0	1.0	1.0
+chr2	5966	1.0	0.0	1.0
+chr2	6007	0.0	2.0	2.0
+chr2	6022	2.0	0.0	2.0
+chr2	6026	0.0	1.0	1.0
+chr2	6030	0.0	1.0	1.0
+chr2	6031	1.0	0.0	1.0
+chr2	6036	1.0	0.0	1.0
+chr2	6042	0.0	1.0	1.0
+chr2	6044	1.0	0.0	1.0
+chr2	6058	0.0	3.0	3.0
+chr2	6134	0.0	1.0	1.0
+chr2	6138	0.0	1.0	1.0
+chr2	6145	0.0	1.0	1.0
+chr2	6146	3.0	0.0	3.0
+chr2	6148	1.0	0.0	1.0
+chr2	6151	0.0	1.0	1.0
+chr2	6173	0.0	2.0	2.0
+chr2	6174	0.0	1.0	1.0
+chr2	6178	0.0	3.0	3.0
+chr2	6182	1.0	0.0	1.0
+chr2	6190	2.0	0.0	2.0
+chr2	6204	1.0	0.0	1.0
+chr2	6205	2.0	0.0	2.0
+chr2	6209	0.0	3.0	3.0
+chr2	6221	0.0	1.0	1.0
+chr2	6226	0.0	2.0	2.0
+chr2	6231	1.0	0.0	1.0
+chr2	6237	1.0	0.0	1.0
+chr2	6250	0.0	1.0	1.0
+chr2	6253	0.0	1.0	1.0
+chr2	6277	1.0	0.0	1.0
+chr2	6332	0.0	1.0	1.0
+chr2	6394	0.0	1.0	1.0
+chr2	6400	0.0	1.0	1.0
+chr2	6403	2.0	0.0	2.0
+chr2	6414	0.0	1.0	1.0
+chr2	6418	1.0	0.0	1.0
+chr2	6419	1.0	1.0	2.0
+chr2	6420	0.0	1.0	1.0
+chr2	6421	2.0	1.0	3.0
+chr2	6427	1.0	0.0	1.0
+chr2	6430	2.0	0.0	2.0
+chr2	6435	0.0	2.0	2.0
+chr2	6436	3.0	3.0	6.0
+chr2	6445	1.0	0.0	1.0
+chr2	6446	1.0	0.0	1.0
+chr2	6448	0.0	1.0	1.0
+chr2	6667	0.0	1.0	1.0
+chr2	6669	1.0	0.0	1.0
+chr2	6673	1.0	0.0	1.0
+chr2	6680	0.0	1.0	1.0
+chr2	6693	1.0	0.0	1.0
+chr2	6733	1.0	0.0	1.0
+chr2	6897	1.0	0.0	1.0
+chr2	7111	0.0	1.0	1.0
+chr2	7139	2.0	0.0	2.0
+chr2	7321	1.0	0.0	1.0
+chr2	7362	1.0	0.0	1.0
+chr2	7393	0.0	2.0	2.0
+chr2	7400	0.0	1.0	1.0
+chr2	7407	1.0	1.0	2.0
+chr2	7448	1.0	0.0	1.0
+chr2	7634	0.0	1.0	1.0
+chr2	7640	0.0	2.0	2.0
+chr2	7646	0.0	1.0	1.0
+chr2	7647	2.0	1.0	3.0
+chr2	7649	2.0	0.0	2.0
+chr2	7656	0.0	2.0	2.0
+chr2	7659	0.0	1.0	1.0
+chr2	7665	1.0	0.0	1.0
+chr2	7666	1.0	1.0	2.0
+chr2	7668	0.0	1.0	1.0
+chr2	7669	0.0	1.0	1.0
+chr2	7677	0.0	5.0	5.0
+chr2	7678	5.0	4.0	9.0
+chr2	7680	0.0	1.0	1.0
+chr2	7683	0.0	3.0	3.0
+chr2	7684	4.0	1.0	5.0
+chr2	7687	2.0	4.0	6.0
+chr2	7688	2.0	0.0	2.0
+chr2	7690	2.0	0.0	2.0
+chr2	7691	0.0	2.0	2.0
+chr2	7692	1.0	1.0	2.0
+chr2	7693	0.0	2.0	2.0
+chr2	7694	0.0	1.0	1.0
+chr2	7695	1.0	1.0	2.0
+chr2	7696	0.0	3.0	3.0
+chr2	7697	0.0	6.0	6.0
+chr2	7698	0.0	1.0	1.0
+chr2	7699	3.0	0.0	3.0
+chr2	7700	0.0	1.0	1.0
+chr2	7702	0.0	1.0	1.0
+chr2	7706	1.0	0.0	1.0
+chr2	7707	1.0	0.0	1.0
+chr2	7708	0.0	1.0	1.0
+chr2	7713	0.0	1.0	1.0
+chr2	7714	2.0	1.0	3.0
+chr2	7715	0.0	1.0	1.0
+chr2	7718	0.0	1.0	1.0
+chr2	7719	2.0	0.0	2.0
+chr2	7723	0.0	1.0	1.0
+chr2	7724	1.0	0.0	1.0
+chr2	7725	1.0	0.0	1.0
+chr2	7734	0.0	1.0	1.0
+chr2	7737	0.0	1.0	1.0
+chr2	7738	0.0	2.0	2.0
+chr2	7740	0.0	1.0	1.0
+chr2	7747	0.0	1.0	1.0
+chr2	7757	1.0	0.0	1.0
+chr2	7763	0.0	1.0	1.0
+chr2	7765	0.0	1.0	1.0
+chr2	7766	0.0	1.0	1.0
+chr2	7771	1.0	2.0	3.0
+chr2	7781	1.0	0.0	1.0
+chr2	7795	1.0	0.0	1.0
+chr2	7797	0.0	2.0	2.0
+chr2	7808	2.0	0.0	2.0
+chr2	7809	2.0	0.0	2.0
+chr2	7816	0.0	1.0	1.0
+chr2	7817	0.0	1.0	1.0
+chr2	7823	1.0	0.0	1.0
+chr2	7824	2.0	0.0	2.0
+chr2	7827	1.0	0.0	1.0
+chr2	7830	1.0	0.0	1.0
+chr2	7831	1.0	0.0	1.0
+chr2	7832	3.0	0.0	3.0
+chr2	7840	1.0	0.0	1.0
+chr2	7850	8.0	0.0	8.0
+chr2	7852	1.0	0.0	1.0
+chr2	7859	0.0	1.0	1.0
+chr2	7861	2.0	0.0	2.0
+chr2	7864	3.0	0.0	3.0
+chr2	7867	1.0	0.0	1.0
+chr2	7871	0.0	1.0	1.0
+chr2	7874	1.0	0.0	1.0
+chr2	7875	0.0	1.0	1.0
+chr2	7881	0.0	1.0	1.0
+chr2	7884	0.0	3.0	3.0
+chr2	7885	0.0	1.0	1.0
+chr2	7888	1.0	0.0	1.0
+chr2	7894	3.0	3.0	6.0
+chr2	7900	0.0	1.0	1.0
+chr2	7911	1.0	0.0	1.0
+chr2	7918	1.0	0.0	1.0
+chr2	7922	0.0	1.0	1.0
+chr2	7944	1.0	0.0	1.0
+chr2	7956	1.0	0.0	1.0
+chr2	7959	0.0	1.0	1.0
+chr2	7966	0.0	1.0	1.0
+chr2	7991	1.0	0.0	1.0
+chr2	8042	1.0	0.0	1.0
+chr2	8048	0.0	1.0	1.0
+chr2	8049	0.0	2.0	2.0
+chr2	8093	0.0	1.0	1.0
+chr2	8124	1.0	0.0	1.0
+chr2	8133	0.0	2.0	2.0
+chr2	8147	0.0	1.0	1.0
+chr2	8161	1.0	1.0	2.0
+chr2	8162	1.0	0.0	1.0
+chr2	8164	0.0	1.0	1.0
+chr2	8166	1.0	2.0	3.0
+chr2	8168	0.0	2.0	2.0
+chr2	8170	1.0	0.0	1.0
+chr2	8171	0.0	1.0	1.0
+chr2	8173	1.0	0.0	1.0
+chr2	8174	2.0	0.0	2.0
+chr2	8177	1.0	0.0	1.0
+chr2	8178	2.0	0.0	2.0
+chr2	8179	1.0	0.0	1.0
+chr2	8181	0.0	4.0	4.0
+chr2	8182	2.0	2.0	4.0
+chr2	8183	2.0	0.0	2.0
+chr2	8184	0.0	4.0	4.0
+chr2	8186	1.0	3.0	4.0
+chr2	8187	0.0	5.0	5.0
+chr2	8188	0.0	1.0	1.0
+chr2	8192	0.0	1.0	1.0
+chr2	8193	0.0	1.0	1.0
+chr2	8197	1.0	0.0	1.0
+chr2	8198	2.0	0.0	2.0
+chr2	8201	4.0	0.0	4.0
+chr2	8209	0.0	1.0	1.0
+chr2	8213	1.0	0.0	1.0
+chr2	8214	0.0	1.0	1.0
+chr2	8221	1.0	0.0	1.0
+chr2	8222	1.0	0.0	1.0
+chr2	8376	0.0	1.0	1.0
+chr2	8379	0.0	1.0	1.0
+chr2	8392	1.0	0.0	1.0
+chr2	8409	0.0	1.0	1.0
+chr2	8439	1.0	0.0	1.0
+chr2	8440	2.0	0.0	2.0
+chr2	8443	0.0	1.0	1.0
+chr2	8444	0.0	1.0	1.0
+chr2	8449	1.0	0.0	1.0
+chr2	8454	1.0	0.0	1.0
+chr2	8455	1.0	0.0	1.0
+chr2	8464	0.0	1.0	1.0
+chr2	8471	1.0	2.0	3.0
+chr2	8475	0.0	1.0	1.0
+chr2	8478	0.0	1.0	1.0
+chr2	8480	0.0	1.0	1.0
+chr2	8482	1.0	1.0	2.0
+chr2	8484	0.0	2.0	2.0
+chr2	8485	0.0	2.0	2.0
+chr2	8491	0.0	1.0	1.0
+chr2	8494	2.0	0.0	2.0
+chr2	8513	0.0	2.0	2.0
+chr2	8603	1.0	0.0	1.0
+chr2	8625	1.0	0.0	1.0
+chr2	8641	1.0	0.0	1.0
+chr2	8648	0.0	1.0	1.0
+chr2	8819	0.0	1.0	1.0
+chr2	9114	0.0	1.0	1.0
+chr2	9117	0.0	1.0	1.0
+chr2	9118	0.0	1.0	1.0
+chr2	9122	0.0	2.0	2.0
+chr2	9142	0.0	1.0	1.0
+chr2	9152	0.0	1.0	1.0
+chr2	9153	0.0	2.0	2.0
+chr2	9154	0.0	1.0	1.0
+chr2	9157	0.0	3.0	3.0
+chr2	9158	0.0	6.0	6.0
+chr2	9165	3.0	0.0	3.0
+chr2	9166	4.0	0.0	4.0
+chr2	9169	1.0	1.0	2.0
+chr2	9170	0.0	1.0	1.0
+chr2	9172	0.0	2.0	2.0
+chr2	9173	0.0	1.0	1.0
+chr2	9176	0.0	5.0	5.0
+chr2	9180	1.0	0.0	1.0
+chr2	9187	1.0	0.0	1.0
+chr2	9190	1.0	0.0	1.0
+chr2	9199	0.0	1.0	1.0
+chr2	9200	1.0	0.0	1.0
+chr2	9202	0.0	1.0	1.0
+chr2	9207	1.0	0.0	1.0
+chr2	9211	0.0	1.0	1.0
+chr2	9212	1.0	0.0	1.0
+chr2	9214	0.0	1.0	1.0
+chr2	9215	0.0	1.0	1.0
+chr2	9220	1.0	0.0	1.0
+chr2	9222	2.0	0.0	2.0
+chr2	9228	1.0	0.0	1.0
+chr2	9229	1.0	0.0	1.0
+chr2	9233	0.0	1.0	1.0
+chr2	9262	2.0	0.0	2.0
+chr2	9289	0.0	1.0	1.0
+chr2	9311	1.0	0.0	1.0
+chr2	9321	0.0	1.0	1.0
+chr2	9328	0.0	2.0	2.0
+chr2	9337	0.0	2.0	2.0
+chr2	9348	0.0	1.0	1.0
+chr2	9351	0.0	2.0	2.0
+chr2	9356	2.0	0.0	2.0
+chr2	9363	3.0	0.0	3.0
+chr2	9367	2.0	0.0	2.0
+chr2	9370	1.0	0.0	1.0
+chr2	9371	1.0	0.0	1.0
+chr2	9373	3.0	0.0	3.0
+chr2	9375	5.0	0.0	5.0
+chr2	9376	9.0	0.0	9.0
+chr2	9377	3.0	0.0	3.0
+chr2	9378	1.0	0.0	1.0
+chr2	9379	1.0	0.0	1.0
+chr2	9380	2.0	0.0	2.0
+chr2	9389	1.0	0.0	1.0
+chr2	9390	1.0	0.0	1.0
+chr2	9394	1.0	0.0	1.0
+chr2	9395	1.0	0.0	1.0
+chr2	9400	1.0	0.0	1.0
+chr2	9401	1.0	0.0	1.0
+chr2	9406	2.0	0.0	2.0
+chr2	9432	1.0	0.0	1.0
+chr2	9433	0.0	3.0	3.0
+chr2	9950	1.0	0.0	1.0
+chr2	9965	1.0	0.0	1.0
+chr2	9973	3.0	0.0	3.0
+chr2	9985	1.0	0.0	1.0
+chr2	9989	2.0	0.0	2.0
+chr2	9993	0.0	1.0	1.0
+chr2	10123	0.0	2.0	2.0
+chr2	10134	1.0	0.0	1.0
+chr2	10343	0.0	1.0	1.0
+chr2	10347	1.0	0.0	1.0
+chr2	10413	1.0	0.0	1.0
+chr2	10455	1.0	0.0	1.0
+chr2	10466	0.0	1.0	1.0
+chr2	10467	0.0	2.0	2.0
+chr2	10477	2.0	1.0	3.0
+chr2	10482	1.0	0.0	1.0
+chr2	10485	0.0	2.0	2.0
+chr2	10493	0.0	1.0	1.0
+chr2	10496	0.0	2.0	2.0
+chr2	10498	2.0	0.0	2.0
+chr2	10499	0.0	3.0	3.0
+chr2	10502	0.0	1.0	1.0
+chr2	10515	0.0	1.0	1.0
+chr2	10521	0.0	1.0	1.0
+chr2	10541	1.0	0.0	1.0
+chr2	10545	1.0	0.0	1.0
+chr2	10753	0.0	2.0	2.0
+chr2	10757	0.0	1.0	1.0
+chr2	10776	0.0	1.0	1.0
+chr2	10780	1.0	0.0	1.0
+chr2	10783	1.0	1.0	2.0
+chr2	10788	3.0	0.0	3.0
+chr2	10789	2.0	0.0	2.0
+chr2	10793	0.0	2.0	2.0
+chr2	10796	0.0	2.0	2.0
+chr2	10800	0.0	1.0	1.0
+chr2	10825	1.0	0.0	1.0
+chr2	10933	0.0	1.0	1.0
+chr2	10950	0.0	2.0	2.0
+chr2	11366	0.0	1.0	1.0
+chr2	11406	1.0	0.0	1.0
+chr2	11674	0.0	2.0	2.0
+chr2	11682	1.0	0.0	1.0
+chr2	11909	0.0	1.0	1.0
+chr2	12161	0.0	1.0	1.0
+chr2	12303	1.0	0.0	1.0
+chr2	12821	1.0	0.0	1.0
+chr2	12951	0.0	1.0	1.0
+chr2	12971	0.0	1.0	1.0
+chr2	13492	1.0	0.0	1.0
+chr2	13574	1.0	0.0	1.0
+chr2	13666	1.0	0.0	1.0
+chr2	13688	0.0	1.0	1.0
+chr2	13707	0.0	1.0	1.0
+chr2	13749	1.0	0.0	1.0
+chr2	13818	1.0	0.0	1.0
+chr2	13885	0.0	1.0	1.0
+chr2	14352	1.0	0.0	1.0
+chr2	14448	1.0	0.0	1.0
+chr2	14523	0.0	1.0	1.0
+chr2	15338	0.0	1.0	1.0
+chr2	15457	1.0	0.0	1.0
+chr2	15528	0.0	1.0	1.0
+chr2	15705	0.0	1.0	1.0
+chr2	15718	0.0	1.0	1.0
+chr2	15991	1.0	0.0	1.0
+chr2	16332	1.0	0.0	1.0
+chr2	16816	1.0	0.0	1.0
+chr2	17055	1.0	0.0	1.0
+chr2	17741	1.0	0.0	1.0
+chr2	17865	0.0	1.0	1.0
+chr2	17874	0.0	1.0	1.0
+chr2	17887	1.0	0.0	1.0
+chr2	17891	0.0	1.0	1.0
+chr2	17892	4.0	0.0	4.0
+chr2	17893	6.0	0.0	6.0
+chr2	17894	0.0	4.0	4.0
+chr2	17895	2.0	1.0	3.0
+chr2	17896	0.0	1.0	1.0
+chr2	17897	1.0	1.0	2.0
+chr2	17898	1.0	0.0	1.0
+chr2	17899	12.0	0.0	12.0
+chr2	17900	0.0	2.0	2.0
+chr2	17902	0.0	1.0	1.0
+chr2	17905	0.0	4.0	4.0
+chr2	17906	0.0	2.0	2.0
+chr2	17907	0.0	1.0	1.0
+chr2	17909	0.0	1.0	1.0
+chr2	17910	0.0	1.0	1.0
+chr2	17917	1.0	1.0	2.0
+chr2	17922	0.0	1.0	1.0
+chr2	17925	1.0	0.0	1.0
+chr2	17939	0.0	1.0	1.0
+chr2	18175	1.0	0.0	1.0
+chr2	18176	0.0	1.0	1.0
+chr2	18186	0.0	2.0	2.0
+chr2	18191	0.0	1.0	1.0
+chr2	18199	0.0	1.0	1.0
+chr2	18214	1.0	0.0	1.0
+chr2	18216	1.0	0.0	1.0
+chr2	18241	2.0	0.0	2.0
+chr2	18355	0.0	1.0	1.0
+chr2	18364	0.0	2.0	2.0
+chr2	18380	1.0	0.0	1.0
+chr2	18684	0.0	1.0	1.0
+chr2	18694	0.0	1.0	1.0
+chr2	18851	1.0	0.0	1.0
+chr2	18866	0.0	2.0	2.0
+chr2	18923	1.0	0.0	1.0
+chr2	19060	1.0	0.0	1.0
+chr2	20274	0.0	1.0	1.0
+chr2	20296	0.0	1.0	1.0
+chr2	20450	0.0	1.0	1.0
+chr2	20458	0.0	1.0	1.0
+chr2	21030	1.0	0.0	1.0
+chr2	21075	1.0	0.0	1.0
+chr2	21244	2.0	0.0	2.0
+chr2	21245	0.0	1.0	1.0
+chr2	21248	2.0	0.0	2.0
+chr2	21253	0.0	5.0	5.0
+chr2	21260	3.0	1.0	4.0
+chr2	21261	1.0	0.0	1.0
+chr2	21264	0.0	1.0	1.0
+chr2	21266	0.0	1.0	1.0
+chr2	21275	0.0	1.0	1.0
+chr2	21276	2.0	0.0	2.0
+chr2	21282	0.0	1.0	1.0
+chr2	21283	0.0	1.0	1.0
+chr2	21416	0.0	1.0	1.0
+chr2	21453	1.0	0.0	1.0
+chr2	21478	1.0	0.0	1.0
+chr2	21479	0.0	1.0	1.0
+chr2	21491	1.0	0.0	1.0
+chr2	21507	0.0	1.0	1.0
+chr2	21521	1.0	0.0	1.0
+chr2	21525	0.0	1.0	1.0
+chr2	21529	3.0	1.0	4.0
+chr2	22219	0.0	1.0	1.0
+chr2	23100	2.0	0.0	2.0
+chr2	23113	1.0	0.0	1.0
+chr2	23228	0.0	1.0	1.0
+chr2	23458	1.0	0.0	1.0
+chr2	23567	0.0	1.0	1.0
+chr2	23686	0.0	1.0	1.0
+chr2	23724	2.0	0.0	2.0
+chr2	23727	0.0	1.0	1.0
+chr2	23729	0.0	1.0	1.0
+chr2	23734	3.0	0.0	3.0
+chr2	23738	1.0	0.0	1.0
+chr2	23741	0.0	3.0	3.0
+chr2	23743	2.0	2.0	4.0
+chr2	23744	0.0	2.0	2.0
+chr2	23749	1.0	0.0	1.0
+chr2	23750	2.0	0.0	2.0
+chr2	23752	2.0	0.0	2.0
+chr2	23753	0.0	4.0	4.0
+chr2	23754	0.0	2.0	2.0
+chr2	23760	1.0	0.0	1.0
+chr2	23771	0.0	1.0	1.0
+chr2	24004	1.0	0.0	1.0
+chr2	24023	0.0	1.0	1.0
+chr2	24031	1.0	0.0	1.0
+chr2	24041	1.0	0.0	1.0
+chr2	24042	0.0	2.0	2.0
+chr2	24053	0.0	1.0	1.0
+chr2	24055	0.0	2.0	2.0
+chr2	24058	0.0	1.0	1.0
+chr2	24061	1.0	0.0	1.0
+chr2	24088	1.0	0.0	1.0
+chr2	24172	1.0	0.0	1.0
+chr2	24194	1.0	0.0	1.0
+chr2	24399	1.0	0.0	1.0
+chr2	24493	1.0	0.0	1.0
+chr2	24515	1.0	0.0	1.0
+chr2	24529	0.0	1.0	1.0
+chr2	24540	0.0	1.0	1.0
+chr2	24667	0.0	1.0	1.0
+chr2	24691	0.0	1.0	1.0
+chr2	24744	0.0	1.0	1.0
+chr2	25018	1.0	0.0	1.0
+chr2	25043	0.0	1.0	1.0
+chr2	25201	1.0	0.0	1.0
+chr2	25221	1.0	0.0	1.0
+chr2	25226	0.0	1.0	1.0
+chr2	25948	0.0	1.0	1.0
+chr2	25989	0.0	1.0	1.0
+chr2	26118	0.0	1.0	1.0
+chr2	26307	1.0	0.0	1.0
+chr2	26713	1.0	0.0	1.0
+chr2	26927	1.0	0.0	1.0
+chr2	27104	0.0	1.0	1.0
+chr2	27414	0.0	1.0	1.0
+chr2	27444	2.0	0.0	2.0
+chr2	27577	0.0	2.0	2.0
+chr2	27919	0.0	1.0	1.0
+chr2	27934	0.0	1.0	1.0
+chr2	27959	1.0	0.0	1.0
+chr2	27970	1.0	0.0	1.0
+chr2	27982	1.0	0.0	1.0
+chr2	27991	0.0	5.0	5.0
+chr2	28028	2.0	0.0	2.0
+chr2	28154	0.0	1.0	1.0
+chr2	28175	1.0	0.0	1.0
+chr2	28190	2.0	0.0	2.0
+chr2	28211	0.0	1.0	1.0
+chr2	28225	2.0	0.0	2.0
+chr2	28264	1.0	0.0	1.0
+chr2	28283	1.0	0.0	1.0
+chr2	28285	1.0	0.0	1.0
+chr2	28303	0.0	1.0	1.0
+chr2	28316	0.0	1.0	1.0
+chr2	28323	1.0	0.0	1.0
+chr2	28324	1.0	0.0	1.0
+chr2	28325	2.0	0.0	2.0
+chr2	28347	0.0	4.0	4.0
+chr2	28356	0.0	1.0	1.0
+chr2	28358	0.0	1.0	1.0
+chr2	28380	1.0	0.0	1.0
+chr2	28385	0.0	1.0	1.0
+chr2	28401	0.0	1.0	1.0
+chr2	28543	0.0	1.0	1.0
+chr2	28565	1.0	0.0	1.0
+chr2	28574	1.0	0.0	1.0
+chr2	28587	1.0	0.0	1.0
+chr2	28591	1.0	0.0	1.0
+chr2	28597	0.0	1.0	1.0
+chr2	28608	1.0	0.0	1.0
+chr2	28612	1.0	0.0	1.0
+chr2	28754	0.0	1.0	1.0
+chr2	28843	1.0	0.0	1.0
+chr2	28878	0.0	1.0	1.0
+chr2	28914	0.0	1.0	1.0
+chr2	29097	1.0	0.0	1.0
+chr2	29108	0.0	1.0	1.0
+chr2	29110	2.0	1.0	3.0
+chr2	29111	0.0	1.0	1.0
+chr2	29115	0.0	1.0	1.0
+chr2	29121	0.0	1.0	1.0
+chr2	29126	1.0	0.0	1.0
+chr2	29127	0.0	1.0	1.0
+chr2	29269	1.0	0.0	1.0
+chr2	29270	1.0	0.0	1.0
+chr2	29277	0.0	1.0	1.0
+chr2	29294	1.0	0.0	1.0
+chr2	29318	1.0	0.0	1.0
+chr2	29450	0.0	1.0	1.0
+chr2	29503	1.0	1.0	2.0
+chr2	29507	0.0	2.0	2.0
+chr2	29515	0.0	1.0	1.0
+chr2	29516	0.0	1.0	1.0
+chr2	29518	2.0	0.0	2.0
+chr2	29540	1.0	0.0	1.0
+chr2	29541	1.0	0.0	1.0
+chr2	29584	1.0	0.0	1.0
+chr2	29662	0.0	1.0	1.0
+chr2	29665	0.0	1.0	1.0
+chr2	29666	0.0	1.0	1.0
+chr2	29670	0.0	2.0	2.0
+chr2	29690	0.0	1.0	1.0
+chr2	29700	0.0	1.0	1.0
+chr2	29701	0.0	3.0	3.0
+chr2	29702	0.0	1.0	1.0
+chr2	29705	0.0	3.0	3.0
+chr2	29706	0.0	6.0	6.0
+chr2	29711	0.0	1.0	1.0
+chr2	29713	3.0	0.0	3.0
+chr2	29714	4.0	0.0	4.0
+chr2	29716	0.0	1.0	1.0
+chr2	29717	1.0	1.0	2.0
+chr2	29718	0.0	4.0	4.0
+chr2	29720	0.0	2.0	2.0
+chr2	29721	0.0	1.0	1.0
+chr2	29724	0.0	5.0	5.0
+chr2	29728	1.0	0.0	1.0
+chr2	29735	1.0	0.0	1.0
+chr2	29738	1.0	0.0	1.0
+chr2	29747	0.0	1.0	1.0
+chr2	29748	1.0	0.0	1.0
+chr2	29750	0.0	1.0	1.0
+chr2	29755	1.0	0.0	1.0
+chr2	29759	0.0	1.0	1.0
+chr2	29760	1.0	0.0	1.0
+chr2	29762	0.0	1.0	1.0
+chr2	29763	1.0	1.0	2.0
+chr2	29765	1.0	0.0	1.0
+chr2	29768	1.0	0.0	1.0
+chr2	29770	2.0	0.0	2.0
+chr2	29775	1.0	0.0	1.0
+chr2	29776	1.0	0.0	1.0
+chr2	29777	1.0	0.0	1.0
+chr2	29779	2.0	0.0	2.0
+chr2	29781	0.0	1.0	1.0
+chr2	29810	2.0	0.0	2.0
+chr2	29837	0.0	1.0	1.0
+chr2	29859	1.0	0.0	1.0
+chr2	29869	0.0	1.0	1.0
+chr2	29876	0.0	1.0	1.0
+chr2	29885	0.0	2.0	2.0
+chr2	29896	0.0	1.0	1.0
+chr2	29899	0.0	2.0	2.0
+chr2	29904	2.0	0.0	2.0
+chr2	29911	3.0	1.0	4.0
+chr2	29915	2.0	0.0	2.0
+chr2	29918	1.0	0.0	1.0
+chr2	29919	1.0	0.0	1.0
+chr2	29921	3.0	0.0	3.0
+chr2	29923	5.0	0.0	5.0
+chr2	29924	0.0	2.0	2.0
+chr2	29925	1.0	0.0	1.0
+chr2	29926	1.0	0.0	1.0
+chr2	29927	1.0	2.0	3.0
+chr2	29928	2.0	0.0	2.0
+chr2	29931	0.0	1.0	1.0
+chr2	29936	0.0	6.0	6.0
+chr2	29937	1.0	0.0	1.0
+chr2	29938	1.0	0.0	1.0
+chr2	29942	1.0	0.0	1.0
+chr2	29943	1.0	0.0	1.0
+chr2	29948	1.0	0.0	1.0
+chr2	29949	1.0	0.0	1.0
+chr2	29953	1.0	0.0	1.0
+chr2	29954	1.0	0.0	1.0
+chr2	29955	0.0	3.0	3.0
+chr2	29956	0.0	2.0	2.0
+chr2	29963	0.0	2.0	2.0
+chr2	29973	0.0	2.0	2.0
+chr2	29974	0.0	1.0	1.0
+chr2	29978	2.0	0.0	2.0
+chr2	29979	1.0	0.0	1.0
+chr2	29980	2.0	0.0	2.0
+chr2	29983	0.0	1.0	1.0
+chr2	29989	0.0	1.0	1.0
+chr2	30000	1.0	0.0	1.0
+chr2	30002	0.0	2.0	2.0
+chr2	30003	2.0	0.0	2.0
+chr2	30004	1.0	0.0	1.0
+chr2	30005	1.0	0.0	1.0
+chr2	30007	0.0	3.0	3.0
+chr2	30009	0.0	1.0	1.0
+chr2	30010	1.0	0.0	1.0
+chr2	30011	2.0	0.0	2.0
+chr2	30016	0.0	1.0	1.0
+chr2	30019	0.0	1.0	1.0
+chr2	30021	1.0	0.0	1.0
+chr2	30024	1.0	0.0	1.0
+chr2	30029	1.0	0.0	1.0
+chr2	30030	2.0	0.0	2.0
+chr2	30032	0.0	1.0	1.0
+chr2	30034	0.0	1.0	1.0
+chr2	30036	0.0	1.0	1.0
+chr2	30039	0.0	2.0	2.0
+chr2	30044	0.0	1.0	1.0
+chr2	30046	2.0	1.0	3.0
+chr2	30050	1.0	3.0	4.0
+chr2	30053	0.0	1.0	1.0
+chr2	30057	0.0	2.0	2.0
+chr2	30058	0.0	4.0	4.0
+chr2	30061	0.0	2.0	2.0
+chr2	30062	0.0	2.0	2.0
+chr2	30065	0.0	1.0	1.0
+chr2	30067	1.0	0.0	1.0
+chr2	30068	2.0	0.0	2.0
+chr2	30069	0.0	1.0	1.0
+chr2	30073	1.0	0.0	1.0
+chr2	30074	1.0	1.0	2.0
+chr2	30075	2.0	0.0	2.0
+chr2	30079	1.0	0.0	1.0
+chr2	30081	0.0	1.0	1.0
+chr2	30083	0.0	8.0	8.0
+chr2	30084	0.0	2.0	2.0
+chr2	30086	0.0	7.0	7.0
+chr2	30088	0.0	1.0	1.0
+chr2	30089	2.0	0.0	2.0
+chr2	30090	2.0	0.0	2.0
+chr2	30091	2.0	0.0	2.0
+chr2	30094	2.0	0.0	2.0
+chr2	30095	0.0	2.0	2.0
+chr2	30096	1.0	0.0	1.0
+chr2	30097	2.0	0.0	2.0
+chr2	30098	0.0	6.0	6.0
+chr2	30100	0.0	4.0	4.0
+chr2	30101	0.0	1.0	1.0
+chr2	30102	1.0	3.0	4.0
+chr2	30103	3.0	1.0	4.0
+chr2	30104	0.0	1.0	1.0
+chr2	30106	3.0	0.0	3.0
+chr2	30109	1.0	0.0	1.0
+chr2	30110	4.0	0.0	4.0
+chr2	30111	0.0	2.0	2.0
+chr2	30115	0.0	5.0	5.0
+chr2	30118	0.0	1.0	1.0
+chr2	30121	0.0	11.0	11.0
+chr2	30122	1.0	0.0	1.0
+chr2	30123	5.0	0.0	5.0
+chr2	30124	1.0	0.0	1.0
+chr2	30125	1.0	0.0	1.0
+chr2	30126	0.0	5.0	5.0
+chr2	30127	0.0	2.0	2.0
+chr2	30128	0.0	1.0	1.0
+chr2	30129	0.0	4.0	4.0
+chr2	30130	0.0	1.0	1.0
+chr2	30131	0.0	1.0	1.0
+chr2	30132	0.0	1.0	1.0
+chr2	30133	0.0	14.0	14.0
+chr2	30136	1.0	0.0	1.0
+chr2	30137	3.0	0.0	3.0
+chr2	30138	0.0	1.0	1.0
+chr2	30141	1.0	3.0	4.0
+chr2	30142	11.0	0.0	11.0
+chr2	30143	3.0	0.0	3.0
+chr2	30146	1.0	2.0	3.0
+chr2	30147	0.0	2.0	2.0
+chr2	30149	2.0	0.0	2.0
+chr2	30150	1.0	0.0	1.0
+chr2	30151	0.0	2.0	2.0
+chr2	30154	1.0	0.0	1.0
+chr2	30156	0.0	1.0	1.0
+chr2	30158	4.0	0.0	4.0
+chr2	30159	0.0	1.0	1.0
+chr2	30163	3.0	0.0	3.0
+chr2	30164	0.0	1.0	1.0
+chr2	30166	4.0	3.0	7.0
+chr2	30168	1.0	0.0	1.0
+chr2	30170	1.0	0.0	1.0
+chr2	30173	0.0	1.0	1.0
+chr2	30179	0.0	2.0	2.0
+chr2	30180	0.0	1.0	1.0
+chr2	30182	0.0	3.0	3.0
+chr2	30185	2.0	0.0	2.0
+chr2	30186	0.0	1.0	1.0
+chr2	30188	1.0	0.0	1.0
+chr2	30192	0.0	1.0	1.0
+chr2	30193	1.0	0.0	1.0
+chr2	30194	1.0	0.0	1.0
+chr2	30197	0.0	1.0	1.0
+chr2	30199	0.0	4.0	4.0
+chr2	30200	1.0	0.0	1.0
+chr2	30201	0.0	2.0	2.0
+chr2	30205	1.0	0.0	1.0
+chr2	30210	1.0	0.0	1.0
+chr2	30211	1.0	0.0	1.0
+chr2	30212	0.0	2.0	2.0
+chr2	30215	1.0	0.0	1.0
+chr2	30217	1.0	0.0	1.0
+chr2	30218	0.0	2.0	2.0
+chr2	30219	0.0	7.0	7.0
+chr2	30220	2.0	0.0	2.0
+chr2	30222	0.0	1.0	1.0
+chr2	30223	1.0	0.0	1.0
+chr2	30226	1.0	0.0	1.0
+chr2	30232	2.0	0.0	2.0
+chr2	30235	2.0	0.0	2.0
+chr2	30236	1.0	0.0	1.0
+chr2	30238	0.0	1.0	1.0
+chr2	30240	0.0	5.0	5.0
+chr2	30241	2.0	0.0	2.0
+chr2	30244	1.0	0.0	1.0
+chr2	30250	2.0	0.0	2.0
+chr2	30251	1.0	2.0	3.0
+chr2	30252	0.0	1.0	1.0
+chr2	30253	1.0	1.0	2.0
+chr2	30255	1.0	1.0	2.0
+chr2	30256	0.0	2.0	2.0
+chr2	30257	2.0	5.0	7.0
+chr2	30258	2.0	0.0	2.0
+chr2	30262	2.0	0.0	2.0
+chr2	30264	2.0	0.0	2.0
+chr2	30265	0.0	1.0	1.0
+chr2	30268	1.0	2.0	3.0
+chr2	30270	0.0	1.0	1.0
+chr2	30272	0.0	2.0	2.0
+chr2	30276	5.0	0.0	5.0
+chr2	30281	1.0	0.0	1.0
+chr2	30284	2.0	5.0	7.0
+chr2	30285	0.0	1.0	1.0
+chr2	30289	1.0	0.0	1.0
+chr2	30290	0.0	1.0	1.0
+chr2	30293	4.0	0.0	4.0
+chr2	30294	4.0	1.0	5.0
+chr2	30295	0.0	1.0	1.0
+chr2	30299	0.0	1.0	1.0
+chr2	30301	0.0	1.0	1.0
+chr2	30302	3.0	0.0	3.0
+chr2	30303	4.0	3.0	7.0
+chr2	30304	0.0	2.0	2.0
+chr2	30305	1.0	1.0	2.0
+chr2	30307	0.0	1.0	1.0
+chr2	30310	0.0	2.0	2.0
+chr2	30312	0.0	1.0	1.0
+chr2	30313	1.0	0.0	1.0
+chr2	30314	0.0	2.0	2.0
+chr2	30315	3.0	0.0	3.0
+chr2	30316	0.0	2.0	2.0
+chr2	30321	1.0	0.0	1.0
+chr2	30322	1.0	0.0	1.0
+chr2	30325	0.0	2.0	2.0
+chr2	30326	2.0	0.0	2.0
+chr2	30329	0.0	2.0	2.0
+chr2	30330	1.0	0.0	1.0
+chr2	30332	1.0	0.0	1.0
+chr2	30333	1.0	0.0	1.0
+chr2	30335	0.0	1.0	1.0
+chr2	30343	0.0	1.0	1.0
+chr2	30344	0.0	1.0	1.0
+chr2	30348	1.0	1.0	2.0
+chr2	30353	2.0	0.0	2.0
+chr2	30354	0.0	1.0	1.0
+chr2	30355	0.0	1.0	1.0
+chr2	30357	1.0	0.0	1.0
+chr2	30362	0.0	1.0	1.0
+chr2	30364	0.0	1.0	1.0
+chr2	30367	1.0	0.0	1.0
+chr2	30368	2.0	1.0	3.0
+chr2	30369	3.0	0.0	3.0
+chr2	30370	7.0	0.0	7.0
+chr2	30371	1.0	1.0	2.0
+chr2	30372	2.0	0.0	2.0
+chr2	30373	3.0	0.0	3.0
+chr2	30374	1.0	1.0	2.0
+chr2	30378	0.0	1.0	1.0
+chr2	30379	0.0	2.0	2.0
+chr2	30382	1.0	3.0	4.0
+chr2	30383	0.0	2.0	2.0
+chr2	30384	0.0	2.0	2.0
+chr2	30386	3.0	0.0	3.0
+chr2	30387	5.0	3.0	8.0
+chr2	30388	10.0	2.0	12.0
+chr2	30389	0.0	2.0	2.0
+chr2	30390	0.0	3.0	3.0
+chr2	30395	0.0	2.0	2.0
+chr2	30396	0.0	1.0	1.0
+chr2	30398	0.0	2.0	2.0
+chr2	30399	1.0	1.0	2.0
+chr2	30400	0.0	2.0	2.0
+chr2	30401	0.0	1.0	1.0
+chr2	30402	0.0	3.0	3.0
+chr2	30403	4.0	0.0	4.0
+chr2	30404	4.0	0.0	4.0
+chr2	30405	7.0	0.0	7.0
+chr2	30407	0.0	1.0	1.0
+chr2	30411	0.0	1.0	1.0
+chr2	30414	1.0	0.0	1.0
+chr2	30415	0.0	1.0	1.0
+chr2	30416	3.0	1.0	4.0
+chr2	30419	1.0	0.0	1.0
+chr2	30422	2.0	0.0	2.0
+chr2	30423	0.0	1.0	1.0
+chr2	30425	1.0	0.0	1.0
+chr2	30426	0.0	1.0	1.0
+chr2	30427	2.0	0.0	2.0
+chr2	30429	0.0	1.0	1.0
+chr2	30430	1.0	0.0	1.0
+chr2	30431	0.0	2.0	2.0
+chr2	30432	0.0	3.0	3.0
+chr2	30437	1.0	0.0	1.0
+chr2	30444	0.0	1.0	1.0
+chr2	30466	0.0	1.0	1.0
+chr2	30467	0.0	1.0	1.0
+chr2	30478	0.0	1.0	1.0
+chr2	30482	1.0	0.0	1.0
+chr2	30490	0.0	1.0	1.0
+chr2	30501	0.0	1.0	1.0
+chr2	30525	1.0	0.0	1.0
+chr2	30538	0.0	1.0	1.0
+chr2	30548	0.0	3.0	3.0
+chr2	30551	0.0	1.0	1.0
+chr2	30555	1.0	0.0	1.0
+chr2	30557	1.0	0.0	1.0
+chr2	30559	0.0	1.0	1.0
+chr2	30570	4.0	0.0	4.0
+chr2	30573	0.0	1.0	1.0
+chr2	30575	1.0	0.0	1.0
+chr2	30579	2.0	0.0	2.0
+chr2	30580	1.0	0.0	1.0
+chr2	30592	0.0	2.0	2.0
+chr2	30593	0.0	2.0	2.0
+chr2	30594	0.0	1.0	1.0
+chr2	30595	1.0	0.0	1.0
+chr2	30598	2.0	0.0	2.0
+chr2	30599	1.0	0.0	1.0
+chr2	30600	3.0	0.0	3.0
+chr2	30601	0.0	2.0	2.0
+chr2	30605	5.0	0.0	5.0
+chr2	30606	3.0	1.0	4.0
+chr2	30611	1.0	0.0	1.0
+chr2	30613	0.0	2.0	2.0
+chr2	30615	1.0	1.0	2.0
+chr2	30618	0.0	4.0	4.0
+chr2	30619	1.0	2.0	3.0
+chr2	30620	3.0	0.0	3.0
+chr2	30625	1.0	3.0	4.0
+chr2	30626	0.0	1.0	1.0
+chr2	30629	0.0	1.0	1.0
+chr2	30630	0.0	1.0	1.0
+chr2	30632	1.0	0.0	1.0
+chr2	30633	0.0	3.0	3.0
+chr2	30634	1.0	0.0	1.0
+chr2	30637	0.0	1.0	1.0
+chr2	30640	1.0	1.0	2.0
+chr2	30641	0.0	1.0	1.0
+chr2	30642	0.0	1.0	1.0
+chr2	30652	3.0	0.0	3.0
+chr2	30656	1.0	0.0	1.0
+chr2	30667	1.0	0.0	1.0
+chr2	30703	0.0	1.0	1.0
+chr2	30705	1.0	0.0	1.0
+chr2	30707	0.0	1.0	1.0
+chr2	30709	0.0	1.0	1.0
+chr2	30714	1.0	0.0	1.0
+chr2	30718	0.0	1.0	1.0
+chr2	30726	0.0	1.0	1.0
+chr2	30727	1.0	0.0	1.0
+chr2	30730	1.0	0.0	1.0
+chr2	30732	1.0	0.0	1.0
+chr2	30736	0.0	1.0	1.0
+chr2	30737	0.0	1.0	1.0
+chr2	30738	0.0	1.0	1.0
+chr2	30739	1.0	0.0	1.0
+chr2	30743	0.0	1.0	1.0
+chr2	30745	0.0	1.0	1.0
+chr2	30747	0.0	1.0	1.0
+chr2	30748	1.0	2.0	3.0
+chr2	30749	2.0	2.0	4.0
+chr2	30755	3.0	0.0	3.0
+chr2	30757	1.0	1.0	2.0
+chr2	30765	0.0	1.0	1.0
+chr2	30767	0.0	3.0	3.0
+chr2	30768	1.0	1.0	2.0
+chr2	30774	0.0	1.0	1.0
+chr2	30775	3.0	0.0	3.0
+chr2	30776	0.0	1.0	1.0
+chr2	30777	2.0	0.0	2.0
+chr2	30778	0.0	1.0	1.0
+chr2	30779	1.0	1.0	2.0
+chr2	30780	1.0	0.0	1.0
+chr2	30781	1.0	3.0	4.0
+chr2	30782	0.0	1.0	1.0
+chr2	30783	1.0	0.0	1.0
+chr2	30784	4.0	0.0	4.0
+chr2	30787	0.0	1.0	1.0
+chr2	30789	1.0	0.0	1.0
+chr2	30792	3.0	0.0	3.0
+chr2	30794	4.0	0.0	4.0
+chr2	30796	0.0	5.0	5.0
+chr2	30797	3.0	0.0	3.0
+chr2	30801	1.0	0.0	1.0
+chr2	30802	5.0	0.0	5.0
+chr2	30803	0.0	1.0	1.0
+chr2	30805	0.0	2.0	2.0
+chr2	30807	1.0	1.0	2.0
+chr2	30814	1.0	0.0	1.0
+chr2	30817	2.0	0.0	2.0
+chr2	30822	0.0	1.0	1.0
+chr2	30836	1.0	0.0	1.0
+chr2	30846	0.0	1.0	1.0
+chr2	30859	0.0	2.0	2.0
+chr2	30860	1.0	1.0	2.0
+chr2	30861	1.0	0.0	1.0
+chr2	30863	3.0	0.0	3.0
+chr2	30871	0.0	1.0	1.0
+chr2	30872	0.0	2.0	2.0
+chr2	30877	0.0	2.0	2.0
+chr2	30878	1.0	0.0	1.0
+chr2	30884	0.0	1.0	1.0
+chr2	30886	2.0	0.0	2.0
+chr2	30888	3.0	0.0	3.0
+chr2	30889	1.0	0.0	1.0
+chr2	30892	0.0	2.0	2.0
+chr2	30893	0.0	1.0	1.0
+chr2	30896	2.0	0.0	2.0
+chr2	30904	0.0	1.0	1.0
+chr2	30905	1.0	0.0	1.0
+chr2	30906	0.0	1.0	1.0
+chr2	30915	1.0	1.0	2.0
+chr2	30920	1.0	0.0	1.0
+chr2	30924	1.0	0.0	1.0
+chr2	30925	0.0	1.0	1.0
+chr2	30930	3.0	0.0	3.0
+chr2	30931	1.0	0.0	1.0
+chr2	30936	1.0	0.0	1.0
+chr2	30937	1.0	0.0	1.0
+chr2	30943	1.0	1.0	2.0
+chr2	30944	0.0	1.0	1.0
+chr2	30945	1.0	0.0	1.0
+chr2	30946	0.0	1.0	1.0
+chr2	30948	0.0	1.0	1.0
+chr2	30959	1.0	0.0	1.0
+chr2	30960	1.0	0.0	1.0
+chr2	30963	0.0	1.0	1.0
+chr2	30965	0.0	1.0	1.0
+chr2	30970	2.0	0.0	2.0
+chr2	30971	0.0	2.0	2.0
+chr2	30972	0.0	1.0	1.0
+chr2	30975	1.0	0.0	1.0
+chr2	30980	0.0	1.0	1.0
+chr2	30989	1.0	0.0	1.0
+chr2	30993	1.0	0.0	1.0
+chr2	31016	0.0	1.0	1.0
+chr2	31032	1.0	0.0	1.0
+chr2	31033	3.0	0.0	3.0
+chr2	31050	0.0	2.0	2.0
+chr2	31053	1.0	0.0	1.0
+chr2	31058	0.0	3.0	3.0
+chr2	31061	1.0	0.0	1.0
+chr2	31063	1.0	2.0	3.0
+chr2	31067	0.0	1.0	1.0
+chr2	31069	0.0	1.0	1.0
+chr2	31071	1.0	0.0	1.0
+chr2	31078	1.0	0.0	1.0
+chr2	31080	1.0	0.0	1.0
+chr2	31081	3.0	1.0	4.0
+chr2	31082	0.0	1.0	1.0
+chr2	31083	1.0	2.0	3.0
+chr2	31086	0.0	5.0	5.0
+chr2	31091	2.0	0.0	2.0
+chr2	31092	1.0	0.0	1.0
+chr2	31093	0.0	2.0	2.0
+chr2	31096	0.0	1.0	1.0
+chr2	31097	0.0	1.0	1.0
+chr2	31098	2.0	0.0	2.0
+chr2	31099	2.0	1.0	3.0
+chr2	31102	5.0	8.0	13.0
+chr2	31103	3.0	0.0	3.0
+chr2	31104	1.0	0.0	1.0
+chr2	31106	2.0	1.0	3.0
+chr2	31109	2.0	0.0	2.0
+chr2	31110	0.0	1.0	1.0
+chr2	31111	0.0	2.0	2.0
+chr2	31112	0.0	1.0	1.0
+chr2	31113	0.0	2.0	2.0
+chr2	31114	2.0	0.0	2.0
+chr2	31115	0.0	1.0	1.0
+chr2	31118	2.0	0.0	2.0
+chr2	31120	0.0	2.0	2.0
+chr2	31122	0.0	1.0	1.0
+chr2	31127	1.0	0.0	1.0
+chr2	31132	0.0	2.0	2.0
+chr2	31133	0.0	1.0	1.0
+chr2	31134	1.0	0.0	1.0
+chr2	31137	0.0	1.0	1.0
+chr2	31141	1.0	1.0	2.0
+chr2	31144	0.0	1.0	1.0
+chr2	31150	0.0	1.0	1.0
+chr2	31151	3.0	0.0	3.0
+chr2	31157	2.0	0.0	2.0
+chr2	31160	0.0	1.0	1.0
+chr2	31165	1.0	2.0	3.0
+chr2	31166	2.0	0.0	2.0
+chr2	31220	0.0	1.0	1.0
+chr2	31223	1.0	0.0	1.0
+chr2	31234	1.0	0.0	1.0
+chr2	31240	0.0	1.0	1.0
+chr2	31246	3.0	0.0	3.0
+chr2	31248	1.0	0.0	1.0
+chr2	31251	1.0	0.0	1.0
+chr2	31253	1.0	0.0	1.0
+chr2	31255	0.0	1.0	1.0
+chr2	31257	0.0	1.0	1.0
+chr2	31265	0.0	1.0	1.0
+chr2	31268	0.0	1.0	1.0
+chr2	31269	1.0	0.0	1.0
+chr2	31271	2.0	0.0	2.0
+chr2	31273	1.0	0.0	1.0
+chr2	31274	8.0	0.0	8.0
+chr2	31278	0.0	1.0	1.0
+chr2	31279	3.0	0.0	3.0
+chr2	31281	0.0	2.0	2.0
+chr2	31282	0.0	2.0	2.0
+chr2	31283	4.0	0.0	4.0
+chr2	31288	0.0	5.0	5.0
+chr2	31289	0.0	1.0	1.0
+chr2	31291	1.0	0.0	1.0
+chr2	31292	0.0	1.0	1.0
+chr2	31295	0.0	3.0	3.0
+chr2	31296	0.0	4.0	4.0
+chr2	31298	1.0	0.0	1.0
+chr2	31305	0.0	1.0	1.0
+chr2	31313	1.0	0.0	1.0
+chr2	31314	0.0	2.0	2.0
+chr2	31320	1.0	0.0	1.0
+chr2	31321	2.0	0.0	2.0
+chr2	31322	0.0	1.0	1.0
+chr2	31325	0.0	1.0	1.0
+chr2	31328	0.0	1.0	1.0
+chr2	31335	0.0	1.0	1.0
+chr2	31337	2.0	0.0	2.0
+chr2	31345	1.0	0.0	1.0
+chr2	31348	0.0	3.0	3.0
+chr2	31352	1.0	0.0	1.0
+chr2	31356	1.0	0.0	1.0
+chr2	31373	1.0	0.0	1.0
+chr2	31383	0.0	1.0	1.0
+chr2	31386	2.0	1.0	3.0
+chr2	31408	0.0	1.0	1.0
+chr2	31411	0.0	1.0	1.0
+chr2	31416	1.0	0.0	1.0
+chr2	31418	1.0	0.0	1.0
+chr2	31424	1.0	2.0	3.0
+chr2	31446	0.0	1.0	1.0
+chr2	31448	1.0	1.0	2.0
+chr2	31450	1.0	0.0	1.0
+chr2	31451	1.0	0.0	1.0
+chr2	31457	1.0	0.0	1.0
+chr2	31471	0.0	1.0	1.0
+chr2	31483	0.0	1.0	1.0
+chr2	31484	1.0	0.0	1.0
+chr2	31490	1.0	0.0	1.0
+chr2	31495	1.0	0.0	1.0
+chr2	31496	0.0	1.0	1.0
+chr2	31508	0.0	1.0	1.0
+chr2	31516	0.0	1.0	1.0
+chr2	31542	0.0	1.0	1.0
+chr2	31560	0.0	1.0	1.0
+chr2	31579	2.0	0.0	2.0
+chr2	31604	0.0	1.0	1.0
+chr2	31617	0.0	1.0	1.0
+chr2	31671	0.0	1.0	1.0
+chr2	31674	0.0	1.0	1.0
+chr2	31681	0.0	1.0	1.0
+chr2	31684	1.0	0.0	1.0
+chr2	31696	0.0	1.0	1.0
+chr2	31726	1.0	1.0	2.0
+chr2	31740	4.0	0.0	4.0
+chr2	31741	1.0	0.0	1.0
+chr2	31743	0.0	1.0	1.0
+chr2	31747	0.0	2.0	2.0
+chr2	31778	5.0	0.0	5.0
+chr2	31787	0.0	1.0	1.0
+chr2	31795	1.0	0.0	1.0
+chr2	31815	0.0	1.0	1.0
+chr2	31826	0.0	1.0	1.0
+chr2	31827	0.0	1.0	1.0
+chr2	31857	1.0	0.0	1.0
+chr2	31863	2.0	0.0	2.0
+chr2	31872	0.0	2.0	2.0
+chr2	31878	1.0	0.0	1.0
+chr2	31885	1.0	0.0	1.0
+chr2	31890	1.0	0.0	1.0
+chr2	31897	1.0	0.0	1.0
+chr2	31899	0.0	5.0	5.0
+chr2	31902	1.0	1.0	2.0
+chr2	31915	2.0	0.0	2.0
+chr2	31916	1.0	0.0	1.0
+chr2	31918	1.0	0.0	1.0
+chr2	31920	0.0	2.0	2.0
+chr2	31955	0.0	1.0	1.0
+chr2	31966	3.0	0.0	3.0
+chr2	31978	1.0	0.0	1.0
+chr2	31991	0.0	1.0	1.0
+chr2	32007	3.0	0.0	3.0
+chr2	32039	0.0	1.0	1.0
+chr2	32057	1.0	0.0	1.0
+chr2	32059	1.0	0.0	1.0
+chr2	32063	1.0	0.0	1.0
+chr2	32071	0.0	1.0	1.0
+chr2	32077	0.0	1.0	1.0
+chr2	32083	2.0	0.0	2.0
+chr2	32084	0.0	1.0	1.0
+chr2	32095	0.0	1.0	1.0
+chr2	32105	1.0	0.0	1.0
+chr2	32122	0.0	1.0	1.0
+chr2	32160	1.0	0.0	1.0
+chr2	32170	0.0	1.0	1.0
+chr2	32174	1.0	0.0	1.0
+chr2	32178	0.0	1.0	1.0
+chr2	32194	1.0	0.0	1.0
+chr2	32219	0.0	1.0	1.0
+chr2	32223	0.0	1.0	1.0
+chr2	32226	1.0	0.0	1.0
+chr2	32228	0.0	3.0	3.0
+chr2	32232	0.0	1.0	1.0
+chr2	32236	1.0	0.0	1.0
+chr2	32239	0.0	1.0	1.0
+chr2	32253	0.0	1.0	1.0
+chr2	32258	2.0	0.0	2.0
+chr2	32259	0.0	1.0	1.0
+chr2	32269	1.0	0.0	1.0
+chr2	32330	2.0	0.0	2.0
+chr2	32332	0.0	3.0	3.0
+chr2	32344	1.0	0.0	1.0
+chr2	32355	1.0	0.0	1.0
+chr2	32377	0.0	1.0	1.0
+chr2	32416	1.0	0.0	1.0
+chr2	32418	1.0	0.0	1.0
+chr2	32422	1.0	0.0	1.0
+chr2	32435	0.0	1.0	1.0
+chr2	32438	0.0	2.0	2.0
+chr2	32440	0.0	1.0	1.0
+chr2	32442	1.0	0.0	1.0
+chr2	32443	0.0	1.0	1.0
+chr2	32446	0.0	1.0	1.0
+chr2	32449	0.0	1.0	1.0
+chr2	32450	0.0	1.0	1.0
+chr2	32453	0.0	1.0	1.0
+chr2	32493	0.0	1.0	1.0
+chr2	32495	0.0	2.0	2.0
+chr2	32508	0.0	1.0	1.0
+chr2	32536	1.0	0.0	1.0
+chr2	32540	0.0	1.0	1.0
+chr2	32541	0.0	1.0	1.0
+chr2	32546	2.0	0.0	2.0
+chr2	32552	1.0	0.0	1.0
+chr2	32578	0.0	1.0	1.0
+chr2	32604	0.0	1.0	1.0
+chr2	32632	0.0	1.0	1.0
+chr2	32674	1.0	0.0	1.0
+chr2	32719	0.0	1.0	1.0
+chr2	32795	0.0	1.0	1.0
+chr2	32801	0.0	1.0	1.0
+chr2	32820	0.0	1.0	1.0
+chr2	32888	2.0	0.0	2.0
+chr2	32895	2.0	0.0	2.0
+chr2	32933	1.0	0.0	1.0
+chr2	32955	1.0	0.0	1.0
+chr2	32956	1.0	0.0	1.0
+chr2	33015	2.0	0.0	2.0
+chr2	33044	1.0	0.0	1.0
+chr2	33045	1.0	0.0	1.0
+chr2	33046	0.0	1.0	1.0
+chr2	33066	0.0	2.0	2.0
+chr2	33079	0.0	1.0	1.0
+chr2	33133	0.0	1.0	1.0
+chr2	33168	2.0	0.0	2.0
+chr2	33178	0.0	1.0	1.0
+chr2	33194	0.0	1.0	1.0
+chr2	33197	1.0	0.0	1.0
+chr2	33212	4.0	0.0	4.0
+chr2	33259	0.0	1.0	1.0
+chr2	33261	0.0	1.0	1.0
+chr2	33282	1.0	0.0	1.0
+chr2	33295	1.0	0.0	1.0
+chr2	33326	1.0	0.0	1.0
+chr2	33327	1.0	0.0	1.0
+chr2	33391	1.0	0.0	1.0
+chr2	33434	1.0	0.0	1.0
+chr2	33447	0.0	1.0	1.0
+chr2	33449	0.0	1.0	1.0
+chr2	33451	1.0	0.0	1.0
+chr2	33530	1.0	0.0	1.0
+chr2	33558	0.0	1.0	1.0
+chr2	33563	1.0	0.0	1.0
+chr2	33565	1.0	0.0	1.0
+chr2	33579	2.0	0.0	2.0
+chr2	33580	0.0	1.0	1.0
+chr2	33604	1.0	0.0	1.0
+chr2	33609	1.0	0.0	1.0
+chr2	33615	0.0	1.0	1.0
+chr2	33627	1.0	0.0	1.0
+chr2	33651	1.0	0.0	1.0
+chr2	33706	1.0	0.0	1.0
+chr2	33719	0.0	1.0	1.0
+chr2	33740	0.0	1.0	1.0
+chr2	33797	1.0	0.0	1.0
+chr2	33816	1.0	0.0	1.0
+chr2	33849	1.0	0.0	1.0
+chr2	33867	1.0	0.0	1.0
+chr2	33875	0.0	1.0	1.0
+chr2	33880	0.0	1.0	1.0
+chr2	33882	1.0	0.0	1.0
+chr2	33894	1.0	0.0	1.0
+chr2	33903	0.0	1.0	1.0
+chr2	33909	0.0	1.0	1.0
+chr2	33928	1.0	0.0	1.0
+chr2	33929	1.0	0.0	1.0
+chr2	33935	1.0	1.0	2.0
+chr2	33944	0.0	2.0	2.0
+chr2	33945	2.0	0.0	2.0
+chr2	33946	1.0	0.0	1.0
+chr2	33951	1.0	0.0	1.0
+chr2	33955	0.0	1.0	1.0
+chr2	33958	1.0	0.0	1.0
+chr2	33995	2.0	0.0	2.0
+chr2	34011	1.0	0.0	1.0
+chr2	34018	1.0	0.0	1.0
+chr2	34035	1.0	0.0	1.0
+chr2	34061	0.0	1.0	1.0
+chr2	34078	0.0	1.0	1.0
+chr2	34086	2.0	0.0	2.0
+chr2	34135	1.0	0.0	1.0
+chr2	34136	1.0	0.0	1.0
+chr2	34137	1.0	0.0	1.0
+chr2	34139	1.0	0.0	1.0
+chr2	34140	0.0	1.0	1.0
+chr2	34145	0.0	2.0	2.0
+chr2	34193	0.0	1.0	1.0
+chr2	34201	1.0	0.0	1.0
+chr2	34213	0.0	1.0	1.0
+chr2	34228	1.0	0.0	1.0
+chr2	34263	0.0	1.0	1.0
+chr2	34266	0.0	1.0	1.0
+chr2	34268	1.0	0.0	1.0
+chr2	34271	1.0	0.0	1.0
+chr2	34287	0.0	1.0	1.0
+chr2	34397	0.0	1.0	1.0
+chr2	34413	0.0	1.0	1.0
+chr2	34417	1.0	0.0	1.0
+chr2	34436	2.0	0.0	2.0
+chr2	34437	1.0	0.0	1.0
+chr2	34447	0.0	1.0	1.0
+chr2	34449	1.0	0.0	1.0
+chr2	34457	1.0	0.0	1.0
+chr2	34473	0.0	1.0	1.0
+chr2	34475	1.0	0.0	1.0
+chr2	34485	0.0	1.0	1.0
+chr2	34488	1.0	1.0	2.0
+chr2	34492	0.0	1.0	1.0
+chr2	34499	1.0	0.0	1.0
+chr2	34504	1.0	0.0	1.0
+chr2	34510	0.0	1.0	1.0
+chr2	34516	1.0	0.0	1.0
+chr2	34518	0.0	1.0	1.0
+chr2	34526	0.0	1.0	1.0
+chr2	34528	2.0	0.0	2.0
+chr2	34532	0.0	2.0	2.0
+chr2	34539	1.0	0.0	1.0
+chr2	34540	1.0	0.0	1.0
+chr2	34568	0.0	1.0	1.0
+chr2	34575	1.0	0.0	1.0
+chr2	34576	1.0	0.0	1.0
+chr2	34597	1.0	0.0	1.0
+chr2	34607	0.0	1.0	1.0
+chr2	34636	1.0	0.0	1.0
+chr2	34670	1.0	0.0	1.0
+chr2	34673	0.0	1.0	1.0
+chr2	34702	0.0	1.0	1.0
+chr2	34707	0.0	1.0	1.0
+chr2	34711	0.0	1.0	1.0
+chr2	34720	1.0	0.0	1.0
+chr2	34737	0.0	1.0	1.0
+chr2	34751	1.0	0.0	1.0
+chr2	34760	1.0	0.0	1.0
+chr2	34774	2.0	0.0	2.0
+chr2	34780	1.0	1.0	2.0
+chr2	34792	1.0	0.0	1.0
+chr2	34824	3.0	0.0	3.0
+chr2	34826	1.0	0.0	1.0
+chr2	34868	0.0	2.0	2.0
+chr2	34869	0.0	1.0	1.0
+chr2	34874	1.0	0.0	1.0
+chr2	34888	2.0	0.0	2.0
+chr2	34889	1.0	0.0	1.0
+chr2	34902	1.0	0.0	1.0
+chr2	34910	0.0	1.0	1.0
+chr2	34946	0.0	1.0	1.0
+chr2	34952	3.0	0.0	3.0
+chr2	34969	1.0	0.0	1.0
+chr2	34979	2.0	0.0	2.0
+chr2	34989	0.0	1.0	1.0
+chr2	34994	1.0	0.0	1.0
+chr2	35009	1.0	0.0	1.0
+chr2	35036	0.0	1.0	1.0
+chr2	35037	1.0	0.0	1.0
+chr2	35044	1.0	0.0	1.0
+chr2	35112	1.0	0.0	1.0
+chr2	35146	1.0	0.0	1.0
+chr2	35147	0.0	1.0	1.0
+chr2	35169	0.0	1.0	1.0
+chr2	35173	0.0	2.0	2.0
+chr2	35178	1.0	0.0	1.0
+chr2	35195	2.0	0.0	2.0
+chr2	35198	0.0	1.0	1.0
+chr2	35201	0.0	1.0	1.0
+chr2	35224	0.0	1.0	1.0
+chr2	35289	0.0	1.0	1.0
+chr2	35292	0.0	1.0	1.0
+chr2	35293	0.0	1.0	1.0
+chr2	35297	0.0	2.0	2.0
+chr2	35317	0.0	1.0	1.0
+chr2	35327	0.0	1.0	1.0
+chr2	35328	0.0	3.0	3.0
+chr2	35329	0.0	1.0	1.0
+chr2	35332	0.0	3.0	3.0
+chr2	35333	0.0	6.0	6.0
+chr2	35338	0.0	1.0	1.0
+chr2	35341	6.0	0.0	6.0
+chr2	35343	0.0	1.0	1.0
+chr2	35344	1.0	1.0	2.0
+chr2	35345	0.0	4.0	4.0
+chr2	35347	0.0	2.0	2.0
+chr2	35348	0.0	1.0	1.0
+chr2	35351	0.0	5.0	5.0
+chr2	35355	1.0	0.0	1.0
+chr2	35362	1.0	0.0	1.0
+chr2	35365	1.0	0.0	1.0
+chr2	35374	0.0	1.0	1.0
+chr2	35375	1.0	0.0	1.0
+chr2	35377	0.0	1.0	1.0
+chr2	35382	1.0	0.0	1.0
+chr2	35386	0.0	1.0	1.0
+chr2	35387	1.0	0.0	1.0
+chr2	35389	0.0	1.0	1.0
+chr2	35390	1.0	1.0	2.0
+chr2	35392	1.0	0.0	1.0
+chr2	35395	1.0	0.0	1.0
+chr2	35397	2.0	0.0	2.0
+chr2	35402	1.0	0.0	1.0
+chr2	35403	1.0	0.0	1.0
+chr2	35404	1.0	0.0	1.0
+chr2	35406	2.0	0.0	2.0
+chr2	35408	0.0	1.0	1.0
+chr2	35437	2.0	0.0	2.0
+chr2	35464	0.0	1.0	1.0
+chr2	35486	1.0	0.0	1.0
+chr2	35496	0.0	1.0	1.0
+chr2	35503	0.0	1.0	1.0
+chr2	35512	0.0	2.0	2.0
+chr2	35523	0.0	1.0	1.0
+chr2	35526	0.0	1.0	1.0
+chr2	35527	0.0	1.0	1.0
+chr2	35531	2.0	0.0	2.0
+chr2	35538	3.0	0.0	3.0
+chr2	35542	2.0	0.0	2.0
+chr2	35545	1.0	0.0	1.0
+chr2	35546	1.0	0.0	1.0
+chr2	35548	2.0	0.0	2.0
+chr2	35550	5.0	0.0	5.0
+chr2	35556	3.0	0.0	3.0
+chr2	35564	1.0	0.0	1.0
+chr2	35565	1.0	0.0	1.0
+chr2	35569	1.0	0.0	1.0
+chr2	35570	1.0	0.0	1.0
+chr2	35575	1.0	0.0	1.0
+chr2	35576	1.0	0.0	1.0
+chr2	35580	1.0	0.0	1.0
+chr2	35581	1.0	0.0	1.0
+chr2	35679	0.0	1.0	1.0
+chr2	35693	1.0	0.0	1.0
+chr2	35703	0.0	1.0	1.0
+chr2	35721	1.0	0.0	1.0
+chr2	35730	0.0	2.0	2.0
+chr2	35910	0.0	1.0	1.0
+chr2	35953	2.0	0.0	2.0
+chr2	35969	1.0	0.0	1.0
+chr2	35976	0.0	1.0	1.0
+chr2	35988	1.0	0.0	1.0
+chr2	35995	0.0	1.0	1.0
+chr2	36003	3.0	0.0	3.0
+chr2	36004	2.0	0.0	2.0
+chr2	36020	0.0	1.0	1.0
+chr2	36021	0.0	1.0	1.0
+chr2	36025	0.0	2.0	2.0
+chr2	36031	1.0	0.0	1.0
+chr2	36035	0.0	1.0	1.0
+chr2	36043	3.0	0.0	3.0
+chr2	36044	1.0	2.0	3.0
+chr2	36046	1.0	0.0	1.0
+chr2	36050	0.0	1.0	1.0
+chr2	36052	0.0	2.0	2.0
+chr2	36055	0.0	1.0	1.0
+chr2	36059	1.0	0.0	1.0
+chr2	36060	0.0	1.0	1.0
+chr2	36061	0.0	2.0	2.0
+chr2	36062	1.0	0.0	1.0
+chr2	36063	1.0	0.0	1.0
+chr2	36064	3.0	0.0	3.0
+chr2	36065	0.0	1.0	1.0
+chr2	36067	0.0	4.0	4.0
+chr2	36069	4.0	0.0	4.0
+chr2	36070	0.0	3.0	3.0
+chr2	36071	4.0	1.0	5.0
+chr2	36072	4.0	0.0	4.0
+chr2	36073	0.0	3.0	3.0
+chr2	36074	0.0	1.0	1.0
+chr2	36076	0.0	2.0	2.0
+chr2	36085	1.0	0.0	1.0
+chr2	36087	2.0	1.0	3.0
+chr2	36088	0.0	1.0	1.0
+chr2	36092	0.0	3.0	3.0
+chr2	36097	4.0	1.0	5.0
+chr2	36100	2.0	0.0	2.0
+chr2	36104	1.0	0.0	1.0
+chr2	36107	0.0	1.0	1.0
+chr2	36108	1.0	0.0	1.0
+chr2	36110	1.0	0.0	1.0
+chr2	36118	1.0	0.0	1.0
+chr2	36123	0.0	1.0	1.0
+chr2	36124	1.0	0.0	1.0
+chr2	36127	0.0	1.0	1.0
+chr2	36133	1.0	0.0	1.0
+chr2	36141	1.0	0.0	1.0
+chr2	36142	0.0	2.0	2.0
+chr2	36145	0.0	3.0	3.0
+chr2	36155	1.0	0.0	1.0
+chr2	36167	1.0	0.0	1.0
+chr2	36168	1.0	0.0	1.0
+chr2	36172	4.0	0.0	4.0
+chr2	36176	1.0	0.0	1.0
+chr2	36184	1.0	0.0	1.0
+chr2	36194	1.0	0.0	1.0
+chr2	36208	3.0	0.0	3.0
+chr2	36214	1.0	0.0	1.0
+chr2	36228	1.0	1.0	2.0
+chr2	36235	1.0	1.0	2.0
+chr2	36238	0.0	1.0	1.0
+chr2	36244	0.0	1.0	1.0
+chr2	36262	0.0	1.0	1.0
+chr2	36765	2.0	0.0	2.0
+chr2	36768	0.0	1.0	1.0
+chr2	36772	0.0	2.0	2.0
+chr2	36958	1.0	0.0	1.0
+chr2	37105	0.0	1.0	1.0
+chr2	37118	0.0	1.0	1.0
+chr2	37804	1.0	0.0	1.0
+chr2	37805	2.0	0.0	2.0
+chr2	37832	1.0	0.0	1.0
+chr2	38104	0.0	1.0	1.0
+chr2	39144	0.0	1.0	1.0
+chr2	39160	0.0	1.0	1.0
+chr2	39162	1.0	0.0	1.0
+chr2	39163	0.0	1.0	1.0
+chr2	39164	0.0	2.0	2.0
+chr2	39166	1.0	0.0	1.0
+chr2	39167	1.0	0.0	1.0
+chr2	39174	1.0	0.0	1.0
+chr2	39181	2.0	0.0	2.0
+chr2	39187	2.0	0.0	2.0
+chr2	39192	0.0	1.0	1.0
+chr2	39195	0.0	3.0	3.0
+chr2	39330	1.0	0.0	1.0
+chr2	39363	0.0	1.0	1.0
+chr2	39369	1.0	0.0	1.0
+chr2	39377	0.0	1.0	1.0
+chr2	39422	1.0	0.0	1.0
+chr2	39490	0.0	1.0	1.0
+chr2	39491	0.0	2.0	2.0
+chr2	39501	0.0	1.0	1.0
+chr2	39658	0.0	1.0	1.0
+chr2	39674	0.0	1.0	1.0
+chr2	39703	1.0	0.0	1.0
+chr2	39797	1.0	0.0	1.0
+chr2	39802	1.0	0.0	1.0
+chr2	39810	1.0	0.0	1.0
+chr2	39817	0.0	1.0	1.0
+chr2	39821	1.0	0.0	1.0
+chr2	39832	0.0	1.0	1.0
+chr2	39859	0.0	1.0	1.0
+chr2	39873	0.0	1.0	1.0
+chr2	39990	0.0	1.0	1.0
+chr2	40014	1.0	0.0	1.0
+chr2	40022	0.0	1.0	1.0
+chr2	40024	3.0	0.0	3.0
+chr2	40031	0.0	1.0	1.0
+chr2	40032	0.0	2.0	2.0
+chr2	40040	1.0	0.0	1.0
+chr2	40043	3.0	0.0	3.0
+chr2	40044	3.0	0.0	3.0
+chr2	40046	0.0	3.0	3.0
+chr2	40047	0.0	4.0	4.0
+chr2	40049	1.0	0.0	1.0
+chr2	40071	0.0	1.0	1.0
+chr2	40072	1.0	0.0	1.0
+chr2	40073	0.0	1.0	1.0
+chr2	40126	1.0	0.0	1.0
+chr2	40199	2.0	0.0	2.0
+chr2	40227	1.0	0.0	1.0
+chr2	40358	1.0	0.0	1.0
+chr2	40487	1.0	0.0	1.0
+chr2	40491	0.0	1.0	1.0
+chr2	40492	0.0	2.0	2.0
+chr2	40506	0.0	1.0	1.0
+chr2	40508	0.0	2.0	2.0
+chr2	40511	2.0	0.0	2.0
+chr2	40515	0.0	1.0	1.0
+chr2	40519	1.0	0.0	1.0
+chr2	40521	1.0	0.0	1.0
+chr2	40522	1.0	0.0	1.0
+chr2	40525	2.0	0.0	2.0
+chr2	40526	2.0	0.0	2.0
+chr2	40545	1.0	0.0	1.0
+chr2	40758	0.0	1.0	1.0
+chr2	40776	1.0	0.0	1.0
+chr2	40794	1.0	1.0	2.0
+chr2	40795	2.0	0.0	2.0
+chr2	40799	1.0	0.0	1.0
+chr2	40801	0.0	2.0	2.0
+chr2	40804	0.0	2.0	2.0
+chr2	40805	1.0	2.0	3.0
+chr2	40806	0.0	1.0	1.0
+chr2	40810	1.0	0.0	1.0
+chr2	40811	1.0	0.0	1.0
+chr2	40813	1.0	0.0	1.0
+chr2	40815	0.0	2.0	2.0
+chr2	40817	1.0	0.0	1.0
+chr2	40818	1.0	1.0	2.0
+chr2	40821	0.0	1.0	1.0
+chr2	40826	4.0	0.0	4.0
+chr2	40837	1.0	0.0	1.0
+chr2	40966	0.0	1.0	1.0
+chr2	40970	1.0	0.0	1.0
+chr2	40980	0.0	2.0	2.0
+chr2	40982	1.0	0.0	1.0
+chr2	40999	1.0	0.0	1.0
+chr2	41001	0.0	1.0	1.0
+chr2	41116	1.0	0.0	1.0
+chr2	41117	0.0	1.0	1.0
+chr2	41118	0.0	1.0	1.0
+chr2	41140	0.0	1.0	1.0
+chr2	41156	1.0	0.0	1.0
+chr2	41312	0.0	1.0	1.0
+chr2	41452	1.0	0.0	1.0
+chr2	41469	1.0	0.0	1.0
+chr2	41941	0.0	1.0	1.0
+chr2	42071	1.0	0.0	1.0
+chr2	42199	1.0	0.0	1.0
+chr2	42445	1.0	0.0	1.0
+chr2	42451	0.0	1.0	1.0
+chr2	42542	1.0	0.0	1.0
+chr2	42580	1.0	0.0	1.0
+chr2	42671	1.0	0.0	1.0
+chr2	42817	1.0	0.0	1.0
+chr2	42844	1.0	0.0	1.0
+chr2	42845	1.0	0.0	1.0
+chr2	42858	1.0	0.0	1.0
+chr2	42881	1.0	0.0	1.0
+chr2	42972	0.0	1.0	1.0
+chr2	42988	1.0	0.0	1.0
+chr2	42991	0.0	1.0	1.0
+chr2	43004	0.0	1.0	1.0
+chr2	43010	1.0	0.0	1.0
+chr2	43016	0.0	2.0	2.0
+chr2	43025	1.0	0.0	1.0
+chr2	43026	1.0	2.0	3.0
+chr2	43029	0.0	2.0	2.0
+chr2	43268	0.0	1.0	1.0
+chr2	43288	0.0	1.0	1.0
+chr2	43302	1.0	0.0	1.0
+chr2	43303	1.0	0.0	1.0
+chr2	43307	0.0	3.0	3.0
+chr2	43309	2.0	0.0	2.0
+chr2	43319	0.0	1.0	1.0
+chr2	43322	0.0	2.0	2.0
+chr2	43326	0.0	1.0	1.0
+chr2	43469	0.0	1.0	1.0
+chr2	43470	1.0	0.0	1.0
+chr2	43475	1.0	0.0	1.0
+chr2	43657	0.0	1.0	1.0
+chr2	43882	0.0	1.0	1.0
+chr2	44275	0.0	1.0	1.0
+chr2	44460	0.0	1.0	1.0
+chr2	44468	1.0	0.0	1.0
+chr2	44512	0.0	1.0	1.0
+chr2	44609	1.0	0.0	1.0
+chr2	44750	0.0	1.0	1.0
+chr2	44816	1.0	0.0	1.0
+chr2	44841	0.0	1.0	1.0
+chr2	44865	0.0	1.0	1.0
+chr2	44949	1.0	0.0	1.0
+chr2	44969	1.0	0.0	1.0
+chr2	44972	1.0	0.0	1.0
+chr2	44976	0.0	3.0	3.0
+chr2	44977	0.0	2.0	2.0
+chr2	44983	0.0	1.0	1.0
+chr2	44985	1.0	0.0	1.0
+chr2	44993	1.0	0.0	1.0
+chr2	44996	0.0	1.0	1.0
+chr2	45000	1.0	0.0	1.0
+chr2	45005	1.0	0.0	1.0
+chr2	45009	0.0	2.0	2.0
+chr2	45022	2.0	0.0	2.0
+chr2	45027	1.0	0.0	1.0
+chr2	45763	1.0	0.0	1.0
+chr2	45766	1.0	0.0	1.0
+chr2	45827	0.0	1.0	1.0
+chr2	46060	0.0	1.0	1.0
+chr2	46120	0.0	1.0	1.0
+chr2	46576	1.0	0.0	1.0
+chr2	46618	1.0	0.0	1.0
+chr2	46620	1.0	2.0	3.0
+chr2	46627	0.0	2.0	2.0
+chr2	46632	1.0	0.0	1.0
+chr2	46637	0.0	1.0	1.0
+chr2	46639	0.0	1.0	1.0
+chr2	46645	1.0	0.0	1.0
+chr2	46646	1.0	0.0	1.0
+chr2	46684	1.0	0.0	1.0
+chr2	46764	1.0	0.0	1.0
+chr2	46786	1.0	0.0	1.0
+chr2	46787	0.0	1.0	1.0
+chr2	46802	0.0	1.0	1.0
+chr2	46811	2.0	0.0	2.0
+chr2	46818	0.0	1.0	1.0
+chr2	46823	1.0	0.0	1.0
+chr2	46825	1.0	0.0	1.0
+chr2	46963	0.0	1.0	1.0
+chr2	46965	1.0	0.0	1.0
+chr2	46989	1.0	1.0	2.0
+chr2	47113	1.0	0.0	1.0
+chr2	47121	1.0	0.0	1.0
+chr2	47122	2.0	1.0	3.0
+chr2	47123	0.0	1.0	1.0
+chr2	47128	0.0	1.0	1.0
+chr2	47129	0.0	1.0	1.0
+chr2	47134	0.0	1.0	1.0
+chr2	47137	1.0	0.0	1.0
+chr2	47138	0.0	1.0	1.0
+chr2	47142	0.0	1.0	1.0
+chr2	47145	3.0	0.0	3.0
+chr2	47149	2.0	0.0	2.0
+chr2	47150	1.0	0.0	1.0
+chr2	47164	2.0	1.0	3.0
+chr2	47176	0.0	1.0	1.0
+chr2	47376	0.0	1.0	1.0
+chr2	47379	2.0	0.0	2.0
+chr2	47396	1.0	0.0	1.0
+chr2	47401	1.0	0.0	1.0
+chr2	47424	1.0	0.0	1.0
+chr2	47486	1.0	0.0	1.0
+chr2	47547	1.0	0.0	1.0
+chr2	47634	1.0	0.0	1.0
+chr2	48259	1.0	0.0	1.0
+chr2	48407	0.0	1.0	1.0
+chr2	48427	1.0	0.0	1.0
+chr2	48466	1.0	0.0	1.0
+chr2	48574	0.0	1.0	1.0
+chr2	48575	0.0	1.0	1.0
+chr2	48577	0.0	1.0	1.0
+chr2	48578	1.0	0.0	1.0
+chr2	48583	1.0	0.0	1.0
+chr2	48585	1.0	0.0	1.0
+chr2	48586	1.0	0.0	1.0
+chr2	48587	2.0	0.0	2.0
+chr2	48588	2.0	0.0	2.0
+chr2	48600	0.0	1.0	1.0
+chr2	48602	0.0	7.0	7.0
+chr2	48603	0.0	1.0	1.0
+chr2	48609	1.0	0.0	1.0
+chr2	48617	0.0	1.0	1.0
+chr2	48618	0.0	1.0	1.0
+chr2	48631	0.0	1.0	1.0
+chr2	48647	1.0	0.0	1.0
+chr2	48660	0.0	1.0	1.0
+chr2	48775	0.0	1.0	1.0
+chr2	48790	0.0	1.0	1.0
+chr2	48820	1.0	0.0	1.0
+chr2	48826	0.0	1.0	1.0
+chr2	48835	0.0	1.0	1.0
+chr2	48837	3.0	0.0	3.0
+chr2	48839	6.0	0.0	6.0
+chr2	48840	0.0	1.0	1.0
+chr2	48841	0.0	4.0	4.0
+chr2	48844	0.0	3.0	3.0
+chr2	48850	1.0	0.0	1.0
+chr2	48852	1.0	6.0	7.0
+chr2	48856	1.0	0.0	1.0
+chr2	48858	1.0	0.0	1.0
+chr2	48859	0.0	1.0	1.0
+chr2	48860	1.0	0.0	1.0
+chr2	48861	1.0	0.0	1.0
+chr2	48864	0.0	1.0	1.0
+chr2	48887	1.0	0.0	1.0
+chr2	48893	1.0	0.0	1.0
+chr2	48905	0.0	1.0	1.0
+chr2	48995	1.0	0.0	1.0
+chr2	49002	1.0	0.0	1.0
+chr2	49016	0.0	1.0	1.0
+chr2	49029	0.0	1.0	1.0
+chr2	49030	1.0	0.0	1.0
+chr2	49031	0.0	2.0	2.0
+chr2	49037	0.0	1.0	1.0
+chr2	49039	0.0	1.0	1.0
+chr2	49092	1.0	0.0	1.0
+chr2	49209	0.0	1.0	1.0
+chr2	49233	1.0	0.0	1.0
+chr2	49340	1.0	0.0	1.0
+chr2	49342	0.0	1.0	1.0
+chr2	49353	0.0	1.0	1.0
+chr2	49356	1.0	0.0	1.0
+chr2	49357	2.0	0.0	2.0
+chr2	49360	1.0	0.0	1.0
+chr2	49361	1.0	0.0	1.0
+chr2	49365	0.0	2.0	2.0
+chr2	49367	2.0	0.0	2.0
+chr2	49370	1.0	0.0	1.0
+chr2	49372	1.0	1.0	2.0
+chr2	49373	2.0	0.0	2.0
+chr2	49374	0.0	1.0	1.0
+chr2	49375	0.0	3.0	3.0
+chr2	49376	0.0	1.0	1.0
+chr2	49377	0.0	3.0	3.0
+chr2	49389	0.0	1.0	1.0
+chr2	49398	1.0	0.0	1.0
+chr2	49557	1.0	0.0	1.0
+chr2	49566	1.0	0.0	1.0
+chr2	49579	0.0	3.0	3.0
+chr2	49582	1.0	0.0	1.0
+chr2	49583	2.0	0.0	2.0
+chr2	49584	2.0	0.0	2.0
+chr2	49589	6.0	0.0	6.0
+chr2	49592	1.0	0.0	1.0
+chr2	49594	0.0	1.0	1.0
+chr2	49595	0.0	1.0	1.0
+chr2	49597	0.0	1.0	1.0
+chr2	49600	1.0	0.0	1.0
+chr2	49604	0.0	1.0	1.0
+chr2	49607	0.0	4.0	4.0
+chr2	49610	4.0	3.0	7.0
+chr2	49612	2.0	0.0	2.0
+chr2	49616	0.0	1.0	1.0
+chr2	49619	1.0	0.0	1.0
+chr2	49629	0.0	2.0	2.0
+chr2	49632	0.0	1.0	1.0
+chr2	49686	1.0	0.0	1.0
+chr2	49757	1.0	0.0	1.0
+chr2	49764	0.0	1.0	1.0
+chr2	49767	0.0	2.0	2.0
+chr2	49778	1.0	0.0	1.0
+chr2	49787	1.0	1.0	2.0
+chr2	49922	1.0	0.0	1.0
+chr2	49928	0.0	1.0	1.0
+chr2	49956	0.0	1.0	1.0
+chr2	49997	0.0	1.0	1.0
+chr2	50010	1.0	0.0	1.0
+chr2	50172	0.0	2.0	2.0
+chr2	50201	1.0	0.0	1.0
+chr2	50253	1.0	0.0	1.0
+chr2	50284	0.0	1.0	1.0
+chr2	50353	1.0	0.0	1.0
+chr2	50380	1.0	0.0	1.0
+chr2	50425	1.0	0.0	1.0
+chr2	50641	1.0	0.0	1.0
+chr2	50648	1.0	0.0	1.0
+chr2	50661	0.0	1.0	1.0
+chr2	50665	1.0	0.0	1.0
+chr2	50702	1.0	0.0	1.0
+chr2	50711	0.0	1.0	1.0
+chr2	50719	0.0	1.0	1.0
+chr2	50917	0.0	1.0	1.0
+chr2	51498	1.0	0.0	1.0
+chr2	51534	1.0	0.0	1.0
+chr2	51541	0.0	1.0	1.0
+chr2	51548	0.0	1.0	1.0
+chr2	51572	1.0	0.0	1.0
+chr2	51821	0.0	2.0	2.0
+chr2	52094	0.0	1.0	1.0
+chr2	52331	1.0	0.0	1.0
+chr2	53387	0.0	1.0	1.0
+chr2	54022	1.0	0.0	1.0
+chr2	55628	1.0	0.0	1.0
+chr2	55754	2.0	0.0	2.0
+chr2	55897	1.0	0.0	1.0
+chr2	55939	1.0	0.0	1.0
+chr2	56479	1.0	0.0	1.0
+chr2	56609	2.0	0.0	2.0
+chr2	56687	1.0	0.0	1.0
+chr2	56942	1.0	0.0	1.0
+chr2	57371	1.0	0.0	1.0
+chr2	57616	1.0	0.0	1.0
+chr2	57636	0.0	1.0	1.0
+chr2	58160	1.0	0.0	1.0
+chr2	58991	0.0	1.0	1.0
+chr2	59076	1.0	0.0	1.0
+chr2	59174	1.0	0.0	1.0
+chr2	59188	1.0	0.0	1.0
+chr2	59193	3.0	0.0	3.0
+chr2	59209	0.0	1.0	1.0
+chr2	59223	1.0	1.0	2.0
+chr2	59278	0.0	1.0	1.0
+chr2	59285	4.0	0.0	4.0
+chr2	59289	1.0	0.0	1.0
+chr2	59322	1.0	0.0	1.0
+chr2	59331	0.0	1.0	1.0
+chr2	59333	0.0	1.0	1.0
+chr2	59355	1.0	0.0	1.0
+chr2	59356	0.0	1.0	1.0
+chr2	59366	1.0	0.0	1.0
+chr2	59379	0.0	1.0	1.0
+chr2	59380	0.0	1.0	1.0
+chr2	59384	0.0	1.0	1.0
+chr2	59389	0.0	2.0	2.0
+chr2	59390	1.0	0.0	1.0
+chr2	59392	1.0	0.0	1.0
+chr2	59407	0.0	1.0	1.0
+chr2	59415	1.0	0.0	1.0
+chr2	59452	0.0	1.0	1.0
+chr2	59504	1.0	0.0	1.0
+chr2	59538	0.0	1.0	1.0
+chr2	59539	1.0	0.0	1.0
+chr2	59555	0.0	1.0	1.0
+chr2	59557	0.0	1.0	1.0
+chr2	59558	0.0	1.0	1.0
+chr2	59561	1.0	0.0	1.0
+chr2	59565	1.0	0.0	1.0
+chr2	59853	1.0	0.0	1.0
+chr2	59879	0.0	1.0	1.0
+chr2	59881	0.0	1.0	1.0
+chr2	59902	1.0	0.0	1.0
+chr2	61220	1.0	0.0	1.0
+chr2	61229	2.0	0.0	2.0
+chr2	61233	0.0	1.0	1.0
+chr2	61234	0.0	2.0	2.0
+chr2	61383	1.0	0.0	1.0
+chr2	61386	0.0	1.0	1.0
+chr2	61389	1.0	0.0	1.0
+chr2	61410	0.0	1.0	1.0
+chr2	61419	1.0	0.0	1.0
+chr2	61524	1.0	0.0	1.0
+chr2	61543	0.0	1.0	1.0
+chr2	61692	1.0	0.0	1.0
+chr2	61733	1.0	0.0	1.0
+chr2	62000	1.0	0.0	1.0
+chr2	62106	0.0	1.0	1.0
+chr2	62291	1.0	0.0	1.0
+chr2	62292	0.0	1.0	1.0
+chr2	62297	1.0	0.0	1.0
+chr2	62307	1.0	0.0	1.0
+chr2	62313	1.0	0.0	1.0
+chr2	62380	0.0	1.0	1.0
+chr2	62440	0.0	1.0	1.0
+chr2	62449	1.0	2.0	3.0
+chr2	62451	1.0	0.0	1.0
+chr2	62452	2.0	0.0	2.0
+chr2	62455	5.0	0.0	5.0
+chr2	62459	0.0	2.0	2.0
+chr2	62460	0.0	1.0	1.0
+chr2	62461	2.0	0.0	2.0
+chr2	62465	0.0	1.0	1.0
+chr2	62468	0.0	2.0	2.0
+chr2	62470	0.0	5.0	5.0
+chr2	62474	0.0	1.0	1.0
+chr2	62477	1.0	0.0	1.0
+chr2	62478	3.0	0.0	3.0
+chr2	62480	0.0	2.0	2.0
+chr2	62481	1.0	0.0	1.0
+chr2	62485	1.0	1.0	2.0
+chr2	62486	0.0	1.0	1.0
+chr2	62488	1.0	0.0	1.0
+chr2	62489	0.0	1.0	1.0
+chr2	62503	1.0	0.0	1.0
+chr2	62505	0.0	1.0	1.0
+chr2	62616	0.0	1.0	1.0
+chr2	62621	1.0	0.0	1.0
+chr2	62622	0.0	1.0	1.0
+chr2	62626	1.0	0.0	1.0
+chr2	62629	1.0	0.0	1.0
+chr2	62637	2.0	0.0	2.0
+chr2	62645	1.0	0.0	1.0
+chr2	62647	0.0	2.0	2.0
+chr2	62667	2.0	0.0	2.0
+chr2	62678	1.0	0.0	1.0
+chr2	62698	1.0	0.0	1.0
+chr2	62895	1.0	0.0	1.0
+chr2	62925	1.0	0.0	1.0
+chr2	63109	0.0	1.0	1.0
+chr2	63189	1.0	0.0	1.0
+chr2	63191	1.0	0.0	1.0
+chr2	63204	0.0	2.0	2.0
+chr2	63472	0.0	1.0	1.0
+chr2	63506	1.0	0.0	1.0
+chr2	63542	0.0	1.0	1.0
+chr2	63683	0.0	1.0	1.0
+chr2	63701	0.0	1.0	1.0
+chr2	63702	1.0	0.0	1.0
+chr2	63703	1.0	0.0	1.0
+chr2	63706	1.0	0.0	1.0
+chr2	63711	0.0	1.0	1.0
+chr2	63717	0.0	2.0	2.0
+chr2	63720	3.0	0.0	3.0
+chr2	63726	0.0	1.0	1.0
+chr2	63728	1.0	0.0	1.0
+chr2	63731	0.0	1.0	1.0
+chr2	63738	1.0	0.0	1.0
+chr2	63739	2.0	1.0	3.0
+chr2	63741	3.0	0.0	3.0
+chr2	63745	0.0	1.0	1.0
+chr2	63748	0.0	1.0	1.0
+chr2	63779	1.0	0.0	1.0
+chr2	63821	1.0	0.0	1.0
+chr2	63879	0.0	1.0	1.0
+chr2	63894	0.0	2.0	2.0
+chr2	63896	0.0	1.0	1.0
+chr2	63974	1.0	0.0	1.0
+chr2	64067	1.0	0.0	1.0
+chr2	64187	1.0	0.0	1.0
+chr2	64230	0.0	1.0	1.0
+chr2	64280	0.0	1.0	1.0
+chr2	64360	1.0	0.0	1.0
+chr2	64398	1.0	0.0	1.0
+chr2	65002	0.0	2.0	2.0
+chr2	65554	0.0	1.0	1.0
+chr2	66714	1.0	0.0	1.0
+chr2	66740	1.0	0.0	1.0
+chr2	66952	1.0	0.0	1.0
+chr2	67227	0.0	1.0	1.0
+chr2	67266	0.0	1.0	1.0
+chr2	67325	0.0	1.0	1.0
+chr2	67616	0.0	1.0	1.0
+chr2	67780	0.0	1.0	1.0
+chr2	68607	1.0	0.0	1.0
+chr2	69045	1.0	0.0	1.0
+chr2	69141	0.0	1.0	1.0
+chr2	69148	1.0	1.0	2.0
+chr2	69152	2.0	0.0	2.0
+chr2	69171	0.0	1.0	1.0
+chr2	69179	1.0	0.0	1.0
+chr2	69204	1.0	0.0	1.0
+chr2	69299	0.0	1.0	1.0
+chr2	69304	1.0	0.0	1.0
+chr2	69305	0.0	1.0	1.0
+chr2	69306	1.0	0.0	1.0
+chr2	69313	0.0	1.0	1.0
+chr2	69314	0.0	1.0	1.0
+chr2	69320	1.0	0.0	1.0
+chr2	69324	0.0	1.0	1.0
+chr2	69328	0.0	1.0	1.0
+chr2	69333	0.0	1.0	1.0
+chr2	69349	0.0	3.0	3.0
+chr2	69356	1.0	0.0	1.0
+chr2	69367	0.0	1.0	1.0
+chr2	69460	1.0	0.0	1.0
+chr2	69461	0.0	1.0	1.0
+chr2	69464	1.0	0.0	1.0
+chr2	69466	0.0	1.0	1.0
+chr2	69471	1.0	0.0	1.0
+chr2	69477	2.0	0.0	2.0
+chr2	69478	0.0	1.0	1.0
+chr2	69479	0.0	2.0	2.0
+chr2	69481	1.0	0.0	1.0
+chr2	69488	0.0	2.0	2.0
+chr2	69497	0.0	2.0	2.0
+chr2	69501	1.0	0.0	1.0
+chr2	69507	3.0	0.0	3.0
+chr2	69513	0.0	1.0	1.0
+chr2	69514	1.0	0.0	1.0
+chr2	69516	0.0	2.0	2.0
+chr2	69517	0.0	1.0	1.0
+chr2	69524	1.0	0.0	1.0
+chr2	69528	1.0	0.0	1.0
+chr2	69534	1.0	0.0	1.0
+chr2	69770	0.0	1.0	1.0
+chr2	69772	3.0	0.0	3.0
+chr2	69774	1.0	0.0	1.0
+chr2	69779	0.0	1.0	1.0
+chr2	69793	1.0	0.0	1.0
+chr2	69801	1.0	0.0	1.0
+chr2	70114	1.0	0.0	1.0
+chr2	70507	0.0	1.0	1.0
+chr2	70508	0.0	1.0	1.0
+chr2	70511	1.0	0.0	1.0
+chr2	70683	1.0	0.0	1.0
+chr2	70790	2.0	0.0	2.0
+chr2	70797	0.0	2.0	2.0
+chr2	70813	1.0	1.0	2.0
+chr2	70825	0.0	1.0	1.0
+chr2	70826	0.0	1.0	1.0
+chr2	70935	1.0	0.0	1.0
+chr2	70954	1.0	0.0	1.0
+chr2	70984	0.0	1.0	1.0
+chr2	71092	0.0	2.0	2.0
+chr2	71095	3.0	0.0	3.0
+chr2	71100	1.0	0.0	1.0
+chr2	71109	1.0	0.0	1.0
+chr2	71110	4.0	0.0	4.0
+chr2	71111	1.0	0.0	1.0
+chr2	71112	2.0	0.0	2.0
+chr2	71113	0.0	3.0	3.0
+chr2	71114	1.0	0.0	1.0
+chr2	71115	1.0	0.0	1.0
+chr2	71116	0.0	4.0	4.0
+chr2	71117	0.0	1.0	1.0
+chr2	71118	1.0	0.0	1.0
+chr2	71119	0.0	2.0	2.0
+chr2	71120	0.0	1.0	1.0
+chr2	71121	0.0	3.0	3.0
+chr2	71124	1.0	0.0	1.0
+chr2	71127	1.0	1.0	2.0
+chr2	71128	1.0	0.0	1.0
+chr2	71131	0.0	1.0	1.0
+chr2	71134	0.0	1.0	1.0
+chr2	71136	0.0	1.0	1.0
+chr2	71140	1.0	0.0	1.0
+chr2	71145	0.0	1.0	1.0
+chr2	71161	0.0	1.0	1.0
+chr2	71166	0.0	1.0	1.0
+chr2	71168	1.0	0.0	1.0
+chr2	71169	0.0	1.0	1.0
+chr2	71292	1.0	0.0	1.0
+chr2	71314	1.0	0.0	1.0
+chr2	71333	0.0	1.0	1.0
+chr2	71334	0.0	2.0	2.0
+chr2	71335	0.0	1.0	1.0
+chr2	71341	8.0	5.0	13.0
+chr2	71343	3.0	0.0	3.0
+chr2	71346	1.0	3.0	4.0
+chr2	71350	0.0	1.0	1.0
+chr2	71352	0.0	1.0	1.0
+chr2	71353	1.0	0.0	1.0
+chr2	71357	0.0	2.0	2.0
+chr2	71360	2.0	0.0	2.0
+chr2	71362	0.0	3.0	3.0
+chr2	71372	0.0	4.0	4.0
+chr2	71376	1.0	0.0	1.0
+chr2	71381	1.0	0.0	1.0
+chr2	71382	1.0	0.0	1.0
+chr2	71398	1.0	0.0	1.0
+chr2	71402	1.0	0.0	1.0
+chr2	71589	0.0	1.0	1.0
+chr2	71603	1.0	0.0	1.0
+chr2	71604	2.0	0.0	2.0
+chr2	71606	0.0	2.0	2.0
+chr2	71608	0.0	1.0	1.0
+chr2	71623	1.0	0.0	1.0
+chr2	71625	0.0	1.0	1.0
+chr2	71628	0.0	3.0	3.0
+chr2	71652	0.0	1.0	1.0
+chr2	71731	1.0	0.0	1.0
+chr2	71945	0.0	1.0	1.0
+chr2	71968	1.0	0.0	1.0
+chr2	72753	0.0	1.0	1.0
+chr2	72773	2.0	0.0	2.0
+chr2	72987	0.0	1.0	1.0
+chr2	73651	2.0	0.0	2.0
+chr2	73671	0.0	1.0	1.0
+chr2	73860	1.0	0.0	1.0
+chr2	73962	1.0	0.0	1.0
+chr2	74031	0.0	1.0	1.0
+chr2	74070	1.0	0.0	1.0
+chr2	74180	1.0	0.0	1.0
+chr2	74182	1.0	0.0	1.0
+chr2	74198	1.0	0.0	1.0
+chr2	74199	0.0	1.0	1.0
+chr2	74252	0.0	1.0	1.0
+chr2	74346	1.0	0.0	1.0
+chr2	74347	1.0	0.0	1.0
+chr2	74352	0.0	1.0	1.0
+chr2	74353	0.0	1.0	1.0
+chr2	74369	2.0	1.0	3.0
+chr2	74413	0.0	1.0	1.0
+chr2	74417	1.0	0.0	1.0
+chr2	74457	0.0	1.0	1.0
+chr2	74479	1.0	0.0	1.0
+chr2	74485	0.0	1.0	1.0
+chr2	74502	0.0	1.0	1.0
+chr2	74510	0.0	1.0	1.0
+chr2	74513	0.0	1.0	1.0
+chr2	74520	2.0	0.0	2.0
+chr2	74531	0.0	2.0	2.0
+chr2	74534	0.0	1.0	1.0
+chr2	74536	0.0	1.0	1.0
+chr2	74565	1.0	0.0	1.0
+chr2	74568	0.0	2.0	2.0
+chr2	74663	1.0	0.0	1.0
+chr2	74669	0.0	1.0	1.0
+chr2	74670	1.0	0.0	1.0
+chr2	74682	1.0	0.0	1.0
+chr2	74686	0.0	1.0	1.0
+chr2	74687	2.0	0.0	2.0
+chr2	74688	0.0	4.0	4.0
+chr2	74689	5.0	0.0	5.0
+chr2	74696	1.0	0.0	1.0
+chr2	74698	2.0	0.0	2.0
+chr2	74699	2.0	0.0	2.0
+chr2	74703	0.0	1.0	1.0
+chr2	74707	0.0	5.0	5.0
+chr2	74708	0.0	4.0	4.0
+chr2	74712	1.0	0.0	1.0
+chr2	74719	1.0	1.0	2.0
+chr2	74725	1.0	0.0	1.0
+chr2	74730	1.0	0.0	1.0
+chr2	74748	1.0	0.0	1.0
+chr2	74927	0.0	1.0	1.0
+chr2	74945	0.0	1.0	1.0
+chr2	74958	1.0	0.0	1.0
+chr2	74960	1.0	0.0	1.0
+chr2	74963	0.0	1.0	1.0
+chr2	74964	1.0	0.0	1.0
+chr2	74966	0.0	1.0	1.0
+chr2	74967	1.0	1.0	2.0
+chr2	74968	4.0	0.0	4.0
+chr2	74970	1.0	0.0	1.0
+chr2	74972	0.0	1.0	1.0
+chr2	74978	0.0	2.0	2.0
+chr2	74980	0.0	1.0	1.0
+chr2	74998	1.0	0.0	1.0
+chr2	75215	1.0	0.0	1.0
+chr2	75222	1.0	0.0	1.0
+chr2	75227	0.0	1.0	1.0
+chr2	75229	1.0	4.0	5.0
+chr2	75230	0.0	1.0	1.0
+chr2	75231	1.0	0.0	1.0
+chr2	75232	3.0	0.0	3.0
+chr2	75234	1.0	1.0	2.0
+chr2	75235	0.0	1.0	1.0
+chr2	75236	1.0	1.0	2.0
+chr2	75237	4.0	1.0	5.0
+chr2	75238	0.0	1.0	1.0
+chr2	75239	2.0	0.0	2.0
+chr2	75241	0.0	3.0	3.0
+chr2	75242	1.0	0.0	1.0
+chr2	75243	0.0	1.0	1.0
+chr2	75246	1.0	0.0	1.0
+chr2	75247	1.0	0.0	1.0
+chr2	75256	1.0	0.0	1.0
+chr2	75257	0.0	2.0	2.0
+chr2	75258	0.0	1.0	1.0
+chr2	75259	0.0	2.0	2.0
+chr2	75395	0.0	1.0	1.0
+chr2	75407	1.0	0.0	1.0
+chr2	75408	1.0	0.0	1.0
+chr2	75411	2.0	0.0	2.0
+chr2	75412	1.0	0.0	1.0
+chr2	75415	3.0	0.0	3.0
+chr2	75417	0.0	3.0	3.0
+chr2	75421	1.0	0.0	1.0
+chr2	75425	0.0	1.0	1.0
+chr2	75426	0.0	1.0	1.0
+chr2	75450	0.0	1.0	1.0
+chr2	75495	1.0	0.0	1.0
+chr2	75589	2.0	0.0	2.0
+chr2	75595	0.0	1.0	1.0
+chr2	75674	1.0	0.0	1.0
+chr2	75698	0.0	1.0	1.0
+chr2	75717	1.0	0.0	1.0
+chr2	75940	1.0	0.0	1.0
+chr2	76480	0.0	1.0	1.0
+chr2	76490	0.0	1.0	1.0
+chr2	76897	1.0	0.0	1.0
+chr2	77260	0.0	2.0	2.0
+chr2	77442	1.0	0.0	1.0
+chr2	77464	0.0	1.0	1.0
+chr2	77668	1.0	0.0	1.0
+chr2	77866	1.0	0.0	1.0
+chr2	78827	0.0	1.0	1.0
+chr2	78941	1.0	0.0	1.0
+chr2	79666	1.0	0.0	1.0
+chr2	80159	0.0	1.0	1.0
+chr2	80360	0.0	1.0	1.0
+chr2	80419	0.0	1.0	1.0
+chr2	80522	1.0	0.0	1.0
+chr2	80534	1.0	0.0	1.0
+chr2	80544	1.0	0.0	1.0
+chr2	80551	0.0	3.0	3.0
+chr2	80557	1.0	0.0	1.0
+chr2	80559	0.0	2.0	2.0
+chr2	80560	1.0	0.0	1.0
+chr2	80561	5.0	0.0	5.0
+chr2	80566	1.0	2.0	3.0
+chr2	80574	0.0	1.0	1.0
+chr2	80576	1.0	0.0	1.0
+chr2	80653	0.0	1.0	1.0
+chr2	80665	0.0	1.0	1.0
+chr2	80681	1.0	0.0	1.0
+chr2	80697	0.0	3.0	3.0
+chr2	80712	2.0	0.0	2.0
+chr2	80717	1.0	0.0	1.0
+chr2	80723	2.0	0.0	2.0
+chr2	80726	1.0	0.0	1.0
+chr2	80733	0.0	1.0	1.0
+chr2	80735	0.0	1.0	1.0
+chr2	80747	0.0	1.0	1.0
+chr2	81183	1.0	0.0	1.0
+chr2	81329	0.0	1.0	1.0
+chr2	81950	2.0	0.0	2.0
+chr2	82733	1.0	0.0	1.0
+chr2	84065	0.0	1.0	1.0
+chr2	84069	1.0	0.0	1.0
+chr2	84075	1.0	0.0	1.0
+chr2	84077	1.0	0.0	1.0
+chr2	84082	0.0	1.0	1.0
+chr2	84083	0.0	1.0	1.0
+chr2	84089	1.0	0.0	1.0
+chr2	84208	0.0	1.0	1.0
+chr2	84214	1.0	0.0	1.0
+chr2	84216	0.0	1.0	1.0
+chr2	84236	0.0	1.0	1.0
+chr2	84245	0.0	1.0	1.0
+chr2	84280	1.0	0.0	1.0
+chr2	84542	1.0	0.0	1.0
+chr2	84551	0.0	1.0	1.0
+chr2	84557	0.0	1.0	1.0
+chr2	84560	1.0	8.0	9.0
+chr2	84561	0.0	1.0	1.0
+chr2	84562	0.0	1.0	1.0
+chr2	84563	1.0	0.0	1.0
+chr2	84568	4.0	1.0	5.0
+chr2	84569	2.0	0.0	2.0
+chr2	84570	1.0	3.0	4.0
+chr2	84573	2.0	0.0	2.0
+chr2	84574	2.0	4.0	6.0
+chr2	84575	0.0	1.0	1.0
+chr2	84580	0.0	5.0	5.0
+chr2	84584	1.0	0.0	1.0
+chr2	84588	3.0	0.0	3.0
+chr2	84597	0.0	2.0	2.0
+chr2	84630	0.0	1.0	1.0
+chr2	84653	1.0	0.0	1.0
+chr2	84711	1.0	0.0	1.0
+chr2	84726	0.0	1.0	1.0
+chr2	84738	0.0	1.0	1.0
+chr2	84743	2.0	0.0	2.0
+chr2	84754	1.0	0.0	1.0
+chr2	84764	1.0	0.0	1.0
+chr2	84888	1.0	0.0	1.0
+chr2	84903	0.0	1.0	1.0
+chr2	84912	1.0	0.0	1.0
+chr2	84921	0.0	1.0	1.0
+chr2	84933	0.0	1.0	1.0
+chr2	85076	0.0	2.0	2.0
+chr2	85087	0.0	1.0	1.0
+chr2	85102	0.0	1.0	1.0
+chr2	85256	1.0	0.0	1.0
+chr2	85272	2.0	0.0	2.0
+chr2	85283	0.0	1.0	1.0
+chr2	85537	1.0	0.0	1.0
+chr2	85828	1.0	0.0	1.0
+chr2	85831	1.0	0.0	1.0
+chr2	86027	1.0	0.0	1.0
+chr2	86386	1.0	0.0	1.0
+chr2	86956	1.0	0.0	1.0
+chr2	87045	1.0	0.0	1.0
+chr2	87090	1.0	0.0	1.0
+chr2	87225	1.0	0.0	1.0
+chr2	87459	1.0	0.0	1.0
+chr2	87583	0.0	1.0	1.0
+chr2	87590	1.0	0.0	1.0
+chr2	87593	1.0	0.0	1.0
+chr2	87601	0.0	1.0	1.0
+chr2	87624	0.0	1.0	1.0
+chr2	87731	1.0	0.0	1.0
+chr2	87735	1.0	0.0	1.0
+chr2	87736	1.0	0.0	1.0
+chr2	87739	1.0	0.0	1.0
+chr2	87751	1.0	0.0	1.0
+chr2	87765	1.0	0.0	1.0
+chr2	87772	3.0	0.0	3.0
+chr2	87774	1.0	0.0	1.0
+chr2	87780	0.0	1.0	1.0
+chr2	87784	0.0	1.0	1.0
+chr2	87785	0.0	1.0	1.0
+chr2	87789	0.0	1.0	1.0
+chr2	87790	0.0	2.0	2.0
+chr2	87797	1.0	0.0	1.0
+chr2	87804	0.0	1.0	1.0
+chr2	88002	0.0	1.0	1.0
+chr2	88035	0.0	1.0	1.0
+chr2	88113	0.0	1.0	1.0
+chr2	88922	0.0	1.0	1.0
+chr2	89112	1.0	0.0	1.0
+chr2	89122	1.0	0.0	1.0
+chr2	89442	0.0	1.0	1.0
+chr2	89969	1.0	0.0	1.0
+chr2	89971	1.0	0.0	1.0
+chr2	89974	0.0	1.0	1.0
+chr2	89988	0.0	1.0	1.0
+chr2	89989	1.0	0.0	1.0
+chr2	89991	2.0	0.0	2.0
+chr2	89997	0.0	1.0	1.0
+chr2	90001	0.0	1.0	1.0
+chr2	90013	2.0	0.0	2.0
+chr2	90025	1.0	0.0	1.0
+chr2	90034	1.0	0.0	1.0
+chr2	90125	0.0	1.0	1.0
+chr2	90169	0.0	1.0	1.0
+chr2	90387	1.0	0.0	1.0
+chr2	90439	0.0	1.0	1.0
+chr2	90443	0.0	1.0	1.0
+chr2	90445	1.0	0.0	1.0
+chr2	90447	0.0	1.0	1.0
+chr2	90476	2.0	0.0	2.0
+chr2	90485	0.0	1.0	1.0
+chr2	90684	1.0	0.0	1.0
+chr2	90698	1.0	0.0	1.0
+chr2	90706	2.0	1.0	3.0
+chr2	90719	0.0	1.0	1.0
+chr2	90721	0.0	3.0	3.0
+chr2	90723	2.0	0.0	2.0
+chr2	90727	1.0	0.0	1.0
+chr2	90741	0.0	1.0	1.0
+chr2	90742	0.0	2.0	2.0
+chr2	90744	1.0	0.0	1.0
+chr2	90762	1.0	0.0	1.0
+chr2	90832	0.0	2.0	2.0
+chr2	90853	2.0	0.0	2.0
+chr2	90861	0.0	1.0	1.0
+chr2	90868	1.0	0.0	1.0
+chr2	90870	1.0	0.0	1.0
+chr2	90888	1.0	0.0	1.0
+chr2	91023	1.0	0.0	1.0
+chr2	91195	0.0	1.0	1.0
+chr2	91367	1.0	0.0	1.0
+chr2	91401	2.0	0.0	2.0
+chr2	91503	0.0	3.0	3.0
+chr2	91529	0.0	2.0	2.0
+chr2	91652	0.0	1.0	1.0
+chr2	91841	0.0	1.0	1.0
+chr2	91994	0.0	1.0	1.0
+chr2	92003	0.0	2.0	2.0
+chr2	92014	1.0	0.0	1.0
+chr2	92134	0.0	1.0	1.0
+chr2	92144	1.0	0.0	1.0
+chr2	92145	0.0	1.0	1.0
+chr2	92146	0.0	1.0	1.0
+chr2	92147	1.0	0.0	1.0
+chr2	92149	0.0	2.0	2.0
+chr2	92150	1.0	0.0	1.0
+chr2	92151	0.0	1.0	1.0
+chr2	92154	0.0	3.0	3.0
+chr2	92155	0.0	1.0	1.0
+chr2	92157	0.0	1.0	1.0
+chr2	92158	2.0	0.0	2.0
+chr2	92159	1.0	0.0	1.0
+chr2	92160	2.0	0.0	2.0
+chr2	92161	2.0	0.0	2.0
+chr2	92166	0.0	2.0	2.0
+chr2	92167	0.0	1.0	1.0
+chr2	92171	1.0	3.0	4.0
+chr2	92179	0.0	1.0	1.0
+chr2	92190	0.0	1.0	1.0
+chr2	92269	0.0	1.0	1.0
+chr2	92320	2.0	0.0	2.0
+chr2	92401	1.0	0.0	1.0
+chr2	92402	2.0	0.0	2.0
+chr2	92403	0.0	1.0	1.0
+chr2	92407	1.0	1.0	2.0
+chr2	92408	2.0	0.0	2.0
+chr2	92414	1.0	0.0	1.0
+chr2	92417	2.0	0.0	2.0
+chr2	92418	0.0	1.0	1.0
+chr2	92421	1.0	3.0	4.0
+chr2	92429	0.0	2.0	2.0
+chr2	92430	0.0	1.0	1.0
+chr2	92436	1.0	0.0	1.0
+chr2	92440	0.0	1.0	1.0
+chr2	92474	1.0	0.0	1.0
+chr2	92553	0.0	1.0	1.0
+chr2	92568	0.0	1.0	1.0
+chr2	92572	2.0	0.0	2.0
+chr2	92573	0.0	1.0	1.0
+chr2	92580	0.0	1.0	1.0
+chr2	92583	1.0	0.0	1.0
+chr2	92587	1.0	0.0	1.0
+chr2	92757	1.0	0.0	1.0
+chr2	92972	0.0	1.0	1.0
+chr2	93003	0.0	1.0	1.0
+chr2	93153	1.0	0.0	1.0
+chr2	93162	1.0	0.0	1.0
+chr2	93196	1.0	0.0	1.0
+chr2	93198	1.0	0.0	1.0
+chr2	93363	0.0	1.0	1.0
+chr2	93366	0.0	1.0	1.0
+chr2	93369	1.0	0.0	1.0
+chr2	93980	0.0	1.0	1.0
+chr2	94430	0.0	1.0	1.0
+chr2	94442	2.0	0.0	2.0
+chr2	95307	0.0	1.0	1.0
+chr2	95343	0.0	1.0	1.0
+chr2	95446	0.0	2.0	2.0
+chr2	95768	0.0	1.0	1.0
+chr2	95932	0.0	1.0	1.0
+chr2	95934	0.0	1.0	1.0
+chr2	95935	2.0	0.0	2.0
+chr2	95936	0.0	1.0	1.0
+chr2	96086	0.0	4.0	4.0
+chr2	96092	0.0	1.0	1.0
+chr2	96100	1.0	0.0	1.0
+chr2	96101	1.0	0.0	1.0
+chr2	96104	1.0	0.0	1.0
+chr2	96114	0.0	1.0	1.0
+chr2	96358	2.0	0.0	2.0
+chr2	96528	0.0	1.0	1.0
+chr2	96728	0.0	1.0	1.0
+chr2	96754	1.0	0.0	1.0
+chr2	97206	0.0	1.0	1.0
+chr2	97544	2.0	0.0	2.0
+chr2	98177	0.0	1.0	1.0
+chr2	98409	1.0	0.0	1.0
+chr2	98981	0.0	1.0	1.0
+chr2	99180	0.0	2.0	2.0
+chr2	99363	1.0	0.0	1.0
+chr2	99410	0.0	1.0	1.0
+chr2	99622	0.0	1.0	1.0
+chr2	99659	1.0	0.0	1.0
+chr2	99774	0.0	1.0	1.0
+chr2	99777	1.0	0.0	1.0
+chr2	99937	1.0	0.0	1.0
+chr2	99956	0.0	1.0	1.0
+chr2	99962	0.0	1.0	1.0
+chr2	99965	0.0	1.0	1.0
+chr2	99969	1.0	0.0	1.0
+chr2	99979	1.0	0.0	1.0
+chr2	99995	1.0	0.0	1.0
+chr2	100006	1.0	0.0	1.0
+chr2	100072	0.0	1.0	1.0
+chr2	100085	1.0	0.0	1.0
+chr2	100092	0.0	2.0	2.0
+chr2	100093	0.0	1.0	1.0
+chr2	100098	0.0	1.0	1.0
+chr2	100099	1.0	0.0	1.0
+chr2	100100	0.0	1.0	1.0
+chr2	100102	1.0	0.0	1.0
+chr2	100106	1.0	0.0	1.0
+chr2	100113	1.0	0.0	1.0
+chr2	100114	3.0	0.0	3.0
+chr2	100118	0.0	3.0	3.0
+chr2	100119	1.0	0.0	1.0
+chr2	100120	0.0	4.0	4.0
+chr2	100122	1.0	1.0	2.0
+chr2	100131	0.0	1.0	1.0
+chr2	100156	1.0	0.0	1.0
+chr2	100390	0.0	1.0	1.0
+chr2	100394	1.0	0.0	1.0
+chr2	100416	0.0	2.0	2.0
+chr2	100445	0.0	1.0	1.0
+chr2	100558	0.0	1.0	1.0
+chr2	100582	0.0	2.0	2.0
+chr2	100694	0.0	1.0	1.0
+chr2	100781	0.0	1.0	1.0
+chr2	100827	0.0	1.0	1.0
+chr2	100837	2.0	0.0	2.0
+chr2	100841	2.0	0.0	2.0
+chr2	100853	1.0	0.0	1.0
+chr2	100858	0.0	1.0	1.0
+chr2	100888	0.0	1.0	1.0
+chr2	100991	1.0	0.0	1.0
+chr2	100994	1.0	0.0	1.0
+chr2	101006	0.0	1.0	1.0
+chr2	101009	0.0	1.0	1.0
+chr2	101011	0.0	1.0	1.0
+chr2	101018	0.0	2.0	2.0
+chr2	101030	0.0	1.0	1.0
+chr2	101132	0.0	1.0	1.0
+chr2	101138	0.0	1.0	1.0
+chr2	101144	0.0	3.0	3.0
+chr2	101145	0.0	1.0	1.0
+chr2	101148	0.0	1.0	1.0
+chr2	101150	3.0	0.0	3.0
+chr2	101155	1.0	0.0	1.0
+chr2	101157	0.0	1.0	1.0
+chr2	101159	0.0	1.0	1.0
+chr2	101161	3.0	0.0	3.0
+chr2	101164	1.0	0.0	1.0
+chr2	101165	1.0	1.0	2.0
+chr2	101167	2.0	0.0	2.0
+chr2	101169	0.0	2.0	2.0
+chr2	101170	0.0	1.0	1.0
+chr2	101178	2.0	0.0	2.0
+chr2	101179	0.0	1.0	1.0
+chr2	101188	0.0	3.0	3.0
+chr2	101194	1.0	0.0	1.0
+chr2	101201	0.0	2.0	2.0
+chr2	101516	0.0	1.0	1.0
+chr2	101628	1.0	0.0	1.0
+chr2	101630	1.0	0.0	1.0
+chr2	101663	0.0	1.0	1.0
+chr2	101670	0.0	1.0	1.0
+chr2	101690	1.0	0.0	1.0
+chr2	101824	1.0	0.0	1.0
+chr2	101897	0.0	1.0	1.0
+chr2	101901	0.0	1.0	1.0
+chr2	101903	0.0	3.0	3.0
+chr2	101904	0.0	1.0	1.0
+chr2	101907	2.0	4.0	6.0
+chr2	101908	2.0	0.0	2.0
+chr2	101910	2.0	0.0	2.0
+chr2	101911	3.0	0.0	3.0
+chr2	101912	2.0	0.0	2.0
+chr2	101914	1.0	1.0	2.0
+chr2	101916	2.0	0.0	2.0
+chr2	101919	4.0	0.0	4.0
+chr2	101920	2.0	3.0	5.0
+chr2	101922	0.0	2.0	2.0
+chr2	101924	0.0	7.0	7.0
+chr2	101938	0.0	1.0	1.0
+chr2	101939	2.0	0.0	2.0
+chr2	101940	2.0	2.0	4.0
+chr2	101941	0.0	2.0	2.0
+chr2	101945	1.0	0.0	1.0
+chr2	101949	1.0	0.0	1.0
+chr2	101955	1.0	0.0	1.0
+chr2	101958	1.0	0.0	1.0
+chr2	101973	0.0	1.0	1.0
+chr2	102056	1.0	0.0	1.0
+chr2	102071	2.0	0.0	2.0
+chr2	102091	1.0	0.0	1.0
+chr2	102092	1.0	1.0	2.0
+chr2	102109	1.0	0.0	1.0
+chr2	102127	1.0	0.0	1.0
+chr2	102246	1.0	1.0	2.0
+chr2	102264	1.0	0.0	1.0
+chr2	102513	1.0	0.0	1.0
+chr2	102548	1.0	0.0	1.0
+chr2	102568	1.0	0.0	1.0
+chr2	102582	2.0	0.0	2.0
+chr2	102670	0.0	1.0	1.0
+chr2	102746	0.0	1.0	1.0
+chr2	102767	2.0	0.0	2.0
+chr2	102868	1.0	0.0	1.0
+chr2	102928	1.0	0.0	1.0
+chr2	103269	1.0	0.0	1.0
+chr2	103301	0.0	2.0	2.0
+chr2	103965	1.0	0.0	1.0
+chr2	104011	1.0	0.0	1.0
+chr2	104121	1.0	0.0	1.0
+chr2	104756	0.0	1.0	1.0
+chr2	105835	1.0	0.0	1.0
+chr2	106778	1.0	0.0	1.0
+chr2	106830	1.0	0.0	1.0
+chr2	106934	1.0	0.0	1.0
+chr2	107263	0.0	1.0	1.0
+chr2	107276	1.0	0.0	1.0
+chr2	107292	0.0	1.0	1.0
+chr2	107299	2.0	0.0	2.0
+chr2	107366	1.0	0.0	1.0
+chr2	107436	0.0	1.0	1.0
+chr2	107439	0.0	3.0	3.0
+chr2	107444	2.0	0.0	2.0
+chr2	107450	0.0	1.0	1.0
+chr2	107454	1.0	0.0	1.0
+chr2	107455	1.0	0.0	1.0
+chr2	107456	1.0	1.0	2.0
+chr2	107458	1.0	1.0	2.0
+chr2	107469	0.0	1.0	1.0
+chr2	107476	0.0	1.0	1.0
+chr2	107489	0.0	1.0	1.0
+chr2	107697	0.0	1.0	1.0
+chr2	107700	2.0	0.0	2.0
+chr2	107713	1.0	0.0	1.0
+chr2	107717	1.0	0.0	1.0
+chr2	107719	0.0	1.0	1.0
+chr2	107724	1.0	0.0	1.0
+chr2	107727	1.0	2.0	3.0
+chr2	107758	1.0	0.0	1.0
+chr2	107775	0.0	1.0	1.0
+chr2	107905	1.0	0.0	1.0
+chr2	107923	1.0	0.0	1.0
+chr2	107930	0.0	2.0	2.0
+chr2	107935	1.0	0.0	1.0
+chr2	107942	2.0	0.0	2.0
+chr2	107945	3.0	0.0	3.0
+chr2	107955	0.0	1.0	1.0
+chr2	107962	0.0	1.0	1.0
+chr2	107972	0.0	1.0	1.0
+chr2	108053	0.0	1.0	1.0
+chr2	108106	0.0	1.0	1.0
+chr2	108107	1.0	0.0	1.0
+chr2	108117	0.0	1.0	1.0
+chr2	108261	0.0	1.0	1.0
+chr2	108265	2.0	0.0	2.0
+chr2	108267	0.0	1.0	1.0
+chr2	108419	1.0	0.0	1.0
+chr2	108438	0.0	3.0	3.0
+chr2	108941	0.0	1.0	1.0
+chr2	109094	0.0	1.0	1.0
+chr2	109318	0.0	1.0	1.0
+chr2	109519	0.0	1.0	1.0
+chr2	109577	0.0	1.0	1.0
+chr2	109608	1.0	0.0	1.0
+chr2	110120	1.0	0.0	1.0
+chr2	110141	0.0	1.0	1.0
+chr2	110159	0.0	1.0	1.0
+chr2	110172	0.0	1.0	1.0
+chr2	110216	0.0	2.0	2.0
+chr2	110298	0.0	1.0	1.0
+chr2	110337	0.0	1.0	1.0
+chr2	110341	1.0	0.0	1.0
+chr2	110487	0.0	1.0	1.0
+chr2	110502	3.0	0.0	3.0
+chr2	110504	0.0	1.0	1.0
+chr2	110512	0.0	1.0	1.0
+chr2	110513	0.0	2.0	2.0
+chr2	110514	0.0	1.0	1.0
+chr2	110517	1.0	0.0	1.0
+chr2	110520	0.0	1.0	1.0
+chr2	110525	1.0	0.0	1.0
+chr2	110526	1.0	0.0	1.0
+chr2	110527	0.0	1.0	1.0
+chr2	110533	2.0	0.0	2.0
+chr2	110721	0.0	1.0	1.0
+chr2	110735	0.0	1.0	1.0
+chr2	110739	0.0	1.0	1.0
+chr2	110745	3.0	0.0	3.0
+chr2	110747	0.0	1.0	1.0
+chr2	110753	0.0	1.0	1.0
+chr2	110769	1.0	0.0	1.0
+chr2	111043	0.0	1.0	1.0
+chr2	111138	0.0	3.0	3.0
+chr2	111161	1.0	1.0	2.0
+chr2	111163	0.0	1.0	1.0
+chr2	111164	1.0	0.0	1.0
+chr2	111169	0.0	1.0	1.0
+chr2	111188	0.0	1.0	1.0
+chr2	111196	1.0	0.0	1.0
+chr2	111197	0.0	1.0	1.0
+chr2	111436	2.0	0.0	2.0
+chr2	111439	3.0	2.0	5.0
+chr2	111441	1.0	0.0	1.0
+chr2	111442	2.0	0.0	2.0
+chr2	111443	3.0	0.0	3.0
+chr2	111447	0.0	1.0	1.0
+chr2	111448	1.0	0.0	1.0
+chr2	111449	2.0	1.0	3.0
+chr2	111451	0.0	3.0	3.0
+chr2	111456	1.0	0.0	1.0
+chr2	111457	1.0	0.0	1.0
+chr2	111458	0.0	1.0	1.0
+chr2	111459	1.0	0.0	1.0
+chr2	111460	0.0	6.0	6.0
+chr2	111461	1.0	3.0	4.0
+chr2	111462	0.0	1.0	1.0
+chr2	111463	0.0	1.0	1.0
+chr2	111464	0.0	1.0	1.0
+chr2	111468	1.0	0.0	1.0
+chr2	111469	0.0	1.0	1.0
+chr2	111470	5.0	0.0	5.0
+chr2	111472	2.0	0.0	2.0
+chr2	111475	0.0	1.0	1.0
+chr2	111476	1.0	1.0	2.0
+chr2	111623	0.0	1.0	1.0
+chr2	111624	0.0	3.0	3.0
+chr2	111625	1.0	0.0	1.0
+chr2	111632	0.0	1.0	1.0
+chr2	111634	2.0	0.0	2.0
+chr2	111647	0.0	1.0	1.0
+chr2	112117	0.0	1.0	1.0
+chr2	112297	0.0	2.0	2.0
+chr2	112329	3.0	0.0	3.0
+chr2	113052	0.0	1.0	1.0
+chr2	113054	0.0	1.0	1.0
+chr2	113090	1.0	0.0	1.0
+chr2	113163	1.0	0.0	1.0
+chr2	113216	1.0	0.0	1.0
+chr2	113222	1.0	0.0	1.0
+chr2	113229	1.0	0.0	1.0
+chr2	113253	2.0	0.0	2.0
+chr2	113254	0.0	1.0	1.0
+chr2	113321	0.0	1.0	1.0
+chr2	113389	0.0	2.0	2.0
+chr2	113392	2.0	1.0	3.0
+chr2	113395	2.0	1.0	3.0
+chr2	113396	0.0	1.0	1.0
+chr2	113397	1.0	0.0	1.0
+chr2	113398	1.0	0.0	1.0
+chr2	113401	3.0	0.0	3.0
+chr2	113406	1.0	1.0	2.0
+chr2	113407	0.0	1.0	1.0
+chr2	113409	1.0	0.0	1.0
+chr2	113411	0.0	1.0	1.0
+chr2	113413	1.0	0.0	1.0
+chr2	113420	0.0	1.0	1.0
+chr2	113421	0.0	2.0	2.0
+chr2	113427	0.0	1.0	1.0
+chr2	113429	2.0	0.0	2.0
+chr2	113440	0.0	1.0	1.0
+chr2	113639	0.0	1.0	1.0
+chr2	113669	1.0	0.0	1.0
+chr2	113678	1.0	0.0	1.0
+chr2	113681	0.0	1.0	1.0
+chr2	113684	1.0	0.0	1.0
+chr2	113685	1.0	1.0	2.0
+chr2	113689	0.0	1.0	1.0
+chr2	113692	3.0	2.0	5.0
+chr2	113693	2.0	0.0	2.0
+chr2	113694	6.0	0.0	6.0
+chr2	113697	1.0	0.0	1.0
+chr2	113699	0.0	2.0	2.0
+chr2	113703	0.0	1.0	1.0
+chr2	113710	0.0	2.0	2.0
+chr2	113711	0.0	2.0	2.0
+chr2	113750	1.0	0.0	1.0
+chr2	113828	0.0	1.0	1.0
+chr2	113837	0.0	1.0	1.0
+chr2	113851	1.0	0.0	1.0
+chr2	113858	3.0	0.0	3.0
+chr2	113859	0.0	3.0	3.0
+chr2	113860	0.0	1.0	1.0
+chr2	113863	0.0	1.0	1.0
+chr2	113866	1.0	0.0	1.0
+chr2	113868	0.0	5.0	5.0
+chr2	113869	0.0	1.0	1.0
+chr2	113870	0.0	1.0	1.0
+chr2	113873	1.0	0.0	1.0
+chr2	113882	0.0	2.0	2.0
+chr2	113885	1.0	0.0	1.0
+chr2	114011	0.0	1.0	1.0
+chr2	114023	1.0	0.0	1.0
+chr2	114529	1.0	0.0	1.0
+chr2	115078	0.0	1.0	1.0
+chr2	115178	1.0	0.0	1.0
+chr2	115192	1.0	0.0	1.0
+chr2	115581	0.0	1.0	1.0
+chr2	115859	0.0	3.0	3.0
+chr2	115870	0.0	1.0	1.0
+chr2	115873	0.0	1.0	1.0
+chr2	116180	1.0	0.0	1.0
+chr2	116314	1.0	0.0	1.0
+chr2	116338	1.0	0.0	1.0
+chr2	116472	1.0	0.0	1.0
+chr2	116516	1.0	0.0	1.0
+chr2	116649	1.0	0.0	1.0
+chr2	116667	1.0	0.0	1.0
+chr2	116671	0.0	1.0	1.0
+chr2	116805	0.0	1.0	1.0
+chr2	116819	0.0	1.0	1.0
+chr2	116828	0.0	2.0	2.0
+chr2	116829	0.0	1.0	1.0
+chr2	116836	1.0	0.0	1.0
+chr2	116837	0.0	1.0	1.0
+chr2	116840	1.0	1.0	2.0
+chr2	116842	0.0	1.0	1.0
+chr2	116844	1.0	0.0	1.0
+chr2	116848	0.0	1.0	1.0
+chr2	116850	0.0	1.0	1.0
+chr2	116858	0.0	1.0	1.0
+chr2	116864	0.0	2.0	2.0
+chr2	116867	1.0	0.0	1.0
+chr2	116896	0.0	1.0	1.0
+chr2	117135	1.0	0.0	1.0
+chr2	117154	0.0	2.0	2.0
+chr2	117165	0.0	1.0	1.0
+chr2	117175	0.0	2.0	2.0
+chr2	117185	1.0	0.0	1.0
+chr2	117222	1.0	0.0	1.0
+chr2	117433	0.0	1.0	1.0
+chr2	117458	0.0	3.0	3.0
+chr2	117459	0.0	1.0	1.0
+chr2	117464	0.0	1.0	1.0
+chr2	117486	0.0	1.0	1.0
+chr2	117500	0.0	2.0	2.0
+chr2	117501	0.0	2.0	2.0
+chr2	117607	1.0	0.0	1.0
+chr2	117614	0.0	1.0	1.0
+chr2	117624	1.0	0.0	1.0
+chr2	117636	0.0	1.0	1.0
+chr2	117638	0.0	1.0	1.0
+chr2	117650	0.0	1.0	1.0
+chr2	117656	1.0	0.0	1.0
+chr2	117788	1.0	0.0	1.0
+chr2	117798	1.0	0.0	1.0
+chr2	117817	0.0	1.0	1.0
+chr2	117821	0.0	1.0	1.0
+chr2	118022	0.0	1.0	1.0
+chr2	118453	1.0	0.0	1.0
+chr2	118626	0.0	1.0	1.0
+chr2	119037	0.0	1.0	1.0
+chr2	119526	0.0	2.0	2.0
+chr2	119555	0.0	1.0	1.0
+chr2	119864	1.0	0.0	1.0
+chr2	120148	0.0	1.0	1.0
+chr2	121208	1.0	0.0	1.0
+chr2	121403	0.0	1.0	1.0
+chr2	121725	1.0	0.0	1.0
+chr2	121910	0.0	2.0	2.0
+chr2	121914	1.0	0.0	1.0
+chr2	121945	1.0	0.0	1.0
+chr2	122063	1.0	0.0	1.0
+chr2	122064	2.0	0.0	2.0
+chr2	122070	0.0	1.0	1.0
+chr2	122071	1.0	0.0	1.0
+chr2	122072	1.0	0.0	1.0
+chr2	122074	0.0	3.0	3.0
+chr2	122081	0.0	1.0	1.0
+chr2	122084	0.0	2.0	2.0
+chr2	122090	0.0	2.0	2.0
+chr2	122091	0.0	1.0	1.0
+chr2	122093	2.0	0.0	2.0
+chr2	122096	0.0	2.0	2.0
+chr2	122100	1.0	1.0	2.0
+chr2	122105	1.0	0.0	1.0
+chr2	122110	1.0	0.0	1.0
+chr2	122123	0.0	1.0	1.0
+chr2	122129	1.0	0.0	1.0
+chr2	122133	1.0	0.0	1.0
+chr2	122134	2.0	0.0	2.0
+chr2	123080	0.0	1.0	1.0
+chr2	123327	1.0	0.0	1.0
+chr2	123652	0.0	1.0	1.0
+chr2	123819	0.0	1.0	1.0
+chr2	124036	0.0	1.0	1.0
+chr2	124275	0.0	1.0	1.0
+chr2	124300	1.0	0.0	1.0
+chr2	124422	0.0	1.0	1.0
+chr2	124429	0.0	2.0	2.0
+chr2	124596	0.0	1.0	1.0
+chr2	124609	0.0	1.0	1.0
+chr2	124613	1.0	0.0	1.0
+chr2	124620	0.0	1.0	1.0
+chr2	124637	1.0	0.0	1.0
+chr2	124701	0.0	1.0	1.0
+chr2	124739	0.0	2.0	2.0
+chr2	124758	1.0	0.0	1.0
+chr2	124767	0.0	1.0	1.0
+chr2	124774	1.0	1.0	2.0
+chr2	124775	0.0	4.0	4.0
+chr2	124776	0.0	2.0	2.0
+chr2	124778	6.0	0.0	6.0
+chr2	124779	3.0	0.0	3.0
+chr2	124780	3.0	0.0	3.0
+chr2	124783	2.0	0.0	2.0
+chr2	124784	1.0	0.0	1.0
+chr2	124785	1.0	1.0	2.0
+chr2	124786	0.0	1.0	1.0
+chr2	124787	1.0	0.0	1.0
+chr2	124788	0.0	4.0	4.0
+chr2	124789	0.0	7.0	7.0
+chr2	124792	2.0	0.0	2.0
+chr2	124793	1.0	0.0	1.0
+chr2	124795	1.0	0.0	1.0
+chr2	124796	1.0	0.0	1.0
+chr2	124798	0.0	1.0	1.0
+chr2	124800	0.0	2.0	2.0
+chr2	124809	1.0	0.0	1.0
+chr2	124820	0.0	1.0	1.0
+chr2	125051	0.0	1.0	1.0
+chr2	125060	0.0	2.0	2.0
+chr2	125069	0.0	1.0	1.0
+chr2	125073	0.0	2.0	2.0
+chr2	125074	0.0	4.0	4.0
+chr2	125075	1.0	0.0	1.0
+chr2	125080	1.0	0.0	1.0
+chr2	125081	4.0	0.0	4.0
+chr2	125082	0.0	1.0	1.0
+chr2	125086	1.0	4.0	5.0
+chr2	125092	2.0	0.0	2.0
+chr2	125093	0.0	3.0	3.0
+chr2	125095	7.0	0.0	7.0
+chr2	125097	0.0	1.0	1.0
+chr2	125098	0.0	5.0	5.0
+chr2	125099	0.0	10.0	10.0
+chr2	125101	1.0	2.0	3.0
+chr2	125103	1.0	0.0	1.0
+chr2	125106	2.0	0.0	2.0
+chr2	125107	0.0	1.0	1.0
+chr2	125111	3.0	0.0	3.0
+chr2	125112	0.0	1.0	1.0
+chr2	125115	0.0	2.0	2.0
+chr2	125230	0.0	1.0	1.0
+chr2	125244	0.0	1.0	1.0
+chr2	125254	0.0	1.0	1.0
+chr2	125255	1.0	0.0	1.0
+chr2	125286	0.0	1.0	1.0
+chr2	125407	1.0	0.0	1.0
+chr2	125467	0.0	2.0	2.0
+chr2	125665	0.0	2.0	2.0
+chr2	125860	1.0	0.0	1.0
+chr2	125894	1.0	0.0	1.0
+chr2	125902	1.0	0.0	1.0
+chr2	126337	1.0	0.0	1.0
+chr2	126447	0.0	2.0	2.0
+chr2	126481	0.0	1.0	1.0
+chr2	126497	0.0	2.0	2.0
+chr2	126532	1.0	0.0	1.0
+chr2	126571	1.0	0.0	1.0
+chr2	126721	0.0	2.0	2.0
+chr2	126789	1.0	0.0	1.0
+chr2	126933	1.0	0.0	1.0
+chr2	126967	0.0	1.0	1.0
+chr2	126997	0.0	1.0	1.0
+chr2	127142	0.0	1.0	1.0
+chr2	127151	0.0	2.0	2.0
+chr2	127161	4.0	0.0	4.0
+chr2	127185	0.0	1.0	1.0
+chr2	127203	1.0	0.0	1.0
+chr2	127339	1.0	0.0	1.0
+chr2	127343	2.0	0.0	2.0
+chr2	127352	0.0	1.0	1.0
+chr2	127360	2.0	1.0	3.0
+chr2	127444	1.0	0.0	1.0
+chr2	127511	1.0	0.0	1.0
+chr2	127529	1.0	0.0	1.0
+chr2	127569	1.0	0.0	1.0
+chr2	127571	1.0	0.0	1.0
+chr2	127588	0.0	1.0	1.0
+chr2	127883	0.0	1.0	1.0
+chr2	127889	0.0	1.0	1.0
+chr2	127951	1.0	0.0	1.0
+chr2	128077	1.0	0.0	1.0
+chr2	128853	0.0	1.0	1.0
+chr2	129062	0.0	1.0	1.0
+chr2	129070	0.0	1.0	1.0
+chr2	129108	0.0	1.0	1.0
+chr2	129110	1.0	0.0	1.0
+chr2	129294	1.0	0.0	1.0
+chr2	129362	1.0	0.0	1.0
+chr2	129619	1.0	0.0	1.0
+chr2	129622	1.0	0.0	1.0
+chr2	130752	0.0	1.0	1.0
+chr2	131452	1.0	0.0	1.0
+chr2	131551	1.0	0.0	1.0
+chr2	131630	0.0	1.0	1.0
+chr2	131788	0.0	2.0	2.0
+chr2	131949	0.0	1.0	1.0
+chr2	131977	0.0	1.0	1.0
+chr2	131981	0.0	1.0	1.0
+chr2	131992	0.0	1.0	1.0
+chr2	131995	1.0	0.0	1.0
+chr2	132125	1.0	0.0	1.0
+chr2	132136	0.0	1.0	1.0
+chr2	132141	0.0	1.0	1.0
+chr2	132144	1.0	0.0	1.0
+chr2	132145	2.0	0.0	2.0
+chr2	132148	0.0	3.0	3.0
+chr2	132149	1.0	0.0	1.0
+chr2	132158	1.0	0.0	1.0
+chr2	132159	2.0	0.0	2.0
+chr2	132160	0.0	1.0	1.0
+chr2	132161	1.0	0.0	1.0
+chr2	132163	0.0	1.0	1.0
+chr2	132164	0.0	1.0	1.0
+chr2	132165	1.0	0.0	1.0
+chr2	132173	0.0	3.0	3.0
+chr2	132175	0.0	1.0	1.0
+chr2	132178	0.0	1.0	1.0
+chr2	132450	0.0	1.0	1.0
+chr2	132451	1.0	0.0	1.0
+chr2	132453	0.0	1.0	1.0
+chr2	132455	2.0	1.0	3.0
+chr2	132458	0.0	1.0	1.0
+chr2	132459	2.0	0.0	2.0
+chr2	132461	1.0	0.0	1.0
+chr2	132462	2.0	6.0	8.0
+chr2	132468	1.0	0.0	1.0
+chr2	132471	1.0	0.0	1.0
+chr2	132480	0.0	2.0	2.0
+chr2	132484	0.0	1.0	1.0
+chr2	132485	0.0	1.0	1.0
+chr2	132496	1.0	0.0	1.0
+chr2	132499	0.0	2.0	2.0
+chr2	132509	0.0	1.0	1.0
+chr2	132609	1.0	0.0	1.0
+chr2	132626	1.0	0.0	1.0
+chr2	132638	0.0	1.0	1.0
+chr2	132696	0.0	1.0	1.0
+chr2	132793	0.0	3.0	3.0
+chr2	132816	1.0	0.0	1.0
+chr2	133507	3.0	0.0	3.0
+chr2	133560	1.0	0.0	1.0
+chr2	133629	1.0	0.0	1.0
+chr2	134695	0.0	1.0	1.0
+chr2	135172	1.0	0.0	1.0
+chr2	135400	1.0	0.0	1.0
+chr2	135486	0.0	2.0	2.0
+chr2	135487	0.0	1.0	1.0
+chr2	135488	1.0	0.0	1.0
+chr2	135500	1.0	0.0	1.0
+chr2	135629	1.0	0.0	1.0
+chr2	135663	3.0	0.0	3.0
+chr2	135665	1.0	0.0	1.0
+chr2	135667	0.0	1.0	1.0
+chr2	135670	0.0	1.0	1.0
+chr2	135673	0.0	1.0	1.0
+chr2	135674	4.0	0.0	4.0
+chr2	135678	0.0	1.0	1.0
+chr2	135679	1.0	4.0	5.0
+chr2	135682	2.0	0.0	2.0
+chr2	135690	0.0	1.0	1.0
+chr2	135706	1.0	0.0	1.0
+chr2	136091	0.0	1.0	1.0
+chr2	136177	0.0	1.0	1.0
+chr2	136276	1.0	0.0	1.0
+chr2	136305	0.0	1.0	1.0
+chr2	136323	0.0	1.0	1.0
+chr2	136342	1.0	0.0	1.0
+chr2	136347	1.0	0.0	1.0
+chr2	136366	0.0	1.0	1.0
+chr2	136367	0.0	1.0	1.0
+chr2	136368	3.0	0.0	3.0
+chr2	136369	0.0	1.0	1.0
+chr2	136370	0.0	1.0	1.0
+chr2	136382	0.0	1.0	1.0
+chr2	136384	0.0	1.0	1.0
+chr2	136387	2.0	0.0	2.0
+chr2	136388	1.0	2.0	3.0
+chr2	136390	0.0	1.0	1.0
+chr2	136393	0.0	1.0	1.0
+chr2	136395	0.0	1.0	1.0
+chr2	136401	0.0	1.0	1.0
+chr2	136403	0.0	1.0	1.0
+chr2	136404	1.0	0.0	1.0
+chr2	136422	2.0	0.0	2.0
+chr2	136430	1.0	0.0	1.0
+chr2	136527	0.0	1.0	1.0
+chr2	136552	0.0	1.0	1.0
+chr2	136567	1.0	0.0	1.0
+chr2	136573	1.0	0.0	1.0
+chr2	136604	0.0	1.0	1.0
+chr2	136611	0.0	1.0	1.0
+chr2	136686	0.0	1.0	1.0
+chr2	136714	0.0	1.0	1.0
+chr2	136724	1.0	0.0	1.0
+chr2	136729	1.0	0.0	1.0
+chr2	136731	0.0	1.0	1.0
+chr2	136733	0.0	2.0	2.0
+chr2	136734	1.0	1.0	2.0
+chr2	136749	0.0	1.0	1.0
+chr2	136760	0.0	3.0	3.0
+chr2	136765	1.0	0.0	1.0
+chr2	136775	1.0	0.0	1.0
+chr2	136776	3.0	0.0	3.0
+chr2	136798	1.0	0.0	1.0
+chr2	136802	1.0	0.0	1.0
+chr2	136804	1.0	0.0	1.0
+chr2	136875	1.0	0.0	1.0
+chr2	136908	0.0	1.0	1.0
+chr2	136922	1.0	0.0	1.0
+chr2	136934	0.0	1.0	1.0
+chr2	136935	1.0	0.0	1.0
+chr2	136936	1.0	0.0	1.0
+chr2	136937	1.0	0.0	1.0
+chr2	136957	0.0	1.0	1.0
+chr2	137021	0.0	1.0	1.0
+chr2	137057	0.0	1.0	1.0
+chr2	137081	1.0	0.0	1.0
+chr2	137083	0.0	1.0	1.0
+chr2	137105	1.0	0.0	1.0
+chr2	137111	0.0	1.0	1.0
+chr2	137162	0.0	1.0	1.0
+chr2	137165	1.0	0.0	1.0
+chr2	137176	0.0	1.0	1.0
+chr2	137212	3.0	0.0	3.0
+chr2	137216	0.0	2.0	2.0
+chr2	137236	1.0	0.0	1.0
+chr2	137252	0.0	4.0	4.0
+chr2	137260	1.0	0.0	1.0
+chr2	137262	2.0	0.0	2.0
+chr2	137265	3.0	0.0	3.0
+chr2	137301	0.0	1.0	1.0
+chr2	137303	1.0	0.0	1.0
+chr2	137327	1.0	0.0	1.0
+chr2	137348	1.0	0.0	1.0
+chr2	137354	1.0	0.0	1.0
+chr2	137356	0.0	1.0	1.0
+chr2	137362	1.0	0.0	1.0
+chr2	137363	0.0	1.0	1.0
+chr2	137376	1.0	0.0	1.0
+chr2	137379	0.0	3.0	3.0
+chr2	137384	1.0	0.0	1.0
+chr2	137394	1.0	0.0	1.0
+chr2	137395	1.0	0.0	1.0
+chr2	137400	1.0	0.0	1.0
+chr2	137403	1.0	0.0	1.0
+chr2	137416	1.0	0.0	1.0
+chr2	137450	1.0	0.0	1.0
+chr2	137453	0.0	1.0	1.0
+chr2	137457	1.0	0.0	1.0
+chr2	137478	0.0	1.0	1.0
+chr2	137540	0.0	2.0	2.0
+chr2	137548	2.0	1.0	3.0
+chr2	137778	0.0	1.0	1.0
+chr2	137781	0.0	1.0	1.0
+chr2	137782	0.0	1.0	1.0
+chr2	137795	0.0	1.0	1.0
+chr2	137817	0.0	1.0	1.0
+chr2	137886	1.0	0.0	1.0
+chr2	137889	0.0	1.0	1.0
+chr2	137905	0.0	1.0	1.0
+chr2	137921	0.0	1.0	1.0
+chr2	137923	1.0	0.0	1.0
+chr2	137927	1.0	0.0	1.0
+chr2	137928	3.0	0.0	3.0
+chr2	137934	0.0	1.0	1.0
+chr2	137943	0.0	1.0	1.0
+chr2	137945	0.0	1.0	1.0
+chr2	137947	2.0	0.0	2.0
+chr2	137949	0.0	1.0	1.0
+chr2	137969	1.0	0.0	1.0
+chr2	137997	0.0	1.0	1.0
+chr2	138133	0.0	1.0	1.0
+chr2	138136	0.0	1.0	1.0
+chr2	138154	1.0	0.0	1.0
+chr2	138168	0.0	1.0	1.0
+chr2	138413	0.0	1.0	1.0
+chr2	138498	0.0	1.0	1.0
+chr2	138654	1.0	0.0	1.0
+chr2	139256	1.0	0.0	1.0
+chr2	139268	1.0	0.0	1.0
+chr2	139279	0.0	1.0	1.0
+chr2	139309	0.0	1.0	1.0
+chr2	139461	0.0	1.0	1.0
+chr2	139621	0.0	1.0	1.0
+chr2	139785	0.0	1.0	1.0
+chr2	139815	0.0	1.0	1.0
+chr2	139846	1.0	0.0	1.0
+chr2	139900	0.0	1.0	1.0
+chr2	140018	0.0	1.0	1.0
+chr2	140084	0.0	1.0	1.0
+chr2	140162	1.0	1.0	2.0
+chr2	140277	0.0	1.0	1.0
+chr2	140300	1.0	0.0	1.0
+chr2	140313	0.0	2.0	2.0
+chr2	140319	1.0	0.0	1.0
+chr2	140323	1.0	0.0	1.0
+chr2	140329	1.0	0.0	1.0
+chr2	140337	1.0	0.0	1.0
+chr2	140344	0.0	2.0	2.0
+chr2	140902	0.0	1.0	1.0
+chr2	140908	0.0	2.0	2.0
+chr2	140920	1.0	0.0	1.0
+chr2	140934	2.0	0.0	2.0
+chr2	140945	1.0	0.0	1.0
+chr2	140954	1.0	0.0	1.0
+chr2	140964	0.0	2.0	2.0
+chr2	140979	1.0	0.0	1.0
+chr2	140981	1.0	0.0	1.0
+chr2	140995	1.0	0.0	1.0
+chr2	141240	0.0	1.0	1.0
+chr2	141249	1.0	0.0	1.0
+chr2	141254	0.0	2.0	2.0
+chr2	141255	0.0	1.0	1.0
+chr2	141263	2.0	1.0	3.0
+chr2	141268	2.0	0.0	2.0
+chr2	141276	0.0	2.0	2.0
+chr2	141277	0.0	1.0	1.0
+chr2	141281	1.0	0.0	1.0
+chr2	141286	0.0	3.0	3.0
+chr2	141287	0.0	1.0	1.0
+chr2	141288	1.0	0.0	1.0
+chr2	141300	1.0	0.0	1.0
+chr2	141301	0.0	1.0	1.0
+chr2	141347	0.0	1.0	1.0
+chr2	141392	1.0	0.0	1.0
+chr2	141423	0.0	3.0	3.0
+chr2	141424	0.0	1.0	1.0
+chr2	141587	0.0	1.0	1.0
+chr2	142266	0.0	1.0	1.0
+chr2	142361	1.0	0.0	1.0
+chr2	142496	1.0	1.0	2.0
+chr2	142520	0.0	2.0	2.0
+chr2	142521	1.0	1.0	2.0
+chr2	142655	1.0	0.0	1.0
+chr2	142669	0.0	1.0	1.0
+chr2	142671	1.0	0.0	1.0
+chr2	142672	1.0	0.0	1.0
+chr2	142685	0.0	1.0	1.0
+chr2	142691	1.0	0.0	1.0
+chr2	142706	0.0	2.0	2.0
+chr2	142708	0.0	1.0	1.0
+chr2	142808	0.0	1.0	1.0
+chr2	142821	1.0	0.0	1.0
+chr2	142824	1.0	0.0	1.0
+chr2	142828	0.0	1.0	1.0
+chr2	142846	2.0	0.0	2.0
+chr2	142847	1.0	0.0	1.0
+chr2	142853	1.0	0.0	1.0
+chr2	142854	1.0	1.0	2.0
+chr2	142856	1.0	4.0	5.0
+chr2	142858	1.0	0.0	1.0
+chr2	142862	2.0	0.0	2.0
+chr2	142865	1.0	0.0	1.0
+chr2	142866	1.0	0.0	1.0
+chr2	142870	1.0	0.0	1.0
+chr2	142874	0.0	1.0	1.0
+chr2	142875	0.0	1.0	1.0
+chr2	142886	0.0	1.0	1.0
+chr2	142943	1.0	0.0	1.0
+chr2	143032	0.0	1.0	1.0
+chr2	143039	0.0	1.0	1.0
+chr2	143054	1.0	0.0	1.0
+chr2	143073	1.0	0.0	1.0
+chr2	143075	0.0	5.0	5.0
+chr2	143093	0.0	1.0	1.0
+chr2	143128	1.0	0.0	1.0
+chr2	143147	1.0	0.0	1.0
+chr2	143150	0.0	1.0	1.0
+chr2	143152	0.0	1.0	1.0
+chr2	143153	0.0	2.0	2.0
+chr2	143161	0.0	1.0	1.0
+chr2	143192	1.0	0.0	1.0
+chr2	143198	1.0	0.0	1.0
+chr2	143327	1.0	0.0	1.0
+chr2	143349	1.0	0.0	1.0
+chr2	143409	0.0	1.0	1.0
+chr2	143515	2.0	0.0	2.0
+chr2	144516	0.0	1.0	1.0
+chr2	144572	0.0	1.0	1.0
+chr2	145092	0.0	1.0	1.0
+chr2	145143	1.0	0.0	1.0
+chr2	145257	0.0	1.0	1.0
+chr2	145371	1.0	0.0	1.0
+chr2	145432	1.0	0.0	1.0
+chr2	145446	0.0	1.0	1.0
+chr2	145574	0.0	1.0	1.0
+chr2	145602	0.0	3.0	3.0
+chr2	145611	1.0	1.0	2.0
+chr2	145701	1.0	0.0	1.0
+chr2	145729	0.0	1.0	1.0
+chr2	145731	1.0	0.0	1.0
+chr2	145758	0.0	2.0	2.0
+chr2	145759	1.0	0.0	1.0
+chr2	145760	0.0	1.0	1.0
+chr2	145766	2.0	0.0	2.0
+chr2	145773	1.0	0.0	1.0
+chr2	145774	1.0	0.0	1.0
+chr2	145778	0.0	1.0	1.0
+chr2	146126	0.0	1.0	1.0
+chr2	146137	0.0	1.0	1.0
+chr2	146141	0.0	2.0	2.0
+chr2	146143	0.0	1.0	1.0
+chr2	146145	1.0	0.0	1.0
+chr2	146150	0.0	1.0	1.0
+chr2	146151	3.0	0.0	3.0
+chr2	146152	0.0	1.0	1.0
+chr2	146153	3.0	0.0	3.0
+chr2	146159	1.0	0.0	1.0
+chr2	146160	1.0	0.0	1.0
+chr2	146163	1.0	0.0	1.0
+chr2	146167	0.0	1.0	1.0
+chr2	146168	0.0	1.0	1.0
+chr2	146173	1.0	0.0	1.0
+chr2	146178	0.0	1.0	1.0
+chr2	146179	1.0	0.0	1.0
+chr2	146194	0.0	1.0	1.0
+chr2	146276	1.0	0.0	1.0
+chr2	146322	1.0	0.0	1.0
+chr2	146325	0.0	3.0	3.0
+chr2	146332	0.0	1.0	1.0
+chr2	146451	0.0	1.0	1.0
+chr2	146896	0.0	1.0	1.0
+chr2	146902	0.0	1.0	1.0
+chr2	146903	1.0	0.0	1.0
+chr2	146909	1.0	0.0	1.0
+chr2	147091	1.0	0.0	1.0
+chr2	147114	0.0	1.0	1.0
+chr2	147132	0.0	1.0	1.0
+chr2	147143	1.0	0.0	1.0
+chr2	147152	2.0	0.0	2.0
+chr2	147154	0.0	1.0	1.0
+chr2	147155	1.0	0.0	1.0
+chr2	147158	0.0	4.0	4.0
+chr2	147168	0.0	1.0	1.0
+chr2	147169	1.0	0.0	1.0
+chr2	147171	3.0	1.0	4.0
+chr2	147173	1.0	0.0	1.0
+chr2	147175	1.0	0.0	1.0
+chr2	147177	1.0	0.0	1.0
+chr2	147182	2.0	0.0	2.0
+chr2	147185	1.0	0.0	1.0
+chr2	147186	3.0	0.0	3.0
+chr2	147281	1.0	0.0	1.0
+chr2	147308	1.0	0.0	1.0
+chr2	147315	1.0	0.0	1.0
+chr2	147331	1.0	0.0	1.0
+chr2	147335	0.0	1.0	1.0
+chr2	147349	1.0	0.0	1.0
+chr2	147362	1.0	0.0	1.0
+chr2	147463	1.0	0.0	1.0
+chr2	147537	1.0	0.0	1.0
+chr2	147681	1.0	0.0	1.0
+chr2	147684	0.0	1.0	1.0
+chr2	147953	0.0	1.0	1.0
+chr2	148149	1.0	0.0	1.0
+chr2	148249	0.0	1.0	1.0
+chr2	148585	1.0	0.0	1.0
+chr2	148939	1.0	0.0	1.0
+chr2	148947	0.0	1.0	1.0
+chr2	149019	1.0	0.0	1.0
+chr2	149042	0.0	1.0	1.0
+chr2	149200	0.0	1.0	1.0
+chr2	149266	0.0	1.0	1.0
+chr2	149791	0.0	1.0	1.0
+chr2	149890	0.0	1.0	1.0
+chr2	150013	0.0	1.0	1.0
+chr2	150167	1.0	0.0	1.0
+chr2	150218	1.0	0.0	1.0
+chr2	150527	1.0	0.0	1.0
+chr2	150607	1.0	0.0	1.0
+chr2	150801	1.0	0.0	1.0
+chr2	150872	1.0	0.0	1.0
+chr2	151002	1.0	0.0	1.0
+chr2	151013	2.0	0.0	2.0
+chr2	151067	0.0	1.0	1.0
+chr2	151161	0.0	2.0	2.0
+chr2	151169	0.0	1.0	1.0
+chr2	151175	1.0	0.0	1.0
+chr2	151179	1.0	3.0	4.0
+chr2	151186	0.0	1.0	1.0
+chr2	151187	0.0	1.0	1.0
+chr2	151195	1.0	0.0	1.0
+chr2	151196	1.0	0.0	1.0
+chr2	151199	0.0	1.0	1.0
+chr2	151203	1.0	2.0	3.0
+chr2	151205	0.0	1.0	1.0
+chr2	151207	1.0	1.0	2.0
+chr2	151218	1.0	0.0	1.0
+chr2	151475	2.0	0.0	2.0
+chr2	151476	5.0	0.0	5.0
+chr2	151478	1.0	0.0	1.0
+chr2	151481	0.0	1.0	1.0
+chr2	151482	1.0	0.0	1.0
+chr2	151483	0.0	1.0	1.0
+chr2	151489	0.0	2.0	2.0
+chr2	151492	0.0	2.0	2.0
+chr2	151502	0.0	2.0	2.0
+chr2	151510	5.0	0.0	5.0
+chr2	151513	0.0	2.0	2.0
+chr2	151514	1.0	0.0	1.0
+chr2	151516	2.0	0.0	2.0
+chr2	151522	1.0	0.0	1.0
+chr2	151561	1.0	0.0	1.0
+chr2	151570	0.0	1.0	1.0
+chr2	151575	1.0	0.0	1.0
+chr2	151661	0.0	1.0	1.0
+chr2	151669	0.0	2.0	2.0
+chr2	152103	0.0	1.0	1.0
+chr2	152113	0.0	1.0	1.0
+chr2	152195	1.0	0.0	1.0
+chr2	152251	1.0	0.0	1.0
+chr2	152469	1.0	0.0	1.0
+chr2	152479	0.0	1.0	1.0
+chr2	152546	0.0	1.0	1.0
+chr2	152587	0.0	1.0	1.0
+chr2	152631	0.0	1.0	1.0
+chr2	152650	1.0	0.0	1.0
+chr2	152656	0.0	1.0	1.0
+chr2	152768	1.0	0.0	1.0
+chr2	152861	1.0	0.0	1.0
+chr2	152997	1.0	0.0	1.0
+chr2	153141	1.0	0.0	1.0
+chr2	153185	0.0	1.0	1.0
+chr2	153298	1.0	0.0	1.0
+chr2	153320	0.0	2.0	2.0
+chr2	153348	1.0	0.0	1.0
+chr2	153459	1.0	0.0	1.0
+chr2	153490	2.0	0.0	2.0
+chr2	153495	1.0	0.0	1.0
+chr2	153496	1.0	0.0	1.0
+chr2	153497	1.0	0.0	1.0
+chr2	153508	0.0	2.0	2.0
+chr2	153509	0.0	2.0	2.0
+chr2	153511	1.0	0.0	1.0
+chr2	153541	1.0	0.0	1.0
+chr2	153627	0.0	1.0	1.0
+chr2	153646	1.0	0.0	1.0
+chr2	153673	0.0	1.0	1.0
+chr2	153780	0.0	1.0	1.0
+chr2	153947	0.0	1.0	1.0
+chr2	153959	1.0	0.0	1.0
+chr2	153962	0.0	1.0	1.0
+chr2	153968	1.0	0.0	1.0
+chr2	153979	1.0	0.0	1.0
+chr2	153981	0.0	1.0	1.0
+chr2	153986	1.0	0.0	1.0
+chr2	153990	0.0	1.0	1.0
+chr2	153999	1.0	0.0	1.0
+chr2	154011	1.0	0.0	1.0
+chr2	154136	0.0	1.0	1.0
+chr2	154142	0.0	1.0	1.0
+chr2	154334	0.0	1.0	1.0
+chr2	154508	1.0	0.0	1.0
+chr2	155380	0.0	1.0	1.0
+chr2	155552	1.0	0.0	1.0
+chr2	155594	0.0	1.0	1.0
+chr2	156062	1.0	0.0	1.0
+chr2	156127	1.0	0.0	1.0
+chr2	156306	0.0	3.0	3.0
+chr2	157152	1.0	0.0	1.0
+chr2	157233	1.0	0.0	1.0
+chr2	157439	0.0	1.0	1.0
+chr2	158066	1.0	0.0	1.0
+chr2	158074	1.0	0.0	1.0
+chr2	158075	1.0	0.0	1.0
+chr2	158078	1.0	0.0	1.0
+chr2	158096	0.0	1.0	1.0
+chr2	158102	1.0	0.0	1.0
+chr2	158139	2.0	0.0	2.0
+chr2	158198	0.0	1.0	1.0
+chr2	158226	4.0	0.0	4.0
+chr2	158246	0.0	1.0	1.0
+chr2	158249	0.0	1.0	1.0
+chr2	158250	6.0	0.0	6.0
+chr2	158259	0.0	1.0	1.0
+chr2	158266	0.0	2.0	2.0
+chr2	158270	1.0	0.0	1.0
+chr2	158271	1.0	0.0	1.0
+chr2	158272	0.0	1.0	1.0
+chr2	158274	0.0	1.0	1.0
+chr2	158281	1.0	0.0	1.0
+chr2	158323	1.0	0.0	1.0
+chr2	158386	1.0	0.0	1.0
+chr2	158407	1.0	2.0	3.0
+chr2	158409	0.0	3.0	3.0
+chr2	158410	1.0	2.0	3.0
+chr2	158412	1.0	0.0	1.0
+chr2	158414	0.0	1.0	1.0
+chr2	158415	1.0	0.0	1.0
+chr2	158416	1.0	1.0	2.0
+chr2	158423	1.0	0.0	1.0
+chr2	158424	6.0	0.0	6.0
+chr2	158429	1.0	0.0	1.0
+chr2	158431	1.0	0.0	1.0
+chr2	158434	0.0	1.0	1.0
+chr2	158435	0.0	3.0	3.0
+chr2	158441	2.0	0.0	2.0
+chr2	158446	2.0	0.0	2.0
+chr2	158450	1.0	0.0	1.0
+chr2	158452	1.0	0.0	1.0
+chr2	158677	1.0	0.0	1.0
+chr2	158686	0.0	1.0	1.0
+chr2	158694	0.0	1.0	1.0
+chr2	158696	0.0	1.0	1.0
+chr2	158704	0.0	1.0	1.0
+chr2	158707	1.0	0.0	1.0
+chr2	158710	0.0	3.0	3.0
+chr2	158711	0.0	2.0	2.0
+chr2	158714	0.0	1.0	1.0
+chr2	158717	5.0	0.0	5.0
+chr2	158718	3.0	5.0	8.0
+chr2	158722	0.0	1.0	1.0
+chr2	158727	1.0	0.0	1.0
+chr2	158729	0.0	3.0	3.0
+chr2	158731	0.0	1.0	1.0
+chr2	158733	0.0	7.0	7.0
+chr2	158734	0.0	1.0	1.0
+chr2	158736	2.0	0.0	2.0
+chr2	158737	1.0	0.0	1.0
+chr2	158738	1.0	0.0	1.0
+chr2	158739	0.0	1.0	1.0
+chr2	158749	1.0	0.0	1.0
+chr2	158865	1.0	0.0	1.0
+chr2	158868	1.0	0.0	1.0
+chr2	158881	1.0	0.0	1.0
+chr2	158990	1.0	0.0	1.0
+chr2	159005	1.0	0.0	1.0
+chr2	159048	1.0	0.0	1.0
+chr2	159074	1.0	0.0	1.0
+chr2	159179	0.0	2.0	2.0
+chr2	159330	1.0	0.0	1.0
+chr2	159428	1.0	0.0	1.0
+chr2	159507	1.0	0.0	1.0
+chr2	159509	1.0	0.0	1.0
+chr2	159510	1.0	0.0	1.0
+chr2	159646	1.0	0.0	1.0
+chr2	159662	1.0	0.0	1.0
+chr2	159663	0.0	2.0	2.0
+chr2	159672	3.0	1.0	4.0
+chr2	159674	1.0	0.0	1.0
+chr2	159696	0.0	1.0	1.0
+chr2	159702	0.0	1.0	1.0
+chr2	160108	0.0	1.0	1.0
+chr2	160123	0.0	1.0	1.0
+chr2	160130	0.0	1.0	1.0
+chr2	160138	2.0	0.0	2.0
+chr2	160140	1.0	0.0	1.0
+chr2	160143	1.0	0.0	1.0
+chr2	160144	1.0	0.0	1.0
+chr2	160149	1.0	4.0	5.0
+chr2	160150	0.0	1.0	1.0
+chr2	160151	0.0	1.0	1.0
+chr2	160154	2.0	0.0	2.0
+chr2	160155	2.0	0.0	2.0
+chr2	160156	0.0	7.0	7.0
+chr2	160158	0.0	4.0	4.0
+chr2	160162	1.0	6.0	7.0
+chr2	160163	1.0	3.0	4.0
+chr2	160164	1.0	0.0	1.0
+chr2	160165	3.0	0.0	3.0
+chr2	160172	2.0	0.0	2.0
+chr2	160177	0.0	1.0	1.0
+chr2	160180	0.0	1.0	1.0
+chr2	160310	2.0	0.0	2.0
+chr2	160311	1.0	0.0	1.0
+chr2	160315	1.0	0.0	1.0
+chr2	160319	0.0	4.0	4.0
+chr2	160492	0.0	2.0	2.0
+chr2	160496	1.0	0.0	1.0
+chr2	160639	1.0	0.0	1.0
+chr2	160663	1.0	0.0	1.0
+chr2	160675	1.0	0.0	1.0
+chr2	160689	1.0	0.0	1.0
+chr2	160786	0.0	1.0	1.0
+chr2	160798	1.0	0.0	1.0
+chr2	160945	0.0	1.0	1.0
+chr2	160959	1.0	0.0	1.0
+chr2	160975	1.0	0.0	1.0
+chr2	161263	1.0	0.0	1.0
+chr2	161278	1.0	0.0	1.0
+chr2	161294	1.0	0.0	1.0
+chr2	161411	1.0	0.0	1.0
+chr2	161414	1.0	0.0	1.0
+chr2	161708	0.0	1.0	1.0
+chr2	161709	0.0	2.0	2.0
+chr2	161711	1.0	0.0	1.0
+chr2	161716	0.0	3.0	3.0
+chr2	161719	1.0	0.0	1.0
+chr2	161720	1.0	2.0	3.0
+chr2	161724	1.0	0.0	1.0
+chr2	161725	4.0	3.0	7.0
+chr2	161726	4.0	1.0	5.0
+chr2	161727	0.0	1.0	1.0
+chr2	161728	4.0	0.0	4.0
+chr2	161730	1.0	0.0	1.0
+chr2	161731	0.0	1.0	1.0
+chr2	161732	1.0	2.0	3.0
+chr2	161735	6.0	0.0	6.0
+chr2	161737	0.0	1.0	1.0
+chr2	161739	0.0	1.0	1.0
+chr2	161892	0.0	1.0	1.0
+chr2	161899	0.0	1.0	1.0
+chr2	161900	1.0	0.0	1.0
+chr2	162046	1.0	0.0	1.0
+chr2	162049	1.0	0.0	1.0
+chr2	162077	0.0	1.0	1.0
+chr2	162093	0.0	1.0	1.0
+chr2	162255	0.0	1.0	1.0
+chr2	162261	1.0	0.0	1.0
+chr2	162426	1.0	0.0	1.0
+chr2	162440	2.0	0.0	2.0
+chr2	162453	0.0	1.0	1.0
+chr2	162507	0.0	1.0	1.0
+chr2	162570	1.0	0.0	1.0
+chr2	162586	0.0	1.0	1.0
+chr2	162607	1.0	0.0	1.0
+chr2	162651	0.0	1.0	1.0
+chr2	162668	0.0	1.0	1.0
+chr2	163210	1.0	0.0	1.0
+chr2	163231	0.0	1.0	1.0
+chr2	163292	1.0	0.0	1.0
+chr2	163437	0.0	1.0	1.0
+chr2	163464	4.0	0.0	4.0
+chr2	163613	0.0	1.0	1.0
+chr2	163661	1.0	0.0	1.0
+chr2	163686	1.0	0.0	1.0
+chr2	163842	0.0	1.0	1.0
+chr2	163843	0.0	2.0	2.0
+chr2	163848	0.0	1.0	1.0
+chr2	163969	2.0	0.0	2.0
+chr2	164006	1.0	0.0	1.0
+chr2	164042	0.0	1.0	1.0
+chr2	164100	0.0	1.0	1.0
+chr2	164103	0.0	1.0	1.0
+chr2	164177	0.0	1.0	1.0
+chr2	164195	0.0	2.0	2.0
+chr2	164233	0.0	1.0	1.0
+chr2	164241	0.0	1.0	1.0
+chr2	164263	0.0	1.0	1.0
+chr2	164281	3.0	0.0	3.0
+chr2	164506	2.0	0.0	2.0
+chr2	164508	1.0	0.0	1.0
+chr2	164511	3.0	0.0	3.0
+chr2	164521	0.0	1.0	1.0
+chr2	164527	0.0	1.0	1.0
+chr2	164534	1.0	1.0	2.0
+chr2	164535	1.0	0.0	1.0
+chr2	164536	1.0	1.0	2.0
+chr2	164538	1.0	0.0	1.0
+chr2	164548	0.0	1.0	1.0
+chr2	164553	0.0	1.0	1.0
+chr2	164616	1.0	0.0	1.0
+chr2	164665	0.0	1.0	1.0
+chr2	164695	1.0	0.0	1.0
+chr2	164705	1.0	1.0	2.0
+chr2	164812	0.0	1.0	1.0
+chr2	164840	0.0	1.0	1.0
+chr2	164841	0.0	1.0	1.0
+chr2	164852	0.0	1.0	1.0
+chr2	164856	0.0	1.0	1.0
+chr2	164859	1.0	0.0	1.0
+chr2	164863	0.0	1.0	1.0
+chr2	164864	1.0	0.0	1.0
+chr2	164874	0.0	2.0	2.0
+chr2	164875	0.0	1.0	1.0
+chr2	164878	2.0	0.0	2.0
+chr2	164883	1.0	0.0	1.0
+chr2	164888	0.0	1.0	1.0
+chr2	164890	0.0	1.0	1.0
+chr2	164891	1.0	0.0	1.0
+chr2	164901	1.0	0.0	1.0
+chr2	165519	1.0	1.0	2.0
+chr2	165520	1.0	0.0	1.0
+chr2	165578	0.0	1.0	1.0
+chr2	165677	0.0	1.0	1.0
+chr2	165776	0.0	1.0	1.0
+chr2	165778	0.0	1.0	1.0
+chr2	165788	1.0	0.0	1.0
+chr2	165793	0.0	1.0	1.0
+chr2	165794	0.0	1.0	1.0
+chr2	165812	0.0	1.0	1.0
+chr2	165823	1.0	0.0	1.0
+chr2	166023	1.0	0.0	1.0
+chr2	166030	0.0	1.0	1.0
+chr2	166184	0.0	1.0	1.0
+chr2	166235	0.0	1.0	1.0
+chr2	166260	1.0	0.0	1.0
+chr2	166264	0.0	1.0	1.0
+chr2	166283	0.0	1.0	1.0
+chr2	166307	0.0	1.0	1.0
+chr2	166474	1.0	0.0	1.0
+chr2	166528	0.0	1.0	1.0
+chr2	166562	1.0	1.0	2.0
+chr2	166564	0.0	1.0	1.0
+chr2	166582	0.0	1.0	1.0
+chr2	166603	0.0	1.0	1.0
+chr2	166627	0.0	1.0	1.0
+chr2	166692	1.0	0.0	1.0
+chr2	166699	1.0	0.0	1.0
+chr2	166700	0.0	1.0	1.0
+chr2	166731	0.0	2.0	2.0
+chr2	166741	1.0	0.0	1.0
+chr2	166744	1.0	1.0	2.0
+chr2	166764	1.0	0.0	1.0
+chr2	166769	0.0	1.0	1.0
+chr2	166830	0.0	1.0	1.0
+chr2	166838	1.0	0.0	1.0
+chr2	166887	0.0	1.0	1.0
+chr2	166898	0.0	1.0	1.0
+chr2	166907	0.0	1.0	1.0
+chr2	166908	0.0	2.0	2.0
+chr2	166927	1.0	0.0	1.0
+chr2	166930	0.0	4.0	4.0
+chr2	166931	0.0	1.0	1.0
+chr2	166946	0.0	2.0	2.0
+chr2	166957	0.0	1.0	1.0
+chr2	166966	1.0	0.0	1.0
+chr2	167014	0.0	1.0	1.0
+chr2	167073	1.0	0.0	1.0
+chr2	167094	0.0	2.0	2.0
+chr2	167170	0.0	1.0	1.0
+chr2	167173	1.0	0.0	1.0
+chr2	167179	0.0	1.0	1.0
+chr2	167188	0.0	1.0	1.0
+chr2	167190	3.0	0.0	3.0
+chr2	167193	0.0	1.0	1.0
+chr2	167195	1.0	0.0	1.0
+chr2	167206	0.0	1.0	1.0
+chr2	167207	0.0	1.0	1.0
+chr2	167656	0.0	2.0	2.0
+chr2	167823	1.0	0.0	1.0
+chr2	167824	0.0	1.0	1.0
+chr2	167825	1.0	0.0	1.0
+chr2	167827	0.0	1.0	1.0
+chr2	167833	0.0	1.0	1.0
+chr2	167846	0.0	1.0	1.0
+chr2	167847	0.0	1.0	1.0
+chr2	167850	0.0	1.0	1.0
+chr2	167851	1.0	0.0	1.0
+chr2	168895	1.0	0.0	1.0
+chr2	168964	1.0	0.0	1.0
+chr2	168981	1.0	0.0	1.0
+chr2	169051	1.0	0.0	1.0
+chr2	169123	0.0	1.0	1.0
+chr2	169178	1.0	0.0	1.0
+chr2	169186	1.0	0.0	1.0
+chr2	169225	0.0	1.0	1.0
+chr2	169579	0.0	2.0	2.0
+chr2	169667	1.0	0.0	1.0
+chr2	169692	1.0	0.0	1.0
+chr2	169740	0.0	2.0	2.0
+chr2	169799	1.0	0.0	1.0
+chr2	169800	1.0	0.0	1.0
+chr2	169808	0.0	2.0	2.0
+chr2	169827	0.0	1.0	1.0
+chr2	169862	0.0	1.0	1.0
+chr2	169864	0.0	2.0	2.0
+chr2	169868	0.0	1.0	1.0
+chr2	169872	1.0	0.0	1.0
+chr2	169881	0.0	1.0	1.0
+chr2	169882	1.0	0.0	1.0
+chr2	169885	0.0	1.0	1.0
+chr2	169887	3.0	0.0	3.0
+chr2	169888	1.0	0.0	1.0
+chr2	169890	2.0	0.0	2.0
+chr2	169892	1.0	0.0	1.0
+chr2	169894	0.0	1.0	1.0
+chr2	169900	1.0	0.0	1.0
+chr2	169901	0.0	2.0	2.0
+chr2	169918	4.0	0.0	4.0
+chr2	169926	0.0	1.0	1.0
+chr2	169957	1.0	0.0	1.0
+chr2	169964	1.0	0.0	1.0
+chr2	170129	0.0	2.0	2.0
+chr2	170143	0.0	1.0	1.0
+chr2	170206	0.0	1.0	1.0
+chr2	170355	1.0	0.0	1.0
+chr2	170356	1.0	0.0	1.0
+chr2	170357	1.0	0.0	1.0
+chr2	170395	0.0	1.0	1.0
+chr2	170397	1.0	0.0	1.0
+chr2	170602	0.0	1.0	1.0
+chr2	170603	0.0	1.0	1.0
+chr2	170608	0.0	2.0	2.0
+chr2	170615	0.0	1.0	1.0
+chr2	170616	0.0	2.0	2.0
+chr2	170617	2.0	1.0	3.0
+chr2	170620	4.0	0.0	4.0
+chr2	170626	1.0	0.0	1.0
+chr2	170632	0.0	1.0	1.0
+chr2	170633	0.0	1.0	1.0
+chr2	170639	1.0	1.0	2.0
+chr2	170647	1.0	0.0	1.0
+chr2	170650	1.0	0.0	1.0
+chr2	170741	0.0	1.0	1.0
+chr2	170745	0.0	2.0	2.0
+chr2	170761	0.0	1.0	1.0
+chr2	170776	0.0	1.0	1.0
+chr2	170781	0.0	1.0	1.0
+chr2	170799	0.0	2.0	2.0
+chr2	170810	2.0	0.0	2.0
+chr2	170933	1.0	0.0	1.0
+chr2	170970	0.0	1.0	1.0
+chr2	171207	1.0	0.0	1.0
+chr2	171211	3.0	0.0	3.0
+chr2	171213	0.0	1.0	1.0
+chr2	171219	1.0	0.0	1.0
+chr2	171221	0.0	1.0	1.0
+chr2	171222	1.0	0.0	1.0
+chr2	171226	3.0	0.0	3.0
+chr2	171229	0.0	1.0	1.0
+chr2	171232	0.0	2.0	2.0
+chr2	171233	0.0	1.0	1.0
+chr2	171246	1.0	0.0	1.0
+chr2	171261	1.0	0.0	1.0
+chr2	171454	0.0	1.0	1.0
+chr2	171466	0.0	1.0	1.0
+chr2	171472	2.0	0.0	2.0
+chr2	171474	2.0	0.0	2.0
+chr2	171482	1.0	0.0	1.0
+chr2	171484	0.0	1.0	1.0
+chr2	171496	0.0	1.0	1.0
+chr2	171506	1.0	0.0	1.0
+chr2	171613	0.0	1.0	1.0
+chr2	171627	0.0	1.0	1.0
+chr2	171631	2.0	0.0	2.0
+chr2	171645	0.0	1.0	1.0
+chr2	171649	0.0	3.0	3.0
+chr2	171650	0.0	1.0	1.0
+chr2	171671	0.0	1.0	1.0
+chr2	171676	1.0	0.0	1.0
+chr2	171819	1.0	0.0	1.0
+chr2	171828	1.0	0.0	1.0
+chr2	171840	0.0	1.0	1.0
+chr2	171898	0.0	1.0	1.0
+chr2	172053	1.0	0.0	1.0
+chr2	172090	1.0	0.0	1.0
+chr2	172206	0.0	1.0	1.0
+chr2	172211	0.0	1.0	1.0
+chr2	172214	1.0	0.0	1.0
+chr2	172227	0.0	1.0	1.0
+chr2	172234	1.0	0.0	1.0
+chr2	172247	0.0	1.0	1.0
+chr2	172270	2.0	0.0	2.0
+chr2	172515	1.0	0.0	1.0
+chr2	172519	0.0	1.0	1.0
+chr2	172522	1.0	0.0	1.0
+chr2	172524	0.0	1.0	1.0
+chr2	172527	0.0	1.0	1.0
+chr2	172532	0.0	1.0	1.0
+chr2	172533	1.0	0.0	1.0
+chr2	172534	0.0	1.0	1.0
+chr2	172535	1.0	0.0	1.0
+chr2	172538	1.0	0.0	1.0
+chr2	172539	2.0	1.0	3.0
+chr2	172540	1.0	1.0	2.0
+chr2	172546	1.0	0.0	1.0
+chr2	172547	1.0	1.0	2.0
+chr2	172548	2.0	0.0	2.0
+chr2	172552	0.0	1.0	1.0
+chr2	172554	1.0	0.0	1.0
+chr2	172555	0.0	2.0	2.0
+chr2	172556	0.0	1.0	1.0
+chr2	172557	1.0	0.0	1.0
+chr2	172563	1.0	0.0	1.0
+chr2	172566	1.0	0.0	1.0
+chr2	172574	1.0	0.0	1.0
+chr2	172629	1.0	0.0	1.0
+chr2	172664	0.0	1.0	1.0
+chr2	172700	0.0	1.0	1.0
+chr2	172704	1.0	0.0	1.0
+chr2	172705	0.0	1.0	1.0
+chr2	172769	1.0	0.0	1.0
+chr2	172836	0.0	1.0	1.0
+chr2	172861	0.0	1.0	1.0
+chr2	173119	0.0	1.0	1.0
+chr2	173890	1.0	0.0	1.0
+chr2	174561	0.0	1.0	1.0
+chr2	174630	0.0	1.0	1.0
+chr2	175150	0.0	1.0	1.0
+chr2	175242	0.0	1.0	1.0
+chr2	175291	0.0	1.0	1.0
+chr2	175328	0.0	1.0	1.0
+chr2	175482	0.0	3.0	3.0
+chr2	175553	1.0	0.0	1.0
+chr2	175874	0.0	1.0	1.0
+chr2	175930	1.0	0.0	1.0
+chr2	175932	0.0	2.0	2.0
+chr2	176160	0.0	1.0	1.0
+chr2	176378	1.0	0.0	1.0
+chr2	176394	1.0	0.0	1.0
+chr2	176516	0.0	2.0	2.0
+chr2	177024	0.0	1.0	1.0
+chr2	177186	0.0	1.0	1.0
+chr2	177265	0.0	1.0	1.0
+chr2	177369	0.0	3.0	3.0
+chr2	177388	1.0	0.0	1.0
+chr2	177391	1.0	0.0	1.0
+chr2	177398	1.0	0.0	1.0
+chr2	177403	0.0	1.0	1.0
+chr2	177406	1.0	0.0	1.0
+chr2	177415	0.0	1.0	1.0
+chr2	177418	0.0	1.0	1.0
+chr2	177442	1.0	0.0	1.0
+chr2	177523	3.0	0.0	3.0
+chr2	177543	0.0	1.0	1.0
+chr2	177545	0.0	1.0	1.0
+chr2	177555	0.0	1.0	1.0
+chr2	177595	1.0	0.0	1.0
+chr2	177609	1.0	0.0	1.0
+chr2	177626	1.0	0.0	1.0
+chr2	177994	1.0	0.0	1.0
+chr2	178207	0.0	1.0	1.0
+chr2	178516	0.0	2.0	2.0
+chr2	180264	0.0	1.0	1.0
+chr2	180366	1.0	0.0	1.0
+chr2	180405	1.0	0.0	1.0
+chr2	180532	0.0	1.0	1.0
+chr2	180540	1.0	0.0	1.0
+chr2	180559	1.0	0.0	1.0
+chr2	181003	0.0	1.0	1.0
+chr2	181018	1.0	0.0	1.0
+chr2	181029	0.0	1.0	1.0
+chr2	181195	0.0	1.0	1.0
+chr2	181204	0.0	1.0	1.0
+chr2	181210	0.0	1.0	1.0
+chr2	181350	1.0	0.0	1.0
+chr2	181351	4.0	0.0	4.0
+chr2	181355	0.0	2.0	2.0
+chr2	181356	1.0	0.0	1.0
+chr2	181359	2.0	0.0	2.0
+chr2	181362	0.0	1.0	1.0
+chr2	181363	2.0	0.0	2.0
+chr2	181364	1.0	0.0	1.0
+chr2	181366	1.0	1.0	2.0
+chr2	181367	0.0	3.0	3.0
+chr2	181368	0.0	1.0	1.0
+chr2	181371	3.0	0.0	3.0
+chr2	181380	0.0	3.0	3.0
+chr2	181381	0.0	2.0	2.0
+chr2	181384	0.0	1.0	1.0
+chr2	181385	0.0	2.0	2.0
+chr2	181392	0.0	1.0	1.0
+chr2	181424	1.0	0.0	1.0
+chr2	181615	0.0	1.0	1.0
+chr2	181617	0.0	1.0	1.0
+chr2	181644	1.0	0.0	1.0
+chr2	181652	1.0	0.0	1.0
+chr2	181911	1.0	0.0	1.0
+chr2	181917	0.0	1.0	1.0
+chr2	181928	1.0	0.0	1.0
+chr2	181957	0.0	1.0	1.0
+chr2	182024	0.0	1.0	1.0
+chr2	182056	0.0	2.0	2.0
+chr2	182058	1.0	0.0	1.0
+chr2	182063	1.0	0.0	1.0
+chr2	182066	3.0	3.0	6.0
+chr2	182067	3.0	0.0	3.0
+chr2	182071	1.0	0.0	1.0
+chr2	182076	0.0	4.0	4.0
+chr2	182079	1.0	0.0	1.0
+chr2	182081	0.0	1.0	1.0
+chr2	182085	0.0	1.0	1.0
+chr2	182087	1.0	0.0	1.0
+chr2	182098	0.0	1.0	1.0
+chr2	182281	0.0	2.0	2.0
+chr2	182343	2.0	0.0	2.0
+chr2	182344	0.0	1.0	1.0
+chr2	182345	1.0	0.0	1.0
+chr2	182350	0.0	1.0	1.0
+chr2	182357	1.0	0.0	1.0
+chr2	182360	0.0	1.0	1.0
+chr2	182363	0.0	1.0	1.0
+chr2	182364	0.0	1.0	1.0
+chr2	182368	0.0	1.0	1.0
+chr2	182371	0.0	1.0	1.0
+chr2	182376	0.0	1.0	1.0
+chr2	182512	1.0	0.0	1.0
+chr2	182528	3.0	0.0	3.0
+chr2	182550	0.0	1.0	1.0
+chr2	182673	0.0	2.0	2.0
+chr2	182712	1.0	0.0	1.0
+chr2	182716	0.0	1.0	1.0
+chr2	182903	0.0	1.0	1.0
+chr2	183003	1.0	0.0	1.0
+chr2	183025	0.0	1.0	1.0
+chr2	183029	1.0	0.0	1.0
+chr2	183040	0.0	1.0	1.0
+chr2	183064	1.0	0.0	1.0
+chr2	183228	1.0	0.0	1.0
+chr2	183709	1.0	0.0	1.0
+chr2	183825	1.0	0.0	1.0
+chr2	183977	1.0	0.0	1.0
+chr2	184337	0.0	1.0	1.0
+chr2	184340	1.0	0.0	1.0
+chr2	184345	0.0	2.0	2.0
+chr2	184349	1.0	0.0	1.0
+chr2	184353	0.0	1.0	1.0
+chr2	184354	1.0	0.0	1.0
+chr2	184356	0.0	1.0	1.0
+chr2	184360	0.0	2.0	2.0
+chr2	184361	0.0	1.0	1.0
+chr2	184365	1.0	0.0	1.0
+chr2	184368	1.0	0.0	1.0
+chr2	184369	1.0	0.0	1.0
+chr2	184370	0.0	1.0	1.0
+chr2	184372	0.0	1.0	1.0
+chr2	184374	0.0	1.0	1.0
+chr2	184377	0.0	1.0	1.0
+chr2	184378	1.0	0.0	1.0
+chr2	184379	0.0	1.0	1.0
+chr2	184388	0.0	2.0	2.0
+chr2	184392	1.0	0.0	1.0
+chr2	184417	1.0	0.0	1.0
+chr2	184516	0.0	1.0	1.0
+chr2	184519	0.0	1.0	1.0
+chr2	184530	1.0	0.0	1.0
+chr2	184537	3.0	0.0	3.0
+chr2	184540	0.0	1.0	1.0
+chr2	184547	0.0	1.0	1.0
+chr2	184557	1.0	0.0	1.0
+chr2	184580	0.0	1.0	1.0
+chr2	184597	0.0	1.0	1.0
+chr2	184626	0.0	2.0	2.0
+chr2	184694	2.0	0.0	2.0
+chr2	184715	0.0	1.0	1.0
+chr2	184723	0.0	1.0	1.0
+chr2	184728	1.0	0.0	1.0
+chr2	184743	0.0	1.0	1.0
+chr2	184748	1.0	0.0	1.0
+chr2	184766	1.0	0.0	1.0
+chr2	184867	1.0	0.0	1.0
+chr2	184888	0.0	1.0	1.0
+chr2	184914	1.0	0.0	1.0
+chr2	184939	0.0	1.0	1.0
+chr2	184941	1.0	0.0	1.0
+chr2	185037	0.0	1.0	1.0
+chr2	185040	0.0	1.0	1.0
+chr2	185041	1.0	0.0	1.0
+chr2	185062	0.0	1.0	1.0
+chr2	185067	1.0	0.0	1.0
+chr2	185079	1.0	0.0	1.0
+chr2	185094	0.0	1.0	1.0
+chr2	185100	3.0	0.0	3.0
+chr2	185104	2.0	0.0	2.0
+chr2	185144	1.0	0.0	1.0
+chr2	185200	0.0	1.0	1.0
+chr2	185245	0.0	1.0	1.0
+chr2	185280	1.0	0.0	1.0
+chr2	185436	0.0	1.0	1.0
+chr2	185593	1.0	0.0	1.0
+chr2	185604	2.0	0.0	2.0
+chr2	185615	0.0	1.0	1.0
+chr2	185693	1.0	0.0	1.0
+chr2	185714	2.0	0.0	2.0
+chr2	185756	0.0	1.0	1.0
+chr2	185770	2.0	0.0	2.0
+chr2	185772	1.0	0.0	1.0
+chr2	185778	0.0	1.0	1.0
+chr2	185799	1.0	1.0	2.0
+chr2	185837	1.0	0.0	1.0
+chr2	186044	0.0	1.0	1.0
+chr2	186104	0.0	1.0	1.0
+chr2	186160	0.0	1.0	1.0
+chr2	186279	1.0	0.0	1.0
+chr2	186280	0.0	1.0	1.0
+chr2	186283	0.0	1.0	1.0
+chr2	186284	0.0	2.0	2.0
+chr2	186286	1.0	0.0	1.0
+chr2	186291	2.0	0.0	2.0
+chr2	186299	2.0	0.0	2.0
+chr2	186300	1.0	0.0	1.0
+chr2	186307	0.0	1.0	1.0
+chr2	186309	0.0	2.0	2.0
+chr2	186317	1.0	0.0	1.0
+chr2	186324	1.0	0.0	1.0
+chr2	186439	0.0	2.0	2.0
+chr2	186444	0.0	1.0	1.0
+chr2	186447	0.0	1.0	1.0
+chr2	186459	0.0	1.0	1.0
+chr2	186460	1.0	0.0	1.0
+chr2	186461	2.0	0.0	2.0
+chr2	186469	0.0	1.0	1.0
+chr2	186472	0.0	1.0	1.0
+chr2	186475	0.0	5.0	5.0
+chr2	186480	0.0	1.0	1.0
+chr2	186483	0.0	1.0	1.0
+chr2	186506	1.0	0.0	1.0
+chr2	186528	1.0	0.0	1.0
+chr2	186722	0.0	1.0	1.0
+chr2	186735	1.0	0.0	1.0
+chr2	186746	1.0	1.0	2.0
+chr2	186757	0.0	1.0	1.0
+chr2	186761	0.0	1.0	1.0
+chr2	186763	0.0	1.0	1.0
+chr2	186768	0.0	1.0	1.0
+chr2	186773	0.0	2.0	2.0
+chr2	186810	1.0	0.0	1.0
+chr2	186921	0.0	1.0	1.0
+chr2	186935	1.0	0.0	1.0
+chr2	186954	0.0	1.0	1.0
+chr2	187224	1.0	0.0	1.0
+chr2	187265	0.0	2.0	2.0
+chr2	187315	1.0	0.0	1.0
+chr2	187631	0.0	1.0	1.0
+chr2	187820	0.0	1.0	1.0
+chr2	187858	1.0	0.0	1.0
+chr2	188022	1.0	0.0	1.0
+chr2	188089	1.0	0.0	1.0
+chr2	188172	2.0	0.0	2.0
+chr2	188432	0.0	1.0	1.0
+chr2	188461	1.0	0.0	1.0
+chr2	188492	0.0	3.0	3.0
+chr2	188495	0.0	1.0	1.0
+chr2	188504	0.0	1.0	1.0
+chr2	188543	0.0	1.0	1.0
+chr2	188596	0.0	1.0	1.0
+chr2	188599	1.0	0.0	1.0
+chr2	188632	1.0	0.0	1.0
+chr2	188726	1.0	0.0	1.0
+chr2	188744	1.0	0.0	1.0
+chr2	188976	1.0	0.0	1.0
+chr2	189487	1.0	0.0	1.0
+chr2	189651	1.0	0.0	1.0
+chr2	189721	1.0	0.0	1.0
+chr2	189743	0.0	1.0	1.0
+chr2	189773	1.0	0.0	1.0
+chr2	190009	1.0	0.0	1.0
+chr2	190179	1.0	0.0	1.0
+chr2	190308	1.0	0.0	1.0
+chr2	190452	0.0	1.0	1.0
+chr2	190626	1.0	0.0	1.0
+chr2	190949	0.0	1.0	1.0
+chr2	191081	1.0	0.0	1.0
+chr2	191237	1.0	0.0	1.0
+chr2	191362	0.0	1.0	1.0
+chr2	191422	1.0	0.0	1.0
+chr2	191577	1.0	0.0	1.0
+chr2	191703	2.0	0.0	2.0
+chr2	191716	2.0	0.0	2.0
+chr2	191724	0.0	2.0	2.0
+chr2	191731	0.0	1.0	1.0
+chr2	191734	0.0	2.0	2.0
+chr2	191737	1.0	0.0	1.0
+chr2	191740	1.0	0.0	1.0
+chr2	191741	1.0	0.0	1.0
+chr2	191754	1.0	0.0	1.0
+chr2	192001	1.0	1.0	2.0
+chr2	192003	1.0	0.0	1.0
+chr2	192035	1.0	0.0	1.0
+chr2	192351	1.0	0.0	1.0
+chr2	192539	0.0	1.0	1.0
+chr2	192553	2.0	0.0	2.0
+chr2	192554	0.0	2.0	2.0
+chr2	192557	0.0	1.0	1.0
+chr2	192588	1.0	0.0	1.0
+chr2	192696	1.0	0.0	1.0
+chr2	192790	0.0	1.0	1.0
+chr2	193210	0.0	1.0	1.0
+chr2	193220	0.0	1.0	1.0
+chr2	193233	1.0	0.0	1.0
+chr2	193316	1.0	0.0	1.0
+chr2	193321	0.0	1.0	1.0
+chr2	193350	2.0	0.0	2.0
+chr2	193354	1.0	0.0	1.0
+chr2	193361	1.0	0.0	1.0
+chr2	193375	1.0	0.0	1.0
+chr2	193429	0.0	1.0	1.0
+chr2	193844	0.0	1.0	1.0
+chr2	193848	0.0	1.0	1.0
+chr2	193858	0.0	1.0	1.0
+chr2	193866	0.0	1.0	1.0
+chr2	193877	0.0	1.0	1.0
+chr2	193896	1.0	0.0	1.0
+chr2	193898	1.0	1.0	2.0
+chr2	193899	0.0	1.0	1.0
+chr2	193900	0.0	1.0	1.0
+chr2	193921	1.0	0.0	1.0
+chr2	193924	2.0	0.0	2.0
+chr2	193927	1.0	0.0	1.0
+chr2	193928	2.0	4.0	6.0
+chr2	193929	0.0	1.0	1.0
+chr2	193932	0.0	1.0	1.0
+chr2	193933	1.0	0.0	1.0
+chr2	193938	0.0	3.0	3.0
+chr2	193939	1.0	0.0	1.0
+chr2	193945	1.0	0.0	1.0
+chr2	193946	3.0	0.0	3.0
+chr2	193953	0.0	1.0	1.0
+chr2	193954	0.0	5.0	5.0
+chr2	193958	1.0	1.0	2.0
+chr2	193960	1.0	0.0	1.0
+chr2	193961	1.0	0.0	1.0
+chr2	193965	1.0	0.0	1.0
+chr2	193968	1.0	0.0	1.0
+chr2	193969	1.0	0.0	1.0
+chr2	193978	1.0	0.0	1.0
+chr2	193990	0.0	1.0	1.0
+chr2	193995	1.0	1.0	2.0
+chr2	194113	2.0	0.0	2.0
+chr2	194144	1.0	0.0	1.0
+chr2	194189	1.0	0.0	1.0
+chr2	194214	0.0	1.0	1.0
+chr2	194231	1.0	0.0	1.0
+chr2	194259	1.0	0.0	1.0
+chr2	194268	1.0	0.0	1.0
+chr2	194288	0.0	1.0	1.0
+chr2	194295	0.0	1.0	1.0
+chr2	194397	0.0	1.0	1.0
+chr2	194429	0.0	2.0	2.0
+chr2	194454	1.0	0.0	1.0
+chr2	194462	1.0	0.0	1.0
+chr2	194463	1.0	0.0	1.0
+chr2	194470	1.0	0.0	1.0
+chr2	194471	1.0	0.0	1.0
+chr2	194472	1.0	0.0	1.0
+chr2	194480	0.0	1.0	1.0
+chr2	194551	0.0	1.0	1.0
+chr2	194589	0.0	1.0	1.0
+chr2	194616	0.0	1.0	1.0
+chr2	194623	0.0	1.0	1.0
+chr2	194630	1.0	0.0	1.0
+chr2	194631	1.0	0.0	1.0
+chr2	194650	1.0	0.0	1.0
+chr2	194772	1.0	0.0	1.0
+chr2	194773	3.0	0.0	3.0
+chr2	194781	0.0	1.0	1.0
+chr2	194796	1.0	0.0	1.0
+chr2	194798	0.0	1.0	1.0
+chr2	194817	1.0	0.0	1.0
+chr2	194837	0.0	1.0	1.0
+chr2	194839	0.0	1.0	1.0
+chr2	194983	0.0	1.0	1.0
+chr2	195192	0.0	1.0	1.0
+chr2	195205	1.0	0.0	1.0
+chr2	195209	1.0	0.0	1.0
+chr2	195316	1.0	0.0	1.0
+chr2	195372	2.0	0.0	2.0
+chr2	195528	0.0	1.0	1.0
+chr2	195531	1.0	0.0	1.0
+chr2	195549	0.0	1.0	1.0
+chr2	195570	0.0	1.0	1.0
+chr2	195599	1.0	0.0	1.0
+chr2	195696	1.0	0.0	1.0
+chr2	195717	1.0	0.0	1.0
+chr2	195749	1.0	0.0	1.0
+chr2	195870	2.0	0.0	2.0
+chr2	196030	0.0	2.0	2.0
+chr2	196055	1.0	0.0	1.0
+chr2	196058	1.0	0.0	1.0
+chr2	196062	0.0	1.0	1.0
+chr2	196064	1.0	0.0	1.0
+chr2	196066	1.0	0.0	1.0
+chr2	196069	1.0	0.0	1.0
+chr2	196071	1.0	0.0	1.0
+chr2	196074	1.0	0.0	1.0
+chr2	196078	1.0	0.0	1.0
+chr2	196079	1.0	1.0	2.0
+chr2	196080	0.0	1.0	1.0
+chr2	196084	1.0	0.0	1.0
+chr2	196089	1.0	0.0	1.0
+chr2	196091	1.0	0.0	1.0
+chr2	196092	1.0	0.0	1.0
+chr2	196096	1.0	0.0	1.0
+chr2	196100	0.0	1.0	1.0
+chr2	196115	0.0	1.0	1.0
+chr2	196116	0.0	1.0	1.0
+chr2	196278	2.0	0.0	2.0
+chr2	196279	1.0	0.0	1.0
+chr2	196315	1.0	0.0	1.0
+chr2	196320	1.0	0.0	1.0
+chr2	196325	1.0	0.0	1.0
+chr2	196332	1.0	0.0	1.0
+chr2	196333	4.0	0.0	4.0
+chr2	196336	0.0	1.0	1.0
+chr2	196339	0.0	1.0	1.0
+chr2	196345	1.0	0.0	1.0
+chr2	196346	2.0	0.0	2.0
+chr2	196347	0.0	1.0	1.0
+chr2	196352	1.0	0.0	1.0
+chr2	196354	2.0	0.0	2.0
+chr2	196355	0.0	1.0	1.0
+chr2	196359	2.0	1.0	3.0
+chr2	196364	5.0	0.0	5.0
+chr2	196369	1.0	0.0	1.0
+chr2	196372	0.0	1.0	1.0
+chr2	196488	2.0	0.0	2.0
+chr2	196496	0.0	1.0	1.0
+chr2	196508	1.0	0.0	1.0
+chr2	196519	0.0	1.0	1.0
+chr2	196522	2.0	0.0	2.0
+chr2	196530	2.0	0.0	2.0
+chr2	196532	1.0	1.0	2.0
+chr2	196538	1.0	0.0	1.0
+chr2	196676	0.0	3.0	3.0
+chr2	196770	0.0	1.0	1.0
+chr2	196840	0.0	1.0	1.0
+chr2	196842	1.0	0.0	1.0
+chr2	196843	0.0	1.0	1.0
+chr2	196847	0.0	1.0	1.0
+chr2	196851	1.0	0.0	1.0
+chr2	196854	1.0	0.0	1.0
+chr2	196859	1.0	0.0	1.0
+chr2	196865	0.0	1.0	1.0
+chr2	197194	0.0	1.0	1.0
+chr2	197341	1.0	0.0	1.0
+chr2	197741	0.0	1.0	1.0
+chr2	197745	0.0	3.0	3.0
+chr2	197767	0.0	2.0	2.0
+chr2	197769	0.0	2.0	2.0
+chr2	197772	0.0	1.0	1.0
+chr2	197777	0.0	6.0	6.0
+chr2	197778	0.0	3.0	3.0
+chr2	197779	0.0	2.0	2.0
+chr2	197782	0.0	2.0	2.0
+chr2	197784	0.0	3.0	3.0
+chr2	197790	2.0	0.0	2.0
+chr2	197794	1.0	1.0	2.0
+chr2	197796	1.0	0.0	1.0
+chr2	197797	0.0	1.0	1.0
+chr2	197812	0.0	1.0	1.0
+chr2	197813	1.0	0.0	1.0
+chr2	197824	0.0	1.0	1.0
+chr2	197825	1.0	0.0	1.0
+chr2	197831	0.0	1.0	1.0
+chr2	197833	0.0	6.0	6.0
+chr2	197834	0.0	3.0	3.0
+chr2	197835	0.0	1.0	1.0
+chr2	197838	1.0	1.0	2.0
+chr2	197841	0.0	1.0	1.0
+chr2	197846	0.0	1.0	1.0
+chr2	197847	0.0	2.0	2.0
+chr2	197848	1.0	0.0	1.0
+chr2	197849	2.0	2.0	4.0
+chr2	197850	2.0	0.0	2.0
+chr2	197851	1.0	0.0	1.0
+chr2	197853	0.0	1.0	1.0
+chr2	197854	0.0	1.0	1.0
+chr2	197855	2.0	0.0	2.0
+chr2	197856	1.0	0.0	1.0
+chr2	197857	2.0	0.0	2.0
+chr2	197858	0.0	1.0	1.0
+chr2	197859	0.0	1.0	1.0
+chr2	197861	5.0	0.0	5.0
+chr2	197864	1.0	0.0	1.0
+chr2	197867	0.0	1.0	1.0
+chr2	197868	0.0	1.0	1.0
+chr2	197869	1.0	0.0	1.0
+chr2	197871	1.0	0.0	1.0
+chr2	197872	0.0	1.0	1.0
+chr2	197876	1.0	0.0	1.0
+chr2	197878	3.0	0.0	3.0
+chr2	197886	1.0	0.0	1.0
+chr2	197891	1.0	0.0	1.0
+chr2	197893	1.0	1.0	2.0
+chr2	197894	0.0	2.0	2.0
+chr2	197895	1.0	0.0	1.0
+chr2	197896	0.0	2.0	2.0
+chr2	197902	1.0	0.0	1.0
+chr2	197909	1.0	0.0	1.0
+chr2	197910	4.0	0.0	4.0
+chr2	197919	0.0	2.0	2.0
+chr2	197922	0.0	1.0	1.0
+chr2	197923	0.0	2.0	2.0
+chr2	197924	0.0	1.0	1.0
+chr2	197927	1.0	0.0	1.0
+chr2	197930	0.0	3.0	3.0
+chr2	197932	0.0	1.0	1.0
+chr2	197934	1.0	0.0	1.0
+chr2	197938	1.0	0.0	1.0
+chr2	197942	0.0	1.0	1.0
+chr2	197944	0.0	2.0	2.0
+chr2	197946	1.0	0.0	1.0
+chr2	197947	2.0	0.0	2.0
+chr2	197955	1.0	0.0	1.0
+chr2	197968	0.0	1.0	1.0
+chr2	197976	0.0	1.0	1.0
+chr2	197981	0.0	1.0	1.0
+chr2	197984	0.0	1.0	1.0
+chr2	197988	2.0	0.0	2.0
+chr2	197993	1.0	0.0	1.0
+chr2	198000	0.0	1.0	1.0
+chr2	198004	0.0	1.0	1.0
+chr2	198009	1.0	0.0	1.0
+chr2	198011	5.0	0.0	5.0
+chr2	198012	2.0	0.0	2.0
+chr2	198013	2.0	0.0	2.0
+chr2	198014	3.0	0.0	3.0
+chr2	198015	8.0	0.0	8.0
+chr2	198018	5.0	0.0	5.0
+chr2	198019	1.0	0.0	1.0
+chr2	198021	1.0	0.0	1.0
+chr2	198023	3.0	0.0	3.0
+chr2	198043	1.0	0.0	1.0
+chr2	198046	1.0	0.0	1.0
+chr2	198058	0.0	1.0	1.0
+chr2	198105	0.0	1.0	1.0
+chr2	198157	1.0	0.0	1.0
+chr2	198253	1.0	0.0	1.0
+chr2	198272	1.0	0.0	1.0
+chr2	198287	2.0	0.0	2.0
+chr2	198312	0.0	2.0	2.0
+chr2	198542	1.0	1.0	2.0
+chr2	198557	1.0	0.0	1.0
+chr2	198559	0.0	2.0	2.0
+chr2	198574	1.0	0.0	1.0
+chr2	198582	0.0	1.0	1.0
+chr2	198673	0.0	1.0	1.0
+chr2	198683	0.0	1.0	1.0
+chr2	198684	0.0	1.0	1.0
+chr2	198695	1.0	0.0	1.0
+chr2	198709	1.0	0.0	1.0
+chr2	198710	0.0	1.0	1.0
+chr2	198714	0.0	1.0	1.0
+chr2	198732	0.0	1.0	1.0
+chr2	198735	5.0	0.0	5.0
+chr2	198739	1.0	0.0	1.0
+chr2	198775	1.0	0.0	1.0
+chr2	198925	1.0	0.0	1.0
+chr2	198941	0.0	1.0	1.0
+chr2	198959	0.0	1.0	1.0
+chr2	199215	2.0	0.0	2.0
+chr2	199471	0.0	1.0	1.0
+chr2	199840	2.0	0.0	2.0
+chr2	200155	0.0	1.0	1.0
+chr2	200186	1.0	0.0	1.0
+chr2	200303	1.0	0.0	1.0
+chr2	200651	0.0	1.0	1.0
+chr2	200909	1.0	0.0	1.0
+chr2	200990	1.0	0.0	1.0
+chr2	201038	1.0	0.0	1.0
+chr2	201275	1.0	0.0	1.0
+chr2	201401	1.0	0.0	1.0
+chr2	201408	0.0	1.0	1.0
+chr2	201435	1.0	0.0	1.0
+chr2	201549	1.0	0.0	1.0
+chr2	201550	1.0	0.0	1.0
+chr2	201561	0.0	1.0	1.0
+chr2	201562	1.0	0.0	1.0
+chr2	201572	0.0	2.0	2.0
+chr2	201582	0.0	2.0	2.0
+chr2	201689	0.0	1.0	1.0
+chr2	201698	0.0	1.0	1.0
+chr2	201701	0.0	1.0	1.0
+chr2	201705	0.0	2.0	2.0
+chr2	201708	0.0	1.0	1.0
+chr2	201713	0.0	1.0	1.0
+chr2	201715	3.0	0.0	3.0
+chr2	201716	0.0	1.0	1.0
+chr2	201720	0.0	1.0	1.0
+chr2	201721	0.0	2.0	2.0
+chr2	201722	2.0	1.0	3.0
+chr2	201723	0.0	5.0	5.0
+chr2	201724	0.0	1.0	1.0
+chr2	201725	1.0	0.0	1.0
+chr2	201726	3.0	5.0	8.0
+chr2	201728	1.0	5.0	6.0
+chr2	201730	2.0	0.0	2.0
+chr2	201732	0.0	2.0	2.0
+chr2	201733	1.0	2.0	3.0
+chr2	201734	1.0	1.0	2.0
+chr2	201735	1.0	0.0	1.0
+chr2	201736	1.0	0.0	1.0
+chr2	201738	0.0	1.0	1.0
+chr2	201739	3.0	0.0	3.0
+chr2	201742	1.0	3.0	4.0
+chr2	201746	2.0	0.0	2.0
+chr2	201750	1.0	0.0	1.0
+chr2	201751	4.0	0.0	4.0
+chr2	201755	1.0	0.0	1.0
+chr2	201763	1.0	0.0	1.0
+chr2	201765	1.0	0.0	1.0
+chr2	201778	0.0	2.0	2.0
+chr2	201779	0.0	1.0	1.0
+chr2	201790	1.0	0.0	1.0
+chr2	201792	0.0	1.0	1.0
+chr2	201812	0.0	1.0	1.0
+chr2	202000	0.0	1.0	1.0
+chr2	202021	1.0	0.0	1.0
+chr2	202022	1.0	0.0	1.0
+chr2	202034	1.0	0.0	1.0
+chr2	202037	0.0	1.0	1.0
+chr2	202039	0.0	5.0	5.0
+chr2	202049	0.0	1.0	1.0
+chr2	202050	2.0	0.0	2.0
+chr2	202057	0.0	1.0	1.0
+chr2	202063	0.0	3.0	3.0
+chr2	202076	1.0	0.0	1.0
+chr2	202080	1.0	0.0	1.0
+chr2	202085	0.0	1.0	1.0
+chr2	202090	0.0	1.0	1.0
+chr2	202093	0.0	1.0	1.0
+chr2	202100	0.0	1.0	1.0
+chr2	202106	0.0	1.0	1.0
+chr2	202115	1.0	0.0	1.0
+chr2	202220	0.0	1.0	1.0
+chr2	202223	0.0	3.0	3.0
+chr2	202226	1.0	0.0	1.0
+chr2	202229	1.0	0.0	1.0
+chr2	202230	0.0	1.0	1.0
+chr2	202235	1.0	0.0	1.0
+chr2	202241	0.0	1.0	1.0
+chr2	202246	1.0	0.0	1.0
+chr2	202247	0.0	1.0	1.0
+chr2	202248	0.0	1.0	1.0
+chr2	202250	0.0	1.0	1.0
+chr2	202255	0.0	1.0	1.0
+chr2	202263	0.0	1.0	1.0
+chr2	202311	1.0	0.0	1.0
+chr2	202595	1.0	0.0	1.0
+chr2	202596	1.0	0.0	1.0
+chr2	202612	0.0	2.0	2.0
+chr2	202614	1.0	0.0	1.0
+chr2	202619	0.0	3.0	3.0
+chr2	202622	0.0	1.0	1.0
+chr2	202624	2.0	0.0	2.0
+chr2	202626	2.0	0.0	2.0
+chr2	202630	1.0	1.0	2.0
+chr2	202632	0.0	1.0	1.0
+chr2	202639	1.0	0.0	1.0
+chr2	202650	0.0	2.0	2.0
+chr2	202652	2.0	0.0	2.0
+chr2	202686	0.0	2.0	2.0
+chr2	202697	1.0	0.0	1.0
+chr2	202802	1.0	0.0	1.0
+chr2	202804	5.0	0.0	5.0
+chr2	202808	1.0	0.0	1.0
+chr2	202810	0.0	1.0	1.0
+chr2	202818	1.0	0.0	1.0
+chr2	202863	0.0	1.0	1.0
+chr2	202897	1.0	0.0	1.0
+chr2	202902	1.0	0.0	1.0
+chr2	202921	0.0	1.0	1.0
+chr2	203021	0.0	1.0	1.0
+chr2	203069	0.0	2.0	2.0
+chr2	203105	1.0	0.0	1.0
+chr2	203115	0.0	1.0	1.0
+chr2	203175	1.0	0.0	1.0
+chr2	203407	1.0	0.0	1.0
+chr2	203455	1.0	0.0	1.0
+chr2	203469	1.0	0.0	1.0
+chr2	203503	1.0	0.0	1.0
+chr2	203514	1.0	0.0	1.0
+chr2	203515	0.0	1.0	1.0
+chr2	203523	1.0	0.0	1.0
+chr2	203642	1.0	0.0	1.0
+chr2	203643	1.0	0.0	1.0
+chr2	203660	0.0	1.0	1.0
+chr2	203661	1.0	1.0	2.0
+chr2	203678	1.0	0.0	1.0
+chr2	203686	3.0	0.0	3.0
+chr2	203689	0.0	1.0	1.0
+chr2	203695	2.0	0.0	2.0
+chr2	203698	2.0	0.0	2.0
+chr2	203811	1.0	0.0	1.0
+chr2	203822	1.0	0.0	1.0
+chr2	203841	0.0	1.0	1.0
+chr2	203843	0.0	1.0	1.0
+chr2	203844	0.0	1.0	1.0
+chr2	203980	0.0	1.0	1.0
+chr2	204011	2.0	0.0	2.0
+chr2	204014	0.0	1.0	1.0
+chr2	204207	0.0	1.0	1.0
+chr2	204386	0.0	1.0	1.0
+chr2	204744	0.0	1.0	1.0
+chr2	205001	1.0	0.0	1.0
+chr2	205169	0.0	1.0	1.0
+chr2	205337	0.0	1.0	1.0
+chr2	205520	0.0	1.0	1.0
+chr2	205546	1.0	0.0	1.0
+chr2	205558	0.0	1.0	1.0
+chr2	205608	2.0	0.0	2.0
+chr2	205657	0.0	1.0	1.0
+chr2	205741	1.0	0.0	1.0
+chr2	205748	1.0	0.0	1.0
+chr2	205781	0.0	1.0	1.0
+chr2	205793	1.0	0.0	1.0
+chr2	205800	1.0	1.0	2.0
+chr2	205833	1.0	0.0	1.0
+chr2	205837	0.0	1.0	1.0
+chr2	205966	1.0	0.0	1.0
+chr2	206223	0.0	1.0	1.0
+chr2	206235	1.0	0.0	1.0
+chr2	206405	0.0	2.0	2.0
+chr2	206531	1.0	0.0	1.0
+chr2	206542	1.0	0.0	1.0
+chr2	206546	0.0	1.0	1.0
+chr2	206547	0.0	1.0	1.0
+chr2	206552	1.0	0.0	1.0
+chr2	206557	0.0	1.0	1.0
+chr2	206586	0.0	1.0	1.0
+chr2	206719	0.0	1.0	1.0
+chr2	206750	0.0	1.0	1.0
+chr2	206752	1.0	0.0	1.0
+chr2	206878	0.0	1.0	1.0
+chr2	206883	1.0	0.0	1.0
+chr2	206887	0.0	1.0	1.0
+chr2	206888	1.0	3.0	4.0
+chr2	206898	3.0	0.0	3.0
+chr2	206899	1.0	0.0	1.0
+chr2	206903	0.0	8.0	8.0
+chr2	206904	0.0	2.0	2.0
+chr2	206906	3.0	1.0	4.0
+chr2	206907	0.0	1.0	1.0
+chr2	206908	5.0	0.0	5.0
+chr2	206909	2.0	8.0	10.0
+chr2	206910	5.0	1.0	6.0
+chr2	206913	1.0	2.0	3.0
+chr2	206915	1.0	0.0	1.0
+chr2	206916	2.0	0.0	2.0
+chr2	206917	5.0	1.0	6.0
+chr2	206918	0.0	4.0	4.0
+chr2	206919	5.0	0.0	5.0
+chr2	206920	0.0	1.0	1.0
+chr2	206923	0.0	4.0	4.0
+chr2	206924	0.0	1.0	1.0
+chr2	206927	1.0	0.0	1.0
+chr2	206928	1.0	0.0	1.0
+chr2	206931	1.0	0.0	1.0
+chr2	206932	1.0	0.0	1.0
+chr2	206935	3.0	4.0	7.0
+chr2	206942	1.0	0.0	1.0
+chr2	206947	0.0	1.0	1.0
+chr2	206958	1.0	0.0	1.0
+chr2	206964	0.0	1.0	1.0
+chr2	207141	1.0	0.0	1.0
+chr2	207171	0.0	1.0	1.0
+chr2	207184	1.0	0.0	1.0
+chr2	207185	0.0	1.0	1.0
+chr2	207187	1.0	1.0	2.0
+chr2	207191	0.0	2.0	2.0
+chr2	207194	0.0	1.0	1.0
+chr2	207197	0.0	1.0	1.0
+chr2	207208	1.0	3.0	4.0
+chr2	207210	1.0	0.0	1.0
+chr2	207211	2.0	1.0	3.0
+chr2	207212	1.0	0.0	1.0
+chr2	207213	6.0	8.0	14.0
+chr2	207214	0.0	4.0	4.0
+chr2	207215	0.0	1.0	1.0
+chr2	207216	1.0	0.0	1.0
+chr2	207218	1.0	0.0	1.0
+chr2	207219	4.0	0.0	4.0
+chr2	207222	1.0	0.0	1.0
+chr2	207223	1.0	0.0	1.0
+chr2	207229	0.0	1.0	1.0
+chr2	207231	3.0	0.0	3.0
+chr2	207237	3.0	0.0	3.0
+chr2	207252	0.0	1.0	1.0
+chr2	207356	0.0	1.0	1.0
+chr2	207371	0.0	1.0	1.0
+chr2	207380	0.0	1.0	1.0
+chr2	207566	0.0	1.0	1.0
+chr2	207571	2.0	0.0	2.0
+chr2	207590	1.0	0.0	1.0
+chr2	207858	1.0	0.0	1.0
+chr2	207879	1.0	0.0	1.0
+chr2	207991	0.0	1.0	1.0
+chr2	208038	0.0	1.0	1.0
+chr2	208053	0.0	1.0	1.0
+chr2	208223	0.0	1.0	1.0
+chr2	208324	0.0	1.0	1.0
+chr2	208359	0.0	1.0	1.0
+chr2	208862	1.0	0.0	1.0
+chr2	208881	1.0	0.0	1.0
+chr2	208976	0.0	1.0	1.0
+chr2	209041	1.0	0.0	1.0
+chr2	209048	0.0	2.0	2.0
+chr2	209204	1.0	0.0	1.0
+chr2	209219	1.0	0.0	1.0
+chr2	209385	1.0	0.0	1.0
+chr2	209394	0.0	1.0	1.0
+chr2	209408	0.0	1.0	1.0
+chr2	209411	0.0	1.0	1.0
+chr2	209413	1.0	0.0	1.0
+chr2	209422	0.0	1.0	1.0
+chr2	209586	1.0	0.0	1.0
+chr2	209592	1.0	0.0	1.0
+chr2	209613	1.0	0.0	1.0
+chr2	209618	0.0	2.0	2.0
+chr2	209621	2.0	0.0	2.0
+chr2	209629	2.0	0.0	2.0
+chr2	209638	0.0	3.0	3.0
+chr2	209639	0.0	1.0	1.0
+chr2	209650	1.0	0.0	1.0
+chr2	209651	2.0	0.0	2.0
+chr2	209661	1.0	0.0	1.0
+chr2	209749	0.0	2.0	2.0
+chr2	209755	0.0	1.0	1.0
+chr2	209780	1.0	0.0	1.0
+chr2	209790	1.0	0.0	1.0
+chr2	209794	1.0	0.0	1.0
+chr2	209795	0.0	1.0	1.0
+chr2	209797	1.0	0.0	1.0
+chr2	209799	1.0	0.0	1.0
+chr2	209805	0.0	1.0	1.0
+chr2	209826	0.0	1.0	1.0
+chr2	209934	0.0	2.0	2.0
+chr2	209945	1.0	0.0	1.0
+chr2	209952	0.0	1.0	1.0
+chr2	209960	0.0	1.0	1.0
+chr2	209963	1.0	0.0	1.0
+chr2	209973	0.0	1.0	1.0
+chr2	209974	1.0	0.0	1.0
+chr2	209998	1.0	0.0	1.0
+chr2	210033	0.0	1.0	1.0
+chr2	210100	0.0	1.0	1.0
+chr2	210107	1.0	0.0	1.0
+chr2	210151	1.0	0.0	1.0
+chr2	210165	1.0	0.0	1.0
+chr2	210261	0.0	1.0	1.0
+chr2	210328	1.0	0.0	1.0
+chr2	210408	1.0	0.0	1.0
+chr2	210412	0.0	1.0	1.0
+chr2	210434	0.0	1.0	1.0
+chr2	210437	2.0	0.0	2.0
+chr2	210438	0.0	2.0	2.0
+chr2	210459	0.0	1.0	1.0
+chr2	210461	0.0	1.0	1.0
+chr2	210479	0.0	1.0	1.0
+chr2	210609	1.0	0.0	1.0
+chr2	210647	0.0	1.0	1.0
+chr2	210656	0.0	1.0	1.0
+chr2	210687	0.0	1.0	1.0
+chr2	210967	1.0	0.0	1.0
+chr2	210985	0.0	2.0	2.0
+chr2	211431	1.0	0.0	1.0
+chr2	211586	1.0	0.0	1.0
+chr2	211614	1.0	0.0	1.0
+chr2	211826	0.0	1.0	1.0
+chr2	211830	0.0	1.0	1.0
+chr2	212032	1.0	0.0	1.0
+chr2	212174	0.0	1.0	1.0
+chr2	212175	1.0	0.0	1.0
+chr2	212187	0.0	1.0	1.0
+chr2	212288	0.0	1.0	1.0
+chr2	212389	2.0	0.0	2.0
+chr2	212719	1.0	0.0	1.0
+chr2	213103	1.0	0.0	1.0
+chr2	213163	3.0	0.0	3.0
+chr2	213470	1.0	0.0	1.0
+chr2	213558	1.0	0.0	1.0
+chr2	214663	1.0	0.0	1.0
+chr2	214776	1.0	0.0	1.0
+chr2	214821	1.0	0.0	1.0
+chr2	214864	0.0	1.0	1.0
+chr2	215131	0.0	1.0	1.0
+chr2	215570	1.0	0.0	1.0
+chr2	215582	2.0	0.0	2.0
+chr2	215856	0.0	1.0	1.0
+chr2	215953	1.0	0.0	1.0
+chr2	216050	1.0	0.0	1.0
+chr2	216051	5.0	0.0	5.0
+chr2	216052	1.0	1.0	2.0
+chr2	216152	0.0	1.0	1.0
+chr2	216183	0.0	1.0	1.0
+chr2	216213	2.0	0.0	2.0
+chr2	216214	1.0	0.0	1.0
+chr2	216219	0.0	1.0	1.0
+chr2	216222	0.0	2.0	2.0
+chr2	216234	0.0	1.0	1.0
+chr2	216236	2.0	0.0	2.0
+chr2	216237	0.0	1.0	1.0
+chr2	216255	0.0	1.0	1.0
+chr2	216259	3.0	0.0	3.0
+chr2	216275	0.0	1.0	1.0
+chr2	216288	1.0	0.0	1.0
+chr2	216352	1.0	0.0	1.0
+chr2	216354	0.0	1.0	1.0
+chr2	216355	2.0	0.0	2.0
+chr2	216359	1.0	0.0	1.0
+chr2	216360	0.0	1.0	1.0
+chr2	216366	1.0	1.0	2.0
+chr2	216369	1.0	2.0	3.0
+chr2	216370	0.0	1.0	1.0
+chr2	216381	2.0	0.0	2.0
+chr2	216385	2.0	0.0	2.0
+chr2	216386	1.0	0.0	1.0
+chr2	216396	0.0	1.0	1.0
+chr2	216405	0.0	2.0	2.0
+chr2	216899	0.0	1.0	1.0
+chr2	216917	1.0	0.0	1.0
+chr2	216951	2.0	0.0	2.0
+chr2	217031	0.0	1.0	1.0
+chr2	217058	1.0	0.0	1.0
+chr2	217079	1.0	0.0	1.0
+chr2	217096	1.0	2.0	3.0
+chr2	217104	1.0	0.0	1.0
+chr2	217108	1.0	0.0	1.0
+chr2	217110	1.0	1.0	2.0
+chr2	217111	1.0	1.0	2.0
+chr2	217112	1.0	0.0	1.0
+chr2	217114	1.0	0.0	1.0
+chr2	217119	1.0	0.0	1.0
+chr2	217132	1.0	0.0	1.0
+chr2	217380	1.0	0.0	1.0
+chr2	217385	0.0	1.0	1.0
+chr2	217426	0.0	1.0	1.0
+chr2	217427	0.0	1.0	1.0
+chr2	217439	1.0	0.0	1.0
+chr2	217576	0.0	1.0	1.0
+chr2	217579	1.0	0.0	1.0
+chr2	217597	2.0	0.0	2.0
+chr2	217598	0.0	1.0	1.0
+chr2	217761	1.0	0.0	1.0
+chr2	218015	0.0	1.0	1.0
+chr2	218210	1.0	0.0	1.0
+chr2	220137	0.0	1.0	1.0
+chr2	220141	0.0	1.0	1.0
+chr2	220158	0.0	1.0	1.0
+chr2	220514	0.0	1.0	1.0
+chr2	220540	0.0	1.0	1.0
+chr2	220693	1.0	0.0	1.0
+chr2	220694	0.0	1.0	1.0
+chr2	220726	0.0	1.0	1.0
+chr2	221066	0.0	1.0	1.0
+chr2	221074	0.0	1.0	1.0
+chr2	221077	0.0	1.0	1.0
+chr2	221078	0.0	1.0	1.0
+chr2	221079	0.0	1.0	1.0
+chr2	221088	0.0	2.0	2.0
+chr2	221090	0.0	3.0	3.0
+chr2	221093	0.0	1.0	1.0
+chr2	221101	0.0	2.0	2.0
+chr2	221102	0.0	1.0	1.0
+chr2	221105	0.0	4.0	4.0
+chr2	221106	0.0	4.0	4.0
+chr2	221111	0.0	1.0	1.0
+chr2	221112	2.0	0.0	2.0
+chr2	221113	7.0	0.0	7.0
+chr2	221114	0.0	1.0	1.0
+chr2	221116	1.0	1.0	2.0
+chr2	221117	0.0	2.0	2.0
+chr2	221118	0.0	1.0	1.0
+chr2	221119	0.0	1.0	1.0
+chr2	221124	2.0	0.0	2.0
+chr2	221125	0.0	1.0	1.0
+chr2	221127	1.0	2.0	3.0
+chr2	221130	2.0	0.0	2.0
+chr2	221134	1.0	0.0	1.0
+chr2	221135	0.0	1.0	1.0
+chr2	221138	0.0	2.0	2.0
+chr2	221139	0.0	1.0	1.0
+chr2	221145	0.0	2.0	2.0
+chr2	221148	0.0	1.0	1.0
+chr2	221152	0.0	1.0	1.0
+chr2	221155	0.0	1.0	1.0
+chr2	221159	1.0	0.0	1.0
+chr2	221162	0.0	2.0	2.0
+chr2	221163	0.0	1.0	1.0
+chr2	221164	1.0	1.0	2.0
+chr2	221167	1.0	0.0	1.0
+chr2	221169	2.0	0.0	2.0
+chr2	221170	0.0	2.0	2.0
+chr2	221174	1.0	0.0	1.0
+chr2	221175	1.0	0.0	1.0
+chr2	221176	1.0	0.0	1.0
+chr2	221177	1.0	0.0	1.0
+chr2	221178	1.0	0.0	1.0
+chr2	221185	0.0	1.0	1.0
+chr2	221186	1.0	0.0	1.0
+chr2	221191	0.0	2.0	2.0
+chr2	221192	2.0	2.0	4.0
+chr2	221195	0.0	1.0	1.0
+chr2	221196	0.0	2.0	2.0
+chr2	221197	0.0	1.0	1.0
+chr2	221198	0.0	2.0	2.0
+chr2	221202	1.0	0.0	1.0
+chr2	221204	2.0	0.0	2.0
+chr2	221214	0.0	1.0	1.0
+chr2	221218	0.0	3.0	3.0
+chr2	221220	0.0	7.0	7.0
+chr2	221232	0.0	1.0	1.0
+chr2	221233	0.0	1.0	1.0
+chr2	221236	1.0	0.0	1.0
+chr2	221244	0.0	1.0	1.0
+chr2	221250	0.0	1.0	1.0
+chr2	221252	1.0	0.0	1.0
+chr2	221259	2.0	0.0	2.0
+chr2	221260	2.0	0.0	2.0
+chr2	221277	0.0	1.0	1.0
+chr2	221278	1.0	0.0	1.0
+chr2	221279	1.0	0.0	1.0
+chr2	221280	3.0	1.0	4.0
+chr2	221282	0.0	1.0	1.0
+chr2	221288	2.0	6.0	8.0
+chr2	221294	1.0	0.0	1.0
+chr2	221296	1.0	0.0	1.0
+chr2	221300	1.0	0.0	1.0
+chr2	221304	1.0	0.0	1.0
+chr2	221306	1.0	0.0	1.0
+chr2	221308	1.0	0.0	1.0
+chr2	221309	1.0	0.0	1.0
+chr2	221310	1.0	0.0	1.0
+chr2	221312	1.0	0.0	1.0
+chr2	221313	1.0	0.0	1.0
+chr2	221317	1.0	0.0	1.0
+chr2	221320	1.0	0.0	1.0
+chr2	221321	17.0	1.0	18.0
+chr2	221322	5.0	2.0	7.0
+chr2	221324	1.0	0.0	1.0
+chr2	221325	3.0	1.0	4.0
+chr2	221327	1.0	0.0	1.0
+chr2	221328	0.0	2.0	2.0
+chr2	221329	0.0	1.0	1.0
+chr2	221330	1.0	1.0	2.0
+chr2	221334	1.0	0.0	1.0
+chr2	221335	1.0	0.0	1.0
+chr2	221338	1.0	3.0	4.0
+chr2	221339	1.0	1.0	2.0
+chr2	221343	0.0	1.0	1.0
+chr2	221344	0.0	2.0	2.0
+chr2	221355	0.0	1.0	1.0
+chr2	221356	0.0	1.0	1.0
+chr2	221357	0.0	2.0	2.0
+chr2	221361	0.0	1.0	1.0
+chr2	221367	1.0	0.0	1.0
+chr2	221370	1.0	0.0	1.0
+chr2	221375	2.0	0.0	2.0
+chr2	221377	0.0	1.0	1.0
+chr2	221379	1.0	0.0	1.0
+chr2	221392	0.0	2.0	2.0
+chr2	221403	0.0	2.0	2.0
+chr2	221404	2.0	0.0	2.0
+chr2	221405	1.0	0.0	1.0
+chr2	221410	0.0	3.0	3.0
+chr2	221411	1.0	0.0	1.0
+chr2	221413	1.0	0.0	1.0
+chr2	221421	0.0	2.0	2.0
+chr2	221422	1.0	0.0	1.0
+chr2	221424	1.0	0.0	1.0
+chr2	221425	1.0	0.0	1.0
+chr2	221426	1.0	0.0	1.0
+chr2	221427	0.0	1.0	1.0
+chr2	221429	0.0	1.0	1.0
+chr2	221433	1.0	3.0	4.0
+chr2	221439	4.0	0.0	4.0
+chr2	221443	1.0	1.0	2.0
+chr2	221444	2.0	0.0	2.0
+chr2	221446	5.0	0.0	5.0
+chr2	221447	1.0	1.0	2.0
+chr2	221451	2.0	4.0	6.0
+chr2	221453	0.0	1.0	1.0
+chr2	221458	0.0	5.0	5.0
+chr2	221459	0.0	1.0	1.0
+chr2	221463	1.0	0.0	1.0
+chr2	221469	2.0	0.0	2.0
+chr2	221472	1.0	3.0	4.0
+chr2	221475	0.0	3.0	3.0
+chr2	221477	3.0	1.0	4.0
+chr2	221478	7.0	3.0	10.0
+chr2	221482	1.0	0.0	1.0
+chr2	221484	0.0	13.0	13.0
+chr2	221486	0.0	3.0	3.0
+chr2	221492	1.0	0.0	1.0
+chr2	221493	0.0	8.0	8.0
+chr2	221494	1.0	0.0	1.0
+chr2	221495	1.0	0.0	1.0
+chr2	221497	2.0	0.0	2.0
+chr2	221503	1.0	0.0	1.0
+chr2	221504	8.0	0.0	8.0
+chr2	221509	2.0	0.0	2.0
+chr2	221510	1.0	0.0	1.0
+chr2	221511	3.0	1.0	4.0
+chr2	221513	0.0	4.0	4.0
+chr2	221517	1.0	3.0	4.0
+chr2	221522	1.0	11.0	12.0
+chr2	221523	2.0	10.0	12.0
+chr2	221527	2.0	0.0	2.0
+chr2	221528	1.0	3.0	4.0
+chr2	221529	0.0	1.0	1.0
+chr2	221530	0.0	1.0	1.0
+chr2	221531	1.0	1.0	2.0
+chr2	221532	1.0	1.0	2.0
+chr2	221533	0.0	17.0	17.0
+chr2	221538	4.0	0.0	4.0
+chr2	221543	13.0	0.0	13.0
+chr2	221544	2.0	0.0	2.0
+chr2	221551	3.0	0.0	3.0
+chr2	221559	1.0	0.0	1.0
+chr2	221561	1.0	0.0	1.0
+chr2	221564	2.0	0.0	2.0
+chr2	221569	3.0	0.0	3.0
+chr2	221573	1.0	0.0	1.0
+chr2	221580	0.0	1.0	1.0
+chr2	221583	3.0	0.0	3.0
+chr2	221586	1.0	0.0	1.0
+chr2	221589	5.0	0.0	5.0
+chr2	221594	1.0	0.0	1.0
+chr2	221595	1.0	0.0	1.0
+chr2	221601	0.0	4.0	4.0
+chr2	221602	0.0	1.0	1.0
+chr2	221603	0.0	1.0	1.0
+chr2	221611	1.0	0.0	1.0
+chr2	221616	0.0	1.0	1.0
+chr2	221633	0.0	1.0	1.0
+chr2	221639	0.0	2.0	2.0
+chr2	221640	2.0	1.0	3.0
+chr2	221641	1.0	0.0	1.0
+chr2	221651	4.0	0.0	4.0
+chr2	221655	0.0	1.0	1.0
+chr2	221703	0.0	2.0	2.0
+chr2	221705	0.0	1.0	1.0
+chr2	221706	0.0	4.0	4.0
+chr2	221707	0.0	6.0	6.0
+chr2	221709	0.0	1.0	1.0
+chr2	221728	0.0	1.0	1.0
+chr2	221730	0.0	1.0	1.0
+chr2	221739	0.0	1.0	1.0
+chr2	221741	0.0	1.0	1.0
+chr2	221742	0.0	1.0	1.0
+chr2	221748	1.0	0.0	1.0
+chr2	221755	2.0	0.0	2.0
+chr2	221767	2.0	2.0	4.0
+chr2	221768	1.0	0.0	1.0
+chr2	221771	23.0	0.0	23.0
+chr2	221772	1.0	0.0	1.0
+chr2	221774	1.0	11.0	12.0
+chr2	221777	2.0	0.0	2.0
+chr2	221779	0.0	5.0	5.0
+chr2	221780	0.0	5.0	5.0
+chr2	221783	0.0	1.0	1.0
+chr2	221785	1.0	0.0	1.0
+chr2	221787	2.0	0.0	2.0
+chr2	221788	1.0	1.0	2.0
+chr2	221789	1.0	0.0	1.0
+chr2	221790	0.0	3.0	3.0
+chr2	221793	0.0	19.0	19.0
+chr2	221794	0.0	12.0	12.0
+chr2	221795	7.0	1.0	8.0
+chr2	221796	2.0	0.0	2.0
+chr2	221798	0.0	6.0	6.0
+chr2	221800	1.0	9.0	10.0
+chr2	221801	0.0	7.0	7.0
+chr2	221802	5.0	1.0	6.0
+chr2	221803	5.0	20.0	25.0
+chr2	221804	3.0	8.0	11.0
+chr2	221805	0.0	1.0	1.0
+chr2	221806	0.0	3.0	3.0
+chr2	221808	0.0	1.0	1.0
+chr2	221809	1.0	2.0	3.0
+chr2	221812	0.0	4.0	4.0
+chr2	221813	1.0	11.0	12.0
+chr2	221814	0.0	12.0	12.0
+chr2	221815	0.0	19.0	19.0
+chr2	221816	4.0	0.0	4.0
+chr2	221817	0.0	1.0	1.0
+chr2	221818	0.0	10.0	10.0
+chr2	221819	1.0	0.0	1.0
+chr2	221820	1.0	1.0	2.0
+chr2	221822	2.0	0.0	2.0
+chr2	221824	0.0	1.0	1.0
+chr2	221827	0.0	5.0	5.0
+chr2	221828	0.0	2.0	2.0
+chr2	221830	0.0	1.0	1.0
+chr2	221831	0.0	1.0	1.0
+chr2	221838	5.0	0.0	5.0
+chr2	221840	0.0	1.0	1.0
+chr2	221845	2.0	1.0	3.0
+chr2	221847	1.0	0.0	1.0
+chr2	221849	1.0	0.0	1.0
+chr2	221854	0.0	13.0	13.0
+chr2	221857	7.0	1.0	8.0
+chr2	221863	4.0	0.0	4.0
+chr2	221864	1.0	0.0	1.0
+chr2	221865	0.0	1.0	1.0
+chr2	221867	3.0	0.0	3.0
+chr2	221868	5.0	0.0	5.0
+chr2	221887	1.0	0.0	1.0
+chr2	221892	2.0	0.0	2.0
+chr2	221902	2.0	0.0	2.0
+chr2	221903	0.0	2.0	2.0
+chr2	221908	2.0	0.0	2.0
+chr2	221909	1.0	0.0	1.0
+chr2	221913	1.0	0.0	1.0
+chr2	221915	0.0	1.0	1.0
+chr2	221917	0.0	1.0	1.0
+chr2	221918	0.0	3.0	3.0
+chr2	221928	1.0	0.0	1.0
+chr2	221936	1.0	0.0	1.0
+chr2	221941	3.0	0.0	3.0
+chr2	221942	1.0	0.0	1.0
+chr2	221945	0.0	2.0	2.0
+chr2	221951	1.0	1.0	2.0
+chr2	221954	1.0	0.0	1.0
+chr2	221955	3.0	0.0	3.0
+chr2	221960	0.0	2.0	2.0
+chr2	221968	1.0	0.0	1.0
+chr2	221969	0.0	1.0	1.0
+chr2	221970	0.0	1.0	1.0
+chr2	221971	1.0	0.0	1.0
+chr2	221974	1.0	0.0	1.0
+chr2	221978	0.0	1.0	1.0
+chr2	221979	2.0	7.0	9.0
+chr2	221980	7.0	0.0	7.0
+chr2	221981	3.0	0.0	3.0
+chr2	221983	1.0	0.0	1.0
+chr2	221984	0.0	6.0	6.0
+chr2	221988	15.0	0.0	15.0
+chr2	221990	0.0	15.0	15.0
+chr2	221991	0.0	2.0	2.0
+chr2	221992	1.0	1.0	2.0
+chr2	221993	3.0	0.0	3.0
+chr2	221996	1.0	9.0	10.0
+chr2	222001	0.0	6.0	6.0
+chr2	222004	0.0	1.0	1.0
+chr2	222005	1.0	0.0	1.0
+chr2	222007	0.0	1.0	1.0
+chr2	222008	2.0	2.0	4.0
+chr2	222009	0.0	1.0	1.0
+chr2	222018	1.0	0.0	1.0
+chr2	222019	0.0	3.0	3.0
+chr2	222020	0.0	6.0	6.0
+chr2	222022	9.0	0.0	9.0
+chr2	222023	0.0	1.0	1.0
+chr2	222026	1.0	0.0	1.0
+chr2	222032	1.0	0.0	1.0
+chr2	222037	2.0	0.0	2.0
+chr2	222038	0.0	4.0	4.0
+chr2	222040	1.0	1.0	2.0
+chr2	222042	0.0	1.0	1.0
+chr2	222044	2.0	3.0	5.0
+chr2	222045	0.0	1.0	1.0
+chr2	222046	2.0	0.0	2.0
+chr2	222047	3.0	6.0	9.0
+chr2	222051	2.0	3.0	5.0
+chr2	222053	1.0	0.0	1.0
+chr2	222055	0.0	1.0	1.0
+chr2	222056	0.0	2.0	2.0
+chr2	222057	1.0	1.0	2.0
+chr2	222058	0.0	2.0	2.0
+chr2	222062	0.0	1.0	1.0
+chr2	222064	0.0	4.0	4.0
+chr2	222065	0.0	3.0	3.0
+chr2	222066	1.0	1.0	2.0
+chr2	222070	10.0	0.0	10.0
+chr2	222079	0.0	3.0	3.0
+chr2	222082	1.0	2.0	3.0
+chr2	222083	2.0	0.0	2.0
+chr2	222085	5.0	0.0	5.0
+chr2	222086	3.0	13.0	16.0
+chr2	222087	0.0	1.0	1.0
+chr2	222088	1.0	0.0	1.0
+chr2	222109	5.0	0.0	5.0
+chr2	222130	0.0	1.0	1.0
+chr2	222132	1.0	3.0	4.0
+chr2	222133	0.0	1.0	1.0
+chr2	222136	0.0	2.0	2.0
+chr2	222138	0.0	3.0	3.0
+chr2	222140	1.0	0.0	1.0
+chr2	222144	3.0	0.0	3.0
+chr2	222145	0.0	1.0	1.0
+chr2	222147	1.0	0.0	1.0
+chr2	222148	1.0	0.0	1.0
+chr2	222151	2.0	0.0	2.0
+chr2	222154	0.0	4.0	4.0
+chr2	222155	1.0	2.0	3.0
+chr2	222158	6.0	0.0	6.0
+chr2	222159	1.0	0.0	1.0
+chr2	222161	2.0	0.0	2.0
+chr2	222162	3.0	1.0	4.0
+chr2	222163	0.0	15.0	15.0
+chr2	222164	0.0	4.0	4.0
+chr2	222165	0.0	3.0	3.0
+chr2	222166	0.0	6.0	6.0
+chr2	222168	0.0	2.0	2.0
+chr2	222169	0.0	1.0	1.0
+chr2	222172	0.0	6.0	6.0
+chr2	222173	0.0	1.0	1.0
+chr2	222174	1.0	6.0	7.0
+chr2	222175	0.0	1.0	1.0
+chr2	222177	25.0	0.0	25.0
+chr2	222178	0.0	3.0	3.0
+chr2	222179	4.0	0.0	4.0
+chr2	222180	6.0	0.0	6.0
+chr2	222181	10.0	0.0	10.0
+chr2	222182	0.0	3.0	3.0
+chr2	222186	4.0	0.0	4.0
+chr2	222187	1.0	0.0	1.0
+chr2	222188	2.0	1.0	3.0
+chr2	222190	2.0	1.0	3.0
+chr2	222191	0.0	11.0	11.0
+chr2	222192	1.0	5.0	6.0
+chr2	222193	0.0	1.0	1.0
+chr2	222194	0.0	3.0	3.0
+chr2	222195	2.0	0.0	2.0
+chr2	222196	1.0	0.0	1.0
+chr2	222197	4.0	0.0	4.0
+chr2	222202	0.0	1.0	1.0
+chr2	222204	0.0	1.0	1.0
+chr2	222206	3.0	0.0	3.0
+chr2	222207	0.0	1.0	1.0
+chr2	222208	0.0	1.0	1.0
+chr2	222209	0.0	4.0	4.0
+chr2	222213	1.0	1.0	2.0
+chr2	222214	1.0	0.0	1.0
+chr2	222215	9.0	0.0	9.0
+chr2	222217	0.0	2.0	2.0
+chr2	222218	0.0	11.0	11.0
+chr2	222220	0.0	1.0	1.0
+chr2	222221	0.0	1.0	1.0
+chr2	222223	0.0	2.0	2.0
+chr2	222228	5.0	0.0	5.0
+chr2	222232	0.0	7.0	7.0
+chr2	222234	1.0	0.0	1.0
+chr2	222235	1.0	0.0	1.0
+chr2	222237	1.0	0.0	1.0
+chr2	222238	2.0	0.0	2.0
+chr2	222239	3.0	0.0	3.0
+chr2	222243	7.0	0.0	7.0
+chr2	222245	0.0	1.0	1.0
+chr2	222246	2.0	0.0	2.0
+chr2	222249	0.0	3.0	3.0
+chr2	222271	1.0	0.0	1.0
+chr2	222272	0.0	1.0	1.0
+chr2	222286	0.0	1.0	1.0
+chr2	222290	0.0	1.0	1.0
+chr2	222293	1.0	0.0	1.0
+chr2	222313	0.0	1.0	1.0
+chr2	222316	1.0	0.0	1.0
+chr2	222320	1.0	0.0	1.0
+chr2	222322	1.0	0.0	1.0
+chr2	222323	0.0	1.0	1.0
+chr2	222324	1.0	0.0	1.0
+chr2	222346	1.0	0.0	1.0
+chr2	222365	0.0	2.0	2.0
+chr2	222369	2.0	0.0	2.0
+chr2	222385	2.0	0.0	2.0
+chr2	222407	0.0	1.0	1.0
+chr2	222414	2.0	0.0	2.0
+chr2	222415	0.0	1.0	1.0
+chr2	222461	0.0	4.0	4.0
+chr2	222475	0.0	1.0	1.0
+chr2	222486	1.0	0.0	1.0
+chr2	222494	1.0	0.0	1.0
+chr2	222498	0.0	1.0	1.0
+chr2	222502	1.0	0.0	1.0
+chr2	222503	2.0	0.0	2.0
+chr2	222505	1.0	0.0	1.0
+chr2	222508	1.0	0.0	1.0
+chr2	222516	4.0	0.0	4.0
+chr2	222522	1.0	0.0	1.0
+chr2	222542	0.0	2.0	2.0
+chr2	222555	1.0	0.0	1.0
+chr2	222558	0.0	2.0	2.0
+chr2	222563	0.0	1.0	1.0
+chr2	222564	0.0	2.0	2.0
+chr2	222570	0.0	1.0	1.0
+chr2	222571	0.0	1.0	1.0
+chr2	222573	0.0	3.0	3.0
+chr2	222580	1.0	0.0	1.0
+chr2	222592	0.0	1.0	1.0
+chr2	222593	3.0	0.0	3.0
+chr2	222594	1.0	0.0	1.0
+chr2	222612	1.0	0.0	1.0
+chr2	222613	0.0	1.0	1.0
+chr2	222615	2.0	1.0	3.0
+chr2	222663	0.0	1.0	1.0
+chr2	222664	0.0	1.0	1.0
+chr2	222665	0.0	1.0	1.0
+chr2	222666	1.0	0.0	1.0
+chr2	222668	2.0	0.0	2.0
+chr2	222669	1.0	0.0	1.0
+chr2	222671	2.0	0.0	2.0
+chr2	222674	1.0	0.0	1.0
+chr2	222678	0.0	4.0	4.0
+chr2	222679	0.0	1.0	1.0
+chr2	222685	0.0	1.0	1.0
+chr2	222694	0.0	5.0	5.0
+chr2	222696	4.0	0.0	4.0
+chr2	222697	1.0	1.0	2.0
+chr2	222701	0.0	1.0	1.0
+chr2	222707	0.0	2.0	2.0
+chr2	222708	2.0	0.0	2.0
+chr2	222710	1.0	4.0	5.0
+chr2	222711	0.0	1.0	1.0
+chr2	222712	1.0	0.0	1.0
+chr2	222724	1.0	0.0	1.0
+chr2	222729	0.0	2.0	2.0
+chr2	222732	0.0	1.0	1.0
+chr2	222736	3.0	0.0	3.0
+chr2	222737	0.0	1.0	1.0
+chr2	222745	1.0	2.0	3.0
+chr2	222754	0.0	2.0	2.0
+chr2	222756	1.0	0.0	1.0
+chr2	222768	1.0	0.0	1.0
+chr2	222788	1.0	0.0	1.0
+chr2	222791	0.0	1.0	1.0
+chr2	222796	0.0	1.0	1.0
+chr2	222824	1.0	0.0	1.0
+chr2	222844	0.0	1.0	1.0
+chr2	222845	0.0	1.0	1.0
+chr2	222862	0.0	1.0	1.0
+chr2	222864	0.0	1.0	1.0
+chr2	222867	0.0	1.0	1.0
+chr2	222878	0.0	1.0	1.0
+chr2	222879	1.0	0.0	1.0
+chr2	222880	1.0	0.0	1.0
+chr2	222881	0.0	1.0	1.0
+chr2	222887	1.0	1.0	2.0
+chr2	222888	1.0	1.0	2.0
+chr2	222889	0.0	1.0	1.0
+chr2	222895	1.0	0.0	1.0
+chr2	222897	1.0	0.0	1.0
+chr2	222898	0.0	1.0	1.0
+chr2	222901	1.0	0.0	1.0
+chr2	222902	2.0	0.0	2.0
+chr2	222903	3.0	0.0	3.0
+chr2	222907	0.0	1.0	1.0
+chr2	222908	1.0	0.0	1.0
+chr2	222916	0.0	3.0	3.0
+chr2	222920	1.0	0.0	1.0
+chr2	222928	0.0	1.0	1.0
+chr2	222933	0.0	4.0	4.0
+chr2	222953	0.0	1.0	1.0
+chr2	222957	0.0	1.0	1.0
+chr2	222977	3.0	0.0	3.0
+chr2	222978	1.0	0.0	1.0
+chr2	222982	0.0	1.0	1.0
+chr2	222983	0.0	1.0	1.0
+chr2	222988	1.0	0.0	1.0
+chr2	223001	0.0	1.0	1.0
+chr2	223018	3.0	0.0	3.0
+chr2	223023	0.0	1.0	1.0
+chr2	223025	0.0	1.0	1.0
+chr2	223034	0.0	1.0	1.0
+chr2	223035	0.0	1.0	1.0
+chr2	223038	1.0	0.0	1.0
+chr2	223042	0.0	1.0	1.0
+chr2	223043	1.0	0.0	1.0
+chr2	223048	1.0	1.0	2.0
+chr2	223056	1.0	0.0	1.0
+chr2	223076	1.0	3.0	4.0
+chr2	223085	1.0	0.0	1.0
+chr2	223088	0.0	1.0	1.0
+chr2	223102	0.0	1.0	1.0
+chr2	223107	1.0	0.0	1.0
+chr2	223115	0.0	1.0	1.0
+chr2	223122	0.0	2.0	2.0
+chr2	223125	0.0	1.0	1.0
+chr2	223131	0.0	1.0	1.0
+chr2	223140	1.0	0.0	1.0
+chr2	223155	1.0	0.0	1.0
+chr2	223156	0.0	3.0	3.0
+chr2	223174	2.0	0.0	2.0
+chr2	223184	14.0	0.0	14.0
+chr2	223185	1.0	0.0	1.0
+chr2	223186	1.0	0.0	1.0
+chr2	223190	3.0	1.0	4.0
+chr2	223196	1.0	0.0	1.0
+chr2	223200	0.0	1.0	1.0
+chr2	223210	0.0	2.0	2.0
+chr2	223215	0.0	1.0	1.0
+chr2	223227	0.0	1.0	1.0
+chr2	223231	1.0	0.0	1.0
+chr2	223241	1.0	0.0	1.0
+chr2	223243	0.0	1.0	1.0
+chr2	223249	0.0	1.0	1.0
+chr2	223255	1.0	0.0	1.0
+chr2	223262	1.0	0.0	1.0
+chr2	223272	1.0	0.0	1.0
+chr2	223274	0.0	2.0	2.0
+chr2	223281	1.0	0.0	1.0
+chr2	223284	0.0	2.0	2.0
+chr2	223305	1.0	0.0	1.0
+chr2	223311	0.0	6.0	6.0
+chr2	223315	3.0	0.0	3.0
+chr2	223324	2.0	0.0	2.0
+chr2	223329	1.0	0.0	1.0
+chr2	223331	1.0	0.0	1.0
+chr2	223337	1.0	0.0	1.0
+chr2	223349	1.0	0.0	1.0
+chr2	223359	0.0	2.0	2.0
+chr2	223362	1.0	0.0	1.0
+chr2	223366	0.0	1.0	1.0
+chr2	223367	0.0	1.0	1.0
+chr2	223379	1.0	0.0	1.0
+chr2	223390	1.0	0.0	1.0
+chr2	223392	1.0	0.0	1.0
+chr2	223404	0.0	1.0	1.0
+chr2	223412	0.0	1.0	1.0
+chr2	223414	2.0	0.0	2.0
+chr2	223418	1.0	0.0	1.0
+chr2	223420	0.0	3.0	3.0
+chr2	223425	3.0	0.0	3.0
+chr2	223448	0.0	1.0	1.0
+chr2	223451	0.0	4.0	4.0
+chr2	223474	2.0	0.0	2.0
+chr2	223475	1.0	0.0	1.0
+chr2	223479	2.0	0.0	2.0
+chr2	223480	1.0	0.0	1.0
+chr2	223482	1.0	1.0	2.0
+chr2	223483	0.0	1.0	1.0
+chr2	223486	0.0	1.0	1.0
+chr2	223495	1.0	0.0	1.0
+chr2	223496	2.0	0.0	2.0
+chr2	223513	0.0	1.0	1.0
+chr2	223515	1.0	0.0	1.0
+chr2	223518	2.0	0.0	2.0
+chr2	223523	0.0	1.0	1.0
+chr2	223524	0.0	2.0	2.0
+chr2	223529	1.0	0.0	1.0
+chr2	223534	1.0	0.0	1.0
+chr2	223535	0.0	1.0	1.0
+chr2	223537	2.0	0.0	2.0
+chr2	223544	4.0	0.0	4.0
+chr2	223574	1.0	0.0	1.0
+chr2	223575	0.0	1.0	1.0
+chr2	223577	1.0	0.0	1.0
+chr2	223592	0.0	3.0	3.0
+chr2	223604	1.0	0.0	1.0
+chr2	223610	1.0	0.0	1.0
+chr2	223614	0.0	1.0	1.0
+chr2	223634	1.0	0.0	1.0
+chr2	223636	1.0	0.0	1.0
+chr2	223639	2.0	0.0	2.0
+chr2	223650	0.0	2.0	2.0
+chr2	223657	0.0	1.0	1.0
+chr2	223665	1.0	0.0	1.0
+chr2	223666	0.0	1.0	1.0
+chr2	223672	1.0	2.0	3.0
+chr2	223677	1.0	0.0	1.0
+chr2	223678	1.0	0.0	1.0
+chr2	223683	1.0	0.0	1.0
+chr2	223684	1.0	0.0	1.0
+chr2	223687	1.0	0.0	1.0
+chr2	223689	0.0	1.0	1.0
+chr2	223699	0.0	1.0	1.0
+chr2	223742	2.0	0.0	2.0
+chr2	223747	0.0	2.0	2.0
+chr2	223771	1.0	0.0	1.0
+chr2	223794	0.0	2.0	2.0
+chr2	223808	0.0	2.0	2.0
+chr2	223830	1.0	0.0	1.0
+chr2	223831	0.0	1.0	1.0
+chr2	223840	0.0	1.0	1.0
+chr2	223842	0.0	1.0	1.0
+chr2	223848	1.0	0.0	1.0
+chr2	223849	2.0	0.0	2.0
+chr2	223850	0.0	1.0	1.0
+chr2	223852	0.0	1.0	1.0
+chr2	223853	1.0	0.0	1.0
+chr2	223854	0.0	3.0	3.0
+chr2	223855	1.0	0.0	1.0
+chr2	223856	1.0	1.0	2.0
+chr2	223859	0.0	1.0	1.0
+chr2	223860	1.0	0.0	1.0
+chr2	223864	1.0	0.0	1.0
+chr2	223867	0.0	1.0	1.0
+chr2	223869	1.0	1.0	2.0
+chr2	223877	0.0	1.0	1.0
+chr2	223893	2.0	0.0	2.0
+chr2	223895	1.0	0.0	1.0
+chr2	223906	0.0	1.0	1.0
+chr2	223912	0.0	2.0	2.0
+chr2	223914	1.0	0.0	1.0
+chr2	223920	0.0	1.0	1.0
+chr2	223921	2.0	0.0	2.0
+chr2	223930	1.0	0.0	1.0
+chr2	223938	1.0	0.0	1.0
+chr2	223943	0.0	1.0	1.0
+chr2	223949	1.0	0.0	1.0
+chr2	223954	0.0	1.0	1.0
+chr2	223959	2.0	0.0	2.0
+chr2	223960	0.0	1.0	1.0
+chr2	223996	0.0	2.0	2.0
+chr2	223998	2.0	0.0	2.0
+chr2	223999	0.0	1.0	1.0
+chr2	224009	0.0	1.0	1.0
+chr2	224013	0.0	2.0	2.0
+chr2	224029	0.0	3.0	3.0
+chr2	224039	1.0	0.0	1.0
+chr2	224048	0.0	1.0	1.0
+chr2	224050	0.0	1.0	1.0
+chr2	224052	0.0	1.0	1.0
+chr2	224056	0.0	1.0	1.0
+chr2	224066	1.0	0.0	1.0
+chr2	224067	0.0	1.0	1.0
+chr2	224070	2.0	0.0	2.0
+chr2	224108	1.0	0.0	1.0
+chr2	224109	1.0	0.0	1.0
+chr2	224130	1.0	0.0	1.0
+chr2	224149	0.0	1.0	1.0
+chr2	224153	0.0	1.0	1.0
+chr2	224167	0.0	3.0	3.0
+chr2	224169	0.0	1.0	1.0
+chr2	224170	0.0	1.0	1.0
+chr2	224176	0.0	1.0	1.0
+chr2	224178	1.0	0.0	1.0
+chr2	224194	0.0	2.0	2.0
+chr2	224201	0.0	1.0	1.0
+chr2	224216	0.0	1.0	1.0
+chr2	224219	0.0	1.0	1.0
+chr2	224228	1.0	0.0	1.0
+chr2	224238	1.0	0.0	1.0
+chr2	224245	0.0	1.0	1.0
+chr2	224250	1.0	0.0	1.0
+chr2	224269	0.0	1.0	1.0
+chr2	224277	1.0	0.0	1.0
+chr2	224284	0.0	1.0	1.0
+chr2	224290	0.0	2.0	2.0
+chr2	224296	1.0	0.0	1.0
+chr2	224317	0.0	1.0	1.0
+chr2	224318	0.0	2.0	2.0
+chr2	224322	0.0	2.0	2.0
+chr2	224323	0.0	2.0	2.0
+chr2	224370	0.0	1.0	1.0
+chr2	224372	1.0	0.0	1.0
+chr2	224389	0.0	2.0	2.0
+chr2	224392	1.0	0.0	1.0
+chr2	224420	0.0	1.0	1.0
+chr2	224425	0.0	1.0	1.0
+chr2	224429	0.0	1.0	1.0
+chr2	224440	1.0	0.0	1.0
+chr2	224442	1.0	3.0	4.0
+chr2	224446	0.0	2.0	2.0
+chr2	224455	1.0	0.0	1.0
+chr2	224473	0.0	2.0	2.0
+chr2	224478	1.0	0.0	1.0
+chr2	224481	2.0	0.0	2.0
+chr2	224500	1.0	0.0	1.0
+chr2	224524	0.0	1.0	1.0
+chr2	224527	0.0	1.0	1.0
+chr2	224528	0.0	1.0	1.0
+chr2	224550	0.0	1.0	1.0
+chr2	224556	0.0	1.0	1.0
+chr2	224561	0.0	1.0	1.0
+chr2	224566	1.0	0.0	1.0
+chr2	224579	2.0	0.0	2.0
+chr2	224593	0.0	1.0	1.0
+chr2	224609	0.0	1.0	1.0
+chr2	224617	0.0	1.0	1.0
+chr2	224634	0.0	1.0	1.0
+chr2	224646	1.0	0.0	1.0
+chr2	224647	1.0	0.0	1.0
+chr2	224679	1.0	0.0	1.0
+chr2	224688	0.0	1.0	1.0
+chr2	224729	0.0	1.0	1.0
+chr2	224738	0.0	1.0	1.0
+chr2	224774	0.0	1.0	1.0
+chr2	224776	1.0	1.0	2.0
+chr2	224790	1.0	0.0	1.0
+chr2	224791	2.0	0.0	2.0
+chr2	224805	0.0	1.0	1.0
+chr2	224809	1.0	0.0	1.0
+chr2	224825	1.0	0.0	1.0
+chr2	224854	1.0	0.0	1.0
+chr2	224886	1.0	0.0	1.0
+chr2	224908	0.0	1.0	1.0
+chr2	224915	1.0	0.0	1.0
+chr2	224923	1.0	0.0	1.0
+chr2	224932	0.0	1.0	1.0
+chr2	224935	2.0	0.0	2.0
+chr2	224936	0.0	1.0	1.0
+chr2	224959	0.0	1.0	1.0
+chr2	224964	1.0	0.0	1.0
+chr2	224980	1.0	1.0	2.0
+chr2	225003	0.0	1.0	1.0
+chr2	225021	1.0	0.0	1.0
+chr2	225027	0.0	1.0	1.0
+chr2	225039	0.0	1.0	1.0
+chr2	225045	1.0	0.0	1.0
+chr2	225047	0.0	1.0	1.0
+chr2	225054	1.0	0.0	1.0
+chr2	225066	1.0	0.0	1.0
+chr2	225070	0.0	1.0	1.0
+chr2	225071	0.0	1.0	1.0
+chr2	225083	1.0	0.0	1.0
+chr2	225100	0.0	1.0	1.0
+chr2	225118	0.0	1.0	1.0
+chr2	225148	1.0	0.0	1.0
+chr2	225157	1.0	0.0	1.0
+chr2	225170	1.0	0.0	1.0
+chr2	225174	1.0	0.0	1.0
+chr2	225215	1.0	0.0	1.0
+chr2	225216	0.0	1.0	1.0
+chr2	225223	1.0	0.0	1.0
+chr2	225231	0.0	2.0	2.0
+chr2	225234	1.0	0.0	1.0
+chr2	225236	0.0	1.0	1.0
+chr2	225250	2.0	0.0	2.0
+chr2	225260	1.0	0.0	1.0
+chr2	225262	0.0	1.0	1.0
+chr2	225265	0.0	3.0	3.0
+chr2	225272	0.0	1.0	1.0
+chr2	225275	1.0	0.0	1.0
+chr2	225280	0.0	2.0	2.0
+chr2	225284	1.0	0.0	1.0
+chr2	225285	1.0	0.0	1.0
+chr2	225292	1.0	0.0	1.0
+chr2	225295	0.0	1.0	1.0
+chr2	225301	2.0	0.0	2.0
+chr2	225302	1.0	0.0	1.0
+chr2	225303	1.0	0.0	1.0
+chr2	225312	1.0	0.0	1.0
+chr2	225314	1.0	0.0	1.0
+chr2	225369	1.0	0.0	1.0
+chr2	225397	1.0	0.0	1.0
+chr2	225405	0.0	1.0	1.0
+chr2	225417	0.0	1.0	1.0
+chr2	225434	0.0	1.0	1.0
+chr2	225440	2.0	0.0	2.0
+chr2	225450	1.0	0.0	1.0
+chr2	225458	0.0	1.0	1.0
+chr2	225491	1.0	0.0	1.0
+chr2	225492	1.0	0.0	1.0
+chr2	225493	1.0	0.0	1.0
+chr2	225501	0.0	2.0	2.0
+chr2	225515	2.0	0.0	2.0
+chr2	225518	1.0	0.0	1.0
+chr2	225519	1.0	0.0	1.0
+chr2	225523	0.0	1.0	1.0
+chr2	225524	1.0	0.0	1.0
+chr2	225537	0.0	5.0	5.0
+chr2	225544	0.0	1.0	1.0
+chr2	225557	1.0	0.0	1.0
+chr2	225562	0.0	1.0	1.0
+chr2	225617	0.0	1.0	1.0
+chr2	225620	1.0	0.0	1.0
+chr2	225753	0.0	1.0	1.0
+chr2	225769	0.0	1.0	1.0
+chr2	225788	1.0	0.0	1.0
+chr2	225793	2.0	0.0	2.0
+chr2	225804	1.0	1.0	2.0
+chr2	225823	1.0	0.0	1.0
+chr2	225828	0.0	1.0	1.0
+chr2	225841	0.0	1.0	1.0
+chr2	225843	0.0	1.0	1.0
+chr2	225844	1.0	0.0	1.0
+chr2	225848	0.0	1.0	1.0
+chr2	225860	1.0	0.0	1.0
+chr2	225866	0.0	1.0	1.0
+chr2	225873	1.0	0.0	1.0
+chr2	225877	1.0	0.0	1.0
+chr2	225878	0.0	1.0	1.0
+chr2	225879	1.0	1.0	2.0
+chr2	225883	1.0	0.0	1.0
+chr2	225888	0.0	1.0	1.0
+chr2	225892	0.0	1.0	1.0
+chr2	225895	1.0	0.0	1.0
+chr2	225896	1.0	0.0	1.0
+chr2	225919	0.0	1.0	1.0
+chr2	225931	1.0	0.0	1.0
+chr2	225932	1.0	0.0	1.0
+chr2	225953	1.0	0.0	1.0
+chr2	225960	0.0	1.0	1.0
+chr2	226000	1.0	0.0	1.0
+chr2	226026	0.0	1.0	1.0
+chr2	226027	1.0	0.0	1.0
+chr2	226066	0.0	1.0	1.0
+chr2	226076	1.0	0.0	1.0
+chr2	226115	1.0	0.0	1.0
+chr2	226126	0.0	1.0	1.0
+chr2	226147	0.0	1.0	1.0
+chr2	226180	3.0	0.0	3.0
+chr2	226182	1.0	0.0	1.0
+chr2	226225	0.0	1.0	1.0
+chr2	226229	1.0	0.0	1.0
+chr2	226230	1.0	0.0	1.0
+chr2	226232	0.0	1.0	1.0
+chr2	226233	0.0	1.0	1.0
+chr2	226244	2.0	0.0	2.0
+chr2	226245	1.0	0.0	1.0
+chr2	226257	0.0	1.0	1.0
+chr2	226258	1.0	0.0	1.0
+chr2	226288	1.0	0.0	1.0
+chr2	226303	0.0	1.0	1.0
+chr2	226316	3.0	0.0	3.0
+chr2	226325	1.0	0.0	1.0
+chr2	226331	0.0	2.0	2.0
+chr2	226333	0.0	1.0	1.0
+chr2	226334	0.0	1.0	1.0
+chr2	226451	1.0	0.0	1.0
+chr2	226474	1.0	0.0	1.0
+chr2	226502	1.0	0.0	1.0
+chr2	226503	0.0	1.0	1.0
+chr2	226524	1.0	0.0	1.0
+chr2	226529	0.0	2.0	2.0
+chr2	226533	1.0	0.0	1.0
+chr2	226551	2.0	0.0	2.0
+chr2	226554	0.0	1.0	1.0
+chr2	226557	0.0	1.0	1.0
+chr2	226578	0.0	1.0	1.0
+chr2	226600	0.0	1.0	1.0
+chr2	226650	0.0	1.0	1.0
+chr2	226658	0.0	1.0	1.0
+chr2	226661	0.0	1.0	1.0
+chr2	226662	0.0	1.0	1.0
+chr2	226663	0.0	1.0	1.0
+chr2	226672	0.0	2.0	2.0
+chr2	226674	0.0	3.0	3.0
+chr2	226677	0.0	1.0	1.0
+chr2	226685	0.0	2.0	2.0
+chr2	226686	0.0	1.0	1.0
+chr2	226689	0.0	4.0	4.0
+chr2	226690	0.0	4.0	4.0
+chr2	226695	0.0	1.0	1.0
+chr2	226697	9.0	0.0	9.0
+chr2	226698	0.0	1.0	1.0
+chr2	226700	1.0	1.0	2.0
+chr2	226701	0.0	2.0	2.0
+chr2	226702	0.0	1.0	1.0
+chr2	226703	0.0	1.0	1.0
+chr2	226708	2.0	0.0	2.0
+chr2	226709	0.0	1.0	1.0
+chr2	226711	1.0	2.0	3.0
+chr2	226714	2.0	0.0	2.0
+chr2	226718	1.0	0.0	1.0
+chr2	226719	0.0	1.0	1.0
+chr2	226722	0.0	2.0	2.0
+chr2	226723	0.0	1.0	1.0
+chr2	226729	0.0	2.0	2.0
+chr2	226732	0.0	1.0	1.0
+chr2	226736	0.0	1.0	1.0
+chr2	226739	0.0	1.0	1.0
+chr2	226743	1.0	0.0	1.0
+chr2	226746	0.0	2.0	2.0
+chr2	226747	0.0	1.0	1.0
+chr2	226748	1.0	1.0	2.0
+chr2	226751	1.0	0.0	1.0
+chr2	226753	2.0	0.0	2.0
+chr2	226754	0.0	2.0	2.0
+chr2	226758	1.0	0.0	1.0
+chr2	226759	1.0	0.0	1.0
+chr2	226760	1.0	0.0	1.0
+chr2	226761	1.0	0.0	1.0
+chr2	226762	1.0	0.0	1.0
+chr2	226769	0.0	1.0	1.0
+chr2	226770	1.0	0.0	1.0
+chr2	226775	0.0	2.0	2.0
+chr2	226776	2.0	2.0	4.0
+chr2	226779	0.0	1.0	1.0
+chr2	226780	0.0	2.0	2.0
+chr2	226781	0.0	1.0	1.0
+chr2	226782	0.0	2.0	2.0
+chr2	226786	1.0	0.0	1.0
+chr2	226788	2.0	0.0	2.0
+chr2	226798	0.0	1.0	1.0
+chr2	226802	0.0	3.0	3.0
+chr2	226804	0.0	2.0	2.0
+chr2	226805	0.0	4.0	4.0
+chr2	226813	0.0	1.0	1.0
+chr2	226814	0.0	1.0	1.0
+chr2	226815	0.0	1.0	1.0
+chr2	226820	1.0	0.0	1.0
+chr2	226826	0.0	1.0	1.0
+chr2	226832	0.0	1.0	1.0
+chr2	226836	1.0	0.0	1.0
+chr2	226843	2.0	0.0	2.0
+chr2	226844	2.0	0.0	2.0
+chr2	226851	1.0	0.0	1.0
+chr2	226859	0.0	1.0	1.0
+chr2	226862	1.0	1.0	2.0
+chr2	226863	1.0	0.0	1.0
+chr2	226864	3.0	1.0	4.0
+chr2	226870	0.0	2.0	2.0
+chr2	226872	2.0	0.0	2.0
+chr2	226875	0.0	4.0	4.0
+chr2	226878	1.0	0.0	1.0
+chr2	226880	1.0	0.0	1.0
+chr2	226882	0.0	4.0	4.0
+chr2	226884	1.0	0.0	1.0
+chr2	226888	1.0	0.0	1.0
+chr2	226890	1.0	0.0	1.0
+chr2	226892	1.0	0.0	1.0
+chr2	226893	1.0	0.0	1.0
+chr2	226894	1.0	0.0	1.0
+chr2	226896	1.0	0.0	1.0
+chr2	226897	1.0	0.0	1.0
+chr2	226901	1.0	0.0	1.0
+chr2	226904	1.0	0.0	1.0
+chr2	226905	17.0	0.0	17.0
+chr2	226906	5.0	0.0	5.0
+chr2	226908	1.0	0.0	1.0
+chr2	226909	3.0	0.0	3.0
+chr2	226911	1.0	0.0	1.0
+chr2	226914	1.0	0.0	1.0
+chr2	226915	1.0	0.0	1.0
+chr2	226918	1.0	0.0	1.0
+chr2	226919	3.0	0.0	3.0
+chr2	226922	1.0	0.0	1.0
+chr2	226923	1.0	0.0	1.0
+chr2	226929	1.0	0.0	1.0
+chr2	226930	1.0	0.0	1.0
+chr2	226934	2.0	0.0	2.0
+chr2	227251	1.0	0.0	1.0
+chr2	227252	1.0	0.0	1.0
+chr2	227253	1.0	0.0	1.0
+chr2	227255	1.0	0.0	1.0
+chr2	227257	0.0	1.0	1.0
+chr2	227261	0.0	1.0	1.0
+chr2	227263	1.0	3.0	4.0
+chr2	227264	0.0	1.0	1.0
+chr2	227269	1.0	0.0	1.0
+chr2	227570	2.0	0.0	2.0
+chr2	227574	1.0	0.0	1.0
+chr2	227584	1.0	0.0	1.0
+chr2	227587	0.0	1.0	1.0
+chr2	227589	0.0	1.0	1.0
+chr2	227621	1.0	0.0	1.0
+chr2	227740	1.0	0.0	1.0
+chr2	227745	1.0	0.0	1.0
+chr2	227761	0.0	1.0	1.0
+chr2	228151	0.0	1.0	1.0
+chr2	228266	0.0	1.0	1.0
+chr2	228418	1.0	0.0	1.0
+chr2	228632	0.0	1.0	1.0
+chr2	229460	2.0	0.0	2.0
+chr2	229555	0.0	1.0	1.0
+chr2	229864	0.0	1.0	1.0
+chr2	231555	0.0	1.0	1.0
+chr2	231849	0.0	1.0	1.0
+chr2	232003	1.0	0.0	1.0
+chr2	232004	1.0	0.0	1.0
+chr2	232662	1.0	0.0	1.0
+chr2	232753	1.0	0.0	1.0
+chr2	233002	0.0	1.0	1.0
+chr2	233052	0.0	1.0	1.0
+chr2	234250	0.0	1.0	1.0
+chr2	234426	0.0	2.0	2.0
+chr2	234847	0.0	1.0	1.0
+chr2	235418	1.0	0.0	1.0
+chr2	235451	0.0	1.0	1.0
+chr2	235580	1.0	0.0	1.0
+chr2	235584	0.0	1.0	1.0
+chr2	235615	0.0	2.0	2.0
+chr2	235632	1.0	0.0	1.0
+chr2	235643	0.0	1.0	1.0
+chr2	235671	0.0	1.0	1.0
+chr2	235694	1.0	0.0	1.0
+chr2	235699	0.0	2.0	2.0
+chr2	235700	0.0	1.0	1.0
+chr2	235708	0.0	1.0	1.0
+chr2	235715	1.0	0.0	1.0
+chr2	235721	0.0	1.0	1.0
+chr2	235722	0.0	1.0	1.0
+chr2	235728	1.0	0.0	1.0
+chr2	235777	0.0	1.0	1.0
+chr2	235964	1.0	0.0	1.0
+chr2	236505	2.0	0.0	2.0
+chr2	236520	0.0	1.0	1.0
+chr2	236529	0.0	1.0	1.0
+chr2	236536	1.0	0.0	1.0
+chr2	236544	0.0	1.0	1.0
+chr2	236548	1.0	0.0	1.0
+chr2	236551	0.0	1.0	1.0
+chr2	236561	0.0	1.0	1.0
+chr2	236592	0.0	1.0	1.0
+chr2	236593	0.0	1.0	1.0
+chr2	236617	2.0	0.0	2.0
+chr2	236686	0.0	2.0	2.0
+chr2	236856	0.0	2.0	2.0
+chr2	237272	1.0	1.0	2.0
+chr2	237281	0.0	3.0	3.0
+chr2	237288	2.0	0.0	2.0
+chr2	237299	0.0	1.0	1.0
+chr2	237319	0.0	1.0	1.0
+chr2	237330	1.0	0.0	1.0
+chr2	237419	2.0	0.0	2.0
+chr2	237432	1.0	0.0	1.0
+chr2	237454	1.0	0.0	1.0
+chr2	237457	1.0	0.0	1.0
+chr2	237461	0.0	1.0	1.0
+chr2	237469	1.0	0.0	1.0
+chr2	237473	0.0	2.0	2.0
+chr2	237476	0.0	1.0	1.0
+chr2	237480	1.0	0.0	1.0
+chr2	237483	0.0	1.0	1.0
+chr2	237487	0.0	2.0	2.0
+chr2	237489	0.0	1.0	1.0
+chr2	237491	0.0	1.0	1.0
+chr2	237556	1.0	0.0	1.0
+chr2	237730	2.0	0.0	2.0
+chr2	237741	0.0	1.0	1.0
+chr2	237744	0.0	1.0	1.0
+chr2	237754	1.0	0.0	1.0
+chr2	238059	0.0	1.0	1.0
+chr2	238078	1.0	0.0	1.0
+chr2	238102	1.0	0.0	1.0
+chr2	238103	1.0	0.0	1.0
+chr2	238480	0.0	1.0	1.0
+chr2	238520	2.0	0.0	2.0
+chr2	238525	0.0	3.0	3.0
+chr2	238526	2.0	5.0	7.0
+chr2	238527	1.0	0.0	1.0
+chr2	238536	0.0	1.0	1.0
+chr2	238539	0.0	1.0	1.0
+chr2	238541	2.0	0.0	2.0
+chr2	238542	1.0	1.0	2.0
+chr2	238544	0.0	1.0	1.0
+chr2	238545	1.0	0.0	1.0
+chr2	238561	0.0	1.0	1.0
+chr2	238572	0.0	1.0	1.0
+chr2	238661	0.0	1.0	1.0
+chr2	238677	1.0	0.0	1.0
+chr2	238684	0.0	1.0	1.0
+chr2	238685	0.0	1.0	1.0
+chr2	238690	0.0	1.0	1.0
+chr2	238699	2.0	0.0	2.0
+chr2	238700	1.0	1.0	2.0
+chr2	239054	0.0	1.0	1.0
+chr2	239055	1.0	0.0	1.0
+chr2	239070	1.0	0.0	1.0
+chr2	239209	1.0	0.0	1.0
+chr2	239218	0.0	1.0	1.0
+chr2	239248	0.0	1.0	1.0
+chr2	239307	0.0	1.0	1.0
+chr2	240403	0.0	1.0	1.0
+chr2	240428	0.0	1.0	1.0
+chr2	240548	1.0	0.0	1.0
+chr2	240583	0.0	1.0	1.0
+chr2	240592	0.0	1.0	1.0
+chr2	240593	0.0	1.0	1.0
+chr2	240765	1.0	0.0	1.0
+chr2	240824	1.0	0.0	1.0
+chr2	240883	1.0	0.0	1.0
+chr2	240905	1.0	0.0	1.0
+chr2	241072	0.0	1.0	1.0
+chr2	241199	1.0	0.0	1.0
+chr2	241200	1.0	0.0	1.0
+chr2	241202	1.0	0.0	1.0
+chr2	241207	0.0	2.0	2.0
+chr2	241211	0.0	2.0	2.0
+chr2	241219	1.0	0.0	1.0
+chr2	241221	0.0	2.0	2.0
+chr2	241285	0.0	1.0	1.0
+chr2	241723	1.0	0.0	1.0
+chr2	241840	2.0	0.0	2.0
+chr2	241855	1.0	0.0	1.0
+chr2	241972	1.0	0.0	1.0
+chr2	242009	0.0	1.0	1.0
+chr2	242060	1.0	0.0	1.0
+chr2	242183	0.0	1.0	1.0
+chr2	242188	0.0	1.0	1.0
+chr2	242202	1.0	0.0	1.0
+chr2	242234	1.0	0.0	1.0
+chr2	242354	2.0	0.0	2.0
+chr2	242356	0.0	1.0	1.0
+chr2	242365	1.0	0.0	1.0
+chr2	242447	1.0	0.0	1.0
+chr2	242477	0.0	3.0	3.0
+chr2	242506	1.0	0.0	1.0
+chr2	242512	1.0	0.0	1.0
+chr2	242513	1.0	1.0	2.0
+chr2	242514	1.0	0.0	1.0
+chr2	242517	1.0	0.0	1.0
+chr2	242522	0.0	2.0	2.0
+chr2	242531	1.0	0.0	1.0
+chr2	242534	1.0	2.0	3.0
+chr2	242535	1.0	1.0	2.0
+chr2	242536	0.0	3.0	3.0
+chr2	242542	0.0	2.0	2.0
+chr2	242543	3.0	1.0	4.0
+chr2	242546	2.0	0.0	2.0
+chr2	242552	1.0	1.0	2.0
+chr2	242574	1.0	0.0	1.0
+chr2	242772	0.0	1.0	1.0
+chr2	242811	0.0	3.0	3.0
+chr2	242821	0.0	3.0	3.0
+chr2	242823	0.0	1.0	1.0
+chr2	242824	1.0	0.0	1.0
+chr2	242825	4.0	0.0	4.0
+chr2	242827	1.0	0.0	1.0
+chr2	242830	1.0	0.0	1.0
+chr2	242831	2.0	0.0	2.0
+chr2	242833	2.0	0.0	2.0
+chr2	242834	0.0	1.0	1.0
+chr2	242836	0.0	3.0	3.0
+chr2	242837	0.0	4.0	4.0
+chr2	242838	1.0	1.0	2.0
+chr2	242839	6.0	0.0	6.0
+chr2	242840	0.0	3.0	3.0
+chr2	242843	1.0	0.0	1.0
+chr2	242844	1.0	3.0	4.0
+chr2	242845	0.0	1.0	1.0
+chr2	242847	3.0	0.0	3.0
+chr2	242849	1.0	0.0	1.0
+chr2	242851	1.0	0.0	1.0
+chr2	242852	0.0	3.0	3.0
+chr2	242857	1.0	0.0	1.0
+chr2	242862	1.0	0.0	1.0
+chr2	242973	1.0	0.0	1.0
+chr2	242974	0.0	1.0	1.0
+chr2	242976	0.0	2.0	2.0
+chr2	242990	1.0	0.0	1.0
+chr2	243002	0.0	1.0	1.0
+chr2	243003	0.0	1.0	1.0
+chr2	243019	0.0	1.0	1.0
+chr2	243020	0.0	1.0	1.0
+chr2	243027	2.0	0.0	2.0
+chr2	243112	0.0	1.0	1.0
+chr2	243159	0.0	1.0	1.0
+chr2	243169	1.0	0.0	1.0
+chr2	243186	0.0	1.0	1.0
+chr2	243377	0.0	1.0	1.0
+chr2	243487	1.0	0.0	1.0
+chr2	243496	1.0	0.0	1.0
+chr2	243503	0.0	1.0	1.0
+chr2	243531	1.0	0.0	1.0
+chr2	243558	1.0	0.0	1.0
+chr2	243660	0.0	1.0	1.0
+chr2	243678	1.0	0.0	1.0
+chr2	243687	3.0	0.0	3.0
+chr2	243943	0.0	1.0	1.0
+chr2	244405	0.0	2.0	2.0
+chr2	244496	0.0	1.0	1.0
+chr2	244581	0.0	1.0	1.0
+chr2	244731	1.0	0.0	1.0
+chr2	245020	0.0	2.0	2.0
+chr2	245454	1.0	0.0	1.0
+chr2	245591	0.0	1.0	1.0
+chr2	245598	1.0	0.0	1.0
+chr2	245604	1.0	0.0	1.0
+chr2	245609	1.0	0.0	1.0
+chr2	245611	2.0	0.0	2.0
+chr2	245619	1.0	0.0	1.0
+chr2	245620	1.0	0.0	1.0
+chr2	245623	1.0	0.0	1.0
+chr2	245628	0.0	1.0	1.0
+chr2	245630	2.0	0.0	2.0
+chr2	245631	1.0	2.0	3.0
+chr2	245638	0.0	1.0	1.0
+chr2	245639	1.0	0.0	1.0
+chr2	245640	0.0	2.0	2.0
+chr2	245642	3.0	0.0	3.0
+chr2	245646	1.0	0.0	1.0
+chr2	245660	0.0	1.0	1.0
+chr2	245886	3.0	0.0	3.0
+chr2	245887	9.0	0.0	9.0
+chr2	245888	0.0	5.0	5.0
+chr2	245893	3.0	0.0	3.0
+chr2	245899	1.0	2.0	3.0
+chr2	245900	0.0	1.0	1.0
+chr2	245905	0.0	1.0	1.0
+chr2	245913	1.0	0.0	1.0
+chr2	245947	2.0	0.0	2.0
+chr2	245977	0.0	1.0	1.0
+chr2	246047	1.0	0.0	1.0
+chr2	246054	0.0	1.0	1.0
+chr2	246069	2.0	0.0	2.0
+chr2	246203	3.0	0.0	3.0
+chr2	246205	1.0	0.0	1.0
+chr2	246220	0.0	1.0	1.0
+chr2	246436	1.0	0.0	1.0
+chr2	246443	3.0	0.0	3.0
+chr2	246487	1.0	0.0	1.0
+chr2	246502	0.0	1.0	1.0
+chr2	246519	0.0	1.0	1.0
+chr2	246533	1.0	0.0	1.0
+chr2	246534	0.0	1.0	1.0
+chr2	246633	0.0	1.0	1.0
+chr2	246639	0.0	1.0	1.0
+chr2	246902	0.0	1.0	1.0
+chr2	246905	1.0	0.0	1.0
+chr2	246910	5.0	0.0	5.0
+chr2	246914	0.0	2.0	2.0
+chr2	246915	0.0	1.0	1.0
+chr2	246923	0.0	1.0	1.0
+chr2	246924	1.0	0.0	1.0
+chr2	246927	0.0	1.0	1.0
+chr2	246930	0.0	1.0	1.0
+chr2	247070	0.0	1.0	1.0
+chr2	247088	3.0	0.0	3.0
+chr2	247102	1.0	0.0	1.0
+chr2	247121	0.0	1.0	1.0
+chr2	247135	1.0	0.0	1.0
+chr2	247222	1.0	0.0	1.0
+chr2	247270	1.0	0.0	1.0
+chr2	247274	0.0	1.0	1.0
+chr2	247371	0.0	1.0	1.0
+chr2	247385	0.0	2.0	2.0
+chr2	247399	0.0	1.0	1.0
+chr2	247403	1.0	0.0	1.0
+chr2	247453	2.0	0.0	2.0
+chr2	247469	0.0	1.0	1.0
+chr2	247519	0.0	1.0	1.0
+chr2	247616	1.0	0.0	1.0
+chr2	247623	2.0	0.0	2.0
+chr2	247633	1.0	0.0	1.0
+chr2	247644	0.0	1.0	1.0
+chr2	247645	0.0	1.0	1.0
+chr2	247681	0.0	1.0	1.0
+chr2	247683	0.0	1.0	1.0
+chr2	247804	1.0	0.0	1.0
+chr2	247806	0.0	1.0	1.0
+chr2	247813	1.0	0.0	1.0
+chr2	247822	1.0	0.0	1.0
+chr2	247826	0.0	1.0	1.0
+chr2	247832	1.0	0.0	1.0
+chr2	247833	2.0	0.0	2.0
+chr2	247842	0.0	4.0	4.0
+chr2	247863	0.0	1.0	1.0
+chr2	247959	0.0	1.0	1.0
+chr2	248017	1.0	0.0	1.0
+chr2	248045	0.0	1.0	1.0
+chr2	248062	1.0	0.0	1.0
+chr2	248099	1.0	0.0	1.0
+chr2	248100	0.0	1.0	1.0
+chr2	248108	1.0	1.0	2.0
+chr2	248138	0.0	1.0	1.0
+chr2	248165	0.0	1.0	1.0
+chr2	248175	1.0	0.0	1.0
+chr2	248260	1.0	0.0	1.0
+chr2	248316	1.0	0.0	1.0
+chr2	248350	1.0	0.0	1.0
+chr2	248405	0.0	3.0	3.0
+chr2	248491	0.0	1.0	1.0
+chr2	248520	0.0	1.0	1.0
+chr2	248521	1.0	0.0	1.0
+chr2	248930	0.0	1.0	1.0
+chr2	249061	1.0	0.0	1.0
+chr2	249106	0.0	1.0	1.0
+chr2	249137	0.0	1.0	1.0
+chr2	249144	1.0	0.0	1.0
+chr2	249303	0.0	1.0	1.0
+chr2	250065	0.0	1.0	1.0
+chr2	250552	1.0	0.0	1.0
+chr2	250581	1.0	0.0	1.0
+chr2	250595	1.0	0.0	1.0
+chr2	250765	0.0	1.0	1.0
+chr2	250887	1.0	0.0	1.0
+chr2	250897	1.0	0.0	1.0
+chr2	250903	0.0	3.0	3.0
+chr2	250905	0.0	1.0	1.0
+chr2	250915	1.0	0.0	1.0
+chr2	250920	0.0	1.0	1.0
+chr2	250925	0.0	1.0	1.0
+chr2	250926	1.0	1.0	2.0
+chr2	250927	0.0	1.0	1.0
+chr2	250934	0.0	1.0	1.0
+chr2	250940	2.0	2.0	4.0
+chr2	251097	1.0	0.0	1.0
+chr2	251192	1.0	0.0	1.0
+chr2	251195	0.0	1.0	1.0
+chr2	251199	1.0	0.0	1.0
+chr2	251226	0.0	1.0	1.0
+chr2	251576	1.0	0.0	1.0
+chr2	251579	1.0	0.0	1.0
+chr2	251589	0.0	1.0	1.0
+chr2	251590	0.0	2.0	2.0
+chr2	251592	1.0	1.0	2.0
+chr2	251593	1.0	0.0	1.0
+chr2	251618	0.0	1.0	1.0
+chr2	251629	1.0	0.0	1.0
+chr2	251639	1.0	0.0	1.0
+chr2	251731	0.0	1.0	1.0
+chr2	251743	1.0	0.0	1.0
+chr2	251770	1.0	0.0	1.0
+chr2	251774	0.0	1.0	1.0
+chr2	251781	1.0	0.0	1.0
+chr2	251804	1.0	0.0	1.0
+chr2	251811	0.0	1.0	1.0
+chr2	251813	0.0	1.0	1.0
+chr2	251827	0.0	1.0	1.0
+chr2	251847	1.0	0.0	1.0
+chr2	251862	0.0	2.0	2.0
+chr2	251991	0.0	2.0	2.0
+chr2	251993	2.0	0.0	2.0
+chr2	252031	1.0	0.0	1.0
+chr2	252047	0.0	1.0	1.0
+chr2	252125	1.0	0.0	1.0
+chr2	252167	1.0	0.0	1.0
+chr2	252312	1.0	0.0	1.0
+chr2	252467	0.0	1.0	1.0
+chr2	252618	2.0	0.0	2.0
+chr2	252636	1.0	0.0	1.0
+chr2	252876	0.0	1.0	1.0
+chr2	252929	1.0	0.0	1.0
+chr2	252946	1.0	0.0	1.0
+chr2	252966	0.0	1.0	1.0
+chr2	252987	1.0	0.0	1.0
+chr2	253597	1.0	0.0	1.0
+chr2	253602	0.0	1.0	1.0
+chr2	253871	2.0	0.0	2.0
+chr2	253938	1.0	0.0	1.0
+chr2	254054	0.0	1.0	1.0
+chr2	254063	1.0	0.0	1.0
+chr2	254211	1.0	0.0	1.0
+chr2	254234	1.0	0.0	1.0
+chr2	254313	0.0	1.0	1.0
+chr2	254329	0.0	1.0	1.0
+chr2	254335	0.0	1.0	1.0
+chr2	254349	1.0	1.0	2.0
+chr2	254358	0.0	1.0	1.0
+chr2	254361	0.0	1.0	1.0
+chr2	254370	0.0	2.0	2.0
+chr2	254371	0.0	2.0	2.0
+chr2	254373	1.0	0.0	1.0
+chr2	254375	1.0	0.0	1.0
+chr2	254376	0.0	1.0	1.0
+chr2	254380	0.0	2.0	2.0
+chr2	254388	2.0	0.0	2.0
+chr2	254389	3.0	0.0	3.0
+chr2	254516	0.0	1.0	1.0
+chr2	254658	1.0	0.0	1.0
+chr2	254683	0.0	1.0	1.0
+chr2	254701	0.0	1.0	1.0
+chr2	254734	1.0	0.0	1.0
+chr2	254757	0.0	1.0	1.0
+chr2	254817	0.0	1.0	1.0
+chr2	254846	0.0	2.0	2.0
+chr2	254848	1.0	0.0	1.0
+chr2	254854	0.0	1.0	1.0
+chr2	254868	0.0	1.0	1.0
+chr2	254876	1.0	0.0	1.0
+chr2	254878	0.0	1.0	1.0
+chr2	254880	1.0	0.0	1.0
+chr2	254881	1.0	0.0	1.0
+chr2	255449	0.0	1.0	1.0
+chr2	255468	0.0	1.0	1.0
+chr2	255477	1.0	0.0	1.0
+chr2	255578	1.0	0.0	1.0
+chr2	255580	1.0	0.0	1.0
+chr2	255593	0.0	1.0	1.0
+chr2	255605	1.0	0.0	1.0
+chr2	255606	1.0	0.0	1.0
+chr2	255609	1.0	1.0	2.0
+chr2	255645	1.0	0.0	1.0
+chr2	255849	1.0	0.0	1.0
+chr2	256185	1.0	0.0	1.0
+chr2	256299	2.0	0.0	2.0
+chr2	256363	0.0	1.0	1.0
+chr2	256393	0.0	1.0	1.0
+chr2	256402	1.0	0.0	1.0
+chr2	256410	0.0	1.0	1.0
+chr2	256412	0.0	1.0	1.0
+chr2	256418	0.0	1.0	1.0
+chr2	256422	0.0	1.0	1.0
+chr2	256461	0.0	1.0	1.0
+chr2	256723	1.0	0.0	1.0
+chr2	257069	1.0	0.0	1.0
+chr2	257072	0.0	2.0	2.0
+chr2	257189	1.0	0.0	1.0
+chr2	257305	0.0	1.0	1.0
+chr2	257330	0.0	1.0	1.0
+chr2	257502	1.0	0.0	1.0
+chr2	257514	0.0	1.0	1.0
+chr2	257627	3.0	0.0	3.0
+chr2	257700	1.0	0.0	1.0
+chr2	257800	1.0	0.0	1.0
+chr2	257812	3.0	0.0	3.0
+chr2	257965	0.0	2.0	2.0
+chr2	257968	0.0	2.0	2.0
+chr2	257976	0.0	1.0	1.0
+chr2	257985	1.0	0.0	1.0
+chr2	257990	0.0	1.0	1.0
+chr2	257996	0.0	1.0	1.0
+chr2	257998	1.0	0.0	1.0
+chr2	258030	0.0	1.0	1.0
+chr2	258240	1.0	0.0	1.0
+chr2	258244	0.0	1.0	1.0
+chr2	258247	1.0	0.0	1.0
+chr2	258248	0.0	1.0	1.0
+chr2	258251	0.0	2.0	2.0
+chr2	258252	0.0	1.0	1.0
+chr2	258255	1.0	0.0	1.0
+chr2	258261	2.0	0.0	2.0
+chr2	258268	1.0	0.0	1.0
+chr2	258271	0.0	2.0	2.0
+chr2	258273	1.0	0.0	1.0
+chr2	258275	0.0	7.0	7.0
+chr2	258276	2.0	0.0	2.0
+chr2	258277	3.0	0.0	3.0
+chr2	258278	0.0	2.0	2.0
+chr2	258279	0.0	1.0	1.0
+chr2	258280	2.0	0.0	2.0
+chr2	258283	3.0	0.0	3.0
+chr2	258285	2.0	0.0	2.0
+chr2	258286	1.0	0.0	1.0
+chr2	258290	2.0	0.0	2.0
+chr2	258292	2.0	2.0	4.0
+chr2	258294	0.0	2.0	2.0
+chr2	258303	4.0	0.0	4.0
+chr2	258307	0.0	2.0	2.0
+chr2	258310	0.0	1.0	1.0
+chr2	258321	1.0	0.0	1.0
+chr2	258322	0.0	1.0	1.0
+chr2	258327	1.0	0.0	1.0
+chr2	258345	1.0	0.0	1.0
+chr2	258424	0.0	1.0	1.0
+chr2	258436	2.0	0.0	2.0
+chr2	258443	4.0	0.0	4.0
+chr2	258446	2.0	0.0	2.0
+chr2	258459	0.0	1.0	1.0
+chr2	258478	1.0	0.0	1.0
+chr2	258508	0.0	1.0	1.0
+chr2	258565	0.0	1.0	1.0
+chr2	258614	0.0	1.0	1.0
+chr2	258616	1.0	0.0	1.0
+chr2	258617	0.0	1.0	1.0
+chr2	258625	0.0	1.0	1.0
+chr2	258645	1.0	0.0	1.0
+chr2	258697	0.0	1.0	1.0
+chr2	258707	0.0	12.0	12.0
+chr2	258709	0.0	1.0	1.0
+chr2	258714	0.0	4.0	4.0
+chr2	258718	0.0	1.0	1.0
+chr2	258728	0.0	2.0	2.0
+chr2	258758	1.0	0.0	1.0
+chr2	258761	1.0	0.0	1.0
+chr2	258922	1.0	0.0	1.0
+chr2	258925	1.0	0.0	1.0
+chr2	259150	1.0	0.0	1.0
+chr2	259182	1.0	0.0	1.0
+chr2	259186	1.0	0.0	1.0
+chr2	259197	0.0	1.0	1.0
+chr2	259360	1.0	0.0	1.0
+chr2	259602	0.0	1.0	1.0
+chr2	259610	0.0	1.0	1.0
+chr2	259613	0.0	1.0	1.0
+chr2	259614	0.0	1.0	1.0
+chr2	259615	0.0	1.0	1.0
+chr2	259624	0.0	2.0	2.0
+chr2	259626	0.0	3.0	3.0
+chr2	259629	0.0	1.0	1.0
+chr2	259637	0.0	2.0	2.0
+chr2	259638	0.0	1.0	1.0
+chr2	259641	0.0	4.0	4.0
+chr2	259642	0.0	4.0	4.0
+chr2	259644	2.0	0.0	2.0
+chr2	259647	0.0	1.0	1.0
+chr2	259648	2.0	0.0	2.0
+chr2	259649	5.0	0.0	5.0
+chr2	259650	0.0	1.0	1.0
+chr2	259652	1.0	1.0	2.0
+chr2	259653	0.0	2.0	2.0
+chr2	259654	0.0	1.0	1.0
+chr2	259655	0.0	1.0	1.0
+chr2	259660	2.0	0.0	2.0
+chr2	259661	0.0	1.0	1.0
+chr2	259663	1.0	2.0	3.0
+chr2	259666	2.0	0.0	2.0
+chr2	259670	1.0	0.0	1.0
+chr2	259671	0.0	1.0	1.0
+chr2	259674	0.0	2.0	2.0
+chr2	259675	0.0	1.0	1.0
+chr2	259681	0.0	2.0	2.0
+chr2	259684	0.0	1.0	1.0
+chr2	259688	0.0	2.0	2.0
+chr2	259695	1.0	0.0	1.0
+chr2	259698	0.0	2.0	2.0
+chr2	259699	0.0	1.0	1.0
+chr2	259700	1.0	0.0	1.0
+chr2	259703	1.0	0.0	1.0
+chr2	259705	2.0	0.0	2.0
+chr2	259706	0.0	2.0	2.0
+chr2	259710	1.0	0.0	1.0
+chr2	259711	1.0	0.0	1.0
+chr2	259712	1.0	0.0	1.0
+chr2	259713	1.0	0.0	1.0
+chr2	259714	1.0	0.0	1.0
+chr2	259721	0.0	1.0	1.0
+chr2	259722	1.0	0.0	1.0
+chr2	259727	0.0	2.0	2.0
+chr2	259728	2.0	2.0	4.0
+chr2	259731	0.0	1.0	1.0
+chr2	259732	0.0	2.0	2.0
+chr2	259733	0.0	1.0	1.0
+chr2	259734	0.0	2.0	2.0
+chr2	259738	1.0	0.0	1.0
+chr2	259740	2.0	0.0	2.0
+chr2	259750	0.0	1.0	1.0
+chr2	259754	0.0	3.0	3.0
+chr2	259756	0.0	2.0	2.0
+chr2	259757	0.0	5.0	5.0
+chr2	259765	0.0	1.0	1.0
+chr2	259766	0.0	1.0	1.0
+chr2	259767	0.0	1.0	1.0
+chr2	259772	1.0	0.0	1.0
+chr2	259778	0.0	1.0	1.0
+chr2	259784	0.0	1.0	1.0
+chr2	259788	1.0	0.0	1.0
+chr2	259795	2.0	0.0	2.0
+chr2	259796	1.0	0.0	1.0
+chr2	259803	1.0	0.0	1.0
+chr2	259811	0.0	1.0	1.0
+chr2	259814	1.0	1.0	2.0
+chr2	259815	1.0	0.0	1.0
+chr2	259816	3.0	0.0	3.0
+chr2	259824	2.0	0.0	2.0
+chr2	259825	0.0	2.0	2.0
+chr2	259830	1.0	0.0	1.0
+chr2	259836	2.0	0.0	2.0
+chr2	259840	1.0	0.0	1.0
+chr2	259842	1.0	0.0	1.0
+chr2	259844	1.0	0.0	1.0
+chr2	259845	1.0	1.0	2.0
+chr2	259846	1.0	0.0	1.0
+chr2	259848	1.0	0.0	1.0
+chr2	259849	1.0	0.0	1.0
+chr2	259853	1.0	0.0	1.0
+chr2	259855	0.0	1.0	1.0
+chr2	259856	1.0	0.0	1.0
+chr2	259857	17.0	0.0	17.0
+chr2	259858	3.0	0.0	3.0
+chr2	259859	0.0	2.0	2.0
+chr2	259860	1.0	0.0	1.0
+chr2	259861	3.0	0.0	3.0
+chr2	259862	0.0	2.0	2.0
+chr2	259863	0.0	1.0	1.0
+chr2	259865	2.0	0.0	2.0
+chr2	259866	0.0	1.0	1.0
+chr2	259872	0.0	4.0	4.0
+chr2	259873	0.0	2.0	2.0
+chr2	259875	2.0	1.0	3.0
+chr2	259881	3.0	0.0	3.0
+chr2	259882	2.0	2.0	4.0
+chr2	259889	0.0	1.0	1.0
+chr2	259890	0.0	1.0	1.0
+chr2	259891	0.0	2.0	2.0
+chr2	259897	0.0	1.0	1.0
+chr2	259900	1.0	0.0	1.0
+chr2	259904	1.0	0.0	1.0
+chr2	259909	2.0	0.0	2.0
+chr2	259911	0.0	1.0	1.0
+chr2	259913	1.0	0.0	1.0
+chr2	259924	0.0	2.0	2.0
+chr2	259926	1.0	0.0	1.0
+chr2	259937	0.0	1.0	1.0
+chr2	259938	2.0	1.0	3.0
+chr2	259939	1.0	0.0	1.0
+chr2	259944	0.0	3.0	3.0
+chr2	259956	1.0	0.0	1.0
+chr2	259958	0.0	1.0	1.0
+chr2	259959	0.0	1.0	1.0
+chr2	259961	0.0	1.0	1.0
+chr2	259963	1.0	1.0	2.0
+chr2	259964	1.0	0.0	1.0
+chr2	259967	0.0	1.0	1.0
+chr2	259968	1.0	0.0	1.0
+chr2	259970	0.0	1.0	1.0
+chr2	259971	0.0	1.0	1.0
+chr2	259974	1.0	1.0	2.0
+chr2	259975	2.0	0.0	2.0
+chr2	259976	3.0	0.0	3.0
+chr2	259977	1.0	0.0	1.0
+chr2	259978	1.0	0.0	1.0
+chr2	259979	0.0	1.0	1.0
+chr2	259980	5.0	0.0	5.0
+chr2	259981	1.0	0.0	1.0
+chr2	259985	2.0	5.0	7.0
+chr2	259987	0.0	1.0	1.0
+chr2	259992	0.0	9.0	9.0
+chr2	259996	0.0	4.0	4.0
+chr2	259997	1.0	1.0	2.0
+chr2	259999	0.0	3.0	3.0
+chr2	260003	2.0	1.0	3.0
+chr2	260006	1.0	3.0	4.0
+chr2	260008	1.0	0.0	1.0
+chr2	260009	1.0	2.0	3.0
+chr2	260010	5.0	0.0	5.0
+chr2	260012	3.0	0.0	3.0
+chr2	260015	0.0	1.0	1.0
+chr2	260016	1.0	2.0	3.0
+chr2	260018	0.0	10.0	10.0
+chr2	260019	0.0	1.0	1.0
+chr2	260021	1.0	7.0	8.0
+chr2	260023	0.0	1.0	1.0
+chr2	260024	2.0	0.0	2.0
+chr2	260025	3.0	0.0	3.0
+chr2	260026	2.0	0.0	2.0
+chr2	260029	3.0	0.0	3.0
+chr2	260030	0.0	2.0	2.0
+chr2	260031	2.0	0.0	2.0
+chr2	260032	1.0	0.0	1.0
+chr2	260033	0.0	5.0	5.0
+chr2	260035	0.0	4.0	4.0
+chr2	260037	1.0	3.0	4.0
+chr2	260038	9.0	3.0	12.0
+chr2	260040	1.0	0.0	1.0
+chr2	260041	4.0	6.0	10.0
+chr2	260044	1.0	0.0	1.0
+chr2	260045	4.0	1.0	5.0
+chr2	260046	0.0	1.0	1.0
+chr2	260047	1.0	4.0	5.0
+chr2	260051	0.0	3.0	3.0
+chr2	260055	1.0	0.0	1.0
+chr2	260056	0.0	12.0	12.0
+chr2	260059	2.0	0.0	2.0
+chr2	260061	3.0	12.0	15.0
+chr2	260062	1.0	3.0	4.0
+chr2	260063	0.0	2.0	2.0
+chr2	260064	0.0	1.0	1.0
+chr2	260065	0.0	1.0	1.0
+chr2	260066	0.0	1.0	1.0
+chr2	260067	1.0	1.0	2.0
+chr2	260070	0.0	10.0	10.0
+chr2	260071	0.0	1.0	1.0
+chr2	260072	6.0	5.0	11.0
+chr2	260073	8.0	0.0	8.0
+chr2	260075	0.0	3.0	3.0
+chr2	260077	7.0	2.0	9.0
+chr2	260078	2.0	0.0	2.0
+chr2	260080	0.0	4.0	4.0
+chr2	260082	0.0	3.0	3.0
+chr2	260084	1.0	0.0	1.0
+chr2	260085	2.0	0.0	2.0
+chr2	260087	0.0	2.0	2.0
+chr2	260090	1.0	1.0	2.0
+chr2	260092	4.0	0.0	4.0
+chr2	260093	2.0	0.0	2.0
+chr2	260095	1.0	0.0	1.0
+chr2	260098	2.0	0.0	2.0
+chr2	260099	0.0	2.0	2.0
+chr2	260100	3.0	2.0	5.0
+chr2	260105	6.0	0.0	6.0
+chr2	260107	1.0	0.0	1.0
+chr2	260110	2.0	0.0	2.0
+chr2	260113	2.0	0.0	2.0
+chr2	260114	0.0	3.0	3.0
+chr2	260117	0.0	8.0	8.0
+chr2	260118	0.0	4.0	4.0
+chr2	260120	3.0	0.0	3.0
+chr2	260122	2.0	0.0	2.0
+chr2	260123	1.0	0.0	1.0
+chr2	260125	0.0	1.0	1.0
+chr2	260126	0.0	4.0	4.0
+chr2	260127	0.0	6.0	6.0
+chr2	260128	2.0	0.0	2.0
+chr2	260129	1.0	1.0	2.0
+chr2	260133	2.0	0.0	2.0
+chr2	260135	2.0	2.0	4.0
+chr2	260136	3.0	1.0	4.0
+chr2	260137	0.0	1.0	1.0
+chr2	260140	0.0	1.0	1.0
+chr2	260141	2.0	0.0	2.0
+chr2	260145	1.0	0.0	1.0
+chr2	260146	2.0	0.0	2.0
+chr2	260150	0.0	4.0	4.0
+chr2	260151	0.0	6.0	6.0
+chr2	260152	2.0	0.0	2.0
+chr2	260154	0.0	1.0	1.0
+chr2	260155	1.0	0.0	1.0
+chr2	260157	2.0	1.0	3.0
+chr2	260165	1.0	1.0	2.0
+chr2	260167	4.0	0.0	4.0
+chr2	260170	2.0	0.0	2.0
+chr2	260171	0.0	1.0	1.0
+chr2	260173	0.0	7.0	7.0
+chr2	260176	1.0	0.0	1.0
+chr2	260177	3.0	0.0	3.0
+chr2	260179	0.0	5.0	5.0
+chr2	260181	1.0	2.0	3.0
+chr2	260182	0.0	1.0	1.0
+chr2	260185	5.0	0.0	5.0
+chr2	260188	0.0	6.0	6.0
+chr2	260190	0.0	3.0	3.0
+chr2	260191	0.0	1.0	1.0
+chr2	260195	1.0	1.0	2.0
+chr2	260197	1.0	0.0	1.0
+chr2	260198	0.0	2.0	2.0
+chr2	260199	2.0	0.0	2.0
+chr2	260201	0.0	3.0	3.0
+chr2	260202	1.0	0.0	1.0
+chr2	260203	0.0	1.0	1.0
+chr2	260206	0.0	1.0	1.0
+chr2	260207	0.0	1.0	1.0
+chr2	260210	1.0	0.0	1.0
+chr2	260211	7.0	0.0	7.0
+chr2	260213	1.0	1.0	2.0
+chr2	260214	1.0	0.0	1.0
+chr2	260215	0.0	2.0	2.0
+chr2	260218	1.0	0.0	1.0
+chr2	260220	2.0	0.0	2.0
+chr2	260222	0.0	3.0	3.0
+chr2	260224	3.0	0.0	3.0
+chr2	260225	0.0	1.0	1.0
+chr2	260228	0.0	1.0	1.0
+chr2	260229	2.0	0.0	2.0
+chr2	260231	4.0	1.0	5.0
+chr2	260233	0.0	1.0	1.0
+chr2	260236	5.0	0.0	5.0
+chr2	260237	0.0	2.0	2.0
+chr2	260239	0.0	2.0	2.0
+chr2	260240	1.0	4.0	5.0
+chr2	260241	0.0	7.0	7.0
+chr2	260246	0.0	3.0	3.0
+chr2	260247	0.0	1.0	1.0
+chr2	260249	1.0	0.0	1.0
+chr2	260251	1.0	0.0	1.0
+chr2	260254	0.0	1.0	1.0
+chr2	260261	1.0	0.0	1.0
+chr2	260262	0.0	2.0	2.0
+chr2	260264	1.0	2.0	3.0
+chr2	260266	0.0	1.0	1.0
+chr2	260269	1.0	0.0	1.0
+chr2	260271	0.0	1.0	1.0
+chr2	260273	0.0	3.0	3.0
+chr2	260274	1.0	1.0	2.0
+chr2	260275	2.0	5.0	7.0
+chr2	260276	1.0	1.0	2.0
+chr2	260282	1.0	2.0	3.0
+chr2	260283	3.0	0.0	3.0
+chr2	260284	1.0	0.0	1.0
+chr2	260285	1.0	0.0	1.0
+chr2	260287	2.0	0.0	2.0
+chr2	260288	0.0	11.0	11.0
+chr2	260289	8.0	3.0	11.0
+chr2	260292	1.0	0.0	1.0
+chr2	260297	3.0	0.0	3.0
+chr2	260298	4.0	0.0	4.0
+chr2	260300	2.0	0.0	2.0
+chr2	260301	9.0	2.0	11.0
+chr2	260303	2.0	0.0	2.0
+chr2	260304	3.0	0.0	3.0
+chr2	260305	9.0	0.0	9.0
+chr2	260306	2.0	0.0	2.0
+chr2	260309	0.0	1.0	1.0
+chr2	260311	2.0	2.0	4.0
+chr2	260312	0.0	23.0	23.0
+chr2	260313	0.0	5.0	5.0
+chr2	260314	0.0	1.0	1.0
+chr2	260316	1.0	2.0	3.0
+chr2	260317	0.0	2.0	2.0
+chr2	260318	0.0	2.0	2.0
+chr2	260319	1.0	0.0	1.0
+chr2	260320	9.0	0.0	9.0
+chr2	260321	18.0	0.0	18.0
+chr2	260322	0.0	1.0	1.0
+chr2	260323	3.0	0.0	3.0
+chr2	260324	2.0	3.0	5.0
+chr2	260325	2.0	0.0	2.0
+chr2	260327	0.0	19.0	19.0
+chr2	260328	5.0	12.0	17.0
+chr2	260329	16.0	1.0	17.0
+chr2	260330	3.0	0.0	3.0
+chr2	260332	0.0	6.0	6.0
+chr2	260334	1.0	9.0	10.0
+chr2	260335	0.0	7.0	7.0
+chr2	260336	1.0	1.0	2.0
+chr2	260337	12.0	11.0	23.0
+chr2	260338	16.0	0.0	16.0
+chr2	260339	5.0	11.0	16.0
+chr2	260340	0.0	10.0	10.0
+chr2	260341	3.0	0.0	3.0
+chr2	260342	7.0	1.0	8.0
+chr2	260343	2.0	2.0	4.0
+chr2	260344	3.0	0.0	3.0
+chr2	260345	1.0	0.0	1.0
+chr2	260346	0.0	4.0	4.0
+chr2	260347	13.0	12.0	25.0
+chr2	260348	0.0	12.0	12.0
+chr2	260349	2.0	19.0	21.0
+chr2	260350	14.0	0.0	14.0
+chr2	260351	0.0	1.0	1.0
+chr2	260352	0.0	2.0	2.0
+chr2	260353	1.0	0.0	1.0
+chr2	260354	1.0	6.0	7.0
+chr2	260355	1.0	3.0	4.0
+chr2	260356	0.0	1.0	1.0
+chr2	260358	0.0	1.0	1.0
+chr2	260359	1.0	0.0	1.0
+chr2	260361	5.0	10.0	15.0
+chr2	260362	0.0	4.0	4.0
+chr2	260363	3.0	0.0	3.0
+chr2	260364	0.0	1.0	1.0
+chr2	260365	0.0	1.0	1.0
+chr2	260366	1.0	0.0	1.0
+chr2	260367	0.0	1.0	1.0
+chr2	260368	3.0	0.0	3.0
+chr2	260372	1.0	0.0	1.0
+chr2	260373	0.0	1.0	1.0
+chr2	260376	0.0	1.0	1.0
+chr2	260378	0.0	1.0	1.0
+chr2	260379	2.0	1.0	3.0
+chr2	260381	1.0	0.0	1.0
+chr2	260383	1.0	0.0	1.0
+chr2	260388	1.0	1.0	2.0
+chr2	260389	3.0	2.0	5.0
+chr2	260390	3.0	9.0	12.0
+chr2	260391	0.0	2.0	2.0
+chr2	260392	0.0	1.0	1.0
+chr2	260395	2.0	0.0	2.0
+chr2	260396	2.0	0.0	2.0
+chr2	260398	1.0	0.0	1.0
+chr2	260399	0.0	1.0	1.0
+chr2	260401	3.0	0.0	3.0
+chr2	260402	5.0	0.0	5.0
+chr2	260408	1.0	0.0	1.0
+chr2	260411	0.0	2.0	2.0
+chr2	260412	0.0	1.0	1.0
+chr2	260418	0.0	1.0	1.0
+chr2	260421	1.0	0.0	1.0
+chr2	260424	0.0	1.0	1.0
+chr2	260426	2.0	0.0	2.0
+chr2	260430	1.0	1.0	2.0
+chr2	260437	0.0	2.0	2.0
+chr2	260442	7.0	0.0	7.0
+chr2	260443	1.0	0.0	1.0
+chr2	260447	1.0	0.0	1.0
+chr2	260451	0.0	1.0	1.0
+chr2	260454	0.0	1.0	1.0
+chr2	260459	1.0	3.0	4.0
+chr2	260464	0.0	1.0	1.0
+chr2	260468	0.0	1.0	1.0
+chr2	260470	1.0	2.0	3.0
+chr2	260475	3.0	0.0	3.0
+chr2	260476	1.0	0.0	1.0
+chr2	260481	0.0	2.0	2.0
+chr2	260482	1.0	0.0	1.0
+chr2	260483	0.0	1.0	1.0
+chr2	260485	0.0	1.0	1.0
+chr2	260488	2.0	0.0	2.0
+chr2	260489	3.0	0.0	3.0
+chr2	260495	0.0	1.0	1.0
+chr2	260498	1.0	0.0	1.0
+chr2	260499	0.0	2.0	2.0
+chr2	260500	1.0	0.0	1.0
+chr2	260501	3.0	0.0	3.0
+chr2	260502	12.0	0.0	12.0
+chr2	260503	1.0	0.0	1.0
+chr2	260505	1.0	1.0	2.0
+chr2	260508	1.0	0.0	1.0
+chr2	260511	0.0	3.0	3.0
+chr2	260512	0.0	1.0	1.0
+chr2	260513	4.0	0.0	4.0
+chr2	260514	8.0	1.0	9.0
+chr2	260515	3.0	6.0	9.0
+chr2	260517	1.0	1.0	2.0
+chr2	260518	6.0	0.0	6.0
+chr2	260519	2.0	0.0	2.0
+chr2	260520	6.0	1.0	7.0
+chr2	260521	0.0	4.0	4.0
+chr2	260522	3.0	1.0	4.0
+chr2	260524	0.0	17.0	17.0
+chr2	260525	0.0	2.0	2.0
+chr2	260526	1.0	1.0	2.0
+chr2	260527	3.0	0.0	3.0
+chr2	260530	1.0	0.0	1.0
+chr2	260533	0.0	4.0	4.0
+chr2	260534	0.0	7.0	7.0
+chr2	260535	0.0	6.0	6.0
+chr2	260538	0.0	1.0	1.0
+chr2	260539	1.0	0.0	1.0
+chr2	260540	1.0	0.0	1.0
+chr2	260541	1.0	1.0	2.0
+chr2	260542	9.0	2.0	11.0
+chr2	260543	0.0	1.0	1.0
+chr2	260548	2.0	0.0	2.0
+chr2	260551	1.0	0.0	1.0
+chr2	260552	3.0	0.0	3.0
+chr2	260553	4.0	3.0	7.0
+chr2	260554	2.0	6.0	8.0
+chr2	260556	1.0	0.0	1.0
+chr2	260558	2.0	1.0	3.0
+chr2	260560	0.0	4.0	4.0
+chr2	260562	1.0	0.0	1.0
+chr2	260566	1.0	0.0	1.0
+chr2	260572	0.0	6.0	6.0
+chr2	260576	3.0	0.0	3.0
+chr2	260578	2.0	4.0	6.0
+chr2	260579	0.0	1.0	1.0
+chr2	260580	2.0	0.0	2.0
+chr2	260581	1.0	3.0	4.0
+chr2	260584	1.0	4.0	5.0
+chr2	260585	3.0	2.0	5.0
+chr2	260587	1.0	0.0	1.0
+chr2	260589	0.0	4.0	4.0
+chr2	260591	0.0	7.0	7.0
+chr2	260596	0.0	1.0	1.0
+chr2	260598	0.0	4.0	4.0
+chr2	260599	0.0	3.0	3.0
+chr2	260601	1.0	0.0	1.0
+chr2	260602	2.0	0.0	2.0
+chr2	260607	8.0	0.0	8.0
+chr2	260608	0.0	2.0	2.0
+chr2	260609	1.0	0.0	1.0
+chr2	260612	0.0	4.0	4.0
+chr2	260613	0.0	4.0	4.0
+chr2	260615	1.0	0.0	1.0
+chr2	260617	2.0	0.0	2.0
+chr2	260619	5.0	0.0	5.0
+chr2	260620	3.0	7.0	10.0
+chr2	260621	0.0	2.0	2.0
+chr2	260622	1.0	4.0	5.0
+chr2	260632	1.0	0.0	1.0
+chr2	260634	4.0	0.0	4.0
+chr2	260638	1.0	0.0	1.0
+chr2	260642	1.0	0.0	1.0
+chr2	260663	1.0	0.0	1.0
+chr2	260664	0.0	1.0	1.0
+chr2	260666	0.0	3.0	3.0
+chr2	260667	0.0	1.0	1.0
+chr2	260670	0.0	3.0	3.0
+chr2	260672	0.0	2.0	2.0
+chr2	260674	1.0	0.0	1.0
+chr2	260675	3.0	0.0	3.0
+chr2	260678	1.0	0.0	1.0
+chr2	260679	0.0	1.0	1.0
+chr2	260681	1.0	0.0	1.0
+chr2	260682	1.0	0.0	1.0
+chr2	260685	2.0	5.0	7.0
+chr2	260688	0.0	5.0	5.0
+chr2	260689	1.0	1.0	2.0
+chr2	260690	0.0	1.0	1.0
+chr2	260691	0.0	1.0	1.0
+chr2	260692	6.0	0.0	6.0
+chr2	260693	1.0	0.0	1.0
+chr2	260695	3.0	0.0	3.0
+chr2	260696	4.0	1.0	5.0
+chr2	260697	0.0	16.0	16.0
+chr2	260698	0.0	4.0	4.0
+chr2	260699	1.0	3.0	4.0
+chr2	260700	3.0	3.0	6.0
+chr2	260701	0.0	4.0	4.0
+chr2	260702	0.0	2.0	2.0
+chr2	260706	2.0	7.0	9.0
+chr2	260707	14.0	1.0	15.0
+chr2	260708	0.0	6.0	6.0
+chr2	260709	0.0	1.0	1.0
+chr2	260710	10.0	0.0	10.0
+chr2	260711	3.0	0.0	3.0
+chr2	260712	1.0	3.0	4.0
+chr2	260713	4.0	0.0	4.0
+chr2	260714	6.0	0.0	6.0
+chr2	260715	10.0	0.0	10.0
+chr2	260719	1.0	0.0	1.0
+chr2	260720	3.0	3.0	6.0
+chr2	260721	1.0	0.0	1.0
+chr2	260722	2.0	16.0	18.0
+chr2	260724	2.0	0.0	2.0
+chr2	260725	0.0	1.0	1.0
+chr2	260726	2.0	0.0	2.0
+chr2	260727	0.0	1.0	1.0
+chr2	260728	0.0	1.0	1.0
+chr2	260729	1.0	1.0	2.0
+chr2	260730	1.0	1.0	2.0
+chr2	260731	5.0	0.0	5.0
+chr2	260733	2.0	0.0	2.0
+chr2	260736	0.0	1.0	1.0
+chr2	260738	1.0	1.0	2.0
+chr2	260739	3.0	0.0	3.0
+chr2	260740	1.0	0.0	1.0
+chr2	260741	0.0	1.0	1.0
+chr2	260742	0.0	1.0	1.0
+chr2	260743	0.0	4.0	4.0
+chr2	260746	6.0	0.0	6.0
+chr2	260747	0.0	1.0	1.0
+chr2	260748	4.0	0.0	4.0
+chr2	260749	4.0	0.0	4.0
+chr2	260751	0.0	2.0	2.0
+chr2	260752	0.0	8.0	8.0
+chr2	260753	0.0	2.0	2.0
+chr2	260754	0.0	4.0	4.0
+chr2	260755	0.0	2.0	2.0
+chr2	260762	5.0	0.0	5.0
+chr2	260768	2.0	0.0	2.0
+chr2	260769	1.0	5.0	6.0
+chr2	260771	1.0	0.0	1.0
+chr2	260772	2.0	2.0	4.0
+chr2	260773	5.0	0.0	5.0
+chr2	260774	1.0	0.0	1.0
+chr2	260777	2.0	0.0	2.0
+chr2	260779	0.0	1.0	1.0
+chr2	260780	3.0	0.0	3.0
+chr2	260783	0.0	1.0	1.0
+chr2	260785	1.0	1.0	2.0
+chr2	260786	0.0	1.0	1.0
+chr2	260800	1.0	0.0	1.0
+chr2	260806	0.0	1.0	1.0
+chr2	260812	0.0	1.0	1.0
+chr2	260825	1.0	0.0	1.0
+chr2	260828	0.0	1.0	1.0
+chr2	260831	1.0	0.0	1.0
+chr2	260836	0.0	1.0	1.0
+chr2	260838	1.0	0.0	1.0
+chr2	260849	1.0	0.0	1.0
+chr2	260850	1.0	0.0	1.0
+chr2	260854	1.0	0.0	1.0
+chr2	260855	0.0	2.0	2.0
+chr2	260856	1.0	0.0	1.0
+chr2	260858	1.0	0.0	1.0
+chr2	260862	0.0	5.0	5.0
+chr2	260867	0.0	2.0	2.0
+chr2	260868	0.0	1.0	1.0
+chr2	260872	1.0	0.0	1.0
+chr2	260879	0.0	2.0	2.0
+chr2	260880	8.0	1.0	9.0
+chr2	260882	2.0	0.0	2.0
+chr2	260884	4.0	0.0	4.0
+chr2	260889	1.0	1.0	2.0
+chr2	260891	2.0	2.0	4.0
+chr2	260893	6.0	0.0	6.0
+chr2	260895	0.0	1.0	1.0
+chr2	260898	0.0	1.0	1.0
+chr2	260899	0.0	2.0	2.0
+chr2	260901	1.0	0.0	1.0
+chr2	260903	1.0	0.0	1.0
+chr2	260909	3.0	0.0	3.0
+chr2	260910	5.0	0.0	5.0
+chr2	260911	3.0	0.0	3.0
+chr2	260912	3.0	0.0	3.0
+chr2	260913	0.0	4.0	4.0
+chr2	260914	0.0	2.0	2.0
+chr2	260915	0.0	1.0	1.0
+chr2	260916	3.0	0.0	3.0
+chr2	260919	0.0	2.0	2.0
+chr2	260920	2.0	0.0	2.0
+chr2	260921	0.0	1.0	1.0
+chr2	260924	0.0	1.0	1.0
+chr2	260925	1.0	0.0	1.0
+chr2	260934	0.0	3.0	3.0
+chr2	260940	3.0	2.0	5.0
+chr2	260944	2.0	0.0	2.0
+chr2	260957	0.0	2.0	2.0
+chr2	260959	0.0	2.0	2.0
+chr2	260968	1.0	0.0	1.0
+chr2	260974	0.0	1.0	1.0
+chr2	260980	1.0	0.0	1.0
+chr2	260983	1.0	0.0	1.0
+chr2	260995	0.0	1.0	1.0
+chr2	261000	1.0	0.0	1.0
+chr2	261001	0.0	2.0	2.0
+chr2	261003	0.0	1.0	1.0
+chr2	261005	1.0	0.0	1.0
+chr2	261012	0.0	1.0	1.0
+chr2	261020	1.0	0.0	1.0
+chr2	261026	1.0	0.0	1.0
+chr2	261028	1.0	0.0	1.0
+chr2	261036	1.0	0.0	1.0
+chr2	261037	2.0	0.0	2.0
+chr2	261039	2.0	0.0	2.0
+chr2	261042	1.0	1.0	2.0
+chr2	261045	0.0	1.0	1.0
+chr2	261046	1.0	0.0	1.0
+chr2	261047	0.0	5.0	5.0
+chr2	261048	0.0	1.0	1.0
+chr2	261050	4.0	0.0	4.0
+chr2	261056	0.0	2.0	2.0
+chr2	261066	0.0	3.0	3.0
+chr2	261067	3.0	0.0	3.0
+chr2	261068	3.0	0.0	3.0
+chr2	261070	1.0	0.0	1.0
+chr2	261071	1.0	1.0	2.0
+chr2	261075	2.0	0.0	2.0
+chr2	261076	1.0	0.0	1.0
+chr2	261078	0.0	2.0	2.0
+chr2	261079	0.0	1.0	1.0
+chr2	261087	2.0	0.0	2.0
+chr2	261088	8.0	0.0	8.0
+chr2	261092	0.0	2.0	2.0
+chr2	261094	0.0	2.0	2.0
+chr2	261096	2.0	0.0	2.0
+chr2	261104	1.0	1.0	2.0
+chr2	261105	0.0	3.0	3.0
+chr2	261106	0.0	1.0	1.0
+chr2	261107	1.0	0.0	1.0
+chr2	261109	1.0	0.0	1.0
+chr2	261110	0.0	1.0	1.0
+chr2	261111	0.0	1.0	1.0
+chr2	261114	1.0	0.0	1.0
+chr2	261115	4.0	0.0	4.0
+chr2	261116	3.0	2.0	5.0
+chr2	261117	1.0	0.0	1.0
+chr2	261120	0.0	1.0	1.0
+chr2	261122	2.0	0.0	2.0
+chr2	261125	0.0	2.0	2.0
+chr2	261128	1.0	1.0	2.0
+chr2	261131	0.0	1.0	1.0
+chr2	261132	0.0	1.0	1.0
+chr2	261145	1.0	0.0	1.0
+chr2	261146	0.0	1.0	1.0
+chr2	261147	0.0	1.0	1.0
+chr2	261149	1.0	1.0	2.0
+chr2	261162	2.0	0.0	2.0
+chr2	261165	1.0	0.0	1.0
+chr2	261196	1.0	0.0	1.0
+chr2	261197	0.0	1.0	1.0
+chr2	261198	0.0	1.0	1.0
+chr2	261199	0.0	1.0	1.0
+chr2	261202	2.0	0.0	2.0
+chr2	261203	1.0	0.0	1.0
+chr2	261205	2.0	0.0	2.0
+chr2	261208	1.0	0.0	1.0
+chr2	261212	0.0	4.0	4.0
+chr2	261213	0.0	1.0	1.0
+chr2	261218	1.0	0.0	1.0
+chr2	261219	1.0	1.0	2.0
+chr2	261222	1.0	0.0	1.0
+chr2	261228	4.0	5.0	9.0
+chr2	261231	1.0	1.0	2.0
+chr2	261235	0.0	1.0	1.0
+chr2	261238	1.0	0.0	1.0
+chr2	261239	1.0	0.0	1.0
+chr2	261241	0.0	2.0	2.0
+chr2	261244	1.0	4.0	5.0
+chr2	261245	0.0	1.0	1.0
+chr2	261246	1.0	0.0	1.0
+chr2	261258	1.0	0.0	1.0
+chr2	261263	0.0	2.0	2.0
+chr2	261266	0.0	1.0	1.0
+chr2	261267	3.0	0.0	3.0
+chr2	261271	0.0	1.0	1.0
+chr2	261278	1.0	0.0	1.0
+chr2	261279	0.0	2.0	2.0
+chr2	261288	0.0	2.0	2.0
+chr2	261290	1.0	0.0	1.0
+chr2	261302	1.0	0.0	1.0
+chr2	261322	1.0	0.0	1.0
+chr2	261325	0.0	1.0	1.0
+chr2	261330	0.0	1.0	1.0
+chr2	261358	1.0	0.0	1.0
+chr2	261378	0.0	1.0	1.0
+chr2	261379	0.0	1.0	1.0
+chr2	261396	0.0	1.0	1.0
+chr2	261398	0.0	1.0	1.0
+chr2	261401	0.0	1.0	1.0
+chr2	261412	0.0	1.0	1.0
+chr2	261413	1.0	0.0	1.0
+chr2	261414	1.0	0.0	1.0
+chr2	261415	0.0	1.0	1.0
+chr2	261421	1.0	1.0	2.0
+chr2	261422	1.0	1.0	2.0
+chr2	261423	0.0	1.0	1.0
+chr2	261429	1.0	0.0	1.0
+chr2	261431	1.0	0.0	1.0
+chr2	261432	0.0	1.0	1.0
+chr2	261435	1.0	0.0	1.0
+chr2	261436	2.0	0.0	2.0
+chr2	261437	3.0	0.0	3.0
+chr2	261441	0.0	1.0	1.0
+chr2	261442	1.0	0.0	1.0
+chr2	261450	0.0	3.0	3.0
+chr2	261454	1.0	0.0	1.0
+chr2	261462	0.0	1.0	1.0
+chr2	261467	0.0	4.0	4.0
+chr2	261487	0.0	1.0	1.0
+chr2	261491	0.0	1.0	1.0
+chr2	261511	3.0	0.0	3.0
+chr2	261512	1.0	0.0	1.0
+chr2	261516	0.0	1.0	1.0
+chr2	261517	0.0	1.0	1.0
+chr2	261522	1.0	0.0	1.0
+chr2	261535	0.0	1.0	1.0
+chr2	261552	3.0	0.0	3.0
+chr2	261557	0.0	1.0	1.0
+chr2	261559	0.0	1.0	1.0
+chr2	261568	0.0	1.0	1.0
+chr2	261569	0.0	1.0	1.0
+chr2	261572	1.0	0.0	1.0
+chr2	261576	0.0	1.0	1.0
+chr2	261577	1.0	0.0	1.0
+chr2	261582	1.0	1.0	2.0
+chr2	261590	1.0	0.0	1.0
+chr2	261610	1.0	3.0	4.0
+chr2	261619	1.0	0.0	1.0
+chr2	261622	0.0	1.0	1.0
+chr2	261636	0.0	1.0	1.0
+chr2	261641	1.0	0.0	1.0
+chr2	261649	0.0	1.0	1.0
+chr2	261656	0.0	2.0	2.0
+chr2	261659	0.0	1.0	1.0
+chr2	261665	0.0	1.0	1.0
+chr2	261674	1.0	0.0	1.0
+chr2	261689	1.0	0.0	1.0
+chr2	261690	0.0	3.0	3.0
+chr2	261708	2.0	0.0	2.0
+chr2	261718	14.0	0.0	14.0
+chr2	261719	1.0	0.0	1.0
+chr2	261720	1.0	0.0	1.0
+chr2	261724	3.0	1.0	4.0
+chr2	261730	1.0	0.0	1.0
+chr2	261734	0.0	1.0	1.0
+chr2	261744	0.0	2.0	2.0
+chr2	261749	0.0	1.0	1.0
+chr2	261761	0.0	1.0	1.0
+chr2	261765	1.0	0.0	1.0
+chr2	261775	1.0	0.0	1.0
+chr2	261777	0.0	1.0	1.0
+chr2	261783	0.0	1.0	1.0
+chr2	261789	1.0	0.0	1.0
+chr2	261796	1.0	0.0	1.0
+chr2	261806	1.0	0.0	1.0
+chr2	261808	0.0	2.0	2.0
+chr2	261815	1.0	0.0	1.0
+chr2	261818	0.0	2.0	2.0
+chr2	261839	1.0	0.0	1.0
+chr2	261845	0.0	6.0	6.0
+chr2	261849	3.0	0.0	3.0
+chr2	261858	2.0	0.0	2.0
+chr2	261863	1.0	0.0	1.0
+chr2	261865	1.0	0.0	1.0
+chr2	261871	1.0	0.0	1.0
+chr2	261883	1.0	0.0	1.0
+chr2	261893	0.0	2.0	2.0
+chr2	261896	1.0	0.0	1.0
+chr2	261900	0.0	1.0	1.0
+chr2	261901	0.0	1.0	1.0
+chr2	261913	1.0	0.0	1.0
+chr2	261924	1.0	0.0	1.0
+chr2	261926	1.0	0.0	1.0
+chr2	261938	0.0	1.0	1.0
+chr2	261946	0.0	1.0	1.0
+chr2	261948	2.0	0.0	2.0
+chr2	261952	1.0	0.0	1.0
+chr2	261954	0.0	3.0	3.0
+chr2	261959	3.0	0.0	3.0
+chr2	261982	0.0	1.0	1.0
+chr2	261985	0.0	4.0	4.0
+chr2	262008	2.0	0.0	2.0
+chr2	262009	1.0	0.0	1.0
+chr2	262013	2.0	0.0	2.0
+chr2	262014	1.0	0.0	1.0
+chr2	262016	1.0	1.0	2.0
+chr2	262017	0.0	1.0	1.0
+chr2	262020	0.0	1.0	1.0
+chr2	262029	1.0	0.0	1.0
+chr2	262030	2.0	0.0	2.0
+chr2	262047	0.0	1.0	1.0
+chr2	262049	1.0	0.0	1.0
+chr2	262052	2.0	0.0	2.0
+chr2	262057	0.0	1.0	1.0
+chr2	262058	0.0	2.0	2.0
+chr2	262063	1.0	0.0	1.0
+chr2	262068	1.0	0.0	1.0
+chr2	262069	0.0	1.0	1.0
+chr2	262071	2.0	0.0	2.0
+chr2	262078	4.0	0.0	4.0
+chr2	262108	1.0	0.0	1.0
+chr2	262109	0.0	1.0	1.0
+chr2	262111	1.0	0.0	1.0
+chr2	262126	0.0	3.0	3.0
+chr2	262138	1.0	0.0	1.0
+chr2	262144	1.0	0.0	1.0
+chr2	262148	0.0	1.0	1.0
+chr2	262168	1.0	0.0	1.0
+chr2	262170	1.0	0.0	1.0
+chr2	262173	2.0	0.0	2.0
+chr2	262184	0.0	2.0	2.0
+chr2	262191	0.0	1.0	1.0
+chr2	262199	1.0	0.0	1.0
+chr2	262200	0.0	1.0	1.0
+chr2	262206	1.0	2.0	3.0
+chr2	262211	1.0	0.0	1.0
+chr2	262212	1.0	0.0	1.0
+chr2	262217	1.0	0.0	1.0
+chr2	262218	1.0	0.0	1.0
+chr2	262221	1.0	0.0	1.0
+chr2	262223	0.0	1.0	1.0
+chr2	262233	0.0	1.0	1.0
+chr2	262276	2.0	0.0	2.0
+chr2	262281	0.0	2.0	2.0
+chr2	262305	1.0	0.0	1.0
+chr2	262328	0.0	2.0	2.0
+chr2	262342	0.0	2.0	2.0
+chr2	262364	1.0	0.0	1.0
+chr2	262365	0.0	1.0	1.0
+chr2	262374	0.0	1.0	1.0
+chr2	262376	0.0	1.0	1.0
+chr2	262382	1.0	0.0	1.0
+chr2	262383	2.0	0.0	2.0
+chr2	262384	0.0	1.0	1.0
+chr2	262386	0.0	1.0	1.0
+chr2	262387	1.0	0.0	1.0
+chr2	262388	0.0	3.0	3.0
+chr2	262389	1.0	0.0	1.0
+chr2	262390	1.0	1.0	2.0
+chr2	262393	0.0	1.0	1.0
+chr2	262394	1.0	0.0	1.0
+chr2	262398	1.0	0.0	1.0
+chr2	262401	0.0	1.0	1.0
+chr2	262403	1.0	1.0	2.0
+chr2	262411	0.0	1.0	1.0
+chr2	262427	2.0	0.0	2.0
+chr2	262429	1.0	0.0	1.0
+chr2	262440	0.0	1.0	1.0
+chr2	262446	0.0	2.0	2.0
+chr2	262448	1.0	0.0	1.0
+chr2	262454	0.0	1.0	1.0
+chr2	262455	2.0	0.0	2.0
+chr2	262464	1.0	0.0	1.0
+chr2	262472	1.0	0.0	1.0
+chr2	262477	0.0	1.0	1.0
+chr2	262483	1.0	0.0	1.0
+chr2	262488	0.0	1.0	1.0
+chr2	262493	2.0	0.0	2.0
+chr2	262494	0.0	1.0	1.0
+chr2	262530	0.0	2.0	2.0
+chr2	262532	2.0	0.0	2.0
+chr2	262533	0.0	1.0	1.0
+chr2	262543	0.0	1.0	1.0
+chr2	262547	0.0	2.0	2.0
+chr2	262563	0.0	3.0	3.0
+chr2	262573	1.0	0.0	1.0
+chr2	262582	0.0	1.0	1.0
+chr2	262584	0.0	1.0	1.0
+chr2	262586	0.0	1.0	1.0
+chr2	262590	0.0	1.0	1.0
+chr2	262600	1.0	0.0	1.0
+chr2	262601	0.0	1.0	1.0
+chr2	262604	2.0	0.0	2.0
+chr2	262642	1.0	0.0	1.0
+chr2	262643	1.0	0.0	1.0
+chr2	262664	1.0	0.0	1.0
+chr2	262683	0.0	1.0	1.0
+chr2	262687	0.0	1.0	1.0
+chr2	262701	0.0	3.0	3.0
+chr2	262703	0.0	1.0	1.0
+chr2	262704	0.0	1.0	1.0
+chr2	262710	0.0	1.0	1.0
+chr2	262712	1.0	0.0	1.0
+chr2	262728	0.0	2.0	2.0
+chr2	262735	0.0	1.0	1.0
+chr2	262750	0.0	1.0	1.0
+chr2	262753	0.0	1.0	1.0
+chr2	262762	1.0	0.0	1.0
+chr2	262772	1.0	0.0	1.0
+chr2	262779	0.0	1.0	1.0
+chr2	262784	1.0	0.0	1.0
+chr2	262803	0.0	1.0	1.0
+chr2	262811	1.0	0.0	1.0
+chr2	262818	0.0	1.0	1.0
+chr2	262824	0.0	2.0	2.0
+chr2	262830	1.0	0.0	1.0
+chr2	262851	0.0	1.0	1.0
+chr2	262852	0.0	2.0	2.0
+chr2	262856	0.0	2.0	2.0
+chr2	262857	0.0	2.0	2.0
+chr2	262904	0.0	1.0	1.0
+chr2	262906	1.0	0.0	1.0
+chr2	262923	0.0	2.0	2.0
+chr2	262926	1.0	0.0	1.0
+chr2	262954	0.0	1.0	1.0
+chr2	262959	0.0	1.0	1.0
+chr2	262963	0.0	1.0	1.0
+chr2	262974	1.0	0.0	1.0
+chr2	262976	1.0	3.0	4.0
+chr2	262980	0.0	2.0	2.0
+chr2	262989	1.0	0.0	1.0
+chr2	263007	0.0	2.0	2.0
+chr2	263012	1.0	0.0	1.0
+chr2	263015	2.0	0.0	2.0
+chr2	263034	1.0	0.0	1.0
+chr2	263058	0.0	1.0	1.0
+chr2	263061	0.0	1.0	1.0
+chr2	263062	0.0	1.0	1.0
+chr2	263084	0.0	1.0	1.0
+chr2	263093	0.0	1.0	1.0
+chr2	263100	1.0	0.0	1.0
+chr2	263113	2.0	0.0	2.0
+chr2	263130	0.0	1.0	1.0
+chr2	263146	0.0	2.0	2.0
+chr2	263171	0.0	1.0	1.0
+chr2	263180	1.0	0.0	1.0
+chr2	263181	1.0	0.0	1.0
+chr2	263225	0.0	1.0	1.0
+chr2	263266	0.0	1.0	1.0
+chr2	263275	0.0	1.0	1.0
+chr2	263311	0.0	1.0	1.0
+chr2	263313	1.0	1.0	2.0
+chr2	263318	1.0	0.0	1.0
+chr2	263326	2.0	0.0	2.0
+chr2	263328	1.0	0.0	1.0
+chr2	263341	1.0	0.0	1.0
+chr2	263342	0.0	1.0	1.0
+chr2	263362	1.0	0.0	1.0
+chr2	263390	1.0	0.0	1.0
+chr2	263423	1.0	0.0	1.0
+chr2	263445	0.0	1.0	1.0
+chr2	263452	1.0	0.0	1.0
+chr2	263460	1.0	0.0	1.0
+chr2	263469	0.0	1.0	1.0
+chr2	263472	2.0	0.0	2.0
+chr2	263473	0.0	1.0	1.0
+chr2	263496	0.0	1.0	1.0
+chr2	263501	1.0	0.0	1.0
+chr2	263517	1.0	1.0	2.0
+chr2	263540	0.0	1.0	1.0
+chr2	263558	1.0	0.0	1.0
+chr2	263564	0.0	1.0	1.0
+chr2	263576	0.0	1.0	1.0
+chr2	263582	1.0	0.0	1.0
+chr2	263584	0.0	1.0	1.0
+chr2	263591	1.0	0.0	1.0
+chr2	263603	1.0	0.0	1.0
+chr2	263607	0.0	1.0	1.0
+chr2	263608	0.0	1.0	1.0
+chr2	263620	1.0	0.0	1.0
+chr2	263637	0.0	1.0	1.0
+chr2	263655	0.0	1.0	1.0
+chr2	263685	1.0	0.0	1.0
+chr2	263694	1.0	0.0	1.0
+chr2	263707	1.0	0.0	1.0
+chr2	263711	1.0	0.0	1.0
+chr2	263752	1.0	0.0	1.0
+chr2	263753	0.0	1.0	1.0
+chr2	263760	1.0	0.0	1.0
+chr2	263768	0.0	2.0	2.0
+chr2	263771	1.0	0.0	1.0
+chr2	263773	0.0	1.0	1.0
+chr2	263787	2.0	0.0	2.0
+chr2	263797	1.0	0.0	1.0
+chr2	263799	0.0	1.0	1.0
+chr2	263802	0.0	3.0	3.0
+chr2	263809	0.0	1.0	1.0
+chr2	263812	1.0	0.0	1.0
+chr2	263820	0.0	2.0	2.0
+chr2	263821	1.0	0.0	1.0
+chr2	263822	1.0	0.0	1.0
+chr2	263829	1.0	0.0	1.0
+chr2	263832	0.0	1.0	1.0
+chr2	263838	2.0	0.0	2.0
+chr2	263839	1.0	0.0	1.0
+chr2	263840	1.0	0.0	1.0
+chr2	263849	1.0	0.0	1.0
+chr2	263851	1.0	0.0	1.0
+chr2	263906	1.0	0.0	1.0
+chr2	263934	1.0	0.0	1.0
+chr2	263942	0.0	1.0	1.0
+chr2	263954	0.0	1.0	1.0
+chr2	263971	0.0	1.0	1.0
+chr2	263977	2.0	0.0	2.0
+chr2	263987	1.0	0.0	1.0
+chr2	263995	0.0	1.0	1.0
+chr2	264028	1.0	0.0	1.0
+chr2	264029	1.0	0.0	1.0
+chr2	264030	1.0	0.0	1.0
+chr2	264038	0.0	2.0	2.0
+chr2	264052	2.0	0.0	2.0
+chr2	264055	1.0	0.0	1.0
+chr2	264056	1.0	1.0	2.0
+chr2	264061	1.0	0.0	1.0
+chr2	264074	0.0	5.0	5.0
+chr2	264077	0.0	1.0	1.0
+chr2	264081	0.0	1.0	1.0
+chr2	264086	0.0	2.0	2.0
+chr2	264094	1.0	0.0	1.0
+chr2	264106	0.0	1.0	1.0
+chr2	264152	0.0	1.0	1.0
+chr2	264154	0.0	1.0	1.0
+chr2	264157	1.0	0.0	1.0
+chr2	264161	1.0	0.0	1.0
+chr2	264164	1.0	0.0	1.0
+chr2	264174	0.0	1.0	1.0
+chr2	264290	0.0	1.0	1.0
+chr2	264305	0.0	1.0	1.0
+chr2	264325	1.0	0.0	1.0
+chr2	264330	2.0	0.0	2.0
+chr2	264340	1.0	0.0	1.0
+chr2	264341	0.0	1.0	1.0
+chr2	264342	1.0	0.0	1.0
+chr2	264365	0.0	1.0	1.0
+chr2	264368	1.0	0.0	1.0
+chr2	264378	0.0	1.0	1.0
+chr2	264381	1.0	0.0	1.0
+chr2	264385	0.0	1.0	1.0
+chr2	264397	1.0	0.0	1.0
+chr2	264403	0.0	1.0	1.0
+chr2	264410	1.0	0.0	1.0
+chr2	264415	0.0	1.0	1.0
+chr2	264416	0.0	1.0	1.0
+chr2	264417	1.0	0.0	1.0
+chr2	264420	1.0	0.0	1.0
+chr2	264425	0.0	1.0	1.0
+chr2	264429	0.0	1.0	1.0
+chr2	264432	1.0	0.0	1.0
+chr2	264433	1.0	0.0	1.0
+chr2	264456	0.0	1.0	1.0
+chr2	264471	2.0	0.0	2.0
+chr2	264490	1.0	0.0	1.0
+chr2	264497	0.0	1.0	1.0
+chr2	264537	1.0	0.0	1.0
+chr2	264563	0.0	1.0	1.0
+chr2	264564	1.0	0.0	1.0
+chr2	264603	0.0	1.0	1.0
+chr2	264613	1.0	0.0	1.0
+chr2	264652	1.0	0.0	1.0
+chr2	264663	0.0	1.0	1.0
+chr2	264684	0.0	1.0	1.0
+chr2	264717	3.0	0.0	3.0
+chr2	264719	1.0	0.0	1.0
+chr2	264762	0.0	1.0	1.0
+chr2	264766	1.0	0.0	1.0
+chr2	264767	1.0	0.0	1.0
+chr2	264769	0.0	1.0	1.0
+chr2	264770	0.0	1.0	1.0
+chr2	264781	2.0	0.0	2.0
+chr2	264782	1.0	0.0	1.0
+chr2	264794	0.0	1.0	1.0
+chr2	264795	1.0	0.0	1.0
+chr2	264825	1.0	0.0	1.0
+chr2	264840	0.0	1.0	1.0
+chr2	264853	3.0	0.0	3.0
+chr2	264862	1.0	0.0	1.0
+chr2	264868	0.0	2.0	2.0
+chr2	264870	0.0	1.0	1.0
+chr2	264871	0.0	1.0	1.0
+chr2	264988	1.0	0.0	1.0
+chr2	265011	1.0	0.0	1.0
+chr2	265039	1.0	0.0	1.0
+chr2	265040	0.0	1.0	1.0
+chr2	265061	1.0	0.0	1.0
+chr2	265066	0.0	2.0	2.0
+chr2	265070	1.0	0.0	1.0
+chr2	265088	2.0	0.0	2.0
+chr2	265091	0.0	1.0	1.0
+chr2	265094	0.0	1.0	1.0
+chr2	265115	0.0	1.0	1.0
+chr2	265137	0.0	1.0	1.0
+chr2	265187	0.0	1.0	1.0
+chr2	265195	0.0	1.0	1.0
+chr2	265198	0.0	1.0	1.0
+chr2	265199	0.0	1.0	1.0
+chr2	265200	0.0	1.0	1.0
+chr2	265209	0.0	2.0	2.0
+chr2	265211	0.0	3.0	3.0
+chr2	265214	0.0	1.0	1.0
+chr2	265222	0.0	2.0	2.0
+chr2	265223	0.0	1.0	1.0
+chr2	265226	0.0	4.0	4.0
+chr2	265227	0.0	4.0	4.0
+chr2	265232	0.0	1.0	1.0
+chr2	265234	9.0	0.0	9.0
+chr2	265235	0.0	1.0	1.0
+chr2	265237	1.0	1.0	2.0
+chr2	265238	0.0	2.0	2.0
+chr2	265239	0.0	1.0	1.0
+chr2	265240	0.0	1.0	1.0
+chr2	265245	2.0	0.0	2.0
+chr2	265246	0.0	1.0	1.0
+chr2	265248	1.0	2.0	3.0
+chr2	265251	2.0	0.0	2.0
+chr2	265255	1.0	0.0	1.0
+chr2	265256	0.0	1.0	1.0
+chr2	265259	0.0	2.0	2.0
+chr2	265260	0.0	1.0	1.0
+chr2	265266	0.0	2.0	2.0
+chr2	265269	0.0	1.0	1.0
+chr2	265273	0.0	1.0	1.0
+chr2	265276	0.0	1.0	1.0
+chr2	265280	1.0	0.0	1.0
+chr2	265283	0.0	2.0	2.0
+chr2	265284	0.0	1.0	1.0
+chr2	265285	1.0	1.0	2.0
+chr2	265288	1.0	0.0	1.0
+chr2	265290	2.0	0.0	2.0
+chr2	265291	0.0	2.0	2.0
+chr2	265295	1.0	0.0	1.0
+chr2	265296	1.0	0.0	1.0
+chr2	265297	1.0	0.0	1.0
+chr2	265298	1.0	0.0	1.0
+chr2	265299	1.0	0.0	1.0
+chr2	265307	1.0	1.0	2.0
+chr2	265312	0.0	1.0	1.0
+chr2	265313	2.0	2.0	4.0
+chr2	265317	0.0	2.0	2.0
+chr2	265318	0.0	1.0	1.0
+chr2	265319	0.0	2.0	2.0
+chr2	265323	1.0	0.0	1.0
+chr2	265325	2.0	0.0	2.0
+chr2	265335	0.0	1.0	1.0
+chr2	265339	0.0	3.0	3.0
+chr2	265341	0.0	2.0	2.0
+chr2	265342	0.0	5.0	5.0
+chr2	265350	0.0	1.0	1.0
+chr2	265351	0.0	1.0	1.0
+chr2	265352	0.0	1.0	1.0
+chr2	265357	1.0	0.0	1.0
+chr2	265363	0.0	1.0	1.0
+chr2	265369	0.0	1.0	1.0
+chr2	265373	1.0	0.0	1.0
+chr2	265380	2.0	0.0	2.0
+chr2	265381	2.0	0.0	2.0
+chr2	265388	1.0	0.0	1.0
+chr2	265396	0.0	1.0	1.0
+chr2	265399	1.0	1.0	2.0
+chr2	265400	1.0	0.0	1.0
+chr2	265401	3.0	0.0	3.0
+chr2	265409	2.0	0.0	2.0
+chr2	265410	0.0	2.0	2.0
+chr2	265415	1.0	0.0	1.0
+chr2	265417	1.0	0.0	1.0
+chr2	265421	1.0	0.0	1.0
+chr2	265425	1.0	0.0	1.0
+chr2	265427	1.0	0.0	1.0
+chr2	265429	1.0	0.0	1.0
+chr2	265430	1.0	0.0	1.0
+chr2	265431	1.0	0.0	1.0
+chr2	265433	1.0	0.0	1.0
+chr2	265434	1.0	0.0	1.0
+chr2	265438	1.0	0.0	1.0
+chr2	265441	1.0	0.0	1.0
+chr2	265442	11.0	0.0	11.0
+chr2	265443	3.0	0.0	3.0
+chr2	265445	1.0	0.0	1.0
+chr2	265446	3.0	0.0	3.0
+chr2	265454	1.0	0.0	1.0
+chr2	265460	2.0	0.0	2.0
+chr2	265466	3.0	0.0	3.0
+chr2	265467	2.0	0.0	2.0
+chr2	265714	0.0	1.0	1.0
+chr2	265811	0.0	1.0	1.0
+chr2	265828	0.0	1.0	1.0
+chr2	265831	1.0	0.0	1.0
+chr2	265843	1.0	0.0	1.0
+chr2	265848	0.0	1.0	1.0
+chr2	265865	0.0	1.0	1.0
+chr2	265866	2.0	1.0	3.0
+chr2	265983	0.0	1.0	1.0
+chr2	266001	0.0	1.0	1.0
+chr2	266012	1.0	0.0	1.0
+chr2	266014	0.0	3.0	3.0
+chr2	266018	0.0	1.0	1.0
+chr2	266020	1.0	0.0	1.0
+chr2	266022	2.0	0.0	2.0
+chr2	266036	2.0	2.0	4.0
+chr2	266037	0.0	1.0	1.0
+chr2	266038	1.0	0.0	1.0
+chr2	266043	0.0	1.0	1.0
+chr2	266044	0.0	1.0	1.0
+chr2	266055	0.0	1.0	1.0
+chr2	266056	1.0	0.0	1.0
+chr2	266058	0.0	1.0	1.0
+chr2	266080	1.0	0.0	1.0
+chr2	266582	0.0	1.0	1.0
+chr2	266739	1.0	0.0	1.0
+chr2	266755	0.0	2.0	2.0
+chr2	266878	0.0	1.0	1.0
+chr2	266935	0.0	1.0	1.0
+chr2	267072	0.0	1.0	1.0
+chr2	267138	0.0	1.0	1.0
+chr2	267171	0.0	4.0	4.0
+chr2	267178	1.0	0.0	1.0
+chr2	267183	2.0	0.0	2.0
+chr2	267317	0.0	1.0	1.0
+chr2	267318	0.0	1.0	1.0
+chr2	267351	1.0	0.0	1.0
+chr2	267459	0.0	1.0	1.0
+chr2	267494	0.0	1.0	1.0
+chr2	267789	1.0	0.0	1.0
+chr2	268011	1.0	0.0	1.0
+chr2	268191	1.0	0.0	1.0
+chr2	268355	1.0	0.0	1.0
+chr2	268457	0.0	1.0	1.0
+chr2	268470	1.0	0.0	1.0
+chr2	268985	1.0	0.0	1.0
+chr2	269052	1.0	0.0	1.0
+chr2	269079	1.0	0.0	1.0
+chr2	269191	1.0	0.0	1.0
+chr2	269229	0.0	1.0	1.0
+chr2	269236	2.0	0.0	2.0
+chr2	269330	0.0	1.0	1.0
+chr2	269332	1.0	0.0	1.0
+chr2	269344	0.0	1.0	1.0
+chr2	269370	1.0	0.0	1.0
+chr2	269380	1.0	0.0	1.0
+chr2	269383	0.0	1.0	1.0
+chr2	269391	0.0	1.0	1.0
+chr2	269396	0.0	3.0	3.0
+chr2	269398	0.0	1.0	1.0
+chr2	269406	0.0	1.0	1.0
+chr2	269427	1.0	0.0	1.0
+chr2	269472	0.0	1.0	1.0
+chr2	269542	0.0	1.0	1.0
+chr2	269546	1.0	0.0	1.0
+chr2	269553	1.0	0.0	1.0
+chr2	269556	0.0	1.0	1.0
+chr2	269562	0.0	1.0	1.0
+chr2	269564	1.0	0.0	1.0
+chr2	269565	0.0	1.0	1.0
+chr2	269569	2.0	0.0	2.0
+chr2	269579	0.0	1.0	1.0
+chr2	269588	1.0	0.0	1.0
+chr2	269596	1.0	0.0	1.0
+chr2	269602	1.0	0.0	1.0
+chr2	269823	1.0	0.0	1.0
+chr2	269827	0.0	2.0	2.0
+chr2	269828	0.0	1.0	1.0
+chr2	269843	3.0	0.0	3.0
+chr2	269844	1.0	0.0	1.0
+chr2	269846	1.0	0.0	1.0
+chr2	269855	1.0	0.0	1.0
+chr2	269860	0.0	2.0	2.0
+chr2	269902	1.0	0.0	1.0
+chr2	269904	0.0	1.0	1.0
+chr2	269960	0.0	1.0	1.0
+chr2	269982	1.0	0.0	1.0
+chr2	269997	0.0	1.0	1.0
+chr2	270022	1.0	0.0	1.0
+chr2	270027	1.0	0.0	1.0
+chr2	270237	0.0	2.0	2.0
+chr2	270245	1.0	0.0	1.0
+chr2	270252	1.0	0.0	1.0
+chr2	270259	0.0	1.0	1.0
+chr2	270260	4.0	0.0	4.0
+chr2	270272	0.0	2.0	2.0
+chr2	270281	0.0	1.0	1.0
+chr2	270372	0.0	1.0	1.0
+chr2	270390	0.0	1.0	1.0
+chr2	270395	1.0	0.0	1.0
+chr2	270416	2.0	0.0	2.0
+chr2	270417	0.0	1.0	1.0
+chr2	270431	0.0	1.0	1.0
+chr2	270432	0.0	1.0	1.0
+chr2	270484	0.0	1.0	1.0
+chr2	270552	1.0	0.0	1.0
+chr2	270571	0.0	1.0	1.0
+chr2	270576	0.0	1.0	1.0
+chr2	270582	6.0	0.0	6.0
+chr2	270586	0.0	1.0	1.0
+chr2	270591	0.0	2.0	2.0
+chr2	270602	1.0	0.0	1.0
+chr2	271118	0.0	1.0	1.0
+chr2	271137	1.0	0.0	1.0
+chr2	271183	0.0	1.0	1.0
+chr2	271235	1.0	0.0	1.0
+chr2	271292	1.0	0.0	1.0
+chr2	271351	0.0	1.0	1.0
+chr2	271531	1.0	0.0	1.0
+chr2	271669	0.0	1.0	1.0
+chr2	271926	1.0	0.0	1.0
+chr2	271989	0.0	1.0	1.0
+chr2	272526	1.0	0.0	1.0
+chr2	272628	1.0	0.0	1.0
+chr2	272805	1.0	0.0	1.0
+chr2	273099	1.0	0.0	1.0
+chr2	273234	0.0	1.0	1.0
+chr2	273390	0.0	1.0	1.0
+chr2	273532	1.0	0.0	1.0
+chr2	273536	0.0	1.0	1.0
+chr2	273537	0.0	2.0	2.0
+chr2	273553	1.0	0.0	1.0
+chr2	273561	0.0	1.0	1.0
+chr2	273680	0.0	2.0	2.0
+chr2	273682	0.0	1.0	1.0
+chr2	273686	0.0	1.0	1.0
+chr2	273687	0.0	1.0	1.0
+chr2	273690	0.0	4.0	4.0
+chr2	273691	1.0	1.0	2.0
+chr2	273692	1.0	0.0	1.0
+chr2	273694	1.0	1.0	2.0
+chr2	273695	0.0	2.0	2.0
+chr2	273700	0.0	1.0	1.0
+chr2	273701	1.0	0.0	1.0
+chr2	273702	5.0	0.0	5.0
+chr2	273703	0.0	1.0	1.0
+chr2	273704	0.0	1.0	1.0
+chr2	273708	0.0	1.0	1.0
+chr2	273711	3.0	0.0	3.0
+chr2	273715	0.0	3.0	3.0
+chr2	273719	1.0	0.0	1.0
+chr2	273721	0.0	2.0	2.0
+chr2	273722	1.0	0.0	1.0
+chr2	273729	2.0	0.0	2.0
+chr2	273968	0.0	1.0	1.0
+chr2	273989	0.0	1.0	1.0
+chr2	274004	1.0	0.0	1.0
+chr2	274006	1.0	0.0	1.0
+chr2	274017	0.0	1.0	1.0
+chr2	274019	0.0	1.0	1.0
+chr2	274522	1.0	0.0	1.0
+chr2	274560	1.0	0.0	1.0
+chr2	274621	1.0	0.0	1.0
+chr2	274681	1.0	0.0	1.0
+chr2	274727	1.0	0.0	1.0
+chr2	274805	0.0	1.0	1.0
+chr2	274967	0.0	1.0	1.0
+chr2	275024	2.0	0.0	2.0
+chr2	275048	0.0	1.0	1.0
+chr2	275066	0.0	1.0	1.0
+chr2	275106	1.0	0.0	1.0
+chr2	275119	1.0	0.0	1.0
+chr2	275145	1.0	0.0	1.0
+chr2	275219	1.0	0.0	1.0
+chr2	275223	0.0	1.0	1.0
+chr2	275247	1.0	0.0	1.0
+chr2	275252	0.0	1.0	1.0
+chr2	275261	1.0	0.0	1.0
+chr2	275306	0.0	1.0	1.0
+chr2	275380	0.0	1.0	1.0
+chr2	275389	0.0	1.0	1.0
+chr2	275391	0.0	1.0	1.0
+chr2	275394	2.0	0.0	2.0
+chr2	275397	0.0	3.0	3.0
+chr2	275398	0.0	1.0	1.0
+chr2	275403	0.0	1.0	1.0
+chr2	275404	0.0	1.0	1.0
+chr2	275406	1.0	0.0	1.0
+chr2	275408	0.0	1.0	1.0
+chr2	275409	1.0	1.0	2.0
+chr2	275418	1.0	0.0	1.0
+chr2	275427	0.0	2.0	2.0
+chr2	275428	0.0	1.0	1.0
+chr2	275430	0.0	1.0	1.0
+chr2	275434	0.0	1.0	1.0
+chr2	275437	0.0	2.0	2.0
+chr2	275438	2.0	0.0	2.0
+chr2	275442	1.0	0.0	1.0
+chr2	275446	0.0	2.0	2.0
+chr2	275455	3.0	0.0	3.0
+chr2	275566	0.0	1.0	1.0
+chr2	275587	1.0	0.0	1.0
+chr2	275594	0.0	2.0	2.0
+chr2	275607	0.0	1.0	1.0
+chr2	275609	0.0	1.0	1.0
+chr2	275610	0.0	1.0	1.0
+chr2	275614	1.0	0.0	1.0
+chr2	275627	0.0	1.0	1.0
+chr2	275632	1.0	0.0	1.0
+chr2	275641	0.0	2.0	2.0
+chr2	275653	0.0	1.0	1.0
+chr2	275656	1.0	0.0	1.0
+chr2	275663	0.0	1.0	1.0
+chr2	275825	0.0	1.0	1.0
+chr2	275828	1.0	0.0	1.0
+chr2	275846	0.0	1.0	1.0
+chr2	275854	2.0	0.0	2.0
+chr2	275855	2.0	1.0	3.0
+chr2	275870	0.0	1.0	1.0
+chr2	275934	0.0	1.0	1.0
+chr2	276000	0.0	1.0	1.0
+chr2	276016	1.0	0.0	1.0
+chr2	276019	1.0	0.0	1.0
+chr2	276021	0.0	1.0	1.0
+chr2	276039	0.0	2.0	2.0
+chr2	276041	1.0	0.0	1.0
+chr2	276043	1.0	0.0	1.0
+chr2	276055	0.0	2.0	2.0
+chr2	276061	1.0	0.0	1.0
+chr2	276198	0.0	1.0	1.0
+chr2	276339	1.0	0.0	1.0
+chr2	276350	0.0	2.0	2.0
+chr2	276490	0.0	1.0	1.0
+chr2	276491	1.0	0.0	1.0
+chr2	276497	2.0	0.0	2.0
+chr2	276507	0.0	2.0	2.0
+chr2	276508	1.0	0.0	1.0
+chr2	276511	1.0	0.0	1.0
+chr2	276514	1.0	0.0	1.0
+chr2	276515	3.0	0.0	3.0
+chr2	276520	0.0	2.0	2.0
+chr2	276521	1.0	0.0	1.0
+chr2	276525	0.0	1.0	1.0
+chr2	276527	1.0	0.0	1.0
+chr2	276530	1.0	0.0	1.0
+chr2	276532	2.0	0.0	2.0
+chr2	276536	1.0	0.0	1.0
+chr2	276540	0.0	1.0	1.0
+chr2	276548	1.0	1.0	2.0
+chr2	276557	0.0	1.0	1.0
+chr2	276570	1.0	0.0	1.0
+chr2	276655	1.0	0.0	1.0
+chr2	276695	1.0	0.0	1.0
+chr2	276765	0.0	1.0	1.0
+chr2	276778	1.0	0.0	1.0
+chr2	276779	2.0	0.0	2.0
+chr2	276788	0.0	1.0	1.0
+chr2	276790	1.0	2.0	3.0
+chr2	276796	1.0	0.0	1.0
+chr2	276797	0.0	2.0	2.0
+chr2	276802	0.0	6.0	6.0
+chr2	276803	0.0	2.0	2.0
+chr2	276805	2.0	3.0	5.0
+chr2	276807	0.0	3.0	3.0
+chr2	276808	0.0	3.0	3.0
+chr2	276809	0.0	2.0	2.0
+chr2	276811	1.0	0.0	1.0
+chr2	276812	2.0	0.0	2.0
+chr2	276814	1.0	0.0	1.0
+chr2	276816	2.0	0.0	2.0
+chr2	276819	1.0	0.0	1.0
+chr2	276820	2.0	1.0	3.0
+chr2	276821	2.0	3.0	5.0
+chr2	276823	0.0	1.0	1.0
+chr2	276828	1.0	0.0	1.0
+chr2	276832	2.0	0.0	2.0
+chr2	276833	2.0	2.0	4.0
+chr2	276834	0.0	1.0	1.0
+chr2	276840	0.0	1.0	1.0
+chr2	276844	0.0	2.0	2.0
+chr2	276860	1.0	0.0	1.0
+chr2	276957	0.0	1.0	1.0
+chr2	276963	1.0	0.0	1.0
+chr2	276977	0.0	2.0	2.0
+chr2	276995	1.0	0.0	1.0
+chr2	277109	0.0	1.0	1.0
+chr2	277137	1.0	0.0	1.0
+chr2	277138	1.0	0.0	1.0
+chr2	277162	1.0	0.0	1.0
+chr2	277163	1.0	0.0	1.0
+chr2	277174	0.0	1.0	1.0
+chr2	277289	0.0	1.0	1.0
+chr2	277307	1.0	0.0	1.0
+chr2	277323	1.0	0.0	1.0
+chr2	277368	0.0	1.0	1.0
+chr2	277375	1.0	0.0	1.0
+chr2	277557	1.0	0.0	1.0
+chr2	277759	0.0	2.0	2.0
+chr2	277906	1.0	0.0	1.0
+chr2	277993	1.0	0.0	1.0
+chr2	278168	0.0	1.0	1.0
+chr2	278789	0.0	1.0	1.0
+chr2	278791	0.0	3.0	3.0
+chr2	278792	0.0	1.0	1.0
+chr2	278798	1.0	0.0	1.0
+chr2	278799	1.0	0.0	1.0
+chr2	278800	0.0	3.0	3.0
+chr2	278801	0.0	2.0	2.0
+chr2	279496	0.0	1.0	1.0
+chr2	279531	1.0	0.0	1.0
+chr2	279637	0.0	1.0	1.0
+chr2	279671	1.0	0.0	1.0
+chr2	279857	0.0	1.0	1.0
+chr2	279860	0.0	1.0	1.0
+chr2	279889	0.0	1.0	1.0
+chr2	280232	0.0	4.0	4.0
+chr2	280494	0.0	1.0	1.0
+chr2	280508	0.0	1.0	1.0
+chr2	280521	0.0	2.0	2.0
+chr2	280833	0.0	1.0	1.0
+chr2	280855	1.0	0.0	1.0
+chr2	280858	1.0	0.0	1.0
+chr2	280870	0.0	1.0	1.0
+chr2	280871	1.0	0.0	1.0
+chr2	280872	1.0	1.0	2.0
+chr2	280883	1.0	0.0	1.0
+chr2	280891	0.0	1.0	1.0
+chr2	280894	0.0	1.0	1.0
+chr2	281334	1.0	0.0	1.0
+chr2	281339	1.0	0.0	1.0
+chr2	281348	0.0	1.0	1.0
+chr2	281356	0.0	1.0	1.0
+chr2	281471	1.0	0.0	1.0
+chr2	281480	0.0	1.0	1.0
+chr2	281684	0.0	1.0	1.0
+chr2	281689	1.0	0.0	1.0
+chr2	281816	1.0	0.0	1.0
+chr2	281846	1.0	0.0	1.0
+chr2	281870	1.0	0.0	1.0
+chr2	281871	1.0	0.0	1.0
+chr2	281971	2.0	0.0	2.0
+chr2	282011	0.0	1.0	1.0
+chr2	282062	1.0	0.0	1.0
+chr2	282145	0.0	1.0	1.0
+chr2	282157	0.0	1.0	1.0
+chr2	282165	1.0	0.0	1.0
+chr2	282172	0.0	1.0	1.0
+chr2	282196	1.0	0.0	1.0
+chr2	282206	0.0	1.0	1.0
+chr2	282313	0.0	2.0	2.0
+chr2	282328	1.0	0.0	1.0
+chr2	282400	1.0	0.0	1.0
+chr2	282482	0.0	1.0	1.0
+chr2	282574	0.0	1.0	1.0
+chr2	282617	0.0	1.0	1.0
+chr2	282698	0.0	1.0	1.0
+chr2	282733	0.0	1.0	1.0
+chr2	282748	2.0	0.0	2.0
+chr2	282936	1.0	0.0	1.0
+chr2	283091	0.0	1.0	1.0
+chr2	283301	1.0	0.0	1.0
+chr2	283308	0.0	1.0	1.0
+chr2	283317	0.0	1.0	1.0
+chr2	283468	0.0	1.0	1.0
+chr2	283481	0.0	1.0	1.0
+chr2	283498	0.0	1.0	1.0
+chr2	283619	0.0	1.0	1.0
+chr2	283621	0.0	1.0	1.0
+chr2	283628	1.0	0.0	1.0
+chr2	283640	0.0	1.0	1.0
+chr2	283695	0.0	1.0	1.0
+chr2	283697	1.0	0.0	1.0
+chr2	283698	0.0	1.0	1.0
+chr2	283712	0.0	1.0	1.0
+chr2	283713	0.0	2.0	2.0
+chr2	283725	1.0	0.0	1.0
+chr2	283732	0.0	2.0	2.0
+chr2	283763	0.0	1.0	1.0
+chr2	283784	0.0	1.0	1.0
+chr2	283791	0.0	1.0	1.0
+chr2	283807	0.0	1.0	1.0
+chr2	283809	0.0	1.0	1.0
+chr2	283810	0.0	1.0	1.0
+chr2	283812	1.0	0.0	1.0
+chr2	283814	1.0	0.0	1.0
+chr2	283828	0.0	1.0	1.0
+chr2	283833	0.0	1.0	1.0
+chr2	283842	0.0	1.0	1.0
+chr2	283861	1.0	0.0	1.0
+chr2	283863	1.0	1.0	2.0
+chr2	283876	1.0	0.0	1.0
+chr2	283880	2.0	0.0	2.0
+chr2	283886	0.0	1.0	1.0
+chr2	283889	1.0	1.0	2.0
+chr2	283896	0.0	1.0	1.0
+chr2	283906	1.0	0.0	1.0
+chr2	283917	0.0	2.0	2.0
+chr2	283922	1.0	0.0	1.0
+chr2	283948	0.0	1.0	1.0
+chr2	284101	0.0	1.0	1.0
+chr2	284111	1.0	0.0	1.0
+chr2	284116	0.0	1.0	1.0
+chr2	284119	1.0	0.0	1.0
+chr2	284152	0.0	1.0	1.0
+chr2	284177	0.0	1.0	1.0
+chr2	284183	1.0	0.0	1.0
+chr2	284214	1.0	0.0	1.0
+chr2	284504	1.0	0.0	1.0
+chr2	284700	1.0	0.0	1.0
+chr2	284987	1.0	0.0	1.0
+chr2	285167	1.0	0.0	1.0
+chr2	285283	2.0	0.0	2.0
+chr2	285402	0.0	1.0	1.0
+chr2	285643	1.0	0.0	1.0
+chr2	285747	1.0	0.0	1.0
+chr2	285880	2.0	0.0	2.0
+chr2	286155	0.0	1.0	1.0
+chr2	286265	1.0	0.0	1.0
+chr2	286911	0.0	1.0	1.0
+chr2	287123	1.0	0.0	1.0
+chr2	287355	1.0	0.0	1.0
+chr2	287492	0.0	1.0	1.0
+chr2	287536	1.0	0.0	1.0
+chr2	287647	1.0	0.0	1.0
+chr2	287651	1.0	0.0	1.0
+chr2	287691	0.0	1.0	1.0
+chr2	287693	0.0	1.0	1.0
+chr2	287700	0.0	1.0	1.0
+chr2	287822	0.0	1.0	1.0
+chr2	287832	0.0	1.0	1.0
+chr2	287851	1.0	1.0	2.0
+chr2	287852	0.0	1.0	1.0
+chr2	287856	0.0	2.0	2.0
+chr2	287864	1.0	0.0	1.0
+chr2	287865	3.0	0.0	3.0
+chr2	287866	1.0	0.0	1.0
+chr2	287877	1.0	0.0	1.0
+chr2	287896	0.0	1.0	1.0
+chr2	288007	0.0	1.0	1.0
+chr2	288010	0.0	3.0	3.0
+chr2	288013	1.0	0.0	1.0
+chr2	288016	0.0	2.0	2.0
+chr2	288017	0.0	2.0	2.0
+chr2	288022	0.0	2.0	2.0
+chr2	288024	3.0	0.0	3.0
+chr2	288025	2.0	0.0	2.0
+chr2	288027	5.0	0.0	5.0
+chr2	288029	2.0	0.0	2.0
+chr2	288037	3.0	1.0	4.0
+chr2	288038	0.0	1.0	1.0
+chr2	288042	0.0	1.0	1.0
+chr2	288048	0.0	2.0	2.0
+chr2	288054	1.0	1.0	2.0
+chr2	288265	0.0	1.0	1.0
+chr2	288281	0.0	2.0	2.0
+chr2	288282	0.0	2.0	2.0
+chr2	288287	4.0	0.0	4.0
+chr2	288289	1.0	0.0	1.0
+chr2	288297	0.0	1.0	1.0
+chr2	288299	1.0	0.0	1.0
+chr2	288300	2.0	0.0	2.0
+chr2	288313	2.0	0.0	2.0
+chr2	288317	2.0	3.0	5.0
+chr2	288318	0.0	1.0	1.0
+chr2	288319	2.0	0.0	2.0
+chr2	288320	1.0	0.0	1.0
+chr2	288324	1.0	0.0	1.0
+chr2	288326	0.0	1.0	1.0
+chr2	288339	0.0	1.0	1.0
+chr2	288340	0.0	2.0	2.0
+chr2	288344	1.0	0.0	1.0
+chr2	288434	1.0	0.0	1.0
+chr2	288439	2.0	0.0	2.0
+chr2	288453	2.0	0.0	2.0
+chr2	288457	0.0	2.0	2.0
+chr2	288469	1.0	0.0	1.0
+chr2	288474	1.0	0.0	1.0
+chr2	288489	0.0	1.0	1.0
+chr2	288498	0.0	1.0	1.0
+chr2	288504	1.0	0.0	1.0
+chr2	288567	1.0	0.0	1.0
+chr2	288672	0.0	1.0	1.0
+chr2	288679	2.0	0.0	2.0
+chr2	288681	2.0	0.0	2.0
+chr2	288683	0.0	1.0	1.0
+chr2	288698	0.0	1.0	1.0
+chr2	288700	0.0	1.0	1.0
+chr2	288722	1.0	0.0	1.0
+chr2	288810	1.0	0.0	1.0
+chr2	288836	1.0	0.0	1.0
+chr2	288857	0.0	1.0	1.0
+chr2	288867	1.0	0.0	1.0
+chr2	288888	0.0	1.0	1.0
+chr2	288976	1.0	0.0	1.0
+chr2	288989	1.0	0.0	1.0
+chr2	288994	1.0	0.0	1.0
+chr2	289036	0.0	1.0	1.0
+chr2	289085	1.0	0.0	1.0
+chr2	289093	0.0	1.0	1.0
+chr2	289108	1.0	0.0	1.0
+chr2	289109	1.0	2.0	3.0
+chr2	289115	0.0	1.0	1.0
+chr2	289118	0.0	1.0	1.0
+chr2	289119	0.0	1.0	1.0
+chr2	289122	0.0	1.0	1.0
+chr2	289127	0.0	1.0	1.0
+chr2	289129	4.0	0.0	4.0
+chr2	289130	4.0	0.0	4.0
+chr2	289131	5.0	0.0	5.0
+chr2	289132	1.0	0.0	1.0
+chr2	289137	0.0	8.0	8.0
+chr2	289138	2.0	2.0	4.0
+chr2	289139	0.0	1.0	1.0
+chr2	289141	1.0	2.0	3.0
+chr2	289142	0.0	1.0	1.0
+chr2	289146	0.0	1.0	1.0
+chr2	289147	1.0	0.0	1.0
+chr2	289148	1.0	1.0	2.0
+chr2	289149	0.0	4.0	4.0
+chr2	289150	2.0	0.0	2.0
+chr2	289151	1.0	0.0	1.0
+chr2	289152	0.0	1.0	1.0
+chr2	289153	4.0	0.0	4.0
+chr2	289154	9.0	0.0	9.0
+chr2	289155	0.0	7.0	7.0
+chr2	289156	0.0	1.0	1.0
+chr2	289157	1.0	0.0	1.0
+chr2	289160	0.0	8.0	8.0
+chr2	289161	0.0	2.0	2.0
+chr2	289162	0.0	2.0	2.0
+chr2	289165	0.0	1.0	1.0
+chr2	289166	1.0	0.0	1.0
+chr2	289194	0.0	2.0	2.0
+chr2	289197	0.0	1.0	1.0
+chr2	289364	0.0	1.0	1.0
+chr2	289368	0.0	2.0	2.0
+chr2	289369	0.0	4.0	4.0
+chr2	289373	1.0	0.0	1.0
+chr2	289375	0.0	1.0	1.0
+chr2	289378	1.0	5.0	6.0
+chr2	289380	2.0	0.0	2.0
+chr2	289381	4.0	0.0	4.0
+chr2	289389	0.0	2.0	2.0
+chr2	289390	0.0	1.0	1.0
+chr2	289391	0.0	1.0	1.0
+chr2	289393	0.0	1.0	1.0
+chr2	289398	0.0	1.0	1.0
+chr2	289401	1.0	0.0	1.0
+chr2	289404	0.0	1.0	1.0
+chr2	289409	0.0	3.0	3.0
+chr2	289426	2.0	0.0	2.0
+chr2	289550	0.0	1.0	1.0
+chr2	289556	1.0	2.0	3.0
+chr2	289560	1.0	1.0	2.0
+chr2	289562	2.0	0.0	2.0
+chr2	289565	1.0	0.0	1.0
+chr2	289566	0.0	2.0	2.0
+chr2	289570	0.0	1.0	1.0
+chr2	289578	0.0	1.0	1.0
+chr2	289583	1.0	0.0	1.0
+chr2	289606	0.0	1.0	1.0
+chr2	289609	0.0	1.0	1.0
+chr2	289708	0.0	1.0	1.0
+chr2	289712	1.0	0.0	1.0
+chr2	289780	1.0	0.0	1.0
+chr2	289861	0.0	1.0	1.0
+chr2	289871	0.0	1.0	1.0
+chr2	289877	0.0	1.0	1.0
+chr2	289880	1.0	0.0	1.0
+chr2	289903	0.0	1.0	1.0
+chr2	289970	0.0	1.0	1.0
+chr2	289994	1.0	0.0	1.0
+chr2	290031	1.0	0.0	1.0
+chr2	290033	0.0	1.0	1.0
+chr2	290042	1.0	0.0	1.0
+chr2	290058	0.0	1.0	1.0
+chr2	290080	1.0	0.0	1.0
+chr2	290133	0.0	1.0	1.0
+chr2	290167	0.0	2.0	2.0
+chr2	290178	0.0	1.0	1.0
+chr2	290190	0.0	1.0	1.0
+chr2	290191	1.0	1.0	2.0
+chr2	290199	0.0	1.0	1.0
+chr2	290202	1.0	0.0	1.0
+chr2	290205	0.0	1.0	1.0
+chr2	290208	1.0	0.0	1.0
+chr2	290219	1.0	0.0	1.0
+chr2	290224	1.0	0.0	1.0
+chr2	290240	0.0	2.0	2.0
+chr2	290241	0.0	2.0	2.0
+chr2	290259	1.0	0.0	1.0
+chr2	290290	0.0	2.0	2.0
+chr2	290292	2.0	0.0	2.0
+chr2	290294	1.0	0.0	1.0
+chr2	290300	0.0	1.0	1.0
+chr2	290309	0.0	1.0	1.0
+chr2	290310	1.0	0.0	1.0
+chr2	290570	0.0	1.0	1.0
+chr2	290581	2.0	0.0	2.0
+chr2	290718	1.0	0.0	1.0
+chr2	290759	1.0	0.0	1.0
+chr2	290874	0.0	1.0	1.0
+chr2	291025	1.0	0.0	1.0
+chr2	291407	0.0	1.0	1.0
+chr2	291431	0.0	1.0	1.0
+chr2	291557	0.0	1.0	1.0
+chr2	291575	0.0	1.0	1.0
+chr2	291601	0.0	1.0	1.0
+chr2	291978	0.0	1.0	1.0
+chr2	292206	1.0	0.0	1.0
+chr2	292238	2.0	0.0	2.0
+chr2	292261	0.0	1.0	1.0
+chr2	292264	0.0	1.0	1.0
+chr2	292269	1.0	0.0	1.0
+chr2	292271	0.0	1.0	1.0
+chr2	292277	0.0	1.0	1.0
+chr2	292279	0.0	1.0	1.0
+chr2	292288	1.0	0.0	1.0
+chr2	292316	1.0	0.0	1.0
+chr2	292328	1.0	0.0	1.0
+chr2	292491	1.0	0.0	1.0
+chr2	292506	0.0	1.0	1.0
+chr2	292508	1.0	0.0	1.0
+chr2	292516	2.0	0.0	2.0
+chr2	292520	0.0	1.0	1.0
+chr2	292521	0.0	1.0	1.0
+chr2	292526	1.0	2.0	3.0
+chr2	292527	4.0	0.0	4.0
+chr2	292536	0.0	3.0	3.0
+chr2	292538	4.0	0.0	4.0
+chr2	292543	1.0	0.0	1.0
+chr2	292544	5.0	0.0	5.0
+chr2	292547	0.0	1.0	1.0
+chr2	292548	0.0	1.0	1.0
+chr2	292564	1.0	0.0	1.0
+chr2	292682	0.0	1.0	1.0
+chr2	292686	0.0	1.0	1.0
+chr2	292697	0.0	2.0	2.0
+chr2	292698	0.0	1.0	1.0
+chr2	292700	0.0	1.0	1.0
+chr2	292704	0.0	1.0	1.0
+chr2	292711	1.0	0.0	1.0
+chr2	292712	1.0	0.0	1.0
+chr2	292765	1.0	0.0	1.0
+chr2	292789	1.0	0.0	1.0
+chr2	292864	0.0	1.0	1.0
+chr2	292971	1.0	0.0	1.0
+chr2	293054	0.0	1.0	1.0
+chr2	293105	2.0	0.0	2.0
+chr2	293192	0.0	1.0	1.0
+chr2	293441	0.0	1.0	1.0
+chr2	293575	0.0	1.0	1.0
+chr2	293700	0.0	1.0	1.0
+chr2	293704	1.0	0.0	1.0
+chr2	293706	0.0	1.0	1.0
+chr2	293712	1.0	0.0	1.0
+chr2	293719	3.0	0.0	3.0
+chr2	293784	0.0	1.0	1.0
+chr2	293850	0.0	1.0	1.0
+chr2	293878	1.0	0.0	1.0
+chr2	293998	1.0	0.0	1.0
+chr2	294010	3.0	0.0	3.0
+chr2	294015	2.0	1.0	3.0
+chr2	294020	1.0	0.0	1.0
+chr2	294021	0.0	1.0	1.0
+chr2	294023	1.0	0.0	1.0
+chr2	294025	1.0	0.0	1.0
+chr2	294029	0.0	1.0	1.0
+chr2	294031	0.0	1.0	1.0
+chr2	294032	0.0	2.0	2.0
+chr2	294033	0.0	1.0	1.0
+chr2	294034	1.0	0.0	1.0
+chr2	294035	1.0	0.0	1.0
+chr2	294045	0.0	1.0	1.0
+chr2	294054	1.0	0.0	1.0
+chr2	294063	0.0	1.0	1.0
+chr2	294065	0.0	1.0	1.0
+chr2	294074	0.0	1.0	1.0
+chr2	294082	0.0	1.0	1.0
+chr2	294083	0.0	1.0	1.0
+chr2	294090	0.0	3.0	3.0
+chr2	294116	0.0	1.0	1.0
+chr2	294141	1.0	0.0	1.0
+chr2	294220	1.0	0.0	1.0
+chr2	294450	0.0	1.0	1.0
+chr2	294456	1.0	0.0	1.0
+chr2	294473	2.0	0.0	2.0
+chr2	294589	0.0	1.0	1.0
+chr2	294634	1.0	0.0	1.0
+chr2	294793	0.0	1.0	1.0
+chr2	295119	1.0	0.0	1.0
+chr2	295416	1.0	0.0	1.0
+chr2	295583	0.0	1.0	1.0
+chr2	295699	1.0	0.0	1.0
+chr2	295853	0.0	1.0	1.0
+chr2	295854	0.0	2.0	2.0
+chr2	295859	1.0	0.0	1.0
+chr2	295861	0.0	1.0	1.0
+chr2	295864	0.0	1.0	1.0
+chr2	295869	1.0	0.0	1.0
+chr2	295871	1.0	0.0	1.0
+chr2	295874	0.0	1.0	1.0
+chr2	295889	1.0	0.0	1.0
+chr2	295958	0.0	1.0	1.0
+chr2	295969	0.0	1.0	1.0
+chr2	296007	0.0	1.0	1.0
+chr2	296008	0.0	1.0	1.0
+chr2	296010	0.0	1.0	1.0
+chr2	296011	0.0	1.0	1.0
+chr2	296012	1.0	0.0	1.0
+chr2	296013	0.0	1.0	1.0
+chr2	296015	2.0	1.0	3.0
+chr2	296017	0.0	2.0	2.0
+chr2	296019	1.0	0.0	1.0
+chr2	296021	1.0	0.0	1.0
+chr2	296023	1.0	0.0	1.0
+chr2	296028	1.0	0.0	1.0
+chr2	296029	6.0	0.0	6.0
+chr2	296034	0.0	1.0	1.0
+chr2	296036	0.0	1.0	1.0
+chr2	296042	0.0	1.0	1.0
+chr2	296047	1.0	0.0	1.0
+chr2	296048	0.0	1.0	1.0
+chr2	296049	0.0	1.0	1.0
+chr2	296061	1.0	0.0	1.0
+chr2	296069	0.0	1.0	1.0
+chr2	296070	0.0	1.0	1.0
+chr2	296071	0.0	1.0	1.0
+chr2	296078	2.0	0.0	2.0
+chr2	296084	0.0	1.0	1.0
+chr2	296533	1.0	0.0	1.0
+chr2	296760	0.0	1.0	1.0
+chr2	296937	1.0	0.0	1.0
+chr2	297311	1.0	0.0	1.0
+chr2	297455	1.0	0.0	1.0
+chr2	297606	1.0	0.0	1.0
+chr2	297609	1.0	0.0	1.0
+chr2	297611	1.0	0.0	1.0
+chr2	297616	1.0	0.0	1.0
+chr2	297622	0.0	1.0	1.0
+chr2	297634	1.0	0.0	1.0
+chr2	297644	0.0	1.0	1.0
+chr2	297724	0.0	1.0	1.0
+chr2	297762	0.0	1.0	1.0
+chr2	297769	1.0	0.0	1.0
+chr2	297770	1.0	0.0	1.0
+chr2	297772	1.0	1.0	2.0
+chr2	297782	1.0	2.0	3.0
+chr2	297783	1.0	0.0	1.0
+chr2	297787	1.0	0.0	1.0
+chr2	297793	0.0	3.0	3.0
+chr2	297797	2.0	3.0	5.0
+chr2	297801	2.0	0.0	2.0
+chr2	297805	1.0	0.0	1.0
+chr2	297846	1.0	0.0	1.0
+chr2	297872	1.0	0.0	1.0
+chr2	297991	0.0	1.0	1.0
+chr2	298021	1.0	0.0	1.0
+chr2	298025	1.0	0.0	1.0
+chr2	298028	0.0	1.0	1.0
+chr2	298031	0.0	2.0	2.0
+chr2	298032	1.0	0.0	1.0
+chr2	298037	1.0	0.0	1.0
+chr2	298056	3.0	0.0	3.0
+chr2	298060	1.0	0.0	1.0
+chr2	298063	0.0	2.0	2.0
+chr2	298064	0.0	1.0	1.0
+chr2	298069	1.0	0.0	1.0
+chr2	298071	0.0	1.0	1.0
+chr2	298075	0.0	1.0	1.0
+chr2	298094	1.0	2.0	3.0
+chr2	298095	1.0	0.0	1.0
+chr2	298118	1.0	0.0	1.0
+chr2	298247	0.0	1.0	1.0
+chr2	298248	1.0	0.0	1.0
+chr2	298258	0.0	2.0	2.0
+chr2	298261	0.0	2.0	2.0
+chr2	298270	0.0	1.0	1.0
+chr2	298278	4.0	0.0	4.0
+chr2	298285	0.0	1.0	1.0
+chr2	298286	0.0	1.0	1.0
+chr2	298292	1.0	1.0	2.0
+chr2	298308	1.0	0.0	1.0
+chr2	298384	1.0	0.0	1.0
+chr2	298432	0.0	1.0	1.0
+chr2	298454	2.0	0.0	2.0
+chr2	298457	1.0	0.0	1.0
+chr2	298462	1.0	0.0	1.0
+chr2	298731	2.0	0.0	2.0
+chr2	298734	0.0	1.0	1.0
+chr2	298752	0.0	1.0	1.0
+chr2	299107	0.0	2.0	2.0
+chr2	299201	0.0	2.0	2.0
+chr2	299372	0.0	1.0	1.0
+chr2	299531	0.0	1.0	1.0
+chr2	299534	1.0	2.0	3.0
+chr2	299624	1.0	0.0	1.0
+chr2	299638	0.0	1.0	1.0
+chr2	299658	0.0	1.0	1.0
+chr2	299840	0.0	3.0	3.0
+chr2	299848	4.0	0.0	4.0
+chr2	299849	2.0	0.0	2.0
+chr2	299850	1.0	0.0	1.0
+chr2	299851	0.0	1.0	1.0
+chr2	299854	1.0	0.0	1.0
+chr2	299856	2.0	0.0	2.0
+chr2	299857	0.0	1.0	1.0
+chr2	299859	0.0	1.0	1.0
+chr2	299863	0.0	3.0	3.0
+chr2	299864	1.0	0.0	1.0
+chr2	299870	0.0	3.0	3.0
+chr2	299871	1.0	3.0	4.0
+chr2	299875	0.0	2.0	2.0
+chr2	299876	0.0	1.0	1.0
+chr2	299877	0.0	1.0	1.0
+chr2	299884	1.0	0.0	1.0
+chr2	300152	1.0	0.0	1.0
+chr2	300155	0.0	1.0	1.0
+chr2	300160	3.0	0.0	3.0
+chr2	300164	1.0	0.0	1.0
+chr2	300165	1.0	0.0	1.0
+chr2	300169	0.0	2.0	2.0
+chr2	300179	0.0	9.0	9.0
+chr2	300183	1.0	0.0	1.0
+chr2	300268	0.0	2.0	2.0
+chr2	300317	0.0	2.0	2.0
+chr2	300336	0.0	1.0	1.0
+chr2	300350	0.0	1.0	1.0
+chr2	300419	0.0	1.0	1.0
+chr2	300498	1.0	0.0	1.0
+chr2	300517	0.0	2.0	2.0
+chr2	300692	0.0	1.0	1.0
+chr2	300824	1.0	0.0	1.0
+chr2	300970	0.0	1.0	1.0
+chr2	301109	0.0	1.0	1.0
+chr2	301532	1.0	0.0	1.0
+chr2	301539	0.0	1.0	1.0
+chr2	301552	0.0	1.0	1.0
+chr2	301563	0.0	1.0	1.0
+chr2	301590	0.0	1.0	1.0
+chr2	301815	1.0	0.0	1.0
+chr2	301819	0.0	1.0	1.0
+chr2	301828	1.0	0.0	1.0
+chr2	301832	1.0	0.0	1.0
+chr2	301833	0.0	1.0	1.0
+chr2	301837	1.0	0.0	1.0
+chr2	301838	1.0	0.0	1.0
+chr2	301839	2.0	0.0	2.0
+chr2	301840	0.0	6.0	6.0
+chr2	301849	2.0	0.0	2.0
+chr2	301851	0.0	1.0	1.0
+chr2	301932	1.0	0.0	1.0
+chr2	302018	1.0	2.0	3.0
+chr2	302021	0.0	1.0	1.0
+chr2	302044	0.0	1.0	1.0
+chr2	302161	0.0	1.0	1.0
+chr2	302176	0.0	1.0	1.0
+chr2	302206	1.0	0.0	1.0
+chr2	302281	1.0	0.0	1.0
+chr2	302349	0.0	1.0	1.0
+chr2	302355	1.0	0.0	1.0
+chr2	302358	1.0	0.0	1.0
+chr2	302550	0.0	1.0	1.0
+chr2	302722	1.0	0.0	1.0
+chr2	302911	0.0	1.0	1.0
+chr2	302961	0.0	1.0	1.0
+chr2	303003	0.0	1.0	1.0
+chr2	303006	1.0	0.0	1.0
+chr2	303064	0.0	1.0	1.0
+chr2	303304	0.0	1.0	1.0
+chr2	303594	1.0	0.0	1.0
+chr2	303599	1.0	0.0	1.0
+chr2	303627	0.0	1.0	1.0
+chr2	303635	1.0	0.0	1.0
+chr2	303688	0.0	1.0	1.0
+chr2	303834	0.0	1.0	1.0
+chr2	303872	0.0	1.0	1.0
+chr2	303876	1.0	0.0	1.0
+chr2	303883	1.0	1.0	2.0
+chr2	303891	1.0	0.0	1.0
+chr2	303893	2.0	0.0	2.0
+chr2	303903	0.0	1.0	1.0
+chr2	304019	1.0	0.0	1.0
+chr2	304055	1.0	0.0	1.0
+chr2	304059	1.0	0.0	1.0
+chr2	304068	1.0	0.0	1.0
+chr2	304087	1.0	0.0	1.0
+chr2	304159	0.0	1.0	1.0
+chr2	304241	0.0	1.0	1.0
+chr2	304270	0.0	1.0	1.0
+chr2	304275	0.0	1.0	1.0
+chr2	304312	0.0	1.0	1.0
+chr2	304362	0.0	1.0	1.0
+chr2	304398	1.0	0.0	1.0
+chr2	304430	1.0	2.0	3.0
+chr2	304434	0.0	1.0	1.0
+chr2	304447	1.0	0.0	1.0
+chr2	304464	5.0	2.0	7.0
+chr2	304471	0.0	4.0	4.0
+chr2	304474	1.0	0.0	1.0
+chr2	304475	1.0	0.0	1.0
+chr2	304481	0.0	1.0	1.0
+chr2	304484	0.0	1.0	1.0
+chr2	304497	1.0	0.0	1.0
+chr2	304550	1.0	0.0	1.0
+chr2	305046	1.0	0.0	1.0
+chr2	305119	0.0	1.0	1.0
+chr2	305237	1.0	0.0	1.0
+chr2	305329	1.0	0.0	1.0
+chr2	305336	0.0	1.0	1.0
+chr2	305655	1.0	0.0	1.0
+chr2	305767	0.0	1.0	1.0
+chr2	305772	0.0	1.0	1.0
+chr2	305799	1.0	0.0	1.0
+chr2	305814	0.0	1.0	1.0
+chr2	305937	1.0	0.0	1.0
+chr2	305953	0.0	2.0	2.0
+chr2	305957	1.0	1.0	2.0
+chr2	305964	0.0	1.0	1.0
+chr2	305967	1.0	0.0	1.0
+chr2	305972	0.0	1.0	1.0
+chr2	305974	0.0	1.0	1.0
+chr2	305975	0.0	1.0	1.0
+chr2	305983	1.0	0.0	1.0
+chr2	306280	0.0	1.0	1.0
+chr2	306295	0.0	2.0	2.0
+chr2	306296	0.0	1.0	1.0
+chr2	306297	0.0	1.0	1.0
+chr2	306298	1.0	0.0	1.0
+chr2	306307	0.0	1.0	1.0
+chr2	306308	2.0	0.0	2.0
+chr2	306309	3.0	0.0	3.0
+chr2	306311	0.0	3.0	3.0
+chr2	306315	0.0	2.0	2.0
+chr2	306320	3.0	0.0	3.0
+chr2	306327	0.0	2.0	2.0
+chr2	306339	1.0	0.0	1.0
+chr2	306347	0.0	1.0	1.0
+chr2	306349	0.0	1.0	1.0
+chr2	306365	1.0	0.0	1.0
+chr2	306444	1.0	0.0	1.0
+chr2	306596	0.0	1.0	1.0
+chr2	306600	0.0	1.0	1.0
+chr2	306616	0.0	1.0	1.0
+chr2	306617	1.0	0.0	1.0
+chr2	306618	0.0	1.0	1.0
+chr2	306620	2.0	0.0	2.0
+chr2	306624	1.0	0.0	1.0
+chr2	306650	0.0	1.0	1.0
+chr2	306767	2.0	0.0	2.0
+chr2	306771	1.0	0.0	1.0
+chr2	306775	1.0	0.0	1.0
+chr2	306776	0.0	1.0	1.0
+chr2	306787	0.0	1.0	1.0
+chr2	306909	0.0	1.0	1.0
+chr2	306919	1.0	0.0	1.0
+chr2	306924	3.0	0.0	3.0
+chr2	306926	0.0	1.0	1.0
+chr2	306928	1.0	0.0	1.0
+chr2	306930	0.0	2.0	2.0
+chr2	306931	1.0	0.0	1.0
+chr2	306937	2.0	0.0	2.0
+chr2	306940	1.0	0.0	1.0
+chr2	306942	0.0	3.0	3.0
+chr2	306944	1.0	0.0	1.0
+chr2	306945	1.0	0.0	1.0
+chr2	306947	0.0	1.0	1.0
+chr2	306950	1.0	5.0	6.0
+chr2	306951	0.0	3.0	3.0
+chr2	306954	2.0	0.0	2.0
+chr2	306961	1.0	0.0	1.0
+chr2	306963	1.0	0.0	1.0
+chr2	306964	1.0	0.0	1.0
+chr2	306970	1.0	0.0	1.0
+chr2	306979	1.0	0.0	1.0
+chr2	307140	0.0	1.0	1.0
+chr2	307179	1.0	0.0	1.0
+chr2	307280	0.0	1.0	1.0
+chr2	307289	2.0	0.0	2.0
+chr2	307298	1.0	0.0	1.0
+chr2	307299	2.0	0.0	2.0
+chr2	307304	1.0	0.0	1.0
+chr2	307308	0.0	1.0	1.0
+chr2	307325	1.0	0.0	1.0
+chr2	307547	1.0	0.0	1.0
+chr2	307598	1.0	0.0	1.0
+chr2	307604	0.0	1.0	1.0
+chr2	307607	1.0	1.0	2.0
+chr2	307611	0.0	1.0	1.0
+chr2	307618	1.0	0.0	1.0
+chr2	307622	0.0	1.0	1.0
+chr2	307726	0.0	1.0	1.0
+chr2	307740	1.0	0.0	1.0
+chr2	307777	2.0	0.0	2.0
+chr2	307786	0.0	1.0	1.0
+chr2	307793	0.0	1.0	1.0
+chr2	307795	0.0	1.0	1.0
+chr2	307796	0.0	1.0	1.0
+chr2	307797	0.0	1.0	1.0
+chr2	308010	1.0	0.0	1.0
+chr2	308045	0.0	1.0	1.0
+chr2	308411	0.0	1.0	1.0
+chr2	308471	1.0	0.0	1.0
+chr2	308619	1.0	0.0	1.0
+chr2	308649	0.0	1.0	1.0
+chr2	308673	0.0	1.0	1.0
+chr2	308675	0.0	1.0	1.0
+chr2	309237	0.0	1.0	1.0
+chr2	309577	1.0	0.0	1.0
+chr2	309672	0.0	2.0	2.0
+chr2	309673	1.0	0.0	1.0
+chr2	309682	0.0	1.0	1.0
+chr2	309835	0.0	1.0	1.0
+chr2	309967	1.0	0.0	1.0
+chr2	309979	0.0	1.0	1.0
+chr2	309989	1.0	0.0	1.0
+chr2	309995	2.0	0.0	2.0
+chr2	310000	1.0	0.0	1.0
+chr2	310010	3.0	0.0	3.0
+chr2	310152	1.0	0.0	1.0
+chr2	310159	0.0	1.0	1.0
+chr2	310160	1.0	0.0	1.0
+chr2	310161	0.0	1.0	1.0
+chr2	310165	0.0	1.0	1.0
+chr2	310180	0.0	1.0	1.0
+chr2	310243	1.0	0.0	1.0
+chr2	310286	0.0	1.0	1.0
+chr2	310309	1.0	0.0	1.0
+chr2	310316	1.0	0.0	1.0
+chr2	310317	1.0	1.0	2.0
+chr2	310320	6.0	0.0	6.0
+chr2	310321	11.0	2.0	13.0
+chr2	310322	0.0	2.0	2.0
+chr2	310323	3.0	5.0	8.0
+chr2	310324	0.0	1.0	1.0
+chr2	310325	2.0	0.0	2.0
+chr2	310326	0.0	2.0	2.0
+chr2	310327	2.0	1.0	3.0
+chr2	310332	0.0	5.0	5.0
+chr2	310333	1.0	3.0	4.0
+chr2	310337	1.0	0.0	1.0
+chr2	310340	3.0	0.0	3.0
+chr2	310344	1.0	0.0	1.0
+chr2	310345	0.0	1.0	1.0
+chr2	310351	0.0	1.0	1.0
+chr2	310352	0.0	1.0	1.0
+chr2	310361	0.0	1.0	1.0
+chr2	310376	0.0	1.0	1.0
+chr2	310605	3.0	0.0	3.0
+chr2	310606	1.0	0.0	1.0
+chr2	310609	1.0	0.0	1.0
+chr2	310617	7.0	1.0	8.0
+chr2	310618	0.0	1.0	1.0
+chr2	310619	1.0	0.0	1.0
+chr2	310620	3.0	3.0	6.0
+chr2	310622	1.0	0.0	1.0
+chr2	310623	0.0	2.0	2.0
+chr2	310626	1.0	0.0	1.0
+chr2	310627	0.0	2.0	2.0
+chr2	310629	1.0	0.0	1.0
+chr2	310632	0.0	1.0	1.0
+chr2	310641	1.0	0.0	1.0
+chr2	310647	0.0	1.0	1.0
+chr2	310766	0.0	1.0	1.0
+chr2	310781	2.0	0.0	2.0
+chr2	310788	2.0	0.0	2.0
+chr2	310789	1.0	0.0	1.0
+chr2	310791	0.0	1.0	1.0
+chr2	310795	0.0	2.0	2.0
+chr2	310798	1.0	0.0	1.0
+chr2	310801	1.0	0.0	1.0
+chr2	310805	0.0	1.0	1.0
+chr2	310920	1.0	1.0	2.0
+chr2	310937	0.0	1.0	1.0
+chr2	311037	0.0	1.0	1.0
+chr2	311091	1.0	0.0	1.0
+chr2	311108	0.0	1.0	1.0
+chr2	311110	0.0	1.0	1.0
+chr2	311146	1.0	0.0	1.0
+chr2	311158	1.0	0.0	1.0
+chr2	311234	2.0	0.0	2.0
+chr2	311248	1.0	0.0	1.0
+chr2	311260	1.0	0.0	1.0
+chr2	311262	0.0	2.0	2.0
+chr2	311270	1.0	1.0	2.0
+chr2	311271	0.0	1.0	1.0
+chr2	311276	0.0	1.0	1.0
+chr2	311277	0.0	2.0	2.0
+chr2	311288	1.0	2.0	3.0
+chr2	311294	0.0	1.0	1.0
+chr2	311300	0.0	2.0	2.0
+chr2	311318	0.0	2.0	2.0
+chr2	311380	0.0	3.0	3.0
+chr2	311397	0.0	1.0	1.0
+chr2	311410	1.0	0.0	1.0
+chr2	311415	1.0	0.0	1.0
+chr2	311416	0.0	2.0	2.0
+chr2	311417	0.0	1.0	1.0
+chr2	311418	1.0	1.0	2.0
+chr2	311420	1.0	0.0	1.0
+chr2	311423	2.0	0.0	2.0
+chr2	311425	1.0	0.0	1.0
+chr2	311426	0.0	1.0	1.0
+chr2	311427	1.0	1.0	2.0
+chr2	311428	4.0	0.0	4.0
+chr2	311429	1.0	0.0	1.0
+chr2	311431	1.0	0.0	1.0
+chr2	311432	0.0	1.0	1.0
+chr2	311449	1.0	0.0	1.0
+chr2	311450	1.0	0.0	1.0
+chr2	311457	1.0	0.0	1.0
+chr2	311463	0.0	2.0	2.0
+chr2	311468	1.0	0.0	1.0
+chr2	311484	1.0	0.0	1.0
+chr2	311495	0.0	1.0	1.0
+chr2	311503	0.0	1.0	1.0
+chr2	311749	0.0	1.0	1.0
+chr2	311768	0.0	1.0	1.0
+chr2	311782	0.0	1.0	1.0
+chr2	311786	0.0	2.0	2.0
+chr2	311791	1.0	0.0	1.0
+chr2	311800	2.0	0.0	2.0
+chr2	311802	1.0	0.0	1.0
+chr2	311807	1.0	1.0	2.0
+chr2	311816	0.0	1.0	1.0
+chr2	311826	2.0	0.0	2.0
+chr2	311836	1.0	0.0	1.0
+chr2	311868	0.0	1.0	1.0
+chr2	311873	1.0	0.0	1.0
+chr2	311966	0.0	2.0	2.0
+chr2	311971	1.0	0.0	1.0
+chr2	311972	0.0	1.0	1.0
+chr2	312003	0.0	1.0	1.0
+chr2	312021	1.0	0.0	1.0
+chr2	312023	1.0	0.0	1.0
+chr2	312149	1.0	0.0	1.0
+chr2	312155	0.0	1.0	1.0
+chr2	312176	1.0	0.0	1.0
+chr2	312293	0.0	1.0	1.0
+chr2	312450	1.0	0.0	1.0
+chr2	312456	1.0	0.0	1.0
+chr2	312764	1.0	0.0	1.0
+chr2	312875	0.0	1.0	1.0
+chr2	312920	1.0	0.0	1.0
+chr2	312945	0.0	1.0	1.0
+chr2	313126	0.0	1.0	1.0
+chr2	313292	0.0	1.0	1.0
+chr2	313680	0.0	1.0	1.0
+chr2	314315	0.0	2.0	2.0
+chr2	314401	0.0	1.0	1.0
+chr2	314618	0.0	1.0	1.0
+chr2	314762	0.0	1.0	1.0
+chr2	315073	1.0	0.0	1.0
+chr2	315088	1.0	0.0	1.0
+chr2	315096	0.0	1.0	1.0
+chr2	315101	1.0	0.0	1.0
+chr2	315103	0.0	2.0	2.0
+chr2	315107	1.0	0.0	1.0
+chr2	315114	0.0	1.0	1.0
+chr2	315126	1.0	0.0	1.0
+chr2	315225	1.0	0.0	1.0
+chr2	315305	0.0	1.0	1.0
+chr2	315536	1.0	0.0	1.0
+chr2	315542	1.0	1.0	2.0
+chr2	315543	0.0	1.0	1.0
+chr2	315554	0.0	1.0	1.0
+chr2	315559	1.0	0.0	1.0
+chr2	315562	1.0	0.0	1.0
+chr2	315568	0.0	2.0	2.0
+chr2	315569	0.0	1.0	1.0
+chr2	315570	1.0	0.0	1.0
+chr2	315573	1.0	0.0	1.0
+chr2	315574	0.0	1.0	1.0
+chr2	315575	0.0	2.0	2.0
+chr2	315577	1.0	0.0	1.0
+chr2	315582	0.0	1.0	1.0
+chr2	315587	1.0	0.0	1.0
+chr2	315588	0.0	1.0	1.0
+chr2	315597	0.0	3.0	3.0
+chr2	315608	1.0	0.0	1.0
+chr2	315723	0.0	1.0	1.0
+chr2	315874	1.0	0.0	1.0
+chr2	315893	0.0	1.0	1.0
+chr2	315903	1.0	0.0	1.0
+chr2	316263	0.0	1.0	1.0
+chr2	316388	0.0	1.0	1.0
+chr2	316422	0.0	1.0	1.0
+chr2	316520	0.0	2.0	2.0
+chr2	316534	0.0	1.0	1.0
+chr2	316560	1.0	0.0	1.0
+chr2	316575	0.0	1.0	1.0
+chr2	316863	1.0	0.0	1.0
+chr2	317032	1.0	0.0	1.0
+chr2	317188	0.0	1.0	1.0
+chr2	317189	0.0	1.0	1.0
+chr2	317203	1.0	0.0	1.0
+chr2	317214	0.0	1.0	1.0
+chr2	317226	1.0	0.0	1.0
+chr2	317238	0.0	1.0	1.0
+chr2	317345	1.0	0.0	1.0
+chr2	317417	0.0	2.0	2.0
+chr2	317652	0.0	1.0	1.0
+chr2	317653	2.0	0.0	2.0
+chr2	317667	0.0	1.0	1.0
+chr2	318238	1.0	0.0	1.0
+chr2	318242	0.0	1.0	1.0
+chr2	318245	0.0	1.0	1.0
+chr2	318248	0.0	1.0	1.0
+chr2	318251	3.0	0.0	3.0
+chr2	318259	0.0	2.0	2.0
+chr2	318260	1.0	0.0	1.0
+chr2	318261	1.0	0.0	1.0
+chr2	318263	1.0	1.0	2.0
+chr2	318264	0.0	2.0	2.0
+chr2	318267	1.0	0.0	1.0
+chr2	318269	1.0	0.0	1.0
+chr2	318272	1.0	0.0	1.0
+chr2	318273	1.0	0.0	1.0
+chr2	318274	1.0	1.0	2.0
+chr2	318275	1.0	0.0	1.0
+chr2	318276	1.0	3.0	4.0
+chr2	318277	0.0	1.0	1.0
+chr2	318279	2.0	0.0	2.0
+chr2	318280	1.0	0.0	1.0
+chr2	318281	0.0	1.0	1.0
+chr2	318282	0.0	1.0	1.0
+chr2	318283	0.0	1.0	1.0
+chr2	318290	0.0	1.0	1.0
+chr2	318292	1.0	0.0	1.0
+chr2	318317	1.0	0.0	1.0
+chr2	318604	1.0	0.0	1.0
+chr2	318608	1.0	0.0	1.0
+chr2	318989	1.0	0.0	1.0
+chr2	319086	0.0	1.0	1.0
+chr2	319362	0.0	1.0	1.0
+chr2	319510	0.0	1.0	1.0
+chr2	319524	0.0	4.0	4.0
+chr2	319859	0.0	1.0	1.0
+chr2	319954	0.0	1.0	1.0
+chr2	319985	1.0	0.0	1.0
+chr2	320206	1.0	0.0	1.0
+chr2	320291	0.0	1.0	1.0
+chr2	320506	0.0	1.0	1.0
+chr2	320853	0.0	1.0	1.0
+chr2	320947	1.0	0.0	1.0
+chr2	321024	0.0	1.0	1.0
+chr2	321098	0.0	1.0	1.0
+chr2	321249	1.0	0.0	1.0
+chr2	321253	1.0	0.0	1.0
+chr2	321260	0.0	1.0	1.0
+chr2	321262	0.0	2.0	2.0
+chr2	321275	1.0	0.0	1.0
+chr2	321424	0.0	1.0	1.0
+chr2	321426	0.0	1.0	1.0
+chr2	321510	0.0	1.0	1.0
+chr2	321557	1.0	0.0	1.0
+chr2	321574	2.0	0.0	2.0
+chr2	321579	1.0	0.0	1.0
+chr2	321580	0.0	1.0	1.0
+chr2	321581	0.0	1.0	1.0
+chr2	321582	1.0	0.0	1.0
+chr2	321598	1.0	0.0	1.0
+chr2	321599	8.0	0.0	8.0
+chr2	321600	10.0	0.0	10.0
+chr2	321601	0.0	1.0	1.0
+chr2	321603	0.0	2.0	2.0
+chr2	321605	1.0	0.0	1.0
+chr2	321608	0.0	3.0	3.0
+chr2	321611	0.0	3.0	3.0
+chr2	321624	1.0	0.0	1.0
+chr2	321625	1.0	0.0	1.0
+chr2	321859	2.0	0.0	2.0
+chr2	321867	1.0	1.0	2.0
+chr2	321885	1.0	0.0	1.0
+chr2	322029	0.0	3.0	3.0
+chr2	322210	0.0	1.0	1.0
+chr2	322219	1.0	0.0	1.0
+chr2	322470	0.0	1.0	1.0
+chr2	322654	0.0	1.0	1.0
+chr2	322736	1.0	0.0	1.0
+chr2	322769	1.0	0.0	1.0
+chr2	322776	1.0	0.0	1.0
+chr2	322945	0.0	1.0	1.0
+chr2	322961	1.0	0.0	1.0
+chr2	323063	0.0	1.0	1.0
+chr2	323268	0.0	1.0	1.0
+chr2	323426	0.0	1.0	1.0
+chr2	323562	0.0	1.0	1.0
+chr2	323706	1.0	0.0	1.0
+chr2	323718	1.0	0.0	1.0
+chr2	323873	0.0	1.0	1.0
+chr2	323876	1.0	1.0	2.0
+chr2	323889	2.0	0.0	2.0
+chr2	323892	1.0	0.0	1.0
+chr2	323901	1.0	0.0	1.0
+chr2	324011	0.0	1.0	1.0
+chr2	324026	0.0	2.0	2.0
+chr2	324030	2.0	0.0	2.0
+chr2	324049	0.0	1.0	1.0
+chr2	324308	0.0	1.0	1.0
+chr2	324314	0.0	1.0	1.0
+chr2	324326	1.0	0.0	1.0
+chr2	324335	1.0	0.0	1.0
+chr2	324337	3.0	0.0	3.0
+chr2	324343	1.0	0.0	1.0
+chr2	324344	1.0	1.0	2.0
+chr2	324348	1.0	0.0	1.0
+chr2	324380	0.0	1.0	1.0
+chr2	324474	0.0	1.0	1.0
+chr2	324505	1.0	0.0	1.0
+chr2	324508	1.0	1.0	2.0
+chr2	324550	1.0	0.0	1.0
+chr2	324660	2.0	0.0	2.0
+chr2	324675	0.0	1.0	1.0
+chr2	324692	0.0	1.0	1.0
+chr2	324787	1.0	0.0	1.0
+chr2	324829	0.0	1.0	1.0
+chr2	324843	0.0	1.0	1.0
+chr2	324956	0.0	1.0	1.0
+chr2	325021	0.0	1.0	1.0
+chr2	325325	1.0	0.0	1.0
+chr2	325500	1.0	0.0	1.0
+chr2	325516	0.0	1.0	1.0
+chr2	325684	1.0	0.0	1.0
+chr2	325711	1.0	0.0	1.0
+chr2	325733	1.0	0.0	1.0
+chr2	325754	2.0	0.0	2.0
+chr2	325764	0.0	1.0	1.0
+chr2	325876	0.0	1.0	1.0
+chr2	325896	1.0	0.0	1.0
+chr2	325899	1.0	0.0	1.0
+chr2	325908	0.0	1.0	1.0
+chr2	325940	0.0	3.0	3.0
+chr2	326012	2.0	0.0	2.0
+chr2	326069	1.0	0.0	1.0
+chr2	326071	2.0	0.0	2.0
+chr2	326072	1.0	0.0	1.0
+chr2	326079	1.0	0.0	1.0
+chr2	326081	0.0	2.0	2.0
+chr2	326085	0.0	2.0	2.0
+chr2	326089	1.0	0.0	1.0
+chr2	326093	1.0	0.0	1.0
+chr2	326094	3.0	0.0	3.0
+chr2	326100	0.0	1.0	1.0
+chr2	326101	0.0	1.0	1.0
+chr2	326329	1.0	0.0	1.0
+chr2	326342	0.0	1.0	1.0
+chr2	326345	2.0	0.0	2.0
+chr2	326359	0.0	7.0	7.0
+chr2	326360	0.0	1.0	1.0
+chr2	326364	1.0	2.0	3.0
+chr2	326365	2.0	0.0	2.0
+chr2	326366	2.0	0.0	2.0
+chr2	326367	2.0	0.0	2.0
+chr2	326374	0.0	1.0	1.0
+chr2	326379	1.0	0.0	1.0
+chr2	326387	1.0	0.0	1.0
+chr2	326507	0.0	2.0	2.0
+chr2	326509	0.0	1.0	1.0
+chr2	326530	1.0	0.0	1.0
+chr2	326598	2.0	0.0	2.0
+chr2	326623	1.0	0.0	1.0
+chr2	326628	1.0	0.0	1.0
+chr2	326638	1.0	0.0	1.0
+chr2	326653	0.0	1.0	1.0
+chr2	326687	1.0	0.0	1.0
+chr2	326969	0.0	1.0	1.0
+chr2	327003	2.0	0.0	2.0
+chr2	327127	0.0	1.0	1.0
+chr2	327130	0.0	3.0	3.0
+chr2	327131	0.0	4.0	4.0
+chr2	327136	0.0	1.0	1.0
+chr2	327139	0.0	1.0	1.0
+chr2	327140	1.0	0.0	1.0
+chr2	327150	0.0	1.0	1.0
+chr2	327152	0.0	2.0	2.0
+chr2	327163	0.0	1.0	1.0
+chr2	327164	0.0	1.0	1.0
+chr2	327185	0.0	2.0	2.0
+chr2	327192	1.0	0.0	1.0
+chr2	327194	2.0	0.0	2.0
+chr2	327195	0.0	1.0	1.0
+chr2	327200	1.0	0.0	1.0
+chr2	327201	1.0	0.0	1.0
+chr2	327202	1.0	0.0	1.0
+chr2	327206	2.0	0.0	2.0
+chr2	327209	0.0	2.0	2.0
+chr2	327214	0.0	1.0	1.0
+chr2	327222	0.0	2.0	2.0
+chr2	327231	1.0	0.0	1.0
+chr2	327233	1.0	0.0	1.0
+chr2	327238	0.0	1.0	1.0
+chr2	327242	0.0	3.0	3.0
+chr2	327244	0.0	2.0	2.0
+chr2	327245	0.0	4.0	4.0
+chr2	327252	0.0	3.0	3.0
+chr2	327259	1.0	0.0	1.0
+chr2	327266	0.0	1.0	1.0
+chr2	327272	0.0	1.0	1.0
+chr2	327277	1.0	0.0	1.0
+chr2	327287	3.0	0.0	3.0
+chr2	327292	1.0	0.0	1.0
+chr2	327303	1.0	0.0	1.0
+chr2	327304	1.0	0.0	1.0
+chr2	327305	3.0	0.0	3.0
+chr2	327313	2.0	0.0	2.0
+chr2	327321	1.0	1.0	2.0
+chr2	327322	0.0	2.0	2.0
+chr2	327325	1.0	0.0	1.0
+chr2	327333	1.0	0.0	1.0
+chr2	327334	1.0	0.0	1.0
+chr2	327337	1.0	0.0	1.0
+chr2	327338	1.0	0.0	1.0
+chr2	327355	1.0	0.0	1.0
+chr2	327358	1.0	0.0	1.0
+chr2	327370	1.0	0.0	1.0
+chr2	327375	1.0	0.0	1.0
+chr2	327729	1.0	0.0	1.0
+chr2	327781	1.0	0.0	1.0
+chr2	327808	1.0	0.0	1.0
+chr2	327811	1.0	0.0	1.0
+chr2	327837	1.0	0.0	1.0
+chr2	327869	1.0	0.0	1.0
+chr2	327910	3.0	0.0	3.0
+chr2	327912	1.0	0.0	1.0
+chr2	327928	0.0	1.0	1.0
+chr2	327971	0.0	2.0	2.0
+chr2	328004	0.0	1.0	1.0
+chr2	328112	0.0	1.0	1.0
+chr2	328122	0.0	1.0	1.0
+chr2	328255	1.0	0.0	1.0
+chr2	328264	0.0	1.0	1.0
+chr2	328298	0.0	1.0	1.0
+chr2	328302	0.0	1.0	1.0
+chr2	328303	1.0	0.0	1.0
+chr2	328309	0.0	1.0	1.0
+chr2	328328	0.0	1.0	1.0
+chr2	328435	0.0	1.0	1.0
+chr2	328440	0.0	1.0	1.0
+chr2	328455	1.0	0.0	1.0
+chr2	328526	0.0	2.0	2.0
+chr2	328688	2.0	0.0	2.0
+chr2	328699	0.0	1.0	1.0
+chr2	328704	0.0	1.0	1.0
+chr2	328892	0.0	1.0	1.0
+chr2	328946	0.0	2.0	2.0
+chr2	329022	1.0	0.0	1.0
+chr2	329117	0.0	1.0	1.0
+chr2	329135	2.0	0.0	2.0
+chr2	329145	0.0	1.0	1.0
+chr2	329246	0.0	1.0	1.0
+chr2	329306	2.0	0.0	2.0
+chr2	329424	0.0	1.0	1.0
+chr2	329591	0.0	1.0	1.0
+chr2	329659	0.0	1.0	1.0
+chr2	329896	1.0	0.0	1.0
+chr2	330065	0.0	1.0	1.0
+chr2	330183	1.0	0.0	1.0
+chr2	330495	0.0	1.0	1.0
+chr2	330497	1.0	0.0	1.0
+chr2	330500	0.0	1.0	1.0
+chr2	330501	0.0	1.0	1.0
+chr2	330502	1.0	0.0	1.0
+chr2	330503	0.0	1.0	1.0
+chr2	330511	0.0	1.0	1.0
+chr2	330827	1.0	0.0	1.0
+chr2	330911	0.0	1.0	1.0
+chr2	330938	1.0	0.0	1.0
+chr2	331015	0.0	1.0	1.0
+chr2	331016	0.0	1.0	1.0
+chr2	331020	0.0	1.0	1.0
+chr2	331058	6.0	0.0	6.0
+chr2	331178	1.0	0.0	1.0
+chr2	331191	0.0	1.0	1.0
+chr2	331334	1.0	0.0	1.0
+chr2	331346	1.0	0.0	1.0
+chr2	331468	0.0	1.0	1.0
+chr2	331473	0.0	1.0	1.0
+chr2	331498	0.0	1.0	1.0
+chr2	331500	0.0	1.0	1.0
+chr2	331518	1.0	0.0	1.0
+chr2	331521	1.0	0.0	1.0
+chr2	331523	0.0	2.0	2.0
+chr2	331531	0.0	3.0	3.0
+chr2	331536	0.0	1.0	1.0
+chr2	331683	0.0	1.0	1.0
+chr2	331718	0.0	1.0	1.0
+chr2	331806	1.0	0.0	1.0
+chr2	331900	0.0	1.0	1.0
+chr2	331915	0.0	1.0	1.0
+chr2	331998	1.0	0.0	1.0
+chr2	332173	1.0	0.0	1.0
+chr2	332209	0.0	1.0	1.0
+chr2	332219	0.0	1.0	1.0
+chr2	332230	0.0	1.0	1.0
+chr2	332241	1.0	0.0	1.0
+chr2	332251	2.0	0.0	2.0
+chr2	332356	0.0	1.0	1.0
+chr2	333009	0.0	1.0	1.0
+chr2	333231	1.0	0.0	1.0
+chr2	333351	0.0	1.0	1.0
+chr2	333502	2.0	0.0	2.0
+chr2	334262	2.0	0.0	2.0
+chr2	334295	0.0	1.0	1.0
+chr2	334656	1.0	0.0	1.0
+chr2	334896	0.0	1.0	1.0
+chr2	335211	1.0	0.0	1.0
+chr2	335309	1.0	0.0	1.0
+chr2	335342	1.0	0.0	1.0
+chr2	335605	0.0	1.0	1.0
+chr2	335977	0.0	1.0	1.0
+chr2	336036	1.0	0.0	1.0
+chr2	336054	1.0	0.0	1.0
+chr2	336192	0.0	1.0	1.0
+chr2	336268	0.0	1.0	1.0
+chr2	336297	1.0	0.0	1.0
+chr2	336346	1.0	0.0	1.0
+chr2	336355	1.0	0.0	1.0
+chr2	336525	2.0	1.0	3.0
+chr2	336526	0.0	1.0	1.0
+chr2	336550	1.0	0.0	1.0
+chr2	336552	1.0	0.0	1.0
+chr2	336663	0.0	1.0	1.0
+chr2	336674	0.0	1.0	1.0
+chr2	336742	1.0	0.0	1.0
+chr2	336757	0.0	1.0	1.0
+chr2	336796	0.0	2.0	2.0
+chr2	336816	1.0	0.0	1.0
+chr2	336825	0.0	1.0	1.0
+chr2	336829	1.0	0.0	1.0
+chr2	336852	2.0	0.0	2.0
+chr2	336855	0.0	1.0	1.0
+chr2	336894	0.0	1.0	1.0
+chr2	336896	1.0	0.0	1.0
+chr2	336906	0.0	1.0	1.0
+chr2	336911	0.0	1.0	1.0
+chr2	336923	0.0	1.0	1.0
+chr2	337175	1.0	0.0	1.0
+chr2	337224	0.0	2.0	2.0
+chr2	337231	1.0	0.0	1.0
+chr2	337236	3.0	2.0	5.0
+chr2	337239	0.0	1.0	1.0
+chr2	337240	0.0	3.0	3.0
+chr2	337242	0.0	3.0	3.0
+chr2	337244	3.0	0.0	3.0
+chr2	337245	4.0	0.0	4.0
+chr2	337249	0.0	2.0	2.0
+chr2	337250	1.0	0.0	1.0
+chr2	337251	0.0	5.0	5.0
+chr2	337256	2.0	1.0	3.0
+chr2	337257	2.0	0.0	2.0
+chr2	337258	5.0	1.0	6.0
+chr2	337260	0.0	5.0	5.0
+chr2	337261	0.0	2.0	2.0
+chr2	337262	0.0	1.0	1.0
+chr2	337270	0.0	1.0	1.0
+chr2	337271	0.0	1.0	1.0
+chr2	337274	2.0	1.0	3.0
+chr2	337275	1.0	0.0	1.0
+chr2	337285	1.0	0.0	1.0
+chr2	337289	1.0	0.0	1.0
+chr2	337394	0.0	1.0	1.0
+chr2	337395	0.0	1.0	1.0
+chr2	337399	1.0	0.0	1.0
+chr2	337414	0.0	1.0	1.0
+chr2	337418	1.0	1.0	2.0
+chr2	337420	1.0	0.0	1.0
+chr2	337421	0.0	2.0	2.0
+chr2	337551	0.0	1.0	1.0
+chr2	337580	0.0	1.0	1.0
+chr2	337585	0.0	1.0	1.0
+chr2	337603	0.0	2.0	2.0
+chr2	337607	1.0	0.0	1.0
+chr2	337609	0.0	1.0	1.0
+chr2	337637	1.0	0.0	1.0
+chr2	337642	0.0	1.0	1.0
+chr2	337643	0.0	1.0	1.0
+chr2	337644	0.0	4.0	4.0
+chr2	337670	1.0	0.0	1.0
+chr2	337763	0.0	2.0	2.0
+chr2	337765	1.0	0.0	1.0
+chr2	337778	0.0	1.0	1.0
+chr2	337791	1.0	0.0	1.0
+chr2	337818	0.0	1.0	1.0
+chr2	337914	1.0	0.0	1.0
+chr2	337979	1.0	0.0	1.0
+chr2	338012	0.0	1.0	1.0
+chr2	338020	0.0	1.0	1.0
+chr2	338058	0.0	1.0	1.0
+chr2	338065	1.0	0.0	1.0
+chr2	338072	1.0	0.0	1.0
+chr2	338077	0.0	1.0	1.0
+chr2	338109	0.0	1.0	1.0
+chr2	338237	1.0	0.0	1.0
+chr2	338242	0.0	1.0	1.0
+chr2	338249	0.0	1.0	1.0
+chr2	338275	1.0	0.0	1.0
+chr2	338378	1.0	0.0	1.0
+chr2	338379	1.0	0.0	1.0
+chr2	338381	1.0	0.0	1.0
+chr2	338382	0.0	1.0	1.0
+chr2	338385	0.0	1.0	1.0
+chr2	338387	0.0	1.0	1.0
+chr2	338388	1.0	0.0	1.0
+chr2	338391	0.0	4.0	4.0
+chr2	338395	0.0	1.0	1.0
+chr2	338407	1.0	0.0	1.0
+chr2	338408	1.0	0.0	1.0
+chr2	338411	1.0	1.0	2.0
+chr2	338414	1.0	0.0	1.0
+chr2	338415	0.0	1.0	1.0
+chr2	338424	1.0	0.0	1.0
+chr2	338454	1.0	0.0	1.0
+chr2	338687	0.0	1.0	1.0
+chr2	338691	0.0	1.0	1.0
+chr2	338696	0.0	1.0	1.0
+chr2	338698	0.0	2.0	2.0
+chr2	338699	0.0	1.0	1.0
+chr2	338701	1.0	0.0	1.0
+chr2	338707	0.0	1.0	1.0
+chr2	338730	0.0	1.0	1.0
+chr2	338738	0.0	1.0	1.0
+chr2	338828	0.0	4.0	4.0
+chr2	338857	1.0	0.0	1.0
+chr2	338859	0.0	1.0	1.0
+chr2	338868	0.0	1.0	1.0
+chr2	338871	0.0	1.0	1.0
+chr2	338872	0.0	1.0	1.0
+chr2	338890	1.0	0.0	1.0
+chr2	339007	1.0	0.0	1.0
+chr2	339019	1.0	0.0	1.0
+chr2	339024	0.0	1.0	1.0
+chr2	339031	1.0	0.0	1.0
+chr2	339032	1.0	0.0	1.0
+chr2	339180	1.0	0.0	1.0
+chr2	339190	0.0	1.0	1.0
+chr2	339211	1.0	0.0	1.0
+chr2	339218	1.0	0.0	1.0
+chr2	339303	0.0	1.0	1.0
+chr2	339341	1.0	0.0	1.0
+chr2	339347	1.0	0.0	1.0
+chr2	339349	2.0	0.0	2.0
+chr2	339352	2.0	0.0	2.0
+chr2	339353	0.0	1.0	1.0
+chr2	339354	0.0	2.0	2.0
+chr2	339357	1.0	0.0	1.0
+chr2	339358	1.0	0.0	1.0
+chr2	339361	0.0	8.0	8.0
+chr2	339371	3.0	0.0	3.0
+chr2	339373	2.0	0.0	2.0
+chr2	339403	0.0	2.0	2.0
+chr2	339404	0.0	2.0	2.0
+chr2	339425	1.0	0.0	1.0
+chr2	339426	1.0	0.0	1.0
+chr2	339561	0.0	1.0	1.0
+chr2	339562	0.0	1.0	1.0
+chr2	339566	0.0	1.0	1.0
+chr2	339587	0.0	1.0	1.0
+chr2	339598	1.0	0.0	1.0
+chr2	339602	0.0	1.0	1.0
+chr2	339613	0.0	1.0	1.0
+chr2	339614	1.0	0.0	1.0
+chr2	339619	0.0	1.0	1.0
+chr2	339620	0.0	2.0	2.0
+chr2	339621	0.0	1.0	1.0
+chr2	339623	0.0	1.0	1.0
+chr2	339625	2.0	0.0	2.0
+chr2	339626	4.0	0.0	4.0
+chr2	339627	1.0	0.0	1.0
+chr2	339630	1.0	0.0	1.0
+chr2	339631	0.0	1.0	1.0
+chr2	339632	1.0	0.0	1.0
+chr2	339634	1.0	0.0	1.0
+chr2	339635	3.0	0.0	3.0
+chr2	339636	2.0	0.0	2.0
+chr2	339639	0.0	1.0	1.0
+chr2	339645	1.0	0.0	1.0
+chr2	339646	2.0	0.0	2.0
+chr2	339648	0.0	3.0	3.0
+chr2	339651	1.0	0.0	1.0
+chr2	339655	0.0	1.0	1.0
+chr2	339660	0.0	1.0	1.0
+chr2	339663	2.0	0.0	2.0
+chr2	339677	0.0	1.0	1.0
+chr2	339756	0.0	1.0	1.0
+chr2	339788	1.0	0.0	1.0
+chr2	339803	4.0	0.0	4.0
+chr2	339805	0.0	1.0	1.0
+chr2	339822	0.0	1.0	1.0
+chr2	339926	1.0	0.0	1.0
+chr2	339973	1.0	0.0	1.0
+chr2	340021	0.0	1.0	1.0
+chr2	340110	0.0	1.0	1.0
+chr2	340199	1.0	0.0	1.0
+chr2	340243	1.0	0.0	1.0
+chr2	340259	2.0	0.0	2.0
+chr2	340271	0.0	1.0	1.0
+chr2	340272	2.0	0.0	2.0
+chr2	340396	1.0	0.0	1.0
+chr2	340407	1.0	0.0	1.0
+chr2	340417	0.0	1.0	1.0
+chr2	340443	0.0	1.0	1.0
+chr2	340526	0.0	1.0	1.0
+chr2	340561	0.0	1.0	1.0
+chr2	340564	1.0	0.0	1.0
+chr2	340568	0.0	1.0	1.0
+chr2	340569	1.0	0.0	1.0
+chr2	340576	2.0	0.0	2.0
+chr2	340582	0.0	1.0	1.0
+chr2	340584	1.0	0.0	1.0
+chr2	340587	0.0	1.0	1.0
+chr2	340740	0.0	1.0	1.0
+chr2	341005	0.0	1.0	1.0
+chr2	341009	1.0	0.0	1.0
+chr2	341014	2.0	0.0	2.0
+chr2	341018	0.0	1.0	1.0
+chr2	341030	0.0	1.0	1.0
+chr2	341041	0.0	1.0	1.0
+chr2	341155	0.0	1.0	1.0
+chr2	341165	0.0	2.0	2.0
+chr2	341176	1.0	0.0	1.0
+chr2	341177	0.0	1.0	1.0
+chr2	341179	0.0	1.0	1.0
+chr2	341186	0.0	1.0	1.0
+chr2	341188	2.0	4.0	6.0
+chr2	341198	0.0	1.0	1.0
+chr2	341201	0.0	2.0	2.0
+chr2	341222	1.0	0.0	1.0
+chr2	341233	0.0	1.0	1.0
+chr2	341568	1.0	0.0	1.0
+chr2	341647	1.0	0.0	1.0
+chr2	341693	0.0	1.0	1.0
+chr2	341698	1.0	0.0	1.0
+chr2	341704	0.0	1.0	1.0
+chr2	341736	1.0	0.0	1.0
+chr2	341739	0.0	1.0	1.0
+chr2	341766	0.0	1.0	1.0
+chr2	341782	0.0	1.0	1.0
+chr2	341806	1.0	0.0	1.0
+chr2	341992	0.0	1.0	1.0
+chr2	342018	1.0	0.0	1.0
+chr2	342030	0.0	2.0	2.0
+chr2	342031	1.0	0.0	1.0
+chr2	342053	3.0	0.0	3.0
+chr2	342057	0.0	1.0	1.0
+chr2	342058	1.0	0.0	1.0
+chr2	342068	0.0	1.0	1.0
+chr2	342178	0.0	1.0	1.0
+chr2	342214	1.0	0.0	1.0
+chr2	342216	1.0	0.0	1.0
+chr2	342233	1.0	0.0	1.0
+chr2	342236	2.0	0.0	2.0
+chr2	342250	1.0	0.0	1.0
+chr2	342503	1.0	0.0	1.0
+chr2	342515	1.0	0.0	1.0
+chr2	342522	1.0	0.0	1.0
+chr2	342523	1.0	0.0	1.0
+chr2	342524	1.0	0.0	1.0
+chr2	342527	0.0	2.0	2.0
+chr2	342535	1.0	0.0	1.0
+chr2	342536	1.0	0.0	1.0
+chr2	342537	3.0	0.0	3.0
+chr2	342542	0.0	1.0	1.0
+chr2	342543	0.0	4.0	4.0
+chr2	342556	1.0	1.0	2.0
+chr2	342585	0.0	2.0	2.0
+chr2	342606	1.0	0.0	1.0
+chr2	342628	1.0	0.0	1.0
+chr2	342689	0.0	1.0	1.0
+chr2	343156	0.0	1.0	1.0
+chr2	343229	1.0	0.0	1.0
+chr2	343255	1.0	0.0	1.0
+chr2	343298	1.0	0.0	1.0
+chr2	343309	1.0	0.0	1.0
+chr2	343320	1.0	0.0	1.0
+chr2	343350	0.0	1.0	1.0
+chr2	343370	0.0	1.0	1.0
+chr2	343399	1.0	0.0	1.0
+chr2	343402	1.0	0.0	1.0
+chr2	343416	1.0	0.0	1.0
+chr2	343428	1.0	0.0	1.0
+chr2	343433	0.0	4.0	4.0
+chr2	343439	0.0	1.0	1.0
+chr2	343458	0.0	1.0	1.0
+chr2	343521	0.0	1.0	1.0
+chr2	343536	1.0	0.0	1.0
+chr2	343558	1.0	0.0	1.0
+chr2	343563	1.0	0.0	1.0
+chr2	343564	0.0	1.0	1.0
+chr2	343567	1.0	1.0	2.0
+chr2	343569	3.0	0.0	3.0
+chr2	343573	1.0	0.0	1.0
+chr2	343588	3.0	0.0	3.0
+chr2	343589	2.0	0.0	2.0
+chr2	343596	1.0	0.0	1.0
+chr2	343626	0.0	1.0	1.0
+chr2	343628	1.0	0.0	1.0
+chr2	343634	1.0	0.0	1.0
+chr2	343636	0.0	1.0	1.0
+chr2	343718	0.0	1.0	1.0
+chr2	343721	1.0	0.0	1.0
+chr2	343727	1.0	1.0	2.0
+chr2	343736	0.0	1.0	1.0
+chr2	343740	2.0	0.0	2.0
+chr2	343741	0.0	1.0	1.0
+chr2	343751	0.0	2.0	2.0
+chr2	343757	2.0	0.0	2.0
+chr2	343764	1.0	0.0	1.0
+chr2	343771	0.0	1.0	1.0
+chr2	343798	1.0	0.0	1.0
+chr2	343806	1.0	0.0	1.0
+chr2	343900	1.0	0.0	1.0
+chr2	343908	1.0	0.0	1.0
+chr2	343913	0.0	1.0	1.0
+chr2	343918	0.0	1.0	1.0
+chr2	343922	2.0	0.0	2.0
+chr2	343926	0.0	1.0	1.0
+chr2	343928	0.0	2.0	2.0
+chr2	343932	0.0	1.0	1.0
+chr2	343933	1.0	0.0	1.0
+chr2	344023	1.0	0.0	1.0
+chr2	344030	0.0	1.0	1.0
+chr2	344041	0.0	2.0	2.0
+chr2	344052	0.0	1.0	1.0
+chr2	344055	2.0	0.0	2.0
+chr2	344057	1.0	0.0	1.0
+chr2	344059	0.0	1.0	1.0
+chr2	344060	1.0	1.0	2.0
+chr2	344062	1.0	0.0	1.0
+chr2	344066	2.0	3.0	5.0
+chr2	344072	0.0	2.0	2.0
+chr2	344075	0.0	2.0	2.0
+chr2	344077	0.0	3.0	3.0
+chr2	344078	0.0	1.0	1.0
+chr2	344079	1.0	0.0	1.0
+chr2	344081	3.0	0.0	3.0
+chr2	344082	3.0	0.0	3.0
+chr2	344084	0.0	7.0	7.0
+chr2	344086	0.0	1.0	1.0
+chr2	344087	1.0	0.0	1.0
+chr2	344092	2.0	1.0	3.0
+chr2	344093	0.0	1.0	1.0
+chr2	344094	2.0	0.0	2.0
+chr2	344097	0.0	2.0	2.0
+chr2	344100	2.0	1.0	3.0
+chr2	344103	1.0	3.0	4.0
+chr2	344106	5.0	0.0	5.0
+chr2	344107	0.0	1.0	1.0
+chr2	344108	1.0	0.0	1.0
+chr2	344112	2.0	2.0	4.0
+chr2	344113	0.0	4.0	4.0
+chr2	344114	1.0	1.0	2.0
+chr2	344124	1.0	0.0	1.0
+chr2	344136	1.0	0.0	1.0
+chr2	344142	0.0	1.0	1.0
+chr2	344147	0.0	2.0	2.0
+chr2	344148	0.0	1.0	1.0
+chr2	344178	1.0	0.0	1.0
+chr2	344351	1.0	0.0	1.0
+chr2	344368	0.0	1.0	1.0
+chr2	344386	0.0	1.0	1.0
+chr2	344619	0.0	1.0	1.0
+chr2	344623	1.0	0.0	1.0
+chr2	344632	1.0	0.0	1.0
+chr2	344638	0.0	1.0	1.0
+chr2	344649	0.0	1.0	1.0
+chr2	344661	0.0	1.0	1.0
+chr2	344697	0.0	2.0	2.0
+chr2	344760	0.0	2.0	2.0
+chr2	344912	0.0	1.0	1.0
+chr2	344930	1.0	0.0	1.0
+chr2	345003	3.0	0.0	3.0
+chr2	345943	1.0	0.0	1.0
+chr2	345971	1.0	0.0	1.0
+chr2	346434	1.0	0.0	1.0
+chr2	346546	1.0	0.0	1.0
+chr2	346895	0.0	1.0	1.0
+chr2	346900	1.0	0.0	1.0
+chr2	346915	0.0	1.0	1.0
+chr2	346917	1.0	0.0	1.0
+chr2	346930	0.0	2.0	2.0
+chr2	346947	0.0	1.0	1.0
+chr2	347020	1.0	0.0	1.0
+chr2	347051	1.0	0.0	1.0
+chr2	347074	1.0	0.0	1.0
+chr2	347079	1.0	0.0	1.0
+chr2	347124	0.0	1.0	1.0
+chr2	347222	0.0	1.0	1.0
+chr2	347225	0.0	1.0	1.0
+chr2	347246	3.0	0.0	3.0
+chr2	347247	3.0	1.0	4.0
+chr2	347249	0.0	2.0	2.0
+chr2	347250	1.0	0.0	1.0
+chr2	347255	0.0	1.0	1.0
+chr2	347257	0.0	1.0	1.0
+chr2	347267	1.0	0.0	1.0
+chr2	347274	0.0	1.0	1.0
+chr2	347275	0.0	2.0	2.0
+chr2	347278	0.0	1.0	1.0
+chr2	347286	0.0	1.0	1.0
+chr2	347289	1.0	0.0	1.0
+chr2	347851	0.0	1.0	1.0
+chr2	347857	1.0	0.0	1.0
+chr2	347865	0.0	1.0	1.0
+chr2	347989	0.0	1.0	1.0
+chr2	347991	1.0	0.0	1.0
+chr2	347999	1.0	0.0	1.0
+chr2	348002	0.0	1.0	1.0
+chr2	348003	0.0	2.0	2.0
+chr2	348007	0.0	1.0	1.0
+chr2	348014	0.0	1.0	1.0
+chr2	348024	0.0	1.0	1.0
+chr2	348031	0.0	2.0	2.0
+chr2	348154	1.0	0.0	1.0
+chr2	348173	1.0	0.0	1.0
+chr2	348174	0.0	1.0	1.0
+chr2	348177	0.0	1.0	1.0
+chr2	348178	1.0	0.0	1.0
+chr2	348200	1.0	0.0	1.0
+chr2	348209	1.0	0.0	1.0
+chr2	348213	0.0	3.0	3.0
+chr2	348337	1.0	0.0	1.0
+chr2	348355	0.0	1.0	1.0
+chr2	348356	0.0	2.0	2.0
+chr2	348376	1.0	0.0	1.0
+chr2	348378	1.0	0.0	1.0
+chr2	348386	2.0	0.0	2.0
+chr2	348480	0.0	1.0	1.0
+chr2	348507	1.0	0.0	1.0
+chr2	348700	1.0	0.0	1.0
+chr2	348822	0.0	2.0	2.0
+chr2	348853	0.0	1.0	1.0
+chr2	349300	0.0	1.0	1.0
+chr2	349327	0.0	1.0	1.0
+chr2	349354	0.0	1.0	1.0
+chr2	349383	0.0	1.0	1.0
+chr2	349474	0.0	1.0	1.0
+chr2	349479	0.0	1.0	1.0
+chr2	349498	2.0	0.0	2.0
+chr2	349639	1.0	0.0	1.0
+chr2	349804	1.0	0.0	1.0
+chr2	349822	1.0	0.0	1.0
+chr2	349837	0.0	1.0	1.0
+chr2	349839	1.0	0.0	1.0
+chr2	349944	1.0	0.0	1.0
+chr2	349962	0.0	1.0	1.0
+chr2	349968	0.0	2.0	2.0
+chr2	349970	0.0	1.0	1.0
+chr2	349978	2.0	1.0	3.0
+chr2	349983	0.0	1.0	1.0
+chr2	350004	0.0	1.0	1.0
+chr2	350005	0.0	1.0	1.0
+chr2	350008	1.0	0.0	1.0
+chr2	350010	1.0	0.0	1.0
+chr2	350014	0.0	1.0	1.0
+chr2	350018	1.0	0.0	1.0
+chr2	350024	0.0	1.0	1.0
+chr2	350027	0.0	1.0	1.0
+chr2	350035	0.0	2.0	2.0
+chr2	350036	0.0	1.0	1.0
+chr2	350054	1.0	0.0	1.0
+chr2	350068	1.0	0.0	1.0
+chr2	350069	1.0	0.0	1.0
+chr2	350074	0.0	1.0	1.0
+chr2	350076	0.0	2.0	2.0
+chr2	350140	0.0	1.0	1.0
+chr2	350175	1.0	0.0	1.0
+chr2	350178	0.0	1.0	1.0
+chr2	350198	3.0	0.0	3.0
+chr2	350201	0.0	1.0	1.0
+chr2	350202	0.0	1.0	1.0
+chr2	350206	0.0	1.0	1.0
+chr2	350209	0.0	1.0	1.0
+chr2	350216	0.0	2.0	2.0
+chr2	350218	0.0	1.0	1.0
+chr2	350233	0.0	2.0	2.0
+chr2	350236	1.0	0.0	1.0
+chr2	350237	1.0	0.0	1.0
+chr2	350239	1.0	0.0	1.0
+chr2	350259	2.0	0.0	2.0
+chr2	350281	0.0	1.0	1.0
+chr2	350325	0.0	1.0	1.0
+chr2	350342	1.0	0.0	1.0
+chr2	350345	0.0	1.0	1.0
+chr2	350359	1.0	0.0	1.0
+chr2	350384	0.0	1.0	1.0
+chr2	350387	1.0	0.0	1.0
+chr2	350606	0.0	1.0	1.0
+chr2	350682	0.0	1.0	1.0
+chr2	350692	1.0	0.0	1.0
+chr2	351060	0.0	1.0	1.0
+chr2	351065	1.0	0.0	1.0
+chr2	351066	0.0	4.0	4.0
+chr2	351067	3.0	0.0	3.0
+chr2	351068	2.0	0.0	2.0
+chr2	351078	1.0	0.0	1.0
+chr2	351079	1.0	0.0	1.0
+chr2	351098	0.0	2.0	2.0
+chr2	351127	1.0	0.0	1.0
+chr2	351233	0.0	1.0	1.0
+chr2	351242	1.0	0.0	1.0
+chr2	351284	0.0	1.0	1.0
+chr2	351288	1.0	0.0	1.0
+chr2	351291	0.0	1.0	1.0
+chr2	351295	1.0	0.0	1.0
+chr2	351337	0.0	1.0	1.0
+chr2	351395	0.0	1.0	1.0
+chr2	351431	0.0	1.0	1.0
+chr2	351434	1.0	0.0	1.0
+chr2	351440	1.0	0.0	1.0
+chr2	351443	0.0	3.0	3.0
+chr2	351450	0.0	3.0	3.0
+chr2	351454	0.0	1.0	1.0
+chr2	351465	1.0	0.0	1.0
+chr2	351473	1.0	0.0	1.0
+chr2	351476	1.0	1.0	2.0
+chr2	351528	0.0	1.0	1.0
+chr2	351545	1.0	0.0	1.0
+chr2	351599	0.0	1.0	1.0
+chr2	351619	1.0	0.0	1.0
+chr2	351628	0.0	1.0	1.0
+chr2	351629	0.0	1.0	1.0
+chr2	351739	0.0	1.0	1.0
+chr2	351804	1.0	0.0	1.0
+chr2	351816	0.0	1.0	1.0
+chr2	353014	1.0	0.0	1.0
+chr2	353041	0.0	1.0	1.0
+chr2	353142	0.0	1.0	1.0
+chr2	353144	1.0	0.0	1.0
+chr2	353173	0.0	1.0	1.0
+chr2	353192	1.0	0.0	1.0
+chr2	353193	0.0	1.0	1.0
+chr2	353333	1.0	0.0	1.0
+chr2	353336	0.0	1.0	1.0
+chr2	353340	0.0	2.0	2.0
+chr2	353345	1.0	0.0	1.0
+chr2	353348	2.0	0.0	2.0
+chr2	353349	1.0	0.0	1.0
+chr2	353350	3.0	0.0	3.0
+chr2	353357	0.0	1.0	1.0
+chr2	353358	1.0	0.0	1.0
+chr2	353361	1.0	0.0	1.0
+chr2	353364	0.0	1.0	1.0
+chr2	353368	1.0	0.0	1.0
+chr2	353376	0.0	1.0	1.0
+chr2	353757	1.0	0.0	1.0
+chr2	353769	1.0	0.0	1.0
+chr2	353785	0.0	1.0	1.0
+chr2	353791	0.0	2.0	2.0
+chr2	353941	0.0	1.0	1.0
+chr2	354114	0.0	1.0	1.0
+chr2	354161	1.0	0.0	1.0
+chr2	354647	0.0	1.0	1.0
+chr2	354665	0.0	2.0	2.0
+chr2	354754	1.0	0.0	1.0
+chr2	354890	1.0	0.0	1.0
+chr2	355033	0.0	3.0	3.0
+chr2	355170	0.0	1.0	1.0
+chr2	355649	1.0	0.0	1.0
+chr2	355656	1.0	0.0	1.0
+chr2	355657	0.0	1.0	1.0
+chr2	355661	2.0	0.0	2.0
+chr2	355663	0.0	2.0	2.0
+chr2	355687	1.0	0.0	1.0
+chr2	355695	2.0	0.0	2.0
+chr2	355810	0.0	2.0	2.0
+chr2	355811	0.0	2.0	2.0
+chr2	355832	1.0	0.0	1.0
+chr2	355838	0.0	1.0	1.0
+chr2	355856	0.0	1.0	1.0
+chr2	355878	1.0	0.0	1.0
+chr2	355946	0.0	1.0	1.0
+chr2	355965	1.0	0.0	1.0
+chr2	355970	3.0	0.0	3.0
+chr2	355974	1.0	1.0	2.0
+chr2	355975	2.0	0.0	2.0
+chr2	355986	2.0	0.0	2.0
+chr2	355988	1.0	0.0	1.0
+chr2	355991	0.0	1.0	1.0
+chr2	355993	0.0	4.0	4.0
+chr2	355995	2.0	0.0	2.0
+chr2	355998	0.0	2.0	2.0
+chr2	356001	0.0	1.0	1.0
+chr2	356003	0.0	1.0	1.0
+chr2	356006	1.0	0.0	1.0
+chr2	356007	3.0	1.0	4.0
+chr2	356008	5.0	1.0	6.0
+chr2	356009	0.0	2.0	2.0
+chr2	356018	1.0	0.0	1.0
+chr2	356019	0.0	1.0	1.0
+chr2	356020	0.0	2.0	2.0
+chr2	356024	0.0	1.0	1.0
+chr2	356026	0.0	1.0	1.0
+chr2	356027	1.0	0.0	1.0
+chr2	356029	1.0	0.0	1.0
+chr2	356031	0.0	1.0	1.0
+chr2	356032	0.0	2.0	2.0
+chr2	356035	0.0	1.0	1.0
+chr2	356041	1.0	0.0	1.0
+chr2	356043	0.0	1.0	1.0
+chr2	356044	0.0	1.0	1.0
+chr2	356069	1.0	0.0	1.0
+chr2	356394	0.0	1.0	1.0
+chr2	356414	1.0	0.0	1.0
+chr2	356430	0.0	1.0	1.0
+chr2	356436	1.0	0.0	1.0
+chr2	356476	0.0	1.0	1.0
+chr2	356518	0.0	2.0	2.0
+chr2	356538	0.0	4.0	4.0
+chr2	356542	0.0	1.0	1.0
+chr2	356545	0.0	1.0	1.0
+chr2	356548	0.0	1.0	1.0
+chr2	356550	0.0	2.0	2.0
+chr2	356553	0.0	1.0	1.0
+chr2	356554	0.0	1.0	1.0
+chr2	356558	2.0	0.0	2.0
+chr2	356559	3.0	0.0	3.0
+chr2	356566	1.0	0.0	1.0
+chr2	356567	0.0	1.0	1.0
+chr2	356568	1.0	0.0	1.0
+chr2	356569	1.0	1.0	2.0
+chr2	356570	2.0	0.0	2.0
+chr2	356571	5.0	1.0	6.0
+chr2	356576	0.0	2.0	2.0
+chr2	356577	3.0	0.0	3.0
+chr2	356580	0.0	2.0	2.0
+chr2	356593	0.0	4.0	4.0
+chr2	356613	1.0	0.0	1.0
+chr2	356848	0.0	1.0	1.0
+chr2	356851	0.0	1.0	1.0
+chr2	356875	0.0	1.0	1.0
+chr2	356885	0.0	1.0	1.0
+chr2	356903	1.0	0.0	1.0
+chr2	356920	0.0	1.0	1.0
+chr2	356994	1.0	0.0	1.0
+chr2	357004	0.0	1.0	1.0
+chr2	357019	1.0	0.0	1.0
+chr2	357032	1.0	0.0	1.0
+chr2	357033	0.0	1.0	1.0
+chr2	357047	1.0	0.0	1.0
+chr2	357118	1.0	0.0	1.0
+chr2	357161	1.0	0.0	1.0
+chr2	358052	1.0	0.0	1.0
+chr2	358200	1.0	0.0	1.0
+chr2	358356	1.0	0.0	1.0
+chr2	358382	1.0	0.0	1.0
+chr2	358641	0.0	1.0	1.0
+chr2	358696	1.0	0.0	1.0
+chr2	358868	1.0	0.0	1.0
+chr2	359457	1.0	0.0	1.0
+chr2	359901	0.0	1.0	1.0
+chr2	360090	1.0	0.0	1.0
+chr2	360101	1.0	0.0	1.0
+chr2	360102	2.0	0.0	2.0
+chr2	360214	0.0	1.0	1.0
+chr2	360235	1.0	0.0	1.0
+chr2	360238	1.0	0.0	1.0
+chr2	360241	3.0	0.0	3.0
+chr2	360256	0.0	2.0	2.0
+chr2	360260	2.0	1.0	3.0
+chr2	360263	3.0	0.0	3.0
+chr2	360265	4.0	0.0	4.0
+chr2	360268	0.0	7.0	7.0
+chr2	360269	0.0	2.0	2.0
+chr2	360272	1.0	0.0	1.0
+chr2	360273	0.0	1.0	1.0
+chr2	360275	1.0	0.0	1.0
+chr2	360276	2.0	1.0	3.0
+chr2	360277	1.0	0.0	1.0
+chr2	360280	1.0	0.0	1.0
+chr2	360282	0.0	1.0	1.0
+chr2	360283	1.0	0.0	1.0
+chr2	360284	4.0	0.0	4.0
+chr2	360285	3.0	0.0	3.0
+chr2	360287	1.0	0.0	1.0
+chr2	360289	0.0	1.0	1.0
+chr2	360298	0.0	1.0	1.0
+chr2	360301	0.0	1.0	1.0
+chr2	360307	1.0	0.0	1.0
+chr2	360319	0.0	1.0	1.0
+chr2	360640	0.0	1.0	1.0
+chr2	360651	0.0	1.0	1.0
+chr2	360655	0.0	1.0	1.0
+chr2	360656	1.0	0.0	1.0
+chr2	360659	0.0	1.0	1.0
+chr2	360664	1.0	0.0	1.0
+chr2	360665	1.0	0.0	1.0
+chr2	360666	0.0	1.0	1.0
+chr2	360669	1.0	0.0	1.0
+chr2	360670	1.0	0.0	1.0
+chr2	360676	3.0	0.0	3.0
+chr2	360678	1.0	0.0	1.0
+chr2	360679	1.0	0.0	1.0
+chr2	360680	0.0	1.0	1.0
+chr2	360681	0.0	2.0	2.0
+chr2	360689	1.0	0.0	1.0
+chr2	360822	0.0	2.0	2.0
+chr2	360823	0.0	3.0	3.0
+chr2	360843	1.0	0.0	1.0
+chr2	360848	1.0	0.0	1.0
+chr2	360863	0.0	1.0	1.0
+chr2	360965	0.0	1.0	1.0
+chr2	360993	1.0	0.0	1.0
+chr2	361046	1.0	0.0	1.0
+chr2	361221	1.0	0.0	1.0
+chr2	361263	0.0	3.0	3.0
+chr2	361435	0.0	1.0	1.0
+chr2	361504	1.0	0.0	1.0
+chr2	362058	1.0	0.0	1.0
+chr2	362070	0.0	1.0	1.0
+chr2	362186	0.0	1.0	1.0
+chr2	362251	0.0	1.0	1.0
+chr2	362389	1.0	0.0	1.0
+chr2	362391	2.0	0.0	2.0
+chr2	362402	0.0	2.0	2.0
+chr2	362403	0.0	1.0	1.0
+chr2	362407	0.0	1.0	1.0
+chr2	362564	0.0	1.0	1.0
+chr2	362597	0.0	1.0	1.0
+chr2	362853	1.0	0.0	1.0
+chr2	362855	2.0	0.0	2.0
+chr2	362860	2.0	0.0	2.0
+chr2	362864	0.0	1.0	1.0
+chr2	362865	1.0	0.0	1.0
+chr2	362868	0.0	2.0	2.0
+chr2	362869	2.0	0.0	2.0
+chr2	362870	1.0	0.0	1.0
+chr2	362871	0.0	2.0	2.0
+chr2	362875	1.0	0.0	1.0
+chr2	362877	0.0	1.0	1.0
+chr2	362879	0.0	1.0	1.0
+chr2	362880	1.0	0.0	1.0
+chr2	362881	5.0	0.0	5.0
+chr2	362882	5.0	4.0	9.0
+chr2	362884	0.0	1.0	1.0
+chr2	362886	1.0	0.0	1.0
+chr2	362890	0.0	2.0	2.0
+chr2	362892	0.0	5.0	5.0
+chr2	362893	0.0	3.0	3.0
+chr2	362894	3.0	0.0	3.0
+chr2	362898	0.0	1.0	1.0
+chr2	362904	1.0	0.0	1.0
+chr2	362913	0.0	1.0	1.0
+chr2	362918	1.0	0.0	1.0
+chr2	362926	1.0	0.0	1.0
+chr2	362941	1.0	0.0	1.0
+chr2	363057	0.0	2.0	2.0
+chr2	363060	0.0	3.0	3.0
+chr2	363064	1.0	0.0	1.0
+chr2	363077	1.0	0.0	1.0
+chr2	363260	1.0	0.0	1.0
+chr2	363287	1.0	0.0	1.0
+chr2	363364	0.0	1.0	1.0
+chr2	363391	0.0	1.0	1.0
+chr2	363468	1.0	0.0	1.0
+chr2	363505	1.0	0.0	1.0
+chr2	363510	1.0	0.0	1.0
+chr2	363831	1.0	0.0	1.0
+chr2	363883	0.0	1.0	1.0
+chr2	364545	1.0	0.0	1.0
+chr2	364822	0.0	1.0	1.0
+chr2	364825	0.0	1.0	1.0
+chr2	364841	1.0	0.0	1.0
+chr2	364860	1.0	0.0	1.0
+chr2	364870	1.0	0.0	1.0
+chr2	365017	1.0	0.0	1.0
+chr2	365056	2.0	0.0	2.0
+chr2	365145	1.0	0.0	1.0
+chr2	365179	0.0	1.0	1.0
+chr2	365183	0.0	1.0	1.0
+chr2	365298	1.0	0.0	1.0
+chr2	365496	1.0	0.0	1.0
+chr2	365532	0.0	1.0	1.0
+chr2	365544	1.0	0.0	1.0
+chr2	365547	0.0	1.0	1.0
+chr2	365581	0.0	1.0	1.0
+chr2	365648	1.0	0.0	1.0
+chr2	365651	1.0	0.0	1.0
+chr2	365658	0.0	1.0	1.0
+chr2	365661	1.0	1.0	2.0
+chr2	365664	1.0	0.0	1.0
+chr2	365675	1.0	0.0	1.0
+chr2	365676	0.0	1.0	1.0
+chr2	365683	0.0	1.0	1.0
+chr2	365686	2.0	0.0	2.0
+chr2	365691	0.0	1.0	1.0
+chr2	365693	0.0	1.0	1.0
+chr2	365694	1.0	0.0	1.0
+chr2	365713	1.0	0.0	1.0
+chr2	365730	1.0	0.0	1.0
+chr2	365778	0.0	1.0	1.0
+chr2	365928	1.0	0.0	1.0
+chr2	365945	0.0	1.0	1.0
+chr2	366082	0.0	1.0	1.0
+chr2	366088	0.0	2.0	2.0
+chr2	366092	1.0	0.0	1.0
+chr2	366096	1.0	0.0	1.0
+chr2	366121	0.0	1.0	1.0
+chr2	366384	1.0	0.0	1.0
+chr2	366416	1.0	0.0	1.0
+chr2	366701	1.0	0.0	1.0
+chr2	366777	0.0	1.0	1.0
+chr2	366778	0.0	6.0	6.0
+chr2	366782	0.0	1.0	1.0
+chr2	366784	3.0	0.0	3.0
+chr2	366792	1.0	0.0	1.0
+chr2	366812	1.0	0.0	1.0
+chr2	366819	1.0	0.0	1.0
+chr2	366850	2.0	0.0	2.0
+chr2	367133	1.0	0.0	1.0
+chr2	367137	0.0	1.0	1.0
+chr2	367154	1.0	0.0	1.0
+chr2	367155	1.0	0.0	1.0
+chr2	367421	1.0	0.0	1.0
+chr2	367454	0.0	1.0	1.0
+chr2	367716	1.0	0.0	1.0
+chr2	367894	0.0	1.0	1.0
+chr2	367912	0.0	1.0	1.0
+chr2	368480	1.0	0.0	1.0
+chr2	368482	1.0	0.0	1.0
+chr2	368490	0.0	1.0	1.0
+chr2	368493	0.0	1.0	1.0
+chr2	368503	0.0	1.0	1.0
+chr2	368566	0.0	1.0	1.0
+chr2	368758	1.0	0.0	1.0
+chr2	368873	0.0	1.0	1.0
+chr2	369178	0.0	1.0	1.0
+chr2	369185	1.0	0.0	1.0
+chr2	369330	0.0	1.0	1.0
+chr2	369339	1.0	0.0	1.0
+chr2	369353	0.0	1.0	1.0
+chr2	369366	0.0	1.0	1.0
+chr2	369412	1.0	0.0	1.0
+chr2	369501	1.0	1.0	2.0
+chr2	369504	0.0	1.0	1.0
+chr2	369520	0.0	1.0	1.0
+chr2	369545	1.0	0.0	1.0
+chr2	369645	0.0	1.0	1.0
+chr2	369647	1.0	0.0	1.0
+chr2	369656	0.0	1.0	1.0
+chr2	369660	0.0	1.0	1.0
+chr2	369669	0.0	1.0	1.0
+chr2	369686	3.0	0.0	3.0
+chr2	369687	4.0	2.0	6.0
+chr2	369690	0.0	1.0	1.0
+chr2	369691	0.0	2.0	2.0
+chr2	369692	0.0	1.0	1.0
+chr2	369718	1.0	0.0	1.0
+chr2	369719	1.0	0.0	1.0
+chr2	369746	1.0	0.0	1.0
+chr2	369971	1.0	0.0	1.0
+chr2	369988	0.0	1.0	1.0
+chr2	369990	1.0	0.0	1.0
+chr2	369994	0.0	1.0	1.0
+chr2	369996	0.0	1.0	1.0
+chr2	370006	0.0	1.0	1.0
+chr2	370017	1.0	0.0	1.0
+chr2	370018	0.0	1.0	1.0
+chr2	370045	0.0	1.0	1.0
+chr2	370158	0.0	2.0	2.0
+chr2	370187	1.0	6.0	7.0
+chr2	370189	0.0	1.0	1.0
+chr2	370308	1.0	0.0	1.0
+chr2	370404	0.0	1.0	1.0
+chr2	370421	0.0	1.0	1.0
+chr2	370470	0.0	1.0	1.0
+chr2	370578	1.0	0.0	1.0
+chr2	370583	0.0	1.0	1.0
+chr2	370607	0.0	2.0	2.0
+chr2	370617	1.0	0.0	1.0
+chr2	370699	0.0	1.0	1.0
+chr2	370829	1.0	0.0	1.0
+chr2	370925	0.0	1.0	1.0
+chr2	370937	1.0	0.0	1.0
+chr2	370943	1.0	0.0	1.0
+chr2	370947	1.0	0.0	1.0
+chr2	370950	0.0	1.0	1.0
+chr2	371106	2.0	0.0	2.0
+chr2	371548	0.0	1.0	1.0
+chr2	371859	0.0	1.0	1.0
+chr2	371890	1.0	0.0	1.0
+chr2	371903	0.0	1.0	1.0
+chr2	371923	1.0	0.0	1.0
+chr2	372154	0.0	1.0	1.0
+chr2	372232	1.0	0.0	1.0
+chr2	372296	1.0	0.0	1.0
+chr2	372418	0.0	6.0	6.0
+chr2	372454	0.0	1.0	1.0
+chr2	372650	1.0	0.0	1.0
+chr2	372849	0.0	1.0	1.0
+chr2	372854	3.0	0.0	3.0
+chr2	372863	1.0	0.0	1.0
+chr2	373055	1.0	0.0	1.0
+chr2	373059	0.0	1.0	1.0
+chr2	373107	0.0	1.0	1.0
+chr2	373118	1.0	0.0	1.0
+chr2	373176	1.0	0.0	1.0
+chr2	373466	0.0	1.0	1.0
+chr2	373489	1.0	0.0	1.0
+chr2	373784	0.0	1.0	1.0
+chr2	374071	0.0	1.0	1.0
+chr2	374113	1.0	0.0	1.0
+chr2	374279	2.0	0.0	2.0
+chr2	374343	0.0	1.0	1.0
+chr2	374886	1.0	0.0	1.0
+chr2	375311	0.0	1.0	1.0
+chr2	376881	0.0	1.0	1.0
+chr2	377631	1.0	0.0	1.0
+chr2	378229	0.0	1.0	1.0
+chr2	378306	0.0	1.0	1.0
+chr2	379147	1.0	0.0	1.0
+chr2	379178	0.0	1.0	1.0
+chr2	379211	0.0	1.0	1.0
+chr2	379313	1.0	0.0	1.0
+chr2	379350	0.0	1.0	1.0
+chr2	379472	1.0	0.0	1.0
+chr2	379503	0.0	1.0	1.0
+chr2	379609	0.0	1.0	1.0
+chr2	379622	1.0	0.0	1.0
+chr2	379662	0.0	1.0	1.0
+chr2	379747	0.0	1.0	1.0
+chr2	379787	1.0	0.0	1.0
+chr2	379799	1.0	0.0	1.0
+chr2	379895	1.0	0.0	1.0
+chr2	379899	0.0	1.0	1.0
+chr2	379901	1.0	0.0	1.0
+chr2	379908	0.0	1.0	1.0
+chr2	379943	1.0	0.0	1.0
+chr2	379957	1.0	0.0	1.0
+chr2	379958	0.0	2.0	2.0
+chr2	379967	1.0	0.0	1.0
+chr2	379968	1.0	0.0	1.0
+chr2	379971	1.0	0.0	1.0
+chr2	379973	0.0	1.0	1.0
+chr2	379993	0.0	1.0	1.0
+chr2	379994	0.0	2.0	2.0
+chr2	380207	0.0	1.0	1.0
+chr2	380221	0.0	1.0	1.0
+chr2	380232	1.0	0.0	1.0
+chr2	380241	2.0	0.0	2.0
+chr2	380242	0.0	2.0	2.0
+chr2	380244	1.0	0.0	1.0
+chr2	380260	1.0	0.0	1.0
+chr2	380275	1.0	0.0	1.0
+chr2	380441	0.0	1.0	1.0
+chr2	380519	0.0	2.0	2.0
+chr2	380728	0.0	1.0	1.0
+chr2	380729	0.0	1.0	1.0
+chr2	380741	1.0	0.0	1.0
+chr2	380761	1.0	0.0	1.0
+chr2	380769	1.0	0.0	1.0
+chr2	380773	0.0	1.0	1.0
+chr2	380777	0.0	1.0	1.0
+chr2	380921	2.0	0.0	2.0
+chr2	380968	0.0	1.0	1.0
+chr2	381047	0.0	1.0	1.0
+chr2	381049	1.0	0.0	1.0
+chr2	381061	0.0	2.0	2.0
+chr2	381063	0.0	1.0	1.0
+chr2	381066	0.0	1.0	1.0
+chr2	381073	0.0	1.0	1.0
+chr2	381093	1.0	0.0	1.0
+chr2	381120	1.0	0.0	1.0
+chr2	381239	1.0	0.0	1.0
+chr2	381379	1.0	0.0	1.0
+chr2	381450	0.0	1.0	1.0
+chr2	381469	1.0	0.0	1.0
+chr2	381473	0.0	1.0	1.0
+chr2	381480	3.0	1.0	4.0
+chr2	381506	0.0	2.0	2.0
+chr2	381643	0.0	1.0	1.0
+chr2	381645	0.0	1.0	1.0
+chr2	381687	1.0	0.0	1.0
+chr2	381698	0.0	1.0	1.0
+chr2	381699	0.0	1.0	1.0
+chr2	381700	1.0	0.0	1.0
+chr2	381754	1.0	0.0	1.0
+chr2	381820	1.0	0.0	1.0
+chr2	381827	3.0	0.0	3.0
+chr2	381828	1.0	0.0	1.0
+chr2	381843	0.0	1.0	1.0
+chr2	381849	0.0	1.0	1.0
+chr2	381850	2.0	2.0	4.0
+chr2	381856	1.0	0.0	1.0
+chr2	381857	1.0	1.0	2.0
+chr2	381858	1.0	0.0	1.0
+chr2	381862	0.0	1.0	1.0
+chr2	381866	0.0	1.0	1.0
+chr2	381870	1.0	0.0	1.0
+chr2	382033	0.0	1.0	1.0
+chr2	382042	0.0	1.0	1.0
+chr2	382057	1.0	0.0	1.0
+chr2	382132	1.0	0.0	1.0
+chr2	382157	0.0	1.0	1.0
+chr2	382158	0.0	1.0	1.0
+chr2	382170	2.0	0.0	2.0
+chr2	382180	1.0	0.0	1.0
+chr2	382189	3.0	0.0	3.0
+chr2	382190	1.0	0.0	1.0
+chr2	382199	0.0	1.0	1.0
+chr2	382202	0.0	1.0	1.0
+chr2	382211	0.0	1.0	1.0
+chr2	382217	0.0	1.0	1.0
+chr2	382218	0.0	1.0	1.0
+chr2	382293	0.0	1.0	1.0
+chr2	382312	0.0	1.0	1.0
+chr2	382320	0.0	1.0	1.0
+chr2	382328	0.0	2.0	2.0
+chr2	382348	0.0	1.0	1.0
+chr2	382364	0.0	1.0	1.0
+chr2	382367	1.0	0.0	1.0
+chr2	382369	2.0	0.0	2.0
+chr2	382371	1.0	0.0	1.0
+chr2	382407	1.0	0.0	1.0
+chr2	382479	1.0	0.0	1.0
+chr2	382494	0.0	2.0	2.0
+chr2	382496	1.0	0.0	1.0
+chr2	382503	0.0	1.0	1.0
+chr2	382517	1.0	0.0	1.0
+chr2	382521	1.0	0.0	1.0
+chr2	382522	1.0	0.0	1.0
+chr2	382525	1.0	0.0	1.0
+chr2	382533	1.0	0.0	1.0
+chr2	382534	1.0	2.0	3.0
+chr2	382536	1.0	2.0	3.0
+chr2	382539	1.0	0.0	1.0
+chr2	382544	1.0	1.0	2.0
+chr2	382545	2.0	2.0	4.0
+chr2	382584	1.0	0.0	1.0
+chr2	382660	1.0	0.0	1.0
+chr2	382671	1.0	0.0	1.0
+chr2	382674	1.0	0.0	1.0
+chr2	382683	3.0	0.0	3.0
+chr2	382687	1.0	0.0	1.0
+chr2	382692	1.0	0.0	1.0
+chr2	382694	0.0	1.0	1.0
+chr2	382695	1.0	0.0	1.0
+chr2	382700	0.0	1.0	1.0
+chr2	382701	0.0	1.0	1.0
+chr2	382704	1.0	0.0	1.0
+chr2	382711	3.0	0.0	3.0
+chr2	382718	0.0	1.0	1.0
+chr2	382729	1.0	0.0	1.0
+chr2	382730	1.0	0.0	1.0
+chr2	382864	3.0	0.0	3.0
+chr2	382871	1.0	1.0	2.0
+chr2	382874	0.0	1.0	1.0
+chr2	382875	0.0	3.0	3.0
+chr2	382881	1.0	0.0	1.0
+chr2	382885	1.0	0.0	1.0
+chr2	382891	0.0	1.0	1.0
+chr2	382892	0.0	2.0	2.0
+chr2	382894	4.0	0.0	4.0
+chr2	382895	0.0	2.0	2.0
+chr2	382896	0.0	1.0	1.0
+chr2	382899	1.0	0.0	1.0
+chr2	382908	0.0	1.0	1.0
+chr2	382914	0.0	1.0	1.0
+chr2	382915	0.0	2.0	2.0
+chr2	382922	2.0	0.0	2.0
+chr2	383108	0.0	1.0	1.0
+chr2	383132	0.0	1.0	1.0
+chr2	383143	0.0	2.0	2.0
+chr2	383149	2.0	0.0	2.0
+chr2	383161	1.0	0.0	1.0
+chr2	383162	1.0	0.0	1.0
+chr2	383165	0.0	2.0	2.0
+chr2	383167	1.0	0.0	1.0
+chr2	383168	2.0	0.0	2.0
+chr2	383169	0.0	1.0	1.0
+chr2	383175	1.0	0.0	1.0
+chr2	383177	0.0	3.0	3.0
+chr2	383180	4.0	1.0	5.0
+chr2	383181	1.0	0.0	1.0
+chr2	383189	0.0	1.0	1.0
+chr2	383190	2.0	1.0	3.0
+chr2	383191	3.0	0.0	3.0
+chr2	383192	2.0	1.0	3.0
+chr2	383193	0.0	1.0	1.0
+chr2	383195	0.0	1.0	1.0
+chr2	383204	0.0	1.0	1.0
+chr2	383212	0.0	1.0	1.0
+chr2	383322	0.0	1.0	1.0
+chr2	383327	1.0	0.0	1.0
+chr2	383332	1.0	0.0	1.0
+chr2	383343	2.0	0.0	2.0
+chr2	383350	2.0	0.0	2.0
+chr2	383352	0.0	1.0	1.0
+chr2	383353	1.0	0.0	1.0
+chr2	383510	0.0	1.0	1.0
+chr2	383512	0.0	1.0	1.0
+chr2	383513	1.0	0.0	1.0
+chr2	383525	1.0	0.0	1.0
+chr2	383541	0.0	1.0	1.0
+chr2	383673	1.0	0.0	1.0
+chr2	383676	1.0	0.0	1.0
+chr2	383705	1.0	0.0	1.0
+chr2	383891	0.0	1.0	1.0
+chr2	383987	0.0	2.0	2.0
+chr2	384330	0.0	1.0	1.0
+chr2	384479	0.0	1.0	1.0
+chr2	384721	1.0	0.0	1.0
+chr2	385253	0.0	1.0	1.0
+chr2	385272	0.0	1.0	1.0
+chr2	385323	1.0	0.0	1.0
+chr2	385382	1.0	0.0	1.0
+chr2	385449	0.0	1.0	1.0
+chr2	385490	0.0	1.0	1.0
+chr2	385736	1.0	0.0	1.0
+chr2	385842	0.0	1.0	1.0
+chr2	385854	1.0	0.0	1.0
+chr2	385867	1.0	0.0	1.0
+chr2	385910	0.0	1.0	1.0
+chr2	385912	1.0	0.0	1.0
+chr2	386035	0.0	1.0	1.0
+chr2	386043	1.0	0.0	1.0
+chr2	386058	0.0	1.0	1.0
+chr2	386089	1.0	0.0	1.0
+chr2	386310	1.0	0.0	1.0
+chr2	386455	0.0	1.0	1.0
+chr2	386467	0.0	1.0	1.0
+chr2	386492	0.0	1.0	1.0
+chr2	386499	1.0	0.0	1.0
+chr2	386632	1.0	0.0	1.0
+chr2	386748	1.0	0.0	1.0
+chr2	386767	1.0	0.0	1.0
+chr2	386771	1.0	0.0	1.0
+chr2	386809	1.0	0.0	1.0
+chr2	386945	0.0	1.0	1.0
+chr2	387095	0.0	1.0	1.0
+chr2	387423	0.0	1.0	1.0
+chr2	387426	0.0	1.0	1.0
+chr2	387431	1.0	0.0	1.0
+chr2	387559	1.0	0.0	1.0
+chr2	387574	1.0	0.0	1.0
+chr2	387821	1.0	0.0	1.0
+chr2	387911	0.0	1.0	1.0
+chr2	388078	0.0	1.0	1.0
+chr2	388257	0.0	1.0	1.0
+chr2	388666	0.0	2.0	2.0
+chr2	388955	1.0	0.0	1.0
+chr2	389396	1.0	0.0	1.0
+chr2	389402	0.0	1.0	1.0
+chr2	389421	1.0	0.0	1.0
+chr2	389434	1.0	0.0	1.0
+chr2	389516	1.0	0.0	1.0
+chr2	389862	0.0	1.0	1.0
+chr2	389886	2.0	0.0	2.0
+chr2	389914	1.0	0.0	1.0
+chr2	390095	1.0	0.0	1.0
+chr2	390145	3.0	0.0	3.0
+chr2	390148	0.0	4.0	4.0
+chr2	390301	2.0	1.0	3.0
+chr2	390314	1.0	0.0	1.0
+chr2	390494	0.0	1.0	1.0
+chr2	390498	0.0	1.0	1.0
+chr2	390625	0.0	1.0	1.0
+chr2	390686	1.0	0.0	1.0
+chr2	390778	0.0	1.0	1.0
+chr2	390794	1.0	0.0	1.0
+chr2	390804	0.0	1.0	1.0
+chr2	390974	1.0	0.0	1.0
+chr2	390976	0.0	1.0	1.0
+chr2	391117	0.0	1.0	1.0
+chr2	391175	0.0	1.0	1.0
+chr2	391176	0.0	1.0	1.0
+chr2	391282	0.0	1.0	1.0
+chr2	391352	0.0	1.0	1.0
+chr2	391405	1.0	0.0	1.0
+chr2	391413	1.0	0.0	1.0
+chr2	391440	1.0	0.0	1.0
+chr2	391446	0.0	5.0	5.0
+chr2	391466	1.0	0.0	1.0
+chr2	391591	0.0	1.0	1.0
+chr2	391612	0.0	1.0	1.0
+chr2	391614	1.0	0.0	1.0
+chr2	391623	7.0	0.0	7.0
+chr2	391624	1.0	0.0	1.0
+chr2	391629	0.0	2.0	2.0
+chr2	391630	0.0	1.0	1.0
+chr2	391632	2.0	0.0	2.0
+chr2	391636	1.0	0.0	1.0
+chr2	391637	0.0	1.0	1.0
+chr2	391658	0.0	1.0	1.0
+chr2	391867	1.0	0.0	1.0
+chr2	391868	1.0	0.0	1.0
+chr2	391879	1.0	0.0	1.0
+chr2	391880	0.0	1.0	1.0
+chr2	391928	0.0	1.0	1.0
+chr2	391949	0.0	1.0	1.0
+chr2	392132	0.0	1.0	1.0
+chr2	392141	3.0	0.0	3.0
+chr2	392234	0.0	1.0	1.0
+chr2	392255	1.0	0.0	1.0
+chr2	392256	2.0	0.0	2.0
+chr2	392265	0.0	1.0	1.0
+chr2	392268	1.0	0.0	1.0
+chr2	392271	1.0	0.0	1.0
+chr2	392279	0.0	1.0	1.0
+chr2	392284	1.0	2.0	3.0
+chr2	392286	0.0	3.0	3.0
+chr2	392303	1.0	0.0	1.0
+chr2	392304	0.0	1.0	1.0
+chr2	392780	1.0	0.0	1.0
+chr2	392820	0.0	1.0	1.0
+chr2	392872	0.0	1.0	1.0
+chr2	393137	0.0	1.0	1.0
+chr2	393140	0.0	1.0	1.0
+chr2	393159	1.0	0.0	1.0
+chr2	393185	1.0	0.0	1.0
+chr2	393191	1.0	0.0	1.0
+chr2	393500	1.0	0.0	1.0
+chr2	393501	1.0	0.0	1.0
+chr2	393563	1.0	0.0	1.0
+chr2	393801	0.0	1.0	1.0
+chr2	393825	0.0	1.0	1.0
+chr2	393981	0.0	1.0	1.0
+chr2	394150	0.0	1.0	1.0
+chr2	394482	0.0	1.0	1.0
+chr2	394636	1.0	0.0	1.0
+chr2	395143	1.0	0.0	1.0
+chr2	395144	1.0	0.0	1.0
+chr2	396004	2.0	0.0	2.0
+chr2	396135	0.0	1.0	1.0
+chr2	396407	0.0	1.0	1.0
+chr2	397581	0.0	2.0	2.0
+chr2	397818	1.0	0.0	1.0
+chr2	397965	2.0	0.0	2.0
+chr2	398119	1.0	0.0	1.0
+chr2	398241	0.0	1.0	1.0
+chr2	398245	0.0	2.0	2.0
+chr2	398246	0.0	1.0	1.0
+chr2	398247	2.0	0.0	2.0
+chr2	398249	1.0	0.0	1.0
+chr2	398250	3.0	0.0	3.0
+chr2	398253	1.0	3.0	4.0
+chr2	398262	1.0	0.0	1.0
+chr2	398264	1.0	0.0	1.0
+chr2	398311	1.0	0.0	1.0
+chr2	398312	1.0	0.0	1.0
+chr2	398587	0.0	1.0	1.0
+chr2	398592	2.0	0.0	2.0
+chr2	399178	0.0	1.0	1.0
+chr2	399445	0.0	1.0	1.0
+chr2	399491	1.0	0.0	1.0
+chr2	399493	0.0	1.0	1.0
+chr2	399560	0.0	1.0	1.0
+chr2	399734	1.0	0.0	1.0
+chr2	400006	0.0	1.0	1.0
+chr2	400101	0.0	1.0	1.0
+chr2	400376	1.0	0.0	1.0
+chr2	400416	1.0	0.0	1.0
+chr2	400658	0.0	1.0	1.0
+chr2	400680	3.0	0.0	3.0
+chr2	400693	1.0	0.0	1.0
+chr2	400702	0.0	2.0	2.0
+chr2	400703	1.0	0.0	1.0
+chr2	400823	0.0	1.0	1.0
+chr2	400832	1.0	0.0	1.0
+chr2	400835	0.0	1.0	1.0
+chr2	400843	1.0	0.0	1.0
+chr2	400845	0.0	1.0	1.0
+chr2	400851	1.0	0.0	1.0
+chr2	400852	1.0	1.0	2.0
+chr2	400853	1.0	0.0	1.0
+chr2	400856	1.0	0.0	1.0
+chr2	400857	0.0	1.0	1.0
+chr2	400858	1.0	0.0	1.0
+chr2	400865	0.0	2.0	2.0
+chr2	400869	0.0	3.0	3.0
+chr2	400874	2.0	0.0	2.0
+chr2	400875	4.0	2.0	6.0
+chr2	400877	0.0	1.0	1.0
+chr2	400880	0.0	1.0	1.0
+chr2	400883	1.0	0.0	1.0
+chr2	400889	2.0	0.0	2.0
+chr2	400890	1.0	0.0	1.0
+chr2	401083	2.0	0.0	2.0
+chr2	401174	1.0	0.0	1.0
+chr2	401189	0.0	1.0	1.0
+chr2	401197	0.0	1.0	1.0
+chr2	401204	0.0	1.0	1.0
+chr2	401237	0.0	1.0	1.0
+chr2	401352	0.0	1.0	1.0
+chr2	401371	1.0	0.0	1.0
+chr2	401404	1.0	0.0	1.0
+chr2	401750	1.0	0.0	1.0
+chr2	401898	0.0	1.0	1.0
+chr2	402169	0.0	1.0	1.0
+chr2	402275	1.0	0.0	1.0
+chr2	402478	0.0	1.0	1.0
+chr2	403062	0.0	1.0	1.0
+chr2	403459	1.0	0.0	1.0
+chr2	403588	1.0	0.0	1.0
+chr2	405003	2.0	0.0	2.0
+chr2	405139	0.0	1.0	1.0
+chr2	405150	1.0	0.0	1.0
+chr2	405160	1.0	0.0	1.0
+chr2	405172	0.0	1.0	1.0
+chr2	405179	1.0	0.0	1.0
+chr2	405191	1.0	0.0	1.0
+chr2	405322	1.0	0.0	1.0
+chr2	405324	5.0	2.0	7.0
+chr2	405327	0.0	1.0	1.0
+chr2	405329	1.0	0.0	1.0
+chr2	405332	0.0	1.0	1.0
+chr2	405338	1.0	1.0	2.0
+chr2	405341	2.0	1.0	3.0
+chr2	405342	0.0	1.0	1.0
+chr2	405343	1.0	0.0	1.0
+chr2	405345	0.0	1.0	1.0
+chr2	405346	1.0	0.0	1.0
+chr2	405592	0.0	1.0	1.0
+chr2	405596	1.0	0.0	1.0
+chr2	405599	1.0	0.0	1.0
+chr2	406124	0.0	1.0	1.0
+chr2	406217	0.0	1.0	1.0
+chr2	406244	0.0	1.0	1.0
+chr2	406275	0.0	2.0	2.0
+chr2	406304	0.0	1.0	1.0
+chr2	406307	5.0	0.0	5.0
+chr2	406330	0.0	1.0	1.0
+chr2	406332	0.0	1.0	1.0
+chr2	406636	0.0	2.0	2.0
+chr2	406661	1.0	0.0	1.0
+chr2	406709	1.0	0.0	1.0
+chr2	406793	0.0	1.0	1.0
+chr2	406990	0.0	1.0	1.0
+chr2	407182	1.0	0.0	1.0
+chr2	407594	2.0	0.0	2.0
+chr2	407608	0.0	1.0	1.0
+chr2	407626	1.0	0.0	1.0
+chr2	407683	0.0	1.0	1.0
+chr2	407789	1.0	0.0	1.0
+chr2	407926	1.0	0.0	1.0
+chr2	408289	0.0	1.0	1.0
+chr2	408316	3.0	0.0	3.0
+chr2	408328	0.0	1.0	1.0
+chr2	408455	0.0	1.0	1.0
+chr2	408466	1.0	0.0	1.0
+chr2	408473	0.0	1.0	1.0
+chr2	408496	1.0	0.0	1.0
+chr2	408833	1.0	0.0	1.0
+chr2	408871	1.0	0.0	1.0
+chr2	408872	1.0	0.0	1.0
+chr2	408886	1.0	1.0	2.0
+chr2	408887	0.0	4.0	4.0
+chr2	408897	1.0	0.0	1.0
+chr2	408918	0.0	1.0	1.0
+chr2	408984	0.0	1.0	1.0
+chr2	409068	2.0	0.0	2.0
+chr2	409074	0.0	1.0	1.0
+chr2	409208	0.0	1.0	1.0
+chr2	409231	1.0	0.0	1.0
+chr2	409250	1.0	0.0	1.0
+chr2	409362	0.0	1.0	1.0
+chr2	409373	1.0	0.0	1.0
+chr2	409399	0.0	1.0	1.0
+chr2	409417	0.0	1.0	1.0
+chr2	409429	3.0	0.0	3.0
+chr2	409434	0.0	1.0	1.0
+chr2	409438	0.0	1.0	1.0
+chr2	409598	1.0	0.0	1.0
+chr2	409742	0.0	1.0	1.0
+chr2	409797	0.0	1.0	1.0
+chr2	410105	1.0	0.0	1.0
+chr2	410258	0.0	1.0	1.0
+chr2	410386	1.0	0.0	1.0
+chr2	410403	0.0	1.0	1.0
+chr2	410697	1.0	0.0	1.0
+chr2	410703	2.0	1.0	3.0
+chr2	410706	1.0	1.0	2.0
+chr2	410714	0.0	1.0	1.0
+chr2	410717	0.0	2.0	2.0
+chr2	410724	1.0	0.0	1.0
+chr2	410731	2.0	0.0	2.0
+chr2	410732	1.0	0.0	1.0
+chr2	410738	1.0	0.0	1.0
+chr2	411024	1.0	0.0	1.0
+chr2	411027	1.0	0.0	1.0
+chr2	411028	0.0	1.0	1.0
+chr2	411029	0.0	1.0	1.0
+chr2	411030	2.0	0.0	2.0
+chr2	411034	1.0	0.0	1.0
+chr2	411035	1.0	0.0	1.0
+chr2	411036	0.0	1.0	1.0
+chr2	411059	1.0	0.0	1.0
+chr2	411069	1.0	0.0	1.0
+chr2	411207	1.0	0.0	1.0
+chr2	411214	0.0	1.0	1.0
+chr2	411217	0.0	1.0	1.0
+chr2	411391	0.0	1.0	1.0
+chr2	411486	1.0	0.0	1.0
+chr2	411740	0.0	1.0	1.0
+chr2	412432	1.0	0.0	1.0
+chr2	412761	1.0	0.0	1.0
+chr2	412786	1.0	0.0	1.0
+chr2	413066	0.0	1.0	1.0
+chr2	413087	0.0	1.0	1.0
+chr2	413111	1.0	0.0	1.0
+chr2	413181	1.0	0.0	1.0
+chr2	413362	0.0	1.0	1.0
+chr2	413554	1.0	0.0	1.0
+chr2	413559	3.0	0.0	3.0
+chr2	413574	0.0	1.0	1.0
+chr2	413575	0.0	1.0	1.0
+chr2	413883	0.0	1.0	1.0
+chr2	413884	1.0	0.0	1.0
+chr2	413889	1.0	0.0	1.0
+chr2	413895	1.0	1.0	2.0
+chr2	413920	0.0	1.0	1.0
+chr2	414334	1.0	0.0	1.0
+chr2	414373	0.0	1.0	1.0
+chr2	414381	0.0	1.0	1.0
+chr2	414436	1.0	0.0	1.0
+chr2	414512	0.0	1.0	1.0
+chr2	414577	0.0	1.0	1.0
+chr2	414596	0.0	1.0	1.0
+chr2	414666	0.0	1.0	1.0
+chr2	414744	1.0	0.0	1.0
+chr2	415880	0.0	1.0	1.0
+chr2	415884	0.0	1.0	1.0
+chr2	415893	1.0	0.0	1.0
+chr2	415895	1.0	0.0	1.0
+chr2	415903	1.0	0.0	1.0
+chr2	415922	2.0	0.0	2.0
+chr2	415926	0.0	2.0	2.0
+chr2	415943	0.0	1.0	1.0
+chr2	415965	1.0	0.0	1.0
+chr2	415970	1.0	0.0	1.0
+chr2	415998	1.0	0.0	1.0
+chr2	416078	0.0	1.0	1.0
+chr2	416082	0.0	1.0	1.0
+chr2	416096	1.0	0.0	1.0
+chr2	416101	1.0	0.0	1.0
+chr2	416102	1.0	0.0	1.0
+chr2	416104	0.0	1.0	1.0
+chr2	416258	0.0	1.0	1.0
+chr2	416283	0.0	1.0	1.0
+chr2	416331	1.0	0.0	1.0
+chr2	416475	0.0	2.0	2.0
+chr2	416560	0.0	3.0	3.0
+chr2	416652	0.0	1.0	1.0
+chr2	416697	0.0	1.0	1.0
+chr2	416706	1.0	0.0	1.0
+chr2	416741	0.0	1.0	1.0
+chr2	416874	1.0	0.0	1.0
+chr2	416902	0.0	1.0	1.0
+chr2	417134	2.0	0.0	2.0
+chr2	417159	0.0	1.0	1.0
+chr2	417189	1.0	0.0	1.0
+chr2	417193	0.0	1.0	1.0
+chr2	417198	0.0	1.0	1.0
+chr2	417371	0.0	1.0	1.0
+chr2	417374	0.0	1.0	1.0
+chr2	417385	0.0	1.0	1.0
+chr2	417402	1.0	0.0	1.0
+chr2	417407	0.0	1.0	1.0
+chr2	417412	1.0	0.0	1.0
+chr2	417511	0.0	1.0	1.0
+chr2	417519	0.0	1.0	1.0
+chr2	417520	2.0	0.0	2.0
+chr2	417521	1.0	0.0	1.0
+chr2	417524	0.0	1.0	1.0
+chr2	417526	0.0	3.0	3.0
+chr2	417527	3.0	1.0	4.0
+chr2	417528	0.0	2.0	2.0
+chr2	417529	2.0	0.0	2.0
+chr2	417535	2.0	2.0	4.0
+chr2	417536	4.0	1.0	5.0
+chr2	417538	0.0	2.0	2.0
+chr2	417539	2.0	0.0	2.0
+chr2	417541	0.0	1.0	1.0
+chr2	417547	0.0	1.0	1.0
+chr2	417549	1.0	0.0	1.0
+chr2	417556	0.0	1.0	1.0
+chr2	417558	0.0	1.0	1.0
+chr2	417562	1.0	0.0	1.0
+chr2	417753	0.0	2.0	2.0
+chr2	417765	2.0	1.0	3.0
+chr2	417766	0.0	2.0	2.0
+chr2	417779	1.0	0.0	1.0
+chr2	417925	1.0	0.0	1.0
+chr2	417939	0.0	1.0	1.0
+chr2	417954	1.0	0.0	1.0
+chr2	417967	0.0	1.0	1.0
+chr2	417968	0.0	1.0	1.0
+chr2	418075	0.0	2.0	2.0
+chr2	418086	1.0	0.0	1.0
+chr2	418125	0.0	2.0	2.0
+chr2	418316	1.0	0.0	1.0
+chr2	418334	0.0	1.0	1.0
+chr2	418352	0.0	1.0	1.0
+chr2	418374	1.0	0.0	1.0
+chr2	418375	1.0	0.0	1.0
+chr2	418383	1.0	0.0	1.0
+chr2	418405	0.0	1.0	1.0
+chr2	418485	0.0	2.0	2.0
+chr2	418515	0.0	1.0	1.0
+chr2	418699	0.0	1.0	1.0
+chr2	418715	0.0	1.0	1.0
+chr2	418827	0.0	1.0	1.0
+chr2	418845	0.0	1.0	1.0
+chr2	418873	0.0	1.0	1.0
+chr2	418877	1.0	1.0	2.0
+chr2	419009	2.0	0.0	2.0
+chr2	419025	1.0	0.0	1.0
+chr2	419030	0.0	1.0	1.0
+chr2	419041	0.0	1.0	1.0
+chr2	419043	0.0	1.0	1.0
+chr2	419180	1.0	0.0	1.0
+chr2	419181	1.0	0.0	1.0
+chr2	419191	2.0	8.0	10.0
+chr2	419192	0.0	2.0	2.0
+chr2	419193	1.0	0.0	1.0
+chr2	419201	1.0	0.0	1.0
+chr2	419202	5.0	0.0	5.0
+chr2	419216	1.0	0.0	1.0
+chr2	419217	0.0	1.0	1.0
+chr2	419226	0.0	1.0	1.0
+chr2	419432	1.0	0.0	1.0
+chr2	419487	2.0	0.0	2.0
+chr2	419519	0.0	1.0	1.0
+chr2	419520	0.0	1.0	1.0
+chr2	419537	1.0	0.0	1.0
+chr2	419603	1.0	0.0	1.0
+chr2	419612	0.0	1.0	1.0
+chr2	419629	0.0	1.0	1.0
+chr2	419643	0.0	1.0	1.0
+chr2	419644	0.0	1.0	1.0
+chr2	419652	1.0	0.0	1.0
+chr2	419658	0.0	1.0	1.0
+chr2	419660	0.0	1.0	1.0
+chr2	419663	1.0	0.0	1.0
+chr2	419848	1.0	0.0	1.0
+chr2	419954	0.0	1.0	1.0
+chr2	419967	1.0	0.0	1.0
+chr2	419968	0.0	1.0	1.0
+chr2	419976	1.0	0.0	1.0
+chr2	420394	1.0	0.0	1.0
+chr2	420554	1.0	0.0	1.0
+chr2	420743	1.0	0.0	1.0
+chr2	420953	0.0	1.0	1.0
+chr2	421145	0.0	1.0	1.0
+chr2	421419	1.0	0.0	1.0
+chr2	421853	0.0	2.0	2.0
+chr2	422201	1.0	0.0	1.0
+chr2	422244	0.0	1.0	1.0
+chr2	422429	0.0	1.0	1.0
+chr2	423078	1.0	0.0	1.0
+chr2	423096	0.0	1.0	1.0
+chr2	423264	0.0	1.0	1.0
+chr2	423282	0.0	1.0	1.0
+chr2	423305	0.0	1.0	1.0
+chr2	423522	0.0	1.0	1.0
+chr2	423555	0.0	1.0	1.0
+chr2	423586	1.0	0.0	1.0
+chr2	423588	0.0	2.0	2.0
+chr2	423591	0.0	1.0	1.0
+chr2	423592	0.0	2.0	2.0
+chr2	423593	0.0	1.0	1.0
+chr2	423609	1.0	0.0	1.0
+chr2	423624	0.0	1.0	1.0
+chr2	423755	0.0	1.0	1.0
+chr2	423777	1.0	0.0	1.0
+chr2	423789	0.0	1.0	1.0
+chr2	423790	0.0	3.0	3.0
+chr2	423793	1.0	0.0	1.0
+chr2	423796	2.0	0.0	2.0
+chr2	423798	0.0	1.0	1.0
+chr2	423800	1.0	0.0	1.0
+chr2	423801	0.0	1.0	1.0
+chr2	423802	1.0	0.0	1.0
+chr2	423803	0.0	1.0	1.0
+chr2	423817	1.0	0.0	1.0
+chr2	423818	0.0	1.0	1.0
+chr2	423938	1.0	0.0	1.0
+chr2	424121	0.0	1.0	1.0
+chr2	424132	1.0	0.0	1.0
+chr2	424133	1.0	0.0	1.0
+chr2	424141	1.0	0.0	1.0
+chr2	424264	0.0	2.0	2.0
+chr2	424294	0.0	1.0	1.0
+chr2	424674	0.0	1.0	1.0
+chr2	425022	1.0	0.0	1.0
+chr2	425044	1.0	0.0	1.0
+chr2	425050	0.0	1.0	1.0
+chr2	425090	1.0	0.0	1.0
+chr2	425114	1.0	0.0	1.0
+chr2	425115	1.0	0.0	1.0
+chr2	425126	0.0	1.0	1.0
+chr2	425129	1.0	0.0	1.0
+chr2	425209	0.0	1.0	1.0
+chr2	425259	1.0	0.0	1.0
+chr2	425290	0.0	1.0	1.0
+chr2	425291	1.0	0.0	1.0
+chr2	425333	1.0	0.0	1.0
+chr2	425399	1.0	0.0	1.0
+chr2	425472	0.0	1.0	1.0
+chr2	425474	2.0	0.0	2.0
+chr2	425479	0.0	1.0	1.0
+chr2	425532	0.0	1.0	1.0
+chr2	425637	1.0	1.0	2.0
+chr2	425640	0.0	2.0	2.0
+chr2	425650	0.0	1.0	1.0
+chr2	425655	1.0	0.0	1.0
+chr2	425665	1.0	0.0	1.0
+chr2	425679	1.0	0.0	1.0
+chr2	425774	0.0	1.0	1.0
+chr2	425778	0.0	1.0	1.0
+chr2	425794	0.0	1.0	1.0
+chr2	425795	0.0	1.0	1.0
+chr2	425796	0.0	1.0	1.0
+chr2	425799	2.0	0.0	2.0
+chr2	425801	1.0	4.0	5.0
+chr2	425802	0.0	1.0	1.0
+chr2	425803	0.0	1.0	1.0
+chr2	425805	0.0	2.0	2.0
+chr2	425809	0.0	1.0	1.0
+chr2	425821	2.0	0.0	2.0
+chr2	425822	1.0	0.0	1.0
+chr2	425829	2.0	0.0	2.0
+chr2	425835	0.0	2.0	2.0
+chr2	426081	1.0	0.0	1.0
+chr2	426245	1.0	0.0	1.0
+chr2	426257	1.0	0.0	1.0
+chr2	426268	1.0	0.0	1.0
+chr2	426282	1.0	0.0	1.0
+chr2	426396	0.0	1.0	1.0
+chr2	426416	0.0	1.0	1.0
+chr2	426417	0.0	1.0	1.0
+chr2	426646	0.0	2.0	2.0
+chr2	426715	1.0	0.0	1.0
+chr2	426732	1.0	0.0	1.0
+chr2	426741	1.0	0.0	1.0
+chr2	426744	0.0	1.0	1.0
+chr2	426755	1.0	0.0	1.0
+chr2	426787	0.0	1.0	1.0
+chr2	426791	0.0	1.0	1.0
+chr2	426819	0.0	1.0	1.0
+chr2	426825	0.0	1.0	1.0
+chr2	426837	0.0	2.0	2.0
+chr2	426881	0.0	1.0	1.0
+chr2	427138	0.0	1.0	1.0
+chr2	427156	0.0	1.0	1.0
+chr2	427171	1.0	0.0	1.0
+chr2	427172	1.0	0.0	1.0
+chr2	427179	0.0	1.0	1.0
+chr2	427188	1.0	0.0	1.0
+chr2	427193	1.0	0.0	1.0
+chr2	427203	1.0	0.0	1.0
+chr2	427307	1.0	0.0	1.0
+chr2	427308	0.0	3.0	3.0
+chr2	427313	1.0	0.0	1.0
+chr2	427315	1.0	0.0	1.0
+chr2	427316	1.0	0.0	1.0
+chr2	427328	0.0	1.0	1.0
+chr2	427396	0.0	1.0	1.0
+chr2	427403	0.0	1.0	1.0
+chr2	427415	0.0	1.0	1.0
+chr2	427420	1.0	0.0	1.0
+chr2	427422	0.0	1.0	1.0
+chr2	427438	1.0	0.0	1.0
+chr2	427447	1.0	1.0	2.0
+chr2	427448	1.0	0.0	1.0
+chr2	427449	2.0	0.0	2.0
+chr2	427452	1.0	0.0	1.0
+chr2	427455	2.0	0.0	2.0
+chr2	427456	3.0	0.0	3.0
+chr2	427459	0.0	7.0	7.0
+chr2	427461	0.0	1.0	1.0
+chr2	427466	1.0	0.0	1.0
+chr2	427467	2.0	0.0	2.0
+chr2	427468	0.0	2.0	2.0
+chr2	427471	0.0	3.0	3.0
+chr2	427478	4.0	0.0	4.0
+chr2	427488	0.0	1.0	1.0
+chr2	427496	1.0	0.0	1.0
+chr2	427500	0.0	1.0	1.0
+chr2	427736	0.0	1.0	1.0
+chr2	427743	0.0	1.0	1.0
+chr2	427749	1.0	0.0	1.0
+chr2	427751	0.0	3.0	3.0
+chr2	427752	1.0	0.0	1.0
+chr2	427757	2.0	0.0	2.0
+chr2	427758	1.0	0.0	1.0
+chr2	427759	0.0	1.0	1.0
+chr2	427760	5.0	0.0	5.0
+chr2	427761	0.0	2.0	2.0
+chr2	427762	0.0	1.0	1.0
+chr2	427763	1.0	0.0	1.0
+chr2	427766	0.0	2.0	2.0
+chr2	427767	1.0	2.0	3.0
+chr2	427769	6.0	0.0	6.0
+chr2	427770	0.0	2.0	2.0
+chr2	427771	1.0	0.0	1.0
+chr2	427772	1.0	1.0	2.0
+chr2	427777	0.0	6.0	6.0
+chr2	427789	0.0	1.0	1.0
+chr2	427815	1.0	0.0	1.0
+chr2	427836	1.0	0.0	1.0
+chr2	427892	1.0	0.0	1.0
+chr2	427909	2.0	0.0	2.0
+chr2	427912	0.0	1.0	1.0
+chr2	427918	1.0	0.0	1.0
+chr2	427926	1.0	0.0	1.0
+chr2	427929	0.0	2.0	2.0
+chr2	427932	0.0	1.0	1.0
+chr2	427937	0.0	1.0	1.0
+chr2	427947	1.0	0.0	1.0
+chr2	427957	0.0	2.0	2.0
+chr2	427989	0.0	2.0	2.0
+chr2	428190	0.0	1.0	1.0
+chr2	428290	0.0	1.0	1.0
+chr2	428462	1.0	0.0	1.0
+chr2	428472	1.0	0.0	1.0
+chr2	428649	0.0	1.0	1.0
+chr2	428655	1.0	0.0	1.0
+chr2	428667	1.0	0.0	1.0
+chr2	428697	0.0	1.0	1.0
+chr2	428698	0.0	2.0	2.0
+chr2	428791	1.0	0.0	1.0
+chr2	428825	1.0	0.0	1.0
+chr2	428841	1.0	0.0	1.0
+chr2	428993	0.0	1.0	1.0
+chr2	429008	1.0	0.0	1.0
+chr2	429009	1.0	0.0	1.0
+chr2	429027	0.0	1.0	1.0
+chr2	429059	1.0	0.0	1.0
+chr2	429129	1.0	0.0	1.0
+chr2	429157	0.0	3.0	3.0
+chr2	429593	0.0	1.0	1.0
+chr2	429601	0.0	3.0	3.0
+chr2	429602	1.0	0.0	1.0
+chr2	429609	0.0	1.0	1.0
+chr2	429611	0.0	2.0	2.0
+chr2	429612	0.0	3.0	3.0
+chr2	429617	0.0	2.0	2.0
+chr2	429619	1.0	0.0	1.0
+chr2	429620	0.0	2.0	2.0
+chr2	429622	0.0	1.0	1.0
+chr2	429627	0.0	1.0	1.0
+chr2	429645	0.0	1.0	1.0
+chr2	429665	1.0	0.0	1.0
+chr2	429686	1.0	0.0	1.0
+chr2	429742	1.0	0.0	1.0
+chr2	429759	0.0	1.0	1.0
+chr2	429760	2.0	0.0	2.0
+chr2	429768	1.0	0.0	1.0
+chr2	429776	1.0	0.0	1.0
+chr2	429779	0.0	2.0	2.0
+chr2	429782	0.0	1.0	1.0
+chr2	429787	0.0	1.0	1.0
+chr2	429797	1.0	0.0	1.0
+chr2	429807	0.0	2.0	2.0
+chr2	429839	0.0	2.0	2.0
+chr2	429949	0.0	1.0	1.0
+chr2	429989	1.0	0.0	1.0
+chr2	430142	0.0	1.0	1.0
+chr2	430171	1.0	0.0	1.0
+chr2	430499	0.0	1.0	1.0
+chr2	430521	1.0	0.0	1.0
+chr2	430547	0.0	1.0	1.0
+chr2	430548	0.0	2.0	2.0
+chr2	430641	1.0	0.0	1.0
+chr2	431019	1.0	0.0	1.0
+chr2	431028	1.0	0.0	1.0
+chr2	431033	1.0	0.0	1.0
+chr2	431149	3.0	0.0	3.0
+chr2	431165	0.0	1.0	1.0
+chr2	431166	0.0	1.0	1.0
+chr2	431169	0.0	1.0	1.0
+chr2	431170	1.0	0.0	1.0
+chr2	431178	0.0	3.0	3.0
+chr2	431188	0.0	1.0	1.0
+chr2	431202	1.0	0.0	1.0
+chr2	431212	1.0	0.0	1.0
+chr2	431336	0.0	1.0	1.0
+chr2	431351	0.0	1.0	1.0
+chr2	431399	1.0	0.0	1.0
+chr2	431485	1.0	0.0	1.0
+chr2	431547	0.0	1.0	1.0
+chr2	431603	0.0	1.0	1.0
+chr2	431663	0.0	1.0	1.0
+chr2	431719	0.0	1.0	1.0
+chr2	431745	0.0	1.0	1.0
+chr2	431751	0.0	1.0	1.0
+chr2	431752	1.0	0.0	1.0
+chr2	431754	3.0	0.0	3.0
+chr2	431755	2.0	0.0	2.0
+chr2	431762	0.0	3.0	3.0
+chr2	431763	1.0	1.0	2.0
+chr2	431768	1.0	0.0	1.0
+chr2	431771	0.0	1.0	1.0
+chr2	431777	0.0	1.0	1.0
+chr2	431784	1.0	0.0	1.0
+chr2	431800	0.0	1.0	1.0
+chr2	431998	1.0	0.0	1.0
+chr2	431999	1.0	0.0	1.0
+chr2	432000	0.0	2.0	2.0
+chr2	432007	0.0	1.0	1.0
+chr2	432010	1.0	1.0	2.0
+chr2	432014	0.0	1.0	1.0
+chr2	432016	1.0	0.0	1.0
+chr2	432018	2.0	0.0	2.0
+chr2	432022	0.0	3.0	3.0
+chr2	432023	1.0	0.0	1.0
+chr2	432024	2.0	0.0	2.0
+chr2	432025	0.0	1.0	1.0
+chr2	432032	2.0	0.0	2.0
+chr2	432033	1.0	0.0	1.0
+chr2	432035	0.0	5.0	5.0
+chr2	432036	0.0	2.0	2.0
+chr2	432144	0.0	1.0	1.0
+chr2	432195	2.0	0.0	2.0
+chr2	432202	0.0	2.0	2.0
+chr2	432220	0.0	1.0	1.0
+chr2	432222	0.0	1.0	1.0
+chr2	432342	0.0	1.0	1.0
+chr2	432388	0.0	1.0	1.0
+chr2	432541	1.0	0.0	1.0
+chr2	432670	0.0	1.0	1.0
+chr2	432823	1.0	0.0	1.0
+chr2	433194	1.0	0.0	1.0
+chr2	433311	1.0	0.0	1.0
+chr2	433343	1.0	0.0	1.0
+chr2	433535	0.0	1.0	1.0
+chr2	433741	0.0	1.0	1.0
+chr2	433832	0.0	1.0	1.0
+chr2	434050	0.0	1.0	1.0
+chr2	434110	0.0	1.0	1.0
+chr2	434163	0.0	1.0	1.0
+chr2	434249	1.0	0.0	1.0
+chr2	434516	1.0	0.0	1.0
+chr2	434528	0.0	2.0	2.0
+chr2	434682	1.0	0.0	1.0
+chr2	434748	0.0	1.0	1.0
+chr2	435083	1.0	0.0	1.0
+chr2	435143	0.0	1.0	1.0
+chr2	435299	1.0	0.0	1.0
+chr2	435329	1.0	0.0	1.0
+chr2	435339	0.0	1.0	1.0
+chr2	435460	1.0	0.0	1.0
+chr2	435461	1.0	0.0	1.0
+chr2	435499	1.0	0.0	1.0
+chr2	435500	1.0	0.0	1.0
+chr2	435505	1.0	0.0	1.0
+chr2	435511	1.0	0.0	1.0
+chr2	435516	0.0	1.0	1.0
+chr2	435533	0.0	1.0	1.0
+chr2	435557	1.0	0.0	1.0
+chr2	435648	1.0	1.0	2.0
+chr2	435666	0.0	1.0	1.0
+chr2	435668	1.0	0.0	1.0
+chr2	435669	4.0	0.0	4.0
+chr2	435672	1.0	0.0	1.0
+chr2	435677	0.0	1.0	1.0
+chr2	435680	0.0	1.0	1.0
+chr2	435682	4.0	0.0	4.0
+chr2	435687	0.0	1.0	1.0
+chr2	435688	0.0	1.0	1.0
+chr2	435694	2.0	1.0	3.0
+chr2	435695	0.0	1.0	1.0
+chr2	435696	2.0	0.0	2.0
+chr2	435698	0.0	4.0	4.0
+chr2	435699	0.0	2.0	2.0
+chr2	435702	0.0	2.0	2.0
+chr2	435705	0.0	1.0	1.0
+chr2	435775	0.0	1.0	1.0
+chr2	435957	0.0	2.0	2.0
+chr2	435967	1.0	0.0	1.0
+chr2	435977	1.0	0.0	1.0
+chr2	435980	0.0	2.0	2.0
+chr2	435986	1.0	0.0	1.0
+chr2	436000	2.0	0.0	2.0
+chr2	436089	1.0	0.0	1.0
+chr2	436210	0.0	1.0	1.0
+chr2	436351	0.0	1.0	1.0
+chr2	436362	0.0	1.0	1.0
+chr2	436502	0.0	1.0	1.0
+chr2	436511	1.0	0.0	1.0
+chr2	436517	0.0	1.0	1.0
+chr2	436600	0.0	1.0	1.0
+chr2	436663	1.0	0.0	1.0
+chr2	436685	1.0	0.0	1.0
+chr2	436698	0.0	1.0	1.0
+chr2	436703	0.0	1.0	1.0
+chr2	436708	1.0	0.0	1.0
+chr2	436710	0.0	1.0	1.0
+chr2	436718	1.0	0.0	1.0
+chr2	436909	1.0	0.0	1.0
+chr2	436925	0.0	2.0	2.0
+chr2	436928	0.0	2.0	2.0
+chr2	436929	0.0	1.0	1.0
+chr2	436931	0.0	1.0	1.0
+chr2	436942	0.0	1.0	1.0
+chr2	436943	0.0	1.0	1.0
+chr2	436944	2.0	0.0	2.0
+chr2	436946	1.0	0.0	1.0
+chr2	436948	0.0	1.0	1.0
+chr2	436949	1.0	0.0	1.0
+chr2	436950	3.0	0.0	3.0
+chr2	436951	4.0	0.0	4.0
+chr2	436956	0.0	2.0	2.0
+chr2	436959	1.0	0.0	1.0
+chr2	436960	0.0	4.0	4.0
+chr2	436961	1.0	2.0	3.0
+chr2	436966	0.0	1.0	1.0
+chr2	436967	4.0	0.0	4.0
+chr2	436968	0.0	1.0	1.0
+chr2	436969	0.0	1.0	1.0
+chr2	436976	1.0	0.0	1.0
+chr2	436981	1.0	0.0	1.0
+chr2	436993	1.0	0.0	1.0
+chr2	436994	1.0	0.0	1.0
+chr2	436997	1.0	0.0	1.0
+chr2	437118	1.0	0.0	1.0
+chr2	437127	0.0	1.0	1.0
+chr2	437277	1.0	0.0	1.0
+chr2	437282	1.0	0.0	1.0
+chr2	437283	0.0	1.0	1.0
+chr2	437315	1.0	0.0	1.0
+chr2	437475	0.0	1.0	1.0
+chr2	437500	1.0	0.0	1.0
+chr2	437763	0.0	1.0	1.0
+chr2	437893	0.0	1.0	1.0
+chr2	437950	1.0	0.0	1.0
+chr2	438117	1.0	0.0	1.0
+chr2	438632	0.0	1.0	1.0
+chr2	438732	1.0	0.0	1.0
+chr2	438870	0.0	1.0	1.0
+chr2	439618	1.0	0.0	1.0
+chr2	439690	0.0	1.0	1.0
+chr2	440342	1.0	0.0	1.0
+chr2	440350	1.0	0.0	1.0
+chr2	440476	1.0	0.0	1.0
+chr2	440630	0.0	1.0	1.0
+chr2	440945	0.0	1.0	1.0
+chr2	441072	0.0	1.0	1.0
+chr2	441097	1.0	0.0	1.0
+chr2	441116	0.0	1.0	1.0
+chr2	441232	0.0	1.0	1.0
+chr2	441248	1.0	0.0	1.0
+chr2	441265	1.0	0.0	1.0
+chr2	441267	0.0	1.0	1.0
+chr2	441268	0.0	1.0	1.0
+chr2	441271	1.0	0.0	1.0
+chr2	441286	1.0	1.0	2.0
+chr2	441293	0.0	1.0	1.0
+chr2	441520	0.0	1.0	1.0
+chr2	441521	0.0	4.0	4.0
+chr2	441524	1.0	0.0	1.0
+chr2	441533	0.0	2.0	2.0
+chr2	441534	1.0	0.0	1.0
+chr2	441539	0.0	4.0	4.0
+chr2	441541	1.0	0.0	1.0
+chr2	441546	1.0	0.0	1.0
+chr2	441548	2.0	0.0	2.0
+chr2	441551	0.0	1.0	1.0
+chr2	441554	0.0	1.0	1.0
+chr2	441556	3.0	0.0	3.0
+chr2	441557	0.0	1.0	1.0
+chr2	441559	3.0	0.0	3.0
+chr2	441562	0.0	1.0	1.0
+chr2	441567	1.0	0.0	1.0
+chr2	441580	1.0	0.0	1.0
+chr2	441679	1.0	0.0	1.0
+chr2	441691	2.0	2.0	4.0
+chr2	441701	3.0	0.0	3.0
+chr2	441704	0.0	2.0	2.0
+chr2	441705	2.0	0.0	2.0
+chr2	441712	0.0	1.0	1.0
+chr2	441714	0.0	2.0	2.0
+chr2	441856	0.0	1.0	1.0
+chr2	441882	0.0	1.0	1.0
+chr2	441921	0.0	1.0	1.0
+chr2	442040	1.0	0.0	1.0
+chr2	442052	1.0	0.0	1.0
+chr2	442238	1.0	0.0	1.0
+chr2	442241	1.0	0.0	1.0
+chr2	442265	0.0	1.0	1.0
+chr2	442424	1.0	0.0	1.0
+chr2	442499	0.0	1.0	1.0
+chr2	442723	0.0	1.0	1.0
+chr2	442742	0.0	1.0	1.0
+chr2	442744	0.0	1.0	1.0
+chr2	442786	1.0	0.0	1.0
+chr2	442787	1.0	0.0	1.0
+chr2	442794	1.0	0.0	1.0
+chr2	442808	1.0	0.0	1.0
+chr2	443055	1.0	0.0	1.0
+chr2	443145	2.0	0.0	2.0
+chr2	443433	1.0	0.0	1.0
+chr2	443572	2.0	0.0	2.0
+chr2	444225	0.0	1.0	1.0
+chr2	444371	0.0	2.0	2.0
+chr2	444529	1.0	0.0	1.0
+chr2	444551	1.0	0.0	1.0
+chr2	444607	0.0	1.0	1.0
+chr2	444614	0.0	1.0	1.0
+chr2	444656	0.0	1.0	1.0
+chr2	444680	0.0	1.0	1.0
+chr2	444691	0.0	1.0	1.0
+chr2	444693	0.0	1.0	1.0
+chr2	444706	1.0	0.0	1.0
+chr2	444713	0.0	1.0	1.0
+chr2	444723	1.0	0.0	1.0
+chr2	444983	1.0	0.0	1.0
+chr2	444991	1.0	0.0	1.0
+chr2	444994	2.0	0.0	2.0
+chr2	445003	0.0	1.0	1.0
+chr2	445005	0.0	1.0	1.0
+chr2	445008	0.0	1.0	1.0
+chr2	445020	0.0	1.0	1.0
+chr2	445061	0.0	1.0	1.0
+chr2	445118	0.0	1.0	1.0
+chr2	445130	1.0	0.0	1.0
+chr2	445175	0.0	1.0	1.0
+chr2	445205	2.0	0.0	2.0
+chr2	445326	1.0	0.0	1.0
+chr2	445358	0.0	1.0	1.0
+chr2	445362	1.0	0.0	1.0
+chr2	446052	0.0	2.0	2.0
+chr2	446056	1.0	0.0	1.0
+chr2	446823	0.0	1.0	1.0
+chr2	446989	1.0	0.0	1.0
+chr2	446990	0.0	1.0	1.0
+chr2	447131	0.0	1.0	1.0
+chr2	447163	3.0	0.0	3.0
+chr2	447176	1.0	0.0	1.0
+chr2	447184	1.0	0.0	1.0
+chr2	447286	0.0	1.0	1.0
+chr2	447292	1.0	0.0	1.0
+chr2	447300	0.0	1.0	1.0
+chr2	447309	0.0	1.0	1.0
+chr2	447316	0.0	1.0	1.0
+chr2	447318	1.0	0.0	1.0
+chr2	447319	6.0	0.0	6.0
+chr2	447321	0.0	2.0	2.0
+chr2	447325	1.0	0.0	1.0
+chr2	447329	0.0	6.0	6.0
+chr2	447330	0.0	5.0	5.0
+chr2	447331	3.0	1.0	4.0
+chr2	447333	0.0	1.0	1.0
+chr2	447334	1.0	0.0	1.0
+chr2	447336	2.0	0.0	2.0
+chr2	447337	0.0	1.0	1.0
+chr2	447340	1.0	0.0	1.0
+chr2	447342	0.0	1.0	1.0
+chr2	447492	1.0	0.0	1.0
+chr2	447550	1.0	0.0	1.0
+chr2	447557	0.0	1.0	1.0
+chr2	447581	0.0	1.0	1.0
+chr2	447582	0.0	1.0	1.0
+chr2	447583	1.0	0.0	1.0
+chr2	447587	0.0	2.0	2.0
+chr2	447592	2.0	1.0	3.0
+chr2	447594	1.0	0.0	1.0
+chr2	447598	0.0	1.0	1.0
+chr2	447600	4.0	0.0	4.0
+chr2	447602	0.0	1.0	1.0
+chr2	447606	0.0	1.0	1.0
+chr2	447607	0.0	2.0	2.0
+chr2	447610	2.0	0.0	2.0
+chr2	447611	0.0	3.0	3.0
+chr2	447623	0.0	2.0	2.0
+chr2	447629	1.0	0.0	1.0
+chr2	447637	0.0	1.0	1.0
+chr2	447730	0.0	1.0	1.0
+chr2	447737	0.0	1.0	1.0
+chr2	447749	4.0	0.0	4.0
+chr2	447752	3.0	2.0	5.0
+chr2	447753	5.0	0.0	5.0
+chr2	447762	1.0	0.0	1.0
+chr2	447766	1.0	0.0	1.0
+chr2	447781	0.0	1.0	1.0
+chr2	447785	2.0	0.0	2.0
+chr2	447788	0.0	1.0	1.0
+chr2	447793	1.0	0.0	1.0
+chr2	447799	1.0	0.0	1.0
+chr2	447808	0.0	1.0	1.0
+chr2	447909	3.0	0.0	3.0
+chr2	447937	1.0	0.0	1.0
+chr2	447954	0.0	1.0	1.0
+chr2	448067	0.0	2.0	2.0
+chr2	448430	1.0	0.0	1.0
+chr2	448448	0.0	1.0	1.0
+chr2	448555	0.0	3.0	3.0
+chr2	448580	1.0	0.0	1.0
+chr2	448588	0.0	1.0	1.0
+chr2	448903	1.0	0.0	1.0
+chr2	448906	0.0	1.0	1.0
+chr2	448907	0.0	1.0	1.0
+chr2	448944	2.0	0.0	2.0
+chr2	449073	0.0	1.0	1.0
+chr2	449086	0.0	2.0	2.0
+chr2	449103	0.0	1.0	1.0
+chr2	449113	2.0	0.0	2.0
+chr2	449233	0.0	1.0	1.0
+chr2	449242	0.0	1.0	1.0
+chr2	449244	1.0	0.0	1.0
+chr2	449245	1.0	0.0	1.0
+chr2	449247	0.0	1.0	1.0
+chr2	449249	0.0	1.0	1.0
+chr2	449250	2.0	0.0	2.0
+chr2	449251	2.0	1.0	3.0
+chr2	449254	2.0	1.0	3.0
+chr2	449255	1.0	2.0	3.0
+chr2	449256	1.0	0.0	1.0
+chr2	449257	2.0	0.0	2.0
+chr2	449259	1.0	0.0	1.0
+chr2	449260	0.0	2.0	2.0
+chr2	449265	0.0	2.0	2.0
+chr2	449267	0.0	1.0	1.0
+chr2	449273	2.0	0.0	2.0
+chr2	449274	0.0	1.0	1.0
+chr2	449277	1.0	0.0	1.0
+chr2	449278	1.0	1.0	2.0
+chr2	449285	0.0	2.0	2.0
+chr2	449295	2.0	0.0	2.0
+chr2	449304	1.0	0.0	1.0
+chr2	449311	0.0	1.0	1.0
+chr2	449512	0.0	1.0	1.0
+chr2	449542	1.0	0.0	1.0
+chr2	449568	0.0	1.0	1.0
+chr2	449588	0.0	1.0	1.0
+chr2	449722	0.0	1.0	1.0
+chr2	449730	0.0	1.0	1.0
+chr2	449737	2.0	0.0	2.0
+chr2	449739	1.0	0.0	1.0
+chr2	449751	0.0	1.0	1.0
+chr2	449884	0.0	1.0	1.0
+chr2	449901	1.0	0.0	1.0
+chr2	449939	0.0	1.0	1.0
+chr2	449971	1.0	0.0	1.0
+chr2	450048	0.0	1.0	1.0
+chr2	450101	1.0	0.0	1.0
+chr2	450130	0.0	1.0	1.0
+chr2	450365	2.0	0.0	2.0
+chr2	450384	0.0	1.0	1.0
+chr2	450451	0.0	1.0	1.0
+chr2	450506	1.0	0.0	1.0
+chr2	450970	0.0	1.0	1.0
+chr2	451022	0.0	1.0	1.0
+chr2	451185	0.0	1.0	1.0
+chr2	451383	0.0	1.0	1.0
+chr2	451677	1.0	0.0	1.0
+chr2	451880	1.0	0.0	1.0
+chr2	451904	1.0	0.0	1.0
+chr2	451906	0.0	1.0	1.0
+chr2	451922	1.0	0.0	1.0
+chr2	451924	0.0	1.0	1.0
+chr2	452059	1.0	0.0	1.0
+chr2	452088	0.0	1.0	1.0
+chr2	452091	1.0	0.0	1.0
+chr2	452643	2.0	1.0	3.0
+chr2	452648	1.0	0.0	1.0
+chr2	452656	1.0	0.0	1.0
+chr2	452660	1.0	2.0	3.0
+chr2	452661	1.0	0.0	1.0
+chr2	452686	1.0	0.0	1.0
+chr2	452927	0.0	1.0	1.0
+chr2	453120	1.0	0.0	1.0
+chr2	453176	0.0	1.0	1.0
+chr2	453182	0.0	1.0	1.0
+chr2	453185	0.0	1.0	1.0
+chr2	453427	0.0	1.0	1.0
+chr2	453617	0.0	1.0	1.0
+chr2	453623	0.0	1.0	1.0
+chr2	453630	0.0	1.0	1.0
+chr2	453642	0.0	3.0	3.0
+chr2	453645	1.0	0.0	1.0
+chr2	453658	2.0	0.0	2.0
+chr2	453722	1.0	0.0	1.0
+chr2	453789	0.0	1.0	1.0
+chr2	453910	0.0	1.0	1.0
+chr2	453942	0.0	1.0	1.0
+chr2	453952	1.0	0.0	1.0
+chr2	453973	1.0	0.0	1.0
+chr2	454023	1.0	0.0	1.0
+chr2	454054	0.0	1.0	1.0
+chr2	454080	0.0	1.0	1.0
+chr2	454171	1.0	0.0	1.0
+chr2	454185	1.0	0.0	1.0
+chr2	454243	0.0	1.0	1.0
+chr2	454347	0.0	1.0	1.0
+chr2	454360	1.0	0.0	1.0
+chr2	454500	0.0	1.0	1.0
+chr2	454503	0.0	1.0	1.0
+chr2	454511	1.0	0.0	1.0
+chr2	454517	1.0	1.0	2.0
+chr2	454518	2.0	0.0	2.0
+chr2	454521	0.0	1.0	1.0
+chr2	454523	0.0	4.0	4.0
+chr2	454524	3.0	0.0	3.0
+chr2	454528	1.0	0.0	1.0
+chr2	454530	1.0	0.0	1.0
+chr2	454531	0.0	1.0	1.0
+chr2	454532	0.0	1.0	1.0
+chr2	454533	1.0	0.0	1.0
+chr2	454535	1.0	0.0	1.0
+chr2	454536	0.0	4.0	4.0
+chr2	454538	0.0	2.0	2.0
+chr2	454540	3.0	0.0	3.0
+chr2	454541	1.0	0.0	1.0
+chr2	454548	1.0	0.0	1.0
+chr2	454556	0.0	1.0	1.0
+chr2	454571	0.0	1.0	1.0
+chr2	454622	0.0	1.0	1.0
+chr2	454811	3.0	0.0	3.0
+chr2	454817	0.0	1.0	1.0
+chr2	454818	6.0	0.0	6.0
+chr2	454824	0.0	1.0	1.0
+chr2	454826	2.0	0.0	2.0
+chr2	454828	0.0	1.0	1.0
+chr2	454831	1.0	0.0	1.0
+chr2	454833	0.0	1.0	1.0
+chr2	454839	1.0	0.0	1.0
+chr2	454841	0.0	1.0	1.0
+chr2	454842	0.0	1.0	1.0
+chr2	454843	0.0	1.0	1.0
+chr2	454844	3.0	0.0	3.0
+chr2	454850	1.0	0.0	1.0
+chr2	454998	0.0	2.0	2.0
+chr2	455013	0.0	1.0	1.0
+chr2	455163	1.0	0.0	1.0
+chr2	455476	0.0	1.0	1.0
+chr2	455482	0.0	1.0	1.0
+chr2	455568	1.0	0.0	1.0
+chr2	455630	1.0	0.0	1.0
+chr2	455647	1.0	0.0	1.0
+chr2	455665	1.0	0.0	1.0
+chr2	455666	0.0	1.0	1.0
+chr2	455812	1.0	0.0	1.0
+chr2	455967	1.0	0.0	1.0
+chr2	456037	0.0	1.0	1.0
+chr2	456084	0.0	1.0	1.0
+chr2	456145	1.0	0.0	1.0
+chr2	456167	0.0	1.0	1.0
+chr2	456186	1.0	0.0	1.0
+chr2	456357	0.0	1.0	1.0
+chr2	456474	0.0	1.0	1.0
+chr2	456658	0.0	1.0	1.0
+chr2	457023	1.0	0.0	1.0
+chr2	457225	0.0	1.0	1.0
+chr2	457234	1.0	0.0	1.0
+chr2	457358	1.0	0.0	1.0
+chr2	457383	1.0	0.0	1.0
+chr2	457393	0.0	1.0	1.0
+chr2	457528	0.0	1.0	1.0
+chr2	457543	1.0	0.0	1.0
+chr2	457545	1.0	0.0	1.0
+chr2	457574	0.0	1.0	1.0
+chr2	457578	1.0	0.0	1.0
+chr2	458068	1.0	0.0	1.0
+chr2	458108	0.0	1.0	1.0
+chr2	458165	0.0	1.0	1.0
+chr2	458192	1.0	0.0	1.0
+chr2	458196	0.0	1.0	1.0
+chr2	458198	2.0	0.0	2.0
+chr2	458321	1.0	0.0	1.0
+chr2	458339	1.0	0.0	1.0
+chr2	458349	1.0	0.0	1.0
+chr2	458374	0.0	1.0	1.0
+chr2	458394	2.0	0.0	2.0
+chr2	458395	1.0	0.0	1.0
+chr2	458606	0.0	1.0	1.0
+chr2	458615	0.0	3.0	3.0
+chr2	458618	1.0	0.0	1.0
+chr2	458622	1.0	0.0	1.0
+chr2	458623	0.0	1.0	1.0
+chr2	458627	0.0	1.0	1.0
+chr2	458628	0.0	1.0	1.0
+chr2	458644	0.0	1.0	1.0
+chr2	458655	0.0	1.0	1.0
+chr2	458665	0.0	1.0	1.0
+chr2	458669	0.0	1.0	1.0
+chr2	458672	0.0	1.0	1.0
+chr2	458686	1.0	0.0	1.0
+chr2	458705	1.0	0.0	1.0
+chr2	458826	0.0	1.0	1.0
+chr2	458827	0.0	1.0	1.0
+chr2	458834	1.0	0.0	1.0
+chr2	458847	0.0	1.0	1.0
+chr2	458848	0.0	1.0	1.0
+chr2	458850	1.0	0.0	1.0
+chr2	458852	1.0	1.0	2.0
+chr2	458853	0.0	2.0	2.0
+chr2	458861	0.0	1.0	1.0
+chr2	459019	2.0	0.0	2.0
+chr2	459022	0.0	1.0	1.0
+chr2	459023	1.0	0.0	1.0
+chr2	459034	2.0	1.0	3.0
+chr2	459045	0.0	1.0	1.0
+chr2	459049	0.0	2.0	2.0
+chr2	459067	0.0	1.0	1.0
+chr2	459184	0.0	1.0	1.0
+chr2	459304	0.0	1.0	1.0
+chr2	459317	0.0	1.0	1.0
+chr2	459333	1.0	0.0	1.0
+chr2	459361	1.0	0.0	1.0
+chr2	460009	0.0	1.0	1.0
+chr2	460138	1.0	0.0	1.0
+chr2	460162	0.0	1.0	1.0
+chr2	460180	1.0	0.0	1.0
+chr2	460288	1.0	0.0	1.0
+chr2	460419	0.0	1.0	1.0
+chr2	460442	1.0	0.0	1.0
+chr2	460444	0.0	1.0	1.0
+chr2	460466	3.0	0.0	3.0
+chr2	460485	1.0	0.0	1.0
+chr2	460501	0.0	1.0	1.0
+chr2	460631	0.0	1.0	1.0
+chr2	460632	1.0	0.0	1.0
+chr2	460643	0.0	1.0	1.0
+chr2	460662	0.0	1.0	1.0
+chr2	460665	0.0	1.0	1.0
+chr2	460666	0.0	1.0	1.0
+chr2	460681	1.0	0.0	1.0
+chr2	460684	1.0	0.0	1.0
+chr2	460707	0.0	1.0	1.0
+chr2	460713	0.0	1.0	1.0
+chr2	460757	1.0	0.0	1.0
+chr2	460834	0.0	1.0	1.0
+chr2	460836	1.0	0.0	1.0
+chr2	460840	1.0	0.0	1.0
+chr2	460845	1.0	0.0	1.0
+chr2	460851	0.0	1.0	1.0
+chr2	460854	1.0	0.0	1.0
+chr2	460859	0.0	2.0	2.0
+chr2	460869	0.0	1.0	1.0
+chr2	460881	1.0	1.0	2.0
+chr2	461015	1.0	0.0	1.0
+chr2	461018	1.0	0.0	1.0
+chr2	461023	1.0	0.0	1.0
+chr2	461086	1.0	0.0	1.0
+chr2	461179	1.0	0.0	1.0
+chr2	461206	0.0	1.0	1.0
+chr2	461207	1.0	0.0	1.0
+chr2	461514	0.0	1.0	1.0
+chr2	461528	1.0	0.0	1.0
+chr2	461529	1.0	0.0	1.0
+chr2	461544	0.0	1.0	1.0
+chr2	461546	0.0	1.0	1.0
+chr2	461547	1.0	1.0	2.0
+chr2	461696	0.0	1.0	1.0
+chr2	461698	1.0	0.0	1.0
+chr2	461703	2.0	0.0	2.0
+chr2	461708	0.0	1.0	1.0
+chr2	461718	0.0	1.0	1.0
+chr2	461737	0.0	1.0	1.0
+chr2	461865	1.0	0.0	1.0
+chr2	461876	0.0	3.0	3.0
+chr2	461899	0.0	2.0	2.0
+chr2	461906	1.0	0.0	1.0
+chr2	461907	1.0	0.0	1.0
+chr2	461908	0.0	1.0	1.0
+chr2	461931	0.0	1.0	1.0
+chr2	461940	0.0	1.0	1.0
+chr2	462060	1.0	0.0	1.0
+chr2	462100	0.0	1.0	1.0
+chr2	462117	1.0	0.0	1.0
+chr2	462120	0.0	1.0	1.0
+chr2	462123	0.0	1.0	1.0
+chr2	462132	1.0	0.0	1.0
+chr2	462138	0.0	1.0	1.0
+chr2	462139	1.0	0.0	1.0
+chr2	462145	2.0	0.0	2.0
+chr2	462146	0.0	1.0	1.0
+chr2	462151	0.0	1.0	1.0
+chr2	462155	2.0	0.0	2.0
+chr2	462157	1.0	0.0	1.0
+chr2	462158	0.0	4.0	4.0
+chr2	462160	0.0	1.0	1.0
+chr2	462165	1.0	0.0	1.0
+chr2	462166	3.0	0.0	3.0
+chr2	462167	0.0	1.0	1.0
+chr2	462168	0.0	1.0	1.0
+chr2	462169	0.0	1.0	1.0
+chr2	462175	0.0	2.0	2.0
+chr2	462178	1.0	0.0	1.0
+chr2	462260	1.0	0.0	1.0
+chr2	462318	0.0	1.0	1.0
+chr2	462333	1.0	0.0	1.0
+chr2	462341	0.0	1.0	1.0
+chr2	462353	0.0	1.0	1.0
+chr2	462375	1.0	0.0	1.0
+chr2	462451	0.0	1.0	1.0
+chr2	463124	1.0	0.0	1.0
+chr2	463141	2.0	0.0	2.0
+chr2	464100	0.0	1.0	1.0
+chr2	464104	0.0	1.0	1.0
+chr2	464124	0.0	1.0	1.0
+chr2	464160	0.0	1.0	1.0
+chr2	464172	0.0	1.0	1.0
+chr2	464178	0.0	1.0	1.0
+chr2	464190	0.0	1.0	1.0
+chr2	464214	0.0	1.0	1.0
+chr2	465237	0.0	1.0	1.0
+chr2	465345	0.0	1.0	1.0
+chr2	465687	1.0	0.0	1.0
+chr2	465698	0.0	1.0	1.0
+chr2	465726	0.0	1.0	1.0
+chr2	465856	0.0	1.0	1.0
+chr2	465859	1.0	0.0	1.0
+chr2	465873	0.0	1.0	1.0
+chr2	465894	1.0	0.0	1.0
+chr2	465901	0.0	1.0	1.0
+chr2	465924	0.0	1.0	1.0
+chr2	465925	0.0	1.0	1.0
+chr2	465966	1.0	0.0	1.0
+chr2	466650	0.0	1.0	1.0
+chr2	466687	1.0	0.0	1.0
+chr2	466703	0.0	1.0	1.0
+chr2	466818	1.0	0.0	1.0
+chr2	466874	0.0	1.0	1.0
+chr2	466880	0.0	1.0	1.0
+chr2	467129	0.0	1.0	1.0
+chr2	467132	1.0	0.0	1.0
+chr2	467181	0.0	1.0	1.0
+chr2	467186	0.0	1.0	1.0
+chr2	467189	1.0	0.0	1.0
+chr2	467196	1.0	0.0	1.0
+chr2	467197	1.0	0.0	1.0
+chr2	467198	3.0	0.0	3.0
+chr2	467200	0.0	1.0	1.0
+chr2	467201	1.0	0.0	1.0
+chr2	467204	0.0	1.0	1.0
+chr2	467205	0.0	1.0	1.0
+chr2	467207	1.0	0.0	1.0
+chr2	467208	1.0	0.0	1.0
+chr2	467210	4.0	0.0	4.0
+chr2	467214	0.0	2.0	2.0
+chr2	467215	0.0	3.0	3.0
+chr2	467216	0.0	1.0	1.0
+chr2	467217	0.0	1.0	1.0
+chr2	467219	0.0	1.0	1.0
+chr2	467220	1.0	0.0	1.0
+chr2	467221	3.0	0.0	3.0
+chr2	467222	3.0	4.0	7.0
+chr2	467223	0.0	1.0	1.0
+chr2	467224	0.0	5.0	5.0
+chr2	467225	0.0	3.0	3.0
+chr2	467230	5.0	0.0	5.0
+chr2	467231	7.0	0.0	7.0
+chr2	467255	2.0	0.0	2.0
+chr2	467368	0.0	1.0	1.0
+chr2	467374	0.0	2.0	2.0
+chr2	467380	4.0	0.0	4.0
+chr2	467387	2.0	0.0	2.0
+chr2	467392	0.0	1.0	1.0
+chr2	467398	1.0	0.0	1.0
+chr2	467399	1.0	0.0	1.0
+chr2	467401	1.0	0.0	1.0
+chr2	467402	0.0	1.0	1.0
+chr2	467469	2.0	0.0	2.0
+chr2	467554	1.0	0.0	1.0
+chr2	467565	0.0	1.0	1.0
+chr2	467570	0.0	1.0	1.0
+chr2	467580	0.0	1.0	1.0
+chr2	467739	1.0	0.0	1.0
+chr2	467743	1.0	0.0	1.0
+chr2	467861	0.0	1.0	1.0
+chr2	467904	0.0	2.0	2.0
+chr2	468052	1.0	0.0	1.0
+chr2	468054	0.0	1.0	1.0
+chr2	468208	1.0	0.0	1.0
+chr2	468266	2.0	0.0	2.0
+chr2	468567	0.0	1.0	1.0
+chr2	468881	2.0	0.0	2.0
+chr2	468965	1.0	0.0	1.0
+chr2	469077	2.0	0.0	2.0
+chr2	469112	0.0	1.0	1.0
+chr2	469302	0.0	1.0	1.0
+chr2	469306	1.0	0.0	1.0
+chr2	469323	0.0	1.0	1.0
+chr2	469492	1.0	0.0	1.0
+chr2	469618	0.0	1.0	1.0
+chr2	470071	0.0	1.0	1.0
+chr2	470237	0.0	1.0	1.0
+chr2	470736	1.0	0.0	1.0
+chr2	471297	1.0	0.0	1.0
+chr2	471455	1.0	0.0	1.0
+chr2	471603	1.0	0.0	1.0
+chr2	471614	0.0	1.0	1.0
+chr2	472501	1.0	0.0	1.0
+chr2	472733	0.0	1.0	1.0
+chr2	472984	0.0	1.0	1.0
+chr2	473013	0.0	2.0	2.0
+chr2	473317	0.0	1.0	1.0
+chr2	473477	1.0	0.0	1.0
+chr2	473493	1.0	0.0	1.0
+chr2	473776	0.0	1.0	1.0
+chr2	473796	2.0	0.0	2.0
+chr2	473801	2.0	0.0	2.0
+chr2	473819	0.0	3.0	3.0
+chr2	473820	1.0	0.0	1.0
+chr2	473851	2.0	0.0	2.0
+chr2	474011	0.0	1.0	1.0
+chr2	474330	0.0	1.0	1.0
+chr2	474335	1.0	0.0	1.0
+chr2	474341	1.0	1.0	2.0
+chr2	474342	1.0	0.0	1.0
+chr2	474345	1.0	0.0	1.0
+chr2	474346	1.0	0.0	1.0
+chr2	474347	0.0	1.0	1.0
+chr2	474354	0.0	1.0	1.0
+chr2	474356	0.0	2.0	2.0
+chr2	474359	0.0	1.0	1.0
+chr2	474360	0.0	2.0	2.0
+chr2	474396	1.0	0.0	1.0
+chr2	474503	0.0	1.0	1.0
+chr2	474513	1.0	0.0	1.0
+chr2	474544	0.0	1.0	1.0
+chr2	474555	0.0	2.0	2.0
+chr2	474577	1.0	0.0	1.0
+chr2	474597	1.0	0.0	1.0
+chr2	474654	0.0	1.0	1.0
+chr2	474788	0.0	1.0	1.0
+chr2	474810	0.0	1.0	1.0
+chr2	474838	1.0	0.0	1.0
+chr2	474841	0.0	1.0	1.0
+chr2	474845	1.0	1.0	2.0
+chr2	474864	0.0	1.0	1.0
+chr2	474904	0.0	1.0	1.0
+chr2	474930	1.0	0.0	1.0
+chr2	474994	0.0	1.0	1.0
+chr2	475012	1.0	0.0	1.0
+chr2	475029	1.0	0.0	1.0
+chr2	475066	1.0	0.0	1.0
+chr2	475124	1.0	0.0	1.0
+chr2	475141	1.0	0.0	1.0
+chr2	475164	1.0	0.0	1.0
+chr2	475235	1.0	0.0	1.0
+chr2	475354	0.0	1.0	1.0
+chr2	475403	0.0	1.0	1.0
+chr2	475529	0.0	1.0	1.0
+chr2	475621	1.0	0.0	1.0
+chr2	475677	0.0	1.0	1.0
+chr2	475702	0.0	1.0	1.0
+chr2	475725	1.0	0.0	1.0
+chr2	475730	0.0	1.0	1.0
+chr2	475791	0.0	1.0	1.0
+chr2	475823	0.0	1.0	1.0
+chr2	475897	1.0	0.0	1.0
+chr2	475932	0.0	1.0	1.0
+chr2	475977	0.0	1.0	1.0
+chr2	475987	0.0	1.0	1.0
+chr2	476111	0.0	1.0	1.0
+chr2	476160	0.0	1.0	1.0
+chr2	476247	1.0	0.0	1.0
+chr2	476269	1.0	0.0	1.0
+chr2	476270	0.0	1.0	1.0
+chr2	476276	0.0	1.0	1.0
+chr2	476279	1.0	0.0	1.0
+chr2	476282	1.0	0.0	1.0
+chr2	476463	2.0	0.0	2.0
+chr2	476469	1.0	0.0	1.0
+chr2	476481	1.0	0.0	1.0
+chr2	476593	0.0	1.0	1.0
+chr2	476599	1.0	1.0	2.0
+chr2	476612	1.0	0.0	1.0
+chr2	476613	3.0	0.0	3.0
+chr2	476614	0.0	7.0	7.0
+chr2	476622	5.0	0.0	5.0
+chr2	476623	1.0	0.0	1.0
+chr2	476624	2.0	0.0	2.0
+chr2	476632	2.0	0.0	2.0
+chr2	476633	1.0	0.0	1.0
+chr2	476642	0.0	1.0	1.0
+chr2	476647	1.0	0.0	1.0
+chr2	476648	2.0	0.0	2.0
+chr2	476655	1.0	10.0	11.0
+chr2	476656	0.0	6.0	6.0
+chr2	476667	1.0	0.0	1.0
+chr2	476669	2.0	0.0	2.0
+chr2	476690	1.0	0.0	1.0
+chr2	476846	0.0	1.0	1.0
+chr2	476899	1.0	0.0	1.0
+chr2	477690	0.0	1.0	1.0
+chr2	478313	1.0	0.0	1.0
+chr2	478448	0.0	1.0	1.0
+chr2	478766	0.0	1.0	1.0
+chr2	478899	0.0	1.0	1.0
+chr2	479143	0.0	1.0	1.0
+chr2	479315	2.0	0.0	2.0
+chr2	479331	1.0	2.0	3.0
+chr2	479338	0.0	1.0	1.0
+chr2	479341	0.0	1.0	1.0
+chr2	479345	0.0	1.0	1.0
+chr2	479346	0.0	1.0	1.0
+chr2	479353	1.0	0.0	1.0
+chr2	479533	0.0	1.0	1.0
+chr2	479556	0.0	1.0	1.0
+chr2	479660	0.0	1.0	1.0
+chr2	479664	1.0	0.0	1.0
+chr2	479665	0.0	1.0	1.0
+chr2	479671	1.0	0.0	1.0
+chr2	479685	1.0	0.0	1.0
+chr2	479719	0.0	1.0	1.0
+chr2	479864	1.0	0.0	1.0
+chr2	479905	1.0	0.0	1.0
+chr2	479917	1.0	0.0	1.0
+chr2	480077	1.0	0.0	1.0
+chr2	480163	0.0	1.0	1.0
+chr2	480203	0.0	1.0	1.0
+chr2	480231	1.0	0.0	1.0
+chr2	480777	1.0	1.0	2.0
+chr2	480784	0.0	1.0	1.0
+chr2	480792	0.0	1.0	1.0
+chr2	480878	0.0	1.0	1.0
+chr2	480895	0.0	1.0	1.0
+chr2	480899	0.0	1.0	1.0
+chr2	480916	1.0	0.0	1.0
+chr2	480919	0.0	1.0	1.0
+chr2	480926	0.0	1.0	1.0
+chr2	480933	1.0	0.0	1.0
+chr2	480934	1.0	0.0	1.0
+chr2	480935	0.0	1.0	1.0
+chr2	480943	0.0	1.0	1.0
+chr2	480945	2.0	0.0	2.0
+chr2	480946	1.0	0.0	1.0
+chr2	480947	1.0	0.0	1.0
+chr2	480948	0.0	1.0	1.0
+chr2	480952	0.0	2.0	2.0
+chr2	480953	0.0	1.0	1.0
+chr2	480954	1.0	0.0	1.0
+chr2	480955	0.0	1.0	1.0
+chr2	480956	1.0	1.0	2.0
+chr2	480957	1.0	0.0	1.0
+chr2	480967	1.0	0.0	1.0
+chr2	480993	1.0	0.0	1.0
+chr2	480999	1.0	0.0	1.0
+chr2	481221	1.0	0.0	1.0
+chr2	481373	1.0	0.0	1.0
+chr2	481468	0.0	1.0	1.0
+chr2	481594	0.0	1.0	1.0
+chr2	481933	1.0	0.0	1.0
+chr2	482534	1.0	0.0	1.0
+chr2	482791	1.0	0.0	1.0
+chr2	482908	0.0	1.0	1.0
+chr2	482979	1.0	0.0	1.0
+chr2	483086	0.0	1.0	1.0
+chr2	483115	0.0	1.0	1.0
+chr2	483137	1.0	0.0	1.0
+chr2	483266	0.0	1.0	1.0
+chr2	483306	0.0	1.0	1.0
+chr2	483316	0.0	1.0	1.0
+chr2	483498	1.0	0.0	1.0
+chr2	483698	1.0	0.0	1.0
+chr2	483699	0.0	1.0	1.0
+chr2	483740	1.0	0.0	1.0
+chr2	483744	0.0	2.0	2.0
+chr2	483745	0.0	1.0	1.0
+chr2	483750	1.0	0.0	1.0
+chr2	483756	0.0	1.0	1.0
+chr2	483762	1.0	0.0	1.0
+chr2	483766	1.0	1.0	2.0
+chr2	483774	1.0	0.0	1.0
+chr2	483784	0.0	1.0	1.0
+chr2	483798	1.0	0.0	1.0
+chr2	483907	0.0	1.0	1.0
+chr2	483960	1.0	0.0	1.0
+chr2	484141	1.0	0.0	1.0
+chr2	484183	0.0	2.0	2.0
+chr2	484193	0.0	1.0	1.0
+chr2	484197	1.0	0.0	1.0
+chr2	484237	0.0	2.0	2.0
+chr2	484285	0.0	1.0	1.0
+chr2	484300	0.0	2.0	2.0
+chr2	484326	0.0	1.0	1.0
+chr2	484451	2.0	0.0	2.0
+chr2	484460	0.0	2.0	2.0
+chr2	484469	0.0	1.0	1.0
+chr2	484470	2.0	0.0	2.0
+chr2	484476	1.0	1.0	2.0
+chr2	484480	0.0	4.0	4.0
+chr2	484481	1.0	3.0	4.0
+chr2	484482	2.0	1.0	3.0
+chr2	484483	5.0	0.0	5.0
+chr2	484484	5.0	1.0	6.0
+chr2	484485	0.0	5.0	5.0
+chr2	484489	0.0	4.0	4.0
+chr2	484490	1.0	0.0	1.0
+chr2	484491	0.0	1.0	1.0
+chr2	484494	1.0	0.0	1.0
+chr2	484496	5.0	4.0	9.0
+chr2	484497	0.0	2.0	2.0
+chr2	484505	1.0	0.0	1.0
+chr2	484514	2.0	0.0	2.0
+chr2	484524	1.0	0.0	1.0
+chr2	484702	0.0	1.0	1.0
+chr2	484738	0.0	1.0	1.0
+chr2	484739	0.0	1.0	1.0
+chr2	484744	1.0	0.0	1.0
+chr2	484761	1.0	0.0	1.0
+chr2	484762	1.0	0.0	1.0
+chr2	484765	1.0	0.0	1.0
+chr2	484770	1.0	3.0	4.0
+chr2	484777	0.0	1.0	1.0
+chr2	484798	0.0	1.0	1.0
+chr2	484800	2.0	0.0	2.0
+chr2	484801	0.0	1.0	1.0
+chr2	484810	1.0	0.0	1.0
+chr2	484814	0.0	1.0	1.0
+chr2	484826	0.0	1.0	1.0
+chr2	484919	0.0	1.0	1.0
+chr2	484920	1.0	1.0	2.0
+chr2	484926	1.0	0.0	1.0
+chr2	484927	0.0	2.0	2.0
+chr2	484946	0.0	3.0	3.0
+chr2	484950	0.0	1.0	1.0
+chr2	484963	0.0	1.0	1.0
+chr2	485080	1.0	0.0	1.0
+chr2	485102	1.0	0.0	1.0
+chr2	485111	0.0	1.0	1.0
+chr2	485234	0.0	1.0	1.0
+chr2	485386	1.0	0.0	1.0
+chr2	485862	0.0	1.0	1.0
+chr2	486037	1.0	0.0	1.0
+chr2	486047	1.0	0.0	1.0
+chr2	486342	0.0	1.0	1.0
+chr2	486358	0.0	1.0	1.0
+chr2	486378	1.0	0.0	1.0
+chr2	486470	1.0	0.0	1.0
+chr2	486481	0.0	1.0	1.0
+chr2	486492	0.0	1.0	1.0
+chr2	486495	2.0	0.0	2.0
+chr2	486498	0.0	1.0	1.0
+chr2	486506	0.0	1.0	1.0
+chr2	486508	1.0	0.0	1.0
+chr2	486525	0.0	1.0	1.0
+chr2	486526	0.0	1.0	1.0
+chr2	486574	0.0	2.0	2.0
+chr2	486643	1.0	0.0	1.0
+chr2	486644	0.0	1.0	1.0
+chr2	486649	0.0	2.0	2.0
+chr2	486650	0.0	1.0	1.0
+chr2	486684	0.0	1.0	1.0
+chr2	486690	1.0	0.0	1.0
+chr2	486693	2.0	0.0	2.0
+chr2	486700	0.0	1.0	1.0
+chr2	486704	0.0	2.0	2.0
+chr2	486708	0.0	1.0	1.0
+chr2	486710	0.0	1.0	1.0
+chr2	486714	1.0	0.0	1.0
+chr2	487147	1.0	0.0	1.0
+chr2	487298	0.0	1.0	1.0
+chr2	487594	1.0	0.0	1.0
+chr2	487687	1.0	0.0	1.0
+chr2	487696	0.0	1.0	1.0
+chr2	487819	1.0	0.0	1.0
+chr2	487820	1.0	0.0	1.0
+chr2	487832	1.0	0.0	1.0
+chr2	488092	1.0	0.0	1.0
+chr2	488166	1.0	0.0	1.0
+chr2	488177	0.0	1.0	1.0
+chr2	488309	0.0	1.0	1.0
+chr2	488324	1.0	0.0	1.0
+chr2	488329	2.0	0.0	2.0
+chr2	488344	0.0	1.0	1.0
+chr2	488353	1.0	0.0	1.0
+chr2	488417	0.0	1.0	1.0
+chr2	488462	0.0	1.0	1.0
+chr2	488478	0.0	2.0	2.0
+chr2	488487	0.0	1.0	1.0
+chr2	488489	0.0	1.0	1.0
+chr2	488491	1.0	0.0	1.0
+chr2	488498	0.0	1.0	1.0
+chr2	488502	3.0	0.0	3.0
+chr2	488506	0.0	1.0	1.0
+chr2	488507	0.0	1.0	1.0
+chr2	488509	2.0	5.0	7.0
+chr2	488511	1.0	0.0	1.0
+chr2	488512	3.0	0.0	3.0
+chr2	488515	0.0	1.0	1.0
+chr2	488516	0.0	2.0	2.0
+chr2	488517	0.0	1.0	1.0
+chr2	488518	0.0	2.0	2.0
+chr2	488519	0.0	2.0	2.0
+chr2	488525	1.0	0.0	1.0
+chr2	488526	0.0	4.0	4.0
+chr2	488533	2.0	0.0	2.0
+chr2	488539	4.0	0.0	4.0
+chr2	488762	0.0	1.0	1.0
+chr2	488788	1.0	0.0	1.0
+chr2	488794	0.0	1.0	1.0
+chr2	488795	1.0	0.0	1.0
+chr2	488796	0.0	2.0	2.0
+chr2	488798	2.0	0.0	2.0
+chr2	488822	0.0	1.0	1.0
+chr2	488909	0.0	1.0	1.0
+chr2	488987	1.0	0.0	1.0
+chr2	489132	1.0	0.0	1.0
+chr2	489347	1.0	0.0	1.0
+chr2	489635	0.0	1.0	1.0
+chr2	489670	1.0	0.0	1.0
+chr2	489678	0.0	1.0	1.0
+chr2	489778	0.0	1.0	1.0
+chr2	489847	1.0	0.0	1.0
+chr2	490031	1.0	0.0	1.0
+chr2	490116	0.0	1.0	1.0
+chr2	490132	0.0	1.0	1.0
+chr2	490133	0.0	1.0	1.0
+chr2	490162	2.0	0.0	2.0
+chr2	490257	2.0	0.0	2.0
+chr2	490297	1.0	0.0	1.0
+chr2	490301	0.0	3.0	3.0
+chr2	490325	0.0	1.0	1.0
+chr2	490335	1.0	0.0	1.0
+chr2	490349	0.0	1.0	1.0
+chr2	490350	1.0	0.0	1.0
+chr2	490370	1.0	0.0	1.0
+chr2	490381	1.0	0.0	1.0
+chr2	490465	2.0	0.0	2.0
+chr2	490480	0.0	2.0	2.0
+chr2	490484	1.0	2.0	3.0
+chr2	490486	0.0	2.0	2.0
+chr2	490489	1.0	0.0	1.0
+chr2	490501	0.0	2.0	2.0
+chr2	490504	1.0	0.0	1.0
+chr2	490511	1.0	0.0	1.0
+chr2	490513	1.0	0.0	1.0
+chr2	490516	1.0	0.0	1.0
+chr2	490699	0.0	1.0	1.0
+chr2	490793	0.0	1.0	1.0
+chr2	490831	1.0	0.0	1.0
+chr2	490840	1.0	0.0	1.0
+chr2	490844	0.0	1.0	1.0
+chr2	490846	0.0	1.0	1.0
+chr2	490847	0.0	1.0	1.0
+chr2	490853	1.0	0.0	1.0
+chr2	490854	1.0	0.0	1.0
+chr2	490862	1.0	0.0	1.0
+chr2	491011	1.0	0.0	1.0
+chr2	491015	0.0	1.0	1.0
+chr2	491024	1.0	0.0	1.0
+chr2	491344	0.0	1.0	1.0
+chr2	491398	0.0	1.0	1.0
+chr2	491399	0.0	1.0	1.0
+chr2	491563	0.0	1.0	1.0
+chr2	491685	0.0	2.0	2.0
+chr2	491893	0.0	2.0	2.0
+chr2	491915	1.0	0.0	1.0
+chr2	492195	0.0	1.0	1.0
+chr2	492248	0.0	1.0	1.0
+chr2	492329	0.0	1.0	1.0
+chr2	492346	1.0	0.0	1.0
+chr2	492587	0.0	1.0	1.0
+chr2	492641	1.0	0.0	1.0
+chr2	492655	0.0	1.0	1.0
+chr2	492802	0.0	2.0	2.0
+chr2	492805	0.0	1.0	1.0
+chr2	492808	3.0	0.0	3.0
+chr2	492811	4.0	0.0	4.0
+chr2	492816	0.0	1.0	1.0
+chr2	492818	1.0	0.0	1.0
+chr2	492822	0.0	1.0	1.0
+chr2	492827	1.0	0.0	1.0
+chr2	492840	0.0	1.0	1.0
+chr2	493077	0.0	2.0	2.0
+chr2	493079	0.0	3.0	3.0
+chr2	493080	0.0	1.0	1.0
+chr2	493081	1.0	0.0	1.0
+chr2	493086	0.0	1.0	1.0
+chr2	493088	0.0	1.0	1.0
+chr2	493093	0.0	1.0	1.0
+chr2	493096	4.0	1.0	5.0
+chr2	493097	3.0	1.0	4.0
+chr2	493101	3.0	0.0	3.0
+chr2	493102	0.0	2.0	2.0
+chr2	493104	0.0	1.0	1.0
+chr2	493108	0.0	2.0	2.0
+chr2	493109	0.0	1.0	1.0
+chr2	493112	0.0	1.0	1.0
+chr2	493114	0.0	4.0	4.0
+chr2	493115	0.0	1.0	1.0
+chr2	493118	1.0	0.0	1.0
+chr2	493119	1.0	0.0	1.0
+chr2	493120	4.0	1.0	5.0
+chr2	493124	1.0	0.0	1.0
+chr2	493126	0.0	2.0	2.0
+chr2	493133	0.0	6.0	6.0
+chr2	493137	1.0	0.0	1.0
+chr2	493138	1.0	0.0	1.0
+chr2	493154	1.0	0.0	1.0
+chr2	493155	1.0	0.0	1.0
+chr2	493172	1.0	0.0	1.0
+chr2	493174	0.0	2.0	2.0
+chr2	493262	0.0	1.0	1.0
+chr2	493264	1.0	0.0	1.0
+chr2	493265	0.0	1.0	1.0
+chr2	493266	0.0	2.0	2.0
+chr2	493282	1.0	0.0	1.0
+chr2	493301	0.0	1.0	1.0
+chr2	493302	1.0	0.0	1.0
+chr2	493330	1.0	0.0	1.0
+chr2	493361	0.0	1.0	1.0
+chr2	493428	1.0	0.0	1.0
+chr2	493577	1.0	0.0	1.0
+chr2	493587	0.0	1.0	1.0
+chr2	493621	0.0	1.0	1.0
+chr2	493628	2.0	0.0	2.0
+chr2	493655	1.0	0.0	1.0
+chr2	493763	1.0	0.0	1.0
+chr2	493790	1.0	0.0	1.0
+chr2	493810	0.0	1.0	1.0
+chr2	493907	0.0	1.0	1.0
+chr2	493917	0.0	1.0	1.0
+chr2	493924	1.0	0.0	1.0
+chr2	493927	0.0	1.0	1.0
+chr2	493940	1.0	0.0	1.0
+chr2	493980	1.0	0.0	1.0
+chr2	494030	0.0	1.0	1.0
+chr2	494044	0.0	1.0	1.0
+chr2	494063	1.0	0.0	1.0
+chr2	494065	1.0	0.0	1.0
+chr2	494067	4.0	0.0	4.0
+chr2	494082	0.0	2.0	2.0
+chr2	494087	2.0	0.0	2.0
+chr2	494088	5.0	1.0	6.0
+chr2	494090	1.0	0.0	1.0
+chr2	494091	1.0	0.0	1.0
+chr2	494093	1.0	0.0	1.0
+chr2	494096	3.0	0.0	3.0
+chr2	494097	5.0	1.0	6.0
+chr2	494099	1.0	0.0	1.0
+chr2	494102	0.0	2.0	2.0
+chr2	494103	3.0	0.0	3.0
+chr2	494105	0.0	1.0	1.0
+chr2	494106	4.0	2.0	6.0
+chr2	494109	0.0	2.0	2.0
+chr2	494110	0.0	1.0	1.0
+chr2	494112	0.0	1.0	1.0
+chr2	494119	0.0	1.0	1.0
+chr2	494120	0.0	1.0	1.0
+chr2	494125	1.0	1.0	2.0
+chr2	494126	0.0	4.0	4.0
+chr2	494132	2.0	0.0	2.0
+chr2	494135	1.0	0.0	1.0
+chr2	494143	2.0	0.0	2.0
+chr2	494145	0.0	1.0	1.0
+chr2	494147	1.0	0.0	1.0
+chr2	494151	0.0	1.0	1.0
+chr2	494187	1.0	0.0	1.0
+chr2	494503	1.0	0.0	1.0
+chr2	494671	1.0	0.0	1.0
+chr2	494689	0.0	1.0	1.0
+chr2	494810	1.0	0.0	1.0
+chr2	494818	0.0	1.0	1.0
+chr2	494820	0.0	1.0	1.0
+chr2	494973	2.0	0.0	2.0
+chr2	494981	1.0	0.0	1.0
+chr2	494990	1.0	0.0	1.0
+chr2	494996	0.0	1.0	1.0
+chr2	495047	0.0	1.0	1.0
+chr2	495124	2.0	0.0	2.0
+chr2	495132	1.0	1.0	2.0
+chr2	495133	1.0	0.0	1.0
+chr2	495138	0.0	1.0	1.0
+chr2	495143	0.0	1.0	1.0
+chr2	495156	0.0	2.0	2.0
+chr2	495163	7.0	0.0	7.0
+chr2	495169	0.0	3.0	3.0
+chr2	495171	0.0	1.0	1.0
+chr2	495173	0.0	1.0	1.0
+chr2	495177	0.0	1.0	1.0
+chr2	495185	0.0	3.0	3.0
+chr2	495196	0.0	1.0	1.0
+chr2	495201	1.0	0.0	1.0
+chr2	495271	0.0	2.0	2.0
+chr2	495280	0.0	1.0	1.0
+chr2	495290	1.0	0.0	1.0
+chr2	495295	0.0	1.0	1.0
+chr2	495296	0.0	1.0	1.0
+chr2	495303	4.0	0.0	4.0
+chr2	495305	3.0	0.0	3.0
+chr2	495307	1.0	0.0	1.0
+chr2	495309	0.0	1.0	1.0
+chr2	495310	2.0	1.0	3.0
+chr2	495316	1.0	0.0	1.0
+chr2	495318	0.0	1.0	1.0
+chr2	495321	1.0	1.0	2.0
+chr2	495324	5.0	0.0	5.0
+chr2	495325	0.0	3.0	3.0
+chr2	495326	6.0	0.0	6.0
+chr2	495328	0.0	5.0	5.0
+chr2	495329	0.0	1.0	1.0
+chr2	495339	0.0	1.0	1.0
+chr2	495340	1.0	0.0	1.0
+chr2	495341	0.0	2.0	2.0
+chr2	495345	1.0	0.0	1.0
+chr2	495346	2.0	0.0	2.0
+chr2	495348	1.0	0.0	1.0
+chr2	495426	0.0	1.0	1.0
+chr2	495566	0.0	1.0	1.0
+chr2	495575	0.0	1.0	1.0
+chr2	495597	0.0	2.0	2.0
+chr2	495599	0.0	1.0	1.0
+chr2	495604	1.0	0.0	1.0
+chr2	495605	1.0	1.0	2.0
+chr2	495606	2.0	0.0	2.0
+chr2	495611	0.0	1.0	1.0
+chr2	495624	0.0	2.0	2.0
+chr2	495625	0.0	3.0	3.0
+chr2	495776	1.0	0.0	1.0
+chr2	495785	0.0	1.0	1.0
+chr2	495813	1.0	0.0	1.0
+chr2	495839	1.0	0.0	1.0
+chr2	496363	1.0	0.0	1.0
+chr2	496393	0.0	1.0	1.0
+chr2	496490	1.0	0.0	1.0
+chr2	496535	1.0	0.0	1.0
+chr2	496688	0.0	1.0	1.0
+chr2	496711	1.0	0.0	1.0
+chr2	496713	1.0	0.0	1.0
+chr2	496717	0.0	1.0	1.0
+chr2	496728	0.0	1.0	1.0
+chr2	496842	1.0	0.0	1.0
+chr2	496855	0.0	1.0	1.0
+chr2	496859	1.0	0.0	1.0
+chr2	496867	1.0	0.0	1.0
+chr2	496868	1.0	0.0	1.0
+chr2	496870	0.0	2.0	2.0
+chr2	496872	0.0	1.0	1.0
+chr2	496873	0.0	1.0	1.0
+chr2	496875	1.0	0.0	1.0
+chr2	496878	2.0	1.0	3.0
+chr2	496880	0.0	5.0	5.0
+chr2	496881	0.0	1.0	1.0
+chr2	496882	2.0	0.0	2.0
+chr2	496883	5.0	1.0	6.0
+chr2	496884	4.0	3.0	7.0
+chr2	496885	0.0	1.0	1.0
+chr2	496887	1.0	0.0	1.0
+chr2	496888	0.0	2.0	2.0
+chr2	496891	0.0	1.0	1.0
+chr2	496897	1.0	0.0	1.0
+chr2	496900	1.0	0.0	1.0
+chr2	497140	1.0	0.0	1.0
+chr2	497151	0.0	1.0	1.0
+chr2	497163	0.0	1.0	1.0
+chr2	497164	1.0	0.0	1.0
+chr2	497166	1.0	1.0	2.0
+chr2	497167	0.0	3.0	3.0
+chr2	497168	0.0	1.0	1.0
+chr2	497179	0.0	1.0	1.0
+chr2	497184	1.0	0.0	1.0
+chr2	497193	1.0	0.0	1.0
+chr2	497197	0.0	1.0	1.0
+chr2	497486	0.0	1.0	1.0
+chr2	497623	0.0	1.0	1.0
+chr2	497846	1.0	0.0	1.0
+chr2	498361	1.0	0.0	1.0
+chr2	498381	1.0	0.0	1.0
+chr2	498384	1.0	0.0	1.0
+chr2	498800	0.0	1.0	1.0
+chr2	499222	1.0	0.0	1.0
+chr2	499951	0.0	1.0	1.0
+chr2	500390	0.0	1.0	1.0
+chr2	500514	1.0	0.0	1.0
+chr2	500619	1.0	0.0	1.0
+chr2	500936	1.0	0.0	1.0
+chr2	501044	1.0	0.0	1.0
+chr2	501051	1.0	0.0	1.0
+chr2	501235	0.0	2.0	2.0
+chr2	501246	1.0	0.0	1.0
+chr2	501248	0.0	1.0	1.0
+chr2	501367	1.0	0.0	1.0
+chr2	501536	1.0	0.0	1.0
+chr2	501550	2.0	0.0	2.0
+chr2	501560	1.0	0.0	1.0
+chr2	501566	0.0	1.0	1.0
+chr2	501568	0.0	1.0	1.0
+chr2	501573	0.0	2.0	2.0
+chr2	501803	0.0	1.0	1.0
+chr2	501830	0.0	1.0	1.0
+chr2	501833	0.0	1.0	1.0
+chr2	501853	1.0	0.0	1.0
+chr2	501857	1.0	0.0	1.0
+chr2	501859	2.0	0.0	2.0
+chr2	501861	1.0	0.0	1.0
+chr2	501875	1.0	0.0	1.0
+chr2	501878	0.0	1.0	1.0
+chr2	502042	3.0	0.0	3.0
+chr2	502893	1.0	0.0	1.0
+chr2	503109	1.0	0.0	1.0
+chr2	503162	1.0	0.0	1.0
+chr2	503644	1.0	0.0	1.0
+chr2	504044	0.0	1.0	1.0
+chr2	504055	1.0	0.0	1.0
+chr2	504226	0.0	1.0	1.0
+chr2	504230	0.0	2.0	2.0
+chr2	504339	1.0	0.0	1.0
+chr2	504379	3.0	3.0	6.0
+chr2	504380	1.0	0.0	1.0
+chr2	504383	0.0	1.0	1.0
+chr2	504385	0.0	2.0	2.0
+chr2	504387	0.0	2.0	2.0
+chr2	504388	1.0	0.0	1.0
+chr2	504390	1.0	0.0	1.0
+chr2	504397	1.0	1.0	2.0
+chr2	504732	0.0	1.0	1.0
+chr2	504763	0.0	1.0	1.0
+chr2	504785	1.0	0.0	1.0
+chr2	504786	2.0	0.0	2.0
+chr2	504787	0.0	1.0	1.0
+chr2	504789	0.0	1.0	1.0
+chr2	504791	0.0	1.0	1.0
+chr2	504794	3.0	0.0	3.0
+chr2	504799	3.0	0.0	3.0
+chr2	504800	0.0	1.0	1.0
+chr2	504801	1.0	1.0	2.0
+chr2	504805	0.0	1.0	1.0
+chr2	504807	0.0	4.0	4.0
+chr2	504812	2.0	5.0	7.0
+chr2	504813	0.0	2.0	2.0
+chr2	504814	3.0	0.0	3.0
+chr2	504816	0.0	7.0	7.0
+chr2	504817	2.0	0.0	2.0
+chr2	504821	0.0	1.0	1.0
+chr2	504824	2.0	2.0	4.0
+chr2	504825	0.0	1.0	1.0
+chr2	504827	1.0	0.0	1.0
+chr2	504836	1.0	1.0	2.0
+chr2	504863	0.0	1.0	1.0
+chr2	504962	1.0	0.0	1.0
+chr2	504964	1.0	0.0	1.0
+chr2	504972	2.0	0.0	2.0
+chr2	504975	0.0	4.0	4.0
+chr2	504984	4.0	1.0	5.0
+chr2	504989	1.0	0.0	1.0
+chr2	505020	0.0	1.0	1.0
+chr2	505087	0.0	1.0	1.0
+chr2	505127	0.0	1.0	1.0
+chr2	505133	1.0	0.0	1.0
+chr2	505148	0.0	1.0	1.0
+chr2	505200	0.0	1.0	1.0
+chr2	505273	1.0	0.0	1.0
+chr2	505276	1.0	0.0	1.0
+chr2	505636	1.0	0.0	1.0
+chr2	505660	0.0	2.0	2.0
+chr2	505667	0.0	1.0	1.0
+chr2	505672	4.0	1.0	5.0
+chr2	505675	2.0	0.0	2.0
+chr2	505680	3.0	0.0	3.0
+chr2	505681	7.0	0.0	7.0
+chr2	505682	1.0	0.0	1.0
+chr2	505683	2.0	0.0	2.0
+chr2	505685	2.0	1.0	3.0
+chr2	505689	1.0	1.0	2.0
+chr2	505693	0.0	9.0	9.0
+chr2	505694	0.0	3.0	3.0
+chr2	505695	2.0	1.0	3.0
+chr2	505696	1.0	6.0	7.0
+chr2	505699	0.0	2.0	2.0
+chr2	505701	2.0	0.0	2.0
+chr2	505702	0.0	3.0	3.0
+chr2	505704	1.0	2.0	3.0
+chr2	505707	0.0	2.0	2.0
+chr2	505708	1.0	0.0	1.0
+chr2	505710	1.0	0.0	1.0
+chr2	505715	0.0	2.0	2.0
+chr2	505716	0.0	1.0	1.0
+chr2	505717	1.0	0.0	1.0
+chr2	505718	1.0	0.0	1.0
+chr2	505741	1.0	0.0	1.0
+chr2	505826	1.0	0.0	1.0
+chr2	505852	0.0	1.0	1.0
+chr2	505860	0.0	1.0	1.0
+chr2	505864	0.0	1.0	1.0
+chr2	505868	1.0	0.0	1.0
+chr2	505877	0.0	1.0	1.0
+chr2	506002	1.0	0.0	1.0
+chr2	506011	0.0	1.0	1.0
+chr2	506042	1.0	0.0	1.0
+chr2	506043	1.0	0.0	1.0
+chr2	506130	0.0	1.0	1.0
+chr2	506204	1.0	0.0	1.0
+chr2	506381	0.0	1.0	1.0
+chr2	506784	0.0	1.0	1.0
+chr2	506821	0.0	1.0	1.0
+chr2	506827	1.0	0.0	1.0
+chr2	506838	0.0	1.0	1.0
+chr2	506977	1.0	0.0	1.0
+chr2	507044	0.0	1.0	1.0
+chr2	507092	0.0	1.0	1.0
+chr2	507251	1.0	0.0	1.0
+chr2	507308	1.0	0.0	1.0
+chr2	507525	1.0	0.0	1.0
+chr2	507583	1.0	0.0	1.0
+chr2	508259	0.0	2.0	2.0
+chr2	508730	0.0	1.0	1.0
+chr2	509280	0.0	1.0	1.0
+chr2	509832	0.0	1.0	1.0
+chr2	509878	0.0	1.0	1.0
+chr2	510186	1.0	0.0	1.0
+chr2	510188	1.0	0.0	1.0
+chr2	510618	1.0	0.0	1.0
+chr2	510770	0.0	1.0	1.0
+chr2	510780	1.0	0.0	1.0
+chr2	510879	0.0	1.0	1.0
+chr2	510984	1.0	0.0	1.0
+chr2	511103	1.0	0.0	1.0
+chr2	511167	1.0	0.0	1.0
+chr2	511323	0.0	1.0	1.0
+chr2	511397	0.0	1.0	1.0
+chr2	511681	0.0	1.0	1.0
+chr2	511825	0.0	1.0	1.0
+chr2	511850	0.0	1.0	1.0
+chr2	511880	1.0	0.0	1.0
+chr2	511996	0.0	1.0	1.0
+chr2	512156	0.0	1.0	1.0
+chr2	512313	1.0	0.0	1.0
+chr2	512319	1.0	0.0	1.0
+chr2	512429	1.0	0.0	1.0
+chr2	512478	1.0	0.0	1.0
+chr2	512519	1.0	0.0	1.0
+chr2	512521	1.0	0.0	1.0
+chr2	512531	0.0	1.0	1.0
+chr2	512636	1.0	0.0	1.0
+chr2	512669	1.0	0.0	1.0
+chr2	512682	2.0	0.0	2.0
+chr2	512688	2.0	0.0	2.0
+chr2	512690	0.0	1.0	1.0
+chr2	512696	1.0	0.0	1.0
+chr2	512708	0.0	1.0	1.0
+chr2	512709	1.0	0.0	1.0
+chr2	512710	1.0	0.0	1.0
+chr2	512714	1.0	0.0	1.0
+chr2	512727	3.0	0.0	3.0
+chr2	512728	0.0	1.0	1.0
+chr2	512734	0.0	2.0	2.0
+chr2	512753	0.0	1.0	1.0
+chr2	512774	0.0	1.0	1.0
+chr2	512835	0.0	1.0	1.0
+chr2	512866	0.0	1.0	1.0
+chr2	512975	0.0	2.0	2.0
+chr2	513029	0.0	1.0	1.0
+chr2	513113	0.0	1.0	1.0
+chr2	513140	1.0	0.0	1.0
+chr2	513184	2.0	0.0	2.0
+chr2	513199	1.0	0.0	1.0
+chr2	513275	0.0	1.0	1.0
+chr2	513286	0.0	1.0	1.0
+chr2	513298	1.0	0.0	1.0
+chr2	513299	0.0	2.0	2.0
+chr2	513312	1.0	0.0	1.0
+chr2	513318	2.0	0.0	2.0
+chr2	513322	1.0	0.0	1.0
+chr2	513327	1.0	0.0	1.0
+chr2	513331	0.0	1.0	1.0
+chr2	513355	1.0	0.0	1.0
+chr2	513391	0.0	1.0	1.0
+chr2	513401	0.0	1.0	1.0
+chr2	513428	0.0	1.0	1.0
+chr2	513453	0.0	1.0	1.0
+chr2	513485	0.0	1.0	1.0
+chr2	513511	0.0	1.0	1.0
+chr2	513520	0.0	1.0	1.0
+chr2	513863	1.0	0.0	1.0
+chr2	513874	1.0	0.0	1.0
+chr2	514110	1.0	0.0	1.0
+chr2	514671	0.0	1.0	1.0
+chr2	514705	1.0	0.0	1.0
+chr2	514769	1.0	0.0	1.0
+chr2	514881	0.0	1.0	1.0
+chr2	515011	0.0	1.0	1.0
+chr2	515189	1.0	0.0	1.0
+chr2	515194	0.0	1.0	1.0
+chr2	515195	1.0	0.0	1.0
+chr2	515198	2.0	0.0	2.0
+chr2	515201	0.0	1.0	1.0
+chr2	515209	1.0	0.0	1.0
+chr2	515223	0.0	1.0	1.0
+chr2	515226	0.0	1.0	1.0
+chr2	515320	1.0	0.0	1.0
+chr2	515331	1.0	0.0	1.0
+chr2	515354	0.0	1.0	1.0
+chr2	515362	1.0	0.0	1.0
+chr2	515645	1.0	0.0	1.0
+chr2	515657	0.0	1.0	1.0
+chr2	515662	0.0	1.0	1.0
+chr2	515664	0.0	1.0	1.0
+chr2	515666	2.0	0.0	2.0
+chr2	515667	1.0	0.0	1.0
+chr2	515674	1.0	0.0	1.0
+chr2	515676	0.0	1.0	1.0
+chr2	515677	1.0	1.0	2.0
+chr2	515678	0.0	1.0	1.0
+chr2	515684	0.0	2.0	2.0
+chr2	515686	0.0	2.0	2.0
+chr2	515690	0.0	1.0	1.0
+chr2	515706	0.0	1.0	1.0
+chr2	515711	1.0	0.0	1.0
+chr2	515716	0.0	1.0	1.0
+chr2	515841	0.0	1.0	1.0
+chr2	515845	0.0	1.0	1.0
+chr2	515862	0.0	1.0	1.0
+chr2	516022	1.0	0.0	1.0
+chr2	516034	0.0	1.0	1.0
+chr2	516089	0.0	1.0	1.0
+chr2	516361	0.0	1.0	1.0
+chr2	516422	1.0	0.0	1.0
+chr2	516448	0.0	1.0	1.0
+chr2	516538	0.0	1.0	1.0
+chr2	516693	0.0	2.0	2.0
+chr2	516803	2.0	0.0	2.0
+chr2	516861	1.0	0.0	1.0
+chr2	516988	0.0	1.0	1.0
+chr2	516997	1.0	0.0	1.0
+chr2	517017	0.0	1.0	1.0
+chr2	517632	1.0	0.0	1.0
+chr2	517667	0.0	1.0	1.0
+chr2	517756	0.0	1.0	1.0
+chr2	517841	0.0	1.0	1.0
+chr2	518389	0.0	1.0	1.0
+chr2	518424	1.0	0.0	1.0
+chr2	518455	1.0	0.0	1.0
+chr2	518460	0.0	1.0	1.0
+chr2	519148	1.0	0.0	1.0
+chr2	519188	1.0	0.0	1.0
+chr2	519381	1.0	0.0	1.0
+chr2	519427	0.0	2.0	2.0
+chr2	519904	2.0	0.0	2.0
+chr2	519953	0.0	1.0	1.0
+chr2	521375	0.0	1.0	1.0
+chr2	523477	0.0	1.0	1.0
+chr2	524737	1.0	0.0	1.0
+chr2	525205	0.0	1.0	1.0
+chr2	525364	0.0	1.0	1.0
+chr2	525505	0.0	1.0	1.0
+chr2	525509	0.0	1.0	1.0
+chr2	525519	0.0	1.0	1.0
+chr2	526156	0.0	1.0	1.0
+chr2	526493	1.0	0.0	1.0
+chr2	526503	0.0	1.0	1.0
+chr2	526549	0.0	1.0	1.0
+chr2	526558	1.0	0.0	1.0
+chr2	526681	0.0	1.0	1.0
+chr2	526682	0.0	1.0	1.0
+chr2	526688	1.0	0.0	1.0
+chr2	526690	0.0	1.0	1.0
+chr2	526704	0.0	1.0	1.0
+chr2	526716	1.0	0.0	1.0
+chr2	526736	0.0	1.0	1.0
+chr2	526856	4.0	0.0	4.0
+chr2	526877	1.0	0.0	1.0
+chr2	527050	0.0	1.0	1.0
+chr2	527122	2.0	0.0	2.0
+chr2	527127	0.0	1.0	1.0
+chr2	527130	0.0	1.0	1.0
+chr2	527134	0.0	1.0	1.0
+chr2	527148	1.0	0.0	1.0
+chr2	527153	1.0	0.0	1.0
+chr2	527154	1.0	0.0	1.0
+chr2	527155	0.0	1.0	1.0
+chr2	527160	1.0	0.0	1.0
+chr2	527166	0.0	2.0	2.0
+chr2	527168	0.0	1.0	1.0
+chr2	527171	0.0	1.0	1.0
+chr2	527173	0.0	3.0	3.0
+chr2	527174	0.0	1.0	1.0
+chr2	527176	2.0	0.0	2.0
+chr2	527178	0.0	1.0	1.0
+chr2	527186	0.0	1.0	1.0
+chr2	527193	0.0	1.0	1.0
+chr2	527196	0.0	1.0	1.0
+chr2	527202	1.0	0.0	1.0
+chr2	527221	0.0	1.0	1.0
+chr2	527328	1.0	0.0	1.0
+chr2	527333	1.0	0.0	1.0
+chr2	527354	0.0	1.0	1.0
+chr2	527359	2.0	0.0	2.0
+chr2	527511	0.0	1.0	1.0
+chr2	527528	1.0	0.0	1.0
+chr2	527531	0.0	1.0	1.0
+chr2	527542	0.0	1.0	1.0
+chr2	527543	1.0	0.0	1.0
+chr2	527835	2.0	0.0	2.0
+chr2	527987	1.0	0.0	1.0
+chr2	527990	0.0	1.0	1.0
+chr2	527993	3.0	0.0	3.0
+chr2	527994	0.0	1.0	1.0
+chr2	527996	0.0	3.0	3.0
+chr2	527997	0.0	2.0	2.0
+chr2	527999	1.0	0.0	1.0
+chr2	528001	1.0	0.0	1.0
+chr2	528002	0.0	1.0	1.0
+chr2	528005	0.0	2.0	2.0
+chr2	528009	1.0	0.0	1.0
+chr2	528010	2.0	0.0	2.0
+chr2	528011	4.0	1.0	5.0
+chr2	528012	5.0	0.0	5.0
+chr2	528016	0.0	1.0	1.0
+chr2	528022	0.0	1.0	1.0
+chr2	528025	0.0	1.0	1.0
+chr2	528026	0.0	1.0	1.0
+chr2	528027	0.0	1.0	1.0
+chr2	528062	1.0	0.0	1.0
+chr2	528267	1.0	0.0	1.0
+chr2	528281	1.0	0.0	1.0
+chr2	528282	1.0	0.0	1.0
+chr2	528290	0.0	2.0	2.0
+chr2	528292	0.0	4.0	4.0
+chr2	528294	0.0	1.0	1.0
+chr2	528295	1.0	0.0	1.0
+chr2	528299	1.0	0.0	1.0
+chr2	528395	0.0	1.0	1.0
+chr2	528446	1.0	0.0	1.0
+chr2	528452	0.0	2.0	2.0
+chr2	528453	0.0	1.0	1.0
+chr2	528463	0.0	1.0	1.0
+chr2	528491	0.0	1.0	1.0
+chr2	528931	1.0	0.0	1.0
+chr2	529069	0.0	1.0	1.0
+chr2	529130	1.0	0.0	1.0
+chr2	529503	1.0	0.0	1.0
+chr2	530283	0.0	2.0	2.0
+chr2	531162	0.0	1.0	1.0
+chr2	531666	0.0	1.0	1.0
+chr2	532006	1.0	0.0	1.0
+chr2	532052	1.0	0.0	1.0
+chr2	532178	1.0	0.0	1.0
+chr2	532190	1.0	0.0	1.0
+chr2	532211	0.0	1.0	1.0
+chr2	532509	0.0	2.0	2.0
+chr2	532517	1.0	0.0	1.0
+chr2	532518	2.0	0.0	2.0
+chr2	532520	0.0	2.0	2.0
+chr2	532528	1.0	0.0	1.0
+chr2	532529	1.0	0.0	1.0
+chr2	532530	0.0	2.0	2.0
+chr2	532541	1.0	0.0	1.0
+chr2	532642	0.0	1.0	1.0
+chr2	532649	1.0	0.0	1.0
+chr2	532664	1.0	0.0	1.0
+chr2	532674	0.0	1.0	1.0
+chr2	532679	0.0	1.0	1.0
+chr2	532680	1.0	1.0	2.0
+chr2	532684	1.0	0.0	1.0
+chr2	532685	1.0	0.0	1.0
+chr2	532687	1.0	0.0	1.0
+chr2	532695	1.0	0.0	1.0
+chr2	532701	0.0	1.0	1.0
+chr2	532706	0.0	1.0	1.0
+chr2	532715	0.0	1.0	1.0
+chr2	532858	1.0	0.0	1.0
+chr2	532870	0.0	2.0	2.0
+chr2	532886	0.0	1.0	1.0
+chr2	532887	1.0	0.0	1.0
+chr2	532888	1.0	0.0	1.0
+chr2	533008	0.0	2.0	2.0
+chr2	533010	1.0	0.0	1.0
+chr2	533129	0.0	1.0	1.0
+chr2	533177	0.0	1.0	1.0
+chr2	533222	0.0	1.0	1.0
+chr2	533250	1.0	0.0	1.0
+chr2	533312	0.0	1.0	1.0
+chr2	533347	0.0	1.0	1.0
+chr2	533351	1.0	0.0	1.0
+chr2	533359	0.0	2.0	2.0
+chr2	533361	0.0	1.0	1.0
+chr2	533364	3.0	3.0	6.0
+chr2	533365	0.0	3.0	3.0
+chr2	533366	0.0	2.0	2.0
+chr2	533369	1.0	0.0	1.0
+chr2	533370	2.0	0.0	2.0
+chr2	533374	4.0	0.0	4.0
+chr2	533375	0.0	2.0	2.0
+chr2	533378	1.0	0.0	1.0
+chr2	533379	0.0	1.0	1.0
+chr2	533380	1.0	0.0	1.0
+chr2	533387	0.0	1.0	1.0
+chr2	533395	1.0	0.0	1.0
+chr2	533404	1.0	0.0	1.0
+chr2	533406	1.0	0.0	1.0
+chr2	533408	0.0	1.0	1.0
+chr2	533410	0.0	3.0	3.0
+chr2	533411	2.0	0.0	2.0
+chr2	533417	1.0	0.0	1.0
+chr2	533432	0.0	1.0	1.0
+chr2	533499	0.0	1.0	1.0
+chr2	533591	2.0	0.0	2.0
+chr2	533636	0.0	1.0	1.0
+chr2	533637	1.0	1.0	2.0
+chr2	533700	3.0	0.0	3.0
+chr2	533703	1.0	0.0	1.0
+chr2	533716	1.0	0.0	1.0
+chr2	533718	0.0	2.0	2.0
+chr2	533725	0.0	3.0	3.0
+chr2	533819	1.0	0.0	1.0
+chr2	533820	0.0	1.0	1.0
+chr2	533825	0.0	1.0	1.0
+chr2	533830	1.0	0.0	1.0
+chr2	533845	1.0	0.0	1.0
+chr2	533859	0.0	3.0	3.0
+chr2	533860	0.0	1.0	1.0
+chr2	533861	0.0	1.0	1.0
+chr2	533864	0.0	2.0	2.0
+chr2	533876	2.0	0.0	2.0
+chr2	533878	2.0	0.0	2.0
+chr2	533891	0.0	1.0	1.0
+chr2	533892	1.0	0.0	1.0
+chr2	533932	1.0	0.0	1.0
+chr2	533961	0.0	1.0	1.0
+chr2	533996	0.0	1.0	1.0
+chr2	534000	2.0	0.0	2.0
+chr2	534013	0.0	1.0	1.0
+chr2	534023	0.0	2.0	2.0
+chr2	534037	1.0	0.0	1.0
+chr2	534049	0.0	1.0	1.0
+chr2	534264	1.0	0.0	1.0
+chr2	534276	0.0	1.0	1.0
+chr2	534466	0.0	1.0	1.0
+chr2	534545	0.0	1.0	1.0
+chr2	534609	0.0	1.0	1.0
+chr2	534625	1.0	0.0	1.0
+chr2	534682	1.0	0.0	1.0
+chr2	534747	0.0	1.0	1.0
+chr2	534757	0.0	1.0	1.0
+chr2	534760	2.0	0.0	2.0
+chr2	534770	1.0	0.0	1.0
+chr2	534782	1.0	0.0	1.0
+chr2	534918	0.0	1.0	1.0
+chr2	534925	0.0	3.0	3.0
+chr2	534926	0.0	1.0	1.0
+chr2	534929	3.0	0.0	3.0
+chr2	534930	0.0	2.0	2.0
+chr2	534931	0.0	1.0	1.0
+chr2	534935	1.0	0.0	1.0
+chr2	534936	0.0	2.0	2.0
+chr2	534937	3.0	0.0	3.0
+chr2	534940	1.0	1.0	2.0
+chr2	534941	0.0	1.0	1.0
+chr2	534945	0.0	1.0	1.0
+chr2	534946	8.0	3.0	11.0
+chr2	534951	0.0	2.0	2.0
+chr2	534952	0.0	2.0	2.0
+chr2	534953	1.0	0.0	1.0
+chr2	534955	2.0	2.0	4.0
+chr2	534956	1.0	0.0	1.0
+chr2	534958	1.0	0.0	1.0
+chr2	534962	0.0	1.0	1.0
+chr2	534964	2.0	0.0	2.0
+chr2	534965	3.0	2.0	5.0
+chr2	534968	1.0	0.0	1.0
+chr2	534974	0.0	1.0	1.0
+chr2	534980	1.0	0.0	1.0
+chr2	534991	1.0	0.0	1.0
+chr2	535006	2.0	0.0	2.0
+chr2	535189	1.0	0.0	1.0
+chr2	535200	0.0	1.0	1.0
+chr2	535213	2.0	0.0	2.0
+chr2	535218	0.0	1.0	1.0
+chr2	535225	0.0	1.0	1.0
+chr2	535231	0.0	4.0	4.0
+chr2	535232	1.0	2.0	3.0
+chr2	535233	3.0	0.0	3.0
+chr2	535234	1.0	0.0	1.0
+chr2	535235	0.0	3.0	3.0
+chr2	535237	4.0	0.0	4.0
+chr2	535241	3.0	0.0	3.0
+chr2	535243	0.0	3.0	3.0
+chr2	535244	0.0	1.0	1.0
+chr2	535250	0.0	1.0	1.0
+chr2	535252	0.0	2.0	2.0
+chr2	535253	1.0	1.0	2.0
+chr2	535255	2.0	0.0	2.0
+chr2	535279	1.0	0.0	1.0
+chr2	535379	1.0	0.0	1.0
+chr2	535392	3.0	1.0	4.0
+chr2	535401	0.0	3.0	3.0
+chr2	535404	1.0	0.0	1.0
+chr2	535566	1.0	0.0	1.0
+chr2	535573	0.0	1.0	1.0
+chr2	535738	1.0	0.0	1.0
+chr2	535920	1.0	0.0	1.0
+chr2	536042	2.0	0.0	2.0
+chr2	536070	1.0	0.0	1.0
+chr2	536162	1.0	0.0	1.0
+chr2	536181	1.0	0.0	1.0
+chr2	536189	1.0	0.0	1.0
+chr2	536193	0.0	1.0	1.0
+chr2	536219	0.0	1.0	1.0
+chr2	536529	0.0	1.0	1.0
+chr2	536598	1.0	0.0	1.0
+chr2	536609	1.0	0.0	1.0
+chr2	536628	0.0	1.0	1.0
+chr2	536643	1.0	0.0	1.0
+chr2	536776	1.0	0.0	1.0
+chr2	536796	0.0	1.0	1.0
+chr2	536825	1.0	0.0	1.0
+chr2	536965	1.0	0.0	1.0
+chr2	536968	1.0	0.0	1.0
+chr2	537029	0.0	1.0	1.0
+chr2	537121	1.0	0.0	1.0
+chr2	537132	0.0	1.0	1.0
+chr2	537274	1.0	0.0	1.0
+chr2	537283	1.0	0.0	1.0
+chr2	537318	0.0	1.0	1.0
+chr2	537434	0.0	1.0	1.0
+chr2	537463	0.0	1.0	1.0
+chr2	537465	1.0	0.0	1.0
+chr2	537467	0.0	1.0	1.0
+chr2	537470	0.0	3.0	3.0
+chr2	537485	1.0	0.0	1.0
+chr2	537502	0.0	1.0	1.0
+chr2	537742	1.0	0.0	1.0
+chr2	537748	0.0	1.0	1.0
+chr2	537760	0.0	2.0	2.0
+chr2	537762	1.0	0.0	1.0
+chr2	537884	1.0	0.0	1.0
+chr2	537916	0.0	1.0	1.0
+chr2	537936	0.0	1.0	1.0
+chr2	537937	0.0	1.0	1.0
+chr2	538084	0.0	2.0	2.0
+chr2	538095	0.0	1.0	1.0
+chr2	538116	1.0	0.0	1.0
+chr2	538190	0.0	1.0	1.0
+chr2	538288	1.0	0.0	1.0
+chr2	538310	1.0	0.0	1.0
+chr2	538326	0.0	1.0	1.0
+chr2	538336	2.0	0.0	2.0
+chr2	538372	0.0	1.0	1.0
+chr2	538373	0.0	1.0	1.0
+chr2	538397	0.0	1.0	1.0
+chr2	538406	0.0	1.0	1.0
+chr2	538445	1.0	0.0	1.0
+chr2	538469	1.0	0.0	1.0
+chr2	538494	1.0	0.0	1.0
+chr2	538505	0.0	1.0	1.0
+chr2	538521	2.0	0.0	2.0
+chr2	538522	0.0	1.0	1.0
+chr2	538545	1.0	0.0	1.0
+chr2	538548	0.0	1.0	1.0
+chr2	538557	0.0	1.0	1.0
+chr2	538561	1.0	0.0	1.0
+chr2	538575	1.0	0.0	1.0
+chr2	538699	0.0	1.0	1.0
+chr2	538705	0.0	1.0	1.0
+chr2	538718	0.0	1.0	1.0
+chr2	538730	1.0	0.0	1.0
+chr2	538741	3.0	0.0	3.0
+chr2	538766	0.0	1.0	1.0
+chr2	538769	0.0	1.0	1.0
+chr2	538799	1.0	0.0	1.0
+chr2	538890	1.0	0.0	1.0
+chr2	539036	1.0	0.0	1.0
+chr2	539062	1.0	0.0	1.0
+chr2	539082	1.0	0.0	1.0
+chr2	539086	0.0	2.0	2.0
+chr2	539095	0.0	1.0	1.0
+chr2	539134	2.0	0.0	2.0
+chr2	539224	0.0	1.0	1.0
+chr2	539253	2.0	0.0	2.0
+chr2	539264	1.0	0.0	1.0
+chr2	539278	0.0	2.0	2.0
+chr2	539279	1.0	1.0	2.0
+chr2	539280	1.0	0.0	1.0
+chr2	539282	0.0	1.0	1.0
+chr2	539286	0.0	1.0	1.0
+chr2	539292	2.0	0.0	2.0
+chr2	539295	0.0	2.0	2.0
+chr2	539296	0.0	1.0	1.0
+chr2	539313	1.0	0.0	1.0
+chr2	539314	1.0	0.0	1.0
+chr2	539353	1.0	0.0	1.0
+chr2	539457	1.0	0.0	1.0
+chr2	539494	0.0	2.0	2.0
+chr2	539495	1.0	0.0	1.0
+chr2	539505	0.0	1.0	1.0
+chr2	539516	1.0	0.0	1.0
+chr2	539524	1.0	0.0	1.0
+chr2	539535	0.0	1.0	1.0
+chr2	539560	1.0	0.0	1.0
+chr2	539652	0.0	1.0	1.0
+chr2	539657	0.0	1.0	1.0
+chr2	539660	0.0	1.0	1.0
+chr2	539663	1.0	0.0	1.0
+chr2	539680	1.0	0.0	1.0
+chr2	539686	0.0	2.0	2.0
+chr2	539687	1.0	1.0	2.0
+chr2	539688	1.0	0.0	1.0
+chr2	539689	1.0	1.0	2.0
+chr2	539695	1.0	0.0	1.0
+chr2	539712	1.0	0.0	1.0
+chr2	539715	1.0	0.0	1.0
+chr2	539949	1.0	1.0	2.0
+chr2	539951	1.0	0.0	1.0
+chr2	539953	2.0	0.0	2.0
+chr2	539957	0.0	1.0	1.0
+chr2	539963	2.0	0.0	2.0
+chr2	539967	0.0	1.0	1.0
+chr2	539978	0.0	1.0	1.0
+chr2	539988	1.0	0.0	1.0
+chr2	539989	0.0	3.0	3.0
+chr2	540128	2.0	0.0	2.0
+chr2	540136	1.0	0.0	1.0
+chr2	540138	0.0	2.0	2.0
+chr2	540141	0.0	1.0	1.0
+chr2	540148	0.0	1.0	1.0
+chr2	540298	3.0	0.0	3.0
+chr2	540443	1.0	0.0	1.0
+chr2	540559	1.0	0.0	1.0
+chr2	540586	0.0	1.0	1.0
+chr2	540605	0.0	1.0	1.0
+chr2	540661	0.0	1.0	1.0
+chr2	540677	1.0	0.0	1.0
+chr2	540782	1.0	0.0	1.0
+chr2	540952	0.0	1.0	1.0
+chr2	540991	0.0	1.0	1.0
+chr2	541000	1.0	0.0	1.0
+chr2	541052	1.0	0.0	1.0
+chr2	541111	1.0	0.0	1.0
+chr2	541242	0.0	1.0	1.0
+chr2	541302	1.0	0.0	1.0
+chr2	541326	1.0	0.0	1.0
+chr2	541377	0.0	1.0	1.0
+chr2	541437	0.0	1.0	1.0
+chr2	541443	0.0	1.0	1.0
+chr2	541789	1.0	0.0	1.0
+chr2	541858	0.0	2.0	2.0
+chr2	541875	0.0	1.0	1.0
+chr2	541908	0.0	1.0	1.0
+chr2	541935	0.0	1.0	1.0
+chr2	542122	0.0	1.0	1.0
+chr2	542210	1.0	0.0	1.0
+chr2	542268	1.0	0.0	1.0
+chr2	542522	0.0	1.0	1.0
+chr2	542793	1.0	0.0	1.0
+chr2	543272	1.0	0.0	1.0
+chr2	543275	1.0	0.0	1.0
+chr2	543800	0.0	1.0	1.0
+chr2	543812	1.0	0.0	1.0
+chr2	543952	0.0	1.0	1.0
+chr2	544127	1.0	0.0	1.0
+chr2	544131	0.0	1.0	1.0
+chr2	544281	0.0	1.0	1.0
+chr2	544288	0.0	1.0	1.0
+chr2	544297	3.0	0.0	3.0
+chr2	544313	1.0	0.0	1.0
+chr2	544318	0.0	1.0	1.0
+chr2	544319	0.0	1.0	1.0
+chr2	544321	1.0	0.0	1.0
+chr2	544334	1.0	0.0	1.0
+chr2	544355	1.0	0.0	1.0
+chr2	544375	1.0	0.0	1.0
+chr2	544402	0.0	1.0	1.0
+chr2	544435	0.0	1.0	1.0
+chr2	544439	0.0	1.0	1.0
+chr2	544454	0.0	1.0	1.0
+chr2	544456	2.0	0.0	2.0
+chr2	544462	0.0	1.0	1.0
+chr2	544466	0.0	1.0	1.0
+chr2	544468	0.0	1.0	1.0
+chr2	544469	0.0	3.0	3.0
+chr2	544470	2.0	4.0	6.0
+chr2	544471	0.0	1.0	1.0
+chr2	544472	0.0	1.0	1.0
+chr2	544475	1.0	0.0	1.0
+chr2	544476	3.0	0.0	3.0
+chr2	544487	0.0	1.0	1.0
+chr2	544488	0.0	1.0	1.0
+chr2	544498	1.0	0.0	1.0
+chr2	544502	1.0	0.0	1.0
+chr2	544524	0.0	1.0	1.0
+chr2	544874	1.0	0.0	1.0
+chr2	544875	2.0	0.0	2.0
+chr2	544889	0.0	1.0	1.0
+chr2	544893	1.0	0.0	1.0
+chr2	544908	0.0	1.0	1.0
+chr2	544915	4.0	0.0	4.0
+chr2	544917	0.0	1.0	1.0
+chr2	544926	0.0	2.0	2.0
+chr2	544927	0.0	1.0	1.0
+chr2	544932	1.0	0.0	1.0
+chr2	544987	0.0	1.0	1.0
+chr2	545073	0.0	1.0	1.0
+chr2	545076	1.0	0.0	1.0
+chr2	545082	2.0	0.0	2.0
+chr2	545095	0.0	1.0	1.0
+chr2	545106	0.0	1.0	1.0
+chr2	545109	0.0	1.0	1.0
+chr2	545134	0.0	1.0	1.0
+chr2	545149	1.0	0.0	1.0
+chr2	545151	0.0	1.0	1.0
+chr2	545256	1.0	0.0	1.0
+chr2	545258	0.0	1.0	1.0
+chr2	545285	1.0	0.0	1.0
+chr2	545303	0.0	2.0	2.0
+chr2	545540	1.0	0.0	1.0
+chr2	545748	1.0	0.0	1.0
+chr2	545919	0.0	2.0	2.0
+chr2	545934	0.0	1.0	1.0
+chr2	545956	0.0	2.0	2.0
+chr2	545959	1.0	0.0	1.0
+chr2	546108	0.0	1.0	1.0
+chr2	546133	2.0	0.0	2.0
+chr2	546150	0.0	1.0	1.0
+chr2	546183	0.0	1.0	1.0
+chr2	546334	1.0	0.0	1.0
+chr2	546347	1.0	0.0	1.0
+chr2	546361	2.0	0.0	2.0
+chr2	546364	0.0	1.0	1.0
+chr2	546368	1.0	0.0	1.0
+chr2	546370	1.0	0.0	1.0
+chr2	546407	1.0	0.0	1.0
+chr2	546520	0.0	1.0	1.0
+chr2	546526	1.0	0.0	1.0
+chr2	546565	1.0	0.0	1.0
+chr2	546573	1.0	0.0	1.0
+chr2	546592	1.0	0.0	1.0
+chr2	546635	0.0	1.0	1.0
+chr2	546689	1.0	0.0	1.0
+chr2	546793	1.0	0.0	1.0
+chr2	546993	2.0	0.0	2.0
+chr2	547141	0.0	1.0	1.0
+chr2	547420	1.0	0.0	1.0
+chr2	547424	0.0	3.0	3.0
+chr2	547485	0.0	1.0	1.0
+chr2	547558	0.0	1.0	1.0
+chr2	547661	1.0	0.0	1.0
+chr2	547680	0.0	1.0	1.0
+chr2	547683	2.0	0.0	2.0
+chr2	547686	0.0	2.0	2.0
+chr2	547687	0.0	1.0	1.0
+chr2	547723	1.0	0.0	1.0
+chr2	547797	1.0	0.0	1.0
+chr2	547952	1.0	0.0	1.0
+chr2	547957	1.0	0.0	1.0
+chr2	548127	1.0	0.0	1.0
+chr2	548149	1.0	0.0	1.0
+chr2	548403	1.0	0.0	1.0
+chr2	548422	2.0	0.0	2.0
+chr2	548556	1.0	0.0	1.0
+chr2	548570	0.0	1.0	1.0
+chr2	548580	0.0	1.0	1.0
+chr2	548874	0.0	1.0	1.0
+chr2	548894	0.0	1.0	1.0
+chr2	548895	0.0	1.0	1.0
+chr2	548912	1.0	0.0	1.0
+chr2	548929	1.0	0.0	1.0
+chr2	549027	0.0	2.0	2.0
+chr2	549032	1.0	0.0	1.0
+chr2	549046	1.0	0.0	1.0
+chr2	549047	1.0	0.0	1.0
+chr2	549052	2.0	0.0	2.0
+chr2	549058	0.0	1.0	1.0
+chr2	549060	1.0	0.0	1.0
+chr2	549065	2.0	0.0	2.0
+chr2	549077	1.0	0.0	1.0
+chr2	549314	0.0	1.0	1.0
+chr2	549456	1.0	0.0	1.0
+chr2	549466	0.0	2.0	2.0
+chr2	549486	0.0	1.0	1.0
+chr2	549488	1.0	0.0	1.0
+chr2	549489	1.0	0.0	1.0
+chr2	549496	1.0	0.0	1.0
+chr2	549498	1.0	0.0	1.0
+chr2	549512	0.0	2.0	2.0
+chr2	549520	1.0	0.0	1.0
+chr2	549541	0.0	1.0	1.0
+chr2	549572	1.0	0.0	1.0
+chr2	549733	1.0	0.0	1.0
+chr2	549760	0.0	2.0	2.0
+chr2	549769	0.0	1.0	1.0
+chr2	549772	2.0	0.0	2.0
+chr2	549774	0.0	1.0	1.0
+chr2	549783	2.0	0.0	2.0
+chr2	549791	1.0	0.0	1.0
+chr2	549802	1.0	0.0	1.0
+chr2	549805	0.0	1.0	1.0
+chr2	549907	0.0	1.0	1.0
+chr2	549933	0.0	1.0	1.0
+chr2	549941	2.0	0.0	2.0
+chr2	550069	0.0	1.0	1.0
+chr2	550146	0.0	1.0	1.0
+chr2	550147	0.0	1.0	1.0
+chr2	550274	1.0	0.0	1.0
+chr2	550316	0.0	1.0	1.0
+chr2	550920	0.0	1.0	1.0
+chr2	551225	0.0	1.0	1.0
+chr2	551703	1.0	0.0	1.0
+chr2	552029	1.0	0.0	1.0
+chr2	552172	0.0	1.0	1.0
+chr2	552386	1.0	0.0	1.0
+chr2	552564	2.0	0.0	2.0
+chr2	552690	1.0	0.0	1.0
+chr2	553025	0.0	1.0	1.0
+chr2	553026	0.0	1.0	1.0
+chr2	553090	0.0	1.0	1.0
+chr2	553116	1.0	0.0	1.0
+chr2	553165	0.0	2.0	2.0
+chr2	553166	0.0	2.0	2.0
+chr2	553169	0.0	1.0	1.0
+chr2	553177	0.0	1.0	1.0
+chr2	553179	0.0	1.0	1.0
+chr2	553180	2.0	1.0	3.0
+chr2	553181	4.0	0.0	4.0
+chr2	553182	6.0	0.0	6.0
+chr2	553183	0.0	1.0	1.0
+chr2	553185	0.0	1.0	1.0
+chr2	553187	0.0	2.0	2.0
+chr2	553188	3.0	1.0	4.0
+chr2	553191	0.0	2.0	2.0
+chr2	553197	0.0	8.0	8.0
+chr2	553198	0.0	1.0	1.0
+chr2	553204	1.0	0.0	1.0
+chr2	553205	2.0	0.0	2.0
+chr2	553208	1.0	0.0	1.0
+chr2	553210	1.0	0.0	1.0
+chr2	553212	0.0	1.0	1.0
+chr2	553611	0.0	1.0	1.0
+chr2	553642	0.0	1.0	1.0
+chr2	553651	0.0	1.0	1.0
+chr2	554003	0.0	1.0	1.0
+chr2	554208	0.0	1.0	1.0
+chr2	554279	0.0	1.0	1.0
+chr2	554663	0.0	1.0	1.0
+chr2	554741	0.0	1.0	1.0
+chr2	554769	1.0	0.0	1.0
+chr2	554776	0.0	1.0	1.0
+chr2	555010	0.0	2.0	2.0
+chr2	555304	0.0	1.0	1.0
+chr2	556902	1.0	0.0	1.0
+chr2	556969	1.0	0.0	1.0
+chr2	557027	0.0	1.0	1.0
+chr2	557478	0.0	1.0	1.0
+chr2	557687	1.0	0.0	1.0
+chr2	557769	1.0	0.0	1.0
+chr2	557798	0.0	1.0	1.0
+chr2	558089	1.0	1.0	2.0
+chr2	558097	0.0	1.0	1.0
+chr2	558123	1.0	0.0	1.0
+chr2	558397	2.0	0.0	2.0
+chr2	558406	0.0	1.0	1.0
+chr2	558409	1.0	0.0	1.0
+chr2	558412	1.0	0.0	1.0
+chr2	558413	0.0	1.0	1.0
+chr2	558415	0.0	1.0	1.0
+chr2	558425	1.0	0.0	1.0
+chr2	558426	2.0	0.0	2.0
+chr2	558428	0.0	1.0	1.0
+chr2	558656	1.0	0.0	1.0
+chr2	558669	3.0	0.0	3.0
+chr2	558680	2.0	0.0	2.0
+chr2	558681	1.0	0.0	1.0
+chr2	558683	1.0	0.0	1.0
+chr2	558685	0.0	1.0	1.0
+chr2	558689	0.0	1.0	1.0
+chr2	558690	1.0	0.0	1.0
+chr2	558691	0.0	1.0	1.0
+chr2	558693	0.0	4.0	4.0
+chr2	558694	1.0	3.0	4.0
+chr2	558695	1.0	0.0	1.0
+chr2	558701	0.0	2.0	2.0
+chr2	558703	3.0	0.0	3.0
+chr2	558704	0.0	3.0	3.0
+chr2	558705	0.0	1.0	1.0
+chr2	558706	1.0	0.0	1.0
+chr2	558707	0.0	1.0	1.0
+chr2	558708	0.0	2.0	2.0
+chr2	558709	1.0	4.0	5.0
+chr2	558710	0.0	2.0	2.0
+chr2	558711	0.0	1.0	1.0
+chr2	558715	1.0	1.0	2.0
+chr2	558716	0.0	1.0	1.0
+chr2	558719	1.0	0.0	1.0
+chr2	558729	1.0	0.0	1.0
+chr2	558856	1.0	0.0	1.0
+chr2	558871	1.0	0.0	1.0
+chr2	558882	1.0	0.0	1.0
+chr2	558909	1.0	0.0	1.0
+chr2	559215	0.0	1.0	1.0
+chr2	559344	1.0	0.0	1.0
+chr2	559372	0.0	1.0	1.0
+chr2	559557	1.0	0.0	1.0
+chr2	559599	0.0	1.0	1.0
+chr2	559968	1.0	0.0	1.0
+chr2	559979	1.0	0.0	1.0
+chr2	559983	1.0	0.0	1.0
+chr2	559985	0.0	1.0	1.0
+chr2	559987	0.0	1.0	1.0
+chr2	559990	1.0	0.0	1.0
+chr2	559991	1.0	0.0	1.0
+chr2	560009	1.0	1.0	2.0
+chr2	560010	1.0	1.0	2.0
+chr2	560017	0.0	1.0	1.0
+chr2	560024	1.0	0.0	1.0
+chr2	560029	1.0	0.0	1.0
+chr2	560045	0.0	2.0	2.0
+chr2	560049	0.0	1.0	1.0
+chr2	560056	1.0	0.0	1.0
+chr2	560134	1.0	0.0	1.0
+chr2	560158	0.0	1.0	1.0
+chr2	560159	4.0	0.0	4.0
+chr2	560171	0.0	1.0	1.0
+chr2	560172	1.0	0.0	1.0
+chr2	560301	1.0	0.0	1.0
+chr2	560480	1.0	0.0	1.0
+chr2	560597	0.0	1.0	1.0
+chr2	560610	0.0	1.0	1.0
+chr2	560616	0.0	1.0	1.0
+chr2	560633	1.0	0.0	1.0
+chr2	560635	1.0	0.0	1.0
+chr2	560779	2.0	0.0	2.0
+chr2	560849	2.0	0.0	2.0
+chr2	560902	0.0	1.0	1.0
+chr2	560944	0.0	1.0	1.0
+chr2	560945	0.0	1.0	1.0
+chr2	560954	0.0	1.0	1.0
+chr2	560972	0.0	1.0	1.0
+chr2	560976	0.0	1.0	1.0
+chr2	561282	0.0	1.0	1.0
+chr2	561312	1.0	0.0	1.0
+chr2	561313	3.0	0.0	3.0
+chr2	561314	0.0	1.0	1.0
+chr2	561342	0.0	1.0	1.0
+chr2	561357	0.0	1.0	1.0
+chr2	561358	0.0	1.0	1.0
+chr2	561359	1.0	0.0	1.0
+chr2	561362	1.0	0.0	1.0
+chr2	561363	2.0	0.0	2.0
+chr2	561375	0.0	1.0	1.0
+chr2	561378	1.0	0.0	1.0
+chr2	561381	1.0	0.0	1.0
+chr2	561392	0.0	1.0	1.0
+chr2	561402	1.0	0.0	1.0
+chr2	561410	1.0	0.0	1.0
+chr2	561551	0.0	1.0	1.0
+chr2	561568	0.0	1.0	1.0
+chr2	561598	0.0	1.0	1.0
+chr2	561609	1.0	0.0	1.0
+chr2	561622	2.0	0.0	2.0
+chr2	561731	2.0	0.0	2.0
+chr2	561799	2.0	0.0	2.0
+chr2	561836	1.0	0.0	1.0
+chr2	561963	0.0	2.0	2.0
+chr2	562092	1.0	0.0	1.0
+chr2	562248	0.0	1.0	1.0
+chr2	562314	1.0	0.0	1.0
+chr2	562377	1.0	0.0	1.0
+chr2	562392	0.0	1.0	1.0
+chr2	562466	1.0	0.0	1.0
+chr2	562506	1.0	0.0	1.0
+chr2	562580	0.0	1.0	1.0
+chr2	562614	1.0	0.0	1.0
+chr2	562644	1.0	0.0	1.0
+chr2	563379	1.0	0.0	1.0
+chr2	563617	1.0	0.0	1.0
+chr2	563676	1.0	0.0	1.0
+chr2	563726	0.0	1.0	1.0
+chr2	563809	1.0	0.0	1.0
+chr2	564190	0.0	1.0	1.0
+chr2	564358	1.0	0.0	1.0
+chr2	564518	1.0	0.0	1.0
+chr2	564639	1.0	0.0	1.0
+chr2	564847	0.0	1.0	1.0
+chr2	565246	0.0	1.0	1.0
+chr2	565247	3.0	0.0	3.0
+chr2	565253	0.0	1.0	1.0
+chr2	565255	1.0	0.0	1.0
+chr2	565256	4.0	0.0	4.0
+chr2	565259	1.0	0.0	1.0
+chr2	565266	0.0	2.0	2.0
+chr2	565268	1.0	0.0	1.0
+chr2	565271	0.0	2.0	2.0
+chr2	565277	0.0	1.0	1.0
+chr2	565282	1.0	0.0	1.0
+chr2	565364	1.0	0.0	1.0
+chr2	565398	0.0	1.0	1.0
+chr2	565399	0.0	1.0	1.0
+chr2	565428	1.0	0.0	1.0
+chr2	565611	1.0	0.0	1.0
+chr2	565627	0.0	1.0	1.0
+chr2	565638	0.0	1.0	1.0
+chr2	565644	0.0	1.0	1.0
+chr2	565650	2.0	0.0	2.0
+chr2	565661	0.0	4.0	4.0
+chr2	565662	0.0	1.0	1.0
+chr2	565666	0.0	2.0	2.0
+chr2	565668	1.0	0.0	1.0
+chr2	565670	6.0	1.0	7.0
+chr2	565671	2.0	0.0	2.0
+chr2	565673	3.0	0.0	3.0
+chr2	565674	0.0	1.0	1.0
+chr2	565677	0.0	1.0	1.0
+chr2	565678	0.0	1.0	1.0
+chr2	565680	2.0	0.0	2.0
+chr2	565681	2.0	0.0	2.0
+chr2	565689	1.0	0.0	1.0
+chr2	565692	0.0	1.0	1.0
+chr2	565694	2.0	0.0	2.0
+chr2	565696	0.0	1.0	1.0
+chr2	565700	0.0	1.0	1.0
+chr2	565726	1.0	0.0	1.0
+chr2	565843	0.0	1.0	1.0
+chr2	565857	1.0	0.0	1.0
+chr2	565866	1.0	0.0	1.0
+chr2	565999	0.0	1.0	1.0
+chr2	566023	0.0	1.0	1.0
+chr2	566038	1.0	0.0	1.0
+chr2	566183	0.0	1.0	1.0
+chr2	566198	0.0	1.0	1.0
+chr2	566219	1.0	0.0	1.0
+chr2	566371	0.0	1.0	1.0
+chr2	566867	1.0	0.0	1.0
+chr2	567031	1.0	0.0	1.0
+chr2	567054	0.0	1.0	1.0
+chr2	567056	0.0	2.0	2.0
+chr2	567060	1.0	0.0	1.0
+chr2	567109	0.0	2.0	2.0
+chr2	567285	0.0	1.0	1.0
+chr2	567521	0.0	1.0	1.0
+chr2	567908	0.0	1.0	1.0
+chr2	567954	1.0	0.0	1.0
+chr2	568155	0.0	1.0	1.0
+chr2	568158	0.0	1.0	1.0
+chr2	568159	0.0	1.0	1.0
+chr2	568170	0.0	1.0	1.0
+chr2	568180	1.0	0.0	1.0
+chr2	568320	2.0	0.0	2.0
+chr2	568323	0.0	1.0	1.0
+chr2	568483	1.0	0.0	1.0
+chr2	568487	0.0	1.0	1.0
+chr2	568498	0.0	2.0	2.0
+chr2	568505	2.0	0.0	2.0
+chr2	568513	0.0	2.0	2.0
+chr2	568514	0.0	1.0	1.0
+chr2	568515	2.0	0.0	2.0
+chr2	568528	1.0	0.0	1.0
+chr2	568530	1.0	0.0	1.0
+chr2	568740	0.0	1.0	1.0
+chr2	568764	0.0	1.0	1.0
+chr2	568766	0.0	2.0	2.0
+chr2	568769	0.0	1.0	1.0
+chr2	568783	0.0	1.0	1.0
+chr2	568790	1.0	0.0	1.0
+chr2	568795	0.0	1.0	1.0
+chr2	568796	1.0	0.0	1.0
+chr2	568804	0.0	1.0	1.0
+chr2	568809	0.0	1.0	1.0
+chr2	568813	0.0	3.0	3.0
+chr2	568814	0.0	1.0	1.0
+chr2	568920	1.0	0.0	1.0
+chr2	568938	0.0	1.0	1.0
+chr2	568945	1.0	0.0	1.0
+chr2	568955	1.0	0.0	1.0
+chr2	568968	0.0	1.0	1.0
+chr2	568969	1.0	0.0	1.0
+chr2	569081	1.0	0.0	1.0
+chr2	569124	1.0	0.0	1.0
+chr2	569452	0.0	1.0	1.0
+chr2	569563	0.0	1.0	1.0
+chr2	569895	0.0	1.0	1.0
+chr2	569963	0.0	1.0	1.0
+chr2	570064	0.0	1.0	1.0
+chr2	570204	0.0	1.0	1.0
+chr2	570210	0.0	1.0	1.0
+chr2	570528	1.0	0.0	1.0
+chr2	570847	0.0	1.0	1.0
+chr2	570888	0.0	1.0	1.0
+chr2	570981	1.0	0.0	1.0
+chr2	571021	0.0	1.0	1.0
+chr2	571046	1.0	0.0	1.0
+chr2	571127	1.0	0.0	1.0
+chr2	571168	1.0	0.0	1.0
+chr2	571169	0.0	1.0	1.0
+chr2	571178	0.0	1.0	1.0
+chr2	571181	1.0	0.0	1.0
+chr2	571182	1.0	0.0	1.0
+chr2	571191	2.0	0.0	2.0
+chr2	571192	3.0	0.0	3.0
+chr2	571194	0.0	1.0	1.0
+chr2	571198	0.0	1.0	1.0
+chr2	571200	0.0	1.0	1.0
+chr2	571201	4.0	0.0	4.0
+chr2	571203	0.0	2.0	2.0
+chr2	571204	0.0	1.0	1.0
+chr2	571215	1.0	0.0	1.0
+chr2	571223	2.0	0.0	2.0
+chr2	571233	0.0	1.0	1.0
+chr2	571249	1.0	0.0	1.0
+chr2	571263	1.0	0.0	1.0
+chr2	571443	0.0	1.0	1.0
+chr2	571513	0.0	1.0	1.0
+chr2	571591	1.0	0.0	1.0
+chr2	571674	0.0	1.0	1.0
+chr2	571759	1.0	0.0	1.0
+chr2	571823	1.0	0.0	1.0
+chr2	571839	1.0	0.0	1.0
+chr2	571854	1.0	0.0	1.0
+chr2	571859	1.0	0.0	1.0
+chr2	571860	0.0	1.0	1.0
+chr2	571871	0.0	1.0	1.0
+chr2	571876	1.0	0.0	1.0
+chr2	571886	0.0	1.0	1.0
+chr2	571915	2.0	0.0	2.0
+chr2	572054	1.0	0.0	1.0
+chr2	572077	1.0	0.0	1.0
+chr2	572081	0.0	1.0	1.0
+chr2	572103	0.0	1.0	1.0
+chr2	572104	0.0	1.0	1.0
+chr2	572222	1.0	0.0	1.0
+chr2	572224	1.0	0.0	1.0
+chr2	572231	0.0	1.0	1.0
+chr2	572247	0.0	1.0	1.0
+chr2	572250	1.0	0.0	1.0
+chr2	572260	2.0	0.0	2.0
+chr2	572263	0.0	1.0	1.0
+chr2	572283	1.0	0.0	1.0
+chr2	572287	0.0	1.0	1.0
+chr2	572288	0.0	1.0	1.0
+chr2	572290	1.0	0.0	1.0
+chr2	572291	1.0	0.0	1.0
+chr2	572295	2.0	0.0	2.0
+chr2	572435	0.0	1.0	1.0
+chr2	572439	1.0	0.0	1.0
+chr2	572440	1.0	0.0	1.0
+chr2	572441	0.0	1.0	1.0
+chr2	572448	1.0	0.0	1.0
+chr2	572455	1.0	0.0	1.0
+chr2	572456	0.0	1.0	1.0
+chr2	572464	0.0	1.0	1.0
+chr2	572467	0.0	1.0	1.0
+chr2	572470	1.0	0.0	1.0
+chr2	572486	1.0	0.0	1.0
+chr2	572488	0.0	1.0	1.0
+chr2	572491	0.0	1.0	1.0
+chr2	572505	1.0	0.0	1.0
+chr2	572623	0.0	1.0	1.0
+chr2	572625	2.0	0.0	2.0
+chr2	572628	0.0	1.0	1.0
+chr2	572800	0.0	1.0	1.0
+chr2	572838	2.0	0.0	2.0
+chr2	573245	1.0	0.0	1.0
+chr2	573378	1.0	0.0	1.0
+chr2	573902	0.0	2.0	2.0
+chr2	573906	1.0	0.0	1.0
+chr2	574064	0.0	1.0	1.0
+chr2	574075	0.0	1.0	1.0
+chr2	574078	1.0	0.0	1.0
+chr2	574081	0.0	1.0	1.0
+chr2	574082	1.0	0.0	1.0
+chr2	574084	1.0	0.0	1.0
+chr2	574088	1.0	0.0	1.0
+chr2	574122	3.0	0.0	3.0
+chr2	574125	1.0	0.0	1.0
+chr2	574141	1.0	0.0	1.0
+chr2	574216	0.0	1.0	1.0
+chr2	574276	1.0	0.0	1.0
+chr2	574300	0.0	3.0	3.0
+chr2	574305	0.0	1.0	1.0
+chr2	574307	0.0	1.0	1.0
+chr2	574314	0.0	1.0	1.0
+chr2	574315	0.0	1.0	1.0
+chr2	574316	0.0	1.0	1.0
+chr2	574326	0.0	1.0	1.0
+chr2	574329	0.0	1.0	1.0
+chr2	574334	1.0	0.0	1.0
+chr2	574335	0.0	1.0	1.0
+chr2	574342	0.0	1.0	1.0
+chr2	574344	3.0	0.0	3.0
+chr2	574350	0.0	1.0	1.0
+chr2	574415	1.0	0.0	1.0
+chr2	574501	0.0	1.0	1.0
+chr2	574504	1.0	0.0	1.0
+chr2	574524	0.0	1.0	1.0
+chr2	574593	0.0	1.0	1.0
+chr2	574644	0.0	1.0	1.0
+chr2	574654	1.0	0.0	1.0
+chr2	574757	1.0	0.0	1.0
+chr2	574915	0.0	1.0	1.0
+chr2	574934	1.0	0.0	1.0
+chr2	575068	1.0	0.0	1.0
+chr2	575276	1.0	0.0	1.0
+chr2	575281	1.0	0.0	1.0
+chr2	575406	0.0	1.0	1.0
+chr2	575427	1.0	0.0	1.0
+chr2	575566	0.0	1.0	1.0
+chr2	575719	0.0	1.0	1.0
+chr2	575887	1.0	0.0	1.0
+chr2	575895	1.0	0.0	1.0
+chr2	575905	4.0	0.0	4.0
+chr2	575906	1.0	0.0	1.0
+chr2	575915	0.0	1.0	1.0
+chr2	575917	0.0	2.0	2.0
+chr2	575918	0.0	1.0	1.0
+chr2	576134	1.0	0.0	1.0
+chr2	576323	0.0	1.0	1.0
+chr2	576326	0.0	1.0	1.0
+chr2	576338	1.0	0.0	1.0
+chr2	576341	1.0	0.0	1.0
+chr2	576343	0.0	1.0	1.0
+chr2	576345	3.0	0.0	3.0
+chr2	576356	1.0	0.0	1.0
+chr2	576360	1.0	0.0	1.0
+chr2	576361	0.0	1.0	1.0
+chr2	576386	2.0	0.0	2.0
+chr2	576390	2.0	0.0	2.0
+chr2	576408	0.0	1.0	1.0
+chr2	576414	0.0	1.0	1.0
+chr2	576436	0.0	1.0	1.0
+chr2	576663	0.0	1.0	1.0
+chr2	576665	1.0	0.0	1.0
+chr2	576668	0.0	1.0	1.0
+chr2	576919	1.0	0.0	1.0
+chr2	577423	0.0	1.0	1.0
+chr2	577685	1.0	0.0	1.0
+chr2	577732	2.0	0.0	2.0
+chr2	577743	0.0	1.0	1.0
+chr2	577883	1.0	0.0	1.0
+chr2	577902	0.0	3.0	3.0
+chr2	577905	1.0	0.0	1.0
+chr2	577913	0.0	1.0	1.0
+chr2	578049	1.0	0.0	1.0
+chr2	578059	0.0	2.0	2.0
+chr2	578060	0.0	1.0	1.0
+chr2	578061	0.0	1.0	1.0
+chr2	578062	1.0	0.0	1.0
+chr2	578071	0.0	3.0	3.0
+chr2	578078	1.0	0.0	1.0
+chr2	578079	4.0	0.0	4.0
+chr2	578095	0.0	1.0	1.0
+chr2	578096	0.0	2.0	2.0
+chr2	578335	0.0	1.0	1.0
+chr2	578348	0.0	1.0	1.0
+chr2	578356	0.0	1.0	1.0
+chr2	578361	0.0	1.0	1.0
+chr2	578363	0.0	1.0	1.0
+chr2	578366	0.0	2.0	2.0
+chr2	578368	3.0	0.0	3.0
+chr2	578369	4.0	0.0	4.0
+chr2	578373	0.0	1.0	1.0
+chr2	578374	0.0	4.0	4.0
+chr2	578375	0.0	2.0	2.0
+chr2	578377	0.0	1.0	1.0
+chr2	578378	2.0	0.0	2.0
+chr2	578379	6.0	0.0	6.0
+chr2	578380	2.0	0.0	2.0
+chr2	578381	1.0	0.0	1.0
+chr2	578384	1.0	1.0	2.0
+chr2	578386	1.0	4.0	5.0
+chr2	578387	1.0	0.0	1.0
+chr2	578388	0.0	2.0	2.0
+chr2	578389	0.0	1.0	1.0
+chr2	578390	1.0	0.0	1.0
+chr2	578395	2.0	0.0	2.0
+chr2	578399	2.0	0.0	2.0
+chr2	578415	1.0	0.0	1.0
+chr2	578524	2.0	0.0	2.0
+chr2	578531	0.0	2.0	2.0
+chr2	578533	0.0	2.0	2.0
+chr2	578539	1.0	0.0	1.0
+chr2	578543	1.0	0.0	1.0
+chr2	578548	1.0	0.0	1.0
+chr2	578560	0.0	1.0	1.0
+chr2	578562	0.0	3.0	3.0
+chr2	578570	0.0	1.0	1.0
+chr2	578690	0.0	1.0	1.0
+chr2	578700	1.0	0.0	1.0
+chr2	578869	1.0	0.0	1.0
+chr2	578875	0.0	1.0	1.0
+chr2	578895	1.0	0.0	1.0
+chr2	579232	0.0	1.0	1.0
+chr2	579653	1.0	0.0	1.0
+chr2	579813	0.0	1.0	1.0
+chr2	580770	2.0	0.0	2.0
+chr2	580788	0.0	1.0	1.0
+chr2	580913	1.0	0.0	1.0
+chr2	581118	0.0	1.0	1.0
+chr2	581223	0.0	1.0	1.0
+chr2	581243	0.0	1.0	1.0
+chr2	581254	0.0	1.0	1.0
+chr2	581266	1.0	0.0	1.0
+chr2	581268	1.0	0.0	1.0
+chr2	581269	0.0	1.0	1.0
+chr2	581294	1.0	0.0	1.0
+chr2	581404	1.0	0.0	1.0
+chr2	581405	0.0	2.0	2.0
+chr2	581409	0.0	1.0	1.0
+chr2	581417	1.0	0.0	1.0
+chr2	581418	0.0	1.0	1.0
+chr2	581420	2.0	1.0	3.0
+chr2	581421	2.0	0.0	2.0
+chr2	581429	1.0	0.0	1.0
+chr2	581430	1.0	0.0	1.0
+chr2	581434	0.0	1.0	1.0
+chr2	581435	0.0	1.0	1.0
+chr2	581441	1.0	0.0	1.0
+chr2	581443	0.0	1.0	1.0
+chr2	581444	4.0	1.0	5.0
+chr2	581446	0.0	1.0	1.0
+chr2	581447	0.0	1.0	1.0
+chr2	581451	0.0	1.0	1.0
+chr2	581733	0.0	1.0	1.0
+chr2	581769	0.0	1.0	1.0
+chr2	581844	1.0	0.0	1.0
+chr2	582084	1.0	0.0	1.0
+chr2	582113	1.0	0.0	1.0
+chr2	582122	0.0	1.0	1.0
+chr2	582145	1.0	0.0	1.0
+chr2	582147	1.0	0.0	1.0
+chr2	582159	1.0	1.0	2.0
+chr2	582160	0.0	1.0	1.0
+chr2	582367	1.0	0.0	1.0
+chr2	582395	1.0	0.0	1.0
+chr2	582400	2.0	0.0	2.0
+chr2	582416	0.0	5.0	5.0
+chr2	582417	0.0	1.0	1.0
+chr2	582418	0.0	1.0	1.0
+chr2	582422	4.0	1.0	5.0
+chr2	582423	20.0	0.0	20.0
+chr2	582424	0.0	5.0	5.0
+chr2	582427	3.0	0.0	3.0
+chr2	582428	3.0	0.0	3.0
+chr2	582430	0.0	3.0	3.0
+chr2	582431	1.0	1.0	2.0
+chr2	582432	4.0	3.0	7.0
+chr2	582438	1.0	0.0	1.0
+chr2	582439	6.0	1.0	7.0
+chr2	582441	0.0	4.0	4.0
+chr2	582447	1.0	0.0	1.0
+chr2	582451	1.0	0.0	1.0
+chr2	582452	1.0	0.0	1.0
+chr2	582466	3.0	0.0	3.0
+chr2	582578	1.0	0.0	1.0
+chr2	582598	0.0	1.0	1.0
+chr2	582600	1.0	0.0	1.0
+chr2	582602	2.0	1.0	3.0
+chr2	582614	0.0	1.0	1.0
+chr2	582792	0.0	1.0	1.0
+chr2	582795	2.0	0.0	2.0
+chr2	583082	0.0	1.0	1.0
+chr2	583107	0.0	1.0	1.0
+chr2	583216	1.0	0.0	1.0
+chr2	583261	1.0	0.0	1.0
+chr2	583274	1.0	0.0	1.0
+chr2	583390	0.0	2.0	2.0
+chr2	583610	2.0	0.0	2.0
+chr2	583614	0.0	1.0	1.0
+chr2	583619	1.0	0.0	1.0
+chr2	583627	1.0	0.0	1.0
+chr2	583631	0.0	1.0	1.0
+chr2	583637	2.0	0.0	2.0
+chr2	583639	0.0	1.0	1.0
+chr2	583642	0.0	1.0	1.0
+chr2	583645	0.0	1.0	1.0
+chr2	583654	2.0	0.0	2.0
+chr2	583656	1.0	0.0	1.0
+chr2	583657	1.0	0.0	1.0
+chr2	583663	1.0	0.0	1.0
+chr2	583800	0.0	1.0	1.0
+chr2	583811	2.0	0.0	2.0
+chr2	583839	1.0	0.0	1.0
+chr2	583841	0.0	1.0	1.0
+chr2	583845	1.0	1.0	2.0
+chr2	583971	1.0	0.0	1.0
+chr2	584141	1.0	0.0	1.0
+chr2	584163	1.0	0.0	1.0
+chr2	584166	0.0	1.0	1.0
+chr2	584313	0.0	2.0	2.0
+chr2	584330	1.0	0.0	1.0
+chr2	584336	2.0	0.0	2.0
+chr2	584339	1.0	0.0	1.0
+chr2	584346	1.0	0.0	1.0
+chr2	584492	0.0	2.0	2.0
+chr2	584540	0.0	3.0	3.0
+chr2	584779	1.0	0.0	1.0
+chr2	584799	1.0	0.0	1.0
+chr2	584994	1.0	0.0	1.0
+chr2	585068	1.0	0.0	1.0
+chr2	585154	0.0	2.0	2.0
+chr2	585236	0.0	1.0	1.0
+chr2	585387	0.0	1.0	1.0
+chr2	585697	0.0	1.0	1.0
+chr2	585799	1.0	0.0	1.0
+chr2	585959	0.0	1.0	1.0
+chr2	586129	1.0	0.0	1.0
+chr2	586150	0.0	2.0	2.0
+chr2	586153	1.0	0.0	1.0
+chr2	586158	0.0	1.0	1.0
+chr2	586163	2.0	0.0	2.0
+chr2	586166	0.0	1.0	1.0
+chr2	586179	1.0	0.0	1.0
+chr2	586182	1.0	0.0	1.0
+chr2	586190	1.0	0.0	1.0
+chr2	586195	0.0	1.0	1.0
+chr2	586572	1.0	0.0	1.0
+chr2	586580	1.0	0.0	1.0
+chr2	586585	1.0	0.0	1.0
+chr2	586586	0.0	1.0	1.0
+chr2	586605	1.0	0.0	1.0
+chr2	586612	0.0	1.0	1.0
+chr2	586719	0.0	1.0	1.0
+chr2	586742	0.0	1.0	1.0
+chr2	586745	1.0	0.0	1.0
+chr2	586787	0.0	2.0	2.0
+chr2	586902	2.0	0.0	2.0
+chr2	587033	0.0	1.0	1.0
+chr2	587530	0.0	1.0	1.0
+chr2	587886	0.0	1.0	1.0
+chr2	588103	1.0	0.0	1.0
+chr2	588259	1.0	0.0	1.0
+chr2	588801	0.0	1.0	1.0
+chr2	588939	1.0	0.0	1.0
+chr2	588948	1.0	0.0	1.0
+chr2	588950	0.0	1.0	1.0
+chr2	588951	1.0	0.0	1.0
+chr2	588953	0.0	2.0	2.0
+chr2	588954	1.0	0.0	1.0
+chr2	588957	2.0	0.0	2.0
+chr2	588983	1.0	0.0	1.0
+chr2	588991	0.0	1.0	1.0
+chr2	589014	0.0	2.0	2.0
+chr2	589081	0.0	1.0	1.0
+chr2	589098	0.0	2.0	2.0
+chr2	589102	1.0	0.0	1.0
+chr2	589104	1.0	0.0	1.0
+chr2	589111	0.0	3.0	3.0
+chr2	589118	0.0	1.0	1.0
+chr2	589119	0.0	1.0	1.0
+chr2	589121	4.0	0.0	4.0
+chr2	589124	1.0	0.0	1.0
+chr2	589137	1.0	0.0	1.0
+chr2	589145	0.0	1.0	1.0
+chr2	589147	2.0	3.0	5.0
+chr2	589149	2.0	0.0	2.0
+chr2	589152	1.0	0.0	1.0
+chr2	589154	0.0	1.0	1.0
+chr2	589163	2.0	0.0	2.0
+chr2	589166	1.0	0.0	1.0
+chr2	589169	0.0	1.0	1.0
+chr2	589170	0.0	1.0	1.0
+chr2	589379	0.0	1.0	1.0
+chr2	589447	1.0	2.0	3.0
+chr2	589452	1.0	0.0	1.0
+chr2	589459	0.0	1.0	1.0
+chr2	589461	0.0	2.0	2.0
+chr2	589464	0.0	1.0	1.0
+chr2	589466	0.0	3.0	3.0
+chr2	589467	0.0	2.0	2.0
+chr2	589470	1.0	0.0	1.0
+chr2	589475	1.0	0.0	1.0
+chr2	589476	0.0	1.0	1.0
+chr2	589479	1.0	0.0	1.0
+chr2	589483	1.0	0.0	1.0
+chr2	589495	2.0	0.0	2.0
+chr2	589701	1.0	0.0	1.0
+chr2	589884	0.0	1.0	1.0
+chr2	589904	0.0	1.0	1.0
+chr2	590012	0.0	1.0	1.0
+chr2	590181	1.0	0.0	1.0
+chr2	590214	1.0	0.0	1.0
+chr2	590386	1.0	0.0	1.0
+chr2	590531	0.0	1.0	1.0
+chr2	590549	1.0	0.0	1.0
+chr2	590662	0.0	1.0	1.0
+chr2	590684	1.0	0.0	1.0
+chr2	590693	1.0	0.0	1.0
+chr2	590729	1.0	0.0	1.0
+chr2	590732	0.0	1.0	1.0
+chr2	590735	0.0	1.0	1.0
+chr2	590883	0.0	2.0	2.0
+chr2	590917	1.0	0.0	1.0
+chr2	590944	1.0	0.0	1.0
+chr2	590976	0.0	1.0	1.0
+chr2	591233	1.0	0.0	1.0
+chr2	591245	1.0	0.0	1.0
+chr2	591274	1.0	0.0	1.0
+chr2	591278	0.0	1.0	1.0
+chr2	591279	1.0	0.0	1.0
+chr2	591282	0.0	1.0	1.0
+chr2	591288	0.0	1.0	1.0
+chr2	591291	0.0	1.0	1.0
+chr2	591298	4.0	0.0	4.0
+chr2	591308	1.0	0.0	1.0
+chr2	591310	0.0	1.0	1.0
+chr2	591316	2.0	0.0	2.0
+chr2	591319	4.0	0.0	4.0
+chr2	591321	0.0	2.0	2.0
+chr2	591326	0.0	1.0	1.0
+chr2	591327	1.0	1.0	2.0
+chr2	591331	0.0	1.0	1.0
+chr2	591332	0.0	2.0	2.0
+chr2	591341	1.0	0.0	1.0
+chr2	591346	0.0	1.0	1.0
+chr2	591357	0.0	1.0	1.0
+chr2	591361	1.0	0.0	1.0
+chr2	591370	0.0	2.0	2.0
+chr2	592334	0.0	1.0	1.0
+chr2	592421	1.0	0.0	1.0
+chr2	592685	0.0	2.0	2.0
+chr2	592771	3.0	0.0	3.0
+chr2	593260	0.0	1.0	1.0
+chr2	593262	0.0	1.0	1.0
+chr2	593265	0.0	1.0	1.0
+chr2	593266	0.0	2.0	2.0
+chr2	593269	0.0	1.0	1.0
+chr2	593276	0.0	1.0	1.0
+chr2	593297	2.0	0.0	2.0
+chr2	593317	0.0	1.0	1.0
+chr2	593329	1.0	0.0	1.0
+chr2	593391	1.0	0.0	1.0
+chr2	593419	1.0	0.0	1.0
+chr2	593559	0.0	1.0	1.0
+chr2	593587	0.0	1.0	1.0
+chr2	593588	1.0	0.0	1.0
+chr2	593596	0.0	1.0	1.0
+chr2	593718	1.0	0.0	1.0
+chr2	593730	0.0	1.0	1.0
+chr2	593776	0.0	1.0	1.0
+chr2	593778	0.0	1.0	1.0
+chr2	593786	0.0	1.0	1.0
+chr2	593877	0.0	2.0	2.0
+chr2	593881	0.0	1.0	1.0
+chr2	593896	1.0	0.0	1.0
+chr2	593910	1.0	0.0	1.0
+chr2	593946	1.0	0.0	1.0
+chr2	593980	1.0	0.0	1.0
+chr2	594036	1.0	0.0	1.0
+chr2	594056	0.0	1.0	1.0
+chr2	594119	0.0	1.0	1.0
+chr2	594126	0.0	1.0	1.0
+chr2	594303	0.0	1.0	1.0
+chr2	594310	0.0	1.0	1.0
+chr2	594321	1.0	0.0	1.0
+chr2	594327	1.0	0.0	1.0
+chr2	594459	1.0	0.0	1.0
+chr2	594474	0.0	2.0	2.0
+chr2	594490	1.0	0.0	1.0
+chr2	594547	0.0	2.0	2.0
+chr2	594583	0.0	1.0	1.0
+chr2	594646	0.0	1.0	1.0
+chr2	594658	0.0	1.0	1.0
+chr2	594667	0.0	1.0	1.0
+chr2	594705	1.0	0.0	1.0
+chr2	594721	0.0	1.0	1.0
+chr2	594799	1.0	0.0	1.0
+chr2	594805	0.0	2.0	2.0
+chr2	594822	1.0	0.0	1.0
+chr2	594996	0.0	1.0	1.0
+chr2	595010	0.0	1.0	1.0
+chr2	595023	1.0	0.0	1.0
+chr2	595037	0.0	1.0	1.0
+chr2	595090	0.0	1.0	1.0
+chr2	595247	1.0	0.0	1.0
+chr2	595253	1.0	0.0	1.0
+chr2	595261	1.0	0.0	1.0
+chr2	595287	0.0	1.0	1.0
+chr2	595299	1.0	0.0	1.0
+chr2	595311	1.0	0.0	1.0
+chr2	595314	0.0	1.0	1.0
+chr2	595319	1.0	0.0	1.0
+chr2	595322	1.0	0.0	1.0
+chr2	595324	0.0	1.0	1.0
+chr2	595351	1.0	0.0	1.0
+chr2	595352	0.0	1.0	1.0
+chr2	595353	0.0	1.0	1.0
+chr2	595364	0.0	1.0	1.0
+chr2	595400	1.0	0.0	1.0
+chr2	595504	0.0	1.0	1.0
+chr2	595517	0.0	1.0	1.0
+chr2	595524	1.0	0.0	1.0
+chr2	595528	0.0	2.0	2.0
+chr2	595547	1.0	0.0	1.0
+chr2	595639	1.0	0.0	1.0
+chr2	596149	1.0	0.0	1.0
+chr2	596152	1.0	0.0	1.0
+chr2	596165	0.0	1.0	1.0
+chr2	596181	1.0	0.0	1.0
+chr2	596188	0.0	1.0	1.0
+chr2	596206	1.0	0.0	1.0
+chr2	596375	1.0	0.0	1.0
+chr2	596380	2.0	0.0	2.0
+chr2	596421	0.0	1.0	1.0
+chr2	596439	1.0	0.0	1.0
+chr2	596464	1.0	0.0	1.0
+chr2	596487	0.0	1.0	1.0
+chr2	596499	1.0	0.0	1.0
+chr2	596524	0.0	1.0	1.0
+chr2	596957	1.0	0.0	1.0
+chr2	596960	0.0	1.0	1.0
+chr2	596971	0.0	1.0	1.0
+chr2	596978	1.0	0.0	1.0
+chr2	597366	1.0	0.0	1.0
+chr2	597367	1.0	0.0	1.0
+chr2	597368	1.0	0.0	1.0
+chr2	597380	0.0	3.0	3.0
+chr2	597381	0.0	1.0	1.0
+chr2	597394	1.0	0.0	1.0
+chr2	597405	1.0	0.0	1.0
+chr2	597539	0.0	1.0	1.0
+chr2	597540	0.0	1.0	1.0
+chr2	597545	0.0	2.0	2.0
+chr2	597546	0.0	1.0	1.0
+chr2	597562	1.0	0.0	1.0
+chr2	597651	0.0	1.0	1.0
+chr2	597669	1.0	0.0	1.0
+chr2	597677	1.0	0.0	1.0
+chr2	597706	1.0	0.0	1.0
+chr2	597720	0.0	1.0	1.0
+chr2	597729	3.0	0.0	3.0
+chr2	597732	1.0	0.0	1.0
+chr2	597847	1.0	0.0	1.0
+chr2	597894	1.0	0.0	1.0
+chr2	598029	1.0	0.0	1.0
+chr2	598082	1.0	0.0	1.0
+chr2	598253	0.0	1.0	1.0
+chr2	598320	1.0	0.0	1.0
+chr2	598394	0.0	1.0	1.0
+chr2	598401	0.0	1.0	1.0
+chr2	598403	1.0	0.0	1.0
+chr2	598409	0.0	1.0	1.0
+chr2	598421	0.0	1.0	1.0
+chr2	598423	1.0	0.0	1.0
+chr2	598436	0.0	2.0	2.0
+chr2	598440	3.0	0.0	3.0
+chr2	598572	2.0	0.0	2.0
+chr2	598573	1.0	0.0	1.0
+chr2	598628	0.0	1.0	1.0
+chr2	598647	1.0	0.0	1.0
+chr2	598658	1.0	0.0	1.0
+chr2	598711	1.0	0.0	1.0
+chr2	598856	1.0	0.0	1.0
+chr2	599366	1.0	0.0	1.0
+chr2	599505	1.0	0.0	1.0
+chr2	599507	0.0	1.0	1.0
+chr2	599512	0.0	1.0	1.0
+chr2	599513	0.0	1.0	1.0
+chr2	599606	1.0	0.0	1.0
+chr2	599725	0.0	1.0	1.0
+chr2	599738	1.0	0.0	1.0
+chr2	599742	0.0	1.0	1.0
+chr2	599748	1.0	0.0	1.0
+chr2	599754	1.0	0.0	1.0
+chr2	599762	0.0	1.0	1.0
+chr2	599773	0.0	2.0	2.0
+chr2	599775	1.0	0.0	1.0
+chr2	599776	1.0	0.0	1.0
+chr2	599786	1.0	0.0	1.0
+chr2	599804	0.0	1.0	1.0
+chr2	599886	0.0	1.0	1.0
+chr2	599927	1.0	0.0	1.0
+chr2	599932	0.0	6.0	6.0
+chr2	599934	0.0	1.0	1.0
+chr2	599935	2.0	0.0	2.0
+chr2	599936	1.0	1.0	2.0
+chr2	599937	2.0	2.0	4.0
+chr2	599938	0.0	1.0	1.0
+chr2	599942	0.0	3.0	3.0
+chr2	599943	0.0	3.0	3.0
+chr2	599945	0.0	2.0	2.0
+chr2	599951	0.0	1.0	1.0
+chr2	599952	0.0	1.0	1.0
+chr2	599953	1.0	0.0	1.0
+chr2	599961	0.0	1.0	1.0
+chr2	599975	2.0	0.0	2.0
+chr2	600035	0.0	1.0	1.0
+chr2	600145	0.0	1.0	1.0
+chr2	600168	0.0	1.0	1.0
+chr2	600169	0.0	1.0	1.0
+chr2	600173	4.0	0.0	4.0
+chr2	600178	4.0	0.0	4.0
+chr2	600181	0.0	1.0	1.0
+chr2	600183	1.0	0.0	1.0
+chr2	600184	0.0	1.0	1.0
+chr2	600185	0.0	2.0	2.0
+chr2	600188	1.0	1.0	2.0
+chr2	600190	1.0	0.0	1.0
+chr2	600195	0.0	2.0	2.0
+chr2	600196	1.0	3.0	4.0
+chr2	600197	0.0	3.0	3.0
+chr2	600198	0.0	1.0	1.0
+chr2	600199	1.0	0.0	1.0
+chr2	600200	1.0	0.0	1.0
+chr2	600201	1.0	0.0	1.0
+chr2	600212	0.0	4.0	4.0
+chr2	600219	0.0	2.0	2.0
+chr2	600232	1.0	0.0	1.0
+chr2	600521	1.0	0.0	1.0
+chr2	600524	1.0	0.0	1.0
+chr2	600533	0.0	1.0	1.0
+chr2	600551	0.0	2.0	2.0
+chr2	600590	1.0	0.0	1.0
+chr2	600595	0.0	1.0	1.0
+chr2	600627	0.0	2.0	2.0
+chr2	600684	1.0	0.0	1.0
+chr2	600703	0.0	1.0	1.0
+chr2	600707	2.0	0.0	2.0
+chr2	600716	1.0	0.0	1.0
+chr2	600723	0.0	1.0	1.0
+chr2	600731	0.0	3.0	3.0
+chr2	600747	0.0	1.0	1.0
+chr2	600765	0.0	1.0	1.0
+chr2	600846	0.0	1.0	1.0
+chr2	600880	0.0	1.0	1.0
+chr2	601069	1.0	0.0	1.0
+chr2	601095	0.0	1.0	1.0
+chr2	601114	0.0	1.0	1.0
+chr2	601184	1.0	0.0	1.0
+chr2	601277	1.0	0.0	1.0
+chr2	602013	0.0	2.0	2.0
+chr2	602191	1.0	0.0	1.0
+chr2	602192	0.0	2.0	2.0
+chr2	602196	0.0	1.0	1.0
+chr2	602204	1.0	0.0	1.0
+chr2	602205	0.0	3.0	3.0
+chr2	602215	0.0	1.0	1.0
+chr2	602224	0.0	1.0	1.0
+chr2	602226	1.0	0.0	1.0
+chr2	602230	0.0	1.0	1.0
+chr2	602231	1.0	0.0	1.0
+chr2	602544	0.0	1.0	1.0
+chr2	602549	1.0	1.0	2.0
+chr2	602550	0.0	1.0	1.0
+chr2	602620	1.0	0.0	1.0
+chr2	602680	1.0	0.0	1.0
+chr2	602682	1.0	0.0	1.0
+chr2	602707	0.0	1.0	1.0
+chr2	602720	1.0	0.0	1.0
+chr2	602733	1.0	0.0	1.0
+chr2	602804	0.0	1.0	1.0
+chr2	602920	1.0	0.0	1.0
+chr2	603366	0.0	1.0	1.0
+chr2	603587	0.0	1.0	1.0
+chr2	603657	1.0	1.0	2.0
+chr2	603726	0.0	1.0	1.0
+chr2	603728	0.0	1.0	1.0
+chr2	603744	0.0	1.0	1.0
+chr2	603766	1.0	0.0	1.0
+chr2	603776	0.0	1.0	1.0
+chr2	603806	0.0	1.0	1.0
+chr2	603816	1.0	0.0	1.0
+chr2	603823	1.0	0.0	1.0
+chr2	603962	2.0	0.0	2.0
+chr2	603963	0.0	1.0	1.0
+chr2	604020	1.0	0.0	1.0
+chr2	604084	1.0	0.0	1.0
+chr2	604097	1.0	0.0	1.0
+chr2	604109	0.0	1.0	1.0
+chr2	604113	4.0	0.0	4.0
+chr2	604117	0.0	1.0	1.0
+chr2	604119	1.0	2.0	3.0
+chr2	604123	1.0	1.0	2.0
+chr2	604128	0.0	1.0	1.0
+chr2	604130	3.0	0.0	3.0
+chr2	604132	3.0	0.0	3.0
+chr2	604133	1.0	0.0	1.0
+chr2	604134	2.0	1.0	3.0
+chr2	604135	4.0	0.0	4.0
+chr2	604137	1.0	0.0	1.0
+chr2	604138	4.0	0.0	4.0
+chr2	604140	1.0	0.0	1.0
+chr2	604143	1.0	0.0	1.0
+chr2	604144	0.0	1.0	1.0
+chr2	604147	1.0	1.0	2.0
+chr2	604150	1.0	0.0	1.0
+chr2	604153	0.0	3.0	3.0
+chr2	604160	0.0	2.0	2.0
+chr2	604534	0.0	1.0	1.0
+chr2	604541	0.0	4.0	4.0
+chr2	605144	1.0	0.0	1.0
+chr2	605231	1.0	0.0	1.0
+chr2	605608	2.0	0.0	2.0
+chr2	605755	0.0	1.0	1.0
+chr2	605760	2.0	0.0	2.0
+chr2	605766	0.0	1.0	1.0
+chr2	605768	0.0	2.0	2.0
+chr2	605776	1.0	0.0	1.0
+chr2	605777	0.0	1.0	1.0
+chr2	606071	0.0	1.0	1.0
+chr2	606720	0.0	1.0	1.0
+chr2	606823	0.0	1.0	1.0
+chr2	607501	1.0	0.0	1.0
+chr2	607515	1.0	0.0	1.0
+chr2	607518	0.0	1.0	1.0
+chr2	607525	0.0	1.0	1.0
+chr2	607530	1.0	0.0	1.0
+chr2	607532	1.0	0.0	1.0
+chr2	607533	0.0	1.0	1.0
+chr2	607539	1.0	0.0	1.0
+chr2	607649	1.0	0.0	1.0
+chr2	607693	1.0	0.0	1.0
+chr2	607704	1.0	0.0	1.0
+chr2	608163	1.0	0.0	1.0
+chr2	608189	1.0	0.0	1.0
+chr2	609118	0.0	1.0	1.0
+chr2	609157	0.0	1.0	1.0
+chr2	609159	1.0	0.0	1.0
+chr2	609160	1.0	0.0	1.0
+chr2	609161	0.0	1.0	1.0
+chr2	609170	0.0	1.0	1.0
+chr2	609174	1.0	0.0	1.0
+chr2	609175	0.0	1.0	1.0
+chr2	609201	1.0	0.0	1.0
+chr2	609231	0.0	1.0	1.0
+chr2	609365	1.0	0.0	1.0
+chr2	609383	0.0	1.0	1.0
+chr2	609389	0.0	1.0	1.0
+chr2	609391	1.0	0.0	1.0
+chr2	609527	0.0	1.0	1.0
+chr2	609537	0.0	1.0	1.0
+chr2	609545	1.0	1.0	2.0
+chr2	609559	1.0	0.0	1.0
+chr2	609562	1.0	0.0	1.0
+chr2	609563	0.0	1.0	1.0
+chr2	609675	0.0	1.0	1.0
+chr2	609682	0.0	1.0	1.0
+chr2	609687	1.0	0.0	1.0
+chr2	609697	3.0	0.0	3.0
+chr2	609700	0.0	1.0	1.0
+chr2	609701	0.0	1.0	1.0
+chr2	609703	0.0	1.0	1.0
+chr2	609704	1.0	0.0	1.0
+chr2	609705	1.0	0.0	1.0
+chr2	609709	1.0	0.0	1.0
+chr2	609710	3.0	0.0	3.0
+chr2	609711	0.0	1.0	1.0
+chr2	609721	0.0	1.0	1.0
+chr2	609724	0.0	1.0	1.0
+chr2	609725	1.0	0.0	1.0
+chr2	609726	4.0	1.0	5.0
+chr2	609727	0.0	2.0	2.0
+chr2	609735	0.0	1.0	1.0
+chr2	609738	0.0	1.0	1.0
+chr2	609739	1.0	0.0	1.0
+chr2	609746	0.0	2.0	2.0
+chr2	609748	0.0	1.0	1.0
+chr2	609769	1.0	0.0	1.0
+chr2	609957	0.0	1.0	1.0
+chr2	610064	0.0	1.0	1.0
+chr2	610099	0.0	1.0	1.0
+chr2	610109	0.0	1.0	1.0
+chr2	610119	1.0	0.0	1.0
+chr2	610130	0.0	1.0	1.0
+chr2	610133	3.0	0.0	3.0
+chr2	610138	3.0	0.0	3.0
+chr2	610147	0.0	1.0	1.0
+chr2	610173	1.0	0.0	1.0
+chr2	610204	1.0	0.0	1.0
+chr2	610332	0.0	1.0	1.0
+chr2	610337	1.0	0.0	1.0
+chr2	610346	1.0	0.0	1.0
+chr2	610348	1.0	0.0	1.0
+chr2	610432	0.0	1.0	1.0
+chr2	610668	0.0	1.0	1.0
+chr2	611017	0.0	1.0	1.0
+chr2	611030	0.0	3.0	3.0
+chr2	611187	1.0	0.0	1.0
+chr2	611270	0.0	1.0	1.0
+chr2	611339	1.0	0.0	1.0
+chr2	611504	1.0	0.0	1.0
+chr2	611550	0.0	1.0	1.0
+chr2	611684	0.0	1.0	1.0
+chr2	611733	1.0	0.0	1.0
+chr2	611762	0.0	1.0	1.0
+chr2	611773	0.0	1.0	1.0
+chr2	611783	1.0	0.0	1.0
+chr2	611822	0.0	1.0	1.0
+chr2	611845	2.0	0.0	2.0
+chr2	611847	0.0	1.0	1.0
+chr2	611850	0.0	1.0	1.0
+chr2	611851	1.0	0.0	1.0
+chr2	611856	1.0	0.0	1.0
+chr2	611858	0.0	2.0	2.0
+chr2	611861	6.0	0.0	6.0
+chr2	611866	1.0	0.0	1.0
+chr2	611872	1.0	0.0	1.0
+chr2	611873	1.0	0.0	1.0
+chr2	611874	0.0	1.0	1.0
+chr2	611877	0.0	1.0	1.0
+chr2	611907	1.0	0.0	1.0
+chr2	611997	1.0	0.0	1.0
+chr2	612007	1.0	0.0	1.0
+chr2	612548	0.0	1.0	1.0
+chr2	612649	1.0	0.0	1.0
+chr2	612652	1.0	0.0	1.0
+chr2	612723	1.0	0.0	1.0
+chr2	612994	0.0	1.0	1.0
+chr2	613224	0.0	1.0	1.0
+chr2	613570	0.0	1.0	1.0
+chr2	613638	0.0	1.0	1.0
+chr2	614482	1.0	0.0	1.0
+chr2	614637	1.0	0.0	1.0
+chr2	614638	1.0	0.0	1.0
+chr2	615002	1.0	0.0	1.0
+chr2	615312	0.0	1.0	1.0
+chr2	615320	1.0	0.0	1.0
+chr2	615362	1.0	0.0	1.0
+chr2	615393	1.0	0.0	1.0
+chr2	615431	0.0	1.0	1.0
+chr2	615452	1.0	0.0	1.0
+chr2	615515	0.0	1.0	1.0
+chr2	615809	0.0	1.0	1.0
+chr2	615810	0.0	1.0	1.0
+chr2	615811	1.0	0.0	1.0
+chr2	615818	3.0	1.0	4.0
+chr2	615820	3.0	0.0	3.0
+chr2	615821	1.0	0.0	1.0
+chr2	615829	0.0	1.0	1.0
+chr2	615838	1.0	0.0	1.0
+chr2	616279	1.0	0.0	1.0
+chr2	616960	1.0	0.0	1.0
+chr2	616998	1.0	0.0	1.0
+chr2	617030	0.0	1.0	1.0
+chr2	617045	0.0	1.0	1.0
+chr2	618350	0.0	1.0	1.0
+chr2	618357	1.0	0.0	1.0
+chr2	618364	1.0	0.0	1.0
+chr2	618366	0.0	1.0	1.0
+chr2	618376	1.0	0.0	1.0
+chr2	618427	0.0	2.0	2.0
+chr2	618488	0.0	4.0	4.0
+chr2	618500	0.0	1.0	1.0
+chr2	618501	0.0	1.0	1.0
+chr2	618507	0.0	1.0	1.0
+chr2	618516	4.0	0.0	4.0
+chr2	618517	5.0	0.0	5.0
+chr2	618518	0.0	1.0	1.0
+chr2	618520	4.0	0.0	4.0
+chr2	618526	0.0	10.0	10.0
+chr2	618527	0.0	4.0	4.0
+chr2	618528	1.0	4.0	5.0
+chr2	618532	3.0	0.0	3.0
+chr2	618533	1.0	0.0	1.0
+chr2	618535	1.0	0.0	1.0
+chr2	618536	0.0	1.0	1.0
+chr2	618537	0.0	2.0	2.0
+chr2	618541	1.0	0.0	1.0
+chr2	618544	0.0	1.0	1.0
+chr2	618548	0.0	1.0	1.0
+chr2	618551	1.0	0.0	1.0
+chr2	618820	0.0	1.0	1.0
+chr2	618835	2.0	0.0	2.0
+chr2	618836	2.0	0.0	2.0
+chr2	618838	3.0	0.0	3.0
+chr2	618844	1.0	0.0	1.0
+chr2	618845	7.0	0.0	7.0
+chr2	618846	0.0	3.0	3.0
+chr2	618847	2.0	2.0	4.0
+chr2	618848	0.0	1.0	1.0
+chr2	618852	0.0	2.0	2.0
+chr2	618853	0.0	1.0	1.0
+chr2	618856	3.0	1.0	4.0
+chr2	618857	2.0	0.0	2.0
+chr2	618858	0.0	2.0	2.0
+chr2	618863	0.0	2.0	2.0
+chr2	618865	0.0	1.0	1.0
+chr2	618866	0.0	1.0	1.0
+chr2	618868	0.0	5.0	5.0
+chr2	618869	1.0	0.0	1.0
+chr2	618870	1.0	0.0	1.0
+chr2	618871	1.0	0.0	1.0
+chr2	618882	1.0	0.0	1.0
+chr2	618891	1.0	0.0	1.0
+chr2	618916	0.0	1.0	1.0
+chr2	618997	0.0	1.0	1.0
+chr2	619006	1.0	0.0	1.0
+chr2	619018	1.0	0.0	1.0
+chr2	619020	1.0	0.0	1.0
+chr2	619024	1.0	0.0	1.0
+chr2	619027	0.0	1.0	1.0
+chr2	619321	1.0	0.0	1.0
+chr2	619749	0.0	1.0	1.0
+chr2	619798	1.0	0.0	1.0
+chr2	619834	1.0	0.0	1.0
+chr2	620378	1.0	0.0	1.0
+chr2	620386	1.0	0.0	1.0
+chr2	620547	0.0	1.0	1.0
+chr2	620662	1.0	0.0	1.0
+chr2	620830	0.0	1.0	1.0
+chr2	620835	1.0	0.0	1.0
+chr2	620851	2.0	0.0	2.0
+chr2	620859	0.0	1.0	1.0
+chr2	620862	0.0	1.0	1.0
+chr2	620863	2.0	0.0	2.0
+chr2	620871	1.0	0.0	1.0
+chr2	620873	1.0	0.0	1.0
+chr2	620879	1.0	0.0	1.0
+chr2	620953	0.0	1.0	1.0
+chr2	620979	1.0	0.0	1.0
+chr2	620987	0.0	1.0	1.0
+chr2	620988	0.0	1.0	1.0
+chr2	620996	1.0	0.0	1.0
+chr2	620997	1.0	0.0	1.0
+chr2	621011	1.0	0.0	1.0
+chr2	621013	1.0	0.0	1.0
+chr2	621017	0.0	1.0	1.0
+chr2	621021	0.0	1.0	1.0
+chr2	621169	0.0	1.0	1.0
+chr2	621318	0.0	1.0	1.0
+chr2	621336	1.0	0.0	1.0
+chr2	621340	0.0	1.0	1.0
+chr2	621356	0.0	2.0	2.0
+chr2	621538	0.0	1.0	1.0
+chr2	623041	0.0	3.0	3.0
+chr2	623067	0.0	2.0	2.0
+chr2	623085	1.0	0.0	1.0
+chr2	623186	0.0	1.0	1.0
+chr2	623197	0.0	1.0	1.0
+chr2	623198	0.0	1.0	1.0
+chr2	623204	1.0	0.0	1.0
+chr2	623465	1.0	0.0	1.0
+chr2	623470	1.0	0.0	1.0
+chr2	623472	1.0	0.0	1.0
+chr2	623479	0.0	1.0	1.0
+chr2	623483	1.0	0.0	1.0
+chr2	623484	0.0	1.0	1.0
+chr2	623493	0.0	1.0	1.0
+chr2	623496	0.0	1.0	1.0
+chr2	623598	0.0	1.0	1.0
+chr2	623628	0.0	1.0	1.0
+chr2	623631	1.0	0.0	1.0
+chr2	623632	0.0	1.0	1.0
+chr2	623639	0.0	1.0	1.0
+chr2	623640	0.0	1.0	1.0
+chr2	623646	1.0	1.0	2.0
+chr2	623647	0.0	1.0	1.0
+chr2	623649	1.0	0.0	1.0
+chr2	623654	0.0	2.0	2.0
+chr2	623656	0.0	1.0	1.0
+chr2	623657	2.0	0.0	2.0
+chr2	623665	0.0	1.0	1.0
+chr2	623670	0.0	1.0	1.0
+chr2	623826	1.0	0.0	1.0
+chr2	623942	0.0	1.0	1.0
+chr2	623943	1.0	0.0	1.0
+chr2	623958	1.0	0.0	1.0
+chr2	623977	1.0	0.0	1.0
+chr2	624009	1.0	0.0	1.0
+chr2	624117	1.0	1.0	2.0
+chr2	624132	0.0	2.0	2.0
+chr2	624133	1.0	0.0	1.0
+chr2	624138	1.0	0.0	1.0
+chr2	624141	2.0	0.0	2.0
+chr2	624281	3.0	0.0	3.0
+chr2	624338	1.0	0.0	1.0
+chr2	624463	1.0	0.0	1.0
+chr2	624473	0.0	2.0	2.0
+chr2	624590	1.0	0.0	1.0
+chr2	624596	1.0	0.0	1.0
+chr2	624629	1.0	0.0	1.0
+chr2	624631	0.0	1.0	1.0
+chr2	624632	0.0	1.0	1.0
+chr2	624644	1.0	0.0	1.0
+chr2	624648	1.0	0.0	1.0
+chr2	624650	0.0	2.0	2.0
+chr2	624655	1.0	0.0	1.0
+chr2	624659	2.0	0.0	2.0
+chr2	624665	1.0	0.0	1.0
+chr2	624672	1.0	0.0	1.0
+chr2	624684	1.0	0.0	1.0
+chr2	624729	0.0	1.0	1.0
+chr2	624821	0.0	1.0	1.0
+chr2	624831	1.0	0.0	1.0
+chr2	624835	1.0	0.0	1.0
+chr2	624862	1.0	0.0	1.0
+chr2	624864	0.0	1.0	1.0
+chr2	624899	0.0	1.0	1.0
+chr2	624920	1.0	0.0	1.0
+chr2	624941	0.0	1.0	1.0
+chr2	624969	1.0	0.0	1.0
+chr2	624996	1.0	0.0	1.0
+chr2	625036	0.0	2.0	2.0
+chr2	625037	0.0	1.0	1.0
+chr2	625052	0.0	1.0	1.0
+chr2	625053	0.0	1.0	1.0
+chr2	625054	0.0	1.0	1.0
+chr2	625268	0.0	1.0	1.0
+chr2	625323	0.0	3.0	3.0
+chr2	625325	0.0	1.0	1.0
+chr2	625326	1.0	0.0	1.0
+chr2	625337	1.0	0.0	1.0
+chr2	625349	0.0	1.0	1.0
+chr2	625354	0.0	3.0	3.0
+chr2	625355	1.0	0.0	1.0
+chr2	625362	0.0	1.0	1.0
+chr2	625365	1.0	0.0	1.0
+chr2	625369	1.0	0.0	1.0
+chr2	625371	1.0	0.0	1.0
+chr2	625372	0.0	1.0	1.0
+chr2	625373	1.0	0.0	1.0
+chr2	625383	0.0	1.0	1.0
+chr2	625388	0.0	1.0	1.0
+chr2	625679	1.0	0.0	1.0
+chr2	625693	1.0	0.0	1.0
+chr2	625705	0.0	2.0	2.0
+chr2	625711	0.0	1.0	1.0
+chr2	625733	0.0	3.0	3.0
+chr2	625742	1.0	0.0	1.0
+chr2	625743	0.0	1.0	1.0
+chr2	625754	2.0	0.0	2.0
+chr2	625778	1.0	0.0	1.0
+chr2	625790	0.0	2.0	2.0
+chr2	625887	1.0	0.0	1.0
+chr2	625901	1.0	0.0	1.0
+chr2	625909	1.0	0.0	1.0
+chr2	626030	1.0	0.0	1.0
+chr2	626035	0.0	1.0	1.0
+chr2	626061	1.0	0.0	1.0
+chr2	626107	2.0	0.0	2.0
+chr2	626179	1.0	0.0	1.0
+chr2	626403	0.0	1.0	1.0
+chr2	626707	1.0	0.0	1.0
+chr2	626723	1.0	0.0	1.0
+chr2	626835	1.0	0.0	1.0
+chr2	626861	0.0	1.0	1.0
+chr2	626893	1.0	0.0	1.0
+chr2	626969	1.0	0.0	1.0
+chr2	627033	1.0	0.0	1.0
+chr2	627185	0.0	1.0	1.0
+chr2	627203	1.0	0.0	1.0
+chr2	627255	0.0	1.0	1.0
+chr2	627264	0.0	2.0	2.0
+chr2	627285	1.0	0.0	1.0
+chr2	627353	0.0	1.0	1.0
+chr2	627511	0.0	1.0	1.0
+chr2	627709	1.0	0.0	1.0
+chr2	627903	0.0	1.0	1.0
+chr2	628019	0.0	1.0	1.0
+chr2	628030	1.0	0.0	1.0
+chr2	628224	0.0	1.0	1.0
+chr2	628746	1.0	0.0	1.0
+chr2	628755	1.0	0.0	1.0
+chr2	628836	1.0	0.0	1.0
+chr2	628991	0.0	1.0	1.0
+chr2	629138	0.0	1.0	1.0
+chr2	629149	1.0	0.0	1.0
+chr2	629168	0.0	2.0	2.0
+chr2	629174	0.0	1.0	1.0
+chr2	629178	1.0	1.0	2.0
+chr2	629199	0.0	1.0	1.0
+chr2	629207	1.0	0.0	1.0
+chr2	629231	0.0	1.0	1.0
+chr2	629330	1.0	0.0	1.0
+chr2	629349	1.0	0.0	1.0
+chr2	629373	1.0	0.0	1.0
+chr2	629378	1.0	0.0	1.0
+chr2	629399	1.0	0.0	1.0
+chr2	629413	0.0	1.0	1.0
+chr2	629422	0.0	1.0	1.0
+chr2	629462	1.0	0.0	1.0
+chr2	629500	1.0	0.0	1.0
+chr2	629526	1.0	0.0	1.0
+chr2	629579	0.0	1.0	1.0
+chr2	629627	2.0	0.0	2.0
+chr2	629647	0.0	1.0	1.0
+chr2	629662	0.0	1.0	1.0
+chr2	629695	1.0	0.0	1.0
+chr2	629701	1.0	0.0	1.0
+chr2	629736	1.0	0.0	1.0
+chr2	629755	1.0	0.0	1.0
+chr2	629765	1.0	0.0	1.0
+chr2	629766	1.0	0.0	1.0
+chr2	629775	0.0	1.0	1.0
+chr2	629787	1.0	0.0	1.0
+chr2	629798	1.0	0.0	1.0
+chr2	629803	0.0	1.0	1.0
+chr2	629808	1.0	0.0	1.0
+chr2	629825	0.0	2.0	2.0
+chr2	629828	0.0	1.0	1.0
+chr2	629832	0.0	1.0	1.0
+chr2	629904	0.0	1.0	1.0
+chr2	629926	1.0	0.0	1.0
+chr2	629946	0.0	1.0	1.0
+chr2	629977	0.0	2.0	2.0
+chr2	629984	1.0	1.0	2.0
+chr2	630010	0.0	1.0	1.0
+chr2	630013	0.0	1.0	1.0
+chr2	630016	1.0	0.0	1.0
+chr2	630017	1.0	0.0	1.0
+chr2	630023	1.0	0.0	1.0
+chr2	630025	1.0	0.0	1.0
+chr2	630027	1.0	0.0	1.0
+chr2	630034	1.0	0.0	1.0
+chr2	630045	1.0	0.0	1.0
+chr2	630046	1.0	0.0	1.0
+chr2	630047	1.0	3.0	4.0
+chr2	630053	1.0	0.0	1.0
+chr2	630103	0.0	1.0	1.0
+chr2	630182	1.0	0.0	1.0
+chr2	630191	0.0	1.0	1.0
+chr2	630196	2.0	0.0	2.0
+chr2	630205	0.0	2.0	2.0
+chr2	630206	1.0	1.0	2.0
+chr2	630220	0.0	1.0	1.0
+chr2	630222	1.0	0.0	1.0
+chr2	630223	1.0	0.0	1.0
+chr2	630251	1.0	0.0	1.0
+chr2	630262	0.0	1.0	1.0
+chr2	630293	1.0	0.0	1.0
+chr2	630295	0.0	1.0	1.0
+chr2	630349	0.0	2.0	2.0
+chr2	630383	0.0	2.0	2.0
+chr2	630393	3.0	0.0	3.0
+chr2	630407	0.0	1.0	1.0
+chr2	630412	0.0	1.0	1.0
+chr2	630446	0.0	2.0	2.0
+chr2	630466	0.0	1.0	1.0
+chr2	630507	1.0	0.0	1.0
+chr2	630531	1.0	0.0	1.0
+chr2	630544	1.0	0.0	1.0
+chr2	630546	0.0	1.0	1.0
+chr2	630616	2.0	0.0	2.0
+chr2	630631	0.0	1.0	1.0
+chr2	630713	0.0	1.0	1.0
+chr2	630720	1.0	0.0	1.0
+chr2	630735	1.0	0.0	1.0
+chr2	630768	0.0	1.0	1.0
+chr2	630911	1.0	0.0	1.0
+chr2	630921	0.0	1.0	1.0
+chr2	630949	0.0	1.0	1.0
+chr2	630968	2.0	0.0	2.0
+chr2	630985	1.0	0.0	1.0
+chr2	631000	1.0	0.0	1.0
+chr2	631001	0.0	1.0	1.0
+chr2	631070	0.0	1.0	1.0
+chr2	631088	0.0	1.0	1.0
+chr2	631092	1.0	0.0	1.0
+chr2	631100	1.0	0.0	1.0
+chr2	631101	1.0	0.0	1.0
+chr2	631103	1.0	0.0	1.0
+chr2	631109	0.0	2.0	2.0
+chr2	631239	0.0	1.0	1.0
+chr2	631258	0.0	1.0	1.0
+chr2	631268	0.0	1.0	1.0
+chr2	631435	1.0	0.0	1.0
+chr2	631439	2.0	0.0	2.0
+chr2	631441	1.0	0.0	1.0
+chr2	631445	0.0	2.0	2.0
+chr2	631446	0.0	1.0	1.0
+chr2	631473	1.0	0.0	1.0
+chr2	631486	1.0	0.0	1.0
+chr2	631598	1.0	0.0	1.0
+chr2	631609	1.0	0.0	1.0
+chr2	631624	0.0	1.0	1.0
+chr2	631635	0.0	1.0	1.0
+chr2	631637	1.0	0.0	1.0
+chr2	631651	0.0	1.0	1.0
+chr2	631658	0.0	1.0	1.0
+chr2	631683	1.0	0.0	1.0
+chr2	631694	1.0	0.0	1.0
+chr2	631737	1.0	0.0	1.0
+chr2	631777	2.0	0.0	2.0
+chr2	631807	1.0	0.0	1.0
+chr2	631868	1.0	0.0	1.0
+chr2	631886	0.0	1.0	1.0
+chr2	631925	0.0	1.0	1.0
+chr2	631928	0.0	1.0	1.0
+chr2	631933	1.0	0.0	1.0
+chr2	631934	0.0	2.0	2.0
+chr2	631938	1.0	0.0	1.0
+chr2	632167	1.0	0.0	1.0
+chr2	632230	1.0	0.0	1.0
+chr2	632338	0.0	1.0	1.0
+chr2	632342	1.0	0.0	1.0
+chr2	632357	1.0	0.0	1.0
+chr2	632527	0.0	1.0	1.0
+chr2	632575	1.0	0.0	1.0
+chr2	632668	1.0	0.0	1.0
+chr2	632696	1.0	0.0	1.0
+chr2	632699	0.0	1.0	1.0
+chr2	632719	1.0	0.0	1.0
+chr2	632821	0.0	1.0	1.0
+chr2	632824	0.0	1.0	1.0
+chr2	632849	0.0	1.0	1.0
+chr2	632863	0.0	2.0	2.0
+chr2	632866	0.0	1.0	1.0
+chr2	632876	0.0	1.0	1.0
+chr2	632879	1.0	0.0	1.0
+chr2	632917	0.0	1.0	1.0
+chr2	632947	0.0	1.0	1.0
+chr2	633027	1.0	0.0	1.0
+chr2	633028	1.0	0.0	1.0
+chr2	633031	2.0	0.0	2.0
+chr2	633037	0.0	1.0	1.0
+chr2	633038	0.0	1.0	1.0
+chr2	633045	0.0	3.0	3.0
+chr2	633046	1.0	0.0	1.0
+chr2	633047	0.0	1.0	1.0
+chr2	633192	1.0	0.0	1.0
+chr2	633208	0.0	1.0	1.0
+chr2	633209	0.0	1.0	1.0
+chr2	633211	1.0	0.0	1.0
+chr2	633214	0.0	1.0	1.0
+chr2	633217	0.0	1.0	1.0
+chr2	633237	2.0	0.0	2.0
+chr2	633341	0.0	1.0	1.0
+chr2	633342	0.0	1.0	1.0
+chr2	633346	2.0	0.0	2.0
+chr2	633351	0.0	1.0	1.0
+chr2	633358	4.0	0.0	4.0
+chr2	633360	3.0	1.0	4.0
+chr2	633365	1.0	0.0	1.0
+chr2	633366	3.0	0.0	3.0
+chr2	633367	6.0	0.0	6.0
+chr2	633369	0.0	4.0	4.0
+chr2	633370	3.0	1.0	4.0
+chr2	633371	0.0	1.0	1.0
+chr2	633372	2.0	0.0	2.0
+chr2	633373	1.0	0.0	1.0
+chr2	633374	0.0	1.0	1.0
+chr2	633375	0.0	4.0	4.0
+chr2	633377	1.0	0.0	1.0
+chr2	633378	1.0	4.0	5.0
+chr2	633379	1.0	0.0	1.0
+chr2	633382	2.0	3.0	5.0
+chr2	633383	0.0	3.0	3.0
+chr2	633385	0.0	1.0	1.0
+chr2	633388	0.0	1.0	1.0
+chr2	633405	0.0	1.0	1.0
+chr2	633420	1.0	0.0	1.0
+chr2	633569	1.0	0.0	1.0
+chr2	633595	1.0	0.0	1.0
+chr2	633598	0.0	1.0	1.0
+chr2	633612	1.0	0.0	1.0
+chr2	633618	0.0	2.0	2.0
+chr2	633621	0.0	1.0	1.0
+chr2	633624	0.0	1.0	1.0
+chr2	633627	4.0	0.0	4.0
+chr2	633628	3.0	0.0	3.0
+chr2	633629	1.0	0.0	1.0
+chr2	633633	1.0	0.0	1.0
+chr2	633635	3.0	1.0	4.0
+chr2	633637	0.0	2.0	2.0
+chr2	633638	1.0	0.0	1.0
+chr2	633643	1.0	0.0	1.0
+chr2	633651	1.0	0.0	1.0
+chr2	633795	2.0	0.0	2.0
+chr2	633805	1.0	0.0	1.0
+chr2	633810	0.0	1.0	1.0
+chr2	633815	1.0	0.0	1.0
+chr2	633821	1.0	0.0	1.0
+chr2	633857	1.0	0.0	1.0
+chr2	633967	1.0	0.0	1.0
+chr2	633987	1.0	0.0	1.0
+chr2	634398	1.0	0.0	1.0
+chr2	634649	0.0	1.0	1.0
+chr2	634653	1.0	0.0	1.0
+chr2	634659	1.0	0.0	1.0
+chr2	634817	1.0	0.0	1.0
+chr2	634818	1.0	0.0	1.0
+chr2	634821	1.0	0.0	1.0
+chr2	634822	1.0	0.0	1.0
+chr2	634829	1.0	0.0	1.0
+chr2	634833	2.0	0.0	2.0
+chr2	634842	0.0	1.0	1.0
+chr2	634844	1.0	0.0	1.0
+chr2	634847	0.0	1.0	1.0
+chr2	634851	1.0	0.0	1.0
+chr2	634857	0.0	1.0	1.0
+chr2	634861	1.0	0.0	1.0
+chr2	635104	0.0	1.0	1.0
+chr2	635105	1.0	0.0	1.0
+chr2	635107	0.0	2.0	2.0
+chr2	635125	0.0	2.0	2.0
+chr2	635140	0.0	1.0	1.0
+chr2	635272	0.0	1.0	1.0
+chr2	635298	0.0	1.0	1.0
+chr2	635305	0.0	1.0	1.0
+chr2	635453	1.0	0.0	1.0
+chr2	636667	1.0	0.0	1.0
+chr2	636690	0.0	1.0	1.0
+chr2	636906	1.0	0.0	1.0
+chr2	636913	0.0	1.0	1.0
+chr2	636932	0.0	1.0	1.0
+chr2	636947	1.0	0.0	1.0
+chr2	637008	2.0	0.0	2.0
+chr2	637045	1.0	0.0	1.0
+chr2	637048	2.0	0.0	2.0
+chr2	637056	1.0	0.0	1.0
+chr2	637224	0.0	2.0	2.0
+chr2	637281	0.0	1.0	1.0
+chr2	637397	1.0	0.0	1.0
+chr2	638002	0.0	1.0	1.0
+chr2	638053	1.0	0.0	1.0
+chr2	638102	0.0	1.0	1.0
+chr2	638129	1.0	0.0	1.0
+chr2	638827	2.0	0.0	2.0
+chr2	639195	1.0	0.0	1.0
+chr2	639353	1.0	0.0	1.0
+chr2	639603	0.0	1.0	1.0
+chr2	639625	1.0	0.0	1.0
+chr2	639888	0.0	1.0	1.0
+chr2	640042	1.0	0.0	1.0
+chr2	640626	0.0	1.0	1.0
+chr2	640706	0.0	1.0	1.0
+chr2	640789	1.0	0.0	1.0
+chr2	641296	0.0	1.0	1.0
+chr2	641589	0.0	1.0	1.0
+chr2	641705	1.0	0.0	1.0
+chr2	641791	0.0	1.0	1.0
+chr2	641874	0.0	1.0	1.0
+chr2	641902	0.0	1.0	1.0
+chr2	641903	0.0	3.0	3.0
+chr2	641910	1.0	0.0	1.0
+chr2	641926	1.0	0.0	1.0
+chr2	641927	0.0	1.0	1.0
+chr2	641929	1.0	0.0	1.0
+chr2	641940	0.0	1.0	1.0
+chr2	641942	1.0	0.0	1.0
+chr2	641964	1.0	0.0	1.0
+chr2	642071	0.0	1.0	1.0
+chr2	642088	1.0	0.0	1.0
+chr2	642094	0.0	1.0	1.0
+chr2	642363	0.0	1.0	1.0
+chr2	642514	0.0	1.0	1.0
+chr2	642558	1.0	0.0	1.0
+chr2	642562	0.0	1.0	1.0
+chr2	642579	1.0	0.0	1.0
+chr2	642583	2.0	0.0	2.0
+chr2	642585	0.0	1.0	1.0
+chr2	642589	0.0	1.0	1.0
+chr2	642590	1.0	0.0	1.0
+chr2	642594	0.0	1.0	1.0
+chr2	642601	1.0	0.0	1.0
+chr2	642602	0.0	1.0	1.0
+chr2	642603	2.0	4.0	6.0
+chr2	642606	2.0	0.0	2.0
+chr2	642607	1.0	0.0	1.0
+chr2	642609	0.0	1.0	1.0
+chr2	642618	1.0	0.0	1.0
+chr2	642619	1.0	2.0	3.0
+chr2	642631	0.0	1.0	1.0
+chr2	642916	0.0	1.0	1.0
+chr2	643203	1.0	0.0	1.0
+chr2	643219	1.0	0.0	1.0
+chr2	643226	0.0	1.0	1.0
+chr2	643238	1.0	0.0	1.0
+chr2	643331	2.0	0.0	2.0
+chr2	643347	0.0	1.0	1.0
+chr2	643384	1.0	0.0	1.0
+chr2	643387	1.0	0.0	1.0
+chr2	643403	0.0	1.0	1.0
+chr2	643451	1.0	0.0	1.0
+chr2	643545	0.0	1.0	1.0
+chr2	643588	2.0	0.0	2.0
+chr2	643604	1.0	0.0	1.0
+chr2	643611	0.0	1.0	1.0
+chr2	643623	1.0	0.0	1.0
+chr2	643630	0.0	1.0	1.0
+chr2	643638	3.0	0.0	3.0
+chr2	643639	2.0	0.0	2.0
+chr2	643655	0.0	1.0	1.0
+chr2	643656	0.0	1.0	1.0
+chr2	643660	0.0	2.0	2.0
+chr2	643666	1.0	0.0	1.0
+chr2	643670	0.0	1.0	1.0
+chr2	643678	3.0	0.0	3.0
+chr2	643679	1.0	2.0	3.0
+chr2	643681	1.0	0.0	1.0
+chr2	643685	0.0	1.0	1.0
+chr2	643687	0.0	2.0	2.0
+chr2	643690	0.0	1.0	1.0
+chr2	643694	1.0	0.0	1.0
+chr2	643695	0.0	1.0	1.0
+chr2	643696	0.0	2.0	2.0
+chr2	643697	1.0	0.0	1.0
+chr2	643698	1.0	0.0	1.0
+chr2	643699	3.0	0.0	3.0
+chr2	643700	0.0	1.0	1.0
+chr2	643702	0.0	4.0	4.0
+chr2	643704	4.0	0.0	4.0
+chr2	643705	0.0	3.0	3.0
+chr2	643706	4.0	1.0	5.0
+chr2	643707	4.0	0.0	4.0
+chr2	643708	0.0	3.0	3.0
+chr2	643709	0.0	1.0	1.0
+chr2	643711	0.0	2.0	2.0
+chr2	643720	1.0	0.0	1.0
+chr2	643722	2.0	1.0	3.0
+chr2	643723	0.0	1.0	1.0
+chr2	643727	0.0	3.0	3.0
+chr2	643729	0.0	1.0	1.0
+chr2	643732	4.0	0.0	4.0
+chr2	643735	2.0	0.0	2.0
+chr2	643739	1.0	0.0	1.0
+chr2	643742	0.0	1.0	1.0
+chr2	643743	1.0	0.0	1.0
+chr2	643745	1.0	0.0	1.0
+chr2	643753	1.0	0.0	1.0
+chr2	643758	0.0	1.0	1.0
+chr2	643759	1.0	0.0	1.0
+chr2	643762	0.0	1.0	1.0
+chr2	643768	1.0	0.0	1.0
+chr2	643776	1.0	0.0	1.0
+chr2	643777	0.0	2.0	2.0
+chr2	643780	0.0	1.0	1.0
+chr2	643781	0.0	2.0	2.0
+chr2	643790	1.0	0.0	1.0
+chr2	643802	1.0	0.0	1.0
+chr2	643803	1.0	0.0	1.0
+chr2	643807	4.0	0.0	4.0
+chr2	643811	1.0	0.0	1.0
+chr2	643819	1.0	0.0	1.0
+chr2	643829	1.0	0.0	1.0
+chr2	643843	2.0	0.0	2.0
+chr2	644107	2.0	0.0	2.0
+chr2	644109	0.0	1.0	1.0
+chr2	644132	1.0	0.0	1.0
+chr2	644174	0.0	2.0	2.0
+chr2	644182	1.0	1.0	2.0
+chr2	644342	1.0	0.0	1.0
+chr2	644345	0.0	1.0	1.0
+chr2	644636	0.0	1.0	1.0
+chr2	644648	1.0	0.0	1.0
+chr2	644651	1.0	0.0	1.0
+chr2	644665	0.0	2.0	2.0
+chr2	644666	0.0	1.0	1.0
+chr2	644669	1.0	0.0	1.0
+chr2	644677	0.0	1.0	1.0
+chr2	644685	0.0	1.0	1.0
+chr2	644751	1.0	0.0	1.0
+chr2	644779	1.0	0.0	1.0
+chr2	644790	0.0	1.0	1.0
+chr2	644816	1.0	0.0	1.0
+chr2	644818	0.0	1.0	1.0
+chr2	644829	0.0	1.0	1.0
+chr2	644831	0.0	3.0	3.0
+chr2	644840	0.0	1.0	1.0
+chr2	644938	1.0	0.0	1.0
+chr2	644952	0.0	1.0	1.0
+chr2	644954	0.0	2.0	2.0
+chr2	644957	1.0	0.0	1.0
+chr2	644963	0.0	1.0	1.0
+chr2	644966	0.0	1.0	1.0
+chr2	644968	0.0	1.0	1.0
+chr2	644985	0.0	1.0	1.0
+chr2	644989	2.0	0.0	2.0
+chr2	644992	1.0	0.0	1.0
+chr2	644997	0.0	1.0	1.0
+chr2	645001	2.0	1.0	3.0
+chr2	645002	1.0	0.0	1.0
+chr2	645004	2.0	0.0	2.0
+chr2	645010	0.0	1.0	1.0
+chr2	645016	1.0	0.0	1.0
+chr2	645022	0.0	1.0	1.0
+chr2	645033	1.0	0.0	1.0
+chr2	645326	0.0	1.0	1.0
+chr2	645338	0.0	1.0	1.0
+chr2	645364	0.0	1.0	1.0
+chr2	645370	1.0	0.0	1.0
+chr2	645371	2.0	0.0	2.0
+chr2	645377	0.0	1.0	1.0
+chr2	645386	1.0	0.0	1.0
+chr2	645527	0.0	1.0	1.0
+chr2	645533	1.0	1.0	2.0
+chr2	645534	0.0	1.0	1.0
+chr2	645539	0.0	1.0	1.0
+chr2	645541	1.0	0.0	1.0
+chr2	645542	0.0	1.0	1.0
+chr2	645543	2.0	0.0	2.0
+chr2	645544	0.0	1.0	1.0
+chr2	645547	0.0	1.0	1.0
+chr2	645550	1.0	0.0	1.0
+chr2	645554	1.0	0.0	1.0
+chr2	645555	1.0	0.0	1.0
+chr2	645559	1.0	0.0	1.0
+chr2	645572	0.0	1.0	1.0
+chr2	645576	0.0	1.0	1.0
+chr2	645597	1.0	0.0	1.0
+chr2	645600	1.0	0.0	1.0
+chr2	645636	0.0	1.0	1.0
+chr2	645702	0.0	1.0	1.0
+chr2	645717	0.0	1.0	1.0
+chr2	645729	1.0	0.0	1.0
+chr2	645787	0.0	1.0	1.0
+chr2	645793	0.0	1.0	1.0
+chr2	645795	0.0	1.0	1.0
+chr2	645821	0.0	1.0	1.0
+chr2	645828	1.0	0.0	1.0
+chr2	645848	1.0	0.0	1.0
+chr2	646370	1.0	0.0	1.0
+chr2	646372	0.0	1.0	1.0
+chr2	647027	0.0	1.0	1.0
+chr2	647029	1.0	0.0	1.0
+chr2	647048	0.0	1.0	1.0
+chr2	647157	0.0	1.0	1.0
+chr2	647171	0.0	1.0	1.0
+chr2	647172	0.0	3.0	3.0
+chr2	647175	1.0	0.0	1.0
+chr2	647180	0.0	1.0	1.0
+chr2	647184	2.0	2.0	4.0
+chr2	647185	1.0	0.0	1.0
+chr2	647186	5.0	0.0	5.0
+chr2	647188	1.0	0.0	1.0
+chr2	647189	0.0	5.0	5.0
+chr2	647190	0.0	2.0	2.0
+chr2	647193	0.0	4.0	4.0
+chr2	647194	1.0	0.0	1.0
+chr2	647195	2.0	0.0	2.0
+chr2	647200	1.0	0.0	1.0
+chr2	647201	3.0	0.0	3.0
+chr2	647205	1.0	0.0	1.0
+chr2	647207	0.0	1.0	1.0
+chr2	647213	0.0	1.0	1.0
+chr2	647220	2.0	0.0	2.0
+chr2	647240	3.0	0.0	3.0
+chr2	647401	0.0	1.0	1.0
+chr2	647486	1.0	0.0	1.0
+chr2	647492	1.0	0.0	1.0
+chr2	647497	1.0	0.0	1.0
+chr2	647499	0.0	3.0	3.0
+chr2	647500	0.0	1.0	1.0
+chr2	647502	2.0	0.0	2.0
+chr2	647511	0.0	2.0	2.0
+chr2	647885	1.0	0.0	1.0
+chr2	647895	0.0	1.0	1.0
+chr2	647982	0.0	1.0	1.0
+chr2	647989	0.0	1.0	1.0
+chr2	647994	0.0	1.0	1.0
+chr2	648038	1.0	0.0	1.0
+chr2	648173	1.0	0.0	1.0
+chr2	648203	1.0	0.0	1.0
+chr2	648467	1.0	0.0	1.0
+chr2	649060	1.0	0.0	1.0
+chr2	649192	1.0	0.0	1.0
+chr2	649523	0.0	2.0	2.0
+chr2	649545	1.0	0.0	1.0
+chr2	649642	1.0	0.0	1.0
+chr2	649866	0.0	1.0	1.0
+chr2	650042	0.0	1.0	1.0
+chr2	650237	2.0	0.0	2.0
+chr2	650240	1.0	0.0	1.0
+chr2	650244	1.0	0.0	1.0
+chr2	650276	0.0	2.0	2.0
+chr2	650285	1.0	0.0	1.0
+chr2	650314	0.0	1.0	1.0
+chr2	650332	0.0	1.0	1.0
+chr2	650333	0.0	2.0	2.0
+chr2	650339	0.0	1.0	1.0
+chr2	650341	1.0	0.0	1.0
+chr2	650343	1.0	0.0	1.0
+chr2	650353	1.0	0.0	1.0
+chr2	650355	0.0	1.0	1.0
+chr2	650365	0.0	2.0	2.0
+chr2	650370	0.0	1.0	1.0
+chr2	650431	1.0	0.0	1.0
+chr2	650470	1.0	0.0	1.0
+chr2	650473	1.0	0.0	1.0
+chr2	650482	0.0	1.0	1.0
+chr2	650499	0.0	2.0	2.0
+chr2	650506	0.0	1.0	1.0
+chr2	650632	2.0	0.0	2.0
+chr2	650646	1.0	0.0	1.0
+chr2	650683	1.0	0.0	1.0
+chr2	650690	2.0	0.0	2.0
+chr2	650806	1.0	0.0	1.0
+chr2	650856	0.0	1.0	1.0
+chr2	650907	0.0	1.0	1.0
+chr2	650932	0.0	1.0	1.0
+chr2	650935	1.0	0.0	1.0
+chr2	651030	1.0	1.0	2.0
+chr2	651035	1.0	0.0	1.0
+chr2	651040	2.0	0.0	2.0
+chr2	651072	1.0	0.0	1.0
+chr2	651079	0.0	8.0	8.0
+chr2	651102	1.0	0.0	1.0
+chr2	651111	0.0	3.0	3.0
+chr2	651126	0.0	1.0	1.0
+chr2	651316	1.0	0.0	1.0
+chr2	651319	0.0	1.0	1.0
+chr2	651335	1.0	0.0	1.0
+chr2	651342	0.0	1.0	1.0
+chr2	651347	4.0	0.0	4.0
+chr2	651353	1.0	0.0	1.0
+chr2	651363	0.0	1.0	1.0
+chr2	651365	1.0	0.0	1.0
+chr2	651366	0.0	2.0	2.0
+chr2	651376	0.0	2.0	2.0
+chr2	651377	0.0	2.0	2.0
+chr2	651379	1.0	0.0	1.0
+chr2	651382	2.0	0.0	2.0
+chr2	651385	0.0	2.0	2.0
+chr2	651483	1.0	0.0	1.0
+chr2	651524	1.0	0.0	1.0
+chr2	651528	0.0	1.0	1.0
+chr2	651534	0.0	1.0	1.0
+chr2	651539	1.0	0.0	1.0
+chr2	651546	0.0	1.0	1.0
+chr2	651644	0.0	1.0	1.0
+chr2	651686	0.0	1.0	1.0
+chr2	651718	1.0	0.0	1.0
+chr2	651773	0.0	1.0	1.0
+chr2	651814	0.0	1.0	1.0
+chr2	651991	0.0	1.0	1.0
+chr2	652209	0.0	1.0	1.0
+chr2	652294	1.0	0.0	1.0
+chr2	652381	1.0	0.0	1.0
+chr2	652481	1.0	0.0	1.0
+chr2	652562	1.0	0.0	1.0
+chr2	652689	1.0	0.0	1.0
+chr2	652713	2.0	0.0	2.0
+chr2	652723	1.0	0.0	1.0
+chr2	652724	2.0	0.0	2.0
+chr2	652725	1.0	0.0	1.0
+chr2	652736	1.0	0.0	1.0
+chr2	652740	0.0	1.0	1.0
+chr2	652742	0.0	1.0	1.0
+chr2	652743	1.0	2.0	3.0
+chr2	652756	0.0	1.0	1.0
+chr2	652761	0.0	1.0	1.0
+chr2	652810	1.0	0.0	1.0
+chr2	652915	0.0	1.0	1.0
+chr2	652925	0.0	2.0	2.0
+chr2	652931	0.0	1.0	1.0
+chr2	652941	1.0	0.0	1.0
+chr2	652963	0.0	1.0	1.0
+chr2	653066	1.0	0.0	1.0
+chr2	653290	1.0	0.0	1.0
+chr2	653315	0.0	1.0	1.0
+chr2	653326	1.0	0.0	1.0
+chr2	653329	1.0	0.0	1.0
+chr2	653330	1.0	0.0	1.0
+chr2	653331	1.0	0.0	1.0
+chr2	653337	5.0	0.0	5.0
+chr2	653339	0.0	1.0	1.0
+chr2	653340	0.0	1.0	1.0
+chr2	653342	1.0	0.0	1.0
+chr2	653345	0.0	1.0	1.0
+chr2	653346	1.0	2.0	3.0
+chr2	653348	1.0	0.0	1.0
+chr2	653349	5.0	0.0	5.0
+chr2	653350	0.0	1.0	1.0
+chr2	653352	0.0	2.0	2.0
+chr2	653353	0.0	5.0	5.0
+chr2	653354	0.0	4.0	4.0
+chr2	653355	0.0	8.0	8.0
+chr2	653358	0.0	3.0	3.0
+chr2	653359	0.0	1.0	1.0
+chr2	653360	2.0	0.0	2.0
+chr2	653361	1.0	0.0	1.0
+chr2	653363	0.0	2.0	2.0
+chr2	653364	0.0	1.0	1.0
+chr2	653366	2.0	0.0	2.0
+chr2	653371	1.0	0.0	1.0
+chr2	653376	0.0	1.0	1.0
+chr2	653377	0.0	1.0	1.0
+chr2	653379	1.0	0.0	1.0
+chr2	653413	1.0	0.0	1.0
+chr2	653417	1.0	0.0	1.0
+chr2	653504	0.0	2.0	2.0
+chr2	653506	0.0	1.0	1.0
+chr2	653518	0.0	1.0	1.0
+chr2	653529	0.0	1.0	1.0
+chr2	653534	1.0	0.0	1.0
+chr2	653536	1.0	0.0	1.0
+chr2	653680	1.0	0.0	1.0
+chr2	653694	1.0	0.0	1.0
+chr2	653710	1.0	0.0	1.0
+chr2	653727	0.0	1.0	1.0
+chr2	653731	1.0	0.0	1.0
+chr2	653740	2.0	0.0	2.0
+chr2	653794	0.0	1.0	1.0
+chr2	654253	0.0	1.0	1.0
+chr2	654535	1.0	0.0	1.0
+chr2	655145	0.0	1.0	1.0
+chr2	655994	1.0	0.0	1.0
+chr2	656005	1.0	0.0	1.0
+chr2	656022	2.0	0.0	2.0
+chr2	656049	1.0	0.0	1.0
+chr2	656651	1.0	0.0	1.0
+chr2	656741	6.0	0.0	6.0
+chr2	656941	1.0	0.0	1.0
+chr2	657093	1.0	0.0	1.0
+chr2	657214	0.0	3.0	3.0
+chr2	657228	0.0	1.0	1.0
+chr2	657235	0.0	1.0	1.0
+chr2	657262	1.0	0.0	1.0
+chr2	657265	0.0	1.0	1.0
+chr2	657376	0.0	1.0	1.0
+chr2	657389	0.0	1.0	1.0
+chr2	657409	0.0	1.0	1.0
+chr2	657415	1.0	0.0	1.0
+chr2	657428	0.0	1.0	1.0
+chr2	657526	1.0	0.0	1.0
+chr2	657528	1.0	0.0	1.0
+chr2	657545	1.0	0.0	1.0
+chr2	657558	0.0	1.0	1.0
+chr2	657565	0.0	1.0	1.0
+chr2	657569	0.0	1.0	1.0
+chr2	657573	0.0	2.0	2.0
+chr2	657580	1.0	0.0	1.0
+chr2	657582	0.0	1.0	1.0
+chr2	657583	1.0	0.0	1.0
+chr2	657588	1.0	0.0	1.0
+chr2	657591	2.0	0.0	2.0
+chr2	657599	0.0	3.0	3.0
+chr2	657601	1.0	0.0	1.0
+chr2	657607	0.0	1.0	1.0
+chr2	657609	0.0	1.0	1.0
+chr2	657623	1.0	0.0	1.0
+chr2	657666	0.0	1.0	1.0
+chr2	657801	2.0	0.0	2.0
+chr2	657802	0.0	1.0	1.0
+chr2	657806	0.0	1.0	1.0
+chr2	657809	0.0	2.0	2.0
+chr2	657814	2.0	0.0	2.0
+chr2	657816	0.0	2.0	2.0
+chr2	657822	1.0	0.0	1.0
+chr2	657824	2.0	0.0	2.0
+chr2	657825	0.0	2.0	2.0
+chr2	657827	1.0	0.0	1.0
+chr2	657828	1.0	0.0	1.0
+chr2	657831	0.0	2.0	2.0
+chr2	657836	0.0	2.0	2.0
+chr2	657837	0.0	1.0	1.0
+chr2	657849	2.0	0.0	2.0
+chr2	657851	5.0	0.0	5.0
+chr2	657852	1.0	0.0	1.0
+chr2	657855	1.0	0.0	1.0
+chr2	657868	1.0	0.0	1.0
+chr2	657992	0.0	1.0	1.0
+chr2	657995	0.0	1.0	1.0
+chr2	657998	1.0	0.0	1.0
+chr2	657999	0.0	3.0	3.0
+chr2	658016	0.0	1.0	1.0
+chr2	658023	1.0	0.0	1.0
+chr2	658034	1.0	0.0	1.0
+chr2	658037	0.0	1.0	1.0
+chr2	658046	0.0	1.0	1.0
+chr2	658151	0.0	1.0	1.0
+chr2	658156	1.0	0.0	1.0
+chr2	658187	0.0	1.0	1.0
+chr2	658289	1.0	0.0	1.0
+chr2	658502	1.0	0.0	1.0
+chr2	658513	1.0	0.0	1.0
+chr2	658535	1.0	0.0	1.0
+chr2	658551	0.0	1.0	1.0
+chr2	658997	1.0	0.0	1.0
+chr2	659343	1.0	0.0	1.0
+chr2	659489	0.0	1.0	1.0
+chr2	659570	0.0	1.0	1.0
+chr2	659691	0.0	1.0	1.0
+chr2	660135	1.0	0.0	1.0
+chr2	660167	0.0	1.0	1.0
+chr2	660530	1.0	0.0	1.0
+chr2	660799	0.0	1.0	1.0
+chr2	660866	1.0	0.0	1.0
+chr2	660953	1.0	0.0	1.0
+chr2	660969	0.0	1.0	1.0
+chr2	661008	0.0	1.0	1.0
+chr2	661085	0.0	1.0	1.0
+chr2	661335	0.0	1.0	1.0
+chr2	661400	1.0	0.0	1.0
+chr2	661412	0.0	1.0	1.0
+chr2	661419	1.0	0.0	1.0
+chr2	661430	0.0	1.0	1.0
+chr2	661476	1.0	0.0	1.0
+chr2	661480	0.0	1.0	1.0
+chr2	661560	1.0	0.0	1.0
+chr2	661566	1.0	0.0	1.0
+chr2	661586	2.0	0.0	2.0
+chr2	661590	1.0	0.0	1.0
+chr2	661604	0.0	1.0	1.0
+chr2	661607	2.0	0.0	2.0
+chr2	661608	1.0	0.0	1.0
+chr2	661623	1.0	0.0	1.0
+chr2	661626	0.0	1.0	1.0
+chr2	661632	1.0	0.0	1.0
+chr2	661637	0.0	1.0	1.0
+chr2	661656	1.0	0.0	1.0
+chr2	661657	0.0	1.0	1.0
+chr2	661675	1.0	0.0	1.0
+chr2	661681	1.0	0.0	1.0
+chr2	661754	1.0	0.0	1.0
+chr2	661757	0.0	1.0	1.0
+chr2	661760	1.0	0.0	1.0
+chr2	661761	1.0	0.0	1.0
+chr2	661811	0.0	1.0	1.0
+chr2	661812	1.0	0.0	1.0
+chr2	661813	1.0	0.0	1.0
+chr2	661827	0.0	1.0	1.0
+chr2	661830	1.0	0.0	1.0
+chr2	661837	0.0	2.0	2.0
+chr2	661844	2.0	0.0	2.0
+chr2	661845	0.0	1.0	1.0
+chr2	661873	1.0	0.0	1.0
+chr2	661877	1.0	0.0	1.0
+chr2	662007	0.0	1.0	1.0
+chr2	662028	1.0	0.0	1.0
+chr2	662041	0.0	1.0	1.0
+chr2	662052	2.0	0.0	2.0
+chr2	662053	1.0	0.0	1.0
+chr2	662056	2.0	0.0	2.0
+chr2	662060	0.0	1.0	1.0
+chr2	662090	0.0	1.0	1.0
+chr2	662173	1.0	0.0	1.0
+chr2	662177	0.0	1.0	1.0
+chr2	662196	0.0	2.0	2.0
+chr2	662198	0.0	1.0	1.0
+chr2	662214	1.0	0.0	1.0
+chr2	662216	1.0	0.0	1.0
+chr2	662219	1.0	0.0	1.0
+chr2	662221	0.0	1.0	1.0
+chr2	662249	0.0	1.0	1.0
+chr2	662281	1.0	0.0	1.0
+chr2	662388	0.0	2.0	2.0
+chr2	662433	1.0	0.0	1.0
+chr2	662449	0.0	1.0	1.0
+chr2	662886	1.0	0.0	1.0
+chr2	662887	1.0	0.0	1.0
+chr2	662890	1.0	0.0	1.0
+chr2	662897	0.0	1.0	1.0
+chr2	662903	0.0	1.0	1.0
+chr2	662914	1.0	0.0	1.0
+chr2	662916	1.0	0.0	1.0
+chr2	662928	0.0	1.0	1.0
+chr2	662930	1.0	0.0	1.0
+chr2	662937	0.0	1.0	1.0
+chr2	663049	1.0	0.0	1.0
+chr2	663065	1.0	0.0	1.0
+chr2	663086	0.0	1.0	1.0
+chr2	663098	0.0	1.0	1.0
+chr2	663103	1.0	0.0	1.0
+chr2	663111	2.0	0.0	2.0
+chr2	663214	1.0	0.0	1.0
+chr2	663259	0.0	1.0	1.0
+chr2	663391	0.0	1.0	1.0
+chr2	663410	0.0	1.0	1.0
+chr2	663420	0.0	2.0	2.0
+chr2	663507	0.0	1.0	1.0
+chr2	663574	0.0	1.0	1.0
+chr2	663777	0.0	1.0	1.0
+chr2	663902	1.0	0.0	1.0
+chr2	664038	0.0	1.0	1.0
+chr2	664191	0.0	1.0	1.0
+chr2	664197	1.0	0.0	1.0
+chr2	664358	0.0	1.0	1.0
+chr2	664360	1.0	0.0	1.0
+chr2	664495	1.0	0.0	1.0
+chr2	664513	1.0	0.0	1.0
+chr2	664524	0.0	2.0	2.0
+chr2	664526	1.0	0.0	1.0
+chr2	664532	1.0	0.0	1.0
+chr2	664537	1.0	0.0	1.0
+chr2	664556	0.0	1.0	1.0
+chr2	664638	0.0	1.0	1.0
+chr2	664651	1.0	0.0	1.0
+chr2	664657	1.0	0.0	1.0
+chr2	664672	0.0	2.0	2.0
+chr2	664673	1.0	0.0	1.0
+chr2	664677	1.0	0.0	1.0
+chr2	664678	1.0	0.0	1.0
+chr2	664679	1.0	0.0	1.0
+chr2	664685	1.0	0.0	1.0
+chr2	664687	2.0	0.0	2.0
+chr2	664691	1.0	0.0	1.0
+chr2	664694	0.0	2.0	2.0
+chr2	664695	1.0	0.0	1.0
+chr2	664696	6.0	2.0	8.0
+chr2	664702	1.0	0.0	1.0
+chr2	664705	3.0	1.0	4.0
+chr2	664708	1.0	0.0	1.0
+chr2	664712	1.0	0.0	1.0
+chr2	664727	0.0	1.0	1.0
+chr2	664731	1.0	0.0	1.0
+chr2	664736	0.0	1.0	1.0
+chr2	664788	0.0	1.0	1.0
+chr2	664844	1.0	0.0	1.0
+chr2	665154	1.0	0.0	1.0
+chr2	665181	0.0	1.0	1.0
+chr2	665305	1.0	0.0	1.0
+chr2	665388	0.0	2.0	2.0
+chr2	665462	0.0	1.0	1.0
+chr2	665608	0.0	1.0	1.0
+chr2	665771	1.0	0.0	1.0
+chr2	665893	1.0	0.0	1.0
+chr2	666200	0.0	2.0	2.0
+chr2	666403	2.0	0.0	2.0
+chr2	666420	2.0	0.0	2.0
+chr2	666429	0.0	1.0	1.0
+chr2	666432	0.0	1.0	1.0
+chr2	666435	0.0	1.0	1.0
+chr2	666437	0.0	1.0	1.0
+chr2	666442	0.0	1.0	1.0
+chr2	666689	1.0	0.0	1.0
+chr2	666695	1.0	0.0	1.0
+chr2	666703	0.0	1.0	1.0
+chr2	666705	2.0	0.0	2.0
+chr2	666719	1.0	1.0	2.0
+chr2	666736	1.0	0.0	1.0
+chr2	666834	0.0	1.0	1.0
+chr2	666849	0.0	1.0	1.0
+chr2	666853	1.0	0.0	1.0
+chr2	667027	1.0	0.0	1.0
+chr2	667028	1.0	0.0	1.0
+chr2	667066	0.0	1.0	1.0
+chr2	667189	3.0	0.0	3.0
+chr2	667682	0.0	1.0	1.0
+chr2	667833	1.0	0.0	1.0
+chr2	667942	1.0	0.0	1.0
+chr2	667957	0.0	1.0	1.0
+chr2	668202	0.0	2.0	2.0
+chr2	668332	1.0	0.0	1.0
+chr2	668345	0.0	1.0	1.0
+chr2	668349	1.0	0.0	1.0
+chr2	668350	1.0	1.0	2.0
+chr2	668351	3.0	0.0	3.0
+chr2	668358	0.0	2.0	2.0
+chr2	668359	0.0	1.0	1.0
+chr2	668360	0.0	1.0	1.0
+chr2	668365	1.0	0.0	1.0
+chr2	668376	0.0	1.0	1.0
+chr2	668380	1.0	0.0	1.0
+chr2	668579	0.0	2.0	2.0
+chr2	668626	0.0	3.0	3.0
+chr2	668646	1.0	0.0	1.0
+chr2	668664	0.0	1.0	1.0
+chr2	668708	0.0	2.0	2.0
+chr2	668887	1.0	0.0	1.0
+chr2	668903	1.0	0.0	1.0
+chr2	668907	1.0	0.0	1.0
+chr2	668909	2.0	0.0	2.0
+chr2	668913	0.0	1.0	1.0
+chr2	668915	0.0	1.0	1.0
+chr2	668919	0.0	1.0	1.0
+chr2	668928	2.0	0.0	2.0
+chr2	668932	2.0	0.0	2.0
+chr2	668936	1.0	0.0	1.0
+chr2	668947	0.0	3.0	3.0
+chr2	669030	0.0	2.0	2.0
+chr2	669066	1.0	0.0	1.0
+chr2	669098	0.0	1.0	1.0
+chr2	669099	1.0	0.0	1.0
+chr2	669210	0.0	1.0	1.0
+chr2	669269	0.0	1.0	1.0
+chr2	669281	1.0	0.0	1.0
+chr2	669407	0.0	1.0	1.0
+chr2	669783	0.0	3.0	3.0
+chr2	669898	2.0	0.0	2.0
+chr2	669925	1.0	0.0	1.0
+chr2	669933	0.0	2.0	2.0
+chr2	669946	0.0	1.0	1.0
+chr2	669947	1.0	0.0	1.0
+chr2	669948	1.0	0.0	1.0
+chr2	670070	1.0	0.0	1.0
+chr2	670085	0.0	1.0	1.0
+chr2	670086	1.0	0.0	1.0
+chr2	670090	0.0	1.0	1.0
+chr2	670099	0.0	1.0	1.0
+chr2	670101	1.0	0.0	1.0
+chr2	670103	1.0	0.0	1.0
+chr2	670110	1.0	0.0	1.0
+chr2	670122	1.0	0.0	1.0
+chr2	670241	0.0	1.0	1.0
+chr2	670242	0.0	2.0	2.0
+chr2	670245	1.0	0.0	1.0
+chr2	670249	0.0	2.0	2.0
+chr2	670250	0.0	1.0	1.0
+chr2	670253	0.0	1.0	1.0
+chr2	670258	1.0	0.0	1.0
+chr2	670259	2.0	0.0	2.0
+chr2	670260	2.0	0.0	2.0
+chr2	670261	1.0	0.0	1.0
+chr2	670263	1.0	0.0	1.0
+chr2	670267	2.0	0.0	2.0
+chr2	670268	2.0	0.0	2.0
+chr2	670270	1.0	0.0	1.0
+chr2	670271	0.0	1.0	1.0
+chr2	670272	1.0	0.0	1.0
+chr2	670275	0.0	2.0	2.0
+chr2	670277	1.0	1.0	2.0
+chr2	670278	0.0	4.0	4.0
+chr2	670279	2.0	1.0	3.0
+chr2	670300	1.0	0.0	1.0
+chr2	670474	1.0	0.0	1.0
+chr2	670506	1.0	0.0	1.0
+chr2	670511	1.0	0.0	1.0
+chr2	670514	1.0	0.0	1.0
+chr2	670520	1.0	1.0	2.0
+chr2	670523	2.0	1.0	3.0
+chr2	670528	1.0	0.0	1.0
+chr2	670539	0.0	1.0	1.0
+chr2	670709	0.0	2.0	2.0
+chr2	670874	1.0	0.0	1.0
+chr2	671002	1.0	0.0	1.0
+chr2	671169	0.0	1.0	1.0
+chr2	672801	0.0	1.0	1.0
+chr2	672996	1.0	0.0	1.0
+chr2	673020	0.0	1.0	1.0
+chr2	673046	0.0	1.0	1.0
+chr2	673775	0.0	1.0	1.0
+chr2	673807	1.0	0.0	1.0
+chr2	673834	0.0	1.0	1.0
+chr2	674187	1.0	0.0	1.0
+chr2	674299	0.0	1.0	1.0
+chr2	674459	1.0	0.0	1.0
+chr2	674595	1.0	0.0	1.0
+chr2	674717	1.0	0.0	1.0
+chr2	674779	1.0	0.0	1.0
+chr2	674797	0.0	3.0	3.0
+chr2	674801	1.0	0.0	1.0
+chr2	674806	1.0	0.0	1.0
+chr2	674813	0.0	1.0	1.0
+chr2	674823	1.0	0.0	1.0
+chr2	674999	1.0	0.0	1.0
+chr2	675064	0.0	1.0	1.0
+chr2	675072	0.0	1.0	1.0
+chr2	675085	1.0	0.0	1.0
+chr2	675107	1.0	0.0	1.0
+chr2	675108	1.0	0.0	1.0
+chr2	675113	0.0	1.0	1.0
+chr2	675128	3.0	1.0	4.0
+chr2	675134	0.0	2.0	2.0
+chr2	675136	1.0	0.0	1.0
+chr2	675137	1.0	0.0	1.0
+chr2	675145	1.0	0.0	1.0
+chr2	675146	3.0	0.0	3.0
+chr2	675171	0.0	1.0	1.0
+chr2	675178	1.0	0.0	1.0
+chr2	675336	0.0	1.0	1.0
+chr2	675357	2.0	0.0	2.0
+chr2	675369	2.0	0.0	2.0
+chr2	675370	1.0	0.0	1.0
+chr2	675371	0.0	2.0	2.0
+chr2	675374	3.0	0.0	3.0
+chr2	675380	0.0	1.0	1.0
+chr2	675406	1.0	0.0	1.0
+chr2	675423	1.0	0.0	1.0
+chr2	675486	0.0	1.0	1.0
+chr2	675494	0.0	2.0	2.0
+chr2	675510	1.0	1.0	2.0
+chr2	675523	0.0	1.0	1.0
+chr2	675524	1.0	0.0	1.0
+chr2	675531	0.0	1.0	1.0
+chr2	675542	0.0	1.0	1.0
+chr2	675543	0.0	1.0	1.0
+chr2	675544	0.0	1.0	1.0
+chr2	675580	1.0	0.0	1.0
+chr2	675692	1.0	0.0	1.0
+chr2	675857	0.0	1.0	1.0
+chr2	676132	0.0	1.0	1.0
+chr2	676166	1.0	0.0	1.0
+chr2	676195	0.0	1.0	1.0
+chr2	676226	1.0	0.0	1.0
+chr2	676250	1.0	0.0	1.0
+chr2	676311	1.0	0.0	1.0
+chr2	676502	1.0	0.0	1.0
+chr2	676613	1.0	0.0	1.0
+chr2	677234	0.0	1.0	1.0
+chr2	677289	0.0	1.0	1.0
+chr2	677590	1.0	0.0	1.0
+chr2	677919	2.0	0.0	2.0
+chr2	678360	1.0	0.0	1.0
+chr2	678530	1.0	0.0	1.0
+chr2	678646	1.0	0.0	1.0
+chr2	678673	1.0	0.0	1.0
+chr2	678685	1.0	0.0	1.0
+chr2	678799	1.0	0.0	1.0
+chr2	678827	0.0	1.0	1.0
+chr2	678840	0.0	1.0	1.0
+chr2	678847	1.0	0.0	1.0
+chr2	678857	1.0	0.0	1.0
+chr2	678879	1.0	0.0	1.0
+chr2	679009	0.0	2.0	2.0
+chr2	679019	2.0	0.0	2.0
+chr2	679163	0.0	1.0	1.0
+chr2	679171	1.0	0.0	1.0
+chr2	679181	0.0	1.0	1.0
+chr2	679182	2.0	0.0	2.0
+chr2	679183	5.0	0.0	5.0
+chr2	679187	1.0	0.0	1.0
+chr2	679188	1.0	0.0	1.0
+chr2	679189	1.0	0.0	1.0
+chr2	679190	1.0	5.0	6.0
+chr2	679191	1.0	2.0	3.0
+chr2	679194	0.0	1.0	1.0
+chr2	679197	2.0	1.0	3.0
+chr2	679198	5.0	1.0	6.0
+chr2	679201	0.0	2.0	2.0
+chr2	679204	0.0	2.0	2.0
+chr2	679208	0.0	15.0	15.0
+chr2	679211	0.0	4.0	4.0
+chr2	679212	0.0	1.0	1.0
+chr2	679214	0.0	1.0	1.0
+chr2	679215	1.0	1.0	2.0
+chr2	679216	1.0	0.0	1.0
+chr2	679218	1.0	0.0	1.0
+chr2	679220	3.0	0.0	3.0
+chr2	679223	0.0	1.0	1.0
+chr2	679249	0.0	1.0	1.0
+chr2	679479	1.0	0.0	1.0
+chr2	679483	1.0	0.0	1.0
+chr2	679484	0.0	2.0	2.0
+chr2	679488	2.0	0.0	2.0
+chr2	679497	0.0	1.0	1.0
+chr2	679502	0.0	1.0	1.0
+chr2	679630	1.0	0.0	1.0
+chr2	679649	1.0	0.0	1.0
+chr2	679650	1.0	0.0	1.0
+chr2	679659	1.0	0.0	1.0
+chr2	679674	1.0	0.0	1.0
+chr2	679682	0.0	1.0	1.0
+chr2	679694	0.0	1.0	1.0
+chr2	679715	1.0	0.0	1.0
+chr2	679799	2.0	0.0	2.0
+chr2	679832	1.0	0.0	1.0
+chr2	679833	0.0	1.0	1.0
+chr2	679846	1.0	0.0	1.0
+chr2	679858	0.0	1.0	1.0
+chr2	679860	1.0	0.0	1.0
+chr2	679866	0.0	1.0	1.0
+chr2	679871	0.0	1.0	1.0
+chr2	679873	1.0	0.0	1.0
+chr2	680006	0.0	1.0	1.0
+chr2	680024	1.0	0.0	1.0
+chr2	680030	1.0	0.0	1.0
+chr2	680034	1.0	0.0	1.0
+chr2	680041	0.0	1.0	1.0
+chr2	680042	2.0	3.0	5.0
+chr2	680043	1.0	0.0	1.0
+chr2	680047	1.0	0.0	1.0
+chr2	680048	1.0	0.0	1.0
+chr2	680051	0.0	1.0	1.0
+chr2	680054	0.0	2.0	2.0
+chr2	680055	3.0	0.0	3.0
+chr2	680064	0.0	1.0	1.0
+chr2	680296	1.0	0.0	1.0
+chr2	680320	1.0	0.0	1.0
+chr2	680338	1.0	0.0	1.0
+chr2	680340	1.0	0.0	1.0
+chr2	680355	0.0	1.0	1.0
+chr2	680356	1.0	0.0	1.0
+chr2	680362	0.0	2.0	2.0
+chr2	680378	0.0	1.0	1.0
+chr2	680401	0.0	1.0	1.0
+chr2	680488	1.0	0.0	1.0
+chr2	680530	1.0	0.0	1.0
+chr2	680757	1.0	0.0	1.0
+chr2	681138	0.0	1.0	1.0
+chr2	681614	1.0	0.0	1.0
+chr2	682199	0.0	1.0	1.0
+chr2	682207	1.0	0.0	1.0
+chr2	682216	0.0	1.0	1.0
+chr2	682234	1.0	0.0	1.0
+chr2	682240	0.0	6.0	6.0
+chr2	682244	1.0	0.0	1.0
+chr2	682249	1.0	0.0	1.0
+chr2	682250	1.0	0.0	1.0
+chr2	682253	1.0	0.0	1.0
+chr2	682269	0.0	1.0	1.0
+chr2	682380	0.0	1.0	1.0
+chr2	682398	1.0	0.0	1.0
+chr2	682399	0.0	1.0	1.0
+chr2	682451	0.0	1.0	1.0
+chr2	682552	0.0	1.0	1.0
+chr2	682572	1.0	1.0	2.0
+chr2	682577	1.0	0.0	1.0
+chr2	682719	1.0	0.0	1.0
+chr2	682896	1.0	0.0	1.0
+chr2	682899	1.0	0.0	1.0
+chr2	682900	1.0	0.0	1.0
+chr2	682901	2.0	0.0	2.0
+chr2	682922	1.0	0.0	1.0
+chr2	682927	0.0	1.0	1.0
+chr2	682933	0.0	1.0	1.0
+chr2	682939	0.0	1.0	1.0
+chr2	683016	0.0	1.0	1.0
+chr2	683044	0.0	2.0	2.0
+chr2	683064	2.0	0.0	2.0
+chr2	683066	2.0	1.0	3.0
+chr2	683073	0.0	2.0	2.0
+chr2	683074	1.0	0.0	1.0
+chr2	683085	1.0	0.0	1.0
+chr2	683090	0.0	1.0	1.0
+chr2	683098	1.0	0.0	1.0
+chr2	683099	0.0	1.0	1.0
+chr2	683126	1.0	0.0	1.0
+chr2	683292	1.0	0.0	1.0
+chr2	683315	0.0	1.0	1.0
+chr2	683326	1.0	0.0	1.0
+chr2	683334	1.0	0.0	1.0
+chr2	683348	1.0	0.0	1.0
+chr2	683353	1.0	0.0	1.0
+chr2	683354	1.0	0.0	1.0
+chr2	683356	1.0	1.0	2.0
+chr2	683367	0.0	1.0	1.0
+chr2	683392	1.0	0.0	1.0
+chr2	683398	1.0	0.0	1.0
+chr2	683405	0.0	2.0	2.0
+chr2	683508	0.0	1.0	1.0
+chr2	683512	0.0	1.0	1.0
+chr2	683523	0.0	1.0	1.0
+chr2	683530	0.0	1.0	1.0
+chr2	683533	0.0	2.0	2.0
+chr2	683534	2.0	0.0	2.0
+chr2	683541	1.0	0.0	1.0
+chr2	683542	0.0	1.0	1.0
+chr2	683588	0.0	2.0	2.0
+chr2	683590	0.0	1.0	1.0
+chr2	683673	0.0	1.0	1.0
+chr2	683706	0.0	1.0	1.0
+chr2	683855	0.0	1.0	1.0
+chr2	683858	0.0	1.0	1.0
+chr2	683862	0.0	1.0	1.0
+chr2	683875	0.0	1.0	1.0
+chr2	683979	0.0	1.0	1.0
+chr2	684028	0.0	1.0	1.0
+chr2	684349	1.0	0.0	1.0
+chr2	684380	1.0	0.0	1.0
+chr2	684445	0.0	1.0	1.0
+chr2	684508	1.0	0.0	1.0
+chr2	684559	1.0	0.0	1.0
+chr2	684667	0.0	1.0	1.0
+chr2	684945	0.0	1.0	1.0
+chr2	684963	1.0	0.0	1.0
+chr2	684972	1.0	0.0	1.0
+chr2	684976	1.0	0.0	1.0
+chr2	684977	1.0	0.0	1.0
+chr2	684982	0.0	1.0	1.0
+chr2	684983	0.0	1.0	1.0
+chr2	684985	0.0	4.0	4.0
+chr2	684986	3.0	0.0	3.0
+chr2	684988	0.0	1.0	1.0
+chr2	684990	0.0	1.0	1.0
+chr2	684992	1.0	0.0	1.0
+chr2	684997	1.0	0.0	1.0
+chr2	684998	4.0	2.0	6.0
+chr2	685004	1.0	0.0	1.0
+chr2	685008	1.0	1.0	2.0
+chr2	685009	0.0	1.0	1.0
+chr2	685017	0.0	1.0	1.0
+chr2	685023	0.0	2.0	2.0
+chr2	685082	1.0	0.0	1.0
+chr2	685149	0.0	1.0	1.0
+chr2	685152	0.0	1.0	1.0
+chr2	685153	0.0	1.0	1.0
+chr2	685159	2.0	0.0	2.0
+chr2	685162	0.0	3.0	3.0
+chr2	685163	0.0	1.0	1.0
+chr2	685171	1.0	0.0	1.0
+chr2	685173	1.0	0.0	1.0
+chr2	685174	0.0	1.0	1.0
+chr2	685190	1.0	0.0	1.0
+chr2	685536	1.0	0.0	1.0
+chr2	685733	1.0	0.0	1.0
+chr2	685740	1.0	0.0	1.0
+chr2	685890	1.0	0.0	1.0
+chr2	686069	1.0	0.0	1.0
+chr2	686091	0.0	1.0	1.0
+chr2	686104	0.0	1.0	1.0
+chr2	686262	2.0	0.0	2.0
+chr2	686397	1.0	0.0	1.0
+chr2	686403	0.0	1.0	1.0
+chr2	686404	0.0	1.0	1.0
+chr2	686408	1.0	0.0	1.0
+chr2	686494	0.0	1.0	1.0
+chr2	686515	0.0	1.0	1.0
+chr2	686535	0.0	1.0	1.0
+chr2	686551	0.0	1.0	1.0
+chr2	686553	1.0	0.0	1.0
+chr2	686555	1.0	0.0	1.0
+chr2	686559	0.0	1.0	1.0
+chr2	686560	0.0	4.0	4.0
+chr2	686564	1.0	0.0	1.0
+chr2	686565	3.0	1.0	4.0
+chr2	686568	0.0	1.0	1.0
+chr2	686569	1.0	0.0	1.0
+chr2	686570	1.0	0.0	1.0
+chr2	686571	3.0	0.0	3.0
+chr2	686572	2.0	3.0	5.0
+chr2	686573	0.0	1.0	1.0
+chr2	686574	1.0	0.0	1.0
+chr2	686576	0.0	2.0	2.0
+chr2	686577	0.0	1.0	1.0
+chr2	686581	1.0	2.0	3.0
+chr2	686582	3.0	0.0	3.0
+chr2	686584	0.0	2.0	2.0
+chr2	686585	1.0	0.0	1.0
+chr2	686588	0.0	2.0	2.0
+chr2	686589	0.0	1.0	1.0
+chr2	686590	0.0	1.0	1.0
+chr2	686592	0.0	1.0	1.0
+chr2	686595	0.0	4.0	4.0
+chr2	686597	1.0	0.0	1.0
+chr2	686606	1.0	1.0	2.0
+chr2	686662	1.0	0.0	1.0
+chr2	686800	0.0	1.0	1.0
+chr2	686801	0.0	1.0	1.0
+chr2	686837	0.0	2.0	2.0
+chr2	686842	1.0	1.0	2.0
+chr2	686846	1.0	0.0	1.0
+chr2	686856	1.0	0.0	1.0
+chr2	686858	0.0	1.0	1.0
+chr2	686859	4.0	0.0	4.0
+chr2	686872	2.0	0.0	2.0
+chr2	686873	0.0	1.0	1.0
+chr2	686874	0.0	1.0	1.0
+chr2	686875	0.0	1.0	1.0
+chr2	686877	2.0	0.0	2.0
+chr2	686885	0.0	1.0	1.0
+chr2	686949	1.0	0.0	1.0
+chr2	687022	1.0	0.0	1.0
+chr2	687030	0.0	1.0	1.0
+chr2	687041	5.0	0.0	5.0
+chr2	687051	1.0	0.0	1.0
+chr2	687344	1.0	0.0	1.0
+chr2	687364	1.0	0.0	1.0
+chr2	687365	1.0	0.0	1.0
+chr2	687439	2.0	0.0	2.0
+chr2	687682	1.0	0.0	1.0
+chr2	688821	0.0	1.0	1.0
+chr2	689184	1.0	0.0	1.0
+chr2	689185	0.0	1.0	1.0
+chr2	689203	0.0	1.0	1.0
+chr2	689281	0.0	1.0	1.0
+chr2	689410	1.0	0.0	1.0
+chr2	689477	0.0	1.0	1.0
+chr2	689685	0.0	1.0	1.0
+chr2	689961	2.0	0.0	2.0
+chr2	689983	1.0	0.0	1.0
+chr2	690837	1.0	0.0	1.0
+chr2	690997	2.0	0.0	2.0
+chr2	691003	1.0	0.0	1.0
+chr2	691320	1.0	0.0	1.0
+chr2	691354	3.0	0.0	3.0
+chr2	691493	0.0	1.0	1.0
+chr2	691511	2.0	0.0	2.0
+chr2	691514	0.0	1.0	1.0
+chr2	691609	0.0	1.0	1.0
+chr2	691636	0.0	1.0	1.0
+chr2	691661	2.0	0.0	2.0
+chr2	691666	1.0	3.0	4.0
+chr2	691668	1.0	7.0	8.0
+chr2	691669	0.0	1.0	1.0
+chr2	691670	1.0	0.0	1.0
+chr2	691672	2.0	0.0	2.0
+chr2	691674	1.0	0.0	1.0
+chr2	691677	0.0	2.0	2.0
+chr2	691681	1.0	0.0	1.0
+chr2	691682	2.0	0.0	2.0
+chr2	691684	1.0	1.0	2.0
+chr2	691685	2.0	0.0	2.0
+chr2	691686	1.0	1.0	2.0
+chr2	691688	0.0	4.0	4.0
+chr2	691691	0.0	2.0	2.0
+chr2	691693	0.0	1.0	1.0
+chr2	691694	1.0	1.0	2.0
+chr2	691696	2.0	0.0	2.0
+chr2	691699	0.0	1.0	1.0
+chr2	691718	0.0	1.0	1.0
+chr2	691719	0.0	1.0	1.0
+chr2	691954	1.0	0.0	1.0
+chr2	691955	1.0	0.0	1.0
+chr2	691956	7.0	0.0	7.0
+chr2	691958	1.0	1.0	2.0
+chr2	691962	0.0	3.0	3.0
+chr2	691973	2.0	0.0	2.0
+chr2	691975	2.0	0.0	2.0
+chr2	691976	1.0	0.0	1.0
+chr2	691991	1.0	0.0	1.0
+chr2	691994	1.0	0.0	1.0
+chr2	692000	0.0	1.0	1.0
+chr2	692116	1.0	0.0	1.0
+chr2	692125	1.0	0.0	1.0
+chr2	692126	1.0	0.0	1.0
+chr2	692128	0.0	1.0	1.0
+chr2	692137	2.0	0.0	2.0
+chr2	692144	0.0	1.0	1.0
+chr2	692281	1.0	0.0	1.0
+chr2	692291	2.0	0.0	2.0
+chr2	692298	1.0	0.0	1.0
+chr2	692597	0.0	1.0	1.0
+chr2	692735	0.0	1.0	1.0
+chr2	692774	0.0	1.0	1.0
+chr2	692927	2.0	0.0	2.0
+chr2	693101	0.0	1.0	1.0
+chr2	693191	0.0	1.0	1.0
+chr2	693276	1.0	0.0	1.0
+chr2	693282	0.0	1.0	1.0
+chr2	693557	2.0	0.0	2.0
+chr2	693765	0.0	1.0	1.0
+chr2	694160	0.0	1.0	1.0
+chr2	694290	0.0	1.0	1.0
+chr2	695169	1.0	0.0	1.0
+chr2	695944	0.0	1.0	1.0
+chr2	696031	1.0	0.0	1.0
+chr2	696818	0.0	1.0	1.0
+chr2	697027	1.0	0.0	1.0
+chr2	697213	0.0	1.0	1.0
+chr2	697256	3.0	0.0	3.0
+chr2	697323	1.0	0.0	1.0
+chr2	697416	0.0	1.0	1.0
+chr2	697858	1.0	0.0	1.0
+chr2	697881	1.0	0.0	1.0
+chr2	697901	0.0	2.0	2.0
+chr2	697902	2.0	0.0	2.0
+chr2	697913	0.0	3.0	3.0
+chr2	697921	2.0	0.0	2.0
+chr2	697923	0.0	1.0	1.0
+chr2	697924	1.0	0.0	1.0
+chr2	697936	0.0	4.0	4.0
+chr2	697990	0.0	2.0	2.0
+chr2	698087	1.0	0.0	1.0
+chr2	698108	0.0	1.0	1.0
+chr2	698145	1.0	0.0	1.0
+chr2	698147	1.0	0.0	1.0
+chr2	698149	1.0	0.0	1.0
+chr2	698150	1.0	0.0	1.0
+chr2	698155	1.0	1.0	2.0
+chr2	698159	1.0	0.0	1.0
+chr2	698171	1.0	0.0	1.0
+chr2	698178	0.0	1.0	1.0
+chr2	698183	0.0	1.0	1.0
+chr2	698192	0.0	1.0	1.0
+chr2	698196	2.0	0.0	2.0
+chr2	698207	0.0	1.0	1.0
+chr2	698432	0.0	1.0	1.0
+chr2	698484	0.0	1.0	1.0
+chr2	698631	1.0	0.0	1.0
+chr2	698870	1.0	0.0	1.0
+chr2	698925	0.0	1.0	1.0
+chr2	698958	0.0	1.0	1.0
+chr2	699012	1.0	0.0	1.0
+chr2	699215	0.0	1.0	1.0
+chr2	699216	0.0	1.0	1.0
+chr2	699355	1.0	0.0	1.0
+chr2	699375	0.0	1.0	1.0
+chr2	699402	1.0	0.0	1.0
+chr2	699625	1.0	0.0	1.0
+chr2	699653	1.0	0.0	1.0
+chr2	699672	2.0	0.0	2.0
+chr2	699685	0.0	3.0	3.0
+chr2	699687	0.0	1.0	1.0
+chr2	699701	2.0	0.0	2.0
+chr2	699834	0.0	1.0	1.0
+chr2	699864	1.0	0.0	1.0
+chr2	699870	0.0	1.0	1.0
+chr2	699871	1.0	0.0	1.0
+chr2	699872	1.0	0.0	1.0
+chr2	699877	1.0	0.0	1.0
+chr2	699882	0.0	1.0	1.0
+chr2	699886	0.0	1.0	1.0
+chr2	700009	0.0	1.0	1.0
+chr2	700012	0.0	1.0	1.0
+chr2	700014	0.0	1.0	1.0
+chr2	700017	0.0	1.0	1.0
+chr2	700019	0.0	1.0	1.0
+chr2	700022	0.0	1.0	1.0
+chr2	700023	0.0	1.0	1.0
+chr2	700030	0.0	1.0	1.0
+chr2	700031	0.0	1.0	1.0
+chr2	700032	0.0	1.0	1.0
+chr2	700035	3.0	0.0	3.0
+chr2	700036	0.0	4.0	4.0
+chr2	700038	0.0	2.0	2.0
+chr2	700042	3.0	1.0	4.0
+chr2	700043	2.0	0.0	2.0
+chr2	700044	2.0	0.0	2.0
+chr2	700045	0.0	1.0	1.0
+chr2	700056	0.0	1.0	1.0
+chr2	700294	1.0	0.0	1.0
+chr2	700308	1.0	0.0	1.0
+chr2	700315	1.0	0.0	1.0
+chr2	700319	1.0	0.0	1.0
+chr2	700336	0.0	1.0	1.0
+chr2	700433	0.0	1.0	1.0
+chr2	700475	1.0	0.0	1.0
+chr2	700483	0.0	1.0	1.0
+chr2	700486	1.0	0.0	1.0
+chr2	700487	1.0	0.0	1.0
+chr2	700489	0.0	2.0	2.0
+chr2	700493	0.0	1.0	1.0
+chr2	700497	4.0	0.0	4.0
+chr2	700498	2.0	0.0	2.0
+chr2	700501	0.0	1.0	1.0
+chr2	700505	0.0	2.0	2.0
+chr2	700507	1.0	0.0	1.0
+chr2	700513	0.0	1.0	1.0
+chr2	700514	0.0	1.0	1.0
+chr2	700520	0.0	1.0	1.0
+chr2	700577	1.0	0.0	1.0
+chr2	700584	1.0	0.0	1.0
+chr2	700634	0.0	1.0	1.0
+chr2	700643	2.0	0.0	2.0
+chr2	700647	1.0	0.0	1.0
+chr2	700648	0.0	1.0	1.0
+chr2	700664	0.0	2.0	2.0
+chr2	700667	1.0	0.0	1.0
+chr2	700671	0.0	1.0	1.0
+chr2	700675	0.0	1.0	1.0
+chr2	700681	0.0	1.0	1.0
+chr2	700682	0.0	1.0	1.0
+chr2	700684	1.0	0.0	1.0
+chr2	700688	0.0	1.0	1.0
+chr2	700795	1.0	0.0	1.0
+chr2	700826	0.0	2.0	2.0
+chr2	700839	1.0	0.0	1.0
+chr2	700850	0.0	1.0	1.0
+chr2	700851	1.0	0.0	1.0
+chr2	700858	1.0	0.0	1.0
+chr2	700869	0.0	2.0	2.0
+chr2	700894	1.0	0.0	1.0
+chr2	700932	1.0	0.0	1.0
+chr2	700955	1.0	0.0	1.0
+chr2	700960	1.0	0.0	1.0
+chr2	700977	1.0	4.0	5.0
+chr2	701002	1.0	0.0	1.0
+chr2	701006	0.0	1.0	1.0
+chr2	701027	0.0	1.0	1.0
+chr2	701031	0.0	2.0	2.0
+chr2	701043	1.0	0.0	1.0
+chr2	701052	1.0	0.0	1.0
+chr2	701097	4.0	0.0	4.0
+chr2	701106	0.0	1.0	1.0
+chr2	701107	0.0	1.0	1.0
+chr2	701114	2.0	0.0	2.0
+chr2	701130	0.0	1.0	1.0
+chr2	701135	0.0	1.0	1.0
+chr2	701137	0.0	1.0	1.0
+chr2	701138	0.0	1.0	1.0
+chr2	701144	0.0	1.0	1.0
+chr2	701150	0.0	1.0	1.0
+chr2	701170	0.0	1.0	1.0
+chr2	701173	0.0	1.0	1.0
+chr2	701174	1.0	0.0	1.0
+chr2	701184	2.0	0.0	2.0
+chr2	701193	0.0	1.0	1.0
+chr2	701201	0.0	1.0	1.0
+chr2	701217	0.0	1.0	1.0
+chr2	701218	0.0	2.0	2.0
+chr2	701227	0.0	1.0	1.0
+chr2	701232	0.0	1.0	1.0
+chr2	701236	0.0	1.0	1.0
+chr2	701244	0.0	1.0	1.0
+chr2	701264	0.0	1.0	1.0
+chr2	701287	1.0	0.0	1.0
+chr2	701296	1.0	0.0	1.0
+chr2	701329	1.0	0.0	1.0
+chr2	701349	4.0	0.0	4.0
+chr2	701409	0.0	1.0	1.0
+chr2	701435	0.0	2.0	2.0
+chr2	701441	0.0	1.0	1.0
+chr2	701454	0.0	1.0	1.0
+chr2	701457	1.0	0.0	1.0
+chr2	701467	0.0	1.0	1.0
+chr2	701471	0.0	2.0	2.0
+chr2	701477	1.0	0.0	1.0
+chr2	701490	0.0	1.0	1.0
+chr2	701506	1.0	0.0	1.0
+chr2	701607	0.0	1.0	1.0
+chr2	701611	1.0	0.0	1.0
+chr2	701620	1.0	0.0	1.0
+chr2	701626	0.0	1.0	1.0
+chr2	701628	2.0	0.0	2.0
+chr2	701655	2.0	0.0	2.0
+chr2	701769	0.0	1.0	1.0
+chr2	701780	0.0	2.0	2.0
+chr2	701781	0.0	1.0	1.0
+chr2	701784	1.0	0.0	1.0
+chr2	701792	0.0	1.0	1.0
+chr2	701794	0.0	1.0	1.0
+chr2	701796	1.0	1.0	2.0
+chr2	701802	2.0	0.0	2.0
+chr2	701811	1.0	0.0	1.0
+chr2	701817	0.0	1.0	1.0
+chr2	701959	2.0	0.0	2.0
+chr2	702116	0.0	3.0	3.0
+chr2	702120	2.0	0.0	2.0
+chr2	702121	2.0	0.0	2.0
+chr2	702122	6.0	0.0	6.0
+chr2	702123	2.0	0.0	2.0
+chr2	702124	0.0	3.0	3.0
+chr2	702125	0.0	1.0	1.0
+chr2	702128	0.0	1.0	1.0
+chr2	702131	0.0	2.0	2.0
+chr2	702135	6.0	0.0	6.0
+chr2	702140	0.0	1.0	1.0
+chr2	702146	2.0	0.0	2.0
+chr2	702148	1.0	0.0	1.0
+chr2	702152	0.0	1.0	1.0
+chr2	702153	0.0	3.0	3.0
+chr2	702154	1.0	0.0	1.0
+chr2	702158	0.0	1.0	1.0
+chr2	702161	1.0	0.0	1.0
+chr2	702163	3.0	0.0	3.0
+chr2	702175	1.0	0.0	1.0
+chr2	702177	2.0	0.0	2.0
+chr2	702179	0.0	2.0	2.0
+chr2	702189	0.0	1.0	1.0
+chr2	702190	0.0	1.0	1.0
+chr2	702200	0.0	1.0	1.0
+chr2	702229	1.0	0.0	1.0
+chr2	702458	1.0	0.0	1.0
+chr2	702616	0.0	1.0	1.0
+chr2	702642	1.0	0.0	1.0
+chr2	702648	0.0	1.0	1.0
+chr2	702659	0.0	1.0	1.0
+chr2	702690	0.0	1.0	1.0
+chr2	702805	0.0	1.0	1.0
+chr2	702963	0.0	1.0	1.0
+chr2	703112	1.0	0.0	1.0
+chr2	703185	0.0	1.0	1.0
+chr2	703200	0.0	1.0	1.0
+chr2	703271	1.0	1.0	2.0
+chr2	703296	1.0	0.0	1.0
+chr2	703304	1.0	0.0	1.0
+chr2	703317	0.0	1.0	1.0
+chr2	703366	1.0	0.0	1.0
+chr2	703486	0.0	1.0	1.0
+chr2	703489	2.0	0.0	2.0
+chr2	703530	1.0	0.0	1.0
+chr2	703546	0.0	1.0	1.0
+chr2	703593	2.0	0.0	2.0
+chr2	703610	0.0	1.0	1.0
+chr2	703622	0.0	1.0	1.0
+chr2	703642	0.0	1.0	1.0
+chr2	703644	0.0	1.0	1.0
+chr2	703658	1.0	0.0	1.0
+chr2	703659	0.0	1.0	1.0
+chr2	703678	0.0	2.0	2.0
+chr2	703732	0.0	1.0	1.0
+chr2	703774	1.0	0.0	1.0
+chr2	703778	1.0	0.0	1.0
+chr2	703828	2.0	0.0	2.0
+chr2	703873	1.0	0.0	1.0
+chr2	703880	0.0	1.0	1.0
+chr2	703927	0.0	1.0	1.0
+chr2	703975	1.0	0.0	1.0
+chr2	703995	1.0	0.0	1.0
+chr2	704008	0.0	4.0	4.0
+chr2	704014	1.0	0.0	1.0
+chr2	704039	1.0	0.0	1.0
+chr2	704055	1.0	0.0	1.0
+chr2	704065	1.0	0.0	1.0
+chr2	704067	1.0	1.0	2.0
+chr2	704068	1.0	0.0	1.0
+chr2	704070	1.0	0.0	1.0
+chr2	704083	0.0	1.0	1.0
+chr2	704092	0.0	1.0	1.0
+chr2	704209	1.0	0.0	1.0
+chr2	704231	1.0	0.0	1.0
+chr2	704233	1.0	1.0	2.0
+chr2	704243	1.0	0.0	1.0
+chr2	704246	3.0	1.0	4.0
+chr2	704247	0.0	3.0	3.0
+chr2	704251	0.0	1.0	1.0
+chr2	704255	0.0	1.0	1.0
+chr2	704257	1.0	0.0	1.0
+chr2	704260	0.0	1.0	1.0
+chr2	704261	0.0	4.0	4.0
+chr2	704265	1.0	1.0	2.0
+chr2	704282	0.0	1.0	1.0
+chr2	704289	3.0	0.0	3.0
+chr2	704303	1.0	0.0	1.0
+chr2	704337	0.0	1.0	1.0
+chr2	704517	0.0	1.0	1.0
+chr2	704545	3.0	0.0	3.0
+chr2	704552	0.0	1.0	1.0
+chr2	704553	0.0	1.0	1.0
+chr2	704559	0.0	1.0	1.0
+chr2	704579	1.0	0.0	1.0
+chr2	704692	0.0	1.0	1.0
+chr2	704727	0.0	2.0	2.0
+chr2	704764	1.0	0.0	1.0
+chr2	704886	1.0	1.0	2.0
+chr2	704918	0.0	1.0	1.0
+chr2	704924	1.0	0.0	1.0
+chr2	704956	1.0	0.0	1.0
+chr2	705015	0.0	1.0	1.0
+chr2	705040	1.0	0.0	1.0
+chr2	705296	0.0	1.0	1.0
+chr2	705924	1.0	0.0	1.0
+chr2	706294	1.0	0.0	1.0
+chr2	706338	0.0	1.0	1.0
+chr2	706422	0.0	1.0	1.0
+chr2	706569	2.0	0.0	2.0
+chr2	706573	0.0	1.0	1.0
+chr2	706579	1.0	0.0	1.0
+chr2	706585	1.0	0.0	1.0
+chr2	706591	1.0	0.0	1.0
+chr2	706594	1.0	1.0	2.0
+chr2	706605	0.0	1.0	1.0
+chr2	706625	2.0	0.0	2.0
+chr2	706732	0.0	1.0	1.0
+chr2	706747	1.0	1.0	2.0
+chr2	706748	1.0	0.0	1.0
+chr2	706752	0.0	2.0	2.0
+chr2	706755	1.0	0.0	1.0
+chr2	706756	1.0	0.0	1.0
+chr2	706758	0.0	3.0	3.0
+chr2	706759	0.0	1.0	1.0
+chr2	706760	0.0	1.0	1.0
+chr2	706761	0.0	1.0	1.0
+chr2	706764	2.0	2.0	4.0
+chr2	706765	5.0	0.0	5.0
+chr2	706766	4.0	0.0	4.0
+chr2	706767	0.0	1.0	1.0
+chr2	706769	0.0	1.0	1.0
+chr2	706770	1.0	0.0	1.0
+chr2	706772	1.0	1.0	2.0
+chr2	706776	1.0	0.0	1.0
+chr2	706788	1.0	0.0	1.0
+chr2	706970	0.0	1.0	1.0
+chr2	707020	1.0	0.0	1.0
+chr2	707057	1.0	0.0	1.0
+chr2	707124	1.0	0.0	1.0
+chr2	707144	0.0	1.0	1.0
+chr2	707160	1.0	0.0	1.0
+chr2	707178	0.0	1.0	1.0
+chr2	707190	1.0	0.0	1.0
+chr2	707309	0.0	1.0	1.0
+chr2	707328	0.0	1.0	1.0
+chr2	707344	1.0	0.0	1.0
+chr2	707349	1.0	0.0	1.0
+chr2	707353	0.0	2.0	2.0
+chr2	707355	2.0	0.0	2.0
+chr2	707361	0.0	2.0	2.0
+chr2	707363	1.0	0.0	1.0
+chr2	707364	1.0	0.0	1.0
+chr2	707372	1.0	0.0	1.0
+chr2	707375	2.0	0.0	2.0
+chr2	707590	1.0	0.0	1.0
+chr2	707702	1.0	0.0	1.0
+chr2	707771	0.0	1.0	1.0
+chr2	708208	0.0	1.0	1.0
+chr2	708211	1.0	0.0	1.0
+chr2	708219	0.0	1.0	1.0
+chr2	708220	0.0	1.0	1.0
+chr2	708250	0.0	1.0	1.0
+chr2	708395	0.0	1.0	1.0
+chr2	708407	1.0	0.0	1.0
+chr2	708614	1.0	0.0	1.0
+chr2	708966	0.0	1.0	1.0
+chr2	708984	1.0	0.0	1.0
+chr2	710290	0.0	1.0	1.0
+chr2	710368	1.0	0.0	1.0
+chr2	710985	1.0	0.0	1.0
+chr2	711013	1.0	0.0	1.0
+chr2	711014	1.0	0.0	1.0
+chr2	711181	1.0	0.0	1.0
+chr2	711197	0.0	1.0	1.0
+chr2	711199	1.0	0.0	1.0
+chr2	711224	1.0	0.0	1.0
+chr2	711322	2.0	0.0	2.0
+chr2	711325	0.0	2.0	2.0
+chr2	711331	1.0	0.0	1.0
+chr2	711340	1.0	0.0	1.0
+chr2	711341	1.0	0.0	1.0
+chr2	711348	1.0	0.0	1.0
+chr2	711349	5.0	3.0	8.0
+chr2	711357	1.0	0.0	1.0
+chr2	711368	1.0	0.0	1.0
+chr2	711372	0.0	1.0	1.0
+chr2	711573	1.0	0.0	1.0
+chr2	711581	0.0	2.0	2.0
+chr2	711583	0.0	1.0	1.0
+chr2	711585	0.0	1.0	1.0
+chr2	711591	0.0	1.0	1.0
+chr2	711592	0.0	1.0	1.0
+chr2	711600	3.0	2.0	5.0
+chr2	711601	1.0	0.0	1.0
+chr2	711605	0.0	1.0	1.0
+chr2	711607	0.0	1.0	1.0
+chr2	711608	1.0	0.0	1.0
+chr2	711611	2.0	0.0	2.0
+chr2	711615	0.0	1.0	1.0
+chr2	711616	0.0	3.0	3.0
+chr2	711617	0.0	1.0	1.0
+chr2	711618	1.0	0.0	1.0
+chr2	711622	1.0	0.0	1.0
+chr2	711626	0.0	1.0	1.0
+chr2	711634	1.0	0.0	1.0
+chr2	711774	0.0	1.0	1.0
+chr2	711776	1.0	0.0	1.0
+chr2	711779	1.0	0.0	1.0
+chr2	711786	1.0	0.0	1.0
+chr2	711835	1.0	0.0	1.0
+chr2	711895	0.0	1.0	1.0
+chr2	712450	0.0	1.0	1.0
+chr2	712565	0.0	1.0	1.0
+chr2	713814	0.0	1.0	1.0
+chr2	713819	1.0	0.0	1.0
+chr2	713848	0.0	1.0	1.0
+chr2	713888	0.0	1.0	1.0
+chr2	713947	1.0	0.0	1.0
+chr2	713963	0.0	1.0	1.0
+chr2	714124	0.0	1.0	1.0
+chr2	714126	1.0	0.0	1.0
+chr2	714265	1.0	0.0	1.0
+chr2	714277	0.0	1.0	1.0
+chr2	714286	0.0	1.0	1.0
+chr2	714287	1.0	0.0	1.0
+chr2	714439	1.0	0.0	1.0
+chr2	714441	1.0	0.0	1.0
+chr2	714442	1.0	0.0	1.0
+chr2	714448	0.0	1.0	1.0
+chr2	714452	1.0	0.0	1.0
+chr2	714465	1.0	0.0	1.0
+chr2	714473	0.0	2.0	2.0
+chr2	714498	0.0	1.0	1.0
+chr2	714663	2.0	0.0	2.0
+chr2	714707	1.0	0.0	1.0
+chr2	714716	1.0	0.0	1.0
+chr2	714717	1.0	0.0	1.0
+chr2	714720	1.0	0.0	1.0
+chr2	714735	0.0	1.0	1.0
+chr2	714741	1.0	0.0	1.0
+chr2	714747	1.0	0.0	1.0
+chr2	714751	0.0	1.0	1.0
+chr2	714752	0.0	1.0	1.0
+chr2	714877	0.0	1.0	1.0
+chr2	714897	0.0	1.0	1.0
+chr2	714902	1.0	0.0	1.0
+chr2	714918	0.0	2.0	2.0
+chr2	714919	1.0	0.0	1.0
+chr2	714921	0.0	1.0	1.0
+chr2	714929	1.0	0.0	1.0
+chr2	714934	0.0	2.0	2.0
+chr2	714943	1.0	0.0	1.0
+chr2	715129	0.0	1.0	1.0
+chr2	715253	0.0	1.0	1.0
+chr2	715431	2.0	0.0	2.0
+chr2	715457	1.0	0.0	1.0
+chr2	715477	1.0	0.0	1.0
+chr2	715603	0.0	1.0	1.0
+chr2	715623	1.0	0.0	1.0
+chr2	715631	1.0	0.0	1.0
+chr2	715887	1.0	0.0	1.0
+chr2	716052	1.0	0.0	1.0
+chr2	716116	1.0	0.0	1.0
+chr2	716152	1.0	0.0	1.0
+chr2	716169	0.0	1.0	1.0
+chr2	716173	0.0	1.0	1.0
+chr2	716181	0.0	1.0	1.0
+chr2	716189	1.0	0.0	1.0
+chr2	716312	0.0	1.0	1.0
+chr2	716316	0.0	1.0	1.0
+chr2	716352	0.0	1.0	1.0
+chr2	716353	1.0	0.0	1.0
+chr2	716358	1.0	0.0	1.0
+chr2	716362	1.0	0.0	1.0
+chr2	716474	1.0	0.0	1.0
+chr2	716480	0.0	1.0	1.0
+chr2	716484	5.0	0.0	5.0
+chr2	716486	2.0	0.0	2.0
+chr2	716493	1.0	1.0	2.0
+chr2	716495	0.0	1.0	1.0
+chr2	716496	1.0	0.0	1.0
+chr2	716497	1.0	0.0	1.0
+chr2	716498	5.0	1.0	6.0
+chr2	716499	1.0	0.0	1.0
+chr2	716500	0.0	2.0	2.0
+chr2	716504	1.0	3.0	4.0
+chr2	716507	1.0	3.0	4.0
+chr2	716508	0.0	2.0	2.0
+chr2	716514	1.0	0.0	1.0
+chr2	716544	1.0	0.0	1.0
+chr2	716768	0.0	1.0	1.0
+chr2	716779	0.0	1.0	1.0
+chr2	716780	0.0	1.0	1.0
+chr2	716791	0.0	2.0	2.0
+chr2	716792	2.0	1.0	3.0
+chr2	716794	1.0	0.0	1.0
+chr2	716802	0.0	1.0	1.0
+chr2	716945	1.0	0.0	1.0
+chr2	716955	2.0	0.0	2.0
+chr2	716958	2.0	0.0	2.0
+chr2	716964	0.0	1.0	1.0
+chr2	716969	0.0	1.0	1.0
+chr2	716975	1.0	0.0	1.0
+chr2	717151	1.0	0.0	1.0
+chr2	717402	0.0	1.0	1.0
+chr2	717452	0.0	2.0	2.0
+chr2	717515	1.0	0.0	1.0
+chr2	717568	1.0	0.0	1.0
+chr2	717600	0.0	1.0	1.0
+chr2	717795	0.0	2.0	2.0
+chr2	717840	0.0	1.0	1.0
+chr2	717851	0.0	1.0	1.0
+chr2	717936	0.0	1.0	1.0
+chr2	717954	0.0	1.0	1.0
+chr2	718367	0.0	1.0	1.0
+chr2	718376	0.0	1.0	1.0
+chr2	718398	1.0	2.0	3.0
+chr2	718400	1.0	0.0	1.0
+chr2	718406	0.0	1.0	1.0
+chr2	718412	0.0	2.0	2.0
+chr2	718429	1.0	0.0	1.0
+chr2	718432	0.0	1.0	1.0
+chr2	718433	0.0	3.0	3.0
+chr2	718434	0.0	1.0	1.0
+chr2	718458	1.0	0.0	1.0
+chr2	718472	0.0	1.0	1.0
+chr2	718473	0.0	1.0	1.0
+chr2	718607	1.0	0.0	1.0
+chr2	718620	0.0	1.0	1.0
+chr2	718621	0.0	1.0	1.0
+chr2	718632	0.0	1.0	1.0
+chr2	718748	2.0	0.0	2.0
+chr2	718786	0.0	1.0	1.0
+chr2	718942	1.0	0.0	1.0
+chr2	718961	3.0	0.0	3.0
+chr2	718972	0.0	1.0	1.0
+chr2	718977	1.0	0.0	1.0
+chr2	718978	0.0	1.0	1.0
+chr2	718989	1.0	0.0	1.0
+chr2	719134	1.0	0.0	1.0
+chr2	719141	0.0	1.0	1.0
+chr2	719153	1.0	0.0	1.0
+chr2	719170	1.0	0.0	1.0
+chr2	719178	0.0	1.0	1.0
+chr2	719184	0.0	1.0	1.0
+chr2	719186	1.0	0.0	1.0
+chr2	719206	1.0	0.0	1.0
+chr2	719304	0.0	1.0	1.0
+chr2	719309	1.0	0.0	1.0
+chr2	719319	1.0	0.0	1.0
+chr2	719346	1.0	0.0	1.0
+chr2	719352	0.0	1.0	1.0
+chr2	719434	1.0	0.0	1.0
+chr2	719606	0.0	1.0	1.0
+chr2	719624	0.0	1.0	1.0
+chr2	719640	0.0	1.0	1.0
+chr2	719662	1.0	0.0	1.0
+chr2	719664	0.0	1.0	1.0
+chr2	719696	1.0	0.0	1.0
+chr2	719697	3.0	0.0	3.0
+chr2	719707	0.0	1.0	1.0
+chr2	719737	0.0	1.0	1.0
+chr2	719780	1.0	0.0	1.0
+chr2	719812	1.0	0.0	1.0
+chr2	719828	0.0	1.0	1.0
+chr2	719988	0.0	1.0	1.0
+chr2	720006	1.0	0.0	1.0
+chr2	720015	0.0	1.0	1.0
+chr2	720035	1.0	0.0	1.0
+chr2	720040	0.0	1.0	1.0
+chr2	720043	1.0	0.0	1.0
+chr2	720150	1.0	0.0	1.0
+chr2	720173	0.0	1.0	1.0
+chr2	720177	1.0	0.0	1.0
+chr2	720179	0.0	1.0	1.0
+chr2	720233	1.0	0.0	1.0
+chr2	720242	0.0	2.0	2.0
+chr2	720249	1.0	0.0	1.0
+chr2	720297	0.0	1.0	1.0
+chr2	720325	0.0	1.0	1.0
+chr2	720329	1.0	2.0	3.0
+chr2	720345	3.0	0.0	3.0
+chr2	720351	2.0	0.0	2.0
+chr2	720360	0.0	1.0	1.0
+chr2	720364	1.0	0.0	1.0
+chr2	720365	1.0	1.0	2.0
+chr2	720366	0.0	1.0	1.0
+chr2	720368	0.0	2.0	2.0
+chr2	720377	2.0	0.0	2.0
+chr2	720378	1.0	0.0	1.0
+chr2	720387	0.0	1.0	1.0
+chr2	720398	2.0	0.0	2.0
+chr2	720410	0.0	1.0	1.0
+chr2	720412	1.0	0.0	1.0
+chr2	720499	0.0	1.0	1.0
+chr2	720528	1.0	0.0	1.0
+chr2	720533	1.0	0.0	1.0
+chr2	720563	1.0	0.0	1.0
+chr2	720564	0.0	3.0	3.0
+chr2	720567	1.0	0.0	1.0
+chr2	720572	0.0	1.0	1.0
+chr2	720581	0.0	3.0	3.0
+chr2	720584	0.0	1.0	1.0
+chr2	720585	1.0	0.0	1.0
+chr2	720590	0.0	2.0	2.0
+chr2	720594	1.0	0.0	1.0
+chr2	720752	2.0	0.0	2.0
+chr2	720757	1.0	0.0	1.0
+chr2	720761	1.0	0.0	1.0
+chr2	720763	1.0	0.0	1.0
+chr2	720770	4.0	0.0	4.0
+chr2	720774	0.0	1.0	1.0
+chr2	720793	1.0	0.0	1.0
+chr2	720799	0.0	1.0	1.0
+chr2	720807	1.0	0.0	1.0
+chr2	720922	0.0	2.0	2.0
+chr2	720931	1.0	0.0	1.0
+chr2	720933	1.0	0.0	1.0
+chr2	720944	1.0	0.0	1.0
+chr2	720946	1.0	0.0	1.0
+chr2	720947	0.0	1.0	1.0
+chr2	720950	2.0	0.0	2.0
+chr2	720951	2.0	2.0	4.0
+chr2	720956	0.0	2.0	2.0
+chr2	720960	0.0	1.0	1.0
+chr2	721112	0.0	2.0	2.0
+chr2	721113	0.0	1.0	1.0
+chr2	721114	1.0	0.0	1.0
+chr2	721118	0.0	2.0	2.0
+chr2	721125	1.0	0.0	1.0
+chr2	721126	1.0	0.0	1.0
+chr2	721128	1.0	0.0	1.0
+chr2	721130	0.0	1.0	1.0
+chr2	721131	1.0	2.0	3.0
+chr2	721134	1.0	0.0	1.0
+chr2	721146	1.0	0.0	1.0
+chr2	721154	0.0	1.0	1.0
+chr2	721165	1.0	0.0	1.0
+chr2	721345	1.0	0.0	1.0
+chr2	721355	0.0	2.0	2.0
+chr2	721368	3.0	0.0	3.0
+chr2	721369	4.0	0.0	4.0
+chr2	721371	0.0	1.0	1.0
+chr2	721372	2.0	0.0	2.0
+chr2	721378	0.0	1.0	1.0
+chr2	721381	1.0	1.0	2.0
+chr2	721382	1.0	0.0	1.0
+chr2	721384	4.0	3.0	7.0
+chr2	721385	0.0	1.0	1.0
+chr2	721389	1.0	1.0	2.0
+chr2	721390	1.0	0.0	1.0
+chr2	721397	0.0	4.0	4.0
+chr2	721524	1.0	0.0	1.0
+chr2	721542	0.0	1.0	1.0
+chr2	721551	1.0	0.0	1.0
+chr2	721555	0.0	1.0	1.0
+chr2	721573	1.0	0.0	1.0
+chr2	721672	1.0	0.0	1.0
+chr2	721715	0.0	1.0	1.0
+chr2	722037	0.0	1.0	1.0
+chr2	722045	1.0	0.0	1.0
+chr2	722052	1.0	0.0	1.0
+chr2	722077	0.0	1.0	1.0
+chr2	722205	0.0	1.0	1.0
+chr2	722388	0.0	1.0	1.0
+chr2	722391	0.0	1.0	1.0
+chr2	722624	1.0	0.0	1.0
+chr2	722627	2.0	0.0	2.0
+chr2	722629	0.0	2.0	2.0
+chr2	722630	1.0	1.0	2.0
+chr2	722637	0.0	1.0	1.0
+chr2	722638	1.0	0.0	1.0
+chr2	722645	0.0	3.0	3.0
+chr2	722661	0.0	1.0	1.0
+chr2	722796	1.0	0.0	1.0
+chr2	722817	0.0	3.0	3.0
+chr2	722825	2.0	0.0	2.0
+chr2	722826	1.0	0.0	1.0
+chr2	722837	1.0	0.0	1.0
+chr2	722838	1.0	0.0	1.0
+chr2	722967	0.0	1.0	1.0
+chr2	722968	1.0	0.0	1.0
+chr2	722970	0.0	2.0	2.0
+chr2	722971	0.0	1.0	1.0
+chr2	722976	3.0	0.0	3.0
+chr2	722980	1.0	0.0	1.0
+chr2	722982	1.0	0.0	1.0
+chr2	722984	1.0	3.0	4.0
+chr2	722985	0.0	1.0	1.0
+chr2	722988	1.0	0.0	1.0
+chr2	723000	1.0	0.0	1.0
+chr2	723004	0.0	1.0	1.0
+chr2	723012	0.0	1.0	1.0
+chr2	723014	0.0	1.0	1.0
+chr2	723027	0.0	1.0	1.0
+chr2	723221	0.0	1.0	1.0
+chr2	723237	0.0	1.0	1.0
+chr2	723240	1.0	0.0	1.0
+chr2	723248	1.0	0.0	1.0
+chr2	723253	1.0	0.0	1.0
+chr2	723254	4.0	0.0	4.0
+chr2	723259	1.0	2.0	3.0
+chr2	723260	4.0	0.0	4.0
+chr2	723262	1.0	0.0	1.0
+chr2	723263	2.0	0.0	2.0
+chr2	723264	0.0	1.0	1.0
+chr2	723265	0.0	1.0	1.0
+chr2	723267	0.0	2.0	2.0
+chr2	723272	1.0	0.0	1.0
+chr2	723273	2.0	0.0	2.0
+chr2	723287	0.0	1.0	1.0
+chr2	723288	0.0	1.0	1.0
+chr2	723389	1.0	0.0	1.0
+chr2	723442	0.0	2.0	2.0
+chr2	723445	1.0	0.0	1.0
+chr2	723547	1.0	0.0	1.0
+chr2	723574	1.0	1.0	2.0
+chr2	723577	1.0	0.0	1.0
+chr2	723716	1.0	0.0	1.0
+chr2	723732	1.0	0.0	1.0
+chr2	723738	0.0	1.0	1.0
+chr2	723763	0.0	1.0	1.0
+chr2	723765	1.0	0.0	1.0
+chr2	723777	2.0	0.0	2.0
+chr2	723873	0.0	1.0	1.0
+chr2	723874	0.0	1.0	1.0
+chr2	723887	1.0	0.0	1.0
+chr2	723897	1.0	0.0	1.0
+chr2	724029	0.0	1.0	1.0
+chr2	724050	1.0	0.0	1.0
+chr2	724060	0.0	1.0	1.0
+chr2	724062	1.0	0.0	1.0
+chr2	724067	0.0	1.0	1.0
+chr2	724076	1.0	0.0	1.0
+chr2	724085	1.0	0.0	1.0
+chr2	724171	0.0	1.0	1.0
+chr2	724187	0.0	1.0	1.0
+chr2	724189	0.0	1.0	1.0
+chr2	724193	1.0	0.0	1.0
+chr2	724198	1.0	0.0	1.0
+chr2	724202	1.0	0.0	1.0
+chr2	724207	1.0	0.0	1.0
+chr2	724211	0.0	1.0	1.0
+chr2	724213	2.0	3.0	5.0
+chr2	724214	3.0	1.0	4.0
+chr2	724217	6.0	0.0	6.0
+chr2	724220	0.0	8.0	8.0
+chr2	724221	0.0	2.0	2.0
+chr2	724222	0.0	3.0	3.0
+chr2	724223	1.0	0.0	1.0
+chr2	724225	2.0	0.0	2.0
+chr2	724226	0.0	1.0	1.0
+chr2	724234	0.0	1.0	1.0
+chr2	724237	1.0	0.0	1.0
+chr2	724245	0.0	2.0	2.0
+chr2	724436	1.0	0.0	1.0
+chr2	724449	1.0	0.0	1.0
+chr2	724455	0.0	1.0	1.0
+chr2	724460	0.0	1.0	1.0
+chr2	724461	0.0	2.0	2.0
+chr2	724463	0.0	3.0	3.0
+chr2	724464	1.0	0.0	1.0
+chr2	724465	1.0	0.0	1.0
+chr2	724468	0.0	2.0	2.0
+chr2	724470	0.0	1.0	1.0
+chr2	724471	0.0	4.0	4.0
+chr2	724472	1.0	3.0	4.0
+chr2	724473	1.0	1.0	2.0
+chr2	724478	1.0	1.0	2.0
+chr2	724480	4.0	0.0	4.0
+chr2	724481	2.0	0.0	2.0
+chr2	724483	0.0	2.0	2.0
+chr2	724485	1.0	0.0	1.0
+chr2	724486	1.0	0.0	1.0
+chr2	724490	0.0	1.0	1.0
+chr2	724491	1.0	0.0	1.0
+chr2	724492	0.0	1.0	1.0
+chr2	724493	1.0	0.0	1.0
+chr2	724509	1.0	0.0	1.0
+chr2	724520	0.0	1.0	1.0
+chr2	724630	1.0	0.0	1.0
+chr2	724635	0.0	1.0	1.0
+chr2	724637	0.0	1.0	1.0
+chr2	724652	1.0	0.0	1.0
+chr2	724659	1.0	0.0	1.0
+chr2	724716	1.0	0.0	1.0
+chr2	724866	1.0	0.0	1.0
+chr2	725233	1.0	0.0	1.0
+chr2	725251	0.0	1.0	1.0
+chr2	725265	1.0	0.0	1.0
+chr2	725279	0.0	1.0	1.0
+chr2	725798	1.0	0.0	1.0
+chr2	725851	1.0	0.0	1.0
+chr2	725881	1.0	0.0	1.0
+chr2	725905	0.0	1.0	1.0
+chr2	726420	0.0	1.0	1.0
+chr2	726666	1.0	0.0	1.0
+chr2	726667	0.0	1.0	1.0
+chr2	726680	1.0	0.0	1.0
+chr2	726689	1.0	0.0	1.0
+chr2	726697	1.0	0.0	1.0
+chr2	726700	1.0	0.0	1.0
+chr2	726717	0.0	1.0	1.0
+chr2	726749	0.0	1.0	1.0
+chr2	726850	1.0	0.0	1.0
+chr2	726863	1.0	0.0	1.0
+chr2	726898	1.0	0.0	1.0
+chr2	726909	0.0	1.0	1.0
+chr2	727023	0.0	1.0	1.0
+chr2	727041	0.0	2.0	2.0
+chr2	727042	0.0	1.0	1.0
+chr2	727044	0.0	1.0	1.0
+chr2	727045	2.0	0.0	2.0
+chr2	727050	0.0	4.0	4.0
+chr2	727051	1.0	0.0	1.0
+chr2	727053	1.0	0.0	1.0
+chr2	727059	0.0	3.0	3.0
+chr2	727063	1.0	0.0	1.0
+chr2	727067	0.0	1.0	1.0
+chr2	727078	1.0	0.0	1.0
+chr2	727089	1.0	0.0	1.0
+chr2	727090	6.0	0.0	6.0
+chr2	727204	0.0	1.0	1.0
+chr2	727246	0.0	1.0	1.0
+chr2	727265	1.0	0.0	1.0
+chr2	727287	0.0	1.0	1.0
+chr2	727288	1.0	0.0	1.0
+chr2	727298	0.0	1.0	1.0
+chr2	727299	0.0	1.0	1.0
+chr2	727597	0.0	1.0	1.0
+chr2	727618	1.0	0.0	1.0
+chr2	727672	2.0	0.0	2.0
+chr2	727731	0.0	1.0	1.0
+chr2	727762	1.0	0.0	1.0
+chr2	727781	0.0	1.0	1.0
+chr2	727906	1.0	0.0	1.0
+chr2	727925	1.0	0.0	1.0
+chr2	727929	0.0	4.0	4.0
+chr2	727931	0.0	1.0	1.0
+chr2	727972	0.0	1.0	1.0
+chr2	728078	1.0	0.0	1.0
+chr2	728082	0.0	4.0	4.0
+chr2	728083	0.0	1.0	1.0
+chr2	728084	4.0	3.0	7.0
+chr2	728085	0.0	1.0	1.0
+chr2	728087	1.0	0.0	1.0
+chr2	728088	2.0	1.0	3.0
+chr2	728090	1.0	0.0	1.0
+chr2	728092	0.0	2.0	2.0
+chr2	728093	0.0	1.0	1.0
+chr2	728098	0.0	1.0	1.0
+chr2	728103	0.0	1.0	1.0
+chr2	728108	0.0	3.0	3.0
+chr2	728109	0.0	1.0	1.0
+chr2	728110	2.0	1.0	3.0
+chr2	728119	2.0	0.0	2.0
+chr2	728120	2.0	0.0	2.0
+chr2	728123	0.0	1.0	1.0
+chr2	728134	1.0	0.0	1.0
+chr2	728166	0.0	1.0	1.0
+chr2	728355	0.0	1.0	1.0
+chr2	728376	1.0	0.0	1.0
+chr2	728588	0.0	1.0	1.0
+chr2	728834	0.0	1.0	1.0
+chr2	728876	2.0	1.0	3.0
+chr2	728884	2.0	0.0	2.0
+chr2	728885	2.0	3.0	5.0
+chr2	728886	7.0	0.0	7.0
+chr2	728891	1.0	0.0	1.0
+chr2	728892	0.0	1.0	1.0
+chr2	728893	1.0	0.0	1.0
+chr2	728895	0.0	3.0	3.0
+chr2	728896	0.0	1.0	1.0
+chr2	728898	0.0	1.0	1.0
+chr2	728899	1.0	1.0	2.0
+chr2	728903	0.0	1.0	1.0
+chr2	728906	1.0	0.0	1.0
+chr2	728908	1.0	0.0	1.0
+chr2	728910	0.0	1.0	1.0
+chr2	728912	1.0	0.0	1.0
+chr2	728913	4.0	1.0	5.0
+chr2	728915	1.0	0.0	1.0
+chr2	728920	0.0	2.0	2.0
+chr2	728929	0.0	1.0	1.0
+chr2	728935	0.0	1.0	1.0
+chr2	729050	0.0	1.0	1.0
+chr2	729052	1.0	0.0	1.0
+chr2	729053	1.0	0.0	1.0
+chr2	729061	1.0	2.0	3.0
+chr2	729062	0.0	1.0	1.0
+chr2	729081	0.0	1.0	1.0
+chr2	729090	1.0	0.0	1.0
+chr2	729422	0.0	1.0	1.0
+chr2	729440	0.0	1.0	1.0
+chr2	729605	1.0	0.0	1.0
+chr2	729778	0.0	1.0	1.0
+chr2	729795	0.0	1.0	1.0
+chr2	729898	1.0	0.0	1.0
+chr2	729912	0.0	1.0	1.0
+chr2	729932	0.0	1.0	1.0
+chr2	729944	1.0	0.0	1.0
+chr2	729954	0.0	1.0	1.0
+chr2	729962	0.0	1.0	1.0
+chr2	729967	0.0	1.0	1.0
+chr2	730069	2.0	0.0	2.0
+chr2	730116	0.0	2.0	2.0
+chr2	730118	2.0	0.0	2.0
+chr2	730131	2.0	0.0	2.0
+chr2	730140	1.0	0.0	1.0
+chr2	730141	1.0	0.0	1.0
+chr2	730161	0.0	1.0	1.0
+chr2	730333	0.0	1.0	1.0
+chr2	730336	0.0	1.0	1.0
+chr2	730369	0.0	1.0	1.0
+chr2	730376	1.0	0.0	1.0
+chr2	730377	4.0	0.0	4.0
+chr2	730378	1.0	0.0	1.0
+chr2	730379	3.0	0.0	3.0
+chr2	730381	1.0	2.0	3.0
+chr2	730383	0.0	1.0	1.0
+chr2	730385	0.0	1.0	1.0
+chr2	730386	0.0	1.0	1.0
+chr2	730390	2.0	0.0	2.0
+chr2	730393	0.0	1.0	1.0
+chr2	730396	0.0	1.0	1.0
+chr2	730411	0.0	1.0	1.0
+chr2	730520	0.0	1.0	1.0
+chr2	730535	2.0	0.0	2.0
+chr2	730545	0.0	1.0	1.0
+chr2	730548	0.0	1.0	1.0
+chr2	730549	2.0	0.0	2.0
+chr2	730550	0.0	1.0	1.0
+chr2	730556	0.0	1.0	1.0
+chr2	730561	2.0	0.0	2.0
+chr2	730565	0.0	1.0	1.0
+chr2	730574	0.0	1.0	1.0
+chr2	730576	0.0	1.0	1.0
+chr2	730577	0.0	2.0	2.0
+chr2	730578	2.0	0.0	2.0
+chr2	730608	0.0	1.0	1.0
+chr2	730629	1.0	0.0	1.0
+chr2	730630	1.0	0.0	1.0
+chr2	730706	0.0	2.0	2.0
+chr2	730741	0.0	1.0	1.0
+chr2	730869	0.0	1.0	1.0
+chr2	730885	1.0	0.0	1.0
+chr2	731339	1.0	0.0	1.0
+chr2	731496	0.0	1.0	1.0
+chr2	731648	0.0	1.0	1.0
+chr2	732497	0.0	1.0	1.0
+chr2	732614	0.0	1.0	1.0
+chr2	732674	0.0	1.0	1.0
+chr2	732755	1.0	0.0	1.0
+chr2	732812	1.0	0.0	1.0
+chr2	732988	1.0	0.0	1.0
+chr2	732997	2.0	0.0	2.0
+chr2	733013	0.0	1.0	1.0
+chr2	733100	1.0	0.0	1.0
+chr2	733153	0.0	1.0	1.0
+chr2	733175	2.0	0.0	2.0
+chr2	733182	1.0	0.0	1.0
+chr2	733203	1.0	0.0	1.0
+chr2	733387	1.0	0.0	1.0
+chr2	733457	0.0	1.0	1.0
+chr2	733504	1.0	0.0	1.0
+chr2	733755	0.0	1.0	1.0
+chr2	733816	1.0	0.0	1.0
+chr2	734094	0.0	1.0	1.0
+chr2	734256	0.0	2.0	2.0
+chr2	734279	1.0	0.0	1.0
+chr2	734285	0.0	1.0	1.0
+chr2	734404	1.0	0.0	1.0
+chr2	734426	3.0	0.0	3.0
+chr2	734427	0.0	2.0	2.0
+chr2	734443	1.0	0.0	1.0
+chr2	734448	1.0	0.0	1.0
+chr2	734521	1.0	0.0	1.0
+chr2	734529	1.0	0.0	1.0
+chr2	734556	0.0	1.0	1.0
+chr2	734568	0.0	3.0	3.0
+chr2	734570	0.0	1.0	1.0
+chr2	734575	3.0	0.0	3.0
+chr2	734576	3.0	0.0	3.0
+chr2	734580	1.0	0.0	1.0
+chr2	734581	0.0	4.0	4.0
+chr2	734582	0.0	2.0	2.0
+chr2	734583	2.0	0.0	2.0
+chr2	734584	1.0	1.0	2.0
+chr2	734585	0.0	1.0	1.0
+chr2	734591	4.0	0.0	4.0
+chr2	734592	2.0	0.0	2.0
+chr2	734593	0.0	2.0	2.0
+chr2	734594	0.0	3.0	3.0
+chr2	734595	0.0	1.0	1.0
+chr2	734596	0.0	1.0	1.0
+chr2	734597	0.0	1.0	1.0
+chr2	734598	0.0	1.0	1.0
+chr2	734601	0.0	5.0	5.0
+chr2	734602	3.0	1.0	4.0
+chr2	734604	0.0	3.0	3.0
+chr2	734607	1.0	0.0	1.0
+chr2	734625	1.0	0.0	1.0
+chr2	734633	0.0	1.0	1.0
+chr2	734822	0.0	1.0	1.0
+chr2	734826	0.0	1.0	1.0
+chr2	734831	1.0	0.0	1.0
+chr2	734832	2.0	0.0	2.0
+chr2	734833	4.0	0.0	4.0
+chr2	734839	0.0	3.0	3.0
+chr2	734840	0.0	1.0	1.0
+chr2	734841	0.0	1.0	1.0
+chr2	734842	7.0	0.0	7.0
+chr2	734848	1.0	0.0	1.0
+chr2	734849	1.0	0.0	1.0
+chr2	734850	0.0	5.0	5.0
+chr2	734851	1.0	1.0	2.0
+chr2	734853	2.0	1.0	3.0
+chr2	734854	0.0	1.0	1.0
+chr2	734855	0.0	1.0	1.0
+chr2	734856	0.0	1.0	1.0
+chr2	734857	0.0	3.0	3.0
+chr2	734860	0.0	4.0	4.0
+chr2	734862	0.0	1.0	1.0
+chr2	734867	0.0	2.0	2.0
+chr2	734872	0.0	1.0	1.0
+chr2	734880	2.0	0.0	2.0
+chr2	734886	1.0	0.0	1.0
+chr2	734893	0.0	1.0	1.0
+chr2	734934	1.0	0.0	1.0
+chr2	734988	1.0	0.0	1.0
+chr2	735012	0.0	1.0	1.0
+chr2	735117	0.0	1.0	1.0
+chr2	735174	1.0	0.0	1.0
+chr2	735183	1.0	0.0	1.0
+chr2	735308	4.0	0.0	4.0
+chr2	735311	0.0	1.0	1.0
+chr2	735339	0.0	2.0	2.0
+chr2	735342	0.0	2.0	2.0
+chr2	735349	1.0	0.0	1.0
+chr2	735369	0.0	1.0	1.0
+chr2	735425	0.0	1.0	1.0
+chr2	735464	0.0	1.0	1.0
+chr2	735467	1.0	0.0	1.0
+chr2	735486	1.0	1.0	2.0
+chr2	735488	2.0	0.0	2.0
+chr2	735500	1.0	0.0	1.0
+chr2	735501	0.0	2.0	2.0
+chr2	735503	0.0	3.0	3.0
+chr2	735504	0.0	1.0	1.0
+chr2	735505	1.0	0.0	1.0
+chr2	735511	0.0	1.0	1.0
+chr2	735516	2.0	0.0	2.0
+chr2	735520	0.0	2.0	2.0
+chr2	735523	0.0	3.0	3.0
+chr2	735526	0.0	1.0	1.0
+chr2	735541	0.0	1.0	1.0
+chr2	735564	1.0	0.0	1.0
+chr2	735684	0.0	1.0	1.0
+chr2	735763	0.0	1.0	1.0
+chr2	735847	1.0	0.0	1.0
+chr2	735867	0.0	1.0	1.0
+chr2	735999	2.0	0.0	2.0
+chr2	736006	1.0	0.0	1.0
+chr2	736008	1.0	0.0	1.0
+chr2	736009	1.0	0.0	1.0
+chr2	736014	0.0	4.0	4.0
+chr2	736015	3.0	0.0	3.0
+chr2	736017	1.0	0.0	1.0
+chr2	736018	1.0	0.0	1.0
+chr2	736022	0.0	1.0	1.0
+chr2	736025	1.0	0.0	1.0
+chr2	736027	0.0	2.0	2.0
+chr2	736028	0.0	2.0	2.0
+chr2	736029	0.0	1.0	1.0
+chr2	736032	1.0	0.0	1.0
+chr2	736244	0.0	1.0	1.0
+chr2	736250	1.0	0.0	1.0
+chr2	736255	1.0	0.0	1.0
+chr2	736262	0.0	1.0	1.0
+chr2	736263	1.0	0.0	1.0
+chr2	736269	1.0	0.0	1.0
+chr2	736271	2.0	0.0	2.0
+chr2	736273	0.0	1.0	1.0
+chr2	736277	0.0	2.0	2.0
+chr2	736279	1.0	0.0	1.0
+chr2	736280	1.0	0.0	1.0
+chr2	736281	0.0	1.0	1.0
+chr2	736282	1.0	0.0	1.0
+chr2	736283	1.0	0.0	1.0
+chr2	736289	0.0	1.0	1.0
+chr2	736290	1.0	0.0	1.0
+chr2	736293	2.0	0.0	2.0
+chr2	736299	0.0	1.0	1.0
+chr2	736301	1.0	0.0	1.0
+chr2	736304	0.0	1.0	1.0
+chr2	736307	0.0	1.0	1.0
+chr2	736312	1.0	0.0	1.0
+chr2	736406	1.0	0.0	1.0
+chr2	736424	1.0	0.0	1.0
+chr2	736425	2.0	0.0	2.0
+chr2	736454	0.0	1.0	1.0
+chr2	736456	1.0	0.0	1.0
+chr2	736473	1.0	0.0	1.0
+chr2	736577	1.0	0.0	1.0
+chr2	736599	1.0	0.0	1.0
+chr2	736657	1.0	0.0	1.0
+chr2	736780	0.0	1.0	1.0
+chr2	736924	0.0	1.0	1.0
+chr2	737109	1.0	0.0	1.0
+chr2	737213	0.0	1.0	1.0
+chr2	737281	0.0	1.0	1.0
+chr2	737376	0.0	1.0	1.0
+chr2	737954	0.0	1.0	1.0
+chr2	737968	0.0	1.0	1.0
+chr2	737985	1.0	0.0	1.0
+chr2	737987	0.0	1.0	1.0
+chr2	738001	1.0	0.0	1.0
+chr2	738002	1.0	0.0	1.0
+chr2	738046	0.0	1.0	1.0
+chr2	738141	0.0	1.0	1.0
+chr2	738142	1.0	0.0	1.0
+chr2	738145	1.0	0.0	1.0
+chr2	738165	0.0	1.0	1.0
+chr2	738230	0.0	1.0	1.0
+chr2	738255	0.0	1.0	1.0
+chr2	738262	0.0	1.0	1.0
+chr2	738286	0.0	1.0	1.0
+chr2	738303	2.0	0.0	2.0
+chr2	738305	0.0	1.0	1.0
+chr2	738306	0.0	1.0	1.0
+chr2	738308	1.0	0.0	1.0
+chr2	738311	1.0	0.0	1.0
+chr2	738313	1.0	1.0	2.0
+chr2	738316	0.0	1.0	1.0
+chr2	738317	1.0	0.0	1.0
+chr2	738319	0.0	3.0	3.0
+chr2	738320	0.0	1.0	1.0
+chr2	738322	0.0	1.0	1.0
+chr2	738323	0.0	1.0	1.0
+chr2	738328	1.0	0.0	1.0
+chr2	738332	1.0	0.0	1.0
+chr2	738333	0.0	1.0	1.0
+chr2	738334	0.0	1.0	1.0
+chr2	738335	0.0	1.0	1.0
+chr2	738363	0.0	1.0	1.0
+chr2	738469	0.0	1.0	1.0
+chr2	738551	0.0	1.0	1.0
+chr2	738576	0.0	2.0	2.0
+chr2	738577	1.0	5.0	6.0
+chr2	738588	1.0	0.0	1.0
+chr2	738620	3.0	0.0	3.0
+chr2	738627	2.0	0.0	2.0
+chr2	738634	1.0	0.0	1.0
+chr2	738715	0.0	1.0	1.0
+chr2	738743	0.0	1.0	1.0
+chr2	738750	0.0	2.0	2.0
+chr2	738752	0.0	1.0	1.0
+chr2	738753	1.0	0.0	1.0
+chr2	738760	1.0	0.0	1.0
+chr2	738761	1.0	0.0	1.0
+chr2	738767	1.0	0.0	1.0
+chr2	738784	0.0	1.0	1.0
+chr2	738809	2.0	0.0	2.0
+chr2	738916	0.0	1.0	1.0
+chr2	738922	0.0	1.0	1.0
+chr2	738924	0.0	1.0	1.0
+chr2	739017	0.0	2.0	2.0
+chr2	739061	0.0	1.0	1.0
+chr2	739144	0.0	1.0	1.0
+chr2	739282	1.0	0.0	1.0
+chr2	739434	1.0	0.0	1.0
+chr2	739438	0.0	1.0	1.0
+chr2	739442	0.0	1.0	1.0
+chr2	739462	1.0	0.0	1.0
+chr2	739510	0.0	1.0	1.0
+chr2	739550	0.0	1.0	1.0
+chr2	739558	0.0	1.0	1.0
+chr2	739564	0.0	1.0	1.0
+chr2	739582	1.0	0.0	1.0
+chr2	739591	1.0	0.0	1.0
+chr2	739608	1.0	0.0	1.0
+chr2	739803	0.0	1.0	1.0
+chr2	739847	1.0	0.0	1.0
+chr2	739863	1.0	0.0	1.0
+chr2	739874	1.0	0.0	1.0
+chr2	739877	1.0	0.0	1.0
+chr2	739882	0.0	1.0	1.0
+chr2	739884	1.0	2.0	3.0
+chr2	740018	0.0	1.0	1.0
+chr2	740019	0.0	1.0	1.0
+chr2	740400	1.0	0.0	1.0
+chr2	740512	0.0	1.0	1.0
+chr2	740520	0.0	2.0	2.0
+chr2	740693	0.0	1.0	1.0
+chr2	741031	1.0	1.0	2.0
+chr2	741056	1.0	0.0	1.0
+chr2	741072	0.0	1.0	1.0
+chr2	741265	0.0	1.0	1.0
+chr2	741296	1.0	0.0	1.0
+chr2	741316	0.0	1.0	1.0
+chr2	741317	0.0	1.0	1.0
+chr2	741319	0.0	1.0	1.0
+chr2	741322	2.0	0.0	2.0
+chr2	741327	0.0	5.0	5.0
+chr2	741328	0.0	6.0	6.0
+chr2	741329	0.0	2.0	2.0
+chr2	741330	1.0	1.0	2.0
+chr2	741331	2.0	0.0	2.0
+chr2	741332	2.0	0.0	2.0
+chr2	741334	2.0	2.0	4.0
+chr2	741335	2.0	0.0	2.0
+chr2	741337	1.0	0.0	1.0
+chr2	741349	1.0	0.0	1.0
+chr2	741351	0.0	1.0	1.0
+chr2	741353	0.0	1.0	1.0
+chr2	741399	3.0	0.0	3.0
+chr2	741425	1.0	0.0	1.0
+chr2	741437	1.0	0.0	1.0
+chr2	741462	0.0	1.0	1.0
+chr2	741478	1.0	0.0	1.0
+chr2	741482	0.0	1.0	1.0
+chr2	741491	1.0	0.0	1.0
+chr2	741501	1.0	0.0	1.0
+chr2	741503	1.0	0.0	1.0
+chr2	741631	2.0	0.0	2.0
+chr2	741868	0.0	1.0	1.0
+chr2	741904	1.0	0.0	1.0
+chr2	741910	0.0	1.0	1.0
+chr2	741913	1.0	0.0	1.0
+chr2	741930	1.0	1.0	2.0
+chr2	741932	1.0	0.0	1.0
+chr2	741937	0.0	2.0	2.0
+chr2	741946	1.0	0.0	1.0
+chr2	741968	1.0	0.0	1.0
+chr2	742226	0.0	3.0	3.0
+chr2	742363	0.0	2.0	2.0
+chr2	742375	1.0	0.0	1.0
+chr2	742381	1.0	0.0	1.0
+chr2	742383	1.0	0.0	1.0
+chr2	742385	0.0	1.0	1.0
+chr2	742392	0.0	1.0	1.0
+chr2	742417	0.0	1.0	1.0
+chr2	742497	1.0	0.0	1.0
+chr2	742505	1.0	0.0	1.0
+chr2	742508	0.0	1.0	1.0
+chr2	742510	1.0	1.0	2.0
+chr2	742535	0.0	1.0	1.0
+chr2	742537	0.0	2.0	2.0
+chr2	742568	0.0	1.0	1.0
+chr2	742569	1.0	0.0	1.0
+chr2	742767	0.0	1.0	1.0
+chr2	742794	2.0	0.0	2.0
+chr2	742810	0.0	1.0	1.0
+chr2	742815	1.0	1.0	2.0
+chr2	742816	0.0	1.0	1.0
+chr2	742818	0.0	3.0	3.0
+chr2	742822	0.0	1.0	1.0
+chr2	742823	1.0	0.0	1.0
+chr2	742828	0.0	2.0	2.0
+chr2	742829	0.0	2.0	2.0
+chr2	742830	0.0	1.0	1.0
+chr2	742831	0.0	1.0	1.0
+chr2	742835	3.0	0.0	3.0
+chr2	742837	1.0	0.0	1.0
+chr2	742840	1.0	0.0	1.0
+chr2	742965	1.0	0.0	1.0
+chr2	743019	1.0	0.0	1.0
+chr2	743056	0.0	1.0	1.0
+chr2	743130	0.0	2.0	2.0
+chr2	743145	1.0	0.0	1.0
+chr2	743193	1.0	0.0	1.0
+chr2	743256	0.0	2.0	2.0
+chr2	743324	1.0	0.0	1.0
+chr2	743455	0.0	1.0	1.0
+chr2	743575	1.0	0.0	1.0
+chr2	743605	0.0	1.0	1.0
+chr2	743852	0.0	2.0	2.0
+chr2	743860	1.0	0.0	1.0
+chr2	743880	1.0	0.0	1.0
+chr2	744023	0.0	1.0	1.0
+chr2	744036	0.0	2.0	2.0
+chr2	744043	0.0	1.0	1.0
+chr2	744071	1.0	0.0	1.0
+chr2	744074	0.0	1.0	1.0
+chr2	744078	0.0	2.0	2.0
+chr2	744174	1.0	0.0	1.0
+chr2	744190	1.0	0.0	1.0
+chr2	744198	0.0	1.0	1.0
+chr2	744201	1.0	0.0	1.0
+chr2	744202	1.0	0.0	1.0
+chr2	744208	1.0	0.0	1.0
+chr2	744218	0.0	4.0	4.0
+chr2	744226	3.0	0.0	3.0
+chr2	744241	0.0	2.0	2.0
+chr2	744249	2.0	0.0	2.0
+chr2	744292	0.0	1.0	1.0
+chr2	744296	0.0	1.0	1.0
+chr2	744333	1.0	0.0	1.0
+chr2	744349	0.0	1.0	1.0
+chr2	744351	1.0	0.0	1.0
+chr2	744356	0.0	1.0	1.0
+chr2	744362	0.0	1.0	1.0
+chr2	744364	0.0	2.0	2.0
+chr2	744369	1.0	0.0	1.0
+chr2	744370	0.0	3.0	3.0
+chr2	744372	0.0	1.0	1.0
+chr2	744373	2.0	0.0	2.0
+chr2	744374	5.0	0.0	5.0
+chr2	744375	0.0	2.0	2.0
+chr2	744376	0.0	1.0	1.0
+chr2	744377	0.0	2.0	2.0
+chr2	744379	0.0	1.0	1.0
+chr2	744382	1.0	0.0	1.0
+chr2	744384	0.0	1.0	1.0
+chr2	744386	0.0	1.0	1.0
+chr2	744389	0.0	2.0	2.0
+chr2	744392	2.0	0.0	2.0
+chr2	744393	0.0	2.0	2.0
+chr2	744396	0.0	5.0	5.0
+chr2	744398	1.0	0.0	1.0
+chr2	744400	1.0	0.0	1.0
+chr2	744406	1.0	0.0	1.0
+chr2	744408	0.0	2.0	2.0
+chr2	744420	1.0	0.0	1.0
+chr2	744567	0.0	1.0	1.0
+chr2	744576	1.0	0.0	1.0
+chr2	744590	0.0	1.0	1.0
+chr2	744600	1.0	2.0	3.0
+chr2	744604	1.0	0.0	1.0
+chr2	744606	1.0	0.0	1.0
+chr2	744608	4.0	0.0	4.0
+chr2	744609	4.0	3.0	7.0
+chr2	744610	0.0	2.0	2.0
+chr2	744613	0.0	1.0	1.0
+chr2	744616	1.0	0.0	1.0
+chr2	744617	2.0	0.0	2.0
+chr2	744623	1.0	0.0	1.0
+chr2	744624	1.0	0.0	1.0
+chr2	744626	0.0	5.0	5.0
+chr2	744627	0.0	1.0	1.0
+chr2	744631	2.0	0.0	2.0
+chr2	744641	0.0	1.0	1.0
+chr2	744642	0.0	1.0	1.0
+chr2	744650	1.0	0.0	1.0
+chr2	744654	0.0	1.0	1.0
+chr2	744838	0.0	1.0	1.0
+chr2	744855	1.0	0.0	1.0
+chr2	744864	3.0	0.0	3.0
+chr2	744869	1.0	1.0	2.0
+chr2	744870	1.0	0.0	1.0
+chr2	744873	1.0	0.0	1.0
+chr2	744874	0.0	4.0	4.0
+chr2	744875	0.0	1.0	1.0
+chr2	744879	1.0	0.0	1.0
+chr2	744880	0.0	1.0	1.0
+chr2	744881	2.0	0.0	2.0
+chr2	744882	0.0	1.0	1.0
+chr2	744883	0.0	1.0	1.0
+chr2	744886	2.0	0.0	2.0
+chr2	744893	1.0	0.0	1.0
+chr2	744914	1.0	0.0	1.0
+chr2	744920	1.0	0.0	1.0
+chr2	744988	1.0	0.0	1.0
+chr2	745016	0.0	2.0	2.0
+chr2	745018	0.0	1.0	1.0
+chr2	745029	0.0	1.0	1.0
+chr2	745037	1.0	0.0	1.0
+chr2	745045	0.0	1.0	1.0
+chr2	745048	1.0	0.0	1.0
+chr2	745050	0.0	1.0	1.0
+chr2	745181	0.0	1.0	1.0
+chr2	745372	1.0	0.0	1.0
+chr2	745701	0.0	1.0	1.0
+chr2	745838	1.0	0.0	1.0
+chr2	746320	1.0	0.0	1.0
+chr2	746563	0.0	1.0	1.0
+chr2	746910	0.0	1.0	1.0
+chr2	746931	1.0	0.0	1.0
+chr2	747116	1.0	0.0	1.0
+chr2	747266	0.0	1.0	1.0
+chr2	747269	1.0	0.0	1.0
+chr2	747393	1.0	0.0	1.0
+chr2	747413	3.0	0.0	3.0
+chr2	747423	0.0	1.0	1.0
+chr2	747466	1.0	0.0	1.0
+chr2	747581	0.0	1.0	1.0
+chr2	747590	1.0	0.0	1.0
+chr2	747593	0.0	1.0	1.0
+chr2	747600	0.0	2.0	2.0
+chr2	747607	1.0	0.0	1.0
+chr2	747738	0.0	1.0	1.0
+chr2	747739	1.0	0.0	1.0
+chr2	747746	1.0	0.0	1.0
+chr2	747747	0.0	2.0	2.0
+chr2	747750	1.0	0.0	1.0
+chr2	747757	0.0	3.0	3.0
+chr2	747759	0.0	1.0	1.0
+chr2	747760	1.0	0.0	1.0
+chr2	747764	0.0	2.0	2.0
+chr2	747775	1.0	0.0	1.0
+chr2	747776	0.0	1.0	1.0
+chr2	747777	1.0	0.0	1.0
+chr2	747778	0.0	1.0	1.0
+chr2	747779	1.0	0.0	1.0
+chr2	747785	0.0	1.0	1.0
+chr2	747789	1.0	0.0	1.0
+chr2	747791	0.0	1.0	1.0
+chr2	747793	0.0	2.0	2.0
+chr2	748150	0.0	2.0	2.0
+chr2	748151	0.0	1.0	1.0
+chr2	748162	0.0	1.0	1.0
+chr2	748313	0.0	1.0	1.0
+chr2	748401	0.0	1.0	1.0
+chr2	748470	0.0	2.0	2.0
+chr2	748511	1.0	0.0	1.0
+chr2	748986	0.0	2.0	2.0
+chr2	748993	0.0	2.0	2.0
+chr2	749004	1.0	0.0	1.0
+chr2	749012	0.0	1.0	1.0
+chr2	749022	2.0	0.0	2.0
+chr2	749027	1.0	0.0	1.0
+chr2	749150	1.0	0.0	1.0
+chr2	749162	0.0	1.0	1.0
+chr2	749171	0.0	3.0	3.0
+chr2	749173	0.0	2.0	2.0
+chr2	749191	0.0	1.0	1.0
+chr2	749281	0.0	1.0	1.0
+chr2	749311	1.0	0.0	1.0
+chr2	749321	1.0	0.0	1.0
+chr2	749322	2.0	0.0	2.0
+chr2	749323	0.0	1.0	1.0
+chr2	749325	1.0	0.0	1.0
+chr2	749327	0.0	1.0	1.0
+chr2	749328	0.0	2.0	2.0
+chr2	749330	2.0	1.0	3.0
+chr2	749331	2.0	0.0	2.0
+chr2	749332	0.0	1.0	1.0
+chr2	749333	3.0	0.0	3.0
+chr2	749334	0.0	5.0	5.0
+chr2	749335	0.0	2.0	2.0
+chr2	749337	2.0	0.0	2.0
+chr2	749338	0.0	1.0	1.0
+chr2	749341	0.0	6.0	6.0
+chr2	749345	1.0	1.0	2.0
+chr2	749349	0.0	5.0	5.0
+chr2	749353	1.0	0.0	1.0
+chr2	749361	1.0	0.0	1.0
+chr2	749365	0.0	1.0	1.0
+chr2	749378	0.0	1.0	1.0
+chr2	749379	0.0	1.0	1.0
+chr2	749385	1.0	0.0	1.0
+chr2	749401	1.0	1.0	2.0
+chr2	749402	0.0	1.0	1.0
+chr2	749405	1.0	0.0	1.0
+chr2	749553	1.0	0.0	1.0
+chr2	749569	0.0	1.0	1.0
+chr2	749575	0.0	1.0	1.0
+chr2	749578	1.0	0.0	1.0
+chr2	749581	1.0	0.0	1.0
+chr2	749582	2.0	0.0	2.0
+chr2	749585	9.0	0.0	9.0
+chr2	749586	3.0	0.0	3.0
+chr2	749590	0.0	3.0	3.0
+chr2	749596	2.0	0.0	2.0
+chr2	749597	1.0	0.0	1.0
+chr2	749598	2.0	0.0	2.0
+chr2	749600	0.0	2.0	2.0
+chr2	749601	0.0	3.0	3.0
+chr2	749602	0.0	1.0	1.0
+chr2	749603	0.0	1.0	1.0
+chr2	749604	1.0	0.0	1.0
+chr2	749618	2.0	0.0	2.0
+chr2	749626	1.0	0.0	1.0
+chr2	749744	0.0	1.0	1.0
+chr2	749761	1.0	0.0	1.0
+chr2	749764	0.0	1.0	1.0
+chr2	749781	0.0	1.0	1.0
+chr2	749960	0.0	1.0	1.0
+chr2	750115	1.0	0.0	1.0
+chr2	750121	0.0	1.0	1.0
+chr2	750125	1.0	0.0	1.0
+chr2	750162	1.0	0.0	1.0
+chr2	750183	1.0	0.0	1.0
+chr2	750389	2.0	0.0	2.0
+chr2	750418	0.0	1.0	1.0
+chr2	750429	0.0	1.0	1.0
+chr2	750435	0.0	1.0	1.0
+chr2	750437	0.0	1.0	1.0
+chr2	750478	0.0	1.0	1.0
+chr2	750569	1.0	0.0	1.0
+chr2	750570	1.0	0.0	1.0
+chr2	750639	0.0	1.0	1.0
+chr2	751076	0.0	1.0	1.0
+chr2	751088	1.0	0.0	1.0
+chr2	751164	0.0	1.0	1.0
+chr2	751560	0.0	1.0	1.0
+chr2	751570	1.0	0.0	1.0
+chr2	751775	1.0	0.0	1.0
+chr2	752839	1.0	0.0	1.0
+chr2	752843	1.0	0.0	1.0
+chr2	753013	1.0	0.0	1.0
+chr2	753130	1.0	0.0	1.0
+chr2	753245	0.0	1.0	1.0
+chr2	753250	0.0	1.0	1.0
+chr2	753736	0.0	1.0	1.0
+chr2	754173	1.0	0.0	1.0
+chr2	754448	0.0	1.0	1.0
+chr2	754762	0.0	1.0	1.0
+chr2	754947	0.0	1.0	1.0
+chr2	755799	1.0	0.0	1.0
+chr2	756034	1.0	0.0	1.0
+chr2	756448	1.0	0.0	1.0
+chr2	756461	1.0	0.0	1.0
+chr2	756479	0.0	1.0	1.0
+chr2	756686	0.0	1.0	1.0
+chr2	756795	1.0	0.0	1.0
+chr2	756807	0.0	1.0	1.0
+chr2	756853	1.0	0.0	1.0
+chr2	756869	1.0	0.0	1.0
+chr2	756986	2.0	0.0	2.0
+chr2	756990	0.0	1.0	1.0
+chr2	757007	0.0	1.0	1.0
+chr2	757022	1.0	0.0	1.0
+chr2	757142	1.0	0.0	1.0
+chr2	757143	1.0	0.0	1.0
+chr2	757146	1.0	0.0	1.0
+chr2	757155	1.0	0.0	1.0
+chr2	757156	1.0	0.0	1.0
+chr2	757161	0.0	1.0	1.0
+chr2	757162	0.0	1.0	1.0
+chr2	757163	0.0	2.0	2.0
+chr2	757164	1.0	0.0	1.0
+chr2	757165	1.0	0.0	1.0
+chr2	757170	0.0	1.0	1.0
+chr2	757175	1.0	0.0	1.0
+chr2	757184	0.0	2.0	2.0
+chr2	757205	1.0	0.0	1.0
+chr2	757254	0.0	1.0	1.0
+chr2	757407	0.0	1.0	1.0
+chr2	757411	0.0	1.0	1.0
+chr2	757421	0.0	3.0	3.0
+chr2	757430	1.0	0.0	1.0
+chr2	757771	0.0	1.0	1.0
+chr2	757792	1.0	0.0	1.0
+chr2	757799	2.0	0.0	2.0
+chr2	757805	1.0	0.0	1.0
+chr2	757815	1.0	0.0	1.0
+chr2	757834	2.0	0.0	2.0
+chr2	758086	0.0	1.0	1.0
+chr2	759075	0.0	1.0	1.0
+chr2	759170	0.0	1.0	1.0
+chr2	759549	0.0	1.0	1.0
+chr2	759937	0.0	1.0	1.0
+chr2	760005	1.0	0.0	1.0
+chr2	760037	0.0	1.0	1.0
+chr2	760042	1.0	0.0	1.0
+chr2	760060	0.0	2.0	2.0
+chr2	760066	0.0	1.0	1.0
+chr2	760068	0.0	1.0	1.0
+chr2	760069	1.0	0.0	1.0
+chr2	760072	1.0	0.0	1.0
+chr2	760075	1.0	0.0	1.0
+chr2	760078	1.0	0.0	1.0
+chr2	760081	0.0	2.0	2.0
+chr2	760083	1.0	0.0	1.0
+chr2	760091	0.0	2.0	2.0
+chr2	760092	1.0	0.0	1.0
+chr2	760233	1.0	0.0	1.0
+chr2	760250	0.0	1.0	1.0
+chr2	760306	1.0	1.0	2.0
+chr2	760309	1.0	1.0	2.0
+chr2	760310	0.0	3.0	3.0
+chr2	760317	0.0	1.0	1.0
+chr2	760318	1.0	0.0	1.0
+chr2	760331	1.0	0.0	1.0
+chr2	760334	0.0	1.0	1.0
+chr2	760344	0.0	1.0	1.0
+chr2	760345	0.0	1.0	1.0
+chr2	760466	0.0	1.0	1.0
+chr2	760468	1.0	0.0	1.0
+chr2	760472	0.0	1.0	1.0
+chr2	760481	1.0	0.0	1.0
+chr2	760488	0.0	2.0	2.0
+chr2	760506	1.0	0.0	1.0
+chr2	760515	0.0	1.0	1.0
+chr2	760518	1.0	0.0	1.0
+chr2	760519	1.0	0.0	1.0
+chr2	760553	0.0	2.0	2.0
+chr2	760591	1.0	0.0	1.0
+chr2	760637	1.0	0.0	1.0
+chr2	760667	1.0	0.0	1.0
+chr2	760674	1.0	0.0	1.0
+chr2	760681	1.0	0.0	1.0
+chr2	760682	2.0	0.0	2.0
+chr2	760689	0.0	3.0	3.0
+chr2	760720	0.0	1.0	1.0
+chr2	760790	1.0	0.0	1.0
+chr2	760818	0.0	1.0	1.0
+chr2	760820	0.0	1.0	1.0
+chr2	760828	1.0	0.0	1.0
+chr2	760830	1.0	0.0	1.0
+chr2	760832	1.0	1.0	2.0
+chr2	760833	2.0	0.0	2.0
+chr2	760835	0.0	1.0	1.0
+chr2	760839	0.0	1.0	1.0
+chr2	760841	3.0	4.0	7.0
+chr2	760842	2.0	1.0	3.0
+chr2	760843	0.0	3.0	3.0
+chr2	760844	1.0	0.0	1.0
+chr2	760845	0.0	4.0	4.0
+chr2	760848	1.0	0.0	1.0
+chr2	760849	2.0	0.0	2.0
+chr2	760850	1.0	0.0	1.0
+chr2	760852	0.0	2.0	2.0
+chr2	760874	0.0	1.0	1.0
+chr2	760889	0.0	1.0	1.0
+chr2	760895	1.0	0.0	1.0
+chr2	760900	0.0	1.0	1.0
+chr2	761241	0.0	1.0	1.0
+chr2	761250	1.0	0.0	1.0
+chr2	761268	1.0	0.0	1.0
+chr2	761269	6.0	0.0	6.0
+chr2	761271	0.0	1.0	1.0
+chr2	761273	0.0	1.0	1.0
+chr2	761280	0.0	2.0	2.0
+chr2	761282	1.0	0.0	1.0
+chr2	761283	1.0	0.0	1.0
+chr2	761285	0.0	3.0	3.0
+chr2	761288	2.0	0.0	2.0
+chr2	761290	0.0	4.0	4.0
+chr2	761292	2.0	0.0	2.0
+chr2	761293	1.0	0.0	1.0
+chr2	761336	0.0	1.0	1.0
+chr2	761345	1.0	0.0	1.0
+chr2	761408	0.0	1.0	1.0
+chr2	761417	1.0	1.0	2.0
+chr2	761421	1.0	0.0	1.0
+chr2	761426	4.0	0.0	4.0
+chr2	761427	0.0	1.0	1.0
+chr2	761435	0.0	1.0	1.0
+chr2	761436	0.0	1.0	1.0
+chr2	761581	1.0	0.0	1.0
+chr2	761596	1.0	0.0	1.0
+chr2	761603	0.0	1.0	1.0
+chr2	761800	0.0	1.0	1.0
+chr2	761936	1.0	0.0	1.0
+chr2	762460	1.0	0.0	1.0
+chr2	762863	0.0	1.0	1.0
+chr2	762866	1.0	0.0	1.0
+chr2	762902	1.0	0.0	1.0
+chr2	762949	0.0	1.0	1.0
+chr2	763215	1.0	0.0	1.0
+chr2	763519	1.0	0.0	1.0
+chr2	763530	0.0	1.0	1.0
+chr2	763686	0.0	1.0	1.0
+chr2	763735	1.0	0.0	1.0
+chr2	763767	0.0	1.0	1.0
+chr2	763787	0.0	2.0	2.0
+chr2	763805	1.0	1.0	2.0
+chr2	763846	1.0	0.0	1.0
+chr2	763865	1.0	0.0	1.0
+chr2	763908	1.0	0.0	1.0
+chr2	763916	1.0	0.0	1.0
+chr2	763927	1.0	0.0	1.0
+chr2	763935	0.0	2.0	2.0
+chr2	763936	1.0	0.0	1.0
+chr2	763947	1.0	0.0	1.0
+chr2	763948	1.0	0.0	1.0
+chr2	764028	1.0	0.0	1.0
+chr2	764029	1.0	0.0	1.0
+chr2	764033	1.0	0.0	1.0
+chr2	764138	0.0	1.0	1.0
+chr2	764155	0.0	1.0	1.0
+chr2	764167	1.0	0.0	1.0
+chr2	764177	1.0	0.0	1.0
+chr2	764197	1.0	0.0	1.0
+chr2	764208	0.0	1.0	1.0
+chr2	764210	0.0	2.0	2.0
+chr2	764235	1.0	0.0	1.0
+chr2	764316	0.0	1.0	1.0
+chr2	764334	1.0	0.0	1.0
+chr2	764336	1.0	0.0	1.0
+chr2	764337	2.0	0.0	2.0
+chr2	764343	0.0	2.0	2.0
+chr2	764353	0.0	1.0	1.0
+chr2	764357	3.0	0.0	3.0
+chr2	764376	0.0	1.0	1.0
+chr2	764379	0.0	1.0	1.0
+chr2	764382	3.0	0.0	3.0
+chr2	764389	0.0	1.0	1.0
+chr2	764397	1.0	0.0	1.0
+chr2	764432	1.0	0.0	1.0
+chr2	764448	1.0	0.0	1.0
+chr2	764477	0.0	1.0	1.0
+chr2	764492	0.0	1.0	1.0
+chr2	764520	0.0	1.0	1.0
+chr2	764523	0.0	1.0	1.0
+chr2	764567	1.0	0.0	1.0
+chr2	764649	0.0	1.0	1.0
+chr2	764678	1.0	0.0	1.0
+chr2	764691	2.0	0.0	2.0
+chr2	764692	1.0	0.0	1.0
+chr2	764696	2.0	8.0	10.0
+chr2	764697	0.0	1.0	1.0
+chr2	764701	2.0	0.0	2.0
+chr2	764707	0.0	1.0	1.0
+chr2	764709	0.0	1.0	1.0
+chr2	764710	0.0	1.0	1.0
+chr2	765110	2.0	0.0	2.0
+chr2	765114	0.0	1.0	1.0
+chr2	765279	0.0	1.0	1.0
+chr2	765284	1.0	0.0	1.0
+chr2	765375	1.0	0.0	1.0
+chr2	765427	1.0	0.0	1.0
+chr2	765627	0.0	2.0	2.0
+chr2	766690	0.0	2.0	2.0
+chr2	766754	1.0	0.0	1.0
+chr2	767233	0.0	1.0	1.0
+chr2	767269	0.0	1.0	1.0
+chr2	767300	4.0	0.0	4.0
+chr2	767302	1.0	0.0	1.0
+chr2	767397	0.0	1.0	1.0
+chr2	767429	0.0	1.0	1.0
+chr2	767431	1.0	0.0	1.0
+chr2	767432	1.0	0.0	1.0
+chr2	767449	0.0	1.0	1.0
+chr2	767456	0.0	1.0	1.0
+chr2	767457	1.0	0.0	1.0
+chr2	767458	1.0	0.0	1.0
+chr2	767527	1.0	0.0	1.0
+chr2	767562	1.0	0.0	1.0
+chr2	767569	1.0	1.0	2.0
+chr2	767571	0.0	1.0	1.0
+chr2	767573	0.0	1.0	1.0
+chr2	767576	2.0	0.0	2.0
+chr2	767586	2.0	0.0	2.0
+chr2	767591	0.0	2.0	2.0
+chr2	767592	1.0	1.0	2.0
+chr2	767593	0.0	1.0	1.0
+chr2	767598	0.0	1.0	1.0
+chr2	767601	0.0	3.0	3.0
+chr2	767606	0.0	3.0	3.0
+chr2	767616	1.0	0.0	1.0
+chr2	767617	0.0	1.0	1.0
+chr2	767624	2.0	0.0	2.0
+chr2	767627	0.0	2.0	2.0
+chr2	767820	2.0	0.0	2.0
+chr2	767822	1.0	0.0	1.0
+chr2	767889	0.0	1.0	1.0
+chr2	767972	1.0	0.0	1.0
+chr2	767985	0.0	1.0	1.0
+chr2	768226	1.0	1.0	2.0
+chr2	768232	0.0	1.0	1.0
+chr2	768235	1.0	0.0	1.0
+chr2	768236	3.0	0.0	3.0
+chr2	768237	9.0	1.0	10.0
+chr2	768239	1.0	0.0	1.0
+chr2	768240	1.0	0.0	1.0
+chr2	768241	1.0	0.0	1.0
+chr2	768245	0.0	8.0	8.0
+chr2	768246	0.0	1.0	1.0
+chr2	768247	1.0	2.0	3.0
+chr2	768248	1.0	1.0	2.0
+chr2	768249	0.0	1.0	1.0
+chr2	768253	1.0	0.0	1.0
+chr2	768259	0.0	4.0	4.0
+chr2	768260	0.0	2.0	2.0
+chr2	768261	2.0	0.0	2.0
+chr2	768262	1.0	0.0	1.0
+chr2	768399	1.0	0.0	1.0
+chr2	768400	1.0	2.0	3.0
+chr2	768401	2.0	0.0	2.0
+chr2	768404	0.0	1.0	1.0
+chr2	768429	0.0	1.0	1.0
+chr2	768438	1.0	0.0	1.0
+chr2	768439	0.0	1.0	1.0
+chr2	768462	0.0	1.0	1.0
+chr2	768468	1.0	0.0	1.0
+chr2	768599	0.0	2.0	2.0
+chr2	768601	0.0	1.0	1.0
+chr2	768606	0.0	1.0	1.0
+chr2	768614	1.0	0.0	1.0
+chr2	769018	1.0	0.0	1.0
+chr2	769040	1.0	0.0	1.0
+chr2	769358	1.0	0.0	1.0
+chr2	770117	0.0	1.0	1.0
+chr2	770196	0.0	1.0	1.0
+chr2	770205	0.0	1.0	1.0
+chr2	770561	0.0	1.0	1.0
+chr2	770566	1.0	0.0	1.0
+chr2	770578	0.0	1.0	1.0
+chr2	770864	0.0	2.0	2.0
+chr2	770874	0.0	1.0	1.0
+chr2	770875	2.0	0.0	2.0
+chr2	770878	0.0	1.0	1.0
+chr2	770884	0.0	1.0	1.0
+chr2	770887	0.0	2.0	2.0
+chr2	770888	2.0	0.0	2.0
+chr2	770890	0.0	3.0	3.0
+chr2	770892	1.0	1.0	2.0
+chr2	770894	3.0	0.0	3.0
+chr2	770899	1.0	0.0	1.0
+chr2	770900	1.0	0.0	1.0
+chr2	770903	0.0	1.0	1.0
+chr2	770908	0.0	1.0	1.0
+chr2	770909	0.0	2.0	2.0
+chr2	770910	1.0	0.0	1.0
+chr2	770913	0.0	2.0	2.0
+chr2	770916	1.0	0.0	1.0
+chr2	770917	1.0	0.0	1.0
+chr2	770918	1.0	0.0	1.0
+chr2	770920	0.0	2.0	2.0
+chr2	770928	0.0	1.0	1.0
+chr2	770938	1.0	0.0	1.0
+chr2	771049	0.0	1.0	1.0
+chr2	771061	1.0	0.0	1.0
+chr2	771074	0.0	1.0	1.0
+chr2	771206	0.0	3.0	3.0
+chr2	771207	3.0	0.0	3.0
+chr2	771208	0.0	1.0	1.0
+chr2	771213	0.0	1.0	1.0
+chr2	771220	1.0	0.0	1.0
+chr2	771221	0.0	1.0	1.0
+chr2	771231	3.0	0.0	3.0
+chr2	771239	1.0	0.0	1.0
+chr2	771242	2.0	0.0	2.0
+chr2	771243	0.0	1.0	1.0
+chr2	771375	0.0	1.0	1.0
+chr2	771388	1.0	1.0	2.0
+chr2	771394	0.0	1.0	1.0
+chr2	771400	1.0	0.0	1.0
+chr2	771414	1.0	0.0	1.0
+chr2	771448	1.0	0.0	1.0
+chr2	771557	1.0	0.0	1.0
+chr2	771562	0.0	2.0	2.0
+chr2	771569	2.0	0.0	2.0
+chr2	771570	0.0	1.0	1.0
+chr2	771590	0.0	1.0	1.0
+chr2	771654	1.0	0.0	1.0
+chr2	771736	0.0	1.0	1.0
+chr2	771761	0.0	1.0	1.0
+chr2	771824	0.0	1.0	1.0
+chr2	771880	0.0	1.0	1.0
+chr2	771930	1.0	0.0	1.0
+chr2	772004	1.0	0.0	1.0
+chr2	772012	1.0	0.0	1.0
+chr2	772021	1.0	0.0	1.0
+chr2	772064	0.0	1.0	1.0
+chr2	772072	0.0	1.0	1.0
+chr2	772086	1.0	0.0	1.0
+chr2	772088	0.0	1.0	1.0
+chr2	772091	2.0	0.0	2.0
+chr2	772100	0.0	1.0	1.0
+chr2	772107	2.0	0.0	2.0
+chr2	772115	0.0	2.0	2.0
+chr2	772134	0.0	1.0	1.0
+chr2	772177	0.0	1.0	1.0
+chr2	772210	0.0	2.0	2.0
+chr2	772242	0.0	1.0	1.0
+chr2	772245	0.0	2.0	2.0
+chr2	772281	1.0	0.0	1.0
+chr2	772299	1.0	0.0	1.0
+chr2	772328	0.0	2.0	2.0
+chr2	772345	0.0	1.0	1.0
+chr2	772363	0.0	1.0	1.0
+chr2	772365	0.0	1.0	1.0
+chr2	772372	0.0	1.0	1.0
+chr2	772374	0.0	1.0	1.0
+chr2	772386	1.0	0.0	1.0
+chr2	772407	1.0	1.0	2.0
+chr2	772513	1.0	0.0	1.0
+chr2	772528	1.0	0.0	1.0
+chr2	772561	0.0	1.0	1.0
+chr2	772637	0.0	3.0	3.0
+chr2	772701	1.0	0.0	1.0
+chr2	772706	0.0	1.0	1.0
+chr2	772710	0.0	1.0	1.0
+chr2	772883	0.0	2.0	2.0
+chr2	772887	1.0	0.0	1.0
+chr2	772889	0.0	1.0	1.0
+chr2	772892	0.0	1.0	1.0
+chr2	772898	0.0	1.0	1.0
+chr2	772910	0.0	1.0	1.0
+chr2	773031	1.0	0.0	1.0
+chr2	773042	2.0	0.0	2.0
+chr2	773047	2.0	0.0	2.0
+chr2	773074	0.0	1.0	1.0
+chr2	773202	1.0	0.0	1.0
+chr2	773213	1.0	0.0	1.0
+chr2	773526	1.0	0.0	1.0
+chr2	773529	1.0	0.0	1.0
+chr2	773543	2.0	0.0	2.0
+chr2	773544	0.0	2.0	2.0
+chr2	773562	1.0	0.0	1.0
+chr2	773578	1.0	0.0	1.0
+chr2	773582	1.0	0.0	1.0
+chr2	773583	0.0	1.0	1.0
+chr2	773584	0.0	2.0	2.0
+chr2	773595	0.0	1.0	1.0
+chr2	773619	0.0	1.0	1.0
+chr2	773678	0.0	1.0	1.0
+chr2	773952	0.0	1.0	1.0
+chr2	774047	0.0	1.0	1.0
+chr2	774064	0.0	1.0	1.0
+chr2	774123	0.0	1.0	1.0
+chr2	774137	0.0	1.0	1.0
+chr2	774146	0.0	1.0	1.0
+chr2	774242	1.0	0.0	1.0
+chr2	774251	1.0	0.0	1.0
+chr2	774277	1.0	0.0	1.0
+chr2	774294	0.0	3.0	3.0
+chr2	774295	1.0	0.0	1.0
+chr2	774299	1.0	0.0	1.0
+chr2	774308	1.0	0.0	1.0
+chr2	774321	0.0	1.0	1.0
+chr2	774327	1.0	0.0	1.0
+chr2	774464	0.0	1.0	1.0
+chr2	774719	1.0	0.0	1.0
+chr2	774721	0.0	1.0	1.0
+chr2	774723	0.0	1.0	1.0
+chr2	774725	1.0	0.0	1.0
+chr2	774732	1.0	0.0	1.0
+chr2	774740	0.0	5.0	5.0
+chr2	774743	0.0	1.0	1.0
+chr2	774754	1.0	0.0	1.0
+chr2	774781	1.0	0.0	1.0
+chr2	774835	0.0	1.0	1.0
+chr2	774840	0.0	1.0	1.0
+chr2	774952	1.0	0.0	1.0
+chr2	775224	1.0	0.0	1.0
+chr2	775465	1.0	0.0	1.0
+chr2	775692	1.0	0.0	1.0
+chr2	775799	1.0	0.0	1.0
+chr2	776085	1.0	0.0	1.0
+chr2	776124	1.0	0.0	1.0
+chr2	776229	1.0	0.0	1.0
+chr2	776247	2.0	0.0	2.0
+chr2	776256	1.0	0.0	1.0
+chr2	776258	0.0	1.0	1.0
+chr2	776527	0.0	1.0	1.0
+chr2	776546	0.0	1.0	1.0
+chr2	776558	2.0	0.0	2.0
+chr2	776562	0.0	1.0	1.0
+chr2	776565	1.0	0.0	1.0
+chr2	776566	1.0	0.0	1.0
+chr2	776719	0.0	2.0	2.0
+chr2	776720	0.0	1.0	1.0
+chr2	776897	0.0	1.0	1.0
+chr2	777050	0.0	1.0	1.0
+chr2	777092	1.0	0.0	1.0
+chr2	777114	0.0	1.0	1.0
+chr2	777226	1.0	0.0	1.0
+chr2	777362	1.0	0.0	1.0
+chr2	777590	0.0	2.0	2.0
+chr2	777626	0.0	1.0	1.0
+chr2	778940	0.0	1.0	1.0
+chr2	778949	0.0	1.0	1.0
+chr2	779131	1.0	0.0	1.0
+chr2	779273	1.0	0.0	1.0
+chr2	779287	1.0	0.0	1.0
+chr2	779304	1.0	1.0	2.0
+chr2	779363	1.0	0.0	1.0
+chr2	779416	1.0	0.0	1.0
+chr2	779424	0.0	1.0	1.0
+chr2	779430	6.0	0.0	6.0
+chr2	779431	2.0	0.0	2.0
+chr2	779437	0.0	1.0	1.0
+chr2	779438	0.0	1.0	1.0
+chr2	779440	0.0	2.0	2.0
+chr2	779441	0.0	1.0	1.0
+chr2	779444	4.0	0.0	4.0
+chr2	779448	0.0	8.0	8.0
+chr2	779451	1.0	3.0	4.0
+chr2	779454	3.0	0.0	3.0
+chr2	779465	0.0	1.0	1.0
+chr2	779482	0.0	1.0	1.0
+chr2	779682	0.0	2.0	2.0
+chr2	779691	0.0	1.0	1.0
+chr2	779698	0.0	2.0	2.0
+chr2	779699	2.0	2.0	4.0
+chr2	779700	1.0	0.0	1.0
+chr2	779702	1.0	0.0	1.0
+chr2	779709	3.0	0.0	3.0
+chr2	779710	0.0	1.0	1.0
+chr2	779711	1.0	0.0	1.0
+chr2	779712	0.0	2.0	2.0
+chr2	779714	2.0	0.0	2.0
+chr2	779715	0.0	2.0	2.0
+chr2	779717	0.0	2.0	2.0
+chr2	779721	1.0	0.0	1.0
+chr2	779726	0.0	1.0	1.0
+chr2	779731	0.0	2.0	2.0
+chr2	779775	1.0	0.0	1.0
+chr2	779855	1.0	0.0	1.0
+chr2	779857	0.0	1.0	1.0
+chr2	779861	1.0	0.0	1.0
+chr2	779863	0.0	1.0	1.0
+chr2	779869	1.0	0.0	1.0
+chr2	779878	0.0	1.0	1.0
+chr2	780013	0.0	1.0	1.0
+chr2	780190	1.0	0.0	1.0
+chr2	780218	1.0	0.0	1.0
+chr2	780230	1.0	0.0	1.0
+chr2	780707	1.0	0.0	1.0
+chr2	780969	0.0	1.0	1.0
+chr2	781332	0.0	1.0	1.0
+chr2	781448	0.0	2.0	2.0
+chr2	781779	1.0	0.0	1.0
+chr2	782305	0.0	1.0	1.0
+chr2	782344	0.0	2.0	2.0
+chr2	782594	0.0	1.0	1.0
+chr2	782604	1.0	0.0	1.0
+chr2	782605	2.0	0.0	2.0
+chr2	782609	0.0	1.0	1.0
+chr2	782610	1.0	0.0	1.0
+chr2	782613	1.0	0.0	1.0
+chr2	782614	3.0	0.0	3.0
+chr2	782616	0.0	2.0	2.0
+chr2	782618	0.0	2.0	2.0
+chr2	782619	2.0	0.0	2.0
+chr2	782620	0.0	2.0	2.0
+chr2	782624	1.0	0.0	1.0
+chr2	782627	6.0	0.0	6.0
+chr2	782628	3.0	0.0	3.0
+chr2	782629	0.0	9.0	9.0
+chr2	782632	0.0	1.0	1.0
+chr2	782635	1.0	0.0	1.0
+chr2	782636	1.0	0.0	1.0
+chr2	782637	0.0	1.0	1.0
+chr2	782638	0.0	1.0	1.0
+chr2	782639	0.0	1.0	1.0
+chr2	782640	1.0	0.0	1.0
+chr2	782644	0.0	1.0	1.0
+chr2	782645	1.0	2.0	3.0
+chr2	782753	0.0	1.0	1.0
+chr2	782779	1.0	0.0	1.0
+chr2	782780	0.0	1.0	1.0
+chr2	782794	1.0	0.0	1.0
+chr2	782795	1.0	0.0	1.0
+chr2	782931	1.0	0.0	1.0
+chr2	782945	1.0	0.0	1.0
+chr2	783215	1.0	0.0	1.0
+chr2	783724	1.0	0.0	1.0
+chr2	783760	1.0	0.0	1.0
+chr2	783772	0.0	1.0	1.0
+chr2	783880	1.0	0.0	1.0
+chr2	783883	1.0	0.0	1.0
+chr2	783897	0.0	1.0	1.0
+chr2	784053	1.0	0.0	1.0
+chr2	784062	1.0	0.0	1.0
+chr2	784069	0.0	1.0	1.0
+chr2	784074	1.0	0.0	1.0
+chr2	784148	1.0	0.0	1.0
+chr2	784169	0.0	1.0	1.0
+chr2	784171	1.0	0.0	1.0
+chr2	784189	0.0	1.0	1.0
+chr2	784196	1.0	0.0	1.0
+chr2	784215	0.0	1.0	1.0
+chr2	784387	1.0	0.0	1.0
+chr2	784408	0.0	1.0	1.0
+chr2	784414	1.0	0.0	1.0
+chr2	784434	0.0	3.0	3.0
+chr2	784442	0.0	1.0	1.0
+chr2	784456	1.0	0.0	1.0
+chr2	784472	1.0	0.0	1.0
+chr2	784478	1.0	0.0	1.0
+chr2	784481	1.0	0.0	1.0
+chr2	784484	0.0	3.0	3.0
+chr2	784558	3.0	0.0	3.0
+chr2	784561	0.0	1.0	1.0
+chr2	784562	0.0	1.0	1.0
+chr2	784579	0.0	1.0	1.0
+chr2	784580	2.0	0.0	2.0
+chr2	784592	0.0	1.0	1.0
+chr2	784608	0.0	3.0	3.0
+chr2	784838	1.0	0.0	1.0
+chr2	784841	1.0	0.0	1.0
+chr2	784857	0.0	1.0	1.0
+chr2	784869	0.0	1.0	1.0
+chr2	784875	1.0	0.0	1.0
+chr2	784902	2.0	0.0	2.0
+chr2	784951	1.0	0.0	1.0
+chr2	785055	0.0	1.0	1.0
+chr2	785071	1.0	1.0	2.0
+chr2	785073	1.0	0.0	1.0
+chr2	785074	1.0	0.0	1.0
+chr2	785075	0.0	2.0	2.0
+chr2	785085	0.0	1.0	1.0
+chr2	785086	1.0	0.0	1.0
+chr2	785088	0.0	1.0	1.0
+chr2	785095	1.0	0.0	1.0
+chr2	785097	0.0	2.0	2.0
+chr2	785098	0.0	1.0	1.0
+chr2	785222	1.0	0.0	1.0
+chr2	785229	0.0	1.0	1.0
+chr2	785236	1.0	0.0	1.0
+chr2	785251	0.0	1.0	1.0
+chr2	785266	0.0	1.0	1.0
+chr2	785269	1.0	0.0	1.0
+chr2	785417	1.0	0.0	1.0
+chr2	785422	0.0	1.0	1.0
+chr2	785432	1.0	0.0	1.0
+chr2	785445	0.0	1.0	1.0
+chr2	785462	1.0	0.0	1.0
+chr2	785465	0.0	1.0	1.0
+chr2	785468	1.0	2.0	3.0
+chr2	785587	1.0	0.0	1.0
+chr2	785617	0.0	1.0	1.0
+chr2	785626	0.0	1.0	1.0
+chr2	785781	1.0	0.0	1.0
+chr2	785784	0.0	1.0	1.0
+chr2	785799	0.0	1.0	1.0
+chr2	785822	0.0	1.0	1.0
+chr2	785827	2.0	0.0	2.0
+chr2	785920	0.0	1.0	1.0
+chr2	785956	1.0	0.0	1.0
+chr2	785987	1.0	0.0	1.0
+chr2	785997	0.0	2.0	2.0
+chr2	786010	0.0	2.0	2.0
+chr2	786014	0.0	1.0	1.0
+chr2	786020	0.0	1.0	1.0
+chr2	786033	1.0	0.0	1.0
+chr2	786087	1.0	0.0	1.0
+chr2	786102	0.0	1.0	1.0
+chr2	786111	0.0	1.0	1.0
+chr2	786125	1.0	0.0	1.0
+chr2	786164	0.0	1.0	1.0
+chr2	786314	1.0	0.0	1.0
+chr2	786349	0.0	1.0	1.0
+chr2	786352	1.0	0.0	1.0
+chr2	786374	0.0	1.0	1.0
+chr2	786439	0.0	1.0	1.0
+chr2	786454	0.0	1.0	1.0
+chr2	786457	0.0	1.0	1.0
+chr2	786468	2.0	0.0	2.0
+chr2	786477	0.0	3.0	3.0
+chr2	786479	2.0	0.0	2.0
+chr2	786610	0.0	1.0	1.0
+chr2	786654	0.0	1.0	1.0
+chr2	786674	0.0	1.0	1.0
+chr2	786791	2.0	0.0	2.0
+chr2	786794	0.0	2.0	2.0
+chr2	786797	1.0	0.0	1.0
+chr2	786798	0.0	1.0	1.0
+chr2	786799	1.0	0.0	1.0
+chr2	786802	2.0	0.0	2.0
+chr2	786807	0.0	2.0	2.0
+chr2	786811	3.0	0.0	3.0
+chr2	786813	0.0	1.0	1.0
+chr2	786815	1.0	0.0	1.0
+chr2	786819	0.0	3.0	3.0
+chr2	786820	0.0	2.0	2.0
+chr2	786826	0.0	1.0	1.0
+chr2	786828	0.0	1.0	1.0
+chr2	786829	0.0	1.0	1.0
+chr2	786830	0.0	1.0	1.0
+chr2	786835	3.0	0.0	3.0
+chr2	786836	2.0	0.0	2.0
+chr2	786842	1.0	0.0	1.0
+chr2	787032	1.0	0.0	1.0
+chr2	787034	1.0	0.0	1.0
+chr2	787062	1.0	0.0	1.0
+chr2	787063	0.0	1.0	1.0
+chr2	787072	0.0	1.0	1.0
+chr2	787082	1.0	0.0	1.0
+chr2	787083	2.0	0.0	2.0
+chr2	787084	0.0	1.0	1.0
+chr2	787090	0.0	1.0	1.0
+chr2	787093	1.0	1.0	2.0
+chr2	787098	1.0	0.0	1.0
+chr2	787100	0.0	3.0	3.0
+chr2	787109	1.0	0.0	1.0
+chr2	787116	0.0	1.0	1.0
+chr2	787117	1.0	2.0	3.0
+chr2	787119	2.0	0.0	2.0
+chr2	787121	2.0	0.0	2.0
+chr2	787122	1.0	1.0	2.0
+chr2	787126	1.0	2.0	3.0
+chr2	787127	0.0	6.0	6.0
+chr2	787129	1.0	0.0	1.0
+chr2	787141	0.0	2.0	2.0
+chr2	787154	1.0	0.0	1.0
+chr2	787234	1.0	0.0	1.0
+chr2	787239	1.0	0.0	1.0
+chr2	787241	0.0	1.0	1.0
+chr2	787263	1.0	0.0	1.0
+chr2	787264	1.0	0.0	1.0
+chr2	787274	1.0	0.0	1.0
+chr2	787283	0.0	1.0	1.0
+chr2	787397	0.0	1.0	1.0
+chr2	787440	0.0	1.0	1.0
+chr2	787449	0.0	1.0	1.0
+chr2	787564	0.0	1.0	1.0
+chr2	787589	0.0	1.0	1.0
+chr2	787627	0.0	1.0	1.0
+chr2	787737	1.0	0.0	1.0
+chr2	787862	1.0	0.0	1.0
+chr2	787907	1.0	0.0	1.0
+chr2	788084	1.0	0.0	1.0
+chr2	788529	0.0	1.0	1.0
+chr2	788534	0.0	1.0	1.0
+chr2	788632	0.0	1.0	1.0
+chr2	788668	1.0	0.0	1.0
+chr2	788681	0.0	2.0	2.0
+chr2	788682	0.0	1.0	1.0
+chr2	788691	1.0	0.0	1.0
+chr2	788698	1.0	0.0	1.0
+chr2	788703	0.0	1.0	1.0
+chr2	788719	0.0	1.0	1.0
+chr2	788908	0.0	1.0	1.0
+chr2	788910	0.0	1.0	1.0
+chr2	788925	1.0	0.0	1.0
+chr2	788928	1.0	0.0	1.0
+chr2	788946	1.0	0.0	1.0
+chr2	788947	0.0	1.0	1.0
+chr2	788950	1.0	1.0	2.0
+chr2	788954	1.0	0.0	1.0
+chr2	788955	0.0	1.0	1.0
+chr2	789132	1.0	0.0	1.0
+chr2	789289	1.0	0.0	1.0
+chr2	789313	1.0	0.0	1.0
+chr2	789459	0.0	1.0	1.0
+chr2	789828	1.0	0.0	1.0
+chr2	789844	0.0	1.0	1.0
+chr2	789863	1.0	0.0	1.0
+chr2	789868	1.0	0.0	1.0
+chr2	790050	0.0	1.0	1.0
+chr2	790105	0.0	1.0	1.0
+chr2	790107	0.0	1.0	1.0
+chr2	790238	1.0	0.0	1.0
+chr2	790268	2.0	0.0	2.0
+chr2	790800	0.0	1.0	1.0
+chr2	790867	0.0	1.0	1.0
+chr2	790931	1.0	0.0	1.0
+chr2	791019	1.0	0.0	1.0
+chr2	791079	0.0	1.0	1.0
+chr2	791096	1.0	0.0	1.0
+chr2	791177	0.0	1.0	1.0
+chr2	791237	1.0	0.0	1.0
+chr2	791299	2.0	0.0	2.0
+chr2	791317	0.0	1.0	1.0
+chr2	791388	1.0	0.0	1.0
+chr2	791505	1.0	0.0	1.0
+chr2	791516	1.0	0.0	1.0
+chr2	791546	1.0	0.0	1.0
+chr2	791661	0.0	1.0	1.0
+chr2	791703	1.0	0.0	1.0
+chr2	791732	0.0	4.0	4.0
+chr2	791750	0.0	1.0	1.0
+chr2	792029	1.0	1.0	2.0
+chr2	792030	0.0	1.0	1.0
+chr2	792031	0.0	1.0	1.0
+chr2	792045	0.0	1.0	1.0
+chr2	792054	0.0	1.0	1.0
+chr2	792063	0.0	1.0	1.0
+chr2	792133	0.0	1.0	1.0
+chr2	792385	1.0	0.0	1.0
+chr2	792423	0.0	4.0	4.0
+chr2	792494	0.0	1.0	1.0
+chr2	792543	0.0	1.0	1.0
+chr2	792554	0.0	1.0	1.0
+chr2	792560	1.0	0.0	1.0
+chr2	792561	0.0	1.0	1.0
+chr2	792563	1.0	0.0	1.0
+chr2	792564	1.0	0.0	1.0
+chr2	792572	1.0	0.0	1.0
+chr2	792574	0.0	1.0	1.0
+chr2	792769	0.0	1.0	1.0
+chr2	792789	0.0	1.0	1.0
+chr2	792816	1.0	0.0	1.0
+chr2	792822	0.0	1.0	1.0
+chr2	792828	0.0	2.0	2.0
+chr2	792829	2.0	1.0	3.0
+chr2	792839	0.0	4.0	4.0
+chr2	792842	0.0	1.0	1.0
+chr2	792843	0.0	7.0	7.0
+chr2	792845	1.0	0.0	1.0
+chr2	792846	2.0	1.0	3.0
+chr2	792847	0.0	1.0	1.0
+chr2	792849	0.0	1.0	1.0
+chr2	792851	6.0	0.0	6.0
+chr2	792853	0.0	1.0	1.0
+chr2	792862	3.0	0.0	3.0
+chr2	792863	1.0	0.0	1.0
+chr2	792986	0.0	1.0	1.0
+chr2	792994	0.0	1.0	1.0
+chr2	792996	2.0	1.0	3.0
+chr2	792999	2.0	0.0	2.0
+chr2	793087	1.0	0.0	1.0
+chr2	793127	0.0	1.0	1.0
+chr2	793321	0.0	1.0	1.0
+chr2	793469	0.0	1.0	1.0
+chr2	793485	0.0	1.0	1.0
+chr2	793670	0.0	1.0	1.0
+chr2	793810	1.0	0.0	1.0
+chr2	793857	1.0	0.0	1.0
+chr2	793873	0.0	1.0	1.0
+chr2	793895	2.0	0.0	2.0
+chr2	793922	0.0	2.0	2.0
+chr2	794062	1.0	0.0	1.0
+chr2	794115	1.0	0.0	1.0
+chr2	794692	0.0	1.0	1.0
+chr2	794827	0.0	1.0	1.0
+chr2	794829	0.0	1.0	1.0
+chr2	795156	1.0	0.0	1.0
+chr2	795167	1.0	0.0	1.0
+chr2	795466	0.0	1.0	1.0
+chr2	795648	1.0	0.0	1.0
+chr2	795810	1.0	0.0	1.0
+chr2	795841	1.0	0.0	1.0
+chr2	795971	0.0	1.0	1.0
+chr2	796021	0.0	1.0	1.0
+chr2	796235	0.0	1.0	1.0
+chr2	796261	1.0	0.0	1.0
+chr2	796415	0.0	1.0	1.0
+chr2	796436	0.0	1.0	1.0
+chr2	796478	1.0	0.0	1.0
+chr2	796489	0.0	1.0	1.0
+chr2	796781	1.0	0.0	1.0
+chr2	796797	1.0	0.0	1.0
+chr2	796808	0.0	1.0	1.0
+chr2	796815	1.0	0.0	1.0
+chr2	796830	1.0	0.0	1.0
+chr2	796840	0.0	1.0	1.0
+chr2	796862	3.0	0.0	3.0
+chr2	796870	0.0	1.0	1.0
+chr2	796924	1.0	0.0	1.0
+chr2	796926	0.0	1.0	1.0
+chr2	796959	1.0	0.0	1.0
+chr2	796988	0.0	1.0	1.0
+chr2	796989	0.0	1.0	1.0
+chr2	796998	1.0	0.0	1.0
+chr2	797002	0.0	1.0	1.0
+chr2	797037	1.0	0.0	1.0
+chr2	797080	0.0	1.0	1.0
+chr2	797162	1.0	0.0	1.0
+chr2	797192	1.0	0.0	1.0
+chr2	797217	0.0	2.0	2.0
+chr2	797301	1.0	1.0	2.0
+chr2	797330	1.0	0.0	1.0
+chr2	797401	1.0	0.0	1.0
+chr2	797496	0.0	1.0	1.0
+chr2	797562	0.0	1.0	1.0
+chr2	797605	1.0	0.0	1.0
+chr2	797697	1.0	0.0	1.0
+chr2	797705	1.0	0.0	1.0
+chr2	797760	0.0	2.0	2.0
+chr2	797812	1.0	0.0	1.0
+chr2	797825	1.0	0.0	1.0
+chr2	797900	3.0	0.0	3.0
+chr2	797906	0.0	1.0	1.0
+chr2	797918	0.0	1.0	1.0
+chr2	797922	2.0	0.0	2.0
+chr2	798137	0.0	2.0	2.0
+chr2	798156	0.0	2.0	2.0
+chr2	798172	0.0	2.0	2.0
+chr2	798178	1.0	0.0	1.0
+chr2	798181	0.0	1.0	1.0
+chr2	798182	1.0	0.0	1.0
+chr2	798286	1.0	0.0	1.0
+chr2	798323	1.0	1.0	2.0
+chr2	798332	0.0	1.0	1.0
+chr2	798354	1.0	0.0	1.0
+chr2	798370	1.0	0.0	1.0
+chr2	798373	1.0	0.0	1.0
+chr2	798408	0.0	1.0	1.0
+chr2	798500	0.0	2.0	2.0
+chr2	798552	0.0	1.0	1.0
+chr2	798711	0.0	1.0	1.0
+chr2	798719	0.0	1.0	1.0
+chr2	798849	0.0	1.0	1.0
+chr2	798855	2.0	0.0	2.0
+chr2	798870	0.0	1.0	1.0
+chr2	798889	0.0	1.0	1.0
+chr2	798893	1.0	0.0	1.0
+chr2	799177	0.0	1.0	1.0
+chr2	799188	0.0	1.0	1.0
+chr2	799196	0.0	1.0	1.0
+chr2	799199	0.0	1.0	1.0
+chr2	799201	0.0	1.0	1.0
+chr2	799218	1.0	0.0	1.0
+chr2	799225	1.0	0.0	1.0
+chr2	799233	0.0	1.0	1.0
+chr2	799240	0.0	1.0	1.0
+chr2	799243	0.0	1.0	1.0
+chr2	799256	0.0	1.0	1.0
+chr2	799266	1.0	0.0	1.0
+chr2	799390	1.0	0.0	1.0
+chr2	799397	0.0	1.0	1.0
+chr2	799405	0.0	1.0	1.0
+chr2	799407	0.0	2.0	2.0
+chr2	799444	1.0	0.0	1.0
+chr2	799546	2.0	0.0	2.0
+chr2	799592	2.0	0.0	2.0
+chr2	799698	1.0	0.0	1.0
+chr2	799723	0.0	1.0	1.0
+chr2	799724	1.0	0.0	1.0
+chr2	799730	0.0	1.0	1.0
+chr2	799734	1.0	0.0	1.0
+chr2	799867	1.0	0.0	1.0
+chr2	799875	0.0	1.0	1.0
+chr2	799888	1.0	0.0	1.0
+chr2	799894	1.0	0.0	1.0
+chr2	799987	1.0	0.0	1.0
+chr2	800041	1.0	0.0	1.0
+chr2	800044	0.0	1.0	1.0
+chr2	800056	1.0	0.0	1.0
+chr2	800065	0.0	1.0	1.0
+chr2	800071	1.0	0.0	1.0
+chr2	800174	0.0	1.0	1.0
+chr2	800195	0.0	1.0	1.0
+chr2	800197	0.0	2.0	2.0
+chr2	800200	0.0	1.0	1.0
+chr2	800209	0.0	1.0	1.0
+chr2	800216	0.0	1.0	1.0
+chr2	800218	1.0	0.0	1.0
+chr2	800219	1.0	0.0	1.0
+chr2	800220	3.0	0.0	3.0
+chr2	800221	0.0	3.0	3.0
+chr2	800222	2.0	0.0	2.0
+chr2	800226	4.0	0.0	4.0
+chr2	800230	0.0	2.0	2.0
+chr2	800233	1.0	0.0	1.0
+chr2	800234	0.0	2.0	2.0
+chr2	800240	1.0	0.0	1.0
+chr2	800244	0.0	1.0	1.0
+chr2	800249	0.0	1.0	1.0
+chr2	800263	2.0	0.0	2.0
+chr2	800277	0.0	1.0	1.0
+chr2	800371	1.0	0.0	1.0
+chr2	800440	0.0	1.0	1.0
+chr2	800448	2.0	0.0	2.0
+chr2	800456	1.0	0.0	1.0
+chr2	800463	1.0	0.0	1.0
+chr2	800471	1.0	1.0	2.0
+chr2	800478	1.0	0.0	1.0
+chr2	800480	3.0	0.0	3.0
+chr2	800485	0.0	1.0	1.0
+chr2	800487	1.0	0.0	1.0
+chr2	800490	0.0	1.0	1.0
+chr2	800491	0.0	2.0	2.0
+chr2	800499	0.0	1.0	1.0
+chr2	800504	0.0	1.0	1.0
+chr2	800505	0.0	1.0	1.0
+chr2	800509	0.0	1.0	1.0
+chr2	800510	3.0	0.0	3.0
+chr2	800542	1.0	0.0	1.0
+chr2	800546	0.0	1.0	1.0
+chr2	800577	1.0	0.0	1.0
+chr2	800600	0.0	1.0	1.0
+chr2	800606	0.0	1.0	1.0
+chr2	800680	0.0	1.0	1.0
+chr2	800791	0.0	2.0	2.0
+chr2	800820	1.0	2.0	3.0
+chr2	800835	0.0	1.0	1.0
+chr2	800848	0.0	2.0	2.0
+chr2	800878	1.0	0.0	1.0
+chr2	800955	1.0	0.0	1.0
+chr2	800972	0.0	1.0	1.0
+chr2	800995	0.0	1.0	1.0
+chr2	800997	0.0	1.0	1.0
+chr2	800998	0.0	1.0	1.0
+chr2	801003	2.0	0.0	2.0
+chr2	801009	0.0	1.0	1.0
+chr2	801014	0.0	2.0	2.0
+chr2	801154	0.0	1.0	1.0
+chr2	801158	0.0	1.0	1.0
+chr2	801195	1.0	0.0	1.0
+chr2	801245	1.0	0.0	1.0
+chr2	801249	0.0	1.0	1.0
+chr2	801250	0.0	1.0	1.0
+chr2	801285	1.0	0.0	1.0
+chr2	801289	0.0	1.0	1.0
+chr2	801301	0.0	1.0	1.0
+chr2	801322	1.0	0.0	1.0
+chr2	801327	1.0	0.0	1.0
+chr2	801331	0.0	1.0	1.0
+chr2	801334	0.0	1.0	1.0
+chr2	801423	1.0	0.0	1.0
+chr2	801443	0.0	1.0	1.0
+chr2	801455	1.0	0.0	1.0
+chr2	801479	0.0	1.0	1.0
+chr2	801486	1.0	0.0	1.0
+chr2	801493	1.0	0.0	1.0
+chr2	801495	1.0	0.0	1.0
+chr2	801506	0.0	1.0	1.0
+chr2	801518	0.0	1.0	1.0
+chr2	801611	0.0	1.0	1.0
+chr2	801662	0.0	1.0	1.0
+chr2	801722	0.0	1.0	1.0
+chr2	801748	0.0	1.0	1.0
+chr2	801804	1.0	0.0	1.0
+chr2	801811	1.0	0.0	1.0
+chr2	801828	0.0	1.0	1.0
+chr2	801836	2.0	0.0	2.0
+chr2	801840	0.0	1.0	1.0
+chr2	801841	0.0	1.0	1.0
+chr2	801850	1.0	0.0	1.0
+chr2	801927	1.0	0.0	1.0
+chr2	801945	1.0	0.0	1.0
+chr2	801989	0.0	2.0	2.0
+chr2	802021	0.0	1.0	1.0
+chr2	802085	0.0	1.0	1.0
+chr2	802162	0.0	1.0	1.0
+chr2	802163	0.0	1.0	1.0
+chr2	802170	2.0	0.0	2.0
+chr2	802198	0.0	1.0	1.0
+chr2	802557	1.0	0.0	1.0
+chr2	802569	0.0	1.0	1.0
+chr2	802607	1.0	0.0	1.0
+chr2	802610	1.0	0.0	1.0
+chr2	803244	0.0	3.0	3.0
+chr2	803253	0.0	3.0	3.0
+chr2	803412	0.0	1.0	1.0
+chr2	803445	1.0	0.0	1.0
+chr2	803479	1.0	0.0	1.0
+chr2	803543	0.0	1.0	1.0
+chr2	803684	0.0	1.0	1.0
+chr2	803814	0.0	1.0	1.0
+chr2	803817	1.0	0.0	1.0
+chr2	803834	1.0	0.0	1.0
+chr2	803844	0.0	1.0	1.0
+chr2	803849	0.0	1.0	1.0
+chr2	803996	1.0	0.0	1.0
+chr2	803998	0.0	1.0	1.0
+chr2	804129	0.0	1.0	1.0
+chr2	804160	1.0	0.0	1.0
+chr2	804177	0.0	2.0	2.0
+chr2	804199	0.0	1.0	1.0
+chr2	804202	0.0	1.0	1.0
+chr2	804216	1.0	0.0	1.0
+chr2	804232	3.0	0.0	3.0
+chr2	804325	1.0	0.0	1.0
+chr2	804331	1.0	0.0	1.0
+chr2	804354	0.0	1.0	1.0
+chr2	804375	1.0	0.0	1.0
+chr2	804680	1.0	0.0	1.0
+chr2	804695	0.0	1.0	1.0
+chr2	804698	1.0	0.0	1.0
+chr2	804728	2.0	0.0	2.0
+chr2	804820	0.0	1.0	1.0
+chr2	804821	0.0	1.0	1.0
+chr2	804830	2.0	0.0	2.0
+chr2	804833	3.0	0.0	3.0
+chr2	804839	0.0	1.0	1.0
+chr2	804843	0.0	1.0	1.0
+chr2	804845	1.0	0.0	1.0
+chr2	804848	1.0	0.0	1.0
+chr2	804849	2.0	0.0	2.0
+chr2	804852	1.0	0.0	1.0
+chr2	804858	1.0	0.0	1.0
+chr2	804859	3.0	0.0	3.0
+chr2	804864	0.0	3.0	3.0
+chr2	804866	0.0	1.0	1.0
+chr2	804868	1.0	0.0	1.0
+chr2	804874	1.0	0.0	1.0
+chr2	804876	0.0	2.0	2.0
+chr2	804877	1.0	1.0	2.0
+chr2	804894	1.0	0.0	1.0
+chr2	804895	1.0	0.0	1.0
+chr2	804910	0.0	1.0	1.0
+chr2	804934	0.0	1.0	1.0
+chr2	805089	0.0	1.0	1.0
+chr2	805104	1.0	0.0	1.0
+chr2	805116	2.0	0.0	2.0
+chr2	805127	0.0	1.0	1.0
+chr2	805131	1.0	1.0	2.0
+chr2	805134	1.0	5.0	6.0
+chr2	805137	0.0	1.0	1.0
+chr2	805138	0.0	2.0	2.0
+chr2	805140	1.0	0.0	1.0
+chr2	805141	2.0	0.0	2.0
+chr2	805149	1.0	0.0	1.0
+chr2	805151	2.0	0.0	2.0
+chr2	805157	5.0	0.0	5.0
+chr2	805158	2.0	0.0	2.0
+chr2	805159	0.0	3.0	3.0
+chr2	805160	0.0	2.0	2.0
+chr2	805163	1.0	12.0	13.0
+chr2	805164	3.0	4.0	7.0
+chr2	805165	0.0	2.0	2.0
+chr2	805167	1.0	0.0	1.0
+chr2	805168	4.0	0.0	4.0
+chr2	805169	2.0	3.0	5.0
+chr2	805171	1.0	0.0	1.0
+chr2	805172	1.0	2.0	3.0
+chr2	805174	3.0	0.0	3.0
+chr2	805176	1.0	14.0	15.0
+chr2	805177	1.0	2.0	3.0
+chr2	805178	1.0	0.0	1.0
+chr2	805179	0.0	1.0	1.0
+chr2	805180	1.0	0.0	1.0
+chr2	805181	2.0	0.0	2.0
+chr2	805183	3.0	0.0	3.0
+chr2	805186	1.0	0.0	1.0
+chr2	805187	0.0	1.0	1.0
+chr2	805190	1.0	0.0	1.0
+chr2	805203	0.0	1.0	1.0
+chr2	805205	0.0	1.0	1.0
+chr2	805216	1.0	0.0	1.0
+chr2	805233	1.0	0.0	1.0
+chr2	805319	3.0	0.0	3.0
+chr2	805323	0.0	2.0	2.0
+chr2	805325	0.0	1.0	1.0
+chr2	805327	1.0	0.0	1.0
+chr2	805328	1.0	0.0	1.0
+chr2	805331	0.0	1.0	1.0
+chr2	805343	0.0	1.0	1.0
+chr2	805346	1.0	1.0	2.0
+chr2	805348	1.0	0.0	1.0
+chr2	805349	0.0	1.0	1.0
+chr2	805350	0.0	1.0	1.0
+chr2	805381	0.0	1.0	1.0
+chr2	805382	0.0	2.0	2.0
+chr2	805411	0.0	1.0	1.0
+chr2	805462	1.0	0.0	1.0
+chr2	805471	1.0	0.0	1.0
+chr2	805482	0.0	1.0	1.0
+chr2	805484	1.0	0.0	1.0
+chr2	805485	2.0	0.0	2.0
+chr2	805486	0.0	1.0	1.0
+chr2	805489	1.0	0.0	1.0
+chr2	805493	1.0	0.0	1.0
+chr2	805499	2.0	0.0	2.0
+chr2	805515	1.0	0.0	1.0
+chr2	805516	1.0	0.0	1.0
+chr2	805518	0.0	1.0	1.0
+chr2	805594	0.0	1.0	1.0
+chr2	805643	1.0	0.0	1.0
+chr2	805644	0.0	1.0	1.0
+chr2	805650	1.0	0.0	1.0
+chr2	805657	0.0	2.0	2.0
+chr2	805664	0.0	1.0	1.0
+chr2	805687	1.0	0.0	1.0
+chr2	805689	1.0	0.0	1.0
+chr2	805701	1.0	0.0	1.0
+chr2	805709	1.0	0.0	1.0
+chr2	805715	0.0	2.0	2.0
+chr2	805719	1.0	0.0	1.0
+chr2	805724	0.0	3.0	3.0
+chr2	805727	5.0	0.0	5.0
+chr2	805728	1.0	0.0	1.0
+chr2	805735	0.0	1.0	1.0
+chr2	805743	1.0	0.0	1.0
+chr2	805746	1.0	0.0	1.0
+chr2	805753	0.0	1.0	1.0
+chr2	805760	4.0	0.0	4.0
+chr2	805767	1.0	0.0	1.0
+chr2	805773	0.0	2.0	2.0
+chr2	805776	1.0	0.0	1.0
+chr2	805786	1.0	0.0	1.0
+chr2	805801	1.0	0.0	1.0
+chr2	805805	2.0	0.0	2.0
+chr2	805808	1.0	0.0	1.0
+chr2	805814	2.0	0.0	2.0
+chr2	805823	1.0	0.0	1.0
+chr2	805824	0.0	1.0	1.0
+chr2	805842	1.0	0.0	1.0
+chr2	805846	1.0	0.0	1.0
+chr2	805851	1.0	0.0	1.0
+chr2	805853	0.0	1.0	1.0
+chr2	805868	0.0	1.0	1.0
+chr2	805891	1.0	0.0	1.0
+chr2	805894	0.0	1.0	1.0
+chr2	805958	0.0	2.0	2.0
+chr2	805960	0.0	1.0	1.0
+chr2	805973	1.0	0.0	1.0
+chr2	805981	1.0	0.0	1.0
+chr2	805987	0.0	1.0	1.0
+chr2	805994	1.0	0.0	1.0
+chr2	806003	0.0	2.0	2.0
+chr2	806008	0.0	1.0	1.0
+chr2	806043	0.0	1.0	1.0
+chr2	806125	0.0	1.0	1.0
+chr2	806154	1.0	0.0	1.0
+chr2	806175	1.0	0.0	1.0
+chr2	806180	0.0	2.0	2.0
+chr2	806198	0.0	1.0	1.0
+chr2	806259	0.0	1.0	1.0
+chr2	806284	1.0	0.0	1.0
+chr2	806294	0.0	1.0	1.0
+chr2	806310	1.0	0.0	1.0
+chr2	806315	1.0	0.0	1.0
+chr2	806316	1.0	0.0	1.0
+chr2	806357	1.0	0.0	1.0
+chr2	806361	1.0	0.0	1.0
+chr2	806362	2.0	0.0	2.0
+chr2	806380	1.0	0.0	1.0
+chr2	806480	1.0	0.0	1.0
+chr2	806482	0.0	1.0	1.0
+chr2	806488	0.0	1.0	1.0
+chr2	806496	0.0	1.0	1.0
+chr2	806519	1.0	0.0	1.0
+chr2	806525	1.0	0.0	1.0
+chr2	806528	0.0	2.0	2.0
+chr2	806538	1.0	0.0	1.0
+chr2	806652	1.0	0.0	1.0
+chr2	806672	3.0	0.0	3.0
+chr2	806685	0.0	1.0	1.0
+chr2	806739	0.0	1.0	1.0
+chr2	806761	0.0	1.0	1.0
+chr2	806790	0.0	1.0	1.0
+chr2	806792	0.0	1.0	1.0
+chr2	806793	0.0	1.0	1.0
+chr2	806810	1.0	0.0	1.0
+chr2	806818	0.0	1.0	1.0
+chr2	806833	1.0	0.0	1.0
+chr2	806838	4.0	0.0	4.0
+chr2	806934	0.0	1.0	1.0
+chr2	806936	0.0	1.0	1.0
+chr2	806938	0.0	2.0	2.0
+chr2	806939	1.0	0.0	1.0
+chr2	806940	1.0	0.0	1.0
+chr2	806941	1.0	0.0	1.0
+chr2	806942	0.0	1.0	1.0
+chr2	806945	1.0	1.0	2.0
+chr2	806962	1.0	0.0	1.0
+chr2	806968	1.0	0.0	1.0
+chr2	806969	0.0	1.0	1.0
+chr2	806974	1.0	0.0	1.0
+chr2	806975	0.0	1.0	1.0
+chr2	806986	0.0	1.0	1.0
+chr2	806988	0.0	1.0	1.0
+chr2	807001	0.0	1.0	1.0
+chr2	807004	1.0	0.0	1.0
+chr2	807005	0.0	1.0	1.0
+chr2	807009	1.0	0.0	1.0
+chr2	807022	1.0	0.0	1.0
+chr2	807033	0.0	1.0	1.0
+chr2	807046	0.0	1.0	1.0
+chr2	807078	0.0	1.0	1.0
+chr2	807088	0.0	1.0	1.0
+chr2	807093	1.0	2.0	3.0
+chr2	807096	1.0	0.0	1.0
+chr2	807097	0.0	1.0	1.0
+chr2	807102	0.0	1.0	1.0
+chr2	807104	1.0	0.0	1.0
+chr2	807106	6.0	0.0	6.0
+chr2	807107	0.0	1.0	1.0
+chr2	807108	1.0	1.0	2.0
+chr2	807109	0.0	1.0	1.0
+chr2	807113	3.0	0.0	3.0
+chr2	807115	4.0	0.0	4.0
+chr2	807117	1.0	1.0	2.0
+chr2	807121	0.0	1.0	1.0
+chr2	807122	2.0	0.0	2.0
+chr2	807125	0.0	1.0	1.0
+chr2	807135	1.0	0.0	1.0
+chr2	807156	1.0	0.0	1.0
+chr2	807258	1.0	0.0	1.0
+chr2	807276	0.0	1.0	1.0
+chr2	807299	0.0	2.0	2.0
+chr2	807354	0.0	1.0	1.0
+chr2	807366	0.0	1.0	1.0
+chr2	807371	0.0	1.0	1.0
+chr2	807382	0.0	1.0	1.0
+chr2	807385	0.0	1.0	1.0
+chr2	807388	1.0	0.0	1.0
+chr2	807392	1.0	0.0	1.0
+chr2	807393	2.0	0.0	2.0
+chr2	807394	1.0	3.0	4.0
+chr2	807395	1.0	0.0	1.0
+chr2	807397	1.0	0.0	1.0
+chr2	807399	0.0	2.0	2.0
+chr2	807401	6.0	0.0	6.0
+chr2	807402	0.0	1.0	1.0
+chr2	807407	5.0	1.0	6.0
+chr2	807408	2.0	1.0	3.0
+chr2	807412	0.0	1.0	1.0
+chr2	807413	0.0	1.0	1.0
+chr2	807414	0.0	1.0	1.0
+chr2	807415	0.0	1.0	1.0
+chr2	807434	0.0	1.0	1.0
+chr2	807534	0.0	1.0	1.0
+chr2	807554	2.0	0.0	2.0
+chr2	807556	0.0	1.0	1.0
+chr2	807561	1.0	0.0	1.0
+chr2	807562	1.0	0.0	1.0
+chr2	807563	0.0	1.0	1.0
+chr2	807579	0.0	1.0	1.0
+chr2	807580	0.0	1.0	1.0
+chr2	807593	1.0	0.0	1.0
+chr2	807594	0.0	1.0	1.0
+chr2	807650	1.0	0.0	1.0
+chr2	807706	0.0	1.0	1.0
+chr2	807728	1.0	0.0	1.0
+chr2	807738	0.0	1.0	1.0
+chr2	807891	1.0	0.0	1.0
+chr2	807896	1.0	0.0	1.0
+chr2	807950	0.0	1.0	1.0
+chr2	808057	1.0	0.0	1.0
+chr2	808222	1.0	0.0	1.0
+chr2	808242	0.0	1.0	1.0
+chr2	808251	0.0	2.0	2.0
+chr2	808255	1.0	0.0	1.0
+chr2	808263	1.0	0.0	1.0
+chr2	808387	0.0	2.0	2.0
+chr2	808388	0.0	1.0	1.0
+chr2	808425	2.0	0.0	2.0
+chr2	808428	0.0	1.0	1.0
+chr2	808429	1.0	0.0	1.0
+chr2	808430	1.0	0.0	1.0
+chr2	808436	0.0	1.0	1.0
+chr2	808438	2.0	0.0	2.0
+chr2	808439	1.0	0.0	1.0
+chr2	808444	1.0	0.0	1.0
+chr2	808445	1.0	0.0	1.0
+chr2	808454	1.0	0.0	1.0
+chr2	808455	0.0	2.0	2.0
+chr2	808456	0.0	1.0	1.0
+chr2	808461	0.0	1.0	1.0
+chr2	808464	1.0	0.0	1.0
+chr2	808465	2.0	0.0	2.0
+chr2	808474	1.0	0.0	1.0
+chr2	808479	0.0	1.0	1.0
+chr2	808481	1.0	0.0	1.0
+chr2	808486	0.0	1.0	1.0
+chr2	808541	1.0	0.0	1.0
+chr2	808566	1.0	0.0	1.0
+chr2	808610	0.0	1.0	1.0
+chr2	808630	1.0	0.0	1.0
+chr2	808642	0.0	1.0	1.0
+chr2	808674	0.0	1.0	1.0
+chr2	808686	1.0	0.0	1.0
+chr2	808689	0.0	4.0	4.0
+chr2	808693	0.0	1.0	1.0
+chr2	808695	1.0	0.0	1.0
+chr2	808707	1.0	0.0	1.0
+chr2	808711	2.0	0.0	2.0
+chr2	808714	1.0	0.0	1.0
+chr2	808718	0.0	2.0	2.0
+chr2	808757	0.0	1.0	1.0
+chr2	808765	0.0	1.0	1.0
+chr2	808778	1.0	0.0	1.0
+chr2	808792	1.0	0.0	1.0
+chr2	808793	0.0	1.0	1.0
+chr2	808794	0.0	1.0	1.0
+chr2	808849	2.0	0.0	2.0
+chr2	808868	2.0	1.0	3.0
+chr2	808872	0.0	1.0	1.0
+chr2	808878	1.0	0.0	1.0
+chr2	808881	0.0	2.0	2.0
+chr2	808885	1.0	0.0	1.0
+chr2	808891	1.0	0.0	1.0
+chr2	808892	0.0	2.0	2.0
+chr2	808896	1.0	0.0	1.0
+chr2	808918	0.0	1.0	1.0
+chr2	808931	0.0	6.0	6.0
+chr2	808942	1.0	0.0	1.0
+chr2	808944	2.0	0.0	2.0
+chr2	808949	3.0	0.0	3.0
+chr2	808962	1.0	0.0	1.0
+chr2	808967	1.0	0.0	1.0
+chr2	808977	0.0	1.0	1.0
+chr2	808997	1.0	0.0	1.0
+chr2	809028	2.0	1.0	3.0
+chr2	809030	1.0	0.0	1.0
+chr2	809053	1.0	0.0	1.0
+chr2	809060	1.0	0.0	1.0
+chr2	809062	0.0	1.0	1.0
+chr2	809063	0.0	1.0	1.0
+chr2	809069	0.0	2.0	2.0
+chr2	809074	0.0	1.0	1.0
+chr2	809078	0.0	1.0	1.0
+chr2	809097	1.0	0.0	1.0
+chr2	809100	0.0	1.0	1.0
+chr2	809107	0.0	1.0	1.0
+chr2	809119	1.0	0.0	1.0
+chr2	809124	0.0	3.0	3.0
+chr2	809125	3.0	0.0	3.0
+chr2	809132	1.0	0.0	1.0
+chr2	809135	3.0	0.0	3.0
+chr2	809138	1.0	1.0	2.0
+chr2	809144	1.0	0.0	1.0
+chr2	809145	0.0	1.0	1.0
+chr2	809148	1.0	0.0	1.0
+chr2	809151	0.0	2.0	2.0
+chr2	809154	0.0	1.0	1.0
+chr2	809157	0.0	2.0	2.0
+chr2	809158	1.0	0.0	1.0
+chr2	809162	0.0	1.0	1.0
+chr2	809166	0.0	1.0	1.0
+chr2	809171	0.0	4.0	4.0
+chr2	809172	0.0	3.0	3.0
+chr2	809174	0.0	2.0	2.0
+chr2	809180	0.0	1.0	1.0
+chr2	809186	0.0	3.0	3.0
+chr2	809187	0.0	1.0	1.0
+chr2	809188	0.0	1.0	1.0
+chr2	809191	0.0	1.0	1.0
+chr2	809194	0.0	2.0	2.0
+chr2	809195	0.0	1.0	1.0
+chr2	809202	1.0	0.0	1.0
+chr2	809209	0.0	1.0	1.0
+chr2	809219	0.0	1.0	1.0
+chr2	809221	2.0	0.0	2.0
+chr2	809232	2.0	0.0	2.0
+chr2	809247	2.0	1.0	3.0
+chr2	809252	1.0	0.0	1.0
+chr2	809253	1.0	0.0	1.0
+chr2	809255	1.0	0.0	1.0
+chr2	809261	0.0	1.0	1.0
+chr2	809280	3.0	0.0	3.0
+chr2	809281	1.0	0.0	1.0
+chr2	809293	0.0	1.0	1.0
+chr2	809294	1.0	1.0	2.0
+chr2	809297	0.0	2.0	2.0
+chr2	809300	1.0	0.0	1.0
+chr2	809303	1.0	0.0	1.0
+chr2	809304	1.0	1.0	2.0
+chr2	809305	1.0	0.0	1.0
+chr2	809308	1.0	0.0	1.0
+chr2	809311	0.0	1.0	1.0
+chr2	809312	1.0	1.0	2.0
+chr2	809315	1.0	0.0	1.0
+chr2	809319	0.0	3.0	3.0
+chr2	809320	1.0	0.0	1.0
+chr2	809321	1.0	0.0	1.0
+chr2	809322	8.0	0.0	8.0
+chr2	809323	1.0	1.0	2.0
+chr2	809324	1.0	0.0	1.0
+chr2	809325	2.0	0.0	2.0
+chr2	809326	1.0	1.0	2.0
+chr2	809327	2.0	0.0	2.0
+chr2	809328	0.0	2.0	2.0
+chr2	809330	0.0	2.0	2.0
+chr2	809331	4.0	2.0	6.0
+chr2	809334	1.0	4.0	5.0
+chr2	809335	3.0	0.0	3.0
+chr2	809338	1.0	0.0	1.0
+chr2	809340	4.0	0.0	4.0
+chr2	809341	5.0	3.0	8.0
+chr2	809344	0.0	6.0	6.0
+chr2	809349	1.0	0.0	1.0
+chr2	809350	1.0	0.0	1.0
+chr2	809352	1.0	1.0	2.0
+chr2	809353	0.0	1.0	1.0
+chr2	809358	0.0	1.0	1.0
+chr2	809359	2.0	0.0	2.0
+chr2	809362	3.0	0.0	3.0
+chr2	809369	0.0	2.0	2.0
+chr2	809371	1.0	0.0	1.0
+chr2	809372	1.0	0.0	1.0
+chr2	809373	0.0	1.0	1.0
+chr2	809377	0.0	1.0	1.0
+chr2	809378	2.0	0.0	2.0
+chr2	809379	0.0	2.0	2.0
+chr2	809384	1.0	0.0	1.0
+chr2	809538	1.0	0.0	1.0
+chr2	809577	0.0	1.0	1.0
+chr2	809594	0.0	1.0	1.0
+chr2	809630	2.0	0.0	2.0
+chr2	809634	1.0	2.0	3.0
+chr2	809635	1.0	2.0	3.0
+chr2	809639	0.0	1.0	1.0
+chr2	809641	1.0	1.0	2.0
+chr2	809643	0.0	1.0	1.0
+chr2	809644	1.0	0.0	1.0
+chr2	809648	0.0	1.0	1.0
+chr2	809650	1.0	0.0	1.0
+chr2	809654	3.0	0.0	3.0
+chr2	809659	0.0	4.0	4.0
+chr2	809660	1.0	0.0	1.0
+chr2	809662	1.0	0.0	1.0
+chr2	809663	3.0	0.0	3.0
+chr2	809664	2.0	0.0	2.0
+chr2	809666	0.0	6.0	6.0
+chr2	809667	1.0	1.0	2.0
+chr2	809668	0.0	2.0	2.0
+chr2	809672	3.0	0.0	3.0
+chr2	809677	2.0	0.0	2.0
+chr2	809678	5.0	1.0	6.0
+chr2	809680	0.0	1.0	1.0
+chr2	809684	1.0	0.0	1.0
+chr2	809686	5.0	0.0	5.0
+chr2	809688	0.0	3.0	3.0
+chr2	809689	0.0	5.0	5.0
+chr2	809695	2.0	0.0	2.0
+chr2	809697	1.0	0.0	1.0
+chr2	809712	0.0	1.0	1.0
+chr2	809960	2.0	0.0	2.0
+chr2	809963	1.0	0.0	1.0
+chr2	809974	0.0	1.0	1.0
+chr2	809978	1.0	0.0	1.0
+chr2	809979	0.0	3.0	3.0
+chr2	809983	4.0	0.0	4.0
+chr2	809985	0.0	1.0	1.0
+chr2	809987	1.0	0.0	1.0
+chr2	809992	2.0	0.0	2.0
+chr2	809993	1.0	2.0	3.0
+chr2	810006	0.0	2.0	2.0
+chr2	810015	1.0	0.0	1.0
+chr2	810016	0.0	5.0	5.0
+chr2	810019	2.0	1.0	3.0
+chr2	810023	0.0	3.0	3.0
+chr2	810027	5.0	0.0	5.0
+chr2	810028	1.0	0.0	1.0
+chr2	810032	0.0	3.0	3.0
+chr2	810036	0.0	1.0	1.0
+chr2	810037	1.0	0.0	1.0
+chr2	810045	0.0	1.0	1.0
+chr2	810059	1.0	0.0	1.0
+chr2	810106	0.0	1.0	1.0
+chr2	810114	0.0	1.0	1.0
+chr2	810141	1.0	0.0	1.0
+chr2	810152	2.0	0.0	2.0
+chr2	810153	1.0	2.0	3.0
+chr2	810155	0.0	1.0	1.0
+chr2	810156	0.0	1.0	1.0
+chr2	810170	1.0	0.0	1.0
+chr2	810171	0.0	1.0	1.0
+chr2	810179	1.0	0.0	1.0
+chr2	810209	1.0	0.0	1.0
+chr2	810221	1.0	0.0	1.0
+chr2	810229	0.0	2.0	2.0
+chr2	810288	0.0	1.0	1.0
+chr2	810298	0.0	2.0	2.0
+chr2	810319	1.0	0.0	1.0
+chr2	810324	0.0	1.0	1.0
+chr2	810328	1.0	0.0	1.0
+chr2	810348	1.0	0.0	1.0
+chr2	810415	0.0	1.0	1.0
+chr2	810416	0.0	1.0	1.0
+chr2	810435	1.0	0.0	1.0
+chr2	810443	0.0	1.0	1.0
+chr2	810447	0.0	1.0	1.0
+chr2	810462	1.0	0.0	1.0
+chr2	810476	1.0	0.0	1.0
+chr2	810498	1.0	0.0	1.0
+chr2	810507	0.0	1.0	1.0
+chr2	810511	0.0	2.0	2.0
+chr2	810512	0.0	1.0	1.0
+chr2	810517	1.0	0.0	1.0
+chr2	810523	1.0	0.0	1.0
+chr2	810526	0.0	1.0	1.0
+chr2	810529	1.0	1.0	2.0
+chr2	810540	1.0	0.0	1.0
+chr2	810544	1.0	0.0	1.0
+chr2	810548	0.0	4.0	4.0
+chr2	810550	1.0	0.0	1.0
+chr2	810571	1.0	0.0	1.0
+chr2	810600	1.0	0.0	1.0
+chr2	810644	0.0	1.0	1.0
+chr2	810647	0.0	3.0	3.0
+chr2	810662	0.0	1.0	1.0
+chr2	810671	0.0	1.0	1.0
+chr2	810709	0.0	1.0	1.0
+chr2	810795	0.0	1.0	1.0
+chr2	810801	1.0	0.0	1.0
+chr2	810873	0.0	1.0	1.0
+chr2	810896	0.0	1.0	1.0
+chr2	810906	1.0	0.0	1.0
+chr2	810908	2.0	0.0	2.0
+chr2	810946	1.0	0.0	1.0
+chr2	810947	0.0	1.0	1.0
+chr2	810952	1.0	0.0	1.0
+chr2	810960	0.0	1.0	1.0
+chr2	810963	1.0	0.0	1.0
+chr2	810965	0.0	1.0	1.0
+chr2	810973	0.0	2.0	2.0
+chr2	810988	1.0	0.0	1.0
+chr2	811062	1.0	0.0	1.0
+chr2	811064	0.0	1.0	1.0
+chr2	811066	0.0	1.0	1.0
+chr2	811070	0.0	2.0	2.0
+chr2	811099	0.0	2.0	2.0
+chr2	811103	0.0	1.0	1.0
+chr2	811107	1.0	0.0	1.0
+chr2	811114	0.0	1.0	1.0
+chr2	811120	1.0	0.0	1.0
+chr2	811124	1.0	0.0	1.0
+chr2	811130	0.0	1.0	1.0
+chr2	811166	1.0	0.0	1.0
+chr2	811181	0.0	1.0	1.0
+chr2	811224	1.0	0.0	1.0
+chr2	811235	0.0	3.0	3.0
+chr2	811237	3.0	0.0	3.0
+chr2	811239	2.0	0.0	2.0
+chr2	811241	1.0	0.0	1.0
+chr2	811243	0.0	5.0	5.0
+chr2	811244	0.0	1.0	1.0
+chr2	811245	4.0	0.0	4.0
+chr2	811246	1.0	0.0	1.0
+chr2	811247	0.0	1.0	1.0
+chr2	811249	0.0	1.0	1.0
+chr2	811251	8.0	0.0	8.0
+chr2	811252	3.0	0.0	3.0
+chr2	811253	0.0	1.0	1.0
+chr2	811254	0.0	2.0	2.0
+chr2	811255	2.0	1.0	3.0
+chr2	811256	2.0	0.0	2.0
+chr2	811257	1.0	0.0	1.0
+chr2	811260	0.0	1.0	1.0
+chr2	811261	0.0	1.0	1.0
+chr2	811262	2.0	0.0	2.0
+chr2	811264	1.0	0.0	1.0
+chr2	811269	1.0	1.0	2.0
+chr2	811270	0.0	4.0	4.0
+chr2	811278	0.0	1.0	1.0
+chr2	811279	0.0	1.0	1.0
+chr2	811280	1.0	0.0	1.0
+chr2	811284	1.0	0.0	1.0
+chr2	811286	1.0	0.0	1.0
+chr2	811301	0.0	1.0	1.0
+chr2	811332	2.0	0.0	2.0
+chr2	811372	0.0	1.0	1.0
+chr2	811373	0.0	1.0	1.0
+chr2	811378	0.0	1.0	1.0
+chr2	811384	0.0	1.0	1.0
+chr2	811385	0.0	1.0	1.0
+chr2	811386	3.0	0.0	3.0
+chr2	811390	3.0	0.0	3.0
+chr2	811393	1.0	1.0	2.0
+chr2	811395	1.0	5.0	6.0
+chr2	811396	3.0	2.0	5.0
+chr2	811402	3.0	0.0	3.0
+chr2	811403	1.0	0.0	1.0
+chr2	811405	1.0	0.0	1.0
+chr2	811406	2.0	0.0	2.0
+chr2	811407	4.0	2.0	6.0
+chr2	811408	6.0	2.0	8.0
+chr2	811412	0.0	2.0	2.0
+chr2	811414	8.0	3.0	11.0
+chr2	811415	0.0	1.0	1.0
+chr2	811419	0.0	6.0	6.0
+chr2	811421	2.0	1.0	3.0
+chr2	811422	3.0	0.0	3.0
+chr2	811423	1.0	0.0	1.0
+chr2	811424	1.0	0.0	1.0
+chr2	811425	5.0	4.0	9.0
+chr2	811426	6.0	0.0	6.0
+chr2	811427	5.0	4.0	9.0
+chr2	811428	0.0	4.0	4.0
+chr2	811429	3.0	1.0	4.0
+chr2	811430	5.0	4.0	9.0
+chr2	811431	6.0	8.0	14.0
+chr2	811432	1.0	3.0	4.0
+chr2	811433	2.0	1.0	3.0
+chr2	811435	4.0	3.0	7.0
+chr2	811437	0.0	1.0	1.0
+chr2	811439	1.0	0.0	1.0
+chr2	811440	1.0	3.0	4.0
+chr2	811441	8.0	3.0	11.0
+chr2	811443	0.0	5.0	5.0
+chr2	811444	0.0	5.0	5.0
+chr2	811445	0.0	1.0	1.0
+chr2	811449	0.0	1.0	1.0
+chr2	811451	2.0	2.0	4.0
+chr2	811454	0.0	1.0	1.0
+chr2	811460	1.0	1.0	2.0
+chr2	811461	1.0	0.0	1.0
+chr2	811465	0.0	5.0	5.0
+chr2	811467	1.0	0.0	1.0
+chr2	811660	0.0	1.0	1.0
+chr2	811674	1.0	0.0	1.0
+chr2	811690	1.0	0.0	1.0
+chr2	811691	1.0	0.0	1.0
+chr2	811692	0.0	1.0	1.0
+chr2	811702	0.0	2.0	2.0
+chr2	811704	5.0	1.0	6.0
+chr2	811712	1.0	0.0	1.0
+chr2	811713	1.0	0.0	1.0
+chr2	811714	1.0	0.0	1.0
+chr2	811715	1.0	0.0	1.0
+chr2	811724	0.0	1.0	1.0
+chr2	811738	0.0	1.0	1.0
+chr2	811746	0.0	1.0	1.0
+chr2	811758	1.0	0.0	1.0
+chr2	811760	0.0	1.0	1.0
+chr2	811812	2.0	0.0	2.0
+chr2	811816	0.0	1.0	1.0
+chr2	811858	1.0	0.0	1.0
+chr2	811859	0.0	1.0	1.0
+chr2	811871	1.0	0.0	1.0
+chr2	811894	0.0	1.0	1.0
+chr2	811942	1.0	0.0	1.0
+chr2	811992	1.0	0.0	1.0
+chr2	811998	1.0	0.0	1.0
+chr2	812027	0.0	1.0	1.0
+chr2	812047	0.0	1.0	1.0
+chr2	812062	0.0	1.0	1.0
+chr2	812110	2.0	0.0	2.0
+chr2	812126	0.0	1.0	1.0
+chr2	812160	0.0	1.0	1.0
+chr2	812161	1.0	0.0	1.0
+chr2	812205	1.0	0.0	1.0
+chr2	812308	0.0	1.0	1.0
+chr2	812312	1.0	0.0	1.0
+chr2	812533	1.0	0.0	1.0
+chr2	812535	0.0	1.0	1.0
+chr2	812536	0.0	1.0	1.0
+chr2	812542	1.0	0.0	1.0
+chr2	812545	2.0	3.0	5.0
+chr2	812546	2.0	0.0	2.0
+chr2	812551	0.0	2.0	2.0
+chr2	812554	0.0	1.0	1.0
+chr2	812558	1.0	0.0	1.0
+chr2	812560	0.0	2.0	2.0
+chr2	812561	0.0	2.0	2.0
+chr2	812562	2.0	0.0	2.0
+chr2	812578	0.0	2.0	2.0
+chr2	812581	1.0	0.0	1.0
+chr2	812587	1.0	0.0	1.0
+chr2	812649	1.0	0.0	1.0
+chr2	812729	1.0	0.0	1.0
+chr2	812740	0.0	1.0	1.0
+chr2	812759	1.0	0.0	1.0
+chr2	812766	2.0	0.0	2.0
+chr2	812770	0.0	1.0	1.0
+chr2	812771	2.0	0.0	2.0
+chr2	812772	0.0	1.0	1.0
+chr2	812774	1.0	0.0	1.0
+chr2	812776	0.0	1.0	1.0
+chr2	812784	1.0	0.0	1.0
+chr2	812788	0.0	1.0	1.0
+chr2	812795	2.0	0.0	2.0
+chr2	812799	0.0	2.0	2.0
+chr2	812802	0.0	1.0	1.0
+chr2	812817	1.0	0.0	1.0
+chr2	812818	1.0	0.0	1.0
+chr2	812825	1.0	0.0	1.0
+chr2	812833	0.0	1.0	1.0
+chr2	812837	0.0	1.0	1.0
+chr2	812838	1.0	1.0	2.0
+chr2	812839	0.0	1.0	1.0
+chr2	812923	3.0	0.0	3.0
+chr2	812939	1.0	0.0	1.0
+chr2	812958	0.0	2.0	2.0
+chr3	212	1.0	0.0	1.0
+chr3	247	1.0	0.0	1.0
+chr3	329	1.0	0.0	1.0
+chr3	454	0.0	1.0	1.0
+chr3	535	2.0	0.0	2.0
+chr3	544	1.0	0.0	1.0
+chr3	547	0.0	1.0	1.0
+chr3	548	0.0	1.0	1.0
+chr3	623	0.0	1.0	1.0
+chr3	636	0.0	1.0	1.0
+chr3	643	0.0	1.0	1.0
+chr3	644	1.0	0.0	1.0
+chr3	649	0.0	1.0	1.0
+chr3	650	1.0	0.0	1.0
+chr3	666	1.0	0.0	1.0
+chr3	671	0.0	2.0	2.0
+chr3	672	0.0	1.0	1.0
+chr3	674	0.0	1.0	1.0
+chr3	675	5.0	0.0	5.0
+chr3	676	0.0	5.0	5.0
+chr3	677	0.0	4.0	4.0
+chr3	684	0.0	2.0	2.0
+chr3	686	1.0	0.0	1.0
+chr3	688	2.0	0.0	2.0
+chr3	689	0.0	1.0	1.0
+chr3	690	0.0	1.0	1.0
+chr3	702	0.0	2.0	2.0
+chr3	707	1.0	2.0	3.0
+chr3	718	0.0	1.0	1.0
+chr3	719	0.0	1.0	1.0
+chr3	732	1.0	0.0	1.0
+chr3	734	1.0	0.0	1.0
+chr3	735	1.0	0.0	1.0
+chr3	740	1.0	0.0	1.0
+chr3	744	1.0	0.0	1.0
+chr3	884	0.0	1.0	1.0
+chr3	890	0.0	1.0	1.0
+chr3	901	2.0	0.0	2.0
+chr3	908	1.0	0.0	1.0
+chr3	909	1.0	0.0	1.0
+chr3	910	0.0	1.0	1.0
+chr3	911	2.0	0.0	2.0
+chr3	917	1.0	0.0	1.0
+chr3	920	2.0	0.0	2.0
+chr3	925	0.0	2.0	2.0
+chr3	926	3.0	2.0	5.0
+chr3	929	0.0	1.0	1.0
+chr3	935	1.0	0.0	1.0
+chr3	936	1.0	0.0	1.0
+chr3	938	0.0	1.0	1.0
+chr3	1235	0.0	1.0	1.0
+chr3	1237	1.0	0.0	1.0
+chr3	1252	1.0	0.0	1.0
+chr3	1284	2.0	0.0	2.0
+chr3	1468	1.0	0.0	1.0
+chr3	2027	0.0	1.0	1.0
+chr3	2502	1.0	0.0	1.0
+chr3	2654	0.0	1.0	1.0
+chr3	3296	0.0	1.0	1.0
+chr3	3655	1.0	0.0	1.0
+chr3	4129	0.0	1.0	1.0
+chr3	4178	2.0	0.0	2.0
+chr3	4313	1.0	0.0	1.0
+chr3	4427	1.0	0.0	1.0
+chr3	4447	1.0	0.0	1.0
+chr3	4456	1.0	0.0	1.0
+chr3	4476	0.0	1.0	1.0
+chr3	4785	1.0	0.0	1.0
+chr3	4849	0.0	1.0	1.0
+chr3	5210	1.0	0.0	1.0
+chr3	5659	0.0	1.0	1.0
+chr3	5941	1.0	0.0	1.0
+chr3	6156	0.0	1.0	1.0
+chr3	6184	1.0	0.0	1.0
+chr3	6342	0.0	1.0	1.0
+chr3	6363	0.0	1.0	1.0
+chr3	6395	1.0	0.0	1.0
+chr3	6533	1.0	0.0	1.0
+chr3	6562	0.0	2.0	2.0
+chr3	6590	0.0	2.0	2.0
+chr3	6592	1.0	0.0	1.0
+chr3	6602	0.0	1.0	1.0
+chr3	6607	0.0	1.0	1.0
+chr3	6619	1.0	0.0	1.0
+chr3	6713	0.0	1.0	1.0
+chr3	6765	0.0	1.0	1.0
+chr3	6766	0.0	5.0	5.0
+chr3	6777	0.0	1.0	1.0
+chr3	6802	0.0	1.0	1.0
+chr3	6865	1.0	0.0	1.0
+chr3	6881	1.0	0.0	1.0
+chr3	6939	4.0	0.0	4.0
+chr3	6943	0.0	1.0	1.0
+chr3	7081	0.0	1.0	1.0
+chr3	7098	0.0	1.0	1.0
+chr3	7099	0.0	1.0	1.0
+chr3	7114	1.0	0.0	1.0
+chr3	7121	1.0	0.0	1.0
+chr3	7123	2.0	0.0	2.0
+chr3	7126	0.0	1.0	1.0
+chr3	7130	1.0	0.0	1.0
+chr3	7137	0.0	1.0	1.0
+chr3	7145	0.0	1.0	1.0
+chr3	7257	1.0	0.0	1.0
+chr3	7268	1.0	0.0	1.0
+chr3	7269	0.0	1.0	1.0
+chr3	7323	0.0	1.0	1.0
+chr3	7327	0.0	1.0	1.0
+chr3	7329	0.0	1.0	1.0
+chr3	7346	1.0	0.0	1.0
+chr3	7376	0.0	1.0	1.0
+chr3	7377	0.0	1.0	1.0
+chr3	7428	0.0	1.0	1.0
+chr3	7454	0.0	1.0	1.0
+chr3	7484	0.0	2.0	2.0
+chr3	7487	1.0	0.0	1.0
+chr3	7498	1.0	0.0	1.0
+chr3	7514	0.0	1.0	1.0
+chr3	7564	1.0	0.0	1.0
+chr3	7685	0.0	1.0	1.0
+chr3	7706	1.0	0.0	1.0
+chr3	7835	1.0	0.0	1.0
+chr3	7845	0.0	1.0	1.0
+chr3	7905	0.0	1.0	1.0
+chr3	7937	0.0	1.0	1.0
+chr3	7954	1.0	0.0	1.0
+chr3	7982	0.0	2.0	2.0
+chr3	8031	0.0	1.0	1.0
+chr3	8053	4.0	0.0	4.0
+chr3	8054	1.0	0.0	1.0
+chr3	8065	1.0	0.0	1.0
+chr3	8074	1.0	0.0	1.0
+chr3	8099	1.0	0.0	1.0
+chr3	8104	0.0	1.0	1.0
+chr3	8109	0.0	1.0	1.0
+chr3	8221	1.0	0.0	1.0
+chr3	8247	0.0	1.0	1.0
+chr3	8257	1.0	0.0	1.0
+chr3	8258	0.0	1.0	1.0
+chr3	8265	1.0	0.0	1.0
+chr3	8266	1.0	0.0	1.0
+chr3	8270	3.0	0.0	3.0
+chr3	8275	0.0	1.0	1.0
+chr3	8277	1.0	0.0	1.0
+chr3	8292	0.0	1.0	1.0
+chr3	8295	1.0	0.0	1.0
+chr3	8609	1.0	0.0	1.0
+chr3	8647	0.0	1.0	1.0
+chr3	8657	0.0	1.0	1.0
+chr3	8670	1.0	0.0	1.0
+chr3	8675	0.0	1.0	1.0
+chr3	8783	1.0	0.0	1.0
+chr3	8813	1.0	0.0	1.0
+chr3	8831	0.0	1.0	1.0
+chr3	8862	1.0	0.0	1.0
+chr3	8893	0.0	1.0	1.0
+chr3	8923	0.0	2.0	2.0
+chr3	8926	0.0	1.0	1.0
+chr3	8929	0.0	1.0	1.0
+chr3	8936	1.0	0.0	1.0
+chr3	8937	1.0	0.0	1.0
+chr3	8943	0.0	2.0	2.0
+chr3	8944	0.0	1.0	1.0
+chr3	8951	1.0	0.0	1.0
+chr3	8960	0.0	1.0	1.0
+chr3	8982	1.0	0.0	1.0
+chr3	8996	0.0	1.0	1.0
+chr3	9383	0.0	1.0	1.0
+chr3	9574	1.0	0.0	1.0
+chr3	9579	0.0	1.0	1.0
+chr3	9584	0.0	1.0	1.0
+chr3	9740	1.0	0.0	1.0
+chr3	10153	1.0	0.0	1.0
+chr3	10299	1.0	0.0	1.0
+chr3	10367	1.0	0.0	1.0
+chr3	10519	0.0	1.0	1.0
+chr3	10669	0.0	1.0	1.0
+chr3	10741	1.0	0.0	1.0
+chr3	10744	2.0	0.0	2.0
+chr3	10755	0.0	1.0	1.0
+chr3	10757	1.0	0.0	1.0
+chr3	10846	0.0	1.0	1.0
+chr3	10909	1.0	0.0	1.0
+chr3	10923	1.0	0.0	1.0
+chr3	10932	1.0	0.0	1.0
+chr3	10947	0.0	1.0	1.0
+chr3	10951	0.0	1.0	1.0
+chr3	10960	1.0	0.0	1.0
+chr3	10967	3.0	0.0	3.0
+chr3	10979	1.0	0.0	1.0
+chr3	10990	0.0	1.0	1.0
+chr3	10992	0.0	1.0	1.0
+chr3	11015	0.0	1.0	1.0
+chr3	11631	0.0	1.0	1.0
+chr3	11701	0.0	1.0	1.0
+chr3	11757	0.0	1.0	1.0
+chr3	11794	0.0	1.0	1.0
+chr3	11815	1.0	0.0	1.0
+chr3	11844	0.0	1.0	1.0
+chr3	11931	1.0	0.0	1.0
+chr3	11933	0.0	1.0	1.0
+chr3	11936	1.0	0.0	1.0
+chr3	11980	0.0	1.0	1.0
+chr3	12028	0.0	1.0	1.0
+chr3	12095	0.0	1.0	1.0
+chr3	12109	1.0	0.0	1.0
+chr3	12119	1.0	0.0	1.0
+chr3	12122	0.0	1.0	1.0
+chr3	12133	0.0	1.0	1.0
+chr3	12136	0.0	1.0	1.0
+chr3	12137	0.0	1.0	1.0
+chr3	12192	0.0	1.0	1.0
+chr3	12246	1.0	0.0	1.0
+chr3	12250	0.0	1.0	1.0
+chr3	12254	1.0	1.0	2.0
+chr3	12259	0.0	1.0	1.0
+chr3	12260	2.0	0.0	2.0
+chr3	12263	1.0	0.0	1.0
+chr3	12495	0.0	1.0	1.0
+chr3	12537	1.0	0.0	1.0
+chr3	12651	0.0	1.0	1.0
+chr3	12799	1.0	0.0	1.0
+chr3	12805	0.0	1.0	1.0
+chr3	12809	1.0	0.0	1.0
+chr3	12820	1.0	0.0	1.0
+chr3	12829	0.0	1.0	1.0
+chr3	12830	1.0	2.0	3.0
+chr3	12838	0.0	1.0	1.0
+chr3	12840	0.0	1.0	1.0
+chr3	12849	0.0	1.0	1.0
+chr3	12850	0.0	1.0	1.0
+chr3	12856	0.0	1.0	1.0
+chr3	13777	0.0	1.0	1.0
+chr3	13781	1.0	0.0	1.0
+chr3	13782	1.0	0.0	1.0
+chr3	13790	0.0	1.0	1.0
+chr3	13798	0.0	1.0	1.0
+chr3	13799	0.0	1.0	1.0
+chr3	13800	1.0	0.0	1.0
+chr3	13803	1.0	0.0	1.0
+chr3	13805	0.0	1.0	1.0
+chr3	13811	1.0	0.0	1.0
+chr3	13814	1.0	0.0	1.0
+chr3	13820	0.0	1.0	1.0
+chr3	13823	1.0	0.0	1.0
+chr3	13824	3.0	0.0	3.0
+chr3	13825	2.0	0.0	2.0
+chr3	13828	1.0	0.0	1.0
+chr3	13834	1.0	3.0	4.0
+chr3	13842	0.0	1.0	1.0
+chr3	13850	2.0	0.0	2.0
+chr3	13863	1.0	0.0	1.0
+chr3	13872	1.0	0.0	1.0
+chr3	13991	2.0	0.0	2.0
+chr3	14220	1.0	0.0	1.0
+chr3	14847	1.0	0.0	1.0
+chr3	16031	1.0	0.0	1.0
+chr3	16145	1.0	0.0	1.0
+chr3	16238	0.0	1.0	1.0
+chr3	16418	0.0	1.0	1.0
+chr3	16572	1.0	0.0	1.0
+chr3	16601	0.0	1.0	1.0
+chr3	16777	1.0	0.0	1.0
+chr3	16917	0.0	1.0	1.0
+chr3	16927	0.0	1.0	1.0
+chr3	16947	1.0	0.0	1.0
+chr3	16950	0.0	1.0	1.0
+chr3	17282	1.0	0.0	1.0
+chr3	17284	0.0	4.0	4.0
+chr3	17296	1.0	0.0	1.0
+chr3	17298	0.0	1.0	1.0
+chr3	17304	3.0	0.0	3.0
+chr3	17305	1.0	0.0	1.0
+chr3	17306	1.0	0.0	1.0
+chr3	17308	0.0	3.0	3.0
+chr3	17311	0.0	3.0	3.0
+chr3	17313	1.0	4.0	5.0
+chr3	17314	1.0	0.0	1.0
+chr3	17315	1.0	2.0	3.0
+chr3	17318	1.0	2.0	3.0
+chr3	17321	0.0	1.0	1.0
+chr3	17323	1.0	0.0	1.0
+chr3	17324	4.0	0.0	4.0
+chr3	17326	1.0	0.0	1.0
+chr3	17327	3.0	0.0	3.0
+chr3	17328	1.0	0.0	1.0
+chr3	17329	0.0	1.0	1.0
+chr3	17330	1.0	0.0	1.0
+chr3	17333	0.0	1.0	1.0
+chr3	17339	1.0	0.0	1.0
+chr3	17340	3.0	0.0	3.0
+chr3	17344	1.0	0.0	1.0
+chr3	17363	1.0	0.0	1.0
+chr3	17479	0.0	1.0	1.0
+chr3	17480	1.0	0.0	1.0
+chr3	17500	1.0	0.0	1.0
+chr3	17650	0.0	1.0	1.0
+chr3	17672	1.0	0.0	1.0
+chr3	17679	0.0	1.0	1.0
+chr3	17807	1.0	0.0	1.0
+chr3	18020	1.0	0.0	1.0
+chr3	18114	1.0	0.0	1.0
+chr3	18128	0.0	1.0	1.0
+chr3	18970	1.0	0.0	1.0
+chr3	19088	1.0	0.0	1.0
+chr3	19162	1.0	0.0	1.0
+chr3	19342	1.0	0.0	1.0
+chr3	19455	1.0	0.0	1.0
+chr3	19581	0.0	1.0	1.0
+chr3	19607	1.0	0.0	1.0
+chr3	19860	0.0	2.0	2.0
+chr3	20060	1.0	0.0	1.0
+chr3	20196	1.0	0.0	1.0
+chr3	20221	0.0	1.0	1.0
+chr3	20225	0.0	1.0	1.0
+chr3	20231	1.0	0.0	1.0
+chr3	20405	0.0	1.0	1.0
+chr3	20509	1.0	0.0	1.0
+chr3	20708	0.0	1.0	1.0
+chr3	20833	1.0	0.0	1.0
+chr3	20835	1.0	0.0	1.0
+chr3	20895	0.0	1.0	1.0
+chr3	20920	1.0	0.0	1.0
+chr3	21084	1.0	0.0	1.0
+chr3	21316	1.0	0.0	1.0
+chr3	21336	0.0	1.0	1.0
+chr3	21436	1.0	0.0	1.0
+chr3	21569	0.0	1.0	1.0
+chr3	21570	0.0	1.0	1.0
+chr3	21576	1.0	0.0	1.0
+chr3	21611	1.0	0.0	1.0
+chr3	21740	0.0	1.0	1.0
+chr3	21751	0.0	1.0	1.0
+chr3	21754	0.0	1.0	1.0
+chr3	21757	1.0	0.0	1.0
+chr3	21760	1.0	0.0	1.0
+chr3	21788	0.0	1.0	1.0
+chr3	21929	0.0	1.0	1.0
+chr3	21934	1.0	0.0	1.0
+chr3	21935	1.0	0.0	1.0
+chr3	21939	1.0	0.0	1.0
+chr3	21943	0.0	1.0	1.0
+chr3	21946	1.0	0.0	1.0
+chr3	21948	1.0	1.0	2.0
+chr3	21950	1.0	0.0	1.0
+chr3	21953	0.0	1.0	1.0
+chr3	22076	0.0	1.0	1.0
+chr3	22078	1.0	0.0	1.0
+chr3	22080	0.0	2.0	2.0
+chr3	22081	0.0	1.0	1.0
+chr3	22083	1.0	0.0	1.0
+chr3	22086	1.0	0.0	1.0
+chr3	22093	0.0	2.0	2.0
+chr3	22095	0.0	1.0	1.0
+chr3	22096	1.0	0.0	1.0
+chr3	22100	5.0	0.0	5.0
+chr3	22101	7.0	0.0	7.0
+chr3	22102	1.0	1.0	2.0
+chr3	22103	0.0	1.0	1.0
+chr3	22106	0.0	1.0	1.0
+chr3	22107	0.0	2.0	2.0
+chr3	22111	0.0	2.0	2.0
+chr3	22114	0.0	1.0	1.0
+chr3	22116	0.0	1.0	1.0
+chr3	22118	1.0	0.0	1.0
+chr3	22122	1.0	0.0	1.0
+chr3	22132	1.0	1.0	2.0
+chr3	22141	1.0	0.0	1.0
+chr3	22149	1.0	0.0	1.0
+chr3	22200	1.0	0.0	1.0
+chr3	22312	0.0	1.0	1.0
+chr3	22368	0.0	1.0	1.0
+chr3	22546	1.0	0.0	1.0
+chr3	22653	0.0	2.0	2.0
+chr3	22855	0.0	1.0	1.0
+chr3	22862	0.0	1.0	1.0
+chr3	22863	0.0	1.0	1.0
+chr3	23148	1.0	0.0	1.0
+chr3	23153	0.0	1.0	1.0
+chr3	23164	0.0	1.0	1.0
+chr3	23297	0.0	2.0	2.0
+chr3	23322	0.0	1.0	1.0
+chr3	23324	0.0	1.0	1.0
+chr3	23330	1.0	0.0	1.0
+chr3	23331	1.0	0.0	1.0
+chr3	23333	2.0	0.0	2.0
+chr3	23335	4.0	0.0	4.0
+chr3	23345	2.0	0.0	2.0
+chr3	23348	0.0	1.0	1.0
+chr3	23349	0.0	2.0	2.0
+chr3	23351	2.0	1.0	3.0
+chr3	23354	1.0	3.0	4.0
+chr3	23355	0.0	1.0	1.0
+chr3	23356	0.0	3.0	3.0
+chr3	23360	0.0	1.0	1.0
+chr3	23370	0.0	1.0	1.0
+chr3	23372	0.0	1.0	1.0
+chr3	23373	1.0	1.0	2.0
+chr3	23390	0.0	1.0	1.0
+chr3	23591	1.0	0.0	1.0
+chr3	23595	1.0	0.0	1.0
+chr3	23602	0.0	1.0	1.0
+chr3	23603	0.0	2.0	2.0
+chr3	23606	1.0	1.0	2.0
+chr3	23615	0.0	2.0	2.0
+chr3	23619	1.0	2.0	3.0
+chr3	23621	1.0	0.0	1.0
+chr3	23623	0.0	2.0	2.0
+chr3	23626	0.0	1.0	1.0
+chr3	23628	1.0	0.0	1.0
+chr3	23629	0.0	1.0	1.0
+chr3	23650	0.0	1.0	1.0
+chr3	23792	1.0	0.0	1.0
+chr3	23795	0.0	1.0	1.0
+chr3	23991	0.0	1.0	1.0
+chr3	24113	1.0	1.0	2.0
+chr3	24122	1.0	0.0	1.0
+chr3	24131	0.0	1.0	1.0
+chr3	24132	0.0	1.0	1.0
+chr3	24143	1.0	0.0	1.0
+chr3	24145	1.0	1.0	2.0
+chr3	24196	0.0	1.0	1.0
+chr3	24255	1.0	0.0	1.0
+chr3	24269	0.0	1.0	1.0
+chr3	24294	4.0	2.0	6.0
+chr3	24295	1.0	1.0	2.0
+chr3	24296	1.0	0.0	1.0
+chr3	24299	0.0	1.0	1.0
+chr3	24302	1.0	0.0	1.0
+chr3	24303	7.0	0.0	7.0
+chr3	24305	3.0	0.0	3.0
+chr3	24307	1.0	0.0	1.0
+chr3	24308	0.0	2.0	2.0
+chr3	24310	1.0	0.0	1.0
+chr3	24314	1.0	0.0	1.0
+chr3	24317	0.0	1.0	1.0
+chr3	24320	0.0	1.0	1.0
+chr3	24322	0.0	1.0	1.0
+chr3	24323	0.0	1.0	1.0
+chr3	24379	0.0	1.0	1.0
+chr3	24486	1.0	0.0	1.0
+chr3	24504	1.0	0.0	1.0
+chr3	24509	1.0	0.0	1.0
+chr3	24536	0.0	1.0	1.0
+chr3	24569	1.0	0.0	1.0
+chr3	24583	0.0	2.0	2.0
+chr3	24592	0.0	2.0	2.0
+chr3	24602	1.0	0.0	1.0
+chr3	24776	1.0	0.0	1.0
+chr3	24782	0.0	1.0	1.0
+chr3	24784	0.0	1.0	1.0
+chr3	24791	1.0	0.0	1.0
+chr3	24792	3.0	0.0	3.0
+chr3	24795	1.0	0.0	1.0
+chr3	24796	2.0	12.0	14.0
+chr3	24798	0.0	1.0	1.0
+chr3	24801	1.0	0.0	1.0
+chr3	24804	1.0	0.0	1.0
+chr3	24805	1.0	0.0	1.0
+chr3	24807	0.0	1.0	1.0
+chr3	24811	2.0	0.0	2.0
+chr3	24816	0.0	1.0	1.0
+chr3	24817	0.0	5.0	5.0
+chr3	24818	0.0	10.0	10.0
+chr3	24823	1.0	0.0	1.0
+chr3	24824	7.0	0.0	7.0
+chr3	24833	1.0	0.0	1.0
+chr3	24836	2.0	0.0	2.0
+chr3	24841	0.0	1.0	1.0
+chr3	24851	1.0	0.0	1.0
+chr3	24938	1.0	0.0	1.0
+chr3	24967	2.0	0.0	2.0
+chr3	24973	0.0	1.0	1.0
+chr3	24980	0.0	1.0	1.0
+chr3	24991	1.0	0.0	1.0
+chr3	25009	1.0	0.0	1.0
+chr3	25087	0.0	1.0	1.0
+chr3	25133	0.0	1.0	1.0
+chr3	25139	1.0	0.0	1.0
+chr3	25140	3.0	0.0	3.0
+chr3	25146	1.0	0.0	1.0
+chr3	25150	0.0	1.0	1.0
+chr3	25168	1.0	0.0	1.0
+chr3	25598	1.0	0.0	1.0
+chr3	25797	0.0	1.0	1.0
+chr3	26120	1.0	0.0	1.0
+chr3	26124	0.0	1.0	1.0
+chr3	26345	0.0	1.0	1.0
+chr3	26672	1.0	0.0	1.0
+chr3	26712	2.0	0.0	2.0
+chr3	26841	1.0	0.0	1.0
+chr3	27151	0.0	1.0	1.0
+chr3	27156	1.0	1.0	2.0
+chr3	27157	1.0	0.0	1.0
+chr3	27305	1.0	0.0	1.0
+chr3	27308	0.0	2.0	2.0
+chr3	27309	1.0	1.0	2.0
+chr3	27315	0.0	1.0	1.0
+chr3	27326	3.0	0.0	3.0
+chr3	27330	0.0	1.0	1.0
+chr3	27332	1.0	0.0	1.0
+chr3	27336	1.0	0.0	1.0
+chr3	27337	1.0	0.0	1.0
+chr3	27504	0.0	1.0	1.0
+chr3	27510	0.0	1.0	1.0
+chr3	27512	3.0	0.0	3.0
+chr3	27513	0.0	1.0	1.0
+chr3	27550	2.0	0.0	2.0
+chr3	27553	1.0	0.0	1.0
+chr3	27554	1.0	1.0	2.0
+chr3	27770	1.0	0.0	1.0
+chr3	27936	0.0	1.0	1.0
+chr3	27945	1.0	1.0	2.0
+chr3	27950	1.0	0.0	1.0
+chr3	27953	1.0	0.0	1.0
+chr3	27954	1.0	1.0	2.0
+chr3	27957	1.0	0.0	1.0
+chr3	27959	0.0	1.0	1.0
+chr3	27962	0.0	1.0	1.0
+chr3	27963	0.0	1.0	1.0
+chr3	27972	1.0	0.0	1.0
+chr3	27973	1.0	0.0	1.0
+chr3	27978	0.0	2.0	2.0
+chr3	28140	0.0	1.0	1.0
+chr3	28189	0.0	1.0	1.0
+chr3	28274	2.0	0.0	2.0
+chr3	28289	1.0	0.0	1.0
+chr3	28577	1.0	0.0	1.0
+chr3	28722	0.0	1.0	1.0
+chr3	28740	0.0	1.0	1.0
+chr3	28775	1.0	0.0	1.0
+chr3	28844	1.0	0.0	1.0
+chr3	29027	0.0	1.0	1.0
+chr3	29050	1.0	0.0	1.0
+chr3	29616	3.0	0.0	3.0
+chr3	30065	1.0	0.0	1.0
+chr3	30188	1.0	0.0	1.0
+chr3	30222	1.0	0.0	1.0
+chr3	30237	0.0	2.0	2.0
+chr3	30248	0.0	1.0	1.0
+chr3	30442	0.0	1.0	1.0
+chr3	30697	0.0	1.0	1.0
+chr3	30762	0.0	1.0	1.0
+chr3	30785	0.0	1.0	1.0
+chr3	30928	0.0	1.0	1.0
+chr3	30942	1.0	0.0	1.0
+chr3	30952	0.0	1.0	1.0
+chr3	31074	0.0	1.0	1.0
+chr3	31085	2.0	0.0	2.0
+chr3	31102	0.0	1.0	1.0
+chr3	31105	0.0	1.0	1.0
+chr3	31131	1.0	0.0	1.0
+chr3	31133	2.0	0.0	2.0
+chr3	31139	1.0	0.0	1.0
+chr3	31143	0.0	3.0	3.0
+chr3	31152	1.0	0.0	1.0
+chr3	31153	1.0	0.0	1.0
+chr3	31155	0.0	1.0	1.0
+chr3	31434	1.0	0.0	1.0
+chr3	31445	2.0	0.0	2.0
+chr3	31452	1.0	0.0	1.0
+chr3	31453	2.0	0.0	2.0
+chr3	31457	2.0	0.0	2.0
+chr3	31461	1.0	0.0	1.0
+chr3	31462	0.0	2.0	2.0
+chr3	31463	1.0	0.0	1.0
+chr3	31466	1.0	5.0	6.0
+chr3	31493	0.0	1.0	1.0
+chr3	31494	1.0	0.0	1.0
+chr3	31502	0.0	1.0	1.0
+chr3	31573	1.0	0.0	1.0
+chr3	31592	0.0	1.0	1.0
+chr3	31606	0.0	1.0	1.0
+chr3	31608	0.0	1.0	1.0
+chr3	31618	0.0	2.0	2.0
+chr3	31622	2.0	0.0	2.0
+chr3	31632	1.0	0.0	1.0
+chr3	31634	0.0	1.0	1.0
+chr3	31639	0.0	1.0	1.0
+chr3	31653	2.0	0.0	2.0
+chr3	31768	1.0	0.0	1.0
+chr3	31779	0.0	2.0	2.0
+chr3	31786	0.0	1.0	1.0
+chr3	31815	1.0	0.0	1.0
+chr3	31819	0.0	1.0	1.0
+chr3	31871	0.0	1.0	1.0
+chr3	31965	0.0	1.0	1.0
+chr3	32135	0.0	2.0	2.0
+chr3	32226	1.0	0.0	1.0
+chr3	32860	1.0	0.0	1.0
+chr3	32944	1.0	0.0	1.0
+chr3	32947	0.0	1.0	1.0
+chr3	33470	0.0	1.0	1.0
+chr3	33484	0.0	1.0	1.0
+chr3	33749	1.0	0.0	1.0
+chr3	34231	1.0	0.0	1.0
+chr3	34297	0.0	2.0	2.0
+chr3	34349	0.0	1.0	1.0
+chr3	34862	0.0	1.0	1.0
+chr3	34863	1.0	0.0	1.0
+chr3	34874	1.0	0.0	1.0
+chr3	34884	0.0	2.0	2.0
+chr3	34894	1.0	0.0	1.0
+chr3	35023	1.0	0.0	1.0
+chr3	35028	1.0	0.0	1.0
+chr3	35039	1.0	0.0	1.0
+chr3	35185	0.0	1.0	1.0
+chr3	35189	1.0	1.0	2.0
+chr3	35207	0.0	1.0	1.0
+chr3	35225	0.0	1.0	1.0
+chr3	35249	2.0	0.0	2.0
+chr3	35326	1.0	0.0	1.0
+chr3	35348	1.0	0.0	1.0
+chr3	35349	0.0	3.0	3.0
+chr3	35350	0.0	1.0	1.0
+chr3	35355	1.0	0.0	1.0
+chr3	35357	3.0	0.0	3.0
+chr3	35358	1.0	0.0	1.0
+chr3	35360	0.0	1.0	1.0
+chr3	35362	0.0	1.0	1.0
+chr3	35364	0.0	1.0	1.0
+chr3	35365	4.0	1.0	5.0
+chr3	35366	0.0	1.0	1.0
+chr3	35367	0.0	1.0	1.0
+chr3	35368	3.0	1.0	4.0
+chr3	35369	0.0	1.0	1.0
+chr3	35370	0.0	2.0	2.0
+chr3	35371	0.0	2.0	2.0
+chr3	35372	0.0	1.0	1.0
+chr3	35378	1.0	1.0	2.0
+chr3	35380	1.0	0.0	1.0
+chr3	35384	0.0	1.0	1.0
+chr3	35385	2.0	0.0	2.0
+chr3	35386	3.0	0.0	3.0
+chr3	35387	2.0	0.0	2.0
+chr3	35388	0.0	6.0	6.0
+chr3	35389	0.0	1.0	1.0
+chr3	35390	0.0	5.0	5.0
+chr3	35399	1.0	1.0	2.0
+chr3	35411	1.0	0.0	1.0
+chr3	35599	0.0	1.0	1.0
+chr3	35601	1.0	0.0	1.0
+chr3	35603	1.0	0.0	1.0
+chr3	35616	4.0	0.0	4.0
+chr3	35622	5.0	0.0	5.0
+chr3	35623	5.0	0.0	5.0
+chr3	35624	0.0	1.0	1.0
+chr3	35625	0.0	4.0	4.0
+chr3	35629	0.0	1.0	1.0
+chr3	35630	0.0	1.0	1.0
+chr3	35635	0.0	1.0	1.0
+chr3	35639	1.0	0.0	1.0
+chr3	35640	0.0	3.0	3.0
+chr3	35641	0.0	1.0	1.0
+chr3	35643	1.0	0.0	1.0
+chr3	35647	0.0	1.0	1.0
+chr3	35672	1.0	0.0	1.0
+chr3	35779	0.0	1.0	1.0
+chr3	35781	0.0	1.0	1.0
+chr3	35899	0.0	1.0	1.0
+chr3	35917	1.0	0.0	1.0
+chr3	35935	0.0	1.0	1.0
+chr3	35940	0.0	1.0	1.0
+chr3	35965	0.0	1.0	1.0
+chr3	36264	1.0	0.0	1.0
+chr3	36301	1.0	0.0	1.0
+chr3	36451	0.0	1.0	1.0
+chr3	36753	1.0	0.0	1.0
+chr3	36995	0.0	1.0	1.0
+chr3	37591	1.0	0.0	1.0
+chr3	37909	1.0	0.0	1.0
+chr3	37994	1.0	0.0	1.0
+chr3	38205	0.0	1.0	1.0
+chr3	38238	0.0	1.0	1.0
+chr3	38395	1.0	0.0	1.0
+chr3	38453	0.0	1.0	1.0
+chr3	38490	1.0	0.0	1.0
+chr3	38635	0.0	1.0	1.0
+chr3	38648	1.0	0.0	1.0
+chr3	38650	0.0	1.0	1.0
+chr3	38654	1.0	0.0	1.0
+chr3	38657	1.0	0.0	1.0
+chr3	38826	0.0	2.0	2.0
+chr3	39040	1.0	0.0	1.0
+chr3	39063	1.0	0.0	1.0
+chr3	39068	0.0	1.0	1.0
+chr3	39072	0.0	1.0	1.0
+chr3	39080	0.0	1.0	1.0
+chr3	39082	1.0	0.0	1.0
+chr3	39094	1.0	0.0	1.0
+chr3	39095	0.0	1.0	1.0
+chr3	39101	0.0	2.0	2.0
+chr3	39102	0.0	2.0	2.0
+chr3	39103	1.0	1.0	2.0
+chr3	39108	0.0	1.0	1.0
+chr3	39111	1.0	0.0	1.0
+chr3	39116	0.0	2.0	2.0
+chr3	39117	1.0	0.0	1.0
+chr3	39121	1.0	0.0	1.0
+chr3	39123	0.0	1.0	1.0
+chr3	39130	1.0	0.0	1.0
+chr3	39132	2.0	0.0	2.0
+chr3	39246	0.0	1.0	1.0
+chr3	39251	1.0	0.0	1.0
+chr3	39260	1.0	0.0	1.0
+chr3	39262	0.0	1.0	1.0
+chr3	39264	0.0	1.0	1.0
+chr3	39273	1.0	0.0	1.0
+chr3	39274	1.0	0.0	1.0
+chr3	39317	1.0	0.0	1.0
+chr3	39378	0.0	1.0	1.0
+chr3	39379	0.0	2.0	2.0
+chr3	39384	3.0	0.0	3.0
+chr3	39394	0.0	1.0	1.0
+chr3	39398	2.0	3.0	5.0
+chr3	39399	0.0	2.0	2.0
+chr3	39403	4.0	0.0	4.0
+chr3	39415	0.0	1.0	1.0
+chr3	39418	2.0	0.0	2.0
+chr3	39419	1.0	0.0	1.0
+chr3	39427	1.0	0.0	1.0
+chr3	39429	0.0	3.0	3.0
+chr3	39434	1.0	0.0	1.0
+chr3	39435	0.0	1.0	1.0
+chr3	39440	0.0	2.0	2.0
+chr3	39683	1.0	0.0	1.0
+chr3	39702	1.0	0.0	1.0
+chr3	39706	1.0	0.0	1.0
+chr3	39867	2.0	0.0	2.0
+chr3	39877	0.0	1.0	1.0
+chr3	39879	1.0	0.0	1.0
+chr3	39888	1.0	1.0	2.0
+chr3	39994	1.0	0.0	1.0
+chr3	40000	1.0	0.0	1.0
+chr3	40025	1.0	0.0	1.0
+chr3	40052	1.0	0.0	1.0
+chr3	40066	0.0	1.0	1.0
+chr3	40072	1.0	0.0	1.0
+chr3	40228	0.0	1.0	1.0
+chr3	40247	1.0	0.0	1.0
+chr3	40332	0.0	1.0	1.0
+chr3	40353	0.0	1.0	1.0
+chr3	40361	1.0	0.0	1.0
+chr3	40380	1.0	0.0	1.0
+chr3	40401	1.0	0.0	1.0
+chr3	40403	1.0	0.0	1.0
+chr3	40408	0.0	1.0	1.0
+chr3	40419	0.0	1.0	1.0
+chr3	40529	0.0	1.0	1.0
+chr3	40532	0.0	1.0	1.0
+chr3	40554	1.0	0.0	1.0
+chr3	40560	0.0	1.0	1.0
+chr3	40648	1.0	0.0	1.0
+chr3	40699	0.0	2.0	2.0
+chr3	40700	0.0	1.0	1.0
+chr3	40712	3.0	0.0	3.0
+chr3	40713	0.0	1.0	1.0
+chr3	40714	0.0	1.0	1.0
+chr3	40715	1.0	0.0	1.0
+chr3	40717	2.0	0.0	2.0
+chr3	40724	3.0	0.0	3.0
+chr3	40730	2.0	0.0	2.0
+chr3	40732	0.0	1.0	1.0
+chr3	40735	0.0	1.0	1.0
+chr3	40736	0.0	2.0	2.0
+chr3	40738	1.0	0.0	1.0
+chr3	40741	0.0	2.0	2.0
+chr3	40742	0.0	1.0	1.0
+chr3	40743	0.0	1.0	1.0
+chr3	40896	0.0	1.0	1.0
+chr3	40900	0.0	1.0	1.0
+chr3	40916	0.0	1.0	1.0
+chr3	40918	1.0	1.0	2.0
+chr3	40922	0.0	1.0	1.0
+chr3	40926	0.0	1.0	1.0
+chr3	40933	1.0	0.0	1.0
+chr3	40934	1.0	0.0	1.0
+chr3	40942	0.0	2.0	2.0
+chr3	40943	1.0	3.0	4.0
+chr3	40944	1.0	2.0	3.0
+chr3	40945	2.0	0.0	2.0
+chr3	40951	2.0	0.0	2.0
+chr3	40954	1.0	0.0	1.0
+chr3	40956	5.0	0.0	5.0
+chr3	40957	0.0	4.0	4.0
+chr3	40958	0.0	1.0	1.0
+chr3	40960	1.0	0.0	1.0
+chr3	40964	1.0	0.0	1.0
+chr3	40965	3.0	0.0	3.0
+chr3	40971	0.0	2.0	2.0
+chr3	40976	0.0	1.0	1.0
+chr3	40978	1.0	0.0	1.0
+chr3	40982	3.0	0.0	3.0
+chr3	40983	1.0	0.0	1.0
+chr3	40984	0.0	3.0	3.0
+chr3	40989	1.0	0.0	1.0
+chr3	40990	1.0	0.0	1.0
+chr3	40998	2.0	0.0	2.0
+chr3	41002	4.0	0.0	4.0
+chr3	41004	0.0	1.0	1.0
+chr3	41005	0.0	1.0	1.0
+chr3	41009	1.0	0.0	1.0
+chr3	41027	0.0	1.0	1.0
+chr3	41028	0.0	1.0	1.0
+chr3	41031	1.0	0.0	1.0
+chr3	41038	0.0	1.0	1.0
+chr3	41048	1.0	0.0	1.0
+chr3	41049	1.0	0.0	1.0
+chr3	41070	0.0	1.0	1.0
+chr3	41123	1.0	0.0	1.0
+chr3	41133	1.0	0.0	1.0
+chr3	41137	1.0	0.0	1.0
+chr3	41159	0.0	1.0	1.0
+chr3	41169	1.0	0.0	1.0
+chr3	41171	0.0	1.0	1.0
+chr3	41179	1.0	0.0	1.0
+chr3	41188	0.0	1.0	1.0
+chr3	41353	0.0	1.0	1.0
+chr3	41517	0.0	1.0	1.0
+chr3	41522	0.0	1.0	1.0
+chr3	41526	1.0	0.0	1.0
+chr3	41532	0.0	1.0	1.0
+chr3	41547	1.0	0.0	1.0
+chr3	41665	2.0	0.0	2.0
+chr3	41671	0.0	1.0	1.0
+chr3	41673	0.0	1.0	1.0
+chr3	41683	1.0	0.0	1.0
+chr3	41686	1.0	0.0	1.0
+chr3	41691	0.0	4.0	4.0
+chr3	41699	1.0	0.0	1.0
+chr3	41710	0.0	2.0	2.0
+chr3	42109	1.0	0.0	1.0
+chr3	42121	0.0	1.0	1.0
+chr3	42129	0.0	1.0	1.0
+chr3	42131	1.0	0.0	1.0
+chr3	42347	1.0	0.0	1.0
+chr3	42362	1.0	0.0	1.0
+chr3	42368	1.0	0.0	1.0
+chr3	42460	1.0	0.0	1.0
+chr3	42626	0.0	2.0	2.0
+chr3	42652	0.0	1.0	1.0
+chr3	42731	0.0	1.0	1.0
+chr3	42816	1.0	0.0	1.0
+chr3	42867	1.0	0.0	1.0
+chr3	42877	0.0	1.0	1.0
+chr3	42904	1.0	0.0	1.0
+chr3	43126	0.0	1.0	1.0
+chr3	43142	1.0	0.0	1.0
+chr3	43149	0.0	1.0	1.0
+chr3	43154	0.0	1.0	1.0
+chr3	43164	1.0	1.0	2.0
+chr3	43169	0.0	2.0	2.0
+chr3	43185	1.0	0.0	1.0
+chr3	43208	2.0	0.0	2.0
+chr3	43217	1.0	0.0	1.0
+chr3	43221	1.0	0.0	1.0
+chr3	43258	0.0	1.0	1.0
+chr3	43312	3.0	0.0	3.0
+chr3	43320	1.0	0.0	1.0
+chr3	43348	1.0	0.0	1.0
+chr3	43353	0.0	1.0	1.0
+chr3	43354	1.0	0.0	1.0
+chr3	43382	0.0	2.0	2.0
+chr3	43395	1.0	0.0	1.0
+chr3	43423	0.0	1.0	1.0
+chr3	43468	0.0	1.0	1.0
+chr3	43514	2.0	0.0	2.0
+chr3	43519	0.0	1.0	1.0
+chr3	43721	0.0	1.0	1.0
+chr3	43852	0.0	1.0	1.0
+chr3	43883	0.0	1.0	1.0
+chr3	43887	0.0	1.0	1.0
+chr3	43888	1.0	0.0	1.0
+chr3	43966	0.0	1.0	1.0
+chr3	43978	1.0	0.0	1.0
+chr3	43985	0.0	1.0	1.0
+chr3	44008	1.0	0.0	1.0
+chr3	44024	0.0	1.0	1.0
+chr3	44154	0.0	1.0	1.0
+chr3	44156	1.0	0.0	1.0
+chr3	44160	1.0	0.0	1.0
+chr3	44164	0.0	2.0	2.0
+chr3	44203	2.0	0.0	2.0
+chr3	44209	1.0	0.0	1.0
+chr3	44210	1.0	0.0	1.0
+chr3	44219	1.0	0.0	1.0
+chr3	44227	2.0	0.0	2.0
+chr3	44243	0.0	1.0	1.0
+chr3	44254	1.0	0.0	1.0
+chr3	44347	1.0	0.0	1.0
+chr3	44355	0.0	1.0	1.0
+chr3	44361	1.0	0.0	1.0
+chr3	44374	1.0	0.0	1.0
+chr3	44383	1.0	1.0	2.0
+chr3	44394	1.0	0.0	1.0
+chr3	44406	12.0	0.0	12.0
+chr3	44409	1.0	0.0	1.0
+chr3	44411	1.0	1.0	2.0
+chr3	44416	3.0	2.0	5.0
+chr3	44417	0.0	1.0	1.0
+chr3	44423	0.0	3.0	3.0
+chr3	44425	1.0	0.0	1.0
+chr3	44426	1.0	0.0	1.0
+chr3	44428	1.0	0.0	1.0
+chr3	44430	0.0	1.0	1.0
+chr3	44436	0.0	2.0	2.0
+chr3	44437	0.0	1.0	1.0
+chr3	44440	2.0	0.0	2.0
+chr3	44477	1.0	0.0	1.0
+chr3	44480	1.0	0.0	1.0
+chr3	44815	0.0	1.0	1.0
+chr3	44920	0.0	1.0	1.0
+chr3	44971	1.0	0.0	1.0
+chr3	45135	1.0	0.0	1.0
+chr3	45320	1.0	0.0	1.0
+chr3	45502	0.0	1.0	1.0
+chr3	46049	1.0	0.0	1.0
+chr3	46462	0.0	1.0	1.0
+chr3	46557	0.0	2.0	2.0
+chr3	46563	0.0	1.0	1.0
+chr3	46564	0.0	1.0	1.0
+chr3	46568	1.0	0.0	1.0
+chr3	46571	0.0	1.0	1.0
+chr3	46575	1.0	0.0	1.0
+chr3	46714	0.0	1.0	1.0
+chr3	46720	2.0	0.0	2.0
+chr3	46726	1.0	0.0	1.0
+chr3	46730	0.0	2.0	2.0
+chr3	46735	1.0	0.0	1.0
+chr3	46738	0.0	1.0	1.0
+chr3	46739	0.0	1.0	1.0
+chr3	46748	1.0	0.0	1.0
+chr3	46749	0.0	2.0	2.0
+chr3	46754	0.0	1.0	1.0
+chr3	46856	0.0	1.0	1.0
+chr3	46862	0.0	1.0	1.0
+chr3	46879	0.0	1.0	1.0
+chr3	46880	2.0	0.0	2.0
+chr3	46881	0.0	1.0	1.0
+chr3	46889	4.0	0.0	4.0
+chr3	46896	1.0	0.0	1.0
+chr3	46898	0.0	6.0	6.0
+chr3	46899	0.0	4.0	4.0
+chr3	46900	0.0	4.0	4.0
+chr3	46903	1.0	0.0	1.0
+chr3	46905	7.0	0.0	7.0
+chr3	46914	0.0	1.0	1.0
+chr3	46928	2.0	0.0	2.0
+chr3	47168	1.0	0.0	1.0
+chr3	47177	0.0	1.0	1.0
+chr3	47182	0.0	2.0	2.0
+chr3	47184	0.0	1.0	1.0
+chr3	47185	0.0	1.0	1.0
+chr3	47187	2.0	0.0	2.0
+chr3	47188	1.0	1.0	2.0
+chr3	47190	0.0	1.0	1.0
+chr3	47196	1.0	0.0	1.0
+chr3	47202	3.0	0.0	3.0
+chr3	47208	2.0	0.0	2.0
+chr3	47215	1.0	0.0	1.0
+chr3	47368	2.0	0.0	2.0
+chr3	47383	1.0	0.0	1.0
+chr3	47530	3.0	0.0	3.0
+chr3	47531	0.0	1.0	1.0
+chr3	47543	1.0	1.0	2.0
+chr3	47570	0.0	1.0	1.0
+chr3	47869	1.0	0.0	1.0
+chr3	47878	1.0	0.0	1.0
+chr3	47896	0.0	1.0	1.0
+chr3	47906	0.0	1.0	1.0
+chr3	47963	1.0	0.0	1.0
+chr3	48001	0.0	1.0	1.0
+chr3	48049	0.0	1.0	1.0
+chr3	48062	2.0	0.0	2.0
+chr3	48179	1.0	0.0	1.0
+chr3	48186	0.0	1.0	1.0
+chr3	48196	1.0	0.0	1.0
+chr3	48203	1.0	0.0	1.0
+chr3	48205	0.0	1.0	1.0
+chr3	48207	2.0	0.0	2.0
+chr3	48214	6.0	1.0	7.0
+chr3	48237	0.0	1.0	1.0
+chr3	48258	1.0	0.0	1.0
+chr3	48353	0.0	1.0	1.0
+chr3	48365	4.0	0.0	4.0
+chr3	48366	0.0	1.0	1.0
+chr3	48375	1.0	8.0	9.0
+chr3	48376	1.0	0.0	1.0
+chr3	48378	1.0	0.0	1.0
+chr3	48379	2.0	0.0	2.0
+chr3	48383	2.0	0.0	2.0
+chr3	48385	1.0	0.0	1.0
+chr3	48390	4.0	0.0	4.0
+chr3	48391	2.0	0.0	2.0
+chr3	48397	0.0	1.0	1.0
+chr3	48403	0.0	1.0	1.0
+chr3	48404	1.0	0.0	1.0
+chr3	48409	1.0	0.0	1.0
+chr3	48410	1.0	0.0	1.0
+chr3	48436	0.0	1.0	1.0
+chr3	48722	2.0	0.0	2.0
+chr3	49013	0.0	1.0	1.0
+chr3	49340	0.0	1.0	1.0
+chr3	49352	0.0	1.0	1.0
+chr3	49537	1.0	0.0	1.0
+chr3	49938	0.0	1.0	1.0
+chr3	50083	0.0	1.0	1.0
+chr3	50117	1.0	0.0	1.0
+chr3	50227	3.0	0.0	3.0
+chr3	50244	0.0	1.0	1.0
+chr3	50248	1.0	0.0	1.0
+chr3	50254	1.0	0.0	1.0
+chr3	50749	1.0	0.0	1.0
+chr3	50750	2.0	0.0	2.0
+chr3	50753	0.0	2.0	2.0
+chr3	50757	0.0	1.0	1.0
+chr3	50765	0.0	4.0	4.0
+chr3	50770	0.0	1.0	1.0
+chr3	50778	0.0	1.0	1.0
+chr3	50813	1.0	0.0	1.0
+chr3	50836	0.0	1.0	1.0
+chr3	50895	0.0	1.0	1.0
+chr3	50933	1.0	0.0	1.0
+chr3	51061	1.0	0.0	1.0
+chr3	51069	0.0	1.0	1.0
+chr3	51077	0.0	1.0	1.0
+chr3	51081	0.0	1.0	1.0
+chr3	51090	1.0	0.0	1.0
+chr3	51101	1.0	0.0	1.0
+chr3	51373	1.0	0.0	1.0
+chr3	51383	1.0	0.0	1.0
+chr3	51393	1.0	0.0	1.0
+chr3	51399	1.0	0.0	1.0
+chr3	51403	1.0	1.0	2.0
+chr3	51406	0.0	1.0	1.0
+chr3	51465	0.0	1.0	1.0
+chr3	51542	1.0	0.0	1.0
+chr3	51546	1.0	1.0	2.0
+chr3	51554	0.0	1.0	1.0
+chr3	51614	0.0	2.0	2.0
+chr3	51615	0.0	3.0	3.0
+chr3	51699	0.0	1.0	1.0
+chr3	51725	0.0	1.0	1.0
+chr3	51866	0.0	1.0	1.0
+chr3	51888	0.0	3.0	3.0
+chr3	51889	0.0	1.0	1.0
+chr3	52196	0.0	1.0	1.0
+chr3	52208	0.0	1.0	1.0
+chr3	52212	0.0	1.0	1.0
+chr3	52338	0.0	1.0	1.0
+chr3	52362	1.0	0.0	1.0
+chr3	52371	1.0	0.0	1.0
+chr3	52390	0.0	1.0	1.0
+chr3	52635	0.0	2.0	2.0
+chr3	52639	1.0	0.0	1.0
+chr3	52642	0.0	1.0	1.0
+chr3	52646	0.0	2.0	2.0
+chr3	52649	1.0	0.0	1.0
+chr3	52654	3.0	0.0	3.0
+chr3	52655	3.0	0.0	3.0
+chr3	52656	1.0	3.0	4.0
+chr3	52659	0.0	1.0	1.0
+chr3	52660	0.0	1.0	1.0
+chr3	52662	2.0	0.0	2.0
+chr3	52663	8.0	0.0	8.0
+chr3	52664	0.0	1.0	1.0
+chr3	52666	0.0	4.0	4.0
+chr3	52667	5.0	0.0	5.0
+chr3	52668	0.0	13.0	13.0
+chr3	52670	0.0	9.0	9.0
+chr3	52671	0.0	2.0	2.0
+chr3	52674	1.0	0.0	1.0
+chr3	52675	1.0	0.0	1.0
+chr3	52676	2.0	0.0	2.0
+chr3	52680	1.0	0.0	1.0
+chr3	52681	2.0	4.0	6.0
+chr3	52682	3.0	0.0	3.0
+chr3	52700	1.0	0.0	1.0
+chr3	52706	1.0	0.0	1.0
+chr3	52719	1.0	0.0	1.0
+chr3	52810	0.0	1.0	1.0
+chr3	52811	0.0	1.0	1.0
+chr3	52822	1.0	3.0	4.0
+chr3	52824	0.0	1.0	1.0
+chr3	52828	1.0	0.0	1.0
+chr3	52830	1.0	0.0	1.0
+chr3	52832	1.0	0.0	1.0
+chr3	52834	1.0	0.0	1.0
+chr3	52837	1.0	0.0	1.0
+chr3	52839	3.0	0.0	3.0
+chr3	52843	0.0	2.0	2.0
+chr3	52849	0.0	1.0	1.0
+chr3	52850	0.0	1.0	1.0
+chr3	52861	0.0	1.0	1.0
+chr3	52963	1.0	0.0	1.0
+chr3	52965	0.0	2.0	2.0
+chr3	52976	4.0	0.0	4.0
+chr3	52980	1.0	0.0	1.0
+chr3	53000	0.0	1.0	1.0
+chr3	53007	1.0	0.0	1.0
+chr3	53009	1.0	0.0	1.0
+chr3	53018	0.0	1.0	1.0
+chr3	53053	0.0	1.0	1.0
+chr3	53158	0.0	1.0	1.0
+chr3	53163	0.0	1.0	1.0
+chr3	53173	1.0	0.0	1.0
+chr3	53176	0.0	1.0	1.0
+chr3	53195	3.0	0.0	3.0
+chr3	53214	0.0	1.0	1.0
+chr3	53308	0.0	1.0	1.0
+chr3	53311	1.0	0.0	1.0
+chr3	53325	1.0	0.0	1.0
+chr3	53333	1.0	0.0	1.0
+chr3	53356	1.0	0.0	1.0
+chr3	53403	1.0	0.0	1.0
+chr3	53548	1.0	0.0	1.0
+chr3	53564	1.0	0.0	1.0
+chr3	53692	0.0	1.0	1.0
+chr3	53699	1.0	0.0	1.0
+chr3	53760	0.0	1.0	1.0
+chr3	53844	0.0	2.0	2.0
+chr3	53902	1.0	0.0	1.0
+chr3	54020	0.0	1.0	1.0
+chr3	54081	1.0	0.0	1.0
+chr3	54202	1.0	0.0	1.0
+chr3	54234	0.0	1.0	1.0
+chr3	54245	0.0	1.0	1.0
+chr3	54266	1.0	0.0	1.0
+chr3	54334	0.0	1.0	1.0
+chr3	54403	0.0	1.0	1.0
+chr3	54543	1.0	0.0	1.0
+chr3	54632	0.0	1.0	1.0
+chr3	54641	1.0	0.0	1.0
+chr3	54736	1.0	0.0	1.0
+chr3	54980	0.0	1.0	1.0
+chr3	55006	0.0	1.0	1.0
+chr3	55008	1.0	0.0	1.0
+chr3	55069	0.0	3.0	3.0
+chr3	55162	0.0	1.0	1.0
+chr3	55168	0.0	1.0	1.0
+chr3	55231	0.0	1.0	1.0
+chr3	55360	0.0	1.0	1.0
+chr3	55455	1.0	0.0	1.0
+chr3	55542	0.0	1.0	1.0
+chr3	55617	0.0	1.0	1.0
+chr3	55622	1.0	0.0	1.0
+chr3	55656	1.0	0.0	1.0
+chr3	55674	1.0	0.0	1.0
+chr3	55697	0.0	1.0	1.0
+chr3	55718	0.0	1.0	1.0
+chr3	55723	1.0	0.0	1.0
+chr3	55746	1.0	0.0	1.0
+chr3	55772	0.0	1.0	1.0
+chr3	55776	0.0	1.0	1.0
+chr3	55782	1.0	0.0	1.0
+chr3	55879	1.0	0.0	1.0
+chr3	55891	0.0	1.0	1.0
+chr3	55908	1.0	0.0	1.0
+chr3	56008	1.0	0.0	1.0
+chr3	56314	0.0	1.0	1.0
+chr3	56352	0.0	1.0	1.0
+chr3	56359	2.0	0.0	2.0
+chr3	56375	1.0	0.0	1.0
+chr3	56379	1.0	0.0	1.0
+chr3	56386	2.0	0.0	2.0
+chr3	56402	1.0	0.0	1.0
+chr3	56419	1.0	0.0	1.0
+chr3	56482	0.0	1.0	1.0
+chr3	56549	1.0	0.0	1.0
+chr3	56553	0.0	3.0	3.0
+chr3	56555	1.0	0.0	1.0
+chr3	56556	1.0	0.0	1.0
+chr3	56558	0.0	1.0	1.0
+chr3	56561	0.0	1.0	1.0
+chr3	56563	1.0	1.0	2.0
+chr3	56571	0.0	1.0	1.0
+chr3	56576	0.0	1.0	1.0
+chr3	56578	0.0	1.0	1.0
+chr3	56590	0.0	1.0	1.0
+chr3	57439	1.0	0.0	1.0
+chr3	57570	0.0	1.0	1.0
+chr3	58205	0.0	3.0	3.0
+chr3	58225	1.0	0.0	1.0
+chr3	58233	2.0	0.0	2.0
+chr3	58251	1.0	0.0	1.0
+chr3	58380	1.0	0.0	1.0
+chr3	58409	0.0	3.0	3.0
+chr3	58534	1.0	0.0	1.0
+chr3	58622	0.0	2.0	2.0
+chr3	58690	1.0	0.0	1.0
+chr3	58696	2.0	0.0	2.0
+chr3	58702	1.0	0.0	1.0
+chr3	58704	1.0	0.0	1.0
+chr3	58708	0.0	1.0	1.0
+chr3	58716	0.0	1.0	1.0
+chr3	58719	2.0	1.0	3.0
+chr3	58720	0.0	3.0	3.0
+chr3	58721	1.0	0.0	1.0
+chr3	58724	2.0	0.0	2.0
+chr3	58730	0.0	1.0	1.0
+chr3	58985	0.0	1.0	1.0
+chr3	59001	1.0	0.0	1.0
+chr3	59002	0.0	1.0	1.0
+chr3	59007	4.0	0.0	4.0
+chr3	59012	0.0	2.0	2.0
+chr3	59013	2.0	0.0	2.0
+chr3	59016	2.0	0.0	2.0
+chr3	59023	1.0	0.0	1.0
+chr3	59025	0.0	4.0	4.0
+chr3	59027	0.0	1.0	1.0
+chr3	59038	1.0	0.0	1.0
+chr3	59041	2.0	0.0	2.0
+chr3	59049	0.0	2.0	2.0
+chr3	59066	0.0	1.0	1.0
+chr3	59193	0.0	1.0	1.0
+chr3	59344	1.0	0.0	1.0
+chr3	59520	1.0	0.0	1.0
+chr3	59531	0.0	1.0	1.0
+chr3	59548	1.0	0.0	1.0
+chr3	59769	1.0	0.0	1.0
+chr3	59814	1.0	0.0	1.0
+chr3	60100	0.0	1.0	1.0
+chr3	60117	1.0	0.0	1.0
+chr3	60204	1.0	0.0	1.0
+chr3	60381	1.0	0.0	1.0
+chr3	60463	1.0	0.0	1.0
+chr3	60507	1.0	0.0	1.0
+chr3	60529	1.0	0.0	1.0
+chr3	60638	0.0	1.0	1.0
+chr3	60679	0.0	1.0	1.0
+chr3	60704	0.0	1.0	1.0
+chr3	60852	1.0	0.0	1.0
+chr3	60869	1.0	0.0	1.0
+chr3	60997	0.0	1.0	1.0
+chr3	61018	1.0	0.0	1.0
+chr3	61019	2.0	0.0	2.0
+chr3	61050	1.0	0.0	1.0
+chr3	61051	0.0	1.0	1.0
+chr3	61060	0.0	1.0	1.0
+chr3	61090	0.0	1.0	1.0
+chr3	61121	0.0	1.0	1.0
+chr3	61151	1.0	0.0	1.0
+chr3	61160	0.0	1.0	1.0
+chr3	61162	1.0	0.0	1.0
+chr3	61163	2.0	0.0	2.0
+chr3	61166	0.0	1.0	1.0
+chr3	61171	1.0	0.0	1.0
+chr3	61172	0.0	1.0	1.0
+chr3	61176	1.0	0.0	1.0
+chr3	61177	2.0	0.0	2.0
+chr3	61193	0.0	2.0	2.0
+chr3	61200	1.0	0.0	1.0
+chr3	61202	1.0	0.0	1.0
+chr3	61367	0.0	1.0	1.0
+chr3	61371	0.0	2.0	2.0
+chr3	61377	2.0	3.0	5.0
+chr3	61378	3.0	0.0	3.0
+chr3	61379	1.0	0.0	1.0
+chr3	61380	0.0	2.0	2.0
+chr3	61381	1.0	0.0	1.0
+chr3	61383	0.0	2.0	2.0
+chr3	61386	0.0	3.0	3.0
+chr3	61388	0.0	1.0	1.0
+chr3	61389	7.0	10.0	17.0
+chr3	61390	1.0	1.0	2.0
+chr3	61391	0.0	1.0	1.0
+chr3	61397	0.0	2.0	2.0
+chr3	61398	1.0	0.0	1.0
+chr3	61400	0.0	1.0	1.0
+chr3	61406	0.0	1.0	1.0
+chr3	61408	0.0	5.0	5.0
+chr3	61409	0.0	1.0	1.0
+chr3	61414	2.0	0.0	2.0
+chr3	61416	4.0	0.0	4.0
+chr3	61421	0.0	1.0	1.0
+chr3	61422	0.0	1.0	1.0
+chr3	61426	1.0	0.0	1.0
+chr3	61438	1.0	0.0	1.0
+chr3	61449	0.0	1.0	1.0
+chr3	61450	0.0	2.0	2.0
+chr3	61475	1.0	0.0	1.0
+chr3	61625	0.0	1.0	1.0
+chr3	61639	0.0	1.0	1.0
+chr3	61645	1.0	0.0	1.0
+chr3	61652	4.0	0.0	4.0
+chr3	61655	0.0	1.0	1.0
+chr3	61657	1.0	3.0	4.0
+chr3	61658	0.0	3.0	3.0
+chr3	61660	5.0	0.0	5.0
+chr3	61661	2.0	0.0	2.0
+chr3	61662	0.0	1.0	1.0
+chr3	61664	1.0	2.0	3.0
+chr3	61665	2.0	1.0	3.0
+chr3	61667	0.0	1.0	1.0
+chr3	61668	1.0	0.0	1.0
+chr3	61670	1.0	0.0	1.0
+chr3	61672	1.0	0.0	1.0
+chr3	61673	0.0	1.0	1.0
+chr3	61675	1.0	5.0	6.0
+chr3	61676	0.0	1.0	1.0
+chr3	61677	0.0	2.0	2.0
+chr3	61680	1.0	0.0	1.0
+chr3	61684	0.0	6.0	6.0
+chr3	61702	1.0	0.0	1.0
+chr3	61822	0.0	1.0	1.0
+chr3	61823	1.0	0.0	1.0
+chr3	61825	1.0	0.0	1.0
+chr3	61835	1.0	0.0	1.0
+chr3	61843	0.0	1.0	1.0
+chr3	61846	1.0	0.0	1.0
+chr3	61932	0.0	1.0	1.0
+chr3	61943	0.0	1.0	1.0
+chr3	61984	0.0	1.0	1.0
+chr3	62006	2.0	0.0	2.0
+chr3	62009	1.0	0.0	1.0
+chr3	62169	1.0	0.0	1.0
+chr3	62185	1.0	0.0	1.0
+chr3	62342	0.0	1.0	1.0
+chr3	62359	0.0	1.0	1.0
+chr3	62517	0.0	1.0	1.0
+chr3	62585	0.0	1.0	1.0
+chr3	62840	2.0	0.0	2.0
+chr3	62841	1.0	0.0	1.0
+chr3	62842	1.0	0.0	1.0
+chr3	62851	1.0	1.0	2.0
+chr3	62857	1.0	0.0	1.0
+chr3	62868	0.0	1.0	1.0
+chr3	62870	1.0	0.0	1.0
+chr3	62893	1.0	0.0	1.0
+chr3	62913	1.0	0.0	1.0
+chr3	63026	0.0	1.0	1.0
+chr3	63037	0.0	3.0	3.0
+chr3	63046	1.0	0.0	1.0
+chr3	63051	1.0	0.0	1.0
+chr3	63053	1.0	0.0	1.0
+chr3	63058	0.0	1.0	1.0
+chr3	63061	0.0	2.0	2.0
+chr3	63062	1.0	0.0	1.0
+chr3	63085	0.0	2.0	2.0
+chr3	63088	0.0	1.0	1.0
+chr3	63100	1.0	0.0	1.0
+chr3	63105	0.0	1.0	1.0
+chr3	63107	0.0	1.0	1.0
+chr3	63175	0.0	1.0	1.0
+chr3	63176	1.0	0.0	1.0
+chr3	63185	1.0	0.0	1.0
+chr3	63186	1.0	0.0	1.0
+chr3	63187	0.0	1.0	1.0
+chr3	63192	1.0	0.0	1.0
+chr3	63199	1.0	0.0	1.0
+chr3	63203	0.0	1.0	1.0
+chr3	63204	0.0	1.0	1.0
+chr3	63208	1.0	1.0	2.0
+chr3	63214	0.0	1.0	1.0
+chr3	63216	5.0	1.0	6.0
+chr3	63222	1.0	0.0	1.0
+chr3	63226	1.0	0.0	1.0
+chr3	63227	0.0	2.0	2.0
+chr3	63228	0.0	1.0	1.0
+chr3	63232	2.0	0.0	2.0
+chr3	63234	0.0	1.0	1.0
+chr3	63235	0.0	8.0	8.0
+chr3	63237	0.0	3.0	3.0
+chr3	63242	1.0	0.0	1.0
+chr3	63244	1.0	0.0	1.0
+chr3	63257	1.0	1.0	2.0
+chr3	63259	1.0	0.0	1.0
+chr3	63260	0.0	2.0	2.0
+chr3	63262	2.0	0.0	2.0
+chr3	63309	1.0	0.0	1.0
+chr3	63417	1.0	0.0	1.0
+chr3	63422	1.0	0.0	1.0
+chr3	63437	0.0	1.0	1.0
+chr3	63438	1.0	0.0	1.0
+chr3	63439	1.0	4.0	5.0
+chr3	63440	0.0	1.0	1.0
+chr3	63441	1.0	1.0	2.0
+chr3	63449	2.0	1.0	3.0
+chr3	63450	1.0	1.0	2.0
+chr3	63451	0.0	1.0	1.0
+chr3	63453	2.0	0.0	2.0
+chr3	63454	3.0	0.0	3.0
+chr3	63456	1.0	0.0	1.0
+chr3	63461	3.0	0.0	3.0
+chr3	63468	1.0	1.0	2.0
+chr3	63473	0.0	1.0	1.0
+chr3	63476	0.0	1.0	1.0
+chr3	63477	0.0	2.0	2.0
+chr3	63478	0.0	1.0	1.0
+chr3	63479	2.0	0.0	2.0
+chr3	63480	0.0	4.0	4.0
+chr3	63481	0.0	3.0	3.0
+chr3	63484	0.0	1.0	1.0
+chr3	63495	3.0	0.0	3.0
+chr3	63503	1.0	0.0	1.0
+chr3	63504	1.0	0.0	1.0
+chr3	63510	1.0	0.0	1.0
+chr3	63532	0.0	2.0	2.0
+chr3	63600	1.0	0.0	1.0
+chr3	63611	0.0	2.0	2.0
+chr3	63621	0.0	1.0	1.0
+chr3	63630	1.0	0.0	1.0
+chr3	63632	1.0	0.0	1.0
+chr3	63637	0.0	1.0	1.0
+chr3	63656	0.0	1.0	1.0
+chr3	63791	1.0	0.0	1.0
+chr3	63912	0.0	2.0	2.0
+chr3	63969	0.0	1.0	1.0
+chr3	64138	0.0	1.0	1.0
+chr3	64293	1.0	0.0	1.0
+chr3	64460	1.0	0.0	1.0
+chr3	64536	1.0	0.0	1.0
+chr3	65056	0.0	1.0	1.0
+chr3	65212	0.0	1.0	1.0
+chr3	65218	0.0	1.0	1.0
+chr3	65378	3.0	0.0	3.0
+chr3	65382	1.0	0.0	1.0
+chr3	65389	0.0	2.0	2.0
+chr3	65525	1.0	0.0	1.0
+chr3	65533	1.0	0.0	1.0
+chr3	65537	1.0	0.0	1.0
+chr3	65538	3.0	0.0	3.0
+chr3	65542	1.0	0.0	1.0
+chr3	65543	1.0	0.0	1.0
+chr3	65546	6.0	1.0	7.0
+chr3	65547	0.0	1.0	1.0
+chr3	65548	0.0	1.0	1.0
+chr3	65550	1.0	0.0	1.0
+chr3	65553	2.0	0.0	2.0
+chr3	65556	0.0	1.0	1.0
+chr3	65560	1.0	1.0	2.0
+chr3	65561	0.0	2.0	2.0
+chr3	65564	1.0	0.0	1.0
+chr3	65566	0.0	1.0	1.0
+chr3	65567	2.0	0.0	2.0
+chr3	65572	0.0	1.0	1.0
+chr3	65586	1.0	0.0	1.0
+chr3	65611	1.0	0.0	1.0
+chr3	65997	1.0	0.0	1.0
+chr3	66005	0.0	3.0	3.0
+chr3	66039	1.0	0.0	1.0
+chr3	66097	1.0	0.0	1.0
+chr3	66172	1.0	0.0	1.0
+chr3	66184	0.0	1.0	1.0
+chr3	66185	0.0	1.0	1.0
+chr3	66191	0.0	1.0	1.0
+chr3	66318	0.0	1.0	1.0
+chr3	66344	1.0	0.0	1.0
+chr3	66587	0.0	2.0	2.0
+chr3	66692	0.0	1.0	1.0
+chr3	66695	0.0	1.0	1.0
+chr3	66805	1.0	0.0	1.0
+chr3	66878	1.0	0.0	1.0
+chr3	66900	0.0	1.0	1.0
+chr3	66947	0.0	1.0	1.0
+chr3	66974	1.0	0.0	1.0
+chr3	66978	1.0	0.0	1.0
+chr3	67151	0.0	1.0	1.0
+chr3	67209	2.0	0.0	2.0
+chr3	67232	0.0	1.0	1.0
+chr3	67400	0.0	1.0	1.0
+chr3	67505	1.0	0.0	1.0
+chr3	67523	1.0	0.0	1.0
+chr3	67547	0.0	1.0	1.0
+chr3	67556	1.0	0.0	1.0
+chr3	67850	0.0	1.0	1.0
+chr3	67871	1.0	0.0	1.0
+chr3	67878	0.0	1.0	1.0
+chr3	67880	0.0	1.0	1.0
+chr3	68028	1.0	0.0	1.0
+chr3	68045	1.0	0.0	1.0
+chr3	68053	0.0	1.0	1.0
+chr3	68076	1.0	0.0	1.0
+chr3	68177	3.0	0.0	3.0
+chr3	68202	1.0	0.0	1.0
+chr3	68208	0.0	1.0	1.0
+chr3	68212	0.0	3.0	3.0
+chr3	68218	0.0	1.0	1.0
+chr3	68219	1.0	1.0	2.0
+chr3	68220	1.0	0.0	1.0
+chr3	68228	1.0	0.0	1.0
+chr3	68231	0.0	1.0	1.0
+chr3	68234	0.0	1.0	1.0
+chr3	68235	0.0	1.0	1.0
+chr3	68243	0.0	1.0	1.0
+chr3	68254	0.0	1.0	1.0
+chr3	68256	1.0	0.0	1.0
+chr3	68273	1.0	0.0	1.0
+chr3	68294	1.0	0.0	1.0
+chr3	68367	1.0	0.0	1.0
+chr3	68639	2.0	0.0	2.0
+chr3	68651	0.0	1.0	1.0
+chr3	68673	0.0	1.0	1.0
+chr3	68675	0.0	1.0	1.0
+chr3	68698	1.0	0.0	1.0
+chr3	68917	0.0	1.0	1.0
+chr3	68934	0.0	1.0	1.0
+chr3	68955	0.0	1.0	1.0
+chr3	68958	0.0	1.0	1.0
+chr3	68986	1.0	0.0	1.0
+chr3	69085	0.0	1.0	1.0
+chr3	69097	0.0	1.0	1.0
+chr3	69122	0.0	1.0	1.0
+chr3	69242	0.0	1.0	1.0
+chr3	69411	0.0	1.0	1.0
+chr3	69562	0.0	1.0	1.0
+chr3	69563	0.0	1.0	1.0
+chr3	69568	1.0	0.0	1.0
+chr3	69717	0.0	1.0	1.0
+chr3	69744	0.0	1.0	1.0
+chr3	69756	0.0	1.0	1.0
+chr3	69768	0.0	1.0	1.0
+chr3	69773	1.0	0.0	1.0
+chr3	69813	0.0	1.0	1.0
+chr3	69863	0.0	1.0	1.0
+chr3	69877	0.0	1.0	1.0
+chr3	69882	1.0	0.0	1.0
+chr3	69896	6.0	0.0	6.0
+chr3	69903	0.0	1.0	1.0
+chr3	69904	2.0	0.0	2.0
+chr3	69907	1.0	0.0	1.0
+chr3	69912	0.0	2.0	2.0
+chr3	69914	2.0	0.0	2.0
+chr3	69916	0.0	1.0	1.0
+chr3	69918	0.0	1.0	1.0
+chr3	69922	0.0	5.0	5.0
+chr3	69927	0.0	2.0	2.0
+chr3	69928	3.0	1.0	4.0
+chr3	69933	2.0	0.0	2.0
+chr3	69934	0.0	1.0	1.0
+chr3	69938	0.0	3.0	3.0
+chr3	69944	0.0	2.0	2.0
+chr3	69952	0.0	1.0	1.0
+chr3	69955	0.0	1.0	1.0
+chr3	69957	1.0	1.0	2.0
+chr3	69969	1.0	0.0	1.0
+chr3	69986	1.0	0.0	1.0
+chr3	69997	1.0	0.0	1.0
+chr3	70000	1.0	0.0	1.0
+chr3	70002	1.0	0.0	1.0
+chr3	70131	1.0	0.0	1.0
+chr3	70132	1.0	0.0	1.0
+chr3	70138	1.0	0.0	1.0
+chr3	70141	1.0	0.0	1.0
+chr3	70151	1.0	0.0	1.0
+chr3	70152	1.0	0.0	1.0
+chr3	70154	0.0	1.0	1.0
+chr3	70155	1.0	0.0	1.0
+chr3	70157	1.0	1.0	2.0
+chr3	70161	4.0	0.0	4.0
+chr3	70162	4.0	0.0	4.0
+chr3	70163	0.0	1.0	1.0
+chr3	70165	3.0	0.0	3.0
+chr3	70166	0.0	2.0	2.0
+chr3	70168	1.0	3.0	4.0
+chr3	70169	0.0	1.0	1.0
+chr3	70177	2.0	0.0	2.0
+chr3	70179	0.0	3.0	3.0
+chr3	70180	1.0	0.0	1.0
+chr3	70190	1.0	0.0	1.0
+chr3	70193	1.0	0.0	1.0
+chr3	70196	0.0	1.0	1.0
+chr3	70209	2.0	0.0	2.0
+chr3	70210	0.0	1.0	1.0
+chr3	70216	2.0	0.0	2.0
+chr3	70224	1.0	0.0	1.0
+chr3	70295	0.0	1.0	1.0
+chr3	70323	0.0	1.0	1.0
+chr3	70326	1.0	1.0	2.0
+chr3	70327	2.0	0.0	2.0
+chr3	70331	0.0	1.0	1.0
+chr3	70339	0.0	3.0	3.0
+chr3	70345	0.0	1.0	1.0
+chr3	70482	1.0	0.0	1.0
+chr3	70500	0.0	1.0	1.0
+chr3	70507	0.0	1.0	1.0
+chr3	70534	0.0	1.0	1.0
+chr3	70644	0.0	1.0	1.0
+chr3	70678	1.0	0.0	1.0
+chr3	70696	0.0	1.0	1.0
+chr3	70812	1.0	0.0	1.0
+chr3	70893	0.0	1.0	1.0
+chr3	70936	0.0	1.0	1.0
+chr3	70959	2.0	0.0	2.0
+chr3	70998	0.0	1.0	1.0
+chr3	71072	0.0	1.0	1.0
+chr3	71075	1.0	0.0	1.0
+chr3	71090	1.0	0.0	1.0
+chr3	71112	1.0	0.0	1.0
+chr3	71132	0.0	1.0	1.0
+chr3	71263	0.0	1.0	1.0
+chr3	71266	0.0	1.0	1.0
+chr3	71274	1.0	0.0	1.0
+chr3	71305	1.0	0.0	1.0
+chr3	71333	1.0	0.0	1.0
+chr3	71422	1.0	0.0	1.0
+chr3	71448	1.0	0.0	1.0
+chr3	71480	0.0	1.0	1.0
+chr3	71486	0.0	1.0	1.0
+chr3	71670	0.0	1.0	1.0
+chr3	71703	1.0	0.0	1.0
+chr3	71721	0.0	1.0	1.0
+chr3	71738	0.0	1.0	1.0
+chr3	71742	0.0	1.0	1.0
+chr3	71783	0.0	1.0	1.0
+chr3	71797	0.0	1.0	1.0
+chr3	71842	0.0	1.0	1.0
+chr3	71877	1.0	0.0	1.0
+chr3	71888	0.0	2.0	2.0
+chr3	71891	3.0	0.0	3.0
+chr3	71892	4.0	0.0	4.0
+chr3	71898	0.0	2.0	2.0
+chr3	71900	0.0	1.0	1.0
+chr3	71906	1.0	0.0	1.0
+chr3	71915	1.0	0.0	1.0
+chr3	71916	1.0	0.0	1.0
+chr3	71920	1.0	0.0	1.0
+chr3	71937	0.0	1.0	1.0
+chr3	72008	0.0	2.0	2.0
+chr3	72076	1.0	0.0	1.0
+chr3	72125	0.0	1.0	1.0
+chr3	72377	1.0	0.0	1.0
+chr3	72400	0.0	1.0	1.0
+chr3	72450	0.0	1.0	1.0
+chr3	72493	0.0	1.0	1.0
+chr3	72563	0.0	2.0	2.0
+chr3	72650	1.0	0.0	1.0
+chr3	72781	0.0	1.0	1.0
+chr3	72798	1.0	0.0	1.0
+chr3	72833	1.0	0.0	1.0
+chr3	72928	3.0	0.0	3.0
+chr3	72948	0.0	1.0	1.0
+chr3	72977	1.0	0.0	1.0
+chr3	73072	1.0	0.0	1.0
+chr3	73121	1.0	0.0	1.0
+chr3	73159	0.0	1.0	1.0
+chr3	73165	2.0	0.0	2.0
+chr3	73184	0.0	1.0	1.0
+chr3	73208	1.0	0.0	1.0
+chr3	73246	0.0	1.0	1.0
+chr3	73334	0.0	1.0	1.0
+chr3	73504	0.0	1.0	1.0
+chr3	73646	1.0	0.0	1.0
+chr3	73674	1.0	0.0	1.0
+chr3	73688	0.0	1.0	1.0
+chr3	73689	0.0	2.0	2.0
+chr3	73691	1.0	0.0	1.0
+chr3	73699	0.0	1.0	1.0
+chr3	73711	1.0	0.0	1.0
+chr3	73718	1.0	0.0	1.0
+chr3	73731	0.0	1.0	1.0
+chr3	73742	0.0	1.0	1.0
+chr3	73755	1.0	0.0	1.0
+chr3	73839	0.0	1.0	1.0
+chr3	73845	0.0	1.0	1.0
+chr3	73847	2.0	0.0	2.0
+chr3	73851	1.0	0.0	1.0
+chr3	73857	1.0	0.0	1.0
+chr3	73861	0.0	1.0	1.0
+chr3	73868	0.0	2.0	2.0
+chr3	73869	0.0	1.0	1.0
+chr3	73870	1.0	0.0	1.0
+chr3	73872	1.0	0.0	1.0
+chr3	73878	1.0	0.0	1.0
+chr3	73880	0.0	1.0	1.0
+chr3	73892	2.0	0.0	2.0
+chr3	73895	1.0	0.0	1.0
+chr3	73903	1.0	0.0	1.0
+chr3	73907	1.0	0.0	1.0
+chr3	73916	0.0	1.0	1.0
+chr3	73919	1.0	0.0	1.0
+chr3	73936	0.0	1.0	1.0
+chr3	74008	0.0	1.0	1.0
+chr3	74012	1.0	0.0	1.0
+chr3	74015	1.0	0.0	1.0
+chr3	74024	1.0	0.0	1.0
+chr3	74032	0.0	1.0	1.0
+chr3	74035	1.0	0.0	1.0
+chr3	74038	0.0	4.0	4.0
+chr3	74042	4.0	0.0	4.0
+chr3	74045	1.0	0.0	1.0
+chr3	74052	0.0	1.0	1.0
+chr3	74081	2.0	0.0	2.0
+chr3	74083	0.0	2.0	2.0
+chr3	74089	0.0	1.0	1.0
+chr3	74114	1.0	0.0	1.0
+chr3	74127	1.0	0.0	1.0
+chr3	74237	1.0	0.0	1.0
+chr3	74257	3.0	0.0	3.0
+chr3	74279	0.0	1.0	1.0
+chr3	74282	0.0	1.0	1.0
+chr3	74287	0.0	1.0	1.0
+chr3	74290	0.0	1.0	1.0
+chr3	74292	0.0	1.0	1.0
+chr3	74295	1.0	0.0	1.0
+chr3	74300	0.0	3.0	3.0
+chr3	74302	1.0	0.0	1.0
+chr3	74303	1.0	0.0	1.0
+chr3	74309	0.0	2.0	2.0
+chr3	74312	0.0	1.0	1.0
+chr3	74313	1.0	2.0	3.0
+chr3	74319	0.0	1.0	1.0
+chr3	74323	0.0	1.0	1.0
+chr3	74325	1.0	0.0	1.0
+chr3	74329	1.0	0.0	1.0
+chr3	74338	0.0	2.0	2.0
+chr3	74340	1.0	0.0	1.0
+chr3	74343	1.0	0.0	1.0
+chr3	74429	2.0	0.0	2.0
+chr3	74430	0.0	1.0	1.0
+chr3	74434	1.0	1.0	2.0
+chr3	74442	0.0	1.0	1.0
+chr3	74448	0.0	1.0	1.0
+chr3	74449	1.0	0.0	1.0
+chr3	74450	2.0	0.0	2.0
+chr3	74456	1.0	0.0	1.0
+chr3	74460	1.0	0.0	1.0
+chr3	74473	1.0	0.0	1.0
+chr3	74478	1.0	0.0	1.0
+chr3	74642	1.0	0.0	1.0
+chr3	74647	0.0	1.0	1.0
+chr3	74671	1.0	0.0	1.0
+chr3	74681	1.0	0.0	1.0
+chr3	74685	0.0	1.0	1.0
+chr3	74691	1.0	0.0	1.0
+chr3	74694	2.0	0.0	2.0
+chr3	74697	1.0	2.0	3.0
+chr3	74698	0.0	1.0	1.0
+chr3	74699	1.0	0.0	1.0
+chr3	74704	0.0	2.0	2.0
+chr3	74705	0.0	1.0	1.0
+chr3	74706	1.0	0.0	1.0
+chr3	74761	0.0	1.0	1.0
+chr3	74808	1.0	0.0	1.0
+chr3	74809	1.0	0.0	1.0
+chr3	74817	1.0	1.0	2.0
+chr3	74820	1.0	0.0	1.0
+chr3	74821	0.0	1.0	1.0
+chr3	74853	2.0	0.0	2.0
+chr3	74856	0.0	1.0	1.0
+chr3	74859	0.0	1.0	1.0
+chr3	74863	0.0	1.0	1.0
+chr3	74874	1.0	0.0	1.0
+chr3	74875	0.0	1.0	1.0
+chr3	74876	1.0	0.0	1.0
+chr3	74880	1.0	0.0	1.0
+chr3	74883	0.0	2.0	2.0
+chr3	74884	0.0	1.0	1.0
+chr3	74886	1.0	0.0	1.0
+chr3	74898	0.0	1.0	1.0
+chr3	74924	1.0	0.0	1.0
+chr3	75021	1.0	0.0	1.0
+chr3	75031	1.0	0.0	1.0
+chr3	75060	1.0	0.0	1.0
+chr3	75063	0.0	1.0	1.0
+chr3	75093	0.0	1.0	1.0
+chr3	75179	0.0	1.0	1.0
+chr3	75187	0.0	1.0	1.0
+chr3	75192	1.0	0.0	1.0
+chr3	75207	0.0	1.0	1.0
+chr3	75212	0.0	1.0	1.0
+chr3	75328	1.0	0.0	1.0
+chr3	75362	0.0	1.0	1.0
+chr3	75363	1.0	0.0	1.0
+chr3	75367	0.0	1.0	1.0
+chr3	75377	1.0	0.0	1.0
+chr3	75383	0.0	1.0	1.0
+chr3	75385	1.0	0.0	1.0
+chr3	75386	0.0	1.0	1.0
+chr3	75395	4.0	0.0	4.0
+chr3	75404	0.0	1.0	1.0
+chr3	75405	2.0	0.0	2.0
+chr3	75412	1.0	0.0	1.0
+chr3	75572	1.0	0.0	1.0
+chr3	75581	0.0	1.0	1.0
+chr3	75596	0.0	1.0	1.0
+chr3	75605	1.0	0.0	1.0
+chr3	75606	1.0	0.0	1.0
+chr3	75628	3.0	0.0	3.0
+chr3	75631	1.0	0.0	1.0
+chr3	75637	0.0	1.0	1.0
+chr3	75719	0.0	2.0	2.0
+chr3	75741	0.0	1.0	1.0
+chr3	75745	0.0	1.0	1.0
+chr3	75749	0.0	1.0	1.0
+chr3	75756	0.0	3.0	3.0
+chr3	75758	0.0	8.0	8.0
+chr3	75760	1.0	1.0	2.0
+chr3	75762	0.0	1.0	1.0
+chr3	75763	0.0	1.0	1.0
+chr3	75767	1.0	0.0	1.0
+chr3	75773	0.0	1.0	1.0
+chr3	75774	5.0	2.0	7.0
+chr3	75775	3.0	0.0	3.0
+chr3	75776	5.0	1.0	6.0
+chr3	75781	1.0	0.0	1.0
+chr3	75784	2.0	0.0	2.0
+chr3	75796	0.0	1.0	1.0
+chr3	75807	0.0	1.0	1.0
+chr3	75808	0.0	2.0	2.0
+chr3	75845	0.0	1.0	1.0
+chr3	75857	1.0	0.0	1.0
+chr3	76037	3.0	0.0	3.0
+chr3	76039	0.0	1.0	1.0
+chr3	76042	1.0	0.0	1.0
+chr3	76087	0.0	1.0	1.0
+chr3	76224	0.0	1.0	1.0
+chr3	76592	0.0	1.0	1.0
+chr3	76604	0.0	1.0	1.0
+chr3	76708	0.0	1.0	1.0
+chr3	76758	0.0	1.0	1.0
+chr3	77008	1.0	1.0	2.0
+chr3	77042	2.0	0.0	2.0
+chr3	77175	0.0	1.0	1.0
+chr3	77206	1.0	0.0	1.0
+chr3	77311	0.0	1.0	1.0
+chr3	77343	1.0	0.0	1.0
+chr3	77378	1.0	0.0	1.0
+chr3	77491	2.0	0.0	2.0
+chr3	77492	0.0	1.0	1.0
+chr3	77503	1.0	0.0	1.0
+chr3	77504	1.0	0.0	1.0
+chr3	77507	1.0	0.0	1.0
+chr3	77509	0.0	1.0	1.0
+chr3	77512	0.0	3.0	3.0
+chr3	77513	0.0	1.0	1.0
+chr3	77514	1.0	0.0	1.0
+chr3	77516	2.0	0.0	2.0
+chr3	77520	0.0	1.0	1.0
+chr3	77522	0.0	1.0	1.0
+chr3	77528	1.0	0.0	1.0
+chr3	77532	1.0	0.0	1.0
+chr3	77551	0.0	2.0	2.0
+chr3	77582	0.0	1.0	1.0
+chr3	77583	1.0	0.0	1.0
+chr3	77601	0.0	1.0	1.0
+chr3	77644	1.0	0.0	1.0
+chr3	77711	1.0	0.0	1.0
+chr3	77747	0.0	1.0	1.0
+chr3	77764	1.0	0.0	1.0
+chr3	77784	0.0	2.0	2.0
+chr3	77793	1.0	0.0	1.0
+chr3	77841	1.0	0.0	1.0
+chr3	77845	0.0	2.0	2.0
+chr3	77970	0.0	1.0	1.0
+chr3	78059	1.0	0.0	1.0
+chr3	78852	1.0	0.0	1.0
+chr3	78853	1.0	0.0	1.0
+chr3	79050	1.0	0.0	1.0
+chr3	79068	0.0	1.0	1.0
+chr3	79086	0.0	1.0	1.0
+chr3	79101	0.0	1.0	1.0
+chr3	79107	1.0	0.0	1.0
+chr3	79114	0.0	3.0	3.0
+chr3	79124	4.0	8.0	12.0
+chr3	79125	2.0	0.0	2.0
+chr3	79129	3.0	0.0	3.0
+chr3	79132	1.0	0.0	1.0
+chr3	79134	0.0	1.0	1.0
+chr3	79136	0.0	2.0	2.0
+chr3	79139	1.0	4.0	5.0
+chr3	79140	4.0	1.0	5.0
+chr3	79147	1.0	0.0	1.0
+chr3	79149	0.0	1.0	1.0
+chr3	79151	0.0	1.0	1.0
+chr3	79272	1.0	0.0	1.0
+chr3	79302	0.0	1.0	1.0
+chr3	79314	1.0	0.0	1.0
+chr3	79318	0.0	2.0	2.0
+chr3	79345	1.0	0.0	1.0
+chr3	79476	0.0	1.0	1.0
+chr3	79497	1.0	0.0	1.0
+chr3	79605	1.0	0.0	1.0
+chr3	79634	1.0	0.0	1.0
+chr3	79655	1.0	0.0	1.0
+chr3	79660	0.0	1.0	1.0
+chr3	79783	0.0	1.0	1.0
+chr3	79949	0.0	1.0	1.0
+chr3	80008	0.0	1.0	1.0
+chr3	80075	1.0	0.0	1.0
+chr3	80104	0.0	1.0	1.0
+chr3	80152	0.0	1.0	1.0
+chr3	80157	1.0	0.0	1.0
+chr3	80432	0.0	1.0	1.0
+chr3	80453	1.0	0.0	1.0
+chr3	80767	0.0	2.0	2.0
+chr3	80999	0.0	1.0	1.0
+chr3	81023	0.0	1.0	1.0
+chr3	81042	0.0	1.0	1.0
+chr3	81160	1.0	0.0	1.0
+chr3	81167	0.0	1.0	1.0
+chr3	81327	1.0	0.0	1.0
+chr3	81407	0.0	1.0	1.0
+chr3	81436	1.0	0.0	1.0
+chr3	81510	0.0	1.0	1.0
+chr3	81597	2.0	0.0	2.0
+chr3	81682	0.0	1.0	1.0
+chr3	81684	1.0	0.0	1.0
+chr3	81825	0.0	1.0	1.0
+chr3	81836	0.0	1.0	1.0
+chr3	81861	0.0	1.0	1.0
+chr3	81928	0.0	2.0	2.0
+chr3	81985	0.0	1.0	1.0
+chr3	82109	0.0	1.0	1.0
+chr3	82297	1.0	0.0	1.0
+chr3	82721	0.0	1.0	1.0
+chr3	82724	0.0	1.0	1.0
+chr3	82725	0.0	1.0	1.0
+chr3	82729	0.0	2.0	2.0
+chr3	82749	0.0	2.0	2.0
+chr3	82759	0.0	1.0	1.0
+chr3	82760	0.0	2.0	2.0
+chr3	82761	0.0	1.0	1.0
+chr3	82764	0.0	3.0	3.0
+chr3	82765	0.0	6.0	6.0
+chr3	82773	5.0	0.0	5.0
+chr3	82776	1.0	1.0	2.0
+chr3	82777	0.0	1.0	1.0
+chr3	82779	0.0	2.0	2.0
+chr3	82780	0.0	1.0	1.0
+chr3	82783	0.0	5.0	5.0
+chr3	82787	1.0	0.0	1.0
+chr3	82794	1.0	0.0	1.0
+chr3	82797	1.0	0.0	1.0
+chr3	82799	0.0	1.0	1.0
+chr3	82801	0.0	1.0	1.0
+chr3	82807	1.0	0.0	1.0
+chr3	82817	1.0	0.0	1.0
+chr3	82819	1.0	0.0	1.0
+chr3	82827	1.0	2.0	3.0
+chr3	82828	0.0	1.0	1.0
+chr3	82829	2.0	1.0	3.0
+chr3	82835	1.0	2.0	3.0
+chr3	82836	1.0	0.0	1.0
+chr3	82850	0.0	1.0	1.0
+chr3	82856	0.0	1.0	1.0
+chr3	82857	0.0	2.0	2.0
+chr3	82861	0.0	2.0	2.0
+chr3	82862	0.0	1.0	1.0
+chr3	82863	1.0	0.0	1.0
+chr3	82883	0.0	3.0	3.0
+chr3	82884	1.0	0.0	1.0
+chr3	82885	0.0	1.0	1.0
+chr3	82894	0.0	1.0	1.0
+chr3	82895	0.0	1.0	1.0
+chr3	82896	0.0	1.0	1.0
+chr3	82907	0.0	1.0	1.0
+chr3	82913	0.0	1.0	1.0
+chr3	82934	1.0	0.0	1.0
+chr3	82940	0.0	1.0	1.0
+chr3	82943	1.0	1.0	2.0
+chr3	82944	1.0	0.0	1.0
+chr3	82945	3.0	1.0	4.0
+chr3	82951	0.0	2.0	2.0
+chr3	82953	2.0	0.0	2.0
+chr3	82956	0.0	5.0	5.0
+chr3	82959	1.0	0.0	1.0
+chr3	82961	1.0	0.0	1.0
+chr3	82963	0.0	1.0	1.0
+chr3	82964	0.0	4.0	4.0
+chr3	82965	1.0	0.0	1.0
+chr3	82969	1.0	0.0	1.0
+chr3	82971	1.0	0.0	1.0
+chr3	82973	1.0	0.0	1.0
+chr3	82974	1.0	0.0	1.0
+chr3	82975	1.0	0.0	1.0
+chr3	82977	1.0	0.0	1.0
+chr3	82978	1.0	0.0	1.0
+chr3	82982	1.0	0.0	1.0
+chr3	82985	1.0	0.0	1.0
+chr3	82986	17.0	0.0	17.0
+chr3	82987	5.0	0.0	5.0
+chr3	82989	1.0	0.0	1.0
+chr3	82990	3.0	0.0	3.0
+chr3	82992	1.0	0.0	1.0
+chr3	82995	1.0	0.0	1.0
+chr3	82996	2.0	0.0	2.0
+chr3	82999	1.0	0.0	1.0
+chr3	83000	3.0	0.0	3.0
+chr3	83003	1.0	0.0	1.0
+chr3	83004	1.0	0.0	1.0
+chr3	83010	1.0	0.0	1.0
+chr3	83011	2.0	0.0	2.0
+chr3	83012	1.0	0.0	1.0
+chr3	83016	2.0	0.0	2.0
+chr3	83076	0.0	2.0	2.0
+chr3	83079	0.0	3.0	3.0
+chr3	83088	0.0	1.0	1.0
+chr3	83089	0.0	1.0	1.0
+chr3	83092	0.0	2.0	2.0
+chr3	83093	0.0	1.0	1.0
+chr3	83096	0.0	1.0	1.0
+chr3	83102	0.0	3.0	3.0
+chr3	83103	0.0	1.0	1.0
+chr3	83104	0.0	14.0	14.0
+chr3	83117	0.0	2.0	2.0
+chr3	83127	1.0	0.0	1.0
+chr3	83128	1.0	0.0	1.0
+chr3	83135	5.0	0.0	5.0
+chr3	83140	2.0	0.0	2.0
+chr3	83148	1.0	0.0	1.0
+chr3	83275	1.0	0.0	1.0
+chr3	83466	1.0	0.0	1.0
+chr3	83480	0.0	1.0	1.0
+chr3	83498	1.0	0.0	1.0
+chr3	83540	0.0	1.0	1.0
+chr3	83585	0.0	1.0	1.0
+chr3	83607	1.0	0.0	1.0
+chr3	83619	1.0	0.0	1.0
+chr3	83637	0.0	1.0	1.0
+chr3	83639	2.0	0.0	2.0
+chr3	83652	1.0	0.0	1.0
+chr3	83668	1.0	0.0	1.0
+chr3	83695	0.0	1.0	1.0
+chr3	83701	1.0	0.0	1.0
+chr3	83808	1.0	0.0	1.0
+chr3	83818	1.0	0.0	1.0
+chr3	83836	1.0	0.0	1.0
+chr3	83837	2.0	0.0	2.0
+chr3	83838	0.0	2.0	2.0
+chr3	83840	0.0	1.0	1.0
+chr3	83841	0.0	2.0	2.0
+chr3	83981	0.0	1.0	1.0
+chr3	83983	0.0	2.0	2.0
+chr3	83987	0.0	1.0	1.0
+chr3	83994	1.0	0.0	1.0
+chr3	84090	0.0	1.0	1.0
+chr3	84093	0.0	1.0	1.0
+chr3	84094	0.0	1.0	1.0
+chr3	84098	0.0	2.0	2.0
+chr3	84118	0.0	1.0	1.0
+chr3	84128	0.0	1.0	1.0
+chr3	84129	0.0	1.0	1.0
+chr3	84130	0.0	1.0	1.0
+chr3	84133	0.0	1.0	1.0
+chr3	84134	0.0	5.0	5.0
+chr3	84141	3.0	0.0	3.0
+chr3	84142	4.0	0.0	4.0
+chr3	84144	0.0	1.0	1.0
+chr3	84145	1.0	1.0	2.0
+chr3	84146	0.0	1.0	1.0
+chr3	84148	0.0	2.0	2.0
+chr3	84149	0.0	1.0	1.0
+chr3	84152	0.0	5.0	5.0
+chr3	84156	1.0	0.0	1.0
+chr3	84163	1.0	0.0	1.0
+chr3	84166	1.0	0.0	1.0
+chr3	84175	0.0	1.0	1.0
+chr3	84176	1.0	0.0	1.0
+chr3	84178	0.0	1.0	1.0
+chr3	84183	1.0	0.0	1.0
+chr3	84187	0.0	1.0	1.0
+chr3	84188	1.0	0.0	1.0
+chr3	84190	0.0	1.0	1.0
+chr3	84191	0.0	1.0	1.0
+chr3	84196	1.0	0.0	1.0
+chr3	84198	1.0	0.0	1.0
+chr3	84204	1.0	0.0	1.0
+chr3	84205	1.0	0.0	1.0
+chr3	84209	0.0	1.0	1.0
+chr3	84238	2.0	0.0	2.0
+chr3	84316	0.0	1.0	1.0
+chr3	84319	0.0	1.0	1.0
+chr3	84320	0.0	1.0	1.0
+chr3	84324	0.0	2.0	2.0
+chr3	84344	0.0	1.0	1.0
+chr3	84354	0.0	1.0	1.0
+chr3	84355	0.0	2.0	2.0
+chr3	84356	0.0	1.0	1.0
+chr3	84359	0.0	3.0	3.0
+chr3	84360	0.0	6.0	6.0
+chr3	84367	1.0	0.0	1.0
+chr3	84368	5.0	0.0	5.0
+chr3	84371	1.0	1.0	2.0
+chr3	84372	0.0	1.0	1.0
+chr3	84374	0.0	2.0	2.0
+chr3	84375	0.0	1.0	1.0
+chr3	84378	0.0	5.0	5.0
+chr3	84382	1.0	0.0	1.0
+chr3	84389	1.0	0.0	1.0
+chr3	84392	1.0	0.0	1.0
+chr3	84401	0.0	1.0	1.0
+chr3	84402	1.0	0.0	1.0
+chr3	84404	0.0	1.0	1.0
+chr3	84409	1.0	0.0	1.0
+chr3	84413	0.0	1.0	1.0
+chr3	84414	1.0	0.0	1.0
+chr3	84416	0.0	1.0	1.0
+chr3	84417	0.0	1.0	1.0
+chr3	84422	1.0	0.0	1.0
+chr3	84424	2.0	0.0	2.0
+chr3	84430	1.0	0.0	1.0
+chr3	84431	1.0	0.0	1.0
+chr3	84435	0.0	1.0	1.0
+chr3	84464	2.0	0.0	2.0
+chr3	84478	1.0	0.0	1.0
+chr3	84491	0.0	1.0	1.0
+chr3	84513	1.0	0.0	1.0
+chr3	84523	0.0	1.0	1.0
+chr3	84530	0.0	1.0	1.0
+chr3	84539	0.0	2.0	2.0
+chr3	84548	0.0	1.0	1.0
+chr3	84553	0.0	1.0	1.0
+chr3	84558	2.0	0.0	2.0
+chr3	84565	2.0	0.0	2.0
+chr3	84569	3.0	0.0	3.0
+chr3	84572	1.0	0.0	1.0
+chr3	84573	1.0	0.0	1.0
+chr3	84575	3.0	0.0	3.0
+chr3	84577	5.0	0.0	5.0
+chr3	84578	9.0	0.0	9.0
+chr3	84579	1.0	1.0	2.0
+chr3	84580	1.0	0.0	1.0
+chr3	84581	1.0	0.0	1.0
+chr3	84582	1.0	0.0	1.0
+chr3	84591	1.0	0.0	1.0
+chr3	84597	1.0	0.0	1.0
+chr3	84602	1.0	0.0	1.0
+chr3	84682	0.0	1.0	1.0
+chr3	84707	2.0	0.0	2.0
+chr3	84756	1.0	0.0	1.0
+chr3	84758	1.0	0.0	1.0
+chr3	84832	0.0	1.0	1.0
+chr3	84835	0.0	1.0	1.0
+chr3	84836	0.0	1.0	1.0
+chr3	84840	0.0	2.0	2.0
+chr3	84860	0.0	1.0	1.0
+chr3	84870	0.0	1.0	1.0
+chr3	84871	0.0	2.0	2.0
+chr3	84872	0.0	1.0	1.0
+chr3	84875	0.0	3.0	3.0
+chr3	84876	0.0	6.0	6.0
+chr3	84884	6.0	0.0	6.0
+chr3	84887	1.0	1.0	2.0
+chr3	84888	0.0	1.0	1.0
+chr3	84890	0.0	2.0	2.0
+chr3	84891	0.0	1.0	1.0
+chr3	84894	0.0	5.0	5.0
+chr3	84898	1.0	0.0	1.0
+chr3	84905	1.0	0.0	1.0
+chr3	84908	1.0	0.0	1.0
+chr3	84917	0.0	1.0	1.0
+chr3	84918	1.0	0.0	1.0
+chr3	84920	0.0	1.0	1.0
+chr3	84925	1.0	0.0	1.0
+chr3	84929	0.0	1.0	1.0
+chr3	84930	1.0	0.0	1.0
+chr3	84932	0.0	1.0	1.0
+chr3	84933	0.0	1.0	1.0
+chr3	84938	1.0	0.0	1.0
+chr3	84940	2.0	0.0	2.0
+chr3	84946	1.0	0.0	1.0
+chr3	84947	1.0	0.0	1.0
+chr3	84951	0.0	1.0	1.0
+chr3	84980	2.0	0.0	2.0
+chr3	85007	0.0	1.0	1.0
+chr3	85029	1.0	0.0	1.0
+chr3	85039	0.0	1.0	1.0
+chr3	85046	0.0	1.0	1.0
+chr3	85055	0.0	2.0	2.0
+chr3	85066	0.0	1.0	1.0
+chr3	85069	0.0	1.0	1.0
+chr3	85074	2.0	0.0	2.0
+chr3	85081	3.0	1.0	4.0
+chr3	85085	2.0	0.0	2.0
+chr3	85088	1.0	0.0	1.0
+chr3	85089	1.0	0.0	1.0
+chr3	85091	3.0	0.0	3.0
+chr3	85093	5.0	0.0	5.0
+chr3	85094	9.0	1.0	10.0
+chr3	85095	1.0	0.0	1.0
+chr3	85096	1.0	0.0	1.0
+chr3	85097	1.0	2.0	3.0
+chr3	85098	1.0	0.0	1.0
+chr3	85107	1.0	1.0	2.0
+chr3	85109	0.0	4.0	4.0
+chr3	85113	1.0	0.0	1.0
+chr3	85118	1.0	0.0	1.0
+chr3	85119	1.0	0.0	1.0
+chr3	85124	1.0	0.0	1.0
+chr3	85125	0.0	3.0	3.0
+chr3	85126	0.0	2.0	2.0
+chr3	85127	0.0	1.0	1.0
+chr3	85133	0.0	2.0	2.0
+chr3	85143	0.0	2.0	2.0
+chr3	85144	0.0	1.0	1.0
+chr3	85148	1.0	0.0	1.0
+chr3	85149	1.0	0.0	1.0
+chr3	85150	2.0	0.0	2.0
+chr3	85153	0.0	1.0	1.0
+chr3	85159	0.0	1.0	1.0
+chr3	85172	0.0	2.0	2.0
+chr3	85174	4.0	0.0	4.0
+chr3	85175	1.0	0.0	1.0
+chr3	85177	0.0	3.0	3.0
+chr3	85179	0.0	1.0	1.0
+chr3	85180	1.0	0.0	1.0
+chr3	85181	2.0	0.0	2.0
Index: /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/testdata/short-results.txt
===================================================================
--- /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/testdata/short-results.txt (revision 3)
+++ /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/testdata/short-results.txt (revision 3)
@@ -0,0 +1,1 @@
+Results dataset
Index: /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/testdata/eland-short.txt
===================================================================
--- /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/testdata/eland-short.txt (revision 3)
+++ /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/testdata/eland-short.txt (revision 3)
@@ -0,0 +1,10000 @@
+HWUSI-EAS610	1	4	17	362	948	0	1	GTTTAGGCAAGAATTATGTCATTAGTAACACCACGA	a`_a_aaaaaaaaaaaaa^a_`a`a^aa`_`a`_a]	chr10.fa		3000923	R	36	36					
+HWUSI-EAS610	1	4	3	429	227	0	1	GTGGAGTGGTACGCAATGTCAGACATTAACTTTGGT	_Xa`\Z]`_]_O_[aZUXPWX]YOX__]\V____BB	chr10.fa		3002572	R	36	30					
+HWUSI-EAS610	1	4	50	571	812	0	1	TCTGAGCTCTGTAGTTGGGCCACTAGACAAATCCAA	aaaa_a`a`aa_aa_aaaa``a`a``_`_^`a__``	chr10.fa		3002653	F	36	119					
+HWUSI-EAS610	1	4	9	1741	588	0	1	AGATGACAGTGGCCACTCTACCTGCCCATCATGCCC	W\_a]aa]Q[`R^WaZ^[\aaa[G_\]MFYUGSP]`	chr10.fa		3002749	R	36	115					
+HWUSI-EAS610	1	4	9	1688	946	0	1	GCATGATGGGCAGGTAGAGTGGCCACTGTCATCTTA	aaba``aa_a]__aZaa`a]```^_SWRU^[T\_\`	chr10.fa		3002751	F	36	119					
+HWUSI-EAS610	1	4	9	468	631	0	1	GATATACTTGAAACTTCTACTCCTGTGTAAGTGCTT	a^`aa_a_a`_a`[`a`_`_``^`a[aY^__[__`_	chr10.fa		3002803	F	36	119					
+HWUSI-EAS610	1	4	35	641	327	0	1	ACCAGAGCTGGACAGGTAAAGCACTTACACAGGAGT	_`X_^]`^aab_X\_^U_Yab`^\a`aXaaaaa]_[	chr10.fa		3002821	R	36	54					
+HWUSI-EAS610	1	4	86	711	1980	0	1	TTTCAGTGGTGAAACGTCTGCCATTTTCAGGTTGGA	a[^_\aTa]T]b^XZa_^\``X^`]a_Y^T]U`^XX	chr10.fa		3002913	R	36	24					
+HWUSI-EAS610	1	4	69	1202	700	0	1	AGTTACAGAGACAAAGATTGTTGCTGAGCCCAACGG	ab_aaaaa]U_aa`_a_`aa`aa`aaa``_`a_]`_	chr10.fa		3003494	R	36	119					
+HWUSI-EAS610	1	4	60	1331	1004	0	1	TGACTCGTGCTGTAAGATCGGGAATTGACAAATAGG	`__W_\]\_^`Z^aaa^`[]]^Y]a`]_^_]`XN\X	chr10.fa		3004450	R	33G2	19					
+HWUSI-EAS610	1	4	53	895	716	0	1	ATTCAGGAATTTTTCCCCTGTGCCCACCTCTTCAAA	abbabbaa_bbbab_``_ab]`aa_a_^a`aa`a`a	chr10.fa		3004496	F	36	14					
+HWUSI-EAS610	1	4	8	392	905	0	1	TGATATTTTTACTTCTTCCTTTCCAATTTGAATCCT	aba`]bbba]^`b``aaaaaa`]`]aaabaaa`a_a	chr10.fa		3005387	F	36	11					
+HWUSI-EAS610	1	4	88	1321	1017	0	1	TGGAAAGATAAGGAATTCAAGGCGCATAACTGAACA	abb\a[^`abbZaa_aaa^`aX`a_`a__Yaa^``a	chr10.fa		3005596	R	36	48					
+HWUSI-EAS610	1	4	20	792	726	0	1	GGTGATGATGGCTGGACACATGGAATTTGCTCAGCA	aa`babbaaaaa]a`^baaa`aba`abaaaaaabab	chr10.fa		3010143	R	36	37					
+HWUSI-EAS610	1	4	72	768	472	0	1	TGGAGAAACCAGGATCAAGTACAATGATGGTGATGA	abbaaaab_abab_aaa`aaa_Yaab`aaa^aaaaa	chr10.fa		3010171	R	36	64					
+HWUSI-EAS610	1	4	74	1606	1153	0	1	TGTGTGTTTGTGTGTGTGTACATGTGTGCCTAGCTA	a_^a`a\^Z][\^]^`^]W`[`_YY[WZ`^^XT^]T	chr10.fa		3010298	F	36	42					
+HWUSI-EAS610	1	4	33	879	1833	0	1	CTGACTTGTGTGTTTGACTGACAAAGTCAGGATTTA	abbb`bab``\^abbaaaaabaaaabU]`\`_aaa_	chr10.fa		3010892	F	36	108					
+HWUSI-EAS610	1	4	53	1283	1821	0	1	AAGACAAAGGTGGCTCTCATAGATCTGAAGTCTTTA	abba_a\^_UZa_^]_`__a^`_\[a_^\aXZ``a^	chr10.fa		3010935	F	36	119					
+HWUSI-EAS610	1	4	41	851	501	0	1	GTATCTGTGCATGTTGTGCATGAGGCATGGGCATGT	`S^`YZ^M\TZ\_Y[_R^\_Z`VQ_^\]]XZUN]^Q	chr10.fa		3011801	R	36	118					
+HWUSI-EAS610	1	4	21	144	97	0	1	GCATTGATGTAACGAGGTTTCATGCGAGGTAAATTA	`ab__b_aa^abaa[aaX__`a]``a^baOa_a_]a	chr10.fa		3012042	F	36	119					
+HWUSI-EAS610	1	4	93	1497	1020	0	1	CACTAAGTTCACTCATCCTTGGTGGATGGGATTTTG	^ba`b`]`abbaaa```a`^b_]ba``aba_[aaaa	chr10.fa		3012133	F	36	119					
+HWUSI-EAS610	1	4	27	1583	624	0	1	GCTTTCTTCAAAAAGGCAACAGAAGNTAATCAGTTG	a`aaa`a_`a^_^^]___^\^[^`XDL_^^_]]Z\Z	chr10.fa		3013028	F	25G10	110					
+HWUSI-EAS610	1	4	56	1032	1852	0	1	CAAAACTGTTAGCTATGAGCCAGGCGTGGTGGCACA	aa`X`aab^_b`_abaabbaa_`a`aNa`G^`Z`\`	chr10.fa		3013202	F	36	37					
+HWUSI-EAS610	1	4	8	1042	1318	0	1	GGAGTAAAGGTGTGTGCCACCACGCCTGGCTCATAG	]b]a]abaaaUa[`]a`a\a`b^aa_aaaY``a_^Y	chr10.fa		3013214	R	36	10					
+HWUSI-EAS610	1	4	8	999	1654	0	1	GGAGTAAAGGTGTGTGCCACCACGCCTGGCTCATAG	aba]S`aaaaUaX`]a`___aa^\]`^``aa]^^\a	chr10.fa		3013214	R	36	8					
+HWUSI-EAS610	1	4	99	184	1865	0	1	TGTATCATTTTCCATTCATGTGTTGTGTTATACCTT	Wa\bb``bbbab`abab\\b`]S]]V]a``_bba`\	chr10.fa		3013572	F	36	33					
+HWUSI-EAS610	1	4	89	1079	819	0	1	TTCCAGCTTATACAGGAGACCAGCTGAAATATCCAG	X[\`VZVVWZ\]_]\_\a`_U_UQ]TXTRXYY[_^B	chr10.fa		3013962	F	36	37					
+HWUSI-EAS610	1	4	38	1223	1883	0	1	TACAACCAACCAACAATGGGCATCTGTGAATGGGAA	aa_a]\_]SY`WZHSN[`P[]R[JTLO[W\_`Y^Y]	chr10.fa		3014033	R	22G13	85					
+HWUSI-EAS610	1	4	90	840	654	0	1	TCTGGTATGTGCTTACTTAATGCTGAGGTTTTAGGC	aabab_aab_aaaa`aaa_`aa_aa^`_Ya```a__	chr10.fa		3014176	F	36	119					
+HWUSI-EAS610	1	4	100	727	1888	0	1	TTTGGTTTTCTTCTTTGTCTCTTTTGTGGATTGTAG	`bbaa^aaaab`aaaa\_aaaaaaaa_aa__a^_^U	chr10.fa		3018157	R	36	119					
+HWUSI-EAS610	1	4	56	207	1076	0	1	TACAATCTTTTCTTTTGGTTTTCTTCTTTGTCTCTT	\^`aW`KV^X]`__ST\b[F\]Y\bb`W^a_`_a__	chr10.fa		3018170	R	36	117					
+HWUSI-EAS610	1	4	83	619	1611	0	1	AAGGAGGAAAAGAGGAGATGAAGATTAGGGAGAGGA	aabb_baab__a_ba^b_ab]`a_`aaa`a^]]a_]	chr10.fa		3018471	R	36	119					
+HWUSI-EAS610	1	4	23	1075	1724	0	1	TATCACCAGCAAGGATGGCTGACGGGAACTGCAAGA	``aaaa`aa_a_X`^\aa^a`_\`aa_aW^WV_]`_	chr10.fa		3018723	F	36	119					
+HWUSI-EAS610	1	4	6	1772	1142	0	1	ACCTAACTTGCTTAGGCGCATATGTACAGTTAATCA	ab^`[_ab`^JabVaSTZI`b`_Wa_X\^[a_a_[W	chr10.fa		3018874	F	16A19	93					
+HWUSI-EAS610	1	4	28	925	336	0	1	GAGCGCCACATTTGGACTCTGTCATGGTTTGTATAT	aaa]_\a[``b_abaQ`QP\[S__`\`W_baH^[`_	chr10.fa		3019255	R	15T20	96					
+HWUSI-EAS610	1	4	65	827	101	0	1	CAGCCCATGCTTTCACCATCTGCTAGGGTGCTCTGG	abb_`aaa]Xa]`XaZaa]_a]\^QWUZMU^`Y]U^	chr10.fa		3019319	F	36	118					
+HWUSI-EAS610	1	4	86	240	512	0	1	TCTGTCTCTTTTCACTGTGTCTGCCAGAATGCTGGG	a^YaPa_`aa^_`_a_aW`ZU^`\YZ^[__\\WW\W	chr10.fa		3019379	R	36	119					
+HWUSI-EAS610	1	4	99	481	1762	0	1	GGAGCAGAGACTGGAAGAAAGGCCAACCAGAGACTG	_`bbZa_TVOL_\TVZZV^[UP_^\W_\\PQRM]Va	chr10.fa		3020155	F	36	15					
+HWUSI-EAS610	1	4	50	298	1877	0	1	ATAGTGTTGGGGTTGGTGCCTGCACATGCGATGGAT	\YRXZbaa_]WT]b_WP__bbaRW__X_[NYO]`BB	chr10.fa		3020203	R	36	30					
+HWUSI-EAS610	1	4	95	729	122	0	1	ACCAACCCCAACACTATTGCTGATGCCATGTTGCAC	a_QQb_[Y[[^[PQWT_VLU[\]RUPRTNNX_TBBB	chr10.fa		3020222	F	33T2	20					
+HWUSI-EAS610	1	4	30	1582	293	0	1	TGCCAGGCTTCCATCAGCAAGTACAACATGGCATCA	aa`\_U_SN_YRZR\\N^W^]U\U]Y^WQZQZ[[ZZ	chr10.fa		3020242	R	36	118					
+HWUSI-EAS610	1	4	22	1546	668	0	1	GGTTGGCTGTAAGTATCTGCATCTGTCAGGTGCCTC	aa`a]^aa__aaa^ba`aaaaa`a_\_a[^U_^\`_	chr10.fa		3020303	R	36	57					
+HWUSI-EAS610	1	4	99	418	1874	0	1	ACAGTATCAACTCCCTGGACTCCTCAGAGCTCCCGG	]a`a`b`aZZbabaaa^`aa\a^\aa^_]a\a\a__	chr10.fa		3020402	F	36	61					
+HWUSI-EAS610	1	4	31	593	484	0	1	AGGAGGAACCTTGGTGACGCCACTGGATTTTGTATG	abbabb_aa^aaaYYaaZaY^a`_`a^Z^a_XU^X^	chr10.fa		3021008	F	36	119					
+HWUSI-EAS610	1	4	69	92	250	0	1	CAGTAAGGCAAATGAGGTGATAAGATTGTGTTTACT	`Y_`^abab_S\aa`aaX^[]`_`[`^a[`[^]X_\	chr10.fa		3021132	F	36	119					
+HWUSI-EAS610	1	4	66	803	1253	0	1	AAACAGCTTCAGTGGATTCTGCATGGATGCATGATG	_bab]^aaaY\a`a_\aa`aa_^aaa_a_`]``[aa	chr10.fa		3021326	R	36	119					
+HWUSI-EAS610	1	4	57	963	1987	0	1	CGTCTGAAACATGGAAGGAAATGATGGTGTAACTGG	`abbba`bb`aabababbaabbbaabb^a_ba_aa`	chr10.fa		3021389	R	36	119					
+HWUSI-EAS610	1	4	5	1364	1154	0	1	GTGTCTATGTGTGTGTTTATGTGTGTCTCTGAGTAT	aXb_a`]TQWb_]DSQ[aWaaUW[_^Z`\_`]_W_a	chr10.fa		3021712	F	36	25					
+HWUSI-EAS610	1	4	27	857	1374	0	1	GACAAGATCAAGCTGGATGAGAGACTCTGTCTTAAA	a[Zb\_O]_TJU^aaaW\ZV`_]^^`_aZJO_ZPX_	chr10.fa		3021803	R	36	117					
+HWUSI-EAS610	1	4	14	1745	1244	0	1	AGTCCCAGAATCCTCTTGCTTCTGGCCCTCTCTCCA	aZZaab[R^aaaaa_aaa`]^[Y[LV]]_]^`Y^[_	chr10.fa		3021867	F	36	118					
+HWUSI-EAS610	1	4	17	715	887	0	1	ACGTATGCCTACTGCCCTTGCACTGGAGAGAGGGCC	a][QZ[VXXX\[K`PRPYNRVYVQQVK\SXSPSSBB	chr10.fa		3021890	R	36	108					
+HWUSI-EAS610	1	4	83	465	1715	0	1	GTCACGTATGCCTACTGCCCTTGCACTGGAGAGAGG	a`aba`]a^^aaaa`^`[`a`^]`_`_`_Y_\_\U\	chr10.fa		3021893	R	36	119					
+HWUSI-EAS610	1	4	1	1439	603	0	1	AGTGTCATTGTGGAGACACACCTTTAATCTCAGCAC	a`PZ_[^`[HN[_[Ya\_XZUW]___]W[_W^PUa^	chr10.fa		3022103	R	36	118					
+HWUSI-EAS610	1	4	66	982	756	0	1	GGCTCATCATGGGCTCTCCCACAAGCCAAGGTCCAA	abaaaaaaaaaa^aaaaaaa\^`aa___a``U_Xaa	chr10.fa		3022542	F	36	119					
+HWUSI-EAS610	1	4	57	1283	917	0	1	GGACTGTAGCCACATCTGAGTTCTTAGTAAGTCAGG	aa]Za_V_a_^_^^^U`_Z^U^W^_^_X^WVVY]]]	chr10.fa		3022697	F	36	119					
+HWUSI-EAS610	1	4	57	959	527	0	1	AAGGGAGGCCTTCCTGTGCAGCCTGTGCTTCCCTGT	`[`[`a\^^^`a]R_a^a`_]]X\`[X^\``^\\``	chr10.fa		3023056	R	36	119					
+HWUSI-EAS610	1	4	49	65	2013	0	1	TTTCCAGCTCTTCCCTGGAGGTCGCTCCTCCCAGAA	aa`bb_`b`ba`baa`aXKZaS`_`\]`Y`]a\_SR	chr10.fa		3023129	F	36	118					
+HWUSI-EAS610	1	4	49	741	1043	0	1	TGAGTTGGGGGAACCGTTGGGTTAGCTAGGTATTTC	ab_a`bbabaa[_aaa``a`a_`\a]a_aaW_aaa`	chr10.fa		3023227	R	36	119					
+HWUSI-EAS610	1	4	81	826	626	0	1	AACACAGTTGCTTGGGATTCTGTTGGGTTTCATCCT	aab`[b`P_]_[PW[R[RL\_^]Sa[`X``__^aS`	chr10.fa		3023394	R	36	118					
+HWUSI-EAS610	1	4	96	499	472	0	1	GAGATCCTTGGATGTCTTTCTGGTGTCATTAAAGCC	aaaa`_ZaabaXSa_[aa`aaaa]a_``a_a`aa`_	chr10.fa		3023543	F	36	74					
+HWUSI-EAS610	1	4	93	408	1431	0	1	CACTACCATGTCCCAGAAAGCTCCAGAAGAATTTCT	a^a_]`aa_`ZaaT_bY^_W^__`aaaba_]^__a_	chr10.fa		3023677	F	36	76					
+HWUSI-EAS610	1	4	17	247	1895	0	1	GTGCTTCCTGTGTGCCCTCATATGAACGACTTACTT	aZa`X\aa]]]ZXaaa`Zaa^a]]XZ`]NX[X`^T^	chr10.fa		3024178	R	36	119					
+HWUSI-EAS610	1	4	88	294	1063	0	1	ACACTATGTAAATTTCTTAGGATTCCCCAGCCAATA	aa`a`aab^`aa_aa`a``_aY_a`a``]a_``^_^	chr10.fa		3024581	R	36	119					
+HWUSI-EAS610	1	4	47	408	131	0	1	GTAATCCTAGCACTGAGGAGACGCTCCCTGGAGCTT	a^aaaaaabaa_aaa`a`a``a``W\^_Q[][\T[\	chr10.fa		3025306	R	36	119					
+HWUSI-EAS610	1	4	26	474	2022	0	1	CGCAGAGTCCTCATAAAAACTGGACACTGTGGCACA	abaWT_Vaaaa_Z]ab`K\``]`a]a_Za_a]`[^a	chr10.fa		3025347	R	36	118					
+HWUSI-EAS610	1	4	100	906	1009	0	1	TAATCACACAGTTCATTTTGGATATTGTGAAGCATT	abaZPT]_J^aQ`^Ta_aaa`_`]_a^`_NV^Za`]	chr10.fa		3025536	F	36	118					
+HWUSI-EAS610	1	4	42	1547	289	0	1	CAATACCATGCTGTCCTAAAGAAGACAGACAGACAG	abbabbbbbaaaaaabbabb`aaaaaaaa_`]`aba	chr10.fa		3025694	R	36	69					
+HWUSI-EAS610	1	4	92	547	951	0	1	GTTTTATGTTGTGGTGAAAAGGGACAGAGCAAAATA	`]aab]aaaaa[a_KYW`_aaa]]W^`X\`]_^_a`	chr10.fa		3025835	F	36	118					
+HWUSI-EAS610	1	4	25	900	433	0	1	TTGGCTGACGTCTGGGAAATTAGATTGGGGACGAGG	`bb`JRbXT_V[M\aWK\ZJ]`]`Za_ab`]I_WBB	chr10.fa		3026202	R	8T26T	81					
+HWUSI-EAS610	1	4	19	1221	199	0	1	CATCTTTTCTCTGCTTGATTACAATGGCGGCTTTGT	\baTaaaa`_^a[_aabbbba_aaaa^_`WLQ\`BB	chr10.fa		3026389	R	36	110					
+HWUSI-EAS610	1	4	5	967	1973	0	1	ATAATGCTCACCATTGCTGTATCCATATGGGAAAAG	aaa`_a`a_a_^_aaa``a]`^^Z_^__`]__a_`]	chr10.fa		3026448	F	36	119					
+HWUSI-EAS610	1	4	53	1638	226	0	1	AAATCAGGGGCTCACAAAGACTAAACAAAATCAAAA	aabaaa`a_[`a_a`aa]\^``a_aaaaa`_^^a`a	chr10.fa		3026645	F	36	119					
+HWUSI-EAS610	1	4	19	752	416	0	1	GTGATGGAGACTGGAGACAAAATACATTATAAACAT	a_a``ba`aa^`a`_aa_`aaa_a___``_```_aa	chr10.fa		3026760	F	36	119					
+HWUSI-EAS610	1	4	93	812	966	0	1	TGTGGAAACTTCATTCCTCTCTAGAATAGGAAATAA	`WT[KZWZM\][\a[\_a_ZG_a_a[__`_OVW\]^	chr10.fa		3027476	R	36	16					
+HWUSI-EAS610	1	4	92	1206	1738	0	1	ATCATATTTGATAGATCCATCTTTTCCTGTATGGTT	a\a^b_a_aa_`aaa```]aaaa`a^aaa^_aaa]a	chr10.fa		3029155	R	36	119					
+HWUSI-EAS610	1	4	86	1568	212	0	1	AAATCAAAGATAAAAGATGAAACTGGCAAGAAGGTT	aa\T_a]Y[a`^^a`_a[[`a^^XXWV``R]_TWI]	chr10.fa		3029308	F	36	118					
+HWUSI-EAS610	1	4	12	130	1922	0	1	TTCCATGTCCCAGCCAGTTCCACAGCCCTGCCAACT	\I_TH[WR`b\\\`_`]\VbaZR``Xa]Q]`^a]VY	chr10.fa		3030033	R	36	117					
+HWUSI-EAS610	1	4	17	1673	1349	0	1	GCTTCCTTCCACCTCCCATTGGGGTTAAAAGCTTGA	aYa^_a[``a``[_a_``_V`a`XN`a`a`_R[SZ`	chr10.fa		3030267	R	36	119					
+HWUSI-EAS610	1	4	3	1096	510	0	1	CACAGAGTTCTACACAGAATTCTCAGTACATGCTGT	abbb]]b]Y`a``aaabbbbaWba`a^][a\`]\^^	chr10.fa		3030477	R	36	119					
+HWUSI-EAS610	1	4	7	1729	2033	0	1	TTGATAATACTGTATTTCTCTTTCAGACAGACACCA	`b_Oaaaaa[bb[abaaTb_a]`[_aa][[T\VSW]	chr10.fa		3030511	R	36	119					
+HWUSI-EAS610	1	4	62	466	1717	0	1	AGGGTCCCCCAACAACTGGAGCTGGGTCTGTCCCTG	aa_aZaaaaaaaa\Z_^a`Xaa_aaaX___Y\`a\a	chr10.fa		3030826	F	36	51					
+HWUSI-EAS610	1	4	42	863	250	0	1	TGTTGCCTGCCTGTGGATCCCATTGTCCCGACTAGG	]_aJ`^XHTaO^`UXIaVRVXTS`_BBBBBBBBBBB	chr10.fa		3030866	F	29A3C2	64					
+HWUSI-EAS610	1	4	43	98	478	0	1	ACCCAGCCTGGCACCTTAAGTCACTGCAAAACTAGG	`ba`[`ba__`bZbbaaaX_]aab[_\U\Zaa\Z^_	chr10.fa		3030935	R	36	119					
+HWUSI-EAS610	1	4	77	1135	24	0	1	GACTAGTTCTTTTTATCAGGAATCACTTTGGGAGCT	a^[`_aZ^XY`\W\`__``__^^XXZ^]X^V^XZ\W	chr10.fa		3031359	F	36	119					
+HWUSI-EAS610	1	4	95	857	1084	0	1	TGGAAAAACATGCAGTGCTCTTAACTGCCTGAGCCA	ab```^_]aaaa^a[Za`_`aa^^[`a__a^\[_Z^	chr10.fa		3031402	R	36	119					
+HWUSI-EAS610	1	4	79	330	750	0	1	CTCCCAATCCTGATCCCAGTCCTCCTCTTCTCTTCC	aababZ[baUaaG`^Y`]bPT^\UZ`P_]ZVO\a^a	chr10.fa		3031718	R	36	117					
+HWUSI-EAS610	1	4	69	923	1732	0	1	GATTTTCTTCATACAGGCCTTGCACTCCTTCTTCCC	^a`b]`V_``T```b]R_BBBBBBBBBBBBBBBBBB	chr10.fa		3031789	R	23G5C6	36					
+HWUSI-EAS610	1	4	61	336	1925	0	1	GGCTGTGACAAAGGACAGTCTGGGTGGCTTACACAC	`a``^R^]`ab^[``]J_PYU\`QLU_[V^^\a_Y^	chr10.fa		3031858	F	36	118					
+HWUSI-EAS610	1	4	50	412	292	0	1	GGAACCATCCCTACTCTAACCCCCACATTATACATT	``\X^a`aa]``a^^`aa_a_\`aaa^`\`[`Z__a	chr10.fa		3032240	R	36	119					
+HWUSI-EAS610	1	4	84	1183	1511	0	1	GTGTCTCCTCACAGCAATAAGAAACCCCAAGTAAGA	^Q[\Z```ZU]\^a\```a[`Y[^URZV^Y^ZRU]_	chr10.fa		3032608	F	36	118					
+HWUSI-EAS610	1	4	21	1670	1501	0	1	AAAGTCCACACTGACCTCCCAGGCTTCATAGTGGGG	`__ZYYX`[`\\]``X]^\^]Y^KT`ZTZYHLM^]^	chr10.fa		3032857	F	36	117					
+HWUSI-EAS610	1	4	77	854	1316	0	1	GACGGTTCAGTCACTAGAGCACTTACAGTACAATTA	Z`_aQ]baaaaaa]b`[`b[_aba`aaaaa_a`aaa	chr10.fa		3032894	F	36	119					
+HWUSI-EAS610	1	4	74	948	481	0	1	TGAAAATACAAGCTAGATTAAACTCTTTCCTTTATA	aaaaaa`___]^^_^aX_a`]`^`Z^^`\^^__`__	chr10.fa		3033067	R	36	119					
+HWUSI-EAS610	1	4	82	1246	249	0	1	TGAAAATACAAGCTAGATTAAACTCTTTCCTTTATA	^^baSZaaa`^V__\SW^^^`_[a]_aaa\]WQa`Z	chr10.fa		3033067	R	36	119					
+HWUSI-EAS610	1	4	29	1017	922	0	1	ACAGGCTGCTAAGCCAGGGCCAGAGGCTCTAAAGCT	aZa_a\^a^^^`^^_\]`]\\V^W^[UU\\UV[VSW	chr10.fa		3033695	F	36	119					
+HWUSI-EAS610	1	4	82	350	999	0	1	ACAGCTATTGTAAATGAGAAATTAAACCAAAATGCA	_``abbW^`I`ab`bb^\^aaab`V\_aaWYaa\^_	chr10.fa		3033768	R	36	118					
+HWUSI-EAS610	1	4	53	1569	466	0	1	AAGTGAACCTTGAGGTATGGCCAGGCTGGAGGTAGG	aaaY^a^^\Y^`]\[S_^]Y_^\^U^WSVPVXSBBB	chr10.fa		3033868	F	35T	103					
+HWUSI-EAS610	1	4	83	1660	1989	0	1	AGGATTCTCCTAAGCTTTTGTCAAGAAGTGTAATCA	aaaRYa`a`__a`^^_aa`a]^`_a^]aYa]`__^`	chr10.fa		3033992	R	36	119					
+HWUSI-EAS610	1	4	37	1308	970	0	1	AGTCATTTTGCTAGGCCTGATATCACACTGAGAAAC	Z_\_[\_______a^__a]_b`a^_]``ab__a`^]	chr10.fa		3034150	R	36	119					
+HWUSI-EAS610	1	4	95	415	1275	0	1	ATACAAGCCAGGCAGTGGTGTATGCCTTTAATCCCA	aa\\a\_aa_Z^^^aU_^XWX`[aN[__Y_T_^_VV	chr10.fa		3034889	F	36	119					
+HWUSI-EAS610	1	4	42	1405	1398	0	1	TTAAACAGAGGTATGTAGCAGTGGGGGATGGGGAAT	a``aaXTZZ__U``_N^_ZT_W`___aXW^_^^^^^	chr10.fa		3035429	F	36	26					
+HWUSI-EAS610	1	4	70	1115	1822	0	1	AGGCAGGGGCATGGGCTCTCATGAAACCTTCTCCCT	aabbaabaZ^a^[G^aaaa__`a`aa```a`aa_^[	chr10.fa		3037059	F	2C15C17	41					
+HWUSI-EAS610	1	4	36	1321	1013	0	1	ATGGAAGCATAGCAGCTTCCTTGTACCTACAAGCCT	ab[Y^^`]aaX]____I[[]aXUNL`a[[Z[VS][[	chr10.fa		3037448	R	36	118					
+HWUSI-EAS610	1	4	43	147	866	0	1	GTTTGTTTATTTGGAAGGAGTACCTAGAGTTTGCTT	a_a[bWSX[]VI_`_\]_P\^]I_`\OPY_SI___^	chr10.fa		3037531	R	26A9	97					
+HWUSI-EAS610	1	4	4	1656	1505	0	1	TGTCATCTGACATGGTGGTTTGTTTATTTGGAAGGA	Va\a____`aZ]__\V^_X\^_O_^JW_aS[P[Z^Z	chr10.fa		3037548	R	36	118					
+HWUSI-EAS610	1	4	34	780	294	0	1	GGGTAGACATATATGTCATCTGACATGGTGGTTTGT	aaa[aab_`a`a`aa_``a_aa__`aa^\a`V`_`^	chr10.fa		3037561	R	3C32	87					
+HWUSI-EAS610	1	4	1	488	221	0	1	CAAACTTCAGGGCTAAGCACAGAAGAAAGAAAATAG	`bbbaababbb^aaaabaaaaaa`baa`b`_^aaab	chr10.fa		3038302	F	36	119					
+HWUSI-EAS610	1	4	2	1123	1599	0	1	GTTAAATGAATCTGGCTCTCCTTCAATTCTTCTTAA	aaa`aaaa^a_a`aa^a`b_Ta_[^``a^aa`aa^a	chr10.fa		3038374	R	17A5A12	50					
+HWUSI-EAS610	1	4	53	813	256	0	1	TGAGTTCATGACCCTGAAGAACATCTACTGTGTTCT	aba`]]`aaaaX^_aa\`a`^VZ__a]\aaU^[`^a	chr10.fa		3038424	F	36	119					
+HWUSI-EAS610	1	4	25	88	961	0	1	CATTCATTTACTTGTTTGATTTTGAGACAAGGTCTC	a`bbb_bbbbbabbbbbbbbabbbbbabbaababab	chr10.fa		3038674	R	10T25	80					
+HWUSI-EAS610	1	4	63	106	166	0	1	TAAACTCGGTATTTGAGGCCAGATGCAGGAAGATCA	a_`bbbbbb^`[ab^^`YaaU`aa``[aaa```WaX	chr10.fa		3038725	F	23G12	81					
+HWUSI-EAS610	1	4	42	56	727	0	1	ATAAACACTTCATTTAAAGAAACTTGTTAATTAAGT	aabaJ__\^b\^\a]SP__a_S\W`]`Y]U]ZZSU\	chr10.fa		3038906	R	36	118					
+HWUSI-EAS610	1	4	84	1237	1425	0	1	TGATGGGGTGCTTGTCTCCTATGCACAGTGCTCAGC	a^^``[]aP]PZ``[RXOS\YZX[][YVT]U_Y[[Y	chr10.fa		3038980	F	36	118					
+HWUSI-EAS610	1	4	97	854	1414	0	1	GGATAAGTAGCCATGGATGACCTTGAACTTCTGATC	[baabaa]aa_]``\]`aaaaaaaaa]`aa`aa``_	chr10.fa		3039081	R	36	119					
+HWUSI-EAS610	1	4	7	1304	1739	0	1	ATGTGTATCTGTGTACCACATGCACACAGTGCCCAC	_aa]aa`baaaVa[a\aabb_ba``aaaaZb^`aa\	chr10.fa		3039228	F	18A17	80					
+HWUSI-EAS610	1	4	57	190	1001	0	1	GAGGAGGGAGTCAGATTTTCTGGAACCAGAGTTACA	aX`_V^a^UaZ^]baaaa`a```^`a`]aW`[`]`^	chr10.fa		3039272	F	36	119					
+HWUSI-EAS610	1	4	36	1296	142	0	1	GGATCACAGCTCTCTGTAACTCTGGTTCCAGAAAAT	aaa`__^a^\\Y__``]_a_a^_]^]^]]\\ZY]_]	chr10.fa		3039286	R	2G33	81					
+HWUSI-EAS610	1	4	66	117	1308	0	1	GGATCACAGCTCTCTGTAACTCTGGTTCCAGAAAAT	abbabaabababaa_a^aa_aaaba__`aaa^Yaa_	chr10.fa		3039286	R	2G33	80					
+HWUSI-EAS610	1	4	67	925	1530	0	1	TGGTTCCCAATATCCACATGGTGGATCACAGCTCTC	`aaZ_[`aZ````a\^Xa]`]Pab_a\^^a_YZ_aa	chr10.fa		3039308	R	24G11	83					
+HWUSI-EAS610	1	4	7	1494	371	0	1	CACACACTTCTTGCTCTTCCAACAGATAACGACTTG	a_Q^UXa\SZ]^U_`RZ]`R_aT_S[_aa]Y``_\\	chr10.fa		3039342	R	28C7	81					
+HWUSI-EAS610	1	4	16	608	1043	0	1	TCTCAAAAAACACGGCAAGAAGGGGATTGGAGAGAT	a_a^]\]`aa_a`a\\Y[`Y^aaXaVY`aa^aZaZ_	chr10.fa		3039395	R	12T23	82					
+HWUSI-EAS610	1	4	21	1704	1064	0	1	GAACTTTCTGGTTGGTTAAACTGGCTAGCTGGCAAG	aa`aaaaaaaaaaXa__aa`__XU\_^N[XW^[__T	chr10.fa		3039771	R	15C20	83					
+HWUSI-EAS610	1	4	63	1120	84	0	1	ATGTTCATGTATGTATATGTGTACATGTTCTTGTGG	_]]^b^aaUITZ_YWV]_]ab\`[`_]XZYYV\Q_Z	chr10.fa		3039916	R	16GG18	48					
+HWUSI-EAS610	1	4	36	1167	1869	0	1	ATGGATGCACACATGACATATACATAAATGAACATG	aa``_^][_[`]]___]___``X_^]_^]]_^S]^_	chr10.fa		3039988	F	36	119					
+HWUSI-EAS610	1	4	8	267	1582	0	1	AGTCTGCACGGCAACTTAACACCCCTTGAAGAGCTA	NL[X^^b`a``b^PY`\\OQ[`_U_^\`abba`\Xa	chr10.fa		3040474	R	1A34	102					
+HWUSI-EAS610	1	4	19	1737	600	0	1	ATCTGGCTCCCCTCCCACACCCCCAATCTGCACTGC	_^X[^I`aX_aRR^_\HZ^^`^^_`\NPMFT[XKNX	chr10.fa		3040498	R	33G2	100					
+HWUSI-EAS610	1	4	56	607	1960	0	1	TTACAAATAATAATCCTGTAATAAGAGAGTCCTTTC	^Z``YSO]RG[Y_\LWZSWRQQ\\FZSERR]]VUNS	chr10.fa		3040581	R	24C11	104					
+HWUSI-EAS610	1	4	32	1017	2024	0	1	ATTACAAATAATAATCCTGTAATAACAGAGTCCTTT	a```]`]_____`^_Y\`_[_]^]][]][][[[][[	chr10.fa		3040582	R	36	119					
+HWUSI-EAS610	1	4	83	269	398	0	1	TTACAGGATTATTATTTGTAATGAATTGTTCGATCT	ab_aba`[aaaaaabaaa_abaaaaaa`Xaaa_^aa	chr10.fa		3040596	F	31T4	81					
+HWUSI-EAS610	1	4	85	313	605	0	1	CCTGCCAGAAGTCCCATTTGGATAATTTACTTTTTC	ab_Z`babaaa_aaaaa`^aaZ_``aaa]`a`aaaa	chr10.fa		3040642	R	36	119					
+HWUSI-EAS610	1	4	8	1285	1066	0	1	AATGGGACTTCTGGCAGGGATCTGCATCCTCGTTGA	a^\\^_^Q_^_\Z\XW]UUU\_V^^\VUW\W^M\QW	chr10.fa		3040660	F	34A1	96					
+HWUSI-EAS610	1	4	93	1132	1126	0	1	GATATAATGTCATAGACACTGGAGCTCCTGGAAAAC	a`a`a`_``^^`a]`]^]]aaa]a]]\Z_`_[[V\]	chr10.fa		3040989	F	19A16	81					
+HWUSI-EAS610	1	4	8	1484	1651	0	1	CAAGGTTTCAAGAACTCTGTGTCACACTGGCCAGAC	aabbb_`aaab_`aaa[a[_aYa`a`_``___a__`	chr10.fa		3041077	F	36	119					
+HWUSI-EAS610	1	4	86	743	1824	0	1	TTTAACCAACTTAAATTTTTTGGTGGTTTGACTATG	_aa]T]a``]]\\_V___Z^\b[M]\SaY\]XYXX`	chr10.fa		3041208	R	31G4	90					
+HWUSI-EAS610	1	4	9	628	1899	0	1	CAGAGACATTGCCTTAAAAAAAGAAAAAGGAAGCCG	a_\^_^S\^\``[S]a`UP[H]a\_[[\]`___aUY	chr10.fa		3041784	R	11T17A5T	15					
+HWUSI-EAS610	1	4	60	597	1145	0	1	TAAGGCAATGTCTCTGATTGAACCCAGGGCTCAAGG	`_W_R^`H[RQabW[TO]aXWQW_VNVNV][X]Z]_	chr10.fa		3041804	F	4A31	94					
+HWUSI-EAS610	1	4	26	1136	140	0	1	TATTACAAGCTTAGGGATTGGAGTTCTGAATCAAAG	aaaba`a`]Ta__[]a```a]V`^_]``_^`S__`_	chr10.fa		3041941	R	10A1G23	45					
+HWUSI-EAS610	1	4	63	1617	17	0	1	AAACAAACAAAAAGACAGAACATTTATGCTAGTTTC	Y_aY`_XN`a_P_Z\U^\^a^]YFVUVMV\QOU`Z^	chr10.fa		3042010	R	30G5	95					
+HWUSI-EAS610	1	4	34	1285	646	0	1	GCATGAGCCACCACACCTGGCCTATAGTTGTAAATA	aaaa_`_`]__```a^`]Q[__]^]a^]`^U_^^^^	chr10.fa		3042555	R	36	119					
+HWUSI-EAS610	1	4	13	1120	1620	0	1	GACTGGCCTTCACTCCTGCCTCTGCTTCCCAAATAC	a[aaa]Xa``^[X^_aa]a]a\W^`[XY_ZZR]XTZ	chr10.fa		3042602	R	11G22G1	62					
+HWUSI-EAS610	1	4	75	1233	703	0	1	AGAGAGAGAGAGAGAGTGGGAGGGTGGACAGGAAGG	`baaaaaaYaY`Q`^aUaa`Za[ZEUXJY^\\\^``	chr10.fa		3042721	R	1A19C14	40					
+HWUSI-EAS610	1	4	10	691	1205	0	1	GGTGTTTTGACCCAAGAGCTGAGAAAGAGGTTCAAA	aaUaRa_\_QXY^^^__a]^^\_[R^]]S]X^UVXB	chr10.fa		3042947	R	30C5	85					
+HWUSI-EAS610	1	4	11	373	1414	0	1	TTCATCCAAGCATATTAGAGCCAAGACATCTGCAAA	aaabaabaaaaa_`aa_YW]aa^`aaaaaa`aa_ZZ	chr10.fa		3043097	R	20AG14	43					
+HWUSI-EAS610	1	4	20	296	385	0	1	TGTGTGTGAAGTGGTGAATGAACGGAAGGATCGGGA	ab_b`b_baab^bb^_aaaaaaaaa``baa``aaa`	chr10.fa		3043335	R	36	119					
+HWUSI-EAS610	1	4	79	805	1721	0	1	ATTGGGCTACACTCAGAGCTGAGTATCTGAACATTG	`aWa`````aaW]__a\a^b^][]``^_IU]Z___a	chr10.fa		3043399	F	22A13	86					
+HWUSI-EAS610	1	4	18	106	653	0	1	CCTTCTTTGGAAGTAATAATACTGAAAAGAAAAAGT	ababbaabbb`a```aba]abbababbbbaaaa`a^	chr10.fa		3043576	R	14T21	82					
+HWUSI-EAS610	1	4	13	424	1618	0	1	AGGTGGCAGACACAGGTGGATGTCTGTGACTTTGAG	]^^Z`a`aa_`aZT]`[``a^\Va^`UZ_\___\P\	chr10.fa		3044614	R	11G24	81					
+HWUSI-EAS610	1	4	51	911	1157	0	1	TGTAGGCATCTGCGGTACACAGAGGCTCAATCCACA	_a``_]aaa\`aZa_Q]\__VRV_[W^QZ\WX^WZZ	chr10.fa		3044729	F	36	33					
+HWUSI-EAS610	1	4	87	301	1748	0	1	ACTACAGCCCTCAGACATTAACTTCGGTGGAGTGGT	ab]^`P]`aa_a[^^`a__```_^a`aW]`_aU^_W	chr10.fa		3044984	R	36	48					
+HWUSI-EAS610	1	4	41	1533	1090	0	1	GTGTGCCTCATTGTTTAAACAATACAAAGCTTGTTG	aaaa`bbbaaaa`_a`baa_aaaa__a`a`a_a^aa	chr10.fa		3045336	F	36	37					
+HWUSI-EAS610	1	4	78	791	1280	0	1	CATGGAAGATGACATAATGTATTTTCCTTTTGGTTT	a`bbbbbbbbbbabbbbababbbbbbabbabbbabb	chr10.fa		3045559	F	36	38					
+HWUSI-EAS610	1	4	11	108	2021	0	1	TGAGCACACTCCACTTTATTCATAGAGGCAGGTCTC	a_]]b[ababb``aaba`ab`K^aa[]bbaY^GYRR	chr10.fa		3046541	F	36	85					
+HWUSI-EAS610	1	4	21	130	170	0	1	TGGCAGCCACCTAAAATCTTGGTACCCTGGAAGCAG	aba`_`aababababaaa`aaa^baaaaabaaaa_a	chr10.fa		3046642	R	36	37					
+HWUSI-EAS610	1	4	79	1641	1032	0	1	TGGACTCTGATATGTGAACTTGAAGTTAGACCTTTA	^\a\b`abaaba^U_[ab^bb^^abaab]a_`aaaa	chr10.fa		3046877	F	36	119					
+HWUSI-EAS610	1	4	50	1002	794	0	1	GCTCAGGGTCCTTTCTGGTGAGTGGCACCTGCAACT	ab`]T_W]H\_ba^X_ZON[Z`W]`X__VVaTVXS]	chr10.fa		3047021	F	36	118					
+HWUSI-EAS610	1	4	2	1078	991	0	1	TGTGTGTATTTGTGTGTTTGTGTGTATGAGTGTCTG	`a[baabbba__`b`babbb_b_aa`aa_b^bYaba	chr10.fa		3047273	F	36	48					
+HWUSI-EAS610	1	4	8	881	828	0	1	CAAGAGCACCAGGTCTTCGACAGGGAGGAGCAAAGT	_^]_``]WW\T\`]^_WXaWZ\VU`]WVK_`YV\`Z	chr10.fa		3047577	R	18C17	80					
+HWUSI-EAS610	1	4	43	1548	954	0	1	GGCGATTTCCTTTAGTAAATTTTACCCTCAGTCCCA	\_]`aaaaaaaaa]_Y_^\U^^aZ]\V_[_]RQO[Y	chr10.fa		3048159	F	24T5A5	51					
+HWUSI-EAS610	1	4	64	124	1946	0	1	CAGGCTAGAAATCACAGGTTCCAGGCTGGTTATGAC	a]aa``[`aaaaabaa^_WW^_`_^_\a_W^[Z\U[	chr10.fa		3048646	F	6G14T12C1	26					
+HWUSI-EAS610	1	4	15	1249	1736	0	1	CAATTCTGACAGCAGTCAAGGAAGGTGCAAAGGAAT	abbaaabbaabbabbaa`aab`aa_[a`__^aa_^a	chr10.fa		3048766	F	36	119					
+HWUSI-EAS610	1	4	53	311	1086	0	1	ATTGAGACCCCCAAATATTAAGCACGCATCCCCAAA	J_`b_b_aaabbbaabaaaa_baababV`aa`ab__	chr10.fa		3049210	R	36	118					
+HWUSI-EAS610	1	4	62	287	589	0	1	GACGCACCAGATTTAATGGCTCTTAAGTTATGATTC	a`abaaaaaa`aaaaaaa`a_`\`U]]X]X[WNV_[	chr10.fa		3049306	F	36	119					
+HWUSI-EAS610	1	4	98	311	445	0	1	AACTCCCACCTGTGCAGAACTTTTCCCAATCCCTAG	`b[^baaabaa`[b]a`aa_abba`[aaaaaa_]Ia	chr10.fa		3049407	R	36	118					
+HWUSI-EAS610	1	4	95	1088	1123	0	1	CAAGAGAGGTCTGCAGTTTTATGCCTTTCATCTGAG	a`aaaba``aaaaa]aabb`Zaaaabb^]^`abba`	chr10.fa		3050352	F	36	119					
+HWUSI-EAS610	1	4	39	640	383	0	1	ACACTCATCAAGCCTGAGTGCCAAGACCTTCCTTAC	aab_aa^a`abaaaa_ba_aa_]^aaaaa`^`\XU]	chr10.fa		3050427	F	36	119					
+HWUSI-EAS610	1	4	94	537	544	0	1	CATCAAGCCTGAGTGCCAAGACCTTCCTTACCAGTC	`abaaaaaaba`a]baabaa`^aaa`aUa_aW\a\_	chr10.fa		3050432	F	36	119					
+HWUSI-EAS610	1	4	27	762	1728	0	1	TACATGTGCACGTGCGCGTGCATGTGTGTGTGTGTG	ab`ab`X_a`_a_aaa_`_ba`ba^a`a_``aS`\a	chr10.fa		3050896	F	36	63					
+HWUSI-EAS610	1	4	23	674	1687	0	1	ACTGCTGGCCAGGGAAATGCCTTGCCTTTCGGGGTT	aRZZ]P\R]O]a[PYX]][]V[Wa[QVXNLUXWMQY	chr10.fa		3051347	F	36	117					
+HWUSI-EAS610	1	4	73	512	1867	0	1	CAGCATTCAAAGGCTGTTACCATCTAACCTCAATCC	aaaabaaaaba_aaa`^_Z_aU`a[X^`a_]S_^^_	chr10.fa		3051573	F	36	119					
+HWUSI-EAS610	1	4	96	1164	1079	0	1	CAGCATTCAAAGGCTGTTACCATCTAACCTCAATCC	\bSS`^\Uab[YbbabKbb`aa\WX_`]\`Q_[W]B	chr10.fa		3051573	F	36	114					
+HWUSI-EAS610	1	4	68	674	1569	0	1	GGACAATTCCTGAATCTTTACCCTGAGTCAAGTGCA	UaK``abb_b`R\``a^UZaUa`]aba[VW`ZVaWb	chr10.fa		3051709	F	36	118					
+HWUSI-EAS610	1	4	75	228	1277	0	1	GATTTGAACAAGACAAAGTCTACAGCCCTAAAAGGC	a_^`X_U\ZT\X^`_ZV_G]]^\\OY^YX]U^UZZ^	chr10.fa		3051805	R	36	118					
+HWUSI-EAS610	1	4	77	1349	665	0	1	CGGGATACATTCATTCATTTGTTTGTTTGTTCATTC	^\LYS_RQQ\WUY_Z^_`abaZZ__HT_YQ^Y_^[`	chr10.fa		3051876	R	36	117					
+HWUSI-EAS610	1	4	52	1616	1521	0	1	TGTTTAGTCTGGTGATGTAGGGCATGTTACTCTTGT	]_Z``[aX`bXMYa]R]aa`W[Y^_a_\`[a[]_aB	chr10.fa		3052124	R	36	114					
+HWUSI-EAS610	1	4	96	21	347	0	1	GCTGTGCCTTGTCCCTTGATTCGCTATGTTAGCCCA	`aa]R_`^[`a__T^_[_[S[__^`_\[UZZ[[^]Y	chr10.fa		3052278	R	24C11	82					
+HWUSI-EAS610	1	4	52	949	1919	0	1	ATGAAATGTCTGAAAAATGAGCCCAAGGGCAAGTGG	aabaaabbY_`a___a`[aaa_\^`^``_``_aR_a	chr10.fa		3052350	R	36	119					
+HWUSI-EAS610	1	4	29	1704	1377	0	1	TTTTTCAGACATTTCATTTTCTTGAAGTCAACCTCA	abaa`aa`a__`aa``aaaa^aa_a`_]^`^]^__]	chr10.fa		3052369	F	36	119					
+HWUSI-EAS610	1	4	17	494	1584	0	1	AATAAAATAAACAACAAAACCCCTCTTGTTGTGGAC	`_ab`_\^Yba_aba_aT_]]``aaa``S]aYa`]B	chr10.fa		3052871	F	22T13	78					
+HWUSI-EAS610	1	4	42	681	123	0	1	GGTGCAGTGCTGGAGAGAGGAGGTATGAGGGAGAAA	]b^baaaTba`aaXZYbZb]]abW\^OE]a`T[BBB	chr10.fa		3053222	R	35C	102					
+HWUSI-EAS610	1	4	63	787	838	0	1	GGAGAGCTAGCCCAGCCCCTTCTAGCTGCACCATTG	X_```a`Y^_`Za`_a^\^`_`\``Y[\Z^SFTR]Q	chr10.fa		3053258	R	36	117					
+HWUSI-EAS610	1	4	3	449	840	0	1	TGGGCTAGCTCTCCCATCTTCATGCCCTTGGGGATA	abbbaabb``abaabaa^aaaa\a[Z_Z_aaa`a``	chr10.fa		3053280	F	36	119					
+HWUSI-EAS610	1	4	45	1582	886	0	1	GTGAATTATCCCCAAGGGCATGAAGATGGGAGAGCT	^a^`a``aa_]^Z`R[TZX`_a`_[\]QTTWMYZ]V	chr10.fa		3053286	R	36	118					
+HWUSI-EAS610	1	4	2	1518	1677	0	1	TGCTACCAGGGCCAGCTCTCCTGTGCTGCCCAGGTG	aa_`a^`]`_`[``^]`\^X^aaY`ZXa\ZZ[V]Z^	chr10.fa		3053331	F	36	46					
+HWUSI-EAS610	1	4	42	1242	884	0	1	TGCAGGGACAGCCTGCTAGGGGTGGCTGGGAGGAGC	a``a_`]a`a``]`a``aaaa]Q][V]a^Y\\^Z\B	chr10.fa		3053370	F	36	114					
+HWUSI-EAS610	1	4	10	1429	371	0	1	TTGTGCACATGAGAGCAGGCTATGCCTGCCCCTTGT	a`_SY_a`_\U^G]U]`^Y^`Z\UTWTSUUUWWWSU	chr10.fa		3053441	R	36	117					
+HWUSI-EAS610	1	4	90	29	545	0	1	GGCATAGCCTGCTCTCATGTGCACAAGGCTGGATCC	abb]aaZbbabbbb`ba_]Vbb]`a]Ybb^ba`\ba	chr10.fa		3053451	F	36	119					
+HWUSI-EAS610	1	4	58	1646	1397	0	1	GGGATCCAGCCTTGTGCACATGAGAGCAGGCTATGC	`a`aaa_a`_ab``````a_b^aSaV^__W^aa^Za	chr10.fa		3053452	R	36	119					
+HWUSI-EAS610	1	4	99	891	1497	0	1	GTGCTGTTCTGATGAAGTGCAGAATTGCTCCCCTCA	aZ`b[a_a^baaaaba\ZbUHWYZ[^]NZU\`_Z^U	chr10.fa		3053519	F	34G1	83					
+HWUSI-EAS610	1	4	89	532	1659	0	1	TGTAGTGACATTTGGACCCATGCTGTGGCCAGAGGC	_V]ab`\aa`ba_aa`aaa_aaaa`^^aa__^]\a^	chr10.fa		3053741	R	36	119					
+HWUSI-EAS610	1	4	56	323	697	0	1	TGGTTTGGGCTGCCACAAGAAACCATGTGGATGACT	`a[`aY`a`a`_bbaa_Y`aaa``aabU_```aa__	chr10.fa		3053838	R	36	119					
+HWUSI-EAS610	1	4	15	1549	940	0	1	GCTGTGGTCTGCATCAATGTCTGTGGCCCGAGTGAC	aWW[XT[NW[VTVa^]]^\NOZHIO\YBBBBBBBBB	chr10.fa		3053898	R	21C14	47					
+HWUSI-EAS610	1	4	7	686	1476	0	1	TCCTACACTGTGGAGAAAAGTGGACCTGGAGACTCA	`R]^SY^Waa``\[a_S`X[QUR_I[a]\LYV^^\X	chr10.fa		3054050	R	36	118					
+HWUSI-EAS610	1	4	59	867	1404	0	1	ATACAGCAAAACAACAGTATGATGTGGTGACCTAGT	aa^WYVX`b]YX]\[aa]a^[R`\VOMQOLRJ[aa_	chr10.fa		3054276	R	36	117					
+HWUSI-EAS610	1	4	22	759	1729	0	1	ACTAGAGTTGGATAAATAAATGGGAGAGAAAAGACA	`^baaaa^_b^a`aa_aa]]aa`a[`R`_`_\^^[]	chr10.fa		3054876	R	36	119					
+HWUSI-EAS610	1	4	100	80	305	0	1	GGGTTTTGCCGTGCTGTAGGTTGAATACAGGGATTC	abbSbb[aaabU`aa`UYa`Wabaa_ba^aab_^a`	chr10.fa		3055044	R	36	119					
+HWUSI-EAS610	1	4	40	1404	727	0	1	TATACTTTCTTTTTGTTTTGGTTTTTGGTTGTTGTT	`Z__aaa`[abaa`[\aaa`TT``aa]W[^]Y`a]W	chr10.fa		3055617	F	36	119					
+HWUSI-EAS610	1	4	48	437	1257	0	1	AGCTTCCTCCGGAGACCTTGCTCCTTCAGGCCACTG	a_a`[``[`^a\V_[[\\]S\^`^Z^\[\^XZ`T\^	chr10.fa		3055828	R	36	119					
+HWUSI-EAS610	1	4	3	82	277	0	1	GAATAGGCAGCTAAAAAATGCTTCTGCAGAGGCCAT	``_`a``a^_a][]P_^a_Ta`^a__a_[]`_^`_`	chr10.fa		3056216	R	36	119					
+HWUSI-EAS610	1	4	39	1254	1954	0	1	GGAAATAGTTCCTGGAACTTTCAGCTTTGACAGGGC	a`a`_a`_]a_[`_\_a]``___[U]_^__R]_X\^	chr10.fa		3056420	F	36	119					
+HWUSI-EAS610	1	4	10	301	2039	0	1	TGTCTCCCACTGACCTAGCTTACAGCCTCAGCCTTT	^_K_aabbaab_`bbQWT_S`_V__`]Wbaaaa_aa	chr10.fa		3056543	R	36	118					
+HWUSI-EAS610	1	4	51	801	899	0	1	ACCCCCATTTCTCCCTCTATTGCCAGATAGGGCTCT	TT`bb^^ab_\V`TT[bbaZ_W[W\_URQO__TQX_	chr10.fa		3056634	R	36	118					
+HWUSI-EAS610	1	4	28	1099	999	0	1	GGAGAAATGGGGGTGGAGTTGGGACAGAGACATGAT	ab\aR^\`aaa``U][[a_``_YX\\\\_\W\\_\]	chr10.fa		3056656	F	35A	85					
+HWUSI-EAS610	1	4	30	1219	1445	0	1	TAGAAGCCTGTGTCTGCAGAAACAGTCCTACATCAG	_bbbaba[\[W`aaabbbb_V\abbabbbab`abab	chr10.fa		3059757	R	C35	83					
+HWUSI-EAS610	1	4	7	859	1742	0	1	GTGTGGGAGAGCCCAGTCCACTGTGGGCAGTGTGAC	`ZaYa\\\`Z^`^Z\`P`_^ZZ\N`^Z\Z`ZZT`\B	chr10.fa		3060220	R	36	33					
+HWUSI-EAS610	1	4	4	874	1154	0	1	GTGCTAAGGAGCTGTGAAAACCCGTTCTGTAACTTC	aQ_U^]]U_]^]]_\^_]_`]X][YUY]_U]UU_XU	chr10.fa		3061375	R	36	118					
+HWUSI-EAS610	1	4	12	908	80	0	1	TCCAAGGCCAATAGAAATGAATGTCTTCTTCATGGA	]^^bb``Yaaabbaa_`^a_`ab^a_a_aa_aaaaa	chr10.fa		3061820	F	36	119					
+HWUSI-EAS610	1	4	90	601	1839	0	1	TGGCACTAGAAATCTCAAATGCAACTTCGATCCTGG	Wbbbb_babb``]bbbba_babbaabaab_`aa_^a	chr10.fa		3061884	F	36	119					
+HWUSI-EAS610	1	4	97	627	2008	0	1	CTCCTCTTTCACCAGGATCGAAGTTGCATTTGAGAT	aabaaaaaaaaaaa``a_a`__`]^`a_^^``_``^	chr10.fa		3061895	R	36	119					
+HWUSI-EAS610	1	4	89	1311	374	0	1	ATGGGGATGAGGCCCAAGACTGTAGTGTCAAGTACA	abb`]Y\a`[\aa`_][_a_`R^^_T[[][`UUa^_	chr10.fa		3062057	F	36	119					
+HWUSI-EAS610	1	4	65	938	1548	0	1	ATTGGTCATGGAGGTGCTGCTAGGTTACCTGGCTCT	a]a_WGV]\_`ZX^[\[WZ[WKY]J`ONWaBBBBBB	chr10.fa		3062530	F	35A	88					
+HWUSI-EAS610	1	4	72	808	970	0	1	GGATGTTCTTCTGAGCCAGGTAACCTAGCAGCACCT	abaaaaaaaaa`\_`aaaaa_aa_Y_aa`a\^^[``	chr10.fa		3062541	R	36	119					
+HWUSI-EAS610	1	4	38	1457	492	0	1	AAACAGCAACAAAATTAAGTTTATGGTTGGGGGTCA	a_a]^_^^__`]_`a_`a`O```_^]S]]YNY]S]_	chr10.fa		3062683	F	36	31					
+HWUSI-EAS610	1	4	79	37	948	0	1	CTGTCGGGCACAGCTTCGCTGAAGATGTGGAGACAC	a_`\a`^`aZZU`a\\^Qa\XOFQPS^W[RNQNYUU	chr10.fa		3062975	R	36	116					
+HWUSI-EAS610	1	4	37	396	1627	0	1	TGGAGTTTGCCATTTCAGATAAACCAGTCAATGCTC	VbaX`^b_U`ba^Y\a^aZ``b`bb`b_baababab	chr10.fa		3063095	R	36	119					
+HWUSI-EAS610	1	4	86	1466	159	0	1	GCTCAATGAGAGATGAGGTCTCACTATGTTACCCAG	\YV\RT`]]_YR_GU_WaT`_Q^VU`_]YRRT^PRV	chr10.fa		3063132	F	36	117					
+HWUSI-EAS610	1	4	72	1254	1018	0	1	TGTCCAACTCTTGGAATCAAACGATCCTCCTGCCTC	`aa`[^a_a^a`Z`aaaaa_^a`a``V^`___W___	chr10.fa		3063173	F	36	119					
+HWUSI-EAS610	1	4	63	441	1688	0	1	GATGAGTTCTCTTACGGAACCTGAAGTTCACTGTTC	a`a__ba`aaaaa]aZ]_aa`a^L[`Q\^^^^VZ_`	chr10.fa		3063350	F	36	118					
+HWUSI-EAS610	1	4	10	556	390	0	1	TGAGAATCTGCTTGTCTCTGCCCATCAGCTTTGGGG	abbbaabaaaaaaa``baaba`aaaaaa``aaa^a`	chr10.fa		3063412	F	36	119					
+HWUSI-EAS610	1	4	15	629	177	0	1	ACAAACTGAGGTCTCCATGCATGTGCAGCCATCTTT	abaaa`_ab_b^a`aa`aa`a_`_`_]a````_aaa	chr10.fa		3063483	F	20G15	81					
+HWUSI-EAS610	1	4	69	328	109	0	1	AAAGCTTCCTGCCAAAGCAGGCACTAAGAGCAGCCA	aaa```a___aaa`a^\Z]\__`^_ZVZZ^Z^[[S[	chr10.fa		3063612	F	36	119					
+HWUSI-EAS610	1	4	90	677	2046	0	1	NTACAGTCCAGAAGAACTCAGTGTCACNGNNNNCAG	DLWYYWYWWWWXWSURSYBBBBBBBBBBBBBBBBBB	chr10.fa		3064065	R	G26T1ATAA3	19					
+HWUSI-EAS610	1	4	42	427	856	0	1	GCAGGAACAAGAAAATCTCTCAGTACAGTCCAGAAG	a_abbaaabab`aa`aaabab]a_a_a\^aaaa`aa	chr10.fa		3064087	R	36	119					
+HWUSI-EAS610	1	4	11	165	764	0	1	CTAAAGCAGGCTAAATGCAGGAACAAGAAAATCTCT	a_[^`aa^]`aaa]```aa``aaaa_a_`__a`_a_	chr10.fa		3064103	R	36	119					
+HWUSI-EAS610	1	4	62	916	88	0	1	ATTTATTGAGACACCACTAAACCTGAGAGTAGAATT	abbaaabaa`a\aYF^]aa_a^]a`^aXa[_`]_a`	chr10.fa		3064193	F	36	118					
+HWUSI-EAS610	1	4	34	49	1662	0	1	CATTGTGCACGGTAAAGTAGGGTCATGAGAAGTCTG	aa_aa^bb_aaaH^[_`Q^ZH`Z^XLM^`aa[PS\Z	chr10.fa		3064616	F	9T10T15	67					
+HWUSI-EAS610	1	4	71	1189	772	0	1	TTTGTTCAATATTCAATCCTGCCATGTGGCTCCACC	aaa`W\V[__a__Z[`_^_a_Y^[]\YWVU]TRRV[	chr10.fa		3064752	R	36	119					
+HWUSI-EAS610	1	4	12	1500	1224	0	1	CACCACCAAAACAGGAGGGTGTCTTTTGCCAGACCT	abbbaabb`aaXaaabbaaQaaabb^a_a^V^`aa^	chr10.fa		3064848	R	36	119					
+HWUSI-EAS610	1	4	84	805	1798	0	1	TTCAAAATCCATCAGACACGTTGTTTACATAAGTTC	`bbZTZ^b`b]aa]N[]aab[W`Ya`_J[Y`aRQPa	chr10.fa		3065275	R	36	118					
+HWUSI-EAS610	1	4	59	75	751	0	1	AGCCTGAGATGCGAACCCACGAGAAGGTTCTACACC	^`b^`ba_ZUaaa`a]]_]]VG]]^aa[Saaa\]a`	chr10.fa		3065496	F	36	118					
+HWUSI-EAS610	1	4	11	733	899	0	1	CGCATGGTGTAGAACCTTCTCGTGGGTTCGCATCTC	abbbbbbababbaba`bb`bababab`aabaababa	chr10.fa		3065501	R	36	119					
+HWUSI-EAS610	1	4	38	1345	476	0	1	ACGGAACTGTCCTGCATGCACAGTCTAAGCCACGTA	aa``aa^a__a^a`\a_a_`Za_Z_``^^ZW_^`_`	chr10.fa		3065554	F	33A2	82					
+HWUSI-EAS610	1	4	75	614	782	0	1	GACCTTTTCCCGAGGGGCAATCATTTGCCCTGCCTG	\a_]]ZbaZa`]P`ZbZaa`]`]\`\baOTO\W]ab	chr10.fa		3065642	R	36	118					
+HWUSI-EAS610	1	4	37	762	1677	0	1	CAGAGCAGTCATTGTGTTATGAATTTAGAGGTGGAA	abbabbbbaaabb`abababbbabbbbb_bb`bbaa	chr10.fa		3065717	F	36	119					
+HWUSI-EAS610	1	4	95	1105	548	0	1	CACAAGTTAACCCAAGGCACATTCCACCTCTAAATT	ab_bba\abb`_aabb`aabbabbab]a`aabaaab	chr10.fa		3065738	R	36	119					
+HWUSI-EAS610	1	4	45	1782	1328	0	1	TGCCCAGAATTCTTGCTTCCCTGTAGATCAAGTGGT	WNZ`P^a__NY^`ZXU_aa`^\SZTUZ^^YULT]RS	chr10.fa		3066000	F	36	118					
+HWUSI-EAS610	1	4	84	309	13	0	1	GCCTCGAACTCAGAGTTCTGCCAGCCTCAGCATCCT	aaaa`MZ``^[Z`^aPT`^\^VNZBBBBBBBBBBBB	chr10.fa		3066307	F	31T4	64					
+HWUSI-EAS610	1	4	40	674	89	0	1	CATGTGACATGCTGTTCTGGATACTTAAGGGTGTCT	abbaaaa`aaaaaa_a`ab```a_`aP`aaaWa\_`	chr10.fa		3066711	F	9C26	81					
+HWUSI-EAS610	1	4	59	1443	1654	0	1	ATTTTAAACTGTTTCCAGAAAGGATGGAGAGCCATG	abbaaaaaaabaaba_abaaaaa^`aa_`__]]`aa	chr10.fa		3066783	R	8T27	81					
+HWUSI-EAS610	1	4	85	526	1212	0	1	CCAGAGTTATATGATGGATATACGGAAGCTTTTTAA	a^\W[bWQR]aab]^^^BBBBBBBBBBBBBBBBBBB	chr10.fa		3066845	F	17C7T6C3	29					
+HWUSI-EAS610	1	4	39	677	232	0	1	GTAGCTTTCTAATAGTAGCAACAGAGAAGAGAGGTG	aHaaWUVO]__Y_XaOZ]_WZ]X^QaZUJNZG_ZZ`	chr10.fa		3066869	F	31T4	105					
+HWUSI-EAS610	1	4	78	1145	1047	0	1	TGTGTAGTGTGTGTGTAGTGTATGCATGTGTGCATA	`bYbIYR_b_aLZZVXX`X\`]ZYPRVO[BBBBBBB	chr10.fa		3067795	F	36	6					
+HWUSI-EAS610	1	4	87	236	817	0	1	CATGTATATGCGTTTGTGTGTGAATGTGGAAGTCAG	``abXVY^abbb`b``__N_Sb^^bbabbZTUDOX]	chr10.fa		3067838	F	31A4	90					
+HWUSI-EAS610	1	4	47	1169	1363	0	1	CACAGAGGCATACGTATATACAAACACACATATACA	ab`aaaaZ\baa__^aaaa`_aaa`a_a]a_``aY`	chr10.fa		3068740	F	3G30T1	51					
+HWUSI-EAS610	1	4	34	703	1165	0	1	TTTGTTATTTGAGTGCGTGTGTGTTTGTGTGTCTCT	`bbb`a\^^aUWaO`Ua_a_]Ia\\aVY\]XNPVR^	chr10.fa		3068877	R	15T20	92					
+HWUSI-EAS610	1	4	38	841	1565	0	1	CACTGGGAGTAAAAAGTTCCCCACTCGGTGCACAAG	abbbbbbaba]aaa``abba`a`_`aaa_a^Z]aaa	chr10.fa		3069020	F	36	119					
+HWUSI-EAS610	1	4	38	18	746	0	1	GCAATTTAGGATTTCAGACTATAAAGTATTGTCTAT	aaZ\_a`_aa]aaaa^`^aaa_ZY^a[_`aa^a^[\	chr10.fa		3070184	F	36	119					
+HWUSI-EAS610	1	4	53	288	1180	0	1	AAGAACTGTTTTAAAGGGTTGCAGCCTTAAGAAGGT	`^`Wa`b\aba_M]YWT_Ub`bVab^a[__V_^a`R	chr10.fa		3070442	F	36	34					
+HWUSI-EAS610	1	4	61	932	1466	0	1	TGCTGTAAAAGATTGTGTTTTCTGAGAAAAGTCACC	ab_aba`a__a_aaa[aa`aa_ba`a\^^aa^_a__	chr10.fa		3070488	F	36	119					
+HWUSI-EAS610	1	4	73	647	101	0	1	GAAGTGGGTGACTTTTCTCAGAAAACACAATCTTTT	a^aaZ^a`U^\T]`ab`a`]a`X\`^`[`\`]_``a	chr10.fa		3070494	R	36	119					
+HWUSI-EAS610	1	4	23	1594	610	0	1	AGTGATGTGTGTGTGTGTGTGTCCCTGAAGTCCAGC	aa`Z_a[V[[Z^a[\[]W\XXZ`_`]SZ\YT^WYYY	chr10.fa		3070543	F	36	119					
+HWUSI-EAS610	1	4	31	1039	146	0	1	TGCAGGTGCATGTAAAATAGGTGCAGACTCAGTGGC	^a_aba]_^^_b`a``babaaY^ab]`aaa`XZ\_[	chr10.fa		3070718	F	36	119					
+HWUSI-EAS610	1	4	33	1726	692	0	1	GCTGACACNGTTGACACAGGGTAAGTGTTTCTAGGA	_X^a`aaXDQ^`Z`aa`aaa\[_a_^Z[_`^``^UY	chr10.fa		3070811	F	8A27	110					
+HWUSI-EAS610	1	4	16	178	663	0	1	GAAACTGCATGTGAACCTGAGAAAACGAGGAACCCA	`[^]YP\S\]a``LZN_``La^]]`a`[RU]]_[^]	chr10.fa		3070853	F	36	118					
+HWUSI-EAS610	1	4	60	1383	819	0	1	GGATCGTTTGCACACCTGCCTTTCCTGGAAATGTTT	abaa``^`^Z_a`a_a`a`[aaa]_^_\^^^``_`_	chr10.fa		3070888	R	36	119					
+HWUSI-EAS610	1	4	90	1220	352	0	1	GTCCCCTCTGCCCTCCTTCCTCTATAGCAAATGTGT	aaa[^Y]___XRS][^\\UVa\_\`___^UZ__U`W	chr10.fa		3070967	F	36	119					
+HWUSI-EAS610	1	4	62	804	767	0	1	TGCTACACGTGATTGACGGCAGCGCAGGCACACTTT	aabbbaaab]bXbaaa`a^aYZOWPQW\MOENYX]a	chr10.fa		3071037	R	36	116					
+HWUSI-EAS610	1	4	16	82	646	0	1	GAATATTCAGGCTAAGTTCCAGGTCAATTACTCAAA	^YX]`\aa^]`b^_\aW[]_]_^```^^_]_`aZZ\	chr10.fa		3071952	F	36	119					
+HWUSI-EAS610	1	4	68	53	1038	0	1	GGGACCTCACAGCACACCGTGTATTTCTATATCCAG	a^\]`ba_\`\`a^`[`a^R]OQ^`aa_^]]]aa`^	chr10.fa		3072165	R	36	33					
+HWUSI-EAS610	1	4	26	828	348	0	1	TGAGCTCTCGTGATTATTTAGGTGCTTGAGCAGGCT	a_`^^a^`ZYPY^aaRa``Z``ZTZYUYV^XRX_X^	chr10.fa		3072310	F	36	118					
+HWUSI-EAS610	1	4	20	888	992	0	1	CAAACCTAGGCGCTAACAATGTGACCCATGACCGCA	a\W\abaaa]aa`baaabbbb^]^^`aaaba```ba	chr10.fa		3072446	F	36	57					
+HWUSI-EAS610	1	4	69	1103	33	0	1	TAACCTTCCTTCTCCTCATCTTCTTCCCTCTCCCAC	_[]W\_S\QV`\\\Y\^_[WUW\\\\YU\WUNRVUW	chr10.fa		3072874	F	36	118					
+HWUSI-EAS610	1	4	15	1634	1142	0	1	CAACAATAAGACACACTGTGTCAAAGGAGGTGGATA	aabaaaabaa^^aa`_aa`a^__aa_Z^X_V^^^]`	chr10.fa		3072954	F	36	119					
+HWUSI-EAS610	1	4	68	200	1581	0	1	AACATGTGTGTGTGTGTGTGCTGGGGGAGAGGGCCA	^Ya[^b`_Ya\a^`YaZ]T`aaa`_a`Q`]^JPZ_U	chr10.fa		3073023	R	36	118					
+HWUSI-EAS610	1	4	53	972	1430	0	1	TGTGTGTATTTGTGAACATGTGTGTGTGTGTGTGCT	ab_a^a]_`a`a_``a^_ba_`Z`^aZ`Za^`Za]`	chr10.fa		3073037	R	36	48					
+HWUSI-EAS610	1	4	71	1004	2020	0	1	TGTGTGTATTTGTGAACATGTGTGTGTGTGTGTGCT	abW[_aP\_a_^`aOYY`__XaT_V_GY]`X_UWWS	chr10.fa		3073037	R	36	17					
+HWUSI-EAS610	1	4	11	1017	992	0	1	GAGTTATATAAGAAGAAATCACCCACAATGCATTTC	aab`aab`aa]b_aaaaaa^_\^[`a\^^b^_`aS[	chr10.fa		3073135	R	36	119					
+HWUSI-EAS610	1	4	16	554	128	0	1	ATGCATTGTGGGTGATTTCTTCTTATATAACTCCTA	a`a``_a_]__`Ua```Z__`_a_a_a_`^^_````	chr10.fa		3073138	F	36	119					
+HWUSI-EAS610	1	4	31	1250	1498	0	1	AGGTGAGTGAAAGGTGAGTAATGACTGTGAAGGCCC	aa]JX]aRVZWYZ`[`XZTa\a^\```\[QX\`^ZS	chr10.fa		3073259	F	36	118					
+HWUSI-EAS610	1	4	73	454	1328	0	1	ATTATGCCACCATAATCAGCAAGAACATTTTAAATT	aaabaaa_a`aaa`[[TOY]^YW[``a`\`Z\OUZY	chr10.fa		3073354	R	36	118					
+HWUSI-EAS610	1	4	61	592	325	0	1	ATACTCAGTTTAGCCTTGAGAGTCAGGGTTGTCCAC	`a`bbbbaabbbaaaaaaabaa_^abb`[a_`aaa_	chr10.fa		3073859	F	36	119					
+HWUSI-EAS610	1	4	68	378	1242	0	1	GGTGCCCACAGTGGGCTTGGCCCTCTCATATCCATC	``^aa``^_RaY\`aa\]]`Y`\`XY]]\^^\[T]\	chr10.fa		3074545	F	36	119					
+HWUSI-EAS610	1	4	11	252	841	0	1	TGTAAGAGACTGTCCTGATTAATGATGGATATGAGA	`a]__a^a`____aa`a^___^_a]_aa]]a``W\`	chr10.fa		3074568	R	36	119					
+HWUSI-EAS610	1	4	48	1688	965	0	1	TATCATCAACTTGGCACAACCTGCAGTCACCAGAAA	ababaaaab`\_[]`aaaa_]^```^]_`W_`__aa	chr10.fa		3074672	R	36	119					
+HWUSI-EAS610	1	4	78	383	380	0	1	AAACAGAATCTGCCCCAGTCTAGTTATGAAACTGTG	aaa`abab_`_baa``[`][U^`P`_a``a`S`a]a	chr10.fa		3074765	R	36	119					
+HWUSI-EAS610	1	4	59	202	65	0	1	GACTGGGGCAGATTCTGTTTTATCAGTATACTATGA	a``_a_a`aXa_[[a`a^`_X^____O]_`^`^]_B	chr10.fa		3074781	F	36	114					
+HWUSI-EAS610	1	4	60	659	361	0	1	GACTGGGGCAGATTCTGTTTTATCAGTATACTATGA	aaaa^Z^``^^Z`a_^a\_`a_`X[_]___Z`]__\	chr10.fa		3074781	F	36	119					
+HWUSI-EAS610	1	4	81	926	1094	0	1	TGGTTCTCAGTGAGGACCAACATCTTCACATACAAA	abaabaa`aaYbYa`a`aab`aa_aa`aaa`a^a_`	chr10.fa		3075016	R	36	119					
+HWUSI-EAS610	1	4	69	1583	1004	0	1	GTAGAAAGGTTTTTCATTGCTCTCTCTCTTTCCCTC	^^]\YU]Z`[WZW]SY\[NT^G[X]T`WWDUU]Y_Z	chr10.fa		3075554	R	29C6	109					
+HWUSI-EAS610	1	4	67	1453	1528	0	1	GAGAGAGAGAGAGCAATGAAAAACCTTTCTACCACC	a^`[[Sa`^_^]`^_aa_aa_a_^\^``]__ZUPY`	chr10.fa		3075558	F	36	119					
+HWUSI-EAS610	1	4	83	1086	1507	0	1	TGAAAAACCTTTCTACCACCATCCTAGATGGATCAG	abababaababbaaaa`ba`baa_aba`abaa__bb	chr10.fa		3075574	F	36	119					
+HWUSI-EAS610	1	4	49	1089	1396	0	1	GAGCAGACTTCCAGTATGCACCAGGCACAGAGGATG	a`baaaa_aaa``a`baaaa`aaaaZ_^]a]a\_aa	chr10.fa		3075615	F	36	119					
+HWUSI-EAS610	1	4	74	1541	1538	0	1	ACAGGCAAGCATGCTCTTGCCNGAGGGAAGATGGAA	aa_]`_\\`^a]a^_aa^`XYDXP^^YYYYY\YYYY	chr10.fa		3076024	R	21A14	110					
+HWUSI-EAS610	1	4	7	269	1968	0	1	AACTTCTACAGGCAAGCATGCTCTTGCCAGAGGGAA	OO[IYaSU`X\_b_W]`_S_aP^TM[aaY`YVOZ]Y	chr10.fa		3076031	R	36	117					
+HWUSI-EAS610	1	4	31	1184	1619	0	1	AAGACAGCTATGCCAGAATATCCCCCAATCCGGAGT	XZZWU\[IaUaU\X`b][[[]Q]R^a]]W^WPIRWY	chr10.fa		3076815	R	36	117					
+HWUSI-EAS610	1	4	62	646	328	0	1	AAAGGTTCTCTAAAGTTGGATTCCAAAGCTGTGTGT	_ZZYa[a_a`aaaa`_^`_____]Y_`\[^^ZYYaV	chr10.fa		3077096	R	36	119					
+HWUSI-EAS610	1	4	95	86	96	0	1	CATCATCAGTCTGACTTCTTCCCCATGGGACGAGGT	aaaaaaaaa\a_a`aa`a`_[^a`^\a[^^__\^[W	chr10.fa		3077164	F	36	119					
+HWUSI-EAS610	1	4	37	1654	260	0	1	TCTTTCTTTATGTGTGTGATCTTGCTTAATCTTCAG	aab`]]aa[aaY^\VUY`a_`a^^``a`aa`_`^]Y	chr10.fa		3077454	F	36	119					
+HWUSI-EAS610	1	4	100	1665	697	0	1	CGACGGCACATGCCTTTAATCCCAGTTGGTATTTGG	abaaaI`a`b``a__aaab_```a]U[`aTY^_\P[	chr10.fa		3077599	F	36	118					
+HWUSI-EAS610	1	4	39	966	980	0	1	GCTGTGCCCAAGAGTCCCTGAAGAGCAAGAGCCAAA	aabaaaaaXaZZWb]ab^`^VV]a`Za`b`_\`Y]^	chr10.fa		3077794	R	36	119					
+HWUSI-EAS610	1	4	12	1593	1179	0	1	TGGGCACAGCTCTGGGGATACTGTATAGAAGCTTCC	aa_a`baa`_aaaaaa_a`aaaa__aa``_Z__^^Z	chr10.fa		3077820	F	25C10	81					
+HWUSI-EAS610	1	4	33	1168	1111	0	1	AAGCCAACTGTACCATATGTTCTAGCCCTGCACAGA	a_aa^a`]a`XU^_`a_ab_\_`a`X_U__ZWY`_]	chr10.fa		3077876	R	36	119					
+HWUSI-EAS610	1	4	96	692	213	0	1	ATGCTGGCTACACACTGTGAGGAGAACTGAGAAGGG	]JRLW^[[`aZ[Z\Y__G]^PYQ^USPV[RX^QP[_	chr10.fa		3078071	R	36	116					
+HWUSI-EAS610	1	4	46	1604	922	0	1	TGTACCTGTATATGCATGCGCGTGCGCGCGCACACA	a`_a`aa_aaaaa_a`a_aWaRW]]]^]_^^^U^^S	chr10.fa		3078227	R	31G1G1G	25					
+HWUSI-EAS610	1	4	22	1465	321	0	1	GTACGTGTGTACATGTATACAGAGCTCAGAGATCAA	_I^^Z^`Y]O]_^]\]aa`Xa_Z\[VS[]X]_^X\^	chr10.fa		3078268	F	36	118					
+HWUSI-EAS610	1	4	56	72	1419	0	1	GTGGACAGATGAGGCAAGGCTGCCTGGCCAGGAAAC	`X`[F[aaa`]V]`a`a]^a^```\\``a``][ZT\	chr10.fa		3078371	F	36	118					
+HWUSI-EAS610	1	4	61	1093	151	0	1	CCCTTTACATGGCTCTCATGCTTGAGCAGTGATGCT	a__abbbaaaaaaaaa``ababa`a]__`]__`__a	chr10.fa		3078472	F	36	119					
+HWUSI-EAS610	1	4	9	987	659	0	1	ATGGGGACCCAGCAGCAGATGACAGAGAAAACTCTT	_]Q_W`ZYVUT_a]W^[^M_b`YU`^^]^V]R[Xaa	chr10.fa		3078599	R	4A31	91					
+HWUSI-EAS610	1	4	45	766	350	0	1	TTTAAAAACTGATGAGTCTGTGGTGGGGTAAGGGCT	aaaaa`a^]aa``_`a^`^^Y__T`BBBBBBBBBBB	chr10.fa		3078830	R	26T6A2	66					
+HWUSI-EAS610	1	4	57	1604	477	0	1	GGGGGCAGGGGAGGGAAAGAGGATGGAAGCTAGGGA	^XQ_O_[PMXV]SV\[`]\X]TVKO]Y]GN][NZS\	chr10.fa		3079182	R	36	116					
+HWUSI-EAS610	1	4	35	923	41	0	1	TTCTAGATAGCTTTAATATCTTGTTCAGATCATGAT	abaabbaaa```aa_aa`a_aa^__]``_`_]`a_a	chr10.fa		3079690	R	36	119					
+HWUSI-EAS610	1	4	30	970	943	0	1	ATCTAGTCTGGGCCTTTGTTCCTTTTTGGAAGAGCA	aaa^`ZDU\YUY]]a\^a^_`^_^__]_Y]X]QX^]	chr10.fa		3080078	R	6G29	110					
+HWUSI-EAS610	1	4	50	1052	280	0	1	AACTGCCAAACAGCCTCCATGTGTCAACATGCTTCA	ab[^a[Y_]`QY`__]_U_`Y``]XZUU][W^^_BB	chr10.fa		3080117	F	36	110					
+HWUSI-EAS610	1	4	39	265	1292	0	1	AAATGAGTACTGAACACTCATGTCTCTCATGGTAGG	aa\Saab_IIIJU]^Y]Y_VI\F\^a`_aX]BBBBB	chr10.fa		3080177	R	36	93					
+HWUSI-EAS610	1	4	99	255	67	0	1	GCCACATACTGCAACTTGGGTTTTCCCTGGACAAAT	aY\TZaaa]_^^]ZY``_QaU^__X]Y]`XWZURVX	chr10.fa		3080209	R	36	118					
+HWUSI-EAS610	1	4	10	174	157	0	1	GTTTCTAGCAGCAGCATCTCGGCATTGAACCCTTCA	aRMYTLXa\XaXM][__^PHRIa[TNRRTXY[US^T	chr10.fa		3080336	R	19T16	104					
+HWUSI-EAS610	1	4	67	1006	1060	0	1	AAATGTTGTTTCTAGCAGCAGCATCTTGGCATTGAA	`_Vab__YZa\\\abaa__a`aa^J]W_JUTaV]`a	chr10.fa		3080343	R	36	118					
+HWUSI-EAS610	1	4	27	1669	1771	0	1	TGAGCACACCTTTATATGTTCTCTGCCAGTGGGTGT	aa`[_`ZSW\_][X`^ab^_U``[a_XSWR`^]U^B	chr10.fa		3081232	F	36	114					
+HWUSI-EAS610	1	4	22	912	1174	0	1	GTGACCTCCTGGTGACAAAATCCCACAGGCAGATGT	a`aaa`aaa`a^Zaa`a```a]`\```a_^\aW\_\	chr10.fa		3081378	F	36	119					
+HWUSI-EAS610	1	4	3	1186	2043	0	1	CTCACACACTGAACACTGTTTCAAAATTGTCTCATC	\\^`bb_aY`_\aSaR_bSabZ`^aaa`JGLX\_a[	chr10.fa		3081460	R	29G5T	74					
+HWUSI-EAS610	1	4	63	696	352	0	1	AGCAGAAGGAGAGAACTGACTCTCGCCAAGAATTGT	aa`aa`a_^Ya^a]]\`a`Y`__U^^VU_V_^]``_	chr10.fa		3082061	F	27G8	93					
+HWUSI-EAS610	1	4	4	919	2027	0	1	CAGTACAGTGTCTGCCTGTCTGCTGTCATGCTCCTC	abaUbaa]HbXa]aaaXaSaXa_aaU`^`a^```_`	chr10.fa		3082614	R	G35	80					
+HWUSI-EAS610	1	4	25	1709	1812	0	1	CGTGTTAGTGTGCAGAGAACTGTTATTTATATATTG	`bbbbbbbab`aabb`babbbbabababbbaabaaa	chr10.fa		3083015	F	32G3	80					
+HWUSI-EAS610	1	4	59	1481	1211	0	1	CTCAAAGGACCAATTGCAATAATCAAATAATTTGAC	a_]`^QY[Z_`aa^_X[X[[YU\_]__a`aaaab^`	chr10.fa		3083299	F	36	119					
+HWUSI-EAS610	1	4	88	1715	1788	0	1	TCTGACAAAATTGAGAACTGATACTTGTTTGTTGGT	\^baa^_`_[_]`_^U`a__LV\^a_[P^UPS]__]	chr10.fa		3083547	R	1T7C26	52					
+HWUSI-EAS610	1	4	43	683	257	0	1	ATTGTGACAGAAGAGCATGTGGAGCAGAGCAGCTCA	abba`baabaaaa_a``aaaba__aa`_`_a`\_`_	chr10.fa		3083902	F	36	119					
+HWUSI-EAS610	1	4	34	853	1369	0	1	ATCCTTAACTAATGCCCCAGGCACCTCCCAAGCTAA	aa`Uaaa^S`aaaaaa```_a_aP^^ZS]a__U_Ya	chr10.fa		3084132	F	14T21	81					
+HWUSI-EAS610	1	4	95	1445	1593	0	1	TGATCACAAGTGCCTAGTTTGAAATCAGAGAGCAAT	`bab^abaababT[_ba^b`baaba_abbaaaabaa	chr10.fa		3084190	F	36	119					
+HWUSI-EAS610	1	4	6	986	1995	0	1	GAGAGCAATGTCTCCTAGACCCTAGCATCTCTGCAC	abaa`ab`aa`baaabbaa`a[`a^aa`^_`a_^]Q	chr10.fa		3084217	F	36	119					
+HWUSI-EAS610	1	4	21	1734	1921	0	1	CATGAGGCATGTGAGCAAAGTTTGTCCCAGCTGGTG	`ba_aZF\baa\aaaa`aab_aa_\XYV]a\]_aWa	chr10.fa		3084278	R	6T29	108					
+HWUSI-EAS610	1	4	64	642	1581	0	1	CACCAGCTGGGACAAACTTTGCTCACATGACTCATG	a`___[_`a`_``Va]```_^___[[`^[_SX\__`	chr10.fa		3084278	F	36	119					
+HWUSI-EAS610	1	4	76	249	1162	0	1	GTGTTTTCTGTGTATGGACTCCATTGCGATGTGGCT	]N`a`bab`_aaaY`X`a`^a_]YX``_WWQS]aaZ	chr10.fa		3084407	F	36	118					
+HWUSI-EAS610	1	4	30	318	1107	0	1	ATGGACTCCATTGCGATGTGGCTGAATTTTCTCTAA	a__aaa_aa_a`aab`aa^a`aaaa]__a]a`_aa`	chr10.fa		3084420	F	31A1G2	44					
+HWUSI-EAS610	1	4	96	630	2000	0	1	AGATCTCCAGGGCTCCCTGGTCAGCCACAATAGACT	ab]aaSaab_ZU[YGY]Y^[__`aa^aPVQ^BBBBB	chr10.fa		3084868	F	36	96					
+HWUSI-EAS610	1	4	12	1317	824	0	1	AATGTGCTGGAGGCAGGTCACTTGAGGTCACCTCAG	`R]WLOT]][XaaMXZ[SQPWY[^P^TKTOGUTZR]	chr10.fa		3085574	F	36	116					
+HWUSI-EAS610	1	4	10	1522	1843	0	1	TAACAGACCAGATGGCCTCCTGTTTGGCGGAAATCT	aaaX_[_^\[W`Y^TZ\`^YY`U^W\WW\W_Z^\Q\	chr10.fa		3085612	R	36	119					
+HWUSI-EAS610	1	4	88	585	1853	0	1	TAAAGCCCTCAATTAACAGACCAGATGGCCTCCTGT	ab]`bbabba`^`a`aaaababa````Yaaa`a_`_	chr10.fa		3085625	R	36	119					
+HWUSI-EAS610	1	4	92	484	452	0	1	AAGCTGCAACATAGTTTTTAAAATGATGTCATCTCC	`TRX__Z]\UW_`b`bbb`U\b`a`a`^``]a]a]`	chr10.fa		3085856	F	36	119					
+HWUSI-EAS610	1	4	40	1493	1154	0	1	CTGTCACAAGGAGATGACATCATTTTAAAAACTATG	aaa_aa``aaa_`aa`aaa_aa``aa``aXa_a_`a	chr10.fa		3085865	R	36	119					
+HWUSI-EAS610	1	4	94	1583	275	0	1	GCAGCGATACATTTGGATGACTCCGGATGTTGTTAC	_`b`a]aX`aaaaa_[``aa_S_^P]aTXIU__]`Z	chr10.fa		3085914	F	36	118					
+HWUSI-EAS610	1	4	35	1539	1520	0	1	TGAGACACTGNAACAACATCCGGAGTCATCCAAATG	aa_`[_^]`[DT`Y`_]a_WV]X]^TUZ^^XX_\WZ	chr10.fa		3085923	R	10T25	110					
+HWUSI-EAS610	1	4	29	925	762	0	1	CAAGTAGCATTTTTGTGGTGAGGCTTTTTGCAAACA	\bb`^abbbaa`bbbbbaaaaa^bbbbb`bab^bab	chr10.fa		3086195	R	36	119					
+HWUSI-EAS610	1	4	34	50	907	0	1	ACAAAGCTCAAACATGGATGACAAGATTACTGAATG	__ZIPW]XZX_X`^]^\\S__]`X_`^\S````\ST	chr10.fa		3086865	R	34A1	94					
+HWUSI-EAS610	1	4	76	231	1891	0	1	GCCACGCTGGCCTCAAACTCCCAGGGATCTACCTGC	_a_ZEP]J]Ua``a`Xa`Qaa`\a[`IZZ[TP^Z\^	chr10.fa		3087022	R	4G31	108					
+HWUSI-EAS610	1	4	77	1341	651	0	1	CTTTGTATAGCTTTCCTTGACTGCCCTGGAACTCAT	a`]YXT^\^U^]YW\S^_]^``]]YSWVMT]QY]]^	chr10.fa		3087065	R	5C30	93					
+HWUSI-EAS610	1	4	27	449	1049	0	1	GCTGCCGGCATAAGTCAAGGCCAGCGATACCATCAG	ab_a`abbZ\ab``_ba]ZN^aa\aa`aaU_ba]Z`	chr10.fa		3087803	R	36	119					
+HWUSI-EAS610	1	4	16	576	1472	0	1	GTATCGCTGGCCTTGACTTATGCCGGCAGCACACAC	aVb^___\a]^aa``_]`a]U`^^`aX____\`W^^	chr10.fa		3087809	F	36	119					
+HWUSI-EAS610	1	4	23	716	1334	0	1	ACTTATGCCGGCAGCACACACTATTAACACACTTAA	`]^_\`a]ab`[aa]a`_ZZ\]]_\`aW]\`_\^ZT	chr10.fa		3087824	F	36	119					
+HWUSI-EAS610	1	4	1	819	1971	0	1	CGGGGGAGATGACTCTTTCCACTCATTATGAAAATC	ab_\_`]`aa]``[aaaaa^aaaabVM]Z]`Y`BBB	chr10.fa		3087938	R	36	106					
+HWUSI-EAS610	1	4	100	1733	635	0	1	AGAACAGTTGTTCTGGAAGACCCTGCTATGTCTAGG	aaab_a_^_a_``_NYaaa`aZ_^_^\`aYX^^aQ]	chr10.fa		3088498	R	36	119					
+HWUSI-EAS610	1	4	55	129	657	0	1	ATGTCTTAGGGTTTCCCTTCATGCTCTTAGGTCTTG	`aaabbbabaaYbabbaabaK`a]baba]aaYa__`	chr10.fa		3088609	F	36	119					
+HWUSI-EAS610	1	4	19	354	738	0	1	CATGCTCTTAGGTCTTGGCAGCTACCACTTTGAGTT	abaaaaaaa]aa_a^aaaa_a__[^\XT__aXN]Ua	chr10.fa		3088628	F	36	119					
+HWUSI-EAS610	1	4	97	1657	814	0	1	TAGACGGTTGCTTGACACTTTAGTCTGCTTGGGCTC	ab[`^H\I^______`_^\a_a_^`aVT`U[\^^_`	chr10.fa		3088689	F	36	117					
+HWUSI-EAS610	1	4	67	760	1214	0	1	GGGCTTGAGAAGGCAGTTTTGGATCAGAGTGCTGGG	a`aaa`a_aa]b``ZaVaa`aa_a^]`\_^a__a``	chr10.fa		3088778	F	2AG32	43					
+HWUSI-EAS610	1	4	46	136	1853	0	1	AGAGATAGGATTTCTCTGTGTAACCCTGGTTGTCCT	ab___Z`\V_[``a]aPUS`SYU[a]O_^U]_]`_B	chr10.fa		3089260	R	36	35					
+HWUSI-EAS610	1	4	38	1270	766	0	1	AACAGAATGACAAGTGAATAGATACCAATTACATGG	aa_abaa`a``aaa___aaa`aaaa_`_aaa_a_aa	chr10.fa		3089519	R	36	119					
+HWUSI-EAS610	1	4	58	651	1421	0	1	AAGTTGCTTTTGGTCATGGTGTTTGTCACAGAAACA	`bbabbbbbbbbb``abbb`babab```a`a``aa`	chr10.fa		3089551	R	36	31					
+HWUSI-EAS610	1	4	49	537	679	0	1	CCCCTGCTCACTAACCAACCCATTTCTGCTTCCTAG	`aa_b`a_a`babb`a__^aab`ba_``aaab]a_a	chr10.fa		3089856	F	36	57					
+HWUSI-EAS610	1	4	41	426	825	0	1	ATAGCTGTCTCCTGAGGGGCTCTGCTGAGCCTGACA	abZbbaaaaaaaa`aaa_aa[aaaaaaY]aa^_W`a	chr10.fa		3090190	R	36	54					
+HWUSI-EAS610	1	4	25	540	1572	0	1	AATATCATCCTGAGTGAGGTAACAAAAGAACATACA	`abaaabbabbaab`aaab^aaabababaa_aaaXa	chr10.fa		3090519	R	36	32					
+HWUSI-EAS610	1	4	56	1735	564	0	1	TCTGCACCCAAGAGCTGACCCTGTACCACAGCTCTC	`a`^`a`aaaaXaY`]^``X`\^Wa``]^^[^\^^`	chr10.fa		3092562	R	36	13					
+HWUSI-EAS610	1	4	47	1045	1253	0	1	GTCTTACCTGTGCTCGCAGGTGTGTAGGCACCCCTA	``aaaaZ\a[Va]__``aYa\`Wa\^Z^`a^[R^`^	chr10.fa		3092699	F	36	42					
+HWUSI-EAS610	1	4	90	1461	1836	0	1	AGGCTGATTTCTGAGTTTGAGGCCAATCTGGTCTAC	a\OVa___`W^a_Y[V]`][_RLS_\_U]Z\UY]BB	chr10.fa		3093520	F	36	4					
+HWUSI-EAS610	1	4	86	459	432	0	1	CATCCAGGCGGTACTGATTTTGAAGGTGTGAAGGGG	abaa``]aHaaV`^_a`a``b`[]^^\aS___Z`a_	chr10.fa		3094185	F	8T27	97					
+HWUSI-EAS610	1	4	24	1566	1315	0	1	GCAGCCAAAGGGACCTCTATAGGTAAGTTGAATCAT	aabbaaaa]``a_^_aaaaaab__a``]````_]`a	chr10.fa		3095179	F	36	119					
+HWUSI-EAS610	1	4	90	1421	21	0	1	TTAAACCTGATAAGGTGAGTGCCTGATACTGTGCTA	aaba````T``a_`^X`_]_`\_]]`a_^[WPYW_a	chr10.fa		3095269	R	36	119					
+HWUSI-EAS610	1	4	17	864	1561	0	1	AGGGAAGGAGAGACAGGAGTCAGTTCCCGGTGCCTA	abbaaba^a]aa`^\^a]aSaaa_^]`_[aW`\WZ\	chr10.fa		3095543	F	36	119					
+HWUSI-EAS610	1	4	59	410	2043	0	1	CGGTGCCTAGGAAAATAGAGTTATGTTCAGTAAGAG	aa`GY_a`][]T^[`_RTN]RZ\^aU\]Z_N]S[[\	chr10.fa		3095570	F	36	117					
+HWUSI-EAS610	1	4	70	553	866	0	1	ACCAACAGCTGACATGACAGGGGACTCTGGATCCAC	_bababaaaaaaa`aaa`_aaaa^`]___a\UX`a]	chr10.fa		3095861	F	36	119					
+HWUSI-EAS610	1	4	48	585	1073	0	1	TCTGCTGTCAAGGGAAGACACGTGCTCTCAGATTTC	aaa`Xa_[`[_\][UWNP__]NN`_ZZ[XJOHW^UX	chr10.fa		3095902	R	36	117					
+HWUSI-EAS610	1	4	58	626	1724	0	1	ATAACTGGGCCTCTGAGGAAGCTTCCCCCTCCTCTG	a_Q\a`]^^`^^aaaa_\]a^^^[PVV\[QY\`YRB	chr10.fa		3095992	R	36	114					
+HWUSI-EAS610	1	4	67	880	748	0	1	TGGACACCCACATGATTCCTAGACGACTCTCCACAT	aa`[aa_``a`aabaaaa`a_a``a^[a[[__`^^a	chr10.fa		3096239	F	C35	81					
+HWUSI-EAS610	1	4	46	1084	221	0	1	GGAAAGCAGAATACCGTCCTGACCAGGGGCACAAGT	_\Z_W_Z`]]a\a\_TDWQ\V[YR\X[JOM[NSV_Z	chr10.fa		3096348	F	16G19	32					
+HWUSI-EAS610	1	4	79	1343	230	0	1	GGGGTGTCCGCTGATTCCACACCCAAGGTGACCTGG	_ZaOGRQ`^`X[T_^\[^`Y^`^^^`\\P[TUZZZZ	chr10.fa		3096405	R	36	19					
+HWUSI-EAS610	1	4	13	1361	555	0	1	GTCACAATTGGATTGGAACAGATGTGTTCCACTCAC	a_a___]]]V^a^`]`]a_`___`^_]`_^__^_a_	chr10.fa		3096483	R	36	37					
+HWUSI-EAS610	1	4	21	799	577	0	1	CACGTGAATACTGAACAACACTCACCTCAATGATAC	abab`baab`abb_`\T]^]Yaaa_`aaaaaa`a``	chr10.fa		3098791	F	36	46					
+HWUSI-EAS610	1	4	77	658	1314	0	1	AATTTCTTCCATGATTTGTTCCCAATTCTAAGAAGG	aaa`a`aa_^aaa_Z_aa_]_`a___a``Q_a^W_a	chr10.fa		3105613	R	34A1	83					
+HWUSI-EAS610	1	4	18	1004	1650	0	1	AATTAGGGAAACAGCACCCTAATGGAACGATATACA	a_aaaa__a`__aa_a\``a`_a^a\^^`_^_^^X_	chr10.fa		3105645	F	8G2A24	45					
+HWUSI-EAS610	1	4	45	1302	429	0	1	GGAACGATATACAGAGACAAAGTTTGGAGCTGGGAC	U^\``___``_`_Z]]`X_\R^\_a[V\`XZQZ_Y[	chr10.fa		3105668	F	36	21					
+HWUSI-EAS610	1	4	47	1606	624	0	1	GAACCCTTCAGCTCCTTGGTACTTTCTCTAGCTCCT	Vab``abbbb]bbaabb__abaaaaaaaaaX[a`aa	chr10.fa		3105907	R	36	13					
+HWUSI-EAS610	1	4	100	235	27	0	1	AGAAGTGGGAGTGGGTGGGGAGGAGGTATAGGGGCT	a`_P\Y`_TOXKZ_\Y``[WWBBBBBBBBBBBBBBB	chr10.fa		3106109	F	34GC	48					
+HWUSI-EAS610	1	4	23	1197	173	0	1	TTCAAAGCCACTCTAGTCTAATAAACACGAGCAGAG	a`Y]aUaUR_PZ_^PZP\__[S_^_TXTYX]V]W_`	chr10.fa		3106433	R	36	118					
+HWUSI-EAS610	1	4	30	815	76	0	1	ACCTTGTTGAAGGAAGTGTGTCACTGTGAGGGTGGG	a`_abbaaa`aba^`aYa^aWaaa``W__`\_W]\[	chr10.fa		3106524	F	36	30					
+HWUSI-EAS610	1	4	57	228	1426	0	1	ACAAGCTGGGACAAGTGTACTGTGCTGTAAGTCTGT	`^_Z`aaaa]_^`]a[\^a_[aWa`[`[YY]V]_`Z	chr10.fa		3106776	F	36	119					
+HWUSI-EAS610	1	4	78	894	623	0	1	ACGCCAGGCAATGTTGTAAATGGCAAAAGAAGAGAG	aaaa_^SUTa]^ZZY`Ya_b`\`W`a\XTJT]YZ_a	chr10.fa		3107049	F	36	118					
+HWUSI-EAS610	1	4	74	584	426	0	1	TGCCACTCTAATGAGGGAGCCAGGCATGGAACATGT	ababaabab`aab_aaa_aaa`aa_a_a_`a_aaa_	chr10.fa		3107707	F	21G14	82					
+HWUSI-EAS610	1	4	40	1353	1622	0	1	GGCGATGGCAGGAAGGGATCTCCTTTCCTTAGAGTC	a`aaaY^_XNYP^`^[`Ya]^YX[\_[Y\BBBBBBB	chr10.fa		3107780	F	36	88					
+HWUSI-EAS610	1	4	21	488	1991	0	1	TTCTCAGTGTCTACTCTCTTTAGATGCTTTCACCAA	a^ba`a]^aaa`aa_aaaa\aa`Z\a[_^Ya]a\__	chr10.fa		3108153	F	36	119					
+HWUSI-EAS610	1	4	66	821	1810	0	1	CTTTCTGCCTGAGAAATTAAAGATCCAGAATGAATT	abbaaa``abbaa`aaaaaaaaaa`aaaaaaaa_aa	chr10.fa		3108451	F	36	119					
+HWUSI-EAS610	1	4	86	1287	1606	0	1	GAAAACATGACCAGAGAGCAATGGGATCTGCTGCTT	`a^]`^[^__]U^_Y_\_X^\\YUYY]Y]_]X]]X]	chr10.fa		3108726	F	36	119					
+HWUSI-EAS610	1	4	13	1461	858	0	1	ACAAAGAGTCCTGCTTTCAAATAAGCCACCTTGTGT	a_`\a\aXP[]QS__a_`a`a_]\][M]Y]Y]`PYV	chr10.fa		3108844	R	36	118					
+HWUSI-EAS610	1	4	32	304	1108	0	1	CAAGGTGGCTTATTTGAAAGCAGGACTCTTTGTCGC	a^T_a^aabaa`baaba`^abaaaU_a_```Q][BB	chr10.fa		3108847	F	36	110					
+HWUSI-EAS610	1	4	57	1491	767	0	1	AGTGAGCACTGGGGCGACAAAGAGTCCTGCTTTCAA	]WRb`[]aaa`^^\`a^aaaa\`^V^\`__a`_`_a	chr10.fa		3108860	R	36	119					
+HWUSI-EAS610	1	4	87	1530	825	0	1	CATACATGTTATATACACATATACAATACATATATA	aa`aaaa`^]a_a^aa]`bba_b\a_]`_```aYb`	chr10.fa		3110088	F	36	119					
+HWUSI-EAS610	1	4	52	665	572	0	1	GAGCAAGAGGGCAAGAGAGAGCAAGAGAGGGAGGAG	a`_aX_a`ba_`]^a]a`a_a^^\`ZaWa``W``Za	chr10.fa		3110610	R	36	47					
+HWUSI-EAS610	1	4	28	525	1033	0	1	GTGTTCATGACCGGCCTCTTCTCCTGTACTTTCTCC	aaa`aaaaa\____W[^\aa`a__`_V__a`___^^	chr10.fa		3110714	F	36	119					
+HWUSI-EAS610	1	4	19	749	1283	0	1	GAGGGGAATTAAGAGGGTAGTAGACACAGAGAAAGA	a]`_^`Z]^`^_[X__[MY_V`_^^^WW^Z_Z^V`Z	chr10.fa		3110753	R	36	28					
+HWUSI-EAS610	1	4	14	13	1724	0	1	GTAGCCAGAAATGAGAGAACAAGAGCAGAAAAAGGA	`^__`__aSa`aa[]`a_`^__`Z^^M]Z_^H^a_V	chr10.fa		3111111	F	36	118					
+HWUSI-EAS610	1	4	55	463	746	0	1	ACCTGTGCCAGCAAAAGACTGTAAGGATGGGAGAGA	^YF\a`bY_aa^Y^aabaaab_WNaaNaab__bP^U	chr10.fa		3111182	F	2A33	108					
+HWUSI-EAS610	1	4	82	452	559	0	1	TGCATTAGGTTTCACTGTGACCTTTTTCAAGGCCAA	_`a[`aS_^Z^aabb`^T__a___a^a_Z_a`^`\B	chr10.fa		3111277	R	32T3	80					
+HWUSI-EAS610	1	4	41	1675	207	0	1	AAAAAAAAAAGTTTTCAAAAGTTCGGTTTCTGATCC	a`aa_abaa]PR\`YPXaa`SUXZZRW]W[ZSVU^R	chr10.fa		3111328	F	36	118					
+HWUSI-EAS610	1	4	35	855	29	0	1	CAGAAGAAGAGAGAGGAGACTGTAAAGGCACTTAGA	`abb__bab__a]aaba`Y_aaa_Yaaa`_W__aa`	chr10.fa		3111611	F	36	119					
+HWUSI-EAS610	1	4	48	1222	1149	0	1	GGTTTGCAAATGCCATCTAGTGTTCTTTGCAGATTC	`a_]`X_a__]^Z]_a_a]b^a^a]a_aa]_`]W__	chr10.fa		3111755	F	36	119					
+HWUSI-EAS610	1	4	55	475	677	0	1	TTTGCAGATTCCAGCCTTCTGTGAAGCCTGGAACAC	aabaaaaU`aaaaa__aaa_a_a`a^^`_``^a^`_	chr10.fa		3111780	F	31G4	84					
+HWUSI-EAS610	1	4	22	289	1525	0	1	GATGAGATGTGTGTTCACGAACTGAAGCTTTGTGAG	a[ab_a^`__a_a`aaaa`_]a`a_aaa`aaa[a`_	chr10.fa		3112358	F	5A30	81					
+HWUSI-EAS610	1	4	88	524	1887	0	1	TTATTGGCAGATAGTTGGTGAATGTCTTGGGCCCCC	]_XQba`\[UH_RVSa]bTX_``\`a_X`YY_]WaW	chr10.fa		3113670	F	36	118					
+HWUSI-EAS610	1	4	91	471	180	0	1	AAGTCAGAAATCCCACGGGAGCAGGGTAACTCCAGA	aaa__aa`^aa`_a`_a_`_a_^X``WW_^__W]_W	chr10.fa		3114434	R	36	119					
+HWUSI-EAS610	1	4	37	1374	893	0	1	GCTCAGTGTCTAGTATAAGTTCCCTTGGGGGAACAA	aab`a^[^[_a`a[aaba_``a^_aa_`_a_]`]a`	chr10.fa		3114473	R	36	119					
+HWUSI-EAS610	1	4	52	904	771	0	1	AGGGATGGCATGCAGGAGACATCACACATGTGCCAC	`bbaaabbaaab^aaa````aaa__a^`^[[`_^`_	chr10.fa		3114785	F	36	119					
+HWUSI-EAS610	1	4	3	239	1763	0	1	AGGTTCTAGAAAACACTCTAGTTAAAACACACTTAA	ab`Y_bbbabbaaaaaa`a`_Y_babaaaa]_aa`a	chr10.fa		3114850	F	36	119					
+HWUSI-EAS610	1	4	90	1116	463	0	1	GTTATGATCCAGTGTTTTCTATCCTTAGACTTACTT	aaaaaa]]__`_Y_XF^a_a_`]]^]`Y`]a`^Y_a	chr10.fa		3114924	F	36	118					
+HWUSI-EAS610	1	4	89	295	16	0	1	TTGACCTAGTGAGAAGACTTTGCAAAGCCTCTCATA	abbaaaa`a^aaaa]aa```_a^_Z`a___\a\V[_	chr10.fa		3115038	F	36	119					
+HWUSI-EAS610	1	4	91	596	1586	0	1	TAATAACTTTCTTCACAACAGCAAGCCTTCACTTTG	a_Yaabababaaaaaaab`aa_V^]``aa``_aaaa	chr10.fa		3115329	R	36	119					
+HWUSI-EAS610	1	4	47	857	150	0	1	AAAAATAGACAGGATATTTTTGTCACTGCTGTATCA	a`[aaa``aabbaa_aaaaabXa_aI_Z`ZFW_a^a	chr10.fa		3115578	F	30C5	108					
+HWUSI-EAS610	1	4	22	1255	1890	0	1	GTTTAATAGGGGCATCTTAGCAGAGCTCCTAAGCAG	a_ZY^]^__X]`X]^MW\]_]_\WUWSGSXXXWMV_	chr10.fa		3116066	R	36	25					
+HWUSI-EAS610	1	4	13	1341	934	0	1	CTGTAAGTGGAGGTCTCCTTGTTTCTAACATCCTTT	_ZQ_a^`^X`^Z^Z```aZ`Xabb_`_YF[S_SY`b	chr10.fa		3116515	F	36	117					
+HWUSI-EAS610	1	4	67	973	1935	0	1	TATCACCATGGACAGAACTGAGGCTGTGCAACCTTG	aQ]``^S`VTZV\[^QRYYQNXVRTZBBBBBBBBBB	chr10.fa		3116642	R	36	75					
+HWUSI-EAS610	1	4	55	1412	1790	0	1	AGAGGCTGGGAGCAGGGAAGACCCAAGGGCTTCATA	abaaba]]^ba\V_a```b^^]aaa``^\Q`[\\aa	chr10.fa		3116799	R	36	119					
+HWUSI-EAS610	1	4	15	968	1274	0	1	CTCTCTGTGAATAATTGGAAAGTAAGCACAAGAGGC	^aab`bbabRbbabbabaab_aabaa_a^a[`abaY	chr10.fa		3116829	R	36	119					
+HWUSI-EAS610	1	4	95	408	925	0	1	TGGGAACAAAAAACGGGTGGGCCCATGGTGGCCCAG	`\X__^`a[Ra`Xaa`[Fa^^HH__J`\FN`\UVV`	chr10.fa		3117500	F	34G1	87					
+HWUSI-EAS610	1	4	81	527	1142	0	1	ACCTAGCAACAGTGAAGACCATACCCCTATCTCTTA	aWa`S][Vb``]O_][__NXG`]Z]^a`X]^```]B	chr10.fa		3117992	R	36	113					
+HWUSI-EAS610	1	4	81	1340	780	0	1	CAGACCTCAGCTCGATTGGATACCAGCCTGCAATTC	abbbbaa^aX_a`aaaaa_aaaa^a]a_P___``a`	chr10.fa		3118180	F	36	6					
+HWUSI-EAS610	1	4	78	1124	1047	0	1	GCTGTGATGAAACACCATTGTGGGGAATTGCAGGCT	a__a^a_aa_`aaa]\_aaa^__`_____^^^_[[_	chr10.fa		3118204	R	36	119					
+HWUSI-EAS610	1	4	21	1339	1621	0	1	TCTGTCACAGCTATATCCCACTCCTGGTACCAATTT	a^\Y\aa]__`aaaaXTQ_`XSUUYZaU\VJZ\\a`	chr10.fa		3118263	R	36	26					
+HWUSI-EAS610	1	4	59	599	1007	0	1	CTCAGTCCTTCCAAAACCAACATGGTCAGGTCTGTC	aaaaabaabbaab^ababaa_aabbaa`^a`abba`	chr10.fa		3118293	R	36	119					
+HWUSI-EAS610	1	4	57	787	49	0	1	CATGAAGATGGTGGAAGCCTGGGTCACTACTGGGAC	a^baaa^Y`aZWa^_a```]a_`U]aWU^\]]`^S]	chr10.fa		3118423	F	36	119					
+HWUSI-EAS610	1	4	70	130	1327	0	1	TTCTTCAGCCCAAGCTAATCAGAACCACAGATTCTT	a`babbbbbba`\bb__\_a^a]aba`aYaZ]`a`a	chr10.fa		3118477	R	36	50					
+HWUSI-EAS610	1	4	61	496	73	0	1	TGGAAAGTGTTTTCTGAGAGTCAGCACACAAAACTC	]ZZZ_]aY^^`__^_YNWVY\]___Z[^[TZPSOR\	chr10.fa		3118649	F	36	39					
+HWUSI-EAS610	1	4	11	1681	749	0	1	AGTTCAGTTGCAAGAGAGACCCCAGCATTTTGGAGA	a_aaab]_aaa^ba_aaa`aa`aa]`S\_aaRX^^_	chr10.fa		3118919	F	36	119					
+HWUSI-EAS610	1	4	60	1350	452	0	1	AGCACACACAACTTGTCTTCTAGGCCCCACCCAGCT	W^a\I\baaaa[`_YM`a]]^_UVZT`a]]`aa\BB	chr10.fa		3119008	R	36	109					
+HWUSI-EAS610	1	4	1	201	1352	0	1	GGTATTCACGTGTGATCTTGGGGATGAACAAGAAAG	aa\aaabaaaY__aZ`baaa``aaaaaa`_[]_UYa	chr10.fa		3119408	F	36	55					
+HWUSI-EAS610	1	4	69	8	1114	0	1	GGTTATGGCTTAACAATGACATGTTTATGTNTTAAG	a`S`]`aaaZ^aa\a]T]^_WY`ZWZVZYHDT^_Y[	chr10.fa		3119448	F	30G5	109					
+HWUSI-EAS610	1	4	11	1587	1979	0	1	TGAGTTATCTGTGTGTCCCTGTGACCTCTTATGTGT	aaab]babaabZaZ`^YZ]aaX_a^^`^a_a_`XaY	chr10.fa		3119863	R	36	119					
+HWUSI-EAS610	1	4	83	948	1643	0	1	ATTTATGTAAATGCTAAACACTTAACTACTGTTTAC	aaaaaaa_baa`\_aaaa_^`a```]``^aa_```^	chr10.fa		3120234	R	36	119					
+HWUSI-EAS610	1	4	10	918	714	0	1	GCCATTTCTCTCTGTTACTGTCTTCTCCTCCAAGCC	a``aaaa_a\`\`a_aa_ab_]aa\_\]`\^_^___	chr10.fa		3120374	F	36	119					
+HWUSI-EAS610	1	4	59	1275	391	0	1	AGCTGCCGGTCCCCTGCTGAAAGAGAGAAGGAAGTA	aa`b^``_\_`a_``Z``a^_aa^^^\[`Y`\^^Ya	chr10.fa		3120595	F	36	119					
+HWUSI-EAS610	1	4	12	1437	235	0	1	GGTAAAGGGCTGCTTCCCAGACTCCTTGAGCTGTGG	``[^aaaUPGO`X^a^^Z\]X]UPSTDI]\[PUG\V	chr10.fa		3120672	F	9T26	103					
+HWUSI-EAS610	1	4	66	214	286	0	1	AGCACAAGGGCCTAAGCTATACCACACGTGCCTGCT	`ababbab]aba`bbbbaaaaaaaabaa^a^`_aa^	chr10.fa		3121075	R	36	119					
+HWUSI-EAS610	1	4	56	249	171	0	1	ATGGCTTGTGTGTAGCTTGTAACTGACTGTTCAGAG	__`bb`_bb[P^`baaaaa_aa_a`X_]_H_`[[Z_	chr10.fa		3121296	R	36	118					
+HWUSI-EAS610	1	4	88	552	253	0	1	AGTTTTCAAATGTGAAAACAGCAGTTTTTTGAGATG	_`bbbaabbKabbbbaba`abb`ba\abbab^abab	chr10.fa		3121357	R	36	119					
+HWUSI-EAS610	1	4	99	646	1285	0	1	CTTATAGTTAAAATTATTTCAATGATACTTGCCTTT	Xabbbbaabbbbababbbbba``baaaabbbaaaab	chr10.fa		3122082	R	36	119					
+HWUSI-EAS610	1	4	74	846	876	0	1	CAGTGAGTCCCCCAAATCACACTTAGTGTTACCCAA	aaa^a^b```aaaab_^bba`__baaaaa`aa_`ab	chr10.fa		3122143	F	36	119					
+HWUSI-EAS610	1	4	100	471	347	0	1	TGCATCACTGACTATCTTCGGAAATCCCCTTATTCC	ababbbba`ba_aa_a^`aba_`a\U_____^__`_	chr10.fa		3122529	F	36	119					
+HWUSI-EAS610	1	4	17	1610	1146	0	1	TGGAGCGTATCAGTTTGCCTTGACTGGCCAGCAGGA	a`\P^U^U_\]_QT[Z]P\\^SVUUSUVWTNQSPSV	chr10.fa		3122840	F	36	118					
+HWUSI-EAS610	1	4	53	1741	1423	0	1	GTGCATGCCCATACACATTCACATATATGTGCACAG	W^_\]^WZU_YZ^`a\^`]a]`Z``aa\T[HYUTBB	chr10.fa		3123344	F	36	109					
+HWUSI-EAS610	1	4	22	1554	2034	0	1	AAGTCTGTCAAGACAAAGTAACATGAATTGAGCGAG	Vb`X`Z^XVZY_aaSMV`]aa```a`aa`^`XP]Y`	chr10.fa		3124044	F	36	118					
+HWUSI-EAS610	1	4	71	1721	448	0	1	TGATGATGGACATTTTCTTTCTGGCTTTTAAAAACC	a`a`Ua^]P^a_aaaaaa`aa^QWaaaa`_a```^`	chr10.fa		3124186	F	36	119					
+HWUSI-EAS610	1	4	93	533	460	0	1	GAAACAAAAGGTACCTATGTACCTAACAGGAAAGGC	a\\a^a`R\a_U]W_^\^`Z]R_]^]R^`^YYX^_U	chr10.fa		3124446	R	36	119					
+HWUSI-EAS610	1	4	65	1072	1979	0	1	TGTGGTAAATACCACCCTTCCCTTTCCCTCAGGTAG	aaaaa`aaaaaaaaa`abaaa[_a`_^Z[Z^\KY_`	chr10.fa		3124582	F	36	119					
+HWUSI-EAS610	1	4	68	722	1188	0	1	CCTTTCCTCAGAATTACGCTTCCAAGCGTTAGGAAA	a`bbbaaaaa_ababbabbbbaaaaa_baaabaaaa	chr10.fa		3124754	R	36	119					
+HWUSI-EAS610	1	4	52	551	1915	0	1	ACTCTAAAGAACACTGCTCTGTGAGTGCTCACAGTA	aa\`aa^`_]aaa`]]^Xa]YS]\VOY^_\YZ[UP]	chr10.fa		3126349	R	2A33	86					
+HWUSI-EAS610	1	4	20	933	921	0	1	ACTGTCCTGTCTCCACAGCCTCACCATTGCTGAAGG	aabZ``Z`b`b``a`]aa^`aaa`a`aYaaaRV`aa	chr10.fa		3126570	F	36	119					
+HWUSI-EAS610	1	4	60	958	784	0	1	GAAGAGGGCCTGGATTGAGGAAATGCCCAGACCAGA	``Z\_]Z]TZ\\aV]`a\aZ^]a^Y^UYU`W\W^a\	chr10.fa		3127011	F	36	119					
+HWUSI-EAS610	1	4	36	1511	1905	0	1	AACCTGGGTTCAGCTACTTGGCCGGTTTCCTCTCTC	aa_`aab]XaUXa`^a^a_a`\UaaZXZX\_YXPa\	chr10.fa		3127365	R	36	51					
+HWUSI-EAS610	1	4	82	95	645	0	1	ACACTTGGGTGGAATGGTCTCTTTATTCAGTCGTCA	WO]_[b`\WabaPLV`[`b`ba_`aI`\OQ`aaUTX	chr10.fa		3127947	R	33A2	92					
+HWUSI-EAS610	1	4	81	1312	1404	0	1	AGTTTTCATAAGTTGTTGTCGATGCTGGTGCGGACT	aaNaaWYYaYWWZa__`S``J_[WW^PVG[GZUTZ^	chr10.fa		3128058	R	28G1T5	94					
+HWUSI-EAS610	1	4	98	691	955	0	1	ACAAGACCCCTCCCCAAAATTAAGCAAACAGTAAAC	_aa`^``^aa`\^^\_WXHaa_[_[]ZY\aa`]_`]	chr10.fa		3128152	R	36	118					
+HWUSI-EAS610	1	4	23	302	294	0	1	ATTGACAAGACCCCTCCCCAAAATTAAGCAAACAGT	aaaaaaaa`a\aaa_aaaa[YQa_a`_]``^_`aa^	chr10.fa		3128156	R	36	119					
+HWUSI-EAS610	1	4	10	1330	1429	0	1	TAGCAGAGATGTTTTGTAAGACCGTTTCACGCCAAA	a_baabaaaab_aaaa[aaba\_a_aa`a]___```	chr10.fa		3130122	R	36	119					
+HWUSI-EAS610	1	4	97	1198	1840	0	1	GCTAATATTAACAGGACAGACAGATAATTGTTTCTG	aUa`a``aa``S`aa_^\a_Uaa_`_]]__Va_G_a	chr10.fa		3130186	R	36	118					
+HWUSI-EAS610	1	4	94	945	1492	0	1	TGCTTTTACACTCTCGGCCTTTGTCTGTCGACATCA	aa```a``Ya]`^U\a_^X`_[U_]]`]U`Y\U^Y]	chr10.fa		3130315	F	15T20	81					
+HWUSI-EAS610	1	4	17	1065	1617	0	1	AGTAAATATGGACACCGTCGGCTCCAGACTCAGTGA	`bUb^SZbabaa`bab`aba`Xa`_ZaOF]`X^MTY	chr10.fa		3130378	R	36	117					
+HWUSI-EAS610	1	4	78	1302	1746	0	1	AGAGCAGAACACCATTCCCACCTGTTGTTCTGACAG	abaa`a`_aaaX`aaaZ`_b_^`aZM][\[TFQYZ_	chr10.fa		3130453	R	36	117					
+HWUSI-EAS610	1	4	26	157	1004	0	1	AGCTCCAATGGGCCTGGATGCTTCACACCACAGTAA	^_bab_]V_]_]bbba`^]aba\```bb_^`]`_ZY	chr10.fa		3131539	R	36	119					
+HWUSI-EAS610	1	4	37	339	1556	0	1	GAGCAGAGACAAGCTAGTCAGCAGCCGGGGTAATTT	_][^aaaabab`]b]R_T\V]`aaaa^Z[^[_`_XX	chr10.fa		3131575	F	36	119					
+HWUSI-EAS610	1	4	27	1028	1711	0	1	AACAACATGAGTCAATTTATACCTGGGAAAGATGAA	L\bb^bb^a`VV``b^\a^]YRR\^\\Ya[\\b]^^	chr10.fa		3131724	F	36	118					
+HWUSI-EAS610	1	4	49	75	849	0	1	ACTCTTCCCATAGTGAGAGAAATGTGGCAGCATTCA	ab`baabbbbaaa^aaaIa_Xa_`_a_a`aaa^``]	chr10.fa		3131878	R	36	118					
+HWUSI-EAS610	1	4	1	285	156	0	1	TGGATATCATGGGACTTTGCCAGGAAGGGTTTTCTT	ab_`^`aa`WZXbY`R`XL\aYa\SZTZ]VT[^__[	chr10.fa		3132129	R	36	118					
+HWUSI-EAS610	1	4	55	904	1454	0	1	TGGATATCATGGGACTTTGCCAGGAAGGGTTTTCTT	a^Z\`_`^_^a`a^\aaaa_^^^^`__``X__`]`_	chr10.fa		3132129	R	36	119					
+HWUSI-EAS610	1	4	34	720	698	0	1	TAGTGACTCTTGGATATCATGGGACTTTGCCAGGAA	abb`ba_aabbaa_aabaa^aaZT\aaaaa`_a`]`	chr10.fa		3132139	R	36	119					
+HWUSI-EAS610	1	4	39	524	159	0	1	ATGGCAGGAGCATTTACAACATATTTTGTTGATTGA	`b`b`baa`a_`]b`^a_bZ`__aa^aa_`a_`a[a	chr10.fa		3132213	F	36	119					
+HWUSI-EAS610	1	4	60	865	576	0	1	ATCCACACTGTAACATATCAAATTCAGTCAAAAGCT	^]Y\MVYJ]`VaR_UZU[]]XXZWSSUZ`WTVVZ^_	chr10.fa		3132324	F	36	118					
+HWUSI-EAS610	1	4	77	628	189	0	1	GAACCACACCACCAGGGACAAGCAGGCAGAAAACTG	^NHYVRR]TNYRSVR]LYDJT[UNJHDR\\SPQUY^	chr10.fa		3132448	F	26A9	104					
+HWUSI-EAS610	1	4	24	1654	277	0	1	TTTTCCTTGATGTTTGACAATGTTCTCTTGTTCCTT	a`aaa_[aa`\_^_``a`aaa_]`____aZ^X_]_a	chr10.fa		3132854	R	36	119					
+HWUSI-EAS610	1	4	74	1123	1860	0	1	AACTTGACACCGGCCATGAGAAAATTCCTGGTAGAG	abRYYaa`RW]^[a_a^ZX[__H\^BBBBBBBBBBB	chr10.fa		3133147	R	36	70					
+HWUSI-EAS610	1	4	14	1024	1894	0	1	CATATTTCCTCTGTTAGGATAGCTGCTCTCTATTAC	Xa_bb`aZ[^]b`]a\baaa`Xa__a_]a]aaa`ba	chr10.fa		3133354	R	36	119					
+HWUSI-EAS610	1	4	67	924	2035	0	1	GCTGGAGCTGCAGCCTGAGTCCTGGAGAGCCGCTTG	``aaa``\`^^]\]`\^Y\RZXT\^`X]XZ\URPXZ	chr10.fa		3134136	R	36	118					
+HWUSI-EAS610	1	4	75	1615	805	0	1	TAGACTCCGGTTTCTTTCCCTCCTACGTCCCAGCTC	aaZbaab`ab\abaabaaaaaa_aaa]]aa_`_a\a	chr10.fa		3134210	R	36	119					
+HWUSI-EAS610	1	4	7	1654	1814	0	1	GGGAACTTCTAGGTCGGCTGGGCCTCCGCGGCTCCT	aaaZ`\`aaU`_\\Pa`Q[Z`BBBBBBBBBBBBBBB	chr10.fa		3134478	R	21C14	51					
+HWUSI-EAS610	1	4	38	1535	1215	0	1	TGCCGGGAGTCCGCTCAAGCCTGCATGGCCGCAGTC	_\^\a`a__Sa_X``a_^^ZUXP^`\\\`^Q^Z\K\	chr10.fa		3134743	R	36	118					
+HWUSI-EAS610	1	4	18	567	970	0	1	CGCCAAATCCCAAGCCCCACATTCCCAGCCAATCTT	abbbbaabaabbaabbaaaaa^[aaaabaaaaaaaa	chr10.fa		3135151	R	36	119					
+HWUSI-EAS610	1	4	88	1722	1053	0	1	ATTGGCTGGGAATGTGGGGCTTGGGATTTGGCGCCA	aa`a^`\a\^W\[PS]^PZZ_^]_YVUU^SUWPUXV	chr10.fa		3135154	F	36	118					
+HWUSI-EAS610	1	4	52	1762	109	0	1	AGGCAGCAAGTCCACCGTACCCGAACTGTCAGAGAG	_SYaa^`^aYKS]_]^]W^W^YNS_PSPGWWOKSUU	chr10.fa		3135197	R	28G7	105					
+HWUSI-EAS610	1	4	59	1730	706	0	1	AGCCAAGCGCAGAGGCACAAGGCGTCTTTGTGTGGG	_[_`````[``^`XP\`]^^[\]VX\\Y^\RSRXTV	chr10.fa		3135235	F	36	118					
+HWUSI-EAS610	1	4	73	482	1333	0	1	TACACCAGACTCTTCACTACCTGGACAGCCCCTTTC	`TZ_a\UWTXX_`Xa]X^Z]]Z_WW[RU_Z[HMMV]	chr10.fa		3135982	R	36	117					
+HWUSI-EAS610	1	4	24	309	28	0	1	TGTCTTAGGAAGTAGGTTTTTTCTATCGGCCAGACT	ababbabbb`bb_abb_aabaabbaa`aaaaaa_`]	chr10.fa		3136059	F	36	119					
+HWUSI-EAS610	1	4	73	525	940	0	1	AGGTTTTTTCTATCGGCCAGACTTTTCCAGGACTCT	abb^abbbbabbaabaaaaa__`aaaa`R_a`\^_^	chr10.fa		3136072	F	36	119					
+HWUSI-EAS610	1	4	98	1672	449	0	1	CTAAGAGAAATGAAGGAAAAAACAAAGGGGAGAGAG	aabaaa[_`a`\`]IZ_bbb^a_`aYU_[\____`\	chr10.fa		3136735	R	36	118					
+HWUSI-EAS610	1	4	59	189	78	0	1	GCAACTGTGAGTTTTAGTTTTCTCTTGTATAAGAGT	a__W[aa_aRa`_a__aY``_`_^aaaY]aYO\W_[	chr10.fa		3138038	F	36	119					
+HWUSI-EAS610	1	4	95	877	618	0	1	GTGAGGTTGGGCAGCCCAGGAGTTTTTGTCATCCTG	a\a^aXHZ``_\`^^YT__a^YY`[`\^^^]^UY]T	chr10.fa		3138072	F	36	118					
+HWUSI-EAS610	1	4	4	1622	1467	0	1	GGGGTCAGTTTCCAGCACCCACATGGCAGCTCACAA	a^LX\aaaT``_aaZ`aaQa_\`Y[TX\YUYV^U^^	chr10.fa		3138316	F	36	18					
+HWUSI-EAS610	1	4	58	732	1436	0	1	GACCACTTAGGCTGGAGAGGACGGTGATTGCCTTTT	aa_aX_bbaaaV_a`Z^^ZUTSaa\aYKZ`\^^`a^	chr10.fa		3138512	F	36	118					
+HWUSI-EAS610	1	4	37	791	1174	0	1	CTGGAAGCCGCCAGTTCTAGCTGATCACAGCCAAGG	abbaaaabXba`abab`aaa^aaaaaaXa``_a^aa	chr10.fa		3139011	R	36	119					
+HWUSI-EAS610	1	4	15	948	801	0	1	GTGTGATGTCTTACACTATTGGGCACTGTCATTTCT	a_b__a^Z[^_a_Ua_a]aa^\\T^_aaYV[_`_\a	chr10.fa		3139299	F	36	119					
+HWUSI-EAS610	1	4	10	1671	1781	0	1	TGTGTGCTTTGAAGCCTTCATCCATCTCTTCACCTC	ab`a^a_``a``[UVZ`__`_]^__U^]`_]]^X_\	chr10.fa		3139731	F	36	119					
+HWUSI-EAS610	1	4	86	246	1961	0	1	TGTGTGAGCTTATGCAAGTGCTCCATAAATTGCGAT	]``b`bbabab_abbbab\^`_^baa`ZS`b^`a]a	chr10.fa		3139839	F	36	119					
+HWUSI-EAS610	1	4	99	789	381	0	1	TAAATTGCGATGCTATGTTTTTTATTGCTTCCTTCC	aaa_a\]FOON_]NP]\LY`aZX]QYFQLWNL]^WS	chr10.fa		3139864	F	36	114					
+HWUSI-EAS610	1	4	42	9	723	0	1	ATCAGGAGGGGTCTAAATCGGCCGGTGATCCGTGCC	``a\`a_aaaa^`^Z_\`aaaa`aa\aa^aa`U`a`	chr10.fa		3140055	F	36	119					
+HWUSI-EAS610	1	4	42	1233	463	0	1	TATGTGCGTGTTCATGTGTACATGGATTCAGAAGTC	`SY]R`_aNNZ__]_____`__`\UXFW]^]^XZXB	chr10.fa		3140152	F	26A9	103					
+HWUSI-EAS610	1	4	85	1531	168	0	1	AGAATGGCATCTGAGTTTGACTTCTGATTCCATGTA	abbb`]Vaaa_a]][_baYa_aa[`\```__aaa_a	chr10.fa		3140170	R	36	119					
+HWUSI-EAS610	1	4	96	591	2030	0	1	CAGAAGTCAAACTCAGATGCCATTCTTCAGGTGCTC	ab]a]bZ]`abbaaaa^_aa\^``a``bb`^N^a]a	chr10.fa		3140180	F	36	119					
+HWUSI-EAS610	1	4	97	889	1403	0	1	GCCTAGCTGACTGACACATGAACCCCAGGTACTGGT	aaaaa`\`aa_aaa]a`aaa_a^^`_`aaSa\`aYB	chr10.fa		3140250	R	1T17A16	39					
+HWUSI-EAS610	1	4	52	229	1802	0	1	GGAAGGCTGAGCAGGGAGGGTCTCTGGAGCTTGCTG	``a_\\aaaZ__\_``^a``\aaa`_Z_`a]]X_\^	chr10.fa		3140294	R	36	119					
+HWUSI-EAS610	1	4	76	1592	1280	0	1	TTTCACTCACTTGAGCCACCTCCCCAGGCTCCTTGG	abb`ba``a`a``^X`_a^aa_``a`R^^``^\W^\	chr10.fa		3140417	F	36	119					
+HWUSI-EAS610	1	4	90	403	757	0	1	AGTTTGAGCTACTATTAAAGCAGGGAGGGCCCAAGG	`b]abaaaaa_abaabb`_aaaaaaW`[``_V[__^	chr10.fa		3140447	R	36	119					
+HWUSI-EAS610	1	4	22	1506	567	0	1	ACCCTAGCTACAAGTTTGAGCTACTATTAAAGCAGG	_T`^]^ZW`[Wa`^Q]Z\_Z_`ZLU\]YYYVTVWZW	chr10.fa		3140459	R	36	118					
+HWUSI-EAS610	1	4	38	1371	391	0	1	TGTGATCTTGTTAAAATTCAGGTTCTCCTACGGTGG	aa`VO[`aa^`^^]^\^aa]a]U_Y`]U`^^W[U\^	chr10.fa		3140585	R	36	119					
+HWUSI-EAS610	1	4	26	1621	28	0	1	TGTTATGAGCATTCTCAGCATCCCAAGGAGAGATAA	a^aaa_S_W_____\aa__a___]^_UORTXUZY__	chr10.fa		3140887	R	36	118					
+HWUSI-EAS610	1	4	18	259	233	0	1	GGATGCTGAGAATGCTCATAACAACATTGGATAGTA	aba`bbabb_ba\_aabaa\TV]_abbaZa_a`^YV	chr10.fa		3140900	F	36	119					
+HWUSI-EAS610	1	4	58	1288	1466	0	1	GCTCATAACAACATTGGATAGTATGTATGTATGCAT	`aaaaa`YZ`a^aaa^_^a`a``a]_``aY]\]\\a	chr10.fa		3140913	F	36	119					
+HWUSI-EAS610	1	4	27	25	22	0	1	CGAGGTGCTGTGAGGGTTGGCGTTCACCGTGGCTGA	`a\aa[aa`a^a_aa`Z\_a`aZZ\U[`RKU]TNZB	chr10.fa		3140992	F	28A7	91					
+HWUSI-EAS610	1	4	39	1291	1502	0	1	TGAGGGTTGGCGTTCACCGTGGCTGAAGATAATTTT	aa_aaa]_aa]a]]V_\]a^`^U^^W]`]]_]^]__	chr10.fa		3141002	F	18A17	81					
+HWUSI-EAS610	1	4	44	767	285	0	1	GAGGACTGCCAAAGGACCCAAAGCCTGTCAAGGCAG	aabaaaaaaaaabaa__a``aaa^_aa_``aaaaa^	chr10.fa		3141621	R	36	119					
+HWUSI-EAS610	1	4	65	335	698	0	1	GAAACATGGGAGAGGTGACAGTCAGCCACAAGGGTA	``\\_^`baa^\V]_Y_]`a``aabaaaa__]aWKX	chr10.fa		3142520	R	36	118					
+HWUSI-EAS610	1	4	10	482	1972	0	1	AGAAAGGAAAGGGAAGTGACGAGGAACACAGAGGGC	_b`bbbbL_T]aa_a_ZR_`babaZ`aa_WZa^__a	chr10.fa		3142648	R	36	118					
+HWUSI-EAS610	1	4	42	1780	1246	0	1	AGCGTTTTTACCCGAGAGAATGAGCATCCAGACACG	aaaa]]`a^_\^_VW]]\_[_]^O_[]]]]_[XY[a	chr10.fa		3142879	R	G35	81					
+HWUSI-EAS610	1	4	13	1314	872	0	1	CGGACCCCAGAATACGGCAACACACGCAGTTGTGTC	abaaaabbaaababa`baaaaaabaa^a]\a]]]]a	chr10.fa		3143905	R	36	119					
+HWUSI-EAS610	1	4	80	913	1940	0	1	AGCAAATTCAAACACTAGCTCCAGCAGAACACGCCA	_b`a_Raaa[b```^b``aa```^[`a``J\Z_Za`	chr10.fa		3144193	R	36	118					
+HWUSI-EAS610	1	4	94	1460	701	0	1	CGCTTAGCCTGGTTCATCTTCTTTGACNTCAAATGG	a\`^a_]_aa]Q[aYa`aabaabaa^XD\]]aaa``	chr10.fa		3144260	F	27A8	110					
+HWUSI-EAS610	1	4	37	1382	626	0	1	TACATGTTTATAAAAATGTGTCCAAGGCTGGAGAGA	ab_a`]aa_a_a``a_a]^a[aZ`__]_YaaY`]`_	chr10.fa		3144774	R	36	119					
+HWUSI-EAS610	1	4	9	103	58	0	1	TGTGTGTGGGAGGAGGGACACGGGTTTGTATGTGTG	ab`bab^baa_aa`aaa_aa\aaaY_`a\`U^\XQV	chr10.fa		3145140	F	36	55					
+HWUSI-EAS610	1	4	59	1293	50	0	1	TACCTACCTACCTACCTACCTACCTGTCTATTTGCT	aaaaa_\^_a^__a_`_`]_``]_^^VX_Z^]]XZX	chr10.fa		3145334	F	36	14					
+HWUSI-EAS610	1	4	96	1356	667	0	1	GCCTGCCTGTCTGCTCACTGCTGGAATTACAAAGGG	a]`aa_^_a^^]_\]^a]a_^a^^^^^]`\`\^^U^	chr10.fa		3145433	F	36	119					
+HWUSI-EAS610	1	4	97	1410	1652	0	1	GCCTACAGTAAAAACAGAATCGGCCAGGCATGGTGA	a_^__T_aW_a\_`]`a_a__``W\]__V\]_]Q^\	chr10.fa		3145472	R	36	119					
+HWUSI-EAS610	1	4	60	1012	1456	0	1	GGGTGTGTCATGTCAGGCCCCAAACTCAGCATCTTC	`bbUa`\`aaa`aaa\aa``W]]a_]V]a_^`X`^X	chr10.fa		3146419	F	36	119					
+HWUSI-EAS610	1	4	78	1062	1229	0	1	AAAAGGGACATACTAAAATGTTTCTGGACTTACAGC	aba[^abaaabbabaa]X_aaba`aaaa`abaaa`a	chr10.fa		3146472	R	36	119					
+HWUSI-EAS610	1	4	89	847	577	0	1	GAGAGAGAGAAGCGGGGATAGAGGGAGGGAGGGAGG	a\```\`^aZ``\aa``]^]a[_`^\```Z`^^T]]	chr10.fa		3146997	F	36	119					
+HWUSI-EAS610	1	4	24	1205	1608	0	1	TAGCACGAATCCCAGCACTCAGAGAGATAGAGGCAG	aa`ba`baaaaaabb_baba`]`b`aaaabaXa__b	chr10.fa		3147527	R	36	119					
+HWUSI-EAS610	1	4	53	320	787	0	1	TAGCACGAATCCCAGCACTCAGAGAGATAGAGGCAG	ababbaaaaaaaaXaa`aaa_a_ZR^Z_`_`aa`_a	chr10.fa		3147527	R	36	119					
+HWUSI-EAS610	1	4	34	1306	1911	0	1	TGTGTGTGTTTGCTACAGTCTCCACCANGCCATGCT	T[X^P\PZ`XbaXb^R]HLT_aRZZVPDVX[`]QSX	chr10.fa		3147741	R	25T1T8	82					
+HWUSI-EAS610	1	4	60	948	1169	0	1	AGGTCCATAATTAACAGAAACTGAAGGGTGTGTGTG	\a]T_bb`b_R]_a]\\aaa^``]`aaa``]a\`_b	chr10.fa		3147813	R	36	119					
+HWUSI-EAS610	1	4	28	616	703	0	1	ACTTCTAAGATTGCAACACACAGTCGTAATCAGTAT	a_`aa`aaaa`a]a`a^a`a__a]^a]__`_^`W[_	chr10.fa		3148086	F	24T11	84					
+HWUSI-EAS610	1	4	86	1047	303	0	1	GATCACCCTTGCCTGGGTGGACCCAGAAGACCTCTG	`a_a`^\``aa\``aW\]Z^`\^_Z`^YZXPR\Z^^	chr10.fa		3148132	F	36	119					
+HWUSI-EAS610	1	4	71	912	1732	0	1	GTGATGCACAGACTTAAGTATATGTATGAATACAGA	a]\\WV_baaba\aaaa]`aa`baaaaabaa`^aaa	chr10.fa		3148514	F	36	119					
+HWUSI-EAS610	1	4	73	489	1662	0	1	ACGGGTTTCAGTTCAATTACAATCCTGCTCCTATGT	aabbb]aaa]b`aaba````\`aa^a`aa`^_X^`]	chr10.fa		3148580	R	36	119					
+HWUSI-EAS610	1	4	60	1555	695	0	1	ATCAGCAGCAGTGGACCACAAATGGTTCAAAAAGAC	aaa^Q[_U]\PTTZ[Z_`Z_a_^[YPSW\VY\ZVTT	chr10.fa		3148699	R	36	118					
+HWUSI-EAS610	1	4	51	591	1711	0	1	CACCCACACCTTTTTAATGATATCACCATGCTGGGT	aaab`a`baabababa]bbbbab_Q]a_b`aaaa]`	chr10.fa		3148975	R	36	119					
+HWUSI-EAS610	1	4	70	1462	1629	0	1	AACACAGATATTTTCACTATGATTTACAACAGTAGC	a`aaabaaa``aaaabababb_aaaaaa___][aa[	chr10.fa		3149053	F	16T19	34					
+HWUSI-EAS610	1	4	93	1166	1053	0	1	GGGCTAAACAGGGCACAAATGCGGAGCTCATGGAAG	abb`abba]aa^]P]_aV_a_YV``a^WS\\X\U]a	chr10.fa		3149822	F	36	119					
+HWUSI-EAS610	1	4	20	645	1675	0	1	AGTGCAAGCACTGTGCTTGCCAGAACAGCTACCTCA	aXVT]aa]`a`Ta^^^__[_a_``aaa_`V`^__\`	chr10.fa		3149885	R	36	119					
+HWUSI-EAS610	1	4	14	830	2020	0	1	TATGAGGAGCAGGAGGGGATGTAGTTTTAGCCAGGC	abbaa`^^b^bbbGa^`b^b__^_^ba`a__a]b_a	chr10.fa		3150302	F	36	118					
+HWUSI-EAS610	1	4	95	1527	805	0	1	GGTTTAAGCGTATAGCGATGGCGGAAGGATATGGAG	``]a_a[\`a\a__`[``_a_[BBBBBBBBBBBBBB	chr10.fa		3150581	F	24T11	56					
+HWUSI-EAS610	1	4	53	86	1727	0	1	TTGCAGTCCCAATGCTGGGGAGGTGGAGGCGGGTGA	\\_`^a_aa\__V__``^VZR`[Q[WD[\K_^ZDZW	chr10.fa		3151166	F	11G17T6	63					
+HWUSI-EAS610	1	4	61	317	373	0	1	CTCCTTTGATACATGATCTCTCACCGATTCACCCAC	abbabbbbYaaaaa`N]]`Ua_a``aGaa_a\____	chr10.fa		3151194	R	36	118					
+HWUSI-EAS610	1	4	37	655	332	0	1	GTGCACACATGCATGCACCGCTTCCAGCTTGCACAC	_LWXba`]bT`]b_Zaba`aZa^S_`NZQaa\]`]\	chr10.fa		3151283	F	36	118					
+HWUSI-EAS610	1	4	26	948	619	0	1	CGCACACACTCGAGGCAAGTGTGCAAGCTGGAAGCG	a_a_aaaaaaZ_[X_aJU__aF``a\a^_^`\\_Y`	chr10.fa		3151301	R	36	117					
+HWUSI-EAS610	1	4	55	1596	675	0	1	TCAAGCATAAAGGAGGGGGGTCCCTCGAAAGCAGGA	a`aaaaaabb`RS]]aX^_[^`\`_]_XT`YU^_^Y	chr10.fa		3151419	F	36	119					
+HWUSI-EAS610	1	4	2	133	1193	0	1	CTCTTACCATCCCAAACGTAGTGCTGGGCAGCGTTT	aaaaaaa```baaa`\`a_`aVaaaa_a^^^`a^_`	chr10.fa		3151458	R	36	119					
+HWUSI-EAS610	1	4	97	1408	1441	0	1	TCTTAGACAGGGTCTCTCTCGACACAGCCCTGGCTC	aabbaa_`^a]_UV`_a^a]aa`a\a[P[_^^^\\\	chr10.fa		3151653	R	36	119					
+HWUSI-EAS610	1	4	40	816	1685	0	1	TGTGGTGTGCACCGTTCAGGGAGGGCACCCTCCCAC	`_O\``[``_aa__]aa`a`a`_W[`_\U\a[^`^^	chr10.fa		3151826	R	36	119					
+HWUSI-EAS610	1	4	60	881	927	0	1	GGCTTCAGAAGAGTCTGTGGTGTGCACCGTTCAGGG	a``ba`b``aa`a^`aaZXZZaXX]]Y\a^`^\Y__	chr10.fa		3151841	R	36	119					
+HWUSI-EAS610	1	4	79	460	1445	0	1	GGATTTAGAATGAGAAGAGCTGGTTGTCCACCTTGC	]MLZ`Z[RPVXXX\SM\LTRVP_^[HZLUNNQVSSU	chr10.fa		3151988	F	32AAA1	41					
+HWUSI-EAS610	1	4	71	647	134	0	1	ACTGAATACTTGTGGGCTCCACATTGCTTGATTGAA	a]_a`Y^__aaa^aY_a``a^`__``__a`U_`Y^`	chr10.fa		3152342	R	36	119					
+HWUSI-EAS610	1	4	42	459	1865	0	1	CGAGCCCTGGGCACACCTGGAGTCCAGCATGCATGG	a\aZaa`_\`_^^a\``_[X_\R^`[Z`^[\\^\\\	chr10.fa		3154096	F	36	119					
+HWUSI-EAS610	1	4	23	842	900	0	1	GAAGGTGGGGGGTGCTAGACCTTACTGCTCATCTCA	aaaaaNX\_T]a\aZ]a_a`Z`^```a^aZ`^`_\_	chr10.fa		3154317	R	36	119					
+HWUSI-EAS610	1	4	48	1488	1876	0	1	ACTCAGCTCTTTGAAAACATCCATTCTCAACAGCCC	_b\^`aab]]H_ZVYa^X\WGY_VSHGGZYZPW[BB	chr10.fa		3154693	F	10G25	93					
+HWUSI-EAS610	1	4	91	1445	896	0	1	AAACAGTCCCCTGATTTTTGCTCCTGCCCGTTCTTC	a_aa__X``_]ab\`_a_a\_a_^aZ[Z^RR^^__`	chr10.fa		3154810	F	36	119					
+HWUSI-EAS610	1	4	2	571	1854	0	1	TCTCTTAATTTTCTTGTAACAACAGATTACCTTATG	ababab[\abbbaaaa_aabbaa`baabaaaab`_b	chr10.fa		3155713	F	36	119					
+HWUSI-EAS610	1	4	66	592	410	0	1	ATCAATCAACTCAAGGCCTGCCAGGTGAAAACCTTT	aaY\```__aa`a\Y`a``b[WRX^[_^[^[XZW^\	chr10.fa		3155963	F	36	119					
+HWUSI-EAS610	1	4	64	531	729	0	1	TCTCCGGAATATAGCTTAACTACGCCTCTATAGCAG	a`aaaaa_aaaaaZ``_aa`a`_``^`^_`_____a	chr10.fa		3156124	R	36	119					
+HWUSI-EAS610	1	4	96	730	1940	0	1	AGAGACCGGGGTGAATTAGGTAATGTATTTTCTCTC	``aY`a]aa^ZNaabaV]_NHS^a^Z`aa_]S]`Z`	chr10.fa		3156156	R	36	118					
+HWUSI-EAS610	1	4	18	1338	990	0	1	AGGAGGAAGACTGAGCAGAGGGAAGGAGACGAACAG	``ba^aa_]baa``a`^^`bbb^`a`]aa`ba`aa`	chr10.fa		3156196	R	36	37					
+HWUSI-EAS610	1	4	39	1095	1602	0	1	GCACAAGCCACAGTGACCCCATGAGTCCAACTTAAA	``_Y`^\[[_^`]_\S__`a`aa\[S\__`^U]P\[	chr10.fa		3156540	R	36	119					
+HWUSI-EAS610	1	4	13	431	86	0	1	GAAGCCCTTTGAGTGCCTCACTCGACACTCAGCACA	a`T]abb]`UaaaZa]X`_b\ab`a\_`a]a`]`Ra	chr10.fa		3156571	R	36	119					
+HWUSI-EAS610	1	4	15	301	841	0	1	GAAGCCCTTTGAGTGCCTCACTCGACACTCAGCACA	]]\GY`Z_Z_\baX``^_^XUZ`RO]_Y^O__^\__	chr10.fa		3156571	R	36	117					
+HWUSI-EAS610	1	4	64	850	1767	0	1	GTGACAGCAGCATTTGGGTGCGTCCATTGTGTGACA	aU`aa^Z]_a__`a`__aXaaa^[`_`\TZ_S\___	chr10.fa		3157053	F	36	119					
+HWUSI-EAS610	1	4	51	1036	43	0	1	ACCAGAGTCACATCCCTCCCTTCCCAAGTCACAGAA	]QZa[R[`abbba`````a``a^^`^`^UZ^_`]_a	chr10.fa		3157290	F	36	119					
+HWUSI-EAS610	1	4	30	1168	1420	0	1	AATGGGGAATGACCCAGTGAGAAATATCCTGAACAT	G][bbbb_bbab_bbab\bbab`bbaabbbabbbbb	chr10.fa		3158260	R	36	118					
+HWUSI-EAS610	1	4	96	1096	296	0	1	GGAGAGCAACGAACACAGTTGGGAAATGGGGAATGA	abQ\_]__a[_aa[aY_a]a_aZ^`[___\[_^\``	chr10.fa		3158284	R	36	119					
+HWUSI-EAS610	1	4	64	925	1025	0	1	GGAGGGACTTCCTGTCCTTCAGCCAAGATGCCTGGG	`^`a^^N\R\]\\[YYXKQ[XXSKTV^T\\RXZ\`\	chr10.fa		3158377	F	36	117					
+HWUSI-EAS610	1	4	49	706	318	0	1	GAGCAGAAAGAACCACCTTGAAATTTCCATGGCCTT	aabbaa`abbbaaaaaabbbabaa`aaaaaaa__aa	chr10.fa		3158455	F	36	119					
+HWUSI-EAS610	1	4	32	1790	1700	0	1	GGATAGGAAACAGCTGCCAGGGGCGCTGAGGCAGAG	`\\`]ZUKTV^`^]\`\\^\[[YX[]S^PS[RXPSZ	chr10.fa		3158508	F	36	118					
+HWUSI-EAS610	1	4	94	1423	1009	0	1	AGCCGCCCAGACATCCCTGTGCCCACTCCCACTCAC	[`aXa[TLaS[RX^XTaSaL`S\WPTa__aT[a_Ja	chr10.fa		3159018	F	36	117					
+HWUSI-EAS610	1	4	68	625	53	0	1	CTCACCCATGCATCACTGTTGTCCTTTGTAGAAACA	`babaaab_a_a`_a_a`_aa`^_a`a`Z^`^_^\^	chr10.fa		3159049	F	36	119					
+HWUSI-EAS610	1	4	28	1518	1460	0	1	GCACCTGGCAGAGATTCTTGGGTCAGTTTGACAAGG	a\aU\_^\\\a_]VN`VSV_U_WV\ZUU\VVVWW\V	chr10.fa		3159309	F	14C21	100					
+HWUSI-EAS610	1	4	53	8	388	0	1	GGCATACAAATCAGTGGACATTTTGGGCAGAACTGG	aba[`a_Z[Zab[babb]babbbbaaaaaabaa_aa	chr10.fa		3159380	R	36	119					
+HWUSI-EAS610	1	4	76	501	1025	0	1	CGTGGAGCATTGGGAATGTAGGGAATTGTTCTCCCC	`a_baX]_`ba_aaQ\_b`W`a`^abaa^a^a```a	chr10.fa		3159461	F	36	119					
+HWUSI-EAS610	1	4	32	1292	1652	0	1	TAAGGAGTTGTATGAAGCAGTCTTGGGGAGAACAAT	a^[ba`[^aa_aY^`^a_aa_`\V[`\^]``_]`_a	chr10.fa		3159485	R	36	119					
+HWUSI-EAS610	1	4	29	452	1474	0	1	TGCTCAAGGGGGTTGGGGATGGCTCGGTGATGACGT	\_^[^\J\``__T`a``\^Xa_`_a_XRXPX^\^TX	chr10.fa		3159530	F	36	118					
+HWUSI-EAS610	1	4	80	49	1299	0	1	CTGTGTGTGTATGTCTGTATATCTGTGTGTGCACAT	aa_P\Z_aa]bbb`bbbZR`^aa]a_b`aaba]_``	chr10.fa		3159804	R	2A33	83					
+HWUSI-EAS610	1	4	73	692	1982	0	1	TGTGTCTGTGTATGTCATGCAATTGAATGTACCTGT	X`bba_`b\aab__b^Y^aabaaaZ\`a_aXS]]ZW	chr10.fa		3159864	R	36	119					
+HWUSI-EAS610	1	4	12	1292	27	0	1	TAAAGCTGAGAAGGCATGGAGCCTCTCTGTCTCAGC	ab`aV`\__Z`[XX\`WV__Y\S\_ZX_[GV\\\\`	chr10.fa		3160387	R	36	118					
+HWUSI-EAS610	1	4	74	697	407	0	1	TGTTTCTTTTCAGAATAGCAAAACACAGACATGCAT	]`Z_``b`\_a^YX]a_Zaa_]V[aaa^`_^YUW[\	chr10.fa		3160491	F	36	119					
+HWUSI-EAS610	1	4	10	1386	1195	0	1	AATGACATCATCTTTATAATGGCATCACCCTTACAC	aV__bababb_]Iab`aba\a`X`^a`YabWN```b	chr10.fa		3160536	R	36	118					
+HWUSI-EAS610	1	4	59	833	1616	0	1	GTGTCCTGACTTTCTCTGCTCTTATAGGCACAGGCT	a]\_`[aa_`\Y\a[Z``[\Y`a[X^[_URY``X^_	chr10.fa		3160613	F	36	119					
+HWUSI-EAS610	1	4	48	282	400	0	1	GTGAGTGCTCCTAAGTCAAAAGAGAGAGACTTGTGA	aab`b`bbbbbbabb`bbbabaYbabab`abab_a`	chr10.fa		3161311	F	36	119					
+HWUSI-EAS610	1	4	25	1085	987	0	1	TCACTGACAATGATGGCTCCATACAGAGTTGACTGT	aaa^baa`aaa]^a`a_aa]]`a^\YRa_a`^^_a^	chr10.fa		3161440	F	36	119					
+HWUSI-EAS610	1	4	31	1148	1154	0	1	ATTTCCTTGAAGGCCAGAAAACAGTCAACTCTGTAT	abbb^W_]V[^^][a`U[U\_Y]\TV^_Y_Y^]T\a	chr10.fa		3161460	R	36	119					
+HWUSI-EAS610	1	4	25	76	1825	0	1	TGTCAGAGTTAACATCACTGACCTATAGTTACACAC	a_Y_b_`a_\TX_V^a^aaa``ba`Uab`\``a\Z`	chr10.fa		3161539	R	36	119					
+HWUSI-EAS610	1	4	90	47	844	0	1	TGGAAAGGTAACTCTGTCTCTTCATTATCTGTCTTC	_Vb\Y]_`_\[_baZaaa_`[ab_]``abb\_`bbb	chr10.fa		3161688	F	36	119					
+HWUSI-EAS610	1	4	16	257	1701	0	1	AGAGGCAGAGCCTAGCAGGAGTTGGTTGGGTCATTG	_YX\_R]\ZZ]_]_Z\U[^M[LU]QZXQWUV]`OMV	chr10.fa		3162034	R	5T30	95					
+HWUSI-EAS610	1	4	61	166	296	0	1	CTCCATTTCCCATGGATCACTTTTGGTTGTTGATCA	aa_aa`^`aaaa_a`T[``a___``a]aa]`a_`_[	chr10.fa		3162497	F	36	119					
+HWUSI-EAS610	1	4	99	762	144	0	1	TCCCCAGACACCCCACCGTGGGAGGGATTAATACTG	aa_a]a``\`_^^XaXUaYa`^Y_^^WW_\\\WW^`	chr10.fa		3162649	R	36	119					
+HWUSI-EAS610	1	4	21	963	674	0	1	ATGGCCCAGGCTGTCTCATGAGGTCAGGCTAACATT	aaaa[X`a`]^]a_``X]YXYZ`SSY``\a^^^`aa	chr10.fa		3163150	F	36	119					
+HWUSI-EAS610	1	4	53	566	416	0	1	CTGGAAGAGCGGTAAGTGTAACTGCTGAGCCACCTC	`bbbbbaaa`bbaaab``aaa`aa`aaaaa^a_`aa	chr10.fa		3163585	F	36	71					
+HWUSI-EAS610	1	4	40	928	1026	0	1	ACAACAGGAGAGAGGTCTGAGAGGTGGCTCAGCAGT	_`baaaaa`_Y`Zaa]`aa`a\_OR]`]_Z]a^aa`	chr10.fa		3163605	R	36	119					
+HWUSI-EAS610	1	4	31	990	1803	0	1	AGGCTGTTGCTGTGAAGGGAAGCTGCTCTGCGGTGT	abaaa^`a_`a`^aa``ba]a]V^_V\_]Z`_]SX`	chr10.fa		3163715	F	36	119					
+HWUSI-EAS610	1	4	77	462	1685	0	1	CTGTTGCTGTGAAGGGAAGCTGCTCTGCGGTGTCCG	`aaZa\_a`]`^^`a^Z^\]^^`T`R[\`\T\W\`_	chr10.fa		3163718	F	36	119					
+HWUSI-EAS610	1	4	11	1237	2037	0	1	ATGATCTTGACACCTAGCCATGCATCGTGGTGCATG	aaaaa`baaa_aaa_`aaaaaaaa`__W`^Y\^_aa	chr10.fa		3163852	R	36	119					
+HWUSI-EAS610	1	4	12	692	1127	0	1	CAAAACTACAAACAAGGACACACACACACGCACGTG	abbbbabb_aba]`aba__a``aa_a_a[aa`_]^^	chr10.fa		3164098	R	34C1	84					
+HWUSI-EAS610	1	4	67	1525	138	0	1	CCCAGCAGCCTCAGGCCCTGCCCTCTGCCATCCTGG	a`aa```Y\^^]^\V`\``\`\^Z^VKV\ZZ^\]PV	chr10.fa		3164330	R	36	118					
+HWUSI-EAS610	1	4	37	1383	403	0	1	CAACATCAACCCTACCCCAGCAGCCTCAGGCCCTGC	PV^___V__a_\^`^`_[ZZZ]XX`aaaZa_\XL]R	chr10.fa		3164345	R	36	118					
+HWUSI-EAS610	1	4	43	638	1363	0	1	GACCAACTCTGCTTTCATGGGACTCCCATAATCTCA	aaaaba_baaaaaaa_`aaX`_`aa``aaaaa_aaa	chr10.fa		3164639	R	36	119					
+HWUSI-EAS610	1	4	66	504	408	0	1	TACATGGTAGCCCAGTAGAGGATTAGAACTAGCCTT	a``^a_`]aa_``Z`\`_^aa]_`^]_]\`]a\Va_	chr10.fa		3164894	R	36	119					
+HWUSI-EAS610	1	4	39	1008	1623	0	1	GCCAGGAGTACTGGAAGGAATTACATGGTAGCCCAG	aa\U]W\]P]VPT`N\]_aa_`_^_^^[FYPPUBBB	chr10.fa		3164915	R	36	104					
+HWUSI-EAS610	1	4	75	235	1026	0	1	CTGAGGTGGGATCTTTAGATTTGCGTAGGTTTGGAC	aaa`ba^aaa_`aaaaZ`]_aaaaa_^aa]```aZ_	chr10.fa		3165125	R	36	119					
+HWUSI-EAS610	1	4	30	1418	389	0	1	AGTCTGCTTGCCCAGCCATTGGCCGTTGTCTCTTTA	a`]``a]a`_TZ^_ZU^``[XBBBBBBBBBBBBBBB	chr10.fa		3165159	F	28G7	51					
+HWUSI-EAS610	1	4	14	448	1488	0	1	TGGGAACGAGGTCTGTGCATATTGAGGGGAAGGGGC	abbbb]aa`bb^bbb\bbabaabbaabbba`aaaaa	chr10.fa		3165399	F	36	119					
+HWUSI-EAS610	1	4	96	1591	1610	0	1	GATGTGTCTAAATAAAGTGGGGTGTTTCATGTAAAA	\_ba[`a`[D[aaba`]I\baUI[_Xa^aaa\^a]_	chr10.fa		3165698	F	36	115					
+HWUSI-EAS610	1	4	37	1387	1883	0	1	AGCAGGGAACAGAGAGATCATTAACCAATGAGTTCT	`_aab^aYaQ``Y_`[Sa[___^^HY_W`_W_Z__\	chr10.fa		3165983	R	34G1	82					
+HWUSI-EAS610	1	4	68	331	81	0	1	GTCAGTGCTGTGGCAGGCATTCTGCTAGTGGCGGGG	_]a``P`[a^Za^ZZZ^XTT\ZZWXUZZRZXZZBBB	chr10.fa		3166038	F	35A	103					
+HWUSI-EAS610	1	4	73	829	503	0	1	AGACCTGTTCGGGACCTGTGTGCCTGACTTGCTGAG	aba`X^V]a\[P_KP_a``a^R[M^FPS^\_GYa[X	chr10.fa		3166081	F	36	116					
+HWUSI-EAS610	1	4	33	1227	1819	0	1	ACTGCGTGCGCAGATGAAGGGCTCCTTGAAACACTC	]\aba[`a`aXaa^ba``]Z\`^^\_`aX]]^_]^U	chr10.fa		3166294	F	8T27	82					
+HWUSI-EAS610	1	4	59	1420	339	0	1	GTGTGCAGATGAAGGGCTCCTTGAAACACTCACACC	aaa_a``_`a_Za`_`aa_`aaa____`^\_`^a\Z	chr10.fa		3166299	F	36	119					
+HWUSI-EAS610	1	4	71	982	63	0	1	CAATTTATTTTCATTCCTGTTATCTTTAGTAGCGAT	aabbbbbbbababbaaabbbb]aabbbaa`aa`aaa	chr10.fa		3166518	F	36	119					
+HWUSI-EAS610	1	4	7	1670	1617	0	1	GGGCCTGCATCCGCACTCTCTACACCTCATGTATGT	aaaa^`aXb`[[a`]^aUa`a`\`_]a]Z_`Y^`^]	chr10.fa		3166773	R	36	119					
+HWUSI-EAS610	1	4	83	857	1389	0	1	CTCAATACAAACTAGTCACTTGGGAAGAGGGAACCT	[`babb`a````abb^bba`]\bbab`\`^ZZa]`_	chr10.fa		3167163	R	36	119					
+HWUSI-EAS610	1	4	4	455	505	0	1	CTGGTCAGGAGAATTGGGGAGGAAGCTTGGGAACTT	abba_aabbab`a_aabab_baaaba_\`ba_aaa`	chr10.fa		3167247	F	36	119					
+HWUSI-EAS610	1	4	54	584	1620	0	1	GGCTATCAATGGCTATGATCTGCTGAGCACCATTGC	abbb`bbSaabaa__aUY_a``^_][_`_a_Va`a_	chr10.fa		3167296	F	36	119					
+HWUSI-EAS610	1	4	29	1556	602	0	1	CCTGGCCTTTCAGACCAGTTCTGCCACTTTCTGACT	aaaaa`aaaaaa^a__aa_aa`_`\`^`_``^\__`	chr10.fa		3167452	F	36	119					
+HWUSI-EAS610	1	4	89	1208	1705	0	1	TCAGCAGTTTTCTTAGTCCCTCTTGGTTGAATCAGT	aabbaaa_aabab`aa``]aa`aba__a`aaa[aaa	chr10.fa		3167497	F	36	119					
+HWUSI-EAS610	1	4	91	1155	570	0	1	TCTCTTCCCACGCTTCTCACTTCCTTCACCGCACTG	aaba`````a`aZ]`Wa`^`aa^\`_``W__^`\`a	chr10.fa		3167730	F	36	119					
+HWUSI-EAS610	1	4	44	743	476	0	1	GGACCAGGTTCAAAGTCTACAGCAGACAGACAACAG	a[^]_`aaS^^_^Qa]]a[_^_TW_\\_]W\_WT\_	chr10.fa		3167763	R	36	119					
+HWUSI-EAS610	1	4	84	1598	1360	0	1	GAAACGGATCAAATACGACACCGAGAATTCGGACCA	a`a`\_`\`X`a___`[`]]Z^_SSV_]_]]]]U]Z	chr10.fa		3167793	R	36	119					
+HWUSI-EAS610	1	4	3	953	946	0	1	CAACAAACGGTGAAACGGATCAAATACGACACCGAG	`_b``X[Y_Y]b]ZQW[aX_T]^\\ZU]aZUQV_R`	chr10.fa		3167804	R	36	118					
+HWUSI-EAS610	1	4	49	871	1988	0	1	GTATATGGAGGCAGATGAGCTGAGTGAAGACTGCGA	a]W\]PDIST[USUSYPLPMWVWVLJNUVTW\SVWB	chr10.fa		3167879	R	4G31	76					
+HWUSI-EAS610	1	4	30	1084	1619	0	1	AGTGTGCCCAGAGTGTGTCCGAGGTGCCAGGTCACT	GZ^_Z\_`aaaaaV_``a_^]][][`a[V_ZGT_[a	chr10.fa		3168270	R	C35	106					
+HWUSI-EAS610	1	4	42	579	1411	0	1	CAACACTGAAGGCAGAGCGTGTGCCCAGAGTGTGTC	a`]ZUN_aaVTVW_a`]a]PaU_Z]]VWZ`^_N]N`	chr10.fa		3168287	R	36	118					
+HWUSI-EAS610	1	4	45	1341	1772	0	1	TGGAGCCCAGCCACTGTCCCCTGACCCTTACAGGGC	aa]QXV\Z```\VV\a\T]Y\``^TS\\`[XX\`_B	chr10.fa		3168331	R	36	114					
+HWUSI-EAS610	1	4	10	125	1107	0	1	GTGAGTGGAGCCCAGCCACTGTCCCCTGACCCTTAC	ZST]SR_Q```a]GX^[QXZ[Z`^aXKXU[S^SI^S	chr10.fa		3168336	R	36	116					
+HWUSI-EAS610	1	4	58	763	1648	0	1	ACAGTGGCTGGGCTCCACTCACGTGGTCTGCGTCAT	a_Z_X_^`]]UXY`^^]X][X\\VVXVVZUZ]OTJY	chr10.fa		3168350	F	36	118					
+HWUSI-EAS610	1	4	97	1371	1494	0	1	ATGAAAGAGATGCAGTTAGCATGTGTCAGGATGACG	`aaa`\M]V[aa__^`^``]_`XX]ZYYa]X]__Z\	chr10.fa		3168380	R	36	119					
+HWUSI-EAS610	1	4	84	1525	1604	0	1	AAGCTAAGGCTCTCAACCCCCAAGCTCCTGCCACCA	TIT`^aWHT]Zbb`[_T^Xba_QYb`ZbaaZ`a_\R	chr10.fa		3168544	R	36	117					
+HWUSI-EAS610	1	4	79	1473	469	0	1	TGCATCCTCTTCCCCTCCCTCACCTGTCCTCATTCC	`T[^[PM\PZ\_`TQW[`[aa````\]]Y]`]`Y`]	chr10.fa		3168597	R	36	118					
+HWUSI-EAS610	1	4	75	854	241	0	1	CAAACATGACTGAGCTCCACACTGCTGCTGCTTCTT	V_aUa`a]]aSS_a``baa[ab`_bbaZ\ULa^\ab	chr10.fa		3168900	F	36	118					
+HWUSI-EAS610	1	4	18	313	1189	0	1	TACCATTGGGCCACCTCCCCAGCCCTGCCTCTGGAG	___aaaaaaaaa_^a`aaaaaa`aaaa`a`aaaa^a	chr10.fa		3169254	F	36	119					
+HWUSI-EAS610	1	4	56	954	336	0	1	GAGAGTTGAGGACTTTCCTAGACATGATCACCCAAC	a`]a`^aa`_^]^``___`Z`_]_`__]]_U^][_]	chr10.fa		3169304	R	36	119					
+HWUSI-EAS610	1	4	23	1601	1481	0	1	CAACAGTCAAAAACTGGGTAGGCTCTGTTTGTGAAG	abYX^a`Waa`_`_aaa^Ra_`^^]``X^`_X^]__	chr10.fa		3169610	R	36	119					
+HWUSI-EAS610	1	4	14	638	809	0	1	CACCCAAACATTCGCTTCCATAATGGGCTGTTCTGT	`aaaa_abaaaaabbab_aab`^aaaa_aa\`_ba_	chr10.fa		3169722	F	36	119					
+HWUSI-EAS610	1	4	71	1081	1048	0	1	CAGCCAAGCTCAATAAAGTGCTGAAGAGCAGACTAT	_bbba[`bbbbbabbbabab`abbbbbbaabbabaa	chr10.fa		3169888	R	36	119					
+HWUSI-EAS610	1	4	33	904	388	0	1	GTCACCAGCCAAGCTCAATAAAGTGCTGAAGAGCAG	aaa`ZU`aU_a`_[\\a__a^__Q_Z`_\\`WU\^`	chr10.fa		3169893	R	36	119					
+HWUSI-EAS610	1	4	60	1239	943	0	1	AAAAAACACAGCCCATAATAGCACATTTGGTTACAT	aaaaaa`a_aaa_`aaaaa`a`a_`aa`a_\`_]``	chr10.fa		3169955	R	36	119					
+HWUSI-EAS610	1	4	33	349	598	0	1	ATGGGCTGTGTTTTTTTAAATCTGACTTATGTGTAA	\bbabbbb`bababbbba`aabbbaaaabab\baba	chr10.fa		3169975	F	36	119					
+HWUSI-EAS610	1	4	91	891	204	0	1	GGGCTGTGTTTTTTTAAATCTGACTTATGTGTAAAT	a`_XRVY\XY`]^^]T\Ta_\GSN^a[_\XZXY]L`	chr10.fa		3169977	F	36	117					
+HWUSI-EAS610	1	4	64	876	1657	0	1	GCTGTAATACATATGATGTGTATTTGTTCTTGAAGT	^_aa^^`a]XFR[`_W_a_a]^aa``^_]a_a__a_	chr10.fa		3170190	F	36	118					
+HWUSI-EAS610	1	4	90	1015	1091	0	1	CAACAAAAACAACTTCAAGAACAAATACACATCATA	\[a`aaaaa]][__``aaa`a`aaaaa_a_aaaab`	chr10.fa		3170201	R	36	119					
+HWUSI-EAS610	1	4	5	1380	983	0	1	TGTGTACACACACCAGCACTGGTGGTGGCCACTGTG	a]]]_b`a`a\a^OZZ`ba`Z`Y`\M\ZN\\UUXU[	chr10.fa		3170399	F	36	118					
+HWUSI-EAS610	1	4	16	1570	602	0	1	AGCCTCCCCACTCTTGACCAATGAGCTGACACAGTG	aab]ba`aba``a_`Saabab^R`_Ua_^Z_ZaUV_	chr10.fa		3170428	R	36	119					
+HWUSI-EAS610	1	4	12	330	1900	0	1	ACCTGGTCAGACCAGACAGGCAAGCTGTAACACTGC	abba`a_b`baabba]bZV_aR\`a_W\`]`]`]_`	chr10.fa		3170536	R	36	119					
+HWUSI-EAS610	1	4	27	3	460	0	1	GAAAATACAGAGAGAAGCAGTGAGGTTTCTGATGCC	a\a`a`ab^b`b`]]_^aZ_\``]_T]_`XS]^\_a	chr10.fa		3170851	R	36	119					
+HWUSI-EAS610	1	4	81	504	90	0	1	GGCTCCCAATTCTCCAATTCTTCACCAACCTCAGCA	___V\_aa\aa\b`a\N]aaaaaa`aaa_Z__a`aa	chr10.fa		3170977	R	36	119					
+HWUSI-EAS610	1	4	66	663	1016	0	1	ACTGTAAGCCATACTTCTGTAGCTGGCTTATTTTAC	a^``a^ba`\b```aaba^U_a[ab]T[`[`aa_^X	chr10.fa		3171361	R	36	119					
+HWUSI-EAS610	1	4	1	591	190	0	1	GCGTTCAGAACAGGTAAATCTCTAGGAGTGGAATGT	`M`_b`abba_abaZbaabababaaa_a_aa__aa_	chr10.fa		3171476	F	1A34	101					
+HWUSI-EAS610	1	4	80	1459	359	0	1	GGAATGTGGGTTAGTGATGACCGAGATTCATGGTAA	`^\VaaV]_`Y`YZ_]T^``^Z]SUL]ZXR]\VVW\	chr10.fa		3171505	F	36	118					
+HWUSI-EAS610	1	4	72	704	996	0	1	GTTTCCACCACCCTTCTCCACAGAAACTCAATCAGT	`R`aaaa`^^`a`a[`aa`Ua``]_aa_^a``[BBB	chr10.fa		3171567	R	36	106					
+HWUSI-EAS610	1	4	100	321	652	0	1	ACTGTTCAAGGTGAGAGCGTTTCCACCACCCTTCTC	a``^FF_`YQRQ`_N^VX`W_UNZVGKSQ\\WS\VZ	chr10.fa		3171585	R	36	114					
+HWUSI-EAS610	1	4	76	1759	1097	0	1	AAATACAATTCACATATCTTAAGATCTGTCTTTTTA	ab`ba_aaaaa``aaaa_aa`\_^a_`a[__a^`aa	chr10.fa		3171673	R	36	119					
+HWUSI-EAS610	1	4	23	1114	1527	0	1	TGTCTGTCCTCTGCCACCTTAGGCTGTGTACACACA	ab``aa\_[`Z[^a[`\``___\\^`V_VWN\U_S_	chr10.fa		3172412	F	36	119					
+HWUSI-EAS610	1	4	81	576	412	0	1	ACACACATACATAGCCCCTGATTTGTATACACACAT	a^ZVa]a_a[a___Wa`^YaY_a`YTX``^__`]__	chr10.fa		3172441	F	36	119					
+HWUSI-EAS610	1	4	11	1244	1364	0	1	ATACACAGATCAGGGGCTATGTGTATACACAGATCA	`ab[a`aaaa[F_a`aaa_aa_b^^````^```^\[	chr10.fa		3172483	R	36	33					
+HWUSI-EAS610	1	4	96	959	1372	0	1	TACAGACCAAGGGCTATGTGTGTATACAGATCAGGG	aa`aba``aaaaaaaabb_a_b`_b`^ab_^__a_a	chr10.fa		3173080	R	36	63					
+HWUSI-EAS610	1	4	5	1296	1301	0	1	AGCAAGAGGAAGTGTTAAGCGGCTGTCAACATAGAT	abaT`b[aa]W]Ra]aaaa`]Y``_KKK\]^TZ^ST	chr10.fa		3173247	R	36	118					
+HWUSI-EAS610	1	4	90	478	1969	0	1	CATATTGAGGACACAGACTCAATATTGTTTCAGAGT	a_baaabaa`bbaa`a^a_baaa_[aa]^a`a`aaW	chr10.fa		3173572	R	19T16	80					
+HWUSI-EAS610	1	4	87	1458	1358	0	1	TGACATCTGACCTGGAAGGCATCAGCCCCCAGCCGT	`[^X^a\_YXP^`T[XZYUQ\`\\S]QX^X]XV\[R	chr10.fa		3173853	F	36	118					
+HWUSI-EAS610	1	4	54	1177	616	0	1	ACCTGCACAGCCAGGGCTCACGGCTGGGGGCTGATG	_\X_X[YWaXY_`ZSFY_Y[YXXWYTVWLWIYVYX[	chr10.fa		3173872	R	36	116					
+HWUSI-EAS610	1	4	50	670	798	0	1	ACATATGTGTGGGCCTCTGAGTGCTCTGAGCTTGTC	Zbbaaba_^\]``^abaa`[]]aaa`aa`a``]^_[	chr10.fa		3174530	R	36	119					
+HWUSI-EAS610	1	4	14	228	1615	0	1	AGAGCCAGTACATATGTGTGGGCCTCTGAGTGCTCT	`]R]aaab\`aaa_aaWa\_``abaa`_]a\aa`a_	chr10.fa		3174539	R	36	119					
+HWUSI-EAS610	1	4	65	776	2007	0	1	GGAAGAGCACCTGGCCTATGGAAACATCCACTGAGC	T^bbaa_bbbbaababbaaa]a`baaa_aa^a_Ga^	chr10.fa		3174658	R	33G2	107					
+HWUSI-EAS610	1	4	22	1382	1230	0	1	GGNAGAGAGACCACATCTAAGAGGCTTTTTGTGTTT	_ZDTb]aa[``ab^a`_`a_a]^^_a`aa_^Ya^`a	chr10.fa		3174700	R	2A33	110					
+HWUSI-EAS610	1	4	64	1198	409	0	1	AGATGTGATCTCTGAGACTCCTTCCCTGGGAAGGTA	aYabUabab_a]aR`a`Zbaabaa_`aa^a__`aUa	chr10.fa		3174773	F	36	119					
+HWUSI-EAS610	1	4	52	327	112	0	1	ACACCAGGGCAAGGAAGTGGCACCATTTGTGTGCAG	a`Z`aa^aaa\]aa^``Z^_``\\Y^^^]U`VYTX[	chr10.fa		3174968	R	36	119					
+HWUSI-EAS610	1	4	10	1473	1591	0	1	TGGGTGACACATCATTCAAACCACAACACCAGGGCA	`_U[Q_a[`a^`_X]``aaa]`aZF]R`_[]__[``	chr10.fa		3174993	R	24C11	108					
+HWUSI-EAS610	1	4	84	730	1183	0	1	AATAAACAAACAAACCCTTCCCTTGATAAGTTGCTT	[`b_YSabZUG\\WZb[\_[_a_W\Xa`a_a^]L]_	chr10.fa		3175215	F	36	117					
+HWUSI-EAS610	1	4	71	973	1453	0	1	TGTCCTCCATCTCACTGACAACCAGCCTGGCTAAGC	a\ba`baaaaaaab`abbaba_`aaa_aaa`a_^`Z	chr10.fa		3175679	R	36	119					
+HWUSI-EAS610	1	4	37	428	1863	0	1	TTAGTTTATGTGGTGAAGGGCAAAGGCTACACATCA	`aa`_aaaaa_aa]_`_]__aa]_a_a`a``aaa`^	chr10.fa		3175752	F	13G22	85					
+HWUSI-EAS610	1	4	61	1586	1005	0	1	CACTCTGGCCCCAGCCAATGATGTGTAGCCTTTGCC	aba`\]MVSa_]aZ``aa_aaa]WVXZNX\a`[Q_[	chr10.fa		3175770	R	36	118					
+HWUSI-EAS610	1	4	59	1490	1051	0	1	CAGCAGCACCTGGGATTCCTCCTCATGCAAATGAGG	abbb`V_bbba_]aaaabaab`b`aaaaa`aaaaa`	chr10.fa		3175815	R	36	37					
+HWUSI-EAS610	1	4	31	1492	1607	0	1	GGAATTCCAGGTGCTGTTGGACATGACCTTACAAGG	aa_aWGWKTTXYTPURG_a_OSR_UVUSGZUOKPXW	chr10.fa		3175832	F	5C10C19	5					
+HWUSI-EAS610	1	4	12	693	1052	0	1	CGGACTGGCCAGCAAGAACGACACTTGCAACAGAAT	`b_``a^baaab\_[aababaababab^aa`aa`b`	chr10.fa		3176177	F	36	119					
+HWUSI-EAS610	1	4	40	1080	599	0	1	TGTGAGTGTGCGTGTGCATGTGTGTGTTCAAAGATA	aa]a^\[a___aWa`^``aa`a^`]]^`^aa``__`	chr10.fa		3176764	F	36	56					
+HWUSI-EAS610	1	4	39	32	122	0	1	CTACGGAGTCTGGGGAATGGGGTACAAAGGGGTGTG	aa]aa`aaSa`a\]aRY`a`a^U_]]`]`Y_^U`W_	chr10.fa		3176833	R	36	119					
+HWUSI-EAS610	1	4	85	759	1184	0	1	TGCCAGCTCTCACAACTACGGAGTCTGGGGAATGGG	abbbababaaaaa^b``aabb\```aabba\`abaa	chr10.fa		3176848	R	36	119					
+HWUSI-EAS610	1	4	8	253	245	0	1	TGTGGGAATTTTGTGTCAGAGAGCCAGCAGAGGTGT	ababaaaaaaab_U`_`aa`a^a`[F]__``aaUa^	chr10.fa		3176911	F	36	118					
+HWUSI-EAS610	1	4	89	1689	1710	0	1	AGTCTGCAGCTAATAAAACTTGTGGTGATCTATCTG	abYaab^ab]aZbbaabaaabb_baSa`a^a_a__a	chr10.fa		3177440	R	36	119					
+HWUSI-EAS610	1	4	52	617	1144	0	1	TGCTCCTAGCACTGATGGCTTCCCCGTGCCCTTGGG	```_^Z]U]Z^\^`Z\]NXaa\ZZT_Z^\S\^^^Y]	chr10.fa		3177480	R	36	118					
+HWUSI-EAS610	1	4	80	1154	10	0	1	TGCAAGAGCAATCTCTCTCAGCAGGCCCCTATTCTG	ZZabb__baabb_a`baabb`_aa_aaa_aZa`aaZ	chr10.fa		3177731	F	36	119					
+HWUSI-EAS610	1	4	65	1059	484	0	1	ACCACCTCCCAGTATCCTCCACTGTCACTCCCCATT	`aZ\`a_W\X]]Oa]]]aV`\\XUT[aK`URHRSX`	chr10.fa		3177867	R	36	117					
+HWUSI-EAS610	1	4	34	1149	821	0	1	TGGGAGGTGGAGGATGCTGGGAAGTGGAGGATGCCG	`_^aO\\KUXX]`US\]UZYROW^T]ZV_MVSQXPV	chr10.fa		3178045	F	36	27					
+HWUSI-EAS610	1	4	60	1387	1813	0	1	GTGTGCTGAATCTGCTTGGGTGGCACAGGCTGGGTG	_`UPZZ_```[Q^\``\`_aZaa^^Z]^WR\\]T\^	chr10.fa		3178379	F	36	118					
+HWUSI-EAS610	1	4	2	1039	1497	0	1	TGCAGGTAGATCCTTGAGTGTCTGTGTTGTGGACAA	abaa`a^`ba_aaaab`bRaN_aaH`U`aVW]UZ__	chr10.fa		3178494	F	36	118					
+HWUSI-EAS610	1	4	28	568	202	0	1	CAGGGTTCCTGAGCTGAGGTGTTTGTTCTTTAACCT	aXUa]^aS_Y[WXU``a\^L\^aaa]aX`abRXU_b	chr10.fa		3178530	F	36	118					
+HWUSI-EAS610	1	4	52	36	1313	0	1	CTGTCTTACATAGTGAATGCAAAAGTGTGGCTGCCT	aaa^baaaa_aaa^a]\_aa]\_`]Z`Z``a_a__\	chr10.fa		3178612	F	36	119					
+HWUSI-EAS610	1	4	52	550	1645	0	1	CAAAAGTGTGGCTGCCTCTTGGCTGGTTCTTCTTAT	abUaR_`_Qaa_``a___^a`a]^]HXaZBBBBBBB	chr10.fa		3178631	F	25T7G2	73					
+HWUSI-EAS610	1	4	77	918	497	0	1	GTGAGTTACCAGCATGAAACTAACTTAGCTTCGGGG	a_a\`Z_a]R``Z_]`]___a_]]a__^^__^T^^Z	chr10.fa		3178697	F	36	119					
+HWUSI-EAS610	1	4	61	840	464	0	1	AGAAAAGGAGCTTTGGTGGCATTTCACTTAGCTTCT	aa\ZSVVVW]N`\Z]]P^[]a]T]V]\aYO`YV[`a	chr10.fa		3178970	F	19TG15	47					
+HWUSI-EAS610	1	4	75	1128	567	0	1	GTAGGGCTCCTGTCTCCTTGGAGTTTCCAACCCATT	aaaa_aa`aaaa_`a_aaab^`a\_`a^^__^__``	chr10.fa		3179307	F	36	119					
+HWUSI-EAS610	1	4	17	873	1083	0	1	ACTGATCTACAGGTGAGGTGCCGGGAGACAGGATGT	a`baba]a^[]`a\aTXaHaYY^a^^_XVL^VX_`Y	chr10.fa		3179470	F	36	118					
+HWUSI-EAS610	1	4	14	56	24	0	1	GCTGAAGGCCACATGTTATCTAAGTGAGGGACATCC	aa_ba_`a_aaQ`__Z_]___Y_aN_\YUTV^X_YZ	chr10.fa		3179500	R	36	118					
+HWUSI-EAS610	1	4	97	330	1044	0	1	TCAGAATGAACCTGATTTGCCATCTAGGCTGAAGGC	aaabbaaaabaaaa\aaaaa`aaa^aa_a```_`^_	chr10.fa		3179527	R	36	119					
+HWUSI-EAS610	1	4	50	1730	1826	0	1	GTTGGTGTGTCACCACTGTAAACATGTCGCTGCTGG	aaaaaN`V^\PSTUNWUaV\WWUW^[SRUWUVQSSS	chr10.fa		3179846	F	36	118					
+HWUSI-EAS610	1	4	96	838	258	0	1	AAGCATAATTCCTGTCGTCTTCTAGATTCCTGTAGA	aa_S`_`aa][_`a_[b]]`_^`V^^^`ZZ_`X_[`	chr10.fa		3180231	F	10T25	87					
+HWUSI-EAS610	1	4	54	645	1586	0	1	CCAGCCAGCAAAGGAGCACAACTCCAAAACTGTGAA	aabababbabbaba`aabaabaaaa`aaa_a`_aaa	chr10.fa		3180394	R	36	119					
+HWUSI-EAS610	1	4	72	1350	837	0	1	TATATTGGTTACTTTCCTGTTGCTGTGCTAAAGCCT	`abaaa_aa_a__^a`a_a[YY_``^^Z`aa`X_Y\	chr10.fa		3181327	F	36	56					
+HWUSI-EAS610	1	4	89	1262	2039	0	1	CTACTAAAAACATCATAATTGGGCTGGCAGGATGGC	^baaa``babbaa_[aaab`bb_aa]Y`_aaa`aa]	chr10.fa		3181833	R	36	119					
+HWUSI-EAS610	1	4	1	174	776	0	1	AACTTATATTTCATGACCCAAAAACATCAGGAAGAA	`aababaaaa`aaaaa_aaaU`aa``aaaaabbaaa	chr10.fa		3182102	R	36	119					
+HWUSI-EAS610	1	4	69	208	1618	0	1	TGCTACGCAGAAAAACCTAGTCTTCCCTGCAGACTG	`ababbbb`ba]^abaaa`^Pa`abab[ba_aaaVa	chr10.fa		3182155	F	36	119					
+HWUSI-EAS610	1	4	77	1039	663	0	1	TTTAAGGTAAATATTAGGGAGGCCAGTATGGAAACA	^aaVa_\\VVa\T\ZPU\^T\V]\VSZ]^``TO]`^	chr10.fa		3182309	F	36	118					
+HWUSI-EAS610	1	4	18	523	834	0	1	AGTATGGAAACAGATCAGCAGGGATATCAGCAGAGA	`b_aaaa^```aaa```aaaa`a`_a___`]_a`a_	chr10.fa		3182333	F	36	119					
+HWUSI-EAS610	1	4	64	577	1224	0	1	TATCAGCAGAGAAAGACCGGAAGAGGGTCTGTCACA	aa`aa_\aaa``aa``_aaa\_a`a`aY`a`\__``	chr10.fa		3182357	F	36	119					
+HWUSI-EAS610	1	4	19	680	547	0	1	ACCGCTGGCCGGCCTCTGCCCTGTCCCCGCCTCACT	a]``^Z\`V\`^^X\ZQ^^^XPTYPX\T\\TRRR\V	chr10.fa		3182965	F	36	118					
+HWUSI-EAS610	1	4	43	748	1507	0	1	AATTGGATTTGGGCAAATGGCACGTATTTAACTGAA	^Z]\bb`b```[`aa^S]a\aaa_TV\`a`][aaWT	chr10.fa		3183025	F	36	119					
+HWUSI-EAS610	1	4	20	634	1943	0	1	ACACTAGGGTCTGCCCTCAGCCATGCTTGCACTCGA	`aba`aaa]Y`_a^Yaa_aaaaa]a`_]a__`^`]_	chr10.fa		3183377	F	36	119					
+HWUSI-EAS610	1	4	97	659	1818	0	1	AACTGACAACTTAAGATCCCAGAAGAGGGAGCATGG	__a[_a__baaZZR_a``_`^``a_]```[__^]__	chr10.fa		3183481	R	36	119					
+HWUSI-EAS610	1	4	64	421	780	0	1	CTTAAGTTGTCAGTTTCTGACGGTTGCGGCCTGCGC	aaa_aa[abZZU^aaa___^]aa]^ZY__^\VNU`X	chr10.fa		3183502	F	25A10	88					
+HWUSI-EAS610	1	4	58	1401	1312	0	1	CAAGGCTTAGAGATGACCACATCTTATGGTGGTTTT	Xa_ab[bbWWW]_a\Va^S^`__``TSaaG]\BBBB	chr10.fa		3184461	F	35G	98					
+HWUSI-EAS610	1	4	84	770	195	0	1	GGAAGGTGCGGAAGAAGAGCTTGTATAATCCTGTGT	\\\_^VV^S\][X]]YSY]T\]]Y\\]ZZVGW_N]V	chr10.fa		3184608	F	1A34	85					
+HWUSI-EAS610	1	4	23	1247	1640	0	1	TGCGCTGAGGAGAAGTAAAGGCAGAATCGATTCCCA	`abab__aaa`WH\bSbaVbaba^a`XRa__W_`aB	chr10.fa		3184737	F	15C20	90					
+HWUSI-EAS610	1	4	36	204	1045	0	1	AAGCCAAGACAGAGAGCTAGGAGACTCTCCCCCCAG	a\V_`W[``Ub`[`aVbVP_YHR`____RU[Xa]BB	chr10.fa		3184842	F	33AGT	70					
+HWUSI-EAS610	1	4	75	1319	850	0	1	GTTGAAGTGGATTGGATTTGCACCAGTGTCCCCAGC	aZ`a`a]^a__aa``_\___S\\[^\VV\^\\\\`V	chr10.fa		3185057	F	36	119					
+HWUSI-EAS610	1	4	41	144	501	0	1	TGTCCCCAGCATCCATGCTGTGATCTCTTGTATAGA	`_`abb^[ZZa`b_^_ab_`ZaZ__[]aaa^`ba_]	chr10.fa		3185083	F	36	119					
+HWUSI-EAS610	1	4	22	68	1385	0	1	ACAGATAGCATGCATTTAATACAGATATCAACGGTT	aaa[a\Y\aa\a^_^^a_V_a_^bY[_a\^a_aaTR	chr10.fa		3185468	F	36	119					
+HWUSI-EAS610	1	4	78	257	1419	0	1	CAGATAGCATGCATTTAATACAGATATCAACGGTTC	a\aa^]^bb]abbaaaaa`aaa_\`a``aaaaa]^]	chr10.fa		3185469	F	36	119					
+HWUSI-EAS610	1	4	35	1516	618	0	1	ATAGCATGCATTTAATACAGATATCAACGGTTCAAA	abaaaaaa`aa``aaaa````a`a[^`^[_X]_^``	chr10.fa		3185472	F	36	119					
+HWUSI-EAS610	1	4	71	1772	914	0	1	GATAAACACCAACCCCCAAGGATTTGAACCGATGAT	a^a`V_WQZXVRJX]`]OPZ[VDWWUWVYWUFPYSZ	chr10.fa		3185494	R	17G13T4	85					
+HWUSI-EAS610	1	4	12	544	496	0	1	GGAGATTTTCAGCAACTGCTCCCCGTCTATCTTCTC	a[JWQQPRVU\TUYKLFXSRNRTS]TWWUNUNWUU\	chr10.fa		3185778	R	36	115					
+HWUSI-EAS610	1	4	9	765	231	0	1	CTTAGTCTGGCACACTTGTATGCATGCATGCGTGCA	abbbb]abaa`babbab`\babbabbbaab`__aa_	chr10.fa		3186021	F	23G12	81					
+HWUSI-EAS610	1	4	94	689	1793	0	1	GGAGGATGAAGGACAATTTAGAGCTTTACCCATGGA	aa`a__aaaa```a_`]X]a``^_```___`____^	chr10.fa		3186121	F	36	119					
+HWUSI-EAS610	1	4	84	986	724	0	1	ACCTCTCCAACCCCTGGAGTTCAACTCTGTGGCCTT	aa`_`a^aaa``a_^a`]a^^\`a^_\^_W]Y_^]\	chr10.fa		3186253	F	36	119					
+HWUSI-EAS610	1	4	24	1323	413	0	1	AGTGGAGTAAACAAAAAAGATAAATGTGCCAACAAG	a`\a_`_U`_^_`^^`[`a``_aa][W_Y_`^^]^_	chr10.fa		3186543	R	5G30	82					
+HWUSI-EAS610	1	4	28	242	126	0	1	AGGTGCAGAGGGAGAGTGGAGTAAACAAAAAAGATA	_aaOaa`b_Xa^a```_aaa[I\__aaTa`_aa_]`	chr10.fa		3186557	R	19G16	80					
+HWUSI-EAS610	1	4	61	372	922	0	1	TGTGAGTGGGTGTAAATGTGGATAAAGGCTAAGAGG	a`Wb^aZab`Z`Va__`aZa___^`^]_]____X__	chr10.fa		3186622	R	36	119					
+HWUSI-EAS610	1	4	70	311	1015	0	1	TTGTGCTGCGAGGACAGAATGGAGTCTCTAACAGAG	aaa]ab[`ba]aaaa\]VS_bbSa_aaa^_`__X^_	chr10.fa		3186743	F	36	119					
+HWUSI-EAS610	1	4	51	865	19	0	1	GAGACAATAAACACTCTGGGTTTTGGAGGGGCATGT	W^HZ\ab`^_b[^aZUbbb]`bbbZb`a]^]]a`^B	chr10.fa		3186782	R	36	114					
+HWUSI-EAS610	1	4	22	1582	1369	0	1	GTTTTTTGGTAACAGACAACACTTTTCTGTACATGA	aa_aaa_aYM_a^_a_^]a]_Y`_a_^]_[][^]^[	chr10.fa		3186816	R	36	119					
+HWUSI-EAS610	1	4	49	1457	1998	0	1	TGGGCCGGAATGTGAACTTTGCTCCAGAGTTTCGCT	aa^_a`ab`aaa_a^a_aa_a`_[[``aa^`_[`W`	chr10.fa		3187072	F	5A30	82					
+HWUSI-EAS610	1	4	48	743	1818	0	1	CAAGTCCTGTATGGCTACACCTGTGCTTCCTAAGGA	aa`_RY_b`__R^]R]PO\XZZ_`VW`_`TT^WZ\V	chr10.fa		3187135	F	36	118					
+HWUSI-EAS610	1	4	33	738	241	0	1	TCTGAATGAATTCCTTAGGAAGCACAGGTGTAGCCA	a_ba]_`____a^]_`aaa]^`__^^^_Z_Z^^]^_	chr10.fa		3187146	R	36	119					
+HWUSI-EAS610	1	4	55	1759	1136	0	1	ACTCAGGTCTCTTGTCATGGTGCCACGCTTAGGAAA	_aa]`]_[a\_a^G[XVWNZ`\`aa^_[^M`aZ_^a	chr10.fa		3187239	F	36	117					
+HWUSI-EAS610	1	4	76	1047	1900	0	1	GGAGGGGTGCCAACCCCGACAGTTAAGTGAACAGTT	aa`^Y^a\_^aaa]\\``^__`\^a]`\^W_T\_W^	chr10.fa		3187273	R	36	119					
+HWUSI-EAS610	1	4	26	1458	849	0	1	AGTGTGTGGGGATGTTGCCACTGCTGGTCTGCATTC	abab\a]a]``^_a\a^a^a]__^YWMQ_[T[__^^	chr10.fa		3187402	F	14C21	86					
+HWUSI-EAS610	1	4	22	979	1904	0	1	GGATACAAAAATCCTGCCTTCCCGGCCAGCACGCAG	`aabb_abababa_aaaaaaa[a^^]_a``a^_VYa	chr10.fa		3187604	R	36	119					
+HWUSI-EAS610	1	4	100	1196	1708	0	1	CTTGTAGTCTTTTCTGCTGGAATGCCCTGTGCTGTT	`b`aaaa[babbb_abaabb]aaaa__^a^aNab^a	chr10.fa		3187865	F	36	119					
+HWUSI-EAS610	1	4	63	1430	1145	0	1	GAGCAATGATAAAAGTGGATAGAATAGAGAATAACC	Xa]b`]`aaaa`]]a^^]a^aa__WQ[L]\\TVa]_	chr10.fa		3188620	F	36	118					
+HWUSI-EAS610	1	4	23	725	136	0	1	GGCTTTTGCCTCATCTGGCTGCTTATGTGAGGACTA	aaa```aa_`__a`a[__Z^`[_a\U_V`\`_\^a_	chr10.fa		3188801	F	36	119					
+HWUSI-EAS610	1	4	35	1289	1794	0	1	CACTGCCCGTGAATGTTTCCCACCAATGCTGTCCAA	abbabaa_b_aa`ab`a]Z_X]N_abaa__a]__^a	chr10.fa		3188947	R	36	119					
+HWUSI-EAS610	1	4	24	282	1178	0	1	AGTGTTGAATGATGCCATCCTAGATTTGTAACAGTT	]babbbbb\bba_bba[`bbbabababbabba\aaa	chr10.fa		3189085	F	34GG	43					
+HWUSI-EAS610	1	4	88	1007	796	0	1	TGCATTGTGCTCCCCCTCAGGCCGCTCATTGATCAT	YaaR]_`Z`\WH_ZO]Q`QXV`a`ZZU`_XV_b_WW	chr10.fa		3189151	F	36	118					
+HWUSI-EAS610	1	4	64	722	1326	0	1	TATTAAAATATGACCAGAGCCTGAAGCACTGGAGAG	a`aa_]P^a_a_`^_a_`]]]`ZX^[^^]_`^Z`Z_	chr10.fa		3189395	F	36	119					
+HWUSI-EAS610	1	4	67	821	1234	0	1	CATGATGACTGTGACCAGCCATTTGGGTGCGGAGAA	a`a_`^Zaa_a_baa^baZaaba`a`aWa^b_`aaa	chr10.fa		3189948	F	36	119					
+HWUSI-EAS610	1	4	8	1575	295	0	1	GGGAGGTTTAAATTTATAATGCTTCTAGTTCTAAAA	WO]ZHOTT_a_WVaW][V_aa]]LW^]_U^\[___a	chr10.fa		3190066	R	30TA4	53					
+HWUSI-EAS610	1	4	68	521	1064	0	1	CGTGTCCTGATGTTCCAGAGCAGCCAGGTCTCAGGA	`]^Y^W]\YR\]YPW\^YMKXOW[TW`^PXMWY`^B	chr10.fa		3190312	F	24T11	88					
+HWUSI-EAS610	1	4	42	1450	867	0	1	TTGGCTTCAAACTGTCTATGCTCCTACATCAGCTTC	aba^aaaaaaa`aa_a_a`aaa___a_a___^_^`]	chr10.fa		3190450	F	25G10	81					
+HWUSI-EAS610	1	4	39	1091	312	0	1	TTACTCTTGTCTGCTGTCCCTCCTGTGTCCATCTTG	[ba\[G_^]V`b\T[X_TJ]a_aX[\QOY__ZPVaY	chr10.fa		3190534	F	36	117					
+HWUSI-EAS610	1	4	50	758	675	0	1	TCCAACCTCTGCCTCAGCATACCAAGTACTTCCAGA	a`a_][]b_``aa_```_a`a_`aa[^Y_a\\^__Z	chr10.fa		3190603	R	34CT	52					
+HWUSI-EAS610	1	4	16	1462	907	0	1	GGGATTCCAACCTCTGCCTCAGCATACCAAGTACTT	aba`ab_aba_aaaa^aaaaba_aaaaa_aa^````	chr10.fa		3190608	R	36	119					
+HWUSI-EAS610	1	4	97	803	1627	0	1	CAGGGAAATGCACCAGAGGCTTTGCCCACAGGTCAA	]bZaa`aaa`_aa_`^a^X]]aa``_]a_XXaG^Z]	chr10.fa		3191091	R	36	118					
+HWUSI-EAS610	1	4	40	848	1295	0	1	GTAGTCTGTGTGACGGCCACACAGAGAGCCCTGGCC	_`[Z`a`aX^[\`^^a```]RZ````Z]X]]P`aYZ	chr10.fa		3191429	F	36	119					
+HWUSI-EAS610	1	4	100	1230	1837	0	1	CTGGGGAGTGAGCTTCTGATATCTGATAGGTGCTTG	NbY`YbWT^UW_^[ZabaV_`Za`a`b[IR]JYa^W	chr10.fa		3191585	F	36	117					
+HWUSI-EAS610	1	4	43	808	451	0	1	GGGGAGTGAGCTTCTGATATCTGATAGGTGCTTGTG	abab_aYa[b^aa_ab`a_b`aa\a_a_Wa^aaaab	chr10.fa		3191587	F	36	119					
+HWUSI-EAS610	1	4	29	91	1377	0	1	CCACATGCTGGCCTGTACGCTCTACTCCCTCAGCCC	aa^_P\_a`___a`]V]`aa`aaaa`aa_[]Q\_`a	chr10.fa		3191886	R	36	119					
+HWUSI-EAS610	1	4	14	236	530	0	1	AAGCTGTTGGACAATGCAGCCTGGGGCACATGAGGG	`]`b`a]`_bbbbbabb]b`aaabaaabaa\aaaab	chr10.fa		3192261	F	7G28	82					
+HWUSI-EAS610	1	4	56	933	1168	0	1	AGGGACAATGGGCTTTTCTTCCTGAGGCAAACTTAA	^bbbaY^ab^aTNT^b_bbaaUabOaZBBBBBBBBB	chr10.fa		3192316	R	36	80					
+HWUSI-EAS610	1	4	40	212	709	0	1	GCCCATTGTCCCTGGGTCTCCCTCTCCTGGAATTCA	_Xa\\_`]]baba\b^Q`_\a`W`]b_WQ^[b_O]U	chr10.fa		3192339	F	36	118					
+HWUSI-EAS610	1	4	30	1180	762	0	1	CATGCTTCATGTCAGCACAACAACCTTTAGCACGGT	abbbbababaaaaa_[aabbaab`_aa`aa`baa`\	chr10.fa		3192678	R	32T3	81					
+HWUSI-EAS610	1	4	34	1060	1597	0	1	CAGCTCCTCCTGGATCCACCTTCCCCTCCATACCAT	`bb_baba]bbba]aXa_`a`b`a`]R]a^^ZZ]aa	chr10.fa		3192900	F	35C	81					
+HWUSI-EAS610	1	4	10	1505	858	0	1	TCTTGAGCAGGCTTTAAGTGCAGTTAGACAGCTGTC	]UWX[a[aZ]\QW\ZR^aX_]SXQ]_`]_^`_a[^_	chr10.fa		3193266	F	36	118					
+HWUSI-EAS610	1	4	10	168	1223	0	1	AGATCCCGCAGTAACTGACAGCTGTCTAACTGCACT	a`b^bbaabba_abbaSa`bba]a^U[_Va_aa`_`	chr10.fa		3193282	R	36	119					
+HWUSI-EAS610	1	4	12	1471	472	0	1	GGCATGCATGGCTACACTGCAGGCTGCCTTAGGTTA	`aabaaaaaTW`]bZb`_aaaUYN_````^`VOQa]	chr10.fa		3193482	R	36	118					
+HWUSI-EAS610	1	4	45	39	1066	0	1	TGAATGGAGCCCTGGGAAGGAACAAGAACTCTCTTT	aba]aba\_aab`bab_aaaaaaabb_aaaa``a]_	chr10.fa		3193565	R	25A10	80					
+HWUSI-EAS610	1	4	2	60	1012	0	1	TAACATAAAACGTTACAGGTTTACAGATCCATGTCT	aabb^bbababa`bbb_ab_aaaaabaabbaaa_ba	chr10.fa		3194205	R	36	119					
+HWUSI-EAS610	1	4	58	1169	925	0	1	GGGGTGTGTGTCCCCTGTGTATGTGTATACCTCTAT	_baaZbaU[_[Xa`^QXVQJO]Y]PI[U`U[a]`_a	chr10.fa		3195640	F	36	117					
+HWUSI-EAS610	1	4	44	926	134	0	1	TGAGTCTAGAAGGCAGCGGATCCCTTGAAGCTGGCG	a`aa^_aaaaa`]_a``aaa`^^\^\a^^^U[\VX[	chr10.fa		3195723	F	11A24	82					
+HWUSI-EAS610	1	4	13	1502	64	0	1	ATGCGGCTTTAAACGTGGAGATGTGCTGGTGGTTGT	a[U^VU_`_\_S\^_U\^Y]YWVW\YWSUWYWBBBB	chr10.fa		3195857	F	36	101					
+HWUSI-EAS610	1	4	19	233	1748	0	1	CAGTCAGGAATAAGGGGGAAGGACTTTTTTTTAATC	^LY^`^a`[_```aa``]OX`]R_[_\`_`^_`a^]	chr10.fa		3195909	R	32T1AT	13					
+HWUSI-EAS610	1	4	53	1058	736	0	1	GAATCTGACATCAGCTGTGATACATGAGGGCCATGG	ab`aaaaaaaa_aa_`b^ba`_`a__KT`]^^`aa]	chr10.fa		3196158	F	36	118					
+HWUSI-EAS610	1	4	28	986	1289	0	1	ATCAACGCCTGGACTTAGACTCCATGGCCCTCATGT	aaa__```_`\VJW]]_^Z]a]aUV_`V\\_\^__\	chr10.fa		3196179	R	36	118					
+HWUSI-EAS610	1	4	81	1236	411	0	1	AGTTTATCTGTAGTCCACTACATCCAAGTGTAAGAG	`bbbbbbaa_`a]```aaabaaa_`aaa]a_a`a`a	chr10.fa		3196323	F	36	119					
+HWUSI-EAS610	1	4	61	878	1819	0	1	CACTACATCCAAGTGTAAGAGGCAAACAGTGAAATT	a`abbbababaab`aXaaaabb_a_\[Xb_b_a[aa	chr10.fa		3196338	F	36	119					
+HWUSI-EAS610	1	4	39	1580	463	0	1	ATTGAGGCCCATTTGCTAATTTCACTGTTTGCCTCT	aba`^__aa_`a`a[]a^_aaaa___\Y`^X[[]__	chr10.fa		3196355	R	36	119					
+HWUSI-EAS610	1	4	97	668	1394	0	1	AGCTTCCCTCCGTTCCCCATGCTCCACAGCTAAGGT	aaaba]aaa`_\L^]^__\_]aQ`[^Z]``^[[a^S	chr10.fa		3196434	R	10T25	83					
+HWUSI-EAS610	1	4	49	314	648	0	1	CAGGAGAGTAGCTTTGCCTGAGCATGTTAATCTTGG	aaba_baa[aaaa`^aaaaa_a``ab`aa`a`a`a`	chr10.fa		3196604	F	24C11	81					
+HWUSI-EAS610	1	4	52	1314	1514	0	1	CAGGAGAGTAGCTTTGTCTGAGCATGTTAATCTTGG	`aaaabab`ababbabaabbbb`Zaa_``aa`aa`a	chr10.fa		3196604	F	16C7C11	43					
+HWUSI-EAS610	1	4	54	1631	318	0	1	AGATGTCTGTACCTCAGTGAACTTAGCGTGGGGCCT	_T__VY]^[`a``__`^\a__`aZ]UULQJLVVYZ^	chr10.fa		3196734	F	36	118					
+HWUSI-EAS610	1	4	37	1611	761	0	1	TAACCTCACACATTGTGTGTACTGTGTGTAACCTCA	_abaabbaaba_aaa_aab^a``_^aO`_aa]^_a^	chr10.fa		3196930	R	36	30					
+HWUSI-EAS610	1	4	60	197	1423	0	1	CTCACACATTGTGTGTACTGTGTGCAACCTCACACA	^_]]W_``^^a^WX_V\^V^P`UaZSUZU`_`_Y[B	chr10.fa		3197203	R	36	24					
+HWUSI-EAS610	1	4	61	78	341	0	1	GTGTGAGGTTGCACACAGTACACACAATGTGTGAGG	aaa`baa`_bbbbbabab]`_aab`aa`b`a]_\aa	chr10.fa		3197204	F	36	31					
+HWUSI-EAS610	1	4	61	1466	1544	0	1	TGTATGAGGCTATACACAGTACACACAATGTGTGAG	ab_aaaaa]_bb`X_`\Z_aba`^_YZa^YOO_`aa	chr10.fa		3197553	F	36	119					
+HWUSI-EAS610	1	4	15	1148	110	0	1	CTCACACATTGTGTGTACTGTGTGTAACCTCACATA	]b`]ab``_TWJX^bYaY]`]^`Z[bbaa__`Zaa\	chr10.fa		3197609	R	36	30					
+HWUSI-EAS610	1	4	9	156	109	0	1	AGGCACACACAGTACACACAATGTGTGAGGTTAGAC	^_bb^[b[QX`\TVVa`][VM[Z\[NPX]\K[_BBB	chr10.fa		3197671	F	33C2	21					
+HWUSI-EAS610	1	4	59	1164	1526	0	1	TGTGTAACCTCACACATTGTGTGTACTGTGTGTGCC	\^T^Tb`aa]aa_aaXa_b][YaU]]a_\\ZaX`][	chr10.fa		3197672	R	36	31					
+HWUSI-EAS610	1	4	47	894	1459	0	1	GCACACACAGTGCACACAATGTGTGAGGTTACACAC	`ZOX_a^WQ^TLXV[Q\]X^XSa]_`_aVSTFWV]_	chr10.fa		3197673	F	11A24	25					
+HWUSI-EAS610	1	4	8	218	1427	0	1	GCTTCCTGCAGCCACACATGCCATCCATCTTCTCCC	aaaXab\a]bZabaaZ`^Ua^aa]a]V[_Za``_^a	chr10.fa		3197758	R	36	119					
+HWUSI-EAS610	1	4	38	782	1535	0	1	AATAACTCTCTACTACAAGGAAATGCTCCAAACTGA	a``]T^\S_aa\^J`a[b^YTbZ]a_a]][[a[[][	chr10.fa		3197870	R	36	118					
+HWUSI-EAS610	1	4	52	149	1048	0	1	CCTGGAGATGTCTTCTAAGAGTCACGGGCCTTCACT	aaabbab_ab\aaaaaaaa_aU`___^_`__^^Z^_	chr10.fa		3198101	F	14T21	81					
+HWUSI-EAS610	1	4	53	122	1143	0	1	GGGCTGTGGGAGGAAGGCTTTATTTACAAAGTCATA	a`_a`a]aa^^a_Z_\]_]^\[a_____\_^W]_^]	chr10.fa		3198710	F	36	119					
+HWUSI-EAS610	1	4	18	778	458	0	1	TGGTTATATGTATGACTTTGTAAATAAAGCCTTCCT	aaa^bba_a`ZbYa^`aaaa^a^``aa_a`_a___a	chr10.fa		3198720	R	36	119					
+HWUSI-EAS610	1	4	81	596	84	0	1	TTAAAACTCCTCGTATTTTGCTTGAGTGTGGCTCAG	abaaaaa`^`aa`V\``aaa]][___^_Y[[^W]]`	chr10.fa		3198888	R	36	119					
+HWUSI-EAS610	1	4	42	951	724	0	1	CAGTCTTTGAGGTAGACACTCCTCAAAGTTTTAAAA	aba^ababa^_a\_a_\a`a`_a]]_^a[aa``aa^	chr10.fa		3198918	R	36	119					
+HWUSI-EAS610	1	4	91	1301	1315	0	1	GAATGCACTCAATTGGGAATCTAAATATCTTGCTTT	aaV`a_]_a_``baaaa^aa`a]^^_^a^aa^^__b	chr10.fa		3199000	F	36	119					
+HWUSI-EAS610	1	4	39	404	1147	0	1	AGGCTCTGGTGAAACAGGCGCCTGTCACTGAAGAGG	\bbbbbaaa`aaabbbbbabaaabaaaaaba`aaab	chr10.fa		3199840	R	36	119					
+HWUSI-EAS610	1	4	88	286	375	0	1	GCAGCAGAGGGCACCCCTCTTCACTACTGCAGGAAG	`X^`ZS\WU]_^\\Z_TX`\XQPY[TWIMYT]\PP[	chr10.fa		3199983	R	36	117					
+HWUSI-EAS610	1	4	45	1353	793	0	1	TGTGCACTTCCAAGGCTGCTTCTGTAGTCAACACCA	aaY]a`a]VY_a_ZU`^YYa_[]PUU_GT\[WYZ^^	chr10.fa		3200051	F	36	118					
+HWUSI-EAS610	1	4	60	608	1016	0	1	AGAAGAAGGAAACAAAGGCAGGAAGGGGTTGTGACC	abY`b]aaa_`a_a`Saa_[aaWZaa`_Z__\`\^_	chr10.fa		3200139	F	36	119					
+HWUSI-EAS610	1	4	65	140	1181	0	1	TCAGGAATGGTGCAGCCTTTATAGCCTGCCTGCTCA	`babbbbb`aQbb`_bb`aaZbZabbabbaaaa`aa	chr10.fa		3200441	R	36	119					
+HWUSI-EAS610	1	4	84	552	1191	0	1	CTATAAAGGCTGCACCATTCCTGAGGTGGCAGGCTG	``]`bbb``aabaabb^_aa\aa_]`^]a^\a]aa`	chr10.fa		3200453	F	36	119					
+HWUSI-EAS610	1	4	81	588	175	0	1	TGGTGGCCCTGACTGCTGATCCAGGTGACCCAGGGC	__^Q^_ZX[]ZTZ^\[\^Z`P\RR]TZXZXSF[TRW	chr10.fa		3200535	F	36	117					
+HWUSI-EAS610	1	4	3	1615	1119	0	1	TTTCTACCAAGAGCAAGATGGCTTCCCACACCCATT	ab`aaa^[P\V]_VN^G[QZXRN]\MSOFNP]SMR^	chr10.fa		3200708	R	36	115					
+HWUSI-EAS610	1	4	69	1410	862	0	1	GTACGAGGACTCACTCACAACTTTCTACCAAGAGCA	aabaa``bY_aaaaaababbaabbaaaa`aaa`a`a	chr10.fa		3200729	R	36	119					
+HWUSI-EAS610	1	4	13	116	698	0	1	CAACTGGCTCAAGTGAGAACCGCAAACTGTCAGGCC	`W_ZZX^[W_^aaH[]R_V`\]^]^^ZXWP`^\\Z\	chr10.fa		3200770	R	4A31	87					
+HWUSI-EAS610	1	4	7	272	234	0	1	ACAGTCTCTCTGGAAGAGAACGGCTTTCCTTAGGGC	``]ZXWW_`\TMQFLNWUK^YRPXHY_YYSSSOU\V	chr10.fa		3201545	R	36	115					
+HWUSI-EAS610	1	4	64	74	2039	0	1	CTCTTCCAGAGAGACTGGTTAGCTGTTAAGGGCCCC	aa`SQb`^`\_]JQ^WOSSHUVSEWSVTVUUPYBBB	chr10.fa		3201563	F	17T15A2	76					
+HWUSI-EAS610	1	4	78	252	782	0	1	TCTCTAAGGGCACCAGGGCACCTGGGGGACACAGGC	_`_`]ZX_aa`_a_\\[a`aa\^aaa\UJ]R]SV`X	chr10.fa		3201675	F	36	118					
+HWUSI-EAS610	1	4	44	578	655	0	1	AAAGTAACCAAGAAGAAACTGGCTTCTCAGATCTCC	^b\a`babb^`^bab\[_abbbaaaW`aa_b[[^_a	chr10.fa		3201786	F	36	119					
+HWUSI-EAS610	1	4	40	983	1236	0	1	CAGGGTTAGTTGATTATAGGAGTCACCACTGTCCAC	`]a__]a\a^a_Y`ab`a`a_a\^`\[`[^a^^^_Y	chr10.fa		3201927	R	36	119					
+HWUSI-EAS610	1	4	50	611	36	0	1	CAGCCCTTAAAAGACGAAAAAGTTTAACAAAACAAG	aP^`_a^b`T_X_L]a_aaaa]Y]S^`_]SY`^a_^	chr10.fa		3202115	R	34TT	48					
+HWUSI-EAS610	1	4	7	1193	940	0	1	TACACACTGACTCTAGGAACATGCACCTCAGGGGTG	ab^TX_b__ZS_\ab[[]\`aTW_I\P]aX\`_]N`	chr10.fa		3202441	R	36	118					
+HWUSI-EAS610	1	4	61	1370	176	0	1	GGGTGAGCTCCATCAGTTAGAAGACACCAGAGCCTT	`a`NaZ\YX\Y__XP[_aa`\`_`___Q^P\V[V_V	chr10.fa		3202531	F	36	118					
+HWUSI-EAS610	1	4	98	415	134	0	1	TGGAGGATAAAGTTTTAAATGTGGTAAGTCTTTTTT	abb`baa`a`abW`a__a^abWa`Za`_]\_``_`_	chr10.fa		3203558	F	36	119					
+HWUSI-EAS610	1	4	15	53	638	0	1	CGCGCTTCACTGCAGAAGTAGTTCAAGTAAAAAGAA	a_aba_aa`a]aa`a[aaWQ^TXaa]aYa__`_`Y_	chr10.fa		3203909	F	36	119					
+HWUSI-EAS610	1	4	59	346	1991	0	1	AAACCCTCCTCCTGTTTGGTTAAGGAATTTGGCAAT	`\U_^bX^[UW^U`W\[H\XZZ^[_^YSVSU\\^ZB	chr10.fa		3204065	F	36	113					
+HWUSI-EAS610	1	4	55	1754	641	0	1	ACAAAGACCACCGGAAGAGTGCCCGGATTCTAACAA	abaaaa_[`a^_KN^X^a]ZZVU_VPY\`V^_a\a`	chr10.fa		3204262	R	31T4	82					
+HWUSI-EAS610	1	4	23	1243	1420	0	1	AAGCCACAGATGGAAGGAGAAGACTTTAAAACCACC	aZYXaa`Sa`]`a`Y_[PaZaa__aa__Y[_QXaQZ	chr10.fa		3204776	F	36	118					
+HWUSI-EAS610	1	4	24	318	943	0	1	CACGAAATGTGTGCATTTGTGATTAGGGAGTCCCAG	aaab``a`a_bP`a`a`b]Na^^[[^a]aXQaaaaY	chr10.fa		3204842	F	36	118					
+HWUSI-EAS610	1	4	45	912	691	0	1	TTCCAGCTGGTTGATAGTCTAGAGAAAGCAGAGCCA	abaaa`_aaa_aa_``a]`a`a_`___a_a_^P[]_	chr10.fa		3205345	F	36	119					
+HWUSI-EAS610	1	4	21	510	817	0	1	TAGAGAAAGCAGAGCCATAAAGACAGTGGAAAGACA	abYJURaTUU[a\a_baZ\S``_aabG^JZ`UQ_XB	chr10.fa		3205364	F	36	112					
+HWUSI-EAS610	1	4	97	1580	551	0	1	GGTGCATGTTCTAAATGTTTTGACAAACATCTAATG	aa_aaaa[_aabbaaa``abaaaaaaa_aaaaa_a`	chr10.fa		3205516	R	36	119					
+HWUSI-EAS610	1	4	61	1011	1386	0	1	GAGATTACACGTGAGGTGCCTTGCTCTACAAATGAG	[UYaaaa\^^`_aaa`UX\\a`aW_]`a[`^]PQQ[	chr10.fa		3206024	F	36	118					
+HWUSI-EAS610	1	4	89	1340	1674	0	1	CATTGTTTTGTCACAGATGCCATTTAAAACCTTGAC	^bYabbbbYY]KRO_bbb_a`aa_a^a^Ya_La_bb	chr10.fa		3206103	R	36	118					
+HWUSI-EAS610	1	4	35	475	208	0	1	CACTCAGCAGGCCTACCTATGAGAAAGCCTACTGTA	abaaaaa`^aa_a_a`aaaaa_a`\]___a`]aa_`	chr10.fa		3206766	R	36	119					
+HWUSI-EAS610	1	4	57	1181	1060	0	1	ACACTCAGCCACCTGGCATCAAAGTCCAGAGTCATT	\ababb]baZbRQa]]X^a]_a^GUVa_H`a___[`	chr10.fa		3206802	R	36	117					
+HWUSI-EAS610	1	4	52	1562	1381	0	1	AAGCAGAGTGACCGATGTATACATTGTAGCAGGGAA	aaa_aaaaVXa````_aX`aaa^___]__^``\_`_	chr10.fa		3206907	F	36	119					
+HWUSI-EAS610	1	4	49	1575	1893	0	1	CATTGTAGCAGGGAATTTTAAGCCAGTCACTTAAAC	WTa\a`ba_a_Q\JZb_aaZ\XN[T]G]G\URUZBB	chr10.fa		3206928	F	22G5T7	78					
+HWUSI-EAS610	1	4	17	1426	819	0	1	TACAGATCGAAGGCCTTGGGAAGAATGGTGGGGACA	a`_`X[__S_]X__U___^USU_aW\\\QQ^\VNWU	chr10.fa		3207220	F	36	118					
+HWUSI-EAS610	1	4	19	15	991	0	1	AGCAGATTCAGCATAGATGTCGAGTAAAACTACTGT	S[Z_`YVbbbb``b_baba_ab]]O[__T`W`^`b_	chr10.fa		3207276	F	36	119					
+HWUSI-EAS610	1	4	13	1745	780	0	1	TTTAGGCAAACTTGGACAATACCGTGGACAATTCTC	aa`^_^_``a_^_]Z^\_]]_]]XROTYZ__\XXXW	chr10.fa		3207407	R	36	119					
+HWUSI-EAS610	1	4	95	566	73	0	1	GTTACGGAAGCCTACACAGGCGCACAATGTTAAGTG	aaaa^a`[`]U\^]__^Z__^`\WWWYY]WWU\WN_	chr10.fa		3208017	F	36	118					
+HWUSI-EAS610	1	4	28	691	1214	0	1	CATGTCTCGCGGCAGCTCGCCGTGAAAGCTGGAGTA	``a```\Z\W^`\_a]`aZ```Y`OT]`\XaXX`UQ	chr10.fa		3208063	F	8A27	86					
+HWUSI-EAS610	1	4	63	393	1976	0	1	GAAAGCTGGAGTAGAGTTCCCATGTCGGTGCTTCTC	`TVXXa]`W`^Ra``[FUbaa]Z]Z^Y`S^^URWBB	chr10.fa		3208086	F	36	109					
+HWUSI-EAS610	1	4	73	237	1131	0	1	CTTGATGTACATGCCCTAGGGAGAAGCACCGACATG	a_a_^_aQYTZ_]`a_V^^RNS_U^^WX`U^\\UBB	chr10.fa		3208106	R	36	110					
+HWUSI-EAS610	1	4	71	1674	326	0	1	TTACATTTTCTGTGGTTCCAGTAATCACATGCAGTC	aaaaaaaa``ZUZWW[_aa_KWa__`a^`VG\^RX`	chr10.fa		3208155	R	36	117					
+HWUSI-EAS610	1	4	80	1095	1443	0	1	AGCTCTGTCAAAGGTGTCTAAGCACACAGGGCTTGT	a_[aaaU[]aa_aaUa`abaaa`a[aVZ__`\`a_T	chr10.fa		3208210	R	36	119					
+HWUSI-EAS610	1	4	1	893	1657	0	1	AGACACCTTTGACAGAGCTCTGAGCTTTGGGGTTAA	_aa_aaababaa``aa`aaa\]_]_a^a]`aaT`^\	chr10.fa		3208227	F	36	119					
+HWUSI-EAS610	1	4	12	1748	737	0	1	TTCACTCTTGTGCTAATTATTCCTCTTGCACCATAG	Z_``VY`^]UWW]Z_W\Z_aZT[_]_XXTXTVYa[`	chr10.fa		3208494	F	36	119					
+HWUSI-EAS610	1	4	68	1380	965	0	1	CACCTTATGCCTTGAGAGCAGATGTTTCCTTGAGCC	a`babbbaaaaaaa`aaba`baaa^aa__aa`__`a	chr10.fa		3208739	F	36	119					
+HWUSI-EAS610	1	4	29	299	704	0	1	CCTCTTTCTGCCTCCATAGCTCTAGGGTTATAGGAG	^\babbbababaabbbabaababbaaaa`aabbbbb	chr10.fa		3208817	F	36	119					
+HWUSI-EAS610	1	4	6	1648	859	0	1	CAAAGTGCTTGCTATGCACACCTGAGACCTAACTTC	aabb]_]aa]P^aabba_`aX_TL[a`UXaaa_aaX	chr10.fa		3208896	R	36	118					
+HWUSI-EAS610	1	4	9	786	84	0	1	GGGGGGGGGGTTTACTGACAAATTTCTCCTTGATCA	[`bba]XHYTOHPRRLSBBBBBBBBBBBBBBBBBBB	chr10.fa		3209120	R	36	34					
+HWUSI-EAS610	1	4	65	949	65	0	1	GGGAGAGTCTGGAACTGCCAAGGTCTGGTCAAGCTG	aa``a^`[\_]^Y^^`a[\_^a`U[^]YS[]^\U\\	chr10.fa		3209205	R	36	119					
+HWUSI-EAS610	1	4	67	1173	469	0	1	CAGACCTATGGTTTCTTTGCATATAGGCTGCTCTGG	abb`_Z\abV_``aU_abb_ZZabX[XU\HWJR^]]	chr10.fa		3209539	F	36	117					
+HWUSI-EAS610	1	4	83	1736	1597	0	1	GCTCAGGGTGCTCTACAGTGATCCATGGGTAGCTCC	aaWNZ`^RXH]]^aV`___aV]]U`^\]TDRV\_\]	chr10.fa		3209807	F	36	115					
+HWUSI-EAS610	1	4	84	1509	2006	0	1	CACCACTGCTCACCTTTATCCAAAGCCTCTAAGGGA	a`bab`aaa__a`]aaaa^_aa[_a_[W__a]__Q]	chr10.fa		3209882	R	36	119					
+HWUSI-EAS610	1	4	51	817	754	0	1	GACACCAACCNAGAGCCTCTTCCTCTTCAGTTGCTT	abaa_`bbaYD[aa_aa`aba_aa\a__`a`aa_ab	chr10.fa		3210119	R	10C25	110					
+HWUSI-EAS610	1	4	5	536	376	0	1	TATGTTGCCATAAGAACAGGCAAAGCCTCCCCCAAG	aabbWVVZ`a^`]a]a^aa]``a`_^^Z[[\^UYU\	chr10.fa		3210184	R	36	119					
+HWUSI-EAS610	1	4	63	1128	1390	0	1	AGCCAAAGACAGCATTTCTGCAGTTTAACACCGCCT	aa`__a`a_`a]X_``a_aa]aa]aaa_^a_]`_\a	chr10.fa		3210273	F	36	119					
+HWUSI-EAS610	1	4	70	571	2019	0	1	CGCCTGCTAATTTCTTGTTGAGCCTGTCGCAGCAGC	`bbbaaa`__]aaba`a^aWJ[aab]Ya``a]V^^a	chr10.fa		3210304	F	36	118					
+HWUSI-EAS610	1	4	12	1035	547	0	1	ATATGCACATGAACATACACATCCTATACACACACA	aa_`^a`^a`\`a`aaaaaa`a`]_a`_]`]a^a_`	chr10.fa		3210842	R	36	119					
+HWUSI-EAS610	1	4	42	504	339	0	1	TGAATGCTGACGGGGAGATGTATAAGGCTTCCCGGC	\_^X\W_]^`TZ\_UO__]\TR^_UTIR_ZT^W^RB	chr10.fa		3211087	F	27T8	91					
+HWUSI-EAS610	1	4	95	660	807	0	1	GGAAATAAAGCTTCCTCAAGATAAAATAAAAACTAT	`^bbbbbXbM`bX[`a^b^a\bb_Mab`abYa__aa	chr10.fa		3211304	R	36	118					
+HWUSI-EAS610	1	4	42	1759	1536	0	1	TGTAGAGATGGATCAGCCATTAAGAGCATTACCTGC	aa^`[W_]_ZW\Z_`^`^]_``_Q\YUW]W_QUY\Y	chr10.fa		3211674	R	36	119					
+HWUSI-EAS610	1	4	40	524	1719	0	1	TACAATGTGTACCCTGTATTTCCACTGTTTGAAGCA	aab]_aba\aVbaabbR\abaa`baab_aaaaaab]	chr10.fa		3211728	F	36	119					
+HWUSI-EAS610	1	4	54	1788	158	0	1	TCAGTTCAGTTCCCCCATCTCACCATGGCACAGGTG	aa_Z\_`_XZ^_`^a^a`]^a`^^^TQLY_[]SSTX	chr10.fa		3212229	F	36	118					
+HWUSI-EAS610	1	4	30	1738	1769	0	1	TTCTGTGCCTTTTCCTGGGGAGTGTTCGCTTGTCCC	YFaaT_a`S`aa_Za`Q\RbWaS`_R_aGa_]X\`_	chr10.fa		3212305	F	28T7	105					
+HWUSI-EAS610	1	4	88	717	733	0	1	GACTTGGATGGTTGGCCACGGATGCCCTACCTGGGA	^``a^^``a``Za`_a_a``a_````_`Z^_^_QaR	chr10.fa		3212337	R	36	119					
+HWUSI-EAS610	1	4	60	347	417	0	1	GTAGGGCATCCGTGGCCAACCATCCAAGTCTAGCTG	a^X`]a]^^a``^\Y`_``_^Y^``^^^U\^Y[^U[	chr10.fa		3212343	F	36	119					
+HWUSI-EAS610	1	4	30	1615	928	0	1	GTCACCAAAAAGCCCACCCCAGCACGAGTGACAACT	aYXZ[Ua`a^PIV^QWSTY^Y^^[TSQ]GYXBBBBB	chr10.fa		3212433	F	6G29	57					
+HWUSI-EAS610	1	4	94	1766	1540	0	1	CAGCTTTGGTGAGNTGTCACTCGTGATGGGGTGGGC	__aaa_a\QZaaPDY_N_Z^`]QU_F`[`WSGK\S\	chr10.fa		3212444	R	13T11C10	97					
+HWUSI-EAS610	1	4	14	282	322	0	1	AGCATCCCGGTCATGACTGGCAAGCAGTTTCATCCG	a`bbabbbaaZaZbbaa`a`a]aaa\^\a`aa^_^a	chr10.fa		3212487	F	36	119					
+HWUSI-EAS610	1	4	60	1473	78	0	1	CAAGCAGTTTCATCCGTCCTGTCAGTGTCTCTTCTC	`ba^aa_]_``aa`_Z^]`a^]\__V\^``[\YLY[	chr10.fa		3212507	F	21G14	85					
+HWUSI-EAS610	1	4	64	624	1241	0	1	GTGATAGCAGTTGTCACTGAGTGCAGCACACACAGC	a^a]ab[aaa`aa[aaaaa[]^``a__a^X]`\\`_	chr10.fa		3212695	F	36	119					
+HWUSI-EAS610	1	4	36	289	78	0	1	ACCTTTTAAAGACGAGGTCTCACTTTGTAGCCCTGG	abTVaa^a``a`a_a^_UaY_a`_]Z_R[_a^`UU\	chr10.fa		3213143	R	36	119					
+HWUSI-EAS610	1	4	80	1351	943	0	1	CAGGCAGCTCTATAAATGAACTGTGGTCTAAGATTT	aaYMU]a^Zab^aZ_a`Ua``^aU_YO^`\S`\_X^	chr10.fa		3213183	R	36	118					
+HWUSI-EAS610	1	4	11	436	1819	0	1	ATGCATATAACTGTTTTTCTGCATGTGTGTCAGCTC	\^bbaaabb__`b_aaaabbaaaaaaaaa_abaaYa	chr10.fa		3213603	R	36	119					
+HWUSI-EAS610	1	4	11	1755	265	0	1	AAAAATTAAAATACAGAAAAAATAAAACTGCTAAGA	a^aba_aaa^a`aaa\\_aa_a^_`_a[^]]^``WZ	chr10.fa		3213766	R	36	119					
+HWUSI-EAS610	1	4	82	1120	739	0	1	ATGTTTGCTTAGGGCTGTTCTCTACAGAAGGGATGG	`_b[aa[ab_babaaabbVaab`^aN`bbb_`_NXb	chr10.fa		3214638	F	36	119					
+HWUSI-EAS610	1	4	14	1268	357	0	1	GGGCTGTTCTCTACAGAAGGGATGGCCCGGGGCTTT	I\SITaTaRU^aa`H_PQSaXQU__]WOH^XKZ`aX	chr10.fa		3214649	F	28T7	103					
+HWUSI-EAS610	1	4	7	489	1141	0	1	AACACAGATAGGAATATAAAACTAGGTGTTGACCTG	J\bbbabb`\abaXb^\abaaaa``aWbb_abaaX`	chr10.fa		3214839	R	36	118					
+HWUSI-EAS610	1	4	33	444	1740	0	1	AGACCTAAGAGACACCATGTAGGAGGTAGCTGTGCA	YaV_aaabba`]`ba`[aaX^`a^aaXW\```Waa_	chr10.fa		3215167	F	36	119					
+HWUSI-EAS610	1	4	1	25	201	0	1	ACATGCACAGCTACCTCCTACATGGTGTCTCTTAGG	a]^\aaa`aaY\aa__``__`__aaN`_`__\]_Y^	chr10.fa		3215170	R	36	119					
+HWUSI-EAS610	1	4	28	1597	1909	0	1	TGTAGGAGGTAGCTGTGCATGTGTAGATGTGAGGCG	ab_aba_aaR^___\^a__a`Z\YYZXZZR^Z\^S_	chr10.fa		3215184	F	36	119					
+HWUSI-EAS610	1	4	51	580	2021	0	1	TGACCCCAAGGTTCTGGATTTTGACCCTGAGCTTTC	U`[aM_a]X_[PW_]`a_SV`]``]]SIZD[XZSXX	chr10.fa		3216044	F	11A17T6	88					
+HWUSI-EAS610	1	4	76	428	1692	0	1	TGTGCCTTTGTATCCCTTCTGAATGTTGCTGTCCCT	`[P\__\__^Y^]^`\_QZ]`W_Z][Y]S[`VRGY`	chr10.fa		3216178	F	33A2	107					
+HWUSI-EAS610	1	4	24	167	201	0	1	GGACCCGACTGGACCTTTCCTAGCTGGAGCTGGGTG	a`__aaaa\Z`]Z\`Z[\]]\ZX^UUZPX`T]`FZZ	chr10.fa		3216360	F	33T2	108					
+HWUSI-EAS610	1	4	69	677	314	0	1	GTGAGCGTGGGTGAACTCAGCATCTGCTTGTACTCT	aZa`a_a__a_Q``aV```_a________`^]\_^]	chr10.fa		3217268	F	36	119					
+HWUSI-EAS610	1	4	25	1559	766	0	1	CTGCAACGAGAGAGCCACACACAGAGTGAAAAAGCA	a`bbbbaab`bb_`aababaabab`^`baaaba`X`	chr10.fa		3217358	R	36	119					
+HWUSI-EAS610	1	4	5	164	687	0	1	GGGACTGGGTGGTGGTGGGCGGGGGTGAGGTCTGCA	_a\YK_a\QFa_]^aZ`XW[[HGYYEY^K`PHXW[B	chr10.fa		3217389	R	36	108					
+HWUSI-EAS610	1	4	100	871	1050	0	1	TATGCTTTTGGGGCCTTGGATGGCACTGCCTAGGGG	`Z`[`aa`[`\YW\K^aa_P\aa^`Y_a][aY\^Y_	chr10.fa		3217692	F	36	118					
+HWUSI-EAS610	1	4	83	66	113	0	1	AGCCCCCTAGGCAGTGCCATCCAAGGCCCCAAAAGC	Z_aaaaaU_U``\TG[`aWT`_V_a`aX``UTWO]Y	chr10.fa		3217695	R	36	117					
+HWUSI-EAS610	1	4	20	1384	1257	0	1	TGAGAAAACTAGCCCCCTAGGCAGTGCCATCCTAGG	aa\Za]PVTUa`aZaSPZQVW^YVTM^GZ^GSUY`U	chr10.fa		3217705	R	32A3	90					
+HWUSI-EAS610	1	4	27	418	987	0	1	TTGTGTGTGCACATGTGTTTATCTTTCTTGGTAAAA	a`a]b[^`a^`[`\^]b``a[a`a\`_aaaaU\_a\	chr10.fa		3217814	R	36	119					
+HWUSI-EAS610	1	4	95	507	1151	0	1	AGCCCATGAGTTAGCCTGGAGCACACACCTCAATCA	aabb]aaa\aXaaaaa`aaZ`]aaa_``_``a`a_^	chr10.fa		3218223	R	36	119					
+HWUSI-EAS610	1	4	30	1230	1207	0	1	GATTGAGGTGTGTGCTCCAGGCTAACTCATGGGCTC	a`bb_]`babababbbabbb[ab`_]]abb``_a`_	chr10.fa		3218224	F	36	119					
+HWUSI-EAS610	1	4	33	1744	1849	0	1	GAGCAGGAACAAATGAGCAGGCACATTCACTACGAC	aaaUV^a_\Z^X^Z]W\RVaaR\P^_YF\P[XR]^W	chr10.fa		3218458	R	36	117					
+HWUSI-EAS610	1	4	17	862	1252	0	1	CAGCTGCTCTGTCCCCAGGCAAGAACACAAGATAGC	a_a`\_\Zaaa\]]]_aa_]_aa`a]a^[a```[`[	chr10.fa		3218506	R	36	119					
+HWUSI-EAS610	1	4	96	1575	999	0	1	GGGGACAGAGCAGCTGCCCGTGGTTTCCGCCCACGT	`a^^[I__a\T\MV`[`]XXV]IX^]`FNN]VYSTX	chr10.fa		3218526	F	29T6	97					
+HWUSI-EAS610	1	4	50	1490	1517	0	1	TGAAGGTGTTCACTGGTGGCCTACAACCACTTGTCT	``aaa_G^aa[\bab`Xabaaaaa`^^Q__a``YY_	chr10.fa		3218864	R	36	118					
+HWUSI-EAS610	1	4	57	1580	1882	0	1	TGCTACCCACATGCCCTCAGCTTCTCAGGATCTGTC	ab`ba^U`a^\Y[]]`aSH`Xa^]^^YUQ\]UZS\Q	chr10.fa		3218995	R	36	118					
+HWUSI-EAS610	1	4	46	1380	718	0	1	GGGATGGCCTTCACAGACGTCATTGCCCTCCTTATT	`bbaaa`_aaa_a_a`a_a`_`a_[`__`__`a_``	chr10.fa		3219041	F	36	119					
+HWUSI-EAS610	1	4	39	1238	1851	0	1	CAGGGAGTTTACAGAGCAGCTCTCTTGCTGAAGAGT	abaaa_b\baa`aa_aaab`aVb_a^U[a]__`_a[	chr10.fa		3219640	R	36	119					
+HWUSI-EAS610	1	4	7	173	782	0	1	CGAATACCCGGGCAGCTGATCGGAATCTGCAATGGT	ab`TZb`abbZ^baa_YV[Za]_ZUVXN\aa`[abB	chr10.fa		3219819	R	36	114					
+HWUSI-EAS610	1	4	95	1619	691	0	1	TNTACAGCCATAGCCACTTAAATAGAAGTGAAAGCA	^DYaa]HRPRXPOPVaaab`Ya\NNWNVSa`T^_R\	chr10.fa		3220234	R	1A34	108					
+HWUSI-EAS610	1	4	69	256	218	0	1	CTACTAACACCATTCAGCCGTTTGCGTTTGCTTAGA	abaabbbbbaa`ba`]aaa`[`^^aaY`a_aaaa^[	chr10.fa		3220457	R	36	119					
+HWUSI-EAS610	1	4	85	1474	537	0	1	TGGGCACAGTTGTATGTGCCTTTAATCCCAGGGCAG	ab]^aa]``\Z]ZZXW[VY`aa`]]ZV\YXRLT^Y`	chr10.fa		3220876	F	36	118					
+HWUSI-EAS610	1	4	32	1789	1528	0	1	CTGGACAGGTTTACATTGCGAGACCTTGTCTCAAAA	abb_baZX[[aa_X\aa\a_aaa^_a`a`____a``	chr10.fa		3220961	F	36	119					
+HWUSI-EAS610	1	4	22	1079	967	0	1	CAGACAGGGTCTGATTCCCGACACTGGGTGGGTGGA	aaa`a`aaaQa``aaa`aX``a_aaaa`Taa\Saa_	chr10.fa		3221026	F	36	119					
+HWUSI-EAS610	1	4	43	891	1469	0	1	CAGACAGGGTCTGATTCCCGACACTGGGTGGGTGGA	`^``````_``aa``a^a``a^`\aa``\\_a]`_`	chr10.fa		3221026	F	36	119					
+HWUSI-EAS610	1	4	73	1642	1318	0	1	GTCCACACTGCTTTAGTAATGTTGAAACAAGACGGG	Y``_b[YG_[]]\VUaV\^`_a`O``]HX\Q]Y\]B	chr10.fa		3221065	F	36	112					
+HWUSI-EAS610	1	4	76	849	1489	0	1	GGTTAAAACCAGAGTTTATATATCCACAGGGCATGG	aaabb_aa`aabaa`aaaaaaa__`_`__`aZ__``	chr10.fa		3221518	R	36	119					
+HWUSI-EAS610	1	4	86	843	40	0	1	TGTATTCATCTACTTACAAAACTGGCAAATCCATGG	a]_[a```aaaa_aaa]a`Y]_]a_aa_]^ZY_Y^`	chr10.fa		3221682	R	36	119					
+HWUSI-EAS610	1	4	16	343	741	0	1	TTCAACTGGATGATGCTGGCTCTATCAACCACTGTA	^_X`aaaa`YWaa`_`_aa__W_aZ_\a[a_]^aVS	chr10.fa		3222410	R	36	119					
+HWUSI-EAS610	1	4	21	598	792	0	1	TGGGAAATGAAAAATCAGTTTTCTTCAACTGGATGA	`baba]]_abab_bab`b^aababaa_`_aba^ab_	chr10.fa		3222433	R	36	119					
+HWUSI-EAS610	1	4	34	1533	1837	0	1	GAGGGATGGAGGACACCAAGAAAGCAACGTGCTCTA	a[baa\`a___a\\aZTZ``WZ\_W^^W_\\WWW_\	chr10.fa		3223325	R	36	119					
+HWUSI-EAS610	1	4	19	750	1214	0	1	TAGTCAGTGCCTGGTTGTGGATCTCTATACTTCTTC	aba_`ab^aaaaaa`a`_ba]a`a^aa_a_aa_a``	chr10.fa		3223476	F	36	119					
+HWUSI-EAS610	1	4	47	885	821	0	1	TAGTCAGTGCCTGGTTGTGGATCTCTATACTTCTTC	aaaa_`b_aa`aab_aa^a``_^a^`a`^W`^Vaaa	chr10.fa		3223476	F	36	119					
+HWUSI-EAS610	1	4	50	1172	1902	0	1	CACACTGCCTTGTTCAACCATTATCAGGAAAGCCTC	abaaabbbaabab`baaab`bbba_aba`aa`^```	chr10.fa		3223527	R	36	119					
+HWUSI-EAS610	1	4	75	872	1999	0	1	TTCTGCACACTGCCTTGTTCAACCATTATCAGGAAA	`aaa]a`^aa_`_aa`aO_a\S]_`_`_`__``^_[	chr10.fa		3223532	R	36	119					
+HWUSI-EAS610	1	4	92	1218	1707	0	1	GATAGAAACACATTTTTTTCCATCTTTGGTTTATTA	`_PU`\b`_b_]\```^aZ`QXaaaaab[Ya`Ra\Q	chr10.fa		3223593	F	36	118					
+HWUSI-EAS610	1	4	52	1549	1071	0	1	TGACAAGAGGTCATTTGGGGTAAGCTTTGGAAGGGT	_aa]aXNNSYW__a]`V^a\DX\__\YT_WZ_[TXU	chr10.fa		3223934	R	36	116					
+HWUSI-EAS610	1	4	25	1136	756	0	1	GGACCCAGCTGACAAGAGGTCATTTGGGGTAAGCTT	aaaa]aaaa`aa`_aaRaa[`]aa`]```X`X^[`a	chr10.fa		3223943	R	36	119					
+HWUSI-EAS610	1	4	20	932	1092	0	1	ACTGCGCAATGTTCCCCAGGGGTTTGTGTTCTTAGT	a_aaa]aa`aa_aa[`a^abaaS_aa_a^_Yaa`_\	chr10.fa		3224035	R	36	119					
+HWUSI-EAS610	1	4	63	1242	1857	0	1	GTTAGCTTGCCTAGGATAACAGTTTCCTAGTACTCA	`Rb`a_UU`]_YZX_Y\``\^a]^]S^[_XMUZ^]]	chr10.fa		3224715	R	36	118					
+HWUSI-EAS610	1	4	83	958	311	0	1	CTTTGATGGGGAGGTCAGTGTACCTTGAGAACATCT	abbb`babbaaaaa[aaaaa`aaaaaa`aaa]aa`a	chr10.fa		3225284	F	36	119					
+HWUSI-EAS610	1	4	50	708	2010	0	1	TGTAGCTACAAACAGATGCTCATCTTTTTCAAGTCT	^``bbb^TVbbb```^`_`\Z`b___aa`T^``[T`	chr10.fa		3225396	F	36	119					
+HWUSI-EAS610	1	4	71	849	419	0	1	ACCCAGAAGAGAAAGAAGAGTTAAGACAGTACAGCA	a^Z[Y```^\_YV[[^]\`]`[`_ZZ\aa\a_``^a	chr10.fa		3225542	F	36	119					
+HWUSI-EAS610	1	4	89	134	1311	0	1	TGGAGACGTGTTGGCATTTCTCATCGAACCATCATA	``bY_H_b`b]bbbabba\aba_`bab]b`W`babZ	chr10.fa		3225766	F	36	118					
+HWUSI-EAS610	1	4	60	807	233	0	1	GTTGCGATCAGCGTTATGATGGTTCGATGAGAAATG	aaaaWF\`__a_a__`ab_aa_\a_][`_X`]]]`_	chr10.fa		3225780	R	T4C30	70					
+HWUSI-EAS610	1	4	84	1624	1805	0	1	ATATGACACAAAACAGAAACATTTCAATTATGTGTG	aaaa`a[`^``^a^`a``a^`_`_Y`X^_^]_Sa^_	chr10.fa		3227330	R	36	119					
+HWUSI-EAS610	1	4	89	432	1666	0	1	TGGGCACTTATATTAAAGACGGAAATAAATTCTTCC	Vbbaba`aaabb^``_[^Uaa[^W_bab\ba`abba	chr10.fa		3227440	F	36	119					
+HWUSI-EAS610	1	4	1	1427	1666	0	1	TGCTTTGACTCTCTGGTCTGGAAGATGGTTACAGTC	ab_aa]a[aa`a_\[]W``aa`_aN_a_]aa]__``	chr10.fa		3227992	F	36	119					
+HWUSI-EAS610	1	4	92	152	1792	0	1	GGGACTGTAACCATCTTCCAGACCAGAGAGTCAAAG	aaa`a`a_a]_`a_aZ```V^]`a`_U`X`Y`X]W_	chr10.fa		3227994	R	36	119					
+HWUSI-EAS610	1	4	85	899	1207	0	1	TGTCCGAAGCTCTGCACACCATTAAGCAATGGGACT	aaa]`baaa`a_aa_`aa_^_````a_a^^_\_^__	chr10.fa		3228024	R	36	119					
+HWUSI-EAS610	1	4	16	605	1322	0	1	TTCGGACAGCATGGTTAGTGGGATGGGCACTTTTCT	[MMUQP_]_V]\Z]US_b`^DS^b^a`^aa`]\^XT	chr10.fa		3228052	F	20T15	109					
+HWUSI-EAS610	1	4	61	1427	1273	0	1	GAGAAAAGTGCCCATCACACTAACCATGCTGTCCGA	[]_Z`aX]S_\__a]``_a]`^`M\[Y`QY`\X\`_	chr10.fa		3228053	R	36	118					
+HWUSI-EAS610	1	4	50	802	573	0	1	TGTCTCTTCTAAATTGAAGGAGCGTCCTAAGAATGG	aba`babb`babbabaaabaa````a_aa`a`aaba	chr10.fa		3228095	F	36	119					
+HWUSI-EAS610	1	4	89	839	1580	0	1	TTCTGGCTTCCTCTACAGCCTCCACAATGTCTCTTT	abbaaaaaa`aa`aaaaa_`aaaa_`[aa_]a``aa	chr10.fa		3228245	F	36	119					
+HWUSI-EAS610	1	4	55	554	1394	0	1	TTGGATCCCTCCGATCCCTGCAGGGGTGGTAACTCT	aba_aa``a]`a``Z[aaVHX]]WGZP[aT^UM\\_	chr10.fa		3228457	F	24T11	106					
+HWUSI-EAS610	1	4	34	464	576	0	1	CCTGCANGTGTGGTAACTCTACACCTCCTGCACTCC	aa`abWD\^a]ba^aaaaa`aaaaaaaV^`a^``aa	chr10.fa		3228473	F	6G29	110					
+HWUSI-EAS610	1	4	64	249	1353	0	1	CAGACCTGTGCGCACAGACACCGAGTTCCTTCCTTG	aaa\aaabYaaaaaaa]__a]`WPYY\_`^\`]YNT	chr10.fa		3228623	R	36	118					
+HWUSI-EAS610	1	4	18	248	1532	0	1	GGTGTCTGTGCGCACAGGTCTGCACATGCATGTGTG	\`a___[``\Z_bbbb__]b^^a^a\`a^^__]a\b	chr10.fa		3228637	F	36	119					
+HWUSI-EAS610	1	4	52	1195	1458	0	1	GAAGTTCCTGTGCGCACACATGCATGTGCAGACCTG	Z`_`]aZ_`a]]]__``]``]a\`Z`\]\XP[WT_a	chr10.fa		3228651	R	36	119					
+HWUSI-EAS610	1	4	50	628	780	0	1	GTGTTGGGGTAGGGTCAGGTTGCACAGGACTAGGAA	YN`JQ_W_b]U^`_aTW\\_b]QZZVMFW`aa]a_B	chr10.fa		3228695	R	3A18G13	76					
+HWUSI-EAS610	1	4	9	1448	703	0	1	AAAACAAACAACAACAACAACAACAAAAGTGTGTAT	abbbabaa`a_`aa_aaaaa`aaa^_W_TNW]a]_a	chr10.fa		3228736	R	36	31					
+HWUSI-EAS610	1	4	41	500	1761	0	1	ACCTGTAGAGTCCACTGTATGTTTGCCAACTACTCC	]_bab]PPNW`_`a_RZZZOUU^ba]]MMT]]GZ^`	chr10.fa		3229239	F	36	117					
+HWUSI-EAS610	1	4	76	1163	464	0	1	AGCCCAGAGAAGGTACAAGAATCAGAGACCCACTCA	aa``a``P`Ga_[UZVR[a]Z]_a__[`G\\SWT\_	chr10.fa		3229473	F	36	21					
+HWUSI-EAS610	1	4	14	612	1055	0	1	AGAGCAGACAGCAGGAAGAAGAGCCAGCCATTGGGC	^^bb`^__]^_bTaa\^b``bbU]a`b``^^aYDYa	chr10.fa		3229863	F	36	117					
+HWUSI-EAS610	1	4	21	1429	1014	0	1	GGGGTGGTGGTGGTTTGAAAGAAAATGGCTTCATAG	abbaZ[\Z]_[]a]_aa_a_]W^`_]\\__[]^]^V	chr10.fa		3229992	R	36	119					
+HWUSI-EAS610	1	4	64	66	1879	0	1	GGGGGTGGTGGTGGTTTGAAAGAAAATGGCTTCATA	a`_a`Ub`^a`X`aU_^WQFJ[MVQYW]^SWRXBBB	chr10.fa		3229993	R	36	104					
+HWUSI-EAS610	1	4	51	1734	76	0	1	TTTCCTAGATTATCTGTGAGCGACCATCTTAAAAGG	`bbaa[`X__a__`aWYQXaYXY_]YY_`_`_aXBB	chr10.fa		3230254	F	36	110					
+HWUSI-EAS610	1	4	98	1230	1739	0	1	CTCTCCTGTTACTTCTCTCTCTCCCTTACCCACCCC	Ubb_aa[Jb]abbbbZ]aaaabT_a_abJb[]XJXa	chr10.fa		3230460	R	7C28	103					
+HWUSI-EAS610	1	4	58	1157	289	0	1	GCCAAGCATATTTAAACCACCACACATAGAATGCCC	]R__]\YX]_a`a`_`^_a^^_]_V_^`__]\^\]^	chr10.fa		3230691	R	36	44					
+HWUSI-EAS610	1	4	88	357	414	0	1	TGGTGGTTTAAATATGCTTGGCACATGGGAAGTGCT	abb`bbbababb`babba_bbba`aabbbaaa_ba_	chr10.fa		3230705	F	36	50					
+HWUSI-EAS610	1	4	61	787	2000	0	1	TTAAGAACCTATAATACAAGTTAGAGAATCCATTTT	abaaaab`_baaaaaaa`abaa``_```a`__`aa`	chr10.fa		3230958	R	36	119					
+HWUSI-EAS610	1	4	15	668	43	0	1	AAAATCGAGAACTTTTCAGATAAGACGGTGGTGATT	a`bba_Z^ba_G]baaaab`a]]aa]^]Ya`X`[`a	chr10.fa		3230995	R	36	118					
+HWUSI-EAS610	1	4	34	249	506	0	1	TGGGTTTAGAAGTACTTTTAGAAGTAGGCTGATGCC	abba_aaa`^^^`aababa__^baX`a`a``_`aba	chr10.fa		3231055	F	36	119					
+HWUSI-EAS610	1	4	61	35	1104	0	1	CCACACGGCAGGCAGTCTGTTGGATATGCGGCATTA	ab_b]baa_P_a`W`U`^]EVaaXSYYY]a_YOVWB	chr10.fa		3231324	R	36	112					
+HWUSI-EAS610	1	4	11	1098	985	0	1	CAGAGAACCTCAAAGGATCTGATAGACTCCACACGG	a[`ab\a_V]aWJPSSLW_^^VGZ`ZR_WF[V_U]Z	chr10.fa		3231352	R	16T5A13	88					
+HWUSI-EAS610	1	4	37	388	22	0	1	CATGTGGTTTAGGTTTCCTGAGGTTCAGACTCAGGC	^[^a_[]]a`__^[aa_X`^^^`\[_^aa]`[`a``	chr10.fa		3231398	F	36	119					
+HWUSI-EAS610	1	4	63	1751	927	0	1	GAGTGAGGAAGGGCAGTAAGTCCTGATATCTCAGGT	__\Y_^VW\^P[X[^UY^`]]]XZV]`_]\_Z\VTB	chr10.fa		3231745	F	36	114					
+HWUSI-EAS610	1	4	59	1632	453	0	1	ACTTGAAGAAATGGAATGCAGCTCTTAAACAGAGCC	a`bbaaaZaab`Z]`aa`_a_a`aa`a`a``W^Z\`	chr10.fa		3232113	R	36	119					
+HWUSI-EAS610	1	4	41	498	1610	0	1	CAGCAGTGCTTATACATCTCAGCCTCTGGTAAATGA	aaZbbabbabbabaa`aaabaaabaaba`[abb\J\	chr10.fa		3232454	F	36	118					
+HWUSI-EAS610	1	4	72	757	1317	0	1	AGTGCTTATACATCTCAGCCTCTGGTAAATGAGGCA	abT`ba^ab_^`baa_bWa_`aaaaZW[V_a_^`aZ	chr10.fa		3232458	F	36	119					
+HWUSI-EAS610	1	4	30	1357	1855	0	1	CGACTCCTAAGCAGCCTCTGAGAATGGACAAGGGTA	GYXbbabbbbabbabab_bbaababbbbabbbbabb	chr10.fa		3232550	R	A35	107					
+HWUSI-EAS610	1	4	18	1347	287	0	1	ACTTAGGCTAAACCAAGCCCATGTTCAAACAGGACT	a\aQa]\]^`__X[^`^]V]_]^Z]Z^^^ZZXWXW^	chr10.fa		3232691	R	36	119					
+HWUSI-EAS610	1	4	7	1302	512	0	1	ATTGGAAATGGCAACTCCCTACAAATCAGTTTAATT	abaa_`a`_^][_a]`_^_a`[`a_`^X_Y^_^Y_`	chr10.fa		3233078	F	36	119					
+HWUSI-EAS610	1	4	2	528	102	0	1	GTGGAGATTAACAGAAGCAGATCTGGAGACCTGATA	a_ba_aa_aaa`a`_`a_a_^XXVBBBBBBBBBBBB	chr10.fa		3233424	R	36	67					
+HWUSI-EAS610	1	4	41	869	876	0	1	ACTAACCAGGGAAGGCACTGATGATGTTATGCTACA	`X_X\`V\_YZZKZOLS^_`O[Y_]UQZWXYQVUYY	chr10.fa		3233458	F	36	117					
+HWUSI-EAS610	1	4	10	861	1078	0	1	AAAGACATCAGCTAGTTCCTCCTTAAAGGTATTTGT	ab]aa`a`a]`a\_aaaa_``YV`K_`[]Z[b[abV	chr10.fa		3233769	R	36	118					
+HWUSI-EAS610	1	4	50	660	900	0	1	ACCCTGGGAGTCTTCCTTCCACTGAGCTCTGCACCT	aaa`^``a[[__a`_aa`aaaa``_][`^`^\^U\^	chr10.fa		3234717	F	36	119					
+HWUSI-EAS610	1	4	20	1397	742	0	1	GAGGGAAAGAGTGAAAGAGGGTGACTATTGTCACCA	a_abb`b`a`_XaabbaabaaRbaabaaaaa_``aa	chr10.fa		3235143	R	36	119					
+HWUSI-EAS610	1	4	79	958	595	0	1	TGTTAAAATCCTTCCCTACACCAGGGTAATAAAGAA	ab`bbaa_aa^_a_`aaa]_a`_aaa]`_``a`a_^	chr10.fa		3235799	R	36	119					
+HWUSI-EAS610	1	4	1	239	1460	0	1	GACACCGCTGAAGTTATCACAGAGAAAGGAGCTTCA	a^bba`baabaab\aa_aaa`aVaa_]ba`^a_a`a	chr10.fa		3235881	F	36	8					
+HWUSI-EAS610	1	4	70	1303	512	0	1	TCTCAACATTTATTTTCCAAGCTCCTACACATCTGA	`ZZXb^a`a`\b_aab\`ba^V[a^_\P[P`__Za_	chr10.fa		3236358	R	36	119					
+HWUSI-EAS610	1	4	60	1571	1291	0	1	GTGTTAAGGCTTGGCACCATGAAGAAAGCCTGAGAG	a`QH`NK[\XLU^_``T`]T`[PSQVYWIVTBBBBB	chr10.fa		3236874	F	32T3	9					
+HWUSI-EAS610	1	4	37	1298	1358	0	1	TTCAGCTGCCTGTACTCCACTGCTGTTCTTGGTGGT	ab`]``a_Z^a__aS____`_^^_]\_W^\`^VVYS	chr10.fa		3236978	R	36	51					
+HWUSI-EAS610	1	4	63	1392	201	0	1	ATCAAAAGCAAAAATTAAACTCCAACTATACAATGT	aZ[]\`WOV]___Y[\\\^W[YUU_]`^YMS\[XOT	chr10.fa		3237107	R	36	7					
+HWUSI-EAS610	1	4	8	915	1810	0	1	GGCTGAGCAAGCCAGGGTAAGCAAGCAGTAAGGAAC	abaaa_\abaa]Z^`aaTa^b^aa]`^^Sa`]_]_S	chr10.fa		3237578	F	36	48					
+HWUSI-EAS610	1	4	88	634	1054	0	1	TGACAGCATCTAGGCAGGCATGGTGCTGGAAAAGGA	abaa`_[W_a`]`a``aa````_Va_\X`]\^`_\T	chr10.fa		3238363	F	36	43					
+HWUSI-EAS610	1	4	57	1583	1417	0	1	ACATTTAAACACATGAGTCCATGGGGGCTACACCTG	aaaaaaaaa_``a````_`a`__UYX]]]_T[X_`_	chr10.fa		3238570	F	36	47					
+HWUSI-EAS610	1	4	28	114	740	0	1	GTCTGTGCAGCACATGTGTGCAGTACCTGTGGAGGC	a]baa`ab`_`\_^]a\]\aaa`Z]baVY\a^L\Za	chr10.fa		3238687	F	36	35					
+HWUSI-EAS610	1	4	14	943	1730	0	1	ACATGTGTGCAGTACCTGTGGAGGCCAGGAGAGGAC	a`a_bSa_b`_bWaa^_a\a_^aZ]`_``Z_TQa]\	chr10.fa		3238698	F	36	36					
+HWUSI-EAS610	1	4	45	368	387	0	1	CACTGCTAACGGCCAGATTCCTAGGGCAGTGCAATC	X`UbTT`]Z_T]X^F^b`QQZaT]]HIbb`T^Z\]B	chr10.fa		3238920	F	14T10A10	90					
+HWUSI-EAS610	1	4	48	945	400	0	1	TGTGAGTAGAGAGTACCCTTGCAGCTGCCTCTCTTA	``_aV_^^]_`Ya\\XP\aaa___]_`WZWWZW]_\	chr10.fa		3239081	R	36	119					
+HWUSI-EAS610	1	4	37	1664	1941	0	1	CACAACAGCATGTANGTCCATAAAAAATGGTNTTCA	abbbb`a`aaaa\[DXa``aaaa`aaa^]_RDXa__	chr10.fa		3239113	F	14T16C4	101					
+HWUSI-EAS610	1	4	25	1725	1107	0	1	AAGAGCGCACAACCCTGAAGACCATTTTTTATGGAC	a_b[_aaab``b^a`ba]]\aaa`aaaabaa_[]__	chr10.fa		3239128	R	36	119					
+HWUSI-EAS610	1	4	34	751	1814	0	1	TTGGTGTGATGCAATTGCTTGTTACATCGCTGTGGA	ab^]]^Y]\aa\aba`U\a``^aaaa`^`R_TR[[]	chr10.fa		3239665	R	36	119					
+HWUSI-EAS610	1	4	87	570	640	0	1	GCAAACCACTGATGCTTTAGGTTCAGCCCCAGGACA	a`aba^aa`a`Xaa``___`_Za_ba_`YNZaa[_`	chr10.fa		3239729	F	36	119					
+HWUSI-EAS610	1	4	17	212	630	0	1	GTTAGAAGCTCTAGATGCACAGGTGACTGGCATGGC	a___a`aa`_a_``___[N^`__U`__^_``UR`__	chr10.fa		3240479	F	36	119					
+HWUSI-EAS610	1	4	91	23	500	0	1	TGGCATGGCTTTGCAGCTCACAGTCAAGGGAATGGC	]]X_bb]b`````^``b`]O^IZ]]U\\_^`YPRVb	chr10.fa		3240506	F	36	118					
+HWUSI-EAS610	1	4	97	741	947	0	1	CACTGATCACAAATATCCTGTGCTTCCTCCCACTCC	``a\b\a_bb```abaa`ab\b[aa``a_`\aaa^`	chr10.fa		3240656	R	36	119					
+HWUSI-EAS610	1	4	57	1108	286	0	1	CACACTAGAGCATACATTCCTATCTTAACCTAAGTC	abaaaa_X_OY`aa_`aa]]aaa_`a``T[a[\`U[	chr10.fa		3240691	R	36	119					
+HWUSI-EAS610	1	4	54	1378	1122	0	1	ACCAGACTAGCTCTGTCGAGTCTTCCAGCCATGAAT	a`aaaa^aa^``V[RZY^^^VW\\R^\X[\\ZYZ[[	chr10.fa		3240923	F	36	119					
+HWUSI-EAS610	1	4	28	514	626	0	1	ACCTAGAGAATTCCAGGGAAGGAAGCTCCTTGTCAT	`abbbbaaaabbababaaaabaabaaa`a_aa__aa	chr10.fa		3241707	F	36	119					
+HWUSI-EAS610	1	4	50	651	697	0	1	ACACGCTTCTCAGTATCTTGCCCGCTTTTCTCCCAG	aaa``_aa_`__a_]_^_a_Q\`^^_____\U\\[a	chr10.fa		3241799	R	36	119					
+HWUSI-EAS610	1	4	80	1091	356	0	1	AAACCGCCCTGTGGAGCAACATCAACCTCTTTCCAG	abaab^a`YbaV\_ab`_ZY_a_aa^X^\aa`[PY]	chr10.fa		3241857	R	36	119					
+HWUSI-EAS610	1	4	66	819	742	0	1	ATAATAAGACATTTAAAAACAGATCTCATTTCCTGG	]b\baba^Y`bab_bbba^[`bab^b`aaabaa^^a	chr10.fa		3242319	R	36	119					
+HWUSI-EAS610	1	4	50	1177	16	0	1	TGAGCAGATTTGGCACTTGTATGCTGCAGAGTCTAA	aa``T^X\a^_\Z[`\abbab^[Z\YWW][Z\]Z^a	chr10.fa		3242408	F	36	119					
+HWUSI-EAS610	1	4	98	920	1993	0	1	GTTAGAACCTGCAATGACATTTAGAACCTCTTCCTA	^`ab_`baRU^aba^a]aaaab^[\[]a`_aa__[[	chr10.fa		3242507	R	36	119					
+HWUSI-EAS610	1	4	44	1120	1143	0	1	GCAGGCTGCAAGAATGTCTGGAATATTCTTTCAGGA	_aabaaaa_a__S_aa__baa_aa_a`]``__`a`_	chr10.fa		3242631	F	36	119					
+HWUSI-EAS610	1	4	65	125	1210	0	1	TTAGACTTAGGGCTTTTGCCTTCCCTAGATCGTAAG	a]VaT_]b^^`_aaaa[]aa_`aab_\`Y`\`QSR`	chr10.fa		3242841	F	36	119					
+HWUSI-EAS610	1	4	56	431	402	0	1	AAGCAAAGCAAACAAAATAAAAATGCAGCCTGGCGT	aabb^aaa`aaa`aa]aa_`aaaaaaaa`a``a_a_	chr10.fa		3242923	F	36	119					
+HWUSI-EAS610	1	4	17	1566	1490	0	1	CAAACAAAATAAAAATGCAGCCTGGCGTTATTCCAC	a\VXab_babbbbaba\aa`a_aZM[aa\]a`VUZ]	chr10.fa		3242931	F	36	119					
+HWUSI-EAS610	1	4	2	283	1715	0	1	AGTAGAAGGGTACGGTGATTTTGTTATACTGTGGAA	`b__a`abbaT]abaOaS_a_`a_a_`aa`b^aa_a	chr10.fa		3242987	F	36	119					
+HWUSI-EAS610	1	4	64	1454	440	0	1	AGTACCCCTAAGCCATCCAGTGGTCTTAGGTCCACC	aaUaXa`a]^]WaaZ_aa`S]^]ZaXG[S[ZVU]aa	chr10.fa		3243789	R	26G9	107					
+HWUSI-EAS610	1	4	86	947	1909	0	1	GTGACTTCCCATCCATTCACTGTCCACACAGCTGGC	a`\^`a^_`^a`^^`_\^^_^Y[\X]U[[\\YPZU]	chr10.fa		3243929	F	36	119					
+HWUSI-EAS610	1	4	66	294	908	0	1	AGTAAATGTATACGTCTATCTGTGGGTTTGTATGTG	abaabbaaabaaa``a_[]^abW_aaXaaa_``aWa	chr10.fa		3244025	F	36	119					
+HWUSI-EAS610	1	4	27	1659	1353	0	1	GAAAGACCCACTACGTGAGGACTCCCCCACATTCTG	aaaa^`^_^a^\^\`W^_]\\^]\\^U]YW\WUW^U	chr10.fa		3244498	F	36	9					
+HWUSI-EAS610	1	4	53	652	1625	0	1	CACTGCACTAATTCTTGCTCTAATAAAGGCATCTTG	`abbbababbaababbbababbabbaaaabbbabab	chr10.fa		3245088	F	17T13A4	34					
+HWUSI-EAS610	1	4	49	67	1033	0	1	AGGCTATTTTTACCAGTGGAGTGGGACCCCATAGGG	`bba`^]a`ba]bb`]S`a`a\aaaaaaaaQ]_aaa	chr10.fa		3245433	F	36	45					
+HWUSI-EAS610	1	4	31	219	1325	0	1	GGCGTTTCTAACCCTGAAAAGCACGAAGGGTAGGAG	aaba_a_aaababaa]`b]aa`^`a__aaaQ_a`_`	chr10.fa		3245505	F	36	119					
+HWUSI-EAS610	1	4	72	557	711	0	1	ACAGACAAAGAGGGCTGTTGACGTCTGCAGAGAAAG	aaabaabbba_b`aaa_`abaa`\_^a__`_aZ_a`	chr10.fa		3246241	R	36	16					
+HWUSI-EAS610	1	4	22	491	1921	0	1	ATCTGATCCTTCGAGTACCAGTTTCTTCTGCCAGAA	aaaaa^aabbaaaba\aaaab^_ba_`aaaTaaa_`	chr10.fa		3246530	F	36	119					
+HWUSI-EAS610	1	4	23	472	175	0	1	AGCATTATCCGACAGCCCCCTATCCCATGGATGACC	a_WWTKWWRR`_TT_``WN_S`N_ZZBBBBBBBBBB	chr10.fa		3246666	R	36	6					
+HWUSI-EAS610	1	4	67	1597	760	0	1	GGAAGAGCTTGAAAATCTATCGCCAGGCTCTGGTCT	a`aaP\`Z_`_`aaaa`aa`b^`_a_]\\\_[TW_a	chr10.fa		3247623	R	36	29					
+HWUSI-EAS610	1	4	20	501	1077	0	1	AACGAGCATGCAAAGATGTGCTTGTTGTGTTGCGTT	a[VJQb]X_aYYY]]IabY]]^abX\]``Jaa^aY_	chr10.fa		3249612	R	36	117					
+HWUSI-EAS610	1	4	32	1225	1527	0	1	CTGACTAGGGACGCAGGACACAAGATGGCTCTCTCA	``R_abbb`_`[^aaab`]aaa`a^^\]``^a^`]`	chr10.fa		3250991	R	36	119					
+HWUSI-EAS610	1	4	9	266	927	0	1	CATCTTGTGTCCTGCGTCCCTAGTCAGTCTGTACAG	_]_aabb_b`bbbabbZbaba`bUbabaaaa[ba`b	chr10.fa		3251000	F	36	119					
+HWUSI-EAS610	1	4	39	1380	870	0	1	CAGAAGATGTGTTGTATCTTCAATCTGTGCGCTCAC	abba__R^b__aaaaabaaaaa__X__O_`Xaa`a_	chr10.fa		3251036	R	36	119					
+HWUSI-EAS610	1	4	5	1220	917	0	1	TCTGGGACAGGCACTGTTTCAGACTTTCATCTTCAG	_aUX_]VRYYa[[V``X`XN_RX[Z]^PUUV[YP\V	chr10.fa		3251068	F	36	24					
+HWUSI-EAS610	1	4	92	66	1093	0	1	CTGACTGAAGATGAAAGTCTGAAACAGTGCCTGTCC	]L_R`a`[Ya_``\P]aU`]TV][`\`Y`]a_^X_a	chr10.fa		3251072	R	36	118					
+HWUSI-EAS610	1	4	80	624	700	0	1	TAGTTGTCTCTGGCTCTACCTTGTTCCTCCTGTGAT	a]a_a``aaaaa\Z^_aa`]aa\_a__a^__aUa\`	chr10.fa		3251238	R	36	57					
+HWUSI-EAS610	1	4	75	1014	889	0	1	GGCTTTTAATGCTCTTCTTAAAGTCCTCTATCAGCA	a^]^a``W]_`__^_`^_a```YT\]a____^^`^\	chr10.fa		3251436	R	36	119					
+HWUSI-EAS610	1	4	65	925	625	0	1	AGTATATGCCCAGGAGAGGTATTGCTTGATCTTCAG	`abbbbb_abbaba^b`baRbbba_abbabaaaaab	chr10.fa		3252014	R	36	4					
+HWUSI-EAS610	1	4	53	1596	1278	0	1	AAATCTTTCTGGCATGTGCAATAGTGTCTGCATTTG	abab`aaaa__``a`a]``aaa`aZa^aa____a_a	chr10.fa		3252541	R	36	10					
+HWUSI-EAS610	1	4	11	226	1255	0	1	GTCGAGTCCAGTGCGCGCAAGAGTGAGCAATTGGGA	a\b]T]Wab]aS`a`a`aa`aUaP^_aa]]^``aYB	chr10.fa		3253086	R	36	114					
+HWUSI-EAS610	1	4	35	1155	1558	0	1	GCAAGAGTAGAGTACTCAGATGCCGACTAATTCTTG	`_baa`aV`_]bZ_[]__`^^[_^``W]_^__]___	chr10.fa		3253896	F	36	33					
+HWUSI-EAS610	1	4	71	711	2026	0	1	GTAATGCTGGAATGGAACCAAATTCTTAGCATTAGT	`Uaaaa_^Yaba___`__``_a``__`]_^__^]ZX	chr10.fa		3254673	R	36	36					
+HWUSI-EAS610	1	4	43	484	297	0	1	TACCATTTATTATCGAGGACATTTTCCATTTGACCA	abababbbabaaabaabbaaababaaaaaaaaaaa_	chr10.fa		3255772	F	14A21	81					
+HWUSI-EAS610	1	4	11	1260	528	0	1	GGACATTATTCATTTGACCATTTCATTGGGCGATTG	[_[baababba^aabbabaabbbaaaa`aa_]a`aa	chr10.fa		3255788	F	7T1C26	42					
+HWUSI-EAS610	1	4	67	1132	96	0	1	GACAATAGAACACAGATATCCTATTTGAAGCTAAAA	[`a^ZZaX_N^_\]RU^b]SV`][`_[_^a`]_\Y_	chr10.fa		3258691	F	36	21					
+HWUSI-EAS610	1	4	74	420	496	0	1	CGGGAACCTTTATTAACCACTCCTTCCCCGCGATGC	abbbaabbabb_abbbabaaaaaaaaa`_a`aa`a`	chr10.fa		3258839	R	36	15					
+HWUSI-EAS610	1	4	74	940	1217	0	1	GAAGCTATCACAAGACCAGAGGCAAGGATTATTATG	a_aa^a\a_`^aa``]]^a^_^__Xaa`__`a__a`	chr10.fa		3259146	F	36	119					
+HWUSI-EAS610	1	4	92	509	2023	0	1	GAGCCATCATCATGAAGACATTTGATAATGTGCTTC	]GY]a`_baVa`T]VVRYYOU_]W_URX]_Oaa_^_	chr10.fa		3259233	F	36	117					
+HWUSI-EAS610	1	4	89	264	60	0	1	TTTAACTGGCTGAGTTAGGTGACTACTGGGACCACT	abaaaaaaaaaaaa____\Va`__a_^\[^Z__[_^	chr10.fa		3259422	R	36	119					
+HWUSI-EAS610	1	4	65	1575	751	0	1	GGAACAGTTGTGGAAGAAAGGAGATAGTCTGAAACA	aKbaa`I^a__]T_a``aYbZI]J^`SGWb_WaaW`	chr10.fa		3259473	F	27G8	105					
+HWUSI-EAS610	1	4	34	521	382	0	1	TAATGGTGTAAGTACAAGCACAGTCCTCCCCGCAAG	ababbb[bSa^a_aabbb`aaa``aaaa`__aa`a`	chr10.fa		3259544	R	36	119					
+HWUSI-EAS610	1	4	98	590	281	0	1	TTAAAGTTCTTTACTCATAGTTTAGAAGCCTATCTC	a_^[S^Y[^Z\XDU^[QY\VT^^\ZPP[VBBBBBBB	chr10.fa		3260059	R	14C21	51					
+HWUSI-EAS610	1	4	84	689	1016	0	1	AGATAGGCTTCTAAACTATGAGTAAAGAACTTTAAG	ab_bb_WYa__a[^_W\b]_\a\b^aa_`]a`_a`a	chr10.fa		3260060	F	20G15	86					
+HWUSI-EAS610	1	4	93	380	370	0	1	GCATTAACAGCACATTAATTAGCCTGTCACTCATCC	`\`aWVX``^YMOaa]H[^V]^[^^aWYRR`P\][^	chr10.fa		3260172	R	36	117					
+HWUSI-EAS610	1	4	59	1070	1800	0	1	AGTAGTATTTGAAAATTACAAACATAATATATTGAA	]`Y]a`\a^`b`]`bbb``aa^[\`a^aaaaaaa^[	chr10.fa		3260334	F	36	119					
+HWUSI-EAS610	1	4	31	440	766	0	1	TTTGTAAATTCCTTTGGGGAGATGGATGCCCTGTGA	aa^]W_a_Z_a_`^W]_Y`^^_U`__ZWUZY]_Z[^	chr10.fa		3260507	F	36	119					
+HWUSI-EAS610	1	4	29	1093	1677	0	1	AAGGCACCCAGTCGACAGCAAATGGTCCTGGGGCAG	aaY[Z^Z`[`]Z\\^XZ^^]T]^\^SZZ\\\TUZ\]	chr10.fa		3260569	R	36	119					
+HWUSI-EAS610	1	4	6	1374	1255	0	1	GCAGAATAGCAGAATGAGTTCTGAACATCCTTTCCT	ababaaaaa_a[baaaaa_b_a`_`^aaS^aa_^aa	chr10.fa		3260931	F	36	119					
+HWUSI-EAS610	1	4	77	533	1684	0	1	AATGAGTTCTGAACATCCTTTCCTACCTTTGAGGGC	^WU^\\Wa_`_`a^`_[^`a______]_`_\_]Y[[	chr10.fa		3260943	F	36	119					
+HWUSI-EAS610	1	4	82	791	1311	0	1	GCAGCACCGGGGTTCCTGGCCTGGGGAATCTCCGGA	a_a``aa`_a`\U```_\\\```__`U^`\`]Z`a]	chr10.fa		3261328	F	36	26					
+HWUSI-EAS610	1	4	97	84	243	0	1	GGTGCCCAGGACTAAGTGGGATGGGAGTGCTGCGTT	^VR__`a_````a`^`Z`a`Xa```\aT`^\aXaZ\	chr10.fa		3262083	R	36	7					
+HWUSI-EAS610	1	4	28	1255	259	0	1	TTCCATAGAGAACATCGGCACAACAATTTAAGAAAA	aba``aa_^`_`__`[[]^_^`a^a^``^\^\\_Y\	chr10.fa		3262498	F	36	17					
+HWUSI-EAS610	1	4	92	1369	1964	0	1	TTAGTACAAGGAGATAGGATCGATTCGCATTCTTCT	_[^a_Y_`_`_PZWUV`a\[M^YWY]YYYUPW][XX	chr10.fa		3263837	R	36	31					
+HWUSI-EAS610	1	4	62	1136	1830	0	1	TTATCTCTCGCTATACTAAGTTTCTAGGCTAATATC	aa`]]]]_[]W_[ZY]_]^`\^YOS[_^TYWZX\\\	chr10.fa		3264816	R	36	18					
+HWUSI-EAS610	1	4	10	22	1211	0	1	GACATAGACAGACACACTTAGACACACTTAGACACA	aaaa_[a[aaaaaaaaa^__`]a_a_`____^_`__	chr10.fa		3265777	F	36	119					
+HWUSI-EAS610	1	4	65	1161	1426	0	1	CACACACCACACACTTATTTTTCAATTTTTGATTAT	\baaX_aa`VZ\_Y\[]X\]\\SRYZWUO]`Y^]`_	chr10.fa		3266272	F	36	118					
+HWUSI-EAS610	1	4	53	261	1295	0	1	TCCAACTCCTCCATCAGGGACCCTGCATTCAGTCCA	aaaba`aaaaaa^`a]aa`]`]^^`]^^_^^][`^X	chr10.fa		3266790	F	36	30					
+HWUSI-EAS610	1	4	82	1007	919	0	1	CATGGAAGTGTGCATGCAGGCATTATGCTAGAGGAG	`bbab`UYXbaa]]bb_O_Y^Ra^_^_[\O`a_\Wa	chr10.fa		3267552	F	36	118					
+HWUSI-EAS610	1	4	10	981	1572	0	1	GGAAGTGTGCATGCAGGCATTATGCTAGAGGAGCCA	aa^_a\`\`Za_`a`_`a`aaa`__``_^``^a^\`	chr10.fa		3267555	F	36	119					
+HWUSI-EAS610	1	4	74	1071	1639	0	1	CACNGGTAGCAGTAGACTGGGTTTCACACTGAACAT	aaXD[b\aaXS]W]a__`aa_W^_]__\W^_[Z^__	chr10.fa		3267610	F	3A32	110					
+HWUSI-EAS610	1	4	45	321	1690	0	1	GCAAACCAAGATCAAGTATTTTCACTACTGCATAGT	abaaaaaaaaaaaaaa^aa```aaaa`aaa[W`_aS	chr10.fa		3267879	R	36	119					
+HWUSI-EAS610	1	4	9	729	624	0	1	GCAAACCAAGATCAAGTATTTTCACTACTGCATAGT	a_aaa_[aaa_a^^a\U]aa_`_`]`aYa___`[^V	chr10.fa		3267879	R	36	119					
+HWUSI-EAS610	1	4	54	958	1582	0	1	AGAGAGGGCCAGAGAGAAGNGTCAGTGGGTAAGAAC	aab``]RK]\__^`Ma\][DXNXW^W\\[P^]]\[B	chr10.fa		3268263	F	19G16	105					
+HWUSI-EAS610	1	4	83	1174	733	0	1	GACTGTATGTATGTGAGTTTGTGTGTGTGTGTGTGT	aaabb`aba^`aa^][aaabb_a^b_`^a`b_a[a_	chr10.fa		3268434	R	36	60					
+HWUSI-EAS610	1	4	20	932	1824	0	1	TGTGCCTGTGTGTGTGACTGTATGTATGTGAGTTTG	ab]b`bab`_`_GaUaa`aW_^a`aLba_b_a``aa	chr10.fa		3268449	R	36	27					
+HWUSI-EAS610	1	4	52	1744	520	0	1	GTACTTCACAGCAGCCTTGGATCCTTGCAAACCAGA	``baaaabaa`aa_`aa`Z]____`]Y^a``__^``	chr10.fa		3268720	R	36	119					
+HWUSI-EAS610	1	4	84	96	538	0	1	TGGATGGGGTGGATGGCTCTTTCTGTCAGGGACATC	ab_^_bbb]H_ba`aabXa^aababa_]]]_[aa\a	chr10.fa		3268817	F	36	118					
+HWUSI-EAS610	1	4	94	83	1806	0	1	TGCAGCCAGACTAATGTCGACACACAACGTGCTGGT	abbZbbb^babbbaabRbbbaababb`ab_baa`^B	chr10.fa		3268899	F	36	115					
+HWUSI-EAS610	1	4	62	77	207	0	1	GACTAATGTCGCCACACAACGTGCTGGTATTTCTTA	a`^aN\USRTUGUP`U_WX_MLTV\VNHK]ZV^UWV	chr10.fa		3268907	F	11A24	105					
+HWUSI-EAS610	1	4	89	801	487	0	1	TGCTTATGCTGATTCACGATCCCGTTCTCTCCAGTC	aa_aaaa^Ua`_aa]a__aa_``_Y_U\\_\\\_\_	chr10.fa		3269074	R	36	119					
+HWUSI-EAS610	1	4	69	547	681	0	1	CTGTGCCCTGATCCAGCCAGTAAATGCTTATGCTGA	aaZZ^aaa_baaaaaa`aaa[a`[aaa`aaa_``^[	chr10.fa		3269098	R	36	119					
+HWUSI-EAS610	1	4	90	1573	673	0	1	TGTTATGGTTGTTTAGTTTGCTCGTCTTGTGGGACT	aa_]ZU`[NXVJNUUVX_SU[BBBBBBBBBBBBBBB	chr10.fa		3269553	R	36	53					
+HWUSI-EAS610	1	4	64	1650	82	0	1	ACAGAGGCCTAGGTCAGATCCATGTAGGCTCCTTGG	aa_]_ZG\[^]TVL]ZXV_^`]UV]XXKZSZBBBBB	chr10.fa		3269592	F	36	95					
+HWUSI-EAS610	1	4	2	1665	844	0	1	GAACTGTGGGGAGGGGAAGAAAAGATCTACCTCAGT	]S``]^W_``]]Z^PZUa]a_a[aY`WK]^PWX`PZ	chr10.fa		3270824	F	36	118					
+HWUSI-EAS610	1	4	33	1509	791	0	1	ACGTCCCCTCTAATCTGTGACTGCGTTACTTCACAC	aa\]__`_[_^a__^_^[UZ_^ZTRWWWW\\XW_\Z	chr10.fa		3270883	F	36	119					
+HWUSI-EAS610	1	4	14	77	1459	0	1	ATGCACTTGATTAAATCAAGACAGTCCCTGTAATTC	aaa_V_X]X`___[I_aX_a_a`]\aa`^a\^K]Xa	chr10.fa		3270963	R	36	118					
+HWUSI-EAS610	1	4	90	72	341	0	1	GCCTTAGGAGGTCCTTGTGATGACATTGGATGCACT	aaaaabab_aaVab`aa_a]`a_`]^\`\]_\`a^[	chr10.fa		3270992	R	36	119					
+HWUSI-EAS610	1	4	65	27	619	0	1	GTCAGAGAAGGGATCACGTGACAGTTGATTGGGGTG	aZ^__[aUZX^SXXbQ]_W\\_V_UYJN_\__``H\	chr10.fa		3271118	F	36	117					
+HWUSI-EAS610	1	4	91	547	13	0	1	TGTGCACCATGTAAAGGAGATACTAAAGGTGTCCAT	abababaabaUabaaba_baaaaa`a_aaYa_^^]a	chr10.fa		3271303	R	36	119					
+HWUSI-EAS610	1	4	6	7	55	0	1	CTGTGCACCATGTAAAGGAGATACTAAAGGTGTCCA	_\__aaaa__`a``YT^`Y_\^^^_``[_[N]X_]\	chr10.fa		3271304	R	36	119					
+HWUSI-EAS610	1	4	8	730	1584	0	1	GTGAGCTCTCCCATAAACCAGACACTAACCCTGGCT	a_aa^_^`^``_a_`a\[aa^^a``a__]`]_^_`_	chr10.fa		3271519	F	36	119					
+HWUSI-EAS610	1	4	9	6	260	0	1	GTTTGGTTTGCTCCACCTCACTACTCTTCCCTAATG	a_``aa_`a[aa`aa___aaa^[`a```a`aa^Ra`	chr10.fa		3272381	R	36	36					
+HWUSI-EAS610	1	4	12	1760	1077	0	1	GGAGCAAACCAAACCAAGACTCATCTCCCCATGTTT	M\F_a`aa^aaabb]\aI_aaa_a__S_[`ZS_RUa	chr10.fa		3272403	F	36	117					
+HWUSI-EAS610	1	4	71	1458	63	0	1	AACATCCTTTCACCTGTGTCCGCCTCAGGAAAACAT	_ab`^a`_]`ab]`][X\_a[Q_Z^_]NL^ZaWZ]^	chr10.fa		3272496	F	36	13					
+HWUSI-EAS610	1	4	44	1020	410	0	1	TGTCCGCCTCAGGAAAACATTCGTTCCTGTGTCTGT	`_^_\_TVT_]^[T`\_a_\UZXR\JRZWWTX[O]B	chr10.fa		3272512	F	36	114					
+HWUSI-EAS610	1	4	94	284	116	0	1	AGCTGCCAAAAAACAAAAACCAAAGAAACCAGGGCA	aaaaa`aaaaaaa`aaaa__``aaaaaa_a_``a_a	chr10.fa		3272799	R	36	119					
+HWUSI-EAS610	1	4	69	142	767	0	1	CCTGACTGACTTGTCCAGCTTGTTTCCCTATACAAC	]H]_\^LP^a]Z```aZ_b`aa\_`]a`_`[W^\K^	chr10.fa		3272987	R	1A34	105					
+HWUSI-EAS610	1	4	54	849	1793	0	1	GCAGTGTGTTCCTACATGGTCTCTGCTTCAGGTCCT	Xa_bW^\][aQG\ba_a_WP[`V]a^\aVa]VN_[_	chr10.fa		3273039	F	36	117					
+HWUSI-EAS610	1	4	77	842	961	0	1	GAGTACTTGGGTGGAAATCTGTGTGCATAAGAGATC	a__Z^_aaaa`Vaa\_aa`aa^a]_Z^a`___a^__	chr10.fa		3273199	F	36	119					
+HWUSI-EAS610	1	4	5	537	734	0	1	AAAAACAGCTAGGATGCTGCTTCCTGGCTGGGTGAG	T\b[]Tabab`aba``\bb_Ua[TR^a]P_a\V_BB	chr10.fa		3273366	F	34T1	107					
+HWUSI-EAS610	1	4	56	893	2017	0	1	AAGACTGTTAATTAAGGACTTCCTATTCCATCTCAA	a^a]L`_\_P``a`TO`N_^__WP`_]^UU]W^]_`	chr10.fa		3273434	R	36	118					
+HWUSI-EAS610	1	4	64	202	1589	0	1	CAGGTCCCCTGGAAGAACAGCAAGTGCTCTTAGCCA	aT`aababaaba``a\Z_^Ya^[`Q^b``a_\aaaa	chr10.fa		3273540	R	36	11					
+HWUSI-EAS610	1	4	65	1260	1065	0	1	CAGTCCTAAGTTCTAAACATTGTACAAAAGCAGAAA	abaabbbbbbababbbbbabbbbbabbab`a`ba]_	chr10.fa		3274816	F	36	119					
+HWUSI-EAS610	1	4	35	1747	1227	0	1	CCATAATTACAGTTTTATTCCTTTATTTATTTATGT	ab``a^ba^`__]`aa__aZ]_`_]_`_]^_[_^Y]	chr10.fa		3275273	R	36	119					
+HWUSI-EAS610	1	4	61	384	1207	0	1	ATGTGTATGTATCAGTTAGGCAAGCCATCATTTACT	P[_\_a`a`_^_a`[J^^YW__```[ZX__Zaa_Y]	chr10.fa		3275438	F	36	118					
+HWUSI-EAS610	1	4	1	1693	1702	0	1	GAAGCGCTCTCTCGCTCTCTCGCTCTCTCTCTCTCT	abab\]``aa`a`aaaaaaa^^^a\a^__a]_U_Za	chr10.fa		3275551	R	36	50					
+HWUSI-EAS610	1	4	64	533	1634	0	1	TCCAGGTCCTTAGAAGTTCTTCATGCTTGCTCCAAT	a][aa`^Z[a\]WWWY`a`[a`[`[Wa`\X[_``\_	chr10.fa		3275715	R	36	119					
+HWUSI-EAS610	1	4	94	76	865	0	1	GGACGAATGCATGACACACACTCCGTTTAAATAATT	abaabaaaaaY^a]aabaaVa`aba^``aaa_^]^_	chr10.fa		3275748	F	36	119					
+HWUSI-EAS610	1	4	62	768	184	0	1	GGGGAGGTTGTAGAATCCTAGGGAAGTAGGGCCTGG	aabaYaa[`a``_```^`^]`a`]\][]YV][^][`	chr10.fa		3276047	F	36	119					
+HWUSI-EAS610	1	4	49	565	1694	0	1	GGCAGGCAGAAATAGATCAGTGGAAGTGGGTTTTTG	ab`ab`_a`b]V_bXT`_QZaa_LZ_G``b[abb`^	chr10.fa		3276081	F	36	117					
+HWUSI-EAS610	1	4	57	1333	264	0	1	GGTTTTTGCTGGTTATACCTGGCTCCTACCTCGAGT	_`bbba\aab`^``_b`a^aa_aa`_aaa^\a]```	chr10.fa		3276109	F	36	119					
+HWUSI-EAS610	1	4	2	1037	1830	0	1	GTTTGCTGTGACATGAACAGCCTGTGCCGCACAACC	aSU`PTT^\U`KT_\\L[^\FPMYYP^SZNR\WYU\	chr10.fa		3276161	F	27T8	92					
+HWUSI-EAS610	1	4	4	1178	860	0	1	GGTCCTGTTAAAAGGGGGTTGTGCAGCAAAGGCTGT	Z^a^^W`a`N_WRaBBBBBBBBBBBBBBBBBBBBBB	chr10.fa		3276177	R	28C7	21					
+HWUSI-EAS610	1	4	5	274	1441	0	1	GGGCATGCTTTCCTGTGAGAGACAAGCTTGAGAATG	a[`_V`aaa^^a_a^Maaa_a`a]]aaV`_``H]`_	chr10.fa		3276479	F	36	118					
+HWUSI-EAS610	1	4	79	1623	1226	0	1	AGAAATCATCACCGAAGTTGGCAGAGATCTTTTAAG	aV`a^\Na]\]WMYP]QT[YNS_VWYZXW]Z[SU[X	chr10.fa		3277953	R	36	118					
+HWUSI-EAS610	1	4	38	134	2044	0	1	CACCTGAAAATTATATGCTGTTCAAAATCCAGTGTC	a`^a\`ZRYXX^a`Z[]a`]NZa]`]]Y`_\]U[T^	chr10.fa		3278099	F	36	118					
+HWUSI-EAS610	1	4	18	276	442	0	1	GCAGGATAGTGTGATGGGGAATGGTATGTCAGTGAT	aa]abY`]b_a`b``bbaa[``T_]aaa\a_`PaR]	chr10.fa		3278938	R	36	119					
+HWUSI-EAS610	1	4	27	314	1187	0	1	GCGCTGAGGAAGTGCCTTCTGGAAATAGAAATGTAC	abbabbb_b`bb`bbbaababbabbaab]Zaa^]aa	chr10.fa		3279374	F	36	119					
+HWUSI-EAS610	1	4	33	1311	408	0	1	TACGGAAGGGAGAGTCTTCTGGCAGCCTTTGGATCA	ab^\`a[_``[QQYKRX[TMFV\VXVSYV_^LPSPV	chr10.fa		3279651	R	36	116					
+HWUSI-EAS610	1	4	99	302	104	0	1	ATGATCTTTCCTTTTTGGCCACCAGGTTTCTGTAGG	a_aa__aaa^\a`a_X]__W_\___`RU_W`_V^^\	chr10.fa		3280303	F	36	119					
+HWUSI-EAS610	1	4	54	356	1127	0	1	CAAAGCTCTGCTTTTCTGACCTACAGAAACCTGGTG	a^``a_ZTYaa__XX[XXXVYY\[]]^X^RW^_`Xa	chr10.fa		3280322	R	36	119					
+HWUSI-EAS610	1	4	19	1586	1559	0	1	GTTAGAAGTCACTTTTACCGTGAAGCCTTGAGATAG	^^bVX[`bSTY^J]Z`WT^aWaTIY]_aZ_\\LWTT	chr10.fa		3281191	F	36	117					
+HWUSI-EAS610	1	4	49	23	1091	0	1	ACAGCCATGTAGAAAGCCAAGCACAGCAACACCCAA	````baabb_a_TV`aaaaa_a_baa`_aaaaaa`a	chr10.fa		3281650	R	36	119					
+HWUSI-EAS610	1	4	63	479	898	0	1	GCATGATGGATACTTCAGTGACAGAGCTGTTTCCCC	\b``[Z^b`a`^`a^aa`_`a^a[[a_aa^_[\]\\	chr10.fa		3281715	F	36	119					
+HWUSI-EAS610	1	4	28	1157	1167	0	1	GCTTCGACATCAAAGTGTGGCTTTACTTACATGCAA	aaaa[``^``_```_\_Vaa__a^`Z^_^]^]_Z^^	chr10.fa		3282409	R	36	119					
+HWUSI-EAS610	1	4	75	1740	1406	0	1	GAAGGTACTCTGTGTCTTTAGAACAGCCAGGTCTGT	_^`_^Ua_aaa`PW_``_aaZ]UU^M\YZRNNW__^	chr10.fa		3282461	F	36	118					
+HWUSI-EAS610	1	4	97	596	798	0	1	TAATGTAATTCTAATGTTTTTACATAAAGGAAATCT	a`abb\_F_aaa^Xab`aaaaa`aaa]X]`[`_a`a	chr10.fa		3282915	R	36	118					
+HWUSI-EAS610	1	4	51	495	1634	0	1	GGCAGATTTATAAGGCATCTTTGACTGCGTTAGTAG	a`a`aaaaa```a``^`a_a_aa`^_`^aZ__`]`_	chr10.fa		3282956	F	36	119					
+HWUSI-EAS610	1	4	36	295	22	0	1	GCTACATGGGAAGTAGGGGCAGAATGGTTTTTCTTT	aaaaa_aaaa[X`X`a\a``Ya_`a`aW__aa]]^`	chr10.fa		3283085	F	36	119					
+HWUSI-EAS610	1	4	57	1506	239	0	1	ATATGCACACCGGATGTTACCTCCCCACTTGTATGA	aba``aaa`aaa_Y]P]^__a\W__`_^WXLVX\N[	chr10.fa		3283131	R	36	118					
+HWUSI-EAS610	1	4	51	1179	1635	0	1	ATATTGTTTAATCTACCCTTTATTGCTTTTATCTAC	ababbbabbabbaab`_`abbaaa^^abaaaa`aa_	chr10.fa		3283163	F	36	119					
+HWUSI-EAS610	1	4	91	1534	1200	0	1	GTTTAATCTACCCTTTATTGCTTTTATCTACTATAC	aaabaa`[`a`_X`aa`a``_a__a``]aa`__`^\	chr10.fa		3283168	F	36	119					
+HWUSI-EAS610	1	4	19	636	1204	0	1	GCTCAAGAAGGCTACACAAGTCAAAAGGAAAGTCTC	^aU`a`aa`aaaba]^`a[b`__YaYaa_aa`W_`a	chr10.fa		3283365	R	36	119					
+HWUSI-EAS610	1	4	12	966	1612	0	1	TAGTACAACACCTTTGCATGACCTTTATGAACAACT	abaW\]ab]`YZ]a\\\^`[__``[a^`a_[[[a`\	chr10.fa		3283639	R	36	119					
+HWUSI-EAS610	1	4	56	1255	1175	0	1	TTATGGTGGTGGAAATGGCAGAGGGGAAGGAACACT	aa_^X^\a`PR]U[\ZPVNNWGV^^WHMPYLRLRU[	chr10.fa		3283915	F	36	115					
+HWUSI-EAS610	1	4	23	538	1948	0	1	ATGGTGGAGAGGTGGAGTGAAAATGATGATGATTGT	a`ZZMUY`\^Z]^^\[ULT__a]^XU][_UWRU\WB	chr10.fa		3283985	F	36	114					
+HWUSI-EAS610	1	4	87	1507	1828	0	1	TGGGGTACATTATTGGTGTCTATTGTCTACCACCCT	a```]_\ZU^_^_]ZUM\aabaS`a_a`^YXaRa\b	chr10.fa		3284033	F	36	118					
+HWUSI-EAS610	1	4	53	1454	1600	0	1	AGATTCTTGAGAGTGTATAAATTTGATAGCCTGAGA	_baab`baVab`b_a_abbbabbaabbab\abaaaa	chr10.fa		3284314	R	36	119					
+HWUSI-EAS610	1	4	78	1341	1286	0	1	GAAGGCGATGATGTCATGATACAGCCACGGAGACAT	`__^\[^_RNPVWVZYYY[ZBBBBBBBBBBBBBBBB	chr10.fa		3284921	F	36	49					
+HWUSI-EAS610	1	4	33	1492	1744	0	1	GTTCATAGAGATGGTGGTAGACACAAATTATGAGCA	aaVaP^Y_\N_\bbJ[aRU[_^XaZ[]\_V^JM`aa	chr10.fa		3284977	R	36	117					
+HWUSI-EAS610	1	4	2	1369	307	0	1	AACACAAACATTATAGCTAAAAGTCAATTGTTTGTC	[a^``]aaI]_WF[`LQTXZ__]W]aS\_WBBBBBB	chr10.fa		3285515	F	15C10C9	50					
+HWUSI-EAS610	1	4	89	15	55	0	1	AGCCCCGGGTGGAGTCTGGCTTGGTGGCTCTCCTTT	\Z]]]\`\]R_\ZURYJXU\XVKUPL[BBBBBBBBB	chr10.fa		3285997	R	36	78					
+HWUSI-EAS610	1	4	1	1125	650	0	1	AAATGTTCATCATCTCAGGATAACTGAGGAGAAGAT	aaaaa`aaaaaaaaaaaaaaaa`^`a`aa_a__a`a	chr10.fa		3286206	F	36	119					
+HWUSI-EAS610	1	4	47	1121	1521	0	1	AACTCAGACCCCTAGAACCCATGTAAAAGTCAGGCA	`bababbaaaa\aa]ab]\aabb`a`a`b_a`aba`	chr10.fa		3286348	F	36	119					
+HWUSI-EAS610	1	4	54	1406	1111	0	1	GGGGGGTGGAGGGAAAGAAAGTGATAGAAGAAGACA	a]a`aaWa_T_aa\][^_\V`T_\^_Z_W\V\\_W\	chr10.fa		3286681	F	9G26	94					
+HWUSI-EAS610	1	4	56	1365	919	0	1	GTGAGCCTTCCATAAGGTTTGATCAGCCCTTTACCT	a\`aaa`aa`__`aaaa]aa`a`]\Z\^Y__``]_a	chr10.fa		3287016	R	36	119					
+HWUSI-EAS610	1	4	16	14	1054	0	1	CACAAGAATGCAGATGAGGTTTTCAAGAAAGCTAGA	a]`^Ya\_`aa`a\abaaa]_`aa``a`]`aa__^^	chr10.fa		3287126	F	36	119					
+HWUSI-EAS610	1	4	34	784	1278	0	1	TTCTGCCCACGGTGGCTGAGTCATCCAAGGTCAATT	abaaaa`aZ^_V_\_aa_]\aXa^X]``Z__^`_a]	chr10.fa		3287329	R	13A22	86					
+HWUSI-EAS610	1	4	12	1027	545	0	1	GATGACTCAGCCACCGTGGGCAGAAGCATTCCCTGT	^_Z^^]a]aa`aa][R^aaa`Z[QU^Y^`]YZY^ZZ	chr10.fa		3287340	F	11T24	81					
+HWUSI-EAS610	1	4	69	1508	1909	0	1	TGAAAGACATGGATGTACACATGCTCACTTACTCAA	aa``_a]]]`aY\^^Z^V^]_]]WVWVZZZVBBBBB	chr10.fa		3287409	R	15C19C	64					
+HWUSI-EAS610	1	4	18	959	1005	0	1	GAGTCCATCATTCCGAGGAAATCACACAAGCAAGAG	a``_a``a_[a`_Za]__]`[]]_]U[_^_]W]_U\	chr10.fa		3287489	R	36	119					
+HWUSI-EAS610	1	4	37	1588	1248	0	1	AGTTAGTTAGGTCCATCTCAGGTCTCATAAAAGAGG	[`bb`Z`abbaZ^__aaa\^a`abb`bb`baab\^a	chr10.fa		3287614	R	8G22T4	42					
+HWUSI-EAS610	1	4	51	1229	243	0	1	GCCATGGCTTGCAGCTGAGTCGCTCCAACCCATGGC	__aaXXS`aa_`_a\`a^a^aBBBBBBBBBBBBBBB	chr10.fa		3288491	R	36	54					
+HWUSI-EAS610	1	4	51	716	726	0	1	TGCAGTTCTAGAGGCCAGGAGCCTGGGGTAAAGGTG	aa^[a`__`YaUV^ZU\^_Z[[\ZYUNLSZSPVUS\	chr10.fa		3288605	R	26A9	99					
+HWUSI-EAS610	1	4	54	1058	1455	0	1	AAAACAATGTGACACATTTACAGAGGGAAACTGGGC	aaaa^__``]`^^a___aa___a^`_^Z^_Z^]^Z[	chr10.fa		3288874	F	36	119					
+HWUSI-EAS610	1	4	48	274	1312	0	1	GCCTCCAAACAAAAAACTTAAGGCTCTAATGTAAGC	``\`Z\\Y_WURMU]^U`WKMPWa`YX^WSXR_T_`	chr10.fa		3289231	F	36	118					
+HWUSI-EAS610	1	4	86	1441	484	0	1	TGTTGCAGAGGAACTCAAGGCTATGCTGAAGATCTT	`___U_\NT\N^`___]_Z]\`^^^]^YYYQYTY]V	chr10.fa		3289557	R	36	118					
+HWUSI-EAS610	1	4	67	903	412	0	1	CTTTTACTGCGCTTATCACTAGCAGAACAATAGAGT	aa_bb\`_^aab\ababbab\bXabbaab`\b[aVZ	chr10.fa		3289643	F	36	119					
+HWUSI-EAS610	1	4	39	728	832	0	1	GAATTCAAGAGGCAGAGCAAAACCTTGTTCTAGCTT	^T^T``]X\S^\_ZZU`]][QLYU``]^`_]S`]__	chr10.fa		3289728	R	36	118					
+HWUSI-EAS610	1	4	64	869	245	0	1	AAATGCTTTTCCCCTAAGCTTCATTTCCAGTTCCCT	aaaaa^aa`_`_`^_`\aZ__]`a_`a^_[_`\VX[	chr10.fa		3289992	F	36	119					
+HWUSI-EAS610	1	4	46	1157	818	0	1	AAGCAAAAGCAAAAACAGGGAACTGGAAATGNAGCT	[N^\V]baaYZ`a^`SX[]UU_X^U`\b`]QDZaUa	chr10.fa		3290008	R	31A4	110					
+HWUSI-EAS610	1	4	62	496	1632	0	1	GGGACAGGGTCTCACTAAGTTGCCAGATTGGCCTTG	]X_\_VIV]aab\b]b^Tb`aaaa]baabb\`aa`^	chr10.fa		3290050	F	36	118					
+HWUSI-EAS610	1	4	49	1552	1049	0	1	TAACTTAATATGTAACCCATCTGTCTCAGCCCCTTG	a`VZaa_a`R`\Yb`_a]`a_\WY`aa_RXX]Z]BB	chr10.fa		3290114	F	A35	72					
+HWUSI-EAS610	1	4	88	290	1209	0	1	TATATGCTATTAATAACAAGTCAAAGAAACTGAAGC	aaa]`aaaaaaaaaaaa]\_]a`a\`__a```bY``	chr10.fa		3290186	R	29T6	82					
+HWUSI-EAS610	1	4	40	1079	741	0	1	AGAGCATTTCGAGTTGATTCCCTCCTGAGAGGTCTG	^bbbY_`[`N_\Ta`^]Za_YOYaa]aZ`Va_N_\a	chr10.fa		3290683	R	9T26	100					
+HWUSI-EAS610	1	4	96	801	366	0	1	TTTGACAACTGTGTTCTTTCCATCCATAAGGAGCCT	abbb]VX[Wa^P]U\aaaaZ]aXUY\]a`U^^_]]V	chr10.fa		3291048	F	36	119					
+HWUSI-EAS610	1	4	84	1226	931	0	1	CTGTCCTTTATCTCTTTGGTCAAGATATGCAGAGAC	aba]``aaa`a``^_]Z]\[USTa_]M[a`a_\V^Z	chr10.fa		3291141	R	36	118					
+HWUSI-EAS610	1	4	6	602	1125	0	1	GGAACAACAACTGAAAAGCTAAGCCACTCACCAGGG	a`a_aa`aa`[aaa__LZ^aa[aY\_\_a`a_S_V^	chr10.fa		3291774	R	36	119					
+HWUSI-EAS610	1	4	61	1614	35	0	1	ACTATGTCTAAGAAATTGATTCAACTGAATATGTTC	aaaaaa^`^a__^a_aa_``][^_]^[__^_\LV^X	chr10.fa		3292152	F	36	119					
+HWUSI-EAS610	1	4	64	21	540	0	1	TGTGGACTCCAGCACCAATATTTTGACTCTGGAGTA	ab^bbabab`X_b`abY\_]_aaabaaaaab`X`Va	chr10.fa		3292572	F	36	119					
+HWUSI-EAS610	1	4	13	997	1383	0	1	TGTAACACCAAAGCCACTTGTTCCTGTGTGGTTACA	a]]a]\a`\`ab]`aa_`]`]`_X]`__\a]P]YN]	chr10.fa		3292940	F	21C11C1C	18					
+HWUSI-EAS610	1	4	43	580	61	0	1	CTTTGGCCATTTAGGGTGTGGAAATGCTTAGTCAGC	abbbbbbabbbaabba_b_ba`ba`aaa_`]VV_`a	chr10.fa		3293503	F	36	119					
+HWUSI-EAS610	1	4	21	1534	504	0	1	TTCCTGAAGGCTGACTAAGCATTTCCACACCCTAAA	[_ZZ]Z]ZWOWOZZ^W_]Z]_ROQX_aWaOQRJV]`	chr10.fa		3293512	R	36	117					
+HWUSI-EAS610	1	4	18	581	136	0	1	TGCTTAGTCAGCCTTCAGGAATAAACAAGCTCTTCC	aaaaaaa_aaa``aaa`bbbaaa___`_baa^```_	chr10.fa		3293527	F	36	119					
+HWUSI-EAS610	1	4	88	231	179	0	1	AGGCTTTGTTCAGCAGAAGCAGGCTCAGCTGTGGAA	abb_]Zab`a_b``aa`^```]ZX[]`a]`aVa\BB	chr10.fa		3293673	R	36	110					
+HWUSI-EAS610	1	4	18	1585	1733	0	1	CTGTAGACAGAGTCTTAGTTGCAAAAGAAGCTATAA	`^abbaa_bbba`Ybb`b`YVV`J\aa\^_]aab`a	chr10.fa		3293757	F	36	118					
+HWUSI-EAS610	1	4	69	1130	1471	0	1	TGGTGCTGTGAAAAATTCTTATGAGCTCCCTGCCAA	aaX]b^ab^a_XPX`aa`aa`_`_[_a_\\_]_\^\	chr10.fa		3294120	R	36	119					
+HWUSI-EAS610	1	4	22	127	1102	0	1	AGATATGATTTGAATTTAGACCATGACAAAGTCTGA	VYY_[Z^T\a]`\Y^Z__[R^`_YS__`aa`Z^`]S	chr10.fa		3294220	F	20T4T10	48					
+HWUSI-EAS610	1	4	12	956	1777	0	1	TGACCAATCTATGTTATAGAAAATGCTTTGTGAGTA	abbaabbaaaaab`babaaaaaa`aaa_aa`aaa[a	chr10.fa		3294329	F	36	119					
+HWUSI-EAS610	1	4	59	348	1068	0	1	CTTTTTATTTCATTTCACCCTTCAGATTGGAATCGG	G]b`b_\``b_`ab`bbbbbab``bbbbbb``abab	chr10.fa		3294452	F	A35	107					
+HWUSI-EAS610	1	4	54	1756	1242	0	1	GGAATGGAACATACACTTTCAAATGTGGGAGACGCT	Yaa``b_`aZZZ``a[_W\aa]Z`\O\ZO\Y[W_QU	chr10.fa		3294802	R	36	118					
+HWUSI-EAS610	1	4	13	1244	130	0	1	GAAAGCTTTACAAATGGGATAAATTGTGCAGAAGAT	aa]_V[aaa_[ZZ_a``\X____`_UUYTX_[US\_	chr10.fa		3294894	R	17A18	86					
+HWUSI-EAS610	1	4	23	490	410	0	1	GAAAGCTTTACAAATGGGATAAATTGTGCAGAAGAT	aaa_a_``^^]_]__a`a`___````W_```^^`]^	chr10.fa		3294894	R	17A18	81					
+HWUSI-EAS610	1	4	90	297	247	0	1	TCTGCACAATTTATCCCATTTGTAAAGCTTTCCTTC	^V\`bb_^^b_`__abaaaa_ba`]`b`a^a^]`a^	chr10.fa		3294898	F	14T21	81					
+HWUSI-EAS610	1	4	7	943	1801	0	1	AGCCTTGAATTTTAATCCCAACACTTACTCAGGAGG	`aabbb_V^bba`baa``bbaab]aababba`baaX	chr10.fa		3295271	R	36	119					
+HWUSI-EAS610	1	4	40	1293	1229	0	1	TTCTTTGCCACATCTAACCTCTCCACGTAACCAAAT	aaab`a[__^^``_`a`__`___^^^_Z^^WZ_]Z_	chr10.fa		3295570	R	36	119					
+HWUSI-EAS610	1	4	27	948	782	0	1	AAATGCTACCATTTTACCCAGCAGACTCTGGTATCT	aZ]`a_aa_^]aaaa`__`aa``_`^`_a`a]_a_`	chr10.fa		3296043	F	36	119					
+HWUSI-EAS610	1	4	60	702	1657	0	1	GCATATTAGTATCCCATGGAGGTCCGAGAATCAAAC	aaaaabaaa_`aaa]`aba_baZ``a`a^a``aaa_	chr10.fa		3296081	F	36	119					
+HWUSI-EAS610	1	4	44	476	1603	0	1	AGAGTAAAATATCAATGAGGGCAATTTTTCATTTAC	aaaa^aaaab`aaaaaa_a`aaa``aaaaa`a_^`_	chr10.fa		3296275	R	36	119					
+HWUSI-EAS610	1	4	16	1278	524	0	1	GAAAAGATGACAGAGAGCTTAAAGAGGCTGGTTACA	`abb`a_aaa^`_`^___aaa^_]_WBBBBBBBBBB	chr10.fa		3296374	R	30T1C3	71					
+HWUSI-EAS610	1	4	66	756	1417	0	1	AGAGAGAAACATTTCCACCCATGGTGGTGAGCTCAC	a_b]VVUaaRab`aU\aZ`aa]X_YYYZRJWV[^`X	chr10.fa		3296465	R	36	118					
+HWUSI-EAS610	1	4	77	470	1062	0	1	GAGAGATGTCTAGAGTGGTCATGTGCTTGCCTCGCA	aX_N[``bMR^aa^`Wba]`__a_\QU]\_`YNXWB	chr10.fa		3298136	R	36	114					
+HWUSI-EAS610	1	4	49	619	1540	0	1	ACTGAGCAGACAAACCACAGCCTGGGATAGATCCTT	aaaaaaa`X^aa_]_^X`aa^a^`aa_```[`__`^	chr10.fa		3298373	F	36	119					
+HWUSI-EAS610	1	4	59	926	575	0	1	GAGCAATCAGATTAATAGAGGCCAAACATCTGGGGA	abbaaaa_^a^a`a`aa_a```_a```a``_`__`_	chr10.fa		3298483	F	36	119					
+HWUSI-EAS610	1	4	69	1736	1926	0	1	CAGGCAGGTTTCACAATGGACCATTTCATAAATCTA	a_b`_`baZW\a[XYa_SZ`_XZaZOTWbX_YW]V_	chr10.fa		3298538	F	36	118					
+HWUSI-EAS610	1	4	37	816	1976	0	1	TACAACCCCAGAATTAGTGAGCATTATTAAAATAAT	`_``^`Z^JDNYYY_NQTXX`V]Y^PZ\ZTUU\XXU	chr10.fa		3298654	F	36	115					
+HWUSI-EAS610	1	4	86	1224	197	0	1	ACGAGAGGAAAATCTGAAAGGCAAAGTCACAGGGCT	a]a```]^aaa_a`aYZ__aa___YXR`]PXVQTV_	chr10.fa		3298835	R	36	118					
+HWUSI-EAS610	1	4	41	1356	1424	0	1	AGTCGTCACAATAGATTAATGTCACATTTTAAAGGC	^`abbaa^_```]a`abbaa]R]ZXDU`aaa`][a^	chr10.fa		3298965	F	21G14	94					
+HWUSI-EAS610	1	4	98	1196	101	0	1	TAAAAGGGAACATTAAATCCCGGAAAATTCAAACAC	ab`a`^`^`_`W_\KSa_^`^a__a``[[^``_\][	chr10.fa		3299130	R	36	118					
+HWUSI-EAS610	1	4	57	1698	366	0	1	ACGGGCTGAGCTGTCAAGGATACTTCAGGTGTTAAC	a^OR]a`S_]^\YYa`\ITYQ]ZZZ`WLJFPYZ^\V	chr10.fa		3299426	F	36	116					
+HWUSI-EAS610	1	4	56	1427	783	0	1	TAAGCCCCCTATCCCCTCTTCCCTCCATCTGCCTCT	aaa``^^__aaaa_\aaXaaa^`^``a^`]V]\_`a	chr10.fa		3299929	F	36	55					
+HWUSI-EAS610	1	4	81	188	96	0	1	CTCCCACCCACTCCTCCTTCAGCAGCCTGGTGTTCC	`_aa___aa``^`a```aa_`Va`^a`\\RR\TR\\	chr10.fa		3299984	F	36	119					
+HWUSI-EAS610	1	4	24	1311	160	0	1	GACTGAGTGAAGGGACCCCAATGGGGAAGTTAGAGC	a`^a`_VZZ]`a^]]\\]a_`a^_YY][YS^\VY\B	chr10.fa		3300242	R	9C26	5					
+HWUSI-EAS610	1	4	14	333	947	0	1	CCCCACCTGGGGATCCATCCCACATGCAAACACCTA	aabaa_a^V___a`a]`___a`aa^_^_``^``^Wa	chr10.fa		3300399	R	36	7					
+HWUSI-EAS610	1	4	73	1311	60	0	1	TGGTTCTCCTGCCTCCACTGCTTCAGTTCTGGGGTG	aa`\VZ]UUTV\UVOV`YY]XPJPPSTZPQQUTUU_	chr10.fa		3301136	F	36	117					
+HWUSI-EAS610	1	4	71	137	723	0	1	ACTATGCTGAATGTAATGGTGCACACCTGTCACCCC	\_]a_aaaa^[_a[`_]_aZa`^a_ba`\^aaaaaa	chr10.fa		3301166	R	36	119					
+HWUSI-EAS610	1	4	63	403	771	0	1	TGCCTAAACGTCACAGCACCTGTGTCAGTCTCTGCC	[b^Z_aa``aX]R]b``ZZab`]^XWZ_Z\U\U]`a	chr10.fa		3301207	R	36	119					
+HWUSI-EAS610	1	4	97	850	1311	0	1	GGTCCGTTGAGCCTTGGAGCAGAGCACCTATCCACT	VVY_^]V_\_VX^\T]_]\\bbaaaab^__YRTYVX	chr10.fa		3302143	R	36	119					
+HWUSI-EAS610	1	4	73	1277	658	0	1	ATGAGCTAGAATTAAGGAGGGGCTGGAGAGGCGGGT	a`aaaab_a_a_b`\_a`aa^`_\````^_Y\Y\UB	chr10.fa		3302387	F	36	115					
+HWUSI-EAS610	1	4	84	1342	182	0	1	GTGTGTGTGTGTAGGCCAGGTACTGCTCCTCATGGC	aU_VWN]YXQ[QW]V`[^W\P]\TKPSUY^V^YNTB	chr10.fa		3303998	F	36	113					
+HWUSI-EAS610	1	4	57	1098	464	0	1	ACTGCTCCTCATGGCATGGCCCATGGTTTGAGATAT	__bbaaa`[_aaa_a`_aa`a^\___Q`XHN`Z_^a	chr10.fa		3304019	F	36	118					
+HWUSI-EAS610	1	4	18	918	607	0	1	GACACTCCAGAAAATTACTGAAGTGAATGTCCAAAT	aaaaaaaaaaaa__aaaaaa_`a\abaaa``a_a`a	chr10.fa		3304264	R	36	119					
+HWUSI-EAS610	1	4	1	775	1063	0	1	ATTATAAATTAGAATGTCCTCCAACTAAGTATCTGA	aabaaaa`a`aa`a`a^_aa`^aa^a`a`^`_^```	chr10.fa		3304523	F	36	119					
+HWUSI-EAS610	1	4	78	1603	1741	0	1	AGTGGTAGTAGGTGGGTTGGTGAGCAGGGGGAGGGG	aa]`_^[`SRa_N_`_P^__P_[`ZTa`\_`S\``_	chr10.fa		3304745	R	36	7					
+HWUSI-EAS610	1	4	57	716	1206	0	1	ACAATATCGATAACAATATCAATCAACCAGACTCCC	`aaababababbb_aab^babaa_aaa`aa`_`_``	chr10.fa		3304946	R	36	119					
+HWUSI-EAS610	1	4	3	1267	1400	0	1	TTTGTCTTAACTCTCTCCTAATAGAAGAGGCCAATG	aaa`[_``__]`^_]_Y\``_a\`][ZW__XXX]\]	chr10.fa		3305501	R	36	119					
+HWUSI-EAS610	1	4	100	187	135	0	1	GTGGCTCAGTTGACCCCTGCTGAGACTGAAGGGTTA	aU\aaaYLUY\^`_`_^Y[^[\S]ZSZ^[Z_Z^M[[	chr10.fa		3305689	F	24C11	87					
+HWUSI-EAS610	1	4	87	1222	449	0	1	ACATATGCTATTCTGTCCCTTTGTATCCCAGCCTGG	aa]aT]H_aaaaa`a_`aa``a_U]aa_[a___[__	chr10.fa		3305768	F	36	118					
+HWUSI-EAS610	1	4	92	1225	949	0	1	ACGAGAGTGGAGACAATGCTTTTGCACAAATAAATT	a\bXa`bHab^]a\^^^a^a_``b_Y_W\\_\a_a_	chr10.fa		3305976	F	36	118					
+HWUSI-EAS610	1	4	32	211	1644	0	1	ATGCTTTTGCACAAATAAATTCAAAGAATGTTTAGT	aabbaaaabb`baaaa^`aaa`\ZXa`Taa`a_aa]	chr10.fa		3305991	F	36	119					
+HWUSI-EAS610	1	4	64	1287	1626	0	1	TTTACCATGCACGGTTTGTGAGTTCAGCTAAGTAGA	aa^a_a`_`]`_``X_``Y^a_YU[_`]`[X_X``Y	chr10.fa		3306207	F	36	119					
+HWUSI-EAS610	1	4	16	354	1188	0	1	CCCAACTTTGCCCCATTAACTAGCGTTAGATTCTAA	aa_WT\bWRFP\Uab^OWUUZ^O^SV__WWRW\SBB	chr10.fa		3306477	R	36	108					
+HWUSI-EAS610	1	4	7	434	370	0	1	CACACACACATACACACAGACATGTGTGCACACATG	ababaaabaabb\aaaaaaaaa`^Pa]a_`\aaa`a	chr10.fa		3306558	F	34C1	6					
+HWUSI-EAS610	1	4	85	463	2034	0	1	AGGCAAGTGTGCTTGTGCGTGTGCTATGCATGTGTT	[[]`Z]ZP]SP_\_VT\\DW]Z[[a[`^^`]][V^`	chr10.fa		3306596	R	36	116					
+HWUSI-EAS610	1	4	21	276	770	0	1	ATAAACAAAATTCTACCTCACCACCTGCAATCTAGA	a_`_a`bY__a_____`[__`a_``]_``V`^_^]\	chr10.fa		3306743	R	34T1	85					
+HWUSI-EAS610	1	4	56	621	1985	0	1	CAGAGTGCCACACAACAGCACATAGTTTACATATAA	ab``X^aaaaaaa_aa_aab`aaa__a`aX`a``aa	chr10.fa		3306821	R	36	119					
+HWUSI-EAS610	1	4	63	1198	238	0	1	TCCAGAAGAGAAGCCCGGGATGACTAAGGCACAATC	`UQWX]XP\W\UROWUVQYSYVUQFVSVPMRURWUT	chr10.fa		3306880	R	36	116					
+HWUSI-EAS610	1	4	75	1665	1712	0	1	GGAATAGGTGACACAGGTGACTGTAATGAGCACAAT	aYY^]__[SVZ\_VYL\XXFJZYW_U]WZ^ZVXZU`	chr10.fa		3307111	R	36	117					
+HWUSI-EAS610	1	4	50	825	261	0	1	AGCCAAGAAGCCAGACACCTGAGATGACAGCAGCAG	abb_]a_NUbbaa`abb_aa``a`aba`_`^`a`Za	chr10.fa		3307209	R	36	119					
+HWUSI-EAS610	1	4	99	531	2023	0	1	AGAGTGCATTCCCTGGTAGTGTTTCTAGCTCAGCGG	TY\_Zb`bb^a^`b`[YV__]HV[[``[b``a\DX`	chr10.fa		3307967	F	23G9T2	77					
+HWUSI-EAS610	1	4	99	1611	1621	0	1	GGACATTTTCTTGACTGCTAACTGATGTTGGAGGCG	aa__``aaa_``_b`__]^__]W^^^]]`__U]^Ya	chr10.fa		3308536	F	36	50					
+HWUSI-EAS610	1	4	67	358	1812	0	1	ACACTGTGGAGGAATGCTAATGACTAGCTTGCTCCT	a`R]^^S`__a[W^P[__`Z\LX_U_T]UW]\LR_Y	chr10.fa		3308646	R	36	118					
+HWUSI-EAS610	1	4	34	37	1402	0	1	ATCTTCTATCCTTGCAACCCTCTGGAACTGCTTTCC	HZ_aab``abbbbb_Tabbbaabba^ab____babb	chr10.fa		3308890	R	36	118					
+HWUSI-EAS610	1	4	31	773	1709	0	1	GACTTGGCAATGTAGAGACAGCCTGTTAAACATGGC	`X]`]]b]`^abWX^[^`aaa`a_a_a`aa_a[\^^	chr10.fa		3309181	R	36	119					
+HWUSI-EAS610	1	4	58	1786	168	0	1	AAAACACGCAATACGGCAAACCAGACAATACATTAG	aaaaaa``_]`Xa]U]]^]`TYZDHX_`TOKWX_WB	chr10.fa		3309226	F	36	111					
+HWUSI-EAS610	1	4	88	831	1463	0	1	ACGCAATACGGCAAACCAGACAATACATTAGACATT	_^bX]ab^Y_`Va\_b]`aYZZ_aaa_`_^aWP\`a	chr10.fa		3309231	F	36	119					
+HWUSI-EAS610	1	4	23	291	1087	0	1	TAGGCACATCTTTCACTGAGGCCGGACAAAGCAGCC	_aababababaaaabaaaba`bbaaaaa`aa`aa`a	chr10.fa		3309634	F	36	119					
+HWUSI-EAS610	1	4	10	1102	51	0	1	CACATTTTAGGAGGAAGGCGTGTAGGGGGAAAGAGA	abb^Z]aaaa`a`X`a`[Q]P_X_YP]_[_ZSY\aa	chr10.fa		3310100	R	36	118					
+HWUSI-EAS610	1	4	58	477	1515	0	1	TAATTGTCCTGCACATTTTAGGAGGAAGGCGTGTAG	a``babaZ\`]`\`aaaab`]`[`aV]aa`b`b\\a	chr10.fa		3310111	R	36	119					
+HWUSI-EAS610	1	4	24	1122	358	0	1	ACAGCTTCACGCAGTCAGACATGCTTTTTAGTCTGC	aa]a_`__a\\`^\S[_]\]``][^^^[_^_VV^ZB	chr10.fa		3310770	F	36	114					
+HWUSI-EAS610	1	4	48	361	1282	0	1	GGGTTCATTACCAGGGAGCGCATGCGCAGGCATCTA	\``U``__a`a`\]^^]R]^`[abb`baaabba`^V	chr10.fa		3310849	F	36	26					
+HWUSI-EAS610	1	4	31	551	1058	0	1	AATGAACCCATGCCCTAGATGCCTGCGCATGCGCTC	aaZ_Z^^^]]ZZ_VZ`WT][^\J^V[KVUSLO^]`^	chr10.fa		3310864	R	36	117					
+HWUSI-EAS610	1	4	37	1326	1722	0	1	GCGCTCCCTGGTAATGAACCCATGCCCTAGATGCCT	`a^b`Q_]aaa]Y\^ZabaX^^\]\^\^[\^\a\]_	chr10.fa		3310876	R	36	50					
+HWUSI-EAS610	1	4	22	1562	1169	0	1	AGTCAAGTAGACCCAACAGCACTAGCAAGTCTTTCT	abaaaa_Sa`b_a_aa__QZ`[^___a_\^]^__]`	chr10.fa		3311154	R	7G28	95					
+HWUSI-EAS610	1	4	9	168	496	0	1	GAGATAAGATCTCCTGAATTCAGTAACTAAAATAGT	a`a`_a`a__`]aaX```]_aXa[]a``aaa_]_`V	chr10.fa		3311662	R	33G2	83					
+HWUSI-EAS610	1	4	77	614	1570	0	1	ACATTGGAGTAAGGTTTGCCTGGATATTTCCACAGG	a_aaaaa_`_`a]^UW\_Y^\]Y`__`__^^\U`a]	chr10.fa		3311751	F	36	119					
+HWUSI-EAS610	1	4	90	522	1160	0	1	ATGGTCCTATTTCCTAACCACAGCTCTACTGGGATA	```aX``aba_]^```_aaaab``aa```aa``]]`	chr10.fa		3312384	F	36	119					
+HWUSI-EAS610	1	4	22	346	384	0	1	CTCAGATATAAAGCCAAGCTCTGGACACAGATAGTC	```a``X[^`aa[aba\`baaQTV_]Y_S_a[``T^	chr10.fa		3312501	R	36	119					
+HWUSI-EAS610	1	4	4	516	929	0	1	ATCTCATCTGAGATCCCAAGTACTAAGACCTGATTG	a`a_a^a^^a_a\_^__Q]_R_`[GZ`]SZ__W^``	chr10.fa		3312639	R	36	118					
+HWUSI-EAS610	1	4	72	725	869	0	1	TACTCTTGGAGAAGGTGGACCTAGGCCACACCTTCA	aa_a_aaWUY\aaZaWaa^Y^__ZSZ\X[^^[V[aa	chr10.fa		3312674	F	36	119					
+HWUSI-EAS610	1	4	80	530	176	0	1	AACAGCACCCCGTGAAGGTGTGGCCTAGGCCCACCT	_]WR_]U\^\^XFM_]VWBBBBBBBBBBBBBBBBBB	chr10.fa		3312686	R	29T6	37					
+HWUSI-EAS610	1	4	39	538	1018	0	1	ACACACACTGGAATAGCATTTAGGGGTTATTACAGT	`ZYVWQV\]P[MWWLQTL]`X[`UFXG^P[VLGQ`]	chr10.fa		3312803	R	24T11	104					
+HWUSI-EAS610	1	4	11	1149	1912	0	1	TTTTCCATGAAATAATTTGTGGTTTCCCAATGCATG	Y]\S`K]_aS__aa_b]\SN__Y]YTHNX`Z`Y]BB	chr10.fa		3313479	R	36	109					
+HWUSI-EAS610	1	4	92	1212	167	0	1	TAATATATAACGATCAAAATATAAAAGAACCCATGA	W\^F]O_\baOU]VZ[aWab`]`aZMW`^[a\^_^a	chr10.fa		3313523	F	3A32	107					
+HWUSI-EAS610	1	4	45	1513	573	0	1	AAATAACGTTGGCACGTTGGCATGTCTGTGGGGGAT	]bb_WOW^_a]_a`aaQZUMXPZX^Q^VQGHXVXX]	chr10.fa		3313644	F	36	116					
+HWUSI-EAS610	1	4	48	1153	1430	0	1	ACAATTCTGGAACCTCTGTTGCCATTTGGTTACATG	_XY_Z^P^_^VMOT]S]OR`VKZHW\WSX[`BBBBB	chr10.fa		3314052	R	36	95					
+HWUSI-EAS610	1	4	20	40	94	0	1	ACATGCACTTATTGATGTATATTTATTTATGTCACA	aaYabaaaaaaaabaab^aa`aaaaaaaaaa_aaaY	chr10.fa		3314352	R	36	119					
+HWUSI-EAS610	1	4	100	28	98	0	1	TGACCCAAGCATGACTGCATGACTGGATGGCCTGGA	T_baaa]]babT]]Z_aW\a`]aa^ba`aa_aW^aB	chr10.fa		3315169	R	36	114					
+HWUSI-EAS610	1	4	98	1487	2040	0	1	ACAGAAACATTCCATGTAAACGTCACAGATTAATCT	aba_]^Ibbaa`aaba_Wa`^aZZ`MGGVa`\V\_b	chr10.fa		3315618	R	6C20T8	92					
+HWUSI-EAS610	1	4	22	451	1502	0	1	CACCGCCCACACCCAGTCTTTACCTTCCTTGCATCA	aaa`a^^aaaaab]`\Qa`]aZ_aaa`a^_a]__[V	chr10.fa		3315982	F	36	119					
+HWUSI-EAS610	1	4	81	688	558	0	1	ATCACTGTGCCTTCCAAACCATGACAGACCCCAACC	aaa^X_]PZ\]SWQ]`\T^HQ^_ZXPVYFJZNYWBB	chr10.fa		3316070	R	36	107					
+HWUSI-EAS610	1	4	28	1165	11	0	1	GCGTGTTGAGCCTCTTTAATGCAGTCTGGGATCTCA	^PHXSXa][^^Z`_a_aTPa`^_XN\\^ZMUZW_`_	chr10.fa		3316158	F	1A34	97					
+HWUSI-EAS610	1	4	64	1447	1129	0	1	TTTGGCTTTCCAAACACCCTTTGCAGGGTGGAAGGC	aba][^`^``_[a`Z`[^``^YLY^__^W\[\__\\	chr10.fa		3316348	R	36	119					
+HWUSI-EAS610	1	4	55	1722	178	0	1	GGTGTTTGGAAAGCCAAAGAAATGCTCACGAGTCGA	RPPUXa`NX^_YNWa`b_VX`_]_[_[_^LX]]ZJ]	chr10.fa		3316366	F	36	117					
+HWUSI-EAS610	1	4	83	516	740	0	1	GGCATAGTCTTGTATGAATAAATAAAGATGTCCTCT	abaabab_abab_aaaaaaaa_aaaaba`a```aaa	chr10.fa		3317199	F	36	119					
+HWUSI-EAS610	1	4	63	1512	807	0	1	GGAGGGAGTTCTTGTTTAAAGAGTCTCACTTTGTAG	aQY^^^_VNU```VY_\VU`b`X[Y\S_V__]N[_[	chr10.fa		3317594	R	36	118					
+HWUSI-EAS610	1	4	83	1450	878	0	1	TGTCATTAGTGAACAGTCCCACATTTTTTTAAGGAA	abaaababa^aaaaba``baaaaababaaabaaa`b	chr10.fa		3317735	R	36	119					
+HWUSI-EAS610	1	4	93	1705	756	0	1	TGTTGACAGGAGGGTCCATGGTGCAGAGGAAGATGA	aa`a_a_a_``RXMM`VIW]STRZXOV^\\PPZ[Z^	chr10.fa		3317884	R	36	117					
+HWUSI-EAS610	1	4	65	1383	793	0	1	AGCAATCCATTCTTACCCAAGCTGTTGACAGGAGGG	UT`Z^^V^_a^``\^\_`_Zaa`K_b_TZWHHM[ZV	chr10.fa		3317906	R	36	117					
+HWUSI-EAS610	1	4	14	683	465	0	1	GATTGCTCTGCAGAGCATTGCATCCTATAGGGTGCC	a_bababa`a`abaa``_]aaaa]`aaaa^]`V`a\	chr10.fa		3317935	F	36	119					
+HWUSI-EAS610	1	4	80	1098	762	0	1	GGCACAGATAGGAAAGAGGGAGGGATTGCATTTAGA	ab`a``baaab_aa```aba^a`^^__`\]_``Z^W	chr10.fa		3318544	R	6C29	80					
+HWUSI-EAS610	1	4	66	621	1772	0	1	AGTGTTTGTTTGTAGCTCCTTGTCTTCTTCACCCTC	`b[a_ba`[`bb^Y_a^]LU]QYZ^aO_\_^J\X_^	chr10.fa		3318840	F	36	118					
+HWUSI-EAS610	1	4	28	737	1265	0	1	GACCTGGCTAGCTGGCTGGTCAGTCTAGCAATAATG	aaaa^[a`_H_[a`a``aaUa`^Z_]X^X___\_RV	chr10.fa		3318914	F	36	118					
+HWUSI-EAS610	1	4	85	611	1106	0	1	GGCTAAATGTCCCTGACCTGTAGTTTAGACATGCCA	aa`aaaa`a__aXaa[`]aa]]a^`__a_]]__^]_	chr10.fa		3319246	F	36	119					
+HWUSI-EAS610	1	4	32	115	876	0	1	ATGTGGCATGTCTAAACTACAGGTCAGGGACATTTA	aabaabbaab`baa[[aa`aYab[abbababaa`ab	chr10.fa		3319249	R	36	119					
+HWUSI-EAS610	1	4	28	651	91	0	1	TGATGAGTTAAAGACCCCTACGGAAGCTGGTGTTGG	`b_a^Z[_a_TD[__`\___]]`\^^VV^\W_Y\_\	chr10.fa		3319290	F	6A29	85					
+HWUSI-EAS610	1	4	97	591	1684	0	1	TGATGAGTTAAAGACCCCTACGGAAGCTGGTGTTGG	\WZ\a[``abZ]a_aW[`]GXaTa_]YXWaY`Y``a	chr10.fa		3319290	F	6A29	81					
+HWUSI-EAS610	1	4	24	5	1217	0	1	GGCAAAGGGAGAGTATGCCTCACTGTACAAAATTGT	aa`Z`_aa^_^Y^^__a^[Q____]W_`WLUNUNWB	chr10.fa		3319450	F	36	114					
+HWUSI-EAS610	1	4	20	123	994	0	1	GTGTATGAAGAAGGTTGGGGACCACATGGATAGTCA	a^aURX[^aaWROY[_YLXXZ``PUEY[XYYUXN_V	chr10.fa		3319568	F	22T13	79					
+HWUSI-EAS610	1	4	11	1512	657	0	1	ATGTTGAATGCTGGATATGTTACCACTCCACTGCTC	ZZ___[_]ZMU\WZ^Z_\]S\LHRRIM]XXY\UPZ\	chr10.fa		3319609	R	36	116					
+HWUSI-EAS610	1	4	82	535	1345	0	1	ATGTTGAATGCTGGATATGTTACCACTCCACTGCTC	aaaaaba``U`_`a``aaa`aa_a`^_^`___]_``	chr10.fa		3319609	R	36	119					
+HWUSI-EAS610	1	4	89	736	770	0	1	TGCAAGGCTTGATGATGTATGTTTGTAATTCTAGAT	aba`^^P`b]a^aa`ab\_aaaaa_Y_`a``__a`a	chr10.fa		3319953	R	36	119					
+HWUSI-EAS610	1	4	60	1194	177	0	1	AAGCCAAAAACAGTAAAAGAAGCTGCAGTAGGGGTT	`^\Y_[VRUJTaa_[RYYaa_a``ZYR]QLYZ]_R`	chr10.fa		3320692	R	36	118					
+HWUSI-EAS610	1	4	26	801	1318	0	1	TTCCAATTCTAAGAAAAACATTCTAGTCCTCCATTT	aa````aa_```aaaa_[^aaa_a_`^_\`Z^]`aa	chr10.fa		3320740	R	36	119					
+HWUSI-EAS610	1	4	82	999	440	0	1	GAACTGAACAGAAGAATCATAAGGAACAAAGTCCAA	^Za_a^_a_aaaaa_aa`a`a_aa_b_`_]a^_^``	chr10.fa		3321358	F	36	119					
+HWUSI-EAS610	1	4	49	1711	619	0	1	AGCACCTTCCCAGTGTGCGTTAGACCTCTGGGTACT	a]aa_aa^`aa]MJ]U_\]]^YU^]^\^YQVUUUU[	chr10.fa		3322377	R	36	118					
+HWUSI-EAS610	1	4	74	1217	1545	0	1	AAGGACTTGTAACTGCTGAGTCATCTATCTGCCCCA	aSZa^W]\\V`a]Z^a^`]]aaa__aaa_WUW\_aa	chr10.fa		3323002	F	36	119					
+HWUSI-EAS610	1	4	71	1158	489	0	1	TAGAGACATGCCTGAGTCTGAGTGCAAGGGTAAGAA	X_a_```ba``^a_UaZ]ZX\^Xa]`_Y[ZV^[U[`	chr10.fa		3323069	F	36	119					
+HWUSI-EAS610	1	4	48	845	1198	0	1	TGTCTAATATCATCTCCTCTGAAAGAAGATGTGAGT	aba`baaa`a`ab_a`___baa```_^a]aa]a^a]	chr10.fa		3323172	R	36	119					
+HWUSI-EAS610	1	4	20	225	1789	0	1	TTTGTTATTCTAATTGATGAACCAAATGAGAATAAA	abab\abaababaaaa`_`]aaaaaa`a`a^^^\[[	chr10.fa		3323479	F	36	119					
+HWUSI-EAS610	1	4	66	672	524	0	1	GAAGAACAGCGATAGATAAAGGTATTGGCAGCTTCA	`aa_^a`\][`]WLV[O^V\X\UW]]YRBBBBBBBB	chr10.fa		3323542	F	31A4	81					
+HWUSI-EAS610	1	4	62	820	1969	0	1	ATTTTGGGGCAAATTAGTTTATTATCCCCTCAGTCT	\]b[aZX_a]]ab_a___baaba[]XU`aYGZ]YJW	chr10.fa		3323658	F	16T19	82					
+HWUSI-EAS610	1	4	65	1375	1855	0	1	TGTCTCAATAGTTAAGATCAATTCATGCTCTTACGG	]b`aba\baba]ba`bb`]aaaaaba\_aaaabab^	chr10.fa		3324608	R	36	119					
+HWUSI-EAS610	1	4	100	523	582	0	1	TTGGAAAACTGGATTAGACCGGCTCTGAAATCCCTT	ab`]`a___aaa_aa__aa`a__^Wa_^_]ZRUYLX	chr10.fa		3324971	F	36	118					
+HWUSI-EAS610	1	4	57	653	478	0	1	AGAATGCTTATCGTGAAGAGAAATCAGGCTGTAGAT	aaaaabaab`aab`ba`baaaaaa`aaa_ab_^\_`	chr10.fa		3325096	F	36	119					
+HWUSI-EAS610	1	4	79	1450	998	0	1	AAAGCCTGTAAGACATAATCTTCCCCCTTCTGATAC	\a_bVJI^Habaa`bb`b]LY]a``aaa[Z]aZQ\a	chr10.fa		3325648	R	36	117					
+HWUSI-EAS610	1	4	67	1156	1199	0	1	GGCGTGCGCCACCACCGCCCAGCACTAGAATATTTT	ab`babaaa`aaaaaaaa`]`]^a^aaa``a`a_`a	chr10.fa		3326080	R	36	67					
+HWUSI-EAS610	1	4	46	465	384	0	1	GTCAGTGAGTCACGGTGAAGGAGGCTTGCCCAGTCT	T`ab\Q^bb`ba\^T_T]`a`Waa]Z^R]a]X\YYW	chr10.fa		3326276	F	36	119					
+HWUSI-EAS610	1	4	54	1570	219	0	1	CACAGTCAATTCTGGAAAAAGTCCAGTGGTGCCCTA	a^a]TR^`\a^^ZFTZZ`S`RV]aXBBBBBBBBBBB	chr10.fa		3326589	R	36	70					
+HWUSI-EAS610	1	4	23	175	645	0	1	CATTATGAACAGGAATGAGACATCTGGGTTACAAAG	aa`a^\b\bbaa__\b`^```aa`a```Yaaab`aa	chr10.fa		3326792	F	36	119					
+HWUSI-EAS610	1	4	47	647	546	0	1	CAGTGTGCAGGTTGGTGAGAAGGGGAGGAAACCCAG	a`a]a`a`a^__aaa^aaa]Y^__`^a_a`^\_\`a	chr10.fa		3331116	F	36	119					
+HWUSI-EAS610	1	4	74	614	311	0	1	GGGAGGAAACCCAGCTTTGGTGGCCATCAAGGATAT	`b`]_a`\_\`ba^X_Xa`^RZVP[ZQU^]ZV[^ZX	chr10.fa		3331138	F	36	118					
+HWUSI-EAS610	1	4	64	1213	1154	0	1	TGGATGGGTGCAAGCTTGCATGAACTTATGTGTACT	a^a]a][YU]`__a\a_a__aaV]G\_]`__]VUS[	chr10.fa		3331544	F	36	118					
+HWUSI-EAS610	1	4	78	610	1188	0	1	CATCTCACTGGCTCCTTTTACTTGGAGAAGTACCTC	abbababaaa`aaaaabbbaa`a[^^`]``]_a^a_	chr10.fa		3331826	F	36	119					
+HWUSI-EAS610	1	4	66	968	1506	0	1	GGGGAGAGGTACTTCTCCAAGTAAAAGGAGCCAGTG	^baa`]aaa_a`aa^a``^_a_a`a`[^`\Z\[a__	chr10.fa		3331831	R	36	119					
+HWUSI-EAS610	1	4	83	776	844	0	1	TAAGCCCCAAGCACTGTGCTTGGCACACGGTCCATC	`bbaa`_`b`aaaa`aZ_`a`a`Z`^]`aaVYM^]X	chr10.fa		3331986	R	36	119					
+HWUSI-EAS610	1	4	15	1144	1717	0	1	CGTTGTGCCTAAGCCCCAAGCACTGTGCTTGGCACA	T`]Tb`_MX`bUZb^_Taaa^I]\aaba]_]`aaSa	chr10.fa		3331995	R	36	118					
+HWUSI-EAS610	1	4	85	1371	1749	0	1	CTTGTATACAGATTCTCAGGTTCAGTGCTACCCCAC	abbb`ba_aabaaaaaabba^a`ab^aaaa__`_`]	chr10.fa		3332075	F	36	119					
+HWUSI-EAS610	1	4	65	162	2003	0	1	TTCAGTGCTACCCCACATTACCACTCATCTGAAAGA	aababaaaaaababa_S[^]```a^_V_``a[O\]W	chr10.fa		3332095	F	36	119					
+HWUSI-EAS610	1	4	6	906	895	0	1	AGAGACCATTTCCTCAGTGAAAGCTGAACTTACTTT	a_J\^_SQ\W[]T]^^`X[]_\_\^[X]X^]]W^YT	chr10.fa		3332128	F	36	118					
+HWUSI-EAS610	1	4	18	1777	94	0	1	TCAAAGTCCAAATATTCTAAGTACACCCTTCCGATG	_Xb`a[G`baab`a___bab_^b_a_`aaaa`Y`]]	chr10.fa		3332163	F	36	118					
+HWUSI-EAS610	1	4	43	1503	1269	0	1	GCTTGGCAGGTAACCTTAAACTCTGGTTAAGTTTGG	a`aa`aaa_a]`a[_`a`\`]`]__`Z`YY`W^__`	chr10.fa		3332408	R	36	119					
+HWUSI-EAS610	1	4	32	1183	1084	0	1	GAATTCAGACCCTAAAGATAGAATCCCACAGTTAGA	_aaaaaaaa_`_aa`aaa``a`_a____]``U_`a_	chr10.fa		3333322	F	36	119					
+HWUSI-EAS610	1	4	53	1393	129	0	1	GGTGATAGGGAAAGACTCTTAAAGCTGACGTCTGGT	aa]\HQZJOTKLJZQNPSVH`[BBBBBBBBBBBBBB	chr10.fa		3333733	R	29C6	52					
+HWUSI-EAS610	1	4	64	1633	1831	0	1	ATGGTGACATTCACCTGTAAACCCAGCATTGGGGAC	^_a]Q]VWX_YRXZXa^UVXZ\Q\YMLV_ZRFTWYZ	chr10.fa		3333877	R	36	117					
+HWUSI-EAS610	1	4	86	773	424	0	1	CCTGCCATGCAAATGTTAAGACCTGAGTTCTATCCC	aabb``bbbbbbbbbabbbbbbabbbbabbbbbaaa	chr10.fa		3333936	R	36	119					
+HWUSI-EAS610	1	4	19	80	1190	0	1	GCAGGCACTTCACAAACTGAGACAACTTCGTGAGCT	aaK\\aY^Zbb`]\_[a`ZPUY^]\`_[a]KUQ^_W	chr10.fa		3333967	F	36	118					
+HWUSI-EAS610	1	4	41	1189	1476	0	1	TTGTTATTAGTTTTCTCCATAGCTTTCCTCATTGAT	a`a_a]a`__[a_____^__]_[____^]]]_^_]`	chr10.fa		3334270	R	36	119					
+HWUSI-EAS610	1	4	21	1244	1035	0	1	AATAGTTTCTCAAGTGCTAGTGCTAGGCTGGTGAGC	aaaaZFGXaZ_]_ZT`^[Y[RPT]_]T_HYQRNU]]	chr10.fa		3334508	R	5A30	106					
+HWUSI-EAS610	1	4	54	847	1790	0	1	CTGCAGCTTTCATCCACTCTGTGTCACTGTCCTTCA	abbab^`aaaaaba_aaaaaa_a_`a^aa_`^a``a	chr10.fa		3334951	F	36	119					
+HWUSI-EAS610	1	4	45	61	1512	0	1	GATTTATAAATATACTCTGTGACTTTTAACTTCGAG	a]b\bb_U\`]`aaaab`^]a^aaa]a`aa]`bbXa	chr10.fa		3335588	F	36	119					
+HWUSI-EAS610	1	4	79	56	1275	0	1	CACCTGGCTTCCTGTGGTCCCTGAAGCTTCCTGTGG	`_a^^`\a__a_\`[`[IW_`R`\[]aZZ^`Z\RZ\	chr10.fa		3335759	R	36	118					
+HWUSI-EAS610	1	4	49	1241	1337	0	1	AGTCTCGGAGAGTTAATACAGACACTGTAATGCAGA	abaaa_aa[`]a`aaaaa`_a`_`]`_^^_XWY[]W	chr10.fa		3335968	R	36	119					
+HWUSI-EAS610	1	4	75	829	1201	0	1	TGGCATTCCCCTACACTGAGCCTTCTCAGGACCAAG	a`b`ab```aaab``^abaaaaaa`aaaa]a```\a	chr10.fa		3336458	R	36	37					
+HWUSI-EAS610	1	4	33	1408	1706	0	1	TTCTAGCCTGTGACAGCTCACCTGTGTAGCCATGTA	_[QW]\KTXTWZZY\X_Q]XTWXQU_H`aYLLZ\^S	chr10.fa		3337204	F	36	117					
+HWUSI-EAS610	1	4	48	554	1739	0	1	TTCCAGCCTGTGACAGCTCACCTGTGTAGCCATGTA	aaaa^_^]`aa__X_Z]^^\a`]aZ`^`a\XT[aS_	chr10.fa		3337204	F	3T32	81					
+HWUSI-EAS610	1	4	63	838	702	0	1	AGTTGCTTGCCTACCTTTACTTATTCCAAAGCACAG	aaR^aYQUaWaaYV[TV]]_[XV`]YU`WGVTW_S`	chr10.fa		3337291	F	25T10	88					
+HWUSI-EAS610	1	4	44	1282	552	0	1	GGAAGAGAAAAGGCAGAGGGCACTGAAGGAGACAGC	aba`a`]_`a_^[U\a`]`a`aZ_\V^_\[[^\_a^	chr10.fa		3337436	F	36	119					
+HWUSI-EAS610	1	4	92	482	1016	0	1	GTTTATTAAGACAACGCTTATAGGCTCCACTACTTT	a\W_]V`W_a^_a][_]_\[\^Q__^]ZXXS^]^][	chr10.fa		3337722	F	36	119					
+HWUSI-EAS610	1	4	43	1103	1717	0	1	TGTTCTATTCCAAGAACTACAACTCCCAGCATTCCA	[aPS\bZaa^NHU][_\ba_]ba`VH`aa``ba`_a	chr10.fa		3337771	F	36	13					
+HWUSI-EAS610	1	4	43	1395	833	0	1	TGTCACCATACAGATTTGCAGTGGAGTCTGGAAAAA	abaab_aaa_^`^`aaa``aa`][]]X_]`a^__aa	chr10.fa		3337932	F	36	119					
+HWUSI-EAS610	1	4	73	539	994	0	1	GCGCACACTGCAGCGATTTCACCAACCAACCAACCA	a_b^Y`V^]a`Za^`KXaa`_Z^ZaZ``bMYM[T_Z	chr10.fa		3338305	F	36	118					
+HWUSI-EAS610	1	4	45	1771	1325	0	1	ATTTCACTGCAGCTTTTGGAGACAANAACAGATGAC	aa`a`a\`_^aYZ`_aa_``[^^_ZDX_]^^]]Z]]	chr10.fa		3338461	R	25G10	110					
+HWUSI-EAS610	1	4	95	1298	878	0	1	CATCCGAACCATGGTAGAGTGCCAAGTAGCACTAAG	`abb`aaba`aaba_bbb[H^aaaaaU``aaYabab	chr10.fa		3338500	R	36	118					
+HWUSI-EAS610	1	4	74	924	606	0	1	TACCATGGTTCGGATGAGAGGGAATCGTGAGAGAGT	a_aa`aaa_a`aa\^a_a`aa`[_`__Za^_^`\`\	chr10.fa		3338520	F	36	119					
+HWUSI-EAS610	1	4	62	144	272	0	1	TGCAATGCAGAGCATAGGCCAAATATAAACCTTTAA	abbbbbbb_babbba_aabbaa_aaaaabaaaaa_a	chr10.fa		3338638	F	36	119					
+HWUSI-EAS610	1	4	41	1519	133	0	1	GTTCCGAGAGTCCCTTGGATCTGGAGCTAGCAAAGA	\`b`baa[_X\`aaa``_`a__HSZQ^^RY\`^\Z[	chr10.fa		3338744	F	36	118					
+HWUSI-EAS610	1	4	28	296	1477	0	1	AGAATGTATATATGCATGTGGTCTAAGGCTGGTATA	X\\X\b_a_\aa]baaaa^aa_aaab`aa`aaU^_a	chr10.fa		3338852	F	36	119					
+HWUSI-EAS610	1	4	62	1375	551	0	1	CACCAGGAGCATTTGGTCAGGAGGTACGTGCTGTTG	abaaaba_aa`aaa`a^]aa\^^^\_`a\a`][_``	chr10.fa		3339973	R	20C15	86					
+HWUSI-EAS610	1	4	12	1371	1758	0	1	GTACCTCCTGACCAAATGCTCCTGGTGTCAGTCAAG	a^`^X\XTNR[WR\_a^]RPYU___Z`VWWYTRP\_	chr10.fa		3339982	F	6G29	89					
+HWUSI-EAS610	1	4	78	1392	86	0	1	AGGGGAATGGTCTCTGCTCTAGTAACTGCATGGTTT	N\_XX\S^\SZ`Z`_T`a`a\\RR\aWV]aRQHFU`	chr10.fa		3340016	F	36	116					
+HWUSI-EAS610	1	4	100	1599	895	0	1	AGTTAATCTGCTTTTTAGAAGTATCAGTTCTTCATT	aaaaaaa`aa`aaaaa`a```X`a__`_a^a___aa	chr10.fa		3340232	F	36	119					
+HWUSI-EAS610	1	4	97	698	1794	0	1	ACTTGGATACACATACACACAATGACAGTAAAAAAG	_aaaa`_`[`a`a_]_a`````aabaa[\a_a_`Xa	chr10.fa		3340371	R	36	119					
+HWUSI-EAS610	1	4	2	1446	1021	0	1	TGTGTGCATATTGTGTGTGAGTGTGCATGTGTGTAT	ab\a]U[a_`_`a^a``XaXa]`^`_]_a^_X___a	chr10.fa		3340412	F	36	119					
+HWUSI-EAS610	1	4	13	1535	35	0	1	TGCATGCACACACATATACACATGCACACTCACACA	a`O`YV_a_a_a`aZ^__a_\\ZS\`]]SXSYY^WY	chr10.fa		3340425	R	1A14C19	15					
+HWUSI-EAS610	1	4	76	156	411	0	1	ATGTGTATGTGCATGTATTTATGTATATGGTGTGTG	_bbbbbaUa]bab`b^U`^V`bb\\^\aab`bab`a	chr10.fa		3340611	F	36	119					
+HWUSI-EAS610	1	4	15	306	668	0	1	TCATCACTTTAAAGTGACATGGAAACATTTGCTGCA	a`^[__b]b\babbR`aa_]`abaabaab]a[`Y^a	chr10.fa		3340760	R	36	119					
+HWUSI-EAS610	1	4	27	300	929	0	1	ACAGGCAGCAGAGCAAAACCAATGACATCATGTGCT	ab`aababaaaaa`Z`ba^b[aaaZ_V\^Zaa]a``	chr10.fa		3341233	R	36	119					
+HWUSI-EAS610	1	4	47	562	1284	0	1	GATGTCATTGGTTTTGCTCTGCTGCCTGTTGTTGGG	a_Y_Vaaa^\`_RHXVQ]`P[Xaa]NZ]]]^^\a_a	chr10.fa		3341240	F	36	118					
+HWUSI-EAS610	1	4	13	521	488	0	1	CAAGAAAAGTGTACTCTTGAGATCAGCAATGAGGCT	`aab^aaaaX]Ta_a^aa`_^Ya^aa_aa_a`_^_`	chr10.fa		3341319	F	36	119					
+HWUSI-EAS610	1	4	79	1610	1278	0	1	TGCCTGAGNGCTTGCTCTAATCTGTCTTATTTAGCT	aVbaa`^PDUa^__a`a`aaa``aX_a_aa__\W_`	chr10.fa		3341565	F	8T27	110					
+HWUSI-EAS610	1	4	24	1273	1871	0	1	TTAACAACACAAATATATTACAAACTTGTGCAGTAG	aaab__a``^`]^^\a`aaa\```Xa`_]a]_^W^_	chr10.fa		3342299	F	36	119					
+HWUSI-EAS610	1	4	67	466	1255	0	1	GGAGTGATATCTTGTGCAATAGCCATGGACACAGGG	a\S[`Z`aa_Y_[]RN\U[`X``[^^TRL]ZYP`[R	chr10.fa		3342453	F	36	31					
+HWUSI-EAS610	1	4	5	25	426	0	1	GAGCGAGCAGTCTGCTGATCATTAATCATAATTGTG	abbabababa\a^aaaaa_aaa_a^aaaaa_aaa^_	chr10.fa		3343336	R	36	119					
+HWUSI-EAS610	1	4	77	282	1797	0	1	TGGGAGACCGCCTTCTGCTTTATAAACAAACAGACA	abaababbbaba_ab_aaaaaaab`aa]_a`aaa_a	chr10.fa		3343601	F	2A5T23A3	6					
+HWUSI-EAS610	1	4	85	1463	182	0	1	CACTGAAACCTCGGAGCTATGAGTTCACCTTTACCA	aaaaaabbbbaMSZ]_ab`]]a_I_baa]Y]R`_YX	chr10.fa		3343874	F	3C7T24	63					
+HWUSI-EAS610	1	4	12	532	1123	0	1	TGTGGTATACGTACTTATATGTAGGCAAGCATTCAT	ab_^YU`^ba^YRZ^a`aWZb_^[`aY^`aa__`\a	chr10.fa		3344081	R	9T26	81					
+HWUSI-EAS610	1	4	40	668	133	0	1	TGTAAGGCATCATGTTAGCTGTGGGAATGGAACCTG	aa\_^][X^a`]_a_`aa```Va_PQ]]a`__V`Ta	chr10.fa		3344185	F	36	119					
+HWUSI-EAS610	1	4	58	551	1521	0	1	AATATGCCTTAAGCAGCACAAGAGCTGGGCAATTGC	a[aa`_a`aaaba``_a`]R_a^[a_]X_a___`a`	chr10.fa		3344854	F	36	12					
+HWUSI-EAS610	1	4	57	542	1768	0	1	TCTTAGCTGCTGGCATCNTTATTCATCAATCAGAAT	a`b\\_\_^]`Z`aZa[DZ^``a\a_aa`]^Za_aa	chr10.fa		3345171	F	17T18	27					
+HWUSI-EAS610	1	4	91	1105	488	0	1	GATGTACTGTTCAAAAGCTTCCTTGAGCTGATAGGC	aaW^Qb]`WX_aaa^b[]]a_a_a_[_][a`Z`a__	chr10.fa		3346115	R	36	119					
+HWUSI-EAS610	1	4	44	1647	1312	0	1	GGTTGTCCTAAAACTCGATCTGTGTTACTTGGNCTT	]`]aba`aaaaab]bXV\_Zaa^]^`^``^XPDY^a	chr10.fa		3346389	R	32T3	110					
+HWUSI-EAS610	1	4	8	247	1787	0	1	GGGCGTCTAAGGCCCCAAGCCAGTCAATTACTCAAG	a^^_X]W`[`\W_`__a^_aaZ`]abaaa`_X_^`]	chr10.fa		3346984	F	36	119					
+HWUSI-EAS610	1	4	71	1194	452	0	1	AGAAAATGCATCATAAGCTAAAGATAGTTTGAAGTT	ab\UY]\O_YV```a]a\Z^NQZ[XXHUY[XYZH\a	chr10.fa		3347127	R	35C	79					
+HWUSI-EAS610	1	4	38	1526	1512	0	1	GTGGGGTGATGGATGGCCAGTGTGTAGGTGCTTGCA	`_a^aZSaU]a^XWaa^_XZO_W]W[a`W^S]]`SX	chr10.fa		3347398	F	36	118					
+HWUSI-EAS610	1	4	61	1743	1561	0	1	TGGGAAATGAACCAGGGTCATCTGCAAGAGCTGCAT	ab]O`\UZZ^[\``aWTV\NX\VZZYXY\PV[YN\[	chr10.fa		3347505	F	36	118					
+HWUSI-EAS610	1	4	98	224	392	0	1	TAACAACTGAGACTCATTGATACCTTTCTGTGTGAC	^_`KUabbb^]WV_TTbbYVXbZa_bVaaQSa]^YQ	chr10.fa		3347981	R	36	118					
+HWUSI-EAS610	1	4	59	155	1111	0	1	GAAAGACTGAAGGGAAATTCAAATGACCTACTGTCT	\WW^\]aaa[M]aa`Y[[`][]XV`T`_][`_aWa_	chr10.fa		3348577	R	36	118					
+HWUSI-EAS610	1	4	63	382	1467	0	1	ATTATAAGCACATGCTACCACCGCTGGGATATCCAT	UR\a_K``a\[b__`\[Z`bbZXRTHY_PTR`[_WW	chr10.fa		3349089	R	7A28	80					
+HWUSI-EAS610	1	4	2	183	677	0	1	AACCTGCCCCGTGACACCTATTCAGATCCATACCCC	`W[^ba_b__b]bab]Zb_Z^`aa`[^bba^Za`a]	chr10.fa		3349341	R	5A4A25	42					
+HWUSI-EAS610	1	4	29	19	144	0	1	TTTGAGAAAAGCAAATGAAAACAGAAAGGAAAACCT	Obbb_b]^aabbaabbbba[`bababbbbbabbbba	chr10.fa		3349448	R	26G9	80					
+HWUSI-EAS610	1	4	97	995	145	0	1	TACTCCACTACAAAGTAGGCATGTGAAAAATGACTT	ab``aaa_aba`__aHb__``a`^__]`^_]_][a`	chr10.fa		3349514	F	36	118					
+HWUSI-EAS610	1	4	71	720	1273	0	1	TTGCCCACATGTCNATACTCTTCTTCACAAAGAGCA	a`bbbZ[QU_[MLDR]YY\]a[WWYa[[JTYZTR_b	chr10.fa		3349629	F	13C22	109					
+HWUSI-EAS610	1	4	86	1577	391	0	1	TTTAGAAATTCCCATTTTGATGAATAAGTAAAATAC	ababaaaaa^aaaaa`aa^a_\_aaa`aYaa`a_b_	chr10.fa		3350051	F	36	119					
+HWUSI-EAS610	1	4	2	1543	1423	0	1	ATGCCCAACTTGTGTGTTGCCTGGATTTGAACCTAA	aaa_aZ_a^`a_[`^`_``X[YT]][Y\]_ZUW[]\	chr10.fa		3350598	R	36	119					
+HWUSI-EAS610	1	4	70	1685	632	0	1	AACAACAGTATCAACCAACAAGACCCTCCAAGCTCC	OXRXRZYXXXS]WYOOXRPYa^_WQ\XZZXVNZ[YX	chr10.fa		3350778	F	36	30					
+HWUSI-EAS610	1	4	39	465	1213	0	1	AAGGGCAGGGAGGTGTGGGTGGGTGGGTGGGGTGGG	aR`aa`^PTYZa_ZaR`_ZQa__N\X`T_aKIK__`	chr10.fa		3350961	F	30T5	71					
+HWUSI-EAS610	1	4	90	1499	2012	0	1	AAGGGCAGGGAGGAGTGGGCGGGTGGGTGGTGTGGG	``aX[Z\\Y[F`ZKXUa]aN\P`RZ\[K\aK\T`ZZ	chr10.fa		3350961	F	13T5T16	82					
+HWUSI-EAS610	1	4	54	351	1453	0	1	TGATTAAGGATGTTGAAGCGCATCATCCTGAGTGAG	aaaa``]aa_aa_aa[``V`````__^_``_`Y__a	chr10.fa		3351808	F	18G17	92					
+HWUSI-EAS610	1	4	23	1202	163	0	1	AGGGACTCCTTTCTCATTCACTATTGCTCCAACTTG	aa`a]aa__``aaa_aaa`a]aa_aU]^_^`_]`a`	chr10.fa		3352632	R	36	119					
+HWUSI-EAS610	1	4	37	1349	1859	0	1	AGTGGAAACNTTGGCAAGCAGGGCAGGAATCCAAAA	ababbbbb[D\babbb_bb_bbbaaab``a`__aaX	chr10.fa		3352827	F	9A26	110					
+HWUSI-EAS610	1	4	2	1204	633	0	1	AAGCAGGGCAGGAATCCAAACATGAAAACAGTACAG	aaaT_U`a_a^I]PUSPFVZRL[[`^\]YQW\YX][	chr10.fa		3352842	F	20A15	93					
+HWUSI-EAS610	1	4	31	490	51	0	1	AGGGCAGGAATCCAAAAATGAAAACAGTACAGTCAG	X\a_b]U[Z_aa^__^]`aaaaaab`b\aaa__aab	chr10.fa		3352846	F	36	119					
+HWUSI-EAS610	1	4	13	376	43	0	1	ATGCACACACAGACATGAATGACCATGTGCCTGTGG	a`L`HYHVO]P_NaYH__QN^\`ZMG[H\\X^UBBB	chr10.fa		3353195	F	35T	98					
+HWUSI-EAS610	1	4	43	1003	1091	0	1	TGACCATGTGCCTGTGTTTGCATGCGTAGGTAGGAA	aaa__^a`_a__a`^a_a`a^\``\aW_``W\^aW^	chr10.fa		3353214	F	36	119					
+HWUSI-EAS610	1	4	32	502	30	0	1	AGGGCAATTTCCATCAATGGGTTCTTCCTCCTACCA	abbbabbbbabaaaa`aa`aa^a`a_aa`a`a``^\	chr10.fa		3353514	F	16G13T5	44					
+HWUSI-EAS610	1	4	18	843	801	0	1	GCAACGGCCTTTAGCTGCTGAGCCATCCTTCCAGCC	`W\ZXWZ\``a`a`]`a`^YWU`LX]\]UW\^\\Y`	chr10.fa		3353584	F	4T31	90					
+HWUSI-EAS610	1	4	42	675	1771	0	1	GTGTTAGGCAAGAACTAGAGATTTAATTGTCTTCAG	a_b_a`aa```aab_a`a``_aaa`]a`[`^`a_^`	chr10.fa		3354231	F	36	119					
+HWUSI-EAS610	1	4	23	268	631	0	1	TGGCACTAGCAAGGTTGTTCTACATCTGGTTGTGTA	`W^a[baaabaWabSbb]b_a[bWba[ab_bb^bI^	chr10.fa		3354429	R	36	118					
+HWUSI-EAS610	1	4	34	1051	44	0	1	TGGCACTAGAAAGGTTGTTCTACATCTGGTTGTGTA	Xbbab[bSJJ]`SZX_W\VaW`abaaMDW\_[TXZ]	chr10.fa		3354429	R	9C26	101					
+HWUSI-EAS610	1	4	4	167	1576	0	1	TACACAACCAGATGTAGAACAACCTTGCTAGTGCCA	abb`b`bbbab\bb_bbaNa_\`baabbaab`aabb	chr10.fa		3354429	F	36	119					
+HWUSI-EAS610	1	4	35	433	1171	0	1	GTTTGACACATCTGACTCATGACACCCCATTTCCCT	a_a``[`^_aaa`a_aQ]\`aa_U``Z_[[]U_]TX	chr10.fa		3355034	F	3C32	82					
+HWUSI-EAS610	1	4	45	1601	1479	0	1	TTGTGTGCTCGATACCCGGGGTAGGACTGTACAGAT	abaZ__aa`a]UZZa_aa_aUS__^Z[__[_ZZXU^	chr10.fa		3355091	F	36	119					
+HWUSI-EAS610	1	4	70	470	1117	0	1	CTGTACAGATGAACAGCTCGGCATGTCATGGAGTAA	a`aaaaab_aaa``aa_[]U]^__a^^[a``Z_[^[	chr10.fa		3355117	F	15A20	81					
+HWUSI-EAS610	1	4	17	1403	1312	0	1	ACAGCTCGGCATGTCATGGAGTAAGGAAGATAGGCT	a__a`a_a_\]^a`\_a_aZa\```_V___Z]\W\U	chr10.fa		3355129	F	3A32	81					
+HWUSI-EAS610	1	4	42	1745	10	0	1	TCTCGGCGGCAAGCCCCTTAGAGAAGAAGCAAATTC	aa``PS^XQVW[NWWVZR^SNNIMROQVJQPWWBBB	chr10.fa		3355627	F	36	103					
+HWUSI-EAS610	1	4	77	46	164	0	1	CATCCCTACCCCGACCCTCCTGAACCCCCAAGAAAG	aXX[\]YT]^Z]UGV`[JSZUQQTZ`BBBBBBBBBB	chr10.fa		3355766	R	28A7	71					
+HWUSI-EAS610	1	4	35	1616	391	0	1	AGGGATGGCCTACCTTGCTTCTGGAGGGCATGTTAA	aU`_a^U^\^`a\[\\Y___\_X[T\S\VW\\\\^_	chr10.fa		3355795	F	36	119					
+HWUSI-EAS610	1	4	21	1476	711	0	1	GATGGCCTACCTTGCTTCTGGAGGGCATGTTAATGT	aa`aaa``a`a_]T`aaa_XZQ^S\^_``\YPW_a\	chr10.fa		3355798	F	36	119					
+HWUSI-EAS610	1	4	13	1730	447	0	1	CCTTTCTTCTGGAGGGCATGTTAATGTCTGTAGCCT	Z_bQIWaaVaTOTHP]_a^ZQb^Q_BBBBBBBBBBB	chr10.fa		3355807	F	4G31	56					
+HWUSI-EAS610	1	4	46	1571	1972	0	1	TGCCCATGGCCTGTGCTGTTGCCAGAAACCATGTGG	aaa^^`aa]Z\^a\aUaa]]^\Y^]XU`TMWWWU^X	chr10.fa		3355899	F	36	118					
+HWUSI-EAS610	1	4	35	1754	1432	0	1	GCTCCCTGGATCAGGCATGCCTACGTTGTTGTATCG	`a]`^\^aaU]Z_`YZ]ZGS_^PPX\Y_SMNN\V\^	chr10.fa		3356205	F	36	117					
+HWUSI-EAS610	1	4	72	334	789	0	1	ACATCACCTGCTTGAAAGAGACAGACCCTGGGCTTC	a``a``aaaaaa`baa__U_``a_`_`_\]]^`V[_	chr10.fa		3356248	R	6A29	81					
+HWUSI-EAS610	1	4	40	441	731	0	1	CCGAGAATACTCAGAGCACTCAGAAACACAGAGGAA	a`_UZ^a]Wa^[_`_aaT_^aS`_^a_a]aaQ^_U`	chr10.fa		3356338	R	36	119					
+HWUSI-EAS610	1	4	42	517	1408	0	1	GTCTTGCTTTTAGAGATGGCTCTTGTGGAGAAGAAA	aaaabbababaaa`baaaaaaaaaa_aaaa`aa_\_	chr10.fa		3357450	F	21T1C12	43					
+HWUSI-EAS610	1	4	1	510	286	0	1	GTGGGGTAACTTTTTAGGTTGCCCAATGTGACCAAT	a`aaaa]aa_aaaaa`a``[`_a\aa`a]aa^V^aa	chr10.fa		3358504	F	36	119					
+HWUSI-EAS610	1	4	34	1684	864	0	1	GTAATCCAGCAGCAAGAGGCTTTCCAGATGTTTTTC	[^b^`Ya`SQ_Q_]a^[^^aW`V^`SPUXMV^[BBB	chr10.fa		3358574	F	33G2	103					
+HWUSI-EAS610	1	4	16	526	910	0	1	GTACCCAGCCCAATGTCTGACACACAGTAATCAAAA	_aabaaa`aaa_a^]_aaa]`aa_`ba_aaaaa``a	chr10.fa		3358707	R	36	119					
+HWUSI-EAS610	1	4	36	1636	1258	0	1	ATCCCANACAGGTGCTCCATCACTGCCCTGACCAGA	aaabaZD\^`^UU\`aaaaa``]_]`]]^^`^X]]^	chr10.fa		3359014	R	6C29	110					
+HWUSI-EAS610	1	4	76	736	90	0	1	CAGAAGAAGAGATACTAGGTTGACATTTCAATTGTA	ab^Vabaabb`^`baababab`bbabb^Y[abbbaa	chr10.fa		3359635	F	36	119					
+HWUSI-EAS610	1	4	30	1479	1743	0	1	AAGAGTGTTGCCAAGTGTGAACACACAGCCATGTGC	[bbbbbbU`a``baaabbbbb]b_aab\_abbbbaY	chr10.fa		3359718	R	T35	87					
+HWUSI-EAS610	1	4	97	1255	1805	0	1	ACCCTATAATCTCGCTTGAAATGCTCATGAAGAATC	aa_aaaaaab_aabT`bba`aaa__Ua_ba_`aaa]	chr10.fa		3360174	R	36	119					
+HWUSI-EAS610	1	4	35	918	728	0	1	GGCTCCTCTTCCCCGTCTAAGTTAAGCAAGGTTTTA	a`_abaaaba_``aa__b``a\aaaa_``aZS_aaa	chr10.fa		3362100	F	13T22	81					
+HWUSI-EAS610	1	4	41	1313	524	0	1	GGTCTGTCCTGGGGCATTTGTGAGGAATTGCCTTAA	``aabbab``_`_aa`bba``_aaa_aaaa`_aa^`	chr10.fa		3362480	F	36	119					
+HWUSI-EAS610	1	4	62	357	1734	0	1	AACACTGACAGGCGATTGAGCAATTTATGAGACCAT	aabbaaa_a`baaaU]YTX\WGY]a\L]LMQ\^^BB	chr10.fa		3363353	R	36	108					
+HWUSI-EAS610	1	4	6	336	805	0	1	ACCCTGCCCTGACAGCCCTTCCTCACGGCAAAGCTG	a]`a`a`^a]````]\_``\^]^```Y``^Z[`^\^	chr10.fa		3363599	R	36	119					
+HWUSI-EAS610	1	4	59	745	1671	0	1	GGAAGGGCTGTCAGGGCAGGGTTGGATGGCAAGGAG	``aa``a`aaa\\`^\`Taa`S```_^`^^`\``Z`	chr10.fa		3363613	F	36	119					
+HWUSI-EAS610	1	4	82	292	683	0	1	TGATGGAACACTGCTCAGGGGACTGTTGACCTGATG	^``bb_T`a`_```X`]^bUa^Y`b^baZP\aaUT]	chr10.fa		3363660	F	36	119					
+HWUSI-EAS610	1	4	72	855	1921	0	1	ACTGAGTCTGGGTTGAGAGTTGGACATCCACATCAG	a`aaaa`a```aWa`aa_a\`aa`[__\\_W^`\__	chr10.fa		3363690	R	36	119					
+HWUSI-EAS610	1	4	44	934	95	0	1	TACAGCTAGATTCTTGCACTGAGTCTGGGTTGAGAG	aaQ__N\^\V`OSUZ`]`XWRVQXPVT^XBBBBBBB	chr10.fa		3363707	R	36	88					
+HWUSI-EAS610	1	4	1	298	1334	0	1	CTGTTCCATGCACCAGGAGCCAAAGAATACAAAACC	aaa_a_aa`aaaaaaaa`_aa^X]aaa`^^[_[]U_	chr10.fa		3363881	F	36	119					
+HWUSI-EAS610	1	4	65	1174	1202	0	1	TAACCTCAACTCCAACCTCCCTGCTGAGGGAAATGG	aab`a_`_a\Q]S__[^a^V__^W`_U_][SWW^__	chr10.fa		3364565	F	36	119					
+HWUSI-EAS610	1	4	40	698	1433	0	1	TTTAAAGCAACAGGCCAAGATTTAACAAGGAAAATT	aab`baaaaaa^`aaa`aa`aaaaa`aaa__``^aa	chr10.fa		3365134	R	36	119					
+HWUSI-EAS610	1	4	28	808	846	0	1	AAGACCACGAAGTTAGTGTGATGTGTGCATTTAATA	^OQULMMO[OY_[_^]VWBBBBBBBBBBBBBBBBBB	chr10.fa		3365796	F	25A10	37					
+HWUSI-EAS610	1	4	95	955	1690	0	1	GAAACAATTATTCTCCAGTTTTACTTAAAATAGTTG	aa`a_aaaa`aa^aa`aaa`aa``a`a`a`aaa]_`	chr10.fa		3365842	F	36	119					
+HWUSI-EAS610	1	4	48	1338	747	0	1	GAAAACTCAAGGTAATTCGATTCCTTTTGTTCCTTT	]]V\VU`U_ZXTU``^`[^Q\_TZaWS_^][VDZ`Y	chr10.fa		3366284	F	36	116					
+HWUSI-EAS610	1	4	9	584	569	0	1	AACGGAAGGGTTAAAGCCCACCTAGGAACACGGTGA	aaabaaaaaaZ_a``a``___^_aa_[_\`[`_U`]	chr10.fa		3366500	R	36	119					
+HWUSI-EAS610	1	4	29	929	1684	0	1	CGCCGGNTCTTCCCACAATAACAGAGGCAGTTATGC	`_`aaYD^^ab\^aaaaabaaaaa\a]`aBBBBBBB	chr10.fa		3366542	R	6T29	80					
+HWUSI-EAS610	1	4	15	841	504	0	1	CTGAGTTAAAGAGAGTAAGTTGAAAACGTTAGACTC	abbababaa]babab_bab`ab_^`a_b^^`a`_a_	chr10.fa		3366607	R	36	119					
+HWUSI-EAS610	1	4	85	862	1614	0	1	CGAACAGCACAGCTCATTAACCTACATGGTTCCTGG	W[a_`PO_[UUZU]b[b__^\US[]a]__FZ[]abb	chr10.fa		3367169	R	36	117					
+HWUSI-EAS610	1	4	73	510	1140	0	1	TGAGATGGGTTGGTTTGGGATGGCTAACCTGTATGC	^abbbbb`aT^]b`bbbbb`ab[bba_aaa`T`bab	chr10.fa		3367539	F	36	119					
+HWUSI-EAS610	1	4	60	614	606	0	1	GGGATGGCTAACCTGTATGCCAGCCTTGTGGAGGGA	^aa``__a_WZ_`ab`aaaaa^``_b^_X]`[`[`]	chr10.fa		3367555	F	36	119					
+HWUSI-EAS610	1	4	63	135	2040	0	1	GATAAATTCAGCAACTATCTCAGTGAATGTTGCCCT	a_W[^ZZabbbaa`aX`_`_aab^][LYaZ_]X^]U	chr10.fa		3367636	R	36	118					
+HWUSI-EAS610	1	4	97	886	1967	0	1	TAACATTCCTCTCAGAATGTCTCTAGAGGCAAAGGA	aba\S^]Ybb\aaaa[[`YI]]___a]\a_]Y^ZZX	chr10.fa		3367751	R	36	118					
+HWUSI-EAS610	1	4	5	1481	1592	0	1	GGTATATGTGTGTCATCACTCATGTGTGGAAGTCAC	a]QWZ\^^T`ZYYZU\ZZZ\W_^_X_V_[^_^NW^R	chr10.fa		3368134	F	36	118					
+HWUSI-EAS610	1	4	86	1429	1468	0	1	GGCATTTTGGGTAGTTATCATGGAGGGACTGTCACC	`VTZ[UU^SU[UZ\\\\WQ\VVWWWBBBBBBBBBBB	chr10.fa		3368305	F	25T10	68					
+HWUSI-EAS610	1	4	7	187	783	0	1	TTTATAATCCTCTATCTCCCTGGGCAATTAACAGCA	aaaaaaba`aaaaaababaa``aaaa^a_`\_`aaa	chr10.fa		3368848	R	36	119					
+HWUSI-EAS610	1	4	100	997	174	0	1	AAACAGAGATAGACAGATATAGGGATAGAGTTAGGC	a`aaaa[aaaJYZ`aaabaa`_Ya`a]_[^Xaaa_U	chr10.fa		3369506	F	36	118					
+HWUSI-EAS610	1	4	50	1100	1485	0	1	GCAGGGTGGGGAGGGTGACAAAGTCCCTGGGCAATA	`PT__\W_^a^K^[]FZET\[F_[VUROVYMFPMXZ	chr10.fa		3369988	R	31A4	102					
+HWUSI-EAS610	1	4	38	532	800	0	1	TGATTGCTGGGTACCAACAACAGAAAGGCAGGGTGG	ababbbaaa`aRaabaaa`aaab`a`[`a_`\a\aa	chr10.fa		3370015	R	36	119					
+HWUSI-EAS610	1	4	20	912	731	0	1	GAATGTGTCAGAGCACATGTAACTGCATGCCACTTC	V\IZ`Ra]_aa_\NY`aaa___Y_aV_^`M^_^_]_	chr10.fa		3370158	F	5C30	95					
+HWUSI-EAS610	1	4	7	579	1525	0	1	AAACCCACTTTTGGGTATCATCTTAATGGGTACCTN	a[^___^X_`^Z_`_X`^]^^^_`]^__^_Z]^_BB	chr10.fa		3370301	F	35T	108					
+HWUSI-EAS610	1	4	100	1634	1251	0	1	AGACATGGAATCAAATTAAAGTGTGGTTCTTATGAA	S`^`_b_\_`WW\]]^`____]\ZSJXUDUa```a]	chr10.fa		3370508	R	36	116					
+HWUSI-EAS610	1	4	75	468	1707	0	1	CAATTCCTGTCGTTCATAATTGATCATTATAGCTAC	a^abaaaaa[aa_\]VYWROUNXS[WW]T[[PVXTX	chr10.fa		3370626	F	36	118					
+HWUSI-EAS610	1	4	93	592	1934	0	1	GTCCTTTCTAGCAAGCCCTCAATTGAATCATATTTT	a_aaaaaaab`a_aaaaa_`^]``__a__```^`_`	chr10.fa		3370852	R	36	119					
+HWUSI-EAS610	1	4	54	611	1199	0	1	AAGCTCTTACTGTAGACATTACCTCTAATTTCCATA	a_a^`aa``_aa]a`aa^`[a__a\_`__^_X`__`	chr10.fa		3371037	F	36	119					
+HWUSI-EAS610	1	4	80	1406	1416	0	1	GTGTGTAATGGACAGGTGACCCGGGCCCAGCAAATA	`GSQ_YU^^XMMRKOTSX`UWU\TUUWUTUSVUUSU	chr10.fa		3371226	F	36	116					
+HWUSI-EAS610	1	4	94	597	1027	0	1	GGCCACTGGGAAGGAGGGGGTTAAAGAAGAGTCTCA	a`]^]_^a_a\^aa\aa_^a^`]_\a^]^^`W^^YQ	chr10.fa		3371300	F	36	119					
+HWUSI-EAS610	1	4	10	141	1645	0	1	AGAAACTGGCATGTGGAAACTTGAGCTTAGCAGCAG	S^HZa_RV`a_[VG[[WXK_abbba_U^_KaS\YSa	chr10.fa		3371345	F	36	116					
+HWUSI-EAS610	1	4	36	880	1217	0	1	CACACTTTGTTCAAGTGCAGCTAGTGAGGATGACAG	a]_b`aa`a`aaba`a^_VW_`Xa[aaa`aaa__ab	chr10.fa		3371994	R	36	119					
+HWUSI-EAS610	1	4	53	162	1358	0	1	AAGAGCACCTTCCATATCTAAGCCCCTCTGAGAGCC	]P]_a``aab]a^]a]a]Y``aa`]Za`\RDX\`ZZ	chr10.fa		3372031	R	36	116					
+HWUSI-EAS610	1	4	4	928	1407	0	1	GTATATATGTGTGCCCATGTGCATGTGTATACGTGT	a__a^_P]`[aX]]^Z\Y_NaXU^[]`_^_^R`Z_Z	chr10.fa		3372729	F	36	118					
+HWUSI-EAS610	1	4	88	888	992	0	1	CATGTGCATGTGTATACGTGTGTGTGAGTGTGTATA	abb_[ZY`YZYb^R]V]]^bS`V_N\^[HUW`VU_R	chr10.fa		3372744	F	36	30					
+HWUSI-EAS610	1	4	53	1239	1908	0	1	CGGCAAAATCCTATCTCAGTGAGACTTATAGGTGTT	abb`baabaZ_a`b`aaab]`aa__ab_a__^Z`]a	chr10.fa		3373078	F	36	119					
+HWUSI-EAS610	1	4	37	622	760	0	1	TGCCCACAATTGCTCTTCTTTGCATGTGTTCCTTTT	aaaaaaaaaaaa`a`a`aaaaa_`aa^a`a_^`aaa	chr10.fa		3373657	R	36	119					
+HWUSI-EAS610	1	4	9	681	1398	0	1	TAGGTATGTTTTCAGGATAGGATACAGCCACCATGA	abbbab`b`aaaaaaa``ab`^aa_Ya_a`_]a``S	chr10.fa		3373772	R	27T8	83					
+HWUSI-EAS610	1	4	51	851	2041	0	1	CTTTCACAGAGTTGTACTCTCTTCAGGGGGAGGTTA	abba[a_a^`ba]b[`aaaa````W_`_]a]`aVa^	chr10.fa		3373862	F	36	119					
+HWUSI-EAS610	1	4	19	697	670	0	1	CAATCTCTGCTCCGACCCCAGGTCACCTAACCTCCA	ababa`abaa]aZaaaaaaaZaZ`a`a^aa^a_``a	chr10.fa		3373889	R	35C	81					
+HWUSI-EAS610	1	4	50	630	434	0	1	ATCATCCCTCTCAAAGGAGCCCCTTTTAAGAGACAG	`b``_``aaaaa`\[]]X``Za`aaaa][_aa\[]a	chr10.fa		3374025	F	36	119					
+HWUSI-EAS610	1	4	39	1732	1156	0	1	TCAGCCATGACCCTCTCTTAAGCCACCCCACTTTTA	aaa```aaa_YY]^^_[aa^__`_^^Z^Z_\^[^^_	chr10.fa		3374409	F	36	119					
+HWUSI-EAS610	1	4	3	1549	1556	0	1	TGACCCTCTCTTAAGCCACCCCACTTTTAATCTTAC	abaaaaaY[V`_ba`S^a_]a_^^^```^__[^^aX	chr10.fa		3374416	F	36	119					
+HWUSI-EAS610	1	4	6	1703	1861	0	1	TAATCTTACCCAACTTACTGTGCTGGCTATGCTCAT	aa``_aa^Z_]a`]a``_`a]__]_P\Z_[VWWZ]_	chr10.fa		3374443	F	36	119					
+HWUSI-EAS610	1	4	63	1174	245	0	1	TGTTAATTACCATTTTAATGAGTACAAGGTGTTAAA	aaaaaabbbaaaabbb``ab_`[^_a_`WO]``_`^	chr10.fa		3375227	F	36	119					
+HWUSI-EAS610	1	4	43	825	1941	0	1	ATTGATGCAAGATAAGGCCATCTTCTTCTACATAAA	aaaa^a`_``\[_^^^^_]_^X^[Z`_^^^]]__a`	chr10.fa		3375830	F	36	43					
+HWUSI-EAS610	1	4	53	674	1797	0	1	ATACACATGGAGGAACCCATGGATCCTGCTATTTAT	ab`_baaaa_]X^aa`_^a___\^[^`_^^]___^_	chr10.fa		3375861	R	36	72					
+HWUSI-EAS610	1	4	86	1059	1887	0	1	ATACACATGGAGGAACCCATGGATCCTGCTATTTAT	a_a^b`]``a^aa]`Z]]^W_]X^Z]_]Z]X]^]W]	chr10.fa		3375861	R	36	70					
+HWUSI-EAS610	1	4	95	1222	1898	0	1	CAGAGCTCCCAGGGACTAAACCACCAACCCAAGAAT	abaaa_]_^aaaa`a\`Z]aX`aa^]^]a__\^_\_	chr10.fa		3375895	R	36	5					
+HWUSI-EAS610	1	4	57	688	45	0	1	TGGAAACGCAGGGACAAAAAAATGGAGCTGAGACTG	`aaaaa__^__a_ZX__`]_]___`X`Y^_V]^X__	chr10.fa		3376208	R	36	55					
+HWUSI-EAS610	1	4	82	1111	1188	0	1	ATTCTACTGAGTCCCATTTATGTTAGCTGTAGACTC	`_baaaaaa_a_a`^`aaaaaa``_\^aa^_[^X][	chr10.fa		3376527	F	36	119					
+HWUSI-EAS610	1	4	55	614	1653	0	1	GTTCCAGGCTTCTAAGGGAGCAGGTGAGGTGGCTTG	aaaabaab`ab[aaa^a`S`]^aaVa\]_S_`[`aa	chr10.fa		3376924	F	36	119					
+HWUSI-EAS610	1	4	33	1665	246	0	1	TGATTTATAGACATGGGATAGAATGCCAGCTACGTC	a_```___]Q]__]]]Y\_\T`_[T[X]YX]^UUBB	chr10.fa		3377160	F	36	110					
+HWUSI-EAS610	1	4	65	764	952	0	1	GGGACCGTGACGTAGCTGGCATTCTATCCCATGTCT	Zba_a[^Yaa``X^V[^aaZ\aa\`^a^a^Uaa^]B	chr10.fa		3377168	R	36	114					
+HWUSI-EAS610	1	4	31	438	1614	0	1	GAAGATTTGAGTATGAGTGACCTTTGTGGGAAGTAA	a_Yb_a`aa_aX``a_`W_^a_`___X```XZ_\_[	chr10.fa		3377376	F	36	119					
+HWUSI-EAS610	1	4	30	1347	416	0	1	CACAAAACAACTGCATTTCCTGAATTACTTCCCACA	abaaaabaaa```aaaaaaaa```aa``aa_^`aaa	chr10.fa		3377400	R	36	119					
+HWUSI-EAS610	1	4	10	1765	1092	0	1	GGGCTCCGGGTTAGGCAGATAATGTGTTGACAATGT	]\F\aW[[aa_\_aY`a]``\`^\[NQHW^aaX_`^	chr10.fa		3378041	R	27G8	105					
+HWUSI-EAS610	1	4	3	952	978	0	1	CAGAGTCCTGGAACAGCTGTGCCTGTGTCCCAGTTT	aaaab`aZ]aaaa_`aa]a]a`_aa]aU^a_G`Maa	chr10.fa		3378459	R	36	118					
+HWUSI-EAS610	1	4	90	1484	620	0	1	GCTAGAGGTAAACTGAGATTGAAGAGATATGAGATG	_`bbaaab``ba_`_`a[bbaa`__aaa_``\a]`_	chr10.fa		3378558	R	36	119					
+HWUSI-EAS610	1	4	69	915	861	0	1	GGTCACAAGTCTATGTGTGCTAGAAGAAGCCAGCCT	`[\aaYX[]^ZUb^b^aWa`_aa_`a__QaaU^ZRY	chr10.fa		3378631	F	36	119					
+HWUSI-EAS610	1	4	19	40	971	0	1	TTTAGGCCCTGTACTGGTTAGTTTTGTGTCAACTTG	`babababbba\ab`bb^a^bP`ba`abab``aaaa	chr10.fa		3379123	F	36	48					
+HWUSI-EAS610	1	4	47	1726	551	0	1	CGGAGCTCTTAACATCGAATGGATCTTCTGGCCCAA	VQHT^Z]`]aab\]\[OVbV\Y\aa`P^SYNVY]ba	chr10.fa		3379606	R	36	12					
+HWUSI-EAS610	1	4	48	1347	556	0	1	TCTAAGGGCTTGGATCACTTCTCCAGCCCTGTCCAT	aaaaY[V__^\`^^``\__a```_`_YSY_S\\[^`	chr10.fa		3380268	R	36	26					
+HWUSI-EAS610	1	4	90	24	409	0	1	TGGGCTGGTACTCTTGGGTTCTATAACAGAGCAGGC	abbbbabbZa``a`aa`aZa`aaaZaaXa`X_a`_b	chr10.fa		3380757	F	36	16					
+HWUSI-EAS610	1	4	87	912	625	0	1	TGACCAAGAGGCAAGTTGGGTAGGAAAGGGTTTATT	aba_`aa\Wa_a_[_]`b^`Z_``^^]^a^U__^a`	chr10.fa		3380926	R	36	7					
+HWUSI-EAS610	1	4	96	313	1072	0	1	CAGCCCCCAAACTTTTGTTCCAGCTCATTTTTTTTC	abbabbbaaaaaaaaab`aa_^aaa`Raaaaa_aaa	chr10.fa		3380997	F	34CA	43					
+HWUSI-EAS610	1	4	51	520	823	0	1	ATTTCCTGGTTTGGGATTCTAAGACTAATGTGCCTG	abbba`aba`bbbaaaaa`abZaa`aa`ab_aa_aa	chr10.fa		3381386	F	36	119					
+HWUSI-EAS610	1	4	61	1690	1281	0	1	TAATGTGCCTGTAAGTTTTGCATGTAACTCTTTTCA	aaaaa`_a_`]Ya^\^`a_a``a`_`a_a_a`____	chr10.fa		3381411	F	36	119					
+HWUSI-EAS610	1	4	97	1284	252	0	1	GTGACCTGGTTGTTTGCTGATTCACCTACAGACAGG	a_ba^]`_a\``]_`_^`_`a`^a^\a_\___\___	chr10.fa		3381747	R	36	119					
+HWUSI-EAS610	1	4	79	1385	562	0	1	GCACTTCACCCTCCTATGTGAGTGTCCAAGACTCAT	ab___`aa_[Y`___Z_^\`\aNaQ\\^U[BBBBBB	chr10.fa		3381855	R	36	93					
+HWUSI-EAS610	1	4	68	485	603	0	1	GTGAAGTGCTAGTATCAAGTTGAAGCAGGCTTTCTA	aW`[``]_^^aaZ__^_^`Z___]]^__^Z^^^]^^	chr10.fa		3381882	F	36	119					
+HWUSI-EAS610	1	4	5	583	805	0	1	TGGGGGATGTCAGAGGTGCTGGGAAAGGTGGATGGG	Taaa_[aX^I`\^\\\Z_Xaa_`QKMY^P`U^UZ\^	chr10.fa		3382308	F	36	117					
+HWUSI-EAS610	1	4	69	1211	1002	0	1	GGAGCTTGTCAGTAAGAGTGACAGTCTGAACTCTAT	aaaaaaaa_a``^``_^`VY`_`_Y^`\`_U_`_`_	chr10.fa		3383181	R	36	119					
+HWUSI-EAS610	1	4	56	600	318	0	1	TTTTATTAAGGTTCTTTTTATACCTCTGCCTGCTTC	aa___`aYJW]Z\_YX___^X[S[_[Y_[X^_Y_^]	chr10.fa		3383310	F	36	118					
+HWUSI-EAS610	1	4	66	505	288	0	1	GTCACTTCTCAACACTAGGCAGGAGACAAAGAAGGT	aaaaaaaa`aaa`aa_a^a`a`a`a^]__aa_]a_X	chr10.fa		3383372	F	36	119					
+HWUSI-EAS610	1	4	9	1364	1843	0	1	GGTGTTCTCCTGTACTTGGGCATATAAAGTTTGCAA	a_Za___a^_aa^`]__`aaX`aaaa]]a]^`a^^\	chr10.fa		3383646	F	36	9					
+HWUSI-EAS610	1	4	91	872	1847	0	1	GGAGGCTTCTGCAGTAACAACAAAATGTTAACGGTG	a^T`\[aaaaTWY``aa]`baba]aaZQ_``_baS`	chr10.fa		3387250	F	36	119					
+HWUSI-EAS610	1	4	72	18	1894	0	1	AGACAATCCTTCCCAGAATTCATGCAGGGAAATACA	a_J_VOUba_^abbba`\\\aaaa_H_baXO`aaXV	chr10.fa		3387356	R	36	117					
+HWUSI-EAS610	1	4	80	1280	1581	0	1	GTAACTTGTGACCTTCCCATGAATTCATATATCATC	aaaaa`a`\_``\aa__aaaa`_a^^___^_^Y_``	chr10.fa		3387848	R	36	119					
+HWUSI-EAS610	1	4	20	1489	1590	0	1	AAATAGCAGAAGACCCCATGAAAGCTTCAGAAGAGG	a_aa^`_`_^^^]^]X\^_a^`^^]]WW^^WZ^ZZ\	chr10.fa		3387955	F	36	119					
+HWUSI-EAS610	1	4	96	404	929	0	1	AGCATATGTCAGTCTTTCATGCGGTTTATGGCTATT	^_`Q__ba_aSb_[[baa`abb_b^aa_`aaa`BBB	chr10.fa		3388555	F	35A	103					
+HWUSI-EAS610	1	4	30	1179	809	0	1	GGTCTGCAATGAAGTTGGATCATTTGTCATAAATGG	a___ab]_`a`]X]^aaa_`_`````]`_a^^_``^	chr10.fa		3389350	R	36	119					
+HWUSI-EAS610	1	4	73	1440	1650	0	1	TATGCCATCCAAAGTGTCTTTCTTTCCTGAGGACTC	aaaa_Y]^]]\XP^]_QS\aa__a``_^ZW[[OQaZ	chr10.fa		3389717	F	36	118					
+HWUSI-EAS610	1	4	17	1177	465	0	1	AAGAATCAACCCATGGCACTAGGAGTTCACAAGATG	aa`a``_b`^`^`_]Z_aZa_]][\[\[`______`	chr10.fa		3389761	F	23G12	87					
+HWUSI-EAS610	1	4	8	715	920	0	1	AGGACATCAGTGAGCCAGGATAAACAAAACACTTAA	\aZa]MaZS_NRJYS``W^a^[a`X^U`XTZS_a]W	chr10.fa		3389854	R	36	118					
+HWUSI-EAS610	1	4	8	1477	88	0	1	GTCCTGTGCTTGTGGCTCACCACACTTGTGGGGGGA	VUa`XI\XXXQOOQZZQXU_a^RKPQPPPTX\BBBB	chr10.fa		3389978	F	36	99					
+HWUSI-EAS610	1	4	67	458	566	0	1	TGGCATATCAAAATCCATGGCTAGTTGATACTACCT	a_[\a^aX^a[a`_aaaa``aZZ`__a_`_\^`_`[	chr10.fa		3390211	F	36	119					
+HWUSI-EAS610	1	4	93	332	1292	0	1	ATGTCTGTGAAGTAGCCATGGGCTTAGATACGAGAT	aaa_aaa^aaa_]a`aa[^aaaa___`_]]_^SVTV	chr10.fa		3390272	R	32CC2	68					
+HWUSI-EAS610	1	4	8	703	670	0	1	AAATCCATCTGCTTTCTCTGCCTGAAACACACAGCA	aX]GO__XP\a_a^`\Y^Sa\W^`^Y^OZZUX]`_^	chr10.fa		3390394	R	36	117					
+HWUSI-EAS610	1	4	28	1229	797	0	1	GGGTGATTTGTAAGTGGGTGCAGGTAGAATTCAAAT	_VXFWV[_[\TTX_X\ZWX[Z\_ZT^_^[^WWSV]]	chr10.fa		3390558	F	36	117					
+HWUSI-EAS610	1	4	5	86	1651	0	1	TGACCTGGAGAGTGGATGGGTTTTAACTCCCCCACC	aaaab^aaba__Sa`_KaaaW`W[^]]\\`a`aW^a	chr10.fa		3390690	F	36	118					
+HWUSI-EAS610	1	4	80	1576	618	0	1	CTGGAGAGCGGACGGGTTTTAACTCCCCCACCCCAA	]__G]a^VU___P]]P_\a``_[a\aXaaa_Z``aa	chr10.fa		3390694	F	8T3T23	71					
+HWUSI-EAS610	1	4	58	1038	769	0	1	GAGAGCTGCATATACACTCTGGTCCCATGGTCATTT	^Y\[a]`^UV]a^SY[`ZYS_`]Q]`]a[^X^F[a`	chr10.fa		3390974	F	32C3	108					
+HWUSI-EAS610	1	4	62	91	830	0	1	CAACTCACTGCTGGTTAATGAAGAAACATCCCTTTC	VXW_YYZ[TRUaa`H]Q^b`U`XS_[a[Y^X`V\V_	chr10.fa		3391094	R	36	118					
+HWUSI-EAS610	1	4	6	1253	899	0	1	AGAGCANGACAGAGTTTTGGGTCTTGGGGACTGTTG	a_``_ODRSX\`U^T\^`Y\`YY^`]\X[WU^_W_\	chr10.fa		3391257	R	6G29	110					
+HWUSI-EAS610	1	4	80	622	1170	0	1	TTACTTTAAAAACACTAACACATGTGTGCTTTTCTT	abaabbba`abbaaaaaaaab`bb_b`aaaaaa`bb	chr10.fa		3391755	F	36	119					
+HWUSI-EAS610	1	4	21	1078	1489	0	1	ATTTCATCTACTTACACATTCATTTCCTGCAAATTC	aa`Y[ZZa]^H]]a^ba`aaSa`SUPVTa\`aaaa\	chr10.fa		3391851	R	36	118					
+HWUSI-EAS610	1	4	97	688	210	0	1	CGCTTGATAAACACAAGGGGGGCTACAGCCAGAAAG	aba[abbabb__baaaa`[``\^ab]a`a``^]`^`	chr10.fa		3392976	R	36	119					
+HWUSI-EAS610	1	4	98	929	882	0	1	ATGTTAGCCCTGTCTCCCTTCCGCCACAGACCAGAG	a_^a`aS]]UW`]^`XaaX\]Z^__`PZ^]Q`V[W\	chr10.fa		3393278	R	22A13	84					
+HWUSI-EAS610	1	4	58	514	1343	0	1	AAGGAAAGGTATTCTGCTGTGCAGGAGTCATTTTTT	^\aaZ\`bbZabbaabaabaaaab`aaZ]\baaa``	chr10.fa		3393494	R	35C	82					
+HWUSI-EAS610	1	4	19	1044	1676	0	1	AACCCAGAATATAAAGTGTAAAGATGGAAACAAAAT	abaaaab_ababaaab_b`baY_aaa`a`a`aaaaa	chr10.fa		3393640	R	36	119					
+HWUSI-EAS610	1	4	69	792	34	0	1	ACATATGCAAGTAGAGATACAACTCTAGGGGGGACT	aa]a`ab``Z__aa[a`aaa`_W_^`ZZ`Wa_G^]`	chr10.fa		3393908	F	32T3	39					
+HWUSI-EAS610	1	4	8	1054	992	0	1	CAATTCTAAGGGGATCAAAGAACTCCACATAAAACC	a[a_a`a_\abaa__`aabaa__a^_a]_a_Z\\\`	chr10.fa		3395289	R	36	19					
+HWUSI-EAS610	1	4	63	242	910	0	1	CAGGACCCAACATTTTGCTGCTTAAAGAAACCCCAC	[aa__]_^_`YX[aa^X_`a`ab^`aa``]X_^`R`	chr10.fa		3398184	R	36	28					
+HWUSI-EAS610	1	4	33	1541	810	0	1	AAAGAAAATGCCAAATTCAAAAAGATCCTAACTCAA	ab`__``_`a^`___a_`aba`_\_^____][_``a	chr10.fa		3398956	R	36	14					
+HWUSI-EAS610	1	4	26	332	1353	0	1	GGCGGCAGAAGCAACAGCTTCTTGGTCAGGGTCCCT	`__`^Q`TGV__aQPDZTW\VRXQNDNUMS`MV[BB	chr10.fa		3399753	R	25A10	97					
+HWUSI-EAS610	1	4	3	1789	1832	0	1	GCTTACCTAGTGTTCCACATTCTTATACAGCTCAGG	_`bab``_aaZ`_^`___^a^^_a`a]_a_^Y_Y_`	chr10.fa		3400494	F	36	119					
+HWUSI-EAS610	1	4	82	1146	1949	0	1	TTCTTATACAGCTCAGGACTAGAGCCAAGGGAATGG	U_XVXbb\VMW`aUaS\_[^OZaWYHVXX\QV_OOX	chr10.fa		3400513	F	36	117					
+HWUSI-EAS610	1	4	62	462	1793	0	1	CACCCTGGGGGTTCATCCCATAATCAGCCACCTAAC	ab]babbaaa`_\_a^aa]aaa]a_^U`aa^_\a[_	chr10.fa		3401260	R	36	44					
+HWUSI-EAS610	1	4	20	1504	1391	0	1	CTGATGATGCCCAGTGTTTGTGGTTTCTCTTAGTAA	aabaa`a_[a`_^a]a_aaa^a_]_a^`^W_T\^__	chr10.fa		3406581	F	36	36					
+HWUSI-EAS610	1	4	38	1252	1588	0	1	GACTCTCCTCTGGCAAGGAATGTGCCTAGGGGTGTG	abaaaa]a`_^\_U\]b]]aab`ZWY`[_]a_S`^a	chr10.fa		3406860	F	36	10					
+HWUSI-EAS610	1	4	93	661	1527	0	1	GTCCTGGTGTGTAGAGTCCTCTGGTGCCCTAGACAC	a^`aaba\^Ya]aa]aZ`a^^\_`\_````a^^YOX	chr10.fa		3407015	F	36	119					
+HWUSI-EAS610	1	4	45	1540	1727	0	1	TGGAGTTGATGTTGCGCTCCACTCACCTGTGATCCC	aaaV`^`___`]_\\U^Q^W\W\U^UUWSUOPXPTU	chr10.fa		3407172	F	36	29					
+HWUSI-EAS610	1	4	99	150	1472	0	1	TGATGAATTCTGTTTAAACTAGTCAATACTAGATCT	`b\ab`ab`b^b[a_b_aa`ab`b`_`_a`_a`_`_	chr10.fa		3407544	F	36	119					
+HWUSI-EAS610	1	4	52	972	1813	0	1	TGTTTGTGTATGTAAGTGTGGAGGATGGTGGTCAGC	a]^a_Z\aZZ^aNVZaRa]a^U_[]__]PUTPSJZZ	chr10.fa		3407823	F	36	118					
+HWUSI-EAS610	1	4	90	1513	601	0	1	TTTGAGATCATTTCAAATGCCAAACTATGCTTCCCC	abb`a^aaaaaaaaaaabaa^aa``aaa\Y]_]\`X	chr10.fa		3409546	R	36	119					
+HWUSI-EAS610	1	4	5	49	962	0	1	ATAGTTTGGCATTTGAAATGATCTCAAAGGTACAGA	ab__]]`bba_aaba``_aaaabaaaa`b[O]aaaa	chr10.fa		3409554	F	30G5	99					
+HWUSI-EAS610	1	4	56	1250	1417	0	1	TGCACGTGCCAGGGCCACCGACAGATTCTGGTGTGG	a``^_X\U]]``]`_]\```_U_a\`[\ZYOM\\^a	chr10.fa		3409985	F	14T21	83					
+HWUSI-EAS610	1	4	8	45	471	0	1	TTGTATGCTTAGTTATAAAATCTTGAATGTGGAAAT	a`aY`[`aaaaa]aa``_aaaaaab_aaa^aa_^_`	chr10.fa		3410063	F	36	119					
+HWUSI-EAS610	1	4	83	1099	1537	0	1	TAGGTATCACCCTACCCTGGCATGTCAAGTCACTGC	aaaa]aaaaaZ_aaa\^aaaa`a_``aaa_aa_aa`	chr10.fa		3410201	F	36	63					
+HWUSI-EAS610	1	4	24	110	394	0	1	AGGTATCACCCTACCCTGGCATGTCAAGTCACTGCT	[`]SbXabaabX``ab_aaaa_aZ`a]PY_\a^``_	chr10.fa		3410202	F	36	44					
+HWUSI-EAS610	1	4	79	1451	481	0	1	AACTGGAGGGGGTGCTATCCCTGAATCTGTTGCCTG	abaaaa[X]VOKXa^_]a^Z]a]\a`_]UV`P^\`Y	chr10.fa		3410306	R	36	32					
+HWUSI-EAS610	1	4	85	1700	312	0	1	CAAGCATGGGTTGGACCTAGCCCCTCCCCCTCCCTG	aaa_aaa\^I\a[[aaa_aZa\X\__a]^XZa_a^X	chr10.fa		3410390	R	36	118					
+HWUSI-EAS610	1	4	22	185	469	0	1	AGCTCTGTCTAATGTTTGGCTGTGGGCCTTGTATCT	aabbabb_a`a`aa_`^`a`abGaaaW_^baS_aa^	chr10.fa		3410567	F	26T9	90					
+HWUSI-EAS610	1	4	37	401	765	0	1	GAGGAGGGACAGGGCTAAGCATAAAAGCTGAACCAT	aXba^a^aQ``]^`a`]^a`_`\_^^XZ`_\V^V[`	chr10.fa		3410778	R	21CG13	49					
+HWUSI-EAS610	1	4	45	1027	1014	0	1	CAGGAGTGAGTTATCAGTAAGACTCAGCTCCCAAGG	abba]b_babbbbaaaaabb_aaaaaa`a__aaa_`	chr10.fa		3410833	F	36	119					
+HWUSI-EAS610	1	4	37	826	329	0	1	ACAAAGGATTAGTGACCAACAGACTACTCACATCAA	aa^[``a\^_Z_ZZ]\`a]__aX_Ya`a]__[UV__	chr10.fa		3411362	R	36	119					
+HWUSI-EAS610	1	4	88	847	1118	0	1	ACTGCACTTGCTCTTTGGGAACCTTAACACTGTCCT	Kabbaab`aabbab^bab^bZbbbbbb_aaaa`WXb	chr10.fa		3411459	R	36	119					
+HWUSI-EAS610	1	4	76	1072	1773	0	1	ACTAAATAACTCTCCAAAGTCTTGGCAGCCATGAAG	`QYZ\ab`Z[]``^]`]]`RWa_a\H___``_UWQY	chr10.fa		3411899	R	36	118					
+HWUSI-EAS610	1	4	90	1258	1482	0	1	TTCCTTTTCCTCATTCTTAGTGATTGATGGTATTCT	aa`_`^^^VWLY^a`_aaY`^_X`_YV`a^WUX_\`	chr10.fa		3412319	F	10C7G17	72					
+HWUSI-EAS610	1	4	59	284	1065	0	1	AATCATAACTGGGAGAGTGGGGTGAATGAAGACAAA	[^bbba]aabbba]b[b_baba^baaaaaa`_aaaa	chr10.fa		3412876	R	36	119					
+HWUSI-EAS610	1	4	72	72	316	0	1	TTCAATGCCCAGCACTACACAGAAACCAACTATGGT	aa_R_`bbbbabbbba^aa_ba^_baaaaaa_ab`W	chr10.fa		3412934	R	36	119					
+HWUSI-EAS610	1	4	62	114	387	0	1	CATGTGTTACTTTAGAATATACCTATCAAAAGACTT	]X]_O_YVQVaa^__^a``YZ^`]aX\a_^aa_\TV	chr10.fa		3413038	R	36	118					
+HWUSI-EAS610	1	4	35	419	1751	0	1	GAAGGAACTCAAGACACAAACCTACAAGCAGAAACT	`_baabbabaaa_baba`^`_`_`aW\aba`_aa_`	chr10.fa		3413339	R	36	119					
+HWUSI-EAS610	1	4	28	1146	1751	0	1	CACTGAGACCCTAGGCTGGCTAGACAGGAAGATCCA	a`aba\a_^W^^^`S_`X\^Z^^YS_[US_U\SUUB	chr10.fa		3414185	F	36	114					
+HWUSI-EAS610	1	4	67	1281	1448	0	1	ACCAGCCACAACATGACCTGATTCTTAAAGAAATGA	a`aaa_[a`a`Y\]``^_aa^^a_`]`a`\^[^`a`	chr10.fa		3414349	F	36	119					
+HWUSI-EAS610	1	4	96	415	829	0	1	ACTATCATTTCTTTAAGAATCAGGTCATGTTGTGGC	aba`babbbbabaaabbaabbabb_abab`aa_b`a	chr10.fa		3414353	R	36	119					
+HWUSI-EAS610	1	4	20	76	1855	0	1	AGTAGAGAAGGGTGGATGAGGAGACCCAGGGAGCGG	_a]`a``a`a`]R_aa`a^aa`aaaaaaaaa`a`aa	chr10.fa		3414801	F	36	119					
+HWUSI-EAS610	1	4	71	344	1263	0	1	AAGGGTCGTGAAGTCAGTTTGGAGCTTAAAAGGAGA	[`\``L_bab`aa`aT`]_^`a`_a``aaa_aa_^^	chr10.fa		3415157	F	36	119					
+HWUSI-EAS610	1	4	93	679	1830	0	1	TGAAGTCAGTTTGGAGCTTAAAAGGAGACCCGGGCT	aaa_baa^aaaa`a_a_aaaab_ab_a^_U__W\`a	chr10.fa		3415165	F	36	119					
+HWUSI-EAS610	1	4	54	97	62	0	1	TTCATATCTGATCCAACACTTGGTGGTCTATATTCT	`]aa_aba^IT_ab``]UZ_`[Y^a`W``^\L[``_	chr10.fa		3415288	R	36	118					
+HWUSI-EAS610	1	4	58	1076	1477	0	1	CAAGTGCTAAGAGTCAAGACATAAACCATCATTTCT	`baaaaaba^_aa^aaabaaabbaaX````a`_a^a	chr10.fa		3416145	F	36	119					
+HWUSI-EAS610	1	4	62	492	1387	0	1	GCTGTGACATTCTGGTCACTAATTCCTCCTTTGTCC	`aaa_b`aaaaaaaa_a`aaaaaaaaaaa`aaa_`a	chr10.fa		3416229	F	36	119					
+HWUSI-EAS610	1	4	7	993	1707	0	1	AACTTTATCCCTGCAGGTACAGAAGAGAAGCTTGAA	a`_aaaaaa_]_`]__`X``_a[^aY`__[T]_aW_	chr10.fa		3416300	R	36	119					
+HWUSI-EAS610	1	4	38	1110	839	0	1	GGATTCATGCTTGAAGCAAACTGAAAGATATCATGA	aa^`a\_a]]_\`_[]_^_`_^[\____`Y_]]`^]	chr10.fa		3416382	R	36	119					
+HWUSI-EAS610	1	4	43	228	715	0	1	AAGGGATTCATGCTTGAAGCAAACTGAAAGATATCA	``^YYSY`\OYYaaaa^\`YGXaa__YW__W\Z_`^	chr10.fa		3416385	R	36	118					
+HWUSI-EAS610	1	4	57	92	987	0	1	GGCTTGGAAGGCAGAGAATGCTTTGGCAAAGGGATT	abbbbbb`[aabb`Yaababaa`bbaa^`aaabUZ_	chr10.fa		3416413	R	36	119					
+HWUSI-EAS610	1	4	37	943	2011	0	1	ATGAGCTTCATAGGCTACTTCATGCATGTGTTATGC	aba`a_aa_aa__Za`a]`___YSY_^^UWQ^_^`W	chr10.fa		3416841	R	36	119					
+HWUSI-EAS610	1	4	61	704	794	0	1	ACCAAACTTGCATCCTCTGTAAGAGTAGTATATACT	`aa_aaY^aa`_aa]b_baaa_a_]H_`\^__a__`	chr10.fa		3416890	F	36	38					
+HWUSI-EAS610	1	4	6	1101	1553	0	1	TATGGGCCAGTCATGGTGGTGCATACTATTAATCTC	a`Z[[a`abaQZ^bbba`ZaaY`ZOOaa_TaaPDT`	chr10.fa		3417132	F	36	116					
+HWUSI-EAS610	1	4	57	1263	625	0	1	CAGGGTGACTTTGAGCTCACAGAGACCCACCTGCCT	Xbbb]`ab`bbb_a_bab`Za`Zababbbaaababa	chr10.fa		3417183	R	36	54					
+HWUSI-EAS610	1	4	35	223	1208	0	1	GTACTGGGCATATAATCTTTGCAAGACCAGGGCCTC	a]Q_[a^`[HZV\V]\\XaROZTZ]Q^_]SP]Z_P`	chr10.fa		3417794	F	36	18					
+HWUSI-EAS610	1	4	38	520	935	0	1	TGTCACATGCCTGCAATCCCAGCTCTCAGGCACAGG	aa\aa_aaa`^a`aW]a][`^`Z_\`^S\]^_`UX_	chr10.fa		3417932	F	36	119					
+HWUSI-EAS610	1	4	82	1106	1692	0	1	TGTCACATGCCTGCAATCCCAGCTCTCAGGCACAGG	aaWFXZXUaWKZ`Y^Z\V]SRVY_\XTT_ZSZ^YT\	chr10.fa		3417932	F	36	117					
+HWUSI-EAS610	1	4	58	675	816	0	1	TCCCCTAACTGGAGAACACAAAGCGATCATCCTACT	abaa`b]a_baabaaaaa`aaaa`a`a_`a__aa\^	chr10.fa		3418307	R	36	119					
+HWUSI-EAS610	1	4	85	1307	994	0	1	AGTAGGATGATCGCTTTGTGTTCTCCAGTTAGGGGA	a`a`_]Xa__b__Uabb_`bb_b`[_IXab\\^Z[b	chr10.fa		3418307	F	36	118					
+HWUSI-EAS610	1	4	41	562	1234	0	1	GCACCAGTTCTTTGGCAGAATCTCCCCTAACTGGAG	aaaaaaa`aa`aaa__a`Yaa`aa`__a_`\a_a^`	chr10.fa		3418329	R	36	119					
+HWUSI-EAS610	1	4	5	1168	2038	0	1	TGTGTCTCTGTGTGTTTCTGTGAGAGTATCTATCTG	a```aaa`[aWa\`^`a`UF^_``]_^a_\R]_]__	chr10.fa		3418566	R	36	118					
+HWUSI-EAS610	1	4	5	779	431	0	1	GGACCTTTTCTTTTTTTTTCTTGTAAATAGCATAGT	aa\__aaaa_baaaaaaaa_aaa^`__a^____`_^	chr10.fa		3420004	R	36	119					
+HWUSI-EAS610	1	4	9	441	1471	0	1	GCTATTTACAAGAAAAAAAAAGAAAAGGTCCGAGAT	`aaaa``aaa`aa``^^a_a_a`]aaa_^aa`Y_]]	chr10.fa		3420009	F	36	119					
+HWUSI-EAS610	1	4	4	1469	895	0	1	GTGGTGCTACGCTTATAATCTTGGCAGTGGGGAGGT	\a_aaaaaaaa`baaaaaaaaab]a`a^aSZ\V`BB	chr10.fa		3420323	F	36	110					
+HWUSI-EAS610	1	4	25	68	689	0	1	AAAACCATGGTGCTGTGCTGTGTGAGAGATGCTTGA	]a`bba`aaa]ab_a_aaab^a_aaa_a`_baaaa_	chr10.fa		3420441	F	36	119					
+HWUSI-EAS610	1	4	31	893	150	0	1	GTTATAAGTATGTGCATGTGTTGTGCATTGCTTACT	a`aaaaaa^a``]a_```]`^``^a_``_`]__`__	chr10.fa		3421645	R	36	119					
+HWUSI-EAS610	1	4	7	492	1355	0	1	GCTGAGGGTCCAAGTAGACACATACTAATTAGAAGC	aa`aI`a_\__\`_^[[Ua_a[R]a^aYa`SaO]]^	chr10.fa		3421717	F	29C2T3	62					
+HWUSI-EAS610	1	4	43	1721	231	0	1	ACAGGAAGAAGTGCTACTAATTATTATGTGTCTACT	aaa]T]]P[aVQV^`_]_`a`XXGM_\\R[YZ\[UZ	chr10.fa		3421729	R	18G4G12	70					
+HWUSI-EAS610	1	4	62	1517	1300	0	1	ACTTCCCTGAAACAGTACATATCAATACTGCCATTG	`ab`aaa_^W_\NX^]a``^aaaaaa_`\]OX[a``	chr10.fa		3422090	F	36	119					
+HWUSI-EAS610	1	4	30	1239	99	0	1	AAATGTAACTAACATAAAATCTCAGCATAAATGGTG	aa_`___`]]^`^_``_a^a__]_[]__^^^[\XT_	chr10.fa		3422153	F	36	119					
+HWUSI-EAS610	1	4	48	788	1456	0	1	CTTAGTACTCTGTGTGTGCACTAGTGAAATGTCCTT	aabababababbbb`b_bababab_babaab`a]ba	chr10.fa		3422225	F	36	119					
+HWUSI-EAS610	1	4	66	409	872	0	1	AGTACTCTGTGTGTGCACTAGTGAAATGTCCTTCAG	ab\_aaab_^`ab^aaaaaaa`b_aaaa^a`a_aa`	chr10.fa		3422228	F	36	119					
+HWUSI-EAS610	1	4	98	162	900	0	1	AAGTCCCCTATATCCCCCTCCCATGATCCCCTACCC	`XaXba]\`\`^aaa]aaaa`a`_aZ^aa^[SXaaW	chr10.fa		3422600	F	36	119					
+HWUSI-EAS610	1	4	65	710	671	0	1	CAGTCTGGCAGTTCTTCAGAAATTTGGACACAGTAC	`bbabbabaaa_aaaaR]]a_```aa_``^___[`_	chr10.fa		3423525	R	36	33					
+HWUSI-EAS610	1	4	5	331	407	0	1	AAATGGGACCTCATAAAATCGAAAAGTTTCTGTAAG	aabaaa_aaa```aaa`aa`aaaa_a[aa_`a^^__	chr10.fa		3423964	R	36	20					
+HWUSI-EAS610	1	4	90	1172	1423	0	1	TTTCATGTGGTCTTGGATTCGGTTTGCAAGGATTTT	aab`aaa\aa__aaaa__a_a`UTZKUV[[^RV]`_	chr10.fa		3425388	F	36	18					
+HWUSI-EAS610	1	4	45	1435	780	0	1	TTCACCATCTAAGAAGAGTAAGCAAATTCCTGGTTT	abaaa`aa`aaa`aa`a`_a`a_a`]_`_^``_]`_	chr10.fa		3426830	R	36	119					
+HWUSI-EAS610	1	4	12	120	797	0	1	TGGAAAGGGCCGATCAGTGCTCTCTTAAGGTTATCT	aa_^_W^abbbaaaaaaP]aaaaaabaaaa_`aa``	chr10.fa		3427219	F	36	119					
+HWUSI-EAS610	1	4	63	84	2024	0	1	CAAAGGAAATAGTTGTATGTAGAAATCAATAACGTG	aa^_ZZX^_`abaa\`_`X`[\QZ]`_UZ`_^]b^a	chr10.fa		3427345	F	36	119					
+HWUSI-EAS610	1	4	38	1196	1317	0	1	GGCAGGAAGCATCACCACTGAGGGAGAGCGCTAGGA	a]a`a`Z^`]RZZ`[WWT`aZa^]W^R`X`R\T`\R	chr10.fa		3428359	F	36	118					
+HWUSI-EAS610	1	4	27	1399	1015	0	1	CCCTTCCTCATAGAACCACCCTCATCCTAGCGCTCT	_WYXW`W_\baaT[[aabbb_LZaaaU]^RW^]]R`	chr10.fa		3428383	R	36	118					
+HWUSI-EAS610	1	4	43	773	1846	0	1	CAGAAGAGCTGAACCACATCAAGTCATCTCCATGGA	aa_Zabab`bbab_ab`aa_a[```abaa_aYaaaa	chr10.fa		3429762	F	36	119					
+HWUSI-EAS610	1	4	40	1477	847	0	1	TGCATGTTTGCCTGTTGGAGAAGGAGGTAGCTTTTT	abaaaZaaa]`_aaaba`_^XUZ\[]`R_Y]`_`aa	chr10.fa		3429867	F	36	119					
+HWUSI-EAS610	1	4	94	366	1941	0	1	TGCTCTCTCCCTTTCTTCCTCCTTCCTGTAGCTTAC	a^`_ab`K``^^[S^[_aa\aa^]baVVL\]XNHP\	chr10.fa		3430295	R	36	117					
+HWUSI-EAS610	1	4	35	722	360	0	1	TTTCACAACGCTCAGAAACCCACTCTCCAAAGATAG	a[aa``aaa_WG`_aYVZ]_]PW]LZ_]`RL]MFZa	chr10.fa		3430460	R	36	116					
+HWUSI-EAS610	1	4	68	1256	1892	0	1	ACACAGAGTAGAAACCGTCGCACCTAAGGAAGACTG	`ZYM`aaRFX`YL]\V___a_a[\ZBBBBBBBBBBB	chr10.fa		3430768	F	36	69					
+HWUSI-EAS610	1	4	14	1426	1111	0	1	ATTCAACATTGTCCCCGTTTCCCTCTCCCTCCCATT	_b`a`[`__a[H_\_H^TZ`_LNR\[a]PXa[XPQ_	chr10.fa		3430822	R	15A20	104					
+HWUSI-EAS610	1	4	21	1041	1748	0	1	GCAGGAAGTAAGAGGGTAAAAGTACAATTGGGAACA	\Z]aba_YR`ZbWbabS_^Zab^Yaaaabb`baUU`	chr10.fa		3430994	F	36	119					
+HWUSI-EAS610	1	4	72	565	923	0	1	GGGAGCAATGAAAGACATAGTGAGTCAATCATCCAG	`]`Q`]\T_^U]P]SXUZ_b^]YSVOU[]WZ]P\W[	chr10.fa		3431224	R	36	118					
+HWUSI-EAS610	1	4	8	271	1217	0	1	CCAGTGAAATCTAGATTGTAGAAGCAGGACAATGAG	YUaS\\`b```ZX_IS\\ab^T^b__bYSIaK\PF]	chr10.fa		3431469	F	1A27A6	77					
+HWUSI-EAS610	1	4	50	1769	1784	0	1	TTCCAGGTGCACCACTGCTCATGGCTGTGACACCTT	aa`_V^aU^\ZR[S__U\^^ZBBBBBBBBBBBBBBB	chr10.fa		3431710	F	31T4	51					
+HWUSI-EAS610	1	4	59	1483	324	0	1	ACAACAAAAAAAGAATAGTTAATAAACCAGAATCCT	aaaaaa`[^a``]^]a_V]aaaaa``_^[R]_`[`a	chr10.fa		3431834	R	36	119					
+HWUSI-EAS610	1	4	64	1435	568	0	1	GTGGACACAAATGGCTTTGGGGATGACTAGAGTGGT	a_aaaaa\^`\WNOV`_]\\XX[]L][[SW]YN_YB	chr10.fa		3432227	F	36	114					
+HWUSI-EAS610	1	4	15	525	894	0	1	AAGCTGGGCAAAACTTGTTCACCAATAGAGAAGACT	aaaaa`^aa`\Y`a_aa_a`]__``a``_a__`_``	chr10.fa		3432512	R	36	119					
+HWUSI-EAS610	1	4	83	636	536	0	1	AGGGTACAGATAGAGTTCTTTCTGCTCAGGTTCTGT	^a_V]WW``_WQWF^[``a^a__^XX^Y_`Z\U]]W	chr10.fa		3432625	R	13T22	108					
+HWUSI-EAS610	1	4	52	1290	101	0	1	GAGGGTACTGATAGTGTTCTTTCTGCTCAGGTTCTG	a\`^][`_a^^_^^W`_a`aa`____`W^[ZU^^`_	chr10.fa		3432626	R	8A27	81					
+HWUSI-EAS610	1	4	11	1316	1991	0	1	AAATGTAAAAATAACAATAAAAGGAGAAAAGGTCAC	a\YV\H[[^`[``a__]_`a]\^^YXV][X^ZOU[V	chr10.fa		3432780	R	36	118					
+HWUSI-EAS610	1	4	59	1119	1549	0	1	CATGTCAGCATAGATGTCATAAGGCCCTACTCCTAG	^a\\YX]ba[bbba`\S_bbbb__\_aa``VOWbWZ	chr10.fa		3432956	R	36	119					
+HWUSI-EAS610	1	4	94	156	1146	0	1	ACCATTCCTGGCCAATCATTTCATTATCTCATTGGT	_^_`Y`aa[^aa_a[Y^[]__]W]X\a__`^^[aXB	chr10.fa		3433571	F	36	114					
+HWUSI-EAS610	1	4	92	433	1256	0	1	ATCTCTGTGTCTGTAACCATATGACACTGGGAAAAG	_R[_`ZaSbS]`a[T]Wa_X__[]]X_^__U\_UXW	chr10.fa		3433611	R	36	118					
+HWUSI-EAS610	1	4	49	1223	871	0	1	TTGCCAGCTCTTTTGGGTAAACACAAAGGTCTGTCG	a`]_Pa_a_aaaa_X[a]aaa_a`a`a\ZT_`a^`a	chr10.fa		3433877	F	36	119					
+HWUSI-EAS610	1	4	10	250	100	0	1	GTTGCTGAGTTGTATACAAAGACTGCATTTAACTTT	a\aaaaa_a__a_a^a\_a_a^^___`__`_`Y___	chr10.fa		3433912	F	36	119					
+HWUSI-EAS610	1	4	80	825	873	0	1	CTCCTTTTCTATACCGCTTCATAACCCTAATAAGTA	a_aaabbb_a\]a^aaaabaabaaa``a`aaZ``[`	chr10.fa		3434177	R	29G6	81					
+HWUSI-EAS610	1	4	88	1759	530	0	1	AAGAAATTTAAAGCATAATCATCGAGCATAAAGTTA	``IGa`b][a_WLX^W`^^aa\`XZG]Z^ZWMTM]_	chr10.fa		3434394	R	36	115					
+HWUSI-EAS610	1	4	44	884	1097	0	1	AAGCGGGCAGATCTCTGTGAATTCAAGGGTAGACTG	```^U]a]aa___aaa`[a][^```_ZZXP]\UY``	chr10.fa		3434629	R	36	41					
+HWUSI-EAS610	1	4	34	579	876	0	1	GTCCTCATGCTTGTAAAGCAAGCTATTTACTCATTG	a^a`bbabbaabbaaaaaaa`aaa\aaaa`a```aa	chr10.fa		3435272	F	36	119					
+HWUSI-EAS610	1	4	54	196	572	0	1	CTTGATTCTAGTTTCTAATCACTCACACCTTTACTG	_\a_LaX\]Y``aZ`_``X`_bb````a`bbbbb]R	chr10.fa		3435325	F	36	118					
+HWUSI-EAS610	1	4	46	631	1473	0	1	CAGGAAACCTGGGCATCTCAGCAGCCAAAGCTTTGC	__`aaa^aaaaaaa^aaaaZ_aaP`aaa`a`a`^`_	chr10.fa		3435503	F	36	119					
+HWUSI-EAS610	1	4	92	1410	1719	0	1	GGGTCACGTAGGGAATGATAACCTTCAGTTTATATC	aaaU^a`a]aa`a``aaaaaa_]ab_`a_aaaaaa`	chr10.fa		3435738	F	36	119					
+HWUSI-EAS610	1	4	91	1168	469	0	1	ATGATAACCTTCAGTTTATATCCCATGCTTGTCTCC	aab`aa`]_`a__a]b_aa`a]a__[`_`^YX^_[\	chr10.fa		3435752	F	36	119					
+HWUSI-EAS610	1	4	18	125	70	0	1	AGCTTCGTCAGCACTGATGTCAAGGAGAGAATGCCA	a]baabaYa_abaa```_a^a]Ya`_aa``_^_aa_	chr10.fa		3435826	R	36	119					
+HWUSI-EAS610	1	4	79	1408	995	0	1	TGCAACGGCAAGTGCCACAGCTATCACACACTGAGT	_WWb_`YKV_VXOV_Q\^```abb^O[XPa^[V^U_	chr10.fa		3435937	R	36	118					
+HWUSI-EAS610	1	4	64	999	2000	0	1	TGTAACATGTTTGGAAAGAACCAAGGAGAAGAGATG	aa_a`^``_^a^___`a^`^_^]_`_ZZZ^^^WZ^_	chr10.fa		3436309	R	36	119					
+HWUSI-EAS610	1	4	49	444	209	0	1	CTCTTGAAGTGCTGCATTTTCTACCCTGCCTCCCCC	`aa`aaaaa\a`aaa_aaaaaaa`aaaaaa]^]^`Z	chr10.fa		3436529	R	36	119					
+HWUSI-EAS610	1	4	47	1545	1213	0	1	TCAAAGGATGAGACTAGTAAACCTTCCCCCAATTTT	aa_a``^\`\[_``aaa^`a_^^_____^^YU_`_a	chr10.fa		3437074	R	36	119					
+HWUSI-EAS610	1	4	12	1477	1464	0	1	CAAATTCCTCTCTATCCGACCTGCAGAGTGCTGGCA	aa^baaabbZbbabaabbaaaaba_a^`NX_aaa^`	chr10.fa		3437159	F	36	119					
+HWUSI-EAS610	1	4	18	1718	1097	0	1	AATTTGTTTTGTCTCGGGAGGTAGGGCTGTGGAAAT	abbbb___bba_Za``]a_aTRa`]]_a__Y_^___	chr10.fa		3438263	F	27G8	81					
+HWUSI-EAS610	1	4	85	545	1406	0	1	GCCACCAGGCAGATGCTGAAACCAACCCAGGTCCTT	a`aab`Xa`]Xa]_a^``XZYY__a_^`ZaTT^``^	chr10.fa		3438546	R	36	119					
+HWUSI-EAS610	1	4	60	128	337	0	1	TACAGCAGCCAATGAGGTCACAGCACAGTGGCTCCT	aa`\^^[abbaaba`a`^aaabbaaaab_b]`_ab\	chr10.fa		3438769	F	36	119					
+HWUSI-EAS610	1	4	42	1320	581	0	1	TGGAAGCATAGTATGAGGTGGGACCCAAAGCAGTAG	aa]a`a_`a`\]aa^``][`]]^W\U^`^^Z^ZU__	chr10.fa		3438890	R	36	119					
+HWUSI-EAS610	1	4	66	353	416	0	1	AAACCTGTCTGGGTCACTAACGGTTAATACACTGTT	_`^aabb]a__aa_aaa`]]`aaY`_aa`^``_`^`	chr10.fa		3439411	R	20A15	82					
+HWUSI-EAS610	1	4	18	53	1070	0	1	AGGTTATAACAGGTTATGTTTTCTTTTGTTCTGGCA	W_bX`^a`^a`abbba^b^baabbbb`b`bb`^^a\	chr10.fa		3440076	F	36	119					
+HWUSI-EAS610	1	4	19	1589	289	0	1	AGGCAGAGAAAGTAGGAGATTCAAGGTCAGCCTGGG	a[aV`^`aV`Y\ZaaTP^_a_a_^V[VX`XPS\R^W	chr10.fa		3440188	R	36	118					
+HWUSI-EAS610	1	4	44	1577	1704	0	1	CGTGAAAGAGGGGCTGTAAGCCTGGTGGTCAGGGAT	ab^_T_`\]`]_OO[a^[`aX`^_LERVPTXVUBBB	chr10.fa		3442205	F	36	103					
+HWUSI-EAS610	1	4	90	660	913	0	1	GCACTCTCCCTCTCCCCATTTCTGTGTGTGTGTGTG	aaa]a[aaa`^]aaaaa`aaa_aaYa\`\^W\^R[Y	chr10.fa		3442631	F	36	119					
+HWUSI-EAS610	1	4	58	1787	1741	0	1	ATATCTCTGTGNGGTTTTGATTTTCATTTCCCTAAT	aba`_`V[`PUDW[Yaaa^^[Wa]O]]^_][U^\]_	chr10.fa		3443145	F	11T24	110					
+HWUSI-EAS610	1	4	56	27	108	0	1	TGGCTATGAGGACCAGACTGTCCTAGAACTCACAGA	abbab]bbbbaaa_L_^ab_X`bbababbbbb^]a^	chr10.fa		3443416	R	36	119					
+HWUSI-EAS610	1	4	69	530	565	0	1	GAGTTCTAGGACAGTCTGGTCCTCATAGCCAGTTGT	`ab`bb`baaab`b_`abaaabaa`aabaa`b_ab_	chr10.fa		3443421	F	36	119					
+HWUSI-EAS610	1	4	56	40	1558	0	1	GGGCAGCTGATCAAAACAGGCTCTGAGGCAGACACA	aaXbaabab_`aaaZR__a]a]aYX^`a`]`UaZ`Z	chr10.fa		3443873	R	36	119					
+HWUSI-EAS610	1	4	76	194	1594	0	1	CAGCGCCTGTTTTGATCAGCTGCCCCTCCCCCCCTT	_I]G]aa[a`a_aS\[^Z[aZ``\`^\^]`aa^\U[	chr10.fa		3443884	F	3A30C1	81					
+HWUSI-EAS610	1	4	37	1399	465	0	1	TGCTAACTGTCTTTCTACAGCCAGCAAACAGGCACA	V`YYU]V`aX_``X[_^Ha]\S\aab`]HPF\a_aa	chr10.fa		3444514	F	36	116					
+HWUSI-EAS610	1	4	4	1065	364	0	1	AGGAATTTTTAAATTTTTTTATTAGATATTTTCTTT	^_\^\abbbbababbbbbbbbbbbbb_babbbaabb	chr10.fa		3444675	F	36	60					
+HWUSI-EAS610	1	4	61	425	1847	0	1	GAGTTGACTACATTGTGTTCCACAAAAAATGGTAAC	a`a[X]``Z^^]_`a\^\`_`S`a`Y[a[V[UU]^^	chr10.fa		3445465	F	36	119					
+HWUSI-EAS610	1	4	15	1430	79	0	1	GCTTGTGGGGAAGAGAGAAAAGCAGAGAAAGTAACA	a_TOSG^ZVJLPSTW`W^`_MVWYW]ZWZXRVX]XZ	chr10.fa		3446068	F	36	116					
+HWUSI-EAS610	1	4	86	1525	1793	0	1	CTCTGAATCACACTGAATATAAAATCGAGNGCTGTT	ababba`aa_\__a`a`b`a``^a]_aaYD\V_`S^	chr10.fa		3446171	R	29G6	110					
+HWUSI-EAS610	1	4	48	1737	1618	0	1	TCGCTGAAGAGAGACAGGCAACTGATAAATGATAGG	aaaaa_`__^]^^^___^_]^^`]]ZWYZ^_Z^^Z]	chr10.fa		3446533	R	3A32	81					
+HWUSI-EAS610	1	4	78	256	1693	0	1	TTTATCAGTTGCCTGTCTCTCTTCAGCGAAGTGGAA	a``]]aab_aabbbaYaaaaaa_aY]aa^\^W[\[`	chr10.fa		3446540	F	25T10	85					
+HWUSI-EAS610	1	4	91	1465	959	0	1	AGGTCTCTTAGAATCACCCCAGGGCATCCTGCNCAC	ZZT[aaaba^QZST^\]Za`XWGZ]``^^]^BBBBB	chr10.fa		3447128	R	32A3	94					
+HWUSI-EAS610	1	4	49	852	1069	0	1	ACTGTTCTTGTTGTGAGGAACCCTTTGTTAGGGGAA	UW\b]_]^a_ZY`___^ZV_aZR_a^X]TV]\TO^a	chr10.fa		3447164	R	36	118					
+HWUSI-EAS610	1	4	86	28	1224	0	1	TGCTAGTATTATAGCCTAAATGTAAAAGTAAACTGT	_aa`a`_`a]H__`bb_a^^ab_U\^]aabb_abba	chr10.fa		3447195	R	36	118					
+HWUSI-EAS610	1	4	23	143	766	0	1	AAATCCACTAATAGTGATGACAAGATACTGCTAGCA	a_^aabaaaba_W`[``aa]a]U_^^aaaaaa`^``	chr10.fa		3447539	F	36	119					
+HWUSI-EAS610	1	4	95	549	1384	0	1	GTGTAATATGCCAGAGAATGTTGAGATTTCGCTGTT	a_b\babbbabaabab__`b^a`Ta`aab_a`aa]b	chr10.fa		3447622	F	36	119					
+HWUSI-EAS610	1	4	41	1019	1240	0	1	TCTCCCAGTAAGGTAGGCCTCTATCTCCAGTCAACT	a\^Z[]`\_ZWUXGTR[YZTZ\W[SWUNZTNV\YBB	chr10.fa		3448223	F	36	108					
+HWUSI-EAS610	1	4	58	1097	1144	0	1	GGACGGCAGGCGAGGGGCTCAATGCAATAAGCTGTA	_^[`^^_SFQSR^`W]`R_V__Y]VYRXZQOF[W\[	chr10.fa		3448470	R	36	116					
+HWUSI-EAS610	1	4	48	1755	1822	0	1	AAAAAACCCCACTACTCACTATAAAAAGAAACAAAG	abbbabaaa`a_```a___aaaa`__a_`_a_`_``	chr10.fa		3449098	F	36	119					
+HWUSI-EAS610	1	4	3	1355	1060	0	1	AAGGGGTGAGCTGATTTTGAGATAATTTCTCAACTC	\_`_H_a^\^[a^U`[_b`Y^U_^OX_a][Y]_]`a	chr10.fa		3449281	F	4A31	106					
+HWUSI-EAS610	1	4	37	1062	951	0	1	GTGAGCTGATTTTGAGATAATTTCTCAACTCCAAAC	aaaa\aaa`aaaabb_bbbbaaaaa`aa_aa]a``_	chr10.fa		3449286	F	36	119					
+HWUSI-EAS610	1	4	69	403	448	0	1	ATAAACATTTCACCATAGTGCAGCTTATATAAAGAA	abbbbbabbbbbbbbbaaabbbbabbaaabaaab`a	chr10.fa		3449340	R	36	119					
+HWUSI-EAS610	1	4	37	929	1342	0	1	GATTACAGAAGCCACCAAAAGGATTAATAGACACAG	`a_SZ^WaW_^J_a_]^JXMOXU`XU_\SM\^WBBB	chr10.fa		3449620	F	29C6	87					
+HWUSI-EAS610	1	4	84	1124	437	0	1	ATAATCTTGATTTTCCTCGTCCCTTGACTGGCACTT	ab_aa_aba``bbaa_a\```]_`ZJY`[\V]_[\_	chr10.fa		3449729	R	36	118					
+HWUSI-EAS610	1	4	19	1391	1100	0	1	AGCACTNGAGCAGGTTTGGTGGAGCCATAGAGATGA	abbbb^DZbbaaaa^aaaa^b_b``a_aaa^a^`aa	chr10.fa		3449896	F	6G21G7	72					
+HWUSI-EAS610	1	4	71	1644	847	0	1	ACTGGGGGCAAGGAGGAGAGTAGAGCCTAAACCAGA	a``]]_]]_aa^Z[`]^aaa\_Ra^\_^^`_^^^a^	chr10.fa		3449980	F	36	119					
+HWUSI-EAS610	1	4	34	835	768	0	1	GGACTAGCAGGGAGCATGAGAGCCAGTGAGGACTAA	aa`^a]a]`aaa^^\\aa``]_^V^a^a^`^\]`_Z	chr10.fa		3450131	F	36	34					
+HWUSI-EAS610	1	4	78	1622	62	0	1	AGTCAGTGAGGACTAACAGGGAGCACAGGAGTCAGT	a\R__^S[_\\W^\__N[\TUWXW^W\VWWXVVSPQ	chr10.fa		3450180	F	36	22					
+HWUSI-EAS610	1	4	79	779	1388	0	1	GAGGACTAACAGGGTGCATGAGAGCCAGTGAAGATG	a`aa_`aaa`___aWa__aa_a[a_\^_^`ZZa\_a	chr10.fa		3450303	F	36	55					
+HWUSI-EAS610	1	4	27	437	2022	0	1	TGGAGTGTGATCCTGGTTGCTTTCTTTTTCCAAAAA	abbabab\bbababbbabababbbbbbbbbbbbbbb	chr10.fa		3450565	F	36	119					
+HWUSI-EAS610	1	4	56	1684	222	0	1	ACAAAGTTATTGGCTATGAATAATGGGAGGGAGGTT	aaaa`a^aaa`_]aaa_P[`aU^]NVTU\[WX]]V`	chr10.fa		3450607	F	36	118					
+HWUSI-EAS610	1	4	89	1658	1109	0	1	TTTAAAATATACTCGGGCTAGATGAAGGTCGATGCA	abaaaaaaba_a^_US__`_WDTVa^[VY^^____]	chr10.fa		3451122	R	36	116					
+HWUSI-EAS610	1	4	68	448	1581	0	1	TGGGACATCTTCTGGATATATGCCAATGACCCATGG	`a]_baa`aaaababa^aa`aa`a[aaa__aa^aaa	chr10.fa		3451989	R	36	119					
+HWUSI-EAS610	1	4	14	940	1818	0	1	GTTGGGACATCTTCTGGATATATGCCAATGACCCAT	a_`a`]a`___`___a```aaa___^a_`^`^]_^a	chr10.fa		3451991	R	36	49					
+HWUSI-EAS610	1	4	34	948	702	0	1	GGTCCAATGGTGAAAAGGTGCTCACTGTCTATGTGG	`_Z\_^_aabU]]Y[_a^U``__aX`]__`UU_VZ\	chr10.fa		3452768	F	36	119					
+HWUSI-EAS610	1	4	87	339	1623	0	1	TAAGGATCGAGGAGAGGCATTTTCTGTCATCTTCAG	`bbb_^Y_QQ\HTSYa[`QRSSaXbaaSab_ZQYZB	chr10.fa		3452819	F	36	113					
+HWUSI-EAS610	1	4	85	972	1045	0	1	GAGGAGAGGCATTTTCTGTCATCTTCAGGAGGCTTG	a`ZPR`M^\_^`_`^\[_\TZ__WTWZ_[W[WU\__	chr10.fa		3452827	F	36	118					
+HWUSI-EAS610	1	4	5	654	1537	0	1	ACATGCATGCACCACATACACCATTCGTTAACTAAC	YaaaV_ZbZbbbbb]aa_baaabb\abS_b_aaabW	chr10.fa		3452863	R	36	119					
+HWUSI-EAS610	1	4	74	506	1052	0	1	TGTACACATGCATGCACCACATACACCATTCGTTAA	_aabaZababaaa`a`aaaaaa`[a`aaa`aa`a`^	chr10.fa		3452868	R	1A34	81					
+HWUSI-EAS610	1	4	40	790	1480	0	1	AACTTTTCACCTTTTTGCCCTGAGACTGAGCTAGTC	][a`aaOQ_Ka]]aaaW^^\]aab]Y`a\PQZ[`[S	chr10.fa		3452966	F	C35	84					
+HWUSI-EAS610	1	4	23	1023	450	0	1	CAGTCAACCTCACAGAAAGGCCCCTTCTGACTCAGT	abbaaab_aa`a_aZaa]Z`aa`_`a``^[^Z_^TQ	chr10.fa		3453002	R	36	119					
+HWUSI-EAS610	1	4	81	1550	1303	0	1	CACTTCCACATCACTCTCATCATTGAAGGAAGTCAG	`a[`baabaabaa`b`bbbbaabaaa`aaaaa`ab]	chr10.fa		3453227	F	36	68					
+HWUSI-EAS610	1	4	72	98	450	0	1	GGATCTTCAGGAGTGCAGTCAGTGCTCTTAACCGCT	`a[^\__aaaaZ\M_`__Q^S\W__\`_[`a`__[U	chr10.fa		3453613	F	36	15					
+HWUSI-EAS610	1	4	45	1017	420	0	1	CTGGGCTTGTGGTCCTGAGTTCTATAAGAAAGCAGG	a\__R\_`b]^]_^W_b`_]``]a`Ua`a\a^X\`[	chr10.fa		3453669	R	36	5					
+HWUSI-EAS610	1	4	73	145	1679	0	1	ATGGGAGCATTTTATCAATTGAGGGTCCCTCTCTGA	[`baa\bb_aa`aaabb\__aTab`Ubbbab_a`a_	chr10.fa		3453790	F	36	119					
+HWUSI-EAS610	1	4	17	69	636	0	1	GCATCTTCTCTCAATGAGGCCAGACTAGGCAATCTT	aaS_babba_G_aaaaaaabaaaaa`aaaa\a`___	chr10.fa		3454335	F	36	26					
+HWUSI-EAS610	1	4	11	1663	1427	0	1	AGTTGAGATTGCCAGTCTTTCCATGGGGCCAGCCTT	aa_baaaab^]^X^a__baaa`a`_`__^Z_`\V\a	chr10.fa		3454460	F	36	119					
+HWUSI-EAS610	1	4	45	1663	806	0	1	TGACTGGGACATTGCAAGGCCCTTGTTGACAAGGTT	aZ]^```Y\]aa]R]`a][^^Z^ZNTYZ[U[XRPR_	chr10.fa		3454829	F	36	118					
+HWUSI-EAS610	1	4	40	562	1417	0	1	GGAACTAAGGAACTTATTAACACCATGGACAGAGGG	a`aaa^U]aa_`]aa`a```^a^_aaa`^_Z_]``a	chr10.fa		3455102	R	36	119					
+HWUSI-EAS610	1	4	96	958	454	0	1	TGAAAGGACTGGGTGTTTCAAGATGACACTGAGACG	aa_`^`[_____aV`MVZVX^`^TZ[]^R^][[ST]	chr10.fa		3455146	R	36	118					
+HWUSI-EAS610	1	4	57	1638	1651	0	1	ATCTGAACCTCGCAGTAAAATTCGAACATAACACTT	a`_`_a`__]_S_]_^`^a`_\_^_^[`[__[]^^_	chr10.fa		3455471	R	12A9T13	47					
+HWUSI-EAS610	1	4	41	520	1661	0	1	GTCTGGAAACTTGGGGGTGAATATATACAGCTTCTT	a_aab`Yaa`baaaaa^VaZZ_a`aaa]```a`_`a	chr10.fa		3455644	F	36	119					
+HWUSI-EAS610	1	4	98	1503	544	0	1	ACATCTTCTTATGGCTCCCACAAGCTGACCTCAGGC	_W_JSYS\VF_a_YNNTUPQVHFTXPYBBBBBBBBB	chr10.fa		3455670	F	3G18G13	51					
+HWUSI-EAS610	1	4	12	1111	1424	0	1	TGAGGACCTGAACTTCTATGAGTCAACTTCTTCAGC	abU]]a__aa^_^a`Sa``aZa_^_V]`US\_^\a]	chr10.fa		3455785	R	36	119					
+HWUSI-EAS610	1	4	32	316	1060	0	1	CTATGATCAACCAGCTGCTGGATGATCCAAAGCTGA	a]aRYR]_P[a[T`a^`aXX]T``QP`aa`_SZQNV	chr10.fa		3455885	F	36	118					
+HWUSI-EAS610	1	4	65	1235	1400	0	1	TGGGAGTCCTGGTGCCCAGATGTTGCCTTCCTCAAT	aa`TXaXPY`]a^^^[^a`\V][`_]^YRR]ZZGZY	chr10.fa		3456227	F	12C23	83					
+HWUSI-EAS610	1	4	41	242	92	0	1	ATTCCAGCCAGCTCCCAGTAGAAGCACAGACGATAT	_a_ab^_aa`aa_a``__\Y_aaa^T\``_[__\[Y	chr10.fa		3456298	R	36	119					
+HWUSI-EAS610	1	4	23	1170	526	0	1	AGCCTTTTGTCTATGGCAGGTTGTAATTCTCTTGAA	`[_]`\`aYW^^a__[Y[]`[]TP_^S\MWU^[LYZ	chr10.fa		3456382	R	36	118					
+HWUSI-EAS610	1	4	51	919	78	0	1	GTTGTGAGTGGAAGAATTTCTTCCTTATTAGCTACT	aaaa\X\]RV_^aZ`^`aa_aa_Za^^``__[^^_`	chr10.fa		3456509	F	12G23	81					
+HWUSI-EAS610	1	4	48	1165	1204	0	1	ATGTTATATTAAGTTTACCCCTGCCTGTGGTGCCTA	abbabababaa\a`abb___ab^a^aa`b_]a`^a`	chr10.fa		3456861	F	36	119					
+HWUSI-EAS610	1	4	18	504	1390	0	1	ATATATCATAGTGCAATACAATACCAGTAAGTCACT	[`a`\aabaaa]aa]aa`]aa`^_aaa^X]a\]]^X	chr10.fa		3457226	R	36	119					
+HWUSI-EAS610	1	4	23	45	1028	0	1	GCCACCTGGGATGTTATGATATGAATATATACGTCA	a]a_bbaa`_Z\a``[UbaWI\[``\aa``aYa^ab	chr10.fa		3457682	R	36	118					
+HWUSI-EAS610	1	4	83	843	1987	0	1	GAAAACCAGTCCTTGCCTTAGGAGGGAAAAGTAAAG	a`aaaa^_a^[Z^``_^a_Y_aW]U]R_W]_R^^_^	chr10.fa		3457828	F	36	119					
+HWUSI-EAS610	1	4	33	599	1308	0	1	TAGCTGTTCAGAGGGCAATGTTTTGGGGTTCACAGT	`_aabaZaaa_aaabaaa_`\aaba`]a]V]_a_bR	chr10.fa		3458083	F	36	119					
+HWUSI-EAS610	1	4	80	223	1212	0	1	TAGCTGTTCAGAGGGCAATGTTTTGGGGTTCACAGT	][_ba`\`_RWW^aabJ]ab_`aaaaaaYa^__^aW	chr10.fa		3458083	F	36	118					
+HWUSI-EAS610	1	4	88	594	13	0	1	TTAGAACTGAATGTTCCTAAAGGAGTTTACATTCAA	a``_``_`_\[_`__^^^^]_____]_[_[^^^^`_	chr10.fa		3458324	R	5T30	82					
+HWUSI-EAS610	1	4	35	936	555	0	1	TTCCACCAAAGCAGAAATGTCCGCTCTGACTTTCTT	aa`_``_``a___``\^`a__Z_]_]__\X_`_^``	chr10.fa		3458422	R	21T14	88					
+HWUSI-EAS610	1	4	67	985	589	0	1	TGGGGAACAGAGAGTGGTTGGTTTGTGCCCAGGAGG	abaaZP^^aaPaWa\aa\]aa^a``^^^\UX^XU__	chr10.fa		3458502	R	36	119					
+HWUSI-EAS610	1	4	93	1030	467	0	1	AAACTTAGCCCAGAGTGAAGAAGTATTAATTTACAG	aaa`abaaaa__`^`^b__a`aa``aaa_baaaa`a	chr10.fa		3458541	R	36	119					
+HWUSI-EAS610	1	4	5	1239	501	0	1	CTGGTTCAAGAGATTTGGGAACTATAGATCTCTCCT	Xa`_N^baaaTa_]Z__U\DYZ]^_`^a_T_^YJO]	chr10.fa		3458765	F	36	116					
+HWUSI-EAS610	1	4	18	47	1395	0	1	ACCTATAGTCCATTTCCCAGCCATTAACTAGGAGAG	Y`a]aa[`_ababaabb`I_baaa`]]a`aa\_aT`	chr10.fa		3458794	R	36	118					
+HWUSI-EAS610	1	4	92	523	231	0	1	TCTCAGTGTGAACCCATGCCTTATATTTGCATAGCT	`Q_[`^UZNVYUOU^^aa^YaYTX__^R[R_W_`YX	chr10.fa		3459241	F	1T34	96					
+HWUSI-EAS610	1	4	76	1378	1502	0	1	ACCACTTGGGGCTTTGAGCCAGGCATTTCATTACAC	a^aaZ]`_a[aQa^_^Y``aa[[SQVU_[TUXU]R\	chr10.fa		3459364	R	36	118					
+HWUSI-EAS610	1	4	52	659	686	0	1	AAATGCCTGGCTCAAAGCCCCAAGTGGTACAGCCAG	R``[_aa]bTaZT^XVZ]aZ_W]^aa_FQVa_SS^b	chr10.fa		3459372	F	34G1	82					
+HWUSI-EAS610	1	4	96	1050	1549	0	1	GCTCCAGTTCTCAGAAAACCCAGTGGCAAGGCAGCG	`a]`^``^]^]\Z_`_a_X`\Z]^_TW^[QPPUXVU	chr10.fa		3459601	R	36	118					
+HWUSI-EAS610	1	4	93	709	878	0	1	GAAACAACAATCAGGCCAAGCTCCAGTTCTCAAAAA	U]a_F]^\bb]\a`Z_S```aa__a`^_Z^QT``aa	chr10.fa		3459620	R	32G3	81					
+HWUSI-EAS610	1	4	83	169	377	0	1	GGTTTAGAATGTAGTTCTGCTTCCCGCTAACAGAAT	abWa`aba^ab_aa__a`aaaaa_aaa___aaa]`Z	chr10.fa		3460082	F	25A10	81					
+HWUSI-EAS610	1	4	7	1636	453	0	1	GTGACATGGTGTGACTGAGAAGGTTTTTTTCCTGTG	aYO\L]__WPTSFY[[XQa`S`]WTRR]W^UVLPRV	chr10.fa		3460305	R	4T9T21	68					
+HWUSI-EAS610	1	4	85	55	2041	0	1	AGGAAATCAGACCCTGCATTTAAAAAGAAACTTCTC	a^\_^_aZ[``_]_``]U]]_WZ\^``_Y_Y]WY\]	chr10.fa		3460350	F	36	119					
+HWUSI-EAS610	1	4	44	1355	541	0	1	AGATAAGGTATCAACCCCACAGTAACATCTTGCCCC	`_abbb_][aaaaa^a``aa_`^aaaaaa``[`[aa	chr10.fa		3460560	R	36	119					
+HWUSI-EAS610	1	4	50	993	1724	0	1	CACAATGACAGATAAGGTATCAACCCCGCAGTAACA	aabbbbbaa`b`bababU_abab]aa_U_a_`a`]`	chr10.fa		3460569	R	27A8	93					
+HWUSI-EAS610	1	4	9	813	1508	0	1	AAAGCACAATGNCAGATAAGGTATCAACCCCACAGT	a`[\]a\`_aXDX_]Y_aY`_UQ][]`N]_^Z]^_W	chr10.fa		3460573	R	11A24	110					
+HWUSI-EAS610	1	4	91	438	753	0	1	GGTTTGGGGTTGTTTATTTTAGTCTTCAAGGAGGAA	aa^abab``_ab_aaaaa`aaa_`a`]^^aaXaaZ_	chr10.fa		3460784	R	36	119					
+HWUSI-EAS610	1	4	46	135	433	0	1	ACGAATGTTAAAGAACATAAAGAATCTGCATTGGTT	aaa`^^a_`a]ZaZX_X_[\]a`^_a^`____a`[^	chr10.fa		3461508	F	36	119					
+HWUSI-EAS610	1	4	90	1498	1868	0	1	ACTCAAAAGTAAAGGGACAGTGACTGTGCCTTGCTT	``a___a_a_]_`S`__W``N__]_^OQOWZO]SPZ	chr10.fa		3461840	F	36	118					
+HWUSI-EAS610	1	4	38	940	1410	0	1	TGTGTACATCTCTCCTAGTGTAAGATGTGACNCATG	aaaabbaabaaab`aaab`baaabaaa^aaXDW`^a	chr10.fa		3462030	R	31A4	110					
+HWUSI-EAS610	1	4	100	1048	756	0	1	TCTTTAAGAAAGCAGGACATGCATGCTATGGGGAGC	a[aba_``__^`___`_X_aa]`_aY_a^^_]^]_]	chr10.fa		3462550	R	36	119					
+HWUSI-EAS610	1	4	41	298	1370	0	1	TAGCAATCAGTGGTGAAGGGCCCAGTCCATTGTGGG	`SVa`a^a]a_`^\^`^``Paab^\\a]S_\aP]_V	chr10.fa		3462615	R	36	118					
+HWUSI-EAS610	1	4	5	361	1641	0	1	ATGCCTTATAACTGGATGTCATGGAGGCATCTCCTC	a_a`a_`V``]]aaa__`^a`T_``_`^`]YV_`\_	chr10.fa		3462660	F	36	41					
+HWUSI-EAS610	1	4	95	565	1840	0	1	TTTCAGTTTCCTTGCGCCCCCTTAGGTACTACACTG	`abbb^`aabbaaab`aaba_^_a_aNU_\_a]a_a	chr10.fa		3462754	R	36	119					
+HWUSI-EAS610	1	4	95	1485	767	0	1	TAGCCATATATAAGGACCTAATCCCTGTGTTTACAT	aa_`^aaa__aaY_Y]_`a__^^]___Y_^]^`Y__	chr10.fa		3463125	F	36	119					
+HWUSI-EAS610	1	4	35	1620	1744	0	1	GAATGTACATGCTAGCTGAGGCTGAAAACTACTACA	a_[aa_^Va_`_ZYaZ]YU_YVZ`]^]\WW]YXZY\	chr10.fa		3463312	F	36	119					
+HWUSI-EAS610	1	4	9	1677	267	0	1	GAACTCACGTGCTTTTGTTCTTTTGTTACATGCAGA	U_aa[\_VV[LZ]a_aZY^^\[Xa]Za^a^[LX[R]	chr10.fa		3463362	R	36	118					
+HWUSI-EAS610	1	4	24	454	30	0	1	CAGTGTGTATCTGCCTATGGGAACCAGGCACATTCC	abb^`[_`\\\X`WT[`YPZRV]`aZaTSaTaZ]Z^	chr10.fa		3463613	F	36	118					
+HWUSI-EAS610	1	4	13	1003	1517	0	1	ACAGATCTGTTTACCGACTAAAGCAAGAACATTGGA	aabbaa`abaaaa``baabaaaa_bb_aa_`aaaa`	chr10.fa		3463824	R	36	32					
+HWUSI-EAS610	1	4	13	209	731	0	1	AAAGCACACAGATCTGTTTACCGACTAAAGCAAGAA	]^aaabaab`baaaabZaaaaaabaaa`aaaaaa__	chr10.fa		3463831	R	36	11					
+HWUSI-EAS610	1	4	84	941	285	0	1	TGGTCTAAGGAGGAACCAGAGTAGATACTTGGAACT	aba]\aaaba]aaaaaaba^b_aa_a`W`a\[T^^a	chr10.fa		3464146	F	36	16					
+HWUSI-EAS610	1	4	54	240	1857	0	1	TGCTGTGCCTCTCTCAGTAAAGTGAAGGTCAATGAA	abbaa`bbbbbbbba]a`]Zaa_abbbb^a``aa`a	chr10.fa		3464773	F	36	119					
+HWUSI-EAS610	1	4	36	92	1557	0	1	GGGAGTAGAAATAGGACTCAGCAGTCAGTGCTAGGG	abbab`Wa]_Z_baaZa`a``a_a_aT`^aa_aa``	chr10.fa		3464858	R	36	119					
+HWUSI-EAS610	1	4	76	522	771	0	1	GAGCTCCGTCAGCGTTAGAGATTGTCCACTGAAGGG	aTaXa``aa[V\Ja`bab`]b]TbXYaZH]W]`][_	chr10.fa		3465078	R	17A18	79					
+HWUSI-EAS610	1	4	96	446	1732	0	1	TTGGATTACATAATTTAGGCAACTGAAGGATGAAAA	abbbbbbbaaba`aaabbabbb`abaabbaabaaba	chr10.fa		3465633	F	36	119					
+HWUSI-EAS610	1	4	28	931	1489	0	1	AAGATTTCAGGGAGAGAAATCATGAATCTTAATCAT	abaYaaaZS_]`WR_`[Z^`\Z`VQYZa_[T[`U`a	chr10.fa		3465674	R	36	118					
+HWUSI-EAS610	1	4	79	1479	1539	0	1	TTGATGATAATGGTAGCAAGGAGAGAGGTTGGCTGC	aZ`]^]\YV\``^SNXX]_a_]UWPKTYUVVBBBBB	chr10.fa		3465856	F	36	96					
+HWUSI-EAS610	1	4	88	1298	457	0	1	GGGTCTCCTTATTCAGCCAGATGGGCCAAATGCCCA	abbabba]babbaaaa`ab`aa`V`aab`aaa```a	chr10.fa		3466294	F	36	119					
+HWUSI-EAS610	1	4	47	1431	716	0	1	ATGCCCAGCAAACAGTGCCTATGAACAGAACACACA	a]`a]X]___``Z`^X__^Z`_YW^Y^]]_Z]U]X]	chr10.fa		3466323	F	36	119					
+HWUSI-EAS610	1	4	53	547	979	0	1	GGGTGAAATAGTATGCACCCACTCCAGAGAGACACT	ab`_b_aaaaa_aaa``a`````_^^^`a_`^^`^a	chr10.fa		3466399	R	36	119					
+HWUSI-EAS610	1	4	34	840	1991	0	1	TTTAGAATTGGAGGCTAAGGGCCCACAATGAATGCC	abba_abbZH]__]^ab^^`Z]aYa\a``a_[WW^]	chr10.fa		3466483	F	36	118					
+HWUSI-EAS610	1	4	24	536	184	0	1	TATCCAAGGGGTAGAGGATAAACTGGATATGGAAGG	aaaaaa_abaa_a_aaa_``___aaa_a]a``Y^a`	chr10.fa		3466586	R	36	119					
+HWUSI-EAS610	1	4	64	1229	726	0	1	TATGATTCCATTGGCACATTTATGAAACATGAGACA	aaa^R]`UY``^[[^`X]__a]_`a__Y^`]]^]^^	chr10.fa		3466735	R	36	119					
+HWUSI-EAS610	1	4	37	632	1276	0	1	ACATCATCTTCACTGTACTATGATTCCATTGGCACA	aRFV_aa`a\LPL^\Ta[]a`[\YLDS__XVRUa^`	chr10.fa		3466753	R	36	114					
+HWUSI-EAS610	1	4	50	1424	1368	0	1	AGGGCAGACTCTCGTTTTTTTCACAGCCTGCCTATG	aaP]a[a_abaaa`V```bbaKV_aUU`XP\`aaYZ	chr10.fa		3466838	F	36	118					
+HWUSI-EAS610	1	4	44	764	242	0	1	ACGGGGAGCAGGCCAGGAAGCAGTGTTTGTCAGTGG	``_`[X_]``\W]]aa`\`]XTaZ`\^``X]\]V``	chr10.fa		3467258	F	36	119					
+HWUSI-EAS610	1	4	8	509	1420	0	1	CTAGGACACCTGCGAAGAGGGAATTTCATTTGAGGA	a`_b]b`b_ab```_[`_ba_bab`bbbaabaaa\Z	chr10.fa		3467444	F	36	119					
+HWUSI-EAS610	1	4	61	120	548	0	1	CTTGCCCACAAGCCAAGCTTATGGAGGAAATTCCTC	aaaabbb]a[aabba\a__`S`aaX^`WQZ__`a_`	chr10.fa		3467475	R	36	119					
+HWUSI-EAS610	1	4	57	1546	966	0	1	TGGGCAGCGCCATCCCTTAGGCATGTGGGCTTGACC	[a`a`XX^\X````SX^^`^^UUZaUX\\^UNX[U`	chr10.fa		3467565	F	36	118					
+HWUSI-EAS610	1	4	70	1211	1520	0	1	GTAACGGAGCAAGGCAGAGGAAGTGAGCCAGTGCTC	a^a]]a]\`\XQZ]^a`^]\X]\U]^[^ZKRKTYYX	chr10.fa		3467613	F	36	118					
+HWUSI-EAS610	1	4	61	195	1283	0	1	GGAGATGTACTTTGATTGATTGGTTGGTTGATTGAT	aa_b``a[aaaaaa_``a`aaaa[aba_aa_a_a]_	chr10.fa		3467711	R	36	119					
+HWUSI-EAS610	1	4	43	1304	37	0	1	TTGCTTCACTGCTGCTATTATAAAACATTGGCCAAA	aaaaaa`a^a`_a^^a`aa`a`a`a^`_VR^^X[``	chr10.fa		3467764	R	36	119					
+HWUSI-EAS610	1	4	21	211	923	0	1	TTCTAAGAGAGGTGATTAGTAGATTGCTTCACTGCT	aaba__a]b\baOb_aaaa^ba__`a__aa_``aaZ	chr10.fa		3467787	R	36	119					
+HWUSI-EAS610	1	4	33	60	1331	0	1	GATTAAAGGCGTGTGCCACCACGCCCTGTTTTTCTT	a`aa`^W\Sba]a_aaa]_`[aaaa_`a`Y_\aa`_	chr10.fa		3468031	F	36	27					
+HWUSI-EAS610	1	4	46	1587	186	0	1	AAGAACAAGAAAAACAGGGCGTGGTGGCACACGCCT	`aa]_V^\a^a``a`a__`_S^XKSX^^aZ_TRX_a	chr10.fa		3468037	R	36	118					
+HWUSI-EAS610	1	4	93	1144	1775	0	1	ACACCTTCCATGAATATAAAAGTAAAAATCCTTACC	\a``Jaaaaa]baab`^bbbbaUaa_a`a^_a`a`_	chr10.fa		3469215	R	36	118					
+HWUSI-EAS610	1	4	7	994	1284	0	1	AATAAAATTGTAGACTAACACCTTCCATGAATATAA	abaa_bbbab_aa_abb``b_]aaa`aaa`aaaaaa	chr10.fa		3469232	R	36	119					
+HWUSI-EAS610	1	4	52	511	1427	0	1	TAAGAGAAAGAGTAAGATGATTTGAGGAACACGAGG	]]UWaZI_SZ_VT_^X^\[_TYaaTHWZa``^YY\B	chr10.fa		3469967	F	36	113					
+HWUSI-EAS610	1	4	56	1040	23	0	1	GAGTAGGTATGGTCTTCTTGGAGATCAGAGTGTCAC	a_a_a\P[]a^_XZa``aa`a]aY]]W]_^X^Y]_]	chr10.fa		3470437	R	36	119					
+HWUSI-EAS610	1	4	61	743	373	0	1	AGATCACATAGAAGAGTCTGGATTCAAGGGCCAAAC	aba`aaaaa`aaaa_a_abbaa_aa`aa``a`a`_`	chr10.fa		3470607	F	36	119					
+HWUSI-EAS610	1	4	6	1196	1533	0	1	AGATTTCACATTGGCTATAAAATCTCACAAATGGCA	Y_[^\\_YY\aUbaa^ZZW[^Z]]VWGWQS[OM]Q]	chr10.fa		3471265	R	36	117					
+HWUSI-EAS610	1	4	100	800	1727	0	1	GGATTATCATGCAGCAGAGATGCTGCAAGTGATGTA	ab_ba_abbaaa`_b`babaaa`_ba`ab^b`aa_a	chr10.fa		3471620	F	36	119					
+HWUSI-EAS610	1	4	74	1097	1110	0	1	GGTTACAAGCTGTGTGACAAATACCTCAGGGTCTTA	aa_[a_WHRRO]\R[a^V`]UYFJU_RU]\_ZR]]\	chr10.fa		3471748	R	36	116					
+HWUSI-EAS610	1	4	17	1716	801	0	1	TGTCACACAGCTTGTAACCGATACAAACATTTTATA	^YY_a[]]^\a]ZWW]`X_^_Z[X_[YU^]^^_^aW	chr10.fa		3471765	F	36	119					
+HWUSI-EAS610	1	4	1	1514	1392	0	1	TGTTGAAAATGGGGTTCCCAGAAGGTGATTGAGCCA	aabb^Waaaa[UY]N]``Z^[QYYZBBBBBBBBBBB	chr10.fa		3472438	R	36	71					
+HWUSI-EAS610	1	4	59	1709	1258	0	1	GAAATCTCCAGAGAGGATTAAAACTTGGGAGACACC	aaaa_[^R\`V\_]]X[__a__]ZZU\^\VVYY[]_	chr10.fa		3473325	F	36	119					
+HWUSI-EAS610	1	4	54	657	979	0	1	TGGGAGACACCGTCTACAGGGCAAGAAGGACAGCAA	aba`[_\\aaab^aa`[^a^^aaaa^`aaaaaa]Y^	chr10.fa		3473350	F	36	119					
+HWUSI-EAS610	1	4	33	848	418	0	1	ACAAGTGTTCCTTCCTACTTGCTGTCCTTCTTGCCC	^b`_R[^]a]Y^`a]Z[_W_a`^[]_ZR[^]QFSVa	chr10.fa		3473368	R	36	117					
+HWUSI-EAS610	1	4	85	273	1764	0	1	TGTTCATTCAGGCATGTAAAGCACTGTCCAAAGTAC	aa]`babaaS_\bbaa_b]_a_X`aa_`b`VU_Vaa	chr10.fa		3473402	R	36	119					
+HWUSI-EAS610	1	4	75	1197	702	0	1	ACATAGGATCATAGGTGGAAAAAAGGGATCCTAGTA	TT^b_V`Vb`S`]`^a\JWb]W_aX`I\bbW`[XX\	chr10.fa		3473479	F	36	118					
+HWUSI-EAS610	1	4	54	138	732	0	1	CTCACATTATCAGCCTTATCAAGAGTAGAATTCCAA	abbababaabbbbbbb```ba_bab[bbaabaaa^]	chr10.fa		3473594	R	36	119					
+HWUSI-EAS610	1	4	90	456	1225	0	1	CTAATTAATCCAAGACTTAGTTCAGCTTTCCTATTT	`aabbbbbbb`abaaaaa``]babaaaaaabaaaaa	chr10.fa		3473846	R	36	119					
+HWUSI-EAS610	1	4	43	397	765	0	1	ATGTCAAGCAAGACAGCTTGCGAGCAACTATGCTTG	`aa_a`a``_aa___a^]`___\_`_`]_Z_[WZ^`	chr10.fa		3474386	F	36	119					
+HWUSI-EAS610	1	4	58	817	1749	0	1	AACACGTGTCCTTCCTTGGAATGAAGCTGTGTGTGA	ab`aabaaa_aaaa^abbaaaa\a_a^_a_aW^^aa	chr10.fa		3474584	F	36	119					
+HWUSI-EAS610	1	4	60	396	387	0	1	TGTTGACAGTAACTACAAACATAGAGGCACTGAGGC	aaaaaR^]^Ya_aXXXaZ_NYZSaaab[a\Z[BBBB	chr10.fa		3474652	R	34T1	99					
+HWUSI-EAS610	1	4	28	570	1323	0	1	ATTCAATAAAGGGGTGGAAAGCATTTGATAAAATTT	Q\`aa^aYY^``bb_`_Z]`aaabbbbba`a`_aa]	chr10.fa		3475192	F	36	119					
+HWUSI-EAS610	1	4	49	1703	1699	0	1	CACACCCCCTAGTCCTTCCCAAATGGTTTCACCAGC	aaaaaZ^a`^`X\a^_`aaXaaa\[Z\a_`]Z\X`[	chr10.fa		3475563	F	36	119					
+HWUSI-EAS610	1	4	15	1008	1234	0	1	CTTGGTCCCCAGCTGGTGAAACCATTTGGGAAGGAC	]bba]`baa`babbbbZbbab]aaababZbaaabaa	chr10.fa		3475574	R	36	55					
+HWUSI-EAS610	1	4	33	84	782	0	1	AGGGTTAGATGAAAATGAGTTCCATGGCCTTATATG	Yabbabba^_ba^^^a``aYaab^abbbbabbbabb	chr10.fa		3475618	R	36	119					
+HWUSI-EAS610	1	4	27	388	1397	0	1	TGTGCAGCCCTGCTTGACACATATCCCATGGTTCTG	a]]`bab_H_WR_aabb_`aa`bUb_a`^WZZaaVS	chr10.fa		3476042	F	8T27	106					
+HWUSI-EAS610	1	4	35	1472	228	0	1	GCCTGGACTGTGTGAGATGCCAGAGCCATGTGCCAG	`_XQ\\ZMXXPIT]XZ`\Z]BBBBBBBBBBBBBBBB	chr10.fa		3476075	R	36	49					
+HWUSI-EAS610	1	4	79	185	671	0	1	TTTATAGCTTCATTGCATGAAGACATTGTATGGAGA	a\ZY_`bbbaabaab_Z]b^^aba\ab`\a\aa]Y`	chr10.fa		3476117	F	36	119					
+HWUSI-EAS610	1	4	21	310	1161	0	1	GGGGACCTGTGTAAGAATGGTAACTAGTAATCACAC	`_]ZZ^a]a`a\]]aaaba`[RW\baaY_]aaaa]a	chr10.fa		3476606	F	36	119					
+HWUSI-EAS610	1	4	8	263	504	0	1	TCACAAGAATAGTCTGTAGCCCAGTCGCTAATATTG	aa`aa`a^_`__[`a^^^a___[_S`a_XX_TWVUX	chr10.fa		3476780	F	36	119					
+HWUSI-EAS610	1	4	88	1411	1649	0	1	AGAGCTAAAATTCTGAGCCTTACACTCACAGTGACC	ZaaaVb^RP^Z_bb_abaabb]ab`abbaab[a]`a	chr10.fa		3477343	R	36	119					
+HWUSI-EAS610	1	4	58	1081	1384	0	1	AAAAAGCCATGATTTTCTCTTCTAGAGGAGGTCAGA	a[W_]`a`a`a_aaaa_`_a``a`b_aa`a`LRMMY	chr10.fa		3477419	R	36	118					
+HWUSI-EAS610	1	4	48	713	1333	0	1	AAGGGATCACCATGAGTTTAAGGTCGTATATAGAGC	aabba_aaa``aaaab_bbaaba`aa_aaaaaa`aa	chr10.fa		3481887	R	36	119					
+HWUSI-EAS610	1	4	38	1488	231	0	1	CATTACTCAGGAAGATGAAGCAAGGGATCACCATGA	abbaba`a__a^aaaa_`aaa`aY[^`_a`__a`a_	chr10.fa		3481908	R	36	119					
+HWUSI-EAS610	1	4	4	178	1382	0	1	GCTTCATCTTCCTGAGTAATGAGATTCCAGAGTCAC	abZ`bbbababaababY]b_baaaWaaaa`bbWba\	chr10.fa		3481923	F	36	119					
+HWUSI-EAS610	1	4	84	142	1201	0	1	AGAGAAAACACCAAGCAAGTGTTTAGTGACTCTGGA	\`ba]a``bbbaX^`a]O_YaYa`XIYbaa`aP]aa	chr10.fa		3481948	R	36	118					
+HWUSI-EAS610	1	4	40	431	1066	0	1	ACTGGGTTAGCTACTATTCTCATTTTCAGTTTGTGA	_^bbbaY`bbbbbabbbbba`bbbbbbbbbbbbabb	chr10.fa		3482556	F	36	119					
+HWUSI-EAS610	1	4	21	1154	1461	0	1	CGTGTTTCTGCTTGACTCTATCCTGAAAATGCATAT	abababbabaaba_bab`bba]aaa`aaaaa__abb	chr10.fa		3482594	F	36	119					
+HWUSI-EAS610	1	4	53	1081	1656	0	1	GTGTTTCTGCTTGACTCTATCCTGAAAATGCATATG	a`b_aa`a__^_a^]a]_S^_^`YYR\\__^_`a``	chr10.fa		3482595	F	36	119					
+HWUSI-EAS610	1	4	19	706	406	0	1	AATTCTTCTCAGATATCTACTGATAATGTAGTTATA	]_\Z`V``WZ\^^^a[[[aaa`X_\H_`ZWS]X]`Z	chr10.fa		3483168	R	36	118					
+HWUSI-EAS610	1	4	97	437	937	0	1	GTGGTCATCTTCTCATTGAAAGCTGATGATACCAAG	`\_^__aa``aaaa`Oaa`^`a`aa^_a_``_]a_`	chr10.fa		3483815	F	36	119					
+HWUSI-EAS610	1	4	13	378	1701	0	1	CTACAATGCTCATCCTGGACTGCCTTCTATACGTGA	aabbaa_aaaaV_`a^_`aa]a``_^a_a]``]U``	chr10.fa		3483903	R	36	119					
+HWUSI-EAS610	1	4	14	746	432	0	1	AAAGTTCACCAAAGGTGCCTGGCTGGGCAAAAATGT	_abbabbab]aaX`]U`baab`__`a`\Ra`a_XPZ	chr10.fa		3483948	R	36	119					
+HWUSI-EAS610	1	4	3	1383	1649	0	1	AGGACTAGAAACCTGGACGTAGTCCTGAGGCAAAAA	aaa`^`a_`_`^]]^`^_`]a_X^]X_X]X]]]^^`	chr10.fa		3485397	R	36	47					
+HWUSI-EAS610	1	4	22	72	1701	0	1	GAAACAGAGAACAAGCGCAGTTAGTGTGCTATAGCC	a_]]]a`^^X]`a[aaa`N`]`^^XP[aaa]aa`a^	chr10.fa		3485456	R	36	119					
+HWUSI-EAS610	1	4	34	1648	946	0	1	AAAGGGAATTTTAAAAGTAGGCTTTTTGTCTTCACA	a`^V\[_]a_a`_]_`_Y`]W^_]]^[YY]_Z^^^_	chr10.fa		3485725	R	36	119					
+HWUSI-EAS610	1	4	38	972	198	0	1	ATGCTGTGTGCCCTTGAGCATTCCTTTGTGAACCAT	a]b`[aTbT[PaG[SaRaVX[a`aY\\XW`_a`^aX	chr10.fa		3486988	F	36	117					
+HWUSI-EAS610	1	4	99	620	326	0	1	GGTCCCACACAGAAAGAGCAGCCTGACGTAGGTCAC	aaV\__]YT^aUYSa`Q^\VGKPRP\U`GPVYMS\T	chr10.fa		3487325	R	36	116					
+HWUSI-EAS610	1	4	96	702	2014	0	1	AGCTAAGCAAGTGGAGGCAGAAAGGTCCTTCCTTGG	aaaaba_aaa^^a`_`_a__aaa]\U___\a`^WU_	chr10.fa		3487555	R	36	119					
+HWUSI-EAS610	1	4	56	1733	329	0	1	GGAATATAAGTAAATAAGTTTGCAAATAGAGCTTTC	a_abbaaa`^\abaaaa^^aa_`aa`_aX^[``aaa	chr10.fa		3487928	R	36	119					
+HWUSI-EAS610	1	4	2	102	912	0	1	GCAACTGACCTTTCTTATTTCAGTCACTCTATTACC	`ZQW]_]QS`_aab`_XZ^`a_a_aa_``aVa`aa_	chr10.fa		3488437	R	36	119					
+HWUSI-EAS610	1	4	70	703	337	0	1	GATATACTATATTGGGTGCTTTGTATTCTGACCACC	`_b_aaab]a`aaaaa_a__aaaXaaa__a`_^a^a	chr10.fa		3488588	F	36	119					
+HWUSI-EAS610	1	4	80	241	981	0	1	ATATACTATATTGGGTGCTTTGTATTCTGACCACCA	P]ba^a[`^W_`U``[W^^ZaV`bbaba\V_a`b[\	chr10.fa		3488589	F	36	119					
+HWUSI-EAS610	1	4	94	601	1634	0	1	CAACAACAATAATAAAACAATCAGAAACAACTTAGG	abab^bb`ba_a`\b]b`ab`aaba`abb`^YYbaa	chr10.fa		3489898	F	36	119					
+HWUSI-EAS610	1	4	26	684	840	0	1	GAAGGGAACAAATTGTGTCATAGCTAAACAGAGTAA	_abbab`babbbbab`baaab`b_bbaa``b_a`b`	chr10.fa		3490520	F	36	119					
+HWUSI-EAS610	1	4	76	1258	1351	0	1	GTAAGTAGGATGGATATTGGACATTAAAAGCTAAAT	`_WJX`Pa]N__WGT\__^VUWX[YP]_^`]_]BBB	chr10.fa		3490683	F	36	104					
+HWUSI-EAS610	1	4	33	328	1942	0	1	AGGATCCAAAGATCTCCAGGCAACGGTAAGCCAGTA	[\[]aabba]ba]b_aaa`__aaa`_LFV\b\`a\\	chr10.fa		3491305	R	27G7G	75					
+HWUSI-EAS610	1	4	1	1030	904	0	1	AGAGGTCAAAGTAGAGGACTCTGGAATTTTTTTCAT	aa`^\T^aaa\O`aYa_^_```aZ\Z\a`a``a[a_	chr10.fa		3491550	R	36	119					
+HWUSI-EAS610	1	4	1	1552	1420	0	1	AGGCTCTGACATTCCATTTCCTTGCAGGCCGCTTGA	ab^ab`bbb_aZbaabb`aZ]`a_a_`aXN`\a_^Q	chr10.fa		3491706	R	36	119					
+HWUSI-EAS610	1	4	98	421	1423	0	1	AGGCTCTGACATTCCATTTCCTTGCAGGCCGCTTGA	`abb]b\^_`\`bb`Xaa_bbb`]`Xa^`ab`_aa_	chr10.fa		3491706	R	36	119					
+HWUSI-EAS610	1	4	29	298	1374	0	1	TATTATGGTTACATGTGACCGTGTTGAGAAAAAGTG	^^`ba_bbY`bb`bbVaa[RYYb]aab]X_baa^Wb	chr10.fa		3491856	F	19A16	96					
+HWUSI-EAS610	1	4	94	1100	665	0	1	GATTCAGAACACAACTCTGGATGGTGGCAAGTCATT	```a`WZ]`a```_^`W`a]Z]bZG^^[^Y`YWWaa	chr10.fa		3492065	F	36	118					
+HWUSI-EAS610	1	4	67	1566	992	0	1	TTTCAACACAAACACAGACATATTTACAACTTCCAA	_`baaaaaabaaaaaaaaabbbaaaa^aa`aaa^aa	chr10.fa		3492175	R	36	119					
+HWUSI-EAS610	1	4	86	1124	1933	0	1	GAGTGGTTTTGATGAATGAAGGCATGGCATTGTGTT	a_`W_a``[b^]a^]^_`\]^_^Z__]]X^^`Z_Z_	chr10.fa		3492237	F	36	119					
+HWUSI-EAS610	1	4	47	470	225	0	1	ATATAATGTGCAAGGAGATGTTGACACCTGGGCTCA	`]_`a`YTVSR^RVbWbPRa\Sa^`aa[]PH_]`_`	chr10.fa		3492970	F	14A9T11	42					
+HWUSI-EAS610	1	4	35	919	859	0	1	ACCTTAGGGATATTCTGTACACTTGTTCTCTGAGTC	aaaaa_abaa_aa^a`b_]\^Z`aa__N_]`a_`__	chr10.fa		3493174	F	36	119					
+HWUSI-EAS610	1	4	38	1447	1547	0	1	ATATCCACCACTAGGATAACACTCTTTCCCCTCCTT	a`\`[a`a_V]__`aa`aa_\^ZSa_[M]aHa`]Wa	chr10.fa		3493216	R	5T30	80					
+HWUSI-EAS610	1	4	43	1539	1847	0	1	TGAGCAACTCTAAGGGTCCCACCCCGTACCATTGGC	abaa_aa^a]__`\_YY^]^aTKS^]UUUU^UW\WW	chr10.fa		3493647	R	31C4	92					
+HWUSI-EAS610	1	4	73	1168	1455	0	1	CGAAAGCTCTGTGTTGCTGGGTTCGAGGCTCGGTGG	_a_`Q^R`aaSRaKZ_^aaSa\a`a[`__\Z`^W\Z	chr10.fa		3494271	R	36	118					
+HWUSI-EAS610	1	4	74	727	1862	0	1	CGAAAGCTCTGTGTTGCTGGGTTCGAGGCTCGGTGG	`aa[aa```__^aZ`_`a`_aZa`a`a``Z\`^TU^	chr10.fa		3494271	R	36	119					
+HWUSI-EAS610	1	4	16	1532	1855	0	1	GACCGATTCAAGAACAAGAACTAAGCACTCTATTTG	_`]`\^`WTa\a^_S[baa]\a`a^Y^Y_^\M[a`a	chr10.fa		3494618	F	36	119					
+HWUSI-EAS610	1	4	76	637	1008	0	1	AAGGCCCTAAGAGCAGAAACAATTCCGTGTTCTTGA	ababaaaaaab`b_aa]aaaa`aaa``^a^a`a`a`	chr10.fa		3494846	F	36	119					
+HWUSI-EAS610	1	4	73	890	684	0	1	CTTCATCTCTCTAACAGACACCAATACACCCCAGAT	ab``aba``\b_baab`\`ba_bbbbX_`]bb`\`b	chr10.fa		3495262	R	36	119					
+HWUSI-EAS610	1	4	91	401	1427	0	1	GGACAAGTCAGATGGCCCATGCAAAGGAGTGAACTT	aaaab`b_ba`a`b`a`a_`abb_ab`aaYa_a_`_	chr10.fa		3495436	R	36	36					
+HWUSI-EAS610	1	4	21	686	73	0	1	TTGGTCTTTTTAAATCTTGGCTACATATCAGGATTT	aa_^H^T\]RY`R_XV__`SNXZPTS\QTT^PSTS`	chr10.fa		3495598	R	36	117					
+HWUSI-EAS610	1	4	88	1028	789	0	1	CAACATTTTCCCTCACATATTCCCTATGGAACTTTC	ab`abbbbb_aabaaaa`aaba``_aaaa`a^aaba	chr10.fa		3496226	F	36	119					
+HWUSI-EAS610	1	4	93	839	1224	0	1	ACTTTGAATGATGCAGGATCAGATGCTTTTCCAGGA	[`aba_abbabababab]bbaba\babaaba`aa^`	chr10.fa		3496568	F	36	119					
+HWUSI-EAS610	1	4	57	394	688	0	1	AAACCAGAGCCTCCCACAAACCCTGACAGCAACCTG	aZMQ`aa_aa]a]^]H]aa_`][^XX^\`\M_UU^]	chr10.fa		3496603	F	7C28	82					
+HWUSI-EAS610	1	4	90	712	855	0	1	GTCTGGATGGCGTGGGACCCAGTTAGGGCAATGGAG	_^``a`Q\\\^``]\`X``\Y]\^\`\[U`X]\ZX^	chr10.fa		3496675	F	36	119					
+HWUSI-EAS610	1	4	96	441	526	0	1	GCGTGGGACCCAGTTAGGGCAATGGAGCAGTTTCTG	a[^Ya[`T_X\[]^\Q]a[Y]^Z]PTXTY^V^Y[X_	chr10.fa		3496684	F	36	118					
+HWUSI-EAS610	1	4	88	790	1506	0	1	CTTGGACCAGAAGTCGCTGAACAATCATGCTGATTG	abbbb]ababaaaaab^aa[a`a^aa[`]]a]aaa`	chr10.fa		3497911	F	36	119					
+HWUSI-EAS610	1	4	41	359	208	0	1	CACAATCAGCATGATTGTTCAGCGACTTCTGGTCCA	a_aabaaaaaabb[`abS]a``aa__`aaaaa^a]\	chr10.fa		3497913	R	36	119					
+HWUSI-EAS610	1	4	95	445	64	0	1	AAGGCTGTATTCCGGCACAATCAGCATGATTGTTCA	a]aaaab_aa`[Ga_[_\aa_[__]a^_\]`a^`W_	chr10.fa		3497928	R	3A8T23	69					
+HWUSI-EAS610	1	4	68	218	159	0	1	TGACAGTTCCTGTGACTTGTCACACTGGCAGCAGAG	a`X\Q_XZUQOZQRZFWZY]^]_^WI\Z]^XKTWM]	chr10.fa		3497973	F	15T16G3	82					
+HWUSI-EAS610	1	4	46	215	1338	0	1	TGGTCTTTGCATTACCCCGTGGGATTCATGTCTTAG	abaaa`aaba[`aabbabb`bab]aaaW_b`abaR_	chr10.fa		3498148	F	30G5	82					
+HWUSI-EAS610	1	4	72	250	1460	0	1	AGTTCATTGCCGTGCAGCAAACCACAGACCTTGCGC	^aaa_[`aaab]^aaaa``_aa`]`aa^aaa`aaa`	chr10.fa		3498202	R	36	119					
+HWUSI-EAS610	1	4	44	1332	565	0	1	NTGACATTCTCTCTCTGGGGACATGCTGCCCTGCAG	DHVSSWQQKOSSUSUUWUUUWSVUUMPSSPSUMPUU	chr10.fa		3498661	R	A35	107					
+HWUSI-EAS610	1	4	45	433	211	0	1	TGAGTGATCTGTGTACCACTGTTGGCACATAAAAGC	abaa]aa^a`a`a`ba[_aaa_aaa_aa_aa`__a_	chr10.fa		3498818	R	36	119					
+HWUSI-EAS610	1	4	87	1231	243	0	1	TCTTGGTAACAGTAGTCACTCTCCTTAAATATAGGG	]Z`\^Z\aa`aTMYaZTXXaO^S`[YVH[[VRZ__`	chr10.fa		3498861	R	36	117					
+HWUSI-EAS610	1	4	31	577	331	0	1	TTACCAAGACAGATTCACCTCCCATTACAAGGATGA	`aa_]b`_aaaaW`aaa_aa`aa]aa```_aa`_`_	chr10.fa		3498888	F	36	119					
+HWUSI-EAS610	1	4	60	256	78	0	1	GAAAACTCTTTCTATTCAGCATAGAATATGTTGAGA	_ZZXYZ_``a_^Z\_a[LZ^_]]XW__Y]]U[a^XB	chr10.fa		3499041	R	36	114					
+HWUSI-EAS610	1	4	47	26	763	0	1	ACAAGCATCATTTCCTAGCTCTTTTGGTGATCTCCA	abb_bbbbbbab`bb`^`b`ba`a_aaXaa`a_aaS	chr10.fa		3499459	R	36	119					
+HWUSI-EAS610	1	4	39	165	59	0	1	TACAGTGGAGATAGGCGAGAGGGGTTGGGGGTCACT	a]b]`N__R_Wa`]^M[``\R`b_EXabba[_`\_T	chr10.fa		3499567	F	15T20	99					
+HWUSI-EAS610	1	4	60	886	978	0	1	TTATCAGTAGAAAAGGGGACAGTGGTGCTTAGCAAG	abbaaaa_ab^_^aaaa`\`^a]aaWa^___T[]^_	chr10.fa		3499701	R	36	119					
+HWUSI-EAS610	1	4	14	201	425	0	1	TTATNCATTTACAAAACAAGCATGTCAATTATCAGT	\`]^D]^bba`^V`Y\```aa````ab]_a_a^ab_	chr10.fa		3499729	R	4G31	110					
+HWUSI-EAS610	1	4	55	1258	731	0	1	CCTTGCTATGACCTCCTTGCCCGTCTCCTACAGTCA	aabaa`aaaa`^`a``aaaaa_a^`^\`a`[^^^^`	chr10.fa		3499791	R	36	119					
+HWUSI-EAS610	1	4	31	1540	1406	0	1	CGACAGAAAGCTAATGGAATTGGAGGCTTACAGTGG	`ba][__`aaaaaaaaa^aa````]Z_`a]\Y_Wa`	chr10.fa		3499984	F	36	119					
+HWUSI-EAS610	1	4	15	726	868	0	1	CAGTCCTTCTGGGTTCTCAGAACTAAGCATAGGTCC	]``bbabbaabbbabbaW_bbbbbb]b`ab^aa\`a	chr10.fa		3501008	F	36	119					
+HWUSI-EAS610	1	4	2	866	1774	0	1	ATACCCCTTGGGATTCTGAACCCATATGCTCTGTCC	aa^`aaa`_aa``_aa`a_a`_`__a_`_^___^__	chr10.fa		3501554	F	36	119					
+HWUSI-EAS610	1	4	4	948	454	0	1	GTTGCTGCGTTCACCACCTCTGTCCACCTGCGGTGT	a`a`^^^\`XZ^`P\Z^Y\Z]\\ZYX\NZXN[[P\B	chr10.fa		3501741	F	36	114					
+HWUSI-EAS610	1	4	86	792	720	0	1	CCAAGCCTGCCAACAGCAGACTTCTTCTGTTCACAC	aabbb`abbbaabaabab`aaababaa_^]`a```b	chr10.fa		3501773	R	36	119					
+HWUSI-EAS610	1	4	28	3	676	0	1	GTGGGCCAAGCCTGCCAACAGCAGACTTCTTCTGTT	aXa^`aa`_Ya`^aa`WY^^^_M_^a^__W^_^^W\	chr10.fa		3501778	R	36	119					
+HWUSI-EAS610	1	4	28	1469	395	0	1	CACGTGCACAGTGATTCATTGTCTAGAGATGCCTCT	VXORW`W`__SYXTX_XWW``_\\]`WYUX^]_ZRR	chr10.fa		3501840	R	36	118					
+HWUSI-EAS610	1	4	97	1206	87	0	1	GGCTATTGTCTAGACACTAGACATTATATAACCCCA	\b`\aa`_JQ]_]`_baa`_a]aabbba`aaa\_aa	chr10.fa		3501948	R	36	118					
+HWUSI-EAS610	1	4	13	723	402	0	1	TAAATATACAACAAAATGGGCATATCACCCCTGTTG	`a_aaaaaaa___`a`aab_`a`]a_\^^_``b]_Y	chr10.fa		3502056	R	36	119					
+HWUSI-EAS610	1	4	13	268	292	0	1	ACATGCATGAGCATACACACAAAAATTAATAAGCCC	_abab\baaaaaaaaaa`_abbaaaaaaaaaaa_aa	chr10.fa		3502148	R	36	119					
+HWUSI-EAS610	1	4	16	1691	61	0	1	AAACCATATAAACACTGATATCCTCAGTATCCCTGC	aaa_`aWa_b_``a^___`a_Z_^Z`^Z`]X]ZZS^	chr10.fa		3502510	R	36	119					
+HWUSI-EAS610	1	4	74	61	1409	0	1	TTGGAAGCCATATCTGCCTTCCACCATGTTCATCCA	aab_\X`b_H]\`baaab`[a`]`aX_aX__X]a``	chr10.fa		3502735	R	36	118					
+HWUSI-EAS610	1	4	52	63	272	0	1	GGGGGCAGATCTGGTCTGAGCATTTACAAACACCTA	ab^a_baaR`aabb[^_aa`a`aaaaab[_aaa]_\	chr10.fa		3503003	F	36	119					
+HWUSI-EAS610	1	4	83	1185	1334	0	1	TGAGCATCTCTGCCTAGCTTTGCTTACTGAGTGAGG	``]a\PX]a[]^WVaWZZ[^^RT]\Z_[QJ\__GZ]	chr10.fa		3503127	F	36	117					
+HWUSI-EAS610	1	4	46	1408	1774	0	1	AAAGTAGTCCCCTTGTAGTCCTCCTGTGACTGGACA	abb^Ua_]aaa`aaaaaaa__aaQaaYa_W^a_]Za	chr10.fa		3503220	R	36	119					
+HWUSI-EAS610	1	4	31	560	18	0	1	GAAACCAGCAGAACCACCAACACAGTCGTGAAATCC	^_aba``]ab`]`]aa``[_```_`SUR[W__^ZZ^	chr10.fa		3503412	R	36	119					
+HWUSI-EAS610	1	4	30	928	828	0	1	TCAGACGTGGTGGGATTTCTCCTTATTCCTGATTTT	a__a__]Naa^___[aaa^a^``___aV]^a_^\__	chr10.fa		3504142	F	36	119					
+HWUSI-EAS610	1	4	45	627	1541	0	1	GGCTATACTGTAAAATCAGGAATAAGGAGAAATCCC	abbbabb`ab_babbb`abb_baaa`aaa_`ba`aa	chr10.fa		3504153	R	36	119					
+HWUSI-EAS610	1	4	37	396	1408	0	1	GGGATAAGGAGCTGCATGTAGTATTTCTAAAGCACA	``aQ`aa`]`]_```aaa_aa^aaa`aaa\T^`a^]	chr10.fa		3504202	F	36	119					
+HWUSI-EAS610	1	4	80	769	948	0	1	GGGATAAGGAGCTGCATGTAGTATTTCTAAAGCACA	`bb_aa__a]a_aa^Z_b_aa[_baaP[T^_`]_a^	chr10.fa		3504202	F	36	119					
+HWUSI-EAS610	1	4	26	1384	1744	0	1	CAGAATGGCTCGCTGGCAATTTCCAGAGACACATGC	`bbbba`_a]XWZ`V_aaa`aaa`[a^WaXaQ`R\]	chr10.fa		3504589	F	36	119					
+HWUSI-EAS610	1	4	52	557	1019	0	1	AGGCTGGAAATGAAGGTGCCCACTCTGGAAAGGTGG	abaabbbababb``ab\b^aaa`babab[a`bbWbb	chr10.fa		3504629	R	12G23	82					
+HWUSI-EAS610	1	4	53	903	1854	0	1	GAGTAACCGGGCGTGGTGGCGCACACTTTTAATCCC	aaa`ba_a]aT`b_aXaa^K^]a\`Uaa_babZ^^`	chr10.fa		3504903	R	36	37					
+HWUSI-EAS610	1	4	40	316	1034	0	1	AATGTAACCATAGAGAGCAGAGTACCTAATGCTGGT	^UabYabab`aaa``]aaaa_a^baa`^\_a`^`aZ	chr10.fa		3505170	R	36	119					
+HWUSI-EAS610	1	4	40	1328	698	0	1	TAGACAATGTCAGGGGGTGTGACATATTTTAGATGT	a`^]\aa`a`[Xa__aa]aX\`^``^``aa[^__a_	chr10.fa		3505750	R	36	119					
+HWUSI-EAS610	1	4	38	525	1128	0	1	CACCATCTTGCTCACCGATTTAATCTACTCATTCCA	_W]^``^Qa^aaa]a_a_`a_U]a`a`aa`_a`_YB	chr10.fa		3506673	F	36	114					
+HWUSI-EAS610	1	4	84	244	873	0	1	CTGAGAAGCAAGACTGCATCTGGCAAAATTGCAAAG	aababaaaaa_aa_aaa__`]aa`_[X\`^a___]`	chr10.fa		3507177	R	36	119					
+HWUSI-EAS610	1	4	31	1395	200	0	1	CGGGCTGCATGTCATTTTCTCTGAAAGAGCAACTCA	S[OXT_`ba]Y^b__[bab`]_TXWOW]Zaa\a_\\	chr10.fa		3507522	F	36	118					
+HWUSI-EAS610	1	4	88	1549	1963	0	1	TAATATCATCTTCCATAAACTCTGTTTGCCTGTCCC	aaaa_`a``UX_Z^`^`a[Q\[`a_^_^UT^^[TZT	chr10.fa		3507843	F	36	119					
+HWUSI-EAS610	1	4	30	1169	778	0	1	GGACAGAGAGGACTGAGAAGACGTAGACAATTAAGG	aaZ]_`[`aYa^]^ZYPP_aY]aXVNXS^V]a\]]^	chr10.fa		3508207	R	36	118					
+HWUSI-EAS610	1	4	26	725	1300	0	1	TAAGTTGGGTCATTTGTCTATAGGAAGGAAGGGGAC	aa___aa_aW^_aa^a__a_a^a`Z^aaV^`]__Z^	chr10.fa		3508250	R	36	119					
+HWUSI-EAS610	1	4	60	736	24	0	1	TTTGATCCTAGAATGAAAGCATGGAAAAAATAAGTT	abbaaa_abbbaabbaaaa`aaaaaaaa^`aa_a_a	chr10.fa		3508280	R	36	119					
+HWUSI-EAS610	1	4	49	1130	41	0	1	GGAGCACAAGATAAAAGTGACATCACAGTTTGAAAT	a``aaa`a_a`a`a_`a\Z^_`a^^^^`[_]_^__`	chr10.fa		3508324	R	36	119					
+HWUSI-EAS610	1	4	77	905	2017	0	1	GTACTTGTTAGCTCTCCATGGAGCACAAGATAAAAG	aR[X_a[YQaO]P`^W_X_]GOLPO^NY]W]WBBBB	chr10.fa		3508343	R	36	99					
+HWUSI-EAS610	1	4	86	774	870	0	1	AAATAGCTGAAAGAAAAGCCATTTTGGCTTCATTCA	abaaaaaaa^`aaa^Wa_aaaaaaa`a`_a_`aa^`	chr10.fa		3509270	F	36	119					
+HWUSI-EAS610	1	4	11	1165	2013	0	1	CAGAGGATTTGGGAATGGCTTTACCATACTAATGAG	abaabbabbba]aabaaaaabba__aaa`aa`aa`a	chr10.fa		3509602	F	36	119					
+HWUSI-EAS610	1	4	97	521	1937	0	1	TCTTTTGGGACATGAACTCTCACTGAACTGGAAGCT	]`^_[V_`aaa_RTRJXa]UaS]T_``^\UD\WV]T	chr10.fa		3509991	F	36	116					
+HWUSI-EAS610	1	4	2	676	1549	0	1	GTGCTGAGGTTACAGATGTGTGCCATTATCCTGGGT	a`ba`QZ`_^__\[_[Wa^aQa^___a`^_\]`_`W	chr10.fa		3510089	F	36	119					
+HWUSI-EAS610	1	4	6	157	239	0	1	CCCAAACCAGCATACAAACTAAAGGGTGGTTTTGTG	aaa_aa`a_aaaaaaa``aa[[```aZa`]`_`aW_	chr10.fa		3510545	R	36	119					
+HWUSI-EAS610	1	4	30	810	744	0	1	GAAGTTCAACAGGATGGCAGGATGGTATGGGGGGGG	Z_b]PZ^Y_aWYa`abbbabb^]a`XW`^a^[^EY_	chr10.fa		3511147	F	33T2	109					
+HWUSI-EAS610	1	4	53	302	1566	0	1	TTACAGATTTTTTATCTTGATTAGGTGGATCCCAGC	aaba^`Z`bbbbbaaabaaaaaaaa]aaaaaaa`a`	chr10.fa		3511227	R	36	119					
+HWUSI-EAS610	1	4	63	757	721	0	1	AGCTACAGTGCCACCAGCCCCTCCCCTTATTCAGCT	ababba^b`bbaaaaaaaaa`^``^a^_S_`_]``a	chr10.fa		3511611	F	36	119					
+HWUSI-EAS610	1	4	50	972	1113	0	1	CGTAGTTCCTGTCATCAAGAGCTAGAGTCTTTCCCC	abaaaab`Zaaaa_a_aaba`[``]`a__aaa[_`_	chr10.fa		3511841	F	36	119					
+HWUSI-EAS610	1	4	79	1574	1074	0	1	GGCAGTTGCCCGAGGTTGATTCTGGGAGTAACCTTG	aab`b^aT]`_[^^a^a]Y_aXZVa`V\^]`]Y]]\	chr10.fa		3511983	F	36	119					
+HWUSI-EAS610	1	4	95	517	1239	0	1	GAATGGTTGGTCTCATGTTTTCCATGTTGCACCACA	aaaabbaabb_abaabb_aaaaYbaaaaaaabaaaa	chr10.fa		3512093	F	36	119					
+HWUSI-EAS610	1	4	56	748	1505	0	1	CAGGTTTGCCTGCTTGTGCTTTGGATGAGGTTCAAC	`bab]bbbbabM^`bba[`bab_^Sb^QLUJ]UX_a	chr10.fa		3512433	R	36	118					
+HWUSI-EAS610	1	4	100	163	640	0	1	TACTGATATATCCTACAGCTGTAGCCTGCATAATGG	aaaabaaaaaaba`a`abaaa_aba_ab_``a`_aa	chr10.fa		3512479	F	6C29	81					
+HWUSI-EAS610	1	4	31	793	836	0	1	GACATATCCTACAGCTGTAGCCTGCATAATGGTTGT	a__aa_`___`\``Z_`Y^_^Z]_]\_]^^_^W^`W	chr10.fa		3512483	F	36	119					
+HWUSI-EAS610	1	4	54	1524	145	0	1	GACATATCCTACAGCTGTAGCCTGCATAATGGTTGT	Wa_baa`aa_b]a^__S_a_a```V__`][_Z^_`U	chr10.fa		3512483	F	36	119					
+HWUSI-EAS610	1	4	32	1682	1675	0	1	TTCCTTCAGATCTGATTAGAATAGATGCCAGGAATG	]bba][YX[\a\Z``^`a]\Zaa\^_U^X_`]\P[^	chr10.fa		3513271	F	36	119					
+HWUSI-EAS610	1	4	21	1282	52	0	1	ATTCACCCATCTCCACTGATGTGTCTTCCTTTGGGG	aa^^_\____a`_U_Y`_]]YY]U\\UUY\]_\W__	chr10.fa		3513362	R	36	119					
+HWUSI-EAS610	1	4	86	1739	434	0	1	GATAACAGAGAAGCACATTAGCCTGGAACNAGTGTC	aaZWQXaR]aaZH]^RZ[`a_`a[SHLaHDDV]VV[	chr10.fa		3513500	R	9A19TG3G1	34					
+HWUSI-EAS610	1	4	28	1702	782	0	1	GGGGCCTTCTTATCCTTCCTGACCCACCTGACCTTC	`aSa]`]`aaaa]T^]_a`_^a`_^\Z^[U^Q^]]Y	chr10.fa		3513798	R	36	119					
+HWUSI-EAS610	1	4	14	73	140	0	1	GGGCGTGGCTGCTTGGTTGCTTCCTCTAAGACACAT	ab`aa^bababb]aba\^``^`aaYa`X]`a`aa]B	chr10.fa		3513834	R	36	115					
+HWUSI-EAS610	1	4	47	594	577	0	1	AGTGAGAGAGGGCTGTGGTGGAGAGACAGCTAGCAC	[ba]ab\]R[a^ababbbUb`S`Z\H_baXa`aaa^	chr10.fa		3514484	F	36	118					
+HWUSI-EAS610	1	4	62	1681	1948	0	1	TCAAGTGGCAAGGCNAGGAGGAGTTACATAAAAAGG	aaa]^U]_]Z_`_TDK[`[a_SVSJY\]]]W]^___	chr10.fa		3514574	R	14T9C11	95					
+HWUSI-EAS610	1	4	90	1271	405	0	1	AGCAGCATAATATATTGTTACTTATAGTCTCCCCTC	^a`bbabaa]_[a`b`^`ba\_`abZZX[WaX^a`[	chr10.fa		3515479	F	36	119					
+HWUSI-EAS610	1	4	25	861	38	0	1	AGTTCATTTAGATGTTTGGTAAGTAACTGTTGTGTC	`b]bababbWbabb`bb_aa[ab`aa_aaaXUZb`_	chr10.fa		3515814	R	36	119					
+HWUSI-EAS610	1	4	29	1119	1096	0	1	CACCAGGTATGTGCTTTCTAGAATTATGTATAACAT	abababb\bb_^^^bbb_bbbbbbbb`aabbbaabb	chr10.fa		3516014	R	36	119					
+HWUSI-EAS610	1	4	81	1617	1139	0	1	CAGGAACCTGCGCAGGATCACCCGGATGGTGCTGGT	aa\N``]``U\^`a`]\^^a^^`X\[TXST^X\\^B	chr10.fa		3516351	R	36	114					
+HWUSI-EAS610	1	4	11	782	654	0	1	ATCACTGTGTGTTATGGACTGATGATCTTACGACTC	aY__ZbaS`FZ`_YURN^^_aY\TOY^aW`^\L\]Q	chr10.fa		3516425	R	36	117					
+HWUSI-EAS610	1	4	31	379	116	0	1	TGGGAGAACCTGCTCAAAATCTGTGTCTTCATCTTC	ab`a`babbb_aaaaabaaba`babaaaaa`a`aaa	chr10.fa		3516485	R	36	119					
+HWUSI-EAS610	1	4	72	900	871	0	1	TCCTTCCAGGGTCCATAGATTGCACCCTCACGTTCT	ab`abaab][V[Z_aa]aaaa`_aWTZ`^_\`W[_a	chr10.fa		3516538	R	36	119					
+HWUSI-EAS610	1	4	98	1184	791	0	1	GCTCAAGCTTTAATTACTTTTGTGAAAGCTATGTTC	aabaaaa^abaaaaa`aaaaaa_aaaa``aaa`_a^	chr10.fa		3517015	F	36	119					
+HWUSI-EAS610	1	4	83	760	403	0	1	GGCAGGGTAAGGGTTAACAGGGGCCTGAGTCAGGGA	aa^````R`U`^`R\`\Z]^^Y\Y]\^T^ZZ]`\ZZ	chr10.fa		3517274	R	36	119					
+HWUSI-EAS610	1	4	34	590	167	0	1	TATCCCAAATTAGCCTTGAACCCGCTATAGACAGCA	ZGY`JZQ[^O_Ua^Y_ZY^VO]\RW_TRKDFXGVX_	chr10.fa		3517914	F	29T6	105					
+HWUSI-EAS610	1	4	2	1151	376	0	1	GTCAGGAAGGGTAAAATCCTACCAGAAAATTACAGT	a\`^]`_``a^W]`_Z[__`_Z\___^Z_`V^ZX_Z	chr10.fa		3518545	F	25G10	83					
+HWUSI-EAS610	1	4	43	532	1512	0	1	TGTGTGTTATGGTGAATAAGTCCTCACCCAGTGGAT	aa_a_b`a`aaa_aa`aa`a]a`aaaaaa_a_a`[]	chr10.fa		3518625	F	26T9	81					
+HWUSI-EAS610	1	4	60	1687	888	0	1	TGCCAAAGAGACCTGTAAGATATAGCATTTTCCTCT	aa`aaa_X__^`_aa`aaaaaa`b]^_a_aa`[`aa	chr10.fa		3518946	F	36	119					
+HWUSI-EAS610	1	4	81	205	20	0	1	CTAACATTTCCCAAGCAACCACTGCTCCTGGTGTGT	aaa\a^`a`aaa_a_]U]_]\^__^^^`_^`W_W_W	chr10.fa		3519051	F	36	119					
+HWUSI-EAS610	1	4	29	983	1693	0	1	ATGACTCTTCTCAACATCTTTGTTCCCTGAGCTAAT	abaSN\S\b`bbT]Wab]a`X\[^Q`W`aLGF___a	chr10.fa		3519634	R	30A5	105					
+HWUSI-EAS610	1	4	1	927	2006	0	1	TTGAGAAGAGTCATAGGAAATAACGATGGCCTTGGG	aaZHX`^a`a_`_aaaa]__a`_]a``a^XY]]aX_	chr10.fa		3519656	F	36	118					
+HWUSI-EAS610	1	4	4	1630	757	0	1	CAAACTGTGAATATACAAACCATGTAAAAAAAATCA	abbaabb_aab_bbbab^`baabaaababbabaaab	chr10.fa		3519727	R	33AA1	43					
+HWUSI-EAS610	1	4	20	283	324	0	1	TGAGTGAGGGTTTCTATAAAAGGGCAAGCCTGACCC	abba^bbbbbZbbabbaba`bb`baaaaaaab_aaa	chr10.fa		3519895	F	9A26	80					
+HWUSI-EAS610	1	4	41	661	554	0	1	GCCTGACCCCTCCCCTGCATCTTCCTGGCCTTCCTG	`a`_`^a\aUa_ZR`\`_]_\\_``\`a\\\\X\]_	chr10.fa		3519922	F	36	119					
+HWUSI-EAS610	1	4	86	265	898	0	1	TCCTGCAGCCATGTGGTAATTTCCTCAAGCATGAAC	`aaab\Sa`a^^a[aZL]RZ`abaa_ZP]]Za_Z``	chr10.fa		3519953	F	36	118					
+HWUSI-EAS610	1	4	90	990	308	0	1	ATCTAACTCAGCCCCTACCAGCTGATTTTTGTGGGA	aaabaa^a\^a`_a`XSZ^``LZ\\\`^a][[_XYR	chr10.fa		3520507	F	32C1T1	53					
+HWUSI-EAS610	1	4	53	928	1025	0	1	GGCTGGTTCTGGTGATATCCATGAAACAGTCTAAAG	abaaaa_aaaaa^b`_aaa`aaaa````a__a^^[a	chr10.fa		3520621	R	3C32	81					
+HWUSI-EAS610	1	4	88	441	899	0	1	TGCGAGTTCTGCAGAAAGAACCAGGTGTCAAAGGTG	`ba`abRaaa]aSb_NIUU`a[[ba_b`_[_Z_aVa	chr10.fa		3520680	R	2T33	80					
+HWUSI-EAS610	1	4	16	1361	441	0	1	GCTGTCTCTATCTTCTTGTGTTAAAATTCTTTATGG	aa_aaaaa[_XZa`^aa`^a`^_a``_]Y^_`^\Ya	chr10.fa		3520769	R	17A18	82					
+HWUSI-EAS610	1	4	72	1668	1219	0	1	CACATCACAGCAGAACATGACAAAGGCTCATTCACT	aa`b``_]_PX_Q\[`_YS[RYQRFMZXMQSUJY^]	chr10.fa		3521827	R	36	116					
+HWUSI-EAS610	1	4	26	1453	1523	0	1	AACATCAAAGACAATCCTTCCTTCAATTTGCTTCTT	abaaa`aa``]]_`a_``a]``a`^_```_^]^Y__	chr10.fa		3521954	R	36	119					
+HWUSI-EAS610	1	4	73	1745	590	0	1	GCAAAAGTGCTTTAGATACTATGTTAGTCTTAGGGC	``aaa`aRR\a`aaYa_aaa`a`_a`][_^_`PP__	chr10.fa		3522321	F	36	119					
+HWUSI-EAS610	1	4	58	365	380	0	1	CCAATTATAGCTACTTTCTAAAACTTTATTGATCTT	`]P]V_a\]Yb]`_a_]aa_VZ]]_`^_`YV_WaWS	chr10.fa		3522552	F	8T27	85					
+HWUSI-EAS610	1	4	68	31	86	0	1	GAAGATATTGTCAAGGGAACACCTGTCTGAATTTCT	_TYaZ`Va^a^a]Zaa`]Z]]^a_aZ`_a]W]`[a]	chr10.fa		3523143	F	36	119					
+HWUSI-EAS610	1	4	52	1698	1162	0	1	ATTATAGAATTAATTTCTCTGTGTGTCTCTGTCTCC	abbaa__^abaaaaaa`a\a^]U\STY\[_IXY_]^	chr10.fa		3523387	R	36	118					
+HWUSI-EAS610	1	4	59	1304	61	0	1	ACTTGTTCCCCTGGTCAAGCAGGTTTTCTGCTTCCT	aabb`Z\aa_`aa`Zaa`]]``^V_^`[^^[^\\^`	chr10.fa		3523578	R	36	45					
+HWUSI-EAS610	1	4	36	1060	807	0	1	GGACTTGTTCCCCTGGTCAAGCAGGTTTTCTGCTTC	__aabbbabbaaab`^^bbbb_aab`baaabaabaa	chr10.fa		3523580	R	36	59					
+HWUSI-EAS610	1	4	70	453	211	0	1	TGGGGGTGTCCGCAGATTCCACACCCAAAGTGACCC	_aaa[`^a_a`aa_a_a`aa``a``aa_Z`Z]\]U_	chr10.fa		3523637	R	36	55					
+HWUSI-EAS610	1	4	10	595	1642	0	1	CATGGATCTGAAGTCACTTCTCATGATGATGGAGGA	`a^_^`aba]b``_bbbaa]baab]`aaa``^]`BB	chr10.fa		3524131	F	36	26					
+HWUSI-EAS610	1	4	39	737	1554	0	1	CAGCCTCCTGGGGCCTTGGTATTCTCATAACCTGTA	aa`aaa___]Q]Z`a_aa^QMaa^a`a`a_`^_`_`	chr10.fa		3525302	F	36	118					
+HWUSI-EAS610	1	4	49	1194	670	0	1	TATAGCAACAGAAAAGTACCAATGGAATAGAATTGA	aaa^]^^`^\a``__a^a_`_Z__`\\`_____\`_	chr10.fa		3526943	F	36	119					
+HWUSI-EAS610	1	4	11	1708	294	0	1	TTCTAGTACTATGTCCAATTTTCTGAGGCACTGCCA	abaaa]]_`aa^^]a_a`aaa`]_Z^X^Z_^]H_^Z	chr10.fa		3527591	R	36	47					
+HWUSI-EAS610	1	4	54	602	524	0	1	AAAGAAGCATAACCTTCCAGTGGTGCAGTAGAAATT	aba`^``]`babaaa`aaaaab`^``]b[a`\TTaa	chr10.fa		3528910	F	36	119					
+HWUSI-EAS610	1	4	25	16	1720	0	1	AAAAGAGAAAACAGAAGCAGGGCATGGTGGCACATG	Z]abbbbbbbaabb`abaabaaab``bXabVaaa[b	chr10.fa		3529218	R	36	119					
+HWUSI-EAS610	1	4	64	107	727	0	1	AAATAACTGAACATCCAATCGTTTATTCCCCCCTTT	Y\\a\_aba]_abbb_PP^bb_a`__^b``bba`^]	chr10.fa		3530797	R	36	119					
+HWUSI-EAS610	1	4	58	1645	677	0	1	TGTCACAATGAATTAAATAACTGAACATCAAATCGT	a_aa`^``_I[aab`bbabbX_U_a_aa[D[`a]V^	chr10.fa		3530811	R	29C6	109					
+HWUSI-EAS610	1	4	1	1167	1638	0	1	ATGTTCAGTTATTTAATTCATTGTGACAAGAACAAC	aab`aaaaabbbaaaa`aa_aaa_a`__^`_a^aa^	chr10.fa		3530819	F	36	119					
+HWUSI-EAS610	1	4	60	768	1027	0	1	GCATTTCATTGTTGTCTGGCTAAGTCAGCATCAAAG	`a`aaa``aaaaa_`_a`baaa`a^a`a_^^__a_`	chr10.fa		3530898	F	36	119					
+HWUSI-EAS610	1	4	25	753	575	0	1	GTGCATGTGTGTGTGCATGTGTGTTTGTATGTGTAT	aaba_aa^a_a_a]aa`aa`a_b``aa^_aa^a^]`	chr10.fa		3531305	F	36	20					
+HWUSI-EAS610	1	4	92	1004	688	0	1	GTGTGTGCATGTGTGTTTGTATGTGTATGTGTATGT	aX`^bS\[aab`b_babbbY_aa^`]_YR\_TM`a_	chr10.fa		3531313	F	36	10					
+HWUSI-EAS610	1	4	60	732	946	0	1	TGCATGTGTGTTTGTATGTGTATGTGTATGTGTGTG	T`^bb`bZ]b^abb\aab[_T_Za_b]Zbb^aab`a	chr10.fa		3531318	F	36	29					
+HWUSI-EAS610	1	4	48	1617	574	0	1	TGTATGTGTGTGTGTGTGCAACTGTGTATATGCTTA	ab_`aa`a[[]a_]_]\`a_a^`_^__a```_Ya_^	chr10.fa		3531336	F	9A26	87					
+HWUSI-EAS610	1	4	9	1385	1717	0	1	TACACAAATGCACAAGATACACATATCCACAATACA	aba^_a]b`a]^``bb`bbab_aa`baa``_``a_b	chr10.fa		3531398	R	36	119					
+HWUSI-EAS610	1	4	73	953	1760	0	1	TACACATGCAAACATACACACATGCACATACACAAA	a`HV\_^\Y_]`[`^Z^`^^P\_]YX]`]_]W___Y	chr10.fa		3531426	R	36	21					
+HWUSI-EAS610	1	4	70	588	909	0	1	CAGACACACCACATACACACACATGTCCACACATAC	ab]ba`]`aaa^]_]`b]\Va`Z`a__a`aa\U^U`	chr10.fa		3531459	R	36	57					
+HWUSI-EAS610	1	4	53	248	1835	0	1	ATCATCTTGACAGCTCGTAGACTGCGTGCCCAATGA	aaaaaaaaYa``aa`a__``Y`_`_`\[`^[X]__a	chr10.fa		3531856	R	36	119					
+HWUSI-EAS610	1	4	98	1528	175	0	1	TACACACACATGTCCACACATCCACATGCAAACACA	_bab_babaaaaaaabaabbaabb_baXaaaaabW^	chr10.fa		3531989	F	36	61					
+HWUSI-EAS610	1	4	18	1750	1263	0	1	TGTGTGTGCATGTGTGTTTGTATGTNTGACATGTGT	a^a`^^P``_a]Xa_a`aaa\]a_TDW_\\Z_XWX\	chr10.fa		3532062	R	25G10	20					
+HWUSI-EAS610	1	4	83	1528	1225	0	1	CATGCACACACACAAATGCACATGCACATACACAGA	\`^Sa_b_bbaaaab___\ba_Ybabaaba```aYa	chr10.fa		3532086	F	36	43					
+HWUSI-EAS610	1	4	75	963	691	0	1	GCACATACACAGAGGCACATGCACACACATATCCAC	aaa^aaaY_``^]Va__``a]aZ_a^`^_`___][S	chr10.fa		3532109	F	36	119					
+HWUSI-EAS610	1	4	11	1473	1851	0	1	TAAACAGACATTTTACATAAAGGAAAGAAGATTGAA	aa_XW]]X^]_`aa^]___`]a_X^[PXTXX[^^]^	chr10.fa		3532413	R	36	119					
+HWUSI-EAS610	1	4	72	290	1965	0	1	CACACGATATGCTAGTGTCTACTAATCTGATTTTTG	a`a`aaa]_`_a[]]V`Y__`^XUV^__\W\^\_[\	chr10.fa		3532874	F	36	119					
+HWUSI-EAS610	1	4	12	520	364	0	1	TTTGGGGAGCAGGATTGGGGGAGGGTATAGGGGAGC	aaaaaaa`aa^a```aaaaaa\a`aY____``a``^	chr10.fa		3533556	R	36	44					
+HWUSI-EAS610	1	4	55	980	74	0	1	ATTCCCCTGCGCACTGGGGCATATGATCTTCGTAAG	aaa_^_a`aZaa_Z`RT][Z^W_YV_]]X^Z`ZaU_	chr10.fa		3533620	F	36	119					
+HWUSI-EAS610	1	4	1	1211	1124	0	1	CTGTACTAATTGTCCTAGTCAGCTATTACTGTGACC	a_a___a__a`aT\^_]a`_a`_aY``_Z__S]_][	chr10.fa		3535276	R	36	119					
+HWUSI-EAS610	1	4	44	1650	685	0	1	TTCTTAAAAGACTCCACTTCCATGGGAATAAAACAT	a`aaaaaaa`__^__`^`a``_^WLW\_`^^_^^\_	chr10.fa		3535328	F	36	119					
+HWUSI-EAS610	1	4	63	1307	39	0	1	ACTAAGCTAATTCTCTGGACACCATCTGAGGCTCTT	a_a_[_^_ZZ^_]^^YW_YY^]V]ZZWWWRWYYWW]	chr10.fa		3535482	R	36	119					
+HWUSI-EAS610	1	4	97	1065	2005	0	1	GTAGGTAGGGGAGCAGAGGGGGGGGAGGGGTAGCAT	`_TZaGTXa`ZR_`__\\F_`a\aTGTZXFWX[UVR	chr10.fa		3535842	R	18T10A6	95					
+HWUSI-EAS610	1	4	41	1430	1058	0	1	CAAAACACAAGAAACTTAAGAAGAAGACCGAAGTGT	`bTb`aaa`abb\aa]bY`_`_aTP_a_^a^_`ZaX	chr10.fa		3536379	R	9T26	81					
+HWUSI-EAS610	1	4	7	1502	1537	0	1	AGGAGTCAAAGAAAATCAGCCATGGAGAGAGAAACA	_Sb^``_bZ``K`ba^``^`_KU__P\]X[b[ba_`	chr10.fa		3536863	F	36	118					
+HWUSI-EAS610	1	4	17	896	1974	0	1	AGTTTTGTTATGAAGTGACAGCCAACAGGTGGAGTG	`b[aaab]aaa_aba_`a[b`^a_\]_^WOQR]\WU	chr10.fa		3537935	R	36	119					
+HWUSI-EAS610	1	4	100	806	1091	0	1	GCTCGGTGGAGAAACATTCTCAGTGCTTCCTACTCA	a`a`aa[aa_`]Z]__`a]^^_NQa_`____a__`a	chr10.fa		3538076	R	36	119					
+HWUSI-EAS610	1	4	63	1326	1873	0	1	GTGGATGCTTGGAATAAGAGATGATCTACATGATTT	``aa_`^[]aaa`]`^]`[a\_`[_VV[W]^__]a]	chr10.fa		3538839	F	36	119					
+HWUSI-EAS610	1	4	55	617	2036	0	1	TGACAAATACAGAGTTGGATGCTCTCAGTGAACCAT	a`babaa`aaaa`a_aa_a_`_``___\]``^`___	chr10.fa		3539358	R	36	49					
+HWUSI-EAS610	1	4	45	529	990	0	1	ATGCAAGATGTTCTAAACAGAACACTGTCAAGCATG	]a`V_b\b__b\_\^YV\W]X`aba]V_V`b^a^a^	chr10.fa		3541143	F	36	119					
+HWUSI-EAS610	1	4	88	1172	488	0	1	GCTACCAGGGAGTTTGTGAGCATCTATTTGCACAAA	`b__abaSa[_XWbaa]a[^`aa_b_aa_aa]_a^R	chr10.fa		3541716	R	36	119					
+HWUSI-EAS610	1	4	67	1105	528	0	1	AGTCTCATAGGGGTCTCCACAGCTACCAGGGAGTTT	a_aaa`a``]]__\``a``]aa]]`Y]`Y_Z_aV^a	chr10.fa		3541737	R	36	119					
+HWUSI-EAS610	1	4	42	431	1924	0	1	CTTGGAATGGGTTCATTTGGCAGTAACAATGTTTCA	aaba``a`b``^abaaaa`Zaaa]`a`aaaa_aa`a	chr10.fa		3542557	F	11C24	84					
+HWUSI-EAS610	1	4	24	372	1487	0	1	GGGAGGGAGGGAGAGAGAGGGAGGGAGGGGGAGAGA	`^aN`\`Z^``Ua\`\]R``^P^^aZ]`^^]PXKXZ	chr10.fa		3543326	R	36	5					
+HWUSI-EAS610	1	4	34	1155	349	0	1	CTCAGAAAATGTAATAGCAGGCTGCTGTAGAAATTC	abb`b`_a`ba`babbabaaaabb`aaa`a]^aab_	chr10.fa		3543935	R	36	119					
+HWUSI-EAS610	1	4	80	1349	1026	0	1	AAGTCTAGAGCTTTGCATGCCAGGTATTTGTGAAGT	aa[_abbaaaaa^ab_b_a_aab`VabaabZ``_a^	chr10.fa		3544090	F	36	119					
+HWUSI-EAS610	1	4	93	1146	732	0	1	AGGAGGTCATCTTCCATCAGTACTAAGTCCAGGTCA	aaa`[ZRX\baa`a^`a[_a^bab`aa__[`YT[_a	chr10.fa		3544774	R	36	119					
+HWUSI-EAS610	1	4	2	761	640	0	1	TCTCCTCTTTCCTTCATTCTGACGCCACTGAGGCAG	aY^M[Q]VRLV\__\a`[RV^X^\FTRPRZSR\]_\	chr10.fa		3546733	F	36	116					
+HWUSI-EAS610	1	4	62	1718	40	0	1	ATACTCTCTCCATTTCTCTGTCTTCCCAGAACTTTT	_^a^]\`_`Z`\ZU__]^SIW\\QVXRXDXaYBBBB	chr10.fa		3546796	R	34G1	96					
+HWUSI-EAS610	1	4	5	1331	564	0	1	GAACACATGATCCCCAGAGATCTGTCCTCCAAAACA	aa`ab`ba_]`^`\aaa_`^aaaaY_[`]^[Va^_a	chr10.fa		3547216	R	36	119					
+HWUSI-EAS610	1	4	1	1670	1222	0	1	CACAGTGGCCAAATTAGAAAGCAACCTTCTTTTTTT	aa^aXQ]ab`b`^ab`b`]aN^___aVXLUa_`a``	chr10.fa		3547789	R	36	118					
+HWUSI-EAS610	1	4	31	1591	1478	0	1	CTTTAAAGTTCAAAACCTGCCTTGAGCCATCCTTCT	abbbbabb`b`bbbbab``baba`a_a^aa^aabab	chr10.fa		3548118	R	36	119					
+HWUSI-EAS610	1	4	2	1153	1730	0	1	TATTACTGATGTTATTTCATTTTTATTCATCTCCCA	SSXUab`[^^b\ZU_bb\YZY\_T[XZQ^[YKHSVb	chr10.fa		3548692	R	31C4	102					
+HWUSI-EAS610	1	4	87	102	1431	0	1	GCCAGGTTGAACTTTCTGTGGGGGAAGATTAAATGT	aabaaba`aZaa_a_aaa[aba]a[Wb_^]`^UU_]	chr10.fa		3548801	R	36	119					
+HWUSI-EAS610	1	4	77	1581	1462	0	1	GGACGGCTTTCTTTGTTATTTCAACATTCTTCCACT	_SNMFMYKYVYU_N__RS[`XYVXPWT^W\\TQSX\	chr10.fa		3548854	R	4A31	106					
+HWUSI-EAS610	1	4	4	231	795	0	1	CTATGGCAATTTAGGCATCTAAAACTCCATCCTAAC	aaa``_b__aaaa]aaa`_`aa_a__aZa_aa_a`a	chr10.fa		3549087	R	6A29	80					
+HWUSI-EAS610	1	4	56	41	2045	0	1	TGTGATCAGTCTTCTTGCCCCTTGTATTTACTGTTT	aaUbb`bb`[aaaa[_aaa`a_`aX\a__`^\YXU\	chr10.fa		3549512	R	36	119					
+HWUSI-EAS610	1	4	30	272	99	0	1	TTTGCTTCTATAGACTAAACAGATAATCTACAGACA	Jaaabbaabb`bbbbbb`aaa`bbbb`bbababbaa	chr10.fa		3549571	F	36	118					
+HWUSI-EAS610	1	4	23	1253	2041	0	1	AATCTTTTCTCTCTTGCAGAACACTTCAGAGTAAGC	_aa]__aaa_\`__^`Y`__\Y_``aZ\`[a^a_[T	chr10.fa		3549734	F	36	119					
+HWUSI-EAS610	1	4	39	1167	454	0	1	AGACAGGATTCCTTGCTAGAACTTAGATCCAGTTCT	``_O__^\Z^aZ_XT]_^]Z`Ya_`a_XUXY``]aa	chr10.fa		3550483	F	36	119					
+HWUSI-EAS610	1	4	48	1059	911	0	1	GATTCCTTGCTAGAACTTAGATCCAGTTCTCACCCA	aaaa`aaa^aa^`_a`aaa_``]Z]a^`_a_a___a	chr10.fa		3550489	F	36	119					
+HWUSI-EAS610	1	4	28	337	85	0	1	GCTGGGCGCAGCTGATTGAAGGGTCACTCATGTCAT	a]aaa_`abaa_Z_G^`^R]``aW]]\_a__a\]U^	chr10.fa		3550672	F	36	118					
+HWUSI-EAS610	1	4	2	972	1165	0	1	CACCTCCTTTAGTTCAGTCAGTCCAGCTGGCTAAGA	ab__a_aaaa`a___ab`aa`\`^`aa_a`\a[a`^	chr10.fa		3550847	R	36	119					
+HWUSI-EAS610	1	4	9	930	791	0	1	TTGCCCTCTTCTGTTTCTTTATCACACCCTCTGATT	aaa`____aa__a]`a_aaaaa``^_][^_]^``^^	chr10.fa		3551218	R	36	119					
+HWUSI-EAS610	1	4	76	598	1494	0	1	AAATGCTCTTCATGCTCATTGATTGCAGGTCATTTT	a`bbaaa^baaabaaababbbabbababaaa_baab	chr10.fa		3551571	R	36	119					
+HWUSI-EAS610	1	4	35	1397	1627	0	1	CACCTCGTTTTGCAGCATGCAATTGCCCATCCTGAC	abbaaab``abaaa`aaaaabaaaaaa`a`_`aaa^	chr10.fa		3552290	R	36	119					
+HWUSI-EAS610	1	4	20	673	1905	0	1	ATGTTCCAGATTGAATATGTAGCTGAATGTACATGT	Y^a^aaY^baa]b_`ba```b]bb`[\bbaa_aa_a	chr10.fa		3552403	F	36	119					
+HWUSI-EAS610	1	4	16	1326	1193	0	1	ATGTACATGTCTATCACTATCACTGTTGCAGAGAAC	``[`aaaab``aaaaa]aaa`aaaa]aa_^^^\`]Y	chr10.fa		3552429	F	36	119					
+HWUSI-EAS610	1	4	65	111	189	0	1	TGTTGCAGAGAACAGGCAGAATTGTAGATCTAGAGC	aa_aaZYWa_^Y`aX`UVWGX[_`RW^`\Z[SWZ^S	chr10.fa		3552452	F	36	118					
+HWUSI-EAS610	1	4	40	466	567	0	1	CACCACACAAATGGAGTGTTGTGAAAGCAAGGGACA	``__U\[aaaaab^XbYaa`a\aZ`[^`[aa`__VB	chr10.fa		3552906	R	36	114					
+HWUSI-EAS610	1	4	76	1718	199	0	1	AAGAACAAGAAGTCTGTGTGTTGAGTGCAGTGCTAC	`a[aa_ab[^`S\[_^LNPRKLP[VSSS^]SG[^`U	chr10.fa		3553069	R	36	116					
+HWUSI-EAS610	1	4	59	638	501	0	1	GCTAGGTAGAGGGAAAAGAGAGGCACAAGGCACAGG	`_aXba^_a\`^a]`ZYaaa`aa```a_`a^^\__`	chr10.fa		3553607	F	36	119					
+HWUSI-EAS610	1	4	73	182	470	0	1	GAGCAATCCCATCATGCTCAGCTGTATCACAGTTCT	__^aXVZa``aa_V_YaX^]_``XO[Z___\V_^_U	chr10.fa		3553663	R	36	119					
+HWUSI-EAS610	1	4	64	615	480	0	1	GGAGGAAAAGACAGAGAAGTAGGAGGAAATTCTCTT	`ZF]_[___a]__a]_GZ_V`_[Ya_Z``__[a_a^	chr10.fa		3554055	R	36	117					
+HWUSI-EAS610	1	4	38	211	1386	0	1	AGGGAGGTCTCAGAGACCATTATGACACCTCTATCT	\W_U_\aWa`\V_^]aa\U`^W^ab_S]aa`XXaaa	chr10.fa		3554136	R	36	119					
+HWUSI-EAS610	1	4	22	915	1738	0	1	GTTGATGATCGTGCTTCAACCAGAGGCTCACAGCAA	aabb`ab_a_a[a_aa`aa`[___^[^^`_^^\\^\	chr10.fa		3554398	F	36	119					
+HWUSI-EAS610	1	4	71	953	1665	0	1	ACACAGTTCCTGAGCGGATCTGGGACATTGAAAATT	^\SOQ\^]_VXVV_ZT`QYTY`_WY_aPLXQ][LTR	chr10.fa		3555098	F	36	117					
+HWUSI-EAS610	1	4	55	1427	9	0	1	CGAACTCAGCATTGGGCAAAGACCAAGCCATGTCTG	_babaa`WIZ]_a[`^^_aa`[__a`_X`[__\U_`	chr10.fa		3555463	F	36	118					
+HWUSI-EAS610	1	4	83	1349	1757	0	1	TTTCTATAAAGAGTGCCAGTAGCACAGGAAGCAGCT	aaaZa[`aa[]aaGa\`_bV_aa]P__\^^a_[STB	chr10.fa		3555503	R	36	113					
+HWUSI-EAS610	1	4	42	1215	759	0	1	AGCATCTTCCTCCCTCCTTTTTATCCCCTCCAGCTT	aaaaaV__YY_\__`]^a`aa`[^_W_W^[VV^Y\_	chr10.fa		3555544	R	36	119					
+HWUSI-EAS610	1	4	79	1084	20	0	1	AGAAAGTACTGTACTGGGCTAAACATCACAACAGCT	```b`aSa^`a_a`a_aa`aa``__a_```]Z`\_a	chr10.fa		3556746	F	36	119					
+HWUSI-EAS610	1	4	55	1343	467	0	1	AACATCACAACAGCTTACTTGCTACCTTTAAGCTAC	aa`_aa____]a`W__a`aa^____^\^___Z`_]_	chr10.fa		3556767	F	36	119					
+HWUSI-EAS610	1	4	49	793	686	0	1	TAAACAGTGAGGAGGGGAACCTTGTTTGCTTCTCCT	ab`aa]a`aaba]ba`aaaaaaaa_aaa`ab_a_aa	chr10.fa		3556987	R	36	119					
+HWUSI-EAS610	1	4	91	443	205	0	1	TCTTTGAAGCATGTTTTGCAGTCAATCCTCCCTCTG	aZ]ZZ]]a`\a[[W`_```_\Wa]UXWQ__^__^YX	chr10.fa		3557048	R	36	119					
+HWUSI-EAS610	1	4	66	5	755	0	1	TGATGGTGATGGCTGTGACCATGGAAGGGCTGCCGG	__V\a]V__Z``````]T__HV_]RXX[`_T\_aa^	chr10.fa		3557453	F	36	118					
+HWUSI-EAS610	1	4	62	880	1149	0	1	GATATTCTCCTCTGCTTGTATCCCCCTCCCACCTTA	aaa[baaa^_a_`_]aab]aa\_][]^_U\_Z\`a_	chr10.fa		3557848	F	20G15	81					
+HWUSI-EAS610	1	4	46	1492	18	0	1	ATAAGGAACCCACTACCCATGCCAGGTCTACTCTCC	abba`^_a_Y\_X`_VY__[HZX\Q[YY^VVYYXRZ	chr10.fa		3558575	F	36	118					
+HWUSI-EAS610	1	4	74	1083	1788	0	1	GGAGAGTAGACCTGGCATGGGTAGTGGGTTCCTTAT	`^abaa_a`a`N\_a[O_aaaS_aW_^_H`_Z^__`	chr10.fa		3558575	R	36	118					
+HWUSI-EAS610	1	4	89	1420	804	0	1	AAGAAAAAACATTTCTGCTTGATTCAGTAACCTGCT	a]YTZ[aZ`a`__W`Ra[`_a\__^S_QY_J^PW\B	chr10.fa		3558676	R	36	114					
+HWUSI-EAS610	1	4	25	8	772	0	1	CAAGTGCTTCTGAAGGAATACAATCGTAAAATCAGC	a`aa^aba`aaa]baaa_a]aa`a`aX_aa`^_a`_	chr10.fa		3558831	F	30T5	82					
+HWUSI-EAS610	1	4	83	428	78	0	1	CAGTGTTGAGACGAAACCACACTACTGCTGATTTTA	a_b^aaba`baaab^bYba]a`ab`aba]^a_a`a`	chr10.fa		3558857	R	31A4	83					
+HWUSI-EAS610	1	4	41	1673	497	0	1	TATGCATACACAGTGTTGAGACGAAACCACACTACT	a``^bbbbab`a^Z^_aaaZ_a\aaa___X]\\^aY	chr10.fa		3558867	R	36	119					
+HWUSI-EAS610	1	4	17	1152	1925	0	1	ATATGGCTGAGCTGAACTCTGTGTGCTCACATTCAT	aaaaa_]a``a`__^a_`_aa\a\_Z`^_]``^W^a	chr10.fa		3559229	F	16A19	83					
+HWUSI-EAS610	1	4	76	1187	1917	0	1	GGGCTAGATCACAAAATGATCTGATAGCAAAGGCAG	a`aabab``^`^_\\a`a_aSaa__`a]`a^a`]^a	chr10.fa		3559339	R	36	119					
+HWUSI-EAS610	1	4	43	1076	1218	0	1	TTACAGGGCTAGATCACAAAATGATCTGATAGCAAA	aaa^_]]Z]a_a^[W^]][_^``]^Y_`YY\`]]WX	chr10.fa		3559344	R	36	119					
+HWUSI-EAS610	1	4	5	533	53	0	1	ATTTCAGTTTGCTGAGTCATTTTTGAATAGTCTGCT	\__T^a`aa^\\[UPS]\^`Y_a`aWab`^\Xa`]a	chr10.fa		3559968	R	36	119					
+HWUSI-EAS610	1	4	92	767	1727	0	1	AGTCTCCCATCAGTTTACACTTGAACAGTGGTTACT	]U\aba^RKY_XVWHW^Q_b_aZYQ^^]DUXa]VUR	chr10.fa		3560748	F	36	115					
+HWUSI-EAS610	1	4	27	1588	1825	0	1	ATGCCAAATGGTAATTTGAGGCTATTCATGGCATTC	a^`_Y`_____N[^`_``ZaYS^^]]WSUURTX]]B	chr10.fa		3561688	F	36	114					
+HWUSI-EAS610	1	4	12	1218	1798	0	1	ATACTTGTGAGTGACAACCCTCTGTGGTTGGTGATG	aba`aaaU_aa__a`aa_``a^aa`aa^aaaXa`^`	chr10.fa		3562065	F	36	119					
+HWUSI-EAS610	1	4	75	388	533	0	1	TGTTAGAAAACAGAATGTACACATAGAACATTTTGC	a_R_`]]\[V[aa`[_a^]^[aaaaaaaaa__aa[a	chr10.fa		3562102	R	36	119					
+HWUSI-EAS610	1	4	12	1196	716	0	1	TCCTGTGTTAGAAAACAGAATGTACACATAGAACAT	a`^`aZa_aa^^`aY]aa]_``[`]_[^___^\VV]	chr10.fa		3562107	R	36	119					
+HWUSI-EAS610	1	4	32	572	1387	0	1	ACTCACCTACTAAAAAAAATGAATTCATGAAATTCC	aa][^aa`\_`Z_^aaZ]UY_U_^_Zaaaa`_`_^]	chr10.fa		3562952	R	36	34					
+HWUSI-EAS610	1	4	58	1310	1623	0	1	ACTCACCTACTAAAAAAAATGAATTCATGAAATTCC	_a^TZSUYW[\S^U\^[MWYOWPWRQYS]\UZZPSY	chr10.fa		3562952	R	36	20					
+HWUSI-EAS610	1	4	42	1342	753	0	1	TCTTAATATTAATGGACACACCTCCCCAATAAAAAG	aaaaaaa_aaaa_a^___``__``^^`````^``__	chr10.fa		3566590	R	36	35					
+HWUSI-EAS610	1	4	20	1449	308	0	1	GTTTGGTTGTGTTTACCTGCAATTCTTTAAGGGATT	aabaaa^aa_`_``a``b^`a_a`_a_a_a_[_]`a	chr10.fa		3567547	F	36	8					
+HWUSI-EAS610	1	4	34	263	414	0	1	GGGAGGGGATAAGANACTCCCTTCAAAATGCAAGCT	aa_^a]]]^^``aXDT[_``a_\aaX`__aa]^^_Z	chr10.fa		3568793	F	14G21	110					
+HWUSI-EAS610	1	4	60	1109	980	0	1	CTCCGTTTGCTGAAGATACCACACATTTTAGTCACA	abaaaaaa_^aaa]aaab\``_``aaaa`^a__a^a	chr10.fa		3568872	F	36	119					
+HWUSI-EAS610	1	4	16	824	570	0	1	GCTTCATCTCTGGAGTCCATGAGCTCCACAACCTAG	a`bbaaaaa`aa]]a`[`]X`Z\Z[aV`_a]^]U]a	chr10.fa		3569188	R	36	119					
+HWUSI-EAS610	1	4	40	152	104	0	1	ACAACCAGACACTATTATGGATGCCAACAAGAGCTT	^b[Yaa]`^aaaaaaaa_`^^_ba`YXa][`__a]_	chr10.fa		3570343	R	36	30					
+HWUSI-EAS610	1	4	43	1778	327	0	1	CAGATCAGATAACCTGCATATCAGATATTGCATTAT	a_[^aaa`aaaaa_]Y_aaaa\_X]^``YSW```_`	chr10.fa		3572670	R	29A6	45					
+HWUSI-EAS610	1	4	19	1344	1634	0	1	GGTTATCTGATCTGCAACCCTCAAAGGGATTGAGAT	aaX_a`[_\`[^_aaa^`^_]]__W`a^_XZ_`^_]	chr10.fa		3572692	F	36	119					
+HWUSI-EAS610	1	4	75	1617	1249	0	1	TGCATCAGTTTGGTGGATGTTTTCACTAGAGAGTCA	a[``]`\\^a_aaW^^Y___^]\Xa^`[^YPLP^^S	chr10.fa		3572771	F	36	118					
+HWUSI-EAS610	1	4	47	1079	418	0	1	GTCAGCTCTGCCCTACAAGTCATAAAGAGCCAATGA	aYaaW`aYZVZ_X]a``Z`R_a^`^a^a]NQ`_^_a	chr10.fa		3573366	R	36	118					
+HWUSI-EAS610	1	4	24	1308	200	0	1	CCCAGAGCTGCACCTCTAGTCTTCACTGTTTGCACT	`RQYV[DJ\YSRURUV`]VKUa^V\WSSSP`\_[U`	chr10.fa		3573425	F	36	115					
+HWUSI-EAS610	1	4	65	423	949	0	1	ACCACCCCCGCCGCCCCTGCAAGTTACTCATAGTCA	a`^aZ__\_]``a``aa^``^[`[`X[Y\\``\BBB	chr10.fa		3573515	R	36	106					
+HWUSI-EAS610	1	4	56	284	598	0	1	GGAACTCAACTCAGGAACCTAGAGGCAGGAACTGAA	ab__abaaaaaaaa`^`aaaaa__a`]aaZ`W[]BB	chr10.fa		3573616	F	36	47					
+HWUSI-EAS610	1	4	3	1419	536	0	1	GGGAAATGGCACAAGAGCATTAAAGTCTGAGATTCT	``][b`^aYP``X^]]T]aaaa^UWM__W[`Z]SP`	chr10.fa		3574199	R	36	118					
+HWUSI-EAS610	1	4	73	740	911	0	1	AGGAATCTCAGCCACTGAAAAACTCTTTGTTAATTC	`ba\`aa_Ya__``_a`\]VYa[[_`aaa^_`Y^`^	chr10.fa		3574421	R	36	119					
+HWUSI-EAS610	1	4	83	504	1375	0	1	CAAACAAACCAACAACAATATTTCACAGATAGCCTA	a`aaa`aa_aa_^aaa_a`Yaaa`a_a_``aa_a]\	chr10.fa		3574708	R	15A20	81					
+HWUSI-EAS610	1	4	65	1150	115	0	1	TTCCTAAATGGAGTACAGAAATACTGGAAATATCCT	`aa`a_^`a____][\___a_``]`_^Y_^__`X]^	chr10.fa		3575191	F	36	119					
+HWUSI-EAS610	1	4	70	1604	1413	0	1	GGAAATATCCTACAGTGATTTTGGCAGTGTTCACAC	a_``]aaa`]__]Y_Za]aaa`[^]__RTZ]G[\ZT	chr10.fa		3575216	F	36	118					
+HWUSI-EAS610	1	4	25	82	1302	0	1	CTCAGAATCTCACCCCCAGAGGTCTCTGCAAGACAG	ab`\\QR]^abb]abZ\PTIO]OaaaX^]U^XV^\`	chr10.fa		3576030	F	36	118					
+HWUSI-EAS610	1	4	95	392	1982	0	1	AATTATAAATAATCTGATGTTGAGACTAATTCAACA	^__`a`baX`aaaaa``\a[_aaaaa^`___aa^`_	chr10.fa		3576785	F	36	119					
+HWUSI-EAS610	1	4	24	480	1309	0	1	AGTAAAAACCTTTCCCAGAGAGGTAATGTGTTCATA	^bbbbabbbbbbabbaaba`aabV]^^b`b^a`b_B	chr10.fa		3577181	R	21A14	77					
+HWUSI-EAS610	1	4	45	1468	1788	0	1	TATTAAGAGCTGTGACCTAGTTGGAGTAGGTGTGGT	ab`_a\a`]_aa`a``[aab`a`^\aU_`\U]]aX]	chr10.fa		3577502	F	36	44					
+HWUSI-EAS610	1	4	35	1022	378	0	1	CTAGTTGGAGTAGGTGTGGTCTTCTTGGTGGAAGTG	ab`babaa_b_aaaWa\aa^_aa_a`a`Ua_\``Z\	chr10.fa		3577518	F	36	48					
+HWUSI-EAS610	1	4	5	723	216	0	1	GTTTAGTCTGTTATCATCATGCTGGGAAGCATGGCA	aZba_`^Z`_]a^^W_^^`_aX`a\`WZ\W_]_Z]]	chr10.fa		3577687	R	36	20					
+HWUSI-EAS610	1	4	11	130	226	0	1	ATAGCAGAGACTTCAGAATGTGTGAAGTCGCAGTAC	]a`Z`bbT`]a`a`a^LZ`bYbS]\aa_aaa`aP`a	chr10.fa		3578125	R	36	118					
+HWUSI-EAS610	1	4	25	376	1817	0	1	GCAATGTCCTTGTACAACTTTTAAAACTGAACTTGA	a^JXVXT`baaXTX_aa^[X^]PWVXV`_a^ZZ\`_	chr10.fa		3578245	R	30G5	83					
+HWUSI-EAS610	1	4	14	474	92	0	1	AAGCAATTACATGCAACTAAAAGTCCAAGAAGCAAA	aaa\aUa`aa`aa_a`a`aa_\aW_`aa_^_a^_\]	chr10.fa		3578368	R	36	119					
+HWUSI-EAS610	1	4	43	932	160	0	1	AACGCAGAGGACATCAACCACACACACACACACACA	`a`bTJYa]XYUXU`NUaZ_a^\_WR]XZQ^\_[`T	chr10.fa		3578809	R	4T31	93					
+HWUSI-EAS610	1	4	43	767	1874	0	1	CAAATTAAAGAAATGTTTCCATTCAGACACCTCCCT	abaabb`abaabaaa_a`aaba`_aaa`b]aa`_`_	chr10.fa		3579058	R	36	119					
+HWUSI-EAS610	1	4	73	1782	190	0	1	AATATCATTTCCTACTTAATGGGCAAACTCTCTGAA	aa`a__`\SU__^UUZ`[VZTPU][U\]WSY[[VY_	chr10.fa		3579112	R	36	118					
+HWUSI-EAS610	1	4	11	524	1944	0	1	CACCAAAATATCATTTCCTACTTAATGGGCAAACTC	`bb^[Z_b`bbabababb\\baaaabbbbabbaaaa	chr10.fa		3579118	R	36	119					
+HWUSI-EAS610	1	4	83	1780	1779	0	1	TGCAGACATGGCACAGACCATCATAGTGGGGCAACA	``WZa^\b_Ya``X]_Y`V``[V_FMP\`KKZHTPY	chr10.fa		3579516	R	1A34	79					
+HWUSI-EAS610	1	4	77	205	1454	0	1	ATTAGATAACTGTGCCCCATAAGGCTCCACCTACTA	aVb`baaW[\aaabbbaaa```^_bbbaa_aaaaaa	chr10.fa		3579958	F	36	119					
+HWUSI-EAS610	1	4	41	715	760	0	1	ACTGTAAGATTTTTCTCATATTTAATAACTGCAGAG	aa_G[baaaaaaaaab_ababaaa`aaa_aa_`a_`	chr10.fa		3580379	F	3A32	107					
+HWUSI-EAS610	1	4	56	974	447	0	1	GGCTCAGGAGTAGTTGACCAACAGTGTGTGTGAGAC	_U`b^aabaa__a_aaa`a`a^`aQ`Va\`[__`\^	chr10.fa		3581809	R	36	119					
+HWUSI-EAS610	1	4	50	1641	701	0	1	AGAGAGACATATGATCATCTTAGTCTGAACTTAAAA	_a\^bba]bbaabbYV^\W___]Q]^PZ^Z`_aa`[	chr10.fa		3581932	R	36	119					
+HWUSI-EAS610	1	4	65	168	723	0	1	ATACATGTTTTCAGTTTCTCTCCTTGACTGTGAGCT	aa^`_`b`aaba\a_aaaabaaa```^a`a^a^aa`	chr10.fa		3582055	F	36	119					
+HWUSI-EAS610	1	4	38	838	1529	0	1	TCTCACCATAAGCAAAACGTTGGTTGATTAGTAGTT	aaaaa``aaaaa_`aaa_aa`a^^a_^a```X_a^`	chr10.fa		3582104	R	36	119					
+HWUSI-EAS610	1	4	47	1521	302	0	1	GGAGAAGGTTTCTCGCCTCATAGAATGCAGTAACCA	]`_a[`ZQN`[a]BBBBBBBBBBBBBBBBBBBBBBB	chr10.fa		3582716	R	30G5	17					
+HWUSI-EAS610	1	4	66	816	1574	0	1	GTTCAAGTTGATTATATAACTTAGTTTGTCCTAGTG	aUa_`a^L_``aa_a`a^__[`a`]_`aY`__W]^a	chr10.fa		3582837	F	36	119					
+HWUSI-EAS610	1	4	69	1211	1355	0	1	ACTTTATTTAATGTGTGTCAGCCTCTAACAAATTAA	a\bba`abb_abb`a`babbb`aa`b``aa`aaaaa	chr10.fa		3583205	F	36	119					
+HWUSI-EAS610	1	4	47	787	208	0	1	AGACATCAACTTAATAGCATATGAGTGAACTAGATC	]aaa_``_a\aaaa]_a`aaa]WTaP`N__]_``a_	chr10.fa		3583677	R	36	119					
+HWUSI-EAS610	1	4	70	673	1588	0	1	ACCCTTTGGAGAAGTGATATCCAAGACCACTCTTAG	a[W[aa`__`^___^____`__]Y^\^]^Y^]]]__	chr10.fa		3584607	F	36	119					
+HWUSI-EAS610	1	4	22	1399	391	0	1	AAGTGATATCCAAGACCACTCTTAGAAAATGCTGCC	_U\U\^\_a\_]WOZ__a^^_Z^VS`\\`\GJ\`aa	chr10.fa		3584618	F	36	117					
+HWUSI-EAS610	1	4	100	1712	1222	0	1	GTTTTGTCCTTGTGTGACTCATTTTGGGGTCTGCCT	\a``a_Z[[aa[]`____a`a`V`_[W]VPP_`^[_	chr10.fa		3585094	F	36	119					
+HWUSI-EAS610	1	4	19	1465	775	0	1	GCAGAAAGTGGTTGGTAACCCCATAACAAGGATACC	_]_]TS__ZWU[PS^X`W`X`a`\\]Y^VYRYU]Q^	chr10.fa		3585642	R	36	118					
+HWUSI-EAS610	1	4	55	45	640	0	1	GTCAGAGAAACTTCTGTTTGCAGTGGGCAGCAGCTA	a`b^`b`X`U\]b`U`Q`aaa_bVaU^[Zaaa`b]U	chr10.fa		3585845	F	36	47					
+HWUSI-EAS610	1	4	39	1381	241	0	1	CATCAGAGCCAGAGGCTAGTTGGGAGTGTTGTGAAG	aabaaT^``baa_R_ab_\]]P_][VZ]_[GX\Q^B	chr10.fa		3585987	F	36	113					
+HWUSI-EAS610	1	4	58	824	1301	0	1	GGAGGGTATTGTCTTTAGCTAGGGCAACTTAAAAGT	`a_a]aR_aaa_]a`a__^``___^^_Z`a`^a_a^	chr10.fa		3586203	R	36	119					
+HWUSI-EAS610	1	4	64	1727	602	0	1	TAGCGCGGGAGGGTATTGTCTTTAGCTAGGGAAACT	^bb`a`XR\^_PZG_]a`Xaaa_XT\J]ROFFQa][	chr10.fa		3586210	R	31C4	105					
+HWUSI-EAS610	1	4	27	146	1427	0	1	AAAACCTCTTCTCCTATCCTACTCTTATGTATTCTC	V`\I_bbb^babbaa_`baa^ab_a``_]YV]]J\b	chr10.fa		3586322	R	36	118					
+HWUSI-EAS610	1	4	13	30	490	0	1	TCTGCTCATCATTTACTTGCTGTGTCATCAGAAAGA	abaabababbbaaabaaaaaab\b_aa\b]a^aaaU	chr10.fa		3587475	F	36	119					
+HWUSI-EAS610	1	4	83	1156	205	0	1	TTCATTCTGCACTCCACATAACAGCAAAGACTTTGA	ab`a`a^_``_^__\a_`aaa]`\[]_^^`^__``^	chr10.fa		3587621	F	36	119					
+HWUSI-EAS610	1	4	44	1059	609	0	1	AGATGGAAATCAAGAGGGGAAGAGTTACCTCAGGTT	abbababbab_a_a_a_a`aaa_a_a`^]`^`a_\a	chr10.fa		3587848	R	36	119					
+HWUSI-EAS610	1	4	89	624	1674	0	1	CGATGATGGAAGCTTTCTCTAAGTCTGCATTCCAAA	abRaaaaaa]Y`^`a`aaaaaYa^a_aa`a`_a`a^	chr10.fa		3587897	R	36	119					
+HWUSI-EAS610	1	4	35	683	101	0	1	AGACTTAGAGAAAGCTTCCATCATCGGCCCAGATCC	ab`a_aba`abbba`aab`baabbbba`b`aabaaa	chr10.fa		3587907	F	36	119					
+HWUSI-EAS610	1	4	84	1395	1026	0	1	CTCACCAGTGTGTCAAGTTAACATAATTAAGGATTG	aaaaZT\]Y]^_VZPLZWY_RIR[L]]_Q_XQTBBB	chr10.fa		3588271	R	36	104					
+HWUSI-EAS610	1	4	5	1330	921	0	1	TGACAGTTGTCCTAGCTTGCCTCTCTGTTGCTGTGA	`^`MX]G^`WN]^a\_Y_a_\\_WQQUG_]H\X\^B	chr10.fa		3588595	R	36	111					
+HWUSI-EAS610	1	4	80	230	603	0	1	ACGGATTGATGGATGGACAGATGGATTATTCACAGC	^]`a]`a^[__a__a^\WW__]a]VPZ_`_`W[O\[	chr10.fa		3588685	R	36	119					
+HWUSI-EAS610	1	4	82	1348	812	0	1	ATTATGGGAAAGTTAAAGATGTGTTGTGGAAATAGA	aabY`a\Y__`_`a^aZ]]`_]a_^^T_`_\`a^__	chr10.fa		3589056	R	36	119					
+HWUSI-EAS610	1	4	31	580	941	0	1	GAGGCAGGCACATGCCTGAATGCTCACAGACTAGCT	W\XR^b`\_W[^a^[a__[__^Zb_]U_^`]aVZTa	chr10.fa		3589691	R	36	119					
+HWUSI-EAS610	1	4	80	583	1186	0	1	ACTGTAAAAAGAGATCTGGGTGCAGCCACCACAGTA	aabbaab]a]`a]Xaa_[Z`Paaba^a`aa`R^`LX	chr10.fa		3589753	R	36	118					
+HWUSI-EAS610	1	4	56	1428	1240	0	1	TACCAATTTCCTCATCAGAGTGTAGATTTAATTAGT	a__`__^_a]]`^]`__`^`U]XTRR^a`^__a]QW	chr10.fa		3590239	F	36	119					
+HWUSI-EAS610	1	4	11	268	209	0	1	CGTCAATCCAACTGCGATTTGAAGTCCATAGAGAGG	[\]a^_\`aV]`U_UVXa`aaZWR`X]W]]X^ZY[T	chr10.fa		3590501	F	36	119					
+HWUSI-EAS610	1	4	27	583	892	0	1	TGCCTCATCTCCACTGGAAGCAGGAGTCCCTGTATT	^b_bbbb`bbb^_^bb_R\b``\_X_ZT_^a[ZV_a	chr10.fa		3590949	R	36	119					
+HWUSI-EAS610	1	4	89	869	588	0	1	CAAAAAGCAACAACTGCTCTTAGTGCCTCATCTCCA	`^S^\`a\T__`_aaaaa_b`a`[PYYa`Z`^a^]`	chr10.fa		3590972	R	36	119					
+HWUSI-EAS610	1	4	69	1623	213	0	1	AGGCACTAAGAGCAGTTGTTGCTTTTTGCTTGAAAG	aaaababa]aa`a`Y_b`_```aaa`_V_``[[_aa	chr10.fa		3590980	F	36	119					
+HWUSI-EAS610	1	4	29	263	1485	0	1	CTTATGCATCAAGACATATTCTCAGCTTTCATTCCA	aaababbbaaa_``^W^aa`aaabaaaaba`aaaaa	chr10.fa		3591374	R	36	119					
+HWUSI-EAS610	1	4	67	81	1087	0	1	TAGGACTAGAGATGCCTTTCTTCTAAATGTCATTTG	^^abababa^_V]bbaaaab`bbaa``aa_aaa`aa	chr10.fa		3591461	R	14T21	80					
+HWUSI-EAS610	1	4	45	1670	904	0	1	CATGTAAGTACACCATCATTGCTCTCTTCAGACACA	[a`_b``]T_ab`abb```]YOT`\SXa]^H]`a\`	chr10.fa		3592519	R	36	23					
+HWUSI-EAS610	1	4	25	1448	494	0	1	ACAGTTAAAGATGTATCCTGGAAAATGGTTGCTCTT	aab^`baaa^aa`\aa_]ab_`^`aa^]]a^_a_aa	chr10.fa		3592788	R	19A16	80					
+HWUSI-EAS610	1	4	34	1051	1729	0	1	TTTGCACATGTGCATGTGTATACGTATGCATGCGCA	_aa^^aa[X]YYY]aa^`_```Wa\]Z_]X]`\_TS	chr10.fa		3593683	F	36	119					
+HWUSI-EAS610	1	4	55	1495	1191	0	1	GATTTGAGGAGCTAGAGAAATGGCTCAGCTGTTAAT	abab^aa_`a]]a`^^_aaaaa__^]^X\[[X____	chr10.fa		3593839	R	36	119					
+HWUSI-EAS610	1	4	47	179	648	0	1	ATTTTTATGTAATTTACTGATAATGAATCATAAGGA	a`aaaaaaa^b`aa``aaa]`^^aaaa`aaa`aaa^	chr10.fa		3593892	R	36	119					
+HWUSI-EAS610	1	4	52	1494	442	0	1	GGTGAGCTATAGAGATGAGTCCTGAGCGGGCCCTGC	_[O`\```aQ`_`Z`_U_]U_`OH\F\FUZT\[\X[	chr10.fa		3594467	R	36	115					
+HWUSI-EAS610	1	4	20	462	740	0	1	GTTATCTGCACAAGACTGGACTATCAACATTTCATC	a_aa____a_]`________^a^`]``_[__^_`__	chr10.fa		3594902	R	36	119					
+HWUSI-EAS610	1	4	51	1652	1429	0	1	TTGATAGTCCAGTCTTGTGCAGATAACATGTCTGTG	abab`a_^_a[`]aa`a_aaa^a``a__`_^_a[T_	chr10.fa		3594911	F	36	119					
+HWUSI-EAS610	1	4	17	158	742	0	1	TGAGACCCCCATGCACACTGGCATGTCACCCGGCGT	[^aa`[[\Z_`[J[`a`aU\`_`X[T^R[UQ]J_`W	chr10.fa		3595712	F	36	118					
+HWUSI-EAS610	1	4	96	697	823	0	1	TGAGACCCCCATGCACACTGGCATGTCACCCGGCGT	__`[ZS^`^ZU^`^RW^Z\^^\Z\^UR]TRR\ZPaR	chr10.fa		3595712	F	36	118					
+HWUSI-EAS610	1	4	60	1510	1103	0	1	GTTGCCAAGCAGGGCAGGGGGAAGGTATAGGGGACT	^aaa````[``_M_\Y`^a]SS^`aP]aX]Y^^Z`a	chr10.fa		3596487	R	36	118					
+HWUSI-EAS610	1	4	18	932	717	0	1	ACACAGAGACAAACACAAAACCACTCCAAATCATAT	`aababaaa]O`a__\a`aa`a__a`_a`__]_^`a	chr10.fa		3596904	R	36	119					
+HWUSI-EAS610	1	4	54	1198	1177	0	1	ACCCATGCACACACAGGTGCCCATGCACACACAAGT	`a``a]a`a_aY[]`YUVU_]XX[^^a`^\^U`\\S	chr10.fa		3597049	R	36	27					
+HWUSI-EAS610	1	4	78	274	1982	0	1	GCATGGGCACCTGTGTGTGCATCGGCACCTGTGTGT	aa``^\aaa`aaa``\`X\``V_]]a]^^^`S`X]B	chr10.fa		3597292	F	36	27					
+HWUSI-EAS610	1	4	14	727	1057	0	1	GTGTGTGCATGTGCACTTGTATGTGCAGGGGCACCT	`aa^_\a``aa^a]`]a`]^a__]b[```a``][]_	chr10.fa		3597556	F	36	61					
+HWUSI-EAS610	1	4	86	669	1934	0	1	GGCATGAGCTTCTGAAGCCTGCCTCTCTGAACACTG	_\_ab_X_aaaaba^aaaa_]aaa]Y`aZV\^a\X`	chr10.fa		3598335	R	28A7	88					
+HWUSI-EAS610	1	4	40	1541	1860	0	1	TGGAGTAAGAATTATGTACATAGAACTGTAAGAATG	aaa__\_____`^\\\R_^^`^[S]X_`[]]^T^\[	chr10.fa		3598729	R	36	119					
+HWUSI-EAS610	1	4	96	144	198	0	1	TGCTGAAGGGACCCTGTTATAAATGTCTCATATGAG	abbb_`a`bbSbb`Z[Wa`b^Q^]X\aaa``a`\V[	chr10.fa		3599650	R	36	10					
+HWUSI-EAS610	1	4	19	1027	125	0	1	ACACATGATCATCTCGTTAGATGCTGAGAAAACGTT	a`]`aaaa`[``[aa__aaaa`^[aYT^^`_YU^^`	chr10.fa		3601933	R	36	5					
+HWUSI-EAS610	1	4	77	994	1193	0	1	GTCTCTTTCTTTGTTGGGTCTTTGTATGGTTTAGGT	\X_\`aZa\^`[ZY]_ZYV]ab^aTV_```_^V`]`	chr10.fa		3602136	F	36	10					
+HWUSI-EAS610	1	4	25	6	948	0	1	TGGTCCTGGTATCTGTCTAGGAAGTTGTCCATTTCA	aba_a`aabUXab`a^`]_aa_^a]``^__I^`_`_	chr10.fa		3602422	F	36	24					
+HWUSI-EAS610	1	4	52	252	328	0	1	TTGGCTTACACTTCCATACTACTGTTCATCACCAAG	`b`aba`[Z\_a[a`]]Za\]````aa_`a__`[]]	chr10.fa		3605365	F	36	7					
+HWUSI-EAS610	1	4	38	1281	92	0	1	TGGCTTACACTTCCATACTACTGTTCATCACCAAGG	aba`bab`a_^_]^a``_`aZ`___[_\Y`WW`_`Z	chr10.fa		3605366	F	36	5					
+HWUSI-EAS610	1	4	2	1058	1273	0	1	TGTGTTGGGGTATCCAGGATTGGTTGAGGTGTTGTG	ab`b`bab_\LY]aU\bbW```aa_XGPaUa_`a[B	chr10.fa		3606925	F	36	13					
+HWUSI-EAS610	1	4	67	256	335	0	1	GACTGCCAGAACAAGTGAGGGAGCCATCTTGTGTCC	`aa`\_a`_]aaa]bR_aaa`Y`^```[^^`\`^`Y	chr10.fa		3607498	R	36	37					
+HWUSI-EAS610	1	4	42	1691	1055	0	1	ATCTCTCTGTTTTGTGTAAAGAGTCATTTTCCTTCT	``ab`a_ab`a`aaa^`aa\aaa[a_aaaa`[]aaa	chr10.fa		3607799	F	36	50					
+HWUSI-EAS610	1	4	46	1585	1829	0	1	ATCTCTCTGTTTTGTGTAAAGAGTCATTTTCCTTCT	_aa\K[`b]M]VTZ]]VQWJ[JUK\^V]W_TXX^YZ	chr10.fa		3607799	F	36	15					
+HWUSI-EAS610	1	4	98	1035	1443	0	1	ATCAGGAGTGATCACATGAGCTAGCCTAGGCTCAAG	abbaaaK]_ba]FN`]]Q_aaS]X^``__``__]PU	chr10.fa		3608378	F	36	117					
+HWUSI-EAS610	1	4	39	952	1939	0	1	CTGAGGCAAGACACATGCTGAGGTAAGACACATGGA	abaaaaa`Saa_a`aaa``a`a`V`a`a__Y__PZ_	chr10.fa		3608577	R	36	47					
+HWUSI-EAS610	1	4	22	327	1615	0	1	TGATGTCAGCTAAGCAGACACATGTGCTGAGGCAAG	abb`b]^aaa^\a^a_a`````a`N\a^``a^aa_^	chr10.fa		3608603	R	36	119					
+HWUSI-EAS610	1	4	100	1154	535	0	1	GGCAGAAACTGCAGCACACCACCAGATGTCTTTTGG	Zaaaaa^```_^```a`ba_aU_a^`_`NW_\\_^S	chr10.fa		3608669	F	36	39					
+HWUSI-EAS610	1	4	46	845	710	0	1	TCCCCAAATTCATCTGAAATAATTCCATTGAGAACC	a`a``_[`aa``aYa_\a`aa```_^`aaa__`_^_	chr10.fa		3609413	R	11T24	82					
+HWUSI-EAS610	1	4	71	375	1287	0	1	TGGGGGTGGACTTTGAGGTCCCACATCAGGGTAGAG	aba`_a^``ab`a^b_aXQ]aaaaaa]]aaa\a]NZ	chr10.fa		3609460	F	36	119					
+HWUSI-EAS610	1	4	21	519	775	0	1	AATATATGGGAGAGCAGAAAATGACATTCTGAAATT	SY_\`b`aa_\_Za`_`]\X_`_[_W_[``aZYRU[	chr10.fa		3610134	R	36	119					
+HWUSI-EAS610	1	4	64	478	236	0	1	TCAAATTGCCTGTCCATTATCACTCTGGAATGCTTC	a`a_aaaaa`aX``aaaaaa_a_a_`a__a^`_a_Z	chr10.fa		3610260	R	36	119					
+HWUSI-EAS610	1	4	69	137	1883	0	1	GACAGGCAATTTGAGCACACTAGTTAGCTTACTTAG	aabaaaaa__\a]`]b`a_aX]_T]aaa_X^`_]_]	chr10.fa		3610282	F	36	119					
+HWUSI-EAS610	1	4	70	1181	706	0	1	GAGCTTTAAAAGGAGCAGAGATAACACCAGAATTTC	aaaaaaa``a_``^`[`a_a^a_a^`^^b^`^^^_a	chr10.fa		3610359	F	36	119					
+HWUSI-EAS610	1	4	15	1348	1326	0	1	CAAAGCAAGGAACATAATAAATTGCTATGGCCAGGC	abbbaaaabaa``aaaabbbaaaaabaaaaa`aab`	chr10.fa		3610491	F	36	119					
+HWUSI-EAS610	1	4	62	1145	1886	0	1	CTCTGAACTACTTTCTTCCACTCCACAGACTGACCT	`b`^Y]a_aaaaa`aaba`b_`a`Y`aa_]\a__^a	chr10.fa		3610773	R	36	119					
+HWUSI-EAS610	1	4	36	1788	1097	0	1	GGAATAAGCAGGTGATAGACCAACTTCCTTCCTGTA	\]_aa_VQ^_]VFQZ[``a^_^_Z^Z^]S]Y]\YUW	chr10.fa		3611444	F	36	117					
+HWUSI-EAS610	1	4	73	1305	1665	0	1	TACATCCTCTCCAAACTGTAAGCTCTACCCATTCAG	`\PS``Y_R`_a`^^ZaaU\KXZRRR___W[_[BBB	chr10.fa		3611480	R	36	105					
+HWUSI-EAS610	1	4	90	1124	1329	0	1	TGGAAGAGATGCAACACCTGTGAGGATGATTGACAG	_bba^aa]a^[[MM]_R[aWP^P``R`a_]``XDYa	chr10.fa		3611610	F	36	116					
+HWUSI-EAS610	1	4	40	853	1046	0	1	ATACTCGATGTCTGTCTATACTGTCAATCATCCTCA	Y_\XaV`^ZZ_^^`VR\_`^`Z\LP_XW\OZRY_X[	chr10.fa		3611630	R	36	118					
+HWUSI-EAS610	1	4	55	293	2021	0	1	TAGCAGAGTCATGCATCAAAGTATCCTATGGTACCC	abaabaaa_aa_[]a`_`_``^a_`_]`_^]]]\^\	chr10.fa		3612226	R	36	119					
+HWUSI-EAS610	1	4	53	1783	1443	0	1	GGGTGGATTTTATAAGATTTTATAAGAACAATTTTA	aaaXaa_aa__a`a``__aaaaaaa__a\GZ`Va_`	chr10.fa		3612350	R	36	118					
+HWUSI-EAS610	1	4	13	1348	345	0	1	TGACTACATGCACCTGCAACCCCAGCACTGCCAGGG	`aZZZ^\`^```T\`_`^UKRZUPXTZZPPTPQRPT	chr10.fa		3612551	F	36	117					
+HWUSI-EAS610	1	4	75	391	803	0	1	GGAGCTAAGTTAGCAACCAAGAAGCTCTGGAGATCC	_babaa[_aHaa]a__b[`Y_Naba`aaaba^^aaa	chr10.fa		3612605	R	36	118					
+HWUSI-EAS610	1	4	32	227	378	0	1	CAGAGCTTCTTGGTTGCTCACTTAGCTCCAGGTCCA	Z_Z]\]aaa_XPDJ^]U\PZU_TKIX`\BBBBBBBB	chr10.fa		3612612	F	18A17	60					
+HWUSI-EAS610	1	4	9	313	1955	0	1	GTTCGCATTGTGTGTATCCTGCTCCATCTTCCTATC	a^aabb_aaa_a_a[`_`a^]a_aa_]a__a`_]]a	chr10.fa		3612676	R	3T32	81					
+HWUSI-EAS610	1	4	98	1696	1054	0	1	TGCCTTTCACATCAATCATCAATCAAGATAACACCC	_a`Y```ab\_aa`a\Q\abaa_aaaaa]aa_a^`a	chr10.fa		3613027	R	36	119					
+HWUSI-EAS610	1	4	64	759	1473	0	1	TGATTGATGATTGATGTGAAAGGCACTGCCCATTGT	aaXabb^XT`^]]_]`[]__^R\`_ZY`]^^X]aa_	chr10.fa		3613038	F	36	119					
+HWUSI-EAS610	1	4	39	1453	929	0	1	TTAAAATCCATCATAAAGGGAAGTCAGAGAAGGAAC	ababaaaaaba_baaaaaaa`a_`aaa`aa`]_^a_	chr10.fa		3613195	R	36	119					
+HWUSI-EAS610	1	4	94	861	1387	0	1	GGTTGGGAATCGATTCACTAAAGTTAAACTTACTTA	ab`\ZX[L_`]H_T^bba``a`b[`TSZLbb`^a`a	chr10.fa		3613305	R	7T3C24	89					
+HWUSI-EAS610	1	4	73	431	1653	0	1	CATTTGAGACCAGAGTAGTCTACAGTGAGCTATCAT	a]aaab```abb[U`\a_^a_`aa`Z__[a]a^]^^	chr10.fa		3613549	R	36	119					
+HWUSI-EAS610	1	4	19	1041	1577	0	1	CATGCAAGACATAGAGCAGGAATATTATTTACATTT	\Z_\[_`\^ab_KRNW^Y_^_X]OU``[SUZLT^Y[	chr10.fa		3613580	R	36	118					
+HWUSI-EAS610	1	4	37	852	1582	0	1	TTTTCTCCCCTATAATGAAGTATAAACATTGAGTAC	^abbabbbabbbba\ba`Za]_abaa[abb`Y^_ba	chr10.fa		3614595	F	36	119					
+HWUSI-EAS610	1	4	77	352	1251	0	1	CCCATGTTGGGACAGAATCAAGCATAAATATGGATT	`b]U]b_]XQY^XaaVVL]PY_aaR[YQXUX__]Z[	chr10.fa		3615212	R	36	118					
+HWUSI-EAS610	1	4	96	1686	395	0	1	TGTAAAAGTAGGTACAATTTCCACCCTCCCTATAGG	^a^`a`SW^__[UaTYa`V`_aaIU\a]Z_BBBBBB	chr10.fa		3615345	F	36	92					
+HWUSI-EAS610	1	4	75	1761	225	0	1	TTTGTTGACTGTGAATACATGATTTAGGGCTGACCA	_ba`_aVba^W^Yaa_aab^G]^_a_NOY`aWa_a_	chr10.fa		3615676	R	36	118					
+HWUSI-EAS610	1	4	83	755	271	0	1	CAAATTGATAGCCTCTTCCTCCCCAGGTATTGTTAC	aaabaaaa^a^a_aaa`aaa```]Z_aPaa````a_	chr10.fa		3615779	R	36	119					
+HWUSI-EAS610	1	4	74	1243	1335	0	1	AATACCTGGGGAGGAAGAGGCTATCAATTTGAGAAT	aaaaaaa`aa`_aa`aa_aa_`__[V^_aa`^`__`	chr10.fa		3615784	F	36	119					
+HWUSI-EAS610	1	4	2	205	261	0	1	AGCATGATGTATAGATGACCAGCTCTAACCAGGGAT	]```b_^[^N_ab`aaabbabbaaaabaa\`bZ\ab	chr10.fa		3616084	F	36	119					
+HWUSI-EAS610	1	4	98	1695	1684	0	1	TGTTCAACAATAGTGGATCCCTGGTTAGAGCTGGTC	aaa`aaa_aaa_bH`a[__Y```[V`_ZZ]X]^ZZX	chr10.fa		3616100	R	36	118					
+HWUSI-EAS610	1	4	43	481	543	0	1	CTCCAAATTCCAGGGTTGTGTGGACAGCAATACAGG	aaaa``````^]^a`_`a[`W_[^``aaaa``[aaa	chr10.fa		3616156	R	36	119					
+HWUSI-EAS610	1	4	67	499	1199	0	1	ACTGTGAGCAAGATTCCAAAGATAACACAACTGGAT	YG_]X_^aRM^_Y_^^^]_YaPQN][Ia]`G^G[^_	chr10.fa		3616617	F	36	115					
+HWUSI-EAS610	1	4	11	810	1088	0	1	TACCAGATCCAGTTGTGTTATCTTTGGAATCTTGCT	aa`aaa_^^_]a__a^a^a`a```_aa\T`_`_a^^	chr10.fa		3616623	R	36	119					
+HWUSI-EAS610	1	4	90	1108	1509	0	1	ATAGAACCTAGAGCCTTGTGAAAGCTAGGCAGGCAC	aaa]Y_[S`J`^YX`_abaa_\\WQ[a_PP]a\I]B	chr10.fa		3616892	R	36	113					
+HWUSI-EAS610	1	4	48	272	327	0	1	TGTGGAGCAGCAATTCATAACCACCTGTAACTACCG	`_baaaa_aaa__abbaaba`aa`aaaabaaba`ab	chr10.fa		3617816	F	36	119					
+HWUSI-EAS610	1	4	73	1003	663	0	1	ACCCTAATGAATCAAGCAAACAAAATCTAAGAAAAC	aaabbbbbbb`bbbababbbbbbaabababbaabba	chr10.fa		3618232	F	36	119					
+HWUSI-EAS610	1	4	47	1108	315	0	1	GCTATACAACCATAACATATATGCAGAAGACCAAGG	\`]`ba^T`^U`a_a_`aaa]`[Y^UTZWMX_`_a`	chr10.fa		3618724	F	36	26					
+HWUSI-EAS610	1	4	66	178	1752	0	1	TGTGGTATTCTTGAGCCATTTGGTTCCACCAATCCT	Ub`ba[bbbabbabWbaJ__^VaRbb`H`TDH`_`T	chr10.fa		3618835	F	36	115					
+HWUSI-EAS610	1	4	76	1346	411	0	1	GGTATTCTTGAGCCATTTGGTTCCACCAATCCTTCT	W\_b`aab`]a]aaa_]]Y]_^^___`]`aW]\`Z`	chr10.fa		3618838	F	36	119					
+HWUSI-EAS610	1	4	15	461	1324	0	1	GAGCTGATCTCTTCAAGCTCACTATAAAACCTTCTC	a[aRWG^[[[`_a[[`TP_a^XVP`J_WXO\]W_Ua	chr10.fa		3619153	R	36	117					
+HWUSI-EAS610	1	4	39	196	1621	0	1	TAAACATTCTAGTTAACCACTGGAGGAGAAAACTTG	`Xaabaaaaaaa^aaa`b^aaaa_``_a_aa``a_a	chr10.fa		3619969	F	36	32					
+HWUSI-EAS610	1	4	69	1315	634	0	1	AACCTGACTGAGACTTTAATATGGCAGAAGATAAGG	ab`abaaaaaaaa_abbaaaaa]_`aa^]]]^a_^`	chr10.fa		3620796	F	36	37					
+HWUSI-EAS610	1	4	39	133	672	0	1	ATATGGCAGAAGATAAGGAGCATCTCAAGATCTATT	a`_`b`baa`baa``a_aaaaa_a_ab`a`_a_a``	chr10.fa		3620814	F	36	119					
+HWUSI-EAS610	1	4	44	1575	1878	0	1	TTTAGGCCCCTCTAGACGGTCCTCCTTAGGTTTCTT	aba`aaWQZ^]\a\`_U`_WUUNR[\ZW_^TZXQ[\	chr10.fa		3621438	R	36	118					
+HWUSI-EAS610	1	4	53	1176	953	0	1	CAAGCCCCAAGCAGGTACAGGAATTCCTGGGCACAG	abbbaabaa_Z_Z`UYW_`[_`aba``^^a]^^``^	chr10.fa		3621627	F	5T30	81					
+HWUSI-EAS610	1	4	7	972	1609	0	1	CAAGCTCCAAGCAGGTACAGGAATTCCTGGGCACAG	aab_\`]_`__`b`a_bbbb`abb_X\`b^aaaabb	chr10.fa		3621627	F	36	119					
+HWUSI-EAS610	1	4	41	291	1756	0	1	CTGCTCGNGACCCCTACTCTAGGACTGCCTGATGCC	aaaa_a[DP_a`a_\^a]`_Xa\\aVaaaR`\_`_a	chr10.fa		3621796	F	7A28	110					
+HWUSI-EAS610	1	4	84	456	1352	0	1	ATGAATATGTGACAAGGTAGAAACGTGTGAACCAGA	[Q]V]`]]a_baa`X`QU^aYWX^a_a_a\\Wa^]U	chr10.fa		3621927	F	36	119					
+HWUSI-EAS610	1	4	71	256	1858	0	1	GAGCAGAGTTGTCTCACTTGCATTTTTACATTCCCT	[_bbbb]bYab_][b[GWOWNM\]aaWQDM^__b_a	chr10.fa		3622497	R	16T11A7	97					
+HWUSI-EAS610	1	4	11	43	95	0	1	CACAACAAACTCCTGAGGTATTGTTCTATTTTATAG	aaa___aaaaaa_`a^aaYa`_a\_``_``__a_`a	chr10.fa		3622688	F	36	119					
+HWUSI-EAS610	1	4	14	972	1802	0	1	GGCTTCAGAGAGAAGCAGACGCTCTCAAGATTTTAT	ab`Y`aa`aaaa_a``aaU[a[a_^]W_a\\__^^`	chr10.fa		3622939	F	36	119					
+HWUSI-EAS610	1	4	69	797	316	0	1	CAGCTGGGTGCCTACAGGGTCATAACTATCCACTGG	aaaa`bbb`baabb`babbXaaa_baaaa_aa]aba	chr10.fa		3623103	R	36	119					
+HWUSI-EAS610	1	4	6	1507	1527	0	1	TATGACCCTGTAGGCACCCAGCTGACTCTAATTCAA	aa`Z_U]_[ZP]_\\`YU\[YQOZ^SZR[X[\^[[Z	chr10.fa		3623115	F	36	118					
+HWUSI-EAS610	1	4	12	881	1797	0	1	GTGCTCTCATTGCCAACATTGTCTCACTTAGTTCAC	a]^a`T]T[]XXZP_Z`aa`_Y\N_`_`a^]]`]__	chr10.fa		3623986	R	36	118					
+HWUSI-EAS610	1	4	100	1605	209	0	1	AACCACCGTCTTATATGTGTGGCGGAGGCACATTGT	aa_a`]]_UT_\`\`_ZYS\_]YVWWNT[\S^USVT	chr10.fa		3624532	R	36	118					
+HWUSI-EAS610	1	4	17	957	397	0	1	CTAGTTACAGGATGTACTTGCCAAGAATCTATACTT	abbb`baaabbaaa^a_aab`_a`a__`_a_`Z^_`	chr10.fa		3624584	R	36	119					
+HWUSI-EAS610	1	4	9	1618	598	0	1	ATAGAAATGGCTCTAGTTACAGGATGTACTTGCCAA	aaab_```XXW^[^a[Wa__`^[X_]Z_YZ^X^XBB	chr10.fa		3624596	R	36	110					
+HWUSI-EAS610	1	4	68	734	946	0	1	TGACTACCAGATAGACTTGCCATTACTTGAAGAATC	aaa``^]aa_W__]]_a`Y[_]`\V\``\W\\U\`_	chr10.fa		3624912	F	36	119					
+HWUSI-EAS610	1	4	74	1179	1373	0	1	TGTAAAATTTCACATCTAATTAAGGTTGAAGTCTAC	aa`aaa_`a_^^^]]W_``a^\\^`[]^S]\W]Z_^	chr10.fa		3625028	F	36	119					
+HWUSI-EAS610	1	4	56	899	496	0	1	AATTAAGGTTGAAGTCTACCATTGTCCAGATAAGAT	```b^a^^aabaXP\abaa^aaab`_ab^^a```]`	chr10.fa		3625045	F	36	37					
+HWUSI-EAS610	1	4	46	558	1197	0	1	ACTTCTGAGTTGGCATAAAATTGGGGACTTCATTTG	a\a`a`^`a__abaaa`^`[aa_`a`]aaaa```a\	chr10.fa		3625083	F	36	119					
+HWUSI-EAS610	1	4	7	18	1992	0	1	TTGTCTGGGGAGCTGGAAACAACCCCCCCCACACAC	`__Za`aa``_aa`a_XO[_`a`a^`^a\`U`\\Z^	chr10.fa		3625145	F	28A7	86					
+HWUSI-EAS610	1	4	69	1198	1772	0	1	TGAAGTGCTACTGATGTCTCTAGTCTGAACATAGCA	a]a^IJ`a[^_aa__]aa`a`_\ZGX_Y[NY_`RW`	chr10.fa		3625496	F	A35	79					
+HWUSI-EAS610	1	4	99	1301	198	0	1	TGAAGTGCTACTGATGTCTCTAGTCTGAACATAGCA	^]_aY^[`_`a_^_aa_``_^aa__Z]``_`_`_`a	chr10.fa		3625496	F	A35	84					
+HWUSI-EAS610	1	4	67	401	1541	0	1	AAACCTCTAGCATGTGGAACTGCTTTGGCCTGGTGT	aa]aaaaaa`_a``\_\S`a]___[___\a``_U_S	chr10.fa		3625531	R	36	49					
+HWUSI-EAS610	1	4	34	1280	2044	0	1	ATACTCATGGTCTGCCATTGACTCTGCTTCCTTTGT	]_[]baS\Q\OM[aab[a^`XOW]a]aaa^]WUYBB	chr10.fa		3625856	F	36	109					
+HWUSI-EAS610	1	4	1	1498	1050	0	1	ATTGTAGGAGATGCCTTACTGGTGTGCTAGGGATAG	a_U`_\X^^X`Y`X_`aTYa``R[RVY]XNJ`\XUY	chr10.fa		3625989	F	36	118					
+HWUSI-EAS610	1	4	2	800	24	0	1	GTACATTTTGTTGAACGTTATGTACATTCAAACTGT	aab`bbaaa`\aaa`_aaaaaa_`_a`aZY]_W_a^	chr10.fa		3626054	R	36	119					
+HWUSI-EAS610	1	4	72	1533	1471	0	1	GGGTGAGGAGAAAGAGCAGATTGCCAGTTTCTGTGC	a]aN]^[]``^aa__`aaa`WV`W_Z_W__U__S_\	chr10.fa		3626110	F	36	119					
+HWUSI-EAS610	1	4	61	1672	1460	0	1	GTCCCTGTTGGAAGATAGGAAGTAGGGACAGCAGAG	a_`SUa`^a_a^T_O[_[aRaaV_ZHX\S\\VZQWV	chr10.fa		3626227	F	25A10	106					
+HWUSI-EAS610	1	4	30	1047	1069	0	1	CTCCAGCCTATGGTGTCCCTCTAAGANTTGTCAATG	aab]a`[[b]baaZbS]^aaa`\`aTDZab\^a`\a	chr10.fa		3626599	R	26T9	110					
+HWUSI-EAS610	1	4	26	1777	2001	0	1	TATGGCATGGTCAGCTCTAGCTCCTTCCAGTGGTAC	aabaaa`a[QTZS_YSS]Q^U\NZRVP[GWNUUBBB	chr10.fa		3628878	F	36	104					
+HWUSI-EAS610	1	4	43	1494	1118	0	1	AATATTGTACTCAGAATCTTATCAAGTTTTAAGGAC	aabaaa__b`a_a_aaa`a`a`[```^aaa__`__^	chr10.fa		3628954	R	36	119					
+HWUSI-EAS610	1	4	53	216	1188	0	1	AACCTCTATCCATGAATTGCTGCTCCCTCATGTATC	aaa`aaaaaa```a`_`_``__^`^^`_]^_a[ZV_	chr10.fa		3629324	F	36	119					
+HWUSI-EAS610	1	4	16	1302	1930	0	1	AGACCTAATTTGCACAAATTACCACAATTAGCATAA	aa`a\^V[VbbbYaVa_bb``\\^^a]a_^a]\_`]	chr10.fa		3629400	R	36	119					
+HWUSI-EAS610	1	4	73	1272	1800	0	1	TGCTTGACAAGGTAGGACCCAGTTCCTGGACAGGGT	`b`aa_a^a``]P`aUX`S`a`S]`_^``^\M`]^U	chr10.fa		3629655	R	36	118					
+HWUSI-EAS610	1	4	47	749	2026	0	1	GTGAACATCTCAAAATCAGATCTTATGCTTGACAAG	a]`_aab]``aaaa`abaa[`[]^a]Z]`]]__^]_	chr10.fa		3629680	R	36	119					
+HWUSI-EAS610	1	4	86	1488	394	0	1	TGACCCCAAAACCAGCCATGCTGAAAAGTCTTCCAT	aTaZTP\`a`\`Ya]GR_LM[^__`_YFN]UYY___	chr10.fa		3629895	F	36	116					
+HWUSI-EAS610	1	4	41	1244	1917	0	1	GTAATATAACTCTTCCCATACAACTAAAAATTCTTC	a```aaaaa]`^_`[\\__a]__^`_a____^Y_^Y	chr10.fa		3630326	R	36	119					
+HWUSI-EAS610	1	4	100	1515	818	0	1	GAAGAGAGGATTTAGATACTCACATGCATGTGTGCA	`_aaWVP^V`_[aaZTY^aX`a_aY_[a[URWJX]_	chr10.fa		3630647	R	36	118					
+HWUSI-EAS610	1	4	66	353	1903	0	1	TAGGCTTTCAGTACAGATGCAATACCAATGACTTCC	abbabbabbbba`abaa`abbbabaaaabbabaabb	chr10.fa		3630734	F	36	119					
+HWUSI-EAS610	1	4	14	1570	1638	0	1	GAAATGTACAAACATACCACAGATATGGCTAAGGGG	aaa`a`]a``_\_[__```]]___X_Y_^_]^_^_]	chr10.fa		3630987	F	36	119					
+HWUSI-EAS610	1	4	54	1458	748	0	1	TTTCTCTGATATAGAAACTATTGGCATTCTGGATGA	aaa_a_a````a_^___Z`a__Y_Y]a`]_^^^^_\	chr10.fa		3631216	F	36	119					
+HWUSI-EAS610	1	4	78	863	1271	0	1	ACCAGGCTATGCTCACATTCTCATTACATATGTTTC	aa_\aa]__a`\`_[G\aa^a_^]__U^```_U__\	chr10.fa		3631320	R	32C3	92					
+HWUSI-EAS610	1	4	48	450	139	0	1	TTTGGGCTCATTGGTATGTAGCTGATGGAGCAGCTG	aab`_`abaabbbb[abba``aababaaabaaaaaa	chr10.fa		3631768	R	36	119					
+HWUSI-EAS610	1	4	88	733	984	0	1	AGACTAATCTTCTAAATTTTAGACATAAGACACAGG	ab`abaababbaabaaabab_aaaab]a`a`_`aa_	chr10.fa		3631912	R	36	119					
+HWUSI-EAS610	1	4	11	1395	1582	0	1	CTTTCTGGCTTACCATGGGAGAATATTAGGTCTTGA	Sab`\a\bbbaaa]^`bbaa_bbbaabaa]^Yaaba	chr10.fa		3632039	R	36	119					
+HWUSI-EAS610	1	4	26	636	1876	0	1	CAAAAGCTCCAGGGACTTATCACACTGGCCAGCACA	___X[^_^abb`U``aa``b_b_W^\S`a__Z__TR	chr10.fa		3632243	F	36	119					
+HWUSI-EAS610	1	4	46	287	616	0	1	AAGTGCTTTGCCAAAAACCAGAAGAAAACTGGAAAC	a_aXba_baaa_a`^Waabab^`ba][]a^a`_a_`	chr10.fa		3633234	F	36	119					
+HWUSI-EAS610	1	4	38	1052	568	0	1	AAAGAAATTTGTTTCAGTGTCCATAAACATGGTTGC	aaa`_a[aaaa]__^___`_]^____]Y[Z^]S^^^	chr10.fa		3634900	F	9C26	81					
+HWUSI-EAS610	1	4	44	1749	1895	0	1	AAGGAAAGTTTATTAAGAAAGAAAATTACTCCTGGG	aaaa___b_a`^__a_`^__a^\^_[]`Y`^Z_^]^	chr10.fa		3635492	R	36	119					
+HWUSI-EAS610	1	4	52	1487	1123	0	1	TCCCCCTCCAGAAACCCACTATCCCATCTCCCTTCC	a]^^a\``^a```\U^^`^a[^Z\^^^Ua\U_\]\Y	chr10.fa		3635602	R	36	43					
+HWUSI-EAS610	1	4	100	264	1019	0	1	TAAACTAAGTTTACCCTGTGACCAATAAAGCAAGTT	V\aa]TW[_`aaa`_]_a_aYa_```aaa``a`a^^	chr10.fa		3636080	F	36	119					
+HWUSI-EAS610	1	4	34	768	1091	0	1	GCCCAAATGAATCTTTAGGTACATAATGATATCTTT	a``_\aa`a`_a^aaaaaaY__aa`_``Z^]_^`__	chr10.fa		3636545	F	36	119					
+HWUSI-EAS610	1	4	89	903	211	0	1	GCTATTAAAAAAGAATGCTGGATAAAGCCATATGGT	aXa[aa^^_____`^```a`_`]^__]^]a]_``\]	chr10.fa		3637584	F	26T9	85					
+HWUSI-EAS610	1	4	25	501	1734	0	1	AGGTTTCCATCTTTGCCCACCTATTGTATGTGCATC	abb]bbbbbbbbbbbbbabbbabbbbabba^abbab	chr10.fa		3638555	F	36	119					
+HWUSI-EAS610	1	4	51	1259	1158	0	1	CTACCAGGTAGCTTAAACTGTCTATCTTGCTCTTCA	abbbabbb`ababbbbbabbbabaa\aa^`a`ab`b	chr10.fa		3638971	F	36	119					
+HWUSI-EAS610	1	4	16	580	1849	0	1	TTTCTCACCAAAAGTCCTTCCATCCTCAAAGAAGAG	aX`aa_]_aaaaaaZ`a[X`aa`^\`X^_]`U]_aa	chr10.fa		3639017	R	36	119					
+HWUSI-EAS610	1	4	38	1158	1247	0	1	AGCTTCGGAAAGTAGCAGGTGAGATAACATCCCCTC	a`a`b_aa\a`a\aa``aa^``a`a`_\a_Z[BBBB	chr10.fa		3640105	R	36	102					
+HWUSI-EAS610	1	4	4	1586	481	0	1	TAAATACTGAAGAAGTAACAGCTACTGTACTCCACA	aabbaaaa]`a]`a__aa`a__``^\a^aaZ]_a_a	chr10.fa		3640361	R	36	119					
+HWUSI-EAS610	1	4	94	507	890	0	1	ATGGACTATTCTTCCCCTTTCTTGTTTCTCTTTAAT	a_]UDXa_^XY^`]X`VYY_]ITaS`YY[__a_^^_	chr10.fa		3640415	R	36	116					
+HWUSI-EAS610	1	4	90	1360	1339	0	1	TAGAATTCTACATCTTGTATATTATCTTTGTATCCC	abaaa]aa^Z`Q_```Z^aa^aa`a`a`_[]Zaa][	chr10.fa		3640766	R	36	119					
+HWUSI-EAS610	1	4	31	970	809	0	1	CAGCTGACACAGAGTGGTTAAGCCCAGAAACAAGAG	aabbbabaa_\`ab`bbab_`X]`aba^a\\[aa`a	chr10.fa		3640869	F	36	119					
+HWUSI-EAS610	1	4	35	1014	1023	0	1	ACCCAGAGAGCTTGTCTCTAGCTGCATATGTAGCAG	a[a_a_aVZ^_aa_U_`aaXaS``_\X[aaVN_TYV	chr10.fa		3641484	R	36	28					
+HWUSI-EAS610	1	4	36	798	1186	0	1	TACATATGCAGCTAGAGACAAGCTCTCTGGGTACTG	aa^aa`aa`_a^\_X`]]^ZOV\[Z][]\]`WYWY`	chr10.fa		3641488	F	36	32					
+HWUSI-EAS610	1	4	51	1507	554	0	1	TGGAAACACTATCATAAAGAGCAGGAAGGAGGTTCT	aa]a``^a^_``__`_``\\Y\_[^Y_\W[YVT^^_	chr10.fa		3642916	F	36	119					
+HWUSI-EAS610	1	4	40	427	1701	0	1	TGAATTATCACCTGTTTCTGGTTAACTTTGCATTAA	a``aabbbbbbbbbabababb^bbaabbabb\baaa	chr10.fa		3643111	R	36	119					
+HWUSI-EAS610	1	4	34	877	421	0	1	TGATAGATGCCAATGGTGTTACATTTATTTTACATG	\\VZ^ba`ab_aa\aaZ_``R`_aa`a`aa____^a	chr10.fa		3643682	F	36	119					
+HWUSI-EAS610	1	4	75	518	1273	0	1	TTGAAAGATTGAGCTTACATGAGAACTCTGAATGGT	``b[XWa``a`X_aba`\a`a`Z\^``aaa]_`a[B	chr10.fa		3643762	F	36	114					
+HWUSI-EAS610	1	4	100	1569	1208	0	1	TTAAAACTCCTATGTGCCTGTTTCTGCTAAATACAT	aaaaaa`a__a`aa^__`aa_`a__`^^^^`_]^__	chr10.fa		3643897	R	36	119					
+HWUSI-EAS610	1	4	62	512	1721	0	1	GACTCTGGGCCCTTTCTGAAAGGAGCTCTTTGCTTT	S\a_b_`___b^^[OZS^XX_Y_a^X\_Q_\_\\UZ	chr10.fa		3644271	F	36	118					
+HWUSI-EAS610	1	4	63	552	844	0	1	TTCTGAAAGGAGCTCTTTGCTTTCCCTATACCAAGA	`a_aaaaU]`[a_`^a``_````^_]`^_`W[^_a^	chr10.fa		3644284	F	36	119					
+HWUSI-EAS610	1	4	95	332	94	0	1	TGCATGTGTACCTGATACAGGTGCTCATGCATGCAC	^babba_a]aa_]aa\ab`b`Pa_`_[Ya_ZR_\_U	chr10.fa		3645163	F	36	119					
+HWUSI-EAS610	1	4	45	1479	624	0	1	GGTGCTCATGCATGCACATTTGCATTTACATAGGGC	V__[ba`XS`a`PP_]X_`]^RR_aaa_TRWFSTR_	chr10.fa		3645182	F	36	117					
+HWUSI-EAS610	1	4	28	1746	1240	0	1	ATGTATGCCCTATGTAAATGCAAATGTGCATGCATG	ab^^WaaaaaYaa_^a`a^`_a_`X^^^a`UY^`^^	chr10.fa		3645188	R	36	119					
+HWUSI-EAS610	1	4	33	383	121	0	1	GCACTTGACATCAACTCCTGGTCTCCATATGCATGT	aaaaaaaaaaa``aa__``_`^]_`_`_aa]]`_`]	chr10.fa		3645254	R	36	119					
+HWUSI-EAS610	1	4	18	904	1587	0	1	TTGTTGTGAGGGAAACAGGACGCAATTAAGTTTTAA	a`a_aa_a]`a_^`_^`a`]_a_]]`_U]`^_____	chr10.fa		3646176	R	36	119					
+HWUSI-EAS610	1	4	87	433	566	0	1	GGTGTGAGCAGGTGCAGCTCAGGAAATAATCTATAT	aa^b```a``aa\`^`a`^]a_`Z^``][`_`a_^`	chr10.fa		3646307	R	36	119					
+HWUSI-EAS610	1	4	19	1669	141	0	1	TCTACAGGCACAATAAAAATGCTTGTCCAGTGTTAA	aaba`]WJ^__aaaaa`aa`a`_`W\]`[RW_\`a`	chr10.fa		3646457	F	19C16	82					
+HWUSI-EAS610	1	4	61	779	75	0	1	GAGTGAGAGTCCAGCATGGCAGCAAGAAGGCATCGT	_^b\b_]Y`Ua`^`aa`a_`a^Z`]^_`YU^_Y^aW	chr10.fa		3646774	R	36	119					
+HWUSI-EAS610	1	4	41	561	214	0	1	TTGTCACATGTCTAGGTTAGGGTGCTGGCTAGTTTT	aab]`a^\a`Y`]S_aT^]YaaL]HXbaVQHYI]\_	chr10.fa		3647551	F	2T33	78					
+HWUSI-EAS610	1	4	59	1778	191	0	1	TTAGGGTGCTGGCTAGTTTTGTGTCAACTTGACACA	abaa_`UV``XP`aYU\a`a`]NQa`\V\]NV^^Za	chr10.fa		3647567	F	36	20					
+HWUSI-EAS610	1	4	27	1722	1646	0	1	TGAGGGAAATAAACCCTTTCTTCCCTATGTTGGTCA	a`aaa``aa_a^_Z___``^`_`^[[^`[VVW]WZX	chr10.fa		3647909	F	36	53					
+HWUSI-EAS610	1	4	14	646	1041	0	1	AGAAACCAAGCATACATACAAATAAACAAAGATTTA	_a]aaaa_a`aaaa]W`a_`U_a\```__Wa`aa`a	chr10.fa		3648254	F	36	119					
+HWUSI-EAS610	1	4	69	655	520	0	1	TGATGCCTGTCCTCTCTCTCTCTGTGTATGATGCCT	aba`a_GZ]V]X^_a[_Yaa_W\bab_ba`aaaa`a	chr10.fa		3648430	F	36	118					
+HWUSI-EAS610	1	4	67	596	1750	0	1	AGGTCCCAGTTTGGGTCTGGGACACCTCCTTGGGTT	^Y`]aaa^a^`a`aa^aa`\a`]a`__`^``^`_\`	chr10.fa		3648693	F	36	119					
+HWUSI-EAS610	1	4	26	64	1778	0	1	TGTCGTAATTATAATTCCAATTCAAATTGAGCATTG	abVbb^aabb]bbababaV^abb``\bab_bbbbab	chr10.fa		3648864	F	36	119					
+HWUSI-EAS610	1	4	42	498	1008	0	1	AAGCATCATGGATCAAGTACTCAGAAGATAAATTGA	a`aa^aaaaaa_``aaa]a_a]Y_X`a`_^a^_a``	chr10.fa		3649904	R	36	119					
+HWUSI-EAS610	1	4	76	1529	892	0	1	TTTGCTTAAATTGCTATTTTTATTCAATCCCCTTTC	aba__aa___a`[\a`baa``Y``[]Na[V\]`]a_	chr10.fa		3650235	F	36	119					
+HWUSI-EAS610	1	4	82	1408	1545	0	1	GAAATTGCTGTGTAGTAAGGATGCTAGCCACACCCC	abbaaa_a^a_^^Z``^aa]a`a__a^^[a^a]^_\	chr10.fa		3650480	F	23A12	83					
+HWUSI-EAS610	1	4	58	960	686	0	1	CGGGGTGTGGCTAGCATCCTTACTACACAGCAATTT	aaabb___`_a`[X[a`V_a_`[`_][U`a[`__aa	chr10.fa		3650481	R	13T22	90					
+HWUSI-EAS610	1	4	23	565	1851	0	1	GTAGGAGGGAAAATATACTCAGATGGCCCTTTACCT	`^a`\Z`_V\a^Ya^__]Za`a__^T]\^`_WYYY\	chr10.fa		3650576	F	36	119					
+HWUSI-EAS610	1	4	18	1213	960	0	1	AATGGGTTCAGTGGTTAGCAGTTTGTTGCTCTTGCA	_]babb_a`ba`aaW\Ub`]`_baba`aa]__`a]X	chr10.fa		3650761	R	36	119					
+HWUSI-EAS610	1	4	52	442	767	0	1	ATTAGGAAGGCTGTGGGATTAAAATCTCTTCAGAGT	abb_ba]`bbabb_bbb\baaabaaabaaa`ab`b[	chr10.fa		3652053	F	36	119					
+HWUSI-EAS610	1	4	73	333	474	0	1	CTGGCAGGTCTGTATTGAGCAAGGAAGGTGACTGTT	`^aa`]aZ]_`_V`a`ZZ]Z[[_`[a`_N\[Z]aYY	chr10.fa		3652318	F	36	119					
+HWUSI-EAS610	1	4	67	1505	458	0	1	AAATCCAGAGTACAATTTCTAAAACTTTCGTGTCAT	a`]^a`\XXHTa]\\\\`_`a]Z]V[`^ZSXNQ]aZ	chr10.fa		3652754	R	36	118					
+HWUSI-EAS610	1	4	27	900	1300	0	1	ACGAAAGTTTTAGAAATTGTACTCTGGATTTCAGAG	a`ba_aa]aaa`a]a[`aa^__`_aaaY`a___a^a	chr10.fa		3652759	F	36	119					
+HWUSI-EAS610	1	4	100	941	1428	0	1	AAGCTGGATGCTGAAGAATGGCTCAACCTATGTTCA	]abYaXaYa_Ya_ZP^\aaa_aa_S_WW^W``]^]S	chr10.fa		3652922	F	36	119					
+HWUSI-EAS610	1	4	3	1752	1538	0	1	CTATGTTCATGTCCTTAGTCTGTGCAGAAGAGTTCT	]_X\\ZRR\\WZXIVU\__IY^Y]KWbYXZP`RUHZ	chr10.fa		3652949	F	36	116					
+HWUSI-EAS610	1	4	13	202	2029	0	1	TGTACTGATTCTGGTTCGAAATGCAAGCAAGAGCTC	H_baaS_bbb`\a`\aba\]^Saba`IV]X_J_O]b	chr10.fa		3653045	R	33T2	97					
+HWUSI-EAS610	1	4	27	913	1426	0	1	ACAGGCTCCTCTCATGCCTTTCAGCTGCATAGCACA	a__^aX^[Z`\\V[S]PZYa`\\YVRX\_\\^NV^\	chr10.fa		3653124	R	31C4	84					
+HWUSI-EAS610	1	4	45	1144	163	0	1	TTATCAATCACCTGGACTCACCCTTCCTCATCTGAC	ababa`aa^a]^_]XX^^^a]_^^[\W^V[^WZ^[V	chr10.fa		3653247	R	36	119					
+HWUSI-EAS610	1	4	26	995	1532	0	1	GCTAGGCTTATCAATCACCTGGACTCACCCTTCCTC	a_aaaa`_aaa_aaa`a__aaa^___`_W\_V^^`^	chr10.fa		3653254	R	36	119					
+HWUSI-EAS610	1	4	54	989	477	0	1	GACAGGCAACAGAAGCAGAAGAGATCTTGGTGGGAG	aaa^a_____aa_`aW\a_a`_a\\\_^_^S__\\`	chr10.fa		3653361	F	36	119					
+HWUSI-EAS610	1	4	89	1035	1875	0	1	TGTGTCCATGGAGATGGGGGAACCAGTGCTTGCCAT	`aa`]]a\_aa^ZZ_]a`Xaaa\Va\XVTWTU[^Y^	chr10.fa		3653414	R	36	119					
+HWUSI-EAS610	1	4	29	1488	281	0	1	GGACAGCTCTGAGTTTGCTCTACCTTGTGCTCACTC	G\\T`b`babTbYUYa``b`\WYbaZJLbaUb\H_a	chr10.fa		3653457	R	T26G5T2	77					
+HWUSI-EAS610	1	4	79	498	19	0	1	AGATCTGGGCATGCAGGGTATGTACAAGAGGAGGGG	aba`a^`_a`aaaa`aaa\_aa\_`_\^_`a]_W[U	chr10.fa		3653531	R	36	119					
+HWUSI-EAS610	1	4	83	366	303	0	1	GCCTGACAAAGCTTAAATAACCAGAAGTGTGCCTGT	aaaaaaa_ZZbaaaaaaaaa``aaaaaZa]a`__aW	chr10.fa		3653711	F	36	119					
+HWUSI-EAS610	1	4	83	522	260	0	1	ATCTACTTAGTGTTTACAAAAACAAAGCATACCTGA	`bbbbabbab_b_abbaaaabaa`aa]`aaa``aaa	chr10.fa		3654065	F	36	119					
+HWUSI-EAS610	1	4	23	178	1210	0	1	TCCTGAATGGATGAAAGGCCACTGTATCTACTTTCT	abbbbb\bbbbabb^\`abb`baba_babaabaaab	chr10.fa		3654104	F	36	119					
+HWUSI-EAS610	1	4	54	92	990	0	1	TCTCCACTGGGAATCTGCATAAGGTGATTAGACTCT	]bbbbbbbbab_\`bbabaa_Ta`\`babbbbbbb`	chr10.fa		3654250	R	36	119					
+HWUSI-EAS610	1	4	53	1566	655	0	1	TTAGCCATTTAGATATGACACAGATTGGCAGGAGGG	`a_]`^_`_a_W^``aa]_^_]QW^YNPX]Z_X^\Z	chr10.fa		3654833	F	36	118					
+HWUSI-EAS610	1	4	26	674	1154	0	1	GCAGGGTAGATGAAAGTGAGAGTATTATTGTTGCTT	aaaba]T\^^_a^Y\^Xa]a_aY_aa[``_]__X\a	chr10.fa		3655724	R	36	119					
+HWUSI-EAS610	1	4	61	1469	430	0	1	GGTATTCTCCAGCAACAGCAGGTACAAAATGTGAAT	Ya_``babXI]aV]]_[``b^[J]a_aY_YDDQaa_	chr10.fa		3655909	F	36	113					
+HWUSI-EAS610	1	4	37	1148	1052	0	1	CACGTGGCACATGCTATTGAACATGATGTTTCCTTT	`aaa^^`abaaa``a]`_]^^Vaa```aYaa`aaa_	chr10.fa		3655993	F	36	119					
+HWUSI-EAS610	1	4	35	818	1187	0	1	CGTGGCACATGCTATTGAACATGATGTTTCCTTTTA	_^]bbaa^aabaaaabbabaaba`aaaba\_aabaa	chr10.fa		3655995	F	36	119					
+HWUSI-EAS610	1	4	82	1500	982	0	1	AGAGCACAGTGAAGTTATTCCTTATGTATTTGTCTG	abaaabaab`abab[babbaaabaaa^_aa``_aaa	chr10.fa		3656081	F	36	119					
+HWUSI-EAS610	1	4	74	504	354	0	1	AGCAGACAAATACATAAGGAATAACTTCACTGTGCT	abaabaaa_aaa`aaaaaaaaaaa`a__aaaa[aaa	chr10.fa		3656083	R	36	119					
+HWUSI-EAS610	1	4	37	1438	1645	0	1	AGTGAAGTTATTCCTTATGTATTTGTCTGCTTGCTG	abbbb`a_`aab_abbaab_abbbaa_baaaaaU`a	chr10.fa		3656088	F	36	119					
+HWUSI-EAS610	1	4	66	802	1631	0	1	GGCTGAGTCTTGATACATCATTTCTCAATGTCTAAA	\`abbaa_aaaa``a_aa^_aaa\a^^a`a^_aa^a	chr10.fa		3656187	R	36	119					
+HWUSI-EAS610	1	4	44	1016	271	0	1	CATCATATAGAGAGACAGAGCAAGCAATGCAAGCTT	aa_`aXW\Ta`a\YaY]N_^OYa^[_]YaW][_MY`	chr10.fa		3656248	F	36	118					
+HWUSI-EAS610	1	4	71	1289	596	0	1	TGAGAAAAAGGACCATATAGTATTGAACACAGGCTT	`ZZYPZPQT^PVa[_aaV``M[a^TZ`TLYPRLU`^	chr10.fa		3656852	F	36	117					
+HWUSI-EAS610	1	4	58	1175	1992	0	1	TATACTAGTAACTCTGGCTAGAAGGTTCATTTGTAT	aaa`\aa`^``][^a_]`a_`Y^__VXX^`^`]]`_	chr10.fa		3656924	R	36	119					
+HWUSI-EAS610	1	4	5	45	1976	0	1	GTGATGTCCGATCCACAGACTCTCCCACAGGTCATA	`ZaaaaU_a]SO\^_^[VRRURTW\\BBBBBBBBBB	chr10.fa		3658183	R	27A8	73					
+HWUSI-EAS610	1	4	11	619	2043	0	1	ACCAAAGTCTTTCCAGTCTTCTCCAAAGGAGTCAAG	]``_`^YS^Z[V^aa[U_W\WX`_``[``a_N]_XZ	chr10.fa		3658304	R	36	118					
+HWUSI-EAS610	1	4	10	1047	868	0	1	TAAAGTACTAGCTTTTTCAGCTGGCTCATCAGAGAC	`]_[a_a_``aY^aX`_`a_^`aa[]__^^^_^_^^	chr10.fa		3658870	F	36	119					
+HWUSI-EAS610	1	4	45	263	1450	0	1	TCTGTGTCTGTCCTGTGTGCTCGTCACTGCTGGCTT	[abb`bZ\]]]]\`^Z\O]^^][_Z\`T`_ZV\Z`Z	chr10.fa		3660145	F	36	119					
+HWUSI-EAS610	1	4	99	1529	1568	0	1	ATAAACTCAGGCAAAGGGGAAGGAAATGGCACATTG	aaab`\aZV`a_^aa^^ab]aXZ_aa`Z```UY\aa	chr10.fa		3660292	F	36	119					
+HWUSI-EAS610	1	4	23	496	189	0	1	GACTGTTCCAGCTGTGCCACAGTATTATCTACCAGT	`bUa`[`_a_``[NYQG_YYI_W^_``_Z]_BBBBB	chr10.fa		3660785	R	34C1	93					
+HWUSI-EAS610	1	4	4	1648	1347	0	1	CTGTAAGACAATATGTGAGACACAAATGGTTCCCAC	aaaabaa``aaa_`a_a``a`a``a`^__Z]`^___	chr10.fa		3660986	R	36	119					
+HWUSI-EAS610	1	4	49	1206	329	0	1	ACAGTCGCCAGGGCTTTTGTCCTCTGTAGTAGCATG	aa_`_a`aa[U`aa_```____a^^V\PTPUPZ[S\	chr10.fa		3661018	F	36	118					
+HWUSI-EAS610	1	4	52	409	1737	0	1	ATGTAAGCCTCCATTCAATCTGCTTGCAGAGCCTAC	_aba``^``babbbaaaaaaaabbaaaaa```aaaa	chr10.fa		3661190	F	36	119					
+HWUSI-EAS610	1	4	34	766	1524	0	1	AAATTTTAATATGTTAAAAGTACACATATTTTCCCA	`S]___Ya][][aV_aZ^]_Z_X]N___X^USTTS]	chr10.fa		3661265	R	36	118					
+HWUSI-EAS610	1	4	51	570	1209	0	1	TTATCTCCCAAATAACACATACATGCATATGGGAGG	a__`aaaaaab_aa[`baaa`__aa_\a_aaa`]`a	chr10.fa		3661508	R	28G7	83					
+HWUSI-EAS610	1	4	64	1076	580	0	1	ATGTAATCACTGCAGCTCACTCTCTCATGGAATGGA	]b`]\Y^aW_aYabZXb```]`]aa\Y`_^]`]aa`	chr10.fa		3661577	R	36	119					
+HWUSI-EAS610	1	4	8	429	1038	0	1	ATAAGCATAGACACAGAGGTCATCCTCGGGGAGATA	^_VabVYV^YN_`aaaY^^Ua`]ZFYX[^ZXWaW__	chr10.fa		3661656	F	36	117					
+HWUSI-EAS610	1	4	89	1354	764	0	1	AGCATACTCTTAAGCACTGAGCCTAAATCACAATTT	]\_aaa_aba`[_V]``a`aa_aa`a[aaa_`_`aa	chr10.fa		3661784	R	36	119					
+HWUSI-EAS610	1	4	26	838	1339	0	1	CACATTTGATTATTTTAAAATTTAGTTACATGTGTA	a_]ababbaaaaaaba_a`abb`aa`a`_aaa`a^]	chr10.fa		3661978	R	36	119					
+HWUSI-EAS610	1	4	7	1530	253	0	1	AGGTAATGGCACTATTTGGAGGTGTGGCCTTGTTGA	`bbY`a`Y`^_[`__aa___YaU_U[T___]]]_Z`	chr10.fa		3662036	F	36	10					
+HWUSI-EAS610	1	4	53	287	278	0	1	GGAGAAGGCTGGCTTCCACGCAGTTAGGATGAGGGT	a`aaZ`aY]aaa]^a]aa`a`Z`\`a`a]_Y`^^]T	chr10.fa		3662105	R	36	27					
+HWUSI-EAS610	1	4	59	562	940	0	1	GAGATTTATCTCCCTCTATAATCCAATACCTTCCAA	a_`W_aa_a___^_a`aa`^``_`_^`_]]_]]^`_	chr10.fa		3662566	R	36	119					
+HWUSI-EAS610	1	4	25	682	78	0	1	AGTTGGGGCAGTCATAGGTTGGCCATTCCATCAATC	abababaa[aa]aaa\UaL\R`[]\_a]aWXY]`a^	chr10.fa		3663468	R	36	30					
+HWUSI-EAS610	1	4	15	987	99	0	1	AACTTGAGACCCATTCCATGGAAGAGAGCTAACACT	aa_aaa`_a____a`__aaa_^a__^X_^X_`W_]`	chr10.fa		3663500	F	36	49					
+HWUSI-EAS610	1	4	56	475	457	0	1	GTGTCAGTGTTAGCTCTCTTCCATGGAATGGGTCTC	``a]]``[a_^^`[__^^`a`a_Y\_\_\`]_W]Z[	chr10.fa		3663505	R	36	119					
+HWUSI-EAS610	1	4	49	151	155	0	1	AAGGGAGTTCAGAGGCAGGCAACATGGTTAAAGAGA	HZX__Q\\_aZ_\]Y_\`_a\[__`_^]___]YZ^[	chr10.fa		3663879	R	36	118					
+HWUSI-EAS610	1	4	61	797	814	0	1	AACCATGTTGCCTGCCTCTGAACTCCCTTTTCCTAG	a_aaa`^LYHVP\]_U[aZUWPQRP\]SVYX\UY``	chr10.fa		3663886	F	36	117					
+HWUSI-EAS610	1	4	50	1036	366	0	1	GGAGTAAACAGATTCCAGGGAGAAGGGAGAATGCTC	aa^`^a^VZ`[Y``_[_`a_Za`\^^]``_^[YW`Z	chr10.fa		3664577	R	36	119					
+HWUSI-EAS610	1	4	16	474	1491	0	1	TGGCCAACTCTTCAAACAAGGCAGTTAAGCCAACGT	abab`bbaabbab``]`_Z_aaaa\```aa_abXXX	chr10.fa		3665510	R	36	119					
+HWUSI-EAS610	1	4	57	1163	1318	0	1	GATGTGGAATTGATCAAAATGAGTGACTAAAAGATG	`[`^^aa^aaaa_`^``^[a`^aY[[Ya\Y]_a_^`	chr10.fa		3666748	F	36	119					
+HWUSI-EAS610	1	4	18	1750	1001	0	1	TGGGGCATTTTGTAGCCTCTGTGCTAAGGAACAGTA	aaa_^aaaaabUX`]``aaaa]_^^Z]X_^_X]]QT	chr10.fa		3666914	F	36	119					
+HWUSI-EAS610	1	4	48	1140	1075	0	1	AAATAAGGATAAGAAATACAATAAACAGATTATCAG	abbb\]a`^aX\_`abbaa_]aaa_Y^aa\aaa_]a	chr10.fa		3667128	R	36	119					
+HWUSI-EAS610	1	4	94	456	549	0	1	ACACCTATAGGGTTGCAGACCCCTTCAACTCCTTGG	aa``aa_a`a_`S_a``[a__`\`_^_\V_X\__\V	chr10.fa		3667399	F	36	5					
+HWUSI-EAS610	1	4	52	129	1865	0	1	AGACTGCCCCACCCGGGAATCCAACCCATAATCAGC	`aZbaababaZbbba``_WXa_aaaa``a`]Xaa^a	chr10.fa		3667604	R	36	13					
+HWUSI-EAS610	1	4	35	626	503	0	1	TGTGTGTCTTTAATAGAGCCCTGAAAAGAAACTATT	ab^baaabbbbbaababbb^bbbaabaabbb_abaa	chr10.fa		3668349	F	31G4	83					
+HWUSI-EAS610	1	4	49	181	160	0	1	CAGTCATGACAATTCCAACAAACAGAAAGCACTGAG	^R^^`abbab``aaaa`]aa_aaaaX_ba]```a_`	chr10.fa		3668389	F	3A15C16	46					
+HWUSI-EAS610	1	4	45	438	1660	0	1	CAACAAACAGAAAGCACTGAGGCTTGGCAGGCACAG	aaXa^^a^]^`aa_````_`Z_`\\\\VUY[SSPKZ	chr10.fa		3668404	F	4C31	83					
+HWUSI-EAS610	1	4	9	329	1572	0	1	ACAGAAAGCACTGAGGCTTGGCAGGCACAGTCCACA	aaaa]`baba_aa^aaa_`\aaYZ`^HVa[S[a^]\	chr10.fa		3668410	F	36	118					
+HWUSI-EAS610	1	4	13	1032	1624	0	1	TTATTAGAGAGCTCTTTGGTAAAGTTTTCTTCCTCA	aa]\^aUSW^bbaV^bbV_H_b`^PVISW^_OS`ST	chr10.fa		3668548	F	31T4	97					
+HWUSI-EAS610	1	4	45	377	1545	0	1	CATTTGGACACCTGAGGCCAATGTTTAACTTGTCAT	aVbbba]aaabbab\aaaa]a]^a`aaa_``a_aa`	chr10.fa		3668864	F	36	119					
+HWUSI-EAS610	1	4	35	1308	1216	0	1	AATGGTTAAAATCACTTGTCCTCACTCCTGATGACC	abbba]baa`a`a`^^aa\MT^a`Ya^_aa_aa_]`	chr10.fa		3669140	R	36	119					
+HWUSI-EAS610	1	4	73	495	858	0	1	GGAATTATACAAATTAGAATGGCCTAAAAACATGGT	a_]Y``a_`__a__]^^a`SZ]_\]`^ZU]]^^\VB	chr10.fa		3670360	R	36	114					
+HWUSI-EAS610	1	4	31	373	1337	0	1	GAAGATAGTAATAGGGACTGTGGTGTGGGAAGACCC	aX\`Y\Y_QY\^```[^_a`[^^VaT\]ZS]_`UNZ	chr10.fa		3671508	F	26C9	86					
+HWUSI-EAS610	1	4	55	1748	1896	0	1	TAGGTTTGGCTATATAGCCAGATATCAACCTGGGAC	aY_`Qa`_[__aaY^Y_VX[XY`ZUHVWQW\SSBBB	chr10.fa		3671633	R	36	105					
+HWUSI-EAS610	1	4	36	136	651	0	1	CAACTTTTAGGTTTGGCTATATAGCCAGATATCAAC	`NYaaaaaa_aW`^a`b`X\O[[`^```__`_`][a	chr10.fa		3671640	R	36	119					
+HWUSI-EAS610	1	4	16	1722	1233	0	1	ATAAGTGGTTTTGATTTTTATTAAGGATTGTGTAAC	aba^`_baYaaaa_WaabaabaaaVV`a`WQNZ_a`	chr10.fa		3671712	F	36	119					
+HWUSI-EAS610	1	4	28	765	1877	0	1	AAAGACACACGGCCGTTCCCTAATCCATCCAAGAAT	`aba_ab_aaaWVaa`__X`Z][]^^Z__^PUZ[_X	chr10.fa		3671798	F	36	119					
+HWUSI-EAS610	1	4	71	7	828	0	1	TTTCATTAGTTACCATGCTGGTTGACCTGCTGGAAG	aaabbbb`b_a`abb_abab^``_]_b]bb_aaVV_	chr10.fa		3671939	R	18C17	81					
+HWUSI-EAS610	1	4	56	597	784	0	1	GAGACATGGAATGTTTCATAAACTCAACCAAGTGTG	aaba[W]aaa__aaaaa`abaa``]`a^^`a`Z`\_	chr10.fa		3672059	R	36	119					
+HWUSI-EAS610	1	4	84	1228	1588	0	1	GAGAATGAGGGAGCTGTTTGTCTCATGGAAGGACAC	]]aZX_]aa]a_a[aaaabb_`a[`aaa]`aa_`a_	chr10.fa		3672290	R	36	119					
+HWUSI-EAS610	1	4	14	295	1122	0	1	CTACCCCTGAGATTGCCCAAGATTGGGAATTGAAAT	[`Y``_`VX````b_a`a`^^^a^RXaQ\Y`aaXZa	chr10.fa		3672690	R	36	119					
+HWUSI-EAS610	1	4	93	968	277	0	1	TAACACCCACCTACCCCTGAGATTGCCCAAGATTGG	a]^PSENT\VZ__M_UW^aV`a^PQOFV__aS[U]]	chr10.fa		3672700	R	36	115					
+HWUSI-EAS610	1	4	12	952	1802	0	1	ACAGCAGTGACCCTGGTGTGATAAACTATGTGAACA	a_aa^a_aa`__aaaa]``a^`a`a__`a`__`___	chr10.fa		3672878	F	36	119					
+HWUSI-EAS610	1	4	62	156	285	0	1	TGTCAGGTGGGTCACACCAATCCACTCATTTATGTG	abaa]abab\SUbbbUa`U^aaaaa_Y]abab_b^b	chr10.fa		3673706	R	9T26	86					
+HWUSI-EAS610	1	4	76	735	1897	0	1	GCCAGGTCAGTGAGTGCTTGGATCTTCCTGCCTTCA	`abbaaaabb^aZa_aa_aaaaa_a^``aa_``aaa	chr10.fa		3673759	R	36	119					
+HWUSI-EAS610	1	4	57	517	1058	0	1	AGGTTGAGTGAAAAGCAATGTACATAGATTGTGGTT	Jaaaaa``aT[`\abbbbbb`abbb_bbbbbbbb`b	chr10.fa		3674029	F	36	118					
+HWUSI-EAS610	1	4	46	199	423	0	1	GTCATTGGGCAGAGCTTGCTGAAAATATTATTATGG	`ab_aaaa[_]`aabb`aaaa_Wa^a`a`baaba`a	chr10.fa		3674224	R	35A	81					
+HWUSI-EAS610	1	4	61	824	162	0	1	TTGTGGTGACTTGGGGTTCTTGCTTGGTTGATCCCC	aaaa`_\`a\`^^`__U__```\____\`_W_\WW\	chr10.fa		3674463	F	9T26	86					
+HWUSI-EAS610	1	4	15	1685	633	0	1	AAGTATAAAGTCAGCAATTCCTTCAAATAAAGTCAA	aa_W`_^__MV]_]]_Y^^_^[][a_^^^]^[[Z]^	chr10.fa		3675414	R	36	119					
+HWUSI-EAS610	1	4	61	925	1069	0	1	GAACTACAATATCAACAAACCAAATCCCCAACTCCC	a^a^ba`a[aaaaaa``a_[_`a___a`^_a^`___	chr10.fa		3676462	F	25T10	83					
+HWUSI-EAS610	1	4	79	893	454	0	1	GGTTTCCCTTCTGGAACCCCTCTCTTCCATCCCCTT	`bbbb`aab_]]ba``XJUR_KZQa`ZPR`TVPXaa	chr10.fa		3676714	R	36	117					
+HWUSI-EAS610	1	4	75	748	1259	0	1	ATTAAATAGCTTCCAGTTTAGTACTTTTGCAGGACT	^T_a^a_NVN]YXO]WQ_VZ^UTV`aa^b`XYZOYT	chr10.fa		3677266	R	36	118					
+HWUSI-EAS610	1	4	21	389	63	0	1	TAGGGATCTGTACCAGGTCTTCTGCATATACATTAA	[b_I\_Yaaba]aa[_YFUFZ^W[YVSUOT``aXYT	chr10.fa		3677297	R	36	115					
+HWUSI-EAS610	1	4	27	596	468	0	1	ACCAGGAGAACAAGGCCCTCTAAAACAACTGAGCAA	aa`aaa``_a___^]`_`____`_____``Z^`_]Z	chr10.fa		3677379	R	36	31					
+HWUSI-EAS610	1	4	84	904	1880	0	1	AGTCTCCCACTCTTATTGTCTGATGTGTAATATGTG	^[V_]_Z[_a`Y^[FV\YX]]a_a`Z^[`_^_[YXB	chr10.fa		3678035	R	11A24	41					
+HWUSI-EAS610	1	4	47	1730	183	0	1	TCATAAGGGAAATTTGTCTGAAGATTTCTATCTTTG	a_b`a^TVNUa_aa`V\_`^\_TW`__^a^_]`_a\	chr10.fa		3679183	R	36	18					
+HWUSI-EAS610	1	4	13	1404	481	0	1	GTAGAGGTCCTTGGTATTGGGAAGATCATATGTCCC	aYaZ_aYYa__]]_^^aa_a^`^X`_^`__^_X^]^	chr10.fa		3680187	F	36	28					
+HWUSI-EAS610	1	4	19	782	618	0	1	TGAACATGGTTCAACACGTGTTCCTGTAAGAGAAGC	``[aa`b`WSbYUa`aaaaa`ba]_[WL_a]`__a_	chr10.fa		3681533	F	36	118					
+HWUSI-EAS610	1	4	24	1635	1880	0	1	GCAATGGGGAAAGAGATAGAATCAGAGTTAACTCAG	\P_Y_``Za_`_a]`ZN`b]``aaaYaR`^aZ]Y^a	chr10.fa		3682176	R	36	118					
+HWUSI-EAS610	1	4	61	608	708	0	1	AAGTCTATTCGTCTCATCATTTTTACTCAAATTTCC	YU\\_a[b\SWYS\VO^_^_Z]_]\UMXZ\TYT[[B	chr10.fa		3682753	R	36	114					
+HWUSI-EAS610	1	4	44	1178	918	0	1	GTCTATGGAACGTCCTTCCTGATCTTAGTTTCTTGG	`aabaabbaa```_^`a`aaa^a_a`]a^``^`a_a	chr10.fa		3682873	F	36	119					
+HWUSI-EAS610	1	4	76	1260	1351	0	1	AGAAAAACTACCAAGTTCATCCAAAGTGAATGGAAA	`]J]YQ\_]M_V_Xa\R[ab]R_\VaXX]]`[\F]a	chr10.fa		3683352	R	36	117					
+HWUSI-EAS610	1	4	80	1038	246	0	1	TCTCCTGATGCATCTAACTGTTTACTGCTTTGTTGC	aZa_a`_OS_Sb```VRRaa__Va[[Wa_W____``	chr10.fa		3683473	F	36	118					
+HWUSI-EAS610	1	4	55	1249	1296	0	1	GCTTCTGTTTAACTTTAGGCAACAAAGCAGTAAACA	aaaa`aaaaa_a_`aaaaaaaa__a]`^__Ya^a^_	chr10.fa		3683491	R	36	119					
+HWUSI-EAS610	1	4	17	786	1817	0	1	ATGTTGTGATGGTTTGTATATGCTTAGCCCAGGGAG	`b`b\_T`_ab_`a_a_a`Z^X]`V`]XTa]a^OVV	chr10.fa		3683587	F	36	25					
+HWUSI-EAS610	1	4	64	1573	2039	0	1	AATTTGTTATGGAGACACATACTTTTCTGAGTTATG	X``bVYZb`aYN\H[]YSX^_X`R[[HV]JZGO`Q\	chr10.fa		3684270	F	28A7	82					
+HWUSI-EAS610	1	4	87	577	1842	0	1	TGAGTTATGTAATGAGATGGTGAATTTATTCTACTG	ab`babaab_aaabaaaabaY`K`abaaaaa`a`aa	chr10.fa		3684297	F	1A34	80					
+HWUSI-EAS610	1	4	92	211	1512	0	1	TGACTACTAAAACTGATTTTTCAAGACTCTTCTATG	ababX\_Y\_^abaa`\^]`aa^^ZK_Ya`^^\]aa	chr10.fa		3685105	R	36	118					
+HWUSI-EAS610	1	4	92	1102	1548	0	1	GTAGTGTGTTAGGGTGTGGGGTGTGTATGTGGTGTG	a^`b^aZa]a`aa^Q^`bbbaPa^a_[`aV`_S_Za	chr10.fa		3692010	R	36	119					
+HWUSI-EAS610	1	4	22	877	1354	0	1	CTTTATTTGGGTTGTGTCACAAGACATAGGTCATAA	abababbb`aa_baab_aba^^`__ab_ba^`aaab	chr10.fa		3692121	F	34G1	81					
+HWUSI-EAS610	1	4	13	1262	867	0	1	AAAATCATCTAAGACTNTTTAATCAACCTACTCCTG	aaa`a^`````_``^YD[`a`a`^_`[^_^[_][_`	chr10.fa		3692984	R	16A19	110					
+HWUSI-EAS610	1	4	69	850	483	0	1	AGAAGAAAAGTTCTTCCCTTGGTCACTTTGGTCTAT	abb`__b``_``a`^\^`ba^VUWa_`Y^]]]ab`a	chr10.fa		3693523	R	36	119					
+HWUSI-EAS610	1	4	81	858	1716	0	1	GGGAACCACTGACAGAGGGAAGGAGAGGAGGAGAAA	a_WXaQ^^^_Z^TR_[`]]\\ZRQ_X[]Ya`Q\YZT	chr10.fa		3694107	F	36	118					
+HWUSI-EAS610	1	4	29	1120	1454	0	1	AGAGAAAGGGAGAGAGGGAAAGGACATTTCAGATCA	`babaa]_bb`\\^^bbb]_a``aaX`a`ZabY`Y`	chr10.fa		3694142	F	36	119					
+HWUSI-EAS610	1	4	20	832	112	0	1	ATGGTTTGTTTAGGCTGCTTTCTTATAGAACACAGG	a[a^O\^]ZZOGNGOUOOSWUUOWUUSXWIXGZIOZ	chr10.fa		3694640	R	13C17C4	16					
+HWUSI-EAS610	1	4	86	342	126	0	1	TACTAAACCTTCTCATTTCCCCATAGCATGGCATGC	aaaaaa````a[a_``Y]`_a_`]a_a]_aa_[_a`	chr10.fa		3695012	F	36	119					
+HWUSI-EAS610	1	4	86	1729	989	0	1	GTAGGTGTGTCTTCTCCCACTGAGGCCAGATCAGGC	]Y_]]Z`]aaaaaa`aaaaaa`aUX`aa[`^_``[Z	chr10.fa		3695476	F	36	48					
+HWUSI-EAS610	1	4	69	1544	476	0	1	TGAAAGAGTCAGATGTAGATACACCTAACCAATCGA	aabaa^_O\`aaa__`a_a`aaa_[`aa^`_a___`	chr10.fa		3695693	R	36	46					
+HWUSI-EAS610	1	4	33	942	541	0	1	AGGTCCCTCACTCTGAGTCCTGAACATCTTTCACTC	aaa\^_`a]_a_\```a__^aa\_\^___`^\_^``	chr10.fa		3696347	F	36	65					
+HWUSI-EAS610	1	4	50	1518	1814	0	1	TCTGAGTCCTGAACATCTTTCACTCCCCAGCTCTGT	aaa[^a]]_`_\[\`a\_`_Z\_\\Z]\\WWWY]BB	chr10.fa		3696358	F	36	110					
+HWUSI-EAS610	1	4	95	1529	1023	0	1	GGGTGGGAGAGGGAACAGGGAAAAGAAAGGGGGAAC	]_VQXR_\aX]^_ZZa`Z]`][OT\OPK_[`]\ZZB	chr10.fa		3696510	R	36	114					
+HWUSI-EAS610	1	4	49	1291	231	0	1	TAGATTTTATACAGAGCTATTGGAACATGTCTTTCC	a`a^a^aa`XX\V[XZ[_]W\[GS`]WYWSWZ^Y^V	chr10.fa		3697984	R	36	118					
+HWUSI-EAS610	1	4	79	216	1042	0	1	AATCAGCAAAATGACAATGCAAGGACACCCTGGTAT	_Q_baaa`^]_aa`aa]_`a[^a_]`a``a`aaX[_	chr10.fa		3698946	F	36	119					
+HWUSI-EAS610	1	4	75	1567	1269	0	1	ATGGCATTCCCTTGTACTGGGGCATATGATCTTCCC	aaa_aaaUa``aa`U_a_a]\]`_`a[XY]``_``_	chr10.fa		3699922	F	36	9					
+HWUSI-EAS610	1	4	27	1055	981	0	1	GCTCGGTGGGTTATTGGTTAGTTCATATCCTTGTTC	``__]aS_`aZ_Y^]_`V`^`SVS_^\WW^]]_Y]]	chr10.fa		3700031	F	36	119					
+HWUSI-EAS610	1	4	68	1057	1965	0	1	AGAAAATGGAATAAAGCCTTGACTATATGGGCACAG	aaa`aaa\a`_aa_aa^`aaaa]a`a```]]]_^__	chr10.fa		3701328	R	36	119					
+HWUSI-EAS610	1	4	65	1518	1735	0	1	AAGCAATCCCACTAAAATAAGGCTGCCCACTTTCTC	a_`]ZNX]Z_^L\_`\Y\`VX]__\PU^XOJV^UYS	chr10.fa		3702302	R	36	23					
+HWUSI-EAS610	1	4	49	1272	1765	0	1	GACTCCTCGGAGGGCAGGCTGCACGGGTGATGGTGT	`aaa`aaaa`TSYaaaaaaaaa`\`aaSa__a`X_B	chr10.fa		3708456	R	36	8					
+HWUSI-EAS610	1	4	25	357	1659	0	1	TTGCTCTGCATTTTATTATTTCCTGCCCTCTACTTC	a]aa__aa[G^bba``^^_`a`ba`b`aba`a`^`a	chr10.fa		3709189	F	34C1	81					
+HWUSI-EAS610	1	4	40	385	1825	0	1	TTGCTCTGCATTTTATTATTTCCTGCCCTCTACTTC	U]][XT`^`\_[[`^_^[_`bbb`^]]_^^aa_Sab	chr10.fa		3709189	F	34C1	81					
+HWUSI-EAS610	1	4	93	664	653	0	1	ATAACAGTAATAGGAGGGGTGATAGATCTAGATTAC	ab_`aaaaaab]ba`abbbabaaaa^aaaa`aaaaa	chr10.fa		3710868	R	36	65					
+HWUSI-EAS610	1	4	46	896	440	0	1	CTGGTATGACCAAGCTCCTGCTATCCTGGGATCCTG	_bbb`babbbbabbaab`aabbabaa_``]X``aba	chr10.fa		3712239	F	36	32					
+HWUSI-EAS610	1	4	17	98	1729	0	1	CAACCAGGATCTTAGGATAACAGGATCCCAGGATAG	a][abb`Z_Ra]G]``aVLM\]_ZPRaa]X_\XTH^	chr10.fa		3712259	R	36	13					
+HWUSI-EAS610	1	4	30	669	452	0	1	ACAACATTGGTTCCAATCCAATCACCCGGGACCTGA	aa_`]]`_^Y[]`a``_]]]]]W\\`]_\]_XY\VV	chr10.fa		3712618	R	36	53					
+HWUSI-EAS610	1	4	57	343	1505	0	1	TGTAATACTCCCTCCTGGAGAGAGGATGAAAGAGCC	ab_bbaaa`aaaaa__aaSaWaZX^__[_`_WZ_S\	chr10.fa		3712903	F	36	119					
+HWUSI-EAS610	1	4	10	830	746	0	1	GAGTGATGGCTCACCCAAGTATGGGCGGGAACTGAC	``Wa]a_X^]_^aPRZ]^^VV\TLX\]BBBBBBBBB	chr10.fa		3713104	R	28T4C2	74					
+HWUSI-EAS610	1	4	24	1609	970	0	1	AATGCTAGCCTGGTGGACCACTGAAGTCATTGATAT	a`a`_X\__aW^_R`\\Y`^^_Y][PZ__V[[W^_^	chr10.fa		3713155	R	36	119					
+HWUSI-EAS610	1	4	76	1315	753	0	1	AAAAACAGAGGGAGAGAATGGGGAATGAGGGCAGGC	abbaaababa`aa]baba`aaa_^Xa``^``_`_aa	chr10.fa		3713687	F	36	119					
+HWUSI-EAS610	1	4	19	55	1428	0	1	ATGTACCTTGACCCTGCTATTGTAACCTGACTGGCT	aUa\_`VQVaSaaaJ__]X_^^N^U`ZRVZ`I_[ZB	chr10.fa		3713920	R	36	16					
+HWUSI-EAS610	1	4	64	1193	186	0	1	ATTCCGCAGAGAATAGATAGCTTAGCCATCCTGTTC	a_\N]YY`]`Z_a\_[Z\Z[PS^\S[Y^ZRVVSYXB	chr10.fa		3713972	F	36	34					
+HWUSI-EAS610	1	4	10	1666	955	0	1	TGCAGGAACTGAACATGAGGACAAAACCACCTGATG	aaaaa__a``_`a_a```__``aa_`___^_^Z^[U	chr10.fa		3714007	R	36	63					
+HWUSI-EAS610	1	4	55	445	1435	0	1	AACTTGCCTACCCATGTAGAAATTCCCCATGCTTGC	abaa``aaaa`_``aa]aa_a_a`_^_Z___^_^^\	chr10.fa		3714075	F	36	119					
+HWUSI-EAS610	1	4	28	361	1284	0	1	GGTGTGCGCCTCTTTTCTTTATTTAGACAGCAATAG	aa_b_aaaaaba`aaaaaaaaa`a_aaaa`aaaaaa	chr10.fa		3715518	R	36	119					
+HWUSI-EAS610	1	4	21	1252	1824	0	1	ACCTCAACACTTCTTCAGCTCAACTGAACTTTAGCC	a`^a_^`_\_aaaaaaaaa`Y]aOaa]]^`a_a_Q\	chr10.fa		3715566	R	36	119					
+HWUSI-EAS610	1	4	45	1778	1283	0	1	CACACACACACACTCAAGTGTCTCCTAACAAAGAAT	ab_aaaa\IQUU]XHTYOQY^U\\_]\Z_`_^XNTZ	chr10.fa		3715602	R	26G9	84					
+HWUSI-EAS610	1	4	4	899	270	0	1	ACAGATTTTGTTTAAGCTTACAATATATCCTTGAAA	`]^bWa\Sa_WUa`_aa`^`a^_aaaZZ`]aaaW__	chr10.fa		3716549	R	36	119					
+HWUSI-EAS610	1	4	56	154	1707	0	1	ACATGCTGTTTGCCTTGATGAGTAAAGAGAATAGGT	Z_[aabb_^_a^aaab_\]a]a]``_^_`Y`a`a_\	chr10.fa		3723117	R	36	119					
+HWUSI-EAS610	1	4	9	859	1111	0	1	TATAAGACTCCTCACAGTCCTTCAGAGATGCTCCAT	abbaaaaaaaaaaaaaa`aaba`aaaa__a`^__^S	chr10.fa		3723775	F	36	119					
+HWUSI-EAS610	1	4	82	1097	616	0	1	GGTTTCTCTCTTTCCATGTGATTCCAGGTTTCAGTT	aa_aaaa`]_`aa____^^]`^_a]`^VX`a]`aZ`	chr10.fa		3723821	R	36	119					
+HWUSI-EAS610	1	4	24	371	1300	0	1	TGAGACTTTTTTAAAACTCTTTTTGGCTCTTGGGAC	T_a`a^Zb^`[a_R[Y_aab`a^`bbba^a\UY__a	chr10.fa		3724441	F	11A24	81					
+HWUSI-EAS610	1	4	3	291	1388	0	1	AGTAAGAAAGTTATTATTCATGAGGTGGGCAGCATG	abaaabbbbb_bbbabaaaaaaaba]bababaaaab	chr10.fa		3724725	F	36	119					
+HWUSI-EAS610	1	4	36	592	1913	0	1	TGTTTTTTTCCCTATGGTGAGCTATTAGATTTCCCA	a_]_aabbaaaa^aaaa^`X_^aaaa_Y]`^][]a_	chr10.fa		3725073	F	36	119					
+HWUSI-EAS610	1	4	53	1183	1377	0	1	GGATGGTGAGGCTGAAGCAGATACTGTTAGGTAGAA	``abbb^^aaa^aa`ab_Y``_`_aaa``a^SY\_`	chr10.fa		3725762	R	36	119					
+HWUSI-EAS610	1	4	18	521	1873	0	1	GCTAGCACCATCACCATTTGAGACATAGAGATGTCA	a]]baabaaaaaaaaa``_a`_`a`a_`[WR_a^``	chr10.fa		3726190	R	36	119					
+HWUSI-EAS610	1	4	31	866	487	0	1	ACAAAAGGTTCCTCTGCAGCTAGCACCATCACCATT	a`baaaaa]a``a`aa^^`_aa__aaaa__a_^aa`	chr10.fa		3726208	R	36	119					
+HWUSI-EAS610	1	4	18	451	2038	0	1	AGTCTACAAAGCTAAATGTCTTAGTTGGTTTTCCAC	aZL]Y_`baR]]TaaXSaUZS_RVab^b[YTXTaUR	chr10.fa		3726771	F	36	118					
+HWUSI-EAS610	1	4	94	203	1089	0	1	ATTAAGCAGCTCTGCATTTCTGATGGCATTAATATG	aabb_aaabaaaaaa`aaaa`a`_aaa_a`_`a__a	chr10.fa		3727428	R	36	119					
+HWUSI-EAS610	1	4	93	182	1198	0	1	CTGCAATTTTGCTTTATGGGCAATGTCAACATGCCC	aWRGOXV_`\YaWNVZS^_S_\TTSZYO[`[RWRW\	chr10.fa		3727702	R	3A32	106					
+HWUSI-EAS610	1	4	9	1418	1839	0	1	GGAAGAGAACAAACTGCTTTGGGGACTTTAACACCA	^`^Y^]`^`RW_SQO___UV^^]_VW[Y_VTFXX^\	chr10.fa		3727899	R	36	117					
+HWUSI-EAS610	1	4	24	943	525	0	1	TATTTTCATATGCTATAAACTCATCTATTATAACAA	a_XNVaWY]RW]RZVa_PTPSHRPTWVPQQ[^\RTa	chr10.fa		3728506	F	36	117					
+HWUSI-EAS610	1	4	77	1657	707	0	1	TATTTTCATATGCTATAAACTCATCTATTATAACAA	a_aa_\[aQTaP^_^_Z_a__]]^`[W_V^]Ya]a^	chr10.fa		3728506	F	36	119					
+HWUSI-EAS610	1	4	88	442	132	0	1	ATGTCAATCATGGGAGCTGCACTATTGGACAGTTAG	aab_a`aaaabbaa]`a_aa__a_`a`__`aa]`^a	chr10.fa		3728620	R	36	119					
+HWUSI-EAS610	1	4	44	1510	167	0	1	TGATTGACATTGCTATTGATCACAAAGACAACATCT	`a`aaU`_a][W_aaaa`aYaa[OYa_____^]Z]`	chr10.fa		3728646	F	36	119					
+HWUSI-EAS610	1	4	6	1314	500	0	1	GTTGAAGTCTACAAACTGTTGACTTTTGCTGCAACT	aa`_a`\^_a_^^^```\]aY__a_``[]_^`_`\_	chr10.fa		3728792	R	36	119					
+HWUSI-EAS610	1	4	76	1360	604	0	1	TGAACCTTCCTGGTTCTAAGTTGTTATAAATGTCAA	`aa^]_[ZPTZLOV^_`]Va[_\Q[XT]^][ZU^Y\	chr10.fa		3728856	F	36	118					
+HWUSI-EAS610	1	4	30	779	2016	0	1	CTTCAAAAGTAGGAAATCTTGACATTTATAACAACT	`aW`_]V_[aXYY`L[bb``__aU]`_Y^L```aab	chr10.fa		3728874	R	36	118					
+HWUSI-EAS610	1	4	52	1064	1189	0	1	CACACAACTATAGAGAGAGTAATTCTATGTCTCTCA	abaaab`aaaaba^b`a^b`a_bb`aaaaa`a_aaa	chr10.fa		3729033	R	36	119					
+HWUSI-EAS610	1	4	49	204	728	0	1	AGGAACCACACAAGAATTTCTTTGGTGAGTTTCTTT	aaaVbbbbb_a_aa^_aaaba``aa^_Ta`aaab__	chr10.fa		3729514	R	36	42					
+HWUSI-EAS610	1	4	33	858	642	0	1	TGAACCTTCTTCAGGATTGAATTGCCCTTGCAGCCC	aaaa\ab`^a]\aaaUaba_ab``Z__\``__^\_Z	chr10.fa		3729588	F	10C25	85					
+HWUSI-EAS610	1	4	39	1755	1372	0	1	TGGCATTTTGAGGAATTATCAAATTGTTTCTCACAG	ababbabbbb`]ba_bababa`aaaa`a`aaaaaaa	chr10.fa		3730196	F	36	119					
+HWUSI-EAS610	1	4	27	672	1483	0	1	GCTGTTGGCACTCGCCCATGTATATGTGAGTCTGTG	a\^\U_]`_\^Z`_aZZ\a^GVPYZYK^ROZWQ_W`	chr10.fa		3730239	F	36	117					
+HWUSI-EAS610	1	4	61	551	1757	0	1	ATCCATGCTCACAGATTCATATCACACACACACACA	aaaaaa`a_a_^ZXU_``^a_`[[^_``Z_^^\`^_	chr10.fa		3730271	R	36	119					
+HWUSI-EAS610	1	4	75	421	1368	0	1	AGGAAGATGTCCCATGTTTACCTCTGGTCCCTACAC	aaaa_aa^`_a^`__`W_[_____^[ZV^^^^W[_\	chr10.fa		3730336	R	36	119					
+HWUSI-EAS610	1	4	41	401	1285	0	1	AGGGAGCTCTTCTACACAACTATGCATCTTCACACT	aWYVRYa_a_a_VHVY\^UZ`[^_[VYM\\GT_a`a	chr10.fa		3731554	F	36	117					
+HWUSI-EAS610	1	4	91	1098	781	0	1	AAGTGTGAAGATGCATAGTTGTGTAGAAGAGCTCCC	aaa_a]`aaa__a`aaaa`aa]_]_^`a___^_^_Y	chr10.fa		3731555	R	36	119					
+HWUSI-EAS610	1	4	42	241	1478	0	1	CATTGTGAGAACTGACCTCACTACACACATGCTCAC	abbaaa^]^H_ba__bbaa^^ababaabaabba_``	chr10.fa		3732117	R	36	118					
+HWUSI-EAS610	1	4	65	596	1902	0	1	TGAGGTTTATACACCGAATGAATCTAAGGTCATGAA	aabbb_ababbabaaaa_a`]`a`aaa^_Vaa_a`a	chr10.fa		3732710	R	14A21	81					
+HWUSI-EAS610	1	4	55	1749	289	0	1	GTGTATGTGTTTGTAGATATGTGTGTGAACATGTAT	a_VY`a``a`a[QV__^aa`[UWPTW]`b_a_GYa_	chr10.fa		3732864	R	36	118					
+HWUSI-EAS610	1	4	40	254	1501	0	1	CAAGGTAGCAAAATAGTATCAGAGAAATAATTATCT	a_W^a^aaaabbaaba\babb`aba\Zaaaaa`aaa	chr10.fa		3732964	R	19G16	80					
+HWUSI-EAS610	1	4	23	1466	1031	0	1	TGAATATATGTATTCTTGTTTTCACCATAAGCAATT	ab_`b`baa`aaaaaaaa`baaabaaaaaaaaa_aa	chr10.fa		3733278	F	36	119					
+HWUSI-EAS610	1	4	13	735	206	0	1	CTTCAGACATGAGCTAGCATGTGGAAATGTTTGTGC	abbba`aab[[`baaab]UabbbaYXZ`b^aaaa^a	chr10.fa		3733347	R	36	119					
+HWUSI-EAS610	1	4	75	655	240	0	1	GTTTGCTTTTATGTTGGTGTCATGAAGCTCTCTGTA	aaaaa`abba_`\`aaa\b]`^`aa^^__`____\]	chr10.fa		3734117	R	30C5	83					
+HWUSI-EAS610	1	4	60	450	619	0	1	GGAAATTTTCAGTGGCAGTGGAGACCCCGGATATTA	aaa]YbabaaaaU``a`aM\RBBBBBBBBBBBBBBB	chr10.fa		3734775	F	27A8	51					
+HWUSI-EAS610	1	4	61	1655	1941	0	1	AGTACATGAGGCATCTACAAAAAAGGTAGTGTGGTG	abaaaaabaa``aa_ba_aa^a`a]aW^a]a_a`^a	chr10.fa		3734819	F	36	119					
+HWUSI-EAS610	1	4	98	1590	638	0	1	AGTGTGGTGGTCTATATGTGCTTGTCCCAGGGAGTG	a^aaa`^QaZ^bab_baa]I]_^RT__aa_`a_XN^	chr10.fa		3734846	F	17A18	80					
+HWUSI-EAS610	1	4	76	469	714	0	1	TGCCACTCCCTGGGACAAGCACATATAGACCACCAC	^__`_]^baabb_^[Z^_`ZX^`]U_aaaO^^^]]a	chr10.fa		3734849	R	21T14	63					
+HWUSI-EAS610	1	4	21	1568	1282	0	1	TGAAACCCAACATCTGGGAGTTACTCATGGCCTTTT	a`a_a_aaaa`aa`aaaa`a_a`___a_XW[^`_aa	chr10.fa		3735244	R	36	119					
+HWUSI-EAS610	1	4	65	1400	1563	0	1	TTTAGTCCCTAAAAGTTCTGGGGGGTCTGGTTGGTT	ab`][_]^^`_XZ]`]```\^aWMQY_YTXV__[[[	chr10.fa		3735546	R	36	28					
+HWUSI-EAS610	1	4	88	1255	875	0	1	ATGTGCACTCTTTGGTGCCACAAACCCTCTTGGTCC	_b\HM\a_`aaXaa`]ab]a_`XX_`a`[]__a\``	chr10.fa		3736376	R	36	118					
+HWUSI-EAS610	1	4	26	534	1525	0	1	AGGCTTCACAGGACCAAGGAGTTCTCCTCCCATTGA	X\`ba_[aXbaaY^_`Z_aab_baaZ`ZXaaa]aaa	chr10.fa		3736466	R	19G16	8					
+HWUSI-EAS610	1	4	95	1782	1273	0	1	ACTGTAATGGTAACTGCTGAAATCGATGCTGTGAGA	[`bbUaY]]VWba[Z^_aX\\aYXY_H]a`TLXV^[	chr10.fa		3737265	R	36	118					
+HWUSI-EAS610	1	4	25	1385	1698	0	1	TGTGGCAGAAGTAATATAATGACCCAACTGTAGCAC	aaQ[_F\\Xa_^_aa_Z\`aa`_^__`XX_]^XMVZ	chr10.fa		3737299	R	5T8G21	70					
+HWUSI-EAS610	1	4	64	356	480	0	1	GTACAACAACCACATCAATGAGCCTATAGAATATGA	a_aaa`_a_```a`_`[R]a`a`^__\]_]^_]_`\	chr10.fa		3737620	F	36	119					
+HWUSI-EAS610	1	4	40	1061	1149	0	1	AGGAAGCTAGGGTGAAGGTGTTAAAGCCCATGCCCA	]XO[\[T]ZYZ_JTYY`aU_U[`a`]PTZ^\^K]\`	chr10.fa		3737743	R	36	27					
+HWUSI-EAS610	1	4	42	588	937	0	1	GACTAAGACATTGGGTGAAGCAAAACATAGGAATTT	aa`a`_a`_aaaaaa^a``aa`_^__^a_`[^^``a	chr10.fa		3737978	F	36	119					
+HWUSI-EAS610	1	4	79	251	1744	0	1	GAATTTAAAACTGTATATCATAAGGAGACCTCTCCT	`]^aaaaa`aZ`a[a`_`_^`SS\^a]`^[^]_^^T	chr10.fa		3738008	F	36	119					
+HWUSI-EAS610	1	4	52	445	79	0	1	CGCTAAAGACAGAATATGGACAGATCATTATGAGAT	abaabaabaabbaab_baaa`aba`_aabaaa`a_`	chr10.fa		3738161	R	36	119					
+HWUSI-EAS610	1	4	9	129	738	0	1	CGCTAAAGACAGAATATGGACAGATCATTATGAGAT	a`]\[_a`a^``Y]Y^U[^][Y\^`]M[[VX``YO[	chr10.fa		3738161	R	36	118					
+HWUSI-EAS610	1	4	56	191	1046	0	1	CATCAAATCCCCCCCAGGGGAGAAGCAGACAGACTG	aaaba_a_aaaa[aa]a`aaX`\\^^Y\]Y\\W\U\	chr10.fa		3739289	R	36	119					
+HWUSI-EAS610	1	4	45	1115	1563	0	1	GAGATGGATTGCAGAATGTTCTTGCCTAAGGCTTCT	_aaYa^]T]\a_`_a`[a[___aa`S^`a]]]Xa]a	chr10.fa		3739781	R	36	119					
+HWUSI-EAS610	1	4	90	997	931	0	1	ATTCTTTAAGGACTTCTACCTCATTAGCAGTGTTCT	aaaa``\^a``^^`[`_aaWa`a```]]a^\\X`_a	chr10.fa		3740530	R	36	12					
+HWUSI-EAS610	1	4	7	1213	1449	0	1	AATGTCCTGTAGATATCTGTTAAATACATTTCTTTC	aabb`_abb\`aaaaa`abaaaaabaa`aaa`a`a^	chr10.fa		3741972	R	36	33					
+HWUSI-EAS610	1	4	62	417	582	0	1	GATACCAGGTACTGAAGTTAAATCAGTATAGGATTA	aaaaaaaaa_aaaaa^b_aaa`a``a]a``aa___a	chr10.fa		3742760	F	36	119					
+HWUSI-EAS610	1	4	63	1640	1320	0	1	GCAAACAGAATCCAAGAAAACTTCAAAAACGATCAT	aa[]`^R]___`]a]`_`^_VOV^^_U^^OUS[XZS	chr10.fa		3743098	F	36	39					
+HWUSI-EAS610	1	4	34	1462	1536	0	1	ACTGATACGTTGATATTAGCCCAGAAACATAGAACA	`abaaaaaa^^]\`abaaa`_a`a^_a\`a`[`_]a	chr10.fa		3745305	F	36	20					
+HWUSI-EAS610	1	4	63	972	1951	0	1	GTAAGGGATAGAGAAAGATTTTTCATGTTACAGTAG	aa`_aaa^aaa`a``_a`_a`a^T\aa]_]^^_X__	chr10.fa		3746756	F	36	119					
+HWUSI-EAS610	1	4	68	493	252	0	1	GAAGCTGAACACGCAGACACAGAGATTAATTTTATC	__O_`QV\[_UW_TSWOLU``VPWQVT\LR^PXWXB	chr10.fa		3747358	R	2G33	93					
+HWUSI-EAS610	1	4	51	198	46	0	1	AGATGCCAGGAGGATGAAATGCCTGCCAAGAGAGAT	S^T__aa\a``\Z``b`WWR__]]b`a`\`aaYa\Z	chr10.fa		3747723	R	36	119					
+HWUSI-EAS610	1	4	43	390	1875	0	1	GAGACAACGTGGGAACAGAACTTGCATAGAGAATTG	_XVM]b`a_F__Z^aa^YQ[^]\ZY]`[]Z_ZBBBB	chr10.fa		3748028	R	36	100					
+HWUSI-EAS610	1	4	86	702	1932	0	1	ATTGATGTGATTACAAAAAGCCAAGTGCTTTGTAGC	aa`aaaa``_`^a`_`[aZ_]UW_`Za__`_`\`]X	chr10.fa		3748169	R	36	119					
+HWUSI-EAS610	1	4	55	887	1060	0	1	AGGTAACAAACCTCTAGACCAAGAATTTCTCGACAT	aab_aa^`\baaa_ZHV^^VXW]P[abbaaXa][Wb	chr10.fa		3748428	R	36	118					
+HWUSI-EAS610	1	4	81	716	2024	0	1	ACTTCTAACGCAGTCCTCATTGAATCTGAAGCTTTG	aa_V[X\``YY^H^`[^^[_`XR]^_ZZY^]_^R_^	chr10.fa		3748485	F	36	118					
+HWUSI-EAS610	1	4	49	88	148	0	1	GACAAATCTGGTGAGGAGTCAGAAGACCAAGTGTTA	aaa`X_ababa]aWaaU_Zaa`a`_aaaaaa]a__`	chr10.fa		3748559	R	36	119					
+HWUSI-EAS610	1	4	61	761	1398	0	1	GTGTTTTCCTATCCAGGTTCTAATTTCTTCTTCTTA	V\abbbb`ab_ba^`ba`_aba\aba^_b]aaabaa	chr10.fa		3749166	R	36	119					
+HWUSI-EAS610	1	4	60	752	995	0	1	TCCAATTGTCCTTGTCCTGTTACCGAATGAAACTTC	aaaaaa`a_`_aaa^a_aa`aa_`a__aa`__]`_`	chr10.fa		3749668	F	36	119					
+HWUSI-EAS610	1	4	15	514	1539	0	1	CATAAAATGATAGCAAGGCCCATTGCTGAAGACAAC	a`a[aa`aaa`aa_baaa``a`\]a]`aU_^WZ][[	chr10.fa		3749806	F	36	119					
+HWUSI-EAS610	1	4	17	680	1811	0	1	CATAAAATGATAGCAAGGCCCATTGCTGAAGACAAC	abbaa`^bbaaaaabaaaaa`a`Za_```_`_``NU	chr10.fa		3749806	F	36	119					
+HWUSI-EAS610	1	4	63	1268	1605	0	1	GTAAACACCAACCCAGCCACAANCTCTCTGATGTAC	^`bba`aZW_a`X``^]_aaVUDV__]UZYZ\[Q^\	chr10.fa		3749963	F	22A13	18					
+HWUSI-EAS610	1	4	46	735	1349	0	1	ACTCTCTGATGTACTATGATGTCCTGCCTGCTAGGT	a^a_a`aa]a`]a_a_aa`_`__`_``^`_]^\`a]	chr10.fa		3749985	F	36	119					
+HWUSI-EAS610	1	4	46	1613	609	0	1	TCCTGCCTGCTAGGTGTACTGATACAATGGTGACAG	abbaaa_`_aaa_Y_`Yb_aaa^a_`a^a[Q__Z`a	chr10.fa		3750006	F	36	119					
+HWUSI-EAS610	1	4	71	1177	1619	0	1	GCCCAGCAGAGGTATTGCTAGATCTACTGGTAGTAC	aaS]_LYVRX_^NX`^_S\[aQ\Z``N`_\Y_BBBB	chr10.fa		3750950	F	36	15					
+HWUSI-EAS610	1	4	71	1420	1226	0	1	GCTAGATCTACTGGTAGTACTATGTCCAGTTATCTG	aabbaaaaaa`aaa_aa^b`aaaa^a^aa_a`a]`a	chr10.fa		3750966	F	36	33					
+HWUSI-EAS610	1	4	39	222	1209	0	1	AAAGGCAGGCCTATGAGGATTACTCCAGACTTCTCA	aVW]Z_XP\U_W]_]PQVLO\[[a`Z\\[\XL_YVB	chr10.fa		3754821	R	36	9					
+HWUSI-EAS610	1	4	52	372	8	0	1	AGGAGAGTCAGCCTAAAGGAAGGGTTCTGACCCCAG	````a]a]b_``aaaa`^\W^^`^S^Y_`^]ZZVZZ	chr10.fa		3756023	R	36	40					
+HWUSI-EAS610	1	4	26	1041	1542	0	1	AGCTCTGCTTCCTGGCTATGGATAAAAGCCTGAGCA	`bbaab``aa__abY`aabbb_abaaa_``_a]`[_	chr10.fa		3756092	F	36	119					
+HWUSI-EAS610	1	4	8	312	105	0	1	GAAGCAACAGGGACTGCTCAGGCTTTTATCCATAGC	aaaaaaa_`a`^_^_``^_a`]_\_]^^Y^___\^]	chr10.fa		3756106	R	36	119					
+HWUSI-EAS610	1	4	76	1585	1371	0	1	CTTTCTGCTTTAAAAGCATTTTATGGCTACCTTTTC	abbbaba`aababaaa`abbbab`aaa`_Y_`_a_U	chr10.fa		3756580	F	36	119					
+HWUSI-EAS610	1	4	16	1099	1801	0	1	TGAGAAGCTAATACATTCTTCTCTCCCCTACATACA	aaabaa``aaa`_^a`a`a`Z^]a]Z]___]``]X\	chr10.fa		3757213	F	36	119					
+HWUSI-EAS610	1	4	17	1364	1767	0	1	TGCAAGTTCACTGGAAGCCACAACGAGCCATACAAT	abaaaa]a`b_``__`a_a`_`a^a_a]^`_`]`__	chr10.fa		3757293	R	36	119					
+HWUSI-EAS610	1	4	95	1575	842	0	1	TGTTGTTGCCAAATACATTGATCTTATTGACTAGTA	aa^___^]`_`__^a\aaa___]aa^`^__^_]^]_	chr10.fa		3757621	F	36	119					
+HWUSI-EAS610	1	4	51	877	1107	0	1	TGAAGGCATGAAGTTGTCAGCGTTACAGAAGCTGTA	abaaaaaabb_`aaaaa`aaaaaa_^^]U[a^a`YZ	chr10.fa		3758106	R	36	119					
+HWUSI-EAS610	1	4	36	1636	656	0	1	GGATTGATAGCAGAGAAAGAGCAGCCACCTTCTCAT	aaaaa`aaaa_`a_]aaa_`a_a``_`]_]_`^^aa	chr10.fa		3758647	F	36	119					
+HWUSI-EAS610	1	4	28	1007	1951	0	1	GCAAATGCATCTCTGAAAAGCAGTACAGCAGGCTTT	aaaaaaaY`][bX`W`a\_QRV\SRHU`SU[YV_a_	chr10.fa		3758685	R	36	118					
+HWUSI-EAS610	1	4	8	1419	1357	0	1	AAGAGATGGCTATATTCTTTATACTGTTTCTTCTTC	aaaab__``_a`a^aa`aaaaaa^_a^`a^`a^aa`	chr10.fa		3758856	R	36	119					
+HWUSI-EAS610	1	4	92	1420	756	0	1	TGTGATATGGTTGCAGCAAGTAAGGATTCAACCTAC	_Y_\]b`_[UV_]]_Z`_ab`ab]S^P^Z]]_\\\]	chr10.fa		3759043	R	36	119					
+HWUSI-EAS610	1	4	79	772	1165	0	1	AACTGCTGTTATAGCAATAATAAATGCCTTAAAAGA	aa_`a^``_a^`a__^aaZ[aa`__]^^a___`_^W	chr10.fa		3759278	F	36	119					
+HWUSI-EAS610	1	4	3	644	839	0	1	AGACCAATGAGGCAGAGCCACCTGCTGTGCTGCTTC	abaaZ`aaaaba^]a_MX]__aaa^]_U[^^^U^[Y	chr10.fa		3760505	F	36	37					
+HWUSI-EAS610	1	4	5	1101	1586	0	1	GTCAAGAAAGTCAGTATATCTGATTCTGCTAAGGGG	a`_`a_a]R_^_a_X\a_`^`a__^U`aZZ[W_]O^	chr10.fa		3761295	F	36	119					
+HWUSI-EAS610	1	4	26	357	1734	0	1	AGTCTGTTCTTCCTGGTTAATTGTCATGTGAACCTG	QZTaa`b`_bbb`]aaX^ZZa[]`^^^_Z^Yabbab	chr10.fa		3761603	F	36	119					
+HWUSI-EAS610	1	4	80	525	641	0	1	GAAAACAATAGTTTATCTTGGTTCCTGTTTTCAGAG	aa`[\ZWY]ZaQaT[Z\`^WXP]a^aa\]`[NN]WY	chr10.fa		3761700	R	21C14	97					
+HWUSI-EAS610	1	4	3	503	151	0	1	GGAACTTAGAGGCATCTTAGCTAAGGAGGGGTAGAG	Z]_^\^a_aYa^WKZXXOZWR`^__BBBBBBBBBBB	chr10.fa		3761826	R	36	71					
+HWUSI-EAS610	1	4	79	260	276	0	1	AACCCCCACCTATTCCCCTCTGTATATCCTTCCATT	aaabaaaaaa`aa`ab_`aaa`]aaaa```a``[`a	chr10.fa		3762273	F	36	119					
+HWUSI-EAS610	1	4	93	664	1906	0	1	GTTTTGTCAACTTGTCACGACCTAGAATAACTTTGG	a]aaaaaa_b`aaa_aaa_a_aY^^aa`a_```_``	chr10.fa		3762334	F	36	119					
+HWUSI-EAS610	1	4	65	426	1877	0	1	ATACCGACTGTTGTGGGTCTTCACAAGAAAAGCCAC	aa`bbaXa`[\aaUaa`R``_``W`a__aa]\\\RY	chr10.fa		3762597	F	36	119					
+HWUSI-EAS610	1	4	79	561	105	0	1	CATGGGTTTAAGCCAGTAAAAAACCTCTGTCAGTTG	aba`ab_abaaaaaa``aaaaaa```_aaa_aa_aa	chr10.fa		3762639	F	36	119					
+HWUSI-EAS610	1	4	37	527	814	0	1	AAGACCTAATCCATCAAAGCCCGTAGTTTTTGGCTT	_V`b_aa]`aaa``aa]I]a`_aXXaY_a]_``^Z\	chr10.fa		3762821	R	36	39					
+HWUSI-EAS610	1	4	53	900	157	0	1	AGCAGAGGATGGGAGGAGAGGCCCTTGGTCTCTCGA	_`^^aZ`_\^Z^^\]^`\^_`^\[\`PVRX^ZR\S^	chr10.fa		3763467	R	31TA3	10					
+HWUSI-EAS610	1	4	15	1099	106	0	1	CATGGGAAGCTCTCCCTTCTCTTGATGATTTCTTAC	Vababa_b]_b\bYbabbbaa`a`aba`aaa\bbaa	chr10.fa		3764006	R	36	119					
+HWUSI-EAS610	1	4	74	590	553	0	1	ATATGTGCGTAAGTGTTGTGTAAGAGTAGAACAAGA	U`\]YRa]RU^^SZb\\a]^^ba_I\ZY[a\]`aaa	chr10.fa		3764122	F	8A27	95					
+HWUSI-EAS610	1	4	95	1093	50	0	1	TCTATTGGTTTTGTCCTTGTTCAGATCTTATTTAGG	a`a^a``UPa]_____```_\P[a__]a`]_]]_^W	chr10.fa		3764850	F	36	41					
+HWUSI-EAS610	1	4	86	445	1888	0	1	ACATGAAACATTCCTCCTTAATGTCTTGGTTCATAG	aTXX^RN\S\LRWZR^]]WFUVUX]]ZVQPUQNNTT	chr10.fa		3765446	R	36	116					
+HWUSI-EAS610	1	4	33	657	1896	0	1	AATCAATGTAGGCTATTGTTGTAGTCCTTAGTTGCT	a``a[[^a[a]`\^_X]XMYK^\NWOVUS[[QUKR\	chr10.fa		3765551	R	36	117					
+HWUSI-EAS610	1	4	66	1247	1714	0	1	CAGAAGAAACTACAAGGCTCTGCCAAATTGGCAAAG	aabaaaaa[`aa```abaaa_a``__^aa`Y^^_^a	chr10.fa		3765847	F	36	58					
+HWUSI-EAS610	1	4	79	341	802	0	1	TTATGATGTAACCTTGAAGTAAGACAGCGTTGAGAC	abaab`ab^b^aaaaaaaa^Waa`a`aa`^aa_aa`	chr10.fa		3767357	R	36	119					
+HWUSI-EAS610	1	4	58	1407	745	0	1	AAACTGACAACCTCAGGCAGTTATGATGTAACCTTG	aaa`aaa`a`_`a_`a``aa_a^___^]\__W]]__	chr10.fa		3767377	R	36	119					
+HWUSI-EAS610	1	4	52	1249	1197	0	1	AGTTGCTGTCACATTTCCATAATAAAGGGACATGCT	^ba_ba`a_P]RVa``\]G[ab_`VTUP`]^]^_W^	chr10.fa		3767744	R	36	117					
+HWUSI-EAS610	1	4	69	796	172	0	1	AAAGTGGACAACAAAGCAAGGAGCACGCAGAGACTG	aabaYaaa_aa_aa^aa`aaa^a`a^`^aa`\`_\^	chr10.fa		3768796	F	36	119					
+HWUSI-EAS610	1	4	30	926	247	0	1	CTCTTCAGCTCTGAATCTTGTATCCTTGGGTGTAAA	aaaabaa`_aaaa_```aaa_``]_``[]_V`\`a^	chr10.fa		3769578	R	36	119					
+HWUSI-EAS610	1	4	3	1570	879	0	1	ACATATGGAGATTTATACACTATGATATTTTGATAT	\Xb`]`YWUVY\``\][V`YZ`]U`XKX^Z\^[U\_	chr10.fa		3769792	R	36	118					
+HWUSI-EAS610	1	4	84	112	1125	0	1	ATCAATCCCCTTTTATACTTGTAAATGAGAAGATAG	]aa^^a^b_aWaY_UW^`VX`[`SX[aQ_]\_^R^a	chr10.fa		3770569	R	36	119					
+HWUSI-EAS610	1	4	8	813	778	0	1	TAGAGTATTTGAAATGCTGTCAGTTACAGGAGGATG	a^_Y_[^baa`Wa`aa]aa_a`a\__T\`_V_a]^a	chr10.fa		3772453	R	36	119					
+HWUSI-EAS610	1	4	51	298	1154	0	1	AAACTGCTCATCTATTCAGTTTTAACTTGCTGTATC	_YU`abbbbbbbb`bb^_`aab\_Yabbbabb\]`a	chr10.fa		3772676	R	36	119					
+HWUSI-EAS610	1	4	29	943	859	0	1	TCCTATTTCCTGAGATTGCCTGTTTCCATGCTTTCT	]X^_^`bb^_ba`bbb_]bbababa^ab_bbbaa_a	chr10.fa		3773644	F	36	33					
+HWUSI-EAS610	1	4	37	299	913	0	1	TTATATAAATGAAACACATTTNCTATATCCATTCTT	`aaaaa^a_aabZV^aaaaa[D[a`a]a`a_aa`^a	chr10.fa		3774068	F	21T14	26					
+HWUSI-EAS610	1	4	34	274	1303	0	1	GCTATGAACATAGTGGATCATGTGCCTCTGTGGCAT	abbba_]`bab`b[bbaabaab_bbba`a`_a\a_a	chr10.fa		3774157	F	36	31					
+HWUSI-EAS610	1	4	71	1197	824	0	1	AAAGGACCTAAGGAGCTGACGGGGTTTGCAATCCCA	\U^b`a`aaaa^YZb[X`a`a__`[_aa`aaVM`aa	chr10.fa		3774643	R	36	32					
+HWUSI-EAS610	1	4	32	816	371	0	1	GGTGGATGGAAACAAGTGCTTTCTGACAGAAGCCTA	]Y]ba`N_a`aa`[aaXa___a^`^]^_a^__^^a_	chr10.fa		3774761	R	36	119					
+HWUSI-EAS610	1	4	51	887	807	0	1	GTCAGAAAGCACTTGTTTCCATCCACCATAGTATCT	a_`aaaba__a_aaa^aa_`aa\_`^\]a^a]^`]`	chr10.fa		3774770	F	36	65					
+HWUSI-EAS610	1	4	53	1617	1590	0	1	ACTGTCACCTGTTTTTTATCCATCTCATATACATTT	aaa_^]^[SY]S]_]\PHR`I_Z[V[\`OXZZVY^]	chr10.fa		3774815	R	36	117					
+HWUSI-EAS610	1	4	59	548	122	0	1	AGCCAGAGCGCCAGCGCGCCAGAGCGCAAAAGCGCA	a`aa_^\`YOY]`^^`[[`^`Za`^`Z`^Z^\T]Z\	chr10.fa		3779659	R	36	29					
+HWUSI-EAS610	1	4	1	1366	1192	0	1	CATGCATATCATAAGAGGGAATAAGATCCCATTACA	abbbaaaaa`aabaaabbaaaaaaaaaaa_aaa`\^	chr10.fa		3780556	F	36	119					
+HWUSI-EAS610	1	4	72	779	1610	0	1	CATTACAGATGGTTGTGAGCGACCATGTAGTTGCTA	abbbabababababaab_a`a`[^ab_aaaaa`\^Y	chr10.fa		3780585	F	36	8					
+HWUSI-EAS610	1	4	63	822	1415	0	1	CTTTCCATGGCTGAAAGATGCTTCAGGTGGGTAGGA	abbaaaabaaab`aaaaaaaaaaa`aa^baa\`a^V	chr10.fa		3780756	F	36	119					
+HWUSI-EAS610	1	4	44	468	1299	0	1	GATTACAAGACAGAGAGATCTTAGGAACCACCTACA	a```_\X\aX^_^W_^[[X_VYS`WTY\]^]^]]][	chr10.fa		3782162	F	4T31	83					
+HWUSI-EAS610	1	4	62	521	38	0	1	ACACGTAGAATATGTCTTCCTCACTGACCAAAGAGC	__a``abba]baa_^baaaaaab`aa^]]``aaaa`	chr10.fa		3782445	R	36	119					
+HWUSI-EAS610	1	4	16	1639	300	0	1	GAATGTGGAAATGAACACATCCCTAGGGTGTTACCC	]aba_^GW\b]S[a]`^`a`__ZS_NNTTP[QaZW[	chr10.fa		3783121	F	36	117					
+HWUSI-EAS610	1	4	16	1027	212	0	1	GGCAATATTTGATCACACTGCAAGAGAGGTTGCAAA	^^^bbbabbbaaaaaababa`aab```_a]`a_`^`	chr10.fa		3783258	F	36	119					
+HWUSI-EAS610	1	4	33	406	76	0	1	TTATGATGATTAACACCCATAATTGTTGTGGTGGCT	`a\aa\]^a]`a_aaSba\aUHa_a]__\_`[a[BB	chr10.fa		3783694	F	34T1	107					
+HWUSI-EAS610	1	4	54	463	260	0	1	TGATGATTAACACCCATAATTGTTGTGGTGGGTTGG	``[aa_a^``aa_a[_a__aa`Oaa_aYM__BBBBB	chr10.fa		3783697	F	31T3A	92					
+HWUSI-EAS610	1	4	46	1673	1517	0	1	TGCTTTGTTGGAGTAGATATGGCCTTGTTGAAAGAA	``]aaY\_a^^\[\X\[`[_a[[UZYWYUOQ\RRT]	chr10.fa		3783785	F	36	38					
+HWUSI-EAS610	1	4	97	1455	723	0	1	TGATTGGGTGGCTTATGGTTCAGAGGTTTCAATCTA	_`]a^VSOQ[_^Y\[][YZ`[]\Z[YQ^_]^___`\	chr10.fa		3783981	R	36	118					
+HWUSI-EAS610	1	4	27	215	570	0	1	GAATTAAAGGAATATCTTTTAAAAGTCCAGGAAGCT	a_`_aa^`_aa__`a^a```a```a_``a```_`]_	chr10.fa		3784097	F	36	119					
+HWUSI-EAS610	1	4	15	1442	1376	0	1	GTAGAGAGAGAAAAGTGGAGATGGGACAGAAATAGA	a_S_^`^^W^_XYMSX]X__]U_]^ZZXZZZ\]]Y]	chr10.fa		3784456	R	36	118					
+HWUSI-EAS610	1	4	63	687	1853	0	1	GGGGACAGCCATACCTGGCTCTTATCAGCAAGTGCT	aa`aa``aa\aaaZ^^\]aa`a_[^\Za[Y[aW__^	chr10.fa		3785067	F	36	60					
+HWUSI-EAS610	1	4	81	1478	1029	0	1	AGACCTACCTAGGGATCCATCCCATATGCAGACACC	aaa``a`___aZ___]^_aa_^`_^a_\\^\____^	chr10.fa		3785132	R	36	58					
+HWUSI-EAS610	1	4	28	875	1612	0	1	GATGGATCCCTAGGTAGGTCTCTGGATGGCCTTTTC	_`a^]^\\_S_`__U_Z`Y_^_`[````]ZU\_a_]	chr10.fa		3785147	F	36	36					
+HWUSI-EAS610	1	4	32	291	1500	0	1	ACAAAGCAAGAGGCTTCCAGGACCCAACAGGGATGA	_aa^]ab_T`]aabaab]U\Z_]aa^a`aa\[\^]\	chr10.fa		3785350	R	36	40					
+HWUSI-EAS610	1	4	57	1074	1860	0	1	GATCAGGTATGAGATGAGACAGGGAAAAGTGAAGAG	a_aa]^a]aaa^_\aa`aa__a^\^_^_[W__]a]a	chr10.fa		3785464	R	36	119					
+HWUSI-EAS610	1	4	29	142	1044	0	1	TTCTAAAGTAGCCTTTCTGATTTTTAACATACAAAA	aXb`Y_`]JU^Ya^_aba[L\a`a^U]U_XaaYXXT	chr10.fa		3785833	R	36	118					
+HWUSI-EAS610	1	4	57	1002	1717	0	1	TGATATAATTTCTCATTTCTCATGCTATACTAACTA	a\``_a__aaa_`Z^`a`_]XW]]]`^``\^^]]__	chr10.fa		3786768	R	36	119					
+HWUSI-EAS610	1	4	88	1072	487	0	1	TAAGCAATCAATGCTGCTGAGAGATGGAGAACCAGT	_bUIL\W`_^UZY]a_^a^TTY\ZIXS```SZ]WWX	chr10.fa		3786876	F	36	117					
+HWUSI-EAS610	1	4	98	913	1753	0	1	GGAAGACTGGTTCTCCATCTCTCAGCAGCATTGATT	_ab]bab[bba]Uabbbbbbab[aaaabababaa`a	chr10.fa		3786881	R	36	119					
+HWUSI-EAS610	1	4	34	1245	1738	0	1	AAAGACAGAGAAAGAGAAATATGCACATAATCTACT	aa_aa__U^]HX\`\^``\_[a`\aa\[`Ua_^\_a	chr10.fa		3787014	R	36	118					
+HWUSI-EAS610	1	4	23	637	8	0	1	AAAATCATAGACCTCATGCTGTTGTCTCAGCAATTA	a^[aZ^aaaaY\a_`aY^aO_Y^aT[V_a`]^`]_]	chr10.fa		3788484	F	4C31	88					
+HWUSI-EAS610	1	4	77	773	1290	0	1	AGAAAAACTGGTAAGGTTGGATTGGCAGGACTTGAG	abaZ[]^P___V\Zbb^a_]`_Wa`R`\`ZZ_a_ST	chr10.fa		3788535	R	36	119					
+HWUSI-EAS610	1	4	56	944	196	0	1	AGAGCTGTGTTTGCTAGCTTGAGACCAGTCAATACT	ab`[_`_[_]a^aaaaaa^aaab__a___abS`aaa	chr10.fa		3788904	F	36	119					
+HWUSI-EAS610	1	4	78	1006	366	0	1	GGGCCTTGTACTCCATCCTCCATGTTCACTGGAGTA	QYaUbbaabaJ_`bb\[bZ_bbbb]Uab^bb^ab]]	chr10.fa		3788936	R	36	118					
+HWUSI-EAS610	1	4	1	582	712	0	1	AGAGAATTCTTACTCCCAAGCTCCAAGCAGCTATTG	`abaaaaa`ab_^aaaaa`b`aaa_aa`_a`a_aaa	chr10.fa		3789000	R	36	119					
+HWUSI-EAS610	1	4	65	1147	529	0	1	CATGATTTCCTTGTAGATAAGAGTGTTCTATTTTTG	aa_QM[^]VVT^aX`Za^\aaN_L_X[\VN`aaa_Q	chr10.fa		3789738	F	35C	96					
+HWUSI-EAS610	1	4	2	571	340	0	1	TTAACATACACTATTAAGAACTTCACAAAAATAGAA	ab`a_a[[`a_`aaaa_YZaa`aa`aa_Z_^a`_a`	chr10.fa		3789763	R	25G10	81					
+HWUSI-EAS610	1	4	61	1315	239	0	1	ACGGTATAATAGGCCTCCATCCTTCATCCCTCCCAT	aa]]Q_\[\PWPUURPWVG[QRNVRTW\\\UWSWYT	chr10.fa		3790376	R	36	117					
+HWUSI-EAS610	1	4	93	155	1193	0	1	TACATGTTGAGTTAACACAGATAACAGCTGATAGAA	a`_U\bZ[aabV^_abaaaaa`ba``aa`ba`aa[[	chr10.fa		3790787	F	32G3	81					
+HWUSI-EAS610	1	4	86	887	923	0	1	ATAAAGATATGTACTGGGACAACGTGTCATAGTATC	a^`_R_VW_]UM^]ZX\[[^]]]]Q]X]Y]XQY]_X	chr10.fa		3791081	R	36	118					
+HWUSI-EAS610	1	4	63	1264	570	0	1	AAACTTGGTAGTTAATGTTGAAAATTAAATAAATAA	aaa_aa^WS_]_a^^a`\`a___^`_`___^`_aa_	chr10.fa		3791210	F	36	119					
+HWUSI-EAS610	1	4	51	893	1341	0	1	ATAAATAAACCATTTAAAATAAATGGCTACTAATGC	a`[Z^^`\VQOL^aa[YWT__VZ\]Y^^aZXV^S_X	chr10.fa		3791238	F	36	118					
+HWUSI-EAS610	1	4	44	1263	1247	0	1	GGGGCCACAGTGAGACTCCAGTGCAATGACATTCTG	`a_aaabaab`a`aaaa^^aa_aaaa`]__`aa\`a	chr10.fa		3791351	R	9A26	80					
+HWUSI-EAS610	1	4	24	1764	879	0	1	ATTGCAGAATCAGCTCTTTATATAAAGGTCCAAACA	aa`T_`\_`^_^QZ^_```_``_`_[YWW[]__^X[	chr10.fa		3791498	F	36	119					
+HWUSI-EAS610	1	4	97	967	1968	0	1	AAAGAATTGTACATGTAATGTTATTGCCATAATTGC	aa`_`Z]a_\`\aaaX]`a``a\aa`aPYba`__`a	chr10.fa		3791704	F	36	119					
+HWUSI-EAS610	1	4	52	110	1460	0	1	CTTGGTTTTATGTTCTTTGAGATCAGCTTGTATATG	a`TVaY\a`a``QYa_a[]O^[^WLWSaUaLL[`^]	chr10.fa		3791933	F	36	118					
+HWUSI-EAS610	1	4	42	1651	649	0	1	TGCATAGATCCCTGGGGCTCTCTGGCCAGTCAGATT	`^`aa_Z_`a``]YUWT]_]^\^JV`^UVW\XQV`\	chr10.fa		3792214	R	36	118					
+HWUSI-EAS610	1	4	35	278	1239	0	1	TTAGGGCAGTCCATCTATTCATGTGCTTCATCCTAT	`ZR_^bZ`aWaa\aaY[_bb`_]Y```bb_]abZN]	chr10.fa		3792512	F	17G18	83					
+HWUSI-EAS610	1	4	66	375	1682	0	1	GTTCTCAACATCAACCCACGCTTCTCCCTTGTATCC	`WY^XaU]b_^a^`]a\[DRNQVYO[GVQXTOLQ_\	chr10.fa		3792570	F	18G7A9	97					
+HWUSI-EAS610	1	4	43	403	1302	0	1	CATTGTCAACAGAAAATGGCTTGATCAAAAGAACAG	aabab_a^`a^a``\``aaa___T]_``aaa\[``a	chr10.fa		3792986	F	A35	81					
+HWUSI-EAS610	1	4	44	1444	1745	0	1	GATGCTGTGGTAGGTTTAAGCTGGGGGATTCTAGAG	aaa``aa^baZ`b`[aa``a]aaa`_aT_^[`\a\b	chr10.fa		3793103	F	27G8	94					
+HWUSI-EAS610	1	4	34	173	970	0	1	CCCCATTTTAACTGATCAGTAAAGGCGAGAGCCTGT	aaaaaa`ba_Za_^XZaX^WX[\^Y`a\_V\^``_T	chr10.fa		3793274	F	15C10A9	34					
+HWUSI-EAS610	1	4	3	1395	1082	0	1	TGTCCTCTTCTGTCTCTGTACCTGACACCACTCTAG	aaaa_a^a_Wa[Paa``a\a]_a^_\a_]_VYX\[\	chr10.fa		3793338	R	36	119					
+HWUSI-EAS610	1	4	59	1006	524	0	1	GCCCGCTATGTCTCTATGTCTGTTTAGTTCTTACCG	_W^\ZTa`_Z\___^^``U`T`KZLGZR[YU_[BBB	chr10.fa		3793600	F	36	104					
+HWUSI-EAS610	1	4	52	629	382	0	1	ACAACAACTTTAACTCATGGATTTCCAAGTCAACAC	a`^[]aa_aa`\]^```aa`^`_]`[^[^Y_`^[_`	chr10.fa		3793638	R	16C8T10	50					
+HWUSI-EAS610	1	4	44	1193	1532	0	1	ATTCTGAGTCCTCCACACACAAATCATATAAAGCAT	aa`GY`\_WP][[TMPV\^W_Y\][Y]^][WUMVXV	chr10.fa		3793906	R	36	117					
+HWUSI-EAS610	1	4	29	1697	335	0	1	GGGTTTGATGCTTAGTCTATGCGGTTATGACCATTG	``aaba_aa`abbb]`abbbaa_T^ab`[aa]aab`	chr10.fa		3794090	F	6T14T14	45					
+HWUSI-EAS610	1	4	76	1150	1480	0	1	TACAGCCCATGAGTCCAAAACAGAGTAGTATGGACC	aa_a_X_]_]QW`X_]`___Z`a_`]_`X_ZV[_XY	chr10.fa		3794196	R	36	119					
+HWUSI-EAS610	1	4	44	1745	1788	0	1	TCACCCCAAAAGGCTCTTGGAGGAACAATGGCATTT	``[[]a`]]`a_[Y]X`YWTR^]]SQ[^YYUQU_`a	chr10.fa		3794391	R	36	118					
+HWUSI-EAS610	1	4	88	156	471	0	1	GAATGGCTGAACTGCTGTATCTCACTGAAAGTTTAT	a_`]a`a`a_aa``a__]a^a_aa`_`\]aaX]^aX	chr10.fa		3794513	F	36	119					
+HWUSI-EAS610	1	4	4	1155	1336	0	1	ACTCATATTAACTGTGNATCTTATTTAAGTTAAGAT	a_a`aa_ba`a^`a]\D[```]_a``___\_^]___	chr10.fa		3794984	R	16C19	110					
+HWUSI-EAS610	1	4	76	189	765	0	1	TCAGAATGACTAAGATCAAAAAATTCAAGTGACAGC	ab`Ya_a```__NDTWbaaV`\XVT_`^`]aaa``a	chr10.fa		3795911	F	36	6					
+HWUSI-EAS610	1	4	38	1558	1160	0	1	TGCTAGTTGACAATATCTGATCCTCAATGGGGAGGA	a`V^`]``aaaaX]S]_R_\Y\]__YU]]Z^XL_Y[	chr10.fa		3797509	F	36	118					
+HWUSI-EAS610	1	4	99	1223	997	0	1	GAGAAAATTCTGCTCATCCCTTTATCTGGGTTGGAG	`_``_Y\]^a_TS`aa`_``aaaY`_a`]ZN^[]Ua	chr10.fa		3797575	F	36	119					
+HWUSI-EAS610	1	4	45	687	1206	0	1	CATTCAAATGAGGAGGGTAAGAAAAGAATTTCTCGA	abbaaa`]`a]bb_aaa_abbaabbba`aaa^bYba	chr10.fa		3798249	R	36	119					
+HWUSI-EAS610	1	4	9	795	365	0	1	AGGGCTTCATGGGAACGTCCTTCAACACAGGGCCTG	abbbaababbb`aaaab`aaaaaa`a`aaa]]a`ab	chr10.fa		3798408	R	36	119					
+HWUSI-EAS610	1	4	35	806	124	0	1	TGTTGAAGGACGTTCCCATGAAGCCCTTCCTGAGTT	ab`aaa`^a`_a__[__aaa_``[[Z`_ZU_`\__`	chr10.fa		3798417	F	36	119					
+HWUSI-EAS610	1	4	85	851	1632	0	1	TTTAAGTTGCTTCAGCTTTGCTTTCTGTTACAGTGA	abba_a`abaabaaaaaba`aaaa`aa`aa_W^\aY	chr10.fa		3798703	R	36	119					
+HWUSI-EAS610	1	4	40	494	1990	0	1	GACTGATGAGGAAGTGGCAGCATAACAAGAGGAAAC	``baaaababaabb^[`aa]^[a`Ya\a[``aaaa[	chr10.fa		3798865	F	36	119					
+HWUSI-EAS610	1	4	81	1125	1224	0	1	GTCTCCAAACAGCATTACTGCTGGGGAACAAGNGTG	\UNXX[]`V_YaR\]TRLR_TZOQY[SYPSSUBBBB	chr10.fa		3798955	F	32T3	98					
+HWUSI-EAS610	1	4	35	1121	520	0	1	TGTGCTTGCACACTTGTTCCCCAGCAGTAATGCTGT	aa```_aaaaa``aabaa`aa]aa`\aT[_X_U^`_	chr10.fa		3798963	R	36	119					
+HWUSI-EAS610	1	4	30	77	497	0	1	TATTCTCCATAGCTGGATGTGCTTGCACACTTGTTC	a`abbabbaabababaaaaT`a_aaa`a`a__^[Va	chr10.fa		3798980	R	5C30	81					
+HWUSI-EAS610	1	4	67	711	1283	0	1	GTGTTCCACTGACCAATCTGAAATCCCTGAGACCTG	``baaa`[]a_aaa_Za`[\_a]^``[WZ\ZWY_aa	chr10.fa		3799105	R	13T22	81					
+HWUSI-EAS610	1	4	26	481	1096	0	1	CACTCAATTGTTAAATAGACAAGACGTAAGTAGATC	a]aaaaXa_Y]aaaaaaba_a___`b]_``_aaY_a	chr10.fa		3799251	R	24T11	82					
+HWUSI-EAS610	1	4	63	673	1920	0	1	TATATAAGTGTATGAGCTGAAGAGGTCTGTAACCCT	`aba\L[a[_\aaa[VT`]_V\_a`YZ\_UZ_^`]a	chr10.fa		3800456	R	29C6	93					
+HWUSI-EAS610	1	4	19	879	39	0	1	CATTCTAGTTAGAAGGAGGGTAGCCATCCTCCACTG	OXVW__a_\]__[[_^a_\_`]ZU_baUS]TQ_I\a	chr10.fa		3800830	F	36	118					
+HWUSI-EAS610	1	4	14	636	1774	0	1	TTCTCTGAGCTGCAATAGGAAGAACTGCATTCTAGA	aa\^VW_`^``_QZaW[TO[``_a]Y`\XWHZ[]``	chr10.fa		3800870	F	33T2	84					
+HWUSI-EAS610	1	4	67	437	196	0	1	ACAGTAGTACAGCACTGCCTTTTTATATCATATTTT	aa`aa]\Zaab_^`a_]W^]Z[`a`_a`SSa]aa[_	chr10.fa		3801107	F	8G27	81					
+HWUSI-EAS610	1	4	42	567	569	0	1	GCAATGCCTCAGACACAGCTGGCCTAAAAATTAGCA	ab]aab_aaaaabaaaaa_```aaa_a`aaaa```a	chr10.fa		3801263	F	22A13	81					
+HWUSI-EAS610	1	4	15	880	608	0	1	GAAAGAGTCAGGTCCCCACAAACTGGAGTGCTGACT	a[___\`S]`__XZUZ__\^_^W^_VV]W_WU^UV_	chr10.fa		3801313	F	1G34	87					
+HWUSI-EAS610	1	4	96	376	1243	0	1	CAACTTCATGTCCTCTCTCTTCCATAAAAATCCAGA	aQJ_aaaa___```a_`___^`a`_^Z[^`]^_^_]	chr10.fa		3802376	R	36	118					
+HWUSI-EAS610	1	4	97	1448	1552	0	1	TGAACACAACCACTAGGCAGACAGAGATGATTGGTA	`baba]\ab[_a`aYQHXa\VO`V[HY`a_a[a][a	chr10.fa		3803012	R	36	117					
+HWUSI-EAS610	1	4	70	342	2013	0	1	TATAAAATGTGTTCTATTAGANGATACTTAAAATAA	aba^a^abb_babbabba]a\D^babaaa`a__aab	chr10.fa		3803735	F	21T14	110					
+HWUSI-EAS610	1	4	26	710	427	0	1	ATTAACATTGTATTCCACAACTACACATTTCATCAC	aab`_`a^aaW_aaa_a``_`b]O\SL\X\X`a__`	chr10.fa		3803795	R	36	118					
+HWUSI-EAS610	1	4	20	101	1659	0	1	GGCCCTTGGTCCTATGAAAGATTGATGTCCCAGTGT	abbbaa_ab]abaa`bZXXaQa`b`_a__b_\`Qa\	chr10.fa		3804091	R	36	21					
+HWUSI-EAS610	1	4	87	571	1206	0	1	GAAGGATCCATGGATCCAAATGCATATGTAGCAGAG	]_R`^aaaaY`bbW]a_]\ZT^]^SY^[VXa_\b_b	chr10.fa		3804158	R	36	41					
+HWUSI-EAS610	1	4	32	1232	1078	0	1	TGAGTGGTGCATGGTGTGTTATTCTCACTCTGCATT	abab^a`]b_`aab^b`aaaaaa]`\__^_`^_a``	chr10.fa		3804684	F	17T18	81					
+HWUSI-EAS610	1	4	64	360	583	0	1	GTTTGGAATTTATTTAGTCAACATCATCTTAATACA	`[``aba[_bb`aaaU`]aZUa]aaR__Z__[Wa_`	chr10.fa		3805936	R	1G34	87					
+HWUSI-EAS610	1	4	26	671	1342	0	1	CGAGGTTGACCACTTGTCAGGCTTACTCGTTTTACA	abP`b]abaa`a`a`a]``a__aa\__`a[_aa___	chr10.fa		3806134	R	2T25A7	60					
+HWUSI-EAS610	1	4	45	35	209	0	1	AGGCAGGTCAGGGTCTGCTGGCAGATTTCCTGACCT	__aa`a_W`^`aaS^J[a\```Q`X[^_^a\a__a\	chr10.fa		3806296	F	36	22					
+HWUSI-EAS610	1	4	62	794	252	0	1	ATCTGCAGCCCTCCTGATTTATAACTTTTGTCTCTT	aa``a__a^^`_^^aa^`aa`a``^`_`__Z^`Xa`	chr10.fa		3806535	F	20C15	82					
+HWUSI-EAS610	1	4	76	1445	1043	0	1	GTCTTTCCTATAAACATCCTTACTCTGCCCTGTCCC	a_a]a`_a_`aa`a_a`^aa_`__`_a]\]`[T__a	chr10.fa		3806584	F	9T26	82					
+HWUSI-EAS610	1	4	66	458	25	0	1	GTTGAACAGTCTTCTGGGGGTGGGGACAGGGCAGAG	`\``Y\^\`Z^````a^``^R^^\^]TT\]^TT\T\	chr10.fa		3806606	R	36	119					
+HWUSI-EAS610	1	4	60	1391	992	0	1	GCCCTGTCCCCACCCCCAGAAGACTGTTCAACTTTG	a_`ab`aaa^Xaabaaabab`W\X```aZX\_a]_a	chr10.fa		3806610	F	36	119					
+HWUSI-EAS610	1	4	84	166	1263	0	1	ATTTTGCTATTAAAATATAAAATCTAAACAAAGTAA	aaaaabba_aaaaaa`[`Z\^]abaaaaaa`YaZ^a	chr10.fa		3806800	F	36	119					
+HWUSI-EAS610	1	4	80	415	818	0	1	CGCAGATCATGTGAGTGCATATCATGTATGTTCTTT	aa`aba``aaa_b[aXbaaa_^a`aa\[aa___a``	chr10.fa		3807860	F	1A25G8	49					
+HWUSI-EAS610	1	4	35	1153	950	0	1	TTATCCAGACTAACTAGGGGGAACAGGGAAAATATC	]ba`[_[a_Z^SSVa^]^a\`\Z[_`^X^ZX^\L[_	chr10.fa		3810484	R	17AA17	46					
+HWUSI-EAS610	1	4	89	1783	1264	0	1	GATTGATATCAGCTCTGAGTTTGATTATTTTCTGTT	aXa]`_aaa\[X]__\YUa[__N[_^\_^^]]__]_	chr10.fa		3810603	F	36	30					
+HWUSI-EAS610	1	4	86	1214	1499	0	1	GGGACCAGAGATACCTAATTGGTGATTCCTAGCCGT	`a`a`_`a_a_]O]U``Y_aa_MX^_a^\_^_\W`X	chr10.fa		3813275	F	34A1	82					
+HWUSI-EAS610	1	4	97	542	1799	0	1	GTCTATGTAATGGGGAAAATAATATAGCCCATTTTC	a_bbaaa\a_XYVabababaa^\`a`a`aW`a``aa	chr10.fa		3813560	F	36	119					
+HWUSI-EAS610	1	4	61	1650	15	0	1	TTTCTGATAATATAAGTTTAGGAGATAGCAGGTTGA	a^a[`\__^T`__`TaSaa``^`R]Y_Q\\Q`WNS^	chr10.fa		3813999	R	36	118					
+HWUSI-EAS610	1	4	20	745	761	0	1	GTACATTCTCGACTAACCACATGAAGGAAAATTATT	a^__`aa_`_``^``___`__aa`_``__aZ^^^`a	chr10.fa		3814115	F	5G3T26	45					
+HWUSI-EAS610	1	4	56	722	432	0	1	TGAAGCATCAAAGATAATGTTTAACGATATAGCTTA	ababaa\aaa\^`^aV]\^U`aa\]a^XOX^a]_\Q	chr10.fa		3814153	R	11G12T11	50					
+HWUSI-EAS610	1	4	60	480	1187	0	1	CTTTTCCAAGCTAAAAGGAATGTGAAACAGACAACC	`bbbbabaaaabbbaaba`aaa`aaaba`a__``_`	chr10.fa		3814307	F	15G20	81					
+HWUSI-EAS610	1	4	87	243	120	0	1	GAGGTTCTATATCAAGGCTATAACATGAATAAGACT	_N_aPU`a`_]FVa[[]__^]^^Y\[]RGGW_\H]Y	chr10.fa		3814595	R	36	114					
+HWUSI-EAS610	1	4	71	1045	1277	0	1	TGCTTTGTCTGAATGGCAATGGAGACAGAGACGATG	`b\XU\`H[^RSV^bY[XZUX]WGYTNVSXUBBBBB	chr10.fa		3815511	R	23T7A4	82					
+HWUSI-EAS610	1	4	95	1231	1004	0	1	CAAAGAAGTTGATGTGCTTTCACTCTGAAAGAGAGA	`ababaabU`_aaa_a^aaaa`]\\ab`_`b_baba	chr10.fa		3816082	R	36	119					
+HWUSI-EAS610	1	4	90	203	682	0	1	ATTGAATTTACAAGGGTGGCATTAGTCAGCTGTGTT	Taaa^]a[bb_V_aa[_\aabaaS[]]]]aaa_a__	chr10.fa		3816187	R	36	119					
+HWUSI-EAS610	1	4	23	1717	1963	0	1	GAAGTCAAATTCACAACTGTTTCTAAGAACTGGTAA	aXX_SWaPV_`^\^^^Y^`]^_\TX]]Y^YVW\[[[	chr10.fa		3817240	R	31A4	91					
+HWUSI-EAS610	1	4	65	129	935	0	1	ACTCCTTGTTCCATTCCAACTTCTTTGGAGGCAAGT	aa[aaa`a_`aaaaaa`PT`_`a^`____a`_a_\T	chr10.fa		3817811	R	36	119					
+HWUSI-EAS610	1	4	25	4	1697	0	1	TGTCAATGAAGCCATCACTCCTTGTTCCATTCCAAC	aa_a]abbbaababbbababaaaaaaaa]abab`aa	chr10.fa		3817827	R	36	119					
+HWUSI-EAS610	1	4	46	224	533	0	1	TTTAGTTGAATGCTGATCAATTCCATCTTTATCTTC	aaaab_a`aaaabaababa`aabaaaaaaabaaaaa	chr10.fa		3818164	R	36	119					
+HWUSI-EAS610	1	4	39	1366	543	0	1	GGAGAAAGGACATTATGGGACAGATGCAGATATGAA	aZ^_QVYTX]XZ_U]YMLLV[_YLOSSOJZRXO^^U	chr10.fa		3818214	F	36	116					
+HWUSI-EAS610	1	4	6	1245	1300	0	1	GGGTGACTCTTAGTTAGGTATCACTTTTTGTGTTGG	`_aY`a_\W_V^]X_aa`Ga___]`a__a]^_R]^]	chr10.fa		3818463	R	36	118					
+HWUSI-EAS610	1	4	37	90	1293	0	1	AAAAGGGGCCTAGACATATTGCCCTGGTGCCTGTAC	aL]aa__aba`aa^a`VGY^\aaa_a[S`a``aW_a	chr10.fa		3818556	F	36	118					
+HWUSI-EAS610	1	4	53	1748	1723	0	1	AAGCAATCATTCTCTGAAGAATCATCTTCATTGAAT	a`_aa`__a]_____`^]`___^_^^_\][__T__`	chr10.fa		3819187	R	36	119					
+HWUSI-EAS610	1	4	63	265	1131	0	1	GACAGTTTAAATGGTGGAAAGAGTATGCATGAAAGA	a`]H]\ba^^]`bb_b`]^`aaaZ_aaZ\^`````_	chr10.fa		3819402	F	36	118					
+HWUSI-EAS610	1	4	64	265	1211	0	1	CACAGGGATCTTCGCAGATACTGGTCTGTCAATCTT	aaaZbaa_`aaaaaaaa]^``__a^a_a_^^^^`]X	chr10.fa		3819605	R	36	119					
+HWUSI-EAS610	1	4	73	1578	1522	0	1	GTATCCTTTCCCTTCAGATAGGCACTTTGAAGGTCA	aZ``]Z[^SR[YSTWXPTGY__^^WVX_ZV[Y[VSZ	chr10.fa		3819963	R	36	28					
+HWUSI-EAS610	1	4	37	1537	992	0	1	AAGAACAGAAATATCATTCTGAGAAAATAGTTCAAG	a``aaa`[^aa\aaaaa`\a^^^`]W[]_\^`_^aa	chr10.fa		3820070	F	36	37					
+HWUSI-EAS610	1	4	66	385	1340	0	1	TGACATCTTTACGAGTGTCCACTTAAATTTCTGGAA	a_bb_abbbaabb\a\\`ab\abb\bbb`bbbbbaa	chr10.fa		3820280	F	23C12	80					
+HWUSI-EAS610	1	4	15	512	1521	0	1	GTGGTCTCTGTTTCAACATCTGTACACGTTGGCAGA	aNa`PYa`\`_`aaaaa`a`a`Z`aY^Y^_a]\_`]	chr10.fa		3820330	R	36	66					
+HWUSI-EAS610	1	4	90	901	268	0	1	AGTGGTACTAATGTTGATACTCTTTTTAAACCATCA	aa\aa^a]aa__a]_a`^a`a]`_aab_aaW^a_^`	chr10.fa		3820577	F	36	119					
+HWUSI-EAS610	1	4	74	1175	852	0	1	TTGTGGATAAACTGTACACTGAGTTTAATTCATCCT	a`a^a^_^^`a]a`Xa_a_\`_a]a_``_^W`_]__	chr10.fa		3820834	F	36	119					
+HWUSI-EAS610	1	4	92	776	1791	0	1	TGCTAATATTTACATTATTTCCTTTCACCTTCATTA	aa_aaaaa`__``bbb_```__a__aa`aaaa`aaa	chr10.fa		3821333	R	27T8	82					
+HWUSI-EAS610	1	4	12	1576	1555	0	1	AATTGAAACTTCTATTTCAATATGCCCAGTATGACC	a`S]aP]\QYU^YXTDTTRRYU\WQGQRPIOX^]SB	chr10.fa		3821528	F	24T11	88					
+HWUSI-EAS610	1	4	17	8	1419	0	1	TAATATTTAAATCAAAAAATTGGGAGCCTCAGTTTA	aa]bababQ^_bbbba`_aaaabaababababa_a\	chr10.fa		3821816	F	12A15C6T	10					
+HWUSI-EAS610	1	4	17	688	11	0	1	GTGTATAACATTTGTACAGAAGGAAAGCATTCACCC	aX[^_a`a`^_aaaUaYaZS^^`\aa\\^^^]]Z]^	chr10.fa		3823573	F	36	119					
+HWUSI-EAS610	1	4	86	1397	1032	0	1	CAAATTGGTTTTTTTTGTTGTTGTTGTTTTTGTTTT	ababbbbb`bbbbbbbbabbaababa]N_aaa`aba	chr10.fa		3823980	F	36	49					
+HWUSI-EAS610	1	4	91	1368	1926	0	1	AAACACAAGAATGGTCTCCACATAACCAGGACACTA	abbaa`baa^aaa^_`a^__`aa`a``]a__^a__]	chr10.fa		3824167	F	36	119					
+HWUSI-EAS610	1	4	37	638	318	0	1	CAGCCCACCCCTCATCATCCTGCCTACTCAAAATGC	aaabaaaaa`aaaaa`aa`_`a``aa_a`aa]aaaa	chr10.fa		3824229	F	36	119					
+HWUSI-EAS610	1	4	67	1238	479	0	1	GTTTTTTGAGACAGGGTTTCCCTGTATAATCCTGGC	aaaa_^_]\ZU\[`]]PYW[_[[WK[T[^_]VRVLV	chr10.fa		3825134	F	36	12					
+HWUSI-EAS610	1	4	18	813	356	0	1	GAAGCAGAGCGTGGTGGTGCACGCCTTTAATCCCAG	`a_]`\PU_`aK\`UX_M`^\WYS_^^]\\^Y]UZT	chr10.fa		3825242	R	36	13					
+HWUSI-EAS610	1	4	21	131	867	0	1	GCCTTGGCTCCTCCCAGTGTTCTCATTTGTATAACT	aab``^Uaaab[abaYa]^Ta`[a^_a`a__a_a`_	chr10.fa		3825657	R	35C	83					
+HWUSI-EAS610	1	4	39	618	1358	0	1	GGTGAAGCCTGTTTCCATAACACTGAATACCACCAG	`baaZZ`aaaa`a`V`aaaaaa_aaa`_a_^a_``a	chr10.fa		3825864	R	36	119					
+HWUSI-EAS610	1	4	54	749	240	0	1	CAATGATTGACCGTAACCATTTGCACCCCCTAAATT	`babaab`Zaaaa\a_`bbabbbaa_]b`aaaaaba	chr10.fa		3826344	F	36	119					
+HWUSI-EAS610	1	4	23	298	1861	0	1	CAGATTTCGTCATCATATTTGCCAGTGATAGACTCT	aba^]WU_aXWZXab``X]_\\a_[P\a_a`]__]R	chr10.fa		3828257	F	36	119					
+HWUSI-EAS610	1	4	50	449	463	0	1	AACCCAGAGCTCAGCTGGACCCCATGCAGCAAAGTA	aaaabaaaaa`^aaaaa^aaaaa^]^`a^[_]_`Ya	chr10.fa		3828360	F	28A7	84					
+HWUSI-EAS610	1	4	45	438	1844	0	1	CAACAAAGTATGCTGCCCAAGTGGATGCCCTTGGTG	aaaa`a]a\`a_a``aa_`ZaV__`\___\\\\_PQ	chr10.fa		3828386	F	36	119					
+HWUSI-EAS610	1	4	62	844	429	0	1	TGAAAACTGGCATTTCAACATGTGTATTGTATTTAT	abaaaaaaaa__aab`a``a`a_a[`aaa_^aa`aa	chr10.fa		3828650	F	36	119					
+HWUSI-EAS610	1	4	87	1519	924	0	1	TAACTTTCAAGACCATGGCATCCAGTGTTGGCAAAA	VaZRab^a_bY`[]_W\SNWR^`_]Z\^]Y\P`R^\	chr10.fa		3829397	F	36	118					
+HWUSI-EAS610	1	4	25	1583	717	0	1	GATTATTAAAGGGATTGCTATTCTCAGAGGCAACAA	aabaa`aa``T^^[_aa`aaa`aa`a^`^X`a_[_`	chr10.fa		3829668	R	36	119					
+HWUSI-EAS610	1	4	40	806	1859	0	1	ACAAATTGTCTCATTTGCCCTGTGCTTTTCCTTTAA	a`aa[aa]]_a_`aa_^_a_\XV`^`aa`[Zaaaa_	chr10.fa		3829958	R	36	119					
+HWUSI-EAS610	1	4	49	1448	368	0	1	ACAAATTGTCTCATTTGCCCTGTGCTTTTCCTTTAA	aaaaaa`^``a_`aa`[`_^`[Wa^a``a`_a`a_`	chr10.fa		3829958	R	36	119					
+HWUSI-EAS610	1	4	89	910	1004	0	1	TGGATTCTGTATCTTTATTTCAAGAGCCTGAGCTTG	`aYYaaLZ`_HZaX`\aZSNU[_R`PWJZT[RU`\Y	chr10.fa		3830053	F	36	117					
+HWUSI-EAS610	1	4	56	1238	1212	0	1	ATCTCTCAGGGTGTGTTTATACAGAGATATTCAAAT	ab`aaa^```aX`[a`a``aa]aa`a____a`_^_a	chr10.fa		3830291	F	36	119					
+HWUSI-EAS610	1	4	55	533	405	0	1	CAAACACAGACTCAGCCATGGCTCAGGAGAAGAGCG	ab`abaabaaaaa^^aaaa_aaa]V]`Y^^a```_]	chr10.fa		3830436	F	36	119					
+HWUSI-EAS610	1	4	19	337	456	0	1	AGGGAAGAGGAAACTTCTATCCAGCTGTGATGCATA	`a_a_aa`aaa`aaa`__abaaaaa_``a``b``W\	chr10.fa		3830890	F	36	119					
+HWUSI-EAS610	1	4	69	342	128	0	1	GGGAAGAGGAAACTTCTATCCGGCTGTGATGCATAC	a_a\_b`[\^aa_aaaaaaaaa_a_]N[RT[][\Z_	chr10.fa		3830891	F	21A14	81					
+HWUSI-EAS610	1	4	58	1082	1531	0	1	GTCATGTCCCATGTGAGAAGGAACAAACGCAGAATG	aaaaa`___]_`a^aR[Waaa]a]`a_]a^]aU]_`	chr10.fa		3830946	F	36	119					
+HWUSI-EAS610	1	4	37	343	1056	0	1	GAAGTCAATTTTGGGTCACAACTGACCCTAGCCATT	a_a`]aYa_`___``]a^a^]_^__]^`]Ya_``__	chr10.fa		3831169	F	36	119					
+HWUSI-EAS610	1	4	63	1536	1048	0	1	CAGGTCACCCTCCCCCCACTACCACCACAAGTTCCA	`aX_Z_Z\`^```^``a`_a``^\]````_^\\^\\	chr10.fa		3831299	F	36	119					
+HWUSI-EAS610	1	4	32	1293	1420	0	1	AAAAAAACAACAACCAAAAAAAAAAAAAAAAAAAAA	aaabaaa`aa`ab``aaaa`^_aaa`aaaaa`a`a`	chr10.fa		3832011	R	36	18					
+HWUSI-EAS610	1	4	21	301	243	0	1	ATAGACAACCAAGAAACCTATTCCAATGCAAGTAAC	aaabaaaaaaaaa_\_aaY]_^^a_`_^^W__^`_`	chr10.fa		3832330	R	36	119					
+HWUSI-EAS610	1	4	85	890	555	0	1	ATGAGTCATGAAAACCTTCCCTGTCTGTGAAGGACT	aaaaa^abaaa^aa\a`_`a``aW_`aZa^]__Z_`	chr10.fa		3832562	R	36	119					
+HWUSI-EAS610	1	4	9	778	1021	0	1	ACTTAATTCACAATAATTGTTAGGAATCTAAGGGAG	S_bbbbb`bbb`ababbb`bbabbbbb`bbbbb_`a	chr10.fa		3832622	R	36	119					
+HWUSI-EAS610	1	4	31	617	1623	0	1	AAGAATGTGCCTCAATGACAGAGGGCATTCTTTTAC	U\^[bbbR`^Y[aabb`T][VG_P[Z_[__aWTYX`	chr10.fa		3832815	R	36	118					
+HWUSI-EAS610	1	4	10	829	1072	0	1	AGTTTAGCTGTTTTGGAATATTTTTTGCCTGTAACC	`a]abaa_a`]aabaaa_aaaaaa`aaa^aa]aa``	chr10.fa		3832968	R	36	119					
+HWUSI-EAS610	1	4	87	892	829	0	1	GTTGCTTACAGCATTCTGGTTTCTCTGGATCCCCCA	aaaaaa_]_aaaaaa_aaa_``[`^_a]a_]\\__a	chr10.fa		3833136	R	36	119					
+HWUSI-EAS610	1	4	63	744	13	0	1	ACTCAAATATTTTACCATGGTGAATCAAGGCTGACC	a`a__a`a_abaaa[^a`aaX`_^`_`_]^\_`^]]	chr10.fa		3833288	R	36	119					
+HWUSI-EAS610	1	4	59	23	407	0	1	TAAGAAGCTAGAGTCAAGAGCTCCAGGATACTGGTT	^\[`_^Z_]aZO_W\XSRW\`U^^W\O_``ba^[MU	chr10.fa		3834350	F	36	19					
+HWUSI-EAS610	1	4	49	1103	121	0	1	CAAGCCTCAACAAATACAAAAATATTGAAATCGTCC	ababaaaaabaaa`bbabbbaaaaab`aa`a_a_``	chr10.fa		3837949	R	36	17					
+HWUSI-EAS610	1	4	6	1135	222	0	1	GAGTTAGTTGTTGCAGTTGTCTTTGGTTAGATCTTG	a_aP`P\T^Z\^_X]_]^XU]_]ZY\^V[[XVX]]_	chr10.fa		3839801	F	36	18					
+HWUSI-EAS610	1	4	43	1669	257	0	1	ACAAGAGGCTTTGAGAAAACATGCTCATGCCTATGG	\N_\_WZQW\ZXVVSXL`XUYWWHZRWUBBBBBBBB	chr10.fa		3841055	R	23T12	71					
+HWUSI-EAS610	1	4	98	129	1664	0	1	AAAGATACACTGGGAATCACTTTGTAAACTACAAGA	aZXYW^baa]]a_^Y\^aYaP\_`T^[^aT_a^OVU	chr10.fa		3841085	R	36	118					
+HWUSI-EAS610	1	4	77	1355	1948	0	1	ATGATCCCATAGCATGGCCACCATGAATAACTATGC	aaaa[^LL]]]]\\]ZV\[`WUVNYa[^[a[Z`[[^	chr10.fa		3841840	F	9C26	84					
+HWUSI-EAS610	1	4	12	802	1504	0	1	AGAGGAACAACAAAAGGAGAAGTGCACTGCTTTTCT	ab[aa_a`aa\Y]Taa__`S^`Za^aY_`__`_a^a	chr10.fa		3842411	F	1A34	80					
+HWUSI-EAS610	1	4	47	31	572	0	1	AAAGCATGGAAAAAGAAAAGCAGTGCACTTCTCCTT	XTZbba`bbbb`TZ`R[SS_aVa^aaSXaaaaa][`	chr10.fa		3842424	R	36	119					
+HWUSI-EAS610	1	4	56	1329	1865	0	1	AACATAACAGAAAATTTAAGGATGTAGAACTGTTTA	aa^^b`aXab[a``bb`aa]a`aa^`[Z`[`aX`aa	chr10.fa		3842799	F	36	119					
+HWUSI-EAS610	1	4	29	995	1616	0	1	TGGTCCTCACCATCCTGACTTGTATGAATTTGCTAG	a`YYHQ^\SO_aa]_aa_U[][LDPYV^]Y\[WWX]	chr10.fa		3842877	R	36	115					
+HWUSI-EAS610	1	4	24	427	339	0	1	CATGTACACAGAATCTCAGCTGGGCAGTGGTGGGGC	aaaaPa]_`[`]^\\Ua_^a^a\_`[UGMYMWBBBB	chr10.fa		3844376	R	20A12T2	63					
+HWUSI-EAS610	1	4	82	991	1776	0	1	AGAAAAGTCACCAAATAAGGAACTAGCAAGCCCCAG	`bbbaaa]abaab_aaaabbab^[ab`[aaa_^`aa	chr10.fa		3844949	R	36	119					
+HWUSI-EAS610	1	4	85	514	1009	0	1	CTGTGGGGGCTGTAGGAGTGGTAACTTCCACAGAAG	`R\ZP_S`Wa`\Z[\]][]XYXa[K\XPRDXa]GS^	chr10.fa		3845281	R	36	13					
+HWUSI-EAS610	1	4	3	247	558	0	1	ACAGCCCCCACAGGAGAGGCATGGGGATATCAGTCA	a_aZ]__a``_^a^\a_aa_Z\]G]]]V\ZVP[W[Q	chr10.fa		3845304	F	23T12	28					
+HWUSI-EAS610	1	4	19	1593	725	0	1	GAGAAAAGAGCTAGAAAGTAAGAAAGGTGAAAGCTT	^^a\b`W]_Mbabaa`a`Zaba_`a\^MVW\_[La`	chr10.fa		3845457	R	36	25					
+HWUSI-EAS610	1	4	63	104	1220	0	1	AGAAGGCCATCCTATGAGCTTTGGGCCCCCTGTACC	^^\_\_``a`]MTT]WT^XW^a^]]_WUU[]]ZLL_	chr10.fa		3845682	F	36	118					
+HWUSI-EAS610	1	4	23	1089	884	0	1	CTAGTGTAATGATGGTACAGGGGGCCCAAAGCTCAT	^a]_abYaabb`abaWa_X_a_aa[_aaZ_a\````	chr10.fa		3845695	R	36	119					
+HWUSI-EAS610	1	4	88	540	1260	0	1	AAAGCTTATTGAGTTGTTGGCCAAAAGGACCCATGG	^[ZaS]`aTaaR_^a`_^]W```]_T_`\`__TX`_	chr10.fa		3845989	R	36	119					
+HWUSI-EAS610	1	4	3	827	1589	0	1	ATTCTAGCTACGTCTCCCTATGTTCCCTCCCACAAC	aaaaaa]\a__X__`^[`]__`YZZU_\_^^_\`\\	chr10.fa		3846164	F	36	119					
+HWUSI-EAS610	1	4	49	1159	1362	0	1	AATGGGAGGATCAAGCAAGGAAGAAAAGGAACTGGT	a`bb`\abbaaaaabababa]``aaaaaa^a``_`\	chr10.fa		3846200	R	36	119					
+HWUSI-EAS610	1	4	25	399	1945	0	1	AGCATAAACTAAACAAGGACAACAGAAGTAGACATG	Uabbabaab`bbbbbabbabbabbab_b\baaaaaa	chr10.fa		3847499	R	36	119					
+HWUSI-EAS610	1	4	66	642	970	0	1	GTGTATCTTAGGAATGTCAGAAGATACATCTATAAA	aaa_a```aa^a__aa]aaa``aa_a__`_aa`aaa	chr10.fa		3847557	R	36	119					
+HWUSI-EAS610	1	4	49	859	332	0	1	AATAGTCAGAGGATCAGAGAGTTTCTGTGAGATTGT	aabab``ab`_aaaa\b[a[aaaa_^a[a_]]_a`U	chr10.fa		3847591	R	36	119					
+HWUSI-EAS610	1	4	82	1246	833	0	1	ATATTTATGTCAATAGCATCAAGAATTTAGCTAGAT	a`W^T_Y^aT`Raa_XP_aaTF\Xa`T_[YP`WWXT	chr10.fa		3847893	F	36	117					
+HWUSI-EAS610	1	4	83	453	1065	0	1	TGGCAGCAACTAACAGCTCTCTAATTAGTCTTAAAA	ababb\bb^_`a```abaabaa[`bbbba`_a`a^`	chr10.fa		3847967	R	36	119					
+HWUSI-EAS610	1	4	67	983	335	0	1	GAGTCGTGAATGGTATAAAACAGAGACGTGAGTAGG	a`b`a`a[a_aa]U`aa`_`aaa`a_^`SOZ^BBBB	chr10.fa		3848615	F	36	101					
+HWUSI-EAS610	1	4	50	362	918	0	1	GACGTGAGTAGGACACTACACTCATTCTCTCCTTGC	a_a_[^VaQ^a_]Z`_U\aZ_``_^\_[]\___\^_	chr10.fa		3848639	F	36	119					
+HWUSI-EAS610	1	4	74	1747	401	0	1	GTACTGAAGATGTGGACAGAGGGCTATACTGTGCCT	UQ_abZb`PKVVZJH^aaXXZ[_aaaL\WRRWV^a]	chr10.fa		3849371	F	36	117					
+HWUSI-EAS610	1	4	46	335	2003	0	1	ATACTGTGCCTGCCCAATGACAGGGCTTTTTATAGA	`aTaaa_aaa_a`aa_UZ\\]`]^]_\]^__`XZ\U	chr10.fa		3849396	F	36	119					
+HWUSI-EAS610	1	4	88	1338	992	0	1	ATTTAGTCAAATTTGAATCAGGCTTCCCTCTCTCCA	a\_`QNQZ`Y___\R\_^^_XQGU_ZX]ZX\U]SBB	chr10.fa		3849563	R	36	109					
+HWUSI-EAS610	1	4	64	1607	1582	0	1	GCAGTGCCTGGTCCTGAGTGAACACATGGTTGGTCC	a_aWLVV``^]GHa`Xa`]`a^XZ^XSabXZ`]ZXQ	chr10.fa		3849688	F	4G31	100					
+HWUSI-EAS610	1	4	79	844	107	0	1	TCTGGACCAGTGGTGGTGAGATGTCTATATTCCTAT	a_aaa_[[\]W]]U`_QZQZSJOQSVUWUXYJVOOZ	chr10.fa		3849778	F	36	117					
+HWUSI-EAS610	1	4	56	871	1821	0	1	AAGATCTGCCTGGCCCCAGGAGGTAGCCACTTTTGT	a[`[ba_UXY^RSX]`^Y`a_`]YXQKTNP^\\]VT	chr10.fa		3849945	R	14T21	84					
+HWUSI-EAS610	1	4	11	137	415	0	1	TGACTCCATCTGCTGCTGGATGAAACCTCTCAGGAG	aaTaXaaba]aaa`aa`b_[[`a_aZ^^a_`aZaRW	chr10.fa		3850199	R	36	41					
+HWUSI-EAS610	1	4	85	896	567	0	1	TTCTTGTGGTGTCATTTACCTCTCTAGCTTGCTCAC	aa`aaa_a`]a__`a`aa_\_Z__`_`_`a`]^_^Z	chr10.fa		3850299	R	36	119					
+HWUSI-EAS610	1	4	93	1038	626	0	1	TTGTGTACCACTCCACCGTGAGGCATCTTATCCCAG	abb`b_ba_aaaa`aaaa_ba_a^`a`aaa`_a\aa	chr10.fa		3850582	R	36	119					
+HWUSI-EAS610	1	4	57	67	65	0	1	CATCACAATCACAGCCCCTCCCTCTTTTCTTCCCAG	_^aab_Xaa^R]^\a_`_Y`__[_^^_\^^^`YBBB	chr10.fa		3850685	R	36	106					
+HWUSI-EAS610	1	4	98	1680	1317	0	1	GTAGAAGCACCTCACCCACCGTAGGCAGTAGAATTC	a_`aaa^_aZ_a^`__`\`]_S]_`]__U__\_UVW	chr10.fa		3851094	F	36	119					
+HWUSI-EAS610	1	4	43	1167	1559	0	1	AGCACCTCACCCACCGTAGGCAGTAGAATTCGCTAT	a^\`_N`^a^^_a\^_\_aa]__X\_\[W\U`W_V`	chr10.fa		3851099	F	36	119					
+HWUSI-EAS610	1	4	73	705	222	0	1	ACTAAGGAAACCACTTCACAGTCAGAAGGACAGCTG	_Yb`_`H_aa_a`aaaaaaa`]_aa^[``Y__`_aa	chr10.fa		3851215	R	34C1	80					
+HWUSI-EAS610	1	4	22	158	2006	0	1	TCCTTCTGACTGTGAAGTGGTTTCCTTAGTTGGAAT	^abba_^b`bb``b_`b\bb[bbabba^[ab`][bb	chr10.fa		3851221	F	36	119					
+HWUSI-EAS610	1	4	59	1682	12	0	1	GGGAAGCAGAGAAGGAAGCCAAGCAGAAACACAAAG	`ZWaa]`_[`U^`[Saa^Z_a_R[`Z_`_W`^\\`Z	chr10.fa		3851288	R	36	119					
+HWUSI-EAS610	1	4	82	439	796	0	1	GAATTCTACAAATGAAAGAGCTTAAATAACATTCCT	a]aaaaaa_aa``a]_aa[aaa`a`aa`a``_`_aa	chr10.fa		3851498	F	36	119					
+HWUSI-EAS610	1	4	42	517	111	0	1	GGCTTCCAGGAAATAATGATAGTCACATGACATATT	`[\^\`YN^^a^a^\bVaba`a^\^WaaaZLM[`YZ	chr10.fa		3852092	F	14G21	85					
+HWUSI-EAS610	1	4	34	295	897	0	1	CAACGTCCGAGGAGCAAAGGGAGATCCAGGGATGTG	`\\``[`__[_^_^]\X\\_]]ZY_aaa`ba]_aV^	chr10.fa		3852195	F	36	119					
+HWUSI-EAS610	1	4	15	1707	1517	0	1	AGTGCTTCCACCTGGACCAAGGACTCTGCTGCATTG	abS_\aaZ_a\^]_a`H^^a`aZZ`]R]Q^^\`_^a	chr10.fa		3852864	F	36	118					
+HWUSI-EAS610	1	4	17	890	1541	0	1	ATTTATACAGAATCACTGATTTGAGGTTGATCTGAG	aabaaa[``a__`[[_aa[aaaa^aaX`_`^^_^[a	chr10.fa		3853611	F	36	119					
+HWUSI-EAS610	1	4	38	65	1519	0	1	TTATACAGAATCACTGATTTGAGGTTGATCTGAGCA	`b^^]a`b[_abaaab_``aa`ba\aaa_aaa`aaa	chr10.fa		3853613	F	36	119					
+HWUSI-EAS610	1	4	82	635	1975	0	1	GTGAGGTTTTATCTTATCCATGCACATTCAAAAGAA	a^aaaa\aaaaaaa`aaa`a`a_a]V^_`_aa__`a	chr10.fa		3854348	R	36	119					
+HWUSI-EAS610	1	4	37	604	1825	0	1	TGCATCCCAGCTGTGAACAGGTGCATCATGGTGGCT	a`a\a`a^a``]]T\Z_]]]\O^XZ][^a]ZZR^^^	chr10.fa		3855146	R	36	119					
+HWUSI-EAS610	1	4	56	564	532	0	1	CTGTAGGGATGATTCTGGAAGAAATAGTCTTAGCAG	aaaaaabaaaba`bbaba`ababaa_a__ba_aa`a	chr10.fa		3855518	R	36	119					
+HWUSI-EAS610	1	4	10	174	551	0	1	GGCTACAGTTCATGAGAGGCACAGTGCACACTGTCA	aaababbbabbababaa_abbabb`aaaabaab[aa	chr10.fa		3855670	R	36	119					
+HWUSI-EAS610	1	4	46	74	1326	0	1	ACTCCTAAGGCTACAGTTCATGAGAGGCACAGTGCA	`aab`[XZ`ab`[a\bWaa``aaaaa`b^a_aZ``B	chr10.fa		3855678	R	36	115					
+HWUSI-EAS610	1	4	93	113	200	0	1	CAAACAGAATGAAGGGCTTAAGCTCTAGTCATAGAA	a`Y``aaaaaaba\[`a_]``^`__aaa^a``aa_a	chr10.fa		3856041	R	36	119					
+HWUSI-EAS610	1	4	93	1454	1187	0	1	TTAAACCTAGACAATGAAAATGTCATTTCAACCCAT	aa_^_]^]\_`Z^^`_^]S``a\^W_``^_^YZ^^`	chr10.fa		3856466	F	36	119					
+HWUSI-EAS610	1	4	34	1396	241	0	1	ACCCATAGGATTTTTCAAGTATGCAGTTACATAAAA	aaa^aaaZ_]_^_`aaa`]^a_Y^a`\`a_a`a_`a	chr10.fa		3856496	F	23T12	84					
+HWUSI-EAS610	1	4	1	1577	613	0	1	GTACACATAGAAAGAATTCTGAAGATGTTTAGTGGA	``baa_baY]__`_b__`aaY^^`___S_XaUNF_]	chr10.fa		3856936	R	36	117					
+HWUSI-EAS610	1	4	26	103	1395	0	1	GCTGAGGATAGAGAAGTACACATAGAAAGAATTCTG	abab`bbaaabababb_baabaaabaa^abaaaaab	chr10.fa		3856951	R	36	119					
+HWUSI-EAS610	1	4	98	586	1890	0	1	ATGTGTACTTCTCTATCCTCAGCTAAACAGTGTCTA	aa^Xa```bbbb\babVVV[M_aY^X[`Y`Y\J_ZY	chr10.fa		3856964	F	36	118					
+HWUSI-EAS610	1	4	46	1781	1047	0	1	TGGGACACACAATTGTCTGCAGGTCCTTAGAAAGTA	aa_\]`aa__a^__\W`]]W`YLVW___]^Z]WWY`	chr10.fa		3857376	R	36	118					
+HWUSI-EAS610	1	4	17	1146	479	0	1	CAAACTACTGTTAAGCCACATCACAAGGTAGAATGT	abbaY\babbaababaaabbbaaaaa`__bb`aaa`	chr10.fa		3857938	R	36	119					
+HWUSI-EAS610	1	4	100	1359	1065	0	1	TTTGATCTTCATCAAGAAGATGAACTCCCTTCATAG	aaaaa`aaaa``_aa_`_a_a`_^Ya^^]____```	chr10.fa		3857983	R	12T23	83					
+HWUSI-EAS610	1	4	75	174	16	0	1	TCACTGTTACCTGTCCAGAGTCAGGAAGGTGCTATG	abaabb_abaaabaaaaaXaW`aaa_Xa`Va_^V^_	chr10.fa		3858154	F	36	119					
+HWUSI-EAS610	1	4	97	1179	1658	0	1	AGGTAGAAGAAAATGGGAATACGCTTTTTAAAAGAT	_abaabaabba[abb\a_bb\_aa\``abba^baa]	chr10.fa		3858299	R	36	119					
+HWUSI-EAS610	1	4	43	1150	794	0	1	GTGGGCACTAAAGGGGGCAGGAAGAGGGGGAGGAAA	a\``]\^Z`]ZZ^RSZ`SX^\X]\RZTZPRS\\T\S	chr10.fa		3858362	F	36	118					
+HWUSI-EAS610	1	4	67	1069	1604	0	1	CAGCCCTCCTGCATCTGCCTGCCCAGAGCACAGAAT	a[\a^aaa[Z[__aa_X]_Xa\^V_Z\a^a````BB	chr10.fa		3858420	R	35G	11					
+HWUSI-EAS610	1	4	66	1549	421	0	1	AAGTGGAAAGCACCTGGCAGCCCTCCTGCATCTGCC	__]Z^a````aa^`\X\^`\`Z^\Z]VO\XSX]P\Z	chr10.fa		3858437	R	36	27					
+HWUSI-EAS610	1	4	40	1559	1006	0	1	GAACCTCTCTCCTTCTGCCCTCTCTCAAATATCCCT	[aa_aaa]\_Z[a_`aI_`R`\_\[_a\ZV_]TSW^	chr10.fa		3858571	R	36	35					
+HWUSI-EAS610	1	4	64	1096	1584	0	1	ACAACTATGCTACTAATAATGCACAGGAGTTGGGGT	`_`]]aaa`_a^VZ]a`a``a``^W[_[a]_^a`_Q	chr10.fa		3859394	F	36	119					
+HWUSI-EAS610	1	4	37	1652	1010	0	1	AAAACCGACCAGCTTGGCTAGGTTGGCTGGCTAGTG	a``_^Z[_]]]]]]`T^\\WRBBBBBBBBBBBBBBB	chr10.fa		3859565	R	5T30	23					
+HWUSI-EAS610	1	4	42	744	1958	0	1	TAGGCTGGAAGGAGGAAGGAGCTCTTTCTCAGTCAC	aaZa\aXa\]`a_a__aY__YZ_U]`_\a\\`ZZ^[	chr10.fa		3859641	R	36	119					
+HWUSI-EAS610	1	4	27	575	1418	0	1	GAGAACTGGTTCAGCCTCAGGCAGGTAGCAGGCAGT	aaa`a`aab\``aaaaa`a]Y``aaU`]^`_`\V]]	chr10.fa		3859750	R	36	14					
+HWUSI-EAS610	1	4	56	630	1371	0	1	CTTTGCGAGTTCCTACTAAAAGGCTAATCTGACAGC	ababba]]aaaa_aaaaa_`aaa_aa_``aaa^__`	chr10.fa		3859819	F	36	61					
+HWUSI-EAS610	1	4	80	404	1718	0	1	GAGACTCTTTTGTCTCTAATGGCTCTAACTTGTGTC	`abaaba_aaYaaaa]a_R\`__a`PX]\BBBBBBB	chr10.fa		3860176	R	36	88					
+HWUSI-EAS610	1	4	97	1021	609	0	1	AATCTGGAGGCACAGCTTATACAGAGGCCATGGAAG	`baa`abaa_aaab_a`aab\V^a`]Z`_aa_aT_a	chr10.fa		3860376	R	36	119					
+HWUSI-EAS610	1	4	36	601	1840	0	1	GAATTTGGCTCCCCAGAGAGTATAGATTTTGGCAGT	`aabaa`_baaabb``a`_a_a^a````_a`\^aaB	chr10.fa		3861080	R	36	115					
+HWUSI-EAS610	1	4	89	563	199	0	1	GATGTGAATGACCACAACTGAAAGATTTATATAAAA	abab_bbaaaa]\a`aaaaa`a_b`a`a``aaaa`_	chr10.fa		3861124	F	36	119					
+HWUSI-EAS610	1	4	51	208	824	0	1	CAGGAAATTTAAAAGCTGCTGCTTAAAAAAAAAAAA	aabababaaaaaa``a_aa`a_ab`a`_`_]`aaaa	chr10.fa		3861530	R	36	119					
+HWUSI-EAS610	1	4	93	891	1312	0	1	GTAGCACAGGAACTACAACCAACATTTGACGAATGA	`X^YX\R]``_`ZZ[]`_\ZX\P\_\LPLIDUYXXV	chr10.fa		3861571	R	30C5	108					
+HWUSI-EAS610	1	4	70	484	1507	0	1	AAAAGCAACTGAAAAGATGAATTCATTGTATTCAGC	_WIV^aZQT]WYUXa``ZU]MU]\XZYVLNZR^PT_	chr10.fa		3861694	R	36	117					
+HWUSI-EAS610	1	4	61	951	180	0	1	AGAAAGCTAACTCTCCTCTGGCAACAATCATCAGCC	aba`aaaaaa_`aa_`aa`aa`a_`a`_`a`_____	chr10.fa		3862373	R	36	119					
+HWUSI-EAS610	1	4	7	445	325	0	1	AGAGGAGAGTTAGCTTTCTCCTAGCAACAGGAAGCT	ab`ab`a]baU_NWa]SZ]]_Ma`aaaQa]Ua\\TX	chr10.fa		3862390	F	36	118					
+HWUSI-EAS610	1	4	49	461	1371	0	1	AGAGAATGGATGCACGAATTAACAGCTAGGCTAGCT	a\P^T_`Z`N`]_YW^H^_b]R`X``^W[SUV^]NX	chr10.fa		3863132	F	15A20	83					
+HWUSI-EAS610	1	4	53	860	49	0	1	ATGCACGAATTAACAGCTAGGCTAGCTGCAGAAGTT	`^_`bab_aaaaaaabaaaaa_a`\Z``_XTX\[^_	chr10.fa		3863141	F	6A29	80					
+HWUSI-EAS610	1	4	67	263	1231	0	1	GAGTCTGAGAAGTTTCTGTCTGTCCTCACATCTATC	aab_baab^^]`^aaa_a^aaa__`_aaaa`a__``	chr10.fa		3864814	F	36	119					
+HWUSI-EAS610	1	4	68	611	11	0	1	GGATCTGACTTGTTTCCAAAATCCACTTCATGATGA	^O]^ba`Yaaaa_a]aa`a^U_Y`_Y_^SW^]R\]\	chr10.fa		3865068	R	36	119					
+HWUSI-EAS610	1	4	40	1215	307	0	1	GGTCTGGAGTTAAAGTGAGTGTAATGTTGGATCTGA	S`aab`^__abbaaa_babab_a\ab`aaa_a`a]_	chr10.fa		3865096	R	36	119					
+HWUSI-EAS610	1	4	76	1637	338	0	1	ATTTAATCTGGTTTGAACTGGGTCACTTCACCAGCA	aba`````ZJFR_UU`a`_SNRXa`XT]`_\Y]Q]_	chr10.fa		3865871	R	36	117					
+HWUSI-EAS610	1	4	23	1559	1510	0	1	CTCATCTATCTCTTTTTTCTCCATTAATAACTAGCA	`ab`a`abbab`bbbbbbbbbb`bbbbbbbaba`[a	chr10.fa		3866292	R	36	119					
+HWUSI-EAS610	1	4	27	904	1311	0	1	AAGAAGGAGGCTTGGAATGATTTNGAACACCGAAAG	aabaabb_ab_aaba`aabaabZD[aa_a__a`aa`	chr10.fa		3866328	F	23G12	110					
+HWUSI-EAS610	1	4	3	1729	335	0	1	TGTAGATAGAGATATCCTGAGACTTTCGGTGTTCCA	`aYa``_aT]]__a_^]_`a^a^__]_^YNWG^]_a	chr10.fa		3866350	R	36	118					
+HWUSI-EAS610	1	4	55	1468	1371	0	1	TGTAGATAGATATGTAGATATGTAGATGTGTAGATG	aa_aaW_aaa`aaaWUa_`aaaX\aZ[YXa__`Vaa	chr10.fa		3866549	R	36	37					
+HWUSI-EAS610	1	4	71	1295	934	0	1	ATGTGTAGATAGATATGTAGATATGTAGATGTGTAG	abb_a_^W`a_a_a\aa\_b`a`aa__aX`^YaYY]	chr10.fa		3866552	R	36	36					
+HWUSI-EAS610	1	4	48	1152	1801	0	1	CTAATGTTTTGTTCGTGGCCAAAATAGAATCAGAAG	abbb`bb`^a`]aZU`_bWT\ba`aabWaaUbaa`b	chr10.fa		3867459	R	36	119					
+HWUSI-EAS610	1	4	51	1722	764	0	1	ATGTTGACATCTGTATGTTGCCTCAAATTTATTTGT	`b\^^Pa`aa_^UWa_^^^\^`aaa^Z^`____^\^	chr10.fa		3867604	F	36	119					
+HWUSI-EAS610	1	4	17	355	1423	0	1	ACCTCTCAGTTTCCTTTTGATACAGACATGATGTTC	aaa`aa`aa_aaaaa``a``_aa_a``]_a^_`Z_`	chr10.fa		3867953	F	36	119					
+HWUSI-EAS610	1	4	78	993	1773	0	1	AAACAATGGGGACCTTCACTGGATATAAAGGTTTCC	aa``aa``a`a_``aa`a_aa`Z__``\^__U__^`	chr10.fa		3868363	F	36	119					
+HWUSI-EAS610	1	4	60	1775	894	0	1	AAGGAGAGGAGGAACCAGAGTCTCTCAGAGCAACAT	a]P_`S^\_a`]_a_a`_aS_``[_ZYYSVU^QGVT	chr10.fa		3869375	F	36	117					
+HWUSI-EAS610	1	4	90	972	1597	0	1	AAGGAGAGGAGGAACCAGAGTCTCTCAGAGCAACAT	`a_a_^`aa`a`T_Xaaa]_U\_Z]Y]]]^[^ZV[`	chr10.fa		3869375	F	36	119					
+HWUSI-EAS610	1	4	26	690	1303	0	1	AGGACAATCATCAGATTCCAGACATGAGAGCTAGCA	aaa_aa``_a`_aa__a_^_``_]^`^_]_^^^_]^	chr10.fa		3869566	F	36	119					
+HWUSI-EAS610	1	4	6	1202	780	0	1	GGAAGATGGATAAGACCTGAGGATGCAGGAGAAAAG	abaaa`Z`aUU_`Z[Z^Xaaa`_]_Z]\TS^__W^^	chr10.fa		3869672	F	36	119					
+HWUSI-EAS610	1	4	19	876	603	0	1	AGATCTGCTCCCTTCTAAAAGAACTACAGAGCAATT	a_\\abaa^^^``b_baaaaa`_aa`a^a^__\Ya[	chr10.fa		3869989	R	36	119					
+HWUSI-EAS610	1	4	84	1181	1439	0	1	AGATCTGCTCCCTTCTAAAAGAACTACAGAGCAATT	aaaa`aaaa_^`aa`a`a`aa^a_```a`^_[\_`a	chr10.fa		3869989	R	36	119					
+HWUSI-EAS610	1	4	61	1339	1699	0	1	TAAGTATANCCTGCTCAATGTTACTTGCATGCCTGT	aJa`^ORNDX_[^aZG[__a]RUZ]S]\X^^OV]]X	chr10.fa		3870522	F	8G27	108					
+HWUSI-EAS610	1	4	52	976	1068	0	1	GCACTAAGTCTCCAGGTCCACAGCAGAGTGCTAGGA	a``_aaaa]`aa`aaa`^`a\`a]`a\_W^\\\```	chr10.fa		3870741	R	36	119					
+HWUSI-EAS610	1	4	17	36	1019	0	1	CGGGACTAGGGAAACCAGAGGGTTTTCTTCTGTTTC	abaaaaa]baa_`abbXa[aaaW_a`aa`a`a\__a	chr10.fa		3870808	R	36	119					
+HWUSI-EAS610	1	4	81	1095	208	0	1	CAGCCATCTTCAGAACAGCTTCCTTCTCAGCAGATG	abbbabb``babaabaab`baaaaa_a`aa`]^`ab	chr10.fa		3871004	F	36	119					
+HWUSI-EAS610	1	4	36	1525	52	0	1	TGTGTGACAATCATGATGATTTAGAGAGCCTTGTTT	\SX[OMX`Z`^]YZJT_W]^][\PTN]FD[JPRL\`	chr10.fa		3871193	R	36	113					
+HWUSI-EAS610	1	4	100	1302	1620	0	1	TCTAAATCATCATGATTGTCACACACATATAATCTC	a[`a__[VW\^_\^^ZZ][]`__\\L]YW\^^U\^X	chr10.fa		3871204	F	36	118					
+HWUSI-EAS610	1	4	42	385	1315	0	1	TGGGAAGTGTTTCCTGCGAGCAAAAAGAGGCTGTAT	a_ba_a_R_O_S`\a]F[Za[XXUXWWP\```_BBB	chr10.fa		3872134	F	16A19	23					
+HWUSI-EAS610	1	4	86	1219	801	0	1	TGGGAAGTGTTTCCTGAGAGCAAAAAGAGGCTGTAT	`b\a^^bY\`a^^abbab`abaababa]aaa`ZGZa	chr10.fa		3872134	F	36	34					
+HWUSI-EAS610	1	4	27	872	1310	0	1	GGAATACAGCCTCTTTTTGCTCTCAGGAAACACTTC	aaa`a]_`___a^aaaa__``____[`]WZZ^]_`_	chr10.fa		3872137	R	36	34					
+HWUSI-EAS610	1	4	37	317	542	0	1	ATGCTGCTGTCTTTCACTGTAACTTGGCTGTAACAA	a`aa`b`^a`aaa__`a_a___`_aa``_`W^YVW_	chr10.fa		3872416	R	36	49					
+HWUSI-EAS610	1	4	10	940	1070	0	1	ATGTTTGTATGGCAAGTTGACAAGGGGTCAATTGTA	aaa\````a`aaa\_b[aba^``a_aaX_a^a`aV]	chr10.fa		3872876	F	36	34					
+HWUSI-EAS610	1	4	30	1200	742	0	1	AAGGGATTCTCAGCAGAGAAACAAATCCCTCCTAAG	_Y_a^Ra`__][_[`aWa``_[aY[_YFQUN]^_[`	chr10.fa		3873371	F	36	117					
+HWUSI-EAS610	1	4	20	357	1232	0	1	TGTTGAGTTCATTTTTCTGTCCATCTACTGCTGGGC	ab[a_`b`abbaabaaaab_bb`a`aaa_aaW`__b	chr10.fa		3873417	R	36	119					
+HWUSI-EAS610	1	4	37	309	1822	0	1	TGTTGAGTTCATTTTTCTGTCCATCTACTGCTGGGC	abaabab`bbbbbabab`babbababbb[ab]aa`b	chr10.fa		3873417	R	36	119					
+HWUSI-EAS610	1	4	10	1178	1896	0	1	AGGAACATCTCTCCATGGCCTCTCATCATCTCGTGC	X_Z_\F^bXbbb\RZ\Q^X\a[\bbW[RMO]VH[I\	chr10.fa		3873846	R	32C3	15					
+HWUSI-EAS610	1	4	23	818	625	0	1	GCAGGTGCTATGATAGTATACATAAGTGACCCTAAA	a`_a`U_W_a``_``_]_`_^`___`G_^Z]ZZW__	chr10.fa		3874490	F	36	12					
+HWUSI-EAS610	1	4	27	1362	1813	0	1	AGCAAGTGCACAGGTGTGTGCACGGGTGTGAGCACG	`a`aaXM___`_\XYX`aZR_Z\UWXW_K\XQX^Y`	chr10.fa		3877320	R	36	118					
+HWUSI-EAS610	1	4	14	225	923	0	1	GGAATAAATCAGAAGGCTACTAAGGATTAACATCTT	`a[aa^\_X^a_V_U_a^]Z_]_P__\_`V`[]a[V	chr10.fa		3877505	F	36	25					
+HWUSI-EAS610	1	4	82	990	1614	0	1	TTGGAGTGATTTCCCTTTGTGGAAATACTGCCTGCA	aaa`\`_aaaa``^_aaaa^`W\`]a`\_`^W]_]_	chr10.fa		3877559	F	36	119					
+HWUSI-EAS610	1	4	22	1092	1890	0	1	CATTTTTTGAGAGAGCTTGTTTCCAAATTCTGGGTG	abbbbbbbbaa^`ababbbabbaaaaaba_a```\a	chr10.fa		3879893	F	36	119					
+HWUSI-EAS610	1	4	92	1399	424	0	1	AATTAGAAATACCTTTAACTGTCTTACGTAATACAT	a]T[]IY[TS^QYLVYUaRWUVQWNVV`VUI\]]BB	chr10.fa		3880256	R	36	108					
+HWUSI-EAS610	1	4	37	431	1553	0	1	TGAAAATCCACAAGCACAAGCAGGCTAACAGAGTTA	XYU__bb_`Va[YQ`U``UTa]X_b_]b_`^OaX_]	chr10.fa		3880392	F	36	118					
+HWUSI-EAS610	1	4	58	821	368	0	1	AAATCCACAAGCACAAGCAGGCTAACAGAGTTAAGG	aaaaa^^_aaa`a`aaa`aaa_a__W]][a]_^_aa	chr10.fa		3880395	F	36	119					
+HWUSI-EAS610	1	4	60	479	342	0	1	TGCAGACAATCCTCTTCCATCCTTAACTCTGTTAGC	`Y`a\UXY_`]Xaaaa[S]`SR^a`UF_`aba_Y]U	chr10.fa		3880415	R	36	117					
+HWUSI-EAS610	1	4	99	1271	949	0	1	AGGATGGAAGAGGATTGTCTGCATCTAGCAGCCAGG	`aba[]`_ab^_`aaaa`]`aaa]_b_ZY`OWaa^a	chr10.fa		3880428	F	36	119					
+HWUSI-EAS610	1	4	31	342	1784	0	1	TGGCAATAGCAACCGTGTTGGGGTTTGGTGTCTACA	\\a`a__V_b`[`_V\a_SbbWVJ_U][aQI_b]_S	chr10.fa		3881408	F	36	20					
+HWUSI-EAS610	1	4	54	1159	1983	0	1	TCTACAGGCAGGATGGATCCCCAGGTGGGTGGTCCC	a``aU^\P\^Y]WZ\`\`TXSZWTTRT^RPZTKTPT	chr10.fa		3881438	F	36	41					
+HWUSI-EAS610	1	4	48	1780	941	0	1	TTTCTTTGGACCAGAACATTTCTGGGTTAAAAACTT	aaa_a`_X][___\_[XX__^_`^W]S_^[]]YY^^	chr10.fa		3881526	F	36	33					
+HWUSI-EAS610	1	4	34	936	570	0	1	GGCATGGTCCCCAGTCAAGGAATGGGGTTACCCACC	_a`aa`^\``^\`a^^a`a`a`]`^]PZ`KRP\[ZZ	chr10.fa		3881569	R	36	118					
+HWUSI-EAS610	1	4	45	657	1480	0	1	CATTCCTTGACTGGGGACCATGCCTATCTACTGGAG	\QT[RQWZZ\JWQZZ`X`PP\baa`OY`Z`P_^R[b	chr10.fa		3881581	F	36	29					
+HWUSI-EAS610	1	4	100	392	1803	0	1	GCAGTCAGAAGTAGTTGCAACTTCTGCCTTTTCTCT	aaaa^``_aa`SaaGaaa`__[\`aYW\__a^``_`	chr10.fa		3882492	F	36	118					
+HWUSI-EAS610	1	4	61	1488	79	0	1	CATAAAGAAGATGTTCCAGCTTCTCCATATAAACAC	abbaab``a`a\P_`[[`Y`a_a`_]a`a```_^`^	chr10.fa		3882637	F	36	119					
+HWUSI-EAS610	1	4	94	164	1271	0	1	ACTGCAATGGATTTAGAGAAGCTATGAAAATGGTCT	a^abb`bbbb``bbbbbaT_ababb_V`V_aaa_aa	chr10.fa		3883054	R	36	119					
+HWUSI-EAS610	1	4	82	604	556	0	1	GGGATCCTGAAGGATGAACATGAAGAGCTACAAAAC	N^`^^Ybabaa``a_bab`a`a`bbbbabaabbaaa	chr10.fa		3883135	R	36	119					
+HWUSI-EAS610	1	4	46	1618	526	0	1	TTGTAGCTCTTCATGTTCATCCTTCAGGATCCCTTT	aa`_a]_[YY[\_`RP_aa_]YUT`SX]UXRXRGU]	chr10.fa		3883138	F	36	117					
+HWUSI-EAS610	1	4	60	1577	1822	0	1	AAGATAGNATAGTAAGTGACAGTAAGAAACCCTGTC	abbab`RD^`_a`b]bab_V`aYaa\]aa_]Z^^XY	chr10.fa		3883289	R	7C28	110					
+HWUSI-EAS610	1	4	35	867	380	0	1	CATGCATCCCCAAGTTTAGCCACTAGCACCCATAAA	ab`a_aaaa`_``aab`_^aZDPa]a[`^Z`___]B	chr10.fa		3883393	R	36	112					
+HWUSI-EAS610	1	4	78	1343	588	0	1	ACCCAGATTTAAGTCATAGATTCTGAAAAAGACAAA	^__``baa_`^`^XZXZZ]R^a_____`Z`]\^W\X	chr10.fa		3883476	R	36	119					
+HWUSI-EAS610	1	4	27	1659	1467	0	1	CATTTGCCATCTGTGTAGGAGGATTCTCCGTTGTTG	\^`___aX^`````aZa[`a]a`a`aa_Z_Y]``_[	chr10.fa		3884079	F	36	119					
+HWUSI-EAS610	1	4	21	637	699	0	1	AGTATACGGGAAAGCAACAACGGAGAATCCTCCTAC	]b_aababbb_bab`a^^bb_aabbaba_`aaaa_a	chr10.fa		3884093	R	36	119					
+HWUSI-EAS610	1	4	50	1559	104	0	1	GATACTTGGGAGTTTGGGGAAGAAGGATGGTTTAAA	]abaaa]_X]X`\a^_^]Z[`b]XPZa`_`W^Zaaa	chr10.fa		3884388	R	36	119					
+HWUSI-EAS610	1	4	19	266	1420	0	1	ACATCTTGCCAATTTCAACAACGTAGCATAGCAGAG	[``aZ_Za``b[_^a`YVY```aXY\``]aaab`_\	chr10.fa		3885177	F	36	119					
+HWUSI-EAS610	1	4	70	356	1556	0	1	TGTGTTTCTTGTAGCAGATGAGGTGTTGATGGCCTC	abVb_aaaa_a]^[a_a__a^`\Ua^__W^a`__]_	chr10.fa		3885210	R	36	119					
+HWUSI-EAS610	1	4	65	992	1631	0	1	AGGGTGTCAGATCCCTCTTCCTGAAGTTAAAAGTAA	`_a`Z`^]abaaa`ababaaa[``aa`\`[]T_`ab	chr10.fa		3885848	F	36	119					
+HWUSI-EAS610	1	4	72	496	1186	0	1	GTAAGGCACTTGATGTGGATACTGGAAACTGAACTT	a_a`aa__aaaaaaa[`a_^]X][`^a\]__[_Z]^	chr10.fa		3885886	F	36	119					
+HWUSI-EAS610	1	4	84	674	1168	0	1	AGAAAACCAGAATATAGACTCATCTCAGAAAACTTT	ab]^a__aaa_aa_a`aT\``aa_aaaY`_a`[`__	chr10.fa		3886465	F	36	119					
+HWUSI-EAS610	1	4	66	1093	1972	0	1	ACTCATGTTTACTGCAGAACTATTCATAGGAGCAAA	a`aaaaa_`a`^__]`a`a]_^^_]```^^]]Y]_Y	chr10.fa		3887127	R	36	119					
+HWUSI-EAS610	1	4	38	580	652	0	1	TGACATTTAGTGTTGCAGGTGCCCATTGGATACATT	aaaa`ba^]a\`^_aaaa_U_a`^^`_aa``^WY[]	chr10.fa		3888450	F	36	119					
+HWUSI-EAS610	1	4	11	18	546	0	1	ATGAAAGTACATTACCGCTCTGATGTTTTCCTCAGT	ab``XX`abaaaYbaa`a_`]_\WaYa]_aa_ZP_^	chr10.fa		3888562	R	36	119					
+HWUSI-EAS610	1	4	40	1700	358	0	1	AAATGTACTCTGAATTTCCTAAGGCTGATGTGGGAG	``_[OFU]\[ZJXVa_aZU\`[QNX^\U[SLOOOQZ	chr10.fa		3888665	F	36	116					
+HWUSI-EAS610	1	4	6	23	1612	0	1	CATACACACAAGTAATCTCCCTGTCATGTAGCTGAG	aSJ`bbbb]`bU_a`]aX]`a``Z_NY_[Y^`Y`X\	chr10.fa		3890099	F	36	118					
+HWUSI-EAS610	1	4	36	969	128	0	1	GTCAGGATGGAAGACAGGTGTGAACTCTGCAGGGTC	ZJa\baa__`Za`a`\aa\a^Xa\^X]]a`U`]_S`	chr10.fa		3890539	R	36	118					
+HWUSI-EAS610	1	4	70	1709	1324	0	1	CGAAGACTGATTCTCCAGACTCAGATAGTAAGCAAC	]^^_WU_a\abba_\^`_W_a]_baa`Z_`_a_a`S	chr10.fa		3890626	R	36	119					
+HWUSI-EAS610	1	4	68	518	1973	0	1	CTGTGTTAAACGTTTTCAAACTAATACAGTATATGT	aa^^a`aba^aa]_``aa^a_`a`_``__Za_`^YV	chr10.fa		3890678	R	36	119					
+HWUSI-EAS610	1	4	59	709	909	0	1	AACCCTGAGATTCACTTCACTCCAGTCAGAATGGCT	aa]_^a_^_\]^]\X_]_]]^^]ZT[][^WZX^]]X	chr10.fa		3895911	F	36	31					
+HWUSI-EAS610	1	4	15	1772	1770	0	1	CATTCATGGGCTCAACTAATTGTGCTCAAAGACATT	`abab`V_a`abaaaH`aab`aSYaa_]Sa``_]a_	chr10.fa		3897418	F	36	118					
+HWUSI-EAS610	1	4	80	910	1550	0	1	GTGTTTTTAAAATGTCTTTGAGCACAATTAGTTGAG	aWaZ`aaa\_^_a_^_a_a`]a_`_^__`_aTa`^_	chr10.fa		3897428	R	36	119					
+HWUSI-EAS610	1	4	62	268	1958	0	1	GCCATTATGTTGACCAGGGGTCAGGAAAGTAAGTTT	aab]aabbba_bbaa_aaaaWaaba]`aaN^^_U^_	chr10.fa		3897747	F	36	119					
+HWUSI-EAS610	1	4	24	1126	300	0	1	TGTGTGCCTGTGTGCTTGAAAAGTGTGTGTGTGTGT	abaWXXa]a__`Zaa_aa]USRUPU_UR_N___Q_Y	chr10.fa		3898914	R	19G16	92					
+HWUSI-EAS610	1	4	71	1465	550	0	1	TGTGTGTGTGTGTGTGTGTAAATAGTACATGTGATT	a^]Y\[]\]_]_[W[WV^]ba__[PY_U[\]Y[W__	chr10.fa		3899284	R	36	37					
+HWUSI-EAS610	1	4	25	1136	1860	0	1	ACACACAGTGGCTTTTCTTCCAGCTCTTTCCATCCT	\^a\_]`_]Z\V`ba``]\R]]^U]WX`_[]a`][]	chr10.fa		3899337	F	36	119					
+HWUSI-EAS610	1	4	29	750	244	0	1	ATATGGTGCTGTGTCTGTAAGGCCTCCTCTTTACAT	G^``[`bbabbaa_bbb`]aaba_baaaabbbbabb	chr10.fa		3899412	F	T35	107					
+HWUSI-EAS610	1	4	74	218	906	0	1	TTATGGTGCTGTGTCTGTAAGGCCTCCTCTTTACAT	[YO]`b[``__[b^aabS_VZ^]`__W]a`b_NYOX	chr10.fa		3899412	F	36	118					
+HWUSI-EAS610	1	4	91	620	1647	0	1	TAAGAGCAGAGCAAGGATAGCAAGGAAGAGAGAGAC	abbaabaaaa^_aabb`_aaaaa_YVaa`a```aaa	chr10.fa		3900022	R	36	119					
+HWUSI-EAS610	1	4	65	854	2008	0	1	TTGGGATTGTTTGCTAATGCAATTGCAGACATTGCA	abaaa`aaa_aaa_aa`aaaa`a_a_`^]^^_^`^`	chr10.fa		3900199	R	36	119					
+HWUSI-EAS610	1	4	29	297	776	0	1	CTTTATCAAGAGACGCCAGACTTCAAGAGGGATGAG	aaa``a``bba`GG__aa`a[P]_]abUS`_^_a``	chr10.fa		3900822	R	13A22	106					
+HWUSI-EAS610	1	4	32	748	1818	0	1	CTCTGCTAGACTCCTCTCTCTCACAGAGAACCCTGT	ababa`aaa`abaabababbbba`abaa`aaaaaaa	chr10.fa		3900899	F	36	119					
+HWUSI-EAS610	1	4	47	830	624	0	1	ATGCCTGTTAAAGTGAACACCTCATCAGAGAGGTAC	_bbaa`b^^`\]a^`_]XZ`PYSZZ]_`Z]W_[SS_	chr10.fa		3901387	F	36	119					
+HWUSI-EAS610	1	4	32	437	1234	0	1	GGGGTGTGGGGGGGTGTTTAGTAACTTGCTCCATCT	Z\`bN]Waaaaa_ZY\KW`R]\aW^]a`aa`\HWa`	chr10.fa		3901492	R	28T3T3	68					
+HWUSI-EAS610	1	4	72	352	982	0	1	ACTGGAAGTTAACAAATTGGTATGACAAAAGTCTAC	`bbbb^`a`aab`bba_aab_a_aaaV`b[a_^aaa	chr10.fa		3901594	R	36	119					
+HWUSI-EAS610	1	4	54	430	1205	0	1	CTTTCAGAGTGTCAGATGGTACTGTGCAGACTGCTG	aabbaaa_a^baaaaaaaa\``a__aaa`a````_a	chr10.fa		3901742	F	36	119					
+HWUSI-EAS610	1	4	96	417	386	0	1	GATGCTGCCATACTTCTTGCCTTGATGATTATGGAC	aa^Z\P`[R]^[URKW[[Z]YX[]V[]VYT\V[`WY	chr10.fa		3901943	R	36	25					
+HWUSI-EAS610	1	4	78	1253	388	0	1	CATAATCATCAAGGCAAGAAGTATGGCAGCATCTAG	_bbbbbbbbabbbba_baaaaaab`Ybb`a_a_baa	chr10.fa		3901946	F	36	55					
+HWUSI-EAS610	1	4	90	1177	326	0	1	ACTATGGCAACTATGTTCTAGGAGCAAAAGAGTCAT	aaa[W]`a`_`a[aa^a`a_`]]``_X^XPS`\^\`	chr10.fa		3902744	F	36	119					
+HWUSI-EAS610	1	4	94	1433	1183	0	1	ACACTTGGGCACTATGACTCTTTTGCTCCTAGAACA	aaa^[``_`^a]`aaa^`aa`_a___a_^a__]``_	chr10.fa		3902757	R	36	119					
+HWUSI-EAS610	1	4	21	965	165	0	1	CCCAATGCTTTGAGTTACAAGAAGAAATGTAGGGAT	abaaaababbbbabaaba`a``aa`_`ab_`ba`aa	chr10.fa		3903151	F	36	119					
+HWUSI-EAS610	1	4	96	691	1333	0	1	AGAGACTGGGGGAATGGTCAACCAAGTTGAGATCCA	^babbaaaaabbabbaaabbbaaa`a`a`U`aa_aa	chr10.fa		3903199	F	17C18	81					
+HWUSI-EAS610	1	4	42	660	432	0	1	TGGTCAACCAAGTTGAGATCCATCCCATGAGCAAAC	aa_\_ab_a`_`_^_`a`aa`_^__aaaa_a``_`]	chr10.fa		3903213	F	3C32	86					
+HWUSI-EAS610	1	4	98	814	438	0	1	AGAACTTGGATTCCCCACACATATGTAGCAGATATG	\DMJ]XX`_`\PS__^TRNT^VZ`XZZ\P[^ZW[BB	chr10.fa		3903526	F	36	107					
+HWUSI-EAS610	1	4	34	545	189	0	1	GGTCTTCCCCCACCCTGATANACCAAGTCTCTGTGG	ab_]bb`b_babbabbbab\D^bababZaaabb^bb	chr10.fa		3903690	R	20C15	110					
+HWUSI-EAS610	1	4	18	440	161	0	1	CACAATTCTTCCTCCCCATCCCTCTCCCATTCTCCT	``ba_bbaaaa`aaaa_`a`a_``aa_``a\`a_aY	chr10.fa		3903749	R	36	119					
+HWUSI-EAS610	1	4	7	642	481	0	1	GCCTTTTCAGGTTGATGAAGTGTGGCAGTGAGTGGG	aaaa`Z^`XaaX`\R_b_`a_a[a_\_aW[URRR[^	chr10.fa		3904056	R	36	119					
+HWUSI-EAS610	1	4	31	1126	465	0	1	ATGTGTCCTCACTGTCTTGTTGGCCTTTTCAGGTTG	``WbMb]WYab\]_R]a]a^]X\P_XYbWI]]ZNa[	chr10.fa		3904078	R	36	118					
+HWUSI-EAS610	1	4	24	763	301	0	1	GTCCCTCATATAGCTGTCTCCTGTGAGGCTTTGCCA	`]`a_`]``aab`]aa``a^`aaUa^^__[`W_^ZV	chr10.fa		3905001	R	36	25					
+HWUSI-EAS610	1	4	44	525	37	0	1	CATTGTCGTGCAACTCCTTCCATGGATATTTATTCC	aababa`a_`a_aa`ba__`a__aaXa^`^a_]`a_	chr10.fa		3905154	F	36	119					
+HWUSI-EAS610	1	4	67	1089	16	0	1	AAAAAATTCAGCTGACAGCAGATGCTGGCAGGGATG	aaaa__```_____`^a`]]_]^^]]\^UX]]^WX^	chr10.fa		3905707	R	36	27					
+HWUSI-EAS610	1	4	59	1499	615	0	1	ATTGGTAAAATTCTTTCCCAATCTGTTGGTGGCCTT	abaa[[aab`^a]a_``a`^U`W`^[^W_\_\^_`a	chr10.fa		3905981	F	36	13					
+HWUSI-EAS610	1	4	96	716	840	0	1	AACCCAGAAATGAACCCACACACCTATTGTCACCTG	abaa`aaaaaa]aa^^aa_a``__``aaa]_`]__a	chr10.fa		3906361	R	36	10					
+HWUSI-EAS610	1	4	69	654	1563	0	1	ATACATAGTACATCTCATCCTTCCAATGATGGGTCA	abbabb[b`aaabababbbbaaaab_ab`aaba_`a	chr10.fa		3907746	R	36	119					
+HWUSI-EAS610	1	4	85	730	1639	0	1	TGTATGTTGTCTTTGGGGTTGTGCATTATACAATTT	abaaaa_aa^^baa`a``_aa_`[]aa_aa^`_a`]	chr10.fa		3907777	F	36	119					
+HWUSI-EAS610	1	4	59	691	877	0	1	CATCACTGTAGCTTCAACAGTGTATAGCTGGGCATA	abbbbabba`aabba_`aab[b^aaaa_a[aa_`a_	chr10.fa		3908105	F	36	119					
+HWUSI-EAS610	1	4	97	242	1241	0	1	AAGTGTCAAGATAAATTTGGAAAATGGATTCTTATA	a_aX`^a__aZ_a``_a^_^][`_^\`\__]^__`_	chr10.fa		3908506	R	36	119					
+HWUSI-EAS610	1	4	60	637	555	0	1	GCTATCAAACTGACTGATCTATGGAGTAAAGAAGGT	a_aaa[a`^\``a_aa]_^a]aaa_aT]ZY`^_aa]	chr10.fa		3908950	F	36	119					
+HWUSI-EAS610	1	4	8	22	1558	0	1	GGAAATGGTTCTGCCTGGCAAAGGGAAACCCTTTAC	`a]ababa_ab`aab`aaa^_aaa`_aaaaaaa`a`	chr10.fa		3909335	F	36	119					
+HWUSI-EAS610	1	4	11	696	757	0	1	GTGGGCTTGNTCTGATCTCCAGCAAGCCTCCACTCA	a]bba`baYDZ`aaaa`a```a^``a_]`^^`^_^Y	chr10.fa		3909395	F	9A3A22	72					
+HWUSI-EAS610	1	4	39	812	1163	0	1	AAGAGGAAGTCGCTATTCTCAGGCTCTGCCTTTGGA	[bbab__ab]aba_]]aNS\`^]VZ\`^^]`_a`^`	chr10.fa		3910160	R	33A2	82					
+HWUSI-EAS610	1	4	63	941	883	0	1	AGGCACATCTGTTTCTTTTTGTCTCCGATTCTCTGA	a]\[WZH]``a]Y^]]ZRKKVUN[O[_\]_X_R\VB	chr10.fa		3910319	F	36	112					
+HWUSI-EAS610	1	4	56	1065	1830	0	1	TGCTTCCTTTTGTAAGTTTACTAAGTGGCTCTATTA	ab[\a``a]JX^a_]aaaaa_a_`a^aa`][`V`\^	chr10.fa		3910437	F	36	118					
+HWUSI-EAS610	1	4	76	1161	1300	0	1	CATATCATAAGCCACTCTTAATAGAGCCACTTAGTA	abbbaa^bbaYaaa_babaaab_a_a_^``a`aaaa	chr10.fa		3910455	R	36	119					
+HWUSI-EAS610	1	4	53	1407	1215	0	1	TTTTCCAGGAAATGGCAACCAAGCTTTTGTCTCGAA	aaaaa]_a`__a]`]^``Z_``_]]^^^Z\Z_Y^]_	chr10.fa		3910807	F	36	119					
+HWUSI-EAS610	1	4	21	288	1275	0	1	ATTGAGCATGGCCAGCAGCCTGGACATGACCATGGC	V`b_^abbbbbbabbb`bba`bba`_ab`aYT_bbb	chr10.fa		3911315	F	36	51					
+HWUSI-EAS610	1	4	67	190	1991	0	1	GCAAGCAAGCATGGACCTTGAGGTTCATAATAGGTA	a^Q_a``R^`W_a^_a_R_]U^_R^a^^_^]_]^RR	chr10.fa		3911527	F	36	118					
+HWUSI-EAS610	1	4	58	16	1296	0	1	TGAGATGAGCTAACAAAGTAGAACAAGGGTATTGAG	aaZaa^`Tababbaba^bZ]aaaaaabbaVY_``\a	chr10.fa		3912351	F	36	119					
+HWUSI-EAS610	1	4	3	1032	414	0	1	TATACTTAGCCTCAATACCCTTGTTCTACTTTGTTA	aabaaaa_a_aaaaa_`a`_aaa_`aaa`aa_a]aY	chr10.fa		3912361	R	36	119					
+HWUSI-EAS610	1	4	20	1066	142	0	1	GAAGAAGAAAGGAGTGCTTGCCTGCCCTGGCTTCTT	^a`^`ab^aa_aa`^aaaaaa`aaa^^`a`^aa_aa	chr10.fa		3912573	R	36	119					
+HWUSI-EAS610	1	4	54	1119	336	0	1	AATCAACTTGAGTAGGTCAGGAGTAAACTAAGATAC	aa_aXVX_bbab`a_]TYWU^Z`]]Z\NX[UW``^Q	chr10.fa		3912722	R	36	118					
+HWUSI-EAS610	1	4	55	613	511	0	1	CTGATGACACTCTTACATTGGTACACTTTGCAACAC	`bbaaaaaa```a^`^[a_``^a____]a_W]_^``	chr10.fa		3913678	F	36	59					
+HWUSI-EAS610	1	4	40	1669	1324	0	1	AGAAAAGCACCAAAGATCTTCTAGTGGTGTTCTGGC	aaaaaa]^a__aa^__a_a`___`X]]Z^Z__]^_^	chr10.fa		3913758	F	36	51					
+HWUSI-EAS610	1	4	46	335	935	0	1	CATAACTTCTGCTTTCTTCCTGATTGGTGCTTGTTA	aaaa]\aSbab\Y[Z]`^J_`a__aaa]aYQQaNT[	chr10.fa		3914073	F	1T34	22					
+HWUSI-EAS610	1	4	61	1293	1311	0	1	CGAGTTCAGCCTTAGGTGATGTTTTCTAAGATGGAG	`aabaa_aa`_`b_`b]aaab_ba`_`___\_`[]a	chr10.fa		3914146	F	36	119					
+HWUSI-EAS610	1	4	46	1002	644	0	1	AACTGCTGGATCCAGAAGAAACTGCAAGACTCCACC	_`]`TT[U_\IbUTa[a`^b`ZPXPPWSMQa`\aBB	chr10.fa		3914249	R	36	109					
+HWUSI-EAS610	1	4	68	881	1476	0	1	TGCTGATATTCTGACAAAGAAGAGTGGCATCATCCC	aaab`aaaaaaba__aaab^`a_a^a`_``\_`^\[	chr10.fa		3914319	F	36	119					
+HWUSI-EAS610	1	4	78	1571	153	0	1	AGAGCTAGAGGGGTCAACACCACAAGAAAACCCACA	`[]QLYaS\TXTFQ`Z``___`\_]U____UG_^Y_	chr10.fa		3914712	R	36	116					
+HWUSI-EAS610	1	4	94	37	1287	0	1	AGAGCTAGAGGGGTCAACACCACAAGAAAACCCACA	UXZ_b\[`\_abbZ``aa`aba_Y^aa`_babaaa`	chr10.fa		3914712	R	36	119					
+HWUSI-EAS610	1	4	29	1379	363	0	1	CATATCCAAACATCAGGAATCCTTGGGAAGAGGAAG	R_bbbbbabbbbabb_bbb_bbabaaa`b]a`abbb	chr10.fa		3914761	R	36	119					
+HWUSI-EAS610	1	4	77	1190	1201	0	1	ATTGGGCTGTGCACCAGTCTATGAGTATAGCAGAAT	aaa_aRJ\_\ST[[WXa_W]aaaXQP`XX^P```__	chr10.fa		3914848	F	36	31					
+HWUSI-EAS610	1	4	19	170	660	0	1	AAGACCCATGCCCTGAAACCACTTGAAGGGACAAAA	XQ_ZZbba^abbbab[[O_XW__T_[aa_TXaa_UW	chr10.fa		3914980	R	36	118					
+HWUSI-EAS610	1	4	43	1248	972	0	1	GAAGGGATCAGGTCAGGGGGTGGAGGTGGGGGCGAT	`]]a[ZZa]M[[RPUX`^[`S`aP\]R[X]X`X\X[	chr10.fa		3915314	R	36	118					
+HWUSI-EAS610	1	4	22	1180	1399	0	1	TTGGTTAAGGGACACCTAGACCATTTGCAGTTTCTG	abbb`baabaaa_aaabab`a__aaaa`_a^aa``a	chr10.fa		3915665	F	36	119					
+HWUSI-EAS610	1	4	42	690	547	0	1	GTGACCTTTTTTGCTGTCTCCACCCTGCAGTAGATA	`V_ZV[````[`^_Ya[]]`^^^^\UX`_\V]\Z^^	chr10.fa		3916037	R	36	119					
+HWUSI-EAS610	1	4	54	419	1794	0	1	ACCACAGCTTAATATCCATACACCCAGGAAGTCTGC	aaabaaU^a```_b_^\a_\U_`\a__^_`\^__^[	chr10.fa		3916427	F	36	119					
+HWUSI-EAS610	1	4	1	356	575	0	1	CAAAGAAAGCTGTTGTGTAGTTCTCAGCACTGTGAT	a_babab_bbbbaabaa]_aabbaaab`a_b]_baa	chr10.fa		3917321	R	36	119					
+HWUSI-EAS610	1	4	39	666	1425	0	1	CTGAGAACTACACAACAGCTTTCTTTGGCCCATGGT	abba\^`a`__aaaaaaaaaaaaaa`^^a__a`]aV	chr10.fa		3917330	F	36	119					
+HWUSI-EAS610	1	4	71	1696	1767	0	1	GCTAATACCTTGTCAGAGTCTTACCTTAGCATGGAG	`abba^_\YZ`aaaa__a^aaa`_aa_`a`__`a_a	chr10.fa		3917441	R	36	119					
+HWUSI-EAS610	1	4	98	382	1335	0	1	ATTTAGGGAGAATATTGCTAATACCTTGTCAGAGTC	abbbababaaaaabaaaba`a`aa`aaa__`a_aZa	chr10.fa		3917457	R	36	119					
+HWUSI-EAS610	1	4	8	1569	44	0	1	CAAAGATTTTCTCTCAGTCTTATCTCTCCAGAGATA	U[bWJ^__V\^`aaY^\YbbaaU\a`VVRUY^[_`a	chr10.fa		3917822	F	36	118					
+HWUSI-EAS610	1	4	62	765	1732	0	1	ATCACCCCAACCCTCCAGGTGAAATTTGGCCAACTG	abaaaaa`\^__`^a^`a\Ya\aa`a`^]XZ^_\aa	chr10.fa		3918302	F	36	119					
+HWUSI-EAS610	1	4	66	599	1814	0	1	TGTGTTGGGTGCTAAATAAAATCCAGCTATTACTTG	aa`b\a``aWaa`aa`aaaaa]_aaaa``aaa``]a	chr10.fa		3918377	R	36	119					
+HWUSI-EAS610	1	4	49	97	1329	0	1	CCCAACACAGTGTTGTGTTTAATTAGTTTGCTCTAT	aba^[`a`U`^a_`a_a]aa_V_aaa_``ab`aa`a	chr10.fa		3918404	F	36	119					
+HWUSI-EAS610	1	4	56	385	1125	0	1	ACACATTGGATCAATCTGGGCTTGAACCATTCGAAA	aaaabba`aaaaaaaaaaaaaaaaaa__]aa``\YY	chr10.fa		3919635	F	36	119					
+HWUSI-EAS610	1	4	39	639	542	0	1	GTGATCGGCCATGACTCAAGCCATTTTAGACAAAAG	a_aa_^_]_^][_]]_\^_a_`]___^]^_^]`Z__	chr10.fa		3920189	R	36	59					
+HWUSI-EAS610	1	4	58	965	30	0	1	GCAAGAACACAAAGCTATGCTCTGAACATTTTTCAG	a_aaa`a^a^_aa_]_``a]`^``__XY__^__Z^Z	chr10.fa		3920296	R	36	119					
+HWUSI-EAS610	1	4	15	452	1095	0	1	CAGTACTAATTCGACATTTGAAAGATGTAGCACACA	a\\\aaaaaa`_^MS]aaaa``_aa_`Wa____a^a	chr10.fa		3920945	R	36	119					
+HWUSI-EAS610	1	4	49	1209	8	0	1	AGGTGAAACCACCTTTTTGCAGCAAAATCAGTTACT	a[^\a`aa^_a_`Raaa_NX\_^Y_a`^[[YYY[T]	chr10.fa		3922252	R	36	119					
+HWUSI-EAS610	1	4	33	481	29	0	1	GTAATCTTTTCCAGGCCTTATTATGCTGCAATAAAA	``Va^_`aS__a^^_aaaWZb_`_Q]_`MZY`_]]a	chr10.fa		3922789	R	36	118					
+HWUSI-EAS610	1	4	33	1467	1455	0	1	GAGGCCATCACTCCTGGGCCTATCTTGCCTTCTTCT	aaa]]`aaX__\^_\U_`_^aa^\\`^]U\_]]_\\	chr10.fa		3923896	F	36	119					
+HWUSI-EAS610	1	4	74	387	1941	0	1	AAATAAGATTGAATTTGGGGCTTGGGAGATAGCTTA	]LZ_\SJSaPJOS_^WOGYXPWGMV_]TXNGR]OX_	chr10.fa		3924913	R	6A29	99					
+HWUSI-EAS610	1	4	53	629	714	0	1	CATGCCCTGGAGGCCAAAAGAGCTGTCAGAATCCCC	aba`aaaaaaaaaaabaaababaaaaabaaaa`a`a	chr10.fa		3924997	F	36	119					
+HWUSI-EAS610	1	4	87	1375	328	0	1	GAATGAAATGGGTGCCAGTTGCTTTTAATACTACAA	aaaa`_`_aV`YX[]`_a^`_]__a`a`aa__a]aa	chr10.fa		3925291	R	36	119					
+HWUSI-EAS610	1	4	13	1498	858	0	1	TAGCATTTCTTTTGCTTTAATTCCTGTTGTGAAAAC	a_b_`__`aa_a`_``a`aa_``a^^\_`]____[]	chr10.fa		3925660	F	36	119					
+HWUSI-EAS610	1	4	45	238	1640	0	1	TTGGGTGAACTAGACAATCACACCTCACTGAGCCCA	aabbb`aabbaababa_abaa]`aabaaabab`aaa	chr10.fa		3925780	F	36	119					
+HWUSI-EAS610	1	4	2	505	138	0	1	CAAAACCAAGAGATGATATAACCTTCAAAGATCTAC	abbaabaaaYbab`bbaaaabWa`aaaa`_\^\_aa	chr10.fa		3926017	R	36	119					
+HWUSI-EAS610	1	4	66	658	492	0	1	TATGGTTTTGTAGCTTGGTGTTCTTGTGTGACTTCT	a^^a\Naa`^Z^_`a`aaZ`]a]_a`Z_[_]Za]^_	chr10.fa		3927011	F	36	36					
+HWUSI-EAS610	1	4	16	1066	334	0	1	CATATTCAGATGATATCGATGGGAAGCCTTGCTCAT	abbabbaa\^aaaaabababaaaaaaa_a`aaa`_a	chr10.fa		3927162	F	36	119					
+HWUSI-EAS610	1	4	95	891	1910	0	1	TGTTTTTAAAACTAATTATAATCAACAGAAGAATGT	\babbbb_abbb_`babbb``bbababa`abb`bba	chr10.fa		3927456	F	36	119					
+HWUSI-EAS610	1	4	27	560	958	0	1	AGATCTGAAAATCCCCTATCCCCTACCCACCTTCCC	`_T_a^^WZWVba_R]aaa_S]a]S`HQ^\^[_a_]	chr10.fa		3927679	F	36	118					
+HWUSI-EAS610	1	4	43	1390	219	0	1	CCATTGGAGAGAGCACAAGATCCCTAATGAAGGAGC	aabaa`aaaaaa`_aab`[`a^`_`aaa]^a^^_^`	chr10.fa		3927983	R	8C27	15					
+HWUSI-EAS610	1	4	28	227	1673	0	1	GCGAGCTGCTGGCCAGCCACAACACTTAGGCAAATG	`a`[[aY`a_aa_aa^[[aaa`a]VUVH\_^V\^^_	chr10.fa		3928433	R	36	118					
+HWUSI-EAS610	1	4	89	87	52	0	1	GTCTCCCATGCTCATGGATTGGCAGAAATAATATAG	a_a`a`__TE^^`a`_^Y]^__^^_^]`_^^^XU^]	chr10.fa		3929455	F	9A26	4					
+HWUSI-EAS610	1	4	81	911	878	0	1	AATATATAAAAAGAACTCAAGAAGCTTGACTCCAGA	aabb`ab\^`aaa`a[aabaaZ[``a``_U`_`[`a	chr10.fa		3930208	F	36	12					
+HWUSI-EAS610	1	4	51	690	1882	0	1	GTGCCGCAAGCAATCGTGTGCGTGCCACCAGTAATC	ab]``a]a`]Va`V`TOQUaUZ]]VRNK`VPZ^U`V	chr10.fa		3932249	R	36	34					
+HWUSI-EAS610	1	4	81	924	491	0	1	ATTACTGGTGGCACGCACACGATTGCTTGCGGCACG	ababaaaa\^aaa_^^a_aaa^`_^[^a`][YY`ZZ	chr10.fa		3932250	F	36	58					
+HWUSI-EAS610	1	4	73	974	1913	0	1	AAGGTCAAGCAAAAGCTGGGCAAAGTACATGTCAAA	`baa^bba`^^_`baba``aa`a`a_`aaaa\\_a`	chr10.fa		3932552	R	36	119					
+HWUSI-EAS610	1	4	100	1607	1409	0	1	AGACAGGCATATTTCTGAGTTGGATACCAGCGTGGT	ab`V`Vb_aYaU]SXX]`a_aYTVa__`]`UTW[BB	chr10.fa		3932979	F	36	110					
+HWUSI-EAS610	1	4	94	443	690	0	1	GAAGCTTGGTGGGATTGAAGAGATTGCTTAGTGGTT	`YZ]]_aa_X^_^ZYa_aa^[a[W[a^_[^\P`_WB	chr10.fa		3933228	F	36	114					
+HWUSI-EAS610	1	4	88	1023	1959	0	1	GCCACCACAGGACTGTGTAGTCTTTAATTCTGGCAT	a_abaa`abaa`[aa[a_aa^abba_`aa_`^Z___	chr10.fa		3934364	F	36	119					
+HWUSI-EAS610	1	4	91	1630	86	0	1	AGACTAAAAGCAAACCAGATAACAAAAAAAGGGGGC	a^SG]X[\WMF``Z_U_IV_SSXSOW]UYWNMTMWB	chr10.fa		3934775	F	10G25	101					
+HWUSI-EAS610	1	4	27	252	265	0	1	CAGAGCTTATCGAGTTTTTGGCATGTAATTACATCT	a`b_Vaaa^_a``b^^bT`_aaa`bWaa``aaaaa_	chr10.fa		3934859	R	36	119					
+HWUSI-EAS610	1	4	89	608	940	0	1	GGGCAGGGAGCTCATAGGGACATAAGCCGGTCTTAC	`V__]W^\QXZN`XWDXLO\_YX\Z`GVTVKOT\PU	chr10.fa		3935291	F	36	114					
+HWUSI-EAS610	1	4	1	1150	147	0	1	TGCAAAACTCAAGAAAATCAAGAAGAGGGAAGAGCA	`_`aab^abaabab\baaabaaW_``^[__a^aZ_a	chr10.fa		3936429	R	36	5					
+HWUSI-EAS610	1	4	65	104	440	0	1	GCCAATCCATGAGCATGGGAGATCTCTCTCAAGGAA	aab\Z]aaaa`]`^`_a_^Z`U\```_a^aa``[_[	chr10.fa		3937897	F	36	56					
+HWUSI-EAS610	1	4	95	719	422	0	1	AATGTATGTTCCAGATTCACAGTTAGCTGGCCTAAG	abb`aaaa_aa__b_aa`aaabZaaa`_^a^____a	chr10.fa		3938131	F	36	119					
+HWUSI-EAS610	1	4	56	1372	190	0	1	TGGCCTAAGCATGCCATGGTCTGAGAATTTAGAGAG	aaaaaa`aV_aa`a__a^^[]`a_\_^a_aa[__^a	chr10.fa		3938158	F	36	119					
+HWUSI-EAS610	1	4	88	88	31	0	1	TTCCCCTACTCACCCACCCACACATTCCCACTTCCT	`^b```_RR^\\_bRNO`ZO\Z^_V_a``]\Z\[BB	chr10.fa		3938442	F	36	38					
+HWUSI-EAS610	1	4	98	355	597	0	1	TGGGGGTACTTGTTAGTTCATATCGATGTCCCTCCT	^a_^^_]]`a^``[_Y`^`aaZZT\[__^_Z]Z[[\	chr10.fa		3938611	F	36	42					
+HWUSI-EAS610	1	4	79	1323	759	0	1	ATTTCATCATTTATTCAAGAAAATATGGGGATCCAT	\aaa`_]```a_baa]baaa_aa`a_\W`_`^YW__	chr10.fa		3938839	R	36	119					
+HWUSI-EAS610	1	4	29	1163	501	0	1	CTAGTGTGTCATTCGGGCATTTGTCATCTGTCAGGT	^aabab[ababbbY^_Xb]bbb]Vbb[\_ZWbbVbV	chr10.fa		3943370	F	A35	84					
+HWUSI-EAS610	1	4	62	1654	1138	0	1	CATTTGGCTTTAAAACAGTGGTCTAGTGCTGGAGAA	aabaaba`ababbaaabaa`__aaaa^_`aa]_aaa	chr10.fa		3948182	F	36	119					
+HWUSI-EAS610	1	4	97	834	511	0	1	GAGTAGCAGCCATGCACATGGTATATGGACATAGAT	aaaaa]a``a`a_a``W_`abX`a``\`Zaa``a__	chr10.fa		3948352	F	36	119					
+HWUSI-EAS610	1	4	62	1095	1404	0	1	TGTAATGAGTTTTGTTTGGTTAGCGTATTGCTTTGC	ab^a__[X\\aaa^\bba\a_W_\^`Uaa`[aYa^Z	chr10.fa		3948900	F	36	119					
+HWUSI-EAS610	1	4	5	863	1037	0	1	ATGACTGCTTATGTTAAGTGACATGCAGAGGCCTTG	a^bbabba`bba]]a]Z^Zaaa`^VZZ_`aa`Pa_V	chr10.fa		3949134	R	36	119					
+HWUSI-EAS610	1	4	13	1642	627	0	1	GTGTTGCTCTTGCAGAGAATCCTCAGCACCACACCA	Y__a_^``aaa`aaaa`abaaaaa`P_``SZ]a``a	chr10.fa		3950078	F	36	119					
+HWUSI-EAS610	1	4	29	1027	1153	0	1	AGAATACCCATCCCTAAAATCTCTCTATGGAAAACA	aZYS]a`^Y`_\\[\N\`^^`_^_X`\^a_W\[_]a	chr10.fa		3950737	R	36	119					
+HWUSI-EAS610	1	4	5	1209	927	0	1	AGGTCAGCTCCCAAGACCTCAGCAGGCCTCTCATAC	_bbUY`PG]\Z_[^T^MY`V^Oa]W\ZXUXGXSZ[B	chr10.fa		3951018	R	36	112					
+HWUSI-EAS610	1	4	9	1789	1544	0	1	AACAGAGGACAAGCATGACTCTTGACTCTCATCTTC	aaabaa^a_`a_[O_``__a^````U_Z_S__\`^\	chr10.fa		3951068	F	36	119					
+HWUSI-EAS610	1	4	3	1633	1811	0	1	TATACACCCAACCAATTCTCAGCAAAGTGCATAAAG	aa_a`a^]W]`Y`_TT[Z_\]^Y^\U^W^W^^__^]	chr10.fa		3952038	F	36	119					
+HWUSI-EAS610	1	4	10	1641	395	0	1	ACTAAACTACAATGAAATGCACTGCCTTTCCAATTA	aa__^RZ__^`^Y]V^\^W_`YWVY^]YW][Y]Y[Z	chr10.fa		3952561	F	36	119					
+HWUSI-EAS610	1	4	2	1592	1514	0	1	TTAAAAGTCCTACAATAAATGTGGGCACTCAAATAT	`a__a\YVT^_`[^Ya[]]_`]_YZZYY\[[[YVTR	chr10.fa		3952935	R	36	119					
+HWUSI-EAS610	1	4	94	1128	1181	0	1	CAGGCTAGGCAGGTATCCATAAACAAATGGAAAATT	`abaabbbabbb[[ab\b]b^abY\\bbba\aaabb	chr10.fa		3952991	F	36	119					
+HWUSI-EAS610	1	4	87	1751	475	0	1	GAAACAAGCAGGGGCACAGTTAGGATCATGTGGGTT	aba``_^MN[NUWN_`Z`VV^`UHPMYY^MIISTW_	chr10.fa		3953121	F	36	115					
+HWUSI-EAS610	1	4	23	197	907	0	1	CACAGTTAGGATCATGTGGGTTCTTTATCTTCAATC	abaab\`aab]a`aaa[a_`\_aaaaaaa__`^^_a	chr10.fa		3953135	F	36	119					
+HWUSI-EAS610	1	4	73	908	2036	0	1	AACAGCCAGGAAATGAAGTCCTTGATATAACTAATA	ababaaaaaaaaaaaaaa`aabbaaaaaaa`aaaaa	chr10.fa		3953956	F	36	119					
+HWUSI-EAS610	1	4	18	479	341	0	1	AAGTCTGTGGGAAGAGCCCTTTTTACATACCAATTA	aab_aaa[aaaaa_aaa`aa_aa`a`a`a``a`aaa	chr10.fa		3955073	F	36	119					
+HWUSI-EAS610	1	4	9	1638	902	0	1	GCTATTATTAACTCGAAAAAGAAGCCAAAGCTCTCA	aa_baaaaaaaaaaa^_`aa^\`_`_``_`_]_]\[	chr10.fa		3955229	F	36	119					
+HWUSI-EAS610	1	4	53	131	1670	0	1	AGTTATCTTACCCATCTTATGGTCTTGGGATAGACA	^^^^b`\b_abb__]_b]\`bbW]aaaZZJ`abaaa	chr10.fa		3955264	F	36	118					
+HWUSI-EAS610	1	4	1	1099	1310	0	1	ATACTCATGATACAATTCACAGACCACATGAAGCTC	aaaaaWabbaaa_a`aa`a`aa`_^`^aa`_^a]`]	chr10.fa		3955986	R	36	8					
+HWUSI-EAS610	1	4	34	88	938	0	1	ATCCTGAGTGAGCTAACCATTCACAGAAGGGCACAC	[`aaaa]aUaaaaa]\^aa_R`aaa^ZX`[a`]a\a	chr10.fa		3956068	R	36	119					
+HWUSI-EAS610	1	4	11	1072	179	0	1	AAAGAATTATCAGCTGAGGAATAATGAATGGCTGAG	a___aaaaaa_^^_ab`\`\]_a_]V]___ZY`a^a	chr10.fa		3956560	R	36	33					
+HWUSI-EAS610	1	4	59	355	563	0	1	TGGTTGCTTGATCTTTGACAAAGGAGATAAACGGGG	a``Y`aa`aa_a`aaaa__`X`aa_`\\]_``a_a_	chr10.fa		3957028	R	36	50					
+HWUSI-EAS610	1	4	65	674	1892	0	1	TGTACTAGCAACCATTAATGTCATAAAGATAGAGAT	^^O`\`^a]abbab_baQ^b\`ab_]^bbaaa_``b	chr10.fa		3957270	R	36	119					
+HWUSI-EAS610	1	4	21	1621	1430	0	1	AAGGAGTCTGGAACAGGAATCTCTGGAACAAACCCC	aaa`__^_``a^`Y`\^_`a\_^__^_^V__bWSR\	chr10.fa		3958088	R	8A27	82					
+HWUSI-EAS610	1	4	7	250	1083	0	1	TAACAGGCTAAAAAAAGCTAACCGCAAAAAGTCAAA	[^`YI]bbab`\[Y\^[````a`\bb^^\Y`R_b`a	chr10.fa		3958259	F	36	118					
+HWUSI-EAS610	1	4	54	389	295	0	1	GTATTTGACTTTTTGCGGTTAGCTTTTTTTAGCCTG	a`^aaba^abbaabaabb\aabaaabaaaa`__`aa	chr10.fa		3958262	R	36	119					
+HWUSI-EAS610	1	4	17	1680	755	0	1	AAATGTCAGAACATAGAGTATTGTTCAGCCACTTGT	a^a^V`__N_a`Z`aaa[_aVVOY]UW^Z`a^]]_]	chr10.fa		3958360	R	36	118					
+HWUSI-EAS610	1	4	17	445	752	0	1	TCAGAGAGGAGCTTTGTTCTCACCTATGAAAATGTA	aaab`babaaa`aaaa`aaba^aaaaba_U`_aa_a	chr10.fa		3958403	R	36	119					
+HWUSI-EAS610	1	4	5	199	981	0	1	CTCCTCTCTGAGGGAGATGATGTCACCATGCCTTCT	ab`abbaaZaa_a``a_aa___[a`aa^X___^a_\	chr10.fa		3958428	F	36	119					
+HWUSI-EAS610	1	4	86	718	235	0	1	TGTTCTGGAAGACAGAAGGTAAATGATGCAGAAAGT	aa\a`aaa\^aX\_`__`aS___^aZX_\_a____W	chr10.fa		3958751	F	36	119					
+HWUSI-EAS610	1	4	67	349	1530	0	1	TGCATTTGAACGTGTTGGTACGGCATTGCTTTGCTC	`]^Z`^^__\PM[aRO]ZHaaXYRXQ``_a\TNRTa	chr10.fa		3958820	R	11A24	100					
+HWUSI-EAS610	1	4	61	1411	429	0	1	TTATGTGAGAAAAGCTGGTTCCAATGGCTGCTCCAA	aaa___aa_`aaa]_`__]`_^a`^\]]][]\Z^W^	chr10.fa		3959193	R	36	119					
+HWUSI-EAS610	1	4	27	1020	1123	0	1	AATCTTTATCTGTTCATCATGTTGTCTGAAGAACAT	aababaaZ_`a]`a`aaaaaa`aa`]a`]^`[`[W]	chr10.fa		3959603	F	36	119					
+HWUSI-EAS610	1	4	19	560	1940	0	1	TAAGTGAATATTAGGCAAAAAGTTCAGAATACCCAC	aaZaaabababaababbbbbba[aababbabaaaba	chr10.fa		3960307	R	36	19					
+HWUSI-EAS610	1	4	26	1110	1640	0	1	CAAAAACTCAGGTGACAGCTGATTCTGGCAAGGCTA	aaaa`_]_R^a`RL]__`Y`a]^]Ua`[]\[a_Y__	chr10.fa		3960767	R	36	5					
+HWUSI-EAS610	1	4	11	783	1692	0	1	AGGTTAAGCATGGCTCCTGATTGAGGGACAGGGCCA	aa[Wb`_`ab\baa`a[aa]a`RR_^``[X_\`Y]a	chr10.fa		3961205	F	36	119					
+HWUSI-EAS610	1	4	95	743	1024	0	1	AAATAAGCTTATTACTGGGGTTTTGTAGTTTTTATT	a]PY_U_\ZS^Y`a^\SRU^__^]]`^_WXZ\``a`	chr10.fa		3961895	R	36	118					
+HWUSI-EAS610	1	4	19	63	1639	0	1	CTGGAAATCAATCTGGAGGTTGATACTGTGCCTTCA	`_aaX`^_a[aaba`]H]a[]_]_W``a_aa`a^ZB	chr10.fa		3962700	R	36	114					
+HWUSI-EAS610	1	4	86	1226	845	0	1	TCAACCTCCAGATTGATTTCCAGAATGGCTGGGCCC	]]aaWX^a`\`a]]]a]]`\``_`T]`aBBBBBBBB	chr10.fa		3962713	F	31TA2A	77					
+HWUSI-EAS610	1	4	21	796	568	0	1	AAAGAATGGAAACAGGTAACCTTGGGAGGTAGGAGG	`aabaabbb`b`abbb_aaa`abaaa`aa]`aa_ba	chr10.fa		3963037	F	36	14					
+HWUSI-EAS610	1	4	42	804	2012	0	1	CAAGAATGCACCAGAGACCTGAGAAGTGAGAGAATC	aaab_\`b`a_aa]\aaa`abXaVY_]a`a__[]_Z	chr10.fa		3963086	F	36	37					
+HWUSI-EAS610	1	4	33	1339	828	0	1	GGGAACTTGTAGAGCCCACCTTCAGCAGGAAGACAG	]_`aa`aa`P_a`]`a``a_`a^`^^\\Y]\^^[`a	chr10.fa		3963172	F	36	5					
+HWUSI-EAS610	1	4	15	642	1374	0	1	TAAGAGACCTGCAATACATACATTAGAGGACTGAAG	aaa\Xaa_`W^Y_Ya_Xa_^]^a^`_^a_a]V___\	chr10.fa		3963634	F	36	119					
+HWUSI-EAS610	1	4	49	593	73	0	1	GAGGACTGAAGGGTCTGGGTTCAATCAGGGATGATG	ab``aXa_]_b^\K`aaaa[`^X`[X]ZY]YY^^^Y	chr10.fa		3963659	F	36	31					
+HWUSI-EAS610	1	4	76	1296	934	0	1	TGCGCCTAACCCTCATGAGACTGGAGGCCCCAGGGA	_`a``__`a\a\```aaaa````\\`aX\^\\``^X	chr10.fa		3963693	F	36	17					
+HWUSI-EAS610	1	4	41	788	737	0	1	CACACCCCCCACTCTAACTGGCCTCTAAACTCCCTG	`baaa`_abaabaa`aa_a`aa]a^_aS``^``]_a	chr10.fa		3963723	R	36	119					
+HWUSI-EAS610	1	4	25	303	1646	0	1	AAGAAAGCTAAATGTTGCAAAAGTAAAGGAATGTTA	aabbbbbbb\babbaabbb`Waa_a_abba]abW_W	chr10.fa		3963905	F	36	119					
+HWUSI-EAS610	1	4	31	1480	1610	0	1	GTTCTATACAAAGGCTGGTAATATTTTAAAGATGAT	aab`a`aa_aa`aa_aa`_a`a_aaaa____]_`^`	chr10.fa		3964042	R	36	119					
+HWUSI-EAS610	1	4	79	201	1820	0	1	TAAACACAAGAAGAACATCCTTGGAAACAGATAGGA	aa_^`]aaabba`aaaa_aa^`aaRXa`aa__aa`\	chr10.fa		3965063	R	36	119					
+HWUSI-EAS610	1	4	53	530	1847	0	1	GAATAGTTCTATGTTTTGAGTAGTAAATGTCCTCTA	a^__QVZ`^`W`]^_W_`_`Y[\[__Y]]T]^^]^^	chr10.fa		3965546	F	36	119					
+HWUSI-EAS610	1	4	96	902	167	0	1	TTCAGCACATAGACTTAGAGGACATTTACTACTCAA	aa^aa_a`aaa```aaaaabaa___a``Z``^a^a`	chr10.fa		3965561	R	36	119					
+HWUSI-EAS610	1	4	81	1063	1308	0	1	CAGCTAGAATCTCAATNTTGCCTTGAAGGCAGAATC	aaaa]]]]_X_a_a^WDYa^]^aV_VO]\XW\QW`_	chr10.fa		3965667	R	16A19	110					
+HWUSI-EAS610	1	4	92	263	388	0	1	GGCAAGCAGTTTTCCCTGCCACCCACTGCCTACTGT	__Q]_^YFY\SX\`]ZZVZ[[aU[_]Y`_WYLXW`^	chr10.fa		3965731	F	2T33	95					
+HWUSI-EAS610	1	4	66	205	1897	0	1	AGTTTTCCCTGCCACCCACTGCCTACTGTAAAGCTG	Xba`babab`abb\`ab_a]_aaZ`_^aU_Sa^_N_	chr10.fa		3965738	F	36	119					
+HWUSI-EAS610	1	4	78	990	14	0	1	TGCCACCCACTGCCTACTGTAAAGCTGTCATCACAG	`baaa__a``a_```aZa]^aa_a`^^^V`_Z[Z`a	chr10.fa		3965747	F	36	119					
+HWUSI-EAS610	1	4	16	276	1833	0	1	GTAATAGAAAGCTAACAAAGAAATTAGCACCAAGGT	aSIXU^^a^Y`a][X`Z_VX\_^HT_`\\]____\T	chr10.fa		3965890	F	36	117					
+HWUSI-EAS610	1	4	49	1424	731	0	1	ATGCCCTAAAAGACATTTTGAATATTATCCCCGTGC	abba]]a`aa`^``]^a``a`^^`a^`^`Z^____\	chr10.fa		3966427	R	36	119					
+HWUSI-EAS610	1	4	40	1763	804	0	1	AGCTTCATGCATTTACTTATTAGGGCTGCTTTCAGA	a^a_aaa^_```__`aaa_`a_WZ]`^\^\Za__^^	chr10.fa		3966565	R	36	119					
+HWUSI-EAS610	1	4	69	71	1742	0	1	ATAAGTAAATGCATGAAGNTATGAAGGTGAAGCCAA	aaY`babaaabbbbba]]D[aab`ab_Zaaaaaa`_	chr10.fa		3966581	F	18C17	110					
+HWUSI-EAS610	1	4	47	1047	1925	0	1	CTTTGGCTTCACCTTCATAGCTTCATGCATTTACTT	ab`a\YU[`_]]`ba][^aZ]`aaa_UV^^^aa^\_	chr10.fa		3966583	R	36	119					
+HWUSI-EAS610	1	4	7	181	1486	0	1	GTCATGCTGGAAAGATGCCATGTGATTGACTGGATG	^_aU^[a`bbb_]]aaab_Q\_S_\`]aaaaba^^b	chr10.fa		3966990	F	36	119					
+HWUSI-EAS610	1	4	43	178	501	0	1	TACAGTACTAGTTCATGGATTAAAAGTTCCCATGGG	aab_baabbabaab`bbb`bbb`b_`aabbb`_a`a	chr10.fa		3967341	R	36	119					
+HWUSI-EAS610	1	4	75	966	845	0	1	GCCTATGGCATGTAGCTTAGGCAGGAATAGAAAGTG	``aa`a_a`a`a\]```]_\U^^^]X```^[[__Q^	chr10.fa		3967426	F	36	119					
+HWUSI-EAS610	1	4	39	1709	882	0	1	TCTCCTGACAGTTAATGGATAGTTAGAATTCTGATA	aaaaaa[^]`_\a[a]TTV`_X[[\W\a_[V[VY^`	chr10.fa		3968091	F	36	119					
+HWUSI-EAS610	1	4	52	387	135	0	1	AGTAATATATACATATATGTATATGTATATATAAAT	ab`b`bbbaabaababaaa_aaabb`aaaaaaa``a	chr10.fa		3968394	F	36	63					
+HWUSI-EAS610	1	4	55	1276	1582	0	1	ATTTGCTTAAGGTCCCATCACCTTCCCAATCAGCAT	abaa^V]X[_\XQNZ`]_N_RVa_W_UWQ^YWXW``	chr10.fa		3969966	F	36	118					
+HWUSI-EAS610	1	4	36	1446	1340	0	1	GTCCTATGTGATAAGCATAAGGTTGTAATTCAGATC	_aaaaabb]a_aa_a`b`aabaW`a^aaaa\^Y`aU	chr10.fa		3970223	R	36	119					
+HWUSI-EAS610	1	4	22	280	1871	0	1	TGTCTTTCCCAGGCCCAGTTGTAAATCATGCTGCTT	ababbbbbbbb__`^]YZYaa_\aaZ]_`]_`]\]]	chr10.fa		3970337	F	8T27	80					
+HWUSI-EAS610	1	4	53	308	953	0	1	CGAGGGAGAAGCAAGGAAATTCTTCCCAAGATCAAT	ababaaa`Xaaa`^aa_a\_]`a`a[^[_a_^_Ya_	chr10.fa		3970482	R	36	119					
+HWUSI-EAS610	1	4	74	722	1008	0	1	GCTTCTCCCTCGGGGTTAGCAGACATTTGCTTGGTA	aabaaaa\_a]^__a_aaa`_^[TYaaa]^aaaaOW	chr10.fa		3970506	F	36	119					
+HWUSI-EAS610	1	4	16	611	672	0	1	AGAATTGTTGCCTCTCCAGAGGGAAAGAGTTTTGTG	ab`aaab_`aa_a`a`__b_baa```aZaWaaa__`	chr10.fa		3970549	F	36	119					
+HWUSI-EAS610	1	4	52	500	952	0	1	GTTCTTCCTCCCCTTGGAAAATGTTGGTGGCTGCCC	`^aaaaaaaaa`aaaa\V_`]a`YaaaV`[\\]^[`	chr10.fa		3971743	F	36	119					
+HWUSI-EAS610	1	4	94	899	892	0	1	ATAGGTCTCAAAAATGAGTTGCCAAGTAACGTCAAG	abaaa^``T[`a\aaba_a___[_a``aaYa[T]``	chr10.fa		3971975	R	36	119					
+HWUSI-EAS610	1	4	58	1223	1281	0	1	GTGGGTTTAGTGGGTTTAGCTGATCCAGGGGCTTCT	aT\`aZ_^S][Z__\__^a[V`WUURW[UUV[SYS[	chr10.fa		3972124	R	36	118					
+HWUSI-EAS610	1	4	90	55	129	0	1	GTGATGTAGCAGAAACCATGACATTTTTTTCCCAGG	a_aaaa_a``aa_````_`_`a__``_^__`^a]__	chr10.fa		3972221	R	36	119					
+HWUSI-EAS610	1	4	72	508	1317	0	1	GAGATGTTGAGTATTGTTATTAGATACTATACTACA	aaaaaaaabaa_`aba_aaaaaa_aa_aaaa`aa`a	chr10.fa		3972731	R	36	119					
+HWUSI-EAS610	1	4	34	1018	1786	0	1	AATGGGTGACCCTGGCACACATTCTAAACACTCTAA	_abaaa`aaaZ_`^aabaa__aaaaaa`_a`aaaaa	chr10.fa		3972864	F	36	119					
+HWUSI-EAS610	1	4	1	547	730	0	1	GCTCATGGTCAGATTCCCAAAGTTTGAGCCAACACT	^`aaaU\`KU]U`\\RYSaaZ^Ha[_XX][abaXa[	chr10.fa		3973112	R	36	117					
+HWUSI-EAS610	1	4	79	1662	903	0	1	GGTCTGGGGTGGTTTCCATTAACACAGATAGTGCAA	ab_aa`a_`^_W[]_``aaaaa`a]_[_`]MVX^`a	chr10.fa		3973396	F	36	119					
+HWUSI-EAS610	1	4	33	692	59	0	1	GGCTGACTGTGAGTAGAGTCAGCTATCTCAACAGAT	aaaaaaaaaaaaa_aa`a]_aa^aaaY__^a]_\Za	chr10.fa		3973817	R	36	119					
+HWUSI-EAS610	1	4	96	1014	772	0	1	TAGTACACATGGCTCCAGTCATATATGTAACAGAGG	aab`a_a`_aa_``^a_a^a`a``_aa^__^_a_`_	chr10.fa		3973944	F	36	69					
+HWUSI-EAS610	1	4	82	1620	362	0	1	GGCCATCCTCTGTTACATATATGACTGGAGCCATGT	[DYab\aa`S``Za_]RXaaa___]YFGH_`_[Y^S	chr10.fa		3973950	R	36	4					
+HWUSI-EAS610	1	4	5	1445	1899	0	1	CCCCAAGAGCTCCCAGGGATTAAACTACCAACCAAA	a`^aaaaa`a_`_a_aa__aa_X]_^^SW_^\W_\^	chr10.fa		3974470	R	36	27					
+HWUSI-EAS610	1	4	94	936	1380	0	1	TCTATGCTTTCGACCCAACATCTTGACAGGTGTTTG	a`b`aa`aa`aaa```aa^aa_aaa`]`aa]a^`aa	chr10.fa		3975113	R	36	119					
+HWUSI-EAS610	1	4	54	144	424	0	1	AAAAATAAGCAGGGTGCTGGTTTATGTGTCTATGCT	`aba[aaaaa^aaaWaa]aaZa`^``]a]`a_^__`	chr10.fa		3975141	R	36	119					
+HWUSI-EAS610	1	4	66	1154	553	0	1	TGTTGATTGTGACTAGTTTTGTGTTAAGAAGGCAGT	aa_aa_`a`UUY[____aaaa^`_`_[_X]\TN[_]	chr10.fa		3975209	F	36	119					
+HWUSI-EAS610	1	4	53	1201	1953	0	1	TGAGTACAGCTTGTCTTTGAAGATGGTGACACTATC	aaab]a_ab_`aa_Ya`b`aaaZ`a`Ya`]]X`_]]	chr10.fa		3975601	R	36	119					
+HWUSI-EAS610	1	4	91	837	447	0	1	GGCACAGGGATACTCATAAGGAAATGAAGACTTAAG	^Z\a[XWaa`[XX\UHY`\]Z\UUaXZ[`VH\_XT^	chr10.fa		3975747	R	36	117					
+HWUSI-EAS610	1	4	69	918	860	0	1	ACACCAAATGCATGCTCTGTTGTATTTTCTTAAACT	aab`_aa^VT\aaa_``aa_`a\_``aa^aa`__^a	chr10.fa		3975783	F	36	119					
+HWUSI-EAS610	1	4	31	1699	664	0	1	ACACAGCTACTTCCTAGGATGGGAGAGACAGGGCTT	aaa`a``^`_^^[_`_`^^ZNV^^_[U^S[[UZWZS	chr10.fa		3975843	F	36	118					
+HWUSI-EAS610	1	4	68	708	1470	0	1	AATTATTCAGGGACTACCCCTTATCTAATTCTCTAA	aaba]aaaa`a___Z`a```a``__aa`__]`^```	chr10.fa		3976532	R	36	119					
+HWUSI-EAS610	1	4	5	1151	149	0	1	TGGATAAACTTAATTCATATTAGTTTCTATTTATGT	a^a`aaaa]_a_Z_`^aa^ab_]X__[a^aaZ__a`	chr10.fa		3976623	F	36	119					
+HWUSI-EAS610	1	4	7	926	291	0	1	TTAAAAATACTGGTTAGCAGCATTTATCCAGTGCAG	aaa_`____Z`_^[_^`^a`^__`_]]Z]^_Z_ZZ_	chr10.fa		3977587	F	36	119					
+HWUSI-EAS610	1	4	73	144	1795	0	1	TGTGATGTTTCTAAGACTGTCTCCATTAAATGCCAA	abab`abZbbbbabb_babYbaabbaa``aaabaZS	chr10.fa		3977935	F	36	54					
+HWUSI-EAS610	1	4	39	888	1321	0	1	AAATATTGTTCATGGCATATAGCCTAGTCCATGCTG	`XZbabbaaa`aa^U[aaa`]`__aaa]]^_`a]aa	chr10.fa		3978056	F	36	32					
+HWUSI-EAS610	1	4	32	205	817	0	1	GGCCAAGGCATAGAAACAGAGACAGCATGGACTAGG	`abb`X\Tb`W`b]abab^P`babb`IZbaXa`Zaa	chr10.fa		3978078	R	19T16	97					
+HWUSI-EAS610	1	4	11	31	475	0	1	ACTGCAGATCCGCACAGTTCTGCTATCAATCCAGCC	a_]`aaa`\^a^``_R_U^_`a_Y_``[`V`[Q_\^	chr10.fa		3978184	R	36	26					
+HWUSI-EAS610	1	4	16	519	889	0	1	CCAAGGACCATTTCTCCCACTGATGTCCAACAAGGC	a\VRTO`T`]W`^]RQ^YR^O_Z[]^^^UVY_XUZ^	chr10.fa		3979962	F	36	25					
+HWUSI-EAS610	1	4	71	445	522	0	1	GAAGGACTAAAGCATCCACACTTTGGTTTTCCCTCT	aaaaa`_``aaa_a_``aX^^a__`_X]_^_YXY]_	chr10.fa		3980404	F	36	14					
+HWUSI-EAS610	1	4	6	943	340	0	1	CCTCTTCTCAAGCTTCATATGGTCTATGAATTGAAT	a]b]bb[a`^`^aab`Tbaab_^Zaaaa[]a`]Y]a	chr10.fa		3980435	F	36	40					
+HWUSI-EAS610	1	4	8	726	2013	0	1	TCACAAAAGAAGACACACAGGATGTACTCACTGATA	aaa_baa`\aaWW_a`aZW`]^`^Xa]W^Y_[][S_	chr10.fa		3980505	R	36	42					
+HWUSI-EAS610	1	4	24	425	1440	0	1	TTTCTAATTCCATCCATTTGCCTAAGACCTTAATGA	abbaaa`aaa_aaaaa`a_aaaababaaaaaW]aaa	chr10.fa		3980567	F	36	51					
+HWUSI-EAS610	1	4	95	1293	1717	0	1	AACTGAAGTACATATACATAATGGAATACTACTCAG	]V_aa\_^_b^aaa^a_a_``aa__^a_Ya_Ta^Z[	chr10.fa		3980897	F	36	119					
+HWUSI-EAS610	1	4	4	265	1166	0	1	CATTTTTCAAATCACATTTTCTAATTCTGCCTCAGT	_abbbaab`\`a`\b`^`b`baaaaaaaaaaa`V`_	chr10.fa		3980951	F	36	119					
+HWUSI-EAS610	1	4	86	786	210	0	1	AGCAGCCAGCACAGCTCTGAAGGGGAAGGGAGCTCT	`aa`a\_`a_^X`a``_`^\```]^\aZV_X_\``a	chr10.fa		3982044	R	36	119					
+HWUSI-EAS610	1	4	87	1301	480	0	1	TGGCAGCAGCCAGCACAGCTCTGAAGGGGAAGGGAG	aa^]a\Z_XXW`]^`]`a\a`^`a``TX\\]^^\`^	chr10.fa		3982048	R	36	119					
+HWUSI-EAS610	1	4	97	576	190	0	1	TTAAAAAGTCAGCCCAGGAGACCAGCCAGATTGGCA	__bbb\Za^`^bY`baa]UWXUa^```MS^ZJR`__	chr10.fa		3982079	R	36	118					
+HWUSI-EAS610	1	4	26	731	161	0	1	GGCACATAGGATGGGGGAAGGAACCAGAATCCAGGT	a`VP]GX^_MIOa`[`_LO]_KX\ZV\^[YQRJYBB	chr10.fa		3983265	F	36	17					
+HWUSI-EAS610	1	4	58	648	444	0	1	AGAGCCTAGACTAAATGCCAACATCTACAGTTGCAG	ab`abaaa_a`aaaaa`aaaa_aaaa_aaa\``_`a	chr10.fa		3983476	R	36	119					
+HWUSI-EAS610	1	4	48	989	42	0	1	CAACTGTAGATGTTGGCATTTAGTCTAGGCTCTACC	abaaba]a`]aa__`a`aaaaa`_`aaaaZa_a`_`	chr10.fa		3983479	F	36	119					
+HWUSI-EAS610	1	4	59	257	1636	0	1	CAGACCAGGCTGTTGCCAGATAACTGTTGGGTAGGG	aa``aaba^a`aP]RR_JUIY]^\\VS^ZW[WZ\BB	chr10.fa		3983508	R	34A1	106					
+HWUSI-EAS610	1	4	92	1360	609	0	1	GCCAGGGGCTACATCAGTGACATGAGGCATATTTAC	aaaZZa__aabaa[_a\aUaUWa`a__ab]`aa`_Z	chr10.fa		3984886	R	36	119					
+HWUSI-EAS610	1	4	3	1342	281	0	1	ACAGGCAGATTTTGTTTTGAAATCTGTGGAATGTCA	aa[NZ]_aXZ^\[F[YZZ]BBBBBBBBBBBBBBBBB	chr10.fa		3984966	R	36	44					
+HWUSI-EAS610	1	4	75	53	1699	0	1	TGGCTTTTCTTGTAGTCTCACCGCAAATCATTGATT	_bbaX[`Z\Q\_L]b]aZ]TH]a`_X_TZJ[aaaa_	chr10.fa		3985260	R	20A15	105					
+HWUSI-EAS610	1	4	38	177	1343	0	1	ATCCATAGCAAGCATCCTGTCCTGATGCAGAATCCA	aabbaaba`^_abaaaa`a^aaaaaababaa\]aaa	chr10.fa		3985343	F	36	119					
+HWUSI-EAS610	1	4	69	1142	1226	0	1	AAGGTTGAGAGAGGAAGCAGAGAGTAGGAAAATGGG	aabb]bbabaa_^b`_a`_b]a_a_`aZ_ab]]`Z^	chr10.fa		3985823	R	36	119					
+HWUSI-EAS610	1	4	96	1121	1990	0	1	GTTAGCAGCTGATCTGACTCTACTGGCTACTATAGC	`\`aaaa`b`aaa___a`_`aa```[\_aHVNLVKX	chr10.fa		3985996	R	36	117					
+HWUSI-EAS610	1	4	58	80	1755	0	1	TGAGATGAATATTATATGAGACTCACACTGAGGAGG	abaaV`babaabaaa]aa_aaaa`aa`_`a_a``a_	chr10.fa		3986069	R	36	119					
+HWUSI-EAS610	1	4	8	31	1383	0	1	CTAGCCACTCTACCTGTGGTGAGAATCTAGCCCATC	a`aaaaa`_a_``aaaV`^U`[_[__VV``_a__\_	chr10.fa		3986451	R	36	119					
+HWUSI-EAS610	1	4	10	225	858	0	1	AGTGAGCTCACTCTTCCACACCCTCGGCATTTGCTG	`a]baaaaaaaaaa`aaaaabaa]aa```aaaa``a	chr10.fa		3986511	R	36	119					
+HWUSI-EAS610	1	4	78	937	243	0	1	GCAGGTAAGTCTCATGAGATGGTTACCTACGTATCA	aab]aW`^a`aaabaaaaa`aa_aa__`aaaU`_[a	chr10.fa		3986608	F	36	119					
+HWUSI-EAS610	1	4	96	994	173	0	1	TGATACGTAGGTAACCATCTCATGAGACTTACCTGC	aaaa][`[_]`]aa_`a_aa_a\`aW_]_W^]__X]	chr10.fa		3986608	R	36	119					
+HWUSI-EAS610	1	4	22	1659	1456	0	1	GTGGATAAGTAAAGAAAACAGAAGATATTAACAGTG	a_aa__^_`U^aa``___^^_]^`\YZ^]X]]^^[`	chr10.fa		3986737	F	36	119					
+HWUSI-EAS610	1	4	11	1709	1045	0	1	AAGTTGTGTCTCTGTTGACGTGTAGCTTTCTTCTCC	`Y_aaa`^^]___a^_aa__[W]W]U]_]W^W\_]_	chr10.fa		3987132	R	36	119					
+HWUSI-EAS610	1	4	46	1647	2027	0	1	CAGAAACACAAAGGGACCTGAAAACGGTCAACACCT	][_U[bbaabba_```^^ZJ\ab[[_YUBBBBBBBB	chr10.fa		3987299	F	36	84					
+HWUSI-EAS610	1	4	45	896	1991	0	1	ACCTGAAAACGGTCAACACCTACTTCATGAAGTGGA	aRUY^^_^[RM^N]^Y]`QUZSMURPPQNVVVGU]]	chr10.fa		3987314	F	24C11	94					
+HWUSI-EAS610	1	4	37	536	1606	0	1	TGAAGGAGGCATATACAATCACATAGGTACCCCATA	a`WX_\Sba`b[b\^[aaa_`aa^`_`RW]aZ__a`	chr10.fa		3987374	F	28T7	91					
+HWUSI-EAS610	1	4	90	656	1973	0	1	GGTTCCCCATAGATGGTCAGAAGTAAAGCATACTAC	aa_aaaabaaaa^aa`]`a`__a^aaa```_a___`	chr10.fa		3987399	F	36	119					
+HWUSI-EAS610	1	4	44	628	816	0	1	GGTGTGATGAGAATGGCTCACTGCTCTGACAGTAGA	_ZF`_`]^`VUKPQX]UVWUZV_XTGVX_RUQLX[^	chr10.fa		3987693	R	36	115					
+HWUSI-EAS610	1	4	43	1047	1632	0	1	CTTTCCAAATCTGCCACATCCATTCCAGTAGTGACC	[ab`]aa_W`b_baaba_bbaabb\Y^a^bb`b^a`	chr10.fa		3987765	F	36	119					
+HWUSI-EAS610	1	4	29	28	1161	0	1	TATCTAGGAAGGAGGAAAGTTTTGCTCTAGGGAGGA	aaaababaaa`aaaaa]_a[aa_ba_a_aa`a_aa^	chr10.fa		3988087	F	21G14	81					
+HWUSI-EAS610	1	4	95	830	1391	0	1	GTTGTTTAAAACTAATGCATAATAGTGTGTAGTCTC	aaa__a\\]X`^_a`X`[_]U\]Y_Pa^YUa`[^[[	chr10.fa		3988777	R	36	119					
+HWUSI-EAS610	1	4	89	980	833	0	1	AGAATTACAAGATATGGGCATATGCATATAACATCC	aa`^a`]`a^^a]_^^Y[^^^^^^Y^][^]^[][]]	chr10.fa		3989669	R	36	119					
+HWUSI-EAS610	1	4	14	748	24	0	1	CAGCTATATAAGGGTCTTTCAGCAAAATCTTGCTGG	Z_b^bbab`^a`___`b`aSa_[a__]^abbbaa``	chr10.fa		3990408	F	36	13					
+HWUSI-EAS610	1	4	12	1108	1002	0	1	GAATAGGGAATAAAATACCCATGGAAGGTATTGCAG	aba^_a``]``^P`_`^]`^]]^_YX^_WZ_ZVHRa	chr10.fa		3990552	R	36	21					
+HWUSI-EAS610	1	4	27	1462	2010	0	1	ATCTGCAACCCTATTGGAGGAACAACGTTATTAACC	^ba`a_abaWWP]_W_R____]U``^`V__^`_`V^	chr10.fa		3991162	R	36	25					
+HWUSI-EAS610	1	4	16	246	222	0	1	ATCCTGAAGAAATCAAAAACACGATCAGATCCTTCT	aabaabaabaaaaaaaZaaaa``a_`aaa_``_``^	chr10.fa		3994191	R	36	12					
+HWUSI-EAS610	1	4	25	798	669	0	1	ACAGCTGGCCATTTTCCCGGCCGATGGATAGGGATC	aSba^[`\MQ`b`]_PQRRZaMVX\JXXH`^PaBBB	chr10.fa		3996824	R	22A13	32					
+HWUSI-EAS610	1	4	75	946	2011	0	1	CTAGTGTTTCTATCTCCAGAATTGTCTCCCTTTGGG	abb`bbabbbabbbbaabbbbbab`abbaababaab	chr10.fa		4001139	F	36	21					
+HWUSI-EAS610	1	4	10	555	2011	0	1	CTCTCTATCCTTCAGGATCCCTAGCACACCCAGGAC	aaaabaaW`bbabbbaa^b`b`a`abaaaa`a^^^a	chr10.fa		4001880	R	36	119					
+HWUSI-EAS610	1	4	79	437	1424	0	1	CAGACGACTCTCTATCCTTCAGGATCCCTAGCACAC	a[a``_X]`a_`]aaaaaa\MY__``a``XS_a___	chr10.fa		4001887	R	36	119					
+HWUSI-EAS610	1	4	69	1492	1061	0	1	GGGGTTCCTCCTTCCCTGTTCTTGCTGGCACAAGAC	O[TOMWW\[b`[^W`TaT^_^b]W`aRR_XO_]_TX	chr10.fa		4001978	F	36	26					
+HWUSI-EAS610	1	4	93	1475	1721	0	1	ACAGGATCAAGGGTGAGTGGAAAGCAGCATCAGCTC	abaaabbbZaZbINaXa]P`^a\aRR^]`WU`_Q^\	chr10.fa		4002030	R	36	31					
+HWUSI-EAS610	1	4	15	1542	57	0	1	GATATTAAACTTTAAATTAAGGTATTCTCTCATCAT	a\aa_Na`a_``[`\^[\`^RPFFQXSQWUV\XY]^	chr10.fa		4002280	R	23C12	106					
+HWUSI-EAS610	1	4	81	897	183	0	1	GAGTCCAATAGTACAAATGGGAGAGATGGGACTAAC	a^a`_^_a_`aZ`]`^__a`a^`]`^_^_^^Z^^_Z	chr10.fa		4002794	R	36	119					
+HWUSI-EAS610	1	4	34	775	1084	0	1	ATCTTGTTACTCTGTAGATGTGATCTGTGATGACAG	a_Y]b`XRa`ZY`_TZa_]QK[`ZUYZU_W\ZVR`]	chr10.fa		4003650	R	36	118					
+HWUSI-EAS610	1	4	11	1300	960	0	1	TCAGAGGAAAACATGTTCCTGTAAGTCAAGAGGATC	a]Z`ab^a`aa^a`a]^`aaV]_``_^__Y__`\`]	chr10.fa		4003991	R	36	119					
+HWUSI-EAS610	1	4	57	150	1393	0	1	CCTCTGATGCGTCTGAACTTAAAGACATCAAACAAA	_babb`a`aabaab`^a_]_]_]`]_]^a]^a`[XB	chr10.fa		4004020	F	36	115					
+HWUSI-EAS610	1	4	36	837	874	0	1	GGTCCATTGAAGTCAATGGATGGAAACATTTCCCAA	_aa`aab`aaaa^aa^aaa_`a_U]___aa`__```	chr10.fa		4004518	F	36	119					
+HWUSI-EAS610	1	4	88	1604	853	0	1	ATGTGATTATGTCCCCTATTTATTGGAAGATCTCTG	___S]WQTU]TT`^GX`^`a]^aaWBBBBBBBBBBB	chr10.fa		4004563	F	29T6	68					
+HWUSI-EAS610	1	4	91	711	1530	0	1	TCATGCACATTATTGCCAGTACGATTAACCATGCAT	]abbb`aaab^^^^b]bbb^a\T`a^aa`aa`_a_T	chr10.fa		4004843	F	36	119					
+HWUSI-EAS610	1	4	45	903	931	0	1	GGGAAAGTAAAGAAGACAGGATTGTCTGGCTGTGGG	`a_^\\_^Y\^_V[_QS\Y_S\]GVW^_^U\]V\\_	chr10.fa		4005339	R	36	118					
+HWUSI-EAS610	1	4	38	164	538	0	1	TTGTATTTAATTCCCATTTGTTTAGAAACTGCCACA	^_^Ya``b`UZWbb_[a__`a_`_`SK_a\a_`a_X	chr10.fa		4005465	F	36	118					
+HWUSI-EAS610	1	4	94	1386	1016	0	1	TTGAGCAGATCTAGCTATGATCTTACCAATCACAAG	aabaa__`a^_^aU^___a_`_a``^_^]^^]Z\^_	chr10.fa		4006108	F	36	119					
+HWUSI-EAS610	1	4	12	220	779	0	1	AGGGACTGGCCTTGCTGAAATAGGTGTGCCTTGTTG	\TZbaa`aaa_a^baa]VVH`PZbVb`W_a`_a__a	chr10.fa		4006429	R	36	118					
+HWUSI-EAS610	1	4	99	1028	1120	0	1	GGCCATGGGAGTCATTTTCTTTGAAGACTCCAAAGA	aaaZ_abaW``\^_`aa^_a__aaaa\ZaaW`_][`	chr10.fa		4006469	F	36	119					
+HWUSI-EAS610	1	4	27	1080	1509	0	1	AGAGATCTGTAGAATATATCTTTAAACACTCCAGTG	[`R```aabY\XTaaaaaaa^^`ba`[aYa`NQ`[`	chr10.fa		4006862	F	36	118					
+HWUSI-EAS610	1	4	73	857	814	0	1	CAATAGTCTTTCCCTGTCCGTACTTTCTGTACAGTC	ababbbaaUabbbaaaabbbababbbaab`baabaa	chr10.fa		4007316	F	36	119					
+HWUSI-EAS610	1	4	5	1192	1412	0	1	TCCGATGTTGTTTATCCAGTTCCCCGGAGTGTGTAC	aaaa_ab_a``aa`a_]_a\a`___aW^aT_[XZ`\	chr10.fa		4007590	F	36	119					
+HWUSI-EAS610	1	4	76	526	505	0	1	CTAAGTTGATGTCATAGTTTCAACATGAAATCTGTT	abaabaabaabaaaabb`abaaaa`ab`aa`aaa^a	chr10.fa		4007629	F	36	119					
+HWUSI-EAS610	1	4	84	1780	255	0	1	TAAGAGCTCCCAGGGTTTCAGGTTTGTTGGTATTTT	`baU`X`Z_`_`[FWZ`_a_[VLTVR\`YUX]__^_	chr10.fa		4008727	F	36	117					
+HWUSI-EAS610	1	4	44	333	523	0	1	CTATGATTAAACACTGTTTACAGAGAAAACGTTCTG	a`Xaaaaa_abaaa_`_a_a`^]^^_a_`_a]`_aa	chr10.fa		4008953	F	36	119					
+HWUSI-EAS610	1	4	17	1752	644	0	1	GGAGTTGGGAAAGGCAGGTTGAAGGTAGACTACCCA	]`RZ][T]]a`_[J[_`\V_a_\PWS`O^_]`\_``	chr10.fa		4009217	F	36	118					
+HWUSI-EAS610	1	4	33	356	1036	0	1	AAAGGCAGGTTGAAGGTAGACTACCCATGAGTAATG	a]aa`a]ba`aa^_aZWa^_a^a_`a`__aa]_]`_	chr10.fa		4009226	F	36	119					
+HWUSI-EAS610	1	4	44	1520	576	0	1	TAAACACTTCCTGCTTCAATTTTGGCAGAGTTCCCT	ababa`^`a^^a\a^`_aa_a`_______]Y^]]]_	chr10.fa		4009955	F	36	119					
+HWUSI-EAS610	1	4	77	988	224	0	1	CGTGCAAGATATTTTGGTACAGCAGTGGCACAAAGC	`a\W\]a\RF[`M]a^^X`a_WZ\WNY]NY`][]aa	chr10.fa		4010333	R	36	117					
+HWUSI-EAS610	1	4	95	1263	1364	0	1	AGCAATGAGGCCTTTTTGCCAGCTTATGGAGAGTAT	``aa_b___a\_`_aaZR]aaa`___aa__a`aX]a	chr10.fa		4010546	F	36	119					
+HWUSI-EAS610	1	4	57	1425	626	0	1	AACCCAGAATATTGCCAAGGCTATAGAATACTCTCC	`ab`]a__^Wa]^T^__^N]]^^\_aWYV_YXPLP]	chr10.fa		4010573	R	36	118					
+HWUSI-EAS610	1	4	51	905	771	0	1	CGATTCAAATTATCAATGAAAACTGCTGAAAGAAAG	aaabb`bbbbbabaabbbabbaabbabaaa_b_`ab	chr10.fa		4011132	F	36	119					
+HWUSI-EAS610	1	4	2	837	579	0	1	GTAAGGAAAGTTCTGGAAATCATCAGTACAATTTCA	a``_a``__a]`\_aa_`^a_`aZ`a^^\_^_^^^`	chr10.fa		4012049	R	36	119					
+HWUSI-EAS610	1	4	62	24	508	0	1	AAGCCTTAGCAAAAGTTAATAATTTTCTCCTCACTC	^V]aa^Zaaaa`aa_PY`^ZZ]]]\`a`aa_a_a_a	chr10.fa		4012221	F	36	119					
+HWUSI-EAS610	1	4	48	1505	949	0	1	AAACGAACTCTTCTATAGCAAGCCTAAGGGTCAGGA	a_]]\``YWZa][]]a`^`Z\Z]_XZWPSYGUXXU]	chr10.fa		4013263	R	36	118					
+HWUSI-EAS610	1	4	76	1269	1455	0	1	AAACGAACTCTTCTATAGCAAGCCTAAGGGTCAGGA	aaa_a`aUa^aa`aaaaa_a`_ZY``_a_`Y^^`a^	chr10.fa		4013263	R	36	119					
+HWUSI-EAS610	1	4	12	800	1786	0	1	AGAGAAAACCCAGTACATTCTTGAGGCTATTTGAGG	`^WU__\Z_a\V`]`ab_ZZ[\`a_``_BBBBBBBB	chr10.fa		4013662	F	31GT2T	77					
+HWUSI-EAS610	1	4	17	1683	1426	0	1	GAAGCTTAGCCAAGAAAGTCAAGTCAGGACTGTAGT	_bV]Za]_IaaS^aV^]a^a^aa[__JT\_`Y]Z`_	chr10.fa		4014945	F	36	118					
+HWUSI-EAS610	1	4	95	1037	365	0	1	GACATATCTCCAAGGTTTTGAAGCAAATTTGGCTCA	`a[aaa_Za_^aUYaWa_aa[__^W___[_]]X^^_	chr10.fa		4015308	F	36	119					
+HWUSI-EAS610	1	4	98	77	859	0	1	TGGCACCAGCACCAGGGCACCTTGGGTGAGGAGTCA	Xaaaaaaaa^[a]T]aF\X`a]`a`aXaZaa^aRZ_	chr10.fa		4019493	R	16T19	19					
+HWUSI-EAS610	1	4	86	1554	733	0	1	TGAATCGAAAAACAAACTTATGGCCAACACTGGGTC	aa___]_]^`_\]__`Q^_a[VO]^`]X^Z[^YTYZ	chr10.fa		4019704	R	36	119					
+HWUSI-EAS610	1	4	66	1606	786	0	1	GAGACAGAGACAGAGACAGAGGAGAAAGAAAGACAG	a[a`aaa`Z_``__V\``_U]_`_^Y`_X^_Y_]__	chr10.fa		4020303	R	36	45					
+HWUSI-EAS610	1	4	19	872	1569	0	1	CGAGGAACACAGTTTTCTCAAGACTTCATTGCATTT	abb__]Y]aXbb`aba^_a_U`aaaba]]^a_Y_aa	chr10.fa		4021827	R	36	119					
+HWUSI-EAS610	1	4	80	1656	754	0	1	CAAATCCTCTCCAAGTATTAGCCTAATATTTCCAAA	ab__ab]Va\_`[HRW``a_V^_`a_[a`__WX^^\	chr10.fa		4021969	R	36	118					
+HWUSI-EAS610	1	4	38	814	7	0	1	ATTGAAATGAATAATGAGAAAAGAGAGTATAAGGAG	abbbaa_aa__`_]aa[[X\_Ya_a]`[\`^]`_^a	chr10.fa		4022014	F	36	119					
+HWUSI-EAS610	1	4	7	436	1281	0	1	ACCCCATAAGGCCAAAGGACGAATTAGCTATCTGAT	aba]a]aaaaaaaaaW`aaaaa^a__aa_]_``V^`	chr10.fa		4022360	R	36	119					
+HWUSI-EAS610	1	4	15	20	2027	0	1	TTCAAAGTGACCTCAGGTCCTTAATGCTCCAGTCTT	aaaabbbIbbabab`bb^bbababba`bbabb]b`b	chr10.fa		4023230	R	36	118					
+HWUSI-EAS610	1	4	38	1142	615	0	1	GAGAGATGAGAAACAAGAGCAAAGATCAGAGCATTG	aY`\`]_``a_``]Y^^^^Z[]Z^^]_^_X^X^__a	chr10.fa		4023713	F	36	119					
+HWUSI-EAS610	1	4	6	420	602	0	1	AGAGAATGGAGCAGATCCGTGGCATTAGTGAAAGCC	aaa_S^_^^[a_V_]aa_bZ^]Xa`\\aM]a`_]TQ	chr10.fa		4023835	R	36	118					
+HWUSI-EAS610	1	4	19	568	320	0	1	ACCATTATTTCTGCCCTAATATCTATTTTACGGGAT	\bbabb][`S^L\`aab`^R\_]`WU`[HOQ``ZF]	chr10.fa		4024467	F	34T1	107					
+HWUSI-EAS610	1	4	71	867	1292	0	1	TTTTGAGAATTTCACATGTGTATTTAAAGCATTTTG	abbbb__a_abba`aaaa\a_`abbaaaaa^aaab`	chr10.fa		4024872	F	36	119					
+HWUSI-EAS610	1	4	52	1768	142	0	1	TCACATGTGTATTTAAAGCATTTTGTTAAAATAAAT	abbbb_OX]\\aaabb]Q_bbaa_V]a__UWa]O]_	chr10.fa		4024883	F	36	118					
+HWUSI-EAS610	1	4	80	297	24	0	1	GGAGAAGGGGGTGGAAGATAGGAAAAGAGAGGGGAG	_^aaa]^`_[aVbbZV\MYaba\a\aaQbZbaaa_a	chr10.fa		4025057	R	36	119					
+HWUSI-EAS610	1	4	57	1066	416	0	1	CAGCCACCAATTGCCAACAGCACCTCAGTTGTAGGT	^]_`b`W``abbbabb`b^^`ba^aaabb``aa`ZB	chr10.fa		4025225	F	36	115					
+HWUSI-EAS610	1	4	5	1607	1063	0	1	TAACCTGATGATGACCCAGAAATTTAAGTAGAGGAC	abb]OI_RaZZaa_a]N_\PZa`[`aSRQRRRPYGZ	chr10.fa		4025401	F	28G7	95					
+HWUSI-EAS610	1	4	34	1326	1928	0	1	AGTCCTCTCCTTAAATTTCTGGGTCATCATCAGGTT	\Q[_^``^_`_a`]Z^]bab`_Z[ZX[\`\aY`WP\	chr10.fa		4025402	R	36	119					
+HWUSI-EAS610	1	4	81	848	69	0	1	GTAGTAAGCTCTTAATGAAACATGAATACAACAGTC	a\_]P]PXLOFW_UN^_RV[ZZZ`SWVSOWZXYSQZ	chr10.fa		4025434	R	36	116					
+HWUSI-EAS610	1	4	69	602	1146	0	1	GATTAGGCCTTAGAGGAGAACCTAATACTATTATTC	`^`a`_`a``_]\]`^_a\^`_aYZ`[`aaaa_a``	chr10.fa		4025625	R	36	119					
+HWUSI-EAS610	1	4	31	342	1937	0	1	TTTTAGTCCAGTTAACAGAGCCAGGCACAAGTTCTA	aa_a_[KYba]_abaaaa`\`a[`Ta`_`[WT_[W]	chr10.fa		4025673	F	36	118					
+HWUSI-EAS610	1	4	53	285	1815	0	1	TTAAACCAATCAGAAAGTGGTTGGTTACTACTATGA	abbbbabb_bab^^^^a_ba_aa_`aa_abaaaa``	chr10.fa		4025726	F	36	119					
+HWUSI-EAS610	1	4	18	344	256	0	1	GAAAGTGGTTGGTTACTACTATGACAATCACAGCAC	a`\^K[`VZ\Y_X`Taaa_`[a^[P^`W^__Z`ZP]	chr10.fa		4025738	F	36	118					
+HWUSI-EAS610	1	4	43	1161	1228	0	1	GTATTTGTTGTCACTTGATATGTGAAGATACCTGAC	aX^```__`][SYY[_U[a[]]SYT]_W\QSNY\TV	chr10.fa		4025954	R	36	118					
+HWUSI-EAS610	1	4	40	336	676	0	1	ATCATCCTATACGCTCACCAGGAAGACTATTTTCAG	a]\YW_]W^`a``a^Z^_YO[\O[Z\\VU[]_^]RY	chr10.fa		4027177	F	36	118					
+HWUSI-EAS610	1	4	73	1099	1004	0	1	ATCTTAACAGAAATAAGGACTCCATTTACAATCAGA	`_[aa]ZGX\`a`__]_^ZX_SSV]`_XT_`a\`ab	chr10.fa		4027360	R	36	118					
+HWUSI-EAS610	1	4	73	183	881	0	1	ATGTGATTGACTTGACAGAAGGCTGATATAAAAGCA	X^ba\Vbbbbabbabb\^SQ^ababV`_b`U\abba	chr10.fa		4028762	R	36	119					
+HWUSI-EAS610	1	4	46	1445	1646	0	1	ACCTTGCAACCTCACAAATTAATGACAGAGTCTCAG	aaaaS``^PFRT[\Y]^_]]a\UYY]`_]\RW[]^R	chr10.fa		4029196	F	36	117					
+HWUSI-EAS610	1	4	56	437	925	0	1	CAGATGATGCTAGTGAGAATGTGGGAAAATAGGAAT	a[aabb`ab[a]baaaa``a__bba^_aaaa^OYaa	chr10.fa		4029422	R	36	119					
+HWUSI-EAS610	1	4	68	893	393	0	1	GAAACATCACATACTTGCAGAAATTATCTTCAGCTG	aa_a___Y``a[_^^^__a__^_\[a_^__^^]]^`	chr10.fa		4030207	F	36	119					
+HWUSI-EAS610	1	4	81	1700	304	0	1	TACTTGCAGAAATTATCTTCAGCTGTCAAAACCATG	\a``aab\OY]aaaa_aaaa]S^aW]aa`aa`_``\	chr10.fa		4030218	F	36	119					
+HWUSI-EAS610	1	4	65	1136	1695	0	1	TTGTACCCAGCAGCTTACTATGATCTGCCTCATGCT	a_a_a][[_a^`_]]_a_^_`]_ZSZ`X]_^]]_^_	chr10.fa		4030264	R	24T11	95					
+HWUSI-EAS610	1	4	56	370	1740	0	1	AGTAAGAATTTTGGTTTCTTTTAAAACACGGAAATA	Y`aabbb`bbbbb``bb_bb_bbbbabb_baa_`ab	chr10.fa		4030351	R	36	60					
+HWUSI-EAS610	1	4	6	15	1308	0	1	GATAAACTCATTAGTACACAAATCTAGACTTGGGTA	a]^_XP__a`_^a`YX^W_[_`\`^]`\``_`a]Z^	chr10.fa		4031401	R	36	119					
+HWUSI-EAS610	1	4	89	876	1153	0	1	TCTTAGTGGTTAAGATTGATGAAAAACCTAATGCAA	aab^O[_b___aaa[_[V^RZXRIZTY_`BBBBBBB	chr10.fa		4031533	R	36	88					
+HWUSI-EAS610	1	4	12	381	222	0	1	GTAGGGAATTTGTTCAGAAGGGTCTTTGGGATTGGT	a[XU^[LQY[XTXX_W_RPP]PGa_^V_`]L`[aX^	chr10.fa		4031762	R	36	117					
+HWUSI-EAS610	1	4	14	1305	412	0	1	TAGGTGGGACCGCTTATTTTTTTCTGTTATTTGTAC	aa\Z]NUUSVO^Taa^`aaaX^WXZVFY``Y^[[XW	chr10.fa		4032298	R	36	117					
+HWUSI-EAS610	1	4	12	489	287	0	1	TTGAGATTATATAAGCAACAAACAATTGCTGAAGGG	a_VU`a_[_^a`aUSZX`aW\_RU[`a^___YMYZY	chr10.fa		4032508	R	36	118					
+HWUSI-EAS610	1	4	78	417	224	0	1	GAAATACTCTGTGAAAGAAATACAGTTTAGCCGAAA	aaaaabaa`a^aa`aaa_aaa`__a]a`_a```__`	chr10.fa		4032996	R	36	119					
+HWUSI-EAS610	1	4	83	278	604	0	1	AAGTTAGTATGAGACCAAGAAAAGCAATTCAGTCAG	^]^_a`b[a^[`aaaaW\]__a`a_`X]_`a_[__`	chr10.fa		4033134	R	36	46					
+HWUSI-EAS610	1	4	58	691	1137	0	1	CACAAACACACACTAGAATTGAAGTCAGGGGCTTGA	abaa^`aaababaa_baabbaaaa]`aaaba``ab`	chr10.fa		4034513	R	36	119					
+HWUSI-EAS610	1	4	63	137	1489	0	1	CTAGAATTCACCATGTAGAGCATGCCAACATTGAAT	a`aaaaaaa`aaa``]a__`aa_aaa`a`aa_^a`X	chr10.fa		4034750	F	36	119					
+HWUSI-EAS610	1	4	69	392	1945	0	1	TTTAAATAGCATATGCCCTTTTCAGGTTCACTAATA	aaa_Waaa^b`b``_bba_^`aa]_a^_`_a`U^_U	chr10.fa		4035244	F	36	119					
+HWUSI-EAS610	1	4	62	668	769	0	1	AGGTTCACTAATAAAAAGAAAAGTCAAATTGCAAAG	\bbbbbabbbbbabbbbabbaababba^babaaaab	chr10.fa		4035267	F	36	119					
+HWUSI-EAS610	1	4	74	987	414	0	1	ACAGTTCCTACTTGAGATTCAAATTACTGAAGACAT	aa`baaa_baabb`^`aaaaaaaaaa`a`a`a`a`a	chr10.fa		4035867	F	36	119					
+HWUSI-EAS610	1	4	10	1093	1456	0	1	CTTGAGATTCAAATTACTGAAGACATAATTCATATT	abbbbbbbaaab^bb^aababbbaaaa_abaaaabb	chr10.fa		4035877	F	36	119					
+HWUSI-EAS610	1	4	33	1526	366	0	1	ACATGAGCACTTTGTTCCACATTACACTGTACACAA	aaaa_`__a]`^__]`__`]_`]_]]^_]Z^]_Z^^	chr10.fa		4036096	F	36	119					
+HWUSI-EAS610	1	4	15	1050	1959	0	1	AAGACCTGATTTCAGATGGAAAAAGAACCAAAATAT	]bPa`aa``X^`Y`b_[ab_a\a^a_b]\]`W]`aa	chr10.fa		4037129	F	36	119					
+HWUSI-EAS610	1	4	17	555	1550	0	1	TACACTAAGAAAGGGTGGGTGTAAAAATCTCACATG	ZXaT_\^Ya^[]aZbabaaPYY]L^]WZZRY_a^X`	chr10.fa		4037179	F	36	118					
+HWUSI-EAS610	1	4	73	431	1419	0	1	CAGTCAGGTCCAAAAGAACCCCAGGACAGATGGCTA	aaa\bba\F_a]_P\aaaba`\`_`_`ZVaV_\`_]	chr10.fa		4038226	F	36	117					
+HWUSI-EAS610	1	4	83	1482	1003	0	1	AGGCACTACAGTTAGCCATCTGTCCTGGGGTTCTTT	aaaaaa_aa__Zaa`aaaaa____]`a_``^`_a`a	chr10.fa		4038238	R	36	119					
+HWUSI-EAS610	1	4	96	81	1613	0	1	CAGCTACAGTGCATAAAACTGGAAGACCCCTGGCCC	ab_P`aaa_M`_\XXT__^XaZJW]N]a]b`bb`_B	chr10.fa		4039128	F	3T32	93					
+HWUSI-EAS610	1	4	87	954	279	0	1	ACTTAGCCAATAGCAGTTATGCATGGTGCATAAGTG	`Sa_a[YTa^_____^U_XX[W_\a^X_WRX^_RG\	chr10.fa		4039346	R	36	118					
+HWUSI-EAS610	1	4	58	114	1468	0	1	GGTGATTCCTGGTGCAGCCCTCTGTGTTCTGTGTTC	aa\b````aaab\aa\^`^`_a]_Y`\a_`\^aW_`	chr10.fa		4039866	F	36	119					
+HWUSI-EAS610	1	4	38	429	1909	0	1	CACCCCCCAATGACCCAACCTCCCACTAGGCTCTAT	aa^_]__a`b_abb`a\]]a`]aaa_Y]HXaa]_BB	chr10.fa		4040188	F	36	109					
+HWUSI-EAS610	1	4	26	571	592	0	1	TAAGATGGAGCCTCCCTAGATTGCTCTATTGTTCAG	abab`]^]a_`^[]__a`b^__a_`_a_`_aYLZUY	chr10.fa		4040938	F	36	55					
+HWUSI-EAS610	1	4	9	603	1487	0	1	AGATTTATCATAGCACCTGGCCCAACTTCTCAGTTC	Xaaaaaa^`ba`aaa_a`aRa\a^Zaa^[\b`aM\a	chr10.fa		4041343	R	36	119					
+HWUSI-EAS610	1	4	96	1138	593	0	1	AACTTCAACACACTTGATCAGATTTATCATAGCACC	`a`bb`abaa_`Qbaaa`\bb]aaa`_ZXaaZ]a_S	chr10.fa		4041362	R	36	119					
+HWUSI-EAS610	1	4	26	1245	853	0	1	AGGCGATGTCCATCTTTCCTTCTCAGAAGTCTTTAG	a`abaaa_^`aa`YaZa\Y_a_a_]Y]a^^\]]`ZW	chr10.fa		4041547	R	36	119					
+HWUSI-EAS610	1	4	52	812	2020	0	1	GGGGAACCTGAAAGTCACACAAAGGTCAAGGCAACT	Z^\aab`_aaaa`^aab`a`aW`^]\__`\[V[^Z^	chr10.fa		4041741	F	36	119					
+HWUSI-EAS610	1	4	65	400	1243	0	1	TAAATGAGGCTGGGGAAGTGCGGTGTTTGCCTGTAA	aaa`aa_aaaaaaa_S]]R``_^W`[_``[W_`Y__	chr10.fa		4042627	R	36	119					
+HWUSI-EAS610	1	4	54	652	777	0	1	TTATACTGGTTATTCAATAGCCACAGATTCACATAC	abbbaabbbaaaaa_aaaaa`aa```^aa_a_aa`^	chr10.fa		4042787	F	36	119					
+HWUSI-EAS610	1	4	44	1531	1998	0	1	TAAGACACATTTGTTCCCAGAAAGCTTGCAATCTTT	S^\YWT`_]YS\a^\]WLR[LJ[ZX_WJQQ[NL^U[	chr10.fa		4042837	F	27C8	102					
+HWUSI-EAS610	1	4	82	429	1495	0	1	GAAGAATTTTCAAATATCACTCAAGGTTTTCCTTTC	`a`aabbaaabbbabb`aaaabaaaaX]aaa``__`	chr10.fa		4042996	F	36	119					
+HWUSI-EAS610	1	4	80	1638	648	0	1	TGTGGTAATATTTTCCACTTCTATGAATGCATGCTC	aaaaa^baaaaa`aabaaabbbaa_aaaUaa`Sa_a	chr10.fa		4043230	F	36	119					
+HWUSI-EAS610	1	4	1	1279	986	0	1	AAAAAAATCTATTTACTTCTTGCACCTTGATCTGAA	a`ab`a`aaaaa_aa^aaaaaa__`][\_``^a_\^	chr10.fa		4043294	R	36	119					
+HWUSI-EAS610	1	4	36	103	242	0	1	GGATAGCAGTTCTGATCTCATGTAGTAGCTATTATA	aaV`^b`\aabb^bb`baa\_ba_[S^bb`aaa[`]	chr10.fa		4043583	F	36	119					
+HWUSI-EAS610	1	4	79	1078	230	0	1	GATGTCCACAGAGTCTGTTTATGGTCTTCTAGACAA	aaab`aaaa`^`_[]a\W`b_^^^\]``P\__UX\`	chr10.fa		4043695	R	36	119					
+HWUSI-EAS610	1	4	78	1716	283	0	1	CTTGAAATTCTTTCCCCACCGGTGTCACCCAGAGAC	a`_Q\bbba_\^```_`^TX]aRFVaa`UP\F\Uaa	chr10.fa		4043839	F	36	116					
+HWUSI-EAS610	1	4	70	787	965	0	1	GTCACCCAGAGACAGGCTGGATTCAGGCTCCTGGTG	````\_VUa``Z\[`[\[``\[XWXZZ\\XX\`[OU	chr10.fa		4043862	F	36	119					
+HWUSI-EAS610	1	4	17	1637	914	0	1	TATTAGCCTGTTTTCAAATAAATCCAGTCAANTTTC	a`a```___a]^_`_``^aUa`_]WZ^QZXIDW_SX	chr10.fa		4044005	F	31T4	109					
+HWUSI-EAS610	1	4	83	1432	1892	0	1	GATGTTTACAGCAGTGTGGTGCTTTTTAAAGAAATG	a``\L]`_VTYSVWQ_[_ZRTPX`\`\LQOUTSMYU	chr10.fa		4044186	F	36	117					
+HWUSI-EAS610	1	4	23	140	1239	0	1	TGGCCCAGCAGTTGCCAGCTTAGATACAGAAAGTAA	ab^``a\_ba`_^^b]PZ]WU__Z]W`a^Z\b^JTU	chr10.fa		4044471	F	36	118					
+HWUSI-EAS610	1	4	74	1551	1034	0	1	CGAAGTTAGAGGTCTTCATGCTCAAAATAGGAAGAG	Yaa\bYb\\`_RWJV`_Za_aa]^X\RVb``aaWX]	chr10.fa		4045455	F	36	118					
+HWUSI-EAS610	1	4	88	278	345	0	1	CAACCACTCTTGACCATGACCTTGGGCTCTTACGCT	`QX`a_][a^a\_`ZR[_\X\[V^V[VV\XUSSY\B	chr10.fa		4045507	F	36	114					
+HWUSI-EAS610	1	4	8	585	2030	0	1	CTCAGCAAAATATAAGCAAGAGTGCAAAATGGGCAT	_\a__Va]`a``SV]]Z^]R^ZJ^YT_]WUZYOOYU	chr10.fa		4045690	F	36	118					
+HWUSI-EAS610	1	4	98	1755	1392	0	1	TCCAATAGCAGATAACCTGCATACTAGATATTTACA	aabba^aaa`_Q`aa_aaa`aa`^`a`^[__\a`^`	chr10.fa		4046307	R	36	119					
+HWUSI-EAS610	1	4	31	361	1407	0	1	GTGAAAGGGTCAGGTAAGCCCCAAAGTGGTTGCGAC	aYba]a_aaTa^a`V_`^a`a`V_\^Saa\]`]^]Z	chr10.fa		4046348	F	36	119					
+HWUSI-EAS610	1	4	45	552	1521	0	1	GGTGGTTAAGAACTTTGTGTGCTATTGATAGTGATC	ab]bb`aaaaVVaaaaa`a[a`aaaXaaa`aS`___	chr10.fa		4047157	R	36	119					
+HWUSI-EAS610	1	4	100	1337	185	0	1	TGTGGATATGTTTGTGTTCCCTCAGGGTTTTATGGA	a_S_]aZ^^^P```Za_aaaaaa]]YUL^^__X`Z_	chr10.fa		4047357	F	36	118					
+HWUSI-EAS610	1	4	4	130	243	0	1	AGGGTTTTATGGATTGCAGGCTTTGTCCCAGTGTGG	`bab\`b`abbaaaaa_a`aaaaa]_[aYU]U_Sa`	chr10.fa		4047380	F	36	119					
+HWUSI-EAS610	1	4	63	485	1616	0	1	CATTAGTTTCCAGCAAGCCCCACTTCTTAGGGGTAC	^ab``aa`ab_PZ_UZ_aYaJZ\aaSX[a[PLPMVT	chr10.fa		4047428	R	36	117					
+HWUSI-EAS610	1	4	85	1512	1323	0	1	TTTTAAAAGGAAATTACAACAGGAGTGCTATGTATT	a`baaZ^aa_`a_a`aaaa`^a__]W_``_^^]]`a	chr10.fa		4048082	F	36	119					
+HWUSI-EAS610	1	4	48	280	1240	0	1	GCCTAGCCTCTTGTAGTGAGATTCAGGACAAAAGGG	aaa`W`aaaaaab_aa[b\a```baba`aaaVaaa`	chr10.fa		4048445	F	36	119					
+HWUSI-EAS610	1	4	69	1143	1525	0	1	GGACAAAAGGGACAGATAGCAGTCCTGTGTGGTTAA	aa`YU]_a`][V^`]```aa`]\Y\__ZaZ``Ta[X	chr10.fa		4048470	F	36	119					
+HWUSI-EAS610	1	4	12	963	112	0	1	TGACAGAGGCAACCAGTCACTGTCAGGGCAGATGGG	a`bbba\]_`aaW`baRaa`aaSZ_]a\SS`]Z__`	chr10.fa		4048582	F	36	119					
+HWUSI-EAS610	1	4	1	1544	415	0	1	TAGGTCTCCATACCTGCTTGGGAGGGTCAACCTTGA	aba__`a\^aa_[^aa`aaX`JRO]ZRN^NWV^_]\	chr10.fa		4048647	R	36	118					
+HWUSI-EAS610	1	4	87	1296	596	0	1	CGTTCATCCTCATCTTTCCCTTGGAGCATGTGCTCC	HV_]]___U[W__Y__`_V_b`Z\ZTT`W\W_a_^]	chr10.fa		4049637	F	36	118					
+HWUSI-EAS610	1	4	65	1065	643	0	1	ATTAAGCTTTTGGCTCTAGAAATAGAAGTGTAGGGC	abb`b``aaaaa^`aabb_aa`aaaaa`W]\a____	chr10.fa		4049743	R	36	119					
+HWUSI-EAS610	1	4	88	1220	1372	0	1	TGAGTCTCAACTTGTCTGCTAAGGGCTGGAACAGCT	ab_aa`ba_^`_aa^aaa`_TWHUa_Za_\_Y`aYa	chr10.fa		4050010	F	36	118					
+HWUSI-EAS610	1	4	43	1545	1247	0	1	ACCAGCTACTAGAAACCATGTCTATTAAATGACAAT	abaUYIYaT]`VVa`S_aU\_aZT^]VGO]VSU_Z\	chr10.fa		4050530	R	36	117					
+HWUSI-EAS610	1	4	89	136	1491	0	1	GAAATCATTTATATAGGTTTCTTTAAAAATCTTCCC	a^\aaabbaa\bba\ba\`ababba__aaaaaaaaa	chr10.fa		4050902	F	36	119					
+HWUSI-EAS610	1	4	1	1201	1820	0	1	GGAAAAACCTCAATTTAAGAACTGCCTACANCAGAC	_a`a]aaaa`_`aaaaaaa\aaa_]Q\a\SDS`_]B	chr10.fa		4051355	F	30T5	106					
+HWUSI-EAS610	1	4	10	769	965	0	1	ATGCCCTCTGCTTTAGTTCCTGCCTCTCAGTTCCTT	aa`VW[`a_a[^_Z`\KXKXNYZZaU`TV`Z^UZ]Y	chr10.fa		4051553	F	36	118					
+HWUSI-EAS610	1	4	64	462	839	0	1	TGAATAAGCCAATGTGGAAAGTTTTAGTGCAGGAGG	``_b^a`baa`abba``aV^ba`aaa]V_`a`X[aa	chr10.fa		4051694	F	36	119					
+HWUSI-EAS610	1	4	90	1387	699	0	1	GAGCATGCATACTTAGACTGCATAGACACATAGCCT	a_a_`[aT[^[WZ__\`^`aa`[WQ^`aYUX]XBBB	chr10.fa		4052461	R	36	106					
+HWUSI-EAS610	1	4	14	151	1007	0	1	GCTAGCTGGAGGTTATAGTGTTACTGGGAGCATGCA	aaUaabXaaX`a`^WZ]^[a[_]aaa`VJ`a`P^]B	chr10.fa		4052488	R	36	114					
+HWUSI-EAS610	1	4	53	1762	1601	0	1	TGCTACCTCTCTAAGGGGACAGGAGGTGGCTAAGAG	aaaaa__aa`Ya`__^]^a\`a]]^VU_TP\]YQT^	chr10.fa		4052524	R	22A13	85					
+HWUSI-EAS610	1	4	37	19	441	0	1	AGGAAGCATAGAGATGGGACAACAGCACTAACCATC	`bbU[bbabab`ba^ba_Y`[Ua_aaabaaaab`]`	chr10.fa		4052552	F	3T32	93					
+HWUSI-EAS610	1	4	95	1172	482	0	1	CAACAAACCCCCCAAAATATGTTCATGCAATCAAGT	abbabbbaba`aabbbbbbba`baaa`ababaaba`	chr10.fa		4052797	R	36	119					
+HWUSI-EAS610	1	4	44	1053	1966	0	1	CAGGGCTCCCAGAGTCTAAGCCATCAACAAAGGAGT	Tb_HV]bUJa^T^baabaabaa`XaVRPZZP_PZ^[	chr10.fa		4053113	R	3A32	30					
+HWUSI-EAS610	1	4	71	657	1497	0	1	GATTCTCACAGCCAACCATTGGACTGAGCATGGGGC	aaaa___aa^aa`aa]Z__`a\]_^_W`\W`aW]_X	chr10.fa		4053228	R	36	8					
+HWUSI-EAS610	1	4	26	1219	1060	0	1	ATGGTTGGCTGTGAGAATCTGCCTCGGTATTTATAA	`V]^RZ_WV\SZXZYHYXXZVZZ]X\]RWX]ZZYRW	chr10.fa		4053245	F	36	13					
+HWUSI-EAS610	1	4	26	392	1890	0	1	GTTGGCTGTGAGAATCTGCCTCGGTATTTATAAGGA	a]aaab`_TTWM]]aVH]aZF[_XNGX_[G]]BBBB	chr10.fa		4053248	F	35C	15					
+HWUSI-EAS610	1	4	66	661	390	0	1	GGTGAATCTCCAGATGGGACAGTCTCCAGATGGCCT	_VF_aa\TMVQQZLP_a^XR^RQ]VRXBBBBBBBBB	chr10.fa		4053381	F	36	77					
+HWUSI-EAS610	1	4	95	951	401	0	1	ACAAATGTGAAGATAAAGTATAGAGCAGAGACTGCA	XW]]]a]ST]]__]X[P_]]`I^\X`aa_a__aa]T	chr10.fa		4053421	R	36	27					
+HWUSI-EAS610	1	4	53	1340	314	0	1	AATATTTACAGGAACAAATGTGAAGATAAAGTATAG	a^``bb]][`[`_a_a`_aaRY]`]``_a__\_a^^	chr10.fa		4053434	R	36	119					
+HWUSI-EAS610	1	4	13	1315	1453	0	1	CCTATTGAAAGTGTCCTTTGCCTTACAGAAGCTATG	a\bb`]V^[abVa[_W_`bb^`aa`aaa_aa_aabb	chr10.fa		4053899	R	36	4					
+HWUSI-EAS610	1	4	21	266	1159	0	1	CGACAGCAGATGTTGAGGATGCATCGAAAGAGGAAC	aaabab_Y[aab_abaaaa^aa_Z_`W_``^`ZXYa	chr10.fa		4054228	F	36	119					
+HWUSI-EAS610	1	4	61	94	1680	0	1	GGAGTTTACAGAGGACTGTTAGCTACCTGAGTTCAG	\]`_aab_bbb_a```ab]]_a\I_aaaaa_T][M]	chr10.fa		4054513	F	36	118					
+HWUSI-EAS610	1	4	13	1471	2036	0	1	TGAAACAGTCTACCTGCCTTTCACCACTGATTAAAC	`ba]`]``^_]]JFV`YW_aa_aPRTV]_]^_S``^	chr10.fa		4054721	R	36	117					
+HWUSI-EAS610	1	4	75	647	629	0	1	AGTTTTTCATGGAGCATATGNCATGTTATCTTCCCA	aba`^b`]_b]\]a\`aa`YDW]Y_Yaaa^aa[```	chr10.fa		4054915	R	20C15	110					
+HWUSI-EAS610	1	4	24	1222	1508	0	1	TTTATGATATAATTGGTAGGATGTTGTGGAATAGAT	aaa``_]a^a]__``aZ^^\]_a^__[\_V\^]_Z^	chr10.fa		4055225	R	36	119					
+HWUSI-EAS610	1	4	44	1363	756	0	1	TCAAGTATCTGGATCCAGAGGAGGCTGAGCATTGGG	`[T\W[ODTZ_V_NZ_Wa`_[`YYV[U[^WWRUSVV	chr10.fa		4055569	R	7G27A	83					
+HWUSI-EAS610	1	4	74	495	293	0	1	GAATTCCCTGCAGAGCTGAAAGCTGCTTTCATAGGA	aaaaaaaa[a`a__`aaa_^a_aa`a_a`___]`a^	chr10.fa		4056487	F	36	119					
+HWUSI-EAS610	1	4	3	91	131	0	1	CACCTACAGTCTGGTCTTCCTGTTGCAGCAACTGTC	aa]a\baaa_a`^_\``aa_``^^`__^_____`W_	chr10.fa		4056546	R	36	119					
+HWUSI-EAS610	1	4	39	766	1893	0	1	GGAAGCAAAGACGTGGGTGTATCTCTGTGAAACGTC	aa_a``U]^a__aU_`\Q\U_[[Z[^UU[Y\\\^W]	chr10.fa		4056633	R	36	119					
+HWUSI-EAS610	1	4	4	1002	1417	0	1	GGGATCTGGGAGGGAAAGTGGATGTGGAGGGGGGAA	``aUZ]^_`[\\^XTXP`Za`U`XQR]P\Z`Z\]NT	chr10.fa		4058226	R	36	35					
+HWUSI-EAS610	1	4	80	659	1038	0	1	ATGTCAGGGTCATCAGGAAGAGCTTGAAGGCACCAG	RZ_`W\YZ_^X__W[[YHT]\^]^``]\]a_ba[KX	chr10.fa		4066559	F	36	118					
+HWUSI-EAS610	1	4	59	469	793	0	1	ATGAGCCATTGGAGTTCTGTCTGTTTAGGTAGGGTG	Y`a]babaab`^_]`^a]``ba_Vbb^Y_^`ba`Ua	chr10.fa		4066701	R	36	119					
+HWUSI-EAS610	1	4	66	138	1013	0	1	ACATAAACTAATGAAAAAACCCTAAGAGATAGATAC	^bb_WYabaa\`baa^TVXaaa`_T_aa`^^``^Ya	chr10.fa		4066875	R	36	119					
+HWUSI-EAS610	1	4	92	943	193	0	1	CAGCTACTGGATGAAGCCTCTCGGAGACAGTTATGC	abba`babaaaaabaaaXaba`\__a`_a`]a``a_	chr10.fa		4067270	F	36	119					
+HWUSI-EAS610	1	4	84	101	104	0	1	GTTGGAAGCAGAGAAAAGCAAATGAAAGGAAGGAAG	\[`aa`Yaaaaabaaa^a``]`]]^^_aa^Z`_UP[	chr10.fa		4068058	R	36	119					
+HWUSI-EAS610	1	4	28	838	1924	0	1	GGAAAATTATTATCGTACATCCCATGCCATGCTGTC	]_\PZ^]bba^]a`_]_]aa\Q`a]\[_a]```aUZ	chr10.fa		4068245	R	36	119					
+HWUSI-EAS610	1	4	61	1550	8	0	1	ACGATAATAATTTTCCTTAATTTTAGTTACATACAC	aaaa_aaa`a`aaaa^baaaaaa`a^]_a]a_a]a\	chr10.fa		4068265	F	36	119					
+HWUSI-EAS610	1	4	34	409	1339	0	1	ACATCATTCTCTACTGTGTGTGTGTATGTAACTAAA	aaaaaaaaa```Z`aa^a]a[a]a[aaa_a\TX^[`	chr10.fa		4068286	R	36	119					
+HWUSI-EAS610	1	4	28	451	1224	0	1	GCTTTAGAATGTATTTTATGGAGATAAGACTGGATT	a\bbab[[Y]`Ua`b``Yaba``]^aa_a``a`_^Y	chr10.fa		4070062	F	36	119					
+HWUSI-EAS610	1	4	42	185	779	0	1	AAAATAATCAAGATAACGATATGAAACCTTAAGAAA	^^`aabZababb``^``N\_aab_`aaaaaa\a`a_	chr10.fa		4070337	F	17A18	100					
+HWUSI-EAS610	1	4	27	88	1870	0	1	TGAGGCCGTTTTCACTGAAGAATTGCTAAGGTGGAA	ab_aabbb__abbaaaa`^``a^]_aZS_[ZEV`T[	chr10.fa		4070568	R	36	117					
+HWUSI-EAS610	1	4	44	1103	450	0	1	ATGTTCCTATGGTCTCACATATCTTTGTCTCCTTTT	aa`a^^`a^aa[P\a`a_a`^``^`_`^\][\]`_`	chr10.fa		4071047	R	36	119					
+HWUSI-EAS610	1	4	87	1667	83	0	1	TTTCGTTTTTTTTCCTGCAGGAACTCATGGCTTCAG	a\`TXGZ]Ya_a`^``^_]SOO[_UNWX\PT^_Z]Q	chr10.fa		4072758	R	36	117					
+HWUSI-EAS610	1	4	31	279	402	0	1	TGATTCCAGCACTCTTCTGTTCTTAGCCTCCAAAAA	a``^aaaaaa_aaaaaaab_aaaaa^a_aaaaa__`	chr10.fa		4073939	F	36	119					
+HWUSI-EAS610	1	4	3	667	596	0	1	AAGTTTTGTTGGAGATGGCCAATTTCAGACACTGTA	a_aSaaa`^\``^`a\``^_^Z^__\_^ZZXX^_Z_	chr10.fa		4074323	R	36	119					
+HWUSI-EAS610	1	4	60	736	615	0	1	GTTGCCATGGTCCCTTCGTATCAAAGGAGCAGTGAC	a`baaa`^aa]a^`aaa``aaaa_`^a\a```\aa_	chr10.fa		4074722	R	36	119					
+HWUSI-EAS610	1	4	20	124	1239	0	1	GGCTGGCCTATATTTTAGAGGCTTGGGCCATCATCA	^abaabbaaababbaabbM`bb_aa`b`baa`[`a[	chr10.fa		4074784	F	36	119					
+HWUSI-EAS610	1	4	15	179	541	0	1	TGTCCTCCTGGGATTGGTCAGTTTGCCAACACCTAA	_aU_a`a_[__\bb_U_S]abba\]\`U_bbab`[\	chr10.fa		4075462	F	36	34					
+HWUSI-EAS610	1	4	51	969	247	0	1	ACATGCCCTTGCCACCCTGATTGGCTAAAGCTGCAT	aab`]aa_^_a^_`a``aaaaa][`__^a[[`a_^a	chr10.fa		4075555	R	36	48					
+HWUSI-EAS610	1	4	14	412	189	0	1	GAAAACTGTGTATATCTGTGCTTAACTGTATGAGTT	\YZUZaa]a__a``Taa]Q__aa`a]XW]_`Y^]L]	chr10.fa		4076015	F	36	118					
+HWUSI-EAS610	1	4	42	245	738	0	1	GACGATCTAACTAGTGCAGTACTAACTAAGGACTAA	\F[\Z_XZ``a[Q^Q[`VSMN\\\]_^W^^^_][W^	chr10.fa		4078132	F	36	117					
+HWUSI-EAS610	1	4	22	864	1911	0	1	TGGACAAAGCTCAACTTACTGATTGGTAGAGAAGTT	aa__RS`a`X`SZ[]^```_]G\_]_TX``]R\`^`	chr10.fa		4078209	F	36	118					
+HWUSI-EAS610	1	4	28	1744	978	0	1	AACTTACTGATTGGTAGAGAAGTTCACTCAAGCCCA	`babaaaaaaaaaVTa`b\ab`]]]_^`_a`_`___	chr10.fa		4078221	F	36	119					
+HWUSI-EAS610	1	4	20	1191	1265	0	1	AGGTAGGACTATGTGCTCAGGAACACTCTGGGCTAT	ab_H[T`_abbbaaa`aaabbab`a`aaa^_a_aab	chr10.fa		4078335	F	36	118					
+HWUSI-EAS610	1	4	96	175	1761	0	1	GGTAATGTTCCCATAGCTCTCAAACAAAAAATGGGT	`b\U`bb`_bbb_ZL^b_aZ`XQX^Y_THXHSaaaB	chr10.fa		4078433	R	36	113					
+HWUSI-EAS610	1	4	30	948	281	0	1	TGTCTTTAACATGATGACAATCTCTTTAGGGGGCAG	V]]`Za^`^^]YR_VPQVQ]OMMRaWTTO^LDY`\B	chr10.fa		4078621	R	31A4	104					
+HWUSI-EAS610	1	4	65	1488	73	0	1	GTGCCCTTCCAGCAGAAACCATTCCTGTGAGGATAC	L[I_RH]O[MWVZaaX``VWRK\T_YGP\[UVBBBB	chr10.fa		4079115	R	36	98					
+HWUSI-EAS610	1	4	94	374	1388	0	1	CACAGAGGGAAATAACTCCATCTGCAACCTAAGGTC	a[\VV^aa_a`^OQYX_[\]THW]R][H]XSGGUUY	chr10.fa		4079148	F	31CT3	93					
+HWUSI-EAS610	1	4	75	1060	409	0	1	AAATAACTCCATCTGCAACCTACTGTCAGTCCTTAG	abaa_a`aa`aa`___a``_aa]``Z``_X^^__]_	chr10.fa		4079157	F	36	119					
+HWUSI-EAS610	1	4	29	1379	987	0	1	AAATCAAGCAGAGGAAAAGCTGAAAGCATGTCTGAT	a[FYa^[X]\\]]ZZ^_X[Y^a\^V^WR]\MY_[\Y	chr10.fa		4079343	F	36	117					
+HWUSI-EAS610	1	4	79	811	1269	0	1	AGAAAGCCATTGAGAAACACAGCCTAACAGCAGCCT	^aaa_`RN]aab`U`a`^`aa`^X`_YZ]]YT\YL]	chr10.fa		4079605	R	36	118					
+HWUSI-EAS610	1	4	18	875	653	0	1	GAATAGAGACAGGTGAATCCCAGGGTCTAGCTGGTC	a\`\O[^^PZ_`ZNXOHXXX]STXTVGVNPRSYYBB	chr10.fa		4079704	R	36	107					
+HWUSI-EAS610	1	4	51	442	420	0	1	ATCCATGAACTGTCCTAGTATAGCTACAAATACTAT	_baba`b`aaaa_aaaab_aaaaaaa_a`_`a`a_a	chr10.fa		4080157	R	8G27	81					
+HWUSI-EAS610	1	4	48	1568	933	0	1	TAACCTTGTGGGATCCTGTGTTCAAACTCAGCCCAT	aaaX_`_]]__V_]^^]_VaUZ^]^]]ZZ_ZUYXX]	chr10.fa		4080207	F	36	119					
+HWUSI-EAS610	1	4	48	1686	1241	0	1	GTGGGGAAGGAGATGGAGGGGATTTCCCCAGCTTTC	]a_`\\\aWPYQ][^YU]\aZ`^[SV\^KLJEQ]\S	chr10.fa		4080711	R	36	116					
+HWUSI-EAS610	1	4	88	902	1346	0	1	GGGAGGTAAGGCCCTACTGCTGCAAACACCATGCAT	Xab^b_H^ababZb\JWab`XUbXPW]aI^Z]`]\`	chr10.fa		4080991	F	36	117					
+HWUSI-EAS610	1	4	86	1264	1590	0	1	GTCTGGAAGCCTCCTCTCTAAGCCAGGATCATGCAA	a_^`aa_a`Z^`^`__``aa``\U`a__^^`_`^[_	chr10.fa		4081064	F	36	119					
+HWUSI-EAS610	1	4	18	1385	17	0	1	GCAGAGCAGAGCAATGGGTGCAGGAATGGCTGAGAG	aZRX\^]_]^a]VYG]RMY`XMKPXSM\]W\WWWBB	chr10.fa		4081175	F	17T18	90					
+HWUSI-EAS610	1	4	81	457	717	0	1	ATTCAAAAACCCCCTCCCCTCCCAGTGTGCTTGCTC	aaa`XM]bVa_[aZb_aX__`^R\PT]U^\_`]U^]	chr10.fa		4081235	R	36	118					
+HWUSI-EAS610	1	4	37	1383	1393	0	1	GTAATATGGAAGATGTGACTCATTATCTTCTCTTTC	aaa_a^aaaY_aR_^]a[_aaa`a`a_`^^`_a__B	chr10.fa		4081905	F	36	114					
+HWUSI-EAS610	1	4	47	498	307	0	1	TGATTTATGCATGTGATTGTTTTGCCCATATGCATG	aaaaaaaaaaaab_a`aaa_```aaaa````a_aaa	chr10.fa		4083668	R	36	119					
+HWUSI-EAS610	1	4	32	3	1137	0	1	GTCCTCTCTGATGTTCTTTCTTTTCCTGANCANACC	a__b`a_a__LWa`_a^a]a_^`_ba__XD\UDS_a	chr10.fa		4083824	R	29C2T3	101					
+HWUSI-EAS610	1	4	52	1472	437	0	1	TTACTGACATTATTCATCCTTCTGCAGACAGATATA	aaa``a`_`a__`__`_``aa_a`_^W]_]__^`^`	chr10.fa		4084344	R	36	119					
+HWUSI-EAS610	1	4	44	1668	2000	0	1	GAAAGGTTTCATTTAATATTGATTGAGTATCACATA	a^``^_W`a__``_`[a^a_a___a_`[_^[][[_]	chr10.fa		4084913	R	36	119					
+HWUSI-EAS610	1	4	20	1238	93	0	1	AGAAATTAAAGCTGTCCTATTTACTTGATATATCAG	`]_aaa`a_`Y`_`[_`a_`aa`____[a_`_``_a	chr10.fa		4085067	R	31G4	83					
+HWUSI-EAS610	1	4	92	400	1985	0	1	ACCAGGACATCAGGCCTTCAGAGGACCTCTCCTCTC	a`aab_``a^baaaa_\^a]_\^_^^`WWS_a\^Z_	chr10.fa		4085270	F	36	119					
+HWUSI-EAS610	1	4	17	851	926	0	1	GTCCCTGGGAGCTTTGGGGACAGGAGGTCTGGTTGG	a_a`R\a``_`Z_^``__a^aaa\\^\TS^`\K]a`	chr10.fa		4085374	F	36	118					
+HWUSI-EAS610	1	4	72	1449	32	0	1	AAGGCCATTCACATACTGCCCCACCTGTGGATTCAT	abVF]aa`aZ^a`_`R[S`a[\_^\YUWNNXMUV^[	chr10.fa		4085619	R	36	22					
+HWUSI-EAS610	1	4	57	1790	728	0	1	AGGTGGGGCAGTATGTGAATGGCCTTTCCTTCAGTC	`_`VXRXJa`TYa\^VT]aaaR_`_`a\_`a__QV_	chr10.fa		4085629	F	36	16					
+HWUSI-EAS610	1	4	77	1738	1510	0	1	CATATAGTCTGTATTTTGGGTATTCTGAGCTTTTGG	a`baa[]R_`aW`a\a[]`^Q][[^`\YWW_\W[]]	chr10.fa		4085768	F	4C6A21G2	21					
+HWUSI-EAS610	1	4	57	1337	889	0	1	ATTTTGTGTATTATAAATAAGGCTGCTATGAACATA	aabbab^`_aaa``aa`aa_]]\[a`^a`]^aWZ\^	chr10.fa		4086011	F	36	37					
+HWUSI-EAS610	1	4	62	1065	1036	0	1	GAGAGTCTTCTGAGGACCTTAGTGCCCTATGCCAGG	a^b`aaQ``_XSPZPZ]`[\P`^MPT\^_\\P]TZ\	chr10.fa		4086535	R	36	118					
+HWUSI-EAS610	1	4	46	1289	1336	0	1	TATGTTCCACTCACCAGTGATCCCGAGGTCCTGGGT	`_[_]_TZ_a^]]`W[_ZZWT[]M]^``VRRa[ZBB	chr10.fa		4086593	R	36	31					
+HWUSI-EAS610	1	4	54	955	1577	0	1	AGAGGCTGGGATCCATCCTGTCAGGGCCAGTCCCAC	`aa`]`^\`^``\]\`^`^^\[^^]]T\\\ZSZ\^T	chr10.fa		4086699	F	36	119					
+HWUSI-EAS610	1	4	10	1675	549	0	1	GTGCTAGGGGACCTGGATTGTGGAGTCCTCTGGGGA	\```X\__GTPXNZY^U^`UK\VXKRXZXZXUUMY\	chr10.fa		4086770	R	10T25	96					
+HWUSI-EAS610	1	4	57	1003	1331	0	1	CGGTGGCAGAAGCAACAGAGCTTCTTGGAAGGGGTC	ab`Ubaa`a]a[Ya`Ya_]`_``_^_]a]a]X]_\_	chr10.fa		4086842	F	36	119					
+HWUSI-EAS610	1	4	50	559	592	0	1	AGGAAGCAGAGCTGATACCCAGACCCCTGGGCACCT	\_^a_````__aa`_a`a_^]_]a^____T]_]_``	chr10.fa		4086901	F	36	29					
+HWUSI-EAS610	1	4	86	984	2001	0	1	CAAGCTGCTAGTGTATGCTCTGTCCAGCTTCTTTTT	ab]a^`baa]_^_X`aJ^U]]ZSaaX_a[a_`_Ya]	chr10.fa		4087327	R	36	5					
+HWUSI-EAS610	1	4	73	1760	960	0	1	CTTAACAATAAAAGAACCTCTTGAGGAATCACCATG	aab_b````_a__[_babaaa_\__[]aa```_`a_	chr10.fa		4088177	F	36	43					
+HWUSI-EAS610	1	4	44	1722	533	0	1	TTTTTCCATATCCTCGCCAGCATCCGCAGTCACCTG	aabaababbaaaaab``abaaa^__]]_X\``][VV	chr10.fa		4088950	R	36	50					
+HWUSI-EAS610	1	4	57	239	1928	0	1	TGCGGATGCAGGCGAGGATATGGAAAAAGAGGGATA	a`bbbbab_G[abb_aa`aaaaaaaaa`aaaa___`	chr10.fa		4088958	F	9T26	107					
+HWUSI-EAS610	1	4	44	642	684	0	1	CGAAAGGATGGACCATCTAGAGACTGTTGCCCTTTT	aba^b``UaU_`a`[``H_a_[_Kb]W[\[PXBBBB	chr10.fa		4090762	R	32C1GG	7					
+HWUSI-EAS610	1	4	50	566	1350	0	1	AGACACTTCACCCCTTCTTAGAATTGGGAACAAAAA	V_\_\_ab_^aabaX^\^]T[_]\`R\`[^\_b`^^	chr10.fa		4090839	R	36	5					
+HWUSI-EAS610	1	4	4	1442	1659	0	1	ACCTCACTCAGAATTACACCCTTCAGGTCCATCCAT	aT]YU[Q`_`_Q[`_`\\M\[^_U`aZNX\_]X]VZ	chr10.fa		4091002	F	36	118					
+HWUSI-EAS610	1	4	25	1766	1647	0	1	TATTAATGACTGCGTCTGTTGCTTTAGGGGATATAG	a^aa`a^__^_]Z_Z`^]U^_ZZ^^]XX\]XWZZ^Z	chr10.fa		4093367	F	36	35					
+HWUSI-EAS610	1	4	54	1733	936	0	1	TGAGATGATGGTTAATCCAGGTCTAGGTTTTCGGGT	`[``\]]W]UZO]\^a__WQT\___VVT\Z_VLWST	chr10.fa		4095770	F	36	118					
+HWUSI-EAS610	1	4	10	46	1913	0	1	ACCCAGGAGAAATCTAGTCTCCCAGGTCTGCTGATA	abaaaaaaaabaabaaa`a_aa^H]`Ua_`_`a[_^	chr10.fa		4096009	R	36	13					
+HWUSI-EAS610	1	4	2	4	23	0	1	GACTAGATTTCTCCTGGGTTACAGTGGTCTGAGCAC	a`a`aaaaaaaaaa_`a_Y^``aa\_`U__`__\__	chr10.fa		4096026	F	36	55					
+HWUSI-EAS610	1	4	46	221	1660	0	1	CTGGGAGAAGATGAAGGCCTGAACCAGGGACTGTCC	a^aaaYaYHW`aaX]aWaa^`_ba]JV`T]`^YU`a	chr10.fa		4096127	F	36	16					
+HWUSI-EAS610	1	4	73	1323	1941	0	1	GGGAAGCACCTTTGGCTTGGAGTCGGTGGAAACCCC	`aa`[`O_TX^[`_a^_^a`a`O[`aKZ`BBBBBBB	chr10.fa		4096502	R	30C5	39					
+HWUSI-EAS610	1	4	11	687	870	0	1	GTGGAGCACCCTCCAAGTCGGCACCAGCACCTGGTC	a^``^`XX^RR`WTXYaN]R\FWNWKP^\FX`[XS`	chr10.fa		4097414	R	12T23	87					
+HWUSI-EAS610	1	4	57	381	1268	0	1	CTAAGGATATAGTGGAGCACCCTTCAAGTCGGCACC	abbbbbabbbbb_baabbbaaaaaaaaa_aa_^```	chr10.fa		4097425	R	36	119					
+HWUSI-EAS610	1	4	2	1136	552	0	1	CCACCAACTCCTGCTTCCTGGCCATGGTATTGCTGT	`]R^bb]XX]PXZ````_]bb]ZHZ`WS`aX[_BBB	chr10.fa		4098234	R	34C1	14					
+HWUSI-EAS610	1	4	25	1724	1334	0	1	AAAAAGACAGCATTTTCAATACATGGTAGTGTTCCA	`U]^_P\Yab__\a]J\a]YWD[_UUOYVBBBBBBB	chr10.fa		4098667	R	21A9G1T2	24					
+HWUSI-EAS610	1	4	80	1481	1807	0	1	CAAGTAAACCATCCAAACAGCCCCATAACCACTAAA	abba_b`a\aaaaaaabW`b_```a```_`_]a_a`	chr10.fa		4099800	F	36	60					
+HWUSI-EAS610	1	4	80	1542	1707	0	1	AAGCTTTAATAAATTACATTGCAATAGTGGTAAAGC	a``aaaaa`_a_`aa_`_aaa`__a`aY`_^`a`a^	chr10.fa		4100137	F	36	119					
+HWUSI-EAS610	1	4	64	148	742	0	1	GTTTGCAGACTGGAAATCTTGGGATGCTGGCTATGA	^ZL[VVQZ__aaQTWQZ_[]]__Z\\_aa`]TOP[B	chr10.fa		4100331	F	36	114					
+HWUSI-EAS610	1	4	51	939	1800	0	1	CTAATCAGACTAAGGGCATTCTTAGTTAAGATACTG	aba^aabbbabbabbbabbbbbbbbbbbaababbbb	chr10.fa		4100647	R	36	119					
+HWUSI-EAS610	1	4	59	203	1716	0	1	TGTGCCTTTAATCTGAGCACTTGGGAGGCAGAGGCA	ab_bbbbba```a\b`baaaaaa^_^abaab]`aa]	chr10.fa		4101027	F	36	32					
+HWUSI-EAS610	1	4	67	551	1901	0	1	GGTTGTGTCATGTGATGGTTTCTTGAAGTAAACTCG	`ba^^`_PR`_`UYa^[HWab_W]a_I_`aaaa^I`	chr10.fa		4101583	F	17T18	105					
+HWUSI-EAS610	1	4	84	385	343	0	1	GAAGCAGACCTGTGAGAGGACACGTGATGTTTGGAG	aXaa]]a`_`P[GaZ^___\VGU_\_GY^\\U`^W_	chr10.fa		4101631	F	36	13					
+HWUSI-EAS610	1	4	81	1001	409	0	1	AAGTAATAGGGTGCTTGCATAGCTAGGCATGCAATG	aab`bababa`Xa`_abaabab`a`^a`aa`_`Z`b	chr10.fa		4101691	F	36	119					
+HWUSI-EAS610	1	4	50	1325	1669	0	1	TTCAACCCCTCTTTCTAGCCCACTGTCCAAAGGTAG	aa^aaTV[QURZaa[a]`[_LJN[\U_VMMU^[JQa	chr10.fa		4102036	R	36	117					
+HWUSI-EAS610	1	4	34	616	1864	0	1	TACCTCCCTACATTTTCCTAACATGGAGTTTAAATG	a`bbaabbbbabbababaa`bab`aa`a_aaaaaa`	chr10.fa		4102388	R	36	119					
+HWUSI-EAS610	1	4	15	926	79	0	1	GGCCAGTGGCCACATACCTGAAAACTCACATCGCTG	aaabaa`aa``a_aaa`_`b`a^``_`aZ`_`a`]a	chr10.fa		4102618	R	36	65					
+HWUSI-EAS610	1	4	38	1503	1112	0	1	TTCAAATGTTTGACCATCCAGAAGCACAAAGCAGGT	a`]^a`]a^a__`^`a__`^XX__^]^__]YY]]]T	chr10.fa		4102835	F	36	119					
+HWUSI-EAS610	1	4	44	286	30	0	1	AATTCTAGCCTCACTCCCTTGCCTATAGGGAGGAGA	aaaaaaabba_aaaXaaaY[`a`^^_X_a`_`a\`U	chr10.fa		4103127	F	36	119					
+HWUSI-EAS610	1	4	61	1676	882	0	1	GGACACAGTTCAGGGAGATTTCAGAAGGATGGAGAA	aaa`aa\X^`_aa____`_aa`Z]^V]Z`_[V\[]a	chr10.fa		4103258	F	36	119					
+HWUSI-EAS610	1	4	70	342	1867	0	1	TTTGGCAAGAATTCTATCTGTGTCTGTGTGCCTCCA	abbbbbbbbbbbbba]`b_UXbabaaR_Raa]]`^X	chr10.fa		4103348	R	36	119					
+HWUSI-EAS610	1	4	84	1706	1508	0	1	TCCTAAACAACCCCATACTTCCCTCATTGGCTTCAG	a^aaaaa`a^U_[X_aXYa`___a^^__^]]]_]ZV	chr10.fa		4103867	R	36	119					
+HWUSI-EAS610	1	4	21	698	187	0	1	GAAACATCCTAAACAACCCCATCCTTCCCTCATTGG	aaa]N\]U_[ab`_a`ZTZ^Z^FL_`WOY\Z_ZY[[	chr10.fa		4103873	R	22A13	107					
+HWUSI-EAS610	1	4	34	996	1025	0	1	GGCAGAGTGAGGTGCGAAGTGACACTTTGAAAGGGT	\[^^]_`K\aa_U]\`]]_Z^Z]Y]_`]]]VY_Y_Y	chr10.fa		4104021	R	36	118					
+HWUSI-EAS610	1	4	75	532	703	0	1	ACCATCATACCAGACATCTAAGAATATTGGTTATGG	aaab_[_]a`aaaa__a_`\\``aaaa`a[\a^^_a	chr10.fa		4104144	F	36	119					
+HWUSI-EAS610	1	4	30	218	1179	0	1	GTTCTATGAACACCCTATATCATGAGTCTTCAACTC	a_H`\aaa\aababa`a__ab\Zb`bWaa_aa`a_a	chr10.fa		4104356	F	36	118					
+HWUSI-EAS610	1	4	5	390	233	0	1	CTCAATAGTATCCTTCTGTGTATTCCTTACTTTTCA	abbaabbb_baaabaabbab`abaaaaaaaaaaaab	chr10.fa		4104618	F	36	119					
+HWUSI-EAS610	1	4	68	1157	889	0	1	GTAGAAAAGCAGAAATACTCATCTCCATTCCAAAAA	a`aaaa`[`_a_aXaaY__^``__[U^aZY__]]_[	chr10.fa		4105022	F	36	119					
+HWUSI-EAS610	1	4	82	936	1132	0	1	TATAGATCTCTGTACGCTGCCCCATCCTGCCAGGAA	`^abaaa\a`YZVaa```V`^Xa_`aY^`][`X_[`	chr10.fa		4105080	F	36	119					
+HWUSI-EAS610	1	4	53	96	335	0	1	AGGGCACTTGACCTTAAGTGAACTCATATTCACTTT	aa`aaaaaabaaaaaX`a]a\[aaaaa`a``aa`a_	chr10.fa		4105517	R	36	119					
+HWUSI-EAS610	1	4	25	1383	989	0	1	CACTTCCTATTCTTTTTGTCTTTTATAATTTGGTAT	aaabbbababbabbbbbbabbbbbabaabbbb_``a	chr10.fa		4105878	R	36	119					
+HWUSI-EAS610	1	4	47	1332	1604	0	1	GGAAGAATTATAGAGATCAAGAGAGGTGAATTGTTG	a`_`^MW^__\S^X]`_WXZ][]U`_]]Y_\X````	chr10.fa		4106035	F	36	118					
+HWUSI-EAS610	1	4	15	1382	667	0	1	CAATATCATGATAATTACCTAATTGAGTAAAACTGC	abaabbabbaaabbaaaabbbabaaa`^``_a_ab_	chr10.fa		4106379	F	36	119					
+HWUSI-EAS610	1	4	23	604	1430	0	1	GTTGATAACTACTTGGGTAAGAGCCAGTGGCCAAGG	`Zab[^S_aa^\`aaa`M]`^`^^XNZWZa__`^[Z	chr10.fa		4106542	R	36	118					
+HWUSI-EAS610	1	4	21	1073	754	0	1	CTTGGAAATGAGACTTTTCACTCAGCAAACAGAAAC	abaababbbabaaaabbbbbaaabbaaa`aabaaba	chr10.fa		4106825	R	36	119					
+HWUSI-EAS610	1	4	18	1718	1866	0	1	TGAAGAGACAGACCTTGGAAATGAGACTTTTCACTC	``X[a``W[abZPS_aaa^_[`aYZTP^`\^]_TT\	chr10.fa		4106838	R	36	118					
+HWUSI-EAS610	1	4	18	557	1588	0	1	AAGTCAACAAAAGAGAGATTTCATTGCTGCCTTCTG	abaa``abb\aaaaaaa_`aaa`aaaaaa_\`a`_a	chr10.fa		4107209	F	36	119					
+HWUSI-EAS610	1	4	92	1344	1244	0	1	CACTAATCCTATGCATGAGGACTGCATGTTCATGAT	a[_baa_NRL[``Ra_a``Z\`]a_a[Z]]]^__a`	chr10.fa		4107295	F	36	118					
+HWUSI-EAS610	1	4	25	1538	1974	0	1	ATGGAAATTTTAATCAGTCATGTGATGACACTTGAG	_baba^bab\^aaa^[PN_^_aYa`aaa^YZ`SOYV	chr10.fa		4107890	R	36	118					
+HWUSI-EAS610	1	4	60	317	232	0	1	ATAACACACAGGTAAGCATCTGAGACACAATGTTCA	a`aa_aaaaaaa^`_`__[`_]X[`_a`^TZ_Y]^_	chr10.fa		4108153	F	36	119					
+HWUSI-EAS610	1	4	58	1160	1581	0	1	CAAGGCTTCTGGAACAGACGGAAGTAACACAGCTTC	a__baabaa]Z__aaaaa`a`a`[`aa^a___``a^	chr10.fa		4108990	F	36	119					
+HWUSI-EAS610	1	4	56	1724	1487	0	1	ATTCAAACAATATCTTTCCATGAATTGAGCCCTTCA	a`\``\aWaaaaa`ZV[W_^aaa_^YM^_Y_MX`_Z	chr10.fa		4110226	F	36	15					
+HWUSI-EAS610	1	4	26	1488	458	0	1	GAAATTTGGACACATTACTACCGGAGGATCCCGCAA	`baaba^U``_`bbbbabab_^][_^T]_`__I_^]	chr10.fa		4112467	F	36	31					
+HWUSI-EAS610	1	4	78	1188	1423	0	1	GACTAGAGTATTCTGGGTGTTATTAGACCCCTGGGT	_`Xa`b[U\`aa_`]Ya]a`__a]UZ][X]V_XR\R	chr10.fa		4113937	R	36	119					
+HWUSI-EAS610	1	4	97	1159	1198	0	1	TTGTTAGAGTAGATGTGTCTCTGTGGGTGTGGGCTA	aba_^U`R`X^XZQZX_XSZU[_PNV]M]VY][BBB	chr10.fa		4114399	F	36	16					
+HWUSI-EAS610	1	4	29	98	1169	0	1	TGGGCTATAAGACCCTAGCCCTAGCTGCCTGGAAGN	_b]bb]Z^ZX\bbaba^bbbb`^ab`abb^_TH]BB	chr10.fa		4114428	F	35T	32					
+HWUSI-EAS610	1	4	77	472	697	0	1	TATCTGAAGGCTGCTAGTTGAAGACTGACTTCCAGG	a[^\ba`RX\U]a]`aaZQ_]WWP\aaa_]a``X]Q	chr10.fa		4114455	R	36	7					
+HWUSI-EAS610	1	4	64	1459	427	0	1	GTCCATTATCATCAAAGTAGGAGCATGTCTGTGTCT	aa^aSQ_PZ^P_QW\QRQZ\PUQSXBBBBBBBBBBB	chr10.fa		4114538	R	27G7C	17					
+HWUSI-EAS610	1	4	43	1762	684	0	1	ACAATGATCAAGGCAAGTCTGATAAAGGACAACATT	a_ab````aa`Y`_a`a]a_W_``a^WR[]__^^``	chr10.fa		4114607	R	36	27					
+HWUSI-EAS610	1	4	7	1455	2019	0	1	AAAGAATCTCAACTGAGCAACTGCCTAGATGAGACT	abbaaaa^aa_a`_\_`_ab__aU^_^a`____]R]	chr10.fa		4114843	F	36	119					
+HWUSI-EAS610	1	4	73	1161	1263	0	1	AATTGTGCTTATGGTTACAGAAGGTAAGAGTCCATG	abbbbab_ababaa]aaaab_`a`S__`_aXZ__aa	chr10.fa		4115152	F	36	52					
+HWUSI-EAS610	1	4	1	1225	1337	0	1	TTCAAACCACCTTAGGGACAATACTGTATTGAATTG	a`^a^^\_a_W_]Z__^U\__`_^`\Y___`]`^\a	chr10.fa		4115415	F	36	119					
+HWUSI-EAS610	1	4	28	1085	1144	0	1	AGCTTGCCTTCAGCTCCTTCCTTGATTTCCCTCAAC	aa`bb`\`ba]Z^abaabaa]aa^\a_YZaU^`_WW	chr10.fa		4115457	F	36	119					
+HWUSI-EAS610	1	4	51	522	629	0	1	TTGTCATGTAGGTATTGTGGAGATCAGAAGGTTTTT	aZI`[]a`]T`YPU]a^`a_R]``[\aT\a_Z\aa`	chr10.fa		4115816	F	36	118					
+HWUSI-EAS610	1	4	23	1492	1990	0	1	AACCAAAGGTAATATATTTGGGTCTCTGGGCACTTA	`aaa_TL\aQV\aX`^]`_XQXZQU]TVR[TYY\]^	chr10.fa		4118108	R	36	118					
+HWUSI-EAS610	1	4	65	560	974	0	1	AAATAGCTCAAAGATGTTTTATGTGCTCAGTTTCCT	^_``^bba]WW]aaaa`ba_]`a``]`^\a\``^^a	chr10.fa		4118156	F	36	119					
+HWUSI-EAS610	1	4	100	830	235	0	1	GAGAGGAAGAGTTGTTGTCTTCAGCTATGCACCTAC	aa````aaaaa`aa^]][_`a^a__``^\a`^^`aX	chr10.fa		4118715	R	36	119					
+HWUSI-EAS610	1	4	53	489	410	0	1	GAGAGGAAGAGTTGTTGTCTTCAGCTATGCACCTAC	a_a^aa_]\]`]`a_a`^_``_^^^__^^Y]VV]ST	chr10.fa		4118715	R	36	119					
+HWUSI-EAS610	1	4	64	5	634	0	1	TAGAATCACGAACTCATCACAGCTGCTCTTACTTGT	`Ub`\abbbb_bbbaX_`\a`aba`baa`[RYaaa_	chr10.fa		4118867	R	36	119					
+HWUSI-EAS610	1	4	43	562	1579	0	1	GAGTTCGTGATTCTAATCATTGCATCATGTCTAGAG	]Za]aab_aa`aaaaa`W^^^`__a`_^[VZ_`aU_	chr10.fa		4118888	F	36	119					
+HWUSI-EAS610	1	4	75	362	1203	0	1	CAGAAAAGAGGGCTGGAAAATGATGGGGAAAACAGC	aaa^TVZ]Z^a`aaaa^RSY_a__a__\]VP_\T]_	chr10.fa		4118938	R	36	118					
+HWUSI-EAS610	1	4	78	594	676	0	1	GCATCTTGACTAGCCATACATGAGTTTCTACACTCA	aaaaaaaa_a``a]__`]`_a`SaY^`__`a``\[B	chr10.fa		4119051	F	36	114					
+HWUSI-EAS610	1	4	80	7	1902	0	1	TGTAACAACCATACAGGCAAAATGTGCCCACCCTTG	_VOV_ba^a_\FN`^`a[XYRU^`\\`[\FS_`^^`	chr10.fa		4119351	R	36	116					
+HWUSI-EAS610	1	4	26	1167	1383	0	1	ATATTTCTGAAGACACCACATACTGCAGATGTACAA	`baaaa_aa^_^Y_a__[_\a_^^`]^^^Y_W][\[	chr10.fa		4119497	R	36	119					
+HWUSI-EAS610	1	4	80	442	1065	0	1	ACTTGCCAGCCATGCAGGATCTCCCGCTTTGGTCTC	Taaabbbbbaaa`aa]aa_aaaaaaa_a`^aa\__^	chr10.fa		4119687	F	36	119					
+HWUSI-EAS610	1	4	45	1527	1547	0	1	TGCAGAAGAGAGACCAAAGCGGGAGATCCTGCATGG	_bbbaab`aa`b`PZ_a^aabaaaaa]]`_^[^`]\	chr10.fa		4119696	R	36	119					
+HWUSI-EAS610	1	4	75	1315	54	0	1	AGTTAAGTTACAAGCTAGCCAGGAAACAAGCCCAAG	\_N_ZYG]^_ZVW\Y_`\\_ZSO_`^M[TOYRX[WS	chr10.fa		4119850	R	36	117					
+HWUSI-EAS610	1	4	50	664	2018	0	1	AACAGCTTTTTATTGACAGGTTATGCTTTCATACAG	ab\JZa`aaa`a\ZYZ^ZaaS^]Y[__a]S^\\^`_	chr10.fa		4120107	F	36	35					
+HWUSI-EAS610	1	4	75	779	194	0	1	ATCTTGCAGAGAGCTCAACACATCTATGGCACTGCT	aaaabbaba^aaaaaaaaaaaa``a`a`a_`_aaaa	chr10.fa		4120581	R	36	119					
+HWUSI-EAS610	1	4	22	470	1442	0	1	ATCATGACATAATTTTAAATAGTATGCATTATGGAT	a`_aa_aaaaa_aaaaaaa`a`_aaaaaaaa`ba_`	chr10.fa		4120768	R	36	119					
+HWUSI-EAS610	1	4	74	1172	1072	0	1	TTATGACAAGTCCCTTCCGGTCAGCGCCAGCACCTG	`\Q_a^Xa^ZKZ\^^_^V][OO^ZTVY[PUUZUWY^	chr10.fa		4121612	F	36	118					
+HWUSI-EAS610	1	4	64	76	1650	0	1	GCCTGACCAGGGTCACAAGTCCGTTCCTGTCTGAGC	_aa`a\`a`aa_U\Y`^``Y`YJV``^``V`^^`^`	chr10.fa		4121796	F	22C13	10					
+HWUSI-EAS610	1	4	3	1087	503	0	1	GTTGGCAGACACCTCCAAGGTCCCTAGATTACTCTC	a`_`^_``a]a`_XUaa_\\G\\[_U`[^__UV\^\	chr10.fa		4121858	F	36	118					
+HWUSI-EAS610	1	4	75	331	1334	0	1	GAACTTGGTCACACAAGTATTTCAGGGTCTCAGAGG	`\U^a_aaV^]]]]VZ]N]_``_]\_[V`_\\[V^^	chr10.fa		4122006	F	36	25					
+HWUSI-EAS610	1	4	6	1391	614	0	1	AAAGTAGTGACTTTAGATCCATGTCCTGCTTTTCTG	`aaaO_aX`__a^Vaa`_a_aa_]_^_]\^`a^]a_	chr10.fa		4122319	R	36	40					
+HWUSI-EAS610	1	4	25	1547	63	0	1	AGAAATGAGGAAACATAGATATGAGCATCAGCAACA	aabb\aUYSH][]XKSZXUaaa__[``a_aWR[_S`	chr10.fa		4122574	F	36	8					
+HWUSI-EAS610	1	4	25	1641	379	0	1	AGAAATGAGGAAACATAGATATGAGCATCAGCAACA	aabbaa^a\Vaaaaaaa]a`ba``_``W]`U_^a]a	chr10.fa		4122574	F	36	31					
+HWUSI-EAS610	1	4	33	462	1000	0	1	GTGGAGCATAGAAATTCAGAATTGAGAATTCCTCTT	a^aa_aa_a_a````a`_a^a`````_`a`__`_`_	chr10.fa		4123678	R	36	36					
+HWUSI-EAS610	1	4	38	1521	1563	0	1	TGATAGAACTCTGTGTTGGGAGCCGCCCTCACATTT	a_abaa`a`a```[a`aaaaWaW\`WVW[V^\_Y\\	chr10.fa		4125279	R	35C	86					
+HWUSI-EAS610	1	4	99	967	359	0	1	GCCCAGTGTCCTCAGAGGGGGCCAGAATAAAGATCC	]a^X^a]`ISY`]^``_TEWSYU\]KNX_YPNRYBB	chr10.fa		4129946	F	18A17	99					
+HWUSI-EAS610	1	4	27	1554	1302	0	1	TTGGGACTTTGGATTTGGGAATAGTAGAATGCTTAA	_a]]UL]O]_`UT[_`]_]Y]]X[X^]YXY][T\TB	chr10.fa		4130128	F	36	114					
+HWUSI-EAS610	1	4	84	797	675	0	1	AAGCTGTAAAGTTGAAATTTCCTTGGATAGTCCTAG	``babb\b^aa`abaa]aaaa_ababY^_`Za^^Ya	chr10.fa		4131351	R	36	119					
+HWUSI-EAS610	1	4	68	468	1249	0	1	TACAAAATAGCTGGTGGCCATGGAACAAATGGCTAC	[`_b]```b_`aWb_`Y_Y`^a^ZXO_HO^_Y]_[a	chr10.fa		4131825	F	36	118					
+HWUSI-EAS610	1	4	68	797	1974	0	1	AAATTCTGCAGTTTTGGATTTGGACATGCCCTCACA	_WN[`a\ZV``]]]P]]``^UQSUZMX]`]___a\T	chr10.fa		4131924	R	36	118					
+HWUSI-EAS610	1	4	92	267	1881	0	1	AGTAGGGGTGTGTATTGTTCTTGCATACCCACTTTC	[baabaaa^b___aaaa`_aV`_HW_a`aa_a_``a	chr10.fa		4138166	F	23A12	106					
+HWUSI-EAS610	1	4	21	1382	1476	0	1	GTCTATGTCTATGCCTATGTCTATGTATGTGTGTAT	aa`aaaa`^aaaa`_aaaa`_aa``_`__W_X`VW\	chr10.fa		4138710	R	36	48					
+HWUSI-EAS610	1	4	57	827	1532	0	1	CAGCAATTCATCAGGATGCTCATGACTTACTGGTTG	abbbbbbbabbaaaaabbab``ba^\aaaaaaa`aa	chr10.fa		4138916	R	36	119					
+HWUSI-EAS610	1	4	88	1607	457	0	1	CTCACAGCCTTTCTGGATTTGCTTACTATATTAATA	aba\Q[_XX__aab_T_a`b\TV][^_]YUa`TZYa	chr10.fa		4139542	F	36	119					
+HWUSI-EAS610	1	4	87	1663	1231	0	1	GCAACACTATTCAGAATTGAGTCATTACTCCCATTT	\HY]T_]]_][WPOTU\_^QZJWX^\_\]\PYZ]W[	chr10.fa		4140262	R	36	117					
+HWUSI-EAS610	1	4	59	1699	525	0	1	ATTACCCTAGAAAGAGCACTATTTACGTTCTGGATT	ab`baabaa\`aa`a]`aaaaaaa`UTS^^[VP_^a	chr10.fa		4140908	R	36	119					
+HWUSI-EAS610	1	4	50	331	783	0	1	CAGATTGGAGAAGGATTTTTACCAATCCTAAATCTG	aab_aabaaa_baaS_aaaa`aa^`_^aaaaa`a`b	chr10.fa		4141514	F	36	7					
+HWUSI-EAS610	1	4	84	85	1516	0	1	ATGCCACTGAGGCAGGGCCACCTGCTGTGCTGCTTG	a``a``_a\ISX``a``_``\`\a^``P`^\`X\\^	chr10.fa		4141875	F	36	20					
+HWUSI-EAS610	1	4	25	797	1229	0	1	TACAGTTCATACATGCATATGATAAATTTTAGTCTT	ab__``a`_]aY_aaXa__aa]^a`]``a_`\U]^_	chr10.fa		4144115	R	36	119					
+HWUSI-EAS610	1	4	41	1459	10	0	1	TTGACAATTCCATTTCCCCTCTGCCTCCTAAGTGTT	_ba[baWaba\[_]baaaaa_`X\]a[`_a`XNW]`	chr10.fa		4144378	R	36	119					
+HWUSI-EAS610	1	4	61	877	1735	0	1	TTGTTTTCTAGGGGTTGTATTCCAGTGTAAATTCCT	aab``ba`a`a[U^Zab_aaa`^_aZ\Z[WZa_^]a	chr10.fa		4144491	R	36	119					
+HWUSI-EAS610	1	4	54	443	1574	0	1	ATTTCTCAGGCTTCTGTGCCTTTCTTATGGGGTCCT	aabaa^]bbba`baaaab_aba`bbba_aaa``a]a	chr10.fa		4144831	R	36	119					
+HWUSI-EAS610	1	4	51	331	1385	0	1	TATGTGAAGAGGACATGATTAGAATCATAATTATAT	aaaa_`_`aaa`a`aa`_`_[_b_``^aa```_aa_	chr10.fa		4144872	F	19A16	83					
+HWUSI-EAS610	1	4	51	1000	4	0	1	TCTGGGTGTTATGGAANTAGCTGTGGAGTTCGCACC	aaaaaaY`^`a_UV_[DZaa`aa^`_\VZ^[[[__a	chr10.fa		4144991	R	16C19	25					
+HWUSI-EAS610	1	4	68	823	1732	0	1	AGACAGGCTCCAGTCAGATATAGCAAGGGTAGGAAG	aaaa[aa_a``Z\]_aa_a`a]V^a`a_aT_aZ^`_	chr10.fa		4145370	F	36	35					
+HWUSI-EAS610	1	4	3	1012	1251	0	1	GCTCAAAGCACACATCAACACCCCACTCTTAGCAGT	aW^__^_`W_Y_Y\`\`^\`YXYU^W_W_\Y\W\`W	chr10.fa		4145781	F	36	119					
+HWUSI-EAS610	1	4	65	391	350	0	1	AACACCCCACTCTTAGCAGTGGATGAATCATGGAAA	V\Z^_a_`I_U_\\aa_aab`_]bb__aa]b`b]_a	chr10.fa		4145797	F	36	118					
+HWUSI-EAS610	1	4	91	1276	1692	0	1	AGAACATTTCGTCCCAAAGCAAAAGAATATGCCTTC	aaba]aa`a_a]^^```a`_`_``aaa```a^Z_`_	chr10.fa		4145902	F	36	59					
+HWUSI-EAS610	1	4	2	1611	914	0	1	AAAATTCCAGAACACAATGAAAGCAGTGGAAAGAGG	aaQaa`a_XVVa[_]^a`RW`]PUX]VZWN[YRUZR	chr10.fa		4146213	F	36	118					
+HWUSI-EAS610	1	4	100	310	399	0	1	CACTATTGCAGATGATATGATAGTATATATAAGGGA	ab_bbbbaaabaabbbaaa_aab`aaaaaa`aaaa_	chr10.fa		4146710	R	36	16					
+HWUSI-EAS610	1	4	71	452	1662	0	1	GTGTGAGATGCAATCTGAGAGTTGTTTTGATCTGCA	a_b_aaa[`ba`W^a]GZa_a^^a^aaaa__Y]``[	chr10.fa		4148031	R	16C19	107					
+HWUSI-EAS610	1	4	90	258	810	0	1	GAGGAGGGTTCCTCTTTCTCCACATCTTCGACAGCA	aZbaR`Zbaa`a^`b`abaZaa^aa`]_b```_`_U	chr10.fa		4148107	R	36	23					
+HWUSI-EAS610	1	4	79	294	1045	0	1	GATTCAGCAATTTCTATACTGGGCATATACCCAGAA	aU```Z\`baaa`ba_a]`^`aaaaaaaaaa_\a]]	chr10.fa		4148230	F	36	56					
+HWUSI-EAS610	1	4	30	452	525	0	1	GCTACAAATGCAACTAGAGACACAGCTCTGGGTAGT	aa[^_aaa`a^`aY`__aa``a__ZZZ[^Y_\FT`Q	chr10.fa		4148884	R	36	6					
+HWUSI-EAS610	1	4	90	424	1159	0	1	GCAATGGAGGAGNGATTCTCTTTCAACACATCTTCA	aa`\aaa_`\a^D\UZ_]`a_a`aaa``__a`aa]a	chr10.fa		4150024	R	12T23	12					
+HWUSI-EAS610	1	4	85	922	532	0	1	ACCAAGGAGTGGGTGCTTTGGTTCTTCTAAGAAATG	a_]abb_FS[^bZPb[a^UW_`RNU^RMSZ]WR`_]	chr10.fa		4150508	F	7T28	59					
+HWUSI-EAS610	1	4	36	692	1896	0	1	TGGATGGTTGATACTGTTGTTCTTTCTATGGGGTTG	_Z^T^b_\ab`aa`\\]_a\^[]`\]a`\Z^[]OYa	chr10.fa		4150839	R	36	24					
+HWUSI-EAS610	1	4	6	1240	216	0	1	GACTAAGCATCAACCATGGCTCCAGCTGNATATGTA	ab`a_`Z^a`_a`_`a_ZW]]]_^]YWTDKV^Y]V]	chr10.fa		4150895	F	28C7	110					
+HWUSI-EAS610	1	4	96	159	1817	0	1	GTACCAAAGACCCCTGCCCCCATTGATGTCTGACAA	aXaU`aWGFZ^^G^NVOZ`YRUNWVZ\`GU\XUSQ\	chr10.fa		4150944	R	12T23	103					
+HWUSI-EAS610	1	4	72	1385	191	0	1	CATCTCTTCTATTGAAAATGATAGAAACCCAACTTC	`aa`aaaa_aaaa_aaab\L]_`Xaaa___\`__aV	chr10.fa		4151575	R	36	119					
+HWUSI-EAS610	1	4	23	872	1027	0	1	GTAAATGGCAAACAACATCTCTTCTATTGAAAATGA	a\aaa[\[a\YW_b`]`T_a_]OYa_a_a\^^[_a^	chr10.fa		4151590	R	36	119					
+HWUSI-EAS610	1	4	10	1715	1898	0	1	TCTCTGCTCAGTTGATTTGGATTTTCTCCTGTAATG	\aaU\b_a`_``\a^_a\aa_a`a_[`OV^aR_Yaa	chr10.fa		4151661	R	36	119					
+HWUSI-EAS610	1	4	19	736	228	0	1	AATTCATCTCCTAGAGCCCTACATGTTCTCACAGTG	`bab__bba_bb`aba`bbaZZ^aaTba_bb_`b]a	chr10.fa		4151902	F	36	119					
+HWUSI-EAS610	1	4	18	1093	1282	0	1	TCACAGTGAAGACCAGAGAGAAAAAATAGTCCTCTA	aabaab_a]^a_`_`b_b`a^`aaaa``a]^]`^aa	chr10.fa		4151930	F	36	119					
+HWUSI-EAS610	1	4	69	727	2032	0	1	GTGAAGTTGGAAAAAAGTCTTCAGCTCCAGCTTTCT	`_aaaa___a`aaab``]a`_`a__^a__`_a\_^_	chr10.fa		4152104	F	36	119					
+HWUSI-EAS610	1	4	16	1000	1907	0	1	AAAAAGTCTTCAGCTCCAGCTTTCTATGAAGAAGAG	a\a__`U``_^`][Z__a_^^__Z__Z`Z]^XW_]_	chr10.fa		4152115	F	36	119					
+HWUSI-EAS610	1	4	8	502	1707	0	1	TGTGGAGACTGAAGATAAAAGCACTGTGACCTCATA	aabbbbbabbb`aa_ba_bbbbaabb]``aaaba]]	chr10.fa		4152256	F	36	119					
+HWUSI-EAS610	1	4	85	588	1711	0	1	AAAGGATCAAAGGCAACACTGGAAATCCAGATCATA	aaa`\`^S^aa^bbbY[_ba`bY_abaaab_a_aaa	chr10.fa		4152694	F	36	119					
+HWUSI-EAS610	1	4	80	291	456	0	1	GCCACAAGAGACTGCTAATGAGAAAAAAAAAGAGGC	aaaaaa_aaa_aaa`__`aa_a_^a_^[a_]`^`_`	chr10.fa		4152913	F	36	119					
+HWUSI-EAS610	1	4	68	1636	630	0	1	CATGCTCTGTCACATTCTCTACCTTAGATGCACACA	aaaaaaaa__ab_aaaaaaaa`_a_a``_____`]_	chr10.fa		4153069	R	36	119					
+HWUSI-EAS610	1	4	60	795	544	0	1	CCCTCATGCTCTGTCACATTCTCTACCTTAGATGCA	aabbb`b`ab`bbbab`aa`abaaaa`bbab_ab``	chr10.fa		4153073	R	36	119					
+HWUSI-EAS610	1	4	28	1644	1819	0	1	GGGACATGGAAGTTGATTGTTAGGGATTTTTTTTTT	abbaY^aaaLa`]aa_UaQH``b_S]U_Sa\]aX`a	chr10.fa		4154212	R	36	118					
+HWUSI-EAS610	1	4	93	1317	250	0	1	TTTTAGAGATAGAAAGGATGTTGGGGGTCTCCACAG	a_Z_]^NRN^VWXOF]]_\V_a\\ZNOV\^\``Vaa	chr10.fa		4154434	F	36	117					
+HWUSI-EAS610	1	4	60	1124	153	0	1	ACCAGTAGGTCATGGCTGCTGTGATCATGTTAAACA	aaaa`_aaa]_aaa_`a`O\^Y[WUY__^\]R\^SV	chr10.fa		4154583	R	36	119					
+HWUSI-EAS610	1	4	85	264	46	0	1	TGAGGTGGGAATCTCAAGCACACTGATCTAAGACAC	aba]_Nb```aa`]Z^Q]`_a^O[aYQ`___a]a_^	chr10.fa		4154647	F	36	118					
+HWUSI-EAS610	1	4	62	1211	1655	0	1	GGGGTTATGACTAATAGATGTCATGTCAGATGACAA	aaaX_`aa`]]a[Z```a`a^^Z__[WT\[[R[VX^	chr10.fa		4154707	R	36	119					
+HWUSI-EAS610	1	4	59	718	1475	0	1	GAGAATACAGAGATGAAGAGGTAGCTCTGTTTGTTA	a`a`aa`_aa[a`____a]aaZ`_`a]]a^_^_]`_	chr10.fa		4155410	F	36	119					
+HWUSI-EAS610	1	4	90	1235	1853	0	1	GGCTGATGATGCCTCTACCTCCTGAGTACTGGGATT	aVZ^\[_____X\VQZ_\^_TRUY\WU^\SSVUSSZ	chr10.fa		4155524	R	36	118					
+HWUSI-EAS610	1	4	80	1700	2043	0	1	ATTCAAGCATACAAATNCTTATGTCTTAATCCTTAT	`b`aabba_^bVaba^DLbbbbb_S[aa``Y`b`ab	chr10.fa		4155912	R	16A19	110					
+HWUSI-EAS610	1	4	4	1023	1002	0	1	TGAGAAATGGATCAAGACAGAAAAACATTTCAGAAT	aa_b^aa_``_`W^^`__`_`aZYZ^_`_^\a`Ya`	chr10.fa		4156220	F	36	119					
+HWUSI-EAS610	1	4	25	1344	459	0	1	GAAAAACATTTCAGAATTCCCCAAACGGCCTGTCCA	`ZXT[__Ya_`__NSX_^``_YZ__UQQ[YNRQ\SW	chr10.fa		4156239	F	36	118					
+HWUSI-EAS610	1	4	55	948	517	0	1	TGGCAAGGCTGGACAGGCCGTTTGGGGAATTCTGAA	a`aaaZZV\_`]]\W_\S\`GT^[UZRPX^^SQMUa	chr10.fa		4156248	R	36	117					
+HWUSI-EAS610	1	4	2	153	1747	0	1	TGTAGTTGAAATTATTATGACCAGAATTCAATGCTC	ab_abbbbabbbabba^ab`bbbbb_aab`a`ab_a	chr10.fa		4156376	R	36	119					
+HWUSI-EAS610	1	4	24	902	1125	0	1	AGAATCACCTCTTTGTGGGCTTCAGAGATGCCGATC	ababaaaa`aaaa`[\aaa`aa_aa`aa_a`_`_`_	chr10.fa		4156674	F	36	119					
+HWUSI-EAS610	1	4	4	822	1129	0	1	CTCCTTACATGACTTTAACATGACTTTATTCGGAGT	a`_`bXa]b`b`L`^`Z[\Y_aaabaaaaaabaabT	chr10.fa		4156848	F	36	119					
+HWUSI-EAS610	1	4	82	515	881	0	1	GAATGAATGAATGAATGAATTGTGCTAGTGACATGA	`^a`baTaba_ba__aaa``aa`a_a_]_a`_a_`a	chr10.fa		4157462	F	36	119					
+HWUSI-EAS610	1	4	46	1403	386	0	1	GAGCGTAGCTGAGGGAATGCTTTGGAATTCCCCATG	I``XX_\T\QTZYM^VZ`T[`b^TW]aaa_U`FYaa	chr10.fa		4157533	R	36	116					
+HWUSI-EAS610	1	4	38	923	23	0	1	GTTGAAAAGTGAGGAAGGGTTGTCATGAAAAACTAA	aS_[RULQaY`W[_\[^`YGW^PTS[Z][]]_X_]`	chr10.fa		4157793	R	6C29	101					
+HWUSI-EAS610	1	4	26	158	1967	0	1	GGAAAGACAGACACATGGACACAGAAAAGCTATAAT	YaV_\]^^XQ_``_VTa^`_b`T^P_^_baaa_M^`	chr10.fa		4157896	R	36	118					
+HWUSI-EAS610	1	4	49	566	1350	0	1	GGGGTGGGTGGCTGTTGGTCATTCGGGGGATTGATT	ab_aYaaaYaa_aZ^_]^ZZT`a\a`aaaUY_`T\[	chr10.fa		4158358	F	36	119					
+HWUSI-EAS610	1	4	16	983	680	0	1	AGAGGATATGAGTCAAATTACTTTTTTCTTGCTTCT	ab_]a`aab_S_`_`a_aaa__aaaa`_`a_\_a`a	chr10.fa		4158422	R	36	119					
+HWUSI-EAS610	1	4	37	1454	304	0	1	TTAATGTCAGTTAGGAATTTATGCTTATTGCTGTGA	a`ba]SUTSOTY^OUOV]`a^a^``]``[PWWSYXB	chr10.fa		4158894	R	36	114					
+HWUSI-EAS610	1	4	26	335	1949	0	1	TAAATATGTCAGACATTTAGAAAGAGTAGGAACCTG	_^\_\P[``a\a`]QWa]LZXZP_`\P`a\_aaa[`	chr10.fa		4159896	F	36	118					
+HWUSI-EAS610	1	4	77	928	575	0	1	GAAAGAGAGGCCCATCAGACTTGCATGCGTTGTATG	^aX_baaaaa]G[ZQX_TPaU``N_[a_`T`a\\a`	chr10.fa		4161746	R	18T17	97					
+HWUSI-EAS610	1	4	25	48	1854	0	1	AGGCACCAGCATAGCCTCAAATGAGACAGCTATAAC	ab^b`bZ\bbUaabb`aaaZI`aab_aaV_a_`_U\	chr10.fa		4161995	F	36	16					
+HWUSI-EAS610	1	4	93	1717	109	0	1	CATATGCAATAGTGTCTGGGTTTGGGCAGATTATGG	Xaaba`_`bb\aZUOa``^`]`a`VP]_V\a_Z^BB	chr10.fa		4162058	F	36	110					
+HWUSI-EAS610	1	4	45	607	619	0	1	GAAGGACTGAGAATTTCATCTCTGCTGAAAGGCAGA	^OYZ`\H]a^__[aaa]WZNZY`a^`a`ZL\TVWYB	chr10.fa		4163440	F	36	28					
+HWUSI-EAS610	1	4	3	843	1616	0	1	ATAGTGACTCACGGTAATTTTTTATCTGAAAGTGTT	aTaa]_[_`___aaG_[a_`a_`_aUa_^_S^Za\`	chr10.fa		4163719	F	36	118					
+HWUSI-EAS610	1	4	68	1250	1440	0	1	ACCTTGGAGGTGTCTGCTGACTTTGTGCCCAGGTGA	a]_baa`Wa]UZ`_\baaZX`ZaaaQaa^]ZaaS\_	chr10.fa		4164202	R	36	27					
+HWUSI-EAS610	1	4	31	1645	1002	0	1	TCGGGATCCAGATATCTGGGCACCTTACCTGCCAGA	aa`V^aa_`a]^```VZVa_`a\_a_`\W^YQ^\Y[	chr10.fa		4164271	F	36	38					
+HWUSI-EAS610	1	4	28	1009	972	0	1	TGTATAGACTTGTCTCGGAGCGATCCAGGAATGAAG	ab_a`a``_a`_]^a_\U`Z`__W[V\`\XU^]^[X	chr10.fa		4164362	R	36	119					
+HWUSI-EAS610	1	4	23	330	363	0	1	ATGCACATATATCTGGCATTCAGACCTGTCTCCTGG	aabba``b`aU`aaaaaY_`aaaY_[XY_Y`^Z``\	chr10.fa		4164489	R	36	46					
+HWUSI-EAS610	1	4	73	437	1261	0	1	GCAGACCTGGGAGACAAGATCTCTCCTCTGAGTTTC	aa`aaaaaaaa`a__`\^]_a``_`````a_`\___	chr10.fa		4164572	R	36	9					
+HWUSI-EAS610	1	4	73	837	443	0	1	GTTTGGTCTTCTCATTGTGCCATGGATTTCCTGGAT	aa`aaa]_a__a^_aaa^`_`]aaa^_a`YY``a]`	chr10.fa		4165185	R	36	9					
+HWUSI-EAS610	1	4	64	339	193	0	1	TGAAGTTGAAAATCTCAAGTATTTTGTAACAGCAAT	aaaab]a`aaa`bbaa`aa\aaaaba`a`a`b`_`_	chr10.fa		4168427	R	36	119					
+HWUSI-EAS610	1	4	89	1067	418	0	1	TAAGACAGAGATTCTGAACTAACCTTCTGAAATGCA	aba\`_\^_aT^a[\V]`_a_]X[^a]`]YV__]TV	chr10.fa		4168583	F	36	119					
+HWUSI-EAS610	1	4	88	207	1298	0	1	GTCTTACTAATAACAGTATTCCTCAAAATGACAAAA	a]`a^^a`aaa`]aaa[a`\``_a``_``aaaaaZB	chr10.fa		4168787	F	36	115					
+HWUSI-EAS610	1	4	68	824	710	0	1	AAAGCAAGAGTGGAGCCATATAGGAAAACTTTAAAT	aaaaaaaa`a^a`_`^^^a_a`a`Y\__]```[\``	chr10.fa		4168970	F	36	119					
+HWUSI-EAS610	1	4	37	1565	1108	0	1	GGTTTATGGATGCACTCTCATTGGCTGAGGTATCCC	Vaabbbababaa_V^a_baaa``]aaa]]__a`a`a	chr10.fa		4169023	F	36	119					
+HWUSI-EAS610	1	4	57	247	62	0	1	TGTGCAGAGTTTGTAAGACTGATGTGCAAGTTGCAC	abS`a`[^[`aaaZ^_``_`a`_aZa___`]`aa^`	chr10.fa		4169186	R	36	119					
+HWUSI-EAS610	1	4	70	1067	1106	0	1	CAACTTTCACCTTCCAGGTCATCCAGTGACACCTAC	ab```ab`b`_aaaa_aa\aaaa^`a\`__`^^`__	chr10.fa		4169364	R	36	119					
+HWUSI-EAS610	1	4	34	104	476	0	1	CATTAAAAGCCAATCACTGGACACCAAGACTTTAAG	aa]`W`a__`aa_`aS^Z^_Z_Ya`^`_S_]__]Z`	chr10.fa		4169518	R	36	119					
+HWUSI-EAS610	1	4	32	838	389	0	1	ACCTCTCACCACACTCCTGCTCTGGCCAAACTGGCA	a`^___\`^a]a\X_b^``\b^]^\RV_____]W[^	chr10.fa		4169596	F	36	119					
+HWUSI-EAS610	1	4	97	578	1988	0	1	GCAATACTTAAACACTGTGAAGGCTTGATGTTTCCA	aba`a`aaabaa^_a^aU__a^Ya]`\__\SW_]`V	chr10.fa		4169696	F	36	119					
+HWUSI-EAS610	1	4	84	547	656	0	1	TAAGAAGAAAGTCTTCTTTGTTGACTTCTCTCTCTT	aaaa``aaa^b_`a`_aaa_\__``aa__\^]_W`[	chr10.fa		4170524	R	36	119					
+HWUSI-EAS610	1	4	34	466	2012	0	1	ATCTCACCAGACCTAAAGTCCTTCTTTATGTCCTCT	a]baaaba_[a__``_QWT````_`___UTT__]_^	chr10.fa		4171217	R	36	119					
+HWUSI-EAS610	1	4	79	904	1627	0	1	ATTTGACAGCTTCCCAGGACATCTTGTCAATGTCAC	abaa_TLY_O_YPY`^OT_Sa`P]X\Y\[_Y^RU\\	chr10.fa		4177199	R	36	118					
+HWUSI-EAS610	1	4	58	604	1775	0	1	GCCTCCACTGATTTGGCTTTTCTCTTCCCTGTGTGC	ab`baaa`bbaaaba_a`]\a][^aaZ]aaa[_^aa	chr10.fa		4177756	R	36	119					
+HWUSI-EAS610	1	4	33	5	582	0	1	CAGTGGAGGCTTTTGTACACAAGGGGATGGGGACAA	OX[^b`Tab`Jba`RHNTQRJ[`aXaZ_QH\`Z_BB	chr10.fa		4177782	F	16G12A5G	74					
+HWUSI-EAS610	1	4	71	1413	537	0	1	CAAGGAGATTCCGTTCAGTGTGAGTACAGCTGTGCC	_^]YTR\T_^__XZ_Z\\\`___Z[`__X^\OSOYY	chr10.fa		4178486	R	36	118					
+HWUSI-EAS610	1	4	12	3	928	0	1	GGACAAAAAGAAAACTGTTCATTTCAATATGATGTT	abbba]aa`bbbbabbb_abbaaab^``\abaaa_`	chr10.fa		4178625	F	36	119					
+HWUSI-EAS610	1	4	44	1623	17	0	1	AAGCAGCCTGAGGTGGAACTCTTCAAAGGAAGCCTC	a`^\`W`\^\UZLNVU^`Z_^^XW\WZUS[[UUVWV	chr10.fa		4178668	F	36	118					
+HWUSI-EAS610	1	4	70	883	1086	0	1	AAGCAGCCTGAGGTGGAACTCTTCAAAGGAAGCCTC	_O\]aaYZU_T]_S_`^^_`X``^^XXZXXV]\[RR	chr10.fa		4178668	F	36	118					
+HWUSI-EAS610	1	4	43	889	422	0	1	CATGCATCAGATCACAAAGTTATTCCCCACAGTTTA	aaaaaaa]`aaa`__`a`a^aaaaa`_a`^aa^aa_	chr10.fa		4179359	R	36	119					
+HWUSI-EAS610	1	4	32	1158	385	0	1	ATCAGATAGTTCAAACTATTTTGTATCCTACTTGTT	Vabbbb`XaWaaaS\]Yaba^YP__b_abaa^__Xb	chr10.fa		4179819	R	36	119					
+HWUSI-EAS610	1	4	68	560	618	0	1	GGACCAATCCCAGATGGGCATCCACTGAACTGCTTT	aaaababbaaaba`aa_aaa`aaaaaa``aaa_`aa	chr10.fa		4179904	R	19C16	81					
+HWUSI-EAS610	1	4	66	825	1002	0	1	TGAGAGAGTCATCATAGTCACGAGACAGAACTTGTT	aa`a_^`_Q_Z`^_`[YY_W_`_[]^__Y_W^_^YW	chr10.fa		4179984	R	36	119					
+HWUSI-EAS610	1	4	28	1167	958	0	1	GTCAGAGAGTGGTCCTGTGCAAAAGGACTTGGGGTT	a`URXaaVV`UaV_`aXF\^PXQU]MNR_^ONLWNV	chr10.fa		4180252	F	36	116					
+HWUSI-EAS610	1	4	30	606	1536	0	1	TGTGGCTGTGCGTTTACAATGTCTTCGCAAGTGGGC	N\`b`bbbbbb`bbaaa[``^^bbbbb_Z`bbabbb	chr10.fa		4180853	R	G35	100					
+HWUSI-EAS610	1	4	79	1699	1070	0	1	GTCTAGCTATCCAACTTGTCTCCAGGTTTCAGCACT	]aaaaZQ^aa_`_a_`aaYaa``a^JL_`V]_S[UZ	chr10.fa		4181465	F	36	118					
+HWUSI-EAS610	1	4	4	214	1506	0	1	TCAGCACTGGAATTACATGTACATAGGAAATGTATC	ab^bbbbbbbbbbabbbbb^bbbbaab_bbbbaaab	chr10.fa		4181493	F	36	119					
+HWUSI-EAS610	1	4	29	677	1670	0	1	ATGGCTCAGTGGGTAAAGTGCTTCCACATCAGTATG	aabaaa_aa[aaa]aba^^^_a`_`a_a_`_a^^^`	chr10.fa		4181580	R	36	119					
+HWUSI-EAS610	1	4	35	1094	1600	0	1	TATAAAGATCAACTTACTTCTTACAACTCAATATAA	aab`a_\_a\_]Zba]X_^aba\^W_^aaa``aa_Z	chr10.fa		4182188	R	36	119					
+HWUSI-EAS610	1	4	63	1779	1910	0	1	TGTTGAGGATGCATGAACCCTATACTTGGCCTCTAT	ab^a__]`Z]\GS]a]VQGG[_YVNW^`GWQWUV]^	chr10.fa		4182404	R	28C7	104					
+HWUSI-EAS610	1	4	45	742	1464	0	1	GCAAGAGACAGAAATGTAGAGGTTGGAAAGACTGAA	a`^_SX_]]_VO^W``^Z__^`Z\`\VU^]\^__]B	chr10.fa		4182767	F	36	114					
+HWUSI-EAS610	1	4	16	405	879	0	1	GGGCTCTGGGGGTACTGTTAGTTCATATTGATGTTC	\HW^`a]a`X]`N`S`a[`P^JJ]^a__[`]^_W]]	chr10.fa		4183115	F	36	20					
+HWUSI-EAS610	1	4	13	407	602	0	1	GGCATTCTGCAGTCTTTTCATGTTAGACCCAGCAAA	aaa`bbaaaaaa`aaa_aaaaaaaaaa`a``a_aaa	chr10.fa		4183531	F	36	119					
+HWUSI-EAS610	1	4	81	1601	1048	0	1	GGAAGTGAGATGGCTGGTCAGGCCACTTCAGAGCAC	ab_aa_Saa^V_ZZ^aDNIa`]aS[LZ``^W\\_YB	chr10.fa		4183763	F	36	111					
+HWUSI-EAS610	1	4	96	1552	1218	0	1	TGGCCTAGTAGGCCATCACTTGGAAGAGAGATCCCT	`bab``aba_b]U_^\X`UZY_a_TK]a_a`RIRZQ	chr10.fa		4184121	R	36	21					
+HWUSI-EAS610	1	4	59	136	60	0	1	ACCAGTAACATGCAGTTTTTAATCACAATTGATCTG	abaababbbaabbab^baaa`aaaabaabaa`aaaa	chr10.fa		4185773	F	36	24					
+HWUSI-EAS610	1	4	66	1014	903	0	1	GCCCAGCCCATGGTGGGTGCTGCCATCCCTTGGCAG	_a``_``^^^^a]S\]`S]^\X\Z][Z\S[Y\XSZ`	chr10.fa		4186159	R	36	34					
+HWUSI-EAS610	1	4	40	14	1179	0	1	TGTGCAGGGGAAGGACGGCCTTTTCATTTACCAGCT	abaa_Q_bab`bb`Tbabbb`_bbbb`ab_bb_bbb	chr10.fa		4186464	F	36	119					
+HWUSI-EAS610	1	4	93	698	1597	0	1	GAAAAATCAGGCCGAAGAGTCTTTAATACTAATAGA	_UUV``__]]_]^`_S`X_PWX^]a_]_^]b\^P\]	chr10.fa		4186821	F	36	118					
+HWUSI-EAS610	1	4	34	1681	589	0	1	ACACACCATGCACACTACACATACGCACACCACACA	aZ`]`\```[YTY[]S]``[`\^^[^^]__Z^[\^_	chr10.fa		4188328	F	36	119					
+HWUSI-EAS610	1	4	6	1597	1554	0	1	GTATTCTTACTGAGTAAAAAGGAATTCAGCAGGATG	a`_^YOUWNMQ]VTHS[^^a^^\TYX[QUX^^]ZY]	chr10.fa		4188437	R	36	117					
+HWUSI-EAS610	1	4	98	577	480	0	1	GAACCAATTTCATATCTATACTGGAAGAGCAGCATA	aR[V`ZMDYa_XYXV`]^XQ]`TQPW_X`^``^_X]	chr10.fa		4189160	F	7A28	109					
+HWUSI-EAS610	1	4	54	412	1426	0	1	CAAATTGAAATCAACACTTAAATCTTCCCTCTTGGC	_^_aaaaa_]```^`a][^YZ`a`aa^a__\a``_^	chr10.fa		4189521	F	36	119					
+HWUSI-EAS610	1	4	11	123	42	0	1	AGAGGAGGCCGTCCATTGTCAGGAGTCATTTCCAGA	_RR^_WY`]]MFVZYSXRKVXW`BBBBBBBBBBBBB	chr10.fa		4190352	F	36	60					
+HWUSI-EAS610	1	4	62	606	2042	0	1	GTTAAAGATTCACCGAGGCTGAGATTCACCAATTAG	a_`aab^aa_ab__P^[]a`a___^__`^_^__^[_	chr10.fa		4190478	F	36	119					
+HWUSI-EAS610	1	4	84	803	754	0	1	CTTAAGCAGGTGCATATGTATGTGCATGCAAATGAA	aaZ_^`]__\X`Z__\\a`_\_`_W__`a]_]a_Y_	chr10.fa		4190804	F	36	119					
+HWUSI-EAS610	1	4	20	716	84	0	1	ATACAAAGATGAACTTATAGAACAACATCAGATGTT	aaa_aa`aa_`]`W`aa]__]a_`\X^]^]a]]`]`	chr10.fa		4191092	F	36	119					
+HWUSI-EAS610	1	4	23	304	1670	0	1	ACAGTGGGAGTAGTTCCAGGCAACAGACAATATGGT	_`bbabbbbb_bbaabba_aaab`baaaa`ab``XR	chr10.fa		4191264	R	36	119					
+HWUSI-EAS610	1	4	10	967	564	0	1	GAAAAATATGGCCTAAAATTGAGTTTGAGGTGTTTG	a]\W\^W`_YZT[_ZRTW_`a[`[_[_]``PaYY\_	chr10.fa		4191453	R	3G32	91					
+HWUSI-EAS610	1	4	7	483	756	0	1	AAGTAAATGCGAAGTGGGCATAGATAGCAACCTGGC	a`babbaababaab_babaababa_`baaa\^baa_	chr10.fa		4192598	F	36	119					
+HWUSI-EAS610	1	4	69	829	25	0	1	AGTTTACCAGTTGGGTGACGCTTACTACTCAACTTG	`bbbbbabba_b_bb`baababba`abaaaaa_`ab	chr10.fa		4192674	R	36	119					
+HWUSI-EAS610	1	4	10	1331	1155	0	1	GTGTCATGTGCATATCATTTTATCTGTGTTTGCATC	a_a^_^aa[`^`_]`^_a_a`^_^`_^_]___^]_]	chr10.fa		4192791	R	36	119					
+HWUSI-EAS610	1	4	6	1461	1882	0	1	GCTGGCAACTTATGCAAAAAGTGAGGGCACTCTCCC	a__`HT\`]^R`Sa_^VYXIZQJ\^MPR\QVS\WW\	chr10.fa		4192941	F	4A21T9	84					
+HWUSI-EAS610	1	4	81	156	396	0	1	TGACAACTTATGCAAAAAGAGAGGTCACTCTCCCCT	_^__bbbaaabbbbaS_T\F_`aa_aa`a^ababaa	chr10.fa		4192943	F	19T16	108					
+HWUSI-EAS610	1	4	17	170	1624	0	1	ACGTGAGAACAGTTGGGATCTATGCAATAACTTTCT	`a^]ZS\`U]aa]Y^a\JX\V`Waa\IX`a`\Y_a_	chr10.fa		4193518	F	24T11	80					
+HWUSI-EAS610	1	4	29	969	1482	0	1	AACATCTCTAGAAGTCAGTAGGCGCTAACTAGTGAA	Y`YUaWbaab]]a`b_[bbaa``aab_a`b_bS_Y`	chr10.fa		4193777	F	36	119					
+HWUSI-EAS610	1	4	82	1579	559	0	1	TCCCGCTTCACCCATCTTCACTAGTTAGCGCCTACT	`]]`ZT[VGZ`UFUY[UM_`[X`]`]ZM^TVQBBBB	chr10.fa		4193793	R	36	99					
+HWUSI-EAS610	1	4	27	415	1749	0	1	ACACAGCAAAGTAATTCCCTCTTGTTACTATTAGAA	aaa\aa_WZPZVaaaW```___ZVR\\`_^a]WWJY	chr10.fa		4194075	R	36	118					
+HWUSI-EAS610	1	4	22	695	1605	0	1	AAATAACGATGTTATCTCCAGTAGATCTATCTAATG	a_V`PY[PQ[]LVWX[WN[^`ZZ]U_Y_ZWSZMSRZ	chr10.fa		4194925	F	36	118					
+HWUSI-EAS610	1	4	9	1294	578	0	1	CAGACTTATTGAAGTTAACGTGAGGTCAGAAGGGCC	aaaa_aa`ab\PV_[Z`_a_]`]a^]_a__aZ_`]_	chr10.fa		4195810	F	36	119					
+HWUSI-EAS610	1	4	29	939	979	0	1	TGTGGTCTCAGGATTCTTTGGAAGGCTCTGAAGGAG	aa^a`\_a___aZ_a\`aaa`Y\_\^_]a]\[_\\_	chr10.fa		4195995	R	36	119					
+HWUSI-EAS610	1	4	12	725	357	0	1	ACACACACCAGAAAGATACACAGGCATATTTGCCAG	`ababaa^baaaabbaabaaa`a`ababaab``aab	chr10.fa		4196149	R	36	119					
+HWUSI-EAS610	1	4	9	1604	1522	0	1	TGACCCAGAGCTCAAAGGTTCAACCANACACACACC	abb`aaabaaaa`a_aba_a`a`__\DZ_a\``a_Y	chr10.fa		4196176	R	26C9	110					
+HWUSI-EAS610	1	4	67	406	748	0	1	CACGTGCACCCCATCCTGTGACCCAGAGCTCAAAGG	__a_aa\J`X_S_HYRQRX_a\O\^aXQ[_JKGH_`	chr10.fa		4196194	R	36	115					
+HWUSI-EAS610	1	4	68	1496	18	0	1	GACAAACCAAAAGGCCTGTAGGGATCTAGGTAGTGG	^aabbb_a`a_TRVaa`W^aXYZ_^[^a_[UaPXZ]	chr10.fa		4196343	R	36	119					
+HWUSI-EAS610	1	4	64	784	225	0	1	CAATTGATGCCAGATGAGGTCATCCTCTGCTTCACA	a`aaba_aaaaaa`_aaa`Uaa__a``\_]^a]`_^	chr10.fa		4196667	F	36	58					
+HWUSI-EAS610	1	4	11	1552	2006	0	1	ATAGGTCCTGCATGTGGACAATCACCTTCGAAAACA	`bZ]]Z_[`a`a_`_aaa_a_[LYRW__VUZY^]Y`	chr10.fa		4196747	R	36	118					
+HWUSI-EAS610	1	4	67	1159	392	0	1	GGTGGGGGCTTGTGCACATGACTGCAGAACCTATAG	a`T`Z]_UZPS`W]_]Q_^aaW\\\`W^WWS_\W\W	chr10.fa		4197274	R	36	118					
+HWUSI-EAS610	1	4	3	1713	955	0	1	ATAAAAGCATCATTTAGATAATACAGCTATTCCTTA	aa```^]^^^]^____]`^``^`]^Z^[^][[][^_	chr10.fa		4197410	F	36	119					
+HWUSI-EAS610	1	4	98	1068	1613	0	1	TATACATTCACTGGCTATAAAATATGGGCTCATCAG	ab_a_aa]]_]__Y\_[]]_W^_^[TWWVUOY^[S]	chr10.fa		4197452	R	36	118					
+HWUSI-EAS610	1	4	55	1073	179	0	1	CTGCTTAATTAACATGTGAGATCAGTACTGCTAAGC	aba^`\``abaaaab_\Za^```a`_`]a``aa`Z`	chr10.fa		4197563	R	36	119					
+HWUSI-EAS610	1	4	11	156	9	0	1	ACCTTAAAGTGGGTCATTTTGGTGACCTCAATGCTG	aababbabb_aaa]_aaaa^Z_Z]a`a^]V`Z__Z[	chr10.fa		4197884	R	36	119					
+HWUSI-EAS610	1	4	77	478	1409	0	1	ACCAAAATGACCCACTTTAAGGTAAGAAAAACACAA	abaa^`aaaaaaabaaa`__a`Wa^a_\`Za``aa_	chr10.fa		4197897	F	36	119					
+HWUSI-EAS610	1	4	72	440	477	0	1	AGCTCTGTGGATGGATGCTACAACCAATTGCTCAAC	abaaaab`ba_b]YX_aaaaaa``a`^^a__`_``a	chr10.fa		4197935	R	36	119					
+HWUSI-EAS610	1	4	29	341	486	0	1	CGCTCATGGGTGAGGGTTCTGACTTTATATATGGTC	[bbaa`bbbbb``bbb`baabbbbbabbbbbbab`b	chr10.fa		4198172	R	A35	87					
+HWUSI-EAS610	1	4	17	785	830	0	1	CCTAACCCAGTGTGGAAATAGCTGGAGACAGATGAA	aabbaaaaaaabaaaa`babbabaa`ba_ababaaa	chr10.fa		4198297	F	36	119					
+HWUSI-EAS610	1	4	70	462	1362	0	1	GGGAGTTGGGAAGATTTAGTAGGAGACACTGGAGAA	aaa`b_b_^_[P^`aa`aaZS`_a^__]___aXX\Z	chr10.fa		4198416	R	36	119					
+HWUSI-EAS610	1	4	14	489	533	0	1	TAACTATGGGGCAGAGCTTAGACAAAAGACTATCAA	^YXW`aa`Y][W_a`]V]`TZ``a]^[[^_]Y]V\[	chr10.fa		4198535	F	36	46					
+HWUSI-EAS610	1	4	13	334	696	0	1	CACATATGGGATGAGGTGTAGTCCCTGCCCCATGCC	abb_`b]b_a]^Z[``K\R]_Z^\]`aa^a_a\a`^	chr10.fa		4198637	R	36	118					
+HWUSI-EAS610	1	4	35	1556	1361	0	1	TGAAACTTATCAGGTTACTGCTGTAGACTTACCTGC	_`a``^a__``_[_Z__`\`^a[\_T]ZZ^^]ZUZ^	chr10.fa		4198813	R	36	119					
+HWUSI-EAS610	1	4	50	21	1829	0	1	ATGACAACTGTGGAAATGATAATTCTAGTAAAGAAG	`[aa^aaaZ__a`^[``SYNZN[_a^]a]UT[a\ZZ	chr10.fa		4199049	F	36	118					
+HWUSI-EAS610	1	4	74	1345	1879	0	1	GAATTTTATTCAAGCTCATGTTGGCTTCATTAGAAA	a\aba_`a_a\`_^\a_]``[[W]Y^^[]_^[RT\_	chr10.fa		4199146	R	36	119					
+HWUSI-EAS610	1	4	78	297	508	0	1	TGCATTAATGTATTCCTCTCAAACGGGCTTCTGAAG	aaaaabaaaa[aaaaaaaaa``aaaa`a`aaa`a_a	chr10.fa		4199203	F	36	119					
+HWUSI-EAS610	1	4	88	1213	29	0	1	TTTGGAGAATGAAGTAAACAAAGGATCTCCAGATAT	aaa`P^a_a`_``aXa``_Ya`\YSXX\MUZXZ^^^	chr10.fa		4199866	F	36	118					
+HWUSI-EAS610	1	4	73	550	190	0	1	ATTTTAATAGTCTGTTTTCTGGGCAGGGTAATTTCT	V_aXbb__\baaaaWabaaa`^[Zbba\N\a`]a^a	chr10.fa		4200010	F	36	119					
+HWUSI-EAS610	1	4	21	645	776	0	1	TTAACTCATCAAAACATTTTAGAAATTACCCTGCCC	aa`\]aV_RXa`Xa_a`__WK`Y`YaWW]`^``^\Y	chr10.fa		4200030	R	36	118					
+HWUSI-EAS610	1	4	25	1156	1267	0	1	TAGCACTGTCTTTTAAGTCGGGTCTCTGGTTCAACC	Y`bZ_`b_SSXa`X^WZJZbbbUV]\UXTDXUVUF[	chr10.fa		4200098	F	29C6	108					
+HWUSI-EAS610	1	4	57	1349	416	0	1	ACCATGTAACAGAAGATGGCTTCCCTTGTGGAAGAA	\a_YVWPVTWU`a^W]RR\[XTPNW]BBBBBBBBBB	chr10.fa		4200131	F	34G1	72					
+HWUSI-EAS610	1	4	81	1218	236	0	1	TGTAACAGAAGATGGCTTCCCTTGTGGAAGGAACAT	aa`^S^_baa_^HR`Y``b`\X]a^RYWKG[W^^Y_	chr10.fa		4200135	F	36	117					
+HWUSI-EAS610	1	4	53	612	222	0	1	TGGTCACAGAGGTTACACAGTAAGACAGGAAGCCAG	ab`aaa``aaab[aa`aaaa_aaa`_a^^aa^_`a`	chr10.fa		4200184	F	36	119					
+HWUSI-EAS610	1	4	13	282	1712	0	1	ACCACACTGGGCCTTGTCCTTCCTCTGGCTTCCTGC	a`aa_`a`_RSaZ\N^Ga`UUa\S`P`Z]^^``BBB	chr10.fa		4200208	R	35T	102					
+HWUSI-EAS610	1	4	93	864	1248	0	1	ACAGGAAGCCAGAGGAAGGACAAGGCCCAGTGTGGT	]a^W^QaZaaaZZX\]`a`R][aJZFZXT[U`Z[BB	chr10.fa		4200208	F	36	108					
+HWUSI-EAS610	1	4	59	210	896	0	1	GTGGGTTGGTAGACAGACAGACAGACAGACAGACAG	\UQXQP_TQLOXQ]YOYTWUTb`ZZ]YY_SY`_TBB	chr10.fa		4201024	F	36	26					
+HWUSI-EAS610	1	4	2	1145	1189	0	1	ATGGGAGGTAAAGTCAGGAGAATCCAGAGTGTCCAG	abbbb_^^[aaaa_aaababaaa_aaa_a^a`]R^a	chr10.fa		4201510	F	36	119					
+HWUSI-EAS610	1	4	21	285	1175	0	1	CAGCTCTCCTAGCGTGACCAAAAAAGATCCTATCTC	a`aaaaaabaaaabVa`ab`^^[``_aaaa__aa^a	chr10.fa		4201557	F	36	119					
+HWUSI-EAS610	1	4	31	1182	1173	0	1	GAACCAACACTTGAGGTTGTAATCTGACACTCTACC	aaa_a_a`a_``_aa___[^ZY_^`^Y]]Y]]_^]X	chr10.fa		4201611	F	36	119					
+HWUSI-EAS610	1	4	97	754	1080	0	1	TAAACTAATGGCAGCGCTGGATTTGTCATTTTTTGC	a`a^N`__[ZSZZWQ][^a_Y^^^WGOZ^_U`BBBB	chr10.fa		4202349	F	25A10	89					
+HWUSI-EAS610	1	4	55	306	1050	0	1	ATATAAAAGTGGCTTTTATGAATCCCAGCATCCTGA	a]`aaW_[a[a___aaa[[TPZ]W\[NTXTXSUWPY	chr10.fa		4203251	F	36	118					
+HWUSI-EAS610	1	4	26	1565	1151	0	1	GTTGCTTCTGCAGTCTGCAGGCTCACCTGCACAGAC	`U^\`a__XMY]^U[F^ZNV\\WWZMZTNTMUSUSQ	chr10.fa		4203525	R	36	7					
+HWUSI-EAS610	1	4	20	1428	63	0	1	TATGATTTTAAATTTGAGTCTTGTTTTTTGGGTTTG	aa_MS[_`aaaa`a`Z^^_`a`T]aa\a`YQOQa^Y	chr10.fa		4203909	R	36	18					
+HWUSI-EAS610	1	4	54	729	247	0	1	GGGTCCTTGCAGCAAAATCTTAAAGACATATGCAAT	abaWaa^\^]`aaaa^`aaba`\`a^_^`a`_^b``	chr10.fa		4207387	R	36	119					
+HWUSI-EAS610	1	4	46	1547	985	0	1	ATACGGTGCAACCTACTGGTCCTCTAATGTTGTGGA	aaa^V]^WU]_[`_Q_`OQO_`^[][Z`^\_]TRYB	chr10.fa		4208321	R	36	114					
+HWUSI-EAS610	1	4	83	613	1895	0	1	GTCTCTAGTTGGTGGCACTGTTTGAGGACATAGAAG	aWaa___a`a`a\`_aa`_a[aa^_a^_]`_`____	chr10.fa		4209244	F	36	119					
+HWUSI-EAS610	1	4	62	1477	194	0	1	GTTGGTGGCACTGTTTGAGGACATAGAAGAATCTTT	`a_`S[^\__]`YY_][\[\\_`_ZNY_]^_]X__`	chr10.fa		4209251	F	36	119					
+HWUSI-EAS610	1	4	17	1380	1784	0	1	TTATTATGTAGTCCGTTCCCATTGGTCACATCGGGT	_SF^`P\TGZaYVLSQ[]UHIXZV\PYSSSTSFSTX	chr10.fa		4209675	F	32A3	103					
+HWUSI-EAS610	1	4	80	1203	1082	0	1	ATTAAGTTGAGAAGCTAAAATACACCAAAAATGTCA	abbaa^_^YabZ^aaa`_aaaa_S``a_```[]^aa	chr10.fa		4209996	F	36	119					
+HWUSI-EAS610	1	4	1	1727	1975	0	1	GATTAGTCTGGCTATCTTGCTTCACAGATTCACGTT	aaaaaaZZaa__^a^W_`a__`W]T[\_\_[_WaX_	chr10.fa		4210166	R	36	119					
+HWUSI-EAS610	1	4	15	802	1414	0	1	GATTAGTCTGGCTATCTTGCTTCACAGATTCACGTT	aU``_aJ_`aa^a^X`_^^^V[\`[]a[]]__YRO_	chr10.fa		4210166	R	36	118					
+HWUSI-EAS610	1	4	51	1136	11	0	1	GAATCTGTGAAGCAAGATAGCCAGACTAATCAAATC	a`a`aa_^V^````__`_a^a``]_^_^^^Z_`]_^	chr10.fa		4210171	F	36	119					
+HWUSI-EAS610	1	4	1	37	1610	0	1	GCTTTGCCCTGCCTGACTTTAGCCTGGAAAGCAAGC	a_aaaababaaaa`a_aaa][`aa`aaa`\aa_]\`	chr10.fa		4210260	F	36	119					
+HWUSI-EAS610	1	4	52	1473	2042	0	1	ATTTCTGCTACTGTGTACATACACATGCTTAGGGAT	aaaaaaaaaa^aa_a`a_aaa_____[V`_\_^a^^	chr10.fa		4210311	F	36	119					
+HWUSI-EAS610	1	4	59	1294	959	0	1	TTTCTTTCTGCCTTCCCCATATATATGTCCTATATA	abbaaaa_aa_^aa``_`aaaa_`_a__]`a\__`_	chr10.fa		4210538	F	36	119					
+HWUSI-EAS610	1	4	10	583	422	0	1	TTCATGTGATCTCAGGCTTTCTCTAGATCAACCTGT	ab_aaa^aa`Y`^aaaaaaa_a_a```__aa^]aa_	chr10.fa		4211985	R	36	119					
+HWUSI-EAS610	1	4	44	1172	706	0	1	AAATTCCTTTGAATGCCCCTTGTGTCTGATGCTAAT	a\\aba^a`a\Y]_^Z]]_[ZW]`XZTZJ\YT_aaa	chr10.fa		4212188	F	36	118					
+HWUSI-EAS610	1	4	73	649	43	0	1	AGCGGATTTCATTCAATATACCATGGAGACATGTAA	ababbbabbabb`baabbabaabbbbaba_abb^aa	chr10.fa		4212446	R	36	119					
+HWUSI-EAS610	1	4	99	1560	1271	0	1	GAGCCCATGCTGTATACTGGTTGTGTGAAGAGAAGT	a``a_`a```a`]`aa__]\Y__\^V_V_^[UY\ZR	chr10.fa		4212527	R	36	119					
+HWUSI-EAS610	1	4	66	756	1409	0	1	CTTTGAGTCCACAACATCCTGATTGACATGGATTGT	abbbabb`bbbbbbaabaabbbbbbbababbbabab	chr10.fa		4213537	F	36	119					
+HWUSI-EAS610	1	4	10	309	1754	0	1	AGCTATTCCTGCCCCCAAATTTCTGGTGCACCACTT	[aaU[YaaaaabbbaaXXUU___LU_^a`aaa]Y_`	chr10.fa		4214621	F	36	118					
+HWUSI-EAS610	1	4	10	1090	369	0	1	ACAAAATGGCATAGTGAGAGTATACCAGAAACAAAA	aab^a`Ta\^^^YSW__P]YQ`a]H^FY\[[[__Z]	chr10.fa		4215509	F	36	117					
+HWUSI-EAS610	1	4	55	870	580	0	1	TGTGTGCTGTGAGCTGTGTATTACATTATGATTGTT	abUW[a[^UN\O_^a``]Y]`aPM^aaX]XMY^`\_	chr10.fa		4217713	R	36	118					
+HWUSI-EAS610	1	4	48	836	1032	0	1	TAATACACAGCTCACAGCACACAACAATATGAAGAA	]`a_W__^^b`_`a^aa_aaa^aZ`[`a_a__SRPW	chr10.fa		4217726	F	36	119					
+HWUSI-EAS610	1	4	27	1658	1081	0	1	AATTTTTCCTAATGACTAAAAAGGCTTACAACTTTT	a]XKa_^_Y^^W`YVYK\a_[_`W__^\_`[BBBBB	chr10.fa		4218177	R	36	96					
+HWUSI-EAS610	1	4	65	1644	1497	0	1	ATCATTTTGCATTCTTCTACATGTTGACCTCCAGTT	aa_aa_^\_]__^[^\\^\___`^ZRXX]\V\YV[a	chr10.fa		4219340	R	36	12					
+HWUSI-EAS610	1	4	96	1169	1260	0	1	CATATCTGGTTTTATGCTGAGGTCCTTGATCCACTT	a`b^bab_b_Q]_\^_V`b`]GR`aaabaa`^`]Y\	chr10.fa		4219388	R	36	12					
+HWUSI-EAS610	1	4	40	1727	1030	0	1	AAGGACCTCAGCATAAAACCAGATATGCTGAATCCA	aa`^_^\\^`X[a_`_aa]^___^_^UX^]]]Z]X]	chr10.fa		4219397	F	36	15					
+HWUSI-EAS610	1	4	100	544	1493	0	1	AGGACAAAATTGCAACCCACCAATTGGGAAAAGATT	Y]a]]W[``Z^``aaa[a`_X__WaaYZ^^\O`[Ia	chr10.fa		4219586	F	20A15	84					
+HWUSI-EAS610	1	4	35	660	668	0	1	CACCAATCTTAGAATAGCTAAGATCAAAAATGCAGG	aaaab`aabaab`aaaaaaabaaaaaaaaa`a`_aa	chr10.fa		4219858	F	36	119					
+HWUSI-EAS610	1	4	96	967	1850	0	1	TGAGCTTTTGGACTAACATCCACTTATCAGTGAGTA	_YN\aaaba`]`_a_a`a_abV_aaa^_aaT[X_]a	chr10.fa		4220306	R	36	5					
+HWUSI-EAS610	1	4	69	534	1456	0	1	ACAGGTTCTCTTTCCTCTTTGATGTGCATTTTGGCT	S``__V`UaY_]ab^XaX``\JZaYaa]aa`a\\^`	chr10.fa		4220647	R	36	118					
+HWUSI-EAS610	1	4	51	696	1363	0	1	TGGTCCTTGGATGGCCCTCCTGCTTCTTTTAAAAAA	`ba]_]^a`[`__Z\__a`baaa_a_aa`a`a``^]	chr10.fa		4221047	R	36	119					
+HWUSI-EAS610	1	4	21	1787	747	0	1	GGAGGGCCATCCAAGGACCATCCCATCTAGAGATGC	abb^]`aaa]ba]`_Xa_aa[_a_`U^\`UYPZY]^	chr10.fa		4221063	F	36	119					
+HWUSI-EAS610	1	4	48	1426	223	0	1	GTTGCCAAAAGGTGCTTGCTGACAGAAACCTGGTGT	`aa_aaaa`\XXWZZ`^]^```^^Z^_`Y\^VZUZW	chr10.fa		4221136	F	36	43					
+HWUSI-EAS610	1	4	43	606	609	0	1	CGGAGCTCAGTCTGATGCTTAGAACCAAGCTTCCGC	a_^b_^_a_`\a]^^W^_Z_aabb`Z]aa]aa```\	chr10.fa		4221216	R	36	119					
+HWUSI-EAS610	1	4	23	202	1686	0	1	TTCCTGGAAAAGTGATCGTCAGTAGCTGATATCAAC	abbb[bbba``^Z`bbba`b\`_aab`a`Wba`O_a	chr10.fa		4222430	F	36	119					
+HWUSI-EAS610	1	4	41	338	291	0	1	GAGCTAGTGAAATGGAGAGATGCAGGTGGATATGCT	aaaabab`a\aaaaaYb_a_`b_`aaS`a_``_a__	chr10.fa		4223136	F	36	119					
+HWUSI-EAS610	1	4	86	589	1881	0	1	ACCAGCCTACCAGAGCATAGCATATCCACCTGCATC	a_VX[a`STa]GT``a[Y]Wa^_W^]]a]Y\]a`X^	chr10.fa		4223154	R	36	118					
+HWUSI-EAS610	1	4	53	824	1077	0	1	TGGACCAGCCTACCAGAGCATAGCATATCCACCTGC	abb`a^aaa_aa^aaa_a`^``a_aaaa[Y`^^[ZZ	chr10.fa		4223157	R	36	119					
+HWUSI-EAS610	1	4	95	713	640	0	1	TGCTGTTTCCTTTGTGTTGTCCAGGGAAACCCAGAT	abaaaab_aaab`a`baaa^a_aaaa_aa_^]_a^`	chr10.fa		4223245	R	36	119					
+HWUSI-EAS610	1	4	57	1490	1148	0	1	CTGGGGCTTCAAGTCTCTCGAGGGTTAGACTCCTCC	aabbabbbabbbb^`b]aba\`aX^aba`abaaaaa	chr10.fa		4223891	F	36	58					
+HWUSI-EAS610	1	4	30	1282	386	0	1	CGACCTAACTTGGGATCCATCTCAAGGGAAGGCTCC	a`a^aaaaa`\^]_^_`^aa__^`_`]_\]\^^W\_	chr10.fa		4224224	R	36	62					
+HWUSI-EAS610	1	4	66	114	103	0	1	GAATTGATCCTCTCTAAAAGAACTGCAGGGACAAAA	aaa`_aa```a____Y[]``__^^____`^^^]_]^	chr10.fa		4224295	R	36	33					
+HWUSI-EAS610	1	4	84	436	1570	0	1	GGGGGTCTCCTAGAATGTAGCAGAGATCTGGGAGGT	abbabObabba_aa\b`aa^babaaaUaabaa^a^B	chr10.fa		4224465	R	26C9	89					
+HWUSI-EAS610	1	4	51	397	1715	0	1	AAAACTGAGAAATAACCCTCTCAATTTTGTCTCAGT	^YXb`bbbbba[aabaaaaaabaXaaa``_a_a`a^	chr10.fa		4225193	R	36	119					
+HWUSI-EAS610	1	4	56	1769	1250	0	1	TGTGGCCTTGTTGGAGGAAGTCTGTCATGAGGGTGG	``V`]a^`_YQ]SOZTWR`\[^_QXRNZZNZ^WGXX	chr10.fa		4225850	F	36	26					
+HWUSI-EAS610	1	4	75	175	973	0	1	TCTGTCATGAGGGCGGGCTTTGAGGTTTCAAAAGCC	`bTWY_]L[a`a]G^a]`ZXP_X]WDJV]JUURL^a	chr10.fa		4225870	F	13T22	103					
+HWUSI-EAS610	1	4	71	1371	1360	0	1	GCAGCACAGAGGGAGAGGTTCTGGAAAAGTAACTGA	aXb`]a``]Z^]U`]^`a_a__^VYaa_[P^`U[_T	chr10.fa		4225957	R	36	119					
+HWUSI-EAS610	1	4	26	1539	1281	0	1	GCAGAGATTGAGGGAATGGACAACCAGGGACTGGCC	`^a\ZNZ\ZVLU[\^`]OWGN\PUV]BBBBBBBBBB	chr10.fa		4226203	F	19T16	4					
+HWUSI-EAS610	1	4	42	1731	1947	0	1	AGTCTCTGCATCCTGTCTGCAAGCATAGCAGAGTAC	aZ\SWVTXP__U[_^ZY^``VR]__`Y\WXZY\GP\	chr10.fa		4226293	R	36	117					
+HWUSI-EAS610	1	4	27	1273	197	0	1	GCTGTGAGTCTCTGCATCCTGTCTGCAAGCATAGCA	Z_aYQKHFVSP]RMRU]ZRYMRTS\LZUDMY[XBBB	chr10.fa		4226299	R	36	100					
+HWUSI-EAS610	1	4	69	737	1571	0	1	CCCATTGAGACCAGAAAAGGCAGTCCAGCTAGGGGA	]bW[^a`]\V^a`TX_[`aa^ZXU^WSX_UQ]Z[Z]	chr10.fa		4226622	R	36	35					
+HWUSI-EAS610	1	4	20	936	260	0	1	GAACAGAAGTCTTCCTACAAGCCTGGGTTTGCAAAG	[abab[aa`H]_a]a`]SYa`^`[\W[R_]a`a_a`	chr10.fa		4227002	R	36	118					
+HWUSI-EAS610	1	4	96	548	2044	0	1	AGGCCAAATACAACCATGAACACCATTTATCCCTCA	aa_bbbbaaaabaaaa^]`a`_aaa```a``a`[aa	chr10.fa		4227527	R	36	119					
+HWUSI-EAS610	1	4	19	70	39	0	1	GCTTACTTCTCTCAACATTACAAAGTTGTAATGTTT	`aaaa_a_a`a_a__`a_^W^`\]a[`][]^^a[a`	chr10.fa		4227875	R	36	119					
+HWUSI-EAS610	1	4	1	217	1881	0	1	AACTGACCTGATGATACCTAATCTCTCCATTTCAGT	^aaZa`^__aaa`I^aab_a_]`_b]a`Y^__^a^]	chr10.fa		4228214	R	36	118					
+HWUSI-EAS610	1	4	34	272	1909	0	1	CATCCATTTCTAAGCCTCAGCTTAGTCTCTGAACAA	ab`aa^`aaaaaa`aa^`__a_]aa^``a^a]R\_B	chr10.fa		4228435	R	36	114					
+HWUSI-EAS610	1	4	45	1441	1371	0	1	ATAAGGTGTGCCTGTAGCACACAATGGAACTGCCTG	a__]a`T\QZ^W^a_a]\___]__`Z\W\ZUUT\Z_	chr10.fa		4228838	F	36	119					
+HWUSI-EAS610	1	4	20	1361	666	0	1	GAATTACCAGGCAGTTCCATTGTGTGCTACAGGCAC	aa^aaa`__^`___[a__`_\`__W_\`^Y^_^^_\	chr10.fa		4228845	R	36	119					
+HWUSI-EAS610	1	4	46	1139	92	0	1	AAAGAAATTTACAAAAGCTAAATAACCTGATAGCAG	aab``aaaaa__a_^_a`a_`a_`a^_``^[_^_^_	chr10.fa		4229171	F	36	119					
+HWUSI-EAS610	1	4	61	1386	975	0	1	GCACTTGCCCTAAGGATGTGCAAACTAACAGAATGC	a_abaaaa\aaaabaaZb_``a^b^_ab__a__aaS	chr10.fa		4229378	F	36	119					
+HWUSI-EAS610	1	4	99	1365	1561	0	1	ATTATCCTTGACATGCTCTTATTATGAAGTTATGCT	aaa``aa^VaYP]_aabbaaaa``_aa^_^S__aZX	chr10.fa		4229572	R	36	119					
+HWUSI-EAS610	1	4	57	809	1447	0	1	ACTTGGAGGAGACAGGATTACATACTTTCTGTTTAC	aabb`WZ]Y]]YUZ`U`[[^`[`aO[LW^Y]]U]^B	chr10.fa		4229843	F	26A9	97					
+HWUSI-EAS610	1	4	69	388	305	0	1	CTGGATATGTGATAAACTATCCTTAAATGTTGGAGA	abbbaabbbabbbabaabbbbbbbaaaabaaaaaba	chr10.fa		4230008	R	36	119					
+HWUSI-EAS610	1	4	60	1263	518	0	1	CATGAAGCACAAGTCCAGACATAATTGTCAATCTAT	ab]bZZaaba[^^[[OZW]WU^]`^[IR__]a[[`\	chr10.fa		4230317	F	36	118					
+HWUSI-EAS610	1	4	85	1681	1469	0	1	GGGAGGAATTTTCTGAGATCTGAATCTGGGTGTTTA	^`^b^aabab`baaaaa_aaba``a`aaa`]a_aaa	chr10.fa		4230556	R	36	119					
+HWUSI-EAS610	1	4	24	175	1746	0	1	ATTCTTCTCTGTCCTTCCATCTCTTTTAGAAATTAT	Xabbbbbbbbbabbbbbbbbbbbbbbbbbbabbaab	chr10.fa		4230857	R	35C	80					
+HWUSI-EAS610	1	4	36	319	1492	0	1	CATATAGCCATTAATGGCCTAGCGGGGGCTCTAGTT	ab]]]XV`aaaTX\Z]Xa`VS\`[XLVJYTVQRSRU	chr10.fa		4230933	F	36	118					
+HWUSI-EAS610	1	4	89	441	1430	0	1	CACTGGAGCAGGGCCAACCTACCAGCGACTACATAG	aba_aaabbb^`^aababa_]aaZa`b`a^aaa]_^	chr10.fa		4231097	R	36	119					
+HWUSI-EAS610	1	4	21	1235	1970	0	1	AGGAATCTAATGTTTTAAAACCAGTCATTATCCTCA	aVZ^__^_\]]_]__]S^]^ZZZ]WTY^]Y\SUY[W	chr10.fa		4231322	R	36	119					
+HWUSI-EAS610	1	4	12	224	100	0	1	GACTGTGACTGCAGTCAGGATCTGGCTGTTCCCAAA	_ZTaTEUUa]`]]aPZ]`Y]UVP]a^`\BBBBBBBB	chr10.fa		4231486	R	34T1	80					
+HWUSI-EAS610	1	4	1	528	808	0	1	GAAGAGAGGACCAACTAGAGGATAATGATGTGATTT	`_\a]`V[R[\^]]_U\a^^\X]WXX_W[^W_UZ__	chr10.fa		4231978	F	36	119					
+HWUSI-EAS610	1	4	24	1046	567	0	1	TTAGGCAAAGGGCAACCTGGCAAGATTTTAAGGCAC	]^]a^^Z`_Y]XaaX[\bb]__`]____]]V`^[[]	chr10.fa		4232820	F	36	119					
+HWUSI-EAS610	1	4	16	493	368	0	1	AAAAGTCAGCCCCTAACATCACAACAAGGAAAGTGA	aabbb`ababba_bbaa``abaa`_aaa`aaaa]a_	chr10.fa		4232920	F	36	119					
+HWUSI-EAS610	1	4	22	899	628	0	1	ATCTCCTGTAATGTCTCACTTTCCTTGTTGTGATGT	Z`a__bbb_bb_a_`bbb`bbaa___V^`Z_a]abb	chr10.fa		4232935	R	36	119					
+HWUSI-EAS610	1	4	17	609	1115	0	1	TATGCCCTTCCTACATAACGGGACCAAAATGACCTC	abba_``aabaaa`_b^_abaa_aa]\^_aaa`_a`	chr10.fa		4233449	R	36	119					
+HWUSI-EAS610	1	4	32	1269	523	0	1	TATAATGAACAGGAAGTTGGCATCATCAGTCCTCAT	aba]_``aa]`]]]RZT\]_]Z]YQSTYQTTZWZYY	chr10.fa		4233498	R	26T9	94					
+HWUSI-EAS610	1	4	89	49	769	0	1	AACCCACAGTCCCTAGAGGATTCTCCACATGATCTT	UZ]baaa^^Xaba^R^S]\ZY_`[a_Y_PZ`\W`YZ	chr10.fa		4233607	F	36	43					
+HWUSI-EAS610	1	4	34	905	1783	0	1	GACAGGCCTAAAAGAATTACTCCACAATTCTCACCA	aaab_aaaaba`aa`babbaaaaaababa`aaa_`a	chr10.fa		4234871	F	36	119					
+HWUSI-EAS610	1	4	52	1378	570	0	1	TCCACAATTCTCACCAGAGACTATGAAAGTTAGAAG	aaaa^`______^_`_a_ba_`_a_^`_^[_`]___	chr10.fa		4234891	F	36	66					
+HWUSI-EAS610	1	4	27	1740	1049	0	1	GAGACAGGGTTTCTCTGTATAGCCTTCGCTTTCCTG	_aaa`baa]T_a__RZa\aaa_`[__```_^_[`__	chr10.fa		4235309	R	36	11					
+HWUSI-EAS610	1	4	58	728	1481	0	1	TGGTGTGTTGTGGTCTCCCATTATTATTGTGTGAGA	aa`Q`_b^aa_^aZYa`[`Yaa[`a_a\a^a_a_a_	chr10.fa		4235779	R	36	28					
+HWUSI-EAS610	1	4	97	343	658	0	1	TTTTCATTTCTGATTTTGTTAATTCGGGTGCTGTCC	a`\``_aa_aaa]_`aaa^``_`_^a_^W`^_a[^^	chr10.fa		4236511	R	36	12					
+HWUSI-EAS610	1	4	18	1719	1275	0	1	TGGCTTGGGGACTCAGGTTTTCCAGTTTTGTTGAGT	aba^^bb]`^`_Y^`a`]a_aa`Z^\aaaa^___^]	chr10.fa		4236612	R	36	119					
+HWUSI-EAS610	1	4	4	760	1173	0	1	TTTGAAGGGACAATGACCCTGCTCTTCTGTTACCTG	_S]XPWROLRX_a__U`[SY[[P^XZ^X[STX]UVB	chr10.fa		4236849	R	7T28	94					
+HWUSI-EAS610	1	4	62	1295	759	0	1	TGGGGCCACCTGCAGTGCAGCTTTAGGACTTGGTTG	abaWU_aaaaa]\a]]a\]a`aaa\]a\^_``^]a`	chr10.fa		4236891	R	36	41					
+HWUSI-EAS610	1	4	30	616	1603	0	1	CGGCTGATGCAGACCTTGTCTCCACTGAGGTGGGGC	Sa`\``a``[`[_`_a_``b__^`aaa`^`\`^^X_	chr10.fa		4236921	R	A35	26					
+HWUSI-EAS610	1	4	96	1128	194	0	1	TAGCCTCCCCCAGCCTGAATCAGGCTGATGCAGACC	_^\\aaZ_]^]`RJWZ[X_XNZaZ\`V[UURKaNN\	chr10.fa		4236942	R	36	16					
+HWUSI-EAS610	1	4	37	845	1763	0	1	AGAGCCACAATTAGACGACCCCCACCCCCAGGTCTT	abab\`a``]`_XZ`^_ZZ`a``a^[\Z\WPXQXY`	chr10.fa		4237408	F	36	119					
+HWUSI-EAS610	1	4	12	283	634	0	1	CACATGTTGTTGTCTTTTCAGGCCCAAGAGTTCGGC	a]_U`b_bb```aaaaaaaaaaaaa__a[\Y`aa__	chr10.fa		4237530	F	36	119					
+HWUSI-EAS610	1	4	37	383	1081	0	1	ACATAGACTCAAGATCATGCTTTCTTCTTTAAGAGT	_aa^\`^a\b^[a``a\^a_a`aa``Y`_aa^W\aT	chr10.fa		4237783	R	36	119					
+HWUSI-EAS610	1	4	56	1186	944	0	1	ATGACATATGTGTGTGTGCGTGTGCGTGCGTGTGTA	_`bba[a[_aZ[`a_aUbab\aa]\a\]_V^a_a]Z	chr10.fa		4237936	R	36	119					
+HWUSI-EAS610	1	4	57	1479	891	0	1	ATGACATATGTGTGTGTGCGTGTGCGTGCGTGTGTA	a`ZXT]a_^O[VUSNYX``]WTXZ__U[UWQUT]W^	chr10.fa		4237936	R	36	118					
+HWUSI-EAS610	1	4	13	812	1288	0	1	GAATGACATATGTGTGTGTGCGTGTGCATGCGTGTG	`XVR[]RXZQ_XQ[O^YU[X[ZQTX`VDKPW]X`VX	chr10.fa		4237938	R	27G8	109					
+HWUSI-EAS610	1	4	52	606	1212	0	1	CATGAGCTTCACACCAGGGTATACTGCCCTCCTTCC	\^_VXZbbb^a]\`ZZV_QI_\Y`b`ZX[]ORZa]X	chr10.fa		4238454	F	36	118					
+HWUSI-EAS610	1	4	62	1459	412	0	1	ATCCAATTTGTGGTAAGAAAAATGGCCCCTTCTTCC	_aa_aaaaa^Z[SZ[`Z]`a_a^\T^^S^^YS_]\X	chr10.fa		4238690	R	36	119					
+HWUSI-EAS610	1	4	26	522	1887	0	1	TAAGCATGCAAATCCAATTTGTGGTAAGACAAATGG	V^^^a^Y\`b_\Y`[^_bbaXS^^\\_\VVYbbb_W	chr10.fa		4238701	R	29A6	92					
+HWUSI-EAS610	1	4	69	424	6	0	1	GGGGGCACTGATGGAGTACATAAGCATGCAAATCCA	ab_[aa_`_aa^^PKWN]XHRUY``[R`\a^QT[_[	chr10.fa		4238721	R	36	117					
+HWUSI-EAS610	1	4	1	1535	1360	0	1	ATTTGTTACCCTTGCTGATGACAAAGTGTTTTAGCA	a^]Z\XO]XMW][[UVUJYO_T_^X_R\LZ[QZZBB	chr10.fa		4238848	R	36	109					
+HWUSI-EAS610	1	4	77	1001	1225	0	1	CCAGAATTAAATCTTCAAGCTTCACTGAATACTGGA	abbbabbababa_a``aaa`aaaaaaa`_aa_\]_a	chr10.fa		4238988	R	36	119					
+HWUSI-EAS610	1	4	15	844	1186	0	1	GGTCACACATGGATGTCATGGTGACCGTCATGATGA	aa[a`G[[_UTYTKYRP\[\XRQXPR^PZRWQQXZX	chr10.fa		4239841	R	36	116					
+HWUSI-EAS610	1	4	84	1730	873	0	1	CTACATGTGGGCTAAATCATGACTTCTTTACAGGAC	aba`baa^]OW^a[a`aa``Va`_a__`aa_^[PX`	chr10.fa		4240324	F	36	119					
+HWUSI-EAS610	1	4	35	20	288	0	1	AAAGAACTGAAGACATTCGACAGCTTGGATTCATAG	aaVb`abbba^aabaaaa__aJa```^`[U`ZU[\_	chr10.fa		4240629	R	36	118					
+HWUSI-EAS610	1	4	65	1443	1477	0	1	TCTTCGTCCATCATCCTCCTATGACTATTTTACTCC	^\_^a`Y^VaROXY[QM[PW[^aZH[a^\SQQJ[_]	chr10.fa		4241409	R	36	117					
+HWUSI-EAS610	1	4	88	1427	1637	0	1	GAAAAGAGGGCCAGAGGGGCAGAGAATTAATGGAAA	aY]a`_^UW____aX_`X_\_a__]]_^_]`_[S^]	chr10.fa		4241503	F	36	119					
+HWUSI-EAS610	1	4	89	220	1117	0	1	ACACATCCTAGAGATGCCCCTCTGGCCCTTACTCTC	a`X]`aaa`_a]^`Z]`^a`^_\\Z]\_^UUU]\Y^	chr10.fa		4241551	R	36	119					
+HWUSI-EAS610	1	4	67	105	1671	0	1	TGGGGATATGGAACCTGAAGAGGCTATTTCTTATAG	`bbbbb`abbb_bbabb\U``bbaab_abaabaaaa	chr10.fa		4241658	F	36	51					
+HWUSI-EAS610	1	4	34	81	158	0	1	CAAGCATAATGGAGTATCATTAGTAGGGTCAGGGAT	aaaa`Y]```a`aaVX^a`^a_aZ_aaaX`_a_aX\	chr10.fa		4241855	R	36	46					
+HWUSI-EAS610	1	4	93	300	385	0	1	AACAGCTTTAAGGACAGCGCCGTTCTCAGTAGTTTG	]TXSaX[\_]__XLOWBBBBBBBBBBBBBBBBBBBB	chr10.fa		4242187	R	18T11T5	27					
+HWUSI-EAS610	1	4	27	923	30	0	1	AAGGTTGGGGGATACCCCAGATTGGCCTAACCCTTT	G\``XZ\RR\^T^b``[`WOOO^`^ab`ZQO`R_P_	chr10.fa		4242315	F	36	117					
+HWUSI-EAS610	1	4	59	1045	625	0	1	TCTGCTGGCTGAAAAAACTCCTCTCATTTACAAGGA	aNF[[_aTZa[W\^ZW`_[U]]][XUPVPWX\S]Z[	chr10.fa		4242740	F	36	117					
+HWUSI-EAS610	1	4	38	241	186	0	1	GAAAAGGGTGGCAGTACATTGTCAGCGAGTGCACTA	_a`[aa`_\aa`abYa`aaZ_W`a`_a`aQ`_`a]Q	chr10.fa		4242817	R	36	119					
+HWUSI-EAS610	1	4	5	719	1005	0	1	GCAGAGCAAGACTGTGTCTTGGCAAATTCTATTTTT	a`ba]a_`a`_^_a[_^_a_a_]SP\a`]__aa\]`	chr10.fa		4242881	F	36	119					
+HWUSI-EAS610	1	4	50	345	383	0	1	CAGCTAATCACAAGGTATTGAGAGACCCACATCCAC	aabaab`b`]]``_a\``aaaaa`````aa```aa_	chr10.fa		4243089	R	36	119					
+HWUSI-EAS610	1	4	51	890	810	0	1	AGACATGAGGCAGCATTGGTACAAATAAGCACTCTT	]ab_aa[^W]]]Xa]a`_a_aaaaaaa`a^]Z```a	chr10.fa		4243276	F	36	119					
+HWUSI-EAS610	1	4	41	459	1483	0	1	TTGTTACGGTTGCGAAATGTCTCGGTTTTCATGTGC	aaa``^`aa]a`^`]WW\`W`^`a_S]aa_^__Y_^	chr10.fa		4243376	R	36	119					
+HWUSI-EAS610	1	4	55	946	1122	0	1	ACTGGCATAGCGTCAAAAGAAATAGCTATATCAGGG	`_b`Y`a_a`_]^`aa`_`^`^a_a`aaa``_Va`]	chr10.fa		4244618	F	36	33					
+HWUSI-EAS610	1	4	65	829	518	0	1	GTGCATATCATGTGTGTTCATTTGTGATTGGTTATC	aS^^\_aa]^^a___a[a_`__^aZa_^\a`Y_^aS	chr10.fa		4244930	F	36	7					
+HWUSI-EAS610	1	4	64	506	1056	0	1	GGTGCTGGCACATCTGGTAGTTGTCATGTAGAAGAA	ab^aaaa``a``a]aaa__a\aa_`_aa]^`__a[T	chr10.fa		4245877	R	36	36					
+HWUSI-EAS610	1	4	78	1167	654	0	1	ATTGATATAGTGAAAGACCCACAACGTGAGGACTCC	abba`a`b``Xaaa_^aaa_`^`_Za\__\X^a^]a	chr10.fa		4246021	F	36	57					
+HWUSI-EAS610	1	4	95	1067	1271	0	1	AAAGGCCTAGAATTCTGTTTTTACTCTACTTTCAAT	aY`^^aW^[[S\a`\`a`_`a_\\`\`W[^^]VXOW	chr10.fa		4246524	F	36	119					
+HWUSI-EAS610	1	4	15	724	910	0	1	TGTTTGTTTTTTACTTTTCCAGGTGAATTTGCAAAT	aaa`aa_aa`a``]aaa```]_][\Z^`__`]`^^a	chr10.fa		4246731	F	36	119					
+HWUSI-EAS610	1	4	54	64	177	0	1	AGGTGAATTTGCAAATTGCCCGTTCTAACTCAGTGA	^aa^``aaaaba``a``aaaaa^`aa`V^aaab^a^	chr10.fa		4246751	F	36	14					
+HWUSI-EAS610	1	4	10	1196	403	0	1	AAACGTACTAAACACATATACTAAGAGCTTTAGTTG	a_\]_N^___]][`^]^_\_[_Y_]^]]_]\^SX]Y	chr10.fa		4247522	F	36	119					
+HWUSI-EAS610	1	4	54	614	1170	0	1	GTGTCCAGACAGAGGTCATACATAACAAGTGCATGT	aaa`aaaaa`aaaba`aaaa`_baa_aaaZ`_aaa`	chr10.fa		4247757	F	36	119					
+HWUSI-EAS610	1	4	16	744	336	0	1	TGGGGTGAATAGAATGTGAACAAGTTTAAGGATGTA	abbbbOab_b`aa_a]\aaa_a_b_`aaaa___aa`	chr10.fa		4248516	F	36	119					
+HWUSI-EAS610	1	4	79	398	312	0	1	TTCGAGTGTCTGGAGCCTGAACTACAATCAAAATCA	a_ab_aNa_aaaWQX____^`_]_^`]\aa^^PT^^	chr10.fa		4248566	F	36	118					
+HWUSI-EAS610	1	4	49	100	304	0	1	ATAAAACTAGCCAGCACATACAGAATGGAGAATAAC	`a[_bbba]abbaabb`aaaa_b_aaa_`_`````a	chr10.fa		4248630	R	36	119					
+HWUSI-EAS610	1	4	17	388	1790	0	1	GAAGTTCCTTCTTCTCAGAGGACTTTAGGTTGTGTC	ZY_a\aaaa`aa^a_a_^HZa`aaa_S_`V_`Z[Za	chr10.fa		4248674	R	36	118					
+HWUSI-EAS610	1	4	52	892	1503	0	1	CACTCCACACTTTGTCTCTGTACCTCCTCCCATGAG	aabab``a``bbbbaab_bbaaa_a`_a]^a`b`ab	chr10.fa		4248805	R	36	55					
+HWUSI-EAS610	1	4	86	1256	93	0	1	GAGAGTGTCCACCTCTGTATTTGTCAGACACTTGGC	aaaa^KTYU^\TX[]Z_ZX`^`[[Z`]]Z`^^^\TS	chr10.fa		4248981	R	36	24					
+HWUSI-EAS610	1	4	63	925	1511	0	1	TGCCTCCAGGTTTCCACCTGGTTTGAGTCCTGCCTT	`Z_`aa__a_P`a^Z_^_`URZ`^]Y^__T^`T^^`	chr10.fa		4249612	F	36	119					
+HWUSI-EAS610	1	4	39	897	1130	0	1	TTATTATTGGTGTGATGAAACCAAGAGCAAGACCAA	ab`bb`aaaa^a]b_abaaaa`aaa`a_`_X^`^`_	chr10.fa		4249716	R	36	119					
+HWUSI-EAS610	1	4	51	894	1584	0	1	ATCTGGGGACTAGGGAACAGCAGGCATCATAACCTG	aaabbbbb^`babababaaa_aa^aa`_`aaa[]aa	chr10.fa		4250391	F	36	119					
+HWUSI-EAS610	1	4	9	1629	1262	0	1	GATATTATCTGATCATGGGTCCCTAGTACTGGCAGA	`aaaaaaaaaa]a_````aZ``___a^_Z^^^_^^]	chr10.fa		4250463	F	36	119					
+HWUSI-EAS610	1	4	85	172	1445	0	1	AGACAAGATAGGAGGCTGTCTGCCAGTACTAGGGAC	`aTb_Qa`WabbXaa`UaM`LGObK\RQa`_ZMUG_	chr10.fa		4250481	R	36	115					
+HWUSI-EAS610	1	4	60	356	955	0	1	GGCCATAGGATGATATCCAGTGGCTGATAGCACATG	a^_]a``a`]^_X[aa`aa]P]`[_`[^]a`YY^^^	chr10.fa		4250739	F	36	119					
+HWUSI-EAS610	1	4	69	1649	1696	0	1	TAGCACATGCAACTTTATTTCTAGCACAAGTAGAAA	M\`^a_\aV_aaa`_`bbV\b``baaJJZI`baaba	chr10.fa		4250766	F	29C6	104					
+HWUSI-EAS610	1	4	44	702	1402	0	1	CACAGAAAGAAATGAGTCTGTCATCATTTGCAGACA	aabbbbaaaaabaaaaaabbaaaaaaaaaa_a```a	chr10.fa		4250851	F	36	119					
+HWUSI-EAS610	1	4	66	247	152	0	1	TTCATCTCAAGTCCTTGACTTTTTTCTGTCATCCAA	L`\R_b_Y\`\ab`\Y]R^Y^\Za\\_P_`\\UPH\	chr10.fa		4251477	F	36	117					
+HWUSI-EAS610	1	4	3	1073	791	0	1	AAAGGAACTTTACTGAAGGTCATAGCACACATTGCA	aVO^`]_[a`URR]a__b_LMWWTR\SMYYV_BBBB	chr10.fa		4251616	R	36	29					
+HWUSI-EAS610	1	4	82	1198	1979	0	1	GTTTCACTGTATCTTAGTTTAGTTTTTGATTCCATG	aabb`aaa_`aa_aa_a_bbaa_a`a`aaaa^^_`a	chr10.fa		4251847	R	36	119					
+HWUSI-EAS610	1	4	18	533	1660	0	1	GAGGTGCTGAGAAGAAGAAGGTATATATTCCTTTGT	aabb_ababbaaaaaa`[aba^aaaaaaaaaaaaaa	chr10.fa		4251942	R	36	119					
+HWUSI-EAS610	1	4	42	962	1404	0	1	GGCTAAAGAGGCTAAGAAAGAAATTAGGGAAATGAC	aaabaa```a``aa`a`a``^aa`a_``a\\\``[Z	chr10.fa		4253575	F	36	42					
+HWUSI-EAS610	1	4	49	1709	739	0	1	TATACCAATACCATGCAGTTTTGTTTTTGTTTTTGT	aabbaaaaa_^`\a``]a_aa`a```a``^a`a`a`	chr10.fa		4253999	R	36	34					
+HWUSI-EAS610	1	4	45	312	764	0	1	ACCTATGGTCACTTGATCTATGGCAAGGGAGCTAAA	ababbabaXb[aaaa`^aaa`aabaaaa``aaa]aa	chr10.fa		4254091	F	36	11					
+HWUSI-EAS610	1	4	38	493	869	0	1	CAAGAATTGACAAATGTTATTCCAGATGAATTTTCA	aaa`[a`aaY_a__a[^_`a`aa^`b_a^[Ya___`	chr10.fa		4254367	F	36	119					
+HWUSI-EAS610	1	4	15	417	460	0	1	ACCAGCAATTCAGGAGTGCTCATTTCTCCACATGAT	aaaaaabbaaaaaa_a]aaaaaa_aaaa`a`a````	chr10.fa		4255295	R	36	119					
+HWUSI-EAS610	1	4	26	1004	844	0	1	TGGATATTAGCCCTAAAGCTCAGAGTACCCAAGATA	aaa_^____^ZZ]_``^]__^^Y^]Y^]^X]]_]Z^	chr10.fa		4255712	F	36	25					
+HWUSI-EAS610	1	4	44	1596	998	0	1	TGTGGAGCAGAAACTGAAAGAAAGCCATCCATTGAC	aa`]aa_aaa_aa^a_]`a___`^_`_``]^_^]_]	chr10.fa		4255859	F	36	119					
+HWUSI-EAS610	1	4	89	1027	1750	0	1	AGCCAACTATTGGATTAATCACAGGGTCCCCAATGC	abb`aa[babaaa_abb]a^a_aaa`^^`__a`aa[	chr10.fa		4256042	F	36	58					
+HWUSI-EAS610	1	4	21	1072	358	0	1	ATCAGCTCTCAGTGGGCTTAGTTTCCTTTCATGTGT	abbbba_]_b_aZaaaaZ_Z^_a`ZX_`aab_aaba	chr10.fa		4256879	F	36	119					
+HWUSI-EAS610	1	4	91	607	998	0	1	AGGCTTGAGTGAGGGTCTCCCTTCGGGGGTATTTCA	a_``ba^]a^b_aaa^aaaaaaa`^]a`aU_`a`^^	chr10.fa		4257575	R	36	4					
+HWUSI-EAS610	1	4	50	222	1068	0	1	CAGCACCTGGAATTGGTATCTCCTCTGGGGACCTTA	aab]aaaba]P`aba`[aaa`aa``aa_aaa___^Z	chr10.fa		4266486	R	36	39					
+HWUSI-EAS610	1	4	18	1043	1847	0	1	GCTGCACTCTGAGGAGTCCTGGATCAACCAGGATTA	`UY\ZYZTZa^Q]_^_MKTZW]WTYTTLPN][ZR[T	chr10.fa		4266680	F	36	18					
+HWUSI-EAS610	1	4	47	1446	1378	0	1	CATTTCTTTGATAGTTGTGTCAATGTTCCCTATGGA	Y^^a^_aaaaa`_Z\`a]T_a^`\```^_R[\`__a	chr10.fa		4267212	R	36	44					
+HWUSI-EAS610	1	4	71	71	448	0	1	TTTTAATATTCTACCTTTATGCAGTGCATCTGTTGT	aaabaa_R`bba]bbaaaa_aa`a`aaZ_aab`aa`	chr10.fa		4267503	R	36	119					
+HWUSI-EAS610	1	4	84	942	596	0	1	TGAAATTATCCCATGCATATCAGATCCCCACAGACT	a`aaa`Y]a[[a``_`]_T^`_`[[]S^a`^^\_^a	chr10.fa		4268568	F	36	119					
+HWUSI-EAS610	1	4	24	198	1047	0	1	GCATACCTAAAAGGCCTAGAGAAAAAGCAGGCAAAG	]`Y_]baaaab[bbGb]aaaa`babb^aa]``_V]a	chr10.fa		4268860	F	14T21	107					
+HWUSI-EAS610	1	4	44	723	464	0	1	TTTACTAGTTTTTTTGAATATAGCCTTTTGTAGTAG	abba`babaabaabbba`baaaa_`aa`aa__a__b	chr10.fa		4269146	R	36	52					
+HWUSI-EAS610	1	4	3	422	247	0	1	AGTGACAGAGAGGTATGTCAATGGAATAGAATTTTA	X`I`^`R_``YaYSa__M[^UW[^a\W_\`\YI\X_	chr10.fa		4270886	F	36	15					
+HWUSI-EAS610	1	4	81	1011	400	0	1	AGCGTAGATGTCCCTCAACAGAAGAATGGATATAGA	`ab_abbaaa`aaaa[aaaaa_a`[aaa``a^a`__	chr10.fa		4271839	F	36	36					
+HWUSI-EAS610	1	4	52	69	190	0	1	GTAGGGCAGTCTCTGGATGGTCTTTCCTTTAGGATC	aZW^a`_X[]`V_``\PQW\Y_a^X\^`Y^\\__V\	chr10.fa		4272187	R	36	5					
+HWUSI-EAS610	1	4	28	298	942	0	1	GAGCCAGGGAGCTGAAAGGGACTGAAGCCCCATGGT	V[_a^``\a^XaS\_`a_`_`aaaaaX[`^U^``BB	chr10.fa		4272407	F	36	35					
+HWUSI-EAS610	1	4	63	765	281	0	1	TACAACCAATCAAAGAAAACACATGGTGGAATTTGT	abbabaabbbaababaa_aaaaabbaXaa^`aabba	chr10.fa		4272492	F	36	14					
+HWUSI-EAS610	1	4	51	665	1731	0	1	TGGGGACCTGGGAAGGAAGGAGAGGGGATAGGGGAT	``]`\Z\^[^a\\Z\\X\a]V\Q[^]\Z^X[]\XZ\	chr10.fa		4272657	F	36	119					
+HWUSI-EAS610	1	4	19	174	1271	0	1	GTATTTTTCCAAATCCTCACACTAATGTTACAAATG	a_ba`a`abb^\`aba`aYaXa`\]`a^_aaa^^aa	chr10.fa		4273286	R	36	119					
+HWUSI-EAS610	1	4	83	448	825	0	1	TTTTCTGACAAAAGAGATTCACATTCCTATTGTTCC	aabb``a_`aaaaa_a]_`aa``a_a]_``^`\]__	chr10.fa		4274187	F	36	119					
+HWUSI-EAS610	1	4	91	1373	1031	0	1	ATTTATGTATGCAATGTGCCTAAGTATATGATTTAG	aaababa`aaa`a`aa^aaaa``a]_a`aa^```_a	chr10.fa		4274261	R	36	119					
+HWUSI-EAS610	1	4	73	319	1218	0	1	CTGCTGAAAATGTGGACATAACAGCTAGAGTGATAA	a_ab`a`]aaaa]``]_aY_a`Z_a]a_R^Ra___`	chr10.fa		4275644	F	36	119					
+HWUSI-EAS610	1	4	42	1252	1746	0	1	GACATAACAGCTAGAGTGATAAAAATCCATACTGCA	aYU]a_[TTV[[TTY]PY_aa_a`^a`_\_^_]`\\	chr10.fa		4275658	F	36	118					
+HWUSI-EAS610	1	4	48	918	1488	0	1	CTTTACATCCTTATCTGTGTGCAATATCTGCAGTAT	^abbb`^aZ`b_`[T`_^\T[`bVbb\]a_[H```b	chr10.fa		4275686	R	36	118					
+HWUSI-EAS610	1	4	88	377	372	0	1	CTTTTCTGTGTAAATGCCATGAAATGTTCTAGAGGA	abbbbbbbab`aa^abb``aaZ_aaa_aaaaa``\[	chr10.fa		4275785	R	36	119					
+HWUSI-EAS610	1	4	98	508	669	0	1	GACAATGAAAGTAAAGCAATCGTTACTGTCTTTTAA	aaa`aaa^[`b_`a_b]_a`___]`Z__[_]]_`^_	chr10.fa		4276025	R	36	119					
+HWUSI-EAS610	1	4	50	550	1402	0	1	GGGACGATTGATTAGATTTTAGAGATTGAATCCAAT	U^`_a\]\`UYHY_ba]^^_XT]_S\^ZP^]``]][	chr10.fa		4276793	R	36	118					
+HWUSI-EAS610	1	4	100	536	607	0	1	TTAGCTTGGGTTTTATTTGTATCATCACCTACCAGA	ab]a^^abaa]abaaaaa`^aa_aa``__`a_^aaa	chr10.fa		4276864	F	36	119					
+HWUSI-EAS610	1	4	28	1471	816	0	1	TTTGTGGTAATATTTATGAACTCCCAAATTTATTGC	`aaSVZ`aa[\O^aaa]V_a_`a___Z_`aaa`YYY	chr10.fa		4278202	R	36	119					
+HWUSI-EAS610	1	4	70	76	561	0	1	ATTCTTTGAGGCCAGTTACTGTTTGTCATTATTTTA	Y_bbb_a_J^`b_X^X^b]Q\_ba_Wa__`SZa`a_	chr10.fa		4278251	R	36	118					
+HWUSI-EAS610	1	4	22	807	63	0	1	CCTCAAAGAATGTGCTCATTGGTTTTCCTATATTCT	abbbba\a`_aa^ba`abbbbb_bbaaaa^aabbba	chr10.fa		4278276	F	36	119					
+HWUSI-EAS610	1	4	44	1342	1232	0	1	TATCCACATTCATTTTGCCTAGATAGGTATATGCCC	aaaaaaa_aa`aaaaaa`aaa]^``\_Y``__]^WY	chr10.fa		4278325	F	36	119					
+HWUSI-EAS610	1	4	37	564	1403	0	1	ACTGCCATCTTCATTCATTCATTTCCCAAAGCAGTG	a`aaaaaa`aaa_aaaaaaaaaaaaa`]`aa`_a^`	chr10.fa		4279508	R	36	119					
+HWUSI-EAS610	1	4	46	1375	248	0	1	TTTNCATTTATATTAATATTACATAATTTAACTCTT	`W]DYab_b^b[`ababbb`b\`a]a^aa^^\`]_b	chr10.fa		4279978	R	3G32	110					
+HWUSI-EAS610	1	4	66	1653	888	0	1	AGTATTTGGTTGGTTTCCCTTTATTTAGTGCCCACA	aba_aaba`^aa]aaabbaaabb`aab^[a_aa`aa	chr10.fa		4280364	F	4C31	81					
+HWUSI-EAS610	1	4	41	892	439	0	1	CGGAGAAGTTCTACCACATTGTCGTTGGAAACAAAG	`ab_Z\a_WV\ab\UU^`b]b]`\a`]^`\Z]^`bb	chr10.fa		4281310	F	36	119					
+HWUSI-EAS610	1	4	87	766	586	0	1	ACTGATTTTTAACCTAAATGACAGTTAAATTCATTT	aaZZ^aba^`ba`][bbba]^aa`YaaaU_a_`aa`	chr10.fa		4281490	R	36	119					
+HWUSI-EAS610	1	4	28	431	614	0	1	GTTGAAAATTATCCCGTCCAGCAGGACTCAGTTATT	a``a`aaaaaa`a`aa^``_`_```^__^`aZ]_^`	chr10.fa		4281524	F	36	119					
+HWUSI-EAS610	1	4	70	1141	1824	0	1	GTTGAAAATNATCCCGTCCAGCAGGACTCAGTTATT	aaaa__^b^DY_]_`aa_`a`_`_a[]_]_`__^a`	chr10.fa		4281524	F	9T26	110					
+HWUSI-EAS610	1	4	25	233	1115	0	1	TTCAGCCTTCATGTCAGCAGATGCCCACTTCTTTGT	`b_^abZaba`bb_aaa_GN]]_aaaa__\Y_a`b`	chr10.fa		4281731	R	36	10					
+HWUSI-EAS610	1	4	75	711	928	0	1	TGACATCCAAGGACAAGAGTTACTTGCTGAGCCCAG	ab`^`^^`aaaa`^\aa`aZaa^aa`aaaaa`a`_a	chr10.fa		4281843	R	36	53					
+HWUSI-EAS610	1	4	24	284	630	0	1	CGTGAGAAAGCGAGCTTTTCACAGTCTCCCACCCTG	ab\bbbabbbaabbaaaa_babba`aa_abbaaaaa	chr10.fa		4282003	R	36	29					
+HWUSI-EAS610	1	4	73	1678	1526	0	1	GAAAGATATTGAAAACTGCAAAACATTTTCAAATAA	aab__a]Y\\`^Ya`aa`_a]Z_U\]`\[^aa_``a	chr10.fa		4282245	F	36	119					
+HWUSI-EAS610	1	4	90	923	16	0	1	AGTTATTCATTCATTCATTCTTTTTGTTTTGTTTTG	aaaaaaa^_aa_^a`Y\aa^aa`a`]_````^``a]	chr10.fa		4283504	R	36	62					
+HWUSI-EAS610	1	4	51	1444	433	0	1	GAGGGCTTTACCTCCAAGCAGCACAAGAAAATGCTT	a\IY\ZVa`[ZPR]`^a``aaZa_^UTaaa[S[_[_	chr10.fa		4284086	F	36	118					
+HWUSI-EAS610	1	4	93	1481	600	0	1	CAGGAGATCAAGCCATCATCCCTACGTGGGAAGAAA	_bbb`bbbaba^abX[G]aVUa`ba`H__b[a^`bb	chr10.fa		4284289	F	36	117					
+HWUSI-EAS610	1	4	81	475	752	0	1	GGGAAGAAAGGAGGGGAGTCTAGGCCTGTTCGCCTC	`\T\\X_VU]ZG]R`_\_^aZW_`aaa[`aaa\_``	chr10.fa		4284316	F	36	118					
+HWUSI-EAS610	1	4	55	641	2002	0	1	GCTTCTTAAAAAACTTAAACACAGGGCTGGAGAGAT	aa`b`aaa`^``a`aaa`]aaaaZ\_`__``_]a\_	chr10.fa		4284678	R	36	119					
+HWUSI-EAS610	1	4	64	720	316	0	1	GAAATGGAGATGGTTGTGAGCTACTTTGTGGGTGCT	aV_]a`_]_X^__X`_RWW_^_YY`_`[U[_]X_U^	chr10.fa		4284778	R	36	119					
+HWUSI-EAS610	1	4	4	1278	647	0	1	CTCATCTGTTTTTTTGTTTGTTGTTTGTTTAACAGC	aaaa`U`bb[`abbbb`bbbb_bXb_a_b`]aa_a`	chr10.fa		4285711	R	36	119					
+HWUSI-EAS610	1	4	40	605	172	0	1	AGTCTGTAAAGGACAAGAGATGACTGGTTGAAACCA	`_]_b`]`a[W\``a]```]P^`^\`_`aa\XPMYa	chr10.fa		4285771	F	36	118					
+HWUSI-EAS610	1	4	21	429	941	0	1	AATGTAGTGGACCCACAGTGTGGGGCAGTGCAGAAC	]abbabbbbbbba\DZabSb]bbbba_aVbXaUU_a	chr10.fa		4285847	F	36	117					
+HWUSI-EAS610	1	4	55	950	306	0	1	TTATTGCCACATGACATTGTGGGTTACATACCTATT	aYY[U\OQXV`a_P]O^\`P_RVGT__\\]TQZZ_`	chr10.fa		4286503	R	36	117					
+HWUSI-EAS610	1	4	92	373	1675	0	1	CAGGTGTGTTGGAAGAATTCTGTACTCTTGCTTGTT	aabaVa]a____U]`aY^^a__[]a_a^\^a___XW	chr10.fa		4286564	R	36	119					
+HWUSI-EAS610	1	4	44	150	1143	0	1	AGGCCACACCTCCTAACAGTACCGCTCCTTGTGGGC	QW^`]\]Q]aa_\_IT_[`X``aaa__[``a^aaaa	chr10.fa		4287015	F	36	27					
+HWUSI-EAS610	1	4	11	368	619	0	1	GTTTGAATATGCTTGCCCACAAGGAGCGGTACTGTT	aW`_a\Ra\a[`[^`]_[JV`Z[^U`VX[HYST[BB	chr10.fa		4287029	R	36	109					
+HWUSI-EAS610	1	4	61	1489	1915	0	1	AACAGTACCGCTCCTTGTGGGCAAGCATATTCAAAA	abab^a_aa`WFLVaa\UO_^WR\XW^UMR^]ZZBB	chr10.fa		4287029	F	35C	106					
+HWUSI-EAS610	1	4	13	566	860	0	1	TGACAAGCTATGTCACATGTCTCTACTTCTGCATGT	a_`[]`a_Zb^aZ]a[Z`_W_aROZQW```aZIXb\	chr10.fa		4287139	F	36	118					
+HWUSI-EAS610	1	4	7	1449	1447	0	1	GTTCAAGTCTTAGGATGTACACAGTGGCTTACAACT	a]`^_^^ZZ``^__Za___^_]__Y^_X^]\XZ]Z_	chr10.fa		4287599	R	36	119					
+HWUSI-EAS610	1	4	90	1025	272	0	1	TGGATTAGTAAGGCATATTTTTAGAGAGCTGAGACT	_a`]`a`a\a^a^LY^P^aa`\W[]Z_`]``[[UM[	chr10.fa		4287772	R	36	118					
+HWUSI-EAS610	1	4	35	1114	179	0	1	CTGTTTCAGTTGCTGCCCCCAGAATCCCATTTTAAG	abbbbbabaab^`b`aabba]aabaaa__aaaaaab	chr10.fa		4288333	F	36	119					
+HWUSI-EAS610	1	4	82	1252	336	0	1	GTCTGGGAGGAGAGGGTGGGAAGGGCTTATCTCATC	aYaa`ZWTZ[LWS^\]Y]]UIT\\MNNT]_R]QYTB	chr10.fa		4288424	R	36	113					
+HWUSI-EAS610	1	4	66	682	359	0	1	TCCTCCCAGACATGGTTTGCTACGTGCATCTCATGC	a`aa_\^___^___^S_^V^_^\Y\^ZKRR_^R^[^	chr10.fa		4288449	F	22T13	85					
+HWUSI-EAS610	1	4	96	343	1322	0	1	GTGAAAGGGGATTGCAACCCCATAGGAAGAACAACA	aVY_]U_N`^]^X[WZXZ_U^\T]__]R`W^]]^]^	chr10.fa		4288887	R	36	21					
+HWUSI-EAS610	1	4	7	1201	1191	0	1	GGGGATGTGCCTAACCTATGGATATGGTCTCAGATC	aaa]URUZZKIOZEDH^RW^NQVRSBBBBBBBBBBB	chr10.fa		4289240	F	31TACAG	53					
+HWUSI-EAS610	1	4	16	207	630	0	1	GCCAGGATCTGGTTGGATTGCAAGCTGGTACCACCA	`bZP]UZ`aVaaG[`YY]U\\VIZZ^XBBBBBBBBB	chr10.fa		4290016	R	31A4	76					
+HWUSI-EAS610	1	4	79	415	1830	0	1	ACTGAAGACTCTGACATCTGTAAATATGTGCATAGC	abaa`_baaaaaaba[`aaaZU]^a``a]_a^`aa_	chr10.fa		4290622	F	36	119					
+HWUSI-EAS610	1	4	61	291	1653	0	1	TGAGTGTTGGTCCACTTTAGAAAATTTCGTCTGACA	Y```Vabbbbaabbb\`_\]^X`T`bb``ab__^`a	chr10.fa		4290712	R	36	119					
+HWUSI-EAS610	1	4	31	1107	1074	0	1	ACCTAAGTCTGTGCATTTCTACCATGAGTCCATTCT	aaabbabaabaa`aabaaabaaaab``a_a]`aaaa	chr10.fa		4290928	F	36	119					
+HWUSI-EAS610	1	4	72	870	1273	0	1	AGAGAGGACCAGAGGCCACGGAGAGCAAGCCTTTGC	Z___`^aa_]\Z__T[]a_V_[_\X_Ra_U[]^a_\	chr10.fa		4291015	F	36	119					
+HWUSI-EAS610	1	4	45	1126	266	0	1	TAACCCACTACAGAAAGTTCCTCACAGAAACACTCA	aaa_`_a^aa^a_a``a]``^`__]____^^_]_]Y	chr10.fa		4291121	F	36	119					
+HWUSI-EAS610	1	4	28	1428	1689	0	1	ATGTTTGTGTTTATGTATGTGAATAGGTAGGAGTGG	abbabbbbb\ab_b`^bbb`baababaG^baLa]bb	chr10.fa		4291795	F	36	118					
+HWUSI-EAS610	1	4	71	765	1577	0	1	CCTGTACACATACATAAACACAAATAGGTATATAAC	\b_^Ubaa_abbaa``_Yaa_a`aa]^\^a`aaaYB	chr10.fa		4291919	R	36	115					
+HWUSI-EAS610	1	4	54	236	2034	0	1	CATGTGTGTGTGTGTAAAGTATGCCTGTGTATCTGT	aR_XJXXb[`_a[\P[]_aO`aa^^RTT[GV^^WRW	chr10.fa		4291971	F	36	117					
+HWUSI-EAS610	1	4	19	502	362	0	1	GTAGGCAGGTATGAATGTGTGTTGGGTGTGTATGTG	a`aaaa`baR_aa_aabUa_a]_a__]`Wa`]a`G\	chr10.fa		4292033	F	36	118					
+HWUSI-EAS610	1	4	50	247	1758	0	1	GCAGTGAGTGCTTTACACATATGATGCCATGGTTTG	ab_babab`aaaaaaaab]aZ`aaaaa`a```]a`a	chr10.fa		4292128	R	36	119					
+HWUSI-EAS610	1	4	42	874	1582	0	1	CAGAAAAGGCATGGGTTAGGTTTGACTATTAGAAAA	aba\[PR]^]X_]`^`a`b`\baXVT_Z_a]`[_`a	chr10.fa		4292179	R	36	119					
+HWUSI-EAS610	1	4	18	1720	969	0	1	GTTGAGGGACAGGGCTGGGGGTGAGGCTTCACCCCT	_X`\[X\RRZ]\PVBBBBBBBBBBBBBBBBBBBBBB	chr10.fa		4292606	R	36	23					
+HWUSI-EAS610	1	4	27	1470	1449	0	1	CTCAAAGGTCCAAGCGATATGAGGGTGAAACAAAGT	ababbbba]b`a`a`baa_ba`aba^a````aa`aS	chr10.fa		4292698	F	36	119					
+HWUSI-EAS610	1	4	41	996	865	0	1	AACTCAAAGGCATGGGTCCCAACTGTATAAAACAGA	O`_a[`K[`\Xa_bVaL`a[\JLb_HJ^[[]Zaa`a	chr10.fa		4293080	F	36	116					
+HWUSI-EAS610	1	4	43	700	1704	0	1	TATCATGGCTCTTCTTACACAGCCTGGCTTTACAAA	aaa]`a`[a```aZ^^Q[a_W[_^___^]``_^^^`	chr10.fa		4293173	F	36	119					
+HWUSI-EAS610	1	4	40	178	798	0	1	CACCTCATTACATGTTTTATAGGATATGAAACTCAC	a___b_]aZbba^`^aaWaa`a^_a_aW\ZP`aZZ\	chr10.fa		4293238	F	36	119					
+HWUSI-EAS610	1	4	38	107	738	0	1	ACATCTCACAAGCTTTTACACATCAGCTTGTGCCTA	]H\baabba`baba`a]ababaaba[ba_bI_aaab	chr10.fa		4293437	R	1A34	106					
+HWUSI-EAS610	1	4	60	525	568	0	1	CATGAATTCTGTCACACTCTGCTGTTGGTCTTTGAT	aa]_RHYaVWQ_^TWYZaaaaV_\TW]a\PV[Q_UZ	chr10.fa		4293503	R	36	118					
+HWUSI-EAS610	1	4	82	805	1747	0	1	ATCAGAAGGCAAAATCATGCAGTCTGAGCTGACCCC	]bbbbaaab`baaaaa`a``a`]a`a^Xa`aaa_aa	chr10.fa		4295385	F	36	119					
+HWUSI-EAS610	1	4	97	842	1538	0	1	GATCAAGGACCCGAGATCAGAAGGGGTCAGCTCAGA	`ba`aaa^aa_]a_a]aa_ba_aaa`]\\T]]_Za\	chr10.fa		4295407	R	36	119					
+HWUSI-EAS610	1	4	12	187	643	0	1	AGTCATAGGGCACATCTCAATGGTTTAGGCTATCCT	`babbabbaaa`abbbaa]aaabYa`aaba`aaaaa	chr10.fa		4295631	R	36	119					
+HWUSI-EAS610	1	4	43	106	898	0	1	AGAACAAATGCATGCTTCTCCCTGACCCTGATAGGG	^aa_bUb_baaS_bbbbbabbba[P`baab^a^baa	chr10.fa		4296362	F	36	119					
+HWUSI-EAS610	1	4	22	1602	756	0	1	ATCCACAGGAGGACCCTCAGAAAGATTCATGACAGC	`X^`^Z\ZV[PZUVSX^`^V^[RNRQ[Z^SP\[WPU	chr10.fa		4296416	F	36	118					
+HWUSI-EAS610	1	4	71	889	849	0	1	TCTAGATTGATATTACTGTGCCACTCTGTGTTCCAC	aababaa`a_aaaaa_a`aa\Z``a^``^a_a\^^^	chr10.fa		4296723	R	36	119					
+HWUSI-EAS610	1	4	9	328	280	0	1	AGTTCCTGACTAATTTTCCACACACACAGCTCCCAC	^XT^X^a]a_`a`Y_Za[X^M]^]_a`\__aXQZTB	chr10.fa		4296952	R	36	114					
+HWUSI-EAS610	1	4	84	1076	1644	0	1	TGGGAGCTGTGTGTGTGGAAAATTAGTCAGGAACTG	aa__U[YaaT^^`Y`S`_]\^]^^VZUYX]^X\UW_	chr10.fa		4296953	F	36	119					
+HWUSI-EAS610	1	4	45	1032	1399	0	1	CACAAAAAATGAGTTAAATATTACAAGTATTTCCTA	ababbabbabb`b_bbbbbbbbbabbbababbaaba	chr10.fa		4297825	F	36	119					
+HWUSI-EAS610	1	4	9	1526	1761	0	1	TGTGTATCTGTGTGTGGTTATGTGTACCTGAACACA	ab^b_aa```X`]a^ba_aaaa]`^a]^X^]____a	chr10.fa		4298061	R	36	119					
+HWUSI-EAS610	1	4	50	644	1310	0	1	AGAACTGAAAAGTCCCCCCTACCACCCCAAGAAACC	a_]aabaa`aba`aa`aa_`^aZ_`]_^aaa[a__`	chr10.fa		4298124	R	36	119					
+HWUSI-EAS610	1	4	30	1707	679	0	1	AGCATGTGTCTGGATGGCTCCTTCATTCACTTAGAC	aaa_^]^a`_ZH_]\NYY]]_``^[`ZX__`[^XX]	chr10.fa		4298981	R	36	118					
+HWUSI-EAS610	1	4	62	57	1950	0	1	ACTGCAGGCTCAGAGGCCTCCCCGCTGCATGGACTC	I]Z_aX`_aZa_`\``a_]a`_aa_P]WEP\\XPK[	chr10.fa		4299455	R	36	116					
+HWUSI-EAS610	1	4	68	1163	746	0	1	GTCCATGCAGCGGGGAGGCCTCTGAGCCTGCAGTTC	`\`aaY`]`^Z]\\]U]]_]^]\]YX\SS[QFXSSS	chr10.fa		4299457	F	36	117					
+HWUSI-EAS610	1	4	19	477	823	0	1	AGACTTTCCAGAGTGAAAGGAATTACAGAGACTCTC	_a^b^bbbbab^b_aaaaaa`aaaabbaaaa`___a	chr10.fa		4299513	R	36	119					
+HWUSI-EAS610	1	4	51	282	1436	0	1	GTCTGGAGGCAAACATCTCAAGGTAAAAGCAAGAGA	aaab`_]`baa_W^aaaaa]]^a[aa__aaa`a^aY	chr10.fa		4299779	F	36	119					
+HWUSI-EAS610	1	4	98	912	350	0	1	AAAAGCAAGAGATGCATGATAAGAATAGATTGTTCA	aba`aW_`a\a`aaX^`aab`[a]`a___`a_U`__	chr10.fa		4299803	F	36	119					
+HWUSI-EAS610	1	4	91	1240	1785	0	1	CTAAGTCAGCAAAGTTGTGCTCATTATGAATGATTC	]aa_aab``abbbbbbb_bbbbabababbabbab__	chr10.fa		4299899	F	36	119					
+HWUSI-EAS610	1	4	35	1414	170	0	1	GTCTGTGGGATATGTTCTTCTAGAAAGTGCCTAGCC	aa`ab^a`a_a```_a`a`_a`__`^NNQ^]]_V^[	chr10.fa		4300444	R	36	118					
+HWUSI-EAS610	1	4	51	817	1176	0	1	GTTTGGTGTTTGCCCATGGGGTAGGTCTCAAGTTGG	a[`_M\P_Q\`]SXTR^aZS\TO_XGZ_\^R]\\XR	chr10.fa		4300870	F	36	117					
+HWUSI-EAS610	1	4	64	131	1701	0	1	TCTACAAGCAATGTAGGCATGGGGGATGGAGCAGAG	abab_X_bb`^_a`^^_`[`aaaa[W^a`W`a`a__	chr10.fa		4300934	R	36	37					
+HWUSI-EAS610	1	4	87	1028	1333	0	1	ATGTGACCTTAGCTGTGACTCACAACACTGGGGATA	aab]a``_`a`a_a`_b__`aa]]__^___a_a_^_	chr10.fa		4301071	R	36	57					
+HWUSI-EAS610	1	4	82	1249	1515	0	1	ACCTGGGGAAAAGGAAGCTCTCAAGAATCAATAGAT	aaaba_^Y\TYZ^``a^`a`a`a`aaaa`a_`^a_`	chr10.fa		4301105	R	36	119					
+HWUSI-EAS610	1	4	90	1704	1907	0	1	ATTGATTCTTGAGAGCTTCCTTTTCCCCAGGTCTCT	aaaa`^a[`^_]^_\___R^`a__MU\X^VOZ__^]	chr10.fa		4301109	F	36	118					
+HWUSI-EAS610	1	4	70	1780	307	0	1	TGAAAATGAATGGAAATCTGCAACTGATGGATGTGA	a]`\abaa_TZQOQ`__a`T^]`_]XP_\VY^RX_X	chr10.fa		4301174	R	36	24					
+HWUSI-EAS610	1	4	73	765	89	0	1	AGGCAGATGGAGGGAGGTAACAGAGAGGGAGGGTGG	_aa``a`aaaaaaa^_`Za_``a^a```a\_aaXaa	chr10.fa		4301282	R	36	60					
+HWUSI-EAS610	1	4	91	1401	597	0	1	CAAGGATTCCTGAATCTCCCTTAGAAGAGGAAATGA	a^W]]a_aa_a_a_`aa`^`a``____^`_``__aa	chr10.fa		4301330	R	36	119					
+HWUSI-EAS610	1	4	50	1716	1595	0	1	GGAAAAGTTGGGTGTGGTTCCTGCACATTCTCAGCC	X`PZa_W[__\_Y\^aa^[[Za_\`\GX^SZ[[`[]	chr10.fa		4301506	F	36	118					
+HWUSI-EAS610	1	4	85	555	1116	0	1	TTCCTGGGATGGGGGAGGCTCCCAAGAGTCAATGCA	``a`]abba`bab`^Yaaa`aaaaa]aaZ`a^YU^R	chr10.fa		4301789	R	36	60					
+HWUSI-EAS610	1	4	98	848	1671	0	1	AAGGTCAACCTTTCTGGAAATGGTTTCAGGGAACAG	Q_PNYS`]LNXa_Sb\W^a_b`\]\XK^ZHT\[]\V	chr10.fa		4302176	F	3A32	98					
+HWUSI-EAS610	1	4	11	629	710	0	1	GAAGGTCATTGGGCTAAAATATTTAACAAGTGGATC	ababb_babbb^aaa`aabbbaaabbaa`b_ba^aa	chr10.fa		4302489	R	36	119					
+HWUSI-EAS610	1	4	82	1140	127	0	1	CACCCCATACTCACGGGTCTGGGGCTGGCTTCTGAG	Ta\\VZ`_\E]^^`a_[VaR_^ZVZ\_BBBBBBBBB	chr10.fa		4302912	F	36	78					
+HWUSI-EAS610	1	4	31	1346	858	0	1	GACATGACATCACTGCACAGCTTGAGAGGATGCATG	]bbbbababbbbaaabaaaba`ba``aa_`aaaaa`	chr10.fa		4303015	F	36	119					
+HWUSI-EAS610	1	4	66	1333	1496	0	1	GACATCACTGCACAGCTTGAGAGGATGCATGAGTGC	aaXW``__``__^`\Y]`_[`]^_^YZ]TRY[YTXV	chr10.fa		4303020	F	36	119					
+HWUSI-EAS610	1	4	70	474	360	0	1	CAAGAGAGTTCATGGGCATTGCTGGTGTAGACATTT	aabbab`ba`ba[a_aa`aaaaa]aabaab_]_aab	chr10.fa		4303193	R	36	119					
+HWUSI-EAS610	1	4	32	148	1397	0	1	GAAGAGAATCACAAGTTACAAGAGAGTTCATGGGCA	\W_[R\]T_`aaZR__^Q[GM_ZaZ_]^\_]`XWYZ	chr10.fa		4303211	R	36	117					
+HWUSI-EAS610	1	4	81	1330	880	0	1	AAGGTCTCTATGGGAAGAGAATCACAAGTTACAAGA	a```WZ`a_aa^_^Y`a_V_a`_`[_U_Z\`\\Z\^	chr10.fa		4303224	R	36	119					
+HWUSI-EAS610	1	4	30	1230	409	0	1	GTAATGACAAAACTCACCAAAAAAGGGTGCCTTTGA	a`baaaa`aaa_aa`a_`aaaa`^`^^X`]__a`]`	chr10.fa		4303298	R	36	119					
+HWUSI-EAS610	1	4	52	1426	1006	0	1	TGGGCTGTGGGGTTCTAAACAATACATTCAACAAAT	aa`_^____\]`Z`_aaaa`a^_a____^__\_]_`	chr10.fa		4303455	R	36	119					
+HWUSI-EAS610	1	4	41	785	525	0	1	CACAGCCACATAAAGTGGTCTGGTACCTCGGGCTTC	`a]_^bbaTababb^NZ_ab`a_Vaaaa]a_^Zaaa	chr10.fa		4303719	R	36	119					
+HWUSI-EAS610	1	4	23	1381	4	0	1	TCAGAATGAAATATGATCCAAAGTTGAAATTCACTT	aa`^aaa`__aaaaYb_\\_`_`]^Y[_^`^[^[a_	chr10.fa		4303909	R	36	119					
+HWUSI-EAS610	1	4	11	496	55	0	1	ACACCATGACACAGAGGAAGACACAGCCAGATGATA	aXabba`ab`babUbbbaaaaaa]a__`aaa_aa]_	chr10.fa		4304598	F	36	119					
+HWUSI-EAS610	1	4	27	555	1764	0	1	GATTCTTTTTGTGGTTTCTTCCACAACTGCTAAGTC	aaaaaaaaabb`b`_aaaa`aaaa`a__`_aaa`__	chr10.fa		4304786	F	36	119					
+HWUSI-EAS610	1	4	8	796	1577	0	1	GATTCTTTTTGTGGTTTCTTCCACAACTGCTAAGTC	a^^b\aaa]ababbWba`aP\Haa_b_Ra`ba`^BB	chr10.fa		4304786	F	36	109					
+HWUSI-EAS610	1	4	63	899	213	0	1	TTTCACATAACGATTTCTGGATAAATCGCATGCCTT	ab`a`Yba\_abba`]aabb`aaab_Y`_\Ra[^`a	chr10.fa		4304983	R	36	119					
+HWUSI-EAS610	1	4	94	1238	695	0	1	TGCCTGTATATGATGCTCATGTGACATGGTGTGCAT	aa_`b^_`aaaa`aaa`\`a]_`_^_a]^SUY^\`_	chr10.fa		4305342	R	36	119					
+HWUSI-EAS610	1	4	84	1437	694	0	1	GAGAGCTGATTCCACCTACTCGCAGGCTTAGCCTAA	]F]ZTUX`UV\_SVSNQ[Y\X[LYKRUWZVQQNX]B	chr10.fa		4305949	F	36	112					
+HWUSI-EAS610	1	4	43	1106	1365	0	1	AATGTCAGTAACCCAAGGAAAGCTTGCTGTAACACG	```_Qab_P]bY\\abaa`a\aa`_`]aa^^^_^__	chr10.fa		4306002	R	36	119					
+HWUSI-EAS610	1	4	74	1184	356	0	1	CAGTGTGTTTTCTTTTCGAGGTATTTACTCATGTGC	\bb```b[\^a[^aab_HYa`R`bab_]a^\aXH^]	chr10.fa		4306066	F	36	117					
+HWUSI-EAS610	1	4	76	611	766	0	1	AAGCAGCTTATGTCTGCAAACGAATTCTGGAAGGAT	^Y_a]`[a`\`aRZ_]`[]a`a__][^```_]_a__	chr10.fa		4306713	F	36	119					
+HWUSI-EAS610	1	4	56	17	786	0	1	GAAAGACTCGGAATTCTGTGTGTGTGGCAGGAGAGG	a``R]_aa^b]W`aab`aYaQ_LWLV[`]a\^]OY`	chr10.fa		4306763	F	36	118					
+HWUSI-EAS610	1	4	19	1612	319	0	1	GAGAAAGAAGAAAGTGGTGATGGTGATAAGGAGGAC	a`_`__]]`_]__]W_^\a_`_[Y_X^^^VZ^RZ^W	chr10.fa		4307025	F	36	119					
+HWUSI-EAS610	1	4	72	1064	229	0	1	TGTAAGGGTCTTGCACATTTGCACTCAGGATCCCAA	a_^b]][QUa^YNXXaa_W^`\a_[aa]W_RZUZ_T	chr10.fa		4307446	R	36	118					
+HWUSI-EAS610	1	4	95	892	1092	0	1	TTCCACTTCTCTCTTCACAGATCACATCTGCAGCTC	`ba_``aaaa`a_[aaa__a]_a``_a`____`_a_	chr10.fa		4307496	F	36	119					
+HWUSI-EAS610	1	4	54	281	913	0	1	GTATGAATCAGCCCACCCTTTCAGGCTGTGAGACAG	a`aaaWW`aaaaa]Z]__[W\]X]a]Z_WYQ\QWW]	chr10.fa		4307823	R	36	119					
+HWUSI-EAS610	1	4	26	1005	1498	0	1	TTTGTTTGTTTGTTTTTTGTTTTTTGAGTCAGGGTT	aaaa_]aa]`]^]_^aa`a]^___^_][[]]^[`[_	chr10.fa		4308164	R	36	12					
+HWUSI-EAS610	1	4	77	1272	123	0	1	TAGGATATCAAGTTGCAGCAGNACTAAGTGCATCCT	aaX]YZ]UWZZQSWOWVSXZHDKXZZZXOXZUUXZZ	chr10.fa		4308767	F	21G14	6					
+HWUSI-EAS610	1	4	84	575	1484	0	1	GATTGCCTTTGAGACAGAGCCATGCTATCTAGCACA	a_aa``aaaaaaa`a\_[``]_`__a`___`__a]a	chr10.fa		4309184	F	36	119					
+HWUSI-EAS610	1	4	84	1459	514	0	1	ACACTATACATAAATTACTGTTCACGAGTCCATCTC	_^_P_WN_Q]]]\`Y]a_UP[YWa]W[_\[YWR][B	chr10.fa		4309647	F	36	114					
+HWUSI-EAS610	1	4	49	534	1179	0	1	TTTACCATTATATCCCTGGAGGCAAGCAAAAGGTAC	ab``Z`Waaa`aaa`[ab\Q`a`X_`\^`a`_YJWV	chr10.fa		4309804	F	36	118					
+HWUSI-EAS610	1	4	43	107	1479	0	1	AATTGCATTCCATCAGATGCATGCAAGATAACAAAA	^]aabba`aaaaaaaZTYaa\```_a_a`a```aXa	chr10.fa		4309902	R	36	119					
+HWUSI-EAS610	1	4	67	823	143	0	1	TGTGATTGTATGATCACGATCATATTTTATTTTAAG	`babIa`aX__``a_[^aW^a_^_aa`aaaa`a_Z`	chr10.fa		4310054	R	36	118					
+HWUSI-EAS610	1	4	80	442	17	0	1	TGTTTCCTCCCTCCCTTACCGGCCGCAGCCACTAAT	]baaaaa_X`a\_```]XVaa`_ZaYaWUYaT[VVU	chr10.fa		4310257	F	36	119					
+HWUSI-EAS610	1	4	59	1631	163	0	1	TGGCAGATGGACAAACTGCAGCCGCATTCGACCTCA	`a]^VVY][[X_QP_[VYEXU]YS\^XMYM\K\XBB	chr10.fa		4310401	R	34T1	105					
+HWUSI-EAS610	1	4	39	1347	329	0	1	ATTGCGCAACGGCACGTTAATTTATTGTGGAAAGAA	abbaabaabaaaaaa``_baabaaaa[]Y\\__`aa	chr10.fa		4310633	F	36	119					
+HWUSI-EAS610	1	4	13	1328	890	0	1	CTTTATTAAGACTTTATCTTCTTTCCACAATAAATT	`bbb_baa_`^_aaaaa`abaaa`a_a^aa^aa`aa	chr10.fa		4310651	R	36	119					
+HWUSI-EAS610	1	4	26	591	1939	0	1	CAATGAGGTCGTTTCAAAAGCCTTTATTAAGACTTT	aabaSV_`Uab_`b```^]ZaVa]`ZZ`a`V``\^_	chr10.fa		4310672	R	36	119					
+HWUSI-EAS610	1	4	26	1566	268	0	1	GTTAAGACCTCATCCTCATCGCTGTGCACAGGAAGT	WV_ZSYU]XY[\Z^^_aa^]X[WYKDE^S]XN[[UB	chr10.fa		4311467	F	36	110					
+HWUSI-EAS610	1	4	26	1575	812	0	1	TGTCTTGTTTTGGTTTGGTTTGGTTTTTTAGGTTTT	a`X``_`_a`__X]_a`]]`__[RY__``]]_X[_`	chr10.fa		4311873	F	36	45					
+HWUSI-EAS610	1	4	39	1064	1075	0	1	TGATACCTGAGGGAGAGCTCCCTCTTCTCAGGGGAG	aa_aa[`aaY`a_Y_U`\[T]\_^_^\^YT\Z^_U_	chr10.fa		4311993	R	36	119					
+HWUSI-EAS610	1	4	38	581	11	0	1	CTTCAAGTCACTGCAGAACAAGGTGCATCCTCTCCC	aab`^`baaaa`]`bbaaaaa`aT`aaa`]_a^`_`	chr10.fa		4312042	F	36	53					
+HWUSI-EAS610	1	4	12	235	1020	0	1	GTTCCCCTGAAGTGGACTGCTTTGTCTGACCACAGT	a^ababaabbaa_`a]__aaaa]]X_]a]aaaaZa]	chr10.fa		4312078	R	36	119					
+HWUSI-EAS610	1	4	45	354	660	0	1	GTGAGGGCTGTCTCTGACTCTGTTGCCTGTCCGTGA	a^a`aa_a`a`aX^]a__`a`aZ\_^_]_\^`aU`T	chr10.fa		4312119	R	36	53					
+HWUSI-EAS610	1	4	24	822	1855	0	1	AAGGTTAGCTGACTCTATGGGTCTTCCTGTGGGGTT	Z^Z]aa`[a]P\]^``^^`_aV\`_W`]NN]aU\^`	chr10.fa		4312278	F	36	32					
+HWUSI-EAS610	1	4	88	621	1397	0	1	ACTACTGATGATACTCTGTTATGCTTGCCTACAGGA	]aaaabbaaaaabaaaabab[aa_aaa^`aa_aa`_	chr10.fa		4312455	R	36	37					
+HWUSI-EAS610	1	4	54	740	209	0	1	ATCTGTAGTGTCAGGGATTTGGTTCTTGTCTGTGGG	aa[K][a_aa_a_J_b_a`XU[Z`_a`[[[]RY_`a	chr10.fa		4312482	F	3A24C7	71					
+HWUSI-EAS610	1	4	76	1423	137	0	1	GGAAGAGGACTGGGAAGGGAATGGAGTAGGAGTGGG	]]a_T[]R^`]ZHTYZV]X^_YR][ZZaaZ^Q\`_]	chr10.fa		4312831	R	36	118					
+HWUSI-EAS610	1	4	16	989	1926	0	1	TCTTTTAGGTATATACCCTGGAGTGGTATAGATGGG	a\]aaaaaa_aa_`a_``a`YZZHY_TW__aYSVVU	chr10.fa		4313292	F	36	28					
+HWUSI-EAS610	1	4	49	478	1293	0	1	ATGGCTGAGATACACTTAAATGTTCAACATTCTTAG	a`b```\[[a^\_UR\`a]_Y`U^K_`^a``\__^]	chr10.fa		4313944	R	36	28					
+HWUSI-EAS610	1	4	66	737	270	0	1	AGTGCCTAAGCTATGGGTATCCTGTTCAGGAAGTGG	\\a`aaa_T^ab`baabXaa``a`aa`a`a`^a`bb	chr10.fa		4314225	F	36	50					
+HWUSI-EAS610	1	4	28	645	582	0	1	GCAGACTTGGGTGCATAGGCTCAGACCTGACAAATC	aa_a_\aa_aaN_____`_\__``_VZU]ZSZ\^_Z	chr10.fa		4314776	R	36	119					
+HWUSI-EAS610	1	4	96	594	207	0	1	AGTTAACAGTCCTGCTGATCTTAGACTTATAGAAAG	``\b`^aaa_a``^aaba^[TT]RWW`]`_^aa``a	chr10.fa		4314902	R	36	119					
+HWUSI-EAS610	1	4	44	1110	756	0	1	AGAGACCAGATGGCTACACAGCATTTTGAATTTTGT	a___a`^]J__Y_^aa``_`_WZ\]`\_UZa[[^V_	chr10.fa		4314940	R	36	118					
+HWUSI-EAS610	1	4	10	559	1956	0	1	AGGAAGCCAAACCCAGGTGTTTTGCTTGATGCACTC	aba[baa`a_\a_\UaZNXU``_aaVR`]\___YUa	chr10.fa		4315003	F	36	118					
+HWUSI-EAS610	1	4	64	1562	583	0	1	GAAGGGTTGGAACATTGGCGTAGTTGAGAACGGCTG	aba]a\Y_]W`_`_`][]aa_`X^]R`Z__TZUa_Z	chr10.fa		4315148	R	36	119					
+HWUSI-EAS610	1	4	3	961	1756	0	1	ATCCTAATCATGGACTATCTCGAAGAATAGAGCCAC	aYSP_`_UX^ZUP]^_Z^XXTXX]]]]ZRXXRVXZX	chr10.fa		4316570	F	36	118					
+HWUSI-EAS610	1	4	56	188	1089	0	1	CTCCACCATGCCCTTGGAGCTTGCTCTGGTGCCCTG	`aaa_aa\`aaaa`_``S`_\^_\```a`X``^`]_	chr10.fa		4316637	F	36	119					
+HWUSI-EAS610	1	4	95	83	85	0	1	GTTTGTTTCTGGTGAGGCTTGCTGAAGGTCCCTCCT	`_^Q]Va_^]`X^a^ZX]KY`[T[Z\\W\_`\P^^V	chr10.fa		4317128	F	36	118					
+HWUSI-EAS610	1	4	79	430	154	0	1	TTGCTGAATGTCCCTCCTCACTCTCACAGTATTTGC	aaba`ba`aa]____a``a``aa`^]_`a\`a``aa	chr10.fa		4317146	F	8G27	81					
+HWUSI-EAS610	1	4	36	736	1906	0	1	AAGGTCCCTCCTCACTCTCACAGTATTTGCCTGCAT	ab`_^aa`a]]aaa_aaaa]aa`Yaaa`Z\\`^]V^	chr10.fa		4317152	F	36	119					
+HWUSI-EAS610	1	4	100	1755	1557	0	1	TAGGGCTTTGGGCCCCAGAGTTATGCTGCCAATCAC	abbabbba`baa`b``abbb`abbaaa`\aba`baa	chr10.fa		4317204	F	36	119					
+HWUSI-EAS610	1	4	24	1748	1477	0	1	GCACAAACTTCAGTCCATTCCCACNCATGCAGAGGT	_N\`Y`_]\^X_Y_Z\__URVLXXDKTJLYT[TTXR	chr10.fa		4317255	F	1T22A11	90					
+HWUSI-EAS610	1	4	1	575	623	0	1	GTGAGGCACAATAAGTAAGGTCCAGAAGAATACATG	aH_]aZZ^^__^^^_O`]UTO[^Z^]`_Z]^^Z]]]	chr10.fa		4317386	R	36	118					
+HWUSI-EAS610	1	4	80	612	440	0	1	GACAGAAAACAATGAAATGCCCACCTTCAAAGCTGC	a_a]a^]``[a_a`aaa_`[`aa`^a`_a^_a__`_	chr10.fa		4317577	F	36	119					
+HWUSI-EAS610	1	4	65	311	618	0	1	GCACCAAATCACCATCCCCACCATGAAGTCCTCCCT	aa^aaa^a_aa`aa`aaaaaaaaaa_`a_a`^__^`	chr10.fa		4317687	F	36	119					
+HWUSI-EAS610	1	4	78	1626	708	0	1	ATCCCAGGCTGGCCTTCTACTTGCTCTGTGGCTAAA	aa^a\YTWV`ZS^___^___^^M[_W_NWXQ\^\^]	chr10.fa		4318425	R	36	118					
+HWUSI-EAS610	1	4	92	828	288	0	1	AACAAAGCATGAGGAGCCTTGCTGTGGGCATGGGAG	Zabb]ba^`aaXX_abaa`_a`[]Xa^a\aXa``X^	chr10.fa		4318710	F	36	119					
+HWUSI-EAS610	1	4	56	1300	179	0	1	GAGACCAAAAAGGATACAGGGGACATTGGGAACAGT	a]^Z\`a\]`\VX`_b^^`a`^^Z^__XVR\^V^][	chr10.fa		4318743	F	36	119					
+HWUSI-EAS610	1	4	3	1349	798	0	1	CAAATACAACATTTTAAACGTGTTGACTTTGGTGAC	abbb___aa_aaaabaaaa`^a^a[__a`a]]]_b]	chr10.fa		4318864	R	36	119					
+HWUSI-EAS610	1	4	78	1637	653	0	1	TGGTCCCAAGACAGCATCCTGACTATTTATATTCAA	a_`_`a_`aUa_^\^```_a`^_`]`___^a__X__	chr10.fa		4319918	R	36	119					
+HWUSI-EAS610	1	4	32	1018	656	0	1	TGAATATAAATAGTCAGGATGCTGTCTTGGGACCAG	_a`_a^```ab^a[]_``_a`a^`[V^^]_]`_[]_	chr10.fa		4319919	F	36	119					
+HWUSI-EAS610	1	4	75	736	557	0	1	GTCCGTGTAAAGAAAGAGGCATGTCATTTACTGTCC	`aaababaaaabaaaaaabbbaa`_aaaaa`aaa`a	chr10.fa		4320125	R	36	119					
+HWUSI-EAS610	1	4	35	681	1767	0	1	GGGTGGTCACTTTCACAGAGGAAATATAAATTGCAA	`b`Sba]baa`bb^ab_aaaa``a_baba`aaaaba	chr10.fa		4320246	R	36	119					
+HWUSI-EAS610	1	4	33	660	1456	0	1	GTATAACAACCTCATCCTTAAGAATCTATGCAATAA	^[YZ`^a_WS]]]Y]U\^_]YY][X_YQ^RT_\a_U	chr10.fa		4320902	R	36	118					
+HWUSI-EAS610	1	4	7	1192	1017	0	1	GTCTGAACTCAGTCCTCATGCTTTCAAGAAGAGCGC	aS`a__]Ga_^bS\Yba[a[Paaa`__a_a[aa_aZ	chr10.fa		4321074	R	36	118					
+HWUSI-EAS610	1	4	51	1683	364	0	1	AGACTATAATCCCAGCACTCACAAATTCTGTGGACA	``Y_`b_a]_`_``U]aa_`a___[W\a`X_[M^^a	chr10.fa		4321145	F	36	119					
+HWUSI-EAS610	1	4	4	75	1056	0	1	TTCTGTGGACAAGCCGTCTGGCTAGACTATCTGTCG	aabaa]aa`bbbZaab^a____Y[^^]`]Z__`Xa`	chr10.fa		4321170	F	36	119					
+HWUSI-EAS610	1	4	77	1751	662	0	1	CAATAACACCGTTCCCTTTCCCCTTTATCATTTTCT	T`bba`\_aT\R_V`aab^_NYR]^Na^ZDD^a]Xb	chr10.fa		4321895	F	29C6	107					
+HWUSI-EAS610	1	4	1	11	1658	0	1	ATGTGCAGAGATCTGCCTGCCTCTGCCTCCTGAGTG	aV\Ma]a\XS[[a\XZaTXaaM_M]Z`\\`^ZTST^	chr10.fa		4322056	R	36	22					
+HWUSI-EAS610	1	4	39	1410	1333	0	1	CGAATGTTTTAAAGCCGCGTGTGTACCATGCATTAT	a_bbbaabbbaba^`aaabbbabbba`abb``baab	chr10.fa		4322365	R	36	119					
+HWUSI-EAS610	1	4	63	685	559	0	1	TGCATGGTACACACGCGGCTTTAAAACATTCGCAGC	_\U[[b__a___`UbTR]R`bb]a^]L\]`UZ[[^V	chr10.fa		4322369	F	36	118					
+HWUSI-EAS610	1	4	79	1142	1539	0	1	GCTGCACTCCCACGGAGACCCTGGCCACAACCATTC	aU\aZ\RNV^^YXJRZRT\X\ZX\]BBBBBBBBBBB	chr10.fa		4322580	F	36	70					
+HWUSI-EAS610	1	4	56	1166	1612	0	1	CTCTATTTCTATATTTTCAGTTTTACATTGCACACA	Y]^a_abbbbbbaabbaabbabbbbaabbbaaa`bb	chr10.fa		4322618	F	36	119					
+HWUSI-EAS610	1	4	51	239	220	0	1	ACATACCTCCTGTTTCCTCTTCTGTGTGCAATGTAA	aaU^_baa_aa_a\aaaa]Ra]a`^`^]]`\]`X]\	chr10.fa		4322640	R	36	119					
+HWUSI-EAS610	1	4	72	997	764	0	1	CATACGCCAAACGATAGACACATACCTCCTGTTTCC	a__]Z[_R`b`H^VTZ_OUTQ\]_YV[O]VbS[`^_	chr10.fa		4322659	R	36	117					
+HWUSI-EAS610	1	4	55	497	1341	0	1	CGTTTGGCGTATGCCCCTTCACCTAGTGATGTCTGG	abbb^T^W`abbT^[a`a`a]`]`a]]aabba`a`[	chr10.fa		4322682	F	36	119					
+HWUSI-EAS610	1	4	46	513	34	0	1	TTTGTGAAGATGGGAATACAGCCAGACATCACTAGG	aaaa]bY`b``aba`b`aa`aaaaaaa]]aa^^a_a	chr10.fa		4322703	R	36	119					
+HWUSI-EAS610	1	4	91	689	1634	0	1	GAGGAACAGGAACCAGGAAGGATCTTGGACCGTCAC	abb^]_Z^`]^`]\```^]a_`a``a]^`__a[_`\	chr10.fa		4323026	R	36	119					
+HWUSI-EAS610	1	4	70	568	240	0	1	ATAGTGTTAGGAAAACTTTATGCAGAGGAACAGGAA	aaaa]b^aaaa`a`a_`a_a`a__`aa__a_`__^_	chr10.fa		4323050	R	36	119					
+HWUSI-EAS610	1	4	86	1319	668	0	1	TGAAACAGACCAGCCAAAGAATGAGAAGGAGCCAGA	`a`_aaX^aaXXYZ]VSW`V[]]Z`__]a^]XUZ]B	chr10.fa		4324568	F	36	114					
+HWUSI-EAS610	1	4	42	1094	1421	0	1	CAGTCCTGTGTTCTGCTGCTAAGAGCTGAGCAGGGA	a^^^`Tb]`aZbR^_P`ba]RV]VI_b`X`\aZT\R	chr10.fa		4325490	R	36	118					
+HWUSI-EAS610	1	4	26	584	358	0	1	GGGGTAGCTGGTGTTTGCCTCCCAGATGAATACAGG	abaaVbaabaa\a`b`aa^a_]aaa]a_^]a__`aa	chr10.fa		4325541	F	36	119					
+HWUSI-EAS610	1	4	89	134	169	0	1	GCAGCTGTGAATGGAAGTCTAAATGTCTAGCTGTTG	aabbb]]M`aabbb_R^Z``\ZaSa^][_Y`___^`	chr10.fa		4326190	R	36	40					
+HWUSI-EAS610	1	4	79	530	1569	0	1	TACCGTACCGTAACCAATATTTCTTTTCTGTGCTCA	ababbVaaa`]`b`a`aaa`b`aaabaaa___a]aa	chr10.fa		4326875	R	36	119					
+HWUSI-EAS610	1	4	54	553	1497	0	1	ACAGAAAAGAAATATTGGTTACGGTACGGTACCTCT	`^Xa_baba[_\ba``aa`abaaa]_YW_]`]]U^`	chr10.fa		4326880	F	36	119					
+HWUSI-EAS610	1	4	7	345	1992	0	1	TTTATCCAAAAGCAAAGCCATCATGATGTTAGAGTA	^a``^`bb```aaa]R][HW_^Za]\^`WY^`aTG`	chr10.fa		4326930	F	18A17	105					
+HWUSI-EAS610	1	4	57	1673	1959	0	1	GCAATCATGATGTTAGAGTAGCACAATTAATGAGAT	`Z]_]Y`a^_Z`R]\^^^Y_`_]G]\[[_RVWW`\[	chr10.fa		4326946	F	32TAG1	20					
+HWUSI-EAS610	1	4	60	1573	274	0	1	AATATTAGAAAATAATATGTCATTATGCAGGAAAAT	ab^```_MVba`a_`aa^YNaaaa]__[_O\_````	chr10.fa		4327126	R	36	118					
+HWUSI-EAS610	1	4	91	835	100	0	1	AATGGCACAGCCATGTGGTGTTTGGATATCTGCATT	R``_ZXTO_U_aa_WI\U]]]baV^_]b]aPDR`_`	chr10.fa		4327761	R	36	116					
+HWUSI-EAS610	1	4	70	914	529	0	1	CTTTGTCAGTCTTGGGGGCCTAGGGAACCTCTGGAT	abbbaaaaaZYbabaaaaa`aabaaaaa]a`baaaa	chr10.fa		4327807	R	36	119					
+HWUSI-EAS610	1	4	16	958	1759	0	1	GCAAGATAGTCCTAACCTTAGGCCCAGTCATGTGTC	aa_X_aa^WZ_Xb`aa``aa`_ZX\aa[Y\`aYZ]_	chr10.fa		4328331	F	36	119					
+HWUSI-EAS610	1	4	47	1441	358	0	1	AACCGATCTTGTCATGAGCAAGAGAAACCTCAGCTC	a^U\OOQLPSUXJ^_[MVTVX\QR[LXZ[ZRQSWBB	chr10.fa		4328625	F	36	108					
+HWUSI-EAS610	1	4	62	1398	1893	0	1	CAGCCTATGTTGTTCTTCTAATGGGGTAAACATCCA	abb__a`_aYa`^^]_a``a_][Z[\]^___]]RT[	chr10.fa		4330886	R	36	119					
+HWUSI-EAS610	1	4	75	178	1223	0	1	TTCAAATGATATCCCACATCCCAGTTACTCCCTCCA	a``[YV\`IZX`aaa^`]Z_aaS`UZMYW``\R]`B	chr10.fa		4331228	R	36	27					
+HWUSI-EAS610	1	4	3	878	654	0	1	AGTTAGCAGAGTGTTCACAGGAAAGAAAATGTTCAT	`bXaZ`XZ\X`T`_aaa]`_a]^a`^^____^ZZ[a	chr10.fa		4331958	R	36	119					
+HWUSI-EAS610	1	4	90	1022	1296	0	1	TAAGCTGGAANGCAAAGAACATGTAGAGGATTTCAA	aa]`_aV^[XDU^`_aa^_[_aaW_a_`_^]^^^_\	chr10.fa		4332310	F	1C8G25	72					
+HWUSI-EAS610	1	4	28	189	745	0	1	AGGGACTCTGATGGCTACAGAGGGATCAGAGAAACC	[ab``bbbbbbbbbbabbab^bab\]aa``a`abaa	chr10.fa		4332628	R	36	119					
+HWUSI-EAS610	1	4	88	540	937	0	1	GAAAGGGTCCCGTCTTAATGACCAAGGCACTCAAAG	`aa__X_Y_[Z`Y_^Wa[_a^^^\_\\__Z]_`T]^	chr10.fa		4333459	R	36	119					
+HWUSI-EAS610	1	4	95	1108	1680	0	1	GAAAGGGTCCCGTCTTAATGACCAAGGCACTCAAAG	V\PI\RS[aaWbSaaa`ZWHPYU_`ZN^FT_[QJX_	chr10.fa		4333459	R	36	115					
+HWUSI-EAS610	1	4	27	109	1782	0	1	GCCACAGGTCCCAACCATAATGTCCACCTTGAAAAA	abbab_a_Qb`^`aa`_S_\BBBBBBBBBBBBBBBB	chr10.fa		4333573	F	27T5C2	45					
+HWUSI-EAS610	1	4	61	1785	932	0	1	ACACCCAGAATTAGCACATAATTTCTATAACCAACT	_b\P[Y_R\b^`[WU\^a`\SW_Zab\aa_]W`a\Z	chr10.fa		4333733	F	36	119					
+HWUSI-EAS610	1	4	10	797	1352	0	1	CCAAGAGAATCTTCTTCATTCTGCTTCTACAGTATC	aabb_bbabbababbbababaabaaa`baa`baab_	chr10.fa		4333918	R	36	119					
+HWUSI-EAS610	1	4	44	1068	1753	0	1	GATCCTGAGAGCATTCAAGTGATTCCCATTGCTAAG	aZNS`aa`aQWKR_YP`Y_YTGPOQLYQN_[G[Y^R	chr10.fa		4334799	R	36	115					
+HWUSI-EAS610	1	4	66	1428	290	0	1	GGGCTGCCCCTTGTCCTCCCCCATTGAGTGGGGTCA	_X\a]Y]^_MTUXPP_`ZZV_\Z[U`\[NTVOOK]a	chr10.fa		4335263	R	36	27					
+HWUSI-EAS610	1	4	30	1518	1150	0	1	ATGCTGTCATATTTACTGTTGCTAGATAACTGGGAG	`bba`\]aabbabbbaa``ab_aaaaa`a`aaa`_a	chr10.fa		4336911	F	36	66					
+HWUSI-EAS610	1	4	78	591	1907	0	1	GATAATTAACCTACATGGCACAGTAGGTGTTCCCTT	a_aaba`aa_`_a_`__^^__^aX___X_X^^^]]X	chr10.fa		4337064	R	36	45					
+HWUSI-EAS610	1	4	96	1195	1622	0	1	GGCCATCTGTGTATAGCCCCACAAATCTGGACTTTG	`[[aa\Pb[X`__V`^]_`^a`[`ZV`HVX[VVPX_	chr10.fa		4337147	F	36	118					
+HWUSI-EAS610	1	4	9	1072	567	0	1	TGGGTGTGTGATTAGTTGGTTGGTTGGCTTTTGAGA	aa`\TUU_VaQ`_]_T_a^Z[ZUV]_UW_^__^]Y]	chr10.fa		4337294	F	36	118					
+HWUSI-EAS610	1	4	55	1187	489	0	1	GGACTGAGGGATGCTGGAAGAACCTGGAGGTCAGGT	a```ba]a``^`a^aaa`aaa__^aaa[_`U[[a\V	chr10.fa		4337695	R	36	13					
+HWUSI-EAS610	1	4	92	216	604	0	1	GGGCTGTGTTCCATTTAGATGCTCAAGTGAGGGATT	abaa`a_a```aaa`a`a_^a``a__`Ta_``_\^\	chr10.fa		4338143	R	36	119					
+HWUSI-EAS610	1	4	45	182	816	0	1	ATCGTTTTGGACTCCATGAGTCTGGATTACAGGTGT	Q_a_W\ba`\\_\\\S]`U`P__`\H\Zbb\bUYHZ	chr10.fa		4338184	R	36	117					
+HWUSI-EAS610	1	4	73	520	1880	0	1	ACTGCTGGTCTACAGACTAAAGGCAAGGGATGAAGT	aaaaaaaaUaX\`a``a`^a_```^_a_a^]_W[_X	chr10.fa		4338615	R	36	119					
+HWUSI-EAS610	1	4	31	437	100	0	1	ATGCCTCTGTATCATTGCATGTTGTCAGTTGGCAGC	a``aa`aab`aa_a`aa_aaa_ab]``a_aa___`_	chr10.fa		4338784	R	36	119					
+HWUSI-EAS610	1	4	22	126	1915	0	1	TATCAAGATCAATAGTTGGCCACATGCATGAGAGTG	\\^a]W_W`a^S\\_X^aaa][^^`ab```[[OZO_	chr10.fa		4339683	R	36	118					
+HWUSI-EAS610	1	4	94	1009	61	0	1	AAACACTCAACTCCATCCCAAAACACAACTCCTACA	`Ya^_T]Z`aZa\U_\HRS^R[LZaY`YGYRO][X]	chr10.fa		4339825	F	36	116					
+HWUSI-EAS610	1	4	51	947	404	0	1	GCAAAAGTCGGTCCTTCAGCTCCTTAATGAGTGTCA	a\a`\^VY]Y_UU[BBBBBBBBBBBBBBBBBBBBBB	chr10.fa		4339863	R	24G11	21					
+HWUSI-EAS610	1	4	12	1546	1409	0	1	GATCTTGCTGCTAGACATCCCCCTCAGTTCCTGTCC	```X`^QY[ZYM\]YU]Z]\ZJ]JY_^UTSSYBBBB	chr10.fa		4339899	F	36	100					
+HWUSI-EAS610	1	4	69	327	1537	0	1	GCAGCAGCTGGAGGGGTAGCTTAGCTTTCACCATCC	aaaaa```U_YU[a`^SUYZWU[Y^UUUZUURPUW\	chr10.fa		4340527	R	36	118					
+HWUSI-EAS610	1	4	62	620	1424	0	1	TGAGCCTCTTGAGAAAGGTGCTGACTCATGTGTTAG	aaaaaaaaabbaa_aaaa_aaaa_aaa`_a^a^aa`	chr10.fa		4341258	R	36	119					
+HWUSI-EAS610	1	4	51	384	1253	0	1	GATCCCAGGTTAAGGAAGCTAAAGTAGAATTACATT	aaabaaU`__abaa`aaa``]aaa[^a_`aa_`^aa	chr10.fa		4341392	F	36	119					
+HWUSI-EAS610	1	4	14	1242	1816	0	1	AAGGAAGCTAAAGTAGAATTACATTACATCCATGTA	_bba^a`^b]^^\Xa``a_aa^``aa_a`Z\_aaX_	chr10.fa		4341403	F	36	119					
+HWUSI-EAS610	1	4	79	591	759	0	1	AAGCTAAAGTAGAATTACATTACATCCATGTAAGCA	`ab^Z__[a__a]\_`a`aab`aa[]aa\`NYVY\a	chr10.fa		4341407	F	36	119					
+HWUSI-EAS610	1	4	97	1686	1681	0	1	AAAGCACTGACTGAATGAGTGGATTTCTGGAACATC	aaaaa`^\__^aaa`]_[[Y``_^`_]___^]]__^	chr10.fa		4341486	R	36	119					
+HWUSI-EAS610	1	4	43	906	37	0	1	GAAACTTCCTGGCCTGACTCTCTACTTCCAAAGACA	`_Y`]`aX_^_a\S\__[_^[]]]_]X\U]]RVZVB	chr10.fa		4341535	R	36	114					
+HWUSI-EAS610	1	4	43	469	1449	0	1	AATTGCTGTCAAAATGACTGGGTTTAAAAATCACAA	aaba\aaa`aaaVaaa_`aa`b^aaa`aa_a_a_`a	chr10.fa		4342193	F	36	119					
+HWUSI-EAS610	1	4	27	948	836	0	1	GTCAAAATGACTGGGTTTAAAAATCACAATGATAAC	a]_`a_X`]T]^`]^^`aa_a\__]_]_]__^]_^_	chr10.fa		4342200	F	36	119					
+HWUSI-EAS610	1	4	80	729	1118	0	1	CATAACAGGGAGGCATGGCAGCAGGAACTTGAAGCT	abbbaaba^bab`]`baaaabaaabaa_aab^`b_a	chr10.fa		4342379	R	36	119					
+HWUSI-EAS610	1	4	60	1265	1498	0	1	GTCTGAAAAAGGTTAACTACAGGAAGACTCAGTCGT	a\USaW^\N]]SY[ZYP`Z^^aZOOX[UXXTTXU^\	chr10.fa		4342482	F	36	118					
+HWUSI-EAS610	1	4	21	19	1193	0	1	AAGGGCCAATGGAAAGCAAGTCTAGGAAGAAATGGA	IW_bbabbbbb`UY`a`\\a_aaabb_abbaZ`bBB	chr10.fa		4342618	F	36	110					
+HWUSI-EAS610	1	4	71	1087	129	0	1	TGGTTGTCTCCATCTTCTGTCAGATAGCACCTGAGA	a``^aa_]``aaa`aaaaa`aa``a`__a_^``\`^	chr10.fa		4342747	F	36	119					
+HWUSI-EAS610	1	4	69	502	205	0	1	TACCATGATTACCTGATCAAACTGGATTAAAGTTCT	^babbaaZ[_`\\___``]aa`aa\_^a``a_^`_Z	chr10.fa		4342869	F	36	119					
+HWUSI-EAS610	1	4	51	1298	1558	0	1	TGGGACTAGCTTAATTGTATTGTTTCTGGAGTAGAA	aaaa]]a_`^`a`_`aa]_aaa^``V_a\Y_Y^_]_	chr10.fa		4343071	R	36	119					
+HWUSI-EAS610	1	4	91	343	869	0	1	GTGGGTGAATGCAGCTGCTGTATTTCTTTATCCTAT	a]aa`Xaa[\`a_a^`a`_aX\_``^```]\__a^]	chr10.fa		4343278	F	36	119					
+HWUSI-EAS610	1	4	34	601	549	0	1	GCTGATTTCTCTTGCTTCAATCAGGAGACAGCATTG	`]aaH```a`[a_aSaSaXU]\UXKZXLMV[V]a_a	chr10.fa		4343722	R	36	117					
+HWUSI-EAS610	1	4	48	44	737	0	1	ATCTGAAGGCTGCTAGCATATTATTGGATTCCAGGC	JZbbb`\bbbabbaWaa`]^``^abb`_`aba_`ab	chr10.fa		4344361	R	27C8	31					
+HWUSI-EAS610	1	4	68	252	535	0	1	GCAAGCATAACAGCGTATCATTGACAGAGTCAGGGA	abY`_]aa_Y]_YHX^LV][_[\X_R][a[]Ua_BB	chr10.fa		4344598	R	13A22	31					
+HWUSI-EAS610	1	4	53	1743	1979	0	1	ATACCTGCTACATATGTGTGGGGAGGTTTAGGTCCA	^OMQS_a__\URU\_a_aQa\\ZQ\Z_QYBBBBBBB	chr10.fa		4344870	R	36	6					
+HWUSI-EAS610	1	4	22	88	1979	0	1	TGTTCAGGACCTACATGAAGACCAAGCTGCATACCT	a__U_X__ba`UUaa]aVaZZ_bUbaa]S_OO]aa]	chr10.fa		4344900	R	36	5					
+HWUSI-EAS610	1	4	66	565	378	0	1	ACAGGCAACAGCTTTGGGGATAGCCCTGATCTAGTT	ab_^]_R_a\`[``^^aYZUa\aa`a_XZ[ZT]aYZ	chr10.fa		4344935	R	36	119					
+HWUSI-EAS610	1	4	64	983	876	0	1	CCACTGAGACCAGACAAGGAAGCCCAGATAGAAGAA	abbbbbbabaabbaabbbaaba^`aaaababa`baa	chr10.fa		4344983	R	36	37					
+HWUSI-EAS610	1	4	24	1697	1926	0	1	CTGACATTGAAAATTAGCCACTGCAGATATTTATTA	X\bVa\bYbaa`YQ_bbW^Sb_\XNRVW^^b_a`a[	chr10.fa		4345899	R	36	118					
+HWUSI-EAS610	1	4	34	928	932	0	1	AGGGGGAGAAATCAAGGTGAGTGACAGCATCTGTCT	]b_`a^bb]aaa^a`b^V[S`_bb`a[`ab`ba`]a	chr10.fa		4346076	F	36	119					
+HWUSI-EAS610	1	4	41	368	1781	0	1	AGGGAGGGTTTATTCTAGCTCCTGGTTGCAGAACAC	abbbabbb`baababbbbbabbaba``aaaaaabaa	chr10.fa		4346186	R	36	119					
+HWUSI-EAS610	1	4	44	1120	1368	0	1	GTGTCAGGATCGCAACTCCACACTCTTGGAACACAC	aUTT`a^T_O[ZUZ`^[^RY\_M^P`BBBBBBBBBB	chr10.fa		4346518	F	11A24	44					
+HWUSI-EAS610	1	4	43	1275	1891	0	1	CAAACCAGCTACTAAGAGACAAACTGGGATCTTCTG	abbbaa```a`[a`a^`a``a`_\_`\\[\VY_Y`a	chr10.fa		4347062	F	36	119					
+HWUSI-EAS610	1	4	59	1273	1927	0	1	AGTGCATTTGAATGCCCCAAGATAGCTTGACTCAGG	``]ba_aa_W`a`_a_a`a`a`Z^_Z_^`[T[U_`_	chr10.fa		4347154	R	36	119					
+HWUSI-EAS610	1	4	53	256	618	0	1	GCTAGGGAAGACTAAAGCATAGACCACAGTGCTAGG	a_aZ\_a[[`__aa`[\_[__`]^\_^_^W`_^___	chr10.fa		4347346	F	36	119					
+HWUSI-EAS610	1	4	20	512	1493	0	1	TCTGACATCTTAAGCTCACTTCTTCAGAGACCAAAT	aaWaaaaY\aaaUVW\WR]_^Ta___a]a[`YWY__	chr10.fa		4347667	F	36	119					
+HWUSI-EAS610	1	4	15	1491	838	0	1	GGTTGAATTTCACATTAATGCTTGCAGTACTCTATC	a_`a^a_____]^[aa^^``W`Z^^\_ZZ]][^_^]	chr10.fa		4347848	F	36	119					
+HWUSI-EAS610	1	4	74	572	860	0	1	AAAATTCATGCTCAAAGTCATGTAGAGCTACACGAT	aa_X__`_`_a`]\\]aY_a]a[`_`___`_`^[^[	chr10.fa		4347937	F	36	119					
+HWUSI-EAS610	1	4	36	51	1841	0	1	CTTCTCATTTGTCAGATCGTGTAGCTCTACATGACT	aaabaab`a^__aaa`]a_W_Za_aZ`_^\SY_[]Z	chr10.fa		4347952	R	36	119					
+HWUSI-EAS610	1	4	84	876	583	0	1	AACATCTGCATTGGCTATGCCTTGCATGTCACTTTG	abab`Yaa`ba_aaabb`aaa^ba_aaa_a`___aa	chr10.fa		4347990	F	36	119					
+HWUSI-EAS610	1	4	23	19	752	0	1	CTCCCCCCAACTGCTGAGTGCCCTCAGGATGTCCCC	_aaaaaa`X[`\\`^[\`Z`^``\\U\`V]`XXa``	chr10.fa		4348750	F	36	119					
+HWUSI-EAS610	1	4	12	944	1539	0	1	CAACTAACCTGGACCCCTGAGACCTCTCAGATACTG	abb`bab`aaaXba_aabbbabaab___aaaaa]`a	chr10.fa		4348948	R	36	17					
+HWUSI-EAS610	1	4	33	292	1528	0	1	CCCAACCAATGGACAAAAGTCAGGGACCCCTGTGGT	aaaaaaaa`a_```aa]a`\`a`_]aa`___`U__U	chr10.fa		4349048	R	36	31					
+HWUSI-EAS610	1	4	8	1653	733	0	1	GGGGAGTCCTGGAGCCCTGACACTGTTACTGATGCT	^Z^`aa`^\UWY\``\[\\`^a[^][_^Y[[\TSY^	chr10.fa		4349175	R	36	50					
+HWUSI-EAS610	1	4	72	574	386	0	1	TGCCTGTTTCTATTCTGTCTGCTGGCCCTCAGGGCT	``^a^babaa`M`aabaaabbaaVYY\^S_ZZMW[\	chr10.fa		4349529	F	36	4					
+HWUSI-EAS610	1	4	40	1567	1659	0	1	GGGAGGAGAACAAGACTGAAGCCCTGAGGGCCAGCA	T\`_P_\`\O]_\VVG_a__^`S[a^U_V]E\_[UB	chr10.fa		4349548	R	36	13					
+HWUSI-EAS610	1	4	9	542	2037	0	1	AAGATTATGCTCATTTTGTAACTTCATATCTTGTAT	`O_a_a_Q\[__`\HRQWQUY_^U\_Z]`a___Z[X	chr10.fa		4349859	F	36	118					
+HWUSI-EAS610	1	4	66	508	40	0	1	GACACAGAGGCACAATGTGGAGACAAAGTAGAGACT	aaaaa_`_[_aa``\`a^aa_a_]`\a^T_a_^\]_	chr10.fa		4350142	F	36	119					
+HWUSI-EAS610	1	4	84	42	952	0	1	AACCTTTAATAACAGCACTTGGGAGGCAGAGGCATG	I^ababa^_a]bb_abababbba_aab]a`aa^`\a	chr10.fa		4350390	R	36	22					
+HWUSI-EAS610	1	4	34	19	212	0	1	AGGAGCCAAGAATAAACTCACACAATTACAGCTACC	[bbaabbbbbaaba``aabaaabaaaaa`\]a`b`a	chr10.fa		4350561	R	36	119					
+HWUSI-EAS610	1	4	88	778	1730	0	1	CTAGTTAAAACTCCAAGTGCTACACAGCATAAAAGT	`b^babbabb]baabba`babaaaaa_^aaa`aa`]	chr10.fa		4351222	F	36	119					
+HWUSI-EAS610	1	4	77	306	1183	0	1	AGAATTCGACAACCTGGTGAAAGAATGCATTACAAA	`]```bbb_```bbbbb\aa`^a`ba^abb``aaV_	chr10.fa		4351564	R	36	119					
+HWUSI-EAS610	1	4	27	1360	880	0	1	TATTTTAGCTCACAGTTCCAGGCTACATTCTACCAC	]bb_]_babb_]]^ZY`aabaaJ^b_ab`^a^GW`a	chr10.fa		4351838	F	36	44					
+HWUSI-EAS610	1	4	95	859	890	0	1	CAGAGATAAGAACTTGAGGCTGAGTCATATCATAGC	aa`U`Z_SW[Z]G\\\O_UV\a`^NGTUW]Ga_N^S	chr10.fa		4351885	F	36	115					
+HWUSI-EAS610	1	4	98	551	1034	0	1	GCTGAGTCATATCATAGCCACAGTCAAGAGCAGAGA	abababa``a``_a_Z_^aa`aa`aaaa`b_aaaa_	chr10.fa		4351903	F	36	119					
+HWUSI-EAS610	1	4	9	348	1673	0	1	GTCCAGAACTACCTGTCTAGGGGATGGCGTTACCCA	a`bb[O]]aabb]b]L^`^\]]\_``\^`U^]a\aa	chr10.fa		4351998	F	36	118					
+HWUSI-EAS610	1	4	17	847	908	0	1	GAGCAGTAGCAAAATCACGTCTTTGTAAAGGAAGCC	a^aa`b^```___a___`a^_```a]a^__]^^`]^	chr10.fa		4352901	F	36	119					
+HWUSI-EAS610	1	4	43	1296	1000	0	1	ACCTCTGTCCAGAACACAGTCCTATTAGTCACTGCC	aWa\^]`Y\]``^[a`X^][V_`_`^Z\WUZZ_`_^	chr10.fa		4353452	R	36	52					
+HWUSI-EAS610	1	4	23	1202	1031	0	1	GGTTATTTCTCATCTCCCATTTTGAAACCAAAAGAT	`a_aaaa`Q\_YXaa`a^aaaa`aa_a_`__[__^_	chr10.fa		4353722	F	36	71					
+HWUSI-EAS610	1	4	49	65	1812	0	1	AAGGCAGAGGCAGCAAACCCANCCACTCTTGCTTCC	T[`_bXTb\XRT_aZMMTU_YDZT^]V^N^TTbZaU	chr10.fa		4353782	F	10A10C14	86					
+HWUSI-EAS610	1	4	20	470	312	0	1	CTCACAATCATCTATTCGATGGAACACAGGGCCCCC	abaaabaaaaaaa`baaa_aaa`aaa_`_aaa^`^`	chr10.fa		4354034	R	36	16					
+HWUSI-EAS610	1	4	57	1333	1206	0	1	ATCCACTTCTATATTTACCAGGCACTGGCATAGCGT	abbb_abba`abaaabbaaaaaaaa_aaaaa^Y`a_	chr10.fa		4354071	F	36	11					
+HWUSI-EAS610	1	4	60	568	960	0	1	GGCATTGTTTCCCTAATTTCTTTCTCAGCAGGTTTA	aa_`aaaaa``^_aY_aa`a`a`___`___a_]^a_	chr10.fa		4355944	F	36	53					
+HWUSI-EAS610	1	4	21	52	555	0	1	AGTTCTCCATTTCCAATTTTTTTCGTCTTGATCTCC	^abbbbbbbbbbba`^abbbbbbbbaba`bbbabba	chr10.fa		4356133	F	6T29	80					
+HWUSI-EAS610	1	4	45	1526	390	0	1	TCTCGGTGCCTCCAAAAAGAAACTAGGGAGAGCATA	]ZVZ]\Y]R]_XYU_`]ZYW[_TY`]]`_X]XQ\X_	chr10.fa		4357280	R	36	28					
+HWUSI-EAS610	1	4	64	947	1950	0	1	ACCCCGAATGGAGAAGTTAGACAGAGCACCCAAGGA	aaa`Z\Yab`]_`__V]a][^U^_X\S[RWURYWZU	chr10.fa		4357583	F	36	118					
+HWUSI-EAS610	1	4	43	710	731	0	1	TACCTTTGATGAGTATGAAGTGGTCCTCCTTGTCTT	``aaaabba_ba`Za_`a`b_aa]``a__``a^_ab	chr10.fa		4358366	F	36	9					
+HWUSI-EAS610	1	4	80	878	585	0	1	CAATTCCATCACCTGTTGTCACTGTGTTTTCCTGTA	abbbbbaabbbaabbabbaaaabbabbbbbaabaaa	chr10.fa		4359527	F	36	119					
+HWUSI-EAS610	1	4	67	787	1714	0	1	CGATATGATTTTACATCCGAATCTTGCTTTTGGGGG	G^bbab`bab_abbbb_bbbaabbb`\aaaaa`b`_	chr10.fa		4359682	F	A35	74					
+HWUSI-EAS610	1	4	58	1543	1376	0	1	TGGGGTATTCAGGACTCGCTGTGGTGGGTGTACTGG	]b\^\G_aSV_`LR]a`aa]^O^VV_a^QXVSN\R]	chr10.fa		4359723	F	36	13					
+HWUSI-EAS610	1	4	65	307	875	0	1	AGGGTCTTGTGCTATTAGGAACAGGGACAAAGGACA	abab^aaababaaabaaaa_aaaaaaa`a``a`aaa	chr10.fa		4360229	R	36	54					
+HWUSI-EAS610	1	4	53	849	1610	0	1	TAAAAAGCAAGTTTCTATCAATCTATTCATTTTTCT	aaa^_]_^XZa^a`^a^a__^a_`_aa_`aaaaa_a	chr10.fa		4360391	F	36	119					
+HWUSI-EAS610	1	4	54	589	1198	0	1	TCATGCCACCAGGCTGTTCAATCTTTGGACATTGCA	aaY``X\]^[`_TET_JYVLYXRLPSSSXMUNUBBB	chr10.fa		4360429	F	36	102					
+HWUSI-EAS610	1	4	95	1103	316	0	1	CAGACAACATTTACCAAAGTCTGGAAATCCAGACTC	__IY]ZYa[b_ba]aYT\YZb`_^^ZXXa]WOY`^Y	chr10.fa		4360713	F	36	118					
+HWUSI-EAS610	1	4	38	1074	425	0	1	TGAACAAAGTGAGAGTGTGTGTGAACAGGCCACACA	a`WV\^S[aV[Y]U\]_Xa```_``]]_XP]VLRP[	chr10.fa		4361197	R	36	118					
+HWUSI-EAS610	1	4	78	1026	1240	0	1	CTATAGATCTTGAAGACTAGATGCAAAGGAGAGCTA	abbbabaaab`aaba^abaaaa__aa_aa`a`a^aa	chr10.fa		4361243	R	36	119					
+HWUSI-EAS610	1	4	62	570	1486	0	1	CAATATTACAAGATATCTTGGGCCTGGGGAAATGGC	a[aa`_a^_a_`]_^a_[\``_^^_a___^^]UW`^	chr10.fa		4362081	R	36	119					
+HWUSI-EAS610	1	4	2	534	472	0	1	GAAAGATGTGTTAAAGAAAGTCAATGTGTCCTTTGG	a__ab_`a\`^`^W`aa__aV`]`a[P[U_[[\[XR	chr10.fa		4362685	R	36	119					
+HWUSI-EAS610	1	4	71	1066	785	0	1	GCATAGCCCCAGTGACATGATGGGTAGTATTCTCAG	aaaaaa_```[[^a^a^`\N_aa_U_XU__]^V^_a	chr10.fa		4363168	F	36	23					
+HWUSI-EAS610	1	4	11	1115	66	0	1	ACCCATCATGTCACTGGGACTATACCCTACCCTGAG	`a``a_\`_^Z^`UYRTX^Z`_^\WSWU^SUWSPT[	chr10.fa		4363534	R	36	18					
+HWUSI-EAS610	1	4	21	122	1150	0	1	ATCATGTCACTGGAACTATACACTATCCTGAGAATA	``bbababV[X_b_X\aaYY[a`_Y^abb_Y\\`_a	chr10.fa		4363572	R	36	33					
+HWUSI-EAS610	1	4	68	1024	514	0	1	AGTCCCCGTGACATGATGGGTAGTATTCTCAGGGTA	ab`a`a^aSZ__^`a_abbaN\]V_a__[]N][`Wa	chr10.fa		4363941	F	36	24					
+HWUSI-EAS610	1	4	96	147	573	0	1	GTTCCAGTGACATGATGGGTAGTATTCTCAGGGTAG	`P`aa\b[_[```a^_aa`Y``V____``P`aaX^`	chr10.fa		4364025	F	36	27					
+HWUSI-EAS610	1	4	22	535	1597	0	1	ACATGATGGCTAGTATTCTCAGGGTAGTGTATAATC	aabab`aaa^aaa_`aa^aa_aaa]W\XaW__a_Wa	chr10.fa		4364118	F	36	45					
+HWUSI-EAS610	1	4	33	1038	1045	0	1	GTATAATCCCAGTGACATGATAGGTAGTATTCTCAG	a_aa^^a^^^_aZ`^]_`a^_]a`X_`Z]^^^^X^`	chr10.fa		4364146	F	36	51					
+HWUSI-EAS610	1	4	11	443	406	0	1	TGTCAATAGGAGAATACTACCCATCATGTCACTGGG	`b``ab]ab]aba^^^babaa``a_aaa]`a``aba	chr10.fa		4364237	R	36	119					
+HWUSI-EAS610	1	4	100	1339	501	0	1	CACCTGAAGAAGGAACATGTGGGCATTCCTGTGTAG	[ab[aba`T`a[U``abaab`^`aab_bbb`aaab`	chr10.fa		4364285	F	36	119					
+HWUSI-EAS610	1	4	33	436	1333	0	1	GATGGAGAAGACATATCTTAGGTATGGGTGGGACCA	a`aba`aaa`aa[aa_``_Y`a]_`a`\M[_a\a_`	chr10.fa		4364343	F	36	119					
+HWUSI-EAS610	1	4	3	231	1353	0	1	TGGGTGGGACCATTCCTGAGCCAGAGGATGCTGATG	aab\H^abaaa__aaaaaba]bababaaaba_`^^a	chr10.fa		4364367	F	36	118					
+HWUSI-EAS610	1	4	94	189	104	0	1	GTTCAATATTATTCCAGGTATCTTTCTAGCTGTTGT	aX[_]`___VX___a[`]US]X_WPU_Z_]]_P\_S	chr10.fa		4364624	F	36	118					
+HWUSI-EAS610	1	4	30	8	1833	0	1	GAACTTGATTAGGTGTGAGAGTTTGGGAATTAAATG	G[`bbba`aabbbbbbaYaZabbbbbb`[`a`abbb	chr10.fa		4364871	R	36	118					
+HWUSI-EAS610	1	4	82	373	680	0	1	AAGAGGCTACATGTGTGCCACAGTGTGTATGTGGAG	^WUW]aa_a``^bXbXaa_UZ^a_aYbP^aaZa^Z`	chr10.fa		4365211	F	36	119					
+HWUSI-EAS610	1	4	79	1256	837	0	1	GGCAATCAGTTCTTGCCTTCCACCGAGTGGAGTTCA	aaaa`a]aaV`]`^_]^___^`^_S_\WZ[WW\]]_	chr10.fa		4365296	F	36	119					
+HWUSI-EAS610	1	4	30	778	217	0	1	CACCGAGTGGAGTTCAGGAATCAGTCTCAGATTCTG	aaaaa`aa_aaa_aaaaba`aaaa[`a_aa``a_a`	chr10.fa		4365316	F	36	119					
+HWUSI-EAS610	1	4	72	1600	682	0	1	TTCCTTCTTTAGTATGAAACAATGTTACACAGAGAT	ababaa`bbaa`]a`^aaaaaaaa^aaaa_a___`a	chr10.fa		4365397	F	36	119					
+HWUSI-EAS610	1	4	17	1600	1240	0	1	ACGAGATCCCTGAACATTGTGGGCAAGTGTGATGCT	a_a`aY`P^QVQN\\XHU_RLN]SUTQGSWW\T^V\	chr10.fa		4366001	F	36	116					
+HWUSI-EAS610	1	4	24	1525	963	0	1	AGCATCACACTTGCCCACAATGTTCAGGGATCTCGT	[_``aa`_`^__[[__a_____Ya__^\_W_W^W_\	chr10.fa		4366001	R	36	119					
+HWUSI-EAS610	1	4	21	33	699	0	1	TTACCCGTAGTCACAAAGCAATTTAGGAGCTCCAAA	abaabbbaa]ababb]abaU^bbabababbbbba]^	chr10.fa		4366143	R	36	119					
+HWUSI-EAS610	1	4	22	326	1727	0	1	CGAAGCAGCCAAACGTCTCATGGAGAAGATGAGAAT	abaZbbaaab]Z[`aRbaba^ba`a_aa[\Z]aaa^	chr10.fa		4366183	R	36	119					
+HWUSI-EAS610	1	4	54	117	82	0	1	CTTACCATCCCTCAGATGACTTTAGTTTGTGTCCAG	aaababaaaaa_a``[^a_^^_^\a]_`a\_Z_`_a	chr10.fa		4366255	R	36	62					
+HWUSI-EAS610	1	4	41	1219	357	0	1	CAAGAGGTGTGCCACGTGGATCTTCACTGAACTTTG	abbaabaa`a_aabaa^bbababaaaaba_`_aabb	chr10.fa		4367134	F	36	119					
+HWUSI-EAS610	1	4	100	1679	1350	0	1	CATAGGTTGATGCACTAATTTGCATGATTTATATCA	aabbaa^`aa`aabababbaaa_baa_a_aababaa	chr10.fa		4367275	R	36	119					
+HWUSI-EAS610	1	4	94	454	1243	0	1	TAAATCTCTGAACAGGACTCCTGATTCAGGATGGAT	`Z\X_bbbaba]abaaW`_baababb`]bb`baa]`	chr10.fa		4367352	R	36	119					
+HWUSI-EAS610	1	4	55	425	535	0	1	GAGCCATCATCACTACCCACCCCCGTCAAAGCCTGT	a\ab```aaaaa]`T_a`IRabb^ZE\aX`\`[aa`	chr10.fa		4367815	F	25C10	108					
+HWUSI-EAS610	1	4	23	557	1827	0	1	CTTGACTCAAGAGCTTCTGTTGGAATTCTAATCTGA	\\[^^aSJ`RX`\OSW^WZP]]W]RPYZIZPI^_YT	chr10.fa		4367896	F	36	116					
+HWUSI-EAS610	1	4	17	591	41	0	1	TGTTTTAGAGTTACTGATACCTTTGGCTCCTTGCCC	a`XX\__`[_W]X_aa]a`^]X\`^YZ\\Y\V\^[^	chr10.fa		4368012	F	36	119					
+HWUSI-EAS610	1	4	20	1037	1639	0	1	GTCCCTCTCTGTCCCTTTGCTATAATTCTAGCTTGT	_aaYa^``aaHV_`^_^a_]]S`^Ya^]XPOP\XG\	chr10.fa		4368083	F	36	117					
+HWUSI-EAS610	1	4	100	1439	1364	0	1	GGCAGTATTTTAGACACTCCTCTCTCTCTTCCGTTT	aaaab_aaaaaaaaYa[aa`a^`__\`_`_V^`__^	chr10.fa		4368180	F	36	119					
+HWUSI-EAS610	1	4	56	124	323	0	1	GGTAAACGGAAGAGAGAGAGGAGTGTCTAAAATACT	ab\a`babbaabaa`a^`_aa`a^b`aa`````a`\	chr10.fa		4368183	R	36	119					
+HWUSI-EAS610	1	4	74	443	1264	0	1	AAAAATTGAAAGCATCCCTTATGAAGTCTAACAAGA	_`_baabaa`\aaa`_aaa`aaaa_`]a__``_a_`	chr10.fa		4368292	F	36	119					
+HWUSI-EAS610	1	4	38	295	1668	0	1	AGATTGTGTGGGCTTCTAAAAGTTTGTAAAGANAGG	\__`_b[b`b`bbbba`a`bab`bab`bbba^DZ[a	chr10.fa		4368424	R	32G3	110					
+HWUSI-EAS610	1	4	83	264	845	0	1	TGAGGTAAATGTACTAATCAGACTGTGGGAAATCTT	aaV^a_a\V`a_abaaTa`[`Uaba_aa`W]XZ_a_	chr10.fa		4368516	R	36	119					
+HWUSI-EAS610	1	4	22	651	2021	0	1	AACATCAATATTTATATTTTTGTTGATCTAGTATTG	aaa\XUaT`a`a\`_S[`\a_a^aa___ab`Za]__	chr10.fa		4368554	F	36	119					
+HWUSI-EAS610	1	4	100	656	873	0	1	TGAATTGCTAAACTATAATAGGCAATCAAAAATATT	a^___ababaaa\ababaaaa`^`aa[``_aaa`_\	chr10.fa		4368588	F	36	119					
+HWUSI-EAS610	1	4	86	1033	816	0	1	TGTAAACTGAAATGGTATCCTTAAATCTGTTCTCAG	ab_ab`aaa^`aaaaX`a_abaa_aa`aa_`\a``a	chr10.fa		4369299	F	36	119					
+HWUSI-EAS610	1	4	33	604	1802	0	1	GCCCAGGGGCATATCTGACAGAGAAACTGGTGCCTC	aabbaaa`a`baaaaaaaaaa]a``aaa``Sa_^`a	chr10.fa		4369583	F	36	119					
+HWUSI-EAS610	1	4	61	552	214	0	1	GGAGGGCTGCCAGACTCTTTCCACTCAGCACCAGGT	`_\Sa`a`a\]^a`aaaa_a_R__`QTUa`a```BB	chr10.fa		4369914	F	36	10					
+HWUSI-EAS610	1	4	13	42	99	0	1	GGGGTGTGGACAAGGGGAAGCCCAAGCTTGGAGCCT	aaaaXaZ_a`\`_`_^YMM]`^`[T`]X`\\X]\XB	chr10.fa		4369978	F	36	114					
+HWUSI-EAS610	1	4	79	386	608	0	1	GCACAGGCAGGCAGGTCTCCAGTTGATCTGAGGTCT	a`ZXXK^_aa_a]``G[MP_Q]SUQGQSMPMW\WW^	chr10.fa		4370704	R	36	14					
+HWUSI-EAS610	1	4	15	496	856	0	1	TCTGTGAGTTGTTGATTCAGTTTAGATAGCCCTGTT	abbb`bababbaaa\aa`]`aabaaaaaaaaaaa`a	chr10.fa		4371012	R	36	14					
+HWUSI-EAS610	1	4	83	1004	1319	0	1	CAGAGTTCTGTGAGTTGTTGATTCAGTTTAGATAGC	abbaaababbababaababb`aa]_^aaaa__`aaa	chr10.fa		4371018	R	36	15					
+HWUSI-EAS610	1	4	50	985	1768	0	1	AAGAAATCTTTGGGCCAAAATGAGCAGGGATTGAGT	aaaa_\a_b``[aaa_a_aaa`aa__aaa_`a`^a]	chr10.fa		4372810	F	36	119					
+HWUSI-EAS610	1	4	62	773	1569	0	1	CTGCATTGTGGCAGAAGAGATGACTGCATGGTTAAG	__T^b\b`aUa]YaXS\`[__[W]]^^`_]ZWa\\[	chr10.fa		4373082	F	36	119					
+HWUSI-EAS610	1	4	93	580	862	0	1	GAGTCAAACTTAAATCCATTGGAAGAGCAGCTGGTG	a_`\_`^_]aaaa`a`___^``^]_^`^^^^Z^^V_	chr10.fa		4373120	R	36	119					
+HWUSI-EAS610	1	4	3	1324	1962	0	1	GGTTCTGGGAGTCAAACTTAAATCCATTGGAAGAGC	`a]aP^YY^RYQR^RML]Za\ZVXLQ[`_N[TZX`B	chr10.fa		4373128	R	36	113					
+HWUSI-EAS610	1	4	96	137	694	0	1	TGGACTTACTTGCGCTTGTGGACTCCCTGATGTGGG	aZ^HT`Zaa`b_LYZaab_]WX]aTZ_VQSaaGGXb	chr10.fa		4373162	R	12T23	99					
+HWUSI-EAS610	1	4	21	167	1865	0	1	GGAGTCCACAAGCACAAGTAAGTCCAGTTCCAGAGG	_V\`P_`_`\`aaU_T`aSYaXTb`b_VZ`bWZOL_	chr10.fa		4373172	F	36	118					
+HWUSI-EAS610	1	4	50	1396	277	0	1	CAAGTAAGTCCAGTTCCAGAGGGATCCAATACAATT	`bba_bab`bbaaaaaaaaaa_\b`aa`aaaaaaaa	chr10.fa		4373186	F	36	119					
+HWUSI-EAS610	1	4	22	726	845	0	1	CACACAAAATAAATAAGCCATTTTCAAAAAGGCTGA	\Wb^XPYW`S`\aa[O_``_Y\ULQM\_aPSSOY]^	chr10.fa		4373281	F	36	118					
+HWUSI-EAS610	1	4	42	1228	1654	0	1	GTCACTGTTTTGAACAGAAAACTGATGTGTGGTCTC	a]``^aa^`_``_a^aa_`\^_`^^__X_O_^Z^__	chr10.fa		4373556	R	36	119					
+HWUSI-EAS610	1	4	78	838	1437	0	1	AACTCATTAGTTGATAAAAATGAATGTCCTTGTGTG	ab`a_aab]a``]`aaaaaaa]W]aa]_^aaa_a_b	chr10.fa		4373796	R	36	119					
+HWUSI-EAS610	1	4	79	395	1229	0	1	CACAACTTAGAAAACAGTGGGTTTGCCCCTAACCTG	`_WJ[U[\Q\aV^OZ[YYPFaLNW\\XXBBBBBBBB	chr10.fa		4374064	R	36	82					
+HWUSI-EAS610	1	4	85	1325	1680	0	1	ATACACTCCCTGCTGGTAGTTGAGGCCTGCTGTATA	a`abb`baaa^]_a``^[a^a`^`_]VWa_^a_^`_	chr10.fa		4374705	R	36	119					
+HWUSI-EAS610	1	4	85	1284	618	0	1	TGTTGATTTACTTAAACTGGGCTTCTCTCTGCCTCT	]aba[`_a`a__Z\aa[_`NYX`XU[YP^aVGL_]_	chr10.fa		4374852	F	36	117					
+HWUSI-EAS610	1	4	49	1496	780	0	1	GTTGATTTACTTAAACTGGGCTTCTCTCTGCCTCTC	```^]]_[]]_aZ_\[a]ZYZ]SQS\_XWVW_^XU_	chr10.fa		4374853	F	36	119					
+HWUSI-EAS610	1	4	66	81	436	0	1	TTAGGGCCATTCATTCCCAGCTCCTGGAGCACAGGA	aabbbbbbbbb`[aabbbaababbbbbabbababa^	chr10.fa		4375044	R	16T19	80					
+HWUSI-EAS610	1	4	64	771	736	0	1	GAATGGCCCTAAAAATCACTGGGGTTTGGATACAGG	aa`aab`]]_^`Z`aa[_]`_`__W`_`^_]^VW[_	chr10.fa		4375068	F	36	119					
+HWUSI-EAS610	1	4	42	514	1715	0	1	ACACATGGCCTATGCAAAAGTGCTGCTCTATTAGAA	aaa`aaa]aaabaaaaaa_a_aa`a_a`a^aaa`T^	chr10.fa		4375526	F	27T8	82					
+HWUSI-EAS610	1	4	68	125	667	0	1	TTCCCCAAAGTGAGAAAGAATTATTAATAATGTATC	aabbbb]__b_bbaZX\a\\aaaaba^abaab__aa	chr10.fa		4375597	F	36	119					
+HWUSI-EAS610	1	4	56	482	1699	0	1	CATGCATGCCACTAGTGAGTCATTCAGGATAGCAGC	a`baa`b_a_G_a_bX`\a`a`aa`_a^R`\R]__^	chr10.fa		4375776	R	36	118					
+HWUSI-EAS610	1	4	32	159	1244	0	1	TTTTAAAGAAGTATCTAAGGAGTAAAATGTTTATTA	``bba_Z_^a_W`]abbba^Z`YYJ[Z\baa`bbbb	chr10.fa		4375891	F	36	118					
+HWUSI-EAS610	1	4	49	1660	438	0	1	GATCCCCAATATTGATCAGAAGGTCAACTGTTGCAG	OYa`K_bbb\```\a]a_OYaVX[b_]b[ZP^_``W	chr10.fa		4375997	F	4A31	103					
+HWUSI-EAS610	1	4	26	578	1392	0	1	CTGCAGGGCCCTATGTGCCTAGATATCTTCATCTTT	`b`a_[V[b][`_`aOU^_Y_a_]a^Z`__^__aa^	chr10.fa		4376084	F	36	119					
+HWUSI-EAS610	1	4	50	1708	890	0	1	AGGAGTTGACCTCAAGGTAAAGATGAAGATATCTAG	\a^]N]aV`b_`ba`X``bab\^`S_]`_`aa`XaV	chr10.fa		4376102	R	36	119					
+HWUSI-EAS610	1	4	66	799	187	0	1	TGAAGTTCTTTGGTGCATAAATAATAGTTAAGTGAC	`b`_``bbbbbaZ_`^aaa``ba]ba^^aa`aaaaa	chr10.fa		4376231	F	36	119					
+HWUSI-EAS610	1	4	68	231	259	0	1	GCCTCTTTTCAAGTAGGAAGGTCTACATGAAGATTG	`aaaaaaaaaaaa_abbY[`a]a_aaa`aa_]V_`a	chr10.fa		4377259	R	36	119					
+HWUSI-EAS610	1	4	87	978	638	0	1	TTTGTATTTCAATATGGACAGAGCTAAATTTTACAA	abba`_aa_^_aa_aaa^^_a_^^a`aXa`aa__a_	chr10.fa		4377367	F	36	119					
+HWUSI-EAS610	1	4	96	108	72	0	1	CAAGCATACAACAGCCAACCTCCCTAAACAACTAAA	a[YY`^X`a]aX]W_Y_[T`YWZ_R[[]^_Y`Z[Z[	chr10.fa		4377400	F	36	119					
+HWUSI-EAS610	1	4	19	1283	1255	0	1	TGGTAGACGCTTCTGAGGCATGAACTAAAAAATCCT	aaa[a]^_\^_^___`^_[`^`\_]`[``Z\]VSQ`	chr10.fa		4379366	F	36	119					
+HWUSI-EAS610	1	4	7	1333	882	0	1	ACTGGAAGGACCAACTCAAAGAAAGAATGTTTATTT	a`bbaaaaaaa`aaaaaaa^a^aaa^]`a][^`a`a	chr10.fa		4379415	R	36	119					
+HWUSI-EAS610	1	4	7	1471	199	0	1	TTTTGCAAACAAGCATCCCTGTTTGGACTATAATAA	aaaaaa`b`_`aY`a``aa`aZ^^_V_^`_^a`__`	chr10.fa		4379703	R	36	119					
+HWUSI-EAS610	1	4	11	1422	401	0	1	TGACCATAGCCAGTCACTTTGGGTGACTTACTCAGT	aaba``X]TXSYQVU^U`]`[[S[]PU\^_UYTV_\	chr10.fa		4380520	R	36	118					
+HWUSI-EAS610	1	4	64	217	73	0	1	GCAATGGGATCCCATCCCCTCTTCTGGTGTGTCTGA	a^Q\a`aabaababa`aaa]aaaaa`aU`[a\`^a^	chr10.fa		4380962	F	36	25					
+HWUSI-EAS610	1	4	98	945	629	0	1	GGACACTCTTGTCAGTAGGAATGGGGACAGGCTGCT	aaa^a^a``aa^`_a^aaaa]``aa_]S``_Y__T]	chr10.fa		4381146	F	36	119					
+HWUSI-EAS610	1	4	54	210	54	0	1	AATGCCTCCCCCAACAGCAGCCTGTCCCCATTCCTA	aabaab`aaa``]`^M`a_`]_^_\_^V`\^^^^XB	chr10.fa		4381161	R	36	114					
+HWUSI-EAS610	1	4	72	1699	243	0	1	TAATTTTTAGAGATTATACTAGGGTTCCATCATTTT	aaaaaa`abYa^_Z_`__a]`UYPS_[_`_^^]]^_	chr10.fa		4381402	F	36	119					
+HWUSI-EAS610	1	4	56	1651	674	0	1	GATGGATGAAATTGTTGTAAGGTCTGATATCCACTG	ab`a_\aa``aaa_^`_^aa``X_a_a`aa```_`a	chr10.fa		4381602	R	36	119					
+HWUSI-EAS610	1	4	36	1043	209	0	1	TACAGGGGAACTCCAGGGCCAAGAAGCAGGAGTGGG	_`\\U[``^^a`]W]X\```a]^X\^\^X]YYOY`\	chr10.fa		4381988	R	36	5					
+HWUSI-EAS610	1	4	51	138	1622	0	1	TTTCCAACTGCTAGGTTTGGCAGCAGAGGATCTGAG	aa`a_]KTaa``[a`^]Y_\__[_UVZ_YU[ZGRU[	chr10.fa		4395271	R	36	117					
+HWUSI-EAS610	1	4	98	460	1818	0	1	GGTCAAGGTATAGCTACAATCTTAAGAAATAGAGGG	aa]b_V_aZ]_aaa```[]]_`_`]a`a\a[`__Y\	chr10.fa		4395389	R	36	119					
+HWUSI-EAS610	1	4	10	1344	701	0	1	GATGTAAGCCGGGGACAAAAGACTTCTGGGAAGAGA	aa_Y_a`\__^^^X^```^\_____\a`X]Y^^[_\	chr10.fa		4395738	R	9T26	83					
+HWUSI-EAS610	1	4	33	1425	1022	0	1	TGAAGTTCATGCTCATGCTCCCTCCTCCCTCCCCCT	^VGXaZ]aa]`aaaXa`_`aU`\aaVYa]^\]^_^Z	chr10.fa		4396269	F	2T33	107					
+HWUSI-EAS610	1	4	40	163	537	0	1	TGTAGTTCATGCTCATGCTCCCTCCTCCCTCCCCCT	aa_^_^a^T__aa``aaaabbb[baaaba^a`baba	chr10.fa		4396269	F	36	119					
+HWUSI-EAS610	1	4	96	904	1608	0	1	GGACCCTTTCACATCCTTCACGGGAGTCCCAGCTTT	]aTR[OWZ_G_Xbb]ab`a]_YRa^bP]^X]^ES`]	chr10.fa		4396676	F	36	116					
+HWUSI-EAS610	1	4	13	10	695	0	1	TTCACATCCTTCACGGGAGTCCCAGCTTTTCCACAT	aabba]aaa[ba]_aaaYa_`a_P``_aa`a`_`\Y	chr10.fa		4396683	F	36	119					
+HWUSI-EAS610	1	4	40	683	1032	0	1	AAACCACATGCACCAAGGATGTGGAAAAGCTGGGAC	abaaaa`]aaaaaa`aaa`aa_aa_a_a`__``_a_	chr10.fa		4396701	R	36	119					
+HWUSI-EAS610	1	4	20	483	1877	0	1	AGAACATATAATGCCAAGACCATGTCACAGTTCCTC	RI__TNY^Ta^YR]RYN^P_Q_b_PGOGG\G_W^`b	chr10.fa		4397204	F	27A8	103					
+HWUSI-EAS610	1	4	13	1715	740	0	1	TGCCAAGACCATGTCAAAGTTCCTCAGAAACTTTCT	a`bbaa_`^]aZQRaaaa`_[R`___[_W_[___`a	chr10.fa		4397215	F	36	119					
+HWUSI-EAS610	1	4	9	1507	1456	0	1	ATAAGAAAGTTTCTGAGGAACTTTGACATGGTCTTG	`ba_aaa\__aaX^^aaa_`_```a`^aa^TX_^^`	chr10.fa		4397218	R	36	119					
+HWUSI-EAS610	1	4	99	984	1883	0	1	AATAAAAAAAAACCCTACATTTTAAAGATGAGGTGA	aaaa`^aa```_[U\^][]_`a_]XY]Z]^Z^][][	chr10.fa		4397360	R	T1A33	43					
+HWUSI-EAS610	1	4	32	306	1974	0	1	CAGGCTCTCCCTCACCTTTGTTGGGCATTTCAGCTA	a```a_aa`ba```_[N_ZUS\ZYR\PY___^\^\^	chr10.fa		4397724	R	36	23					
+HWUSI-EAS610	1	4	48	1093	643	0	1	ATACACAGAGGGACCCATAGCTCTAGCCGCACATGT	\__X_ZNRZY]\_aa]````aaZ^^\]Z\`^W`^]]	chr10.fa		4398218	F	33C2	84					
+HWUSI-EAS610	1	4	4	679	1088	0	1	TCATAGAATCGGGGTAAGAAGGATGAGATAGGAGGG	``Vaaa^a`_aa`bU^^[NZX`Y`_]_ZV^a_Naaa	chr10.fa		4398382	F	36	118					
+HWUSI-EAS610	1	4	85	1000	1999	0	1	TTAATTTATTCACTTAATGTCCCAGTCACAGCCCCC	aaa\a`a[a__RUa[^]`_Z]]ZX^ZZXWORZZZXX	chr10.fa		4398585	F	36	118					
+HWUSI-EAS610	1	4	91	911	955	0	1	CTCTGTTGCCTGTCATTAGATCCCTTTGGGCACCAG	_b]ab`abbXaa_aXaa^^`]a__aba`W^]``a[a	chr10.fa		4398706	R	36	119					
+HWUSI-EAS610	1	4	59	336	494	0	1	GTCCGTGATTCAGTCTCTGTTGGCCCCCATGGATCC	a`XHZSXNWWVMaYUV]RWYPKVXQBBBBBBBBBBB	chr10.fa		4398849	F	3A31A	55					
+HWUSI-EAS610	1	4	83	1414	134	0	1	TGTGGAAGAGTCAGAGATAGGATTGAGAGAGATGGA	a]R\X_aW_YW^[\][\\\\\^_^_[N[_ZXWVOTU	chr10.fa		4398926	R	36	118					
+HWUSI-EAS610	1	4	31	173	645	0	1	CACCCAAAATTTGTCCTGCCTACAAGATGCACAGGG	_aaaa_QUL\``_Y``Xa_`]_]Z]`Z^_`\^\__`	chr10.fa		4398971	F	36	25					
+HWUSI-EAS610	1	4	64	1706	1339	0	1	CACCCAAAATTTGTCCTGCCTACAAGATGCACAGGG	abbbabaaaaabaa`aaa`aaaab]aa`a````aaa	chr10.fa		4398971	F	36	29					
+HWUSI-EAS610	1	4	23	953	1434	0	1	GGAACCTAGCATAACTCTCCTGAGAGGCTTCATCCA	a_R__YLY`Y]`VZUPPNN`a`a_[Z_[UZ[ZWPUT	chr10.fa		4399116	F	36	26					
+HWUSI-EAS610	1	4	2	529	1421	0	1	CAAGATAATCTCTCTGATGTTTGTCTGTGGGTCTCT	a``aR`\SYYY[ZY]YIW`Y[_a\_^_W`^_U_Q_X	chr10.fa		4399173	R	36	118					
+HWUSI-EAS610	1	4	52	1029	334	0	1	GAGCTTTGTTAAGACTGGGGTTCTGGGCTGCATAAT	a_a[b`]aaba__X]aQ_U`__]a_XVS_ZYa_]``	chr10.fa		4399249	F	18A17	93					
+HWUSI-EAS610	1	4	31	342	1431	0	1	GCTGTGACAAAGTCTTCTACAAAAGTGACTTAAGGG	aa]b`bb]^`aa_aaa```ab_`aa\aa\aa``aaa	chr10.fa		4399387	R	36	119					
+HWUSI-EAS610	1	4	56	381	26	0	1	ATATTAGTTAGCTTTCTCATTGCTGTGACAAAGTCT	aaaaba`]aabaaaaaaa`baaa`a]a_````a_a`	chr10.fa		4399408	R	36	67					
+HWUSI-EAS610	1	4	8	509	1450	0	1	AACAAAAGAATTCATGATCATCCGTTAAACATAGGT	YZ^`a`a]`_baaba_^^_baabbaababaa``ba\	chr10.fa		4399791	F	36	119					
+HWUSI-EAS610	1	4	88	1076	456	0	1	GGGAACTTGATGAGATCCTTATCAGGGATGGGAGGC	ab_Za_ab``a^a_`aaaaaa_^[aa_[_a`\\\_^	chr10.fa		4400289	F	36	119					
+HWUSI-EAS610	1	4	15	1182	1222	0	1	CCAAGGGGACTCTTCCCAGTGATGGCCGACTAGGCC	`aa_[_X\`[R]U_PV\aV[[[Z`_\\VGPa\[NN\	chr10.fa		4401202	F	36	16					
+HWUSI-EAS610	1	4	6	312	1669	0	1	AGAACCTGGAAAATGTTATCATAGACAGCTGGTAAG	]_\`abbb`Z^_ba`U^a_baaaaaaaaaaaaVFZa	chr10.fa		4402318	R	36	118					
+HWUSI-EAS610	1	4	93	1623	1106	0	1	GTTTAGGATCCTGACTCGAACCCATTGAGTGCAAAG	^a_b_^`Z_`_aa`_Ya_[a_[`_a\R[]]`U_^_[	chr10.fa		4402419	R	22T13	82					
+HWUSI-EAS610	1	4	62	1303	1202	0	1	GGCTGTGATTCATATTGAATGCGTTGGTACACAGGG	aabaaaXQ_a^\RT]ZWZYa]YV\\[aNTW`[aa[_	chr10.fa		4402906	R	4A31	81					
+HWUSI-EAS610	1	4	42	74	1244	0	1	AGGAAATTCTATTTTCATTCAGTTAGTGTGCTTTAG	[aaTU\bba`b]aab`[``b_b`aba`b_baaaaab	chr10.fa		4402963	R	17C7A10	44					
+HWUSI-EAS610	1	4	20	1043	1299	0	1	CCAAAGATGTCACCAACCTAATCCCTAAGACACATG	``WV][J^\T\X[XY_`a__]_Z`]ZR_`_PQ]```	chr10.fa		4404018	F	36	118					
+HWUSI-EAS610	1	4	23	1035	1145	0	1	ATACATTGCTTTCACCTGTCCAATATTCTGNCCAAG	a_VGW``\^`aPVa_\a_RLZU^`a_ZWaXDU^_`_	chr10.fa		4404302	F	30T5	109					
+HWUSI-EAS610	1	4	36	777	1369	0	1	TGGAGCAAGAATTACAGATGGTTGTGAGCAAATGGG	a`_^Xa\``ZY\ba_X__baa`UaZ]ZY_VQ[^V[]	chr10.fa		4405119	R	36	119					
+HWUSI-EAS610	1	4	69	1443	1674	0	1	GTCTAATGTGTATTACTTGAGTTTTATTATTGTGAT	a`a\^[P_T]XYaa]Z^a\^_Vaaa^`_O_`_Y`]_	chr10.fa		4405272	R	13G22	81					
+HWUSI-EAS610	1	4	2	1452	1088	0	1	GATCTAGAGGGACAGAGCTTCCTGAGCTGTTGGAGC	aaaXb^a^a`^^``a_aaaaa^_`\a_a`\]Y`\__	chr10.fa		4405547	F	1T34	81					
+HWUSI-EAS610	1	4	86	712	1564	0	1	TTTATTTCGACCCAGGTCTTATAGGATGCAGTTCAT	aabaaabaa][`a`aa]`a`aaYa__^`]]aT_\_^	chr10.fa		4405882	R	36	119					
+HWUSI-EAS610	1	4	84	1030	1096	0	1	TTGCAAGGAAGGTGCACAGGTATCTGGTATTCCCGG	aa_QY^TYZMZa^`Y^Z`^[F^[QX``[_`\U[[a^	chr10.fa		4408560	F	36	15					
+HWUSI-EAS610	1	4	13	1647	146	0	1	GTGTTGACTACAGAAGCTACACATCTTCAGGGAGAG	]XZY]NVVNZY_[\]QOM\TBBBBBBBBBBBBBBBB	chr10.fa		4408622	R	23G12	46					
+HWUSI-EAS610	1	4	100	464	1238	0	1	GCTGGAGCACCCTGGGGAGCCATCTCTGGTCTGGAA	a_aa`a_\]\_\^a`T\```Z\\aX\\\^P\R`XZ^	chr10.fa		4408688	R	36	37					
+HWUSI-EAS610	1	4	26	1307	1122	0	1	TGTCAAAGCCCTCCCAGGCAGGGTGGACCCCTCTCC	`a`\]`X^WZ^Z\Z[ZV]P``^WLQSZWRVSZS\RR	chr10.fa		4408931	F	2A33	16					
+HWUSI-EAS610	1	4	70	1748	1771	0	1	GTGTCTGGAGCCTTGAGTATAGGGAGCAGAGGTGAA	`[X_abab_a^^_a__ba^`abS\`aa[OYa^HU]a	chr10.fa		4409895	F	36	118					
+HWUSI-EAS610	1	4	4	68	1995	0	1	TGGGGTTAAACTTTTCTTGTTTCCCGTGCTGCTTTC	SN\\a```a`b_`_RX_]ba`R_[WJ^`^]aaUaS`	chr10.fa		4410355	R	36	118					
+HWUSI-EAS610	1	4	35	453	1934	0	1	GCTCAAGCCAGGAAGTCAAGGGTGATCTGAATGAAG	aZP`\aWaZOZZVYRK[VY[T]RX^[\[_YYYVOPU	chr10.fa		4410391	R	36	118					
+HWUSI-EAS610	1	4	54	1738	1061	0	1	GCTCAAGCCAGGAAGTCAAGGGTGATCTGAATGAAG	aaa`a`\\^`aa_``U_]S\_`RUX[_``^^[R[Z\	chr10.fa		4410391	R	36	119					
+HWUSI-EAS610	1	4	84	397	365	0	1	CATCCACAAGGACAAAGCTTTCAAAACCTAAAGGCT	`ZT\TRTWY]XT]\]OITT\a_YYZ^VZ^\a^[LTZ	chr10.fa		4411226	R	36	117					
+HWUSI-EAS610	1	4	40	556	1386	0	1	AGCATCCATCATCCACAAGGACAAAGCTTTCAAAAC	a`bbaaaaaaaaaaaa`a````aa]\]``a_a[a`^	chr10.fa		4411235	R	36	119					
+HWUSI-EAS610	1	4	66	217	558	0	1	ATGATGGATGCTGCTATGAAGGAGGTTTTCAGGAGA	]Z[_\^aZN_a^a``\[a`X`aZa]JLZ^\Y`\QXB	chr10.fa		4411259	F	36	113					
+HWUSI-EAS610	1	4	48	1790	14	0	1	GCAGATTTCTGTGAGTGAGAAGGCAGCCTGGTCTAC	Tba`aaabaaT][`aaaaaaa`^`a]\`VNQUU___	chr10.fa		4411436	F	36	40					
+HWUSI-EAS610	1	4	61	792	1647	0	1	CACCACAATACCTGGAGCTCACTCTGTAGACCAGGC	aaaaa]`ba`Xa`^]ZMUZ\`_b^ba`a`a_````V	chr10.fa		4411461	R	36	119					
+HWUSI-EAS610	1	4	92	1245	279	0	1	TGGCTGTACAATGAGGTTCAGTTCGGTTTGGTGAGC	aaaaa``a``a``[[_Za_aa[`[___`a[[[__^U	chr10.fa		4411551	R	36	119					
+HWUSI-EAS610	1	4	68	1042	1733	0	1	CATGACAGTGGGAGATAATACAATGGCTGTACAATG	aabba`ab\`bb`aaaa_aaaaa^X^`a_GPOPWSW	chr10.fa		4411574	R	36	117					
+HWUSI-EAS610	1	4	27	767	125	0	1	TACTAGGATATCTCATTAAGCCCTACTTAAGATATT	ab`aaba`aaa`aa`aaa`__``a__```_`]```a	chr10.fa		4412029	R	36	119					
+HWUSI-EAS610	1	4	17	582	1791	0	1	AAGATTTTGTTGCTGTGCAGACCTGGCCCAAGAGGT	aa\\`X`_a^_aa\`U[[[[_[`_]a_`_\_^_[ZB	chr10.fa		4412074	F	36	54					
+HWUSI-EAS610	1	4	59	1606	1796	0	1	TTTTCCAACTACCTCACTGCCTAAGCTTGGCTATCC	`aZaZ]a\Wa[LZ\\^XRY[Y`VPT\XYLVUZUSBB	chr10.fa		4412662	R	36	5					
+HWUSI-EAS610	1	4	81	680	1841	0	1	TTCTATTACCAGCTTTCTGTTTTCCAACTACCTCAC	aa_aaaaaa_aa__`_aa^T]a``__][]]^`^_^_	chr10.fa		4412681	R	36	13					
+HWUSI-EAS610	1	4	15	669	54	0	1	GGGGAGTTCTAGCTCCAGCAAGCAGCAAAACATGGC	a`a]^a[_`]`^^[_Z^``_]]U\\UU[U\V\UUYW	chr10.fa		4412732	F	36	119					
+HWUSI-EAS610	1	4	37	1062	1894	0	1	AGAGAGCCTATGAAATGCTATAAGTGAAGCCTAGTT	]`b`\ba`ba`Yabab_```aaaaab_b_OS_T``^	chr10.fa		4413160	F	36	43					
+HWUSI-EAS610	1	4	68	804	1014	0	1	GTACCATGGGAAGATCACCAAGAACAGCAGTCTCAG	`[a_]X`[W`\W]]^``YU`^aX[Y]aT_TT^^ZVX	chr10.fa		4413229	F	36	26					
+HWUSI-EAS610	1	4	82	962	1098	0	1	GGAGTGGAACCAGCCCAGGGGAAAGAAGTGTAGATC	]a]\T\aVa^]XaROV^`]GXRPVBBBBBBBBBBBB	chr10.fa		4413466	F	29T1GTTG1	5					
+HWUSI-EAS610	1	4	85	483	1569	0	1	GCAGGGGCTTGACAGCATCTAGGCAGGCATGGTGCA	R[a_Q\X``TV\aa_`Y\`[\`_\\UZ`Z`\_Z`XR	chr10.fa		4413960	R	36	41					
+HWUSI-EAS610	1	4	22	569	1071	0	1	ACACACACACTTCAAATAACACTTTTTAAATGTGTA	aaaaaa``__aaaaaaa_a```aaaaa`[]aaWa]a	chr10.fa		4416848	F	36	119					
+HWUSI-EAS610	1	4	42	234	639	0	1	AGGAGAGCCGCAGTGGCAGGAACTGTTGTAAGAGAA	_`bababbbbbaa^aaaZa^TZ]``T``^```]\XV	chr10.fa		4417219	F	36	119					
+HWUSI-EAS610	1	4	18	1330	775	0	1	GCCACAGAACTTCTAGAAGCTTCTCTTACAACAGTT	aaa`a^YX[_aaa^`_aaYR\]X[_`Z`Z`Z]_]X[	chr10.fa		4417239	R	36	119					
+HWUSI-EAS610	1	4	58	1328	339	0	1	TGAGAACCTGCTTCTGCCACAGAACTTCTAGAAGCT	`a`b_a__a_]aaa_aaaa`aR`_______[^^^__	chr10.fa		4417254	R	36	119					
+HWUSI-EAS610	1	4	93	578	1761	0	1	CACAGATCTGTTGTTCCCTGCCCCCTCCTCTCCTGA	aaa`ba]]aaXaa]aaa``_`aZ`a\``Z\^a`_^^	chr10.fa		4417532	R	36	119					
+HWUSI-EAS610	1	4	61	898	477	0	1	AGGAATAGAAACCTTGACTAAGACAGCATGTGTGTG	abaaabbaaaa__aaaa`b`aaa`a`^`aa_b^a_b	chr10.fa		4418361	R	36	52					
+HWUSI-EAS610	1	4	29	1277	1621	0	1	AGGTTGTAGTGTGTTTTACAGCCTGAGGTGGGAGGG	N\Q_^__bbZ^T_\_`^J_VVVZV\^__U_ZXBBBB	chr10.fa		4418877	R	34TA	96					
+HWUSI-EAS610	1	4	68	1681	1258	0	1	AAAGCAAACACTATTTACAGGGATATGAAGGTTGTA	a_a^aa\`aaaaa\^aY^[`aVU]_aY_[^BBBBBB	chr10.fa		4418905	R	36	93					
+HWUSI-EAS610	1	4	68	451	918	0	1	CAAACTCCTAGAAAGCAAACACTATTTACAGGGATA	abaaaba_aaaa`ab_\VZ^`abab_ba`_b`_]a^	chr10.fa		4418916	R	36	119					
+HWUSI-EAS610	1	4	22	930	1843	0	1	TACTCTAGGAGATTATCTAGGACCCTTATCTTTAGT	ab`a`aabb__aa`aa_a`XYa__`aaa`\aa`_\[	chr10.fa		4419003	F	36	119					
+HWUSI-EAS610	1	4	96	279	829	0	1	CCTGTTCAGGACTAAAGATAAGGGTCCTAGATAATC	aaabaaa`aabaa`a``aaa`aaa]`a`aaa`a_``	chr10.fa		4419013	R	36	119					
+HWUSI-EAS610	1	4	60	1301	1271	0	1	GGCTGCTCAGTGTTAAACAGGTGGCAACAATCATAA	aa][Y^\PYUDQN]R]^TZ`aWZWOWNQVPQSRY\\	chr10.fa		4419146	F	36	115					
+HWUSI-EAS610	1	4	82	277	303	0	1	GATGGTGGCAGAGGGTGATACAGAAGATTTGGACCA	a``baQaaaaaabaaWba`__`a_Va^aa`___``a	chr10.fa		4419192	F	36	119					
+HWUSI-EAS610	1	4	60	1318	1103	0	1	TTGCCCGTGGTGTGACTTCTGTGAGGATGATATCTT	aaaa_Yaaa\QaZa_]aa_]aXWL]_^___`__\``	chr10.fa		4419235	R	36	118					
+HWUSI-EAS610	1	4	73	753	514	0	1	AAGGACACACAGCAGGACTCGTTGTATTGAAGGACT	aabaa`b_aaaaa`_aa`a`b\a`U`_Za_Ua`X_a	chr10.fa		4419397	F	36	119					
+HWUSI-EAS610	1	4	53	929	1570	0	1	GATCCCATCTGTCTTGGGCTTTGTGCTTCTGGATGT	a[aQ`Y``\``^\_[[a]^`a_[^]SU\\WRVY\\\	chr10.fa		4419476	R	36	119					
+HWUSI-EAS610	1	4	51	939	1946	0	1	TAGCAAATTAGACCGTGCTTGCCTTCCATCCTGGCT	`bba[]`ab`^`\`a[^^a`]\[^^ZW^Z[[[`[[[	chr10.fa		4419515	R	36	119					
+HWUSI-EAS610	1	4	58	1448	1387	0	1	ACCTAGCAAATTAGACCGTGCTTGCCTTCCATCCTG	aaaa^]_aaaaaaa``_aaa``_Y`__`\^``^\_`	chr10.fa		4419518	R	36	119					
+HWUSI-EAS610	1	4	92	448	1784	0	1	AAGGAAAGTCTCAGTCACAACATTAAATCCAAGGCA	ababK^S__b_aa_[_^_a``_ZV[a_`ba\VY_WW	chr10.fa		4419743	F	36	118					
+HWUSI-EAS610	1	4	12	190	120	0	1	GGTGCATGCATTTACAGGTAGTCCGTCAGACTGCGA	abSbbbbbba_[_bbbbbbbaabba`bbabbaba]^	chr10.fa		4419808	R	1C34	80					
+HWUSI-EAS610	1	4	96	576	570	0	1	GTATGTGCTGTGGCAAAATAAAATCAGTGTGAATCA	_U`aa^a`aa^a``US\aaZ]\M]\]aVZT`_^Z__	chr10.fa		4419847	R	36	118					
+HWUSI-EAS610	1	4	25	525	774	0	1	TGCCTATTCAAGTTCCATCCACTCATTCATTCTCTC	abaV]aabb`aaIZ``b``ZT\`aZa__aa``a_`^	chr10.fa		4419983	R	36	118					
+HWUSI-EAS610	1	4	49	1218	454	0	1	TAGTGTGNGGAGCAACCTTCTCCCTTATCAGATCTC	aY^`]XUDW]`_[^a^]a``_^_Y_`_`_XS]Z\]S	chr10.fa		4420407	R	7T28	110					
+HWUSI-EAS610	1	4	55	1174	120	0	1	ACAGAAGCTAATAGTGAAGGGTATGTTATCTGGAGA	aaaaa`[\a_`_`UZa]_`a`W_]Y\`__W\[[]__	chr10.fa		4420469	R	36	119					
+HWUSI-EAS610	1	4	38	1281	1502	0	1	GATTAGACCACATCGTGTTAATATGGATATCTGCAA	a_aaaa__`a`^__a[a_aWZa`aa_____]__Xa_	chr10.fa		4420749	F	36	119					
+HWUSI-EAS610	1	4	30	318	219	0	1	TGGTTTTACATTTCACATGATGCCAAGACAGTTGCA	aab[a`\aaX`aa``a^aa`_aaa_`a`a_a`]aa^	chr10.fa		4421112	R	36	119					
+HWUSI-EAS610	1	4	33	881	335	0	1	TTTTTTCAGTATTGAAATAAGTTGTTCCCATCCTAT	abbaaa``a^aaaa^`^_^_a^a__`^^]^`^^`__	chr10.fa		4421392	R	36	119					
+HWUSI-EAS610	1	4	67	254	25	0	1	TGCTTGCCTCATTAGGACAGTGTATAAGATGGTTGT	aX`[\^`_VaS[YZ_ZS_Y[T]QR[ZZ_WM\ZST][	chr10.fa		4421484	F	36	118					
+HWUSI-EAS610	1	4	40	564	194	0	1	AGAGCTATGGTCCATGCAAGCAAGATAACAACAAAT	`SLXT^V\\_WZX_]_ZaY[Q`V]_\]_Q_WQ[`aa	chr10.fa		4421644	F	36	118					
+HWUSI-EAS610	1	4	18	675	1444	0	1	GTAGTTTTCCTTGCATTTGAAATACAGCCCAGGATT	a_a^Za``_`a_a\`_`[\P]`a_^`^__a_a_`_`	chr10.fa		4421724	R	36	119					
+HWUSI-EAS610	1	4	52	521	1664	0	1	CAAATAGCAGCTTAACGATCTTCTAGAAGCATACAC	aW_T]aTa_a`a``]WHSX_`a_a^PXRWTQYUPL]	chr10.fa		4421784	R	36	117					
+HWUSI-EAS610	1	4	58	327	1816	0	1	TGCAGAGACTAACATTATAGAACATCTGTCTTTTTC	abbb\`abaabb_^[Yb\[`_bbaa`bb`babbab_	chr10.fa		4422368	F	36	119					
+HWUSI-EAS610	1	4	2	1310	910	0	1	AAGTGGTTAGATCAAGTGGATGAAGCCTCATACGTG	a`bJba_`b]^`[a_``___a`\`_aZ]_]ZFWaU`	chr10.fa		4422454	F	36	117					
+HWUSI-EAS610	1	4	20	1434	1757	0	1	GGGTGGAGTTTATTTTATGACGTATGGACATGCTTT	aaaX``\a_aaaaa``aaa_W``^]^_^^___^___	chr10.fa		4422551	R	36	119					
+HWUSI-EAS610	1	4	3	1156	747	0	1	CACACTCTGCTTCTGTATTTATTTCTCATTACAGAC	Ya`aXbab]a_\`b^W`bbbb`bb]babbabaa^`a	chr10.fa		4422840	F	36	119					
+HWUSI-EAS610	1	4	59	1404	1919	0	1	GGGCCTAAAGCGTCCTTATTGGACCACTTGGCAGTA	`_aabb]aa_U`aSXaaa`\a`a_Z`WZa`_V^BBB	chr10.fa		4423304	R	35C	103					
+HWUSI-EAS610	1	4	90	654	280	0	1	AGGTAAAGTTAAGTAAGTTCTAGACTCTGCGTTATT	Y^^a```bab``b`bbaabbbbbbbabb`ba`aa`b	chr10.fa		4423678	R	36	119					
+HWUSI-EAS610	1	4	99	1204	1014	0	1	GCACTCAGGCTCCCTTAGCCTCGGGCTTGCTTCAAC	``^\`\^^^]Z\\^\`^\[Z\Z^T^XZ\X\^\T]\^	chr10.fa		4423739	R	36	119					
+HWUSI-EAS610	1	4	89	1458	1021	0	1	GACCATGCTTGCAAGCCTTTCAGGCACTCAGGCTCC	Zaba`]]bb[aaa\^baaaa`a`a^a`a`aa]`]``	chr10.fa		4423762	R	18C17	81					
+HWUSI-EAS610	1	4	83	271	689	0	1	GAGAAATCTCAGCACCTTCGGGGACCTGGAGGAGGT	^bbK]^Z\V\ab]aa_`]Zba``ZaaaaWVaaSa\Q	chr10.fa		4424673	F	36	118					
+HWUSI-EAS610	1	4	18	983	482	0	1	AACAGCTATGAAAAGCCTGGGGACCCCGAACCCCTG	_`Z]`W]^`X]_ab`]b`XZSR_ROa]aXaRR_Zaa	chr10.fa		4424743	R	36	118					
+HWUSI-EAS610	1	4	97	839	1194	0	1	GTAAAACAGACCAGGTGCAGAGTACACAAGAACTCG	a````[`a__U__^^Wa_`a_aZ_^`_^a`[_^_]_	chr10.fa		4425067	R	36	119					
+HWUSI-EAS610	1	4	39	1764	1398	0	1	TGGGGGCTGGTAGGCGTTCCTGGCCCTCACCCCCTT	_a_aQJ`RXMQQRQ_FQQ\\^RTKYSTBBBBBBBBB	chr10.fa		4425110	R	23T12	61					
+HWUSI-EAS610	1	4	43	540	1418	0	1	TGGGGGCTGGTAGGCGTTCCTGGTCCTCNCCCCCTT	_aa[aa_aaZJT`\_a\Ua```QITXZSDYV`aW^U	chr10.fa		4425110	R	28A7	109					
+HWUSI-EAS610	1	4	89	1340	581	0	1	AGAAGCTGTGATCCGTCCATAATCAGGAGAGCCAGA	a]\VHP\PURUPRYWMNZZZR[YWWWWTPUUUXURU	chr10.fa		4425191	R	36	117					
+HWUSI-EAS610	1	4	19	1403	791	0	1	GTCTCCTCGCTAGCCTGCCTCCTTCTCTCTTTTCTC	`Zaaa^a`a]^_NWa\^Za^\_``P]\_Y^a_a__B	chr10.fa		4425231	F	36	114					
+HWUSI-EAS610	1	4	59	532	1281	0	1	TAAGACACAGAGGTAGGATGAAGAGGAAACAACAGG	`TZM\_Z\\\PYWJ\a^O\_T\aZ\aXSQX[XQP[a	chr10.fa		4425301	R	36	117					
+HWUSI-EAS610	1	4	3	1293	784	0	1	CATCCTCAGGTCCTCCGACATTTTCCANTAAGACAC	`a^aaaaaaa_`_aY`ab[aaaaa`_[D[a__]^a\	chr10.fa		4425329	R	27T8	110					
+HWUSI-EAS610	1	4	9	867	1602	0	1	CAAAGTTCTTCAGACAAGACTTAGAAAGATGAATTT	a`aaaa^`a`aa]aaaaa`aba`b]_`]]aa_aaa`	chr10.fa		4425647	R	36	119					
+HWUSI-EAS610	1	4	67	1074	691	0	1	GGCTATCACAGATAAAAAGAAACCTCAGTTGATAAA	a`^`aa_a`aaWa_aa_a_aaV_^^X[_T_`_`\``	chr10.fa		4425758	F	36	119					
+HWUSI-EAS610	1	4	44	1743	426	0	1	CAGTGAAGACGATGTTTCCCTCATAGGTTCAGAGCT	abbYbbbaaa_bb]`bbaab]aaa_NSS`^YU]Y`a	chr10.fa		4425911	F	18T17	81					
+HWUSI-EAS610	1	4	4	891	1740	0	1	TCGTATGCATGTCTGAAGTCTGTCGTAGTAACAGCA	a^aI_Y\^X]]OP`bUa`I`\a\Ta_aa^_Y`a`WB	chr10.fa		4426000	F	36	113					
+HWUSI-EAS610	1	4	60	272	985	0	1	AGTCTGAATTACCCTTTGGTTAGTTATCCCGGTTAG	aa^bba^\abb_a``aab`\`a_aa``aaaba_a]a	chr10.fa		4426057	R	36	119					
+HWUSI-EAS610	1	4	97	1528	1255	0	1	TGTTAAGCGAGACGCCTCTCCTTAGTGATAACTGAG	`babaaa\`aZ``a[[\_aa``a]X\]\`aa^[^`_	chr10.fa		4426315	F	12T23	82					
+HWUSI-EAS610	1	4	63	1536	901	0	1	AGCCCAGATCCCAGCAGCCTTCTTAACTCTGCGAAA	aaa_a`a]a]aa_Z__^`aaa_\_]\Q]_`__^SX\	chr10.fa		4426349	F	36	119					
+HWUSI-EAS610	1	4	24	983	1104	0	1	ATCTCCATCCTAGTTGGTGAGCATTCCGCTGCCACA	aaaaXES]O_a_\WXU[\aQ`^`WTXOK\G^N__]X	chr10.fa		4426779	F	36	115					
+HWUSI-EAS610	1	4	70	1777	916	0	1	ATGTGGGACCCACTACCTTCCCAGCAGAGCATTCAC	a]MLSPMQQZTXZNZTa`URXVRQO[LTTS\QTBBB	chr10.fa		4426846	R	36	104					
+HWUSI-EAS610	1	4	66	269	1748	0	1	TCCAGGGAGGACCATGCAGTTCAGCAAATGGACTTG	`b_]_a`\a_aaa_a`\\`U\_\Xa]MR\^ZP[\_W	chr10.fa		4426884	R	36	118					
+HWUSI-EAS610	1	4	16	499	59	0	1	AATGAATTTGTCTCCTGATTACTACAGAGCATACTG	aaaaaaXWVaTY]R[`_SSDY_`ZZTPYSTWW\O[^	chr10.fa		4427056	F	36	116					
+HWUSI-EAS610	1	4	84	1359	140	0	1	TTTGTTTTAAACTCTCCATAAAACCCCACAGTATGC	aaaY^`aaaa`_`^a_`aaa`aa___^`X`_[___^	chr10.fa		4427084	R	36	119					
+HWUSI-EAS610	1	4	54	931	20	0	1	ATGTGGCTGACACGGTAAGACAGCTTTTGAAAGCAA	a_`\`_\\a]]^_aaV_\^]O_^YT_]^_^^XYV^^	chr10.fa		4427416	F	36	119					
+HWUSI-EAS610	1	4	74	1072	218	0	1	GCTTTCAGGGAGACAAATAGGAAGGTCCCAGGAACT	aUaa`\`_`____^__^a_a_X_X\^_\WU[_\\W^	chr10.fa		4427510	F	29C6	93					
+HWUSI-EAS610	1	4	53	1313	1185	0	1	GGACTTGAGCTCTGAGTGCCTACCTTCCATGACTCC	ab``bab`ZaaXaTabaT]]^a`bQQ[a`UZYSRXa	chr10.fa		4428649	R	36	118					
+HWUSI-EAS610	1	4	8	1717	48	0	1	ACTGGTAGAACAATCTACAAAACCCAGGGAACCCTT	a`^_WV[MZ\M_]^]W]`[PUXGU\]WOZ]ZZSGPZ	chr10.fa		4428784	R	22G13	105					
+HWUSI-EAS610	1	4	16	769	283	0	1	AGCGAGTGTCTATTAGGTATGTTTTTTTGTTAATGT	aa_aU`]`]_a_`a_a]R^^a]```aa]aV``^\^S	chr10.fa		4429057	F	36	119					
+HWUSI-EAS610	1	4	4	485	32	0	1	GTTAACACCATGACCAAAAGCAACCTAAATAAGAGT	a``a```__`a_a__``_][^_`^S`^_``]W]V_[	chr10.fa		4429095	F	36	119					
+HWUSI-EAS610	1	4	66	1114	1335	0	1	GTTAACACCATGACCAAAAGCAACCTAAATAAGAGT	a`a_\[a_`XRa_^UU__S__a[[\_`WX__]]]_B	chr10.fa		4429095	F	36	114					
+HWUSI-EAS610	1	4	49	80	555	0	1	CGGCACCAGAAGTGGAGTGAGTTACAAAGTCTCAAG	a]aaa_^F[^V^V_[V^Q_Q^T_`]Y[]_\`^`___	chr10.fa		4429243	F	36	117					
+HWUSI-EAS610	1	4	21	1400	1653	0	1	ACCAGTGAAGTACTTCCTCCAGCAAGACCCCACCTC	aaRaJP_a`a^a\a``\]Y]X`YaaSaSGW_aZWBB	chr10.fa		4429285	F	28T7	98					
+HWUSI-EAS610	1	4	78	1639	299	0	1	ACTCCCAAGCAGCAGTGCAGCCTGCTAGAGTGTTTA	aaa`a\]_PaaXN]ZUGPa_^`WSaUBBBBBBBBBB	chr10.fa		4429336	F	34C1	72					
+HWUSI-EAS610	1	4	94	1173	1205	0	1	GCAGACCTTGGACAATCTATGGCATTCTCTAAAAAC	aaaa_``aa`_a[_`a``a^_a^Y`__a_aa_^`SX	chr10.fa		4429708	F	36	119					
+HWUSI-EAS610	1	4	60	323	983	0	1	GCATCATAATAAAAACGGCCCAAGGGGACATTTTGG	`b]aab]`]_b^Z^`aab`a]PW]_`]^VR[]_`a`	chr10.fa		4430191	F	36	119					
+HWUSI-EAS610	1	4	38	643	21	0	1	AGAGATAAGGAGTAGATTTCTTGGATTAAATTGACT	a_T_YZSOOY^`L\_R\`aYY_`]LY____YWWX^`	chr10.fa		4430528	R	36	118					
+HWUSI-EAS610	1	4	53	1030	4	0	1	AAAAATTGATTTGTTGTAATCACTAGAGTGNTTTGT	ab_aaa`[`a^`b]b``baba^V`_``a]XDXYUSZ	chr10.fa		4431316	F	30A5	110					
+HWUSI-EAS610	1	4	62	369	1133	0	1	GGCCAAAGTAGGAATGAGTGAGCTTGGAGATGAGCG	^`aa`]G`X^aa]``_V`WaQ__]_^_\^S_a]\\\	chr10.fa		4431478	F	36	118					
+HWUSI-EAS610	1	4	89	170	1171	0	1	CTTTGTATTGATTCGTGCCGTAGGGCCTTTATCAGA	aa`^b]aa_aX_ab_H_``aYW`__``^_a]S^N[Y	chr10.fa		4431867	R	36	118					
+HWUSI-EAS610	1	4	70	138	438	0	1	CTGGGATGCTCTGTGACTCGGTGTTCAAGACCGTAA	aa]]^RT`a^aWUK`]GZ[\YT[NNTOZ_VYQ[SOV	chr10.fa		4431939	F	16A2A16	73					
+HWUSI-EAS610	1	4	52	1474	1407	0	1	ACTCTATCAAGAGATACAACATTCACACATTCCTAC	]TXQ[`_TVQVQQLLW]V^GSP]^`^`]]VQJJYZ^	chr10.fa		4431990	F	36	116					
+HWUSI-EAS610	1	4	50	589	1818	0	1	TCCTACCCACTATTTAGTGGACTTTAACATTTGACT	ababaaaaaaaaaaa^]]aaaaaaa_aaaaaa___a	chr10.fa		4432020	F	36	119					
+HWUSI-EAS610	1	4	21	1321	905	0	1	GACTCCCTCACCCCTTGTCAGTATTGTTGGTCATAG	`a`aa`\aa``aa_^aa`_\aU]_^_\\\VU^^ZZ]	chr10.fa		4432052	F	36	119					
+HWUSI-EAS610	1	4	12	1666	1053	0	1	TGTTTGTGTGTGTTTGTGAGTTGTGTGTGCACGTGA	Za[aa^W[UQP\R_]ZW`Z^W_`YZW`V_]^[RUXU	chr10.fa		4432139	F	36	42					
+HWUSI-EAS610	1	4	91	436	277	0	1	ATTTCGTCAACTATTTCCAGTAACCTGATGTGTACA	]bbabbaabaababbaabaa_^a_aab_aa_a^`a_	chr10.fa		4433781	R	36	119					
+HWUSI-EAS610	1	4	8	901	309	0	1	AGATGGGCGTGTTTACATCATAAAACCAGAACTGAT	abaa^^_Z`^aaaaaaaa\_aab_a[[`^`_^^aaa	chr10.fa		4433914	R	36	119					
+HWUSI-EAS610	1	4	84	783	1350	0	1	TAATAAATACTGCAGACATTCAGTCACTGAATGGTC	`Y`\]`\\a`aa_a]a_aa`^`a__``a]WY\_]W_	chr10.fa		4434013	R	36	119					
+HWUSI-EAS610	1	4	78	826	1028	0	1	GTAAGGAGATGAGCCTGAAGGAACCATGGAGGTGGG	_Z_aa[O^UOY\]^^_ZW_aYRYPNT\`XP_^U[^Y	chr10.fa		4434378	R	36	118					
+HWUSI-EAS610	1	4	68	1245	1112	0	1	CAACACAGTGTCCACCACTTCTAAAGCAGAGAAGTC	`aW\bV]_``]a^_^_^_a]\_`aU^MZ\W`U]b_a	chr10.fa		4434973	F	36	119					
+HWUSI-EAS610	1	4	89	79	953	0	1	CACAGTGTCCACCACTTCTAAAGCAGAGAAGTCTGG	`\^O^[`V``__aaa\ZaU^ZZa__^S[OM[Q^X`\	chr10.fa		4434976	F	36	118					
+HWUSI-EAS610	1	4	14	1189	910	0	1	TTGGATATAACTGTTGAGACAGTAACATACTTGGCA	abaaababab]ababaab`aabaaa___```a_`[a	chr10.fa		4435049	F	36	119					
+HWUSI-EAS610	1	4	81	416	1508	0	1	ATACTCCTGATTTTGCCAAGTATGTTACTGTCTCAA	]]a__\_YT_V]_b_W^PN_H`X]ZW]Z_Z_U_JH`	chr10.fa		4435062	R	36	116					
+HWUSI-EAS610	1	4	13	156	919	0	1	TATGTGTTGGGACCTTTCTTGTTGGCACTTGATAAG	YY_^__]\_\Y^_`b``bb``Za`_``ba`Z^_a__	chr10.fa		4435137	R	36	119					
+HWUSI-EAS610	1	4	79	1726	1559	0	1	TGTCAGTTTTGATGTAATTTTGATTTTATTCTCTGA	\b[a`\``_VSYaaS\G[Va\^UWba`aaaW`^VZ^	chr10.fa		4435799	R	36	118					
+HWUSI-EAS610	1	4	20	155	1229	0	1	ATAGAGTCCTATGCGGTAATTCTAAAACTGAGGCTT	Y^a\LZZaa^aaba_bY^V_]aa^^V\`baS_^aaa	chr10.fa		4435848	F	36	118					
+HWUSI-EAS610	1	4	2	1231	255	0	1	TAATTCTAAAACTGAGGCTTAAAACACACAAGCTTA	a__aa__`]]\^`T_[`_`a^`___`]^[_^ZZ^__	chr10.fa		4435864	F	36	119					
+HWUSI-EAS610	1	4	51	1224	1137	0	1	GACAGAGCTAGAGAGAGACCTAAGACATATAGGAAA	a_^_`U]__\a]_^_V`W^_^]X^ZWX^]]X[UXZR	chr10.fa		4436131	F	36	119					
+HWUSI-EAS610	1	4	28	950	1600	0	1	AGAGCTAGAGAGAGACCTAAGACATATAGGAAATTG	`aa_a`aa``Zaa_L]aaaaa^`aaab`aa\`]_ab	chr10.fa		4436134	F	36	119					
+HWUSI-EAS610	1	4	54	1350	1481	0	1	AGGGTGGAAAGTTTTGTTTCCTGGGTAAACAAGTAC	`^b_R`_[]aa]a]^WZ^_```W^XN\_`U`V^YWY	chr10.fa		4436213	F	36	118					
+HWUSI-EAS610	1	4	16	1134	1543	0	1	GGAGGAAGTTATGTCTCTTCTGCCCAGTACACAGAC	]ba`babY`_^aVabb^]\][]J]^``^ba_I]\bU	chr10.fa		4436312	R	36	118					
+HWUSI-EAS610	1	4	36	145	1216	0	1	TCCTGTGGATTTTTAGTTATAGTGTATTAATCACCT	abbbb_bbabbbbb^b_aa]bb^b]baba\bbbba^	chr10.fa		4436603	R	9C26	80					
+HWUSI-EAS610	1	4	55	301	1536	0	1	GTCAGAATGAAGTAGTTCGTATGAGACAGGATTGGA	a``Y`_]^`]]___]]a`aZ[_Y]_\YV]_[`]Y\V	chr10.fa		4436682	F	36	119					
+HWUSI-EAS610	1	4	13	1407	1959	0	1	GTATTGTGACTCTTGGGAGTAGCAGTGGGAGCAGAG	aZ_aaaS\_]aW\`^^^^a\\]\Q`G_Z_WGZU^U^	chr10.fa		4436925	F	30C5	106					
+HWUSI-EAS610	1	4	67	1276	1191	0	1	GTGTCCTCTGGTCCCACTGCTACTCCCAAGAGTCAC	Q\]Q__]a[_ZU``WWXTHXOXJ[^_X`W_UaV`_T	chr10.fa		4436930	R	36	117					
+HWUSI-EAS610	1	4	80	295	35	0	1	ATAGGACAGCCAAATCTCTCACCATGCTGTGTGTCC	aa^aaaabaaaaaa`aaa`a``a``aaaa[a[^^^^	chr10.fa		4436960	R	36	119					
+HWUSI-EAS610	1	4	30	216	90	0	1	TGCTGAGTAGAGTTAGCTGTGCCTGAGAGCTAGAGA	abbaaYbS_]T_U`aaa_aS`b``aa^a`a`[\^aY	chr10.fa		4437057	F	36	119					
+HWUSI-EAS610	1	4	20	307	1077	0	1	TGGTGGAGGAGATTTATTGTAGGTACATAGGAGAGC	`bb`_b_ab\baab`aaaa_`b`O`baa`bb_b_aa	chr10.fa		4437204	F	36	119					
+HWUSI-EAS610	1	4	9	1482	121	0	1	AAGAGCTGGTAACTCACATCATGTAGCAAAAGTTTG	`T^`]`_TVV^XQUWaY__^]`R_W]]`^\\ZO_]]	chr10.fa		4438876	F	36	118					
+HWUSI-EAS610	1	4	83	143	904	0	1	GCAATACTGGAATCTAAAAAGGGCTTCATCCTCCTC	`]P\a]aaba`^aaaaRYLZaa`a`_a`aaa`aa`a	chr10.fa		4439369	R	36	118					
+HWUSI-EAS610	1	4	70	952	1636	0	1	GGGAATCGCCACTGCAATACTGGAATCTAAAAAGGG	aaa[W`_]UWVNUZRTU`[VVYVUPVQVPW]XYRUB	chr10.fa		4439382	R	36	113					
+HWUSI-EAS610	1	4	91	879	844	0	1	TATCTCCCTTTATCACCAAGGAGTGTCTGGAAGCCT	abaabaaaababbab_`aaaaa`Z`a__``__`Y__	chr10.fa		4439435	R	36	119					
+HWUSI-EAS610	1	4	98	183	1274	0	1	CAGAAAGCAATCAACAGAATAGCAAATACCTGAAAT	a^a__baaa`aa[a`a`Q_^]`aaaa_`a```[a__	chr10.fa		4439651	R	36	119					
+HWUSI-EAS610	1	4	48	1313	1894	0	1	NTACTGTGTCCACACATTGTTATACACTCAGAGGGC	DKYRVYTTULJQOPKRTTYVRXRMRUONUTTVXVWT	chr10.fa		4439921	F	C35	107					
+HWUSI-EAS610	1	4	76	1536	1317	0	1	CTTGCAAGCACAGTATTGTCTGCCTCACCTCCAGGT	\Z`\`____`]`___baa_bbab]^\aaaa`]_ab^	chr10.fa		4440562	R	36	119					
+HWUSI-EAS610	1	4	25	910	231	0	1	ATGGGACTTTGGCTCTAAGCTCCATGGTGCAAGTTT	U_^\_\a^`ab]S]]]^Z\ZUU[PZ^ZG][\]ULXY	chr10.fa		4440917	F	36	117					
+HWUSI-EAS610	1	4	15	52	613	0	1	TTCCCAAAAGGTGAGGACAGGCAAGGGAGTTTAGAA	abbbabbaabaUbaaaa_[[aWX]RaYD\MY_a_`a	chr10.fa		4440974	F	36	116					
+HWUSI-EAS610	1	4	45	985	1007	0	1	AACTGCAAGGAGTGAGACTCATATACCTCAAATAAA	aaa\`ab[_bT^WaXa^Y^^ab`aYaW[`a^aa`aa	chr10.fa		4441165	R	36	119					
+HWUSI-EAS610	1	4	56	976	1281	0	1	TTCTTGCATTTGCCTGCCAAACCTGGCTCCAAGTGC	abaaaaRUaa__]^[OT\_`_^PZ[MXV^\__XWa\	chr10.fa		4442005	F	20G15	82					
+HWUSI-EAS610	1	4	94	1072	119	0	1	TAACGCATATTGAGGAGAGAGGAGAGGGATTCGATT	aaa_a``a_baaWYa^^^a_a^Z__^_V\]^]_Z``	chr10.fa		4442177	F	36	119					
+HWUSI-EAS610	1	4	61	1142	1596	0	1	AGGGCATATACAGAAAAAACAGAATTGCTTTATCTT	aab`aaaaaaaaaaa`aaaab`b_`a__a`aaa_aa	chr10.fa		4442496	F	36	119					
+HWUSI-EAS610	1	4	35	1661	257	0	1	ATTGGTGTAGAGAAGATACCACAAGCACTCTATCAC	aab\YL\^_a_[_^^``a__\NZ[WXVYYWV\Y_][	chr10.fa		4442683	F	36	118					
+HWUSI-EAS610	1	4	81	1146	1475	0	1	TTTGTGGTGAGTGGGGAGATCTGACAGCTTTCACTC	aa`aYa[U`Y\V[SZUW`\WU[WPYY^SW^WUWWQW	chr10.fa		4443333	F	36	44					
+HWUSI-EAS610	1	4	56	1620	428	0	1	TAAAGTTCTACATGTCCATTTGTGGAGGAGTATACA	`a_bKa__^bba`]`aaSa`a`HPQGR\\]W^\a`Y	chr10.fa		4443693	R	36	22					
+HWUSI-EAS610	1	4	52	1682	662	0	1	TACAAATCAGCCCTGAATAAATTCTCATCCTAACCT	aa__`_``a`\XW]U_b`^Z`_[Xa\^a`__aa__a	chr10.fa		4443971	F	16G19	27					
+HWUSI-EAS610	1	4	30	1538	1769	0	1	AAGCAAGAGAAAAACAAAAGTGCATAGAAGTTCTAA	G]bbbabbbbbbaababbbbb`^`abbabbbaabba	chr10.fa		4444283	R	G35	38					
+HWUSI-EAS610	1	4	74	1080	1370	0	1	TTTGCCTAAGGTCAGACATTAACCATTAGATCTGAT	`_aaaWa_a]_NZ[`[X]``aa\^`a`[\W_T\^Z^	chr10.fa		4444463	R	36	37					
+HWUSI-EAS610	1	4	80	169	58	0	1	AGAGACTGTAAGCATGTCACTTGGCTGTTTTTATCT	aaaa]`aa_X\a``UXRXX]_]a``Z`GHT`]XYBB	chr10.fa		4444673	F	35A	106					
+HWUSI-EAS610	1	4	37	338	1287	0	1	AAAGGGTAAAGTTTGAAAGCATCAGCAACAAAATTA	aYGZ]WUSVYRU]]SU[YW]W]]X[XZ]^]YYYVZ\	chr10.fa		4445347	F	36	117					
+HWUSI-EAS610	1	4	17	209	142	0	1	CAGCATAATATGGTTGCCAGGGGAAAAGGATAGCAC	a_a]Zaa``[]aa^`aaa_a_a_^_a`aa__a`\\Y	chr10.fa		4445534	F	36	119					
+HWUSI-EAS610	1	4	96	1586	339	0	1	TGTCTTGTTTGGTGTTTCCCTAAAAATACTTATTTT	`[``a`[]`_Ta^a[O]_]^`a`\U___^\^_`^__	chr10.fa		4446143	R	36	119					
+HWUSI-EAS610	1	4	35	739	1552	0	1	TGCAGTTAACTGAACAGAACAAAGTGTGACTTATTC	`aa^b]bab_aaaa\aa``]`^`a^`\_`\__``_`	chr10.fa		4446959	F	36	119					
+HWUSI-EAS610	1	4	97	441	377	0	1	TATCACTTCCTATTACAGAAAAAAGAGCAAAATGCC	[aP`UHSaaaPba`aa`baV\`ba_baabb\b`a_]	chr10.fa		4447654	F	36	118					
+HWUSI-EAS610	1	4	26	1733	987	0	1	AGTTTCTGGGTTACTCTTGTGTAGCTGGTACTCCTC	a``abaa_`V^aa_baab`_`^a`_a_^U_Z^]_a_	chr10.fa		4447978	R	36	119					
+HWUSI-EAS610	1	4	4	1126	448	0	1	ACCAAGTTCAGCGAAACTTGCTTCCATGCTCAACTG	a`aaaa^`]aa_`^^`]^Za`_a^]Z__\__^]^a_	chr10.fa		4448064	R	36	119					
+HWUSI-EAS610	1	4	15	1034	1148	0	1	TGGAAGCAAGTTTCGCTGAACTTGGTAGGAATGGTT	ab`^__`_`_X]_^_]^^^`]``^_RZa]M^]X^W^	chr10.fa		4448074	F	36	119					
+HWUSI-EAS610	1	4	79	1500	501	0	1	GAAAAACATGGCAGTATTTTCACATAAATCCAAAAA	abbbaaaaaZ\a`^MPZ``^HMTUUV_]J[WHW]``	chr10.fa		4448993	F	36	116					
+HWUSI-EAS610	1	4	77	1518	1368	0	1	GACTAGCAATCTAACTTCAGTATCTGGAATCTGCAT	a_PSaa_a`YPT[a[XYYS]^]^U`][]\a^a`R[`	chr10.fa		4449129	F	36	118					
+HWUSI-EAS610	1	4	22	552	788	0	1	CATGTGTGTGTTATATGTGTGTGCGTATGCATGTGT	^]aaababbbabbbabbaa_aababababaaabaa`	chr10.fa		4449208	R	36	119					
+HWUSI-EAS610	1	4	91	1021	1607	0	1	ATATTTTTGTGTGCATGTGTGTGTTATATGTGTGTG	aaaaaaabb_a^a``bb_b_a]a`_aa`aaZ_]a^a	chr10.fa		4449221	R	G35	81					
+HWUSI-EAS610	1	4	63	506	1806	0	1	TGTGCACACGCATGCGTTCATGCATTCCTGTGTGCA	aaabbbbbab_P[bbb_ababab`bba`ba_b^baW	chr10.fa		4449274	R	36	119					
+HWUSI-EAS610	1	4	69	1477	1519	0	1	TGGTACGGGCAGAGTGCTGGCTTCCTGTAAAATACA	abaSb_R\`]^`_\W^T`_a]Y_Y][\YUV\\W\_W	chr10.fa		4449787	F	36	119					
+HWUSI-EAS610	1	4	65	456	1308	0	1	CCTGTAAAATACATGCAACATTTTTCTTCCCTTCTT	aaaaa_aabbaaaaaabaa`aaaaaXaa`a`a_^a`	chr10.fa		4449810	F	36	119					
+HWUSI-EAS610	1	4	28	708	1629	0	1	ATGCTAGACAATAGCTTGTTTCTGTTCTTCTTATTT	abbaaabaaaabaaaaab_aaaaa_a`aaababaaa	chr10.fa		4449858	F	36	119					
+HWUSI-EAS610	1	4	16	663	1661	0	1	AGTAGACAAGGTCTAGTCAAACTAATACCCAGGTGA	_aabababbba_aaab^babbaaabab`a`aaaZ_^	chr10.fa		4450818	R	36	119					
+HWUSI-EAS610	1	4	75	594	849	0	1	TTCAAAGTAGACAAGGTCTAGTCAAACTAATACCCA	a`aaa^a]`aa_a^`a]a`^_]W^^`]____^Y_^_	chr10.fa		4450823	R	36	119					
+HWUSI-EAS610	1	4	85	1357	97	0	1	TACGTTCATAACTCACTGGGGGCACCAAACACTACC	`aaaZ`Z__a`\_\`W`SZUSZ__YWY^]W]WZ^W_	chr10.fa		4450882	F	11A24	86					
+HWUSI-EAS610	1	4	93	706	1918	0	1	TTGCTCCAGGATGTTATAGCATTATAGCATGCTAGG	a``_a]aaab^aZ_]^^Y\`_`a__^``]]aa\`^]	chr10.fa		4451016	R	36	119					
+HWUSI-EAS610	1	4	48	1448	334	0	1	AAATCCCTGGAACTGAGTTAGAGTCTGTGGTGGGCC	aa_^b_^aa^[`[ZZ^_T`X^]XRY_\LW[LMYVQT	chr10.fa		4451464	R	36	118					
+HWUSI-EAS610	1	4	44	1083	201	0	1	CAACACTGAGTTAAAACAGACATAGCAGCCAGGCTG	a\_\]_^`\b_aaa`a`aa]`Y_][__a^V_`WV]b	chr10.fa		4451746	F	9C26	80					
+HWUSI-EAS610	1	4	27	1002	344	0	1	CAGGCACTGGTTAGTTCATAATGTTGTTCCACCTAT	aabaaa`aab_]_a`a`_a^aaa_a]_`_\UY]a_`	chr10.fa		4452296	F	36	11					
+HWUSI-EAS610	1	4	44	1289	512	0	1	TGATGTTGGCTAGTGGTTTGCTGTAGATTTCTTTTA	a`]``^__^^_][Xa][^a`W__]^]]^`^[_]_^^	chr10.fa		4454628	F	36	8					
+HWUSI-EAS610	1	4	67	1601	1444	0	1	TGCTGACACCCGCAAGCTACCCACAGGACCTACCAC	`a]`\``_Q]^`Z^`\]`_\\\^]a\Z^ZZ^\ZR\Q	chr10.fa		4458143	R	36	42					
+HWUSI-EAS610	1	4	51	528	1791	0	1	AAATAATTCTTCTAATTGCACCATTTCCCAGAATGC	aa`aaaa``a_aaa`a``aa_`aaa`]Xaaa]_^_`	chr10.fa		4459367	F	36	119					
+HWUSI-EAS610	1	4	87	332	1984	0	1	AAGCCTTGCTCCTTGACGATGCCTGCATTACATAAT	`a`baa`bb``a]]_`a``W]a`X\a_ZV\^]Y]Y]	chr10.fa		4460291	F	36	119					
+HWUSI-EAS610	1	4	91	463	324	0	1	GATCCTTAGTGTAAAGAACCAGCAATCCAAGACCAC	aaa``aaaa]b^aaaaaa`_aa```___a_`_^__[	chr10.fa		4460498	R	36	119					
+HWUSI-EAS610	1	4	55	435	804	0	1	GAACCCATGTGAGAAAGGTAATTAAAGGTTAAATAC	abaaba`baa`_a`aaaaY\Y`aaa`aa[a``^a__	chr10.fa		4460677	R	36	119					
+HWUSI-EAS610	1	4	43	236	1422	0	1	GAAGAGACAACTGGATGTGTGGTGAGGATCCTGGAA	Z]X^]_aaZab^\_XR_[XL_]JXW_Z]]_]]X_NU	chr10.fa		4460710	R	11C24	83					
+HWUSI-EAS610	1	4	34	1352	1668	0	1	AACATTCAGACCTGGAACCAAAGAAGACATGAGGTG	aa_a`a`_a_^[`_aaaW_____`^__XX`a^`_Wa	chr10.fa		4461042	F	36	119					
+HWUSI-EAS610	1	4	26	1434	1481	0	1	CCCATAAAACAGGACACAGGATAGACTTAGCAGCTC	aabaa`baa``V`a_aa`aaa[`X__`a\\\`_^_a	chr10.fa		4461261	R	9G26	82					
+HWUSI-EAS610	1	4	85	1730	747	0	1	AAGTGTCCCAGGTATCCCAGTCAGTCATGCTTCCAG	_aaW^^bbbbYWYbaba_aWP`ba_\b^W``]X`]a	chr10.fa		4461328	R	36	119					
+HWUSI-EAS610	1	4	15	1088	324	0	1	TAATTCATACTTGAATATCTTGTGCATTCCTCAGGA	`ba^a`[aaa^`_aaaaaaaba\L^a`_Y\^^_^a_	chr10.fa		4461378	R	11CA19G3	11					
+HWUSI-EAS610	1	4	85	926	2020	0	1	GGAGTTATGCAAATTGTGTCTGTTGACCCATATAAT	]a\_WY_^[^aXa^^_XY`^ZZS]OI]YTOY_Yaaa	chr10.fa		4461410	R	15A20	82					
+HWUSI-EAS610	1	4	91	964	1908	0	1	ATTTATGGAAAATAGTATTCACACAATATATTCTGA	^`]ab\YT[Xbaa\bIRRSX_a`IJba_Y^UWSaVQ	chr10.fa		4461843	F	16T19	94					
+HWUSI-EAS610	1	4	31	1057	1865	0	1	TTCTGGTTTAGGGATGTGGGCATGTGTTCATGTTCT	aaab`ZR[_W]S]R[ZOOTOOO]\YXRYNN__U[X[	chr10.fa		4462437	F	36	117					
+HWUSI-EAS610	1	4	43	630	957	0	1	CACTCATGATGTTTAGATGTCTACATCAAATTTCTC	a_aba`aa_aa`aaaaaaa^aa```a`aaaaaaaaa	chr10.fa		4462660	R	36	119					
+HWUSI-EAS610	1	4	28	75	1160	0	1	CGCATATATCCATCCATCCATCCATCATTCATCTAT	aa^L]__V``_]_a`]a^a^]aa__a_`aa^_ba``	chr10.fa		4462793	R	36	119					
+HWUSI-EAS610	1	4	41	1252	627	0	1	TAAGACTTGTTCTTGCATGACAGAATGTTTTTCATC	abaa``aab_`_`aa`_a``\`a^_`_\_```^]`_	chr10.fa		4462844	F	36	119					
+HWUSI-EAS610	1	4	98	744	1378	0	1	TGTATTTGCTAGAAAAACTTTTAAAAATACAAATAT	ab^`aa````aZX``aXa`a_aaaa`^Ga]aaVaaa	chr10.fa		4462887	R	27C8	107					
+HWUSI-EAS610	1	4	59	1746	953	0	1	CCAGATTCAGCTGGCTAGCAAATCTATCTATATTGG	ab_P^aaaaV]`X``abaaaaaa`a_aaaaa^aa_Z	chr10.fa		4463553	F	36	119					
+HWUSI-EAS610	1	4	19	1090	57	0	1	GGTGTTTCACTGAGGAAACCCTCTCTGATGAATAAA	a_a^abbababbabb__a_aaaabaa``a[aaaaaa	chr10.fa		4463596	F	21A14	81					
+HWUSI-EAS610	1	4	68	1727	1508	0	1	GTAGGTAAGAAGGGGAGAGGAAGGTGAGAGAGAGAC	a_``aVa\a___aaa``Yaa^O`[WV^[[\X[^[SV	chr10.fa		4463791	F	36	119					
+HWUSI-EAS610	1	4	6	1113	196	0	1	AGGTGAGAGAGAGACAGAGACACAGACACAGAGAGT	abbZbaaa`aaaaaaaaaaaaaaaa`a`\aa_aZaU	chr10.fa		4463812	F	36	57					
+HWUSI-EAS610	1	4	18	408	1078	0	1	CACATCTCCTACAGATCTTACAAAGCAGACTATGCA	aaabbbbababaa`_aaaaaaa]aaaaa_aa`aa_[	chr10.fa		4463985	F	36	119					
+HWUSI-EAS610	1	4	78	1460	915	0	1	TCATTGATCAAATGTCTCATTAACAAACCAGTCTAC	a_Xaa`[_`__]\]^_a\^aa``_`WaRZY]]_^_^	chr10.fa		4464045	R	36	119					
+HWUSI-EAS610	1	4	83	1155	301	0	1	TGACCCTAGGACATAAAAGCAATTTCTCTTCACATG	a^aa``]Z_\W__a_U]_\[a[_a`]`^``___``a	chr10.fa		4464097	F	36	119					
+HWUSI-EAS610	1	4	92	1767	1889	0	1	GAATAATTGAAGCCTATGACTTAGTGGGGTCATAAT	\Y^^Z_a__`T`YX]\]a^NXZ`aU`_a`QNV_[a_	chr10.fa		4464379	F	36	118					
+HWUSI-EAS610	1	4	69	1256	217	0	1	AGCCTCTTGAACCTCCATTTTCCCAGAAGAGCCCCC	aZb_ab[a_aWa````^ab_[`]]]OS^aa]XP]`S	chr10.fa		4464519	F	36	118					
+HWUSI-EAS610	1	4	4	466	1299	0	1	TGGAGGCAAGACCTGATGCAGAGGCCACAGAGGGGT	`aaaaaaaaa_a`aaa_aa_a]aaaTG]_a_aaa`W	chr10.fa		4464842	F	36	19					
+HWUSI-EAS610	1	4	81	1569	668	0	1	CAATCACCAATTAAGAAAACAGGTTTGCCAACAGCC	abbbbb`aabbbbbaa`aaa`baZab`ab__``Y`a	chr10.fa		4464987	F	36	119					
+HWUSI-EAS610	1	4	12	49	1739	0	1	ACCCACTGCTGCATACAGCAGACTGGCAGGCCCAAA	]^_aXEYbZaa^a_Za^SZX`R^a``BBBBBBBBBB	chr10.fa		4465455	R	27T6T1	69					
+HWUSI-EAS610	1	4	1	1056	808	0	1	CAGAACAACCTTAGGTGCTGGTCCTTGTGCTCTATC	aY_`b^_a[``aba\Raabbaaa`_ab^aHTT_a`Z	chr10.fa		4465511	R	36	118					
+HWUSI-EAS610	1	4	53	1764	23	0	1	ACAAGGACCAGCACCTAAGGTTGTTCTGTGACCTCC	aaaaXYaaaaV`a__a__MT\_\[_[\XWT\W\[V_	chr10.fa		4465519	F	36	118					
+HWUSI-EAS610	1	4	93	664	1798	0	1	TGCAGATATGGATACACATATCATTGCATGCACATG	`Za_]]T_Y\XS^U[^aa`^_]Z[`a[XDUXXaYG[	chr10.fa		4465554	R	36	115					
+HWUSI-EAS610	1	4	32	1676	1406	0	1	GTGTTCATGCAGATATGGATACACATATCATTGCAT	aabaa__a_aW`a`a^^^`]a`^ZZZ[^T\X]T\\V	chr10.fa		4465561	R	36	119					
+HWUSI-EAS610	1	4	6	1602	451	0	1	GAAGTATGCCACTGTGCTGGCTCTTTATTTTGTAGT	[W^ZVGTXXDJKMMZ_^[BBBBBBBBBBBBBBBBBB	chr10.fa		4465786	R	30G5	34					
+HWUSI-EAS610	1	4	58	1111	1269	0	1	TGCTAGTCTATGCTTTTGACATGACTGTCATAACAT	aa_aaa__a``\]aaaaaa[```a]`ZZ]^^^`X_`	chr10.fa		4465960	R	36	119					
+HWUSI-EAS610	1	4	81	1411	1474	0	1	AACACAATCCATTAACTTTTGACCCATATTGACGAA	abab`aaaaaaaaaa`aabaa```_aa`a`^``a`[	chr10.fa		4466035	R	36	119					
+HWUSI-EAS610	1	4	85	242	1181	0	1	CAAGGATTTACAGTGGGTGGGAAACAACTCAGACTC	a][Z`\`]___Pa_aa\HZ`a\[aa]V\_`_\T\]_	chr10.fa		4466579	F	36	118					
+HWUSI-EAS610	1	4	11	1184	397	0	1	TGTGGGCTCAGAGAAGCTGTCATCCAAGGCCACTCA	a`\aaaW[XXa\Z]Y`]YU^QRX^\[XPY]TY[T^\	chr10.fa		4466672	R	36	118					
+HWUSI-EAS610	1	4	99	784	590	0	1	TTAGTGTGGGCTCAGAGAAGCTGTCATCCAAGGNCA	ab_a\a`aa`]a__a]a``a_`a\^`^___`^WDZ_	chr10.fa		4466676	R	33C2	110					
+HWUSI-EAS610	1	4	43	52	1706	0	1	AAGTAGCTTAGTGACCCACCACGGCAGAACCCAACC	IXa`bbbbaX``abbbbab_X`aabaaaaaba^aaa	chr10.fa		4466755	F	36	118					
+HWUSI-EAS610	1	4	84	881	1352	0	1	ATCAGAGACATAAACTTGAGAATTGACGATGTGCAT	^`bbbbbbbbaaaa`bbaab\`b`_`abaab_aaaa	chr10.fa		4467529	F	36	119					
+HWUSI-EAS610	1	4	57	1262	878	0	1	AAGTGTCTCAGAGAGGCCTGCCTCTTCCTCCCAAGT	\]`_U]b]^^Va`_]]HP]Xa]NVLF\\^PQYJYY\	chr10.fa		4467598	F	25G10	106					
+HWUSI-EAS610	1	4	66	1091	704	0	1	ANTAAAACCCAGTGCTGCTGGGCATAGTGACTCATG	ND[SSU`aa_aUV_U^a^PYW\XZ^P`O^JRaYa`a	chr10.fa		4467648	R	1A34	109					
+HWUSI-EAS610	1	4	64	708	142	0	1	CTCAAAAATAAAATGAATATGAACAGTTATATTCTG	_bbaaa^_baaaaabbbbaaa^baa`X^_a`b^_bb	chr10.fa		4467760	F	36	119					
+HWUSI-EAS610	1	4	99	1261	266	0	1	GAAGAGAAAGCAGATGACACAACTGTTACTTGTAGT	aaaaaa`aaaaa_`a`\````a_``]_ZY_a`__]B	chr10.fa		4467830	R	23G12	78					
+HWUSI-EAS610	1	4	11	553	1844	0	1	GGCAGTGCTCACTCACAAAGTAGGGAACTGAGCACC	`````\_\Z_``a__aa^U^\Z_`^aa`a\Z_````	chr10.fa		4468088	R	36	119					
+HWUSI-EAS610	1	4	81	1461	193	0	1	GAGGGACAGAGCTCCTGAGATGCCTTCTGTTCTGTG	T^a_W`_]__aa_]aW\ZSaaaSS_a]^\GG_aXYX	chr10.fa		4468262	R	29GG5	95					
+HWUSI-EAS610	1	4	28	114	210	0	1	CAGCCCAGAAGGCATCTCAGGAGCTCTGTCCCTCAA	aabbbbbbbababaabaabbbaabaa`a\bab_a^Q	chr10.fa		4468264	F	36	119					
+HWUSI-EAS610	1	4	67	528	1818	0	1	AAACACTCAGTAGGTGGCAGCAGGAAGGATCTCTAT	abaaba`a`a_aab^ba``aaaa_aa_aa``__a`a	chr10.fa		4468817	R	36	119					
+HWUSI-EAS610	1	4	48	1035	1673	0	1	AACCAAGCCTCATACTGATGGGCATCTGGGTTCCTT	aa_``aa\Z`_^_`_a__Za_\Z^^Q\_^WT_\W__	chr10.fa		4469166	F	36	119					
+HWUSI-EAS610	1	4	90	1216	1873	0	1	TTCACTGAGACGAAGGATTGGAAGGAACCCAGATGC	ab```aa_a``aaaa`Za`a``_a_ZaV^W[[_W__	chr10.fa		4469187	R	36	119					
+HWUSI-EAS610	1	4	55	1412	1417	0	1	GCATTGTGTGACTGGACTGAGCTGATTCACACTTAC	a`a_a^V_UTYU`__ZF^`]_U]]XX]XUU\UWW]]	chr10.fa		4469227	F	36	117					
+HWUSI-EAS610	1	4	94	180	63	0	1	GATCCTTTGATACAGCCAATCCCACCTCCAGGAATC	^JVS\ZURPSSa__WQ``Y[[VXR^YU[H^WPLSYU	chr10.fa		4469287	R	36	117					
+HWUSI-EAS610	1	4	6	1643	370	0	1	GCAAGAATCAAGATTCTGACAACACACCCTTAAAAA	^_bbaaaaaaa_a```^V``bb_a__W[R`_a]a_a	chr10.fa		4469409	R	31T4	81					
+HWUSI-EAS610	1	4	45	18	1466	0	1	GGGGTTGCTTCTCTTCTTTTCACTGGGTAGGACCCA	a`Xb^Xa`W[^ZUPZ]`^_a_MSSa`\W]a]SVUYB	chr10.fa		4469602	F	36	114					
+HWUSI-EAS610	1	4	78	1093	1826	0	1	TTTTGCCCGCCATCAAAACTCAAAAGCTGCCCTGGG	abb`b_^Z`]_]a_a`_a]a`_\MPVZ^_^UU_[\[	chr10.fa		4469879	F	8A27	82					
+HWUSI-EAS610	1	4	98	1651	926	0	1	TTGAGGAAGTAGAGGCAAGAGACTCAGGAGTTCAAG	aaaa__]a`Y^RZXY_aa`_]_^_]`\^Y^XYY_^\	chr10.fa		4470158	F	36	119					
+HWUSI-EAS610	1	4	14	833	1674	0	1	GGTACACATGCCATACTNAACAGGTGGCCAGAAGAT	Z]]`]]^aYY\\XX^^[DT__]^]ZXNYSZ]]X\WB	chr10.fa		4471541	R	17GC17	81					
+HWUSI-EAS610	1	4	14	1567	1705	0	1	GTCTGGCTTCCAGTTGTTAAAACAGCAACGTGTGCT	a_`_`a____Z]aT]\FO__Z`_Q_Q_XRUGWLQVU	chr10.fa		4472370	F	11T16T7	59					
+HWUSI-EAS610	1	4	60	1208	771	0	1	TACTCAGCTTGCTTCTAACAACCTGTGACACTGCCA	abbaaaa^a`]]`aa[ba[aaaX``a_a^W]ZQ\a_	chr10.fa		4472494	F	31C4	88					
+HWUSI-EAS610	1	4	50	1539	649	0	1	GGTTTTGCATAAATCAAAAGGTCACCATGGGCCCAG	aa[aaaXaaa```aa^``^aVV]`__^^ULY]__`Z	chr10.fa		4472868	F	36	118					
+HWUSI-EAS610	1	4	13	1161	1281	0	1	GTTTTATTCTGCAACCAGCCATAAAACAAGACTTGG	`X^_`__^^_^__^VOZS\VZZZ]^SSZUWISSNR\	chr10.fa		4474145	R	36	117					
+HWUSI-EAS610	1	4	55	1579	239	0	1	GGAACTATGAGCATTTTCCAGTGTGGAGGAGCTCTG	`[baaM`abaaaaba`aa`bZa[]TX_a[_``_aaa	chr10.fa		4474507	R	11T24	81					
+HWUSI-EAS610	1	4	18	1257	987	0	1	TAGTTCCTCACCATCCAAGAAAAGAGTGGGGATGTG	aaa^`_`a_a_^`^`]``a__^_`^_W]Z[_^_]]`	chr10.fa		4474536	F	36	119					
+HWUSI-EAS610	1	4	15	1512	1469	0	1	AATGGCACATCCCCACTCTTTTCTTGGATGGTGAGG	X]ZaaPa]YXV^``a[XO[T___`QTXUVWVFXU[X	chr10.fa		4474541	R	36	117					
+HWUSI-EAS610	1	4	75	1162	541	0	1	GGAGCAGAGGGCAGTGGCTGTCAGACGCTGTTGTTT	a`abaa`]`^_`_]`aaaBBBBBBBBBBBBBBBBBB	chr10.fa		4474674	R	31GC2G	34					
+HWUSI-EAS610	1	4	48	800	688	0	1	TATGTAAAATCAGCTCTAAAGGATTTATACATCGTT	``Z_\]aaa`_a`\a\aaa]YWa`aaab]U``W`_T	chr10.fa		4474925	R	6C21G7	47					
+HWUSI-EAS610	1	4	14	1042	1354	0	1	TGGGCTTCTGAAAGCTACTCATTGTCTGATCACATC	__``[babbb^a^``ba^]X_`]a]aa^aY_aa`^`	chr10.fa		4474971	F	C2A32	46					
+HWUSI-EAS610	1	4	72	838	1365	0	1	GAGAGCATGCCAAAGCAGAGCTGGTGCTGTAGACTG	^_aa_a^a`_]`[`]_a`]a__`a^``aaYJ\`Z]]	chr10.fa		4475081	F	36	118					
+HWUSI-EAS610	1	4	29	118	672	0	1	AAAGGATACTGTATTGAATGCTCACATTCAGGGATA	X_^a`Q`_a^b_Y]]a`_aaa]b^a^aa^Zaa_MY`	chr10.fa		4475129	F	11C20A3	47					
+HWUSI-EAS610	1	4	44	758	184	0	1	TGGAGGTCAGAACGTTACCACTATGGGAAACTATCC	aab``aY[`aaa^^___^_`_`_^^^\U]_]`^^^^	chr10.fa		4475217	R	36	119					
+HWUSI-EAS610	1	4	55	76	807	0	1	TACTGAAATGCCCGTGTCGTACAGGTGAGTGTCCCC	a_`bbaaabbbbbb_a_ba[`a`abVb]a\\]aaba	chr10.fa		4475492	F	36	119					
+HWUSI-EAS610	1	4	36	998	89	0	1	AAACACATTGCCTTCATAAACAAAGTAGAACGTTCC	aaba_Y]^W]U\`a_`bba`[YXa_OZSY_Za]`\X	chr10.fa		4475939	R	36	119					
+HWUSI-EAS610	1	4	86	791	506	0	1	AAACACATTGCCTTCATAAACAAAGTAGAACGTTCC	aaa`a^^```^`a``aaaZ```^`_\`__a]a]`^_	chr10.fa		4475939	R	36	119					
+HWUSI-EAS610	1	4	90	663	282	0	1	ATAGAACCCCAGGCATAGTGTCTAACTCACGCCTGT	aa_a^\aaa_ZU^aa[_]R^R`a`_^XX^[RPWP\_	chr10.fa		4476063	R	19T3C12	47					
+HWUSI-EAS610	1	4	99	1425	1807	0	1	AAGCCAAGCAACCCAGAAATGCTATTTTGTCTAACT	`b_a_aaa[a`__[`a_`aT`^ZW_____^^a^`RV	chr10.fa		4476338	F	36	119					
+HWUSI-EAS610	1	4	82	1301	731	0	1	AGGTCATAGAGCAAGCAAGAATGTCAAAATAGCTGG	`^^aa`bb```a[_ba`a\^^baX`a_YM[aba``b	chr10.fa		4476529	F	21C2T11	43					
+HWUSI-EAS610	1	4	75	1113	1083	0	1	GTTAGAAAGACATGCTGACCTAGCTGAAGCAGAGGA	a^ZZ^[FV``^`[`SVYT_aa[_Y_a[`ZYY`^]a]	chr10.fa		4477860	F	36	117					
+HWUSI-EAS610	1	4	68	926	700	0	1	AGTACCTTTTGGAGGCCGGACACTGAGTCAGTAAGG	abO^``aaba`a_a`Zaa__^a\````\Z_a^[[[a	chr10.fa		4478045	F	36	119					
+HWUSI-EAS610	1	4	97	216	1659	0	1	GATCATTGTGGTCATCTTGTCATGTATAGGGGAGGC	a`[`__``_baJ`a^___]PZ]__[\W___]\X_]]	chr10.fa		4478094	R	36	118					
+HWUSI-EAS610	1	4	99	1172	310	0	1	CGAGGCCCGAGTGACTCATCATCATATCCACAAGCA	abQRGaU_a_aR^WSX[_aa^\\``^\QJV[`WaN\	chr10.fa		4478156	R	4T21C9	73					
+HWUSI-EAS610	1	4	43	1490	1123	0	1	AGTTGGCTCTTTTCCTTGCACTTCCACGCTGTAATT	ab]_]\aa_babb`_`aa``]aa^^_\[]ab^_^ab	chr10.fa		4478212	R	36	119					
+HWUSI-EAS610	1	4	84	487	1999	0	1	AGTACATCAACATACCAGCATCACTGTGGGGGTTAA	_Y\b_a^aabab`ba]]_aaaaaaaa_a`a`_^]^W	chr10.fa		4478518	R	25C10	81					
+HWUSI-EAS610	1	4	74	959	104	0	1	GTTACTTAGCACTCGTTTGTGGCAGTTTTCTCACTG	`abaaaaaa_`^`]a_aba``[BBBBBBBBBBBBBB	chr10.fa		4478575	R	10G17C7	19					
+HWUSI-EAS610	1	4	52	520	1312	0	1	CACTTCAGCGTGCTATTGAACCTGGCTAGATCTAGT	aY`a`a_X_a^```a`^_a_aa_```a^^^_^^^^^	chr10.fa		4478690	F	13C22	82					
+HWUSI-EAS610	1	4	88	1176	1402	0	1	AAGGCTAGAAGCACAAGGCCCTCTGGGTATGGCAGG	_`X]`a```a_^a`aa`^^\^a``]ZUS_^`^^```	chr10.fa		4478733	R	2C30G2	53					
+HWUSI-EAS610	1	4	51	580	38	0	1	GCCTCTCACACTCACATACACAGTCACATACAGAGA	aaaaaaaa`_`a`a_aaaaa``a]_a_a``a``^``	chr10.fa		4479135	F	29T6	82					
+HWUSI-EAS610	1	4	5	101	1801	0	1	ATCGTGCCGATTTTCCTTCTGTATGTGCTGATAGAT	a_ba_`bbaZ`a`_ba`_a_`X^`_\`]]_[`a^_]	chr10.fa		4480083	F	33A1C	50					
+HWUSI-EAS610	1	4	89	1521	267	0	1	TGCATGATGACCAACCTACATATCTATTGTCTTCTA	aaaba]aaa^aa`a`aab`babbaaa_S[__ab`ab	chr10.fa		4480828	F	33T2	82					
+HWUSI-EAS610	1	4	64	1626	754	0	1	GCTCTGTATAATGTTTGACTNTGGGTCTTTGTATCT	aY_aaa_`a`__XX`a_a^VDRZWTW^^^^SV]][^	chr10.fa		4480893	R	20G15	110					
+HWUSI-EAS610	1	4	35	532	682	0	1	CAACATGGCCAGGTTCTGATGAACTAATGATTNCTA	a]````aaaaaa`Y__a_Y_a_____`_`ZZYDX^^	chr10.fa		4482075	F	32T3	110					
+HWUSI-EAS610	1	4	41	1754	1266	0	1	GTCTCTACTGTGATGGTACTAAAAGGTAAGGCTTTT	aaZZ_V^]^SW]``__aPZaba`\XLMaaaXaYY`]	chr10.fa		4482217	R	36	118					
+HWUSI-EAS610	1	4	74	806	1649	0	1	CTGGTATTCTGGGATAATGCGATGGAATAAGTTAAG	abbWV[aa__U_aa_XTYaa]V[aa]_a__^GXL\a	chr10.fa		4482332	R	13G22	80					
+HWUSI-EAS610	1	4	19	1219	1425	0	1	ATGCTTTGGGCCTTGCCATTCTAGAGTCTGGAGAAT	`aaabb``W^_]aaa__`^a[aa__`]___aV`]Xa	chr10.fa		4482394	F	36	119					
+HWUSI-EAS610	1	4	93	752	17	0	1	AGTAAGCACATGTTGGGCCCTAACTTCTAATTCTCC	`\_`aT^a]ab_]`\I`a[`ba]_V`Ya__a^Z]b[	chr10.fa		4482423	R	36	118					
+HWUSI-EAS610	1	4	23	1594	1929	0	1	GCAGTAGTGGAAACCCCTATGAGCCATTGGCTCGTG	a`a`^\_]a__]aY^ZX\^]^]^SS\S^USVUU\U\	chr10.fa		4482637	R	36	118					
+HWUSI-EAS610	1	4	44	438	1821	0	1	CAATCAGGAGGAGGGGACACTGTCCTTCCCTGGAAA	aaaaa`aaaa^a]\^]`^^_`a^`a_^`]\\Y[W[[	chr10.fa		4482822	R	36	119					
+HWUSI-EAS610	1	4	76	1419	1267	0	1	GTAAATTTAAGACTACATCAATCAGGAGGAGGGGAC	aa`aaaaa_`___abaaa^___]a[_]`QY][ZV`^	chr10.fa		4482840	R	36	119					
+HWUSI-EAS610	1	4	60	288	1558	0	1	TGCCGTGGCTCCCTCCCTCTGACTTTGTTTGCTTCT	aab`aab`a]`aa`aaa]aaa\aabbZ\a\Z\a`a]	chr10.fa		4482972	F	36	119					
+HWUSI-EAS610	1	4	86	1421	987	0	1	TATGGAAAGCATTATTTTCTTCCCTGGTACCACGCC	aaab`_aa``a^]Y]a`_^^_^___]YP`]]`^___	chr10.fa		4483137	F	36	119					
+HWUSI-EAS610	1	4	57	726	532	0	1	ACTGGCTGCTCTTGCAGAGGACCCAGATCAATTCCC	a`aa]aba^`]\aP[\OO^\QKV_O`^^YY^\^^^^	chr10.fa		4483722	R	36	29					
+HWUSI-EAS610	1	4	64	1164	1685	0	1	AGTAGTCAGAACCACTGGCTGCTCTTGCAGAGGACC	`RXTaa_ababaa_aab`U`a_`M^Z\]_V\^a^\]	chr10.fa		4483735	R	36	40					
+HWUSI-EAS610	1	4	62	139	222	0	1	GGGCTCATATTGGATCTAGGATCGACCTACCAGGAG	aaab_abbbbbabaaba`aa]aba^`a_aa_b^\_a	chr10.fa		4484017	R	36	119					
+HWUSI-EAS610	1	4	74	1016	542	0	1	TATGGACACCATGGGCAAATAGGACAGGTTGAGAAC	ab`a_a`Ya]^]__`a^aaX^]`]^a_`]`_X__]X	chr10.fa		4484080	R	36	119					
+HWUSI-EAS610	1	4	43	812	1664	0	1	GTTAATTTTGCTTTTGGAGATGGGTGTCTTACATCA	a`baaab`aa```a_`_^^_`__`[a__`_`^^a[`	chr10.fa		4484137	R	36	119					
+HWUSI-EAS610	1	4	68	1346	1498	0	1	CACTGGCTCCAATATCAGAGATTTTAGTTGACCGAG	W`abZaab`aZP_`b``a__OY_abYaO`]ZSQXVa	chr10.fa		4484551	R	34GC	54					
+HWUSI-EAS610	1	4	75	1020	659	0	1	CAAGGTGTCTGTTTATTCTTTTGGTTCCTCAGTCCA	abbbb[baabbabbaababbbbab_baaaaaa```a	chr10.fa		4484624	F	19C16	80					
+HWUSI-EAS610	1	4	63	29	1573	0	1	CAGGTCTCTTTCCAGGCCCAGATTGCCAAAGTGTGC	aabb_aabaaabb``aa``]Y^^`aaa``^`W`S`^	chr10.fa		4484717	F	36	119					
+HWUSI-EAS610	1	4	94	1012	818	0	1	ATGAAACAGTCAGTCAATTCGCAATCATAGGAGTTA	aba_aa]_`XZ`YWX^_^[^\SUNRN``Z_^M][YB	chr10.fa		4484756	F	36	114					
+HWUSI-EAS610	1	4	3	1177	1181	0	1	GCTATGTTAGAACTTCTACTTATAAAATTGGGTCTT	a`aaa`_Y_`^_^`a]a^^aa`a^]^]__`_`]]``	chr10.fa		4484854	R	36	119					
+HWUSI-EAS610	1	4	5	1506	1108	0	1	CCGTATCTTAACTGTTCCCAACTGTGTGGCCAATAG	aaa`abaababaaa]aba_aa_aa_`Xa`_]`_`aa	chr10.fa		4485385	F	28A7	82					
+HWUSI-EAS610	1	4	34	1643	1740	0	1	AATTTCAAAACCAGCATGTGGGGCCAGCAAGATAGC	`aa[[^aaaaa[OY]`b^_]Za^Z^^_aWYW_Z\`Z	chr10.fa		4485636	F	36	119					
+HWUSI-EAS610	1	4	39	1600	989	0	1	TGGGGCCAGCAAGATAGCTCTGCAGACAAAAGGACT	aa_\^`_]VZ`_^^_^^^___`^__Z`\_^URZ\ZZ	chr10.fa		4485654	F	36	119					
+HWUSI-EAS610	1	4	40	1121	1236	0	1	CATGTGTGCATGCATACATGTATGAAGACATGAGTG	a^b_aaX`aaa]UZ\^VK`_^a`a`aabTaaa`a]a	chr10.fa		4485813	R	36	118					
+HWUSI-EAS610	1	4	55	948	117	0	1	TACAGATGGTGTGAGCTGAGGAATGGATGTGGGTGT	aZMW^^_]VZb__U]`a_O[^VRZaWNYVPUYST\B	chr10.fa		4486111	F	36	114					
+HWUSI-EAS610	1	4	84	237	1441	0	1	GCTGAGAAATTCAGCTCACCTGGAAGAGCAGCCAGT	ab`aaaa`aa`abbaaaaa_aaa`aa__a]a`__aV	chr10.fa		4486151	F	9C26	81					
+HWUSI-EAS610	1	4	23	1319	1250	0	1	GTTCTTTGAAGTCATCCATGTTCACTTTCACGCACC	a^a_a`[__``]X^\]`Ya___^___^_^_X]Z]Z^	chr10.fa		4486642	R	36	119					
+HWUSI-EAS610	1	4	54	900	1104	0	1	AAAAAAATTGATAACGGCATAGTTATTCATTAGGCA	aaa`a]aaaaa___^a[PSZLY_aXa_ZX^^U`_BB	chr10.fa		4486778	F	36	110					
+HWUSI-EAS610	1	4	14	3	1546	0	1	GTTGTGCTGTGGTGGAACACATCATCCACTTATCTG	a_VaN`a`b[`bZb^`bba_a_ab_aaa``a`[a`a	chr10.fa		4486893	R	36	119					
+HWUSI-EAS610	1	4	87	687	405	0	1	CTGTTACCTGAGGTCTTTCCCTGACTGAATCATTTA	abb`bbbababbbaabbbaa`abbabaabbabbbbb	chr10.fa		4486986	F	36	119					
+HWUSI-EAS610	1	4	99	1136	726	0	1	CGACCCTCAGTTTTTAACTTCTCCCTCCTTGTGAAA	abaI^bba[``\__b\UJb`V`TaVaS`aZRZ[K`[	chr10.fa		4488118	F	36	117					
+HWUSI-EAS610	1	4	91	306	1456	0	1	GATTCTGTTCACTGTACTTAGGGCATTTGTGACCCA	abbabbbab``bbbabba[_]aaaV`a_b_aaaa_]	chr10.fa		4488378	R	36	119					
+HWUSI-EAS610	1	4	70	1411	1120	0	1	GTTCCTGCCCCATCTTTTTTGTCTTGCAGAAAAGGC	Ya_`]`_^[a]]]\Z`b]aa_U]`_]_[]\X]ZU[T	chr10.fa		4488428	R	36	119					
+HWUSI-EAS610	1	4	4	403	2024	0	1	AGCTGTCAGCACAGTGTGAAATATCGAAGTTGCTGA	W_VaXX_[\\\__S`bM]I[T`a]ba^\XS_a``ZB	chr10.fa		4488567	F	36	113					
+HWUSI-EAS610	1	4	33	1617	1900	0	1	GGCAGAGGACCCCAACACATGTGTAGCAGATGTGCA	```a``aZ`U^`\^^\]W^\`SXS^ZPZ\US\T\SW	chr10.fa		4488826	F	36	118					
+HWUSI-EAS610	1	4	27	579	1304	0	1	AGGGTGGTCCCTAACACTATTACCTGTCCGTGGAAT	`^ab[baaa_aaaaaa_``abaaaa_aaaba`a``_	chr10.fa		4488899	F	36	119					
+HWUSI-EAS610	1	4	17	1414	758	0	1	CACTATTACCTGTCCGTGGAATCCATTCCCCTATGT	Ybb^bbaabab_Vba[_]bbabb[ab^aabbabbba	chr10.fa		4488913	F	36	119					
+HWUSI-EAS610	1	4	89	963	65	0	1	GCTATGAACTGGCAGAGCCTCACAGGAGACAGATAT	a]\`b`[`S\JPV_^RU[a^R__^^\\]PS[_T_[_	chr10.fa		4490663	R	36	25					
+HWUSI-EAS610	1	4	3	145	541	0	1	AACACATGGTGGAACTTGTGGCTCTACCTAGATATG	aaaa`a`baXaa[a`_aa]a`a`a^\^___`_____	chr10.fa		4490869	F	36	31					
+HWUSI-EAS610	1	4	75	776	231	0	1	TCAACAACGAGTGATGATCAGTGTCTTACCAAAGAT	aaabaaaaa[a]aa`baaaaa`a`_aaa`a`aaa_a	chr10.fa		4491173	F	3T32	80					
+HWUSI-EAS610	1	4	74	522	1502	0	1	CAACTTGGAGAGGAAACTGTACTTAGTCTTATAGTT	abb``baa\`aab`_aaa]_baaa^a^bbabaab`a	chr10.fa		4491243	F	36	119					
+HWUSI-EAS610	1	4	32	515	572	0	1	TGACTTCTCTCAGTGATGAACTGTTGCCCAGAACTA	abbbbbabbaa`b`bbbbbabbbaabaaa`baa_ba	chr10.fa		4491274	R	36	119					
+HWUSI-EAS610	1	4	51	197	1909	0	1	GGAACATGGAGGCAGGAGCTGAAGTCACAGAGCACA	a\`a_\aaa`\Z_X\^^^`YVLZ^Y^_^X^[^UBBB	chr10.fa		4491332	F	6C29	68					
+HWUSI-EAS610	1	4	24	1629	401	0	1	TAGTACATTTTTTTTCTTTTTGATTGGTGATCAACA	a`a`[\Ya__a[___P]`aaa_]][XGQX\^R`]W_	chr10.fa		4491481	R	36	118					
+HWUSI-EAS610	1	4	76	18	525	0	1	AATTTGATACAAGCTAGAGTCATCTTGAAAGAGGGA	VL^_ab__Xa`_bb`\`aa]b^aaaaa_\Vabbaa\	chr10.fa		4491567	R	36	43					
+HWUSI-EAS610	1	4	77	435	1170	0	1	GGNTAATGCAGCATCCGAAATAGGGCCATTAGCCAG	a[DRaaaa[`a]][^a]`^a_Y]Y___^__`^Z]^a	chr10.fa		4491790	R	2G33	110					
+HWUSI-EAS610	1	4	54	561	365	0	1	ATGCTGCATTACCCTTAAAAAGTAAGGCTTAGCTGG	`_\_`aabaaaaa`a`]_^]]_X_]^]^aa^^^^`]	chr10.fa		4491812	F	36	119					
+HWUSI-EAS610	1	4	19	1522	745	0	1	CTGGCCGGTGTTCCCTCTAGTACAAGCAGGAAGCAG	abaaa_`^\a``]_aaaa]`_aa`a_]_]a^[^]_Y	chr10.fa		4491918	R	36	119					
+HWUSI-EAS610	1	4	46	1517	129	0	1	CGTGTATTTGGCGTAGCAACAGGAACAGTAACTAAC	ab_b_bbaa`aa`aaV`abab````aa]_a`[``a]	chr10.fa		4492070	F	36	119					
+HWUSI-EAS610	1	4	40	834	106	0	1	ATCTACCTGCTTCTGCCAGAGTGCTGGCATTAAAGA	a`abba]aaaa^\U^]^ZZ^a[^^^`^Y^_`^`]^[	chr10.fa		4492148	R	36	119					
+HWUSI-EAS610	1	4	68	877	971	0	1	TGCACTGACTAATCCCCATAACATGGCACTCACAAA	aa_aWaab_aaa_W]__aaaa\aaa^_]\^\SX[UT	chr10.fa		4492462	F	36	119					
+HWUSI-EAS610	1	4	71	1446	500	0	1	TGCACTGACTAATCCCCATAACATGGCACTCACAAA	ZWaW\[\aabb]IWa[_V^baabaUFSXNG_]_BBB	chr10.fa		4492462	F	36	103					
+HWUSI-EAS610	1	4	19	743	1918	0	1	CTGGCCNAATCCAGTGAGCAATACCCCAAGTAGCAT	aba`a^D^aaa]a_`a`a`_\aaa_a]`_`^```_a	chr10.fa		4492567	R	6A29	110					
+HWUSI-EAS610	1	4	17	249	777	0	1	AACTCCATCCCACAAGGATGTGGGGGAATTTTCTGA	`\`Xbaa_a`a__[a_[QR`Qa`aaZU]`_aa_]aa	chr10.fa		4493196	F	36	119					
+HWUSI-EAS610	1	4	28	921	2020	0	1	AGGAGACCATCAATTGGTAACCAGCCTCTTGACTAC	aaa`]\]NNX_ZRSW^_NNXXUQQSW^ZUWWTNYVY	chr10.fa		4493261	R	36	117					
+HWUSI-EAS610	1	4	71	451	8	0	1	GGTGAACAAGTGCTGAGAAGACAAAGCGTGCCAAAA	ZQJ^`_`a`_GHXXWPTQMUPSQRTXBBBBBBBBBB	chr10.fa		4493376	R	27A8	70					
+HWUSI-EAS610	1	4	92	314	1375	0	1	TATGACACTGTCAGAATAAAAATTAAATTGACCTAT	SH]baaa`bb\aV][`a[\Zabaab``_``ba^`a[	chr10.fa		4493570	F	36	118					
+HWUSI-EAS610	1	4	41	130	1650	0	1	ATGGCACTGCCCACTGTACAGCCTTTCTCTCTTCTT	K_`abbbaabb`Q`ab__a]bbb``bbabaaaaaa_	chr10.fa		4494555	R	36	118					
+HWUSI-EAS610	1	4	31	1330	556	0	1	GTGGGCAGTGCCATGACTAGGAAAGGACCCAGGGGG	a^_[Z\\NKXQ\ZQ`[^Y\`XNS\Z\\XPNNKO\UU	chr10.fa		4494577	F	36	117					
+HWUSI-EAS610	1	4	67	158	1191	0	1	GGAACGTCTGAAATGTCACCTACGAGTACAGATGCC	a_\WI_P_^`\__Zb_ZY[_RVX_U`X]a]\\]aa`	chr10.fa		4494805	F	4A31	105					
+HWUSI-EAS610	1	4	2	347	72	0	1	AGTTGGTCTCAGGCTTGGTGGCAGGTGCCTTTACCC	a`a`aa]aa^`a`^``aaW]^W\\]SZ\UU\\\WW\	chr10.fa		4494879	R	36	119					
+HWUSI-EAS610	1	4	35	1398	1532	0	1	TGGGAGGGAGAGAGATGACTGCATGTGCAGTCGGGA	aaaa^`a_\`\ZU_\S`]_\a\S\\XZS\UUV_Z_B	chr10.fa		4494965	F	36	114					
+HWUSI-EAS610	1	4	69	1143	159	0	1	GTGGATAAAAGGAGAAATCCAGCAGAATGCCGGCAT	a`ba_`^^_]V`^^]aa\_[Y]ZXTXSQVMQUNVZZ	chr10.fa		4495025	R	36	118					
+HWUSI-EAS610	1	4	70	915	931	0	1	ATGCCGGCATTCTGCTGGATTTCTCCTTTTATCCAC	a]a]`Q\a^a`^a\]`a_]`aa[]W`__`__a]ZN^	chr10.fa		4495025	F	36	119					
+HWUSI-EAS610	1	4	92	1143	1506	0	1	GTGGATAAAAGGAGAAATCCAGCAGAATGCCGGCAT	`_ba_`_]__a`_]_``^___`^^_X^^^UU]XUUU	chr10.fa		4495025	R	36	119					
+HWUSI-EAS610	1	4	72	1161	617	0	1	TCAAACTCGGGTCATGCTTGTGAGAGCGCCTCTTAA	aaaabaaabaaU\a_b^aa`_aaa_`_`ZZ]U__aZ	chr10.fa		4495130	R	36	119					
+HWUSI-EAS610	1	4	45	399	1749	0	1	AGAATCACCTAGGAGACAATGCTCTGTGAATGTCTG	_^^`bbbbb]_b`]aa`_S^aaaaaa[`_Uaa]aaa	chr10.fa		4495187	R	36	119					
+HWUSI-EAS610	1	4	67	561	28	0	1	TCATAATCAATATTAATTAGCATATACATATTTCTA	aa`aa_a_a`aaaaaaa_a^`aa`a_`aa^aa_`a_	chr10.fa		4495238	F	36	119					
+HWUSI-EAS610	1	4	21	801	737	0	1	ATGCGCACATGCAGATTACTTTAGGCTCTCATTCAC	aa_``^]^a___`_]_a`\aUU`_^X^Z_Z\^`W`^	chr10.fa		4495724	R	36	119					
+HWUSI-EAS610	1	4	36	1690	1053	0	1	ATTTCAACAAACATGGTAGACAGCTCTTGAGGAAAG	^abbbaWV_b\Va]UZTZJ_a^Q[``^WX\]SXPZX	chr10.fa		4495806	R	36	118					
+HWUSI-EAS610	1	4	82	1186	288	0	1	TCAGTGGAATTACACCTGTGTCCCACATTTTTTATG	a_^a]`__]```]_]^__]^]^X]__^_^____^]_	chr10.fa		4495918	F	36	119					
+HWUSI-EAS610	1	4	82	928	1350	0	1	GTACAGTAAGAGCGTAGTTCCCAGTGCAGATATAAA	a`a_a`^aa`]__a]a_]`_a_`aXa__a^_``_`a	chr10.fa		4495989	F	36	119					
+HWUSI-EAS610	1	4	19	1578	1259	0	1	GTGGTTGTTCTGACCTCCCCACAANTCTCAGTGCAC	a_^`Yba^aa]aa_aa`aaaWY[XDLM]a`VEU\^\	chr10.fa		4496064	F	24G11	108					
+HWUSI-EAS610	1	4	7	450	860	0	1	CGTCCAGGAAATCCCTTGTGCACTGAGACTTGTGGG	ab_aaaaa`aa`aaa_a`X`_^^a_`_^`^``Y^a`	chr10.fa		4496081	R	T35	81					
+HWUSI-EAS610	1	4	60	905	1281	0	1	CGTACTAAGGAGAACACTGGCACACATACAAATGGG	a`a[_ab`_[V`_a`^VLUaa`TQTWa_Z`^_]a`_	chr10.fa		4496129	R	36	118					
+HWUSI-EAS610	1	4	80	1649	139	0	1	GAGTCTTGCGAATTCCATATTCTACACTCTACAGCC	[XXYb]^O^QXa]abab^]a^ab``baaa[`ab]__	chr10.fa		4496287	F	3CG31	50					
+HWUSI-EAS610	1	4	15	741	423	0	1	CATGAATGATGAGTCAATGCCCCTACCAAGTCTCAA	aa`aab```abIb\_aaabba`bbbbab[\Ga_`a\	chr10.fa		4496421	F	12C11G11	40					
+HWUSI-EAS610	1	4	2	1521	1316	0	1	AGACGCTGTCATGGAAATGGAGTGAGCATAATCATC	aaaaa_a`]RKU_^W]_`[aSVV]W[^ZW^\VWX_U	chr10.fa		4496574	R	36	118					
+HWUSI-EAS610	1	4	20	980	391	0	1	TCATAAGATAAAAGCCAACCATTGGGCTCTTCTATT	aaaaaaaaaaaa`aa^`a]`_a``__^^^`_Z_]``	chr10.fa		4496756	R	25A10	83					
+HWUSI-EAS610	1	4	81	1359	286	0	1	TCTTCCTGAAAAGTAAGAAATGTTGACCTTGGCATC	a]ab\[aa`a`aa]^]_aa\aa____^^^`W_]a__	chr10.fa		4496851	F	36	119					
+HWUSI-EAS610	1	4	7	629	1275	0	1	CTTATAACATAGAAGTGCAGTAGAGTTTGATCTGGT	\bb`ab\Xaa[``bb_b\I]\aaaa^aab^aaa`a_	chr10.fa		4496892	F	13G22	80					
+HWUSI-EAS610	1	4	72	675	369	0	1	AGAGTTTGATCTGGTCTCACACACGGGGTACTCGTG	T^W_S^]]]aa^^b_aaab`WUa`]]WR^_abaa[X	chr10.fa		4496913	F	36	119					
+HWUSI-EAS610	1	4	88	723	1530	0	1	ACCTGCCAAACTCTGTGTTATTGGAGAATGTGGAGA	`aa`aaaa`a_aaaa[a_a_aaaa]_]^a`]__`aX	chr10.fa		4497489	F	36	37					
+HWUSI-EAS610	1	4	54	44	572	0	1	AAACAAAATCTTAAAAACCGCTGACATTGTTGGGTG	[`_aRJV^abbb^_Q_^_bbbab`baaab_`_^a^a	chr10.fa		4499069	R	19A9C6	44					
+HWUSI-EAS610	1	4	67	1495	450	0	1	ATTTCATTAAACACACTAAAAATATACATTTGTGTT	aabbaabaaab`aab_aaaaa_aaaa_``_a\^W^`	chr10.fa		4499773	F	36	119					
+HWUSI-EAS610	1	4	10	819	67	0	1	AGGTGGTGGTCATGCTACAAAGCAAAGCTTGCATGA	a\HVabV[_a^]abaababa_]SQ_^]XVZ^`U`X`	chr10.fa		4500035	F	36	118					
+HWUSI-EAS610	1	4	19	1017	756	0	1	CAGTAGCCATGGTGATGTGGGAGTAGCAGATGATAT	aa`\^^`]`ab^V_`baabbba`Y_]Y`_YYa`a`_	chr10.fa		4500280	R	8G27	82					
+HWUSI-EAS610	1	4	15	1731	1177	0	1	AGGCTAGACTTAGCAAAGCAAGTGTGGAGATTAGAG	`a]\`a]^aa___`aa`___Z]R\P]_\\^^]`^[U	chr10.fa		4500579	R	8G27	81					
+HWUSI-EAS610	1	4	44	851	1882	0	1	AAGACATCAGGAGTGTGGAGCAGATGATCATATCAC	a_`Q]__^a_^^__`V\]_[^\^^W]W]VWYY_W]W	chr10.fa		4501005	F	36	119					
+HWUSI-EAS610	1	4	44	1083	102	0	1	CACTAAGACACATTCATTGCTTCTTCTTGACTGTGG	ababbaaaaa`aaaaaaab]aa_aa]``__^``^aa	chr10.fa		4501043	R	36	119					
+HWUSI-EAS610	1	4	83	1782	1546	0	1	AAAATGGGGAAAGTGAGTTGAACACTAAGACACATT	ab`baJKab`a]\Yaba_aaa`a__a`aaa``^_[T	chr10.fa		4501065	R	36	118					
+HWUSI-EAS610	1	4	89	944	184	0	1	GTCCCACCTACAATCAAGACAGGTCTCCCTATCCCA	[^ba`b``bb`b_abb^^`_aa`_aa]Uaaa`__aa	chr10.fa		4501131	F	36	119					
+HWUSI-EAS610	1	4	66	16	491	0	1	TTGAGATGTTGAGAGTCAATAGGAGTTGTAACTTAT	_^bbbbbbbabbbabab_ab\baba_bbabbabb\b	chr10.fa		4501349	F	36	119					
+HWUSI-EAS610	1	4	11	223	1344	0	1	GGAAGTCACTCATTTCCACTCAGTGTCCTAGAGAAT	a_a`aY_`_XRXVL_[[Ua^[X^]___a]Za__S\U	chr10.fa		4502149	R	36	118					
+HWUSI-EAS610	1	4	84	173	1919	0	1	GTGAAATACCTTTACTCAGAGCCACAGAGAGAAACC	a_baa_^_abaaabb_baaa`aaa`aaaa]^VW``a	chr10.fa		4502767	F	36	119					
+HWUSI-EAS610	1	4	69	130	1494	0	1	AGAAACCGATGAATCCCATCGATGACACATGCCATG	`aS\^a``^]``Zaaa^QL\_\ZXX___\P]_\VM^	chr10.fa		4502796	F	36	118					
+HWUSI-EAS610	1	4	84	883	559	0	1	AGAGAGAGCCAGAGAGCAGCCAGGTTTGATTCAGTT	Z_ZW\T[abb`YHX_[]aa_\^_YG_b``a`bKY`a	chr10.fa		4502913	R	7C27C	41					
+HWUSI-EAS610	1	4	87	1780	1274	0	1	AGGAGAGAGAGCCAGAGAGCAGCCAGGTTTGATTCA	aab_`VaaS_aa`a`__][aa^`^__`UXa`__`a`	chr10.fa		4502916	R	10C25	81					
+HWUSI-EAS610	1	4	17	347	1870	0	1	TGCTCTCTGGCTCTCTCTCCTCTAGCTCTACATTAC	abbab_b]aabaaabbbaabaa`[aaaaaaaaa_\^	chr10.fa		4502931	F	10G12G12	48					
+HWUSI-EAS610	1	4	50	835	713	0	1	AATGTAATGTAGAGCTAGAGGAGAGAGAGCCAGAGA	aabbaa_bbaaaaaaaababa_aaa`a```_`a`a`	chr10.fa		4502934	R	15C12C7	44					
+HWUSI-EAS610	1	4	23	905	320	0	1	GCAGAGACAAGGAAGCAACTCCTCCCACTCTGGGGA	a^aa\]a\Va`U\\\]_^]`^^_`^^\^Z]`_XU[B	chr10.fa		4503156	R	35T	112					
+HWUSI-EAS610	1	4	1	848	306	0	1	CAGAGTGGGAGGAGTTGCTTCCTTGTCTCTGCCAAG	aa^a]RQ\``__`[abb^b]OZ``]]W`T^\V^`Z_	chr10.fa		4503160	F	36	118					
+HWUSI-EAS610	1	4	100	452	1565	0	1	AAAGAAAAGCATCACTTTCGAAGGAGAAACATGTCT	a^^aaaaaaaa`a`aaa``a_`aa_a_\\```a^`_	chr10.fa		4503839	R	36	119					
+HWUSI-EAS610	1	4	92	550	843	0	1	AAACGCCATGTGTGTCCTCCCAGTGCCCAAGCATCA	aaa]_``^_a\]\`W^]_^]^^aW`W]\\Y\S^^\U	chr10.fa		4504042	F	4A18A12	55					
+HWUSI-EAS610	1	4	37	1563	2021	0	1	CAGAGAAAGATCAACTTAGGCAATGTACCAGCTTGG	aaaaaaa`a`__aa`]_a_Y_^_]_UWZU_`YTS\S	chr10.fa		4504171	R	36	119					
+HWUSI-EAS610	1	4	56	992	863	0	1	ATAGCTCATGCAATAATCTTATTTATTAACAGAGAA	```\F^Uaaa[]a`XQYLX^a`^``a^a\SU]XU\W	chr10.fa		4504200	R	4T19T11	71					
+HWUSI-EAS610	1	4	45	1065	1906	0	1	TATACAGGTCTGTGTACCATGTTTATGCTGTTCAGG	^`ba`b^a^]a__WO[T`a_a\_a_`a^_Z\\QW_Y	chr10.fa		4504304	F	23C12	81					
+HWUSI-EAS610	1	4	75	1315	256	0	1	ACATGCACATACACGCACATGGGCAAGTATACATAC	`_aa^ababababaa\aab_a^\`a_`^aab^a`a^	chr10.fa		4504495	F	36	119					
+HWUSI-EAS610	1	4	22	1160	1662	0	1	AAATAACCGAAGCACTGTGGGTGCTAGGTGTTAAAG	a[aa`___a`]_^`_^^N[`XIWX_[``G_^_^_]^	chr10.fa		4505328	R	36	117					
+HWUSI-EAS610	1	4	25	258	269	0	1	CTATTGGTGCATGTGCATTCAAAATCATGCTTAATT	R`aa`__a^_\[\P_`V`a`a^````Y\[^_abb]B	chr10.fa		4505627	F	36	114					
+HWUSI-EAS610	1	4	1	64	302	0	1	TGGGGAGGTCTGGTGAGGTGGGGTAGGGGGCTGGCG	`aaaaaaa\aaaaP`VaaSa`aaT`aa^aa``a`]`	chr10.fa		4505924	R	36	119					
+HWUSI-EAS610	1	4	92	987	979	0	1	ATCAATAACAGTATCAGGCCCTGGGACCTCCCGTTG	aa`aaaa`aa`G``aa_`^^a``a^_`^``[V`S_^	chr10.fa		4506306	F	36	32					
+HWUSI-EAS610	1	4	81	338	449	0	1	TTGGGATGCAGCTCAACGGGAGGTCCCAGGGCCTGA	`a```_aaaa`aaaa`aaaa\`a[^]`]]_YZ````	chr10.fa		4506319	R	36	55					
+HWUSI-EAS610	1	4	81	144	1411	0	1	CAAAGGGACGGGACCTTGGATAAAATGCTTTACAGT	ab_KR___aa]aaaa^`_a_[_]]_]Y]_]_``Y]X	chr10.fa		4506533	R	36	118					
+HWUSI-EAS610	1	4	61	413	266	0	1	GTCCCTTTGAGTACTGAGAGTCTCTCACCTCTAGGT	a_``_a`a``ZU]^``^^__\___^W^[^Z[UY\]B	chr10.fa		4506560	F	36	34					
+HWUSI-EAS610	1	4	39	343	1230	0	1	ATGGCTTTAACTGCTAAGCCTCCCCCACACTGCACC	a]`aaaa`_Z`__`aTS\a_Z_aaa_S_T[ZXZ[]a	chr10.fa		4506861	F	36	119					
+HWUSI-EAS610	1	4	8	725	1222	0	1	GTTTTCCTTGTTATCCATAGGAACTTCTAGCAATGA	a`_aba[PLYM_Z^\]^b\\VV^_a^[`a^O]^O[[	chr10.fa		4507189	F	36	118					
+HWUSI-EAS610	1	4	24	923	1091	0	1	GTGATGCTCACCTGCACGGTTTAATTTGGGCCTGGT	a]a\`a\`\WX][_\\Ua_\]^\S_\^WT\WW^_]S	chr10.fa		4507392	F	36	119					
+HWUSI-EAS610	1	4	6	198	1201	0	1	TGTCCAAGTTGTTTTTCTGTTGCTGTCCATAAAAAC	``\_UVabaababbb`bab_aab`baabbabba`ba	chr10.fa		4507724	F	36	119					
+HWUSI-EAS610	1	4	86	364	545	0	1	CAGGTTTCCCCTCTGCAAATACCCTATGTCATCGCC	a_a`H]_aWK_V_ZVXHYSXSYN\WZUXDU`\\^\\	chr10.fa		4508730	F	36	114					
+HWUSI-EAS610	1	4	21	1063	1926	0	1	GGGGCATTGAACCTCCATAGGACGAAGGGACTCCTC	^\XWVXXaaa^XHU[a_]QZ`aa^]]QMTRUPNN_`	chr10.fa		4508844	F	12A9T13	43					
+HWUSI-EAS610	1	4	64	1746	1513	0	1	GTAAGTTGTATCTTGGGTATTCCAAGCTTTTTGCTT	`aa^[`a_]aa`___aaX_aa`_a\S^____^Z\a`	chr10.fa		4509101	F	36	36					
+HWUSI-EAS610	1	4	41	1540	868	0	1	TGCCTGCGAATTTCATAAGTCATTGTCTTTAATAGC	\J\[_b`^[]]\_a[XWV\`^aaa[^\^a_T\W`_X	chr10.fa		4509227	F	36	39					
+HWUSI-EAS610	1	4	37	583	923	0	1	AGAAGGTGGAAATAACCTAGATGTCCCTCAATGGAG	a]\]aaZaa]aaaaa_`aYa]aa]``__`^__aa_a	chr10.fa		4509311	R	36	43					
+HWUSI-EAS610	1	4	27	377	320	0	1	GATGCTCCAACTTATAACAAGGACACATTCTCCACT	aaa``a^a\ZYaa`_`a``]_a``a]`]`__]_a`_	chr10.fa		4509377	R	36	27					
+HWUSI-EAS610	1	4	72	1062	1467	0	1	GATGCTCCAACTTATAACAAGGACACATTCTCCACT	a_a]YNOPQ]Y_a[TP__[U_ZUYZOQZ_XT\\YXZ	chr10.fa		4509377	R	36	14					
+HWUSI-EAS610	1	4	46	904	1185	0	1	TTTTTCAGAGGGGAAACTAGGAAACTATGTAAACAA	aabaa^`a]aa__]_`^a`aa`\^_a__aZ^_^Z^_	chr10.fa		4509761	R	36	119					
+HWUSI-EAS610	1	4	38	114	26	0	1	TAGACATGTAGATTGTGGAATAGAATAGAAGATCCA	``\\`aaaZ^a\a``P`]W`[Z`^WZ``_^]`R^``	chr10.fa		4510578	R	36	119					
+HWUSI-EAS610	1	4	34	1363	918	0	1	AGGCTCACAGGATCACAAGAGGGACAAGCTTCAGTC	aaaabaaaaa_`aaaaa]`_a_[`a`__`^_^a__a	chr10.fa		4512511	R	36	59					
+HWUSI-EAS610	1	4	53	494	611	0	1	GTTTTCATCTGCACCCAGGAGCGGGCCCTTTTCTAC	_a```a`a]W[^X^`]a_`]a^^`\TX^ZVZ]UXRR	chr10.fa		4512816	R	36	119					
+HWUSI-EAS610	1	4	52	1234	1845	0	1	ATGGATAAGTTTTTCTTAGCTTAAGTTGGTTGGGTC	ab`baaaab``ab`_`aabaab^U]^aaa_aaa`_`	chr10.fa		4512919	F	36	119					
+HWUSI-EAS610	1	4	8	170	1500	0	1	ATTCAGCATTAGACGGGGAAGGGGGAATCAGTAAGC	V\a_K_[_]a_]RQ_\a`_a`]^\QQ[_ZYWPU`^]	chr10.fa		4513205	F	36	118					
+HWUSI-EAS610	1	4	78	640	414	0	1	CATGATTTAGCCTTTGGAAGGACCATCTCCAGTGTT	ababbbaa_a_^`bb`b^_b[aa`b`a`^]__Va^a	chr10.fa		4513240	F	36	119					
+HWUSI-EAS610	1	4	38	1639	1866	0	1	CATAACACTGGAGATGGTCCTTCCAAAGGCTAAATC	aa_]^``a``bZY``]_N`[Xaa^P[]ZXDS__``B	chr10.fa		4513243	R	36	112					
+HWUSI-EAS610	1	4	78	1116	820	0	1	ATAGATCTGTGAGTTCAAGAATCTTGGGAAAGAATC	aZ_aa`X`aZa]_T`]U\[\`_Q_\]a[^`_`ZUXB	chr10.fa		4513508	R	36	114					
+HWUSI-EAS610	1	4	58	612	317	0	1	TGTTTGGGGCAACAACAACAAAAAAAGCCTATATGA	abaaaaaaaaaaaaa`aa_a_aaa``a[_a`a`a`a	chr10.fa		4513765	F	36	119					
+HWUSI-EAS610	1	4	6	313	1272	0	1	GCAATTCATTGTCTCATATAGGCTTTTTTTGTTGTT	aba^aabbaab_a_aaa]Sbaaaaaaabaaaaaa^`	chr10.fa		4513778	R	36	119					
+HWUSI-EAS610	1	4	35	1713	376	0	1	GAGCAAGTGTTGAATCAAACAAACTTAATTTGGCAA	`b`abb^^`aaaaabbbbbaaaaaaaaaa`^U[_`[	chr10.fa		4513810	R	36	119					
+HWUSI-EAS610	1	4	74	270	98	0	1	TTAGGAAAAACTTAAGCTTTTCACTGGATTATATGT	aaaaa[_a`a`aa`_a``^`_`__``a\^```a``]	chr10.fa		4514726	R	36	119					
+HWUSI-EAS610	1	4	28	1639	1160	0	1	TTTCCTAAGTAACACTTTATAAAGAATTACAAAGAA	aaab`abaY^aaaa_aaaaaa__Z^aZDX^_``Z`^	chr10.fa		4514754	F	36	117					
+HWUSI-EAS610	1	4	37	293	757	0	1	GAAGTCCCACCGTTCTGAATGATTTGATTCTTTCCT	`P`_^aab``aa^a`aaY[``W[`_]\a_^_`__``	chr10.fa		4515841	F	36	119					
+HWUSI-EAS610	1	4	71	389	1787	0	1	ACATCGAAAACAATCATGCATGCAGGGTGTGGTAAT	a\Q`_]XP^]]\R[`TTX]Y[ZVLRQXT\BBBBBBB	chr10.fa		4515991	R	36	88					
+HWUSI-EAS610	1	4	95	1278	1939	0	1	TTGTTTTCGATGTAGACTTTATTATATCCCTGTTCC	aababaaaa_`aY__`_aaaa`_b`a_X_^_a]`ZB	chr10.fa		4516014	F	36	115					
+HWUSI-EAS610	1	4	89	327	677	0	1	GGACTGTGCAAATCAGCTTTGGAACCTCCTTGTACA	ab]bbbaba^abbbbaba]^^a_a_``a`__aX`__	chr10.fa		4516240	R	36	119					
+HWUSI-EAS610	1	4	40	1316	655	0	1	TAGCATAGAACTGCTCACATAGCAATGGCTAATGGC	`a__aaa]a`]]`V\_a__`][X]^``Z\^^^^Z_^	chr10.fa		4516278	R	36	119					
+HWUSI-EAS610	1	4	93	423	1159	0	1	GGTACTATAGAAAGTGCGTTATCCTCTTGTGTGTGC	`a]\_[Z]]_VZYaW__aQSZ\^aTUYT_^a][Q[_	chr10.fa		4516635	R	36	118					
+HWUSI-EAS610	1	4	12	1628	1192	0	1	TGGAAAGCAAAGGAGATTGTGTAGGTGATGTATACA	aa_]^[^XY]ZXOT^X_^[R^YXSNQTTX^XXXXUW	chr10.fa		4516692	F	36	118					
+HWUSI-EAS610	1	4	56	76	1903	0	1	GCACGACATTAAAATAGTACATGTGGCTATCATCAC	aaVYaa[_R_a``]`YDXZWX_a\_^``][OS]Q[^	chr10.fa		4517962	R	36	116					
+HWUSI-EAS610	1	4	46	625	1000	0	1	AAAGCTCACATATTTCTAACTGTTTAAAAAGCTGAA	]^\`aaa_a\aaabaabaa`ababaaa`a`a]aa`a	chr10.fa		4518091	R	36	119					
+HWUSI-EAS610	1	4	47	1403	1693	0	1	TGGAAAGTTTAGGTTAGCACACAAAGAGGGTTCATC	aaaX\a[JR_XVW\^[`aa`a__`_a_aa\S^_[a^	chr10.fa		4518409	F	36	118					
+HWUSI-EAS610	1	4	52	207	1210	0	1	ATGCCGCCCACAGACACATGCACAAGCACACATACA	aaabaaaabZ_aaa_`a]`aaa`a_a```a_`___`	chr10.fa		4518657	F	36	119					
+HWUSI-EAS610	1	4	5	992	857	0	1	TCTGTATGTGTGTGTGTGGTGTGTGTGGATGTTTCG	aaba``^`^aX`_aZaU`aU`Xa]a]a_R`^[__RR	chr10.fa		4518704	R	36	38					
+HWUSI-EAS610	1	4	23	1527	954	0	1	TATGTCTCCATCTTTGAGTGTGTATTTCTGTATGTG	aaaa```PP\aT__a]^aZa_\ZR`[^X]Y\[a`[_	chr10.fa		4518730	R	36	118					
+HWUSI-EAS610	1	4	14	921	2040	0	1	CACCAAACTTTTGAATATTTTCAGCTTTATAGCAAA	abaaaaa`ba_babbaabbaaaaaaaaaaaaa_aaa	chr10.fa		4518980	F	36	119					
+HWUSI-EAS610	1	4	4	790	1912	0	1	ATTGACCCATCGAGTCTGTGTTCCACTCCATCATCA	_ZZZ[a\RWX\WY`_]V`[LN]Y_\SGS`__`a_^Y	chr10.fa		4519086	F	36	117					
+HWUSI-EAS610	1	4	58	573	755	0	1	CCATCATCATCCTTCACCTCTTGCCTTCTCTGCCCT	aaab]`_`aa_`abaaaaaaaaa`aabaaaaa`a_a	chr10.fa		4519113	F	36	119					
+HWUSI-EAS610	1	4	20	818	2015	0	1	GTTTCCTCTCTTTGTGTTTCTTTCAGCTGTGACTCT	aQ]X_aaaa`aa^ZZ[\a`\^aa__a[``]XY\[_`	chr10.fa		4519179	F	36	119					
+HWUSI-EAS610	1	4	85	1523	2016	0	1	TGTCAAGGTTTTGAAAAAACAAGACCATTTAGAGAG	ab^bb_[ZTababa_b`b`aa^aaS`\^^_`a_aab	chr10.fa		4519213	R	36	119					
+HWUSI-EAS610	1	4	29	1663	1958	0	1	TGGTCTTAAGCCTCCATATGGGTTCTGGGTACTGAA	^b_FYa`a`_UV]YRX\]aaa_S\Yaaa_GPOY`VX	chr10.fa		4519519	F	36	116					
+HWUSI-EAS610	1	4	54	905	876	0	1	AGCCCAAAGCAAGAGTACTTACCCTAGTGGCAAGTA	aaa_^`a``^]_`S\[_^_``UM^[N_R_]Y_X_WQ	chr10.fa		4519628	R	36	118					
+HWUSI-EAS610	1	4	81	1038	791	0	1	ACAGCAACAGCAATAGGAAGGAGGAGCCCAAAGCAA	a`aaaaa_aa_[aaaba``a_^a__`^^\U`_\^`_	chr10.fa		4519652	R	36	119					
+HWUSI-EAS610	1	4	94	816	1655	0	1	ACCCTGCATACTTATCTAGTTCCTGCACACATGCTG	a^\RX_TTT[Q__^VV\FZ[^]]WYPV]SST\U[_`	chr10.fa		4519994	F	36	117					
+HWUSI-EAS610	1	4	95	900	1369	0	1	AAAGTGCAGTGGAGGGATTTCTCACACTAAAATCAA	a`V`]a^`aYa`]Saa]`aaP`]^NTU`_YQY`^XZ	chr10.fa		4520893	F	36	118					
+HWUSI-EAS610	1	4	4	996	840	0	1	ATGGACCAAAAAACAGCTAGTAATCCAGTAGAATTC	a``N_TM[_`X[[[[[_^XNJVQY[ZNSX]PP]WX]	chr10.fa		4521321	F	4T31	81					
+HWUSI-EAS610	1	4	49	594	493	0	1	AGGAAACGGAGAAACCTAGTGCTTGGTGCGGTGGGT	T^WOY[_]XSRGQY_aaa`T`ab^W`G_Q_ZKXU]V	chr10.fa		4521746	F	28T7	94					
+HWUSI-EAS610	1	4	74	767	1849	0	1	CAGGCATATCCTACTAAACCTCCCAGGGACGCTACA	aabbabaaaababaabaaaa`aaaaa``````_a_^	chr10.fa		4521802	R	36	119					
+HWUSI-EAS610	1	4	70	592	1974	0	1	GAGACTGGAGATAGATGACTTCTGTGGCTGGGGGTC	a_a_`aaa`a`]a`_^`]^^__^`W^BBBBBBBBBB	chr10.fa		4521886	F	30T2ACT	66					
+HWUSI-EAS610	1	4	83	1366	1097	0	1	AGCTCCTTCCCTAGAGAACAGGGCTGAGGAGGCGGA	a`\YYY\]\`]\\\Y[X\]XVONUZZZZVSXXYSSB	chr10.fa		4522215	F	36	114					
+HWUSI-EAS610	1	4	32	126	358	0	1	TAGAGGCCGGTCTGAGGAGGTGAAGTTCTGTCTCAA	abbZbbbbba`bab]bbbbb]a^Wa_abaa^babb^	chr10.fa		4522321	F	36	119					
+HWUSI-EAS610	1	4	17	29	1932	0	1	GGCCGGTCTGAGGAGGTGAAGTTCTGTCTCAAGGCG	a]M]aS[`^`R_^N^`N]IDWKZSX^RZKOFWZYT\	chr10.fa		4522325	F	36	113					
+HWUSI-EAS610	1	4	11	330	1889	0	1	AGGAGGTGAAGTTCTGTCTCAAGGCGGGGCTGAGGC	a`a_`\\XVL_`[a\Z_a``_[a`a``aa``]X_a`	chr10.fa		4522335	F	36	119					
+HWUSI-EAS610	1	4	76	93	605	0	1	GGGGCTGAGGCATTGGAGGCACTCGCTATCTCAAGG	`aaaa`a^aaaa^[___aa\X__a^aXX\^Z`_a`\	chr10.fa		4522360	F	36	119					
+HWUSI-EAS610	1	4	46	912	522	0	1	ACCCGAGCGCCGAAGTCTCCGCCCTACCCCAGGGGA	`^_`_\```^`[]`_^^````]^X\^XVX\\\\^XB	chr10.fa		4522563	R	36	114					
+HWUSI-EAS610	1	4	70	1649	1849	0	1	GAGCGGGAGCTGCGGGACACGGAGTCATTGCTGCAC	`TaZ_a^Z_Z^\^^^NHZWZ`YZ^RQXVFXZV]UZB	chr10.fa		4522979	F	36	112					
+HWUSI-EAS610	1	4	62	1017	1955	0	1	CGCAGATGGCTTCCGAACCCACTAGAGCGGGTGGCT	a][Z^Z_\`_MXZW^`_`]UTVXUFEGDZ``YPXBB	chr10.fa		4523019	R	36	104					
+HWUSI-EAS610	1	4	41	1505	1460	0	1	TGGAGGATTGTCAGAACCCTAGTGACAAGATCTGGA	aaa_X`^``_V`_``aX_]a__W^ZW^]_]]]___^	chr10.fa		4523056	R	36	119					
+HWUSI-EAS610	1	4	90	1781	620	0	1	ATGGAGGATTGACAGAACCCTAGTGACAAGATCTGG	`]QK\LV]`JHHMX[_`W_VQ[SPNZ^^]XUUBBBB	chr10.fa		4523057	R	11T24	86					
+HWUSI-EAS610	1	4	29	1167	989	0	1	TCGAGTTCTAACCATACAGTGCATCGCTCCTCTTGC	VbUba_b]baa[^]_YX\Z\ZX_ZOUa]_b`[`SX]	chr10.fa		4523791	R	36	119					
+HWUSI-EAS610	1	4	90	238	1728	0	1	GATCTCAGTAACCAACCTCAATCCCTCTTCCCACTT	_YUbX^YZ^ab_`]WQa]]Xa`aaba^`Y\`a_a]]	chr10.fa		4523952	R	36	119					
+HWUSI-EAS610	1	4	39	877	706	0	1	TGGTTACTGAGATCAACCTCTTGGCTCCACGTTCAC	_YUYS\UV]``_\W]__J\aa^``a``[]NU\aVXU	chr10.fa		4523974	F	36	118					
+HWUSI-EAS610	1	4	44	233	864	0	1	AAAGGGCTAGGAGGCAGAAGTGACCAACATGGATAA	XXZb_abbabbbabbaabbbaabbb`bbabbaU`]`	chr10.fa		4524177	F	34G1	85					
+HWUSI-EAS610	1	4	65	572	508	0	1	GCATGCATCAGACTCAGTGCTGGAGATGGAGCTGAT	a_a^a_`_]a\_\^a``Z_`__aV_Y_Z^W_\_[S_	chr10.fa		4524353	F	26C9	83					
+HWUSI-EAS610	1	4	94	535	1835	0	1	TCTCTGATCATGCAGGCACAAGAGCTTTCTTCTATG	ababaa]abaaba_^[a``aY`aa`aaaaaaaaaaa	chr10.fa		4524675	R	7C28	81					
+HWUSI-EAS610	1	4	70	67	2018	0	1	GCCTTGTTACTGTCTCTACATAGTTCCATCTGTAAG	_W_IWUXZ__PVXX`YT\\VQNVY]YNN]WBBBBBB	chr10.fa		4524725	R	36	91					
+HWUSI-EAS610	1	4	65	1439	169	0	1	GAGACAGTAACAAGGCAGGCGTACATAGTGCAGTAT	a^ab```_a___`UH^^\SVUH_[^`^T]`_^ZZ_`	chr10.fa		4524745	F	19A16	90					
+HWUSI-EAS610	1	4	34	759	1713	0	1	GGAGTACATAGTGCAGTATATCTGGGGGAAGGGGAG	`b[`Naa`^_a[a_ZaW`a`__`_a__]\[\\\^\]	chr10.fa		4524762	F	36	119					
+HWUSI-EAS610	1	4	21	1219	701	0	1	CACACACATTTAAGCTCTGTGTACATTTGATGTTTC	aaaa`b_W^a`Y^baaWa^\a\UZaab]a`ab^^a]	chr10.fa		4525223	F	36	119					
+HWUSI-EAS610	1	4	81	338	76	0	1	GCATGCAATCACCTTCTATCCTAGGCTGCAAATGTC	a_aaaaa_a`a__a``a_^_^]^__Z^_^_^_Y_Y^	chr10.fa		4525271	F	36	119					
+HWUSI-EAS610	1	4	14	710	236	0	1	TATGGACATTTGCAGCCTAGGATAGAAGGTGATTGC	abbbaaaaabaaaaa`a]aaa_a\a``aaVa]`_a^	chr10.fa		4525275	R	36	119					
+HWUSI-EAS610	1	4	36	1163	280	0	1	GTGGTTGCTGTTCTAGTCAGTGCTCTGGTTTTATGA	a^`^\_^^_\Z_]`]a_^^_Z_W^]__^Y_^_W\\S	chr10.fa		4525350	R	36	119					
+HWUSI-EAS610	1	4	85	1402	549	0	1	CTTAACCGTGTAAACCGTCTGTGCCCCTGCCTGGGC	_aa^a__XOT\_`^`Xaaaaa^`a``\XGGYZ\Q]X	chr10.fa		4525613	F	36	117					
+HWUSI-EAS610	1	4	91	635	506	0	1	TGCCCAGGCAGGGGCACAGACGGTTTACACGGTTAA	ab`baabba`abaaababbaabb^aa]Xa[a^F]``	chr10.fa		4525614	R	36	118					
+HWUSI-EAS610	1	4	60	954	969	0	1	ATTGTAACTAGATAACTAGTTAACTGCATCCATTTG	a`a\\aZ`aaa^a_^VX^``a_WZ^a_a]Z\\`a[a	chr10.fa		4525649	F	36	119					
+HWUSI-EAS610	1	4	98	1584	736	0	1	CAGCACCCAGGTAGCAGCTCACAACTGTAACTCAGT	abbbba`ab]a_baabaaabaaaa^a^_aa_a]``\	chr10.fa		4525784	F	36	63					
+HWUSI-EAS610	1	4	27	382	892	0	1	AGCCAGAATGGGGTGCTGGATCACCTATGACTGAGT	ZV]baa_Xa_]aaU`_\aa_]_]_a`[a[LV]]N]Q	chr10.fa		4525813	R	36	118					
+HWUSI-EAS610	1	4	96	661	84	0	1	TGCATGCAAAAGTGTGTAGCACATGTATTTATGCCT	_aab^ZF]_RZa_L_a_``[TXS]PHXZ^_URBBBB	chr10.fa		4525854	R	6T1T26C	51					
+HWUSI-EAS610	1	4	71	1397	1591	0	1	TCAACAGCAATTAAGCAAAATGTAACCCCTGCTTTT	a`U]]_a]__aa^__^_a^`_`^^W_\^^`_Z^_^`	chr10.fa		4526394	F	36	119					
+HWUSI-EAS610	1	4	67	1094	294	0	1	AGGAGAAGAAAGGTGCGCATCCTGCATTTGCTGGGT	`aaab__^a\a]ZP_`a_aa`a``___`__[YXZa\	chr10.fa		4527078	R	36	119					
+HWUSI-EAS610	1	4	79	997	1546	0	1	TTCTCTTTCCATATTGGGCCTTGCTCTTCAAGACAT	^``bVSa`__`a\`aaab_Zbb`X`]]_Q__Y_^_]	chr10.fa		4527107	F	5C30	95					
+HWUSI-EAS610	1	4	34	1077	360	0	1	TCCTTCCTAGCTACCTGATCAGGGAGGTGATAGGGT	a`aabaaaaaaaa``a\Z]aa[[``a[W^^[^\]BB	chr10.fa		4527171	F	36	110					
+HWUSI-EAS610	1	4	53	246	898	0	1	ATAAGCTCTACTGTAGTGCTGTACACCCGTGCTCCC	aab`_aa``Za``__`W_]\]UW`aV\_\W`\WW\\	chr10.fa		4527224	F	36	119					
+HWUSI-EAS610	1	4	89	654	48	0	1	CCCAAGACCATTGCTCAAAGCTATGGATCAGGGAAC	aabbbbaaabaaa_aaaa`a_`a`\a__`aaaa^^`	chr10.fa		4527482	R	36	119					
+HWUSI-EAS610	1	4	75	882	936	0	1	ACCTCCAGGATCAAGTCACTCCCATCCATTTCTTCC	aaababb]]`aSa`aabbbaaa_aba_`baa_aa`a	chr10.fa		4527580	R	36	119					
+HWUSI-EAS610	1	4	39	885	1680	0	1	CAGTGAACTAGGTCAGTGTCTTAGTTAGGTTTCTAT	aaaaabb`a^a```Y`Zb^]ab_]]`Yaa__aa`aa	chr10.fa		4527730	F	36	119					
+HWUSI-EAS610	1	4	90	901	715	0	1	ATCCTGTCCTCCCCAAGTTGCCTTTGGTCATGGTGT	aa^]aa\UT\V_\\\aaU___`^_W[aU_\^[VF[Z	chr10.fa		4527778	R	36	37					
+HWUSI-EAS610	1	4	75	1609	105	0	1	CACCATGACCAAAGGCAACTTGGGGAGGACAGGATT	_bb^`W[bbb_bbHZaabaUbZXaa`___X_X^`_a	chr10.fa		4527779	F	36	18					
+HWUSI-EAS610	1	4	100	540	2024	0	1	ACCCCTGGGCAAATGGCCTTCGGGTACACAAGACAG	aab_b\]`^\ZZ[^aZX]MVaYa_QP]]aaaXTa`]	chr10.fa		4527923	R	20T15	81					
+HWUSI-EAS610	1	4	63	1129	631	0	1	GAATATTAGAATATTCTAACCAGCACAGTCAGGAGA	abbabbaaaaabaaaabab_aaa_a^aa]a`a`]a_	chr10.fa		4528057	F	36	119					
+HWUSI-EAS610	1	4	43	1194	248	0	1	GTTGAGAGCCACATCTGGGTGCTGGGAGCTGATCTC	aI`_TS^__a\LRYS]]OOSYXVV[[YVTVPV^Y\[	chr10.fa		4528561	R	36	117					
+HWUSI-EAS610	1	4	38	187	157	0	1	CGCATGTCTAAGGCCACCTTGAAAACAGAATTGAAT	a]`Xa_Y`^^VaYaa_aa__`WQHT]_a[[Y`a[YB	chr10.fa		4528910	R	36	114					
+HWUSI-EAS610	1	4	88	1550	1241	0	1	ATCCACACGAGCACCATGACAGTGGCAATTCTGCCC	aa`^_`b^]^a_a`]aaa`_aY^\a`a]^^^VY[``	chr10.fa		4529045	F	36	119					
+HWUSI-EAS610	1	4	86	1337	826	0	1	GCGAGGAGCCCTGTGCCAGCCCCATTCCTAGGCTTT	`a`_V__a`a_aa^_aa_XZ[a``__`\aR]_\^`^	chr10.fa		4529095	R	36	119					
+HWUSI-EAS610	1	4	90	1193	403	0	1	TGTCTGCCTCGCGCTGCATTGCAGGATGGGTTCTCC	_\\^`T[``Y`N[Z^^U^`[TNK]\R\`ZTRVZ[PQ	chr10.fa		4529342	F	36	118					
+HWUSI-EAS610	1	4	98	17	365	0	1	ATCATCTGTGCTGAAAGATCAGCCCTTTACTGATGG	aaaaaaba_aaYYX\]X__``_`aY\__^a^_^__a	chr10.fa		4529383	R	36	119					
+HWUSI-EAS610	1	4	96	56	571	0	1	GGGTTTAATTTCTGTGGGGAACCTGAGTGAGATCAG	a^aY^a\]]`aaa_S]``\Y]^_aa^a]a_a`^a__	chr10.fa		4529627	F	36	119					
+HWUSI-EAS610	1	4	88	490	1788	0	1	AGAGTCGATGACAGGAGCCTTGCTAGCTCCTGAGAC	abba]bbaaa]VQ^a\XV`PVaaWYY`Raa^]^`^_	chr10.fa		4529685	F	1A34	80					
+HWUSI-EAS610	1	4	62	1636	1313	0	1	ATGAACAACTAGAGACTGCTCTCTATGGTGTGTCAA	abaaaaaa`aaW_a^aaa`a__`_`__[V_]]Y\__	chr10.fa		4529792	R	36	119					
+HWUSI-EAS610	1	4	18	504	1939	0	1	AAGATTTTAGGAAACAAAAAATAATAGCAGTTTGAG	a`YHN\]UJa___Y_RWPOXRP^^_Z_W^ZOOQ^_^	chr10.fa		4530213	R	36	117					
+HWUSI-EAS610	1	4	77	753	1803	0	1	GAAGTTCAAGGAGGCTGGGAGTCACCTGACATGCTA	_^abO[Wa_``_P_VW`_`HTH^^^__\Z\_^`aUa	chr10.fa		4530346	F	25T10	81					
+HWUSI-EAS610	1	4	84	501	709	0	1	ATCACCAGTTTAATCTATACACACAAAAAAAGGTGG	]^`\_\a][`\Y\a`aaaa_a___]_aW_a\W_Sa_	chr10.fa		4530850	R	36	119					
+HWUSI-EAS610	1	4	48	54	1154	0	1	GTCCTTCCTGACCACCAGATTTCATTACTCGAGGTT	a`bbaabb[aab`babVaRUT_aa_``a]baQ[a]_	chr10.fa		4531842	R	5A30	81					
+HWUSI-EAS610	1	4	82	973	410	0	1	TGAAAGTTAAAGAGTTTTAATACAAAAATCTTTATT	^Z_`a_[b`baa__[babaabbX]__Yaa`aaaaaa	chr10.fa		4532315	R	5A30	83					
+HWUSI-EAS610	1	4	35	508	1535	0	1	AGGGAGCTGGCTATGAAAAAGTTACGTGCAAGGCTA	aaab`aaabbaaaaba^aaaa`a^aa`aa`aaa``a	chr10.fa		4532408	F	36	119					
+HWUSI-EAS610	1	4	68	1336	1131	0	1	GCAATGCAAAAACCAAGTATAAACCCTGACTCCCCA	aaaabaaaa`aaa_Z_a^`aa`a_^`[__]___^_a	chr10.fa		4533036	R	9G26	82					
+HWUSI-EAS610	1	4	73	1168	25	0	1	CATGAACTCTTCTTGTCTCCACCCAGCTGCATCACA	aa_^\MFV][__\a]VZb\`a^UBBBBBBBBBBBBB	chr10.fa		4533963	R	36	61					
+HWUSI-EAS610	1	4	19	1684	1312	0	1	ACCAAGCCCTGTGGGACTGAGCAACTACTAGATTCT	aa]_]`]][`_\Z\`WW]PU[V__\[\[V^\SU_W\	chr10.fa		4534304	R	36	33					
+HWUSI-EAS610	1	4	28	512	935	0	1	AACTACAATCCAGAAATGAAGGTTACACCTTCTGGT	]aaaa``a]`_aa`a]`aY^a_^_UUTTV_`]_`a_	chr10.fa		4534555	R	36	119					
+HWUSI-EAS610	1	4	65	1669	648	0	1	CAAAGACGTCAATAGTTTGAATGTGTCCCCTCTAAC	Y]X\PZ`]G\ZaVY[VY[SMWQW[UDLW]^]Ra__R	chr10.fa		4534774	F	7A19G8	53					
+HWUSI-EAS610	1	4	96	351	134	0	1	TGTATGAGAGTAAAATGTCACGTTTGTAATGTATTT	aa__]T]a^aS`_`_^^PZ_Z_^]\`^[^_`W_[]]	chr10.fa		4534956	R	36	119					
+HWUSI-EAS610	1	4	15	262	29	0	1	AAAAACAAAACAAAATATTGGATTTCATTCTATTAA	`bb`b`b[`[]_aVXZabaaaW^``a\aba`a`aaa	chr10.fa		4536280	F	36	119					
+HWUSI-EAS610	1	4	83	586	1547	0	1	CAAGACAGAAGTAATGACACCTTTTATCTGTACCCT	abbbaa`bbbb_abbbaabbb``ababaababaaaa	chr10.fa		4537264	F	5T30	81					
+HWUSI-EAS610	1	4	24	1432	1732	0	1	GTGGGCACCTGTGAATCTCTTCCTCCAGTAGATAGA	a]``_`_\_`a`_`_[Y`^___\`WPP^\\_XZ[_Z	chr10.fa		4538324	R	36	119					
+HWUSI-EAS610	1	4	78	1305	178	0	1	CATTTTGCCCTCAAGAATACTTCCCGATATCTCACG	abb^^`Z]GUZ[^a]]a^`]\^^`YXVV\Y][[ZBB	chr10.fa		4538800	F	28C2A1GA1	12					
+HWUSI-EAS610	1	4	43	423	1701	0	1	CACCCAACGTTTGTATGACTCAGTCCAATCTTGGTC	abaa`aa``_aaa_a``]`_a]`^`a^a`_a___]a	chr10.fa		4539799	F	36	119					
+HWUSI-EAS610	1	4	76	653	1340	0	1	GCATATCCTGTAGCTTTACTGCTCTGTAGTCTGAAA	a^`a``a_]a_`\_]`a\^`b^a`aa]Va^_`a^a`	chr10.fa		4539908	F	36	119					
+HWUSI-EAS610	1	4	71	1050	713	0	1	GTGGTGCACTATNGCTCACCATCAGACTTAATAATA	aa`a]aaa_a^]D\a`_a[aaaYa`_`a_aa_a```	chr10.fa		4540007	F	12A23	110					
+HWUSI-EAS610	1	4	99	792	1139	0	1	TGCAATGGCCAGATCTAGGATAGGCCGCGCCCTCAG	Jaa`X^\`XX__`__aaaaVQ`aaXTaa[ZOIHa_a	chr10.fa		4540316	F	17A1T16	52					
+HWUSI-EAS610	1	4	37	623	441	0	1	TGACCTGCGCCGGCCGTCCTCCTGTCCCTGCCGTCT	a_a`_a``a``W`\`\VVUPWZ\\X\Z]VXRQYBBB	chr10.fa		4541224	F	36	105					
+HWUSI-EAS610	1	4	39	202	144	0	1	CGGTGAGTGTGAGGCGGGCATCGTGGGAATCCTTTC	_aaR_aa`a[X_XaaaUaa`_aaZa`aaa^aa\_`\	chr10.fa		4541281	F	36	119					
+HWUSI-EAS610	1	4	78	693	1754	0	1	TACAAGGCCGACCACATCTGTCCCACTCTGCACCAG	abaaaa`]`a`a_a`aaaaa\_aaaaa[]a^aa]aS	chr10.fa		4541424	R	36	119					
+HWUSI-EAS610	1	4	32	125	1091	0	1	AATGGGGGGCGTAGAGGCTAGAGATGGGGCCATCTG	`\aaaaaaa_``_`_`_`Z`[_``V`\\`aa^NaU`	chr10.fa		4541632	R	36	119					
+HWUSI-EAS610	1	4	91	690	357	0	1	GCTCTGAGGGCAAAAAGTTACGGAGACTGAGTATGG	^R`U`]ZZY^`_ZVYXa\_aYaUWZZ_ZaT^W\ZSB	chr10.fa		4541690	R	36	114					
+HWUSI-EAS610	1	4	75	528	1750	0	1	AGGGCTCTGAGGGCAAAAAGTTACGGAGACTGAGTA	[aX]a]_U]X_[^\aVT]_\P_`bb_P^a```_bO]	chr10.fa		4541693	R	36	118					
+HWUSI-EAS610	1	4	37	126	1473	0	1	TCTCCGTAACTTTTTGCCCTCAGAGCCCTGGCTGGA	ab\b``VSR]bbaXX\]b^\^QYZ]`ba^aTQZ\]^	chr10.fa		4541700	F	36	118					
+HWUSI-EAS610	1	4	54	327	425	0	1	TGCCCTCAGAGCCCTGGCTGGAGAGCGCGGGAGATT	_a_a_a`aZP]aa_`\\a_aX^`\X\O`QZSDVQSZ	chr10.fa		4541714	F	36	116					
+HWUSI-EAS610	1	4	28	599	166	0	1	CGCGGAGCTCAATCTCCCGCGCTCTCCAGCCAGGGC	_a_aa`a_`^`^_```aaX\``V\_\^``W\Z^\``	chr10.fa		4541724	R	36	119					
+HWUSI-EAS610	1	4	54	1116	938	0	1	TGGAGAGCGCGGGAGATTGAGCTCCGCGCTTATCTC	a`\_^_\[OXVX[Xa^```Z`\[\P`W`Z`^\^Z]W	chr10.fa		4541732	F	36	118					
+HWUSI-EAS610	1	4	44	337	228	0	1	GATTGAGCTCCGCGCTTATCTCCCGCCTTCCCTCGT	_a``^`a_`a`aaa``a^``aaa`a^`^``]a\a^B	chr10.fa		4541746	F	36	115					
+HWUSI-EAS610	1	4	79	875	356	0	1	CACGAGGGAAGGCGGGAGATAAGCGCGGAGCTCAAT	`aa`a`a]a`YYV^\a^`\`a`]]]]a`^`\WR\\`	chr10.fa		4541747	R	36	119					
+HWUSI-EAS610	1	4	79	335	725	0	1	GGTGCACGAGGGAAGGCGGGAGATAAGCGCGGAGCT	_a^aaaaa`aa_`^R^a`a`X^ZZ^Xa`\```UZ\S	chr10.fa		4541751	R	36	119					
+HWUSI-EAS610	1	4	38	591	1947	0	1	ATCTCCCGCCNTCCCTCGTGCACCGCGCCCTCGGGG	_`a^_``\aVDY`Sa\`\X_[\\Y`^BBBBBBBBBB	chr10.fa		4541763	F	10T25	67					
+HWUSI-EAS610	1	4	56	810	1399	0	1	GAGGGGGTCGGTGGTGGGAGGGGCCCCGAGGGCGCG	a^_`aaI^X__`_`T`TZU\OFXZXRUVO]UUF\^^	chr10.fa		4541786	R	21T14	106					
+HWUSI-EAS610	1	4	22	610	1502	0	1	TAGAAATCCTGAGGGGGTCGGTGGTGGGAGGTGCCC	_```[`[^`__\XZ`^^P\^\SaZNX\NKTRNWZZ]	chr10.fa		4541796	R	7G28	83					
+HWUSI-EAS610	1	4	61	201	1995	0	1	GGGAGCTGAGAAGGAGCCCCTAGAAATCCTGAGGGG	_aa`a`aaIaX[a`Za`a`^ZK^XXU^_`\^F_^X`	chr10.fa		4541816	R	27G8	81					
+HWUSI-EAS610	1	4	95	711	1887	0	1	GATGAAAGAATCGAGGAGGGATTGTTTAATTTTCGG	aaabb`^aaaaab`aaaaaa_aaa_aa`[`aa`aaa	chr10.fa		4542029	F	36	119					
+HWUSI-EAS610	1	4	38	1656	40	0	1	AAAGTCAAACTTGCTGGCATTTCTTACACTGAAAAT	aaaXFN`aa``_Z_USYP_^\\UQW^URXKNT^^^]	chr10.fa		4542952	R	4G31	107					
+HWUSI-EAS610	1	4	72	1135	1335	0	1	GGAAAACTGAGGCCAAGTTTTTGCCATTAAGTGGAT	^``[abY]`[HP`````WG^][[`U[XWZNZTBBBB	chr10.fa		4543071	F	36	99					
+HWUSI-EAS610	1	4	49	425	1724	0	1	ACAAAGGCAGATTAAGGAATTCCATACTCCCCCAAT	[bV^`a_ba`a`aa^aaa`aaaababa`baaa_bVa	chr10.fa		4543153	R	36	119					
+HWUSI-EAS610	1	4	23	694	1374	0	1	GCTGTGTGTGTGTTAAGGTCCAGACTCTTATCTTCT	`U`aa[_a_a_aa`__a]MXa__`V\_``S^____a	chr10.fa		4543276	F	36	119					
+HWUSI-EAS610	1	4	43	987	1706	0	1	ACATGCTGACATCATTTTGATTTTTAAGTATTTTTT	a_aaa_baa__aa]aabba_bbaabaaaW`aaaaaa	chr10.fa		4543367	R	36	119					
+HWUSI-EAS610	1	4	19	890	525	0	1	TGTGAGATGAGAATTAGAGCAGTGCGGGCCAAAGGT	aaZ\bbabbabaabaaba[a`bX^ab_a``abaaaR	chr10.fa		4543433	F	36	119					
+HWUSI-EAS610	1	4	40	1676	585	0	1	TGCCCCATCAGCTTCACCTGTGCAGCATGACGCCTG	``^aa`[\`\]]`\`a``\VR\SSQ]VNR]TWZT^Z	chr10.fa		4543654	F	36	118					
+HWUSI-EAS610	1	4	23	571	881	0	1	TTTGGAACCTTCCTGTAATGACTGTGTTAGAAACCA	abbabaabbabaaba`_``aaaba[a_baa^^a`aa	chr10.fa		4544136	F	36	66					
+HWUSI-EAS610	1	4	48	708	1349	0	1	ACAATTGGTGAGTCGATGAAAGACAACCTCTCATGG	abaaaa_WZTV]Waaaa_`]`]YQY___[RRZV\[\	chr10.fa		4544169	R	36	33					
+HWUSI-EAS610	1	4	45	976	355	0	1	TTTTGTACGCGTTGATTTTCCTTGTTATCATGTCCC	abb`a___a_a`a`\_aaaa`a`aa__```___`^\	chr10.fa		4544205	R	36	119					
+HWUSI-EAS610	1	4	13	429	86	0	1	AAGGAAAATCAACGCGTACAAAACACACTAGATAGT	aa_GP[ZZ__^S__\]]XXWMZ_PXFKW[Y^\[P[B	chr10.fa		4544218	F	36	20					
+HWUSI-EAS610	1	4	58	1354	1653	0	1	CGTGCACCTGTTGGCTAACATTTTGACTAAGCTCAG	[__bb`___U\^`[`aSXaa\`[_`_Vb^ZU\`V^^	chr10.fa		4544619	F	36	119					
+HWUSI-EAS610	1	4	14	1453	1023	0	1	GTATAGAATACATTCTTCTAATGGCAGACTATGAAA	`abbaaaaba_]aa`aa`aaa_V``a_W^_a]``aW	chr10.fa		4544835	R	36	119					
+HWUSI-EAS610	1	4	91	1735	1702	0	1	GTATAGAATACATTCTTCTAATGGCAGACTATGAAA	a`b`a`_^a]\aa_^Y`_a__^_]^_[]S_`]__^W	chr10.fa		4544835	R	36	119					
+HWUSI-EAS610	1	4	58	1250	1247	0	1	CACCTCACAATGCTGAATACAGAAACCACCCACTAA	a_YZ_`aa_`aaaX^aaaba^^Y\aW_WDY_`_aa_	chr10.fa		4544920	R	36	117					
+HWUSI-EAS610	1	4	95	1537	1155	0	1	CATCAACTGAAATAGCACACCTCACAATGCTGAATA	`bb_ba_aaWb^^`a_bbbbaaaaa`^R]a`aa___	chr10.fa		4544937	R	36	119					
+HWUSI-EAS610	1	4	86	1501	1538	0	1	CAGACTACCAAAGAGCCAGCCAAAACTTTTTAAGTT	`b`aaabaaaa``a_aaaaa_aS^a_aaaa``_a\a	chr10.fa		4545126	R	36	119					
+HWUSI-EAS610	1	4	74	172	205	0	1	TAAGTCCAACAGAGAACTGAAGCAGATGACTACAAG	aaba_abbababaa`]`aa`aaa`a^Zaa_``a`[^	chr10.fa		4545239	R	36	119					
+HWUSI-EAS610	1	4	31	613	243	0	1	TGGGAGGTGCCCAGGTCGATGACTTTTGAACACAAG	abaaabaZaaabbbaabbaaababbbbbbbababba	chr10.fa		4546170	R	36	119					
+HWUSI-EAS610	1	4	55	1538	158	0	1	GCATCAACCAAGATGTTTACCTGTATGACTATAAGT	aa^aaaaa`a_W__``aaaaa_Q]`^\^_____][[	chr10.fa		4547742	R	36	119					
+HWUSI-EAS610	1	4	31	300	1943	0	1	TGGAGTTGGCTTATAGGTTCAGTCTATTATCGAGGC	aba^^Y_aa^a[_]`aaWab_a_a`baaa`a`U_^`	chr10.fa		4548225	F	36	119					
+HWUSI-EAS610	1	4	86	984	779	0	1	TAGCAGCCTTCGGATAGCGATGTAGAACTCTCAGCT	aba]aa``a^Taa\`[a`a_a`S]a`__a`aZUa^B	chr10.fa		4548300	R	36	43					
+HWUSI-EAS610	1	4	82	253	390	0	1	TACTCCAATACCTAGCCACACCTAATAGTGCCACTC	aabab`_`abaaX_aaaaa]a``aaaaa]aaaa`__	chr10.fa		4548395	F	36	119					
+HWUSI-EAS610	1	4	59	585	1007	0	1	TACTGACAGCACCAGATTTATTTCCACATCTCACTA	_`_bb_[aa_``Xb`IYbb\W\\PV`\Z^a]N]aV`	chr10.fa		4548515	R	36	118					
+HWUSI-EAS610	1	4	80	1027	1306	0	1	TTCCGTAGTTGCATCAAATAGAGTTGGTTGGTTGGT	abaaaR_bX^a^X[_\\Sa\]F_[`XYU]WXX^a_[	chr10.fa		4548768	F	36	117					
+HWUSI-EAS610	1	4	67	1148	1340	0	1	AGTGATGTTGAAGAAACTTAGGTACAGATGAAACCT	ab_bbbbabbbaba_Z^bbba_]baaaaaaa`[`_a	chr10.fa		4548933	R	36	119					
+HWUSI-EAS610	1	4	94	110	69	0	1	AGCCTCACGAATTCCGGGTTGGCCACAGTTTCTCTG	a]a]aaa`b`a`aa`aa^Y\\\^^YW^^UVSU\\W\	chr10.fa		4549093	F	36	119					
+HWUSI-EAS610	1	4	73	1405	72	0	1	AGAAATCAAGTAGCTGTGAATTGCAAGTGAGACTTC	a\aa^_`a^OOY^_\`[V\_]^^Z^_\TNYSYU]_^	chr10.fa		4550194	F	4G31	83					
+HWUSI-EAS610	1	4	49	273	518	0	1	ACAAGCCACAGAGCAAAGGAGTACTTGCTGTTTCAT	`babaaabb_babb`_aa]aa__`bb_aab_aaaaa	chr10.fa		4550981	F	36	119					
+HWUSI-EAS610	1	4	44	881	1271	0	1	GAAGTAGACCATGAAACAGCAAGTACTCCTTTGCTC	aa`___a_^_Waa_a`V_a]^^aZ`X_ZX_^^TWaX	chr10.fa		4550991	R	36	119					
+HWUSI-EAS610	1	4	83	893	4	0	1	ATGTCAACACTCAGTACAGCCTGCGGTTTTTGCCAC	abaa]baaba]a_[`a_Za]`aa_`^S[`YRFVRVB	chr10.fa		4551233	F	36	113					
+HWUSI-EAS610	1	4	72	1260	361	0	1	TGTGAAAAGTTTAGGCCCAGGCAAGGTAGTATACGC	ab_a``^_`]```Z_`_____^^]^_U[RN[][R[W	chr10.fa		4551742	R	36	30					
+HWUSI-EAS610	1	4	55	1784	758	0	1	GCACACTTGTAATTCAGATCTTGAGGTGGGAAGACA	aa`aaaaaa_a_a`a`V^aaaa_]_SX^]]Z^_`_`	chr10.fa		4551824	R	36	119					
+HWUSI-EAS610	1	4	4	1606	1508	0	1	TGATGACAGCGTCCTTTGTCTTACAGAAGCTTTTCA	abaQ[___[UaV^^`aaa_\aa_\__^_`\^W^^_^	chr10.fa		4552235	R	36	34					
+HWUSI-EAS610	1	4	22	212	1814	0	1	CCTTTCTCTCAGTCTCTGCTCCACTTTTTGCCCTTG	ab]`Z^`aa`W`XaU``X^abaR]]\a[]_aaa`aX	chr10.fa		4553461	R	36	40					
+HWUSI-EAS610	1	4	7	328	128	0	1	GGCCAAGGGATGAACTCTGGTCGTTAGGCTTGGCAG	abbabbbbbbabaaaababa_ba`aaaaaaaaaaaa	chr10.fa		4554841	F	36	119					
+HWUSI-EAS610	1	4	72	1393	829	0	1	TACCAGCCCAGCTGTACACGGTATAATTTTATGTTT	aba`aa_a`_a`a_\aa`a`a]______`a`^[Wa_	chr10.fa		4554904	F	36	119					
+HWUSI-EAS610	1	4	80	1188	311	0	1	GCAGGGTCAACCGGGTCTTACAAGAAGTACAATTCT	a`aaabWa_aa`aaaR]a`[_aaa`^_W^]_[]_X_	chr10.fa		4554978	R	36	119					
+HWUSI-EAS610	1	4	11	1603	495	0	1	GCCAGCCTCTTCTGAATATAATGTGTGTTCTTACTC	^a_`UbX[[a]`_Z`babaab_TTZ[[V``_W_\V`	chr10.fa		4555063	R	36	119					
+HWUSI-EAS610	1	4	62	733	1529	0	1	TGGGATCTCACTTGGCCACTGCCAGCCTCTTCTGAA	]b`X]KXZRb\OOaTS]T]R_]abRGMMQ`XFXa^\	chr10.fa		4555083	R	36	115					
+HWUSI-EAS610	1	4	55	564	6	0	1	GAAGAGGCTGGCAGTGGCCAAGCGAGATCCCAGAGA	aX`\T\Z\PRZSRZPZUNRRKTFTFXTSTRTQBBBB	chr10.fa		4555087	F	22T10CTG	81					
+HWUSI-EAS610	1	4	72	719	789	0	1	CACAGGACTGTCATATCTGAAGGGTCTTCACGAAGA	a_^Z^]Vaaa_aa_^``aaa_a_aR\aa[_]a^ZaY	chr10.fa		4555295	R	13A22	83					
+HWUSI-EAS610	1	4	79	46	824	0	1	AGGAGAGTTGACTGATACACAGGACTGTCAAATCTG	VbbMbab_bbbabb`_^a_b]b`[`ab_a\IZaa_a	chr10.fa		4555312	R	36	118					
+HWUSI-EAS610	1	4	89	1643	988	0	1	GTTGTAAGTTGATCTCAGGGCTAACCTGTGAAGACA	a_bbUaa__`^`[`XDU_a_a[aa]^^^][]`]_V]	chr10.fa		4555453	R	36	117					
+HWUSI-EAS610	1	4	43	575	1336	0	1	TAGCCCTGAGATCAACTTACAACGCACCAACGCTGT	aaabaaab]a_aa`a_baaabaaaaaa`aa`bZab^	chr10.fa		4555466	F	36	119					
+HWUSI-EAS610	1	4	85	997	979	0	1	ACAGGCAGCTGTAAGCCATCTGACATGGTGTTGGAT	a`^Y]aaa]^`\_a^[]``^a\\Q\Z`_V`Y^a_ZS	chr10.fa		4556652	F	36	119					
+HWUSI-EAS610	1	4	15	1506	1288	0	1	CTTATTTTATCTGGCAGTAAGTCTATCTTCCCTAGT	abbbbabbaabbb`babababaabaaaaaaaaa`ba	chr10.fa		4557342	R	36	119					
+HWUSI-EAS610	1	4	48	481	1714	0	1	TGAAGTTTAAAAGCTGGGTTCTCTGATGGAACTCAG	aa]^b`a_\]a`\]``[a]_a``a]^``[``a_^Y^	chr10.fa		4557544	R	36	119					
+HWUSI-EAS610	1	4	21	260	267	0	1	GCCAGTGTGGAAGCAAACACTTAAGCCATCTATTAT	aa``b__R`a__``]^_aY_\``^[^]TXYV\`^Y]	chr10.fa		4557588	R	36	119					
+HWUSI-EAS610	1	4	99	332	493	0	1	GTATCCATGACTGACTTCCTTGTTCTAAAGGGTGGA	aabaa_bbbaaaaaaaa`aaaaaa`a``^baaWaaY	chr10.fa		4557654	F	36	119					
+HWUSI-EAS610	1	4	35	1526	1509	0	1	TAAAGGGTGGATTAAAACTCCTTTAAGGTAGTACAG	abaaabaY]`^_a\Vaa`a_]``aa^_`U\aXZX_a	chr10.fa		4557679	F	36	119					
+HWUSI-EAS610	1	4	22	208	40	0	1	GATATGCTAGACCCAAGATGGAGGCAAGCAGATCCC	`ZH]Z`_^OPTaaaV^aZ_Z]P\``UNN`SV\BBBB	chr10.fa		4557771	F	35T	97					
+HWUSI-EAS610	1	4	20	1056	287	0	1	GGCGTAAATATTGCTTGTGCGTCTGTGTCCCGAGCA	`Za_U_NVbaa`aaa`a\aVG]_[_SVW^_\\\`BB	chr10.fa		4557848	R	20A15	98					
+HWUSI-EAS610	1	4	82	525	1417	0	1	GCCCTCTGGCCTATGTGAAATGGGGATATTGAATGT	aa`_`]]_`^^_U`a^a^ZZ`_`_aU[W^__VW\_U	chr10.fa		4557980	F	36	119					
+HWUSI-EAS610	1	4	78	791	1173	0	1	AGAGGGAAGAGGGGTGTGCAGCCCTTCCCACCCTTC	XTP^a```a``]\aKa`__a_a^[a[\\W\^RZ_\^	chr10.fa		4558031	F	36	118					
+HWUSI-EAS610	1	4	14	727	161	0	1	AAGTTTCTGAGCTCCAGCAGCTAGGAAGGGTGGGAA	aab]aba`ba^[a`aaa_aa_a\aa`_```Wa__[\	chr10.fa		4558055	R	36	119					
+HWUSI-EAS610	1	4	61	1779	30	0	1	CAGCCCCTACACGGGTAAGTTTCTGAGCTCCAGCAG	a`K`a`Y_^a]\MKHLXVXVWXBBBBBBBBBBBBBB	chr10.fa		4558071	R	36	56					
+HWUSI-EAS610	1	4	33	1500	1391	0	1	AACTCTTTGCTCACCAAGTTGGTCTAACACCAATGG	Z]FW^_]UXU`^_\\[U[_W\TIZY_ZLWUHXY[]Z	chr10.fa		4558161	R	36	116					
+HWUSI-EAS610	1	4	18	465	601	0	1	TTCCTCAAAGTTCTGTCACATTGAGTCCCTCCTGAT	aab```__W^Taa[`X[`^aaaa[__aa_\Z`__[a	chr10.fa		4559099	R	36	119					
+HWUSI-EAS610	1	4	45	435	1544	0	1	GATCATGCTTGGACTGATTATACTGAACTGAGACTG	`aaaaaa_ababa`aaaaaba_aaa\a_aa]a`_aa	chr10.fa		4559194	R	32C3	82					
+HWUSI-EAS610	1	4	70	175	364	0	1	AACCATTGCTCAGAGGGGGAAAACAAACAAACATGA	a^a_aa[V_W]a`[``aa`R]]X]aZZ_aa_``^`\	chr10.fa		4559614	R	35C	86					
+HWUSI-EAS610	1	4	43	390	1010	0	1	GCAATGGTTTTTTCATCCTTGTAAAAGGAAAGCAGC	a^\aaabZ_`a`_^a]aaa_a_`a_`aa[Y\```__	chr10.fa		4559641	F	36	119					
+HWUSI-EAS610	1	4	3	1048	1777	0	1	ACTCTCCAGATCTCACAAATAGATGGAGTTTATTGT	`^^a^]Z``_]VaVa`^]a^`^a\Z^`a\`X]]X^B	chr10.fa		4560481	F	36	114					
+HWUSI-EAS610	1	4	47	1120	553	0	1	AGTAAGGTTCAAAAGTCAGCCTATGATAAACAGTAA	aa`aab`]a`abbb_^abbaabab`abaaa_ab_ba	chr10.fa		4560942	F	36	119					
+HWUSI-EAS610	1	4	57	176	1224	0	1	GGCTGATCCCCTTTAACCAAGAAATAGCCATCTTAG	aaa`aaaaaaaaaa[_aa```_`]`_`___^_``X_	chr10.fa		4561360	F	36	119					
+HWUSI-EAS610	1	4	56	1090	1232	0	1	TCCCTGGCATGAGTGTAAGGCTCTAACAAGAAGAAA	a__^``\Z_``]`W`]^^^]]`Z__\W^U^Y]_ZY_	chr10.fa		4561527	R	36	119					
+HWUSI-EAS610	1	4	28	675	1074	0	1	AGTGTGTGTGTATATGCATGTATGCATGAGTATATA	abbbabababbbbbbbbbbbabbaaabbbbabbbba	chr10.fa		4562153	F	36	119					
+HWUSI-EAS610	1	4	74	175	547	0	1	GCTGTGATTAACGTTATACAGGACTATCTGCTATGA	aabbabaaa^^ab`^__Ya`aa^a_`^a_`[^^^WQ	chr10.fa		4562960	F	36	119					
+HWUSI-EAS610	1	4	95	434	793	0	1	GGCAGAGAGTCGCATGCCTCTAATCCCAGCACAAGA	aaaaa\_aaX^_a^[`^^[[a_^_^^[[`]\^]^aa	chr10.fa		4563086	R	36	119					
+HWUSI-EAS610	1	4	3	1236	1148	0	1	GCATGCGACTCTCTGCCTGACTTTTCATTCATCTCT	a``a][^JYaUXQ_`]_`a`__aU_XN]`^Z]QaT_	chr10.fa		4563105	F	36	118					
+HWUSI-EAS610	1	4	69	972	1727	0	1	AGTTCATAGATGTTGTAGAGTAATAAAATTCTGCCA	V_]abaa_^S[`[````b`aY^b^W^a^abYS_Vbb	chr10.fa		4563173	R	36	119					
+HWUSI-EAS610	1	4	100	1060	115	0	1	TGTCAGTCTCTAGCTCTGCGTGAGTTCATAGATGTT	``U]TLVH_WS[`]a_^`]aX_W\W_GU^PLRTPZV	chr10.fa		4563195	R	36	116					
+HWUSI-EAS610	1	4	85	842	23	0	1	GGAGAAGTAAGAACACCAAGTGGCATCGCTGAGGTG	``\]_^aaa_a_aUQV`a[TMa_P[V]X[_RKRYG_	chr10.fa		4563321	F	36	117					
+HWUSI-EAS610	1	4	92	433	944	0	1	TGGGCTACTTCCACATAAACGTCTTCTCTCTGCAGG	abYVUUUUY^\aTZZ^_]aa^WWSUU_XXV\^QZUV	chr10.fa		4563428	R	36	118					
+HWUSI-EAS610	1	4	68	539	603	0	1	AAAAACAGACATCATTTGGGCTACTTCCACATAAAC	`X`Taa_]S_U``_a_`X`Za``___^aa[__Y___	chr10.fa		4563444	R	36	119					
+HWUSI-EAS610	1	4	50	558	1363	0	1	AAATTTTCTGGAGCTGGAGATATGGCCCAATGGTTA	`_^aa``\a``[]\aba\a`aa`a^XZX]ZZaW]\Y	chr10.fa		4563576	F	36	119					
+HWUSI-EAS610	1	4	70	701	1797	0	1	TGGGTCAACAACATAAAATCAAATACTAGCAGCTGG	``b^`aaba`baba[aababbbaababaaaaaa_aa	chr10.fa		4563875	F	36	119					
+HWUSI-EAS610	1	4	65	1049	283	0	1	ATTTAGGAGAAAGGTTACATAGCATCATTTCATGTA	aabaaaaaaaaaaa`bbababaaaaaaaaa_a`b_a	chr10.fa		4564380	R	36	119					
+HWUSI-EAS610	1	4	26	446	1823	0	1	AAAGGTTTTATGTCTTTTATTTGGGAACTGGATGAT	a_aaa]aaaaaa_aa`aa_aaa_`_Ya``_`]`a__	chr10.fa		4564730	F	36	36					
+HWUSI-EAS610	1	4	66	1660	693	0	1	AATTTTTAGTACAACAGGAAAGTATAGATGACTCAA	a]bbbbab\]aYba_abX\aa`YaaU_a^]___\aa	chr10.fa		4564792	F	36	119					
+HWUSI-EAS610	1	4	74	935	85	0	1	ACACAGGGAGCTCTAAGGATGCAGTTTTTGTGAGGT	a[`PDRUUFMMVY]NN[XYYRZRVQVLOX_UTFQ^S	chr10.fa		4564852	R	36	112					
+HWUSI-EAS610	1	4	86	527	582	0	1	ACCAGCTAACCTGGCTGCCAGTCACACAGGGAGCTC	a^a`^``]^\[^^a]^[^^^`\[Z^\]ZTZTS\Z\\	chr10.fa		4564875	R	36	119					
+HWUSI-EAS610	1	4	38	1429	127	0	1	GGTTAGCTGGTTGGAGAGCCTCTTCTTCCAAGCCAT	R_`ba]ab]^[bXZaZaaab`b`aababaa`_`a`a	chr10.fa		4564900	F	36	119					
+HWUSI-EAS610	1	4	2	630	1068	0	1	GAGTAACAATGGCTTGGAAGAAGAGGCTCTCCAACC	a_a\`a[]_aaa`^_``___\^__U_\^_UVWW_ZU	chr10.fa		4564908	R	36	119					
+HWUSI-EAS610	1	4	70	435	302	0	1	GAAGTGAGGAGAGGGATTCTTTAAGTCTGAAAGTAA	aa_a_a]aaa_aa`_\\\_`aa_]`]`_``__`]__	chr10.fa		4565029	R	36	119					
+HWUSI-EAS610	1	4	31	641	720	0	1	AAGAAAAGGATAGTGTACAAATTGAAACACTCCCTC	aaaa_a`aa`aaa^b`a`a_`aa^^a``___^__``	chr10.fa		4565067	R	36	119					
+HWUSI-EAS610	1	4	34	1290	1538	0	1	GGAATTGGATGCTCAATGAACCGATACTCAAGGAAA	`][_aaa`_][]]WQ_a^[`]]V]a[T\XX\[a]]^	chr10.fa		4565232	F	36	119					
+HWUSI-EAS610	1	4	23	854	1040	0	1	ATGAAAGTTAATTACAAGGTTCTACATAAACTGTAA	^bbaaaa_a`\aaa`aaaa___^__]`\^_^_a]``	chr10.fa		4565614	F	36	119					
+HWUSI-EAS610	1	4	39	163	580	0	1	TACAAGGTTCTACATAAACTGTAATTTTTCATATTC	_V`V]a[aab`[aa`[abaab^aabaaba^^aaaaa	chr10.fa		4565626	F	36	119					
+HWUSI-EAS610	1	4	29	644	429	0	1	ATTGTATTTGTACTGCAACCTATGAAAGCACTGTGC	G]babbb\b\_b^_ba_bb\aa^Z\[Ybbaabbb`b	chr10.fa		4565744	F	T35	107					
+HWUSI-EAS610	1	4	36	1503	218	0	1	GGGGTTTGATTGGCTCCTCCAATTTATATCTAATTT	aa^`R^]Q^`]WP__aaa``___`^^SZZX^Z^_^W	chr10.fa		4565868	F	36	118					
+HWUSI-EAS610	1	4	67	443	259	0	1	AACTCAAGAAATTAGATATAAATTGGAGGAGCCAAT	abaaaaaaaaaabaaaaaaa`aaaaa_aa_a__`aa	chr10.fa		4565876	R	36	119					
+HWUSI-EAS610	1	4	45	1503	108	0	1	TATGTATTCACTTAACCTGCAAAACATCATGGATTG	`aa_[aaa^`_aaaa_a`\``_aa]^``aYXY^^[W	chr10.fa		4566358	F	36	119					
+HWUSI-EAS610	1	4	52	479	674	0	1	TGCTTAAGATATTAGAAGATCAGCCCACAATGTGTA	ababbaabaaabbaaaabaaaaaaaaaaaaaa]a_a	chr10.fa		4566507	R	36	119					
+HWUSI-EAS610	1	4	93	445	1399	0	1	GTTACTGGGTGACTAACTTTCATAGAACCAGAGAGT	aaa]a`aaa]aa`a`Z^aa_a`a[```_`^`aaT`Y	chr10.fa		4566793	F	36	119					
+HWUSI-EAS610	1	4	15	1059	1370	0	1	GAGTAAAGCAGAAAATTCTCATGACAGATACTTCAT	a_`^`_`_`^____``^aa___^ZV]`]]^YW^^W]	chr10.fa		4566912	R	36	119					
+HWUSI-EAS610	1	4	96	795	1241	0	1	AATTGAATAATACTAAATCAAATTTAAAATATCATT	aa`aaa_a_a_aYa_aTaaa_aaaa_a^aaaaYaa`	chr10.fa		4568635	R	36	119					
+HWUSI-EAS610	1	4	4	978	572	0	1	CTGTCTCTAGGACCCTGTGATCCTGGTGTAACCAAC	^^ZZ\aV][T`a_]^aaXaZOO_aa\Ma\WVQYYa_	chr10.fa		4569206	R	8G20G6	30					
+HWUSI-EAS610	1	4	5	210	695	0	1	CAAACAGGTGAAGGAAATGATCAAAACCATTCAAGA	a_`a_```Za_\aa__Y]a_``U`_a\a_]_^[_Z_	chr10.fa		4569686	F	36	27					
+HWUSI-EAS610	1	4	54	1134	135	0	1	ATGGGACATGATGAAAGCATTCCTACGAGGAAAACT	^ZT[P]U^aYV^_OW^SVX\UTZ^VNQW^[_aaXPZ	chr10.fa		4571421	F	36	23					
+HWUSI-EAS610	1	4	19	1643	923	0	1	TGGAGTGTGTAGCAGAGCTCTCTGAATTCAGAGGGC	aa]L][aU`[a^[^a``a_Z__]UPZ_^UTPYRU[Z	chr10.fa		4572740	R	36	118					
+HWUSI-EAS610	1	4	75	975	438	0	1	GGCAGCTGAGAGGCCTGGAAGCACTCACGAGGCAGG	_a`aZ_^X`QXW\_^a``\aXZR^_Z_Za\XaU[[`	chr10.fa		4572789	F	36	44					
+HWUSI-EAS610	1	4	63	645	411	0	1	AGGGACCAAAGAGGGTCTACGGCAGAACTCTGGAGT	aa`abaaaaab]bZa^aaaaab_aa_`^``_]a^aZ	chr10.fa		4573779	F	36	119					
+HWUSI-EAS610	1	4	84	1022	544	0	1	AAGAGGGTCTACGGCAGAACTCTGGAGTGAGCTGTC	a^a_aa^\Z`^X]`aaaZb^a^`_^\^\a]aP]a]]	chr10.fa		4573787	F	36	119					
+HWUSI-EAS610	1	4	93	846	37	0	1	CGGTGCTGGACTCTCTCCTTTGCCTGCTTGCCTTGT	aabaZP_b`aRbaaabZabba]`\aa^[aa\]_`b`	chr10.fa		4573913	F	36	119					
+HWUSI-EAS610	1	4	50	1395	1223	0	1	CACACACACTGGTGGACAGGAGTTGCAGGCAGGGCA	_a_a`a_a^a_TT[`]a`_`^_\`X]``^\]\\`VW	chr10.fa		4574367	F	36	119					
+HWUSI-EAS610	1	4	5	958	404	0	1	AGTTGCAGGCAGGGCAGTGGTGACTATAGATCAGAG	aaaaaaaaaaa`_\^_a`aaZa__`aaa`^[\_`^_	chr10.fa		4574387	F	36	119					
+HWUSI-EAS610	1	4	78	236	24	0	1	TGAATTTGTGCTAGGCTATGCAAACGTTGTGCTTTG	a`ababbbaab_bbaba_^a_ab[^a^`a_`T__``	chr10.fa		4575208	F	36	119					
+HWUSI-EAS610	1	4	72	1183	805	0	1	TTATCCTCCATTTCAGTCTACATTGCCTCAGGGACA	Yb`^]U]R`bba]_X_`baaa]a]``P_`^^\O``Y	chr10.fa		4575300	F	36	119					
+HWUSI-EAS610	1	4	51	1566	725	0	1	GCTGGCACTGAGGTTCTTGTCCATGCTGGGCTTGTT	aab`aab`aaaa]^baaaaaaaaa````]]__a`^`	chr10.fa		4575356	R	36	119					
+HWUSI-EAS610	1	4	58	1082	1406	0	1	GTCTACCCATACACAAAACCTCAGAATTTCTTTGCT	aa]a`\]]`a_^a^`a`^]]a^``^]__`^___]T_	chr10.fa		4575506	F	36	119					
+HWUSI-EAS610	1	4	33	1719	1507	0	1	ATCAGACAGGTGGATCCTAGGATCACTCTGGTGGGC	aaaa`a_`^MY]]]_Wa]a_aa`_a`_`^XQPTNZ`	chr10.fa		4576339	F	36	118					
+HWUSI-EAS610	1	4	67	417	931	0	1	GTGGATCCTAGGATCACTCTGGTGGGCCAGTCTAGC	aaaaZ`^`XQ[`\VRababaa]Va`[XaW^P^aXXX	chr10.fa		4576348	F	36	118					
+HWUSI-EAS610	1	4	92	593	1842	0	1	CATCAGTGAAGTGCATGTACAGGAGAGAGTGAGAGA	aa]baaV`aa_TaaYaaY_aaa`__U[^_Y`]`_`_	chr10.fa		4576550	R	36	119					
+HWUSI-EAS610	1	4	69	1374	638	0	1	CTGCATTTTTGTTCCTGTAGTTCTTCAGTTAAAAAC	`_Vbbbb_a^]aX^^Y^[OWa`^^^V[][]UY]_[\	chr10.fa		4577236	F	36	119					
+HWUSI-EAS610	1	4	5	915	464	0	1	TTCTATATGTACATATACTGAAGTAGATGTTTCACG	aaaaaa_a__`_`a_aa^`a_[^\__]^`\`_Y`^`	chr10.fa		4577742	F	36	119					
+HWUSI-EAS610	1	4	41	908	1732	0	1	TTGGGCAGAGGTGAAGGAAACAGATTGCTATTGACC	aba`_aaaaaa]a``a`]`a_^aYaa_]`a^]_^_\	chr10.fa		4577782	F	36	119					
+HWUSI-EAS610	1	4	40	1393	356	0	1	CAGAGAGTTTTCCCCTTTGGATATTTATTCAGGAAT	aab_b_`[aba_RY]aa`a``a`_aa`___X`_]\_	chr10.fa		4578084	R	36	119					
+HWUSI-EAS610	1	4	5	746	368	0	1	CAAGCTCTGGCAAAGTCAACTGAGCAGCAACTGGGG	ab^^`b`aabbbbab]aaa`bbbaaa`V_aaaaaaa	chr10.fa		4578143	F	36	119					
+HWUSI-EAS610	1	4	75	1258	1268	0	1	TAGCAGTTCACAGCTGATGAAGCAAAACAGAAGGTA	`b``aa]aab]aa``b_^a^`a_a`aa^`^`aa`Xa	chr10.fa		4579338	F	36	119					
+HWUSI-EAS610	1	4	2	44	818	0	1	GATGAAGCAAAACAGAAGGTATGTGCTGGTATTTTA	`O^a_LUa`[`U`_a[aX`^`^][a^X^^QS_QLZX	chr10.fa		4579353	F	36	118					
+HWUSI-EAS610	1	4	72	1665	1800	0	1	AATTAGCCACAGCACATGTAGTCAGTATCACAGTAG	aa_`b__`^aaY_R\[]^^`Y_Za^X_^[^^_JZa^	chr10.fa		4579485	F	36	118					
+HWUSI-EAS610	1	4	25	1575	1386	0	1	AAATCTGTACACCCTTACTGTTATTAAGTTCTCATT	a_b`W_`[`ab``^ab`aa`abaa`_aZ\VW_T[_a	chr10.fa		4579659	F	36	119					
+HWUSI-EAS610	1	4	35	1200	1317	0	1	AAAGGATATCCAGGTACCTCTCCCACAGTTCTTTAT	``aa_`a``_]`\]Pa_Z_U`[[XZNR]]]V`_`__	chr10.fa		4579699	F	36	118					
+HWUSI-EAS610	1	4	64	95	1181	0	1	AGAGATCTCTCATAACCTGATCTGTTCTGACTGTTG	]YS`Z_aa_ba`W^`a`Z[Y]``ba]baaabaa_]`	chr10.fa		4579971	F	36	119					
+HWUSI-EAS610	1	4	90	1607	870	0	1	CAGCATTGATAGTTCTTTCTATGGCTATTGCCTCCT	aabaaaaa`aa`abababbabaaXaa^W]UZXOV_R	chr10.fa		4580139	F	36	119					
+HWUSI-EAS610	1	4	66	988	1476	0	1	GGCCTAGAGTTGTCAAATGCTTTAGCAATGACTCTA	^]FR_U^TX`aaa\OZY_\Y`X^Z_\]_W`^W]]]T	chr10.fa		4580206	R	2T33	108					
+HWUSI-EAS610	1	4	16	369	317	0	1	AACCAAAAGAAAAAAGGCAAGGAAAGCAACCATGAC	a__`a`W`_____\^`^a_a`]]a_^_^^[_`_`a^	chr10.fa		4580406	R	36	119					
+HWUSI-EAS610	1	4	22	1630	1853	0	1	AAAATAAAATAAAATAACAACAACCAAAAGAAAAAA	[`a`[_`bb]\^`bbbbbbbaabZaYSG__a`\aa`	chr10.fa		4580427	R	36	31					
+HWUSI-EAS610	1	4	15	821	1599	0	1	TGGAGCGGTGCTGCTTACAGACTTGCTCCTCATGGC	^_YbZb__aab`U`bab]`abbZabZaa_b]]]a`a	chr10.fa		4580679	R	36	45					
+HWUSI-EAS610	1	4	57	74	952	0	1	ATGAGGAGCAAGTCTGTAAGCAGCACCGCTCCATGG	X`\]_b_b]T]a_aa`^_]____^a`aa`WY_\`]Z	chr10.fa		4580682	F	36	42					
+HWUSI-EAS610	1	4	4	253	926	0	1	ACCACGCCCGGCAGACTCTATGTTTTAGCTGCAGTA	aaaaaa`a_`_`a`aa`\``aaS\a`_\_\_\\aW`	chr10.fa		4581262	F	36	119					
+HWUSI-EAS610	1	4	39	830	1777	0	1	TGTGTTGGATTGATAACTGAAGGCATGATGCTGGAC	_ba_Sbbb]b`b```^aab_a`_bb]_aaaaaaaaa	chr10.fa		4581336	F	36	119					
+HWUSI-EAS610	1	4	67	246	782	0	1	TGGTCCAGCATCATGCCTTCAGTTATCAATCCAACA	aaaYa_O_a_W_`aa^]^aXU```a]`Ya`]Za^^S	chr10.fa		4581338	R	36	119					
+HWUSI-EAS610	1	4	35	394	339	0	1	AGACTTTTATTCTGACTGAGAACTCATAGAAAAGAA	abbbababbaaaabaaabaa__`aaaaaaaab`a`a	chr10.fa		4581398	F	36	119					
+HWUSI-EAS610	1	4	85	540	1828	0	1	CCCACTTCAGAAGCTAGTCATTGTTAGATGACTCAG	abaaaaaa]\ba`a`[aZaaa`a\a_^_^\``_a`^	chr10.fa		4581480	R	36	119					
+HWUSI-EAS610	1	4	64	1660	1333	0	1	TGTCTTTTAAGAGAATATTTTGCTGAGAACAGAACT	\bV`b`aaaTb^M\TT\V_a]`VaRLY]`^\a^a]a	chr10.fa		4581569	F	36	118					
+HWUSI-EAS610	1	4	70	431	307	0	1	TGAGCTGACATACCCAACAAAGGGGAGAGAGAACCT	a_]aa_aaaaaaa`[aaaaaaaa`a_a`a_^__\__	chr10.fa		4581802	R	36	31					
+HWUSI-EAS610	1	4	49	92	1446	0	1	CTAGAGAGTCACAGTTTTTCCACTCCATACTCGGAA	_`__\ZNMS_RXWS_`\Q_`_IVba[T[[_MIXZ\B	chr10.fa		4582184	F	31A4	99					
+HWUSI-EAS610	1	4	41	526	1652	0	1	GTAGCTGGTTTCAGACATTCCCCTATAACAATGAAA	a^b`aaaa_aaa]a`aaa`aa\``aaaaa`]`\ZW]	chr10.fa		4582996	R	36	119					
+HWUSI-EAS610	1	4	98	1010	1539	0	1	GCCAGGGACTCAGAGCAGGGAATGAGGTCTCATGGT	aaaZ`bX^]aSbaaa``aba``a_a`aT`aV```Z\	chr10.fa		4583146	F	36	119					
+HWUSI-EAS610	1	4	67	1564	294	0	1	GGGGCATGGTTCTTTTCAAGACATGGTTTCTTTGTG	V_VUb``]`]TF]bb^ab`]aa`_`aYa^_aaaS`b	chr10.fa		4583405	F	36	117					
+HWUSI-EAS610	1	4	56	625	1472	0	1	GCACATTGTTGCCAATACTTAGAGCCGAGAGAACTT	``_`aa[a]```__\_^Ra^O[^_^_]RU[]S_]Z`	chr10.fa		4583607	R	36	118					
+HWUSI-EAS610	1	4	49	1346	1502	0	1	AGTGGTTGATGGCCACTTGCATTATGCCCGGGGGAC	aaY^^`]XV]]`THXU^a]``[T_\^\]\TO[V[P^	chr10.fa		4583753	R	36	118					
+HWUSI-EAS610	1	4	23	8	1550	0	1	ATGGCCAACTCCATTACACTAACTCAAGAGTTCATT	a_IZab^aa_Z^Xaa`_a__T\a_W_`a[U[^a__X	chr10.fa		4583800	R	2T33	105					
+HWUSI-EAS610	1	4	36	1624	1586	0	1	TGCCTCTGTGGATGAAGCACTTGCCCTTCAATNCTG	SWb`a`_[Z[T^]baabRR\]RRMDNRVV^BBBBBB	chr10.fa		4584815	R	31GC3	85					
+HWUSI-EAS610	1	4	33	504	1564	0	1	GAGATGCCTCTGTGGATGAAGCACTTGCCCTTCAAG	aW^]_`_a`__`\_XX`[ZPVW_\_\_``\^_RV\Y	chr10.fa		4584819	R	36	119					
+HWUSI-EAS610	1	4	2	1416	487	0	1	CTAAAACAACTACTACAAGAAAACAAAACAAAGAAA	aa_`ab_W_``[a_^`QVX`_Z\\Z_X]P[J[Y_ab	chr10.fa		4584927	F	36	118					
+HWUSI-EAS610	1	4	60	1131	940	0	1	TCTTGGACATTTGTCACTAGCCTTTAGATGATTTTT	a`_`a`_T_`a`a__^_a_`a__aa^a^aaVa_\aa	chr10.fa		4585354	R	36	119					
+HWUSI-EAS610	1	4	95	555	118	0	1	CTCTACAGAAAGAAATGTAAGGATGAATTTCCTTAA	aaaaabbaab``Yb`a``abaa`aa___aa]aaaa`	chr10.fa		4586084	F	36	119					
+HWUSI-EAS610	1	4	86	612	1962	0	1	GTAAACTGTATGAACATAATGATGATGGCTAATATC	a`_aaa`a]`aa`a`aaa`_a_a``_`__a_^a__a	chr10.fa		4586326	F	36	119					
+HWUSI-EAS610	1	4	60	338	43	0	1	AGAATGAGGGGCAAGATGCCATTTACAAGCTTCAGG	aba^^_HU^aa\`R]ZUa`]]X^`]\VTaX``SY]\	chr10.fa		4586395	F	36	118					
+HWUSI-EAS610	1	4	1	108	462	0	1	GAAGCATCACCTGTCAATAAAAAAGTTTATGGCCAA	a]]a`\T`aNaa`[_aX_RGQURSXW`W`Y^YZZ^W	chr10.fa		4587032	F	36	18					
+HWUSI-EAS610	1	4	4	275	1925	0	1	GTGGCACTTGCTTGTAATCTTAGTCTAGCCTGGTTC	aabVbbb]a_b`Y```Vab\WVba]_bYaN]_XY]a	chr10.fa		4587529	R	36	119					
+HWUSI-EAS610	1	4	33	88	94	0	1	AAGCAAGTGCCACCAGGCCCTCCTGCTTATTAGATG	_a`b`]`V_aabba``_aa_\``Xa_^`a__a_]XB	chr10.fa		4587552	F	36	115					
+HWUSI-EAS610	1	4	39	1074	658	0	1	GGGGTTGTTTGTCTATCTCTTGTCACCAGTGACTGT	a`ba_aa^a\`\`a`a_aaa`a___^[``Ua][Y^]	chr10.fa		4587772	F	36	119					
+HWUSI-EAS610	1	4	33	762	1967	0	1	AACACAGAATCTTGCAGTAGGGATAGCCAACTCTAA	abab`babbaa`aa^a_Uaa`aa`aa__`aa_^`a_	chr10.fa		4587828	R	36	119					
+HWUSI-EAS610	1	4	43	1033	1741	0	1	TACACTGACTGTTCACAAACACCACCATTTACTGGG	aaab_baa^_a]b]a`aaa`a\^`_`Ya_a`Yaa_a	chr10.fa		4587883	R	36	119					
+HWUSI-EAS610	1	4	77	143	1625	0	1	CATTTTGAGAAAGCTCAGTACGTGGTGACCTAGAAA	abbabbbaa``bbbaaabZ]aa_baWaaaaa`a__^	chr10.fa		4588233	F	36	119					
+HWUSI-EAS610	1	4	79	854	487	0	1	AGAAAGCTCAGTACGTGGTGACCTAGAAATCTTTAG	Ta_b^babaX`WZaaabaa`aXU\^[][WaS_`_S_	chr10.fa		4588240	F	36	119					
+HWUSI-EAS610	1	4	94	1396	401	0	1	CAACACTTACGGGTCCCAAAATACGTATTGTGTTGT	]baaaQab^_QWRSV]Z`aU__a_aNQ`RH]]_TBB	chr10.fa		4588329	F	36	109					
+HWUSI-EAS610	1	4	10	1204	169	0	1	GGGCTAAATGTGTTGGCATGTCTTGTGGTTTTCTAT	Vababbb\aa__bYabWa`bab__a_a`abWb`M\a	chr10.fa		4588466	F	36	119					
+HWUSI-EAS610	1	4	34	764	1558	0	1	GTANGCACTCTTTGAGGGCTCCTGGTGATCAAGCTC	aa^D^]a`a_aaa_^_TZ\aa^aa`V^^^[`^^^`^	chr10.fa		4588947	R	3A32	110					
+HWUSI-EAS610	1	4	34	1741	1927	0	1	TTCATAATTTTGCTATATTTGCATCTAGTACCAAAT	aa_aa_a_aa_`_aaaaaaa_]`__a_^[_YZ`_]`	chr10.fa		4589255	F	36	119					
+HWUSI-EAS610	1	4	6	50	1696	0	1	AGTGAACACAGATTTAAATTCTATACTTCTCTTACT	__^b_OXYaZ\W\a_`S\`\aaa]]^_aa_a_]W^]	chr10.fa		4589477	F	36	119					
+HWUSI-EAS610	1	4	18	364	189	0	1	ATAACATCTTTGTGCAGTTTACAGTGCTATCAATTA	_`b`abb]aabaaaaa`Z^_^`T]^b`][_`[`aaX	chr10.fa		4589605	R	36	119					
+HWUSI-EAS610	1	4	71	756	352	0	1	AAAGTACATTTTGAACATTACATTATTACTGATGAG	aabb^aaaabaabaaaabaaa`baabaa`bba`b_b	chr10.fa		4590906	R	36	119					
+HWUSI-EAS610	1	4	3	64	1835	0	1	TGAGCAGAGCAATTCCTTGAGAAGCCAAGAGAAGCC	aTH_aa`]`bZQ_abbbbb``]bbbb_bbaaU^aba	chr10.fa		4591210	R	36	118					
+HWUSI-EAS610	1	4	46	699	1431	0	1	AACAGATTGCCAGAGTTAGTTTGGGGATGAGCAGAG	aa]___aaa\_V^^a]a]aZaaa_`a_`\^`]_aRV	chr10.fa		4591237	R	36	119					
+HWUSI-EAS610	1	4	99	242	760	0	1	AACAGATTGCCAGAGTTAGTTTGGGGATGAGCAGAG	Ubb^a_abbaaVaQaP[T`Sa`Sa`aa`]]aaaaaa	chr10.fa		4591237	R	36	119					
+HWUSI-EAS610	1	4	89	1062	1914	0	1	AGGCAGTTGAAGCCAGAGAATACGATGGAGCCAGAA	aaaa_a__a`a_`_`a___`a_Va[^XX[^_^Z^Z_	chr10.fa		4591279	R	36	26					
+HWUSI-EAS610	1	4	79	1346	678	0	1	CAGTCAGCAGAGGCAGTTGAAGCCAGGGAATACGAT	aaa_aaZabaa[a`b^BBBBBBBBBBBBBBBBBBBB	chr10.fa		4591289	R	26A9	6					
+HWUSI-EAS610	1	4	69	1180	76	0	1	ATTCTCTGGCTTCAACTGCCTCTGCTGACTGCACTG	aa_^`_YW\\Z_Q_\]S_^__WQFRRQVW\SSVVWQ	chr10.fa		4591294	F	36	22					
+HWUSI-EAS610	1	4	30	950	9	0	1	TCCAACTGACTCACTTCTCCTCAACTGCCCTGCATG	a_bb]\baaabaaaa`aa`aa_aaaaa__Q_aa^a_	chr10.fa		4591374	F	36	119					
+HWUSI-EAS610	1	4	17	492	1200	0	1	CAAAAAATGACATCTAATTGAGGGGCAGACAAAGTG	aaa_\SJ_`aaaa`]]aaaa^^^a^\YaZ^\_`aXa	chr10.fa		4591484	R	36	22					
+HWUSI-EAS610	1	4	23	1314	717	0	1	CAACAATTTTCCTGGCCCTCTGTTCTTGTTTTAAGT	abbbbabaa`a`aG_aa^a_b^^_^__]aa``_X^_	chr10.fa		4591760	R	36	118					
+HWUSI-EAS610	1	4	53	1522	817	0	1	AGATCAATGGAATAGAATTGAAGACCCAACAGTGAA	aaaaa``ba_]aaa`a`aba`__a_`_aa[`_[_^a	chr10.fa		4592509	R	36	26					
+HWUSI-EAS610	1	4	81	1666	487	0	1	ACAAAATATCACTATTTGCAGATAGTATACTTAAGT	aabbbbaaa`a``aa`_Y_a`a_]PZa`^^`aa^\^	chr10.fa		4593095	R	36	31					
+HWUSI-EAS610	1	4	26	1659	308	0	1	AAAGTTAAATCTGTATCAGATAAACCAGCTAAACAG	aa]YGY`aaU_^]V`^a`\__UU_[\]OUZ]^_Z]B	chr10.fa		4593881	R	36	19					
+HWUSI-EAS610	1	4	47	797	1955	0	1	TTTAGCTGGTTTATCTGATACAGATTTAACTTTGGT	abb`\\a`X^b__a`a`_a`^___`aa_`Waa`_`U	chr10.fa		4593884	F	36	45					
+HWUSI-EAS610	1	4	1	1108	799	0	1	CAACAGATACAAGAAGACTGACATGATCCCATGCAT	aaa^Y^babab_a`[]a_aaKb]ab[X[a``\Y^aa	chr10.fa		4594572	R	36	23					
+HWUSI-EAS610	1	4	68	1373	600	0	1	TCTGCTTTTTCTAAGGTATATTTTCCCTCCTTTTGT	aNV\\^X^^]HVUXQP][YXMZY[OXYPTWZ`aa_a	chr10.fa		4595307	F	36	29					
+HWUSI-EAS610	1	4	77	851	1619	0	1	CTGCCCAGGATCTTCTAGGTTTCATAGTCTCTGTAA	aaa`^bZ_`a_aab`b]ba^_`^_a]ba\aYaa^Y`	chr10.fa		4595499	F	36	6					
+HWUSI-EAS610	1	4	27	597	1069	0	1	CTGGGTTCTGATGATGCCAAATACCTGTGGTTTTTG	abbab_abbbbbbbab]abb`b^aa`b]aa\ababa	chr10.fa		4596305	F	36	59					
+HWUSI-EAS610	1	4	61	1045	1524	0	1	ATACCTGTGGTTTTTGTTGCTTATGTTCTTGTGCTT	ab\aabb_aa]aba_b^aa`a`abb_a_a`a__S`a	chr10.fa		4596325	F	36	119					
+HWUSI-EAS610	1	4	57	1735	827	0	1	AGAACTGGTCTCACAGGAGTATTGATACACAGGCTT	^N]``a`YX\^aa^]V\^Y]a``[]^_P_\`ZSJ[_	chr10.fa		4596432	R	36	27					
+HWUSI-EAS610	1	4	19	240	426	0	1	CTGTGTATCAATACTCCTGTGAGACCAGTTCTCTCC	a_`a_W[baabaaaba]^aaaZ`a\aaa\`a`aaa`	chr10.fa		4596436	F	36	47					
+HWUSI-EAS610	1	4	27	452	371	0	1	TGTGGGATTTGGATATGGAGAGTTGCGGCACAAGGT	H\K]b`]_`P\^^a^YT__`][IabH_[UZHSbaUB	chr10.fa		4596677	F	25T10	99					
+HWUSI-EAS610	1	4	47	1208	1803	0	1	TCTGTGCCTGATCTGACCTTGTGCCACAACTCTCCA	]`abaa_XaaaV__b`R\a_a[S_[a_abXaH^a`a	chr10.fa		4596692	R	36	118					
+HWUSI-EAS610	1	4	66	369	1746	0	1	TGTTTTTCCAATGACTGTTGTCCTTTTGCTCCTTGA	ab_aabab````_X`aaYaa__a^WZXNY]R][a\\	chr10.fa		4598792	R	36	119					
+HWUSI-EAS610	1	4	97	16	1746	0	1	ATGTGTGTGAGTGTATTTGTCTCTCCTTTTTTCTTT	aaaV`ab\`]aab_`a^a`LF\a_aaXa_```VZBB	chr10.fa		4599088	F	20A15	99					
+HWUSI-EAS610	1	4	83	735	1481	0	1	GCATATGATCTTCACAATACCATGTGCCTCTCCTCC	_bba`Za[SZ``a^aba_[Xa]_QRZ^QRWSY]\a^	chr10.fa		4599390	F	36	23					
+HWUSI-EAS610	1	4	26	1025	1603	0	1	ACAAAACTAGCCAGTACAGGGTTGCAGACCCCTTTA	^]_a[[N]ZDPS^XH^W`]aX[W[WX]NPPTSRLF_	chr10.fa		4599905	F	36	15					
+HWUSI-EAS610	1	4	31	1252	1653	0	1	CATATGCAATAGTGCCTGGGTTTGGTGGTCCTATAT	a\_\\aUabbab]ULYa_b\R_]VVWbZDU[U`T_T	chr10.fa		4600092	F	36	7					
+HWUSI-EAS610	1	4	56	167	164	0	1	CAGAAGAGGAATTACTGGATCTTCCGGTAATACTAT	a`a_Z^__`_a`aa`___[]`]_`_a[TUV[^W\S[	chr10.fa		4600621	F	36	37					
+HWUSI-EAS610	1	4	30	916	297	0	1	AGAAGAGGAATTACTGGATCTTCCGGTAATACTATG	abaaaaa``aaaa_a`aaa`aaa_a`^`_`_\a__a	chr10.fa		4600622	F	36	55					
+HWUSI-EAS610	1	4	96	1041	1384	0	1	TGGGGAAACGCCTCAAAGATATGGGCACATGGGAAA	aabb_aaabaa`a_aaaba]FY`_`]a]`U_aa_`[	chr10.fa		4601115	R	36	11					
+HWUSI-EAS610	1	4	32	1261	1945	0	1	ATGGTAAAAGAACCTCTGTTGGAATCTCCATGCCTG	abaQJXa`^VYa`^[NY]_aa`^_`]Z^PZUSV][Z	chr10.fa		4601467	R	36	21					
+HWUSI-EAS610	1	4	18	97	1290	0	1	ACCACCTGATCATATCGTTAGATGCTGAGAAAGCAC	aab^`a_``````a`a_UY]_`^_aX_\_``V^_W[	chr10.fa		4602275	R	36	28					
+HWUSI-EAS610	1	4	77	685	164	0	1	TTTATATAGTGGATTATGTTGATGTATTTCTGAATA	aaaaa`a_a^aa^`a`aa``a_`[\`aa_^`a^^`_	chr10.fa		4602328	F	36	10					
+HWUSI-EAS610	1	4	69	104	831	0	1	TGGAGTTCAGATCTACCTCATGATTCCTGGGGTCAG	_abb_GZ[[a_W_`][aVb]U`[W`[UI]bbaS^S`	chr10.fa		4605942	F	36	10					
+HWUSI-EAS610	1	4	48	249	1252	0	1	ATGATTCCTGGGGTCAGGGCCCTCCTTGTAGGCTGA	a_bba``a[Za_PXbbaaabaaabb`a`]aaaa`ab	chr10.fa		4605961	F	36	49					
+HWUSI-EAS610	1	4	73	1487	1655	0	1	TCCAGACTCCTGGACACCTTCCCTGACAGAGGAGAG	aaaaaa`a``aa`aaaZaaaa^^aaa]`a^a`\a^a	chr10.fa		4605997	R	36	50					
+HWUSI-EAS610	1	4	74	1648	1908	0	1	GAGAGCACGTGGGCAACAGAACCAACAGAGCTTCTT	_ab`__^]b_TZaa_baaaZb[a^aNaaa\XV[S[Q	chr10.fa		4606083	R	36	22					
+HWUSI-EAS610	1	4	9	511	679	0	1	ACAAGACCATCTGGTTTTTTGGAACTGATGTTGCGT	_ab^ba``b_aaba]aaaaaa`Va]a__`a\a`aaa	chr10.fa		4606198	F	36	54					
+HWUSI-EAS610	1	4	24	229	757	0	1	GGGTGTGCTAGGTTGCTTGCAGCATGGAGAGTCCTC	aa]M_\aaaaba`]`a``^a_aa_`bW[`^a\a_^a	chr10.fa		4606261	F	36	28					
+HWUSI-EAS610	1	4	89	1613	970	0	1	AAGGGATTTAATGCTCTCTTCTGTCCTTCATGGGCA	a`_^JSa]]baa`_Y`^R`a]`VHQa`YW```O_`a	chr10.fa		4607123	R	36	117					
+HWUSI-EAS610	1	4	33	1427	1154	0	1	GCCAGAGCTCAATTCCCAGCAACCACGTGATGGCTC	a`ZR_`aVaZa`aa`_aaa^abZ`___S]X]TRY^Y	chr10.fa		4607339	R	36	46					
+HWUSI-EAS610	1	4	39	1210	1516	0	1	TACATATAAATATGCGTCTACTATGCATTTTATCCT	aa_Zaaabb_a^a]`b`_ba_aZZ___a_aa__]_a	chr10.fa		4607701	R	36	119					
+HWUSI-EAS610	1	4	76	220	837	0	1	AAAAACTACATGCTTGACACAAGAGAGAAAATGTTG	^_b`aaabbb_bbab`^``b`[a`b_baa`ba`Q]a	chr10.fa		4607901	R	36	119					
+HWUSI-EAS610	1	4	21	1394	1737	0	1	AAATAGTGCTGGAGAGACAGTTCAGTATCATCTTTA	`aa`a`Z``a_`_a^a`aYaUTTX\^^`__Y]_^``	chr10.fa		4608179	F	36	119					
+HWUSI-EAS610	1	4	65	321	1552	0	1	ACTGGGTACACTGTACCCCTAGTAAACCAGTATTGA	a_[^Y[NRVSXTTT`Z\_^VI\YTHMY]][JSSLTX	chr10.fa		4608466	F	36	25					
+HWUSI-EAS610	1	4	50	1439	1575	0	1	TAGCTAAGAGGAGAAAAGCATTTGAGTGGGAGCGGG	_ba`bb`X`a``^aababaabbbaab_`^^`aaaab	chr10.fa		4608541	F	36	113					
+HWUSI-EAS610	1	4	48	552	1712	0	1	AATGGATGTGCTGTCGAGATGAACTTTATGCAGTGA	aa^``\baWR]`\^U][`V\IZa__a[HWHRROVZ[	chr10.fa		4608618	F	36	31					
+HWUSI-EAS610	1	4	95	1082	943	0	1	GAGGATATAGCCACTGTTCCTGGTACTCATGCCAGG	aa_ababa__a[^_a_^a^Xa`a_``a\Za__Y]__	chr10.fa		4608912	F	9A26	83					
+HWUSI-EAS610	1	4	97	1268	1990	0	1	ATGAGAAATGTTGTTTCTATTATGAAAACAATCAGA	abaU_`^\___aa_\b]aaa^aaa`a]]_aa^S^_^	chr10.fa		4609205	R	36	119					
+HWUSI-EAS610	1	4	32	933	851	0	1	TGGCTCTTCCTTATATTTAGGTGGACAATTAGGGAT	abbaa`aba`bbaaaba___]\aa`_aa``^[_`^`	chr10.fa		4609355	F	20A15	85					
+HWUSI-EAS610	1	4	83	765	298	0	1	TAGATCCATTCACCTGGGNTCAGCCCCTGTAATTCA	\_\\bb__[^aababaWZD[bZb``_b``aabba`b	chr10.fa		4609540	F	18C17	110					
+HWUSI-EAS610	1	4	57	356	973	0	1	AGAAATCACCACAGGGGAATGCCATGGCACTCCAGT	aa`]_aaaa``a`ZX]XZ[^[^^^]]Y^^[^^YZ[Q	chr10.fa		4609752	F	36	119					
+HWUSI-EAS610	1	4	11	436	923	0	1	GCAAACGTTCTTGTTCAATGCACACAAAATACTTTC	aabZaab\_``_`\]`aa[a_____aY__```^a_^	chr10.fa		4610822	F	36	119					
+HWUSI-EAS610	1	4	13	154	842	0	1	GCAAACGTTCTTGTTCAATGCACACAAAATACTTTC	ab_\abb`_]_aa]_\YX^]]T\^b]]`^X^a_a`a	chr10.fa		4610822	F	36	119					
+HWUSI-EAS610	1	4	65	337	1297	0	1	AGACAACTTGGAATGTCTAACGTGAGGAAGCATCCT	aaaabbabaabaaaa^a\a`aa\`T`W][[``[_^`	chr10.fa		4610916	R	36	119					
+HWUSI-EAS610	1	4	1	624	2022	0	1	AAACATTTTGGAAGGGAAAAACACAATTAATTCTCT	abaaaa`aaaa^aaa\\aa_a`a^aa``aaaaaa``	chr10.fa		4613001	R	36	119					
+HWUSI-EAS610	1	4	21	1389	1867	0	1	TACATCAATTGAGGTGGGAAAACTTAGGCCACCATG	aaXW_ZaXa`]ZY]H`a]__]_^a`]a_]G]_^]]]	chr10.fa		4613323	R	36	117					
+HWUSI-EAS610	1	4	2	691	701	0	1	TATCTAGGTCAGGTTAGCCTACTCTTATGTCTTTGG	a_a``aa`]]_a_S_``_[`]]]_`a]`_ZV^^]__	chr10.fa		4613373	R	36	119					
+HWUSI-EAS610	1	4	4	1511	325	0	1	AGTTTACTGAGGATGATAGTTTCAGGTGTCAACTTG	ababaaaa_a`]a``babZ_`aa_TP^Ta]_``aaY	chr10.fa		4613454	R	36	119					
+HWUSI-EAS610	1	4	1	305	1402	0	1	CTAGATCCAAGCTCTGGTAGACATGACCATATGATG	aaaa^aaabaaa__`aaU]a__`a``___aZ``V_`	chr10.fa		4613836	F	36	119					
+HWUSI-EAS610	1	4	32	963	485	0	1	AGTATATAAAGCAGCAAGATGTTATCTTGGAAACAA	abaaaaabaaa`aaaaaaaaa_`aa``a``a`a_`a	chr10.fa		4613883	R	36	119					
+HWUSI-EAS610	1	4	3	354	511	0	1	TAACATATCATACTGGCCACTAAGTTTGCATGCCTG	`]a__]]`]Y[^_``[^]_S__RVST]_^^`[T\``	chr10.fa		4614053	F	36	119					
+HWUSI-EAS610	1	4	6	762	193	0	1	CATATATGTATATGTATACATAGCTTAGATTTATTT	ab`ababb_\aaaa_abbaaaababb_a_babaaba	chr10.fa		4614642	F	36	119					
+HWUSI-EAS610	1	4	54	917	1377	0	1	GAGAGAGAGAGAGAGAGAGAGATCCAGCGATGGTGC	`[`]aUb`aabbbQ][]]b`MIFM\]aTWFNTZLWB	chr10.fa		4615203	F	36	7					
+HWUSI-EAS610	1	4	91	1561	581	0	1	GCCACCCAAGTGTGAGGACCTCTGTTCAAAGCTCTA	abbbaaaa]]WaR\[aX_a_aa_XP`__``S__`ba	chr10.fa		4615992	F	36	119					
+HWUSI-EAS610	1	4	70	881	1566	0	1	CTAGAGCTTTGAACAGAGGTCCTCACACTTGGGTGG	a_`\``abbbaaba^\__b`_aaaaaa`aaa``Y``	chr10.fa		4615993	R	36	119					
+HWUSI-EAS610	1	4	56	1494	1629	0	1	GAGGACCTCTGTTCAAAGCTCTAGAAACCGTGTAAA	[_^`b`aa_Y\_`_^`aaa`^``aa_a\]`Y][\^a	chr10.fa		4616005	F	36	119					
+HWUSI-EAS610	1	4	88	354	1400	0	1	ACCCCAAGCTTTACACGGTTTCTAGAGCTTTGAACA	\^ba^a`a]TbV]Pa_ba_`K^^``V_Y[`^RETZ^	chr10.fa		4616014	R	36	117					
+HWUSI-EAS610	1	4	56	230	1158	0	1	ATGCTATGCCTGCATGCATGCCCACCATTCAAATCA	``\_bbaaa_``a[]aa_Y\aabaa`\]``_X`]]]	chr10.fa		4616337	F	28G7	82					
+HWUSI-EAS610	1	4	7	198	148	0	1	TGGAAACAAGCAGTTTGTGTGTTTATGATGGATTTC	\`\\a\ZYVXaUaPZ]X_[Q_MT[]]WRJW_YS_^a	chr10.fa		4616438	F	36	118					
+HWUSI-EAS610	1	4	52	774	358	0	1	GCTGATAGTTGCCTTGTTTGATCCATAGCAGGAAGC	a_aa]`_a]a]V^`a``aaa_^]^___^^]__]]`_	chr10.fa		4616489	F	36	119					
+HWUSI-EAS610	1	4	86	554	154	0	1	TGCTTTACCATAGCACAGCTTCCTGCTATGGATCAA	abaabbaa`ababab_aa^aaaaaa_baaab``_aa	chr10.fa		4616506	R	36	119					
+HWUSI-EAS610	1	4	25	771	721	0	1	GGAAGCATGGCAGAAGTGTGGCACATAGGTAGGCAT	a_]abbbZa`_bbX`aZb_abaaZaaZ_b^abaaaa	chr10.fa		4616707	F	36	119					
+HWUSI-EAS610	1	4	37	478	1730	0	1	AGCCAAGGCTGGAACAGCAGGGAAATTAGCTCATTT	``aaaaT^_`\`^a__]^UVMW[__`a^__^Z__X_	chr10.fa		4617131	R	36	119					
+HWUSI-EAS610	1	4	60	1594	1654	0	1	ACCTTGATTTTCTTTGCATTGGTATCTATTGAAATC	aabba]aaaa_^aa`^a_bbaa_`aaaaaaa_aa``	chr10.fa		4618120	R	36	119					
+HWUSI-EAS610	1	4	9	403	1838	0	1	CTGTTGAACCATGGGTACCAAGAAGAAGCATAGCAA	aaaaaa`a`\Y`aa_PQ[aXa`aa\[`_aa_a__a^	chr10.fa		4618420	R	36	119					
+HWUSI-EAS610	1	4	89	257	434	0	1	TATCTGGCTTTTACGTGGATGTTGGGGATGCAAACT	aaaaabaa`aa`aaa[a`]`aXa`_`^ZUa_a`^][	chr10.fa		4618544	F	36	119					
+HWUSI-EAS610	1	4	43	1139	1196	0	1	GTTCCAAGGGATCTGCTCTTAATGCCCCTGCAGACA	aV\PML]T]YQZZU[MYBBBBBBBBBBBBBBBBBBB	chr10.fa		4619323	R	36	36					
+HWUSI-EAS610	1	4	75	1071	245	0	1	AAGTAGATGCTTCTTTAAGGGTTGAAGATTCCCCAG	a`[]_Q_]__`a[SW[PV^Y_YS_[RU_^^^]^]UU	chr10.fa		4619434	R	36	118					
+HWUSI-EAS610	1	4	41	370	394	0	1	ACCTTTTTCTTAGCTTTGCCATGCTATCTCTCACTA	]aZ[^`\_ab]`^XV]]]^a`a^_]a]Z`Z_WQ_ZX	chr10.fa		4620829	F	36	14					
+HWUSI-EAS610	1	4	12	1415	995	0	1	AGCGATGCCGTCTACTTTGAGAGCGGTGAGATCGGA	_T[O]^UO^R[``^```[TOMZOORHJ`\QQ]H_BB	chr10.fa		4622530	F	28G2GT2T	26					
+HWUSI-EAS610	1	4	43	309	1414	0	1	CACTTATCAGTGAGTATATTATCACATGAGTTCTTT	aaaa^H^b\a^a[aX[_T``__a___``_a]_`_^a	chr10.fa		4629187	F	36	118					
+HWUSI-EAS610	1	4	45	1421	1074	0	1	CATGCAGTTGCTGGGAATTGGAATTGAACTCAATGC	abbb_abaaaaaa_b`aaab`aaaa_`a_``a``[]	chr10.fa		4630854	R	36	119					
+HWUSI-EAS610	1	4	1	1263	210	0	1	AGCACTTATCCACTTGAATGAATGAACTGGGTGTGT	_a]]Y^aaaXO^M\^```a`aZ^XP`]_UPQPWWSU	chr10.fa		4631290	R	36	118					
+HWUSI-EAS610	1	4	26	503	463	0	1	ATTTTCAGAACTCATTTTTCTCCTTAAAGTACTTCC	abbbaaabaaabaabbaabaaaaaaaaaa^aaaaaa	chr10.fa		4631412	R	36	119					
+HWUSI-EAS610	1	4	92	1517	724	0	1	TTGAAATCTTAGCTCTGTGAAGACGACACAGCCTGT	abbaaaa`aa`^`a`a_WXYZ]_`ZW`_]\Z\Y\[B	chr10.fa		4631848	F	36	114					
+HWUSI-EAS610	1	4	85	26	954	0	1	ATCCCCAGACATCTGCCTCTACTCCACAGCACTGGG	`Ta`a^a^V[`\aW\W_W^YP^U_^_^\US\_P`PS	chr10.fa		4632177	R	36	118					
+HWUSI-EAS610	1	4	76	535	2030	0	1	GTCTGCTAAGTGTCAGACTGTCTCACACTGCATCCG	a_a^bbaaa[V`\_Z_``^a_a]ba_``V]aa_aa_	chr10.fa		4632248	R	36	119					
+HWUSI-EAS610	1	4	81	1028	796	0	1	TGGTTCTTTGAATGTGTTAGTTTATATTTTAAGGTA	`Z`^`^_^[^^__aU^^_^`]_``_Z__^]]][_Y`	chr10.fa		4632329	R	36	119					
+HWUSI-EAS610	1	4	66	921	1917	0	1	CAAGGGAGCTAATAGGTGGCTTTTGTCCCTTTGTGA	`aabb_T_]a^^a_a]Uaaaa``a_VY^[`^Y\YVZ	chr10.fa		4632554	R	36	119					
+HWUSI-EAS610	1	4	37	1349	970	0	1	TGTCTCTGCAGGAACATGTACAATGTTCTCCACACA	abZSSY`\[_\\__W]`\GS[]U][[[U_TT\Z___	chr10.fa		4632741	R	36	118					
+HWUSI-EAS610	1	4	34	794	434	0	1	ATATCAGCTGGTCTATGTTGTCTGGTAGTCCAGTAT	ab\aa`a]ab_QF^`X]\`aa^a`ROY_]_^^aUT`	chr10.fa		4633193	F	12G23	44					
+HWUSI-EAS610	1	4	40	314	1324	0	1	TAGCTCCCTTTCTATGAGCACTCCATGGCCTCAGCA	]]b```_]aT`\U_TK[^X`\V\UYO__R_a^[^\_	chr10.fa		4633420	F	36	118					
+HWUSI-EAS610	1	4	17	59	981	0	1	GAGGGTGCCTCAGTCCCACTTGGGAGAGAGAAGAAA	aaaba^bbbabaa_abb\aa]a^b^b`b]a\`aaa_	chr10.fa		4633928	R	36	11					
+HWUSI-EAS610	1	4	53	623	615	0	1	GTGCCCCCAATTGAGGGTGCCTCAGTCCCACTTGGG	aa_``a`a`_`aa```a`a`_`a\Z_^```\aa\aa	chr10.fa		4633940	R	36	119					
+HWUSI-EAS610	1	4	45	1610	1081	0	1	CCAGCAGGCTTCCACAGGAGCCAAGATGGCGAAAAG	a`b`aaaX]`^`aa`^WXa^\^]aa\^_]\`^^`^`	chr10.fa		4634536	R	36	36					
+HWUSI-EAS610	1	4	33	1044	1715	0	1	TTAAGCCATTCTGATTGGTGTAAGGTATAATCTCAG	^_a[YR^W`_S`b\^`a]^^\ZR`a_`a_]VNVZY^	chr10.fa		4634962	F	36	29					
+HWUSI-EAS610	1	4	53	1516	437	0	1	AGACATCTGTAACTCTAATTCTAGGAGATACAATGT	aa]a`^Y]`_aa`aaaaa^a`aaXN\H^[^Va\\Y\	chr10.fa		4635514	F	36	118					
+HWUSI-EAS610	1	4	23	1250	1066	0	1	AGATACAATGTCCTCTTCTAGCCTCTGCAGGAACCA	a`^aa_]aaa[^Xa_a`V]`a`Za[``]a^ZLZZ\V	chr10.fa		4635539	F	36	118					
+HWUSI-EAS610	1	4	57	1402	1429	0	1	CTGTGTGCTAGACTTTTTGCCCAGGAGGTGGAGTGT	abb`````aa_a`bbbbbb```aaa`ab_aa_aab^	chr10.fa		4635814	F	36	119					
+HWUSI-EAS610	1	4	96	1416	1295	0	1	GACTTCTATGACTGACAACCATACAGACTCACCAAA	a\`a[_aaaa``_P__aa_``a_Z`_]^a_`]_a_Z	chr10.fa		4635912	R	36	119					
+HWUSI-EAS610	1	4	19	1013	1841	0	1	ATTATTTTTGAATACAGGTTAAGTGGATTGGCAACC	aa`W_]``[NLMT[ZZ`SOXLPXLOGPR[YNQTR[a	chr10.fa		4637039	F	36	116					
+HWUSI-EAS610	1	4	50	8	623	0	1	TTCTCAGGGAACAAAAATAGGCAGAGACTGGAGACC	aabab``b`Xa`a`ZbY`]^aa\a`a````a]_^Z]	chr10.fa		4637162	F	36	119					
+HWUSI-EAS610	1	4	29	1212	1117	0	1	TGCATGCCTTTAAAGCCAGGGGTCAACTCTGTTTTC	aXY_``\N`_]a]_]\V]a`]YTVZQT`\[`]]``]	chr10.fa		4637399	R	36	118					
+HWUSI-EAS610	1	4	78	1274	893	0	1	TTGGACTTTTATTCTGGGAAGAAAACTGCTGATTTT	ab_[[_aabaa`aaa`abaaaa`__^aa``_^a`_a	chr10.fa		4638229	R	36	119					
+HWUSI-EAS610	1	4	44	569	1871	0	1	GTCCTGCTGCGTACACCCTACACTTACCTCATGTCC	a`aa]aa\```Y^__`a\]]___^\\\]^^^[^^__	chr10.fa		4638394	F	36	119					
+HWUSI-EAS610	1	4	51	637	100	0	1	GGCTTCAGTTTGCATTATAAGGAAGGAAGTGCCCAG	aaaaa_^]\aa`_[aa_a_`a`^``_``aX`]^^^_	chr10.fa		4638636	R	36	119					
+HWUSI-EAS610	1	4	60	528	1127	0	1	GGAGTTTGCCCCTCAGAGAAGACGTTGGTGCCCAGT	``]\aabbaaaaa_``_WY`a_V_]]`XP]UZVQ[X	chr10.fa		4639074	F	36	119					
+HWUSI-EAS610	1	4	88	1386	314	0	1	ACACACACACACACTGAGAACCTCATGCAAGTTATT	a_a`_Y___\_^ZZ\^[^^_]]YY_TRMX[LTTT^_	chr10.fa		4639150	F	36	118					
+HWUSI-EAS610	1	4	16	647	561	0	1	TGTGGCTGGCAGGAAACTGCACGTAGCCTTGAATTC	ab_a`_^aa^_`\Ya`[a```^aSW]Z^\`^^^`^^	chr10.fa		4639194	R	36	119					
+HWUSI-EAS610	1	4	34	1155	1437	0	1	AAGGTTCCAGAGCAGCATGTGGCTGGCAGGAAACTG	]`b]`a`aaa____a]aaa^aa^^`_^_`a\]^UY\	chr10.fa		4639211	R	36	119					
+HWUSI-EAS610	1	4	26	901	1308	0	1	TGGATCGTCACATAATACCCAGTCACCCTAGCCACT	aa``]W`\WVSZ__\\__VW\_U]__S\WYWVWZZ^	chr10.fa		4639246	F	36	119					
+HWUSI-EAS610	1	4	61	1316	577	0	1	ACAAGGGCTGGCCAATTGAAGTTAAGAGAAGTCAAG	aaabb]^aaaa\^]ab`]_ab`a`aaa^[_a\_aaa	chr10.fa		4639533	R	36	119					
+HWUSI-EAS610	1	4	40	1636	1188	0	1	TTCTTGACTCCTAAACCATGCTGTCTTTCTCCTCTC	ab_bb\T^_PV_a`]Q\_aa_`]\__aaU]\[UO\\	chr10.fa		4639578	F	36	31					
+HWUSI-EAS610	1	4	57	1469	1213	0	1	GGGGCACCACAGATCAGGTCTTGGGGACCACACTTA	ab`a^aW]]``R_^`a^aYaa`_a___^_]`aVW`]	chr10.fa		4639797	F	36	119					
+HWUSI-EAS610	1	4	82	1473	720	0	1	TGCAGTCTTCAAAACAAGGAGACTCAAAAAGTTACA	aaaba_a`aaaa`aa`aa_``_^```__`\a^aa^`	chr10.fa		4639892	R	36	119					
+HWUSI-EAS610	1	4	43	1166	1523	0	1	CAAAGCTCTCACAACTTGCCAAAGTGACAGCACAAG	ab`aaaaaaa\_a_`_`aa`__`aRaa_``_[[U`a	chr10.fa		4639983	R	36	119					
+HWUSI-EAS610	1	4	54	432	1110	0	1	ATGCAGAGAGTTTGGAAAGTACCACAGCAGATAGAA	aa^Z]XYS_]Q]aa`\^WX]ZV^a\_a__]]W[YXQ	chr10.fa		4640070	R	36	118					
+HWUSI-EAS610	1	4	58	682	1474	0	1	GGACCGGATGCAGAGAGTTTGGAAAGTACCACAGCA	a]aabaaZW_`]abaaaabbbaa_`a`bbb]_`aba	chr10.fa		4640077	R	36	119					
+HWUSI-EAS610	1	4	2	766	1271	0	1	GTTGCTGGTGAGTAATGGAAGGATAGTGAATGGACA	Z_\a``a^[\]a\_^_a\Y[__XTL\F]]aaa^BBB	chr10.fa		4640299	R	36	104					
+HWUSI-EAS610	1	4	78	1196	1845	0	1	GACACAGTTCCTTGCTTTTCTCCTTGCTTTCAGAGT	a[XaSPVT[^[U_`WX`_[VURQ[SBBBBBBBBBBB	chr10.fa		4640412	F	35A	68					
+HWUSI-EAS610	1	4	62	356	441	0	1	GTAAGTAAAATAAACCAATTAACATCAAAAACAGTT	aX`^`__a_aaa___aaY__```__^``___^^^Z\	chr10.fa		4640664	F	36	119					
+HWUSI-EAS610	1	4	15	419	44	0	1	TGTTTGCTGTACTTAAGAAGGTCACCAGGCTGGTGT	a`M^]]__`]^`\a_aaa[T\]aa[`YYZ_^[US_B	chr10.fa		4641810	F	36	114					
+HWUSI-EAS610	1	4	78	35	1908	0	1	CTGTGGCCCATGCACAGCCATCATTCCTCTGTAAAA	abb[`bbbaaaaa[\J_``M^[Y_]]`^_`a\Z[RR	chr10.fa		4642070	R	36	118					
+HWUSI-EAS610	1	4	12	950	582	0	1	GTGGCAATTCCGTGTCTTGTCTCTGGTTGCTTTGAT	RM_[P`XZZ_N_Y_```^_Z_^L]]`X__]aa_Q\a	chr10.fa		4642159	F	36	118					
+HWUSI-EAS610	1	4	48	1693	87	0	1	CTAACACTAGAGCAAATGGGAATTGAAAGGGAAGGG	aa_aabaabaaaaaaaa``a`a``^\`[WWVOYXW`	chr10.fa		4642214	R	36	119					
+HWUSI-EAS610	1	4	71	599	1861	0	1	CAGAATCTTGCTGGCATGTGCAATGGTGTCAGCGTT	aa]Q]ZXXTaaQ]PZN]\Q[`^`a\aTaX_XP]aR[	chr10.fa		4642819	R	36	17					
+HWUSI-EAS610	1	4	86	548	39	0	1	GTAGTGGAATGGGGGGCGGGGAGGGTATGGGGGACT	`ST][\RYX^_ZZ`ZWX[\Z\R\\QGJRNTTTRTRT	chr10.fa		4643185	F	36	16					
+HWUSI-EAS610	1	4	66	426	734	0	1	CAGATGCAGCAAAGGATTCTCCAGGTGGGAAGAAGG	aa_\`^__bab`Z_aaa^aaaaaa`O`baV]b^aaa	chr10.fa		4643325	F	36	119					
+HWUSI-EAS610	1	4	60	1518	638	0	1	AAAGGAATCTCCAGGTGGGAAGAAGGTGGCAGCTCA	abba]aa_```_a`[Za\]__aYS_`U]Z^_^^\__	chr10.fa		4643335	F	6T29	81					
+HWUSI-EAS610	1	4	87	1760	964	0	1	TTAAGAGACTAATTCAGTTATAAACCCTGACATATT	a^SYVLL[S[NZS[U_W[W[]^]USPSTRY^^ZP_Y	chr10.fa		4643592	R	36	117					
+HWUSI-EAS610	1	4	16	1438	1716	0	1	CGAGAGATGCTATAATAGATACATGTTATTCACATC	a`R^^\`b\bXXa\T\`\[Z\Y`aYbbaba`^^_BB	chr10.fa		4643838	R	36	110					
+HWUSI-EAS610	1	4	8	1270	828	0	1	GTATCTATTATAGCATCTCTCGTACAGATTTGCATC	a^^a^aaaaaUaa_^_a_aa_a_aa`_^__`^^`__	chr10.fa		4643852	F	36	119					
+HWUSI-EAS610	1	4	29	1501	377	0	1	AATTTTATAGCAATTTCCTGATAATTTTCGATTTCC	`babbbbbbbbabaabbbb\bbbbbaabb_bbbbbb	chr10.fa		4644099	F	C35	82					
+HWUSI-EAS610	1	4	1	25	1216	0	1	AATAAGAACCCTGACATTATTTCTTAGGTAGGTGTG	aab`aaaaa_aa`aa^_a_`_aa`a__aY`aaYaYa	chr10.fa		4644313	R	36	119					
+HWUSI-EAS610	1	4	10	1418	291	0	1	CTGTGTGGGGACTGGCAGAACTTTAAGATGTAGAAG	]`\\^U]W_`_QYR[]ababR_`b_^X]_\V_ba`_	chr10.fa		4644880	F	36	119					
+HWUSI-EAS610	1	4	1	784	707	0	1	GGGGACTGGCAGAACTTTAAGATGTAGAAGATGGTT	aaaaaaabb_ab`a`bbb`aa`aa_aa_`b_`baaa	chr10.fa		4644886	F	36	119					
+HWUSI-EAS610	1	4	19	960	665	0	1	ACAGGATAAAGAGCAAAGGAGTGAATTGGCTTGAGA	a[X]WSUQYW\ZVZ]`\^_^[[[\XRO[WWVTUQZZ	chr10.fa		4644961	R	36	118					
+HWUSI-EAS610	1	4	89	195	515	0	1	AGGAGCTAGACAACTATGACACTAACCCTCTAAAGA	[ababbaaa`a[b`]aaa`aaaaa\aaa`a_a__aa	chr10.fa		4645070	F	36	119					
+HWUSI-EAS610	1	4	49	375	1171	0	1	GAGGCCACCTGGAAAAACAGACCTGAGGCTGATGGG	a`a]bbbabbb\Z_``Za]a`ababZ[`aa_G_bXa	chr10.fa		4645400	F	36	118					
+HWUSI-EAS610	1	4	24	1473	1632	0	1	TAATTTCTCTCTGAATCTGCATGCTGTTCCCATACT	abaaaaa_`_]aaaaa_aa`a_a_`a^_\X[_]_^_	chr10.fa		4645678	F	36	119					
+HWUSI-EAS610	1	4	5	367	68	0	1	TATGAAGACCAAGGCCACTGTTTGTGCTGTTTCCTG	`a_Q\bb`aaba_`_a_P]_\baba[DMO_a_LN`S	chr10.fa		4645756	R	36	116					
+HWUSI-EAS610	1	4	41	1571	1418	0	1	GTAGTGCACACTTGTGCATATGTGTATCCTGCCAGA	aa]^Ra_`aa_\aa_a]aaaaV`_[`_]__W_]`a`	chr10.fa		4646404	F	36	119					
+HWUSI-EAS610	1	4	17	353	581	0	1	TAGTCTAAACTGTGAGCTCTGCTTGCCAGTGAGTGA	aba[ababbbbbabbabbaababaaaaab_aab`ba	chr10.fa		4646494	R	36	119					
+HWUSI-EAS610	1	4	12	729	1403	0	1	AGTGCAAGACCAGAAGTCAAACCCAAGTGTGGTTGC	abU_\_a`_[]aZ[^a`[`]_____^aT_V\WDO^_	chr10.fa		4646586	R	36	116					
+HWUSI-EAS610	1	4	3	1445	1670	0	1	GGATATTATAACAGAAACTCAATGAATTCAGAATGT	`a`a`aa````Zaa_a_^`^a__a^^``^]`]Y``Y	chr10.fa		4646865	R	36	119					
+HWUSI-EAS610	1	4	98	1469	627	0	1	TACATTAACTGAAATAGTTCGTTATAGTATAATCAG	abbbbaab_b`bab`abYaaaa`b`_aUaaaaa_`_	chr10.fa		4647115	R	36	119					
+HWUSI-EAS610	1	4	22	765	573	0	1	GTATGTACTTCCTCTTGTTCAGGTGGCATGTAATGG	a^W_[X]S]`[_a^]aa^a_[^^SW][Q[XTSU]WY	chr10.fa		4647372	F	36	118					
+HWUSI-EAS610	1	4	79	978	1128	0	1	GAAAAGGAAAAATGGAAAAAGGGGGGAAAGGGAAAA	a[a_[`[HO[Y_``aUWXWH`a_^_^X^_a^^RWBB	chr10.fa		4647811	R	36	108					
+HWUSI-EAS610	1	4	79	598	325	0	1	GACAGGACTGAGCCCATAGGCCCATTTCCACATCAC	a`^ZXU]Y[\[XY^`]^`\^YYYYYT\UV`U[^TTU	chr10.fa		4648440	R	36	118					
+HWUSI-EAS610	1	4	47	588	412	0	1	CAGCAGGCAGACAGGACTGAGCCCATAGGCCCATTT	^`ababaabbabab`abaabaabaa_]aaa`_]aaa	chr10.fa		4648449	R	36	119					
+HWUSI-EAS610	1	4	1	1308	1999	0	1	AGTGGATGAAACTAACGAGCAGCTGATATAAACATG	T_Yb`]`]_a`aVa`_PY]aa_XV`b_\aWa\_XR`	chr10.fa		4648585	R	36	119					
+HWUSI-EAS610	1	4	89	106	1209	0	1	TGTCTTGGAAAACACTTGATCAGGTTTTCAAACTCC	`aab`bbb```X_H_`\`a__Tab[aaaba`abbba	chr10.fa		4648633	R	36	118					
+HWUSI-EAS610	1	4	5	806	1645	0	1	AGCTCTTCACTGTCTCTATTCTGACACTTTCCACAC	^S`a[``^b_aa^`^^[``^aabaaa`a``XNXZX[	chr10.fa		4648672	R	36	119					
+HWUSI-EAS610	1	4	34	650	276	0	1	TGAGGGAATGGGTGGTCTAATGGGATGGGATAATCT	ab_abba_b`a`Wba_ab_]`baa^aaa`_a_aa]a	chr10.fa		4648798	F	36	119					
+HWUSI-EAS610	1	4	33	596	1880	0	1	GAGGGAATGGGTGGTCTAATGGGATGGGATAATCTA	aX`aT\_``^`G^aXa_^T^a_aX_a__^_[^a^`_	chr10.fa		4648799	F	36	118					
+HWUSI-EAS610	1	4	23	335	551	0	1	CAGACCACCCATCCCCTTAGATTATCCCATCCCATT	aaZYabUa^]X]a\_`aZQ`WXV\__]_`_X[][WB	chr10.fa		4648816	R	36	114					
+HWUSI-EAS610	1	4	82	1499	870	0	1	TGGGATAATCTAAGGGGATGGGTGGTCTGAGAGGAT	]_]_b^bab]]_]ababSUaZaNZa[``^WM]T^``	chr10.fa		4648823	F	36	118					
+HWUSI-EAS610	1	4	29	1354	17	0	1	TGTGGTCTGAGAGGATGGGTGATCTGAAGGGGTGGG	Jb_aaaaababaab[T_babaaabbababbba_bab	chr10.fa		4648843	F	G35	104					
+HWUSI-EAS610	1	4	54	288	1645	0	1	TGCATACATCTTGTTCTCCATTTCATTTCTCCCATG	a^b^^aaba^b^_\aa^bbba^Raaaaaba\`aRZ]	chr10.fa		4648953	R	36	119					
+HWUSI-EAS610	1	4	72	1217	1731	0	1	TGCACTTATGTACTTGCTCAACCACAGGACACAAAT	aa__`aaZ`]G__a^a`_`a^_X__a`ZTX\^_^_^	chr10.fa		4649305	R	36	118					
+HWUSI-EAS610	1	4	29	1090	952	0	1	GGAGTTTTTTACTTANTAATTTAATCTTGTGTGTCT	aa`a]a`aaa_^aa[DZ_`a`a`_a]`a`^a^a^_a	chr10.fa		4650527	F	15C20	110					
+HWUSI-EAS610	1	4	46	1087	70	0	1	TGAACATGTGTCTGTGTGTATTAGTTGTGTGTGTAA	ab`][``^]TP]aa[`[^W]aaY`]`a^`U[Z\NZ\	chr10.fa		4650954	F	36	118					
+HWUSI-EAS610	1	4	67	1167	1243	0	1	AAGAGTGCTATCACTTGTCTATTTTTAATTTTGATG	a`a\a\a_`_a_`]`aa``a_aa`a`__``aa`^`a	chr10.fa		4651352	R	36	119					
+HWUSI-EAS610	1	4	22	607	1578	0	1	ACACANCGAAGGGAAAATGTAAATGAAAATATCAAT	^^]a\DX`a]`_XSV^^aRQYW`ZaZU_[`_]]a^]	chr10.fa		4651409	F	5C30	110					
+HWUSI-EAS610	1	4	27	1295	696	0	1	TTTGAATAAATCCCTGTGCATGAGATAATAACACAA	`aa^a^\[NTHVVRY\Z^X\]NQTUTZ`WOUO]NQ[	chr10.fa		4651933	F	10G24C	73					
+HWUSI-EAS610	1	4	64	1418	307	0	1	TGTGTTCAGAATCAGGAAATGAACTTTGGTGTGAGA	a_aRDLWY]P`_^X]_^R`aXX_W^]aZZWYYXRQW	chr10.fa		4651961	R	4G28TT1	65					
+HWUSI-EAS610	1	4	60	1576	789	0	1	TGTGCCCTGAGCAGTTTGCACTGAACTTCAACCCTT	a`a`a^`a\b`aa_`aaYab[a]aa`_\_a_W[\_a	chr10.fa		4652059	R	36	119					
+HWUSI-EAS610	1	4	28	1528	385	0	1	TGTGCAGTGCCTATAAGTGTCAGAAGTGTCAGATTC	aa____]_`_^__aa__^__``__`^Y^]_^Y_`__	chr10.fa		4653217	R	36	119					
+HWUSI-EAS610	1	4	66	1439	217	0	1	TTTGGACAAAAAGATTTATTTATTTTAGTTGTATGT	\]aZab]a_H``ZQ\^babaa^a^_WZ_^aa_a```	chr10.fa		4653289	R	36	118					
+HWUSI-EAS610	1	4	38	832	480	0	1	AGAAAACATTTTGAAGATAAATCTTTCCACATTTCC	aaaa`a_aaaaaaaaaaaaa`a`baa__a_`a`a`_	chr10.fa		4653600	F	36	119					
+HWUSI-EAS610	1	4	86	1426	1173	0	1	TACTACATTCCAGAGAGACCATATTTCCAAATTGAA	``T`^^Uaa^[U[]`b`XO^`Uaaab_aa\^]a]^R	chr10.fa		4654391	R	36	119					
+HWUSI-EAS610	1	4	38	1342	1919	0	1	GAGTGTTTCATATTAAAACTCATTCAGATCCAATGA	V]a_baaa\a`baaaa```b]^`\`]]]_\[T\`_B	chr10.fa		4654463	F	36	114					
+HWUSI-EAS610	1	4	78	664	867	0	1	GAAAGTAGGCTACCACCTGCAACCTTTCCAGAATGG	VLX\a[R[aY`a\U__aXWX`aZUX`aZP[`R`aX[	chr10.fa		4654770	F	36	118					
+HWUSI-EAS610	1	4	74	715	983	0	1	ATTCATTATGATGTCTGTGCTTTTTGTAGCAAGCTG	abbbaaaaaaYab`ba[_bb`babbaa^a_UNW_ab	chr10.fa		4654941	R	36	119					
+HWUSI-EAS610	1	4	24	243	687	0	1	TGTGCATCTGGAATGCACTTTTGGGGGAAGGCTTTT	]a]b``aY^S]YYba^U^^[_b``ab\_UaK\]b]_	chr10.fa		4655433	F	36	118					
+HWUSI-EAS610	1	4	86	1536	1424	0	1	TGAAATGGTGTGCTCTTATAGCTAAAGAGTCTCACA	abaaaW[FJ`^`]Na_aa_``^_YSZ\_]Z^\^_W\	chr10.fa		4655477	R	36	117					
+HWUSI-EAS610	1	4	75	1401	744	0	1	TGACTAGTAAGTTAAGGCCCTGGGTTTAATTTCTAG	_\`_^`_U]XW_a_`PZaa``]G\Yaa_^]a__a]Y	chr10.fa		4656091	F	36	118					
+HWUSI-EAS610	1	4	17	502	1357	0	1	AATTGACTGCATAATTGACATGCCCAATGTTGTGCA	ab_aa`__`_]__^`__`a____``X\`aZ`_X`]_	chr10.fa		4657266	R	36	119					
+HWUSI-EAS610	1	4	48	124	501	0	1	GAACGTTGCCCAACTTTTAAGATATTAGTTGTTCAG	aY`abaaaaba_`^a`aaXUa_]aaaa`[aa]aaaa	chr10.fa		4657399	F	36	119					
+HWUSI-EAS610	1	4	4	635	1024	0	1	AAACCTGTAAGTGACTAACATCGTCTGTTTATTGAT	YI_]VZ^VZ]]]SRUZ\_U[\WXPSW_V[^aa\YU`	chr10.fa		4657639	F	36	118					
+HWUSI-EAS610	1	4	42	568	139	0	1	ATTTGCTTGGCTGGCACTTGCTTTGCAGTAGGCCAC	aabbbabbaab_aaabbbababaaaaaa`babbaa`	chr10.fa		4657763	R	36	119					
+HWUSI-EAS610	1	4	93	1123	1886	0	1	TGGAAATTTAAGCCTGGAGGAAACTTAAAAACTATA	abab`_aa`a`a^_`aa__a_^_`aa^``__]`__`	chr10.fa		4658326	F	36	119					
+HWUSI-EAS610	1	4	88	758	186	0	1	CTCCCTGCCTGTGGCTCTCACACTCTGGTCTTTTTC	abbbaabaaa`]ba`a``_^\Z]NS\YEX\[abaaZ	chr10.fa		4658376	R	27C8	109					
+HWUSI-EAS610	1	4	59	1592	1952	0	1	AATCAACCTTCCAGCATGGATAGAAGAGGTGCTTCC	ab_Y_`___``N```a`\_Xa^_]_ZU]XY^XX]]]	chr10.fa		4658511	F	36	119					
+HWUSI-EAS610	1	4	18	921	1366	0	1	GCTATATTCCTCCAAATAAATACACCGCCCTTCTCA	`O]_aU_aZZZ[YU_`a_`[[Y_V]Z`XWQSZR\[^	chr10.fa		4658585	R	36	118					
+HWUSI-EAS610	1	4	67	980	159	0	1	TTAGGAGTCCCACAAGAAGACCAAGCTATGCAACTG	a\`\^[KRWRP\VZ]]_]SSP]RY\UP^[ULU[X[^	chr10.fa		4658776	R	36	13					
+HWUSI-EAS610	1	4	53	1715	801	0	1	ACAAGATCATATATCCAGGTTCAGGTTAGCTCCTGG	aaaaa`a___`a^O^`_]Y]`_^XWW\]U][Z\^WB	chr10.fa		4659569	R	36	114					
+HWUSI-EAS610	1	4	57	1090	1717	0	1	TAGGACAAGATGGCCTGGAACTCGTGGTAAATCCCC	abb`]`a```a`a`Zaa\]a`_]aU\^W[`_`\^__	chr10.fa		4659631	R	36	119					
+HWUSI-EAS610	1	4	61	612	1793	0	1	GAGATCTTATTTAATCAAACCGAGACCCACAAACAG	aaaY_PY``a``a\]_a^a__b_aa___X]_VRYR\	chr10.fa		4659673	F	36	119					
+HWUSI-EAS610	1	4	75	625	1837	0	1	ATTTGTGACAATCCTGGACTCTGCTGGGCCTCAAGA	[baa_G``a[X\`_``^Z`]`U`a`a^aaa_]U`a`	chr10.fa		4660763	R	33GCG	7					
+HWUSI-EAS610	1	4	72	682	492	0	1	CTTTGGAGAAGGTTCAGATGGAAAGCTACTGCTGCT	ababbba_abaaVaaaaaaab^aaaaaaaaa_aaaa	chr10.fa		4660819	R	36	119					
+HWUSI-EAS610	1	4	8	150	193	0	1	GCTAGCTCTTTCTAAGCAATTCTCAATGGATGGTTG	aaaa[T`baaaa_`baaaZX_a]`__`aa`_aHSW]	chr10.fa		4660896	F	32T3	106					
+HWUSI-EAS610	1	4	29	1259	887	0	1	CAAAGCTGGCTAAGTATGCCAAACATCCATTGAGAA	ab^`T\IY\`a[SZ_Ua\a_b`S\SW]]RPWY\a`[	chr10.fa		4660915	R	36	118					
+HWUSI-EAS610	1	4	41	678	244	0	1	TCCCTGTGGGGATAGGAGGATGTCAGGGCTCTAGTT	aa]]aaO`a`]^\\a`Ya^SXaRY]]YZNZ[ZT\N[	chr10.fa		4660992	R	36	118					
+HWUSI-EAS610	1	4	7	591	1223	0	1	ACATCCTCCTATCCCCACAGGGATCAGGAATGTGCA	TP\TW`b``Z^_a]L]bb]T`]HR]___L^Z]_][R	chr10.fa		4661005	F	36	117					
+HWUSI-EAS610	1	4	61	1705	814	0	1	ATGTATCCTACAATGTTTATGCACATTCCTGATCCC	aaaaaaa`a`_a_`]^aaa___a]`Z]`____[^__	chr10.fa		4661024	R	36	119					
+HWUSI-EAS610	1	4	25	1434	462	0	1	AACCTGAGTTTAAACATCAACTTGTTTTTAGCTGTT	_babbbbbabbb_a_`bb`_`bb__aaabaa_ab`a	chr10.fa		4661314	F	36	119					
+HWUSI-EAS610	1	4	94	136	1660	0	1	CATTTGGTCATGAGACCTAGAGGGATGCAAAAGAAC	a_^`aba^bZ^aaa`a`_WaW`a`]\a`[JZa[V]a	chr10.fa		4661385	R	36	118					
+HWUSI-EAS610	1	4	78	946	345	0	1	GGCTTATGATCTTCGAAATACCAAGGGCCTCTCCTC	\_[b_a`Ya^[_]Z`^ZZba`I`\V__^`b`a_aaa	chr10.fa		4662345	F	36	4					
+HWUSI-EAS610	1	4	78	1379	1251	0	1	CTGAATGGTCCTTCCTTCTGTCTCAGCTCAACCACT	[bababaa[abbabbbababaaaabbaa]``aaaab	chr10.fa		4662708	F	36	51					
+HWUSI-EAS610	1	4	74	1353	1268	0	1	AGACTGATTTCCAGAGTGGTTGAGCTGAGACAGAAG	[aY`a__baaJ_ba]a_b]`b`]a]Za^`^[a`aab	chr10.fa		4662722	R	36	118					
+HWUSI-EAS610	1	4	53	1407	1883	0	1	TGACTGTCAGATTGACACTATTTCCTGAGTCCTCAT	`]aa_[^^^a``aa]`a`__a`S[S_`Q[PZO^__`	chr10.fa		4663382	F	36	118					
+HWUSI-EAS610	1	4	78	1534	85	0	1	AAAGGGAAGAAACATGGGAATACACAAGGAAGACAG	aaZaTHT[PTa]Y_`_[Waa^WRUV_KDDJ]T[Z^[	chr10.fa		4663447	F	36	112					
+HWUSI-EAS610	1	4	94	399	851	0	1	CTTTTATACAGTCATTGAGATCAAATCCAGGGCTCC	ab]b^_[YX`_`b`[\[W_V_X^Z`[XYYZ]]\^\a	chr10.fa		4663598	R	36	119					
+HWUSI-EAS610	1	4	87	1437	327	0	1	CAAGCATCTCTATTGTCACAGCCTGCCTCCACACAG	aabaaaaa^a`_aaU[Zaa[Ya`^`__a^_a\`a_B	chr10.fa		4664048	R	36	115					
+HWUSI-EAS610	1	4	74	1069	182	0	1	TATTCTAGATTCTAAGGCCTTGGCAGAGGGACAGGC	aabb^a^^`a^^aa__Z^_`^^`[^`^]Q][W^^^\	chr10.fa		4664844	R	36	119					
+HWUSI-EAS610	1	4	51	888	1356	0	1	AGATGTCAATAACAGCACCACCATCCAACAGGAAAA	ab_V_`^^_`[^Sa\W^]aX_aaXMGX\XY\^_aaV	chr10.fa		4664940	F	36	117					
+HWUSI-EAS610	1	4	14	862	1598	0	1	TACCCTGACTAAGGCAACCGTTGTGATTTGTGTTTA	[Zbb_b`b`b\]_bbab^`aY``^ba^a`^`babaa	chr10.fa		4664978	R	36	119					
+HWUSI-EAS610	1	4	88	1146	1156	0	1	TTCTAAAAATGCTTAGTCATCATTTGTGACGTCATT	ab`bab`a^a`[aaaa`aaa__aaaa\X_]^]_aaa	chr10.fa		4665053	F	36	119					
+HWUSI-EAS610	1	4	89	338	756	0	1	GAAGAATGACGTCACAAATGATGACTAAGCATTTTT	aWNT\a^aa_a[`a^__\XU]]^^R^LY_^\XT\`Z	chr10.fa		4665057	R	36	118					
+HWUSI-EAS610	1	4	47	1398	2029	0	1	CTTTAAAAGATCATGTAGTAAGGCTGGGGAGATGAA	_baababa_Y]_`ab_`ba^ab]_bbaaa_a`]aaa	chr10.fa		4665533	F	36	119					
+HWUSI-EAS610	1	4	10	852	875	0	1	AGTGGTTAAACACTGTCTATGTAAGCATGAAGACCA	_a_aa_a^]Z_aZ`a^``aaa^_a^_^^_][[`]__	chr10.fa		4665571	F	36	119					
+HWUSI-EAS610	1	4	13	37	498	0	1	ATTACAGAGGAGCACTTCCTGTCCCGGGTTCTTAGG	aabbbbbaa_a_aa_``ba_a]aaabaaWaaa_``a	chr10.fa		4665626	R	36	119					
+HWUSI-EAS610	1	4	59	76	1533	0	1	TGAATGAATTTCTTAGCTATTGTGAATATAACCTCA	`bbba`aM_abbbab]``Yaa^a_aa^Z__V^____	chr10.fa		4666275	R	36	119					
+HWUSI-EAS610	1	4	38	826	242	0	1	CACAATAGCTAAGAAATTCATTCAGTCTAGATGTCC	aa_VWbaVaa^\Y_[``a__aa_[XL^^]a`ZaY_a	chr10.fa		4666287	F	36	118					
+HWUSI-EAS610	1	4	85	1785	1664	0	1	AGCCTCCTAATGTTTTAGAGTTGTTGAGTCCACACT	]a`ab_]aa_a__bbZW`Va`_aa`WO]`QH[P__R	chr10.fa		4667371	R	35C	95					
+HWUSI-EAS610	1	4	88	514	1266	0	1	AGGTAGGAGATGCATAGGAAACCACTTTACCATCTG	N\][]aZV`b`aaZaSabbYbUa^`bbabaaaaaba	chr10.fa		4667433	F	36	119					
+HWUSI-EAS610	1	4	15	96	531	0	1	GTTTGCCTAAAAAATCAGAATCCACAACTTGAAGTT	a_aaaaba^_]`aa_aaa`^_aaaaaa]a`a`[a[_	chr10.fa		4668257	R	12T23	81					
+HWUSI-EAS610	1	4	12	1081	1839	0	1	AGACCTCATACCTGGCTTCTAAGACTATGCCTGACC	_XXaaba^]PZW`\W^]P[aaa_aaa___W^^^_[[	chr10.fa		4672373	F	36	27					
+HWUSI-EAS610	1	4	31	146	432	0	1	AAAATACAGATACTATCTCAAAGTGAAAGGCTGGAA	YX\[`aaaab]abab`aa_S^^aU]Y_aaZa`\ZBB	chr10.fa		4672785	R	36	36					
+HWUSI-EAS610	1	4	55	1592	1740	0	1	TATCTGTCCACGAACAGAGCCCTTGAAAGGATAATA	abbaaa_aaa`Y`a_a]aaa_`a_\]__a^___a`a	chr10.fa		4673081	R	36	119					
+HWUSI-EAS610	1	4	8	1777	1183	0	1	GACAGATATTGTGTGAGTTTGGTTTTATCATGGAAT	aaU`baaRa^_Wa_aaaW`abaZ\[a___a__]__^	chr10.fa		4673109	F	36	17					
+HWUSI-EAS610	1	4	48	1450	269	0	1	AAAGGCTTCTATCTGTTTACCTGTGTTTTTCTGTAT	ab````aa`a__``^aaa`__a^\a]a`a`^]UV]a	chr10.fa		4674298	F	36	28					
+HWUSI-EAS610	1	4	25	1290	2006	0	1	TCTGCCATCACAGCAAGTCCTGGATACACAATCACA	aa^UMO[[[]Q]WPP^[FMNNX[_X^W`]XY\X_UR	chr10.fa		4674400	R	10T25	23					
+HWUSI-EAS610	1	4	16	1019	719	0	1	GGTGGAGGTGTCTGGTCTGGTCTGTTCGAAACCAAG	aaWa`^_a_`W_aa_]^`aa^^``^`W`^\_UU^^`	chr10.fa		4674765	F	36	119					
+HWUSI-EAS610	1	4	97	528	1199	0	1	CAGTTGGACTGGAACAGATGTTGTGTTCCACTCACC	aba_^aa^Z`aa\aa`VP\aa]]YZHaY][^[[__Y	chr10.fa		4674886	F	36	17					
+HWUSI-EAS610	1	4	75	785	1779	0	1	ACACGTCCCTTCCAGTCACCTAGGGTACTGAGCCAG	_abZT]^]aa^a`K\]Z_a^L^S_WY]X^_VZT]a]	chr10.fa		4674973	R	36	118					
+HWUSI-EAS610	1	4	50	508	824	0	1	CACAAAGACCAAGCTGTGAATCTGTTACATATGTCT	ababbababaaaaaaa`b`aaaaaaaa_aa`aaaaa	chr10.fa		4675646	F	36	119					
+HWUSI-EAS610	1	4	92	926	70	0	1	AGACCACAGCCTTGCATTAGCTGAAGCTTAGTGAAT	abaaaa^aaa_aaa`aaa`a_a_[_`_aa``Z^`_a	chr10.fa		4675832	R	36	119					
+HWUSI-EAS610	1	4	61	697	341	0	1	ACCCCTGATACTATTATCCATATTGTGCTATGTGTG	\`Y\`[V]`_W]_aa^`a_U_Za_[]_S[]]ZYX_a	chr10.fa		4675913	R	36	119					
+HWUSI-EAS610	1	4	45	452	627	0	1	AGGGATGGAACTGGATGGGAGAGGGGATGAGGAGGG	YZaaTa``a_aaa[_aaaa_aaa_aaaa_V_aaaaa	chr10.fa		4676319	R	36	42					
+HWUSI-EAS610	1	4	32	628	1919	0	1	TTGCAGGTGAACACGTGATGGCTTCGGAACGGCAAA	aaabaa`^aaabbab_aaabaaaa_b`_a_a``^a_	chr10.fa		4677423	F	36	23					
+HWUSI-EAS610	1	4	35	1002	1865	0	1	CATGGCAGAACGATTGAGGGCAAGCTCTATCCAGGT	aaQ^_^Q^V\[SIV`aQSZ^ZVBBBBBBBBBBBBBB	chr10.fa		4677481	F	36	57					
+HWUSI-EAS610	1	4	79	640	1462	0	1	GCGAAGTTTGACTGCACAAATTTGAAATGCACTTTA	a`YV`a\a_RY[_`\TW_^]V]__`]]^^`__Y`]]	chr10.fa		4677855	F	36	24					
+HWUSI-EAS610	1	4	39	249	431	0	1	GATCACCTCAGTTAAACGTGGCCTTATTAAACTTAA	a^bba^b`bbbaaa`a_a]aabaaa``a``aaa`_Z	chr10.fa		4678066	R	36	20					
+HWUSI-EAS610	1	4	70	701	947	0	1	GAATGTCCTTGGAATAAAGATAACAGTTGCCACCTG	a[Xba_a`ab^`^`aa]aa`aaa`_a`a`_`]]]aa	chr10.fa		4678725	F	36	37					
+HWUSI-EAS610	1	4	53	1397	546	0	1	TAACAGTTGCCACCTGTGTGCTCTTTGGGGGCAGGG	\a^\ZHT`V[[^V]]X\]_TO`[a^HY_PPR]TZP_	chr10.fa		4678745	F	25G10	24					
+HWUSI-EAS610	1	4	72	1182	584	0	1	GAAGGAGGGGGAGGGACCCAATTCCCGCCAAATAAT	aaa_aX`__^a\\^^Ua^]]`U\^W\_U\WMSWVU\	chr10.fa		4683886	F	36	21					
+HWUSI-EAS610	1	4	29	247	639	0	1	AAGCTATCTAATATGTAGTAAGTTTTTGTCAAGAAT	WHbabbbbbbbbbbbabbbbbbabbbbbbb_`aaba	chr10.fa		4684207	R	36	118					
+HWUSI-EAS610	1	4	45	876	781	0	1	ATCATTCCTACTTCAGATCAGCAGCTTGGATCTCCG	aba]aa__a\_ab]`a__a]W]`_`___X][]_]``	chr10.fa		4684347	R	36	119					
+HWUSI-EAS610	1	4	49	1320	1147	0	1	CTTTGACACATGAACCATATTTCTTAAATACAGGGA	abbbbaaaaabaaa`abbaabb_aaa`aaa_a`^a_	chr10.fa		4684628	F	36	119					
+HWUSI-EAS610	1	4	85	1731	1952	0	1	AACAAGAGTGGTATAGCTGGGTCTTCAGGTAGATCT	a_W]`_]aY^W]^^^VY^__YV\Z]W]\^V\X]XVV	chr10.fa		4685010	F	36	16					
+HWUSI-EAS610	1	4	16	1682	803	0	1	TCAGAATGGCTATTATCAAAAGCTTAGGTGACAATA	aa`YR_^]]_V_XFS_RW__WPZ]SWVUPQVRL[W]	chr10.fa		4685158	R	13G22	34					
+HWUSI-EAS610	1	4	24	816	124	0	1	ACCAAACAACCCAATCAAAAATAGGGTGTAGAACTA	aa^a_\P`^aY^a_ZW_WTZ[[^`^`N`\__^WL_a	chr10.fa		4685309	R	36	24					
+HWUSI-EAS610	1	4	21	682	1045	0	1	TGCTTCCTTTTTTTCCATTGTATATTTTTGGTGTCT	_a[a``W__Z\_`_VNS`baYUXZ_Za]]SSW[WXX	chr10.fa		4685749	F	36	23					
+HWUSI-EAS610	1	4	58	542	800	0	1	GAGGGGATAGGGGAACCTGATCTGCTGTTGGGTGAG	VWQa`bTbQL`[`a^aaXZ`_aa^Z`aY]a]VH^^b	chr10.fa		4685848	F	36	35					
+HWUSI-EAS610	1	4	35	1663	310	0	1	GAGTCTGTGTCTTTCAGCTGCTTATTGGGTCTTCTG	[`_^a__][[_`^^a]]]`R``_^a\MOST\Z]Z]Y	chr10.fa		4686674	R	36	118					
+HWUSI-EAS610	1	4	4	1360	1637	0	1	GGAGAAGGGTGACTCTATAGGAGGACCAGCAGTCTC	^b]aab_b_\a`_aaa]aaaaa`aaT]_^X`^WUa^	chr10.fa		4686785	F	36	14					
+HWUSI-EAS610	1	4	18	268	1917	0	1	GAACCCCTGAGATCACTCATTTCACTGGACCAAAGA	a_\baa`\`ab_^baa`aa_W]aaaaaaabaaaa`_	chr10.fa		4686831	F	36	119					
+HWUSI-EAS610	1	4	56	1593	1777	0	1	GGAAGCCCCAGAGAGCTTGGAGGGAAGGAGTGGCGG	_\_a^QZZ_Z_^[SZWUXQXX`BBBBBBBBBBBBBB	chr10.fa		4686966	F	23C4T4T1T	48					
+HWUSI-EAS610	1	4	56	709	1331	0	1	TGTAAGCATTCACTTATGTGTTTGCTAGGGCCCGGC	ababaaabba`a`ab`bb`baaaa``aaaaa``\`a	chr10.fa		4687566	F	36	35					
+HWUSI-EAS610	1	4	39	782	1967	0	1	GGACAAAATGGACAAATTTCTAGACAAATTCCAGGT	`aabbaaa^]``abb`^`aa`aaa_a`aaa`__a`R	chr10.fa		4690407	R	36	31					
+HWUSI-EAS610	1	4	85	492	1711	0	1	AGAAGGGTCACTTCATACTCATCAAAGCTAAAATCC	a`\XU\Z[Y[T^`^ba``[`^]a``_QZ`^`OH^\Y	chr10.fa		4691408	R	36	17					
+HWUSI-EAS610	1	4	50	147	322	0	1	GAGCCCAAGATGCCCCGGTGCTGGCCTGGACTTGTG	`^aaaaa\`a`a`a`aa`Kaa^aa`a`a````aa^a	chr10.fa		4693133	F	36	119					
+HWUSI-EAS610	1	4	84	881	1914	0	1	GTAGTCTCAGGTCCTGTCAAATTGGATTGGAGCAAA	aR_`SRS__^VM_]_`MP[\PU_`Z]W_^]USUPWV	chr10.fa		4693207	F	17G18	97					
+HWUSI-EAS610	1	4	18	1264	1797	0	1	GGACTAGAATACTGCACTTATTTGCTTCCTTACCCA	`^T\`aa_``_Y__Y^Waa_`aa^\``QL]`aX]^^	chr10.fa		4693408	R	36	118					
+HWUSI-EAS610	1	4	31	1394	856	0	1	TGTGATTCTATGGTTTTATGATCTTTTTAAGCAAAC	_aT^aab`a_a`XTaab_ab_\`aa`aa]VP`[][R	chr10.fa		4693466	F	36	119					
+HWUSI-EAS610	1	4	14	393	1215	0	1	ACAGGGTCACATAGTTTAGACTAACCTGAGACTCAC	_`abaaHa^aaba_[a`aaba`^aaa_a`aaa_`__	chr10.fa		4693589	F	36	118					
+HWUSI-EAS610	1	4	74	915	1084	0	1	GTGCTCGTGTTACATGTGTGTGCCAACATGTCCAGA	a^aa`ab]aaaa_aab_``_S]___Z[`_a__Y^aW	chr10.fa		4693677	F	36	119					
+HWUSI-EAS610	1	4	86	1594	1540	0	1	GTGTGCCAACATGTCCAGATTACTGTGTGGTTTCCA	a`a`aa]^PY^]WMXXL^U`SW][[O[GZU]]^^BB	chr10.fa		4693694	F	36	108					
+HWUSI-EAS610	1	4	20	288	24	0	1	AAAATGGAAAGGAGGAGTTAATGACTGATATCCTTC	a_a_aaaa`Xaa`baaaVaaaaabaaaaab_aaaaa	chr10.fa		4693857	R	36	119					
+HWUSI-EAS610	1	4	80	771	1939	0	1	GGGAATTTTAACATGTTAAGGAGACTTGAGGAGATT	_a_`bbbbabbbbbb_ababb`aaaaa`aaYZaa`a	chr10.fa		4694019	R	36	119					
+HWUSI-EAS610	1	4	54	897	1854	0	1	TGTCATACACATGTAATGGATCCTCTATTACCATTA	aa`_a^a]a_`aa_``_a__^VOX\\^a__WYYZ_^	chr10.fa		4694062	R	36	119					
+HWUSI-EAS610	1	4	78	1446	307	0	1	AAAACAAAAAACAACAAAAAACAAAAACAAAAACAG	a^`Xa`X^aVZaa__a`a`[_TZ`a_a^a`_`\[`a	chr10.fa		4694484	R	36	9					
+HWUSI-EAS610	1	4	51	384	312	0	1	GAATTGCACTGGAGAATTTGAAATGGGGGGCAGTCT	a_aaaa`__aaa^a_`aa`aZ_`aa`__]__]_^]_	chr10.fa		4694888	F	36	119					
+HWUSI-EAS610	1	4	88	178	1037	0	1	AAGATGATCAAGATGGAATAACAAGCCATCCAAATT	]Xa`aa`aa`aa[_ba`aa^Taaa^aaa^a_[^a`^	chr10.fa		4695082	F	36	119					
+HWUSI-EAS610	1	4	56	1431	1524	0	1	GGCTGGGTCAATAAGCAACATCTTTGCAACAACTGT	U`ba`baab_bbb`]bbbaaaababaa[aaaa[aaa	chr10.fa		4695399	F	36	119					
+HWUSI-EAS610	1	4	65	1022	1866	0	1	ATAGATGTTCTTGTCTTAATCATGGTCAGACTNTAC	R^U\[`\\YU^a\X_Za`^_W_]\PTLU^XM\DYYX	chr10.fa		4695962	F	32A3	109					
+HWUSI-EAS610	1	4	52	1462	721	0	1	CATGGATAAGCCATTTACCATCACAGAGTGATAATT	a_YUQS[SFSMOS^_[[SURZYYOKUQOFV][XUQV	chr10.fa		4696193	F	36	115					
+HWUSI-EAS610	1	4	78	1415	1417	0	1	CAAGGTGGTACATAATCTCAGTACTCATGAGGAAGA	abbb`Saaaaaaaaaaaaaa^[__^]_aa[]WY\aa	chr10.fa		4696660	F	36	119					
+HWUSI-EAS610	1	4	20	544	1123	0	1	TCAGTACTCATGAGGAAGAATTGTGAGTTCAAAGCG	S^^b]R]a_Z^`UbaZ\`_RR`ZUZa_Va_XW\`aB	chr10.fa		4696677	F	35T	112					
+HWUSI-EAS610	1	4	80	137	1065	0	1	CAACATAAATGGATAAATGCATCCCTAGCATCATAT	`]X`__a_[Wa`_\]^VR_[MYa``[W^`^_]_\UU	chr10.fa		4697429	F	36	118					
+HWUSI-EAS610	1	4	65	617	1203	0	1	CCACGGCAGCAAATGAGGCAGGCATATCTCAGGGCA	\_\a_]]ZZSTYY_W]_\VGTZRZ]H_]YGX]YOVU	chr10.fa		4697526	F	36	116					
+HWUSI-EAS610	1	4	55	257	589	0	1	AGAGGAGAAAAGCGAAGGCAAAAGGAACTACATTAT	`bbbb`b_bbababbabbbb`bbbbaaabaabaaba	chr10.fa		4697596	F	36	119					
+HWUSI-EAS610	1	4	93	1463	2027	0	1	GAAAGAGGGAAGGACACATTAGAGTCATCTGCCTCC	aa`aa[__W_\_`_\a_a\`^a\`U]_[W_[YU_\W	chr10.fa		4697806	R	36	119					
+HWUSI-EAS610	1	4	46	337	630	0	1	GATGACTCTAATGTGTCCTTCCCTCTTTCTGTTTCT	aaa`GUa`aXUa][aWWX`a^`aaabaaaaa_aaaa	chr10.fa		4697813	F	36	118					
+HWUSI-EAS610	1	4	55	1220	1978	0	1	TGAGGTTGAAGCATGGTCTCACACCGTTCTACCACT	`\Y_bUa^ba`a_Z_`_aaaa\a^`aU^Qa_U_`\_	chr10.fa		4698703	F	36	119					
+HWUSI-EAS610	1	4	26	79	833	0	1	AGAATGCAGCCCAGTGGTAGAACGGTGTGAGACCAT	T`a[a_bb]bbbb`[a`[_`ababa^aXa^\``aa`	chr10.fa		4698715	R	36	119					
+HWUSI-EAS610	1	4	40	1708	506	0	1	AAAGGAAGCCAATAAGACAAAATATCATTGTGAGTG	abaX]VZFSa\Z_[]`aaa`aa^^____ZYFO]RZX	chr10.fa		4699015	F	36	116					
+HWUSI-EAS610	1	4	45	505	351	0	1	AAGTATTTACTACTGGAAATCAAGCACTCCATTTAG	`UZ]aaaa]aba_[aY]a`a``\]_aXaaaaa_a__	chr10.fa		4699061	F	36	119					
+HWUSI-EAS610	1	4	12	1000	1371	0	1	TCCCATTAGGCTTTGCAATCCCCAAAGGCTACTTCA	aa^``aaaaa][__a_ZVa`___a_]_^]_`W`_]R	chr10.fa		4699179	R	36	119					
+HWUSI-EAS610	1	4	68	902	1809	0	1	TAAACATCACAGTTATTACATAAAGGAAACCACAAT	aaba[aa``^aa^``aaa__a^^___^[^^^_]__`	chr10.fa		4699602	F	36	119					
+HWUSI-EAS610	1	4	35	900	1120	0	1	TGGGAGGGTGAAGAAGCTCTCTCCTTTTAATCATTA	aaaa`bbXMYW_^_\_]`Za_a[a^a_a\]`\_`aa	chr10.fa		4699922	F	36	119					
+HWUSI-EAS610	1	4	91	554	1689	0	1	CTTGAGCCAGGAATGTCTACATATGATAATATTGTT	``ZI^\a\a```aabab\_]`baaaa_aaaaaaa]Z	chr10.fa		4700241	F	36	118					
+HWUSI-EAS610	1	4	36	697	1564	0	1	ATTTCCTCTCTTAGCCAAGGCTGGAATTCTGCCTAC	a_aa]]a__]`RLR_\X`]RW]XUG[^___`TRT^Z	chr10.fa		4700450	F	36	117					
+HWUSI-EAS610	1	4	50	74	453	0	1	TATTAGAAACCAAGTTCTGCTGGGGCCAGCCATTCC	aaa``ab__`bb]^_ab`aa`a_aaabaaaa`a`aa	chr10.fa		4700493	F	36	119					
+HWUSI-EAS610	1	4	30	967	1634	0	1	NACCCATTCACAATACTTGGCAAGAGAAAAAAATGT	DNRTNTVRQONTUNWXRPWUVTUTVXTOQUXUXSXZ	chr10.fa		4700805	R	A35	108					
+HWUSI-EAS610	1	4	86	175	1909	0	1	AACACCATGACTAGGTCATTATTGACATTCTGCAAA	S[]N^`ba^YaY_]\N_V]]aa^aaa`\`a``a\BB	chr10.fa		4701704	F	36	110					
+HWUSI-EAS610	1	4	89	1340	1236	0	1	ATTGGACACAGGGACGGAAAATCCAATGCTTTGACT	abTbaaaYaaTa_Y\_aT]aaa^_a^^^W[^XY`]_	chr10.fa		4701916	R	36	119					
+HWUSI-EAS610	1	4	59	1592	1979	0	1	TATGATGAAGCCTGACAGCAGCCAAAATTGAGAATG	aabbab`bba__aaZR`^`YVHVX][\``a_^WYV[	chr10.fa		4702260	F	36	118					
+HWUSI-EAS610	1	4	25	512	1866	0	1	ACACTGTTCTATTTCTCCATCACCTTGTGTGCTTTT	a^Y`aa^ba^aabaaab_baa`aab`_]``a^`aab	chr10.fa		4702322	R	36	119					
+HWUSI-EAS610	1	4	75	1392	190	0	1	GGAGAAATAGAACAGTGTCCAAATAGAGCTCAACAT	ab\ba`^b_H_aaaW`aabba``a]_`V___Ya^a_	chr10.fa		4702340	F	36	118					
+HWUSI-EAS610	1	4	66	775	530	0	1	ATACCTTGAGTCACTCATTGGCAAACGAATCAGGTA	a^M^aaabaa___`[]_a_``W]`aM^]\YUP^\T\	chr10.fa		4702911	R	36	118					
+HWUSI-EAS610	1	4	36	762	630	0	1	AAGGTATTTTTTGGCAGAAATCTGACCCAGAAGTCT	a\bbUbabb`]baabb`ab`_aa`b`a`aaaa`aaa	chr10.fa		4702940	F	36	119					
+HWUSI-EAS610	1	4	61	1107	1569	0	1	ACGGACAGCATGACATACACCGGGACAGTGTTCTTT	aabaa_``_aaaa\_a_`[`aaa``^^_^a^__```	chr10.fa		4704348	R	36	119					
+HWUSI-EAS610	1	4	29	265	101	0	1	CTGCCACCACTTCTATGAGTAAGTATCAGGTTTTGT	G^^`ab`b`bbaaaa`bb___bb`bbbbbbbbbbbb	chr10.fa		4704453	R	A35	107					
+HWUSI-EAS610	1	4	14	1744	1803	0	1	GAAAAAGACAAGCAGGTTGCACACTGCTTCCATCAT	a``ba`_a_a[SUa\Y^__UUW_][]^^V]_]VW^^	chr10.fa		4704511	R	36	119					
+HWUSI-EAS610	1	4	96	1649	1379	0	1	ATGAGATGTAAAGCTTTGTGACACACATTAGGGGAC	_YW]\LOOR[U]T`]R_WQX[KQ]]]]Z_PUQOQVQ	chr10.fa		4704549	R	36	117					
+HWUSI-EAS610	1	4	95	198	1362	0	1	AGTAAAAGTGGCCCTCCATGGGCCTGATGCTGAACA	]bH_\_W`GM_b_IQab[KKHYY`_^[[^aKXMZ^_	chr10.fa		4704939	F	13A22	101					
+HWUSI-EAS610	1	4	13	925	91	0	1	TGCTGAACAGACTGTGAATTCCAACATTCCTGTGAC	`ba[W_aa`[U_aaZ[aa`X`aa`O]U]\W`]X__B	chr10.fa		4704966	F	36	114					
+HWUSI-EAS610	1	4	51	1332	1651	0	1	GGAACTGAGGCTTGCTTCTGGCTTCCATCTCGGTGC	aZ``]a_aQSM^_`\`_ZZa`^_\P\^\^U\^YV]]	chr10.fa		4705886	F	36	118					
+HWUSI-EAS610	1	4	24	15	809	0	1	TAAAAAGAATTTTACAGTGTTCGTCTTTTTGCAATA	a^babbbaaaaab`a`b^a__aa^aaaa``aaaa^`	chr10.fa		4707058	R	36	119					
+HWUSI-EAS610	1	4	11	676	196	0	1	GAGCCTTCCCTAGAGCAGAACTTCAGCACCCTAGAC	aa\^\`\``Za``WZ`a]^]Q]X\Q\X`\S]\^Z`S	chr10.fa		4707221	R	36	119					
+HWUSI-EAS610	1	4	86	1055	423	0	1	CTGTATACTCCAGGGACTGAATCTCTCTTTCTCTTC	aabbbaba`aa^^a^^`b`aaa`aab`aaa_a^aZ_	chr10.fa		4708018	F	36	119					
+HWUSI-EAS610	1	4	28	1758	242	0	1	GCAGAGCTAAACAGTAAATATGGCTTTTTGTTTACT	aaZMXRX^aa_][YQ[__^[TPMPTOVWBBBBBBBB	chr10.fa		4709209	R	36	83					
+HWUSI-EAS610	1	4	86	698	396	0	1	TTCGTCTTTCCACAGTCTCTTCAACTGCTTTCCCTA	aa`_W\`a`aa`^`a_a`_a_^`````^_`_^]^][	chr10.fa		4709266	F	36	119					
+HWUSI-EAS610	1	4	67	1515	1767	0	1	ACTGCTTTCCCTATGCAAGCAAGCCTGCTCAGCACA	aa]\]`a^`__Za^_^a_`_Z]_____^\UWU[\\_	chr10.fa		4709289	F	36	119					
+HWUSI-EAS610	1	4	5	961	1068	0	1	GCAGACATCGCTTATTTATTTGGAGCAGGAATAGAT	`Q``aa`a_aR``P]Z`[a\aa__``VX_S^_WY`]	chr10.fa		4709362	R	36	118					
+HWUSI-EAS610	1	4	49	1238	220	0	1	TTTCCTGAGGGTCTGTCTTCCCATAAAGGGCCAGCC	aaa_``\^^YYU^^YV`a`^^\^^^]]QUVUW[UUV	chr10.fa		4709452	F	19T16	84					
+HWUSI-EAS610	1	4	57	957	1004	0	1	AAATAGGGCTGGCCCTTTATGGAAAGACAGACCCTC	abaa`aa`[ab`aX_aa_abba`a_a_[a`\\\\aU	chr10.fa		4709458	R	36	119					
+HWUSI-EAS610	1	4	59	1315	1935	0	1	AAGAGTGTTGGTGACAATTTCAAAATAGGGCTGGCC	aaa_a`[[`b^T^a]]aaa\V\aa_R`WWYVWRYWX	chr10.fa		4709480	R	36	119					
+HWUSI-EAS610	1	4	72	415	1697	0	1	CTTTTGACAATAAGTGGGAATGGAGATGCTGATATC	aab^b^bbabb`a`aab\^aaba\baa`]baaaba`	chr10.fa		4709552	R	36	119					
+HWUSI-EAS610	1	4	3	1100	1804	0	1	GATTTCTGCCTTATCTTCAGAGTCACTTCCACATGA	a^`\a__\NLa_^`YP^\a^\X[VXRa_XQRT^Z^[	chr10.fa		4709636	R	36	118					
+HWUSI-EAS610	1	4	53	1599	305	0	1	CAGGCATACGCCACAGGGAGGCATTCATTCCCCCTA	abb`bbbbaabaaaaaa`a\aaaaa`_a_`aaa_]a	chr10.fa		4709724	R	36	119					
+HWUSI-EAS610	1	4	77	859	1067	0	1	ATGCCAGGCAGACAACATCAGAAAGAAATCTCTTTG	]]]a__ZV_VJa_b`]TRYaaY_QUP^a]`]PF[\X	chr10.fa		4710345	R	32C3	107					
+HWUSI-EAS610	1	4	52	237	189	0	1	GGGACATAACCTCACATGAGAGATCTAGAGTTGATG	`aabaab_aaabbaaaab]`\aaaaaab]a`aa__a	chr10.fa		4710450	F	36	119					
+HWUSI-EAS610	1	4	35	490	1151	0	1	CATGAGAGATCTAGAGTTGATGGCATGGAAGTTGAT	aabaababaaabXaaa^ab`aaaaaaba__a__a\_	chr10.fa		4710464	F	36	119					
+HWUSI-EAS610	1	4	57	656	834	0	1	CAGCACTGGCCCAACCAACTAGAGATTAAAATCCAC	ab`^]aaaa__aVa_aaa]_`aabZ`a[aa[a^]`_	chr10.fa		4710687	F	36	119					
+HWUSI-EAS610	1	4	34	1284	1398	0	1	TTCTTTTCAGAATTCTTCTATTCTTGTTATGCTAGT	`__`aaaWVa^X``Zaa\`__aRa]__`\][[_VYS	chr10.fa		4710858	F	36	119					
+HWUSI-EAS610	1	4	60	758	372	0	1	CACCGCTTTTAGTATATTTGTGAGCACATTTTGAGG	ababbabbbbababbbbbbbaa`baaaaabbaaaa`	chr10.fa		4711049	F	26T9	81					
+HWUSI-EAS610	1	4	84	1397	1685	0	1	TGATGGCAAACAACCTCTCCCCTGACTCTAAAACGT	abb_ba^ba`_aa^]b`aaaa`aa``a_ba_`aaaQ	chr10.fa		4711367	F	36	119					
+HWUSI-EAS610	1	4	54	97	1684	0	1	AGCCCATTCACCTGATCAGTAGATAGCATAAATTTC	a_Z_`WV^ab_b^]UN]U]RXZYS\Waa^`V[]ZQ]	chr10.fa		4711813	R	36	118					
+HWUSI-EAS610	1	4	53	703	1246	0	1	CAAGGCATAGAGATGCCATGCCACCAGTTCTTCTGC	abaaZ[aa^a[a]a_VSZ_]_W`PVVaWa`_`Za\T	chr10.fa		4711875	R	36	119					
+HWUSI-EAS610	1	4	46	8	1389	0	1	AGATACAAAATGAAGCCATGCTGCCCTCCCCTGTTC	`aQa_UTV^VRY]^```NQT_[Z^BBBBBBBBBBBB	chr10.fa		4711984	R	28TA6	61					
+HWUSI-EAS610	1	4	5	648	2042	0	1	TGATCTCGTGTGGGGCTTCTGACAGCACACTGACCT	Ubbb`b^]``Q_[a]baIbaZaba\_a_Y]X]`aaa	chr10.fa		4712647	R	36	118					
+HWUSI-EAS610	1	4	2	885	1210	0	1	GTGCTGTCAGAAGCCCCACACGAGATCATGACTGGG	a_b]aa^_^aaa]_``_a^``___U\\^[a]QV```	chr10.fa		4712655	F	36	119					
+HWUSI-EAS610	1	4	16	56	1068	0	1	ATGACTGGGGAACGTGCCAGGCATGAGTCAACTCTA	]Z_```bbbabbaXQ_a_J_`_]Zba`R`Wa`Xb`[	chr10.fa		4712682	F	36	118					
+HWUSI-EAS610	1	4	31	448	532	0	1	GGAATATGCTGCTATGCTTGCCTTGGGTCTCTGTGC	`b`_bS_a`aaaa_]]aa__O`^_^ZY\\`\WYM\_	chr10.fa		4712719	R	36	118					
+HWUSI-EAS610	1	4	52	1259	1964	0	1	AAATAGAATACTTGAACTCTCGAACTGGCACATGGG	a]abaa`aaa^a_Z_`[a_a_`_`Z^]_]_Z`\^__	chr10.fa		4713250	F	36	119					
+HWUSI-EAS610	1	4	21	1193	335	0	1	AGCCACATCCTGAAAAAGGAGTGAAATAAGGGGACT	aa__[`TQLRX^aYRGSXV\`OLRURVHU\LL[GS[	chr10.fa		4713471	F	36	114					
+HWUSI-EAS610	1	4	69	1747	1105	0	1	TCCTTTCCAGACTCCTATTAATTTGAGGCTACATAG	`bbaababb`a[aa_babbb`babYNYZ`aaP^`^R	chr10.fa		4713565	R	36	119					
+HWUSI-EAS610	1	4	31	24	1428	0	1	AGCTCTCCTACATCAACCAAGACAATCCATAACAAT	a_`b`abbaa^O_aIWaXOXT\a`ZR`aT[^`X^[R	chr10.fa		4714210	R	36	118					
+HWUSI-EAS610	1	4	87	50	545	0	1	CATTCTGAGAGCTACGCTTTCTCAGCCATGATGGAT	aZ`a__[[U`\b_baa\Y_a]aaUVa\_aaa_[[T[	chr10.fa		4714308	F	36	119					
+HWUSI-EAS610	1	4	34	1526	1134	0	1	GGCTCAGCTCCTCTGTCGCTGTGAGGTGAGTGACTA	aaaa`aa\]^]]U^_]]``^`UZUU\VZNTPSZUX\	chr10.fa		4714585	F	36	118					
+HWUSI-EAS610	1	4	72	1085	87	0	1	GTCTTAAAAATAAGGAGGATGGTCCATGCTGATACA	aaaaaaaaa_aaaa``aa``a_^^__a`^`__`_^`	chr10.fa		4714861	F	36	119					
+HWUSI-EAS610	1	4	62	880	818	0	1	TCATCTGTATCAGCATGGACCATCCTCCTTATTTTT	aaaa`aa`aa`a___aa_``aaa_^`[\a``aaaaa	chr10.fa		4714866	R	36	119					
+HWUSI-EAS610	1	4	27	1022	1998	0	1	AAACGTCTAAGCCACGGAGTTAGCTCAAATTAAAAA	Z`b``[_`\a\a_VJaa]`Vb`^V\Z^bR_Y\a_ZU	chr10.fa		4715231	F	36	118					
+HWUSI-EAS610	1	4	81	1393	1907	0	1	GTTAGCTCAAATTAAAAAGGTCACTTGGCACTTGAT	`_b__^_]a]]^Z^`aa`aaV`^X`XaY_WPUY`]W	chr10.fa		4715249	F	36	119					
+HWUSI-EAS610	1	4	49	1608	1220	0	1	CAGCTTTGTAGCAGACTATCTACTGGGGCCTTTCCT	abbabbb_^bbba_`bbbbbaaaa\[a`_\_`a``a	chr10.fa		4715358	F	36	119					
+HWUSI-EAS610	1	4	23	1334	1590	0	1	AAACAAATGACAGCTCACGCTGGTAGGGATGATGAG	`_OX_`WaVUXZR`V_USQQRNKIa]TWMJWFP[VZ	chr10.fa		4715798	F	31T4	105					
+HWUSI-EAS610	1	4	58	760	1116	0	1	GGTCCATGTGAGTAGTCTGGAAACCTGATACAGTAC	aULV]X`]\`[YQ\\VTZX^M\]TN\_TTRUU\R[U	chr10.fa		4716454	F	36	118					
+HWUSI-EAS610	1	4	66	727	1733	0	1	AATGGGAGAAACAAAGTCTTATCTTTCCATCCCTTG	aX``][``_]aZ___aS]a``^^^`_]__^_____^	chr10.fa		4716543	F	19C16	82					
+HWUSI-EAS610	1	4	95	479	1801	0	1	TGGCAGAGTGCCTTCCTGTACCAGAGACACTAGATG	abbaabb]Kabb]bb_``X[^_X`a^^^_b]ab__`	chr10.fa		4716793	R	36	44					
+HWUSI-EAS610	1	4	30	1638	620	0	1	AGGGCTGGTGTTTATGTTTCTCTTTTGGTAACTGGC	aa_a^bba_`_aabaa\ba_aaaaaaa\\a__^[^Y	chr10.fa		4716825	R	36	119					
+HWUSI-EAS610	1	4	21	88	715	0	1	GGTCTCTGTATTTGTTAGCAGCTTCTCCGGTGATGG	`aaa`aa`U]a`aaZ`aaaaaa[`a_aaaaQa_^`a	chr10.fa		4717140	R	36	119					
+HWUSI-EAS610	1	4	9	1441	753	0	1	ATTGCTCTTCAGCAGGATTTCCTGGCCACTGAGGGG	`bbVI^aba]ZU\^T^a``]aT^Xaa[a^a`Y`a]a	chr10.fa		4717252	R	36	118					
+HWUSI-EAS610	1	4	95	248	456	0	1	GCAATCAGTAAGCATGCAAGAGTCAGAGGGGAAGGA	a_]]`W``]`a_[[]a[OVa\`\\X]_`^\WSQXZV	chr10.fa		4717283	F	36	118					
+HWUSI-EAS610	1	4	27	1652	379	0	1	GTGGTCATTGTTTCACATGTATTTATTTAAAATGGA	aUT`[a`]]`]^^^```aVY_a_^__`a^`a^Z][^	chr10.fa		4718521	F	36	119					
+HWUSI-EAS610	1	4	14	89	1428	0	1	ATACAGAATAGAAGGCATTGTTTCTTTCAGTCTCTG	`\Z`Y__T^`]T]baa_]ab_a`baaaa_a]a`a^a	chr10.fa		4719971	F	36	119					
+HWUSI-EAS610	1	4	61	303	1212	0	1	TGAAGGGCTCTGTCAGAGCCTGAAAAATACAGAGGC	aa][Q^ab`aab_`^^Raa_`a]X\]a_a`a```__	chr10.fa		4720136	F	4A31	12					
+HWUSI-EAS610	1	4	41	315	547	0	1	GAAGTACTAGCCTTCTTGTTGATTTAAGTCTCTTTT	aaababba]a`baaaa_aa`b_`aa_Za]a`aa`_Z	chr10.fa		4720591	R	36	119					
+HWUSI-EAS610	1	4	77	1054	1731	0	1	AAGGCTAGTACTTCCAAAGTCCACATATTGATTTTC	a`a^_a__W`Y___aa_^`]```[__^`]a[^__`^	chr10.fa		4720613	F	36	119					
+HWUSI-EAS610	1	4	41	1081	1287	0	1	GTTTTGTTACCTAGAAGAAAATCAATATGTGGACTT	a_aaaa^``]^`_a__`_\`\_^^^_^^`]^^[[^_	chr10.fa		4720629	R	36	119					
+HWUSI-EAS610	1	4	7	416	1952	0	1	GAAGATTAGATCCTAATTGGTGATGCTGTTTAGGGA	_ZT_W\^`b^`aba_Z\aaa]baaaaaa_``]a^]X	chr10.fa		4720745	F	36	119					
+HWUSI-EAS610	1	4	84	1139	247	0	1	GCAAAGAATGAGCTAAGTGAATGTAGTTAAACTCTC	a`a`YZ]a``a`_[_^_V`Ua``[]]ZS^[X]`_`_	chr10.fa		4721257	R	36	119					
+HWUSI-EAS610	1	4	7	1194	1284	0	1	TTTGAAAGTATCCTAAACTATACAGAAGAATAAAAG	_baa`aab\ba[__aababba_aKb`___`a`_^_a	chr10.fa		4721697	F	36	119					
+HWUSI-EAS610	1	4	76	1600	255	0	1	AATGTATGGAGCATAACTGTCTGAATGTAACAGAGA	aba^^aaVO\Y\a_aa_`[Y[\X`a_`N_`]]X_\[	chr10.fa		4722928	R	36	118					
+HWUSI-EAS610	1	4	52	383	1374	0	1	TCCTGTCAGAAAGCACTTGTTGGCATCCACAATAGC	aaaaa_`Z`^a`aa]aa`aY_a`_a_^``^`a^_`_	chr10.fa		4723439	F	36	6					
+HWUSI-EAS610	1	4	38	628	1235	0	1	TGATCTCATTTAAATCCCTTACTAACTCCACAAGGA	a^S]]b\_abb^_ab_``a__\a`^]a`[^Uaaba_	chr10.fa		4724160	R	36	119					
+HWUSI-EAS610	1	4	48	469	480	0	1	GCTCTCCCAATAAACGTGTTGCAGGATCCTATTGTG	a`aabbbbbbab[aababbaababba^babbabbab	chr10.fa		4724603	F	36	119					
+HWUSI-EAS610	1	4	81	973	1702	0	1	CAGAGATGATTCACCTAACTGGTTATCCAATACAGA	`abbba_`b[F^a_a_aa]`^[Ya^][`R___Ya^Y	chr10.fa		4724925	R	10C25	108					
+HWUSI-EAS610	1	4	87	272	438	0	1	TGGATAACCAGTTAGGTGGATCATCTCTGAAAAGAA	abbaabbbbab`aaaa_bb`aaabaaaab`babaaa	chr10.fa		4724932	F	36	119					
+HWUSI-EAS610	1	4	57	648	610	0	1	CGGTAGTTAACTGCCCAGGGCCAGTGAGATCCCATC	]abZbTaba]aZ`_bbab]bb_]`]b`^]`aa`_aX	chr10.fa		4725001	F	36	119					
+HWUSI-EAS610	1	4	94	1644	440	0	1	GTTGTCAGCATGGATGTGTTTTCTGAGCTTTGAGAA	__a`^_aa``_Y\_a]]_[^a_[_Y]_W`__U_Y[_	chr10.fa		4725801	R	36	119					
+HWUSI-EAS610	1	4	41	142	1410	0	1	GGTGCCTTTGCCTTAATGTGATCATTTTCAATTGCT	aa`abbbaa_aabaY\aa]`abb_b``bbbbaabba	chr10.fa		4725968	F	36	119					
+HWUSI-EAS610	1	4	54	294	1632	0	1	AGCAGGTCAGGAAGCAGAGCTGATGCAAAGGCCATG	ab^]\`\```aaZa`^`Ua`_WN\][V_UU\\\\\]	chr10.fa		4726381	F	36	33					
+HWUSI-EAS610	1	4	15	286	1729	0	1	GGCTGGTGGTCTTGGGTTCTATAAGATAGCAAGCTG	`bb`b^N_aZaaabaaZaaWZ`ba^Raa]a^aaaY_	chr10.fa		4726456	R	36	4					
+HWUSI-EAS610	1	4	53	424	1463	0	1	TGGTGCCATTGTGGGCTGGTGGTCTTGGGTTCTATA	`V^N^aaab`YQ_``_a_\V_WPS^_PZaRa^YGX]	chr10.fa		4726469	R	36	33					
+HWUSI-EAS610	1	4	68	606	778	0	1	TGGAGGTCTTTAATTGACTTAGACTTGACCTTTGTA	aaa[`_U`_baZZZ^_a_``Y^\[a_`_]^_`_^R^	chr10.fa		4727727	R	36	37					
+HWUSI-EAS610	1	4	79	1547	2026	0	1	GGCTGCGTACCAAGGCGTTGAGTCCACTGATTTCTT	_\Ra`XQW[aGaMUWGT]MFQ]SYQ^QZXR\[VGY_	chr10.fa		4730419	F	12C23	96					
+HWUSI-EAS610	1	4	58	235	623	0	1	AACACATGTCAAAGCTTGTGGGAAGTAGCCCTAGAG	[U_X_b[_`b`aaaa^`a_a_b_`_NWaa`b`W`_a	chr10.fa		4731078	F	36	119					
+HWUSI-EAS610	1	4	62	1536	46	0	1	GCTGGCCTGAATCTTCCCGTTTTCCTTCCCGTGTCT	ab`ZTababbaaabbbabaaabaaaaba``S]a`aa	chr10.fa		4731620	R	36	119					
+HWUSI-EAS610	1	4	44	473	1620	0	1	AAGCCTGGTTCTAATCTTTGGGGACACTTGCCCTTT	aaa`babbZ`aa^baaaaaa_W_a_aaaaa`a`a_a	chr10.fa		4732392	F	36	119					
+HWUSI-EAS610	1	4	25	1065	1054	0	1	TGAGCAGTGGGGACACTTGGGACAATGTGTCTACTT	a`X]T\_`Wa_\PYa]N_]^`^W]Q\]Z^U[[\RY[	chr10.fa		4732529	F	36	118					
+HWUSI-EAS610	1	4	35	621	142	0	1	ATCACAGAGGTCAAAATGATCTAAAGTAAGTTGGAG	ab`a``_`aaW__aaaaaa_aaa__bY_^`]ab_]a	chr10.fa		4732754	F	36	119					
+HWUSI-EAS610	1	4	38	483	754	0	1	ATTGGTGAAAGGGACCCTTGAGCATAGTGGGCTCTG	_bba_]baa`b`aba^aab`abbaa`b]bba^aaab	chr10.fa		4732875	R	36	119					
+HWUSI-EAS610	1	4	4	1652	776	0	1	GAAGTAGTAAAATTAATTTAATAGTTTGGGAGTCAC	aZY\_aa[aaaaa`]`a`]b^]_TP`][^[Y_^```	chr10.fa		4733067	R	36	119					
+HWUSI-EAS610	1	4	21	755	236	0	1	AAGCCATGCTCCACAACACCTAGCAGTTAGAGATTT	]ab`Zabb``Wb`abb]a]aaQaa_`W^aS[ZN_X_	chr10.fa		4733574	R	36	119					
+HWUSI-EAS610	1	4	62	309	761	0	1	ACAGCATTTACCCAAATAAGACAACATTAATAAGTT	`]_\]\`b`baa`a``^[_a`a`aaaaaaaa\R``a	chr10.fa		4733850	F	36	119					
+HWUSI-EAS610	1	4	76	1360	844	0	1	CGTAGGTCCAAGATGTCTTAAAATAATGAGGGTTTC	aaV^a\_\b\\^Xab^TW_JT`\^^_a\\^TaTaba	chr10.fa		4734128	F	36	118					
+HWUSI-EAS610	1	4	32	1080	1403	0	1	ATGTGTATTTGTGTGTGTTTCGACGTGCATGTGTGT	``a^`aaa_aa[a^\__aba__Z]`abZP``UY]^]	chr10.fa		4734391	F	36	119					
+HWUSI-EAS610	1	4	29	143	824	0	1	ACCAAATGGCGGACTTCTGGCCTATCAGAACCTTCT	^^^WP\a_U^XX]`ZW`U]]_^RZOXa]_Y\]aP\R	chr10.fa		4734692	R	36	118					
+HWUSI-EAS610	1	4	74	1686	727	0	1	AAACAGAAATAAAAAGAGAATGTATGTTTCAGACAC	aaa_a\X``_aa`_^[\Y``aX[_]XV^]^ZLVT\Y	chr10.fa		4734791	R	36	118					
+HWUSI-EAS610	1	4	26	1001	1456	0	1	AATAATGCTAGCAAATGACCTATTTTCAGGAAAATG	aTa__]]WYY_XW\\Z[]ZX[LYVWWSIT^UBBBBB	chr10.fa		4734882	R	36	96					
+HWUSI-EAS610	1	4	2	1562	2031	0	1	GTACTTTGTTAAGAGCCTTCTTATACTGAGTGGAGC	aaa_abbbabaaaaaa_aa_aaaa_^``Z_Wa^_``	chr10.fa		4735316	F	36	119					
+HWUSI-EAS610	1	4	62	1037	168	0	1	CATTGATGCAGTCTATGGTGGCCACAGGCAGATGTT	aabbbbbbbabaabba`]`b]aa`a_Z_\aa_`Z`a	chr10.fa		4736409	R	36	119					
+HWUSI-EAS610	1	4	26	1024	508	0	1	GCCTGTGCTTAGCTAAGACTGGTGGCGGGAAGCTGG	X^`[\`_U^XMJNRUPURBBBBBBBBBBBBBBBBBB	chr10.fa		4736527	R	25T10	37					
+HWUSI-EAS610	1	4	37	871	1719	0	1	AATCTTTCTCATTTGGACAAGTGAATAGAAAGTAGC	`]`_a`a_a_Z[]XT[VVLO]ZUZ\ZZTQW\[GY\T	chr10.fa		4736850	R	36	117					
+HWUSI-EAS610	1	4	48	1532	1862	0	1	GATTCAGTTGAATCTTTCTCATTTGGACAAGTGAAT	Uaa`Iab^a``_a`a`_^aV[aaY\]`]__aRY[_a	chr10.fa		4736860	R	36	118					
+HWUSI-EAS610	1	4	74	830	727	0	1	AGGTCCCATTACAGATGCTTGTAAGTTGCTGTGAAT	abaabaaabbaaab`abaabb^aaa`aa]`a_aa`a	chr10.fa		4737038	R	36	119					
+HWUSI-EAS610	1	4	94	579	845	0	1	TGAAGACTGCAACCCCTGATTCTAAATGTTCACATG	`aaaab`_aa_]`aaa`^\Y\M^_]`aa]a]RRUa\	chr10.fa		4738082	R	36	118					
+HWUSI-EAS610	1	4	51	444	1114	0	1	AAAACCTGACTCCATTCTTGTTTAAAAATAACAGGA	a`\baab\O\b`a^a`^aa`]aaaaaYa^aa]^`YX	chr10.fa		4738287	R	36	119					
+HWUSI-EAS610	1	4	19	60	21	0	1	TGGGGGCTTGCTAAAAGAAGACGGTGACCCCCCTTA	abbZabbaabaabaaa]]]]aaaa]`^Y^Xa`YVT\	chr10.fa		4738366	F	36	119					
+HWUSI-EAS610	1	4	56	1476	743	0	1	TTACTCTGCTGCCCTTTGAGGCCAGAAATAATGAAG	aa__a__a_][V]]_`]VQUXVRUXUYY_Z^\MW[[	chr10.fa		4738485	R	36	118					
+HWUSI-EAS610	1	4	81	1595	1562	0	1	GCTTAGCATTGTCTCAAACTTACTATGTAGTTTATA	`Z\a\`Z_V]`W\TGRRX]aaaYJZ[TOU[Y\aY``	chr10.fa		4738698	F	36	117					
+HWUSI-EAS610	1	4	82	894	1749	0	1	ATGAACCCAGCTTTTCCATTTCATTAGACTCTTTTN	`baa\aaba`aaaba`Z`b`a_a^aa]_[a[\]aBB	chr10.fa		4738791	F	35C	108					
+HWUSI-EAS610	1	4	80	304	1494	0	1	GAGCCCTTTCCATATTCCTGGTGACCAGGTACATCA	aUaaIa`aaaa]`a_\``__^W[__^[`_RY]_^^Z	chr10.fa		4738839	R	36	118					
+HWUSI-EAS610	1	4	20	156	874	0	1	TGATGTGATATGTTCTCTTATAAATAAATAACTAAA	ababb_bb`\abaab`baaaa]^aaa`aabaaa`\Y	chr10.fa		4738901	F	36	119					
+HWUSI-EAS610	1	4	18	911	742	0	1	GAGTGTTAGTTGGCCTTGGCATAGTGGTACTTGCTT	a^aTa__``__a]_]]a_]\_`__Ua_X^]^]`X``	chr10.fa		4739456	R	36	119					
+HWUSI-EAS610	1	4	1	336	293	0	1	CAAGTACCACTATGCCAAGGCCAACTAACACTCCAC	abab_a_`aaaa`aaa`Yaaa]`_[_a`[_``^Z`_	chr10.fa		4739459	F	36	119					
+HWUSI-EAS610	1	4	40	354	2034	0	1	TGGAACTTGCTGTGTAGACCAGACTAGCCTGGAACT	abbbbaaa_bbbababb_a`Ma_`bbbbb`baabaY	chr10.fa		4739587	R	36	37					
+HWUSI-EAS610	1	4	66	1562	955	0	1	ATACATGATTTTTGAGACAGAGTCTCGCTGTTACCA	^ababaX]^aaa_[a]_ab^b^`aaa_\_```^\]a	chr10.fa		4739633	R	36	119					
+HWUSI-EAS610	1	4	20	158	1065	0	1	ACATCGAGAATGACGTACAACCTAAAATTAGCCTTG	\a^`ab``a^`_^aa`[a`Nab`[_V_a\aaaaa`a	chr10.fa		4740056	F	36	119					
+HWUSI-EAS610	1	4	46	933	1956	0	1	GCATCAAACAGCTTGTGGGATTGTTTCCTCTTCTGT	abba`[bbaaaaaa]`b`^]aa``a`^\a^aa^a]B	chr10.fa		4740417	R	36	115					
+HWUSI-EAS610	1	4	59	385	25	0	1	GAGGAGATAGCCTGTTTTCACTGAGGACTATCTTTG	a^aa`baa_a``aa_`_`_`__^[YL]^\\^\_\^^	chr10.fa		4740691	F	36	119					
+HWUSI-EAS610	1	4	9	420	1048	0	1	GGAGATAGCCTGTTTTCACTGAGGACTATCTTTGTA	a`Wa[]]YY\_b__`_aS`_]a`_`_\a__^^^`_Z	chr10.fa		4740693	F	36	119					
+HWUSI-EAS610	1	4	28	1253	1354	0	1	GGCATGAGGATTTAATATGACTGCGGGGTAACGATG	``[_^[Qa_X]U___^TRVGXZQLXNRURTZUV^R[	chr10.fa		4741130	R	19C16	106					
+HWUSI-EAS610	1	4	16	1295	313	0	1	GACTCAGGAATCGGGAAATGCCTTTATGATGGATTC	aQTUZWGSTa_UV]Y`_ZU[W_WWX___UKEXGWZ[	chr10.fa		4741837	F	36	114					
+HWUSI-EAS610	1	4	79	1675	1145	0	1	GTCATCAGCTGACTCTCCGTTTCCACCGGAAGTGGA	_`aa]aa]\^]Z_^]aa^aa]]aXZ_Y_PT]TKPZB	chr10.fa		4741994	F	35T	111					
+HWUSI-EAS610	1	4	38	418	492	0	1	CAACTCCTTCCCAAGGAAATCAAGCTTTAGGGCTTC	ab`a`a]aaaaaabba`aaaa`[`__^``_`_a]]a	chr10.fa		4742057	R	36	119					
+HWUSI-EAS610	1	4	31	358	490	0	1	AGCTGGTCAACTCCTTCCCAAGGAAATCAAGCTTTA	a]bbbaT]aaa`abaabb`aaaa^aZ_aa`__a``]	chr10.fa		4742064	R	36	119					
+HWUSI-EAS610	1	4	37	1357	1024	0	1	GCCAGGCTGAGGTTGCTTCGCCGTTCATAGCCACTG	_a_aaaaa`\aa^aa_aa_a_a`a``_[^a^]a``a	chr10.fa		4742132	F	36	119					
+HWUSI-EAS610	1	4	32	737	929	0	1	GCTGAGGTTGCTTCGCCGTTCATAGCCACTGTGGCG	_a_``X]```a^a`_`a^\``_^a__\\Z\]Z\\[a	chr10.fa		4742137	F	36	119					
+HWUSI-EAS610	1	4	82	786	786	0	1	AAAACGAACAGCGCCCAGAGAAGTCCTCCGATTGCA	`_TZWT_a_RQWaTXW_PSbaYMH^][RXaQM\aR^	chr10.fa		4742276	F	22A13	99					
+HWUSI-EAS610	1	4	73	1706	298	0	1	AGAGTTCATATCTCTACCCTGTGATTTTTAACTGAA	`_`T_a_b_`____\`XaaaITRT_`__``_Y[T^^	chr10.fa		4742403	R	36	118					
+HWUSI-EAS610	1	4	13	1146	1664	0	1	CACCAGCATGCTCCACTTCACAGAGCCTGGATTTGT	``]ab^\VV[`_O_b^[a`a_Z_UbP_V\^_]^]]]	chr10.fa		4742983	F	36	118					
+HWUSI-EAS610	1	4	52	574	1937	0	1	GCAGAAGGAATTCAGAACAAATCCAGGCTCTGTGAA	aa\aaa]``aba`a\^\a]YRa^^^_^_]___Y[BB	chr10.fa		4742999	R	36	110					
+HWUSI-EAS610	1	4	14	380	986	0	1	GTACTTTCACAGGTAATTTTCCTTACAGTGAGACAT	a]aaaaaaaaaaa[_V`aa``aa``a_a]a_a```a	chr10.fa		4743271	F	36	119					
+HWUSI-EAS610	1	4	77	1348	246	0	1	GTAGGGTTTGCCAGCACCTGAATGACCTAGAGCAAC	_S__SKLY]\_N____`]U_`Q_^`^]_\S\Z\\_Z	chr10.fa		4743897	R	35T	87					
+HWUSI-EAS610	1	4	1	1678	141	0	1	ACAGCCGCTAAGCTATAAATGGTGTGAACAATTAGA	aa^W]TTY]WW\Z`^a^K_ZP\I_ZOSOVXVGVOZB	chr10.fa		4746212	F	6T28T	85					
+HWUSI-EAS610	1	4	63	513	620	0	1	GATGTGTCAAACCTAGACTGGATTTGTGCTTTGCAT	^JQ^Y[MYT\`T`S_a[X\WFR_Z`^LX_RRX\BBB	chr10.fa		4746500	R	20T13G1	91					
+HWUSI-EAS610	1	4	46	1403	202	0	1	GCCATCACGCGCATCAGGACGTCTCAACTTNTGTAG	^`bbbaabbbbbbbb`^^baaa\``aaab\D\_]b]	chr10.fa		4746613	F	23G6T5	73					
+HWUSI-EAS610	1	4	65	362	413	0	1	AGCCCTTGCGGCAGAGAGCTGAGCTCGACATTTGAT	KN`]aa^\O_^_aVOZ\W`]YQZTZ`^Q[]``\YVB	chr10.fa		4746814	F	36	113					
+HWUSI-EAS610	1	4	41	838	1669	0	1	TTGAAAGAACAGATTAGAAGCTGAGATGAGGCCTTG	abb`abaaa`_b`aaaaa]baaa_a]a[]a`__`a`	chr10.fa		4746871	R	33C2	82					
+HWUSI-EAS610	1	4	24	1435	68	0	1	AATCAGCAATTGGAACCAACCTGATGAGTAAGTTGA	^_[`a[ZZaR^\`_[\`aa`a^IW]T\aWU\XW`[X	chr10.fa		4747051	F	9G10T15	58					
+HWUSI-EAS610	1	4	85	713	771	0	1	TTTGACTATCCTGGAACTCTGTAGAGCAGGCTAGCC	abaaa_aa`_aa`a_a_aaaa`aa`__``___``__	chr10.fa		4747231	F	36	66					
+HWUSI-EAS610	1	4	15	310	656	0	1	CCACATTCATTGTTTAAACCTTAGAGAGTCACTCAG	aaa`^^^]]`_a^Q]aa^\_a\`aaa_aV_^[[]__	chr10.fa		4747816	R	26G9	83					
+HWUSI-EAS610	1	4	40	1584	1752	0	1	ATAGATCCTTAAAAACACCTGCATCTACAGTCCATC	a_a`_Z^YY^]WZXXZ]^ZVOZZZZZ^ZZWXWOZVZ	chr10.fa		4748383	R	36	118					
+HWUSI-EAS610	1	4	10	1387	1771	0	1	GCAGTGTTTGCTTGCTATTTGGAGTGAACATTATGG	`_a_aa]aaaZaa`_`aaaa`aaa^][_^aaa_``a	chr10.fa		4748544	F	36	119					
+HWUSI-EAS610	1	4	70	466	160	0	1	CAAATGCTATATCTCAACCTATAGCAAAGATTGTGC	`b``abWH\a_bb`ba``]_aU`b`aa\^X]Ta[a_	chr10.fa		4748690	R	36	118					
+HWUSI-EAS610	1	4	48	1761	403	0	1	AGCAAAGATTCCCTCAACCTATAACAAATGCTATAT	aaaaa`T`a^_^YZaaaaaYZa_a]``_`YXXY[\`	chr10.fa		4748714	R	36	119					
+HWUSI-EAS610	1	4	77	493	590	0	1	CTACCTCAGAGCAGGGTAAGGCAATAAATAGCCAAG	a_Y[a`OR_]UYG^ZbPa^aaa``a^`\T__Z_\Pa	chr10.fa		4748804	F	36	117					
+HWUSI-EAS610	1	4	74	108	1756	0	1	AATACTGGAACTTCAGGAGCCTAGCCATGGTTCCGC	\F[`_X_XZW]^X[S_`YZLSPM[`ZRT_VRF[`RZ	chr10.fa		4749315	R	36	115					
+HWUSI-EAS610	1	4	30	618	20	0	1	CGTGGCTGATAACAGTTTTCCCGAGTGCCCTACCTC	Z_]b]T]bb]T\]W]`aa]XW\_UVV\RV^[^[]_T	chr10.fa		4749716	F	36	118					
+HWUSI-EAS610	1	4	50	1580	737	0	1	TAACAGCCTTCTTTGCTTCATTCGTTTATGCTGAAG	ab^\baaaa`P\`_JZaaaaaaRa^aaaXHU]Vaa\	chr10.fa		4749808	R	36	117					
+HWUSI-EAS610	1	4	20	1503	680	0	1	ACACTCTGCTCATTCACTTCCGACTATTAACAGCCT	aaaaaa`a_a``_``a_a`a`a`_ab`^_a_a[^_`	chr10.fa		4749835	R	20T15	82					
+HWUSI-EAS610	1	4	24	1651	1450	0	1	AANTTCTATGGCATATTCTCCTTCTTGGTAACTTTG	a[DWaa_a\[Yaaaa`aaa`_aa^a^_`]_`\^^^[	chr10.fa		4749975	F	2C33	110					
+HWUSI-EAS610	1	4	46	355	892	0	1	AGATGAACCAATGCAAGCCCATACATCACGAAATAC	[ababa]``Y_bba`aba`aT]__``b\abUN]]U^	chr10.fa		4750170	F	36	119					
+HWUSI-EAS610	1	4	55	199	81	0	1	ACCCCAGTTTTTGCCAGTGCTAGCAGCACTGTTAGA	`aaa___\`a`a_^\\\V\WVX[\^W\]\W\UVYYW	chr10.fa		4750204	F	36	119					
+HWUSI-EAS610	1	4	70	436	1879	0	1	AAAACATGTGAGTTCCATAAAACTTTGAGGGTCTCT	ZYY_abbaZaa_]_aa\aZZSW`aaaaaa``Y`a``	chr10.fa		4750317	F	36	119					
+HWUSI-EAS610	1	4	90	1129	132	0	1	CATAAAACTTTGAGGGTCTCTGTTTCCTGCTGCCTT	Wabb[babb]b]b__WRb^ZW[`b_FYba_aZ[Rab	chr10.fa		4750332	F	36	117					
+HWUSI-EAS610	1	4	88	37	90	0	1	GATAATGTCACCTTGCTCCTCCAGTTCTCTGTAATG	`_\`aaa^aabb^`aa``__`]_ZZ_`^^``Za[^_	chr10.fa		4750397	R	36	119					
+HWUSI-EAS610	1	4	99	444	1101	0	1	GCAGTGGCCTGAGAGCACAATGCAGATAATGTCACC	aaa`[]^^^^a`__^``_^_______^\_`_X_[[\	chr10.fa		4750421	R	36	119					
+HWUSI-EAS610	1	4	79	715	903	0	1	ACAAAACAATCGTCAATTGTTCCAAAGCAAGTCCAT	aa`[^b`aa``aaa``abb`ba`aaaa`aaa`_`aa	chr10.fa		4751284	R	36	119					
+HWUSI-EAS610	1	4	60	1114	498	0	1	CAATGAACTAGTTAATTCTCTTCATGCAAATACCCG	`^bZ`b_Z[\bb_`_``R`bb_b_aYU_UR_aZZ\R	chr10.fa		4751545	F	34T1	86					
+HWUSI-EAS610	1	4	9	1048	1231	0	1	TTTACTAGATGGTTTCCAGAGCCCTGCTTCTAGGCA	`]`\^a`a_`a[RY^YRV`]Y`]]]]Y_XN]^^YPS	chr10.fa		4751624	F	36	118					
+HWUSI-EAS610	1	4	41	595	1246	0	1	GACAAAAACACAGACTTCAAAACCCTCTGCAGAATA	a``a``\`aa`_a_aaaa`_[a`aaa^`aa_a^_`^	chr10.fa		4752138	F	36	119					
+HWUSI-EAS610	1	4	46	1097	1128	0	1	TATCTGAAGGTGATGGTGTTAAAGACAAGTTCTACT	a^b_aa[^aaY`_^a`[a^Z^T\a[^_ZS\V__^W`	chr10.fa		4752263	R	36	119					
+HWUSI-EAS610	1	4	99	985	1137	0	1	ATAACATGTGGGTTTTGTTGGAATGTTACATTTTAT	`b`a__aa[aa`[a`aa_`a_[Xaa_a__]```^]a	chr10.fa		4752300	R	36	119					
+HWUSI-EAS610	1	4	37	962	1034	0	1	AAAGTAGACATCATTGTTAAAAGAATATAACATGTG	aabb^`bbabbabbbbabaY`\b`aa]a`aa`bbab	chr10.fa		4752326	R	G35	81					
+HWUSI-EAS610	1	4	89	682	1741	0	1	TAAAATGTCATCAGGATAAGCTACAGAAACATTAAA	SS[^T^[T[`aabbb[W^_`_QW_W`S^ba^]U[XB	chr10.fa		4752454	R	36	114					
+HWUSI-EAS610	1	4	60	1270	249	0	1	AAGGACTCCCTAAGCTCGTGGTGTTATTAGCCATAA	aa[Z`^_]`_______``Z`_Y_]^__]]^Z\^_^_	chr10.fa		4752658	F	36	119					
+HWUSI-EAS610	1	4	53	142	23	0	1	TTTTTCTCTTGCTCAACCACAAAGGCATAGAATCAA	abbaabaabbababa_aaaaa[``aaaabaa`_`a_	chr10.fa		4752736	R	36	119					
+HWUSI-EAS610	1	4	2	114	78	0	1	TGTTTACATAAAAGGAAGTAAGTGTATCATGTTTCC	abaaabaaaaabaa\U^aW`aa^a_ba`aaa`aaaZ	chr10.fa		4752801	F	36	119					
+HWUSI-EAS610	1	4	87	1191	123	0	1	GACAAGGGGCATTTTCTTAAGTCTGGATTCTCTATC	\QX`ST_]S_^\Z`\V```X_]`X\^R[^R`\^R_Q	chr10.fa		4752977	F	26G9	96					
+HWUSI-EAS610	1	4	51	143	2039	0	1	CAACATCAGAACACCATCTATAGCAGAACAGCATTG	a[Maa^ba`aaa`_a`\aZUWUT_Q^Y_[Z^^ZTTX	chr10.fa		4753069	R	36	118					
+HWUSI-EAS610	1	4	60	504	774	0	1	CATGACATGGTTTTCAACATCAGAACACCATCTATA	abaaaaabba[aaabbbaabbaba_aaaaaaaaaba	chr10.fa		4753083	R	36	119					
+HWUSI-EAS610	1	4	20	1042	1254	0	1	TATTAGGTAAAGAGTGAAACTGAATATGGGCTTCTG	aaababa^aaaa`__aa_a^aaaa_`_``_^`_Y_a	chr10.fa		4753137	R	36	119					
+HWUSI-EAS610	1	4	45	467	1831	0	1	GAAATCAAGATCATTTCTATGTGCACAAGTGGGGGG	\^J_bbbbb``_bbbbab\`a[b_abbbb_aba`Z[	chr10.fa		4753333	F	36	118					
+HWUSI-EAS610	1	4	16	268	1868	0	1	GGGGAATGGGAATGTGAGGTTACAGCAGTGTTTTAG	`bb\P`_bbUWPNb_a]abPa`abba]_P\]aaaba	chr10.fa		4753365	F	18A17	79					
+HWUSI-EAS610	1	4	40	521	1063	0	1	GGCCAAGCACTAAAACACTGCTGTAACCTCACATTC	aabX`aaa`a_`a]\XRa`aaba[OZX^`[L\_a`a	chr10.fa		4753374	R	26T9	90					
+HWUSI-EAS610	1	4	42	1246	1125	0	1	ATACATTGTCAGCAGGACTAGACCTCAAAGGGCACC	aa`\a_a`W[``\[]^__a`^`YPYV^_^[WPV^[W	chr10.fa		4754011	R	36	119					
+HWUSI-EAS610	1	4	99	633	437	0	1	GTCTAAGCAAAGGTAGGGTTCCTCAGTTGCTCTAGA	a```_aa_]_]__X_`a`R_^]^]__Z^_]^\___]	chr10.fa		4754113	F	36	119					
+HWUSI-EAS610	1	4	62	1517	1923	0	1	GTGCAGGACTGGCGCTTATTCTGTCTCAGGGTTGGG	ZY_[`_]OUZ`THZW[Z`__T\]WQ\YYS^[YPZ\_	chr10.fa		4754278	F	36	117					
+HWUSI-EAS610	1	4	100	315	1493	0	1	TGGGGCAAGAGCATGGCGAGGGGCAGCCACTGAGGC	`_``\__`\Z_]YXa`_a`\\U]`a`WX]]``_\XZ	chr10.fa		4754798	R	C35	82					
+HWUSI-EAS610	1	4	33	646	1309	0	1	GCTGCCCCTCGCCATGCTCTTGCCCAAACCCTCTGT	_VaVa`aRVUUXRXaXURVTHP[UXGZZWURZZ[BB	chr10.fa		4754807	F	25CG9	66					
+HWUSI-EAS610	1	4	42	1409	1393	0	1	GCCTTCCCTAGTTAACTGCCTTCTTTTATAGGAACT	a]abaa`aaaa\bb`]_aU]`aa``aaa]V`Z]YW^	chr10.fa		4754929	R	36	119					
+HWUSI-EAS610	1	4	64	671	819	0	1	TGTCACTGGAAGTGTGCTTTTGAGTTTGAGAAGCTC	aa\`\P^`]Y^]_a`bYN^aaa_aW`aa__Y_aWMT	chr10.fa		4755227	R	36	118					
+HWUSI-EAS610	1	4	42	693	1518	0	1	GTTTTGGTATCAGTATAATTGTGGCTTCATAGAATG	aaa^]]_\`a]`aT]_W\^a_U\_V]\MW`_]\\``	chr10.fa		4756042	R	36	4					
+HWUSI-EAS610	1	4	21	674	1924	0	1	AATTTCCAGAGTGCTTGTACAAGCTTGCAATCCCAC	a`aaa`__a]ZXa`a^a^^`^__U^^^]_^^^ZZ^X	chr10.fa		4757918	R	36	4					
+HWUSI-EAS610	1	4	56	1527	1482	0	1	GGTTGTAAACAAGGCTTCTGTGAAATTCCCACTGGG	ababaabaabbbaa`abbaba`aaaaaaaa^^a_`[	chr10.fa		4759828	R	36	119					
+HWUSI-EAS610	1	4	34	1266	1824	0	1	GGTCACTGTAATGAAGATAACCAATTTACCTTTATG	abW`_]_a[_\_a__`\`a_]Y^^`a`_WY`__]__	chr10.fa		4766436	F	36	119					
+HWUSI-EAS610	1	4	15	266	225	0	1	TGTTGATCTAGTTGACTCCAGACCATGGAAAATTGA	aaaabb`a`baaaaaa\ba\aaaaaaaaaaaa_`a_	chr10.fa		4766754	F	36	119					
+HWUSI-EAS610	1	4	40	812	1538	0	1	TGCACATATGTACGCACATGCAAATAGTGATTCCAA	ababaababa_a`aaa`aa`__`_aa^Y``_`_``_	chr10.fa		4766836	R	36	119					
+HWUSI-EAS610	1	4	71	187	574	0	1	TNTTACAGAGGACACAAGTTCAGTTCCCAGTACCCA	^D^bbbababa`baa`X`]_`^`_aaaba`]a`a`a	chr10.fa		4766970	R	1C34	17					
+HWUSI-EAS610	1	4	51	1083	222	0	1	TAGAATGTAGAGGATTAGATGTTCAAAGTCACCATC	\bb^^a`Y]O^`_^ZV\T]^\T`T``a_N]]a]U_Y	chr10.fa		4767599	R	36	118					
+HWUSI-EAS610	1	4	25	1179	1356	0	1	CAAGAGAAATCAAGAGACAAAAACCTAACACTAGGC	abbbbabbVbbaabbbbbb`abaaabaabaaaaaaa	chr10.fa		4768112	R	36	119					
+HWUSI-EAS610	1	4	65	1215	1700	0	1	ACCTGAATTTCAGAAGTTTTTATTTTTAATCCTGAT	ab^a`]`aaa`a_]\bYbbba`^ababa_b_]ba]a	chr10.fa		4768240	F	36	119					
+HWUSI-EAS610	1	4	83	1041	90	0	1	GTGATGGGCTGTGCATATGTCTAAGGGGAAGTGGTA	_N`]TX^_N\T]W[P]XY\NU`ZU]V]TNL]WBBBB	chr10.fa		4768830	F	36	100					
+HWUSI-EAS610	1	4	93	1659	499	0	1	ATCCTTCTGGGGCCTTTTCTCTGGTTGCTAACTTTT	aa``_a`aUSS^`_aaaa`a^aZZ^_[[aa_[_a_a	chr10.fa		4769016	R	36	119					
+HWUSI-EAS610	1	4	14	495	1949	0	1	AGTTGGAGTCTTATGAGCCCTCCTCCACCAGNGATG	[_YX[^[_UVR\QWW]Za^YOS_[TOVVa]YDZ_ZX	chr10.fa		4769285	R	31T4	109					
+HWUSI-EAS610	1	4	96	711	1219	0	1	AGAAATAAGTCACTGTCCTTAACCTTTTCCTGGAAA	aa[aa\`VZ``b_aa`_X\_]]__aaa[XY\`]W^S	chr10.fa		4769792	R	36	119					
+HWUSI-EAS610	1	4	92	654	1669	0	1	GGGGAAGGACCCCTTGTGGGTGATGCCATCTCTGGG	_^YYPUXVT]``aZaaK\a\TXPW\\Y`U\\\\`a\	chr10.fa		4770088	R	36	14					
+HWUSI-EAS610	1	4	73	1505	1123	0	1	TGGATATTTTAAAGGATTGAACTTTTAATATGTAAA	aba`aaaaaaa_`^_`a^V^a_aa_a`aaa``^`X^	chr10.fa		4770351	R	36	30					
+HWUSI-EAS610	1	4	61	1006	1331	0	1	GTGAGACCTTGGAGGCTCAAGTGAGGAAGTGATGCC	a^[Ta`HUX]^]QTNRVY^\aGYU`[YOEQVTXRVB	chr10.fa		4771935	F	28C7	102					
+HWUSI-EAS610	1	4	62	312	1600	0	1	ACAAACAAACAAACAACAACAACAAAAGACCCTGTC	aaVaa[O\_][`^`[W__X]``_``Y[^[_]_[^R_	chr10.fa		4771992	F	36	28					
+HWUSI-EAS610	1	4	63	1570	1867	0	1	GGTCTTCTACTAACAACCTTCAGATGAAGATGTAGA	ab_aab`a\X_`b^baNN^aaZa_`^^aa_ZY\aa_	chr10.fa		4772194	R	36	26					
+HWUSI-EAS610	1	4	21	739	638	0	1	ATAATTGGCTCAGGGAGCAGCATTATTTGGAGGTGT	aba``a]aaaa__Y`___^`_^aa^a`aa`XaaXa\	chr10.fa		4772299	R	36	119					
+HWUSI-EAS610	1	4	60	1208	1437	0	1	TACATTTCCTGCAAACGAAATAGTCCTAGTTTTGTT	ab__aabaYaaXa``^b]^Ua`aY`_a]a_`_aa[a	chr10.fa		4772384	F	36	119					
+HWUSI-EAS610	1	4	62	818	60	0	1	GTTATAGCTAAGACAAGATGGATCCATGTGGGGCAG	a_a`_aa_`__^^_^S_W[`_[WU]X]^X]]W^UU]	chr10.fa		4773492	R	36	119					
+HWUSI-EAS610	1	4	8	172	1799	0	1	TTAGCTATAACTACATCTGCAATGGGGTTAGATAAG	a[I\b^b`UabR^a_V_aa`P_X^\aZGVP[BBBBB	chr10.fa		4773517	F	36	95					
+HWUSI-EAS610	1	4	48	478	1337	0	1	ATTTCAGACAATTCTGACAACTTATCTAACCCCATT	ababa`b`_a_baaa`aaaa_aa`aaaaa^\^\a_^	chr10.fa		4773537	R	36	119					
+HWUSI-EAS610	1	4	24	82	27	0	1	TGAAGTATCCTTTATTTGATTTTGTGTTCTCATGAC	abbbbaabbbbbbaabbbabaaabab_ababbabbb	chr10.fa		4773747	R	36	119					
+HWUSI-EAS610	1	4	93	720	249	0	1	TTTATATGTAAGAGGGGTCTCTAGGGCTTCAGCCAG	`bbaa_b`_aUaYaZX^U[a[R_aa__a__]\]Qa_	chr10.fa		4774030	F	36	119					
+HWUSI-EAS610	1	4	79	828	1074	0	1	TAGGAGACTCTGCTGTGCAGAAAGATTGTGCTTGAA	_Z\]aa__aa`_W[WR_\^_V^``V[__U]Z```^^	chr10.fa		4774477	F	36	119					
+HWUSI-EAS610	1	4	91	1764	1079	0	1	GGAAAGAGTGCTAGGCGCATTCTCTCTTAAATATTA	\\abbbb`T\aaaYaaaaabaaaYaabbaabaaaab	chr10.fa		4774515	R	15T20	81					
+HWUSI-EAS610	1	4	65	1493	879	0	1	GATGGACTGGTGTCAGGAAGTATAAGATGCAACGAC	a_``ZNZXXX[a\_SUT^^ZR^aa^V^W^_`_VBBB	chr10.fa		4775072	F	32T3	79					
+HWUSI-EAS610	1	4	77	1692	1115	0	1	ACACAGGCTCTCATTAGGACCAAAAAACATATTGGC	aaaaaYF\[U__^Y^[JU^^a[aa`_```UZ\[OMY	chr10.fa		4775249	F	36	117					
+HWUSI-EAS610	1	4	62	71	1136	0	1	TTTGAGGACATATTAGCAAATGATATATTATGTCCT	_abb]ab]``ZbaaXU`U`aa^^[aa`aaaa^\aaa	chr10.fa		4775310	F	36	119					
+HWUSI-EAS610	1	4	86	69	270	0	1	CAAAGGATCAGAAGCTAGAAGTAATAAAAATTCCCT	aV^V_a``a_ab]aa`a`^X`Z``_a`]^_`^___`	chr10.fa		4775463	R	36	119					
+HWUSI-EAS610	1	4	2	709	1626	0	1	GCAGGTTGAAGTTAGGCCCTCAACCTTGTGTNAGAG	aaaUaaa`H`_S_RM]``a_a`_aV]^BBBBBBBBB	chr10.fa		4775940	F	31A3A	74					
+HWUSI-EAS610	1	4	40	30	1357	0	1	AGGTTGAAGTTAGGCCCTCAACCTTGTGTAAGAAGT	a\]]baWb]`bba`bba]_^`Xa_aaO\[]a^LSaX	chr10.fa		4775942	F	36	118					
+HWUSI-EAS610	1	4	20	231	866	0	1	GTTAGGCCCTCAACCTTGTGTAAGAAGTGGGTCATT	a^_a]_`^a_Z]^_a_U_U`Z_XRHPaX__GUa`U_	chr10.fa		4775950	F	30T5	106					
+HWUSI-EAS610	1	4	55	1030	1412	0	1	TTTGTGACCATCTTAATGACAGCAAAGAAATTACTG	aaba_aa_[^`^aaa`aa___`X]`^_X^`__]X_W	chr10.fa		4776056	F	22T13	90					
+HWUSI-EAS610	1	4	36	1110	603	0	1	GTCCTTCCGCTGATGCAGACGCACAGACTCCTTTGT	a`aaaaaaa]aa^a``aaa`___^a`^\_]^^^_a^	chr10.fa		4776115	R	36	119					
+HWUSI-EAS610	1	4	39	1633	26	0	1	ACACAGTACAGCAGCCAGCAATTTGAAGACTTGCTA	aaa`_^[__^O_^P^W]___^^^^RZTOXLWWWWW_	chr10.fa		4776473	R	36	118					
+HWUSI-EAS610	1	4	98	720	264	0	1	AGAGAGCTAATGTTTTCCCTGTGAGCTATACACACA	ab_baba`ba_bWa`]aa__]_`\a\a_aa^aaa``	chr10.fa		4776773	R	36	119					
+HWUSI-EAS610	1	4	56	1060	703	0	1	AGACCTTCCAGTGACAGCAACAAAGGAGTGGCCCAG	aaaaZa`]`a_^_a_a^`_a^_``^[U[X_^\WX^\	chr10.fa		4777298	F	36	119					
+HWUSI-EAS610	1	4	97	1181	788	0	1	GAACATGCCTTGTGCACATGGCCGGAGTGAGGCGGG	_aa_a^_a__``Z_^_^a`__``\aZ`]\T]`^`^B	chr10.fa		4777414	R	35T	112					
+HWUSI-EAS610	1	4	12	514	702	0	1	GATACCAACTACACTGCCTGGTGGCAGAGTGTGCAG	aaab^^`a``a````aXXaa_\aa`_a\_Ya\_\U_	chr10.fa		4777449	R	36	119					
+HWUSI-EAS610	1	4	11	1505	673	0	1	GTGGTTCACAACCACCTGTATAGCTCCAGTGTACTC	`^`b[bbb]`b_aba^abaaba_^aX^a][a__[__	chr10.fa		4777558	R	30A5	28					
+HWUSI-EAS610	1	4	93	335	1608	0	1	TGGGAACTGAGCTCAGGACCTCTGCTCATCCGGCCC	`aaa_aa^a_aW`a_\aZ``U^T`Z]`^Waa^ZQ``	chr10.fa		4777605	F	2A27T1A3	13					
+HWUSI-EAS610	1	4	64	690	613	0	1	AGCCGGGCTGGAGCAGGGCCGGATGAGCAGAGGTCC	``a__aaZ`a``aZ````^`^[^``a^]a[\X]Z^]	chr10.fa		4777620	R	18T1A15	49					
+HWUSI-EAS610	1	4	78	402	1968	0	1	AATCTCACCAGCCCCCAATGCTACACTGTTAGAAAG	a_abaaba``aaaaaa^a_aa__^[`_\]_X^_^[_	chr10.fa		4777829	F	C35	81					
+HWUSI-EAS610	1	4	9	620	731	0	1	GCTGATGGTGAGATTTCTAACCTTCAAGATAGCCAA	aaa][]aa_a]aa``a[aaa`_a_]___[`^_^_a_	chr10.fa		4778121	F	36	119					
+HWUSI-EAS610	1	4	47	326	1641	0	1	CTCCAAAGACCAGAGCTGAGATCACTGTTGCTAAGG	abba`baabab]a`ab_a_aa_aaaaa_aaa`^]aa	chr10.fa		4780036	F	36	119					
+HWUSI-EAS610	1	4	6	548	1835	0	1	TGATGGACCTCAATTCTGTGTAGATGCTTCTTTTCC	`aaabaZ]aa[]LZaaaaPa__`\^_a`__``a__]	chr10.fa		4780207	R	36	118					
+HWUSI-EAS610	1	4	92	403	36	0	1	CGCTAGGTTCTCTCGGAATGGTAAGCAGAATGCAGA	_[OR_\W_^`_T_Y_VM\`^_XI\bS_^BBBBBBBB	chr10.fa		4780891	F	36	83					
+HWUSI-EAS610	1	4	18	1066	737	0	1	TCTTTATGACACACTGGCTAACAAAATCCCAACTGT	a`a`aa^_^_`\[\_[__[__TLY^^^X^]\UY[SS	chr10.fa		4781000	R	36	118					
+HWUSI-EAS610	1	4	30	1435	311	0	1	ATCAGCTACATAGGGACAGCACCCCAAACACCTCCA	aa_aZ\]`_^Z]VNKR[_[^__[W[]Y\\]ST_W[[	chr10.fa		4781421	F	36	118					
+HWUSI-EAS610	1	4	40	557	478	0	1	TGTAGCACTCTTCAGAAGAGAGTCCTCTCCTGAAGG	a`]aa_a_aaa^a^aaa`aaa^\____a`__`XUY_	chr10.fa		4781601	F	36	119					
+HWUSI-EAS610	1	4	68	818	61	0	1	GGAGCAGCCAAGGAGTTGTGCTCTCTAGAGGTGAAG	`b]aa``aaaV\^PaZ`aaba_W`^`\`Y\YU`SUa	chr10.fa		4781851	R	33G2	95					
+HWUSI-EAS610	1	4	100	1538	580	0	1	TGACTTGAGGCTATCTGACCCATGACTTTCCTTCCA	a__`aaT`X]`a^]UVP`a_aXYT]Z]]`]][Z_`]	chr10.fa		4783132	F	36	119					
+HWUSI-EAS610	1	4	18	1059	1856	0	1	TGTGTACTCTTTATAAAAGATGTCTGGAAGATGGGG	a`O]a^WaWRUV`a`_[U\W^_[P`Y^S^[XY[WT^	chr10.fa		4783297	R	36	118					
+HWUSI-EAS610	1	4	3	1003	645	0	1	ATGTAACCTCAGCAGGATGTGTTCATATGCAATGAC	_\]]`_H[a^`^XYa`TTZE[X\XPY]VTLS[__^^	chr10.fa		4783560	R	36	116					
+HWUSI-EAS610	1	4	2	437	363	0	1	AATCAATAATTTGGGACAGGAGATGTGCCTCAGTCA	aaa_aaa``a_a`_a_Uaaa\a]aaZa_^_Z^_^__	chr10.fa		4783739	F	15G20	83					
+HWUSI-EAS610	1	4	40	925	968	0	1	GCTGAAGATCCAAACTGAGAGGTCCTCACGATCGCC	aaababaaa^\YX_V___^^^`U]_]^^U^^YTVU\	chr10.fa		4784536	R	36	119					
+HWUSI-EAS610	1	4	8	1026	1902	0	1	CAGAAGCCAGAGGACAATGCGGGCAGTCTTTCTTTT	aabb`bab_b`baa`_ab___aa__b__aaa_`aab	chr10.fa		4784725	R	19T16	83					
+HWUSI-EAS610	1	4	69	382	638	0	1	TGTGGGCATGTTTGTGTAAGTACATGCTAATGTGTG	abS`Z`Z[]a^`YSX^_PYa[aXZ^_W^WX`][^Pb	chr10.fa		4784801	R	36	118					
+HWUSI-EAS610	1	4	18	591	1702	0	1	GAGGACAGGCAGCAGCCACCTATAAGTAAACGCCTG	a\`S^YHXZa_a_^V]]^]P[^]]\^G`Z``^^]SU	chr10.fa		4785157	F	36	117					
+HWUSI-EAS610	1	4	45	1485	1297	0	1	GCTTGAGGGTATCAAAGGAGCTTGCAGCAGTGTTCA	aaaaaW\^`QY^^^^_Z_\YW\U_\\]YW\YYY\Y\	chr10.fa		4785336	F	36	119					
+HWUSI-EAS610	1	4	58	501	168	0	1	GGGCGGAATCAACAACATAGACTCTGGGAGCAGGTG	abbb^X^a_aa]^`\aaaababaaab\aaaabaaVb	chr10.fa		4785395	R	36	119					
+HWUSI-EAS610	1	4	58	224	1186	0	1	TACCTGCCCTTGGGGGTTGGAGATGAGCTGGGGCGG	`\]_a```a]]_a[_YJZ`a`_UYZVY_]_a_\\]Z	chr10.fa		4785425	R	36	35					
+HWUSI-EAS610	1	4	68	695	1079	0	1	CATATCCACCGTGAAATTTCTCACACCCCTCCTCCC	aabbba`abba^`\[Vaaa_`MOYaX___]`Z`_`a	chr10.fa		4785668	R	36	118					
+HWUSI-EAS610	1	4	9	1308	1299	0	1	ATATNTTGTTTCTTTCCCAAATGTCCTGATATTGCT	a`aWDHXaP_`]__a\ZZ]^]]]]]Y[^^_XX^`UX	chr10.fa		4785699	F	4G31	109					
+HWUSI-EAS610	1	4	4	636	223	0	1	TATGTTGTTTCTTTCCCAAATGTCCTGATATTGCTC	a\`^^`\_`ZN_`]W_]aa\aaPRUa_N_XYY[]]U	chr10.fa		4785700	F	36	118					
+HWUSI-EAS610	1	4	5	1611	1811	0	1	ATTGCTCTGTTTCATCAACTCTGCAGGCAAGGGCAA	a``a_T\Zb\Z\L^a``bWL\_a\`a_\`__\MX^^	chr10.fa		4785729	F	23T8T3	68					
+HWUSI-EAS610	1	4	66	1162	1138	0	1	CTGCTGCTTGAAAGAGAAATTAACATATGACTGAAG	aabaaR]aab_`\b\a_aaaaaa`_a``_a_a___a	chr10.fa		4785778	F	36	119					
+HWUSI-EAS610	1	4	39	471	1497	0	1	ATAGGACTTGTCCTCCAGCAACTTCAGTCATATGTT	a_W]]__``a_\a_a_R]a`U]^^`^`]`\_^`_Z_	chr10.fa		4785799	R	36	119					
+HWUSI-EAS610	1	4	34	1339	222	0	1	CTGTAGCCAACACCCTGAGGTGAAGGTTGGTCATAG	aab_a`Xabb^``__`]\WHV]Z_^^^_UVN\_[[_	chr10.fa		4785831	R	36	118					
+HWUSI-EAS610	1	4	61	661	1755	0	1	TACAAAGAATACTGTATACACTGTAGCCAACACCCT	abab``^``a`aa`_aaa`a`aY_`Z_`Yaa`__a]	chr10.fa		4785851	R	36	119					
+HWUSI-EAS610	1	4	93	1445	1379	0	1	GCTACTTGGAGACTGGATACAAAGAATACTGTATAC	a_`aWaa`a`__^`_a`[`_`__^`\^_W__\UT^]	chr10.fa		4785868	R	36	119					
+HWUSI-EAS610	1	4	13	331	1919	0	1	ATATACATATGTTTTAAGAATCCTTATGTCTAACAT	M]_b`bbbb``]bbb^baWaabbbaabbaaaababb	chr10.fa		4786399	R	36	119					
+HWUSI-EAS610	1	4	7	1786	1215	0	1	TATCACATGCACATATATACATATGTTTTAAGAATC	abbabbabXaa]aaaaaabX`_`aa[a_aaaaa_a_	chr10.fa		4786413	R	36	119					
+HWUSI-EAS610	1	4	84	1338	1772	0	1	GTGTATGTCTGTGCATGTGTGTGTTTATGTATCTGT	aab_aa`^_a^[a__aa_b^a\^]aa_`^^^`_^^Y	chr10.fa		4786464	F	36	54					
+HWUSI-EAS610	1	4	8	1422	1321	0	1	GAAACAGATAGAGACAAACAGATACATAAACACACA	]]aaUI]V`YS[]YWRN__[O\_`\_`]_^^^Y`\_	chr10.fa		4786481	R	36	118					
+HWUSI-EAS610	1	4	43	876	1008	0	1	ACCGGTTCCTCTGGATTTTTTGGTTAATTTTCCTCC	aaabbaaaaa`bb`_aababbaa`a`^aaaa`_aa`	chr10.fa		4786781	R	36	119					
+HWUSI-EAS610	1	4	28	1170	1005	0	1	TTTGTTTCCAGGGATTGTCTTAAGGAAGGCATGAAG	aaababa`^_a`__aab^`a`_^`_]]`]`_`a___	chr10.fa		4786897	F	36	119					
+HWUSI-EAS610	1	4	36	781	1460	0	1	AGAACATCTGATCTTCATGCCTTCCTTAAGACAATC	]_]`ba_aab`ba`bbabaaaba^abaXW^aaaaaa	chr10.fa		4786909	R	36	119					
+HWUSI-EAS610	1	4	4	1031	1929	0	1	TGCAGAAATACACGTGAACATAGCCCCATCTTTTCC	ab`aa``a_`ZaWaNa]_Z^`_`]___^^^__`]^V	chr10.fa		4787005	F	36	119					
+HWUSI-EAS610	1	4	49	992	1030	0	1	TTATTTTCTTTGTTCCCCAGACTCAGCATTGGAGGT	aa`aaaa`aaaa`a_N^`a_`_a__`[^[`[\[``W	chr10.fa		4787052	F	36	119					
+HWUSI-EAS610	1	4	78	228	617	0	1	CAATTGTAGACAGCATTTCACAGGCAAAAGCTGCAG	_[]`ab^`b`aaba`aa`aa`Z]aaa^`]`a_a_`_	chr10.fa		4787109	R	36	119					
+HWUSI-EAS610	1	4	49	369	1920	0	1	CAGTCGAAAGGCAAAGGAGGTGATCAATTGTAGACA	``]`b_aababb`abaaaa`W`W[aaa`_[`aa`_b	chr10.fa		4787133	R	36	119					
+HWUSI-EAS610	1	4	58	1238	1474	0	1	CGTTTTAGGGTTAGAGCTTCACATGCAAGCCAGGAA	^_Ybb`]X\X[]_aaaaa^R^\`_aaa^Y^`V`a[Y	chr10.fa		4787258	R	36	119					
+HWUSI-EAS610	1	4	46	1016	55	0	1	TGCAGTTCACTTCCTGTTTGTCAGTGATGATGATCT	aa]a^]`XZ]`__]a^^]`\PWXZUUZW\[SZY\Q]	chr10.fa		4787485	R	36	118					
+HWUSI-EAS610	1	4	95	1495	1915	0	1	GGAAGTCTTGTAAACCCCCAAAGCCCATCCTATGAC	a`^[`WZ``_^_aaW[ZSU^_[]_ZZ_ZSVTW\W\\	chr10.fa		4787527	F	36	119					
+HWUSI-EAS610	1	4	70	1740	508	0	1	TTTTGCTAGAGGAAGTAGGTCATAGGATGGGCTTTG	aaa[MW`_`ZPTY_[S\IMR_^^YJU\\QQRR[^ZB	chr10.fa		4787545	R	36	112					
+HWUSI-EAS610	1	4	11	1437	1010	0	1	GCAGTACTGAAAGAGGCCAAAAGAGGGTGTCAAATA	aaaa^a__`__Z__RT\`___\`Z^^VP]^]^]^^^	chr10.fa		4787885	F	36	119					
+HWUSI-EAS610	1	4	43	531	118	0	1	ATTAGACATGCCCCTACTGTTCACATCACTATCACT	aaaaaaaaaaaa``aa`aa__aa^a````_`___a_	chr10.fa		4788188	F	36	119					
+HWUSI-EAS610	1	4	95	1616	1774	0	1	TCCATTAAGAAGCTATGACATGGATTCCTGCACATG	][\Yabaaababa_aaaaYYX_`\``PU_]^\GZa`	chr10.fa		4788227	R	36	118					
+HWUSI-EAS610	1	4	45	1751	1402	0	1	ACATCACATTAATTAATGGGAAATATTACTTGCCTT	a_]YX^]^[[^_\[\]__\VSYX[X^YXXXVRVUQX	chr10.fa		4788293	R	36	118					
+HWUSI-EAS610	1	4	91	597	952	0	1	GTGATGTTTTGAAAGAATATGGCCCCCATAGGTCCA	a__F_b`a___[`ba`_]a`aa_X[_S_PW`ZTQWU	chr10.fa		4788322	F	36	27					
+HWUSI-EAS610	1	4	26	939	577	0	1	GAAAGAATATGGCCCCCATAGGTCCCTAGGGGAATG	`bbbb`a_aaa_aM^^`_X]`_QZMKYZ]`][LM_X	chr10.fa		4788332	F	25A10	102					
+HWUSI-EAS610	1	4	30	1163	1400	0	1	AGAAGAATTTTCAGCCCCTTCCCCAGTACCATGTCT	G^bb`babb`bbbabaaabbba]bbbaab^bbb_\b	chr10.fa		4788528	F	T35	107					
+HWUSI-EAS610	1	4	27	297	387	0	1	AGCCCCTTCCCCAGTACCATGTCTGTCTGCACACTG	]P]a`ba[]`X`^]U^]]OU^YYY_S[X^`^\TWSW	chr10.fa		4788540	F	36	35					
+HWUSI-EAS610	1	4	35	230	1578	0	1	CAAACACACCTTACCTCAACTGTTCCTAATGTGGTA	a^a^a`]]ab]`\aa_]]PJWW\aba^Y[ZaU__BB	chr10.fa		4788781	F	19A16	95					
+HWUSI-EAS610	1	4	8	447	1189	0	1	AATCACTGTAACCAGGAGGACTAACATCCTCTAATT	a_`_Y^_^NZaa^T``_aa^^a^aa^a]]__`___Z	chr10.fa		4788916	R	36	119					
+HWUSI-EAS610	1	4	44	297	20	0	1	ATTGGATCCCTTCAAAGCATGTTCCAGAATGGCTGA	aaaabb`aaaaaaaa`^][`]N[aaaa]Z[_a``]_	chr10.fa		4789403	R	36	119					
+HWUSI-EAS610	1	4	86	863	276	0	1	TATAACCCTTTGAAAAAAAGAGAAAAGGTAGATGAT	abbbba`_aaaa_aaa`a_b``\`_aaaZ`a``a`_	chr10.fa		4789628	F	36	119					
+HWUSI-EAS610	1	4	25	392	962	0	1	CATCTCAGAACTATGTCTGAGGTGCAAACCTGCACA	`L\bb]b_\_a]\aa[abaa^b[b`_`aabbbaaba	chr10.fa		4789870	R	36	119					
+HWUSI-EAS610	1	4	26	31	767	0	1	AAATGCTGCTTTCTTTTCCTTTTGATTTTCTTTTTA	\aabbbb_bbbbbababaaaaabbaabaaaaaaaa`	chr10.fa		4789921	R	36	119					
+HWUSI-EAS610	1	4	67	400	1680	0	1	CATGTCTGTGGAATCATGCTAACAGCAATTAGACAC	aabbabba^abaa_a`aba_aaaa`aa]`a_a_]R_	chr10.fa		4790068	R	36	119					
+HWUSI-EAS610	1	4	99	174	479	0	1	TAATTTTTATGTGTTGAGTGTTTTAAGTGCTGAGAA	aaVbbbbbaaa`baab_a^b`a`aaaaYaaab_b]`	chr10.fa		4790226	F	36	119					
+HWUSI-EAS610	1	4	7	221	475	0	1	TAAGTCTATACCCACTTATCTAGCTTCTCTGATTGA	abU\Naaaaba^_aaaaaaa`WaaZY]^aabaZ_`a	chr10.fa		4790316	R	36	119					
+HWUSI-EAS610	1	4	46	340	16	0	1	TGAAGCTGGAGAGAGAATTTCTCAGTGTCTTCTTCG	abaaaaaaa`]``aa_T[aaa```a^a`aaa`a`aa	chr10.fa		4791291	R	36	119					
+HWUSI-EAS610	1	4	36	305	379	0	1	GGAATCATGAAGGAAGACACAAAGCACGTTGAGATT	aaa`a`babaaa``a__`aaaa_aaaaa]`a[a_`_	chr10.fa		4791526	R	36	119					
+HWUSI-EAS610	1	4	12	1592	1711	0	1	TTTGAAGGTCTAGAACTAGTCTGGAAATTCGTGTCA	aa_`__``[_]`[__^`__Z^`_`___^^XXT]WW^	chr10.fa		4791566	R	36	119					
+HWUSI-EAS610	1	4	33	670	1486	0	1	AAACCTAAAGAGGTCATTACCATAGTCAAATACAAG	abababaaa^`a^a`baaaaaa`Ta`^^]abaaaaa	chr10.fa		4791627	R	36	119					
+HWUSI-EAS610	1	4	66	1773	1606	0	1	AGATCCACTGCTTTCCAGTCTCATTCTGGATGGCTG	_LYL\\`UWNFLRUWUUWY\KDTWUNNVWTBBBBBB	chr10.fa		4792087	F	21T14	81					
+HWUSI-EAS610	1	4	40	346	360	0	1	ATACTATTTATTAGAAGCCCTACCACTGGTGAGTCT	U^Z_\_b_`a_ba_Y_]`^Za]^b`^Y`_M^b`R]_	chr10.fa		4792366	R	36	119					
+HWUSI-EAS610	1	4	58	1123	1069	0	1	GAAGATGTGGGCACCAGAATACAACTAGACTGAAAA	a]`Q``_X___U`RW`Xa`[]_^`R\O[OR[YUT_T	chr10.fa		4792544	F	36	118					
+HWUSI-EAS610	1	4	81	300	1193	0	1	GGGCCTAAAGGTAAAGACCATTTTCAGTCTAGTTGT	a`[_a`VaaaaZa]Va`__]_`^`a_[]`\_`]_aZ	chr10.fa		4792564	R	36	119					
+HWUSI-EAS610	1	4	21	1231	1864	0	1	GGTCTTTAACTTTAGGCCCAACTGCAACTTTAGTGT	a`_R`aZ`G^_a`\_a[]_``^\_]^]W[UP^[M^Z	chr10.fa		4792581	F	8C27	107					
+HWUSI-EAS610	1	4	78	294	481	0	1	GGCACCTGAGCCTCTCCTTCAAACTCAGGCTGTCCT	a`ababaa]R\YT]aa^J[^`abPZZ]\]^ZPG^aV	chr10.fa		4792659	R	36	117					
+HWUSI-EAS610	1	4	76	831	232	0	1	TGGATCCAGAAAGCTCAGTGCCTGGTTCGCAGGGAC	aaa_a^a^`^]``[X^_[QY^^[V]V^\`^P\V^__	chr10.fa		4793236	F	36	119					
+HWUSI-EAS610	1	4	64	1473	47	0	1	CACTCATAGAAGCTATGGTTTGGGGCATGGGGGCTA	_`abbbb_T__T`aa]WXZa_]PZS^^_YWRYS_^Y	chr10.fa		4793365	F	36	118					
+HWUSI-EAS610	1	4	60	297	1201	0	1	GAACAGGAATTAGAAGTGAGGCCAGACCCATGAATG	aa`a`ab``aaaa`a`[a]_`a`a`\`__`_`__^a	chr10.fa		4793561	R	36	119					
+HWUSI-EAS610	1	4	71	846	983	0	1	CGAAAAGGCTCTAACGGCTTATGGTATATACCCACC	abbbaaabababba`ba`a`_[ba`abaa`_`Y]]`	chr10.fa		4793657	F	36	119					
+HWUSI-EAS610	1	4	57	514	33	0	1	CATACTGCCCTCCTCAGTGAGCATCACCCTTCAAAA	abbbabaaabaaaaa_b\````a_a```____`_X_	chr10.fa		4793701	R	36	119					
+HWUSI-EAS610	1	4	53	431	86	0	1	CATAAATAAACTCTAATTGTAGGATCTTGTGGTTCA	^abbabb_aaababa^baababb`a^ab`_bb^`_`	chr10.fa		4793868	R	36	119					
+HWUSI-EAS610	1	4	11	130	1282	0	1	GTCTGCTATCACCCACATTCCTCCCACATAAATAAA	a_[U^\Z``]_HV^ZTWWU[a]a``[[[[]ZI]TX\	chr10.fa		4793894	R	11A24	105					
+HWUSI-EAS610	1	4	34	645	517	0	1	AATATCTTACCTACATGTATGTCTCGTCAACATGTG	aaaaa``aa`a`aaaaa`aaa`Y``a\_\`^[_^Xa	chr10.fa		4794142	F	36	119					
+HWUSI-EAS610	1	4	4	1280	1141	0	1	GGAGCCATCATCCCCACTATTTGCCTTCCAAAAAAA	aaWZZ_`_^_`^_[_a``aa_`a^\aa\]_____\a	chr10.fa		4794767	R	36	119					
+HWUSI-EAS610	1	4	25	1496	797	0	1	TGCAACAGCGCTTCAATCACCTTCCATAATCCTTTT	`aabaaba]\^__U_aaaa`aa_a\``aaa[^```_	chr10.fa		4794939	F	36	119					
+HWUSI-EAS610	1	4	33	701	415	0	1	TGGGCAGAGAGTGGTTGGCAGAAGGACACTGGCTGC	_aaa`aaaa^`F`a]aa_^]`````\^S```_`X^[	chr10.fa		4795527	F	36	118					
+HWUSI-EAS610	1	4	74	1348	878	0	1	GGACACTGGCTGCCAGAGAAGTGGCCACAAGCCATT	abbaaab`Z`_bX_]aabZ]a\`b^aY_a`aWKR]`	chr10.fa		4795550	F	36	118					
+HWUSI-EAS610	1	4	68	862	198	0	1	GGGAGCCAGGATGCCCTGGTGACAGAGTACAACAAT	aaba``Z`X^Y^^a`Z\ZZNYVH\V[UUYP[WS`XZ	chr10.fa		4795912	R	36	118					
+HWUSI-EAS610	1	4	49	1041	1104	0	1	GGAGACCGGTCTACTAAGCCAGGGCTGCCGCGCACA	aaU[`^W`XFa_a^``^ZPUZPQ^R\`\^`SZW[SZ	chr10.fa		4795968	F	9G26	107					
+HWUSI-EAS610	1	4	95	1717	466	0	1	AACCACAGGGAGAGGGGGTGGCGGCGGGGTGTGGAA	a`^^^UUKLNPXZGWRZRBBBBBBBBBBBBBBBBBB	chr10.fa		4796184	F	27T5T1C	32					
+HWUSI-EAS610	1	4	70	479	65	0	1	GCTTGCTGCACATATCCTGGGCGCCAGTGATGCCCA	_S``\a`_aaXZ_a\``X\SZ[a`aS`T^`\X]Y\]	chr10.fa		4796339	F	36	119					
+HWUSI-EAS610	1	4	84	1193	856	0	1	TGCGCAGTCTTCAAGCCTTAGGTTCTGCTACCTAAC	a``^\aaZ_a`aa`_a^``aa`W^\a^_]PS^^_`^	chr10.fa		4796516	R	32C3	84					
+HWUSI-EAS610	1	4	8	1735	719	0	1	ACTTTGTGGCAGAACAAAATGTGCCCTGTCATGACT	a\aa`_]_[`a]_a__^`_`_]^^[^Z^Z]]Z^^Z^	chr10.fa		4797272	F	36	119					
+HWUSI-EAS610	1	4	60	1710	1126	0	1	CAAAATGTGCCCTGTCATGACTAACTTACTATGTTT	`babaaa[`aa_YXVa^aaa_aa`_aaaaa`a_Z`_	chr10.fa		4797286	F	36	119					
+HWUSI-EAS610	1	4	43	1240	1682	0	1	CTGGAGATATTCTTTATCTTCAACATGAAACATAGT	ab`aZbbabaaaabab[`a`^a`P\`a^]_]abaa]	chr10.fa		4797313	R	36	119					
+HWUSI-EAS610	1	4	27	979	1338	0	1	CTGATAAAGAGCTTTCCTTTTCACTCCCAGGAAGTG	_a`_aba^`a]aaaa]`abba^baa^\`aa]\\a[`	chr10.fa		4797474	F	36	119					
+HWUSI-EAS610	1	4	47	1173	1973	0	1	CGTAGTTGATTCCTCTTTAGTAGCACAAACAAGAAG	`a`ab``bbaaaaaabbbbababaaabab`aabaab	chr10.fa		4798485	F	36	119					
+HWUSI-EAS610	1	4	19	781	1045	0	1	TGAGAGGAGAAACTCACTCAGCTAGAAGACTCCAAA	aa`b`_aa`Xaa[a`a`abaaaa`aYaa_]_]\W_]	chr10.fa		4798615	F	36	119					
+HWUSI-EAS610	1	4	59	1220	851	0	1	GAGGAGAAACTCACTCAGCTAGAAGACTCCAAATAA	S^_QW^YabY\O]Vbaab]b____]a`_\TU__`Xa	chr10.fa		4798618	F	36	118					
+HWUSI-EAS610	1	4	80	611	188	0	1	AACCTGCCTTAAAGAGGTTGGCGAAGTGAGACTGTG	aa]^`baaab`_abaaa`aabXb`_a^a_aZZ`aVV	chr10.fa		4799085	F	36	119					
+HWUSI-EAS610	1	4	78	687	581	0	1	GGACTCCTGGTCCTAGGCTGTTGACTGGTCCTGCAG	a`_aa_a`a`_^aa_a`_`a\_][\X[`\\]T`UUY	chr10.fa		4799172	R	36	119					
+HWUSI-EAS610	1	4	24	591	1309	0	1	GTGTGTGTGAGTGTGTGTCCCTCAATCACTCTCCAC	a]b_^^a_`^``^V^T_Xaaaa`baa_aaaZR\a`a	chr10.fa		4799466	R	36	119					
+HWUSI-EAS610	1	4	38	39	1553	0	1	CTCTATATGTGCTATAGAAAACTTGTGCATGCGTTC	aab\H[\]b[abZR___VVTO]a`a`a_U\`^b__b	chr10.fa		4799506	R	36	118					
+HWUSI-EAS610	1	4	100	1197	1318	0	1	ATAGCACATATAGAGGCACATACACATGAGCACACC	_^_b`W\a``YVZ^a`]ba_ba_`S]V__`_`QaaB	chr10.fa		4799527	F	36	114					
+HWUSI-EAS610	1	4	57	696	1810	0	1	GGCTTCTGCACATTTGAAAACTACGCCCTAGTCTTG	abaabaaaaa_aaaaaaaaaaab`a__ab^a_^aaa	chr10.fa		4800091	R	36	119					
+HWUSI-EAS610	1	4	85	406	1153	0	1	GTGAAAACTCCAAGCTGGAGGAAGCAATAGCATCAT	aHa``[Z`a```\a_aa`U_a_I^YMR]\\UI`][^	chr10.fa		4800333	R	36	117					
+HWUSI-EAS610	1	4	55	700	480	0	1	GGACACTGAAGATCCTCAAGAGCATCACCAATTATA	abbabaaaaRaaaaababbabaaa`_a`aaa`aaba	chr10.fa		4800386	F	36	119					
+HWUSI-EAS610	1	4	73	1783	1642	0	1	TCAAGAGCATCACCAATTATACCATGAATCCTAGTG	aaabaa`^`aa]Zaa`aaaaa_S`ab_^Sa\a__[a	chr10.fa		4800401	F	36	119					
+HWUSI-EAS610	1	4	59	226	1675	0	1	AGCTTGGTACACATTAGGCAAGCACTTTACTAACTT	abaaaab_\abb`aaaaaaa`aaaa`a_`^_`a``_	chr10.fa		4800622	R	36	119					
+HWUSI-EAS610	1	4	67	204	807	0	1	TTTATCTTTGTAGTCTTAATTCTAATCTCAGGCTTT	aaa^aaabbb^^a_bba^U`abaaaabaaaaaaaa`	chr10.fa		4801243	F	36	119					
+HWUSI-EAS610	1	4	78	95	589	0	1	CTGTGAATTCCAGGACTGGCCATGGACTGGTGTAAG	`a^_`TKY^b^[^a]a_X]`ZY\]YSZ]]`P\NYG[	chr10.fa		4801502	F	36	117					
+HWUSI-EAS610	1	4	100	1173	903	0	1	GGGGAAAAAATTAAAACAGAAATTTGTTGCAACCCA	aabaaabaZaabbaX`^baYa_`Zab`aaa`a__^a	chr10.fa		4801543	R	20T15	81					
+HWUSI-EAS610	1	4	36	1763	1791	0	1	GAGCTATATTCCAGCCCAATTTTTTTCTTTACTTCT	aa][``a_`^`]]]_`_`Yaaaaaa^S\`aa\a`__	chr10.fa		4801625	F	36	119					
+HWUSI-EAS610	1	4	67	1178	790	0	1	CAGAATGGTAAGCAGATTCTAGATAGGTAAGTTGAC	a`aa[aa`]a`a_[`aaaabXaa`aa`X`^aX^^_`	chr10.fa		4801695	F	36	119					
+HWUSI-EAS610	1	4	83	1048	1846	0	1	GACATGGATGGAGATCAGCAAGCTATATTCTTGCAT	^ZY^aaU`aa`NY[aU^b_aZ]]\]a_]`T^aYY]a	chr10.fa		4801728	F	36	119					
+HWUSI-EAS610	1	4	35	855	1108	0	1	ATGCGTCATGACCTATACCATTACCTAATAGCAGCC	aaaaZ^`aaaa]^`_aa_a_aa``_aa^``__a_\_	chr10.fa		4801898	R	8AT25T	8					
+HWUSI-EAS610	1	4	85	1511	1062	0	1	AAAAGGGTGTGCTAAAGCAGAGGGCCTCCCTACCTG	aaYZaa`Q_Vaabaa^_aaa`a`BBBBBBBBBBBBB	chr10.fa		4802120	R	28A3A3	58					
+HWUSI-EAS610	1	4	42	1666	1687	0	1	TGAGGTAATCGGCTGGGACATTGCCTTTCTTACCTT	a`aWPLYZZH[LFYSTTUV`]]]U[RVBBBBBBBBB	chr10.fa		4802769	R	12A23	67					
+HWUSI-EAS610	1	4	79	1407	921	0	1	GTAAGACTGGAATGGGGTGAGGTAATCGGATGGGAC	_aa_Z]Y`\WUU^]W]`VY^]aU_^_S]\][XZH[Q	chr10.fa		4802786	R	36	118					
+HWUSI-EAS610	1	4	78	386	1556	0	1	TCTAAATGAGAATATTTGGAAATCGTACTTAGAATG	aaa\W]ababaaa_aaaaaaa_aaa\a`aaaa`_aa	chr10.fa		4803083	F	36	119					
+HWUSI-EAS610	1	4	61	1107	831	0	1	GAGATAATGTCATGTACCCCAGGTTGGCCTTGAGAA	a_a_aa```]_a]_]a_`_aa__U\`_]X_]]U`_`	chr10.fa		4803164	F	36	119					
+HWUSI-EAS610	1	4	45	1081	1751	0	1	GCTTGAATGCATCATTGTGGGGAAGGGAAGGCAGGG	aaaaa\Va`UYaU``a`Ua^a`U]a^ZTX\\\X_^`	chr10.fa		4803274	R	36	119					
+HWUSI-EAS610	1	4	44	1015	1038	0	1	AACTTCAGGGGGAAAAAAGATACTTATTTTAGTTTC	aa_bb_aa`aaaaaa__`baaa`aa_aaab`a[`aa	chr10.fa		4803327	R	36	119					
+HWUSI-EAS610	1	4	82	227	51	0	1	ACCCAGCGATGCATAACCCAGCCATAGAGGCTCAGG	_^`bbbaaaabbaa_`aaaa_```XQZ`^^_YQHV\	chr10.fa		4803545	R	36	118					
+HWUSI-EAS610	1	4	91	837	603	0	1	GGTGCTAACTACAGGAGCCTGTGCAGGGCATTTCTC	aa\b[b]b[_W^]^`aa_abbOTLO`Ka`aaaa``_	chr10.fa		4804045	F	36	118					
+HWUSI-EAS610	1	4	19	1430	1255	0	1	CTGTGAACTGCATGCTCTCCTCCTTTTCTTCTTAAG	Y[bbbbbbabbbb]bbbbababbbbbbbbbbbbb`a	chr10.fa		4804342	R	36	119					
+HWUSI-EAS610	1	4	39	1542	960	0	1	AGGAATTACAGCGTCTCCTCACTGATCACCACGAGT	a`[`abaaaaa^_`\]a_b`^YZa^]Q]Y_X[_XBB	chr10.fa		4804376	F	36	110					
+HWUSI-EAS610	1	4	83	974	738	0	1	TACATTGTCTTGTGTATACCCATTGAGTCTCAGACA	`aZOXb\b[b`aVb[bab^[^^a^`aVa`aaZVWVT	chr10.fa		4804422	R	4C31	90					
+HWUSI-EAS610	1	4	86	982	533	0	1	GCATCACATTGGTGATGTCCCGATGGGACCGGGAAG	aab^ZX^``ba_\]_]a]^]_]a]YR\U\\`\_YVZ	chr10.fa		4804546	R	36	119					
+HWUSI-EAS610	1	4	1	1472	1895	0	1	TTGTAGCCTCTGCATCACATTGGTGATGTCCCGATG	T_U_XS[^``J^^[^\aabY\[LZI`[aNVJ_\_[`	chr10.fa		4804557	R	36	117					
+HWUSI-EAS610	1	4	9	259	529	0	1	AAGTACAATTCCAGCTCACCTTGTAGCCTCTGCATC	U[^L_a``X[\ZZT^`a[W_V_a\__`\KWZ_[X_\	chr10.fa		4804577	R	36	118					
+HWUSI-EAS610	1	4	4	178	1491	0	1	ATACTGATTTCACAAATCAATACAGACTGATAAGCA	X\bbaaZ^aabbaX`UXbb^]a`^a`aaa_``WaBB	chr10.fa		4804922	R	36	110					
+HWUSI-EAS610	1	4	50	936	586	0	1	GGGGGGGTGGTCCAGGGGTTGGGGACTGGTCTGTGT	aGQ_^UY^[XF[^UWUJYU\VU_\^T\VaKRQ]K`X	chr10.fa		4805595	R	16A19	101					
+HWUSI-EAS610	1	4	35	299	494	0	1	GTCAGTCCTCTGTTTATGAATCTTGGTCATGTGTCA	aW\[\Y]`a\`a`a_aWZN\ZY[^a_Y]_UWWZZ^S	chr10.fa		4806263	R	36	118					
+HWUSI-EAS610	1	4	61	277	82	0	1	TCAGTCATTCAGGATTGCAGCCTAAAACATTATGCC	]bV_a_]aa_``^Z^]`bbbbb]ab^`a_aabaa]a	chr10.fa		4806714	R	36	119					
+HWUSI-EAS610	1	4	95	1730	372	0	1	ATAAGCTTAAAGGAAAGCATGGGAAGATGTTAAACG	aaba`a_`aaa^_aa`_^aaa`_a^`^`_[`a`_^\	chr10.fa		4806826	F	36	119					
+HWUSI-EAS610	1	4	55	1789	364	0	1	GGAAAGCATGGGAAGATGTTAAACGATATAGCTGTC	^^abaYabaa]`_aaaaaabbbba]aaaab]_^Y]]	chr10.fa		4806837	F	36	119					
+HWUSI-EAS610	1	4	60	1330	1197	0	1	AAAAAAAAGAGTTTTCAAAAAGTTGAATAATTCTTC	aba_`____[`Z`[_\_a\`\UXSZ^T_\^^Y]^__	chr10.fa		4807635	F	36	119					
+HWUSI-EAS610	1	4	79	1053	38	0	1	GATGTCACCAGCCATTGCTTTTGTTATCAAATACCC	aaaa_`a__^a``_aaa``aa```a_`^__^_`^Y[	chr10.fa		4809206	R	36	119					
+HWUSI-EAS610	1	4	5	1761	1484	0	1	TATGTTCAAAACATTCTTATAATTGAAAACTAGTTC	aaaa_a`aaaa^`aa_a`aaa`a^_____]`__]`\	chr10.fa		4809544	R	36	119					
+HWUSI-EAS610	1	4	9	1359	683	0	1	ATAGAAAAGCCACATCTTTCTCAAAAAAGTAATTAT	^bbbbb`bb_abaaaaabbaba^ba^a`a[_`aaab	chr10.fa		4809577	F	36	119					
+HWUSI-EAS610	1	4	47	609	267	0	1	AAATAGCTCTATAAGAGGAAAGACTGAACGACAGAG	aba`ba`bbbbbaaaa`[Zaaaa`b]`aaa``_a`a	chr10.fa		4809725	R	36	119					
+HWUSI-EAS610	1	4	92	610	634	0	1	TGAATGCCACAGGCCTTCAAGGTCTCTACTGATCTA	aaaa``aaa`aaa_aa_aaaa]Va`_\a``_`_``a	chr10.fa		4809777	F	36	119					
+HWUSI-EAS610	1	4	75	1011	1060	0	1	ATCAAATAGAAATTAAATCAAAACATAATTTCTATT	Z`Q\^F]^aaaab^_ZSb````X^baa``baaaaab	chr10.fa		4809873	F	31A1T1G	5					
+HWUSI-EAS610	1	4	67	1378	971	0	1	GAAGTCTCAGCCAACTGCTTGTTCTCCCTGTTCTAA	a^a_^`_`_[__`a_aaaaaaX_``_Z[_Z_[X_[S	chr10.fa		4810097	F	36	119					
+HWUSI-EAS610	1	4	7	1387	2011	0	1	CATGGGATGTATAAGGGACCAAAAACAACAGGATGC	]aZ``a]T_S_baa`baa`aa_OYaTaa_aaa_aaY	chr10.fa		4810141	R	36	119					
+HWUSI-EAS610	1	4	10	627	821	0	1	AGAGAGAGATTAAAAATATGGAGTTCACTGACATCC	abaZ]^\`Kab_``a^babb`a\^aa^aab_`]`_\	chr10.fa		4810391	F	36	119					
+HWUSI-EAS610	1	4	58	379	904	0	1	TGACTAGGTGGGAAAGGAAAGATAATTCAATAGTAG	abaab]aaUaaa``_ba__aa_`__aa_ba_`a^aa	chr10.fa		4810435	F	36	119					
+HWUSI-EAS610	1	4	19	1436	1698	0	1	GATAAGGGTTAAACATGGGAGACTGAAATGTCACAG	a_aZUaa`]aaYT\__`_`__]^__\[Y]XUX]Z]_	chr10.fa		4810496	F	36	119					
+HWUSI-EAS610	1	4	41	1695	1756	0	1	ATATCAATATGTGAAAATAATCTAGAAAAATAAAAA	_`abaabba_b_`aaababbbaab`aa`a`ababba	chr10.fa		4811064	R	36	119					
+HWUSI-EAS610	1	4	11	968	1934	0	1	AGATTATTTTCACATATTGATATGAAGCTGGTGACA	abaaaaaa`a_a_a__``aa`aaa``_^_aa[_^X]	chr10.fa		4811077	F	36	119					
+HWUSI-EAS610	1	4	27	1528	1050	0	1	CACATTTTCTCCCTGTCTATAAAGCTGGCCCGGGAG	abaabbbaabaa_`aa`baaaaa]`_Z^^`^[^\^`	chr10.fa		4811149	R	36	119					
+HWUSI-EAS610	1	4	39	683	730	0	1	AAGCAATGTCACTGAATTGACAGAACTTTGTTCTCA	aa_aaaa`aa`_ab`\aaa`\`a_`^_```Ta``^]	chr10.fa		4811246	F	36	119					
+HWUSI-EAS610	1	4	25	805	1546	0	1	AATCACAGGATTCTTCCCAAGTCAGTGAACAGGTCA	YY_Y_Wa\__a^Wa^[_^W]_\`a\\_VZVX``XY_	chr10.fa		4812207	R	36	119					
+HWUSI-EAS610	1	4	13	739	492	0	1	TTAGAGAAATTCTCAACAAAAAAATGCTGTGGCTAA	_a^X``aa]aa``KU]_^^Yaa``_Z]_a``Xaaa`	chr10.fa		4812310	R	36	118					
+HWUSI-EAS610	1	4	3	333	1523	0	1	GTCAGGAGAAAAGTGGAACTTGGACAGTCTTACCAG	a_abaa]a`b^baU]`[^aaa`aa_aa_a^_aa`a_	chr10.fa		4812454	F	36	119					
+HWUSI-EAS610	1	4	89	1359	1272	0	1	GGAGAAAAGTGGAACTTGGACAGTCTTACCAGAGCC	`_Q\X`[SHXW[X\_Q`aaP`UTYL[VLOZ__`BBB	chr10.fa		4812458	F	36	104					
+HWUSI-EAS610	1	4	13	95	1463	0	1	CAGCATCCAGGGCAGAGTCTAGCCAAGATCCCTGGC	__^_R_`a`a^`aV`U^TaX\]``ZZ]\X_aa]\[`	chr10.fa		4812491	R	36	119					
+HWUSI-EAS610	1	4	90	982	1943	0	1	GATGAAAATCTGCTTTATCATGATGAGTAGACCTTG	a^aa`a_aa]a__a`_a```aa_``^^^^_^ZW___	chr10.fa		4812605	R	36	119					
+HWUSI-EAS610	1	4	69	375	1164	0	1	ATTTTCATCCTCTGGTCCTACTTATCACCTACCTGC	abaaaabaaaaaa]]Yaa````aaaaaa`[a^a__a	chr10.fa		4812632	F	36	119					
+HWUSI-EAS610	1	4	45	1433	581	0	1	GGCCACGCAGACCAGTGTATCTGATGCTTTAGTGTA	a`ababbaY^aaaV_Tb_a__aaa`a^`a`]VZW\a	chr10.fa		4812875	R	36	119					
+HWUSI-EAS610	1	4	10	1719	2023	0	1	AACAAACATAGATAAAGGAGCAAGGCCACGCAGACC	`baaaa_baa_[_]aa`[]^[__aTZU\N\PTRXUW	chr10.fa		4812898	R	36	118					
+HWUSI-EAS610	1	4	91	328	1837	0	1	TATCCATGAAATAGTTGTTTTCAATTCATTTCAGTT	_b_ba[ab_\^bb`T^b[_^babbbab`]b]baa`]	chr10.fa		4813021	R	36	119					
+HWUSI-EAS610	1	4	62	352	695	0	1	GATAAGCCAGTGGATCAACAGCTATCAGCAAGGTTC	a_aaa`a`a\^aR_Y`__^W`_``___`__]`[U]_	chr10.fa		4813746	F	36	119					
+HWUSI-EAS610	1	4	82	1714	319	0	1	AGCAGTACACACTACTGTAAGGATATCTTATCTTCT	a_aaYZ`[`X`^_aZ_^[a`_N__^_Z^Y__^]`__	chr10.fa		4813801	R	36	119					
+HWUSI-EAS610	1	4	49	417	856	0	1	GTCACTAGCAACTATGTAACCTCAAAGCAGTACACA	a^^[_a`aa^``a_aa^`a`_`aa_Z```aZ__a^_	chr10.fa		4813826	R	36	119					
+HWUSI-EAS610	1	4	33	704	437	0	1	ACCAATGAAGTTAGCCCTGGGAGATGATTCTCTGTA	aba_ba`T^Z^a_[a_aa_baY`]X^`TY_aa^aQ_	chr10.fa		4814262	F	36	119					
+HWUSI-EAS610	1	4	88	1661	1873	0	1	AGGCTGCCCAAAACAAAGTGTTAAAAAAATGAGGAG	_T\Y``\Z[_]P_V]aabN_]^\_^a^^`a^a_a`a	chr10.fa		4814321	F	36	118					
+HWUSI-EAS610	1	4	74	1450	229	0	1	AAAAGTGGAACTTCAGTTGGTTTTGTATGAAAGGGA	a`aWSZ_TQ_[]_WWYY`a`UY_]UU]^UU[TSO`_	chr10.fa		4814395	F	36	118					
+HWUSI-EAS610	1	4	78	466	1071	0	1	AGTTGCTAAAATTAGTGATACTGTAGTCAATTATTT	aa_aa^a\V[_a`^\W\``^_`\Y^`^[_^``[a]a	chr10.fa		4814779	F	36	119					
+HWUSI-EAS610	1	4	58	1193	988	0	1	CTCTTCCTGCTTCCCAATACATTTGTGCTGATTATA	abaabaaab_aaaa_``ba`abaaa_a]aa_a``aa	chr10.fa		4816280	F	36	119					
+HWUSI-EAS610	1	4	48	190	1555	0	1	TAAACAAAGCACACACTATCAGTCTTGCTTTTCAAC	a^_aa`_aabbbabbaaa``^__aaaaaaaa`aaY`	chr10.fa		4816318	R	36	119					
+HWUSI-EAS610	1	4	62	1644	745	0	1	TTGTTTATGTGAAGTTATGATCTTTAGTCATCATAC	aba`^`\]ZW\YZa[]Ta`[^Z`_^ZUU[^_Y\_]Y	chr10.fa		4816347	F	36	119					
+HWUSI-EAS610	1	4	21	669	1370	0	1	GAGCCTAGTCAGTCCCATTTCTCTTTGCTGTGTGGT	^W_baaa``_a`_`a_aaaa`a`aaaa_`a_a[``\	chr10.fa		4816537	R	36	119					
+HWUSI-EAS610	1	4	96	1484	1206	0	1	GCTTGGCCTCCAAAGGTCCCTGTGTTTAAAGGTTTG	a_aa__^__`^_^[``\^\`a`U_W``TW\[US`]]	chr10.fa		4816652	R	36	119					
+HWUSI-EAS610	1	4	97	440	845	0	1	TCCATGTAACTAGCAATTAGGACATATCACAGATAT	aaa`ab]a]^aabaa`aaaa_T]a`_aa``aa`^^`	chr10.fa		4816692	F	36	119					
+HWUSI-EAS610	1	4	94	394	1584	0	1	GAATCCTTATAAAGGTATTGACTGTGTCCTAACATA	_`\abbb\aab\_\aSba__Yb]`UY[ba_[_`J_[	chr10.fa		4816725	R	36	118					
+HWUSI-EAS610	1	4	49	991	543	0	1	AAAAGCATATACTAAAGCATACATGTTGAAGTTAGA	`aa`aa`baaaaa`]Z]aaa^^`aa`aa][`_a`a^	chr10.fa		4816979	F	36	119					
+HWUSI-EAS610	1	4	72	1177	537	0	1	AAAGCTTTCCAGGGGAGAGGTGCTTGCTAAACTCTA	aaa`a_aa]_`aa__]a_`_Ra__^\]a^^^X]^__	chr10.fa		4817566	R	36	119					
+HWUSI-EAS610	1	4	40	12	1281	0	1	GTTAGCTGTGTCCTGGCCCCTCAGGACCTTAGCTAC	ab^bbb_ba`ab`abXaaaaW^a]a`WZa`a_SQQY	chr10.fa		4817758	F	36	119					
+HWUSI-EAS610	1	4	43	42	1242	0	1	TGGCTCTTCCTATTTTAACTCTCATGCCAGGTTTTA	aaabbbabab^[aba_HQb`bV`X[ab_H\bTaa`W	chr10.fa		4817939	F	36	117					
+HWUSI-EAS610	1	4	18	785	1275	0	1	GACTAGGCTAACATTACAAATCTGTAGTATAAATAT	^b`aVZbaWP_X[`bbaa^`aZ__U\YP]aWS^\Z`	chr10.fa		4818151	R	36	118					
+HWUSI-EAS610	1	4	69	143	437	0	1	ACATGGACTAAAAGCCAGCGTTCCCCTGCATAATAA	aaaaba^babbba`aaaaaa_`aaba^^a__aa__`	chr10.fa		4818188	R	36	119					
+HWUSI-EAS610	1	4	33	1436	949	0	1	CAGCTAAGCCACTTAAAGCCAATTTCTCATTAAAAC	Xa[[\bYU`\```_`baZX^a[`_bT^]_ab_V_WZ	chr10.fa		4818552	R	36	119					
+HWUSI-EAS610	1	4	38	1599	1192	0	1	CTTAAATCATAAAGGACAGCAAAGTGGCATTGCAGA	abbb`aa_aaa_W_a_`aa`a`XXT^__`^^^__\^	chr10.fa		4818822	R	36	119					
+HWUSI-EAS610	1	4	53	262	277	0	1	GATGAGTGCACTTTATAGATAACGGAGGGAAAGGGG	^Z_aZaYa`aaa````]`^`aa_ba^aaa\Y^]a`a	chr10.fa		4819371	R	36	119					
+HWUSI-EAS610	1	4	33	1306	450	0	1	GGGCCCCAGAGCTGAAAACAGAAATAGACAGATGCC	abb___a``[``a___`aaabaaaaaaa_aa_`\_a	chr10.fa		4819916	F	36	119					
+HWUSI-EAS610	1	4	83	482	774	0	1	TATCAATCAGAAATTGCTTCTGGATTAGGGATAAAG	aaaabaabaaababaaaaabbba`aaa`a__aa`aa	chr10.fa		4819951	R	36	71					
+HWUSI-EAS610	1	4	2	477	1564	0	1	TTAGAGTCCCTGTTCTTTCTGACATAGCCACGGGGT	a[X[]aYaaaab_abbaaaaabaaa]aaaa`aaabX	chr10.fa		4821275	R	36	119					
+HWUSI-EAS610	1	4	40	761	1696	0	1	ACAAAAACCTTTCATGTTGTCTCTTTTACTGTGTGT	`]`a_``ZUWY]\X_^_]`YUZ\^a`_UR_I_S^`^	chr10.fa		4821710	R	36	118					
+HWUSI-EAS610	1	4	45	279	671	0	1	TAGCAGCAAAACAGAAAGTGCAGGGGAATTTGCGAC	a]babbbbaabaaaS[]aabaabaab`a]aaabbXa	chr10.fa		4822112	F	36	119					
+HWUSI-EAS610	1	4	80	1148	862	0	1	AGTTGTCACTTGAGTATTAGTCTCATGGATAGGTGG	ab\aa]_`^aaa]a[aaa_a^\`[XaYZX^\^^X__	chr10.fa		4822197	R	36	119					
+HWUSI-EAS610	1	4	31	560	1287	0	1	CTGTAGTCAGTAGAAGACACGGTGAAGAGATGGATA	abbabbab`babb^^a_aaabb^a`_b`b``aaa^_	chr10.fa		4822326	F	36	119					
+HWUSI-EAS610	1	4	36	486	966	0	1	ACTGCACCTGGCTTTTCATATGGATGCTGGAGACCT	a`aaa`^a`a_____a`a_a`a`_\`\\]_W_Z__\	chr10.fa		4822406	R	36	60					
+HWUSI-EAS610	1	4	86	419	1642	0	1	TGGGGATTATGTTAATCAAGTGATCTGATATGAGAA	abbab`bbbbaabb^ababb^abaaabbabaabaaa	chr10.fa		4822915	F	36	119					
+HWUSI-EAS610	1	4	84	605	787	0	1	AGTCAAATGCAAGGGAAAATGAACACATTCCGGCTT	`b]aa_W`aba`bba^a`aa\a`a_`aa_``a_aaa	chr10.fa		4823030	R	36	119					
+HWUSI-EAS610	1	4	17	250	266	0	1	ACTTAACTTATAGGAGGCAGGGGTTTATTCCAATCT	_`aba`aaaaaba]\`aaZa]`a[``aaaaa][]_a	chr10.fa		4823132	R	36	119					
+HWUSI-EAS610	1	4	60	278	560	0	1	TAAGTTAAGTTGCTCTTTGTCATATTGTTTTGTCAT	aaabababb`bbbaabbbaZa`aaaaa^aaaa``aa	chr10.fa		4823158	F	36	119					
+HWUSI-EAS610	1	4	5	1080	1273	0	1	AGTCCAAGAATCATGATTGTTTGCCGTGGTTCCTTA	Xba]\^ZS_`b[ab_`a`^[^ba]]^aaa[a]_ab_	chr10.fa		4823252	F	36	119					
+HWUSI-EAS610	1	4	94	1689	1769	0	1	ATCTGATGGTATTAGGGAGGTTGGATTTCTCAGCTT	aaSaa^PPNQTUU[`_T___GT_^OFVWU]WU_BBB	chr10.fa		4823316	F	8A27	84					
+HWUSI-EAS610	1	4	78	493	1336	0	1	TGTCCAGTGCGGGAAGTTGGAGGAGGTCTGGAAAGC	aaabaaaaaaaba`ab_aba`aaaaaYY`aa]Yaa`	chr10.fa		4823351	F	36	119					
+HWUSI-EAS610	1	4	44	143	1984	0	1	GGGAGGTCTGGAAAGCCCTGTGGGAGGGTGATAACC	a_````Za```_`[aa``\^T^\\Z^]]R\SXYX\Z	chr10.fa		4823371	F	A35	81					
+HWUSI-EAS610	1	4	91	1159	566	0	1	TGCTCTCAGAACATGGGAGGAATGCTTTTGTGCAGT	aa`a`a\a`a`a`aaaa^ba`aa[a`aa^\^_]aa_	chr10.fa		4823438	R	36	119					
+HWUSI-EAS610	1	4	89	517	24	0	1	TGGCCATATCTTCCTTGGCAGTCCAGGATAGCCATA	aabbbba_bbbaaab`bbaaaGab``a^^`^a`a_a	chr10.fa		4823489	F	36	118					
+HWUSI-EAS610	1	4	88	924	852	0	1	CACCATGCTAAACAGCTATAATTCCCTAAGTGCAAG	abbbbbbabbabbbbabbbbbbbabbbab`ab[aaa	chr10.fa		4823565	R	36	119					
+HWUSI-EAS610	1	4	12	1657	167	0	1	GCAAGATGTGGGGGAGATAAGACTTGATGATAAGGC	a\`aVZYJNSF]RVY[ZU]^T^W[^ZZPRBBBBBBB	chr10.fa		4823834	F	36	86					
+HWUSI-EAS610	1	4	100	934	871	0	1	GATGATAAGGCACATTGTAAGTGATGTTATATATCC	]Q[^[`VZRWNV^]]Y_Y_^SDXWV\TLT]^VV\[X	chr10.fa		4823859	F	16T19	80					
+HWUSI-EAS610	1	4	13	1418	1997	0	1	GCCAATCAGAGGGATATATAATATCACTTACAATGT	aS[^`WVLXSXW^U^U\X]NXFSV\TT_]XVTSYWT	chr10.fa		4823870	R	21C8A5	80					
+HWUSI-EAS610	1	4	93	1561	1561	0	1	TAAGTGATGTTATATATCCCTCTGATTGGCTATCAG	aaaa[a_aa_`_a`aa_U[`a_`a`_a`__]STMWZ	chr10.fa		4823876	F	36	119					
+HWUSI-EAS610	1	4	82	663	658	0	1	AGATAACTTATCAGATAGAGATCAGATATTGAAAGT	_bbb`baba^ba^b`aba`aaaaabaa_aab__ab[	chr10.fa		4823910	F	36	119					
+HWUSI-EAS610	1	4	50	1640	677	0	1	TCTGGGCTTAGTCTTTTCTTCTTCTGCAGGAAGGAA	aab`a]abaaZZaab`baabaaa`a```aR^`__`a	chr10.fa		4823981	R	36	119					
+HWUSI-EAS610	1	4	1	1487	1153	0	1	ACAATATCTATTAACAATCTCTCTTGTGGTAAAAAC	^`b`a[_`bbbba`]aab`aba[aa\ab`ab_`ba_	chr10.fa		4824178	R	36	119					
+HWUSI-EAS610	1	4	73	1498	238	0	1	ATAAAGCGCTTTCCTTACAAGAATGACAACCTGAGC	ab_ba]DL[Y]`a`aa]ab`Z`aS[aaaa^aWY^Ya	chr10.fa		4824506	F	6T29	110					
+HWUSI-EAS610	1	4	57	998	1855	0	1	TTTGGAGGCAGATACAGGTGCATACCTCTCTGGTTC	abbaa\aa\`a_a\\`aaUaW\_\W^`\`W^ZVN`^	chr10.fa		4824618	F	33C2	100					
+HWUSI-EAS610	1	4	28	218	692	0	1	AAGCAAATAAGAAAGTCTGTATGCCAGACTGTCCGA	Y_ba\^`b_bba_`bYaba]babaaab^b_]\a``Y	chr10.fa		4825710	F	36	119					
+HWUSI-EAS610	1	4	75	689	723	0	1	GTTACATAAGTGCTATTTATATGCACAAGCAAAGGA	a``a_aaa_aZ^Xa_aaa`aaaaa^_____``^`a`	chr10.fa		4825871	R	36	119					
+HWUSI-EAS610	1	4	26	514	1006	0	1	GTGTATGATAGGCAAGCATGCCACCAACCAAGCTCA	a_b`aaba``aaa`a``aaa_`a\^__\__^`__a^	chr10.fa		4826191	F	36	119					
+HWUSI-EAS610	1	4	29	718	1299	0	1	GGGGAGTGAGCTTGGTTGGTGGCATGCTTGCCTATC	aaa]abZ_Z^aa`aa\^^_S_a`^`^^`_`]^^M^`	chr10.fa		4826197	R	36	119					
+HWUSI-EAS610	1	4	88	674	783	0	1	ATCACATGAGATTAGGTATATACCAATCATTATTCT	aa`a^aaa_a`^^_abGa_a_aX[__^_`a`a_`__	chr10.fa		4826288	F	9A26	80					
+HWUSI-EAS610	1	4	91	1224	1870	0	1	GGAAAGATGTGGTTGGTGGGGGGCATGCTTTCCACC	aaaa\`^^\^`aU`]YUW^Y`^SS][TTY^_U[_VY	chr10.fa		4826608	R	36	118					
+HWUSI-EAS610	1	4	89	272	40	0	1	GTAGCATCGAACACAACATGTTCTCTGGGGATTTTA	a[Ya]aaaa`_a\_H_^[`a[]]_ZYa[aaZYa]]R	chr10.fa		4827175	F	36	118					
+HWUSI-EAS610	1	4	86	944	85	0	1	AAAGATCTCTGTTTAAGACATGTGAAGGACCTCCTT	a]^b^\ab`ab`\aa]aa^abaXaaaaaa__`][`a	chr10.fa		4827285	R	36	119					
+HWUSI-EAS610	1	4	13	249	1314	0	1	GGGGATATACCCGAAAGGGCTGATTGGTTCTTTAAT	]aaa[_`_`a`R]``a_UUb`bY_H`^Y`a`_]R[^	chr10.fa		4827695	F	11T24	95					
+HWUSI-EAS610	1	4	2	1587	1185	0	1	TGGCGTTTCACAAGGTCTTACAAGTAATCTGAGAGT	a_]^a__^\]R][WXK\^Z_ZZ]YS[TYXYXV_W[B	chr10.fa		4827911	R	36	114					
+HWUSI-EAS610	1	4	5	1062	786	0	1	CACATAACTGTTGCAGGATATCTGATCACACTGTGA	a_`abaa]aa]bb^]aa[\aa\b`Sa[a[aY]PS_`	chr10.fa		4828035	F	36	119					
+HWUSI-EAS610	1	4	57	1111	1235	0	1	ACTAGAAACGGGTTTTTCCAGTAAACAGCACAATCA	aabbb___`aabO`aaIaa]]]aaa[a`_`^_a]__	chr10.fa		4828076	R	36	21					
+HWUSI-EAS610	1	4	97	1788	90	0	1	TGGTGTAGCTCAGCCTTAGCATACCGTTTGTTTGTT	a`^`WWaSb\`aYabaab`babaa__U`__UaaGYa	chr10.fa		4828114	F	36	118					
+HWUSI-EAS610	1	4	64	492	1098	0	1	GCCTTAGCATACCGTTTGTTTGTTTGTTTGTTTGTT	aaabb`baab_aaaaaaaaaa`[aaaaaaa```a`a	chr10.fa		4828126	F	36	119					
+HWUSI-EAS610	1	4	99	204	1675	0	1	AAACACCTAATTTTTAAAAATTGCCTTCGTTGGACT	_a_]OYb`U]_T`b^[``I`^Xbb`X_]`R^`[R]B	chr10.fa		4828191	R	36	114					
+HWUSI-EAS610	1	4	69	778	1877	0	1	AGCTTGTTCTCTCTCTGCAACCTATCTCCCTGTACA	\^X^[[aaab``aaabaa`a`aaaa```_`_]Ya`a	chr10.fa		4828776	R	36	60					
+HWUSI-EAS610	1	4	19	1588	1675	0	1	AGAGAACAAGCTAGACAAAAAGACAGAGCAAGACAG	ababababab_``[`]aab`bb`_aa`_\X]]a]_]	chr10.fa		4828800	F	36	119					
+HWUSI-EAS610	1	4	74	1041	1136	0	1	CTAGCCAGAGATCAGAAAGAACAAGAAAAGATAGGC	abb`Y```a]```ab`bbaa_Haba`a`]a_WHZ`[	chr10.fa		4828978	F	32G3	24					
+HWUSI-EAS610	1	4	52	1406	1779	0	1	AACAAGANAAGATGGGCTTACTCATCAGCAAGTCTC	aa_a`^ZD[`]`XXZ^^aa``a__a_``_W____a\	chr10.fa		4828997	F	7A28	110					
+HWUSI-EAS610	1	4	91	13	1355	0	1	CACATGATGCAAGTCAGCAATGATTGAACGCTATCG	]V_Z]a`\aaaaa_b_``QY`a___`a`a`_TYY__	chr10.fa		4829171	F	36	119					
+HWUSI-EAS610	1	4	84	1144	1521	0	1	ATTTTGCTTCTCCTAACTTCCCATCACAGAATGCAT	`^^`aaaaba_V_`aa]`a^_`\__`]aa`]aa^^_	chr10.fa		4829534	R	3C32	82					
+HWUSI-EAS610	1	4	31	255	495	0	1	GAGGATGCCCTAGTAGATTGTCATCCCATGCCTCCT	a_abY`_a`a^[a\a`][ZaG`ZWa__a__a_Z_Z_	chr10.fa		4829768	F	36	118					
+HWUSI-EAS610	1	4	10	600	352	0	1	TTCACTATGGGCCTGGAGACCAAACTCAAGTGCTCA	aaaa^a```^____aa^a]\_a``Y_^aa\WW^`\_	chr10.fa		4829925	R	36	119					
+HWUSI-EAS610	1	4	35	1190	884	0	1	AAAAGCTGGACCTAGTGGCACTTGCTTGTAACCAGA	aYa_`a[[__R^[\`R^[GMWZ^aT[_`S]\RY__^	chr10.fa		4829959	F	36	117					
+HWUSI-EAS610	1	4	17	407	721	0	1	TCCCAGGTCTGGTTACAAGCAAGTGCCACTAGGTCC	abbbabb^aab`^aabaaab`ba^a```^aaaaPaa	chr10.fa		4829966	R	36	119					
+HWUSI-EAS610	1	4	16	572	730	0	1	CATGAGTATGTGGTGCATGGGTATGTGTGTGCACCT	aabb_b^aaa`ab_aaaabba^aaa_a_a\a`_a_a	chr10.fa		4830142	R	36	119					
+HWUSI-EAS610	1	4	68	501	109	0	1	GGGATGCTGCGGGAGGCAGGGTGCCTCCCAGGGGTC	`a\JX`ZaX[]^ZZ\`W[X[`S^\TTPTKSPUZBBB	chr10.fa		4830748	F	36	105					
+HWUSI-EAS610	1	4	44	1163	1413	0	1	AGTGTTCAGAGACTGGTGGAAGAGCAGCACACAGGA	_[`bbb[X_VbRF^a_Z_`U`_S]aa[R[^TTTVBB	chr10.fa		4831248	R	27T6A1	83					
+HWUSI-EAS610	1	4	15	521	800	0	1	CACACAGGGTATAAAAAAAAAAGAAAGAAAGAAAAG	ababaaa_`T_aZ^a_ba^b`Y`^b`Y[]Z`W`ba]	chr10.fa		4831320	R	36	119					
+HWUSI-EAS610	1	4	32	686	1369	0	1	TACAGACCTCTCAAATCAGACAGAGACCTAGTCCAG	aaaaaa`aaaaaaa__`_`a`a^\X^\_]a`X`_^Z	chr10.fa		4831484	R	36	119					
+HWUSI-EAS610	1	4	67	145	645	0	1	CACCACACCTCAGATACAGACCTCTCAAATCAGACA	aYba^aaabaa^aaaa_T]Raa`aab`_^`a]a_a^	chr10.fa		4831498	R	36	119					
+HWUSI-EAS610	1	4	1	957	1369	0	1	CAGGTGCTCTAAGAACAGCTCCCTGTTGCCGGGTGG	aaa`\a___a__aa_^aaaa`_^``aaaZa^_ZQYa	chr10.fa		4831629	R	36	119					
+HWUSI-EAS610	1	4	8	952	137	0	1	TCCTCAGTCATCACAGGAATGGTTTATGGGAGAGAT	`_`^__TZ_`^W]`]a[][a_^Z^]W__]]X\ZZ]]	chr10.fa		4831787	R	36	119					
+HWUSI-EAS610	1	4	16	143	1592	0	1	ACCTTTCAGGCCAGTGATTGCTCTACGTTCCCAAGG	]abb``_\`aT`aaR]`\__ba`]a`b\_``\`_a]	chr10.fa		4831902	F	36	119					
+HWUSI-EAS610	1	4	83	803	1700	0	1	AAATATCTGATATGCGGGACATCTGATATCCAACCC	aaa``_a_a`]`___aaaa`\__``a`____a^_^_	chr10.fa		4832054	F	36	58					
+HWUSI-EAS610	1	4	47	712	1477	0	1	CACAAGGGTTGGATATCAGATGTCCCGCATATCAGA	aba^]aba_aaaab`aabbaa__a```]aaaaa``^	chr10.fa		4832059	R	36	67					
+HWUSI-EAS610	1	4	31	1349	1576	0	1	GTTCCTCTTGTTTAATGCCCTCTTTTGCTTTTGCTC	a_aa`V]aaa^a`]Ua]]a[___`___^aa`^_^`_	chr10.fa		4832178	R	36	119					
+HWUSI-EAS610	1	4	29	1041	1192	0	1	GTTGCCTTTATGGGGTGGGCTCCGCTGCAGAGCAGA	`^__\_`aaZ\^[^XT^\[Z`\^`^NQQZ^RZXT`B	chr10.fa		4832242	R	36	114					
+HWUSI-EAS610	1	4	33	1479	1324	0	1	AAGCGGAGGGTGTCGGATAATGAGGGGCGGCTTTTT	aa`]a]Qaa\UZ\^^\G`T[_`S`ZU^\]`BBBBBB	chr10.fa		4832285	R	30T2AG1	84					
+HWUSI-EAS610	1	4	49	487	525	0	1	TTGCTAGTCATTTTTCTGTGTGACTGAACTGGATTT	aaabaab`babbaaaa`b_aaa``ab`a_aaa`aaa	chr10.fa		4832323	F	36	119					
+HWUSI-EAS610	1	4	67	600	764	0	1	AAAGGAACAATTAACTAGACCAGAATAGTAGAAAAT	L]b\\`_G\`XWa`Wbabaa\^Y^ZRJKUJ\[^VJb	chr10.fa		4832355	R	26C9	101					
+HWUSI-EAS610	1	4	2	1242	518	0	1	GTTAGCTGGTTAAGTAAAGAACCCCAAAGGAGTAAA	a`ba`^_]]ZY`WaNaa_a_^\__]^^[`_][HYa^	chr10.fa		4832482	F	36	118					
+HWUSI-EAS610	1	4	79	161	171	0	1	TGGAGCAGAGCAAGCGCAGGATCTAAAGCGCTGTGA	ab_Za_`_a^ab^baa`^`aa^``_aaaaaa`aS`_	chr10.fa		4832711	F	36	119					
+HWUSI-EAS610	1	4	16	1282	33	0	1	CTCCAGCTACCACCGCTGCAATCTCACCCCCTGGGA	`aXK\\XM]]XT`WBBBBBBBBBBBBBBBBBBBBBB	chr10.fa		4832811	R	27T8	21					
+HWUSI-EAS610	1	4	50	1636	1640	0	1	AGGCTGTAGCTGTAACACATAATACTGTAGATCTCC	aPXaa\]]]`PJ_aaS_X`^_]RPY_^^]UW]Y\]]	chr10.fa		4832843	R	36	118					
+HWUSI-EAS610	1	4	57	1384	1472	0	1	CTTCACTCCTCACTAGCTAATGCCCAGTCCCTCGGA	aba^\]][]\K^VQ`a^aaa]^X[\][P^]]QOYXU	chr10.fa		4832894	R	36	118					
+HWUSI-EAS610	1	4	44	149	15	0	1	AACAGACTCCAAATTGAAAGAGAGTGATCTGGAAGC	Y_b^bbaab`Y_]b``][P_V`]_Zaa_aaaa_X\a	chr10.fa		4833670	F	36	119					
+HWUSI-EAS610	1	4	46	1533	1927	0	1	GAGTGATCTGGAAGCACGGAAGAACATGTCTTCAGA	\Ra_aV^Xaaa_\a`]^a`WX`]]U]]_VWZ[GVVW	chr10.fa		4833691	F	36	118					
+HWUSI-EAS610	1	4	52	437	546	0	1	TAACTGGGGGGAGTTATGTACATGTCAGTGCAGTGC	a_a_aaaa_`_\`___`__^\^__W^WZS_\_XV_[	chr10.fa		4834079	R	36	119					
+HWUSI-EAS610	1	4	97	799	1659	0	1	GGCAGGTAGGATGCTAAGCATTAAAATGTAGGTACA	`ba_aaXaaa^_a_aa`a__aaa]a_a`\_a_]`]`	chr10.fa		4834382	F	36	119					
+HWUSI-EAS610	1	4	7	108	342	0	1	TGATGAGTCATTCTACAGCCTGGGAGGCTCTACACA	``^`_Sa`^a^`baabbbbb`_b_W_aaaaaa````	chr10.fa		4834927	F	36	119					
+HWUSI-EAS610	1	4	66	681	541	0	1	CAGCCTCCAGTCTAGCTCTGTGTAGAGCCTCCCAGG	`aa_aaa`a^a`_aaa``a`_aZ`a`^a^_^^^\`_	chr10.fa		4834945	R	36	119					
+HWUSI-EAS610	1	4	41	1177	49	0	1	TGCTCAAGGATGCTCAGCTCATAACACTAGAGATGA	J_V^X`\S[ZPURHOYXUV``babY`IRZHLTYU]B	chr10.fa		4835246	F	36	111					
+HWUSI-EAS610	1	4	31	1580	1945	0	1	GTTTGAAGACAGTGTCTTCCTAAGTAGTTCAGACTA	aaaab^][^XSKU`^aS]XN`aT_WUOXWS^^WR]X	chr10.fa		4836264	R	36	118					
+HWUSI-EAS610	1	4	33	237	1696	0	1	GATGGTAGATTTTGAAATAGACAACTTAGAAATAAG	a``bbU\`aabaabaaaaaaaaaaaaa_aa^]`\aa	chr10.fa		4836950	F	36	119					
+HWUSI-EAS610	1	4	62	362	1416	0	1	GAGTGAGTTCCTTTCTTAGAAGCTGCATCCAGCATC	`abab_`aaba`b^aaaab`_`a_aa_]a`aa`aa`	chr10.fa		4837019	F	36	119					
+HWUSI-EAS610	1	4	70	269	1097	0	1	CATCCATCCATTCATTCATTCATTCGTTCACTTTAC	``^b`baba\bb`__ab\^abaaaaa_``[`aa`a`	chr10.fa		4837299	F	36	49					
+HWUSI-EAS610	1	4	70	1065	1237	0	1	CTGAGGCCAGACAAGGCAGCCCAGTTAGAGAACAGA	_bbbbbaaaaaab`aXb_a_a_ab\b^aab`aaaaa	chr10.fa		4837480	F	36	15					
+HWUSI-EAS610	1	4	22	1315	394	0	1	CAAATGTGCAGCTGGGTCTTCATGTAGGTCTCCCAA	aa`a`a^abbbbaabaabbbabba_ab`_baa_abb	chr10.fa		4837562	R	36	63					
+HWUSI-EAS610	1	4	38	1526	1160	0	1	CACACATAAGTAGCAAATGTGCAGCTGGGTCTTCAT	abaaa^`^P^a^P_]Z^a`^]aa]`a`^]S]_aaaa	chr10.fa		4837575	R	36	33					
+HWUSI-EAS610	1	4	52	361	144	0	1	CACGGGCTGGAACTAGGTCACACACACATAAGTAGC	aUba_a`XX_W``aZba\a`aaaaaX_Ra`abQQ^`	chr10.fa		4837597	R	36	119					
+HWUSI-EAS610	1	4	14	641	1784	0	1	AATCTAAACTCTTAAGGCCTCTCAGAGACTGAACCA	`^aaaaaZ]U\_[\^QQ_SX`]]Za]Z]a``a_[]a	chr10.fa		4837649	R	36	119					
+HWUSI-EAS610	1	4	94	1029	344	0	1	TCTTTCTGTGGAGCTCTTATTCCCTCCATCTCTTAA	a`bb]M\WZ[WWY`a_a`X]X]`aV]O]`]`_aa`[	chr10.fa		4837700	F	36	118					
+HWUSI-EAS610	1	4	73	1118	685	0	1	ATTCCAGGTCTCTGGCATGTTCTTGAGATGCCCTCT	^``a_Z]Z[Za`aaa``aaVa_a_]_]]Z_X_^`_a	chr10.fa		4838113	R	23A12	67					
+HWUSI-EAS610	1	4	56	937	307	0	1	TGTGTACAGCTCGGAACATCTGTAAGTCTCTCTGTC	a]U]X_M[VW[^^T^X[_^Ra]UQTWYVVRY^UNSZ	chr10.fa		4838459	R	36	118					
+HWUSI-EAS610	1	4	89	1205	1929	0	1	CACTGCCTGGTTACAAAGGCTTACACTATATGTAAG	^bbXZYIabbXaaaabb`aaaa```^``aaaa^``_	chr10.fa		4838556	R	36	118					
+HWUSI-EAS610	1	4	80	134	1106	0	1	TTTGCTTCCTTAGCTTCGTAAGTAATGTGCTAATGT	aaaabaabbaaaaa_`ab]``a]aa`a_aa`a]_`[	chr10.fa		4838621	R	36	119					
+HWUSI-EAS610	1	4	42	1017	1211	0	1	GCAAGTAATGAATGCCCCAGCCCATGACAACAAGAT	a\aab^a`aa_a_a_``_`a_[``_a^`]YY]ZYV_	chr10.fa		4838665	F	36	119					
+HWUSI-EAS610	1	4	2	1484	762	0	1	CAGCCCATGACAACAAGATGGGAGATCAGTTTAGTG	abbb```aba^XP_baaa^`aaTT\a]`Z[^]a_^a	chr10.fa		4838682	F	36	119					
+HWUSI-EAS610	1	4	94	1140	1149	0	1	GAATGGCTTCCCCAAAGGACAAAGGGATTTCCATTT	a]_`aa_`_XTY___Ya`___^^`__Z]^]Y\__^_	chr10.fa		4839417	R	36	119					
+HWUSI-EAS610	1	4	4	1314	1729	0	1	AAAGCTAAACATTGTATCTTGTATCACAGTTCACAT	ababa`bbb`aaaa\aa]^ab_a\```ab\_aa]Y`	chr10.fa		4839567	F	36	119					
+HWUSI-EAS610	1	4	98	656	976	0	1	AAAGCTAAACATTGTATCTTGTATCACAGTTCACAT	__ababb^b]aaba[_aaba^Pa``a_]\[_aaY_a	chr10.fa		4839567	F	36	119					
+HWUSI-EAS610	1	4	51	822	1094	0	1	AGCAAAGGGTTAATGCGGATTACAGTAAGCATCAGT	ab```aa_aWa`[aa`aaaaaa_aaa``]``a`]`_	chr10.fa		4840428	F	36	119					
+HWUSI-EAS610	1	4	57	441	1767	0	1	CATCAGTGAAGATGCAGCTGTGCACATGGAAACCAA	`\N\_]]UTWZ^_^`a\Q[`_]___]TW`]GGWZ[a	chr10.fa		4840457	F	36	116					
+HWUSI-EAS610	1	4	14	627	925	0	1	AGTGGATGGGTACCAGGAAGGCCACCAGGAAGGCAT	Q`abb`[ab`[``bbbb\`bbaaa``^b^W_ba]ZU	chr10.fa		4840510	F	36	119					
+HWUSI-EAS610	1	4	63	1347	1277	0	1	GTCATAGACCCACCTACCTCAGGAACTTGGCGAAGG	aa^aaaa```^a_^`a^`a_a^^^`\a`^_Z_]^_^	chr10.fa		4840958	F	36	119					
+HWUSI-EAS610	1	4	26	1298	283	0	1	ATTCATTCTGTAACCAATAGGTATGTAGAGCTACAT	```]`ab``a_b__a`R`aba]ab_a`\a__``X\a	chr10.fa		4841081	R	36	119					
+HWUSI-EAS610	1	4	9	683	383	0	1	AGACATGGGACATGAAGAGATGGCTCAGTGGTTAAG	abaaaaaaa_aaaaabaaaa_aaaa``aZaa_aaaa	chr10.fa		4841126	F	36	119					
+HWUSI-EAS610	1	4	30	653	13	0	1	TACAATAATCAGCCAGAACAGGGTTGGGGTTGGGGT	aaaaaaaaaaaaa``aaa_`a`^W_a`aaV_`a_`\	chr10.fa		4841392	F	36	119					
+HWUSI-EAS610	1	4	98	1243	835	0	1	AGTCCACCCAAGGTCAGCAGTCATTCTCCTCCCGAG	T_^VOX^`ZZ\V`IU\[`]a]YVR]RR`\W\_P_XX	chr10.fa		4841677	F	36	118					
+HWUSI-EAS610	1	4	18	633	486	0	1	CAACAAGTTACCTGGCAAACTGCTGGCACTGAACTC	ab`aabb`aaaaaaa`aaaaabaVa`_a_aa_a^_`	chr10.fa		4841995	R	36	119					
+HWUSI-EAS610	1	4	1	1700	1345	0	1	ACAGAATGAATACAAATTTACAAGGCTACATCAGAG	aXWHUJ\a`\Y[UL`\TYSUa[SYRFN^SYVWX^J`	chr10.fa		4842162	F	25T10	105					
+HWUSI-EAS610	1	4	34	1031	1973	0	1	TGGGTGGAATCTAGCTGGGAGGTGAAAGGTGACATT	aaaaT`a\\a_`__\\a`a^`_T`ZW__RV^^S\^^	chr10.fa		4842329	F	36	119					
+HWUSI-EAS610	1	4	35	1571	621	0	1	TCTGAACCCGAACTGGAGATTTCCTGCACTAATGTC	aaaa_a`_``_a_``^`\[^__``_^]_]_W]^ZZ_	chr10.fa		4842359	R	36	119					
+HWUSI-EAS610	1	4	9	251	270	0	1	CAAGCTGAAGCCTCAGAGAGAGTCAGAAGTGCTTTG	`b]a]aY\aWa]]\[bVa]a]b[__aZ^a_a`YaZa	chr10.fa		4842457	F	36	119					
+HWUSI-EAS610	1	4	21	1127	1976	0	1	AAGAATTCAAACAGGGCAGGAGCCTGTAGGCAGGAG	ab`a__^_`_`^_ZT[_\^^[_\SVUWUUZW\X\XZ	chr10.fa		4842856	R	36	39					
+HWUSI-EAS610	1	4	74	1664	78	0	1	ATGGCCTCGGGCCACAGAGTTGTAGGGTTTTATAAG	a`__[WQXZRPVZ[S_WLRTNNFUSQUKGRWWWBBB	chr10.fa		4843931	F	9A12C13	70					
+HWUSI-EAS610	1	4	82	787	149	0	1	GTAGAGTGCTTGCTGTTCNAGTGTGAGGATCTGAGA	a`YV\XN[LZ``\[_LVUDR]ZTXXU^Y[FKRYJVZ	chr10.fa		4844483	F	18A10C6	97					
+HWUSI-EAS610	1	4	38	1417	2024	0	1	GACCATGTTTCTAAAATAAGGTAGAGGGAGACTTAG	`ZTa][\T[VKP`RRW`[ZTHPUW\XWUVRSPZZVB	chr10.fa		4844896	R	36	112					
+HWUSI-EAS610	1	4	29	903	1780	0	1	CTCCTCCACACTCTCCCAGCATCTCAGTTCTCCTTC	abbbbaabbbbb]bbbbbabaaaba_aaabb`aaba	chr10.fa		4845322	F	36	69					
+HWUSI-EAS610	1	4	77	689	758	0	1	TGTTTTTGTCTGCCCAAGTTTAACTCTTGCCATCTA	ab^aa`aa_\Q^^`^^^a^aa__^`\_^^^^Z^[\[	chr10.fa		4845593	R	36	35					
+HWUSI-EAS610	1	4	11	982	279	0	1	CCCTTCTCATGAGCATATTCAGTCTACTACTTCCTC	[aabbaabbabaa_baabaaba^aaa_a_Z```_a`	chr10.fa		4846429	R	36	34					
+HWUSI-EAS610	1	4	82	828	1028	0	1	TGAGAAGGGGCAGGGGAGGAAGAGAGGAAGACAAGA	aa_aY_`aYYPP]ZN^TR]ZPTZ^W]]GY`WUY\^\	chr10.fa		4846456	F	36	117					
+HWUSI-EAS610	1	4	18	79	85	0	1	ACCTTCTGATCCATATATAACCTTGCCATTTTGGCT	^ba`ababb`ab``baa_`Y`baaaab`a`^aaa`_	chr10.fa		4846524	R	36	119					
+HWUSI-EAS610	1	4	71	974	1219	0	1	GTTCATAGGCTTTCCTTCCCCCACCTTCTGATCCAT	a_aV`___W\_]\\\_`\^\]^_TU]^WW\YWWSS\	chr10.fa		4846546	R	36	119					
+HWUSI-EAS610	1	4	45	775	1053	0	1	AGACCTATGCAAACTCAAGCCAGACAAGATATCAAT	`baabbabbaaaaaa``a`aaaaa_aaaaa_aaaa`	chr10.fa		4846926	R	36	119					
+HWUSI-EAS610	1	4	74	1755	1934	0	1	TTTTCTGGACAAGGCAGGGTAGTTACACATTCACAG	abbba_aba_`]^``^bb^W]^U\`a`Z_[``\U_`	chr10.fa		4846972	R	36	119					
+HWUSI-EAS610	1	4	93	1036	1524	0	1	CACTGTGGTAGGCACTAAGAACCTGTGGCTGGATAG	__^a^\a`[]^[XS]aab`\aZ]aa^a`Z^^XMRQ\	chr10.fa		4847335	R	36	118					
+HWUSI-EAS610	1	4	79	650	855	0	1	GAAAGTAGCTGAACAGCTGGGTAGGCCTGGCGACTC	[IU_^R^]aa`abXNZSR[\_W]T_P]TZZE\TN[B	chr10.fa		4847416	F	30T5	103					
+HWUSI-EAS610	1	4	86	298	1798	0	1	AGAAGAAAGACATGAGGTGATCGAGCTGGTGCTCAG	^a`a`R`]a`baaaa_`Ya`_aaa_``_a\_a_^`_	chr10.fa		4847528	R	36	119					
+HWUSI-EAS610	1	4	36	1679	1655	0	1	AACTACTGAGCTACTCTTCCAACTTCAGGGCTTTTA	abaab]_b_a^`__a```YY^^__aW]__`]_``_a	chr10.fa		4847949	F	36	119					
+HWUSI-EAS610	1	4	84	692	1313	0	1	GGCTCTAGAAATTTGACCTCCGGCCCTCATTACTTG	`b`_aaba[Y[[]Z```a^YF^R_[__Y`\aY^YVR	chr10.fa		4848047	R	20A15	108					
+HWUSI-EAS610	1	4	60	801	1724	0	1	GCATGGTCACACACACTTGTAGTTTCAGCCCCGAGG	\_aaaa`V`a_^a\`aaba]a`^aaaa``^^_a\aa	chr10.fa		4848098	F	36	119					
+HWUSI-EAS610	1	4	10	114	440	0	1	GATTATTAAAGTCTGCATTTCTTAAGGATGAGTTCT	a`_```^````Oa_aa^aa`aaabaabaa`^aI``Y	chr10.fa		4848161	F	36	118					
+HWUSI-EAS610	1	4	14	566	1441	0	1	CTGGGAATCCTAATTAGAGGAATTGGCAGTGTTGGA	ab`b^\aaaa_`^a^\a_aa^a_^a_`]`U^U^BBB	chr10.fa		4848420	F	34T1	103					
+HWUSI-EAS610	1	4	24	1367	536	0	1	AGTGCTGTAACCGGAAGCTGCTTCTGGTCCAATAAG	]]Yb]\UI]ZSXa_aQ_bb`__`^\aaT_a[X]^ba	chr10.fa		4848506	R	7G28	105					
+HWUSI-EAS610	1	4	36	1236	63	0	1	AAGTGCTGGAACCGGAAGCTGCTTCTGGTCCAATAA	abaU_`aaa[_`]][aaaa^[_\__`XGPW]_\`_`	chr10.fa		4848507	R	36	118					
+HWUSI-EAS610	1	4	73	384	204	0	1	ACAAGTGCTGGAACCGGAAGCTGCTTCTGGTCCAAT	`aa```aaaba_aaaaa`^````aaaaaa`\``b`_	chr10.fa		4848509	R	36	119					
+HWUSI-EAS610	1	4	24	1736	935	0	1	TTACCACAAACCCAGAGAACCTCCTCTCTCTGCTCC	aaaa_a_aa`\`a^UZ[UNN\V\\\X^\\^SSV_V_	chr10.fa		4849322	R	36	118					
+HWUSI-EAS610	1	4	33	1583	1088	0	1	AGTCACTGCAGCCAAACATTGAGCACCAAATTCAAA	a[IYbb_S_bb_[R_[WUa`[]WWa`aa^ab]aY``	chr10.fa		4849357	F	36	118					
+HWUSI-EAS610	1	4	83	1574	1952	0	1	TGTGTTTGCATTGCACCCAATACTAGGAGAGAGGTG	[aJbbbababaabHa]baa_a^[a_b`[aYaYa[R]	chr10.fa		4849919	R	36	118					
+HWUSI-EAS610	1	4	98	1221	893	0	1	TGTGAATCTTCATTCATCTATTTAGCATATGTGTAT	_a`aUT_ab_`^``_^_H_]\`ba]a__aaX[`XaS	chr10.fa		4850093	F	36	118					
+HWUSI-EAS610	1	4	24	602	1850	0	1	AGTGACTCCTAAGCATTGCATACATGGAGCTCGGGG	^`T_UIY`\_Q_bb``X_\T\[[a^b_Z`bZR]aaa	chr10.fa		4850346	F	36	118					
+HWUSI-EAS610	1	4	32	526	193	0	1	AGCAACCCCGAGCTCCATGTATGCAATGCTTAGGAG	[b_X_VRV]`TaZTT[YF^XXYba\`T``\^Q]XS]	chr10.fa		4850351	R	36	117					
+HWUSI-EAS610	1	4	72	1312	1108	0	1	GTGATAGCAACCCCGAGCTCCATGTATGCAATGCTT	`\W^W[_W[TVWPU[_aSQXTZROFXVXRRXRXUY[	chr10.fa		4850356	R	36	117					
+HWUSI-EAS610	1	4	26	614	1899	0	1	AAGTCAACACAACACGAAACACAACCCTACAATATT	aYaX]`aTY^a\]\]][a[_]`__V^^XTHS^][]_	chr10.fa		4850700	R	36	118					
+HWUSI-EAS610	1	4	66	22	1254	0	1	GAATAAAACTGCTACTTCCATTTAATGTTTACTCTG	WT]aaX_aba[^\bba`b`[`aa[abbRaZ]a`bVS	chr10.fa		4850813	R	36	119					
+HWUSI-EAS610	1	4	37	863	610	0	1	GTACTTTTCTGTCTCTTCCTGGACAGCTCCCTGTAG	aaa_aaaa`a`\aa`_`]__a`_`_`_^U_\\_UX_	chr10.fa		4851069	F	36	119					
+HWUSI-EAS610	1	4	66	1516	1106	0	1	CTTTCAAACACTCCTCTGAGGCTCTTTCACCCCCAA	a_]abbbb`b^ab^QZa\]`]TFRaaXO\_a`VW]R	chr10.fa		4851436	R	36	117					
+HWUSI-EAS610	1	4	33	426	1557	0	1	AAGCTGTCAGACAGTCTAGACAACAGTGAGGTAATT	^Y`aaa`aa`_[aa_a`\[_aaa__a]a`a`Z``a`	chr10.fa		4851679	F	36	119					
+HWUSI-EAS610	1	4	9	1091	1061	0	1	CTCCTATTCGAACTCAGTTTGGGTGAGCATAAGAGC	T_b``[^a\[O_b_`U^Y^a``\[Ua`bbabaaaaZ	chr10.fa		4851973	F	36	119					
+HWUSI-EAS610	1	4	15	67	1738	0	1	AGACCAGAGTTGACTTCAGGTATTCTCAATTGCTAT	a`VaaH[W_]\XY`\_b_^^OT^aa]`_a[aaaaa[	chr10.fa		4852609	F	36	118					
+HWUSI-EAS610	1	4	93	45	1937	0	1	AGTCAGGGTCTCTCACTAAACTTAGATCTAGACTGG	I\__X^b_Pa`a]]]b`aO^___b`MVb[a_Ub_`b	chr10.fa		4852660	F	36	118					
+HWUSI-EAS610	1	4	49	383	1763	0	1	AACTCCCAGAGTGCAGAGCTAGGGAGATAGCTGTGT	^ab`bbaaaab`aaaa`aaa`aaa]aa`aa`aa`a_	chr10.fa		4852845	R	36	119					
+HWUSI-EAS610	1	4	37	518	704	0	1	CACTCTGGGAGTTTGTTCACTGGGGATGGCATATCT	aa]^ba_^`X_]^a_W_aa\a^`_U_[`]`Z]_baa	chr10.fa		4852868	F	36	119					
+HWUSI-EAS610	1	4	43	1706	1189	0	1	GGATGCTTGAACATAGAGAATTTTGAACTTCAAAGA	aaaT[Za\]_bVaa_]^Z_]a`^a_Z]]^Y\\J[^B	chr10.fa		4853029	R	36	114					
+HWUSI-EAS610	1	4	18	696	273	0	1	AGTGATGGCTTCTGGTGGGGGAATGGGAGAAGACGA	_a`b`bbb`baabbb_bbbba_abba``aa`a``aa	chr10.fa		4853401	R	36	119					
+HWUSI-EAS610	1	4	84	175	1459	0	1	AAAGTAATGGTCTCCACAAGAATCCATTGAGGAAAC	_]Y`a`^`bbababbbb^[baa`bba`ab`aaW`^b	chr10.fa		4853481	R	36	119					
+HWUSI-EAS610	1	4	17	1020	1609	0	1	GAATCAGCTACTTTTGAGAACATGTGAACCTGAAGA	aaaa`aa_a`]aaa^aa`aa``^aVa_UZZ`a_]__	chr10.fa		4854297	F	36	119					
+HWUSI-EAS610	1	4	11	604	1369	0	1	TAGCACCGTATGGCCCAAGCCTTCCTGTGCTACCTT	aaaaa``aXa\a^`_`]``^^aa^Y`]Z]^\^^^`_	chr10.fa		4854438	R	36	119					
+HWUSI-EAS610	1	4	24	412	621	0	1	TAGCCCACATAATTGCAGTTTAGCACCGTATGGCCC	abbbabbbbbbabbbbba_baaaabaaa__`aaaaa	chr10.fa		4854458	R	36	119					
+HWUSI-EAS610	1	4	55	511	1707	0	1	GTTATTTGCAATTGTCAACAAACTGGACCTTCTCTT	aR\_a``\aa_`VZQ[_a_[Q_[]aaa\[`\O__Y_	chr10.fa		4854514	R	36	118					
+HWUSI-EAS610	1	4	49	342	519	0	1	TCCCCTTGTACCTCCTTCCAGTCCTGCCCACCCGCT	`aaaaaZ__a_```aa_`a``R`_`_a`a_``\aa[	chr10.fa		4855309	F	36	119					
+HWUSI-EAS610	1	4	27	759	127	0	1	ATTATTTTCGGTTTGCTGGGCTTCAAGGGCGGTGTT	abaabbaaaa__aaa`abab_`a``aa`_S]_V_Za	chr10.fa		4855402	R	36	119					
+HWUSI-EAS610	1	4	55	953	1346	0	1	AGTTTGGAAAGGCACAGTGTTGGAGGAGGCTGCTGG	ab`ba]baa`ba`a_^b\b`a`a\ab^a`_^`Z\^a	chr10.fa		4855501	R	36	119					
+HWUSI-EAS610	1	4	94	1676	974	0	1	AGCAGCCTCCTCCAACACTGTGCCTTTTCAAACTCA	``aa_V``_a`\aaa]aZYa\____\`H^W^WWaa\	chr10.fa		4855503	F	27C8	106					
+HWUSI-EAS610	1	4	27	1076	1866	0	1	ACTGAATACAGACTCTGAATCATCCTTTTTCTCCTT	````[`_]]_^Z[_Xa^W\_Z_`YX]X\^[S[YY]^	chr10.fa		4855789	F	36	119					
+HWUSI-EAS610	1	4	53	746	597	0	1	CAGGCTCATCCTTACTGGGGCAACGGTGTGAGCATA	a`a`aa`bba]bbaaaa__`aaaaba`b^baa^aaa	chr10.fa		4856004	F	36	119					
+HWUSI-EAS610	1	4	42	1401	1226	0	1	AGTCTTTCAGGGATGAGGCAGGTCTTGGCTGTACAA	]aabaa_R\\b[ba]bb``a_ZT_`bKbbaaSIU]V	chr10.fa		4856077	F	36	118					
+HWUSI-EAS610	1	4	82	465	1865	0	1	TACATCTCAGTCTCACTTGTACAGCCAAGACCTGCC	aaaS`^ZaaXVUXa`][\`Z``_`__`_]___]\\Z	chr10.fa		4856093	R	36	119					
+HWUSI-EAS610	1	4	55	802	1463	0	1	GGCAGGGAGACTCATAGTAGCTAGAAAGGATGAACT	`_WTZ___`aRaaab`ZZ]]]`__Z[]^Z^a`[`[b	chr10.fa		4856166	F	36	119					
+HWUSI-EAS610	1	4	57	1262	1497	0	1	GGAGGTTTAGACATTTGAGCATATATTTTCCGAGCA	\`aa`Xa`__TVT]bbb`_`]_U_[`abbaXZV][`	chr10.fa		4856393	R	36	119					
+HWUSI-EAS610	1	4	85	947	1972	0	1	GACTGGCAACTATTGGCATTCCAGTTGTAAAGGCAT	a_aaa`aab^aaaa`aaaaaa_a^Z_aWa__`_^``	chr10.fa		4856791	F	36	119					
+HWUSI-EAS610	1	4	7	1666	676	0	1	CTTCAGGAAGGCAGATGGTACCGCTCATTTTCTCAC	]\VbbV_UUOUOV\\IO[^U_T^_OLGV^_ZZGZP]	chr10.fa		4857080	R	36	115					
+HWUSI-EAS610	1	4	31	34	1007	0	1	GTGAACATTTCTTGTTTGGTGACCTGAACTTGAACT	a_`Z^aS^abba_a_`_aa]a_aa]`Qa```\\a`_	chr10.fa		4857371	F	36	119					
+HWUSI-EAS610	1	4	11	566	666	0	1	AACTCAGGAAGCTGACTTAACAAATTAAACATAAAC	aa`_ba_PO`X[_`_a_`S``aba`a_`a^a_a___	chr10.fa		4857641	F	36	119					
+HWUSI-EAS610	1	4	39	1279	1869	0	1	CACAGACGTGTTGCTATAGTGACCCTTGAAGGAGGA	abbab\abab`abaaaa^aaa__a`a_\XZ^^^`U[	chr10.fa		4858250	F	36	119					
+HWUSI-EAS610	1	4	12	1231	243	0	1	CCCTTGAAGGAGGAGCTGCAAAGAGAACTGACGTTC	aaabb`Z`a`^_[``_\a_^`a`__\_W^^_\^V__	chr10.fa		4858272	F	36	119					
+HWUSI-EAS610	1	4	49	204	1743	0	1	ATTCACAAAGGAGCAGAGAGATGACTACAGGTTGTC	]aababab_``[aba_N_`aa^aaaaaaaaa\`aVZ	chr10.fa		4859235	R	36	119					
+HWUSI-EAS610	1	4	97	752	343	0	1	ACAAAGTTCCAAAATGTGTGTTTGGCAAAGTGAACA	a`a_TY]\LT]\^RWXN_S_T[[PXWXR[]H^`[]a	chr10.fa		4860066	R	36	117					
+HWUSI-EAS610	1	4	94	1637	442	0	1	AAAACCGACATGCAGAACACAGGGAGTTAATCGTTT	aabaW^RESXTKKW`_]ZYP\RRR]UG^_ZPRDVP_	chr10.fa		4860592	R	7T24C3	98					
+HWUSI-EAS610	1	4	80	1431	658	0	1	CAAATGACACCATCAAAAAAGCAAAATAAAGCACTA	abbabYbaaaabbabbaba^]^baaababa[aa`ab	chr10.fa		4861819	R	36	119					
+HWUSI-EAS610	1	4	70	1456	996	0	1	GGGTCTTGGGAGGCAGGAGTTTGTAAGGATGGGACT	a`_`^ba`Ta^aaaa[\TZ`aa^]aa^`Y``^\\M]	chr10.fa		4862082	R	36	119					
+HWUSI-EAS610	1	4	24	452	1164	0	1	TGTCCCAGGGCAGTTGCCCTTCCCTGAGGAGAAGGA	[``_aaaa``^X\__``Y\P_\a`[VD[[DY\VZ\S	chr10.fa		4862122	R	36	114					
+HWUSI-EAS610	1	4	99	1130	1315	0	1	AAGGGCAACTGCCCTGGGACATCACGTCATAGCAAC	abbaa`aa`aa`^\aaaaa`ba_aba\\``__^`_\	chr10.fa		4862137	F	36	119					
+HWUSI-EAS610	1	4	100	795	1176	0	1	CTGAAGCCTGAATTTGTAGCATCACAAGAAACTGTT	aab^]_``baaabaaa`aa_aaaaaaaaaaa]aa`a	chr10.fa		4862449	F	36	119					
+HWUSI-EAS610	1	4	85	579	1850	0	1	CTGTATTGGAGCAGCAGAGAACTAGCCTGTCTGAAC	aU__IVZ[aPT_Z]aa__SIX^[Y\_Za_H\a]RS[	chr10.fa		4862545	R	36	117					
+HWUSI-EAS610	1	4	32	17	727	0	1	GTACATGGAGTATTTTATTTAAAAAAATTTAAAACC	aS^]NWa`_aZ]YZ_[Z`_``]`[`^`___^\VS_[	chr10.fa		4862610	R	36	119					
+HWUSI-EAS610	1	4	72	1193	958	0	1	TTCCAGCTCAAGGGAATCCAATATCTCTGACCTCAG	aa^`[`_a___a`\Taa`X`a`_a\a_aW_]]____	chr10.fa		4864111	F	36	119					
+HWUSI-EAS610	1	4	80	733	1108	0	1	TGACGCCAGAGCCAAGCCTTTATCATGTGGGGGTGC	_b`]a__Zb]W^`^aX_`_a_H_SUaa^W\NZaS`_	chr10.fa		4864688	R	30A5	99					
+HWUSI-EAS610	1	4	95	1478	1243	0	1	TAAAGGCTTGGCTCTGGCGTCAAGGATACCTGGGGC	a``]^`Y`ZPGYa]`VX^[Y[YSUYT`VPPTEQUYV	chr10.fa		4864702	F	36	115					
+HWUSI-EAS610	1	4	89	548	368	0	1	CACAGCATCGCCCCAGGTATCCTTGACGCCAGAGCC	a[_aaXa_aa``aaaa[`_`_aa__`^\aZ`_Z_Xa	chr10.fa		4864711	R	36	119					
+HWUSI-EAS610	1	4	34	514	1759	0	1	TGTATGACAGAGCACTAGCTTGTTAGTCCCAGTGTG	```bbbabbbaabaaaaaaaabaa^a_aabaa_a`a	chr10.fa		4864775	R	36	119					
+HWUSI-EAS610	1	4	41	45	1164	0	1	CAAGCTAGTGCTCTGTCATACAGACTGGGTGATTCC	`[_aa\[`Zab_b``_ba`^aaa`aaaaaT`[__a`	chr10.fa		4864789	F	36	119					
+HWUSI-EAS610	1	4	97	1073	347	0	1	GGTAGTCTAGAGTGACTTTCTCAACAGAAGCAAGAA	[\^``Q_^S_UZQV_`bb^``bb_Z\_][_YX_aba	chr10.fa		4864970	R	36	119					
+HWUSI-EAS610	1	4	20	1151	1192	0	1	GCTGGGGTAGTCTAGAGTGACTTTCTCAACAGAAGC	_`]aba_X]a]a^[[[\P\`Xaaa_a^[_\YWZ_\B	chr10.fa		4864975	R	36	114					
+HWUSI-EAS610	1	4	66	505	378	0	1	GTTTCTGGAATGTGCTCTCAGTAACTACAATTTCAG	a]aa_aaa`_]_^`_^_a```Z^`^]`^^^_`^`V^	chr10.fa		4865075	R	36	119					
+HWUSI-EAS610	1	4	80	504	668	0	1	TTCCCACGCTAGCAATGATTTGGCTAGAAACCAGCT	aabbaaaba_a_a_]aa``]`a`]_a__``ZZYP[X	chr10.fa		4865411	R	36	119					
+HWUSI-EAS610	1	4	47	1121	1129	0	1	TGTGCATGAGAATGGAATGAAGTGATTGGAGACCCA	ababaaba_a`_a`bZ^bb``b\a]a_aa_a___\_	chr10.fa		4865594	F	36	119					
+HWUSI-EAS610	1	4	98	414	31	0	1	ACCTGGGTCTCCAATCACTTCATTCCATTCTCATGC	a`aaaaa_aa_`aaa_`_a``a``_^_a`^____`_	chr10.fa		4865597	R	36	119					
+HWUSI-EAS610	1	4	62	424	35	0	1	GGTGGTAGACAAATGTGTATGGCTTGTCATATGCGA	aa_aa]aa``_`[`aVa]___a^___]_^]]__Y^[	chr10.fa		4865636	F	36	119					
+HWUSI-EAS610	1	4	25	995	1316	0	1	TAGGGTTCTGGGAATCTGTGGATCTTCCTTATCGAC	`bYabZX]aUL`Va]]]a\^V`RXW]Q]aa_IPZ`X	chr10.fa		4865684	F	36	118					
+HWUSI-EAS610	1	4	86	29	1712	0	1	GTGGGTGATAGATTGGGAGAGCCTGCTATGGAGTTG	a[ZPPUa``ZGP__aa]^`WP_U[]PZNST[SRGU_	chr10.fa		4865965	F	25A10	95					
+HWUSI-EAS610	1	4	45	710	1733	0	1	TATCCAATTTAAACATTGTAACAACTCCATATCAGG	abaa`aaaaaa]```aaa]aa``a`a__`_`_^`__	chr10.fa		4865986	R	36	119					
+HWUSI-EAS610	1	4	37	1096	631	0	1	CGTAACATTGCAGATATTCATCACTTTCGTTATCCA	a_b_baa`a[\abababbaba``X_ab_a`a[aW`a	chr10.fa		4866016	R	36	119					
+HWUSI-EAS610	1	4	68	81	322	0	1	GAGAGAGAGAGATTGGAAATTTCAGTAACAATTCCA	a^aTb^`P__b]^_a_]ZS_``aaa\^_`a]X[``S	chr10.fa		4866322	R	36	119					
+HWUSI-EAS610	1	4	83	1230	238	0	1	TGCTTTGGCAGGCGCTCTCAGGAGACAGCTATATCA	`a`aa^_ZZa[WDTUa_`a]\_XLWNWUXZ^^Z]Y_	chr10.fa		4866692	R	12G23	109					
+HWUSI-EAS610	1	4	72	631	1009	0	1	ACCAACTGGGGATGAGGTAAGGTGAAAAAGTTAAGA	aaa]^`aaaa_[`b^aa]__aa[a]Q^__a]`_]`Z	chr10.fa		4866978	R	36	119					
+HWUSI-EAS610	1	4	27	1692	928	0	1	GTGACAGCTATACCAAGGTCCCCTCAGCAAAATCTT	a`[a_`S^`a`__a_`_`^``^[]__\]__]^\^]^	chr10.fa		4867470	F	36	31					
+HWUSI-EAS610	1	4	90	1031	275	0	1	GTGGGGTGGAATCTCTAGGTTGTTTTGATTTGCATT	a^aaa_]a_^_`__^`]a`Xaa]a```]__a_Y^_a	chr10.fa		4868225	F	36	29					
+HWUSI-EAS610	1	4	38	552	451	0	1	TAATTCGTTGAAAGGACTGAGTTGGAATTTTGATGG	aa_aa_a_aa_`^aa__`a_a^aaa^`aa`^_``a`	chr10.fa		4869043	F	36	119					
+HWUSI-EAS610	1	4	36	1620	1167	0	1	CGTGTATTAAACCATCCCTGTATCGGTGGGATGAAG	aaababbbbbbaa_aa`abZaa`a[TPW\aaZ\_`]	chr10.fa		4869831	F	36	42					
+HWUSI-EAS610	1	4	35	919	792	0	1	TGCTAGTGTATGCTCTCTCTAGTATATTTTTTGGGG	aba`[`YU```\^a_`aa`^`a]```aaaaa_aa`a	chr10.fa		4870614	F	36	37					
+HWUSI-EAS610	1	4	20	770	317	0	1	AGACACTATCTCAGAGTGAAAGGCTCAGAGTGAAAC	aabTY]\KPSWOOT[aRY\Qa[a_^^\`YSL[XBBB	chr10.fa		4871382	R	29C6	81					
+HWUSI-EAS610	1	4	67	495	1116	0	1	GGCTACTTTACCTAGCAAAACTCTCAATTCCAGTAG	R`b_Z`^b`^[Z_^_a^_]_\\__X_b```_a`Zbb	chr10.fa		4871749	R	36	48					
+HWUSI-EAS610	1	4	27	975	1305	0	1	ACAACAATACAAACTAACCAGTATCCCCGGAGCTCG	aWa`XXaaZVa`[^a`a___a_]V[]]___MXT_U^	chr10.fa		4872564	R	36	21					
+HWUSI-EAS610	1	4	32	827	258	0	1	TCCGGGGATACTGGTTAGTTTGTATTGTTGTTCCAC	aa`baaa`aa_aaa[a^a_abb^__`\``_`^]___	chr10.fa		4872569	F	36	37					
+HWUSI-EAS610	1	4	59	1687	420	0	1	TCTCCTCTTGCTTAGCAGGTGCACAGATATCTGCCA	aa^baU]_aS`^^`N__W_W`___`[__U\\YW\`_	chr10.fa		4873175	F	36	35					
+HWUSI-EAS610	1	4	45	297	1503	0	1	ATCTTATGGCCCGCATCCCTCGAGGACCAGTCTGTG	`\WWV^^Z`_`\[_]_^_a\a_OXYM_\P_a_a^O[	chr10.fa		4873300	R	36	118					
+HWUSI-EAS610	1	4	15	763	1997	0	1	AAAAGCAACACAGCTACTGGGACAGATCCCATTTCA	`a`baaaa__a_]]ab`^`]_a`aa^a`a```[a_a	chr10.fa		4873421	R	36	59					
+HWUSI-EAS610	1	4	29	590	1273	0	1	TGTTCCCCAAGGAGGGCTTTTTCAGAGCAGGTGAGG	abababaaaabbaaba`aaaaaaaaaa_aaaWaaa_	chr10.fa		4873743	R	36	119					
+HWUSI-EAS610	1	4	59	812	1164	0	1	GGGCACTTTCCCTACCAGAAGGGAGGTGTTCCCCAA	_J^\`J^aWPYZaUaX]Y]a]]X^a^UQQUVMGS]]	chr10.fa		4873769	R	36	116					
+HWUSI-EAS610	1	4	53	1712	1840	0	1	GGCAAGACAGGGAAATTAGTGGATTGCACTGTCAAG	ab_aaa[F]```RU`aa`a\`^Z_^]VY^]^^[[QW	chr10.fa		4874198	R	36	117					
+HWUSI-EAS610	1	4	71	139	788	0	1	ATACACTTGCATGCTACAATTCGGGCTAGTGGCTCA	VXW[Taaa_^LS[a[WWa_NV``^X]QHZ[R_[^]B	chr10.fa		4874387	R	36	113					
+HWUSI-EAS610	1	4	97	910	598	0	1	AATACACTTGCATGCTACAATTCGGGCTAGTGGCTC	aaaaa[X_aY__^a_`a_`aa`_`ZWY__`X_^_]]	chr10.fa		4874388	R	36	119					
+HWUSI-EAS610	1	4	26	495	1998	0	1	CAAATGAGGCATTGTTCCTCTGCTTGCAAAGACTTG	abbbb_bb`bbabbaabaa_a`bbab``baaaaa`b	chr10.fa		4874552	F	36	119					
+HWUSI-EAS610	1	4	21	602	1965	0	1	GTGAACTCATCAAGACTGCCATGTAGACATCCATCT	`\_abaaaaaaaa`]aa[`aa`]X_```a\a_a_`^	chr10.fa		4874697	R	36	119					
+HWUSI-EAS610	1	4	86	790	1338	0	1	GCTATCCTACAGCTGAGGCTTTTCCTGGTGAACTCA	a]_a_`aaa_[V^a`_[YXV___\`__aW`N[TX`\	chr10.fa		4874724	R	36	119					
+HWUSI-EAS610	1	4	2	1049	864	0	1	ACAGTTTACATATGAACTTGTTGTGGAGCTGGCTGG	\JYbZTXGH_^PMUQWMaZWOJ[XZVHZSWQXKJ[a	chr10.fa		4874767	F	7C28	103					
+HWUSI-EAS610	1	4	44	748	610	0	1	GGCTGGGGAGTTTGCTGAACACATTCCAGGAACAAT	__]]_b^TW][a`X\[]]ZW_XVY``T`aW[`_\^`	chr10.fa		4874797	F	36	119					
+HWUSI-EAS610	1	4	45	13	1952	0	1	ACACATTCCAGGAACAATCAAATGCATTCTGGGCTG	_a]`YaYab]`_]_ZVZ_[H^[X``WY_`Z\\X\U]	chr10.fa		4874815	F	36	118					
+HWUSI-EAS610	1	4	71	1620	888	0	1	AAACTGATCCTTTGGTTTTCTTAACGGCCACATAGA	a_\`b`ab`ababZVaab_^`b`\UaX```_\XXYX	chr10.fa		4874966	R	33TTT	31					
+HWUSI-EAS610	1	4	39	713	1462	0	1	CAACTTCAATTTATTACTATTATCATGCCTAAAGGG	a][Wba^ZX[Y][[^S[]Y_`]]`]\a``[ZNZa[^	chr10.fa		4875826	F	36	119					
+HWUSI-EAS610	1	4	45	1782	1809	0	1	TACCAGCAGGGACTACCACAGAAGAGATGGTGCTGT	abYX_aaa``^]_aa_`aZ]^\^^TZZ[XPFJZSY^	chr10.fa		4875874	F	36	117					
+HWUSI-EAS610	1	4	66	586	919	0	1	GCATTGAAAAACAGGGCTGCTTGCTTAGATATCTTC	a`aaaaa`aa`_]_``__`_`_^_a^_``__^``^_	chr10.fa		4876004	R	36	119					
+HWUSI-EAS610	1	4	43	482	1740	0	1	AGCCCTGTTTTTCAATGCCAGAATCATTAGGATTTT	aabaa\a_a\abbbaab```a_abaaaba_aYYb``	chr10.fa		4876022	F	36	119					
+HWUSI-EAS610	1	4	78	1259	305	0	1	ACTTGAGGAAGCACAATAACTAGAACCTGAATCAAA	^`^ab__T`VY^YY^aaa\\`a\P]UZ[H[^_WYZ\	chr10.fa		4876195	R	36	118					
+HWUSI-EAS610	1	4	17	525	1192	0	1	AGTCAGGTTTGATGCTNGTCCATGCCCACGTAGATG	a`Yaaba`b`aaaa`[D^`baaaaaaa_`a^aa_aa	chr10.fa		4876480	F	16G19	110					
+HWUSI-EAS610	1	4	70	424	2036	0	1	GAGATGTCTACAAGTACTAACAGTGTCTACTGGATG	abb`aa_bb[`baa_aa`a\_ba^a^aa_aZ\__``	chr10.fa		4876562	R	36	119					
+HWUSI-EAS610	1	4	59	851	1203	0	1	GTGTTGTTGGCATCTAAAGGGCAGAGAGCAGGAATG	aab`aa_a`a``a`a``aa`^_ba``_``_`_^a^]	chr10.fa		4876621	F	36	119					
+HWUSI-EAS610	1	4	31	793	1113	0	1	GAAGATGCAGTCATCTGAGTCTCTAAGATAAGGCTT	a_[^`a`X\`\^_aX``]aZ`a__TY_`_`_`a^[`	chr10.fa		4876737	R	36	119					
+HWUSI-EAS610	1	4	70	642	54	0	1	ATAGTGGTACCCATCACTTTAAATGCAATGTTCAAA	[abb`\\`bababbbaabbb^babbaababaaaa`a	chr10.fa		4876780	R	36	119					
+HWUSI-EAS610	1	4	85	787	1389	0	1	TCTGGTTACTGCTGCTATTCCTTTTCAAGTAAATGT	aabba[a`aaa`aaa_]aa``aaaaa_`a__``aa_	chr10.fa		4876929	R	36	119					
+HWUSI-EAS610	1	4	87	449	1317	0	1	TAATAATGAAGGAACATATGCCAAGGAACAGGACAT	aa[a^abbb``[^`\`aaZX``a`aa_b\\a]HW]Z	chr10.fa		4877097	R	36	118					
+HWUSI-EAS610	1	4	99	154	1047	0	1	ACACAACCACGACTAACTGAAATATTTTACTTATGT	a]S`ab_a[F]`a`T`baa`a^aabb_aa`aaabb[	chr10.fa		4877251	R	9A26	108					
+HWUSI-EAS610	1	4	38	1059	1175	0	1	TGCTGCAGGTGAATTTAGCCTCATGGGAACCCAGCG	___`baa___\[V^__R_abTa]J\Xa]`P^NTOG_	chr10.fa		4877686	R	34G1	106					
+HWUSI-EAS610	1	4	38	282	355	0	1	AGTCATCTTGGATGCTAGAGTTCAGCAAATGCTGCA	``V]baaaabbaaaa_^b]a__baa^[_aaa^^a_`	chr10.fa		4877715	R	36	119					
+HWUSI-EAS610	1	4	9	396	1994	0	1	GGCTGATCTCTTAAAGCCCGGAGGAGTCAGGACATA	`]][^ZIZZW]R`a\V\P^\`]WX_[U]S_VXFUYT	chr10.fa		4877872	F	36	117					
+HWUSI-EAS610	1	4	86	1690	1814	0	1	TTTCAAGATGCTAAAAGTCTCATCCATCACTGGTCT	a`\\_U_^```Q`\PFXTXVOW_P^_W]]\^^PUWY	chr10.fa		4878124	F	36	117					
+HWUSI-EAS610	1	4	59	57	1197	0	1	TTCAGGTTCAGACAAGACTGACAATTCCTTCTCTTC	`aaaab]baZab```aab\`_aa```a```baa`^a	chr10.fa		4878203	F	36	119					
+HWUSI-EAS610	1	4	3	1334	1629	0	1	GGTATCTACCTCCTCTTCACTCTGTCCAATCTAGAA	ab]aba`a^_]a`b_`__]``_^^XS\_`__^aaZZ	chr10.fa		4878326	R	36	119					
+HWUSI-EAS610	1	4	27	104	1007	0	1	GATGAAGGCTAAGAAGATGTAAGGTACAGCCAAGAG	a_```\\abY^`aX]baVUBBBBBBBBBBBBBBBBB	chr10.fa		4878453	R	23T12	43					
+HWUSI-EAS610	1	4	51	1139	804	0	1	GACTTTGTGCTAGGATGAAGGCTAAGAAGATGTAAG	aaS]aaa_[R_`[^X[`^X[__[^^_OR[U[_YS]a	chr10.fa		4878466	R	36	118					
+HWUSI-EAS610	1	4	77	971	812	0	1	CAATGAATTGCATATATATTTTTAGTACACCAACTT	ababbaabbaaabbbbbabbbbbaa`aaaa_aa_ba	chr10.fa		4878551	R	36	119					
+HWUSI-EAS610	1	4	4	1157	1993	0	1	GGCTATTTCTGAGCTGGTGGTCCTAGATTGTATAAG	aa_a^ba`^`a_a_]_aX``G^^]T`W]^`U]]PV^	chr10.fa		4878993	F	36	118					
+HWUSI-EAS610	1	4	97	566	1716	0	1	CGTAGCCATGAGACCTAGAGACACGTCCTTGCTTTG	Z\W___aa`bb]_a\X][a_aZ]_ZF[aa`_]`^_]	chr10.fa		4879409	F	36	118					
+HWUSI-EAS610	1	4	44	188	966	0	1	TTCACAGCAGTTTCCACTTCAGTTAGTGCCATCACC	aaabb`ab]a_`^aa_aa^aZ_`a``]_`a__a`aa	chr10.fa		4879828	F	36	119					
+HWUSI-EAS610	1	4	52	955	623	0	1	CAGGCCCCCAGGCTTGGTATCATGGGCCTTCCCCTG	IZYQ^``OX]``T[_TNU```_R]`]W\`aa`VH][	chr10.fa		4880395	F	36	117					
+HWUSI-EAS610	1	4	75	1398	1305	0	1	TCAGATGTTGTCCATGATCAATGTGGAGCATGGCAG	`WXUVaa`aa\a^a``\TVQU^\^`Q\[]\^`Y[\]	chr10.fa		4880900	F	36	118					
+HWUSI-EAS610	1	4	30	1298	1875	0	1	CGCCAATCCCTGTCTCACACACCCTCTGCTTCCTGC	PZ_[aaaaaaaaaaaaaaaaa_aaaXaaaaaaaaaa	chr10.fa		4880997	R	T35	98					
+HWUSI-EAS610	1	4	82	1537	1479	0	1	CTGTGGTGACACTAAGCATAAAACTATTTTGTTGCT	aab`b_`^bab`bb^aa`baabaaaZaabab`aa_a	chr10.fa		4881213	R	36	119					
+HWUSI-EAS610	1	4	10	667	2002	0	1	AAGACAGCGGTTCTCAACCTTCCTAAGTTGTGACCC	`S\[`aaZVW]LS]YU^^aPLZ\HKKXTXZW[WXZB	chr10.fa		4881268	R	36	112					
+HWUSI-EAS610	1	4	48	1082	1102	0	1	ACATATGAATGNATGAGCATGCATGGGGTAGGGTGT	aa[bab^`\aZDPaa^`]`ba__aa`_\RZaa`U][	chr10.fa		4881861	F	11T24	110					
+HWUSI-EAS610	1	4	53	1580	1659	0	1	GTAGGGTGTATACTGTTTGTACATAGTGGCAGAATG	^O_a`]G]O][aZ``\_a`OR[]_ZOFNT^RSWTWZ	chr10.fa		4881888	F	26G9	106					
+HWUSI-EAS610	1	4	36	280	1454	0	1	AAAGTGTGGACGCTTTGCCTCTTCTTAGAATTGGGA	_ZZ`]baa^aaaa``Z`a]`aa`ab]ZWV[a_Z_a_	chr10.fa		4882563	R	36	4					
+HWUSI-EAS610	1	4	66	530	979	0	1	CCACCCTTCACCCAACCAGACCTCTAAACTCCCTGG	V^_ba]b`_ZZ]]_^aaR^RbZa]^Z_\UW_]WYL]	chr10.fa		4882936	F	36	30					
+HWUSI-EAS610	1	4	82	889	1130	0	1	TCTTCAATGTTCCTAGGTAACTGGGGAGGAGTTTAG	a_aa````_^__U_^a_Z`^Z`a__`X_Y\_Z^_W]	chr10.fa		4884872	R	36	27					
+HWUSI-EAS610	1	4	44	1199	1322	0	1	TGCCTCTGTCCTACAACCCTGGGGCTTTAGCAAGGT	`b\baaabaa`bbabb`WabbbbaZaaaaT`_babX	chr10.fa		4885257	F	36	38					
+HWUSI-EAS610	1	4	92	531	446	0	1	GTAAGTGAAAACAGAAATTGTTTACAGAGTGTAGAG	aaa`a`a_``]`]a`_]`a_^`_a```]aY_Y_`_`	chr10.fa		4885822	F	36	119					
+HWUSI-EAS610	1	4	15	939	1119	0	1	TAAGTGAAAACAGAAATTGTTTACAGAGTGTAGAGG	aaabU]XPZ_`ab^_^a^`Z``a^Xa^a[_[a`_]`	chr10.fa		4885823	F	36	119					
+HWUSI-EAS610	1	4	40	1420	1978	0	1	TAGAGGATCAAAGAACCAAGGATGTCCTCCTCTGAG	a__`_bXYPX`XSY`Xaa[]`[\\^ZNXVN`RZYVQ	chr10.fa		4885853	F	36	118					
+HWUSI-EAS610	1	4	27	1124	817	0	1	TTTGTCAAGAGCAACATAGAAATATCCTATAATCAT	aaaa```aa]a__a`aaaa`a_a\`^^_^`]]___`	chr10.fa		4886385	F	36	119					
+HWUSI-EAS610	1	4	66	1709	1023	0	1	TGTGTGATGCACACATAAATGTGGACTTAGGGACTC	aa_a^[_^`_a_`^_`````_VZ^]^_^\Z\Z]]]_	chr10.fa		4886633	F	36	119					
+HWUSI-EAS610	1	4	71	656	1115	0	1	TGAGATTGATACAACCCAGGAGTGCAGCTCTCATGG	Za`aW[Z[_]a^bb_a]``bb_Q__]b]aaa]J`_`	chr10.fa		4886810	F	36	118					
+HWUSI-EAS610	1	4	88	704	230	0	1	ACAACCCAGGAGTGCAGCTCTCATGGTTACATGTTG	a`aaUaa`aa`_[a_Z_^aa_Q\]aaW^Y\ZWYZ`]	chr10.fa		4886820	F	36	119					
+HWUSI-EAS610	1	4	96	1049	439	0	1	CAACCCAGGAGTGCAGCTCTCATGGTTACATGTTGG	__^_R_UY_^`Z\WYX\b`b__\ZW]^a\a__Z[`_	chr10.fa		4886821	F	36	119					
+HWUSI-EAS610	1	4	58	1650	75	0	1	ACAGTTTTCATTTAGCTGAGGATGTGTAGCATTTCA	a^[_]^``_``_`a\_a_^_^^__[_[a^_^Z^^[`	chr10.fa		4886939	R	36	119					
+HWUSI-EAS610	1	4	42	433	1077	0	1	GGCGACTTTGCTGCAACCTATATTTGTTTGTAGAGT	a`JY_YVaZQVV^R^]ZbSN[\JY_VYba_FTWNX`	chr10.fa		4887064	F	2T33	102					
+HWUSI-EAS610	1	4	55	891	920	0	1	ATTCCCAATACTGGTTACAGGGGCACCAGGCCATGC	Ubbaaaa`aaYbaX]``a`aaa`aZa]``^`\__`^	chr10.fa		4887530	R	36	119					
+HWUSI-EAS610	1	4	50	831	79	0	1	TGTGGTTTATGCACGTGTGGATGATAAATATCCATG	ab`ba`baaaa__Y^X`^aa\aa_```_``_^^^]\	chr10.fa		4887731	R	36	119					
+HWUSI-EAS610	1	4	32	525	246	0	1	GTATAGTGGCATTCTGTAAACATTACAGATACATCC	^Y_a`a_a_[_aa``a`a_a^``_`]]^[``]__[Y	chr10.fa		4887957	F	36	119					
+HWUSI-EAS610	1	4	90	126	1942	0	1	TGTGCCCTAGAACCTAAACATTATCAAATGTTGGAA	Y`aX_I]``^Uaba`U`^`Z^a_S]`a^a_F_`^a]	chr10.fa		4888051	R	5A30	104					
+HWUSI-EAS610	1	4	38	1701	1287	0	1	CACCATTCTGAGGAGATGAAGCCAAGGATGGTCAGA	Q_[YUU_Z_bbbYN_[]Va_W_^\^X]U_^S]W`_Z	chr10.fa		4888092	F	36	118					
+HWUSI-EAS610	1	4	57	545	1574	0	1	GGGGAGGCAGTGGTGGGGGCAAGATTGTGTCTGCCC	aaaa\`^^`_V_aR^]][\\^Z`]YY\X^ZXZ`S\^	chr10.fa		4888165	F	36	119					
+HWUSI-EAS610	1	4	37	308	487	0	1	ACAATGCCTAGCATAGTGGTCTACAAAGCTGGTATC	abbbbbba`__b]_abV_a___]a[a^aa^a`^`__	chr10.fa		4888217	F	36	119					
+HWUSI-EAS610	1	4	30	237	407	0	1	AAAGTAGCTCAGCTAACTGGCTAATCCCCGGATACC	`ZF[W`aaV\Z][Z__TQT^]QX^JYaZ`\TSKT_\	chr10.fa		4888247	R	36	116					
+HWUSI-EAS610	1	4	27	846	816	0	1	GGATTAGCCAGTTAGCTGAGCTACTTTTTCTTTCTA	`PVaSLV[Y^a]]_`[`a`aa]]T]aaZUQYTOUW[	chr10.fa		4888256	F	36	118					
+HWUSI-EAS610	1	4	66	1776	1523	0	1	GAGGAAAAGACCAGTGTCGAGGAAGGCACTGAAGGT	abba_`Xa``__`_K\^aa_a_\ST]SW_^V[Z^BB	chr10.fa		4888335	R	36	110					
+HWUSI-EAS610	1	4	73	147	1499	0	1	TGATCCCCAGCAGACATCCTGTAGCCTGGGTGACCT	aJ`abbba\bbb_]b^K`bbb\]`b`b]b``_K]`Z	chr10.fa		4888494	R	36	118					
+HWUSI-EAS610	1	4	35	331	250	0	1	GCCAGCAATTTAAAGTGGCATCATAAGGTTTGCATG	ab`Y`]b[_bbZ]bbROSa[U^_]a]__I]G^BBBB	chr10.fa		4888753	F	30G1T3	86					
+HWUSI-EAS610	1	4	84	1059	113	0	1	GGAGTGTGAGCAGAGCCTGTGACTTGTATCTAGCTC	aa\a\U\`Y\\\`W]__[^VZS\S__SU^\_V]W\V	chr10.fa		4888811	R	36	118					
+HWUSI-EAS610	1	4	12	1181	1615	0	1	TATGTTCCACCAGACACTTCATTCGTTCATGCCTTT	abbb`a_aa`\]a^]_^```_aa]_]_]\_UYX]__	chr10.fa		4888959	F	36	119					
+HWUSI-EAS610	1	4	25	158	806	0	1	GCAGGGCAAGTGTCTGCTTCCCATAAGGGCAAATTC	_aTXX][_b]L_P`\YDWW_a`]]`X[]YG\Z]`ZY	chr10.fa		4889342	R	16T12T6	98					
+HWUSI-EAS610	1	4	19	1288	399	0	1	TTCTAACTCAACTTAAATTGAGTTGTCTTGAAGGTT	aabaaa^^^`a`baaa`]_baa`aa__a_Z]_^a]a	chr10.fa		4889523	R	36	119					
+HWUSI-EAS610	1	4	80	321	1773	0	1	ACCCTTTGCCAGTGAGAAAATTCAAAGGAGATAAAC	abab__a`a`_aW```aaZQ^```Y\\[`a[`_^_a	chr10.fa		4890033	F	36	49					
+HWUSI-EAS610	1	4	53	1773	242	0	1	GAGCACTAACATCTCACCACTGCATTTTTACATACC	_a``abbaaaaaababaabba\\aaaa``_X_aaa`	chr10.fa		4890190	F	36	61					
+HWUSI-EAS610	1	4	73	1636	1232	0	1	TCACCACTGCATTTTTACATACCATTTTATGGAACT	a_____\`_V_a`^`a`aa_aa___a^Y_^^V]__a	chr10.fa		4890203	F	36	119					
+HWUSI-EAS610	1	4	56	1494	344	0	1	TTATAATGACGTCTTTGGGAGCCTCATTAAGACAGA	``_`_\_^`]]X]]^`P[XTQV^^ZZ][XXXUXU\Y	chr10.fa		4890238	R	36	118					
+HWUSI-EAS610	1	4	72	711	977	0	1	GCCAACCCATAATCCCACCAATACCACTGATTGGTA	aaabaaa`ababaaaaaa`_aaaaaa`aa`abaaYU	chr10.fa		4890294	R	36	119					
+HWUSI-EAS610	1	4	75	1440	37	0	1	AATTAGGGAGCATCTAGCCAACCCATAATCCCACCA	_bbbb``[_S]baa`a`_aba]]aa]aa_TKR[[Q_	chr10.fa		4890310	R	36	118					
+HWUSI-EAS610	1	4	36	1543	1717	0	1	GGGAAGATTCCTGTGCATTTTCGTTTGATTGTATCC	_a[Ya_b^RPX`aN`]`aT]^_L`Y]Q]aa[_SXU_	chr10.fa		4890481	F	36	118					
+HWUSI-EAS610	1	4	36	349	1118	0	1	TTTTAACTGAATGGATACAATCAAACGAAAATGCAC	_VUSTZ`YaXV_W`TY[ZHR\`aaa]_RXYSIKX[]	chr10.fa		4890493	R	36	117					
+HWUSI-EAS610	1	4	31	207	235	0	1	CACACATATATATCAAATGTCTCAAGGTTGTTTTAT	a`\`^a_U^a]aaaaa`ba_a_a____[`aY^`a^_	chr10.fa		4890815	R	36	119					
+HWUSI-EAS610	1	4	94	719	1561	0	1	GGTGTCCGCAGTACATAAGGTAATTCTCCCTGGCAG	ab`b_abbabb_a``a^aba^aaaa_```_aa]^`a	chr10.fa		4890908	F	36	119					
+HWUSI-EAS610	1	4	70	1747	1354	0	1	GCACACACACACCACATACCATAAACACACACACAC	`HWZ]X`a^SZ^Z^``^Z``[RZ^UUa^_X`BBBBB	chr10.fa		4891479	R	36	10					
+HWUSI-EAS610	1	4	81	1380	1480	0	1	CTCCAGGATTGGTGAGAGGTCCTGTCTGAAAAATAA	`ababaaaaaa\^aabaaa_`_a`_aaa_a`aaaaa	chr10.fa		4891644	R	36	119					
+HWUSI-EAS610	1	4	84	1782	402	0	1	CTTTGGGCTCCGTCCTTCTGCAATTATCTGACCCAC	aaaXV\F_```\_\`ba`bTaab^aaa__O]aa_aa	chr10.fa		4892153	F	36	117					
+HWUSI-EAS610	1	4	66	99	1250	0	1	AAGCCAGGAAGACAGTAGTCCTGTGGACCAGTCTCC	WO[b]`aa\Qa^^a\U]]U`XPZLKUV\^Z^S`M^Z	chr10.fa		4892821	R	36	117					
+HWUSI-EAS610	1	4	66	776	337	0	1	CATAAGCCAGGAAGACAGTAGTCCTGTGGACCAGTC	a`bbbabab]_aaba`bbabb```aa^__``^a`\a	chr10.fa		4892824	R	36	119					
+HWUSI-EAS610	1	4	73	726	1835	0	1	TGGGCCTAATAACAGGATGGACAGATAACTGCAGTC	aaaabbb`bbbaaa]`aaa`abaaab^`]aaaa``a	chr10.fa		4893083	F	36	119					
+HWUSI-EAS610	1	4	70	1261	612	0	1	AGTCAATTGTGTACAGTGTCTAGGGACATGTGAAGG	a`X_[``a\K``\O]a^\\_NT\a^P`P_aI\PYZ[	chr10.fa		4893115	F	36	117					
+HWUSI-EAS610	1	4	54	800	440	0	1	GATTGTAACGTCAGAGACAAGTAGATCCCTAGAACT	a^aaa_aa_`X`^aX_Y]]_aXa____]]W^^]]]`	chr10.fa		4893436	F	36	119					
+HWUSI-EAS610	1	4	22	1385	665	0	1	ATGTATGCACAGGTGCATGCAGGCCTATGTATATAC	aa`W`a_a_^___Va_a_`]Y]^JU__YXQ_`[Q_V	chr10.fa		4893563	R	36	118					
+HWUSI-EAS610	1	4	47	1131	1933	0	1	CACACACNCACACACTTGTTTACAGAGAAAATAGGA	Va\aa]HDVaY`aa_Wbb`bb___a_a[\`a_[aa`	chr10.fa		4893647	F	7A28	109					
+HWUSI-EAS610	1	4	78	1665	437	0	1	TCTTCAGATGAAGAGAGAATTGCTGCGTAGAGCGTG	``__U^O\YH^aTWU_Y`QT\S_WQXWS\Q^FXVX[	chr10.fa		4893819	R	36	116					
+HWUSI-EAS610	1	4	49	304	358	0	1	CTCCCAGATACTACTGTATCTAGAAATAGTATCTTA	a^``aaaa_aaa```aT^a^`^bX]]a]^Sa`__a`	chr10.fa		4893905	R	36	119					
+HWUSI-EAS610	1	4	85	1747	1473	0	1	GGCATGTATTGGCTCTGTGCAAAACATGTAGAAAAC	abaaaSIX[W]]`_aaaaZO[Y]^U]Y\R\X^_a`Y	chr10.fa		4894875	F	36	118					
+HWUSI-EAS610	1	4	14	1372	1381	0	1	GATCCCCCACAGGCAGAACTGACCAAAATTAACATA	aaa```a_```a__a`[`_a`a__`_`__aa_W^^[	chr10.fa		4895214	R	36	119					
+HWUSI-EAS610	1	4	19	1021	69	0	1	GTGGGCTCTTGGCCGACCCTTCCAGAGGGAACTCAC	XJZ\`\\RN`]YGDTX\XP[X[TWNPPGKV[FVYZY	chr10.fa		4895310	F	28T7	96					
+HWUSI-EAS610	1	4	10	23	448	0	1	GCATAGGGAGCTCCCATTTCCTGATGGTTATCTGCA	a^[U\b`a`abaaa`_HH`a^__WZ]bN\LYaa^`Y	chr10.fa		4895423	R	36	117					
+HWUSI-EAS610	1	4	43	1609	773	0	1	ATGGCTTAGGTAGGAAGATAAACTAAGGGAGCCCAT	aaaaaaaa^`]a`Wa^]^a`aa__a_[[[[_^^]`]	chr10.fa		4895484	R	36	119					
+HWUSI-EAS610	1	4	58	641	1742	0	1	GTAGCTTGTCTGTTCCTGGGTCTGAGGGACCACGTT	a]]a^aa_\aaa^__XY``_U^\^___[^[U[^aUY	chr10.fa		4895536	F	36	119					
+HWUSI-EAS610	1	4	43	1132	1559	0	1	CCTGGGTCTGAGGGACCACGTTCTGCACAGATGAAT	aabab_X`bX^^_^`]W_\ba_ZZa\a^`a^U_aa_	chr10.fa		4895550	F	36	119					
+HWUSI-EAS610	1	4	49	376	1204	0	1	ACATACCAGGCCATGATCTTGCGCCATGCTTAGCAA	aa^`]aaaa]aaa`aa`aaa^`aa``aa_`````a`	chr10.fa		4895665	F	36	119					
+HWUSI-EAS610	1	4	49	342	1968	0	1	CACTATAGTATGTGTACCACCCAAAGAAGGTGGGCA	`\`aba]aaa_`Z`R`_a]aa^_`^^Y^_`T[`_^[	chr10.fa		4895708	F	36	119					
+HWUSI-EAS610	1	4	12	169	1775	0	1	TTGGCCCATGAATAACAAAGCCCTTAGTTGGCCAAA	^LFO_]WNRUZWYH_]_SZSa`YWZ^^WGN]QWWT[	chr10.fa		4895902	F	36	115					
+HWUSI-EAS610	1	4	27	1786	1574	0	1	TGAGAGCTCGCACCTCAGGCACACCCAGTAAATAGA	aaa`[``VaPGXH_QaZX[_Z\Q]\X^BBBBBBBBB	chr10.fa		4896372	F	28G7	75					
+HWUSI-EAS610	1	4	82	1059	1739	0	1	GGAGGGGATTCTACCATTTGCTACAGGGTAAAGGAA	aaY_aaaaaa`aa_`aaaab_`a__a__^_[_^_]^	chr10.fa		4896934	F	36	119					
+HWUSI-EAS610	1	4	14	1621	492	0	1	TGGGTTTAGAGTTTCAGCTTTGCAGGATGAAGATAG	XLXRYY^_SWVY^Z_^TOV[T]WZZUMFQV[SW_X[	chr10.fa		4897121	F	36	116					
+HWUSI-EAS610	1	4	9	495	570	0	1	TTTCCACAGGAGTGCTCTATCAGTCTNCAACTCTAT	aaa`__Z_aa`a^`_`_`a`_``_^TDX^a_```_`	chr10.fa		4897153	R	26C9	110					
+HWUSI-EAS610	1	4	95	1727	460	0	1	AATGTCACCATCCAACAGGAAGGGAGAAGTGTCACA	a]`_a][_`[`__`\_[MYZT`UNQV\]RRLRGXZ\	chr10.fa		4897340	F	36	117					
+HWUSI-EAS610	1	4	21	473	976	0	1	GGCGTGGTTCTCTATTTCTACCTGTCTGCCTTGCTT	^bb^^ab````a_[aaa__SZ`ZZGU__^a`^a_aa	chr10.fa		4897916	R	36	118					
+HWUSI-EAS610	1	4	58	81	1282	0	1	TGATGTGGCCCTAACAGGATTTCCTGCCCTCTGACA	aaZbaabbbbbb_T^R^`^`aaaaZ`aaa`a^Z`_Z	chr10.fa		4898026	R	36	119					
+HWUSI-EAS610	1	4	34	973	1332	0	1	GAGACATTCAGATATGAAATCTTGTAGCTGAAGCAT	^]\ON\aaZ[[[aa`aTLO\[_aaVU`QN[[^ZUO[	chr10.fa		4898476	R	36	118					
+HWUSI-EAS610	1	4	77	1571	444	0	1	ATATCACCCAAGACTTATCTTCATTCACTGAGATAC	aa____[VN]Z\QRY__\RTS]_XUOZXWFTUQUY]	chr10.fa		4898678	F	36	117					
+HWUSI-EAS610	1	4	41	826	1628	0	1	GCCCAGTTGAATATGACCACAGTTGGGAGGAAAGGA	a_^_^_T`a\_a^``Y\^^^[`W_`Z_W`^VVU^\Y	chr10.fa		4898841	F	36	119					
+HWUSI-EAS610	1	4	90	71	214	0	1	GTTGTCAGTTGGGCTGGCTGGTCACAGAGGTTGTGG	a]b``]_b_`^aaa`ba`aab\a]aSaZaZEOYHXa	chr10.fa		4899001	F	36	116					
+HWUSI-EAS610	1	4	92	63	2042	0	1	GCTAGGCAGAGGCCAGCGGCCTGAAGATCTGTTCCG	TELT^ZQZ^``^F]_BBBBBBBBBBBBBBBBBBBBB	chr10.fa		4899063	F	16T14CC1A1	15					
+HWUSI-EAS610	1	4	59	1595	1634	0	1	ACTGTTGATTATTCCAAAGGCCAGTTTTAGGTGTAC	Ob`ba`TV\`_ab`bbX_``^a]Va[\`\`OFPRVa	chr10.fa		4899104	F	36	117					
+HWUSI-EAS610	1	4	75	21	71	0	1	ACATGGCTGACAACATGCATGTGATATCATGTATAG	Y`a]\_a]`b_TJVS[__[UZY\^LOVa[W[BBBBB	chr10.fa		4899217	R	36	96					
+HWUSI-EAS610	1	4	18	1513	1270	0	1	TATCATCTACACATAATATCACCCATGCATGTCATC	aaa_aa``a^`^a``a`aa`a`^^`^]^`_UX^^_]	chr10.fa		4899291	F	36	119					
+HWUSI-EAS610	1	4	96	1691	1612	0	1	GGTAACATTCCTGGGTGGTAATGTATAGGTGATTAC	a_^a_``W]^_aa^`Ub_W__aa_\a^_aV``X_]^	chr10.fa		4899373	R	36	119					
+HWUSI-EAS610	1	4	71	1289	1909	0	1	TGGCCTCAAAGCTATGATACTGCATGGATGATGATA	S]WZITY__XZR\UXSZZaXS_a`Y_`Z]^^_`_BB	chr10.fa		4899548	R	4A31	96					
+HWUSI-EAS610	1	4	19	808	716	0	1	GGGCAGCCATGCTAGGGTTATGCCTGTAAGCACACC	abaaa]`aaab^a`aaa_a`\b`aa`aa``^`aa`a	chr10.fa		4899823	F	36	66					
+HWUSI-EAS610	1	4	45	1096	1457	0	1	TACCAGCAACCTGGGAGGTGAGAGATGCTCAGAACT	abaaba^aa\`aaa`[ba_a`a_`[\```V``[\Ua	chr10.fa		4900124	R	36	48					
+HWUSI-EAS610	1	4	54	1357	627	0	1	CCATGCAGCTTGAACTCTGACTAAGGGGCAGAATTT	`aaa^^^\a_`b^^aa\`]^_^^_OR\`^a_Y[__a	chr10.fa		4901192	F	36	119					
+HWUSI-EAS610	1	4	77	810	1546	0	1	GCAGCTTGAACTCTGACTAAGGGGCAGAATTTTATT	`baa_aaa__ab^^a_W__]aa`a`bb_^a_a`aaa	chr10.fa		4901196	F	36	119					
+HWUSI-EAS610	1	4	79	910	1902	0	1	TAAGGGGCAGAATTTTATTCTGGTGAGCATGTCACT	abbaaa__baa_aaaaaa`_aa_Wa``^a_a^_`__	chr10.fa		4901213	F	36	119					
+HWUSI-EAS610	1	4	85	1028	1529	0	1	CAGTTTACACCTGAGGGTCTTTAATGTTATCAGGAA	P_Z\b`]Y\]X]bb\SX^b\`\[]\JT^bb`T\UM_	chr10.fa		4901346	R	15T20	94					
+HWUSI-EAS610	1	4	55	1717	1178	0	1	AACAAGGCGCCTTATGGACCTCAAGGAGCTTCAGAG	abbb`_^a`a`]`]a`_aaa``a_U_^R__[]_[`S	chr10.fa		4901571	R	36	119					
+HWUSI-EAS610	1	4	73	246	1866	0	1	ATACCAGCTCCTTTCTAGAAAGGGCGTTTGTAACAA	\WQ]`]^a_a_YY\aZSYOOT[^\ZZJZ`_PZV^SB	chr10.fa		4901716	R	36	113					
+HWUSI-EAS610	1	4	49	485	53	0	1	TGTTCTGTGTTGATCACCCCCCAGTGAGACTCCATT	abaaaaa\aaab`Y]`aaaa``_`R`]]QY]_\^_`	chr10.fa		4902256	F	36	119					
+HWUSI-EAS610	1	4	49	682	1978	0	1	TGTGTTGATCACCCCCCAGTGAGACTCCATTGGAAA	a````aa`a_a_^``````\`]`]^^]ZZ_[Y[[Z]	chr10.fa		4902261	F	36	119					
+HWUSI-EAS610	1	4	56	1491	1337	0	1	GGATGGTAGTTTGTGTCTACTTCTCTTCTCAGCTCT	`aabb`S\_`baa`^aaba`bb`a^_a_a_U_^a^^	chr10.fa		4902344	F	36	119					
+HWUSI-EAS610	1	4	83	1086	1390	0	1	CTTGGAACACTCATCCCTTAGTTGGGTGCTTCTGTC	V[_[[]TP``aa\bSRJXQZbPa_JX][[[ZG^_J]	chr10.fa		4902543	R	16A1A17	80					
+HWUSI-EAS610	1	4	68	35	766	0	1	GAACTCATGCCTGACAGTGACCAGGTATCCACGAGC	a]aX^IR\]^`ZZ[P\]WZFN[PVSQLS]GYG[Q^U	chr10.fa		4902783	R	31A4	103					
+HWUSI-EAS610	1	4	19	553	76	0	1	AGGAACCTGGAGGCAGGAACGGAAGCAGAAGGCATG	aaaaa```V]__\^^X[`a\^a\\\\\^UWW[UU\X	chr10.fa		4903858	F	36	32					
+HWUSI-EAS610	1	4	86	886	1395	0	1	ATGCCAACCCTGCGTTGTAATACAAAGCAGGCTGAG	aaa`^abaaa^][^_a`[```aa``aa`^`a__[]a	chr10.fa		4903931	R	36	119					
+HWUSI-EAS610	1	4	25	896	429	0	1	TGTATTTCACTGCTCTCTGCTAATGCTGTTTGCACA	`baaabaW_]``__^]PSa`aa_`a[]a`a`a]_]T	chr10.fa		4904312	R	35T	94					
+HWUSI-EAS610	1	4	22	1372	229	0	1	ACTGCTCACACAGGTAATGCAGAGACCATCAAAATT	aa_`_`_a`\Xaa`\a_`aT[_\PYW^]_\_^^_`a	chr10.fa		4904765	F	36	119					
+HWUSI-EAS610	1	4	26	47	268	0	1	AGAACACTTCACGAGAGATTTAAACTCCTTCTATTT	abbabbbbaaaab`bYb`_aaa``aaaa`^a`_aaa	chr10.fa		4904921	R	36	119					
+HWUSI-EAS610	1	4	52	1541	1474	0	1	AAATTTGAGAGGTTGACAGCAGTCATAGAGACCTAA	aa_aaa_^Z``aX`_`^``aaa]__`a`___^Z__`	chr10.fa		4905062	F	36	119					
+HWUSI-EAS610	1	4	61	303	1662	0	1	TTCTGGTTGTACAGATCGGTGGCAGATAGTTAGGGA	``_aaaab`_`a_\a`baa^a^``^`aU^Y^[^`_`	chr10.fa		4905313	F	36	119					
+HWUSI-EAS610	1	4	35	42	482	0	1	AGGTGAGCTGAGGTGGTAAAAACCTGTCCCTAACTA	VbaXaaabbaZaa]baXV]Z_aba`a_abbZZZa^]	chr10.fa		4905339	R	36	119					
+HWUSI-EAS610	1	4	19	135	795	0	1	GAGGCAGCAATGCAGAGCAGTGCTGTTACAGTATGC	a_aabaaa\aaaaaa]aaZa]aa_a[aaa`aS`\`a	chr10.fa		4905411	R	36	119					
+HWUSI-EAS610	1	4	34	593	1342	0	1	TGCAATCTTACTCCCAATACATTCTTCCTCTTTAGC	`[`]`aa`V^Y__a[`^``Z\_`a`[^`__^\``YZ	chr10.fa		4905742	F	36	119					
+HWUSI-EAS610	1	4	78	903	1548	0	1	CAGGTAGCTAAAGAGGAAGAATGTATTGGGAGTAAG	abbb_ba]a_]a_Z^a^ab^_aaY_aaaaa[^X_`a	chr10.fa		4905748	R	36	119					
+HWUSI-EAS610	1	4	49	576	459	0	1	CGGCTGTTCACATGTGATCTGTTGGGCTCATCCCAC	abaaa`V^]\aRYW\\\_a]_]_QYa`Y[\[P[^T]	chr10.fa		4905827	R	36	118					
+HWUSI-EAS610	1	4	91	36	1107	0	1	CTGTGTAAGTGCCCTCCTCATTCATGTATAGTTAGA	a\a_aWa`[N\b^aVHZ_aaZV\`Y_L_X]a\_a[Y	chr10.fa		4906149	F	15A20	106					
+HWUSI-EAS610	1	4	77	1498	1312	0	1	ACACAGGCATGTGCAAAACGGAAACCACATATTTAT	aa`_^\SUWW_T[\aL\\YTT_W^_X[_]^[U^_`a	chr10.fa		4906343	R	36	118					
+HWUSI-EAS610	1	4	51	1172	200	0	1	GTGAGCATTTGCCAAGTTGAGGATGGGGATGGTCAA	`]`aa^aaaaa__`]_Zbbab_[_`_X]_Y\^Y^\_	chr10.fa		4906776	F	36	119					
+HWUSI-EAS610	1	4	48	223	384	0	1	ACAACACTACCTTATGTCTCTGGAGAAACACAGGTG	\aaaabbababbaaababaaaaaaaa`aa[a[abYa	chr10.fa		4907078	F	36	119					
+HWUSI-EAS610	1	4	70	496	1472	0	1	TCTTCAGGTGTACACTGGATCAGTGAAGAAGAGATT	abbaaaaa_a][_aaaaa`^[Z[VaYL[]\_][Y^a	chr10.fa		4907237	R	36	119					
+HWUSI-EAS610	1	4	80	1652	417	0	1	AACAAATGCCTTCTTCCTGCCTTTCTTCTTCAGGTG	a`_`aa_\_`___aa_a_[]^Z__]^_^`^]ZOZRW	chr10.fa		4907263	R	36	119					
+HWUSI-EAS610	1	4	26	1537	851	0	1	AAACTTGGACAGGAGATGTGGAAAGAATATGACAAA	aaaaaba_a^a\_[a^_bUa`Yaaa^`]____^_a^	chr10.fa		4907847	F	36	119					
+HWUSI-EAS610	1	4	28	1275	1742	0	1	TGAAAATTTGGGAAAACCATCTGTCAAATCTAATGC	`V\^`^]aaa_X\_]a]_`^^`aU[__^_]^WW__\	chr10.fa		4907977	F	36	119					
+HWUSI-EAS610	1	4	3	154	1868	0	1	ACTATGCTATGTTCTCTTTTGCAAGCATTGCAAAGA	Y`b_aaa`abb`ab^baa``aba^aaaaaaaab`a_	chr10.fa		4908035	R	36	119					
+HWUSI-EAS610	1	4	85	1447	1113	0	1	ATCCAGTTTCTATCAGGAGAGAGTAGACACATCTAT	\]aab_ab^G_Za_Wb\\\a]a]a\Ya`[_`ZIK]Y	chr10.fa		4908195	F	36	117					
+HWUSI-EAS610	1	4	91	735	495	0	1	GACTCAAGGGGTGAGTACAGAGACACTCTTTAACTA	a^_^]`_ZYZ_Za]_]`]^`R]^V_Z_WZUXXW]Z]	chr10.fa		4908288	F	36	119					
+HWUSI-EAS610	1	4	63	1237	717	0	1	TGTGTTTCTTTTTCTTGAGATATGGCCTCAGTCTTT	RZ\_\^a_aa_Z^VZY\\[]Z_VV`[`]UXa[[_[]	chr10.fa		4908346	F	36	119					
+HWUSI-EAS610	1	4	48	990	2036	0	1	AATGGTCAATATCCTTGCATGTCCTCATAGCTAAAG	aa^_ZX_a_a]____`a]`_aZ_]^^__^^[^]]]W	chr10.fa		4909333	F	36	119					
+HWUSI-EAS610	1	4	35	1160	524	0	1	AAGTTCAACAAATTCTCATGCTGTCTATAGACACAG	a`]J[^aa[`^]a___]__^^VXYWZ`Y_^^X\VY_	chr10.fa		4909430	R	36	118					
+HWUSI-EAS610	1	4	85	1479	1845	0	1	AAGTTCAACAAATTCTCATGCTGTCTATAGACACAG	abbZaabbabaa^b`bbabaa_`^^``]_VZ^\Xaa	chr10.fa		4909430	R	36	119					
+HWUSI-EAS610	1	4	9	168	2025	0	1	ATGGTGGTTGCTCTTCAAGGCTCTTCAATATATATG	aabb[bb]`_^Y`T``QXPK^P\\_ZRPSYU\BBBB	chr10.fa		4909608	F	19T16	85					
+HWUSI-EAS610	1	4	71	1695	1719	0	1	GCGGGTTTCTTTCCCCAGCCTTGTGAACAAGGACAC	a^\]aUX`aaaa_a]aaa]T_^]^_]^^^^^\UUUU	chr10.fa		4909701	F	A35	81					
+HWUSI-EAS610	1	4	9	100	1721	0	1	GAACAAGGACACCGGGTGAAGCGTATTCATGCTGTG	a^]a]_ba``bbaaaaVaa`aaaYaaaaa^`a_aZa	chr10.fa		4909725	F	36	119					
+HWUSI-EAS610	1	4	78	359	294	0	1	AGCGTGCAGTTATACCCCAAAGACAACAGTTAGAAA	abababaababaaba^a_aaabaaaa]_a_aa`aaa	chr10.fa		4909856	R	36	119					
+HWUSI-EAS610	1	4	68	991	416	0	1	AACAAACATAAAGAACATATGTAATGATGGAACTAT	aa`aaa_aaa_`a_a__aa`a_`_aa`__^]_[__a	chr10.fa		4910155	F	36	119					
+HWUSI-EAS610	1	4	19	732	5	0	1	TGTGTACCATTGTCCTAGGATTCAATCCAACACCAC	aa\Y`a_``aa`WT[\aaZSW^^]_____^]_^^_^	chr10.fa		4910251	F	36	119					
+HWUSI-EAS610	1	4	42	1390	1948	0	1	TACCATTGTCCTAGGATTCAATCCAACACCACACCA	_U\RLXLVOS[Q`R_X`X\]Z_WLVXT_`XUXBBBB	chr10.fa		4910255	F	36	100					
+HWUSI-EAS610	1	4	26	1533	672	0	1	TGGGGCTTCCCAGGGCAAGAAGAATAAACCTGGACT	abba_aabbaaaa]aaaaaaaaaaabaa_a__[```	chr10.fa		4910734	R	36	119					
+HWUSI-EAS610	1	4	54	328	1971	0	1	CATGCTAACACCCTAATCTGACCCTAGTAACCTGTC	aabaaa`a`aaaaa`aa_``aaaa`a^Z_a`___W_	chr10.fa		4910768	F	36	119					
+HWUSI-EAS610	1	4	59	1297	548	0	1	GAACAATAACTATTTGAAGGAGTTAAAATTTGAGAA	aabaaaaab`aaaa`[`]]a`a_aa_a`````a`__	chr10.fa		4911019	R	36	119					
+HWUSI-EAS610	1	4	20	1077	123	0	1	CTCATGCTCATTTGTTACTGTTTATATTCCATTCTG	aa_`bbaaabbaa_`aaabb`bbbb``a`_aaaaa_	chr10.fa		4912112	F	36	119					
+HWUSI-EAS610	1	4	56	1506	1356	0	1	GCGTGCGCGCACAGCAGAATGGAATATAAACAGTAA	aba]`b_`babaababbabb`baaaabbaa_a`_bb	chr10.fa		4912126	R	36	119					
+HWUSI-EAS610	1	4	62	1543	249	0	1	AGAGAGAGCATACAGTACTGTTAAGCTTTTACTCTA	`a]_^ZWR``^[^]NT_]XFU[_]QQZVU_]]]^^`	chr10.fa		4912287	R	36	117					
+HWUSI-EAS610	1	4	31	745	382	0	1	TTCACAACAGGCTGTAGCTCTCAGATTTTGCCTCAT	abaa`aa`aa`_aa]a`^a____a^```__ZZ_^`_	chr10.fa		4912769	F	36	119					
+HWUSI-EAS610	1	4	99	392	109	0	1	TGAGGCTGGCTGGATACTGCTCCATGCCGACATTTT	aabbZaba^`Zaaaa]bUa``aa`Z__aaaV^`[SX	chr10.fa		4912822	R	36	119					
+HWUSI-EAS610	1	4	29	384	1768	0	1	GTCGGCATGGAGCAGTATCCAGCCAGCCTCATATAC	_\_]_Z`^_]_a[^a_]_^ab^^\T_b_Z_^]^Z`a	chr10.fa		4912827	F	36	119					
+HWUSI-EAS610	1	4	72	1661	1506	0	1	TAGCTTGTATTCTTTAAACAGTTTACATTTTGGTGA	abb_baaabaaaaaabbba^[Xbaaaaa`_aa`^a`	chr10.fa		4912994	F	36	119					
+HWUSI-EAS610	1	4	34	721	1560	0	1	GGTGAGCTGATACCATGGAAAACCACAGGCAGAGGG	aaY`\aa`aa^^[_Z]^]``^^^ZV]^^^[^^UY^`	chr10.fa		4913025	F	36	119					
+HWUSI-EAS610	1	4	39	1443	516	0	1	AAAACTCAGACAGTGATTGAGAACAGAATCACACTG	aaaaaaaaa`_aa^__^aaaa^a_a[b`_]a]a^_^	chr10.fa		4913130	R	36	119					
+HWUSI-EAS610	1	4	72	1599	425	0	1	TGGGAAGAGAGGCCCCTTGGCCTTGTAAAGACTATA	J\aYWWa__bba_SZaZP]XbbROGN_aZYFFR^Ua	chr10.fa		4913619	R	30TT4	9					
+HWUSI-EAS610	1	4	9	97	1716	0	1	GCCCTAGTCGGCCATTATTGGGAAGAGAGGCCCCTT	ab`_a`a]a]bab]a^^aabaa]`a`b]a_Vaa`^^	chr10.fa		4913637	R	36	9					
+HWUSI-EAS610	1	4	39	723	1867	0	1	TAAAAGGAGTTACAGAGACAACGTTTGGAGCTAAGA	aa_aaa_`a^a[aa`__aab[Za]`a_\_`_]^^_^	chr10.fa		4913996	R	36	13					
+HWUSI-EAS610	1	4	82	1169	1946	0	1	TGGAACATCTTCTGGGCATATGCTCGGGAGAGGTAT	`[a_PWbba`_[aa_aab`_QaZaa``aQa]]SQ`a	chr10.fa		4914413	F	36	23					
+HWUSI-EAS610	1	4	37	167	228	0	1	GGCAGGATAGCCATTTTGACTATATTAATGCTGCCA	aab`bb``aabb_aaaaa]aaaaaaaaa_abaaba`	chr10.fa		4915494	F	36	12					
+HWUSI-EAS610	1	4	13	589	852	0	1	TGCAGTCTGAAAGCTCACCTGCACAGACTGGTTTCT	abaab_aaa_aaa`aaaaaabaaa_a``a`]Y_a`a	chr10.fa		4919298	F	36	43					
+HWUSI-EAS610	1	4	37	1136	12	0	1	CCAGAGTACATGAGAGAGCAATCATGTGCCCCACAT	abbbab`baa_^_\_bababaaaaa`[a`_a``_a`	chr10.fa		4919339	R	36	119					
+HWUSI-EAS610	1	4	77	1282	580	0	1	GCAAGCTGACTGCAGAAGCTACACAGCTTCAGGGAC	_^b__]aaaaa`^`_a_T_aaa`^[``a`Y]XL[_V	chr10.fa		4919452	R	36	33					
+HWUSI-EAS610	1	4	75	684	782	0	1	TAAAAGTTTGACAGAGAAGAAGAGGGCTCATCAGGA	aaaa`a`aaa__ab]a]_a_``_]]`_`_____`a_	chr10.fa		4919764	R	36	119					
+HWUSI-EAS610	1	4	87	1512	524	0	1	ATCCGGCAGCTGCAGGATAGAGATCATTAGCTCCCT	`R[^Z[_YQPLFMP^TQPXN[SNFLZ\\[W_ZWUWU	chr10.fa		4920092	R	17C18	94					
+HWUSI-EAS610	1	4	40	1491	1465	0	1	AGTGGGGACAAAGGGTAGACCAGTTAGCCCAGTTGT	abbbbbaaaa_^aaa]bbbaa`a_^a`a`aO``aba	chr10.fa		4920161	R	36	119					
+HWUSI-EAS610	1	4	2	291	777	0	1	ATTTCAACTGCTGACTTTTATAGGTAAAGGAGAACC	_P_\^P_Xaa`R^[`_THSS__a_N__^UZV[W`^B	chr10.fa		4920306	F	36	113					
+HWUSI-EAS610	1	4	35	1592	1919	0	1	TGACTAATTTAATCTGTTTAAAAAGAAAAGTTGTGC	a[ZPa`aaaa__`Z`\aaaRGRW_\W`WS_Y_`[`[	chr10.fa		4920758	R	36	118					
+HWUSI-EAS610	1	4	44	1706	564	0	1	CAAATGTAATAAAATACCTGGAAATACAGGATAATG	abba^VZbaaa```abaa]IX^a_`a^ZHZ`_a`Z]	chr10.fa		4920855	R	36	117					
+HWUSI-EAS610	1	4	17	1653	356	0	1	ATCTATGGCTTCTCTCATCATGTCACTTTTCTTTCC	abbaa_``]_a`a___`aaaa^[^`___aa`__`]a	chr10.fa		4921385	R	36	119					
+HWUSI-EAS610	1	4	80	395	531	0	1	AAGGCAATAAGAAAGACGAAAAGGGTTGGAGAGATG	^_abbab_^_aaaabaab]]\]aaa\aaa_aZ`_`a	chr10.fa		4921753	F	36	119					
+HWUSI-EAS610	1	4	78	755	1247	0	1	AAGGGCTATTTACTTTATTTGAGGTGTATGAATGTT	_OX\_FQ[a`_NRa^YO[`_XX_ZQ\O`a^ZXZ`P^	chr10.fa		4921951	R	5T30	107					
+HWUSI-EAS610	1	4	35	1143	956	0	1	TAAGAACTAATATTTTTTCAGGGGTATATAGGATGT	aa`a_a`aaaa_a`a__`a`a_a_S_``\^`^^^aZ	chr10.fa		4922033	F	36	119					
+HWUSI-EAS610	1	4	57	300	1992	0	1	TCAGGGGTATATAGGATGTTAAGATTAATCCTTCTC	U`^aab_\aaa^^b^Z\_P[[_`[aXK[^OIT^Y[\	chr10.fa		4922050	F	30A5	104					
+HWUSI-EAS610	1	4	13	719	1965	0	1	ACTGCCAGCCCACCCAGCAAACGAAAGGTGGCTGCC	`]`^]\\JX]_`]\Z]]\^]^Z^Z]]XPS]XZPSSS	chr10.fa		4922243	F	36	118					
+HWUSI-EAS610	1	4	66	582	1333	0	1	CAAACGAAAGGTGGCTGCCAAGATCCAGGGAAATGC	a_`a``WHT`^Vaa[_`aX`Z^NSV\F[`____a\`	chr10.fa		4922260	F	36	117					
+HWUSI-EAS610	1	4	20	1282	666	0	1	CAAGAAAACTCTATTAAAGTGGGTCCAGCACACAGC	aaaaaaaaaaaa\aaa_aaYaa]Y__[_aa``^`_`	chr10.fa		4922296	F	36	119					
+HWUSI-EAS610	1	4	5	1441	1932	0	1	AACCATTGACACTTACTTGCCTGCTGTGTGCTGGAC	ab__`_aaa^_Za__^`_`W_`[Q^QS`V_W\YZYB	chr10.fa		4922318	R	36	114					
+HWUSI-EAS610	1	4	24	1421	121	0	1	TACTACTTTATTGGAACCATATTGGGCACCCCTGCA	]ba^`a\\``__WR^^[`aa`XOYVN\]`Y^`RPWY	chr10.fa		4923595	F	36	118					
+HWUSI-EAS610	1	4	47	1120	1428	0	1	GAAAACAGTAGGCAAGTTGCACGCATAACCTTGATG	a_`a]]_WX]]ZRZ_[]_`___`\^_^[UT^__][\	chr10.fa		4923752	R	36	119					
+HWUSI-EAS610	1	4	92	1685	601	0	1	GTAAAAATGTAAGTGCTAGGGGCTGGAGAGATGGCT	KVbababWRQ_^U__b[_MYUUa_`aa_^_a`[Z_a	chr10.fa		4924464	R	36	118					
+HWUSI-EAS610	1	4	73	309	702	0	1	GACCATTTTTTTCAGAAAAGAAACTATGGAAGATGT	a\a]\^abb\O`aabaaZY[`[a[aaab`_aaX`a_	chr10.fa		4924892	F	36	119					
+HWUSI-EAS610	1	4	41	507	2007	0	1	ACCAAGTGTAATGGTAGTTCAGAAAGAGAATTAAGT	a`QPU\YaZ]W^_^TPZFXS\USSLJRLQVXJZYZR	chr10.fa		4925013	R	31G4	101					
+HWUSI-EAS610	1	4	98	1177	562	0	1	GCAAAGCCAGTTCTAACTGATGCAGTTGTTCAAGCT	`aaba`]\a`_]aZbbWabaaa[^]aaa_`a`]`R]	chr10.fa		4925110	R	36	119					
+HWUSI-EAS610	1	4	99	1337	1072	0	1	ACTGGGTTGGCCTTTCATTCAGTCATCCACGCTATC	aYaaa_Y`aaYSYab_aabaa`^WJ`a]_Z__aa_`	chr10.fa		4926008	F	36	118					
+HWUSI-EAS610	1	4	46	821	2039	0	1	TCATCCACGCTATCCAGCCTGAGCTGGTGGACCTGG	``__X`a_``Xaaaa_\X^^_X^]ZXXU`YEKS\\]	chr10.fa		4926030	F	36	117					
+HWUSI-EAS610	1	4	30	877	77	0	1	CATCCACGCTATCCAGCCTGAGCTGGTGGACCTGGA	`_`]\a^`^_a_^``Z^`\^\`\^_`R`[SX\\`ZY	chr10.fa		4926031	F	36	119					
+HWUSI-EAS610	1	4	31	1684	766	0	1	TAGCTGTGTTTCAGCGATCGCGAAGGCGTCCTCCAG	]V[W^\Q`XaT]Y`_aaXaZFZWUGSSDEXTSVaQ`	chr10.fa		4926098	R	20T15	103					
+HWUSI-EAS610	1	4	45	819	657	0	1	GACGCCTTCACGATCGCTGAAACACAGCTAGGCATC	``]^^\a_T\^a`Z`]Xa_XZa^]TV\N]^QYZXBB	chr10.fa		4926104	F	36	110					
+HWUSI-EAS610	1	4	36	195	572	0	1	AGGGCCCAGAAGAGTACACAAAGGAATGATAAGTTT	[abbbbbbbbbbababbaba`abbabbbbb^Zb^aa	chr10.fa		4926268	F	36	119					
+HWUSI-EAS610	1	4	62	113	1433	0	1	GGGGGTGAAGCAGGCAGACTTTACTGACATCGATTC	ababb`a^_bb_`]aaa]a_aaaa`Xaaaaaa`__]	chr10.fa		4926534	R	36	119					
+HWUSI-EAS610	1	4	49	374	750	0	1	AGTCTGCCTGCTTCACCCCCACGTGAATCTGTAACC	_bababaaa^aaaaaaaaaa\_a_aa]aaaa_]aa`	chr10.fa		4926550	F	36	119					
+HWUSI-EAS610	1	4	25	308	708	0	1	GTGGTCCTGTTGTTCTAAAAGGCACTGCTCACTCCT	a^^_L]`Y^[\SNSTZN\VLNW[[TG\PFZZ]R_^R	chr10.fa		4926667	R	36	115					
+HWUSI-EAS610	1	4	85	1740	11	0	1	TACTCATGAACTCACAACAGCTGCGCTTGGGTTGTC	I_W]_b\U^`ZX_babb`bba\\\aa_[FX]HH^a[	chr10.fa		4926705	F	36	21					
+HWUSI-EAS610	1	4	31	1044	639	0	1	CACAACAGCTGCGCTTGGGTTGTCTGCACAAGATCT	ab`bb`bbaabab_`aba_F\`V]bbaa^L_`X]`^	chr10.fa		4926717	F	36	117					
+HWUSI-EAS610	1	4	46	1362	1417	0	1	GTTGTCTGCACAAGATCTGATCAGTCAGCATTGTAG	aabaaa``aa_``]\`_bb__a]`__`_`_Y_]W`a	chr10.fa		4926735	F	36	119					
+HWUSI-EAS610	1	4	35	1475	786	0	1	CACTCCCAGAAGCCATCAACTGCCTGTAGCGCCTTA	aaabaa]ab`a`^_``aaa`a^`aa^Y_Y``Y^^`\	chr10.fa		4926803	R	36	119					
+HWUSI-EAS610	1	4	42	586	234	0	1	GGCAGTTGATGGCTTCTGGGAGTGGGAGAGTCACTT	abaa`^a`QW\_Y]a_\Y`PV]Za^`[^X[TKUR]a	chr10.fa		4926815	F	36	36					
+HWUSI-EAS610	1	4	44	1698	1133	0	1	TCCAACACCTGCCATGTGGGGTCAGTGGTCTAACAC	a`aaaaa`__]^`^_TW\^]`U\^_W]\\\^\]\[V	chr10.fa		4928153	R	36	45					
+HWUSI-EAS610	1	4	49	768	463	0	1	TCAAATACAAAACTAACTCATTAGTTTATAAAGATG	aabaabaaa`aa`a`aaa``ba`a_aa`aa``a^ab	chr10.fa		4928889	R	36	119					
+HWUSI-EAS610	1	4	52	1657	1345	0	1	ATAGGGAAAAGGAGCTATATAAGCCATTCAAATGTA	aaa_baaabba\aaaabbb`baa`aaab`a^aa__a	chr10.fa		4928990	R	36	119					
+HWUSI-EAS610	1	4	21	1190	1436	0	1	TGTGATGGGCAAGAACATTTATGACTATGCAAGCCA	ab`baaaaa`aaaaa_abbba[a__`Y___`^_\UR	chr10.fa		4929230	F	36	119					
+HWUSI-EAS610	1	4	43	1227	1549	0	1	TGTGATGGGCAAGAACATTTATGACTATGCAAGCCA	a`[\\WR_]`XQ[YWT_^a[`_TOY\^[XIR]VQZB	chr10.fa		4929230	F	36	113					
+HWUSI-EAS610	1	4	49	260	1244	0	1	AACAGAAGTTAAGTTTGCAACAACATATATTGTGCT	`_b\baab_bbbb`aaababbbbaabababbaabba	chr10.fa		4930986	F	36	119					
+HWUSI-EAS610	1	4	63	1156	396	0	1	GCCAAGTTAATAGAGTGGTTGGTAGAACCATGCTTT	\`_^WZ\_\`a`__`[^[X^]XR[Z]a^W[YYWZaa	chr10.fa		4931088	F	36	119					
+HWUSI-EAS610	1	4	65	816	69	0	1	TTTATTGTGCCTGTAAAGCAAATGTTCCCGAGAAGC	abaaaaa^a_]aa^aaa`]`aa_`]^_Z_aW`]^`]	chr10.fa		4931198	F	36	119					
+HWUSI-EAS610	1	4	30	1351	1489	0	1	AAAAACCTAGAGACCTGAGCTACCACGCCCTAGTGT	NWa^bbaa``ababa`bbbbbb_bbabb_bb`aaab	chr10.fa		4931280	R	C35	100					
+HWUSI-EAS610	1	4	86	1338	1598	0	1	CACAGGAACTTGCAAGTCCAGGTTTACCATCAAAAC	a^H[VTY`]^__TVTYV__aU_V_^^_`W^Z^\^`Z	chr10.fa		4931310	R	36	118					
+HWUSI-EAS610	1	4	62	10	1130	0	1	AAAGCAAGCTGGAAACCTGTGTTGTGTGGGAATCCG	QZZZa_W^a`aa[XXa`\`Za]`a`a\aa`Z^aaaa	chr10.fa		4931372	R	36	119					
+HWUSI-EAS610	1	4	67	843	1322	0	1	TGCTACTGTTGTTTTTCCTATGAGACTGCAATCCCG	abaaaWaaaaaZ_aaa`X_ZZ[^`^Z^`]___^^_a	chr10.fa		4931507	R	36	56					
+HWUSI-EAS610	1	4	76	938	723	0	1	ATAGGAAAAACAACAGTAGCAACTAACCTGACCCCC	_^aab\abX`a_a_`a\aa_aa`a__^^_aa^RH][	chr10.fa		4931522	F	36	52					
+HWUSI-EAS610	1	4	92	1497	1695	0	1	ACACGGAGGGATCCCTGGATCCAACTGCATATGTAG	aaba`a_`aa`a`^`_bZ^^^^_VQ_aS`^W`V\`a	chr10.fa		4931596	F	36	119					
+HWUSI-EAS610	1	4	39	886	400	0	1	CTAGGGTAGTGAGGCAGGAGTGGGTGGGTGAGTGGG	_a\_aaUaa^``^a`\aa`a]`^\]`aaX``^X`_`	chr10.fa		4931705	F	36	24					
+HWUSI-EAS610	1	4	52	982	1608	0	1	ACTTAGTGCATGTGTAAGGATTGGATGGGGAGTGCA	aabaaa]a]`aa`a]aaab`aaa]^aaaa]]a]a^`	chr10.fa		4932934	R	36	119					
+HWUSI-EAS610	1	4	14	1569	351	0	1	TGAGTCCCCTCAGAAGGTAAGCACAGGCTTGTCCAC	aa^`Y^\_`^^^Y^``Z^``X_]SS\\WUSQGT\SW	chr10.fa		4933254	F	36	117					
+HWUSI-EAS610	1	4	92	73	1915	0	1	TACACAGTCAGGATATGCTTCGCTCTGTCGGCACCG	aJ`Tb]a\^T_a_ZTI^_LYabaV]GZW]S`^\`]^	chr10.fa		4933289	R	36	116					
+HWUSI-EAS610	1	4	4	37	1249	0	1	GTTCCATTGGTAGACAATAATTTAAGGCATAAAATC	aaabb``ab]Ra_aab`aVaa`_`Z`a^Z`[Z_a`a	chr10.fa		4933509	R	36	119					
+HWUSI-EAS610	1	4	100	606	1714	0	1	GTGTTAGACAGTAAAGGAGTTGACATGATGGAGATG	XHa^`Z^`aa`N\`aa`_a`Va_a\aa_``_\\]^_	chr10.fa		4933771	R	36	118					
+HWUSI-EAS610	1	4	96	1597	1760	0	1	ACACGACAAATTATATTGTCTGTGCAACTAAACATT	a\b\]a_a`_b``]`a`a_aa^Z^^^V\]W]]SG\`	chr10.fa		4933803	F	36	118					
+HWUSI-EAS610	1	4	66	528	323	0	1	ACATATGAGGAAATGCAGACGGAGGACACACTGGAT	abababbab__abX\]]a`a_a`ab^X^_`[^XPQ_	chr10.fa		4934032	R	36	119					
+HWUSI-EAS610	1	4	43	144	374	0	1	TAAAGAAATATGAAAAGTTAAAAGGTAGGCTAAGCA	a]\^aa]_a``bbb`ab`b`^a_`b_bbbbab`bbb	chr10.fa		4934180	R	36	119					
+HWUSI-EAS610	1	4	43	902	99	0	1	AAAAACAGAGGCTGACAGGATAGCTGCTACAGGAGG	``aaa_aa`_X___^^`a^^^[XVYVWZSTQUXUY^	chr10.fa		4934759	F	36	118					
+HWUSI-EAS610	1	4	34	1499	525	0	1	AATGAACGAGTGATGACTGTACAGTTGTGGCCTCAC	``_WYZYVYQKRWXTTZXRVVVTMHSLXSONOUR[T	chr10.fa		4934920	R	36	116					
+HWUSI-EAS610	1	4	35	1698	266	0	1	GTCACCTTTGCTTATTGGGTAGCCTTCACGCTCACA	``a`[V_`_VU^`_aa]]ZY_N\]][]`\\V\V^[`	chr10.fa		4934956	R	36	119					
+HWUSI-EAS610	1	4	43	890	1434	0	1	TAAACAAATGTTCGGGTGAGCCTGAGGCTGCTGGTT	ababaaaaba_^\`^_Ua_aa_a_`[^`_`_aa`U]	chr10.fa		4935265	R	36	119					
+HWUSI-EAS610	1	4	17	892	1650	0	1	GGACGTGTGTGTTGAGTATTGATCCAGTGGGTGTGG	abXabZa]aZa`a`R]_aaaba``\Z[U`aaV`V[_	chr10.fa		4935341	F	36	119					
+HWUSI-EAS610	1	4	59	1048	11	0	1	GGACGTGTGTGTTGAGTATTGATCCAGTGGGTGTGG	J`aSb_bVa^a_ab_^FO_XXZ[R[X_[]VSR_[__	chr10.fa		4935341	F	36	117					
+HWUSI-EAS610	1	4	25	57	1359	0	1	TATGCTATTACTACATTTACTAGATACATAGAAAAC	ababbabbbbbbabbabaababababa\`bb_babb	chr10.fa		4936006	R	36	119					
+HWUSI-EAS610	1	4	25	1207	697	0	1	ACTGTAGCTGTCTTCAGACACACCCAAGAGAGCATC	ab`[_a]aaa_aabaaRaa`aabaaaaa`a_a_a_a	chr10.fa		4936193	F	36	35					
+HWUSI-EAS610	1	4	64	676	375	0	1	TGTAGCTGTCTTCAGACACACCCAAGAGAGCATCTG	^^`^T]`___`]Z^__W[___[^__`Z`QSY^W\U^	chr10.fa		4936195	F	36	34					
+HWUSI-EAS610	1	4	43	753	906	0	1	TAACATTGCATTGCTTCTTGGCTTCCAGAGGGATGA	ab`aabbbaaaba`aaabaaaaaaaa]a]aaa\_a`	chr10.fa		4936642	F	36	119					
+HWUSI-EAS610	1	4	78	782	893	0	1	AGAGATTTTACAAGGGCACAGATGACCGAATCAAGT	aa^^R]^RX`_a___Z]\]^a][]]XR_]\X^_]_B	chr10.fa		4936724	F	36	114					
+HWUSI-EAS610	1	4	86	229	1978	0	1	ACCCTATGTCCTCAGTACAGAGGCCTGGGGTATTAT	K`bbbbbb`bbaa_\]_ba\R_ab``a\aaVaaVO\	chr10.fa		4936958	F	36	118					
+HWUSI-EAS610	1	4	15	78	545	0	1	CAGATGTCAGCTGATGTAACGAGCCACTAAAATGAG	`Y`aab_aabaaaaaa]aa_a\aaaaa__`^^_`_a	chr10.fa		4937071	F	36	119					
+HWUSI-EAS610	1	4	46	1654	1309	0	1	AGCTGAGGTCAGAGAGCTGTGTCCAGTCCCTTTACA	aTaba`aa`abab`aabb[\`YRR_aaYPSa[_[aa	chr10.fa		4937243	F	28T7	98					
+HWUSI-EAS610	1	4	57	337	1476	0	1	AAATGCTAAAGACATCAAAATGTACAAGTGATCTTT	]\Y^baa_]`^S[]]S]Z`]`a[]__TVS`ZV]]`a	chr10.fa		4938137	R	36	119					
+HWUSI-EAS610	1	4	58	972	1308	0	1	GAGCTAGTGACCAGTAATAGCTCCTAGGAGAGGGAG	aa`aaaa_a`___a\aa`_aa`__^Z_a\a\[__W_	chr10.fa		4939111	R	36	119					
+HWUSI-EAS610	1	4	45	971	1881	0	1	TGACTGGCTTGTTGCTGTGTAGGTAACCATAGCTAC	aba][F\W__`]^[\_`Y_GYa_MM^GQ^VLY\\P[	chr10.fa		4939198	F	36	115					
+HWUSI-EAS610	1	4	39	709	363	0	1	GGCTGTAACTATGGTTACCTACACAGCAACAAGCCA	[JTW_Z[X[_Q\\]W]MZ`XZZ_aXTY_aVYTZX^V	chr10.fa		4939202	R	7G28	89					
+HWUSI-EAS610	1	4	25	853	1597	0	1	AGGCAAAAGCATAGACTACTTAGAACTCAGTTTGAC	abaabba`aaaaabaaababaab`b`a`aa``aaa`	chr10.fa		4939518	F	36	119					
+HWUSI-EAS610	1	4	28	785	765	0	1	GACACAAGATCCCTCCTGTAGAGTGGACACAATCAG	ababaaaa`aa`_a__aa[_aZa[_a_^___`_^`_	chr10.fa		4939645	F	36	119					
+HWUSI-EAS610	1	4	59	1191	1358	0	1	TGGGCCAGTATTGTAGCGTACAGCATTCGGCACTGG	abbb`\aa_aaaa]a`Za^a`Wa]a]^^`^_]S`_a	chr10.fa		4939754	F	36	119					
+HWUSI-EAS610	1	4	31	389	1757	0	1	AGGAAATATAGAAACCGACCTACACTGATCAGGAAA	[b`T\aa^bb````ba`\\`^aaa^``^^^M]^^aa	chr10.fa		4939851	R	36	119					
+HWUSI-EAS610	1	4	94	1363	265	0	1	GCAAAATAAAGGTCTAAGTAGTCACGCATAAGCTAC	]bb`a`aaabV`aabab]bb`^`ba`ababaY``b]	chr10.fa		4939996	R	36	119					
+HWUSI-EAS610	1	4	64	872	622	0	1	ACCCAGGGTTAAAGGGCTACATTAGGATAGAGGTTT	aaa``a``\aa`aaaa`aa_aaa_aa^a`\^a^U`a	chr10.fa		4940268	R	36	119					
+HWUSI-EAS610	1	4	88	1080	1581	0	1	TGTAGATAGAACCAGAGGGATGTGTAGATAGTACCT	ab]aY_a`a_a_^_`Zaa^^aa_a]]_]`]YX\Z\`	chr10.fa		4940790	F	36	119					
+HWUSI-EAS610	1	4	89	889	808	0	1	GCTCCACTTGTTTCCTTTTCATTTCATATTGAACTC	aaba`^YaTbY\`PS``aaNZa``M\a[_a[`aT_Z	chr10.fa		4940995	R	36	118					
+HWUSI-EAS610	1	4	87	962	6	0	1	AAGATGGTACACACAGCTTGGTGAAGACACACAAAT	aaaa`aZX_`a___aa__aa`Va^___^_^^]_]`_	chr10.fa		4941136	R	36	119					
+HWUSI-EAS610	1	4	1	891	994	0	1	GTGCCAGAGCAAGCATATCCAGAAGTGCCCAGGGCA	`aa``_^_a[^][]_aa_^^a]``_\`]YR\W^\^^	chr10.fa		4941261	R	36	119					
+HWUSI-EAS610	1	4	54	115	462	0	1	ACTTCCAGTTGTTTAGAACAGCTGACTTTTGCCTTA	]aaaab`b_ab_a_ba`\`aaa`aa_a`aa_aa`]a	chr10.fa		4941386	F	36	119					
+HWUSI-EAS610	1	4	8	1109	311	0	1	AGGACCTTTCTGTGCCAAGAGGCAAGCTCATGTTCG	a]VOZa`aa`aa``_a\X\_`_a`[RQRU^^_Z`[W	chr10.fa		4941481	F	36	118					
+HWUSI-EAS610	1	4	43	177	120	0	1	GGATGGTTTCTAAGATGGAATTTCTATAGACCAGGA	aaaaaa^`aaaa_ba_aa`_aa_aa_aaa`aa`_^_	chr10.fa		4941729	F	36	119					
+HWUSI-EAS610	1	4	37	576	7	0	1	TCAGGGCCACTTCTGCCCTGTATAGCCAAGCACCTA	a_SMZG]]U\WP_S\_S^X^BBBBBBBBBBBBBBBB	chr10.fa		4942591	R	36	48					
+HWUSI-EAS610	1	4	94	1595	265	0	1	AGCATCATGAATAAGGTGAATTATAAAAGAAAGCAT	aaaaaZa`_a_a_a]]TX`aa`a_aaa`S`^aZ]aa	chr10.fa		4942752	F	36	119					
+HWUSI-EAS610	1	4	12	489	1330	0	1	CACCAAATTAAATGCTTTCTTTTATAATTCACCTTA	a`abb\bbbbbaaaaaaaaabbabaa`aR_aa`aaa	chr10.fa		4942763	R	36	119					
+HWUSI-EAS610	1	4	69	576	773	0	1	ATGCTAACCATCTGGGAAAATGAGCACCAAATTAAA	U^baaV^]]a_^VXY]OJRTRab`_aaTGY`a^a_W	chr10.fa		4942787	R	36	117					
+HWUSI-EAS610	1	4	29	1480	1172	0	1	ATTGGTTGGACATTGAAATTGCAAAAGCTCATCCCT	aa^]aS_VXNU]_`S[[]``^\`[]W]QPN\]VOS[	chr10.fa		4942930	R	36	118					
+HWUSI-EAS610	1	4	9	317	1408	0	1	ATGTCCAACCAATGTCACACCTCCCCCAATGAGGTC	]aaOba`__aXa_XG\O\a^aYaaaaaZIPa\][\a	chr10.fa		4942953	F	36	117					
+HWUSI-EAS610	1	4	16	1035	1832	0	1	GTCACACCTCCCCCAATGAGGTCATAATCCTAATTC	aa`a\aa``a__`aaa`aa_a]__a``a_^aa_``_	chr10.fa		4942966	F	36	119					
+HWUSI-EAS610	1	4	3	1415	1721	0	1	GTGGGACTGTTTGGGAAGAATTAGGATTATGACCTC	a__bK`Oa`_aabb`Qab__aa`a`_aaa__]]^`Y	chr10.fa		4942983	R	4A31	103					
+HWUSI-EAS610	1	4	72	543	1417	0	1	ACTGTCATGGTGGAAAAGTTTCTGTGGTGGTTTTAA	a`_`Z[X_`XOa]^L^LTZU]U^^S^_Qa`BBBBBB	chr10.fa		4943069	R	33G2	89					
+HWUSI-EAS610	1	4	98	35	492	0	1	TCGGTTCTGTTTTTATATAAAAAAATAAGCTTACAG	`bba_ab_baaaabbba`Z_\^bba_aa^aaaaaaa	chr10.fa		4943329	F	36	119					
+HWUSI-EAS610	1	4	51	1169	890	0	1	TGAGACATTGATTTTGGAATTCTGATGCATAGATAA	aaa__a`aaa_`aaaaa__aa`a__``_`aa__a_a	chr10.fa		4943840	F	36	119					
+HWUSI-EAS610	1	4	71	1236	195	0	1	GAACAAGGGTAACAACAATAGGCATGCAGATAGGCA	aa`_`a`_aUaa_aa]`aaa`Z[]^^_`^ZVWU]^`	chr10.fa		4944833	R	36	119					
+HWUSI-EAS610	1	4	51	350	1124	0	1	GAAGATGTGGGAGTTGTGTTGTAGCCATATCAGCTA	aaYa[aa_bbaUa`aaYa_`aT^`__```_^^_]^Z	chr10.fa		4945017	F	36	119					
+HWUSI-EAS610	1	4	66	1265	1127	0	1	CTTTGCAGCAAATGGAGACCACTAGAGAAAGCCACA	aa]^b`Ya^]U_[Z]ZQY_aa_`ZUS^]U_\^\VZ`	chr10.fa		4945087	R	36	119					
+HWUSI-EAS610	1	4	3	861	556	0	1	TTGACCTGGTACTGGAAATTTAGCCAACTACCTGGG	X\ba__]_\V^a_^^^]`_^_^`Z^[_UaS]_bbaa	chr10.fa		4945262	R	36	119					
+HWUSI-EAS610	1	4	5	803	1101	0	1	AAATTTCCAGTACCAGGTCAAGTATCCCTTTCATTC	abaaaa``aa_b`__a`Z_`aa^a`_]__``^__a^	chr10.fa		4945277	F	36	119					
+HWUSI-EAS610	1	4	88	1131	91	0	1	GTTAAGGCACCATTGAATGAAAGGGATACTTGACCT	aabaaba_a[Y^ab]abaaba`aaa_a_U_`]_X__	chr10.fa		4945291	R	36	119					
+HWUSI-EAS610	1	4	90	762	1754	0	1	CCATGTAAACTTCCAAGGAAGACAGTCAACAGCCCT	aaaaaa`aa\abaa_Z__]]^^``\[aaa_a^```_	chr10.fa		4945434	R	36	119					
+HWUSI-EAS610	1	4	84	1318	358	0	1	AGCGAGGACAACTAGGGCAATACCAGCAGAATGTGG	`a_]\VT]V\]Z^YXQ]V_^^^WOXTYV\T^[UXUX	chr10.fa		4945594	F	36	118					
+HWUSI-EAS610	1	4	1	1045	547	0	1	CTTGGGTACTTTCTCTTGTTATTCCATTGGGGGCCC	abbb]a[bbabaaaabb_abbba]a[aab[^HH^a`	chr10.fa		4946085	F	36	27					
+HWUSI-EAS610	1	4	27	1257	1120	0	1	ACTCAAGAAGAAGGAAGATCACAAAAGTGTGGATAT	aT_baR\R_aRab_YU^baVa]aaRV^J^F^_``Y`	chr10.fa		4946379	R	36	23					
+HWUSI-EAS610	1	4	33	1026	654	0	1	GGCTATGGAGCATTCATAAAAAGGGACCTACCATGA	abababaaaa`abbaabaaaaa]``^_`a___aaaa	chr10.fa		4947054	R	36	55					
+HWUSI-EAS610	1	4	67	1448	1857	0	1	CCATACATGTATGGTATATACTCACCATACATTGGG	abbba`ab`abbbabbbbbbababaaabbababbba	chr10.fa		4947359	F	36	119					
+HWUSI-EAS610	1	4	87	566	1623	0	1	ATGCAATGCTACTCAGCTATTAAAGACGAGGACATC	]^``a]a`aaaaa__aaa`aaaaaa``_a`__`aXa	chr10.fa		4947447	R	36	119					
+HWUSI-EAS610	1	4	49	676	431	0	1	TGTATCCATTCTTCTGTTGTAGGACATCTAGGTTGT	ababbaaaaaabaaaa_ab_aaa``aaaaaaa^ab_	chr10.fa		4947505	F	36	15					
+HWUSI-EAS610	1	4	78	1141	1754	0	1	TGTGGTCTAGTTATCAGAGTAATTGTGGCTTCATAG	a`\ba][a^\[a]`^_a^a]]_a`aX_`[`_V^_Z^	chr10.fa		4948558	F	36	6					
+HWUSI-EAS610	1	4	88	914	123	0	1	GAATAAAATTGACTTATAACACAAAGCTATCAAAAA	Yaabaa_`bbbaababaabababbbaa^a_aab``a	chr10.fa		4949847	R	36	57					
+HWUSI-EAS610	1	4	58	1153	1448	0	1	TGCAGGGAAGGTGCAAAGATATCTGTTGTTTGGACC	a`aaaaa]_^]T___``a_aZa^aa[^`^_`a_XYW	chr10.fa		4958220	F	36	34					
+HWUSI-EAS610	1	4	15	1144	1675	0	1	GGCAGGGTGGATACCTCTCCTCTGGAGGGGAAGGCG	__Z__SKI[VL_Q`[^Y^H\ZT``]Xa[R`NPWBBB	chr10.fa		4958435	F	34T1	12					
+HWUSI-EAS610	1	4	24	696	1381	0	1	TTGGGTGGGTCCTGGATCCCTCAGTGACTAGTCTGC	aa`aaQa^^Vaa^]__\`a`]`]^\VY\]`^V[Q^Z	chr10.fa		4958572	R	36	119					
+HWUSI-EAS610	1	4	7	555	723	0	1	TGGACCTAGGCCTCCCCACTTTTATGTATCTGCTTG	aaaa_`aaa_a`_a``_`_aaba_abY_aU_a_``^	chr10.fa		4959664	R	36	119					
+HWUSI-EAS610	1	4	7	396	1878	0	1	AAAGGTAAACAGTATACCACTGTCAACACAAAATAC	aaZaa]b`_`a][a`]aaaa^a[`aa`^`Y^^`__a	chr10.fa		4960617	F	36	119					
+HWUSI-EAS610	1	4	2	1084	773	0	1	GTAAACAGTATACCACTGTCAACACAAAATACAGAA	a^^^^X\`W`__Q]^[_`_Z\`\aY_]]^^\]^__Y	chr10.fa		4960621	F	36	119					
+HWUSI-EAS610	1	4	69	100	1699	0	1	ATAAAAGACAGTGTGTCCTGGAGCCATATTTCTGTA	]_aaQH^ab``ZbYaXbaV]a^`aaa[S^Q]baaT^	chr10.fa		4960674	F	36	118					
+HWUSI-EAS610	1	4	5	1423	282	0	1	CATTGATGAAAATATCAGAGAAGCAAGTTCTGGCAA	`abbaYbb`_HV^]^a`_]_aaa\IZaQ_a]KV]WB	chr10.fa		4960820	F	36	113					
+HWUSI-EAS610	1	4	61	128	517	0	1	ATGACAGATTTCCTTATCTTGCCAGAACTTGCTTCT	\_]`a^_V]_]aa`]Q\]S^`a_]\Z_`Z^a][]][	chr10.fa		4960838	R	36	119					
+HWUSI-EAS610	1	4	57	658	192	0	1	AAGCAAGTTCTGGCAAGATAAGGAAATCTGTCATAC	aab_YabWab^b`_^ab``a`abJ_`a[]`X^_`a^	chr10.fa		4960840	F	36	118					
+HWUSI-EAS610	1	4	69	1528	389	0	1	GAGGTCACTAGCTTCCACCAACCCAAAGGCTGAGAA	^^Z]Saabb[T]`^`_bb`bb\]`Taba``a]_Uaa	chr10.fa		4960900	R	36	119					
+HWUSI-EAS610	1	4	31	1071	190	0	1	GGTTGGTGGAAGCTAGTGACCTCCAAGTTGATAACG	a_[a``]]_`aa_a_]Z]a[aa^^`_a^`[^_\\Y^	chr10.fa		4960913	F	36	119					
+HWUSI-EAS610	1	4	29	493	228	0	1	GAAAGCATCGTTATCAACTTGGAGGTCACTAGCTTC	G^babbbababbabbbababb`a_\`a^_abbbabb	chr10.fa		4960921	R	A35	107					
+HWUSI-EAS610	1	4	18	1670	1847	0	1	ATAAAATACCAAAAAGAACAAAATGGAAAGAAAGCC	aba]]ba\a`SY^_a_T\GV]a\_a\F_`_`X^]UT	chr10.fa		4961374	F	36	116					
+HWUSI-EAS610	1	4	63	1432	970	0	1	TGACAGACTGCCTGCTTGAAGCTCTCAGTCTTTACA	aaa_a_`a`aa`____`\`___^]a_``_____^W]	chr10.fa		4961915	F	36	119					
+HWUSI-EAS610	1	4	42	1224	698	0	1	AGACTGCCTGCTTGAAGCTCTCAGTCTTTACAGCAG	abaaa]aa`a_a`_`a`]a_aaa`__aaa`____``	chr10.fa		4961919	F	36	119					
+HWUSI-EAS610	1	4	53	1748	258	0	1	TCCTGACCACAGAGCACTCTCCATCCCNAGCTCCCT	a```\`^aa\_RXZ\`Y]```]^\\^SDWRRZZZZ\	chr10.fa		4961977	F	27A8	110					
+HWUSI-EAS610	1	4	27	1704	640	0	1	TGAAAGCCTATTTTTGGCATCCCCTACCCAGTCATT	aabab_]aaa`__aa^^__a^]`__`]__`_Z__``	chr10.fa		4962061	F	36	119					
+HWUSI-EAS610	1	4	13	1690	786	0	1	TGTAACAGAATGTTCCCCCAACCTCCCTCAGCTTGT	]X_baa`UZaa[\a\^_U\`aa_[[_Y[_`_Q`]X_	chr10.fa		4962096	F	36	119					
+HWUSI-EAS610	1	4	4	1534	748	0	1	TAGCCTACAAAGCCTCAGCCACAATGTAGGCCAGGC	aa]babaa^aa_\a`aaa`aa]_aa]XaY]^_`]]Y	chr10.fa		4962316	R	36	119					
+HWUSI-EAS610	1	4	5	1111	183	0	1	GCAATAAGCAGAAAGGAACAGGAAGACAGCAAAGGA	a__ZRTRN_XY_XY___WWR]^O]VWU^ZTOOQRXV	chr10.fa		4962391	R	36	118					
+HWUSI-EAS610	1	4	21	440	1007	0	1	TGCAAGCCCAGGTAAAAGAGAAAGCAAAACATATTC	\b`b^W]aa`^\EUXa`a\bbb^``\`]aab`^`a`	chr10.fa		4963502	F	36	117					
+HWUSI-EAS610	1	4	64	401	1527	0	1	TAAGGAGAAAAGCTTTCTTTAGCTTGTAGTTTCAGG	aT`aaaaaaa`aaa_`aaaa__aaaa_`a]_aa`a`	chr10.fa		4963608	R	36	119					
+HWUSI-EAS610	1	4	31	894	906	0	1	CAAAACCAACCAATCAAACATACCAAAGAGAAGCTT	a]ba^]^`a]QaVaaaYaa`aaZ``WZ`_`ZYaY`[	chr10.fa		4964086	R	36	119					
+HWUSI-EAS610	1	4	41	1083	621	0	1	TATGTTTGATTGGTTGGTTTTGGTCACTTTTGCCTA	aabb_ba`]aa_aX\``]`aa`a_a`_``a_`^_aa	chr10.fa		4964100	F	36	119					
+HWUSI-EAS610	1	4	82	1564	1235	0	1	GAGCATGCTCACTCATGAAGTAGAACAGGGAGCCCA	a`a`aa]a`aa_``_aa]aaUa``a`__`___Z\_\	chr10.fa		4964170	R	36	119					
+HWUSI-EAS610	1	4	39	686	1787	0	1	GCAGAATTTCCTGTCATCTGCTTTCTCAAAGGACAG	aaaaaabaaaabb`aba`aaa_bba`aaaaa^a_`a	chr10.fa		4964280	F	36	119					
+HWUSI-EAS610	1	4	16	764	1029	0	1	ATGAAAGCACTTGAACTTCATGTGACTGTCTGGCAC	abb`aaa_aaaaa_aaaaaa`a^`a_a`___aa___	chr10.fa		4964607	F	36	119					
+HWUSI-EAS610	1	4	81	670	1090	0	1	GACCTTTCATGAACACTTCCCCAATTAACTCACATG	_^_`_aa___a\___^^_``^]W]^___^_^_X^_^	chr10.fa		4964698	R	36	119					
+HWUSI-EAS610	1	4	14	1757	1283	0	1	CCAAATGAGAGCTATGACACACACCCAAGTGACTGT	a[Zab_^`_a_`a^_^QVa]]aa_^aYSYVFOX[`B	chr10.fa		4964791	F	36	113					
+HWUSI-EAS610	1	4	13	299	500	0	1	TGGTTATCATGTGCAGGTAGATAGTTAGGTGTCTGG	abbaaababb_]baaa_Qa`aa`b_^_aa[a]a`aa	chr10.fa		4965200	R	36	119					
+HWUSI-EAS610	1	4	94	905	704	0	1	GTGGATCATTGTTAATTAAAAAATCTAGGTTTACTT	\Z[`[_``]`\]bTOSV_[OLXESOPXTMTUW`BBB	chr10.fa		4965569	F	22C13	95					
+HWUSI-EAS610	1	4	51	1099	1716	0	1	TACATACTGTNATTTTTCTGAAATCAGAATTGCCTT	aa_\^``aaXDYaaaaaaba^a\a`ba`_a^a`\`a	chr10.fa		4965755	R	10A25	110					
+HWUSI-EAS610	1	4	6	73	999	0	1	AAGCAGTTAATTTTACTGAACATTTAACCTTAGAAT	^]bbab_`QY^aabaaaa]a_Y_aaabaaa`a`__`	chr10.fa		4966422	F	36	119					
+HWUSI-EAS610	1	4	24	1634	2028	0	1	GTAGATGGGTGTACTACAGGCAGGGAGAAAGTAAGT	a`_aX_Xa_V]N[T[]PZ\[]SV\[UUWWWTBBBBB	chr10.fa		4966485	F	36	97					
+HWUSI-EAS610	1	4	66	1262	2018	0	1	CAAGGCAAGGCTTTCAAGTCTTAAGCTTTCTCATGA	]bbbbaab]a_aa^^a`b`a]aa`a\baaZaaaaa`	chr10.fa		4966613	F	36	119					
+HWUSI-EAS610	1	4	80	1372	1411	0	1	CACCAACCCACAGACAATCCTCTTTACTGTGGCCTT	aab`aa[a_a`a`__b`ba_bZa`aa`aaU`Z__a`	chr10.fa		4966767	F	36	119					
+HWUSI-EAS610	1	4	32	616	468	0	1	CGAATGGATGGAGAAACCTTGCTTGATTGGGGAGTA	ab^`bbaabaa`aaaaaaaaaaab`_aabaaa_a_a	chr10.fa		4966935	R	36	119					
+HWUSI-EAS610	1	4	65	777	1163	0	1	TATCTGCAGGCTCCCACAAATACATCAACCCACATA	aa``aWTV^[[_`^_^___^X^[Y]]^_]]]_]][_	chr10.fa		4967400	F	36	119					
+HWUSI-EAS610	1	4	19	528	253	0	1	AGCTATTTCTTGGTAGCCTTTCTGGGTTTTCAACAA	ab]`bbb`aab_b[aaaaa^aaabbb][[_aaa`aa	chr10.fa		4968034	F	36	119					
+HWUSI-EAS610	1	4	70	1406	632	0	1	AATCCCTTCCAACCCCCAACACAGGGTAGGCAAGTT	aaaa`^^`]XU_`_aa``^X\`^^MSVVVQVQ\]W\	chr10.fa		4968252	F	36	118					
+HWUSI-EAS610	1	4	4	1290	1990	0	1	ACTCAATGCCCCTAATCATCAGGAAGTGTTCTAACG	aZ]R`a`\YNV_aaa[`a_`_a`[`_S\[WZ_[`__	chr10.fa		4968313	R	36	38					
+HWUSI-EAS610	1	4	1	982	1602	0	1	TTACCTTTAAGTAAGAAGTCAGTGAAAACTCACTGT	a[`]`_a_X\_]_aa_`_[_`_V`_aY_[\^`Y___	chr10.fa		4968765	F	36	119					
+HWUSI-EAS610	1	4	13	998	1562	0	1	AATACATTCCCCTGTGAGGTATTTGCCCTGGCTCTC	aaa_[aa_a_a\_aZa`]`R\`[\\ZWT\_Y\\X\_	chr10.fa		4968822	F	36	119					
+HWUSI-EAS610	1	4	74	1241	955	0	1	GATAGCCCTGTTTCCCTCCTCTTTCTCTGGGCCATC	aZa]]MQ^a^F[a\S\a`\aaaa`\``a^Y_^U]_`	chr10.fa		4968882	F	36	117					
+HWUSI-EAS610	1	4	56	283	14	0	1	GCCATCACTAGATCTCCCTTCTCCACAGTGTGGAAT	a`^Uaaaaa_``_]^``a[_`_`__YTXYa\__\U\	chr10.fa		4968912	F	36	119					
+HWUSI-EAS610	1	4	69	292	1310	0	1	GCATAGGAACTGACAAACCTATATTACTGTAGGAAT	_YFYa\aaa`aa`a`V]`a`aa]``__`a]`]___`	chr10.fa		4968999	R	36	118					
+HWUSI-EAS610	1	4	87	419	1302	0	1	GGGTGGGTAGGGGGGTGAAAGGATAGCTATGGGGGA	[aaZaaaX^a`aa_aMT_\W`WPSY]GWXV]```\B	chr10.fa		4969491	R	36	113					
+HWUSI-EAS610	1	4	88	1469	805	0	1	CACTGGACATGTAAACCTTATATGTCCCTGTACTGG	Ubb]abbTY_a_ba_aaabaaa`YYR]a`_]aa_[a	chr10.fa		4969554	R	28A4A2	37					
+HWUSI-EAS610	1	4	3	668	999	0	1	GGGTCACAAGTCTCATCCGGTCCATGCCATCCCCGG	`aa[`a\a``[^````a``a[`^^]^^^^`^^\WZ[	chr10.fa		4975508	R	36	119					
+HWUSI-EAS610	1	4	45	1581	1428	0	1	AACCCGGTCTGATCAGGGTCACAAGTCTCATCCGGT	X`bbbb]`J[\O]`ba``aaaaa`]PSaaaa_`BBB	chr10.fa		4975523	R	36	26					
+HWUSI-EAS610	1	4	6	194	745	0	1	AACCCGGTCTGATCAGGGTCACAAGTCTCATCCGGT	a`_a`^_W`]a^\_]`a`M`\_`]\W^^]`\_^\^U	chr10.fa		4975523	R	36	37					
+HWUSI-EAS610	1	4	70	752	868	0	1	GGGACCTGAGACTGCATTAACTAGGGAAGAAGAAAA	_baabaaabbaaba`abbab_bbabbaabaab`Uba	chr10.fa		4975557	R	36	14					
+HWUSI-EAS610	1	4	93	556	94	0	1	AGAGTTTTCCCTCAGTGTACTAGGTATTAGAACTGA	aXXTH[aaaZIW`a`R\S]^RQYIV_]aSHXXOX`_	chr10.fa		4976601	F	23A5A6	90					
+HWUSI-EAS610	1	4	100	958	1265	0	1	TACATTGCTCACCACTGACAGCTGTCCTGAGAACAG	aba`aaa`aaaa_aaaaa`aa___]`__a`___``_	chr10.fa		4976761	F	36	119					
+HWUSI-EAS610	1	4	74	480	212	0	1	GGGCTGTTCTCAGGACAGCTGTCAGTGGTGAGCAAT	``ababaaa]_b_abaaaaaaaaa]PaaWa^a]_^^	chr10.fa		4976764	R	36	119					
+HWUSI-EAS610	1	4	18	989	125	0	1	AAAAAATGTATCAGGGCAAATAGTTCAGACTAAGGT	aa__a`^`[^^__^_a^a\`^^aZ_\^`^]^_U`]W	chr10.fa		4976943	F	36	119					
+HWUSI-EAS610	1	4	27	1546	1638	0	1	GTTGACACCCATGTGGCAAAGGAAAAGGAAAGAGGA	a_a^`Z`^^^UV^R^^VZ]]`]W]_W[WY[T[WXTX	chr10.fa		4977118	R	36	118					
+HWUSI-EAS610	1	4	92	1481	725	0	1	ACAACTCATGGATTGCTGTTCTAGGTAAAAGCCTGT	a`aa__a\`_R[_][_a\_aX`]Z]X`_^^TS^^]Y	chr10.fa		4978049	F	36	119					
+HWUSI-EAS610	1	4	13	534	1426	0	1	TTACCTCTCAGCCATGTCCTCTAGCTGATCAGGAGG	a`bbabbaabb`^aZa_`a``_U]aU``ZaT_]N_[	chr10.fa		4978318	R	36	119					
+HWUSI-EAS610	1	4	2	162	952	0	1	ATGCGACATTCTCTTACCTCTCAGCCATGTCCTCTA	`O__bab`_a]a`]ab`baab`aaa___`_a__`[X	chr10.fa		4978331	R	36	119					
+HWUSI-EAS610	1	4	36	879	1937	0	1	GCCTGCAGATCACAGAAACGAGCTCCTCATCATAGG	aaaaa_aaaaa`a]aaa]`aaa]`_^a__`\\^Z[W	chr10.fa		4978581	F	36	119					
+HWUSI-EAS610	1	4	80	324	1015	0	1	TTGGTCCTGTTTCCTCTCAGATCCTTGAGCTAAGAA	aabaUI]aa[aa___aYZWNLS_``aa_\_W]`aX_	chr10.fa		4978731	F	36	118					
+HWUSI-EAS610	1	4	81	1284	1067	0	1	TTGGTCCTGTTTCCTCTCAGATCCTTGAGCTAAGAA	S_\_J^`_QY]\\b`^`^V[^aabbb^]aa\TOT`a	chr10.fa		4978731	F	36	118					
+HWUSI-EAS610	1	4	40	1618	1501	0	1	TACCGCGGTCAGGGGAAACAATTCTTTTCTTAGCTC	a`bb`a^`VZ`aba^`ababaa_aaaa```aaaaa`	chr10.fa		4978757	R	36	119					
+HWUSI-EAS610	1	4	28	1064	1735	0	1	AGTTTCTCGAACTGAAGTACCGTCTGCTGTCCCTGC	abaabaa``\aaT``ba`bSaa]aabX`aaX_a_aX	chr10.fa		4978929	F	36	119					
+HWUSI-EAS610	1	4	8	470	1102	0	1	GACTTCAGCTTTGACTCAGCGAGGACCAGCAGGGAC	`Z`X]Q_GXXXaaZP_`bX_aR_\]GNP\OY[GR]S	chr10.fa		4978957	R	36	115					
+HWUSI-EAS610	1	4	80	1652	1704	0	1	AAGCTGAAGTCCTGGATCATCAAGTATGGGAGGCGA	aY[Z^`\\YT\__aRWWR__\Z\`WW`[Y]TT\\_W	chr10.fa		4978982	F	36	118					
+HWUSI-EAS610	1	4	16	895	1516	0	1	TCCACACCTCAGATCCAAGCCGCTTCACAAAGCGGT	`X^^SWU^YNU`NKY[^^aa^^U\YYZRLHPYSYTB	chr10.fa		4979103	R	36	112					
+HWUSI-EAS610	1	4	16	729	423	0	1	GTCACAGTAATGTACAGATTAGGGGCTTGAAATTCA	a\W`YUaU[_`]GaV_\VYaTa_G_V`H][\O_Q`_	chr10.fa		4979807	F	23T12	105					
+HWUSI-EAS610	1	4	86	1688	1691	0	1	CACAGTTTTAATATGAATTTCAAGCACCTAATCTGT	\YW]^^^`]^_]aa`a_a[``Z_[N_Z\\W\\Y`_Z	chr10.fa		4979820	R	36	119					
+HWUSI-EAS610	1	4	96	304	733	0	1	AGAGCAGTTTGAATTAGCATTTCAATGAACTCTTTA	ab`bbaaaaab``b_aba`b`ab`^aaaa`aaaaa`	chr10.fa		4980372	R	36	119					
+HWUSI-EAS610	1	4	53	1342	129	0	1	TCTTAAAAGTAGCTTTAAGCCCCTTTTTGGTGAATA	Z[`bbaZa_N`X_^`YabaYYaYUWPYSPXZ``^ab	chr10.fa		4980502	F	36	118					
+HWUSI-EAS610	1	4	60	364	416	0	1	AACAGTAAATGGTGTGAAGATTCACCCAGAAGCATA	Z_a`\SL\T[U]`[a__Z\`]__V```_^T\`ZUW`	chr10.fa		4980827	F	36	118					
+HWUSI-EAS610	1	4	56	330	757	0	1	TGTGAACTGAGCGGAGGTAACCAGCCACATGGATTG	aa`baaab`_aaaa_aa[`a`]U_`_`\WZ`^[^__	chr10.fa		4980878	F	34G1	83					
+HWUSI-EAS610	1	4	68	1434	430	0	1	ATTGACACAGGATAGAATTAAAAGAGATTTGCCCCA	a`bb`a`]RZZ[`a^aaaaaa[\__Y[^__YZ]^]a	chr10.fa		4980910	F	2G33	80					
+HWUSI-EAS610	1	4	38	1584	1664	0	1	CATAGCCGAAATTCTCCAACCCTTAAAATGTGCACT	_aba`a`a^V_`a\T``b_V_a_``UZ^]US]^__Y	chr10.fa		4981870	R	36	119					
+HWUSI-EAS610	1	4	56	549	1887	0	1	GAAATGTAAAGTCCTCATCAGCTCATAGATCAGCTA	_U_aaa[^`aa_aaaaa`_`a```^`Z`___^[^ZV	chr10.fa		4981911	R	36	119					
+HWUSI-EAS610	1	4	53	1266	1378	0	1	AGAAATGTAAAGTCCTCATCAGCTCATAGATCAGCT	Xb^YbbbaY]^_^Y\]`ababbaa\V^b]abaZV]b	chr10.fa		4981912	R	36	119					
+HWUSI-EAS610	1	4	75	1633	1516	0	1	AAAGCAGTTAGACCATCACTGATAGTCACTGAAACT	aa]_aa^_aa[``ab`]```__`a`X[_``[^\^`^	chr10.fa		4981977	F	36	119					
+HWUSI-EAS610	1	4	52	1424	1158	0	1	TGTGGCTAAAACTGGGGTATGGAATCAAATGGACTA	aa_aaaa``aaW^Y^aa]_`^^Z^Z^_``_`_]Xa_	chr10.fa		4982611	R	36	119					
+HWUSI-EAS610	1	4	33	240	1569	0	1	AAAATGTGCATTTCCCTGAGAGACATGTCTGACACA	`WT]`]_Waaa^`aaa]___\a__a`aVa^Z`_T_`	chr10.fa		4982684	F	36	119					
+HWUSI-EAS610	1	4	55	1196	676	0	1	AGCCCCTGAACAGCGAAGTTGTCTGCGACAGCCACG	_a_^aaaUa`^\PGPWYaX_TQVXXG^QYPKQ[QPT	chr10.fa		4982751	R	13T11G10	94					
+HWUSI-EAS610	1	4	95	1143	706	0	1	TGATAATGAATTCTTTGGTTTTATTCTTATCTTGCC	ab\a`_aa_`aa`aabbb`aaa`a`_aa_a_a_`__	chr10.fa		4982878	F	36	119					
+HWUSI-EAS610	1	4	65	9	1818	0	1	TCCATTTTTAAACCAAAATGGCTTGCTTGTTTGATT	O`a^Yaa`]]aaaabZa\^bbbbbbbb_bY^`aSW]	chr10.fa		4983156	F	36	119					
+HWUSI-EAS610	1	4	79	970	1760	0	1	TGTTTAATATTTACAGCACATTTGTAAATTATTCTC	a`_baaaaY^_aa`YU]a]`a`aaR`X__Zaa_UaQ	chr10.fa		4983403	R	36	119					
+HWUSI-EAS610	1	4	4	353	40	0	1	TTTTGCCTCTATATGAAACATCAGTTAGCATGTGCT	aa]a^\`a\^a[aaaaaY^a`aaa_aa\Wb^][`[U	chr10.fa		4984008	F	36	119					
+HWUSI-EAS610	1	4	83	195	2022	0	1	CCATTACAGCTAGCAATTAATGTGTCTCCAAAATCT	^J_ab]b`_b`a``Y\X\_]a_]a_b^aa[US\W^Y	chr10.fa		4984177	R	1A34	104					
+HWUSI-EAS610	1	4	48	1214	880	0	1	TGGATAAAATACCCATAAGCTTATAAGGCAGATTAA	^`SS]PYX\_T[_H_S[^_[bbba_XV^Y^W\[_b^	chr10.fa		4984859	F	36	118					
+HWUSI-EAS610	1	4	45	494	62	0	1	TACAAGCTGTAAGCAAACATATCTTCCAAAGTTTAT	ababaaaaaaba_Y_aa^a_`[Y`a`_aa^aXaaa_	chr10.fa		4985492	R	36	119					
+HWUSI-EAS610	1	4	18	543	900	0	1	ATCTACAAGCTGTAAGCAAACATATCTTCCAAAGTT	abaaaaba`_`a``aaaa`^__`_`_``a```_a]a	chr10.fa		4985495	R	36	119					
+HWUSI-EAS610	1	4	80	1508	1627	0	1	GAGGTGATCTCCAACTGGGATCGCTATGGTGATACC	ab]bQa`\aa`aaa_aa]Q^a[`^_`_ZXP`[__\_	chr10.fa		4985763	F	36	119					
+HWUSI-EAS610	1	4	37	523	1016	0	1	ATGTTCTGATTGGCTTAGCATTTTCTCTGCATCTTC	Zabbbbba`abbbbb``ba`abbbbbbbbbbbbbbb	chr10.fa		4985823	R	36	119					
+HWUSI-EAS610	1	4	80	1619	1708	0	1	ACCGGATTCATGAATGAGAGATTCTGTCAGATAGTT	a_aJ[ZW]_ZWTVWSW\^W[W^]^ZYYWWXSWNNXV	chr10.fa		4985901	F	T35	80					
+HWUSI-EAS610	1	4	53	290	1253	0	1	GATAGCACTGTCTGCTGCCCGTGAGATTTAGCTACC	XZR_ZZ`\\[OXZT_b`_]`b_[X]\ZXTOZ[JU\\	chr10.fa		4986110	R	36	118					
+HWUSI-EAS610	1	4	12	1186	782	0	1	GCTATCTGCACATTGAGGTCTGCATAGATGGGCCTG	a`\^]W[ZS_\_\^\_WVU\\[\_UWUWXUSWUWWV	chr10.fa		4986140	F	36	118					
+HWUSI-EAS610	1	4	14	955	922	0	1	ACCTAGACAGGCCCATCTATGCAGACCTCAATGTGC	a_\_]WX_]Z`WU]``[a`aa_``WQW^QU_``S_X	chr10.fa		4986147	R	36	118					
+HWUSI-EAS610	1	4	51	1382	129	0	1	GCGCATGCACACACACACACACACACACGGGGGGGG	``a[`YX\\U^[^\^RaVXUa^[ZRDVWRF`^\ZR\	chr10.fa		4986233	F	36	7					
+HWUSI-EAS610	1	4	52	148	733	0	1	AAAAGCCTCTGCCATTTGCATAATTGACTGCTCCTT	\U[]`aa_`^a\^___`_^W\PP^__]`]_^]__]Z	chr10.fa		4986541	F	36	119					
+HWUSI-EAS610	1	4	5	1739	60	0	1	TTATTGCTAATTATTCATTCTTGTCTGTTTATTGTG	aa^`RVY`]][F[N]Y[ZPX]VRL[XJSXP^BBBBB	chr10.fa		4987725	F	32G3	92					
+HWUSI-EAS610	1	4	87	929	1484	0	1	ATCTTCCAGCGAAGGCTGTGGGCTTCTAGAGTCACA	aaa\\I^aa_b`a`[_]b_XH_X__UV_`_`MXWRZ	chr10.fa		4987979	F	36	117					
+HWUSI-EAS610	1	4	98	219	952	0	1	GGTTTGCTGCATGAATTTGGCCTTGGCATTTTCTTA	ZYUL[aa``aaa^X^T[WaZaa]aa[a\[\_Z^VZ`	chr10.fa		4988524	F	36	118					
+HWUSI-EAS610	1	4	29	397	2031	0	1	AGCTGTTCTTTGAGCTTGGACATGGTTGTAAGCATT	`bb[aW_aaaa`bTbaa\__b_a`_^a`Zaa_aa_^	chr10.fa		4989822	R	36	119					
+HWUSI-EAS610	1	4	18	1163	542	0	1	GGAAACAGGCAGAAAGATGGACAGAAGAGTGAGTCT	a^^]Y]]TX[Z_^U_aZ[a`W^_`]__^\VZZUTZ^	chr10.fa		4991356	R	36	119					
+HWUSI-EAS610	1	4	27	1362	200	0	1	TCAAGAAGAGAGCATGACTTAAGTAAGACATGGGTA	aaa_a___`a^]Y_`_^[aa__^U`[W]Z^]ST^Z_	chr10.fa		4991417	R	36	119					
+HWUSI-EAS610	1	4	25	591	489	0	1	GGGCTGGGCAGTTTAGACGGAGTTGACATCCTCTGA	aaaaaa`aabaaaaaab_a``a]a`\\`\^]^]__^	chr10.fa		4991944	F	36	119					
+HWUSI-EAS610	1	4	24	1651	1058	0	1	TCAGAGCTGTACTTAATTCTAAAGAACTTTTTTCTA	a]`aU_^Y_G]Q[__`WL]`Y`[LZ]Y]]\\WPYPZ	chr10.fa		4992465	R	36	117					
+HWUSI-EAS610	1	4	39	1579	1487	0	1	CAAACCAAAGTGTATGTCTTTTCCAGAGAAGACACC	``^a]_``^`XaV_\baa]_ab^]W_``]`[Z^\aa	chr10.fa		4992859	F	36	119					
+HWUSI-EAS610	1	4	97	148	392	0	1	GGTTCAAGTCCCCATTCCTTCCACTGAGCACAGAGC	a`U]a_a^`X]`]T_``YSYV]^`S^Y`S_`\Z\^V	chr10.fa		4992897	R	36	119					
+HWUSI-EAS610	1	4	27	593	778	0	1	GGGGACTTGAACCATTTCCAGGGTACAGTCAGCTTG	abab_aabb_b`]]^aaa`aaabZa`aa__aa__aa	chr10.fa		4992920	F	36	119					
+HWUSI-EAS610	1	4	59	951	1901	0	1	GAGCCTGGTTCTTACTAGCTGAGCTTGATCCAAGTA	aaaa^aaaaa^aba_aaa`aa`a_`^`_^^^`a]V_	chr10.fa		4992958	R	36	119					
+HWUSI-EAS610	1	4	80	638	1399	0	1	TGTGTTTTGAGCACCTGCCTTTGCGTCTTTGAACTG	aa[bU]^aa```a^`_\`_]___``^_]__]\Y]X_	chr10.fa		4993153	F	36	119					
+HWUSI-EAS610	1	4	19	556	359	0	1	TTTTAAATATTTGCATCTAAGTGACCAAAATGGCAT	aabaa__aa`a_aa_`aa_aa^aaa`_a_____a`^	chr10.fa		4993488	F	36	119					
+HWUSI-EAS610	1	4	21	1766	1880	0	1	TGGTGTATATTCAAGACAGAAATGATCTTCTGTCTC	`b`_]WYWT_aYR]__GTYLU_X]X[]V\PZZMKXT	chr10.fa		4993579	F	36	117					
+HWUSI-EAS610	1	4	5	456	421	0	1	GGTCTAGTCCACTTGGAGACAGAAGATCATTTCTGT	a_JSZYLXV[^_a]`USZVX_\LVTX]Z__]_^`_X	chr10.fa		4993594	R	36	118					
+HWUSI-EAS610	1	4	29	100	11	0	1	CAGTCATGGCAGCATACAGGGTGGACATGGTCTAGT	Zab`baabbbba`V_b\_]b_H_bb_HTaba]_Tba	chr10.fa		4993622	R	36	117					
+HWUSI-EAS610	1	4	10	34	1531	0	1	CTGGTAAGATGCACGGTGGAGAGGCAGAAGGAAGAA	aba[]\RW_\Z[ZIP]_a^_aTaZ\^R`a\WXU]PS	chr10.fa		4993655	F	13A22	105					
+HWUSI-EAS610	1	4	49	1511	1455	0	1	AGGGGACACAGTTAGGGTAGACAGGCTTCTTCCTTC	abbaaa`a\`aZ`a`a^___a_`Y__^`\\_^ZY^[	chr10.fa		4993681	R	36	119					
+HWUSI-EAS610	1	4	95	1158	964	0	1	TGTCCCCTTTGGAAGGGTGTACAAGAGCATGCAGTT	ab_a^a\aaaa`[UaaaTa^a_a_`____`_`\^\\	chr10.fa		4993709	F	36	119					
+HWUSI-EAS610	1	4	24	1573	608	0	1	CAAGCTACCCACCTTCCCACTGAGATCTAGTCAAAG	a[V]_TbZba_T\[VJ\aba`QRS]NGVZZ]\`]YB	chr10.fa		4993771	R	36	113					
+HWUSI-EAS610	1	4	30	1468	273	0	1	TGCATACAAGTGATGGAAAATCTGTGGCACATGATT	_ab^b^\Z_\Y_\QXMW``bab_]]_`aaaa_\TY\	chr10.fa		4993831	F	31G4	83					
+HWUSI-EAS610	1	4	95	1334	1157	0	1	CACACCTCCTTTAGTGAATCCTGTGCCACAGATTTT	]bbbb_baabbbaa_b^Zab__aaa`]```a_aaa`	chr10.fa		4993847	R	36	119					
+HWUSI-EAS610	1	4	74	217	603	0	1	GTAGGCTTTTGATGAACAGCCAGGGAAATCAGAAGT	\LT_babaaab^`_^^a_`a`Z_a`_^a^_[`V^`B	chr10.fa		4994153	R	36	114					
+HWUSI-EAS610	1	4	58	714	163	0	1	GCAGAGAGAGAAGGACTGTTATTAGCACCAGCATTT	a^]`RP__a`TU[Z^]^a_a__[^YR^\QU\_^WW\	chr10.fa		4994196	R	36	118					
+HWUSI-EAS610	1	4	80	1346	1936	0	1	AGGGAAGATGGAAGGGAGGGAGGAGGGGAGAGAGGG	_aaa__aXaa_``a_a^aaa[aaFa`[^^aS`RZ_`	chr10.fa		4994237	R	36	117					
+HWUSI-EAS610	1	4	35	1255	9	0	1	CATAACATTTCTGATGTATTATTAAAAGTCATCCAG	abbaa[bbbb`aaZ_b_`b`aaaaa^`a]```[_`a	chr10.fa		4995328	F	36	119					
+HWUSI-EAS610	1	4	57	1556	1795	0	1	GGGGGACCCCGAGGAACTCCTTCGGAGACACACGGT	a_a``^Z^^Za`a\\^Z_Z\a^Z^\T\ZTZSPZ\]B	chr10.fa		4995643	F	36	114					
+HWUSI-EAS610	1	4	5	1249	281	0	1	TGCCTTTCTGGCTCCCCCAACTTTCCTACTTTAGGT	abbbaaaaWY]`baaba`ba`abaaUaS_`aZP[XS	chr10.fa		4995753	R	36	119					
+HWUSI-EAS610	1	4	24	433	931	0	1	CTGTTTCTAGGGTCTGATGCCCTTAAAGTTCATGCC	ab`_ab]aaabaN^bbb`bbaaaaba[b_aa_`bba	chr10.fa		4995785	R	36	119					
+HWUSI-EAS610	1	4	96	1243	1755	0	1	AGCTAAATAATGGACTTACAGTCTGAGAGCCAAATC	ababaaaaba`aa__aab`ba^_ab`a`a__a`a`_	chr10.fa		4995907	R	31T2AT	9					
+HWUSI-EAS610	1	4	35	1699	254	0	1	AGCTATTGACAGGAATCTTTAGCTGTGTAAATCTTT	a[^Zaaaa_[aUZ_a]\`aa`VYa`W\^a`]]Q^_X	chr10.fa		4995946	R	36	119					
+HWUSI-EAS610	1	4	75	567	1659	0	1	ACACACAGTCAGGTAAGATGGAGAGGCCATCTTCAT	a`^X]aaaWaWVX\aaZPV`___]_Z`_`_`[WVSY	chr10.fa		4996056	F	36	119					
+HWUSI-EAS610	1	4	57	607	1307	0	1	TTAGGTGAAGTCACGAGAGTAGGACCTTCATAAAAT	abaa__a_`a]aa^b]a]a_```^Z\_`^``_^_`a	chr10.fa		4996613	R	36	119					
+HWUSI-EAS610	1	4	22	421	470	0	1	AGCTAAATGTCAGAACCATAAACCTAAGCGTGGCTG	aabbbaabbbabbbbbbab`baaaabaaabXbaaaa	chr10.fa		4996681	R	36	119					
+HWUSI-EAS610	1	4	40	1357	1756	0	1	TGTGTCACGTCATGATAGTCATTATTCATCATCCTG	ab`b_`aY[PTabbU`abS]Yabaa_\a``_aX^aa	chr10.fa		4996774	R	36	119					
+HWUSI-EAS610	1	4	33	897	425	0	1	CATGTGTCACGTCATGATAGTCATTATTCATCATCC	ab``Nbaabaa\]bab_`\`HV`Z`aaa^]aabbXQ	chr10.fa		4996776	R	36	118					
+HWUSI-EAS610	1	4	86	1176	41	0	1	GGCAACCGCAAGGTACTAGGCTCACTGAGACATCTT	a[G`XWFMU_TUPX^\TRSGXUVYSNR\BBBBBBBB	chr10.fa		4997060	F	4G1T29	42					
+HWUSI-EAS610	1	4	57	927	598	0	1	CAGGCTTTTAGGAAAGCATTGAGGACCCTCTGGTCC	__`a```b`^^a][`Z[^a_]][_Y\XV^NZZTZYQ	chr10.fa		4997167	R	36	118					
+HWUSI-EAS610	1	4	40	248	393	0	1	ACACTCACCTTCCACTGTTTGTGTAGCTTTCGAACA	`a`bbbbaabbbabaaa``aa_a_a]baaaa_]_ba	chr10.fa		4997257	R	36	119					
+HWUSI-EAS610	1	4	57	521	1576	0	1	GAAAGCTACACAAACAGTGGAAGGTGAGTGTGGAAT	`^_]aaaa^_aa__`^aV_a^[a_U\RZY`Y]`_\^	chr10.fa		4997262	F	36	119					
+HWUSI-EAS610	1	4	95	540	1912	0	1	GAAAGCTACACAAACAGTGGAAGGTGAGTGTGGAAT	aJ`b`b]b`^b_b_aab\`a_abaU]IaZ`\b_a`_	chr10.fa		4997262	F	36	118					
+HWUSI-EAS610	1	4	59	540	685	0	1	CAAGTTTAGAACATGTTGGCATCTCAACAGAGCACA	aaababbbaba``ba`a`aaabaa`a``aaaa_aaa	chr10.fa		4997367	F	36	119					
+HWUSI-EAS610	1	4	59	1451	633	0	1	TGTGAGAAGAGACTACAGCTCATAGAGGAATTGTGT	Taaabba[aba``a_WbaJaQWa\\YTN]WW_]JTa	chr10.fa		4997825	F	36	118					
+HWUSI-EAS610	1	4	69	1515	381	0	1	AATTGTGTGGGAAACTCCCCGTCCAGGACCCAGTAA	aabYKKGVM[QV`_^``Z[VXMZ[\SWZSPSYPWXR	chr10.fa		4997853	F	36	116					
+HWUSI-EAS610	1	4	52	653	828	0	1	AGTGTAACTGACTACTTTGGTTGGTTGGTTGATTAG	`a_aZa`]aaa^a`[aaaaaSbbaWaba_aaXa^S^	chr10.fa		4998775	F	36	119					
+HWUSI-EAS610	1	4	70	1268	616	0	1	AGACTTAAAAATCACCACAGGAAACGAGAATGCTAT	]aa^^Xaa``aaa^]\]]^KYXY_`bXQ[`aaZa``	chr10.fa		4999038	F	36	118					
+HWUSI-EAS610	1	4	10	610	1082	0	1	TGACAACTCTTCGTTATTAAAAAGTGTCCTTTCATT	a`_`bbba`bbbbabababa`^aa[a`aa\bbbaaa	chr10.fa		4999516	F	36	119					
+HWUSI-EAS610	1	4	64	478	1707	0	1	AAATCCAGGCTTAAGTATTTGATTGATATTTCTTCA	`^VZ]\^^aaaa`a`^```^a^^aaa_a`]^_\[`a	chr10.fa		4999604	F	36	119					
+HWUSI-EAS610	1	4	95	1397	939	0	1	ATGAAGCCCAAAAGCGAGGAGATGAGCTGGCAGAAT	`b`aa]_`a_^\]\T__^`a[]_a`aa\]^^b^a``	chr10.fa		4999644	F	36	119					
+HWUSI-EAS610	1	4	9	1523	15	0	1	CAGAATTATCAAGCTCTTTCAAGGCTCTTGTGGCAT	__X_abbaa__aZV_S_W]S\^`I`_`ZBBBBBBBB	chr10.fa		4999674	F	36	84					
+HWUSI-EAS610	1	4	65	177	1122	0	1	TTTATAAAACTACTTGCTAAGCTATGTAACCAAAAC	aaaaab`_abbbaabbb`ZR_baba`^a_`aaa_aa	chr10.fa		4999779	R	36	119					
+HWUSI-EAS610	1	4	33	1003	1754	0	1	ATGCTACTGCCTGGGTAGTTCAAGTTAAAGAACTAT	aaa]`a``a_`aaXa^`a^`_ZYa__\`P_^^X___	chr10.fa		4999879	F	36	119					
+HWUSI-EAS610	1	4	28	457	1414	0	1	GTTTTAGCTCCATTGCTGGGTTTCTCTGACGTCTAA	aaa_bbbaa`b``a_a\aa`^aa^aaa___aV``aa	chr10.fa		5000176	R	36	119					
+HWUSI-EAS610	1	4	77	1750	127	0	1	AAGCCAGATTCATGATTCCCATTCTTTTGCATAGTT	aaSaaaRa`_aaYFZ^aa_a_SU^_^_VDS_Z_BBB	chr10.fa		5000924	R	22G12G	74					
+HWUSI-EAS610	1	4	47	458	1103	0	1	AGTTAAAGCCAGATTCATGATTCCCATGCTTTTGCA	H\^``Z`aTabb`a_\``^^^aaa]Sabba`ab`__	chr10.fa		5000929	R	36	118					
+HWUSI-EAS610	1	4	77	1293	236	0	1	TTGAATGGAGCAATTTCATTGAAGGCATAAATTGTG	abaaaaa_a`_a_aa`aaaaaaa`a^`a^_^a__[`	chr10.fa		5001015	F	36	119					
+HWUSI-EAS610	1	4	30	564	1907	0	1	CGAAATGGCTTAAAGTTTTTATGTATTCATTTTTAT	Mba_^`bbbb``ab``abbabbba`a`_R_babbab	chr10.fa		5001406	R	T35	101					
+HWUSI-EAS610	1	4	65	679	2007	0	1	ACAAATTGACCTTGCCTACAGCTAAGCTATATAGTG	`\]a^aXSaaa``_ZY^_aa_\_P_`a`U`__\YX[	chr10.fa		5001465	R	36	119					
+HWUSI-EAS610	1	4	35	279	1858	0	1	AAGCAAGGAAGAGGCTGAGATGATCCTGGACTCGAA	[[baaYV^_]b_aabab`a`V`aZaa`aa_a`a_[`	chr10.fa		5001671	F	36	119					
+HWUSI-EAS610	1	4	36	1035	2037	0	1	AAGAGGCTGAGATGATCCTGGACTCGAAAAATCTGC	aaaaa__aa_`_a```^__a_]]`]__^`_`]U^[Q	chr10.fa		5001679	F	36	119					
+HWUSI-EAS610	1	4	35	1597	1704	0	1	ATAGGTTCTGAGGCTGGGGGATGAAGAAGGGGAAAG	abbbb]ba`b`ba_bb`b`a_`a``a_`_a_a`_``	chr10.fa		5001797	F	36	119					
+HWUSI-EAS610	1	4	12	1528	613	0	1	AGAGAAAGAAGAGCACAGAACTGCAAAGTGCTTTGA	aaaaaa_[a_`a`P]^_a_a^_a^___^X^_^^^]_	chr10.fa		5001855	R	36	119					
+HWUSI-EAS610	1	4	67	1133	719	0	1	TTTAATCCCAGCACTCAGGAGCTAAGGCAGTAAGAT	aaaaaa_VZaY``_ZW`]LPPLZXWBBBBBBBBBBB	chr10.fa		5002868	F	30GT4	66					
+HWUSI-EAS610	1	4	35	1232	1282	0	1	TGCTGGAAGCAGTTGTTCAATAGGTGAATATAATTT	ab__`ba``]Za_aaY_ZP]`_`_YaY_^UYQ\_aW	chr10.fa		5002985	R	36	119					
+HWUSI-EAS610	1	4	49	752	19	0	1	TGCTGCTGATGGTGATAGTTTCTTAAGTACTTTACC	aabbbaaaa_baWaa_`a`ab_aaa_a]a_aaa__`	chr10.fa		5003272	F	36	119					
+HWUSI-EAS610	1	4	35	1739	1032	0	1	CACTGGCTCATATGTTTAACACTTGGTCCACAGCTG	aaa`Z^_aabbaaaabbab]b^aa][\\`aa`ZXa_	chr10.fa		5003626	R	36	119					
+HWUSI-EAS610	1	4	51	1001	138	0	1	GAAGGTGAAATGTTTCCCACTGGCTCATATGTTTAA	a_Yaa]a_a___Z`_`_a````^^a]]_]]`^`a_`	chr10.fa		5003643	R	36	119					
+HWUSI-EAS610	1	4	63	433	556	0	1	AGTGGGAAACATTTCACCTTCGAATCACAGGGATGC	Wa_`]_b\]RO]aa`__`__`aa^_b_`a`baaZ^]	chr10.fa		5003658	F	36	119					
+HWUSI-EAS610	1	4	85	1010	1721	0	1	ATCACTGCATCTGTAGGGGCACAAGACTTTATGTCT	ababababababbaaaaaa_aaaaba_bbaaba`aa	chr10.fa		5004009	F	36	119					
+HWUSI-EAS610	1	4	72	1754	1285	0	1	CATCTGTAGGGGCACAAGACTTTATGTCTGCCAGGG	Zbabaa`ba`a_bbabbba`babaaZ`_^\\a^Y__	chr10.fa		5004016	F	36	119					
+HWUSI-EAS610	1	4	73	1510	719	0	1	TGTCTTTGACAGCATTTCCTTCCCGCTAGGCTTTCA	a``bba`U_abaaa`bbaabbaaaaa`aaX__aa``	chr10.fa		5004067	R	36	119					
+HWUSI-EAS610	1	4	80	1726	1131	0	1	GCCTGGTGTCTTTGACAGCATTTCCTTCCCGCTAGG	_`_`]_Z]W_baa]_abbbaabbaa``aa__`_^`a	chr10.fa		5004073	R	36	119					
+HWUSI-EAS610	1	4	100	1330	1746	0	1	GGAAATGCTGTCAAAGACACCAGGCTCATCTTTAAT	aaa\baaa_a]aa`a`a`aa``aaaa_a_]`_a`_a	chr10.fa		5004084	F	36	119					
+HWUSI-EAS610	1	4	79	364	540	0	1	GCTGTCAAAGACACCAGGCTCATCTTTAATTGTTGG	`aabaaa]b`a_aa`U^baaa^`]a`a[Yaaa]aZW	chr10.fa		5004090	F	36	119					
+HWUSI-EAS610	1	4	17	1240	80	0	1	CGTCTCCTTGTTTGTCTCAAACCGCTCCCATTTCCT	aWUW[[_`R`[QY`_V`[aW`^NRUZ_RL[X\KL[R	chr10.fa		5004256	R	36	117					
+HWUSI-EAS610	1	4	61	1242	564	0	1	AGTTGCGTACCTTTGTCTGCTCCAACTCTGATGACA	a_X`a`Z_UZ_```^]]`\]_X]X_Y`]^^_^^^X]	chr10.fa		5004362	R	36	119					
+HWUSI-EAS610	1	4	62	280	257	0	1	CCAATGGTTCTAACAATGAACCCTCAAATATTACTC	a`][WZYR``[aaab^`a^YXaa_]]a`__]_a__`	chr10.fa		5004716	F	36	119					
+HWUSI-EAS610	1	4	75	523	508	0	1	ACTGAAAGCACTCTGTCTCCAGCACCCCAGACTCTC	`bbbbbbbbbabbbb`abaaaaaaaaaa`a^^a`^a	chr10.fa		5004861	R	36	119					
+HWUSI-EAS610	1	4	86	1088	308	0	1	TGGGGTGCTGGAGACAGAGTGCTTTCAGTGCCTTGC	a]`a]_a`aa][a_]S`]^U`_^aa\_ZW_WS\``Y	chr10.fa		5004868	F	36	119					
+HWUSI-EAS610	1	4	94	1643	535	0	1	TAGAGACAGTGTCACACATGCATGTGGAATCGGCAC	^bXb]b`THN_Haa_`b`^``a_^WYYaa__G`[_T	chr10.fa		5004912	F	36	116					
+HWUSI-EAS610	1	4	73	236	702	0	1	ATTCCACAAACAGCCCTTGGGTGGTTGCGCTGAGAG	aaabbabZabb`bba`aabab\ba\ab``aZa^_N_	chr10.fa		5004999	F	36	119					
+HWUSI-EAS610	1	4	21	1231	1101	0	1	ACTGGCTTTCACCAGGTAGAGCTATAGCTAAAACCA	abaaR]_]aZ`\_``____aa___U[_^^__``\_a	chr10.fa		5005173	R	36	119					
+HWUSI-EAS610	1	4	65	1018	1713	0	1	AACACTGGCTTTCACCAGGTAGAGCTATAGCTAAAA	a`X^aaaa^X```aa_``ZF[aaaaaa__TG[a`Z\	chr10.fa		5005176	R	36	117					
+HWUSI-EAS610	1	4	33	1319	1203	0	1	AGGAAATTGCAATGCAAGTGCTTCAAAGAACAGGAA	aaa\U\aa[Y^aaaa_V`_aaaa_[`__W_^U_`Z\	chr10.fa		5005308	R	36	119					
+HWUSI-EAS610	1	4	56	754	629	0	1	TGCTGGTCAGATAGTCATAAGTGAGGTTCAGTGCTG	ababaa]aa_X\U`^a\aa`b[a^`a[^a_a]a]`a	chr10.fa		5005529	F	36	119					
+HWUSI-EAS610	1	4	84	1271	449	0	1	GAAGTTTTAGCTTTTATGGTTATTATAATGACTTTC	a^]_]_`a_]]__``^``_[_\\]Z^[^Y[[X[^_U	chr10.fa		5005713	F	36	119					
+HWUSI-EAS610	1	4	21	1020	50	0	1	AAGAAAATCTGACAAGCGCCTTATATGTTCATCAGC	abbabbbaaaa_`baaba_aa_a_a`bZ_`aaaaa`	chr10.fa		5005884	R	36	119					
+HWUSI-EAS610	1	4	12	315	938	0	1	AACTGAGCCATACCCTCAGTCCTAGCAAAGCCTCGT	\`aa`^ZZbbab^abb`_]\aaaa_a^````]^]a_	chr10.fa		5006399	R	36	119					
+HWUSI-EAS610	1	4	5	784	113	0	1	AACTGAGACCGAAGCTCATGTAAGCCAACCAGGTCA	ababa`aaS[a`^a[aQa_a]a[aa_a_\\^_[Y_`	chr10.fa		5006567	R	36	119					
+HWUSI-EAS610	1	4	88	1187	1312	0	1	TACCAGCCAAAATAACCTGCAGTTCTTGGTCCTTTA	aa^a_a_`a^\^aa``Z\aa``Y\]___^^_]`Z`_	chr10.fa		5006824	R	36	119					
+HWUSI-EAS610	1	4	90	673	1463	0	1	GGAAAAACCAAACAAAACAAAGATGGCGGAACTGTT	aaaaaaa`aaaa^a_]a_a_aaa`aaa``_a_``_a	chr10.fa		5007116	R	36	119					
+HWUSI-EAS610	1	4	15	1089	1974	0	1	CTAAACGTTCCTCTCTGAGATAAAATCCCAATAGTG	abbaaabaaaab`aabaa`Z_^`aaa`^`a^a_a]a	chr10.fa		5007335	F	36	119					
+HWUSI-EAS610	1	4	88	867	1305	0	1	GAAAGACTGGAATATAGAAGACACAGGAGACACTAT	a_aaaX_aaa__`a`_a__a`]`XY`a]`^^]]_^`	chr10.fa		5007365	R	36	119					
+HWUSI-EAS610	1	4	53	847	923	0	1	TGAGATTTTGGAAAGACTGGAATATAGAAGACACAG	a``b^bbabYYGS`U]^a_XZ]a_`]Z\_`TDXX]a	chr10.fa		5007375	R	36	116					
+HWUSI-EAS610	1	4	21	1104	341	0	1	AGTTTGAATACAGAGGCACTATGGACATACAAGCTT	ab\^a^`aa]S[]`]P_aWb^]X^`_a`][aaaYab	chr10.fa		5007746	R	36	119					
+HWUSI-EAS610	1	4	34	326	254	0	1	AACACAAGCTTTTGATATCATTGTCAGTATTTCTTA	aababba`aaaaaa`_aaa`a^a]`aa^_aa`^``a	chr10.fa		5007912	F	36	119					
+HWUSI-EAS610	1	4	25	1082	594	0	1	TGTTTCTTGAGAGTCATAGACTAGTATTCAATGTGT	ababbabaaabaa`aaaabbaaba]aaa_a`a`\^`	chr10.fa		5007978	R	36	119					
+HWUSI-EAS610	1	4	83	328	501	0	1	GAGTACTAGAAACAGTTTTCACCTCCCCAAAACCCT	aab_aa^bbbaaaab^\aa_aaaaa`aa`[a__`ZS	chr10.fa		5008030	R	36	119					
+HWUSI-EAS610	1	4	37	515	412	0	1	TTATTTGTTCTTGGCATCGAGTGCCTTTTATGATCA	`babaaa_`aaabaabaaaaa[a^aaa`a`aa\G_`	chr10.fa		5008400	F	36	118					
+HWUSI-EAS610	1	4	93	1522	1210	0	1	GTATTTGTCAGACTTACTGCACACAGATGTTGTCTA	a]`a_a`[^```^_^`^`aa_]VFV\[^_X__X]__	chr10.fa		5008557	F	23G12	108					
+HWUSI-EAS610	1	4	64	1473	1481	0	1	GCTGAGAATGTGGTAGGTCACAAACCAAAGGCTTCG	aab_^a`^_`VSGU`^XTZ_T__WSY^_\PPZVFU`	chr10.fa		5008656	F	36	116					
+HWUSI-EAS610	1	4	93	505	228	0	1	AGCTGGTTCATGCTGGTTCATGCCCTTTGGAGACAG	a_a^a_S__``a_aaa__aaaaa_`a^^aa_`_^``	chr10.fa		5008909	F	36	119					
+HWUSI-EAS610	1	4	8	1328	1394	0	1	AATGAATTCAACTGTGCTGTCTCCAAAGGGCATGAA	abbbaaaaaaa_`aYaaaaa`aa_aa``_a]```a`	chr10.fa		5008925	R	36	119					
+HWUSI-EAS610	1	4	20	1176	1440	0	1	TGGAGCAGGAAAGCACACACACTTGAGAAGAGTTGT	ab```a_`_]VZ_^_TaUX^`_^a`YaXa_W[PP[B	chr10.fa		5009048	R	36	114					
+HWUSI-EAS610	1	4	50	1519	1557	0	1	TGCTCCAATGGTTCACGCTTGGAAGGAATCAAATAT	aba`_``_baa]__a]a_`aab]``_]_^^`a____	chr10.fa		5009077	F	36	119					
+HWUSI-EAS610	1	4	67	1130	1312	0	1	ATCCAAGTGGGATCATTTTGGCAGTAATTTTGAGAC	a_V_]P_JSWWXW\^a]^\^WPVYNSIY_`USMU]_	chr10.fa		5009232	F	36	117					
+HWUSI-EAS610	1	4	91	601	2020	0	1	ACAGGGTCTCAAAATTACTGCCAAAATGATCCCACT	abaY]\WUK`]a_a`^YZOTa_[_^[Ua_VYPQXBB	chr10.fa		5009237	R	36	109					
+HWUSI-EAS610	1	4	14	1761	1719	0	1	TAGATTTGTATCACCCAAAGCTCTCTGATCCCAGGA	aaZZ``TVOSXOT^RZVa]`\`W_\\XZZBBBBBBB	chr10.fa		5009411	F	36	88					
+HWUSI-EAS610	1	4	100	216	1773	0	1	ACAATATTGACTTTGAATCTGTAAGTCAGATACACA	N`aba^]aa\aab`ba^Ua`b_bba`bbaa`abaaa	chr10.fa		5009526	R	36	119					
+HWUSI-EAS610	1	4	77	1415	673	0	1	AAATGTCAGACTCAAATATTAGCTGCCAGGTGTGGT	aa_ba__a`a_`aaaaaaaaa[a[[^_^\\Y_X]]W	chr10.fa		5009705	F	36	119					
+HWUSI-EAS610	1	4	16	1244	586	0	1	TTTTGCTGTTTCTTTTTTCTTTTGTTCTTCAGAATC	a`a_WNYa]`^`a`_aaaaaa_``__W__X_a`^_W	chr10.fa		5009852	R	36	119					
+HWUSI-EAS610	1	4	49	431	710	0	1	ACCAGAAGGGGGAGGTAGAGCATCTATCCTTTCTTT	aa``a]WN[]]]M^]VW]NRDLWUSDLLTX]^UVWT	chr10.fa		5009954	F	20A15	106					
+HWUSI-EAS610	1	4	46	539	461	0	1	GGTTCTGGAAGGAATTAGAAGGGAGAGTAGCTGGAA	aa_a`aaa`^ba`aaa_a_[baa^a^b]aa^aaa`_	chr10.fa		5010629	R	36	119					
+HWUSI-EAS610	1	4	18	490	2022	0	1	CGCCATGCACATGGTCCCACATATTCCGAGTGACAG	a`abbaababaa`a^aaa^aU`a_``^`_`Ta`^\`	chr10.fa		5010857	R	36	119					
+HWUSI-EAS610	1	4	98	607	561	0	1	ATGTATTAAATATTTCTAACTCTTCTGAGGCATGGC	ab`TYbaaaV_OWaaa``^Ybaab`a``^]\OWa``	chr10.fa		5011217	R	36	118					
+HWUSI-EAS610	1	4	71	989	415	0	1	CATCATCATATGAACAATGTTGATAAATAGCAACAG	^b_`b`a`\`aa]^XTTa\W_\a]`bb^_VZV_T_]	chr10.fa		5011538	F	36	119					
+HWUSI-EAS610	1	4	29	431	1635	0	1	GGTGAGCCTAGAATATGCTGTTGCTATTTATCAACA	`WG\W]`a`^`[^]^aaaa____^VQX_][]`]\[\	chr10.fa		5011555	R	36	118					
+HWUSI-EAS610	1	4	76	219	49	0	1	ACTAAGAACAAAGTTATGAGTTCTCAGATGCACTCA	`bbbbbbbbbbbbaabbbababbbbbbbbbabaab^	chr10.fa		5011681	R	36	119					
+HWUSI-EAS610	1	4	18	1719	1546	0	1	GGTGGCATAGCCCCTTTCCAGTTGTCTCATCTTGAC	aa`MDX__^_`_ZV`a__^[YSa_VWaXOZ\^RQQU	chr10.fa		5011944	F	36	116					
+HWUSI-EAS610	1	4	100	467	611	0	1	GACAAGTATGTTGTTTCCTTATTAATCAAATGTTTC	`a_HZ_K\aaSa\Qaa_``aaa_``a`aW]^Z^_``	chr10.fa		5012566	R	36	118					
+HWUSI-EAS610	1	4	68	193	540	0	1	TTCAAGAAATAGAAAGTAAAATTGACAGCATTGTAG	aabbababbb`bbb`b`a`abaaababaaaaaa_`a	chr10.fa		5012910	F	36	119					
+HWUSI-EAS610	1	4	97	179	1189	0	1	GTTAATTGAGGGAAGCTCTCTTCTGAACACGGAATG	aZa[aaYa_`aX[T]_]`_`^_`Y^\_^^`aa\^]`	chr10.fa		5014011	R	36	119					
+HWUSI-EAS610	1	4	18	1396	299	0	1	ATACACACATGTGACTACACATGCAAACACACTCTT	abb`_QTH]VH_Y^\`^WaYaYXSGZYU\ZV``P_[	chr10.fa		5014102	F	36	116					
+HWUSI-EAS610	1	4	1	310	521	0	1	CATGTGACTACACATGCAAACACACTCTTGCATACC	`babbbbbbbbabbbabbbabb`abbabbb_\\ba]	chr10.fa		5014109	F	36	119					
+HWUSI-EAS610	1	4	67	419	1899	0	1	ACTGTCAGCATGTAAAATCTGATCTGCACATGGTAA	SXaWYT_UP`Vb[SY^bab^WZ_b^O]```^_^Y`_	chr10.fa		5014303	R	36	118					
+HWUSI-EAS610	1	4	24	1259	1879	0	1	TGTTTGCACCTTTCCCCATGTTCTCACAAGGTTGTC	a_N`Na][]YWa`\^XP\]_SRRNZWU[BBBBBBBB	chr10.fa		5014437	R	36	83					
+HWUSI-EAS610	1	4	56	330	93	0	1	ATTCCAGGGTCTTAACTGCTGAGCCATCTCTATCCA	`a`a]]_^_V]aa__\Z``\]\__\_]]___\]^[[	chr10.fa		5015067	F	36	119					
+HWUSI-EAS610	1	4	87	270	500	0	1	ATGTAATGCACATAATGTAATACCTGCTACATTCTG	aaaaaaaaaaaaaa`ab`abaaaa`a_aa`aa``^a	chr10.fa		5015120	F	36	119					
+HWUSI-EAS610	1	4	35	461	438	0	1	GTGGTTGAGAGGGACAGATGGACAACAGCAACAGCA	aa^[Xa`]\TXaa__UYaZ`WJY_^_^Z___\a`\^	chr10.fa		5016020	R	36	118					
+HWUSI-EAS610	1	4	29	1126	474	0	1	GGCAACCCTCACATCTGTACAATATGTAAAGATACA	G[^bbaabbbb\`bbbbbbb^a_b`b`b_``Y\aba	chr10.fa		5016757	R	36	118					
+HWUSI-EAS610	1	4	61	1299	1695	0	1	ATCCCCCACCCTTTGAACTTGCCTGTATTAACTGCA	X`ab_`[bVbbb_^Y`bb_`_UbZbb]bbb_]_V[[	chr10.fa		5017069	R	36	119					
+HWUSI-EAS610	1	4	89	1447	1078	0	1	GTTTAGCATCCGAATATCATTGGCATTCAAGGACAG	a_aaZ^a_a^`a_a\`^\aaaaX`]`\^aX__XW^U	chr10.fa		5017312	F	36	119					
+HWUSI-EAS610	1	4	41	1589	371	0	1	CAAAGNAAGAGCTATTATACCTGAAGCTGTTGATAT	abaa[D]aaa`abbbbbabaab`ab_baa_aYa_aa	chr10.fa		5017378	R	5G30	110					
+HWUSI-EAS610	1	4	61	1007	1803	0	1	TTTTGTTTTAAAAAAATCACATCTGTTCAAAGGAAG	aaaaa`aba___`a`a_\a_aa]`a^`_]`\Z_]``	chr10.fa		5017405	R	36	119					
+HWUSI-EAS610	1	4	14	820	941	0	1	AACAGAGCAGAGGCCGGTTAGTTTTATATTGTTCCT	`aZaa[b_`a``]```a^\_`X__a]a_]]]^`XX`	chr10.fa		5017777	F	36	119					
+HWUSI-EAS610	1	4	46	310	459	0	1	ACAGAGCAGAGGCCGGTTAGTTTTATATTGTTCCTA	[[SW]a__baaI_abaIbabPLb^Ya\a_ZYaba_`	chr10.fa		5017778	F	36	117					
+HWUSI-EAS610	1	4	59	236	1845	0	1	TCTGCTTTTGTGATGCTTCTGTTTGTCTCCCTGTTA	]abbbaabbb`aS_```abaa\aaa\aab^a``^ab	chr10.fa		5018071	F	36	119					
+HWUSI-EAS610	1	4	64	1057	553	0	1	GTTAACAGGGAGACAAACAGAAGCATCACAAAAGCA	a^a`aaXa[YQ^_VW]_[_a]^_]]aX`U]__]^\\	chr10.fa		5018073	R	36	119					
+HWUSI-EAS610	1	4	94	834	352	0	1	TGAGCAAGGTTGTCAGGCCACAGCCCAGAGGAGACT	abb]babbbYbbabbb`b\a`aaaaa_b_aa`aaaa	chr10.fa		5018274	R	36	119					
+HWUSI-EAS610	1	4	13	409	528	0	1	TAAGCAGGAGGTGAGCAAGGTTGTCAGGCCACAGCC	ababaaba`aa\aa`_a`aa^aa]_``^```^_aaa	chr10.fa		5018285	R	36	119					
+HWUSI-EAS610	1	4	73	554	1257	0	1	TGACAACCTTGCTCACCTCCTGCTTACCTCCTGGCC	`XXbba``OOYaa`JaW_ZTPZaUVDYZBBBBBBBB	chr10.fa		5018295	F	33C1T	76					
+HWUSI-EAS610	1	4	43	394	1663	0	1	AACCCTGAGAGAAGACATCTGGGAAGCAAGGCAGGA	]`abaaa[`\a_Xa_a_a`a_`aaX_a`^_a```Z_	chr10.fa		5018323	R	36	119					
+HWUSI-EAS610	1	4	70	758	1298	0	1	AACAGAGCAACACCATATTCCCAGTGCCTGAAAGTG	Q\_`^[V_HY_WY]Va]`a`b_\U\b^aa_WWVWX`	chr10.fa		5018730	F	36	118					
+HWUSI-EAS610	1	4	76	1197	582	0	1	TGGCCTAGAGCCAATGATAAAACCAAGCAACAAGAA	aba`abaaaaaaaaababbaba``_`a_aa```_aa	chr10.fa		5018926	F	36	119					
+HWUSI-EAS610	1	4	68	1088	897	0	1	TGATGAAGCTGCAGTTGGAACAGCTGGATGAACGCT	aaaaaa`_\[^^[`[`\aT]U\^_\a^^[_TZS\W^	chr10.fa		5019159	F	36	119					
+HWUSI-EAS610	1	4	17	383	63	0	1	CCTCACAGAAGGGCTCCTAATAATGTGCCTATGACT	aaabaa`aa`a__a`a``_a``a[_R_a```_```_	chr10.fa		5019233	F	36	119					
+HWUSI-EAS610	1	4	43	1790	357	0	1	GAAACACAGGGTTCAGCCTTGTAGTCATAGGCACAT	_abb`baa]TIV_]_____`S[`\X^_]_RX``^``	chr10.fa		5019255	R	36	118					
+HWUSI-EAS610	1	4	67	1261	1729	0	1	AATCCAATCACAACAAGGAATTCTCTAGTCCAATCA	`ab`U_aa_^aa_\a_aa^ab`_a`a[a^^`_````	chr10.fa		5019427	F	36	119					
+HWUSI-EAS610	1	4	3	492	235	0	1	GCTTAGACTGGAGCTGCGTGGGACGGAGCACAGGGA	XJX`^a\`\R``a[[^\`O^`^\WQQV^V^P\Y_aB	chr10.fa		5019552	F	24A11	92					
+HWUSI-EAS610	1	4	47	147	442	0	1	GCATGTGCTGATGACACTGCTGGAGCAACGGGCACA	``ZP]Y]bb\\\`T]`]ab_ZX^\__\_babb`I__	chr10.fa		5019601	F	36	118					
+HWUSI-EAS610	1	4	19	1281	864	0	1	CTGTGCAGATCTTGTGTGCTGACCTGGGATCTGAGG	ab]abaa`aa`aaaab`b`a_aa^aaaaa`aaa_aa	chr10.fa		5020101	F	36	119					
+HWUSI-EAS610	1	4	35	632	403	0	1	CAGCCTTCTTTCCATTTCAGTGGACTTGTATACACG	aYXaYVRYT]aa`_a]`_ZP[`[a[_^_\`_aa`Wa	chr10.fa		5020177	F	36	119					
+HWUSI-EAS610	1	4	21	1063	420	0	1	GTGCTTACTGACACTTATTTACATGTTGTCCTGATT	aaa`aaa_aa`_a_aa`a`a`^`aa^aa_][___a`	chr10.fa		5020230	R	36	74					
+HWUSI-EAS610	1	4	77	1001	1146	0	1	GGTCAAGATTAAAACAGCAATGGTTTCTTTGTGTGG	aa]_^__^___^^]][__^___[V_`\`]_`Z_Z_`	chr10.fa		5021236	F	36	119					
+HWUSI-EAS610	1	4	52	1766	563	0	1	GAGTGACATTTTACTGACTGAACCCTTTCCTCAGCT	a`]Z^`aaaa]aa_aaaa```a_`aaa____`]X]a	chr10.fa		5021684	R	36	119					
+HWUSI-EAS610	1	4	92	1392	1748	0	1	ATGGTAGTTAGTATGTGTTCTTAACCCTAGCTCCAG	a`aaWaa___aZ`_a]a^a`aa`^__W_]a_\\^R_	chr10.fa		5021770	F	36	119					
+HWUSI-EAS610	1	4	25	804	1267	0	1	AGCCAGCCTGTCTCACCAAATCAGACACCTTAAAGT	aaa[aY`aa[X[`_K\b]baaQOXU]\X`_aa]Z``	chr10.fa		5021833	F	36	118					
+HWUSI-EAS610	1	4	13	29	1553	0	1	GTACTTATCCATGTGTGCCTTAGCATGCATGTGTGC	\V___[^^a]T_aUa`^[a_YZa_Yaba`]_YbY[a	chr10.fa		5021943	R	36	119					
+HWUSI-EAS610	1	4	54	820	794	0	1	GTGTATCTGATATTCAAGGACTCTTTTCCCTTCCAG	aZa_`^_aa_aa`a_`]`]\_a]\`a`^[[_\VW\^	chr10.fa		5022108	F	36	119					
+HWUSI-EAS610	1	4	79	1011	449	0	1	GAGAGGCGGAAGCTGGCTCTGGCACACCTAGCAGCG	_\aa`\T_V_`Z^][T[^\X\Q`Z`X`KQXYXXBBB	chr10.fa		5022303	F	26G7AA	63					
+HWUSI-EAS610	1	4	3	1143	697	0	1	CATGTCTACTCTTCTCTATCAGCTCAGACAAACAGT	]Y\b`]_aaWbbbaaa`Zba_aa\ab`_a_`aW_^B	chr10.fa		5022359	F	36	115					
+HWUSI-EAS610	1	4	39	943	965	0	1	GTGGCATTGGGCTTTGGTCAGGGTACCATCAAGACT	aa_aa`aa_V_aaaaaa^^aa][U^^Z___\Z^ZZ`	chr10.fa		5022495	R	36	119					
+HWUSI-EAS610	1	4	46	1378	1665	0	1	TACTTCTAGAGACAGCTGGTCGGTGGTGGCTCTGCA	aaaa`a_aa\^a]a`V`WXX`^[Y^aP^\VTXTTBB	chr10.fa		5022564	R	36	110					
+HWUSI-EAS610	1	4	68	911	1815	0	1	AGGGAGATTTTCATATAGCCAAGATTGGGTAAGCCC	aaab_b]aa_`_a`a_]a^Yaa``^^`_`Oaa`\]_	chr10.fa		5023033	R	36	119					
+HWUSI-EAS610	1	4	86	98	331	0	1	GGAGCTAGAGGAGGAAGTACTGGTCCACGGCAGCTT	aa_bbaabbbbab`a`a`b`aba\abbaaa`]a]^Z	chr10.fa		5023708	F	36	119					
+HWUSI-EAS610	1	4	8	286	951	0	1	GCAGCTTTAGTGGCAATATCCTGAAGCTGCCGTGGA	_NW^aXaX`ZY^RR\\^\XK^YX[^Y`T^U]_G]``	chr10.fa		5023731	R	36	117					
+HWUSI-EAS610	1	4	78	745	2042	0	1	ACCTGAAGTGGATAGGGAGATAAATGGCTTAGAGGC	a`a__]RaT__Z_T\XR[^RVY^_]ZZZR]]RSWWR	chr10.fa		5023889	F	36	118					
+HWUSI-EAS610	1	4	18	487	1082	0	1	AGCAGCATAAATTGAGGAGGAAACTTTGAAAGCAGA	`b``aa`aa__aa`[`aaaaa```aaaa_aaa_aaa	chr10.fa		5023982	R	36	119					
+HWUSI-EAS610	1	4	24	1733	604	0	1	GAGAAAGAGAGAAAGAGAGGGAGAGAAAGACAGACA	aZ^\WP]TZZ^[a_`^_U]X\ZZ^ZWVYVYXZOZ__	chr10.fa		5025976	R	36	28					
+HWUSI-EAS610	1	4	51	1481	7	0	1	TGCAAGGACAGTTCCTGGCATTTGAGAGAGAGAGAC	]\baM^RX`b]aaUaP_b`_^ZW^^][`_RR]IL_X	chr10.fa		5026013	R	36	117					
+HWUSI-EAS610	1	4	10	956	97	0	1	CACCCCTTAGTGTCAACCCTCTGGAGGCAGAGACAG	ab_P\U]a\\GZVaW`\aZ\aV__W^XMY_S^^UG]	chr10.fa		5026634	R	36	116					
+HWUSI-EAS610	1	4	89	302	478	0	1	TTAAGTAGAGATTCTGTTTGGGATTGCACAGTTATA	aa`ab_``P_^`a^_aY_``aa^\`_`]__a^a__]	chr10.fa		5026728	R	36	119					
+HWUSI-EAS610	1	4	30	63	818	0	1	AAAGTCTGATCTGAAAAACAGTGCAGAGATGGATTG	H\Zabba_V\abba_[\aa\`[bbbbVb\abbaaab	chr10.fa		5027289	F	36	118					
+HWUSI-EAS610	1	4	72	1655	429	0	1	TGTGTAACGTTCTGGAAGATGCAAGCAATGTCGTTG	YFM_`aaX]\_[ZYQ`^X_[]Va`]WS^USY\OY_S	chr10.fa		5028110	F	36	117					
+HWUSI-EAS610	1	4	100	1287	1740	0	1	GTTCTGGAAGATGCAAGCAATGTCGTTGTGATGAGA	_aaabaa[]a``a]__aa`_a\^_a^_aXa]_`\`_	chr10.fa		5028118	F	36	119					
+HWUSI-EAS610	1	4	100	1502	1506	0	1	AGTGTGTTTGCTCACATGTTTGCTCTTCTGCACAGT	`aP_Y`abaa^aa]^^S_M]Y]U[a]`T`R]aaYa`	chr10.fa		5028220	F	36	118					
+HWUSI-EAS610	1	4	19	303	440	0	1	ATGATACATACATATACATATGCCTTTGTATGTGTA	abbba`aaabbaa`abaaaaaaaaaaaa`aaa^`Wa	chr10.fa		5028350	F	36	119					
+HWUSI-EAS610	1	4	98	434	1006	0	1	AAACAGAAAGAGTTGGATAGTTTTACCAGCAAAGGT	aaY_ab_aa`aaY``[]^aa]`_aa_]]a]``]`_U	chr10.fa		5028597	F	36	119					
+HWUSI-EAS610	1	4	56	540	936	0	1	CGTTGAATTTGTCATGCTTACAGTTATTAAATGGAA	abbbbaabaab_aaabaaaaaab`aaaa```aaa]_	chr10.fa		5028926	R	36	119					
+HWUSI-EAS610	1	4	38	809	1064	0	1	TATCCATAACTCCAGCATTTTGAGAAGGGAAACATT	aaaaa]a]Z``___^_Z_aa^^`a[^a[]_``^`^`	chr10.fa		5028965	R	36	119					
+HWUSI-EAS610	1	4	79	1321	2037	0	1	GGAGTTATGGATAAAAATTGGATAATTTATTCATAA	aa]]XY]\V]RSRaaaa``S[Y[[_WT__\_NZ^a_	chr10.fa		5028988	F	36	118					
+HWUSI-EAS610	1	4	28	886	29	0	1	CTGATAGAAAACTAAATCACAATAAATAGCGATTTG	aababbaabaaaabaabaaaaaba_`a_a[a`^``a	chr10.fa		5029024	F	36	119					
+HWUSI-EAS610	1	4	73	471	334	0	1	AAAACTAAATCACAATAAATAGCGATTTGCAGTATC	a_^T_X_`a`P^_ZZ[W]VZW^[`]YRZ[V\\USX]	chr10.fa		5029031	F	36	118					
+HWUSI-EAS610	1	4	57	191	721	0	1	GTGTAAGGGAGGTTGAGAGGGTGGAAAAAGAGGAGA	aWaZ[UaaaYa`Y``S_W``^Y`_\\\XR`Y_\Y]B	chr10.fa		5029625	F	36	114					
+HWUSI-EAS610	1	4	29	384	337	0	1	AGCAAGAAAGAGCTACAAAGTAGCAAAGATCAGCTA	Kbb_bbabbbabba`bbb`a`aa_^babbababbab	chr10.fa		5029667	F	T35	103					
+HWUSI-EAS610	1	4	45	1612	523	0	1	AAAGGTGTGCGCCACTACCGCCCACCTCCCATAGAC	`[`_MDOO_YRT___`_a][YTQWOYYKT]aZROYQ	chr10.fa		5030140	F	24G11	95					
+HWUSI-EAS610	1	4	26	1052	70	0	1	TGGGACATATCATTTCACAGAATGAGGAAAAATGGG	a__aaabbab``aab`a_aa`aaa_^^```_]a_^\	chr10.fa		5030645	F	36	119					
+HWUSI-EAS610	1	4	71	1068	1011	0	1	GTGGGGTTGGTTTATACTCTAGTCATGCTTTCAGGT	a_`a_a_`aa_aa_aa_a`aaa[^_`a^`____a_\	chr10.fa		5031452	R	36	119					
+HWUSI-EAS610	1	4	54	1753	172	0	1	AACCCCACTAAGGTATTTCCTCTGACAAGGCATCCT	aa_``]a^__^JZV`a`^[\^__Y]]^_RTQ^Y]]]	chr10.fa		5031480	F	36	118					
+HWUSI-EAS610	1	4	79	81	1325	0	1	GGAAGACTTGGTGACCATTTGGTGGCACTGTTTGGA	a`]`aP\b`bb_bba`^a`aaa\aaa`aab^a`aa`	chr10.fa		5031536	R	36	119					
+HWUSI-EAS610	1	4	62	1117	1753	0	1	AGATCACCAAAACACTAGCCATGAATAAATTTCAAA	a^`VTXa^^MTY^]\aaba_aaa^`Z_U\a_`^YW[	chr10.fa		5031921	R	36	118					
+HWUSI-EAS610	1	4	10	1557	1946	0	1	ACCAGATTGGCATCTGCAGCATCTCTTGATTGATGA	a__^_`^`__Y`_[UWR_aS]^WRWZ^^XVZ^R^\X	chr10.fa		5032010	F	36	118					
+HWUSI-EAS610	1	4	55	57	297	0	1	TCATGGTGTTTATGACAGGTAAAGTATTTGCTGAGG	ab^bbb[b_ababb^`Z`aWa\[_V_`aaa`^`U_a	chr10.fa		5032237	F	36	119					
+HWUSI-EAS610	1	4	48	663	816	0	1	ATTTGCTGAGGCCCTGATCTTAAATCCTCAGACCTC	ababbabb`\`aaa_aaa`bbaaba`]`_aa__[`a	chr10.fa		5032262	F	36	119					
+HWUSI-EAS610	1	4	3	1263	1756	0	1	AGACCCTGCCTCTCTATATAAGATGGAGAACAACTG	aa]Y^a[_WQ]X]^^ZS_W\_^^]X]ZQYUW^^SSB	chr10.fa		5032427	F	36	114					
+HWUSI-EAS610	1	4	49	239	951	0	1	TACTCATTGTTGACCTCTGGCCTTTATACACAGGTA	aaaaaaaaa_aaaa`aa`]_aaaa```Za_`a_^U]	chr10.fa		5032470	F	36	119					
+HWUSI-EAS610	1	4	23	71	79	0	1	GCATATGTGCAGATCTATGTACCTGTGTATAAAGGC	aba```aaaaab__a`_a`^^aaaa]a[a``]_a_a	chr10.fa		5032489	R	36	119					
+HWUSI-EAS610	1	4	58	239	722	0	1	GATCTGCACATATGCCCTTGCACATACACATGTGAA	a]aaaabaaaba_aa`a_aaaaa_aaaaa`aa^a_`	chr10.fa		5032510	F	36	119					
+HWUSI-EAS610	1	4	29	903	75	0	1	ATGAGCCTGCCACATGATTCCAGTACAGATCACTAT	GT[`a`a\\__aa`_[[[ab\\__\^__aa_aaa__	chr10.fa		5032591	R	36	118					
+HWUSI-EAS610	1	4	87	326	1225	0	1	TATGCAGACAAAAACCCATACCATAAAATATAATAA	aaaabbabbba_ababbbbaaabb_Z`aaab`aa``	chr10.fa		5032861	F	36	119					
+HWUSI-EAS610	1	4	33	181	1434	0	1	ATGCTTAGTGGTAAGAGTGAACCTTGCTCTTGCAGA	abbbabb_`bbIabaab`ba]b`bXa`S`abbbbaa	chr10.fa		5032952	F	36	118					
+HWUSI-EAS610	1	4	70	929	165	0	1	GGTGCTGGGAATTGATCTTAGGTCTCTGCAAGAGCA	aXT\]^`WWSSW_ZVW^a`[]YR]VY`a__[V[XX[	chr10.fa		5032976	R	36	46					
+HWUSI-EAS610	1	4	50	265	1980	0	1	CATAACACCTCACAAACATTTGTGCCTGCAGTTCCT	`b[RY_RQUX_UOOH_OZ[\XZZ\W]`ZZQJJR^BB	chr10.fa		5033300	F	36	108					
+HWUSI-EAS610	1	4	47	1311	1185	0	1	TCTGTCTCAGCCTCCCAAGGGCTGTGATTATCGGCT	ZaNFUXX^`X\]M]`]GQIWUX\aU`UOXKKXYPM]	chr10.fa		5033533	R	36	20					
+HWUSI-EAS610	1	4	96	254	1338	0	1	ACCAAATCAGCCTTTTTTGACAACTGCAGAAAATAC	aab^[HZa`aba```a^_`]aaaa_]a`a_aX^^_a	chr10.fa		5033819	F	36	118					
+HWUSI-EAS610	1	4	6	982	1511	0	1	ACACAGGCAGTATTTTCTGCAGTTGTCAAAAAAGGC	`][X\`RK[ZIHMZa[VVNXPRPXJQVVKP^]ZBBB	chr10.fa		5033828	R	36	102					
+HWUSI-EAS610	1	4	96	1766	1084	0	1	AATCAGTATGCTGGAACCAACCCAGTACGTAACCCT	a[]aa_W_Y^W^_X]`HWVa`\TX]U`_UH]^XXUB	chr10.fa		5033931	F	36	113					
+HWUSI-EAS610	1	4	12	1235	938	0	1	TTCTGTAAATATTAATCTGAAGTGTGTCTTCTGGGT	aaaaa___`aaaba^a``a_Wa]a_a^_a^_a___[	chr10.fa		5034312	F	36	119					
+HWUSI-EAS610	1	4	32	492	349	0	1	ATAGTAACTGATAATAATACTGCTAATGAAGAAATA	aa`a_aaaab_a_aaa_a```aa`a`_a]_a``a`a	chr10.fa		5034422	F	36	119					
+HWUSI-EAS610	1	4	58	672	172	0	1	TGGCATTTCCTTTGCTTCGGATAAAATGTCCAACAT	aba_a``a`_`aa_aa_aaa_T_^____]\_`^_`a	chr10.fa		5035596	R	36	119					
+HWUSI-EAS610	1	4	100	583	258	0	1	AGTTATGATTGAAGAAAGAGACCACCCTTAGAGTCC	^aabbbbbabb^aaba```aaaab`YZ^aaa]RZ^^	chr10.fa		5036052	F	36	119					
+HWUSI-EAS610	1	4	18	799	182	0	1	GATTGAAGAAAGATACCACCCTTAGAGTCCACAGCG	`aaZX__aW`__^Ya``__\^a`]_]YU_^_U]]T]	chr10.fa		5036058	F	13G22	89					
+HWUSI-EAS610	1	4	71	271	941	0	1	GAGACCACCCTTAGAGTCCACAGCGTGAGGACAGCT	a`a_a`X]a`J_ZZRZH]`_^_^]\V]O]_P\TZP]	chr10.fa		5036069	F	36	117					
+HWUSI-EAS610	1	4	15	831	900	0	1	AGTATAGAGTACACTCTTTCCTGCCCCCTCACTCTC	ababbaaabab_aaaabbbbaaaaaa_aaa___aaa	chr10.fa		5036164	R	36	119					
+HWUSI-EAS610	1	4	6	442	924	0	1	GAAAAATGATCTTAATCCCACAACTCAAATATCCGT	_W`\S\aaaa`aaa[`aaaba`a_a`a\a`aaa_a^	chr10.fa		5036563	R	36	119					
+HWUSI-EAS610	1	4	4	122	79	0	1	AGAGAAAAGCTGGACCAAACGTGTGCTGTTAATTTT	\\b\^`aab_`^`Z\`b`PH_T[_\P_aKab_aaaY	chr10.fa		5036799	R	19A16	105					
+HWUSI-EAS610	1	4	6	345	380	0	1	GCGAGGGGAAAGAGCAGCGTCTCAGCTAACCCTTCT	a`b`bbaa__ab`a`baaa`a_aab^aaaa`a^a`^	chr10.fa		5036886	R	36	119					
+HWUSI-EAS610	1	4	16	271	536	0	1	ATTGATCAGCCACGCTGTGATGTCCTTGACAAATCT	`````Y`bab_^_aaa\V`^UaX``G`__`]`Z_`_	chr10.fa		5037208	R	36	118					
+HWUSI-EAS610	1	4	71	1340	271	0	1	TTAACAGACAACAATTCCACTCAACTGTTTGTAAAA	abbaaa[aa`_W`WX]__aa`_^\]aW]_a^][_^U	chr10.fa		5038667	F	36	119					
+HWUSI-EAS610	1	4	97	258	708	0	1	CAATACCTGGGTTACCCACAACCACCTTCAACTCCT	_I\[TVZ_^ZXSTO]P[_^`^[`a_RY]VQPNJ[YB	chr10.fa		5038931	R	36	113					
+HWUSI-EAS610	1	4	78	1563	850	0	1	TGCTGTTTTGTTGACTTTGAAGTTCTTTTCGTATGT	aaaa``aaaW_aa`^aaaa`[[\_`_a_`\Q\`a[Z	chr10.fa		5040657	R	36	119					
+HWUSI-EAS610	1	4	66	1225	1757	0	1	TACGAAAAGAACTTCAAAGTCAACAAAACAGCATCA	_`a^Z[_`Y\`^[a`]]QU\aRW[a]UaT`\Z_XG_	chr10.fa		5040660	F	36	118					
+HWUSI-EAS610	1	4	59	1666	139	0	1	GCTCAACAGTCTGTGCCGGAAGCACCACCCGGTGGA	\\R[Xaa]TMYLXUL]][U`]QVZTQXVDSUTVBBB	chr10.fa		5040712	F	28T7	96					
+HWUSI-EAS610	1	4	40	1672	1340	0	1	GGAGCTGGAGAGCCTGGGCCGTGCAATGACTGGGCT	aa]X\`^`^\]X]\^\Y]SXMKVSSSYZTTXXRORX	chr10.fa		5040745	F	36	118					
+HWUSI-EAS610	1	4	27	1403	527	0	1	CAGATTAATGTTTCAAATTCACTCGTGCTCTGTGAG	abbbaabaa`Raaaaa]aaaaaa__Za]```aWa``	chr10.fa		5040967	F	36	119					
+HWUSI-EAS610	1	4	34	117	380	0	1	AATGGCTAGATTCGTGGTCTCTCATGGGGAGAGGGG	aaabbba`ba`ab`X`a^a]aa`Waabbb\a^`aaa	chr10.fa		5041054	R	36	119					
+HWUSI-EAS610	1	4	18	219	637	0	1	GTCGCTATACACATGGATGGTAGAAAAGGCCATAGC	a]]aaaaaaaba`aaa]_aa]aaa^]`[_a][\^^`	chr10.fa		5041216	F	2T33	85					
+HWUSI-EAS610	1	4	38	1469	1999	0	1	TGATGAGGCCATAAAGAAAAGCTTTCTTTCAGGGGT	a_OP`^T^X^RJMUXYHLWQWLZBBBBBBBBBBBBB	chr10.fa		5041387	F	34C1	58					
+HWUSI-EAS610	1	4	87	1326	1209	0	1	TGCTGAGTGAAATCCTAGGACAGTTGCAGTGAATTA	aab`]WYRY`]a^^aaa^a\_\]\``]^OS`_`_`[	chr10.fa		5041962	R	28A7	99					
+HWUSI-EAS610	1	4	26	1118	1204	0	1	GAAGCCAGGCTCCACAATCTTCAGGTATAGGTGCTG	`^`a_`_a____[_^_`a_aa__a`W\`\`_X`\``	chr10.fa		5042124	F	36	119					
+HWUSI-EAS610	1	4	88	1254	1890	0	1	TTAGCATCAGAGCATCGACATCAGGACCACAGCATT	^^b^T_baba`X`b^\aa[`a`]aaaa_a[`aZaaa	chr10.fa		5042285	R	36	119					
+HWUSI-EAS610	1	4	66	757	1257	0	1	CACAAGGCAGTGACTGCGTTTGTGGTAAGGAAGGGG	ab``^\a\aa\``_aa_aa``a_aa\^^a^^^a\]a	chr10.fa		5042326	R	36	119					
+HWUSI-EAS610	1	4	90	1273	711	0	1	GAGGGATGGTAAATTCAGACTTGGAATTGTCCTCTA	a`a^_`_aaWaa_a```\_]a]^[^``\^]_[_]]_	chr10.fa		5043036	F	36	119					
+HWUSI-EAS610	1	4	77	788	1673	0	1	TACATTCAAACAAAGGAAGGTTGGGTCCTGAGGACT	ababbba`Y^aa^Y`aSaab^``aaVaa_b[_a_`a	chr10.fa		5043210	F	36	119					
+HWUSI-EAS610	1	4	82	774	468	0	1	GTATCCAGAAGCTACTCTGAATCTTCCTCATCTTCT	a]\``Zaa[Z`_`\S\P]`^]__^`_]`U^`X_]W`	chr10.fa		5043269	R	36	119					
+HWUSI-EAS610	1	4	14	996	150	0	1	CAATTGCTCTCCCCATCATGCACTGCCTCAATTAGG	aaaaa`a_^_[\a[]__^`a_a`_`[[^^_^__W^_	chr10.fa		5043431	F	36	119					
+HWUSI-EAS610	1	4	61	1613	1224	0	1	TGCTGACAGAACCCTGATATAGCTGTCTCGCATGAG	a_a``a``P`YXX[Q^]Wa]_Z`a\ZV[WVJOVWX[	chr10.fa		5043856	R	30T5	8					
+HWUSI-EAS610	1	4	5	1679	635	0	1	GGAGATGAGAGGGAAGGAACAACCTTGCAGAGAATG	_abbab[bbaa_aabaU`babb^aa`_[aaa`aaa_	chr10.fa		5043961	R	36	57					
+HWUSI-EAS610	1	4	49	838	1184	0	1	AAAACTGGGACTTTGTCCCTCCTTAGAATGGGGAAC	ab_[_abaaY`baaba_a`aa`aa_a^U^aYZ[]_]	chr10.fa		5044032	R	36	119					
+HWUSI-EAS610	1	4	82	569	1361	0	1	GCTCTGCCCATCACTCAGCGAATCCAGGACACCCTG	\`X\`_`_``___\\]SX]_[__`_Ra[``_\\\a]	chr10.fa		5044200	R	36	119					
+HWUSI-EAS610	1	4	75	1330	191	0	1	TGGACGTGGTGACTCAGGAAGGACAAACTCTGTATG	a_```_Z_^U^_Z_aaZZ_]___a_a_``]\TT_Y[	chr10.fa		5044240	F	36	119					
+HWUSI-EAS610	1	4	88	462	976	0	1	TCCTGGAGAGCCTGCTTCTCTTTAAGGCATTGTTTC	aa`_a]X]W_XVTY`[`[`^X``X]Ua[[^V^V[X^	chr10.fa		5044352	R	36	119					
+HWUSI-EAS610	1	4	6	1597	641	0	1	TGTGTCTTCACATGAATAGTCCCCATCAAGTGTTTG	a`]\a`aaaa`a_]aaaaa_^^``_^X``^X_]__`	chr10.fa		5044458	R	36	119					
+HWUSI-EAS610	1	4	33	215	2014	0	1	AACACTATTTGTGTCTTCACATGAATAGTCCCCATC	aW_]a_a^]Z[HZY]__YV[_[_`_^`_TU_[]_W]	chr10.fa		5044467	R	36	118					
+HWUSI-EAS610	1	4	30	1774	1846	0	1	ACAAGGAGTTTTGCTTCCAGTGTTATATTCTCTTTC	``aa_Z^_Q_W`ZU_^[a`_N_[]`a`a_`a^aaa`	chr10.fa		5044909	R	36	119					
+HWUSI-EAS610	1	4	55	657	657	0	1	GGAAGCAAAACTCCTTGTTCCAGGGAGAAAAGGCAT	abZb__abaaaaa`abb_aaaaaaa_aa^aaa``a[	chr10.fa		5044927	F	36	119					
+HWUSI-EAS610	1	4	100	853	1224	0	1	ATAGTTACGTCAGCTTCTTCTGGCAGTAATGAACAC	T_ba_\bb`a[b```a^`ba`b_Y[`X_b__]_\V\	chr10.fa		5045808	R	36	119					
+HWUSI-EAS610	1	4	76	793	255	0	1	GAGTCCCCTTATCTTTTGACACCACTGCCATCTGCA	TT^]]b[bbaa[abaaabbabbaaaab`aa_[b_`b	chr10.fa		5046042	F	36	119					
+HWUSI-EAS610	1	4	81	997	1320	0	1	TCACTGGAAAGCCTTTGACCTTGCCATCGAGGCAAA	`PTT`aa^]aU_X]a\^SO^`\^]V\BBBBBBBBBB	chr10.fa		5046124	R	36	75					
+HWUSI-EAS610	1	4	86	688	897	0	1	TCCAGAGAGTGCAGCTTGGTTTAGAACTTGGGCTCC	]ST^[H[\aGa]_b\`__]SV`_X]_^YGS^X^SZQ	chr10.fa		5046152	F	5T30	104					
+HWUSI-EAS610	1	4	67	239	1858	0	1	GAGGCAGGAAACAGCAGAGCCCACTTGCTTAATCAA	aaa]VOT]]VV[ba_JU_T^\`ba_`[][^LY_a]B	chr10.fa		5046220	F	36	113					
+HWUSI-EAS610	1	4	91	207	630	0	1	CAGTACGGACACGATCATTTAAAATACAGATTCAGT	aaa_bbb`aa_aa`_`]`aa`aaa`a``_^^^`^_[	chr10.fa		5046632	F	36	119					
+HWUSI-EAS610	1	4	95	693	1967	0	1	GTCCAAAAGCAGAACCAAAGCCTGCCAGGGGCCCTG	a[___```]`a`\]_a__O\`\]Za`^RS\Z][ZRR	chr10.fa		5046761	R	36	118					
+HWUSI-EAS610	1	4	27	287	1361	0	1	GCTTGATTCTGGCTTGCTGTTCACCATGGTGGGAAA	a`[aa\aa`aaa__aaa[a__`ZZ__aaaS``_\\_	chr10.fa		5046883	F	36	119					
+HWUSI-EAS610	1	4	43	331	1914	0	1	CGGGAATATGTCACTCAGGGTGAGCCTTGACATTTT	H_aQT__VOU\a`_]`[S]_X_O^bbaaaaZ_`^[[	chr10.fa		5047025	R	A35	106					
+HWUSI-EAS610	1	4	24	898	190	0	1	GAGCATGGGAGCTTCTCACAGTTAGGCTATCAAACA	aaaa_aa]a_`^aaW]_a_^\U\a``__`[``__^^	chr10.fa		5047167	F	36	119					
+HWUSI-EAS610	1	4	24	963	1796	0	1	CACAGTTAGGCTATCAAACACAAATGGAAGGATGAT	abaab_abaa_abaa_^a`aa_aaaa``a_a`a`a`	chr10.fa		5047183	F	36	119					
+HWUSI-EAS610	1	4	67	86	1262	0	1	TCTCAGTGGTGGAGCCTATCTTTCTAGGAGGTCAGT	`babbbabb_aa`bbb`^^aaaabaaaaZaaVaaa[	chr10.fa		5047245	R	36	119					
+HWUSI-EAS610	1	4	90	562	1005	0	1	CAATACCTGTCAGGGACTATGAATCCATTTCTGCCA	`bbabbabb``abbb`ababba`a`a`a`aaaa__]	chr10.fa		5047298	R	36	119					
+HWUSI-EAS610	1	4	90	214	1615	0	1	GATGCTGGTAACAAGGCTGTCTCTTTGCCTTCTTAA	a]Ybaab]X^\^b`a_b`a]aaaX]aaa__aa_a_]	chr10.fa		5047340	R	8G27	90					
+HWUSI-EAS610	1	4	71	908	1774	0	1	CGACAAGCTCTCCCAGAGAGGGCAGCTTCTCAGCGA	`[`Ra_^``]^RP][T`ZYX\V\`aZ\UY`Z\RYXS	chr10.fa		5047507	F	36	118					
+HWUSI-EAS610	1	4	32	495	1547	0	1	AGTGTTTTATCCATTCCCCCCTCTCCCACATTTTCA	aa_b``bbaaaaaa`a`aaa_\a]`_ZYa\S\Z]`Y	chr10.fa		5047875	R	36	119					
+HWUSI-EAS610	1	4	8	568	1886	0	1	CTAACGACTATTTCTATTTCCCAACAATGCTCATAG	aa_YU`XRNK_]LXR\_P_XT]\V`PTO[`_ZBBBB	chr10.fa		5048051	R	36	100					
+HWUSI-EAS610	1	4	74	1024	825	0	1	AAACACAAGACAGGAAGACTTCCAGTCACATGACCT	aaa_Waaa___a`]_aaaa``\\W\^^______^^`	chr10.fa		5048179	F	36	119					
+HWUSI-EAS610	1	4	62	1294	1387	0	1	AGGTGCAGTGAGCAGGGTGTGCATGCCTGTGGCACT	\WGVT]TWW\V___VP_QZ]T_T\[_U^`VGGT[aa	chr10.fa		5048526	F	36	115					
+HWUSI-EAS610	1	4	88	869	1286	0	1	GTCATCAAACACCTAGGGTTTTGAGTCTCTCAATAG	`Y^Saa_b_\WU]PTa__[a`Z]RaW_`_^`\[Z\W	chr10.fa		5048573	F	36	118					
+HWUSI-EAS610	1	4	27	1318	1014	0	1	AGAGCAGACAAGACAGCCCAGCTAGTAGGATATATT	Vab`^aaaa`_V_YY\`]_V`V[X^P_a]W[V^SYY	chr10.fa		5048914	F	36	119					
+HWUSI-EAS610	1	4	86	558	97	0	1	AATTGCCTGCTGCCCCTCCTTGTTGCTGCTTCTTAA	_aa`_``\[b`a`aaaaa`]\a`a_`a_X__Y]XYS	chr10.fa		5049348	R	36	119					
+HWUSI-EAS610	1	4	53	1507	1644	0	1	GATCCTGAATTGCCTGCTGCCCCTCCTTGTTGCTGC	aa__V\R\]_`UUZ]S_P`SXYU^IJR`]UU^TXG_	chr10.fa		5049355	R	36	116					
+HWUSI-EAS610	1	4	57	1463	1349	0	1	GCCCCGTGGGGAATATAACACAGGCAAAGACAGGCA	`\]a`aW`^Y[T\^^``a]a_Z^Y^`^`XU^`\S\_	chr10.fa		5049579	R	36	119					
+HWUSI-EAS610	1	4	90	1219	313	0	1	AATAGGTCTTAGCTGTTCACAGGCACGTGCAAGGAA	a`a_XZV]`_`U__]ZZ`a__X\]^U]UTN]X^X]X	chr10.fa		5049813	F	36	118					
+HWUSI-EAS610	1	4	6	1012	1157	0	1	CACGTGCAAGGAAGTGTTGTTAGCAAATTATAGTGC	`bab]babaaa[_`Sa_bbaaa^aa_aaa_a_`Wa`	chr10.fa		5049836	F	36	119					
+HWUSI-EAS610	1	4	68	1223	198	0	1	CACGTGCAAGGAAGTGTTGTTAGCAAATTATAGTGC	aba^[Z]a^T\Z_]_^Z]S_a]_WU`a\```b\\`a	chr10.fa		5049836	F	36	119					
+HWUSI-EAS610	1	4	53	437	1837	0	1	ACACATCCTACATCACCGTCTCAGTGTGATAATTCC	aaaabaaaa````aaaa^_``_X_]a^_a`^`_`_`	chr10.fa		5049911	R	18G17	83					
+HWUSI-EAS610	1	4	49	832	982	0	1	TATCACACTGAGACGGTGATGTAGGATGTGTGTGTG	```WIX`aa`[]UM``U`RZZNSWZL[[X_R_]_MT	chr10.fa		5049916	F	12C23	91					
+HWUSI-EAS610	1	4	49	277	1947	0	1	TTTGAATCAAACAAAGCACATTCTTTCTTGACAACG	^bb``_aba^^`[[aababaaaaa`aaaaaaaa[^`	chr10.fa		5050387	R	36	119					
+HWUSI-EAS610	1	4	88	1670	591	0	1	GTGACCACAACAAGTATATAAACAGAAGATGCTGTG	]K\XYb`\aX`_bNabab`_ba\^aa]_\]`J_U__	chr10.fa		5050782	F	36	118					
+HWUSI-EAS610	1	4	88	144	592	0	1	GGGAGAAGCCCCAGAGGATCCCACTCTTTCCTTTGC	aab`bTabbabb`a^a_VQ``a\^Q`^\^VUX^``Z	chr10.fa		5050993	R	36	119					
+HWUSI-EAS610	1	4	93	626	333	0	1	GATTCCAGAATAGCAGGGTACTAGGCAAGAGGTGCC	Zaaaa]abaaaaa^a`abUa``ba[Z``a_a_W_a_	chr10.fa		5051603	F	36	119					
+HWUSI-EAS610	1	4	89	508	371	0	1	GAGTTGCTGCAGAGCTCCCGTGTGATCCTCTGCCTC	`_`]a``\a^``a^[]\_^aR`XaZZ\]^`^\`SY^	chr10.fa		5052686	R	36	119					
+HWUSI-EAS610	1	4	74	348	3	0	1	TACACGTGGAGGCTCCTNACCTCCAAGGTGAAGCTT	a__`__ZP^ZZVWX_]QDZ`VR_BBBBBBBBBBBBB	chr10.fa		5052851	R	17C18	54					
+HWUSI-EAS610	1	4	52	564	283	0	1	AAAGAGAGAGGAGGAAAAGGGATGGGTNGAGAGGGG	`a_b_a_aXb]FYaZa`]b`]Yb]aaRD[[a^aaaa	chr10.fa		5053014	R	27A8	109					
+HWUSI-EAS610	1	4	85	1181	693	0	1	AGAGAAAGTGTGTGAACAGTCGTAGTCACTGCAAAA	`aaa^b_baaa`babb_aababb^bbbbbaab`_bb	chr10.fa		5053254	R	36	119					
+HWUSI-EAS610	1	4	65	314	1159	0	1	CTACGACTGTTCACACACTTTCTCTTTGTTAAATAG	aab```aaa`aa`aaaa`_`aaa`aaaa`a_\\`_a	chr10.fa		5053265	F	36	119					
+HWUSI-EAS610	1	4	23	589	630	0	1	GTGGAGGACCTTGTGAAAGACCACCTCATGTACTTA	a_ba_ab^]^aaaJE\aaaa_`__]_[`a_W]]^^]	chr10.fa		5053316	F	36	117					
+HWUSI-EAS610	1	4	89	868	783	0	1	AGTAAGATTCTGGGAGGGGGGTGTTGTTTGATTGCT	ZW\_S]^a_``[a[_b[`W_[R[U^__^\UF[aZZb	chr10.fa		5053546	F	30T5	108					
+HWUSI-EAS610	1	4	31	1219	553	0	1	CAAGTTCAGGCTCTGAAGCCAAAGGGCATTCCACAT	_ba\Z_aaZT`aUa^Z^aa][W`PHX_XYXWQW\_W	chr10.fa		5053822	F	36	118					
+HWUSI-EAS610	1	4	97	121	770	0	1	CAGAAAAGAGTTTCAAACAAAACAAAACAAAACAAA	aaaaaa`_aaY`aa`[a`a\`aa_`_a__^^`a]_\	chr10.fa		5053937	F	36	119					
+HWUSI-EAS610	1	4	78	731	1885	0	1	TATAACATGTCTAGCAAATAGAATCAGGATCATAAA	aabbbaaab_aaa_baaaaba_aa`ba`aaa_aaaa	chr10.fa		5054580	F	36	119					
+HWUSI-EAS610	1	4	5	1519	940	0	1	TGCATGGAGTGAAGGGCCTACCAGGTTGCAAGATTT	ab\`a]\ZYK\__[Z^^[[[`Z^^URZ]NYT\\^^Y	chr10.fa		5054775	F	36	118					
+HWUSI-EAS610	1	4	74	33	1665	0	1	GAAAGCAAAGCAGAGAGCGACAGAGAAAGACTCTTT	a^_abaa^ab`^aU^__]`\__a_`Z][_R]Z^]ZV	chr10.fa		5055297	F	36	119					
+HWUSI-EAS610	1	4	7	1423	1571	0	1	ACAGCCTCTGCATGTCCATGCGGAGATTAGAACGGG	aaaa]^`_\V^]]a\Z_S^a\`a\_]_U`]]]S\]\	chr10.fa		5055337	R	36	119					
+HWUSI-EAS610	1	4	66	1506	279	0	1	AGCACACACCCTGACACAAAGATAATCCATGTGAAT	^a\[]^```^`[QR`b``a\QT_]a`V^[WTXJR``	chr10.fa		5055407	F	36	118					
+HWUSI-EAS610	1	4	9	1457	38	0	1	ACAAACAATAAAGGCACACTTTGATGTAGATCATTT	aaa_`_a`aa``Z_aaaa`a`\T^`N^_P[__]`V^	chr10.fa		5055814	R	36	119					
+HWUSI-EAS610	1	4	53	1300	1560	0	1	GAACATCAGGCCATTGAGTTCATACATGTATCATGG	aab_aaaa`____aaa_`_a`_`_]^`_\a_^]`aa	chr10.fa		5055958	R	36	119					
+HWUSI-EAS610	1	4	51	101	1924	0	1	AAGTTCATCTGTGAATTATTAATTTCGGTGACCATA	aZ`aaaY``^a[Y\]aXO^_V]``a_\\S\`_]PWX	chr10.fa		5056447	F	36	118					
+HWUSI-EAS610	1	4	8	720	112	0	1	ACTAAAAAGAGTCCTAGAACCCTTACTCACCCTTAT	a^baaa`a```_^^`aa_a`_]``_^Z^_]]U_]_[	chr10.fa		5056652	R	36	119					
+HWUSI-EAS610	1	4	79	1751	417	0	1	CAGGACAGAGTCCTGATCTGCACACATGTTGAAAAC	ab[aa]a]`[]_`_]`a_RUaaaaZa_^X]U_]___	chr10.fa		5056877	F	36	119					
+HWUSI-EAS610	1	4	35	1184	1055	0	1	AGAACTCCTGCTCGGAGAGAGCCATTTCACTGACTA	_aYa`aa^]\`Z_`_[_\a_`_`ab_a^_`aa]__`	chr10.fa		5057156	R	36	119					
+HWUSI-EAS610	1	4	94	827	1435	0	1	GCCCAGGTTTTCAGAAGGGTGCAGAACTGTTCCAGG	`a`a`a`T]baa]aaaa_`S_aaaW^^a`U_`_^`\	chr10.fa		5057220	R	36	119					
+HWUSI-EAS610	1	4	56	530	5	0	1	AGTCGAAGAAATATTTAGCTTATTCACCCCAACGGT	`ba_b\Jaaaab``baa]aa``aaaaaa`aaa^a^S	chr10.fa		5057348	R	36	118					
+HWUSI-EAS610	1	4	69	899	1406	0	1	GGGGGAAAAGACACTTTGCAAACTTACTGAATACTT	`aaaa_]aa`a_aaaaa\__^`^``\^a`^aa_[aa	chr10.fa		5057446	R	36	119					
+HWUSI-EAS610	1	4	72	1261	720	0	1	TGTGTGTGTGTGTGCAGGGACAGAAGTGGGGTGGGG	_`^a`_Xa^_\_^``\a`aVIY[\V_N_]\`SaTa_	chr10.fa		5058197	F	36	118					
+HWUSI-EAS610	1	4	20	299	326	0	1	GAGGCAATGTTTTATTTTCCTTAGAAACTAGAGCCC	a_aaa\]`a\^V\Q\[PV`YX\_YV][TPFQTSSY]	chr10.fa		5058548	R	36	117					
+HWUSI-EAS610	1	4	24	954	1917	0	1	GAGGCAATGTTTTATTTTCCTTAGAAACTAGAGCCC	a\WR__^__UU^[_`]V_WMV^\S_\TQX]]^VBBB	chr10.fa		5058548	R	36	105					
+HWUSI-EAS610	1	4	71	100	307	0	1	ATCCACCTTAAGGGAATTTCCCCATGACATAAGACC	Wab\[^abY\I\_`WO[Waaa`bbY`Z`a_a]Z\]Z	chr10.fa		5058813	R	36	118					
+HWUSI-EAS610	1	4	56	980	49	0	1	TGTTATCTCCCTTCCTGGTTTCCTTTCCACACAAAC	\a\^P^_a]^aa``_aaa[_bY^_`__]^]_W^`ZZ	chr10.fa		5059563	F	36	48					
+HWUSI-EAS610	1	4	67	550	1738	0	1	GCCCTTGGTCCTGTGAAGGTTCAATGCCCCAACATG	aa]aaa`_^`Zaa]a\_aaW^^]]\a[`\Z^\\\^Y	chr10.fa		5059687	R	36	8					
+HWUSI-EAS610	1	4	62	1202	1449	0	1	TGTACTCTCACCAGCAATGGAGGAGTGTTCTCCCTC	aba^bZaaZF]Y]a_\O]abZa_G`Q`X__\R^U__	chr10.fa		5060998	F	36	5					
+HWUSI-EAS610	1	4	34	1512	1310	0	1	ATGTCNGATGTAAGGTTGGTGAAGATCTTTCCTTTT	_ab^[DY_aaSU_^b_a_aa`^[]Ua[_a_]]]``a	chr10.fa		5061321	F	5A30	17					
+HWUSI-EAS610	1	4	20	1142	1673	0	1	AGGTCCTCTCAGTGGTGACGAGCTCCAGAGCGCTGG	aaa_^aa^_\`aPaa[a`^`aa``^[[[`aXa^^a_	chr10.fa		5062226	F	36	119					
+HWUSI-EAS610	1	4	12	1414	318	0	1	TAGCAACTTTAATCTCCCACAAGACCAAGTCCTGCC	ab]b`aaaaaaaa`aa_a_aaa]`^W`_VUTZ`[Y]	chr10.fa		5062300	R	36	119					
+HWUSI-EAS610	1	4	49	1199	2033	0	1	TGTCTTTACTNTAAATTACTTTGATGCTGGAAGCTA	aaa_aa\Z_[D[][]aa`W_aa^V]\Y```]^\OU\	chr10.fa		5062352	F	10C25	110					
+HWUSI-EAS610	1	4	61	249	551	0	1	AGTGTCTCTTTTCTTCCTGGGGAGCAACTTTTGTCG	Wa_babbbbbbbabbbbbaaaa\____babaaa]a`	chr10.fa		5062563	R	36	119					
+HWUSI-EAS610	1	4	1	1167	936	0	1	CACAGGATCATTGAAAGTTAAAAACTGTAATTCTCA	_`bbabaabbbbbbb`bbbbbbbb_bb_abbbbb_a	chr10.fa		5065589	F	36	71					
+HWUSI-EAS610	1	4	53	1262	1593	0	1	CATACCAGTAGCGGGAATCAAAACCTGAAAATGTCA	aba_aaa_JbbWbb_]aaZXY\_J_b`Ja`RSb_Q`	chr10.fa		5066084	F	12A23	79					
+HWUSI-EAS610	1	4	64	627	1507	0	1	GACCCTTGCCTGCAAGGGTTCACTCATTACAGTCCA	]\`aaaaa__^]__Y`a`\a_^]aaaa__\_`]]_a	chr10.fa		5066126	F	36	119					
+HWUSI-EAS610	1	4	75	50	1874	0	1	GACCCTTGCCTGCAAGGGTTCCCTCATTACAGTCCA	]V_]b]]a^`]aaa^]a_UU[G_]aR^SP`]ZWa]B	chr10.fa		5066126	F	21A14	102					
+HWUSI-EAS610	1	4	21	1038	1768	0	1	TATTGAAGTAAGACCTAATGATTCTTTTTTGACATT	abbbbaaaaa\ba^aaabbba_a]aaaa`a^a_`ba	chr10.fa		5067060	F	36	119					
+HWUSI-EAS610	1	4	60	1590	1191	0	1	TAGGGATCCATCCCGTATACAATCACAAACACTTTT	ababaaa``aa`aa_aaababaa`a_aaa_a_``aa	chr10.fa		5067584	R	36	119					
+HWUSI-EAS610	1	4	4	677	23	0	1	CATTAGGCCTAGCCACTCTGGAAATCAGTTTAGTGG	_baababbabbba]abababbbaa`abb`babaZab	chr10.fa		5068144	R	36	119					
+HWUSI-EAS610	1	4	95	1783	641	0	1	TACCCATCTCTTTTTATTCTGGTTGAAAGTTTATTT	abbaZaaabaabbababbab_`_baaa^a\aaaabb	chr10.fa		5069020	F	36	119					
+HWUSI-EAS610	1	4	15	194	509	0	1	AAGACACAAGGTGGAATAGCCATTCTAATAGCTAAA	[`aX`abYbbb`bbbab``ba_a`aaa_abaaaa__	chr10.fa		5069057	R	35T	12					
+HWUSI-EAS610	1	4	88	526	385	0	1	ACATAGGCTAACAGAATGGATGCAAAACAGGATCCA	a`aaaaa`_a`]`_W[`a`a`a_aa_]U`]`__X_`	chr10.fa		5069190	R	36	34					
+HWUSI-EAS610	1	4	86	329	1336	0	1	GTGGCCAGGCTTTGTGAGAACCCCCAGAGTACTCAC	`aa]aaaaaaaa`a]a]`]Zaaaa`]a^`U\`X]\a	chr10.fa		5070371	R	36	119					
+HWUSI-EAS610	1	4	14	421	1294	0	1	AGACAGGCAGTAAGTGATAGATGGAGGAACCAGATG	VbbbbbaaabG[`aYWTWaaa`[a_`bSaabab[`b	chr10.fa		5070516	R	36	118					
+HWUSI-EAS610	1	4	18	1320	173	0	1	ACAGCCCTTATCAACATACCAGGTCTGTGTTGTGTT	`X`^aZ__aX`_aaY^`_^a__IR\]^_SU]^XUW^	chr10.fa		5070777	R	36	118					
+HWUSI-EAS610	1	4	16	989	279	0	1	AGTATTCCTCTTATCTGATTAATATCAAGGGACAAA	[XZ]Z\\^^][]Y]Q_ba_bba`abaaaabaWWVH^	chr10.fa		5071159	R	36	118					
+HWUSI-EAS610	1	4	95	39	1570	0	1	GAGTGTCTATCCATGGCCTGAAGTAGATACAGATTG	_N^a]]b_]Vbb\[YY`aaaX`aP`aJZ\\_bbTG^	chr10.fa		5071950	F	36	117					
+HWUSI-EAS610	1	4	3	1182	381	0	1	TTGAGATCCTCTGTCATAGGCTCTGCCTTTTGTAGA	a]Y_a_[_^__^XWGY_VVXZ]Ya[QUQX^XMVSYQ	chr10.fa		5072162	R	36	117					
+HWUSI-EAS610	1	4	61	658	506	0	1	GGCAGAGCCTATGACAGAGGATCTCAAGTCTCAGTT	[]abab^baababbabaaababaaaaba`aa]aa]b	chr10.fa		5072171	F	36	119					
+HWUSI-EAS610	1	4	13	84	306	0	1	TGCCGGTTTTCCAGGGACCTGAGTCCATACAGTGAG	TX`b][JT`a`^W`QTY^`^\^b_bab``Z\]K[`b	chr10.fa		5072217	F	36	118					
+HWUSI-EAS610	1	4	1	1488	920	0	1	GCCTTATTTCCTGCCATTATAGCTGGAATTCTAGCT	`babbaabb[`aa`aabaab`P_`\]a_a`_a_`__	chr10.fa		5072392	R	36	119					
+HWUSI-EAS610	1	4	34	136	541	0	1	TGTAGCACCAGTTAGGTAAATGCACATTTCGAAGAA	a\L]^__^[R\`_[_`W[WHW``\_^]]]]^\Y_^S	chr10.fa		5072658	F	36	118					
+HWUSI-EAS610	1	4	55	200	1155	0	1	TTTGCAAATTGGAGGATAGAAGAAAAGGGACAACGT	a`[O`RY]Va]`^a^W\N`Y\VVTYY^__][`___^	chr10.fa		5072725	R	36	118					
+HWUSI-EAS610	1	4	4	455	122	0	1	GCGATTTGCAAATTGGAGGATAGAAGAAAAGGGACA	a_b_^aaa_``Za`a_^aa_^]_^_aZ____^^^^a	chr10.fa		5072729	R	36	119					
+HWUSI-EAS610	1	4	74	1351	1058	0	1	CATTGCCTTTGGCACTGACCGCAGAGCTCTTACCTG	a]aaaaW^]ab_aa`X^aaZ__a\^`SSL\`YYOOZ	chr10.fa		5072948	R	36	118					
+HWUSI-EAS610	1	4	64	1015	1756	0	1	TAGTATTTATTCCACTACTTCAGGGGTAGCTTTATC	a`a`_aa`X^^^a__`a[a]aZ_`\\GWXWPX[\[\	chr10.fa		5073066	R	36	118					
+HWUSI-EAS610	1	4	86	562	643	0	1	GTGAGAGCTTTTTCTACAGACCACAGGATCTGAAAT	`_aab``aa_bbaaaaaba`a`baaba_a_a`]aaa	chr10.fa		5073506	F	36	119					
+HWUSI-EAS610	1	4	9	1227	1256	0	1	AGAGACACCATGTCTAAGGCAACCCTTAGAAAGGAA	a_`a`]]]Z`_YT][]\]`^`[^YY]XT[\XTZ_T]	chr10.fa		5074007	F	12A23	55					
+HWUSI-EAS610	1	4	6	189	971	0	1	AACCCTTAGAAAGGAAAACATTTAATTGGGGCTGGC	X`aabbbbbbbbbb`]aaaZaaabaaab`aaaaaaa	chr10.fa		5074027	F	36	28					
+HWUSI-EAS610	1	4	23	181	1767	0	1	CAGAAGTTCAGTCCATTACCATCATGGTGAGAAGCA	aa`__`]`b\_^aaa__a`_`__^aaaV`_`aX_a_	chr10.fa		5074072	F	36	34					
+HWUSI-EAS610	1	4	46	1386	1827	0	1	AGTTTACAGAGAGACGAGGTGCTGAAGGAGGAGCTG	ab`a``abbbb]_a`b`b^]b_^b]^^RQTSP^_`_	chr10.fa		5074112	F	36	119					
+HWUSI-EAS610	1	4	31	274	306	0	1	AAGCCCAGCCTAGTGGCTCACTGTCTGTTCCCACTG	abbbbb`bbbbbaYbbbaa``]__aa^IUX^[QZZB	chr10.fa		5074173	R	36	114					
+HWUSI-EAS610	1	4	47	127	1024	0	1	ACAAGTGTATGGAGGTTAAAGACAACTTTCAGGAAT	_^_Z_[a\S]`ZN_aV]U]V`^a^``XYW`PQ_`]^	chr10.fa		5074480	R	36	118					
+HWUSI-EAS610	1	4	55	88	1504	0	1	TAGAATCCCCCAGGGAAGCTCTCCTGTGGTCTTTTG	_T`^abb_ba_^[^a^]aa^a`^_^a\aaXaa_`^`	chr10.fa		5075040	F	36	119					
+HWUSI-EAS610	1	4	70	482	969	0	1	TGATAGGGCATAGTGGTGTTCTGCTGAACAGGTGGT	aaa`X_`a`^aa`U``Ta__`aa`]_^_X^`aUV]U	chr10.fa		5075074	F	36	119					
+HWUSI-EAS610	1	4	5	971	46	0	1	GATGGGGGCCAAGAGATAACAAATGTTATAAACAAC	aW__TY[^]]^\]]_W[Z^]XZV]`YWZ]^ZXX]XX	chr10.fa		5075266	R	36	119					
+HWUSI-EAS610	1	4	99	1279	250	0	1	CTAATATTAATTCTGAGTTGACCACCAAACATCACG	ababa``aa_``_aa`a^a_a^``__aab[a__a_a	chr10.fa		5075354	R	36	119					
+HWUSI-EAS610	1	4	43	1750	1956	0	1	AGCAGCTCCCCTTTGAACAGCATTGTGTTTAGCTTA	`]]_`U[\W]^]OW]Z`X^^WUXX[GU^XXSVOXVV	chr10.fa		5075584	R	36	117					
+HWUSI-EAS610	1	4	2	965	175	0	1	GACTGGAAAAGTTTTCATGCAAATCTCCACCAAAAG	a`_ab`aaa`a]_`a_aa`^_]^a^`]S\]XX^Z^_	chr10.fa		5075684	F	2A33	83					
+HWUSI-EAS610	1	4	28	1264	1135	0	1	TGTGTAAGAAGCCATCTAGTCCTCAGGGCTAGTCAC	aa`a______[[U^_[_``W_\_W_^_^UZ[^WS\W	chr10.fa		5075898	R	36	119					
+HWUSI-EAS610	1	4	35	409	1825	0	1	GGCTTCTTACACAAAGGCTATTGCTACAGGCTCATC	`abaabbbaab`bbYb]aaaaaaa`ab^`Z`]a`[a	chr10.fa		5075921	F	36	119					
+HWUSI-EAS610	1	4	12	352	1242	0	1	AGAAGTACTGTGACTTACATACATAGAAGAGGTAAT	`b^aa^baab^aaaaaa``a^_baaa`ab_aaXaaa	chr10.fa		5076251	R	36	119					
+HWUSI-EAS610	1	4	82	1356	469	0	1	ATGCACTTCAGATTAACAAAACTGTCAATCATGAGC	[FSW^_U_aTT[a_aa_bb``\__\]`_^_`_Z]^W	chr10.fa		5076618	R	1G34	108					
+HWUSI-EAS610	1	4	7	91	207	0	1	AGGAAAGGAAGGAGAGGTGGAATTAGATTCAGTAGT	ab_^^a_aU_bbaa[`a^`Z^aaS\`aaaW^aYab`	chr10.fa		5076667	R	36	119					
+HWUSI-EAS610	1	4	93	514	1858	0	1	GTGGAAAATGTTGAGAAATTTGAGGCAGACATGAAG	aYbaaa_aaa`aaaba]aa```aaaaaa_a`aa`_a	chr10.fa		5077020	F	36	119					
+HWUSI-EAS610	1	4	54	17	1724	0	1	GACACTCAGACTTTTCACTGTGTGATCCTAGTCTCT	Z\bba_bbbbbbbbbaS_bba`]`Xaaabab`bba_	chr10.fa		5077090	R	36	119					
+HWUSI-EAS610	1	4	52	277	564	0	1	CATTCCCAAGGCTATATCCATATCTCCATTCACATC	_`^_ba]XW]aa`^^]^]\Y_^^]```[aa`Z_```	chr10.fa		5077639	R	36	119					
+HWUSI-EAS610	1	4	56	1700	1371	0	1	TCTCTTCCCTTAATTATTGACAGGGTCAGATTGGCC	VaRW\URT_Z\_a\Y]]X_^^^NXZGUO[^][X__\	chr10.fa		5077991	R	36	117					
+HWUSI-EAS610	1	4	57	1485	660	0	1	ACCACTGAGGCACAGGGCTGGGTTTGACCTGTCTCT	aaaa_a]`PT^``^[VYU^]\TT^]^`\\^YU\_^]	chr10.fa		5078325	R	36	119					
+HWUSI-EAS610	1	4	72	780	1816	0	1	CAGAATAGGAAGCCAATAACCTCTGCACAGACACAA	aab`b`_`a`a_`^_aaaa`a^_`Qa`]a`__^`^_	chr10.fa		5078456	F	36	119					
+HWUSI-EAS610	1	4	46	1700	918	0	1	GTTTTCCATAGGGAGATGCATTGGCTGCAGGAAAGC	a`baaaaaa_NVO]MQ]a__a`\X[^_V[QLM_XRX	chr10.fa		5078878	R	36	118					
+HWUSI-EAS610	1	4	56	603	1417	0	1	TGGGCTTCACTGGCTTGCCAGTCTAGCCAAGTTGGT	aaZbabbaaaaaaaa`Z]`]a``a]`_^]YZU_X]Y	chr10.fa		5079422	F	36	119					
+HWUSI-EAS610	1	4	34	386	1372	0	1	GTGGAAGCAAGAAGAGGGAGTTAGCTCCCTTGTAAC	a^baa__^]a__a`ZP]``__aa`_``__^__U\`[	chr10.fa		5079615	R	36	119					
+HWUSI-EAS610	1	4	53	1006	38	0	1	TATGTGTGTGTCTGTGTAGGAGCATGTGCATGTAAG	aS`aQ_[_WaS][_][Xa_WZa\^_^VYYX]]Y]ST	chr10.fa		5079662	R	36	118					
+HWUSI-EAS610	1	4	68	812	1984	0	1	ACATTCCAGGAAGCATGAGACATGAGCCCTTCCATT	]_V_[]`^_I^Z\UZ_a_a\]a__VV`S_]]^YBBB	chr10.fa		5079978	F	36	105					
+HWUSI-EAS610	1	4	94	750	1362	0	1	TGCCCCGTCTGTCTGTCTGTCTGTCTGTCTCTGTGT	^___a]_]`a__]`]]]ab``b\QT_]W\]^`XBBB	chr10.fa		5080438	F	36	33					
+HWUSI-EAS610	1	4	58	1507	1854	0	1	TGGGTGTGTGTCTGTCTCTGTATATGTGTCTGGCTG	aa\`GaU\N_`_Z\P__\[`\__S_YQ_WWW\[UW[	chr10.fa		5080547	F	36	26					
+HWUSI-EAS610	1	4	84	1023	1193	0	1	GTCTGTCTTTCTGTGTATATCTGATTATCTGTCTGT	aSTaa\a``a\_^J]__a_a`Za`a\S_^aa[L^``	chr10.fa		5080622	F	36	118					
+HWUSI-EAS610	1	4	27	964	1287	0	1	CGTATGTCTCTGAATATGTGTCTGTCTCTCTGTCCT	a`_abaa_aaba^aaaba`a`^ba]``_a__``Y_a	chr10.fa		5080834	F	36	119					
+HWUSI-EAS610	1	4	46	87	1689	0	1	CTTGTGCTCCATCCTAGCTTTGTTTCTTTGGTTTAA	aa_a^ababaZ_aa_aaa_``a^``a_a_aa]a]RB	chr10.fa		5081158	F	36	114					
+HWUSI-EAS610	1	4	24	1345	1636	0	1	GAGTGGACAGAGGAAGGAGTCAAGGCGGCCCCATCA	_[aT`]^XZXZ]\K[]^ZTRR\\XFXZN[KTX\RTB	chr10.fa		5081455	R	24T11	102					
+HWUSI-EAS610	1	4	66	760	842	0	1	CGACACTCTGTGCACAAAGCTCTTGCTTGCAGCTTG	ZZ[T`_aXOU[a_aa_Z_aXa`\`_`a\^ST`^]UX	chr10.fa		5081854	R	36	118					
+HWUSI-EAS610	1	4	90	1044	374	0	1	AGCTGTCTTCTCAGTATCTAGCGCTAAGCAATGTAA	aa`aa_`aaaa^`a^`a_`aZ_a`a_aY__`_`^aa	chr10.fa		5081891	F	36	119					
+HWUSI-EAS610	1	4	55	1225	1717	0	1	GGTTACATTGCTTAGCGCTAGATACTGAGAAGACAG	`a`a_^aa_a_a```\a_a_a_``]_`]`__]]Y_`	chr10.fa		5081893	R	36	119					
+HWUSI-EAS610	1	4	7	1129	174	0	1	CAAGGTAACACCTGGCATGTGGCGCCTGTGAGTGTG	abbababbbbaa_`abbaba^]baaaa`aa]`Za``	chr10.fa		5081928	F	21T14	85					
+HWUSI-EAS610	1	4	56	730	915	0	1	GGGAGATGTCATGGTTACATGCCTCACGGTTGACCT	`Z`ab]J^Ra``]`^a`_]\a``_aY\`aO^^^ZQZ	chr10.fa		5082040	R	36	118					
+HWUSI-EAS610	1	4	44	158	399	0	1	GGTCAACCGTGAGGCATGTAACCATGACATCTCCCT	a`_abababXbZabbaab_bab`La_aaVX_^baa_	chr10.fa		5082041	F	36	119					
+HWUSI-EAS610	1	4	60	961	78	0	1	GATGAGTCTGCTTTCAAGATGAGGGAGATGTCATGG	aa_aX^[a`^V`aaaaba_`__aa_^_UZ`SR^Ya`	chr10.fa		5082062	R	36	119					
+HWUSI-EAS610	1	4	78	1483	1404	0	1	TGTGGCTCTGTGAAATCAGCCAGGAATGTTTCAAAG	aa_a`__```U`]^a_]_][^`__V^Y]R]_Z_]YZ	chr10.fa		5082118	F	36	119					
+HWUSI-EAS610	1	4	87	1144	784	0	1	TTCTCTACCAATCTCCAGCATTAATAAAATGATATG	aaZa`aa_`_X__a__`__``a`_```_^[^^[Z][	chr10.fa		5082160	F	1A34	81					
+HWUSI-EAS610	1	4	11	1004	93	0	1	GACCCAAATTAGCATATCAGAAGTAACTTTGCAGTA	aaaaabaaaaa``aaaaaaaaaa]aaZ``_a^_`^a	chr10.fa		5082667	R	36	119					
+HWUSI-EAS610	1	4	47	803	827	0	1	CNTATGGTTTTATAAAAGCAGTTTTTTCATCAAATA	\D^aaba^bababa\aba_ab`_aaab`abaaaaba	chr10.fa		5082747	R	1A34	110					
+HWUSI-EAS610	1	4	68	162	98	0	1	CACATCTGGAATCCCAGGACTCACGAGGGCAGGAGA	aabaabaa``\^aaa_`[Y`^a_``^^\^_^^^\_U	chr10.fa		5082862	F	36	119					
+HWUSI-EAS610	1	4	2	1319	827	0	1	AGAAAGTCTTCATCCGCTTTGTTGGATATGACCTGA	aaaaaa[aaa`aa^_`_aaabWaa_\`^_`__X^a\	chr10.fa		5083132	F	14T21	83					
+HWUSI-EAS610	1	4	92	1089	214	0	1	TTCAGGTCATATCCAACAAAGCGGATGAAGACTTTC	aaa_`a``aaaaa`aa`aa_^__`]`^^^\^Y`^`\	chr10.fa		5083133	R	22A13	83					
+HWUSI-EAS610	1	4	66	453	603	0	1	CTCCAATCTCAGTGGAAGCTGGCAGCTAGAAAACCG	^]`b`bb]aT^^]a\]^^]a_[HR\_`Z\NPUZ]_`	chr10.fa		5083673	F	36	118					
+HWUSI-EAS610	1	4	87	284	1814	0	1	TGAACTGCGTCTGACATCCAGTCCTGCAGTTCTTTA	K]V]abaZaUab_^baNa^X`_a`bab_b^`_`WUa	chr10.fa		5083784	R	36	118					
+HWUSI-EAS610	1	4	25	1255	1554	0	1	CCAGCTTGAGCATTCTGCTGTCCAGCACACTTTTAT	_Qa\R[_Y^[SZa]^_Y`bb_ZY`a\[TMOYa``V^	chr10.fa		5083852	R	36	118					
+HWUSI-EAS610	1	4	77	616	1695	0	1	ATAAAAGTGTGCTGGACAGCAGAATGCTCAAGCTGG	a`^```b_aZ__a`[`a`aaU`aaa]_`W_N\_`_`	chr10.fa		5083852	F	36	119					
+HWUSI-EAS610	1	4	78	1303	1288	0	1	GGGTTGAAATGAATGGCTAATGCTTAGGGATGAGCA	a^`Zaa_a`__^__`a^__`__]____]]]]T\Z\_	chr10.fa		5084005	R	36	119					
+HWUSI-EAS610	1	4	28	1014	1345	0	1	TAATACTGTCTGTGGATGAATGTGTTGGGGTTGAAA	aa``SX^^\]a`U[]VY[VQ_]V\TX__\[W[XU[W	chr10.fa		5084032	R	36	118					
+HWUSI-EAS610	1	4	65	151	916	0	1	TAATACTGTCTGTGGATGAATGTGTTGGGGTTGAAA	_^^]Kaab]aaa]\[Q\aRV_a]aUaabbaa__Y_X	chr10.fa		5084032	R	36	118					
+HWUSI-EAS610	1	4	43	1482	1244	0	1	AGAAAAGTAAATTGAATAAATGAATTAAATGTCCCA	aa```ab_baab^YO\`aaba^`_aa]]RYN^`aaa	chr10.fa		5084162	R	36	118					
+HWUSI-EAS610	1	4	37	408	1925	0	1	AACATGGGAGGCTTAGGAAGGCTAATTCCTAACTCA	aaaXaa^a`_`a]__a_[``\\_a_^^`_^[_^]_`	chr10.fa		5084536	F	28T7	83					
+HWUSI-EAS610	1	4	84	813	68	0	1	CCATCATTCCTAAAAGCTTGAGTTAGGAATTAGCCT	aaaaaaaba`aa`aaa`aaaaaaaa`^^`aaa`^^a	chr10.fa		5084554	R	25A10	82					
+HWUSI-EAS610	1	4	100	324	1240	0	1	AAGAACTGGGCTCGGGGTTTAATGATGGAAAGAGCC	```Waa`^]`a\a`aaaW`_\a__`_a[YY`_[^W[	chr10.fa		5084627	R	36	119					
+HWUSI-EAS610	1	4	45	1495	1915	0	1	GGAGGGATGGGAGGAAGAGAGACATGGAGGGAGGGA	V[Q_`ZT^a\\H``X\_XR\_VKN^`^]`]]S]]`B	chr10.fa		5084755	R	36	113					
+HWUSI-EAS610	1	4	34	929	521	0	1	GATGATGGTGATGGATGGAGATTTGAGGGAGATGAA	a_a_]_a^Y\LZUZ]_``Y`UW_`^Y__^W_SU^Y^	chr10.fa		5084921	F	36	118					
+HWUSI-EAS610	1	4	3	644	1673	0	1	CTCTAGGCTCAGCTGAGATGCAAAAGTTGTCAGCCA	aaaa_`aaa_aaZ]^Y_a\Ja`a__`U_a\_^a_T]	chr10.fa		5085044	F	26G9	93					
+HWUSI-EAS610	1	4	81	1536	486	0	1	CAGAGCTTCACTCACCTCTTACATCGAATTGCTGCA	ab]``]^aaaaaaa]_aaba^Ya`_Y_aa[T`__`a	chr10.fa		5085628	R	36	119					
+HWUSI-EAS610	1	4	23	1060	1166	0	1	TAAGAGGTGAGTGAAGCTCTGCTCGATGCCAGTGAG	aY_a_a`[SH\Va`\`Z_\^`S\_\_WYSWS_W\UV	chr10.fa		5085643	F	36	118					
+HWUSI-EAS610	1	4	52	476	1206	0	1	AAAACAGCCACCACTGGAATATCCCGTTGCCTTTCA	\X\a^`^``aa]a\^`a_Zaaa\\_]]`b]Y`aa`]	chr10.fa		5085686	R	36	119					
+HWUSI-EAS610	1	4	5	821	630	0	1	AGGTGGAGGAAAGAGGAAGCTAGGACGAAAACAGCC	abbZba_aa\aaa_aa`aa_aaaa_Za^a``Z`a__	chr10.fa		5085713	R	36	119					
+HWUSI-EAS610	1	4	5	1288	1185	0	1	GTGTCTGCTGAGACCTGGTCACAGTATGAAAATTAG	\aa^abaUZY]]]`^`aa_Z_W_^W[_\]`ZYX`^\	chr10.fa		5086551	F	36	119					
+HWUSI-EAS610	1	4	65	748	1273	0	1	CTTCGGGAAATATTGCCCCGTTCTCCGTTGTGATTT	abV[[__\_Zba]\]WYZZ_R`]]\\_Q^W^^KX^a	chr10.fa		5086682	F	36	118					
+HWUSI-EAS610	1	4	40	297	732	0	1	GGATTTGGTAAACGCAGGCTGGCTAGCTATCCCAGG	``bb]]\``b````a^]U^V[Z]bba_Zaa^aZQ`S	chr10.fa		5087011	F	13C18AG1C	7					
+HWUSI-EAS610	1	4	42	854	1231	0	1	ATGGCATGAGGTTTAATTTCCCCAGGTGTGCACTCC	ab^a__aaYa\`b_\V`ba`aa^]`a^][a`a__ZZ	chr10.fa		5087375	R	6C17T7T3	9					
+HWUSI-EAS610	1	4	57	624	356	0	1	GAGCTGAGTTTACTATAGTCTGCGTGGAAATCCTTC	a]a_aa]a]_\___Z`_]__Y[^]U\Z_`_`X^]^^	chr10.fa		5087940	F	36	119					
+HWUSI-EAS610	1	4	77	711	806	0	1	AAAGATGAACATCTCACTTCCCTAAGAGCCCCTCAT	a]\]^aaXXX]\T__ZV[^[UTG\THUWXYORWV]\	chr10.fa		5088169	F	36	117					
+HWUSI-EAS610	1	4	63	1348	1064	0	1	GGAGTGAGTTCTGGGACAACCAGGGCTACACAAAGA	aa^a\a]a_aZa`a_\]aa^WQ`X___`[_^____V	chr10.fa		5088241	R	36	29					
+HWUSI-EAS610	1	4	83	1645	154	0	1	ATGGAATCTATCATGGCAATCGGCTGAGGAAGGAAG	`a_Naa_``aUYYQU\`__`]XUXZ][URR[GWYUT	chr10.fa		5088637	F	36	117					
+HWUSI-EAS610	1	4	39	727	638	0	1	GCTCTGTCATGGCTGCCCTCTTGACTTCAATGGTCT	a_b``bSaa[`a_aa]_Qa[_`_ROZ_Z_\]``QQ\	chr10.fa		5089658	R	36	118					
+HWUSI-EAS610	1	4	86	1163	1266	0	1	CTGGATCAAATCCAAATTGTCAGGTTCACTGATAAG	abbb`baaaaa]aabaaabaaaaa^aa`^a`_`aaa	chr10.fa		5090661	R	11T16G7	50					
+HWUSI-EAS610	1	4	24	530	312	0	1	ACATTGTCTCATGGGCATTGGTGTCACCCTCATGCA	Iaa_ZQO]R__aa_ZT[J[]VL]OZWEQ\QZ`]aZa	chr10.fa		5091099	R	36	115					
+HWUSI-EAS610	1	4	47	1380	1921	0	1	GGAATGAACCCTTTGGTTCTGATAGAATTACCTGAA	a\aaab_a]W\[Za^`]aX`_`]__^\`\SVYYP\W	chr10.fa		5091144	R	36	119					
+HWUSI-EAS610	1	4	74	271	1791	0	1	TTTTGTTGGTTTAAGTTGCCCAACAAGTGATAGGAA	Jaaabb`b\bba^b_b\a_^`W^babb_bab_b`VT	chr10.fa		5091285	R	36	118					
+HWUSI-EAS610	1	4	57	1449	885	0	1	CAGGGGTTTGTTTTCGTCACTAAATTGTAAATTCCT	aabbb`_bbbaabaaaa``Jbbbabaa`aaaab_`a	chr10.fa		5091735	R	36	118					
+HWUSI-EAS610	1	4	100	405	1868	0	1	CCTCCCTAAGCCCTACCTAACTCTGCAGGTGTAAAT	_b`bbb]Z_`bbb_W]_QHTa_baab]`aTa_`_a^	chr10.fa		5091851	R	36	118					
+HWUSI-EAS610	1	4	46	282	940	0	1	AAATCCCAGTACACTCCCTAGTGGGACATGGTGGCG	]YH^a^]M_T_S\a^a`^_]]NY`aXXX^a^U`BBB	chr10.fa		5091954	R	34T1	102					
+HWUSI-EAS610	1	4	74	803	562	0	1	ATGGGACCTGCTGCTAGGTGACTTCAGACAGTAAAG	abbaaabbbababb_bbbVbb_bba^ba^bbabaaa	chr10.fa		5092187	F	36	119					
+HWUSI-EAS610	1	4	2	1194	52	0	1	AAATACTAGAAGTTATGCAAGTTACAATTTCATTAA	aabab`aa`aa[Xaaa^_aaa__a``_^]`[_^___	chr10.fa		5092317	F	36	119					
+HWUSI-EAS610	1	4	79	794	1630	0	1	GATATTCCTCTCGGTCTCAAGAGTACAGGCTTGTGA	a^]aaP\\U^_UT\QQa_^^XMZV[a`_[X]]_XVU	chr10.fa		5092521	F	11T24	92					
+HWUSI-EAS610	1	4	51	1182	297	0	1	ACAGGCTTGTGACACCCAACAGCTGTTACCATTCAC	ab`b^aabaa`aaaaa_N_[aa``]^a_\VX^a\__	chr10.fa		5092545	F	36	119					
+HWUSI-EAS610	1	4	37	1675	912	0	1	TACCATTCACTTGTGAGCAGTTGACTTTGTTGCTTT	a^H`aaa``_aa^^`___]_\Y\\V^^a]^_[^^a`	chr10.fa		5092571	F	36	118					
+HWUSI-EAS610	1	4	25	425	296	0	1	GAGCTCAGCATTTGCTTCCCAGGGCGTCTGGAAGTG	a[``^aa_aba_]`^a\``_XR[^`a_W`b_JY`^a	chr10.fa		5092622	R	24T11	82					
+HWUSI-EAS610	1	4	68	854	1034	0	1	TTGGCATAAATACTTGATACATTGGATAGATAAGAA	a_X_\aaba_aaaaaa`aa`_ba`a_a`^O\V`___	chr10.fa		5093178	F	36	119					
+HWUSI-EAS610	1	4	62	1386	1001	0	1	GAGATAAAATTAAGAAGATTGGGCTGGGGAAGATGG	ab\S_`_`Y`b`_`a_]_bbb\H`S\`K^VZ____B	chr10.fa		5093277	F	36	113					
+HWUSI-EAS610	1	4	99	261	1825	0	1	ATTAAAGGCATGCAGCACCATGCCTGTGGCCTCTTT	aa_WZZO^_SZV`^^baUZMQZV_`XWYWUWSTWWW	chr10.fa		5093539	R	36	37					
+HWUSI-EAS610	1	4	37	919	1166	0	1	GGCAGAGGCAGGCATATATCTGTGAGTTTGAGGCCA	aa`_aU^a[TVXY__`aa^^aaVUOa_`_`Z\]YZ_	chr10.fa		5093589	F	36	9					
+HWUSI-EAS610	1	4	48	872	796	0	1	GCTGGCCTCAAACTCACAGATATATGCCTGCCTCTG	aa^Z_^_aY`___`_`_``^```___^ZW_Z[_^_`	chr10.fa		5093591	R	36	30					
+HWUSI-EAS610	1	4	46	567	949	0	1	AGACTAAGTATCAGATAACTACCGATTAAGGCCGTA	TLZbba\b_bb`[b^baaab_b\bWaaXM^a`SF[a	chr10.fa		5093722	F	28G4A2	90					
+HWUSI-EAS610	1	4	31	416	807	0	1	AAGCACACGGTGGCACTTGTTAGTGTTGTCTAAGGA	_]aabab`a[^]^`_a^^a_`[a]a]_`Ta```^__	chr10.fa		5093785	F	36	119					
+HWUSI-EAS610	1	4	13	354	587	0	1	GTGTTGTTCCGTGTCCTGTGCACACAAGGACACAGC	aSa^aa`_a_aYaVaaaa\`a^P``a`_`a\`__aV	chr10.fa		5093983	F	36	119					
+HWUSI-EAS610	1	4	62	1665	1014	0	1	GTTCCGTGTCCTGTGCACACAAGGACACAGCGATGC	]]abaa]XX`a]a`^^aab\]`]aVWa_\X[QTVXR	chr10.fa		5093988	F	36	119					
+HWUSI-EAS610	1	4	92	204	660	0	1	TCCTGTGCACACAAGGACGCAGCGATGCACTCCGAC	`R_aa``\_^_W\`Za^UK]^`^^VV\`ZZXWVZNX	chr10.fa		5093996	F	18A17	103					
+HWUSI-EAS610	1	4	86	1131	533	0	1	GGAAAGTCGGGGTTTTGCATGCTGGGCATGTACCTT	`_WZ\Ja[[_QZFaa^\M_]]RYL_J`aa]`a[J]b	chr10.fa		5094362	F	36	116					
+HWUSI-EAS610	1	4	31	1118	2041	0	1	TTTATAAAAAGCAACACATGCTATTTAATTGTTTAG	a_VXY[`a]Y`_W^X_YTW]]]ODXYTXT[a]a\SY	chr10.fa		5094592	F	23C12	110					
+HWUSI-EAS610	1	4	65	159	1751	0	1	CTTCCAGGACTATAATCTAGGGAATGTGGTAGCCCA	_]\a_a^`^a`_^TZ]`]U``^TY\a^`[[``a`_[	chr10.fa		5094754	R	36	119					
+HWUSI-EAS610	1	4	46	121	401	0	1	GTCTAATGTTAACTCCAGGCTGGAGCAGCTGGCTCA	[abb\TY[TW]X`ab_H[bbZ^]TT\XW[EKX[BBB	chr10.fa		5095447	F	9G26	75					
+HWUSI-EAS610	1	4	11	891	174	0	1	TAAACTCAGTACTTCACACCAGGGAGGATGTGATCC	aaaa___`aY_]_W]_^^^^_]^]]_]XU]XX]YYU	chr10.fa		5095584	F	36	119					
+HWUSI-EAS610	1	4	26	1722	765	0	1	GGTCCTAAGTGTCTTCGTGAACTGAACTATGAACTA	aa_a\`ab`X`Y^_aa_^___`_`^`]`_`Z^_Z__	chr10.fa		5095912	R	17C18	84					
+HWUSI-EAS610	1	4	96	126	349	0	1	AAGGGGAGCCTTGAAATGCCTTTTTTAAAGAAACAG	\X\_aZ]______^^a^`^^_]a_]__^X_^a_\_^	chr10.fa		5096494	F	36	119					
+HWUSI-EAS610	1	4	18	1288	1780	0	1	GGATCTTCTGGAGAGAATATGATTTCTACCCGTGTT	aa^_]_]_]``Y_Y_\Y`__`^]]]]WSSRY_X_^\	chr10.fa		5096675	R	27G8	95					
+HWUSI-EAS610	1	4	58	873	5	0	1	AGGGGATCCTGGATGAGACTCACATAAGCAGTAGGA	ab`_aaaaaba]_a_a`a`aa__`aX_KV`a[_``B	chr10.fa		5096844	F	36	114					
+HWUSI-EAS610	1	4	2	1113	1437	0	1	GAATGTGGCTACCAAAATCGATAAAGTCGATGAATC	_ZYZ_MYXX`ZU\RXBBBBBBBBBBBBBBBBBBBBB	chr10.fa		5097196	F	36	28					
+HWUSI-EAS610	1	4	15	1152	1495	0	1	CTAGAAGCATGTGTGCTCTTTCTGACTCCAAGTGAT	aa^a_]]aK_VYW_aabTbb`]b[WS\Va__Ya_`a	chr10.fa		5097359	F	36	118					
+HWUSI-EAS610	1	4	58	1554	1737	0	1	GGCTAAAGCTGGTTCACTTAAGTGTGACGGCGCGCC	Za`]a`]N_XZ^K\`aX`]L[aX]YTTYPMMNV[Z\	chr10.fa		5097447	F	31T4	99					
+HWUSI-EAS610	1	4	10	390	438	0	1	TGACGGCTCGCCATCTGAATGGCCTATGTGCAGCTT	a`b_RX_P_[```b`\\XbY_]H_]^baQZYVNLV_	chr10.fa		5097471	F	36	117					
+HWUSI-EAS610	1	4	66	609	1695	0	1	TTATCTGAAGTCATCCTGTATGTCCTTACCGTTTAC	Y``bababb\^_Va\UY\V_J_Yb]]`a_Y\[`^ba	chr10.fa		5097716	R	36	118					
+HWUSI-EAS610	1	4	90	1245	255	0	1	GACATACAGGATGACTTCAGATAAAACCTGGAAACT	ababbaaaaaaaababbaabaaaaaaaUaa_a`a_b	chr10.fa		5097728	F	36	119					
+HWUSI-EAS610	1	4	16	392	1686	0	1	ATAGTAACCCACTTTTTTCTCAGGCTTTATTAAAAG	aY_R]b\]aTWWRXSSV^ZURLZZIa_a^Sa[YBBB	chr10.fa		5098146	F	24T11	91					
+HWUSI-EAS610	1	4	76	14	1229	0	1	TATTAAAAGACATGGAGAAGGGCCACAGTTTGTTGA	^H_`a_V_``bababba^[_abbbba_b_aaaab`V	chr10.fa		5098173	F	36	118					
+HWUSI-EAS610	1	4	52	830	346	0	1	CAATGAAATTCCTAGCGGAGCATGAGGCTGAGGCAC	abbb`baabba`aabaabab`aba_aa`aa`a`_`\	chr10.fa		5098236	F	36	119					
+HWUSI-EAS610	1	4	100	383	194	0	1	TGTGCACAGGATCTCCTGGTATTCTGCCGTCCACTG	a]XaZ]`UV^^XYa`TYa`I[a^OYa^XUEOXVPVa	chr10.fa		5098403	R	28A7	90					
+HWUSI-EAS610	1	4	75	888	1246	0	1	CTGCTTTGGCATTACTTTTCCTATTAGAGACTAATA	`a`abaaaa^G]aa`aabaaaaaaaaaa``_`aaaa	chr10.fa		5098641	F	36	118					
+HWUSI-EAS610	1	4	77	1090	858	0	1	CGGATTGATAGATAGGTGGATACTTGTGTGTATGTG	a`^_bbb_aab_a]`a[bba`^`aaaXa_a`^a_Qa	chr10.fa		5099281	R	36	119					
+HWUSI-EAS610	1	4	12	1145	1611	0	1	AGACACACACACAATTCATGGCTCAGTACCTTGACA	X`[XaZ\\^_Yaaba`^`aa]Ya_`b`_SXaaaa^a	chr10.fa		5099385	F	36	119					
+HWUSI-EAS610	1	4	69	761	592	0	1	CACTCAACGCTGCTTCTGAGGAAGTGTGTGGTGTTT	abbabbb`babbaabaaaaba^_aYa\a[ab]b_aa	chr10.fa		5099428	F	36	119					
+HWUSI-EAS610	1	4	6	1092	1721	0	1	GGTGCCAGACCTGGTGGGGAGGCCAAGGCACAGTAG	`\K^\\^\\SR`a^P\aa]]^\TZ\Z^]P\RS`S\\	chr10.fa		5099473	R	36	118					
+HWUSI-EAS610	1	4	55	1443	402	0	1	TGGCAGTGCACTTGCTGAGACAAGCTCAAGACATAC	[SY_`a\]]^_aa]aa``a^aa^]`aa_^W]^^`aa	chr10.fa		5099586	R	8T27	85					
+HWUSI-EAS610	1	4	86	1645	954	0	1	GAGGCCATTCCATGGTTTGCTTTCCTCTGTATTCTA	\I\`aaaa]`a[__GS`a_``]^Z_^^aS\Z_^`^_	chr10.fa		5099824	F	7C28	79					
+HWUSI-EAS610	1	4	30	504	1521	0	1	AAGGCCCTGGTAAATACTTATTGAACCAAAAAGTCC	\bbbaaabbaababababa`bbabbabbbb_bb\bb	chr10.fa		5099910	R	24G11	80					
+HWUSI-EAS610	1	4	67	1348	148	0	1	TGGGGAGCTTACATCTGCTACCTCCTCACCTTTGCT	aa^P]_[U_`^^__^]NW_ZVS[WS_\_TVZVVNT\	chr10.fa		5100201	R	32C3	91					
+HWUSI-EAS610	1	4	15	882	1041	0	1	TTGGGCTCAAAAGTCAACTCTGACATGTCCCTGGTT	a\YZbaa`a``[\Y_W]`a`aa\Z[aaVOQLZaa]`	chr10.fa		5100528	F	1G26A7	66					
+HWUSI-EAS610	1	4	33	421	1219	0	1	AAGCAGCCATTTCTCTACCTCTTGGAGCTCAGTGTT	a`bb]aaa]baabaaaabaaa`_`a`aa_`_`Va^a	chr10.fa		5100618	R	9C26	80					
+HWUSI-EAS610	1	4	4	1145	1896	0	1	CATGTGCATGTACATGCATGTGCGTACACACACAGA	^a^ZR^ZZ^^WTRY^]_Z`a\a^a\ZYZXV[_UXBB	chr10.fa		5100786	R	24C2G6C1	44					
+HWUSI-EAS610	1	4	76	225	166	0	1	TGTCTCAGTCTTCTTCAGCTGCCTGCTGAACTGGAT	aa_a`ba]_a`a`b`abaa__`a`\a`a_``aa__\	chr10.fa		5101135	R	34T1	83					
+HWUSI-EAS610	1	4	93	936	983	0	1	CATAGGAGACCTCAAAACTTGGCCCACAGTGACAAC	_baa\\_]]]`\RY^_[]`b`a`a`a]]bRbb`^BB	chr10.fa		5101188	F	4A31	77					
+HWUSI-EAS610	1	4	62	1326	1768	0	1	ACTCAAATCTTAGCACCAGGCTTCTTAATACATTGC	\VaZ]baaaaaS`S`^_`UZY^`Vab`aa``YP_Q\	chr10.fa		5101383	F	36	118					
+HWUSI-EAS610	1	4	62	310	1945	0	1	AACTATGGCATGTGGACTATTTTATGGAATGATCTT	abaa^`aabaa]_aa``]Xaaaaa``[Z[[___`_`	chr10.fa		5101724	F	36	119					
+HWUSI-EAS610	1	4	47	940	1522	0	1	GTATTTTTCTATCCTTATTTGTGAGGGGAAAAGTTT	a^_baaa`_``^[]a_W]b`a_`^^__^X^^^a[__	chr10.fa		5101860	R	36	119					
+HWUSI-EAS610	1	4	40	1548	425	0	1	ACTAATCTTTGATCAGACCTCCCTGAACATTCCAGA	aabbbaaaab]aa[aaa]aaa_^``a`_```_\```	chr10.fa		5101894	F	36	119					
+HWUSI-EAS610	1	4	90	559	1269	0	1	AGACTGTACAAGCTCACCTGCAGGGCACAACGGCCA	aa``^]ZaaaU`V^a`aaZaa_[Uaa`_aXWZX`UB	chr10.fa		5103469	F	30A2A2	50					
+HWUSI-EAS610	1	4	53	1212	1170	0	1	TGAGCTGTGCTGCAGATCGCTGAGTAACTGTCCTTT	aa__[_`V\[__^___^\`\__Z^W_[W_^W[Y^^_	chr10.fa		5103497	R	36	119					
+HWUSI-EAS610	1	4	88	381	285	0	1	ACCCTTTATGAAGTCTAGCCTTTCTCTTCAGTCCAT	aT[^\_S`__aSTX^[R]PZ[VSZ^_WWXa_GSGY_	chr10.fa		5103566	R	36	116					
+HWUSI-EAS610	1	4	73	863	506	0	1	AAAAAAAGTTGTGAACTCTGTCTTCTTACTTCCTAT	a`a``U[YV`ZZZU\[`]aaUSaa`a^\\_`_]`^_	chr10.fa		5103642	R	36	119					
+HWUSI-EAS610	1	4	69	1192	1597	0	1	TAGTGGATGACTCTATGATCTTTGAACCCTGTGTAA	aba`b\_bbaVWaaWGX`\_a`^bb_```aabba^T	chr10.fa		5104352	R	36	118					
+HWUSI-EAS610	1	4	37	1202	806	0	1	AACTCGAAATGCATTGTAGTGGATGACTCTATGATC	abababbaaaa^abb]]abQa`a_a`[``aa_[_a_	chr10.fa		5104368	R	36	119					
+HWUSI-EAS610	1	4	14	983	1142	0	1	GCACTTATTTTAGTGCCATTTCATTCACAAAATGAA	aY^SaY[_a^^PWRa]^aa_XX[Y`SZT_W_]]PW]	chr10.fa		5104656	R	36	118					
+HWUSI-EAS610	1	4	18	1518	887	0	1	CAGTAAATAAGAATTATTCTTTTAGTGAAAACCAGT	aab][]`]`^[[`````a`aa`]_XUaY\]^WY^_[	chr10.fa		5104881	F	36	119					
+HWUSI-EAS610	1	4	80	832	1417	0	1	AGAAAAAAATACATTTTCATGGTCTAAGGAATCAAG	abaabaaaaa`a]]abaaX[aaW_baaa[_a`\aa_	chr10.fa		5105337	R	36	119					
+HWUSI-EAS610	1	4	78	996	84	0	1	TACTAAGTTACATTGGCTATCCTTGAGCTCACATTA	a`_b^^X]_]ZY__Y]Za]\PXUWST[V\ZOQVY]W	chr10.fa		5105387	F	36	118					
+HWUSI-EAS610	1	4	28	316	373	0	1	ACTTTTCTAATTCTGATGCTCTTCTGGAAATAAACA	Xabbbbbbababbbb]abaabbbbbb]ab^bababb	chr10.fa		5105795	R	36	119					
+HWUSI-EAS610	1	4	24	1656	1587	0	1	ACAGAGGGAAACCTTCCAGAACCTCTGGCTTATGTT	a__`^]a_UZ`SY_^\ZZPY\W_]]ZYOV_YW\YY_	chr10.fa		5105908	F	36	118					
+HWUSI-EAS610	1	4	71	576	27	0	1	ATTTATAGTGATGCTTTTAGAGATAGAAGTCAACGT	aabb_bb_`bbbb`abbbbbbbabbbbab_abbab`	chr10.fa		5106164	F	36	119					
+HWUSI-EAS610	1	4	95	737	308	0	1	CTTTTAGAGATAGAAGTCAACGTTCACATCTCAACT	abbbbbabbbbbbbaabbbbbbbbab`ababaaaaa	chr10.fa		5106177	F	36	119					
+HWUSI-EAS610	1	4	77	993	10	0	1	AATATGAACTCCAGAAGCATGTCAGCAGCCAAGACT	abba\Z]b_Uaa\_\^YYXb`V_a_W]Y\_USWV\_	chr10.fa		5106243	F	35A	83					
+HWUSI-EAS610	1	4	2	202	925	0	1	TGTCAGCAGCCAAGACACTTTGCAACAGTGCCAGGC	aaX_`a_LT`V[T]U[Qa[[Xaa_aaV\PU``V]]V	chr10.fa		5106262	F	36	118					
+HWUSI-EAS610	1	4	58	680	1145	0	1	GCAGGTAGTGGAATCTGGGAAGTTTTATTATTAGGA	aa_bb``a`aaXaa`aaaa^_a_aaa]`a`a`__a\	chr10.fa		5106370	F	36	119					
+HWUSI-EAS610	1	4	56	1029	916	0	1	ATTCAAAACCATGCTGGTTTCTGGGAATAGTGAAAT	abbaaaa\aaabb`ba^]baabb_^[aa`a`ba_aa	chr10.fa		5106421	F	36	119					
+HWUSI-EAS610	1	4	4	723	993	0	1	CAGGACCACATATGCATGTTCTCCCCATCTCTATGG	`bbaabbb_bbaaaa[_bbba\ba]Z_`U`Mb`ba`	chr10.fa		5106489	R	36	119					
+HWUSI-EAS610	1	4	84	1686	1919	0	1	CAGCAGGAGGTCTGTGAAGGTCTGTGATTGGACAGG	a`b``aaUaaPS`X^a``aa\_]]T`^]_`^U^[^]	chr10.fa		5107038	R	36	119					
+HWUSI-EAS610	1	4	92	1011	1332	0	1	GAATCTCTGGCTAGAGGACCAGCTGTGTGGATATTT	YZba`\^`aa_TMXEX\]_XQZVRUZ]XPJWVVFUV	chr10.fa		5107496	F	29T3C2	91					
+HWUSI-EAS610	1	4	96	1233	1749	0	1	AGGAGGGGAACAACAGTTTGGGGAGGTAAGTATTAC	ab_RRbbb_a_^a[ab[]baa`aN\b]WHXY`_aBB	chr10.fa		5107592	R	36	109					
+HWUSI-EAS610	1	4	70	324	178	0	1	CACACACAGTGAGCTTCGAAAGTAATTGGTGAGTGG	`__aaaa``Y``a^`_aaX]\aW`]`^a`Va^aV^`	chr10.fa		5107676	F	6G29	81					
+HWUSI-EAS610	1	4	50	245	344	0	1	TTATCCTGGTTAGTGTAGTAAATCCTGCCCTGTGGT	aaZaaa`aaaa\ZJ\`[a\b^_Na`^_`aZ[]Sa`W	chr10.fa		5108647	R	36	118					
+HWUSI-EAS610	1	4	11	323	1438	0	1	TGGGTAAAGTGCAGGAACTTGCCGTTCATTTTAATA	abbaU`b]aUaaaab_[`aaaaab_`a^]H]a_a_^	chr10.fa		5108744	R	36	118					
+HWUSI-EAS610	1	4	7	1149	923	0	1	GAACGGCAAGTTCCTGCACTTTACCCAGCTATCCTT	aaa_`a`a_aU^_[_[[`]a``a_\U__\_\_\\^U	chr10.fa		5108753	F	36	119					
+HWUSI-EAS610	1	4	86	828	1288	0	1	AAATTAGGATTCTAGTCGTGGCAACCAGAGTTTGAG	a]`aa[aaYa`_bU__]aaaa_aa[_`]FZaaabZ`	chr10.fa		5109046	R	36	118					
+HWUSI-EAS610	1	4	47	1656	1776	0	1	AAACTCTGGTTGCCACGACTAGAATCGTAATTTTGT	aW_aa`a\a]aa`Saa^RIa__^WPXF[_VN[a\[B	chr10.fa		5109049	F	26C9	103					
+HWUSI-EAS610	1	4	68	452	84	0	1	GGAGAGAGGGGCTTTTTGATGGGGATAGCGAGAGGG	ab`baaaa_a^]Z]_^`aSZaa``]_]`\a\_Sa`^	chr10.fa		5109171	R	36	119					
+HWUSI-EAS610	1	4	26	1556	569	0	1	ACTGGGAGNGTAGGCGGGACTTTTGGAGGAAGAGAG	a`b``]^WDPX][\_XZR]^`_`^UWUX^W[\[[[Y	chr10.fa		5109213	R	8A27	110					
+HWUSI-EAS610	1	4	100	1259	264	0	1	AATGAATAAAGGCATCAATCACTGGGAGAGCAGGCG	aaW^`a\\a_VNR[`__a[aaQa[J[QZQVFV[]NT	chr10.fa		5109233	R	30T5	22					
+HWUSI-EAS610	1	4	16	1398	1804	0	1	TATTNATTAGGGGATGGTTCACAAGGAGTCGCCTGA	aba\DY`_aaaa`a^aa]a``]a_^_^_\^aVW^`_	chr10.fa		5109261	F	4C31	12					
+HWUSI-EAS610	1	4	55	918	469	0	1	CCGCACTGTATGCCTGCCTCCCACTTGAAAGAAGCC	abaababb`abaaaaaa`a`aaa_aaa_aaa_aaaa	chr10.fa		5109403	F	36	119					
+HWUSI-EAS610	1	4	40	1164	2007	0	1	TAGACACTGTCTTCCTGCCAGAGTGTACAGGCCCCC	abaa`a\\aW\]a^\`_^]a\_]G_\]P]^]]]P_Q	chr10.fa		5109570	F	36	118					
+HWUSI-EAS610	1	4	84	444	872	0	1	TAGACCAGGCTGGCCTCAAACTCACAGATACTTACC	_bb\`ab`bbbabbaabb`bbaaaabab^bab_`aa	chr10.fa		5109993	F	36	21					
+HWUSI-EAS610	1	4	30	1163	241	0	1	AGCTGTCTGGGCCAGCTGCCCTCCCCTGGGTCATGG	`^`]YU\[OSMR\]PZQVXS\XOQKRNRXRNRONVZ	chr10.fa		5110103	F	36	116					
+HWUSI-EAS610	1	4	95	1019	1044	0	1	TGGGTCATGGGATGTGAAATGATCCGTTTCACACTG	abaa]_`a`a_]_`^a`_aaa_`_]a_`a]`]_^_a	chr10.fa		5110129	F	36	119					
+HWUSI-EAS610	1	4	39	1093	1371	0	1	TTTGCACATTGAATGAATACCAAAGACACTGTATGG	abbaaa`abbaaababaaaaaaaab`^`^`a]_`aa	chr10.fa		5110244	F	36	119					
+HWUSI-EAS610	1	4	67	1172	1860	0	1	TGTGGCATAAATTTTGGAATTTATTCTAAAAGATGA	a__ba_`a`__````_aa_b`_```^_]]Z]a^_a^	chr10.fa		5110409	R	36	119					
+HWUSI-EAS610	1	4	100	920	1513	0	1	TGAGGATAGGTCTGTCTGAAACATTATGGAATGTCC	abaaaa_aa]Y``_``bbaa]`aba`_aa``[_^`W	chr10.fa		5110620	R	36	119					
+HWUSI-EAS610	1	4	76	937	1676	0	1	GTTAAATGAAATAAGACAAGCATCCTGGTGTTCTGC	a^`a_`aa``_```a__`aa\_a_^^__WaZ`Z_a_	chr10.fa		5110718	R	36	119					
+HWUSI-EAS610	1	4	19	309	1983	0	1	AACTGGAAGCAACTATGTTAAATGAAATAAGACAAG	]a`aba]^`aaaaa]`aY^`\\aaa\_``a_a__`X	chr10.fa		5110734	R	36	119					
+HWUSI-EAS610	1	4	15	1414	861	0	1	CAGAGACCAAGTCCTGGAGGCTGTCAATCAGTGGTC	abbbaabaa`a]``aa`\X`aaa]Ya`_`a\^a_\\	chr10.fa		5110960	R	36	119					
+HWUSI-EAS610	1	4	74	69	1996	0	1	TGGCACTCTTCTGAGGAAAAACAAGGTAATAGATCA	]`Y_[aX\K_aa[YY]RVZVZ`^S_^S^]_a`]W^R	chr10.fa		5111201	R	36	118					
+HWUSI-EAS610	1	4	43	750	1633	0	1	ATCTTGGCTCTCATGGACTGGCACTCTTCTGAGGAA	abaa`_aa`_`[X^[_``]``]YX^^]_Z]__a[S^	chr10.fa		5111219	R	36	119					
+HWUSI-EAS610	1	4	76	319	1665	0	1	GCTGTGTGTCTGTGTTTCCATGGAGAAATGAAAAAA	abaa]b_a_b`_R\\a_^a`aba\_TZ^aa`aa^ZX	chr10.fa		5111316	F	36	119					
+HWUSI-EAS610	1	4	56	1457	1686	0	1	AGGGGGCAACGTAAGGCTTGTCTCCAGACTCTCTGG	`Ubaba`abaaaaXba]aba`]`aZSb_^aa^^^`a	chr10.fa		5111564	R	36	119					
+HWUSI-EAS610	1	4	8	639	163	0	1	AAAGCTGTCTGCGTGGTCTGGGAAGGGGGCAACGTA	aa``bbbba`_\\aaa\]aba_aaa]a`a`]`V^^\	chr10.fa		5111587	R	36	119					
+HWUSI-EAS610	1	4	60	180	1439	0	1	ATAAAATAAATCACATATTGACTTGTTACTGTGGCT	a`Y]Y_aaa_^aa_``_`]`^`a`a]___`aU[]]_	chr10.fa		5112111	R	36	119					
+HWUSI-EAS610	1	4	58	790	1112	0	1	TTTATTTTTGCCATCCCAGAAAGGAAGGTAGATACT	ab]T[_]aa^\U__\WRUVWYOYPQM^RROVX`Z\V	chr10.fa		5112152	F	36	118					
+HWUSI-EAS610	1	4	40	851	284	0	1	TGGAGTCACCACTGAATTGTTTAGTCTGTACAACCA	abb`a`[ZTX`Y^ZRZ^aaaaa_``Y`^][Y^]\^]	chr10.fa		5112195	F	36	119					
+HWUSI-EAS610	1	4	43	1197	63	0	1	TCCGAAAGGCACTTCTTTATTTGTATCAAAGAAAAA	\``ZaSa^XS`aa^ba][a\\\^PLXaR]X`BBBBB	chr10.fa		5112893	R	12C5C17	21					
+HWUSI-EAS610	1	4	74	1269	1208	0	1	GGAGGACACACAGTTAAATGTTAGTTCATTTTCCGT	``]aa^_a_`^^a\^[YY`a^_W_^``^__^_Z]S]	chr10.fa		5113015	R	6A29	83					
+HWUSI-EAS610	1	4	3	1001	1023	0	1	TGTTCAATCTGGAGGACACACAGTTAAATGTTAGTT	ab`_aa_aa^_`^[Y`aa\^____aX___a_aZaR`	chr10.fa		5113025	R	16A19	81					
+HWUSI-EAS610	1	4	67	1522	130	0	1	CTGAAGGCCGAGCTCTGGATTTACCTGCAGGATGCT	aa``_RTa]QYS]`[_]`^aa`_N^]W]_QV^XX\[	chr10.fa		5113113	F	26A9	91					
+HWUSI-EAS610	1	4	73	590	1786	0	1	TATTGAGTGCATTGCATCTCTTGCTCTGTCTTGGCT	aaab]aK\_Q\]PZ\[_a_`____`a_F\W]^^PYU	chr10.fa		5113271	R	36	117					
+HWUSI-EAS610	1	4	40	471	1016	0	1	TACTAAGGATTCACAACGCCCCTGGGCGTACAGAAG	`]^ababaaaaaaab`aaa`a][`]aaa\`\\a^``	chr10.fa		5113313	R	36	119					
+HWUSI-EAS610	1	4	23	1069	1040	0	1	AGAAGACTACAGGTACACATTACTGTGCTCAGCACA	aba]aa_aa`a_\Ya\a_aaa`^\a`a`a^``__`_	chr10.fa		5113397	R	36	119					
+HWUSI-EAS610	1	4	97	86	1079	0	1	GAGATGAAAGGTACCTGGATTTTAAGTCACCTCACC	`T__aa][aba^aaaYab^^```_Y^ZaZ]a_a]ba	chr10.fa		5113836	F	36	119					
+HWUSI-EAS610	1	4	6	808	299	0	1	AGAAAACAAGGAAGAGAGAGGAGAACGCACCACAAG	a_Z_baaaab^^`\aba`^`a[`_`Z`_`_^_Z[Za	chr10.fa		5113895	F	36	119					
+HWUSI-EAS610	1	4	23	1543	109	0	1	GTTCCTCTCTTCTTGTGGTGCGTTCTCCTCTCTCTT	a`aaa\a_^`a_a]X[^^^]`]SZ_`^W_X^\^\__	chr10.fa		5113906	R	36	119					
+HWUSI-EAS610	1	4	66	576	1075	0	1	TGGACAAGCTAACAAAGAACCAGGAGTCCCCTGAGC	a`baabaaabaaaaaaaabaaaa`aa\aa^a`a]_a	chr10.fa		5114758	F	36	119					
+HWUSI-EAS610	1	4	44	1762	1351	0	1	GATGTGCAGGGACACTTTTGCTTAAGGTACATCCAC	``aa]``^R]`]abaa````X`aX[YZYZ_a__`\_	chr10.fa		5115209	R	36	119					
+HWUSI-EAS610	1	4	34	1489	1063	0	1	CACATCTTTTCCTCTGTGATGGACTGTATCCCTCTC	ab`^aab__baa_a]aa`ba_R[aa[_a^XZ^`[`_	chr10.fa		5115352	R	36	119					
+HWUSI-EAS610	1	4	37	1302	934	0	1	GGTGACAGGCATCCTCACAGTGGTAGTAGGGGTATG	ab__a^a`aaa`^]aaa^X_^b_NY`YY[`_[BBBB	chr10.fa		5115387	F	36	101					
+HWUSI-EAS610	1	4	64	494	1183	0	1	GGTGACAGGCATCCTCACAGTGGTAGTAGGGGTATG	a_N^`a``^^a`]_aa^_\aX]ZQRaKO^a`aGYY`	chr10.fa		5115387	F	36	117					
+HWUSI-EAS610	1	4	24	707	818	0	1	GCCAGATACATACCCCTACTACCACTGTGAGGATGC	aa___`a``a^`\`aaa_\\`aa``]a\`]\W]]a^	chr10.fa		5115395	R	36	119					
+HWUSI-EAS610	1	4	24	1480	529	0	1	TCCTACCTGCTTTCTGCTTCTTGTTCCGCAATGTGG	aaaaaaaaaa`abaaaaa`\aaaa`a```__`Q[aa	chr10.fa		5115437	R	36	119					
+HWUSI-EAS610	1	4	52	96	1116	0	1	TCCTACCTGCTTTCTGCTTCTTGTTCCGCAATGTGG	abbbabbbbbbbbbaabaababbaabbbbaaab_aa	chr10.fa		5115437	R	36	119					
+HWUSI-EAS610	1	4	75	72	840	0	1	GTCACCAGAATGAGTCTTGAGTTTTAATAACACAGT	a[^Y``___]Z_P_QbZV]G^U___X]^a_^aa]]X	chr10.fa		5115478	R	36	118					
+HWUSI-EAS610	1	4	5	1082	355	0	1	GAAATAGAGCTTTGCTATAGGAAGTAGGTCACCAGA	aaaa_YYQNW^`X\P]V^U`^ZTXPNR[PTYRVBBB	chr10.fa		5115505	R	36	105					
+HWUSI-EAS610	1	4	21	479	1038	0	1	AGGGCATAGTTTCACCGCATTTCAAAATTATGTTCT	`]]abb`V^`ba[b[_aa_`aaa^^[_aa_a`Raaa	chr10.fa		5115649	R	36	119					
+HWUSI-EAS610	1	4	35	1293	1257	0	1	GTTGGCATTAGGAATTCAAGATCCATCTAGCCCTTG	a``aa^a`aaa_a`aa__`[_ZY\_`^]_^UYV_^B	chr10.fa		5116665	R	36	114					
+HWUSI-EAS610	1	4	23	1569	805	0	1	AGCAGCTGGGTCTCGATGACAGAGAACTGGTGAGGG	a\`]X_aa\^\^\`]\`^`^_\_M\^T\`UUZWWUU	chr10.fa		5116943	F	36	118					
+HWUSI-EAS610	1	4	82	196	1407	0	1	AGCAGCTGGGTCTCGATGACAGAGAACTGGTGAGGG	]b_Z_bbbaa`bab`]a`aaa`[``a`aaaU`^aa_	chr10.fa		5116943	F	36	119					
+HWUSI-EAS610	1	4	57	874	1126	0	1	TGAAACCACCGTTGCTCGAGGTGACTGGTCTGTTCC	aaaaa`a``Za^aa_]W]S`aU_U^^`aUY^YU^\\	chr10.fa		5116977	R	36	119					
+HWUSI-EAS610	1	4	45	693	317	0	1	GGAGTGGGCCGAAGAGCAGCAGCCTAACATTGTGGA	ab\aS_`_Pa[QWEX^YYXYNUQU\\ZP_S\\\^BB	chr10.fa		5117103	F	36	108					
+HWUSI-EAS610	1	4	75	85	647	0	1	ATGGACCACCTGGCCATCTGCAGTGAGCTGCAAGCC	_T\Y`a]J\aUY\`\URZR]]S\K]\\\PSRXJT\[	chr10.fa		5117185	F	30G5	94					
+HWUSI-EAS610	1	4	38	1530	1648	0	1	AGCGCCTTTTGGATCACCTTCCGCTCATTGAGGCCG	^\]^aaa```^Z_````[aaaaa`_^V^a^YYX\\`	chr10.fa		5117277	R	36	119					
+HWUSI-EAS610	1	4	54	1308	830	0	1	CAGACAAGGCCTTATTCAAGTACTTTCTTCGCTGGC	ab`b[a_a_a`aaaaa_aaa[_a`^`__a_X^``_^	chr10.fa		5117357	R	36	119					
+HWUSI-EAS610	1	4	56	1647	786	0	1	CACTTAGGTACGAGTGATCAACTTCATTTAGCGACG	a`Zaaa]P]]\GW[V`a\\^`[`a^]]_Y[W\YYY`	chr10.fa		5117924	R	36	118					
+HWUSI-EAS610	1	4	14	255	2013	0	1	GCAGCTCTGTTGAAGAGACACACTCTCCTCAACTAT	abaabaaab\VbabbaaZ^^Z[\Z]__b`_``_[Z^	chr10.fa		5118145	R	36	119					
+HWUSI-EAS610	1	4	67	501	157	0	1	GAGTCAGCTGGAAGTCGTGAAAAGAGAGCAGGCCAA	a__Ua_aa`W\X`aW^b_`Xa`]^PY]^_\_PV_]`	chr10.fa		5118405	F	36	119					
+HWUSI-EAS610	1	4	25	1305	1629	0	1	AGATCAGAAAGATCCAGATCCACCAGGAGGAGGTCT	ababaa_abaabaaabbaaaaaaX`baaa^^a`^`a	chr10.fa		5118800	F	36	119					
+HWUSI-EAS610	1	4	44	1299	878	0	1	CTACAAATGACATCATCCTGTTCTTTATAGCCAGAT	aab`^aa]a`Zaaaa`^`a__a```a_a[\^YYTNW	chr10.fa		5119921	F	36	119					
+HWUSI-EAS610	1	4	49	1777	602	0	1	GTGTGTGTGACCTACACATCCTGCCATGCTTGATAT	\aa^^_^_\`aaababbabab`K_^aa_]aa`aaba	chr10.fa		5120324	R	36	119					
+HWUSI-EAS610	1	4	79	831	977	0	1	GAAAGGGAGCACCCCTACCTGAAGGAGGAGGGAAGA	a`]aaa`aaa\`^\_``^_`a\_``\aaU_\_W]`]	chr10.fa		5120625	R	28G7	93					
+HWUSI-EAS610	1	4	46	376	1087	0	1	GATGTTGAGAATTAAAACTCAGGACCATGTGCATGA	`T^a``aabaa`aa]a`a`a]ab`_a]`_O]```a^	chr10.fa		5120898	R	36	119					
+HWUSI-EAS610	1	4	72	1183	963	0	1	TTGACTATATGAAACCTTGTCACAACAGATGCTAAT	abba_bbbbbb`aa_abbba_`I``_bVa``_aa`a	chr10.fa		5121038	F	36	118					
+HWUSI-EAS610	1	4	56	526	1585	0	1	GTCACAGCGGTTGTCAAGATTCCTAATGCGCTGACC	]aIbb]aZaaXQaa]JHPJ`H_[]a_[M\^aBBBBB	chr10.fa		5121470	F	7T10C17	49					
+HWUSI-EAS610	1	4	23	415	393	0	1	TTTGGATGAGAAGTGTCCCCCAAAGGCATTTGGATC	abbabbaaa`_ba]bababaabbaaaaaaab`a`_b	chr10.fa		5121922	R	36	119					
+HWUSI-EAS610	1	4	72	824	446	0	1	AAGCCCAGGCTTCACGGGCTCTACTCCTCATCTCTG	aaaaaaa`a_aa_aaa`^`a```^a``a``a`a^aa	chr10.fa		5121989	F	36	119					
+HWUSI-EAS610	1	4	36	608	630	0	1	ATTTATGAAATTCTTAGGCAAGTGGATAGATAGAAC	aaaaaaa^^^_`___`_``a_a\a_^^``^_]`]`^	chr10.fa		5122302	R	36	44					
+HWUSI-EAS610	1	4	84	402	1586	0	1	AAGGGAGGACACATGGCTTAGAAATGCTTCCAGAGT	`^aaaa``R^aa`\a_\[]Ya`T\_``_^_[__]^U	chr10.fa		5123359	R	36	119					
+HWUSI-EAS610	1	4	50	1280	405	0	1	AGCCATGTGTCCTCCCTTTGCTCTCCTGCCCATTCT	`_ab_UW^b_a\aZa`aabbabbaaa`Uaaa`aab`	chr10.fa		5123377	F	36	119					
+HWUSI-EAS610	1	4	76	1040	1490	0	1	AGAAGCTGGCAGAGGCTAGTTTGGAAGTTAAAAGTT	ab`aa_`a^_`]a_`S^``Z[Y[a^H\]YOLNDRZ^	chr10.fa		5123606	F	32T3	109					
+HWUSI-EAS610	1	4	97	1593	918	0	1	AGAAGCTGGCAGAGGCTAGTTTGGAAGTTAAATGTT	`baa[]_]__[T]^_^_``[a_W_Z__X`]Z^^^W_	chr10.fa		5123606	F	36	119					
+HWUSI-EAS610	1	4	40	709	1883	0	1	AATAATGTCTCCCAACTTACCTGTTAACTTCTCATG	aaaa````aa``[a^V__a^Y``[`aWO[`_`a_Z`	chr10.fa		5123889	F	36	119					
+HWUSI-EAS610	1	4	20	652	852	0	1	AACCTCCTGTGAATGGAAGCTGATTGTACCACAATG	aaa^aaaaa[a_aaa``^`_aa__`_Za^__]^^_a	chr10.fa		5123973	F	36	119					
+HWUSI-EAS610	1	4	77	1664	974	0	1	TTGGTAATACCTTTGACACCGACTGTATATTTCGGT	VbVXH^aaaY^a_ZQU]aa^OWP[SV``_BBBBBBB	chr10.fa		5124030	R	36	87					
+HWUSI-EAS610	1	4	88	573	1469	0	1	CATTAGCTGCTTGGAACACTTGGTAATACCTTTGAC	aaaaaab_aaaabb_baaaa`baWbba`a`a_b__a	chr10.fa		5124049	R	36	119					
+HWUSI-EAS610	1	4	56	1169	311	0	1	TAAGGCCCCAGTGATAAATTCAAAGTGTCTGCTTCT	aaababa_aab_aaba_b_S^aa_`W`_a_W_`a`a	chr10.fa		5124854	F	19C16	95					
+HWUSI-EAS610	1	4	62	173	273	0	1	GAAGCTCTAGGAATCAGTGCATCAGCAGAAAACCAG	_NUab`aaa`^UN^baa_aa_a``a[^][__\`]X[	chr10.fa		5125091	F	36	118					
+HWUSI-EAS610	1	4	57	1254	1367	0	1	TGGGGGGCTGGCAGGACATGGGCAGGAGTTAAGGAT	a_``W]X_]^\]]\Y`Y\^ZZV\S^YS`Z\YQR]\\	chr10.fa		5125177	R	36	118					
+HWUSI-EAS610	1	4	19	535	1237	0	1	CTCAAGTAGAAAATAACTTNTCTATCATAAATAAAT	]bbbbb^bbY^a`b`ZabYDYaaabaZaba^`]]`b	chr10.fa		5125430	F	19G16	110					
+HWUSI-EAS610	1	4	37	528	509	0	1	AAGGGCAGGCTTTCAGGTAACCCAGGCTGGCCTTAA	T^bba`aa`_ab^``aaYb`ab``a`XV`\a`aZaa	chr10.fa		5125779	F	36	119					
+HWUSI-EAS610	1	4	25	655	638	0	1	CAGCTCTAGGCTTATAGACATGTACCATCACAACTG	^abaaabbaaabbabbaaaaba_baaaa`aaaa`aa	chr10.fa		5125870	F	36	119					
+HWUSI-EAS610	1	4	36	1171	1844	0	1	AAGCATCACAACTAGAGCAAACCGGAAACGATACAA	aZ][_aZ`^^^\^]]]\]^__WX_^ZUZV_XVVW]]	chr10.fa		5126092	F	36	119					
+HWUSI-EAS610	1	4	72	799	375	0	1	AGTTCTGGAGGGTTACATTCCCCCAATAGCAGGGAG	ab_babJa`Y`^`aa_V```SS[Raa_b`__Z`TTQ	chr10.fa		5126435	F	36	118					
+HWUSI-EAS610	1	4	49	743	1431	0	1	CATTTCTCATGCAGACAGCCACCTGCTGTTCTTGTG	abbbaababbb`aaaaaabaaaabaabb_a`a``]\	chr10.fa		5126724	F	36	119					
+HWUSI-EAS610	1	4	25	451	323	0	1	GCCATTTGATCCTAACTTGGAACTAAACTGTACCAG	aa`__aa`a_a`a``^aaa`__]a`\]^`a]``_`[	chr10.fa		5126820	R	36	119					
+HWUSI-EAS610	1	4	14	677	408	0	1	GTACAGTTTAGTTCCAAGTTAGGATCAAATGGCACA	a[``aa^aa\\[___^_a\`_X_[_]Z____`^]Y^	chr10.fa		5126823	F	36	119					
+HWUSI-EAS610	1	4	88	321	1834	0	1	GTTTTGGAACCCATTCTTCCCTACCTTTCCAATCTC	a_aa_aaaWbbaY`a_a^bbaa_aa_`_ba^]aa]a	chr10.fa		5126949	R	36	119					
+HWUSI-EAS610	1	4	79	841	1027	0	1	TGAGCTAAATTCTTATTTTTACAACAAAGAAAAAAA	aa]``aaaaaa`b`aaaaaa`aa`_``^]``_````	chr10.fa		5127391	R	36	119					
+HWUSI-EAS610	1	4	23	550	884	0	1	GTGACTTTCAAGGAGGGTCATGAGCTCTGCTTTGGA	a_aa^a`aaaQ]`[P^`V`^_a^[[_[`^[^`^_`\	chr10.fa		5127852	R	36	119					
+HWUSI-EAS610	1	4	20	1521	939	0	1	GCACAAGCACGGTCATCCAAGTTGGATCTTCAGCAC	aa`^S^LU_UPPNNUPYFM[]TUTVMLSPV[SYSBB	chr10.fa		5128295	F	36	107					
+HWUSI-EAS610	1	4	30	1111	871	0	1	AAGGGAGAACAAAAGAAAGCAAACTGATTGCCTCCA	^S``^S^\a]_^``a^__a^__`]aa_\Z_]\]]_^	chr10.fa		5129229	R	36	119					
+HWUSI-EAS610	1	4	39	1621	1917	0	1	ACAAAAGGGAGAACAAAAGAAAGCAAACTGATTGCC	a_a`\N_aa][W``^___a`__a]_^_XZVPRX]XX	chr10.fa		5129233	R	36	118					
+HWUSI-EAS610	1	4	50	1259	800	0	1	AGTGAGTGTGTCAAGATGACTGATGAATTAAAAAGA	\b\baa_bZ\bbbabV\a\Yb`bbb`baaabb`a\a	chr10.fa		5129289	R	19T16	89					
+HWUSI-EAS610	1	4	50	705	29	0	1	AAATTTCCAGATCAGCCAGATTCAATTCCTTCACCT	`babaa`aab^aaaaaabaaa`a`aaa]``a_a_a`	chr10.fa		5129336	F	36	119					
+HWUSI-EAS610	1	4	89	863	999	0	1	GCCTGATAGGAACCATTGCATTCAAGGTGAAGGAAT	a[^^``aa_\]\^^]a_`X]_]__\]]WaYZ[`\Z_	chr10.fa		5129360	R	36	119					
+HWUSI-EAS610	1	4	55	1704	355	0	1	AAAAGGAAAAGAAGGATCTCTGTCACCTCCCCTCCA	]baa\LTba_N\WKDZ`a`aYXNW_``aaa^UPX\a	chr10.fa		5129470	R	36	115					
+HWUSI-EAS610	1	4	16	313	1107	0	1	GTCTTGGGTGGGGGTGTGAGGAGCGGACTCAACAGA	_T[Z_\aYM]a^`_Q`SVQV]JX]Za\`^aX`YJ\\	chr10.fa		5129792	F	36	117					
+HWUSI-EAS610	1	4	56	956	1768	0	1	ATCAGTCATAACACTGACTTTAATCTTGGTGACATG	`b_a`^`aaaa^``aa__aaaa_a``a`[Xa^_``a	chr10.fa		5130257	F	36	119					
+HWUSI-EAS610	1	4	61	1038	47	0	1	TTTCTTTAAAGGCTGGCTTCTCACAGCCATACACAT	aba`bbabba`a_aa``ba`b_a`__`^a_a^_^`a	chr10.fa		5130308	F	36	119					
+HWUSI-EAS610	1	4	31	1382	75	0	1	AGAAGAATTTGCGTCATGGGAGGTGAATAATTTATC	aaaba`a`a``_`]`aa_`]__[X_^^__^`^_``^	chr10.fa		5130500	R	36	119					
+HWUSI-EAS610	1	4	87	677	103	0	1	TGATGAAAAATCAGTAGCTTTATCACTAGATCCATA	abbb_a`^aba`^]\a^V`baaa`a]a\`aa\O[_a	chr10.fa		5131096	F	36	119					
+HWUSI-EAS610	1	4	45	906	487	0	1	GAGTGTATGTGTGCATGTGTGCATGGACTAACCGTG	aVaaaYQ_`X`S`Xaaa_`_a]__`[]U]_`\^aZ`	chr10.fa		5132064	R	36	119					
+HWUSI-EAS610	1	4	37	1268	338	0	1	CTCAGGCTCCGGAGTGTTAGGATTATAGGTGTGTAT	aba^_baaaabb_]]bVab`\RZ``aa[aR\R_R^a	chr10.fa		5132522	F	36	119					
+HWUSI-EAS610	1	4	22	566	1939	0	1	CGCGTGTGCATTGTGTGTTGTGTATGTGTGATGTTG	``]b^`]V_]bbbaa[aab_^\TX_YZ_Z_R`_Q_[	chr10.fa		5132731	F	36	119					
+HWUSI-EAS610	1	4	36	278	710	0	1	TGCTGTGTGTGTGTGTTGTGTATGTGTGTTTATTGC	abbbb]``aab_bab`a]_b^`ba`a_b_aaY^a__	chr10.fa		5132851	F	36	63					
+HWUSI-EAS610	1	4	89	1325	400	0	1	AGCTGTTGGACAGTCACTCTACCACTGAACCATACT	ababa`a]XZ]a\^_a_baaaaaaaa_``_\]^`_`	chr10.fa		5132912	F	36	119					
+HWUSI-EAS610	1	4	61	918	256	0	1	AAATCAGCACACGTATAAAGGCCAGAGTACTGAGAT	`aaba`aaaaaaaZ_b`]_aa_]Xa_aR^]_[__[a	chr10.fa		5133214	R	33ATC	14					
+HWUSI-EAS610	1	4	43	533	475	0	1	CAGTACTCTGGCCTTTATACGTGTGCTGATTTAGAT	a_`Zabb`^^^^`a`aa`a``a`Y`aaa`aabaa__	chr10.fa		5133218	F	33C1C	45					
+HWUSI-EAS610	1	4	94	1566	1776	0	1	TGCATGCGTAGGCATTCACATCCATATGTGTGCTTG	aaYaaa`a^`aa_aa_`a_aaa^`a]]a^a_a^`aa	chr10.fa		5134007	F	36	119					
+HWUSI-EAS610	1	4	22	1785	1713	0	1	TTGCCGAGCCTGTTTGCTTGCACCCTGTCTGTGAGC	a\a`Y]\ZNKR`T]YMN]_^[_[PPZ^VV[\UBBBB	chr10.fa		5135214	F	36	100					
+HWUSI-EAS610	1	4	44	1189	66	0	1	ATAAACCTATATCTGTTTCATAACAAACTGTATTAT	ab^^aZ\]^_a`[_a]^`^`aX`[^\U\]XYS]_`a	chr10.fa		5135838	F	36	119					
+HWUSI-EAS610	1	4	94	854	2018	0	1	TGGGGAGCAGACCAGAAGGTAAGCATGATGGGGTAC	aaaa`^Z`_aa^a_a^\``U`]`]__a^W__^_U^_	chr10.fa		5136040	R	36	119					
+HWUSI-EAS610	1	4	8	1394	1080	0	1	AACAAAACAAACAAACAAGCCCAATTTGTGTTACCC	a\PW``_]^`^Z^a`ZRa[HRRWTSSMHM`[BBBBB	chr10.fa		5136120	F	19T16	83					
+HWUSI-EAS610	1	4	55	1456	203	0	1	AATGAGTAGTCCAGCATTTCCTTTACCTTTTTTTCA	ab`a_XS\TY\a]]]__ba_`Z``_SS``^Y_a^YV	chr10.fa		5136438	F	36	119					
+HWUSI-EAS610	1	4	44	982	1491	0	1	AGTAGTCCAGCATTTCCTTTACCTTTTTTTCATATA	a_\`Y``aa__Q^aa\aa_W__`aa`ab^a`ba``a	chr10.fa		5136442	F	36	119					
+HWUSI-EAS610	1	4	98	849	937	0	1	GAGGGCCTTGATCTCCATCTCCCAAGGACTGGGATA	a`]^S[Y[Xa[S]]`_]aaXaaZ^X]]WSW_^^U^]	chr10.fa		5136515	F	36	119					
+HWUSI-EAS610	1	4	25	280	1420	0	1	GCCTGCCTGTTATCCCAGTCCTTGGGAGATGGAGAT	abbabbb`bb_W_bb`_``bbbbbba`aXab`ab``	chr10.fa		5136525	R	36	119					
+HWUSI-EAS610	1	4	55	1292	1981	0	1	CAGGCAGGCACAGCACTTTCCTACTGGGCCCAGCTT	aaaaa``aaaaaa`a_a^a`aaaRa_aa_Za``___	chr10.fa		5136552	F	36	119					
+HWUSI-EAS610	1	4	62	1121	269	0	1	AATCCAAGTCCTCCGTGATATGCTTGAGTTATTTCT	aba^aab^PW^`Y_]]b^[XYRT_\]VQY\\``\R`	chr10.fa		5136725	R	36	118					
+HWUSI-EAS610	1	4	1	1267	712	0	1	GAGTACAATGAAATGCTCGAGACTGTTCGGAAATGG	a]`X^Y]aaaa_]^aa__`\`___`_]^[SY^]S__	chr10.fa		5136966	F	36	119					
+HWUSI-EAS610	1	4	37	1339	405	0	1	AGAAAGCTAAAGTCTTGGTTCATGGAAACATCGCCT	^a``^[`\aa\`a`b`U]X_aab\_babaaa`aYV\	chr10.fa		5137006	F	36	119					
+HWUSI-EAS610	1	4	24	182	509	0	1	AAGTGCCACAGGGGTAGGGAGGAATGCTTTCAGGCT	a`b_ba`Q_abaabQXbaa_ba`a_aaY[aa_a`aS	chr10.fa		5137652	R	36	119					
+HWUSI-EAS610	1	4	47	953	2030	0	1	GTAGACCCTTCTTTGGGAGATGCAGGGAATTCTTTC	___]a][]aU_]^ab`baa\_]T\]]VS``YS^^`^	chr10.fa		5137720	F	36	119					
+HWUSI-EAS610	1	4	59	317	88	0	1	GTATTTTGTTCCAAGTCACAGGGTACCAGTTGGTAG	aUY`aaaa^__a_]]V`^`W__^X__^Z\V^ZZWWY	chr10.fa		5137830	R	36	119					
+HWUSI-EAS610	1	4	1	440	1937	0	1	GGAAGTGCTGGATGTTTGCTCCCAGGCAACTGACAC	aa]^aS_aaa`aaa]a``a\baaa`]aaY]^\aaaa	chr10.fa		5137923	R	36	119					
+HWUSI-EAS610	1	4	55	688	1231	0	1	GGAAGTGCTGGATGTTTGCTCCCAGGCAACTGACAC	abbaa_baabaaaa_\aaabaaa`_`^a`\a\aY_a	chr10.fa		5137923	R	36	119					
+HWUSI-EAS610	1	4	5	1109	519	0	1	GGAATATTTTTGTCTCCTAAGTTCAGAGGAAATGAA	ab`_^_aa`^VY]]]\_a__a]][__Y_^_^[]__^	chr10.fa		5138090	R	36	119					
+HWUSI-EAS610	1	4	15	226	1668	0	1	ATTCCCTTTATCTTTTCTGTTCTTACAACTGCATCT	\aabbbaabbbbaaabaaa]`bbaaab`ba`baaaa	chr10.fa		5138539	R	36	119					
+HWUSI-EAS610	1	4	61	1425	1618	0	1	ATCCAGGAAGCAAAATGAACAGGAAATAAAATGCCA	a``VPU^[_a[a``aaa_]]``YV_[^]___[SR__	chr10.fa		5138667	R	36	119					
+HWUSI-EAS610	1	4	24	1012	1667	0	1	GAGGGAGGATGAGAGTTCAGGCACACATGCATGTAA	`]^TbL\aaa``XX_Ta__a`_[\^Q_a]RV[`T^[	chr10.fa		5138866	F	36	118					
+HWUSI-EAS610	1	4	93	413	655	0	1	AGACAAGGACAGGCCTCTCTCTCATTGAAGAGGGAC	ababbbb___babaaaabbab`a`^aaa`babaa`Z	chr10.fa		5139212	F	36	119					
+HWUSI-EAS610	1	4	10	538	195	0	1	GATAGCACAGCCCAGATCAGACAGTTCTATGTGTGG	abbbbab`abaaaaa`aab[a`aa__aa`aa]a_ba	chr10.fa		5139267	F	36	119					
+HWUSI-EAS610	1	4	48	762	1402	0	1	CAGCAGTTTGTGTCATGAACACTAATGTCAACCACA	a\XOQ^]`__`b`Z\\YTO^^X\_^a_GRWZQ`Wa[	chr10.fa		5139298	R	36	117					
+HWUSI-EAS610	1	4	15	1440	482	0	1	CAAAGCAAGCAAGCAACCTTAGACTGATCTGCTTGC	abbb]QMXPXR`PZZBBBBBBBBBBBBBBBBBBBBB	chr10.fa		5139357	F	26C8T	23					
+HWUSI-EAS610	1	4	91	1171	1802	0	1	TTATATTTATATATATTACATTCACTGTGAAAAGAA	aW`USY_\R_T]OW[aa_]_]YW[S^`[[]UW^YYU	chr10.fa		5140128	F	36	118					
+HWUSI-EAS610	1	4	4	459	1982	0	1	GTAACATACCCCTGTTTTTTATATTCCTCATATATC	a_aaabbaa^ab_b^^[`]_a`_`_Xa_aa`^^`__	chr10.fa		5140198	F	36	119					
+HWUSI-EAS610	1	4	35	1172	1606	0	1	CACATTCCGTGCTCCCCAACTTCTGTGCCCTGCATA	ab_Z_bbaWX_\a]_a]aaaba[a\NW]]_^`Y_aa	chr10.fa		5140244	F	36	119					
+HWUSI-EAS610	1	4	7	433	730	0	1	GCATACACCATCTCCTCAGTACAAAGTGTCTTTCCC	`YX_]\bb\WU^aaaa`R`VRW``]^P`\`b]`X`^	chr10.fa		5140275	F	36	119					
+HWUSI-EAS610	1	4	91	264	981	0	1	CTCAGTACAAAGTGTCTTTCCCTTCCTCCTCATCTG	aaVR^Ya_a_TWS^J^Z\T`_Z_^a[QV[S_[W_Y]	chr10.fa		5140289	F	36	118					
+HWUSI-EAS610	1	4	64	207	1870	0	1	AGTGTCTTTCCCTTCCTCCTCATCTGTTAATGTGCT	T`ababbba`aba[ba^`aWaa`a_b`a_`baU\`\	chr10.fa		5140299	F	36	119					
+HWUSI-EAS610	1	4	9	815	764	0	1	GAAAGATATCAGCACATTAACAGATGAGGAGGAAGG	aV^\]^_\^V``[X\[\]__VSY__a^`_W__Z___	chr10.fa		5140309	R	36	119					
+HWUSI-EAS610	1	4	58	679	563	0	1	GTGCTGATATCTTTCTTGAACCCAGTAGGACCCTTA	a_aabbaa`aabbaabbbaaaaaaa`a`[]___aaa	chr10.fa		5140330	F	36	119					
+HWUSI-EAS610	1	4	30	1308	177	0	1	GATAAGGGTCCTACTGGGTTCAAGAAAGATATCAGC	__```a^HZa`aa]`aa[R__a`_`_^__^[\S`_^	chr10.fa		5140332	R	36	118					
+HWUSI-EAS610	1	4	48	1337	1554	0	1	AGATAAGGGTCCTACTGGGTTCAAGAAAGATATCAG	abaaa]``a_a^baa`][]Tb[aaa^`a`_a`_Zaa	chr10.fa		5140333	R	36	119					
+HWUSI-EAS610	1	4	75	545	850	0	1	GAACCCAGTAGGACCCTTATCTCAACCCACCAGCAA	^_aaa`aa`Yaa`_```a____`_`V`Z`__[\`ZX	chr10.fa		5140347	F	27T8	88					
+HWUSI-EAS610	1	4	49	547	1797	0	1	AACTTGCTGGCAGGTTGAGATAAGGGTCCTACTGGG	Xbbb__bb__I^abS_W^`baa]^ZaR`]aTaa_`[	chr10.fa		5140350	R	10T25	105					
+HWUSI-EAS610	1	4	99	1755	1050	0	1	GTAGGACCCTTATCTCAACCTACCAGCAAGTTGTCC	`_^Y^a``_````]S[``_^^^^ZRHU[]KHWTVZ[	chr10.fa		5140354	F	36	117					
+HWUSI-EAS610	1	4	12	10	807	0	1	AACCCAAATGTGGGACAACTTGCTGGTAGGTTGAGA	aaaaaJI`b]aaXZP_a``_abaS]aU\a^VX_H^R	chr10.fa		5140366	R	36	117					
+HWUSI-EAS610	1	4	7	1008	453	0	1	TAAAGGGTAACTCAACCCAAATGTGGGACAACTTGC	aa__aaaY_^___`__W]aa__`S_Z\\WY][^WX]	chr10.fa		5140379	R	36	119					
+HWUSI-EAS610	1	4	50	401	1794	0	1	GGTTGAGTTACCCTCTAATACGTGGCTACCCTTTCA	T^T`^TZY`^bUP\RZ^RXUR[N[Y_Z__J]\^^BB	chr10.fa		5140398	F	14T21	86					
+HWUSI-EAS610	1	4	38	494	1672	0	1	AGAAAATGAAAGGGTAGCCACGTATTAAAGGGTAAC	\`b_^^abb\S^^aYbbbb`bb`^^ba^W_b^_abb	chr10.fa		5140404	R	36	119					
+HWUSI-EAS610	1	4	22	999	1266	0	1	TGTTTGTATTGTTCTACTGCTGTAAGTCCCAGCAGG	`baaaa^a_a`^_]_a___^aaW^ZV^^^^^`YS[Y	chr10.fa		5140481	F	36	119					
+HWUSI-EAS610	1	4	56	442	90	0	1	TTTGTTTGCAAAACTTGTGCTTTTCTTTGCATCTTC	aaab_`aba`aaa`aaa_aa^a`_`a``a__a``_a	chr10.fa		5140612	F	36	119					
+HWUSI-EAS610	1	4	98	1757	1113	0	1	TGCATCTTCCAACATTCAGATCTTAGTTGTATAACC	JMUaTaaT_Z[QTVPZW`]_`bb_[[_a`]_a_TZB	chr10.fa		5140639	F	11G24	92					
+HWUSI-EAS610	1	4	7	547	645	0	1	GCGGTGGTGATGCTTCGGCACATTGTGTCTTGATCA	`aab`_`_aX_a[aa`^a`a\aaa^ZaVZa^T[`^Z	chr10.fa		5140737	R	36	119					
+HWUSI-EAS610	1	4	42	1428	1698	0	1	GAATCCTTAAGTCCCATACTCATGAACAAGTGGCCT	aaaa`aaa`b`a``_`a_[a^`aa__^`_]W^Y\Y`	chr10.fa		5140830	F	36	119					
+HWUSI-EAS610	1	4	76	1173	1145	0	1	AGCAAGTTATAAAGATTCCTGGACTTGACCTTGTTG	^b`a^b^`aa`aaa_ba`_aa^\^`_aZYZaaaWa`	chr10.fa		5140867	F	36	119					
+HWUSI-EAS610	1	4	46	464	1422	0	1	TGTAGCCTGTGAGTGGACTCATAGGGGTGAGATGGC	^]]b`a]]_Ubaa`_Z__XaTa```]^Y`]ZVQX`a	chr10.fa		5140930	F	36	119					
+HWUSI-EAS610	1	4	83	673	1789	0	1	AATGTTTGGCCATCTCACCCCTATGAGTCCACTCAC	`abb\aa``bbbaa`abbbabaaaaaa\`aab`aaa	chr10.fa		5140938	R	36	119					
+HWUSI-EAS610	1	4	67	1085	404	0	1	GTCCAAACTGTGTCACTTGCTGTGATAACTTTCCTG	`abbbababb^a`ababbbabbabbaa`^aaaaaab	chr10.fa		5141193	R	36	119					
+HWUSI-EAS610	1	4	87	1651	1269	0	1	GTCCAAACTGTGTCACTTGCTGTGATAACTTTCCTG	_abVb_b\ab`a`aa_ab^bab``aaaa]ab_\aaT	chr10.fa		5141193	R	36	119					
+HWUSI-EAS610	1	4	40	996	1090	0	1	AAGGAACCGAGGGAGGCCTGGGGAATGGCTCAGCTT	TXZZ_Z\V]\__a`R[Va`\]_^]U]a``\[Z`V][	chr10.fa		5141594	F	36	119					
+HWUSI-EAS610	1	4	7	1226	598	0	1	TGTTCCCTCCTGAGGCTTGGATCGGCCACGCCCAGG	```^[]`^^\`]^^`]Z]Y\Y\Z]Z[XYT]SSTU`Y	chr10.fa		5141687	R	36	119					
+HWUSI-EAS610	1	4	85	1360	288	0	1	GTGTTTGCTGTCCTCTGACCTTCTTATGTATACATA	```Va_^bb^`aa``_\^aaba`aaa^OU_aaaa`a	chr10.fa		5141951	F	36	119					
+HWUSI-EAS610	1	4	46	1314	743	0	1	GCTACCAGGACAATGTGGGTCAATACAGTTTGCAAG	a]`baba_Y`Z``b\P\`bP`aa````ZS]a`^`Z]	chr10.fa		5142191	R	36	119					
+HWUSI-EAS610	1	4	72	908	2041	0	1	AACTGTATTGACCCACATTGTCCTGGTAGCTACAAT	a]ab]RXa__`aVPZ`_T]]XVaYPXL__[XZ]_VR	chr10.fa		5142197	F	36	118					
+HWUSI-EAS610	1	4	53	551	1753	0	1	CAGCAGATGCTGAAAGGGGCCATGTTACAGTTTAAG	a[`bb`[aaaaaaaa`_``aaaaaaaaaaa[a`aaa	chr10.fa		5142280	R	36	119					
+HWUSI-EAS610	1	4	1	431	782	0	1	CAGAGTGCTCTCCGGATCCCTGAGGACGTGGTCGCC	aaaaa`aa`_aaaaaa`aa__a`^_a`aT``\_`a`	chr10.fa		5142364	F	36	119					
+HWUSI-EAS610	1	4	61	277	176	0	1	GGGCAGCGTGGCACAGAGGCAAGCTGGCGACCACGT	aa^`aa`a]aa``]\`]``_[VX\\`^[`\^`^U^B	chr10.fa		5142389	R	36	114					
+HWUSI-EAS610	1	4	16	651	1700	0	1	GCTGAACGGGATGCACAGTTGCACCTGCCTGCATGA	abbabbaba`a`a_aaaa`bbabaZ`_]a_ba`aa`	chr10.fa		5142482	R	36	119					
+HWUSI-EAS610	1	4	13	598	1815	0	1	ATGAAGCTGAAGGAGCTGAGAGAACATCTAATTCTG	`aaa_b_aaa__`_b`a_`__`_a_^\_^_Z``_^]	chr10.fa		5143577	F	36	119					
+HWUSI-EAS610	1	4	53	106	1675	0	1	ATGGATAGGAGGAGGTTCCCAGAGCCCACACCCACA	W__aaa^``[a`a`b^_bb_T\^[`__Z`X`a^a_W	chr10.fa		5143642	F	36	119					
+HWUSI-EAS610	1	4	55	21	881	0	1	GTCATTGTGGGTGTGGGCTCTGGGAACCTCCTCCTA	_X``aba^aa_N`\]_\a\a^aa]_\]a^^_ZZ\BB	chr10.fa		5143647	R	36	110					
+HWUSI-EAS610	1	4	59	661	1723	0	1	GCCTTGTTGGAGTAGGCGTGGCTTTGTTAGAGGAAG	aaabbaX^]`a`_a`]aa_aaa`aa`aa^Z]\_]V]	chr10.fa		5143686	R	36	17					
+HWUSI-EAS610	1	4	12	1536	1011	0	1	ATTTTTTGAGACAGTGTCTTCTGTTGAATCCAGAAC	[_S_a`aa`^Y]`IR_^HNR[`V]Y\a`PTHXXBBB	chr10.fa		5143901	F	14A21	81					
+HWUSI-EAS610	1	4	73	820	391	0	1	GGTCCCTGGAGCTTAAGGAAATCTACTAGTTCTGGA	ZZ\`]a^W^`aX`a^]_aTa`]`^^`__aYVM[`^[	chr10.fa		5143929	R	36	119					
+HWUSI-EAS610	1	4	50	720	793	0	1	TGTCCTGAAGATGAGCTGTCAGGACAAAAGCCTTCC	a_Z`aaba`b_``]a]_\Za`aX^^a]]]]RZ`\]X	chr10.fa		5144127	R	36	119					
+HWUSI-EAS610	1	4	14	5	383	0	1	GTAACATCCAGGAGCTACAGGCACAGATCTCTCTGC	aXXUX]]aa`]JYX^XV]YRTa^]X]RU`[[[^Z`a	chr10.fa		5144505	F	36	118					
+HWUSI-EAS610	1	4	56	843	247	0	1	TGATCAGTGTCTTGCTTTGCCTGCCCTTCTGTCTCA	aa_`_\]^a\]__`[_^a__``_SUW_`[^[^[[[^	chr10.fa		5144547	R	36	119					
+HWUSI-EAS610	1	4	39	1179	298	0	1	AGTTTCCAGTGATCAGTGTCTTGCTTTGCCTGCCCT	ab[aa[^aa^[`Q]``]bS_bbX_`Taa__\TQNX[	chr10.fa		5144556	R	36	118					
+HWUSI-EAS610	1	4	3	362	1045	0	1	TATGTCATGATTTGTAACAGTACACAGATATTTACA	a`aa[aaaa`_a`a``a__`W__^]`a`^_`__a_^	chr10.fa		5144735	R	36	119					
+HWUSI-EAS610	1	4	52	1581	509	0	1	TTAAAACCACAGATGGTTATGTCATGATTTGTAACA	`Va`aa_````_`ZWNWa^`[Y___]^]^\V\^_^]	chr10.fa		5144752	R	36	119					
+HWUSI-EAS610	1	4	71	626	546	0	1	GGAGTACAGACACATCCTTAGTACTCTCCCTTAATC	aaaa\a_a_a]^`aa^_a_^]Y]_^``__^____`_	chr10.fa		5145002	F	36	119					
+HWUSI-EAS610	1	4	8	361	1895	0	1	GTTAACCTAGGCCTAGTCCTGGAAGCTTCCAGCCTC	a`aab`b`aaZbb\ba]a_^_a^a^`\`a_a_``^a	chr10.fa		5146040	R	36	19					
+HWUSI-EAS610	1	4	83	340	1299	0	1	GAATCACCTTGAAAATGCAGAAACAGCTGAAGTGCT	\S\a`Z`a`b_\\a_ab_R_``]abaa__RaaL^a`	chr10.fa		5146141	R	36	118					
+HWUSI-EAS610	1	4	90	781	53	0	1	GAAATAGATTAGTGCACCAAACAGTTAATTCATGAA	aZ\aaaa`^Z`a]a_a]aa_]_``_a__`_[^_a__	chr10.fa		5146272	F	36	119					
+HWUSI-EAS610	1	4	75	1165	1903	0	1	TTCTTAAAAGGCTTTAGAAATCAAGGATTAGACTAT	ab_abaaa`aaaaa`]`\Z^a_a_a`a``aa`_`\a	chr10.fa		5146309	R	36	119					
+HWUSI-EAS610	1	4	79	1622	1213	0	1	TGAAAGAGTCTAAGCAGTNGACGACAGGCAGAAGTG	a]aaaa[WY[b_ZS___TDZZZY_Y^ZW]SL[\UG`	chr10.fa		5146420	R	18G17	109					
+HWUSI-EAS610	1	4	37	84	1382	0	1	TGACAAAGCCCAGTGATATTTAGCAGCAAATTCTGT	ababaabbbbbb][^X\Yaa````Kaabb^a\abbb	chr10.fa		5146558	F	36	119					
+HWUSI-EAS610	1	4	5	258	570	0	1	TGTATGGAGCTATGAGTCAGCCCCCAAGGGAGAGAG	a\O__`b_RV]bbbb][^^baXbW\`a_[^W]a`P^	chr10.fa		5146625	R	36	118					
+HWUSI-EAS610	1	4	77	419	1780	0	1	AACATTAGCTATCCCTAAACCTTATGTTTTAAAAAT	aaa`aaaaa_Xa`aaaaaaaa__a`_\`a_`aab__	chr10.fa		5148451	F	36	119					
+HWUSI-EAS610	1	4	23	471	418	0	1	TGTTACAGTGCAAAAAGAAATCATCAATATTTAAAC	`a``a]``[_a_[_]W`[``a]^``^aaaaa\aa`]	chr10.fa		5148791	R	36	119					
+HWUSI-EAS610	1	4	40	1305	1199	0	1	ATGCCCTTCTCCACGGCGACAGTCTCAACTTTAGCA	aaa[[__a_V]V\RZR]aYOU^NMQSXVRSVZ^BBB	chr10.fa		5149666	R	36	105					
+HWUSI-EAS610	1	4	27	855	1633	0	1	AGAAGCGATGCAACCAACAGTAATAGTCTAGTGAGT	a`aabaa_``\```aTYXR\`U`]]`][a_a[`Y`B	chr10.fa		5150059	F	36	114					
+HWUSI-EAS610	1	4	11	1233	398	0	1	GAACACACAGAGATACACAGACACATGCCCGTACCC	a`baa`a`aa\aa_a_aaa``_a\_\\SV^^W_\\_	chr10.fa		5150107	R	36	119					
+HWUSI-EAS610	1	4	94	907	7	0	1	ACTTAATACATCCCAGAAGGATTTCCCTAACCGTGA	a_aaaaaa`b`\a_`aab`aa___\[_`^aU]_ZaX	chr10.fa		5150602	F	36	119					
+HWUSI-EAS610	1	4	69	1531	1255	0	1	CAGGACTATGGTTGGCTCAGGGACAATTATCATAGA	Q_aaa]\X`_`\Ja\Za`a```aS\_[SVWVa]``b	chr10.fa		5150691	R	12G23	104					
+HWUSI-EAS610	1	4	6	257	835	0	1	AACTGTCCTCAAGATGCCACAAGGTGGTTGATTACA	\IQY_Z`Za[JXZZP_aW\^]U`VO\aVa`X^_]N]	chr10.fa		5150731	R	36	117					
+HWUSI-EAS610	1	4	21	707	73	0	1	ATAACTGACAGCTTGCCAGGCAGATAGGCTTGTCCC	aabbaaaa`aa^`aa`a``a```^^``\^^[_V\^_	chr10.fa		5150820	F	36	119					
+HWUSI-EAS610	1	4	84	854	425	0	1	GGTGTTTGGGACAAGCCTATCTGCCTGGCAAGCTGT	``_aaabbb`W__^ba`R_abab`baba^W]^aaaZ	chr10.fa		5150827	R	36	119					
+HWUSI-EAS610	1	4	64	801	1364	0	1	GGAGATATATGTCCTGAGACGGTGATATAAAGAGGG	a_T\aa[Z[TYY_WaaQ]^Y[BBBBBBBBBBBBBBB	chr10.fa		5150888	R	25C7T1C	46					
+HWUSI-EAS610	1	4	1	172	1981	0	1	ACTCTGGACTGCACACAGCTCCTCAAAGGGTTAACT	a]P`YaaXb`^`a`a][aa\`aZ```S_`_Wa_a__	chr10.fa		5151048	R	36	119					
+HWUSI-EAS610	1	4	43	1122	1795	0	1	AACCCTTTGAGGAGCTGTGTGCAGTCCAGAGTATAG	a`^a]^^a_a_`_`[\aR`Z\Ya_WTW]_[[TX[[]	chr10.fa		5151052	F	36	119					
+HWUSI-EAS610	1	4	69	582	71	0	1	AATTTCAGAGACTTCAGGTATTTTGGAGAAAGTTGC	a^abaaabaa^^aa^`a]U`a_^`a`XaWN[aW_[_	chr10.fa		5151536	F	36	119					
+HWUSI-EAS610	1	4	54	1150	2027	0	1	ATGCTGCTCTGACACACGGTGGGAAAATGTTTCCTC	`ab``a```__a_a_a_`_S[\a\`[\_`V`^\\Z[	chr10.fa		5151836	F	36	119					
+HWUSI-EAS610	1	4	62	1588	1450	0	1	CATAGTTGCGTGCTTGGCTTTCATCGTCAGCATCTT	a``O]X`^]UXXU]Z][JU]YUX][NJRUXWWWWRZ	chr10.fa		5151934	R	36	117					
+HWUSI-EAS610	1	4	52	938	1631	0	1	TACGCCTTCAGCCCACCCCTCTGTGGTCATGGTAAG	ab``a`a]`__]_^a_a^aa`]^\aZU\T`_ZW_a^	chr10.fa		5152038	F	36	119					
+HWUSI-EAS610	1	4	9	713	754	0	1	CTACAAACGAAGGAGCCAGCTCCTAAATTAGGATCT	abbbbbbabaab`abaabaabaabaa_abaaaabab	chr10.fa		5152180	R	36	119					
+HWUSI-EAS610	1	4	5	249	1080	0	1	AGGGAGATTAAATTGTCTCTTGGTCCCAAACTAAAC	a]ba`aZ]aaaR___`a`a_^_`YZZ`S\U[_BBBB	chr10.fa		5152569	R	36	101					
+HWUSI-EAS610	1	4	24	636	1159	0	1	GTAAACTAATGCCAGTCATGCCAACCTTGGCTGGAT	`WUTT\]RJVSWSQSM[V[VQOVP]R\U[UNWSTUX	chr10.fa		5153246	F	36	117					
+HWUSI-EAS610	1	4	91	870	753	0	1	ACTAATGCCAGTCATGCCAACCTTGGCTGGATAATG	a`aaabaaabaa_aaba`ab]_aaaa]aba_a`Yaa	chr10.fa		5153250	F	36	119					
+HWUSI-EAS610	1	4	99	1000	339	0	1	TGACTGCAGGTCGCTGTCATACTCTGCTGTCACCTG	abb`aaa\aaU_a\`aZaaaa`aa^a^_a^]a^]_a	chr10.fa		5153370	F	36	119					
+HWUSI-EAS610	1	4	25	1138	1474	0	1	TTAACAGCCGCCTCCGTGTTAGCCACAGGTGATGGG	aba_K^a\P[]V^\S`N[L^XZRRVRK^]SYUOYY\	chr10.fa		5153470	R	36	117					
+HWUSI-EAS610	1	4	48	657	349	0	1	CAAGTGGGAGGTACCTGGTTAACAGCCGCCTCCGTG	`aaa`aaaaaa`aaaaaa`aa``a`_aa`aaa`a\a	chr10.fa		5153488	R	36	119					
+HWUSI-EAS610	1	4	86	822	1089	0	1	CAAGTGGGAGGTACCTGGTTAACAGCCGCCTCCGTG	_a[a]aa`[aa`aa__a_[aa``aa_```\``^a`a	chr10.fa		5153488	R	36	119					
+HWUSI-EAS610	1	4	89	211	1533	0	1	TTGGTCTGTGGCTATGAGTCCCCAGTTTCATCGAAT	aabaabab_babbaaaa^Xaba_R__`a`[]a]F]a	chr10.fa		5153578	F	36	118					
+HWUSI-EAS610	1	4	50	652	897	0	1	TGGTCCCAAATTCGATGAAACTGGGGACTCATAGCC	_baaabaaa_abaaaa^_bbaaaaa_`aa`a`aa^W	chr10.fa		5153587	R	36	119					
+HWUSI-EAS610	1	4	16	377	607	0	1	CACTTCACCAACCAGTAGCTCAGTTGGGGTGGCGAC	_Z`_XZa[_X]_\\\__^a^`WY_a``_]GQZ[_UW	chr10.fa		5153678	R	36	118					
+HWUSI-EAS610	1	4	82	519	812	0	1	CTGTAAAGTGAAGCTGTGCCTTGTTATGGGCCACAT	abbabaab\aabaaaa]`^baabaaaaaaa_aa``a	chr10.fa		5153966	F	36	119					
+HWUSI-EAS610	1	4	50	821	1432	0	1	GTGTCTAGGGGGATGAAGGAGCCTGTGGCAAACTGA	]\][^a\`aaa`]``aZ`\`^^W`]^\_\W^^W\`U	chr10.fa		5155685	R	36	119					
+HWUSI-EAS610	1	4	82	581	1431	0	1	TGACAGCTTGTGTCTAGGGGGATGAAGGAGCCTGTG	_`bba`b``_H]_b^`[_bbaaabab_b]^baa]ab	chr10.fa		5155694	R	36	118					
+HWUSI-EAS610	1	4	82	94	976	0	1	AGCAAAATAGCAGGCAGGGGGCTTTGTGGAATGAAT	R[_HPQVZQX`[_a\S^\ZZbaJ_W^^abVHO_QKa	chr10.fa		5156704	R	36	116					
+HWUSI-EAS610	1	4	37	1571	1085	0	1	GATCGAGAAGGGGATGTAGGAGCCACACCATGGAGG	aabaa_]^`a^aa^a]`a_]\\\^\`\^W]^YZV^Y	chr10.fa		5157113	F	36	119					
+HWUSI-EAS610	1	4	73	16	519	0	1	ACATGGTGCTGGAGGAGCCAGGAGTTCTACTAGACA	Z`V`bb_ab^^_Z^`IWb`W]a]`ZYb_\_Z^^]a]	chr10.fa		5157292	F	36	35					
+HWUSI-EAS610	1	4	67	1291	680	0	1	GGGTTAGGATTGGGTGGTTAGTGTCCTGGCTAGTTT	`Z_\aZVNP_^`U[QN^YLN`GZYTRZSGLT[]W[[	chr10.fa		5157673	F	14A21	94					
+HWUSI-EAS610	1	4	33	1166	245	0	1	TTTAGCCCCCTTCACCTCCCCATGCCTTCCTGACGG	a`a``^^]`^aa^`XY`Y]XaaVV[S\\ZZXX`\\\	chr10.fa		5158194	R	36	119					
+HWUSI-EAS610	1	4	59	1220	32	0	1	GCACCACTTCCTGTGTTCTCTCTGATTTCTGGATAC	a]YZ^UZN`__]]UXVQQU]VIVVQT^RQX_X]G]U	chr10.fa		5158246	R	36	116					
+HWUSI-EAS610	1	4	53	776	164	0	1	ACATAGTACACACATAAAATGCATTGCTTTATAGCT	`b[a`_^_Z```_b\aWZ`aZUU__a[__``_^Y`]	chr10.fa		5158283	R	36	119					
+HWUSI-EAS610	1	4	71	1189	13	0	1	TGCTGCTGAAGCTTCCAGCTAAGTCCCTCATGATTA	a_b_Z]aaaa]_ab`ab`abaaa______a]VYU^a	chr10.fa		5158487	R	36	119					
+HWUSI-EAS610	1	4	84	490	991	0	1	AGTGGGACTCTAGCTGCCATCGCCTCCTGTGCTCTG	P_\``a`_aaaaaaaa`aaaaaaaaaaaa`_a``aa	chr10.fa		5158601	R	36	119					
+HWUSI-EAS610	1	4	45	782	760	0	1	AGAGTCAGATGAGTGCTCATAGAAACCATTGAACAC	VaX`aZVZb[ZVTOR\^a\aaW\SS]]Yaa`Vab`R	chr10.fa		5158899	F	36	118					
+HWUSI-EAS610	1	4	85	648	577	0	1	TATTAAACCAATATAGAAAAGGGGTGGGCTCTACCT	a]aaaa`_a^``Z__aZT]a`aaMG^W^__\PUX\\	chr10.fa		5159930	R	36	117					
+HWUSI-EAS610	1	4	38	288	879	0	1	GANCCCACCCCTTTTCTATATTGGTTTAATATAGGC	aWD^bb`bbbaaabaa_Z_\aaab^aaaaaaa_aaa	chr10.fa		5159935	F	2G33	110					
+HWUSI-EAS610	1	4	55	157	596	0	1	GCTAGTACACCTCGAATTAACTACTATGCCTATATT	abaab]abaabaababaaa_aaaaaaabaa_a_a`a	chr10.fa		5159962	R	36	119					
+HWUSI-EAS610	1	4	20	1167	1674	0	1	AGAAATAAACCTGTTAAATAGGGGCTACTGCATGAA	abababaaa`_abaaaa`aa`a`a`aa\`a__aa__	chr10.fa		5160296	F	36	119					
+HWUSI-EAS610	1	4	20	1196	1668	0	1	AAGCGCACTGAACTTGCCTTTCCTTCACTCTGACAC	a`Z[a_a\`a^^^``a\`_aa\Y`]\_\_\__\Y\\	chr10.fa		5160569	F	36	119					
+HWUSI-EAS610	1	4	60	1209	1634	0	1	GCTGCTGTATCCCAAGAGTTGTATGAGCCAGGACTG	`aaaaaVY`\X_`V`a`a^a`^\`]`^Z^``_\U^`	chr10.fa		5160690	F	36	119					
+HWUSI-EAS610	1	4	78	1495	951	0	1	CGTAGAGAGTCCGCTGTTTCTCACTGATCTGAACAA	ab]```Z_aU^^`^[[``b]``a^a_`a[[^^_U``	chr10.fa		5160976	R	36	119					
+HWUSI-EAS610	1	4	76	1284	1321	0	1	GGTCTGATTTCCTCTGTTTCCTTCTTAGACCCCACC	a]X[[T[a[]H`]QYOR^aM```_U_aa_[X__aa^	chr10.fa		5161306	R	36	117					
+HWUSI-EAS610	1	4	55	213	1962	0	1	CCAAATTGGCCTCATCAGGGAATGCTCCCCAGATTT	aba`[`baaaaa`a`aX^`^X[^`a^`\a^T^L[\\	chr10.fa		5161482	F	36	119					
+HWUSI-EAS610	1	4	65	1689	1775	0	1	ACTCTTTCCCACTGAAATCTGGGGAGCATTCCCTGA	aabaaaaa^`baaa_aaa^aa`[a____`_^Z``V_	chr10.fa		5161496	R	36	119					
+HWUSI-EAS610	1	4	3	1016	884	0	1	AGACTAAAGCAGGTCTCCACATCCTTAGACCTCAGT	aaaaab`aaZaaa[aaaab_a``_``aaa][__`b^	chr10.fa		5161758	R	36	119					
+HWUSI-EAS610	1	4	11	510	929	0	1	GGGGACTGTCATATGCTGCTGGGTCCTAATTAGCAT	``^`aaa^^[^`aaaa`a_^a\QOV`\RYa__aX^]	chr10.fa		5161832	R	36	119					
+HWUSI-EAS610	1	4	85	1326	680	0	1	AACCACCAGGAGGGTGCTAGGAACTGAATCTGGATG	a`Z[]^a_ZbU]`aYZ`I_baaa_a_JXGIZX^[`B	chr10.fa		5161958	R	28C6T	99					
+HWUSI-EAS610	1	4	66	636	459	0	1	CACCTGGCTTTTTTTGTTCAGTTACATGTAATTACT	aaba^^a_ababbbaa^ba_a_aaaaab_aabaa_b	chr10.fa		5162146	R	36	119					
+HWUSI-EAS610	1	4	94	903	675	0	1	AGCAGGAAGTGCTCTTACCCACTGAGCCGCCTCTCC	\`TaaaX[[aa[a`\`_XIXTa`aaa__a_`_`^_[	chr10.fa		5162280	R	36	31					
+HWUSI-EAS610	1	4	59	279	1225	0	1	CTAGCAAGACAATGGATGGCAGTCAGAGAGAACAGT	a`]`XTXaaaX`a`aZ^`a`\`^^Z^ZXN\Y]]][W	chr10.fa		5162972	R	36	119					
+HWUSI-EAS610	1	4	34	133	493	0	1	GGTTATCTCTCCCTCTTTTGGAGGCTTATCATCCCT	a^RSWZaaaTK[[GX]XY`_[]Ua_a]V][a[_Y]U	chr10.fa		5163222	F	10A25	102					
+HWUSI-EAS610	1	4	85	1174	1034	0	1	GGGTGTTGGGGGAGCTGTGGTCAGTTACCTAGGTTT	aba\a_`aaZa`_a]a`]a`\^_`\^]^_`\aa\a^	chr10.fa		5163260	R	36	119					
+HWUSI-EAS610	1	4	57	1187	288	0	1	TTTATATTGTAATTAGTAGTAATAGCAAAATGACAG	aaaaaa`a]\_`a`_a]_a]a``^\^a`\_`^^^^a	chr10.fa		5163919	F	36	119					
+HWUSI-EAS610	1	4	63	1656	1241	0	1	AGCATGAGGAACTGCACTAAAGGTTTGCAGCATTAG	aa_aaaa__^a_aa_a_aaa^`a^aaa__]Z`]__^	chr10.fa		5164000	F	36	35					
+HWUSI-EAS610	1	4	37	80	564	0	1	ACCCAACCTTCCTAATGCTGCAAACCTTTAGTGCAG	Q_aa^T__Z]_b[WU\abZ\_]TZ^^\\\\a`a`\_	chr10.fa		5164011	R	36	46					
+HWUSI-EAS610	1	4	15	573	1398	0	1	GAGTCCGGAGCAGTGGTACCCAACCTTCCTAATGCT	aaa\aaa^]a``\Q_`R`_\aUYTV[\VY_V^U^[^	chr10.fa		5164028	R	36	119					
+HWUSI-EAS610	1	4	72	749	346	0	1	GCCCAAACAGCTTGCAGATGTTCATTACAATGAGTC	_````^_]_Y\aaXMW`^a]^[Q]T_]P_`_```__	chr10.fa		5164422	F	36	118					
+HWUSI-EAS610	1	4	6	1751	1320	0	1	AGGGCCACAGCAGGATATCCGAGAGGAGTCTCCGAA	a`\[a]V\a^`\_Z]X\^YX_YUX`U^_W\UVS^WS	chr10.fa		5164509	R	36	48					
+HWUSI-EAS610	1	4	100	1435	1553	0	1	AGGAGTGTTAAGTAGCTTCAGTGGCAGAAATAGGGC	abaX``b^Xb[b\\``]P\a]Qaaa_aaaa`__a\B	chr10.fa		5168080	R	36	114					
+HWUSI-EAS610	1	4	22	1483	500	0	1	AGAAAACTTGGCCTCCTGCATCAGGATTATTATGTG	aa^a``a__^^``^_``]a`aZ]]^]^^_`]^__Z_	chr10.fa		5168146	R	36	119					
+HWUSI-EAS610	1	4	83	807	1543	0	1	ACAGAATCCTCCTCTATGGTGGCCTTCTAAGTCTCT	aaabaa^]Y_aa_`a\a_a]`_[\`_^`_`]]__\Y	chr10.fa		5168561	R	36	119					
+HWUSI-EAS610	1	4	58	682	809	0	1	AATCACTGTCGCTTCGAGCTTTTTCCTGGGTTCCTA	aab_a`aa__Y[aa^a^`__`aa`]]_``aU^X]__	chr10.fa		5168648	R	36	119					
+HWUSI-EAS610	1	4	60	54	797	0	1	CTCGAAGCGACAGTGATTCACAGAGCAGTTGGCAGT	a_aa^`aaa_ZG\[_Y\W`_]X\Z_^Z_W__\`^^Q	chr10.fa		5168666	F	36	118					
+HWUSI-EAS610	1	4	22	287	1228	0	1	GGCTTCCCAGTCACCCGTGGATAGGCAAACATGTCT	a]_]abb`]X^___bab]__T^^`_]a\]]``_U`\	chr10.fa		5168810	R	36	119					
+HWUSI-EAS610	1	4	59	1078	1576	0	1	TGGGCCACAGGTATCTTTCCTATACTACCTAGCTTT	`aaa]^_WaZ]Ia]a\G\K]]]`_\a\V``a`Qaa`	chr10.fa		5169256	F	36	117					
+HWUSI-EAS610	1	4	26	119	1930	0	1	TAAATAGATGGAGTTGGCTGGTTAGATGGATGGATG	]QTbaa`Z]a`Ya`abababb_``a_aa`S]b_ZVb	chr10.fa		5169371	F	36	119					
+HWUSI-EAS610	1	4	65	1237	1126	0	1	TCCCTCCCTGGTGTTGAGATTAAGGTATGGAACAAT	^F[`^L^NRVPK_PWSL_^]][][TJPO[QQWSYTR	chr10.fa		5169669	R	36	115					
+HWUSI-EAS610	1	4	62	546	840	0	1	ATACCTTAATCTCAACACCAGGGAGGGAGGTATCTA	abb_Y`a`_a[b_aa]aZ^]a`R^Ya\F[`W\\]^`	chr10.fa		5169677	F	36	117					
+HWUSI-EAS610	1	4	16	907	1187	0	1	AAGCAGAGAGCTTTGTTATCTTGTGTGGTGACACTG	abb`ab]b`a`aaba\a_``aab]a\aa[`][V^`a	chr10.fa		5169906	F	36	119					
+HWUSI-EAS610	1	4	81	379	919	0	1	TGCAAACTGTCCAGTGTCACCACACAAGATAACAAA	]ZaS\bbaaaabab]aabbbabbbbabb`aabab`U	chr10.fa		5169917	R	36	119					
+HWUSI-EAS610	1	4	100	118	348	0	1	ACTATGCTGAAATTCCCTGTCACCAGATAGAGAGCA	\S`aabb]baaaYSa]aa]Q\`Taa`_UZZ`]XOR`	chr10.fa		5169998	R	36	118					
+HWUSI-EAS610	1	4	67	1518	561	0	1	GCTCTGCTTTTAGGACAGGCTCCTTCACTGGCCCAC	_bb]\\``^^]\NG\]^XOYbaYXaa]HMRN`RQZZ	chr10.fa		5170069	R	36	116					
+HWUSI-EAS610	1	4	67	22	1506	0	1	GCCTGTCCTAAAAGCAGAGCCATCATCTGTAATTGC	__[^`U^WU\a\X]a_[W[aSaa`WX`^_H[NZ^ba	chr10.fa		5170085	F	36	118					
+HWUSI-EAS610	1	4	52	1498	725	0	1	TCTGAAGCTGACCACCTCCAAGGCAGACCCCTAACC	aabaaa]`a`]^``_aa^__^ZU^__\W\\^^R_Sa	chr10.fa		5170184	R	36	119					
+HWUSI-EAS610	1	4	46	551	1677	0	1	ACAATGCTGGAGAAAGGCAATGGCCTGGAAATTACT	a^]_`aaXaa[`\`a`a`a_^a[[^Z[][R`^^`]V	chr10.fa		5170241	F	36	119					
+HWUSI-EAS610	1	4	95	412	680	0	1	CTAACCCAAAAAGCTCACTGTTTCCTGGTAGTAATT	abbb^bbbbbbbbaaaaabbaaabaabaZbbaaaaa	chr10.fa		5170270	R	36	119					
+HWUSI-EAS610	1	4	73	564	116	0	1	TGACCTGGATGCTGGGGATGTAACTAACTTAAATGG	aaaaaaaa_aa`aaaaa^aa_`aXa__^aaa_a``_	chr10.fa		5170406	R	36	119					
+HWUSI-EAS610	1	4	51	1262	926	0	1	TCAGCTGAGCCAGACAGAGGTCAGGACTGTCACTGA	a]Z]`a[TZZYNOOYRY^XUPUW^QPTSQJRQNTXV	chr10.fa		5170490	R	36	117					
+HWUSI-EAS610	1	4	3	1385	1067	0	1	ATGGACGAGGTGCAGATGCTCCAAGACGAGATCAAT	aaaa_Za`_K[P]_[]\a`aaQV_\W\WY`[[W`^Z	chr10.fa		5170631	F	20A15	80					
+HWUSI-EAS610	1	4	40	725	1246	0	1	GACACCTGGAGCCCATTGATCTCGTCTAGTAGCATC	aaaaaaabaaa`aaaaaa`a`a``__`^]^__^_a`	chr10.fa		5170645	R	27T8	84					
+HWUSI-EAS610	1	4	88	380	2022	0	1	CACTTTACGTTCTGCTCATTGCCCCCCTCTAGNTCA	aaa[b`bab[Zb__a_a]Q^__``^`aU_\XBBBBB	chr10.fa		5171298	R	32G3	95					
+HWUSI-EAS610	1	4	51	1336	551	0	1	AGCCTAGGTGCCCAACAACAGATCATGGGTAAGGAA	aaa__]LUR]``[``aa\YOXZXNXRV[]QX\[\[`	chr10.fa		5171605	R	36	118					
+HWUSI-EAS610	1	4	67	1148	1569	0	1	TGTCTACTGCAATGCTCACAACTGCCAAAGTATGGA	``aa]`Y`UXaa_a]`[`_a`Xaa_[`\\a_`]W_^	chr10.fa		5171644	R	36	119					
+HWUSI-EAS610	1	4	71	976	1255	0	1	GGCATATTAACTTGTGAAAATACTTTTTTACTTCTG	`_bV^Za\YZ`a^SZZZT^[a_U`_`a[[_]`__^^	chr10.fa		5171956	F	36	119					
+HWUSI-EAS610	1	4	49	1558	920	0	1	AATCATGATGGAATCAGTAGTAAATAAAATAATATT	`baa_^^_`V`^`b^^`aaa^aa_``abaa^_aaa`	chr10.fa		5172429	R	36	119					
+HWUSI-EAS610	1	4	20	1035	47	0	1	GGCTAGCCACAAGATCCAGCAAATCGTGTAGCTATT	a_\S`_\_Z_]WVQ[T][Q[]^SW]_X]]_]UX\]X	chr10.fa		5172511	F	36	118					
+HWUSI-EAS610	1	4	59	908	101	0	1	CAGGAAGTCTTTTTCTGGCCTTTTCAGCACACACAC	`abbabb^Yb`aba`abb__bbaaa```aaa]aa``	chr10.fa		5172709	F	36	119					
+HWUSI-EAS610	1	4	11	643	756	0	1	ATTGTTGCTCATTTATGTGGAGTTGATATCTCTTAG	abbbbbb[bb_bbbabaabbWbRaaaaa``aa`baa	chr10.fa		5173069	F	36	119					
+HWUSI-EAS610	1	4	62	750	173	0	1	GTGGAGTTGATATCTCTTAGTCAGCTGCTGTCCCAA	a_aa^aaaa_`\`U__`_``X^__X^ZZ__XX^]_^	chr10.fa		5173085	F	36	119					
+HWUSI-EAS610	1	4	99	1480	1383	0	1	GGGGTTTCTGTGTCTCAGCATTAGCATGTGATGAGT	aa`aU\a]a``aTW_\Z___]L[RQL]XN]^]^]^U	chr10.fa		5173316	R	36	118					
+HWUSI-EAS610	1	4	22	824	384	0	1	ACTTAGCTTCTCCTGAGGAGAAAAGGAGGGGTTGGA	aabbaaabbbbaabb^bb`b_a\`bb`aaaa_`_a`	chr10.fa		5173456	R	36	119					
+HWUSI-EAS610	1	4	20	963	1180	0	1	GGATGTTGCACTGGGTACATCCCAGGAGCCCATGGA	abaabaa_]a^aaaaMa]_a]aa\aYS__M^]ZaXQ	chr10.fa		5173590	F	36	118					
+HWUSI-EAS610	1	4	38	1424	873	0	1	GGATGTTGCACTGGGTACATCCCAGGAGCCCATGGA	^W]aa`_aU^``^]ZLZ`aQ_X[aa[V]^\[RZM[]	chr10.fa		5173590	F	36	118					
+HWUSI-EAS610	1	4	57	1740	173	0	1	ATCTGGAATTGGTTCTTATCAACATTGCCAGTGGTA	aba_SJYaaaUY\_`aa```aa\a_ZQ\`]PTQX[_	chr10.fa		5174038	F	36	118					
+HWUSI-EAS610	1	4	85	331	115	0	1	CGGATGTTGGGAACTGAGCACAGATCTTCTGGAAGA	a]ZX\YTa`\`]aV[]U[YRPZ^]UNY^[MVVNZ^Z	chr10.fa		5174136	R	36	36					
+HWUSI-EAS610	1	4	58	1021	1813	0	1	GTGCAGTGTGCTTCCCTCCGTGTCAGGTTTCTAAGA	aaaaaa_a`aQbb``^`^`a\b_`aaaZ`a[`_]_a	chr10.fa		5174920	F	36	119					
+HWUSI-EAS610	1	4	65	302	1418	0	1	AAAGAGTTCTGGGCTTGGTTTGACCTTTGGTTTGAT	a]aaXZ\_`a`a``a`_a^_^`aX```___FP^]]]	chr10.fa		5175018	F	36	117					
+HWUSI-EAS610	1	4	1	1139	36	0	1	TTTGATGGTGGACACATACAGGATTAATGTTTCGTG	^```_]_ZX\NJR_^]P\T^_`P^[YOPTN\NQZQX	chr10.fa		5175689	R	22T3C9	77					
+HWUSI-EAS610	1	4	14	357	1316	0	1	ATGTTAATAATCATGAAGTTTGATGGTGGACACATA	`aaab^_`b]aa_aaY^^^aaa`a`a^a``ab^^`^	chr10.fa		5175707	R	36	119					
+HWUSI-EAS610	1	4	66	541	1071	0	1	AGGGGACCTGATGCCCCCTTCTGGCCTCCTCAGGCA	_`a\`ZN[YW`a[X^aX`XR]\^^NTXX[MPU[EY^	chr10.fa		5175896	F	36	25					
+HWUSI-EAS610	1	4	1	1020	787	0	1	GGCACATAGAGAAACACTTAAAGCATTAAAGTGTGA	Z_b\]abbbbbbaZG][Y`b_Z\`bb``aa_G_a`]	chr10.fa		5175986	R	36	117					
+HWUSI-EAS610	1	4	55	1165	7	0	1	ACATCCGAAAGAGGGGTTGGCACAATAGCTTGGCTG	aaa`_WY\`[NVME`XS_]T[\KY\PRWQ[BBBBBB	chr10.fa		5176173	R	36	90					
+HWUSI-EAS610	1	4	59	686	1889	0	1	AAAGAGGGAGACAGACAGACAGACAGACACTGGTCC	T_aab]babb`ba````\]_b_`]_aaaa^`_Y\[]	chr10.fa		5176729	F	6A29	8					
+HWUSI-EAS610	1	4	34	441	473	0	1	ATGGCTCCCATAGGCTCATAGAGAGTGGCACTGTTA	^bbb_aaaaaa]aaaaaYa_a]b[a[]Z]X^][R_T	chr10.fa		5176835	R	36	31					
+HWUSI-EAS610	1	4	68	606	1991	0	1	TACCACGATCAGCTTCTGTCATCTTCTTTTTAAAAA	abbabaaaaaaa`aaaa`_a_aaaa`aaaaa`aa_a	chr10.fa		5177124	R	36	119					
+HWUSI-EAS610	1	4	59	987	546	0	1	GAAGCTGATCGTGGTACGATAAAACCCATAATTTCA	aaaa`aa``_a]aaW`_a__a``_T^__``__^]T]	chr10.fa		5177144	F	36	119					
+HWUSI-EAS610	1	4	71	104	20	0	1	TATAATTAAAAATACATTGGAAGAGTCATATGGAAA	aaaaba`__Za`ba_GY_a```\^a`aaa]`_R_]`	chr10.fa		5177398	R	36	118					
+HWUSI-EAS610	1	4	72	1446	1103	0	1	ACACAGCAGGGACAGAATTCTCACATCTTGACAGCC	aaa_a`[_VT[Y^aX`aa`_`^_\`_W__\^W[[[_	chr10.fa		5177619	R	36	119					
+HWUSI-EAS610	1	4	60	162	1986	0	1	TCCAAGGCTCCCTTTGAGTAGCCTCAGCTTCACCGC	abb``aab`bbba`aabaZX_aa_baaa]`_\aa``	chr10.fa		5177777	R	36	119					
+HWUSI-EAS610	1	4	53	279	1382	0	1	GCCTTGGAGAGCTGCAGAGGGCCCTGCATGACAGAC	`_`RVOYP\RNZ\OR[]\SSPR`\RJOKUYY\]]BB	chr10.fa		5177805	F	36	108					
+HWUSI-EAS610	1	4	89	1687	1486	0	1	AGAGATGTATGTGGTAAGTGTGTCACAAGTGCCATG	a_Z]XSa]a[`]a_Xaa]W_Y___`]a^[ZO]Z`]]	chr10.fa		5177883	R	36	119					
+HWUSI-EAS610	1	4	6	570	1095	0	1	GTGGAATTCAAGGTCACAATAAGTGCTGAGATCTGC	`T``aX]aaa_]aRaa_`_a_``Z`X_a^a___a``	chr10.fa		5178431	R	36	119					
+HWUSI-EAS610	1	4	11	1009	990	0	1	AAGCTTGCCATTCAAGAGACTTTCAAGTGTCTTTAG	T[]`^T`a^_^``````_N_^W_`]H`abZZ`aabb	chr10.fa		5178613	R	C35	93					
+HWUSI-EAS610	1	4	98	499	1233	0	1	TGGGTAGAGCCACCAGGGCTGTTTATTTTGGGAAAG	``b`_aa`ba_baa_aa^H__YR_abaaaaZa[]aa	chr10.fa		5178812	R	18A17	106					
+HWUSI-EAS610	1	4	12	1658	1421	0	1	TGAGGCAGTCCTGGCAAGAGGAATGCAAACCTGGAG	aaaa`aa`\]Y[\\QQY`[[]YYY^U[\VJO^\ZS^	chr10.fa		5178911	R	36	118					
+HWUSI-EAS610	1	4	43	911	391	0	1	TTCAAAATGACTGAGTCAGAAAACTTTACCAGATAT	aaaa`a`aaa`^Y[a_aaa_a``]a```]Y`a_a_`	chr10.fa		5179022	F	36	119					
+HWUSI-EAS610	1	4	94	761	1366	0	1	TAAGCGAGTTTCCTGTGCATTTGTTTGTTTAATCTG	a_V`a`Oa`aba^aaaaa`baaaa`ab^a`aZa`ba	chr10.fa		5179086	F	36	119					
+HWUSI-EAS610	1	4	75	416	573	0	1	TGTGAGTGGAGCCTATGGTCTGTGAGGAGTCTGTAA	aaVa_a\a__a`__\`aa\^_aZZ^__U_W\\`XZ_	chr10.fa		5179293	F	36	119					
+HWUSI-EAS610	1	4	40	1012	1874	0	1	TGGAGAGGAAAGAGTTTATTTGGCTTCTGTATCCTG	aa`RaYbaTT]]W`_a___a`^N_`_Z_]QTa^XYZ	chr10.fa		5180381	F	36	37					
+HWUSI-EAS610	1	4	45	1674	1775	0	1	TGGAGAGGAAAGAGTTTATTTGGCTTCTGTATCCTG	`Z^Q^U_XTYUQRRL[_^`[\`]TXUWZYKT[RQZ\	chr10.fa		5180381	F	36	28					
+HWUSI-EAS610	1	4	11	780	1733	0	1	TGTATCCTGAATCACACTTCATCGTGGGGAGCGTGA	abRaaaa`a`baaa`_UabaaaaaY``aa\[_aZ_`	chr10.fa		5180408	F	36	119					
+HWUSI-EAS610	1	4	73	1437	1470	0	1	TAAGAAAGCAGGCTGAGAAGCTCATGCNGAGCAAGC	a[a[`aab`]TFS_OORP^`^`aZT\XDMYZU_\X[	chr10.fa		5180511	R	27A8	108					
+HWUSI-EAS610	1	4	85	696	158	0	1	CTAGTTTTATGTCAGCTTGATACAAGCTAGAGCCAT	\]\_]bXbbaYT_[Vaab^bb^a^U\a_Za`a]ZQ`	chr10.fa		5180679	R	36	9					
+HWUSI-EAS610	1	4	29	422	1665	0	1	GAGCCTCTGTGTAAGCTGCAGAACTGGAAGGCTGAG	a^aaaaaabT`]aaaaZ`a`Z_a\\]]a]a_]M[RV	chr10.fa		5180824	F	36	119					
+HWUSI-EAS610	1	4	75	213	744	0	1	GCAGAACTGGAAGGCTGAGTTCTTATCTTATCTGCC	a``a``a_aa_[``_^`N^R^a_^[`_X_^_`^``_	chr10.fa		5180841	F	36	119					
+HWUSI-EAS610	1	4	52	1538	1542	0	1	GAACTGGAAGGCTGAGTTCTTATCTTATCTGCCTTC	_ab_^^_\aZ_]aa`a\`Zb``_^aa_``W]_]`__	chr10.fa		5180844	F	36	119					
+HWUSI-EAS610	1	4	78	391	1530	0	1	GAAGGCAGATAAGATAAGAACTCAGCCTTCCAGTTC	RQW`b`\`aaa\_aaW``U^a`ba]]a``Xaab__b	chr10.fa		5180844	R	36	119					
+HWUSI-EAS610	1	4	87	1679	691	0	1	GGAAGGCTGAGTTCTTATCTTATCTGCCTTCCTAAG	`bbbbbab_bb`bbabbabbbab`a_a`baaabbaa	chr10.fa		5180849	F	34CT	43					
+HWUSI-EAS610	1	4	34	1171	301	0	1	GAAGGCTGAGTTCTTATCTTATCTGCCTTCCTACTT	_abaaabaab`a`aaababbab_aa`_`a`]aa[aa	chr10.fa		5180850	F	36	119					
+HWUSI-EAS610	1	4	2	351	127	0	1	ATCTGCCTTCCTACTTGGGGTTGGGGCAAGGGACGG	`_]````_XV_``T\a``aaV[`X]\ZZ]`\^ZX``	chr10.fa		5180870	F	36	119					
+HWUSI-EAS610	1	4	6	1579	1421	0	1	TGCCTTCCTACTTGGGGTTGGGGCAAGGGACGGGGA	`a`aaaXaaa^aa`a_a_aaaaaaa_a``_aaaa[W	chr10.fa		5180873	F	36	119					
+HWUSI-EAS610	1	4	49	1687	723	0	1	TCAACCCTGAGACCAACCCTTCCCCGTCCCTTTCCC	aaa^\^`_Z]^\^``^_Z[\`\[YQQWYBBBBBBBB	chr10.fa		5180893	R	32G3	82					
+HWUSI-EAS610	1	4	22	504	1370	0	1	GGACGGGGAAGGGTTGGTCTCAGGGTTGATAGCAAG	a_TPa_]T_]TUTDXaa\aa]N]]URa^U\XZYZYT	chr10.fa		5180900	F	36	116					
+HWUSI-EAS610	1	4	51	176	1941	0	1	GGGAAGGGTTGGTCTCAGGGTTGATAGCAAGAGATC	ZXNYV^[TR_____[aTZ]SNWX^U`ZZ[H\QSUVW	chr10.fa		5180905	F	32TGA1	41					
+HWUSI-EAS610	1	4	31	1046	875	0	1	GCCACAAAGGCCTCTTCCATGCTGGTTCTCAATTAC	ab``aaaU^]```a`a__`_____\[a_`___a``_	chr10.fa		5180967	F	36	119					
+HWUSI-EAS610	1	4	96	322	1991	0	1	ACCTGGCACAGATCTAGGGGAGGGCATCCCAGAACT	`bbabbbabaaX\b]aa`^]\ZZaa\\`aa^a\]_S	chr10.fa		5181053	R	36	119					
+HWUSI-EAS610	1	4	65	1691	915	0	1	AATACATATGATGCATGAGACACTGCAATTGCAGCT	aaaa````a^_^_a^_]_Z^`_a^^]]]^_\\_WX^	chr10.fa		5181295	R	36	119					
+HWUSI-EAS610	1	4	92	1771	549	0	1	AATACATATGATGCATGAGACACTGCAATTGCAGCT	_\`aaaba]L\\]^[`Y_^`]Z`XT^^`UYL^YJV\	chr10.fa		5181295	R	36	118					
+HWUSI-EAS610	1	4	62	638	1656	0	1	ACACACACACCCTCACCATTTCCTTGCTGCTTTGGG	aaa_aa_a`_`[_``_`\^`a^\_^RZUU\\[YY__	chr10.fa		5181536	R	36	119					
+HWUSI-EAS610	1	4	35	962	1256	0	1	GTGGGCACAGTGCTTGCCATTCTACAAATTCAAAAA	aY`^a__^aaWYY`___]_aa^__^X`\X_^^_^_`	chr10.fa		5181675	R	36	119					
+HWUSI-EAS610	1	4	45	566	1773	0	1	CACGGTTTCTCTGTGTAACTCTGGCTGTCCTAGAAC	ab`a`[aaaabbaaba`aaabaa`aab\a]Z`\X]V	chr10.fa		5181798	F	36	28					
+HWUSI-EAS610	1	4	83	256	1271	0	1	AACCCCGACAACACTACACTCATAAGGAGGCAGCAC	VQ`bb_aaba_bbb]b_Z]_a^_QW\`]`_VLZ`WV	chr10.fa		5182465	R	36	118					
+HWUSI-EAS610	1	4	82	1441	1608	0	1	TATCATTAGTAAGTGTGTCATTGAGTCAAACTTCTG	aaaaabbaa_`a^^a`aa`aaaa``a`a^_Y^_`aa	chr10.fa		5182763	R	36	119					
+HWUSI-EAS610	1	4	70	364	570	0	1	GTGGGCTGCTTTTCTCCTTGTTCCACCTCTTTTCAG	aS[bT[TabV\Naa^a`\IXW^`aaaUVPNNYaZNZ	chr10.fa		5182902	F	36	117					
+HWUSI-EAS610	1	4	37	901	203	0	1	GGGCACATGGGAGAATAGGAAGGCATAAATACTCCT	UabaVbabb[YV`_abU`Uaaaa`^bbaH_F[`R]a	chr10.fa		5183016	R	28C1G5	95					
+HWUSI-EAS610	1	4	87	943	1811	0	1	GCCAACATTTCTCTCATGTTATCTATCCAAAATGGG	aaaVOGL^_]]_P^XT]aT\XUaTW`P^`PU\a]W_	chr10.fa		5183254	R	36	117					
+HWUSI-EAS610	1	4	23	1174	548	0	1	GAAAACCTCACCTCACTGGAAAGACAACTCCTTTGG	a_a`aY_^_a[]Z_]]^_`Z_R[`U`^_]UZX[]]_	chr10.fa		5183582	R	36	119					
+HWUSI-EAS610	1	4	14	1517	972	0	1	TGATGGTAAAGGAGAGAAAAAGTGTGGGTGTCAGAG	a``\UPT\XHWWWW]PPITJ[ZNTX`XXTXMRS]R`	chr10.fa		5183845	R	36	116					
+HWUSI-EAS610	1	4	61	1509	237	0	1	GAGAACGATGTTGACTTCACAGACACCCAGAGCCCC	a``_TTa^SRPWLWa_\_aZUHV^aZ\[VN]BBBBB	chr10.fa		5184097	F	36	96					
+HWUSI-EAS610	1	4	81	186	1702	0	1	ATTTAATCAGAACAAGAGTATTTGCCTAAACTGTGC	J_`^\Yabbbbabb`b^a^abbababbababab_ab	chr10.fa		5184832	F	36	118					
+HWUSI-EAS610	1	4	47	1002	1876	0	1	GGTCACTTCAGAGAGCAGTTGATGGTGGCTGTCAGC	^_ZOZ^`VQ^VXXTZ]TUT^ZNZ]XNPYKZYBBBBB	chr10.fa		5184923	R	34C1	93					
+HWUSI-EAS610	1	4	28	712	98	0	1	TTTCAAAACATACCCAAGGCCACCTGAACCTTCTGC	`^^a`TY__a[STX`a_PYQ\P^MUVSPTQSSS\VV	chr10.fa		5185067	R	36	118					
+HWUSI-EAS610	1	4	73	985	17	0	1	GCACTGCCAAGCATTTTGCTGTGCAGATAGAAAAAT	aaaa`__aaba`aa`baa`aa_a]`a^``a]^``aa	chr10.fa		5185237	F	36	119					
+HWUSI-EAS610	1	4	70	155	1511	0	1	TGATAACACATTTGACTCAGAAAATGATATGTGTGC	ab^bb_b`bbb``bbbaa_`abaaaab`_aa_a_aa	chr10.fa		5185316	R	36	119					
+HWUSI-EAS610	1	4	79	302	363	0	1	GTCACAGGCATACCCCACTGGCTGTAGCCCTGGTAC	a`aaa`aaa``a`a``aa]`__`_GKPT\WMYFYUT	chr10.fa		5185638	R	32T3	106					
+HWUSI-EAS610	1	4	87	361	1444	0	1	ATGGTTGCTCCGTATTATCATAACTCTGTAGGTAAG	a`ab`aaabbab\^`aaaaaabaaaaaaWaaaXa_a	chr10.fa		5185705	R	36	119					
+HWUSI-EAS610	1	4	33	583	238	0	1	TGTCATGGCAAAAACAAATAAAAGGAAAGGGTTTTC	_aa`b`\[_^_`_^aaa^^^ba\a^_]_]]^V__aa	chr10.fa		5185771	R	36	119					
+HWUSI-EAS610	1	4	36	722	261	0	1	TAATTGAAAAGGCAGGAGTACCTACTAGCATCAAGA	aa_aaa`a`__``````_]a_``a__```_^^^Z`_	chr10.fa		5186112	F	36	119					
+HWUSI-EAS610	1	4	56	863	1248	0	1	GTCTCCTTCTCAAAAGCAGAGATATAAATAAAGGGC	`_a`___aaa`aaaaa_^a`a__`_]^___^_a_a\	chr10.fa		5186552	R	36	119					
+HWUSI-EAS610	1	4	12	517	1451	0	1	CAACTTGTAGATGTTTATCTGTTGTCTGGGCTCTAG	aaaPZZa]_\`ST[_RYIP``Z]`NaWXZ]^\TU]S	chr10.fa		5186730	R	36	118					
+HWUSI-EAS610	1	4	90	670	603	0	1	TGGGGCTCAGAGAGATGTGGCCCAGGTTACCCTGAG	aa_````^``^a\``^`Z^_^]`a\\\^`\X\[Y`[	chr10.fa		5187501	F	36	119					
+HWUSI-EAS610	1	4	99	75	1665	0	1	TGGGTTCCATCCCCAGCATGCAGAACGCAGGAACAG	`bWJ_Zb`_Q]XTaabbT\bUba_QKXaa]HGXXab	chr10.fa		5187573	R	25A10	101					
+HWUSI-EAS610	1	4	19	976	1235	0	1	ACTTGCCTAAGCATGCCTGGGCCCTGGGTTCCATCC	_^a`_Z_`aaa^`^^Z^a[`\a]`Z\ZWIW`Z^``[	chr10.fa		5187597	R	36	118					
+HWUSI-EAS610	1	4	21	1170	263	0	1	GAGAGGGAGGGAAGGAGAGAGAGAAGGGGAAGGAGG	aVa\_ZYP`XaU]YaY\X\VZR]RZ\]Z\RS\\T``	chr10.fa		5188265	R	36	20					
+HWUSI-EAS610	1	4	89	1549	1738	0	1	TGTTTCCCTTTGGGCTTGTGAAACAGGGTCTCCTGC	ab]b^aaa`^^_aa_a`aaaa`aaaaa`\\``X_`_	chr10.fa		5188946	F	36	119					
+HWUSI-EAS610	1	4	28	1062	829	0	1	CACACGATATCCATCCCAGGAACCGGCCTTACAGAT	a``b^_a`SaY[_X[T[Q\R_^[WYM[Z^YPQXTRT	chr10.fa		5189568	R	36	118					
+HWUSI-EAS610	1	4	80	894	932	0	1	CAGTCTTTGCAGAGGCTGGAAACCAAGGGGGAAGTC	abbaabbabaaaabbbbbbaaa`^`aaab`aU]a^[	chr10.fa		5189679	F	36	119					
+HWUSI-EAS610	1	4	78	1087	571	0	1	ACAGCAAGTTTTCCCCAGTGGGGTAAGTCCTAGAGT	aaaa\a_a^aaaaX]```Z`]^^[_a`Z^`a_`]^^	chr10.fa		5189863	F	36	119					
+HWUSI-EAS610	1	4	43	1238	730	0	1	CAGGACCAACAGTAAAGACTCTAGGACTTACCCCAC	]bbbbaabb`a`]P`aaaab`aaa]a`aaa]][ab^	chr10.fa		5189880	R	36	119					
+HWUSI-EAS610	1	4	32	1503	1586	0	1	AGATTTTTCAGGACCAACAGTAAAGACTCTAGGACT	`abbbbbabbbbaa^\b`aa\a`a`^_aa`\^^`aa	chr10.fa		5189888	R	36	119					
+HWUSI-EAS610	1	4	71	1755	368	0	1	GTGCAAAAGACATTGAATATCAGTGTCAGAATGAAA	a^J`bbb`Xa`bb`ababbbbba[VS\b\aaaa]]\	chr10.fa		5190225	R	36	118					
+HWUSI-EAS610	1	4	27	494	1698	0	1	CCAATCTTTGTCTGAACCCTTCCTTACACCCCTAGT	ab`ba\`a]]]a`_`X]_aaaa`a_aaa```a`_\U	chr10.fa		5190267	F	36	119					
+HWUSI-EAS610	1	4	74	1218	1513	0	1	GTATGTCTTCAGTGCTAGTCATGCGGGTGCTATGGC	]NV\aXGT^[TDT_V`]RV^]ZZW\QYS_WYPS_X\	chr10.fa		5190476	R	36	115					
+HWUSI-EAS610	1	4	80	1762	284	0	1	CATTTTCCATCTGTCCTACCATCATGCTTCTGTGAC	ababaaaaa___a]aa_aaba^a`a]``a_^KLF`[	chr10.fa		5190555	F	36	117					
+HWUSI-EAS610	1	4	36	475	995	0	1	TGGGTTCATATTCCTGACCTTCATCTTACAAGTAGA	ababRbaaa\bb`aa`\abbbaaabaabaab`a`_`	chr10.fa		5190611	F	36	119					
+HWUSI-EAS610	1	4	21	545	1310	0	1	ATGTCTAGCAACACTTAGATGTGAGAGGCCTTATGT	a`b``aa``XT[a^aaa`]]a[aa___Saaa][]Z]	chr10.fa		5190810	F	36	119					
+HWUSI-EAS610	1	4	86	826	1277	0	1	GGGGGCGCTGAAATTAAATAGCTCAAGGGGTCAGTG	``abaab`aaSaa^aabaaZa_a_ZVa^__G^^_Q`	chr10.fa		5191049	F	36	118					
+HWUSI-EAS610	1	4	18	1300	207	0	1	GTGGCCTGAAATTCTCACGAGATGATGGATAGTCAG	`_a_^```___aa]`_``_`_a__]X_[`\_UW]_Z	chr10.fa		5191409	F	36	119					
+HWUSI-EAS610	1	4	48	733	447	0	1	AAGCCATAGAACTTTCATTGGGGGACATCTCCAACG	aabb_ab`_`_[abbaaabbb`aa]Zaa^a_a```b	chr10.fa		5191517	F	36	119					
+HWUSI-EAS610	1	4	73	1355	58	0	1	GGAAGCCTTGTCCAGAGAAATGGGAATTCTACCATA	__[`^a^`]Wa_a_`aa_`aaXW]YZO\S_aa^aaa	chr10.fa		5191824	R	36	119					
+HWUSI-EAS610	1	4	43	1043	220	0	1	CAGTCATGGGCAAAGATGAAACAACTTTGCAAAGTT	_a\\]a\SZ`a`aY`a_]\^`aba_^aaa`a`_]Z^	chr10.fa		5192138	R	36	119					
+HWUSI-EAS610	1	4	49	1621	1417	0	1	ATGATGATGATGATGACGACTAAAAGATGAGTTGGG	aba`aaa`_`_a_`]aaaa_`U`__`_`_Y_Y___^	chr10.fa		5192296	F	36	119					
+HWUSI-EAS610	1	4	75	1353	1372	0	1	GGTGTGTTTCCAAGAAAAATAGTGTGGGACAGACTA	ab]a_b_aa`^a_`__^^YaaaWa^a`a_^_`^^__	chr10.fa		5192796	F	35T	83					
+HWUSI-EAS610	1	4	16	1755	1968	0	1	GAACTTGTTTTCCCAAGCATTCCCAGAGGACAGTGA	a]_U____U_]GXUZ]_UXZ]YYUU^X_YXXXUUXX	chr10.fa		5193283	F	36	117					
+HWUSI-EAS610	1	4	84	958	1049	0	1	AGCAAATCCTCCGTTTCCAGGCAATTGGAAGGTCAC	`aUZ_bb]_ba[`a]^^^a_VF_Z_bba]`Z`^`^[	chr10.fa		5193423	F	21T14	108					
+HWUSI-EAS610	1	4	41	603	1897	0	1	AAATCCTCCGTTTCCAGGTAATTGGAAGGTCACAAA	aaa`aaaaaa```_a_baWaaaaaa___aY``]___	chr10.fa		5193426	F	36	119					
+HWUSI-EAS610	1	4	22	360	1936	0	1	GCAAATATGCAGCACATAATGAATGCTTGTAAGCTA	^ab`bXV]`_H_IY^]^`]VRNNa_a`a[[_BBBBB	chr10.fa		5193508	R	33A2	93					
+HWUSI-EAS610	1	4	6	1633	1678	0	1	GAGGAAGAGCTTAGAACACTGGGGCTCACTAGGCTG	aYaYZ]^P[PPS^NSKRZP\a^^QRNWWBBBBBBBB	chr10.fa		5193884	R	36	83					
+HWUSI-EAS610	1	4	67	362	432	0	1	ATTGGTTGAATTTAAACTTTTATTCAACTCTTGGTT	^a__`Xb`a^``]b\QZbab`abaa^`aa`aaba_a	chr10.fa		5194200	R	36	119					
+HWUSI-EAS610	1	4	55	278	1804	0	1	AAGCCGTTACACTGCTTTCCAATCCGAACTCTTCAG	]_```_]ababb_aaaaabaY^aaaabaaaaaaa`a	chr10.fa		5194412	F	36	119					
+HWUSI-EAS610	1	4	31	1353	88	0	1	GTGGCAGCAAAAAGTAATAAATCTGAAGAGTTCGGA	a[VGINVP][aY\OX^`WO]aWQZNTVJJ]SYPWBB	chr10.fa		5194434	R	36	107					
+HWUSI-EAS610	1	4	88	123	713	0	1	GAACCATCTTTCCATCCTTCATTTATATTTTTAAGA	aYQLXSXLXaaaa\`aaa_aa`_a\aabaaaa`a`\	chr10.fa		5194781	R	36	118					
+HWUSI-EAS610	1	4	58	1747	331	0	1	GGCTTCAGGGACCTTAGTCTTAATCTTTGCTCTGTC	a_babaa[QP__aa\DMX[aaba_a`aa[aaX`^aa	chr10.fa		5195046	R	36	116					
+HWUSI-EAS610	1	4	70	712	433	0	1	CAATACTGTAAGGCTTCAATAAGTTGAACTCTTTGA	a``aaaaa_abaaaaaaaaa^^a_a_aa`_aa`a``	chr10.fa		5195293	F	36	119					
+HWUSI-EAS610	1	4	57	1018	1839	0	1	TGTATTAGGATCTACTGAGAGTATCTCAAAGAGTTC	Y\^aa`^^\^\T\``__[aaY[`_Z_[^a^[Q^W_X	chr10.fa		5195318	R	36	119					
+HWUSI-EAS610	1	4	80	1126	645	0	1	GCAGCACTCAAGAGGAGGGGGGGATTTAAGAGAGCA	ZPX^_ba_Z^\aa]aVRZ\`a`UYW[V^a]X^`X\]	chr10.fa		5195466	F	36	119					
+HWUSI-EAS610	1	4	22	913	885	0	1	AGCAGGAGACCTTAGACTAGCAGACTCACTCAAGAT	aaP]YT^`U`P^`^_[aaaaaXV``__Yaaa___^B	chr10.fa		5195530	F	36	114					
+HWUSI-EAS610	1	4	38	449	159	0	1	CACTTCCAGAGTATAGTCTACTCCACTGGCCACTGG	a\QO`\`]``]MYJ\^NXY\^PY[^ZLQ[X[BBBBB	chr10.fa		5195695	R	36	96					
+HWUSI-EAS610	1	4	74	226	387	0	1	CTAACAAGCACAGGTGTGAATCCCACCAAGGCCACT	TX`Q\X]baba_T_^bXbab]aUaaab_HOP]_T]B	chr10.fa		5195816	R	36	113					
+HWUSI-EAS610	1	4	36	1588	189	0	1	ATTTTAGTCTGTAAGCCACACAAGCGGCTTGCTTAG	`]b```TU^^RWa]X^bb`aa`WEZLHXZUPX`YSS	chr10.fa		5196049	F	36	116					
+HWUSI-EAS610	1	4	80	727	2028	0	1	ACCCAGTTAATGCTTATGACAGCTTTGAGTTTCATA	``aaa_\`_]Y[T^_Z__[]aWO\_^\]_W]]^\VY	chr10.fa		5196138	F	36	119					
+HWUSI-EAS610	1	4	53	1440	683	0	1	GAGCATCTGCCCTGCTGCCTGGTACTAAATAGTTGT	`WaUYZ[^V^VXRV\TVR\^[UQZUSYQY_W[UXRZ	chr10.fa		5196452	F	36	118					
+HWUSI-EAS610	1	4	43	34	1613	0	1	AATGCATAGACATTTTGAAGCCTTAAAACTGGTAAT	GT\^b_````ba`bbb_``b]a`\UWYH\bbbL_IX	chr10.fa		5196771	R	36	116					
+HWUSI-EAS610	1	4	18	1624	1511	0	1	AGAAATGAAGTGTGTGCCTTTCCTTTATAACCTCTC	`Z_aa_X_[`[`SXYaaaa[^a[_[_`\a^WV_RWS	chr10.fa		5197146	R	36	119					
+HWUSI-EAS610	1	4	68	1286	297	0	1	GAGAGGTTATAAAGGAAAGGCACACACTTCATTTCT	`baa`aaa^b_aa`aaaa^a`aaa_a`a`^`_aa_a	chr10.fa		5197146	F	36	119					
+HWUSI-EAS610	1	4	50	443	1393	0	1	TTCATTTCTAACCCATGTTCGGTTACTTCTACACAA	```a_\^```a^XE[_a_``a`Y_aaa_`^^_]W]_	chr10.fa		5197173	F	36	117					
+HWUSI-EAS610	1	4	59	1656	850	0	1	GGATGAAGTGAACTGACCCAGCCTTGAGTGCATGTA	\]R]^_\TZ]aZ^b]`\aa_]_[]a_`XUX]`\ZQZ	chr10.fa		5197218	F	36	119					
+HWUSI-EAS610	1	4	11	444	669	0	1	CAACAGTTGCCACTAACCCAAACTCAAGCTGAGCTG	a`a\`baaaaaS_a``aaa^__ZaaaaZ_\^`S[\^	chr10.fa		5197508	R	36	119					
+HWUSI-EAS610	1	4	11	1601	2042	0	1	GGGTTAGTGGCAACTGTTGCTTTTCACACATTCAGC	aaaZa`^X]_TT`WR`Y_aRYX^WU_I^UYYXN]^B	chr10.fa		5197525	F	36	113					
+HWUSI-EAS610	1	4	70	616	1663	0	1	TAAGTAAAATTTGTTTAATTTGGGGGACAAAAACAA	a__^\`^a^^__aaa`a`aaababa^T]a`]aYH[S	chr10.fa		5198005	R	33A2	106					
+HWUSI-EAS610	1	4	9	1350	880	0	1	TCAAGTTGGAGGTAGAAGGATTACAGGATAAGGGTA	aaa_a]aaaabaX`a``aa`aaa`aa]_``^aaaZa	chr10.fa		5198763	F	36	119					
+HWUSI-EAS610	1	4	7	172	760	0	1	ACCAACCCCAGTCCTCTGGAAGAACAGCATGTGCTC	abbbbababab^abbb^b`a]a`baaab`ab]aa_a	chr10.fa		5199330	R	36	119					
+HWUSI-EAS610	1	4	34	28	201	0	1	TAAGGAAACACATTAAGACAAGAAGAAAACAACTGG	a^Ya\VK_]``ba`aaaaa\[_]bba^aabbbaaa[	chr10.fa		5199918	R	36	118					
+HWUSI-EAS610	1	4	33	664	195	0	1	GAGGTGAAAGATTCCTCCTTATAAGGAAACACATTA	]JU`Ya_a^``a_`aaa_a``a__[]__^^__[_`_	chr10.fa		5199939	R	36	118					
+HWUSI-EAS610	1	4	51	1723	1083	0	1	TTGGAGGAAACTGCTACATAATATCCAGAGGCAGAG	aaaYLS^^_`_^^`]_Y_]_`_`_^]`RTLVY^R^W	chr10.fa		5200056	F	36	118					
+HWUSI-EAS610	1	4	8	1194	32	0	1	GAGGTGTATCTGTGTATCATCTCCTTGAATCTGTGT	aaaaZ]Q`aYa`Za_aZZaa_a_]__^``_]Z_X[\	chr10.fa		5200089	F	36	119					
+HWUSI-EAS610	1	4	38	261	1618	0	1	ACCTGAAGGTGTTGTTTACATCGTTAGCTGACAGCA	a`a`aa]aaZaZ^a]XO]_a^__YY\SY[YVZZ^__	chr10.fa		5200191	F	36	119					
+HWUSI-EAS610	1	4	8	396	900	0	1	TTCTGCAGAAGCTGGCAAATGTGTTTGAACAGCCCA	aabbbaaaabbaaabaa_aab]aaa`aa_aa_aa`_	chr10.fa		5200236	F	36	119					
+HWUSI-EAS610	1	4	78	1642	1849	0	1	AATAAAAATGCCATAGCATGTCATTCATCAGTCAAA	a_Y[IX_`OZY[_W`]S]__PWSSRGR[U^[ZUY[]	chr10.fa		5200357	R	36	117					
+HWUSI-EAS610	1	4	76	737	469	0	1	TGGAACGTGAGGTCAGAAGTGACATCAGTGGTAGCT	ababbab[aaba\aabaab_aaTa`aaa_aaTaa^]	chr10.fa		5200472	F	36	119					
+HWUSI-EAS610	1	4	72	1253	1295	0	1	CAAAGGCCCCTAGGGGTTTGGAGTATCACAAACATC	a`XY\aOTQ^`[XRTWH]]QZ\WPVZ[RRBBBBBBB	chr10.fa		5200960	F	36	87					
+HWUSI-EAS610	1	4	49	132	1049	0	1	GAGAGAAAGGAAAGAAAGAAATGGGGTGTAGAAATT	`T]^`^XZaa]]_a\_\aSWS_a`a`]a_aaa`a_a	chr10.fa		5201665	R	36	119					
+HWUSI-EAS610	1	4	79	1071	1025	0	1	ATGAGGGAGAGATGCAGGGTAGAAGGGAGAGGAGGG	`b]`a[aYa`a_Xaaaa]aG]^Y^bab^`Y`^U`aa	chr10.fa		5201743	R	36	118					
+HWUSI-EAS610	1	4	18	857	324	0	1	GGTCGTCCATGCCTATAAACCTGGAGGCAGCTCACA	a`P]`\^]^``U^ZWaV]PY\^^SPU^SZ]SUU]S]	chr10.fa		5201836	R	18T17	97					
+HWUSI-EAS610	1	4	5	527	1624	0	1	TGCACTACCAAGTTTAGAGCATTGGGAGTTTCAGTA	abbabaababVa`a^aaYbaaa`Z`a_a^a`_`aX_	chr10.fa		5202080	R	36	119					
+HWUSI-EAS610	1	4	34	337	1006	0	1	ACCAACAAATTCTCAAAGTTAGAATTCAGACAAATA	X_bb_b\_bbbbbb`bbb__\a``bbbb``aaa`aa	chr10.fa		5202168	R	36	119					
+HWUSI-EAS610	1	4	32	903	771	0	1	CAGGAAAAGGGGGACATGTGTTTCATCTGCCATCTG	aab^M^a`aaaaaa__aa_bab`a\b_baZ`Z``ab	chr10.fa		5202288	F	36	119					
+HWUSI-EAS610	1	4	4	68	1859	0	1	TGACAAGAGAATGGAGGAAGGAGGATCCGACCAACA	I`babaa^[[`bbbbbba^b`abUb_a__ba[`aab	chr10.fa		5202396	R	36	118					
+HWUSI-EAS610	1	4	42	596	1681	0	1	TGCAATGGAACTTCACTGGACACTGCACCAGTGTGG	abaaababbb^Zab^aabaaaaaa^^b``a^Xb_ab	chr10.fa		5202852	R	36	119					
+HWUSI-EAS610	1	4	36	37	856	0	1	CTGTGAGAGGAATGGCTTCCTTAAACAAGGGGATTT	a`a``a___a^^^aaa_`aa`aa```^__]^a]_^_	chr10.fa		5202992	R	36	119					
+HWUSI-EAS610	1	4	48	1307	66	0	1	GAAGTACAAACCCAAAAAGTCCAAAAGCTTCTTTGG	a__`Wa_`_`_^]`__a^[]_^`^^^^X]^^_]_]_	chr10.fa		5203186	F	36	119					
+HWUSI-EAS610	1	4	50	712	1428	0	1	CAAGTTGCAAGTGGAACAGTCTGCTGTGCAGGAACT	a_bbaaaabab^baaaaaa_aab`aaaaaaaaaa_a	chr10.fa		5203343	F	36	119					
+HWUSI-EAS610	1	4	100	1099	1260	0	1	GTCAAGCTGGGCCACAGAGGCCAAGCTGCCGCTGGA	_F\XOVVKX^_QZRX\ZKZZQLPPTREJJTXNOX\B	chr10.fa		5203400	R	36	109					
+HWUSI-EAS610	1	4	51	261	1116	0	1	GAAATGTTTTCTTGATGTTTCAGTCAATCTGGGCCA	VTR\ab^aYbbba``[a^a[\`aSa`[F\[URQSa[	chr10.fa		5203422	R	27G8	108					
+HWUSI-EAS610	1	4	19	185	1796	0	1	TGCCATTCTGGAATTGAACATTTGTATTACATTCCA	`abbb\bbbabb^b_[^^bbaaa`_aaabb`baaba	chr10.fa		5203839	R	36	119					
+HWUSI-EAS610	1	4	7	1379	427	0	1	CGGTTCTGATTAGTGCATCGTACTGAGTCGGGGCAG	`ab_a_aT`b]ZOTZ``Ua`aZaWZVRHGXTaaa``	chr10.fa		5204475	R	27GT7	94					
+HWUSI-EAS610	1	4	34	762	27	0	1	GAAGGAAGTAACATAATGTAGAAAGAACCATTGGAG	a`aaa`aa^aa^^aa]_aZ`a___a_`]____``^a	chr10.fa		5205063	R	36	119					
+HWUSI-EAS610	1	4	18	234	86	0	1	CTTGCTTCCATGCAGAGACTCCTTTGTGGAGGGGTA	[[[_^MM[\]`_]\X]Q[[R]__\]YM]WTXWUBBB	chr10.fa		5205410	F	36	105					
+HWUSI-EAS610	1	4	50	349	347	0	1	CCAGCAGCTGCTTGGGAAGCACAAGGTGAGCTGAGA	ab`a``X^a`aaaaa_``a^a]\Va`Sa__^]_\a^	chr10.fa		5205705	F	36	119					
+HWUSI-EAS610	1	4	41	1046	1519	0	1	GTGCTATTTCAGCTATGCCTTCCTGGTCTCAGCTCA	aX]^]^]_XYLSR[ZRTGN`_LYa_ZLNSSSYUTRR	chr10.fa		5205731	R	36	116					
+HWUSI-EAS610	1	4	74	394	1222	0	1	AGCTGAGACCAGGAAGGCATAGCTGAAATAGCACAT	_`a`[W_Yb`_^a_^X_``aaaa_\Z^_[Y\aa[[[	chr10.fa		5205733	F	36	119					
+HWUSI-EAS610	1	4	37	539	1313	0	1	GAAATACCGAACCCCTCTATGTAAGGGCCTGAGAAT	aaU__b]aaba``aXZWY_UZW`^V[TP_a]`_OSS	chr10.fa		5205767	R	36	118					
+HWUSI-EAS610	1	4	17	799	1019	0	1	TATTTCAACCAAATATGCCTGGGTTTTATGCGCTAT	aabbba`b_a_aaaaaaaabbab^aaaaaaaaaaaa	chr10.fa		5205797	F	36	119					
+HWUSI-EAS610	1	4	66	224	56	0	1	GAGAGAGAGAGAATAAAAGCAATCTGAGTCCCACTA	_[aVa_a\a_aQY]`RIY`[[QVY]^ZXDR\XV[BB	chr10.fa		5206027	R	36	107					
+HWUSI-EAS610	1	4	94	27	554	0	1	GGTAACCTTGAACTTCGAATCCTCCTGCCTTCACCT	aa\aa`bbab_aa__aaV[^a`_aa`aa``_aaa_^	chr10.fa		5206142	F	36	58					
+HWUSI-EAS610	1	4	49	1171	225	0	1	CCTTCTGAGATCTGGAATTAAAGGTACATGCAACTA	aabb``]a^`bab]bbabbb_^Z`Yaaba`__a_ba	chr10.fa		5206175	F	36	119					
+HWUSI-EAS610	1	4	21	293	1511	0	1	GTCTGTTACTTGCGTCATTCAGACCTCCTGGCCCTT	``_aaaW^\^Zaab_]UZR`]`\[`W_]^]Y_]\YY	chr10.fa		5206435	F	36	119					
+HWUSI-EAS610	1	4	79	515	499	0	1	GCACACTGATGAAGCAATCTCTGGGTTCCCAAGCCT	aa_a````\`a[\``_ZZX_`aa_aW__WZ__`S[]	chr10.fa		5206545	R	36	119					
+HWUSI-EAS610	1	4	40	957	858	0	1	GGAGTAGACTCCAGCTGCCACTTGGGCTGCACAGGG	`a``ZaZ^\``^``SP\Z`_\[\^\WUXVYS]\\\Z	chr10.fa		5207070	F	36	119					
+HWUSI-EAS610	1	4	44	804	194	0	1	GGGAGGTAAGCTTGTGTTGAAAGCATGCTTGACTGT	aaa_a_U`_aZa__^a^^`^`Y`^^^_^]H]YW^_X	chr10.fa		5207143	F	36	118					
+HWUSI-EAS610	1	4	14	1701	1410	0	1	ACTGGGATCAGAAGGAAGATGGCAGGGGTGGCCCTG	a`a_aYXXXX\VN\aZ\SVZ^ZZT][WZTXRRTRTZ	chr10.fa		5207633	R	36	24					
+HWUSI-EAS610	1	4	35	1615	960	0	1	ACAAGAAGAGTTCTCACCCCAGAACTCAGGAGGTGG	aaba_aaX^_W_^`a_\_`[a_]_\\_VVZRWZNSV	chr10.fa		5207795	F	36	46					
+HWUSI-EAS610	1	4	45	1399	1280	0	1	GAGAATCCAACTGTCTCCTGAGTTCCAGTGGTCAGA	abaaaa`_aa_a[_aa```a^a^``_`aU^^X[_`\	chr10.fa		5207893	R	36	47					
+HWUSI-EAS610	1	4	5	1193	1854	0	1	GATATGGAAGAGAGAAGTGCAGAAGATTCCATGGGG	a^`]aab\_aZa]a^_aU__`]]`\\[_^]^^^X_^	chr10.fa		5208603	F	36	119					
+HWUSI-EAS610	1	4	64	1292	1276	0	1	AACAACAAATGCACTAAATAAACAGAATATTAAAAA	aa`aa_aa_`a_a^aaa`a^a_[aa_`__aa^[_]`	chr10.fa		5208921	F	36	18					
+HWUSI-EAS610	1	4	7	765	648	0	1	ATCTCGGGGGTACCACCATGCCTGACCTCAAGCTGT	aaa_X]`__`S^]]a\]\a_]^]_`\U^VY^^Q\\T	chr10.fa		5211914	F	36	119					
+HWUSI-EAS610	1	4	5	1437	694	0	1	CACTGCATGAACTTATTCATTTCACATACTACCTTT	ababa_ab_aaaaa_baaab^^aaa`aaa`a_]_a^	chr10.fa		5213763	R	36	119					
+HWUSI-EAS610	1	4	60	1478	1065	0	1	ACCATCCCTGTCACACTACTGGCCTCGCATGTCNCT	aa`a``_]_`\]a^``aY`_^`^^_]^\`\^WNDV\	chr10.fa		5214030	R	33C2	110					
+HWUSI-EAS610	1	4	27	1369	1320	0	1	ACCATCTGTACATGAGTAAGATCAAGAGGGAAGGCA	aaaS`Y[aPZ[Y^a\_ZZZ__U`_\[[VWYZ_[]^_	chr10.fa		5214190	F	35T	83					
+HWUSI-EAS610	1	4	77	887	1246	0	1	GACTCCCTCCTCCCCCTGCTGAACCAACATGTTAAC	ab`a^```a`a\``^_aa^^aa`\T]^[_^]^`^_^	chr10.fa		5214302	R	36	119					
+HWUSI-EAS610	1	4	42	858	74	0	1	GGTTCAGCAGGGGGAGGAGGGAGTCGGTGGAATGAT	a`Z`[`_\^a\a^^X]`S\X\P^TSXBBBBBBBBBB	chr10.fa		5214313	F	36	75					
+HWUSI-EAS610	1	4	53	798	183	0	1	GGGGTCTATCATTCCACCGACTCCCTCCTCCCCCTG	aa``Z^a^`^^a`\^a\Za[]^X\YSYX]ZTZX\\]	chr10.fa		5214320	R	36	119					
+HWUSI-EAS610	1	4	57	1492	550	0	1	CATACGGACTGCATGGCTCAGGCCTCTGCTGTGTTG	_^^b^R]aaa`\aXT\`_]`^\ZVY__]XTQRVY_\	chr10.fa		5214553	F	36	118					
+HWUSI-EAS610	1	4	89	495	1380	0	1	TATCTATGCATTTGTTCTTGTGATAAGACCTGTCAC	^`^_aaba``ab`b_baaab`b\`bbaa`a`__aaa	chr10.fa		5214863	F	36	119					
+HWUSI-EAS610	1	4	78	125	435	0	1	GACCATAAAGATTTGTCCCCAGGCTGTCCTCTGGCT	aXaaa_a_Z`X`___^`_aa``Z_`_Z__^\\\\\^	chr10.fa		5214910	R	36	119					
+HWUSI-EAS610	1	4	43	1448	1955	0	1	AAGCTAATGTCCTAGATTCAGAGCACAAACAGATGA	a`b_aa`^[]^`_O_Vaa[X_^`^^^]^[Q]\^U[[	chr10.fa		5215770	F	36	119					
+HWUSI-EAS610	1	4	89	253	1347	0	1	AGATTCAGAGCACAAACAGATGACCTTGAAAACCAA	\^aX`a`_[^aVXRR\]P[][___a__a_a_aaa_[	chr10.fa		5215783	F	36	119					
+HWUSI-EAS610	1	4	51	558	1362	0	1	GAACTGGGCCAGTTTAGGGCAACTGAGCTAATTATT	aaaabbaaa`aa`aaaa_aa^^_ab_a_aaaa``ba	chr10.fa		5215894	R	36	119					
+HWUSI-EAS610	1	4	73	900	1805	0	1	AGATTTTACACACATGGGGGAATGCTATTCTTTTTG	abaaaabaa`aaa_^ZWaba^`aa\a`ba^a`aaaa	chr10.fa		5216254	F	36	119					
+HWUSI-EAS610	1	4	90	241	896	0	1	GGAGCTCAGCAGACAGCTGGAGGTGATAGAAAACAG	`]]aaaa]baXY]__aa^aa_aaVa^_`aXHW\_^a	chr10.fa		5216429	F	36	118					
+HWUSI-EAS610	1	4	68	1698	1588	0	1	CACAAACTTGTTTAAATTCTGTTAAGTTACTGGCAA	abbabaabb\a[aababbaabab_ab_b`aaaaabb	chr10.fa		5216590	R	36	119					
+HWUSI-EAS610	1	4	97	1387	238	0	1	AAAACAAACGACAACTCTTGGTCTGTACTCTACCAC	abbb`aaTIZa__`aX]]^ZS[R]LVaSX__`SY`a	chr10.fa		5216908	F	36	118					
+HWUSI-EAS610	1	4	57	929	1159	0	1	ACATATGTAGTTGGATGATACATAGATGAGAGAGAT	ab]a`ab^_b_]a`_`aaa^_``_`_``Ya`a]aa`	chr10.fa		5217064	F	36	119					
+HWUSI-EAS610	1	4	26	1724	1803	0	1	TAGCATCTATATCTCTCTCATCTATGTATCATCCAA	aaaZ^`]_^\[`__Y`Wa]_`Z_^_`N_^]_YU\\Q	chr10.fa		5217074	R	36	119					
+HWUSI-EAS610	1	4	76	1055	1147	0	1	GATGACAAATAGATAGTACATTTGGAGCTAGCGATC	`^a`^_`__[\WP]P[S`W]a__`aWXU\]\MZ]VB	chr10.fa		5217614	F	36	114					
+HWUSI-EAS610	1	4	59	1157	403	0	1	TCAATGAATACCAGCCCAAACTGTACCAAGCACTGG	ababaaa`^aW]_`_]``a]Z`a_a`_\Z\[X[a``	chr10.fa		5217981	F	36	119					
+HWUSI-EAS610	1	4	18	704	71	0	1	GCAAAGCCTTATAGACAGGGGAAACCCTGAATTAGA	aa`a`_WZ]__`ZX[OW^^\[Y`_WQT\VHX^^WUU	chr10.fa		5218381	F	36	118					
+HWUSI-EAS610	1	4	9	1252	1009	0	1	ACACTATTCTGCTCCAGGACCCAACACAATATTTTG	aaa`aaaaa]Y`a``__aa__\`a_`]___^aa^a`	chr10.fa		5218531	R	36	119					
+HWUSI-EAS610	1	4	54	864	46	0	1	TGGAGACTAACAAGAGAAGGAGGGCATACAGAGATA	``aUIQ[]\P^\Ta[]ZTW_WXTPV[UTR]WJUGV^	chr10.fa		5218759	R	33C2	105					
+HWUSI-EAS610	1	4	15	1365	1867	0	1	AGTCTTGAACGTGCTTACAGATATCAAAGTGAAGCT	a\]`Zaaab^b_aS]__^``[a]`__`^`X_^`a^_	chr10.fa		5219195	F	36	119					
+HWUSI-EAS610	1	4	76	547	2040	0	1	ATTTCCAGTTCTTGTGGAACCGTCACAGACTGCTGA	a`_V^a]QQ[__[Z]`_Z`Y`_RVV\[[R^TX_]^V	chr10.fa		5219284	R	36	118					
+HWUSI-EAS610	1	4	87	494	1600	0	1	TACTCATCTGCATTAGTTAGTAGTAGATACAAAGTC	aabbbbbababaabbaabbba^`_abaa`babaa[`	chr10.fa		5219473	R	36	119					
+HWUSI-EAS610	1	4	55	638	1878	0	1	ATGTAGAATTGGTCTGTGCTCTAGGTTGGTCTCTGT	abbaabaaba``_`aaaaaaaa_]]]`_`\Z_]`a_	chr10.fa		5219603	F	36	119					
+HWUSI-EAS610	1	4	37	705	867	0	1	TAGACACAGCGGCCCTGCGTGCTGAGCTGTCCCGCA	____^a^_^_^_UL\a``aT]MX\XQMQ`^XX[_SV	chr10.fa		5219784	F	1G34	82					
+HWUSI-EAS610	1	4	59	1220	1282	0	1	TGCAAGGAGCTGGAAATTAAACCAGCCAGCCTTCTC	`a`Z^]a^`_a^]]a_`aa`^[^UTHT[^[^UZU\V	chr10.fa		5219889	R	36	118					
+HWUSI-EAS610	1	4	76	953	353	0	1	AAAAACATGTATCATATGTGATCCACAGTGATGAAT	abbbaabbaaaaaaa`aaabaaa`a``b_a`aa__b	chr10.fa		5220485	R	36	119					
+HWUSI-EAS610	1	4	50	408	1113	0	1	GGCTGAGGCAAGAGCATCACCATAAACTCAAGACCA	aa___aa``aaaZ]`aaaa_`aaaa`a``_`aY^`a	chr10.fa		5220682	R	36	119					
+HWUSI-EAS610	1	4	27	107	1002	0	1	AATTACAGTTATGAGGTAGCAGAAAAAATAGGTTTC	ZVZabaab_aabbaaa]Wa`]`Yaaaaa]]`a]__`	chr10.fa		5221410	F	36	119					
+HWUSI-EAS610	1	4	71	1083	1182	0	1	AATGAGTTGGATCTCACTCATGGAAAGTGTTATCCT	aa_bV^SVb[`aab^\ab`Vb^b^L\a]_`aaYaa`	chr10.fa		5221622	F	36	118					
+HWUSI-EAS610	1	4	47	983	104	0	1	GTCCTCTTCATCCTTCAGGATAACACTTTCCATGAG	aa\`__XR[a_H]ZaUL`aaaY`[SU_]^JY]W^\]	chr10.fa		5221638	R	36	117					
+HWUSI-EAS610	1	4	32	1506	775	0	1	TGCATCTGTACTTAGTATTTGCATGGGCTTGCTTTT	`^`^aa^WR^_^aaa]aaba^\_aa__a``W\`a`a	chr10.fa		5221841	R	36	119					
+HWUSI-EAS610	1	4	30	1491	592	0	1	GAAAGAAAGGGTTAATTGCCGCTAATAATTCCAGTG	_R]ZU\J]`WVVW]PU`_\Xa__RJZ__]_VZUYWR	chr10.fa		5221933	F	24G11	103					
+HWUSI-EAS610	1	4	20	721	643	0	1	GGAAAAGCCAGTGCTCTTAACCTCTAAGTCATGTCT	aa_aaaaaa``^a``_`_aa_a`_a_\a^``aa__^	chr10.fa		5222473	F	36	64					
+HWUSI-EAS610	1	4	45	1758	1267	0	1	ACGAGATGCTTCCGAGTATACAAAGGCTTAGTGTGT	abba^^aaaa`aa`aa\aaa^aa_a__]_`[U_W]^	chr10.fa		5222650	R	36	119					
+HWUSI-EAS610	1	4	15	624	150	0	1	AGCACTGACTGGTTCACAAAGTCCGCCGTTAGCTGC	a`Y`\QRa`^^XP\`aZa\WM[FZa[ZaU\YYSP]^	chr10.fa		5222736	R	36	117					
+HWUSI-EAS610	1	4	78	452	1768	0	1	GAGAAGGTGAGCTAGGTGGCCTGTCCTAATCCGGGT	aZQa]_aM_`\aO^\^VMZ[\P^\`^]a]Ya\]Y[B	chr10.fa		5222881	F	36	114					
+HWUSI-EAS610	1	4	10	622	371	0	1	TCCAACAAGCCTTCCAACATCTGGATCTAAACCAAC	`aS_]aa^T]b`^Z^`aa]b\^_a`TZaaaa`X]Ya	chr10.fa		5223395	R	36	119					
+HWUSI-EAS610	1	4	95	1375	66	0	1	GACAGTCCTTCAGAGCATTCTCAACAGAATTCCGAT	aa_``WXV\__a^aW_a__\^_\^_aZ_`^^ZZX_V	chr10.fa		5223523	R	36	119					
+HWUSI-EAS610	1	4	62	665	460	0	1	TGCCTCGCATCCTCAGGCCTGTGTGCAGGGCTCACT	V[^aa\__`^`_`^`_[__T\G\T[TZ_XYVBBBBB	chr10.fa		5223588	F	36	96					
+HWUSI-EAS610	1	4	8	1614	324	0	1	AACCCTTGGAACCAGTGAGCCCTGCACACAGGCCTG	`a\`^[`^R`^YZaQXPYZ^\\ZN^^Z]Z]TK\ZZT	chr10.fa		5223601	R	36	118					
+HWUSI-EAS610	1	4	77	1514	1658	0	1	AGAAGACTCAGGCTGGAGGGCTCCAAGTTTTAAATC	`a``Sa_[aaH__]RT\aa[`_aa`ab]aR^aaaa[	chr10.fa		5223717	R	36	118					
+HWUSI-EAS610	1	4	94	143	711	0	1	TACCTACTTAGGTGTATATCTGGTTCTTTCTATAAT	ababaaababba`b^`aa`a``a^a`aaaaaa```a	chr10.fa		5223893	R	36	119					
+HWUSI-EAS610	1	4	44	559	1325	0	1	AACCCAACTAGATCCTCACATCTGCACAGCAAGCAG	`bab_aaaaababaa]babaaaaa`a`aa_aaa_a`	chr10.fa		5224063	R	36	119					
+HWUSI-EAS610	1	4	37	958	1632	0	1	ATTTTACATGGGTCCTGTGAAACCCAACTAGATCCT	`bba`aa``a]b^Yaa]^`]RU][V[Z^]RVP^X[`	chr10.fa		5224083	R	36	119					
+HWUSI-EAS610	1	4	51	362	807	0	1	TGTGCAACCACATATTCAGACACACACACATGCAAC	ababbba`babaaaab`bb^aa`abaa`ababaaaa	chr10.fa		5224319	F	36	119					
+HWUSI-EAS610	1	4	73	86	502	0	1	ACACACACACATGCAACCACGTCATACACACACACA	]aWa__bb`ba]aa^]aa\`a]a__a`Uaaaaa`a`	chr10.fa		5224338	F	36	37					
+HWUSI-EAS610	1	4	64	1114	830	0	1	GGACAAAATGATACTGTGTGGGATGTTCACTGACAT	]aZ^][_`_][`_]a`\`]^[]^``\`^^^\]W\^_	chr10.fa		5224427	R	36	119					
+HWUSI-EAS610	1	4	38	1182	1586	0	1	CTCAAAGATTATGTGATAATATATAGGGACAAAATG	ab`babb`bb`bb`baa`Ta[baaabba__``a`ab	chr10.fa		5224453	R	36	119					
+HWUSI-EAS610	1	4	11	670	1004	0	1	GGAACATTTTAAGGCAGTGGCCAGGCCAAGGCATGG	\Q_`aa_aaa^Wa__a`U`^`^_``U^a^[_[P[`]	chr10.fa		5224814	R	36	119					
+HWUSI-EAS610	1	4	46	645	654	0	1	TGAAATAAAAGCTAAATTTGCTCTATGTGAACAACC	abaaaa____a`aa_aa`aa`a`a``a]a^`^_`_^	chr10.fa		5225281	F	36	119					
+HWUSI-EAS610	1	4	14	1268	128	0	1	TGAACCTGTCTGAAATTATTAGGTTTTTGTTTGTTC	^O`SRab]JaaTOQ`aa\\aaWa`W___K_`[G[aa	chr10.fa		5225625	F	36	29					
+HWUSI-EAS610	1	4	75	926	218	0	1	TTAACAGTTACGGGTTGCCTTTTTAAATTAATGGAA	ab`aaaXX_bZ_b]Z_b]_b`a_]abX^a]W`]^aa	chr10.fa		5226045	R	36	119					
+HWUSI-EAS610	1	4	80	726	55	0	1	TAAAATCTTCCTTTGAAGGAAGAGAAAACAAGAGAA	``aaa__`a__aaa^Y`a`]]`]a^`_]^_^`^_Z_	chr10.fa		5226214	R	36	119					
+HWUSI-EAS610	1	4	34	588	704	0	1	GTGTATTTTTCAGGCATCAATGTCTCTCCATTAAAA	aaaQbabbbbba``ab`aa_b`aaaaaaa_a`____	chr10.fa		5226608	R	36	119					
+HWUSI-EAS610	1	4	27	531	1642	0	1	TATACTTTAGTATAGAATAGTGAATCCCACAGTAAT	aaabbbbbab`abbabaaaa_abbaa`aaaab^aaa	chr10.fa		5227391	R	36	119					
+HWUSI-EAS610	1	4	12	1170	1940	0	1	CACGTACAAAGCCCCAAGTTTGATTCCCAGGACCTC	abaaU``a`aaQZ_]]S\Vaa`KT_\VSXWVHVVY_	chr10.fa		5228092	F	36	117					
+HWUSI-EAS610	1	4	55	1781	1955	0	1	GGGATTACAAACTAGCAGCACAAATTCCAACGTATG	aab__`\Z_a`_^^VMTU]][`\W^__[a_[]]^^`	chr10.fa		5228127	R	36	119					
+HWUSI-EAS610	1	4	70	1750	1217	0	1	ATGACCCAGCTGTTTTTTTACGATAAGATTTCAAGC	aa_a^aa]^`[b__a`aaa``^]]^ZWWQYX^``\W	chr10.fa		5228242	R	36	119					
+HWUSI-EAS610	1	4	61	1087	1295	0	1	AATGAAGGCTAGAGGAGGCATCAGACAAGGAGTTAC	a[a`_`aa_a_`^a`_`a`a`___`]_\``Y^Xa_X	chr10.fa		5228600	F	36	119					
+HWUSI-EAS610	1	4	69	83	439	0	1	TGAACTTGAGTCTTCTGGAAGAGCCGACAGTGTTCT	a`\\[\_a\^_`[[b^ZaXZ_Ua^J]W_`VDWP`Z[	chr10.fa		5228671	F	24A11	53					
+HWUSI-EAS610	1	4	31	479	1132	0	1	AGTGTCATGAGCACACTGCAAGAACTCAGGCAGACC	a`Y_aabbba`abaaaaaa`ababaaa_aa___`^`	chr10.fa		5229518	F	36	119					
+HWUSI-EAS610	1	4	72	899	541	0	1	TGTCTCGGTTTAGAACTCTGGGAGAGGCTAAGTGTG	aa__a_`a\`a______\^^ZZ[_V_^W[UU\SYU_	chr10.fa		5229827	R	36	119					
+HWUSI-EAS610	1	4	76	1783	126	0	1	ACTAATCTCATGTATCTCTTTCTGTCTCGGTTTAGA	ab`a`_a\^`]SY`[a__a]^a_RS_^^[YWS]`G]	chr10.fa		5229849	R	36	118					
+HWUSI-EAS610	1	4	8	191	329	0	1	GTTCCCGGTAACTGAGTAGGTTTGTGGGGCGGGAAC	aZabbbba\aaaab_b\aaaT``a\aa``^a`_^aa	chr10.fa		5229946	R	36	119					
+HWUSI-EAS610	1	4	78	929	1834	0	1	GAATGAAGTCAAATCATGGCGTTGCCATGCCGAAAA	^_Z_\TH^Y[ZW_^X^`W[]P_\]_PZZZODE\_[U	chr10.fa		5230215	F	36	114					
+HWUSI-EAS610	1	4	51	16	1478	0	1	GAATAAGAGCTGCGTGCTGGCCAGGCTTCCCACTGT	aQ^`aW_aaa`a^`\``_`^\YVU\^^W^^`M\S^W	chr10.fa		5230282	F	36	118					
+HWUSI-EAS610	1	4	11	1358	1607	0	1	AGGAGGGAGCCGACAATCCAAAGTTTCTGCATGCAG	aabb`abaab`aaabab`^ababXab_aa]`_`_aa	chr10.fa		5230404	R	36	119					
+HWUSI-EAS610	1	4	79	51	1234	0	1	GAATCTTCCCATAGGAACGGTAAGTGCTACAATGTG	]WZ_aZ`b_I\]``a^`_a^X]UYZZ]]]_^^^aP`	chr10.fa		5230526	F	9A26	105					
+HWUSI-EAS610	1	4	68	1307	1505	0	1	GTGAGCATAAGTGCACGCATGTCTGTCTGTTTGCCC	`V_a^\\]\W^Z`[^]aX\aa\^]aSV]RS`a_^[_	chr10.fa		5230635	R	36	119					
+HWUSI-EAS610	1	4	71	181	240	0	1	ACATTTCTTTCCCGTGATAGTATCCACTCCCCACAG	]Z][a_aa\YRa\`PTPNLYJQT]^ZXGZ[X`X]YB	chr10.fa		5231059	R	36	112					
+HWUSI-EAS610	1	4	64	204	1096	0	1	AAAGCTGCTCTGGAGTAGAGCCCACAGATGGTAGGA	^`K_babaa`\ba_b[`a``Y]^S_`a__baS]]]B	chr10.fa		5231103	R	36	114					
+HWUSI-EAS610	1	4	15	239	2034	0	1	ATTTCTTCTCTGCATTGTTGATTGTTTTTCACAAGG	aaaaa`ababaaaaaaa_`aX_ab^``a`baaa```	chr10.fa		5231274	R	36	119					
+HWUSI-EAS610	1	4	32	1088	1853	0	1	TGAGGAAAAAGCATAGCCAAGAAAGCAAATTAATTT	a_ZYV[V[`__^a]\]_W[]]V[\U_YXX_`\Y^^`	chr10.fa		5231493	F	36	119					
+HWUSI-EAS610	1	4	67	849	2036	0	1	AACTCCTGCGCATGCTCCTTCTCTGTATTTGTCGAT	_b[[[aaVZ]aaa]]`bab_abT\][V^ba`XG\`_	chr10.fa		5231670	R	36	118					
+HWUSI-EAS610	1	4	71	1779	896	0	1	TGTGGAATCTACATTCCATATATATGCATATATGTG	aa`[aaa_`_a`_`aa`_a_a_`_`_]_]_`^^_W`	chr10.fa		5231988	F	36	119					
+HWUSI-EAS610	1	4	90	331	1890	0	1	GAAGCTATGTACAGGGAGGGCTGTGGAGAGTCAGTC	a_W\ba``ba_babaa`aa_aab\a`V`V_U^``S^	chr10.fa		5232070	F	36	119					
+HWUSI-EAS610	1	4	60	251	827	0	1	CTTGTACATAGATGTCACTATGAAACCTGATCATTG	aaaaaaaaaaba_a`abaa_`a_aaa`a`_``_```	chr10.fa		5232126	F	36	119					
+HWUSI-EAS610	1	4	7	978	429	0	1	ACTTAGTGTGGCGGAACAGAAAAATGTTAATCTCTG	a`aaa`Z`R][[_^_^[]`UZZ[]ZSX____UYVZ^	chr10.fa		5232348	R	36	119					
+HWUSI-EAS610	1	4	83	658	1831	0	1	AACAGACGGAATCGGGACAGGGAGTATCTGGCCTCC	^_V^WW`aX\\a\^_XSZZ^_aa_]Z`^a_WUOQ]`	chr10.fa		5232510	R	36	118					
+HWUSI-EAS610	1	4	1	976	346	0	1	TTGTACAGCTTCGGAGGAATCTGTCAACAGACGGAA	]`I___S[_a[Y`_][`_ZHSa]]U[VLL]GMP^WU	chr10.fa		5232535	R	19C16	103					
+HWUSI-EAS610	1	4	30	492	1598	0	1	AATAGAACCTGCTTGTGGGTAGCGAACACTAGATTA	ab``bb`S``^abbbbaYV[_Y_TZ^Y_``a_Z__B	chr10.fa		5232959	F	36	114					
+HWUSI-EAS610	1	4	71	1060	756	0	1	AGCTCCTTAGAAGATATTTGGAGAAACGGGGTAAGA	^]aaa]aa_a]_a_^``aa`aVa``XZa``_VV][\	chr10.fa		5233127	R	36	119					
+HWUSI-EAS610	1	4	23	1058	106	0	1	GAACACAGTGTGGGTGGAGACACGCGTGGAACCCAA	aaaaa`a_^aW^^_LLXUaYU]_W\^Y_\W\WWWWW	chr10.fa		5233282	R	36	118					
+HWUSI-EAS610	1	4	46	1056	783	0	1	CGGACCTGCCCTGCTCCACCCATTTTCTATGTATTT	abab`a[`Y^````aaa``_``aaaaXa_[Z\[aaa	chr10.fa		5233469	R	36	119					
+HWUSI-EAS610	1	4	17	1056	1142	0	1	ATGGGTCTTCTCACATCTAGCCCCACTACTTCTGCT	aXN_WXa[WWRQRFPRS_X_YWVRT^XUSSNUV\R\	chr10.fa		5233536	F	36	116					
+HWUSI-EAS610	1	4	42	1788	852	0	1	CTGAAAACTGAAGCTATCATTTAAACAATATTTCCA	ababa_baaaaa_a`abaaaaaa`a`aa`_a___``	chr10.fa		5233834	F	36	119					
+HWUSI-EAS610	1	4	35	450	1504	0	1	TAGAAGTGGTCCTCAGAAAAGCTGAGATTGGCTGGT	_`aa`[]\Z_babbba_^`^KbN^``abababaBBB	chr10.fa		5234674	F	34TC	100					
+HWUSI-EAS610	1	4	74	1077	959	0	1	GAAGAAGACAGCCAATCTCAGCTTTTCTGAGGACCA	a^a`^_`_^_YY]_^]]]]_`UZ]_^X`ZNXVUU]]	chr10.fa		5234680	R	36	119					
+HWUSI-EAS610	1	4	55	454	957	0	1	TGCTACTGACCTGGCACCCTTGTTTTGGCAAAAAGA	^^`X^UQZSORa^[VX`R`NSYZ\a[^]X]`BBBBB	chr10.fa		5234743	F	36	96					
+HWUSI-EAS610	1	4	10	142	377	0	1	GGAAGGAGGCTTACAGAAATTTGGCTCTATCACCAA	ab`bbaabaaaaabaaaa^]`[aaaaa`a_aa_aaa	chr10.fa		5235059	F	36	119					
+HWUSI-EAS610	1	4	68	495	54	0	1	ATTATGTTAAATAGACATGAGTCATTGTTTTGCTAT	abba``_abba_aaaaaba_]^aaaaa_``a`^_`a	chr10.fa		5235369	F	36	119					
+HWUSI-EAS610	1	4	62	990	1193	0	1	TGTATCTCTGCCAGAGCTGAAGGAGGGCCTTGCTGG	aa^abbaa_UZ\^]I`RXXV]^]U_aaZ__^`U[^_	chr10.fa		5235547	R	36	118					
+HWUSI-EAS610	1	4	23	859	474	0	1	GGTTGGGCAAGTCCCAAACAAGTCCCTGAACATACG	`aYTQ^`^XP]HPVK]__[W\XU^^QM`^`^\__Q`	chr10.fa		5235710	R	36	117					
+HWUSI-EAS610	1	4	95	1284	1187	0	1	ACCCCAATTGCCATCAGGAGCAGAAGTCCTTTGTAA	`R^WU`_YX^[`_`[a]][aU]_^`_NZP\^ZTHWT	chr10.fa		5236658	F	36	118					
+HWUSI-EAS610	1	4	29	673	853	0	1	CCCCCACTGGCTCACAGTTATGGGCATATGGTTGGG	]QYT_Z`^_]T]_XO[]Z_`W]__YOW`^`\WYa_]	chr10.fa		5236729	F	36	118					
+HWUSI-EAS610	1	4	52	796	739	0	1	AGGCTGGAGATGCCACGGAGAGAGAGGTGGAGAAGG	`^X^^``````_XWZ_TZEZE[YYSY`O^ZQXKXa`	chr10.fa		5236778	F	36	115					
+HWUSI-EAS610	1	4	13	538	1538	0	1	GGCATGGTGCTGTAGTTCGCCTTTCCTACTTATTTC	Vbbb[abJ]aabTabS]`b`_`ab^ba[`bbb`[ba	chr10.fa		5236928	R	36	118					
+HWUSI-EAS610	1	4	66	201	863	0	1	ACCCCTTACCCACTATCCACATGATCCTTTGCTAAT	\L`\ZaYa]YZ_a_QLJYZ[`W[[Z^Z^][`\_TNU	chr10.fa		5237737	F	1A14G19	87					
+HWUSI-EAS610	1	4	69	1538	378	0	1	AACCAAACCAATTTTAAAAGCAAGTTGTAGAGAACA	a``aaaaa[a\aa^aaa_aY`]]U[`_]`^aQX]_]	chr10.fa		5238208	R	36	119					
+HWUSI-EAS610	1	4	58	1082	960	0	1	GGAATAGTGTTTTCTTCTTTGTCTGCGTAGGTTTGC	abaaaZb^a_abb_a``aa_`^`aaZa^_bYFZ_b_	chr10.fa		5238420	R	36	118					
+HWUSI-EAS610	1	4	69	525	213	0	1	CATTCCTCTGACCTCTCTACTATCCAGGAAAGGATG	abbbaababaaa_a`bbba_baaaaabaa`_abZ`b	chr10.fa		5238681	F	36	119					
+HWUSI-EAS610	1	4	50	1275	310	0	1	AAATCTGGAAGCATGGTTTACACACACTTACCTTCA	aabb`aaaa`\`__a]_aaa`aa`]_^a__]]]_`_	chr10.fa		5238724	R	36	119					
+HWUSI-EAS610	1	4	83	1363	224	0	1	GGGAACACGGCAGCATCCAGGCAGGTATGGGGCAGG	X_V_a`\\^Xaa_``a^a_\_]a\]O_^]RXVZa``	chr10.fa		5238879	F	36	27					
+HWUSI-EAS610	1	4	24	442	466	0	1	GACCCTCATCCTAGCTCCCTGGAAGTGAGTATTCTG	abbabbabbaaaabb`aaaaaaaaaU]aa\a`_]`a	chr10.fa		5238955	R	36	11					
+HWUSI-EAS610	1	4	40	1109	983	0	1	TCTTGAGGGAAACTCATTGCCAACCACTTTCTTCCA	`abba`Y[YVYYP`aaaaaZaZa_VXW_``U__Z[\	chr10.fa		5239121	F	36	119					
+HWUSI-EAS610	1	4	79	693	238	0	1	ATCCTTTCTGTCCCCCTGAGAGGAAGGACCACTGTG	abaaabaaaa^a```]aa^a_`_Y_a_^_^^^_aSa	chr10.fa		5239183	F	36	119					
+HWUSI-EAS610	1	4	91	1028	1974	0	1	TGCTGGGCAGCCCATCACCAGCACAGTGGTCCTTCC	`_a___a^_a]Z\a`^\``Z\^Z^N`Z``PTU`^RX	chr10.fa		5239204	R	36	118					
+HWUSI-EAS610	1	4	31	711	458	0	1	GCTGATCTGGGAGAGAATCATGTTAGAGATGTGCTA	aa`aYaaaaaa[aaa_a```ab\`_a_a^`a]_]a[	chr10.fa		5239325	R	36	119					
+HWUSI-EAS610	1	4	98	1367	1053	0	1	TCAGCTGCATGGGTATCAGAATTAAAGGCACATGAT	a`^Y`a`]]W^aa^`_\_b\baaba[a`Xa\YZ^^]	chr10.fa		5239780	R	36	119					
+HWUSI-EAS610	1	4	42	985	1374	0	1	TTCTTCTGTCTCAGCTGCATGGGTATCAGAATTAAA	abZ_a]_Y]]]U]^R__Q\]^]RXTZ\[`Z^[X[VV	chr10.fa		5239790	R	1C34	80					
+HWUSI-EAS610	1	4	30	1296	845	0	1	TGTGTGTGCAAATATATGTGTGCATGTGTGTGTATA	aaXY`b^\aaa_b_a`aa_aZY^\^\]`]a^\`a]a	chr10.fa		5239930	R	36	50					
+HWUSI-EAS610	1	4	97	1627	953	0	1	ATGCATGTGTGTGCAAATATATGTGTGCATGTGTGT	`b^\STSW_MSSa_aa^XZ_[_\ZRPXR__]VRPRS	chr10.fa		5239935	R	36	38					
+HWUSI-EAS610	1	4	75	451	89	0	1	ACTGGCTTTGTAGAATAGGGAGCCACCGAGGACGAG	aaaaaaab`a^^a_a^]^[U[[V`^\^\^^^YW^VV	chr10.fa		5240188	R	36	119					
+HWUSI-EAS610	1	4	22	593	1651	0	1	GAAATTCCATCATCTAGTACTTAGGCATTTGGTTCC	aa_a[aZW]SSb[\Y^`S\\T\`XN^La_]SWR_R[	chr10.fa		5240437	F	36	118					
+HWUSI-EAS610	1	4	69	59	309	0	1	AACACGTATCTGCGTGTCTGCCTGTGTGCATGTGTG	XV_b__X`]^^_J]MZPbWY]`aa]\DY`Z``VZT[	chr10.fa		5240641	R	12T23	101					
+HWUSI-EAS610	1	4	75	388	1814	0	1	GGCAGACACACAGATACGTGTTCACATACATACATG	ZW[^^_Y_^IWSW]RO\UGYHPV_W]WW`WQ_H_WB	chr10.fa		5240655	F	36	111					
+HWUSI-EAS610	1	4	28	1306	809	0	1	TGTGCAAGTGTGTCTGTGTGCATGTATGTATGTGAA	a`__X^QZWZ]X\]XVQ]UY^^aYVP[ZQ]]UQY`a	chr10.fa		5240675	R	36	39					
+HWUSI-EAS610	1	4	38	155	1858	0	1	AGGGCAATATGTCAGTCAGTGGGTCTAGGTGTAGAC	`b_Z\b]babaabbb_b`_FWT]QaWG_bWaXJW\_	chr10.fa		5241037	R	36	116					
+HWUSI-EAS610	1	4	45	1601	1299	0	1	AAGGGACTTGTCTTCAGGATAAAAGGAGTGATTCCT	aaab\_^baa]_aaa_]aY`a__a^]\YOPVW[_\a	chr10.fa		5241122	F	36	119					
+HWUSI-EAS610	1	4	31	1575	557	0	1	ATGTGTGTGGCCTTGAGGGACTCCATAGACCAAAGG	abaTOOS_UU`\a`YY[N[^R`X^ZZ\YWSQZSURR	chr10.fa		5241438	F	36	118					
+HWUSI-EAS610	1	4	29	1331	792	0	1	GGAGTATTTCCTCAAGGCTGGGGATGTAGCTCAATG	a``_[Z`_\^\P^_\SW[RNUYURRUR\WYYSSUWT	chr10.fa		5241805	F	36	118					
+HWUSI-EAS610	1	4	53	1007	43	0	1	TCTGGTGTAGCCCAGGTAGATCTTGAACTAGCCACA	aa]_^[`Vb_\__[X\P_a]a`_``_aVaa`__`a_	chr10.fa		5241962	R	36	119					
+HWUSI-EAS610	1	4	92	422	531	0	1	TCACACTTTTCCAAGAAAGTCTGGTGCTGAAGCAAG	a`a_a^`a_\a_aaa`__aUW[a^V^V^aWZ_Y]X_	chr10.fa		5242773	R	36	119					
+HWUSI-EAS610	1	4	22	493	1922	0	1	AAGGAGACAGGTTGACTGGGTATGGCGGCTCATGCC	Zbbbbaaabbb\abaabbaaabaa^G_a``a`S]`_	chr10.fa		5243414	F	25T10	107					
+HWUSI-EAS610	1	4	85	399	55	0	1	ATCCTCTGCAAAGATTCAATGCTCACTCATTGCAGA	aaa`^`^```PVZU_\]O]`Z^_\W^^Z^^[[Z\ZQ	chr10.fa		5244365	R	36	118					
+HWUSI-EAS610	1	4	17	699	1631	0	1	TGAGCATTGAATCTTTGCAGAGGATGCTATTATGTG	abaaaabaaaaa`aa_a``a`a`_aa]`_aa_`a]`	chr10.fa		5244376	F	36	119					
+HWUSI-EAS610	1	4	80	780	557	0	1	TTCTGATCTATTCACTAACTCCAGCCCCTACAGACT	aa`aa`a]a^aa^^^a_a___\__]^^[_`^^]_]_	chr10.fa		5244459	R	36	119					
+HWUSI-EAS610	1	4	24	961	1959	0	1	CATCGCTGCAATCCCGTTCTGATCTATTCACTAACT	ababaaa``a_a_S]a]_^^a_X[^Yaa^aZaa_BB	chr10.fa		5244475	R	36	110					
+HWUSI-EAS610	1	4	1	703	1692	0	1	ATAAGGCCAGTCCTGGCCACAGAGCACCCTTAACAT	a_`b_[aV`^_[Q_a_V_`\``^`W^\\\^\_^ZV[	chr10.fa		5244681	R	36	119					
+HWUSI-EAS610	1	4	86	1506	1682	0	1	AATTTTGAGAGTTGCTAGTGAAAAAAAAAAAAGACA	aabb`bb`b^_H_`aaYa\`ZS_]`a[_aa`UVOF^	chr10.fa		5245435	F	36	117					
+HWUSI-EAS610	1	4	7	1522	1208	0	1	GGGGTCACACATTTTCTGAGGTGACAGGTATCCTTT	`a]\]`aab`aaaaaaab``]^aa`]Z]R```[```	chr10.fa		5245727	F	36	119					
+HWUSI-EAS610	1	4	41	1668	1594	0	1	GGTGACAGGTATCCTTTAAAGGACATGTCATGAGTC	aaYbaab`ZWaa`aabb]aa^T[_`_`_^aaa^[\_	chr10.fa		5245746	F	36	119					
+HWUSI-EAS610	1	4	43	103	1423	0	1	GTGCTTGGATCCTACTGTGATAGATTCTACTATGAC	aaabaababaababaaa`a[`a`]aababa`a^aWa	chr10.fa		5245791	F	36	119					
+HWUSI-EAS610	1	4	33	1082	1652	0	1	GTCATCTCACATAGTGTAGAGGTCTAGAATAGTAAT	a`aa`_`_]L[aY_^a^[^\``^Y`]`^^_]`]a__	chr10.fa		5246072	F	36	119					
+HWUSI-EAS610	1	4	88	96	250	0	1	AGTGGCTTGATTTTGATTTTCCAAAATGGCATGTGA	`bYbbbba^`^b`aZX`b_bba[\_\_]a`^_aU^Q	chr10.fa		5246580	F	36	119					
+HWUSI-EAS610	1	4	82	1025	1677	0	1	ACAGACCATGGCTAATTTGACCATTTATGGAAAATA	aaa^^aabaaaaaaaaaaaa`_abab`aaa```aaa	chr10.fa		5246834	F	36	119					
+HWUSI-EAS610	1	4	78	391	557	0	1	TGGTGAAGAAACAATTAGATGGGAGGGGGGTACCAA	ab`Wb`aaaaaa_`aaab]`ba__a`_aaa]`__`_	chr10.fa		5246910	R	36	119					
+HWUSI-EAS610	1	4	18	575	857	0	1	TCTAGCATCTTACCTGAACTTCATCAAAGAGCATCC	aababaaaaaaa`_aaaa`aaaaa`aa__a_`aa_`	chr10.fa		5247159	R	3T32	81					
+HWUSI-EAS610	1	4	51	217	1950	0	1	TCTGGGCCTTGGTGAACAAAGTAGAGGGATCTTTGG	abbbbbbbbaaa_baaa^^Za\aaaaaa`_aa^_a`	chr10.fa		5247377	R	36	119					
+HWUSI-EAS610	1	4	31	834	3	0	1	TGCTCTGGGCCTTGGTGAACAAAGTAGAGGGATCTT	a``]\_``a[[]_aa^a`a[``_TZ_a`aa`_`X]]	chr10.fa		5247380	R	36	119					
+HWUSI-EAS610	1	4	75	73	1263	0	1	ACCAGGTTGTCTTTCCATCCAAGCTGGACTGTAAGG	ab_S^```aYaY][_\\N`_OIW`W\S_`ZYSPZ^W	chr10.fa		5247419	R	36	118					
+HWUSI-EAS610	1	4	34	559	22	0	1	AACCTCACTCGCCCCAGCCTTGTTAGCCTATCTGCA	]]]_X``^Xa``_^^U^\WZ^`XUXQRJQ[UXUR\B	chr10.fa		5247480	F	36	114					
+HWUSI-EAS610	1	4	7	1637	295	0	1	TGGGAGGAAGGAAGAGCCAGATTTGTCCTTTAAAGG	a`_\`^_\HHU`a^_`aa`_`^Za`]`^__a__]ZZ	chr10.fa		5247535	R	36	117					
+HWUSI-EAS610	1	4	29	1695	1186	0	1	AGAATATCAGGAGTCCCTGCCTTGGTAAACAGTAGT	ab\Yaaab`a^`W_\_[UU`aaa`ZS^VVU^_P`[B	chr10.fa		5247889	F	36	114					
+HWUSI-EAS610	1	4	53	1188	1554	0	1	AGCAGGGGAGTGATGTGTCTGATTATAGCAAAAATA	aa][^`Y_V]Za`___b_`aa^\]aa]^_a``Z]`\	chr10.fa		5247988	R	36	119					
+HWUSI-EAS610	1	4	16	1259	1534	0	1	CAGTGCATTGGTATGTAACTCATTCTAGTCTTGGAC	abaaaa_aaa`Saaa`abaa``aa^aa`^__aaa_^	chr10.fa		5248110	R	36	119					
+HWUSI-EAS610	1	4	15	359	241	0	1	ATGAGTTACATACCAATGCACTGTCTGAAAAGGAAA	abbabaaaaaabaaaa_aaaa\`[_aaaaaaaa``a	chr10.fa		5248123	F	36	119					
+HWUSI-EAS610	1	4	2	808	1382	0	1	CAGCTGCTGTGTAGGTGCTGGGAATCAAGTGGAATC	aaaaaaa_a_`]`aaUa`aaaa[a`Z\`]K[``a__	chr10.fa		5248229	R	36	118					
+HWUSI-EAS610	1	4	22	1167	1375	0	1	GCTGCCATCACCAATAACATTGGTTCCAGGGCACCT	abbbaa_Z_``bbbbbbabaaba_aaaa`aa_a__a	chr10.fa		5248261	F	36	119					
+HWUSI-EAS610	1	4	79	237	1101	0	1	TATAAGGTCAGCACATCCCTCCTTGCTCCTGGTTAG	aaa]]ba_````aab_aa_a`_a_b`V_`_aTU_Z`	chr10.fa		5248495	F	36	119					
+HWUSI-EAS610	1	4	30	929	1591	0	1	TAGTGGTCAAAGCTCAATGAGTCTTGAAAGGCATGT	UY_abbbb``\a`bb`bbbbbababbaba`ab`abb	chr10.fa		5248583	R	A35	93					
+HWUSI-EAS610	1	4	93	920	1421	0	1	AAGCCAGCTTTTTCTTCTGCTCCTCCAGATGCATGC	a[]`__aZSa`a`\`aaaa_aX]`_\`a__a_`\a`	chr10.fa		5249010	R	36	119					
+HWUSI-EAS610	1	4	81	790	1044	0	1	CCAGTGCTTCTCCTCTGTTTTATTTAAGACTCTGTC	aa_aab[aa`]^^aaababb`_abaa]Z`aaa]a^`	chr10.fa		5249153	F	36	119					
+HWUSI-EAS610	1	4	24	293	1784	0	1	ATCTTAGGCCTTTTTGTTGACCATAGGCACAGTGAA	a`aaabbaaaaa`aaa__`Yaba`aa`aa``a]a_a	chr10.fa		5249515	F	36	119					
+HWUSI-EAS610	1	4	11	892	921	0	1	TGGATAAATTTCAGTGCCTTCAGGTTCACTGTGCCT	abaab]aaba^`aTVaZPY_Ya``R__`\__]_`Y_	chr10.fa		5249539	R	9C26	81					
+HWUSI-EAS610	1	4	20	1429	1781	0	1	ATCTGAACTTAGGGCACTTGTTTATTTTGTTTTGTT	aaaab__Y^X\aaaaaYaaa^_XUaaa`^\aa`a^a	chr10.fa		5249712	R	36	119					
+HWUSI-EAS610	1	4	49	984	1934	0	1	CTCACAGTAATTGAGTAGATTTATTGTTTCAAATAT	ab`a_``^_abab`_^b`_aaaaaa`_ba_a`aaaa	chr10.fa		5256894	F	36	119					
+HWUSI-EAS610	1	4	99	544	137	0	1	CACCGCAGTCTCAGCAGAGTGAGTTACAATGATTTA	_aZ^`abba]`Ya``_\W`aaa_\]^]]`aaa`abb	chr10.fa		5257284	R	36	119					
+HWUSI-EAS610	1	4	98	348	2045	0	1	GTCCCAAAGCTGGCAGCGGAGCCTGTGCAGNNNCAG	`aa^a^[`]``aFa`_^_^\V`_BBBBBBBBBBBBB	chr10.fa		5257966	R	12T17TGT3	45					
+HWUSI-EAS610	1	4	32	1102	1154	0	1	TAAGCAAACAATCCCGTCTGCTTTGACGTAACAATT	a`Sa\^`_]a_VZT\GT[T]W`a`YVX]X_]S__]_	chr10.fa		5258018	R	36	118					
+HWUSI-EAS610	1	4	85	1245	585	0	1	AGCTACAGNGCAGCAGAGCAGCACCTCCTCCCTAGT	a`\P_a`ZDY``_^`_a]\`]``Z``\X^\\\^``\	chr10.fa		5258183	R	8A27	110					
+HWUSI-EAS610	1	4	63	1605	1125	0	1	TCAGTAATGCATTAGGTGGAGAATGACCACTGAGCT	aa^WVa]X_`aaaa`^Pa]ZXOZ[T`_\Z\[^Y^YZ	chr10.fa		5258484	F	36	118					
+HWUSI-EAS610	1	4	41	169	327	0	1	AAACTTGAGGTAGTAGTTGTGGTATGTTGAAATCAC	`]``aaa]aaUaa^\a[aaYaa[``a_`aaaaa`]a	chr10.fa		5258770	F	36	119					
+HWUSI-EAS610	1	4	12	1204	555	0	1	ACAAGAGCCCTGAGTATCTACTTGCTCCCAAATGTA	aaaa`aa`_____a^a_`^a^_`]_^]Z]^^_]XW`	chr10.fa		5259275	R	36	119					
+HWUSI-EAS610	1	4	66	420	1042	0	1	GGGAGCAAGTAGATACTCAGGGCTCTTGTGTGTGAA	aaaZaa^aa\`b[`\][\Y`^^^`_`aa\aWa\a[\	chr10.fa		5259282	F	36	119					
+HWUSI-EAS610	1	4	80	292	47	0	1	AAGGCAATGCAGACAGTCTCCATCCAGTTACTGTAC	Vabbbbab]]Z_aaa___X`a]UUKYQJSWZW\FX^	chr10.fa		5259874	R	36	117					
+HWUSI-EAS610	1	4	59	635	285	0	1	TGTGAGGGCCTGGGAGAGCCCGTTAGGGTAGCCTGC	aaa``\aa\_`\`^\\`aa_^`^``\V_T``\\``^	chr10.fa		5259972	F	36	119					
+HWUSI-EAS610	1	4	34	894	211	0	1	TGAAAGTCTATTTGATGGAAAGAAGGACAGGGTTGA	]]W_]_a_aWaaa_]aa^a_``_`]`Z[\[[^[a]]	chr10.fa		5260176	F	36	119					
+HWUSI-EAS610	1	4	26	1189	923	0	1	ATGCTGATTGCATCAAAAGTAACTTCACAAATGCTT	^^`aa^_aa`a_a_``^X]S`a^_`^`]`^_`_Y``	chr10.fa		5260543	F	36	119					
+HWUSI-EAS610	1	4	89	1037	1469	0	1	TTGTTATGTCTCCCAGGTTTGAACTCAGGGTCTTCC	abb`aabbaaaba`_ab_aab^a`_a^aa_U^``[_	chr10.fa		5260779	R	36	119					
+HWUSI-EAS610	1	4	100	1319	796	0	1	GCACACAAGTAACACTACCATCCGAACCCAAGTCCA	aabaaaaaa`ba_a`aaaaba_`a_a\`aa__^_``	chr10.fa		5261146	R	36	119					
+HWUSI-EAS610	1	4	36	31	1702	0	1	AGGACCTTACTGCTGTATTATCTATCAAGCCCTATC	aa`babbaaa_ba_bXSX]_abaa]]aaa`aa^T[]	chr10.fa		5261413	R	36	119					
+HWUSI-EAS610	1	4	16	205	1410	0	1	ACAGCGCCATTATGTTCTTTCCCAAATCACCCTCCA	a`[^baa_Ia`W``_aa\Waaab_^^^b`b_`YaaZ	chr10.fa		5261630	F	36	118					
+HWUSI-EAS610	1	4	25	33	277	0	1	GGCAGAGAGGGAGAGCGACACAAATGGCAGAACCTG	\\b````^^`T`a`]FSZbbbT[[N]bbbb^]N_\W	chr10.fa		5261872	F	15T20	108					
+HWUSI-EAS610	1	4	80	76	1376	0	1	GGATGCTTGTCTCACTGTAGGAACTGGAAAACGCAG	aa^T]a\`b`baaaa]b`aba_aaaa_^a^]\aa[a	chr10.fa		5262542	F	36	119					
+HWUSI-EAS610	1	4	60	544	556	0	1	TGGACAGATGACCTGACAGAGTTGATGCTGGTGAGG	abbaaaa`b``\`bb`aaaaa_aa`aa_aa`Qa_aa	chr10.fa		5262586	F	36	119					
+HWUSI-EAS610	1	4	97	880	1658	0	1	TAAGTAGCCCCTCGTGATGGGAAGGCTGAGGGGGAT	a_aa_ba_`W^\XbYaaX]^\[V]P_`_G[`aG[a]	chr10.fa		5262739	F	32T3	106					
+HWUSI-EAS610	1	4	7	354	829	0	1	ATGGATCACCCTCAGCCTTCCCATCACGAGGGGCTA	aaaaa]aaa__aaa`a`a_``aa`a]a`P\]a_^[U	chr10.fa		5262743	R	36	119					
+HWUSI-EAS610	1	4	45	586	414	0	1	GACATGCCTGATCCGTATCTCAACCCACCCCATGAC	`aaaa``a`b`]`aaZ\_aaa`aa^^a````^X^_]	chr10.fa		5262786	F	36	119					
+HWUSI-EAS610	1	4	12	84	1452	0	1	TAACATATTCTGGCAACAACCACACCCTCCTCTGTT	aaaaaaab`bbabbb]a[abbabbbbbabbbbab^a	chr10.fa		5262831	R	36	119					
+HWUSI-EAS610	1	4	30	263	643	0	1	TTTTTCTTCCCTGGCTGGCACAAACTGCTGTACTTT	abbbbbaaaaaaaaa_aaa`aaXaaaaaaa__`aaa	chr10.fa		5262926	F	36	119					
+HWUSI-EAS610	1	4	55	981	1845	0	1	TTATTAGGATTCCCATTTCCTCCTGGTTATGTGCCA	`^U_YVU\a[aX^W_aN^Q__SR\Y]S^___OQW^`	chr10.fa		5263226	F	36	118					
+HWUSI-EAS610	1	4	58	1444	392	0	1	ACATAACCAGGAGGAAATGGAATGCGCCGGACTACG	_^a^_^]Z_XWY_X\QX]]X`^\]\\`a]\_X^\^W	chr10.fa		5264544	R	36	119					
+HWUSI-EAS610	1	4	38	468	440	0	1	TGCACTGGACTATGATCCATGCTGGCAGATAACTAG	TJ_\`bbaY^_[\^`bWOV^\^X]ZTZ_KSRTYKQ\	chr10.fa		5265302	R	33C2	14					
+HWUSI-EAS610	1	4	93	1775	711	0	1	TGGATCATAGTCCAGTGCATTCCCATTTCCTCCTGG	]]\`S^]_a[\_\_^X^[__`_`^_[_`_\`\][[[	chr10.fa		5265319	F	36	36					
+HWUSI-EAS610	1	4	61	386	1556	0	1	ATGCAGAGGCCATTTCTTTGGACAAGCCAGTGCCTA	a_aaa`N_`a`aaaaaa`a^W_`]a___[_U__]ZX	chr10.fa		5265821	F	36	119					
+HWUSI-EAS610	1	4	36	1376	62	0	1	CTCCAAAATATGATAATTCTGGCATTATTTTTATCC	_^Z^``\ZS^ZU]^`\Y]^XQXVV_]WZZW^a]WV_	chr10.fa		5265938	R	36	118					
+HWUSI-EAS610	1	4	85	1576	2012	0	1	GGAAGATCCTAGAAGCATACTCTATCTACTTCCTTT	\a`\``bbbba^`\aaab`Vb_b]a`aa\aZ]\``\	chr10.fa		5266211	R	36	119					
+HWUSI-EAS610	1	4	86	820	328	0	1	GTGCTCTACTCCTTGTAAAAGTCGCAAAACTCTGCT	I[babb^baTW[ab_bbba][^_bJW^^^XXXaV]b	chr10.fa		5266467	F	25C10	90					
+HWUSI-EAS610	1	4	46	697	423	0	1	AGAACTATGTGTGATTCTAGCTGTAATGTAAATATA	aaVaaaa_a[a^aY___^\```a_`_aa^``_^U`_	chr10.fa		5266744	F	36	119					
+HWUSI-EAS610	1	4	77	1009	152	0	1	TGAATCCAAAGAAAGAAATGGTTCATTTATATATAG	abaaa__`aaa``^`]aa`a_[`^____[_^``^a_	chr10.fa		5267008	F	36	119					
+HWUSI-EAS610	1	4	52	1492	1979	0	1	TGTGCTGTGTTGACAGGAAGACACAGGCAAGTGACA	ab\_aaa_a`aa[RY]PV]a__`\___[_Z^UYSUR	chr10.fa		5267355	R	4G31	81					
+HWUSI-EAS610	1	4	13	335	1872	0	1	CATGATGCAGAAAACATATGCTAGGGCTCCCCCTTC	a]]a`\aba^`_aaa]__\_a___Z^`W^__^_YW\	chr10.fa		5267764	R	36	119					
+HWUSI-EAS610	1	4	57	955	749	0	1	AGCAGAAATTCTCAGGATTGGTGACTCCCCTCTAAA	aa[a_aab`_```Y``a`aaWWa_``_a_Za__aa_	chr10.fa		5267871	R	36	119					
+HWUSI-EAS610	1	4	41	632	541	0	1	TACCCAGACTGTGTTATACAGCACAACCAGTAAGCA	aa`aa```aaaaaaaaa]]a_X_`\`_Z^`^a_][\	chr10.fa		5268015	R	36	119					
+HWUSI-EAS610	1	4	65	501	512	0	1	GGAAACAGAATCAAAGACATACCTGCCGATGCTGCT	aa_a`[_a``aa]`_]]`_____^`_`Y^]Z_]_^X	chr10.fa		5269321	F	36	119					
+HWUSI-EAS610	1	4	23	1545	407	0	1	ATAAATGGAGATATGTAGGAGATTGCTTAGGGGTGA	aba_a`X\`_aYa[\Ua__[a`_`_`__aVYWXTW_	chr10.fa		5269928	F	36	119					
+HWUSI-EAS610	1	4	74	715	1642	0	1	AATAGAGAGAGAAGTCAGTTCAGTCTCCTATAACTG	aab`b_baa`bYT__aaa^a``a\````a]a`a_aa	chr10.fa		5270041	R	36	119					
+HWUSI-EAS610	1	4	97	1055	834	0	1	GTTTGTGTTTTGTTTTTATTTGTTAATAGAAGGAGG	a^a`b\`\aa`a]a``aa``]\_a\aa\a^^_[Xaa	chr10.fa		5270091	R	36	119					
+HWUSI-EAS610	1	4	58	287	98	0	1	GAATGGATAGAAATGCGTGTGATCTGATGCCTACGG	aR]_ab]_a`V\_a`__YZ^_UV]^_^U^XXR[VZU	chr10.fa		5270166	F	36	119					
+HWUSI-EAS610	1	4	49	518	1244	0	1	GATAGAAATGCGTGTGATCTGATGCCTACGGAGGCC	aXb_`]PZ``[`]W]a_`_a``__`_`^][^^^[`[	chr10.fa		5270171	F	36	119					
+HWUSI-EAS610	1	4	16	937	266	0	1	AGGTTCACCTCACACCACATGATGGCTCACAACTCT	``_aaa\aa``aa]]`a_a`aaZYXU`^`Y`a[a`_	chr10.fa		5270353	R	36	119					
+HWUSI-EAS610	1	4	41	961	190	0	1	ATGTCAGCAAATCCTATATTTCAGGAAACAGTAGGC	aaba`]a_aaa_^aaaaYJZa``aa__^\a`W`_`_	chr10.fa		5270458	F	36	118					
+HWUSI-EAS610	1	4	14	836	13	0	1	GTAGGGAGACCTGGCAGTTTAGAATAGATCGAGATT	aQ_a^\\^]YY^_^_^`Z`___Z]^]]WYTTUTVUV	chr10.fa		5270568	R	36	118					
+HWUSI-EAS610	1	4	100	790	1283	0	1	ACATCCTATAAATTCTTCATGTAAAGTTGCTCTTTC	aaaa__`````_``_``__`a^``^_\_a^`^^`_^	chr10.fa		5270894	R	36	119					
+HWUSI-EAS610	1	4	66	579	215	0	1	TGTGTGAGTTTCAATAAAGTTTCTACATTTTTGGGC	a^[_X``]\aa_b_a_a^a`aa^a_U_aa`a]\_a_	chr10.fa		5271248	F	36	119					
+HWUSI-EAS610	1	4	69	324	1685	0	1	ATGGTGTGTTTATGAGGAGTCAAACACCGCTGTGGA	\]aaY^Xaabb\bY[]_S`_a^a]aaa^a`a_Z^aX	chr10.fa		5271447	R	36	119					
+HWUSI-EAS610	1	4	29	132	1008	0	1	ACAGGTTTCATCATAGCATGTGCTAACAGTGCGGCT	a_I^WI]a_ZZb^`]ba_Y^^a`aYYaY^_aaZ`aa	chr10.fa		5271703	F	36	118					
+HWUSI-EAS610	1	4	70	882	128	0	1	AGTTTGCCTATAAAGTAAGTTGTGGAACTAAAAAGG	ab`aaaaabaaaaaa`aaa\aa`aa^a`aa_a^a^Z	chr10.fa		5272291	F	36	119					
+HWUSI-EAS610	1	4	80	730	236	0	1	AATCGATTACTAGAGGCCAACTGTTACTGTTCATTG	abbabaa_U`aaa`aaaa^```a`aa_`a\[Y`aab	chr10.fa		5272417	F	36	119					
+HWUSI-EAS610	1	4	4	1142	567	0	1	AGCCTCACCCGTCATCTTCTTTCAGGCCCTCTTTCC	aaaaa_`X_\`\`]a`aaaaa\\_XM```^^__^Q^	chr10.fa		5272697	F	36	119					
+HWUSI-EAS610	1	4	53	1746	962	0	1	TGTCTAACAAAGTTGCAAAGTTTATCCAAAAACTGG	a``ababaaa^Y[a]`a`a`^aaa```aa`aa`^\\	chr10.fa		5273260	F	36	119					
+HWUSI-EAS610	1	4	37	870	2028	0	1	ACAGACAGCAAACAGACCACATAACATACCTGTTAT	aaaaba]aa]W_^`W[^`a^__`]]a^`U`Q[Z\__	chr10.fa		5273305	F	36	119					
+HWUSI-EAS610	1	4	71	435	1950	0	1	CAGCTATGAAGACTTTATACAGATCATGTCAGTCAT	^a`bab_baa`_a\a``aa_aa__`Y^aV``^Y[Y]	chr10.fa		5273510	R	36	119					
+HWUSI-EAS610	1	4	46	735	59	0	1	AGAATCAATAAGGAAATGAATCGCTAATGCCAGGTT	a`__`bbaaa``a_a`bbaa`^`^a`_aa^\^aa^a	chr10.fa		5273644	R	36	119					
+HWUSI-EAS610	1	4	82	837	607	0	1	GTTTCTTTTTGTAGTGGTAGAACTTAAACTCCAGTC	a_aa^aaa`aa^^a_``Y`a^a[a__^][Z][Y_Z^	chr10.fa		5273761	F	36	119					
+HWUSI-EAS610	1	4	9	608	38	0	1	GACTGGAGTTTAAGTTCTACCACTACAAAAAGAAAC	aVNV^J[]H_`__]ZWYYa\_`YY[OQ^PX^[^^_]	chr10.fa		5273761	R	36	117					
+HWUSI-EAS610	1	4	77	1377	1757	0	1	AGCAATAGGCACTATTAATTCTTGCGCACATGAACT	aaaaa^_a__a\a`aaaaa``aab^a_a^_____Z_	chr10.fa		5274168	F	36	119					
+HWUSI-EAS610	1	4	76	1472	59	0	1	ATCCAGCTTCAGGAAATGGGAGAACGGCTTGCTAAA	aab`aZ`a``a_[_`a`a[\^[baTGL]]VHVV]`a	chr10.fa		5274377	F	36	117					
+HWUSI-EAS610	1	4	67	761	1558	0	1	AGAACTTCCTGCTCAACNATAATGGTGACTGTAATT	UR\_]\\ba`abV\_a[DYYRW\[VI_]a_\F^^_Y	chr10.fa		5274822	F	17C18	108					
+HWUSI-EAS610	1	4	59	4	675	0	1	CAGAGTATGTGGTGGCCATGCATACAGGGAAAGAAA	aba[aF`[aVaWN^[_XSS`WHXQYZ`a_SUBBBBB	chr10.fa		5275254	F	36	95					
+HWUSI-EAS610	1	4	87	554	731	0	1	ATGTCCCTGAGCAGGGAGCGCACTGTTATTTGCCCA	`]^`\S__``^aaaba`a]aa``^a\_``^aa`^^a	chr10.fa		5275291	R	36	119					
+HWUSI-EAS610	1	4	23	325	1451	0	1	TGAAAGCCGATTTAAAATATTTTGGGTATAGTGCTT	``\`^aab```bb^b`\```aaa`a[Uaa`b[`ab\	chr10.fa		5275643	R	36	119					
+HWUSI-EAS610	1	4	18	811	1585	0	1	GCTGGATTTACTCCCTCTCAAGCTGNTTGGCTATCA	]a]ab`a`aaa````b_aaa``aa\DS_X_\aa_U_	chr10.fa		5276085	F	25C10	110					
+HWUSI-EAS610	1	4	64	1060	1192	0	1	AAAACATATAGCAACAGATATGAAAACTATACAAAG	``]]`bb_]]`NZYS\_]WR^TUUVLRa^``[\]\]	chr10.fa		5276721	R	36	118					
+HWUSI-EAS610	1	4	35	1025	1381	0	1	CGTGGCTGTCTCAGGAACCCTTTCTTTTGAGCCGTA	_b`_baa]GYa^Q]^X`R\\Za]Q_[^^WURQTBBB	chr10.fa		5277335	F	36	104					
+HWUSI-EAS610	1	4	70	1044	102	0	1	GCAGAGCCGGACTTCTACAAGTGACAGCTTCATGGT	aUa_``\UZaZ_XZ]ZR]_``SP[]^aV__[RTVTB	chr10.fa		5277612	F	36	114					
+HWUSI-EAS610	1	4	64	750	1120	0	1	CATCCTCGGGCCATGCAAGTCCTCTGCCACCACCAT	aaa``a`a_aa```__\][aa````_a``]^`]a`]	chr10.fa		5277643	R	36	119					
+HWUSI-EAS610	1	4	65	70	1710	0	1	TCCAGATGGAAGAGCCTAGTGTCTATCCCGTGAGCC	ab`Q_Tabbbb^R`bbaaa\a`baa[abbaU_S_ab	chr10.fa		5277777	R	36	119					
+HWUSI-EAS610	1	4	54	690	1059	0	1	TGTAGGCCATGGACTCCAAAGGGTTCTTTGTTGGTT	aa`^a_`__a`a]Xa`_U]^_`aXaY`___Z`_`]`	chr10.fa		5277858	F	36	119					
+HWUSI-EAS610	1	4	96	1327	1192	0	1	ACAAGAAAACAAACCAACAAAGAACCCTTTGGAGTC	`^\_\M]``]^^`baba^a\a``YOO^]YYOWR[\]	chr10.fa		5277869	R	36	118					
+HWUSI-EAS610	1	4	36	306	744	0	1	GAGCCATGTTCCTTGCATGATGCATTTGGCCCAGAC	a_aa``Z`Xa`aa``a`aaa_aaa_\_a_aaa`a__	chr10.fa		5277946	R	36	119					
+HWUSI-EAS610	1	4	2	1163	1009	0	1	CAACTGGAGCCATGTTCCTTGCATGATGCATTTGGC	aaa_aa^a`_`a_`\]a`__`_`a`_`a^_Za__Z_	chr10.fa		5277952	R	36	119					
+HWUSI-EAS610	1	4	20	416	392	0	1	CGCTAGCAGGTGGTGGCTTTGCTGAATCTTTTTCTC	aaaaa```aaUa_Z``__a^`a_a_\\__`_`a``a	chr10.fa		5278009	R	36	119					
+HWUSI-EAS610	1	4	73	531	1439	0	1	TCTGTGGTGAGGATTCACGGTTCTTCCCATATGATA	aaa_^aa_a`aa^a`_W_aa\a`aa`___a^^a\]]	chr10.fa		5278342	F	36	119					
+HWUSI-EAS610	1	4	38	1459	193	0	1	TGTGCTCATTTGTGTGGTATCAGTAATGGGATGGGT	`\aa``[aaa`[W_^a_Zaaa`]^_`aX[GU_aP^W	chr10.fa		5278642	F	36	118					
+HWUSI-EAS610	1	4	46	1565	717	0	1	TTCAGTAGTATGGCTCTTCTCAAGAAGTTTAAGAGC	abb`__a_`aaa]aaa_a_a]_][T\WX``^^]WY\	chr10.fa		5278685	F	36	119					
+HWUSI-EAS610	1	4	73	805	2038	0	1	GCTATGAGGGCTTGCCGATTAATCATGCTTGTTAAA	abbb`^a]\`aaa\^M^]aaba_`_aaaaaa`a`\[	chr10.fa		5278756	F	15T20	101					
+HWUSI-EAS610	1	4	31	785	1627	0	1	ACTAAATTTATATTAGCCTGAAAGAGGAAGTTGTCC	aaba__`baa`aaaaa`aaa``_a__a]^_T\T\[^	chr10.fa		5279162	F	36	119					
+HWUSI-EAS610	1	4	17	1485	290	0	1	CTGCTGGCCTGGTAGAGTATGATTTACTCACATCTT	[aUa`Z__a`S[Ya`aaXaaa]TSZaa_]`G`][aa	chr10.fa		5279316	F	36	118					
+HWUSI-EAS610	1	4	25	428	368	0	1	TTTGTGATGGCTGCTGCTGCAGGTCTCAGGAAACGC	a`W`]b_``TZV]``a_WH_S`b\X^SZT\^`BBBB	chr10.fa		5279624	R	36	101					
+HWUSI-EAS610	1	4	30	622	335	0	1	AGACCTGCAGCAGCAGCCATCACAAAGCTGTCATTC	``bab^babaaababbba`b``_aaa`a_aYa_a_]	chr10.fa		5279634	F	36	119					
+HWUSI-EAS610	1	4	84	842	1391	0	1	ACAAAATTCCCCTGGGTAATTAATGAATGACAGCTT	`]^bb_PX_`a\ZaabP^`Z[\\_a^X\VZ\Z^U^a	chr10.fa		5279658	R	36	119					
+HWUSI-EAS610	1	4	15	1756	1889	0	1	TCGTTCATTAATTACCCAGGGGAATTTTGTCTTATG	aRG]aRN__^]_W__TXV\^Y^SWXQUWYNJVYY^]	chr10.fa		5279664	F	2A33	106					
+HWUSI-EAS610	1	4	37	1614	1457	0	1	ACACGTGTGTGAGGATGAGATTTGGGGATAGTCCCT	]bbbb^_]_^a[[W^ab]bbaaa`a]aaaa`X`W`[	chr10.fa		5280955	F	36	119					
+HWUSI-EAS610	1	4	43	891	1064	0	1	GCAACTATACCATCAGGATTGGTTTCATTGGAGGCA	a]aa_aaaaaaaa[aaa`a``a__`Y_a_``_aa``	chr10.fa		5281001	F	36	119					
+HWUSI-EAS610	1	4	90	1209	762	0	1	AGAGAGCAACTTATTCAGCATCTCGGCGTCATAGAG	S_]]a`]`^Z^bb``]T^W_`]`aQS_NU\_bY]^a	chr10.fa		5281266	F	36	118					
+HWUSI-EAS610	1	4	36	1141	1771	0	1	GAGGCCACTTTGACATTGAAGCACTTTTCTTTATCT	abbb^Yaaaba`[]babb[aaaaZaabaaaaa_b_b	chr10.fa		5281436	F	36	119					
+HWUSI-EAS610	1	4	50	1115	220	0	1	GTCAAAACAGTCTCTTTCCAGGGCTGTCTCAACAGA	_[`^`_`X^[[^`]_`_^^_`YV[[UTU_]^^X[_[	chr10.fa		5281716	F	36	119					
+HWUSI-EAS610	1	4	1	1454	1764	0	1	AAAAGGTGGATCTGGGAGAGAGGGGAATTGCTGGAA	a`a`bbNbaa`Vbb]a[`[b`b_ba\a__`_`aa_a	chr10.fa		5282556	F	36	119					
+HWUSI-EAS610	1	4	73	458	413	0	1	AGGGTTAATGGGGTCCCATGTCTGCTTGGCCACAGG	abaaJ\bPP^VP]\X`UMV`X^\^YYTP_SR\VBBB	chr10.fa		5282614	F	36	31					
+HWUSI-EAS610	1	4	30	360	1606	0	1	TGCTTACCCCATGCTGTCACTTGGCAGATGTTAGGC	Y[ba_W_abbbbbbbbaa_abbbbaab`bbbb`bab	chr10.fa		5282691	F	C35	89					
+HWUSI-EAS610	1	4	25	340	231	0	1	CATGCTGTCACTTGGCAGATGTTAGGCTGTAGGGCA	abbb`baabbabaabbbb`abaabaa_ab^b^aaba	chr10.fa		5282700	F	36	119					
+HWUSI-EAS610	1	4	23	1245	805	0	1	GGGGAAGCACAGTCTGAGGTGCAGGACTGCTGGAGC	_`_aa```\\`[[``aZ`_Na``V`U`^\^`^\\`Z	chr10.fa		5282759	F	36	37					
+HWUSI-EAS610	1	4	18	742	1923	0	1	GAGAACGAGACAGCCCTGAGCCTCATCATTGTCACA	aa_W__ZTV`]a^^]]]\NWZSFDY[\TSPVPPSZZ	chr10.fa		5282816	R	36	115					
+HWUSI-EAS610	1	4	75	1155	766	0	1	GCTCCCCATGGCGGATCCCTGTGAAATGAGGCAGTG	_XXaa_R\XaQEQ^[TX\``^[^ZQDSFFVZ\IZTU	chr10.fa		5283006	F	11T24	81					
+HWUSI-EAS610	1	4	68	729	938	0	1	AGTCAGAAGTCTATGGAGGGCTGTGGCTAGTGACAG	aa]aaa_``_aaaaa\_`_``aa\a___^`[[[Z[^	chr10.fa		5283290	F	36	119					
+HWUSI-EAS610	1	4	88	122	2022	0	1	GGGCTGTGGCTAGTGACAGGGGCCTGGTGCCCTAGA	`_aaa[`_]^_P[T^^`Z^^``\^YF`X^\\\NNVT	chr10.fa		5283307	F	36	14					
+HWUSI-EAS610	1	4	93	1057	605	0	1	GGTCATCAGAGTTTCAAGCCTTAGCTCAACTGGGGA	`_R_V`Z]`_`GTY_`[LTaa_Z[TPXHPS`R^NRR	chr10.fa		5283372	F	36	116					
+HWUSI-EAS610	1	4	6	265	1608	0	1	GAGATAATGTATGAGAGCGAGGGAGAGAGAGAGAGA	]GPXJIXU]YY\`TRXYMSY\JVZ^V_TNUXNVUUZ	chr10.fa		5283472	F	17A18	98					
+HWUSI-EAS610	1	4	37	80	569	0	1	GAGATCTGCCCTATGTGGGTGCTGAGAATCAAGCCC	aZ_W_a_`aaa`X]aU]_aV_``abaa^\a^^`a_`	chr10.fa		5283609	R	36	119					
+HWUSI-EAS610	1	4	81	408	19	0	1	GGGGGGCAGTGTTTCAAGACAGGGTTTCTCTGTATA	a__a_a]`aYbT_]`WUTZ\`]\UHR_[XY^^W\VT	chr10.fa		5283671	F	36	21					
+HWUSI-EAS610	1	4	79	1297	398	0	1	TGTAAAATTCTAGTTCTGTAGCCTTACCCCTGGGAT	\`T]`\\_RVQWSF[[V]]`[TQR[UKDTKOO[VQ`	chr10.fa		5284117	F	36	114					
+HWUSI-EAS610	1	4	89	1308	792	0	1	GTCCCTGTTCAGACTGACTGATTCTCATTTTTGAGC	a_aa`_^_`_a``^```_`a\`a_a`_aaa^_`^]]	chr10.fa		5284155	F	36	119					
+HWUSI-EAS610	1	4	52	584	235	0	1	AAGCCAGTTGGGCTAACTTGTACCTGTAAATCCCAG	^a_Z_`XFT_`^^]`a`^aa]a_b^V_abaa_XX_a	chr10.fa		5284341	R	7G28	108					
+HWUSI-EAS610	1	4	3	966	1145	0	1	AACTCGGTCCCACAAATATTACAATTTATATCACAG	aaaaaaa_aaaa_`]``baaaaa`_`aaa`aa`aaa	chr10.fa		5284661	R	36	119					
+HWUSI-EAS610	1	4	81	1315	778	0	1	AACATTTAGCAACTATTCACAACTATTATACCCAAT	abaabbaa_aaa^aaaa`a`_`_aaaaaaa]]^aaa	chr10.fa		5284733	R	36	119					
+HWUSI-EAS610	1	4	58	679	1178	0	1	CACAGCACTGGCTTCTCCACATGAGGGTAACATGAT	abbab`aaaa]aabaaaa_a_ab`aaaWaa`a__aa	chr10.fa		5284916	F	36	119					
+HWUSI-EAS610	1	4	69	815	394	0	1	CAACCAGCGTCTCCTTTAGCTTCTTCACCCTGTGGA	abbaaaaaa`__`_a`aaaaaa`aa`a_a`aa_a_`	chr10.fa		5284983	R	36	119					
+HWUSI-EAS610	1	4	14	1349	538	0	1	GTTGCTGTGCAGCAGCTGGACAAGAACATGGGCAGC	_\XaabZ\Q`^Z]_aQaa`X_`_]^X[`UWXT^PY`	chr10.fa		5285015	F	36	118					
+HWUSI-EAS610	1	4	46	1436	1474	0	1	AAGAGATTGCTAGGCCACACATCCTGTGTTCTCTTG	aXYVaJS`_`_[R]_Q[^`ZU_^_^a]a__]aNR\B	chr10.fa		5285164	F	12A23	91					
+HWUSI-EAS610	1	4	81	1696	1070	0	1	TGTCACTAGTCCTGCCTAACTTCTTTGTGATCTTTC	_X^aba_`V\aa_VZ`baaaaaaabaYa^\_Za`aa	chr10.fa		5285241	R	36	119					
+HWUSI-EAS610	1	4	50	529	691	0	1	TAGTTCTTTGTGTAGGACTGAGGCCCCTGGTTCTTT	a^b`baaaab`b_`aa[`aaa_`__a__[`V_]_a_	chr10.fa		5286331	F	36	119					
+HWUSI-EAS610	1	4	52	548	1706	0	1	TGATCCCTGGGTTATAGGTGTAGGAGTGGCTTTGTA	_b`bbaaab`a`b_a^_^^a]^``Xa`_`aaaa_[[	chr10.fa		5286540	F	36	119					
+HWUSI-EAS610	1	4	2	255	1454	0	1	GGAGACTCCTGCCTGCAGGCATAGAGTTAAGAATGG	a]ab_a^aa_aaa^_^``^XKX_aW_K]_[aQT[`a	chr10.fa		5286964	R	36	118					
+HWUSI-EAS610	1	4	15	306	1463	0	1	CCAGGCAAGTGTGAGCCACAGCATACAGGGTTGGTC	aaWX_ababWaXababaabT`Xa^aa^X_aUaaaUa	chr10.fa		5287983	F	36	119					
+HWUSI-EAS610	1	4	71	210	1453	0	1	GGCTTCTGGGGATGCTCCTGTTTCTGCCTCCCATCT	aaaaaaab]bab``a`aa_a^``a`aaa`_```^\^	chr10.fa		5288092	F	36	119					
+HWUSI-EAS610	1	4	19	1282	453	0	1	GCTGTGAGAATCTGTGTATTTAGATGAGAGAACTCC	a_a_^a````a__aab`aaaaa`]`^][`_\`^`a`	chr10.fa		5288514	R	36	119					
+HWUSI-EAS610	1	4	12	1757	868	0	1	CACATTTATTTAATGCACTGGCCTGAACATGGTGTC	ab`aaaaa`a`aa__aa_`ZR\_]\^_Z_\X[TSX_	chr10.fa		5289680	F	36	119					
+HWUSI-EAS610	1	4	51	493	970	0	1	GTATGATTCACCTCAAACTTCTTCAGCTCCTCCTTG	`]\``Yaa__]_`_``\_aa_`_^__^^]]^^___a	chr10.fa		5290140	R	6A29	81					
+HWUSI-EAS610	1	4	53	1533	586	0	1	AGAAGTTTGAGGTGATTCATACTGCCAAATAGTCAG	a_`ab]aa___\Xaa_aaa`a`^`]``_`__\^_]]	chr10.fa		5290154	F	36	119					
+HWUSI-EAS610	1	4	36	601	814	0	1	ATCGTCACTGCTCTTCATCTACTCTCGAGGCATGCT	`baa_aaaaaa````]MZ``[a^`Za_[`_[\Y_Z^	chr10.fa		5290310	R	36	119					
+HWUSI-EAS610	1	4	90	1353	727	0	1	GAGTCAGGCAGGGCCAGTGNGGACTAGAAGCAATGA	a``]]a^Z\^ZW^^]^_\XDX]\W`_`^\_^UW^\\	chr10.fa		5290733	F	19G16	110					
+HWUSI-EAS610	1	4	87	809	1907	0	1	AGTGTCAGTGTGTGTATAGAGTGATGTGTTCTATCT	ab]a[^ba`a_a]_aaaaa^`Zb^aaW\aa]aaaa_	chr10.fa		5291138	R	36	119					
+HWUSI-EAS610	1	4	46	272	1275	0	1	AGTGCACAGGCACACATGTGAGTGTCAGTGTGTGTA	ab^aa_aaY`baaaaa`a\a]`\a_a``Q_X`^]V^	chr10.fa		5291158	R	36	119					
+HWUSI-EAS610	1	4	78	968	1880	0	1	CTGCTGAAGAATCCAGATCACTTCACAATGCTGGTG	]b`abba_bbba_Z_aZ_bbabbaa^_aaa`_a`Ra	chr10.fa		5291755	F	36	119					
+HWUSI-EAS610	1	4	76	1215	1987	0	1	TTGTAGCACTGTGCTTTGTGAAGGTTAAAACCTCTC	aba_``^]R_aVT[_a`a]a``]`X]^_^_ZWXU[Z	chr10.fa		5291812	F	36	119					
+HWUSI-EAS610	1	4	68	472	459	0	1	CCAATTATGAGAGGTTTTAACCTTCACAAAGCACAG	aa``bbabbabaab_aababaaaaaaaaaaaaa`aa	chr10.fa		5291820	R	36	119					
+HWUSI-EAS610	1	4	34	547	656	0	1	TTTCAGTGCTGGGCATCTGAGTCCAAAATAGAATCA	abbaba`a````aaaaaa``a`aabaababa`aaaa	chr10.fa		5291891	R	36	119					
+HWUSI-EAS610	1	4	46	426	246	0	1	GAAATGTTTGGAAAGACATTGGGTGCACTGGGGTGC	`X[`ab^`aa`aaaaaaaaaaa_Za`^__\]UUU]_	chr10.fa		5292035	F	36	119					
+HWUSI-EAS610	1	4	75	92	270	0	1	TGCACTGGGGTGCCCTGAGTGCTATACAATCACCTG	abbbbT`b_`Z`]aaaaZ_P`a]`]bba]]bbbbab	chr10.fa		5292058	F	36	119					
+HWUSI-EAS610	1	4	16	377	475	0	1	GTAGAACCTCCTTGAGCACCTCATAATTTCTTTAAA	a_aa`^^a_a[_`a``_aa_`^`a```_a_`_a]Y]	chr10.fa		5292134	F	36	119					
+HWUSI-EAS610	1	4	82	1663	1301	0	1	AACACCCATCCCAGCAGGCTATCTTAAGTTTTAAAG	aa_`[``_a^^a___\\`_`X^ZYZ^U^R_^_^_\a	chr10.fa		5292163	R	36	119					
+HWUSI-EAS610	1	4	54	516	1116	0	1	TAGGGCAGGGGTTCAATCCTCTGAGCAGTGTGAGGA	a^abbb`a`b]P^``\baaab`_a``Qb_ba_\aa]	chr10.fa		5292231	F	36	119					
+HWUSI-EAS610	1	4	16	284	1672	0	1	ACTGGCGTTGATTTTATGTGCATCTCACACTTCCGT	aa_a\[bVaaaaa[^_]aUUaW_^]_YUFO^_a]XZ	chr10.fa		5292277	R	36	117					
+HWUSI-EAS610	1	4	18	193	39	0	1	ACTGGCGTTGATTTTATGTGCATCTCACACTTCCGT	Yaaaba\T]RTMRa]S^`TTYY^YWYMYT[Y]]^SB	chr10.fa		5292277	R	36	114					
+HWUSI-EAS610	1	4	28	113	1837	0	1	ACACATACGGGTGTTTACACGTTAGATTGAAGTGTT	`bb_TV\ba_aUb^U`aaYaaS``aa`_`Q^aT_L]	chr10.fa		5292817	R	36	118					
+HWUSI-EAS610	1	4	37	1393	531	0	1	AGATAGGAAAATTGGTTTCCTGGTTATTATTTATTT	\``Z]`WX_`Xb]^\Ka`Ya_a\\b[b_`bab\bab	chr10.fa		5292870	F	36	118					
+HWUSI-EAS610	1	4	79	1634	1794	0	1	GCACAGACTCCGCCTGCAGCCTCAGGGAGATGAGCC	`_a^`^`PX\UXUWZ]QROSVUZZBBBBBBBBBBBB	chr10.fa		5293785	F	26C5GT2	59					
+HWUSI-EAS610	1	4	22	1384	1584	0	1	GAGGATAAGCGTGACTAGTGAGACTTGTTCTTGGGG	[H\a[a_aXW`_``ZaY]OXUZY^_^a__Za`^`a_	chr10.fa		5293922	F	36	118					
+HWUSI-EAS610	1	4	61	752	1273	0	1	AGACAAGAATGCTGTCCCGGGCAGTCTCGAACTCCT	aba\`aa`aaa^`a\G^`a`a^\`^``^`^^^^S]a	chr10.fa		5294148	R	36	118					
+HWUSI-EAS610	1	4	66	1179	779	0	1	AGATGGATCTGCAGCTCACCAATATTGAACACTTTT	ab_Ub_a_aYaa_a_aaa`aab_W_`Ya`[^^_a``	chr10.fa		5294193	F	36	119					
+HWUSI-EAS610	1	4	65	1285	709	0	1	TTAACATCTCCTGTTCATGAAGAACTAAGTTTTCAA	a`^`aaa`__a`a[aaaaa``^^a]aaaa\aa_`_a	chr10.fa		5294363	R	36	119					
+HWUSI-EAS610	1	4	37	41	820	0	1	ATGTTAATGGGTGCATTAGAGCAATTTTAAAAGATT	]ab_a\Mabbb[aaV_a_^Z_bT]`aba_^```a]a	chr10.fa		5294591	R	36	119					
+HWUSI-EAS610	1	4	65	371	13	0	1	AAGTCCAACTTTTCATCAGCTTTCATCTGATTATTG	^Y`\aaa[`baaaaaaaaaa`aaaaa`aaaaa\aaa	chr10.fa		5294752	F	36	119					
+HWUSI-EAS610	1	4	31	1451	373	0	1	GCTTGCCCCCAAGTGTGAGGTCAGATGGGAGCTCAG	_XR\T_\RX`^`^TXZZK_ZNUXXK\KTR^XZTS\^	chr10.fa		5294888	R	36	117					
+HWUSI-EAS610	1	4	50	1355	1405	0	1	AAATCCCCCAATGAGAACATAGCATTCTAAGTCAGC	a`a`Z]\`_^]aa_`_^[_a`]_``_X_`]`X^___	chr10.fa		5294947	R	36	119					
+HWUSI-EAS610	1	4	21	834	1384	0	1	AACAACCAAACAATTTTATTGTTTTTTTGAGACAGG	ababa`XX]U``[_aaa`a^^]aaaa`^S]aa_a\`	chr10.fa		5295299	R	36	119					
+HWUSI-EAS610	1	4	61	1108	1315	0	1	TATTACACCTTAACAAGGTACTACTAAGGGTAATTT	aabaaaa_`a``a__]aaY`_`_^`Z[a__Y^]`aa	chr10.fa		5296802	R	36	119					
+HWUSI-EAS610	1	4	85	396	278	0	1	TAGTACCTTGTTAAGGTGTAATAAACTGCACACAAT	a_a`aa_a^a_aa]aaXa^a_aa_b]]^]^[_^a\`	chr10.fa		5296815	F	36	119					
+HWUSI-EAS610	1	4	65	1744	1358	0	1	GGGGGGGGCAGGGCAAAACATTGAGCAGAACATTGT	T`a_`_XZ`]_]]abaabaab_[]Za_R]Y`_aaa`	chr10.fa		5296846	R	36	119					
+HWUSI-EAS610	1	4	78	362	1018	0	1	ACACACATACAACTGTCTCACTTCATACCAGAAGCA	aaaaba`aaaaa``a_aa_\a`a``a\`a^][Za_Z	chr10.fa		5296883	F	36	119					
+HWUSI-EAS610	1	4	74	376	878	0	1	ATAGAGAAGAGCGAGCCACTGGATGCCGCTGTCATC	a```[a]X^V^a`T^```^^^\\[`\\Z\\YPTTQQ	chr10.fa		5297695	F	36	118					
+HWUSI-EAS610	1	4	90	152	1507	0	1	CACTTTCTCTGTGATAAAACTGACACTGAAACAGAT	aT_`PaaW_aaaaT_]__^``aY[\`_a__a_^a\B	chr10.fa		5298475	F	36	114					
+HWUSI-EAS610	1	4	16	1438	2000	0	1	AGTGACAGAGTTGTGACTTCCCTTTTAGCTGCCAGA	abbbaaab`ba`b][aaba`b[aa^^__^`[a_\]Y	chr10.fa		5298655	F	36	119					
+HWUSI-EAS610	1	4	66	42	1286	0	1	TACTAGTCTCACACAAAGGTTTCTACCCAGCCCTGG	^[bbabaabbabbb_X[bbUa`b__`bbYbbbb`a`	chr10.fa		5299139	R	36	119					
+HWUSI-EAS610	1	4	47	647	1906	0	1	TGAGGTGAAAAATAGCAGTGGGCTGAGGAAGGAGGA	aaZ`a^a^_a_`aaa_`a^aab^`aX_aN\``X_a]	chr10.fa		5299192	F	36	119					
+HWUSI-EAS610	1	4	65	522	304	0	1	AGATCAAGAGTTCAGAATAATTCTCTGCCACTGTAT	`babaaaaaaaaaabaaababaabaaa_```bb`_b	chr10.fa		5300395	F	36	119					
+HWUSI-EAS610	1	4	67	1543	312	0	1	AACTGTGGAACGGAACCTTTAGGAGGCGGAGCCTTG	aaabaVaQa`^YT`]^_aaa^YPU^QY^XW\W\V^B	chr10.fa		5300670	R	36	114					
+HWUSI-EAS610	1	4	17	1312	466	0	1	AGAATACCCAGTAGTATAATTTCCGTTTTATAGATG	abaa_a_]aa[Taa_aaabaa_a``^_``_a_`__a	chr10.fa		5300931	R	36	119					
+HWUSI-EAS610	1	4	20	880	1768	0	1	CGTGCCAGTGACCGTCAAGAACGAGTCTCTCTTTTT	abbbb_`aabb`aa``^__bba__Z_aaa```aaab	chr10.fa		5301086	F	36	119					
+HWUSI-EAS610	1	4	35	304	718	0	1	CTCTCACAGCTCTGGCATGCCAAGGCACAGCCTTCT	ab_\__`T\_^a\Y]ab_bba__`aa]aa[^]\^`]	chr10.fa		5301354	F	36	119					
+HWUSI-EAS610	1	4	99	716	56	0	1	GCCAAGGCACAGCGTTCTTCTCTTCCTCCTGCATTA	^aR___Q]`VS`JGL`_\[QaV`_\N\GZ][BBBBB	chr10.fa		5301372	F	13C22	83					
+HWUSI-EAS610	1	4	20	1477	840	0	1	GGCACAGCCTTCTTCTCTTCCTCCTGCATTAGGGGG	aa^__\P\OTGTG_^Z\Z^_YaQ\^aV\\SGRPPT_	chr10.fa		5301377	F	36	115					
+HWUSI-EAS610	1	4	65	825	94	0	1	TTCTTCCTTGCTGCCTAGGTTCTGGCTCACCCTCTC	ab_a`^^aO\[a`^]]`a`W[YX^]^ZSNUUUXUa\	chr10.fa		5302215	R	36	118					
+HWUSI-EAS610	1	4	99	865	368	0	1	ATAAGCATGTGTAGAGGATGAAACAAAACCTGGCTT	abaaaaa_`^a_`a`aa_`a`_`]__`_ZWZ__^^a	chr10.fa		5302271	R	36	119					
+HWUSI-EAS610	1	4	7	257	1719	0	1	CATGCAGCCAGGGATTTAAGTGGTACTGATGTCTCT	W^___`Ubbbbbb_[W]ZFVS\_WW_W\^^aaba`]	chr10.fa		5302340	F	36	117					
+HWUSI-EAS610	1	4	62	1510	1091	0	1	GAAGCCTTCCCTGCTAGCTAAGTAAGTATGGGAAGC	_]bUbababaa]O^aaabaa`\OaYbPa``[_^\XQ	chr10.fa		5302403	F	36	118					
+HWUSI-EAS610	1	4	70	1769	1870	0	1	GAAGCCTTCCCTGCTAGCTAAGTAAGTATGGGAAGC	aaa__Z`aYZ\Y^\[Z_YY\S[Y\U_TZW`Q[QWYW	chr10.fa		5302403	F	36	118					
+HWUSI-EAS610	1	4	78	1291	706	0	1	GTCACTGGCCACACCCCAAGCACCAGGAGACAGGTG	```a``Z^``a\`Z^`_`_^\aU^^]]\\`\`\ZP^	chr10.fa		5302438	R	36	119					
+HWUSI-EAS610	1	4	9	487	932	0	1	GCTGTCCTGCTAGAGGGTTAGACATTAAAGCCAGTA	a_baX`WU_ZUUa]`RaR`_`]^YV]]UUQNLY`QR	chr10.fa		5302622	R	36	118					
+HWUSI-EAS610	1	4	53	1112	517	0	1	GTATGATCCACTTAGCTGAAGACAACCAAAACCTTT	_W]V_UNWYaY`^^_X[VXZ]\^WWFT\X]ZOMW[]	chr10.fa		5303166	F	36	117					
+HWUSI-EAS610	1	4	89	441	97	0	1	TCTCCCAAAGCCTGCTCTAGTTAGGATGGCTTCCTT	a]a`aaba_aa`^``_aaaa][_`a^P]aR^^_\\\	chr10.fa		5303469	R	36	119					
+HWUSI-EAS610	1	4	40	159	1767	0	1	TCACCTCAGTGAGGTCAATGGGGTCAACATGAAGTT	ab_bbabbbRbZba\b`[aabbbR`]baaaabab_a	chr10.fa		5303901	R	36	119					
+HWUSI-EAS610	1	4	64	725	1229	0	1	GTCTGCTGACAAGAATGTGCTGAAAGCCCTGTCCTG	`aaa^`_aa_`__\^aa_^]`aaa^_X__[EX__^`	chr10.fa		5304002	F	36	117					
+HWUSI-EAS610	1	4	98	353	470	0	1	TTTTACTGCTATTATGAATCATAATGTAAACATCTG	abbbabbb_bbbbbab`b`ababaab`aaaab_aaa	chr10.fa		5304604	F	36	60					
+HWUSI-EAS610	1	4	28	1417	600	0	1	GTTGAGGTTAACGAAGCCAGGAAAGCTCTCTTCCTC	_R`aU`_\_a`ZV[_[_]U]^Z_\RQR[[V[UWZ[X	chr10.fa		5305023	R	36	118					
+HWUSI-EAS610	1	4	71	1291	712	0	1	TCGAGCTGAGGGCACAGTGCTCACCAGCTGTCTGAG	_UVYXX[]\UOTY\YZRV]YVY\PSBBBBBBBBBBB	chr10.fa		5305069	R	36	71					
+HWUSI-EAS610	1	4	42	1590	1893	0	1	GCATGTATCCCAGGACAGCAGGAGACGGAGAGTATC	a\^aaS^_Y]W_aa]U\^\U\\W\WWX]U\UWWSMU	chr10.fa		5305176	F	36	118					
+HWUSI-EAS610	1	4	41	1536	1631	0	1	AGCAGCAGAAGACACATCATGTCAGGATACTCTCCG	`___`^Y][ZWQV^YW\KX`[MS\XU\QW]ZTXXYZ	chr10.fa		5305201	R	36	118					
+HWUSI-EAS610	1	4	70	369	1186	0	1	TTGTCAGTTTCTGACAGATCCAGGACGGATTGATCT	V\`U`baZ^[aV_a\[\`\RI__U^YVPOP[]U^ZB	chr10.fa		5305268	F	20A15	100					
+HWUSI-EAS610	1	4	73	889	1246	0	1	TATCTAAAGTGCTCCCTAAACCTCACAGGCGTAGAA	aX`aa`aa_\__a_[_[`___^_]a^_`[H^^`aYU	chr10.fa		5305497	F	29T6	106					
+HWUSI-EAS610	1	4	80	647	44	0	1	TTCTACACCTGTGAGGTTTAGGGAGCACTTTAGATA	aaaaa_a`aa`^`]aa_aa`^^_^``_W^__Z_Z]_	chr10.fa		5305497	R	36	119					
+HWUSI-EAS610	1	4	34	925	1200	0	1	GACCGCTGGGAGCTCCTGCAGGCCCAGGCAATGAGC	`a`a```\`a]`\^^]^]`][[P\]]^\\\\\^\`X	chr10.fa		5305574	F	36	34					
+HWUSI-EAS610	1	4	26	22	1091	0	1	AGCTCAAGGTACCTACCTGTCTCCGCTTTCCTTCCT	a`_Sb`Q\_W_aaa^aaR]Ua\``aa^_]_aZU[__	chr10.fa		5305770	F	36	119					
+HWUSI-EAS610	1	4	80	455	226	0	1	ATAAACATGTCTACACACATGTACACATGTGCACAC	_]`]aa_V]V__`^`_^\_\[MW`^Z\TRT^X^U^[	chr10.fa		5305918	R	36	118					
+HWUSI-EAS610	1	4	31	1291	1795	0	1	GCTAGAATGTCTACATTGGGTATGTTGGTTAACCAG	a_a`_Y___]^_]S]_`Y__W_^\XUSLRRXYTTYV	chr10.fa		5306087	F	36	118					
+HWUSI-EAS610	1	4	16	1106	1432	0	1	TCACTGGCAGTGCCATCTCCCTGAACAGTCCATTCA	aaaa^aaUWXP]X^]_S^Z_[ZWTUKUVVQWV\^BB	chr10.fa		5306249	F	36	109					
+HWUSI-EAS610	1	4	54	1064	1520	0	1	TTATGAATGGACTGTTCAGGGAGATGGCACTGCCAG	aaaaa`[```__`a_`\X_`^^XZ[UQ][[ZUWP\_	chr10.fa		5306252	R	36	119					
+HWUSI-EAS610	1	4	66	524	1176	0	1	TAGGCCTGCCACTGTGATGTTCTGTGCATGTGCACG	a]Y_b`bbbaaabb`baaa`ba`aaaaaa`\aaaaa	chr10.fa		5306450	R	36	119					
+HWUSI-EAS610	1	4	15	423	1196	0	1	TGGTTAAGAACCAGCTCAGAAATTTCTAGAACTTCC	^bbbabbba_aba_bab_aa__baabaabbb`babb	chr10.fa		5306600	F	36	119					
+HWUSI-EAS610	1	4	15	534	1193	0	1	GTTCAGACCTGCATTCCTTTTATGAAGAAATCAAAT	a`_^aaa``aa`ab`_aaaaaaabaaa_^_a`aWa`	chr10.fa		5306902	R	36	119					
+HWUSI-EAS610	1	4	78	469	225	0	1	GAGTATTATCCAAGGGGATGCTCTCTGAGCCAGCCC	a_aW\``a]_`aZ`_`S\\^U]UW\\^Y\\ZW\U\\	chr10.fa		5307517	F	36	119					
+HWUSI-EAS610	1	4	54	364	454	0	1	CTTGGATGCCATCCTGTGTGGGGAGCAAAAGACACC	aababbabaaZaaaab_a`ba`a_aa^Y]_``_a_a	chr10.fa		5307745	F	36	119					
+HWUSI-EAS610	1	4	83	1552	1996	0	1	CAGTGTGATTCTTCAGATGCCACCACGAAGACAGCA	_baab]abab`ba`bbbbba`a_aa__[\`_Q_a_a	chr10.fa		5307880	R	36	119					
+HWUSI-EAS610	1	4	37	143	574	0	1	GTTTTTGAGGTCCAACTAAGTTGATTAAGTCATGAA	]T`^aaZH]a^b_Y\a`UX_PU`V_a^]`\a]^a\U	chr10.fa		5308185	F	36	118					
+HWUSI-EAS610	1	4	34	453	520	0	1	ATTTGGCTACTTCATGACTTAATCAACTTAGTTGGA	abaaaa___aaaaaa`aa`aYaa`_a^][`a]_a]Z	chr10.fa		5308195	R	36	119					
+HWUSI-EAS610	1	4	13	119	433	0	1	GGAGCCCAGAGCATCAGGACCCAAAGAGCTTCTCAT	ab`abbaaaaabbaa`baaaba`aaa^aa_a``aaa	chr10.fa		5308309	F	36	119					
+HWUSI-EAS610	1	4	43	1781	822	0	1	CAATCACAGCAAAGCTGTAGACCTATCTGTACAGTT	ab_R\_Jaaa^V]U]`SZ_[^_`[PFW_YXZUXWX]	chr10.fa		5308441	R	3C21G10	85					
+HWUSI-EAS610	1	4	88	723	539	0	1	TGTTTGTCACAGGGTTCCTAACTGACCCAGATCTAA	abababaababa`b[aaabbaab`aa_`ab^aaaa^	chr10.fa		5308841	F	36	119					
+HWUSI-EAS610	1	4	23	1048	1788	0	1	GGAGAGAGCTCTGTTGTTAAAGGTAGAACTTGAGTG	]aaaa`VX^_`ab^aa_a`a`Y]Waa]a]aa_^aX`	chr10.fa		5309001	R	36	119					
+HWUSI-EAS610	1	4	36	1159	1215	0	1	TGCAGCTCTGAGTTCACCCAGGCTGACAGCAAAGAG	`]Y_^\`P]_]`U_Y^`]PO]_YYa[ZR_\]\V]XY	chr10.fa		5309179	F	36	118					
+HWUSI-EAS610	1	4	69	1017	45	0	1	AAGAGAGTCATGACCTGCAGGATCGCTTATCCCAGA	aaaY\[_]`__TZ^^`_ZT\\SMW^ZZXS_W\URYB	chr10.fa		5309210	F	36	114					
+HWUSI-EAS610	1	4	96	980	1522	0	1	GTGTGCTCTCTGCTGGAGGACTGGAGAGGCTTGCTG	`Za``````\Y^\a`]Ya`Z^aa`^\RT^\]]]TX`	chr10.fa		5309266	F	36	119					
+HWUSI-EAS610	1	4	39	676	19	0	1	CCCACCCTAAGCCCTACCAACCTGGCACTGCATCAG	_ZQ]ZZV_a_]YROO\\VXZX[QJM\[YT]QX_Y_`	chr10.fa		5309311	R	36	117					
+HWUSI-EAS610	1	4	99	54	741	0	1	TGTTCTTCAAAGGCAGCATTTGAATGAGGTAACTGT	`a`ab_a`ba``a_`ab^`_aaaaaaaaa\aa`]^\	chr10.fa		5309397	F	36	119					
+HWUSI-EAS610	1	4	43	696	1434	0	1	CCGAGCCAACCTGTCAGTTTCTCCTTAGATTGTGTT	a^`[_aaaa[]XU`_ba_^\`]a_^XV`^[_[LXZX	chr10.fa		5309706	R	36	118					
+HWUSI-EAS610	1	4	95	713	1160	0	1	ACTATAAATGTAAGGTAAGGAAATAGTAATCCAAGG	aaaab_VZ`ba_abaY_X`a`a`aab_`a`____aa	chr10.fa		5309868	F	27T8	82					
+HWUSI-EAS610	1	4	36	513	1932	0	1	AGTATGTTCCAAGCTCCAGTGAGGGAGGAATCCACC	`_Q`____`W_\__Z^[S`R[X[^ZQ_[QXUUUSWW	chr10.fa		5310260	R	36	29					
+HWUSI-EAS610	1	4	2	1096	1251	0	1	GGTTTCTATTCCTGCACAAACCATCATGGCCAAGGA	aaU`a`\``aZS[VWaY`Z_UXTVVW^_]ZTVY[^]	chr10.fa		5310362	R	36	11					
+HWUSI-EAS610	1	4	58	1343	438	0	1	AGGTAAACAGATAAAATCATGCTGTGTGAGTTACAA	ab^_aaa^`^```aa`a_aa``a`X`TU[^\_a^`^	chr10.fa		5310960	F	36	119					
+HWUSI-EAS610	1	4	64	1005	418	0	1	ACCATGTAGATCAGGCAAGCCTCAAACTCACAGGGA	a^aaaa`a`aa`aaa```a_aa_``^[`_`^^^^__	chr10.fa		5311191	R	36	57					
+HWUSI-EAS610	1	4	52	743	1514	0	1	TTTCTTTCAAATGCTATCTCAAAGGTCCCCTATACC	aabaabaaaa`a_]aaaaaaaa``^X]^^Xa``__`	chr10.fa		5311938	F	36	119					
+HWUSI-EAS610	1	4	17	1766	394	0	1	CTCTCTCTCTGTGACTGTACAATGTTGTAGCATAGC	aa_aa_``_`[LD\]aa``_a_]\P[\^_RZ`]^WX	chr10.fa		5312841	F	36	116					
+HWUSI-EAS610	1	4	12	757	723	0	1	AAAATATGTAAGGACTACTATCTCCTATTGGTTTCA	aa\abaabWa_a_a_a^Y]aa_aa`a_`aa__aaaa	chr10.fa		5312940	R	36	119					
+HWUSI-EAS610	1	4	14	1340	636	0	1	CGGGATCAAAGATAATCTGTTATACAGAAAAATAAA	\`_^^ab\bb_ba\aaWaa`b\JY`a`^a_aaa]`a	chr10.fa		5313100	R	22G13	104					
+HWUSI-EAS610	1	4	48	365	629	0	1	AGGTCCATGTGATTGGAAACCGGCTCAAACTTCTCC	`aYH_bb\bRT`aX[QUW_]_XV`\FHHT\WSUPaU	chr10.fa		5313524	F	36	115					
+HWUSI-EAS610	1	4	39	1587	1454	0	1	CATCATATCAAGGATCTTGAGAAGTTACTAGACATG	abaaaaaaa`aaa`aabab^aa][[aa_a]T\_a^\	chr10.fa		5313574	F	36	119					
+HWUSI-EAS610	1	4	83	958	649	0	1	CGATGTGATGCCACACACAGTGTGTGAGGGCTTACC	I\W__\_`\]Y_[_Z\b``]Y\``aXRI]\V`^Y^Z	chr10.fa		5313624	R	36	118					
+HWUSI-EAS610	1	4	79	487	791	0	1	GAGTAGACACTCTCCTCAGTGTTTAACACGAAACTC	_]_X^aa`aaX]VWQ`YKZ^b]`X]a^`\aa[a[a[	chr10.fa		5313967	R	36	118					
+HWUSI-EAS610	1	4	11	1669	1802	0	1	GAGTCCAGTGCATTTATGTTCGAAGCAAGTGAGAGC	a[a][`_a[a____`aa`W_^aZ__XX^^U_]aU`U	chr10.fa		5314302	R	36	119					
+HWUSI-EAS610	1	4	1	1230	1309	0	1	ACATCCCAGAGTACCCAGGGACTCAGTTCCCACCTC	_]^aa]Z``_WVa^`]YSX``[a^^\[^^[UYYU_T	chr10.fa		5314615	R	36	119					
+HWUSI-EAS610	1	4	86	553	333	0	1	AGACACAAAGCCTGTCATATCTCACACTTCCCACCC	\bbabaaaaaaaa```aaaba`````aa`a`_`_]`	chr10.fa		5314810	R	36	119					
+HWUSI-EAS610	1	4	45	81	1844	0	1	TTGGGGACTNGAGTTTTGAGCCTGTGAATTCTGTAG	abbbbaab\D^`b`aaabaaabab_abaaabaa`Y`	chr10.fa		5314844	R	9C16G9	71					
+HWUSI-EAS610	1	4	29	1660	913	0	1	GGGGTTACTACCCAGAAGTCCTTGGGTGTTATGACT	aU`UZ`a[`aXX__XS]_^^^`_^\^N_\\\_WTWV	chr10.fa		5315229	R	36	118					
+HWUSI-EAS610	1	4	63	298	732	0	1	CTCTNTGTGCTCTGGTGAGGCGGTTTCCCCCCCCGG	a``[DYaY```]\^^X\[`BBBBBBBBBBBBBBBBB	chr10.fa		5315300	R	4G23A2G1G2	29					
+HWUSI-EAS610	1	4	66	1785	1705	0	1	CATGTTTAGAATCTCTAAGTGCACAGAGTGTCTTAT	[^`^^^V_`b^`\X^]Q_\U\ZaY_X^VR`XD[`^a	chr10.fa		5315785	F	36	116					
+HWUSI-EAS610	1	4	31	1422	1313	0	1	ATGTTTAGAATCTCTAAGTGCACAGAGTGTCTTATA	abbaabb_^Zaaaaa`aaXa^a`_a_aSa_]_aaaa	chr10.fa		5315786	F	36	119					
+HWUSI-EAS610	1	4	86	303	1154	0	1	AGGCTGTGCCCACTGTGGGTGCACACTACAATCATA	a``b[_S_aaaaa`Z\a\a\Y_a^X`Z``a__``^_	chr10.fa		5315858	F	36	119					
+HWUSI-EAS610	1	4	49	219	367	0	1	TGTTTGCAATGAACAGGGGGTAAAGAAAGAAGAATG	^aaaa_aZ_`_abaYa_X^_FO]^_VR^aaaaaa_a	chr10.fa		5316070	R	36	117					
+HWUSI-EAS610	1	4	44	669	638	0	1	GCTCTTTGGGCTGCTGACAGAGGGTCCAGGCTGTGA	_^`]\\]\]Y\^^\XSXY\`ZX[ZSZWX]ZT]]BBB	chr10.fa		5316128	R	36	106					
+HWUSI-EAS610	1	4	87	490	100	0	1	TTCTAGATCCCCTAAGAGGATGATAAAAATTGCCCA	a`]]aaRNX\U\^^^]S[\Y[`]^V\VO\VYWRSSW	chr10.fa		5316193	F	36	118					
+HWUSI-EAS610	1	4	43	911	828	0	1	AGATTAGAGGCTTCCCTAACTCATGGGCAATTTTTA	\`bb^^```aa_ba__`U`abZZ_^_baaabbbbaa	chr10.fa		5316216	R	36	119					
+HWUSI-EAS610	1	4	42	118	294	0	1	CATGGCAGATTTTATCATCCTCTTCCCTTCTCGATT	aa`abb__T_b_aab`_aaaa`_aaaaa_`abaU]a	chr10.fa		5316466	F	36	119					
+HWUSI-EAS610	1	4	71	1683	386	0	1	TGTGGGTTCTGTGAGGGGTGAAATAATTCACTGATC	Y\ZRWFWWZZV_X]Z]HX_]aaa`aaa``a^_YaWB	chr10.fa		5316522	R	36	112					
+HWUSI-EAS610	1	4	60	194	1826	0	1	AATTTGGTGTTCTTCATTTAAAATTATGAAGCACTC	_]babbb_baabbab^bbb_bb^bbabbbaabbbab	chr10.fa		5316670	F	36	119					
+HWUSI-EAS610	1	4	43	1635	912	0	1	AAAAAAAAGGAAAGAAAGAAAAATCAGAAAGAAAAG	abb`^`aaaa`aaU_`a^_a`aaa``a``_a__aa^	chr10.fa		5316974	R	36	60					
+HWUSI-EAS610	1	4	47	217	535	0	1	ATCTGAATGGAGATGAGGAAATGCATAGCTGTAAAC	a^a^aZX^__[_MYa\]][^WY`^Z`YV``]Y^WSZ	chr10.fa		5317128	F	36	118					
+HWUSI-EAS610	1	4	2	1474	187	0	1	GAGTAAGGATGATGCATGAAATAGCCAGTCCTGCAT	a`_Ua__\\R]_UU\^aN``^\^X]^_OU_\ZVX_V	chr10.fa		5317201	R	36	118					
+HWUSI-EAS610	1	4	76	1033	548	0	1	TGGCTATTTCATGCATCATCCTTACTCAGCTGAAGT	]_Z]`Z`aa\[Z]]_]_[OX]^\]YT[`XDU^UZ`R	chr10.fa		5317210	F	36	116					
+HWUSI-EAS610	1	4	53	1618	808	0	1	GGTGGATGGTGAAGAGGGCATACGATCACCCACAGA	^X\`^_ZXaTZ[YR]`XUWa_a]VYLT`^^W`^TXT	chr10.fa		5317469	R	36	118					
+HWUSI-EAS610	1	4	44	147	1356	0	1	TGGATCTGTGGCTTTCTCAAAGGACTGCTGTGGGAT	abbaaabbaa_babbba`]babaaabab`b^abbX\	chr10.fa		5317605	R	36	119					
+HWUSI-EAS610	1	4	34	1466	423	0	1	TGTTAGGCACATGAAAGCAACTGATGCCTTAAGAGA	aaaaa`a`aa_`[^aaaa`a___a__`_a^^_]]\]	chr10.fa		5317791	R	36	119					
+HWUSI-EAS610	1	4	9	866	1463	0	1	GGGAGGGAATCGATTGCAAGGAGGCTTTACCTGGGT	abaaaaaRP`Zb^Y\aa^baaU_a^^S\aZ\^`^\B	chr10.fa		5317954	F	36	114					
+HWUSI-EAS610	1	4	41	1739	1220	0	1	AACACCTTGGCAAACGAGCTCCTCAACTCCAGGGAA	ab_b`a_`a__``aY_`__[^[Z^^_SVSMWRUUO^	chr10.fa		5318004	F	36	118					
+HWUSI-EAS610	1	4	21	1426	1059	0	1	CAACTCCAGGGAACCTTGGATCAGGGGCACTCAGCC	___``__`a_aa_Z^`_a`^_UX^a\^[a^^X`^[`	chr10.fa		5318027	F	36	119					
+HWUSI-EAS610	1	4	92	643	454	0	1	AGCTGACCTTGTGTTTGATCTTGCACTGCTCCAACA	X_^aa_YZ_b^Z_[`\aaa__^`W``^_T\Y^a^[Y	chr10.fa		5318133	F	36	119					
+HWUSI-EAS610	1	4	87	1499	921	0	1	ACCCCGTCACCAAAAGTCTTCCATACAGATATGCAC	aab__]__`_^aaba\Qaaa^[a_`]a_`_]`_`aW	chr10.fa		5318676	F	36	119					
+HWUSI-EAS610	1	4	17	838	1802	0	1	GCAAAAGAGAAGCCTGTTGGTGCCCCACCCTACAGT	a_X_a^_NZ^WY\\U^W]Y\MU]^`]]WW^WSX\XW	chr10.fa		5319195	R	36	118					
+HWUSI-EAS610	1	4	97	400	88	0	1	GTTAACATCCCTGTGATATGGCTGGCTAGATCCCTC	abbaa^__^ZR]bUaZY^^]`\^_[VQRNRNRUBBB	chr10.fa		5319457	F	36	105					
+HWUSI-EAS610	1	4	31	1202	178	0	1	GTGAGACCTGTGTTCATATTTCTAATCTCTTGTTCT	aXRWSZT\^aV]P`T`a`a\YS^a^TF^_^UYT[[^	chr10.fa		5319505	R	36	117					
+HWUSI-EAS610	1	4	18	516	1219	0	1	TAAGATGTACACATGTAATTATCTCATTATATCTTC	\_^`YYbRSIb_b^]VZQYVa^abb_baa^^baaaa	chr10.fa		5319826	F	36	118					
+HWUSI-EAS610	1	4	61	1298	29	0	1	GAAGTAATGGGCTGAGGAGGCAGGGACAAAGAGAAC	a__b\a`aX[a_]W\_XU_`_^]Y_^T^_^[^^U]R	chr10.fa		5320527	R	36	119					
+HWUSI-EAS610	1	4	78	1784	784	0	1	TTAAATGTGCCATGTCCTCCAAAGGATTCTGTCACA	abaaa`ZY]Z_a_[]a_a_aaa_RSZ_]\^W\^__`	chr10.fa		5320632	F	36	119					
+HWUSI-EAS610	1	4	34	1534	797	0	1	GTTGATGTGAAAATAGTCCCTGGCAAACAGCACTGA	\TZ\YbbPTXR^_`]][ZZ\KQZV_`_]YVW__YL\	chr10.fa		5320946	R	36	118					
+HWUSI-EAS610	1	4	38	1350	790	0	1	ATCTGACATCAACATTTGGTCCCACAACCACACATA	aaaaaaaaaaab`aaa]X`^aa`a``a_`a_^[``a	chr10.fa		5321828	F	36	119					
+HWUSI-EAS610	1	4	76	362	1043	0	1	TTGTGGGCTTCAGGGAGAAGTGAGGTTATAGTTTAA	aabaaabaaaaaaa^VZQI]]a^a`^a\__aX`a]Z	chr10.fa		5322527	F	36	118					
+HWUSI-EAS610	1	4	61	388	510	0	1	AGGGAGAAAAATCACCACCTTAAACTATAACCTCAC	aaaa_b_^_]`a_a_a`aa`a^Z`aa_a_a^^`aa]	chr10.fa		5322546	R	36	119					
+HWUSI-EAS610	1	4	96	1586	268	0	1	TAAGGTGGTGATTTTTCTCCCTCCGTTATAGTTCAA	aa^_aU[a\^a[ab``b`ab]baXS^]aa_^R`_aa	chr10.fa		5322560	F	36	119					
+HWUSI-EAS610	1	4	17	956	1164	0	1	TTTAACACTGGCCTCTCTCCTACCCTCCTCTTACAG	`baa^[__]SPWa`VXWa]`aW_H^_UYa\`Q[UUR	chr10.fa		5322637	F	36	118					
+HWUSI-EAS610	1	4	58	353	563	0	1	ATGTTTGCAGCTTCCCAGTTGGCTGTTAATTTCTGA	`bbbabbaabbbbbbaZb`_bbaaa^b]\`ba^aa]	chr10.fa		5322792	R	36	119					
+HWUSI-EAS610	1	4	74	508	1491	0	1	TTTGCTCTAAGTTGGTATGCTAACTCACTTCTTTTT	aa`baabb[_^V`b\Q_`a`]`a`_[^aaW^aaa`a	chr10.fa		5323105	R	36	119					
+HWUSI-EAS610	1	4	54	707	1604	0	1	AGAGCAAACTGTTTCCACATTCAGGACTTCAGCCAC	a`aa`\aa`_b_`_a_`[\^a`]V[YYZ^^`_]`]_	chr10.fa		5323133	F	36	119					
+HWUSI-EAS610	1	4	87	247	852	0	1	GCACAAAGAACAGCAATGAAGTCTGTCTCTGAAACA	a``ababa``aaa`^]`b^_a_a`a_`aa`a[]]`_	chr10.fa		5323357	R	36	119					
+HWUSI-EAS610	1	4	95	555	956	0	1	TACAAATTCCATCTACACTGGCACCCACATTTATCC	aaa\a`^a_]W][]_`^]`^_^]X`ZZPOYXXS]]_	chr10.fa		5323513	F	36	118					
+HWUSI-EAS610	1	4	32	1299	616	0	1	GTGCCAGGAGCAGATGCTGGTGAGATGCAAGATGAA	aa^a_aUa]_`aa__`_`a`\`_[[Z`VU[XXX_U_	chr10.fa		5323673	F	36	119					
+HWUSI-EAS610	1	4	17	1329	996	0	1	GCGAAAGGATGATAACTCGAAACTAAACATCCAATC	_bbba^ab`^_`abaaabb]aa]ba`]`_aaaaaa_	chr10.fa		5324022	R	36	119					
+HWUSI-EAS610	1	4	86	1192	1952	0	1	GTTTCGAGTTATCATCCTTTCGCAGAACTGTTCCTT	aY[SWZP]]__`_a]___`^\Z^\W]]X^\UUNS]Y	chr10.fa		5324035	F	36	118					
+HWUSI-EAS610	1	4	20	1288	1299	0	1	TGCCAAATTGGGTTGTGTTTTGCATGGCCCTTTATG	`a`_a`Y^aa`_Yaa_aab__a^_``a]^_a__`__	chr10.fa		5324173	F	36	119					
+HWUSI-EAS610	1	4	7	956	855	0	1	AAGAAAAAAGAAAACCAAAATGTGGGTGCTTCCGTC	`bbaaaaaab_bab_baaa^b`Waaa]a_`b__a_^	chr10.fa		5324961	F	36	58					
+HWUSI-EAS610	1	4	97	1269	659	0	1	CAGAGCCTTACAAAGGTGGATGCTCACAGCCAACCA	ababbabbba`bb`aa]bbbaaabaabb`aaab^ab	chr10.fa		5325198	F	36	70					
+HWUSI-EAS610	1	4	56	41	1856	0	1	GTCCTCAATAGAGGAGTTAAAGGACTGACGGAGTTG	aRb^]_[ZYZaaZ]X\YQNM]TZ\XHXTBBBBBBBB	chr10.fa		5325250	F	28A7	80					
+HWUSI-EAS610	1	4	25	664	166	0	1	TGTTCTTCTTCTGGGGTTGCAATCCCATTCAACTCC	`aJ``a[\\R^S]bW`H][\]`aYY`G`a]_XZY]_	chr10.fa		5325279	R	23T12	10					
+HWUSI-EAS610	1	4	31	354	1254	0	1	GAAGAAGAACAACAATATCAACCAACCAGTCCCCCC	`aaa\``Za__a`ZZ___aa``_a___a`Ua_]^__	chr10.fa		5325304	F	36	25					
+HWUSI-EAS610	1	4	79	1312	1724	0	1	AGAGCCATGCGTGCTCCTTGGTTGATGGCTTAGTCC	aaba__`aaaa_ba`a`bbaaaabaabX`ba^aX[a	chr10.fa		5325351	R	36	37					
+HWUSI-EAS610	1	4	84	653	1836	0	1	AAATGACACAGTACCAATCCCATGTTTTGTGCCTCC	aa\_aaa`aaa_b``a]aa`a`_a`a```\aa`aa`	chr10.fa		5325799	R	36	119					
+HWUSI-EAS610	1	4	7	655	1540	0	1	CAGCTTTCCTATGGTGCTGCTCGATCAACCCAAAAG	a`UH[\`a`\PV^[Uaa^[VTUNKWLR\UXZ[XNU[	chr10.fa		5325946	F	36	117					
+HWUSI-EAS610	1	4	67	1080	1682	0	1	GTTCAGGGGGAAACTTGTTCTATGCCTTCAAATCAA	`Z`a`^XV``]aUV^a_[a`aWaWBBBBBBBBBBBB	chr10.fa		5326583	R	24A11	64					
+HWUSI-EAS610	1	4	62	1726	993	0	1	TAGAACAGAGCCAAAAGGGCAATATTAGGAGTTTCT	a^\_a^b__U\X^]^^_^Z[X__][_[LTVWVY_Z_	chr10.fa		5326870	R	36	118					
+HWUSI-EAS610	1	4	60	690	560	0	1	AAAGGTAGCTAGAGGTGTGTATGCACACAGGAACCT	^`Z]]H]aYa[^V^`Va^aa_WaZ`a_P_a`TZBBB	chr10.fa		5326991	F	36	105					
+HWUSI-EAS610	1	4	44	728	1167	0	1	GGTACCCAACCTACCCCACAGCAGAAACTACAGGAG	a`UaWZ^`___a`\a]^_`X^Y^`_]`^^\S^^`^`	chr10.fa		5327765	R	36	119					
+HWUSI-EAS610	1	4	13	762	1614	0	1	ACACAAACTCCCCATTCCCATCCTATCCCCCTTCCC	a^YYRDLN`U\\SS_`\ZSWRHNWU_WU\WZW\^W^	chr10.fa		5328010	F	36	115					
+HWUSI-EAS610	1	4	8	639	1572	0	1	CCTCCATGTGTTCTCTTTGGTGGTTTAGTTCCTGGG	aaaa\^`ba_Y\`a`_aaba_aa_aa``Ua``\_aa	chr10.fa		5328212	F	36	29					
+HWUSI-EAS610	1	4	44	93	888	0	1	TAGGGGAAGAAGTGAAGTTAGTGGAACCCCATAGGA	aVbaa`_b`baaaa\I\_[bb`aa[_ba_a`^XaaV	chr10.fa		5328295	R	36	118					
+HWUSI-EAS610	1	4	83	1089	1540	0	1	TGAAGTAGAAGTGTGGCCTCTTGTTCACTTCAGTCC	ab]]WWbb`S`Ya_aa`^]]`^^P[[[]_a`YQXU^	chr10.fa		5328685	F	36	119					
+HWUSI-EAS610	1	4	96	447	690	0	1	TGATAACTGGCACAGTGTAAGAAACATTTTTTTTTA	aabaa`abb`b`[_a`aY_[a_a\a_aa_aa_aaaa	chr10.fa		5328869	R	36	119					
+HWUSI-EAS610	1	4	10	1502	1414	0	1	TAAGCATTAAAAACTGGACTTCACATTGCTTGTAGA	aa``[[aa`^`_a__`a\_a______\U^^^_Z^a^	chr10.fa		5329024	F	36	119					
+HWUSI-EAS610	1	4	73	818	1270	0	1	TGGGCAGAGGCTCATCTGTCACTGGCATGACAGTGC	aaa`a\\]a]aa`aa^aa^^a]`_``]`_\^[`[]B	chr10.fa		5329139	R	36	115					
+HWUSI-EAS610	1	4	8	150	1658	0	1	GCCCAGTGCCCTCCTCATCTTCAGTGCTTAGGGTAG	abbbb_\babaabaaaZ]aaaaaa]ab`aaaaaT`a	chr10.fa		5329170	F	36	119					
+HWUSI-EAS610	1	4	49	940	580	0	1	CATGCCCTTCCTTACCTACCATATACTTGCGACATC	abbbaa`abaababaabbaaabaaa`bbaaaa]`aZ	chr10.fa		5329397	R	36	119					
+HWUSI-EAS610	1	4	66	1639	166	0	1	ATTACTTATCCTATAGTTGTCCTTTCTCCTTTTTGT	\Ya_ba^[Z_a\^aRST]QXa_VGV`^V]TRTVTBB	chr10.fa		5329495	R	23G12	98					
+HWUSI-EAS610	1	4	78	1663	1675	0	1	CAGTAACACACACACACACGCACAGACACACACATA	ab`Hab^b`ab_ab_bbba`X^T`_`]__a`[W_[a	chr10.fa		5329605	F	36	15					
+HWUSI-EAS610	1	4	24	1128	1302	0	1	TTATCGTGTTAAATTTCAGCAAGTCACATAGAANTA	abaa_a]aaaaaaaaa``_\a`a__[^^`_`^WDR_	chr10.fa		5329904	F	33G2	110					
+HWUSI-EAS610	1	4	42	130	1534	0	1	TGCTGTATACTTCTATGTGACTTGCTGAAATTTAAC	aababWb_ab`aba_ab`a`a``abaa````^aa_a	chr10.fa		5329911	R	36	119					
+HWUSI-EAS610	1	4	33	1107	1883	0	1	TTTGCTGTATACTTCTATGTGACTTGCTGAAATTTA	aaaa`aa_aaa_ba_`aa`_a`^``WZ__]_]a``a	chr10.fa		5329913	R	36	119					
+HWUSI-EAS610	1	4	80	828	930	0	1	GAACAAGGGAGTGAGATGATGTGGGAAAGCTGACCA	a``_``aaaN`Wa\`^_aYaaWa`_VW\___^\^\Y	chr10.fa		5329949	F	36	119					
+HWUSI-EAS610	1	4	76	701	1393	0	1	GGGAGTGAGATGATGTGGGAAAGCTGACCAGGACCA	a\\Y\X_aXX_^[]aU\\R^aYa_a`\\\X\ZU\V\	chr10.fa		5329955	F	36	119					
+HWUSI-EAS610	1	4	10	1464	775	0	1	TAGGTGACGGTGACAGTGGAAATGAAACCAAAGAAC	aaa[X`a`a_Wabba]_bbaa`aZaaabaa``aaba	chr10.fa		5330045	R	36	119					
+HWUSI-EAS610	1	4	60	932	1672	0	1	ATATGTTGTGATAACTTTGGCTGCCATACCTCCTGC	_]Z[[[Z]W_]]^UW^]]ZUU^ZU\W]^WYYTTVP\	chr10.fa		5330606	F	16C19	85					
+HWUSI-EAS610	1	4	77	476	2010	0	1	TTTCTCCTGCAGAGTTGCAAAGTATCCATCATGAGT	aaaa_ba`abbaa``a^a`[\`Xb_a`a_aa_[``X	chr10.fa		5330703	F	36	119					
+HWUSI-EAS610	1	4	2	631	849	0	1	GCAGAGTTGCAAAGTATCCATCATGAGTCTACAGAC	aaaaaaa`aba`_a^a_a__a__aa[_^]^^W__`_	chr10.fa		5330711	F	36	119					
+HWUSI-EAS610	1	4	92	737	1125	0	1	CAGGTCAAGCAAAGTGAGAAATGGGGAACACTTAAT	a`bb`_b[aa\bab`b_bTbbaaaabaabab^^b_]	chr10.fa		5330876	F	36	119					
+HWUSI-EAS610	1	4	83	607	223	0	1	AATTTCCTGAACAAATAAGGGTGGTGGGCAAAATAG	aaaaaaaa`Za___```aa`a]aaZ_a`[__``_aa	chr10.fa		5330945	F	34CT	43					
+HWUSI-EAS610	1	4	19	902	969	0	1	TTGGGTCTGACCTGGAGTCCATCCTCAAGGCTCTAA	aa``a_`^[___`_`_`\`_aa\_]_^ZSW[_\[Z^	chr10.fa		5331265	R	36	119					
+HWUSI-EAS610	1	4	29	1033	315	0	1	GTTGGCAGCTTCACTCAGGAATCCAGCAATCCTATC	G^babbbabbbbbbbbbb_bbbaab`bbbbbbaabb	chr10.fa		5331321	R	C35	107					
+HWUSI-EAS610	1	4	52	1283	265	0	1	GTTCAGGCTTACAGAATAATACAAGGGATGCCAAGT	a`a`a]`^```^`a_aa__a`_`__^_]^_^Z___]	chr10.fa		5331441	F	36	119					
+HWUSI-EAS610	1	4	98	1436	1415	0	1	TTGATAAACGGTTGAACAGAAACACTGGACACTTGG	aa`WZTSSLFTLT_UGV`]QVRTXT\YUHH]SHSN_	chr10.fa		5331471	R	9A5C20	93					
+HWUSI-EAS610	1	4	80	98	1463	0	1	TTTGCAATCTTACATCTGGCCACAATGGCAAGTGGT	abaab]abbbaba__b_aaba`aaaababbaaVaaW	chr10.fa		5331527	F	36	119					
+HWUSI-EAS610	1	4	77	637	536	0	1	TATGAGTTTGTCTAGCAACAGTTTTCTAGAGTAGAT	a\TTV`RX]YSL[PSN_NH]_RNZVHTM[W]L]V[\	chr10.fa		5331725	F	36	115					
+HWUSI-EAS610	1	4	23	35	1985	0	1	GCTGTGTAGTCCAGCCTAGCTTTGTACGCTTGTCTT	aa[a]aWa_\`]a`aZ]^__Y_a`G]]_\__Z[Z__	chr10.fa		5332085	F	24A11	107					
+HWUSI-EAS610	1	4	39	1642	197	0	1	AACTAAACCCAGGTCCTTTGCAGGAACAGGAATCTC	ababbba`aaa`UNaab_aXaaa]aaa`VM\_[```	chr10.fa		5332559	F	36	36					
+HWUSI-EAS610	1	4	20	1514	1383	0	1	CAATAATTAGCATTGCTATCATCTCCCATAGTGACT	abbbbbbba`aaabaababaab]aaa_^aaa_a`_a	chr10.fa		5333396	F	36	119					
+HWUSI-EAS610	1	4	1	14	1382	0	1	AGGCAGGGAGAAGAGGGGAGGAGCCGGCGATGCAGA	aaaaaaaa`aX_a^aa^a\_`P````_\_VR^YP\_	chr10.fa		5333536	R	36	119					
+HWUSI-EAS610	1	4	36	24	313	0	1	GCTTACTGCAGTATGACTTAGCATCAGGAAAACAAC	abababbaa^a`aabaa`Y]`_\`aabaaaaaaaa`	chr10.fa		5333665	R	36	119					
+HWUSI-EAS610	1	4	64	174	335	0	1	GTGTATATGGTATGTATATATGTGTATGTATGGTGT	a`a`aa_aba^_ab`aa[a_ab`a^_Va\[aaaUa\	chr10.fa		5334491	F	36	58					
+HWUSI-EAS610	1	4	78	221	1247	0	1	GTGTGCATGTGTGTATTGAATGGTGTGTGTGTAAAT	a]]Qbbaab_`_b_``__FT``]WaYZ_a[ZX\a__	chr10.fa		5334562	F	36	117					
+HWUSI-EAS610	1	4	11	778	1212	0	1	GTCTTGTGTAATCAATGCACATAAATCAATCTCATT	a_`abb]a_aaaa^_aaaa`aaa```[_`_`_`aa`	chr10.fa		5334785	R	36	119					
+HWUSI-EAS610	1	4	89	683	2020	0	1	TGGTGGTTTGAGTAGGTATGGTCCCCATCACTCATG	aaaYbWQ_`a_[LZ^^U_Z]\TZ`a_PZZN[^XPX\	chr10.fa		5334829	F	36	118					
+HWUSI-EAS610	1	4	26	1317	913	0	1	GTTTGAGTAGGTATGGTCCCCATCACTCATGTGTTT	`_a[^VaRWY_X^aT\NU^_^__WZTWWWTUWZYZ_	chr10.fa		5334834	F	36	118					
+HWUSI-EAS610	1	4	71	196	28	0	1	ATCACTCATGTGTTTCAATGCTTGCTCCATGAGAAT	^X]^_W__[^P]_XZ]X]\Y_TQ_^Y`XN]aYa[Y]	chr10.fa		5334855	F	36	118					
+HWUSI-EAS610	1	4	7	220	210	0	1	AAACATCTCCTGTGTAAGAACAAAGATGTTTTCCAT	aaa[\aa^`Yaa]`Sa_]Ta^_``a^Xa[^]_]^`_	chr10.fa		5335456	R	36	119					
+HWUSI-EAS610	1	4	75	943	995	0	1	AGGTGAATCTCTGTGAGTTTCAGGCCACCCTGGACT	_a]Y`^^_bbabbabababbaa`ba]a`]^]`]`^`	chr10.fa		5335632	F	36	47					
+HWUSI-EAS610	1	4	31	661	778	0	1	ACAAAACAAAACAAAACGAAACAACTCAGAATCCTA	a`a^`^]_`]a^aa]_\a^__^__]^_\_^^^__^^	chr10.fa		5335724	F	36	62					
+HWUSI-EAS610	1	4	47	77	935	0	1	AGAAGTTCCAGGGTTTTGCCCAGGTGACATCTCGTC	Y_LT`[aab_b`b_ababbab_aaXaba_baab_]a	chr10.fa		5335895	R	36	119					
+HWUSI-EAS610	1	4	53	292	151	0	1	CACCTGGGCAAAACCCTGGAACTTCTAACCACCCTC	aaaa_a`]a_Y_`]```a`YZ\a``a_]`a`^]S]_	chr10.fa		5335905	F	36	119					
+HWUSI-EAS610	1	4	36	826	1603	0	1	ANCCCCTGTCTTTGATGGCTTGATTTCACCTTCTAG	[D[`a^bb`aaaa_Y][_a_aa[aaa_a_`aa_a`a	chr10.fa		5335962	R	1T34	110					
+HWUSI-EAS610	1	4	67	1782	1747	0	1	GTGGCCCAGAAGTCCTACCAAAGCCTTTCCTGGTGC	ab`]``]`aa_VYaabaa_abaa`Y_``^Z]^`Ya]	chr10.fa		5336048	F	36	119					
+HWUSI-EAS610	1	4	55	33	523	0	1	GAGAAGGACCAGAACCCAAGGCTAAAGCGGGTTGAA	XQ_`bb`_a_a^``a`a]]_^ba^_]`^aa`T]`UV	chr10.fa		5336112	R	36	119					
+HWUSI-EAS610	1	4	27	1065	1089	0	1	AGAGAAGGACCAGAACCCAAGGCTAAAGCGGGTTGA	ab`b]a`]]^`]\_a`X^^`^a^aa^^`_`^`U`]^	chr10.fa		5336113	R	36	119					
+HWUSI-EAS610	1	4	12	752	1319	0	1	AAAGCCTGCCTTGGCAAAGATTCCGAGAAAGTGCCA	Ub]abba]]a`^a^aJ^`aaaaaa`aaa`a`\a^^a	chr10.fa		5336254	F	15C20	104					
+HWUSI-EAS610	1	4	94	9	1534	0	1	GGCTTCAGGGCTATAGGTGGCACTTTCTCGGAATCT	aba]^a`abaaaXZFZaW`\_S``^^a_aYUXZU\B	chr10.fa		5336271	R	36	113					
+HWUSI-EAS610	1	4	24	1259	736	0	1	CACTACAGAGGAGGAGGCCAGGGAGCAGAAAGGCTA	`]_b`aa`^aaaaaa``a_a```\`a`a[P^S[``[	chr10.fa		5336342	R	36	119					
+HWUSI-EAS610	1	4	70	197	1034	0	1	AACCTGTGATTACAAGCTTTTATAGTCCCAGCAATA	Y]`aab`bb``baaaaa^a`aaa^a]aa``aaa]]]	chr10.fa		5336852	F	36	119					
+HWUSI-EAS610	1	4	43	519	736	0	1	TGCTGTCAGCAGCAGGTCTGCAGGGGCTGGGTCACC	``_`aX_`_aaa`````_^``_``___^``]_XVY\	chr10.fa		5337249	R	36	119					
+HWUSI-EAS610	1	4	29	1707	163	0	1	CTTCCTTCCATCAGCCTGTGGTCTGTGGCCCTAGGT	abbb`aaaa`bbbbbbba`_T`ba[`WWR]bb_^\_	chr10.fa		5337302	F	36	119					
+HWUSI-EAS610	1	4	34	1193	1809	0	1	ATGACAGGTTGTATAGCAGAAGCCTAAGAGCACAGG	abbb]`ba[_Z]_ZF]`^a[_UHXP]]R`_YVX]PX	chr10.fa		5337518	F	36	116					
+HWUSI-EAS610	1	4	15	478	1566	0	1	GTTGTATAGCAGAAGCCTAAGAGCACAGGGTGTATT	`__\V\`a``UW_``_`\[YZVaaaW^JOXS_YW]`	chr10.fa		5337525	F	36	118					
+HWUSI-EAS610	1	4	46	981	1284	0	1	CACTGATGCTATCGCCCCCACTTTCATTCTTAAGGA	aaab_abaa]bYa]X`W^^a]aaa`baa`aa\NTT_	chr10.fa		5337673	F	36	119					
+HWUSI-EAS610	1	4	46	101	218	0	1	ACATGCTGCCTTTGCCTTCATCCTCTTTCTTCGTAG	a``baaaaab`_Q`a`YU`a[`aaaaa`aa`ba[N]	chr10.fa		5337719	F	36	119					
+HWUSI-EAS610	1	4	34	1246	523	0	1	ATGCTGCCTTTGCCTTCATCCTCTTTCTTCGTAGTC	aaa^ba__aa^_[`__XU[`_`^a_`_`^]_]a]]_	chr10.fa		5337721	F	36	119					
+HWUSI-EAS610	1	4	51	801	1819	0	1	GTCCAATGGCTTAGCCATGGCTGGATCCTGAGCCAG	^aaaZQYaaaa]`Z[a`_aa^```U\YS`]Y`[X\a	chr10.fa		5337793	F	36	119					
+HWUSI-EAS610	1	4	45	402	228	0	1	TGACCAAATAGTCACCAAGTAGTTTCTGGTCTGGTG	aba``baba[__bbaa`ab^`b]aa`_aaZ`aaaZa	chr10.fa		5337965	R	36	119					
+HWUSI-EAS610	1	4	46	1095	1479	0	1	TGAATCCAAAAAGTAGTGACACCCTAAATATGCATG	abbbbaaba`_Z`Ya`abaaaa_aaaaaba_aaa_T	chr10.fa		5338048	F	36	119					
+HWUSI-EAS610	1	4	1	73	1399	0	1	ACAGTCCATGTATACTCTTTCAGTAGCCCCTAGGGA	^VY^a\\__^]S`a^`^aZT_^JZ`UaaPR]]`^[[	chr10.fa		5338270	F	36	118					
+HWUSI-EAS610	1	4	12	159	1886	0	1	TTGAGCTCCCTAGGGGCTACTGAAAGAGTATACATG	aaa\]babaaa_\`Z`a_aa``ORVaaaVa_a``Za	chr10.fa		5338276	R	36	119					
+HWUSI-EAS610	1	4	46	933	584	0	1	CTCTTTCAGTAGCCCCTAGGGAGCTCAAAGTGTGGG	ababb]`b`\``ba\TZ^^ab\`a]`__WbSaYTF^	chr10.fa		5338284	F	34T1	108					
+HWUSI-EAS610	1	4	77	782	1676	0	1	TGAGACAGATCATCTAATAGAACTATCTACATGTTG	a_Z_a_aa_`aaa_``^aaa_a^`aa^aa^```\_a	chr10.fa		5338726	R	36	119					
+HWUSI-EAS610	1	4	89	794	1877	0	1	GAGGAGGGATAAGAACAAGGGATGATGTCCATTCAA	`]aa`aaaQ]_`a``a[]aaaP\`_a`__`^_[a\X	chr10.fa		5338764	R	36	119					
+HWUSI-EAS610	1	4	32	61	27	0	1	ACCTCACACACAGTGTCACAAATAGTGAAAACCATG	[abaa`babbb^a^a_b`ab_`aaaXa``aaaa`W^	chr10.fa		5338867	F	36	119					
+HWUSI-EAS610	1	4	90	667	1944	0	1	AGAAAGTACCTTGGGAATTGGTCCTGAGCCAGTGTG	a_\`_`]b_`a_aa_``__`_Z`_^[Ra___`Y`V_	chr10.fa		5338999	F	36	119					
+HWUSI-EAS610	1	4	86	596	233	0	1	TGAGCCAGTGTGTGAGCAGAATGAGTCCTGGACCCA	a``a_a`]\a]``a^a_a`_`^^^`\^[[^Y[\`^\	chr10.fa		5339023	F	36	119					
+HWUSI-EAS610	1	4	40	267	646	0	1	CACTTAAGCCCTGAAAGCTGAGAATCTAAGCAGTGT	^X`WYQW\VaaZ^_\\ba`\X^FRS_a]WWXT\QWB	chr10.fa		5339345	R	36	113					
+HWUSI-EAS610	1	4	46	980	491	0	1	GGGGCAGGGCCAAGTAGCCCCCTTTATAGTATCACT	`_bbabaaababba_aaaa`aaaaa`aaa_`a``aa	chr10.fa		5340284	F	36	119					
+HWUSI-EAS610	1	4	8	1043	725	0	1	GGGCAGGGCCAAGTAGCCCCCTTTATAGTATCACTC	]]bab[Xbbabbbab]a`_abbababaa_a`^a_ab	chr10.fa		5340285	F	36	119					
+HWUSI-EAS610	1	4	10	653	809	0	1	AAAACATGCATCCATACATTCAGCTAACTATAATAA	ab]aWaU[\``_X]`]]]_bHWWU]`_W_`aaWa`Z	chr10.fa		5340573	F	36	118					
+HWUSI-EAS610	1	4	59	909	1038	0	1	CAGATGACTTATTATAGTTAGCTGAATGTATGGATG	`\ba_aa[`aabaaaab]a`b_ab_a_a^aW__^^^	chr10.fa		5340581	R	36	119					
+HWUSI-EAS610	1	4	20	688	1264	0	1	CTCAGCCTTAGTTTCAGTCTCCGTAATAGGCAAGCT	aaaaa[`]UUaM\]\V\^__`a]T`__^_Z^\__[_	chr10.fa		5340701	R	36	118					
+HWUSI-EAS610	1	4	96	956	579	0	1	TGAACATTGAATATGCTGAGAAGATGGTTTACAGGG	`a^\^V`ab_]aa`aZ\a`a_^`^__a`a__^a_`a	chr10.fa		5340949	F	36	119					
+HWUSI-EAS610	1	4	70	844	241	0	1	TTTTTCGGGGANAGGCACAGATGCCCCATTGTGTTG	aaaa_Z__[XXDOT[_`\[[___W\WXPX^_N[W_^	chr10.fa		5341125	R	11G24	110					
+HWUSI-EAS610	1	4	2	580	512	0	1	ATGTGTTTGCTCCATTTGCAAGAGAGTAAATTTTCA	a_bbbabbabaaba`bbbbabaU\aaPb[aaaaa``	chr10.fa		5341616	F	36	119					
+HWUSI-EAS610	1	4	77	740	1511	0	1	TGTGTGCAGTGTAAGCTGGATCAACCTCCAAAGACC	abUY^aa``_bababa^`bb`aJZ]`aaaa``XPV]	chr10.fa		5341668	F	36	118					
+HWUSI-EAS610	1	4	38	627	1928	0	1	TTTACCCTTAACTGAAGTGCCAATTTTGAGCAGCTG	a]aa`_R^_VaIUQP`YN`^\P[YZ_[YT[WTO]ZX	chr10.fa		5342550	R	36	117					
+HWUSI-EAS610	1	4	85	865	2027	0	1	CAAGCTGTTGAGAAGTTGCTCAGACTAGACTGTGCT	aa]_aaa\aa]aa_`^`a_```a]`^][\X_]]]]_	chr10.fa		5343818	R	36	119					
+HWUSI-EAS610	1	4	68	1269	227	0	1	CAAGATCTTGCCCCCATGCCTTTCCCCAAGTTCCTG	ab``bbbaa`Z`[]a`abaaaaba^_]a`_^^\aab	chr10.fa		5343868	F	36	119					
+HWUSI-EAS610	1	4	80	157	2009	0	1	TGCTCCAGGAACTTGGGGAAAGGCATGGGGGCAAGA	_abaaba`_Mb`bba_bbbbba_a_`bbUZZYJ`b]	chr10.fa		5343873	R	36	118					
+HWUSI-EAS610	1	4	44	1495	939	0	1	AGGTATCTGATGTCACCTCTTCCAATCAGGCTCATA	^Y]G[_X^U[\X\^\WJV`XOLRNTRTWXKSQT\[B	chr10.fa		5343922	F	36	112					
+HWUSI-EAS610	1	4	60	562	91	0	1	ATGCACAGTGAGGCTGCTCTGGGATCCATGGGCTGA	`aaaba^a`aa`a``a`_]^\aa[^[^^^_\^Y\^[	chr10.fa		5343976	R	36	119					
+HWUSI-EAS610	1	4	79	1065	1493	0	1	TTGTCACCAGCTTGCAGGTTCATTGTGACTGCCCTT	aaa_`b_\Za_^[_[^_]Qa\_aa`^__\\_XV^\_	chr10.fa		5344173	F	36	119					
+HWUSI-EAS610	1	4	24	323	1040	0	1	ATTGTGACTGCCCTTGATCAATCTACATGGTAACAA	X`bbabbaabbbbb`^``bbbbbbaabaab_bbaaX	chr10.fa		5344194	F	36	119					
+HWUSI-EAS610	1	4	46	690	731	0	1	GGAGCTCTCAGATCGTGTTGGGGAAGCCCTCTGCTT	aaaaaa]a`aaPaabZaaba_aa_\b]^`_`]Y\^^	chr10.fa		5345111	F	36	119					
+HWUSI-EAS610	1	4	12	846	1980	0	1	TTGGAGTTGCTCATCCTCCCTCCTCCTAAGAATTTC	\^_M_abbaUab`US__YV]^RU_V_UV_Y[ZaW^V	chr10.fa		5345412	R	36	118					
+HWUSI-EAS610	1	4	44	1023	1238	0	1	TTTGGAGTTGCTCATCCTCCCTCCTCCTAAGAATTT	abb]b`aaa`]^^_`T]_]`a\RZ_[][_a^\^_a`	chr10.fa		5345413	R	36	119					
+HWUSI-EAS610	1	4	85	675	1824	0	1	GACTACAGCTATGTATATCATGAACAGGCAGGACTA	abbbbbbababbaabbbbbaaabbabbaababa`aa	chr10.fa		5346496	F	36	119					
+HWUSI-EAS610	1	4	34	317	930	0	1	GGTGGTAACAAGCCAGCCCAGGTTTGATCAGTGTCA	abWbb`^bb_a_aa_aaa`WPaX\`aaaa^aSa_a^	chr10.fa		5346562	F	36	119					
+HWUSI-EAS610	1	4	9	821	1028	0	1	CTCATGATTAGGGCCATGCTAACAACACAAGAATCC	`ba`ab`_aa`[aa``\]`aaa]a`ab`a`a\aa`a	chr10.fa		5346863	F	36	119					
+HWUSI-EAS610	1	4	27	1222	1176	0	1	ATTGGCTGCAGGGAGTCAGTCTGGACAAAGAGAGTA	a_b___aa[^`aa^a\\__P_`^_N[`[[ZP`Z]PR	chr10.fa		5346909	F	36	118					
+HWUSI-EAS610	1	4	35	1212	851	0	1	GTAAACTCATAGAAACCGTATCAACAACTCAAAACA	aabaa_a`aa``aa]``]]aa`a`]^_]_^]_`_]`	chr10.fa		5347155	F	36	119					
+HWUSI-EAS610	1	4	4	773	631	0	1	GGATCACATATTTGTCCACTATCTAGCATTTGGTAC	aa^```[a]]^`^`XPY]^_[^^_``RX]YY`]P_Y	chr10.fa		5347500	F	36	119					
+HWUSI-EAS610	1	4	54	953	123	0	1	TGTATACCATTCTTCTTGAACCCCAGCTTAACAAGG	Y^]W^`\Q^a^Q`PW_\Z_aT][KORTTSYRW^ZVQ	chr10.fa		5347650	R	36	118					
+HWUSI-EAS610	1	4	92	1640	1745	0	1	AAGAAGAATGGTATACATGAAGCAGAACCATGGCTG	a\b\_bb`^bb[bbbI`_a]a__^Z__XXXRZ]]]S	chr10.fa		5347669	F	36	118					
+HWUSI-EAS610	1	4	49	1241	432	0	1	GGGTGTCCTTCATAACTGAAGCCATGCCATAGCAGC	aa]J_V^_\a_^```Taaab^R`aaX]M[XPT_``Q	chr10.fa		5347828	R	36	118					
+HWUSI-EAS610	1	4	30	1250	674	0	1	CTCTAACCTATCACCTAACGTGCTCCTTAGTCTCAG	abababaaaaaaa_aaaa`a_a_aaa`aa`_`a_`a	chr10.fa		5348042	R	36	119					
+HWUSI-EAS610	1	4	92	1345	1267	0	1	TCTCTCACGGCTTCAGGCTCATCTGTTATGGTTCTG	aaabaaa_`a_`a]Y`aaa_aa_a``a^a``W`]`a	chr10.fa		5348210	R	36	119					
+HWUSI-EAS610	1	4	32	45	856	0	1	TCAATCAAAGGGTATTGCCAAGCATAAGCAATCTCT	a_WY\aa^[bbbP`_aaaa``aaaaa_abaa`a`a`	chr10.fa		5348241	R	36	119					
+HWUSI-EAS610	1	4	21	763	1939	0	1	AGAACCTGCATGAAGCATTAGATAAGCANCAGGGAG	ab`]b`^baabb^_X_a`]ZX_]a_[`SDRa^\\_`	chr10.fa		5348339	R	28T7	110					
+HWUSI-EAS610	1	4	10	702	1078	0	1	GTCTCTGGAAGAGAAGGACCATATCCACCGAGTCCT	a\``_\`a\]__\a__]\\]__]_ZQ\[Z_\\N^\W	chr10.fa		5348645	R	21C8T5	50					
+HWUSI-EAS610	1	4	63	1243	1719	0	1	ATAAAGGATATGGTCTTGGAGACAGAAACATTCCGG	abba```a`aaab]`abba`a]\]a```__``_^`a	chr10.fa		5348740	F	36	119					
+HWUSI-EAS610	1	4	8	267	95	0	1	CGAACTGTTCATTCAATGCTGACCACAAACTCGAGA	ababaab`aaaaaaaaabaa_aa`aaa_a^```_a`	chr10.fa		5349026	F	36	119					
+HWUSI-EAS610	1	4	70	972	2045	0	1	GGCCAGAGAGATGTGCTACTTACAAAGAGAACATAA	]\[_```]_^_a_U[]a]U]_\W]`][\YZ`Z][Y[	chr10.fa		5349087	F	2A33	87					
+HWUSI-EAS610	1	4	85	1169	337	0	1	CGTTACCAGATATGGGAGTTGGCATACTGAGTGCAG	Q_[_Yb``RK\_Q_`a[_U\W\]`aa^a]\```_a`	chr10.fa		5349145	R	36	118					
+HWUSI-EAS610	1	4	68	780	1818	0	1	GCCATGAGGAGCACTGAGGACTATGGGAAGGAATGC	ababbbbb_Xabb`abbbab`bbbbbb_aba`abba	chr10.fa		5349545	F	36	119					
+HWUSI-EAS610	1	4	90	1042	1165	0	1	GTTGAGAGACGAGCTGAGACCATCATGCTCCCTCCC	^ZZ_R^Zb^]`\ZS]`^a`YSYXNVM^JQSPTYOQR	chr10.fa		5349599	R	36	117					
+HWUSI-EAS610	1	4	86	124	410	0	1	CAAGTGGAGTTGAGAGACGAGCTGAGACCATCATGC	]X]aUb`a`S^`]a]a`a`[X_U]XYNU`[\`]Y]]	chr10.fa		5349607	R	36	118					
+HWUSI-EAS610	1	4	46	531	1101	0	1	CGCACTGCTGTGTTATCCTAACCCTGTGGTAATCCA	^`bbbVX]__\`\b`a`abba_ab```b^`aa^`_b	chr10.fa		5349707	R	36	119					
+HWUSI-EAS610	1	4	7	1040	738	0	1	TACCACAGGGTTAGGATAACACAGCAGTGCGGTTTC	abaaa^aaaa\aabaaaab`a_aa_aa^a`aaW``_	chr10.fa		5349712	F	36	119					
+HWUSI-EAS610	1	4	95	1435	1136	0	1	GCATTAAATATCCACAGAAAAAGGCATGTTCAAGGT	`abab`baaaY`_``a`_b`]a`\_```^__`aaa_	chr10.fa		5350562	F	36	119					
+HWUSI-EAS610	1	4	33	1790	453	0	1	ACATGAGCAGAAGAGTGGATATTCTGGGTAAAAACA	aX`VHXNRYNOVVOTTOJSQBBBBBBBBBBBBBBBB	chr10.fa		5350912	R	32G3	45					
+HWUSI-EAS610	1	4	66	598	1292	0	1	CTTTTGCAAGTTACCACCAGGTTAATCTAGTGAATT	aaaabb^[RYWa^TM]XUTXSQ[]\aaa_`TX_TXV	chr10.fa		5351010	F	36	118					
+HWUSI-EAS610	1	4	8	266	1820	0	1	AGCTTCCTGGAAAAACTGGGTTTCAAATGTTACATG	aa^JP`a\`a`_``\aaaa_X_V`a_`a`Y`aa^Xa	chr10.fa		5351150	R	36	118					
+HWUSI-EAS610	1	4	49	28	15	0	1	TGGAAGCACAAGATTCAGGCTACAAAGCCTATACCA	abb_`baaaZ]ba`aa^_aa]`a]^Za`aW_ZV`_B	chr10.fa		5351438	R	36	115					
+HWUSI-EAS610	1	4	25	1488	1398	0	1	TTGACAAACAGCACATTTTTAAGAGTTGCTTTAAAA	aaaa`^aa_a`^a``aaaaaa____]^__`_`^_``	chr10.fa		5351660	F	36	119					
+HWUSI-EAS610	1	4	61	280	1864	0	1	ACCAAACCAAACCACTACCCCGCTCCCCCCCCCCAA	[_]`[a^a`_`a^^\Z^^__^QUN^ZXW^\^^VFQ^	chr10.fa		5352252	R	33A2	108					
+HWUSI-EAS610	1	4	73	845	56	0	1	AGAATGACAGGGAAACCACAAGGACACCCTCAAGTG	ab__bb[`]bab_[`_V^`a_]aI[`P]XXZRUa\a	chr10.fa		5353094	F	36	118					
+HWUSI-EAS610	1	4	54	1271	894	0	1	TGAAGTACACCCATCCATGGATATACCCAGGAGGAA	aaaa_U^Z`]^_^^[^__]^[[_^^WZT[Z\U[]V[	chr10.fa		5353667	F	36	119					
+HWUSI-EAS610	1	4	29	481	1637	0	1	GAGGAGCCTCCTCAGTGTGGTCTATGTCAGAGGAGG	aaaaaaaaaa_^```Ua\aaWa`a`a\]`a`a^YP[	chr10.fa		5353728	R	17A18	86					
+HWUSI-EAS610	1	4	9	1725	882	0	1	AGATGCTTCTGCCATGAGTCTTTGGCATTTGAATAT	aaa`[``aa]`aa`]``a_aa_a_^_]a``_``a_`	chr10.fa		5354248	F	36	119					
+HWUSI-EAS610	1	4	22	1131	2039	0	1	CATTTGAATATGTGGTAAACATTTGGTGGTCCTGTT	`b``b_a_ba`ba_aab\baVbab`LXab_^I`a_b	chr10.fa		5354273	F	36	118					
+HWUSI-EAS610	1	4	14	960	1055	0	1	GTCTCTACCATGAACCCTAACCATCTGGAAGCAAAC	a^]_^^a__^]]Z_N]X`_`W]]]]^ZQZVPV__U]	chr10.fa		5354470	F	30A5	98					
+HWUSI-EAS610	1	4	97	1090	781	0	1	TATAAACACAAACACACACACACATGCATGAGCATA	aabaaa`a_`aa_a_a_a`a_a]__`_^]___^aa`	chr10.fa		5354800	F	36	119					
+HWUSI-EAS610	1	4	35	1332	167	0	1	ATCCATATCTGGTTCTGATTTATCATGTCCTCTATT	aba`aaa`_`TV\_aaa\aaa``__\\Y^Z^^a_aa	chr10.fa		5355795	F	36	119					
+HWUSI-EAS610	1	4	93	284	840	0	1	GCACTGGCGACTCATGCCCAGCTGGAATGACAAGCC	XV^X```aV^a\\RRH[^_`^\S\_GVMZX\[XXX`	chr10.fa		5356174	F	36	117					
+HWUSI-EAS610	1	4	40	1421	1230	0	1	CATGCCCAGCTGGAATGACAAGCCATGCGACAAACT	`aaaaa`Ya^`[b_``a_aaa_`_`_`_`_^__[]a	chr10.fa		5356186	F	27T8	83					
+HWUSI-EAS610	1	4	10	780	355	0	1	ACAACACCCGGAGGAATCTCCACTCTAAGGCATTCT	`_XaUVaUXSPSa`^abU[S`a^bRHKbaZYH]J^a	chr10.fa		5356300	F	25CC9	39					
+HWUSI-EAS610	1	4	85	1341	1131	0	1	CACCTGAGAGTGGATCTTCCTCTGGGTGTTTTGGGA	aZZ`Y_WXa]W`RT\_a_Y^\W\a]Z_`[a``Y]TY	chr10.fa		5356389	R	36	32					
+HWUSI-EAS610	1	4	3	744	688	0	1	CTGCCCAGGATCTTCTAGCTTTTATATTCTCTGGTG	aa``a_`aaa`_^`^__a__``_`aZaaVa^a_`Wa	chr10.fa		5356550	R	36	12					
+HWUSI-EAS610	1	4	93	1020	1101	0	1	ATTTTGTGTAAATTTGGTTTTGTGATGGAGTATCTT	aabba`_b`a_`ababbXbaba]b_aa\N`__`_aa	chr10.fa		5356671	R	36	33					
+HWUSI-EAS610	1	4	10	1215	1845	0	1	GGGGGGAATTGAGTCCATTAATGTTAAGATATATCA	abaa_a\aaaa`U[___a^_[_aZ]^^`Y^__^^^_	chr10.fa		5356886	R	36	39					
+HWUSI-EAS610	1	4	56	1310	241	0	1	CAAACAGTAAATGCATGTCACTGACAAAGACAGACA	abbaaaa`aaaa^aaaaaaaaa_`a```_```^__a	chr10.fa		5356975	F	36	119					
+HWUSI-EAS610	1	4	88	1359	498	0	1	TTTTGATAATTTTTTGTTGAAAATTTATTCGATATT	a\a[PXZaT_ZU\[IW^_`TOPRV_^T^UP`YQT[T	chr10.fa		5357086	R	14G21	104					
+HWUSI-EAS610	1	4	56	302	290	0	1	TATGATGTGTTTTCATTTTCATTAAGTTCTAAAAAG	aabaaab]`aaaaaaaaaaaaaa``a_aaa```a^a	chr10.fa		5357660	R	36	22					
+HWUSI-EAS610	1	4	96	283	1683	0	1	GGGGCAGGGGGGCAGGGAGGAAAGAAGGAAGGAAGA	a\``SMZaTGW_`Y```T``Z`\YXV\\XQ^\]Q^B	chr10.fa		5358157	F	9A26	102					
+HWUSI-EAS610	1	4	54	1446	305	0	1	ACAAGTCGAAAAGTATCTTTTCCATGGAGTTCCTGG	aaa_W]Z]_a_a^]aa^abaa_`]`W\_`]^\][RY	chr10.fa		5358236	F	36	119					
+HWUSI-EAS610	1	4	7	76	1667	0	1	TCAAACCCAGCGTGCTTCCTGTCCCCTTCACTATCA	aa_`babbbab^`ab_`aa]b]aaaa]aaa`aa_`a	chr10.fa		5358612	F	36	119					
+HWUSI-EAS610	1	4	70	795	1118	0	1	ATTTCCCTAAGTTACATGGCCCACTCAAGGTCATTA	abbbbbababb`a_aabaaaa````aa`X^R[Waba	chr10.fa		5358738	R	36	119					
+HWUSI-EAS610	1	4	89	1090	1511	0	1	ACAGCAAATATTCCCAAACCCCAAATGCTAAGGTTT	a`bbab``aabaaa^_Q_`a`aa\a`a_aaa]a^aa	chr10.fa		5358910	R	36	119					
+HWUSI-EAS610	1	4	5	844	181	0	1	AGCACTGTGATGTTCTCTGCTTGCCCTTTCGGCTTC	aaaa\`aWa_`a\_]__`a[`U_VY\W\\W\UV\\X	chr10.fa		5359548	R	36	119					
+HWUSI-EAS610	1	4	7	998	1118	0	1	TTATGCTAGTGTATATCATGTGACATGCATTGGCAA	abb___Za`S_S\a]a]a\_`a`[a_^UU`Y]_^\B	chr10.fa		5359818	F	36	114					
+HWUSI-EAS610	1	4	49	1730	1391	0	1	TCAACCCAACTCCATCAGCTCCATCAACTCCATCAG	^`aaa`aaa`___a`__a`_]``___`\_^_[[`^[	chr10.fa		5360099	R	36	119					
+HWUSI-EAS610	1	4	26	466	836	0	1	ATCTTGTCTGTCTGTTATAAAAAGTAAAATCCGGGG	aaa````aa`W`aa___a__aaaZUZaaa__`a``_	chr10.fa		5360198	R	36	119					
+HWUSI-EAS610	1	4	79	1266	993	0	1	AGCGGGAGTTATATGTGGTTGTGATATGGGTGCTAC	`_^aaaZ`^aZ\``X[``^_]]aS[[[XUVTUT]Z[	chr10.fa		5360508	R	36	119					
+HWUSI-EAS610	1	4	47	1392	1616	0	1	TGGAAATGTCTTCTAAGCATATGTCAGAAAAGACCA	aaa``_`_UQ[^_a`\a_`aa_`_^__^^_^_^^U_	chr10.fa		5360798	F	36	119					
+HWUSI-EAS610	1	4	26	43	835	0	1	GTCCAGTGTGAAGAAGACAATAAGCAACATCCAAGT	a^bTJ\M[XPPW__]^W]^[YY`ZQ_N]_`\_XVR]	chr10.fa		5360912	F	36	117					
+HWUSI-EAS610	1	4	94	746	929	0	1	CTTGATCAGTTTTCTCCCTAAAACTCTGATGTGGAT	abZa\Vaa_]aaTZ_Y\][`Sa`H`[[W^Z`^ZQT[	chr10.fa		5361206	R	36	118					
+HWUSI-EAS610	1	4	90	466	383	0	1	CTATCCAACACTATGAACCTGTGTTGCTGTCAAAGC	aaaaaabaaaa`aaa`a`a`a_a^__aaa^_a_a_^	chr10.fa		5361355	R	36	119					
+HWUSI-EAS610	1	4	60	1215	298	0	1	TGTCCTATACATGTTTTGTCAACTCAACACAGCCCA	aa``abbbaaaba`aaaaaaab_aa`a_a]aa]^`a	chr10.fa		5361459	F	36	119					
+HWUSI-EAS610	1	4	98	1458	1075	0	1	CTTTTCTCTCAGACAACTCTGGGCTGTGTTGAGTTG	`abbabbaaa`^]`aaab_baa_a_`_`]_`_VVa`	chr10.fa		5361478	R	36	119					
+HWUSI-EAS610	1	4	5	214	1466	0	1	AGAATCTACATAGATCACTCCCTACCTGGAAAACAC	aaaUab`_baaaaaaaQ__aaa_`aaaaa__aaa``	chr10.fa		5361867	F	36	119					
+HWUSI-EAS610	1	4	18	648	253	0	1	AGAAGTCATTCTATTGCAAGGTTCATAGGGATTTTA	_`[U]Xaa`aaa`a[`_`_aaHa_W_aaaaQa_aa`	chr10.fa		5362039	R	36	118					
+HWUSI-EAS610	1	4	66	666	958	0	1	CTTCCTTCTCTTTTTTCTCCTCCCTCATTTCATCTT	]baZX\`_]W_\_b`Y[aI\b__Sabb_b`\`bbb^	chr10.fa		5362984	R	36	118					
+HWUSI-EAS610	1	4	5	650	1872	0	1	AGTGTCTCAAGGCTACCTGAGATTGGCAGACAAAGT	ab_a`bbbaaaababbbab[aaa`_aaaa__a]Sa^	chr10.fa		5363507	R	36	119					
+HWUSI-EAS610	1	4	93	1179	1890	0	1	GGTGCTGTGAAATGTTACTGCTCACTTCGGAAGATG	a]X\bbbaa\aa]`[H_aaYaaa_`Z`_aa_Yb`]_	chr10.fa		5363933	F	36	118					
+HWUSI-EAS610	1	4	49	1290	378	0	1	GAAGGCTTTGTTGTTAAAATGCACCACTGATACAAG	a__YYL`_WNQTW_``a_[Z[YW^__UWZ^XZV]PR	chr10.fa		5364488	F	36	118					
+HWUSI-EAS610	1	4	31	1594	457	0	1	GTGTGGCAAGTAAAGACTATTCCCAGATATCTTCTG	_R[YT_\`aXR][a`TNQ_aaYU[[JZXSYPZ_[]U	chr10.fa		5364562	R	36	118					
+HWUSI-EAS610	1	4	18	85	608	0	1	GTCACATGAACGTTTGATCTTAGCCATTCTGACTGG	a^baaaab_baa`a`a^^a`aa`aa[`^a`a\^`aa	chr10.fa		5366376	F	36	29					
+HWUSI-EAS610	1	4	90	1014	1834	0	1	TTGTCTTGTTGACAGTGTCTTTTACCTTACAAAAGC	aa`^aaaa^`a_\_`Wa_^a`aa_]]`_a^`_a_`^	chr10.fa		5366934	R	36	31					
+HWUSI-EAS610	1	4	100	541	1959	0	1	AGGTTAAGAATAATTGAGAAAGACCAGAAGTTAACA	Z`aT_``aa`b^aVYYY_YW^a`b``^`W`_a^b`a	chr10.fa		5367535	R	36	119					
+HWUSI-EAS610	1	4	36	343	1930	0	1	AGTGGTTCAGTTGGTGAGGTACTTTAGAATTTGAAT	_aaba[ab\b`abaWaabb[Zabbaaaaabbb`bba	chr10.fa		5367723	R	36	119					
+HWUSI-EAS610	1	4	99	429	362	0	1	AAGGTATGTGCCACTATGCTTAACTTCTATGAGTCT	\^T_F]VZPVaaYU]ZTTV[]ZZNXXaa`HM^]OX`	chr10.fa		5368489	F	36	116					
+HWUSI-EAS610	1	4	91	456	1219	0	1	TAACTCAGTAATTCATACTGCCCTTCATTCCGGCAG	\`Z`Vba_OIOa^`\`_b[aaZ`]]WYFV`^^aQWa	chr10.fa		5369107	F	33T2	95					
+HWUSI-EAS610	1	4	10	953	493	0	1	TGGCCCTTCCTACCGGAATGAAGGGCAGTATGAATT	ab`b_abaa_aaIa]_`a``]]`ba[]`P\aa`^a_	chr10.fa		5369116	R	36	118					
+HWUSI-EAS610	1	4	52	1477	2013	0	1	GTCTGTCTGCAGGTAACTAAGATGTAGACTTCTCTT	]JabRXa`aOYR^MT_Za^_\\W]]^^^^`^RRNU`	chr10.fa		5369271	F	36	117					
+HWUSI-EAS610	1	4	18	1250	1504	0	1	GGAAGCCATCAGCTCCCTACTCATTCCAGCAACTTC	`]Xaa_``^]X`Z`W^ZZX\_[[Q]P]WP_VURUYX	chr10.fa		5369802	F	36	118					
+HWUSI-EAS610	1	4	41	1013	1608	0	1	CGGTCATTGATAACAGTGTGATATGGTGTTGGTGGA	abb`[^bbbZ_abaab^b_b`a`aaaPbaba`]baU	chr10.fa		5369896	F	36	119					
+HWUSI-EAS610	1	4	37	1438	823	0	1	CACTTACTGATCTTCCAAAGGTCCTGAGTTCAATTC	`__baba`]]X`baZaZa]Y]T`Ta^YaXaYYaa\a	chr10.fa		5370093	F	36	7					
+HWUSI-EAS610	1	4	5	279	139	0	1	GAAAATCTCTACCAATTAATCTGGCCAGTCACCTTT	aa^a^[`a`aa^a`_``^`]`_```]S[Z__^]^\]	chr10.fa		5370313	F	36	119					
+HWUSI-EAS610	1	4	6	1105	1794	0	1	TATCTTTGGCCTTCAATACAGTCTTAGGGCCTGGGA	a__[^\`__XUa]^^Z``]__XY]]Y^YYZY]^_]^	chr10.fa		5370349	F	35C	84					
+HWUSI-EAS610	1	4	73	1093	2000	0	1	GAAAAGGCTAGCCTTGTTATACTATTAGAAGATCTT	abaa`\[`_aa__`[[``aaa]`__^]R_]T]_\`a	chr10.fa		5370396	R	36	119					
+HWUSI-EAS610	1	4	69	1070	170	0	1	CACTTATTGGTACCGAGTGTCTGTCAACTCATTTTC	ab`aaa`_]_Ra`_[_`Ua`_`_YQV\XR^Z\__aR	chr10.fa		5370586	F	36	119					
+HWUSI-EAS610	1	4	2	1561	237	0	1	AANACAGAGAGTTCTGGCTTTTAATATGACATGTTA	aVDYZXP\R^UZ]]YVTUX]__^\_]^V[]X\VU\_	chr10.fa		5370969	R	2C33	110					
+HWUSI-EAS610	1	4	30	1598	385	0	1	TAAAAGCCAGAACTCTCTGTGTTATTCTCTGAAGGC	abbbbaa`b]aa_a_aa___Z\aaaaa``aX_^T_`	chr10.fa		5370982	F	36	119					
+HWUSI-EAS610	1	4	44	223	752	0	1	CGGAAGACCGGAAGACCTGCACTGAGTCTGAGTAGC	abbb_bababbaaaaba`bbaa]a\a_aab_a^aab	chr10.fa		5371144	F	36	119					
+HWUSI-EAS610	1	4	24	390	652	0	1	TCTCATTGTTGTGACAAACCCAAAAAAAGTGAAGGT	aaab]_baaab]a`aaa`ab`aabaa`a`_``aaaR	chr10.fa		5371336	R	36	119					
+HWUSI-EAS610	1	4	28	1670	1012	0	1	CTCTGAGACCTTTGACAGAATGCACAGTTTCTGAGC	^_U[a^OO\`^^VQWX_XQ_^O_bWYX_]a``XU_X	chr10.fa		5371411	F	36	118					
+HWUSI-EAS610	1	4	55	626	1532	0	1	AGAAGAAATAATAGTAACTATTATTATAGAATAAAT	_ab`bbaaba_bbbabbbbbbbbbbbbbbbbbbabb	chr10.fa		5371558	R	36	119					
+HWUSI-EAS610	1	4	18	169	1067	0	1	ATTATTTCTTCTGCTAAGAGGGATTTTTTTAAAATA	[_a_abb`abbaab\R_`a`aaT`a^aaaaY``a``	chr10.fa		5371582	F	36	119					
+HWUSI-EAS610	1	4	56	1665	945	0	1	GGGACCAACAGCGAACCACTTGGCAACTGTGAAGTG	]ZX`bbbba\U]Z`b^baaa_PXXbbaa_RZ^a]]a	chr10.fa		5372004	F	36	119					
+HWUSI-EAS610	1	4	50	1784	1948	0	1	TGTGTGGCCAGTATCCTTTCCACAGAGTCTGTTTAT	abbbaba__aa`aa_]aaaX[`_a`]YV_]a[^`Z`	chr10.fa		5372060	R	36	119					
+HWUSI-EAS610	1	4	40	1573	1874	0	1	AAGTCAACAGAGAACACTGTCTGACGTTGCGACATT	ab__^aa`abaaY_Ya__`_X^\U^_U_]V^RUWZ^	chr10.fa		5372120	F	36	119					
+HWUSI-EAS610	1	4	59	1378	331	0	1	CAAGGCCTGCTCTTGTCAGAAACCTTCAATGGCAGA	`ab`baba_baaab[bbbaabb_babaaaaU`aaa_	chr10.fa		5372174	F	36	119					
+HWUSI-EAS610	1	4	50	72	1223	0	1	AAATCTCTAACTGTAGGACCTTGGTGCTCATTGAGG	ab__bbbbabbb`]]b`_baa`aa`abaaaaaa_aa	chr10.fa		5372620	R	36	119					
+HWUSI-EAS610	1	4	52	264	1980	0	1	AAGTAATCACAGGTGTCAAGTTTCAACAGCATTAAG	Y^bZYbbbbbbbb^a_aaaa]aab]aaa``aaaa``	chr10.fa		5372787	F	36	119					
+HWUSI-EAS610	1	4	17	781	694	0	1	GGTGTCAAGTTTCAACAGCATTAAGACCTTCCAGGA	a^M_Y`_\a^____]]^`_`^]`W]]Z]^]XX_`^_	chr10.fa		5372798	F	36	119					
+HWUSI-EAS610	1	4	55	587	729	0	1	GGTGTATACTCAGAGCTTCAATACATGAATTTCCTG	aa_b`aa_`a``__a`aa`a^^__aaa`_a`_^`aa	chr10.fa		5373168	F	36	119					
+HWUSI-EAS610	1	4	42	24	451	0	1	CTTAGCTTTATGCCTCTTCCAAAACCACTCCAAGGC	a_aY`aaaa`a_aaaa_aaa`_W_abba^aaa[`^b	chr10.fa		5373240	R	36	119					
+HWUSI-EAS610	1	4	12	328	1581	0	1	AAGGAGCAAACACTGAGCAGTGAGCAGTGACTGTCA	^_baaabbaabbbaabba`b_aaabba\``aaa\ab	chr10.fa		5373285	F	36	119					
+HWUSI-EAS610	1	4	34	1302	1330	0	1	ACTCAAGGCTAATAGTAACAGGGACTGTTGTAGCTA	aaaaaaaaaa^X`^aaa_ab`aa^_`_P]a^`_[``	chr10.fa		5373394	R	36	119					
+HWUSI-EAS610	1	4	23	172	1697	0	1	ACAAGGACAGCTTTCATTGCCTGAGGGTACCCCTGC	``UXaa_babbaaabb``_aa_U_`^ZGa`aaa`aS	chr10.fa		5373520	F	36	118					
+HWUSI-EAS610	1	4	26	340	1787	0	1	GCTAGCAAGATGAAGCTTTTCCAACCCATCCCCCAG	abbbabX`bb]bb`baaaaabb]\bbbbabbaaa_]	chr10.fa		5373639	F	36	119					
+HWUSI-EAS610	1	4	54	1367	209	0	1	ATTGCTGGGGGATGGGTTGGAAAAGCTTCATCTTGC	ab_O]`Va[][`a__`_aaa_aa`a_]a\a]a\_[[	chr10.fa		5373643	R	36	119					
+HWUSI-EAS610	1	4	88	1470	645	0	1	AAGATGAAGCTTTTCCAACCCATCCCCCAGCAATGT	\bZ`abaa]a_a[aabba]a_aaRaaaXS_a_]aS`	chr10.fa		5373645	F	36	119					
+HWUSI-EAS610	1	4	20	288	687	0	1	AGTGTGTGTGTCTCCCTTCCTTCCTTCCTTCCTTCC	Zba_bb`baa`Z`X_NZTKV_RHRaRS_XX]NYBBB	chr10.fa		5373902	R	T35	28					
+HWUSI-EAS610	1	4	86	1303	878	0	1	AACCGGCTCTTCAAACGCTAAATCATGTGCTACTAA	aa\]`aa_`a^Z]`\]a__a_`]_`__W\]Y^^__`	chr10.fa		5374056	F	36	119					
+HWUSI-EAS610	1	4	94	473	864	0	1	GGAAGTAGGTGTGTCTGAATGATCTTGAAGAAGAAC	aba[bZab`Za_baaab_]_b`a`aabaab_a`_aa	chr10.fa		5374141	F	36	119					
+HWUSI-EAS610	1	4	49	657	818	0	1	GAGGTCCCCCTGGACAGGAGAAAGAATGTGGCCAGG	aaaa\`a^``a[[a```a\`[^``^^`_Z\\XY\^`	chr10.fa		5374178	F	36	119					
+HWUSI-EAS610	1	4	41	673	1290	0	1	ATTCCAGCCTCAGGAGGATGCTGAGGAGCCTGGGCC	`aaa_\_aaa^a_[]a_[_a``_]]\WZXZ]XVX\Y	chr10.fa		5374217	R	36	119					
+HWUSI-EAS610	1	4	44	1529	787	0	1	TTAGAAGCCACANGAGGATCTCCAAAGATCAGAATT	`^``Z]]_WY[XDX_W[^][`[NX\ZXZXT^^]Y\]	chr10.fa		5374563	R	12A23	110					
+HWUSI-EAS610	1	4	72	628	567	0	1	AAGGAAAGCCTAGGATCTGCTAACCAGGTTCCCTGA	a[a`V[`Y^`_`Qa____\`a_a\]\PNYZ^WU`_\	chr10.fa		5374747	F	36	118					
+HWUSI-EAS610	1	4	74	443	788	0	1	CACACACACACATGAACACACATGGACACACACACA	aaaabbabbabaabbaaabba^aaaaa`abaaba^X	chr10.fa		5374891	R	36	52					
+HWUSI-EAS610	1	4	56	310	1613	0	1	AGACACTAGGAACTGTATGAGGCACAGACCCGTCTT	^_^_b]^]a`]`aabRNYYV^]``aaa`__`_T]_\	chr10.fa		5375046	F	36	119					
+HWUSI-EAS610	1	4	44	850	1957	0	1	ACGAGCCGGCAGTACTGTCCTTGATGGCACAGACAA	aab_a]]`VU^]UU[[\S\\UYXUUUUU\VVUVS\Y	chr10.fa		5375168	F	36	118					
+HWUSI-EAS610	1	4	15	987	47	0	1	CTGATAAGGGAAGATGATTGCCATGATAACTATTGA	`aa_]__aaa`^aaaa^_aaa^_Z_aa`__a^a`a^	chr10.fa		5376071	F	36	119					
+HWUSI-EAS610	1	4	71	1734	1735	0	1	GAAACCGGGGTTTCAGGACAAATGTCCCTGGTTAAA	]aa`a[`]]^NEVF\\a_][Z]_ZMKYVX`\LVTVT	chr10.fa		5376346	F	5T16G12G	22					
+HWUSI-EAS610	1	4	45	1706	643	0	1	CAGCAGATGCACTTAACCAGGGACATTTGTCCTGAA	a^Z^`U]]]]_X_\U[U]S[QYXXYYY`XR]UYN\]	chr10.fa		5376357	R	24C11	88					
+HWUSI-EAS610	1	4	47	650	1577	0	1	GGGAGGGGGAAGGGAGGGAAGAAGCAGAGCATCTAA	aa_K`aa]Z]`a`aUa_`^X^]^^]Y[^`\^_]][`	chr10.fa		5376682	F	36	118					
+HWUSI-EAS610	1	4	89	200	1948	0	1	GGAGGGAAGAAGCAGAGCATCTAAACAAAGCTTCAG	aa_abaZaaMa[aZUPUa]Z_R_]]][_N[YXY^^W	chr10.fa		5376694	F	36	118					
+HWUSI-EAS610	1	4	42	342	811	0	1	AAGAGGGTTATTGGAGACAGAGCATGTACCTTCTGG	aaaaba_S^a`____`]aaaV^`aa__a___^__`_	chr10.fa		5376763	R	36	36					
+HWUSI-EAS610	1	4	78	1217	1637	0	1	AAATTCCCCCACATTGGCAACTCACCGGAATTAAGC	abaaaaaa^U]YH___RWa\HVN[[^aX`Oa[BBBB	chr10.fa		5377224	F	10G25	66					
+HWUSI-EAS610	1	4	74	89	846	0	1	CGGAATTAAGCAAAATGATGGATTTGAGGCACACAA	`ba__aabbab]aY^aa\^ba_`a``b_a`^`]a\T	chr10.fa		5377249	F	36	119					
+HWUSI-EAS610	1	4	63	1131	134	0	1	CTTGACGTAGCAAGCAACATGTCAAAGATCTCCACC	abaaa`__aaa`XWXa__]]\[S^_`[XLFX[Y\__	chr10.fa		5377320	F	11C24	80					
+HWUSI-EAS610	1	4	3	80	14	0	1	GAATCAAGGTAAATGTGTGGAAGGCATGGTGGAGAT	abb]ba^`YU]^\baY^[bY\Y]``Z]a_Za`^aQ_	chr10.fa		5377347	R	36	119					
+HWUSI-EAS610	1	4	12	137	1986	0	1	AGGACCAGAAAAACTCTAGCAGATATGGACTGTGTG	[ab`ba__H__U\]SZ^_b]]aa`[`aaaaX_[^Zb	chr10.fa		5377804	F	36	118					
+HWUSI-EAS610	1	4	93	1365	1794	0	1	CAACCACACAGTCCATATCTGCTAGAGTTTTTCTGG	abba^aa^a^b^a_`a`a_ab`aab_aYaaa`_baa	chr10.fa		5377808	R	36	119					
+HWUSI-EAS610	1	4	37	1492	869	0	1	GATTGAACCCTGACTTTCTCGGGATGAACTTGAACA	]Q^aXJ]OX\`STT`[[X\]WZ^TSVXX\^YVSSUY	chr10.fa		5377885	R	36	118					
+HWUSI-EAS610	1	4	81	455	1721	0	1	CAAGTCCTTGACCAACAATTCCAAACTCTTCCAAAT	]ab^_aa\I^ba``b]bab`_aSXa`ba_b`YTWU_	chr10.fa		5378014	R	36	118					
+HWUSI-EAS610	1	4	62	1615	1534	0	1	CTCTATAGATAAGACACAGGTATATGTGATAGCCCC	abaabbbabaaa_a_aaa]a]a`_``[`^`_^^__]	chr10.fa		5378227	R	36	119					
+HWUSI-EAS610	1	4	39	1204	515	0	1	CANTCTGAGCATGATGTATTTGGAGAAATGAAAATA	a[D^Za``aZaabaa``abba^^Za^``aa`_a`a`	chr10.fa		5378309	F	2T33	110					
+HWUSI-EAS610	1	4	94	745	801	0	1	GAACGTTGTAACAGCATGATACTTGAAACTAAACCA	aaa`aaaa_ba`aaaaabaaa__aa\`a]a_`___a	chr10.fa		5378749	R	36	119					
+HWUSI-EAS610	1	4	16	1699	1980	0	1	CTTGAACAGCATCTTTTGTTTGAGAGGATCACTCTT	Xbbb`\abaa`b^_bbb_S[baba_ba^``aW`V`a	chr10.fa		5379263	F	36	119					
+HWUSI-EAS610	1	4	46	1079	2045	0	1	ANTTACTGAGGTGTGACTGGTAGGACAGGATTGAGC	[D\a^Za``bb\_]\_aa`^`aUY\]a`^]]_`X[Y	chr10.fa		5379505	F	1C34	110					
+HWUSI-EAS610	1	4	63	1002	1729	0	1	TTCCTGTGCAACGGAGTGTCCACACACAAGGGGCAG	aa`_`aPa```__a^a]__^]\]^^^WWS\\Z^VV^	chr10.fa		5380068	F	35A	84					
+HWUSI-EAS610	1	4	19	801	943	0	1	AATCTGGATGATCAGGAGTTCACTACGAGCAGAGTG	aa_]aa`aUbYSU``_a`ZU]`\a_``[V_aaRa]b	chr10.fa		5380216	F	36	119					
+HWUSI-EAS610	1	4	14	1137	1537	0	1	GCAGGCTCTCTTGGCCTTGGTTAGAGAGTGCAGACT	`aaa^Y^\]W\ZYR[YX_`_YVPUX]\^PP\VSUPU	chr10.fa		5380305	F	36	118					
+HWUSI-EAS610	1	4	74	1788	1169	0	1	AAGTAGTACATCTTCTTTCTAGTGAAAAGAATAAAC	_\WXa`_aaa`]``X^a```__L]\`][PS___^`]	chr10.fa		5380380	F	7C28	81					
+HWUSI-EAS610	1	4	74	1359	24	0	1	TAGGAGTTAAGGAAAGCTCCTCATGGGAAAATGTGG	aa^a__^`aa^U]_]a`_``___`_XM\]]^_]R__	chr10.fa		5380647	R	36	119					
+HWUSI-EAS610	1	4	45	1171	1616	0	1	AGTGCTTGTTCCTCAGTACCTGGAAGAGGCTAGAAA	_aaa`bbbabbbaaaabb``babbbbabaaa_`^]]	chr10.fa		5380744	F	36	119					
+HWUSI-EAS610	1	4	60	843	1514	0	1	TGTGCAGTGTGTATGGTATGTATGTGGCGTGTGTAC	[^`a_QaX`XaPZa`YUX^aQGX`TXLFaWQLLJ^^	chr10.fa		5381177	F	19C7T8	68					
+HWUSI-EAS610	1	4	87	632	1230	0	1	AGGGCCTTGAGATTATGCCTCTCAGGTTAGAGGTCA	`baaaaaaaaaaaaaaaaaa`aa```Zaa_a`_\^`	chr10.fa		5381327	R	36	119					
+HWUSI-EAS610	1	4	16	1734	422	0	1	GTACAGTTGGAAGGGCCTTGAGATTATGCCTCTCAG	`]`VaaU_ZU]VPPV_]aa\`_Z]Q_ZX[Z_^\_Z[	chr10.fa		5381338	R	9A26	93					
+HWUSI-EAS610	1	4	81	1284	1861	0	1	GGAGCAGCGCAGTGTAAACTAGAGCCACCTACTTGT	]bbbbTbRaSTQRb`ab`ab[Q^\baaX_a__a^bX	chr10.fa		5381534	F	36	118					
+HWUSI-EAS610	1	4	75	536	269	0	1	AGCAGGATTCAGCCAGGATTCTGTGATGTGCTGTGA	ababba`aaaaaaaaaa``a_aa`baab`b_ab_a`	chr10.fa		5381613	R	36	119					
+HWUSI-EAS610	1	4	13	657	191	0	1	GGCCACAGCAGCATGTCACGTCTCACAGTGGGAGTC	a_`T`XR```aZ`^`V``Z^^^]UX\`^K`aZQ_BB	chr10.fa		5382270	R	36	110					
+HWUSI-EAS610	1	4	16	997	370	0	1	GGAGGATCTGGCCACAGCAGCATGTCACGTCTCACA	a]S_QRZN]YPV`a`]OWY``XOX\]_]Y_^^NNP[	chr10.fa		5382279	R	6G29	87					
+HWUSI-EAS610	1	4	50	1274	1385	0	1	TGTGGGGAGCCTTGTTCAGCCACTTATTCTTGTAGA	`aYUa^R]SPW__a__[Y`_\UU_^Y^]YaUMWU`Y	chr10.fa		5382359	F	33CA1	56					
+HWUSI-EAS610	1	4	21	490	1891	0	1	TTCTTGTCAAATATGGTCCATTTTCCTTTCAGTCAT	ababaaabaaabaaba_a_^abaaa``aa_]__a^`	chr10.fa		5382385	F	36	119					
+HWUSI-EAS610	1	4	75	1255	992	0	1	CTGCTTACTGACTGTGTGGCTTTGAACCAGTTACCC	abbabba`b_V]aa^a^[aXaaaXS\`_^[V\ZY^_	chr10.fa		5383011	F	36	119					
+HWUSI-EAS610	1	4	34	1087	1414	0	1	ATGTCAGAGCTGAAGGAAAGAAAGGGGAAGCAAGCA	TW\Z\OH^^a`]VYbbba_XTP_^`XUXPPN\BBBB	chr10.fa		5383371	F	25A10	71					
+HWUSI-EAS610	1	4	10	944	1719	0	1	CACTGGCATACTTGCAAGCCTGTCTGCTTGCTTCCC	abaaabaaaaaaa``^a\ZX`a^_X^[_``ZV_^[X	chr10.fa		5383395	R	34T1	87					
+HWUSI-EAS610	1	4	69	676	1561	0	1	AGACAGAAATGGTTAGCACTGGCATACTTGCAAGCC	``ababba_bbaabaabb_abaabbbbaaaaaaa^a	chr10.fa		5383411	R	36	119					
+HWUSI-EAS610	1	4	62	1598	190	0	1	ATAAAGTAGAGGGTTGATGGAACTGGAGGCTTAGGA	aaaa_WT^_ZWZZV_^Z_]SW_XZZWYXYZXW\WO]	chr10.fa		5383546	R	3G32	81					
+HWUSI-EAS610	1	4	4	1533	922	0	1	TTTTTCCTTTGTTTGGGAAACTTCAGATTGTTCTCC	ab`aa_\aa_a___``a^^`[`_]__`^__]`^^^Y	chr10.fa		5384232	R	36	119					
+HWUSI-EAS610	1	4	62	384	1155	0	1	CAATAGAGAATCATGGGAAAAAGAAACTCCAGACCA	a`babbaaaaaabaaaaaaa^aaaaaaa`_`a`_``	chr10.fa		5385204	F	36	119					
+HWUSI-EAS610	1	4	37	99	1129	0	1	AAAATCTGAAAGTTTTCCCTGGGGAGCAAAATGAAG	\TX^aba^ZTX`^`aabab_babb]`b[\Q_`^`[a	chr10.fa		5385255	F	36	119					
+HWUSI-EAS610	1	4	85	571	45	0	1	CGTCAGGCTCTCTCTGACCTTTCCATGGAAGTTGTA	`_\^```a[_a`a_ZSW_____ZUZY`]UNYMX\Q[	chr10.fa		5385351	R	15T3G16	59					
+HWUSI-EAS610	1	4	13	668	1871	0	1	ACACCCAGCAGCCAATGGAGGAGCAAGGACCAGACT	abb`aa`[aaa`Y``^a`_]__`U^Z^Y]\]`^UVU	chr10.fa		5385469	R	36	119					
+HWUSI-EAS610	1	4	58	794	1825	0	1	ACCTCTGTAGATATAGCTACTAAATAGCCAAAGAGG	aaa`aa`]a```a``a^a``a`_^G\]Y_`_Y]]a`	chr10.fa		5386086	F	33G2	84					
+HWUSI-EAS610	1	4	99	1527	136	0	1	AAAGACATCATCTCAGAGCAGTAGAGTCAAGACAAA	aa]Y[_a_]`_]X^aU^X`_\\aQ`]Z^`_W^^`__	chr10.fa		5386264	F	36	119					
+HWUSI-EAS610	1	4	20	21	1790	0	1	AGAACCAGGGAGGAGGGACACCTCAAAGCAAAGAGG	^aaaa`^aa]aaaZY]]UV_^`Z\PY\^P[]`^^_`	chr10.fa		5386348	F	36	119					
+HWUSI-EAS610	1	4	4	1044	1932	0	1	ATGTTCTAGTGTCATCAGTCACTTGATACTACCTTT	aaa```a`a^^V_`_\``^^^Wa_a^__]]_ZV]_a	chr10.fa		5386542	R	36	119					
+HWUSI-EAS610	1	4	75	607	995	0	1	GGACAAAGACAATGGAGGAAAGATGTAAGAATGAGC	`_O\]_bb`[_Tbab`aY]P\__abZ`aa_[b`a``	chr10.fa		5387068	F	36	119					
+HWUSI-EAS610	1	4	37	1587	1630	0	1	GGATTGTGTTTCGAGTGGAAATGATTCTTGGTCCAT	abaaaa_a^```a`a_aa^__aa__`___`ZW^]`a	chr10.fa		5387423	F	36	119					
+HWUSI-EAS610	1	4	29	800	1197	0	1	CAAATGGAAAGAAAGATAACTGCAGACATGCACTAA	abaabba_`]baaa^baba^aa_aaa`a`]\a```a	chr10.fa		5387651	R	29A6	85					
+HWUSI-EAS610	1	4	84	420	1389	0	1	CTTCATTCTGGAAGAAACCAGATGGGAACAAAATGT	`[a\W_Va`a^`_`ZS]b_`a_S\aa_a`_N]SU`T	chr10.fa		5387993	R	36	118					
+HWUSI-EAS610	1	4	55	241	1654	0	1	TTTTTTTTCTACCTTATCACCCAAAAGTGTAAGGAA	abbbbbbbaabaabb_a`^aba^aa`a]a^`_aaYa	chr10.fa		5388489	R	36	119					
+HWUSI-EAS610	1	4	7	1217	893	0	1	GAATCCCAATTGCCTTTGGTAAACCACTGACTGAAG	abbaaa_aaaaaa`aaaaa]aaa__a_^`_^a_```	chr10.fa		5388589	R	2C32A	43					
+HWUSI-EAS610	1	4	24	1630	1045	0	1	AAGATCGGCCAAATCTCTTTTCGAGATATTTGCTTT	aa`^ZXQT^YY\`_]_^Y]^_[[[\X]]^X^]Z]_Y	chr10.fa		5388730	R	36	119					
+HWUSI-EAS610	1	4	35	1344	1608	0	1	AAAGCAGGTGTGCTTCTCTCTGCTGTCCCCAGTTGA	a_X`_UaXN[G[\__W\Z]\\`W_ZUQWWW\\VU\V	chr10.fa		5388831	F	36	117					
+HWUSI-EAS610	1	4	65	900	1578	0	1	AAAATTGCTGTTATCTAGTCAATCCATAGGGGAAAC	abbbaaa_aaaaaa`aaaaabaa__a^```aa^aa`	chr10.fa		5389192	F	36	119					
+HWUSI-EAS610	1	4	53	1076	750	0	1	AGCATGGGACTCATTACTGAGTCAGTGGGCGAAAGT	ab``aZ\aaab`[abbbbabaaaaa`aababbbaaa	chr10.fa		5389226	R	36	119					
+HWUSI-EAS610	1	4	58	1409	1647	0	1	TACAGTCAAGTGTGACAGGCAGATAGCAGATGTATG	aaaba_a__aXa\aa_`]aa`a````_]_Xa^\]`_	chr10.fa		5389286	F	36	119					
+HWUSI-EAS610	1	4	58	646	1699	0	1	AACAGATTACTTGAGCCTCAGATAGTGTGTTACCTC	_a`bb^^bbbbbbbababbaabaabX]]ba^b][`b	chr10.fa		5389404	R	36	119					
+HWUSI-EAS610	1	4	91	909	233	0	1	TTGACATTCAAAGCCAGGGCATGTTCTCCTGTCAAA	aabaUU\^Waaa_aaaZYZ`a_`^__a]_[aH__`a	chr10.fa		5389495	R	36	118					
+HWUSI-EAS610	1	4	100	1784	351	0	1	AATGGTTGATTGTGAACAGAGAATCAGGGGCCCTTT	[bWaaG[[`_W_RG_a_a`a^[Z_BBBBBBBBBBBB	chr10.fa		5389642	R	27A8	62					
+HWUSI-EAS610	1	4	37	407	1029	0	1	TATTGTGAACAGTCTTTGCCTTAAATCAATCATAAG	XWGSYIPY\\^ZN][W]Z\]]^_STZ]WXZ_W[]BB	chr10.fa		5389751	F	2C33	97					
+HWUSI-EAS610	1	4	17	1284	361	0	1	CAGGCTGGTCCTGCACTTGTGATGCTTCTGATCGCG	ab_aaaaaaa^`X`aaaba`aa^^^aa\a`a_Y`]`	chr10.fa		5389865	F	32T3	89					
+HWUSI-EAS610	1	4	81	896	818	0	1	GTTTCATACCTAGGCTATGTCCATTGATATCTCATT	a^^aRa_``VZa[aPY`W]YYZ__[[S[PQN\X[XZ	chr10.fa		5390867	R	36	118					
+HWUSI-EAS610	1	4	57	1038	502	0	1	GTGGACACAAGCACAGCTTGAGTAGTGAATGGCAAC	```]]YWS[Z]`\R^^U^a_[]^\`[__\[X[QU]W	chr10.fa		5391060	R	36	118					
+HWUSI-EAS610	1	4	56	1102	159	0	1	GCCACAGACCAGACTGTGAGCCTTCAGAGAAGATAG	_`_`a^`^__a`_^^_^aaaVN[^^[_P`W\_Z__a	chr10.fa		5391254	R	36	119					
+HWUSI-EAS610	1	4	83	1276	1963	0	1	GTGTGCTGCCACCCTTGGCTGGCACTTGTATGGATG	a\JOU_^RLFZNYYSM[X][J[^YXK\YKN]TBBBB	chr10.fa		5391586	R	36	97					
+HWUSI-EAS610	1	4	57	225	143	0	1	AGCTAGGGCAAGCTGACTAGCTTAACAGGTTGAATC	Vabbab`a_babbbbaba^abaaab_^_a`aaaaaa	chr10.fa		5391659	F	36	119					
+HWUSI-EAS610	1	4	4	103	853	0	1	GCTAGGGCAAGCTGACTAGCTTAACAGGTTGAATCA	`SXU\^]W^aaaZXYZUT`_QGUUXRV[P\_U]UY\	chr10.fa		5391660	F	36	117					
+HWUSI-EAS610	1	4	33	237	1603	0	1	TTATATAGTGGAGCAGCCTCTCTCATTTAAACTCTG	aaZ[^_\`ZTGZ]_aa`a\^]WV`Y^\_`]\\VV[V	chr10.fa		5391703	R	36	118					
+HWUSI-EAS610	1	4	44	697	769	0	1	GATTCTGGGAGGACATGGGGAACACTGTCACTAGTT	`U``]ZY^]]ZZ]]`Z]ZWSUX\U[aaVWY[^\]R]	chr10.fa		5392345	R	36	118					
+HWUSI-EAS610	1	4	83	12	444	0	1	TATCAATAATAAGGCAAGGAAGGAAAGGGCTTCAGG	`Saa\__bbb`^bbb_`ab`\abaaabbababaXaa	chr10.fa		5392418	R	36	119					
+HWUSI-EAS610	1	4	82	289	82	0	1	AAGATTGGGTGAAGAGGTATAAAATGATATTCCCTA	X^aa^bbbb^bb``aba\Zaaaa^^bbabaab`a`a	chr10.fa		5392579	R	36	119					
+HWUSI-EAS610	1	4	38	1159	839	0	1	CGCCAGAAGATTGGGTGAAGAGGTATAAAATGATAT	aabaab^`b_baa`b]b`ababaYaa`a`aaabaab	chr10.fa		5392585	R	36	119					
+HWUSI-EAS610	1	4	61	355	1815	0	1	TTGAAAACCATACAGTATAGGAGAAGGAGCTTACGT	a^bababa^^aWa[ZO^a`a__a_YZZV[a`VT`a]	chr10.fa		5392805	F	36	119					
+HWUSI-EAS610	1	4	62	421	816	0	1	GTTGCCTAGGAGGTGATGATACGATTTCTGAGTCCT	a^^a___Ya_X_aR]UZ^^VLY_^U]^]XYU]WTVX	chr10.fa		5393112	R	36	118					
+HWUSI-EAS610	1	4	36	1039	856	0	1	AAAGTCATAACGCTGTATCATGATGCAGACAATGTG	abaa`_aaa`_a_`a`aaaaaa^_aa`__^a``_^a	chr10.fa		5394217	R	36	119					
+HWUSI-EAS610	1	4	99	948	1222	0	1	TAGCTAAATGCATCCCTCATAGGTTAGGTGGTTGGG	a_aabbbbbb_aaaaaaa_bZaaU__baU_N[G]__	chr10.fa		5394274	R	36	118					
+HWUSI-EAS610	1	4	40	1574	1033	0	1	GAACAGCCAAAAGTGATCAAGGCTTGGCATGAGCAG	aaaa`aa\[Y^_ZF_`^``\YZ_[^`\\^_[^ZUZ[	chr10.fa		5395164	R	36	118					
+HWUSI-EAS610	1	4	98	1203	32	0	1	GTAGATTAAACAATAAAAAGGAAGAGTTTGCTTCTG	aaaa`a_b^aa__a_abaaa`]Y_^a\]^S`_Z_a]	chr10.fa		5396303	F	36	119					
+HWUSI-EAS610	1	4	74	1779	1024	0	1	AGTGAAAAGTAACTTGATGAGATAGTGGAGAGAGGA	Z\VYN[XMUZ\UM\_`U\YYXZ]U]JX]WLMUSSG\	chr10.fa		5397378	R	36	116					
+HWUSI-EAS610	1	4	10	1346	460	0	1	TTTGACCTTCGAGTCTGCCCACTCTTCTGACCTCCA	a_``_\\_\\^_WSX`[[\S_\^WWX\WW\U\WXUU	chr10.fa		5397448	F	36	118					
+HWUSI-EAS610	1	4	66	344	274	0	1	ATTGGGTCAAGCTGAAAAGCAAAAATTTGGAGGTCA	abbbab^baaaa`a``aabaa\`aaaaa_a`a`Ua_	chr10.fa		5397475	R	36	119					
+HWUSI-EAS610	1	4	77	1473	224	0	1	ATGCATTTAAGGTTAGAGTGATATCCTGTGGATTGG	aaa`aaaaa`X`\``aaa_aaaaaa__WR[V\_[BB	chr10.fa		5397506	R	36	110					
+HWUSI-EAS610	1	4	22	178	1907	0	1	TGCCAGGGAAACTCTTTTTCCAACTCCCCCAACCAT	`ba[N^baR[`aY`ba`a^bbKbaa`bb^baV``\]	chr10.fa		5397546	F	36	118					
+HWUSI-EAS610	1	4	37	859	2027	0	1	AAAGAGATAGACGGAGAGAAAGAGGAAGAAAAGGAG	aaaaa`aa_``_`a^`__]^]a]_^X^`]_\^_^^_	chr10.fa		5397910	F	36	119					
+HWUSI-EAS610	1	4	8	1676	379	0	1	AAAGAGATAGACGGAGAGAAAGAGGAAGAGAAGGAG	aaaaa^a_a`_Z_[]_^^^___]S]]^WXJV^]ZW_	chr10.fa		5397910	F	29A6	104					
+HWUSI-EAS610	1	4	70	102	1966	0	1	ACTGACATGGGAGCTGTCCTTCCAGCATGTTCTACC	]ba]aaa_aaaZab_aV_aW[`\[^aQU`SW\\\__	chr10.fa		5398003	F	36	119					
+HWUSI-EAS610	1	4	72	498	1100	0	1	CAACATAGTAGAATAGTGACTGACTCAATGCAACTC	ab`a`baa`baaaa^a_aaa_aaaaaaPaaaa`aaa	chr10.fa		5398414	F	36	119					
+HWUSI-EAS610	1	4	31	518	1024	0	1	AGAGTATAAGTCACACAATTTCGAAGTGTCACACAG	X_Z_a``ba`[`b^_aYS]bbaaXZ\`b`a`X``^b	chr10.fa		5398538	R	36	119					
+HWUSI-EAS610	1	4	92	960	460	0	1	ACAAACCCAACTCTAAAGTCATGAGAGTTCTATGCT	VbbaaXa`bbb`_aa`a`_aabaaa`b_b_b`aa^b	chr10.fa		5398632	R	36	119					
+HWUSI-EAS610	1	4	42	774	102	0	1	GCATGTATAATGGGCATAGTCATGCTAAATACATGG	a_`aa_]``^a^^`^___`Z_a``_^^^^^_W^^a`	chr10.fa		5398715	F	36	119					
+HWUSI-EAS610	1	4	69	1571	1530	0	1	TTGAACAGAAGTAAATTGAGTTCTAAACATTATAGA	abbaaaaa`^^[aa`a`a`a`a_aa][\^aa_aa_a	chr10.fa		5399813	F	36	119					
+HWUSI-EAS610	1	4	71	348	1709	0	1	CATGAAATGAAATGATCTGACTAGGGGATGATGGCT	a]bb\]O_[aS]`b_]baaaaaaaW__]aa]a]Zaa	chr10.fa		5399894	F	36	119					
+HWUSI-EAS610	1	4	98	931	195	0	1	TGCCACTAAGCCATCATCCCCTAGTCAGATCATTTC	]M^``_`XH\KRSPU\TYPOLP_RLRRJJWP\_`BB	chr10.fa		5399902	R	36	106					
+HWUSI-EAS610	1	4	30	957	1357	0	1	CAGCCAAGTTAACTTCCTACACAGGATTAAGGCTTT	Oaaaba^``bbbZ`abb`ba_aaaaabbb`aabbba	chr10.fa		5400218	F	A35	99					
+HWUSI-EAS610	1	4	40	629	1314	0	1	AATCAAGCAACTCTGTGTTCTAGAAGTGTTAAGCCA	aaaaab``U^_aab`]a`aaaaa__aZ`[aaaa`__	chr10.fa		5400348	R	36	119					
+HWUSI-EAS610	1	4	10	700	606	0	1	AGCAATCAAGCAACTCTGTGTTCTAGAAGTGTTAAG	aaaaa___aa`a]^a`aa_`_`^`___^_]^__^__	chr10.fa		5400351	R	36	119					
+HWUSI-EAS610	1	4	51	1006	1741	0	1	ATGAGTGCTGGTGCTCAGTTGGCTTTGTCTTTTTTA	abba`]b^aa__`^a__bab_a]aaaa]X`aaaaa_	chr10.fa		5400668	F	36	119					
+HWUSI-EAS610	1	4	23	1443	1646	0	1	TTAATCTAGAGCTCTCTGGCTTAGCTAGGTTGGCTA	ab`[````]`[^`Ya\]YT]aa^`[`\a\W[O[W[_	chr10.fa		5400955	F	36	119					
+HWUSI-EAS610	1	4	96	1389	152	0	1	TTATCTCCATCTCTTCAGGATTAGAGGCCAACTCTG	XQXZ`Z_RSYY\Xa`S`T^aT\YLY[NUV``a\PUX	chr10.fa		5401014	F	36	118					
+HWUSI-EAS610	1	4	45	1654	1433	0	1	GGGTATGGCAGAGTTGGCCTCTAATCCTGAAGAGAT	[ab_aaa^aa_`YYZG]_``_aaa_\_aa^]_`ZW_	chr10.fa		5401022	R	36	118					
+HWUSI-EAS610	1	4	48	1236	237	0	1	AGTATAAACTAGCAAATATGTTCGTACCTATAGTCT	aaYZaaZ^_a`[`_aaaaba^a]`W``Uaaa`]Z_a	chr10.fa		5401297	F	36	119					
+HWUSI-EAS610	1	4	55	65	647	0	1	GCCCTGTAACCTCCACTTTGCCTGGCTTGCCCTCAC	_\``a`_Z__`aa_^_a__aaaa^````^``aa_Z\	chr10.fa		5401589	R	36	119					
+HWUSI-EAS610	1	4	31	1167	11	0	1	TTGTTCAGTACTGTTTCCTGCAGGCAGAGCCTCCCG	a_Y^]`TZ^QRZVT]]TOZWSYLJ[YVZYTNNTNPX	chr10.fa		5402267	F	36	117					
+HWUSI-EAS610	1	4	10	725	71	0	1	ATCTAACTCTTTCCATCACTCCCACATCGGGAGGCT	aaTab[_a^a__^X^___^_\ZUUWZ\Y\\\W\ZW]	chr10.fa		5402294	R	36	119					
+HWUSI-EAS610	1	4	91	92	190	0	1	GGCCAGAGGCTTGGTAGAATTCTGCTTGTCGAATTA	aa___bR`b_]`^^MHX_\```R`][]^[`_QRaZ\	chr10.fa		5402342	F	36	118					
+HWUSI-EAS610	1	4	98	1196	528	0	1	GGAAGGCAGATTCAATGTGAGAGGACACAATGCTAA	_V_\W]_```[`]^\a]Ya`aaa[`Z_T[_]Z\_^`	chr10.fa		5402551	R	36	119					
+HWUSI-EAS610	1	4	100	243	497	0	1	TAGAAAAACAGGCTGAACACAGTAGCACATGTGTTC	[V_]Xaaa_a`[aZ\Z]__a[a^]WV_YR[[JTW__	chr10.fa		5402646	R	36	118					
+HWUSI-EAS610	1	4	80	857	178	0	1	TGCTCATAGAAAAACAGGCTGAACACAGTAGCACAT	Zab]`ba_]_\\abb_Q^ab_bbbbbbaaba_baa_	chr10.fa		5402652	R	36	119					
+HWUSI-EAS610	1	4	70	831	908	0	1	TCTGTGTCTCCTAGGAATGAGCCTCTTCCTTTAATC	aabaab`_a``aaa_\`aaa`a``__a__aaa`__`	chr10.fa		5402697	R	36	119					
+HWUSI-EAS610	1	4	10	879	981	0	1	TGGTGTGCTTTGGCACTAGAAAACACAAACTATGCC	aba`a`aaaa_`aaa_aaa_``a^a`_aa^aa`___	chr10.fa		5402734	R	36	119					
+HWUSI-EAS610	1	4	61	596	812	0	1	ATATCATAAGTTGTCATCAGGGAGTAAATCAGGCAA	\^`aba_Xbbaab`b`\_a`baaa`aa`a_a_`a[W	chr10.fa		5403091	F	36	119					
+HWUSI-EAS610	1	4	12	1040	1677	0	1	AGAGCTGACAGGTAGGGACCAAGTATTATCATCTTC	`aab]a_a__a_W]_aa`\_a_\\_aa_aZ`a]``]	chr10.fa		5403511	R	36	119					
+HWUSI-EAS610	1	4	13	159	1725	0	1	CATGGCTACATTTAGCTTGTGATTATGTTCCCCAAC	``Y_`a`[aaY\_aa]SU\SaXX^YUWRU_XFX]BB	chr10.fa		5404247	R	31A3A	97					
+HWUSI-EAS610	1	4	47	1438	1928	0	1	AGACTATAAAGTAATGAGCCAGGAGTTAGTGAGCAG	aa`aa``aZW^G]aaa_a`[U_a_`U``aX_WaW_a	chr10.fa		5404335	F	36	118					
+HWUSI-EAS610	1	4	10	1056	1413	0	1	GATGACGGTGTGTCGTTTGATCTACCGGCTCATAAA	aaH\aP]]Q[YRHUYQ^a\Q`[``]XSaYX^`O_^U	chr10.fa		5404522	R	36	117					
+HWUSI-EAS610	1	4	71	1535	2020	0	1	TTAGTCAGAAAGTTTAGGCAGGCTTTCTTTTGCCTG	aab^`_a^_a^NUZYaR[X[[XW`V_Z[]_BBBBBB	chr10.fa		5404605	R	36	93					
+HWUSI-EAS610	1	4	23	856	694	0	1	GTTTTAAAAACATTAGCTTTGGTGCCTTGATTCATT	`GbbWYU`X^`b_aY^_ONZS]T`^TNT_S__O^`_	chr10.fa		5404843	R	36	117					
+HWUSI-EAS610	1	4	12	299	1129	0	1	GTCGTAGGCCAACTTCAACTGCCGGTTATCTTGAGC	aVS]SU`ZQY^WY_ZVZV]RaXMDZZZ____Z_X``	chr10.fa		5404902	F	8T14A12	88					
+HWUSI-EAS610	1	4	43	26	1005	0	1	CCAATATTGGGCAGGAATCTCCAATGCATCTGGGAC	abXT\\``aaaaZ^]ZZ\a_a`SS\a_P]a_``YM[	chr10.fa		5405432	F	36	118					
+HWUSI-EAS610	1	4	53	922	542	0	1	CTCCATGTCATGGGCAGGAAATATCTAAACGTGATT	ababbb`^`_baabaaabaaaaaa``bab__[baab	chr10.fa		5405523	F	36	119					
+HWUSI-EAS610	1	4	34	995	1590	0	1	GACAGAATGTCGTGTGCTCAATCACGTTTAGATATT	aa_`a`a[aZ^a^a^`_`_`^a^_\a]^`a`_]^``	chr10.fa		5405542	R	36	119					
+HWUSI-EAS610	1	4	45	141	598	0	1	TGCGTTAAACAAGATGGCTGAAAACTGAAGTTAATT	abbbabbbbb_bba`bababba`bbab`]a_ba^aa	chr10.fa		5406743	F	36	119					
+HWUSI-EAS610	1	4	98	499	1937	0	1	GGCTGAAAACTGAAGTTAATTCCCAGAACTGCAAAT	aaba`_\```ab\N]]`_^`aaaa^a[a_a`a`_\\	chr10.fa		5406758	F	36	119					
+HWUSI-EAS610	1	4	54	712	1362	0	1	TATCAAGCTCCTTCTCTAACTCTTCTGTCATTGCAA	a_a_`Y`_a_^aa[`^_`_]`[``]``[\^^^_^^[	chr10.fa		5406828	R	36	119					
+HWUSI-EAS610	1	4	25	766	1588	0	1	TATATACACACATATCAGAAGATAAAGGTAGAGTTG	^^aZ^a\Z[]aZaW_\_a[^a\RW\Y`\N_a\`^_`	chr10.fa		5406908	F	36	119					
+HWUSI-EAS610	1	4	46	796	1912	0	1	ATATACACACATATCNGAAGATAAAGGTAGAGTTGG	ab_aa_aaa_^```VD\^_a\_`a^^\W]_Y^^`a^	chr10.fa		5406909	F	15A20	110					
+HWUSI-EAS610	1	4	49	193	1515	0	1	TCTGCTTGCCATCACCTTGACATAACCCTAGTGTCT	ababbba`babab]bb_aaabba__bbbabb[b_b`	chr10.fa		5406978	R	36	119					
+HWUSI-EAS610	1	4	93	1199	270	0	1	ATACAACTCTTTGACAGTCCATGGACTATCAGATAG	aaa\`a`aW^_`_`^a_]`_a_]^^]__^]X___^^	chr10.fa		5407090	F	36	119					
+HWUSI-EAS610	1	4	27	1548	698	0	1	TTACATTCTTTTGGAACTAAATGAGGCTTTCCTTGT	a`a__`_^__]]W\]_]`\Y\^ZU\WVY]ZWWYWWV	chr10.fa		5407337	R	36	119					
+HWUSI-EAS610	1	4	75	628	1249	0	1	AGCTTCACACTGGTGTGTGCCCTCCCTGGAGCTTCA	`a`a``a``^^`^W`\a\`^Z`_^^\^_YS_\\]\^	chr10.fa		5407959	F	36	119					
+HWUSI-EAS610	1	4	11	1568	612	0	1	AATAACTCGCTCCTCCTTTACGTTACATTCTTCTTG	aa^\]PTLRS^N\SVMV\YU[MOVXXGWTUMXUXVV	chr10.fa		5408173	R	36	116					
+HWUSI-EAS610	1	4	20	111	1069	0	1	TAAACGCCTCACTGTGCGTTGGAGGCAATGCTAAGT	ab[baaaaabbbaa`Xa`__aaUa``aa`_Z\[a`B	chr10.fa		5408208	F	36	115					
+HWUSI-EAS610	1	4	87	1128	1949	0	1	GTTTGCCACTTGCCAATCAGTGACCTGCTCTTTGCA	a```a_[_Z_^aX__]`\\^R^\\ZV_^`\_\_[[]	chr10.fa		5408302	F	36	119					
+HWUSI-EAS610	1	4	35	1496	1634	0	1	CAACAACAACAACAACAACACCAACACCAACACCAC	_bba`b`aZWQ`^WV_a`_`]N^a\aZ_a`S`_]__	chr10.fa		5408445	R	36	7					
+HWUSI-EAS610	1	4	46	861	467	0	1	TTTATATCTCCCCTGAACCCTGGGCCTCGCACTCTT	aaa__`_Z_Z_]S\^^_][^\^\S\\^W\XVS\V^^	chr10.fa		5411056	F	36	5					
+HWUSI-EAS610	1	4	45	1504	700	0	1	ACCCGGCTCACTGTGGGTGATCCCATCCCTGAGCTG	`^`\]\^]X`P^[X^Y\S\`Z]]\]]NXSSYSYRRS	chr10.fa		5411515	F	36	39					
+HWUSI-EAS610	1	4	24	1380	942	0	1	AAGCAAGCCAGTAAGCAGCACTCATTCCTGGCCTAT	aaaa`a^`^\_U``\\__[^^^\^\^\\^^\W\_\\	chr10.fa		5411595	F	36	42					
+HWUSI-EAS610	1	4	1	53	1899	0	1	TTTGAATGAAGAAATGGGCTTTAAGTTTACAATTTA	a][aaaa`Y[_]`aaab^b^aa\`b[a^```\aa__	chr10.fa		5411735	F	36	119					
+HWUSI-EAS610	1	4	55	1376	1087	0	1	GAGACAGTGAAGGAGGGGACATGGCCCTACGGTGTG	`^_X\\`R\RZ`\X`^Z^RZ\RTX\\TZ\T[KR\PZ	chr10.fa		5411922	R	31T4	102					
+HWUSI-EAS610	1	4	5	1063	344	0	1	TGGAAGTGATGATGTTTGAGAGTGAAGAGACAGTGA	aaaZLXLXY`aXT^U]]_[_L[V[^X\X_]]BBBBB	chr10.fa		5411948	R	36	96					
+HWUSI-EAS610	1	4	90	764	205	0	1	AATGCAAATGAAACCATGTCAGTGTGATGCTTCTGC	`ab_TPa__ZV`XYU[abR^T_T`P_a^`T\aR_WQ	chr10.fa		5412628	R	36	118					
+HWUSI-EAS610	1	4	88	481	140	0	1	GCAGCAGAACACGAGTTGACAGCCCTCAGTGAAGTT	`aa`aaa__\`Za_a\`^_[[\Z[^_^U^Z^[Z\V^	chr10.fa		5413139	F	36	119					
+HWUSI-EAS610	1	4	52	1701	2027	0	1	GGAATTAAAACTTCACTGAGGGCTGTCAACTCGTGT	aaa`aaaaaa^a_\a^aa^a^aU_a]W__Z_Z]Z_^	chr10.fa		5413147	R	36	119					
+HWUSI-EAS610	1	4	20	1702	234	0	1	ACCAGGAACCGGGCATTTGGTCTTCCAAAGTAATTG	aaa]UX_\T\FGW\^___NYY]_^VYV^QFO]][^U	chr10.fa		5413573	R	36	115					
+HWUSI-EAS610	1	4	12	1548	902	0	1	CTTTGGAAGACCAAATGCCCGGTTCCTGGTGGTGAC	^YW^Z^_^^X`b`\Z]]\a\__^``]\\`Y]REVWR	chr10.fa		5413579	F	36	117					
+HWUSI-EAS610	1	4	66	89	1402	0	1	TGACTTTACATTAAACAGGGTCATATTCTTTAACTC	^``a_bb`bbaaabb`\`aaYaba`ababbb``abb	chr10.fa		5413611	F	36	119					
+HWUSI-EAS610	1	4	58	470	350	0	1	TGTTGGAATCAAAAGCCCCATGGAATAGCCTCCCTT	ab_]\TY`_Y]_]]VYXY[`^][Z]WY[Y[Y[Z^TB	chr10.fa		5413982	R	36	114					
+HWUSI-EAS610	1	4	9	10	338	0	1	ATAATGAATTCTGACTACATGAATAGATTGGATGCT	aa`aabaaa`abaaabbaa`b^[aaba_aaa_`a`a	chr10.fa		5415389	F	8C27	81					
+HWUSI-EAS610	1	4	38	452	1830	0	1	GGATTTATCTTGGCTCATAGTTTCAGGGTTTCCATG	``Waaabababbaaaab`[a`aabbbbaZ`aaba`a	chr10.fa		5415555	R	36	119					
+HWUSI-EAS610	1	4	50	282	1644	0	1	TGAAGTTGTAATCTATCATGATGAAGAAGACATGGC	`aV[b`ba`aaaaaaaa_a`][`^`a_`aa`\`a``	chr10.fa		5416586	F	36	119					
+HWUSI-EAS610	1	4	55	1172	8	0	1	CCCTGCCATGTCTTCTTCATCATGATAGATTACAAC	abbbbaabaa`aaaabb`aaaaaaaaaaaaaa`aaa	chr10.fa		5416590	R	36	119					
+HWUSI-EAS610	1	4	70	85	1412	0	1	TGTGAGGAGAGACCCAGCTACATACCTCTGCCACCA	`babbba`bbbbabaab`[aaab]bbababba]\b]	chr10.fa		5416630	R	36	119					
+HWUSI-EAS610	1	4	69	1436	1072	0	1	GATCAATCTACAGCCCTCATGCCCTGCCCTGAATGG	aaaaaaa`aa^^Z\Z^\]Z]]_[`][`^V\U\SYVB	chr10.fa		5416706	F	36	114					
+HWUSI-EAS610	1	4	53	1284	150	0	1	TACAGCCCTCATGCCCTGCCCTGAATGGCTGATCAA	a`]aa_a^]^^\^`\__Z]`_a_a]^_^\W^U\^\U	chr10.fa		5416714	F	36	119					
+HWUSI-EAS610	1	4	40	341	829	0	1	CTCAGTGTTCCACAGTGTCACAAAACAGTACTGTCA	abaab`a_abaaaa`aa^aaa`_Y]``^^a``a_a]	chr10.fa		5417090	R	36	119					
+HWUSI-EAS610	1	4	12	1653	1011	0	1	GAAGCAAAGAACTAGAGATGGAAGCAGAAAGACATC	a_`a`aa`]_`^a`]_a`aa__][^^^YWUY^]]^Z	chr10.fa		5417176	R	36	119					
+HWUSI-EAS610	1	4	76	1226	1837	0	1	GGAGACAAACTCATGAGCATCCATGGGATACAATCT	_a_aaaaa`_a_aaaa__a__\_^`_`_aa_a`_]a	chr10.fa		5417396	F	36	119					
+HWUSI-EAS610	1	4	63	1058	706	0	1	TTTGTACTGCATCTCTGCAGATTGTATCCCATGGAT	ab`Y``^W]^]]^_\WW]aaXV[_^^\[_SJ[N[BB	chr10.fa		5417414	R	36	109					
+HWUSI-EAS610	1	4	23	622	541	0	1	AAATCATGAAAAGCACAGTAGCAGCTGTAGGTTGGA	aaa`abb``^_Z`aaaba[aaaaa_`_RW]_W``]T	chr10.fa		5417680	F	36	119					
+HWUSI-EAS610	1	4	27	699	1332	0	1	AGAGGACAAGAGCTCAGTTCCCAGCATCCACACTGA	`a`Xb__]a\_NZaaJaRaa^a_[aaa\`_]S]aa^	chr10.fa		5418084	F	36	22					
+HWUSI-EAS610	1	4	9	591	1162	0	1	AGAAAGTCATTTTATCATCTAAGTTACTGTCATGTA	aaY^S^[_`_]``_^^___\M^^[[\W^^YX[[`V`	chr10.fa		5418271	F	36	118					
+HWUSI-EAS610	1	4	58	1644	1217	0	1	TTTTTGCAAGTCTCTTCCCAACATGGGACTTTTTGA	aaaaa^^a`^[aaaaaa__aa[__VSX]^^_^^[R`	chr10.fa		5418536	F	36	119					
+HWUSI-EAS610	1	4	15	1653	1252	0	1	TGCTTGCAGCCTGTCAGGACAGGGTAGGGGAGAAAG	abaaaaaaa^aa`[__W`YaZOZ`U]^`]]S]W\^\	chr10.fa		5418851	R	36	119					
+HWUSI-EAS610	1	4	37	1009	1769	0	1	AGTGCTATGGCTTGAGAATATCCACTTTAGGACCAT	ababaabaab_aab\_`aaaa__`^aaa_``]T\_`	chr10.fa		5419410	R	36	119					
+HWUSI-EAS610	1	4	38	230	1927	0	1	TGAACTATGCTAAAAAGTTGTCCTCTGATTGACATA	a_X_bb_bbaabbaabb``b_baabab\bbbaba``	chr10.fa		5419667	F	36	119					
+HWUSI-EAS610	1	4	65	993	1676	0	1	ATCATCTCTAAGATCATGTGTGCACAAATGACTTGC	`aaTa_a_`_aa]\^`aa_b__N][aaa]aXT[R]Y	chr10.fa		5419999	R	36	119					
+HWUSI-EAS610	1	4	41	923	1741	0	1	ACCATATCTATTCATCTTAAATATTCCATAAACCCA	ab^aaaaaba`_^]a`aaaba`[aa`_`aaaa]V_a	chr10.fa		5420034	R	36	119					
+HWUSI-EAS610	1	4	11	1222	326	0	1	TTTTCCAACAACTTCTACTGATTTGGACATCATCCT	aa_ba_`a_`^`aa``aaa`_aaaa__^]aYYa^^_	chr10.fa		5420410	F	36	119					
+HWUSI-EAS610	1	4	7	1234	9	0	1	AACTAGAGACAGAGATACCAAAACAGACACACACAC	aa`aa]___R^\^`_]`__Y`__X_RZ]^Z_^_]^]	chr10.fa		5421684	F	36	119					
+HWUSI-EAS610	1	4	35	1306	1000	0	1	TAGAGACAGAGATACCAAAACAGACACACACACACA	a_aX]W_`a__^__^]^__S[]`\_]]Q_Z^]Z^][	chr10.fa		5421687	F	36	119					
+HWUSI-EAS610	1	4	86	651	927	0	1	GCAATTATTCTATGGGGACACTGGGATATTCTGTAT	a]YX`aZ`^^`]a_[]Y[^`^```a__Z`\\\`^a`	chr10.fa		5422134	F	36	119					
+HWUSI-EAS610	1	4	76	1425	761	0	1	CAACAAGCTCTTGTACCAGGGAACATTCATTTCCCC	abbabaaaa^a`]\baaa_aaab`aaaaaaa`a__`	chr10.fa		5422558	F	36	119					
+HWUSI-EAS610	1	4	53	459	1899	0	1	TATGAGTTACACCAATTTTGGTTTCAGTGAGGGATT	aa\a^`_b`abaaa`b^b`_ZVa^a_`_a_a_]__a	chr10.fa		5422799	R	36	119					
+HWUSI-EAS610	1	4	12	87	1469	0	1	ATCTGAGATACCTGATCAACCAAGTGTCCTAAGTTG	`ab_babaaabaabbabbaab^\_Xa`bbaaaa___	chr10.fa		5423179	F	36	55					
+HWUSI-EAS610	1	4	69	1496	818	0	1	ATCTGATGGATGAGTTACTTAGCGAACTACTTAGGT	aa_ba``Z[`a_a`^a``aaa____Y]__^``^ZYX	chr10.fa		5423283	F	36	35					
+HWUSI-EAS610	1	4	92	930	1409	0	1	TGCAGCATCCTACCTAAGTAGTTCGCTAAGTAACTC	aa^abW]PHTaa^Sa__a]]a_a]`_a^aZQ`_W_^	chr10.fa		5423294	R	36	33					
+HWUSI-EAS610	1	4	18	604	1571	0	1	TTCAGCAGAATATTCAGAGATGGTTGGGAGTGCAGG	ab_^_]L_RU\a`aa__OX^]aSJ^`]`]]UXU^aa	chr10.fa		5423399	F	36	14					
+HWUSI-EAS610	1	4	38	1406	1186	0	1	GCTGCATTGGAGGCTTTATGGCTTGCTCTCCAAGTA	Taaba`_W^a`a[`^Z^]]K_[``XSRHUGJ_XVQR	chr10.fa		5423567	R	30A5	34					
+HWUSI-EAS610	1	4	53	1483	683	0	1	GAAAGAATCCATCTTTTCTCAACAAGCCCCCAGCTA	]\a_^Ta_]WRa[[`aa]\`aa_``__ZYVV]GXVZ	chr10.fa		5423814	R	1G34	85					
+HWUSI-EAS610	1	4	29	681	1420	0	1	TACAATAATTTCAACACCAAAATGGATAAAAATGAT	_ba`[_T__aZW]SaY_PUV^J^a_IY_Y\^GWa_b	chr10.fa		5423889	F	5A30	81					
+HWUSI-EAS610	1	4	54	1443	2032	0	1	ACAAGGACATGCAGATGCTCTCATTGAATGGCACCG	]Z_aaab[abbbbbaabbbSaaa_aaaa^]]Y`YN]	chr10.fa		5424799	F	36	119					
+HWUSI-EAS610	1	4	41	1747	1177	0	1	ATAATAGCGTCTGTAAGGGAACAGTGCTTGGAACAC	aaa_aa`a``_a_L[a`]\^U^a_ZX]\WYVY^VU[	chr10.fa		5425443	F	36	118					
+HWUSI-EAS610	1	4	75	973	24	0	1	TAAGGGAACAGTGCTTGGAACACACTGGCAGCAGAC	aaaa`O^X`aa^TV`^a\_aYa^_SYa^\_]OV`\V	chr10.fa		5425456	F	36	118					
+HWUSI-EAS610	1	4	75	217	1715	0	1	GCGAAGATGGAGACAGGAATGTCCCAAGGTTTGCTG	]ONZTaaZ`_^]QTVWI`SFSR\_VMUZXHV_[]BB	chr10.fa		5426012	R	1G17G16	77					
+HWUSI-EAS610	1	4	78	1463	810	0	1	ACCCAGCTTTACTTTTTCCAACATGGGTACAGGAAT	aa]a_^^a`aaZ]`_aZ^PZa``\RWS]^]_WV[``	chr10.fa		5426078	F	36	119					
+HWUSI-EAS610	1	4	57	871	1000	0	1	TCTTAAGNATTCATGGGCTCCTAATTAAGGACTCCT	aaaaab^DZaa_aaa_`_aaaa`_aaaa``a__^_`	chr10.fa		5426223	F	7A28	110					
+HWUSI-EAS610	1	4	51	950	709	0	1	TTGCTGGAATCCGTAGGTATTTTGCAGAGATGACCG	abb_abaaaa`_b_aaa[Z`aaaa__`\__a`a_Za	chr10.fa		5427291	R	36	119					
+HWUSI-EAS610	1	4	72	1174	1509	0	1	GACAAAAACTCATGTTTCAGATNCAGGACGCAATGA	aa`a_`aa_a`aaa`aaaa_aZDZ`_[^]]]`_]`^	chr10.fa		5427347	F	22C13	110					
+HWUSI-EAS610	1	4	67	1753	1962	0	1	AGCATTCTGCCTGCCTGCCTGCCTGCGGCCTGCAAC	RZF[TGS__`OYV^OI_KRW_QQ_V[ENNPV_NF\Q	chr10.fa		5427545	R	26C6C2	94					
+HWUSI-EAS610	1	4	92	1562	1968	0	1	TGAATGCCATTACGTCACTGGGGGTGGGCTTTGAGA	Ta`_a\ZX`aba_a^a`_a`_aa_Gaa_^_^X_aa_	chr10.fa		5427778	F	36	118					
+HWUSI-EAS610	1	4	77	1240	1069	0	1	GATGCTTGGGGCTGCAGGTTCAAGCTCTCAGCTTCC	a`a`]aaY`__^`a\``a^`^a`^[_Z`_]Y_^\^Y	chr10.fa		5427862	F	36	119					
+HWUSI-EAS610	1	4	12	710	255	0	1	GCATGCCGGCAATGCCAGCATTCCAGAGGTAGAGGC	`Z`UR[\^aX\`[^][a``^^a`OPTU^aTZ`TP\R	chr10.fa		5435537	F	36	118					
+HWUSI-EAS610	1	4	75	1131	388	0	1	AGAAGCCCATAAGATTACCCAGAGTAAGCAAAGGGG	aaabaa`_aaa]``aaa`a`aa_a_a_a]`__]_`_	chr10.fa		5435703	F	9C26	81					
+HWUSI-EAS610	1	4	53	475	891	0	1	GTTGCTAGGACTTCTCTTGTCATTTTTGAAAGACTT	aaaaaa[aa__\aaa]aaaa`aaaaaa`__\a^^_a	chr10.fa		5435762	F	36	119					
+HWUSI-EAS610	1	4	69	1324	1662	0	1	GCAGCGGAAGAGAAAAACAGGAACCTGAGTGCATGG	_^aa`a]aab\aaaa^aaa^aRb`_aaaa\a_a`a`	chr10.fa		5435894	R	36	119					
+HWUSI-EAS610	1	4	24	558	223	0	1	GAGACACGTGACATGACCTCACAGTTTATCAACACA	a__`aaaaW_`^__a__`_`a_Va]_^`^Z__]]^W	chr10.fa		5437023	F	36	119					
+HWUSI-EAS610	1	4	62	1296	1182	0	1	TGAGTCATGTCATGCCGTGTGTTGATAAACTGTGAG	``aa`_ab`___a__\^_a_a_a[]^___X^_V^_`	chr10.fa		5437040	R	36	119					
+HWUSI-EAS610	1	4	49	1329	651	0	1	TACCAAACATATACCTCTGCTACCCAGCCCTCAGGA	_^\]`U`Z]a`_^]^_^a`ZX`TX_a_RLMXSWMQ_	chr10.fa		5437249	R	36	118					
+HWUSI-EAS610	1	4	17	765	662	0	1	GCCTGTGAAGGATACAGACTTCATGACGACCTGCTA	a_aa\``a_a[\[`__a_Z^_PR\]U^[[V__X[]Q	chr10.fa		5437387	R	36	119					
+HWUSI-EAS610	1	4	51	426	1983	0	1	GGTATGTGAGCATCGGTGGGCTTAATAGACAGTGCC	`b[bbbabab`aaaaaU__GUR^]^BBBBBBBBBBB	chr10.fa		5437470	F	19T16	59					
+HWUSI-EAS610	1	4	21	1664	1658	0	1	CAAATGTATTTAAATGTTCATGTTAACAGCAGCTGT	aabbbaWbbababbbbaabbb_aaaaaaa`aaa_b`	chr10.fa		5437557	R	36	119					
+HWUSI-EAS610	1	4	61	240	1222	0	1	TCATAAATCACGACATAATGTTCTAGATCATCCGTT	aaaa^SV_aaa_V]]a_W_a^a`aaa`_aaa_aaY`	chr10.fa		5437667	F	36	119					
+HWUSI-EAS610	1	4	42	1601	1802	0	1	GATTGAGCCTTTGAATAGTGTGGAAGGAAGATGAGT	a]abb_a_^aaaa`^_aa]aWb`[``_X^aZ^_]_U	chr10.fa		5437863	R	36	119					
+HWUSI-EAS610	1	4	35	518	1852	0	1	CGCACAGTGCTTACCAATTTACAGTGTGCTTTATTG	`^^aa^^_bbabbaaV`baab]X\^a_`baaaaaZa	chr10.fa		5437910	R	36	119					
+HWUSI-EAS610	1	4	56	1463	1436	0	1	TGTAAATTGGTAAGCACTGTGCGTGTTAGGACCTGT	ab__\_``]UY\^`\a_`^W_^`UWW_\_ZYSV]^Z	chr10.fa		5437923	F	36	119					
+HWUSI-EAS610	1	4	49	1060	1341	0	1	GTAAATTGGTAAGCACTGTGCGTGTTAGGACCTGTA	a____```_Z__`^[U_`]_]`]_]_]_]Y^Z__[Z	chr10.fa		5437924	F	35G	88					
+HWUSI-EAS610	1	4	3	950	1064	0	1	TACCTGCATCTTCCTTCTTCCTGTCCACAGCTTTCT	aaZ`ZZO]\T_^XVZ[W]VIZ`U]_VYFX[K^`XLW	chr10.fa		5438105	R	36	116					
+HWUSI-EAS610	1	4	22	590	900	0	1	ACTGTGAGCCAGATCTGACCCAACGAGAGAAGTGGG	^`]YLX]S^ZY\^RJ]_Q\[[`[^a_YT_Y^aS^^a	chr10.fa		5438146	F	36	118					
+HWUSI-EAS610	1	4	69	115	660	0	1	AGCCAGATCTGACCCAACGAGAGAAGTGGGATGAGA	Z`ba``Z_bab_bb_Z\`_S`T`ZV_S`aa]`a]a]	chr10.fa		5438152	F	36	119					
+HWUSI-EAS610	1	4	96	1199	1242	0	1	GAGGAGTGGGAAGGAGGTTAGCATCCAAGCAAGCAG	a\aa\`Saa^\^a`W`aUaaa\_^SW]^_W\\\W^W	chr10.fa		5438296	R	36	119					
+HWUSI-EAS610	1	4	13	1523	888	0	1	TGGAAGACACCTGGAAGAAGTGAGGAAGGCAAGGAA	abaaaaaaba_a\_V`aWaaSa_aa\___`X^\_]_	chr10.fa		5438505	R	36	119					
+HWUSI-EAS610	1	4	68	1434	1322	0	1	GAGACACTGTAGCTTAGAGTCTGGAAGACACCTGGA	a\]_```a`YVVR^aaZ[a^_a`a__`_W_\^Y[`\	chr10.fa		5438526	R	36	119					
+HWUSI-EAS610	1	4	12	412	160	0	1	AAAATGCACGTAGCACATAGCTTCTACTCTAAACCT	a]_a_aa_a`NW__`\`Z`_\S\__X]_\Z__^[]^	chr10.fa		5439373	R	36	119					
+HWUSI-EAS610	1	4	91	1714	1173	0	1	GCGAAAGGCAGGAAGCAGGCCAGACGAAGACAAGCT	aaaaaVVT^`a`[`a^aaX_Y__a[IVWLZ]^]\\V	chr10.fa		5445953	F	36	118					
+HWUSI-EAS610	1	4	29	935	1425	0	1	GAAGCAGGCCAGACGAAGACAAGCTTTTGTTCATAT	`aa[][_a_V_\_^`\Y__^_\_ZW^_`NZ_]]ZZ\	chr10.fa		5445964	F	36	119					
+HWUSI-EAS610	1	4	38	350	1175	0	1	TGCAGTGCTCAAACCCGAACAGGCTTGACTCATAAC	_aaW_abbbabbbbbbbbabbbbbbbbaabbbb\R^	chr10.fa		5446033	F	36	119					
+HWUSI-EAS610	1	4	26	1718	879	0	1	TGATGGGAGTCCGACTTCTGCTTCTATCCCACACCT	aaS`RGW\RRRSUUV\X^^U\_VSQ\N\^\\VWUXZ	chr10.fa		5446662	F	36	117					
+HWUSI-EAS610	1	4	12	24	1615	0	1	AAAGACACCGTTAGCCAATCCTGATGACCTAGGTTT	`b]aababba_b[bbb]`abbaa``aaaba_aa[``	chr10.fa		5446712	R	36	119					
+HWUSI-EAS610	1	4	65	547	669	0	1	TTGGATTATGTAAAATGTAGTGCATTAAGAATGGTG	abaa_`a^aa^a^[]aa]aa]a_`a`_^`U^`aaYa	chr10.fa		5447256	F	36	119					
+HWUSI-EAS610	1	4	30	1198	622	0	1	AATCCCAAATATTCTGAGTCCAGTTTCCCACCATTC	abbaabbaabbbbabbab_aaab_abaaaa```aba	chr10.fa		5447284	R	36	119					
+HWUSI-EAS610	1	4	61	933	1623	0	1	GTTATAGCGATGAACATCCTTCTGGAAAGAAGAATC	_I_Y\^`a]^^^^a]`^]``WY]Qa]a\Z_ZV]]_B	chr10.fa		5447535	F	36	114					
+HWUSI-EAS610	1	4	99	1032	769	0	1	GATCACATGATGGGAGACGGTGTTATAGTGTGAGAT	`^a``_^_`Zaa^_^aV\aXLX^YU[U^ZRU[W_Z^	chr10.fa		5447580	R	36	118					
+HWUSI-EAS610	1	4	60	1184	1334	0	1	TTGGCTTTTAGCTTTTAATACTGGGATTTAAAAGGT	aa`a_aaa`a___``a][_`]a`]][`_`_^^X[_X	chr10.fa		5447744	F	36	119					
+HWUSI-EAS610	1	4	99	1091	627	0	1	TGGCTTTTAGCTTTTAATACTGGGATTTAAAAGGTC	abaaaaaa_a`_^`a_`aa_aa__Z_a``_^`__]`	chr10.fa		5447745	F	36	119					
+HWUSI-EAS610	1	4	60	305	1871	0	1	CACTTCTCAATCTCTCCCATGCCTGCATCTATGACC	a_baababaaaaaaaabaa^\aaaa^\_a_^_[```	chr10.fa		5447849	F	36	119					
+HWUSI-EAS610	1	4	30	1477	1346	0	1	ATCATTAGCTGTTAACAGTACTGTGTTTTTAACTTA	ab`abbb`baaabaaaa`Taaab_baaaabaaaaaa	chr10.fa		5448359	R	36	119					
+HWUSI-EAS610	1	4	16	1077	975	0	1	TGAAAAGTTATTCCAGGGATGTTTCAGCTTCAGATT	a^NV`a_aaa_`][__aa_`a_`]`_`Ya]R[a^`^	chr10.fa		5448732	R	36	36					
+HWUSI-EAS610	1	4	40	444	101	0	1	GTACTCAGCAACCAAACTCTCTTCTCTGGTACCGCA	]F][^[]a`XaVY\^N[R`WZ]^V`ZTYXJU_[_BB	chr10.fa		5448888	R	36	108					
+HWUSI-EAS610	1	4	13	25	1969	0	1	TTGCATTTCTTTGGTAAGGGTGGGGTGATGATCATG	`J`b[a`__^aSbaTPRa`_Waaa_Z\NQa_OW]Z`	chr10.fa		5448923	R	36	118					
+HWUSI-EAS610	1	4	22	634	552	0	1	CATGTGACAATGACAGTCGGAAGCTGTATTCTCTCT	`bab_baaa`ab]abaaabba]aYaaaa`b_\U]aa	chr10.fa		5448983	R	36	119					
+HWUSI-EAS610	1	4	32	1166	67	0	1	GCTTGAGCAAGCAGCCACGGGATCTTTTAGAAAGCA	`aa]`_`Z__a[Z[N`_\_Z[WZZUW^_ZUUT\UT\	chr10.fa		5449755	F	36	118					
+HWUSI-EAS610	1	4	47	1761	476	0	1	AGAGGAGACCAGCTAGTGCTATTCTCCCTTAAACAA	`P__][Q]^]]QU][S[R\]]_]X]]W^^]ZZ]Z^V	chr10.fa		5450740	F	36	118					
+HWUSI-EAS610	1	4	62	1673	572	0	1	TAAAGTGTGACACCCTAGTATTGGACAAAAAAAAAA	abb`X_^`abaaaaa_aa_aa^VY`aaaaaaaa__a	chr10.fa		5450906	R	36	119					
+HWUSI-EAS610	1	4	3	22	521	0	1	CACAGTGGCATGGATTTAGAACAGGGCCAGGGCTGA	aZ`abU`a_`XbbZb]QZbababaaaabaaaabab`	chr10.fa		5450953	R	36	119					
+HWUSI-EAS610	1	4	55	171	1370	0	1	CAGCCCTGGCCCTGTTCTAAATCCATGCCACTGTGC	a``a`a`a_aa^_a\_^^^^`a`^^Z^`_\^^\U^`	chr10.fa		5450954	F	36	119					
+HWUSI-EAS610	1	4	67	988	568	0	1	CCCGGTAACCCTGCAGAAGACCCTTTCCTGTAGGAG	a`X^^_`a`aX`aaaaaaa]VXVZaa^HYTTTUX_a	chr10.fa		5451130	F	36	118					
+HWUSI-EAS610	1	4	31	1430	1030	0	1	TTAATAACATCTGCCCTTAGCTTTATTGTCACTAAG	abbaaaa`aa_`a`__`_aa`a_```^_Y^_Y_^^_	chr10.fa		5451388	R	36	119					
+HWUSI-EAS610	1	4	71	342	1780	0	1	GCACAGAGCAAAATCCCAGACGATTTTTAACAAAGC	a]T]aa[JT_`TVNR^YWYUUaYLOQQ\\V_^WY]_	chr10.fa		5451561	R	36	117					
+HWUSI-EAS610	1	4	26	1053	34	0	1	AAGACAGCCATGAGGGGGAAAAACACCCATGCAGGC	ab`a`a___aYX[a`aaZ``^_Y\\TWSYU^VUV\U	chr10.fa		5452088	F	36	119					
+HWUSI-EAS610	1	4	98	757	1376	0	1	AGGCAAGTGTCCAAGAAATGACACATCAACAACAAA	a`_abbb`bZ^[aaaa`]aba_a_aa__aX``^^__	chr10.fa		5453226	F	36	119					
+HWUSI-EAS610	1	4	71	806	1235	0	1	ACAAACAAACAAACAAACCATGCTGAATAAGATTTA	`^bbb_abba`Yabaaaaa_aaaabaaa[`aY`aab	chr10.fa		5453437	F	36	119					
+HWUSI-EAS610	1	4	76	142	2024	0	1	GTGGATAATATCTATTAAATTGTTATGAAATAAATA	a^ba]a`^`Z`_aZ_a``aa`b`aaa`]a`_aaa`_	chr10.fa		5453573	R	36	119					
+HWUSI-EAS610	1	4	41	1614	1125	0	1	GATCTTCAGGAGTTACTGTGTTTATGGTCTTATTCA	^aaa`aa]^_``_aaaba^a`a`aaY[S[a__`a^Z	chr10.fa		5453867	R	36	119					
+HWUSI-EAS610	1	4	63	282	933	0	1	GTCAGCTGCATTCCAGTTCATATCTCCTTTAACATC	`[`aaaababaa`a\aaaa`aaaaaaaa`aaa`a_a	chr10.fa		5454629	R	36	119					
+HWUSI-EAS610	1	4	56	61	177	0	1	TGTATTCTAAAACGGGATGGCTAAAAAGGCCTTGTC	ab_aaababa^Yabaaaaaaaaa_[_V^`aaa_aXa	chr10.fa		5454766	F	36	119					
+HWUSI-EAS610	1	4	92	196	953	0	1	GAAGTTGTCAGGGAGCGGGGGGGGCACAGGAGGCGC	L_TaaR`[``aa_aaI__^`aaaa`a\[aa[\_BBB	chr10.fa		5455074	R	15T17A1T	87					
+HWUSI-EAS610	1	4	50	399	544	0	1	TAGGGCTGACCCTTGGGATTGAATAAGTCATCACGG	_R`_V`abHS^b_]U`GN[_]Sa[NS\W_QSV]Gaa	chr10.fa		5455190	F	36	115					
+HWUSI-EAS610	1	4	59	1090	1270	0	1	GAAGTGAGGCCTCACTCCTTCATGAAGAGGTACAGT	`bababbbab_bbbaaaabababb^`bYbaW___b^	chr10.fa		5455277	R	36	119					
+HWUSI-EAS610	1	4	18	11	708	0	1	GCTGAGCCCAAATCAGTTCATCTGATACCCTGACAA	ab`baaaaaa`_aa]a]]a``a_`a^`aa`_a_a[]	chr10.fa		5455793	F	36	119					
+HWUSI-EAS610	1	4	13	780	1616	0	1	AGCCCAAATCAGTTCATCTGATACCCTGACAATAAG	aa]aaabaaa`aaa_a`_a`a^_Z``aa`^_[___a	chr10.fa		5455797	F	36	119					
+HWUSI-EAS610	1	4	12	880	382	0	1	AGTTATGTCCTTCTGCCTATTGGAGTTGTGCGCTGG	aaababaab_ab`abbababaab_b_aa]`^a_aab	chr10.fa		5456187	F	36	119					
+HWUSI-EAS610	1	4	18	1590	1324	0	1	TGTGCGCTGGCTTCTCACTGGCATGCCTCTGCCTTT	aa^`aaa`_`_`]_^``^Z^\^^UW^^\Y\_\W\]_	chr10.fa		5456213	F	36	119					
+HWUSI-EAS610	1	4	77	856	976	0	1	CAGCTGTATTCAAGGTAAGCTTTTCACTCTCGGTGT	abbbbbaaababbaa_a]aabbbbab`aaaa`a_ba	chr10.fa		5456268	F	36	119					
+HWUSI-EAS610	1	4	4	81	1537	0	1	CAATGTTCAGAGAGCATAGCAGCCACATAGCTCCTA	`Y`^aZ_`Z_aa`aa^\R]aa`a`aa___`a]a_]_	chr10.fa		5456412	R	36	119					
+HWUSI-EAS610	1	4	52	1482	1632	0	1	TGACAGAAATCTAGCAAAGACAATTCATGAATTGAT	_a`_b^aa^_\OX[_a_Y^__U^[_]^aaVU_]`_\	chr10.fa		5457140	R	36	119					
+HWUSI-EAS610	1	4	28	21	1363	0	1	TTCTGTCATCACTCTCTCCCTAGGTTCACATTGAAG	abaab`babaabaaabaa`ba_ba__`_a_]b`ZUa	chr10.fa		5457168	F	36	119					
+HWUSI-EAS610	1	4	27	1190	1700	0	1	GTCATCACTCTCTCCCTAGGTTCACATTGAAGGACC	aV[_a]_Y`\a^_a]``_a\Q`\\\\^Z_\W_W]\\	chr10.fa		5457172	F	36	119					
+HWUSI-EAS610	1	4	57	399	1360	0	1	GAAGGACCCTGACTATGGTTTCTACAGAAGGCAAGG	a`abbaab`bb`abbbbbQabbb_aabaa_b__aa`	chr10.fa		5457200	F	36	119					
+HWUSI-EAS610	1	4	42	1221	770	0	1	GAAGCAAGCACACAGTAGATTAGCTTGGGGTGCCCA	a`XX]a`\`a``SS]K`_a\`a`S^^RRTOPRWYVZ	chr10.fa		5457251	F	36	118					
+HWUSI-EAS610	1	4	13	546	1193	0	1	CATTCTGACCTGTACTCAGAACAGCAGGACAGCTTT	\Ka````aaaaaaba`a``^a\aP_^aaY__Y_aa`	chr10.fa		5457431	R	36	118					
+HWUSI-EAS610	1	4	45	544	384	0	1	CAAGAGAGTCTACTCCTGTTTCTACGACCTGACAGC	aaabaaaaTa`baa_H`a[aaaa`_aa___`_\a`^	chr10.fa		5457478	R	15A20	106					
+HWUSI-EAS610	1	4	55	276	917	0	1	TTTTCATTTAAAACCCCAAACCTAGGGAGAATAAAG	ababb_`bb`abbbaaba``aab`baa_a`_a^S`a	chr10.fa		5458383	R	36	119					
+HWUSI-EAS610	1	4	18	1454	361	0	1	GGTCAGTTTCTAATCTTGTGTCTGTGAAAGTTGTCT	aaI]\^_a___`_a[`a[\_a_a`BBBBBBBBBBBB	chr10.fa		5458771	F	36	66					
+HWUSI-EAS610	1	4	29	1548	550	0	1	TGGAAAATCTGAAATCTGCAGGTCACGCTGGTAGGT	a]bb_a__^`]_babbZ`abZVUW^HR]^Z^`\]_`	chr10.fa		5458969	R	25G10	106					
+HWUSI-EAS610	1	4	98	1001	1496	0	1	TGTGTATGTTGGTGTGTGTGAATTTGAACTTATGAC	a`aaabba`a_Zaa_aab`aa`babaa^^baaa`aa	chr10.fa		5459090	R	36	119					
+HWUSI-EAS610	1	4	69	361	1537	0	1	ATCTGGCTAAATTCTGGTAGCTCAGTCACTGGGATT	a_a_a``a`a_``a_`_Za``^`^_]``_Y]]_^ZX	chr10.fa		5459500	R	36	119					
+HWUSI-EAS610	1	4	68	1450	731	0	1	GGAAAGGAAGCAAACATGTACACACACAAATACATA	]]_a_Y\``]a`]W_b[`X`_a^Y^]`a^`_a`_^a	chr10.fa		5459812	R	36	119					
+HWUSI-EAS610	1	4	23	123	1745	0	1	ATCTCTCTGCTCCCGCAACACTTGCTCCTCTAGGGT	Zaaabaabbbabbbaabbb^aaaaaaaa_aaaa]aU	chr10.fa		5459902	R	36	119					
+HWUSI-EAS610	1	4	9	1436	861	0	1	GAAATGTAAACCTTTTAAGTGAAAGTCTTTCAACTA	aa_aZZ^aaaa_aaabaaaW`[a^WN__a___a_`_	chr10.fa		5459980	R	36	119					
+HWUSI-EAS610	1	4	75	343	498	0	1	ACTAATAACATGTACAGAATGCTCACAGTTCAGAGA	aababaab`aaa`aaaaaa`aaaaaa`a\a_aaaaa	chr10.fa		5460051	F	36	119					
+HWUSI-EAS610	1	4	9	1483	1962	0	1	ATAGCACATTACCACTGAGCCTCACCTCTCTTGCCT	a_\[[`Ua`_`\V^\_^\`^^]PWUTVUSWWVVTYV	chr10.fa		5460165	R	36	118					
+HWUSI-EAS610	1	4	21	383	1300	0	1	GACGACAGAGCGATCTAATTTAATCATTGTGATAAT	abb^W``_^_a\RZ_`a^^aaa\]aS`a`WYI`^__	chr10.fa		5460486	R	36	118					
+HWUSI-EAS610	1	4	26	45	707	0	1	CATGACCATTTGTTTATATGTTACATGCAGCTAATT	a^abYaaaaa`a]_^a\^_a^_aa__`__``_a`__	chr10.fa		5460686	F	36	119					
+HWUSI-EAS610	1	4	3	89	1404	0	1	TTTGTTTATATGTTACATGCAGCTAATTTGACACTA	abbb`_abba_]Qaabbbba_`babbaabb`[UU_b	chr10.fa		5460694	F	36	119					
+HWUSI-EAS610	1	4	39	998	690	0	1	GTGTGTCTGTGGGGGGGCACACATGCATGATGTTGG	a_a^`^^aa\a]aa`aaZ`U`^``[\\_aW]^[^Wa	chr10.fa		5461323	F	36	119					
+HWUSI-EAS610	1	4	54	628	134	0	1	TGATGTCCTGAGCACCATAGCACATGCCCCTCCTCC	a`^R[YaSaa`^^a_]`^\a^Z]]GQ\`]V_XUPU^	chr10.fa		5461357	R	36	117					
+HWUSI-EAS610	1	4	22	952	1126	0	1	ACCATGATGTCCTGAGCACCATAGCACATGCCACTC	aXZa\X_Y]GXUQ\Pa_`Q\_PZ[[^[YFX[\HY^`	chr10.fa		5461361	R	32C3	103					
+HWUSI-EAS610	1	4	95	736	1295	0	1	GTGTATCTCACCTTGATCTTGATCATGAGTGTACAC	`P_^aaa`aa`^aab``aaaaaa``___a[aW__`_	chr10.fa		5462207	R	36	119					
+HWUSI-EAS610	1	4	32	403	1265	0	1	GGGCCCCTTAAAGAAAGATTGTTATAAGGAAAGACA	a]^bbaa_[^a_a]ZP^W_aa_`V[IXa`\XT`Z`_	chr10.fa		5462362	F	36	118					
+HWUSI-EAS610	1	4	32	250	329	0	1	GGCCCCTGGAGTTCACTGGAAATTGGCCATTTTCTC	````ba_``W`^^_]_]_^X\___YV\``^__^_aa	chr10.fa		5462679	R	36	119					
+HWUSI-EAS610	1	4	94	277	2004	0	1	TTGGTACCCTTTGACCTTAGTGCCCGAATGCAAAGC	a_a`Vb_]a_\_aaa^HR`aN_Ya`aZ_TWVaYBBB	chr10.fa		5462754	F	36	105					
+HWUSI-EAS610	1	4	93	753	851	0	1	AGGGAAGCCAGCAGAGAGCTTAGAAAGCTCAGACAG	abbbabaa`baabaaa`b`bab``a``^a`a`aaab	chr10.fa		5462903	F	36	119					
+HWUSI-EAS610	1	4	29	1630	1365	0	1	CTTTGTCCTCCTTCCTGTTGAATTAAGTTATTCATT	aaaZ_]_]\_^]_NZaaZ`aYS^[^U^X^^\^X^]`	chr10.fa		5462983	R	36	119					
+HWUSI-EAS610	1	4	17	544	2015	0	1	AAGGAGGACAAAGAGTGATGTATCACAAAGGAAAGC	a_T]`^^a]ab`^a`]aS``Ta_`````VPQ^aa_Z	chr10.fa		5463006	F	36	119					
+HWUSI-EAS610	1	4	97	640	102	0	1	GACAAAGAGTGATGTATCACAAAGGAAAGCCAAGTG	\TXa^a``ZG[aaaYa_^_]]``\\]a``\]][_Wa	chr10.fa		5463012	F	36	118					
+HWUSI-EAS610	1	4	51	35	853	0	1	AGTCCCCTGAAATTGTAAGCCCCAACTTTCTTCTAT	IaV_bbbbbb_baba^__a_ab`U``bbabbbbb^^	chr10.fa		5463579	R	36	118					
+HWUSI-EAS610	1	4	68	895	897	0	1	AAGTTCCTTGCACAATCACTTGCAACTTTAGCCACC	_`a\`````_^``abaaa`a__^]__```a`aa_W`	chr10.fa		5464319	R	36	119					
+HWUSI-EAS610	1	4	53	18	493	0	1	GTGTGTATGCATGTATGTTTGTGCAAGTGCATGTAC	a]`^aS_aba]a`]`^a___a\a`aZaW_____ZW_	chr10.fa		5464698	R	36	51					
+HWUSI-EAS610	1	4	48	1034	845	0	1	CAAACAAGTCTCTGGACTAAGGGAAGCAGCTGACAG	aabbR\`a_UaP_ab_^a`_a^ZZa`[^aU`]PY_]	chr10.fa		5464820	R	36	119					
+HWUSI-EAS610	1	4	1	580	284	0	1	TTTCTTCCTTGTCCAGTAGTTCATGGTTGGCCTATT	NJ[ZJXRS]`aR`[Xa_X`Y\XR`\UW]W_[P`^BB	chr10.fa		5465010	R	36	109					
+HWUSI-EAS610	1	4	56	1251	949	0	1	TGTGCTGCTGACAGCCACAGATGAAGCATCTGCTCT	`\__^W\_UGNQW^`aa_P^Y]YX\`Y`^R^[K[T[	chr10.fa		5465248	F	36	117					
+HWUSI-EAS610	1	4	85	1220	898	0	1	GAGATTTAGATCCCTAGTAGTCATGGACAAGCCCAT	aabaaaaaaaaaa_aaa_aa___`a`]^a`X_`^a`	chr10.fa		5465299	F	36	119					
+HWUSI-EAS610	1	4	94	724	666	0	1	TGCAATCCCCACCATCAAGAGAAAAAGAAAGAGGAT	abbb_aa`_aaaaabaa`b`baa_a^aaaabaaa`_	chr10.fa		5465336	F	36	119					
+HWUSI-EAS610	1	4	38	450	242	0	1	AAGAGGATCGCTGGTGCAAACTCAACATGTGTTCAA	ab^JbaYa\H`WTaU]ZQ[]ZX^a\\aaQY`^_^a`	chr10.fa		5465364	F	36	117					
+HWUSI-EAS610	1	4	13	1386	853	0	1	CTTTAATACCAACTTCCTTTTTCTTTCAGACTTAGT	ababaabbaaaa_bbbaabbbaaaba`^^aaaaaaa	chr10.fa		5465663	R	36	119					
+HWUSI-EAS610	1	4	51	1408	1547	0	1	TGTTTGATGGAACTAAAGGCAAGGCTGGAATGAAGG	aaababaaababababb]aabaaaaa`W`a`aaa`a	chr10.fa		5468071	R	36	119					
+HWUSI-EAS610	1	4	97	1485	297	0	1	GCTTGACTGTCTGGTGAGTTGAATTCAGCCTAGTAA	^aaaY_\ZY[]^_ZPX]^_aI`^`^``Z_^_`\U__	chr10.fa		5468302	R	36	118					
+HWUSI-EAS610	1	4	67	232	1775	0	1	CCAGGACAATCTGAAGAGAATCTTCATTGAAGCACG	aa]aaaa^_`b_a^a_]_T__a``aa``a`[_a`_]	chr10.fa		5468541	F	36	119					
+HWUSI-EAS610	1	4	2	1707	740	0	1	ACAGGTCTTCATCAGGTGATGAATCAGATCTCCATC	aa__a]`_a`__`a^YOaa`a^__^a^]__^^^`__	chr10.fa		5468759	R	36	119					
+HWUSI-EAS610	1	4	34	1237	1681	0	1	AGTCTACAGACAAAGCAAACCTTTGAGGAGGAGCAT	aa[aa[``_^_`_^aaa_Y[`_``^Q`Z^`ZV_P\W	chr10.fa		5468893	R	36	119					
+HWUSI-EAS610	1	4	32	607	831	0	1	ACCACTGAAGGGATAGTCACATCCTGGAATTATCTT	aa```aaaa^]a_aaa_a`aaa`aaa`__a_[`_`a	chr10.fa		5469040	R	36	119					
+HWUSI-EAS610	1	4	69	1721	1565	0	1	AAGGCAACTATGACTGGAGTAGGGGGAAGAAGGAGG	_`]`aba_aaaa``_`^TaZY^Q[\^]]`^Ua[X``	chr10.fa		5469323	R	36	119					
+HWUSI-EAS610	1	4	72	152	46	0	1	TCCTCCCCTGTCTCCAAGAGGATGCCCCCCCCAACC	`a``a`aa`_X_a`_X__`_]WW]``a^\^^\VNQX	chr10.fa		5470164	F	36	43					
+HWUSI-EAS610	1	4	36	286	139	0	1	AGAGGATGCCCCCCCCAACCTCCCACCCCACCAAAC	`_`\``_^```]\a`_O]\_Q\^\T^^\XNX]QYHZ	chr10.fa		5470180	F	36	118					
+HWUSI-EAS610	1	4	75	339	280	0	1	ATGTGTACACCCATTAAGTCAAGTTCATCTCTAATG	Ybbab]abbb\aaaa[WbPa_Z`Sa`]aaaa`]aab	chr10.fa		5470564	F	36	119					
+HWUSI-EAS610	1	4	33	1445	1985	0	1	TCATGAATATTTTTTGAGAGCCTTGAATGTTAACCA	[]_aaQ_\XYaab`aaaa[a^L]aa___aZ_[UWS\	chr10.fa		5471076	R	36	118					
+HWUSI-EAS610	1	4	50	628	727	0	1	TGAACTGAATATGTAGCTGGAAATACTCTCCAATGT	aaaaab`^`aaab_aaaaaa]a`aa_a\]]_a^_b_	chr10.fa		5471343	R	36	119					
+HWUSI-EAS610	1	4	65	457	409	0	1	ATAAGTTCTTCTTGGCTACGGGAAAAGTGTTCAGAA	aabbaaaa`aaaba]```_baa`a`aa]a_a[`baa	chr10.fa		5471700	R	36	119					
+HWUSI-EAS610	1	4	37	618	1214	0	1	TTACGAATAAAGAAACAGAAATATATAGACAACTAG	a`W`aaaaaa_aaa`[]^`^aa_a``]a_XZ\]``a	chr10.fa		5471981	R	36	119					
+HWUSI-EAS610	1	4	27	1172	342	0	1	AGCTCATATTTGGCTTCTTGAGAAGAGTGTCTTGCT	aaaaa`aaaaa`a`aa_baW]a_`\^_Y_]Z`_`_`	chr10.fa		5473256	R	36	119					
+HWUSI-EAS610	1	4	21	78	1298	0	1	GAGGGCTGACAATGGGAAGTCCATGGCATGCCTGTA	_Xaaaa`^]ZFZaa^_U_`[aaaYa``]UU^_``U`	chr10.fa		5473411	R	36	117					
+HWUSI-EAS610	1	4	56	1335	1908	0	1	AGCCCATACTCTCAAAGGCCTAGAGACCTCCCATTA	_UVVR]OYUVU`^\S[[`YZLV[ZPHTGXDLWTV[_	chr10.fa		5474646	R	36	114					
+HWUSI-EAS610	1	4	19	1114	556	0	1	TTGTTTTCCCTGAGGCTGTGAGTGTGTCAGTTTCAC	abbYYa`aaXb^`aRaaa`]T_FY`UVS`XBBBBBB	chr10.fa		5474782	R	32G3	89					
+HWUSI-EAS610	1	4	45	1096	570	0	1	AGTTCAGTACATTGCAAATAGTCCAAATAAACTAGA	ab_aabaUa^aaJ`aaaaa`T_Y^```^__a]aa]X	chr10.fa		5475807	F	36	118					
+HWUSI-EAS610	1	4	46	1461	739	0	1	ATTCGATTTTTGTGTGTGGGGGGGAGGGCTTCACTG	ab`]`babbbbba][b`\baZaa_^`a_aaa^[`aa	chr10.fa		5476077	R	36	119					
+HWUSI-EAS610	1	4	81	923	1175	0	1	CGGCTCCTGTAGAGTTACTTACACTTTAACAGCCAG	^a`WWX^ab__`_a^`a_aaY__]```_aU]a_^a`	chr10.fa		5476488	F	36	119					
+HWUSI-EAS610	1	4	13	1643	1375	0	1	GGTTCCTGTGCTGTAACGAGGGCAGGCATCTGTTCT	a`X`b]][H[`aWW`^R]_XQYXV\Oa`^^ZZ_\T]	chr10.fa		5476537	R	36	118					
+HWUSI-EAS610	1	4	62	724	1211	0	1	AAATGACCTTGTTATTTCAATCTAGCACTTATCACT	\\X`VS^`bb`_b[bababbb`bWQ][\aaaaVY\`	chr10.fa		5476761	R	36	119					
+HWUSI-EAS610	1	4	28	1431	962	0	1	ATGCCTGAGTGAGCTCCTGTCTCTGATTCCCCAACC	aaaaaaba_Y`aZ``_aa`^`a_`a^``\^U_\`^_	chr10.fa		5477047	R	36	119					
+HWUSI-EAS610	1	4	59	1585	1029	0	1	CCTTGTACATACTGAACACATAGTCTTCCACTGACC	abbb``babaaaaaababbaaba_aaa`aa`a]aaa	chr10.fa		5477285	R	36	119					
+HWUSI-EAS610	1	4	93	1274	1658	0	1	AGAAGCAAAGCTCAGATTCCCTGGATCTAGGGAAGG	Vaba_Y\bbb\Y[aa^`aUa`b[b]\Xb_`aaQ_ab	chr10.fa		5477416	F	36	119					
+HWUSI-EAS610	1	4	97	1339	1972	0	1	GGAAGTGCTTGGACACTGAAATTGATCGGCAAGCAT	a\QW^PXRWZRNOX\[`_^VX_[^_VXJZXYNXU[Y	chr10.fa		5477778	R	36	117					
+HWUSI-EAS610	1	4	26	26	307	0	1	AGCTAGGCATGGTTGAACAGAGAACGGTAAGAAGTA	`bb_Y_ab`aaaYabaab`ba]O\aab^ababaaP_	chr10.fa		5477866	F	36	119					
+HWUSI-EAS610	1	4	16	1127	1680	0	1	CAAAGCCCATCTCTTCTTCTTGTTCCATTGTACCAT	aaUaYYaJa``_\aYWa`N`YYITOQaZ[PR^XV_a	chr10.fa		5479078	R	22G13	104					
+HWUSI-EAS610	1	4	67	918	1970	0	1	TGCAACTACTTATAGCAACAGTGTTTTAAGAGAAGG	_a_a`WDXI\aaaa`bVbbb_M^aa\]a`]_][`aa	chr10.fa		5479249	F	6C29	109					
+HWUSI-EAS610	1	4	10	1500	173	0	1	ATCAGGATGACCCAGAGTATCTGATCCTCCTGTCTC	`]a_RJYZX`^YU]ZWRQ`_`U\a\T[[_\N\\YSB	chr10.fa		5479319	F	36	113					
+HWUSI-EAS610	1	4	62	996	1850	0	1	GTGATTACAGGGGTACACAACCACACCCAGTTTATA	`ZVFS\XN\a[`PZ``[\U\__ULX]W]ZTLWJO]]	chr10.fa		5479370	F	36	116					
+HWUSI-EAS610	1	4	76	1651	1506	0	1	CTTCTCGGTAAGATCACAGCCTGAGATGTGAGGAGC	abb`b^LaQb`aaaaaa^__a`Zab`a_GX^_[Z]^	chr10.fa		5480531	F	36	118					
+HWUSI-EAS610	1	4	32	539	1550	0	1	AGCAAATGTTACTCCTAAATTGTGTTGAACTGTATT	[_a\a`_aa```]_aa]]`aa_\`Z]___]a^_[ab	chr10.fa		5480594	R	36	119					
+HWUSI-EAS610	1	4	85	943	1058	0	1	GTACCACGGAGGAGGTTCTGAGTGTCCCTGGCCACA	a`a^````^Y^\R_aZ`]^`XXKZSX\\X^Z[NQNT	chr10.fa		5480702	R	36	118					
+HWUSI-EAS610	1	4	21	1658	1360	0	1	GACATGAGCCCTGAGAATCCTGTGAGGTGTTGGATG	`\`__]R][[^a\V^[VU_VZ[PPFXUU_YRPVPW[	chr10.fa		5481344	R	33T2	96					
+HWUSI-EAS610	1	4	44	145	121	0	1	CACTGTGGTAGGTGCCATGGCTGCCATGTAAATGGT	a`bbbZab`aaa_aaaZ_[aa`aa`\TaNV_aS``B	chr10.fa		5481437	F	36	114					
+HWUSI-EAS610	1	4	48	819	1406	0	1	AGGGAGGTGTGAAGAGGATCGTCCCAGCCCTGGAGC	I_aa_[`Zaaa__aX[a__a_\[a`^``[`\_ZGZ_	chr10.fa		5481494	F	36	117					
+HWUSI-EAS610	1	4	97	1153	804	0	1	TACCTTGGCAACCTTCTCATTTGAAGAAGTCTGAGC	aa^Yaaa_[_a^__`_`^]__^_]___]_\_`^_W^	chr10.fa		5481572	R	36	119					
+HWUSI-EAS610	1	4	41	289	1312	0	1	ATCTGCCCATCTATTCGTGTGTCTCTAGACTTCTCT	a\a_abaZWa`a`a_a`QZL_W``a[^^aaa^`_a]	chr10.fa		5481614	F	36	118					
+HWUSI-EAS610	1	4	81	1197	431	0	1	TCAAACTTCAAGCCATATTTTCCCTCCCTCCCCTTT	a^a_a^a`_```Z_``^__`^X^Z]^UZ^XV^X^ZX	chr10.fa		5482012	F	36	119					
+HWUSI-EAS610	1	4	55	399	353	0	1	GGGATGGCTCAGAAAAGGGGAGGGAGGGAAAATATG	aX_]]a``aa``X```aa`]RZ]^^a`^YY[SZV_^	chr10.fa		5482025	R	36	119					
+HWUSI-EAS610	1	4	42	1588	1078	0	1	GAGAGGGGAGAAGGAAAAATGGAAGGAAAGAGCCCA	a```baa`Za^`aaYZa^_a_a^^``\aa^\Y^N__	chr10.fa		5482740	F	36	119					
+HWUSI-EAS610	1	4	57	163	914	0	1	AGTAAGGCTGTGGCAGAGACTCCCAGGAGACAACTA	ab_babbbab`aaabb_\_a_aaaXZ^XZW]U]`Y]	chr10.fa		5483280	R	36	53					
+HWUSI-EAS610	1	4	23	1495	60	0	1	ATATAAACTGACCAGACCCCCGGCCAGAGTTCCCAG	a_b`a^a_aI]S`]]``TTVRPKZSUSBBBBBBBBB	chr10.fa		5483434	F	36	79					
+HWUSI-EAS610	1	4	100	1418	841	0	1	CACTAGGGCATCAAGCCTGTACAAGACCAAGGGTCT	ababba`aab`abbaaabbabaab`b^abaZaaGa]	chr10.fa		5483567	R	36	55					
+HWUSI-EAS610	1	4	9	221	110	0	1	TACAGGCTTGATGCCCTAGTGTTGGGGAATACTAAG	aabaaa`aaba_aaaaU_aNaXG_aaa[_______a	chr10.fa		5483582	F	22A13	107					
+HWUSI-EAS610	1	4	89	1243	1457	0	1	CTCAGCACCTTAGTATTCCCCTACACTAGGGCATAA	a__PP]XV_WS\_T_[^]`ULZ]QTLVY^MZFY_BB	chr10.fa		5483590	R	34C1	20					
+HWUSI-EAS610	1	4	31	1613	1301	0	1	GGAGAAGTAGGGGAGAGGAAGAGCTTTAACAGCTGG	aaWXYT[J^Y_RXYFLa]aZ_YPYJLW[QNVKNF[^	chr10.fa		5483959	F	14A18A2	95					
+HWUSI-EAS610	1	4	88	600	15	0	1	AATGGAAAGTTAAGCACCTATTGCTGACATCACCTG	_b_bbbabbaaba`ababbabb`]bbb`aaaa`_aa	chr10.fa		5484308	F	36	119					
+HWUSI-EAS610	1	4	75	1167	1463	0	1	CAGATGCAGCTTGGATGCTTTGGATCCTGTGTCTGA	abbb`b`aa``aba[aa_baaab[V[b[b_b]I`a`	chr10.fa		5484348	R	36	118					
+HWUSI-EAS610	1	4	60	631	1452	0	1	GGTGATTGCTGTGATCCATAGGTGTCATAGCTCATT	a`V[``a`_aa[^`a]^^a^aaYaX`_aa`_]]``^	chr10.fa		5484468	R	36	119					
+HWUSI-EAS610	1	4	60	730	241	0	1	CTGGTGATTGCTGTGATCCATAGGTGTCATAGCTCA	abaaXaa```_aa]a___a_a`aaU_]\```[]`]^	chr10.fa		5484470	R	36	119					
+HWUSI-EAS610	1	4	82	1686	1721	0	1	GCACAATAACAACACTACATATCTGGTGGCATGAAT	a`a_a_a_ZX^_[QO[_\VY][`aQJS\`W\YZ]X[	chr10.fa		5484510	F	36	118					
+HWUSI-EAS610	1	4	39	429	1025	0	1	GACCTCAACAACAACAACAACAAGAGACCAATCGAC	Yababa[`aabaaaabb_]_aa_ba`aa`aaaa`\]	chr10.fa		5484998	F	36	119					
+HWUSI-EAS610	1	4	67	319	1328	0	1	ATTGCCTATAGTTCTTAGTCTAGGGTGGAAACCTTG	_`aa_aa_`aa`aaaa`Z^^aaaa__ab]Z_^`a^X	chr10.fa		5485065	R	36	119					
+HWUSI-EAS610	1	4	17	969	378	0	1	TAACCTGAAGTCTATTCACACTGCTACAGTGACAGT	aaba`aa^]`ZW^`aa_`_`__`^a`__\Q[[UZWB	chr10.fa		5486464	F	36	114					
+HWUSI-EAS610	1	4	97	1332	115	0	1	AGTTACATCATTTTCCCCAACATTTGTTTCCTCCCT	ab^bbabbaaaa`aaaaaaaaaaa`Y`_a_`a]__a	chr10.fa		5486592	F	36	119					
+HWUSI-EAS610	1	4	54	653	36	0	1	TTGGATGTGAAAGAGGCCAGAGGAGAATTTAGGGAG	a`\`]_`U_UR[XN\^_]P]U]]W_XU]]TT][YT_	chr10.fa		5486635	R	36	118					
+HWUSI-EAS610	1	4	54	1656	1575	0	1	CATGGCTAGGAAGAACAATAGCAATGGAACCAGCAA	aa_\``\FX\YZ^``_]]]]`]V]^UHW]YPP[[VS	chr10.fa		5486677	R	36	116					
+HWUSI-EAS610	1	4	14	1064	1504	0	1	CACATTTATGAGGTGATAATTTAGGGATAGTAATGG	abaWbbabaaNXaIaaa[]]`^R^`\\`W^G^^^a`	chr10.fa		5486737	R	36	117					
+HWUSI-EAS610	1	4	79	1694	200	0	1	TTAGAAAAAATTATAGAAACATAATGCAATTATGTA	aaa__aa_`\__a`_L_`a_a^`a_^]a__^`^NYa	chr10.fa		5487530	R	36	118					
+HWUSI-EAS610	1	4	33	1437	1824	0	1	AGATACAAATACCCCAGGATTGGAATTATGTGAGGT	`baaY`aaabba\[\^ba]aa`Y]_aa]aa_a^`aY	chr10.fa		5488111	R	36	119					
+HWUSI-EAS610	1	4	55	154	797	0	1	TTCTTGTCTAAGGAGAAGGATTCTAGGTATGATGGA	aaababaaaaaba^a__aa__`aaabaZaaaaaaa]	chr10.fa		5488691	R	36	119					
+HWUSI-EAS610	1	4	19	522	302	0	1	ATATGACATTTGATGACAGAACACATGGGCATGTTG	ab`baba`aaaaa_a`aaaaaaaaa_aa`^a`aZaa	chr10.fa		5489050	F	36	119					
+HWUSI-EAS610	1	4	24	1155	1099	0	1	TGTTTTGAGCAAAGACGGGCCAAAATTAGCATGTCC	ab`aa]UTaX_`^a_U[[a`Z`___]_ZW^WWU\\[	chr10.fa		5489106	F	36	119					
+HWUSI-EAS610	1	4	60	939	1929	0	1	TAACATAGAAGTTGAGTTTAGCATCCTTACCTGGCA	aa`]Y_``X`^Y``_`]a`a___a]]a_`]Z]]S\^	chr10.fa		5489318	F	36	119					
+HWUSI-EAS610	1	4	71	540	1587	0	1	AGTGCCAGGTAAGGATGCTAAACTCAACTTCTATGT	aa^b`a`aaXa`]`a`a__a_W_`^_a_``_`]aa_	chr10.fa		5489320	R	36	119					
+HWUSI-EAS610	1	4	53	262	144	0	1	ACCTTTGGCCAAGCCCTCTTGTGATTAAGCACACTA	aaaaaaaabaaaaaa`aa`aa^b`a`a_aa``a_aa	chr10.fa		5489540	R	36	119					
+HWUSI-EAS610	1	4	65	705	1443	0	1	CTGGAGACATGAGAGCTGCCAACCTTTGGCCAAGCC	abb`]Zbbaaaabba^]a`a_aa`b`b`aa_b_`a]	chr10.fa		5489561	R	1A11G22	41					
+HWUSI-EAS610	1	4	18	374	476	0	1	ATCCTTCTGCATTTTCAGGCATACGGAAAGACCGCA	aaa_`a`aa_aa`^^aa]^^a_^__[`[X^a[\`__	chr10.fa		5489666	R	35C	83					
+HWUSI-EAS610	1	4	21	578	104	0	1	ATCCTTCTGCATTTTCAGGCATACGGAAAGACCGCC	a_T[\\ZV[\^_\WY\_\^__UWY\YWYYWYWWW\Y	chr10.fa		5489666	R	36	119					
+HWUSI-EAS610	1	4	55	401	167	0	1	ATGCAGACTTATAAGTGTTGAGTAACTGCCTCTTCA	aaabaaaabbaa`aa]a`aaab`aaaaaa_a`_`aa	chr10.fa		5489804	F	36	119					
+HWUSI-EAS610	1	4	6	1611	444	0	1	CAAAGCAAACAATAACTCAATTAGAAACCAGCCAAC	^b_aRWaa`__[`Y`[abTXaa\XZ^_XQ_][TX]_	chr10.fa		5490513	F	36	119					
+HWUSI-EAS610	1	4	99	579	1616	0	1	ACAGACTGATTTCTAGAGTGATTGTACCAGCTTACA	^`a```aa[^`^a`_`RaSa[`aa_ba_]_a_^_`a	chr10.fa		5491768	R	36	23					
+HWUSI-EAS610	1	4	74	509	509	0	1	ACATGGTGGGACTTGTGCTTCTAGTTGTATATGTAG	[_V`aV_abZK]_a`[a__aa`__]_\]aba_a\X`	chr10.fa		5492565	F	36	33					
+HWUSI-EAS610	1	4	90	186	1757	0	1	TGTCTTCTCAGCTGCCATCGCTCAGTGAGCCATCTC	`b]bbbbbab_bbabbb^aab]`ZYD[\\aaYa]\^	chr10.fa		5493011	R	36	117					
+HWUSI-EAS610	1	4	96	411	1230	0	1	TGGTGCCCATGGGGATCAAAAGAGGCCATTGGATTC	abb\bbbbaaaa`a`^aa`a`a`a_`aa_a`\ZU__	chr10.fa		5493122	R	36	119					
+HWUSI-EAS610	1	4	62	605	1797	0	1	ATACACCACATATATGCCTGGTGCCCATGGGGATCA	abbaaaa`aaaaaa`aaaaa_Z``a_P``Z``^_^^	chr10.fa		5493140	R	36	119					
+HWUSI-EAS610	1	4	19	226	1377	0	1	GAGGAGCTTTTCATCCAACACACCACCTTCCAGCTC	aTab`abaabaaaabaaaaaaa`ba`a`abb^aa_a	chr10.fa		5493771	R	36	119					
+HWUSI-EAS610	1	4	95	444	874	0	1	GATGACTGTTTACAATGTGCTCGAGGAGCTTTTCAT	aXN]aT]`a_aaUYX\_L^a[\a`]\]a[a\[]WRX	chr10.fa		5493793	R	36	118					
+HWUSI-EAS610	1	4	68	1264	154	0	1	GGGCTGAAGGAAGCGTGCAGTAAGTGTAGCCAGGTC	aaa`aa^a^a`^T^a]a^aa_`_PZ][a^\\^\^U`	chr10.fa		5493875	F	36	119					
+HWUSI-EAS610	1	4	35	1268	1101	0	1	GAAGCGTGCAGTAAGTGTAGCCAGGTCACAGTTCCA	a_W_\_\][\a`_Z_^a]a`^]]]_UY]_`^Y_YTZ	chr10.fa		5493884	F	36	119					
+HWUSI-EAS610	1	4	44	180	1191	0	1	GTTCTGTTGCACAGTGCAGTGACCAGGTAATGAGAC	XHUabbaaa\_Ya_S_UV\P``_]_^^J^\`a\_X]	chr10.fa		5493946	F	36	117					
+HWUSI-EAS610	1	4	37	1514	511	0	1	AGCTGTAGCGTCCCCAGCTAGGAGTCTGTTAGGTGA	aXV^]G_a]YO]^`Q^a`\\`[LUO^\`\`BBBBBB	chr10.fa		5494261	R	36	91					
+HWUSI-EAS610	1	4	89	982	24	0	1	AGAAATATAGAAGCTCAGCTTCATCTTTGGCCTTTG	ab`baba`a``^a_`__`^`a_^a_`_W_QSWa`[B	chr10.fa		5494643	R	36	114					
+HWUSI-EAS610	1	4	62	1195	1975	0	1	GTATGCCTGGAGCCCAAGGAGGCAAGAAGAGGGAGT	a_a``^_\[`_^Y`V_`aZ\Z\UYWZ\X\W^\]P`W	chr10.fa		5495285	F	33T2	28					
+HWUSI-EAS610	1	4	69	1111	1649	0	1	GTATGCCTGGAGCCCAAGGAGGCAAGAAGAGGGTGT	aaaaa``a```a`_^\]a^aa`\``\`^`\`^_U`\	chr10.fa		5495285	F	36	62					
+HWUSI-EAS610	1	4	67	1555	781	0	1	CAGACCTCACAAAAGTCCTGTGGGAGGAATGTTGGA	ab]a`a__baaT_^^W^X\aPY[[Y^HT]N]Y^^a_	chr10.fa		5495538	F	36	118					
+HWUSI-EAS610	1	4	7	637	1817	0	1	GTGCAATCTAGAGAGGGTATGATGAGCGTCCAGGAC	ZFZ``RT^`HL[a^]Z]MV`^\YXKQaYGR[]UYYB	chr10.fa		5495806	F	36	110					
+HWUSI-EAS610	1	4	18	964	1795	0	1	AGAGGGTATGATGAGCGTCCAGGACCAGGACAGTGT	`abbbb\b]`_bbb]]^\aa]aba`aaabaaa`_a`	chr10.fa		5495817	F	36	119					
+HWUSI-EAS610	1	4	30	1305	50	0	1	GTTTTAAATGTCAGATGCCTAGAAGCACATGATGGT	a_aa``__`_X___]]V\\_`W\YUV^Z]ZQU]ZRS	chr10.fa		5495933	R	36	118					
+HWUSI-EAS610	1	4	50	754	562	0	1	GTGGGGAGAAGGAAAAGTATATTTCAGTAAGTCAAG	``aa^a_a_^aa^`a_a[_a]aa`_``W_Y_]T^]a	chr10.fa		5496259	F	36	119					
+HWUSI-EAS610	1	4	75	347	939	0	1	ACCACATCACATCCCGTGACCTCCCTCTCCTCAATG	aa^U_]Ra]^VV]]ZYN[G\`\`a]^VQU]Q\BBBB	chr10.fa		5496298	F	36	100					
+HWUSI-EAS610	1	4	71	30	1006	0	1	TGTGCTTTATTTCATCAATTATCCTAAACAGGAATG	Z`aba`aZ`bbb_ab`XP[[_`bb_b^\``]^_`aa	chr10.fa		5496658	F	36	119					
+HWUSI-EAS610	1	4	57	1775	1241	0	1	CACCACAAAGCATTTAAAATGACAGGAATTAAGAAG	aaabbabb`aaaaaaaa`aaaa`aa`_```___``a	chr10.fa		5496823	F	36	119					
+HWUSI-EAS610	1	4	47	867	356	0	1	GAGCTGGTAGGAGTCAAATTTTGCCTTTAAGTACAA	a^aaa`aZ^`a]a^`_a^_aaa`_`aaa__`Z^__`	chr10.fa		5496993	F	36	119					
+HWUSI-EAS610	1	4	39	1094	1341	0	1	TGAGTGATCCATTCTCACCCTAGACTTCAAGGCCAT	aa_a^`a_\[]`a]a^`__^_aa]^a]^_^^\XUZ`	chr10.fa		5497050	R	36	119					
+HWUSI-EAS610	1	4	62	716	1620	0	1	CCAACGGCAAGGCCTTGTATTCAATCCTCACTACAG	abbaaa_aaaa_a_aaa`bba_aa__`a`a`a```a	chr10.fa		5498660	F	36	119					
+HWUSI-EAS610	1	4	18	170	1130	0	1	ACGGCAAGGCCTTGTATTCAATCCTCACTACAGAAA	I_bba[abbbbbbb\`aaa\abbbaa\aa^a^ba`W	chr10.fa		5498663	F	36	118					
+HWUSI-EAS610	1	4	71	1281	1551	0	1	GAGGTGGTAAGGATAGGAGAGATAGTTAAAGCAGGA	aUXVMYYXHPS^VX^aXPXVV\SVUMVYYWXVXYUB	chr10.fa		5499464	F	36	113					
+HWUSI-EAS610	1	4	49	520	781	0	1	AGATGCAGAACTCTCAGCTTATCCTGTACTGTGTCT	`bbabbbbaababa``bbababbaba`a`b_\aa_a	chr10.fa		5499957	R	36	68					
+HWUSI-EAS610	1	4	50	209	372	0	1	AACCGGGTCACACCTTCTAATCATGCCAATCCCTGG	aS`HPX`Za__`RXVa```YQZU\^a``RT_a_BBB	chr10.fa		5500081	F	3A32	93					
+HWUSI-EAS610	1	4	72	1525	172	0	1	ACCAGGTAGTAGATCATAGACACTTGACGTAATGAT	]_``\WH[^M^QYPSb_[QYa__a`PXXT`__`F_`	chr10.fa		5500202	F	36	116					
+HWUSI-EAS610	1	4	3	1733	1626	0	1	CCATCAAAATGTGAACCCACCATGCTTTTACCTCCT	a[``aZR_\WYV`UTV]`a_a`ZFO[__XRTUYZ^_	chr10.fa		5500508	R	36	117					
+HWUSI-EAS610	1	4	53	692	1173	0	1	TTTTACTACAGTGTTTGGGGCCTGAGGACATAGTAG	aaaab[aa^Ua]`]a___a``]_a_a`]__^^_Z^_	chr10.fa		5500864	R	36	119					
+HWUSI-EAS610	1	4	8	537	433	0	1	ATAAAGGATGTCTTCAGTTCTTCAGTGTGGCCAATG	aaaa_aa^\a_]aa__a]___`_]\[`Y^_]]___`	chr10.fa		5500900	F	36	119					
+HWUSI-EAS610	1	4	31	1676	1307	0	1	ATGAATGACAACAAAGAAAGAGCAAGAAACATGTCA	abV\aaa][`a`YV]]Z_`Wa`]`]Z_][``__UBB	chr10.fa		5501025	F	36	110					
+HWUSI-EAS610	1	4	80	735	1815	0	1	CTTCCACACCTTGGAGGTGTTGTTCTTTTCCTGAGT	abbab``a_`aaa]\a]Ta`aa\a_aaaa_^a_`a_	chr10.fa		5501120	R	36	119					
+HWUSI-EAS610	1	4	68	189	1553	0	1	AAGCCATCAGAGATGTGCACCGGGAAACACATCAGA	_`bbbbab]_`aba`Yaabbbbbaaa_`baaaaaaa	chr10.fa		5501222	F	36	119					
+HWUSI-EAS610	1	4	54	96	1807	0	1	GCCAGTCTGGAATTCCAGACCTAGGGAAATTATCTG	YbZ^ZUZX[^_HZ_`^Wa\ba^R^_WGRUTa[]WBB	chr10.fa		5501272	F	36	108					
+HWUSI-EAS610	1	4	93	1639	1889	0	1	TTCTTAGCTAGTTGGGGAACCTATTGAGCTAACACA	aaZ^a_a_`U`\`_aa`_`]^_]``^^_Z^^_X]Z^	chr10.fa		5501638	R	36	119					
+HWUSI-EAS610	1	4	100	1475	1068	0	1	AACCCATAATCCAATCTTGACAGTCTCTGTCTTTTA	abaaaaaaaa`aaaa_aaaaaaa_`a^_a^]_a`a`	chr10.fa		5501870	R	36	119					
+HWUSI-EAS610	1	4	8	397	1211	0	1	AATCCACACATAACTCTTCATCATGTCTGCCTTTTG	^X_bbaab``aa^_aaa_aa`a_`a_aaaaaa`aaa	chr10.fa		5502033	R	36	119					
+HWUSI-EAS610	1	4	47	1588	2032	0	1	TGATGAAGAGTTATGTGTGGATTACAGGACAATATA	aaaab_aaU````abXa[_`aZ_`T`aa[WT]____	chr10.fa		5502046	F	36	119					
+HWUSI-EAS610	1	4	76	928	1748	0	1	TCTAAATAAATCGATGACTTTGACTTTCCTTCCAAT	``_^_\a__\aV`^^a\[a`a\]^_]`_\_V[\^[W	chr10.fa		5502146	R	36	119					
+HWUSI-EAS610	1	4	18	1685	1120	0	1	ATTTTAGTACTATGTCCATGTAGCAGAATGATTATG	abbbb`[ababa_]]aaabaaaa_aa_`a`_aaaaa	chr10.fa		5502818	R	36	119					
+HWUSI-EAS610	1	4	41	435	1251	0	1	GTACTAAAATGGCTCCTGGTGCCTTATTGTTACATG	a\aaaaZ`^^a_a``a^``X\\a`a__aa]a_____	chr10.fa		5502844	F	36	119					
+HWUSI-EAS610	1	4	81	787	1158	0	1	TGAATCTATCACCCCTCACTAGAGAGACTTCTTTTT	\b``]Z]`WN`a`a]VQM[HSb_b]`R\[ZNJU_NZ	chr10.fa		5502890	F	36	117					
+HWUSI-EAS610	1	4	88	875	800	0	1	TGAATCTATCACCCCTCACTAGAGAGACTTCTTTTT	ab`^b`aaaaa^`__ba`aa_aaa_a_ZG_]_aa`_	chr10.fa		5502890	F	36	118					
+HWUSI-EAS610	1	4	20	1024	304	0	1	GACAATCTTGTGTGCAGAAAACACTGTTTCCTTGAA	aa^a`a_`aa`_^a_aa_a``_a``aX``^__``__	chr10.fa		5503069	R	36	119					
+HWUSI-EAS610	1	4	35	132	272	0	1	GGCTTCACACTGCAGGGATCTTCTGTATGCCATCCC	aaabaa[`abbaba^X]`\aaa`aa^^a_aaa`aaa	chr10.fa		5503128	R	36	119					
+HWUSI-EAS610	1	4	64	624	550	0	1	GGTCTGCATCCACTCTGTCCACCATCACCTACCCAT	\a`aaaaabbbba]babaababaab`aaaabb\b]a	chr10.fa		5503391	R	36	119					
+HWUSI-EAS610	1	4	67	150	1520	0	1	ACAATCTTCCTTTATTGTCTCTTTATTGTCAGAGGG	aba^aaaaaaaaaaaaa]a_aaaa^aaa^a`aZ_`a	chr10.fa		5503649	R	36	119					
+HWUSI-EAS610	1	4	48	282	275	0	1	AATCCATTAAGTCTCATGACATGTACCAGGATAACT	_HGZa`][O[[HXaSO\VX__P^LYaVZa^P[UW]X	chr10.fa		5503810	F	2G33	105					
+HWUSI-EAS610	1	4	3	745	886	0	1	AGATATCATTTTGTAGCCTCTTCCTGTTTTGAAAAC	abaaab_^aabaa_aaa_`aaa`a`b`aaaa`__`_	chr10.fa		5504003	F	36	119					
+HWUSI-EAS610	1	4	54	1180	403	0	1	TTTTGGGATAGCCTATCATTGCTGTCATGGCTGAGG	a___`WPQ__`][`_a_a_]^U^_]U_XNXU[ZVZX	chr10.fa		5504264	R	36	118					
+HWUSI-EAS610	1	4	99	1329	1818	0	1	AGAGTGAGGGCAGTGTTTTGGGGGGTGGGGATACCA	aaabS`]bba__b^b`aaaaaaaaaSa_a```_\V[	chr10.fa		5504643	R	36	119					
+HWUSI-EAS610	1	4	61	457	390	0	1	TGTGGATTGGGTGATGGTTTTCACATGATCAGAGTG	aa`aa^aabaaVa_aba]```_a^``a_^^]`Y`X`	chr10.fa		5504673	R	36	119					
+HWUSI-EAS610	1	4	70	1399	1264	0	1	ATTAAACATGGGTACCATTAAGGGGTATTTAAGGAG	abaaba_aaa`a]`_aaaa_aa`a_Vaaaa_^[a^a	chr10.fa		5504762	F	36	119					
+HWUSI-EAS610	1	4	42	465	1575	0	1	TGTGTGTGTGGATGTGATCTCTCTCTGTGTCTCCCT	ab_b_b^`^aa`aa]]``aaa``a`aa_a____`__	chr10.fa		5505055	F	36	119					
+HWUSI-EAS610	1	4	100	1291	1265	0	1	ACAGGGTTTCTAGCTGAACTCAGAGCTGATCAATTA	a_`bZXNZ_T__aZ``aa]]^\aX\KX`^^WaPT\`	chr10.fa		5505203	F	36	118					
+HWUSI-EAS610	1	4	54	372	2025	0	1	GAGTTAAGCAGCCAGTCTAGCTAATTGATCAGCTCT	abaabba`ba^aba]_a``aa_```_^a^___\^^^	chr10.fa		5505224	R	36	119					
+HWUSI-EAS610	1	4	88	880	349	0	1	GTGATCCAAGCTCAAGCCTTCAGCCTTGTACAGCAA	_`a]^^_VY\`U]aU\NSUX``^]_a]WDX_XRXBB	chr10.fa		5505336	F	36	108					
+HWUSI-EAS610	1	4	11	757	1029	0	1	CAAGCACATTACCAACTGGGCCATTGCCCAAGCCCT	abb_HYaaa\b[aaaaaaaXa\aaaaa\^`_]Q]^[	chr10.fa		5505369	F	36	118					
+HWUSI-EAS610	1	4	49	625	1411	0	1	GATGGACTCTTCTCCAGGGCTTGGGCAATGGCCCAG	a^aa`Zaa`a`a`_```````^`UZ^a]aa`YX]\^	chr10.fa		5505384	R	36	119					
+HWUSI-EAS610	1	4	16	1146	1152	0	1	TGCATGCCTCTGAAGTGGAAGTCAGGATGGACTCTT	ab`aZ^``^aaa`]`[^`aaa[\R]^YYW][^ZZ`]	chr10.fa		5505409	R	36	119					
+HWUSI-EAS610	1	4	30	861	1959	0	1	CATTCTATCCATCCCACAAGCTGAGGTCCCGGGCAG	Z`abbb`baaabababbbaaaa`ba\ZZb`Zabb`a	chr10.fa		5505535	R	A35	88					
+HWUSI-EAS610	1	4	53	1243	1711	0	1	GCCCGGGACCTCAGCTTGTGGGATGGATAGAATTGA	`bbba`aa_aaaXa`aaaZ_aaPaaa\\Xa\aa^`B	chr10.fa		5505537	F	36	114					
+HWUSI-EAS610	1	4	40	1145	777	0	1	TGTCAGAGAGGTTTAGCTGAGGCGAGTAAGCCCCCT	aaX_^IL_M[URG[V`RUNTSUEVW`S^^BBBBBBB	chr10.fa		5505575	R	34A1	82					
+HWUSI-EAS610	1	4	42	813	1645	0	1	TTGTTGAAGCACAGCTCTCAGGAATTGTCAGAGAGG	abaaaa_a`a_aaa__``^^aa__`__[^_\YaUa`	chr10.fa		5505600	R	36	119					
+HWUSI-EAS610	1	4	76	1168	1427	0	1	TGACAAGACAGCAGAAAGCCAGCTTTAACATCATGC	abaabab`^`aaab_aaa`aaa^abaa`_aa_a_a_	chr10.fa		5505769	R	36	119					
+HWUSI-EAS610	1	4	26	1644	1668	0	1	GTGCCTAGGTTACTCTTTCTCCATTGCATGTTCCTG	`^`a_a`aa]a`^a`aaa___^a_]a^[[__`^X`a	chr10.fa		5506120	F	36	119					
+HWUSI-EAS610	1	4	7	614	1291	0	1	CCAGTTCTTTCTGTCCCAGGCCTCATTAGCCATTGT	a_\Ya\ZaZVb__ba_b`_VSY`bUabbbaXaabba	chr10.fa		5506396	F	36	119					
+HWUSI-EAS610	1	4	85	582	338	0	1	TGGGTTGTATGTCCAATATTCTGAGTATCAAATAAT	aab`aaba^a`^aabbabaaa`b`_]baaababbaa	chr10.fa		5507206	R	36	119					
+HWUSI-EAS610	1	4	36	212	1246	0	1	TATTTCTTGTTTGCATTTGAAACCTGAAGGAATGCT	aaaaabbaba`abaabaab``ab__aa`a]X_aaa`	chr10.fa		5507306	F	36	119					
+HWUSI-EAS610	1	4	12	320	128	0	1	TCCAACCTCTACGCCCACCTGCTGTCATGCCTCCCT	`a_`__\Z^`_``a\\XTZUZ`^`\\Z[`ZT^Z``Y	chr10.fa		5507353	F	36	119					
+HWUSI-EAS610	1	4	99	860	454	0	1	AGGGAAGTTATAGAAGAAAGGGCTTATTGGAATACA	_\^_QSa__VUK`_^_bbba_``abb`]a__]N_^_	chr10.fa		5507402	R	36	118					
+HWUSI-EAS610	1	4	22	494	962	0	1	CACTTGAAACAGCTGAGGTTAACACATGGTTAGTTG	aa`bbb`aaa`baaa_aaabaaaba_bba_a_aUab	chr10.fa		5507808	R	36	119					
+HWUSI-EAS610	1	4	2	1217	912	0	1	AGTGTGCTAATTACATTTCTCTACTCACACAGCTGC	aaVY_ZPa_]_^_O]_^^^`_]^X]X_[_^]_U]WB	chr10.fa		5508247	R	36	114					
+HWUSI-EAS610	1	4	73	1777	790	0	1	TGAATTGATGTCTACATATGTTCATGGTATTTGTAG	a^``_````]VZ_a]aaa__X___\Y\S\_[ZGV^\	chr10.fa		5508417	R	36	118					
+HWUSI-EAS610	1	4	7	295	188	0	1	GCGGTGAAGTTTTGCCTGTCCATGTTTTCTGCCACG	aX]`NaU[_[aa__]SW__^__`XV\__^_^_[[[_	chr10.fa		5515100	R	36	119					
+HWUSI-EAS610	1	4	83	1470	1444	0	1	TACCCCTCAACTTACATATCAAATCATATCGCATTA	abaa]\a`_b_[`aaba`baa`a]``aa`aa_`aaa	chr10.fa		5515143	F	36	119					
+HWUSI-EAS610	1	4	32	564	1051	0	1	ATTATCCCAGCAATGAAATCCAAGCATTAAGGCCTA	\b^`_[bbaabaabaa]`]``bY`Y_`]YPV]_`_b	chr10.fa		5515175	F	36	119					
+HWUSI-EAS610	1	4	8	1373	1076	0	1	GGGTGAGCACTGTACTTTTGAGTGGAAATGGATGTC	ab`abaaab_bb`b`bbabba`Za```_abaaab]X	chr10.fa		5515251	R	36	119					
+HWUSI-EAS610	1	4	25	1207	659	0	1	CGAGGAGGAGAAAAGCAATACATGGTCTTCTTGCCT	abbbbbbbabab_a]babbbab]aaabbbaa]a`aa	chr10.fa		5515406	F	36	119					
+HWUSI-EAS610	1	4	52	1475	1425	0	1	GAGGCTCATCACTAAGATATTACAGGGAAATGAAGC	T``]aaa`a``\ba`aab`bb_NW^^a`a_a^aaa`	chr10.fa		5515443	R	36	119					
+HWUSI-EAS610	1	4	82	725	1149	0	1	CATCACCAGTCAATTACATTCTCTCAGTCAAGAGCC	]]aVSaVI`\^\aa_S`_aa[^]bYNR^RWX_aa`_	chr10.fa		5515747	F	36	118					
+HWUSI-EAS610	1	4	28	152	82	0	1	TGAGTGACTTCTCACGGATGAACTCTGACACTTCAA	aaUaabbabbbabbabbabbVababbaabab_b`Ub	chr10.fa		5515905	F	36	119					
+HWUSI-EAS610	1	4	85	1393	1387	0	1	ATTTTAGAAACTGATTTCAGCTAACTGCAAGGATGA	a`_Y_]a_\YOOaW`Y`YTW^__ZWY^]RU^ZU\[_	chr10.fa		5516014	R	36	118					
+HWUSI-EAS610	1	4	36	1592	2000	0	1	GGAGTCATTTCCTGGCTCAAGCAAAGACTTTCTCAT	a^_\GRY^U]OQ`_`UPPR^]WV]]QUVY^WYYYYZ	chr10.fa		5516209	F	36	117					
+HWUSI-EAS610	1	4	73	811	9	0	1	GCATTCCTTTCCTCTGGCTCTACTTCAGCCTGAACA	abbZZ]baa^\ZIHW`XPQ]`]SYLZ\LOTa_VGP[	chr10.fa		5516646	F	36	115					
+HWUSI-EAS610	1	4	98	789	978	0	1	TAAATACAGGACTGGGGAATATCTTAGTTATCTTCA	abaa``_]aa_^aa`^^^aaaa_aa`a`a_a_[`X\	chr10.fa		5517695	R	36	119					
+HWUSI-EAS610	1	4	87	83	354	0	1	GTCATTACAATAATTCAACCTTGCTCCCCTTTGGGG	a_`[`abab^^_aaaaaaaa``bb`baaa`[a`a^_	chr10.fa		5517829	R	36	119					
+HWUSI-EAS610	1	4	67	173	1093	0	1	AGGAAAAATAATAAGCAGATTCTAAACATTCATGGG	abb`_``\abba__bbba]a`bab`^b\aabbaaaa	chr10.fa		5517943	F	36	119					
+HWUSI-EAS610	1	4	88	416	1118	0	1	ACAGGAACATCTCAATGTCTGGACCCCAATTCAACC	a``ba]aaaaaaaaa`a^a`a_aa_aaaaa_``a``	chr10.fa		5518390	F	36	119					
+HWUSI-EAS610	1	4	75	1115	587	0	1	AGCTTGTTTCAGCGGAGTCATGTATAAAGCCCCTCC	aaJ\aYZRa\^a^X`]]S^^\SY`RFNVJ^ZZ_XBB	chr10.fa		5519060	R	36	108					
+HWUSI-EAS610	1	4	48	115	1461	0	1	TAAGCTTGTTTCAGCGGAGTCATGTATAAAGCCCCT	`Z^bba`baabbaabaaaa^```b^bbaa^aabaa]	chr10.fa		5519062	R	36	119					
+HWUSI-EAS610	1	4	13	81	459	0	1	AGATGAGACTTTGGAATGACAAGATTATCATGAGTC	\a]_b\__bb^abbaaaba`aabaaaaaaa_a`a_a	chr10.fa		5520305	F	36	119					
+HWUSI-EAS610	1	4	36	1452	973	0	1	ACATGGTTTAAAAAAATCTGATGTATGTTATTCTTT	aabba`[baaaaa`a`baabaaa``aa^aaaa`a`a	chr10.fa		5520427	F	36	119					
+HWUSI-EAS610	1	4	3	1570	1129	0	1	TTCGGAGCAGGACAGTATTTGAGATGTAATACACAC	aa__aZ_]^_]]^_`\]___Z__^_]X^^]^Z]^\V	chr10.fa		5521010	F	36	119					
+HWUSI-EAS610	1	4	28	1619	417	0	1	AGTGTGTATTACATCTCAAATACTGTCCTGCTCCGA	`^^LZ`Va_aa^^_`__aaa_a`UX^^_W\^Z]^]^	chr10.fa		5521011	R	36	118					
+HWUSI-EAS610	1	4	40	401	1136	0	1	AACAAAAGCTAGCTGACCAAACTGAGATAAAGATGA	`U`bb^babaU]bbbb`bbTY_ab_baaaa`ba_ab	chr10.fa		5521499	F	36	119					
+HWUSI-EAS610	1	4	39	1305	968	0	1	CATGCTCGAATTTGGCTCAGTTCAACTAAAAGACTG	aabbabbaaabbb`aababb`aaababaaaaa_XaY	chr10.fa		5521549	R	36	119					
+HWUSI-EAS610	1	4	1	1194	744	0	1	TTTCAGGCTCAGGCATGCTCGAATTTGGCTCAGTTC	abba`]^`^^^`[_a`a]a`aNXa_`[^Z\\__TRT	chr10.fa		5521562	R	36	119					
+HWUSI-EAS610	1	4	46	1638	845	0	1	GTTTCTATCCTCCTGTTCCCCTATGGCCAGCACTGC	]Zbaabbbb```aa]aaaaa]a^_T\a\Z[WXX^P]	chr10.fa		5521705	F	36	119					
+HWUSI-EAS610	1	4	52	1522	453	0	1	AAGTCAGGGTTGACCATCTGTCTGTAAAAAGGAACT	aaa_aa_````[^_aaa`_a`_`H\a_`a`]O\_]a	chr10.fa		5522779	F	36	118					
+HWUSI-EAS610	1	4	12	1330	1078	0	1	CCATCTGTCTGTAAAAAGGAACTTCCATGATCTACA	Z`bb^bbabbbabbaa`\`b`Xabbab``ababaab	chr10.fa		5522792	F	36	119					
+HWUSI-EAS610	1	4	30	1060	363	0	1	TGTGTAGACGTGAAGATGACAGTGGGATGCTTGGTG	ab_a_``a_`\`\\_\\]\TT[TUaZX[_Y___`U`	chr10.fa		5522977	F	36	119					
+HWUSI-EAS610	1	4	98	1451	843	0	1	AGATGACAGTGGGNTGCTTGGTGAATGCCGTTAGCT	ab^ba_`_a`a_[DYa```aa_aaa`_`_`_^^_[\	chr10.fa		5522990	F	13A22	110					
+HWUSI-EAS610	1	4	70	812	229	0	1	CTTTGCCTGGGCCTTGAGGTGAGGATGTGAAATGAA	abbaab_bbba`aabbb`b`baababa_baba``aa	chr10.fa		5523026	F	36	119					
+HWUSI-EAS610	1	4	58	385	1251	0	1	CAAGTGTGACCGAGACACTGACACTGCAATTCAACT	aa__Z__`a_a`a`^a__]_]^`_a_aa_`_`_Z^`	chr10.fa		5523391	F	36	119					
+HWUSI-EAS610	1	4	65	460	315	0	1	ACTGCAATTCAACTTAAATTACCTTCAGGTTTAATT	aK]YR\XaaaSOM^aaWWZPURWSNR^UVLX^[V\_	chr10.fa		5523413	F	36	117					
+HWUSI-EAS610	1	4	73	397	1254	0	1	TTCAACTTAAATTACCTTCAGGTTTAATTAGCATCA	aa`^ababa^^aa`aaa`a]`__a`]_aab^aa```	chr10.fa		5523420	F	36	119					
+HWUSI-EAS610	1	4	79	1408	732	0	1	AGGCGAGCTGCTTCTTCCTTCCAGTGTACTTAGAAT	^^T^aX[OXG]ZaY][``Y_VUUZV_L]ZMJZ_a^Z	chr10.fa		5523545	R	36	117					
+HWUSI-EAS610	1	4	95	836	754	0	1	AGGCGAGCTGCTTCTTCCTTCCAGTGTACTTAGAAT	\_`V``[`ab`TZ`bb`Y`ZHX_aTX_[\a_]aI_]	chr10.fa		5523545	R	36	117					
+HWUSI-EAS610	1	4	17	1111	1260	0	1	CACTTTTAACTTTGAAAAAATGTAAGCCTATCTAGT	ab``aabaabaab`^`_a```b`abb`aba`abbb_	chr10.fa		5523624	F	36	119					
+HWUSI-EAS610	1	4	30	799	1719	0	1	CAGTCTGTGAAAGACAGACATGTGGTGGCATAATAG	^bbbbbUbbbabbbabbbbbaabbaKaab]bUbbaa	chr10.fa		5523707	R	36	119					
+HWUSI-EAS610	1	4	30	910	1309	0	1	TAGTCTGTGAAAGACAGACATGTGGTGGCATAATAG	_bbabbbbbbbbbbbbbababbbabaaaabbbabbb	chr10.fa		5523707	R	C35	83					
+HWUSI-EAS610	1	4	10	39	487	0	1	TAGCTTTAACTTCGTTAAATCTTTGTATTCATTGCA	aabb`ba_bababaabb`bbbaaab_abbbaabaaa	chr10.fa		5524671	R	36	119					
+HWUSI-EAS610	1	4	82	1714	546	0	1	GAACTAACGTAAAAGGAGTTACAAAATGTTAATAGA	I__Z_bbaYS_^_`]HXQ^aaXab``a]Zb\aY_V_	chr10.fa		5525050	F	36	117					
+HWUSI-EAS610	1	4	7	16	1754	0	1	CTCTTTTATCCCAGCACGGCAGAGATTGCCTTGAAG	a_b`aaaa__aa]_aa```_I]Z]Z^Y[`aZXVU__	chr10.fa		5525322	R	36	118					
+HWUSI-EAS610	1	4	51	740	1158	0	1	AGTGCCGTGAGGGTTCAGGAGATAGCCCCCAGCTCC	`aa^Y`[[XVXaTG\]`^]Q\a[``[_MXWVV[`\]	chr10.fa		5525411	R	36	28					
+HWUSI-EAS610	1	4	40	697	1717	0	1	ATATGGACAGCCAGACTGACCTAGAGTTCAGGAGAT	`b__U[]]aW[T^_UZaa[XX`_aZVMYVWNNUR]X	chr10.fa		5525461	R	36	118					
+HWUSI-EAS610	1	4	38	259	1194	0	1	TTGGTGTTTCTCAGATCTCAGCGGTTGCTTCACCTA	abbb_a_bbbbbabaaaabaaabb]_`^Q^]R^\LU	chr10.fa		5525540	R	36	118					
+HWUSI-EAS610	1	4	28	897	683	0	1	TTTAAAGCTTGGTGTTTCTCAGATCTCAGCGGTTGC	abb`aaa_`baaZaaaaaa`a_`a_`^`__a_VBBB	chr10.fa		5525548	R	36	106					
+HWUSI-EAS610	1	4	29	482	483	0	1	AACACCAGAGACTTACTTCTCTGTGTTGTCTTAGCA	Kbbbb```aabbbbbbbbbbabbabbabbbbbbbba	chr10.fa		5525586	R	C35	103					
+HWUSI-EAS610	1	4	56	934	1294	0	1	AGGCAGGGAGAGAAGTTGATATCCAAATGGTTAACT	a`a^`baa[a^aYW__aaaaa`_``^``a_\``__a	chr10.fa		5526123	R	36	119					
+HWUSI-EAS610	1	4	93	1185	127	0	1	TGTGTGCATGTGTGTATATGTGTGTGCCTGTGTACA	aa``[aaab`Z\_a`abaaba`]a_`^]a`Z_\__a	chr10.fa		5526326	F	36	41					
+HWUSI-EAS610	1	4	41	698	714	0	1	GTGTGCCTGTGTACAAGTGTGAGCATGTGTGTATGC	a^a_a__a`_a^`\^^`[aUa[^^__a\a\a]_Va\	chr10.fa		5526347	F	36	119					
+HWUSI-EAS610	1	4	26	238	349	0	1	ACACACTCACTCACATGCACACACATTCACATACTC	a``_`a`aaa`aaaa_baaaa__a`_aa_aa_ba`_	chr10.fa		5526542	R	36	65					
+HWUSI-EAS610	1	4	2	1659	966	0	1	AGTCTGTGAGTGTGTATGTTTGGGTGTGTGCACGTG	Q[aab[L[[_NW_bba__X^_[^`_a[a_Z[ZWZJY	chr10.fa		5526604	F	36	118					
+HWUSI-EAS610	1	4	75	1207	200	0	1	TGCATGCACATGTGTATACATATGTTTGAGTGTCTG	`aba^`aaa_aaXXZaaaa_a^_`Xa_a[`X[Y_a[	chr10.fa		5526646	F	36	119					
+HWUSI-EAS610	1	4	86	1613	1072	0	1	CATAGCCACACAAATTCATACACACCCACACACCCA	a[`NNTX`]aaaZ[Q]_a`SHSMX[LY[VSBBBBBB	chr10.fa		5526711	R	36	91					
+HWUSI-EAS610	1	4	94	742	617	0	1	TTAGAGCACTAGGCCCTAAATCAGGTCCTTAGTCAT	aaa\a_Za^a_[aY`_aaaaa``a`OZ]`_``]_`_	chr10.fa		5527039	F	36	119					
+HWUSI-EAS610	1	4	13	1537	304	0	1	CTTACACTGTAAAGACACTCAAACTGGGCCAACACT	`baa^^aa[aaaaTa`a[`__aa_\VG]_]`\__W_	chr10.fa		5527288	F	36	118					
+HWUSI-EAS610	1	4	62	584	1306	0	1	CAGAAGAGTGTTGGCCCAGTTTGAGTGTCTTTACAG	abbab]Z_aa_`^baa`[aabbbababaababaaa_	chr10.fa		5527294	R	36	119					
+HWUSI-EAS610	1	4	16	786	482	0	1	GGCACAAGTTGGTAAGCAGCCAGGCCTACTTGGGGA	aaaa`]`a^a``^aaa^^a^`Y^]Y\`^^`a^^^a[	chr10.fa		5527723	R	36	119					
+HWUSI-EAS610	1	4	18	456	152	0	1	CTGGCTGCTTACCAACTTGTGCCATGATACTCAACC	abbaabaabba`aa`aaaa`aa`aaa`aa_aaaaa[	chr10.fa		5527736	F	36	119					
+HWUSI-EAS610	1	4	93	1115	683	0	1	GTCCTGAGGATCAAACTCAGGTCCTTATGCTTAGGA	aaaX`a_[_^Z^`^`]a^aaZZ^X^a___^__]a^_	chr10.fa		5527782	F	36	54					
+HWUSI-EAS610	1	4	49	1335	1679	0	1	GTGGTTTTACTACCAAGCCAGTCTCCCACCCCCAAG	`a__X_aa_]__TZ_\X_VNYVNYYZZ\]VMOX[VY	chr10.fa		5527823	F	36	118					
+HWUSI-EAS610	1	4	24	670	97	0	1	TTTTACAGGAATTTATTTAGTAATAACTTGTTCTGT	aa`a``_`____]_^```^_[`]__^]_^`^^Z^`]	chr10.fa		5528135	R	36	119					
+HWUSI-EAS610	1	4	74	1717	545	0	1	GCTGCTAAAGGCTCCAGAGTGCTCTCCACACTGCAG	aaXUUU[WXPY]WKRMVaZLQ^]`QZa]URXYGV[X	chr10.fa		5528274	F	36	19					
+HWUSI-EAS610	1	4	24	422	849	0	1	GATCACGGGTGAATGGTACGAAACACCAGCTTCAAA	a_Y_a`a^PYaa[_UXPa_a_]XY[`__a___YV[_	chr10.fa		5528536	F	36	119					
+HWUSI-EAS610	1	4	70	1260	1491	0	1	CAGTATTGTTGGTTTCTGTTAGTAAGATTCTTACAT	`bb\bba__b^^a^bba^`aa`^bb_bb\__ba]`b	chr10.fa		5529118	R	7C28	8					
+HWUSI-EAS610	1	4	9	1401	1804	0	1	TTCCCCCAATAAAAGACACAGACAGACTGGCTACAC	aa_X][__`a``a_a__a_aaa^aa````_\a`U\B	chr10.fa		5530480	F	36	115					
+HWUSI-EAS610	1	4	73	613	809	0	1	GCTACTCCAGCTTTTTTTCCCCGGACCATTTGCTTG	aa`V`aa`[\a`aaaa_`a__a`_`_____V`___a	chr10.fa		5530608	R	36	119					
+HWUSI-EAS610	1	4	94	496	494	0	1	GAACACCAGAGCCAAGAATTGGGAGTGGATGGGTAG	aW^[aZ`X`Wa`]SU_RRY__]_WaU__WU]_\VU^	chr10.fa		5533806	F	36	19					
+HWUSI-EAS610	1	4	52	1248	521	0	1	TCTGTATGGTCCATCATTTTGTCTTAGCTACAAACT	aa`^Z]_^\ZX\a_`a^\]`\`\``[VU_^^_ZYU`	chr10.fa		5534678	R	36	35					
+HWUSI-EAS610	1	4	78	252	1260	0	1	AATGATGACCCACAAGGCCATCTTCTGCTACATATG	^[^aa`_]_aa_aa[^_a`[^`^]`_``^_\[VZTU	chr10.fa		5534988	R	36	27					
+HWUSI-EAS610	1	4	57	1294	68	0	1	TAGGGGTATACTCTTCCCCCTCCCTGCTCCCCTACT	`b_^V[NXWRO_PZ`\\YW`a`Y[XPQTS^R[U]U\	chr10.fa		5535105	R	36	118					
+HWUSI-EAS610	1	4	23	946	1447	0	1	AGTTCCATCATACAATGTTTGATTATTCTTTCCTGC	aaabbabaaaaaaa]bb^abbaababa`aaa]``b_	chr10.fa		5535428	R	36	119					
+HWUSI-EAS610	1	4	82	420	1656	0	1	ATGCATGTGTGCATACACATCCTTGCAATGTCCTTT	a``aaaaU^_aaaabaaaa`^a`aa````_Ya_`]W	chr10.fa		5535915	R	36	119					
+HWUSI-EAS610	1	4	98	1734	1028	0	1	GAACGTGACCACACAGCTATGTGTCCAGCAGTGCTC	abba\X^aaaa]aaaXa_aaaU]Z_Z]\\aSW\\]^	chr10.fa		5536782	F	36	119					
+HWUSI-EAS610	1	4	50	887	651	0	1	TTTGAAATACACTTTCTTGCTTGCCAGTTCCCCTTC	_b_a`^]]^TRP_Z_VaZJU]abQTWVY]X]XU]ZU	chr10.fa		5536947	R	36	118					
+HWUSI-EAS610	1	4	92	1052	1806	0	1	GATCTGTGTGCTCCAGCAAAGGCTCTGCTAGGAAAT	``babb_bab`aaaaaaa\aba``_aa_a]a`\__a	chr10.fa		5537059	F	36	119					
+HWUSI-EAS610	1	4	57	337	684	0	1	AGAATACTATAACCCTAACCAAGTATTACTAAGCAG	`aaba^baaaaaaaaa`ba`aab^a`_b_aa]`a`_	chr10.fa		5537253	R	36	119					
+HWUSI-EAS610	1	4	46	385	1044	0	1	TGCAGAAATATCAAATAATCTTTAAAGGTACTCTGA	aa^H^V]aa[`aa^[^`_aaa_`T]`a`Y_\`a`a]	chr10.fa		5537647	R	36	118					
+HWUSI-EAS610	1	4	24	600	678	0	1	CAGACAATGATGGTGAGCATCTACATGGGAAGGTTT	abbbbbbababba]b_b`_aababaabaaaaba_ab	chr10.fa		5538007	R	36	119					
+HWUSI-EAS610	1	4	72	22	502	0	1	GATGGCAGAAATTAGAAAGTTTCACCAGATCTTGAT	a^_abbbaY^^aa`aVWU`[aababbbbaabaaa_^	chr10.fa		5538525	F	35G	84					
+HWUSI-EAS610	1	4	28	70	1354	0	1	GCGGAAAATAACTTAGTTATATTCTCAGACTCTTGT	abaa^\S`bbbbbabb_ababbaaaabbbbbaa`a_	chr10.fa		5538594	F	36	119					
+HWUSI-EAS610	1	4	67	668	1697	0	1	ATTGTCTCTATCTGAACTTAAATCATAAAAACATAA	aa_W[^XY_Y`TXLEF]Y]X\T`^U\VU]U]TZR\B	chr10.fa		5538981	F	36	111					
+HWUSI-EAS610	1	4	26	1743	1234	0	1	TTAAGGAGTGTATACTGTGTCCAGAAGGCACAATGT	aaa``_]_^_]a_a``_Z_^`__Y_^Y]]^^^]WSW	chr10.fa		5539777	F	36	119					
+HWUSI-EAS610	1	4	47	1218	1383	0	1	ACAGCATTTCTTCTAACATTGAAGGTAAGGTATAGC	X`bb`]a_WL]^a^`^_aa^\SS[MX]^_VW\T]Z\	chr10.fa		5540292	F	36	118					
+HWUSI-EAS610	1	4	3	271	1307	0	1	TTGGTAACCAGAAGGCATTTGGTCCCTGGAAGCTGG	aaa]Zbaa`]a]]`VaaaS`]YXa]U_aWa_a__a`	chr10.fa		5540445	R	36	119					
+HWUSI-EAS610	1	4	13	313	272	0	1	CTCTTTAGTGAGACACAAAGTTCAAGAGGGGGAAAT	aaaa^]_a]a_aa`a_aa\a___]_a^a_aa_``]`	chr10.fa		5541667	F	36	119					
+HWUSI-EAS610	1	4	57	1110	1723	0	1	AAAGAGAAAGAAAAAATGGAAGGGAGCAAGGTGGGG	`aaaa__b_b^ab_^[b`]`ba\aab`a__a`a_ab	chr10.fa		5541784	F	36	119					
+HWUSI-EAS610	1	4	66	1062	1386	0	1	AGGAATTGACAAATTCCTGACACACGTAATCATCAA	a_]Ua_]a]\__^Xa_aTQ]S_]aSa`^_^\`a[`\	chr10.fa		5542138	F	36	119					
+HWUSI-EAS610	1	4	58	194	1584	0	1	TTCTCATTTTTATTCACCATAGTGCTGGAAGTCCTA	aabbbbbbaabbaabbaaV]Ua_baaa[Ya__`b`a	chr10.fa		5542589	F	36	119					
+HWUSI-EAS610	1	4	90	916	828	0	1	AAACAGCACTCAGTTTGCTTATTCTTTCCAACTTTT	X^[`_QY^Y`aX^R`baVWWZ`^Y[```YW_W_a\\	chr10.fa		5543526	R	36	119					
+HWUSI-EAS610	1	4	11	926	1455	0	1	AAACTGAGTGCTGTTTTAGGATGCAAAGTTATGATA	_aZ_\`X_^^][`]`\b_``a`bb`ba_F_Y^``ab	chr10.fa		5543546	F	36	118					
+HWUSI-EAS610	1	4	7	71	352	0	1	GGAGAGACTGGGAAGAGAGGAGGGCGGGGAAGCTGC	Va_`XTVaaaa__aa[aXS`a`RaIIaaa`RX\`BB	chr10.fa		5543814	F	24A11	26					
+HWUSI-EAS610	1	4	29	1277	247	0	1	AAGCCAGAATCAGCTAGAATACCATGAGAAGTTCTT	H]bbbbbabbbb_bbbbbbaaabbb_bbbbbaabbb	chr10.fa		5545071	R	C35	35					
+HWUSI-EAS610	1	4	20	491	1557	0	1	ATAACGTCAAGTTGCACGAAGCTTCATTTGCACATG	ab^bab_abab^abbaaba^`aaa^aaaa`aaaaaa	chr10.fa		5545504	F	36	119					
+HWUSI-EAS610	1	4	78	133	897	0	1	GGCTTGCATGGCAAGTGTTTTTACCCAGTGAGCCTC	W__Z^_aT]_aaaTa^b^[`_]Z`]_R_Z[HO[_]`	chr10.fa		5545869	R	36	31					
+HWUSI-EAS610	1	4	8	134	920	0	1	AACTAGTTGTAGCAAACATACACACACACTAAACTC	`ZZa`]`___b`_a[aa`_`a`aU[[\]``]`_^]_	chr10.fa		5546285	F	36	119					
+HWUSI-EAS610	1	4	80	448	1339	0	1	GGATACTGGTATTCACTCTACACACTCTTGTGTCTG	a^Z_R]a_`]a^__^_`__Z_`_^_`_^^]]]Z^V^	chr10.fa		5546863	R	36	119					
+HWUSI-EAS610	1	4	16	547	575	0	1	ATGTCAAAAAGTGCTATATCATTGTTGGACCTACAG	aaa`aaaa[a]`baaaa`a^aaba_aaa^_^a_^ab	chr10.fa		5547240	F	36	119					
+HWUSI-EAS610	1	4	35	1754	1485	0	1	ATGGAAACCTTCATGCTTTAAGGCTGCAGATACCAG	a`a^a``^^`^^a^`[`]_`_XWQ^a^]X]\\[Z`_	chr10.fa		5547428	F	36	119					
+HWUSI-EAS610	1	4	71	1657	1117	0	1	ACACACACACACACACACTTTTTTAGCTGTCAGAGG	aaa`a_a^a^_^a_`_`BBBBBBBBBBBBBBBBBBB	chr10.fa		5547645	F	22G13	34					
+HWUSI-EAS610	1	4	57	423	1455	0	1	ACCTCCATGCTGAAAGGCAAGAACTTCCACAAGTTG	`a``aa__``aa`_a]YZaa``___`^`Y_`__TS^	chr10.fa		5547682	R	36	119					
+HWUSI-EAS610	1	4	72	1648	1505	0	1	TGGACCCGCAGGGAAACAAGGAGATTTGCATCCTCA	__Z_aTaa`a^^^aabXb_Yaa\\_`aX]aa^W]\`	chr10.fa		5548191	R	5A30	94					
+HWUSI-EAS610	1	4	54	1169	156	0	1	ATTCTGTCTATGATGTATGTGGGGCTGTCGAGCAAG	abaaa_a_a_aa]aa]aaaU`a\\`_Q^]_]^_]ZX	chr10.fa		5548959	F	36	119					
+HWUSI-EAS610	1	4	26	1648	1248	0	1	AGGCTAAACTGGAACATCTACACTAACCCATCACCG	aba_aaaa``aa``]a`aaa`a`aa`^aa__]a_`]	chr10.fa		5549521	F	36	119					
+HWUSI-EAS610	1	4	47	1706	556	0	1	AAGGCTTAGGCAATATCACAAAAGTTGGGTGGAAAG	aaRaU_aaGNW\]S_S[_\TRTZSZ_PSPOPMPWW_	chr10.fa		5549559	F	36	116					
+HWUSI-EAS610	1	4	59	993	1617	0	1	AGGGGTTGGGGGGTGACTCTCTTTCCTCAGCTACCA	ab`bb]bbaba``ab`abababab`abaaa`abaab	chr10.fa		5549745	R	36	119					
+HWUSI-EAS610	1	4	34	1083	1757	0	1	AACTATTAGTGGCCACATCCCTAGCAGGGGTTGGGG	`]]a_]_\_P]ZTP_UGVPQOSO]PPR^XVBBBBBB	chr10.fa		5549770	R	36	91					
+HWUSI-EAS610	1	4	40	462	899	0	1	TTATAGTAAACATTAAAGAGCAACCACTTGACAACT	abbaabaaaaa`baaabaaaaaa`__aaaba__a``	chr10.fa		5550158	F	36	119					
+HWUSI-EAS610	1	4	87	1354	1010	0	1	AGGAAATTACCACATAGATGTTGATAGATCTGGCTA	abb`bbabbaabaaa`aa]b``baaa``a\aaa^a_	chr10.fa		5550367	R	36	119					
+HWUSI-EAS610	1	4	88	844	1984	0	1	TGCCAGCATCCTCCTTTCACAGATGAGGAAATTACC	aaa`\a^aa^]`a^aa[_`]X]Iaa[`_^P_NNaa_	chr10.fa		5550392	R	36	118					
+HWUSI-EAS610	1	4	37	865	815	0	1	GGTCCTTCCCATTTGCCCATGNTGGGTTAGATTTCT	a___Z`b^_\K_a`ba_`a_[DWa]a]a_]Z`aa^`	chr10.fa		5551439	R	21C14	110					
+HWUSI-EAS610	1	4	74	1060	830	0	1	CAGCATGGGCAAATGGGAAGGACCTTCCTAAATGAC	`_`^Uaba]```aZa]____aaaa``]`aZT\``]]	chr10.fa		5551451	F	36	119					
+HWUSI-EAS610	1	4	28	677	1953	0	1	GGACCTTCCTAAATGACAAGCATTAATAGATATCAG	abaabbaabbb]bYbb_a_abaabbaaba`aabaa_	chr10.fa		5551470	F	36	119					
+HWUSI-EAS610	1	4	45	1291	1175	0	1	TGACAAGCATTAATAGATATCAGCAGTCTACAAGGG	a_a`a]Raaab_^`^aa``a`ZTU`W\_`__`^[^`	chr10.fa		5551483	F	36	119					
+HWUSI-EAS610	1	4	75	411	1965	0	1	ATTAGTCCGGAGATTCTCATTATGATTAGATTTGCT	abbba`bbbbbbabbbbb[bb`bbbabaaaabaaab	chr10.fa		5551587	R	36	119					
+HWUSI-EAS610	1	4	37	992	1225	0	1	TGACTGTTGTCCCGATGTTCTCTATGGAATCTTCTG	aaaababbb`a`a^aababababbbbaaaa`aa]bb	chr10.fa		5552822	R	36	15					
+HWUSI-EAS610	1	4	97	1265	1803	0	1	TATATGCATATTAATAGAAACAGGAAGACACACATT	aa`_a`_a`b`a]XaZaYa`aYY__`aaa``_`^a^	chr10.fa		5559074	F	36	119					
+HWUSI-EAS610	1	4	6	10	1469	0	1	AGCTAATTAGACTTAAACAAGGTCATAACGATAAGG	abaa_\b^abaa]`aaV[__ba]`_aba`a`_aaa_	chr10.fa		5559262	F	36	119					
+HWUSI-EAS610	1	4	31	1448	1366	0	1	AAGAGAGTGTGCAGGCGGAGGGAGGGTCATGTGAGG	_^```aTT]Q]_PVX\^[[``_[Z\]N_^\aR`^_`	chr10.fa		5559336	F	36	118					
+HWUSI-EAS610	1	4	15	961	622	0	1	CGGAGGGAGGGTCATGTGAGGACAGGGGGAGGTGGC	[``\a`^O`_`Q_Xaa_a__a[^`aaa`_\]aN^a^	chr10.fa		5559351	F	36	118					
+HWUSI-EAS610	1	4	48	499	1374	0	1	CAGAACTGGAGAGATGGTGAGTTGAAGATTAAGAAC	aba_\__]a\a\`QYP^`]L^[`^V[_[]]Z][OZZ	chr10.fa		5559638	F	36	118					
+HWUSI-EAS610	1	4	89	707	1556	0	1	GCCCATGTTCAGAAACAGGTATCAGATCATCTGTAC	aaaabaa`a_]Xa_`aa]X[aba__a`a\a_a`^__	chr10.fa		5559749	R	36	119					
+HWUSI-EAS610	1	4	99	1321	1581	0	1	TGATTGAGTATGTGTCTCTTCACCAATTGCGTGCCT	]_Y\Z`a`S]]\[a_a^XZ\_a]VX[aYPSZL_^U_	chr10.fa		5559788	R	36	118					
+HWUSI-EAS610	1	4	76	558	1969	0	1	GAGACCATTCCAAGGGCTGCATCCAAATCATCTTTC	_a`aaaaa`ba[US_`a]a_a^aa_aXW_`_^a`]a	chr10.fa		5560833	F	36	119					
+HWUSI-EAS610	1	4	37	144	883	0	1	CAGGAGCTTTGCTCCGACTTAGCTGTGTCCCCAACA	`W]_]`ba_aaa\aaa[a`[]`aYa\a\aa^]Z]\^	chr10.fa		5560971	R	15C20	81					
+HWUSI-EAS610	1	4	6	193	778	0	1	AGTCTTAGTCATCACATTAGGATTACAAGTGCTCAA	\`_a`a`a_babbb`^_^_aa`aaa`aa`Zaa_aba	chr10.fa		5561049	R	36	119					
+HWUSI-EAS610	1	4	89	22	1383	0	1	AGGTTGATAGTCAGTCTTAGTCATCACATTAGGATT	`ba]bb^a`b_bab_a`a_b_aaaabb___^aa`_`	chr10.fa		5561061	R	36	119					
+HWUSI-EAS610	1	4	94	73	1490	0	1	TGCACAACGGATTTGTCTCCTTGGTCCTTCTAGACC	\_aa\Z_]Wb[X``b^_`a[G]b[^abaa\U_a_aa	chr10.fa		5561102	R	36	118					
+HWUSI-EAS610	1	4	10	15	144	0	1	TTAGGGTGAGACTTTCTATCTCAATTAAGCCAGTAT	a^aabaYa`a`a`_aaa_aa`a_aaa`_`a`a`S^_	chr10.fa		5561157	R	36	119					
+HWUSI-EAS610	1	4	47	871	459	0	1	TAAGGTCCTAGACTTCATAAAAGGAAAGAAACAAAC	aaaab``_a^a_aab`abaaa_`aaaaaaa_`aaa_	chr10.fa		5561219	F	36	119					
+HWUSI-EAS610	1	4	18	1701	563	0	1	AGCCAAAGTCAGGAGGCAGAGAACTGTGAGTAGTCA	a__``__PR``[ZXNX[a_`UZ_UTWTZ_WXYWWW^	chr10.fa		5561261	R	36	118					
+HWUSI-EAS610	1	4	29	1690	494	0	1	GGCTGCATTGTGGTCAGACACCTCTAGCTTCTGATG	a\O\aPSaaaZaaXZZVT]_`\Z`a[VST_OaOW^V	chr10.fa		5561293	F	36	118					
+HWUSI-EAS610	1	4	40	837	904	0	1	CACACTTCCTTATCTTGTTGTTGCTGGTGGCTAGAT	aaaaa]b`aba`a_bab^b``a_^aa]U_a]^OO^_	chr10.fa		5561947	R	18G13G1G1	25					
+HWUSI-EAS610	1	4	23	827	764	0	1	GTGCATTCGATGGAGGCAATCAGCATTCCCATCAAA	aab`aab_a`aa_`a`a````___```[^^^__`a`	chr10.fa		5562094	R	36	119					
+HWUSI-EAS610	1	4	33	48	287	0	1	AGACTTCCGTATCGGAGGACAAAACAGCTGCCATGT	Zb`bbbaba_aaa`aZ^a^a`aa`a_a``aa`]ZNV	chr10.fa		5562141	R	36	119					
+HWUSI-EAS610	1	4	68	1023	208	0	1	TTTCCATTAGGACACAATGACTACATGTGTCCAGCT	aba_`_`_a]^]^__a]`_^^`_Z^_^Z^ZZZ^ZY_	chr10.fa		5562659	R	36	119					
+HWUSI-EAS610	1	4	37	340	443	0	1	GGAGTCCAGAAGGGTATAAAGGCCGTTGACATACTG	aa``Z`a__VZaaa\a``Z]``a`a\\`__`a__\a	chr10.fa		5563268	R	36	119					
+HWUSI-EAS610	1	4	47	1249	951	0	1	CAAGCCTTTACTGCAGGCAGATCTCTGAGTTCAAGG	aabbaabb_b_`aaa_a`[b_a`a_ba`b_\_`a`_	chr10.fa		5563845	R	36	119					
+HWUSI-EAS610	1	4	44	845	513	0	1	AAACCACTAAGGATTTCCTTAGGGTATCAGAATAAT	abaaa``a_a`a`_a``````a_^]_^\_`^]^]_`	chr10.fa		5564013	R	36	119					
+HWUSI-EAS610	1	4	81	1148	1957	0	1	AAAGCACTAAGGATTTCCTTAGGGTATCAGAATAAT	ZVaP\TR[RZW`ZT]_QOO\\^`QDPREN`J[`]Y`	chr10.fa		5564013	R	3C32	93					
+HWUSI-EAS610	1	4	8	10	467	0	1	GTTGTCAGAGAAGCCCTGCATTGTGACCATAATCCA	a]aaa_aa^_ZY\]_`__^]^]][_]]`^UU]X`^]	chr10.fa		5564391	R	36	119					
+HWUSI-EAS610	1	4	6	720	140	0	1	TGATTTTTGAGAACCAATTCAATTATGTGAGTGAAA	`abb`_``a`b`a[ab_aaaaaaa`aa]a`aQa_`^	chr10.fa		5564711	F	36	119					
+HWUSI-EAS610	1	4	76	985	258	0	1	GCCATGGCTTCTCATCTCTGTGTTGAAATTATTGGA	aaaaba]aaTa__`a_b]_`_aaYSY^[[`]_a`bX	chr10.fa		5564749	R	36	119					
+HWUSI-EAS610	1	4	75	356	1464	0	1	AAGATGCACTAACCAAGGGGAGGGGTGGGAAGCTCG	VZR^]_]XQZV]a\TT]\aYTQYKT_`]BBBBBBBB	chr10.fa		5564824	F	8A25A1	59					
+HWUSI-EAS610	1	4	54	648	1944	0	1	GGTTTACCTGGTTGTTTGGCTTGTAGGCCTCATATG	aaZ``baa__ZW^a[[[a`\W\`\TN]TVSVS[_ZB	chr10.fa		5565041	R	36	114					
+HWUSI-EAS610	1	4	9	680	1794	0	1	AGAGAGCAGAGAGAAGGAAAAGGTCAAGAAAAGGAA	\`a\YX`Z`^aV`_bbVVZ^X^`_aaa``aYaa^Zb	chr10.fa		5565127	R	36	119					
+HWUSI-EAS610	1	4	53	673	342	0	1	TCTTGGCTTTCTGAGTGATAATGAGAAAAACAAAAC	abaa]aabbb_b]Y`_``aaabaa_a`aaa_`a_``	chr10.fa		5565175	R	36	119					
+HWUSI-EAS610	1	4	30	879	1730	0	1	CGGGGAAAAGAGTCAAAAAAGATAAGTTCACAGTAT	\a`ab`_I_][^a``^`aabbb\bXbb\VY`abbab	chr10.fa		5565313	R	G9T25	54					
+HWUSI-EAS610	1	4	6	1229	1265	0	1	CAGGACATTTTGGCAGCTACCTCAGTCCAGATCTCG	aaaa``^aa[`a`Z_aaa_a^`Z^^\``_^SZS^UW	chr10.fa		5565350	F	36	119					
+HWUSI-EAS610	1	4	94	1588	1070	0	1	CAGTCAGTTTGATGGATGTGGGTGCATAGATAGGCC	ab\P_abaabba`_`_bb_baY]]aaaaaaaaa__]	chr10.fa		5565399	R	36	119					
+HWUSI-EAS610	1	4	16	200	1909	0	1	TGAGATAGAAACCGCAGTGCAGTCAGTTTGATGGAT	OYR`_bU^`^`b\U^a_PWbbaV\___Z]a`_a`_\	chr10.fa		5565418	R	36	118					
+HWUSI-EAS610	1	4	63	1476	298	0	1	TATCTCAAATGTCTCCCACCAGCTCATGGCACTGTT	aaaa``__Z_X]^[^`^_]X`Z]]]]^UGUSUVZN_	chr10.fa		5565447	F	36	118					
+HWUSI-EAS610	1	4	59	550	731	0	1	GTTGTTGCAAGAAGGCACCATGGCAGAAAGCTTCCT	aaaaaaa`_a_a_```````[``__`___`\___\_	chr10.fa		5565617	R	36	119					
+HWUSI-EAS610	1	4	30	1629	195	0	1	CCCAGAATGCACATTATCCTTTCCCATCCTCCCCCT	T]`baUbaJ]aZa`ab^_aaaabababaaUY_aaaX	chr10.fa		5566264	F	36	118					
+HWUSI-EAS610	1	4	40	1574	1103	0	1	GGCCTCAGTTAAATGCACAATGAAAGGATATAAAAT	aVa_a`__^a^__^`_`_a`a]]`_`_^`]`^^_^`	chr10.fa		5566334	R	36	119					
+HWUSI-EAS610	1	4	59	542	905	0	1	CATCTGTGGATTCAGACAAGCAAAAGCCAGCATGGA	abbabb]b_U]aU`^^^TXLV]WTUU[_U^P]]a]]	chr10.fa		5566537	R	36	118					
+HWUSI-EAS610	1	4	49	817	201	0	1	AGGAATGGGGGATGGAGAAGAGGAAAGGGAGAAAGG	`ba__babba`abbbbb`abaabaaabbb_]_aabb	chr10.fa		5566910	F	36	119					
+HWUSI-EAS610	1	4	46	1003	1542	0	1	TGTAGGATTGTGTAAAGGTTTTCAAGTGGCTCAGAG	aa[\\a]`aa]]^a`_aa]^a`\a_`^`__^Z^^]_	chr10.fa		5567458	F	36	119					
+HWUSI-EAS610	1	4	11	563	322	0	1	AGTTCCCTGTTATTCTTTCTAATGCACAAGCATCCT	abaabaaab_aaababbaabaaabaaaaaa`aa^aa	chr10.fa		5567688	R	36	119					
+HWUSI-EAS610	1	4	64	1320	510	0	1	TACATAGAATCATGGGTACTACCCTGCCTTACATCC	aa[aa^[Y^a`a]U]`Y`_a_`[_]P_`a`_`____	chr10.fa		5567864	F	36	119					
+HWUSI-EAS610	1	4	35	1494	1901	0	1	TTTTGCCTGGCCTCTCTCATAGCATTTTCTTCCTTT	aab^^`_]`_X]_Ya^^_`_a_^_`a`_XZ[WU`_`	chr10.fa		5567989	R	36	119					
+HWUSI-EAS610	1	4	37	757	1713	0	1	GCTGGGACCACCAACAAGAGAAAAGGAAGACTGTCA	a`_\a`a[^_U_aX[V^aZ`^_\\_^\\Q_\[`\_^	chr10.fa		5568050	F	36	119					
+HWUSI-EAS610	1	4	35	346	1226	0	1	CTTTCACTTCCTCCTTCTTACCTCCTCCTCTTTAAT	abbb`Z`abbabbbbbbbaZbbbbbabbbaaaa`U_	chr10.fa		5568299	R	36	119					
+HWUSI-EAS610	1	4	84	1714	710	0	1	TGCCCACAGGCTAATCCGATCTTGGCAATCCCTCAG	```aaaZaXR]_a``]ZOXX^^`LEYa^^\YU\UXB	chr10.fa		5568595	R	36	24					
+HWUSI-EAS610	1	4	22	23	1160	0	1	AAAGCTAGCTAAGCATAAGCCTTTCAGCAAGTCAGC	\^^bb_\\__Z[aa`a_QR\``_a^Za^ZYZ]^]__	chr10.fa		5568715	F	36	119					
+HWUSI-EAS610	1	4	17	590	1136	0	1	AGGGACTCAAGCAGTAATTCGAAGCAGAAACCAGGG	abb\Y_aa_]a`ba_``a]abaaa]aa`_```_aaa	chr10.fa		5568764	R	36	119					
+HWUSI-EAS610	1	4	20	1313	122	0	1	TCAAGGTTGGATTGATTGATCCTATTCTGATTCAGT	a`ba\XXWZT_[^Q``b^^a``aaabI`V^`aaYX[	chr10.fa		5569506	F	36	118					
+HWUSI-EAS610	1	4	27	577	822	0	1	GACAATCTCTGTGGCCAAGGACTGACTAACTAGCAG	aab`aaaa`aa[``a__aaWTYaT^\^P[__VOV[W	chr10.fa		5569549	F	36	118					
+HWUSI-EAS610	1	4	2	1750	1550	0	1	TGAGAAGCCCATGGCGTATGCTGCTAGTTAGTCAGT	Y``_a]IU__Tab`UaUTQZG[`aaaa\a[aY^``V	chr10.fa		5569569	R	36	117					
+HWUSI-EAS610	1	4	80	561	1574	0	1	GTGGTTGTGAAATAGTTCAAATCAGGGCCCACTGAA	a_``_a_L\]]T``\V]^WYLST[ZWZW[\ZR^^UB	chr10.fa		5570327	R	36	114					
+HWUSI-EAS610	1	4	26	1246	259	0	1	TGTGTAGAGCTAGGAGATGCATTGTTGAAAGCGACT	a^]\W___ZZZ^W^X_^ZUX^`YYV_Z^[VT\Y]W]	chr10.fa		5570863	R	36	119					
+HWUSI-EAS610	1	4	63	448	1769	0	1	TGGACTGCACACTAGCATTTCCTTGTGTGTAGAGCT	abbaa`bbbabbaabababaaaaab_b^b_ab`aa^	chr10.fa		5570888	R	36	119					
+HWUSI-EAS610	1	4	25	472	1672	0	1	ATGGTGTAACCATCGGGGTGACTAATTCAAAGGCAG	^`_aT[_W]aa`aa^^bbQVOY^____baYWXX_ba	chr10.fa		5571101	F	36	119					
+HWUSI-EAS610	1	4	68	1347	1243	0	1	TGCTGCCTGCCTTTGAATTAGTCACCCCGACGGTTA	`Ja^^bZ`^aabZb`Jb`bRYW^`[`_]BBBBBBBB	chr10.fa		5571107	R	30T5	81					
+HWUSI-EAS610	1	4	78	512	988	0	1	CTCTGCATAGACATTCCAATGAAAAGGAAGGACAGG	abbbbbbbaabbabbbbbabba`aabaaaaaaaaab	chr10.fa		5571600	F	36	119					
+HWUSI-EAS610	1	4	22	1649	1559	0	1	CTAATCTACTTTTTCAACCTCAACAATTGTGTCTGA	aba`\aab^`bab_aaa_ab`aa_aa`a[_XX_Ya_	chr10.fa		5571754	F	36	119					
+HWUSI-EAS610	1	4	11	1079	1189	0	1	AAAGGATGCATAAAGAAACATGGGTTGATTGGCCTG	aabbaabaaabaa`aa_]]abba`_aaaaaaa__ab	chr10.fa		5572010	F	36	119					
+HWUSI-EAS610	1	4	62	533	89	0	1	AGAAGCCTGGTAAAGAGTAAACGTGATGGTCACCCA	_ba`a`aaaaZ_`^^a_Xaaa_a^_`_a`X__]^]_	chr10.fa		5572120	F	36	119					
+HWUSI-EAS610	1	4	76	548	216	0	1	GAAAAGAAATGGAAGCTACTGATGCTGGCCTAGCAT	`\bbbbbbaabbbbabbbbbbbabaaaab_bba`ab	chr10.fa		5572350	R	36	119					
+HWUSI-EAS610	1	4	15	368	1081	0	1	AGGGATGAGGACAAAGAACCGGAAAAGAAATGGAAG	[^`ba[ba^baaaa_a[YXaaa]_Z]`_Z]aaaY``	chr10.fa		5572371	R	36	119					
+HWUSI-EAS610	1	4	33	1613	448	0	1	AGGCTTGGAAGGGCAGTAAGTGAATACTGTCCCCAG	`XW^a^`Z^^OV\]aaRa`]RY^`_`[^VN]Y^^VZ	chr10.fa		5572569	R	36	118					
+HWUSI-EAS610	1	4	71	1134	562	0	1	TGGGCACTGGGTCATCTTAAAGCACCGGGCAAACTG	abbZ^`aaaab\]_a``a``a``a__``_^^Z]S\^	chr10.fa		5572607	R	36	119					
+HWUSI-EAS610	1	4	4	630	1555	0	1	GGAGCATCCTAGACTCAGCTCATTACCTGGTAACAG	a`Sa`aabb`abSaaba`babKbabaa[a\Ua\aaV	chr10.fa		5572734	F	36	118					
+HWUSI-EAS610	1	4	16	1529	1231	0	1	TGATTGCTCAGGGGAAATGAAGCTGTTACCAGGTAA	abaaaaaa`]]```^a]]^_[_^^XZ`_W[[ZSS_^	chr10.fa		5572756	R	36	119					
+HWUSI-EAS610	1	4	53	173	940	0	1	AATGAGCAGCAGAAGTGGACATAGTTGTTTGTAACT	]bbb`bbabaaa_Y_Vaa`_Z_`a_aa_aaa_aaaa	chr10.fa		5572796	R	36	119					
+HWUSI-EAS610	1	4	61	501	722	0	1	TAGGCTTTAGCTGACTCTTTGTGCCCATAGGCTAAT	a`abaa`aaaaaaa`a_aa`__aaa``__aa``a^_	chr10.fa		5572829	R	36	119					
+HWUSI-EAS610	1	4	88	1044	1829	0	1	TGTAACATCCCTTTTAGAAATATCCTATCCCTGTGT	UNSVaa_b_``^^ZTW^V\U^\^QY_T\JON\Q_BB	chr10.fa		5572880	F	35G	106					
+HWUSI-EAS610	1	4	5	1167	537	0	1	GACTTTCTTTCTCCTATACCTTAGTTTCCTCATCTG	aaa_a_`Z[a`a^^_`a]___`_a\__ZX`]Z_S__	chr10.fa		5572978	F	36	119					
+HWUSI-EAS610	1	4	97	1133	50	0	1	AGAAAAAAAAAACAAAAAACAAAACAAACAAACAAA	abaaa`a__Y^YNU\aaa^\^^`^WY^ZN]]ZN\_Y	chr10.fa		5573656	F	36	5					
+HWUSI-EAS610	1	4	100	1256	594	0	1	AGAATTATCTGTTTAGGTCCATACTCATTATTAAGT	Xaa_aa`bZ_aa^\`aaaab```I`H`]]_Y_]BBB	chr10.fa		5573927	R	36	105					
+HWUSI-EAS610	1	4	44	746	2009	0	1	GAAAGGCTAAAATCAACAAACCAGCCAATGACAAAT	aaaaaaaaa``aaaaaaaa```aa_^a__`__`_a_	chr10.fa		5574076	F	36	119					
+HWUSI-EAS610	1	4	79	998	425	0	1	TTAAGTCCACTTACCTGCAAGATTCATTTTTCTCTT	aba`]\a`_`aa`_a`a`a`a_aaa`a``a`_aaaa	chr10.fa		5574446	R	36	119					
+HWUSI-EAS610	1	4	34	298	147	0	1	CTGTGTGCTAGCACAGATGCAGAAAGACAAACACCA	aaaab_baaaaabbaaaaaa`aab`aaaaaaaaa]^	chr10.fa		5574497	F	36	119					
+HWUSI-EAS610	1	4	89	602	178	0	1	ACTCCTGATTTCTGTGGTCACTGCACCTTCCTTCCT	a`bbaba^bab\ba_b``aaaab^aaaaaZaaaa[]	chr10.fa		5574587	R	36	119					
+HWUSI-EAS610	1	4	49	1045	1630	0	1	AGCCTAAAGAACCCTGAAGCTGATGCTTGAAGCATT	`baaaaaaaaaa\aaaa``_ba`___aaa_aa^_`a	chr10.fa		5574715	R	36	119					
+HWUSI-EAS610	1	4	92	223	1140	0	1	TGCTTCAAGCATCAGCTTCAGGGTTCTTTAGGCTTC	aaaaaaabbaab`\`aa`_Z^aaXaaaa_]a`a__a	chr10.fa		5574717	F	36	119					
+HWUSI-EAS610	1	4	46	1374	1674	0	1	ATCTACATTGACTTTAACGGATCAGCGGATGAAAAA	`^YXLVbb_ONPa^Q[NObaaOJRQTGQWFFF[aa_	chr10.fa		5575712	R	26T4C4	92					
+HWUSI-EAS610	1	4	37	1077	1477	0	1	CTACTTCCTGCGCACCTTCTAATATTCGCAGAGGTC	aaababba_aaaaa_aababb^baaaaa\_aU\``_	chr10.fa		5575964	F	36	119					
+HWUSI-EAS610	1	4	47	437	258	0	1	TGGCCAACCATGTGTCATTTTGTCAATTTCCCAAAT	a`_abbab`a``[bab^bbbab]Uabbbaaaaa_Za	chr10.fa		5576109	R	36	119					
+HWUSI-EAS610	1	4	72	918	1701	0	1	GAAATCAGTGTGTTATTGTGTGAGGAATGGATGCCT	]GJ_][XYK__N\PTX^PWaQ_Y___]V]RQLTT]Z	chr10.fa		5576474	F	11T24	97					
+HWUSI-EAS610	1	4	20	1066	745	0	1	CTTTTTAGGGCTGGATTCATGGAAAGATAATGTGTG	abbbbb`\ba`abbaaaa_abbaaaa`aa`ab_b_a	chr10.fa		5578517	R	36	21					
+HWUSI-EAS610	1	4	15	1352	1545	0	1	CAAAAAAGTCAAGGAAGGGCATTTCATACTCATCAA	ab`babab`abaaa`[aa`a]aa`aYa__a]_a_aa	chr10.fa		5578948	F	36	26					
+HWUSI-EAS610	1	4	92	314	1262	0	1	ATAGGACTGTTTAGATCATTAACCTTATCTTGGTTT	`a``a[aab`a_]````aa_^aaaa`_``]``^OY`	chr10.fa		5579996	R	36	8					
+HWUSI-EAS610	1	4	49	741	963	0	1	CAAATGGTGCTGGCATAATTGGCAGTTATCATGTAG	aba`bbb_aaaabaaaaabbba`a`Z^T^]`__[[W	chr10.fa		5581503	F	36	7					
+HWUSI-EAS610	1	4	53	173	1896	0	1	CCTAGCATCCATGTCACTGTCGCAGCTCCTCCCATG	aa_Z_aa`aa`aa^a]`^a\`^`\]^\_]T]^\XXY	chr10.fa		5585558	F	36	119					
+HWUSI-EAS610	1	4	7	452	1376	0	1	TCAGCATATGATGAAGGAGCCTAGTGACAGGGTCAA	`babaaabb`aa`Z`]aaaaba_b]aaaaaaaUa`a	chr10.fa		5585618	F	36	119					
+HWUSI-EAS610	1	4	44	126	1485	0	1	AAGAACCATGTGAATCTTGACCCTGTCACTAGGCTC	]b`aabba`a^bab`a``a]a_baa]aaaa][aa`b	chr10.fa		5585634	R	36	119					
+HWUSI-EAS610	1	4	77	525	620	0	1	TGTGTACAGCATTTGATTGAAAGTGCCTTAGCTCCG	a^]aab_Y]\aa`a__]]_a`[`Q\]\^`^`[`\a`	chr10.fa		5585680	F	36	119					
+HWUSI-EAS610	1	4	85	387	32	0	1	CGGAGCTAAGGCACTTTCAATCAAATGCTGTACACA	`b_[aa^baaabab^X_`aa_aa[_]``aa__``_`	chr10.fa		5585680	R	36	119					
+HWUSI-EAS610	1	4	26	934	502	0	1	TGCCTTAGCTCCGTGGTTAAAAGCATGTGCTGCTCA	_`aa_R]`_`[QaP^``a_YR]ZUR\XVaS_^MUW`	chr10.fa		5585703	F	36	118					
+HWUSI-EAS610	1	4	45	1316	218	0	1	CATGAGCAGCACATGCTTTTAACCACGGAGCTAAGG	^``[`a\]O_b__]a__aabaa\`b_\T\[_aa`^`	chr10.fa		5585705	R	36	119					
+HWUSI-EAS610	1	4	18	889	652	0	1	CAGAATCCAAGTTTGAGTCCCAGCACCCACATGGGG	[\Xb^ab`aSY`a``^a```_a^`^a^_aaaZ^Za^	chr10.fa		5585743	F	36	119					
+HWUSI-EAS610	1	4	98	785	1512	0	1	TATGTGTGTATGTGTGTGCCTAATTGTGTGCATGTG	`aba_b[N_P^Y_b_a]a^]_aZ^aa_`W]^^_a]a	chr10.fa		5585846	R	36	119					
+HWUSI-EAS610	1	4	2	1250	1232	0	1	TGTGTGTTTGTGTATAGGTGTATATGTGTGTATGTG	aaX`_a^aa`Q^__`aa`Wa_a__`a\UY[Z]\VPT	chr10.fa		5585868	R	36	38					
+HWUSI-EAS610	1	4	94	577	1505	0	1	TACACATAGACCAAGACACACAGAAACACAAGCACA	abba`aaZ_]`_babbba^__ab_S_a`a_aaaaaa	chr10.fa		5585904	F	36	119					
+HWUSI-EAS610	1	4	14	303	1043	0	1	GCAGGACTAGGCAAATAATGACTAAATGCAAATTAC	ab_baaaaabbbaaaa_^aabbaaaa`aaaa`a_a`	chr10.fa		5586429	F	36	119					
+HWUSI-EAS610	1	4	15	923	603	0	1	GAAATTTAAGAATACAACATGTGCAATCTAATGAAG	a^a`a```^Y\[_a]^_[_\`Y_^_Z_\`]]^_^\Y	chr10.fa		5586705	R	36	119					
+HWUSI-EAS610	1	4	16	1080	1180	0	1	GAAATTTAAGATTACAACATGTGCAATCTAATTAAG	a]a``ab\a_TF\]VYX]aa^X_]Z][V_\_SG][a	chr10.fa		5586705	R	11A20G3	96					
+HWUSI-EAS610	1	4	37	1568	883	0	1	TTTATGCAACAGATATTTATTTTCTGTCATTTCATA	aaaa`Y_`__```a_aaaaaa`a`a_]^_`a^]_a_	chr10.fa		5586753	R	36	119					
+HWUSI-EAS610	1	4	63	1089	644	0	1	TTTGATGCACTTGTCAGTTTCCGACCATTTGTACTA	_^ZVN[^_^aX[]\^]QZN\TFJV]TIS]VTUQSXZ	chr10.fa		5587262	R	21A14	106					
+HWUSI-EAS610	1	4	74	737	1914	0	1	GGAAACAGCAATCCTCCCTTCCCTGTGTCTTTCTTC	aaaba`aaaba`aaaaaaaa`_a_]\_V_`]_\^_^	chr10.fa		5587487	F	36	119					
+HWUSI-EAS610	1	4	6	1755	537	0	1	CACCTGGACAGCAGATTTATGAAATAGATTGTTCTT	abbaaa_aaaa`a_aabaaaba`aaaaa`aa__`aa	chr10.fa		5587594	F	36	119					
+HWUSI-EAS610	1	4	92	523	1626	0	1	AAAATATCATTCACAAGAACAATCTATTTCATAAAT	ab_Z`a_aa^_aaa^^``a]a]___V_a_a_``a^`	chr10.fa		5587608	R	36	119					
+HWUSI-EAS610	1	4	31	114	429	0	1	TGTGCCCATGTGTAGTGCTTAAGCTCATCAACAATC	aaW]bbba[]^b_ba_aaba`a`baba`abbaa_]a	chr10.fa		5588003	R	36	119					
+HWUSI-EAS610	1	4	49	391	2008	0	1	AGTCTAACCTAATCTAGCTAACTATCAGAGTGGAGA	_b\babaaba`bababaa_aa`aaaaaa^_X`_``a	chr10.fa		5588502	F	36	119					
+HWUSI-EAS610	1	4	80	1290	91	0	1	CATTTAAATGATGCTGATGAAGGGACTCAGACCCTG	`abb`^^_W_`_a[ab_aa``a[``_aa_\__]a`]	chr10.fa		5589002	R	36	119					
+HWUSI-EAS610	1	4	9	248	1418	0	1	TGAAGTACAGGAACAATGTGAGCATTTAAATGATGC	_WMY`Ua_^aaa`_]P`b``_aaaWa^XXaa`]_a_	chr10.fa		5589024	R	36	118					
+HWUSI-EAS610	1	4	22	422	170	0	1	GTTAAAAATCACTATCCTGGTACCGACACACTAAGC	a_a^`b_`a`_`aa\]_^__L^]]_^[`\^X___a]	chr10.fa		5589069	R	36	119					
+HWUSI-EAS610	1	4	37	698	575	0	1	GTTAAGGTTAAAAATCACTATCCTGGTACCGACACA	aaa_^aaX``^`a_`__``_``Z^a^W^^``]]W^^	chr10.fa		5589075	R	36	119					
+HWUSI-EAS610	1	4	70	1333	981	0	1	ACCTTGTGAAAATATCATCTTCATTAACAAAAGTAT	a`Y`^a]U^SFWaT^a[a_aaU\[a[`]YWI[UY[X	chr10.fa		5589180	R	36	117					
+HWUSI-EAS610	1	4	47	1128	956	0	1	AGTGGGAAATCTTCCAGTCACTCACTTAGGGTATAC	ababYbabaa^abaa^aZbbb`a`\ba`aabUaa__	chr10.fa		5589389	F	36	119					
+HWUSI-EAS610	1	4	50	748	865	0	1	AGAAAGCACTGCATTATGGCAGGAACACACATGGTA	abab`a[a_a]VT`_a__RXW_YBBBBBBBBBBBBB	chr10.fa		5589495	R	36	62					
+HWUSI-EAS610	1	4	97	642	536	0	1	CCGTGAATTAGAGCAGAGTGTCAGTTTTATTTTGTC	`baXYQ^]a^\_Z_]b_aRaV^ZaP]GQQU`]]BBB	chr10.fa		5589758	F	26C8A	91					
+HWUSI-EAS610	1	4	57	1525	333	0	1	AAATTCGTTCTCTTTATGAGTTTCTAAGCTTTGCAG	aaaaaaa]a_a`aaaaa^^`__`_`a_^[]_^ZY_`	chr10.fa		5590065	F	36	36					
+HWUSI-EAS610	1	4	38	1130	30	0	1	CCATATTAACACCTCACTGGTGAAACTGATGGCTTT	^aba`a]aaab`aaaaaabb_aaaa]T]^Z[^^a__	chr10.fa		5590781	F	36	119					
+HWUSI-EAS610	1	4	91	1574	1259	0	1	TGAAACTGATGGCTTTGCTTTACCTAAACCAACCCA	aababa`aaa`a`aa__`aab``\aaaT]```]`]`	chr10.fa		5590801	F	36	119					
+HWUSI-EAS610	1	4	66	852	1451	0	1	TGTACATCCGTTCTTCTCATTGTGACGGTGAACTCC	_`Xa^aa]]a`_[^_`_^_`SJV`_]_^MFM]GQX[	chr10.fa		5590909	R	36	116					
+HWUSI-EAS610	1	4	48	549	871	0	1	GCTTAGCATAACTGTCCTCTGAAAGGCTCTACTTAG	aa\\a]V^a`a_aaa__a`aa\Zaaa^RZ`Z]__`\	chr10.fa		5591176	F	36	33					
+HWUSI-EAS610	1	4	73	1767	616	0	1	CAGGTGTGTATTATGCTCTTTTGTTGATGGTTCTGT	aba][[O\[`aaa_\aabbaaa[Za_]`WHT_``]_	chr10.fa		5591373	R	36	118					
+HWUSI-EAS610	1	4	37	1239	1385	0	1	ATCAACAAAAGAGCATAATACACACCTGGACCTAGA	abbbb_aba`a`a`aaabba_a`a^_`[a`]\a_^`	chr10.fa		5591381	F	36	119					
+HWUSI-EAS610	1	4	33	115	219	0	1	GTTTATTGCTTAAACATATACCCACCCAATTCCCAT	a^aabbabb`a`aaaaaaaaaaaabb`\^`_aaa_`	chr10.fa		5592051	R	36	119					
+HWUSI-EAS610	1	4	89	300	1782	0	1	GAATTGCTTTCCTATGTCTACCATAATAAAGCATCA	\U[_^baaabb`]U`S_b_Y^`URZb`ZQW_^T[b_	chr10.fa		5592290	F	36	118					
+HWUSI-EAS610	1	4	66	1094	300	0	1	GAACAAAAATGCTCATTGGCTAATCCCAGAGGCACA	_]ba`Zaa[_Y\]^_`b_`abaa\\_`_\[``]]WW	chr10.fa		5592422	R	36	119					
+HWUSI-EAS610	1	4	78	641	1956	0	1	GTGGGTCCTATCTCCATATCTGCTTCTGCCTTCCCT	a_aaa\^^a\``a]___S_U_VT^_URFLS\]SSXW	chr10.fa		5592744	R	36	117					
+HWUSI-EAS610	1	4	56	189	448	0	1	ATGCTGCGAGCTGAACCCAGGTCCTCTGCAAGAACA	aabb`a_b]ababaabbbab`\ba_a_aaa`aaaa]	chr10.fa		5593048	F	36	53					
+HWUSI-EAS610	1	4	74	576	1934	0	1	CTGCAAGAACATAAAAGTGCTCTCAATTGCTGAACC	abbbb`babbbb`b`\a_a`abaa`aabbaabaaa[	chr10.fa		5593073	F	36	119					
+HWUSI-EAS610	1	4	78	996	1085	0	1	GTCTCTTGCTGAAGCTGGAACTCTGTTTTGGCTACT	aa`a_aaaaaa```aaaa_`]a_`a]_a`_`^_`X^	chr10.fa		5593299	R	36	119					
+HWUSI-EAS610	1	4	57	1206	2014	0	1	ATACACACACAAACACGCACGTGCATGCATGTGCAT	aba`a^]_`_a__U`_^Za^^V_X^^WV[VTVUW^W	chr10.fa		5593369	F	36	119					
+HWUSI-EAS610	1	4	28	394	1147	0	1	CACACACAAACACGCACGTGCATGCATGTGCATACA	aba`aab_``a_aa``aa[`aaa`aa_]^`_]_a_a	chr10.fa		5593372	F	36	62					
+HWUSI-EAS610	1	4	12	1079	85	0	1	GGATGATCCAAGCAAAGGAACTGAGAGCACAACACC	_Z]a__V]`YVYZa_`]XX`LMHM`MUHX^GRWSL[	chr10.fa		5593493	F	27G2C5	92					
+HWUSI-EAS610	1	4	34	401	1704	0	1	TAGGAGTTTTAAGCTCAAAAAATCATACGATTCAAC	abaa`b`aabbaaaaa`b]P]aaabaaaaaaaaaaa	chr10.fa		5594036	F	36	119					
+HWUSI-EAS610	1	4	19	496	487	0	1	AGGGAGAATGGATTTTATAAGATCGCTGGTCCTCTC	]bab__``abb]_bb^bbbabaaa_a_^`OUYaWa`	chr10.fa		5595606	R	36	119					
+HWUSI-EAS610	1	4	64	75	78	0	1	AAAAATTCTCGGAGAGTCTTACTCACTGTTCCAGGG	XPVQa^ab_ba`aZ[aV^_Z\aabba]b`a``_`^]	chr10.fa		5596430	F	36	119					
+HWUSI-EAS610	1	4	6	663	994	0	1	TAAGACATGCATATATTGAACACTCATTCAGACAAA	a``]`U[__JT]`]FZVb_`Zaa`Q[\ababXZbBB	chr10.fa		5596619	R	36	108					
+HWUSI-EAS610	1	4	67	1496	120	0	1	TCAACCGTTATTAGGTCTCATGGCATCTCTAAAACT	a^`_^_SZ\___^T]W__[_^SZZ^PU^]_^`]]ZW	chr10.fa		5596670	F	36	119					
+HWUSI-EAS610	1	4	17	1760	813	0	1	CCATACTGCCTTTGCTGTAGTCATTTGGATTCAGGA	_abbbba`aabaaaab`ab`aabaa`\]_aaaa_\a	chr10.fa		5597690	R	36	119					
+HWUSI-EAS610	1	4	23	348	427	0	1	AACAAAGTCTATTCAGAGCACTGGTCAGAAATATTT	aa_`a^a]aaa_`^\^_```__baZa_a_aaa`aaa	chr10.fa		5597761	R	36	119					
+HWUSI-EAS610	1	4	23	34	393	0	1	CGGGGGACATGTGTGTGGAGGTCTAAAGCTGACAGA	abaaaa\aaaa`a^a^aa]aa\a````a``a^_Z_`	chr10.fa		5597897	F	36	119					
+HWUSI-EAS610	1	4	25	1402	656	0	1	TCAGCTCTGATATGGGCTAACAACCAGGGGATGGTG	a_a`[aa`a_aa_a_````]_`a`V_^__W^^_]W_	chr10.fa		5598703	R	36	119					
+HWUSI-EAS610	1	4	30	1360	1200	0	1	AGCTTTCCTGACAAGCCACCAGATACATGCTGTTGC	]aabbVP__[YS]X^]V_ZWR\XS_\aXQIYTPa^[	chr10.fa		5599094	R	36	118					
+HWUSI-EAS610	1	4	45	695	824	0	1	AGAACCAGCTGTGCCACCTCATTCTCCTGCCTTCCT	aaaba`a``a`Wa_`_^aa``aa^a\^]a\Y]`\^]	chr10.fa		5599161	R	36	119					
+HWUSI-EAS610	1	4	66	1584	680	0	1	ATGCCTGCCATGCCTGCATCAAGCCAGAGACATTTC	a`[aa`^a_`a___`^__`a`aVZ^`__Z_\^_\__	chr10.fa		5599417	F	36	119					
+HWUSI-EAS610	1	4	6	1076	1853	0	1	CAACGCTGTCTTATCTTGCCAGGGGGGAGCAGAAAT	^b`TZP[YGXT[_`bb_`]]R_a^J\DTTHLX_Ob\	chr10.fa		5599499	F	3A22A9	82					
+HWUSI-EAS610	1	4	15	277	615	0	1	GCCAAGGAGACTCGCTACTGTGCCGTGTGCAATGAC	aabbaabaa]aaaaa^`a^``aaaa\aYX_X_[^^`	chr10.fa		5599807	R	36	119					
+HWUSI-EAS610	1	4	44	1171	1075	0	1	ATCCCCCAGGTCTCACATTCTTGAGAGGGGAAGGAA	aa]^`^^]\aS^`_]U^`a_`a__[Z[]a_\WYa\_	chr10.fa		5599980	R	36	119					
+HWUSI-EAS610	1	4	16	560	1520	0	1	GTATATTATGAATCGTTATTTCAAAATGTCAGAATA	a__a_bb`_b[ba`aYaaaaaaa_aaa`[ZIY__`a	chr10.fa		5600031	R	36	118					
+HWUSI-EAS610	1	4	50	1643	1479	0	1	TGTTTACTCCTCCATTTTCTTGGTTCCTCTAGAGCT	]_]``a`a`Z[a\_aaa]O^`]\\_^]]Z]]_^]Z_	chr10.fa		5600623	R	36	119					
+HWUSI-EAS610	1	4	40	699	1723	0	1	AACCAGAGGACCGCTCGCATGGATTTGGGCTTGAGC	ZbabSSaT^aa\X`a\a`\]]GNLWaaa\`^PXH[Z	chr10.fa		5600721	F	36	116					
+HWUSI-EAS610	1	4	21	70	823	0	1	CACACCCATTCTCCGACCAAGAGATTTTGGTAGGGG	a[`\`babaababbaab`W_a_aW_aaaaaY\_]\`	chr10.fa		5600786	R	36	119					
+HWUSI-EAS610	1	4	50	596	806	0	1	AACCCAGCATCTGCACTGAAAGCTAAAAACTGCCTG	__aa___a^a]`a_a``aaa_a__aa_]`]__^[]_	chr10.fa		5601385	R	36	119					
+HWUSI-EAS610	1	4	45	1129	1685	0	1	GTTCTTTCAGAGAACCCAGCATCTGCACTGAAAGCT	Z`]^aa`NYQXW_aaX[_UQ`VU_\NVJZXYXV`NX	chr10.fa		5601397	R	36	117					
+HWUSI-EAS610	1	4	14	1588	320	0	1	GTGAATATGATCAGAATACAATGCCTAGGGAGCTGT	S[TMVZaW[\]TZ_]a\VZaa\^[_a`a\OVN]]BB	chr10.fa		5601464	R	35G	107					
+HWUSI-EAS610	1	4	4	414	507	0	1	AGACAGTGAGTGAATATGATCAGAATACAATGGCTA	X`ba\^a`[ZZ_MT`\W]\Z^``V__W__\VYH\^B	chr10.fa		5601473	R	32C3	101					
+HWUSI-EAS610	1	4	78	681	940	0	1	CTCCCATCTCTTCTCAGAGCATATCAAGGCTCTTTC	aabaaabbbabbaabaabbbbaab`aaaabba`bba	chr10.fa		5601507	F	36	119					
+HWUSI-EAS610	1	4	59	1307	1165	0	1	TATCAAAGCCAGTTTGTACTAGTCATGAACCCCTGG	_bbb]_PLRWb`^`a]ab_`\```[ZZTVW[WV\`b	chr10.fa		5601580	F	36	118					
+HWUSI-EAS610	1	4	54	655	418	0	1	CAGAAAGTTAGTATCTGTGACCATCACAGTAGGCAG	a`b```b^bbaabbaa``aa``aa``_`a_`aa]^a	chr10.fa		5601725	F	36	119					
+HWUSI-EAS610	1	4	1	271	953	0	1	GGATTAAGAGGGCTGGCCGTGTAGGAAGGGTTGTGA	aaa`b``aa`^\aaaa\a`R]\[`^^^`a`S^\KYV	chr10.fa		5601917	R	36	118					
+HWUSI-EAS610	1	4	83	937	1309	0	1	CACGGCCAGCCCTCTTAATCCTTCCCAAACAGTTCT	aaY^T_MW]Waaba]]TZ\[L_aRZ]`ZHQZOOX]a	chr10.fa		5601932	F	36	117					
+HWUSI-EAS610	1	4	7	1272	659	0	1	GTTTGAATGAAAATGGCCTCCATAGACTCATATGTT	a`a_]]a``^`a^`[`^^`__``_]X[_\\^__`]_	chr10.fa		5601991	R	36	42					
+HWUSI-EAS610	1	4	6	818	532	0	1	GTCTATGGAGGCCATTTTCATTCAAACTACTACAGC	a_`[__a`YX_\^S`a_`]aY`Z^Z`]^a]]_Z`__	chr10.fa		5602000	F	36	43					
+HWUSI-EAS610	1	4	49	781	1560	0	1	TGGTAGGTTGCTGTAGTAGTTTGAATGAAAATGGCC	abb_`b`_a__ba____aa`aaaa^a`_aa_`^``^	chr10.fa		5602009	R	36	119					
+HWUSI-EAS610	1	4	15	864	1261	0	1	GACCAATTGTGAGTGTCTGTATTGATTTCCAATAAC	_TY_a_`aa]aYY[[^\]aR^^ZU\[^[ZQZS\X]S	chr10.fa		5602348	F	36	118					
+HWUSI-EAS610	1	4	72	1643	1915	0	1	TACATCTTTCTTAGTCCTGGAAGTTGCCATGCAAAC	aa``a_aa__`P]_]a``a`a__XU^UR_]X]`^`^	chr10.fa		5602725	R	36	119					
+HWUSI-EAS610	1	4	69	606	1213	0	1	GTGCTGTGAACCAGTTCCTTCTTTTGGAGGTGTTGG	aab`ba]`abaa\baaa`abaaaba]a[aTP^\^\a	chr10.fa		5602919	R	36	119					
+HWUSI-EAS610	1	4	3	397	1252	0	1	CAGTGAGTTCATGTGGCTTTGCTATTTGGGACATGG	abbabb_J`]_bbabaa^a`^b_Sbba]aba]]aba	chr10.fa		5603146	R	36	118					
+HWUSI-EAS610	1	4	69	1325	766	0	1	ATGGACTCAAGCCAAGGAGCCAATGTTTTGTGAGTT	abbb^Z_Z\_[W`a_^U_`TTXT_\OW^_\^ZV_Ta	chr10.fa		5603302	R	10A25	87					
+HWUSI-EAS610	1	4	38	1371	1135	0	1	TCATGGGAGTAGATAGTGAACAAGCATGAAATGGAC	aa_bbaa]aX`a^_aa]`\a_`^_]_`_`b]_`^V[	chr10.fa		5603619	F	36	119					
+HWUSI-EAS610	1	4	14	1050	1533	0	1	TGTTAATTGTATGTGTGTGTTTGTATGTACACGTGT	ab_`^_ba^_``a]aW\X``aaa^_a`Z]Z]\`[`]	chr10.fa		5603692	F	36	119					
+HWUSI-EAS610	1	4	99	1026	1964	0	1	AGTCAGAGGTATCATACCCCCCGCCAAACTGGAGTT	a```a`abaWa^aaaaXKT`_\\N^_\\HZRVU\NU	chr10.fa		5603761	F	36	117					
+HWUSI-EAS610	1	4	24	1298	296	0	1	AACCCAGACTCACAGGCACCTACAATAGGAGGGGCC	ab]_\aa_Y^\`Ya^^]a]XV^]]^YY[VZGUU^S\	chr10.fa		5604355	R	36	33					
+HWUSI-EAS610	1	4	13	159	1433	0	1	GAGGTTTCCTGTCAATGGCAGGCACTCAGCACTTAG	a]ab\_abaaaa``bP`aaaaaa`]_aZ[[GZ`[M\	chr10.fa		5604549	F	34G1	100					
+HWUSI-EAS610	1	4	12	155	720	0	1	CAGGCACTCAGCACTTGGATCATTTTAAGGAGGCCA	`baJaa`b`aa^_aU[baG_WO_[]X^N_`a]T_I^	chr10.fa		5604567	F	36	116					
+HWUSI-EAS610	1	4	38	19	455	0	1	TGGTTGTGATGGTTGTGCCGCTGTGGCGGGAGGTTG	`aa\aa\a``aa^^aT^_`^[P[Z^BBBBBBBBBBB	chr10.fa		5604729	R	29T2C2A	64					
+HWUSI-EAS610	1	4	29	8	139	0	1	CAAAACCCAAACCTTGGTTGTGACAGCCCTGGCCCT	^_W_W_bbTXbaaZa`a`bT``I_ba\\OGW_BBBB	chr10.fa		5604774	R	T27T4T2	43					
+HWUSI-EAS610	1	4	16	549	308	0	1	GCAGTTGCTACTTCTTTTTTACTGCTGGGTAGGGAT	aa`a]W]`WLL^[XG_``^Z[GM\VF[Z[KLP^_BB	chr10.fa		5604869	R	36	105					
+HWUSI-EAS610	1	4	76	104	1682	0	1	ACCAGCAGCTGTGGTAACTCAAAAGCAGCTGGTTTA	aba[ab_abab]abUV\`_]TVZZ__U_aaab___Q	chr10.fa		5605046	R	36	119					
+HWUSI-EAS610	1	4	48	939	1079	0	1	GACACAAAGGTAGATGTTTTGTGCTCCAGATTGCCA	`OY]`^ZYaWEZaU`b^`XR^PZ[WLGY_W`\]WZV	chr10.fa		5605271	F	10A25	107					
+HWUSI-EAS610	1	4	66	839	633	0	1	GTGCAAATTCCAGTCTCTCCCTCTCCTGCACCTCAA	a`__`\aa___``]_a[__\__^_`_]_^_____^[	chr10.fa		5605331	R	36	119					
+HWUSI-EAS610	1	4	12	1169	1747	0	1	GACAGGGACATACAGTAGTAAGTCACCAGGAAGTGA	aaaaaaa_aaaa`aa_aa`aaa_`a__`a_``aX`a	chr10.fa		5605383	F	36	119					
+HWUSI-EAS610	1	4	86	297	1842	0	1	TGACAATGGAGCCAGGTGTAACCATTACAGACACCA	aaba\U_ab]Pabaa^T`[R\aba`X_`S_]]a`a`	chr10.fa		5605416	F	36	119					
+HWUSI-EAS610	1	4	34	806	996	0	1	CAGGACACTTGAGGCAGGGATGGATATCTGTTAATA	a^bbabbabbb`abaabbb_aa^^aaa`abaa`_^a	chr10.fa		5605484	R	36	119					
+HWUSI-EAS610	1	4	91	510	1174	0	1	GTTGGTAATTGCAGTCAGGACACTTGAGGCAGGGAT	aWaaaN_^^_a`_`\__`]R]^V\__Z``\\_`_YS	chr10.fa		5605499	R	36	119					
+HWUSI-EAS610	1	4	16	870	906	0	1	GCAGAAGGGTGGGAGCCTTGGTCTATGATAAGGTGG	`V\_UPQX\W^YMS]UU_S\STMWPW^UWWSS\W]W	chr10.fa		5605598	R	36	118					
+HWUSI-EAS610	1	4	78	584	524	0	1	TCATCCTCTTCCTTGGTGCCTGTCTCTAGGCTGCCT	abba`a`aaaaaaaab`baaab^aa`a``a```^`a	chr10.fa		5605779	R	36	119					
+HWUSI-EAS610	1	4	32	1669	1303	0	1	GTACCATGGTGAGAGAGTGCTACTGCCCTTCTGTCC	X`ab^]_[PO]bYJYbTK\^`]a___a_`_`^ZZ^_	chr10.fa		5605828	R	36	118					
+HWUSI-EAS610	1	4	77	1196	1982	0	1	CCAAGAGGGTAAATTGACAAAAGGAGGCTGCCTAAT	_``aYaabUW]abaaaaa`ba`HXRK_a_^RJRYa_	chr10.fa		5605882	F	36	117					
+HWUSI-EAS610	1	4	89	653	2014	0	1	ACAGGTACAAAGCAAGCCCATGGGTCATCAGCTGGC	\`]]]NQ\b_VZ\[]T\_\`]T[H\TWQ_P_`BBBB	chr10.fa		5606050	R	34T1	98					
+HWUSI-EAS610	1	4	85	386	1486	0	1	AGATGGTTGTGTTATATGGCTAACAGGTACAAAGCA	ab`b`\aba_baabaa`a_aaa]abbb\`a`_``b`	chr10.fa		5606072	R	36	119					
+HWUSI-EAS610	1	4	13	1715	1016	0	1	GCCAGCGGCATTTTCATCTAGAGACATGTCTTTGGG	aZ_a`^PWXXZV_^__VUZ\WXTWPVWVURWQUBBB	chr10.fa		5606129	F	36	105					
+HWUSI-EAS610	1	4	24	1230	436	0	1	AAATGAGTGTGTTTGTTATCACCCCGAAGACATGTC	XaRaaOUW`X_Y_\]`^^[]_a\YSEXa^YRTZ]X^	chr10.fa		5606151	R	25A10	109					
+HWUSI-EAS610	1	4	44	1119	36	0	1	AAGTTCTTAGATGATCCATCTGGACCAAGTTATGAA	aba```aaaa`a``aa_aa_aa[_^^``aY_``a_`	chr10.fa		5606219	R	36	119					
+HWUSI-EAS610	1	4	91	507	155	0	1	AGCTCACGTGTTAAGTATGTTCATGTTGAAGCACAG	abbaaa`b_bababbaaaa`a_aaa_`aa___]`^a	chr10.fa		5606529	F	36	119					
+HWUSI-EAS610	1	4	44	430	521	0	1	ACTCCCACACATGCATATGCAGACGTGCACTTACAC	aaaabaaa_aaaaa_aa`_a_`_aa^_a`a`_a^a_	chr10.fa		5607404	R	36	119					
+HWUSI-EAS610	1	4	81	1438	482	0	1	GGCTTTCAACCTATCCTAACGGGCAAGTTCCAGGTC	T^a]aa_XWHX[^aa`a`^[_]\a```Y[]T\^ZR^	chr10.fa		5607487	R	36	118					
+HWUSI-EAS610	1	4	27	641	1971	0	1	AGGTCCCTGAGGCTTTCAACCTATCCTAACGGGCAA	^]NNN]X_^a`_]`a\Q``\``]aV`^T\Y_\QZ``	chr10.fa		5607497	R	36	118					
+HWUSI-EAS610	1	4	87	302	1685	0	1	TTAAAGTATCTGTCATGAGTTTTTCCATAATGGCTC	a`SYWa\a`baa`aa`a]a[aaaaaaa]Q]`a_a_b	chr10.fa		5607676	F	36	119					
+HWUSI-EAS610	1	4	68	1360	1760	0	1	TGTNTCTAGCTGGCTCGTTTTGGTGGTGATTTTTCT	abUD\^aaa^a`a__[a`aaaaa]aaO_RX_`_]Q_	chr10.fa		5607755	F	3C32	110					
+HWUSI-EAS610	1	4	14	1127	1228	0	1	AACAACAAGAGCGACAAGAAAAATCACCACCAAAAC	^a[a_T]a`_a_aa_a`aa``_`_]`^]a^____`^	chr10.fa		5607771	R	36	119					
+HWUSI-EAS610	1	4	88	449	146	0	1	TTTGGTGGTGATTTTTCTTGTCGCTCTTGTTGGTTT	aab^ZO[_]a\\UX`a^BBBBBBBBBBBBBBBBBBB	chr10.fa		5607773	F	32T2G	32					
+HWUSI-EAS610	1	4	48	1619	1624	0	1	ACCACTGATGTTTAGAACAAGAAGAAGCTATTTCAA	X_Z_U`a_^_Q\]]`U`aaabW__T_a]W`^_aa[a	chr10.fa		5607905	R	36	119					
+HWUSI-EAS610	1	4	16	225	237	0	1	AGGCCAAGTCCAGGCAAACCACTGATGTTTAGAACA	aa`^^MR`T\`aa`_]^Z^`\`]aZY`V[L\VYVPY	chr10.fa		5607922	R	36	118					
+HWUSI-EAS610	1	4	14	441	174	0	1	GTGGATGCGTGGCACAACCAGTTTCACAATATAAGT	`_`____^\W^[]`_``\a^a]_\[^]^]__]]_BB	chr10.fa		5608066	F	36	110					
+HWUSI-EAS610	1	4	94	772	547	0	1	ATGGACAGCAAACATTCCCCCTTCTTCTTTGGTGTC	aabaa`aa_aaa^_ba_`_`aaa_aa_aa`aa^a``	chr10.fa		5608273	R	36	119					
+HWUSI-EAS610	1	4	84	1646	1050	0	1	CATAGGGATTTGCAACCCATGGGAAACTCTCCTCTC	a^\`_^[Y`^a_aaba``^a``Ya_NXa_UHU__Z_	chr10.fa		5608426	R	36	118					
+HWUSI-EAS610	1	4	39	116	1964	0	1	GGTGGGTGCTGGAAAAGTCTACACCTTAGTGCAGAC	aa`bba]abbbaa`aaaNa`\`\aaaa_a__baa_a	chr10.fa		5608718	F	36	119					
+HWUSI-EAS610	1	4	81	1323	86	0	1	AAAACTAGCCAGCACACCTACTGTTGTGATCAAGTC	aa]a^_\N[V_]^^]^^^[UT__Y^]YX[WV[Z]YW	chr10.fa		5608793	R	36	118					
+HWUSI-EAS610	1	4	34	505	1627	0	1	TCAACCCAACAGACAAGCCTTGTGACAGGTACTAGC	aaU_N^_ZXPSZ`aaa_a_GT^SLQ_aPaP[UBBBB	chr10.fa		5608966	F	35T	97					
+HWUSI-EAS610	1	4	11	1623	1275	0	1	ACGGACTAGGGCTGGGTAGTGATCAGCAGAAAGAGG	_]bba___b^Z`\a_b\aaQ^_Y\a]`_^KVZ`\`a	chr10.fa		5609006	R	36	118					
+HWUSI-EAS610	1	4	49	1735	339	0	1	TCTGACAGGTGCACGGACTAGGGCTGGGTAGTGATC	aa`Y\a_YZQT[aa]\^aa`]VN]`TVRS\QTU^]X	chr10.fa		5609018	R	36	118					
+HWUSI-EAS610	1	4	98	84	326	0	1	AGGCTATTATAAGAAAAAAGATTTTAAAGCAATTTT	[Y\^a^Y]Y]`\aU_WT_\_\X`_[[`[_`XLWFW^	chr10.fa		5609303	R	36	117					
+HWUSI-EAS610	1	4	85	879	1599	0	1	AGAAAAAGATGAAGAGGAGGAAGAAGAGATGGAGAC	Z^ZT_``a`Zb``X^_\V_ZQ_a^_X\ab_bab`a_	chr10.fa		5609453	F	36	119					
+HWUSI-EAS610	1	4	15	463	923	0	1	TGTCATCTACTTGTAGGACTAGAAACTGTGGTGAAT	aaYa]bbbXba_\aa\baab\^OZab^aXbb_aSVa	chr10.fa		5610010	R	36	119					
+HWUSI-EAS610	1	4	42	146	831	0	1	TGAGGAGGCAGTGTGATCTGAGTGCTTAGGACATGT	aa\aaabaaR`^bWa``a`a^^\aa_``a`_aa_`^	chr10.fa		5610690	R	36	119					
+HWUSI-EAS610	1	4	64	602	346	0	1	GAAGAAGGCCTGTAAGGGCAATGGGTATGACCACAC	UaZN]`XZaaa^Vaabba]aa^a``Q`_a[]]^Y_X	chr10.fa		5610929	R	36	119					
+HWUSI-EAS610	1	4	39	3	526	0	1	ATAATTGTTGATTTTGTCTACTCTTCACTATGCCTT	a^WXaaaa`b___a_a^_[^a_``__``]`W`^aY^	chr10.fa		5610984	F	36	119					
+HWUSI-EAS610	1	4	31	1444	1329	0	1	CACAGACCTTAAAGCTTCCTCTATATCTCAGGATTT	aaaa``^_`aaa_`_a_`aa_aaa`^_a_a`^_`_`	chr10.fa		5611247	F	36	119					
+HWUSI-EAS610	1	4	23	466	1501	0	1	GATGGTACAGCCATAACCTTCATCATGACGGATACC	a[ab[TWU_]_`aaaaa`Y__XYa``_GZaX`^X__	chr10.fa		5611790	F	36	118					
+HWUSI-EAS610	1	4	66	279	933	0	1	CATGACACACAGTTGGATGACTAATAAAGATTTGCA	a\ab`bbbaaab\aa`YWba`a_`aaaaa_aa`aa`	chr10.fa		5611869	F	36	119					
+HWUSI-EAS610	1	4	32	772	983	0	1	GTACGGTGCAGGACAGATGTGTGAGATAGGAGTGGT	^`b\]]ObX`^U]_Sa_a^V^\WSZ[aTX`K_Z`^^	chr10.fa		5611965	R	36	118					
+HWUSI-EAS610	1	4	58	203	1589	0	1	CACATCTGTCCTGCACCGTACAGCAAGAGTGAAATT	aaaVL[`aUaa`\Zba^ZV]\]O]\^`S`U`]T^VU	chr10.fa		5611980	F	36	118					
+HWUSI-EAS610	1	4	36	378	1674	0	1	GGAAACAGACCCCACTCAGTCTCCATTCCTGTGCCC	aa`]`bb_bb]bbbb]^ZaUaabbaaa`ab_abbbb	chr10.fa		5612025	F	36	119					
+HWUSI-EAS610	1	4	62	168	845	0	1	AAGAGGTTAAGAAGTCCTCTAATAGTTGACAAGGGC	`[b^bb^a`aaaab]ababa]]a^baabaaaaaaab	chr10.fa		5612057	R	36	119					
+HWUSI-EAS610	1	4	16	1188	271	0	1	CTGTGGTTCGAACAATCTTGTCATTCTCATGGACTT	ab`a`b`a_`baaabbaab^aaabaaa_`a``_^aa	chr10.fa		5612169	R	36	119					
+HWUSI-EAS610	1	4	85	1782	870	0	1	AGGGACCACAACGCCAGTCATGTAGTCAGTGAACTC	_aX_`a`aaaa`_`UaaX^``_UaX\`a\W\__\_\	chr10.fa		5612239	F	36	119					
+HWUSI-EAS610	1	4	62	787	607	0	1	TGTTTCCAGATGTGCAATCTTTGCCTTTGGCTTGCA	^\a[`]bab`]UYb[RSa`a`bb_[aa_aa_^X`_a	chr10.fa		5612360	R	36	119					
+HWUSI-EAS610	1	4	95	911	2032	0	1	AACTCAAATTGGGTCATNTGGTTACACATTAGTAAG	a`a`a_`baa^^_]``XDW_aZ``^`]_`_]aZ]__	chr10.fa		5613047	R	17T18	110					
+HWUSI-EAS610	1	4	79	1439	1728	0	1	GGCAGCTTGACTCTGCACCATCCTCTTCAAAGAGTT	aa_bb`aaba`b`ab`a`ab`^_`_ab`a\aa^`_a	chr10.fa		5613214	F	36	119					
+HWUSI-EAS610	1	4	22	479	36	0	1	GCTGTTCCTGCTGGTCAGATCCATGGGAGAGAAGCT	abaa^a[]^]`aaaS^_a`Y]^V^]__SaS`\\^UB	chr10.fa		5613984	R	36	114					
+HWUSI-EAS610	1	4	26	1559	432	0	1	TGAGAAATGGGCTGTACTCTCCTGGGGCTCATTGAA	``YUR][[ZFZXZWX_a[[[_^WTNSTRTQ[YZU]U	chr10.fa		5614039	R	36	117					
+HWUSI-EAS610	1	4	72	981	827	0	1	CTTTGGAGGAGAGGGGAATGTCACAGTTAAGTCTTC	aaabbbabbab_bbabaabbaaaaab_aaaa`aaba	chr10.fa		5614112	F	36	119					
+HWUSI-EAS610	1	4	54	1556	558	0	1	ACCTGTGTTGGCCTGGGTGGTGGTGTCATCCCTGGT	`\\a`N\X`O]`Z^^\Z[^UZ\UTXU[]^\Z\SX\Z	chr10.fa		5614162	R	36	118					
+HWUSI-EAS610	1	4	91	963	1417	0	1	ACAGGAGACTGTCAGGAAGAACCATTCTGTTAGCCA	`^X^ZG^a_aa_`_ba_aa]YZ_a]aa[_^``_X``	chr10.fa		5614192	F	5T30	107					
+HWUSI-EAS610	1	4	51	1420	660	0	1	CAAGCTCTGTTTTTATATAGTTTTCTCTTNCATATA	ab`a^aab`_aabb`bababaaaa`a_a^D\aa`aa	chr10.fa		5614413	F	29G6	110					
+HWUSI-EAS610	1	4	41	1122	1713	0	1	GGAATTGAGCAGGAGGTGAAGCTGCGGCAGACTGCC	aaZ`\\`]XX[``R]\T^R\\ZXXTOXTXXXSRK\\	chr10.fa		5614641	F	36	118					
+HWUSI-EAS610	1	4	87	998	824	0	1	GAGGCGAAGCTGCGGCAGACTGCCATCGAGTCTGAA	a^aOEYPX[RWP]U^XZXMKRRVZXUPXRSMMYVOZ	chr10.fa		5614653	F	4T31	107					
+HWUSI-EAS610	1	4	4	1181	809	0	1	GTTCCCATCAGGACAACAACAAGAGCCCAGGCATTC	aaa`aaaa`a`aa_aa_aa``a^`_a[`a__`a`_`	chr10.fa		5614731	F	36	119					
+HWUSI-EAS610	1	4	22	1469	1726	0	1	GGACAACAACAAGAGCCCAGGCATTCAGTGCGAGAA	a_`Ga`[a]K_a^[KUQ]_a__\`]\^aS_\^Z`I^	chr10.fa		5614741	F	36	116					
+HWUSI-EAS610	1	4	56	351	382	0	1	GGACAACAACAAGAGCCCAGGCATTCAGTGCGAGAA	`]aba]^XM_baaa``]a`a`a`U\``^GPW\H[RZ	chr10.fa		5614741	F	36	117					
+HWUSI-EAS610	1	4	60	1736	1028	0	1	ACAGTGCGTGAAGGTTGGCCTGATGTGTGGACTTGT	aa`]]a_R]T____R`^T`aa`_a^U[QSX\\^[`[	chr10.fa		5614913	R	36	118					
+HWUSI-EAS610	1	4	48	539	653	0	1	AACCAGGAACTGTTTACAGATAGATGGTGTCACCTG	aaaaaaaaaaaa`aaaaaa__`aa_`aZ_^_`_Z`a	chr10.fa		5614985	R	36	119					
+HWUSI-EAS610	1	4	73	1494	269	0	1	GTTCTTCCTGTGGCAAAGCCCAGTCTTTACAGAGTC	[]babbbaaY_a]`ab`_a````^_a`_a`aX[^\[	chr10.fa		5615238	R	36	119					
+HWUSI-EAS610	1	4	68	1352	129	0	1	GGAGGGGGAGGATTTGAAGAAAAGAAGACCTGAGGT	\ZV\USO[TQX]OZZZ__a^]^]RBBBBBBBBBBBB	chr10.fa		5615495	R	36	66					
+HWUSI-EAS610	1	4	25	349	1511	0	1	TGATTTACAGTGACCAACAGAGCCTGTTTGAAATGC	aa\_bbbbbbaababab_Z_abbbab`bb`bba`aa	chr10.fa		5615783	R	36	119					
+HWUSI-EAS610	1	4	47	510	474	0	1	AGCCTGTCAGCAGGCTGATTTACAGTGACCAACAGA	Y_Zaab``__ZZ_Z`aaaaa`^\UY]`_[X\a`XaX	chr10.fa		5615798	R	36	119					
+HWUSI-EAS610	1	4	65	1388	652	0	1	TAACTTTATTTGCTGCTGTTCCTCAAGCTCAAAAAA	`^__`aaa`\]`^`Q^a^]]\[]`\T[ZTXT]\UVZ	chr10.fa		5615905	R	36	119					
+HWUSI-EAS610	1	4	41	43	989	0	1	TTTTTGATAAAAACACAGAGAGAAGGAACTCTGAGA	aabbbbbaa\`U`bab`]I]`b\^a`_baabaaaa_	chr10.fa		5616951	R	36	118					
+HWUSI-EAS610	1	4	35	1327	1684	0	1	GCACTGTTGAACTCGGCACTCCCAGCCAACACTGTG	``b`a^]_aa`^a`a^ZZ]^`\]]_`[^\TXR]YQ]	chr10.fa		5617212	R	36	119					
+HWUSI-EAS610	1	4	53	783	1261	0	1	AACACATATTTCTCTCCATGAGGCACTGTTGAACTC	]aaa`Zaaaaa_aa`aaaaa__]^``aa``a_a]`^	chr10.fa		5617234	R	36	119					
+HWUSI-EAS610	1	4	86	835	574	0	1	CATTCACAGTTACAAGCAAGGCCTCTTTACTAGTCT	ababa^aVaaV\a`\`_b_a_aT_Taba]_baaY\b	chr10.fa		5617416	F	36	119					
+HWUSI-EAS610	1	4	45	1144	698	0	1	GGTTAAGTTACTGTATTTACCACTTTACTGTTGTTC	ab`bbab`ab`aa`abbaba_aabaaaaaa]ab_a^	chr10.fa		5618192	F	36	119					
+HWUSI-EAS610	1	4	37	1489	1643	0	1	AAGATGATGTCTCTTGACTTGCCACTCCCGCAGCCA	aabaa`\`a_a_aaa_`Zaa`a^a\___^a\\_W_^	chr10.fa		5618383	R	28T7	84					
+HWUSI-EAS610	1	4	36	604	1144	0	1	CAACCACAACACAGTGCAGAGGCAGAGGATGTCTAT	aabaabaa``a__`Y`aaa_aaaa_[_a\`aNT```	chr10.fa		5618419	F	36	119					
+HWUSI-EAS610	1	4	63	255	1502	0	1	CATGCTACCCAGAACTCTAGCAGTTAAGCTAGCTAC	```baabaaa\`Z_b`ba`aa[a_``Va_`a``_aa	chr10.fa		5618719	R	36	119					
+HWUSI-EAS610	1	4	25	1761	1622	0	1	TCCCAACACTGGCACGATTGAACTGGGAGTTCACGC	_bb`aaX`]`^]Z_]_]W]`M`F\WZU\][[OQYBB	chr10.fa		5618810	F	35A	106					
+HWUSI-EAS610	1	4	41	920	1907	0	1	CACTTGGGTCCAAGAAATCCTTAGATTGCAGGGTGT	abbbbbb__^___Z\Z`a`abbabaabbaabaa[aa	chr10.fa		5619077	F	36	119					
+HWUSI-EAS610	1	4	54	308	1225	0	1	TGAAAACCAACCTTTAGAAATCCATATAATGTCCTC	aba`__aa`a_aaaaaaaaa`_aaa_a`_``^^_a_	chr10.fa		5619258	F	36	119					
+HWUSI-EAS610	1	4	23	1199	1307	0	1	TGTTTAATTGACACACAGTCCATTCGGAAAATGCTA	_```^``aZ\a^`P_Z`\__Nab\Y\\aa]^_TT_a	chr10.fa		5620117	R	36	118					
+HWUSI-EAS610	1	4	96	1710	740	0	1	TGTATTAAAGGTGTGATGGGGTGGTCAGGAGTCATT	aa^`aa]_a`ZWZ]]`_W]]]X_\Z]`WUZ^Z]V^Z	chr10.fa		5620340	F	36	119					
+HWUSI-EAS610	1	4	49	990	277	0	1	TAAAAACTAAACAAGAGCATCCTTGTAACGTCATCA	aa`a`a_aaaa`aaa_aaaaa_a_a`aa_`^_```a	chr10.fa		5621106	F	36	119					
+HWUSI-EAS610	1	4	50	1387	1827	0	1	GGGAGCTTTAAGCACAGTGTACTCGGCCCCATGGTG	]aaGaa^baR^X^\aMbVa^]^aX]IaGLNHY^]M[	chr10.fa		5621140	R	27A8	104					
+HWUSI-EAS610	1	4	41	658	1169	0	1	ACACTATGAAACATGCCAAACGGAGACAGCATTTGA	aba\_Q\^_`^_a`baa]aa`^aX`S^^_UPS_\\^	chr10.fa		5621788	F	36	119					
+HWUSI-EAS610	1	4	65	1638	529	0	1	TGTCCAGAGCCATACACACCTTGCCTCTTCTTTGTT	a\`aaa`^]aaaaa`b_baaaa``Va^_a^a`a]`a	chr10.fa		5621856	R	36	119					
+HWUSI-EAS610	1	4	33	56	1448	0	1	GACTGGAAGGTACAGACAAGAGTGTGAATGCAGTCT	`R_]ab_UaaSaaZ_Z`QH\S__b_b^X`aaaa[_V	chr10.fa		5621921	F	36	118					
+HWUSI-EAS610	1	4	69	174	649	0	1	GAATAATCTTTTAGCTTGCTGCCAGAATACCTAATT	`^^`a`aaaaaa`aa_^aa]`aa\^\Z\[`a]^^Y]	chr10.fa		5622024	R	36	119					
+HWUSI-EAS610	1	4	77	1577	1828	0	1	TTGTATCTAAGGCCCACTCCACAAACATGCCTGGCA	`aaa_^__^a]Z\NY_Q_^__[_[^G\\]\NW\WU^	chr10.fa		5622611	F	36	117					
+HWUSI-EAS610	1	4	36	1638	631	0	1	AGAACCCATGGTCAGGGAGCACTGGCCCTAGGGGTG	_Taaa`aa_[_`a_aaaaaa_a_XSa^```XZ^BBB	chr10.fa		5622659	F	36	106					
+HWUSI-EAS610	1	4	91	842	287	0	1	TGGACATAATGGCATACCGCCCTCTAAATTCCTAGC	aba^aaa`aaaaZaa`_Ga`_`a_aa_aaa__`aa^	chr10.fa		5622717	F	17T18	107					
+HWUSI-EAS610	1	4	23	358	1985	0	1	GCTGATCTATGGATGGAAAGCTAGGAATTTAGAGGG	`aaa[`aba``a``a`RPaaa_]aa^__^_a\^W__	chr10.fa		5622736	R	36	119					
+HWUSI-EAS610	1	4	23	609	1474	0	1	AGTATAGAAAATACATGTCCACAGAGTGGTCAAATG	aa_^aaaaaaba`a^`a]`aaaUaaaU]`W_]__]_	chr10.fa		5622846	F	36	119					
+HWUSI-EAS610	1	4	1	1049	669	0	1	GAAAGATTTTAAGAGCCAGAGGTCTGGGAGGAGCAG	_`aa`_aaaaaa``b`_aa_aaYU_a_a_a^U^V_a	chr10.fa		5622927	F	36	46					
+HWUSI-EAS610	1	4	23	1201	979	0	1	AAAGAAAACTGACTCTTCCTCTCCCAGGACCCATCT	a`aa`a``]_`__a^`a__a_`_]_]^_^]^^]Y]`	chr10.fa		5623119	R	36	119					
+HWUSI-EAS610	1	4	5	1022	1089	0	1	GGGCAAAGGCAAGTCCTCCAGTGTATTATAGACTTG	aababaaa_Ya__Z`]__`_bZaY^_a^a__]\_]a	chr10.fa		5623695	F	36	119					
+HWUSI-EAS610	1	4	92	1153	197	0	1	TAGATTACGGTTGCTTCTCAAGCAGCCACTTTGCCT	aababaaaa`Z_b`aa`_aaaa`a`a___\[a_[`a	chr10.fa		5624010	R	36	119					
+HWUSI-EAS610	1	4	89	208	1503	0	1	TAATGCTGTGGTAACTCTCTGAAAAGCCTAAATGAA	abbabbbb_bb^^`b`babbbb]\bbabb`\`aa\^	chr10.fa		5624452	F	36	119					
+HWUSI-EAS610	1	4	9	107	1690	0	1	ACCATCATCAGGTGTGGATGCCCAAGGCAGAGTCAA	Zabbaab`aabaNa^aba`aaaa\`]aa]a`aN\]_	chr10.fa		5624754	R	36	119					
+HWUSI-EAS610	1	4	70	106	1438	0	1	GCATGGACTTTCTAGAAGCGTTTTACATATGGAGAC	aa_]`aXaab`a`_^XPTH]QV]``b^a``aaa__a	chr10.fa		5624883	R	18A17	106					
+HWUSI-EAS610	1	4	67	635	1377	0	1	ATGCTGAGCTGAGCCACTTGTGGGAGAAGCTGTCAC	abababaaaaaaQaaaaaa``aa_^aaaaa^`]`_`	chr10.fa		5625198	R	36	119					
+HWUSI-EAS610	1	4	7	195	62	0	1	GAAATACATATTTTAGGTCTTGTGAGGATTAAGTGA	a]``^]\_Y\SZ`[\`_S_Z_`\\ZY\VXS\^YVY]	chr10.fa		5625787	R	36	119					
+HWUSI-EAS610	1	4	54	348	85	0	1	CTTGACTCTTGTCTCACTGGGATTTTTGGCAAGTCA	aaaa[aaaaaaa`[`^_aa`Z\Zaa`_Ya^\R]Ya_	chr10.fa		5625873	R	36	119					
+HWUSI-EAS610	1	4	75	1179	1674	0	1	AATACAGCTCATCTCTGGCAGCCTTTTGTACTGAGA	`[^ba[\X^[`]]YOYG\[W`ZOOW[]]JTR[WT[B	chr10.fa		5626203	F	36	112					
+HWUSI-EAS610	1	4	16	239	1356	0	1	ACTTCAAATTTTTGTCACTCTGTACATATCAGCAAA	`^^b^bb_aaaba_[aba`]_a`Zaba]aa``aaaa	chr10.fa		5626455	F	36	119					
+HWUSI-EAS610	1	4	44	286	1307	0	1	GCTTCTCAACACACTCATGTCCACGGCCTCGTTGAG	abM]abRYM^ab[`[`_aa\``UXHV^[UQ\BBBBB	chr10.fa		5626763	F	24A6C4	81					
+HWUSI-EAS610	1	4	15	453	392	0	1	TCCTCCTTACTAGAACCCAAGGAGGCTTCCCGGGGT	]aaba]`ababbbaaaaaabba^_`aaa`Wa]`a^Y	chr10.fa		5626861	F	36	119					
+HWUSI-EAS610	1	4	10	1021	1165	0	1	AATGAAAACACCTTCTAAATGTCTACCTTGTGTCTT	aabaaaaa_a_aababaaabb__aa_^aaa`b^`aa	chr10.fa		5626920	F	36	119					
+HWUSI-EAS610	1	4	97	713	752	0	1	TTTGAGTATACCTATGATTCATTTTACTCATGCCAT	abbbbb`ab`_`aabb_bab^baabb`baaaaa`ab	chr10.fa		5627144	R	36	119					
+HWUSI-EAS610	1	4	83	76	442	0	1	CAAAAAGGATCCCCTGCCTCAGCTTTATGGATAGAA	a`R^__`]T]a_aaZ```]a_P____^_``YX[_UB	chr10.fa		5627553	R	36	114					
+HWUSI-EAS610	1	4	13	736	1195	0	1	ATTATAGTTAGAAAAACTTTGGAAGTTCACTTGGCG	aaaabab\aa`_X``\`aaaa^U^a]a`_]a`_``a	chr10.fa		5628455	R	36	119					
+HWUSI-EAS610	1	4	2	1629	874	0	1	TACATTTGTTTGTGGTTTAGGTTTGACATTTTCACA	aa`abaaa_aaaZY__aaaaa[a`]\\_`_^_^a_`	chr10.fa		5628611	F	36	119					
+HWUSI-EAS610	1	4	46	1311	1739	0	1	CATACCCAGACAGAGCCTAGTGTTCTGTAACTATCA	`b`]]`abbaa]a[Y^[ba_^_aa]UYY\[F]``]`	chr10.fa		5628818	F	36	118					
+HWUSI-EAS610	1	4	57	1155	1317	0	1	TACCCAGACAGAGCCTAGTGTTCTGTAACTATCATT	aaZaaaa`]VZ^`\^a``Za`_[^a^^_X`_`Z_^]	chr10.fa		5628820	F	36	119					
+HWUSI-EAS610	1	4	96	1737	857	0	1	TGGTTAAGTCCGGTGGTGACCTGTGATGATAGTGTG	__OO``^RHa`STS]]S]`aa_aPT[YUU^\_T`M]	chr10.fa		5628935	R	36	117					
+HWUSI-EAS610	1	4	17	469	639	0	1	AGAGCTCCCTCTTCATCCTGCTGTCCTACTCCCAGA	aaaa\a^``_`^^`a`a\``a[^^^`^^\`_^^^__	chr10.fa		5629264	R	36	119					
+HWUSI-EAS610	1	4	30	1598	1298	0	1	GGTAAACAGCAGTACTTTTGGCTTTATCTAGCATCT	`_OWP[[^`YX]PS\`]]_`WXPU[YXUXVPEX[[X	chr10.fa		5629422	F	31A4	108					
+HWUSI-EAS610	1	4	59	1743	971	0	1	TGAGTCTCAGTTCACTAATTCAGGAAAGGAAGATAC	^``]_^`_`_UV``a\aa_aa[aaVaa^Y][[VQ_`	chr10.fa		5629503	R	36	119					
+HWUSI-EAS610	1	4	23	383	45	0	1	GCAGATCTGGCTTGTAGGAAAAACATTTCTTGTTAC	a_`a\a_`aaa\_Z^Y]SYY_a\UZ\`[^^][M[VU	chr10.fa		5629852	F	36	118					
+HWUSI-EAS610	1	4	53	1031	1898	0	1	ATGTAGCTTACATACTGCCTTCACATGCACAGTCTC	aaa_a`[aaa[aa`^aa_`ab_a`__^^]VW`WRa_	chr10.fa		5630015	F	36	119					
+HWUSI-EAS610	1	4	69	1252	304	0	1	CTGCCACGGAGAGAGCTCTCAGGGGTAATTGCTATT	abaa`aaa^^]_a`_\a_`\]YZa]Q]a___^_`aa	chr10.fa		5630242	R	36	119					
+HWUSI-EAS610	1	4	43	461	760	0	1	TGTTAAGTTGGTCTAAGAATAGTGCAAGGAACCACA	aaab_aa_abb_aa_aaa``^b]a`baa_`_a`a`a	chr10.fa		5630366	R	36	119					
+HWUSI-EAS610	1	4	50	110	1782	0	1	TGCTGCCGACCACCTGCCATGTTAAGTTGGTCTAAG	abbbbbbbbbb`bbbbbba_baabab_bbb_bbbba	chr10.fa		5630385	R	36	119					
+HWUSI-EAS610	1	4	29	1703	547	0	1	ACACAGACATCGGGATCCAAATTATCAGAGGATTGG	a^`_aW\^`_XQQS]W]_^__^^^_]\QZ[TW]WYQ	chr10.fa		5630596	F	36	118					
+HWUSI-EAS610	1	4	43	1361	1028	0	1	GCCAATCCTCTGATAATTTGGATCCCGATGTCTGTA	aabbbaaaaabaaaaabaaaa[a_`aaY]Z]Y]aI`	chr10.fa		5630597	R	35G	82					
+HWUSI-EAS610	1	4	50	323	1477	0	1	GTGCTACGTTTCAAACCAGACCAAAGCAACCCAAAC	aabbaaaa_aaa\P_a__a`aa`___aaa__a_[a[	chr10.fa		5630657	R	36	119					
+HWUSI-EAS610	1	4	59	560	605	0	1	TCTTAAAGAAACAAAACAAAACNACAACTTTACTTT	`aba`V`a`aba\a``ab_abXDV`_]^a``aXY`\	chr10.fa		5631572	R	22A13	110					
+HWUSI-EAS610	1	4	55	323	1676	0	1	TCAGTGTCTTCTGGGGCCAAGATGCACCTTAGTCCT	a`]^_a__`aa_\[Zaa_ZT[]]]`]\_``]]R^`[	chr10.fa		5632449	F	36	119					
+HWUSI-EAS610	1	4	11	214	276	0	1	AGCATTCGCTGCCTGCTGGGCCAGGCATGAAATGTA	aaaaaabaaaaaaaaaaaaabaaaba``a_aaaaWa	chr10.fa		5632890	F	36	119					
+HWUSI-EAS610	1	4	3	1061	1544	0	1	CATGTGTTTACAACATATCACACTGAAACACCAGCA	ab`aab]aaaaaa`aaaaaa`a_aaa_a^``^`a_^	chr10.fa		5632944	R	36	119					
+HWUSI-EAS610	1	4	53	343	445	0	1	ACTGAAGAAGATAAGCTTTTAGGCAGAGCGGCCCGT	_`bb``bUZ`abbabaaababbbbb_Xa`a`a^^L[	chr10.fa		5633156	R	36	119					
+HWUSI-EAS610	1	4	81	565	1315	0	1	GGTGCGCTCCTTGGAGTTGGGTCACCTGTGTTCTGC	aaZa`aaa```aaa\_X^a`a``a]_aa^`Z`]]Z_	chr10.fa		5634337	R	36	119					
+HWUSI-EAS610	1	4	22	93	1571	0	1	CAGACGCTCCCGGGTTCTCCAACTTTACATACTCCT	abab_aaX^_aZ^]VaX[Za\a^^aaXaa_\^ZU^\	chr10.fa		5634373	F	36	119					
+HWUSI-EAS610	1	4	75	583	268	0	1	TCTGCTCTTAGACAAACCTGCTGGAAGCCACTGGCC	abbbaaababaaaaaaaa^aaa__aa^aa]`^a\^`	chr10.fa		5634413	F	36	119					
+HWUSI-EAS610	1	4	28	1630	1332	0	1	TACTTCCAGCCAACAAGAAGACTGAATCAANTAGAA	aaaaaa_a_`[____`aa_`_\]\__`[]SDW]_]_	chr10.fa		5634774	R	30A5	110					
+HWUSI-EAS610	1	4	26	407	643	0	1	GTTTTTGTTGGACCCCGGTGCCAAATTTGCTTCCTT	a^a_a_a_^_^___`aa]S___W[XP^^\VZZX^[^	chr10.fa		5635127	F	36	119					
+HWUSI-EAS610	1	4	46	1015	287	0	1	GATTCAGAAAAACCTTCGGTTAGGCACACTTGGGTG	a__a[aa```__\SX_`_]__YW_^]__]]YVUVT]	chr10.fa		5635184	F	36	119					
+HWUSI-EAS610	1	4	28	975	312	0	1	GAGGTCCTTGACTAAAGCTCTGGCGATCCGGTAACC	ZOP_H`]VQ^U]^`ZT]``]aa`XUVVUQQZJOQP]	chr10.fa		5635301	F	36	117					
+HWUSI-EAS610	1	4	43	438	13	0	1	TAGCATATGACTTGAATTGCTAGCCCATATACCCAG	`bbb_bbbbababaa`a`ababbabaaabaaaaaaa	chr10.fa		5635617	F	36	119					
+HWUSI-EAS610	1	4	60	1218	1428	0	1	ACTAAGCACACTATTTATCTAATTCTTAGAAAAACA	a[a^^YRZ]a[`X_a`U`___[]]X]`\T[\][^^_	chr10.fa		5635722	F	36	119					
+HWUSI-EAS610	1	4	35	608	88	0	1	AACTCATCTTTGTCTTTAGATTTAAGCCAGCTTAGC	YP[V_^\^_`Y^UXTX]_XDKSPQ_]\PXGYSXG_[	chr10.fa		5635779	R	36	114					
+HWUSI-EAS610	1	4	12	438	327	0	1	TGTATTTTTAACCCTTCCTTTGCTGTCAATGATACT	ab`bbabbbbaaabbaabbabaa_\aaaa^``aa`b	chr10.fa		5635827	R	36	119					
+HWUSI-EAS610	1	4	3	1491	1644	0	1	AAAGGTAAGTTGCTTTCTCAAATCGCTCAAGCTACA	a``aa]_`a`_b^``____`aaa\_[_^\\`\_^W^	chr10.fa		5636172	F	36	119					
+HWUSI-EAS610	1	4	37	1774	992	0	1	GGGCTGAGACAGTAAGACGGAAGGAAGGAATGTGCT	\]ba]ab^a^`Xaaa`_aa]Xa_aa`\^``__Sa`^	chr10.fa		5636302	F	36	119					
+HWUSI-EAS610	1	4	79	389	384	0	1	GAGCGTGTGTGGATGTGTTTGTATGTGGAGTGGCAG	aZ^abab[`[ab_a`[a]a__VY__Z`a[^N\^]YZ	chr10.fa		5636373	F	36	119					
+HWUSI-EAS610	1	4	73	452	1487	0	1	CTGCTTCCCGAGAGTCCCTGCCACTCCACATACAAA	a_baababaaaaZaa]aaaaaa_^a`aa`a`a_VBB	chr10.fa		5636390	R	36	110					
+HWUSI-EAS610	1	4	71	1271	499	0	1	GTGCAGGAGCCCAGCTGCCTTGTCTGCCGGGAGGGG	_VVX_\JUFZa\_V_^``_`YVOW`W\Z]^P[RNNW	chr10.fa		5636449	R	36	116					
+HWUSI-EAS610	1	4	12	1045	187	0	1	GAGTTTCTTCTAGGAATGCTGATTCTAGCGGGGCTA	a`Y^_`_[___^\]]^]`Y`a_]_^__N]]]X^]]_	chr10.fa		5636543	R	36	119					
+HWUSI-EAS610	1	4	32	298	329	0	1	ATCTCTGCACACTTTGACTGGCATTCTAGTTTATCT	`b^G]_X`_aa``ZQW^QU[aa^ST`a_\X\U^a_`	chr10.fa		5636671	R	36	118					
+HWUSI-EAS610	1	4	31	704	628	0	1	GGGACCCAGGGTGAGGACACAGTCAGAGTACCTTGT	`ZXU[`][aa`S\KV_WZa][_V]XZ`XX^^T\YZ\	chr10.fa		5637176	R	36	118					
+HWUSI-EAS610	1	4	91	966	1131	0	1	TGTCCTCACCCTGGGTCCCAGGACACAGGAGGCCTA	a``[Z^[\Z\Z[]]\XZZ\\Z]\Z[NU\\ZZ]RTZ\	chr10.fa		5637193	F	36	118					
+HWUSI-EAS610	1	4	66	15	993	0	1	GGCTCCTTTAGGCCTCCTGTGTCCTGGGACCCAGGG	_aa`a__a_a^aaa^a`N`PT`a^V`Z`\``a]`a\	chr10.fa		5637201	R	36	119					
+HWUSI-EAS610	1	4	85	419	1824	0	1	GGTCCTAGGGCTGGAGACCGGCCACTCCTGGCGTGC	[``_Xa_WXT_R\\\UYY`^[Q`H\`X[XUJU`BBB	chr10.fa		5637281	R	34TG	99					
+HWUSI-EAS610	1	4	72	198	1949	0	1	ATGGGTTTGAGATCTAGCACTGTATAGATGAACAAA	[Ubbb`baaaaaaa^ZWaYabb^Taa^``bSK_aab	chr10.fa		5637564	F	36	118					
+HWUSI-EAS610	1	4	9	848	1586	0	1	CATTTCCAGGAATAGCTTTCAGACTCCTCTTAGTAA	a`]a^aR`_]W_`TaaaaVUO[Q\a[YaWY[[`UZ`	chr10.fa		5637942	F	36	118					
+HWUSI-EAS610	1	4	66	443	303	0	1	GAGACTCCAAGAGAAAACAGGTGGCCAGAGTAGCGG	a\ZVaa`a`aa``U^X]^_aa\``^^a_^aSa_][\	chr10.fa		5638053	R	36	119					
+HWUSI-EAS610	1	4	26	1216	2042	0	1	GCCCAGTGCAGACTCTGGACCAAACACCCAACATCA	aPWP[\WJR_PSVX\]XZSJTTX]S`KTT]TTTXNT	chr10.fa		5638179	F	36	116					
+HWUSI-EAS610	1	4	77	76	538	0	1	GATGCTGTGTCCTGTGTCCGGAGTGAAGTGTTGGGT	aSaabbb^baaaaa^a^aaa]M^WaY^aTa]aa``U	chr10.fa		5638226	R	36	119					
+HWUSI-EAS610	1	4	19	40	872	0	1	GGAAGGGACTCTACTCTTAGAGAAGCTGGGATTTGG	ababbbbaaaa_`bbaa]abUb[\abaaaaPNVaab	chr10.fa		5638417	R	36	119					
+HWUSI-EAS610	1	4	46	538	1569	0	1	GAGGACGGGACTCTACTCTTAGAGAAGCTGGGATTT	aZ^aPGZ^^U]`Z\_^[_\`^_T_R__V`__Z\YV\	chr10.fa		5638419	R	5A30	107					
+HWUSI-EAS610	1	4	22	703	288	0	1	TCCCAGCTTCTCTAAGAGTAGAGTCCCTTCCTCTCT	``_aaa_a`^`Y_Y]__aYaa^`__Z__`ZTU[\\\	chr10.fa		5638422	F	36	119					
+HWUSI-EAS610	1	4	63	1243	1839	0	1	GACAGGTCCAGGAGAGAGGAAGGGACTCTACTCTTA	a`_^`ZSZV^__\_\_Z`_^Z_^\UW\\\WWW\\_W	chr10.fa		5638434	R	36	119					
+HWUSI-EAS610	1	4	66	108	123	0	1	GCTTAGAATATTCACTTTTCTAGCTTGGCAGAAAGC	aba[_b\`aY`b_bb\V_bbbaaaa^baaab]a`aa	chr10.fa		5638582	F	36	119					
+HWUSI-EAS610	1	4	94	1133	655	0	1	GGTGTTGTTTTGTCCTTTGAAGTATCTAGAGAGGAA	aa]aZaa_aa^_`__aa`a__a_a`[a`]_a___]a	chr10.fa		5638868	R	36	119					
+HWUSI-EAS610	1	4	74	1208	474	0	1	GCATAAAATAAATAAACAATCCTTTAAAAAAAAAGA	a^aba`Z`a``^a`Z_`a_a_`a`a`_^^Z^__^_^	chr10.fa		5639450	R	36	51					
+HWUSI-EAS610	1	4	18	923	513	0	1	CTGGTCCTAGTCCACATGGTAGCTCACAACCATCCA	aa[\Z__^`^\__```XaY^_`[_]U[_`[_^^\^_	chr10.fa		5639544	R	36	119					
+HWUSI-EAS610	1	4	18	143	1319	0	1	TGTGAGCTACCATGTGGACTAGGACCAGGCAGAGCT	aWZ\aabaabaabZL\_ab`a`aXaaaaaaaaZbaa	chr10.fa		5639552	F	36	119					
+HWUSI-EAS610	1	4	16	138	1984	0	1	AGGCAGAGCTTCCTCTCCAGCTCCATTGAAGGCTTT	a]aabbaaa_\aa_a`a_PW`]`a^a_aYJR_^UZ\	chr10.fa		5639578	F	36	118					
+HWUSI-EAS610	1	4	36	237	2040	0	1	AAAGTTTAGCTCTGTGCAGTTTGAACATTACCATGA	\aab_aa_ababab_aaaa]_`a^^aaaaaaaaa`^	chr10.fa		5639721	F	36	119					
+HWUSI-EAS610	1	4	19	1575	492	0	1	TAGCTCTGTGCAGTTTGAACATTACCATGATTATCA	abbaaa`___``Y_ab^a`abXaba`_a`_aa_a``	chr10.fa		5639727	F	36	119					
+HWUSI-EAS610	1	4	69	1240	1403	0	1	AGTGCCGACATCTCAAGAATCAGTGACTAGGTCTGC	``^\^aaa^___`VV_a\aa^`aZYRPX[_^UUZ[_	chr10.fa		5640085	F	36	119					
+HWUSI-EAS610	1	4	30	1564	175	0	1	GAATAGCATTGCATCAGGACTCAGCACGGGGTCTTA	T[bbbababa\_abab]Uaaabb]`ba`L`a_bbaa	chr10.fa		5640121	R	36	119					
+HWUSI-EAS610	1	4	93	700	186	0	1	ACATGCTTCTGCTGTAGAGGAGAATAGCATTGCATC	a`a`]^a\\OTZ]WRYaZaaaa^``YY___^[[aa[	chr10.fa		5640142	R	36	119					
+HWUSI-EAS610	1	4	51	1415	131	0	1	CACATACAACCCATTAGAAAGCCCATCCATGCACTA	aYZH_S^`a_^]aaaaYb]XGOaaaaLTPLFXaX_^	chr10.fa		5640510	F	29G6	98					
+HWUSI-EAS610	1	4	37	655	1642	0	1	GCTCTGAATAAGGCAATTACAACTCTGTACCCTGAT	^`a^Z_``_W[G[\\a]WR\T_^ZPRXUQRXW_^^B	chr10.fa		5640572	R	36	113					
+HWUSI-EAS610	1	4	31	1276	1010	0	1	GGTTACTATGTATGGTTACTATGTATCCTTGCCGTC	`YEP[aaY_QNTT\[_aO\NXT[_YZNQVT^BBBBB	chr10.fa		5640852	R	36	94					
+HWUSI-EAS610	1	4	74	785	1647	0	1	AGTGTCCCTTTCCTTCCTTTATCTATTGTTTACTTG	aa_NUV]_b_b_Y^HZS]abZ_\aW]N]R_Y\LXa_	chr10.fa		5641331	F	14G21	105					
+HWUSI-EAS610	1	4	57	579	364	0	1	CAACCCCACCAAATGCTAAGAAGAAAAGCCAACAGA	_b_a`^]`aaab```Z`aa_a`aaabaa[_aa``aa	chr10.fa		5641577	F	36	119					
+HWUSI-EAS610	1	4	27	810	1821	0	1	AGGCTGCCTCCCACTCTCCCTAAGGATCCAGGACCC	`a\a``^``a`Z`^]^Z^\\[^\P^VYZY^TVZZ[Z	chr10.fa		5641674	F	36	119					
+HWUSI-EAS610	1	4	33	760	301	0	1	CAGGACCCTTAGGCTAGCTAGCAGATGCCCCTCCTC	_aaaaaaaaaaa```aa_aaaaa`aa````\\\aa_	chr10.fa		5641702	F	36	119					
+HWUSI-EAS610	1	4	27	1066	1027	0	1	ATGAATGAGTCACTCATTGGCATGATTGCAGAGGCA	^ORLY[VRXRZ\QZSUZTUUVPVRTVXUQY[V^WSV	chr10.fa		5641782	R	36	117					
+HWUSI-EAS610	1	4	19	720	676	0	1	GAACAGCATGCATTTCCTTTCTCTTAGTTAGGAAAA	X[]P]X]ZTQRXa`^WQYWU_YY`T[T\_PXZ`a`^	chr10.fa		5641933	F	36	118					
+HWUSI-EAS610	1	4	24	929	826	0	1	CAAGAGGGAGTGCCTTCATCTTCCCTCTCCTCAAGC	ab`aaa_aa`\aSXa_aa\Zaa\Z\_^^^Z_``Va_	chr10.fa		5642048	R	36	119					
+HWUSI-EAS610	1	4	36	1419	328	0	1	GTCCACAAAGCCCCAGGGATACCCAAGTCTCTGTCT	T]]Z^`b`_TTXaa]NHR`_Z^VXZ[ES]ZJO^PTW	chr10.fa		5642559	F	36	115					
+HWUSI-EAS610	1	4	89	1236	1300	0	1	AGGCAAACGTAAGAGAGGCCTGGGGAGATGGCCCAG	_aa_T\_`a[aaa`aa``a^]a`^`[_]`a`\\Y\[	chr10.fa		5642675	R	36	119					
+HWUSI-EAS610	1	4	53	384	749	0	1	TGCTGAGACCCTCCTGAGACCATTTCTTGTGCTGAG	aaaababbaaaa^a_a^^T^`aaa`aa``_a`aa_a	chr10.fa		5642728	F	36	119					
+HWUSI-EAS610	1	4	53	862	480	0	1	AGGTCCTCAAGGCACAGATGAAATGTAACTTGTGGG	a`b]aa`a`__aa_]^b]`a_\]`_][_^`_aU_`_	chr10.fa		5642840	R	36	119					
+HWUSI-EAS610	1	4	83	770	1470	0	1	TGACTATACAGCAGGTGCTCAAAAATGTTCATAGAG	abb`_]]a_aba_aa]a__a\aa^\`a^``Y[\]]`	chr10.fa		5642958	R	36	119					
+HWUSI-EAS610	1	4	76	649	1465	0	1	TGATGACTATACAGCAGGTGCTCAAAAATGTTCATA	ab`a_aaaaa^_^^aa``]a`aa^YYZ]`a`a`^_a	chr10.fa		5642961	R	36	119					
+HWUSI-EAS610	1	4	35	613	846	0	1	GCCAGGGCACAGAGTACTGAGTTCTTTGGATGTGTG	a````a`aa``a`a^_```Wa[a_aaaa___`\a\a	chr10.fa		5643077	R	36	119					
+HWUSI-EAS610	1	4	35	1698	1348	0	1	AATTTGGGAATTTATTAGCCATTGTAGCTATCTTAA	a^baab]_]`aaa_ba^Z`a^a`_^aa_^a_``_aa	chr10.fa		5643819	R	36	119					
+HWUSI-EAS610	1	4	49	1263	1648	0	1	AGAAGAGAAAGCTGACTCAAACCTATTTGCCTTGCT	abaaa`aaaaW`__a^aaaaaZ__^^_\^_]aX\__	chr10.fa		5644042	F	36	119					
+HWUSI-EAS610	1	4	49	754	869	0	1	ATGAAAAGCATGAGTTGTTCTAGAAAATGTGAACCT	abbaba`baaa``a_aaaa_aaa`____a^a^a]_`	chr10.fa		5644161	R	36	119					
+HWUSI-EAS610	1	4	73	399	1696	0	1	CTACTGAAAGGAAGGCCAGGTATTCACAGACCCAAG	aabbba`_`aa[b``aaaaaVa\a^``aa_`a`[[`	chr10.fa		5644358	R	36	119					
+HWUSI-EAS610	1	4	88	685	1730	0	1	GGATTGACCACATGATTAAAGAAGATGGCCTGTGGG	[[Vb`]`aaaa[`aR_b`]aa^_^]`aa[`a[N\Wa	chr10.fa		5645165	R	36	119					
+HWUSI-EAS610	1	4	2	95	520	0	1	GAGAATGATGAGATGTCCCATGATGAATATAGAGTG	``aaXaaaaaaa^Ya]a``[_b__`a^aa__a_aXa	chr10.fa		5645238	R	36	119					
+HWUSI-EAS610	1	4	56	734	1226	0	1	CACACAGAGTACCCAGCCCATTAGACACTTTCTTTG	ab^aaa]`]]b^[aaba_abaaa`aaaTbaa`b`_^	chr10.fa		5645297	R	36	119					
+HWUSI-EAS610	1	4	39	1177	1802	0	1	CACTCCCAGCACGACATCCAGAAAGATTCTTAAGAG	aaab[``USX`X\[^^aaaa`Z[Zba]]aa`aaa^^	chr10.fa		5645732	F	36	119					
+HWUSI-EAS610	1	4	91	985	1400	0	1	GAACAAAAGGCTCAGAGGAAATTCTCACTGACAGAT	a`a^`]____^]X]a_``^\_a`^^\^^_`^ZV`]^	chr10.fa		5646194	F	36	119					
+HWUSI-EAS610	1	4	53	687	306	0	1	CCTGTATATAAATGTGAATTCGTTCCAGTGAAGGTT	]_`b_`a]b^b_bb```ab`a`bb`_XX]a`a`bY`	chr10.fa		5646869	F	36	119					
+HWUSI-EAS610	1	4	25	1034	2024	0	1	GAGCTTACTCCAATGCCTTCTCAAGTCTTCTACTTC	aaa^^`a`^__]_^__^]_^__`^Z]^W_[^^]]]W	chr10.fa		5647050	F	36	119					
+HWUSI-EAS610	1	4	62	1048	1821	0	1	CCTCGCTGTAGGTTTTGCTTTCACTCCAATCTGGCG	a_babbbb]aaa_bb_R]abbab_abaabbTXObab	chr10.fa		5647099	F	36	119					
+HWUSI-EAS610	1	4	86	539	1302	0	1	GAGAGATACACACTCATCTGTTGGGTATAGCAGTGA	a_aa_\PNS`]\][\TV__[ORa_TQ^ZaZV_aQ`Y	chr10.fa		5647749	R	36	118					
+HWUSI-EAS610	1	4	11	133	1457	0	1	CACTTCAGTGTTAATCATCTACTGGAAGAAAATCTC	^[`_`^Y]Xa[ZV^_a]Za]VZ^`a][a_`[`aa^`	chr10.fa		5647796	R	36	119					
+HWUSI-EAS610	1	4	98	1594	256	0	1	AACACCATCCAACACAACTGACTCTCCAAATAATCC	aa````_][Z^a_`^``]_X_UZ]W]_Z^`]^^U^Z	chr10.fa		5647841	R	36	10					
+HWUSI-EAS610	1	4	63	24	1866	0	1	TGTGGATGTTGTTAGCAAAGAATCCTTCATCATGTG	ab`ba`bbaaaab`abSaJ_VS__a_a`Y`aT]a`a	chr10.fa		5648011	R	36	30					
+HWUSI-EAS610	1	4	42	61	136	0	1	AGCATCGCACATCTAGCTGTACCAGCAAGCCAAGCT	]a`Q\babbba]bVaaa`a[aa_W]a^\`aa^U[`[	chr10.fa		5648180	R	36	32					
+HWUSI-EAS610	1	4	81	775	2039	0	1	ACAGCCAAGAACTTCTGGTGTCCTACACAGATCCCT	a`aabaaaa^b`aaaaaa\a\_`aa``aa^`____^	chr10.fa		5648261	F	36	119					
+HWUSI-EAS610	1	4	17	1587	1569	0	1	AACTGAAATCCTGATTTCCAGGCAACACAGACAGGA	aabaaabaaa`Yb^V]aa]`a_aaa`aaa`a`a`_T	chr10.fa		5648416	F	36	56					
+HWUSI-EAS610	1	4	44	813	1957	0	1	TTTTTTCAAATCCTATTGTTAATGATGGCTCTTAAA	aabbbaabaaa`aaaaaa`aa``a_``_a`_aa^__	chr10.fa		5648550	R	36	32					
+HWUSI-EAS610	1	4	9	435	1384	0	1	TGACTTTGTGCCTTATTGTATCTGCAAAATACTGTT	\baa\a`ZPX^^^a`^WYV``a\^Ua\``a]aab`\	chr10.fa		5648766	R	36	119					
+HWUSI-EAS610	1	4	39	1591	574	0	1	GCTATGACTTTGTGCCTTATTGTATCTGCAAAATAC	a`ab``aaaa_Z^_a`aabaaYZba^XT]`a`a`aa	chr10.fa		5648770	R	36	119					
+HWUSI-EAS610	1	4	47	880	25	0	1	GAAGAAGAGGGGTCCCCTTTGTTTAACTTTGTGACT	aVOUOZ[OY^V_[a^]\`_[a_aaX]Z``\LVTTWa	chr10.fa		5648917	F	36	118					
+HWUSI-EAS610	1	4	20	1050	481	0	1	TTACCTACCCAACGTTGAGTTTCCTTCCTCTCTTTC	a`a_`aGa^_`Y[IUVRG\RZ^LT[XOR`WZ][`_R	chr10.fa		5648987	R	36	116					
+HWUSI-EAS610	1	4	28	182	246	0	1	TTGCATCTAACACTTAAAAATATTGTAATTAATTCT	\baaabbbabbbaabb_`aababba_bbbbb`bbaa	chr10.fa		5649101	R	36	119					
+HWUSI-EAS610	1	4	85	1114	818	0	1	ATCTGAAGCCAAGTACATGAACTGGAAAAGCAGAAA	aaaa\aaa_````]a`a_a_a_a`a\Z\]]]__``]	chr10.fa		5649252	F	36	119					
+HWUSI-EAS610	1	4	12	1457	267	0	1	ATCGCTGACATGTTGAGAAAAGGATTGTGGCTGACA	aaaaa^[^Z]\_\_UU_[]___YY^]WYVUV]ZYS]	chr10.fa		5649477	F	36	119					
+HWUSI-EAS610	1	4	94	561	1849	0	1	TTCAGAACATTTCCTTCCTCCTTGTGTCAGCCACAA	__TOY`[_ZW]aVF[]QaX`aa\[[PIRPYZ[]Yaa	chr10.fa		5649501	R	36	116					
+HWUSI-EAS610	1	4	64	1095	387	0	1	GCAGGCTACCAAACGACTTCCCTGGAGACTAATTAC	a_ba^^``___a`[^\Vaa[X[^[][_[W_^__`_S	chr10.fa		5650068	R	36	119					
+HWUSI-EAS610	1	4	73	428	7	0	1	ATTGCTTCTCATCGTGCCCTGTAGGTCATGGCAAGT	`\\^aa`]\Wa\``^]VRZ_a[S[`WZa_a`\TN[Q	chr10.fa		5650372	R	36	118					
+HWUSI-EAS610	1	4	2	1462	472	0	1	GGGCTGGGAGACACATAACTCTGACATCTGTTGCTT	aba_b_[`aa`_`_`a`aa_^a^`_a___\\_R\a_	chr10.fa		5650408	R	36	119					
+HWUSI-EAS610	1	4	43	345	1657	0	1	GATGTCAGAGTTATGTGTCTCCCAGCCCTGCTCTGT	a]`a`aaa_a`aaaa_a^a_aaaaaaaaaa````a]	chr10.fa		5650416	F	36	119					
+HWUSI-EAS610	1	4	52	917	775	0	1	GATGAGTTTGAGGTTCTTCCTGTCTCTGGACCTGAT	_]ab_]]aaa`aa^aaaa``ba][__aa]VX\\a`a	chr10.fa		5650659	F	36	119					
+HWUSI-EAS610	1	4	13	1638	1710	0	1	GTCCATTTATCATAATAGATTTTTTTTAAAGGGTGA	a^a_ZT\`a^Z`_a_^W___`\[a^____^[QUQ[[	chr10.fa		5651593	R	36	119					
+HWUSI-EAS610	1	4	12	34	1542	0	1	CATCCCCTGGTGAAAACTATGTTCAGTCCAAGTTCA	aa`^[VV_\XPQP[XZYQQXS\U]S^O^\WQWSO^T	chr10.fa		5651870	R	36	118					
+HWUSI-EAS610	1	4	48	1644	631	0	1	ACCAGGGGATGGCCATGAGCCTATTGCAGCCNGGGG	`I_^``XH\\XK[XU[SXZ^`[ZBBBBBBBBBBBBB	chr10.fa		5651895	F	24G6A4	56					
+HWUSI-EAS610	1	4	41	524	1958	0	1	TGTAAGAGTGAGGTCAGAGGACAATGACCCCAGTTC	ab[aa``aZ\aa_W`aa`a``a_``Za```_a`U\`	chr10.fa		5652061	F	36	119					
+HWUSI-EAS610	1	4	88	412	313	0	1	GGCTAGGGATGAACTGGGGTCATTGTCCTCTGACCT	aa]Raa]a\`_K\^\\V`aVZKU]\WZ\\TP`QY^S	chr10.fa		5652071	R	36	118					
+HWUSI-EAS610	1	4	83	751	1779	0	1	CAGTCAGGAAATTCATGGCTAGGGATGAACTGGGGT	aba\^`bZS]aaaaaa``a_aa`aY\_X[`Z]R]_Q	chr10.fa		5652087	R	36	119					
+HWUSI-EAS610	1	4	28	156	1815	0	1	TGTCTTCTTGAGGTGGATCCAAATTGCAGCAACCCT	[aZ_bbbbb`\[_aab\G[__QZ_Z``a``^aaaaa	chr10.fa		5652279	R	36	118					
+HWUSI-EAS610	1	4	71	1618	542	0	1	ATCCACCTCAAGAAGACAACAGACTCAACAAGAAGC	aXY`^aSWUZ\ZU`]`^_V_^^\PVW^TV_YQXSP\	chr10.fa		5652297	F	36	118					
+HWUSI-EAS610	1	4	10	1462	1355	0	1	TGAAGATGCAGATCTCTCAGCTCCTCCTGCACCATG	aa_X`]__\^`a`][S\``_Y\TZXYYZ_\_ZY_aa	chr10.fa		5652730	R	36	6					
+HWUSI-EAS610	1	4	58	1024	1026	0	1	TGAAGATGCAGATCTCTCAGCTCCTCCTGCACCATG	aaU`ba`]``]`a`b`^Y_^]a\[a[_aa_`Z[^a_	chr10.fa		5652730	R	36	8					
+HWUSI-EAS610	1	4	100	1184	625	0	1	GAGACTGAAATGTTGAAAGTTGTTATTCTTGTAACA	a`a`^aaY`]aa[_a_aaaZ`a\`aa^]`__^__]a	chr10.fa		5653302	F	36	119					
+HWUSI-EAS610	1	4	2	1546	1856	0	1	ATGGAGGAGGAAAGCAAGTCTTCTTTCTTTCAGTAA	abababXXaba^aa_aba_a_]aaa\P_aaZ\a`_S	chr10.fa		5653453	R	36	119					
+HWUSI-EAS610	1	4	34	954	1219	0	1	CAGAATCCCGAATGACTTCCATAGGTACTCTATTCT	abbbbbb`aaabbbbbbbabbbbbbbaabababbbb	chr10.fa		5653490	R	36	119					
+HWUSI-EAS610	1	4	2	293	1454	0	1	GGATTCTGCCTGGGAGATTTGTCTACTCGGCCACAC	a__a`aaabaa^aaXaW`\^a[``aa_a`X]^_^\_	chr10.fa		5653518	F	36	119					
+HWUSI-EAS610	1	4	13	826	940	0	1	CCAAGCCTAACCAAGTGGAAACCTAATATCAAATAT	\V_[J\`_X`_Z_[YTa^a`S[[aW___`V_\a_``	chr10.fa		5654417	F	36	118					
+HWUSI-EAS610	1	4	65	832	1190	0	1	GCCTGGGATGAAGGATAGGGTGGAGCACAAGTGGAC	`bbbb`[aaaUaaa`aaaabW]_`aaaa`a`]aaPa	chr10.fa		5654523	F	36	119					
+HWUSI-EAS610	1	4	98	517	570	0	1	CAGGGAGCATGGCTGTGAGCCTGGCATTGGAGCAGT	[aaaaaaaa_aaaaa^X[__aaaa```aaa]_`^`U	chr10.fa		5654941	R	36	119					
+HWUSI-EAS610	1	4	19	233	550	0	1	GGCCAACAGGTTCCCTTAGTCACTGTTCTATCGCTA	aaaaaaaaaa_aaaaaaaa`aaaaa\``_aaaaaa\	chr10.fa		5655072	R	36	119					
+HWUSI-EAS610	1	4	99	1244	1938	0	1	TGAGAGGCCAACAGGTTCCCTTAGTCACTGTTCTAT	aa`_`a__W^a]_X_N_]__]\[]NY[XU_XZR[_]	chr10.fa		5655077	R	36	118					
+HWUSI-EAS610	1	4	47	1570	922	0	1	GGAACCTGTTGGCCTCTCAGTGCTATCTCCTCCCCC	_^`aY^\\]aUV]\[\`a`a[][`\]\\\X\X[R^U	chr10.fa		5655094	F	36	119					
+HWUSI-EAS610	1	4	22	1606	1065	0	1	TTTGGGGGGAGGAGATAGCACTGAGAGGCCAACAGG	aXXQ_UY\ODNU_X`]^ZONYPQUUUUSSBBBBBBB	chr10.fa		5655098	R	36	85					
+HWUSI-EAS610	1	4	26	150	190	0	1	ATTCACACATGGCAACACTTTATTGCTACTTTCCTT	][XQ`aROZPTYTMS`R]aZPa`NZaWX_^TY\_\B	chr10.fa		5655176	R	36	113					
+HWUSI-EAS610	1	4	13	543	616	0	1	AGGAAAGTAGCAATAAAGTGTTGCCATGTGTGAATA	abba]aY]`a^^a``Y^aWb^aa`[`aa^aYaa`aY	chr10.fa		5655177	F	36	119					
+HWUSI-EAS610	1	4	78	255	450	0	1	AACTTGTTTTCCTCAGTTTCCCCATTGAATCAAAGA	Y\_b`b_bbaba`aab`aa]]_``aaa^``aa__aW	chr10.fa		5655304	F	36	119					
+HWUSI-EAS610	1	4	70	997	1384	0	1	GGATGGGACAAAGAAAGTATGTGTTCAGTTACGAGA	aa_baaa``aa`a``aa\aaa\a_a]`a___^a_aa	chr10.fa		5655821	R	36	119					
+HWUSI-EAS610	1	4	55	1022	1200	0	1	TGCTGAATTGCTTTGCTTAGCAAACTTAACTCCAGT	a^Ya`^^_]\Y\WVWZU__[[UVOQ\`]VFRMRRR[	chr10.fa		5656123	F	36	117					
+HWUSI-EAS610	1	4	94	1699	648	0	1	CTAACCATCAAATTATTTTGTTGCTACTTTATAGCT	a`bb^aaaaaaaaaaa`aa__aY`aaaaaaaaaXaa	chr10.fa		5656234	F	36	48					
+HWUSI-EAS610	1	4	89	369	1570	0	1	ACCATAATGTGAATATCTGATATGCAGGATATCTGT	_baYbLaaa_aa]aV\a]`_aa`aaaa^a`^`b_bY	chr10.fa		5656291	F	36	6					
+HWUSI-EAS610	1	4	96	1308	144	0	1	GTGGACCTGACGGCTAACAGTTTACACCAATGGACG	`abaa_`_RT\Y[\^^]NY`\``S`^X`_^USZYZ_	chr10.fa		5656349	R	36	118					
+HWUSI-EAS610	1	4	64	1114	1444	0	1	AGGGAAAGATCAGATAATGGCCTAATTCCTTGAGAT	Xa^`a_`b`aa_ba_bb_baaaa_bbabaabb`bab	chr10.fa		5656401	F	36	119					
+HWUSI-EAS610	1	4	1	1282	781	0	1	GGGTCTGTAATGCTTGAAAGTGACCAACAATTCTTG	a`XP\a__`[^`]a``_]Y_X_UZ^a^]__^^\VV`	chr10.fa		5656551	R	36	119					
+HWUSI-EAS610	1	4	41	1476	318	0	1	GAGAACACCAGTGTGAGCTGGTGCCATGTTTTCTGG	aa^]Y\_\_UVW_S^\WWYXQTUVRRX]W\V]WZ[S	chr10.fa		5656821	F	36	118					
+HWUSI-EAS610	1	4	59	1221	993	0	1	GAAGCCTGGATTGCAAGGAATCCTTGCTGCCATGGA	aa[a_`aa``[_aa_Y__``a^^^ZUZ_^\_\\\TY	chr10.fa		5656901	R	36	119					
+HWUSI-EAS610	1	4	11	883	231	0	1	CATCGTTGTGGAGGTATTCACTCTAAGGTTTGAAAG	abbbbaa`^aaab`RY`^PVW]\_T_T[DX\GVU_\	chr10.fa		5657082	R	36	115					
+HWUSI-EAS610	1	4	68	620	1308	0	1	AAATAATTCACCATGTCCAGTTAGTGCTGTCTATGT	a`aaa`aa^``_a_a__]^a^`_a]a_`a^^a^`__	chr10.fa		5657176	R	36	119					
+HWUSI-EAS610	1	4	72	858	1553	0	1	AATATACTACAGATCAGGCTGGCCTCAGACTCACAG	aaaaba`bbabaaa_ab``aaa^aa`_a^_`]`^^^	chr10.fa		5657984	F	36	119					
+HWUSI-EAS610	1	4	56	110	1463	0	1	GGGGACATCAAGCTTTTATGTGCAGCTGACGTAACT	aaa_\^ba`]Y]ba_a`a`a^aa__`_`Z`a__`Z]	chr10.fa		5658152	R	36	119					
+HWUSI-EAS610	1	4	61	190	970	0	1	TCTGAGAAACAGTGACAAATATTTGTCTGGAAAAGA	aabb_ba\baba]a`b[Y\`[aaab`aabb`aaaaa	chr10.fa		5658245	R	36	119					
+HWUSI-EAS610	1	4	100	1021	1568	0	1	AATGGCTCAGCGGCCAACAGCTTGACCTGCTATTGC	a[[^a\^X^SX\\Q]]^X_a_\\_ZW\^]\Y^NNZB	chr10.fa		5659184	F	36	114					
+HWUSI-EAS610	1	4	2	1317	813	0	1	CGTTGAGGGCTGATGCTCAAAAGAGCAGGGCGGAGT	[`]aabXT`ab`ba`ab]bbaaaaaaba]b^a]Qaa	chr10.fa		5659546	R	36	119					
+HWUSI-EAS610	1	4	94	821	178	0	1	AAATGTGAGCATTGGTTAGGATTATGGCTTTGGAGA	`VU_b^]^b`]bbbb_baabYbba\^Z^ab``^`][	chr10.fa		5659623	R	36	119					
+HWUSI-EAS610	1	4	60	1457	1041	0	1	GGCCTCAGGAAACCGAGGACAGCTGCTGCTCTACCA	`_`_^^`XR``\``\K^`^`X^_[`_VNPZZZ\\Z[	chr10.fa		5660015	F	36	118					
+HWUSI-EAS610	1	4	61	487	1010	0	1	GCCTCAGGAAACCGAGGACAGCTGCTGCTCTACCAT	_abbaaaa_ab_]^\a_Z]]a^[]_`a\_^a`\^Y`	chr10.fa		5660016	F	36	119					
+HWUSI-EAS610	1	4	50	1526	1165	0	1	ACAGATGGTAGAGCAGCAGCTGTCCTCGGTTTCCCG	aaaa^a`aU^T]```^___Z^PUBBBBBBBBBBBBB	chr10.fa		5660020	R	34T1	60					
+HWUSI-EAS610	1	4	5	1277	1607	0	1	GACTGGGCCATTTTGATTGCCAGTATGAAGGGTCAG	a]_XUNX^ZZ\^[^\\^^`Z_^`R^\_WT^ZWRSU_	chr10.fa		5660304	R	36	118					
+HWUSI-EAS610	1	4	57	877	1988	0	1	GAAGTCTGGTCTGGCCAGAAGATATTCTGGATTTGT	]H_b]Za`_WZ``]_^]\Z_Y^_T`a^^VZYU`]ZR	chr10.fa		5660429	R	36	118					
+HWUSI-EAS610	1	4	93	1323	1291	0	1	ATCTGAGTCCTGGCATGATCAGACCTTCTGTACCAT	aa_a___V[_^`_V_aa_``^`^^]^]Y`_\]X^^_	chr10.fa		5660490	F	36	119					
+HWUSI-EAS610	1	4	64	797	1839	0	1	TGGCATGATCAGACCTTCTGTACCATCTCAGCCTAT	ababbb`\babaaaaba_b_abaaa`^_a`aaabab	chr10.fa		5660500	F	36	119					
+HWUSI-EAS610	1	4	57	1672	644	0	1	AGAAAGTGGGACCCAGTAGAAGTTGGTCAGTCAAGG	a`aaa[[X\_a__^`__a__`[W_\\\^\SU___Y[	chr10.fa		5660754	F	36	119					
+HWUSI-EAS610	1	4	70	389	959	0	1	CATCCATTCTGTACACTGGTAGCACAGGAAAAGACC	a]aba_`_aabW``aaa``X^V^X`\^`_`a``a``	chr10.fa		5660925	F	36	119					
+HWUSI-EAS610	1	4	51	1230	559	0	1	GGAGAAGGCTTTCCTTCCACGTTTGGATACTGGTCT	a]][]`aa``a```a_^a`ab^aZaa___\a_`\]b	chr10.fa		5660956	R	36	119					
+HWUSI-EAS610	1	4	11	1319	1091	0	1	GCAGAAATAACACATGTTCCATAGGGGAGAAGGCTT	a`bba_baaaa`_a`a]a`aa__a_`__a_``\P[_	chr10.fa		5660981	R	36	119					
+HWUSI-EAS610	1	4	19	1186	733	0	1	CAGCACAAGAGATGAGGATGGCTTGTCTTACTGTTT	aabaaaaab_a`aa`bbaaaa_aaa_^`a`]]Z]`a	chr10.fa		5661050	R	36	119					
+HWUSI-EAS610	1	4	89	545	569	0	1	AACAGTAAGACAAGCCATCCTCATCTCTTGTGCTGT	_aaaa`aaa```aa_aaaaaaa`a`a_aaa_aaaa^	chr10.fa		5661051	F	36	119					
+HWUSI-EAS610	1	4	60	1589	1622	0	1	AAGACAAGCCATCCTCATCTCTTGTGCTGTATGTCC	a]Q^Ya_XaX_Y_``_^a_a]_^_X]]X]R_`]UUU	chr10.fa		5661057	F	36	119					
+HWUSI-EAS610	1	4	42	1308	545	0	1	GCAAGCACATGGACATACAGCACAAGAGATGAGGAT	aa`a_]a[^`VY[a``a_`^``\[Y]V][`^Z\\[[	chr10.fa		5661067	R	36	119					
+HWUSI-EAS610	1	4	58	1648	439	0	1	TTGTGCTGTATGTCCATGTGCTTGCTGCTGCCTGGT	aa\PWS`X]a^ZVZV_MOOY_``Y[TFZYY]VVP\B	chr10.fa		5661078	F	36	112					
+HWUSI-EAS610	1	4	16	1663	1794	0	1	GGATCTACCTCAGGGAAGAGATGTGCACCAGGCAGC	aa\`]``]`a`]a]]__a\a\Y_W`\W\T]^W\\^S	chr10.fa		5661104	R	36	119					
+HWUSI-EAS610	1	4	4	679	908	0	1	AGGATCTACCTCAGGGAAGAGATGTGCACCAGGCAG	aa`ab`aaa`X`]baa`ababaaaUa```^a`a^_a	chr10.fa		5661105	R	36	119					
+HWUSI-EAS610	1	4	41	683	621	0	1	ACAGGGGGCTTGGGAAAAGAAAATGTGGATAGGAAA	aaaba`a`_aaaaa^^__a]_`_`aYaa^__`[[]_	chr10.fa		5661144	R	36	119					
+HWUSI-EAS610	1	4	31	1756	1984	0	1	CATTAGAGTATGAGCAGCATCAGGCCCCCACTACAG	aabbbaba_b``_b^bWKYaaaUa_N_b_^`__Gaa	chr10.fa		5661259	R	36	117					
+HWUSI-EAS610	1	4	28	324	1182	0	1	TCTTAGGGACTTTCAACTCATGGCAGAGGCATGGTA	a`ZT\]XbJRTQROSO[RH][ba`a_L_HX_``]G_	chr10.fa		5661839	F	9A18T7	80					
+HWUSI-EAS610	1	4	77	530	1468	0	1	AACTGAAGGAAGCAGATCTTGCTAGATCCCCACTGG	a`b```bba^]_bba`aaaaaaaaaaaa`aaa_aaa	chr10.fa		5662190	R	36	119					
+HWUSI-EAS610	1	4	66	319	939	0	1	GAACATTTACAGGTAAAACTGAAGGAAGCAGATCTT	a^^`O^aaa``a`_aaaaaaaaaa```_`a`^^^^_	chr10.fa		5662206	R	36	119					
+HWUSI-EAS610	1	4	83	644	1356	0	1	CATAGAGAAGACTTTTCCTAAATATAGACCGTCTGA	abaW]b]^]^`Ybabbbaaa^Tbaa]`aaa^_^a`_	chr10.fa		5662247	F	36	119					
+HWUSI-EAS610	1	4	30	1495	635	0	1	TTCACCTTCAGCTAGCACAGGAAGACCTCATACAGG	VbVHZ[_abaaa]S_M^aR]aS_]a`HN_^ROYWBB	chr10.fa		5662389	F	36	108					
+HWUSI-EAS610	1	4	73	743	1458	0	1	GAAGTAGTGGGACAAACGAGAGAAGATATTCGCTTC	a`[b[T]T_`aY^a_[^\Za_^YJ]Saaa_[^]`__	chr10.fa		5663355	F	36	118					
+HWUSI-EAS610	1	4	36	1354	1249	0	1	TGGTGTACCTTGGCTTGTGGAACCATCACTCTGCCT	aba^b\a`^`aaa`aaa`baaa\_a`_a\a`_`]`a	chr10.fa		5663549	F	36	119					
+HWUSI-EAS610	1	4	19	888	1435	0	1	ACTTTATCCCCATTACTTCTGTGAAGATTTCCTCTC	_abbba`^`aaba^P]bbaXZQ\[a^Vaa]HG`T[B	chr10.fa		5663676	F	36	113					
+HWUSI-EAS610	1	4	64	1393	767	0	1	CTGTGATGGCCTCTCCATCTATGTTCTGGTAAGCAA	a]ZNS`a]WENa`a_aa_aaa`ZT_[W][RTPS\ZU	chr10.fa		5663970	R	9A26	108					
+HWUSI-EAS610	1	4	76	1189	275	0	1	CTGAATTTTCCAGTATTACAGATGTGGCCTGATGTA	abbbbbbbbabaaaabbb__baab]aa`]aa__aaa	chr10.fa		5664116	R	36	119					
+HWUSI-EAS610	1	4	68	946	1121	0	1	GTTCAACAGGGAGGTGCCAAGGATAAAAGCCCTGGG	aX^[_YYYaY^U`YX\U_WKYY\\_V^UUXUXPXYB	chr10.fa		5664443	R	36	114					
+HWUSI-EAS610	1	4	44	608	315	0	1	TGAGACCCCTCCTGGTACCTCATGCCTCTTGTCCCA	a^Z_aaaaaa^aaaa^a`a_aa`b````aaaV^aaa	chr10.fa		5665032	F	36	119					
+HWUSI-EAS610	1	4	87	1324	626	0	1	CTATTATTTTCTTTTGCTAAATCAAAATTCCCCTGC	abaab]^aaa_aba^Z^`a_a`[_a^a_a__]^QRU	chr10.fa		5665296	R	36	119					
+HWUSI-EAS610	1	4	67	1654	1197	0	1	CATCTTATGGAGGTACTAAAGAAATTTACAGTGCAG	aabbb`_^]T^\WV`\a`ba`__aba_^`]_ZP]]`	chr10.fa		5665628	R	36	119					
+HWUSI-EAS610	1	4	41	7	724	0	1	TCAGCTCATCACAGAAGCAAAAACTTTTTTGACAGA	ab_]abb`^ab`R\\\_\\I[[ab_baabaaaaba^	chr10.fa		5667288	F	26C9	80					
+HWUSI-EAS610	1	4	16	1073	846	0	1	AGCAAAAACTTCTTTGACAGACCTACATGCCACTGC	aaaa`aa_aaaa`abaabb_ba``aaa^]`_aaaYa	chr10.fa		5667303	F	36	119					
+HWUSI-EAS610	1	4	88	156	304	0	1	ACCCAGAGCTTTGATAACATTAAGTCAACGGATCAA	Ya`ab_S_ZZ`a_Q_UTWTZW_W_K`XZ`\_\Za]]	chr10.fa		5667838	F	36	118					
+HWUSI-EAS610	1	4	61	328	1721	0	1	GAGCTTTGATAACATTAAGTCAACGGATCAATCAGC	[V`bZa\baaaaba`[```Zbba_baa^Xa_a^Z[a	chr10.fa		5667843	F	36	119					
+HWUSI-EAS610	1	4	68	1578	1566	0	1	ATGCAGTCTTTCACTCTGCCACCCCATGACTTTCAC	aaaZU_\[V[`_\XTPT_U]aZR\\`RXXSSV[Z\Z	chr10.fa		5668157	R	36	118					
+HWUSI-EAS610	1	4	86	1602	88	0	1	AAGTTCCAGTGATTACATGTACACTGTATGTCATTG	aba^aa_`a_a^[]`Q_a[[a[^[_ZZ__]XY_ZYR	chr10.fa		5668659	F	36	119					
+HWUSI-EAS610	1	4	46	1004	567	0	1	CTTAAAAGGATATATAAGGTAATCAAAAGTTGAGAA	`bbbbbabbababbbaaa__b_b_`aaababbb`aa	chr10.fa		5668721	F	36	119					
+HWUSI-EAS610	1	4	64	843	775	0	1	ACTCAGGGTTGACAATATGGCTACTTGGGGAGTTAA	a\QZMW_]L]a]_XYXLN_V[YTNYW\ULWKTTWVB	chr10.fa		5668762	F	28T7	96					
+HWUSI-EAS610	1	4	49	980	1233	0	1	ATATCTAGAGCCGGGCATGGTGGTGCACACCTATAA	abbbabbaaX```]aab`b`UZa]a_`[\U\aaa_a	chr10.fa		5669136	F	32T3	11					
+HWUSI-EAS610	1	4	56	1081	1414	0	1	TGGACCATTTGGACTGTCATGGGAAGGCTGTGAACG	abaa`^`bbbb`_`bbaa_aab_`aa`\a\_`__Ya	chr10.fa		5669800	R	36	119					
+HWUSI-EAS610	1	4	45	1037	1831	0	1	AATCTCCCGAGAGAGCGTCATTCGAAAGGGCCATGT	abaaa`_^`]Y\`W`^_Y``a_XVY__Y^[^V^``\	chr10.fa		5670155	R	36	119					
+HWUSI-EAS610	1	4	37	1017	851	0	1	AAAACTCTGCTGAAGTCCTTTGATGGTTCCTGCTTT	ab`a_aaaa``aaaa__aaaa`__a[]_`_a____`	chr10.fa		5670266	R	36	119					
+HWUSI-EAS610	1	4	52	180	1786	0	1	GCAGAGAAAACTCTGCTGAAGTCCTTTGATGGTTCC	abab_[RZbbbbbaba[]^abaababaaaab`_abb	chr10.fa		5670272	R	36	119					
+HWUSI-EAS610	1	4	33	1313	1907	0	1	AATGAATTCAATCACATGATCATTTCTATCAGAATT	ab^ab`aUK___^]U[_MY_]R\_^]_]YY``^`]`	chr10.fa		5673216	F	36	118					
+HWUSI-EAS610	1	4	4	343	180	0	1	TGAACTGCTAACACCTTTTTATAGAAATTCGATTAA	ab`aa``^bbb_`a_abbaa`_b`a`a`a`aaaaa]	chr10.fa		5673254	F	36	119					
+HWUSI-EAS610	1	4	4	426	1686	0	1	GGGGATTCGGTGGCTGAATCGAGGGCCTGTCTGATT	Za]X_SabbaYaUb]a`XR_aZ`a_aa]YO``aM\_	chr10.fa		5674157	R	7T28	80					
+HWUSI-EAS610	1	4	92	647	1388	0	1	AAGAATTTCAGTACGCACACAAGGACTGGGTTGGGC	a`ZGXOV^^^_Z\XaT[Y[`a`]VQ]^\FFR_[_[^	chr10.fa		5674230	R	28TC6	96					
+HWUSI-EAS610	1	4	95	1291	1353	0	1	GCTGTGGGTAGGGCTGAGGTGGCTCCTGGAAGGTAA	_MV\RXK\RNUVRRVVRPURRXPPPNOVVPPUOMS\	chr10.fa		5674264	R	6T29	101					
+HWUSI-EAS610	1	4	89	421	236	0	1	AGTCCTACCCTGTGTTCAAGACTGAGTGACTCAGGA	``a_`UZ^^a`aJa`^aZF_[a_`P^R^`I_^H`BB	chr10.fa		5674318	R	8T27	72					
+HWUSI-EAS610	1	4	91	1338	363	0	1	AGTCCTACTCTGTGTTCAAGACTGAGTGACTCAGGA	TT`b_]aab`bbRbIaa_GO_b`\aXM\bS^J[QU_	chr10.fa		5674318	R	36	116					
+HWUSI-EAS610	1	4	42	464	125	0	1	TGCCAGCCAGGAAAGCAAATCAAGAGGGTGTTGGGT	abbabba_`aaaa`XTb]^a`a`a[`ZMQ]^PXQaV	chr10.fa		5674368	F	36	118					
+HWUSI-EAS610	1	4	32	1239	284	0	1	TGACTGCTCGGAGGTGGTTGCAACACCCAACACCCT	aaa`^a^]]`U^QVUXMS]ZPXNX\WUP[\W\W\BB	chr10.fa		5674392	R	36	109					
+HWUSI-EAS610	1	4	48	1356	656	0	1	ATGCTGGTTCCCTGAGGTTAAGCTAAATTGTACTTA	ab^aba`_aa\abaab`_ab`a_a`_``__^_`a`a	chr10.fa		5674537	F	36	119					
+HWUSI-EAS610	1	4	5	342	1696	0	1	GTCTTGAAAAGCCACTGTACTCTTTTTAACTTCCTT	a]aaaa_W__`a]___[_ba^a_a_a`a`aa_abSY	chr10.fa		5674698	F	36	119					
+HWUSI-EAS610	1	4	52	784	1509	0	1	GATATAAACACTCAAAACACAACAGCAACAATAACA	a]bba]`_aaXaa_aaaaaa][ZY^V^a_``a`aaa	chr10.fa		5674931	F	36	119					
+HWUSI-EAS610	1	4	8	1244	1929	0	1	TGTTATTGTTGCTGTTGTGTTTTGAGTGTTTATATC	a_^_aaa`]`^^aaZa]T]YW`a`[`X`\_^TOXBB	chr10.fa		5674931	R	36	110					
+HWUSI-EAS610	1	4	65	483	1072	0	1	CAGAGGACAACTTTGTAGAGTTAGTTCTCTCCTTCC	aaaaab]aa`_aaaaY_a]aY`aa\aaa_a_`a```	chr10.fa		5675053	R	36	43					
+HWUSI-EAS610	1	4	1	1075	1818	0	1	TCCATTGCATGAGACAGAATGACCCATTTCATATGT	a]_a`^a^``a_`]__a][^^_]Z^]_^WZ___]`X	chr10.fa		5675179	R	36	119					
+HWUSI-EAS610	1	4	81	1673	662	0	1	GAAAATTACCACAAACCCAGGAGCAAGAGCAGCCAC	`bbbbbabaabbabbaa`b[`a_aaa]_^`_Q``aa	chr10.fa		5675292	R	36	119					
+HWUSI-EAS610	1	4	25	663	1626	0	1	TTTGAAGCTGCTTTTCCTAATCTCCCGTGAGTGTTC	abbbbaababbbbaaaaabba_`aaaa_`_a[a_a^	chr10.fa		5675351	R	36	119					
+HWUSI-EAS610	1	4	3	375	90	0	1	TGTAGCGTGTTTGAGCTCCAGAGGATGCTGGCGAAT	`baab`bUZ`a]`_aa_XaaaRbaGVYFU]TDWGaW	chr10.fa		5675479	R	27T3A4	97					
+HWUSI-EAS610	1	4	88	493	279	0	1	CGAGGCAAGGGCTGACCTTGAGGAATGTTTAAATGT	[abbbbb^bZ]aab[[aabbZbb_abba`^aaabaW	chr10.fa		5676021	R	36	119					
+HWUSI-EAS610	1	4	35	1750	2000	0	1	AGTGAGGCTAAGATGGAGGTCTAGATTCTGAGAACA	a[a__aa`_[TT_^_`]`aZUYSa__aZ`W]Z[YX]	chr10.fa		5676163	R	36	119					
+HWUSI-EAS610	1	4	24	1629	566	0	1	TACACAGGGCAGTCATTTGGACAGTAACTCTGAAGT	abaa`a]UW^___\_^_aaZ[]^^W_`]V]_WSYQT	chr10.fa		5676319	F	36	119					
+HWUSI-EAS610	1	4	56	1133	994	0	1	CAGGACCTGAGGACTGAGGCTAGCTCTGGCCCAGCT	_aaaaa`aa_]]aaa`aaaaa`aaaa`````]``aa	chr10.fa		5676355	F	36	119					
+HWUSI-EAS610	1	4	77	109	1377	0	1	TGTGAGTCTGGAGGAAATGCATGAGACAAAGCTGGG	abbba`bbbab_bbb]_abbaabbb`babbbbabbb	chr10.fa		5676384	R	36	119					
+HWUSI-EAS610	1	4	79	1752	1108	0	1	GAGTTCGTGGCTTGCAGCCCTGCCCAGCCTCCAGGT	[_XVaaRXQU``aTaZO]__X[_aaa^^`][aa\PX	chr10.fa		5676775	R	36	118					
+HWUSI-EAS610	1	4	70	783	1090	0	1	TGTTTTCTGAGTATTTTGAGAACAATACATGATACT	YYPZY_Q^Y\aRabb]a]_bZS^a\QPL[V]URQL[	chr10.fa		5676892	R	36	118					
+HWUSI-EAS610	1	4	52	1090	827	0	1	AGAGAGCACAGAATTCTGCTGGTCTTATAAGAATGC	```b_b_a`b^]ba\V]_a`aXLU_a`aZa^\aa`]	chr10.fa		5677940	R	36	119					
+HWUSI-EAS610	1	4	13	682	581	0	1	CTTATATAGTATGTGTATAAAACAGATCTCTAGTCT	abaaaaaaa_a`b_a_aaaaaa_`aaa`_``__^__	chr10.fa		5678092	R	36	119					
+HWUSI-EAS610	1	4	26	463	1229	0	1	TGGGAAAGATGCCAAGAGAACAGTTGGATGGTCAGG	[a`[[PLUTHUHMX__N\^aYURNNV`VVZV]S]BB	chr10.fa		5678144	F	11T24	95					
+HWUSI-EAS610	1	4	46	519	1600	0	1	GCCATGTAGGCTGTTGGTCTTCTTCGATGTTAACTG	aaaa__N\^^^__]_N[O[[_Q[]T_XVUS]_]^\B	chr10.fa		5678541	R	36	114					
+HWUSI-EAS610	1	4	47	1532	1308	0	1	CACAAATTTATTTCCAGGTACTTTCGTGATGTTAAA	aaaab^a```_`baXa\baaaa__Y_^a__`_VWRR	chr10.fa		5678932	F	36	119					
+HWUSI-EAS610	1	4	62	1384	1235	0	1	ATTTCACTCATTCCACCAAGCAGATCCACGTCATGG	a^a_`a]a]^`aY^]]```__]^X_ZU`]]]]]]__	chr10.fa		5679099	F	36	119					
+HWUSI-EAS610	1	4	76	1693	1471	0	1	GTGCATTGATGCTGCCAAAGGTGCTTGTTGACTTAG	J]T`[b`PV[[]b`aababbbRXX`LM[UOOT\T\[	chr10.fa		5679331	R	36	117					
+HWUSI-EAS610	1	4	86	1382	616	0	1	TGAGTTCTCTTGTCTGATTTCTAATGGGTCAACTTC	a`]a_a\`_a`[^`aa`aaa`aa__[X`S^a`]_^_	chr10.fa		5679378	R	36	119					
+HWUSI-EAS610	1	4	90	920	203	0	1	GTCGGGGTGTGACTTCTTCAACTGTTGACCGTCTGT	aa]P_]_N^Zaa\a^P\__aa\`a__X_\\`\W_]U	chr10.fa		5679753	R	36	118					
+HWUSI-EAS610	1	4	28	696	420	0	1	AACCTTAAGAGGGCATTAGATCCCCTGGAACTGGAG	aaaaaaa`a_``aaaaaa_a`_`_``a`^_^```\a	chr10.fa		5679948	R	36	66					
+HWUSI-EAS610	1	4	31	460	1991	0	1	CTAAAGGAGAAAAATACTGAAAACAGTGTTTTAAAA	a]a^baI_VaVU^URTN_a_^[^XJaG_XPa__\aY	chr10.fa		5680181	F	36	116					
+HWUSI-EAS610	1	4	32	43	1178	0	1	GACAGGAGTCTGATGTCCAGAAACAGAGTAGATGGA	a^aUab`b^abaXaa^aa`^XG^^Y^[aRSY^NZaX	chr10.fa		5680331	R	36	118					
+HWUSI-EAS610	1	4	51	1728	315	0	1	GGGGATGATAAAAAATGATAGCCCCGAACTGCAAAT	a_baaa^`bbbaaabaZbaaQaab`\aaaa]_a`aa	chr10.fa		5680514	R	36	119					
+HWUSI-EAS610	1	4	80	1609	839	0	1	TGCAGTTCGGGGCTATCATTTTTTATCATCCCCGTG	a``a`]Z`__QT^`]_Q_[_^a___X\`XXZUZPU]	chr10.fa		5680517	F	36	118					
+HWUSI-EAS610	1	4	2	1282	1746	0	1	AAAGCAGGAAGTGATCAAAGGGAAACAGCATTTCTA	a_aa\`[UV\]ZYHX[]^_[_VQ[a_\[\]XQ]NV_	chr10.fa		5680647	F	36	118					
+HWUSI-EAS610	1	4	1	1216	145	0	1	GTGACATCTTTAAGATTTTTCTCCCTATGTTTGTGC	a[^[HS`_]^_YNSYX]_a_]_[ZV[M^\VSPYG]Y	chr10.fa		5681061	R	33A2	106					
+HWUSI-EAS610	1	4	76	1149	1846	0	1	ACAGCTAGCCTTTCCCTAAAGAAATCTACACCACGT	abb]_a``aa``aaU_^^W^_ZZaaaaXIRS\YG`^	chr10.fa		5681899	F	36	117					
+HWUSI-EAS610	1	4	72	583	1549	0	1	GGCTTGGCTGCAAGCATCTTTAACTGCTGAGCCATC	abZaba]_bbabb]a`a`aaW`Xaaa`_W`_bUW_a	chr10.fa		5682650	R	36	28					
+HWUSI-EAS610	1	4	31	1758	641	0	1	GCAGCCAAGCCACCCATTCAGAGTTCAGTCCCCAGG	_`a_]\a_MV`a`]ZZ_XZRLBBBBBBBBBBBBBBB	chr10.fa		5682675	F	36	53					
+HWUSI-EAS610	1	4	8	369	561	0	1	TCAGAGTTCAGTCCCCAGGAACCTTCTATTATTGTT	aa^]`aR]]X_U^^\`\]^XW[X`^T`^_[W_]`]_	chr10.fa		5682692	F	36	119					
+HWUSI-EAS610	1	4	68	146	653	0	1	GATGCTTTAACACGGTGTCCATTTAGCAGAACAATA	_J_b``aba`aaabaIb__``aabaaaaaaaa`_aT	chr10.fa		5682721	R	36	118					
+HWUSI-EAS610	1	4	89	441	1277	0	1	GAGACAGTGAGTAACTACAAGGAAACAGTGGGTTTT	a_a]_`aaa^a\a`_a`a\`_a\_a]\aZa[`X___	chr10.fa		5682978	F	36	119					
+HWUSI-EAS610	1	4	30	246	510	0	1	TGTGCCCACGTCGCAAACCCCATGCTGGGTATGGGC	V_aX`_^a^^^aa_Z_\]__`^a[[_[^`WV\`Xa`	chr10.fa		5683082	R	36	119					
+HWUSI-EAS610	1	4	82	376	1752	0	1	GACGTGGGCACAAAGTCCCATCCTTGGCTGAGGAGC	_T_a\a[_aa`a__`Zaaa_a`a\``^X\`\[aT^`	chr10.fa		5683106	F	36	119					
+HWUSI-EAS610	1	4	52	745	1275	0	1	ATCAATTGTGAATAGCTCCTCAGCCAAGGATGGGAC	^baaV`bbYbaa[a`a[[[YZ`]YaYNX]`U[`BBB	chr10.fa		5683120	R	36	106					
+HWUSI-EAS610	1	4	83	1190	1626	0	1	GTGGCTGCACAGCTCTGGGCCTTTTTCACACTCCAT	^Y[\R_]R]UXS[YWIHX[[^]`^XDT[SSWU[VVY	chr10.fa		5683643	F	25G10	108					
+HWUSI-EAS610	1	4	52	844	585	0	1	GCTTGCTTCCCACAGTGGCTCATTGGCCTGCTCAGT	aaaaa`ab`_^_\^a\`^_a_`]`]_\\YUY^TU_B	chr10.fa		5683934	F	36	114					
+HWUSI-EAS610	1	4	77	1740	1343	0	1	ATTGATTGCCAACCTGATTGCATCTGAAATCAATTA	aaa^URX_VR^a]a]R_W_S]_^\W]V`a^^][X^a	chr10.fa		5684363	F	36	118					
+HWUSI-EAS610	1	4	67	721	1541	0	1	AGTGTGGGCAGCGCCTACAGTACCCCAGGTCTAAAG	TT]^_bba[\aaaaabaYaaaaa]`aK``]aaa]aa	chr10.fa		5684466	F	36	118					
+HWUSI-EAS610	1	4	22	1566	1563	0	1	TGCTTATCAGAAAGGAGCAAAGTTAGAGTTTGCCCA	a_a_a_a^aaaaa`TXaa`^_a`_`Y`aXWYX^`^`	chr10.fa		5684521	R	36	119					
+HWUSI-EAS610	1	4	35	122	2029	0	1	GTGACGATGCTTATCAGAAAGGAGCAAAGTTAGAGT	aVaab]IYab`[Yaa]UWZTZ^U[a]]P][_``_^[	chr10.fa		5684528	R	36	118					
+HWUSI-EAS610	1	4	23	1717	98	0	1	CAACGGGTCCCTAGCCTGGCTGGAATGTGGACAGCT	aa```_TKa`aT_X\a^\^\X\^W^VDQKKZOVPWT	chr10.fa		5684738	F	36	115					
+HWUSI-EAS610	1	4	74	1112	339	0	1	GTACCAGGAGCTGTCCACATTCCAGCCAGGNTAGGG	aSVZ^^\^RRX_^S\\\[UU`W\PU\ZBBBBBBBBB	chr10.fa		5684746	R	30C5	77					
+HWUSI-EAS610	1	4	82	1306	1134	0	1	CAAGACTAGGAGAAAAAACCTTGAGTCCAGAGTCTA	ab\R`P`_O[MXY^SSPPTTZaa\\`[OETXQWVYa	chr10.fa		5685034	F	36	116					
+HWUSI-EAS610	1	4	95	1041	938	0	1	CACACACACACAAAGAATCTTAATGACAAACTGGGA	]ababbbbbababbbb_bbabbbbbbb`^aabbbba	chr10.fa		5685112	R	36	119					
+HWUSI-EAS610	1	4	10	683	1694	0	1	ACGTTCATGCAGTCACCTAATGTGAACCTTTCTCCA	aab]Ya__]`a`[_\_\^``_`R[[`_]_^_]Wa^a	chr10.fa		5685328	F	36	119					
+HWUSI-EAS610	1	4	80	1663	955	0	1	ATGGATGTTCATAGCAGGCCGGTCAGTCTCACCAAG	aa]Z\`\[[[`\_V_ZZY``[[S^ZSSU[V^WU[XS	chr10.fa		5685383	R	36	118					
+HWUSI-EAS610	1	4	93	1176	1483	0	1	TGACCGGCCTGCTATGAACATCCATCCACCTCTTAG	a_b^aa`Maaaa^ba_bb`abaaabHabaQbbbbaa	chr10.fa		5685394	F	29T6	96					
+HWUSI-EAS610	1	4	90	1574	1199	0	1	TGTGCTAAGAAGTGGATGGATGTTCATAGCAGGCCG	a\V_[a`[[R\YP[XZ\_`[YaSX\Z_[RUW\NTVV	chr10.fa		5685398	R	36	118					
+HWUSI-EAS610	1	4	12	1138	285	0	1	CACTTCTTAGCACATCAGATAAGATCACAGTCCCTA	aaabbababaabaaaaababaa`aa_b^a`]`_`aa	chr10.fa		5685420	F	36	119					
+HWUSI-EAS610	1	4	27	369	30	0	1	GATTTGTGTTTTGCTTACAATGTTAGACACCACTAA	aa`aab_a_a`aaaaaaaaa_`_```___a____`_	chr10.fa		5685659	R	36	119					
+HWUSI-EAS610	1	4	95	535	987	0	1	CTCCAGGAAAATATTGGTCAATTCAGGGAAAAATGT	abbb_bbaaa_ba`aba_aaaaaaabaa^`a_`ab_	chr10.fa		5685920	R	36	119					
+HWUSI-EAS610	1	4	29	736	443	0	1	CAAGAAAGTAGAGGCTAGTAGAATTCATGCAGAGAT	G[`bba`baba`^aaba^ab``abbabbaa_babbb	chr10.fa		5686047	F	A35	107					
+HWUSI-EAS610	1	4	25	1076	1505	0	1	AGAGATGGGCTATNTCTTTAAGCTGAAGGCCTGTAG	`_S[`_\R\`a]TDUabaaabbb]b\T\\FPaZJ]T	chr10.fa		5686421	R	13G15T6	98					
+HWUSI-EAS610	1	4	98	853	2014	0	1	AGACCTTCAGCTTAAAGACATAGCCCATCTCTTCTT	_aaaaaa`aaaaaaabab``a`_a``_``_`````a	chr10.fa		5686425	F	36	119					
+HWUSI-EAS610	1	4	96	291	104	0	1	CGAAAGCAAACATTTTTGTCTATAGGCTGCTTTTAG	\bab`bbabbaa_bbb[_a`ba[`bbabb_abab`a	chr10.fa		5686631	R	36	119					
+HWUSI-EAS610	1	4	73	421	91	0	1	TGGTACTGTTTGGGGGAGGTTATGGAACCTTTAGAA	^b_NYZ\b[_bbaa_Y`a_\\_U]\XVJX[XZS]BB	chr10.fa		5686843	R	36	32					
+HWUSI-EAS610	1	4	85	146	1966	0	1	ATCAACAGGGGACCCAGTTTTCAAACACATGAGTCT	`]_TT^Q`a__^aaaRaNNZ_`[]_a_]Z_^R^Z^U	chr10.fa		5686878	F	36	118					
+HWUSI-EAS610	1	4	47	203	277	0	1	TGGGGTGCTCCAGGTTCAGGGAGAGATATTCTGGTG	`]bb_G_^``\K_]]TX`[[`]_ab[b`J^]bYKSa	chr10.fa		5686940	R	36	117					
+HWUSI-EAS610	1	4	94	1635	979	0	1	CGAAGAGATGGAGACACTTGGATTCATAGAATGTTC	aa`]_]^RYNXXa\^a_Xa\aX``_\_a^_]_YR\_	chr10.fa		5686997	R	36	118					
+HWUSI-EAS610	1	4	64	644	732	0	1	TGGTTGGGAACAGAAAACAAAGATAAGATGTTAATT	a_^Uab\\a]a^aaaab__bTaa`a_a^_a_a[aaa	chr10.fa		5687124	R	36	119					
+HWUSI-EAS610	1	4	50	1089	1190	0	1	CGATTACTCCCATCTTGCCCTTTGATACAGGTTATC	]_aaba``a`a`a_aaa]^aabbbaaaab^`_aaa^	chr10.fa		5687589	R	36	119					
+HWUSI-EAS610	1	4	48	321	1224	0	1	TGTGAACATCAGAGAGTTCTCTCTATCCTTGGTAAG	\__bbbab_aa^^Q]Xbb_I\_`_S`ababaaYaVZ	chr10.fa		5687630	F	36	118					
+HWUSI-EAS610	1	4	7	786	963	0	1	GGATAAAGGTGTCTTGTTAGGTATTTTGCAACTAAT	`UTb_a_a`Yb_]_a\NY\aaI]aPY__`]`__a__	chr10.fa		5687906	R	36	118					
+HWUSI-EAS610	1	4	93	538	380	0	1	AGCAAGCAAGCAAGCAAGCAAGCAGAGGCAGAAGGA	\_b`\[HVb`[]RY``PPY`]b\]_a`T^Ta_TVRB	chr10.fa		5688070	F	36	29					
+HWUSI-EAS610	1	4	48	996	1068	0	1	GTGAGTGTGCAGTGTGTATATATAGGCCAGAAATTG	a`b_b^a__^_`_a_a\_aaa`a_]`ZY__]^^__a	chr10.fa		5688216	R	36	119					
+HWUSI-EAS610	1	4	74	157	2029	0	1	TTATCTTTTTGGCATAGTATTTCTCATTTGTTTTCT	aa_babbaabbbbaaYa\_`aaaaa_aaab_`aaaB	chr10.fa		5688493	R	36	115					
+HWUSI-EAS610	1	4	26	843	371	0	1	ACTATGCCAAAAAGATAAGCAGAAGAGTGCAGAAAA	aabaaa_aaaaaaaaaaaaaaa_a_aa]a``a^`__	chr10.fa		5688511	F	36	119					
+HWUSI-EAS610	1	4	79	1344	882	0	1	CACTCTCCTCTTTACTTTTGAGACAAGGTTTCTCAC	ab_a]aa``abaaa^aaaaaaa_`_`aa]^_]`^_Y	chr10.fa		5689317	R	36	119					
+HWUSI-EAS610	1	4	42	1788	1223	0	1	GTCTTCCACATGGTTAGTCACCTCTCCACAGCACCG	a]a]Z_[aabZ_a^]YZ]`_Y\``V]___[RN_\YX	chr10.fa		5689888	R	36	41					
+HWUSI-EAS610	1	4	32	41	1457	0	1	CTTTTATCCAGGGCATCTAGAATAATAAACCTAATC	aZH[a_]bb^_aaa_aa_QW]Ya_^^SV`aa^ba\]	chr10.fa		5690253	F	36	118					
+HWUSI-EAS610	1	4	4	1028	1309	0	1	ACCTAATCTGATTGACCTCAAGAGTCACCACAAGAC	UV^\aYQ\S_Y\]\]VS]TZIUXZFQZLM_WVPQ]]	chr10.fa		5690281	F	24C11	106					
+HWUSI-EAS610	1	4	61	362	317	0	1	GATGATATCCAGAAGTCATCCAGATGATACACAGAA	a`ab`abaaabaaaa]aaa`aaa```a^``_`__^`	chr10.fa		5690668	F	36	119					
+HWUSI-EAS610	1	4	92	1213	1719	0	1	ACCTACGTGAATGACAGGCATTGAACTGACGGCCAC	aQ`aaWbW`_aa\[\[a`_`a]ZZV[\`SZ[aU\\]	chr10.fa		5691071	F	36	119					
+HWUSI-EAS610	1	4	60	1090	1834	0	1	AATACACAGCAAATCTCCCAAAGACAAGACTTCACA	abaa__]_a\aaaaX`_^_aa_`^^`_`_W``Y^]_	chr10.fa		5691157	F	36	119					
+HWUSI-EAS610	1	4	32	1581	425	0	1	TCTGCCACGTGGTTCCTGGCGATCGAAAACAGATCA	a_^R^``Z[Y_U\```ZRY[[^WKDK]FKPRPUSS^	chr10.fa		5691398	R	27C8	104					
+HWUSI-EAS610	1	4	63	390	1067	0	1	GATCTGGAGGATCCGGGTCTCTCCTTCTGCCACGTG	aVZaaa`\\\``_a`[`ZWW`^```__\^\^\X^Wa	chr10.fa		5691423	R	36	119					
+HWUSI-EAS610	1	4	55	60	993	0	1	TTCATGTTTTGAGAGGTTACTCTACTGTTTTCTGTA	aaaaaaaaaabaa_aa]aa``a`[`aa]aa_a\YV`	chr10.fa		5691625	R	36	119					
+HWUSI-EAS610	1	4	88	995	436	0	1	TCTTGTGTACCAAAGTACCTCATTGAGGCCTAGCTT	Ta\\Xa`S`bba^a]bb`JR```a`WT\LGNUFYaa	chr10.fa		5691722	R	28T7	99					
+HWUSI-EAS610	1	4	12	579	418	0	1	AAGGTCAAAGCCATTTGGGTTAAATGATACCAATTT	a`abSaa[aa^Z^`Y`a_aW_]VZ``\]]U]_]a]^	chr10.fa		5692000	R	36	119					
+HWUSI-EAS610	1	4	80	627	176	0	1	AGTATCCCCATCACGCCTGCAGGGAAACTAGGCAGA	a\H\`]^`a_`[PW_a`^a]U`aZ\`]X\PUSNJP\	chr10.fa		5692586	F	33T1T	70					
+HWUSI-EAS610	1	4	53	1780	1590	0	1	TTGAGAATTTAATATAATGTGTTTCAAGCATGTTCA	`bb`_aaaaaaaaaaaaaa\a\`^_a]^^`_^\^Y`	chr10.fa		5692679	R	36	119					
+HWUSI-EAS610	1	4	63	1153	999	0	1	CACTGCATGGGCCCTCCTGCTGCACACACACACACA	`a`]^``^[`U^\ZKU[ZXQ\\]WZZT[\\U^X]T^	chr10.fa		5692895	F	36	118					
+HWUSI-EAS610	1	4	60	1466	1033	0	1	CTGTCCTATCCCCAGCAGCCATCAGCTGCATCCGGA	a```\````_`^`aa_a]^`aa``\`aa`]Ya`]\^	chr10.fa		5693004	R	36	119					
+HWUSI-EAS610	1	4	73	1059	1057	0	1	ACAGATATGTATCATCGTGTGAGGTCCTCTCTTGGG	^^abab[bbZab_aaaa]a`a`aaYa`aaaSa_^`X	chr10.fa		5693084	R	36	119					
+HWUSI-EAS610	1	4	97	210	524	0	1	TAACCCACTGAGTCCAACAGATATGTATCATCGTGT	aabb^\`a`]\Z]^ba`^`aYY`aa``_`^X`b]YT	chr10.fa		5693100	R	36	119					
+HWUSI-EAS610	1	4	18	1191	1521	0	1	GAGGTAGATATAATCAAGATGCATTGCATATATGTA	a]a`Z_^X__a_aaaa^a`]a^a`[^]^a\`^`\V`	chr10.fa		5693202	F	36	119					
+HWUSI-EAS610	1	4	93	88	1231	0	1	CCCAAGGCTCCTCCTCTCCCTGCATCTCATTAGCTC	aa_P]__aZ_`Y^_U^^_]ZPZYVU\GY\SUVUYS\	chr10.fa		5693826	R	36	117					
+HWUSI-EAS610	1	4	43	1233	1579	0	1	GTTGACGTGGGAGGGGCTCAGGTGGAACATGGCAAA	aa`]ZDYXU`X[aUPZ`aYYTVQ\]^^Y[^]VU\^Y	chr10.fa		5694204	F	5A30	110					
+HWUSI-EAS610	1	4	52	747	1587	0	1	GAGGCCAGATTACCAGGAACCAAAACCTACACTGCT	a]S`aaa`_b`_\_aa]`a`_aa__^`_a_`\_a_`	chr10.fa		5694559	F	36	119					
+HWUSI-EAS610	1	4	74	1785	928	0	1	AACTACCTTACATTCTAGGACCTGTTCTAAGGGCTG	aaa`aa`T___a^\__aZW^Z]`ZV\UX]YQNG^TB	chr10.fa		5694726	R	36	113					
+HWUSI-EAS610	1	4	49	1605	1719	0	1	TGTGATGTGATGTGATGTGATGTGTGTGTGTTTGCC	ab_a_aa`aa`a[a[a`[`_]WU[\ZU^^_Y_\VXQ	chr10.fa		5694773	R	36	12					
+HWUSI-EAS610	1	4	72	168	1943	0	1	AATGCAATTGACAGAGATCATTTAAGCCAAAACTAG	_^abbWIaaa``Sa\a^^aa__^Ya_`aLR_T]]X]	chr10.fa		5694906	F	36	118					
+HWUSI-EAS610	1	4	71	231	505	0	1	TGCAATCTTACGGCAGATACACCTTTGGCTATTACA	`ba_]Y[baa`_aaaaaWaa`aaaa_aYa_UNTW__	chr10.fa		5695052	R	36	119					
+HWUSI-EAS610	1	4	10	1059	1568	0	1	CACAACAATGCATTATGCTAAGAAACCCAGTCCAGA	N]`a^Wba_RZ\aaa^a__^S___^a[F\`Y\WGTa	chr10.fa		5696114	F	36	116					
+HWUSI-EAS610	1	4	39	1185	786	0	1	CACAACAATGCATTATGCTAAGAAACCCAGTCCAGA	a\ZU`b^a`a_abb`baba[abb``aaa___^a`ba	chr10.fa		5696114	F	36	119					
+HWUSI-EAS610	1	4	18	572	1563	0	1	AATGCATTATGCTAAGAAACCCAGTCCAGAACTGTG	`aabaaaa`abaab`a`\^aa`aa_a`_`^`^`a]a	chr10.fa		5696120	F	36	119					
+HWUSI-EAS610	1	4	45	815	450	0	1	ACACACAGAATATATTCTATTTGGCTATTTTTTCAT	aa]\aVY_PV]N]U`_W_a_`_`]YX^ZZ_`_^]^]	chr10.fa		5696244	R	36	118					
+HWUSI-EAS610	1	4	68	865	1692	0	1	ATGCAAAAATTATTGTAGTAAGTGACCTCTAACCTT	ab]LUVZSaVb`_ab`YW[YZGY`WTE\^_X_UL^`	chr10.fa		5696454	F	3T32	99					
+HWUSI-EAS610	1	4	10	1046	1812	0	1	AACAGCTGAGGTGGCAGAACCTCCAAAGACAGCTCA	`aaa___aaaaQ__^`[``_`____[a[XZRX]\P^	chr10.fa		5696630	F	36	119					
+HWUSI-EAS610	1	4	66	550	798	0	1	GCTGAGGTGGCAGAACCTCCAAAGACAGCTCAAGAA	aa`_RVaN^\_[`^_\\__`^\ZZ[]__^Z\a]ZZ[	chr10.fa		5696634	F	36	119					
+HWUSI-EAS610	1	4	44	103	1491	0	1	TGGGACCTGAGATTGGACTGTGCCCATTCCTTTCTC	`bbb]bbaaabaa`abaa\aU`aaaaaabbaa`b`b	chr10.fa		5696736	F	36	119					
+HWUSI-EAS610	1	4	79	413	358	0	1	GTTTAAATAATGAAGTTTCTCCCTGGGTGTCCTTAG	`OXW`U`[__XTYO_]X]\V_`\QXY\Q\U[_[YXV	chr10.fa		5696827	R	36	118					
+HWUSI-EAS610	1	4	69	1055	223	0	1	ATAGAACACTGGCCCAGCATAGGTTATGCTCTAGGT	ab^[ab`b]`_aaa_aaaa`[_]W]``UU]_WPX_Q	chr10.fa		5696966	F	36	119					
+HWUSI-EAS610	1	4	47	672	1431	0	1	CATTGAACCTAGAGCATAACCTATGCTGGGCCAGTG	aa_baabaaaaaaaa]aa_S`aaaa`aaaaa_aa_a	chr10.fa		5696972	R	36	119					
+HWUSI-EAS610	1	4	39	476	412	0	1	AAGTGGGAGTGTTCATTTACCCTCTAGGGAGGGCTG	a_babbbb_abbba`bbbaabbbabab```aaaaa`	chr10.fa		5697010	R	36	119					
+HWUSI-EAS610	1	4	29	764	1314	0	1	CCCAGCACTGAAAAGACAAAGAGGGACAGAAAACAA	Wa]]O\baYQ[VaYTZVZWQXUaX^Q[^RWNOaZ`_	chr10.fa		5697361	R	36	118					
+HWUSI-EAS610	1	4	8	1036	1495	0	1	ATGTTACAGTTGCAAAGATCCTGCACACAGGAGTGG	aaa_aa^XXZ]X_`\P^^__Z_a_]^^X]a^Z^[`_	chr10.fa		5697543	R	36	119					
+HWUSI-EAS610	1	4	2	666	1314	0	1	AATGCCGAGAGAATTGAATCTAATATGAGTGATGCT	a]aa_aa^]X`[Z`aa]Y```_`]``a^`V`[X_XW	chr10.fa		5697602	F	36	119					
+HWUSI-EAS610	1	4	15	878	799	0	1	GTTGAGTCTCTATCACTTGGGACTACACATATGTGT	a_b`]a`_`_a_a^a^_a```]]``_`\`_^^`Z`X	chr10.fa		5697708	R	36	119					
+HWUSI-EAS610	1	4	93	1257	1012	0	1	GTGGCCTGGAGACCCTAGTAGAGGTATCCAGACATT	aaa_aa`aaa^_`a`aaa`aaa`a\a__QZ__\_a`	chr10.fa		5698149	F	36	119					
+HWUSI-EAS610	1	4	27	342	300	0	1	AAAATTGTTAAGTCACCTCTTGTTCAGAACATAGCC	^_a```aUab]`Ybaa^aa`^b_aaa_^aaaa`]`_	chr10.fa		5698199	F	36	119					
+HWUSI-EAS610	1	4	56	1240	814	0	1	AGAGACTCCCAGGGATGCAGTTTGGAGCAGAAGTTT	a\`\`aab[`__a]``]Z`Z_a_]`_`Y`a^aaZaa	chr10.fa		5698322	R	36	119					
+HWUSI-EAS610	1	4	82	1571	1702	0	1	AGAGACTCCCAGGGATGCAGTTTGGAGCAGAAGTTT	aaaaa`]]V___^_W]_[]`W_\_^U\\a_Y\`NY^	chr10.fa		5698322	R	36	119					
+HWUSI-EAS610	1	4	96	1284	1548	0	1	CGGGAAATAAACCCTGGAAAGTTACAGTTGGTGACT	`aa__ab``aa_aa`aba`aaaaaaaaa__b]a[V_	chr10.fa		5699131	R	36	119					
+HWUSI-EAS610	1	4	38	1505	1774	0	1	GGCAGTTAATGAAGGTGATCTGAGGCACAGGCTAAC	][Ua`\YMZ__P^a^LaV_P]Z`X]UYZa]X`aWX_	chr10.fa		5699229	F	36	118					
+HWUSI-EAS610	1	4	84	939	767	0	1	AGTGGGAGGCAGATCCATACTCATTCTTGATAGAGT	ababbbaabaabaaababbaaaabaabbbaaabaa`	chr10.fa		5699420	R	36	119					
+HWUSI-EAS610	1	4	37	504	238	0	1	CCTAGTGCCTCAGCCATAGCTTTTCTATGATAAATG	aa\abXbaaab]ba_Ta^a\bb]b_b^a^aaabaaa	chr10.fa		5699611	R	36	119					
+HWUSI-EAS610	1	4	25	1263	1106	0	1	TAGTGTAATCTTTCTGAAGATTTAGAAAAGTCCGAT	`XY]a_]\_Xa^\a_a`_a`[`aVZa_]`_Z]]`]_	chr10.fa		5699648	F	36	119					
+HWUSI-EAS610	1	4	91	129	795	0	1	GGGTCTTTGTATAAAATTCATCATGATGAAGACATT	aa\_^a```N^\Y[PLW____^V[`T^^X^a_^[BB	chr10.fa		5699982	R	36	110					
+HWUSI-EAS610	1	4	35	1262	1638	0	1	TGTTCTTGAATCTGGCAACCTCTGCACATTACAGAA	ab[aaa][_`a__`aa`___a__`_`\`__a_b__a	chr10.fa		5700156	F	36	119					
+HWUSI-EAS610	1	4	93	1121	1567	0	1	AAGGATTCCATTGCTAATACACAGACTAATCTGCTA	aaaa^_Z[V_a___`_`_a^_TX`^]`]V`Y`_^_`	chr10.fa		5700293	F	36	119					
+HWUSI-EAS610	1	4	59	971	1740	0	1	TACACAGACTAATCTGCTAGTGTTTCCTACATCAGA	_ab_a`a^_Wa]aa``aa^a\aIaaZ_`a_a`W__`	chr10.fa		5700310	F	36	118					
+HWUSI-EAS610	1	4	13	256	437	0	1	TGACAAAAGCGAGCAAGTGCTAAAGTCACAGGGGGA	]`_bbb`_^_bU`a`]bS`b^\U_b`^aaabaab_Z	chr10.fa		5700371	F	36	119					
+HWUSI-EAS610	1	4	37	174	954	0	1	GGCTGGAGCTTCAGACACTCAGAATTGGATTCCCTA	^ab\TWN_UNHYVZPa`]]ab\WIZSa_FTaVabZa	chr10.fa		5700755	F	28T7	106					
+HWUSI-EAS610	1	4	12	411	301	0	1	GTTGGAAGTGGTAAAGGTCTGCTTTTATTCAGAAAT	a_aaaY]a]a`Z^^]__[^_`____`_W\__`_]]]	chr10.fa		5700916	R	36	119					
+HWUSI-EAS610	1	4	53	1431	37	0	1	ATTATAGAAGTCTTAGTGGTGAGGTTGGAAGTGGTA	`ba`aT^\XN\_`^\^[_UR_P\]U^VVT[ZNQNMZ	chr10.fa		5700939	R	36	118					
+HWUSI-EAS610	1	4	33	1424	558	0	1	GGCAGCATAGCTTGTTGTTAAAAGCTGGGATTCCAA	abaa^X^Y`\aa_X]b\YaaabaRa^G]H^M^`_[\	chr10.fa		5702720	R	36	117					
+HWUSI-EAS610	1	4	83	1437	990	0	1	GTAGCCAAGGATTAATGTCTTGGCTTAAATGTGATT	`aaaaa]aa`]`^`^a\^Za`_a]`_`_]aa[`\_`	chr10.fa		5703720	R	36	119					
+HWUSI-EAS610	1	4	50	110	220	0	1	TAAGCCAAGACATTAATCCTTGGCTACATAATGAGT	a`Z``b]^abaa`a^a`aa_a_a`aaaaaa``_aa[	chr10.fa		5703729	F	36	119					
+HWUSI-EAS610	1	4	64	765	1590	0	1	CATACGCAGCTACCCAGAATTTGAGAGGTAAAGGCA	abababaababaaab]a]_bbbbabaaa_aabaaaa	chr10.fa		5703824	F	36	119					
+HWUSI-EAS610	1	4	25	523	718	0	1	GAGGTAAAGGCAGAGTCAGCCAGATCGCTGTGAGTT	a`aaQaa`a`aaa^_Zaa`__Z`[Z_X[V]W_\_V`	chr10.fa		5703848	F	36	119					
+HWUSI-EAS610	1	4	39	1541	1962	0	1	GAGAGACAAAGTTCACATGGTCTCTTCCATGAGAAG	aYa_a^___]_L\ZaZTW__S]`U`]]V\_a_aZXa	chr10.fa		5704365	F	36	118					
+HWUSI-EAS610	1	4	7	1211	274	0	1	TGCCCTCACACCCAAGTAACGATCCCTTTTCCCTTT	aabbbbababa]_aababbaba]V_aaaa`Y`[aab	chr10.fa		5704452	R	36	119					
+HWUSI-EAS610	1	4	14	1010	728	0	1	AGGTATCATAGTTAGGTAGGACTTTTAGTTGTTTCC	aaV_VX\b^WaVaIbbP^`IKQR^aa\U]R[aa\ab	chr10.fa		5704848	R	36	117					
+HWUSI-EAS610	1	4	18	633	1547	0	1	AAGTCCTACCTAACTATGATACCTATGAACTACATC	aaaW`_[^_`a_a^```_^_`^a_``_]`]__]]`_	chr10.fa		5704860	F	36	59					
+HWUSI-EAS610	1	4	49	619	141	0	1	CTTTGTTCACTTCAGCTTGTTGACCTTTTGAGTTCT	abaa`bab`aab`aaaaaa_bb`_aabbbbaaaaaa	chr10.fa		5705323	R	36	119					
+HWUSI-EAS610	1	4	42	802	649	0	1	CAATCACAAGCGGGGAGGGAGGTGAGGATCTGGGAG	`a^XaX`\T\F_T_]I[\`Q`_NaY^\[UX\T`XP_	chr10.fa		5705395	F	10T25	107					
+HWUSI-EAS610	1	4	56	428	1495	0	1	GGTACCTATCCTTGAGCTGGATCTCACTTTGGGCCT	a\^^^`a]]aaa``_aa_`_\_``^_\__W__^^]`	chr10.fa		5705820	R	36	51					
+HWUSI-EAS610	1	4	59	187	959	0	1	CAATCAATAGATAGAAGCAGCTGACCCCTGTTGTTG	a`U_a\aWRaS_aaaL`a\_a^^_W]Y]Y^V_^\Y^	chr10.fa		5705970	F	36	16					
+HWUSI-EAS610	1	4	78	189	308	0	1	GGGTCTCCTATCAGCTGGTGTATGCTGTCTGTTTGG	abbXbbbbbabbabbbba`baaaabbbabbbaabba	chr10.fa		5706108	R	36	13					
+HWUSI-EAS610	1	4	21	150	1317	0	1	TTACCTGTGTGTATATACAAAGATTTATTGATTGAT	aabbbaa`a_b^Y`aaaaaaab_`aa_aaa`aaaYa	chr10.fa		5706678	R	36	119					
+HWUSI-EAS610	1	4	56	519	1404	0	1	GGTAAGTGTAGTCCACACCTTTCGTTGAGGAACTGT	\\\a^aaaa_]__^]]]`a`aa_a]_`\`a\_Y]_^	chr10.fa		5706709	F	36	119					
+HWUSI-EAS610	1	4	13	394	1405	0	1	TCTGCAACAGATGGAGACCATTACATAAAAGCACAG	abaabbbabaaa`aaa`a_ababbbbabbbaaaaaa	chr10.fa		5706748	F	36	67					
+HWUSI-EAS610	1	4	70	688	792	0	1	ATCTTGAGCTGATTTCTTTTGTGTTGTCATTGTTGT	ababbbababbabbaabbbbb`babbaa_bbbaaba	chr10.fa		5707055	F	36	119					
+HWUSI-EAS610	1	4	18	409	622	0	1	CACTTGGGACTTGCTCAGGAGGCTCATTGCCACAGT	]aa`babaa^a\abaaabbabaa_a_`Zaaa\Xa^Q	chr10.fa		5707393	F	36	119					
+HWUSI-EAS610	1	4	26	551	995	0	1	GATTTAATGGGTTGTCATGGAAAAGTCTGCAATTCC	aa]aaaa_RSU]W`^Y]\aWVQ\aZKX[WZX\^a^X	chr10.fa		5708115	F	36	118					
+HWUSI-EAS610	1	4	51	1142	881	0	1	GCAACAGGTGTTCACCTGTAGTAACCATGTCTGAAA	aaba[aaaZaa_\a`Ob\O____a^`aa_]_ba_ab	chr10.fa		5708436	F	36	119					
+HWUSI-EAS610	1	4	61	1788	866	0	1	GTGTTGGACTCAGAAGGTCCTTCTTCTATAGTGATT	aaaXa^[]```Z]Y`^YP__a`_aa__`__R[]_`^	chr10.fa		5708826	F	36	119					
+HWUSI-EAS610	1	4	58	707	867	0	1	CCAATTGCTAGACAACCCTCAGTTTAGTGCAGAGAG	abbbb_bababaabb`aaa`aaaaa``]aa_`\a`a	chr10.fa		5709021	R	36	119					
+HWUSI-EAS610	1	4	30	925	832	0	1	ACTAAACTGAGGGTTGTCTAGCAATTGGACAGGCAC	a_a`aa]a^U_a`VZa]_V^_\U\]_]``_^__ZUZ	chr10.fa		5709029	F	36	119					
+HWUSI-EAS610	1	4	71	560	1692	0	1	AGGAATTTAGTATACAAGCCAAGGAGATCCTTGTTT	\Y^`baaab`ab^\^b`\`bb\bba`ababba_bb`	chr10.fa		5709139	R	36	119					
+HWUSI-EAS610	1	4	59	613	139	0	1	AATTTCAGCAAAAGAGGGACTGAACCTTTCCAGCAG	W^bbabbbbb````abaa`abb`abZbbbaaabb_Z	chr10.fa		5709501	F	36	119					
+HWUSI-EAS610	1	4	54	961	275	0	1	GCAAGCATTTCCCAGCATCCACAATAGCATCCGGGT	a`aa____a_^_]`___[__^V_^\\VY\^XZZ__S	chr10.fa		5709741	R	36	16					
+HWUSI-EAS610	1	4	89	89	203	0	1	GGACGTCAGTGAGAGGAGCAGCCCTTTGGCCTGAGA	aa__aSa_aKaaaaaa[_aaa\a`\^[a_Za^`\_T	chr10.fa		5710062	F	36	34					
+HWUSI-EAS610	1	4	64	471	1958	0	1	AACCAAGGTGCCCTTAGAGGTCTTGGTAACCTGCCA	XU[`aX`aU]]a^__WRUZYZ`a`_SPV^_^^VMUZ	chr10.fa		5710530	F	36	118					
+HWUSI-EAS610	1	4	24	981	1443	0	1	CTTGGTCAGACTTGGCAGGTTACCAAGACCTCTAAG	abab`V_XWW^b\_a`X`^ab`T`[]_Y]^[X_Y_a	chr10.fa		5710542	R	36	119					
+HWUSI-EAS610	1	4	64	1450	331	0	1	TTCCAGCCTTCCTGGATCGATGCCAAGGGCCCAAAT	`^^aZNN\__OP^VRY`^ZVUMP\STGMYUUYUUMY	chr10.fa		5710604	F	36	116					
+HWUSI-EAS610	1	4	68	1716	1001	0	1	GCCAAGGGCCCAAATGTGTGAAATCCTAGCCTGTCA	_aaba`Z]__a_aab^Za`abaaaa_aa`a^````a	chr10.fa		5710625	F	36	119					
+HWUSI-EAS610	1	4	56	1020	428	0	1	CCTCCAAGAGGAGAGGATATTTGAGATAAATCTTAA	aaaaaa_b````a_`aaa`abaa]V^a`aa`\a`aa	chr10.fa		5710755	R	36	119					
+HWUSI-EAS610	1	4	74	1052	1338	0	1	TGACTTTCAAATTCAAGTTATGAAATCTGGAACAAG	ab`_ab`^^V\a`[^X`]a__\W^W^R]a`Y_X^`a	chr10.fa		5711678	F	36	119					
+HWUSI-EAS610	1	4	95	743	1361	0	1	GGCGAATAAGGAACACAAGTGAGATCAAGGGGGTGA	aaab``aa_aa^`aa_a^_[a`a``_Z^aa``YT`\	chr10.fa		5712289	F	36	119					
+HWUSI-EAS610	1	4	7	1570	1167	0	1	AGGCAAACTGACAGCCAGTGAGTCCTGAAAGCTGGA	aZQV_aZNRP\U^[\Q_PP_W^W\VW\XS\UUQ\US	chr10.fa		5712531	F	36	118					
+HWUSI-EAS610	1	4	91	1400	645	0	1	ACTCAGCAAAGCAGTCTCAGCTGTGAAGAGTCAAAA	aab`a`aa``^`a_[_a`a[aaa^`_`]_a\__`aa	chr10.fa		5712748	F	36	119					
+HWUSI-EAS610	1	4	45	290	1781	0	1	TTGATCAAGTCTCACGGCGCATTGAGAGATTTATCT	aa_`^^Y\babbaaaaa`bb`Xaa^aa`_a`aaaa]	chr10.fa		5712814	R	36	119					
+HWUSI-EAS610	1	4	74	1438	584	0	1	GACTTCAGAACTTATCTTCCTGAAACTCGTTTTCCT	`aaabaaaaaa___a]`aaaaa^O[`a`^_`a`aaa	chr10.fa		5712919	F	36	119					
+HWUSI-EAS610	1	4	72	1137	515	0	1	GTCAAAACTCAGCGGCTGACGATAACAAAGAATAGG	V^`b]\`aaL]^_aV^a`T`_W[[`\XJTGJX_^YZ	chr10.fa		5713150	R	36	117					
+HWUSI-EAS610	1	4	44	319	700	0	1	GGGGAGAAGAGGGTCAAGGTAAGCCTCCCTGAGAAG	ab_bab]bbaaab[aa_aaWb`_aa]`a]_aZa\\a	chr10.fa		5713706	R	36	119					
+HWUSI-EAS610	1	4	52	1641	1539	0	1	TAAAGTTTTAACCTTCCAACCGGCCTTTCACATCCC	aab]``aaaaa__aa`Y`aaa^_`]__`_`X^]^`]	chr10.fa		5714154	F	36	119					
+HWUSI-EAS610	1	4	33	752	1687	0	1	CGCCTCTGCTTCCAGACCATTGGCAGTGACAGAAGC	abbbbabbbabababZaaaabbaaaaKQVVUZBBBB	chr10.fa		5714357	F	33T2	99					
+HWUSI-EAS610	1	4	90	1328	588	0	1	GTTGGGGGAAAGATTGCATCTGTCACTGCCAATGGT	aWa____^X^_]Z^_ZX__^_^\W`\__\WWW\]\W	chr10.fa		5714372	R	36	119					
+HWUSI-EAS610	1	4	97	1039	1585	0	1	TGTGACAAAAATACAACAGCAACTTAAGGGACGGGG	abQ``X]`_aaaa`V^Z__`\SS`_Z[Za_]`QT^`	chr10.fa		5715467	F	36	119					
+HWUSI-EAS610	1	4	28	601	988	0	1	TGTCATGCTGGTAAAGGCAACAGAAGCTTGGAACCA	aa`_a`a``aa]`_[^``a_\Y[^Y^^`_^\U[^]_	chr10.fa		5715536	F	36	119					
+HWUSI-EAS610	1	4	51	1002	39	0	1	AATAGTTATCACAAATGTTGGTATCAGATTCAATAG	aabba`baaaabaaaaaab`[Z`a_abaaa]`aa_^	chr10.fa		5716180	F	36	119					
+HWUSI-EAS610	1	4	40	73	1149	0	1	CAGAATGTCAGGAATGCCAAGCAAGCGCACTATCTT	a^]\_ab_a``bbb`_a^PX[]`^a`[Z[\[`^`V]	chr10.fa		5716248	R	36	119					
+HWUSI-EAS610	1	4	6	879	1942	0	1	TGGGAAGTGGACCCAGACTCACATAAATGCCAGGGA	a``_LR_Xa`_[U^X_[__RY]S]_PW]^RKY[___	chr10.fa		5716765	R	36	118					
+HWUSI-EAS610	1	4	81	166	1342	0	1	TGTTGACCTCGGAGATAAAGGAAATAGATCATCAGT	ababaabbabbbabaa]PZbbaaab^aa`aaaaab_	chr10.fa		5717418	F	36	119					
+HWUSI-EAS610	1	4	51	1770	361	0	1	TGTTTGTGAGCTGCCCAACATGGATACTGGATCTGA	^Yb_YMYS[P[__]aaba]abZJW^aWXTXZ[\^^a	chr10.fa		5717629	R	36	118					
+HWUSI-EAS610	1	4	40	741	151	0	1	CCGCAGCAAAGAAACCTCTCCAACTATAGTTGAGAG	a_U_a`aa`]\_aa`]]\X`a_a_a``VLX^VBBBB	chr10.fa		5718777	R	36	101					
+HWUSI-EAS610	1	4	28	1175	1664	0	1	ACTGCTGCCCGCAGCAAAGAAACCTCTCCAACTATA	aaa_]aa^[]`\``^`_`````[R\^]]Z[\\\Y^Z	chr10.fa		5718785	R	36	119					
+HWUSI-EAS610	1	4	33	1234	1385	0	1	TTTCAGCTTTTACACACACCTCTTTATCCAAGTTCC	abba^V\abaaa_aaa_a^aa_aa_^a]]a`a]_\a	chr10.fa		5718901	R	36	119					
+HWUSI-EAS610	1	4	75	58	789	0	1	TGAAACAAAAACAGAAAAAAAAGGCTGCAGCATAAC	ab[`abbb`aabbb[a`[T^`a`aa`aa_aaa`]_`	chr10.fa		5719553	F	36	119					
+HWUSI-EAS610	1	4	82	1065	1866	0	1	ATATAAAGACTAGACTCTGTACACAGAAACACAGTG	aa`a``_aW[a_`]^a`_a^``a^`__`_]^_`^X`	chr10.fa		5719620	F	36	119					
+HWUSI-EAS610	1	4	18	500	1115	0	1	ATAGTACAGATGTGTTATATGTGCGTTTGTGCGCAT	K_`a`a`ba`bb^bV_aa]a^[aaXab`_W`_`baW	chr10.fa		5719845	F	11A24	80					
+HWUSI-EAS610	1	4	37	249	767	0	1	AGAGAATGGCACATTGCCTCTGTGTCCCTTGTGCTC	[_`]XZRYYa`][___`^R^_`U_\^_^^SRJZ`WX	chr10.fa		5720709	F	36	118					
+HWUSI-EAS610	1	4	5	374	839	0	1	GAGCACAAGGGACACAGAGGCAATGTGCCATTCTCT	a\a_YS^PL[TZS^]H]_[U`Y^^YGYZ[SSW[\__	chr10.fa		5720709	R	36	116					
+HWUSI-EAS610	1	4	38	315	634	0	1	TAAAAACAGCAACGCCTTTTCTCATCATTTATTCGA	abaa`a`bbbbbbbaaaaaaaaaaa`Z`aaabaaba	chr10.fa		5720826	F	36	119					
+HWUSI-EAS610	1	4	12	1144	663	0	1	GCCAGCGAGGTAAACAGCAGCCCCGCCAGGCCTGCA	_^^a^`^\RWSa^`R^VZ]Z\Z][RSTRNTSRRSST	chr10.fa		5721070	F	6A29	83					
+HWUSI-EAS610	1	4	2	200	386	0	1	GGCCTGCACGGCCCTCCCACTCTTCCCTCCCTCAGA	aa`aaaaa`aa^aaaa````aa```^`a``]^_`]`	chr10.fa		5721098	F	36	119					
+HWUSI-EAS610	1	4	57	706	1588	0	1	CACGCAGAACACATGTCTTTAAATCACTCCAGCAAC	aaaaa_aa`_^\`ab\ab`ba`aa_]aa`__a`^`a	chr10.fa		5721246	R	36	119					
+HWUSI-EAS610	1	4	51	45	1035	0	1	TTTGCTTCTACTTGAGAATTTCAAGTCTCTACAAAA	a\]`]\a`[H^WZ^bZMOV^`]SX_\\[XXX[W[NS	chr10.fa		5721314	R	36	117					
+HWUSI-EAS610	1	4	40	1006	1878	0	1	AGCAAAAGATCATTAACACTTTGGTAGACAAGAGCA	a_baaaab`a`abbabaa`bbaaa^aaa``Za`a_a	chr10.fa		5721344	F	36	119					
+HWUSI-EAS610	1	4	79	775	1609	0	1	GCATAAACTAATGTCAGTCTCTAGTTCAATCAGCCA	\baba^a_b[[bba_ab_abab`baaa_a^____`\	chr10.fa		5721673	F	36	119					
+HWUSI-EAS610	1	4	58	849	264	0	1	GGTACCAATAGGAATAGAGGTGTGTCTCAAATGGAG	aa``aaa_a`aa^aa]a_bb^^^a_a`___]a`_Va	chr10.fa		5721884	F	36	119					
+HWUSI-EAS610	1	4	77	501	644	0	1	CAGCTGCACTGCAGAGGGAAGGATGAGCCACAACAT	`^`]aa]a_aa`]]`_Z`\`aaa`_V_Y^`^]KQ^\	chr10.fa		5722013	R	36	118					
+HWUSI-EAS610	1	4	28	1325	213	0	1	ATAAAGCCGCACGAAGAAGCTCAGACTCAGTGCCCA	a]Xa_\__`_\_]_\]]a_``]_X[U_^^_Q\_TT_	chr10.fa		5722606	F	36	119					
+HWUSI-EAS610	1	4	19	1705	215	0	1	TGCAGGTTCTTCCCAAGTTCAAGCCTTATCATGGAC	aaaaY]W]a`aa`aaaa]aa_a_`__[`][`ZYV^a	chr10.fa		5722867	F	36	119					
+HWUSI-EAS610	1	4	19	1157	1718	0	1	AAGTCCATGATAAGGCTTGAACTTGGGAAGAACCTG	aabab``aa`b__aa_aaa^a`aa`Z__`a_a_]]a	chr10.fa		5722869	R	36	119					
+HWUSI-EAS610	1	4	4	258	1734	0	1	TGGATATGAAGTACCCATCCAGGGCTCATGGCTTAA	]ba`^T`ba`a]baa``_aa`aYba`a^`aa``aa[	chr10.fa		5723061	F	36	119					
+HWUSI-EAS610	1	4	69	1687	1113	0	1	TTAGCATGGAGCCCACCTGTGGGTCTGCTTCCTCCC	_a`[a`\OQVX```]][^`Z]Z]RZ\YZ\^Z[Z]]\	chr10.fa		5723685	R	36	118					
+HWUSI-EAS610	1	4	36	696	1297	0	1	CAACAACCAACCAACCAACCAACCACCAACCAACCA	aaabaa``aa__ab`aaaaaaa__a___a```a]__	chr10.fa		5723952	R	36	30					
+HWUSI-EAS610	1	4	94	310	1227	0	1	GAAGATGGCTTTGCGGCTAAAGGCCTTGTCACACAG	a\aa_`aa^]^_\a_``]YXJNPV^\VZZ[NU\YU\	chr10.fa		5724223	F	36	118					
+HWUSI-EAS610	1	4	5	1535	1940	0	1	TGGGCTCCAGGGGCCAGGCCACCTCTGCTTCTTAGT	a`a_^\aU`a\^`\Z``^\Z`N]RPZ^PSYTZRX\R	chr10.fa		5724318	R	36	118					
+HWUSI-EAS610	1	4	74	443	2028	0	1	TGGCAACCTACTTTGCACATTGCAATCCCCATCAAG	_b`_\aababbba`babbaaaabb_abbbba_a^Ua	chr10.fa		5724744	F	36	119					
+HWUSI-EAS610	1	4	48	942	352	0	1	AACAACGTGTCCTTCATCTTGATGGGGATTGCAATG	_`aaY^aOa_\_`a_\a_bbbaaa``a[`]\]`]]B	chr10.fa		5724761	R	36	114					
+HWUSI-EAS610	1	4	81	1677	1795	0	1	GCAGCTATTTGCCAACTCCATGTTGGCAGCTGGTTT	aa``H_^`^`X\__^Q[___a_V_IVYUXNWZ]Z\a	chr10.fa		5724859	R	36	117					
+HWUSI-EAS610	1	4	69	1140	680	0	1	CTTATTAGTTTAGACAGTTAGGGTTCTAATCCCACT	U_aV_`Xabbbb^abX_HY\X\b\_a`_baa`\I_`	chr10.fa		5724990	R	36	117					
+HWUSI-EAS610	1	4	48	680	1577	0	1	GAGGAGCTGGGGGCGTGGGGGAGTGGGTATGTGCTC	TKa`\``ZZ^_`WDTUaZ`[YQTJN^[DW^\WRNTB	chr10.fa		5725029	F	13T22	102					
+HWUSI-EAS610	1	4	16	1639	195	0	1	TTGAAGGTTAACATGATATTTACAAGCCAGAGGACG	aaabaa[Y_aa_b`^a``aa`a^aaZa``^_XP`Z_	chr10.fa		5725539	F	36	119					
+HWUSI-EAS610	1	4	72	117	317	0	1	CGACTGGTGTCCACAATACATGTGAAATGACTTTTC	^_V]]W_^b`Z^b_]VOVVU^_R_]`a^aaV\^_P\	chr10.fa		5725785	F	36	118					
+HWUSI-EAS610	1	4	31	1383	734	0	1	ATGACTTTTCGCCTGCTTACATGGGCATACATTCTT	ab`_\^__a_`^_W]^]^_\_ZXV^]^^_Z^_]Z^^	chr10.fa		5725811	F	36	119					
+HWUSI-EAS610	1	4	1	1250	391	0	1	TGGGCATACATTCTTTTACAAAGCTTCCACTGTCCC	a[X\^]Z`O[b_^]aba]O`a[_`a_W\]^a\VYX\	chr10.fa		5725832	F	36	118					
+HWUSI-EAS610	1	4	5	1326	105	0	1	GCAGTAGAAGAAAAGGGTCATAACGTCGAAGAAGGG	aa`^^a___[`_`_QXSW]a```][XZUZ^Z^]^Y^	chr10.fa		5726011	F	36	119					
+HWUSI-EAS610	1	4	66	471	1034	0	1	TTCTTCCCACCCCTTCCCCTACAATTTTCCTTCCCA	abaaaaaaaaaaaaaaa^a]aaa`aaaa_aa`a`[S	chr10.fa		5726294	R	36	119					
+HWUSI-EAS610	1	4	98	1778	1556	0	1	GATTGGCTGCTGTTGAGCAGAACTGGACTGTGGACG	]`aZaaM^^JYZY^]XXZaaX`\[VTZNV^PS`^X_	chr10.fa		5727485	F	36	118					
+HWUSI-EAS610	1	4	97	94	373	0	1	ACTCAGGATTCCATTATATAATCTACCATAAATCCT	``]``aa``aaa`a`aaa``]^aaa``a_```_`a\	chr10.fa		5727713	F	5A30	81					
+HWUSI-EAS610	1	4	26	1097	926	0	1	CAGAAAATACTTCTCCTCTGAGAATAGGTTTGATAA	`[[`abbbb`ab`b`ababaaaU\baa__aaa^a``	chr10.fa		5728006	F	36	119					
+HWUSI-EAS610	1	4	80	365	242	0	1	AAGGAGACTGAGGGCCTGTCTCATCGGAACACAAAT	_X_a__^``_^^^___a_^\\__\^_`\\____\WU	chr10.fa		5728366	F	36	119					
+HWUSI-EAS610	1	4	31	1096	1449	0	1	GTGAAGTCTGAAAATGGACTAGAGGGAAGGACACCA	aaba]]``aaaa_aaa`a`a_a^`a_`___`W_]_a	chr10.fa		5728626	F	36	119					
+HWUSI-EAS610	1	4	42	1574	188	0	1	GTAGGTGCCTGTCTGGGAGTACAAGATAGCTGATGC	`_a^WY^`_``Z^XVX]a`S`[`RO[^`Y[`__^^]	chr10.fa		5729309	R	36	119					
+HWUSI-EAS610	1	4	29	1669	817	0	1	GACCTCAGTGCTGGTACTGAGTCACGCTTCTGCGCC	_a`aaaaS`aX^[S\R[aa^\\aa\`a^W``Q`G_^	chr10.fa		5729411	R	36	118					
+HWUSI-EAS610	1	4	91	1759	1188	0	1	CAGCACTGAGGTCATACCCAGTATGCCAGGCCTTCA	aa^ababaaY]aabaabaaab`_TP`aaP^``_^`a	chr10.fa		5729434	F	36	119					
+HWUSI-EAS610	1	4	12	1384	1338	0	1	GTGCAATTATTTGCAATTTATACACACTTGTCAAAT	aa[`TU]N_UYXWMGNX`aW`]N_^UPZ[ZZHZ_Xa	chr10.fa		5729548	R	36	116					
+HWUSI-EAS610	1	4	92	1736	1114	0	1	GCATAGGTGTGTCTGTCTGTATGTATGTTCACTCCT	W_aa[ab]a_`_`aaaa]I_aa]_aa``__aM\^aa	chr10.fa		5729804	F	36	118					
+HWUSI-EAS610	1	4	14	1362	931	0	1	CAGCTACTTGGGAGGCTGAGGCAGGAGAATCGCTTG	_^`]]\Z_ZOX_WW^O_\]_T\_XXXW_``U_[`BB	chr10.fa		5729992	R	9A21A2A1	15					
+HWUSI-EAS610	1	4	65	676	1775	0	1	CAGCTACTTGGGAGGCTGAGGCAGGAGAATCCCTTG	aaaaaZX]a`^SV`^`a_^\ZY`a`\_X^`^\]\]\	chr10.fa		5729992	R	9A21A2A1	14					
+HWUSI-EAS610	1	4	6	173	172	0	1	AGTGATTCTCCTGCCTCAGCCTCCCAAGTAGCTGGG	aaYbaaaaaaa`a`Z`abaa``aaa`aa]``a]aaa	chr10.fa		5729994	F	24T11	32					
+HWUSI-EAS610	1	4	88	956	762	0	1	AGTGATTCTCCTGCTTCAGCCTCCCAAGTAGCTGGG	a`^a_aa\````a^_a_`]__a``_]^`\_^\W^W\	chr10.fa		5729994	F	14C9T11	23					
+HWUSI-EAS610	1	4	64	1066	1141	0	1	GTGCAAGCCTCCAACCCCAGCTACTTAGGAGGCTGA	^`b`\X\RR[^T_UXR`ZHXWXW^aa]TJPY[TRXB	chr10.fa		5730009	R	10T25	78					
+HWUSI-EAS610	1	4	93	926	1047	0	1	TGTCAGACCAACTCCTGATCCCCCAAGGTGATTGTC	ab`_``a_]]a`a^`aa`aa```[````Wa_`a`X^	chr10.fa		5730408	F	36	119					
+HWUSI-EAS610	1	4	83	122	1512	0	1	TGGGGGTAGAAGACGCTAATCCAAGGAAAGAGACAA	abbbab_ababbabba```abb`[ab_`\_aa^aaa	chr10.fa		5730439	R	36	119					
+HWUSI-EAS610	1	4	79	1347	1431	0	1	GCAATGGATGTGTTTGATTGAACATGATGCATTCTT	`__`abaS[_X[^_X_S__a_^_]_^V]T]UX[P_^	chr10.fa		5730725	R	36	119					
+HWUSI-EAS610	1	4	20	1275	947	0	1	TGGTGGCATTCCAGGTTCTTTTTTCTGTCTTTTGAT	aa__ba`^_\\`^aa]aaaabaaa\b]_^aaaaaX^	chr10.fa		5731459	R	36	119					
+HWUSI-EAS610	1	4	57	627	1720	0	1	TGGTTGGTAGCCCTGGTAACTGTCCTTCTCTGGAGT	abb^ba\_b`aaa_aaY`__aa`_aX[a`^_]_N]\	chr10.fa		5731494	R	36	119					
+HWUSI-EAS610	1	4	46	269	1216	0	1	GACAAGCCTTGGGGGAACCTCAAGTTGTGCAAGGTC	abbb]abbaaabbaa]aab^`Z^baba^`aabaa^a	chr10.fa		5731545	R	36	119					
+HWUSI-EAS610	1	4	11	878	796	0	1	TTGGAGTATCAATGTGACTTGGGGGATGTCCTCTGG	a^]U_`^a[^Z]_`][][a`aa`_[```^\__N_^^	chr10.fa		5731863	R	36	119					
+HWUSI-EAS610	1	4	25	1103	758	0	1	CACATTGATACTCCAAGGAAGAGATTATAGACTACT	aaabb`aaabaaaab\Z_^aa\a^aaa_a\\__]]a	chr10.fa		5731883	F	36	119					
+HWUSI-EAS610	1	4	14	642	693	0	1	ATGGGGGTAATGATGAGATATTGGAAGTAGTCTATA	abbbbbb^baababb]aaa`aaabaa_Zaa\^_\^a	chr10.fa		5731908	R	36	119					
+HWUSI-EAS610	1	4	11	160	1275	0	1	GCTGTAGAGAAAAACAGACGAGAGAGAAGGACCACT	aaaaZZaX`a`Y^S^`aX_a_a``_a______a`a^	chr10.fa		5732590	R	36	119					
+HWUSI-EAS610	1	4	72	120	380	0	1	CATGGGTAAGAAGGCGCATCTCTGCCCCGTCTCAGT	aab_bb_abaaa_bbabZa`aaQaaaa`^Ma_`]aS	chr10.fa		5732715	R	36	119					
+HWUSI-EAS610	1	4	74	1107	1957	0	1	GTAAAGGCCCCAGAGCATTAGCTTTGCTGCAATGAC	a_a``\Q_a_\\^U^_a`a`\__TY_^_\[S[VX^Z	chr10.fa		5732881	R	36	119					
+HWUSI-EAS610	1	4	98	930	1287	0	1	GCCACCCGTTTCCTGTAGTGGAAAGTCTCATGCTTG	`Z[\[[Wa\]Z[W`a_`aV[_S[Z_U^W\^S`QW_[	chr10.fa		5733585	R	36	118					
+HWUSI-EAS610	1	4	79	138	1647	0	1	AAAGCCCCAAAGCAAACAGGACTTGTAAATCACGGC	_I[[[baa_[aaa]`ab[[Yaab^XSO\[Ya`___a	chr10.fa		5735077	R	36	118					
+HWUSI-EAS610	1	4	28	1104	965	0	1	GTCTGAAATGCAGAGTGAGACCTTGTCTCAACAAAA	]R^WR^Z]V\Xaa`a]bZ^]a\a\`TW`^[_SS\T]	chr10.fa		5735127	R	36	118					
+HWUSI-EAS610	1	4	19	180	829	0	1	AAAATTAGAGGTCTGTGGATCAGAGGTAATGTGTTT	aa`babbbbbbabab^bbaab\a]bb]aaaa_a_aa	chr10.fa		5735392	R	36	119					
+HWUSI-EAS610	1	4	17	5	621	0	1	TTTTATCAAGTTTAACGTTCCCTAATTTGAAAAAAA	^aa^R`_WXb]aa`^`b`W^F[]Z]GZ`[V\RF]aB	chr10.fa		5735879	R	20G11T3	92					
+HWUSI-EAS610	1	4	70	1767	307	0	1	ATTTTGTTGACTCACTTACCTTTCACAGGAAATCAT	aabaaa`__a`_a_a_aa`b_^]a__`IU`_aZ`ba	chr10.fa		5735985	R	36	118					
+HWUSI-EAS610	1	4	84	1217	382	0	1	AAGGTAAGTGAGTCAACAAAATGTTTTGAATAGTTC	aa_bUa_b^_```aa__aaaaaa_aaa\a`aa_`a_	chr10.fa		5735999	F	36	119					
+HWUSI-EAS610	1	4	34	414	684	0	1	CACAATCCAGAGAAGAAAATTACCTAGGGCAGGGGT	aaab`ab__a_a_`a\aaa`aa`_aaaa_a^``^aX	chr10.fa		5736155	F	36	119					
+HWUSI-EAS610	1	4	72	893	834	0	1	AGATTCGGAAGCAAGTGTACATTATTTCTTTGTTGT	aaX[_`aa_aa_a]\\`\`^``a_a``[`a_a]`a_	chr10.fa		5736212	F	36	119					
+HWUSI-EAS610	1	4	31	268	453	0	1	CAGGCACACAGAAGTAAGTGGGTACATGACTGCAGA	aaaaaaaJ[aba_aY```M`a]LZ]]YZZ_`V^]]\	chr10.fa		5736270	F	36	118					
+HWUSI-EAS610	1	4	5	480	1912	0	1	TGTGGAGAGCAACAGAGAAGCACAGCAGTGTCTTGC	a]X`ab_]abab^baa]^[aa__a__aa]`P^_`__	chr10.fa		5736313	R	36	119					
+HWUSI-EAS610	1	4	47	963	437	0	1	AGAAGACCAGGGAGAAGGCTCAGTTGATAAGACTGC	abbaaa^__aaa_aa^aa``__a^_`aa_a`a]`a^	chr10.fa		5736679	R	36	119					
+HWUSI-EAS610	1	4	70	1379	1097	0	1	TGAGCCTTCTCCCTGGTCTTCTACGCCCTTTTCTTT	ab\aaaaa_``__`X`Z\_aaaa`a_Z_`a``Zaaa	chr10.fa		5736693	F	36	119					
+HWUSI-EAS610	1	4	93	673	948	0	1	GTTCGCAATCTCAGCATCTCACGGTCTCCTTGCCAG	a^a__]`a`]I]`\^___`]X]aVV\a^\S\]S\\\	chr10.fa		5736926	R	36	118					
+HWUSI-EAS610	1	4	82	1361	691	0	1	CAAGGAGACCGTGAGATGCTGAGATTGCGAACACAC	`bbZabbaaZbaaaZaaba`a`W[aaZ`aa^Ja_b^	chr10.fa		5736930	F	36	118					
+HWUSI-EAS610	1	4	68	349	48	0	1	TAGAGCCAGTATTCAAATTCAGGGGTCCAAGTCAAG	a[aX]`^`MODWa_PTX___YaaaaO\_`Y_U_ZV]	chr10.fa		5736972	F	36	116					
+HWUSI-EAS610	1	4	57	1529	1525	0	1	TGATAGATTAGATGCTTTTTTTTGTTTTTTGTTTTG	`aY]aaT^^Z_^Z]_Uaabba`_`MZa```aT`aaa	chr10.fa		5737515	R	36	119					
+HWUSI-EAS610	1	4	5	1119	1512	0	1	CAGTGCTCAGTGGAAGCATCTTGCTTAATACGGACA	abbabaaaab^YW]U_Kab___[[aaa]a_`]a`aa	chr10.fa		5738013	R	36	118					
+HWUSI-EAS610	1	4	31	997	1175	0	1	GGTCAGGGCCTCTTTGCTATTTTCAGGTAGGAGATC	_a`a`aaX[^a[aa_b^^R_a\[NR_aU_a`\a\\[	chr10.fa		5738133	R	36	119					
+HWUSI-EAS610	1	4	94	736	370	0	1	CAGGCAACAGCAACCACGGACAGGACAATTTCTTTA	aaXabbaaaaa``abbabaa``bb`\aaaba\_aba	chr10.fa		5738188	R	36	119					
+HWUSI-EAS610	1	4	5	779	262	0	1	TGCTGTAGAAGTTTTCCCTGCAAGCTCATGTGTGGC	aa_ab_aa`_a``aa\Z]`aaaaa_a_`^a\[W_a\	chr10.fa		5738328	F	36	119					
+HWUSI-EAS610	1	4	11	449	36	0	1	CCATTGGCCCAACAGCACTAGTGAATTCTGAGAGAA	aa``]^aa^aab`_^a^_]]^W`^^[^V___RWaT\	chr10.fa		5739201	F	36	119					
+HWUSI-EAS610	1	4	27	1750	783	0	1	CACAGGTAGATCGCTCCAGCTCACTGGCCAGCAGAG	aa\`]\F^V\Z]N\Y_[YN]Z\^WPPVXZBBBBBBB	chr10.fa		5739386	F	36	87					
+HWUSI-EAS610	1	4	66	1001	1892	0	1	AGCTCTGCTGGCCAGTGAGCTGGAGCGATCTACCTG	_Z`^^^SX[Z\KRZ\S\T\SSZUNSPZBBBBBBBBB	chr10.fa		5739388	R	36	79					
+HWUSI-EAS610	1	4	33	722	1241	0	1	GTTTATGTGGGCCAGTCTCCTTCAGACCACCATAGG	a_aaaaa]X``_`aa____^a_aQ]_\__W\_`_`]	chr10.fa		5739443	R	36	119					
+HWUSI-EAS610	1	4	58	330	627	0	1	GTTTGTCTTACTTATTTTCCTATTGTGTGAATAGAC	aaabbaabaaaaaabaaaaaa`abaab^_baaa^^a	chr10.fa		5740030	R	36	119					
+HWUSI-EAS610	1	4	80	1502	1295	0	1	GGGTGAAGAGAGCAAACCAGTGGAGTACAGGGGGGT	J`aZ]X]aTYHULR^TXa_a^ZLU`[Z]^a]\G^TQ	chr10.fa		5740376	R	32T3	105					
+HWUSI-EAS610	1	4	39	393	1007	0	1	CACATATGTCATTTCTTCACGATTTGTAAAAACCTC	\b\_a\a\Mabba^bab^`bb\baVbSba^^ab_ba	chr10.fa		5740603	F	36	119					
+HWUSI-EAS610	1	4	26	556	1429	0	1	GGCCTGAACAGAAAGGATTACAGTATCAGAAAGTTT	Y]_[_WV[Y^^Va\a^ZSVaY_^]\`^S]Q[WHF^_	chr10.fa		5740887	F	36	117					
+HWUSI-EAS610	1	4	50	1054	654	0	1	TGGAGTCACAAACCCTCACAGAGATATCTTCCCCTC	abb]G\_aaaaa]X^aa__aa`a``a`[^_[Z_Y`_	chr10.fa		5740941	R	36	118					
+HWUSI-EAS610	1	4	78	680	361	0	1	CAGTGCTTTCAGAAGGCACTGAAAAGGGCAGAGTCT	abba``bbbbbbabbabbbbbabbabaaa`b`a\ab	chr10.fa		5741606	F	36	119					
+HWUSI-EAS610	1	4	75	298	223	0	1	GGGAGATGACACCGACACAGGCATGGGGCAATGTCC	__aZZ[]`a``aa_`^``[`]\]]`^\^]^^^]RZ[	chr10.fa		5741785	F	36	119					
+HWUSI-EAS610	1	4	18	660	350	0	1	AGGCATGGGGCAATGTCCAGGATTCTCTTAGTTGTT	``aY\`a_a`\X__Y]aa\]_Za`_a_aV`a_`aXa	chr10.fa		5741803	F	36	119					
+HWUSI-EAS610	1	4	5	253	1141	0	1	TTCCACCCACTCATACTCAGGTGTCTATGCTGCCTC	aa_]]__b`bbbb`]aXXWZZ]b]`b[[bX^^bbb^	chr10.fa		5741849	F	36	119					
+HWUSI-EAS610	1	4	35	933	1371	0	1	AAAGCTGTGCCCAGGCAGGGCTAGGACCAATGCATC	aabaa`a`aaa_aaaa`a^aa`^aaZ^`\^`a__`Y	chr10.fa		5741968	F	36	119					
+HWUSI-EAS610	1	4	45	824	768	0	1	GGGGGGTGGGGGGAGCAGTGGTGCTCGTGTTTAAGG	_\\Y^[S_`P]ZWZZZ^UNZZN[T^S\G[TRRSZ^[	chr10.fa		5742030	F	36	117					
+HWUSI-EAS610	1	4	64	456	803	0	1	ATATGTGAGGTATAAGTGAGTGTCCTCCCTGTCTCT	Ua[`babbb`aabbaaab]b_a``baaaaaa\aaaa	chr10.fa		5742895	R	36	119					
+HWUSI-EAS610	1	4	47	1536	952	0	1	TCAGTATGATGGAGCTCGTAAGAAGAGACAGGAGCG	abb``a`Wa`aa``^a`^_`aa_\\_\_[`Z^^^_`	chr10.fa		5742963	R	36	119					
+HWUSI-EAS610	1	4	21	228	478	0	1	CTCCATCATACTGATCTCCTCCTAACACCTCCTGAT	aabbaaba_bb`aaaaaaaaba`aaaa`aaaaaa__	chr10.fa		5742985	F	36	119					
+HWUSI-EAS610	1	4	5	1122	2027	0	1	ACCTCCTGATGCCATCCCGTCATAACTCATAATTTC	aaaZ]```Y]ULR^V^^W\VV^\\`Z]^[^`[_^]\	chr10.fa		5743011	F	36	118					
+HWUSI-EAS610	1	4	29	1045	423	0	1	AATTTCAACATATGACTTTAGGAAGGACCCTAGCAT	O[bbbbabbbbbba`bbbbbb^bb`\bbbababbbb	chr10.fa		5743041	F	36	119					
+HWUSI-EAS610	1	4	16	775	1289	0	1	GGGTTCATTTGAAAGGCAGAGCCAACATGATTGCTG	aaaUaLD[a`aaa`a__aUYRaUP[_VaXT]\ZH^_	chr10.fa		5743156	F	36	115					
+HWUSI-EAS610	1	4	82	279	736	0	1	TTGGGGTTCTTAGGTATGCAGGTGGTATGCTGAAGT	^aa[_aaa`TRW_a^M^ba_b[]]aWUa[bQGV\BB	chr10.fa		5743430	F	36	109					
+HWUSI-EAS610	1	4	40	1425	511	0	1	AAGCCAACATGAGTTCTTTTCAGTAAGGGCCATGCC	aa^``a_]a`Z^aX`_aaa`__]V_`XQNX]`ZWV]	chr10.fa		5743741	F	36	118					
+HWUSI-EAS610	1	4	11	1239	733	0	1	GATCCCACTGTGTGCAACCACAGCCAGCAGGCATGG	aaa`T`^\`\\\Y^\\a\[`\^^X\\ZW]NXZ^XQS	chr10.fa		5743770	R	36	43					
+HWUSI-EAS610	1	4	49	1129	50	0	1	GCTGTGGTTGCACACAGTGGGATCAGCCTGCTGGCT	`a^a\T_``a`a\\_aaXaaa^^\``^]`\][U]\]	chr10.fa		5743782	F	36	34					
+HWUSI-EAS610	1	4	89	126	1998	0	1	GTGGTTGCACACAGTGGGGTCAGCCTGCTGGCTGGG	a^`a^`a^`````aX``_\Z`T`S^\`VPY`RP\BB	chr10.fa		5743818	F	34T1	31					
+HWUSI-EAS610	1	4	11	1447	1335	0	1	ATACATGTGCATACAGATAAAGTGTGGATCCTAAAT	_^[_\\HX^^]__US`[\\]^^UTW][VZVY^Z]YW	chr10.fa		5743978	R	36	118					
+HWUSI-EAS610	1	4	72	1770	950	0	1	AGGCAACATAGCTTCTTTTTCTGTTACTGTGATAAA	aN_abaY^aa[`_`[`a^a_]^^\^`_YTX__^a_Z	chr10.fa		5744295	F	36	119					
+HWUSI-EAS610	1	4	34	711	2011	0	1	CAGGGAGGAAGTCCTCATGGAGGGGAAGTCCTCAGG	_\a_X\_Q]VQT\`]VWVXZVTXXNSPUFXK]ZYTY	chr10.fa		5744463	F	36	18					
+HWUSI-EAS610	1	4	59	992	1176	0	1	GGAGGGGAAGTCCTCATGGAGGAAGTCCTCTGGAGG	__Z`aa^\^`^^Z_X`^``N^_ZT\S\XYTP]WN^`	chr10.fa		5744745	F	36	32					
+HWUSI-EAS610	1	4	73	1236	1537	0	1	GGAAGTCCTCATGGAGGCAAAGTCCTCATGGAGGGG	aa^]^\`[a`]`aa]W_`]XV\UY\_YY^_]U``__	chr10.fa		5745253	F	36	39					
+HWUSI-EAS610	1	4	84	145	1110	0	1	TGTGTGGGAGCCTTGCCTATGTGTATGCCTATGCAC	abababba_bb_Z]bbba_abaa`_`abbabaa`X`	chr10.fa		5745868	F	36	119					
+HWUSI-EAS610	1	4	57	1718	1651	0	1	TGATGCACAGCATCCATATGGCAGCTCACAACTATC	`[Xb]YNRY[WaaW^`YG^T^^Y^BBBBBBBBBBBB	chr10.fa		5745970	R	36	6					
+HWUSI-EAS610	1	4	61	579	1317	0	1	TGATGCACAGCATCCATATGGCAGCTCACAACTATC	]]_aaabbaS_aaa``^``a^^ababa`\Z]aa^a_	chr10.fa		5745970	R	36	54					
+HWUSI-EAS610	1	4	91	1337	1187	0	1	TTTGAAATACCCTTTAAAAGCCGAATACAGAACACT	a^SaYUZ_^V\WZ^`[SYN^T[_X_]_YWYXYXXX]	chr10.fa		5746611	R	36	118					
+HWUSI-EAS610	1	4	42	239	1463	0	1	TCCCTGAATTGGTGCCAGCAGTGGCAGGGCATGTCA	_baabb\Zbabb\a`aabaZa\\aaVaa`a\`]W^B	chr10.fa		5746770	R	36	115					
+HWUSI-EAS610	1	4	99	769	1677	0	1	GAGAATTCCCACTTTCCAGGAAGGGAAATCAAGGCA	a`bbaaV`^U`_Ya``Y]`Z\[`^___SNW\Y`^Y]	chr10.fa		5746893	F	36	119					
+HWUSI-EAS610	1	4	60	36	372	0	1	TGAGGATGTTCTTGATTACAGTCTCTCTAGTAATTT	a`Saaaabaaabb`[aa^a[b`bbbaa\Tb[[aa`a	chr10.fa		5747287	F	36	119					
+HWUSI-EAS610	1	4	8	1516	278	0	1	TGCTAATGAGCTGAGCCAACACACGGGCAGCCTCCT	a`ab^``HXY\]\ZP]^aa]a`a]LNE^\VMXST\U	chr10.fa		5747430	R	36	115					
+HWUSI-EAS610	1	4	15	44	78	0	1	TCTCTTGACCAGGATTTGCTAAGGANGCTCTCGTTC	ab`ba`baba`[_WRabbbaaabaYD^aa`_a]G[a	chr10.fa		5747655	R	25G10	109					
+HWUSI-EAS610	1	4	61	1102	1199	0	1	ACGACTGAAGGTACCGGGAGCAGGAGATGAAGGACT	`a`a`baaX`_S`_]`aa\`^^a]^_[]Y\]U^\^_	chr10.fa		5747916	R	36	119					
+HWUSI-EAS610	1	4	50	139	470	0	1	CCTGCTGCCATGCTCCCTGCCATGATGGCCGTAGAC	_aY\a__aV^```a[Xa`X[`UaU]\Z`a^UR`]V\	chr10.fa		5749070	R	36	35					
+HWUSI-EAS610	1	4	87	541	1376	0	1	ACCCCACACGCTCTTATATTCGAAGGTCTGTTTCCC	aa_aa`a_^_`^^^_Z]__\[aT[__Y^Y_[_``_]	chr10.fa		5749322	R	36	119					
+HWUSI-EAS610	1	4	63	651	1727	0	1	AGGCACTTTGCATTATGATGTGGCCATAAGCCTGTT	a^b`^_a\aa`a_aa`__`_^_a`_`_a_]^]_^]X	chr10.fa		5749399	R	36	119					
+HWUSI-EAS610	1	4	57	629	578	0	1	CTTCAGGAAATGGCTTCTCTAGGTTTCCTGTGGGCA	UY]]]ZY`TMMUNWSYHY[O[]^Y`[GWPMJ\`X`]	chr10.fa		5749872	F	34A1	79					
+HWUSI-EAS610	1	4	18	901	818	0	1	CCCACCCTGATCATCTAAAACTTGCAGAAAGGAAAC	abbbaaabaaa`aa_abba`abaa`aa`a`a_]aa^	chr10.fa		5750606	R	36	119					
+HWUSI-EAS610	1	4	7	914	358	0	1	CAGTTTAGGAGCCTGTACTAAGANAACCTCTTCTCC	_a_N_baa\_aa`ab_^aa__bSDY_[U_a_a``a_	chr10.fa		5751172	F	23C12	110					
+HWUSI-EAS610	1	4	11	1029	2024	0	1	AACCTCTTCTCCACCTCTGTAAAAAGCCCCAGCCCT	`aa`a^`_`[[X_W^WX^aW``_\_][_Z[_\U^VU	chr10.fa		5751196	F	36	119					
+HWUSI-EAS610	1	4	99	456	94	0	1	GTTTGGAGATACACATGCACACATATACGCTCATAC	a_aa`_]_a`Q_a_^`a^`Z_]`___`R_WXZ^]XX	chr10.fa		5751369	F	36	119					
+HWUSI-EAS610	1	4	22	1487	472	0	1	GGTGGCAGAGACAGCAGACTATGGGGTGAGGCAGCT	_`^a[aa[_``aa`a\a_aa^a___^F`^X\```^\	chr10.fa		5751463	R	36	118					
+HWUSI-EAS610	1	4	61	572	1675	0	1	TTTATCTTTGAGCCCTTTATCCTTTGCCCAAAAACG	aabaaabaaaa`aaaaaaaaaaa_aaa``a_a\_aa	chr10.fa		5751557	F	36	119					
+HWUSI-EAS610	1	4	76	1309	1732	0	1	CAATTGGTCTTCCCCATGGCTCTGGAAAAGCAGGCT	NbJ_aTZaaUbbaUabbabbab`abbaabbSaaa`b	chr10.fa		5751671	F	A35	100					
+HWUSI-EAS610	1	4	51	1380	1518	0	1	TGGGAATGTTTTTCTTTCTGTGGGAAGAGCTGGCTG	aaa`U^_bU_a_`\_`a_a`]`]\X\_]]Y^]^WW[	chr10.fa		5751761	F	36	119					
+HWUSI-EAS610	1	4	39	139	252	0	1	GATATCAACTAGAAAACCCCCTCAAAGCACAGGTGA	a_a`ab`aaabaaa^]aaaaa`ba]aaaaa`]_Za^	chr10.fa		5752005	F	36	119					
+HWUSI-EAS610	1	4	9	1401	406	0	1	ATAGTGTGTAAGTCATTGCATCCCAGGGATTGGAGA	aab^Za[_\a`ZX`aaa_aa`aa^]_^VW_^]___]	chr10.fa		5752233	F	36	119					
+HWUSI-EAS610	1	4	37	914	1582	0	1	GCATCCCAGGGATTGGAGAGACAGCTCGTGGGTATA	aabbaaa`bb_]aabb_a`aZ`a]^^]a^_aZY^^^	chr10.fa		5752250	F	36	119					
+HWUSI-EAS610	1	4	39	1593	1781	0	1	ACTAGACAGCAATAGGTAGCAAGTTCCGGGATGGAA	`Yb_a_OaaWa^aa_`Ya``aaZU_UY`_U_Ya_^_	chr10.fa		5752589	F	36	119					
+HWUSI-EAS610	1	4	96	1087	728	0	1	GCAAAGAGAACTGGGATCTTCAGCATTCCTCACGTT	a_a__aZa_`Y]`_____a^_`_]_]^]]U]_X`\_	chr10.fa		5752687	R	36	119					
+HWUSI-EAS610	1	4	90	712	727	0	1	TGTTTTTCCAGTAGGTAGATGTTATTATACCTTGAT	abaabbbaaba_aaa_ab`abaaabaaaaa_aaa[a	chr10.fa		5752842	F	36	119					
+HWUSI-EAS610	1	4	18	1309	1711	0	1	AGGTAGATGTTATTATACCTTGATTCCCAATACCAT	^b[G`S_aabba\__`bR_`b_V`aV_aaa`_SY_`	chr10.fa		5752854	F	36	118					
+HWUSI-EAS610	1	4	13	195	74	0	1	CCAGGAGACACATGGCTGGCCTTGTTGTTTGCAAAC	aabaaa]abaaa`[ab_aaa\T`\W__U\\^``\_^	chr10.fa		5753063	R	36	119					
+HWUSI-EAS610	1	4	22	77	537	0	1	TTGGTAGCCAGGTCGGATCTGCATCAACTGCACTTG	aaba]]Z]aaba___aXS_^aaa[baa`aaa^```_	chr10.fa		5753131	F	36	119					
+HWUSI-EAS610	1	4	20	700	965	0	1	AGCCTCTTCCACCAGAAAACGGGGACATGTAGGTTT	aababbbbaabaaba`^_babaab``aab`abaX_a	chr10.fa		5753249	F	36	119					
+HWUSI-EAS610	1	4	26	813	925	0	1	AGCCTCTTCCACCAGAAAACGGGGACATGTAGGTTT	abaaa]ba`_a\`_baa`]R_aa`P\[__Z^aaRZ_	chr10.fa		5753249	F	36	119					
+HWUSI-EAS610	1	4	23	1646	1113	0	1	GACATGTAGGTTTCCTCCACAGAAATAGTTGGTAGT	`aaYa`Pa``W\`W]_a\_^^Y^\\_`]R]]YUYSS	chr10.fa		5753272	F	32G3	93					
+HWUSI-EAS610	1	4	96	902	600	0	1	AGGTCACTGCAGGACTAAGCACATCTTCTCCCACTG	abaaababb`bbab`baaaaaabb_ba^a`a_``aa	chr10.fa		5753418	F	36	60					
+HWUSI-EAS610	1	4	14	175	262	0	1	AAAGGTTTCAAATACTTTTTTTAAAAAGCGGCTTCT	`^aba`ba`aaaa_abbbbbbbaab_babbababaa	chr10.fa		5754093	R	36	119					
+HWUSI-EAS610	1	4	27	669	1930	0	1	CAGAAATGTCTGTTATGAGCCGTAAATCATGCTTAA	aaa_a``a`a_a]`__[_^___Y]^^\[_][Y^^ZW	chr10.fa		5754539	R	36	119					
+HWUSI-EAS610	1	4	37	395	241	0	1	AAAATCAAGCACTGATGAAGCTCAGTTCNCTGTGAC	a]X`__a^_a`U`a_a`___^\___^a[DT\VW^__	chr10.fa		5754600	F	28C7	110					
+HWUSI-EAS610	1	4	55	1114	408	0	1	GTAACTGTGGGGTGTTGGCATACAATGGGTAAGATT	]__ZZ\\O^\]aPX^a`]V[SZ[]\Z]_[PZ[`]]]	chr10.fa		5754750	R	36	118					
+HWUSI-EAS610	1	4	9	1474	1506	0	1	TGTAACTGTGGGGTGTTGGCATACAATGGGTAAGAT	`aaa`aaaRa_aaGa^_abWaaaa_`_aa_Va_aV`	chr10.fa		5754751	R	36	118					
+HWUSI-EAS610	1	4	24	1692	1626	0	1	GTTGCTATGAATGTTAGGAAAGAGGCCATGTGGCTC	aQ_`___Z^[]]]W]XX_]\`ZLN]XXY]WUX]Y]^	chr10.fa		5755156	R	36	118					
+HWUSI-EAS610	1	4	71	1157	2021	0	1	ATCACTGTGTAGTATGACAGAGAAGAGATAAAACAT	aa]_QN__`SZa]^_a_Y_a_[\__]_^]_^_^ZW_	chr10.fa		5755196	F	36	119					
+HWUSI-EAS610	1	4	37	959	926	0	1	AGAGCTTAAACACCAATAAACGAAACTTCCCATTAC	S\\a]^YS_]LRa_]S`_R\\aSTZURaZZW]U\U\	chr10.fa		5755240	R	36	118					
+HWUSI-EAS610	1	4	97	890	1407	0	1	TAACTACTAAAATCACGCTGGATATGATATGGATGA	a_^`abababaaaaaaa_abaaa`aaa_`aaa`a[_	chr10.fa		5755482	R	36	119					
+HWUSI-EAS610	1	4	9	1074	783	0	1	AGGGAGACGTAACTACTAAAATCACGCTGGATATGA	]bbbabb`bbbaabbbbbbabbbbababba`babba	chr10.fa		5755491	R	36	119					
+HWUSI-EAS610	1	4	56	1660	1589	0	1	ATTTGGTTGTGTTTCATTTGTTTTCCTTGTTGCCAT	Q_``aZ``XJ[YS_bZTN```aUa`Ja_WSaBBBBB	chr10.fa		5755637	F	36	96					
+HWUSI-EAS610	1	4	61	621	757	0	1	TGAGTGTGAGCCAAAGCTTTCCTCCCTTAAGTTACA	aaa`Ua_``a_aa_a`_aaa``a_^^`a^\`^^__^	chr10.fa		5755693	R	36	119					
+HWUSI-EAS610	1	4	73	1432	46	0	1	CACTCACAAGGAATATGGTCCTTCACTGTGAGGAAG	aa`a`aaa]X]Z`a[^XR_`[\^XX^^a\KZ\TTZV	chr10.fa		5755723	F	36	118					
+HWUSI-EAS610	1	4	61	54	130	0	1	GAAGCAAGGACATTCTATAAAACCGTTAGTCCTCCC	a[Uab_[a_Z`Zaaa`a_]VU^\aa_`]aYa_^a_a	chr10.fa		5755847	F	36	119					
+HWUSI-EAS610	1	4	78	430	479	0	1	TCCAATGACCACTTCCTCCAACAAGGCCACACCCTA	abbba_bbab`aaaabaaaaa`aaaa`ab`a_aa`\	chr10.fa		5755887	F	36	66					
+HWUSI-EAS610	1	4	24	909	822	0	1	CATGTCTCCCCATGTCATGCTTTGGTGCGAGATGCT	`aZW_SV`a_`Q^]TU^QZW`UPSOH\L_USKZ]YV	chr10.fa		5755962	R	36	117					
+HWUSI-EAS610	1	4	47	654	86	0	1	ATGGCTCGTCAGCTCTTACAGCATATTCACCTCCTC	aa```__[LSVQSPT[YVTLQM[QRZWNVVRRTQRT	chr10.fa		5755995	F	36	117					
+HWUSI-EAS610	1	4	41	1278	1075	0	1	CAGCTCCTACAGCATATTCACCTCCTCTCTCCTGTG	]aaTb^F\b`]V_ab_bb[_aabbTa_`Ta]_b_bb	chr10.fa		5756004	F	6T29	108					
+HWUSI-EAS610	1	4	59	1042	1556	0	1	CATGTTTCCACCAGAAGGAAGTGGACACAGGAGAGA	abbb`aaaab_Y`a_aaaaaaaa^`aa[[ab_b``X	chr10.fa		5756029	R	36	119					
+HWUSI-EAS610	1	4	90	1366	53	0	1	GTCCTGGGGAGGAAAACCTTTCTGGATTGTGGGATA	`aa`a_\Z_YaVaa___`_a`\`T^U`_\U_\N\^^	chr10.fa		5756076	R	36	119					
+HWUSI-EAS610	1	4	36	802	804	0	1	TGTGGCCACAACCAGCTCAGCCCAGTTCCAGGAACG	`a\`a_`a`\_U_```_`aa^]\`^^`]]]\`[^^a	chr10.fa		5756640	F	36	119					
+HWUSI-EAS610	1	4	74	1461	1058	0	1	TGTGCCACCCTGAACCTCTGCCAAGCAGAAGGCCAT	ab]aZababaa_aaaaaabb`abaU_aaaTO`a]a^	chr10.fa		5756840	F	36	119					
+HWUSI-EAS610	1	4	73	277	1194	0	1	TGAATTCAGATCCGAGCACAAGAAAGGTATCCTGAA	abbbbbbbbaUabbaabababa__aaa_aaaaab_a	chr10.fa		5756997	F	36	119					
+HWUSI-EAS610	1	4	39	801	1228	0	1	AAAACCCTCTACTTCTGTTCCCACGTGGAACTGAAT	a`^RL]aa_aa__a`aaTX`a`_a_P[`]]H\_Z]a	chr10.fa		5757501	F	36	118					
+HWUSI-EAS610	1	4	53	218	1372	0	1	GGCTGAGGCACCTGGGAAGAAGTGCAAGCTGTCGAA	ab_^a```a]`_``[`\^]Y]^Ua]Z___]_WPXBB	chr10.fa		5757553	F	36	110					
+HWUSI-EAS610	1	4	21	1250	1293	0	1	CTGGGAAGAAGTGCAAGCTGTCGAAGGATGGAGCAG	ab`^aXaa^_]Xba_W_`a`PZ`XV]_^\^[YY\``	chr10.fa		5757564	F	36	119					
+HWUSI-EAS610	1	4	40	636	1291	0	1	TGGGAACTATCCACATTTTCTTTTCTTATAAACAAA	aba`[baaabaa``T__baaabbaabaab^\_``\[	chr10.fa		5757808	F	36	119					
+HWUSI-EAS610	1	4	16	685	53	0	1	GGGAGCTGTGAAGGGCTAGGCCTGTGACTCTCTCCA	_^^Z`^[\\`]aQDTVL]RXY]QXT]ZTPVRZZUX]	chr10.fa		5757908	F	13T22	109					
+HWUSI-EAS610	1	4	53	1494	1053	0	1	AGGCCTGTGACTCTCTCCATATCTGGTGTCCATCCT	OT^Zbb^^`^bb`b]bb___ba]b_KV]ba_`\aab	chr10.fa		5757925	F	36	118					
+HWUSI-EAS610	1	4	75	1163	1961	0	1	GGTGTCCATCCTTCCTAGAGAGGGGTTCAGCATCTT	a^W]^a`a`a\`a]^aaa_a_a`a_Z`\^`\]\Y`a	chr10.fa		5757949	F	36	119					
+HWUSI-EAS610	1	4	26	947	850	0	1	GGAAGCACAGTAGCCATAAAGACAGAGTTCAACAAA	a`Sa\_a`aaG`aY\a^^\_a\\_`_`U\[_UX]__	chr10.fa		5757992	R	36	118					
+HWUSI-EAS610	1	4	66	673	1505	0	1	AGGGAAGGAAGCACAGTAGCCATAAAGACAGAGTTC	ababbbbb`aaabbba`bbaabbbabab`abaa^aa	chr10.fa		5757998	R	36	119					
+HWUSI-EAS610	1	4	70	868	2012	0	1	CAGATGAAGTCCTAGCACAGAGTTCAAGCCTTGCTT	`bba`a]XZaa`Z_^``abbZ`]]^````X``_aaa	chr10.fa		5758105	F	12C23	88					
+HWUSI-EAS610	1	4	20	627	1263	0	1	TAGGAGGTAGAAGGGCAAGCCTTCAATTTCAGTCTT	Y[`OR]b__`_\_^VU]Y`RURUS[aP_WS]_PT_^	chr10.fa		5758152	R	36	118					
+HWUSI-EAS610	1	4	29	436	1142	0	1	GACAAGATCTAGAGTCACTTAGGAGACAAACATTTC	a__`__Z_aaba`a`aa`^YM\ZFVUN`[PSDZ_XU	chr10.fa		5758349	F	36	115					
+HWUSI-EAS610	1	4	49	1475	439	0	1	GTGACATCCACAGCCTCTGTCTCCATGACATCCCTG	\^aababa`abbabb`bbbSbab`aUaaa`H`_a`Z	chr10.fa		5758505	F	21A14	80					
+HWUSI-EAS610	1	4	82	1614	931	0	1	AGGATTCCAGCCAGGCAGGGGTGGCACACACATTTA	a`aa`a`````^^PZ_\a`_\W\\UYUWVMUW^]`]	chr10.fa		5759722	F	36	118					
+HWUSI-EAS610	1	4	37	1293	71	0	1	GTAGAGAATGACCTATTAGGAAGTGTGGCTCTTGAC	a\a_^`_^^__^]_]^a``^^^]V^YUYZZZV\BBB	chr10.fa		5760129	F	36	106					
+HWUSI-EAS610	1	4	20	1200	542	0	1	TCAACAACAAAACAAGGCCACGCCTACTCTAACAAG	a`V[`U]UZZNPSQ[\P``UOZLNY[VUI[aPM`\B	chr10.fa		5760197	R	36	112					
+HWUSI-EAS610	1	4	97	1264	1061	0	1	AGAAGGAGACTGTGTGCCACACTGAGCTTGAGCATA	_``b_Uaa`ZP\]`N`__`_TX]a_`\ZaaPL[`^a	chr10.fa		5760271	R	36	118					
+HWUSI-EAS610	1	4	71	1058	385	0	1	TGGAGAGGAGAATCCAGCCTATACCCTCTTCTTCAA	abbaa``^^_`^_]_[T_a`a^_]]\_\^_]]^\_\	chr10.fa		5760603	R	36	119					
+HWUSI-EAS610	1	4	55	1702	748	0	1	TCTTTGCTGACAGAGGCTTTTATTTGCCCTCTTCCA	a`baa\``Za_aZ^___aaaaW^_]G[`^]Y]]]^Z	chr10.fa		5760970	F	36	118					
+HWUSI-EAS610	1	4	7	719	684	0	1	AGTCTGTTTGACTTCTGTCTTAGTCAGGGTTTCTAT	^RLQYR^[[]TRU]S_`YXXT_`TV]_U^LRWLV`\	chr10.fa		5761635	R	36	117					
+HWUSI-EAS610	1	4	49	32	232	0	1	TAATATACTATTACCAAGAACAACTTAGGGGAGGAA	a]_aaaaaa`aa`ba\Z\UV`\a`aaYaaa`_a`^\	chr10.fa		5761715	F	36	119					
+HWUSI-EAS610	1	4	4	1349	1313	0	1	GAAGGGAGTTCATTTCATTTCACACTTCCAGATCAG	a\][`X`_R[Z_a_[Qaa`_X`Y\^^U_OW_W_V]`	chr10.fa		5761748	F	36	118					
+HWUSI-EAS610	1	4	60	882	1180	0	1	GAAGTCGGGGAAGAAACTCAAGCATCAACCTGGTGC	a]ab__aaaa`a`a[a^`a`]a_a`U]ZZ[`^^_]^	chr10.fa		5761791	F	36	119					
+HWUSI-EAS610	1	4	27	1440	1156	0	1	TGGTCCTTTGCTCTATAGGAACACTAGTGAAATGTA	abaYa`aa_V]a`aaaa]a[`_`_``a\`^__aa^`	chr10.fa		5761870	R	36	119					
+HWUSI-EAS610	1	4	39	465	588	0	1	CAACAATAAAGAGTACTTATTATTCCAAATGAACTT	^a`^^Z]^X_[\a_b``a`_PWbbaa\R[__^]]ab	chr10.fa		5762166	F	36	119					
+HWUSI-EAS610	1	4	75	788	1699	0	1	AAAAGAAAAGAAAGCAAATGTTCCCTCAGAGAGGGT	\a^^\abRR^_b\bb``ba`S`_bVaa`b^aHaa_X	chr10.fa		5762788	R	36	118					
+HWUSI-EAS610	1	4	25	6	576	0	1	AACCGCCAGGTGACAACAGATGCTGGCGAGGATGTG	]b`b`b`]^_I\ab^`a\PWQ^`^ZWV]Y__[_b\a	chr10.fa		5763850	F	36	118					
+HWUSI-EAS610	1	4	57	132	1956	0	1	CAGACTGGCCCTGAACTCGCTCTGCATCTCGGGCTA	a_``\W\\`^`\]X\YQ[[]Q\Z[\VR\TXR\SSBB	chr10.fa		5764038	R	36	110					
+HWUSI-EAS610	1	4	46	838	1346	0	1	TTTAGATGCAGGTTTGCCTACTGTCAGAGTTTGAAT	aaa^`]]aa_[]aaV]a][[_`aT`aaYaaaa\W_a	chr10.fa		5764229	F	36	119					
+HWUSI-EAS610	1	4	21	259	80	0	1	GTTTGAATGTAAAATATCCCACGCAGTCTGCAGCTA	a[a^a__aaUaaa____aaaS__`__W`__]V`_]_	chr10.fa		5764257	F	36	119					
+HWUSI-EAS610	1	4	15	263	836	0	1	TCACTGTTTTCATAGCTGCAGACTGCGTGGGATATT	a`^`baXaba`ba^`]``a]`aa```aZa```][^a	chr10.fa		5764269	R	36	119					
+HWUSI-EAS610	1	4	41	1245	787	0	1	ACACCTGCATCCTGGGGAGGGCACAGAGGGATCCAT	`T\]\\[Y]\WTW\\U`]WPZ\ZPTVV\M\V\PXWX	chr10.fa		5764403	R	36	118					
+HWUSI-EAS610	1	4	9	929	1003	0	1	ATGCAGGTGTGTATCTTCTGAAACCATGAACCAGGG	aaaa`abXa_a]_a``aaaa_a`_```aa_^Y[_^[	chr10.fa		5764429	F	36	119					
+HWUSI-EAS610	1	4	48	428	1377	0	1	GACACAGTGTCTGACAGGGTAGCTTGAGGGAAGAAA	a_aaaaaYb_aa`_aa_a]\_aa_a`__\aT_`U`[	chr10.fa		5764471	R	36	119					
+HWUSI-EAS610	1	4	70	163	1384	0	1	GCTGAAAGGACTTATGCATCTCATTAGGATGACAGC	aabb^K__a_`a_R^b`[`aaaX_ba_\V`_^aaaa	chr10.fa		5764545	R	36	118					
+HWUSI-EAS610	1	4	81	1576	1077	0	1	CAGGAATGTTGTTTACTAATTTTACTAAAATGATGT	aba^\a`YVaaaaaa_^_\aaa^a_a_aa_`[`aaa	chr10.fa		5765089	R	36	119					
+HWUSI-EAS610	1	4	23	298	523	0	1	ATTATCCCACAGCACTTGGACACAAGTGAATCGTAT	Tab_aaabbabbbba]bbb_`bbbbb`aab^`a_a_	chr10.fa		5765386	R	36	119					
+HWUSI-EAS610	1	4	72	176	519	0	1	AGCGAGTTTATGGTAGCAGGTGGGAGCTTTCCACAT	^aab^a\aa^aaaY``aXaaWaa``aa^aaa_\aUW	chr10.fa		5766569	R	36	119					
+HWUSI-EAS610	1	4	92	663	1198	0	1	TTACACTTTATTGTTGGATGGCACCACTGCTCTGCA	aaa_^aaaaaa``a`baaa`a`aaS]QO^\]^U]\]	chr10.fa		5766631	R	36	119					
+HWUSI-EAS610	1	4	21	919	584	0	1	GCAGTGGTGCCATCCAACAATAAAGTGTAGGAAGAA	a_``^`^Xa^aaa^`aa^_aa^a^`Xa^]H]^a`_a	chr10.fa		5766637	F	29A6	106					
+HWUSI-EAS610	1	4	18	843	1098	0	1	GACAATGTTACCTGAAGATACAAGGAAATTAGGATA	aa`Q`_a^\^^\V^PW^\`]Z^_`\R[SUZ\X\[\`	chr10.fa		5766987	F	36	118					
+HWUSI-EAS610	1	4	54	128	519	0	1	GTGCATGTGCACCTTATGTTTGCTAGTTTCTGCAGA	aYaaaaYT``^aa_]N_a]`_ba`Wa[`a_aa[PVB	chr10.fa		5767411	R	36	114					
+HWUSI-EAS610	1	4	3	49	265	0	1	ATCTCAATTTAGAGATCTTTTTATGCTTGCAATTAC	`aa`ba_``]aaab`WaaZ`^a_aaa^_a_``_a__	chr10.fa		5767697	R	36	119					
+HWUSI-EAS610	1	4	34	738	1466	0	1	ATCACCTGTCTCTCTTTGAAGAGAAGTAGGAAAAAG	\aZa`a`a]R^`a\aaa[STa[\\[_W[Y_]___^^	chr10.fa		5767757	F	36	119					
+HWUSI-EAS610	1	4	48	870	1805	0	1	CTTCCATTCATGTAGAAATTAAGCATCTTTAGAGCC	a_baX[b[`aaa\Z``aaa_____]]U]`[a_U_T_	chr10.fa		5768168	R	36	119					
+HWUSI-EAS610	1	4	67	999	58	0	1	TGTTTGTTGCTCTTGCAGAGGACCCAAATGGGGTTT	aaZaZUF_b_Wa``PSG\L\Z_S\PZJJ[HNS^SSQ	chr10.fa		5768502	F	6C23T5	86					
+HWUSI-EAS610	1	4	98	1788	1669	0	1	AGGGGAGTAAGGCAGACTGACAGATACATGGGGGAG	`bba]]^\aab`X]Z\a]bb\XY]aa\Z_]a^G_XB	chr10.fa		5769526	F	32T3	103					
+HWUSI-EAS610	1	4	17	677	1344	0	1	ATATGCATCACACAGTGGCAATGGCCGGTGGGACCC	ababba`aaaZ`aaaUaaaa_]`a`]\\U``\]Y]^	chr10.fa		5769622	F	36	119					
+HWUSI-EAS610	1	4	1	1249	1236	0	1	ATCTACTACAAAAACACAGTGAGTTTTCTTATCTGA	aa`aa_aa]a``_a_a^`a_a_`\^__^`a`__`a`	chr10.fa		5769668	R	36	119					
+HWUSI-EAS610	1	4	19	727	1148	0	1	ACTCCTCAACGGCCAGCCAAGTGTCTTTGTGAATCT	aW`_`aXZ``a_`Z___a``^W_\W`[____\\^_S	chr10.fa		5769700	R	36	119					
+HWUSI-EAS610	1	4	53	472	1196	0	1	ACAAAGACACTTGGCTGGCCGTTGAGGAGTTGTGTG	aabaab```aaa``a``__`a\_VZ___`Z_`V`Wa	chr10.fa		5769706	F	36	119					
+HWUSI-EAS610	1	4	39	858	1773	0	1	GCACACTTTTTGAGAGTAGTTCTGGAATCATTAAAA	^`aa__abbbbb``a__aba`Z_`a]__Q^ababab	chr10.fa		5770353	R	36	119					
+HWUSI-EAS610	1	4	61	964	1349	0	1	TTTTAAGAGAACTTTGAGCAGTTGACTAGGCATTCT	a`_b`aba`[TIU^aaaaaa`XZ__W_Z^`\[aYU^	chr10.fa		5770657	R	36	118					
+HWUSI-EAS610	1	4	98	810	1032	0	1	TAACCCAACGCTCTACCTAACTCATCTTACCAACCA	ab_Z^U`b^`_T\__a_a]^M]Z`ZVW[_^SU_Y_a	chr10.fa		5770693	F	36	118					
+HWUSI-EAS610	1	4	96	770	1871	0	1	TGTTCCTGTCTTTGAGTGATTCTTTGGTGTTTTGTT	aaa`aaa_W_abaa_aYa_aa_aa_a^Xa]`aa`^a	chr10.fa		5770890	F	36	119					
+HWUSI-EAS610	1	4	30	352	488	0	1	TGAAACATCCTCTGCCATGTCATAAGATGGTGGGAC	a`R_]Za``a]a_`_a^aaXaY__W`Z]]]X]]_U]	chr10.fa		5771140	R	36	119					
+HWUSI-EAS610	1	4	59	297	1284	0	1	TGGGTCTGAGGGTTGATTTGGCATCTCTGATCATAA	]bababa\\bbb`b_V_bb`U``a`bbbb_aaaa\R	chr10.fa		5771249	F	36	119					
+HWUSI-EAS610	1	4	48	272	330	0	1	CCAAAGCAGGTCAAGTGACAAAAATAAGTATGGGCT	ab_]^^bb^`__VZb_b\```a`Y`^_aXaabaaa`	chr10.fa		5771538	F	36	119					
+HWUSI-EAS610	1	4	29	207	344	0	1	CGTCTCTGGCAAGTGAACTCCTGAGAGATACGAGAT	[aSabbaabbbbb_aaababbbababbbabb_bbbB	chr10.fa		5771765	F	A35	83					
+HWUSI-EAS610	1	4	55	766	209	0	1	GTATGGGTAGGGGGTTGCTTACAAGAGCATGGGGTG	a]\aaaaX_`^`^\^````aa``^a^\Y^a]^[_[a	chr10.fa		5771859	R	36	119					
+HWUSI-EAS610	1	4	14	1175	1200	0	1	GTAAAATTTAACAAACCCACAAGTCACTAAGCTAGA	a]X^UP___T[STX_U]Y]W_]YVZ_[]^[[YYYXB	chr10.fa		5771925	F	36	114					
+HWUSI-EAS610	1	4	26	841	1797	0	1	ATTGGGAGGTTGTGAAGCTGTCGAAGGGTGAGGCCT	abab_^^abUabaaa``aXbUaa_QabbMa_a`R__	chr10.fa		5772173	F	36	118					
+HWUSI-EAS610	1	4	1	610	794	0	1	GTCCATTACCCTCTGCCTCCTGTCCACAGTGAGGTG	aYa^]bb\YX_a_``^``__a``\_`\`aY]Y^`U_	chr10.fa		5772270	F	36	119					
+HWUSI-EAS610	1	4	27	1432	932	0	1	TGTGCGTGTGTATGCACAGGCGTGTGTGCTGGGTGT	aaWYO_PTPPKT^V[QON\VVYBBBBBBBBBBBBBB	chr10.fa		5772703	R	36	57					
+HWUSI-EAS610	1	4	92	527	1902	0	1	CCTCATTTCTCAGTATGTGTGCAAGTGCGTGTGGAC	_]V_TRP`X^``OT\``Ta\__^_^NS[`RXSXHX_	chr10.fa		5772756	R	33T2	105					
+HWUSI-EAS610	1	4	83	683	788	0	1	CTGCCAACTGCCCAATGGCTCAGGGGAAGATTAATT	abbbaaaaabaabaabaaaa[X`]GY``^N_Za[ab	chr10.fa		5772926	F	24A11	107					
+HWUSI-EAS610	1	4	66	735	610	0	1	AAAAAAATCTCAAAACAGACTTGATTAGGAAGACTA	_UW`b```^_\_Z_^[Z\XX_]\UY\]`\V_`VSX`	chr10.fa		5774338	R	36	119					
+HWUSI-EAS610	1	4	10	186	1456	0	1	CCTGACGAGCATAGTATGAGTTCGTGTACGTAGAAA	aa`bbaTaa_ZaY`]b`aab_a`bXb_bbbTb```a	chr10.fa		5774536	F	36	119					
+HWUSI-EAS610	1	4	19	318	296	0	1	GCATAGTATGAGTTCGTGTACGTAGAAATGCCATTT	aaaa`a]a_b`b_``b^a_aaa`aaaaa`a_``^a`	chr10.fa		5774544	F	36	119					
+HWUSI-EAS610	1	4	65	952	22	0	1	AGCAGGAAGGTGTTGTCAGAGCAGAGTGTTTTCATT	abaaaZLWbbZbaab]__a_b_aa_aZaW`_`a`aa	chr10.fa		5775103	R	36	119					
+HWUSI-EAS610	1	4	31	245	948	0	1	TCAGGAGTGATCTTTTCCAGAGTCATCCTTCTTGTC	`b[ab_a\aaaaaa_aaaaa^aZaa_aaa_a]`a^a	chr10.fa		5775832	R	36	119					
+HWUSI-EAS610	1	4	88	863	1102	0	1	GTACACAGAATCACATGCTACATGATCAGGAGTGAT	a_Z^W]_]X^XW^W^]ZW\V`^R_Y^XZ_]POO^M[	chr10.fa		5775857	R	36	118					
+HWUSI-EAS610	1	4	82	1227	862	0	1	TTTGAATGTTCTGTGGTTTAACACTTCACAGTACAG	]ba]__``]aa^[]a_]`aabUPX[a`a__a^`[`a	chr10.fa		5776021	R	36	119					
+HWUSI-EAS610	1	4	88	481	19	0	1	AAAAAACCAGACAAACAAACAAACAAAAACAAGGCT	abYba`_a_aa`aaaa_`aa_`aaaa\a__`^aa^_	chr10.fa		5776228	F	36	41					
+HWUSI-EAS610	1	4	65	632	727	0	1	TCAAACTTGGAGAGTGGTCCATAATAGACAAGTGGG	aa`ba`aa`aaba``a`]]a`__aT]]][_aaGa`b	chr10.fa		5776429	R	36	118					
+HWUSI-EAS610	1	4	91	999	1016	0	1	AAGACCAGAGTAGGGCCACAGGTAGATATGGTGAAT	aa`WYaaaaa[aa```^a````^`a```__RN`_`_	chr10.fa		5776541	F	36	119					
+HWUSI-EAS610	1	4	4	759	1924	0	1	AGGTGTCCAGACAGGGCCTAGCATAGTCCTCCTTAC	_ab]b`a_bZ`aa^`^`a]aa]]`a`UM^U\a_Za^	chr10.fa		5776638	R	36	119					
+HWUSI-EAS610	1	4	91	1415	531	0	1	CATAGGCAGAGATCAGTGCTGCCAGGGGCCAGGACT	_a``[V`aa\\aa`a```^Xa_aaTXRTaaa\\a\\	chr10.fa		5776785	R	36	119					
+HWUSI-EAS610	1	4	43	698	1137	0	1	GGACAGTTGTAAGGTTGATAAAGCTACTTGACAGAA	aaa`[`_bb``^ba]aaaaa``a^`a_``a^^^a[Z	chr10.fa		5777199	F	36	119					
+HWUSI-EAS610	1	4	51	1708	311	0	1	GCTGTGATTACAGCAGAAGCATGACCATTTAGTACT	\b`U`_aaabaaXaa[ab]aa`T^^a_`aaYRX`]]	chr10.fa		5777407	F	36	119					
+HWUSI-EAS610	1	4	32	868	304	0	1	TTACAGCAGAAGCATGACCATTTAGTACTGCTTCTG	a_[XY`Z__\_^^_^_]XZ____Z[Q[[W[VXZ^\^	chr10.fa		5777414	F	36	119					
+HWUSI-EAS610	1	4	56	235	381	0	1	GTTTAAAGCCGTTCACACTGAAGCCACAGTTGAGAG	aabaaZZ_aabaa^a]]a_aaaaaa____Y_^YWU`	chr10.fa		5777557	F	36	119					
+HWUSI-EAS610	1	4	53	1519	165	0	1	AGTTGAGAGCACAGAGTAATGATGCATGTAGGCCTG	`[^_][Y_K`a`]]\aZ`_]_aYUXX[NT\VLWV_[	chr10.fa		5777584	F	36	118					
+HWUSI-EAS610	1	4	34	718	458	0	1	GGCCTGCTTGCTTGTTTGCTTGCTCCTCTCATCTGG	Tbbbaaabbabbabbbb`bbbbb`abbaba_bbaba	chr10.fa		5777614	F	36	119					
+HWUSI-EAS610	1	4	6	368	1580	0	1	CAGATTATCAGGTGGAGGACTGTTTGGATTGCTAGC	a`aa^aa_a^aa]`][a_aaaa_a``_a``]a]`a_	chr10.fa		5777710	R	36	119					
+HWUSI-EAS610	1	4	69	643	504	0	1	ATCTAGATCAGATTATCAGGTGGAGGACTGTTTGGA	aa`a``\```]_```a_`^`Z`[Y_`_\_aX_]_]]	chr10.fa		5777718	R	36	119					
+HWUSI-EAS610	1	4	2	425	1894	0	1	TGGGATTGTTAACTGTAAGTGTCAGCGTGACCCAGC	]aa`ZZ\aaU`a`_`O[_`SaR``Zb`[Qaa___V_	chr10.fa		5777792	R	36	118					
+HWUSI-EAS610	1	4	39	1689	1030	0	1	GGAGCACCTTCTTTATCCTTCTACCTAGGAGAAAGG	abbabaaaaa`abbbaaaaaaaa`a`aa^_Z``^]Y	chr10.fa		5778363	F	36	119					
+HWUSI-EAS610	1	4	78	280	653	0	1	TAGCCCTCTGCTCATAGTCCTGGGCCTTTCTCCTAG	aabaa``a``_aaaa\`\a]^^]\`a\]_`_\`^]a	chr10.fa		5778387	R	36	119					
+HWUSI-EAS610	1	4	60	445	2042	0	1	AGAATCCCGAGGTGACAGGAGAAACAGGGAGATGAT	aZ`a\a`a`__[SZ^^Z[_\_^\]\\_^\U\WWWUW	chr10.fa		5779048	F	36	119					
+HWUSI-EAS610	1	4	59	1253	685	0	1	TGGTCCTGTCATGATGGTTCAACTTTCAGTTCTGGT	abaaX`a^]WZab^^`_Za_a_Y_`_`\TV_^`_[]	chr10.fa		5779109	R	36	119					
+HWUSI-EAS610	1	4	25	513	856	0	1	TGAAACAAAGAGCTGCCCAGGCCCTCTAACCCTAAG	a_Yaaab_^b\`aaaa^]TW]`^^aa`X^[`^^_^`	chr10.fa		5779156	F	36	119					
+HWUSI-EAS610	1	4	9	1197	1959	0	1	GCTGCCCAGGCCCTCTAACCCTAAGGCAGTTTACTA	a\M^[]Q^VXKK_`^_\VKYYQRYBBBBBBBBBBBB	chr10.fa		5779167	F	30C5	63					
+HWUSI-EAS610	1	4	98	347	1742	0	1	CATGAATCTCTTGTCTTCATTTTGTTTCTTATAACC	aXVTQLT_Y]\]WUXHU[R__^__^__[[[`a^_]X	chr10.fa		5779297	F	36	117					
+HWUSI-EAS610	1	4	29	343	1015	0	1	AGTGGATAATTCCCTCTGATTTCACTCAGAAAATAA	R`[`[_b\L_ba_baba`\a\a^^```^TQOYa`_Z	chr10.fa		5779880	R	36	118					
+HWUSI-EAS610	1	4	20	1300	467	0	1	GGAAATGAACATTTTCAATAGCTGTTTCAGAAAATG	abaaba_aV]]Z`aaQN[\Za\aZLWZNSYLS]RVW	chr10.fa		5779953	F	36	118					
+HWUSI-EAS610	1	4	94	1444	1646	0	1	GCCAACTGGTCACCCTACACTGTTTTCCCAGTTGGA	_`aa`^`aaN_aa```babZ_b[a_aa^[_aGa^`_	chr10.fa		5779998	R	36	118					
+HWUSI-EAS610	1	4	18	1579	1181	0	1	GGAGGAGGAAACGGGCTGCCTGGGAAACTTGGGTAC	_``a`]aa^\^ZZ\ZPZ]]X]]\[RNZT\^P\\RZS	chr10.fa		5780270	F	36	118					
+HWUSI-EAS610	1	4	24	1036	1996	0	1	GGAGGATGATGTCTTATCCCTCACCAAGCAGCTATT	a]\]]NFN^`[T]]__]\^VYRS[]QW]NU^^]U^U	chr10.fa		5780493	R	28T7	98					
+HWUSI-EAS610	1	4	40	650	300	0	1	GTGGGCCTTGAGACCCGCCCACATCCTAGCTTCCTG	`\XTQ^[^ZZ_^`RXaPSO^^X^^[`NYYSSZKVTZ	chr10.fa		5780676	F	36	118					
+HWUSI-EAS610	1	4	99	1118	1227	0	1	CACATCCTAGCTTCCTGGAAGCCAGTATTCTGCTAG	ab]ba`aa``abb_`aaba\_aaabWaaa`aa_aab	chr10.fa		5780695	F	36	14					
+HWUSI-EAS610	1	4	17	1117	357	0	1	CAGCATCCAGGCAGGCATGATACAGGAGATGCTTAG	abbaaWa`]_a[R[_Y_]ZT]X\W^SMVRPYWY\TV	chr10.fa		5780757	R	36	20					
+HWUSI-EAS610	1	4	21	1128	885	0	1	TGGTTACTCACATGACTTTCATGTGGCTGGTGGACC	aba_aa`^`\_`a`^`aa``^`a^_^BBBBBBBBBB	chr10.fa		5781260	F	29T2C3	71					
+HWUSI-EAS610	1	4	42	331	1989	0	1	TTTGGGATTCTGCAGAGGAGTGGCCAGTGGTCTAGA	abaa[XO`_aa]\J^P_aYaN`aaa`aPa`P^TR^^	chr10.fa		5781842	R	36	118					
+HWUSI-EAS610	1	4	23	1699	56	0	1	TGCATTTTATTGCATGATATAAAATATACATGGATA	`___aa`_]_aT]a__bZa_`]`\_][_[^]GRZ^^	chr10.fa		5782057	F	36	118					
+HWUSI-EAS610	1	4	15	743	1055	0	1	TACCTCCTTTTGCCGGACTGTATGTGTCTAAAGGAA	abaaaaabaaabaaa[`_a``aaa_aa]a`_Xa[Z^	chr10.fa		5782519	R	36	119					
+HWUSI-EAS610	1	4	84	773	989	0	1	GTTGGTTGTTTGGTTGTTAGCATGGTTTGAGATTGA	a_aab__a]`aa^Xa`_`___\``a_aa]]a]^_[B	chr10.fa		5782622	F	36	115					
+HWUSI-EAS610	1	4	64	1282	257	0	1	TGGCTGTGAGACAAGAGTTAGCTGTATAATTTCTCA	aaa\`YR`[aRX^V_W`UWW`TW]Z_a_[a``Oa]`	chr10.fa		5782948	F	36	118					
+HWUSI-EAS610	1	4	89	1308	1860	0	1	ATTCAGATTCCAGCTGGATCAGTCACTCCGCCCCGG	a`b_aa``a^`a`^S`_G`U_`^\^MZ\^XW^W^]]	chr10.fa		5783111	F	36	118					
+HWUSI-EAS610	1	4	25	1150	168	0	1	CTGCCAGCCTATCTCCAGGTTCAATGGCAGACTCTA	a``a`a_T\`bX`bXab^YG_Za^_Y`]_]ZaXa]`	chr10.fa		5783175	F	36	118					
+HWUSI-EAS610	1	4	90	1506	320	0	1	GGTTCACCCTCTATCCCTTTCCACCTTATTTCCTTG	]LZba]baaaaaSJ`a`aaaaab^S`]aaY^_`UaR	chr10.fa		5783214	R	36	118					
+HWUSI-EAS610	1	4	20	850	1672	0	1	CAGCACCTGCACAAACGTGTGCATACCCCACTCTAC	^`Xa]_XTZ\aUbbaQaOW_a\``aW]VX`aa[b_B	chr10.fa		5783289	F	36	114					
+HWUSI-EAS610	1	4	26	765	645	0	1	ACAAGGCCATACCTCCAAATGGTGCCACGCCCTGGT	a[Y_``]_`_^_^]]^`U]^\\W^^^^\]\U\]]^S	chr10.fa		5783596	R	36	8					
+HWUSI-EAS610	1	4	61	612	1659	0	1	CACTAGCAGCCTTTGGATGAAGAGGTACAACTCTCA	\_Z\a``aaaaba`^^a`b^aaaaa^a`]`_`_``_	chr10.fa		5783720	F	36	18					
+HWUSI-EAS610	1	4	28	1425	55	0	1	GTTCTTTAAAATCAAAATCTCTCACCCAAGCCTAGG	aaa``a`__a_a^aa_`a___]`_X]^^NZ]O^W^^	chr10.fa		5783961	R	36	119					
+HWUSI-EAS610	1	4	33	66	2012	0	1	AGGCCTCAGGCTGGCCTCAGAAATCTACCTGCCTCT	aaa``^`aaa[\```a]WU^U^YX]X]^`U`\[VTZ	chr10.fa		5784104	R	36	119					
+HWUSI-EAS610	1	4	72	1309	1179	0	1	CTTCATTCCAGCAAGTCCTATCAGCCTCAAAACCAA	abbabbbaabaabaaabbb`b`bb`aaaaaaa^a_U	chr10.fa		5784341	F	36	119					
+HWUSI-EAS610	1	4	55	1052	1796	0	1	AACTTCTGCGCATGGTATCTTAAGATTTAAACTCAT	aa`ba`aa_a`aa``Xab_ba`aa_aaa``a_aaaa	chr10.fa		5784854	F	36	119					
+HWUSI-EAS610	1	4	2	1090	969	0	1	CACTTGCTGCCAAGCCTGGCAACCNGAGTTCTGTCC	^_\a`_Z_aa`a[a_\R_Zaaa`YDZ_Z_[X_\[`Q	chr10.fa		5785203	R	24C11	11					
+HWUSI-EAS610	1	4	49	1002	1084	0	1	TCAGAGAATATATTAGTCACACACTATGGCTGAATT	aaaa`aZ`a`a`aa_a``___\`^`^___^``]^``	chr10.fa		5785312	F	36	119					
+HWUSI-EAS610	1	4	81	644	1355	0	1	TATTAGTCACACACTATGGCTGAATTTCAAAAATAT	`_ba]__Y]`b`bab]a`T`aaaaabaTY^[^aa`a	chr10.fa		5785322	F	36	119					
+HWUSI-EAS610	1	4	52	797	647	0	1	TTTGTTCCCTGTGCCTGCCTCCAAGACATGGCTGCT	abaa^a_`]a`^`_```__a``a^`_\`^^]^Z^S^	chr10.fa		5785475	R	36	119					
+HWUSI-EAS610	1	4	100	645	533	0	1	CGGTGTGAATGGAGCAGTCTTTCCAGACACTTGATG	_bbab^baa^ababa`KV[_bbabaY`bbabb_ab`	chr10.fa		5785530	F	36	119					
+HWUSI-EAS610	1	4	58	671	1079	0	1	ATAACACGCTCTGTGGCCTGACAAGGGACTCTACAA	`^`a\_S___^\`\Ya_^P^WWU\TNX\XU\ZR\UU	chr10.fa		5786008	F	1G34	83					
+HWUSI-EAS610	1	4	73	1409	325	0	1	TGATGCTTCCATATACACTTTGAAGATGTGGTGTGC	aaabaaaaa`a_aaaab_b`a_a_a`^aX^_Z_]a`	chr10.fa		5786603	R	25G10	82					
+HWUSI-EAS610	1	4	39	271	868	0	1	CAAGCGCTTCCCTCAGAGTTTCCCACTCTCTTGAAT	abab^ba\aa]__aV\^^T\__aY[[\^\`^``ISY	chr10.fa		5786908	F	36	118					
+HWUSI-EAS610	1	4	9	845	164	0	1	AAGCTGAAAAGGGCAGAGAACTGTCTCTGGCCCTAG	aaaaaa^aa`^Z_\_a_Y^^U`aU__^_`P^SSYT[	chr10.fa		5787069	R	21G8T5	47					
+HWUSI-EAS610	1	4	35	187	937	0	1	TTTGATAATTGTCTGGAGATTGCCTCATCACATTTA	aRX`\^V_WHXXaU[XT]UZU`a][MJV`^\RZORX	chr10.fa		5787367	R	36	117					
+HWUSI-EAS610	1	4	95	939	852	0	1	CATAGTCATACTTAAAGCTTTGGACTGCTTTGCGAA	Xa^\\H\aaaa`a_^]aa[[abZba_`^abab_]RB	chr10.fa		5787724	R	36	114					
+HWUSI-EAS610	1	4	34	812	1519	0	1	TCGGGATTGATTTAAATCTTCAATGGCTTTGGTCTG	aabba`aabbbbaaaa`]b_`b`aa`[`a``WMW`\	chr10.fa		5787994	F	36	119					
+HWUSI-EAS610	1	4	81	765	1293	0	1	TTTTATGAATGAACAGTGGACTTCATCCCAAGCAGC	abbaaaaaa_aaa__a^aa`_a^a_`__a_]a_^_`	chr10.fa		5788142	F	36	119					
+HWUSI-EAS610	1	4	65	8	1219	0	1	ATGCTGTCTTGTAAGGTCTGCATAGCTGCTTGGGAT	]ZR`_]Z_\\_\Q\aa]aYXaU_Z]``__^Y]_ZBB	chr10.fa		5788166	R	36	110					
+HWUSI-EAS610	1	4	94	64	458	0	1	GCATGGCTGGACTGAAATGGCTAGAATAAACCTGGG	aa]b`baab^```a`XU]a^````^`Z`\X_aZ_^`	chr10.fa		5788295	F	11T24	82					
+HWUSI-EAS610	1	4	32	823	1496	0	1	CTGAAATGGCTAGAATAAACCTGGGAGCAAGTTGGA	a_X^bb`bba``_^V_\abababa`Y\`ba`Wa_\Z	chr10.fa		5788306	F	T35	81					
+HWUSI-EAS610	1	4	17	314	689	0	1	GGCATTTTGCTGCTGCTATTGTTTATCTGCAAGGCA	abaaaaaaaaabaaba``a`baaaaaa_aab]^aa_	chr10.fa		5788369	R	36	119					
+HWUSI-EAS610	1	4	25	1600	1343	0	1	TTCCTGGGATGGGAGATGTGTCCTTGGGAGTTTGAG	a[[S]\[S[Z\XURGX_aSX^Z\\_RX]W[\UQQZR	chr10.fa		5788609	F	36	117					
+HWUSI-EAS610	1	4	32	1573	1408	0	1	AGACAGATGACAGACAGACAGACAGACAGATGCAGA	``[_bbaa`a````aaa`Xa]`\]a`_[][ZVZ_YB	chr10.fa		5788768	F	36	42					
+HWUSI-EAS610	1	4	13	1197	597	0	1	CAGAAAATGACCACCACAGCTTTCTTCTTGATATTT	\baaba`abbabbaY_\a\Y_aa_aY^b_JYabbXa	chr10.fa		5789040	R	36	118					
+HWUSI-EAS610	1	4	28	672	1998	0	1	TGTAAGAATATCACCACCACCCATTTCTAGCCCTTG	`_`]_Y___a^]a`aa````a`_VY___`[^^_^[X	chr10.fa		5789359	R	36	119					
+HWUSI-EAS610	1	4	3	441	1117	0	1	AAGCAAGCAAGCATGCAAGTGTGCACACATTCGCTT	aaaaa`baaaaaaa`aa``U]Vaa_^_`_a[aa__`	chr10.fa		5789759	F	36	119					
+HWUSI-EAS610	1	4	80	109	1267	0	1	CCATCTTAATGCCTCTGTTTCTCAAGTGCTGGGACT	a]P\`\^W[`aaaab`aZ^`aa`S]`]aa__]a_^Z	chr10.fa		5789979	R	36	119					
+HWUSI-EAS610	1	4	38	153	1100	0	1	ATATAAAATGCAGTTTTGAAAATGCTAAATACATGA	S_^_PY][``aaaaabba`VS^aabaa]^baa`__Y	chr10.fa		5790242	F	9A3C22	44					
+HWUSI-EAS610	1	4	28	1192	1399	0	1	AACCACATGATTATCTTCTTATGAAAGAGACAGAGA	\^^X]``_Z_Z\^_]``Z```a_TY^YQ_XYYYZ^`	chr10.fa		5790497	F	36	46					
+HWUSI-EAS610	1	4	73	825	575	0	1	GATTATCTTCTTATGAAAGAGACAGAGAAAAGGTCT	a`aaaa`aa_aa`aa_`aa_a`aaa`a```^``[_a	chr10.fa		5790505	F	36	36					
+HWUSI-EAS610	1	4	24	1669	2036	0	1	ATGAGGAGGGACACTCCTCAAAAGTCTTACATCTTA	a^a``ZMRZX\GXKRZZ^^^^ZWVDM\^RMUIDMZ^	chr10.fa		5790966	F	36	111					
+HWUSI-EAS610	1	4	97	436	1895	0	1	ATACCTGGGGTGGTTTGAACAACAGTGGCCCCCATG	TS]bb`a\]Z]]Z]Z_^\_]W_aa_KV`a^\[`RT]	chr10.fa		5791072	F	36	118					
+HWUSI-EAS610	1	4	36	1574	1791	0	1	GTTGGTCACCAGGGAGTGGATGCTTTGATGGGATTA	a^a``_USYS`_[[Z`M]^^ZWNR`XBBBBBBBBBB	chr10.fa		5791126	F	34C1	73					
+HWUSI-EAS610	1	4	60	1370	1946	0	1	CAGAGTTCTAGAGCCTGGGAAGCCCAAGGGAAAGTT	``babXbaa````X[aZbbaaa`]\]a`aa]_a^Ua	chr10.fa		5791678	R	22T13	82					
+HWUSI-EAS610	1	4	68	554	1867	0	1	ACTAAGACACTTTTCTAGACAGAGGCCAACAGCAAT	aaa_aYT``a]a`^^`\\^[VXVJY]^^_Z\Z^[WQ	chr10.fa		5791762	F	9T26	80					
+HWUSI-EAS610	1	4	54	119	425	0	1	TGGGGGCTGGACTACTACCTACAGATAAACAAAGAG	abbbbbabbbab_`bababaaaaaa`aaa^aaaa^a	chr10.fa		5792058	F	36	119					
+HWUSI-EAS610	1	4	44	903	1192	0	1	GACTACTACCTACAGATAAACAAAGAGGCAGAGTTA	^aabbabaaabbabbabb\b```ababbabbaa^_`	chr10.fa		5792067	F	36	119					
+HWUSI-EAS610	1	4	22	1585	1397	0	1	TACTGAGATTTGGTACATCTGCCTCCTTATTCATTG	aa]aa[`Xaa`__Y__aa_``_^_T\^\^`\\[^_a	chr10.fa		5792111	R	36	119					
+HWUSI-EAS610	1	4	67	1358	1308	0	1	AGTCTTCAGGCAGTAAACAACATCCAGGGGGAGAAA	_^Ybaa`ZSHZ`]``b_]aaa^]_`a_]VYXN_`PS	chr10.fa		5792169	F	36	118					
+HWUSI-EAS610	1	4	61	1107	1272	0	1	GTGGTTTGACTTGCCGCTCCCTTCCTTGCCCCTGTC	`_``R`aaU[`^``^\][RZ^Z^SZ]Z]RZ[ZWX\T	chr10.fa		5792410	R	36	118					
+HWUSI-EAS610	1	4	11	933	877	0	1	CAGGACAGAGCTGGAAGCCAGCAGGAATGACGGAGA	abb_QHW[`_X]]a[\Z^X\_\a`Y[Q`PXR]]Y[X	chr10.fa		5792446	F	36	118					
+HWUSI-EAS610	1	4	65	1655	1968	0	1	CTTACTCGCTGAACTCTGAGCTGGTCTGAGAAGTTC	abbaab[babbbb^baaabaabb`___aabaabaaa	chr10.fa		5792562	R	36	119					
+HWUSI-EAS610	1	4	9	557	338	0	1	GTAGAGAACCACTGCCTTAGAATGCTGCTGCCCCCA	`^aa]`_a_]_^^`]]a`_aZ^_`\`YXYa\\Y^SR	chr10.fa		5792924	R	22C1T11	50					
+HWUSI-EAS610	1	4	11	609	599	0	1	GCCCTGGCCGGGGGTCACGACCCACAAGTTGAGAAC	a_`XZ```^``ZWZ`U`Za`^ZFMSZXONXVKQ]\Q	chr10.fa		5793086	F	36	116					
+HWUSI-EAS610	1	4	21	1461	1483	0	1	TGCCAGCCGCAGCAAAGCTTTCCTCTCTGACTTTTC	abaaa`aaa[a`aa`aa\aaa_``_a`][X\`aaa_	chr10.fa		5793461	R	36	119					
+HWUSI-EAS610	1	4	100	876	841	0	1	CTTTCTCACCGGCCAGAATTAAGACTTATTCTATGG	abbbZ^aba^]_ZUab[`YPU[_a_a]OXS]`Ya_a	chr10.fa		5793659	F	36	118					
+HWUSI-EAS610	1	4	42	729	1006	0	1	ACAGGTTGTTTTCCAAGCCCTTCCTCCTGGCTGGCA	]\WZ^WWRU^QTKTT\SZb]aa`]XX^V]WBBBBBB	chr10.fa		5793779	F	12T23	77					
+HWUSI-EAS610	1	4	43	1003	742	0	1	GGTAAGTCATCTGGCCATGGAGAGGTTACACAAACC	aa`aaa]`aa^_`^^\`aaa\``__Y]ZW^\\^\ZB	chr10.fa		5794175	F	36	114					
+HWUSI-EAS610	1	4	59	262	141	0	1	ATAAATCACACATTCACACAGCCTGAAGGCCAAACT	_a`a]aaaaaa``W`aaaa__``__[[_]_^`Z_]]	chr10.fa		5794347	F	36	119					
+HWUSI-EAS610	1	4	85	653	916	0	1	AGTGTAAAACCCCTTTGCACATGGTGACGTAGTTTG	a^V[]aaU`_`Yaa_aaa[aa_``[a___]Z]^a_a	chr10.fa		5794377	R	36	119					
+HWUSI-EAS610	1	4	29	792	824	0	1	GATGACGCTGATAACTTAGGACACTTAAGACTACGT	N]abaabbbbbbbbabbbbababbbababbabbbbb	chr10.fa		5794620	R	T35	100					
+HWUSI-EAS610	1	4	88	994	1898	0	1	TGTTTCTTGTTTGGAGCCTCTATAAATATTTGTGTT	ab`ba_aaa_a``a^a__b^`aaaaaaaa`aa^a_a	chr10.fa		5794896	R	36	119					
+HWUSI-EAS610	1	4	23	724	1091	0	1	TGGGTGAATAATAATCCATTACTTGGATGTACCACC	ab_babbaabaaabaa`abb_`abbaa_b]`^]a__	chr10.fa		5794970	R	36	119					
+HWUSI-EAS610	1	4	8	156	545	0	1	AATCTGACCATCAGACTGTTGAAACAATGGACCCCA	a[`aaaaaaaaa`aa``a^`aa``a`a^`\``a``_	chr10.fa		5796383	F	36	108					
+HWUSI-EAS610	1	4	64	621	2008	0	1	ATCTAACCGAGAGCGACTTTGGACTCCTGACCTGCC	_aaabbaaa]a__aa`_]SZ\XZ`]__WX_^`\X^^	chr10.fa		5796595	F	36	119					
+HWUSI-EAS610	1	4	24	1016	1089	0	1	GCAGGCAGGTCAGGAGTCCAAAGTCGCTCTCGGTTA	a`\]][]]RQUQ[UNWJNQV[[USGYSUPUUPQTTS	chr10.fa		5796598	R	36	116					
+HWUSI-EAS610	1	4	14	58	653	0	1	ACCGAGAGCGACTTTGGACTCCTGACCTCCCTGCTT	`Z]`XVR]Z_[\VYO\YH]S]`KP\`aGE\]Y_a^^	chr10.fa		5796600	F	28G7	107					
+HWUSI-EAS610	1	4	4	366	1183	0	1	TTGGATGCACCTTAGCAGAAAGGAGCAGAGGAAGGA	a`bbb_^^bbbb[W[`bbbb`ab`baabab]Zab`\	chr10.fa		5796693	F	36	119					
+HWUSI-EAS610	1	4	57	61	1405	0	1	TAAAGACTCAGAAAGAAAGACTGGAGAGCAAAGAAG	aa\`bbbbb`b`abaa`aaaabaabb_aaa`[YL]`	chr10.fa		5796948	R	36	119					
+HWUSI-EAS610	1	4	16	1068	833	0	1	GGGCAGGTTTTTAGTATGATGGGGCCCTGCTCTTGT	aaaZ\a`]aa`a^a\^aa``^`_aa\U^^\_\]\`X	chr10.fa		5797408	R	36	119					
+HWUSI-EAS610	1	4	79	1262	1484	0	1	GTTGATTTCTCTTTTTCAAACACTTTGTGTTATGCA	``a`_```\^^`____Y`^^YP]```_W^]_]VSW_	chr10.fa		5797580	F	36	119					
+HWUSI-EAS610	1	4	84	1511	44	0	1	TTCAAATTCCCTTCACCAACTCAATTTGCTGCACAA	a`[aaaY\T``SUUZ[[__XV__^BBBBBBBBBBBB	chr10.fa		5797667	R	26G2G6	62					
+HWUSI-EAS610	1	4	64	1004	717	0	1	GCGAAGTGACAGGCAGAGCCCAGGAGATGCTTTCCC	Xa[a`_G]_aa`\`a`U^^^_`\`]a^]`YO^VQ\S	chr10.fa		5797726	R	36	118					
+HWUSI-EAS610	1	4	95	1462	1578	0	1	TTCTTGCCTAACTGTGACAGCTGTGACAGCTGTGTC	a[_aa^WU_aa_aXO]``a_a\\V^[^VS\VODR[U	chr10.fa		5797918	F	36	116					
+HWUSI-EAS610	1	4	66	1174	1188	0	1	GGGTTAGAGAACTATCAGGAAGGTTTGTTAAGGCGT	a`a]a___`^`]a`_^_`a]^``]_^_^`]^YZ\_]	chr10.fa		5797966	R	36	119					
+HWUSI-EAS610	1	4	12	271	1636	0	1	AAGCTGTACAGGGAATCACAGCGGGGACCTTGGACT	XX`babaaaJaabbbababa_baZaa`baaab`Sa]	chr10.fa		5798864	R	36	118					
+HWUSI-EAS610	1	4	71	901	87	0	1	TTGAAAACAAGACCATGGCTCACAACTTACAGCGGA	O__RRU_K_YJ^SO\`babaaT\PXXaa_]]RFY_B	chr10.fa		5799604	R	32A3	102					
+HWUSI-EAS610	1	4	77	1593	648	0	1	AATGAAGTTGGGCCACGTAGCTGCTGACCTTGGCTT	ab`a_]XY\VVYVX_]YY^__^[]SR^VZWSPKT[^	chr10.fa		5799708	R	36	118					
+HWUSI-EAS610	1	4	6	231	992	0	1	TTAACAAGGCTGGAGAGGCGACTCCGGTGGTAAAGG	TX__`QW_T]T[_`YSZWX_XZQXNOIQWYJ\O\WB	chr10.fa		5800233	F	24A1T8T	78					
+HWUSI-EAS610	1	4	86	1040	429	0	1	GCTGACAGGGCCTCTATAAGAGCAGCAAGTGCTTAT	T\a`Saa\_Kaa^TZba\\_`]PPa][`_RK]`_\B	chr10.fa		5800810	F	36	113					
+HWUSI-EAS610	1	4	82	723	1422	0	1	ATTGTTCATCTGAGCATGTTCAGACACAGAATGCTA	aaba]a``]`aa``^a`aaa`]Z]_`_`a_^^`__Y	chr10.fa		5800888	F	36	119					
+HWUSI-EAS610	1	4	100	722	1775	0	1	TTTCAACATCTAATTGCCTGAAAGTGACAGATGCTG	``VZQY]``]aaab]YJH`^[`\`[]R[a[J^]Ra^	chr10.fa		5801021	R	36	117					
+HWUSI-EAS610	1	4	55	1168	162	0	1	TGCAGTAACTACCAATATAGCATCATTCACTATGTT	aaaaa^`a]aa``aaaaaa^aa_``_a^`^``]]V`	chr10.fa		5801207	F	36	119					
+HWUSI-EAS610	1	4	60	16	44	0	1	AGATAATAAAAGAACTGCTGGGGGTATCAGCTTTCC	W^\]MU_RRWU]Y]_ZVYO[WQ]\JSY]Y\]]\ZZ]	chr10.fa		5801571	F	36	118					
+HWUSI-EAS610	1	4	69	1619	1332	0	1	GTAATTGGAAAAGATCTTTTCCCAGTAGTCTGCCAA	Y]PUU]RV_^Z[[PX\]`Q_S`UW\R`aW`[QQY_B	chr10.fa		5801746	R	36	114					
+HWUSI-EAS610	1	4	26	514	406	0	1	TTACTATGTAGCCCAGGCTATTCTCAATCTTACAGT	a]\``aab___]W[^^`XL_`^]`]`\ZU__`]T[[	chr10.fa		5802275	F	36	118					
+HWUSI-EAS610	1	4	81	1369	992	0	1	CATTTGTAATTCTACCACTTAATAGGGAGGTAAGAG	Xabb`U_babbbba`ab_ab_aa^bVb_^^a^_bbb	chr10.fa		5802689	F	36	119					
+HWUSI-EAS610	1	4	85	1064	1327	0	1	CACTTAATAGGGAGGTAAGAGAATTTCCACAAGTTC	ababa^`aabbbaba\abb`ba_aabaaaa^]a`b_	chr10.fa		5802704	F	36	119					
+HWUSI-EAS610	1	4	17	204	161	0	1	ATCTCTATCAGAACACTAGTTATATCAGTGAGTCCC	\^b_^b_babaY^^aba^b_]baa__\`^aabZaba	chr10.fa		5802986	F	36	119					
+HWUSI-EAS610	1	4	56	1161	1156	0	1	AAATCCTATCTTGGAAAACCAACCAACCAACCAACC	aa[[U\X__TV]_]X_a^S[YTDT]]QY\YVQU[ZQ	chr10.fa		5803213	R	36	19					
+HWUSI-EAS610	1	4	56	324	966	0	1	TAAGTTTGAGGCCAGCTTGGTCTATGGAGTGAATTC	aa`aababbaabab^a^`aa_aa``aa_a_a`aaaa	chr10.fa		5803273	R	36	51					
+HWUSI-EAS610	1	4	86	1081	1215	0	1	GGCAGAGGCAGATGGATCTGTAAGTTTGAGGCCAGC	aa_Za``W\^\P^_XQ[_a][^^`^aa]_^^VU\`Y	chr10.fa		5803293	R	36	23					
+HWUSI-EAS610	1	4	33	1298	1491	0	1	CATCTTTTGTACTTAAAAGAAACTGAGGAACCAGGC	UY_VY``Z__^`_^]baZWZb_Q[aa]_XS_a_`]Z	chr10.fa		5803365	R	36	119					
+HWUSI-EAS610	1	4	32	1560	1254	0	1	GTTTCAGAACCTAGATCCACTGTTGAGCAATCCATG	aaba`a`^a_PW]TN\a_`T`[PY_^^[_\_\^_^]	chr10.fa		5803804	R	36	118					
+HWUSI-EAS610	1	4	56	236	605	0	1	TGAGTTAAGCATATGTTCTACTGCTGTGCAGCACGA	aa_b]a^aaaaaa_`^_a`aa_a`^_^a```__`^W	chr10.fa		5803928	F	36	119					
+HWUSI-EAS610	1	4	31	708	1634	0	1	TAAGCATATGTTCTACTGCTGTGCAGCACGATCACA	`XRX[\`a`aZ\X``^^^YWTGW[_^^UO_ZS[RTR	chr10.fa		5803933	F	36	117					
+HWUSI-EAS610	1	4	59	712	1623	0	1	GTGTGATCGTGCTGCACAGCAGTAGAACATATGCTT	abbaaabababbaaab`baaabaa]abXaaaaa_aa	chr10.fa		5803934	R	36	119					
+HWUSI-EAS610	1	4	65	1406	886	0	1	TAATTAGTTATACTTTATATCCTATTGGAGAAAAGG	`aaaa^UW___a_]aaa_`_`_`_a_`V^_]`_^YZ	chr10.fa		5804049	F	36	119					
+HWUSI-EAS610	1	4	68	764	500	0	1	TAAAAAGATCTCCGCATCCCATCCTCTCTGTCATAG	aa_a__a`a]`_[Z^a^_aaa__`^Z\Z[\[[[`]W	chr10.fa		5804097	F	36	119					
+HWUSI-EAS610	1	4	55	25	604	0	1	ACTTTTTGCTTCTCTAGAAACAAGTTGTCTCTCACG	Xabbbbbbbaabbbaba^\S```a^ab_bab`baaa	chr10.fa		5804657	F	36	119					
+HWUSI-EAS610	1	4	72	174	823	0	1	GTGGAGGCTTGAATATGCTTGGCCCAGGGACTGGCA	aZbbabaaaaa_S__^]a^_`aa^`WaaaZa`a`^]	chr10.fa		5805049	F	36	41					
+HWUSI-EAS610	1	4	44	493	749	0	1	AGGCAGCATGACCAAGGCAACTCTTATAAGGACGAC	[Ya_Yaa\]Z^aaaa`]aabZ]]ba^`^[_W\^^X`	chr10.fa		5805330	R	36	12					
+HWUSI-EAS610	1	4	60	1051	1118	0	1	ATAGAAGTCCCTCCAGGCTGTCTCTCATGATAAGTA	`b^b]_a`a[_a^\]`]_a]a[a\a_\VTW_``_T_	chr10.fa		5805627	R	36	119					
+HWUSI-EAS610	1	4	25	510	1366	0	1	ACAGAGCACTACAATGCTAATCGCCTTGGCTGGTTT	abbbbaabbbbbababbbbbbabaabaaaaaaaUaa	chr10.fa		5806035	F	36	119					
+HWUSI-EAS610	1	4	32	873	106	0	1	TATGTCATATATACAACTTTCTATTTTTTACCTATT	_]_a__`a````[__`]aaaY[_a_`_`__^X`_`_	chr10.fa		5806471	F	36	119					
+HWUSI-EAS610	1	4	83	467	327	0	1	AAAGAGAGAAGCAAGACTGNCGGGAGTTCTAGGCTA	ababbbab`bbbbbbbbb[D^bbbab_aa_b^aaba	chr10.fa		5806920	F	19T16	110					
+HWUSI-EAS610	1	4	19	601	1238	0	1	TCCTCCAGGTGTCACTTGGGTCCTCTCTAGGACAAG	a\\_```a`W]T\`]Z^\``Y`XZ]`\`[]`[_Z]a	chr10.fa		5807117	R	36	119					
+HWUSI-EAS610	1	4	62	1017	1071	0	1	AGAAGGAGATTTTAGTTTGTTCAGTCTAGCCTCCTC	R`b]baaababbbb`abbbababba_bb`abbaabb	chr10.fa		5807148	R	36	119					
+HWUSI-EAS610	1	4	86	1446	1027	0	1	CACAGATCAGAAGATGCTGAAAAGCCTCAATGTGCA	Z[UVZ__Zbb]a[a``_baU\UYWD]b]b[Y\^`\`	chr10.fa		5807328	F	36	116					
+HWUSI-EAS610	1	4	13	835	1724	0	1	AATGCACATTGAGGCTTTTCAGCATCTTCTGATCTG	aa`a]S_\^]_[Q[Y`_`\\_`^Z[][_]YYVWX__	chr10.fa		5807330	R	36	119					
+HWUSI-EAS610	1	4	80	708	833	0	1	AGTTTAAGAACACCTATTTATTAGTAGTCTGCAAAG	aabbbbbbbbbbaabbbbbbbaabbbbaabbaabbb	chr10.fa		5807854	R	36	119					
+HWUSI-EAS610	1	4	93	1616	1483	0	1	ATAGCCAAATGCCTCCCTGTCAGGAGCACAGCCATC	aa]UZ_X\a\_ZX^`a_aa_```^XMS_^a\PM_^U	chr10.fa		5807992	R	36	118					
+HWUSI-EAS610	1	4	73	493	1220	0	1	ACATAGCCAAATGCCTCCCTGTCAGGAGCACAGCCA	aaa_`V\^`^VY\`Z]__]Y_UYU^WW\^\\\\\]^	chr10.fa		5807994	R	36	119					
+HWUSI-EAS610	1	4	27	819	1216	0	1	GGGTTCTGGGTGTGCACCATCATACCCTGCTCTGTA	aab\baaa]a\a`a`b`aaaaaaa\^V``^_\aa[^	chr10.fa		5808404	R	36	119					
+HWUSI-EAS610	1	4	77	779	1780	0	1	CATGAGCTCAGAACAGTCTGGCTACTCAGCAAGATC	V_bba]aab]Y]a`a]a`b^Zaaaa]]ba_a_aP\X	chr10.fa		5808462	F	36	119					
+HWUSI-EAS610	1	4	12	1346	360	0	1	GTAAGAACGCACAGGAGATGGACTCGGAGCCAGGAC	a]^a]^_S^Z_W\_W\\\U^PWS\WSTTWUT\TSYU	chr10.fa		5808701	F	36	118					
+HWUSI-EAS610	1	4	38	626	223	0	1	AGCTATATGCCTGATTTGGGGTTTTTTTAAATGGGA	ababbbaabb`bb`abbbaab^aaaaaa__aaa`a_	chr10.fa		5808932	F	36	119					
+HWUSI-EAS610	1	4	14	1362	1743	0	1	GTTTATTTTCNAAAGCAAAGTAGTGAAATAGGGCTA	a]`]_Z][TXDT]Y[U`ZY[ZPYQ_Z\V]WSW\S\B	chr10.fa		5809119	R	10T25	105					
+HWUSI-EAS610	1	4	63	1440	1289	0	1	AACACGGCATACAGTTGCCAGCATAATGCATATGTT	a`^_\S_X_`_^_Q^`aZ^_UZ^]^O__Z^_]^`S_	chr10.fa		5809152	R	4T31	86					
+HWUSI-EAS610	1	4	4	1253	1903	0	1	GCCACGGGAACAAATGGACCGACCCTCAGTGGGACA	aaaa`Z`Xa`^aa\V__X``a^R]]Z\Z\BBBBBBB	chr10.fa		5809358	F	32T3	86					
+HWUSI-EAS610	1	4	79	974	1121	0	1	TGTGTGTGAGCATGTGTGTGTGTTTAATAAGTGAAG	aa^a]`Z`^__]Z_Y_]aZ`_`]__^__^]_Z_W\[	chr10.fa		5809791	R	36	119					
+HWUSI-EAS610	1	4	20	434	1166	0	1	TAGAACTCTCGGCTTCTCCAGCACCGTTTCTGCTGG	aabab_bbabaaa`aa]aa]aba_bbZaab^^a_aa	chr10.fa		5810602	F	36	58					
+HWUSI-EAS610	1	4	67	1441	727	0	1	GCACCGTTTCTGCTGGGAAGCTGCCATGCTTCCTTC	a_a`aa^^__\F\][\_V_`^_Z^^`\__^^]_^^^	chr10.fa		5810622	F	36	118					
+HWUSI-EAS610	1	4	60	681	1805	0	1	ACATGGCAGCAATAGTTAACATTTGTTGTTTTGATT	aa\[aa`_aab`a___a_aa_aa\`_a^[_a[[Y_[	chr10.fa		5811018	F	36	119					
+HWUSI-EAS610	1	4	8	1467	751	0	1	GGAGCTTAGACTGTACTCTACTGCCAAAACGGAAAT	`\^`_a`^W]^`_[]aa_aaaaa\^Y]_```[\a_`	chr10.fa		5811251	R	36	119					
+HWUSI-EAS610	1	4	31	56	1052	0	1	GTATATTTATTTTATAAGCCCATGAATACCCTAGAT	`TQWTRa]N]X`_Z_Z\`aaa]a^_aXY]ba[P\KZ	chr10.fa		5811327	F	36	118					
+HWUSI-EAS610	1	4	9	394	204	0	1	GTGCAAACTTCATAGTCCCTGTTCAAAACTGCAAAA	a_aaa`a`aaaaa`b_aa``b^^`a_`\]`a`_]^\	chr10.fa		5811539	R	36	119					
+HWUSI-EAS610	1	4	28	88	306	0	1	ACATTGCAAAAAAGACAAAAGAATTCATTGAGACTA	]`YO`bba^^`]aaa\FTZ_`S_a`_a_aa]__aaa	chr10.fa		5811676	F	36	117					
+HWUSI-EAS610	1	4	54	394	1408	0	1	CTCCTTTACATCCACGTGTCTGCGTGCTGTATGTGT	aaaa``^aaaaaaa`a_aV`^a`aX\\aaYY`aX]\	chr10.fa		5811952	R	5C30	82					
+HWUSI-EAS610	1	4	61	438	1538	0	1	TGAATATGCTGAGCGACGGCTGAGAGCGTTTGCAAA	abZaaa_aaaa_`a^a___`a``_\_a_Z^`__^\\	chr10.fa		5812211	F	36	119					
+HWUSI-EAS610	1	4	71	461	1087	0	1	TGAGTAGGCCATGGCCTTTTGCAAACGCTCTCAGCC	aa``^]ZU[Z`\aW\YF[^[\UZ\]^`^[FSLRX[Y	chr10.fa		5812228	R	36	116					
+HWUSI-EAS610	1	4	42	1453	920	0	1	AAAGGCCATGGCCTACTCACCCTTCTCTGGCTCTCC	abab_aa`Za^a]a`^a`a`_\a`U]`_^^YQ^^U^	chr10.fa		5812245	F	36	119					
+HWUSI-EAS610	1	4	65	1076	433	0	1	AAAGGCCATGGCCTACTCACCCTTCTCTGGCTCTCC	aabab_a_WX\^_aaY^^`_\]`a^`_^`[Z`]YY\	chr10.fa		5812245	F	36	119					
+HWUSI-EAS610	1	4	45	213	2041	0	1	GGGAGAAACTCACAGCTCTTCTTTGCAGCAGATTCG	`ab`a`aabab`bbabaa``b__aabbaa`b`Y[aa	chr10.fa		5812342	R	36	119					
+HWUSI-EAS610	1	4	19	913	135	0	1	GAAAAGCAGGTGCCATAGTGCTCAAGTGCAAACCCA	aaa`_`^_\TH][U__`_U\ZZ^^\US^\\W]\T^`	chr10.fa		5813062	F	36	118					
+HWUSI-EAS610	1	4	5	739	1563	0	1	GGAGACCTGCTCCAGTTTACTGACTAACGTTCGTCT	a_aa_`a_`a`Y_]`Z`__a]R]\`a]\]P[[_[[_	chr10.fa		5813507	F	36	119					
+HWUSI-EAS610	1	4	64	1595	545	0	1	GTAATAGTTCTGGCTGTTAGTTAAAATACTGTTTGT	_Yaaaaa_``^VY[_W\^JUU_UX_YGQLWDR^\HZ	chr10.fa		5813818	F	36	114					
+HWUSI-EAS610	1	4	55	1636	1940	0	1	ACAAATAAATAAAAATGAAGAGCAAGGACGTCTCAG	]`ba`a_a`aaa^a`Z]aab`aaaaab]`^^`a^`a	chr10.fa		5813989	F	36	119					
+HWUSI-EAS610	1	4	78	1457	1999	0	1	AGATATGGTGTCTCCGATAAAGGACTCTTGGCTGGA	a_GbX_aaN`XURU[aG_W__a_X^X]XNQUUTQNS	chr10.fa		5814199	R	34T1	97					
+HWUSI-EAS610	1	4	30	677	1391	0	1	TGTGTAGTATCTGCCTGCTTGCTCAGTTTTAGTAAC	abbba_abbbbbbbbbbaaabbbbbbabbbbbbbbb	chr10.fa		5814265	F	A35	81					
+HWUSI-EAS610	1	4	2	1328	804	0	1	AACACTGATCCTGGTTACTAAAACTGAGCAAGCAGG	`bHRSYWWLY``_\PW_X^^UYWRZ`_a]a`XSS_Y	chr10.fa		5814278	R	36	117					
+HWUSI-EAS610	1	4	19	201	1571	0	1	TATTAAAGGATTGCAGTGTTAGGAAGGGTGAGGACC	^`abbaXaba`^aaababZ^^^`aY``bWba^aabb	chr10.fa		5815216	F	36	42					
+HWUSI-EAS610	1	4	15	1768	1752	0	1	CCAGGCAGGACATTTTCAGGAAAAAAAAATCCAGCC	_b_\_`a``bbbbbbbb``aababa``bbb`^abba	chr10.fa		5815322	R	36	119					
+HWUSI-EAS610	1	4	82	1686	1209	0	1	TATTTGCAGATGTGTCCTCAGTGAAGGTCACCTCTG	`aaa_Z^^O^XZV]Y^^__`ZZ_YVXVPWVS^[[^[	chr10.fa		5815684	R	36	118					
+HWUSI-EAS610	1	4	97	76	1092	0	1	ATTATTTTGATATTTTTGAGACAGGGCCTATGTGTG	aa_Y]abb_^^Yaa_a`a^``b`_^^F]W^`a]aQa	chr10.fa		5815895	R	26T9	108					
+HWUSI-EAS610	1	4	95	523	1309	0	1	CATGACATGCACAAATAGTTGATTCCTATCATGAAT	aabaaa`aaa`^`a^`Y^^^`]`ababaa__`_XX_	chr10.fa		5816531	F	36	119					
+HWUSI-EAS610	1	4	90	1144	634	0	1	ATGTGGCCCCTGAGAGCTGGTCAATGGAGCTAAGAG	a]^^^Y\]\V[]_`^aa]^`]\[YYYQTU\W]^[[U	chr10.fa		5817337	F	20C15	85					
+HWUSI-EAS610	1	4	63	1495	586	0	1	TGTGGTGGCCTGCTCTTCTGTATCTAATATCTTCTA	a][`\]\__aa\^]Y]_[a][``__]`_]^]`_^__	chr10.fa		5817424	R	36	119					
+HWUSI-EAS610	1	4	57	561	666	0	1	TCCACATTGAAGTTTGATTGTGATCACACACTAACT	aaabaaa`a`aa_ab_^aaa_aaaaa`a`a_``a`a	chr10.fa		5817549	R	36	119					
+HWUSI-EAS610	1	4	93	1785	1485	0	1	CTCAAAGTCAATAAAAAGTCATGACCCTACACCCAC	aabbaaa_abbaaaaabaaabbab_a`_baba``b[	chr10.fa		5817952	F	36	119					
+HWUSI-EAS610	1	4	37	1476	1567	0	1	ACCCTACACCCACAGCCCGGTAGATAGCATCCTAGG	aabaab`a^aa`]a[[Ua\^^`]_T^^ZZ^VU^\[\	chr10.fa		5817975	F	36	119					
+HWUSI-EAS610	1	4	36	225	1615	0	1	CATGCACCCTAGGATGCTATCTACCGGGCTGTGGGT	`[]aaaaaa`[aa`^_`YPZa^^`a^\__[^P_]`S	chr10.fa		5817982	R	36	119					
+HWUSI-EAS610	1	4	46	1460	97	0	1	AAAACGTCTACCATTCTTTCTATGCATGCACCCTAG	`\aa^^```b[]_`aaa`]Zaa_[[`YS]X\XNQJ]	chr10.fa		5818006	R	36	118					
+HWUSI-EAS610	1	4	95	998	151	0	1	AGAATGGTAGACGTTTTGGGGTTGTGTTTTAGGGGG	`[UH\UU\ZV]_UNN`_`_]ZQWXLU[[_^LN[^^_	chr10.fa		5818025	F	36	117					
+HWUSI-EAS610	1	4	49	523	1051	0	1	GGCACTGGGACAGCTCTGTTGGGGGAAAGGTCAGCT	`_a`aaa```a__aaa_``aa[``aYa^a^^`^_]a	chr10.fa		5818201	R	36	119					
+HWUSI-EAS610	1	4	29	448	969	0	1	AGAGGAGAGGAGAGGAGAGGAGAGGAAGAAGAAAAG	abaab`baba]__baaaVabaa_b]]`aaaaa`Y^[	chr10.fa		5819435	F	36	8					
+HWUSI-EAS610	1	4	68	1275	276	0	1	CGCTCCTCACAACTAGGCAAGCGCTTTAAAGACTTA	aa`a`aa_aaa``aaUT^`a`]```a`^Z__UZa`Y	chr10.fa		5819631	R	1A34	81					
+HWUSI-EAS610	1	4	75	1289	1420	0	1	TGACACATGCCCTAGCACTCATTCTAATCAAGAAAA	_Ka`[aaa`]`a]\^aa`_`^a_^a_ab__\]X^[X	chr10.fa		5820137	F	36	118					
+HWUSI-EAS610	1	4	52	760	1215	0	1	TCTACACAGTGAAATCCAGACCAGCCAGGCTCCACT	aa_``a``b``_a^``\`a]`_`^^^`a`\W[W\_`	chr10.fa		5821169	R	36	119					
+HWUSI-EAS610	1	4	28	1085	622	0	1	GGGCCAAGTCAAGAATTCTATCTCAGAATTCAAGAG	aaX`^abba\baaaaabaaabababaaabb`aaa`a	chr10.fa		5821244	R	36	119					
+HWUSI-EAS610	1	4	25	891	510	0	1	GATGTATGTAAGAGGCAGAAGTAGTCACACAGCTGA	a_``[Y^aV^[^[[Z[X_[[]U\PW]]^^WOOQS[]	chr10.fa		5821328	R	36	118					
+HWUSI-EAS610	1	4	45	1316	1585	0	1	TGTGTATGAAGCTCACAGCATCATAGGACGGTGTTG	_a^aW`aa\_`^_[^^U_R^^^_`^__^W^]TV\[^	chr10.fa		5821812	R	15T20	84					
+HWUSI-EAS610	1	4	38	427	163	0	1	AACACCGTCCTATGATGCTGTGCGCTTCATACACAG	[]bbbaa_ab[a`[[Vb``_a[ORaa^baba`b\Xa	chr10.fa		5821813	F	19A2A13	63					
+HWUSI-EAS610	1	4	78	140	1049	0	1	GTATAATGGTAAGGGTACAAGAAGTGAGCACAGCTC	aY`_Z^aaaY]_``_S\`__[\a_W_W___]_W_Z_	chr10.fa		5821972	F	36	119					
+HWUSI-EAS610	1	4	38	3	1240	0	1	AGCACAGCTCCAGGCTAAAGCATGGTCCCNCANCAC	`abaaa]`a`a]]aa]a``a`^^Y_W\\BBBBBBBB	chr10.fa		5821998	F	29TA1G3	77					
+HWUSI-EAS610	1	4	53	1066	693	0	1	CCCGTTGTTCCTCGGCATGTTAGCATTCACCGAATC	aabb`abababbaaaabbabbaaaaaa_`^_a``a_	chr10.fa		5822535	R	36	119					
+HWUSI-EAS610	1	4	66	246	1409	0	1	GTTAACTCACAGATATCTCAGGTAACCACAGAAATA	aaababaaabba_aaaaaaaa_Tabaa_aa_XQ`aV	chr10.fa		5822660	F	36	119					
+HWUSI-EAS610	1	4	3	1235	1297	0	1	CATAGCGAATACAATCAACCAGTATTTATCAGCCAA	abVJ_\UUaba_a]aUWa^abb_b`[^ba__a^aBB	chr10.fa		5822801	F	36	110					
+HWUSI-EAS610	1	4	2	667	812	0	1	GAGGAAGAAGGCCATTCATTGGCCCTCCTCTGACCT	aZ^`^`_Q_\\]\^\\\`\`\\U\\UYWWWBBBBBB	chr10.fa		5823429	F	32T3	90					
+HWUSI-EAS610	1	4	27	285	148	0	1	AGCTGGTGCAGCCAGTTGGGGAAAGTGCTGGGGCTC	_`a_a_^`aa``a^a`aaa````^^]_\``\^aa``	chr10.fa		5823522	R	36	119					
+HWUSI-EAS610	1	4	70	634	132	0	1	ACTGACTGTATTTTACACACAGGAAATAGGAAGCAG	_b\b`b_YI[`aaaaaYbaa`baP`baa\UY\__a]	chr10.fa		5824213	R	36	118					
+HWUSI-EAS610	1	4	22	1341	880	0	1	CATGTTCTCTCTGCCATCATGGACTGTATCCCATGG	abb_aaabaaaaaaaaaa``aaa`aa^aa__aa`aa	chr10.fa		5824288	F	36	119					
+HWUSI-EAS610	1	4	65	900	1468	0	1	ACTGAGGTGGAGAGAAGTGGGAAAAAGCAACCAATC	abbb][aNb]_ZT]]XaZ\T]XV_V\a_aa]`aSa^	chr10.fa		5824909	F	36	118					
+HWUSI-EAS610	1	4	69	915	1402	0	1	GAGAGAAGTGGGAAAAAGCAACCAATCTCTAACTCC	aab`a\_aYaaaa___aaaba`_`_`V`^`a`]``^	chr10.fa		5824918	F	36	119					
+HWUSI-EAS610	1	4	18	875	1156	0	1	AGGGCTCAGAGGAACCTTCAGCAGGCCGTACCTGAT	aa``aaaaaXaaa`a```]a`aaa_^_`\`]]_]]Y	chr10.fa		5825570	F	36	119					
+HWUSI-EAS610	1	4	77	1594	1138	0	1	AGCTGAATCAGGTACGGCCTGCTGAAGGTTCCTCTG	a]aa`aaa`a``^_]`[aab_a_`^]WYW\S^^Y`Y	chr10.fa		5825576	R	36	119					
+HWUSI-EAS610	1	4	47	152	1642	0	1	TACCTGATTCAGCTTGTCTTTCTCCTCTGCCCAGGA	`W_aabbaab[aaba_\_aab`aa``aaaab]LVVB	chr10.fa		5825598	F	36	114					
+HWUSI-EAS610	1	4	5	78	836	0	1	CTGTACAAGGAGCCCACATTCCTGAAAGGACAGCTC	`a\___Zb_M\OSZ]^[`]R]`\U_W_QKGTGSZ_a	chr10.fa		5825742	R	36	116					
+HWUSI-EAS610	1	4	8	682	1990	0	1	TTTAATGTGATTGCAGAATTGGCAGATAGTGGCCTT	_^`ZbaNUbb^`_b^\_a]VYaZRSbaXII[aTJL_	chr10.fa		5825959	R	36	117					
+HWUSI-EAS610	1	4	34	1212	629	0	1	AGGGCTCACCCAAGCTTACACCCCTCCCATAATCCT	ab__a```aZ^aa_]aabaaa`a_a``_``_^a\^`	chr10.fa		5826020	R	36	119					
+HWUSI-EAS610	1	4	41	1508	1515	0	1	TGCAGCATGATGACAGTGACATGGTAGGCTAAGGGG	a`Xa``aaaa_]____GYVZTZT^UUXIHJOU`N\B	chr10.fa		5826059	F	36	111					
+HWUSI-EAS610	1	4	72	1150	1177	0	1	AAAACAGAACAGTTGTTTTTACGAATATCTTTCTAA	abaa``a`a_aa_aa_abbba_aa_a`_Z__a]a_[	chr10.fa		5826184	F	36	119					
+HWUSI-EAS610	1	4	92	284	1482	0	1	CGTTGGCGTTAGCATACATGGGACTTTTTGCTTCCC	ababba`a`\_\]]]^_`][[[U^a_a_Y_`_`_\\	chr10.fa		5826260	F	36	119					
+HWUSI-EAS610	1	4	68	1377	271	0	1	TGGCTCTGTAGAGTGGCTTATCTATATGGCCAGTAA	__aZU^aaZ`a`WOWVZWZYZQ`aXPRS[NO^ZZ^a	chr10.fa		5826339	R	36	118					
+HWUSI-EAS610	1	4	12	647	1411	0	1	GAGCGAGGAACAGAACTGAGCTGTGAAATGTGCAAG	aaa]ba\[U__aa_a`a``a_aRF``XJ[^T[UMY_	chr10.fa		5826457	R	36	117					
+HWUSI-EAS610	1	4	90	1299	340	0	1	TGAACATGAGGATGGAGGAAGTATTCAAGAGCGAGG	aa``__a_]`a]_[[`^^`aaV`a_]`____V]_Y^	chr10.fa		5826485	R	36	119					
+HWUSI-EAS610	1	4	47	93	1256	0	1	GGGGGCTGGTTTAGGCAGGCGGATGAAAGGGGTACT	_`a``aaa`\``aa__P_`a`_XX_\TV\a_YWQ[X	chr10.fa		5826550	R	36	119					
+HWUSI-EAS610	1	4	22	113	846	0	1	GGATGACATCACCCACCTCTGTACCATTTCGACACC	`_T\bbbbaaabbb]bb`ba`_abbabaaba`aa`_	chr10.fa		5826660	F	21C14	83					
+HWUSI-EAS610	1	4	4	27	214	0	1	ACTGGCTGGGGTTGTTTCAACTTGACACAAGCTAGA	a`U_a_Y`aaNXXZY__]]`_WU]]Z^__^]GY][B	chr10.fa		5826982	F	10T25	30					
+HWUSI-EAS610	1	4	64	1773	259	0	1	CTTAAGATATTTTCTCAATTATGATCAAAGGGGACA	`aab_T\__S_[VaXZab^b_`I^VV[`^`]TN]aa	chr10.fa		5827068	F	36	118					
+HWUSI-EAS610	1	4	9	1631	1393	0	1	ATTCAGTTTACACTTCCAGATCACAGTCCATCATTG	_`\`a\]SZ]RYSa_a`aV_a\a___[]^a__^_[`	chr10.fa		5827284	R	36	22					
+HWUSI-EAS610	1	4	27	588	690	0	1	ATTTGCATGCAGGTTAAAGGCACTCTAAACATGGGG	abab[aa^Zbaaa^a`aabaa``a``]\_^a^^^`a	chr10.fa		5827453	R	36	119					
+HWUSI-EAS610	1	4	89	1635	517	0	1	TAAATCTTCATCCGATGCCTCTTCATGCTTCTTGTC	aa_aSXS\[YZ\PY]ZR[SOLZ^]_OV[_WORRPZ]	chr10.fa		5827500	F	36	117					
+HWUSI-EAS610	1	4	7	1412	372	0	1	ATGAAGCTGAGCCCGAAATTCCTCGTGCCTCCGGAG	aa]a_\U`W_\^SP\_``_S[^]W\W\W\\\TSWW\	chr10.fa		5827551	F	36	118					
+HWUSI-EAS610	1	4	18	1300	827	0	1	AAACTGTTCAAAGGAAAATGAGGAGTCTAAGAAACA	^_^aSH_a[VW]_bbVUU\`bb[^aaaa^[WQ``_a	chr10.fa		5827600	R	36	118					
+HWUSI-EAS610	1	4	56	969	76	0	1	GCTGACACGCCTCATTTGCTGACAGGTCTGAGCAGC	_]]`a_a\a^Z_V_aa``_``^^^`^W\^]TQS\\Q	chr10.fa		5827773	R	36	119					
+HWUSI-EAS610	1	4	40	213	738	0	1	GTGCATGAGTGTTTGCTTACATGTATGTATGTGTAC	\HaaY`\U\Q\X`aba_\\\bb\_a``[^^_[a^[b	chr10.fa		5829008	F	36	25					
+HWUSI-EAS610	1	4	67	1461	83	0	1	GTGCATGAGTGTTTGCTTACATGTATGTATGTGTAC	\VHZ]WQZNZa[TZX]_`\`_ZUP]V]][]`TRSUV	chr10.fa		5829008	F	36	22					
+HWUSI-EAS610	1	4	72	889	2014	0	1	TAGATTAACAGTTAGGAGCACATCCAAACTCTTGCA	aaa_`aaa`^`Z```a`[`aZJ[_^a___^]^]]_^	chr10.fa		5829161	R	21T14	104					
+HWUSI-EAS610	1	4	6	1195	1790	0	1	AGTGGACAATTAATGAACACAATTATGCATTGGATC	aa`aa^Yba_`a^aaaa_`[```\_aa^_a_a__\_	chr10.fa		5829486	F	36	119					
+HWUSI-EAS610	1	4	68	436	306	0	1	AACTGGAACAGCAGGAATGAAGGAGAGAAAAGTAAC	]abVa`ab]baYWa`b_ZaU\b`SYHaV_R_^U]^a	chr10.fa		5829869	F	36	118					
+HWUSI-EAS610	1	4	70	1321	275	0	1	GACACAATCTAGTTTGTGCATTAACAGGGTCACTCT	YZ]aV^TTYaY]OX_VW``aa^_]ZX_YZQ][\`\a	chr10.fa		5830004	F	36	118					
+HWUSI-EAS610	1	4	43	1385	169	0	1	AGTGTTATTGGGGTAACAAATGAGAAATGGTTAATA	aa`a`a_`ba[^^Y__``Y^``_X^a_a_\[_`__`	chr10.fa		5830470	F	36	119					
+HWUSI-EAS610	1	4	15	157	1613	0	1	GTGATAATTTCATTCTTCCAGATGCCAGGTGAAATA	_Wb``aY^aa^W__baabb\a`\aba\`aNa]a_[`	chr10.fa		5830592	R	36	119					
+HWUSI-EAS610	1	4	100	154	1362	0	1	TTTCACCTGGCATCTGGAAGAATGAAATTATCACCA	aaabbababaa^`baba_]aa_a`[aaaaaa``aa^	chr10.fa		5830594	F	36	119					
+HWUSI-EAS610	1	4	60	133	1257	0	1	AAAAGCTCAAGAGCAGCCTATGGCTACACAGGGAGA	\R\R]b`aa[a_`aa```^[Wa_`[_YP\T_^^U_Q	chr10.fa		5831018	F	36	118					
+HWUSI-EAS610	1	4	96	423	1211	0	1	GCCAAGCCTATTCAAACCACCACACTCTCCCTGTGT	aTZ`ZNNUYOVYPVX^VNUQ[YW^W\\\SU^W\VNS	chr10.fa		5831043	R	36	28					
+HWUSI-EAS610	1	4	31	1068	940	0	1	TGGGAGCATGGCAGTGTCCAGACAGATGTAAGGCTG	aabb`abbbaabbbUb]Sabab`ab_aa^aaa_``a	chr10.fa		5831248	R	36	119					
+HWUSI-EAS610	1	4	63	1210	393	0	1	TGTAAGCCAGACCCAACTAAATGCTATCCTTTAAAA	ab`aaa`^a``_\``a^a_`_``^`_a]]```^Z_`	chr10.fa		5831315	F	36	51					
+HWUSI-EAS610	1	4	31	1442	967	0	1	GGTCATGGGGCCTTTTCACAGCAGTAAAACCCTAAC	a`abbaaU_aa`baaaaa`a`^aa[aa_]\`]a^``	chr10.fa		5831361	F	36	36					
+HWUSI-EAS610	1	4	73	1634	1421	0	1	GTGGAGGCAGAACAATCTCCATGAGTTCTCTGTAGA	aaa`a__`aa__]a[[`aa_`a`__`^_a___Z`ZQ	chr10.fa		5831589	F	36	119					
+HWUSI-EAS610	1	4	4	387	1270	0	1	AGCTCCAGGAGGAATCAGCAGCGGCTTCAGCTTCTA	``babbaaaaba`aaaa`aaaa``]]ZZU^\]_]]]	chr10.fa		5832317	R	24T11	85					
+HWUSI-EAS610	1	4	79	494	1365	0	1	TAGCTCTCCATTTCCGCCTTCAGCTCCTGACAGCAA	aabbaaaaaaaba`b`ba`a_O_baa__`R\``_^a	chr10.fa		5832412	F	15A20	82					
+HWUSI-EAS610	1	4	91	896	429	0	1	TTATGGTCTAGAAGGCCGATGGGAGAGATACCATGA	]abbaa_`abb[a``Yabbaa``aa^^`^___[_aa	chr10.fa		5832954	R	36	119					
+HWUSI-EAS610	1	4	61	1498	744	0	1	TTTCCCCCAGGAATCTGAATATCATTTTTTTCTTTA	aba]```\_YY^\`Y_N[_aaa^]a`^\a`^^^[a`	chr10.fa		5833000	R	36	119					
+HWUSI-EAS610	1	4	19	1448	1378	0	1	CAGAGCTGGTAAGAAGGATTTCTGAATCCTTTTTGT	abb`aaaa`]a`a_a`aaaa````^`a_`_aa_``^	chr10.fa		5833360	R	36	119					
+HWUSI-EAS610	1	4	58	1094	1360	0	1	TCATGCATGCACACTCACATACTCACACATACTCAT	aaa_a_``a__^^^`^^_^`_^a^\X]Z]`^Z_]_`	chr10.fa		5834216	F	36	59					
+HWUSI-EAS610	1	4	78	1041	1965	0	1	TGTGCATGTGTATGTGTGTGTGTATATATATGCGTG	a__a^_\^_^]^`a^_]a]a^`]]_^a[_]_^Y_\Z	chr10.fa		5834253	R	36	45					
+HWUSI-EAS610	1	4	31	599	248	0	1	TGTGTGTGTAAGTGTGCGTGCATGTGTATGTGTGTG	aaUaaa]aaaY]VbaZQ]Xa^`S`[a_aaSX]N`Ha	chr10.fa		5834269	R	16T19	7					
+HWUSI-EAS610	1	4	39	1316	1242	0	1	GCACTCCCCATCAGTGAACACACACATGAGCACACA	_^b_WY[aZ_ZXZ[]`^a]OG[a_Za^Y[\\]L[_a	chr10.fa		5835039	F	36	117					
+HWUSI-EAS610	1	4	59	1663	1567	0	1	TGAGAAAGATTTAGATATTGAGAAAAATGGCAAAAT	a``a_W``_^aaaa_^aaa`^aaW____^_^^__^a	chr10.fa		5835313	R	36	119					
+HWUSI-EAS610	1	4	55	531	902	0	1	GGAGAAACAGGATGGCAGACATTTGCAGGAAGGCCG	a``b`]]][``\__]ZZa``a`a_`]X]]Z][Y\\_	chr10.fa		5835378	F	36	119					
+HWUSI-EAS610	1	4	35	877	4	0	1	GCCAGCATGGAAGCCTGTGTATGCCTGACTCCTGAA	aaa`aaaaa``_`^_aa_b\```_\_`^\V\^YXV_	chr10.fa		5835492	F	36	119					
+HWUSI-EAS610	1	4	90	872	113	0	1	GCTGTAGGGAATCCAATAGCCTCTCTGGCCTTTTCA	a``]U^Z^a\__\^aa_`a]^^U_\^_`SW\]^]\^	chr10.fa		5835524	R	36	119					
+HWUSI-EAS610	1	4	43	1603	1369	0	1	TATCTTCAACTCCAGCTGTAGGGAATCCAATAGCCT	`abaaaaaba`_`__]_a__^W_]_^]_]_ZZ^^]_	chr10.fa		5835538	R	5A30	81					
+HWUSI-EAS610	1	4	55	161	465	0	1	AAAATGCTGGACAAAGGCAACTGAGAAAGTTACTGG	_^R_abbaaa`a_\\Z`ba^\````_``^T\``X]]	chr10.fa		5835596	R	36	119					
+HWUSI-EAS610	1	4	6	1249	1864	0	1	TGATATTGCAAAATGCTGGACAAAGGCAACTGAGAA	aa``a`a`_`_``a_`a`_`_`____\]]Z_`^`]]	chr10.fa		5835605	R	36	119					
+HWUSI-EAS610	1	4	65	1239	563	0	1	TGAGAGAGGTCACAGAGAGGAGAATTTCATGGAATA	_bb_NW\aI`[\\baRP_``bbaZ^``YOWaZ\Yaa	chr10.fa		5835771	F	36	118					
+HWUSI-EAS610	1	4	47	69	1627	0	1	AATGACAGCCAGAGATGACTGGACTACCACCAACCA	aSaa`a`a`a_[T_IR_^_N^ZF[ZNW__\a_W__B	chr10.fa		5835844	F	36	112					
+HWUSI-EAS610	1	4	1	1557	1751	0	1	TGACAGCCAGAGATGACTGGACTACCACCAACCACT	^_]YW^Raa`aaa_aXV^`\XT\\PYTWO^ZYJ_\`	chr10.fa		5835846	F	36	118					
+HWUSI-EAS610	1	4	77	654	1775	0	1	AAAGTCATCACACAACCCAGAACTGGACAACAAGCA	[bab]aba`aaa`_bab`bb^ba_aa`aaa_b_X``	chr10.fa		5835909	F	36	119					
+HWUSI-EAS610	1	4	78	264	1319	0	1	TGGCAGTCCACAAGATGCCAAACAAAGCTCTGGGAC	aabbT`Z`a]`a]TTWaab\KQZbbbaaab`\\b`S	chr10.fa		5835962	F	36	118					
+HWUSI-EAS610	1	4	58	925	1843	0	1	ACTGAGTGTCCCAGAGCTTTGTTTGGCATCTTGTGG	aa`[\XaaX_a`XW]aa^baaaa__]^[`[`X\PT_	chr10.fa		5835969	R	36	119					
+HWUSI-EAS610	1	4	10	356	121	0	1	TGCCCTAAGAGCTCCCCTTCAGCCTCTCCTGCTCTC	`aaaaa`````aaaaaa`a``a```_`aa``a\]\a	chr10.fa		5836061	R	36	119					
+HWUSI-EAS610	1	4	35	1764	1635	0	1	GTTGGCTACATGCAGCACACTGTACTGGTAGCCCCG	`W^`^^\QH[TFT\Y]ZJVX\`SQOPK[PS[QVNQY	chr10.fa		5836511	R	36	115					
+HWUSI-EAS610	1	4	9	1087	188	0	1	GACCCAGCAGCTCACCTCTCTAGCTACACCTTGACA	Z_`\``H\a^aa_X]aa\^``a^`]aaaX``_a]_b	chr10.fa		5836607	F	6A11G17	71					
+HWUSI-EAS610	1	4	6	1251	1474	0	1	TGCACTTGTGGGGAAAGTTGTCAAGGTGTAGCTAGA	abaaabaa`b`]FTb[b`abaaa]aaY`]`a__a``	chr10.fa		5836625	R	12A22C	71					
+HWUSI-EAS610	1	4	41	930	563	0	1	TGCACAGGGACATGTGGGAAGATGATTAGCACCCTG	abab`abaaaaaaa_aaaaaba`a_``aa`a_^^`a	chr10.fa		5836657	F	36	119					
+HWUSI-EAS610	1	4	70	1452	368	0	1	CGACCATTTGTTTTCTCACGTAATGTATCCGGATTA	`bbb_babba]``aabb_`b^ab\X_ba`^aa_aba	chr10.fa		5837442	F	36	119					
+HWUSI-EAS610	1	4	23	733	2008	0	1	AAAACAAAGCTAACACATCGGAGCTTGACAAGACAT	````aaa\_^a`_`ba``a\U`^_``^^ZX__^]Z_	chr10.fa		5837596	F	36	119					
+HWUSI-EAS610	1	4	48	1649	828	0	1	CTTGTCCACACACTCAGGAATCCTGTAAAAACACCA	ab\V]a`baaaaa_baaaaaa```WSaa_P]aaaX_	chr10.fa		5837674	F	36	119					
+HWUSI-EAS610	1	4	76	267	943	0	1	AGCACGCACGGAGCACACACAGGGCTTGCACAGGTC	R`aa`_aa_a__a`a``^U_]`_Z_Xa__V_R`]PZ	chr10.fa		5837749	R	25C5G4	67					
+HWUSI-EAS610	1	4	23	1074	694	0	1	TGTCCATTGGACATTAAGATAGCCAGGCACTGTCGG	aaa^]abaZWU`\``^b[a_`Z^Y_[JY`X`^BBBB	chr10.fa		5838713	R	35T	99					
+HWUSI-EAS610	1	4	17	1127	933	0	1	ATGTGATATTTCAATACATGTATATGCTATGTGATG	aab_``aaabbaaa`^]^ba_`a`ab]a_ab_a_aa	chr10.fa		5840528	F	36	67					
+HWUSI-EAS610	1	4	77	1006	1147	0	1	GTGTACAACAGTCTGCTGTCGTGTTGTAATAAATGT	a^`][ZX]X^^ZZ^_X]_X\_XWY[WZ]Z^]ZZ^\^	chr10.fa		5841591	R	36	119					
+HWUSI-EAS610	1	4	13	719	1671	0	1	ACACCTCTCTTGCTCTCAGCTTTCCTCAGTTGCCTA	`_bab_aba`^^abaaaaaaab^\_aaaa`[aaa_Z	chr10.fa		5842051	R	36	59					
+HWUSI-EAS610	1	4	87	1468	381	0	1	CTCTTGTCTGGGGAAGAACACCTCTCTTGCTCTCAG	T_Xb]`[`TX`_T_^[^bbabba\\\a^W_`TH]YB	chr10.fa		5842068	R	36	114					
+HWUSI-EAS610	1	4	70	638	1773	0	1	CATGTTTTAGGGCTGACCATTTGGCTTTGTACAACA	aabbaaaaa``_`baaaaaaaaa_aaaa`_a`a`aa	chr10.fa		5842114	R	36	71					
+HWUSI-EAS610	1	4	35	1755	1469	0	1	TGCAAACCATCACAAATACAATTATAACATGTTTTA	a\T_[RT]\QWLXa[`]aXa^^[V^aY]_YZ]Q\`W	chr10.fa		5842141	R	36	118					
+HWUSI-EAS610	1	4	86	1303	1651	0	1	TAAAACATGTTATAATTGCATTTGTGATGGTTTGCA	[ba]aVR`]ZQ^U_]bb_J[babb[ZGaWFO\aaUa	chr10.fa		5842141	F	18T17	101					
+HWUSI-EAS610	1	4	97	1575	1699	0	1	CCTGGGCCGAGCATATGCAAACCATCACAAATACAA	ab[ba`abaaaaaaa[__bb`V[\]`]GW__a]_\_	chr10.fa		5842156	R	36	21					
+HWUSI-EAS610	1	4	11	1137	762	0	1	TGCATATGCTCGGCCCAGGGAGTGACAATATTAGGT	aa`a_`_VZ^Y^XUT\__X[ZXS[\ZN\\T\]LU^B	chr10.fa		5842173	F	36	30					
+HWUSI-EAS610	1	4	54	510	1899	0	1	ACCAGCAGGGCCACACCTAATATTGTCACTCCCTGG	a`aa`_`YUY\^^[^_^^`_^^`\^W^^]\ZTTYU[	chr10.fa		5842187	R	36	119					
+HWUSI-EAS610	1	4	53	1442	716	0	1	AGACAACAAAGCTAACAGTATCATACCTGTTCAAGA	aa\]ab_^]`a`a]aR\QTaa`aa___``_]_a`V\	chr10.fa		5842611	F	36	119					
+HWUSI-EAS610	1	4	12	585	1646	0	1	ATTGGATCCCTTGGAACTGAAGTTATAAATGGGTTG	[`]ZW\\W^`]b`\QY\^``K]QZ`_`bVPOSXJXX	chr10.fa		5842736	F	36	30					
+HWUSI-EAS610	1	4	37	1491	1214	0	1	ACAGTGGGCTCGAAACTGGGCTACCTGAGTTTTGGA	\_]b`_[`\b``T^YZQ_]a`ZbQaaZaaV`a_G\U	chr10.fa		5843737	R	36	118					
+HWUSI-EAS610	1	4	79	298	165	0	1	CGGGGTGGGGAGACAAAGAAGCCGGGGTGGGGAGAT	_a``_]\_Xaa\`^VQ]XPG_`X`[]WV`WT`^ZBB	chr10.fa		5843884	R	36	4					
+HWUSI-EAS610	1	4	5	795	1516	0	1	CGCTTGCATGTTCCTATGTTCCCCCTTTCTCCTGAG	abaaabX]`aZ_]Q]`^a\aa\[_Y[]\\]`[`\Y^	chr10.fa		5844402	R	36	119					
+HWUSI-EAS610	1	4	72	98	80	0	1	TTCCTATAAGAATTCATGCAGCAAAACACCCATGGA	`aba^^abbab]aaaa\`aaaaa^]`aa_aa__`_Y	chr10.fa		5844460	F	36	119					
+HWUSI-EAS610	1	4	31	175	499	0	1	CATGCAGATCTGGGATCATTGGCATTCTATAATTGT	aa`bbabbaba`a_^`aa]_aaba`aaaa`_aa_a^	chr10.fa		5845239	F	36	119					
+HWUSI-EAS610	1	4	43	1706	947	0	1	GTTTAGTTGTTTCTATAGTTTATTCCAGAATGAGTC	[W_``\`^V^aaS^Va]H_ab\`b\N_VPa`^T^^^	chr10.fa		5845458	F	8A27	91					
+HWUSI-EAS610	1	4	20	542	1140	0	1	AATGATGCTGGGACAACTGGTGCTTATCATGTAGAA	`UZ_]aaaaaa`_YR`\aa\Xa_a_a`_^a_`[_[_	chr10.fa		5847873	F	36	29					
+HWUSI-EAS610	1	4	75	530	1697	0	1	CAAGAGACGGCTATATCATATCAGGGTCCTTTCAGC	aaa`\`\a]a``][]^``^`[^^[[]M__``^V]\^	chr10.fa		5849143	R	8A27	34					
+HWUSI-EAS610	1	4	95	805	1786	0	1	GAAAGGACCCTGATATGATATAGCCGTCTCTTGTGA	[\OX\bbY__^TT`a_P_\a]`Tab_`_a]aaba^W	chr10.fa		5849146	F	24T11	37					
+HWUSI-EAS610	1	4	28	649	421	0	1	TGGAAACTGAGCTGGGACATAGCTCTGCTAGCAGCA	abbaaa`a_a_aU\a[_`aaaa`^_\\_^``b][^`	chr10.fa		5849694	R	25C5T4	47					
+HWUSI-EAS610	1	4	100	1149	807	0	1	TCAGGTGTCTGAGAGCTTGGTGAATTAGTGTCAGAT	^[`a`[]QXY]R]MZY_^WZY_LX`[^_W_I\WZ^^	chr10.fa		5849814	R	36	117					
+HWUSI-EAS610	1	4	60	124	52	0	1	GTCTTCCTCTTGTGTCCGGCTTCACTTCTGGGGCGA	^[`RZa]_^WUZ]\YW`\`ZG\ZV\YQK\TTZBBBB	chr10.fa		5849895	R	33T2	97					
+HWUSI-EAS610	1	4	87	1236	1551	0	1	TCCTTCTAAAAGTTGCTCTTGTCAGCTGGGCAGTGG	`^``]aaa^RYXHWZ\__`][Xa`]U_SXH[ZXU]Z	chr10.fa		5850180	R	36	117					
+HWUSI-EAS610	1	4	46	1676	342	0	1	TATCCATCCACCTATCTACNATCTATCTATCTATCT	^b\aabaa_ab^aa_aaa]D]a`a`aaaa_^_`]`a	chr10.fa		5850464	R	19T16	22					
+HWUSI-EAS610	1	4	32	522	323	0	1	TCTTACGAGGGACAACATTTAATTGGAGCTGGCTTA	V_a^X^b`ba_]]`b^```]baaaba]_aaaaa]\b	chr10.fa		5850620	F	36	44					
+HWUSI-EAS610	1	4	66	939	933	0	1	TGAGAGTTCTGCATCTTGGTCTGATTGCAGCCAAGG	a`ab_aSbaaaaaa[`a``]_aa[aaaa^a`a_`^`	chr10.fa		5850736	F	36	48					
+HWUSI-EAS610	1	4	87	727	1099	0	1	TGCAGAAGAGACAATCTCCCTTGGCTGCAATCAGAC	ZaY[`\_a`U^]_]Ybaaa]Zaaa_V_SY[P_TY[^	chr10.fa		5850754	R	36	119					
+HWUSI-EAS610	1	4	78	1320	838	0	1	TTAGGTGGTGTGTTCTGGTTGGAGTAGGTGTGGTCT	`[X_aRZWV[XU[]]^```_]X]_N_Y[YSZ_WU]a	chr10.fa		5850853	R	36	36					
+HWUSI-EAS610	1	4	43	1556	590	0	1	TGAAGCACCTAGTCACATTGCTCCATCCATGGAAGA	a]_a\a`__^_Q[X_]__]U`Z_^]^]YXYSQSQVV	chr10.fa		5851183	F	36	118					
+HWUSI-EAS610	1	4	57	51	1811	0	1	GTGGACAGGATCATTTCCTGTGCAGGGAATTCTAGA	`RYa[Wa\I\[XXORaaa`_Wa]QX`a_Y_^Xa_[\	chr10.fa		5851291	R	36	118					
+HWUSI-EAS610	1	4	89	956	1199	0	1	TGATCCTGTCCACAGTTGGGAGAATTCTTCTCAAAT	`bbbbaab`aabaab`bbabbbaaab`abab_a`ba	chr10.fa		5851314	F	33C2	82					
+HWUSI-EAS610	1	4	17	1511	948	0	1	TGGGATATGGATTCTGGTTAAATGAGAAGTGCTTTA	aaa\^^]^VVZ`_P[UW\[]XYH\]`P\ZUTZ[\XR	chr10.fa		5851539	R	36	118					
+HWUSI-EAS610	1	4	24	1760	1926	0	1	GCATGCTTTAATAATCACATAGGCATCTCACAGTCC	aSa``]__`Y]__^VZ_^_U_]\XX]ZZW]ZZ^XZW	chr10.fa		5851778	F	17T10T7	56					
+HWUSI-EAS610	1	4	73	1217	1994	0	1	GTTCGAATCTCCTGAACCCACATGTAACTGTATATA	_T]\[N[WZQZXR]U\]PP[N_^``_NL^\N_a`\a	chr10.fa		5852538	F	30G5	99					
+HWUSI-EAS610	1	4	44	1645	232	0	1	ATCTCCTGAACCCACATGTAACTGTATATAGTAGCA	abaa``a[aa_`aa_`aa``a``_^``aa^QT`]_a	chr10.fa		5852544	F	24G11	84					
+HWUSI-EAS610	1	4	6	421	1169	0	1	TGTAATCCCAGCATTCCTGGGAGATAACAGGAGGCA	Sa_WVTbb\S[Zbb^X[b`W`I_\_\\a_^_TX_[_	chr10.fa		5852586	F	36	118					
+HWUSI-EAS610	1	4	71	320	983	0	1	GTGTAGTTGTGTAAACCAAGCTAGCTAGCTGTGTCG	^a`J_a]baZa_\\`Y]]_a`Z\[T[V_\YY[a`^\	chr10.fa		5852642	R	33GG1	47					
+HWUSI-EAS610	1	4	33	59	1337	0	1	AACAAATACTTGAATACAGACATATTTTGGAAGATG	^^`\`_`\bbbb_`baba`[a``Qabbaba`aaZZ`	chr10.fa		5852801	R	16T19	80					
+HWUSI-EAS610	1	4	87	1677	1374	0	1	AATCCAACCCTGGCCCACACTATTTTTGGTCTACAT	a`a^_^`USXX[S]_]_]aZ[Z_]Z\YUSVZ[]S[_	chr10.fa		5853230	F	36	118					
+HWUSI-EAS610	1	4	43	348	366	0	1	GAGGGCTGAGGGAGGGGAGGAGCAGGCTCTTAGAGC	`_aaa_`a\_]WZV]VU[a`T```__`a^``^a`]]	chr10.fa		5853426	R	36	119					
+HWUSI-EAS610	1	4	14	540	1217	0	1	GGAGTGAGGGCTGAGGGAGGGGAGGAGCAGGCTCTT	^````__a`\`a\T_Xa_a`a__a````a^a_`__\	chr10.fa		5853431	R	36	119					
+HWUSI-EAS610	1	4	64	527	1702	0	1	TGGTTGGAGCAGAAGAAGTGCGGGGAGTGAGGGCTG	``^Y``aT^[\[Y^\\`\R\\`]\`NaU]Q`^ZR\`	chr10.fa		5853454	R	18C17	96					
+HWUSI-EAS610	1	4	76	1515	1081	0	1	ACTACTATCTACTAATCTGGCTGTTGTAATTTCAGC	_aab^bbbabbabbbbababab`R^IRTX^aaPT[S	chr10.fa		5853896	F	36	118					
+HWUSI-EAS610	1	4	52	535	1244	0	1	ACCACCCTAGCATCCCCCTATGCTGGGGCCTCCACA	T]__aa_Z_`a`__a_a_``^```\`\``aa`[```	chr10.fa		5854298	R	36	39					
+HWUSI-EAS610	1	4	86	1691	1837	0	1	GGGCATCAGATCCAATTACAGATGATTCTGAGCCAC	aabaa_abaa`__a`aaa]aa_`a]``_^a_^H[_]	chr10.fa		5854533	R	32T3	23					
+HWUSI-EAS610	1	4	92	1524	379	0	1	GAAGACTCAAACGACCACTGAATGCAAGTGTGGACC	a`a`aab`abb__aaaa``^aa_a_a`_V[TZ_```	chr10.fa		5854815	F	36	119					
+HWUSI-EAS610	1	4	91	1533	2026	0	1	CAACACCAGGCTGGACCTTCTTCATGACCTCTTGAC	abbR]a[^[QUP_`ZG]_`]\`U]N_OFGY\^\aR[	chr10.fa		5854934	R	2G33	76					
+HWUSI-EAS610	1	4	10	990	1488	0	1	GAGGTCATGAAGAAGGTCCAGCCTGGTGTTGATCCC	`^K\V`]_\UY``_\^VYa`[]WY`^JY[bZHM^`]	chr10.fa		5854939	F	28C7	85					
+HWUSI-EAS610	1	4	100	1509	181	0	1	TTTATTTTCCCCAACTAGATGATGTCATCTCGTGAT	Ybba_J^_bL^]][V\]Y_a`^\UL[`H`YZHU\H^	chr10.fa		5855140	F	13T17T2T1	60					
+HWUSI-EAS610	1	4	94	998	1430	0	1	TATCTGGCTAAGACTGCCCTTTCTTATCTTAGTAAA	aaa`^^a^aa``a__`_^`a_a^_``a__[^_[]_^	chr10.fa		5855644	F	36	16					
+HWUSI-EAS610	1	4	14	1609	865	0	1	TGCCAGGGACTTGTCTGTCATCTGCGCACCAGCTAA	aa`Sa\UV[^_[a`a^X]\S[_^`][TUYSZ[UUUU	chr10.fa		5856085	F	36	118					
+HWUSI-EAS610	1	4	34	962	226	0	1	CAGGGATACGGTCCTGTGGAAACCAGGGAGAAACCA	a[^_b^XbZ]Z]]_ZX\^a]`]]]ZX]TMTS^RKQ]	chr10.fa		5856207	R	36	118					
+HWUSI-EAS610	1	4	91	994	1640	0	1	AACCCCTCACCAATATGTGCCAATAACCAAATGAGG	aba`]ab```^a`aaba]a__a`a[a^__][aa]^R	chr10.fa		5856448	R	36	119					
+HWUSI-EAS610	1	4	14	163	62	0	1	TGTTGGCAGCAAGAAGGGACTCTGTGCTTGTGGTAT	aa\aaab`Z_aaS_a^a_S]`a`\Za[V`XGaaU_`	chr10.fa		5857062	F	36	118					
+HWUSI-EAS610	1	4	32	1047	30	0	1	GTAGAGACTCCGTCTTTACTTAGTGTTAGCAAATAG	^``\`aaa``[a]Zbaba_abaaXP_`_V]a__a_a	chr10.fa		5858158	R	36	119					
+HWUSI-EAS610	1	4	79	682	1778	0	1	ATTGTAACAATCTAAGTTCTTAGTTTTGATAACTGT	aaba`bbaa]_aaaaaXaababa\aaabaa`a^a`[	chr10.fa		5858793	R	36	119					
+HWUSI-EAS610	1	4	98	863	1466	0	1	GTTGCTAATAGTTTCTTTTCTGACCAGGAGCCAGTG	a`a_^^___S_V_]U_[^`^\`XUX]_]]]ZOXZTS	chr10.fa		5858984	F	36	118					
+HWUSI-EAS610	1	4	60	1036	687	0	1	ACAATCAAGTCATTTAAGAACATTAGATAGGCTGCC	aa_\_[a^]RV\_aa`\`_a_aaa\]Z\Waa[\a^`	chr10.fa		5859129	R	36	119					
+HWUSI-EAS610	1	4	44	363	462	0	1	GAGAAAGGAGGGGGCAAGCAGCCCCTTTTATTTTGC	^Ta[YFYWXa]QY_]`]_\][`_`]^a^W[`\^a\\	chr10.fa		5859362	R	36	10					
+HWUSI-EAS610	1	4	14	708	1520	0	1	CATGTGGATTGCTGTCCATCTTGACAAGGTACTTTT	aa`aWaa``a`__`__a_`]_aa__Y^a`O_^_```	chr10.fa		5859776	R	36	119					
+HWUSI-EAS610	1	4	40	941	1377	0	1	CAAAGCTAGTTACTGCGTTACTATGATGCAGAACTT	]bbabbb]babbab`^bbbbaabbb_a`a`ba`ab^	chr10.fa		5860489	R	36	119					
+HWUSI-EAS610	1	4	67	1210	630	0	1	ACCAAGAACCCAGGCACATAAGGACCCAAACAAAGC	aaaaa[[ZU]_a[a_a_aaa_`X`YZW_`___aa_\	chr10.fa		5860519	R	36	119					
+HWUSI-EAS610	1	4	77	618	1118	0	1	GTCATCTCTCCAGCCCTTGCCTTGCACAGAGGAAAG	`P^a`_^\]`X^`\^^aaa^\\`^UY\__Z^YUYX`	chr10.fa		5860583	F	36	119					
+HWUSI-EAS610	1	4	11	1302	963	0	1	GTATAAATCCTCCAAAGCACNGCGCACTCCTCCCTG	``aaa``^]^`^]`V]SX_TDX`^USW\W^W\W\T^	chr10.fa		5860881	F	4G15G15	72					
+HWUSI-EAS610	1	4	86	1591	879	0	1	AGTGCTCCTACTGTTCTGTCCCCATTATTTCAACTG	aaTYYT[^`_W^_^`_`[ZS[]_VX_____W]X`^X	chr10.fa		5861207	R	36	119					
+HWUSI-EAS610	1	4	90	643	663	0	1	AAAGAGGACGCTGCAAGGGAGGCCAGGCTATAAATT	aaaa\]`_^a__RPST^a\TZN\_^_`U_^UZ`_^^	chr10.fa		5861335	R	8A27	84					
+HWUSI-EAS610	1	4	76	690	2044	0	1	GGTATCTATCTATGCCATCAGAGAGATGCCTACAAT	aaRaaa_a`a`baabaa^aaaa`aa_____`_^_^Y	chr10.fa		5861651	F	36	119					
+HWUSI-EAS610	1	4	11	1487	1253	0	1	GGCTTTGAGGCCGCCTGTGCTCAAGCCACGCCCACT	___aa`a\Q[`aa\^a_W\\XU\`]Y[\T^^NX`^`	chr10.fa		5862485	R	12A23	81					
+HWUSI-EAS610	1	4	77	313	1171	0	1	GTGGCTTGAGCACAGGCGGCCTCAAAGCCTGCTACC	`U^`_`^^\_a_\PQX^]`^]P]Y\YPU\EPXP\OR	chr10.fa		5862492	F	16T19	81					
+HWUSI-EAS610	1	4	80	90	1769	0	1	GTGTGTGTATGGGTACACGTACTGCCCCTCTAACCT	aX^_bab^_aabaS^aWaa[aa__aaaaXa_PI\_V	chr10.fa		5863384	R	8G2T24	44					
+HWUSI-EAS610	1	4	57	1518	44	0	1	TCTAACTTAGAGGTGGCAGGATTAGCCCTGGGCCTC	a`^aaW]_]SZ^TKXZV_R\_YVYXNNLYYOSMVYS	chr10.fa		5863620	R	5T30	89					
+HWUSI-EAS610	1	4	14	795	1944	0	1	AGGAGACGCACCCATGCCCGGAAATCTGTGCGCTCA	`aa_aa_``a_a`^_[``\a`\_\_\[`S\`][^\^	chr10.fa		5864028	R	36	119					
+HWUSI-EAS610	1	4	36	652	28	0	1	CTTAAGAGCGATCTTTCTCCCTAAGAGTCCTTGGTA	abbbbaababaaaaaaaaaaaaaaa`aW]_aaa_]a	chr10.fa		5864185	R	36	119					
+HWUSI-EAS610	1	4	50	703	1104	0	1	TGCTGGAGACTGAATCCAGGGCCTCAGGTATGTTAG	aaaabb`a\`aa`]a___a`^^_aW\_`\^``\`__	chr10.fa		5864271	F	36	119					
+HWUSI-EAS610	1	4	26	1306	768	0	1	AGCTGTGTGTCCTTGGCTTTTGCTTTATCCCACTGT	aaa`a]`_____`a``_`a``[^__`__]^]_]__U	chr10.fa		5864678	R	36	119					
+HWUSI-EAS610	1	4	35	24	1998	0	1	CAGGAAATCAGGACTGAGGCTGCCTTTCTTAGATTC	^^abb`SSb_bab`aa\aaa_a_a_]XaZ[V\QV^a	chr10.fa		5864855	F	36	119					
+HWUSI-EAS610	1	4	25	1647	1229	0	1	GGGGACAGAAAAGATAGTGGGGTGTACTAGGAGAGG	^``b`^aW\_a]Z]_a`S`_ba^aS``a`__SWX_a	chr10.fa		5865019	R	36	119					
+HWUSI-EAS610	1	4	58	971	1597	0	1	ACTGGGAGATGTGTGTTCTCAGAATCCCACTGTGAA	a``b`JV__a`XVZa`b__`_^Va_]^W_^_aXa]_	chr10.fa		5865565	R	36	118					
+HWUSI-EAS610	1	4	56	1086	915	0	1	GTCACCCAAAGTGACCGCAAGTGGAATTCCGCAGCA	a````^Y`]]^]^Z_`]TW_ZK[YX_a]VT_\\]TZ	chr10.fa		5865755	R	36	118					
+HWUSI-EAS610	1	4	29	1481	1019	0	1	GATCTTTCTGGGGTGTTAAAACATGAATCCAGTGAC	a`aabaaaaa``a]a_aaaaaaba``a____`X_]_	chr10.fa		5866094	F	36	119					
+HWUSI-EAS610	1	4	63	338	90	0	1	TGCAAGAGGTATAAAGCTAGTCTGTTTGGGAAGGCG	Z_^[Z_aaaOZ[aZV^]OY_^W_^aaa^_X`Za]OZ	chr10.fa		5866519	F	36	118					
+HWUSI-EAS610	1	4	78	963	358	0	1	CTTTGCTTTGTCTGTTTGTTAGGTCCCACTATGATG	]Z^S^SSYb`_[_`Za_OF[\baK`V]OXa]`a^YY	chr10.fa		5866721	R	36	117					
+HWUSI-EAS610	1	4	30	1057	783	0	1	TAACTTTAGGAGCTTTAATTTATGTTTTAAAATGTG	ab^`bbaaaa_a`aaa`aaaaaaa`aaaa``aaaaa	chr10.fa		5867531	F	36	119					
+HWUSI-EAS610	1	4	50	1094	352	0	1	ACATTACCCACTGAGCCATTTTCCAGACCCCTACCT	^[_Z\abQYWRa_[\PaSb`^`aa^O\PZ\Qa[QHZ	chr10.fa		5867722	R	36	40					
+HWUSI-EAS610	1	4	78	710	1242	0	1	CATGCTGTAAATGCCAAGCTAACAGTTCAGAAGCTT	ab^__a`aaba`a^aaaa\aa`W`a```aaa\_[`a	chr10.fa		5868434	R	36	119					
+HWUSI-EAS610	1	4	30	491	1037	0	1	GTGGGCCAGGTGACAGCTGCTATTATCTTTATTTCT	_^_`a^aa__^_U`^a^a``a^aa\aR`^aS]a`]^	chr10.fa		5868814	R	36	119					
+HWUSI-EAS610	1	4	63	1089	1236	0	1	GGATTGGTATTCTTTTGGGTACTGTACTGGCTGGGT	[`Z]]VWSQa`XZ^a`]]`NHVZ]a__``^RZ\X^B	chr10.fa		5869414	R	36	113					
+HWUSI-EAS610	1	4	55	429	1056	0	1	AAAGAATACCAATCCAGGGAGACAAAAACAAACTCA	aaabaaaaaaaaaaZV^aYQZMT_^``]Q^`UOWBB	chr10.fa		5869435	F	36	110					
+HWUSI-EAS610	1	4	43	417	1865	0	1	TGAACCAAGCACTGGGAATGTTGAACATACAAGGTT	[Z``aba`^bbabb]bbba`MZ]ba^^`^_a_aa]a	chr10.fa		5869833	R	36	119					
+HWUSI-EAS610	1	4	50	1050	30	0	1	TGAACCAAGCACTGGGAATGTTGAACATACAAGGTT	aaaaaabbaaa_bbaa`bab`bbaa````^__`_^a	chr10.fa		5869833	R	36	119					
+HWUSI-EAS610	1	4	57	155	925	0	1	CCAGTGCTTGGTTCAAACTTCCTACTTCCTCAGTTC	a_V_\aaaaba^aa``\aa`aa`a``aa`aa`a_^a	chr10.fa		5869854	F	34G1	84					
+HWUSI-EAS610	1	4	16	1070	825	0	1	CTGTTGTTCTAGACTGGAGGAGGCCTGGAAGTCCTT	abaa]]a``UK\\a`_`Xaa_aXS\aa`UV]WT[SX	chr10.fa		5869904	R	36	118					
+HWUSI-EAS610	1	4	71	830	580	0	1	GGAAACAAAGTAAATACATAAATAAAGGAANTGTAT	`^^_`]^``_[````]U\a_ZYa[[]_]][D[`Y``	chr10.fa		5869953	R	30A5	110					
+HWUSI-EAS610	1	4	56	1593	1920	0	1	TGTAGCTCCTGGAGTGGACTGTAACCATGGAAATGG	Y_R_]\OUPP`Q\U]`[[HZZXZYN[W_\QLQ^`Z^	chr10.fa		5870610	F	36	117					
+HWUSI-EAS610	1	4	53	1260	777	0	1	GGAAATGGGTAGCTTAGGTTGAAAAATGGAAAAAAA	aUXY[`Z`_G````ZO^VSW[YY]\^ZTZZZZ\`]_	chr10.fa		5870638	F	36	117					
+HWUSI-EAS610	1	4	23	873	165	0	1	TTTGCCTCCTGGCTATCTTTCTCTATCATCATCCTT	aa^bRM^TYY[LVWWU[YaW\XJVXVRVXP^]\UY\	chr10.fa		5870757	R	3T32	79					
+HWUSI-EAS610	1	4	60	592	2042	0	1	TTCTTGATCCAGGCTATCTGGATTCCAGTTCTGATA	aabaaa``aaa_`a__^a`Z^OY_a`]_Y]_`[]__	chr10.fa		5871101	F	36	119					
+HWUSI-EAS610	1	4	41	1148	1951	0	1	TAACATGTGCAAAGTACCAGGTATTCAGGACAAAGT	abbaa`a^baababRba_abbN`ab``aa_]_`\[a	chr10.fa		5871262	F	36	119					
+HWUSI-EAS610	1	4	34	125	530	0	1	TGTATAGCCCTCTATGATTGTGAGGTGTGTAGCCTA	ab_ba_abbaaba]`b]a`_Qa__aYa_a^]_aa\[	chr10.fa		5872015	R	36	119					
+HWUSI-EAS610	1	4	87	657	1329	0	1	ATCATCTAAAATAATAAGTGGACATTTTGTTTTGAA	aaaaa`a]``aaaa`aaaYaa``_aaaaa]a``a[]	chr10.fa		5872449	F	36	119					
+HWUSI-EAS610	1	4	78	36	512	0	1	AAGAGCCAGATGAGGAGAGGAACTCGGTGAAATGCT	a_bUba_T_babUa`UaU`a\_aab``\a]aa`_b_	chr10.fa		5872753	F	36	119					
+HWUSI-EAS610	1	4	11	894	1610	0	1	GGAACTCGGTGAAATGCNGACGTCTGGGCATGACAT	aabb_`abb\babbabWDZb`ZaaZ^Xaa^Y]`^ab	chr10.fa		5872771	F	17T16G1	72					
+HWUSI-EAS610	1	4	74	689	940	0	1	GAATGTTGACAGGCCTGATGCAGTGCAGGTCTGCTG	a`^aa_a^\^^``^_a``_]\\`Wa\^`^S[`_X_a	chr10.fa		5872853	R	36	119					
+HWUSI-EAS610	1	4	31	1077	934	0	1	CAATGGTCATTAAAATTATCATTAGATAATGATAAT	abababaabbbbbb^bbbb`abbaa_baabbaa`ab	chr10.fa		5873563	R	36	119					
+HWUSI-EAS610	1	4	40	221	786	0	1	TATCACTATTACTATTATTTCTTCAATGTCATGGAG	[[F[_\aa^_`b_SX^`Z`_ba`^_H[aS_b_b_``	chr10.fa		5873627	F	36	117					
+HWUSI-EAS610	1	4	41	578	1194	0	1	ATTCGAGCCCTGGTTTATGTATGTGGATGATGTGCA	`aPN]P]\aX_Q```^Q_`_[_`_R^Z`X[XaUZ_`	chr10.fa		5873671	F	31A4	80					
+HWUSI-EAS610	1	4	58	1617	1758	0	1	CACAATGGCAAGCGTTCACCCACCCACTTGCACATC	abbbbbbabbbb^bXaaaaa]b`]Ib_aaa]aaba]	chr10.fa		5873699	R	32T3	81					
+HWUSI-EAS610	1	4	56	390	188	0	1	GTAGAACATCCTTACCCACTGAGCCATCCCCTGCAC	a`a`Za``a^a`aa``^_`\`]`^^[^_`]XV`[Y^	chr10.fa		5874057	F	36	119					
+HWUSI-EAS610	1	4	62	855	41	0	1	CCACTGAGCCATCCCCTGCACCCAGAATTCCTCTTG	abbaaaaaa`aa^```a`a]`__ba``aaZZ]S]`a	chr10.fa		5874072	F	36	119					
+HWUSI-EAS610	1	4	28	1465	1547	0	1	GAAAGGTCCAGAAATAGTTGGGGCTTCTGCTTAATT	a_a`a_]`_a_^_[a]a___^Y]_^^^\RRY^^UT`	chr10.fa		5874221	R	36	119					
+HWUSI-EAS610	1	4	100	1092	1749	0	1	GTCACTTTATAGATACAGGCATGTGGCTAACCCACA	a\`[U`__^a\__``^^`\_\\XN^VV]_^XXW]X^	chr10.fa		5874552	R	22A13	90					
+HWUSI-EAS610	1	4	34	1285	1324	0	1	TGTATTGAGCAGGCTCGTTTATCAAATGAAATTAAA	ab_^Z]a_a_^_a_`__[`]XXSNT]^_ZX\^`XW^	chr10.fa		5874897	R	16A19	83					
+HWUSI-EAS610	1	4	49	1010	87	0	1	GATTGACTGGCTTGCCTCTTGACCTGGCCATTCCAA	a_bb_ba]``aba^aabaabbaaaa`aY[_aaYVZa	chr10.fa		5875480	R	36	119					
+HWUSI-EAS610	1	4	92	1042	1130	0	1	GATTGACTGGCTTGCCTCTTGACCTGGCCATTCCAA	abaaaa`a]aaa`ZZa_`\`a\P[Q`_`^\a`U_aY	chr10.fa		5875480	R	36	119					
+HWUSI-EAS610	1	4	10	1263	1196	0	1	CTCTGTGTGGCAATTTAGCCCTGTTGGTAAAACCAC	\``^aV_ba`aa]bb__[[_]_a__a_Y^aaaa`aa	chr10.fa		5875596	F	36	119					
+HWUSI-EAS610	1	4	67	346	1621	0	1	ATGAAAGAGATTTTTGCTCCTTTTGCTCATTCTGCG	`X[OHW[ZaT`b^aaa`__aU__`_\O^^^__ZU\`	chr10.fa		5875636	F	36	118					
+HWUSI-EAS610	1	4	38	298	1421	0	1	GTGGCTGGTTTGCTGTTCACAAAAGGTAGTTAGGTG	a_abaa`b]_a]a_a_ZVV[Y]WZa[FRa[`XV^P]	chr10.fa		5875959	F	36	117					
+HWUSI-EAS610	1	4	56	512	209	0	1	TGGAAGCATCCAGATCTGTGAAGACAAGATGAAGGC	aa\``[^_a^a_a]_a_`Y``^[^X^]__XX`UU\^	chr10.fa		5876173	R	16G6G12	48					
+HWUSI-EAS610	1	4	97	106	393	0	1	ATATAGTGAACACTCTGAGCACCATTCTTCCACATT	a`]_a^^a`a_Vaa`a`_`a^^___`^___^_]^__	chr10.fa		5876668	R	36	119					
+HWUSI-EAS610	1	4	54	1083	1829	0	1	ACTATATAAGACATGCTTAGAAAAGACACAGGGGAG	a]Ta_Paaaa^\\_a`^a`aY^_a[]__O_`^_SZU	chr10.fa		5876697	F	36	118					
+HWUSI-EAS610	1	4	96	524	1651	0	1	AGAGCCAGGAATTCTGGGCAAAACAAGTGCATTATC	ab`bbaba`aX]__aa`[`^Qa`aba]U`_a[^`^_	chr10.fa		5877004	F	28A7	82					
+HWUSI-EAS610	1	4	34	697	1232	0	1	GACTTTCAAAACCTTTAACCCAGAAGGGTGTGTGTG	a^aa^`\`aT[HZ_Yaa\[S]H^KPY`OMTG`[]\a	chr10.fa		5877188	F	36	115					
+HWUSI-EAS610	1	4	54	597	670	0	1	TGTGTAGGTCTTGGAGGGTGTGCTCCATGGATAACA	aa`a]]`YY`_`a`\__[YVVU\\[^_]V]Y\\_\Z	chr10.fa		5877274	F	36	119					
+HWUSI-EAS610	1	4	35	60	1161	0	1	AATGAGAGTGAATTCATGGTAATCTCCTGTCATAGA	_aV^a_]^]abb`_aa`a`X^``a`aa_a]`a`\[B	chr10.fa		5877365	R	36	115					
+HWUSI-EAS610	1	4	86	393	782	0	1	CTTCAACTAGGGCAGCAACGTAGTGAGCTTTGGAAG	`a]ba`_X^aabba`a`[aaSabTa]`aa[`[[VX_	chr10.fa		5877612	R	7C1A26	52					
+HWUSI-EAS610	1	4	82	1173	366	0	1	GGAGGTTAGACTGAGAGTCCAAGCTGGGGCGCCAGT	_VLS]R[[^VQXPM]\]R^T\]ZLQPQJMMSPRR[R	chr10.fa		5878193	R	36	116					
+HWUSI-EAS610	1	4	10	1274	1057	0	1	GGAAATGGCACTATTAGTGGTCTTGTTAGAGGAAGT	_`Z\\a_a_`Z```_aa]aa]^`a\Sa_X\\[YYaV	chr10.fa		5878373	F	4G31	86					
+HWUSI-EAS610	1	4	22	910	1224	0	1	TATGTGTATGACTTCAAAGCCCAGACTTCATAGTGA	aa`bO`O_a_\Y_aYa_^a__Y_][]^^Y_]__X^\	chr10.fa		5878412	R	1G34	81					
+HWUSI-EAS610	1	4	24	1363	1952	0	1	GCCAGGAGGGAGGTGCTTTGGGACAGACAGAAAAGA	aa^^a\``_^W\ZLX\^_W\^\\UYW\U\^W\YW\S	chr10.fa		5878755	R	35G	95					
+HWUSI-EAS610	1	4	66	140	2019	0	1	GCTGTTTGTTGAGCATCAGATAGATGCTAGCATCTG	aaabU`aa_aa^baY_^Wa[^a`]]a_WL]_]Z^^^	chr10.fa		5878971	R	36	119					
+HWUSI-EAS610	1	4	55	865	816	0	1	GCGGTTACAGCACCTGCACCCAATTCCTTCTCTTTC	ZbbbZZ__^a`[`HOO\FQ]__R_a[F]`PT[Yab`	chr10.fa		5879039	F	36	115					
+HWUSI-EAS610	1	4	34	364	1748	0	1	TGGAACCTGACACTACAGGCCTTCTTCAAATGGCTT	`^_[abaaabbbbababaa]`b`aa`ZU][b_`[aa	chr10.fa		5879202	R	36	119					
+HWUSI-EAS610	1	4	21	696	312	0	1	GGTGGAGGCTCAAGGAGTTAAAAGCTGCTAATCTCA	aa_a`^a`__``_aa]aZ^N[`a^^]Y]^\TY]^__	chr10.fa		5880425	F	19T16	100					
+HWUSI-EAS610	1	4	64	1741	1130	0	1	CAAGGAGTTTAAAGCTGCTAATCTCAGGCACATCTG	a`baa`a]``a____```__a_^^_a\WZ\[___`a	chr10.fa		5880435	F	36	119					
+HWUSI-EAS610	1	4	51	112	1688	0	1	TGGCCTCATGCATGCTTTAGGTGCGGCTTCTGACTC	a`_bb_bababbbabaaabaa^`ababaaaa``^`^	chr10.fa		5880472	R	36	119					
+HWUSI-EAS610	1	4	47	1166	853	0	1	GTGGCCTCATGCATGCTTTAGGTGCGGCTTCTGACT	a\_^`\\YU[`P\_`\_aZ^]_W_T^]W]]SWH\U^	chr10.fa		5880473	R	36	118					
+HWUSI-EAS610	1	4	27	128	1675	0	1	CAACCCAAGAAGAGTTCTGAGTTTGTAAAGAAACTG	a_Z`a]NXW]QZT_\^a__N_V\^\[]X_`]`__[_	chr10.fa		5880658	R	26G9	85					
+HWUSI-EAS610	1	4	25	998	1160	0	1	TATTGCATGAGACCTCAGTCTGCTTCATTTATGGGC	aaZTXXZ_`\a__`\QUT_aa`_aa\U]`_[]]W\^	chr10.fa		5881277	F	36	43					
+HWUSI-EAS610	1	4	49	284	472	0	1	TATTGCATGAGACCTCAGTCTGCTTCATTTATGGGC	aaaabbabaa`bbbaaaa_aaaaaaa``aaaab`_a	chr10.fa		5881277	F	36	69					
+HWUSI-EAS610	1	4	91	128	87	0	1	CTCACGTTTCAGGCCACCAGCAGCTGGAAGTCCATG	a_^]_`]aa_]Za`Y]`^\\X\^a^a]RVXNWLQY_	chr10.fa		5881904	R	17A12C5	65					
+HWUSI-EAS610	1	4	75	803	148	0	1	GGATAACCTTGTGCCAGAAACAAAATCCTGTGCTCA	a^Yaa[ZZ`W_Y]QWaa`a``aa_T__S^`[a]`\_	chr10.fa		5882500	F	36	119					
+HWUSI-EAS610	1	4	53	1198	1777	0	1	CCATCATCCCAGCCTTCGGAGGCTGAGACAGGAGGA	_aaaaa^`^aaa^R_`a[`[\[Uaa^Z_aR^a\_``	chr10.fa		5882557	F	36	119					
+HWUSI-EAS610	1	4	24	1003	1373	0	1	CGTATGAGCACCATGCATGTGTGAAGTACCTCATTC	a`]aaa_aa`N^aaa_`ab`a_a``a_``]N[_a_`	chr10.fa		5882783	R	36	119					
+HWUSI-EAS610	1	4	71	1107	1491	0	1	CATCTGTGAGACAGTGTCTCATATGCCCCAGGCTGA	^_bab]``^a^aa^\^aabaaaaaaa\]_aa]R^a`	chr10.fa		5882989	F	36	119					
+HWUSI-EAS610	1	4	36	1787	1184	0	1	ACTGGGACTCCTGATGGTCCTGCTTGCCCTTGAACT	aaX_YU^^a`a`ZT`^]]_aaZRXWEZ^Z_SNXV^`	chr10.fa		5883035	F	18T17	81					
+HWUSI-EAS610	1	4	15	343	1436	0	1	CATCCTGAGCTACAGAGAGTTCCAGGCCATGCAAGG	ababab_]aaaaaabb`J`Yaaba`aa`a_a__^`]	chr10.fa		5883346	F	36	118					
+HWUSI-EAS610	1	4	83	1741	82	0	1	TGAGACAGGGTCTTTCTATGCAGCCTTGCATGGCCT	`bb]baab``[b`b_Z_b\J[aa``__]aaSJRaaa	chr10.fa		5883369	R	36	118					
+HWUSI-EAS610	1	4	53	107	544	0	1	GTTCAGCTTTGGAGGATGGGCAAGGTGACTGTCATC	a_`XLZa_`a`a_a^RZ__`_Z`__V_`_^`W[Y[_	chr10.fa		5883841	F	36	118					
+HWUSI-EAS610	1	4	73	1437	1618	0	1	GAGACCTGTGCCCTCATCCTGATTAGAGGACACTGG	a]a]^]X`VHZ[Za^^_`__ZY]aXaX]_`VXQXaa	chr10.fa		5883904	F	17T18	81					
+HWUSI-EAS610	1	4	45	1091	450	0	1	AGCCTCTCAAGTCATTTTGAAGTGGAAGACAAGAAT	`aa`aa_]`bb`\`ababa_^aXaaa]_]a_aa_^a	chr10.fa		5885101	F	33G2	83					
+HWUSI-EAS610	1	4	37	970	1830	0	1	ACTAGCATTGTGGTATCCACTAATGGTCACCAGAAT	aabaa`aaaa_^a_aa`^`^a_`a`^W``__`aa_`	chr10.fa		5885582	R	36	119					
+HWUSI-EAS610	1	4	67	1625	1058	0	1	GATTAATGGCTGATAAGATGCCATTAGAAGTTGAGG	a``baa\\YS_S[_`^HT^_SRZBBBBBBBBBBBBB	chr10.fa		5885792	F	36	62					
+HWUSI-EAS610	1	4	4	1372	518	0	1	ATCATATTGGGCAAATAAGCCTGACTCAAAATTCCC	aa\KX^PR[NP`__`]ZZPH_RRYTP_MSVRRX[_\	chr10.fa		5886022	F	36	116					
+HWUSI-EAS610	1	4	44	246	46	0	1	GGGCAAATAAGCCTGACTCAAAATTCCCATAGTGAT	`bbb_``[babaabaVa_aa``aa`baa_aaaVaX`	chr10.fa		5886030	F	36	119					
+HWUSI-EAS610	1	4	27	53	1702	0	1	GCTCGGCTTACAGGTTCTGTGGCTCAGTCCATATTC	`a\a```a`_bb``V`__bX`]a_\H\^]aUa_^^`	chr10.fa		5886324	R	19A16	89					
+HWUSI-EAS610	1	4	83	1719	1200	0	1	GGCACACTGGCTAGTCACCCAGGCACCTGTTCCGGG	PT\_J\a___\_OOO^]V_\XQQMXRUBBBBBBBBB	chr10.fa		5886991	F	30C2A2	73					
+HWUSI-EAS610	1	4	21	158	1957	0	1	AGTGCATTTGAGCAGGAGTCTGGGGACAATGGCAGG	aa_aa\aaa`W^bbaa]a]a]`^`]`a]a^`_`a__	chr10.fa		5887062	R	36	119					
+HWUSI-EAS610	1	4	66	967	292	0	1	GGACCTGCCTCTCACATCTCTGCACCTGAACAGCTC	aba``XWa_aaaaaa`aaUaaaaaa_``^aaaaa^a	chr10.fa		5887157	F	36	119					
+HWUSI-EAS610	1	4	67	1102	103	0	1	TCACATCTCTGCACCTGAACAGCTCTGGGTCTACAG	aab[aa\___`Z_\\[U\`Z_ZV^U\\[SQPY\WYT	chr10.fa		5887168	F	36	118					
+HWUSI-EAS610	1	4	38	920	1150	0	1	GGCCAGCACTCCCCTATCAATCATTAATCAAAACAA	_a\a_U_a`aa_a``V``aaa_`_a_]__a`_a^`_	chr10.fa		5887426	F	36	119					
+HWUSI-EAS610	1	4	98	584	41	0	1	CAAAACAATGCTCACAGACATGTCCACAGGCCAATG	a_^YRN]]^ba`]^aa\\Z`aa\\^a__a]S[`_YX	chr10.fa		5887454	F	36	119					
+HWUSI-EAS610	1	4	31	944	1903	0	1	AGTTGACAAGGGGTAGACTTGTGATGGCCAATCTTG	abbbbbbbabbb`ababaabbaaa`ba_a``a`aab	chr10.fa		5887548	R	36	69					
+HWUSI-EAS610	1	4	44	864	666	0	1	GCTCTCCAGCCTGACAATCACATTTAAACAGAACTG	Z^QOV_YWRWQ]TWXUU\\UX^]YZ_^HYZ^YTT`\	chr10.fa		5888316	F	36	117					
+HWUSI-EAS610	1	4	78	1010	1098	0	1	CACATTTCTGCCTCTGCTATCTGCAGGACTCAGCTT	ababbbbbb``aaabbaabb`aa`aaaa\a`aa_aa	chr10.fa		5888436	F	36	119					
+HWUSI-EAS610	1	4	34	434	1633	0	1	ATCTAGTCAGCTCAAGCTAGCTCCAGGCCACCCCTG	_^ab^a^bbba`b`X]ab__`abaa\V_`]aaaa[`	chr10.fa		5888472	F	36	119					
+HWUSI-EAS610	1	4	71	538	490	0	1	AAACCTCATCACCTCTCCATGACCATCTCCCATTGT	a`ba`aa`bababbaaa```aaaaaba`a`aaaaa]	chr10.fa		5888612	F	36	119					
+HWUSI-EAS610	1	4	91	598	534	0	1	AGCTGACCATGAAGAACTACTTCCCGGAACCTTGCA	abQ[[XWY_YOVWX[a`a[aVNUHSZH_WGSUZ_PZ	chr10.fa		5888796	F	29A6	105					
+HWUSI-EAS610	1	4	65	1138	220	0	1	TTTGCCTTACTGGGCTGAAAAGTCAGTTGTGACAAA	aaaZW^a`SY[___^`Y\`a__XY]aYY_W`ZY\\W	chr10.fa		5888854	R	36	119					
+HWUSI-EAS610	1	4	25	1719	578	0	1	TCTTTATCTCAAAAATATCACACAAGACAGGCTGGG	a_\`a`a`[```^_`abaaa_a`__Y`^_^W^^\BB	chr10.fa		5888908	F	34T1	108					
+HWUSI-EAS610	1	4	62	1515	1664	0	1	ATCTCAAAGATATCACACAAGACAGGCTGGGGCACA	^aaa^^b`a`\Y]^aa`abbX_^_V^V]^VBBBBBB	chr10.fa		5888913	F	8A20T6	28					
+HWUSI-EAS610	1	4	96	1008	1790	0	1	ACACAAATAAATACCAGTGTGTTCAAGGGACTCTCA	a_a]P__N\a[]`__a_Sa_a_^`_[XRPU_^^__a	chr10.fa		5889090	F	36	118					
+HWUSI-EAS610	1	4	35	93	1757	0	1	GACAGATTTCTTTCCTCACCCTCCCTCCGCTGTGTG	_]]Q_^`b`aba`aa`]abababaa`a]Wbaa\b_a	chr10.fa		5889324	F	36	119					
+HWUSI-EAS610	1	4	51	1611	1192	0	1	ATACATAAACACACACACACAGAGACACACANACAT	abbabbaab`a`aaa^a`a`aaa_a`a^`_\D[^`a	chr10.fa		5889369	R	31C4	11					
+HWUSI-EAS610	1	4	88	1154	1953	0	1	GGTATGTGTAGGTCTATAACAGAGAAAAGACAGACA	ab_]^aR^`aba]`aba]a`baa`a```a`_`]\T]	chr10.fa		5889433	F	36	119					
+HWUSI-EAS610	1	4	22	634	1413	0	1	TGAGACAGGGTCTAACTGTGTAGCACAGGCTGGCCC	\_^X]__]_`Y`__Z`]_Y_]]`Y__^SX\^VZBBB	chr10.fa		5889639	F	35T	38					
+HWUSI-EAS610	1	4	4	411	426	0	1	CAGCACTGTGGGTGCTTTTGATCACACCGTGGTGCT	]]^X`ba]a``_M`bba[^`T^baTab[^Zab\]ab	chr10.fa		5889766	R	3T32	90					
+HWUSI-EAS610	1	4	93	354	742	0	1	GCAACAGCGTTCCTGCCTGAGAAAGTGGAAATTCGG	abbabbabbaaaaaaa`ab^`a`]`P`aa`a___a`	chr10.fa		5889981	F	36	119					
+HWUSI-EAS610	1	4	27	531	1235	0	1	AATGTATTTGTTTTGAGATTGGGTCTTACATTGCCC	YL^^]\^^ababb`Y[baaa]aa[W`b`_`\abaa^	chr10.fa		5890127	R	36	119					
+HWUSI-EAS610	1	4	71	883	1594	0	1	CAGCATGTGGGAGGCTGACGCTGAGGCCAATGAGGT	_^`\`__T^a_S]X`aaaaa^`\`_`[a`_`a^`a`	chr10.fa		5890562	F	36	119					
+HWUSI-EAS610	1	4	49	228	1978	0	1	TGACGCTGAGGCCAATGAGGTTGAGGCCATAAGTTC	abbbbbaba``aba_a_W_a\_^Waaaaa`_U\\aa	chr10.fa		5890577	F	36	119					
+HWUSI-EAS610	1	4	67	1513	369	0	1	TCGTTCACATGTCTGTTTTAAGCATCAACTCAGCAA	`W^a`[]^`[XW^_Y\`aaa`YX^`X]`X\^YMS_^	chr10.fa		5891176	R	36	118					
+HWUSI-EAS610	1	4	55	170	725	0	1	CGCGATGTGCTGCTTCCTCGTTCACATGTCTGNTTT	aaab`^b[aaa`a`]`a`aa[``]]^`a[aa\DZ^^	chr10.fa		5891193	R	32T3	110					
+HWUSI-EAS610	1	4	32	711	673	0	1	CAGCACATCGCGGAGGGCTTCACGTACCCTGAAGAA	M]TXQOQ]R_][aa]UXOYXM`[[bWH[M\^Q\`^]	chr10.fa		5891217	F	36	117					
+HWUSI-EAS610	1	4	81	1766	44	0	1	CCATCTCACACTGTGTGTCCCTCACCTCAGATGTTG	abb`X`_`^aXQSH[SM\_`XX__`[SYKV[PRU`\	chr10.fa		5891501	R	36	117					
+HWUSI-EAS610	1	4	6	372	1428	0	1	ACAGTGATGTCCAGATGNGCCCAGCGTCAGTCTGCA	`_W_]`_aaaaa``[`XDZaa`^aa_YZTQJYWVVZ	chr10.fa		5891605	R	17A18	109					
+HWUSI-EAS610	1	4	93	1530	1372	0	1	GGCTGTAGTTCAGGTCTGAGGTAATTCTGTGTGTTC	a`b`S[Q`Va_YOWJXZ^RTHQVTWZ^a__\F\`_Z	chr10.fa		5891813	F	36	116					
+HWUSI-EAS610	1	4	6	835	638	0	1	CGGGAGGCGTGTGCATGATGCTTGAACACACAGAAT	^_a`_\_R[SZRZU[WY[S\T_^`WXVRV\F]`]XT	chr10.fa		5891836	R	36	117					
+HWUSI-EAS610	1	4	98	965	293	0	1	CATGCCTTGTACGAGCTCTCCCGGGAGGCGTGTGCA	`aaaaaaaa`aaaaaaaaaaa_a_aaaQ`aZa^a`a	chr10.fa		5891857	R	36	119					
+HWUSI-EAS610	1	4	52	120	1758	0	1	AACACATGCCTTGTACGAGCTCTCCCGGGAGGCGTG	_`aaaa__aaaaa^`a`X^`^`__`a``\^_`aaP`	chr10.fa		5891861	R	36	119					
+HWUSI-EAS610	1	4	2	945	1792	0	1	GTTTTGCATTTAACTTAGAATAGTGACAGAAGTATA	a\]W]WYTXYYS^Sa]P`XUXXVTW]_YZ]XVTXTR	chr10.fa		5892081	F	36	118					
+HWUSI-EAS610	1	4	43	477	502	0	1	TGCCCCGCTGCATTGGTTTGGGTTTAAGCTAGTTAT	`bba`]a`aaabab`aYbaaaa_aaaba`aaaaaab	chr10.fa		5892114	R	36	119					
+HWUSI-EAS610	1	4	87	876	1858	0	1	AAAGTCATGCTCAGTAACGTCAGACACAAACCATGG	aaaa^_a^`a][ZXY\X^a^ZPR]][^ZZTVP\^\X	chr10.fa		5892740	F	36	118					
+HWUSI-EAS610	1	4	74	1106	1394	0	1	ATCCCATGGTTTGTGTCTGACGTTACTGAGCATGAC	aba_^ab^]]baa`^``bb__a`aa[aa]a^^`a\_	chr10.fa		5892743	R	36	119					
+HWUSI-EAS610	1	4	60	1217	1751	0	1	TAGGAGGGCATGGCAGCCCCAGACCTAGCTTGTTTG	abbaa]aa]a``X^`\\\`_`]XY`[]]X^V`U^aY	chr10.fa		5893451	F	36	119					
+HWUSI-EAS610	1	4	53	239	34	0	1	ACATAACGCATGTCACGGCACACCAGTCTTGGCTAT	a``baYaaa`a]a`^`aaa_a___`_\a__aaaZZ^	chr10.fa		5893659	F	36	119					
+HWUSI-EAS610	1	4	94	1232	1126	0	1	TGGCACAGCAGCTGGCATGAAGCTCAGGCTTTCAGC	abbaa^a][a_^^a`Y^]aaa^^^XT[^MZ^U^Y^Y	chr10.fa		5893704	F	36	119					
+HWUSI-EAS610	1	4	83	588	1967	0	1	CTTTATATGCACTTTTTCTGAAATAGGTTTTCACTA	abbaaa_V^aaaaaaaaa`aaaaaaaaW`a`aa`_a	chr10.fa		5894221	F	36	119					
+HWUSI-EAS610	1	4	50	744	1433	0	1	GTACCTAGGCATTTTTCTAACTTTAAAAGTGATAGC	`_`^`aaa\`V`aaaaaa_\_baaa`_[`Ya_Xa`]	chr10.fa		5894344	R	36	119					
+HWUSI-EAS610	1	4	9	1177	1302	0	1	ACGTGGCTACATTCCCAGCTACTTGAGAGAAGGCTC	aab_bbaab`aba_aa^abbaaabb_a^b``aa___	chr10.fa		5894386	F	36	119					
+HWUSI-EAS610	1	4	49	977	1945	0	1	GCCGGCTGGCCCTGCACCCCATGGAACAGGTGGTCC	\_`^``__\]X]aa`_\[^XX]]\\^X\Z]RZ]NWU	chr10.fa		5894430	R	36	118					
+HWUSI-EAS610	1	4	11	1572	1535	0	1	TTTCTGACCACCACATGTACACTGTGGCAAGAGTGT	abV[[_ULU_Z_`X[_aWT\a_YXX_TWG_]UBBBB	chr10.fa		5894723	F	36	100					
+HWUSI-EAS610	1	4	57	533	1261	0	1	GCCACCCTTCCCCCAGCCTGCAGGGACCATGTGCAC	`aX^`]]``^^^a^`PXXY^WRRUPPSVV\^Z\\X]	chr10.fa		5894961	F	4G31	81					
+HWUSI-EAS610	1	4	45	723	299	0	1	AGTGGTGCCTTCTGGGCCCTTCAACCCATCTCAGGT	aZ\_]\a`Zaa____^]^]a`^^^\W]W]^_UTZ^U	chr10.fa		5895024	F	36	119					
+HWUSI-EAS610	1	4	22	495	1088	0	1	TTATGTTTTGAGACAGTCTCACCCTACCCTGACTGA	aaV]``abaaaW`Y``]]Zaa_]a^]XML^\^X^R[	chr10.fa		5895194	R	36	118					
+HWUSI-EAS610	1	4	41	576	1165	0	1	GGACAGTCACAGACCTATACGGCTTGAAAAGAGATC	^XT]]_a^`^aa^a_`[`b`b``aaX]a]aabaZa^	chr10.fa		5895310	F	36	119					
+HWUSI-EAS610	1	4	86	610	111	0	1	AGATAAGGCCAGAGTTGTCTTCTTGTCCTAAGAGAA	abaabaaa\aa`\XY]aa_abaa`a_]\\a]_^aa_	chr10.fa		5895378	R	36	119					
+HWUSI-EAS610	1	4	65	1691	37	0	1	TTAGGACAAGAAGACAACTCTGGCCTTATCTACGAG	aa^MY]\__Q_]X_`aa^_[ZLJUXT[[^_Z_]T[U	chr10.fa		5895383	F	36	118					
+HWUSI-EAS610	1	4	6	360	668	0	1	TGTGATGCAGACAGTTACACTTCAGTAACACTGTAT	abU``GUa[^W]Y]`aa_aaaaaT`Y_[^[``aVPX	chr10.fa		5895652	R	36	118					
+HWUSI-EAS610	1	4	80	176	1460	0	1	TAGGGTCCTGCGTGGAGTACTCTTTGTATACCTGCA	a_aba\bbaab`__a_a^]baaaaa[_`_`_a[Y`^	chr10.fa		5895701	F	36	119					
+HWUSI-EAS610	1	4	52	1660	1671	0	1	CAGCAGGTGTGTACACAGAGCATCGATGGAGCCCTG	aVZ_ZXTQ`Za]`^aaaa]aaa^X`^\`Z_X_\UU^	chr10.fa		5895798	F	11A24	85					
+HWUSI-EAS610	1	4	3	1358	1561	0	1	GTGGTAGTGCTCTCTTCCCGAGGGGCTCTTGTTGTG	aPb`\`Z_aMZVU]^P_]X_S^^VGUZMZ^aM_UY]	chr10.fa		5895964	R	36	117					
+HWUSI-EAS610	1	4	34	576	1252	0	1	GCTGCACCACAGGCAAGCCTCCTGTGCATTCCAGGC	\_a_[\_ZVX__ZWQGX\^`^\_WX^[`Xa[[TZ\[	chr10.fa		5896982	F	36	118					
+HWUSI-EAS610	1	4	99	414	453	0	1	CAGGCCAACCAAGGCTACATAGTGAGATCCTACTGT	abb_abbaaabaaaaa`_`a``\aa_]a_[`aaa``	chr10.fa		5897013	F	36	52					
+HWUSI-EAS610	1	4	97	114	1983	0	1	GTCGGGGGTCTCACAGTAGGATCTCACGCTGTAGCC	VR_aaaZ^Na_]X\WRGY`\ZR`ZaZBBBBBBBBBB	chr10.fa		5897025	R	27TA7	69					
+HWUSI-EAS610	1	4	10	125	1213	0	1	CGGGATGAGCTGGCCAGCTCCCCAAAGACTCGAGAG	aa_\_aaS`aa__aVZ\aYaaa_RZ`R`a^`a``\Z	chr10.fa		5897404	R	36	33					
+HWUSI-EAS610	1	4	17	530	1638	0	1	GGTGATGTTTGTGTTCATGAGAAGGTATGTGAGAAA	a`]aW_a\_`_S`]`__a][`[\]`P```]`Z``[a	chr10.fa		5897846	F	36	119					
+HWUSI-EAS610	1	4	78	1228	735	0	1	AGGATGTCGTTTCAGGTCCTTAACGGCCTTCATGTT	abb^aa]a]`aY`_^`Xa`a\]_[WS]]\_YUYU_a	chr10.fa		5897905	R	36	119					
+HWUSI-EAS610	1	4	79	976	1000	0	1	ATCTTGTTTTGAGACAGGTTCTCTGTGTGGTCCAGG	abaa`_a^^W_Xbaabaa\`abaa^Z_Xa\\^S][V	chr10.fa		5898014	F	36	119					
+HWUSI-EAS610	1	4	54	332	1613	0	1	AGGTAACTTAAAAGGGCAGGAGGCCATTTGGACGCA	_bb[baba`aa_Z_XX^aaa\[UXWW``[ZYX]Y_a	chr10.fa		5898488	F	36	119					
+HWUSI-EAS610	1	4	77	1737	1121	0	1	GTGGGAATTGTTTGCCATCCCCCACATTTGAACTTG	a`_a^[aab`a`[FWbbaUb`babZRa`SN^a__a`	chr10.fa		5898524	R	36	117					
+HWUSI-EAS610	1	4	83	308	1663	0	1	GTGAGGCCTGTCATATGTGACCCAAAAACTAAGAAT	a_a`aaba_a`ba`aaa]a[aab\aa\^``aa_PYY	chr10.fa		5898567	F	29C6	82					
+HWUSI-EAS610	1	4	77	609	809	0	1	TGAATTCTAGGCCAGCAAAGGAAGGAGGGAGAGAGG	`b^abbaaaaba`^ba`^\aaZ`baZ`ba_a_a\aa	chr10.fa		5898712	F	36	119					
+HWUSI-EAS610	1	4	59	695	1025	0	1	GGAAGGAGGGAGAGAGGGAAGAGGGTGTCTATACAC	ab`]aa_aaa[a^aZaa`Y^a^^^_U``Z^^^SYBB	chr10.fa		5898731	F	32TACA	52					
+HWUSI-EAS610	1	4	47	1747	1183	0	1	AACATGAGTTAGCAGACTTCTGTAGAGAGCTAGAGT	ab_`aa_a]aa`aa`__aaa`Z\`__]Z`[__\a`W	chr10.fa		5898824	R	36	119					
+HWUSI-EAS610	1	4	49	536	2000	0	1	TGAACATGAATTTTGTTCATGATTAAGGGAGCAAAT	abaaabbabaaaaaa_aa`bb_aa_aaa_``_a`aa	chr10.fa		5898900	F	36	119					
+HWUSI-EAS610	1	4	34	1786	926	0	1	AGAATCTAATGAGGCCATGTATGGCCATATGCCCTG	ZX[_[`ab_QW_]PYZa_U]a`Z\a[ZWYFFYY\BB	chr10.fa		5898983	F	36	107					
+HWUSI-EAS610	1	4	83	799	1382	0	1	CATCTGCCCGGTTGTAAACATGTTTTTGATGATGAT	a\aaa`U_^````^Ta^ZQ`ab_aabaa_`^H_TM^	chr10.fa		5899064	R	19T16	81					
+HWUSI-EAS610	1	4	18	1037	1261	0	1	TCCTCCTCAGCAATGTGGACAACTGAGAATGCTGTG	a`aa`QaV^a___aaY``Y\S`Y`_Y^M^\R[\_Y_	chr10.fa		5899434	F	36	118					
+HWUSI-EAS610	1	4	64	360	1567	0	1	CACTCGCCTGCAATCTCAGCACTTAGGGGGCTGAGA	abb``]`aaa_W]aaaa^ba``]`aa`aa``a`X`^	chr10.fa		5899535	F	5A30	85					
+HWUSI-EAS610	1	4	53	461	439	0	1	TGATGGTTGGTATATGCTTGGCCCAGGGACTGGCAC	a_Y\a`X_`^^``a^`^aa_Z]_aZZ`WX^a^Y[Z]	chr10.fa		5899652	F	36	28					
+HWUSI-EAS610	1	4	57	1129	1035	0	1	GAGGTTATTAAAGCCCACACCCACAGTGACACACCT	[a^`aa`bbbba\S_``_ba_^ZR^a_aa___[`aa	chr10.fa		5899715	R	36	7					
+HWUSI-EAS610	1	4	7	1723	151	0	1	TATATATTGAATATTAGCCATCTATCTGATATAGGG	abbaaaaa_aa`aa_baaaa_a_``_aW__`\[]Z^	chr10.fa		5903807	R	36	47					
+HWUSI-EAS610	1	4	44	680	154	0	1	TGAGGAAACGCCAAATTGATTTCCAGAGTGGTTGTA	a``aa_aa_]^`aab_`aaaaaa`a^^]P^VT_TBB	chr10.fa		5904098	R	36	7					
+HWUSI-EAS610	1	4	44	274	731	0	1	GGTATTTGGAGTTTTGGGGCTAATATCCACTTATCA	aaVZ\`___[aV_^`aaa`a_]__]_^`]`aa``\W	chr10.fa		5904458	R	36	14					
+HWUSI-EAS610	1	4	53	700	1624	0	1	TTCACAGGAACAAGAGCCTCTCTCCCATTGATGTTC	aa``W^``X]Z`T`^`\Y^_[OZ[_X]___]^_]XB	chr10.fa		5905024	R	36	35					
+HWUSI-EAS610	1	4	21	550	970	0	1	TATGCACTGTTTGTGTATGTATGCAGTACTTGCTTG	_T]b`\Xaa]a\_[_]]]aZ[Y_Z__W^X`__^^W^	chr10.fa		5905516	R	36	119					
+HWUSI-EAS610	1	4	88	1655	1358	0	1	GGCAGACCAAGGCAGAGGGAAGAAGCACACTAGCAT	`abbabab`b_`aaa`a`aaba\a``a^__`a^_a_	chr10.fa		5907424	F	36	119					
+HWUSI-EAS610	1	4	13	144	457	0	1	AAGCACACTAGCATCCCCTCTGCACCTTGCCCACTT	aaa]`^aa^]aa_a`a]]]`_]aa^_Z\`aaaa\YQ	chr10.fa		5907446	F	36	119					
+HWUSI-EAS610	1	4	27	437	1226	0	1	CACTAGCATCCCCTCTGCACCTTGCCCACTTGCACA	aba[`^`[a`baaababaaab]`]`abaaaa`a_aa	chr10.fa		5907451	F	36	119					
+HWUSI-EAS610	1	4	68	1734	1779	0	1	AGTACTTGTGAAGCTGAGACACAAGGATCAAAGGGC	`b`a^b`bba_aa[aZ_b^`[P^a]`_^U_a`_`a_	chr10.fa		5907704	F	36	119					
+HWUSI-EAS610	1	4	68	1189	487	0	1	ACCAAGTTTTAGAAACTAAGCCTGAAAGTCCGTGTG	]a\\]aH_]]\V_P^N_bVX[Vaa`WV]WIR\XY\Z	chr10.fa		5908043	F	36	117					
+HWUSI-EAS610	1	4	53	896	588	0	1	GTAAAATTTCAAAAAGGGAAAGACATGTATTGTGTG	aaaaZVaa_^`a^`]^T_Y__aOV]a^\___a]a^a	chr10.fa		5908178	R	36	119					
+HWUSI-EAS610	1	4	35	76	294	0	1	ATGAGCAATACCACATCCTCAAGGGAACCATGTCTG	a`]`bbbababbaaaabb`aY]bab_aabaaaaaaa	chr10.fa		5908907	R	36	119					
+HWUSI-EAS610	1	4	98	350	295	0	1	ACTCTCCCGGTGAAACTGTCTCCTCTCCCTCTCTGC	X``bb`]R]_E]_aaab]^]ba]a_^aU]GRa]YaZ	chr10.fa		5909025	R	36	116					
+HWUSI-EAS610	1	4	61	1425	971	0	1	TGGAAACTCTCCCGGTGAAACTGTCTCCTCTCCCTC	ab_Z`aZa]]Z_```U`^\aYQX]WUVQX^S^YXBB	chr10.fa		5909030	R	36	110					
+HWUSI-EAS610	1	4	82	65	266	0	1	TGGAAACTCTCCCGGTGAAACTGTCTCCTCTCCCTC	a`b```babaabab`Ub`aZWa`U_^aaaa``bb]a	chr10.fa		5909030	R	36	119					
+HWUSI-EAS610	1	4	37	1389	1237	0	1	TGAGCCTTAATCAGAAAACTTTGTCTTGGCTTCATG	aa`aaa_`__`Z^XWY___aa]UY__YPUXa\XZBB	chr10.fa		5909141	R	36	25					
+HWUSI-EAS610	1	4	66	851	854	0	1	CTTAATTGTCTTCTGCCATCTGAGTGGAGTCTTCCT	abb_baba_`aa``]`a`aaba__X_\``_]aa`aa	chr10.fa		5909302	R	36	119					
+HWUSI-EAS610	1	4	41	1754	370	0	1	GTGCAGTAGAGTTGAGAAGGTGGGTGGAGCAGCACA	`WS`^XDZ`PKVVNZZZ]ZFHFZOIDX^MWNK^]TX	chr10.fa		5909581	F	20A15	97					
+HWUSI-EAS610	1	4	44	223	1765	0	1	GTATAATACAGGACCATCTTTTGCTTTTGTCTCACT	_J[]^`YU_``_Z`XMX_``USI_R]aa\T`a]_SR	chr10.fa		5910236	R	36	117					
+HWUSI-EAS610	1	4	29	1581	1421	0	1	GGCTTGTTTCCCCTCATTCACATGAACCCCATCTGT	a\^_`YW^^\^bUW^T[\\TWW\\WTWWVYWYYY\Y	chr10.fa		5910307	F	36	118					
+HWUSI-EAS610	1	4	71	122	416	0	1	TGTGCACCCTTGTTCCTTTTCAATCAGGCCAATAAA	]bW\`abbb`babab_]]`ab__U_Z`aaabab]S^	chr10.fa		5910515	F	36	119					
+HWUSI-EAS610	1	4	32	21	1193	0	1	AAAACCTTGTCTTAAATTAAAAGGACAGGAAGGAAG	]]]Yaa__a`aa]Z[]`_]\[T`_`^_aa_``__`]	chr10.fa		5911017	F	36	119					
+HWUSI-EAS610	1	4	34	832	502	0	1	TGTTGTTTTCTCACCTGTTGATTAAACAGGCACGGT	]aa]b`a_bab^`a^V`_`baaa```_a`][a^ZUR	chr10.fa		5911174	F	36	119					
+HWUSI-EAS610	1	4	13	1519	1769	0	1	GACCTGTCTGTCTTACAGCATCTGTGTTACTAATTG	a]PXYWNTR]X[\`[T[Z[^YV\^UZOUMMWUTT^_	chr10.fa		5911338	R	36	118					
+HWUSI-EAS610	1	4	25	1731	1469	0	1	CGTATTAAAATAGTCATATGAAAAGGAATTTGGACC	ababbbbbabb``abbbbbababbbababaaaaaaa	chr10.fa		5911801	R	T35	81					
+HWUSI-EAS610	1	4	6	396	712	0	1	GGAGTTCAGTCTCATATCTATAAAGCAAATAAAACT	^YRYX``[aWa``YT\XOOJYFXLWFZVHT_a[SZ_	chr10.fa		5911839	R	36	114					
+HWUSI-EAS610	1	4	71	286	447	0	1	AGCGGCACACAGCTGGAACCCCTGCTCAGGAGGACA	U]a_\\Z__YO\\YXXRYUX\]VQQXOLVVBBBBBB	chr10.fa		5911927	F	36	29					
+HWUSI-EAS610	1	4	56	1727	106	0	1	TCTGATTTAGAAAAAGAAATTGAGTAGATGGAAAAG	a[\OQ]\]_N[\[VP[S\\]YPVWTXKT_WOQX[\\	chr10.fa		5912289	R	36	117					
+HWUSI-EAS610	1	4	93	1034	1217	0	1	AACGACTTCAGCAATGCGGTTAAGTTCAAAAAAGGA	X\\ba\ba`ab[a_\_J_X]`YV^aZ`S_]bL`]]W	chr10.fa		5912325	F	16T19	104					
+HWUSI-EAS610	1	4	98	876	1213	0	1	AAATCAAAACCACTTTGAGATTTTCATTTCATCTTT	``bbaba``aaaabbbbbbababa`babbabaabaa	chr10.fa		5912407	R	36	38					
+HWUSI-EAS610	1	4	61	916	803	0	1	CTTCACCTCTCAGGAGTTCAACGAGAACTCGGTCGC	abbabbba``b`_aa`Z_bababbbab_a]ba^```	chr10.fa		5913310	R	36	119					
+HWUSI-EAS610	1	4	3	264	398	0	1	AACGTCCTAATTTTGCGTGTGCGCGCACATGCCATT	a`aa[`aaaa`_W^_aaQaWa_a``Ua__``^__`Z	chr10.fa		5913391	R	36	119					
+HWUSI-EAS610	1	4	40	1752	81	0	1	TAATGTATCCCACAGTGAGCTCGAACTCACTACGAG	aaaa^Q_Y_^_aZZNUX`UZ\`QV^ZNWUWW]UGUX	chr10.fa		5913547	F	36	117					
+HWUSI-EAS610	1	4	80	1323	157	0	1	AGAAGGTACACAGCGGATCTAGCTAGGTCCTGACGC	]^baWUYaaaaaI]Z]_`aX`SX[U`YUPVVG^YTT	chr10.fa		5913647	F	17A18	80					
+HWUSI-EAS610	1	4	97	177	1787	0	1	GGACATATTATGCTTAAGGATAATGCTCAAAAACTG	aaaa\_aaaaaaaaa]^aa`_^a^aa_a`^_\``]`	chr10.fa		5914673	F	36	119					
+HWUSI-EAS610	1	4	92	819	1687	0	1	AGGATTAATACTTATAACCAACACTCATCCGTTCTC	`_aU__XV`GYZZVXaY__WZS[H[YY^^MDP^HSX	chr10.fa		5915003	R	30A5	107					
+HWUSI-EAS610	1	4	78	196	1472	0	1	GACAGGATTAATACTTATAACCAACACTCATCCATT	aa`]`aaaa[aa``a```^`__`]\[^_`_^_a[_]	chr10.fa		5915006	R	36	119					
+HWUSI-EAS610	1	4	94	1243	900	0	1	GGCATTCTNTAGGGAATGCTGCAGTGTTGCAGAAGG	`]aaaa_[D^aaaa`aaaaaa_T_Ya_`^[``[[`a	chr10.fa		5915263	F	8A27	110					
+HWUSI-EAS610	1	4	64	426	1419	0	1	TGGGGATGGGTTGCCGGCTTTCACCACTGGACTTTC	`baabYaaa`Ma`ab_aa]a]]__`Z\`a^^^`^`]	chr10.fa		5915601	R	36	119					
+HWUSI-EAS610	1	4	35	1388	1807	0	1	CACATGCTCACATTTGCCTAAGCCCTAAACCCGGAA	aaaa_aaa`baa__aaa`aaa`_a``aa`_Za`aaa	chr10.fa		5915915	R	36	119					
+HWUSI-EAS610	1	4	69	217	1361	0	1	CGGCAAAGTCTACTACCCAACCCCTCACACTTTCAG	aaabXXS^`aa^_MHRa_^^^aaa\`^a][^\]_R\	chr10.fa		5916509	R	1A12G21	68					
+HWUSI-EAS610	1	4	67	379	15	0	1	GCAGTATAGACGACCCAGTGTGGCCCTGGCTGGAGG	a```Z``a````^Y\\X`PXP^\ZXZ\XPSBBBBBB	chr10.fa		5916560	F	5G29A	53					
+HWUSI-EAS610	1	4	72	1644	1815	0	1	ATAGTAGACGCGGAACATTAGCTGGGTGTGAAGGAC	aaba^a_``a_\]L]V_aa[`Qaa`aQ^Z__Y```[	chr10.fa		5916745	F	36	118					
+HWUSI-EAS610	1	4	69	1031	1714	0	1	AGGAATGGACGGGGAAGATAGGCAGAGACTGGAGAG	^ababbbbbabbbb]bb``^aa][_]_a\ba_Z`V\	chr10.fa		5916858	F	27T8	81					
+HWUSI-EAS610	1	4	25	955	1552	0	1	TAAGAGAGAATGGTAAGAACATAGTCCTAGCAACAG	aaaa^a`_a__[Y_`aa_a__aW\^_^a__\__]]`	chr10.fa		5917026	F	36	119					
+HWUSI-EAS610	1	4	65	561	852	0	1	GAGCAACTAGCCTCTAGTCTTCTCCTCTGGACTATT	aaaa``]`a\^aaaa[a^^aa^]__a_`]a^_`__a	chr10.fa		5917257	F	36	119					
+HWUSI-EAS610	1	4	43	1666	1641	0	1	CTTCAAATTTATGAAGATCTGCTTGTTTCTGCCTCC	W]b`\aa```^^[____`^`^__^_aX^_^\]aY`Z	chr10.fa		5918586	R	8G18C8	47					
+HWUSI-EAS610	1	4	65	1100	1173	0	1	AGGACCAACCTTCCAGATCTGTCTGTGAATGAGGTA	]J[SV[]`^aa`V[_]N]WVSQV`a^`V\aa]`^S\	chr10.fa		5919338	F	36	56					
+HWUSI-EAS610	1	4	80	1763	655	0	1	GTTGGGATGCCAGCCTTCCTACCTCTGGAGAAGTGG	`aa]aS_a]a]\GY]a`^_`aa_`U_YQYZT^^W_S	chr10.fa		5920013	F	36	118					
+HWUSI-EAS610	1	4	41	1607	698	0	1	TTTGTCAGGCATGATAACAGTCCATGGCTCAGAAAG	abba_baXXU[YS][_a_a^T`^__[Y\^_VXS]]_	chr10.fa		5920322	F	36	119					
+HWUSI-EAS610	1	4	46	664	29	0	1	TGCACTGCCTCTACACAGACACTAACAGATGAAAGT	abaa]aa`a^`aaaaaaa_a__aaaa`a`_a__`aT	chr10.fa		5920628	F	36	119					
+HWUSI-EAS610	1	4	37	473	1702	0	1	TGGAGAAGTGGAGCAGAAGGTTGCAAGCTCTGAGTC	W`^R]X]\Qa^W]]bb`Xab_aa]R__UV_ab]]BB	chr10.fa		5920736	F	36	110					
+HWUSI-EAS610	1	4	57	1737	447	0	1	CGTAGATCCCCAAGTGATGCTTCAGTGTCCCGTGTC	a[]_T_`_]`aaaTYV]`W]a`\ZNUWQ[^]XQX\_	chr10.fa		5920905	F	36	118					
+HWUSI-EAS610	1	4	51	767	303	0	1	GTGTCTGGCCGTTATCCGTAGATTAGCTCCCAGGAG	^Va_[^`R\^][aa^`[\X`a^``VYYP]QV\`MS_	chr10.fa		5920967	R	36	118					
+HWUSI-EAS610	1	4	36	328	787	0	1	ACAAGCTCCCTTCCCCAAACCTGAAGTGCACGTGTG	aa`X]aa`ba_a^aaaXXYa^aa\X`Ua`^[_\aS_	chr10.fa		5921264	F	36	119					
+HWUSI-EAS610	1	4	30	927	1037	0	1	CTAGTTTTTACACNCGTGCACTTCAGGTTTGGGGAA	a_W_]abbaaba[D[``a``\]`^]bbW`bba\b^`	chr10.fa		5921274	R	6C6A22	71					
+HWUSI-EAS610	1	4	22	297	942	0	1	GTCTTTGGTGCAAGCTTTCCTATCCCCCATGGATGA	`]R]SNQQJLLZVXZ\P[PV\PGLPTYYRW`BBBBB	chr10.fa		5921548	R	32C3	91					
+HWUSI-EAS610	1	4	20	329	696	0	1	ATAAACAGGACTTCTCAGCCTTGTGACTAAGATTCA	aaUZ^`[S^P`X[Va_T]T\^_]Qa\_X`QZa^^[a	chr10.fa		5921718	F	36	118					
+HWUSI-EAS610	1	4	69	1754	983	0	1	ACTAGTTGCAGCTGTCTGACTTGGTTTCTTCTGGAG	a`aaa_a]aaX^`__aa[_]aa\TQa`Z_a]_[Z[`	chr10.fa		5922533	F	36	119					
+HWUSI-EAS610	1	4	69	95	1979	0	1	GAAGTCTCCTTCCATTTACTCCTGTGCTGCTTATGA	ZOR`_aaaa^]_b___^_T^[_^U]a\O]QZUPZUW	chr10.fa		5922741	F	36	118					
+HWUSI-EAS610	1	4	84	854	456	0	1	GTTACACTTTCTGCTCTATTTCATAAGCAGCACAGG	a```__`^^^`Z_^____`_`]`]ZY\]^[U\YX__	chr10.fa		5922761	R	36	119					
+HWUSI-EAS610	1	4	27	1367	1830	0	1	TAGGCTGGCTGAATCCATCCTTCGGGAAGTTGAGAG	aabbaV_aS`_\_\^^`__QWZV___WXSHT_WUU^	chr10.fa		5922812	F	36	118					
+HWUSI-EAS610	1	4	27	1567	65	0	1	AGAACCAAAGAGACAACTCCAGCTGGGTTCCTTACG	aY`aZaZ``\]\`W\`^\`UUHVUVQTWYWYWUYUB	chr10.fa		5922867	F	36	113					
+HWUSI-EAS610	1	4	94	172	739	0	1	AAAAGCTGGTTTGGGTGCTGAAGAGATGGCTCAGCA	aaaaaaaaa\`aaa`Yaa_a`_a_`\\_W`___``_	chr10.fa		5923509	F	36	119					
+HWUSI-EAS610	1	4	54	364	897	0	1	GAGCCTTGCTTCCACACGATATGAGTGTCTGCATAG	aabaa`aaaaaa__a_aa_^Z_]ZZZ_VT^`^VQYY	chr10.fa		5923822	F	36	119					
+HWUSI-EAS610	1	4	24	1276	861	0	1	TGGTAGCTGGACCCCACTAGGGAACTCTACTCTGCA	abb_aa`baaaaaaaaaa]a_``aa````^__`a_Z	chr10.fa		5924260	R	36	119					
+HWUSI-EAS610	1	4	100	833	1579	0	1	GAAGGGCTCAAGCACCTCCAATGGTAGCTGGACCCC	`]_a`aa`^`\\\\R`Q``a`\]XPZ`\a_a]W[Z^	chr10.fa		5924281	R	36	119					
+HWUSI-EAS610	1	4	65	1089	925	0	1	CTCAGCCCTATGATCATCCCCCAAACAGGACCTGAT	abRbb`aaaaaaa]^`a`aaaaaa]Z_^a_^_aa][	chr10.fa		5924323	F	36	119					
+HWUSI-EAS610	1	4	72	321	1609	0	1	GCTGGCTTTGAACTCACTGAGACCAGATTGCCTCTG	abab`aa`baaaabaaaaaaaa_a]aa_``aaa_Z`	chr10.fa		5924632	R	36	119					
+HWUSI-EAS610	1	4	35	1676	1198	0	1	TGTACACCAGGCTGGCTTTGAACTCACTGAGACCAG	`_Uba\`_[\U^ZT^W^aa\\\\`ZZKXKX[UQBBB	chr10.fa		5924642	R	36	10					
+HWUSI-EAS610	1	4	87	1764	190	0	1	TGTACACAGCAAGTACCAAGACAGCCAGAGCTATAT	aU\^_a^]U\_`VS`O`_YSU^^OYQ\][OTG`[_]	chr10.fa		5924672	F	36	25					
+HWUSI-EAS610	1	4	3	622	996	0	1	GTTTGGAGATTTCAGTCCATGGACAGTTGCCCATTG	`Z]b]__a_Y_`_aaY[S[]`aX^__UXIU]PH[_a	chr10.fa		5924937	F	28C3G3	92					
+HWUSI-EAS610	1	4	39	1036	1156	0	1	ATGCCCCTTAACACAGACCCCCAAACAATGGGGAAC	aaa`aa`aaaa[a`a`a_a__``[\\_^a_^Z^\`^	chr10.fa		5924962	R	28C7	81					
+HWUSI-EAS610	1	4	19	1580	1558	0	1	GACGCCAGCATCGTGTCATGAGCAGCTCCCCCTGCC	a_^aaVW\\UXY]N_KPQ`\M[GGYSSNK\NKPP^B	chr10.fa		5925016	R	36	110					
+HWUSI-EAS610	1	4	65	504	171	0	1	ATACTGGGAAGTGCTGCAGTTTTTAATAGGTGAGGC	abaaab]b^`__a`ab`aa^aaaaa`aa`a_a^aaa	chr10.fa		5925096	R	26G9	81					
+HWUSI-EAS610	1	4	34	117	461	0	1	TAGCCTTGGCTGCCCTAGAACTGACTACATAGACAA	aU]bba_babaaaabaY_T]`ababaabaYaaQb`T	chr10.fa		5926247	R	36	47					
+HWUSI-EAS610	1	4	15	1618	300	0	1	TACAATTAGCAATGAAAACGTATGTCATTTCAATCC	a^\^ORZ\`aaaXP\_][\W\_^[]\\XTVX]^^ZY	chr10.fa		5926345	R	36	118					
+HWUSI-EAS610	1	4	52	36	1684	0	1	CAGGCTTGGCTTTAGGGATGGAGATCAAAACCAGGG	_P]_aa_aaaa`a``__NZ__^`__a^YY_^\MZ_\	chr10.fa		5927110	R	29T6	83					
+HWUSI-EAS610	1	4	79	1535	1628	0	1	ACTTAAAGGTCTCCTATTGTTTTAGACAAGGCACCA	]^bbaba`^`^\][aa`a]^aa]a^[``ZaWZ_`_a	chr10.fa		5927238	R	36	119					
+HWUSI-EAS610	1	4	3	1617	1590	0	1	TATTTCATTCTTGACCTATAGTTGTACTGAACATAA	abbba`aa__a`__``aaaaa^aa]]_``__^^__`	chr10.fa		5927330	F	C35	81					
+HWUSI-EAS610	1	4	35	1442	106	0	1	ACAACATGCTCCAACCTACAGTACTAGAGGTGTTGT	aa`aba`N_aa``aa`a\a]XW`aaXRYTLR\^[[^	chr10.fa		5927428	R	36	118					
+HWUSI-EAS610	1	4	34	901	1308	0	1	GGTATTTTGCTTATATTTCTGGCTGTACATCATACT	ab`aaabaa_aaaaaaaa`aaa_a``_^\`__`_[`	chr10.fa		5927533	F	36	119					
+HWUSI-EAS610	1	4	29	1526	540	0	1	GTGCACACAGCTGAACCTAGGCAGTGCTCTTAACCC	\\`babbbb_aWQ\bbbbbWK_]`J[abbaa]bbba	chr10.fa		5927653	F	36	118					
+HWUSI-EAS610	1	4	23	842	1427	0	1	GTGCTCTTAACCCTGAGCCATCTCTCCAGCCTTGTA	^_aabab`[aaaaa`[`aaaa`aaaa_ZaW^a`a_`	chr10.fa		5927676	F	36	17					
+HWUSI-EAS610	1	4	8	1778	1000	0	1	GTGTGCCACCATGCCCGGCTAAGACACAGCTTTGAC	]T_]\TZ`]P_a]Z\_^^aaa]_\^]\_^YWZXQ\\	chr10.fa		5927856	F	15T20	53					
+HWUSI-EAS610	1	4	19	1534	146	0	1	ACACCAGTCAAAGCTGTGTCTTAGCCGGGCATGGTG	aab^\]`]`aa]NSYLWXZXa`TOU_KPKR^ZNQSB	chr10.fa		5927862	R	26A9	97					
+HWUSI-EAS610	1	4	86	500	1841	0	1	GGTTTGCACCCAGATGCTTGTCGTCCCTAGGGTGGG	aa^_``^^a``\a^`^`[`aR``U]^`XX^a`P]\`	chr10.fa		5928018	F	36	119					
+HWUSI-EAS610	1	4	40	353	1262	0	1	GTCTACAGCTGCTCATGCACTGACACGGGAGATCCC	aaa`__X[b_a`_]\`_aSYV\`a^`_``a[OSY`a	chr10.fa		5928067	R	36	119					
+HWUSI-EAS610	1	4	53	326	1225	0	1	ACTGAGAATACGGGAGTATAATCACTCGATGGATCA	a`a``aa``a^a`_^aZ_`a_^_`^]]_^Z__Y]Z^	chr10.fa		5928848	R	36	119					
+HWUSI-EAS610	1	4	19	1001	1748	0	1	ATACAGCTGAACTAAATGAGACACTCATAAGTGCAA	^Z\^^]Z\a`[Z]W][__VZ]UT\`W^aIQNXX]VB	chr10.fa		5929541	F	36	113					
+HWUSI-EAS610	1	4	56	1726	580	0	1	TACCCCAGAGACTGGCCTCACAGTGCAGCCGATCCC	^`aaaaaXa[_``aX`aa`aaaPPP]a\`]\`U```	chr10.fa		5929739	R	36	118					
+HWUSI-EAS610	1	4	93	34	1610	0	1	AGGCCAATAACAGGCCCTGCCTTATGGGTGCTCATG	^``aa\K_Z_aaab__]Zaa]`Y][`a_S`R\`[U\	chr10.fa		5929974	F	36	118					
+HWUSI-EAS610	1	4	58	137	640	0	1	AAGAACTGCTAAGAGCTATGGCTACAGCCCTATGGC	SXaT^babaaX`a_bbaaabaa_a```aaaUTW^aa	chr10.fa		5930178	R	36	119					
+HWUSI-EAS610	1	4	83	1495	312	0	1	CATGCTCTTCCATCTCAGGGCATCGACTCTGCTGCC	abaa]]aa`Y`aa\aa`]`^^a_`]a_]`a__^^^T	chr10.fa		5930243	R	24A11	85					
+HWUSI-EAS610	1	4	55	504	74	0	1	TGGCTGTGGTTATTCTTAGTGAATATCCTTCCACAT	aaVaaa[P^Ya^PDJ__]_]_X]_[\\\_`_V_Z^`	chr10.fa		5930946	R	13A22	109					
+HWUSI-EAS610	1	4	53	970	447	0	1	GTAAGCTAAATTTAACAAAANCCAAAGCAACACGAA	`abab`bba_aaaa`aaaaYDX`a]_`_`a__\^TX	chr10.fa		5931373	R	20G15	110					
+HWUSI-EAS610	1	4	60	265	2015	0	1	TGGCCCATTGGTTAATTGGATTTGTTGCAGAAGACC	`a`aa[JX`aaY^\\^`]ZU\__]\]_XJSTTRRRS	chr10.fa		5931546	R	36	117					
+HWUSI-EAS610	1	4	94	1701	1919	0	1	AGTTAAACACAAATCCTGTCGTCTGGTGTGGTGCTG	aaaa`aa]aaaaa`[__a`^aR[W`_LQR`WDXYR^	chr10.fa		5932101	R	36	116					
+HWUSI-EAS610	1	4	57	115	1327	0	1	TACTTAACAGTAAATCCTTCCCGGAACAATCTCATA	abaaaabbaa`aaa`aaa``aaaaaaa`aaa__a_a	chr10.fa		5932245	R	36	119					
+HWUSI-EAS610	1	4	18	1107	338	0	1	CCTCGCCTCCTCACCCGAGAATGCTGTCAGGCCTCA	__aa`a_aa_`aa_aX_aaa_]\aaaR^`^][`^``	chr10.fa		5932354	R	36	119					
+HWUSI-EAS610	1	4	17	584	1850	0	1	GTTTAAATTACAGTTAGAAACTCAGGTAGGTTGTGG	aZaaaaaaaa`__\a]_a_aa`___`[\[_[__T[B	chr10.fa		5932395	R	36	114					
+HWUSI-EAS610	1	4	89	594	211	0	1	CTCAATAGAAAGATATAGTAGATTAGTAATTCCACA	aabaaaab^a`a^baaab_abaaabb^aa`a_aa_a	chr10.fa		5932494	R	36	119					
+HWUSI-EAS610	1	4	17	1681	1789	0	1	CTATTGTGGAGTTAAAAGATGACTCAGTGGTCAGGA	aa``S[G_aY_`aaa^]a]]`NP_`YQ[^[XYSLQ^	chr10.fa		5932576	F	36	117					
+HWUSI-EAS610	1	4	72	336	659	0	1	ACAAGTTTTACCCGACATTTTTGTGGGTTAATTCCT	aaXVaabbaaaaabaaSaaaaaa^``_Y_]_a```a	chr10.fa		5932777	F	36	119					
+HWUSI-EAS610	1	4	34	150	644	0	1	AAATTTCTCTAGAATGGCGTCATCCAAGTCCAGCTC	S^\_`_]aaabb__YZ_a]Za\O]`]W]Yaaaaaa_	chr10.fa		5933169	R	36	43					
+HWUSI-EAS610	1	4	31	1269	1988	0	1	ACTTCTCCACAGTGTAGTTCCTTAGTTCCTATTCCC	a^ba^a`a__aa[`_Xa]a]^Y[_aU`^[^_Z]^^_	chr10.fa		5933381	F	30T5	83					
+HWUSI-EAS610	1	4	49	1439	1527	0	1	CTCAGCACACGAGCTGGGCTATCTCTGAATTAGAGC	abbabbaaa]baaa`baa``ba``^ab`_^``]]^]	chr10.fa		5933464	R	36	119					
+HWUSI-EAS610	1	4	84	1534	1379	0	1	GGATTCGCTCACAGCCCTGAGGAGTATAAAAAAGGC	`bb`aTa`QZHYXZMRV\_QXXUTWQ\UVZ_]WBBB	chr10.fa		5933556	F	29G6	74					
+HWUSI-EAS610	1	4	27	1548	744	0	1	TTACAGGTAAGATAAGGAGAGGGGCTACAGAGACGG	a_[a`a`\`__\`\_``_`____U^^_]]SZ^YS^\	chr10.fa		5935215	F	19C16	83					
+HWUSI-EAS610	1	4	65	1321	2024	0	1	GTTACCTGCAAGNGCAGCAAGTGCTCTCAATATCCG	a``\_WX`NZ_XDVW__W[Y_U^STW^WWWVW]WYV	chr10.fa		5935248	R	12A23	110					
+HWUSI-EAS610	1	4	36	529	560	0	1	ATCTGGGTGCTGGGAACCCAGGTTACCTGCAAGAGC	_bbbbba`ba`a``aaaaaaba^aaa_`^aa`Yaaa	chr10.fa		5935269	R	36	119					
+HWUSI-EAS610	1	4	63	1642	1500	0	1	AGTCCCCATCTGGGTGCTGGGAACCCAGGTTACCTG	a`X\``^``\`Y^SP`^XV]Q^^SY][SYK[ZZ\RZ	chr10.fa		5935276	R	36	118					
+HWUSI-EAS610	1	4	63	297	1090	0	1	AAACATCACAGCAAACACTGACTTTTTTTTTCTTTT	\^V[a_bbb_aa_\Y_`^baaabaabaaabaaaaaa	chr10.fa		5935585	R	36	119					
+HWUSI-EAS610	1	4	30	90	1017	0	1	GCCCCCACCCCCATGAGGAGCAGCCAGGCTCTGTTA	``aaaa`[aaaaaaa_\V[Xa`^_][___MX``\_Z	chr10.fa		5935908	F	36	119					
+HWUSI-EAS610	1	4	40	978	1016	0	1	GCTTAATGCAGATGAGTTCTGCTCTTGTGAACCCAT	aabbaaa_S_a`a[Wa_a``[^`[a__^`]]^W`_a	chr10.fa		5935962	R	8T27	95					
+HWUSI-EAS610	1	4	84	1530	300	0	1	GCAATTAAGAGTCTTGTTGCTCTCCCAGAGGACGTG	ab`\aaa`__]Q_aa`ZaaVa[a\````^^`_[^G_	chr10.fa		5936813	F	36	118					
+HWUSI-EAS610	1	4	55	1418	950	0	1	ACATGTGTACACGCACGCACAACACACACGCACACA	a[a`aUaW\O^]__\Q[_a\Z]^`W^\`\WW\S^^_	chr10.fa		5936928	F	11T24	85					
+HWUSI-EAS610	1	4	82	168	1826	0	1	AAAGAATGAACAGCTACTTGTATTTATTTTACTATG	]FSY`baa\^^aab``_U]a]a`]a]]_]`[aXRR`	chr10.fa		5937694	F	36	117					
+HWUSI-EAS610	1	4	28	1333	1139	0	1	TTTAGTTCATCGTTGGAGGAAGTCGGGACAGGAACT	aaa]XV`[_a^]TV`_[`_a^^P[^^[[Z\[Y^\[X	chr10.fa		5937825	F	36	119					
+HWUSI-EAS610	1	4	39	374	1197	0	1	AGTTCATCGTTGGAGGAAGTCNGGACAGGAACTCAA	]^]bbabaa^bb`ab`a_a\[DYaa`a_a_`_aa_a	chr10.fa		5937828	F	21G14	16					
+HWUSI-EAS610	1	4	83	1296	755	0	1	GAGAAAATGCCCATGAGATCCAGCTGGAAGGCATTT	a`b[YU_a_aaaabb_`aaaabbaaa^_`aaaa]a`	chr10.fa		5938037	R	36	119					
+HWUSI-EAS610	1	4	38	1366	346	0	1	GCTGCCAATGCCAAGCTAGCCTGAGCTACATAGTAA	abb[_`^_UY^]]]GZ_V_aPTP]]YPYMW^V]WBB	chr10.fa		5938255	F	36	109					
+HWUSI-EAS610	1	4	52	764	139	0	1	TAGCCTGAGCTACATAGTAAGTTCCAGGTCAGGCTA	a`aa_aaa^`__]_a`aW]R_[^_^Z__Z^]_^^a`	chr10.fa		5938271	F	28C7	8					
+HWUSI-EAS610	1	4	77	578	883	0	1	GATATAGAGGGACCTTAAAGGTGGTCAATGAGTGAG	`K^\^_a^`aUWS[`[__[_]Y``RZSW_ZN\O_]_	chr10.fa		5938376	F	36	118					
+HWUSI-EAS610	1	4	25	1196	632	0	1	ACCATACCTTAACTCTTCGCGTGATGCTAAGTAACT	`abbab^a_abb_aaaaaaab_a__`_ZDXYR_a]\	chr10.fa		5938708	R	31G4	94					
+HWUSI-EAS610	1	4	15	357	6	0	1	AGCATCACGCGAAGAGTTAAGGTATGGTGCATGCCT	aabaa_aaba_aaaaa_aaaaaQa`__\_`^`a\a`	chr10.fa		5938716	F	36	119					
+HWUSI-EAS610	1	4	61	995	1748	0	1	AGAGGAAGACTGAAGTTACCCTCTAGTGTCTATAAG	abZ``aaaa]a_T\a_aaYQZaa`Y\R_`^`_]^`^	chr10.fa		5939378	R	36	119					
+HWUSI-EAS610	1	4	25	884	1055	0	1	GGCTGCAAGCAGTTGCGGCCTGCCTGCCTGGGAAGG	_aaa__aa_TX`^``_X_`_Ha`_`[`[X`a^WW\`	chr10.fa		5939660	F	A35	82					
+HWUSI-EAS610	1	4	80	987	1788	0	1	GAGGGGTTAGTGAGCTGTGGGGGAAGAAGTGGTTCT	a`b`aaYX_`H``\Y`_Y___aSP_`Z`aU^aV^^^	chr10.fa		5940068	F	19C4G10C	12					
+HWUSI-EAS610	1	4	18	723	1867	0	1	TGTGAGGTCTCTCAGACTAGGATGCTTAGACTAGGT	``X``aaQ`__aa``a``__a`W_____``_`_`BB	chr10.fa		5940103	F	C29A4C	35					
+HWUSI-EAS610	1	4	54	414	235	0	1	CACCTAGTCTAAGCATCCTAGTCTGAGAGACCTCAC	]]\^__bbZa^V\\\`_\\aba^\__XZZZRX]_ZS	chr10.fa		5940104	R	1G4T29	46					
+HWUSI-EAS610	1	4	25	1708	1020	0	1	GGTGCAGCCATACTGAAGTATTCTAGTTTCCCCTTT	abZaabbb_abaaaa```\aaa`aaa^aa_`___a`	chr10.fa		5940199	F	36	119					
+HWUSI-EAS610	1	4	50	441	770	0	1	ATAACAAAGCACACCAAGAGACATCAAAGGGGAAAC	aaa``aaaaaaa``a_`aa``a`_\_``a```Y___	chr10.fa		5940224	R	36	119					
+HWUSI-EAS610	1	4	51	340	999	0	1	GTACAGAGAGCCTGAGATCACTTGGAGACCCAGGAA	`M[^Z]``[a___`__Z^^\_^_^WV^_U[[^_[QQ	chr10.fa		5940477	R	36	118					
+HWUSI-EAS610	1	4	32	1396	1044	0	1	TAATCATCAAGGGACTTCTTGTTTCAAGATGGGGTC	aa`aaa]aY`aX___aa^aa^^``_a]__a_[a`Z`	chr10.fa		5940613	F	36	119					
+HWUSI-EAS610	1	4	75	942	1446	0	1	AGAACTTGCTATGTAGATCATGCTGGCTCTAGATTC	abab`a```ababaaaaaabababaa_aYa`aaaa[	chr10.fa		5940669	F	36	119					
+HWUSI-EAS610	1	4	5	1621	1040	0	1	GGCTCTAGATTCTGAAATCTGCCGCCTGCCTTTGCT	W__bb_b`a_[R\P___]^[[`U[[RUaTaZ_TZZR	chr10.fa		5940693	F	36	118					
+HWUSI-EAS610	1	4	13	940	238	0	1	CGCACAGACACACATAAGACAGATAAGGAGCTTTCC	a[aab``WP_aaaa_aZZ_aa]`^_`_a[a[`_`S_	chr10.fa		5940761	R	31A4	82					
+HWUSI-EAS610	1	4	57	1292	682	0	1	GTTAAAGACTCCTGGGGCCTCGAGTGAGCTCAGCGG	aYa```T\]^`MKYY\\ZXX[KUQPY\RTZT\]T^X	chr10.fa		5940878	R	24A11	97					
+HWUSI-EAS610	1	4	73	199	571	0	1	TTCTATCGACCGCTGTGTTCTGTGTGTTGACCCTAA	a]``]aabbaaaaabZ^L_a`]_a_a_a][]`a]XU	chr10.fa		5941113	F	7A28	80					
+HWUSI-EAS610	1	4	9	173	182	0	1	AGTTAAATGCTCTGTGCCAAACCCTGAATATGACCT	X``a`aa^aa_Z_b```a\`bbbbb_a\aaZ_^aaa	chr10.fa		5941159	F	36	119					
+HWUSI-EAS610	1	4	83	324	2040	0	1	GCAGGGATTCCATGGTGTAGCATCCAGATTTCCAGT	abbaaaSW``_]^__T_^`^a_Xa_L^_\ZZa`_\Q	chr10.fa		5941210	R	36	118					
+HWUSI-EAS610	1	4	60	735	603	0	1	ATGCTACACCATGGAATCCCTGCCTAGACTGCTGCT	_YOY`a``_T___]\aa``]]_Z]^`a_^]`^Z`ZZ	chr10.fa		5941223	F	36	119					
+HWUSI-EAS610	1	4	96	870	1491	0	1	ACGGGAACAAGAAACTTTATTAAGCATGACAAAGAC	aXZ`aaa`_`a_]a_`aa_a_]_a_aa__YO\]_X]	chr10.fa		5941704	R	36	119					
+HWUSI-EAS610	1	4	93	667	1587	0	1	TTTAAGAAATAGCATTTTGTTACGGGAACAAGAAAC	abbaabababaaaaaaaaaaaaaaaaXaaa`aaaZ_	chr10.fa		5941725	R	36	119					
+HWUSI-EAS610	1	4	46	1646	198	0	1	ATCTCCGCACCCTCTTATTTTGAGATGGGGCCTCAT	_VaW`_J]aYaWNZ]aabX_`H_PT]JRTDDL_ZRX	chr10.fa		5941968	R	12G17T5	87					
+HWUSI-EAS610	1	4	58	1068	1771	0	1	CGTGCAGCACCACTGCCCGGCAGATGCTGGGATCTT	_a`[`]\aa^_^^`aZ]``aa]XP]`ZZ^VJMVZ`a	chr10.fa		5942036	R	36	118					
+HWUSI-EAS610	1	4	84	964	1305	0	1	GTCTGCCTCTGCTTTTCCAGTGCAGAGATGAGTGCG	aUaab]Xa`a_a_aaa`^^aW`_ZZ]^^V]^]W`P^	chr10.fa		5943271	R	36	20					
+HWUSI-EAS610	1	4	36	1001	412	0	1	TTAAATGCTTAGTTGAAAAGATACTGATTTTTGCTA	aUL\_`a``aXV_T\IWXNXP_\Y_`Y_][X]UU^_	chr10.fa		5944849	R	36	117					
+HWUSI-EAS610	1	4	71	424	29	0	1	GTGGTGCACGCCTTTAATTGAAACACTGGGGAGGTT	a_aa_aa_`aaaaaa_aaaaa`a``_aaaa`\`_V_	chr10.fa		5945212	F	10G7C17	43					
+HWUSI-EAS610	1	4	80	1088	1073	0	1	CAAAACCAAAAACTAAAGCCTTTGTGCGCCTGGACT	abbb]babaabbbbbabbbbbbbb`b`baabb^aaa	chr10.fa		5945380	F	36	119					
+HWUSI-EAS610	1	4	7	1340	554	0	1	ATGTTTGCTTTAGTGTTTCCATCTACTTGGCAAGTC	aa\_`\^\]aaa]]a`V_]`b`a`a__`RRZZ`UBB	chr10.fa		5945467	F	36	110					
+HWUSI-EAS610	1	4	46	1183	1085	0	1	GTCTCTCCAGCCCTGAAGTGGATTGCTAATGATCTA	a_`a`a``aa^`_aa___[a`^`__^_^_^^VYS`_	chr10.fa		5945979	F	36	119					
+HWUSI-EAS610	1	4	68	410	338	0	1	AGAACCCAGAACTTCATACATGCTAAGCAGGTACTC	ab^ba[\_`^b__aaa\_`a^baa`aS_]__V`W``	chr10.fa		5946520	F	7G28	83					
+HWUSI-EAS610	1	4	43	929	1460	0	1	AGACTATCTCTTCAGAGTAAGCTCAAAAAAGAAAAG	`^Vb^bbaaP\baY_V_Yaa`___a`aaaa_VY\_`	chr10.fa		5946739	F	36	119					
+HWUSI-EAS610	1	4	78	1459	1169	0	1	GGGGATGCTGGCTGCTATCAGCTGAAGTCTTACAGA	ab`WU]N]]]VPNXR\\T`a^XQPKW`RUY]BBBBB	chr10.fa		5947287	F	36	96					
+HWUSI-EAS610	1	4	80	851	2018	0	1	TCAGGACTGATCTTCACATAAAGGCACGAGGACTGA	aa]\X`__a][`a\]a`a`aaaaaaa][^_Y``]`Z	chr10.fa		5947378	F	36	119					
+HWUSI-EAS610	1	4	53	577	1424	0	1	ACTGGTGGGCCAGTTCTTGCAGGATTTTCACATTTC	aabba^aaaaaaa_aaaaaabaa^`aaaaa`aaa``	chr10.fa		5947501	R	36	119					
+HWUSI-EAS610	1	4	44	758	1356	0	1	CAAGAACTGGCCCACCAGTCTTCAGACCCCCTCCTC	__P_`^^`aa_]_`__\a``````^ZX`]\`_^]^_	chr10.fa		5947518	F	36	119					
+HWUSI-EAS610	1	4	33	151	471	0	1	GTGTCCAAGTTCAGGTTGTAGTCTGGACATAGGTGC	aZb_abb`b_ababa[aa^aa`a`a``aaaaa`\aa	chr10.fa		5947642	F	18C17	84					
+HWUSI-EAS610	1	4	35	234	1922	0	1	CAAGTTCAGGTNGCAGTCTGGACATAGGTGCTGCAT	a[`baaababKD[aaa]b[``a\\`Z^_^aa_`a^\	chr10.fa		5947647	F	11T24	110					
+HWUSI-EAS610	1	4	25	56	1340	0	1	TGCTGCATTGGCCAATGTGCTGTCAAGAATGCTCTC	aa`_`a]]abaaab\]a]Y`ab`bVLW]aVbaR]Ua	chr10.fa		5947675	F	36	118					
+HWUSI-EAS610	1	4	11	325	1742	0	1	ACAGCTTCTAGCCTTTTATCATCCAGGCAGAGATTA	]_Y^PH\aab`]Y[Z`aa_baUa`_abRN]J_U]]]	chr10.fa		5947714	R	36	117					
+HWUSI-EAS610	1	4	74	759	1316	0	1	GGACCTCAGTAGGAATCACTAGGGGGAAAGGCAGGG	aa`a``]ZZ]XX`^`a^^^a^`a``]W\Ya`^^[_`	chr10.fa		5947791	F	36	119					
+HWUSI-EAS610	1	4	11	304	614	0	1	GATCCCATCTGGTAGCTGGCATTCTGTTGCTGTTTG	aaVa`^_]_a_^Za^[^\__[_`]aaX__Y\`MVWB	chr10.fa		5948208	R	36	114					
+HWUSI-EAS610	1	4	14	1436	507	0	1	ACTGAGAATGAAGGCAGAGCTTTACGTTAGTAGGCA	_X`^a[ab_abbMY``[^a]]`a\a\`__Y[\X`Ua	chr10.fa		5948347	R	5T3A26	49					
+HWUSI-EAS610	1	4	28	865	524	0	1	TTCTCAGTACCACATCCAACAGCCCTGGCTGCAACG	aaaa^`^^a_`_SZ`^``\^^XVTY^Y\^__Z]ZT]	chr10.fa		5948375	F	2A33	81					
+HWUSI-EAS610	1	4	26	204	984	0	1	TAGAAGGATGGCGCAGGAGCAGCACAGCTCAGGTCA	^Za[`]bTbb`ba`^`_O]]Q\^aZG\`aaaTa]`B	chr10.fa		5948428	F	36	113					
+HWUSI-EAS610	1	4	37	794	1386	0	1	ACTGACCTGAAGTCCTCACCCGAGGTAAGAGTTCTC	abbaaaa`aaa]aaab`a`a`b_\_^a^Z`__^_aZ	chr10.fa		5948969	R	36	119					
+HWUSI-EAS610	1	4	62	995	1807	0	1	GAGGCTGACCTGGGGCACCAGGCACACATGAGGTAC	aXaTa[[ZQ\X`]``ZaZ\UJTX^KRT\ZVDW[SZZ	chr10.fa		5949062	F	30T5	109					
+HWUSI-EAS610	1	4	31	1762	1115	0	1	TGGGGCACCAGGCACACATGTGGTACACGTGCACAC	_aX^`aaaaaa[aaaaaaaaaa__aa[`X\_^a```	chr10.fa		5949072	F	36	119					
+HWUSI-EAS610	1	4	75	1002	1473	0	1	AAACACCCAATGCTTTTCTGCCCAAAGGGCACTAGA	a``aa`[[a`_[[N^ba`aa_L]a_a``O[`^`]M[	chr10.fa		5949191	F	36	118					
+HWUSI-EAS610	1	4	82	1735	1303	0	1	GGTCTAGAGTGTAGCTTAGTGATACAGCACTTTTCC	_WLW`ba]TU[_bUa^ab`_[abbbb^\V_Yaaa`a	chr10.fa		5949332	F	36	118					
+HWUSI-EAS610	1	4	3	1781	446	0	1	CTTGAACTACTGAATATGTGCCAGGCAAAGGCTTTA	abbabb`aaaa^W_`aaa]^^`a_]_aaa[YY`^]`	chr10.fa		5949416	F	36	119					
+HWUSI-EAS610	1	4	55	1609	1664	0	1	GAAGCTCAATGAGTCAGGAGAAGATCAGGGTAAGAG	aba`a[bTa^W`[T_ZXXW^\`a_a\Wbaa]_\`_a	chr10.fa		5949498	F	13G22	94					
+HWUSI-EAS610	1	4	21	1338	1355	0	1	ATACAGAAATACTTGTAAGAGAATACTGATACAGCT	aaa`aa^YSXaa`a\^aa`_^a_`_[\``___`___	chr10.fa		5949661	F	36	119					
+HWUSI-EAS610	1	4	4	1521	604	0	1	CACCATGCCCAGCTGTATCAGTATTCTCTTACAAGT	abbbbb\aa_a_aa`]]_bb`Yaaaa^aa```aa__	chr10.fa		5949671	R	36	119					
+HWUSI-EAS610	1	4	11	400	64	0	1	GGTACTGTGCTAGATAATCACCCCCTATATTGTACT	Y`\aYY^ZS`\^\]ZY\U[Z`\\O[WZT^RYSQYYV	chr10.fa		5950216	F	36	118					
+HWUSI-EAS610	1	4	39	741	531	0	1	CAATTCCAGACCAGATGCAAATGCAAAGCCTTTTCC	aabbbaaa_``aabaaaaaaa`aaaaaa````a`_`	chr10.fa		5950343	F	36	119					
+HWUSI-EAS610	1	4	39	1107	684	0	1	GAAGGAAATAACTGACCCTACAAAGTTGTTCTCTAA	IS_aa`Y\\Q`V\U\a````a`\_V]^a]_H][]\Q	chr10.fa		5950429	R	36	117					
+HWUSI-EAS610	1	4	48	501	728	0	1	TTCATGTGAGTGAAGGCTGCTAGCATAATACTGGCT	aa``_`^a^a^a`_aa_aa_``a`````a__a_a__	chr10.fa		5950636	F	36	119					
+HWUSI-EAS610	1	4	43	1118	1167	0	1	TCTTAAAGCCCATGGCCAGTGACACACCTACTCCAC	aabbaaa\_^`\X``[`^_\a`[_^_^M^__a__^_	chr10.fa		5950693	F	36	34					
+HWUSI-EAS610	1	4	33	325	947	0	1	CCCAGCCCACAAAGTCTTAACTACAATATAAAATAC	abbaabbbaabb`a_aaaaabaaaaaaba`b``aaa	chr10.fa		5950999	F	36	119					
+HWUSI-EAS610	1	4	78	149	138	0	1	ACTGAAGTGGACCACACAGATCTAGAGAAATCACAG	aaa]`ab[aaaabab`a_a\^aa_a_a`_a_`_`[_	chr10.fa		5951233	F	36	119					
+HWUSI-EAS610	1	4	69	574	628	0	1	TACCACAGCACATCTGTAGACTAGAAACTATGCACT	_babb`bb_ba`aaaa_aaa`aaa_aaa_aaa``_`	chr10.fa		5951411	F	36	119					
+HWUSI-EAS610	1	4	79	923	1981	0	1	AATCTGCCTGCCTTAGCCTCCCGAGTGCTGGGATTA	aaaaaa_`]]]^_`aa_`_`^]]^^T[Y_[`][^_`	chr10.fa		5951517	R	36	6					
+HWUSI-EAS610	1	4	96	1574	1778	0	1	AACAACAACAACAACAAAAGAGCAAGGCTAAACACA	aaaaabbb`babab`_abaaa`ba_a`ba\bb^aaa	chr10.fa		5951635	F	36	119					
+HWUSI-EAS610	1	4	42	1501	634	0	1	TATGCATGTGTTTAGCCTTGCTCTTTTGTTGTTGTT	aaaaa_aa^a_aaa[\`aaa_a_a`a`a_`a^^_^a	chr10.fa		5951641	R	36	119					
+HWUSI-EAS610	1	4	33	205	941	0	1	AAGTAACCTACATTTAGGGGTAGTCTTATTTTCATT	aaaU__bb_]a_a_aS]a_`L^aYa`_^`_a`a]a^	chr10.fa		5951919	F	36	119					
+HWUSI-EAS610	1	4	57	303	1191	0	1	CACCACCACCCCAGTTTATAGGGTGCTGGAGATCTA	a_`aa__a_`]^T``a_XZS\ZZSVYU_\N\RPUZ[	chr10.fa		5951997	R	36	118					
+HWUSI-EAS610	1	4	88	1204	1086	0	1	ATGTAATAAACAAAATAAGCCGGTGATACCAGCACA	aba^aab`^][`[`^aba_a^aT\a^__^]_a\^]_	chr10.fa		5952390	F	2A33	81					
+HWUSI-EAS610	1	4	37	1294	819	0	1	CGGAACAGTCAGGGTTGTTACACAGAGAAACCTGAT	[a_^]__ZQWaU\[___ba_H_\S^]R_O_SUXaXY	chr10.fa		5952508	F	36	26					
+HWUSI-EAS610	1	4	98	1590	988	0	1	ATTACTTAGAAGGTCAAAGAGAGTGGAGAGATGGCT	a_a`abbaaaT`a^\``a^WT\WI\^\^^]Y_[Y^B	chr10.fa		5952595	F	36	114					
+HWUSI-EAS610	1	4	92	215	1286	0	1	TCCTCTGGACTCTGATGGCACCTGCACTTGCACATG	ab`L\aabaaWaX\]Y^ab_`_\aa^YYV`\X]a\`	chr10.fa		5953281	F	36	43					
+HWUSI-EAS610	1	4	35	1363	1362	0	1	CATACTGTGGTGGTGTCCCCACAGGACATGTAGTTC	`ba\_b_[abPbb`[`_bbbaa]WZa`[`_Z_aa`a	chr10.fa		5953331	F	36	119					
+HWUSI-EAS610	1	4	56	1569	1108	0	1	ACATGTAGTTCAACAGTGGTCACACTGGTGGTGCTG	aaaaa_aa___`__``^aa\^`\__^__W[[QSWYV	chr10.fa		5953356	F	36	119					
+HWUSI-EAS610	1	4	62	1668	1452	0	1	TTCTGAATCCTTCTGGGTTAGAGTCTTACTGGATGA	]TQ`_`___\``\_```U_`___ZXXX^[_]]Z]\^	chr10.fa		5953402	F	36	119					
+HWUSI-EAS610	1	4	79	844	817	0	1	GGATGAAACATGTGTTGGGGGCAAGCTTTGAGTCTC	ab[aaa`__`aa[`^aaaaa`__``__^^[_`^U_\	chr10.fa		5953432	F	36	119					
+HWUSI-EAS610	1	4	63	1302	229	0	1	TAAAGGAAGAAAATTTATTTTGGCTTAGGGTTCCAG	`aa_a``a__^``aa_aaaa`Z[\__`]YTQ_^^__	chr10.fa		5953586	R	36	119					
+HWUSI-EAS610	1	4	22	283	211	0	1	AAGGTCAGAACAGTTTACTTTTCAAAGACTGAATCA	a^b_]__`^a`^a^`^`]`_a__]`____^a__]^^	chr10.fa		5954225	F	36	119					
+HWUSI-EAS610	1	4	95	1298	324	0	1	TACTTCCCCTGAGGTCTGATTCAGTCTTTGAAAAGT	ababba__`a]`WaVaaaaaa`a__^a\\`_a_a_U	chr10.fa		5954241	R	36	119					
+HWUSI-EAS610	1	4	15	984	1907	0	1	GACTTCAGCTAGTTATCTGATCCCATCCTAATCCAT	aaaaaTa_[`R]W_^_]RZ`\SPF^`^Z_aWURV`_	chr10.fa		5954371	F	36	117					
+HWUSI-EAS610	1	4	2	1578	1542	0	1	AAGTGGAGTAGTTAANAGCTGGCTCCGTTCTAGGTT	a`b`baaa````aaYD[aaaa`a__\aY_Y\]_[VT	chr10.fa		5954421	R	15T20	110					
+HWUSI-EAS610	1	4	35	1433	1135	0	1	ACACCAGGACATTTAGCAATCCAAGAAGAGCTGGAG	a]aa`aa`_`aaa]]\a`[``XVWX]`XZYRYXXR\	chr10.fa		5954592	F	36	119					
+HWUSI-EAS610	1	4	32	529	1029	0	1	TGAAAGATGCATGTTATCTGTAAAATTGATGGAACT	aa]Z_a`aa`^``^`\`_a`Y`]]W^_a_``a^_\_	chr10.fa		5954879	R	36	119					
+HWUSI-EAS610	1	4	18	909	128	0	1	TAATAAAAAGGGCTGGAAAGACAGCTCAGGTTAGGA	a`abaaaaba]^^`a`_ab_a_`_^^\___V[`_`^	chr10.fa		5955012	F	36	119					
+HWUSI-EAS610	1	4	86	1479	1070	0	1	GTGAGGATCAAACTCAGGTCATTAGGCTTGCACAGG	`_a]_a[[YQ[QWXL[Z\LX`MDUXGG`PV[WN_U_	chr10.fa		5955213	R	36	113					
+HWUSI-EAS610	1	4	70	120	1366	0	1	AGTTAAGGGCATGCAAATCTGTGAGAACTCACTGAA	UabbVba[baT^`\_\^abbbaa_b_X_bbbabaBB	chr10.fa		5955370	R	36	110					
+HWUSI-EAS610	1	4	50	221	356	0	1	CTCAAACCCACAGCAACGCTGCTGCCTCAACCTGAC	a`aaa`abbaaaaaa``a`^aa]]^`_a^_aa^_Z`	chr10.fa		5955615	F	36	119					
+HWUSI-EAS610	1	4	29	1012	1777	0	1	CAGCAACGCTGCTGCCTCAACCTGACAGCTGATTAC	`bbbbbab``aaabbabba`ab`aabUbX`aaa```	chr10.fa		5955625	F	36	119					
+HWUSI-EAS610	1	4	24	553	53	0	1	CATATGTTGGGAAAGATACATTTTAGCCAAATATGG	ab`_bb]`bbaXX_ab_baa_Y__aa\[`aa_b^_[	chr10.fa		5955670	R	36	119					
+HWUSI-EAS610	1	4	38	1384	580	0	1	AGAGGGCATGAGACAGGCATGCTAGCATAGCCTTTT	a`a__a\]R^a_]\aMVS`XZ`^_\\[\^MZQ[Z[_	chr10.fa		5955719	F	36	118					
+HWUSI-EAS610	1	4	43	724	1574	0	1	AGGCATGCTAGCATAGCCTTTTGATCCCTGCACTCA	aaabba`abbaaaaaaaabbbbabaa`_aaaa`aaa	chr10.fa		5955733	F	36	119					
+HWUSI-EAS610	1	4	93	275	1907	0	1	TAAGTTCAAGGCCAGCTGGGTCTACACAGTCCATTC	aaa__aa_W_`ba[aaN`Q_Ub^__aaUZUa`^BBB	chr10.fa		5955788	F	36	106					
+HWUSI-EAS610	1	4	74	801	1925	0	1	TGGAATGGACTGTGTAGACCCAGCTGGCCTTGAACT	aaWT\_P]a[YPDTU\UOZb]^VVNZ`P_`TZQY`a	chr10.fa		5955790	R	36	116					
+HWUSI-EAS610	1	4	64	1251	1324	0	1	TGGTAAGAAAAGTTAACAGGAAGAGCTTGGTCATAA	aa\Y\L^[\\]a]_`^]``\`[[Z^X]_\^QW\`^a	chr10.fa		5956001	R	36	118					
+HWUSI-EAS610	1	4	81	466	212	0	1	TGTGTCAAGCAGACTTCCTAGAGAGGGAAGGAGTGT	]_[a`Yb]bYb`Y[_bb_V^aaaaY]aYG\ZXYU]W	chr10.fa		5956420	F	36	118					
+HWUSI-EAS610	1	4	41	1363	1259	0	1	GGGCTCCGTGTGTTTTCTCCTACCGTGTCTAAGTGG	aaa`_a^b`a\baaa`_aa`aa_aa^`\\a^\aWaa	chr10.fa		5956536	R	36	119					
+HWUSI-EAS610	1	4	43	857	1378	0	1	ACAATGGGGACTAAAAACCCAAATACCCTNCACATC	__^P[WVZ``Ta`]]]``^]a^]^W[^_WDT[\Z[[	chr10.fa		5956598	F	29G6	110					
+HWUSI-EAS610	1	4	22	956	402	0	1	GCTAAGAGCACATATCCCTGTTCCCTCAGGACCTGC	aabb_^]a``]`aaaa`_a`aa_\Z`_`__^_W`a`	chr10.fa		5956752	R	36	119					
+HWUSI-EAS610	1	4	33	403	1067	0	1	CAGAGAGATGGTATGTGGTACACCCTTATAATCTAA	aaabb`aaaba`baa`ab_baaaaaaa``a`aaaa_	chr10.fa		5956876	F	36	119					
+HWUSI-EAS610	1	4	60	977	231	0	1	GACGTCCTTCCATCAAACCACCTTCACAAAGAACTC	`aaaa__aa[]_`_a_a__a__`_]`]_``_^_U`_	chr10.fa		5956994	F	36	119					
+HWUSI-EAS610	1	4	79	78	1973	0	1	TCTGCGTCCACAAACGAGTCCTGACCGTGACCTGCG	`aaaaa]`a`aaaaa`a\\aa]```a`^a`a`\^`\	chr10.fa		5957185	R	36	119					
+HWUSI-EAS610	1	4	32	573	1558	0	1	CATCTAGCTGATCAAAGGCTAGGAAAGTTCAAGGCA	a`a\`abb\`__]_U_b]`^ba^`WT[Y_^\WZa_Z	chr10.fa		5957245	F	36	119					
+HWUSI-EAS610	1	4	86	294	546	0	1	AGGATGTAAACATCTGTGTAGCTGTAGTGTTGCCCA	abb\^b`baaaaaaab`a`[aaaaZaaW`]_a`_`[	chr10.fa		5957308	R	36	119					
+HWUSI-EAS610	1	4	16	1156	1325	0	1	GAAACCTCGAGTGAGTGTGCTTAGCAATCCAGTTGT	ab`baaa`b[a^a_b_a_a_aa`a___a]_]a^aa_	chr10.fa		5957374	R	36	119					
+HWUSI-EAS610	1	4	53	68	1510	0	1	CACACTCACTCGAGGTTTCTAGGACGCACAGTCAGT	`Z_Q\a`W`Z`a[aPTa``__`S]^\]]`_a^]S^B	chr10.fa		5957391	F	36	114					
+HWUSI-EAS610	1	4	84	550	360	0	1	CAATTCCCCCGCCATGTTACCTGTTTCAGAATCTCC	`_```aa]a^`^aa^a_`a_```_`___a`_a_a^a	chr10.fa		5957689	F	36	119					
+HWUSI-EAS610	1	4	36	671	696	0	1	CAGCGGCTCCTACAGCTGCTGTCGCTTCTGGTACGG	``a_`_Za_`V^\^]\T\\BBBBBBBBBBBBBBBBB	chr10.fa		5959359	F	26A3C5	40					
+HWUSI-EAS610	1	4	24	1420	544	0	1	AGCTGCTGTCGCTACTGCTACGGCTCCGCCTCCCCC	```a^]a[\]Y]VVOMO][YJYPOPPVNVBBBBBBB	chr10.fa		5959372	F	34G1	84					
+HWUSI-EAS610	1	4	85	1141	281	0	1	AGTGTCAACCACGAAGGACACACAGACCATTTAGAC	`_M_^_`bab`_TYYa_^a^^a]_[^^]Z_N\[[PV	chr10.fa		5960512	R	36	118					
+HWUSI-EAS610	1	4	67	858	250	0	1	GGTGGTCAGGGTCTATACCGACAGTGTCAACCACGA	a][][X]a^WRVX^X_`V`[`^]]V_PQR^YYVZ`a	chr10.fa		5960534	R	36	118					
+HWUSI-EAS610	1	4	59	1756	1404	0	1	TGTGACCTTGCTGGAGTAAATCTGTCACCAGAGATG	_`bba\aaaa_aaa`T^`aaaaa`\[`__``[^^_a	chr10.fa		5961499	F	36	119					
+HWUSI-EAS610	1	4	98	1451	1164	0	1	GGAGCAGAGAGCTACATCCTGATCTGCAGGCAGAGA	]b`_H]Z]``a`a`Y`a`_T]^a[a_UU^TaaW[\R	chr10.fa		5961574	R	36	33					
+HWUSI-EAS610	1	4	45	790	1048	0	1	GAAAGCATTTCATTGTGGGCTTGCTTACAGCTTCAA	``bbbaa`bababbb__bbbbab`bbba`baaabaa	chr10.fa		5961652	R	35G	24					
+HWUSI-EAS610	1	4	57	1759	809	0	1	GAATCCTCAGTTTCTCTCTCCTACCTCATCCTGAAC	aabaaa`a`W^aaaaaaaaaa`a``^_a^__^Waa`	chr10.fa		5962169	R	36	119					
+HWUSI-EAS610	1	4	46	141	800	0	1	GAAGGAGAGGGAGAGAGACAAGGGTTATGGGGTACA	a_O`aY`W_aa`aZaZa_aaWaaaW`a_a_aaVa_^	chr10.fa		5962483	F	36	119					
+HWUSI-EAS610	1	4	36	861	1396	0	1	ATTTTTATGTCCTGTTCCTTTAAAATTCTGTGTACA	`_baaaaaba\ZbaaaaQ`a`]^_^aaX^[[`][SQ	chr10.fa		5962716	F	36	119					
+HWUSI-EAS610	1	4	90	839	725	0	1	AAAAAGGCATATGAGTGCATGGCTTAGCAGGTAGAG	a_WZ\`a_`aaaa^^Za]_aa`V[`______U^\^]	chr10.fa		5963033	F	36	119					
+HWUSI-EAS610	1	4	62	268	376	0	1	AGGCTTCCCCCTCCCCCATACGTGAGTTCTAGGGGG	_`^``__]LT_X\XU\Q`X[O`\OX`ZZ`XEUZ[BB	chr10.fa		5963109	R	34T1	105					
+HWUSI-EAS610	1	4	83	384	640	0	1	AAAGTACAGGAGTCTGAGTTGAGACCTGGAGGTGGT	`X`a]baaabab`abb`aabb`a_^aaaaTaaW`_V	chr10.fa		5963392	F	36	119					
+HWUSI-EAS610	1	4	29	896	1059	0	1	GGATTACACCAGCAGAAGTGACAACACAACCTCCCC	aa]aaa`a`__`[`^[`aW``[``_]^____\Z[^^	chr10.fa		5963434	R	36	119					
+HWUSI-EAS610	1	4	28	1746	243	0	1	GCATTGTTCTCGCCTCTCCTTCTGTAATTACTACGG	aaba\X\aa`]RYa_`^aaa`^`P^_a__`TW``RR	chr10.fa		5963582	F	36	118					
+HWUSI-EAS610	1	4	91	984	1689	0	1	AGACCTAGCTGTCAAGTGCTCTCAGAGTCCCCAGGC	aab`bbba[`a`Za`aS`Vaa_a_aaa]]`Z__``a	chr10.fa		5964208	R	36	119					
+HWUSI-EAS610	1	4	64	1187	1905	0	1	GAGCTACCTGGTCAACACAGTGAATTCATTTGGGAC	_b_babba]a_^ab`abab_F^baabaaa```abb`	chr10.fa		5964687	F	36	118					
+HWUSI-EAS610	1	4	55	1005	424	0	1	GAAGAAAAGAGATGCTCTTTGACTTCAGTTCCTTAC	aaabbabaa`aaaa_bababa__aaaaa_aa_aaa`	chr10.fa		5964765	F	36	119					
+HWUSI-EAS610	1	4	86	1163	1054	0	1	TGGTAAGGAACTGAAGTCAAAGAGCATCTCTTTTCT	aaaT`aa`_a_aa`^ZX`aa\]W`aa^]^^__aaZ`	chr10.fa		5964767	R	36	119					
+HWUSI-EAS610	1	4	51	619	572	0	1	TTCAAACATCAATCACCAGACTTCAAGCCCCAGACC	ababaa_aa]`_a__``aaa`a````a_^]`_a_[^	chr10.fa		5965565	F	36	119					
Index: /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/runtest.py
===================================================================
--- /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/runtest.py (revision 3)
+++ /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/runtest.py (revision 3)
@@ -0,0 +1,115 @@
+#! /usr/bin/env python
+"""
+Test runner for main pygr tests.
+
+Collects all files ending in _test.py and executes them.
+"""
+
+import os, sys, re, unittest, shutil, re, shutil
+from testlib import testutil, testoptions
+from testlib.unittest_extensions import TestRunner
+from genetrack import logger, conf
+import functional
+
+def all_tests():
+    "Returns all file names that end in _test.py"
+    patt = re.compile("_tests.py$")
+    mods = os.listdir(os.path.normpath(os.path.dirname(__file__)))
+    mods = filter(patt.search, mods)
+    mods = [ os.path.splitext(m)[0] for m in mods ]
+    
+    # some predictable order...
+    mods.sort() 
+    return mods
+
+def run(targets, options):
+    "Imports and runs the modules names that are contained in the 'targets'"
+    
+    success = errors = skipped = 0
+
+    import_modules = [ 'doc_tests' ]
+    # run the tests by importing the module and getting its test suite
+    for name in targets:
+        try:
+
+            if name in import_modules:
+                mod = __import__(name)
+                suite = mod.get_suite()
+            else:
+                loader = unittest.TestLoader()
+                suite = loader.loadTestsFromName(name)
+
+            runner = TestRunner(verbosity=options.verbosity,
+                                    descriptions=0)
+            
+            results = runner.run(suite)
+            
+            # count tests and errors
+            success += results.testsRun - \
+                       len(results.errors) - \
+                       len(results.failures) - \
+                       len(results.skipped)
+            
+            errors  += len(results.errors) + len(results.failures)
+            skipped += len(results.skipped)
+
+            # if we're in strict mode stop on errors
+            if options.strict and errors:
+                testutil.error( "strict mode stops on errors" )
+                break
+
+        except ImportError:
+            testutil.error( "unable to import module '%s'" % name )
+
+    # enable the logger
+    logger.disable(None)
+
+    # summarize the run
+    testutil.info('=' * 59)
+    testutil.info('''%s tests passed, %s tests failed, %s tests skipped; %d total''' % \
+        (success, errors, skipped, success + errors + skipped))
+
+    return (success, errors, skipped)
+
+if __name__ == '__main__':
+    # gets the prebuild option parser
+    parser = testoptions.option_parser()
+
+    # parse the options
+    options, args = parser.parse_args()
+
+    # modules: from command line args or all modules
+    targets = args or all_tests()
+
+    # get rid of the .py ending in case full module names were 
+    # passed in the command line
+    targets = [ t.rstrip(".py") for t in targets ]
+
+    # exclusion mode
+    if options.exclude:
+        targets = [ name for name in all_tests() if name not in targets ]
+
+    if options.verbosity == 0:
+        logger.disable('INFO')
+    elif options.verbosity == 1:
+        logger.disable('DEBUG')
+    elif options.verbosity >= 2:
+        logger.disable(None)
+
+    # cleans full entire test directory
+    if options.reset:
+        conf.reset_dir(conf.TEMP_DATA_DIR)
+    
+    # run all the tests
+    if options.coverage:
+        coverdir = conf.path_join(conf.TEST_DIR, 'coverage')
+        good, bad, skip = testutil.generate_coverage(run, coverdir,
+                                                     targets=targets,
+                                                     options=options)
+    else:
+        good, bad, skip = run(targets=targets, options=options)
+
+    if bad:
+        sys.exit(-1)
+
+    sys.exit(0)
Index: /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/script_tests.py
===================================================================
--- /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/script_tests.py (revision 3)
+++ /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/script_tests.py (revision 3)
@@ -0,0 +1,32 @@
+import os, unittest, random
+
+import testlib
+from genetrack import conf, util, logger, scripts
+
+class ScriptTests( unittest.TestCase ):
+    """
+    Testing scripts
+    """
+    
+    def test_tabs2genetrack(self):
+        "Testing bed2genetrack transformation"
+        from genetrack.scripts import tabs2genetrack
+
+        inpfile = conf.testdata('short-data.bed', verify=True)
+        outfile = conf.tempdata('short-data.genetrack')
+        tabs2genetrack.transform(inpfile, outfile, format='BED')
+
+def get_suite():
+    "Returns the testsuite"
+    tests  = [ 
+        ScriptTests,
+    ]
+
+    return testlib.make_suite( tests )
+
+if __name__ == '__main__':
+    suite = get_suite()
+    logger.disable('DEBUG')
+    unittest.TextTestRunner(verbosity=2).run( suite )
+
+    
Index: /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/doc_tests.py
===================================================================
--- /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/doc_tests.py (revision 3)
+++ /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/tests/doc_tests.py (revision 3)
@@ -0,0 +1,41 @@
+""""
+This script runs the doctests
+"""
+import testlib
+import os, unittest, doctest
+from genetrack import data, hdflib
+
+def codetest():
+    "Test the code here before adding to doctest"
+    pass
+
+def get_suite():
+    suite = unittest.TestSuite()
+    
+    file_names = [
+        
+    ]
+
+    module_names = [
+        data, hdflib
+    ]
+
+    # needs relative paths for some reason
+    full_path = lambda name: os.path.join( '../docs/rest', name)
+    file_paths = map( full_path, file_names)
+
+    for file_path in file_paths:
+        rest_suite = doctest.DocFileSuite( file_path )
+        suite.addTest( rest_suite )
+
+    for mod in module_names:
+        docsuite = doctest.DocTestSuite( mod )
+        suite.addTest( docsuite )
+
+    return suite
+
+if __name__ == '__main__':
+    #codetest()
+    suite  = get_suite()
+    runner = unittest.TextTestRunner(verbosity=2)
+    runner.run(suite)
Index: /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/genetrack/hdflib.py
===================================================================
--- /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/genetrack/hdflib.py (revision 3)
+++ /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/genetrack/hdflib.py (revision 3)
@@ -0,0 +1,307 @@
+"""
+Utilities for the hierarchical data format (HDF).
+
+"""
+from tables import openFile
+from tables import IsDescription, IntCol, FloatCol
+from genetrack import logger, util, conf
+from itertools import *
+import os, bisect, gc, csv
+
+# missing file
+missing = lambda f: not os.path.isfile(f)
+
+# prints messages after processing chunk  number of lines
+CHUNK = 10**5 
+
+class PositionalSchema( IsDescription ):
+    """
+    Stores a triplet of float values for each index. 
+    """
+    # the position arguments must be present
+    idx = IntCol  ( pos=1 )  # index
+    fwd = FloatCol( pos=2 )  # values on the forward strand
+    rev = FloatCol( pos=3 )  # value on the reverse strand
+    val = FloatCol( pos=4 )  # weighted value on the combined strands
+
+class PositionalData(object):
+    """
+    An HFD representation of coordinates with one or more values associated with 
+    each of these coordinates. The class can store such data for various labels (chromosomes). 
+    The default parser built into the class can process files in the following 
+    format::
+
+        chrom	index	forward	reverse	value
+        chr1	146	0.0	1.0	1.0
+        chr1	254	0.0	3.0	3.0
+        chr1	319	0.0	1.0	1.0
+        chr1	328	0.0	1.0	1.0
+        chr1	330	0.0	1.0	1.0
+        chr1	339	0.0	1.0	1.0
+        chr1	341	1.0	0.0	1.0
+        ...
+
+    The default representation is to store a value for the forward and reverse strands, 
+    and to produce a composite value (stored as `value` column). In the most common
+    case the composite value is simply the sum of the values on the forward 
+    and reverse strands. The input file must be sorted by both coordinates 
+    and chromosome (increasing order). Processing is performed in the 
+    following manner:
+
+    >>> from genetrack import conf
+    >>>
+    >>> fname = conf.testdata('test-hdflib-input.txt')
+    >>> index = PositionalData(fname=fname, workdir=conf.TEMP_DATA_DIR, update=True)   
+    
+    Upon the first instantiation the index will be created if it did
+    not exist or if the `update=True` parameter was set.
+
+    The `workdir` parameter is optional and if present must point 
+    to the directory into which the resulting index file will be placed. 
+    The contents of the Positional data object may be accessed as a list 
+    but note that only the accessed slice is loaded into memory (lazy access).
+
+    >>> index.labels
+    ['chr1', 'chr2', 'chr3']
+    >>>
+    >>> # this will return the HDF table as implmenented in pytables
+    >>> table = index.table('chr1')
+    >>>
+    >>> list (table.cols.idx[:10])
+    [146, 254, 319, 328, 330, 339, 341, 342, 345, 362]
+    >>>
+    >>> list( table.cols.fwd[:10])
+    [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0]
+    >>>
+    >>> list( table.cols.rev[:10])
+    [1.0, 3.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0]
+    
+    We may also find the indices for real coordinates. For example the genomic
+    coordinates 400 and 600 map to internal data indices of 20 to 31 
+    (it works as a binary search that returns the left index)
+
+    >>>
+    >>> start, end = index.indices('chr1', 400, 600)
+    >>> (start, end)
+    (20, 31)
+
+    We may also query for slices of data that span over an interval
+
+    >>> results = index.query( 'chr1', 400, 600)
+    >>> 
+    >>> # the attributes are numeric arrays, here are cast to list
+    >>>
+    >>> list(results.idx)
+    [402, 403, 411, 419, 427, 432, 434, 443, 587, 593, 596]
+    >>>
+    >>> list(results.fwd)
+    [0.0, 1.0, 0.0, 0.0, 0.0, 2.0, 1.0, 0.0, 0.0, 0.0, 1.0]
+    >>>
+    >>> list(results.rev)
+    [3.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0]
+    >>>
+    >>> list(results.val)
+    [3.0, 1.0, 1.0, 1.0, 1.0, 2.0, 1.0, 1.0, 1.0, 1.0, 1.0]
+    >>> index.close()
+    >>>
+
+    In order to provide the fastes parsing the internal parser
+    is not overridable. There are transformers that can 
+    change bed and gff files to this input format. See the 
+    `genetrack.scripts' module.
+    """
+
+    def __init__(self, fname, workdir=None, update=False, nobuild=False, index=None ):
+        """
+        Create the PositionalData
+        """
+        self.fname = fname
+        self.db = None
+        
+        # split the incoming name to find the real name, and base directory
+        basedir, basename = os.path.split(self.fname)
+
+        # the index may be stored in the workdir if it was specified
+        basedir = workdir or basedir
+
+        # this is the HDF index name that the file operates on
+        self.index = index or conf.path_join(basedir, '%s.hdf' % basename)
+
+        # debug messages
+        logger.debug('file path %s' % self.fname)
+        logger.debug('index path %s' % self.index)
+
+        # no building permitted
+        if nobuild and missing(self.index):
+            raise Exception('No autobuild allowed and no index found at %s' % self.index)
+        
+        # creating indices if these are missing or an update is forced
+        if update or missing(self.index):
+            self.build()
+
+        # operates on the HDF file
+        self.db=openFile(self.index, mode='r')
+        self.root = self.db.root
+        
+        # shows the internal labels
+        logger.debug('index labels -> %s' % self.labels)
+
+    def build(self):
+        "May be overriden to use different parsers and schemas"
+
+        logger.info( "file='%s'" % self.fname )
+        logger.info( "index='%s'" % self.index)
+
+        # check file for existance
+        if missing(self.fname):
+            raise IOError('missing data %s' % self.fname)
+
+        # provides timing information
+        timer = util.Timer()
+
+        # iterate over the file 
+        reader = csv.reader( file(self.fname, 'rt'), delimiter='\t' )
+    
+        # unwind the reader until it hits the header
+        for row in reader:
+            if row[0] == 'chrom':
+                break
+
+        # helper function that flushes a table
+        def flush( table, collect, name ):
+            # commit the changes
+            if collect:
+                table.append(collect)
+                table.flush() 
+                # nicer information
+                size = util.commify( len(table) )
+                logger.info('table=%s, contains %s rows' % (name, size) )
+            
+        # print messages at every CHUNK line
+        last_chrom = table = None
+        db = openFile( self.index, mode='w', title='HDF index database')
+
+        # continue on with reading, optimized for throughput
+        # with minimal function calls
+        collect = []
+        for linec, row in izip(count(1), reader):
+
+            # prints progress on processing, also flushes to periodically
+            if (linec % CHUNK) == 0:
+               logger.info("... processed %s lines" % util.commify(linec))    
+               flush( table=table, collect=collect, name=last_chrom )
+               collect = []
+            
+            # get the values from each row
+            chrom, index, fwd, rev, value = row
+            fwd, rev, value = float(fwd), float(rev), float(value)
+        
+            # flush when switching chromosomes
+            if chrom != last_chrom:
+                # table==None at the beginning
+                if table is not None:
+                    #logger.debug("... flushing at line %s" % row)   
+                    flush( table=table, collect=collect, name=last_chrom )
+                    collect = []
+
+                # creates the new HDF table here
+                table = db.createTable(  "/", chrom, PositionalSchema, 'label %s' % chrom )
+                logger.info("creating table:%s" % chrom)
+                last_chrom = chrom
+
+            collect.append( (index, fwd, rev, value) )
+                           
+        # flush for last chromosome, report some timing information
+        flush(table, collect, chrom)
+        lineno = util.commify(linec)
+        elapsed = timer.report()
+        logger.info("finished inserting %s lines in %s" % (lineno, elapsed) )
+
+        # close database
+        db.close()
+
+    @property
+    def labels(self):
+        "Labels in the file"
+        labs = [ x.name for x in self.root._f_listNodes() ]
+        util.nice_sort( labs )
+        return labs
+    
+    def indices( self, label, start, end, colattr='idx'):
+        """
+        Returns the array indices that correspond the start, end values of index column
+        
+        Note that for this to work the values for the column attribute 'colattr' 
+        in the table must be sorted in increasing order 
+        """
+        table  = self.table( label )
+        column = getattr(table.cols, colattr)
+        istart = bisect.bisect_left( column, start )
+        iend   = bisect.bisect_left( column, end  )
+        return istart, iend
+
+    def query(self, label, start, end, pad=0, aslist=False ):
+        """
+        Returns data that spans star to end as a class 
+        with attributes for idx, fwd, rev and val
+        """
+
+        step  = 1
+        table = self.table( label )
+        istart, iend = self.indices(label=label, start=start-pad, end=end+pad)
+
+        idx = table.cols.idx[istart:iend:step]
+        fwd = table.cols.fwd[istart:iend:step]
+        rev = table.cols.rev[istart:iend:step]
+        val = table.cols.val[istart:iend:step]
+        
+        # sometimes we need all return values to belists
+        if aslist:
+            idx, fwd, rev, val = map(list, (idx, fwd, rev, val))
+
+        params = util.Params( idx=idx, fwd=fwd, rev=rev, val=val )
+        return params
+    
+    def chunks(self, label, size=10**6, step=1 ):
+        """
+        Returns the data as chunks of size. All columns are
+        simultaneously iterated over.
+        """
+        table = self.table( label )
+        for start in xrange(0, 10**9, size):
+            end = start + size
+            idx = table.cols.idx[start:end:step].tolist()
+            if not idx:
+                break
+            fwd = table.cols.fwd[start:end:step].tolist()
+            rev = table.cols.rev[start:end:step].tolist()
+            val = table.cols.val[start:end:step].tolist()        
+            yield idx, fwd, rev, val
+        
+    def table(self, label):
+        return getattr( self.root, label )
+
+    def chromosome(self, label):
+        """
+        Attempts to get a chromosome when specified by either
+        the label or chr1, chr01, chrom01, chrI
+        """
+        return getattr( self.root, label )
+
+
+    def close(self):
+        if self.db is not None:
+            self.db.close()
+    
+    def __del__(self):
+        self.close()
+
+def test( verbose=0 ):
+    """
+    Test runner
+    """
+    import doctest
+    doctest.testmod(optionflags=doctest.ELLIPSIS)
+    
+if __name__ == "__main__":
+    test()
Index: /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/genetrack/data.py
===================================================================
--- /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/genetrack/data.py (revision 3)
+++ /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/genetrack/data.py (revision 3)
@@ -0,0 +1,106 @@
+"""
+Core data represenation.
+
+
+"""
+from itertools import *
+import cPickle as pickle
+import os, sys, bsddb
+import logger, util, conf
+
+def path_join(*args):
+    return os.path.abspath(os.path.join(*args))
+
+class FileDict(object):
+    """
+    File based dictionary that can be pickled and restored 
+    from a pickle. Built around bsddb.btopen.
+
+    >>> fname = conf.tempdata('filedict-testdata.bin')
+    >>> fdict = FileDict(fname, mode='n')
+    >>> for value in range(5):
+    ...     fdict[value] = value*10
+    >>> fdict.save()
+
+    >>> # still works after unpickling the object
+    >>> blob = pickle.dumps(fdict)
+    >>> db = pickle.loads(blob)
+   
+    >>> db['1']
+    10
+    >>> list(db.keys())
+    ['0', '1', '2', '3', '4']
+    >>> list(db.values())
+    [0, 10, 20, 30, 40]
+    >>> list(iter(db))
+    [0, 10, 20, 30, 40]
+    >>> list(db.items())
+    [('0', 0), ('1', 10), ('2', 20), ('3', 30), ('4', 40)]
+    >>> len(db)
+    5
+    >>> 4 in db
+    True
+    >>> 5 in db
+    False
+    """
+    
+    def __init__(self, fname, mode='c' ):
+        self.fname = path_join( fname )
+        try:
+            self.db = bsddb.btopen(self.fname, flag=mode)
+        except Exception, exc:
+            # default error does not indicate the file name
+            logger.error('error opening %s' % self.fname)
+            raise exc
+
+    def __setitem__(self, key, value):
+        self.db[ str(key) ] = pickle.dumps(value, 0)
+
+    def __getstate__(self): 
+        # remove file handle
+        cdict = self.__dict__.copy()
+        del cdict['db']
+        return cdict
+
+    def __setstate__(self, data):
+        self.db = bsddb.btopen( data['fname'], flag='c')
+
+    def __getitem__(self, key):
+        return pickle.loads( self.db[str(key)] )
+    
+    def save(self):
+        self.db.sync()
+
+    def keys( self ):
+        return self.db.iterkeys()
+
+    def values( self ):
+        return imap(pickle.loads, self.db.itervalues())
+
+    def items( self ):
+        return izip(self.keys(), self.values() )
+
+    def __iter__(self):
+        return self.values()
+
+    def __contains__(self, key):
+        return self.db.has_key(str(key))
+
+    def __len__(self):
+        return len(self.db)
+
+    def close(self):
+        self.db.close()
+
+    def __del__(self):
+        self.close()
+
+def test():
+    fname = conf.testdata('filedict-testdata.bin')
+    
+
+if  __name__ == '__main__':
+    import doctest
+    doctest.testmod()
+
+    test()
Index: /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/genetrack/fitlib.py
===================================================================
--- /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/genetrack/fitlib.py (revision 3)
+++ /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/genetrack/fitlib.py (revision 3)
@@ -0,0 +1,242 @@
+"""
+Data fitting and peak prediction routines
+"""
+import genetrack
+from genetrack import logger, conf
+from itertools import *
+import numpy, operator
+from math import log, exp
+
+def normal_function( w, sigma ):
+    """
+    Defaulf fitting function, it returns values 
+    from a normal distribution over a certain width.
+
+    The function is not normalized thus will be a representation of the sum of readcounts.
+    """
+    log2    = log(2)
+    sigma2  = float(sigma)**2
+    lo, hi  = int(-w), int(w+1)
+    pi = numpy.pi
+
+    # function definition, not normalized
+    # thus will correspond to read counts
+    def normal_func(index):
+        return exp( -index*index/sigma2/2 )    
+    
+    values = map( normal_func, range(lo, hi) )
+    values = numpy.array( values, numpy.float )
+
+    return abs(lo), hi, values
+
+def gaussian_smoothing(x, y, sigma=20, epsilon=0.1 ):
+    """
+    Fits data represented by f(x)=y by a sum of normal curves where
+    each curve corresponds to a normal function of variance=sigma and
+    height equal to the y coordinate.
+
+    Parameters x and y are lists.
+
+    Returns a tuple of with the new x, and y coordinates.
+    """
+    if len(x)==0:
+        return x, y
+
+    # this is a joyfully simple, marvelously elegant and superfast solution 
+    # that's possible thanks to numpy. I bow before thy greatness, NumPY!!!
+
+    # transform to numpy arrays
+    x = numpy.array( x, numpy.int )
+    y = numpy.array( y, numpy.float )
+
+    # a sanity check
+    assert len(x)==len(y), "Data lenghts must match!"
+
+    # operate within 5 standard deviations
+    w = 5 * sigma 
+
+    # precompute the fitting values for a given sigma,
+    lo, hi, normal = normal_function( w=w, sigma=sigma )
+
+    # shift the original vector by the first index, so that 
+    # the first index starts at the value lo
+    # this copies the array
+    zero_x = x - x[0] + lo
+
+    # the size will influence memory consumption
+    # long vectors need to be stiched together externally
+    # uses around 100MB per 10 million size
+    # on live displays there is no need to fit over large regions (over 100K)
+    # as the features won't be visible by eye 
+    size  = zero_x[-1] + lo + hi
+
+    # this will hold the new fitted values
+    new_y = numpy.zeros( size, numpy.float )
+
+    # performs the smoothing by mutating the array values in place
+    for index, value in izip(zero_x, y):
+        lox = index - lo
+        hix = index + hi
+        # this is where the magic happens
+        new_y[ lox:hix ] += value * normal
+    
+    # keep only values above the epsilon
+    # this cuts out (potentially massive) regions where there are no measurements
+    new_x = ( new_y > epsilon ).nonzero()[0] 
+    new_y = new_y.take(new_x)
+
+    # now shift back to get the real indices
+    new_x =  new_x + x[0] - lo
+
+    return new_x, new_y
+
+def detect_peaks( x, y ):
+    """
+    Detects peaks (local maxima) from an iterators x and y 
+    where f(x)=y. Will not propely detect plateus!
+
+    Returns a list of tuples where the two
+    elements correspond to the peak index and peak value.
+    
+    >>> y = [ 0.0, 1.0, 2.5, 1.0, 3.5, 1.0, 0.0, 0.0, 10.5, 2.0, 1.0, 0.0 ]
+    >>> x = range(len(y))
+    >>> peaks = detect_peaks( x=x, y=y )
+    >>> peaks
+    [(2, 2.5), (4, 3.5), (8, 10.5)]
+    >>> select_peaks( peaks, exclusion=1)
+    [(2, 2.5), (4, 3.5), (8, 10.5)]
+    >>> select_peaks( peaks, exclusion=2)
+    [(4, 3.5), (8, 10.5)]
+    """
+    peaks = []
+    # finds local maxima 
+    for i in xrange(1, len(y)-1 ):
+        left, mid, right = y[i-1], y[i], y[i+1]
+        if left < mid >= right:
+            peaks.append( (x[i], mid) )
+    return peaks
+
+def select_peaks( peaks, exclusion, threshold=0):
+    """
+    Selects maximal non-overlapping peaks with a given exclusion zone 
+    and over a given treshold.
+
+    Takes as input a list of (index, value) tuples corresponding to
+    all local maxima. Returns a filtered list of tuples (index, value)
+    with the maxima that pass the conditions.
+
+    >>> peaks = [ (0, 20), (100, 19), (500, 4), (10**6, 2) ]
+    >>> select_peaks( peaks, exclusion=200)
+    [(0, 20), (500, 4), (1000000, 2)]
+    """
+
+    # zero exclusion allows all peaks to pass
+    if exclusion == 0:
+        return peaks
+
+    # sort by peak height
+    work  = [ (y, x) for x, y in peaks if y >= threshold ]
+    work.sort()
+    work.reverse()
+
+    # none of the values passed the treshold
+    if not work:
+        return []
+
+    # this will store the selected peaks
+    selected = []
+
+    # we assume that peaks are sorted already increasing order by x
+    xmin, xmax = peaks[0][0], peaks[-1][0]
+    
+    # we create an occupancy vector to keep track of empty regions 
+    size  = xmax - xmin + exclusion
+    shift = xmin - exclusion
+
+    # exclusion will be applied for both ends
+    # the size must fit into memory, int8 is fairly small though
+    # chop large chromosomes into chunks and predict on each
+    empty = numpy.ones(size + exclusion, numpy.int8)
+
+    # starting with the largest select from the existing peaks
+    for peaky, peakx in work:
+
+        # get the peak index as occupancy vector index
+        locind = peakx - shift
+        
+        # check region
+        if empty[locind]:
+            
+            # store this peak
+            selected.append( ( peakx, peaky ) )
+
+           # block the region
+            left  = locind - exclusion
+            right = locind + exclusion
+            empty[left:right] = numpy.zeros (right - left, numpy.int8)
+    
+    selected.sort()
+    return selected
+
+def fixed_width_predictor(x, y, params):   
+    """
+    Generates peaks from a x,y dataset.
+
+    >>> from genetrack import util
+    >>>
+    >>> y = [ 0.0, 1.0, 2.5, 1.0, 3.5, 1.0, 0.0, 0.0, 10.5, 2.0, 1.0, 0.0 ]
+    >>> x = range(len(y))
+    >>>
+    >>> params = util.Params(feature_width=1, minimum_peak=0, zoom_value=1)
+    >>> fixed_width_predictor(x, y, params=params)
+    [(2, 2, '2.5'), (4, 4, '3.5'), (8, 8, '10.5')]
+    >>>
+    >>> params = util.Params(feature_width=2, minimum_peak=3, zoom_value=1)
+    >>> fixed_width_predictor(x, y, params=params)
+    [(3, 5, '3.5'), (7, 9, '10.5')]
+    """
+
+    width = params.feature_width
+    all_peaks = detect_peaks(x=x, y=y )
+    sel_peaks = select_peaks(peaks=all_peaks, exclusion=width, threshold=params.minimum_peak)
+
+    #print params
+    #print sel_peaks
+    # generate the fixed lenght intervals with open 
+    h = width/2
+    if int(params.zoom_value)> 5000:
+        results = [ (m - h, m + h, '' ) for m, v in sel_peaks ]    
+    else:
+        results = [ (m - h, m + h, '%.1f' % v ) for m, v in sel_peaks ]
+
+    return results
+
+def test(verbose=0):
+    """
+    Main testrunnner
+    """
+    import doctest
+    doctest.testmod( verbose=verbose )
+
+def test_plot():
+    "Visualize results via matplotlib"
+    from pylab import plot, show
+
+    x = [ 1, 101, 102, 103,  500, 503,  ]
+    y = [ 1,   1,   2,   3,    5,    1,  ]
+
+    nx, ny  = gaussian_smoothing(x, y, sigma=30)
+
+    plot(nx, ny, 'bo-')
+    show()
+
+if __name__ == '__main__':
+    test(verbose=0)
+   
+    peaks = [ (0, 20), (100, 19), (500, 4), (10**6, 2) ]
+    print select_peaks( peaks, exclusion=200)
+
+    #test_plot()
+    
+
+
Index: /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/genetrack/roman.py
===================================================================
--- /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/genetrack/roman.py (revision 3)
+++ /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/genetrack/roman.py (revision 3)
@@ -0,0 +1,77 @@
+"""Convert to and from Roman numerals
+
+This program is part of "Dive Into Python", a free Python book for
+experienced programmers.  Visit http://diveintopython.org/ for the
+latest version.
+"""
+
+__author__ = "Mark Pilgrim (mark@diveintopython.org)"
+__version__ = "$Revision: 1.3 $"
+__date__ = "$Date: 2004/05/05 21:57:19 $"
+__copyright__ = "Copyright (c) 2001 Mark Pilgrim"
+__license__ = "Python"
+
+import re
+
+#Define exceptions
+class RomanError(Exception): pass
+class OutOfRangeError(RomanError): pass
+class NotIntegerError(RomanError): pass
+class InvalidRomanNumeralError(RomanError): pass
+
+#Define digit mapping
+romanNumeralMap = (('M',  1000),
+				   ('CM', 900),
+				   ('D',  500),
+				   ('CD', 400),
+				   ('C',  100),
+				   ('XC', 90),
+				   ('L',  50),
+				   ('XL', 40),
+				   ('X',  10),
+				   ('IX', 9),
+				   ('V',  5),
+				   ('IV', 4),
+				   ('I',  1))
+
+def toRoman(n):
+	"""convert integer to Roman numeral"""
+	if not (0 < n < 5000):
+		raise OutOfRangeError, "number out of range (must be 1..4999)"
+	if int(n) <> n:
+		raise NotIntegerError, "non-integers can not be converted"
+
+	result = ""
+	for numeral, integer in romanNumeralMap:
+		while n >= integer:
+			result += numeral
+			n -= integer
+	return result
+
+#Define pattern to detect valid Roman numerals
+romanNumeralPattern = re.compile('''
+	^				   # beginning of string
+	M{0,4}			  # thousands - 0 to 4 M's
+	(CM|CD|D?C{0,3})	# hundreds - 900 (CM), 400 (CD), 0-300 (0 to 3 C's),
+						#			or 500-800 (D, followed by 0 to 3 C's)
+	(XC|XL|L?X{0,3})	# tens - 90 (XC), 40 (XL), 0-30 (0 to 3 X's),
+						#		or 50-80 (L, followed by 0 to 3 X's)
+	(IX|IV|V?I{0,3})	# ones - 9 (IX), 4 (IV), 0-3 (0 to 3 I's),
+						#		or 5-8 (V, followed by 0 to 3 I's)
+	$				   # end of string
+	''' ,re.VERBOSE)
+
+def fromRoman(s):
+	"""convert Roman numeral to integer"""
+	if not s:
+		raise InvalidRomanNumeralError, 'Input can not be blank'
+	if not romanNumeralPattern.search(s):
+		raise InvalidRomanNumeralError, 'Invalid Roman numeral: %s' % s
+
+	result = 0
+	index = 0
+	for numeral, integer in romanNumeralMap:
+		while s[index:index+len(numeral)] == numeral:
+			result += integer
+			index += len(numeral)
+	return result
Index: /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/genetrack/util.py
===================================================================
--- /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/genetrack/util.py (revision 3)
+++ /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/genetrack/util.py (revision 3)
@@ -0,0 +1,220 @@
+"""
+Utility functions.
+
+
+"""
+import logger, conf
+import os, sys, random, hashlib, re, string, csv, gc
+import tempfile, os, random, glob, time
+
+# dealing with roman numerals for chromosomes
+from genetrack import roman
+
+def path_join(*args):
+    "Builds absolute path"
+    return os.path.abspath(os.path.join(*args))
+
+def chromosome_remap(text):
+    """
+    Attempts to produce the standardized chromosome from 
+    multiple possible inputs::
+        
+        chr5, chr05, chrV, chrom5, chrom05, chromV -> chr5
+
+    >>>
+    >>> map(chromosome_remap, 'chr1 chr06 chrIX chrom02 chrom12 chromV'.split())
+    ['chr1', 'chr6', 'chr9', 'chr2', 'chr12', 'chr5']
+    >>>
+    """
+
+    if not text.startswith('chr'):
+        return text
+
+    text = text.replace('chrom','')
+    text = text.replace('chr','')
+    
+    try:
+        # cast to integer
+        text = int(text)
+    except ValueError, exc:
+        try:
+            # cast to roman numerals
+            text = roman.fromRoman(text)
+        except Exception, exc:
+            pass
+
+    return 'chr%s' % text
+
+class Params(object):
+    """
+    >>> p = Params(a=1, b=2, c=None, d=None)
+    >>> p.a, p.b
+    (1, 2)
+    >>> p.c, p.d
+    (None, None)
+    """
+    def __init__(self, **kwds):
+        self.__dict__.update(kwds)
+
+    def update(self, other):
+        self.__dict__.update( other )
+
+    def defaults(self, other):
+        "Sets default values for non-existing attributes"
+        store = dict()
+        store.update( other )
+        store.update( self.__dict__ )
+        self.__dict__.update( store )
+
+    def dict(self):
+        return self.__dict__
+
+    def get(self, key, default=None):
+        return self.__dict__.get(key, default)
+
+    def __repr__(self):
+        return repr(self.__dict__)
+
+def uuid(KEY_SIZE=128):
+    "Genenerates a unique id"
+    id  = str( random.getrandbits( KEY_SIZE ) )
+    return hashlib.md5(id).hexdigest()
+    
+def nice_bytes( value ):
+    """
+    Returns a size as human readable bytes
+    
+    >>> nice_bytes(100), nice_bytes(10**4), nice_bytes(10**8), nice_bytes(10**10)
+    ('100 bytes', '9 Kbytes', '95 Mbytes', '9 Gbyte')
+    """
+    if value < 1024: return "%s bytes" % value
+    elif value < 1048576: return "%s Kbytes" % int(value/1024)
+    elif value < 1073741824: return "%s Mbytes" % int(value/1048576)
+    else: return "%s Gbyte" % int(value/1073741824)
+
+def nice_sort( data ):
+    """
+    Sort the given list data in the way that humans expect. 
+    Adapted from a posting by Ned Batchelder: http://nedbatchelder.com/blog/200712.html#e20071211T054956
+    
+    >>> data = [ 'chr1', 'chr2', 'chr10', 'chr100' ]
+    >>> data.sort()
+    >>> data
+    ['chr1', 'chr10', 'chr100', 'chr2']
+    >>> nice_sort(data)
+    >>> data
+    ['chr1', 'chr2', 'chr10', 'chr100']
+    """
+    def convert(text): 
+        if text.isdigit():
+            return int(text)
+        else:    
+            return text
+            
+    split    = lambda key: re.split('([0-9]+)', key)
+    alphanum = lambda key: map(convert, split(key) )
+    data.sort( key=alphanum )
+
+def commify(n):
+    """
+    Formats numbers with commas
+
+    >>> commify(10000)
+    '10,000'
+    """
+    n = str(n)
+    while True:
+        (n, count) = re.subn(r'^([-+]?\d+)(\d{3})', r'\1,\2', n)
+        if count == 0: 
+            break
+    return n 
+
+class Timer(object):
+    """
+    A timer object for display elapsed times.
+
+    >>> timer = Timer()
+    >>> timer.format(30)
+    '30.00 seconds'
+    >>> timer.format(320)
+    '5.3 minutes'
+    >>> timer.format(3200)
+    '53.3 minutes'
+    >>> timer.format(30500)
+    '8.5 hours'
+    """
+    def __init__(self):
+        self.start()
+
+    def start(self):
+        self.start_time = time.time()
+
+    def format(self, value):
+        min1 = 60.0
+        hour = 60 * min1
+        if value < 60:
+            return '%4.2f seconds' % value
+        elif value < hour:
+            return '%3.1f minutes' % (value/min1)
+        else:
+            return '%3.1f hours' % (value/hour)
+
+    def report(self):
+        elapsed = self.stop()
+        return self.format( elapsed )
+
+    def stop(self):
+        elapsed = time.time() - self.start_time
+        self.start()
+        return elapsed
+
+def gc_off( func ):
+    """ 
+    A decorator that turns the off the garbage collector 
+    during the lifetime of the wrapped function
+
+    >>> @gc_off
+    ... def foo():
+    ...    pass
+    >>> foo()
+    """
+    def newfunc(*args,**kargs):
+        try:
+            gc.disable()
+            result = func( *args, **kargs)
+        finally:
+            gc.enable()
+        return result
+    return newfunc
+
+def make_tempfile( fname=None, dir='', prefix='temp-', suffix='.png'):
+    """
+    Returns a filename and filepath to a temporary file
+    
+    If the {tid} parameter is not specified it will generate a random id
+    >>> make_tempfile(fname=1, prefix='img')[0]
+    'img1.png'
+    >>> len(make_tempfile())
+    2
+    """
+    
+    if fname == None:
+        if dir:
+            fd, fpath = tempfile.mkstemp( suffix=suffix, prefix=prefix, dir=dir, text='wb')
+        else:
+            fd, fpath = tempfile.mkstemp( suffix=suffix, prefix=prefix, text='wb')
+        os.close(fd)
+        head, fname = os.path.split( fpath )
+    else:
+        fname = '%s%s%s' % (prefix, fname, suffix)
+        fpath = os.path.join( dir, fname )
+
+    return fname, fpath
+   
+def test( verbose=0 ):
+    "Performs module level testing"
+    import doctest
+    doctest.testmod( verbose=verbose )
+
+if __name__ == "__main__":
+    test()
Index: /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/genetrack/__init__.py
===================================================================
--- /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/genetrack/__init__.py (revision 3)
+++ /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/genetrack/__init__.py (revision 3)
@@ -0,0 +1,42 @@
+"""
+Data analysis and visualization framework for genomic data. 
+See the genetrack_ site for installation instructions.
+
+Framework
+=========
+
+Required libraries: numpy_ , bx-python_ and pytables_
+
+Server
+======
+
+Required libraries: django_ and chartdirector_
+
+The default webserver is located under the `server` directory 
+and is completely independent of the main genetrack package and therefore is **NOT** documented
+here. The server is implemented with the django_ web framework. See the genetrack_ site for 
+more details about the server settings.
+
+.. _genetrack: http://genetrack.bx.psu.edu
+.. _numpy: http://numpy.scipy.org
+.. _bx-python: http://bitbucket.org/james_taylor/bx-python/wiki/Home
+.. _django: http://www.djangoproject.com/
+.. _pytables: http://www.pytables.org/
+.. _chartdirector: http://www.advsofteng.com
+"""
+import sys
+from time import strftime, gmtime
+
+tstamp = strftime("%Y-%j", gmtime() )
+
+__version__ = '2.0.0-beta-1'
+
+# version check
+if sys.version_info < (2, 5):
+    error( 'genetrack requires python 2.5 or higher' )
+
+from genetrack.hdflib import PositionalData
+
+if __name__ == '__main__':
+    print '\n*** GeneTrack import successful ***'
+
Index: /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/genetrack/logger.py
===================================================================
--- /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/genetrack/logger.py (revision 3)
+++ /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/genetrack/logger.py (revision 3)
@@ -0,0 +1,95 @@
+"""
+Logging functions.
+
+Upon import creates a module level log class (log) and 
+the following logging functions::
+
+    debug, info, warn and error
+
+The default formatters will print out the function the log was triggered from.
+"""
+
+import sys, logging
+
+# python 2.5 logging will be differnt
+PYTHON25 = sys.version_info >= (2, 5)
+
+def get_logger( name='yeti-logger', stream=sys.stdout, formatter=None):
+    """
+    Returns a logger
+
+    >>> disable('INFO')
+    >>> info( 'logtest, this message SHOULD NOT be visible' )
+    >>> disable()
+    >>> info( 'logtest, this message should be visible' )
+    >>> disable('DEBUG')
+    >>> debug( 'logtest, this message SHOULD NOT be visible' )
+    >>> info( 'logtest, this message should be visible' )   
+    """
+    logp = logging.getLogger(name)
+
+    # this is needed in case the process is 
+    # forked/multithreaded; loggers exist in a global scope 
+    # we don't want each import to duplocate this handler
+    if not logp.handlers:
+        console = logging.StreamHandler(stream)
+        console.setLevel(logging.DEBUG )
+        if PYTHON25:
+            format = '%(levelname)s %(module)s.%(funcName)s: %(message)s'    
+        else:
+            format = '%(levelname)s %(module)s: %(message)s'    
+
+        formatter = formatter or logging.Formatter(format)
+        console.setFormatter(formatter)
+        logp.addHandler(console)
+        logp.setLevel(logging.DEBUG)
+    return logp
+
+def disable( level=None ):
+    """
+    Disables logging levels
+    Levels: DEBUG, INFO, WARNING, ERROR
+
+    >>> disable('INFO')
+    >>> info( 'logtest, this message SHOULD NOT be visible' )
+    """
+    level = str(level)
+    store = dict( NOTSET=0, DEBUG=10, INFO=20, WARNING=30, ERROR=40)
+    
+    # also take numerical values
+    store['0'] = 20
+    store['1'] = 10
+    store['2'] = 0
+
+    value = store.get( level.upper(), 0)
+    logging.disable( value )
+
+# populate some loggers by default
+log = get_logger()
+debug, info, warn, error = log.debug, log.info, log.warn, log.error
+
+# disable DEBUG level logging by default
+disable('DEBUG')
+
+def test( verbose=0 ):
+    "Performs module level testing"
+    import doctest
+    doctest.testmod( verbose=verbose )
+
+def OptionParser(usage=None):
+    "An option parser that can disable various logger levels"
+    from optparse import OptionParser
+
+    parser = OptionParser(usage=usage)
+    
+    parser.add_option(
+        '-v', '--verbosity', action="store", 
+        dest="verbosity", type="int", default=1, 
+        help="sets the verbosity (0, 1) (default=1)",
+    )
+
+    return parser
+
+if __name__ == "__main__":
+    test()
+   
Index: /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/genetrack/scripts/eland2gff.py
===================================================================
--- /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/genetrack/scripts/eland2gff.py (revision 3)
+++ /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/genetrack/scripts/eland2gff.py (revision 3)
@@ -0,0 +1,109 @@
+"""
+Eland file transformer. Transforms an eland file
+to a gff file format.
+
+    python eland2gff.py
+
+As a python module::
+
+    python -m genetrack.scripts.eland2gff
+
+Or in other python scripts::
+
+>>>
+>>> from genetrack.scripts import eland2gff
+>>> eland2gff.transform(inpname, outname)
+>>>
+
+Run the script with no parameters to see the options that it takes.
+
+**Observed runtime**: tranformation rate of 5 million lines per minute
+
+"""
+import os, sys, csv
+from itertools import *
+from genetrack import logger, conf, util
+
+
+def transform(inpname, size, outname=None):
+    """
+    Transforms reads stored in bedfile to a genetrack input file.
+    Requires at least 6 bed columns to access the strand.
+    """
+    logger.debug('input %s' % inpname)
+    logger.debug('output %s' % outname)
+
+    reader = csv.reader(open(inpname), delimiter='\t')
+
+    # unwind the iterator 
+    list(takewhile( lambda x: x[0].startswith('#'), reader))
+
+    output = file(outname, 'wt')
+    output.write('##gff-version 3\n') 
+    output.write('# created with eland2gff on %s\n' % inpname)
+    output.write('# fixed read lenght of %s\n' % size)
+    for row in reader:
+        chrom, start, strand = row[10], int(row[12]), row[13]
+        end = start + size
+        if strand == 'F':
+            strand = '+'
+        else:
+            strand = '-'
+        result = map(str, [chrom, '.', '.', start, end, '.', strand, '.', '.'])
+        output.write("%s\n" % '\t'.join(result))
+    
+    output.close()
+
+def option_parser():
+    "The option parser may be constructed in other tools invoking this script"
+    import optparse
+
+    usage = "usage: %prog -i inputfile -o outputfile"
+
+    parser = optparse.OptionParser(usage=usage)
+
+    # setting the input file name
+    parser.add_option(
+        '-i', '--input', action="store", 
+        dest="inpname", type='str', default=None,
+        help="the input file name (required)"
+    )
+
+    # setting the output file name
+    parser.add_option(
+        '-o', '--output', action="store", 
+        dest="outname", type='str', default=None,
+        help="output file name (optional)"
+    )
+
+    # verbosity can be 0,1 and 2 (increasing verbosity)
+    parser.add_option(
+        '-v', '--verbosity', action="store", 
+        dest="verbosity", type="int", default=1, 
+        help="sets the verbosity (0, 1) (default=1)",
+    )
+
+    # correction shift added in 5' direction for start/end coordinates
+    parser.add_option(
+        '-s', '--size', action="store", 
+        dest="size", type="int", default=36, 
+        help="readlength (fixed) default 36",
+    )
+
+    return parser
+
+if __name__ == '__main__':
+    
+    parser = option_parser()
+
+    options, args = parser.parse_args()
+
+    # set verbosity
+    logger.disable(options.verbosity)
+
+    # missing file names
+    if not options.inpname:
+        parser.print_help()
+    else:
+        options.outname=options.outname or '%s.gff' % options.inpname
+        transform(inpname=options.inpname, outname=options.outname, size=options.size)
Index: /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/genetrack/scripts/peakpred.py
===================================================================
--- /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/genetrack/scripts/peakpred.py (revision 3)
+++ /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/genetrack/scripts/peakpred.py (revision 3)
@@ -0,0 +1,213 @@
+"""
+Genetrack default smoothing and peak predictions. 
+
+The program may be invoked in multiple ways. As a standalone script::
+
+    python peakpred.py
+
+As a python module::
+
+    python -m genetrack.scripts.peakpred
+
+Or in other python scripts::
+
+>>>
+>>> from genetrack.scripts import peakpred
+>>> peakpred.predict(inpname, outname, options)
+>>>
+
+Run the script with no parameters to see the options that it takes.
+
+**Observed runtime**: 
+
+"""
+import os, sys, csv
+from genetrack import logger, util, hdflib, fitlib
+
+TWOSTRAND = "two"
+
+commify = util.commify
+
+def output(stream, peaks, chrom, w=73, strand='+', ):
+    "Outputs peaks to a stream"
+
+    logger.debug('writing %s peaks on strand %s' % (commify(len(peaks)), strand))
+    for mid, value in peaks:
+        start, end = mid - w, mid + w
+        stream.write("%s\t%d\t%d\t.\t%f\t%s\n" % (chrom, start, end, value, strand))
+
+def predict(inpname, outname, options):
+    """
+    Generate the peak predictions on a genome wide scale
+    """
+    if options.strand == TWOSTRAND:
+            logger.info('operating in twostrand mode')
+
+    if options.index:
+        index = hdflib.PositionalData(fname='', index=inpname, nobuild=True, workdir=options.workdir)
+    else:
+        index = hdflib.PositionalData(fname=inpname, nobuild=True, workdir=options.workdir)
+
+    fp = file(outname, 'wt')
+
+    for label in index.labels:
+        table = index.table(label)
+        size  = table.cols.idx[-1]
+        info  = util.commify(size)
+        logger.info('predicting on %s of total size %s' % (label, info))
+        lo = 0
+        hi = min( (size, options.maxsize) )
+
+        while True:
+            if lo >= size:
+                break
+            perc = '%.1f%%' % (100.0*lo/size)
+            logger.info('processing %s %s:%s (%s)' % (label, lo, hi, perc))
+            
+            # get the data
+            res = index.query(start=lo, end=hi, label=label)
+
+            
+            # exclusion zone
+            w = options.exclude/2
+
+            def predict(x, y):
+                fx, fy = fitlib.gaussian_smoothing(x=x, y=y, sigma=options.sigma, epsilon=options.level )
+                peaks = fitlib.detect_peaks(x=fx, y=fy )
+                if options.mode != 'all':
+                    peaks = fitlib.select_peaks(peaks=peaks, exclusion=options.exclude, threshold=options.level)
+                return peaks
+
+            if options.strand == TWOSTRAND:
+                # operates in two strand mode
+                for yval, strand in [ (res.fwd, '+'), (res.rev, '-') ]:
+                    logger.debug('processing strand %s' % strand)
+                    peaks = predict(x=res.idx, y=yval)
+                    output(stream=fp, peaks=peaks, chrom=label, w=w, strand=strand)
+            else:
+                # combine strands
+                peaks = predict(x=res.idx, y=res.val)
+                output(stream=fp, peaks=peaks, chrom=label, w=w, strand='+')
+
+            # switching to a higher interval
+            lo = hi
+            hi += options.maxsize
+        
+    fp.close()
+
+def option_parser():
+    "The option parser may be constructed in other tools invoking this script"
+    import optparse
+
+    usage = "usage: %prog -i inputfile -o outputfile"
+
+    parser = optparse.OptionParser(usage=usage)
+
+    # setting the input file name
+    parser.add_option(
+        '-i', '--input', action="store", 
+        dest="inpname", type='str', default=None,
+        help="the input hdf file name (required)"
+    )
+
+    # setting the output file name
+    parser.add_option(
+        '-o', '--output', action="store", 
+        dest="outname", type='str', default=None,
+        help="the output file name (required)"
+    )
+
+    # verbosity can be 0,1 and 2 (increasing verbosity)
+    parser.add_option(
+        '-v', '--verbosity', action="store", 
+        dest="verbosity", type="int", default=2, 
+        help="sets the verbosity (0, 1, 2) (default=1)",
+    )
+
+    # sigma correction
+    parser.add_option(
+        '--sigma', action="store", 
+        dest="sigma", type="float", default=20, 
+        help="the smoothing factor",
+    )
+
+    # the exclusion zone
+    parser.add_option(
+        '--exclusion', action="store", 
+        dest="exclude", type="int", default=100, 
+        help="the exclusion zone",
+    )
+
+    # the exclusion zone
+    parser.add_option(
+        '--strand', action="store", 
+        dest="strand", type="str", default="ALL", 
+        help="strand",
+    )
+
+    # threshold
+    parser.add_option(
+        '--level', action="store", 
+        dest="level", type="float", default=1, 
+        help="the minimum signal necessary to call peaks",
+    )
+
+    # currently not used
+    parser.add_option(
+        '--mode', action="store", 
+        dest="mode", type="str", default='maximal', 
+        help="the peak prediction method: 'maximal', 'threshold' or 'all'",
+    )
+
+    parser.add_option(
+        '--maxsize', action="store", 
+        dest="maxsize", type="int", default=10**7, 
+        help="the size of the largest internal array allocated (default=10 million)",
+    )
+
+    parser.add_option(
+        '--test', action="store_true", 
+        dest="test", default=False, 
+        help="demo mode used in testing",
+    )
+
+    parser.add_option(
+        '-w', '--workdir', action="store", 
+        dest="workdir", type='str', default=None,
+        help="work directory (optional)"
+    )
+
+    parser.add_option(
+        '-x', '--index', action="store_true", 
+        dest="index", default=False,
+        help="treat input file as binary index"
+    )
+
+    return parser
+
+
+if __name__ == '__main__':
+    import optparse
+
+    parser = option_parser()
+
+    options, args = parser.parse_args()
+
+    logger.disable(options.verbosity)
+
+    from genetrack import conf
+
+    # trigger test mode
+    if options.test:
+        options.inpname = conf.testdata('test-hdflib-input.gtrack')
+        options.outname = conf.testdata('predictions.bed')
+
+    # missing input file name
+    if not options.inpname and not options.outname:
+        parser.print_help()
+    else:
+        print 'Sigma = %s' % options.sigma
+        print 'Minimum peak = %s' % options.level
+        print 'Peak-to-peak = %s' % options.exclude
+
+        predict(options.inpname, options.outname, options)
Index: /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/genetrack/scripts/__init__.py
===================================================================
--- /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/genetrack/scripts/__init__.py (revision 3)
+++ /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/genetrack/scripts/__init__.py (revision 3)
@@ -0,0 +1,11 @@
+"""
+Scripts and modules that can be run from command line.
+
+Note that each of these scripts exposes a full API and may be run in multiple ways. 
+As independent scripts invoked via a shell command, or by importing them into pythons
+scripts.
+
+Most scripts take command line options of various types that you can see by just
+invoking them.
+
+"""
Index: /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/genetrack/scripts/tabs2genetrack.py
===================================================================
--- /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/genetrack/scripts/tabs2genetrack.py (revision 3)
+++ /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/genetrack/scripts/tabs2genetrack.py (revision 3)
@@ -0,0 +1,282 @@
+"""
+File transformer. Takes a tabuolar file (bed or gff) and 
+transforms them to a file used as genetrack input.
+Optional parameters may be used to shift the 5' ends with 
+a specified amount. This is useful if the file corresponds to data 
+with fixed fragment widths you can move each fragment to the 
+center location. The program may be invoked in multiple ways. 
+As a standalone script::
+
+    python tabs2genetrack.py
+
+As a python module::
+
+    python -m genetrack.scripts.tabs2genetrack
+
+Or in other python scripts::
+
+>>>
+>>> from genetrack.scripts import tabs2genetrack
+>>> tabs2genetrack.transform( inpname, outname, format='bed', shift=0)
+>>>
+
+Run the script with no parameters to see the options that it takes.
+
+A genetrack input file format is a tab delimited text file
+described in the API documentation of the PositionalData 
+class: `genetrack.hdflib.PositionalData`
+The transformation is a three step process, *transform*, 
+*sort* and *consolidate*. It will create files in the 
+genetrack temporary data directory and it will remove the intermediate files 
+when the process is complete.
+
+**Observed runtime**: tranformation rate of 2 million lines per minute
+
+**Note1**: The script will invoke the system `sort` command to sort the file 
+that is substantially faster under Unix than Windows.
+
+"""
+import os, sys, csv, shutil
+from itertools import *
+from genetrack import logger, conf, util, hdflib
+
+def consolidate( inpname, outname, format):
+    """
+    Consolidates an input file. 
+    Merges multiple indentical indices into one line
+    """
+    fp = open(outname, 'wt')
+
+    # recover the original basename
+    basename = os.path.basename(inpname).replace('.sorted', '')
+
+    # create a few information headers
+    fp.write("#\n# created with tabs2genetrack\n")
+    fp.write("# source: %s, format %s\n#\n" % (basename, format) )
+    fp.write("chrom\tindex\tforward\treverse\tvalue\n")
+    
+    # the main reader
+    reader = csv.reader(open(inpname, 'rb'), delimiter='\t')
+
+    # will duplicate some code to avoid an extra conditional internally
+    chrom, index, fwd, rev, val = reader.next()
+    lastindex, fwd, rev, val = int(index), int(fwd), int(rev), int(val)
+    collect = [ chrom, lastindex, fwd, rev, val ]
+
+    for row in reader:
+        chrom, index, fwd, rev, val = row
+        index, fwd, rev, val = int(index), int(fwd), int(rev), int(val)
+        if index == lastindex:
+            collect[2] += fwd
+            collect[3] += rev
+            collect[4] += val
+        else:
+            # write out the collected data
+            fp.write( '%s\t%s\t%s\t%s\t%s\n' % tuple(collect) )
+            collect = [ chrom, index, fwd, rev, val ]
+            lastindex = index
+
+    fp.close()
+
+def transform(inpname, outname, format, shift=0, index=False, options=None):
+    """
+    Transforms reads stored in bedfile to a genetrack input file.
+    Requires at least 6 bed columns to access the strand.
+    """
+
+    # detect file formats
+    if format == "BED":
+        CHROM, START, END, STRAND = 0, 1, 2, 5
+    elif format == "GFF":
+        CHROM, START, END, STRAND = 0, 3, 4, 6
+    else:
+        raise Exception('Invalid file format' % format)
+
+    # two sanity checks, one day someone will thank me
+    if format == 'BED' and inpname.endswith('gff'):
+        raise Exception('BED format on a gff file?')
+    if format == 'GFF' and inpname.endswith('bed'):
+        raise Exception('GFF format on a bed file?')
+
+    # find the basename of the outputname
+    basename = os.path.basename(outname)
+   
+    # two files store intermediate results
+    flat = conf.tempdata( '%s.flat' % basename )
+    sorted  = conf.tempdata( '%s.sorted' % basename )
+
+    # check for track information on first line, 
+    # much faster this way than conditional checking on each line
+    fp = file(inpname, 'rU')
+    first = fp.readline()
+    fp.close()
+
+    # create the reader
+    reader = csv.reader(file(inpname, 'rU'), delimiter='\t')
+
+    # skip if trackline exists
+    if first.startswith == 'track':
+        reader.next()
+
+    # unwind the comments
+    list(takewhile(lambda x: x[0].startswith('#'), reader))
+
+    # copious timing info for those who enjoy these
+    timer, full = util.Timer(), util.Timer()
+
+    logger.debug("parsing '%s'" % inpname)
+    logger.debug("output to '%s'" % outname)
+
+    # create the unsorted output file and apply corrections
+    logger.debug("unsorted flat file '%s'" % flat)
+
+    fp = file(flat, 'wt')
+    for linec, row in enumerate(reader):
+        try:
+            chrom, start, end, strand = row[CHROM], row[START], row[END], row[STRAND]
+        except Exception, exc:
+            first = row[0][0]
+            # may be hitting the end of the file with other comments
+            if  first == '>':
+                break # hit the sequence content of the gff file
+            elif first == '#':
+                continue # hit upon some comments
+            else:
+                logger.error(row)
+                raise Exception(exc) 
+
+        if strand == '+':
+            # on forward strand, 5' is at start
+            idx = int(start) + shift
+            fwd, rev, val = 1, 0, 1
+        elif strand == '-':
+            # on reverse strand, 5' is at end
+            idx = int(end) - shift
+            fwd, rev, val = 0, 1, 1
+        else:
+            # no strand specified, generate interval centers
+            idx = (int(start)+int(end))/2
+            fwd, rev, val = 0, 0, 1
+
+        # it is essential be able to sort the index as a string! 
+        fp.write('%s\t%012d\t%s\t%s\t%s\n' % (chrom, idx, fwd, rev, val))
+
+    fp.close()
+    linet = util.commify(linec)
+    logger.debug("parsing %s lines finished in %s" % (linet, timer.report()))
+
+    # if it is producing coverage then it will expand reads into full intervaals
+
+    # now let the sorting commence
+    cmd = "sort %s > %s" % (flat, sorted)
+    logger.debug("sorting into '%s'" % sorted)
+    os.system(cmd)
+    logger.debug("sorting finished in %s" % timer.report() )
+
+    logger.debug("consolidating into '%s'" % outname)
+    consolidate( sorted, outname, format=format)
+    logger.debug("consolidate finished in %s" % timer.report() )
+    logger.debug("output saved to '%s'" % outname)
+    logger.debug("full conversion finished in %s" % full.report() )
+
+    # attempting to cleanup the remaining files
+    for name in (flat, sorted):
+        logger.debug("removing temporary file '%s'" % name )
+        os.remove(name)
+
+    # also runs the indexing on it
+    if index:
+        logger.debug("loading the index from '%s'" % outname)
+        # create the work directory
+        if options.workdir and not os.path.isdir(options.workdir):
+            os.mkdir(options.workdir)
+        result = hdflib.PositionalData(fname=outname, update=True, workdir=options.workdir)
+        logger.debug("indexing finished in %s" % timer.report() )
+        result.close()
+
+        logger.debug("moving index to main output '%s'" % outname )
+
+        # remove the intermediate file
+        os.remove(outname)
+
+        # move the index as the output file
+        shutil.move(result.index, outname)
+
+def option_parser():
+    "The option parser may be constructed in other tools invoking this script"
+    import optparse
+
+    usage = "usage: %prog -i inputfile -o outputfile -f format"
+
+    parser = optparse.OptionParser(usage=usage)
+
+    # setting the input file name
+    parser.add_option(
+        '-i', '--input', action="store", 
+        dest="inpname", type='str', default=None,
+        help="the input file name (required)"
+    )
+
+    # setting the output file name
+    parser.add_option(
+        '-o', '--output', action="store", 
+        dest="outname", type='str', default=None,
+        help="output file name (required)"
+    )
+
+    # file formats
+    parser.add_option(
+        '-f', '--format', action="store", 
+        dest="format", type="str", default='', 
+        help="input file format, bed or gff (required)",
+    )
+    
+    # correction shift added in 5' direction for start/end coordinates
+    parser.add_option(
+        '-s', '--shift', action="store", 
+        dest="shift", type="int", default=0, 
+        help="shift for the 5' end on each strand (default=0)",
+    )
+
+    # verbosity can be 0,1 and 2 (increasing verbosity)
+    parser.add_option(
+        '-v', '--verbosity', action="store", 
+        dest="verbosity", type="int", default=1, 
+        help="sets the verbosity (0, 1) (default=1)",
+    )
+
+    parser.add_option("-x", "--index",
+        action="store_true", dest="index", default=False,
+        help="also creates an hdf index for the file")
+
+    parser.add_option(
+        '-w', '--workdir', action="store", 
+        dest="workdir", type='str', default=None,
+        help="work directory (optional)"
+    )
+
+    return parser
+
+if __name__ == '__main__':
+    
+    parser = option_parser()
+
+    options, args = parser.parse_args()
+
+    # uppercase the format
+    options.format = options.format.upper()
+
+    if options.format not in ('BED', 'GFF'):
+        sys.stdout = sys.stderr
+        parser.print_help()
+        sys.exit(-1)
+
+    logger.disable(options.verbosity)
+
+    # missing file names
+    if not (options.inpname and options.outname and options.format):
+        parser.print_help()
+        sys.exit(-1)
+    else:
+        transform(inpname=options.inpname, outname=options.outname,\
+            format=options.format, shift=options.shift, index=options.index, options=options)
Index: /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/genetrack/scripts/test.py
===================================================================
--- /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/genetrack/scripts/test.py (revision 3)
+++ /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/genetrack/scripts/test.py (revision 3)
@@ -0,0 +1,10 @@
+"""
+Testing the genetrack import procedure
+"""
+
+import genetrack
+from genetrack import hdflib
+
+print
+print '*** GeneTrack import successfull ***'
+print 
Index: /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/genetrack/scripts/hdf_loader.py
===================================================================
--- /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/genetrack/scripts/hdf_loader.py (revision 3)
+++ /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/genetrack/scripts/hdf_loader.py (revision 3)
@@ -0,0 +1,76 @@
+"""
+Genetrack file transformer. 
+
+The program may be invoked in multiple ways. As a standalone script::
+
+    python hdf_loader.py
+
+As a python module::
+
+    python -m genetrack.scripts.hdf_loader
+
+Or in other python scripts::
+
+>>>
+>>> from genetrack.scripts import hdf_loader
+>>> hdf_loader.transform(inpname)
+>>>
+
+Run the script with no parameters to see the options that it takes.
+
+**Observed runtime**: insertion rate of 6 million lines per minute
+
+"""
+import os, sys, csv
+from genetrack import logger, conf, util, hdflib
+
+
+def transform(inpname, workdir=None, update=False):
+    """
+    Creates a transform from a genetrack input file
+    """
+    index = hdflib.PositionalData(fname=inpname, workdir=workdir, update=update)        
+    return index
+
+if __name__ == '__main__':
+    import optparse
+
+    usage = "usage: %prog -i inputfile"
+
+    parser = optparse.OptionParser(usage=usage)
+
+    # setting the input file name
+    parser.add_option(
+        '-i', '--input', action="store", 
+        dest="inpname", type='str', default=None,
+        help="the input file name (required)"
+    )
+
+    # setting the output file name
+    parser.add_option(
+        '-w', '--workdir', action="store", 
+        dest="workdir", type='str', default=None,
+        help="work directory (optional)"
+    )
+
+    # verbosity can be 0,1 and 2 (increasing verbosity)
+    parser.add_option(
+        '-v', '--verbosity', action="store", 
+        dest="verbosity", type="int", default=1, 
+        help="sets the verbosity (0, 1) (default=1)",
+    )
+
+    parser.add_option("-u", "--update",
+        action="store_true", dest="update", default=False,
+        help="recreates the index even if it exists")
+
+    options, args = parser.parse_args()
+
+    # set verbosity
+    logger.disable( options.verbosity )
+
+    # missing input file name
+    if not options.inpname:
+        parser.print_help()
+    else:
+        transform(inpname=options.inpname, workdir=options.workdir, update=options.update)
Index: /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/genetrack/conf.py
===================================================================
--- /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/genetrack/conf.py (revision 3)
+++ /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/genetrack/conf.py (revision 3)
@@ -0,0 +1,109 @@
+"""
+Configuration namespace.
+
+
+"""
+import sys, os, shutil
+import logger
+
+# Python version check
+if sys.version_info < (2, 5):
+    logger.error( 'genetrack requires python 2.5 or higher' )
+    sys.exit()
+
+def path_join(*args):
+    "Builds absolute path"
+    return os.path.abspath(os.path.join(*args))
+
+# set up paths relative to the location of this file
+curr_dir = os.path.dirname( __file__ )
+BASE_DIR = path_join( curr_dir, '..' )
+TEST_DIR = path_join( BASE_DIR, 'tests' )
+TEST_DATA_DIR = path_join( TEST_DIR, 'testdata' )
+TEMP_DATA_DIR = path_join( TEST_DIR, 'tempdir' )
+COVERAGE_DIR = path_join( TEST_DIR, 'coverage' )
+
+
+def module_check(names, loglevel, exit=True):
+    "Verifies that required modules are present"
+
+    # required modules
+    errflag = False
+    
+
+    loglevel = loglevel
+    for name in names:
+        try:
+            __import__(name)
+        except ImportError, exc:
+            if not errflag:
+                loglevel('Software requirements not met!')
+                loglevel('See http://genetrack.bx.psu.edu for installation instructions')
+                loglevel('-' * 20)
+                errflag = True
+            loglevel('missing module: %s' % name)
+    
+    # missing dependecies
+    if exit and errflag:
+        sys.exit()
+
+
+def version_check():
+    # verify some of the versions
+    module_versions = [ ('tables', '2.0'), ('numpy', '1.1') ]
+    for name, version in module_versions:
+        try:
+            mod = __import__(name)
+            if mod.__version__ < version:
+                raise Exception('%s of version %s or higher is required' % (name, version))
+        except Exception, exc:
+            logger.error( str(exc) )
+            sys.exit()
+
+#perform the module check    
+required = ( 'numpy', 'tables', )
+module_check( required, loglevel=logger.error )
+version_check()
+
+def check_server():
+    "Checks for modules that are required to run the server"
+    optional = ( 'django', 'pychartdir', 'Image' )
+    module_check( optional, loglevel=logger.error )
+
+try:
+    # monkeypath pytables to disable the Natural Name warning
+    import re
+    from tables import path
+    path._pythonIdRE = re.compile('.')
+except:
+    logger.warn( 'could not patch the Natural Name warning' )
+
+def reset_dir(path):
+    "Resets a directory path"
+    if os.path.isdir( path ):
+        shutil.rmtree( path)
+        os.mkdir( path )
+
+# create the temporary data directory if not present
+if not os.path.isdir( TEMP_DATA_DIR ):
+    os.mkdir( TEMP_DATA_DIR )
+
+def testdata(*args, **kwds):
+    "Generates paths to test data"
+    path = path_join(TEST_DATA_DIR, *args)
+    if 'verify' in kwds:
+        if not os.path.isfile(path):
+            raise IOError("file '%s' not found" % path )
+    return path
+
+def tempdata(*args):
+    "Generates paths to temporary data"
+    return path_join(TEMP_DATA_DIR, *args)
+
+def test(verbose=0):
+    "Performs module level testing"
+    import doctest
+    doctest.testmod( verbose=verbose )
+
+if __name__ == "__main__":
+    test()
Index: /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/EGG-INFO/SOURCES.txt
===================================================================
--- /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/EGG-INFO/SOURCES.txt (revision 3)
+++ /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/EGG-INFO/SOURCES.txt (revision 3)
@@ -0,0 +1,21 @@
+README.txt
+scramble.py
+GeneTrack.egg-info/PKG-INFO
+GeneTrack.egg-info/SOURCES.txt
+GeneTrack.egg-info/dependency_links.txt
+GeneTrack.egg-info/not-zip-safe
+GeneTrack.egg-info/top_level.txt
+genetrack/__init__.py
+genetrack/conf.py
+genetrack/data.py
+genetrack/fitlib.py
+genetrack/hdflib.py
+genetrack/logger.py
+genetrack/roman.py
+genetrack/util.py
+genetrack/scripts/__init__.py
+genetrack/scripts/eland2gff.py
+genetrack/scripts/hdf_loader.py
+genetrack/scripts/peakpred.py
+genetrack/scripts/tabs2genetrack.py
+genetrack/scripts/test.py
Index: /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/EGG-INFO/top_level.txt
===================================================================
--- /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/EGG-INFO/top_level.txt (revision 3)
+++ /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/EGG-INFO/top_level.txt (revision 3)
@@ -0,0 +1,1 @@
+genetrack
Index: /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/EGG-INFO/PKG-INFO
===================================================================
--- /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/EGG-INFO/PKG-INFO (revision 3)
+++ /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/EGG-INFO/PKG-INFO (revision 3)
@@ -0,0 +1,10 @@
+Metadata-Version: 1.0
+Name: GeneTrack
+Version: 2.0.0-beta-1-dev-48da9e998f0caf01c5be731e926f4b0481f658f0
+Summary: UNKNOWN
+Home-page: UNKNOWN
+Author: UNKNOWN
+Author-email: UNKNOWN
+License: UNKNOWN
+Description: UNKNOWN
+Platform: UNKNOWN
Index: /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/EGG-INFO/dependency_links.txt
===================================================================
--- /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/EGG-INFO/dependency_links.txt (revision 3)
+++ /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/EGG-INFO/dependency_links.txt (revision 3)
@@ -0,0 +1,1 @@
+
Index: /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/EGG-INFO/not-zip-safe
===================================================================
--- /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/EGG-INFO/not-zip-safe (revision 3)
+++ /galaxy-central/eggs/GeneTrack-2.0.0_beta_1_dev_48da9e998f0caf01c5be731e926f4b0481f658f0-py2.6.egg/EGG-INFO/not-zip-safe (revision 3)
@@ -0,0 +1,1 @@
+
Index: /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/babel/core.py
===================================================================
--- /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/babel/core.py (revision 3)
+++ /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/babel/core.py (revision 3)
@@ -0,0 +1,784 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007 Edgewall Software
+# All rights reserved.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at http://babel.edgewall.org/wiki/License.
+#
+# This software consists of voluntary contributions made by many
+# individuals. For the exact contribution history, see the revision
+# history and logs, available at http://babel.edgewall.org/log/.
+
+"""Core locale representation and locale data access."""
+
+import os
+import pickle
+
+from babel import localedata
+
+__all__ = ['UnknownLocaleError', 'Locale', 'default_locale', 'negotiate_locale',
+           'parse_locale']
+__docformat__ = 'restructuredtext en'
+
+_global_data = None
+
+def get_global(key):
+    """Return the dictionary for the given key in the global data.
+    
+    The global data is stored in the ``babel/global.dat`` file and contains
+    information independent of individual locales.
+    
+    >>> get_global('zone_aliases')['UTC']
+    'Etc/GMT'
+    >>> get_global('zone_territories')['Europe/Berlin']
+    'DE'
+    
+    :param key: the data key
+    :return: the dictionary found in the global data under the given key
+    :rtype: `dict`
+    :since: version 0.9
+    """
+    global _global_data
+    if _global_data is None:
+        dirname = os.path.join(os.path.dirname(__file__))
+        filename = os.path.join(dirname, 'global.dat')
+        fileobj = open(filename, 'rb')
+        try:
+            _global_data = pickle.load(fileobj)
+        finally:
+            fileobj.close()
+    return _global_data.get(key, {})
+
+
+LOCALE_ALIASES = {
+    'ar': 'ar_SY', 'bg': 'bg_BG', 'bs': 'bs_BA', 'ca': 'ca_ES', 'cs': 'cs_CZ', 
+    'da': 'da_DK', 'de': 'de_DE', 'el': 'el_GR', 'en': 'en_US', 'es': 'es_ES', 
+    'et': 'et_EE', 'fa': 'fa_IR', 'fi': 'fi_FI', 'fr': 'fr_FR', 'gl': 'gl_ES', 
+    'he': 'he_IL', 'hu': 'hu_HU', 'id': 'id_ID', 'is': 'is_IS', 'it': 'it_IT', 
+    'ja': 'ja_JP', 'km': 'km_KH', 'ko': 'ko_KR', 'lt': 'lt_LT', 'lv': 'lv_LV', 
+    'mk': 'mk_MK', 'nl': 'nl_NL', 'nn': 'nn_NO', 'no': 'nb_NO', 'pl': 'pl_PL', 
+    'pt': 'pt_PT', 'ro': 'ro_RO', 'ru': 'ru_RU', 'sk': 'sk_SK', 'sl': 'sl_SI', 
+    'sv': 'sv_SE', 'th': 'th_TH', 'tr': 'tr_TR', 'uk': 'uk_UA'
+}
+
+
+class UnknownLocaleError(Exception):
+    """Exception thrown when a locale is requested for which no locale data
+    is available.
+    """
+
+    def __init__(self, identifier):
+        """Create the exception.
+        
+        :param identifier: the identifier string of the unsupported locale
+        """
+        Exception.__init__(self, 'unknown locale %r' % identifier)
+        self.identifier = identifier
+
+
+class Locale(object):
+    """Representation of a specific locale.
+    
+    >>> locale = Locale('en', 'US')
+    >>> repr(locale)
+    '<Locale "en_US">'
+    >>> locale.display_name
+    u'English (United States)'
+    
+    A `Locale` object can also be instantiated from a raw locale string:
+    
+    >>> locale = Locale.parse('en-US', sep='-')
+    >>> repr(locale)
+    '<Locale "en_US">'
+    
+    `Locale` objects provide access to a collection of locale data, such as
+    territory and language names, number and date format patterns, and more:
+    
+    >>> locale.number_symbols['decimal']
+    u'.'
+    
+    If a locale is requested for which no locale data is available, an
+    `UnknownLocaleError` is raised:
+    
+    >>> Locale.parse('en_DE')
+    Traceback (most recent call last):
+        ...
+    UnknownLocaleError: unknown locale 'en_DE'
+    
+    :see: `IETF RFC 3066 <http://www.ietf.org/rfc/rfc3066.txt>`_
+    """
+
+    def __init__(self, language, territory=None, script=None, variant=None):
+        """Initialize the locale object from the given identifier components.
+        
+        >>> locale = Locale('en', 'US')
+        >>> locale.language
+        'en'
+        >>> locale.territory
+        'US'
+        
+        :param language: the language code
+        :param territory: the territory (country or region) code
+        :param script: the script code
+        :param variant: the variant code
+        :raise `UnknownLocaleError`: if no locale data is available for the
+                                     requested locale
+        """
+        self.language = language
+        self.territory = territory
+        self.script = script
+        self.variant = variant
+        self.__data = None
+
+        identifier = str(self)
+        if not localedata.exists(identifier):
+            raise UnknownLocaleError(identifier)
+
+    def default(cls, category=None, aliases=LOCALE_ALIASES):
+        """Return the system default locale for the specified category.
+        
+        >>> for name in ['LANGUAGE', 'LC_ALL', 'LC_CTYPE']:
+        ...     os.environ[name] = ''
+        >>> os.environ['LANG'] = 'fr_FR.UTF-8'
+        >>> Locale.default('LC_MESSAGES')
+        <Locale "fr_FR">
+
+        :param category: one of the ``LC_XXX`` environment variable names
+        :param aliases: a dictionary of aliases for locale identifiers
+        :return: the value of the variable, or any of the fallbacks
+                 (``LANGUAGE``, ``LC_ALL``, ``LC_CTYPE``, and ``LANG``)
+        :rtype: `Locale`
+        :see: `default_locale`
+        """
+        return cls(default_locale(category, aliases=aliases))
+    default = classmethod(default)
+
+    def negotiate(cls, preferred, available, sep='_', aliases=LOCALE_ALIASES):
+        """Find the best match between available and requested locale strings.
+        
+        >>> Locale.negotiate(['de_DE', 'en_US'], ['de_DE', 'de_AT'])
+        <Locale "de_DE">
+        >>> Locale.negotiate(['de_DE', 'en_US'], ['en', 'de'])
+        <Locale "de">
+        >>> Locale.negotiate(['de_DE', 'de'], ['en_US'])
+        
+        You can specify the character used in the locale identifiers to separate
+        the differnet components. This separator is applied to both lists. Also,
+        case is ignored in the comparison:
+        
+        >>> Locale.negotiate(['de-DE', 'de'], ['en-us', 'de-de'], sep='-')
+        <Locale "de_DE">
+        
+        :param preferred: the list of locale identifers preferred by the user
+        :param available: the list of locale identifiers available
+        :param aliases: a dictionary of aliases for locale identifiers
+        :return: the `Locale` object for the best match, or `None` if no match
+                 was found
+        :rtype: `Locale`
+        :see: `negotiate_locale`
+        """
+        identifier = negotiate_locale(preferred, available, sep=sep,
+                                      aliases=aliases)
+        if identifier:
+            return Locale.parse(identifier, sep=sep)
+    negotiate = classmethod(negotiate)
+
+    def parse(cls, identifier, sep='_'):
+        """Create a `Locale` instance for the given locale identifier.
+        
+        >>> l = Locale.parse('de-DE', sep='-')
+        >>> l.display_name
+        u'Deutsch (Deutschland)'
+        
+        If the `identifier` parameter is not a string, but actually a `Locale`
+        object, that object is returned:
+        
+        >>> Locale.parse(l)
+        <Locale "de_DE">
+        
+        :param identifier: the locale identifier string
+        :param sep: optional component separator
+        :return: a corresponding `Locale` instance
+        :rtype: `Locale`
+        :raise `ValueError`: if the string does not appear to be a valid locale
+                             identifier
+        :raise `UnknownLocaleError`: if no locale data is available for the
+                                     requested locale
+        :see: `parse_locale`
+        """
+        if isinstance(identifier, basestring):
+            return cls(*parse_locale(identifier, sep=sep))
+        return identifier
+    parse = classmethod(parse)
+
+    def __eq__(self, other):
+        return str(self) == str(other)
+
+    def __repr__(self):
+        return '<Locale "%s">' % str(self)
+
+    def __str__(self):
+        return '_'.join(filter(None, [self.language, self.script,
+                                      self.territory, self.variant]))
+
+    def _data(self):
+        if self.__data is None:
+            self.__data = localedata.LocaleDataDict(localedata.load(str(self)))
+        return self.__data
+    _data = property(_data)
+
+    def get_display_name(self, locale=None):
+        """Return the display name of the locale using the given locale.
+        
+        The display name will include the language, territory, script, and
+        variant, if those are specified.
+        
+        >>> Locale('zh', 'CN', script='Hans').get_display_name('en')
+        u'Chinese (Simplified Han, China)'
+        
+        :param locale: the locale to use
+        :return: the display name
+        """
+        if locale is None:
+            locale = self
+        locale = Locale.parse(locale)
+        retval = locale.languages.get(self.language)
+        if self.territory or self.script or self.variant:
+            details = []
+            if self.script:
+                details.append(locale.scripts.get(self.script))
+            if self.territory:
+                details.append(locale.territories.get(self.territory))
+            if self.variant:
+                details.append(locale.variants.get(self.variant))
+            details = filter(None, details)
+            if details:
+                retval += ' (%s)' % u', '.join(details)
+        return retval
+
+    display_name = property(get_display_name, doc="""\
+        The localized display name of the locale.
+        
+        >>> Locale('en').display_name
+        u'English'
+        >>> Locale('en', 'US').display_name
+        u'English (United States)'
+        >>> Locale('sv').display_name
+        u'svenska'
+        
+        :type: `unicode`
+        """)
+
+    def english_name(self):
+        return self.get_display_name(Locale('en'))
+    english_name = property(english_name, doc="""\
+        The english display name of the locale.
+        
+        >>> Locale('de').english_name
+        u'German'
+        >>> Locale('de', 'DE').english_name
+        u'German (Germany)'
+        
+        :type: `unicode`
+        """)
+
+    #{ General Locale Display Names
+
+    def languages(self):
+        return self._data['languages']
+    languages = property(languages, doc="""\
+        Mapping of language codes to translated language names.
+        
+        >>> Locale('de', 'DE').languages['ja']
+        u'Japanisch'
+        
+        :type: `dict`
+        :see: `ISO 639 <http://www.loc.gov/standards/iso639-2/>`_
+        """)
+
+    def scripts(self):
+        return self._data['scripts']
+    scripts = property(scripts, doc="""\
+        Mapping of script codes to translated script names.
+        
+        >>> Locale('en', 'US').scripts['Hira']
+        u'Hiragana'
+        
+        :type: `dict`
+        :see: `ISO 15924 <http://www.evertype.com/standards/iso15924/>`_
+        """)
+
+    def territories(self):
+        return self._data['territories']
+    territories = property(territories, doc="""\
+        Mapping of script codes to translated script names.
+        
+        >>> Locale('es', 'CO').territories['DE']
+        u'Alemania'
+        
+        :type: `dict`
+        :see: `ISO 3166 <http://www.iso.org/iso/en/prods-services/iso3166ma/>`_
+        """)
+
+    def variants(self):
+        return self._data['variants']
+    variants = property(variants, doc="""\
+        Mapping of script codes to translated script names.
+        
+        >>> Locale('de', 'DE').variants['1901']
+        u'Alte deutsche Rechtschreibung'
+        
+        :type: `dict`
+        """)
+
+    #{ Number Formatting
+
+    def currencies(self):
+        return self._data['currency_names']
+    currencies = property(currencies, doc="""\
+        Mapping of currency codes to translated currency names.
+        
+        >>> Locale('en').currencies['COP']
+        u'Colombian Peso'
+        >>> Locale('de', 'DE').currencies['COP']
+        u'Kolumbianischer Peso'
+        
+        :type: `dict`
+        """)
+
+    def currency_symbols(self):
+        return self._data['currency_symbols']
+    currency_symbols = property(currency_symbols, doc="""\
+        Mapping of currency codes to symbols.
+        
+        >>> Locale('en', 'US').currency_symbols['USD']
+        u'$'
+        >>> Locale('es', 'CO').currency_symbols['USD']
+        u'US$'
+        
+        :type: `dict`
+        """)
+
+    def number_symbols(self):
+        return self._data['number_symbols']
+    number_symbols = property(number_symbols, doc="""\
+        Symbols used in number formatting.
+        
+        >>> Locale('fr', 'FR').number_symbols['decimal']
+        u','
+        
+        :type: `dict`
+        """)
+
+    def decimal_formats(self):
+        return self._data['decimal_formats']
+    decimal_formats = property(decimal_formats, doc="""\
+        Locale patterns for decimal number formatting.
+        
+        >>> Locale('en', 'US').decimal_formats[None]
+        <NumberPattern u'#,##0.###'>
+        
+        :type: `dict`
+        """)
+
+    def currency_formats(self):
+        return self._data['currency_formats']
+    currency_formats = property(currency_formats, doc=r"""\
+        Locale patterns for currency number formatting.
+        
+        >>> print Locale('en', 'US').currency_formats[None]
+        <NumberPattern u'\xa4#,##0.00'>
+        
+        :type: `dict`
+        """)
+
+    def percent_formats(self):
+        return self._data['percent_formats']
+    percent_formats = property(percent_formats, doc="""\
+        Locale patterns for percent number formatting.
+        
+        >>> Locale('en', 'US').percent_formats[None]
+        <NumberPattern u'#,##0%'>
+        
+        :type: `dict`
+        """)
+
+    def scientific_formats(self):
+        return self._data['scientific_formats']
+    scientific_formats = property(scientific_formats, doc="""\
+        Locale patterns for scientific number formatting.
+        
+        >>> Locale('en', 'US').scientific_formats[None]
+        <NumberPattern u'#E0'>
+        
+        :type: `dict`
+        """)
+
+    #{ Calendar Information and Date Formatting
+
+    def periods(self):
+        return self._data['periods']
+    periods = property(periods, doc="""\
+        Locale display names for day periods (AM/PM).
+        
+        >>> Locale('en', 'US').periods['am']
+        u'AM'
+        
+        :type: `dict`
+        """)
+
+    def days(self):
+        return self._data['days']
+    days = property(days, doc="""\
+        Locale display names for weekdays.
+        
+        >>> Locale('de', 'DE').days['format']['wide'][3]
+        u'Donnerstag'
+        
+        :type: `dict`
+        """)
+
+    def months(self):
+        return self._data['months']
+    months = property(months, doc="""\
+        Locale display names for months.
+        
+        >>> Locale('de', 'DE').months['format']['wide'][10]
+        u'Oktober'
+        
+        :type: `dict`
+        """)
+
+    def quarters(self):
+        return self._data['quarters']
+    quarters = property(quarters, doc="""\
+        Locale display names for quarters.
+        
+        >>> Locale('de', 'DE').quarters['format']['wide'][1]
+        u'1. Quartal'
+        
+        :type: `dict`
+        """)
+
+    def eras(self):
+        return self._data['eras']
+    eras = property(eras, doc="""\
+        Locale display names for eras.
+        
+        >>> Locale('en', 'US').eras['wide'][1]
+        u'Anno Domini'
+        >>> Locale('en', 'US').eras['abbreviated'][0]
+        u'BC'
+        
+        :type: `dict`
+        """)
+
+    def time_zones(self):
+        return self._data['time_zones']
+    time_zones = property(time_zones, doc="""\
+        Locale display names for time zones.
+        
+        >>> Locale('en', 'US').time_zones['Europe/London']['long']['daylight']
+        u'British Summer Time'
+        >>> Locale('en', 'US').time_zones['America/St_Johns']['city']
+        u"St. John's"
+        
+        :type: `dict`
+        """)
+
+    def meta_zones(self):
+        return self._data['meta_zones']
+    meta_zones = property(meta_zones, doc="""\
+        Locale display names for meta time zones.
+        
+        Meta time zones are basically groups of different Olson time zones that
+        have the same GMT offset and daylight savings time.
+        
+        >>> Locale('en', 'US').meta_zones['Europe_Central']['long']['daylight']
+        u'Central European Summer Time'
+        
+        :type: `dict`
+        :since: version 0.9
+        """)
+
+    def zone_formats(self):
+        return self._data['zone_formats']
+    zone_formats = property(zone_formats, doc=r"""\
+        Patterns related to the formatting of time zones.
+        
+        >>> Locale('en', 'US').zone_formats['fallback']
+        u'%(1)s (%(0)s)'
+        >>> Locale('pt', 'BR').zone_formats['region']
+        u'Hor\xe1rio %s'
+        
+        :type: `dict`
+        :since: version 0.9
+        """)
+
+    def first_week_day(self):
+        return self._data['week_data']['first_day']
+    first_week_day = property(first_week_day, doc="""\
+        The first day of a week, with 0 being Monday.
+        
+        >>> Locale('de', 'DE').first_week_day
+        0
+        >>> Locale('en', 'US').first_week_day
+        6
+        
+        :type: `int`
+        """)
+
+    def weekend_start(self):
+        return self._data['week_data']['weekend_start']
+    weekend_start = property(weekend_start, doc="""\
+        The day the weekend starts, with 0 being Monday.
+        
+        >>> Locale('de', 'DE').weekend_start
+        5
+        
+        :type: `int`
+        """)
+
+    def weekend_end(self):
+        return self._data['week_data']['weekend_end']
+    weekend_end = property(weekend_end, doc="""\
+        The day the weekend ends, with 0 being Monday.
+        
+        >>> Locale('de', 'DE').weekend_end
+        6
+        
+        :type: `int`
+        """)
+
+    def min_week_days(self):
+        return self._data['week_data']['min_days']
+    min_week_days = property(min_week_days, doc="""\
+        The minimum number of days in a week so that the week is counted as the
+        first week of a year or month.
+        
+        >>> Locale('de', 'DE').min_week_days
+        4
+        
+        :type: `int`
+        """)
+
+    def date_formats(self):
+        return self._data['date_formats']
+    date_formats = property(date_formats, doc="""\
+        Locale patterns for date formatting.
+        
+        >>> Locale('en', 'US').date_formats['short']
+        <DateTimePattern u'M/d/yy'>
+        >>> Locale('fr', 'FR').date_formats['long']
+        <DateTimePattern u'd MMMM yyyy'>
+        
+        :type: `dict`
+        """)
+
+    def time_formats(self):
+        return self._data['time_formats']
+    time_formats = property(time_formats, doc="""\
+        Locale patterns for time formatting.
+        
+        >>> Locale('en', 'US').time_formats['short']
+        <DateTimePattern u'h:mm a'>
+        >>> Locale('fr', 'FR').time_formats['long']
+        <DateTimePattern u'HH:mm:ss z'>
+        
+        :type: `dict`
+        """)
+
+    def datetime_formats(self):
+        return self._data['datetime_formats']
+    datetime_formats = property(datetime_formats, doc="""\
+        Locale patterns for datetime formatting.
+        
+        >>> Locale('en').datetime_formats[None]
+        u'{1} {0}'
+        >>> Locale('th').datetime_formats[None]
+        u'{1}, {0}'
+        
+        :type: `dict`
+        """)
+
+
+def default_locale(category=None, aliases=LOCALE_ALIASES):
+    """Returns the system default locale for a given category, based on
+    environment variables.
+    
+    >>> for name in ['LANGUAGE', 'LC_ALL', 'LC_CTYPE']:
+    ...     os.environ[name] = ''
+    >>> os.environ['LANG'] = 'fr_FR.UTF-8'
+    >>> default_locale('LC_MESSAGES')
+    'fr_FR'
+
+    The "C" or "POSIX" pseudo-locales are treated as aliases for the
+    "en_US_POSIX" locale:
+
+    >>> os.environ['LC_MESSAGES'] = 'POSIX'
+    >>> default_locale('LC_MESSAGES')
+    'en_US_POSIX'
+
+    :param category: one of the ``LC_XXX`` environment variable names
+    :param aliases: a dictionary of aliases for locale identifiers
+    :return: the value of the variable, or any of the fallbacks (``LANGUAGE``,
+             ``LC_ALL``, ``LC_CTYPE``, and ``LANG``)
+    :rtype: `str`
+    """
+    varnames = (category, 'LANGUAGE', 'LC_ALL', 'LC_CTYPE', 'LANG')
+    for name in filter(None, varnames):
+        locale = os.getenv(name)
+        if locale:
+            if name == 'LANGUAGE' and ':' in locale:
+                # the LANGUAGE variable may contain a colon-separated list of
+                # language codes; we just pick the language on the list
+                locale = locale.split(':')[0]
+            if locale in ('C', 'POSIX'):
+                locale = 'en_US_POSIX'
+            elif aliases and locale in aliases:
+                locale = aliases[locale]
+            return '_'.join(filter(None, parse_locale(locale)))
+
+def negotiate_locale(preferred, available, sep='_', aliases=LOCALE_ALIASES):
+    """Find the best match between available and requested locale strings.
+    
+    >>> negotiate_locale(['de_DE', 'en_US'], ['de_DE', 'de_AT'])
+    'de_DE'
+    >>> negotiate_locale(['de_DE', 'en_US'], ['en', 'de'])
+    'de'
+    
+    Case is ignored by the algorithm, the result uses the case of the preferred
+    locale identifier:
+    
+    >>> negotiate_locale(['de_DE', 'en_US'], ['de_de', 'de_at'])
+    'de_DE'
+    
+    >>> negotiate_locale(['de_DE', 'en_US'], ['de_de', 'de_at'])
+    'de_DE'
+    
+    By default, some web browsers unfortunately do not include the territory
+    in the locale identifier for many locales, and some don't even allow the
+    user to easily add the territory. So while you may prefer using qualified
+    locale identifiers in your web-application, they would not normally match
+    the language-only locale sent by such browsers. To workaround that, this
+    function uses a default mapping of commonly used langauge-only locale
+    identifiers to identifiers including the territory:
+    
+    >>> negotiate_locale(['ja', 'en_US'], ['ja_JP', 'en_US'])
+    'ja_JP'
+    
+    Some browsers even use an incorrect or outdated language code, such as "no"
+    for Norwegian, where the correct locale identifier would actually be "nb_NO"
+    (Bokmﾃ･l) or "nn_NO" (Nynorsk). The aliases are intended to take care of
+    such cases, too:
+    
+    >>> negotiate_locale(['no', 'sv'], ['nb_NO', 'sv_SE'])
+    'nb_NO'
+    
+    You can override this default mapping by passing a different `aliases`
+    dictionary to this function, or you can bypass the behavior althogher by
+    setting the `aliases` parameter to `None`.
+    
+    :param preferred: the list of locale strings preferred by the user
+    :param available: the list of locale strings available
+    :param sep: character that separates the different parts of the locale
+                strings
+    :param aliases: a dictionary of aliases for locale identifiers
+    :return: the locale identifier for the best match, or `None` if no match
+             was found
+    :rtype: `str`
+    """
+    available = [a.lower() for a in available if a]
+    for locale in preferred:
+        ll = locale.lower()
+        if ll in available:
+            return locale
+        if aliases:
+            alias = aliases.get(ll)
+            if alias:
+                alias = alias.replace('_', sep)
+                if alias.lower() in available:
+                    return alias
+        parts = locale.split(sep)
+        if len(parts) > 1 and parts[0].lower() in available:
+            return parts[0]
+    return None
+
+def parse_locale(identifier, sep='_'):
+    """Parse a locale identifier into a tuple of the form::
+    
+      ``(language, territory, script, variant)``
+    
+    >>> parse_locale('zh_CN')
+    ('zh', 'CN', None, None)
+    >>> parse_locale('zh_Hans_CN')
+    ('zh', 'CN', 'Hans', None)
+    
+    The default component separator is "_", but a different separator can be
+    specified using the `sep` parameter:
+    
+    >>> parse_locale('zh-CN', sep='-')
+    ('zh', 'CN', None, None)
+    
+    If the identifier cannot be parsed into a locale, a `ValueError` exception
+    is raised:
+    
+    >>> parse_locale('not_a_LOCALE_String')
+    Traceback (most recent call last):
+      ...
+    ValueError: 'not_a_LOCALE_String' is not a valid locale identifier
+    
+    Encoding information and locale modifiers are removed from the identifier:
+    
+    >>> parse_locale('it_IT@euro')
+    ('it', 'IT', None, None)
+    >>> parse_locale('en_US.UTF-8')
+    ('en', 'US', None, None)
+    >>> parse_locale('de_DE.iso885915@euro')
+    ('de', 'DE', None, None)
+    
+    :param identifier: the locale identifier string
+    :param sep: character that separates the different components of the locale
+                identifier
+    :return: the ``(language, territory, script, variant)`` tuple
+    :rtype: `tuple`
+    :raise `ValueError`: if the string does not appear to be a valid locale
+                         identifier
+    
+    :see: `IETF RFC 4646 <http://www.ietf.org/rfc/rfc4646.txt>`_
+    """
+    if '.' in identifier:
+        # this is probably the charset/encoding, which we don't care about
+        identifier = identifier.split('.', 1)[0]
+    if '@' in identifier:
+        # this is a locale modifier such as @euro, which we don't care about
+        # either
+        identifier = identifier.split('@', 1)[0]
+
+    parts = identifier.split(sep)
+    lang = parts.pop(0).lower()
+    if not lang.isalpha():
+        raise ValueError('expected only letters, got %r' % lang)
+
+    script = territory = variant = None
+    if parts:
+        if len(parts[0]) == 4 and parts[0].isalpha():
+            script = parts.pop(0).title()
+
+    if parts:
+        if len(parts[0]) == 2 and parts[0].isalpha():
+            territory = parts.pop(0).upper()
+        elif len(parts[0]) == 3 and parts[0].isdigit():
+            territory = parts.pop(0)
+
+    if parts:
+        if len(parts[0]) == 4 and parts[0][0].isdigit() or \
+                len(parts[0]) >= 5 and parts[0][0].isalpha():
+            variant = parts.pop()
+
+    if parts:
+        raise ValueError('%r is not a valid locale identifier' % identifier)
+
+    return lang, territory, script, variant
Index: /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/babel/localedata.py
===================================================================
--- /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/babel/localedata.py (revision 3)
+++ /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/babel/localedata.py (revision 3)
@@ -0,0 +1,209 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007 Edgewall Software
+# All rights reserved.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at http://babel.edgewall.org/wiki/License.
+#
+# This software consists of voluntary contributions made by many
+# individuals. For the exact contribution history, see the revision
+# history and logs, available at http://babel.edgewall.org/log/.
+
+"""Low-level locale data access.
+
+:note: The `Locale` class, which uses this module under the hood, provides a
+       more convenient interface for accessing the locale data.
+"""
+
+import os
+import pickle
+try:
+    import threading
+except ImportError:
+    import dummy_threading as threading
+from UserDict import DictMixin
+
+__all__ = ['exists', 'list', 'load']
+__docformat__ = 'restructuredtext en'
+
+_cache = {}
+_cache_lock = threading.RLock()
+_dirname = os.path.join(os.path.dirname(__file__), 'localedata')
+
+
+def exists(name):
+    """Check whether locale data is available for the given locale.
+    
+    :param name: the locale identifier string
+    :return: `True` if the locale data exists, `False` otherwise
+    :rtype: `bool`
+    """
+    if name in _cache:
+        return True
+    return os.path.exists(os.path.join(_dirname, '%s.dat' % name))
+
+
+def list():
+    """Return a list of all locale identifiers for which locale data is
+    available.
+    
+    :return: a list of locale identifiers (strings)
+    :rtype: `list`
+    :since: version 0.8.1
+    """
+    return [stem for stem, extension in [
+        os.path.splitext(filename) for filename in os.listdir(_dirname)
+    ] if extension == '.dat' and stem != 'root']
+
+
+def load(name, merge_inherited=True):
+    """Load the locale data for the given locale.
+    
+    The locale data is a dictionary that contains much of the data defined by
+    the Common Locale Data Repository (CLDR). This data is stored as a
+    collection of pickle files inside the ``babel`` package.
+    
+    >>> d = load('en_US')
+    >>> d['languages']['sv']
+    u'Swedish'
+    
+    Note that the results are cached, and subsequent requests for the same
+    locale return the same dictionary:
+    
+    >>> d1 = load('en_US')
+    >>> d2 = load('en_US')
+    >>> d1 is d2
+    True
+    
+    :param name: the locale identifier string (or "root")
+    :param merge_inherited: whether the inherited data should be merged into
+                            the data of the requested locale
+    :return: the locale data
+    :rtype: `dict`
+    :raise `IOError`: if no locale data file is found for the given locale
+                      identifer, or one of the locales it inherits from
+    """
+    _cache_lock.acquire()
+    try:
+        data = _cache.get(name)
+        if not data:
+            # Load inherited data
+            if name == 'root' or not merge_inherited:
+                data = {}
+            else:
+                parts = name.split('_')
+                if len(parts) == 1:
+                    parent = 'root'
+                else:
+                    parent = '_'.join(parts[:-1])
+                data = load(parent).copy()
+            filename = os.path.join(_dirname, '%s.dat' % name)
+            fileobj = open(filename, 'rb')
+            try:
+                if name != 'root' and merge_inherited:
+                    merge(data, pickle.load(fileobj))
+                else:
+                    data = pickle.load(fileobj)
+                _cache[name] = data
+            finally:
+                fileobj.close()
+        return data
+    finally:
+        _cache_lock.release()
+
+
+def merge(dict1, dict2):
+    """Merge the data from `dict2` into the `dict1` dictionary, making copies
+    of nested dictionaries.
+    
+    >>> d = {1: 'foo', 3: 'baz'}
+    >>> merge(d, {1: 'Foo', 2: 'Bar'})
+    >>> d
+    {1: 'Foo', 2: 'Bar', 3: 'baz'}
+    
+    :param dict1: the dictionary to merge into
+    :param dict2: the dictionary containing the data that should be merged
+    """
+    for key, val2 in dict2.items():
+        if val2 is not None:
+            val1 = dict1.get(key)
+            if isinstance(val2, dict):
+                if val1 is None:
+                    val1 = {}
+                if isinstance(val1, Alias):
+                    val1 = (val1, val2)
+                elif isinstance(val1, tuple):
+                    alias, others = val1
+                    others = others.copy()
+                    merge(others, val2)
+                    val1 = (alias, others)
+                else:
+                    val1 = val1.copy()
+                    merge(val1, val2)
+            else:
+                val1 = val2
+            dict1[key] = val1
+
+
+class Alias(object):
+    """Representation of an alias in the locale data.
+    
+    An alias is a value that refers to some other part of the locale data,
+    as specified by the `keys`.
+    """
+
+    def __init__(self, keys):
+        self.keys = tuple(keys)
+
+    def __repr__(self):
+        return '<%s %r>' % (type(self).__name__, self.keys)
+
+    def resolve(self, data):
+        """Resolve the alias based on the given data.
+        
+        This is done recursively, so if one alias resolves to a second alias,
+        that second alias will also be resolved.
+        
+        :param data: the locale data
+        :type data: `dict`
+        """
+        base = data
+        for key in self.keys:
+            data = data[key]
+        if isinstance(data, Alias):
+            data = data.resolve(base)
+        elif isinstance(data, tuple):
+            alias, others = data
+            data = alias.resolve(base)
+        return data
+
+
+class LocaleDataDict(DictMixin, dict):
+    """Dictionary wrapper that automatically resolves aliases to the actual
+    values.
+    """
+
+    def __init__(self, data, base=None):
+        dict.__init__(self, data)
+        if base is None:
+            base = data
+        self.base = base
+
+    def __getitem__(self, key):
+        orig = val = dict.__getitem__(self, key)
+        if isinstance(val, Alias): # resolve an alias
+            val = val.resolve(self.base)
+        if isinstance(val, tuple): # Merge a partial dict with an alias
+            alias, others = val
+            val = alias.resolve(self.base).copy()
+            merge(val, others)
+        if type(val) is dict: # Return a nested alias-resolving dict
+            val = LocaleDataDict(val, base=self.base)
+        if val is not orig:
+            self[key] = val
+        return val
+
+    def copy(self):
+        return LocaleDataDict(dict.copy(self), base=self.base)
Index: /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/babel/numbers.py
===================================================================
--- /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/babel/numbers.py (revision 3)
+++ /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/babel/numbers.py (revision 3)
@@ -0,0 +1,583 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007 Edgewall Software
+# All rights reserved.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at http://babel.edgewall.org/wiki/License.
+#
+# This software consists of voluntary contributions made by many
+# individuals. For the exact contribution history, see the revision
+# history and logs, available at http://babel.edgewall.org/log/.
+
+"""Locale dependent formatting and parsing of numeric data.
+
+The default locale for the functions in this module is determined by the
+following environment variables, in that order:
+
+ * ``LC_NUMERIC``,
+ * ``LC_ALL``, and
+ * ``LANG``
+"""
+# TODO:
+#  Padding and rounding increments in pattern:
+#  - http://www.unicode.org/reports/tr35/ (Appendix G.6)
+import math
+import re
+try:
+    from decimal import Decimal
+    have_decimal = True
+except ImportError:
+    have_decimal = False
+
+from babel.core import default_locale, Locale
+
+__all__ = ['format_number', 'format_decimal', 'format_currency',
+           'format_percent', 'format_scientific', 'parse_number',
+           'parse_decimal', 'NumberFormatError']
+__docformat__ = 'restructuredtext en'
+
+LC_NUMERIC = default_locale('LC_NUMERIC')
+
+def get_currency_name(currency, locale=LC_NUMERIC):
+    """Return the name used by the locale for the specified currency.
+    
+    >>> get_currency_name('USD', 'en_US')
+    u'US Dollar'
+    
+    :param currency: the currency code
+    :param locale: the `Locale` object or locale identifier
+    :return: the currency symbol
+    :rtype: `unicode`
+    :since: version 0.9.4
+    """
+    return Locale.parse(locale).currencies.get(currency, currency)
+
+def get_currency_symbol(currency, locale=LC_NUMERIC):
+    """Return the symbol used by the locale for the specified currency.
+    
+    >>> get_currency_symbol('USD', 'en_US')
+    u'$'
+    
+    :param currency: the currency code
+    :param locale: the `Locale` object or locale identifier
+    :return: the currency symbol
+    :rtype: `unicode`
+    """
+    return Locale.parse(locale).currency_symbols.get(currency, currency)
+
+def get_decimal_symbol(locale=LC_NUMERIC):
+    """Return the symbol used by the locale to separate decimal fractions.
+    
+    >>> get_decimal_symbol('en_US')
+    u'.'
+    
+    :param locale: the `Locale` object or locale identifier
+    :return: the decimal symbol
+    :rtype: `unicode`
+    """
+    return Locale.parse(locale).number_symbols.get('decimal', u'.')
+
+def get_plus_sign_symbol(locale=LC_NUMERIC):
+    """Return the plus sign symbol used by the current locale.
+    
+    >>> get_plus_sign_symbol('en_US')
+    u'+'
+    
+    :param locale: the `Locale` object or locale identifier
+    :return: the plus sign symbol
+    :rtype: `unicode`
+    """
+    return Locale.parse(locale).number_symbols.get('plusSign', u'+')
+
+def get_minus_sign_symbol(locale=LC_NUMERIC):
+    """Return the plus sign symbol used by the current locale.
+    
+    >>> get_minus_sign_symbol('en_US')
+    u'-'
+    
+    :param locale: the `Locale` object or locale identifier
+    :return: the plus sign symbol
+    :rtype: `unicode`
+    """
+    return Locale.parse(locale).number_symbols.get('minusSign', u'-')
+
+def get_exponential_symbol(locale=LC_NUMERIC):
+    """Return the symbol used by the locale to separate mantissa and exponent.
+    
+    >>> get_exponential_symbol('en_US')
+    u'E'
+    
+    :param locale: the `Locale` object or locale identifier
+    :return: the exponential symbol
+    :rtype: `unicode`
+    """
+    return Locale.parse(locale).number_symbols.get('exponential', u'E')
+
+def get_group_symbol(locale=LC_NUMERIC):
+    """Return the symbol used by the locale to separate groups of thousands.
+    
+    >>> get_group_symbol('en_US')
+    u','
+    
+    :param locale: the `Locale` object or locale identifier
+    :return: the group symbol
+    :rtype: `unicode`
+    """
+    return Locale.parse(locale).number_symbols.get('group', u',')
+
+def format_number(number, locale=LC_NUMERIC):
+    """Return the given number formatted for a specific locale.
+    
+    >>> format_number(1099, locale='en_US')
+    u'1,099'
+    
+    :param number: the number to format
+    :param locale: the `Locale` object or locale identifier
+    :return: the formatted number
+    :rtype: `unicode`
+    """
+    # Do we really need this one?
+    return format_decimal(number, locale=locale)
+
+def format_decimal(number, format=None, locale=LC_NUMERIC):
+    """Return the given decimal number formatted for a specific locale.
+    
+    >>> format_decimal(1.2345, locale='en_US')
+    u'1.234'
+    >>> format_decimal(1.2346, locale='en_US')
+    u'1.235'
+    >>> format_decimal(-1.2346, locale='en_US')
+    u'-1.235'
+    >>> format_decimal(1.2345, locale='sv_SE')
+    u'1,234'
+    >>> format_decimal(12345, locale='de')
+    u'12.345'
+
+    The appropriate thousands grouping and the decimal separator are used for
+    each locale:
+    
+    >>> format_decimal(12345.5, locale='en_US')
+    u'12,345.5'
+
+    :param number: the number to format
+    :param format: 
+    :param locale: the `Locale` object or locale identifier
+    :return: the formatted decimal number
+    :rtype: `unicode`
+    """
+    locale = Locale.parse(locale)
+    if not format:
+        format = locale.decimal_formats.get(format)
+    pattern = parse_pattern(format)
+    return pattern.apply(number, locale)
+
+def format_currency(number, currency, format=None, locale=LC_NUMERIC):
+    u"""Return formatted currency value.
+    
+    >>> format_currency(1099.98, 'USD', locale='en_US')
+    u'$1,099.98'
+    >>> format_currency(1099.98, 'USD', locale='es_CO')
+    u'US$\\xa01.099,98'
+    >>> format_currency(1099.98, 'EUR', locale='de_DE')
+    u'1.099,98\\xa0\\u20ac'
+    
+    The pattern can also be specified explicitly:
+    
+    >>> format_currency(1099.98, 'EUR', u'\xa4\xa4 #,##0.00', locale='en_US')
+    u'EUR 1,099.98'
+    
+    :param number: the number to format
+    :param currency: the currency code
+    :param locale: the `Locale` object or locale identifier
+    :return: the formatted currency value
+    :rtype: `unicode`
+    """
+    locale = Locale.parse(locale)
+    if not format:
+        format = locale.currency_formats.get(format)
+    pattern = parse_pattern(format)
+    return pattern.apply(number, locale, currency=currency)
+
+def format_percent(number, format=None, locale=LC_NUMERIC):
+    """Return formatted percent value for a specific locale.
+    
+    >>> format_percent(0.34, locale='en_US')
+    u'34%'
+    >>> format_percent(25.1234, locale='en_US')
+    u'2,512%'
+    >>> format_percent(25.1234, locale='sv_SE')
+    u'2\\xa0512\\xa0%'
+
+    The format pattern can also be specified explicitly:
+    
+    >>> format_percent(25.1234, u'#,##0\u2030', locale='en_US')
+    u'25,123\u2030'
+
+    :param number: the percent number to format
+    :param format: 
+    :param locale: the `Locale` object or locale identifier
+    :return: the formatted percent number
+    :rtype: `unicode`
+    """
+    locale = Locale.parse(locale)
+    if not format:
+        format = locale.percent_formats.get(format)
+    pattern = parse_pattern(format)
+    return pattern.apply(number, locale)
+
+def format_scientific(number, format=None, locale=LC_NUMERIC):
+    """Return value formatted in scientific notation for a specific locale.
+    
+    >>> format_scientific(10000, locale='en_US')
+    u'1E4'
+
+    The format pattern can also be specified explicitly:
+    
+    >>> format_scientific(1234567, u'##0E00', locale='en_US')
+    u'1.23E06'
+
+    :param number: the number to format
+    :param format: 
+    :param locale: the `Locale` object or locale identifier
+    :return: value formatted in scientific notation.
+    :rtype: `unicode`
+    """
+    locale = Locale.parse(locale)
+    if not format:
+        format = locale.scientific_formats.get(format)
+    pattern = parse_pattern(format)
+    return pattern.apply(number, locale)
+
+
+class NumberFormatError(ValueError):
+    """Exception raised when a string cannot be parsed into a number."""
+
+
+def parse_number(string, locale=LC_NUMERIC):
+    """Parse localized number string into a long integer.
+    
+    >>> parse_number('1,099', locale='en_US')
+    1099L
+    >>> parse_number('1.099', locale='de_DE')
+    1099L
+    
+    When the given string cannot be parsed, an exception is raised:
+    
+    >>> parse_number('1.099,98', locale='de')
+    Traceback (most recent call last):
+        ...
+    NumberFormatError: '1.099,98' is not a valid number
+    
+    :param string: the string to parse
+    :param locale: the `Locale` object or locale identifier
+    :return: the parsed number
+    :rtype: `long`
+    :raise `NumberFormatError`: if the string can not be converted to a number
+    """
+    try:
+        return long(string.replace(get_group_symbol(locale), ''))
+    except ValueError:
+        raise NumberFormatError('%r is not a valid number' % string)
+
+def parse_decimal(string, locale=LC_NUMERIC):
+    """Parse localized decimal string into a float.
+    
+    >>> parse_decimal('1,099.98', locale='en_US')
+    1099.98
+    >>> parse_decimal('1.099,98', locale='de')
+    1099.98
+    
+    When the given string cannot be parsed, an exception is raised:
+    
+    >>> parse_decimal('2,109,998', locale='de')
+    Traceback (most recent call last):
+        ...
+    NumberFormatError: '2,109,998' is not a valid decimal number
+    
+    :param string: the string to parse
+    :param locale: the `Locale` object or locale identifier
+    :return: the parsed decimal number
+    :rtype: `float`
+    :raise `NumberFormatError`: if the string can not be converted to a
+                                decimal number
+    """
+    locale = Locale.parse(locale)
+    try:
+        return float(string.replace(get_group_symbol(locale), '')
+                           .replace(get_decimal_symbol(locale), '.'))
+    except ValueError:
+        raise NumberFormatError('%r is not a valid decimal number' % string)
+
+
+PREFIX_END = r'[^0-9@#.,]'
+NUMBER_TOKEN = r'[0-9@#.\-,E+]'
+
+PREFIX_PATTERN = r"(?P<prefix>(?:'[^']*'|%s)*)" % PREFIX_END
+NUMBER_PATTERN = r"(?P<number>%s+)" % NUMBER_TOKEN
+SUFFIX_PATTERN = r"(?P<suffix>.*)"
+
+number_re = re.compile(r"%s%s%s" % (PREFIX_PATTERN, NUMBER_PATTERN,
+                                    SUFFIX_PATTERN))
+
+def split_number(value):
+    """Convert a number into a (intasstring, fractionasstring) tuple"""
+    if have_decimal and isinstance(value, Decimal):
+        text = str(value)
+    else:
+        text = ('%.9f' % value).rstrip('0')
+    if '.' in text:
+        a, b = text.split('.', 1)
+        if b == '0':
+            b = ''
+    else:
+        a, b = text, ''
+    return a, b
+
+def bankersround(value, ndigits=0):
+    """Round a number to a given precision.
+
+    Works like round() except that the round-half-even (banker's rounding)
+    algorithm is used instead of round-half-up.
+
+    >>> bankersround(5.5, 0)
+    6.0
+    >>> bankersround(6.5, 0)
+    6.0
+    >>> bankersround(-6.5, 0)
+    -6.0
+    >>> bankersround(1234.0, -2)
+    1200.0
+    """
+    sign = int(value < 0) and -1 or 1
+    value = abs(value)
+    a, b = split_number(value)
+    digits = a + b
+    add = 0
+    i = len(a) + ndigits
+    if i < 0 or i >= len(digits):
+        pass
+    elif digits[i] > '5':
+        add = 1
+    elif digits[i] == '5' and digits[i-1] in '13579':
+        add = 1
+    scale = 10**ndigits
+    if have_decimal and isinstance(value, Decimal):
+        return Decimal(int(value * scale + add)) / scale * sign
+    else:
+        return float(int(value * scale + add)) / scale * sign
+
+def parse_pattern(pattern):
+    """Parse number format patterns"""
+    if isinstance(pattern, NumberPattern):
+        return pattern
+
+    # Do we have a negative subpattern?
+    if ';' in pattern:
+        pattern, neg_pattern = pattern.split(';', 1)
+        pos_prefix, number, pos_suffix = number_re.search(pattern).groups()
+        neg_prefix, _, neg_suffix = number_re.search(neg_pattern).groups()
+    else:
+        pos_prefix, number, pos_suffix = number_re.search(pattern).groups()
+        neg_prefix = '-' + pos_prefix
+        neg_suffix = pos_suffix
+    if 'E' in number:
+        number, exp = number.split('E', 1)
+    else:
+        exp = None
+    if '@' in number:
+        if '.' in number and '0' in number:
+            raise ValueError('Significant digit patterns can not contain '
+                             '"@" or "0"')
+    if '.' in number:
+        integer, fraction = number.rsplit('.', 1)
+    else:
+        integer = number
+        fraction = ''
+    min_frac = max_frac = 0
+
+    def parse_precision(p):
+        """Calculate the min and max allowed digits"""
+        min = max = 0
+        for c in p:
+            if c in '@0':
+                min += 1
+                max += 1
+            elif c == '#':
+                max += 1
+            elif c == ',':
+                continue
+            else:
+                break
+        return min, max
+
+    def parse_grouping(p):
+        """Parse primary and secondary digit grouping
+
+        >>> parse_grouping('##')
+        0, 0
+        >>> parse_grouping('#,###')
+        3, 3
+        >>> parse_grouping('#,####,###')
+        3, 4
+        """
+        width = len(p)
+        g1 = p.rfind(',')
+        if g1 == -1:
+            return 1000, 1000
+        g1 = width - g1 - 1
+        g2 = p[:-g1 - 1].rfind(',')
+        if g2 == -1:
+            return g1, g1
+        g2 = width - g1 - g2 - 2
+        return g1, g2
+
+    int_prec = parse_precision(integer)
+    frac_prec = parse_precision(fraction)
+    if exp:
+        frac_prec = parse_precision(integer+fraction)
+        exp_plus = exp.startswith('+')
+        exp = exp.lstrip('+')
+        exp_prec = parse_precision(exp)
+    else:
+        exp_plus = None
+        exp_prec = None
+    grouping = parse_grouping(integer)
+    return NumberPattern(pattern, (pos_prefix, neg_prefix), 
+                         (pos_suffix, neg_suffix), grouping,
+                         int_prec, frac_prec, 
+                         exp_prec, exp_plus)
+
+
+class NumberPattern(object):
+
+    def __init__(self, pattern, prefix, suffix, grouping,
+                 int_prec, frac_prec, exp_prec, exp_plus):
+        self.pattern = pattern
+        self.prefix = prefix
+        self.suffix = suffix
+        self.grouping = grouping
+        self.int_prec = int_prec
+        self.frac_prec = frac_prec
+        self.exp_prec = exp_prec
+        self.exp_plus = exp_plus
+        if '%' in ''.join(self.prefix + self.suffix):
+            self.scale = 100
+        elif u'窶ｰ' in ''.join(self.prefix + self.suffix):
+            self.scale = 1000
+        else:
+            self.scale = 1
+
+    def __repr__(self):
+        return '<%s %r>' % (type(self).__name__, self.pattern)
+
+    def apply(self, value, locale, currency=None):
+        value *= self.scale
+        is_negative = int(value < 0)
+        if self.exp_prec: # Scientific notation
+            value = abs(value)
+            if value:
+                exp = int(math.floor(math.log(value, 10)))
+            else:
+                exp = 0
+            # Minimum number of integer digits
+            if self.int_prec[0] == self.int_prec[1]:
+                exp -= self.int_prec[0] - 1
+            # Exponent grouping
+            elif self.int_prec[1]:
+                exp = int(exp) / self.int_prec[1] * self.int_prec[1]
+            if not have_decimal or not isinstance(value, Decimal):
+                value = float(value)
+            if exp < 0:
+                value = value * 10**(-exp)
+            else:
+                value = value / 10**exp
+            exp_sign = ''
+            if exp < 0:
+                exp_sign = get_minus_sign_symbol(locale)
+            elif self.exp_plus:
+                exp_sign = get_plus_sign_symbol(locale)
+            exp = abs(exp)
+            number = u'%s%s%s%s' % \
+                 (self._format_sigdig(value, self.frac_prec[0], 
+                                     self.frac_prec[1]), 
+                  get_exponential_symbol(locale),  exp_sign,
+                  self._format_int(str(exp), self.exp_prec[0],
+                                   self.exp_prec[1], locale))
+        elif '@' in self.pattern: # Is it a siginificant digits pattern?
+            text = self._format_sigdig(abs(value),
+                                      self.int_prec[0],
+                                      self.int_prec[1])
+            if '.' in text:
+                a, b = text.split('.')
+                a = self._format_int(a, 0, 1000, locale)
+                if b:
+                    b = get_decimal_symbol(locale) + b
+                number = a + b
+            else:
+                number = self._format_int(text, 0, 1000, locale)
+        else: # A normal number pattern
+            a, b = split_number(bankersround(abs(value), 
+                                             self.frac_prec[1]))
+            b = b or '0'
+            a = self._format_int(a, self.int_prec[0],
+                                 self.int_prec[1], locale)
+            b = self._format_frac(b, locale)
+            number = a + b
+        retval = u'%s%s%s' % (self.prefix[is_negative], number,
+                                self.suffix[is_negative])
+        if u'ﾂ､' in retval:
+            retval = retval.replace(u'ﾂ､ﾂ､', currency.upper())
+            retval = retval.replace(u'ﾂ､', get_currency_symbol(currency, locale))
+        return retval
+
+    def _format_sigdig(self, value, min, max):
+        """Convert value to a string.
+
+        The resulting string will contain between (min, max) number of
+        significant digits.
+        """
+        a, b = split_number(value)
+        ndecimals = len(a)
+        if a == '0' and b != '':
+            ndecimals = 0
+            while b.startswith('0'):
+                b = b[1:]
+                ndecimals -= 1
+        a, b = split_number(bankersround(value, max - ndecimals))
+        digits = len((a + b).lstrip('0'))
+        if not digits:
+            digits = 1
+        # Figure out if we need to add any trailing '0':s
+        if len(a) >= max and a != '0':
+            return a
+        if digits < min:
+            b += ('0' * (min - digits))
+        if b:
+            return '%s.%s' % (a, b)
+        return a
+
+    def _format_int(self, value, min, max, locale):
+        width = len(value)
+        if width < min:
+            value = '0' * (min - width) + value
+        gsize = self.grouping[0]
+        ret = ''
+        symbol = get_group_symbol(locale)
+        while len(value) > gsize:
+            ret = symbol + value[-gsize:] + ret
+            value = value[:-gsize]
+            gsize = self.grouping[1]
+        return value + ret
+
+    def _format_frac(self, value, locale):
+        min, max = self.frac_prec
+        if len(value) < min:
+            value += ('0' * (min - len(value)))
+        if max == 0 or (min == 0 and int(value) == 0):
+            return ''
+        width = len(value)
+        while len(value) > min and value[-1] == '0':
+            value = value[:-1]
+        return get_decimal_symbol(locale) + value
Index: /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/babel/support.py
===================================================================
--- /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/babel/support.py (revision 3)
+++ /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/babel/support.py (revision 3)
@@ -0,0 +1,398 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007 Edgewall Software
+# All rights reserved.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at http://babel.edgewall.org/wiki/License.
+#
+# This software consists of voluntary contributions made by many
+# individuals. For the exact contribution history, see the revision
+# history and logs, available at http://babel.edgewall.org/log/.
+
+"""Several classes and functions that help with integrating and using Babel
+in applications.
+
+.. note: the code in this module is not used by Babel itself
+"""
+
+from datetime import date, datetime, time
+import gettext
+
+try:
+    set
+except NameError:
+    from sets import set
+
+from babel.core import Locale
+from babel.dates import format_date, format_datetime, format_time, LC_TIME
+from babel.numbers import format_number, format_decimal, format_currency, \
+                          format_percent, format_scientific, LC_NUMERIC
+from babel.util import UTC
+
+__all__ = ['Format', 'LazyProxy', 'Translations']
+__docformat__ = 'restructuredtext en'
+
+
+class Format(object):
+    """Wrapper class providing the various date and number formatting functions
+    bound to a specific locale and time-zone.
+    
+    >>> fmt = Format('en_US', UTC)
+    >>> fmt.date(date(2007, 4, 1))
+    u'Apr 1, 2007'
+    >>> fmt.decimal(1.2345)
+    u'1.234'
+    """
+
+    def __init__(self, locale, tzinfo=None):
+        """Initialize the formatter.
+        
+        :param locale: the locale identifier or `Locale` instance
+        :param tzinfo: the time-zone info (a `tzinfo` instance or `None`)
+        """
+        self.locale = Locale.parse(locale)
+        self.tzinfo = tzinfo
+
+    def date(self, date=None, format='medium'):
+        """Return a date formatted according to the given pattern.
+        
+        >>> fmt = Format('en_US')
+        >>> fmt.date(date(2007, 4, 1))
+        u'Apr 1, 2007'
+        
+        :see: `babel.dates.format_date`
+        """
+        return format_date(date, format, locale=self.locale)
+
+    def datetime(self, datetime=None, format='medium'):
+        """Return a date and time formatted according to the given pattern.
+        
+        >>> from pytz import timezone
+        >>> fmt = Format('en_US', tzinfo=timezone('US/Eastern'))
+        >>> fmt.datetime(datetime(2007, 4, 1, 15, 30))
+        u'Apr 1, 2007 11:30:00 AM'
+        
+        :see: `babel.dates.format_datetime`
+        """
+        return format_datetime(datetime, format, tzinfo=self.tzinfo,
+                               locale=self.locale)
+
+    def time(self, time=None, format='medium'):
+        """Return a time formatted according to the given pattern.
+        
+        >>> from pytz import timezone
+        >>> fmt = Format('en_US', tzinfo=timezone('US/Eastern'))
+        >>> fmt.time(datetime(2007, 4, 1, 15, 30))
+        u'11:30:00 AM'
+        
+        :see: `babel.dates.format_time`
+        """
+        return format_time(time, format, tzinfo=self.tzinfo, locale=self.locale)
+
+    def number(self, number):
+        """Return an integer number formatted for the locale.
+        
+        >>> fmt = Format('en_US')
+        >>> fmt.number(1099)
+        u'1,099'
+        
+        :see: `babel.numbers.format_number`
+        """
+        return format_number(number, locale=self.locale)
+
+    def decimal(self, number, format=None):
+        """Return a decimal number formatted for the locale.
+        
+        >>> fmt = Format('en_US')
+        >>> fmt.decimal(1.2345)
+        u'1.234'
+        
+        :see: `babel.numbers.format_decimal`
+        """
+        return format_decimal(number, format, locale=self.locale)
+
+    def currency(self, number, currency):
+        """Return a number in the given currency formatted for the locale.
+        
+        :see: `babel.numbers.format_currency`
+        """
+        return format_currency(number, currency, locale=self.locale)
+
+    def percent(self, number, format=None):
+        """Return a number formatted as percentage for the locale.
+        
+        >>> fmt = Format('en_US')
+        >>> fmt.percent(0.34)
+        u'34%'
+        
+        :see: `babel.numbers.format_percent`
+        """
+        return format_percent(number, format, locale=self.locale)
+
+    def scientific(self, number):
+        """Return a number formatted using scientific notation for the locale.
+        
+        :see: `babel.numbers.format_scientific`
+        """
+        return format_scientific(number, locale=self.locale)
+
+
+class LazyProxy(object):
+    """Class for proxy objects that delegate to a specified function to evaluate
+    the actual object.
+    
+    >>> def greeting(name='world'):
+    ...     return 'Hello, %s!' % name
+    >>> lazy_greeting = LazyProxy(greeting, name='Joe')
+    >>> print lazy_greeting
+    Hello, Joe!
+    >>> u'  ' + lazy_greeting
+    u'  Hello, Joe!'
+    >>> u'(%s)' % lazy_greeting
+    u'(Hello, Joe!)'
+    
+    This can be used, for example, to implement lazy translation functions that
+    delay the actual translation until the string is actually used. The
+    rationale for such behavior is that the locale of the user may not always
+    be available. In web applications, you only know the locale when processing
+    a request.
+    
+    The proxy implementation attempts to be as complete as possible, so that
+    the lazy objects should mostly work as expected, for example for sorting:
+    
+    >>> greetings = [
+    ...     LazyProxy(greeting, 'world'),
+    ...     LazyProxy(greeting, 'Joe'),
+    ...     LazyProxy(greeting, 'universe'),
+    ... ]
+    >>> greetings.sort()
+    >>> for greeting in greetings:
+    ...     print greeting
+    Hello, Joe!
+    Hello, universe!
+    Hello, world!
+    """
+    __slots__ = ['_func', '_args', '_kwargs', '_value']
+
+    def __init__(self, func, *args, **kwargs):
+        # Avoid triggering our own __setattr__ implementation
+        object.__setattr__(self, '_func', func)
+        object.__setattr__(self, '_args', args)
+        object.__setattr__(self, '_kwargs', kwargs)
+        object.__setattr__(self, '_value', None)
+
+    def value(self):
+        if self._value is None:
+            value = self._func(*self._args, **self._kwargs)
+            object.__setattr__(self, '_value', value)
+        return self._value
+    value = property(value)
+
+    def __contains__(self, key):
+        return key in self.value
+
+    def __nonzero__(self):
+        return bool(self.value)
+
+    def __dir__(self):
+        return dir(self.value)
+
+    def __iter__(self):
+        return iter(self.value)
+
+    def __len__(self):
+        return len(self.value)
+
+    def __str__(self):
+        return str(self.value)
+
+    def __unicode__(self):
+        return unicode(self.value)
+
+    def __add__(self, other):
+        return self.value + other
+
+    def __radd__(self, other):
+        return other + self.value
+
+    def __mod__(self, other):
+        return self.value % other
+
+    def __rmod__(self, other):
+        return other % self.value
+
+    def __mul__(self, other):
+        return self.value * other
+
+    def __rmul__(self, other):
+        return other * self.value
+
+    def __call__(self, *args, **kwargs):
+        return self.value(*args, **kwargs)
+
+    def __lt__(self, other):
+        return self.value < other
+
+    def __le__(self, other):
+        return self.value <= other
+
+    def __eq__(self, other):
+        return self.value == other
+
+    def __ne__(self, other):
+        return self.value != other
+
+    def __gt__(self, other):
+        return self.value > other
+
+    def __ge__(self, other):
+        return self.value >= other
+
+    def __delattr__(self, name):
+        delattr(self.value, name)
+
+    def __getattr__(self, name):
+        return getattr(self.value, name)
+
+    def __setattr__(self, name, value):
+        setattr(self.value, name, value)
+
+    def __delitem__(self, key):
+        del self.value[key]
+
+    def __getitem__(self, key):
+        return self.value[key]
+
+    def __setitem__(self, key, value):
+        self.value[key] = value
+
+    
+class Translations(gettext.GNUTranslations, object):
+    """An extended translation catalog class."""
+
+    DEFAULT_DOMAIN = 'messages'
+
+    def __init__(self, fileobj=None, domain=DEFAULT_DOMAIN):
+        """Initialize the translations catalog.
+
+        :param fileobj: the file-like object the translation should be read
+                        from
+        """
+        gettext.GNUTranslations.__init__(self, fp=fileobj)
+        self.files = filter(None, [getattr(fileobj, 'name', None)])
+        self.domain = domain
+        self._domains = {}
+
+    def load(cls, dirname=None, locales=None, domain=DEFAULT_DOMAIN):
+        """Load translations from the given directory.
+
+        :param dirname: the directory containing the ``MO`` files
+        :param locales: the list of locales in order of preference (items in
+                        this list can be either `Locale` objects or locale
+                        strings)
+        :param domain: the message domain
+        :return: the loaded catalog, or a ``NullTranslations`` instance if no
+                 matching translations were found
+        :rtype: `Translations`
+        """
+        if locales is not None:
+            if not isinstance(locales, (list, tuple)):
+                locales = [locales]
+            locales = [str(locale) for locale in locales]
+        if not domain:
+            domain = cls.DEFAULT_DOMAIN
+        filename = gettext.find(domain, dirname, locales)
+        if not filename:
+            return gettext.NullTranslations()
+        return cls(fileobj=open(filename, 'rb'), domain=domain)
+    load = classmethod(load)
+
+    def __repr__(self):
+        return '<%s: "%s">' % (type(self).__name__,
+                               self._info.get('project-id-version'))
+
+    def add(self, translations, merge=True):
+        """Add the given translations to the catalog.
+
+        If the domain of the translations is different than that of the
+        current catalog, they are added as a catalog that is only accessible
+        by the various ``d*gettext`` functions.
+
+        :param translations: the `Translations` instance with the messages to
+                             add
+        :param merge: whether translations for message domains that have
+                      already been added should be merged with the existing
+                      translations
+        :return: the `Translations` instance (``self``) so that `merge` calls
+                 can be easily chained
+        :rtype: `Translations`
+        """
+        domain = getattr(translations, 'domain', self.DEFAULT_DOMAIN)
+        if merge and domain == self.domain:
+            return self.merge(translations)
+
+        existing = self._domains.get(domain)
+        if merge and existing is not None:
+            existing.merge(translations)
+        else:
+            translations.add_fallback(self)
+            self._domains[domain] = translations
+
+        return self
+
+    def merge(self, translations):
+        """Merge the given translations into the catalog.
+
+        Message translations in the specified catalog override any messages
+        with the same identifier in the existing catalog.
+
+        :param translations: the `Translations` instance with the messages to
+                             merge
+        :return: the `Translations` instance (``self``) so that `merge` calls
+                 can be easily chained
+        :rtype: `Translations`
+        """
+        if isinstance(translations, gettext.GNUTranslations):
+            self._catalog.update(translations._catalog)
+            if isinstance(translations, Translations):
+                self.files.extend(translations.files)
+
+        return self
+
+    def dgettext(self, domain, message):
+        """Like ``gettext()``, but look the message up in the specified
+        domain.
+        """
+        return self._domains.get(domain, self).gettext(message)
+    
+    def ldgettext(self, domain, message):
+        """Like ``lgettext()``, but look the message up in the specified 
+        domain.
+        """ 
+        return self._domains.get(domain, self).lgettext(message)
+    
+    def dugettext(self, domain, message):
+        """Like ``ugettext()``, but look the message up in the specified
+        domain.
+        """
+        return self._domains.get(domain, self).ugettext(message)
+    
+    def dngettext(self, domain, singular, plural, num):
+        """Like ``ngettext()``, but look the message up in the specified
+        domain.
+        """
+        return self._domains.get(domain, self).ngettext(singular, plural, num)
+    
+    def ldngettext(self, domain, singular, plural, num):
+        """Like ``lngettext()``, but look the message up in the specified
+        domain.
+        """
+        return self._domains.get(domain, self).lngettext(singular, plural, num)
+    
+    def dungettext(self, domain, singular, plural, num):
+        """Like ``ungettext()`` but look the message up in the specified
+        domain.
+        """
+        return self._domains.get(domain, self).ungettext(singular, plural, num)
Index: /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/babel/util.py
===================================================================
--- /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/babel/util.py (revision 3)
+++ /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/babel/util.py (revision 3)
@@ -0,0 +1,348 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007 Edgewall Software
+# All rights reserved.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at http://babel.edgewall.org/wiki/License.
+#
+# This software consists of voluntary contributions made by many
+# individuals. For the exact contribution history, see the revision
+# history and logs, available at http://babel.edgewall.org/log/.
+
+"""Various utility classes and functions."""
+
+import codecs
+from datetime import timedelta, tzinfo
+import os
+import re
+try:
+    set
+except NameError:
+    from sets import Set as set
+import textwrap
+import time
+from itertools import izip, imap
+missing = object()
+
+__all__ = ['distinct', 'pathmatch', 'relpath', 'wraptext', 'odict', 'UTC',
+           'LOCALTZ']
+__docformat__ = 'restructuredtext en'
+
+
+def distinct(iterable):
+    """Yield all items in an iterable collection that are distinct.
+
+    Unlike when using sets for a similar effect, the original ordering of the
+    items in the collection is preserved by this function.
+
+    >>> print list(distinct([1, 2, 1, 3, 4, 4]))
+    [1, 2, 3, 4]
+    >>> print list(distinct('foobar'))
+    ['f', 'o', 'b', 'a', 'r']
+
+    :param iterable: the iterable collection providing the data
+    :return: the distinct items in the collection
+    :rtype: ``iterator``
+    """
+    seen = set()
+    for item in iter(iterable):
+        if item not in seen:
+            yield item
+            seen.add(item)
+
+# Regexp to match python magic encoding line
+PYTHON_MAGIC_COMMENT_re = re.compile(
+    r'[ \t\f]* \# .* coding[=:][ \t]*([-\w.]+)', re.VERBOSE)
+def parse_encoding(fp):
+    """Deduce the encoding of a source file from magic comment.
+
+    It does this in the same way as the `Python interpreter`__
+
+    .. __: http://docs.python.org/ref/encodings.html
+
+    The ``fp`` argument should be a seekable file object.
+
+    (From Jeff Dairiki)
+    """
+    pos = fp.tell()
+    fp.seek(0)
+    try:
+        line1 = fp.readline()
+        has_bom = line1.startswith(codecs.BOM_UTF8)
+        if has_bom:
+            line1 = line1[len(codecs.BOM_UTF8):]
+
+        m = PYTHON_MAGIC_COMMENT_re.match(line1)
+        if not m:
+            try:
+                import parser
+                parser.suite(line1)
+            except (ImportError, SyntaxError):
+                # Either it's a real syntax error, in which case the source is
+                # not valid python source, or line2 is a continuation of line1,
+                # in which case we don't want to scan line2 for a magic
+                # comment.
+                pass
+            else:
+                line2 = fp.readline()
+                m = PYTHON_MAGIC_COMMENT_re.match(line2)
+
+        if has_bom:
+            if m:
+                raise SyntaxError(
+                    "python refuses to compile code with both a UTF8 "
+                    "byte-order-mark and a magic encoding comment")
+            return 'utf_8'
+        elif m:
+            return m.group(1)
+        else:
+            return None
+    finally:
+        fp.seek(pos)
+
+def pathmatch(pattern, filename):
+    """Extended pathname pattern matching.
+    
+    This function is similar to what is provided by the ``fnmatch`` module in
+    the Python standard library, but:
+    
+     * can match complete (relative or absolute) path names, and not just file
+       names, and
+     * also supports a convenience pattern ("**") to match files at any
+       directory level.
+    
+    Examples:
+    
+    >>> pathmatch('**.py', 'bar.py')
+    True
+    >>> pathmatch('**.py', 'foo/bar/baz.py')
+    True
+    >>> pathmatch('**.py', 'templates/index.html')
+    False
+    
+    >>> pathmatch('**/templates/*.html', 'templates/index.html')
+    True
+    >>> pathmatch('**/templates/*.html', 'templates/foo/bar.html')
+    False
+    
+    :param pattern: the glob pattern
+    :param filename: the path name of the file to match against
+    :return: `True` if the path name matches the pattern, `False` otherwise
+    :rtype: `bool`
+    """
+    symbols = {
+        '?':   '[^/]',
+        '?/':  '[^/]/',
+        '*':   '[^/]+',
+        '*/':  '[^/]+/',
+        '**/': '(?:.+/)*?',
+        '**':  '(?:.+/)*?[^/]+',
+    }
+    buf = []
+    for idx, part in enumerate(re.split('([?*]+/?)', pattern)):
+        if idx % 2:
+            buf.append(symbols[part])
+        elif part:
+            buf.append(re.escape(part))
+    match = re.match(''.join(buf) + '$', filename.replace(os.sep, '/'))
+    return match is not None
+
+
+class TextWrapper(textwrap.TextWrapper):
+    wordsep_re = re.compile(
+        r'(\s+|'                                  # any whitespace
+        r'(?<=[\w\!\"\'\&\.\,\?])-{2,}(?=\w))'    # em-dash
+    )
+
+
+def wraptext(text, width=70, initial_indent='', subsequent_indent=''):
+    """Simple wrapper around the ``textwrap.wrap`` function in the standard
+    library. This version does not wrap lines on hyphens in words.
+    
+    :param text: the text to wrap
+    :param width: the maximum line width
+    :param initial_indent: string that will be prepended to the first line of
+                           wrapped output
+    :param subsequent_indent: string that will be prepended to all lines save
+                              the first of wrapped output
+    :return: a list of lines
+    :rtype: `list`
+    """
+    wrapper = TextWrapper(width=width, initial_indent=initial_indent,
+                          subsequent_indent=subsequent_indent,
+                          break_long_words=False)
+    return wrapper.wrap(text)
+
+
+class odict(dict):
+    """Ordered dict implementation.
+    
+    :see: http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/107747
+    """
+    def __init__(self, data=None):
+        dict.__init__(self, data or {})
+        self._keys = dict.keys(self)
+
+    def __delitem__(self, key):
+        dict.__delitem__(self, key)
+        self._keys.remove(key)
+
+    def __setitem__(self, key, item):
+        dict.__setitem__(self, key, item)
+        if key not in self._keys:
+            self._keys.append(key)
+
+    def __iter__(self):
+        return iter(self._keys)
+    iterkeys = __iter__
+
+    def clear(self):
+        dict.clear(self)
+        self._keys = []
+
+    def copy(self):
+        d = odict()
+        d.update(self)
+        return d
+
+    def items(self):
+        return zip(self._keys, self.values())
+
+    def iteritems(self):
+        return izip(self._keys, self.itervalues())
+
+    def keys(self):
+        return self._keys[:]
+
+    def pop(self, key, default=missing):
+        if default is missing:
+            return dict.pop(self, key)
+        elif key not in self:
+            return default
+        self._keys.remove(key)
+        return dict.pop(self, key, default)
+
+    def popitem(self, key):
+        self._keys.remove(key)
+        return dict.popitem(key)
+
+    def setdefault(self, key, failobj = None):
+        dict.setdefault(self, key, failobj)
+        if key not in self._keys:
+            self._keys.append(key)
+
+    def update(self, dict):
+        for (key, val) in dict.items():
+            self[key] = val
+
+    def values(self):
+        return map(self.get, self._keys)
+
+    def itervalues(self):
+        return imap(self.get, self._keys)
+
+
+try:
+    relpath = os.path.relpath
+except AttributeError:
+    def relpath(path, start='.'):
+        """Compute the relative path to one path from another.
+        
+        >>> relpath('foo/bar.txt', '').replace(os.sep, '/')
+        'foo/bar.txt'
+        >>> relpath('foo/bar.txt', 'foo').replace(os.sep, '/')
+        'bar.txt'
+        >>> relpath('foo/bar.txt', 'baz').replace(os.sep, '/')
+        '../foo/bar.txt'
+        
+        :return: the relative path
+        :rtype: `basestring`
+        """
+        start_list = os.path.abspath(start).split(os.sep)
+        path_list = os.path.abspath(path).split(os.sep)
+
+        # Work out how much of the filepath is shared by start and path.
+        i = len(os.path.commonprefix([start_list, path_list]))
+
+        rel_list = [os.path.pardir] * (len(start_list) - i) + path_list[i:]
+        return os.path.join(*rel_list)
+
+ZERO = timedelta(0)
+
+
+class FixedOffsetTimezone(tzinfo):
+    """Fixed offset in minutes east from UTC."""
+
+    def __init__(self, offset, name=None):
+        self._offset = timedelta(minutes=offset)
+        if name is None:
+            name = 'Etc/GMT+%d' % offset
+        self.zone = name
+
+    def __str__(self):
+        return self.zone
+
+    def __repr__(self):
+        return '<FixedOffset "%s" %s>' % (self.zone, self._offset)
+
+    def utcoffset(self, dt):
+        return self._offset
+
+    def tzname(self, dt):
+        return self.zone
+
+    def dst(self, dt):
+        return ZERO
+
+
+try:
+    from pytz import UTC
+except ImportError:
+    UTC = FixedOffsetTimezone(0, 'UTC')
+    """`tzinfo` object for UTC (Universal Time).
+    
+    :type: `tzinfo`
+    """
+
+STDOFFSET = timedelta(seconds = -time.timezone)
+if time.daylight:
+    DSTOFFSET = timedelta(seconds = -time.altzone)
+else:
+    DSTOFFSET = STDOFFSET
+
+DSTDIFF = DSTOFFSET - STDOFFSET
+
+
+class LocalTimezone(tzinfo):
+
+    def utcoffset(self, dt):
+        if self._isdst(dt):
+            return DSTOFFSET
+        else:
+            return STDOFFSET
+
+    def dst(self, dt):
+        if self._isdst(dt):
+            return DSTDIFF
+        else:
+            return ZERO
+
+    def tzname(self, dt):
+        return time.tzname[self._isdst(dt)]
+
+    def _isdst(self, dt):
+        tt = (dt.year, dt.month, dt.day,
+              dt.hour, dt.minute, dt.second,
+              dt.weekday(), 0, -1)
+        stamp = time.mktime(tt)
+        tt = time.localtime(stamp)
+        return tt.tm_isdst > 0
+
+
+LOCALTZ = LocalTimezone()
+"""`tzinfo` object for local time-zone.
+
+:type: `tzinfo`
+"""
Index: /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/babel/__init__.py
===================================================================
--- /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/babel/__init__.py (revision 3)
+++ /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/babel/__init__.py (revision 3)
@@ -0,0 +1,39 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007-2008 Edgewall Software
+# All rights reserved.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at http://babel.edgewall.org/wiki/License.
+#
+# This software consists of voluntary contributions made by many
+# individuals. For the exact contribution history, see the revision
+# history and logs, available at http://babel.edgewall.org/log/.
+
+"""Integrated collection of utilities that assist in internationalizing and
+localizing applications.
+
+This package is basically composed of two major parts:
+
+ * tools to build and work with ``gettext`` message catalogs
+ * a Python interface to the CLDR (Common Locale Data Repository), providing
+   access to various locale display names, localized number and date
+   formatting, etc.
+
+:see: http://www.gnu.org/software/gettext/
+:see: http://docs.python.org/lib/module-gettext.html
+:see: http://www.unicode.org/cldr/
+"""
+
+from babel.core import *
+
+__docformat__ = 'restructuredtext en'
+try:
+    from pkg_resources import get_distribution, ResolutionError
+    try:
+        __version__ = get_distribution('Babel').version
+    except ResolutionError:
+        __version__ = None # unknown
+except ImportError:
+    __version__ = None # unknown
Index: /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/babel/dates.py
===================================================================
--- /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/babel/dates.py (revision 3)
+++ /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/babel/dates.py (revision 3)
@@ -0,0 +1,991 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007 Edgewall Software
+# All rights reserved.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at http://babel.edgewall.org/wiki/License.
+#
+# This software consists of voluntary contributions made by many
+# individuals. For the exact contribution history, see the revision
+# history and logs, available at http://babel.edgewall.org/log/.
+
+"""Locale dependent formatting and parsing of dates and times.
+
+The default locale for the functions in this module is determined by the
+following environment variables, in that order:
+
+ * ``LC_TIME``,
+ * ``LC_ALL``, and
+ * ``LANG``
+"""
+
+from datetime import date, datetime, time, timedelta, tzinfo
+import re
+
+from babel.core import default_locale, get_global, Locale
+from babel.util import UTC
+
+__all__ = ['format_date', 'format_datetime', 'format_time',
+           'get_timezone_name', 'parse_date', 'parse_datetime', 'parse_time']
+__docformat__ = 'restructuredtext en'
+
+LC_TIME = default_locale('LC_TIME')
+
+# Aliases for use in scopes where the modules are shadowed by local variables
+date_ = date
+datetime_ = datetime
+time_ = time
+
+def get_period_names(locale=LC_TIME):
+    """Return the names for day periods (AM/PM) used by the locale.
+    
+    >>> get_period_names(locale='en_US')['am']
+    u'AM'
+    
+    :param locale: the `Locale` object, or a locale string
+    :return: the dictionary of period names
+    :rtype: `dict`
+    """
+    return Locale.parse(locale).periods
+
+def get_day_names(width='wide', context='format', locale=LC_TIME):
+    """Return the day names used by the locale for the specified format.
+    
+    >>> get_day_names('wide', locale='en_US')[1]
+    u'Tuesday'
+    >>> get_day_names('abbreviated', locale='es')[1]
+    u'mar'
+    >>> get_day_names('narrow', context='stand-alone', locale='de_DE')[1]
+    u'D'
+    
+    :param width: the width to use, one of "wide", "abbreviated", or "narrow"
+    :param context: the context, either "format" or "stand-alone"
+    :param locale: the `Locale` object, or a locale string
+    :return: the dictionary of day names
+    :rtype: `dict`
+    """
+    return Locale.parse(locale).days[context][width]
+
+def get_month_names(width='wide', context='format', locale=LC_TIME):
+    """Return the month names used by the locale for the specified format.
+    
+    >>> get_month_names('wide', locale='en_US')[1]
+    u'January'
+    >>> get_month_names('abbreviated', locale='es')[1]
+    u'ene'
+    >>> get_month_names('narrow', context='stand-alone', locale='de_DE')[1]
+    u'J'
+    
+    :param width: the width to use, one of "wide", "abbreviated", or "narrow"
+    :param context: the context, either "format" or "stand-alone"
+    :param locale: the `Locale` object, or a locale string
+    :return: the dictionary of month names
+    :rtype: `dict`
+    """
+    return Locale.parse(locale).months[context][width]
+
+def get_quarter_names(width='wide', context='format', locale=LC_TIME):
+    """Return the quarter names used by the locale for the specified format.
+    
+    >>> get_quarter_names('wide', locale='en_US')[1]
+    u'1st quarter'
+    >>> get_quarter_names('abbreviated', locale='de_DE')[1]
+    u'Q1'
+    
+    :param width: the width to use, one of "wide", "abbreviated", or "narrow"
+    :param context: the context, either "format" or "stand-alone"
+    :param locale: the `Locale` object, or a locale string
+    :return: the dictionary of quarter names
+    :rtype: `dict`
+    """
+    return Locale.parse(locale).quarters[context][width]
+
+def get_era_names(width='wide', locale=LC_TIME):
+    """Return the era names used by the locale for the specified format.
+    
+    >>> get_era_names('wide', locale='en_US')[1]
+    u'Anno Domini'
+    >>> get_era_names('abbreviated', locale='de_DE')[1]
+    u'n. Chr.'
+    
+    :param width: the width to use, either "wide", "abbreviated", or "narrow"
+    :param locale: the `Locale` object, or a locale string
+    :return: the dictionary of era names
+    :rtype: `dict`
+    """
+    return Locale.parse(locale).eras[width]
+
+def get_date_format(format='medium', locale=LC_TIME):
+    """Return the date formatting patterns used by the locale for the specified
+    format.
+    
+    >>> get_date_format(locale='en_US')
+    <DateTimePattern u'MMM d, yyyy'>
+    >>> get_date_format('full', locale='de_DE')
+    <DateTimePattern u'EEEE, d. MMMM yyyy'>
+    
+    :param format: the format to use, one of "full", "long", "medium", or
+                   "short"
+    :param locale: the `Locale` object, or a locale string
+    :return: the date format pattern
+    :rtype: `DateTimePattern`
+    """
+    return Locale.parse(locale).date_formats[format]
+
+def get_datetime_format(format='medium', locale=LC_TIME):
+    """Return the datetime formatting patterns used by the locale for the
+    specified format.
+    
+    >>> get_datetime_format(locale='en_US')
+    u'{1} {0}'
+    
+    :param format: the format to use, one of "full", "long", "medium", or
+                   "short"
+    :param locale: the `Locale` object, or a locale string
+    :return: the datetime format pattern
+    :rtype: `unicode`
+    """
+    patterns = Locale.parse(locale).datetime_formats
+    if format not in patterns:
+        format = None
+    return patterns[format]
+
+def get_time_format(format='medium', locale=LC_TIME):
+    """Return the time formatting patterns used by the locale for the specified
+    format.
+    
+    >>> get_time_format(locale='en_US')
+    <DateTimePattern u'h:mm:ss a'>
+    >>> get_time_format('full', locale='de_DE')
+    <DateTimePattern u'HH:mm:ss v'>
+    
+    :param format: the format to use, one of "full", "long", "medium", or
+                   "short"
+    :param locale: the `Locale` object, or a locale string
+    :return: the time format pattern
+    :rtype: `DateTimePattern`
+    """
+    return Locale.parse(locale).time_formats[format]
+
+def get_timezone_gmt(datetime=None, width='long', locale=LC_TIME):
+    """Return the timezone associated with the given `datetime` object formatted
+    as string indicating the offset from GMT.
+    
+    >>> dt = datetime(2007, 4, 1, 15, 30)
+    >>> get_timezone_gmt(dt, locale='en')
+    u'GMT+00:00'
+    
+    >>> from pytz import timezone
+    >>> tz = timezone('America/Los_Angeles')
+    >>> dt = datetime(2007, 4, 1, 15, 30, tzinfo=tz)
+    >>> get_timezone_gmt(dt, locale='en')
+    u'GMT-08:00'
+    >>> get_timezone_gmt(dt, 'short', locale='en')
+    u'-0800'
+    
+    The long format depends on the locale, for example in France the acronym
+    UTC string is used instead of GMT:
+    
+    >>> get_timezone_gmt(dt, 'long', locale='fr_FR')
+    u'UTC-08:00'
+    
+    :param datetime: the ``datetime`` object; if `None`, the current date and
+                     time in UTC is used
+    :param width: either "long" or "short"
+    :param locale: the `Locale` object, or a locale string
+    :return: the GMT offset representation of the timezone
+    :rtype: `unicode`
+    :since: version 0.9
+    """
+    if datetime is None:
+        datetime = datetime_.utcnow()
+    elif isinstance(datetime, (int, long)):
+        datetime = datetime_.utcfromtimestamp(datetime).time()
+    if datetime.tzinfo is None:
+        datetime = datetime.replace(tzinfo=UTC)
+    locale = Locale.parse(locale)
+
+    offset = datetime.utcoffset()
+    seconds = offset.days * 24 * 60 * 60 + offset.seconds
+    hours, seconds = divmod(seconds, 3600)
+    if width == 'short':
+        pattern = u'%+03d%02d'
+    else:
+        pattern = locale.zone_formats['gmt'] % '%+03d:%02d'
+    return pattern % (hours, seconds // 60)
+
+def get_timezone_location(dt_or_tzinfo=None, locale=LC_TIME):
+    """Return a representation of the given timezone using "location format".
+    
+    The result depends on both the local display name of the country and the
+    city assocaited with the time zone:
+    
+    >>> from pytz import timezone
+    >>> tz = timezone('America/St_Johns')
+    >>> get_timezone_location(tz, locale='de_DE')
+    u"Kanada (St. John's)"
+    >>> tz = timezone('America/Mexico_City')
+    >>> get_timezone_location(tz, locale='de_DE')
+    u'Mexiko (Mexiko-Stadt)'
+    
+    If the timezone is associated with a country that uses only a single
+    timezone, just the localized country name is returned:
+    
+    >>> tz = timezone('Europe/Berlin')
+    >>> get_timezone_name(tz, locale='de_DE')
+    u'Deutschland'
+    
+    :param dt_or_tzinfo: the ``datetime`` or ``tzinfo`` object that determines
+                         the timezone; if `None`, the current date and time in
+                         UTC is assumed
+    :param locale: the `Locale` object, or a locale string
+    :return: the localized timezone name using location format
+    :rtype: `unicode`
+    :since: version 0.9
+    """
+    if dt_or_tzinfo is None or isinstance(dt_or_tzinfo, (int, long)):
+        dt = None
+        tzinfo = UTC
+    elif isinstance(dt_or_tzinfo, (datetime, time)):
+        dt = dt_or_tzinfo
+        if dt.tzinfo is not None:
+            tzinfo = dt.tzinfo
+        else:
+            tzinfo = UTC
+    else:
+        dt = None
+        tzinfo = dt_or_tzinfo
+    locale = Locale.parse(locale)
+
+    if hasattr(tzinfo, 'zone'):
+        zone = tzinfo.zone
+    else:
+        zone = tzinfo.tzname(dt or datetime.utcnow())
+
+    # Get the canonical time-zone code
+    zone = get_global('zone_aliases').get(zone, zone)
+
+    info = locale.time_zones.get(zone, {})
+
+    # Otherwise, if there is only one timezone for the country, return the
+    # localized country name
+    region_format = locale.zone_formats['region']
+    territory = get_global('zone_territories').get(zone)
+    if territory not in locale.territories:
+        territory = 'ZZ' # invalid/unknown
+    territory_name = locale.territories[territory]
+    if territory and len(get_global('territory_zones').get(territory, [])) == 1:
+        return region_format % (territory_name)
+
+    # Otherwise, include the city in the output
+    fallback_format = locale.zone_formats['fallback']
+    if 'city' in info:
+        city_name = info['city']
+    else:
+        metazone = get_global('meta_zones').get(zone)
+        metazone_info = locale.meta_zones.get(metazone, {})
+        if 'city' in metazone_info:
+            city_name = metainfo['city']
+        elif '/' in zone:
+            city_name = zone.split('/', 1)[1].replace('_', ' ')
+        else:
+            city_name = zone.replace('_', ' ')
+
+    return region_format % (fallback_format % {
+        '0': city_name,
+        '1': territory_name
+    })
+
+def get_timezone_name(dt_or_tzinfo=None, width='long', uncommon=False,
+                      locale=LC_TIME):
+    r"""Return the localized display name for the given timezone. The timezone
+    may be specified using a ``datetime`` or `tzinfo` object.
+    
+    >>> from pytz import timezone
+    >>> dt = time(15, 30, tzinfo=timezone('America/Los_Angeles'))
+    >>> get_timezone_name(dt, locale='en_US')
+    u'Pacific Standard Time'
+    >>> get_timezone_name(dt, width='short', locale='en_US')
+    u'PST'
+    
+    If this function gets passed only a `tzinfo` object and no concrete
+    `datetime`,  the returned display name is indenpendent of daylight savings
+    time. This can be used for example for selecting timezones, or to set the
+    time of events that recur across DST changes:
+    
+    >>> tz = timezone('America/Los_Angeles')
+    >>> get_timezone_name(tz, locale='en_US')
+    u'Pacific Time'
+    >>> get_timezone_name(tz, 'short', locale='en_US')
+    u'PT'
+    
+    If no localized display name for the timezone is available, and the timezone
+    is associated with a country that uses only a single timezone, the name of
+    that country is returned, formatted according to the locale:
+    
+    >>> tz = timezone('Europe/Berlin')
+    >>> get_timezone_name(tz, locale='de_DE')
+    u'Deutschland'
+    >>> get_timezone_name(tz, locale='pt_BR')
+    u'Hor\xe1rio Alemanha'
+    
+    On the other hand, if the country uses multiple timezones, the city is also
+    included in the representation:
+    
+    >>> tz = timezone('America/St_Johns')
+    >>> get_timezone_name(tz, locale='de_DE')
+    u"Kanada (St. John's)"
+    
+    The `uncommon` parameter can be set to `True` to enable the use of timezone
+    representations that are not commonly used by the requested locale. For
+    example, while in frensh the central europian timezone is usually
+    abbreviated as "HEC", in Canadian French, this abbreviation is not in
+    common use, so a generic name would be chosen by default:
+    
+    >>> tz = timezone('Europe/Paris')
+    >>> get_timezone_name(tz, 'short', locale='fr_CA')
+    u'France'
+    >>> get_timezone_name(tz, 'short', uncommon=True, locale='fr_CA')
+    u'HEC'
+    
+    :param dt_or_tzinfo: the ``datetime`` or ``tzinfo`` object that determines
+                         the timezone; if a ``tzinfo`` object is used, the
+                         resulting display name will be generic, i.e.
+                         independent of daylight savings time; if `None`, the
+                         current date in UTC is assumed
+    :param width: either "long" or "short"
+    :param uncommon: whether even uncommon timezone abbreviations should be used
+    :param locale: the `Locale` object, or a locale string
+    :return: the timezone display name
+    :rtype: `unicode`
+    :since: version 0.9
+    :see:  `LDML Appendix J: Time Zone Display Names
+            <http://www.unicode.org/reports/tr35/#Time_Zone_Fallback>`_
+    """
+    if dt_or_tzinfo is None or isinstance(dt_or_tzinfo, (int, long)):
+        dt = None
+        tzinfo = UTC
+    elif isinstance(dt_or_tzinfo, (datetime, time)):
+        dt = dt_or_tzinfo
+        if dt.tzinfo is not None:
+            tzinfo = dt.tzinfo
+        else:
+            tzinfo = UTC
+    else:
+        dt = None
+        tzinfo = dt_or_tzinfo
+    locale = Locale.parse(locale)
+
+    if hasattr(tzinfo, 'zone'):
+        zone = tzinfo.zone
+    else:
+        zone = tzinfo.tzname(dt)
+
+    # Get the canonical time-zone code
+    zone = get_global('zone_aliases').get(zone, zone)
+
+    info = locale.time_zones.get(zone, {})
+    # Try explicitly translated zone names first
+    if width in info:
+        if dt is None:
+            field = 'generic'
+        else:
+            dst = tzinfo.dst(dt)
+            if dst is None:
+                field = 'generic'
+            elif dst == 0:
+                field = 'standard'
+            else:
+                field = 'daylight'
+        if field in info[width]:
+            return info[width][field]
+
+    metazone = get_global('meta_zones').get(zone)
+    if metazone:
+        metazone_info = locale.meta_zones.get(metazone, {})
+        if width in metazone_info and (uncommon or metazone_info.get('common')):
+            if dt is None:
+                field = 'generic'
+            else:
+                field = tzinfo.dst(dt) and 'daylight' or 'standard'
+            if field in metazone_info[width]:
+                return metazone_info[width][field]
+
+    # If we have a concrete datetime, we assume that the result can't be
+    # independent of daylight savings time, so we return the GMT offset
+    if dt is not None:
+        return get_timezone_gmt(dt, width=width, locale=locale)
+
+    return get_timezone_location(dt_or_tzinfo, locale=locale)
+
+def format_date(date=None, format='medium', locale=LC_TIME):
+    """Return a date formatted according to the given pattern.
+    
+    >>> d = date(2007, 04, 01)
+    >>> format_date(d, locale='en_US')
+    u'Apr 1, 2007'
+    >>> format_date(d, format='full', locale='de_DE')
+    u'Sonntag, 1. April 2007'
+    
+    If you don't want to use the locale default formats, you can specify a
+    custom date pattern:
+    
+    >>> format_date(d, "EEE, MMM d, ''yy", locale='en')
+    u"Sun, Apr 1, '07"
+    
+    :param date: the ``date`` or ``datetime`` object; if `None`, the current
+                 date is used
+    :param format: one of "full", "long", "medium", or "short", or a custom
+                   date/time pattern
+    :param locale: a `Locale` object or a locale identifier
+    :rtype: `unicode`
+    
+    :note: If the pattern contains time fields, an `AttributeError` will be
+           raised when trying to apply the formatting. This is also true if
+           the value of ``date`` parameter is actually a ``datetime`` object,
+           as this function automatically converts that to a ``date``.
+    """
+    if date is None:
+        date = date_.today()
+    elif isinstance(date, datetime):
+        date = date.date()
+
+    locale = Locale.parse(locale)
+    if format in ('full', 'long', 'medium', 'short'):
+        format = get_date_format(format, locale=locale)
+    pattern = parse_pattern(format)
+    return parse_pattern(format).apply(date, locale)
+
+def format_datetime(datetime=None, format='medium', tzinfo=None,
+                    locale=LC_TIME):
+    """Return a date formatted according to the given pattern.
+    
+    >>> dt = datetime(2007, 04, 01, 15, 30)
+    >>> format_datetime(dt, locale='en_US')
+    u'Apr 1, 2007 3:30:00 PM'
+    
+    For any pattern requiring the display of the time-zone, the third-party
+    ``pytz`` package is needed to explicitly specify the time-zone:
+    
+    >>> from pytz import timezone
+    >>> format_datetime(dt, 'full', tzinfo=timezone('Europe/Paris'),
+    ...                 locale='fr_FR')
+    u'dimanche 1 avril 2007 17:30:00 HEC'
+    >>> format_datetime(dt, "yyyy.MM.dd G 'at' HH:mm:ss zzz",
+    ...                 tzinfo=timezone('US/Eastern'), locale='en')
+    u'2007.04.01 AD at 11:30:00 EDT'
+    
+    :param datetime: the `datetime` object; if `None`, the current date and
+                     time is used
+    :param format: one of "full", "long", "medium", or "short", or a custom
+                   date/time pattern
+    :param tzinfo: the timezone to apply to the time for display
+    :param locale: a `Locale` object or a locale identifier
+    :rtype: `unicode`
+    """
+    if datetime is None:
+        datetime = datetime_.utcnow()
+    elif isinstance(datetime, (int, long)):
+        datetime = datetime_.utcfromtimestamp(datetime)
+    elif isinstance(datetime, time):
+        datetime = datetime_.combine(date.today(), datetime)
+    if datetime.tzinfo is None:
+        datetime = datetime.replace(tzinfo=UTC)
+    if tzinfo is not None:
+        datetime = datetime.astimezone(tzinfo)
+        if hasattr(tzinfo, 'normalize'): # pytz
+            datetime = tzinfo.normalize(datetime)
+
+    locale = Locale.parse(locale)
+    if format in ('full', 'long', 'medium', 'short'):
+        return get_datetime_format(format, locale=locale) \
+            .replace('{0}', format_time(datetime, format, tzinfo=None,
+                                        locale=locale)) \
+            .replace('{1}', format_date(datetime, format, locale=locale))
+    else:
+        return parse_pattern(format).apply(datetime, locale)
+
+def format_time(time=None, format='medium', tzinfo=None, locale=LC_TIME):
+    """Return a time formatted according to the given pattern.
+    
+    >>> t = time(15, 30)
+    >>> format_time(t, locale='en_US')
+    u'3:30:00 PM'
+    >>> format_time(t, format='short', locale='de_DE')
+    u'15:30'
+    
+    If you don't want to use the locale default formats, you can specify a
+    custom time pattern:
+    
+    >>> format_time(t, "hh 'o''clock' a", locale='en')
+    u"03 o'clock PM"
+    
+    For any pattern requiring the display of the time-zone, the third-party
+    ``pytz`` package is needed to explicitly specify the time-zone:
+    
+    >>> from pytz import timezone
+    >>> t = datetime(2007, 4, 1, 15, 30)
+    >>> tzinfo = timezone('Europe/Paris')
+    >>> t = tzinfo.localize(t)
+    >>> format_time(t, format='full', tzinfo=tzinfo, locale='fr_FR')
+    u'15:30:00 HEC'
+    >>> format_time(t, "hh 'o''clock' a, zzzz", tzinfo=timezone('US/Eastern'),
+    ...             locale='en')
+    u"09 o'clock AM, Eastern Daylight Time"
+    
+    As that example shows, when this function gets passed a
+    ``datetime.datetime`` value, the actual time in the formatted string is
+    adjusted to the timezone specified by the `tzinfo` parameter. If the
+    ``datetime`` is "naive" (i.e. it has no associated timezone information),
+    it is assumed to be in UTC.
+    
+    These timezone calculations are **not** performed if the value is of type
+    ``datetime.time``, as without date information there's no way to determine
+    what a given time would translate to in a different timezone without
+    information about whether daylight savings time is in effect or not. This
+    means that time values are left as-is, and the value of the `tzinfo`
+    parameter is only used to display the timezone name if needed:
+    
+    >>> t = time(15, 30)
+    >>> format_time(t, format='full', tzinfo=timezone('Europe/Paris'),
+    ...             locale='fr_FR')
+    u'15:30:00 HEC'
+    >>> format_time(t, format='full', tzinfo=timezone('US/Eastern'),
+    ...             locale='en_US')
+    u'3:30:00 PM ET'
+    
+    :param time: the ``time`` or ``datetime`` object; if `None`, the current
+                 time in UTC is used
+    :param format: one of "full", "long", "medium", or "short", or a custom
+                   date/time pattern
+    :param tzinfo: the time-zone to apply to the time for display
+    :param locale: a `Locale` object or a locale identifier
+    :rtype: `unicode`
+    
+    :note: If the pattern contains date fields, an `AttributeError` will be
+           raised when trying to apply the formatting. This is also true if
+           the value of ``time`` parameter is actually a ``datetime`` object,
+           as this function automatically converts that to a ``time``.
+    """
+    if time is None:
+        time = datetime.utcnow()
+    elif isinstance(time, (int, long)):
+        time = datetime.utcfromtimestamp(time)
+    if time.tzinfo is None:
+        time = time.replace(tzinfo=UTC)
+    if isinstance(time, datetime):
+        if tzinfo is not None:
+            time = time.astimezone(tzinfo)
+            if hasattr(tzinfo, 'localize'): # pytz
+                time = tzinfo.normalize(time)
+        time = time.timetz()
+    elif tzinfo is not None:
+        time = time.replace(tzinfo=tzinfo)
+
+    locale = Locale.parse(locale)
+    if format in ('full', 'long', 'medium', 'short'):
+        format = get_time_format(format, locale=locale)
+    return parse_pattern(format).apply(time, locale)
+
+def parse_date(string, locale=LC_TIME):
+    """Parse a date from a string.
+    
+    This function uses the date format for the locale as a hint to determine
+    the order in which the date fields appear in the string.
+    
+    >>> parse_date('4/1/04', locale='en_US')
+    datetime.date(2004, 4, 1)
+    >>> parse_date('01.04.2004', locale='de_DE')
+    datetime.date(2004, 4, 1)
+    
+    :param string: the string containing the date
+    :param locale: a `Locale` object or a locale identifier
+    :return: the parsed date
+    :rtype: `date`
+    """
+    # TODO: try ISO format first?
+    format = get_date_format(locale=locale).pattern.lower()
+    year_idx = format.index('y')
+    month_idx = format.index('m')
+    if month_idx < 0:
+        month_idx = format.index('l')
+    day_idx = format.index('d')
+
+    indexes = [(year_idx, 'Y'), (month_idx, 'M'), (day_idx, 'D')]
+    indexes.sort()
+    indexes = dict([(item[1], idx) for idx, item in enumerate(indexes)])
+
+    # FIXME: this currently only supports numbers, but should also support month
+    #        names, both in the requested locale, and english
+
+    numbers = re.findall('(\d+)', string)
+    year = numbers[indexes['Y']]
+    if len(year) == 2:
+        year = 2000 + int(year)
+    else:
+        year = int(year)
+    month = int(numbers[indexes['M']])
+    day = int(numbers[indexes['D']])
+    if month > 12:
+        month, day = day, month
+    return date(year, month, day)
+
+def parse_datetime(string, locale=LC_TIME):
+    """Parse a date and time from a string.
+    
+    This function uses the date and time formats for the locale as a hint to
+    determine the order in which the time fields appear in the string.
+    
+    :param string: the string containing the date and time
+    :param locale: a `Locale` object or a locale identifier
+    :return: the parsed date/time
+    :rtype: `datetime`
+    """
+    raise NotImplementedError
+
+def parse_time(string, locale=LC_TIME):
+    """Parse a time from a string.
+    
+    This function uses the time format for the locale as a hint to determine
+    the order in which the time fields appear in the string.
+    
+    >>> parse_time('15:30:00', locale='en_US')
+    datetime.time(15, 30)
+    
+    :param string: the string containing the time
+    :param locale: a `Locale` object or a locale identifier
+    :return: the parsed time
+    :rtype: `time`
+    """
+    # TODO: try ISO format first?
+    format = get_time_format(locale=locale).pattern.lower()
+    hour_idx = format.index('h')
+    if hour_idx < 0:
+        hour_idx = format.index('k')
+    min_idx = format.index('m')
+    sec_idx = format.index('s')
+
+    indexes = [(hour_idx, 'H'), (min_idx, 'M'), (sec_idx, 'S')]
+    indexes.sort()
+    indexes = dict([(item[1], idx) for idx, item in enumerate(indexes)])
+
+    # FIXME: support 12 hour clock, and 0-based hour specification
+    #        and seconds should be optional, maybe minutes too
+    #        oh, and time-zones, of course
+
+    numbers = re.findall('(\d+)', string)
+    hour = int(numbers[indexes['H']])
+    minute = int(numbers[indexes['M']])
+    second = int(numbers[indexes['S']])
+    return time(hour, minute, second)
+
+
+class DateTimePattern(object):
+
+    def __init__(self, pattern, format):
+        self.pattern = pattern
+        self.format = format
+
+    def __repr__(self):
+        return '<%s %r>' % (type(self).__name__, self.pattern)
+
+    def __unicode__(self):
+        return self.pattern
+
+    def __mod__(self, other):
+        assert type(other) is DateTimeFormat
+        return self.format % other
+
+    def apply(self, datetime, locale):
+        return self % DateTimeFormat(datetime, locale)
+
+
+class DateTimeFormat(object):
+
+    def __init__(self, value, locale):
+        assert isinstance(value, (date, datetime, time))
+        if isinstance(value, (datetime, time)) and value.tzinfo is None:
+            value = value.replace(tzinfo=UTC)
+        self.value = value
+        self.locale = Locale.parse(locale)
+
+    def __getitem__(self, name):
+        char = name[0]
+        num = len(name)
+        if char == 'G':
+            return self.format_era(char, num)
+        elif char in ('y', 'Y', 'u'):
+            return self.format_year(char, num)
+        elif char in ('Q', 'q'):
+            return self.format_quarter(char, num)
+        elif char in ('M', 'L'):
+            return self.format_month(char, num)
+        elif char in ('w', 'W'):
+            return self.format_week(char, num)
+        elif char == 'd':
+            return self.format(self.value.day, num)
+        elif char == 'D':
+            return self.format_day_of_year(num)
+        elif char == 'F':
+            return self.format_day_of_week_in_month()
+        elif char in ('E', 'e', 'c'):
+            return self.format_weekday(char, num)
+        elif char == 'a':
+            return self.format_period(char)
+        elif char == 'h':
+            if self.value.hour % 12 == 0:
+                return self.format(12, num)
+            else:
+                return self.format(self.value.hour % 12, num)
+        elif char == 'H':
+            return self.format(self.value.hour, num)
+        elif char == 'K':
+            return self.format(self.value.hour % 12, num)
+        elif char == 'k':
+            if self.value.hour == 0:
+                return self.format(24, num)
+            else:
+                return self.format(self.value.hour, num)
+        elif char == 'm':
+            return self.format(self.value.minute, num)
+        elif char == 's':
+            return self.format(self.value.second, num)
+        elif char == 'S':
+            return self.format_frac_seconds(num)
+        elif char == 'A':
+            return self.format_milliseconds_in_day(num)
+        elif char in ('z', 'Z', 'v', 'V'):
+            return self.format_timezone(char, num)
+        else:
+            raise KeyError('Unsupported date/time field %r' % char)
+
+    def format_era(self, char, num):
+        width = {3: 'abbreviated', 4: 'wide', 5: 'narrow'}[max(3, num)]
+        era = int(self.value.year >= 0)
+        return get_era_names(width, self.locale)[era]
+
+    def format_year(self, char, num):
+        value = self.value.year
+        if char.isupper():
+            week = self.get_week_number(self.get_day_of_year())
+            if week == 0:
+                value -= 1
+        year = self.format(value, num)
+        if num == 2:
+            year = year[-2:]
+        return year
+
+    def format_quarter(self, char, num):
+        quarter = (self.value.month - 1) // 3 + 1
+        if num <= 2:
+            return ('%%0%dd' % num) % quarter
+        width = {3: 'abbreviated', 4: 'wide', 5: 'narrow'}[num]
+        context = {'Q': 'format', 'q': 'stand-alone'}[char]
+        return get_quarter_names(width, context, self.locale)[quarter]
+
+    def format_month(self, char, num):
+        if num <= 2:
+            return ('%%0%dd' % num) % self.value.month
+        width = {3: 'abbreviated', 4: 'wide', 5: 'narrow'}[num]
+        context = {'M': 'format', 'L': 'stand-alone'}[char]
+        return get_month_names(width, context, self.locale)[self.value.month]
+
+    def format_week(self, char, num):
+        if char.islower(): # week of year
+            day_of_year = self.get_day_of_year()
+            week = self.get_week_number(day_of_year)
+            if week == 0:
+                date = self.value - timedelta(days=day_of_year)
+                week = self.get_week_number(self.get_day_of_year(date),
+                                            date.weekday())
+            return self.format(week, num)
+        else: # week of month
+            week = self.get_week_number(self.value.day)
+            if week == 0:
+                date = self.value - timedelta(days=self.value.day)
+                week = self.get_week_number(date.day, date.weekday())
+                pass
+            return '%d' % week
+
+    def format_weekday(self, char, num):
+        if num < 3:
+            if char.islower():
+                value = 7 - self.locale.first_week_day + self.value.weekday()
+                return self.format(value % 7 + 1, num)
+            num = 3
+        weekday = self.value.weekday()
+        width = {3: 'abbreviated', 4: 'wide', 5: 'narrow'}[num]
+        context = {3: 'format', 4: 'format', 5: 'stand-alone'}[num]
+        return get_day_names(width, context, self.locale)[weekday]
+
+    def format_day_of_year(self, num):
+        return self.format(self.get_day_of_year(), num)
+
+    def format_day_of_week_in_month(self):
+        return '%d' % ((self.value.day - 1) / 7 + 1)
+
+    def format_period(self, char):
+        period = {0: 'am', 1: 'pm'}[int(self.value.hour >= 12)]
+        return get_period_names(locale=self.locale)[period]
+
+    def format_frac_seconds(self, num):
+        value = str(self.value.microsecond)
+        return self.format(round(float('.%s' % value), num) * 10**num, num)
+
+    def format_milliseconds_in_day(self, num):
+        msecs = self.value.microsecond // 1000 + self.value.second * 1000 + \
+                self.value.minute * 60000 + self.value.hour * 3600000
+        return self.format(msecs, num)
+
+    def format_timezone(self, char, num):
+        width = {3: 'short', 4: 'long'}[max(3, num)]
+        if char == 'z':
+            return get_timezone_name(self.value, width, locale=self.locale)
+        elif char == 'Z':
+            return get_timezone_gmt(self.value, width, locale=self.locale)
+        elif char == 'v':
+            return get_timezone_name(self.value.tzinfo, width,
+                                     locale=self.locale)
+        elif char == 'V':
+            if num == 1:
+                return get_timezone_name(self.value.tzinfo, width,
+                                         uncommon=True, locale=self.locale)
+            return get_timezone_location(self.value.tzinfo, locale=self.locale)
+
+    def format(self, value, length):
+        return ('%%0%dd' % length) % value
+
+    def get_day_of_year(self, date=None):
+        if date is None:
+            date = self.value
+        return (date - date_(date.year, 1, 1)).days + 1
+
+    def get_week_number(self, day_of_period, day_of_week=None):
+        """Return the number of the week of a day within a period. This may be
+        the week number in a year or the week number in a month.
+        
+        Usually this will return a value equal to or greater than 1, but if the
+        first week of the period is so short that it actually counts as the last
+        week of the previous period, this function will return 0.
+        
+        >>> format = DateTimeFormat(date(2006, 1, 8), Locale.parse('de_DE'))
+        >>> format.get_week_number(6)
+        1
+        
+        >>> format = DateTimeFormat(date(2006, 1, 8), Locale.parse('en_US'))
+        >>> format.get_week_number(6)
+        2
+        
+        :param day_of_period: the number of the day in the period (usually
+                              either the day of month or the day of year)
+        :param day_of_week: the week day; if ommitted, the week day of the
+                            current date is assumed
+        """
+        if day_of_week is None:
+            day_of_week = self.value.weekday()
+        first_day = (day_of_week - self.locale.first_week_day -
+                     day_of_period + 1) % 7
+        if first_day < 0:
+            first_day += 7
+        week_number = (day_of_period + first_day - 1) / 7
+        if 7 - first_day >= self.locale.min_week_days:
+            week_number += 1
+        return week_number
+
+
+PATTERN_CHARS = {
+    'G': [1, 2, 3, 4, 5],                                           # era
+    'y': None, 'Y': None, 'u': None,                                # year
+    'Q': [1, 2, 3, 4], 'q': [1, 2, 3, 4],                           # quarter
+    'M': [1, 2, 3, 4, 5], 'L': [1, 2, 3, 4, 5],                     # month
+    'w': [1, 2], 'W': [1],                                          # week
+    'd': [1, 2], 'D': [1, 2, 3], 'F': [1], 'g': None,               # day
+    'E': [1, 2, 3, 4, 5], 'e': [1, 2, 3, 4, 5], 'c': [1, 3, 4, 5],  # week day
+    'a': [1],                                                       # period
+    'h': [1, 2], 'H': [1, 2], 'K': [1, 2], 'k': [1, 2],             # hour
+    'm': [1, 2],                                                    # minute
+    's': [1, 2], 'S': None, 'A': None,                              # second
+    'z': [1, 2, 3, 4], 'Z': [1, 2, 3, 4], 'v': [1, 4], 'V': [1, 4]  # zone
+}
+
+def parse_pattern(pattern):
+    """Parse date, time, and datetime format patterns.
+    
+    >>> parse_pattern("MMMMd").format
+    u'%(MMMM)s%(d)s'
+    >>> parse_pattern("MMM d, yyyy").format
+    u'%(MMM)s %(d)s, %(yyyy)s'
+    
+    Pattern can contain literal strings in single quotes:
+    
+    >>> parse_pattern("H:mm' Uhr 'z").format
+    u'%(H)s:%(mm)s Uhr %(z)s'
+    
+    An actual single quote can be used by using two adjacent single quote
+    characters:
+    
+    >>> parse_pattern("hh' o''clock'").format
+    u"%(hh)s o'clock"
+    
+    :param pattern: the formatting pattern to parse
+    """
+    if type(pattern) is DateTimePattern:
+        return pattern
+
+    result = []
+    quotebuf = None
+    charbuf = []
+    fieldchar = ['']
+    fieldnum = [0]
+
+    def append_chars():
+        result.append(''.join(charbuf).replace('%', '%%'))
+        del charbuf[:]
+
+    def append_field():
+        limit = PATTERN_CHARS[fieldchar[0]]
+        if limit and fieldnum[0] not in limit:
+            raise ValueError('Invalid length for field: %r'
+                             % (fieldchar[0] * fieldnum[0]))
+        result.append('%%(%s)s' % (fieldchar[0] * fieldnum[0]))
+        fieldchar[0] = ''
+        fieldnum[0] = 0
+
+    for idx, char in enumerate(pattern.replace("''", '\0')):
+        if quotebuf is None:
+            if char == "'": # quote started
+                if fieldchar[0]:
+                    append_field()
+                elif charbuf:
+                    append_chars()
+                quotebuf = []
+            elif char in PATTERN_CHARS:
+                if charbuf:
+                    append_chars()
+                if char == fieldchar[0]:
+                    fieldnum[0] += 1
+                else:
+                    if fieldchar[0]:
+                        append_field()
+                    fieldchar[0] = char
+                    fieldnum[0] = 1
+            else:
+                if fieldchar[0]:
+                    append_field()
+                charbuf.append(char)
+
+        elif quotebuf is not None:
+            if char == "'": # end of quote
+                charbuf.extend(quotebuf)
+                quotebuf = None
+            else: # inside quote
+                quotebuf.append(char)
+
+    if fieldchar[0]:
+        append_field()
+    elif charbuf:
+        append_chars()
+
+    return DateTimePattern(pattern, u''.join(result).replace('\0', "'"))
Index: /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/babel/messages/catalog.py
===================================================================
--- /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/babel/messages/catalog.py (revision 3)
+++ /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/babel/messages/catalog.py (revision 3)
@@ -0,0 +1,721 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007 Edgewall Software
+# All rights reserved.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at http://babel.edgewall.org/wiki/License.
+#
+# This software consists of voluntary contributions made by many
+# individuals. For the exact contribution history, see the revision
+# history and logs, available at http://babel.edgewall.org/log/.
+
+"""Data structures for message catalogs."""
+
+from cgi import parse_header
+from datetime import datetime
+from difflib import get_close_matches
+from email import message_from_string
+from copy import copy
+import re
+try:
+    set
+except NameError:
+    from sets import Set as set
+import time
+
+from babel import __version__ as VERSION
+from babel.core import Locale
+from babel.dates import format_datetime
+from babel.messages.plurals import get_plural
+from babel.util import odict, distinct, LOCALTZ, UTC, FixedOffsetTimezone
+
+__all__ = ['Message', 'Catalog', 'TranslationError']
+__docformat__ = 'restructuredtext en'
+
+
+PYTHON_FORMAT = re.compile(r'''(?x)
+    \%
+        (?:\(([\w]*)\))?
+        (
+            [-#0\ +]?(?:\*|[\d]+)?
+            (?:\.(?:\*|[\d]+))?
+            [hlL]?
+        )
+        ([diouxXeEfFgGcrs%])
+''')
+
+
+class Message(object):
+    """Representation of a single message in a catalog."""
+
+    def __init__(self, id, string=u'', locations=(), flags=(), auto_comments=(),
+                 user_comments=(), previous_id=(), lineno=None):
+        """Create the message object.
+
+        :param id: the message ID, or a ``(singular, plural)`` tuple for
+                   pluralizable messages
+        :param string: the translated message string, or a
+                       ``(singular, plural)`` tuple for pluralizable messages
+        :param locations: a sequence of ``(filenname, lineno)`` tuples
+        :param flags: a set or sequence of flags
+        :param auto_comments: a sequence of automatic comments for the message
+        :param user_comments: a sequence of user comments for the message
+        :param previous_id: the previous message ID, or a ``(singular, plural)``
+                            tuple for pluralizable messages
+        :param lineno: the line number on which the msgid line was found in the
+                       PO file, if any
+        """
+        self.id = id #: The message ID
+        if not string and self.pluralizable:
+            string = (u'', u'')
+        self.string = string #: The message translation
+        self.locations = list(distinct(locations))
+        self.flags = set(flags)
+        if id and self.python_format:
+            self.flags.add('python-format')
+        else:
+            self.flags.discard('python-format')
+        self.auto_comments = list(distinct(auto_comments))
+        self.user_comments = list(distinct(user_comments))
+        if isinstance(previous_id, basestring):
+            self.previous_id = [previous_id]
+        else:
+            self.previous_id = list(previous_id)
+        self.lineno = lineno
+
+    def __repr__(self):
+        return '<%s %r (flags: %r)>' % (type(self).__name__, self.id,
+                                        list(self.flags))
+
+    def __cmp__(self, obj):
+        """Compare Messages, taking into account plural ids"""
+        if isinstance(obj, Message):
+            plural = self.pluralizable
+            obj_plural = obj.pluralizable
+            if plural and obj_plural:
+                return cmp(self.id[0], obj.id[0])
+            elif plural:
+                return cmp(self.id[0], obj.id)
+            elif obj_plural:
+                return cmp(self.id, obj.id[0])
+        return cmp(self.id, obj.id)
+
+    def clone(self):
+        return Message(*map(copy, (self.id, self.string, self.locations,
+                                   self.flags, self.auto_comments,
+                                   self.user_comments, self.previous_id,
+                                   self.lineno)))
+
+    def check(self, catalog=None):
+        """Run various validation checks on the message.  Some validations
+        are only performed if the catalog is provided.  This method returns
+        a sequence of `TranslationError` objects.
+
+        :rtype: ``iterator``
+        :param catalog: A catalog instance that is passed to the checkers
+        :see: `Catalog.check` for a way to perform checks for all messages
+              in a catalog.
+        """
+        from babel.messages.checkers import checkers
+        errors = []
+        for checker in checkers:
+            try:
+                checker(catalog, self)
+            except TranslationError, e:
+                errors.append(e)
+        return errors
+
+    def fuzzy(self):
+        return 'fuzzy' in self.flags
+    fuzzy = property(fuzzy, doc="""\
+        Whether the translation is fuzzy.
+
+        >>> Message('foo').fuzzy
+        False
+        >>> msg = Message('foo', 'foo', flags=['fuzzy'])
+        >>> msg.fuzzy
+        True
+        >>> msg
+        <Message 'foo' (flags: ['fuzzy'])>
+
+        :type:  `bool`
+        """)
+
+    def pluralizable(self):
+        return isinstance(self.id, (list, tuple))
+    pluralizable = property(pluralizable, doc="""\
+        Whether the message is plurizable.
+
+        >>> Message('foo').pluralizable
+        False
+        >>> Message(('foo', 'bar')).pluralizable
+        True
+
+        :type:  `bool`
+        """)
+
+    def python_format(self):
+        ids = self.id
+        if not isinstance(ids, (list, tuple)):
+            ids = [ids]
+        return bool(filter(None, [PYTHON_FORMAT.search(id) for id in ids]))
+    python_format = property(python_format, doc="""\
+        Whether the message contains Python-style parameters.
+
+        >>> Message('foo %(name)s bar').python_format
+        True
+        >>> Message(('foo %(name)s', 'foo %(name)s')).python_format
+        True
+
+        :type:  `bool`
+        """)
+
+
+class TranslationError(Exception):
+    """Exception thrown by translation checkers when invalid message
+    translations are encountered."""
+
+
+DEFAULT_HEADER = u"""\
+# Translations template for PROJECT.
+# Copyright (C) YEAR ORGANIZATION
+# This file is distributed under the same license as the PROJECT project.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#"""
+
+
+class Catalog(object):
+    """Representation of a message catalog."""
+
+    def __init__(self, locale=None, domain=None, header_comment=DEFAULT_HEADER,
+                 project=None, version=None, copyright_holder=None,
+                 msgid_bugs_address=None, creation_date=None,
+                 revision_date=None, last_translator=None, language_team=None,
+                 charset='utf-8', fuzzy=True):
+        """Initialize the catalog object.
+
+        :param locale: the locale identifier or `Locale` object, or `None`
+                       if the catalog is not bound to a locale (which basically
+                       means it's a template)
+        :param domain: the message domain
+        :param header_comment: the header comment as string, or `None` for the
+                               default header
+        :param project: the project's name
+        :param version: the project's version
+        :param copyright_holder: the copyright holder of the catalog
+        :param msgid_bugs_address: the email address or URL to submit bug
+                                   reports to
+        :param creation_date: the date the catalog was created
+        :param revision_date: the date the catalog was revised
+        :param last_translator: the name and email of the last translator
+        :param language_team: the name and email of the language team
+        :param charset: the encoding to use in the output
+        :param fuzzy: the fuzzy bit on the catalog header
+        """
+        self.domain = domain #: The message domain
+        if locale:
+            locale = Locale.parse(locale)
+        self.locale = locale #: The locale or `None`
+        self._header_comment = header_comment
+        self._messages = odict()
+
+        self.project = project or 'PROJECT' #: The project name
+        self.version = version or 'VERSION' #: The project version
+        self.copyright_holder = copyright_holder or 'ORGANIZATION'
+        self.msgid_bugs_address = msgid_bugs_address or 'EMAIL@ADDRESS'
+
+        self.last_translator = last_translator or 'FULL NAME <EMAIL@ADDRESS>'
+        """Name and email address of the last translator."""
+        self.language_team = language_team or 'LANGUAGE <LL@li.org>'
+        """Name and email address of the language team."""
+
+        self.charset = charset or 'utf-8'
+
+        if creation_date is None:
+            creation_date = datetime.now(LOCALTZ)
+        elif isinstance(creation_date, datetime) and not creation_date.tzinfo:
+            creation_date = creation_date.replace(tzinfo=LOCALTZ)
+        self.creation_date = creation_date #: Creation date of the template
+        if revision_date is None:
+            revision_date = datetime.now(LOCALTZ)
+        elif isinstance(revision_date, datetime) and not revision_date.tzinfo:
+            revision_date = revision_date.replace(tzinfo=LOCALTZ)
+        self.revision_date = revision_date #: Last revision date of the catalog
+        self.fuzzy = fuzzy #: Catalog header fuzzy bit (`True` or `False`)
+
+        self.obsolete = odict() #: Dictionary of obsolete messages
+        self._num_plurals = None
+        self._plural_expr = None
+
+    def _get_header_comment(self):
+        comment = self._header_comment
+        comment = comment.replace('PROJECT', self.project) \
+                         .replace('VERSION', self.version) \
+                         .replace('YEAR', self.revision_date.strftime('%Y')) \
+                         .replace('ORGANIZATION', self.copyright_holder)
+        if self.locale:
+            comment = comment.replace('Translations template', '%s translations'
+                                      % self.locale.english_name)
+        return comment
+
+    def _set_header_comment(self, string):
+        self._header_comment = string
+
+    header_comment = property(_get_header_comment, _set_header_comment, doc="""\
+    The header comment for the catalog.
+
+    >>> catalog = Catalog(project='Foobar', version='1.0',
+    ...                   copyright_holder='Foo Company')
+    >>> print catalog.header_comment #doctest: +ELLIPSIS
+    # Translations template for Foobar.
+    # Copyright (C) ... Foo Company
+    # This file is distributed under the same license as the Foobar project.
+    # FIRST AUTHOR <EMAIL@ADDRESS>, ....
+    #
+
+    The header can also be set from a string. Any known upper-case variables
+    will be replaced when the header is retrieved again:
+
+    >>> catalog = Catalog(project='Foobar', version='1.0',
+    ...                   copyright_holder='Foo Company')
+    >>> catalog.header_comment = '''\\
+    ... # The POT for my really cool PROJECT project.
+    ... # Copyright (C) 1990-2003 ORGANIZATION
+    ... # This file is distributed under the same license as the PROJECT
+    ... # project.
+    ... #'''
+    >>> print catalog.header_comment
+    # The POT for my really cool Foobar project.
+    # Copyright (C) 1990-2003 Foo Company
+    # This file is distributed under the same license as the Foobar
+    # project.
+    #
+
+    :type: `unicode`
+    """)
+
+    def _get_mime_headers(self):
+        headers = []
+        headers.append(('Project-Id-Version',
+                        '%s %s' % (self.project, self.version)))
+        headers.append(('Report-Msgid-Bugs-To', self.msgid_bugs_address))
+        headers.append(('POT-Creation-Date',
+                        format_datetime(self.creation_date, 'yyyy-MM-dd HH:mmZ',
+                                        locale='en')))
+        if self.locale is None:
+            headers.append(('PO-Revision-Date', 'YEAR-MO-DA HO:MI+ZONE'))
+            headers.append(('Last-Translator', 'FULL NAME <EMAIL@ADDRESS>'))
+            headers.append(('Language-Team', 'LANGUAGE <LL@li.org>'))
+        else:
+            headers.append(('PO-Revision-Date',
+                            format_datetime(self.revision_date,
+                                            'yyyy-MM-dd HH:mmZ', locale='en')))
+            headers.append(('Last-Translator', self.last_translator))
+            headers.append(('Language-Team',
+                           self.language_team.replace('LANGUAGE',
+                                                      str(self.locale))))
+            headers.append(('Plural-Forms', self.plural_forms))
+        headers.append(('MIME-Version', '1.0'))
+        headers.append(('Content-Type',
+                        'text/plain; charset=%s' % self.charset))
+        headers.append(('Content-Transfer-Encoding', '8bit'))
+        headers.append(('Generated-By', 'Babel %s\n' % VERSION))
+        return headers
+
+    def _set_mime_headers(self, headers):
+        for name, value in headers:
+            if name.lower() == 'content-type':
+                mimetype, params = parse_header(value)
+                if 'charset' in params:
+                    self.charset = params['charset'].lower()
+                break
+        for name, value in headers:
+            name = name.lower().decode(self.charset)
+            value = value.decode(self.charset)
+            if name == 'project-id-version':
+                parts = value.split(' ')
+                self.project = u' '.join(parts[:-1])
+                self.version = parts[-1]
+            elif name == 'report-msgid-bugs-to':
+                self.msgid_bugs_address = value
+            elif name == 'last-translator':
+                self.last_translator = value
+            elif name == 'language-team':
+                self.language_team = value
+            elif name == 'plural-forms':
+                _, params = parse_header(' ;' + value)
+                self._num_plurals = int(params.get('nplurals', 2))
+                self._plural_expr = params.get('plural', '(n != 1)')
+            elif name == 'pot-creation-date':
+                # FIXME: this should use dates.parse_datetime as soon as that
+                #        is ready
+                value, tzoffset, _ = re.split('[+-](\d{4})$', value, 1)
+                tt = time.strptime(value, '%Y-%m-%d %H:%M')
+                ts = time.mktime(tt)
+                tzoffset = FixedOffsetTimezone(int(tzoffset[:2]) * 60 +
+                                               int(tzoffset[2:]))
+                dt = datetime.fromtimestamp(ts)
+                self.creation_date = dt.replace(tzinfo=tzoffset)
+
+    mime_headers = property(_get_mime_headers, _set_mime_headers, doc="""\
+    The MIME headers of the catalog, used for the special ``msgid ""`` entry.
+
+    The behavior of this property changes slightly depending on whether a locale
+    is set or not, the latter indicating that the catalog is actually a template
+    for actual translations.
+
+    Here's an example of the output for such a catalog template:
+
+    >>> created = datetime(1990, 4, 1, 15, 30, tzinfo=UTC)
+    >>> catalog = Catalog(project='Foobar', version='1.0',
+    ...                   creation_date=created)
+    >>> for name, value in catalog.mime_headers:
+    ...     print '%s: %s' % (name, value)
+    Project-Id-Version: Foobar 1.0
+    Report-Msgid-Bugs-To: EMAIL@ADDRESS
+    POT-Creation-Date: 1990-04-01 15:30+0000
+    PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE
+    Last-Translator: FULL NAME <EMAIL@ADDRESS>
+    Language-Team: LANGUAGE <LL@li.org>
+    MIME-Version: 1.0
+    Content-Type: text/plain; charset=utf-8
+    Content-Transfer-Encoding: 8bit
+    Generated-By: Babel ...
+
+    And here's an example of the output when the locale is set:
+
+    >>> revised = datetime(1990, 8, 3, 12, 0, tzinfo=UTC)
+    >>> catalog = Catalog(locale='de_DE', project='Foobar', version='1.0',
+    ...                   creation_date=created, revision_date=revised,
+    ...                   last_translator='John Doe <jd@example.com>',
+    ...                   language_team='de_DE <de@example.com>')
+    >>> for name, value in catalog.mime_headers:
+    ...     print '%s: %s' % (name, value)
+    Project-Id-Version: Foobar 1.0
+    Report-Msgid-Bugs-To: EMAIL@ADDRESS
+    POT-Creation-Date: 1990-04-01 15:30+0000
+    PO-Revision-Date: 1990-08-03 12:00+0000
+    Last-Translator: John Doe <jd@example.com>
+    Language-Team: de_DE <de@example.com>
+    Plural-Forms: nplurals=2; plural=(n != 1)
+    MIME-Version: 1.0
+    Content-Type: text/plain; charset=utf-8
+    Content-Transfer-Encoding: 8bit
+    Generated-By: Babel ...
+
+    :type: `list`
+    """)
+
+    def num_plurals(self):
+        if self._num_plurals is None:
+            num = 2
+            if self.locale:
+                num = get_plural(self.locale)[0]
+            self._num_plurals = num
+        return self._num_plurals
+    num_plurals = property(num_plurals, doc="""\
+    The number of plurals used by the catalog or locale.
+
+    >>> Catalog(locale='en').num_plurals
+    2
+    >>> Catalog(locale='ga').num_plurals
+    3
+
+    :type: `int`
+    """)
+
+    def plural_expr(self):
+        if self._plural_expr is None:
+            expr = '(n != 1)'
+            if self.locale:
+                expr = get_plural(self.locale)[1]
+            self._plural_expr = expr
+        return self._plural_expr
+    plural_expr = property(plural_expr, doc="""\
+    The plural expression used by the catalog or locale.
+
+    >>> Catalog(locale='en').plural_expr
+    '(n != 1)'
+    >>> Catalog(locale='ga').plural_expr
+    '(n==1 ? 0 : n==2 ? 1 : 2)'
+
+    :type: `basestring`
+    """)
+
+    def plural_forms(self):
+        return 'nplurals=%s; plural=%s' % (self.num_plurals, self.plural_expr)
+    plural_forms = property(plural_forms, doc="""\
+    Return the plural forms declaration for the locale.
+
+    >>> Catalog(locale='en').plural_forms
+    'nplurals=2; plural=(n != 1)'
+    >>> Catalog(locale='pt_BR').plural_forms
+    'nplurals=2; plural=(n > 1)'
+
+    :type: `str`
+    """)
+
+    def __contains__(self, id):
+        """Return whether the catalog has a message with the specified ID."""
+        return self._key_for(id) in self._messages
+
+    def __len__(self):
+        """The number of messages in the catalog.
+
+        This does not include the special ``msgid ""`` entry.
+        """
+        return len(self._messages)
+
+    def __iter__(self):
+        """Iterates through all the entries in the catalog, in the order they
+        were added, yielding a `Message` object for every entry.
+
+        :rtype: ``iterator``
+        """
+        buf = []
+        for name, value in self.mime_headers:
+            buf.append('%s: %s' % (name, value))
+        flags = set()
+        if self.fuzzy:
+            flags |= set(['fuzzy'])
+        yield Message(u'', '\n'.join(buf), flags=flags)
+        for key in self._messages:
+            yield self._messages[key]
+
+    def __repr__(self):
+        locale = ''
+        if self.locale:
+            locale = ' %s' % self.locale
+        return '<%s %r%s>' % (type(self).__name__, self.domain, locale)
+
+    def __delitem__(self, id):
+        """Delete the message with the specified ID."""
+        key = self._key_for(id)
+        if key in self._messages:
+            del self._messages[key]
+
+    def __getitem__(self, id):
+        """Return the message with the specified ID.
+
+        :param id: the message ID
+        :return: the message with the specified ID, or `None` if no such message
+                 is in the catalog
+        :rtype: `Message`
+        """
+        return self._messages.get(self._key_for(id))
+
+    def __setitem__(self, id, message):
+        """Add or update the message with the specified ID.
+
+        >>> catalog = Catalog()
+        >>> catalog[u'foo'] = Message(u'foo')
+        >>> catalog[u'foo']
+        <Message u'foo' (flags: [])>
+
+        If a message with that ID is already in the catalog, it is updated
+        to include the locations and flags of the new message.
+
+        >>> catalog = Catalog()
+        >>> catalog[u'foo'] = Message(u'foo', locations=[('main.py', 1)])
+        >>> catalog[u'foo'].locations
+        [('main.py', 1)]
+        >>> catalog[u'foo'] = Message(u'foo', locations=[('utils.py', 5)])
+        >>> catalog[u'foo'].locations
+        [('main.py', 1), ('utils.py', 5)]
+
+        :param id: the message ID
+        :param message: the `Message` object
+        """
+        assert isinstance(message, Message), 'expected a Message object'
+        key = self._key_for(id)
+        current = self._messages.get(key)
+        if current:
+            if message.pluralizable and not current.pluralizable:
+                # The new message adds pluralization
+                current.id = message.id
+                current.string = message.string
+            current.locations = list(distinct(current.locations +
+                                              message.locations))
+            current.auto_comments = list(distinct(current.auto_comments +
+                                                  message.auto_comments))
+            current.user_comments = list(distinct(current.user_comments +
+                                                  message.user_comments))
+            current.flags |= message.flags
+            message = current
+        elif id == '':
+            # special treatment for the header message
+            headers = message_from_string(message.string.encode(self.charset))
+            self.mime_headers = headers.items()
+            self.header_comment = '\n'.join(['# %s' % comment for comment
+                                             in message.user_comments])
+            self.fuzzy = message.fuzzy
+        else:
+            if isinstance(id, (list, tuple)):
+                assert isinstance(message.string, (list, tuple)), \
+                    'Expected sequence but got %s' % type(message.string)
+            self._messages[key] = message
+
+    def add(self, id, string=None, locations=(), flags=(), auto_comments=(),
+            user_comments=(), previous_id=(), lineno=None):
+        """Add or update the message with the specified ID.
+
+        >>> catalog = Catalog()
+        >>> catalog.add(u'foo')
+        >>> catalog[u'foo']
+        <Message u'foo' (flags: [])>
+
+        This method simply constructs a `Message` object with the given
+        arguments and invokes `__setitem__` with that object.
+
+        :param id: the message ID, or a ``(singular, plural)`` tuple for
+                   pluralizable messages
+        :param string: the translated message string, or a
+                       ``(singular, plural)`` tuple for pluralizable messages
+        :param locations: a sequence of ``(filenname, lineno)`` tuples
+        :param flags: a set or sequence of flags
+        :param auto_comments: a sequence of automatic comments
+        :param user_comments: a sequence of user comments
+        :param previous_id: the previous message ID, or a ``(singular, plural)``
+                            tuple for pluralizable messages
+        :param lineno: the line number on which the msgid line was found in the
+                       PO file, if any
+        """
+        self[id] = Message(id, string, list(locations), flags, auto_comments,
+                           user_comments, previous_id, lineno=lineno)
+
+    def check(self):
+        """Run various validation checks on the translations in the catalog.
+
+        For every message which fails validation, this method yield a
+        ``(message, errors)`` tuple, where ``message`` is the `Message` object
+        and ``errors`` is a sequence of `TranslationError` objects.
+
+        :rtype: ``iterator``
+        """
+        for message in self._messages.values():
+            errors = message.check(catalog=self)
+            if errors:
+                yield message, errors
+
+    def update(self, template, no_fuzzy_matching=False):
+        """Update the catalog based on the given template catalog.
+
+        >>> from babel.messages import Catalog
+        >>> template = Catalog()
+        >>> template.add('green', locations=[('main.py', 99)])
+        >>> template.add('blue', locations=[('main.py', 100)])
+        >>> template.add(('salad', 'salads'), locations=[('util.py', 42)])
+        >>> catalog = Catalog(locale='de_DE')
+        >>> catalog.add('blue', u'blau', locations=[('main.py', 98)])
+        >>> catalog.add('head', u'Kopf', locations=[('util.py', 33)])
+        >>> catalog.add(('salad', 'salads'), (u'Salat', u'Salate'),
+        ...             locations=[('util.py', 38)])
+
+        >>> catalog.update(template)
+        >>> len(catalog)
+        3
+
+        >>> msg1 = catalog['green']
+        >>> msg1.string
+        >>> msg1.locations
+        [('main.py', 99)]
+
+        >>> msg2 = catalog['blue']
+        >>> msg2.string
+        u'blau'
+        >>> msg2.locations
+        [('main.py', 100)]
+
+        >>> msg3 = catalog['salad']
+        >>> msg3.string
+        (u'Salat', u'Salate')
+        >>> msg3.locations
+        [('util.py', 42)]
+
+        Messages that are in the catalog but not in the template are removed
+        from the main collection, but can still be accessed via the `obsolete`
+        member:
+
+        >>> 'head' in catalog
+        False
+        >>> catalog.obsolete.values()
+        [<Message 'head' (flags: [])>]
+
+        :param template: the reference catalog, usually read from a POT file
+        :param no_fuzzy_matching: whether to use fuzzy matching of message IDs
+        """
+        messages = self._messages
+        remaining = messages.copy()
+        self._messages = odict()
+
+        # Prepare for fuzzy matching
+        fuzzy_candidates = []
+        if not no_fuzzy_matching:
+            fuzzy_candidates = [
+                self._key_for(msgid) for msgid in messages
+                if msgid and messages[msgid].string
+            ]
+        fuzzy_matches = set()
+
+        def _merge(message, oldkey, newkey):
+            message = message.clone()
+            fuzzy = False
+            if oldkey != newkey:
+                fuzzy = True
+                fuzzy_matches.add(oldkey)
+                oldmsg = messages.get(oldkey)
+                if isinstance(oldmsg.id, basestring):
+                    message.previous_id = [oldmsg.id]
+                else:
+                    message.previous_id = list(oldmsg.id)
+            else:
+                oldmsg = remaining.pop(oldkey, None)
+            message.string = oldmsg.string
+            if isinstance(message.id, (list, tuple)):
+                if not isinstance(message.string, (list, tuple)):
+                    fuzzy = True
+                    message.string = tuple(
+                        [message.string] + ([u''] * (len(message.id) - 1))
+                    )
+                elif len(message.string) != len(message.id):
+                    fuzzy = True
+                    message.string = tuple(message.string[:len(oldmsg.string)])
+            elif isinstance(message.string, (list, tuple)):
+                fuzzy = True
+                message.string = message.string[0]
+            message.flags |= oldmsg.flags
+            if fuzzy:
+                message.flags |= set([u'fuzzy'])
+            self[message.id] = message
+
+        for message in template:
+            if message.id:
+                key = self._key_for(message.id)
+                if key in messages:
+                    _merge(message, key, key)
+                else:
+                    if no_fuzzy_matching is False:
+                        # do some fuzzy matching with difflib
+                        matches = get_close_matches(key.lower().strip(),
+                                                    fuzzy_candidates, 1)
+                        if matches:
+                            _merge(message, matches[0], key)
+                            continue
+
+                    self[message.id] = message
+
+        self.obsolete = odict()
+        for msgid in remaining:
+            if no_fuzzy_matching or msgid not in fuzzy_matches:
+                self.obsolete[msgid] = remaining[msgid]
+
+    def _key_for(self, id):
+        """The key for a message is just the singular ID even for pluralizable
+        messages.
+        """
+        key = id
+        if isinstance(key, (list, tuple)):
+            key = id[0]
+        return key
Index: /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/babel/messages/extract.py
===================================================================
--- /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/babel/messages/extract.py (revision 3)
+++ /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/babel/messages/extract.py (revision 3)
@@ -0,0 +1,554 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007 Edgewall Software
+# All rights reserved.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at http://babel.edgewall.org/wiki/License.
+#
+# This software consists of voluntary contributions made by many
+# individuals. For the exact contribution history, see the revision
+# history and logs, available at http://babel.edgewall.org/log/.
+
+"""Basic infrastructure for extracting localizable messages from source files.
+
+This module defines an extensible system for collecting localizable message
+strings from a variety of sources. A native extractor for Python source files
+is builtin, extractors for other sources can be added using very simple plugins.
+
+The main entry points into the extraction functionality are the functions
+`extract_from_dir` and `extract_from_file`.
+"""
+
+import os
+try:
+    set
+except NameError:
+    from sets import Set as set
+import sys
+from tokenize import generate_tokens, COMMENT, NAME, OP, STRING
+
+from babel.util import parse_encoding, pathmatch, relpath
+from textwrap import dedent
+
+__all__ = ['extract', 'extract_from_dir', 'extract_from_file']
+__docformat__ = 'restructuredtext en'
+
+GROUP_NAME = 'babel.extractors'
+
+DEFAULT_KEYWORDS = {
+    '_': None,
+    'gettext': None,
+    'ngettext': (1, 2),
+    'ugettext': None,
+    'ungettext': (1, 2),
+    'dgettext': (2,),
+    'dngettext': (2, 3),
+    'N_': None
+}
+
+DEFAULT_MAPPING = [('**.py', 'python')]
+
+empty_msgid_warning = (
+'%s: warning: Empty msgid.  It is reserved by GNU gettext: gettext("") '
+'returns the header entry with meta information, not the empty string.')
+
+
+def _strip_comment_tags(comments, tags):
+    """Helper function for `extract` that strips comment tags from strings
+    in a list of comment lines.  This functions operates in-place.
+    """
+    def _strip(line):
+        for tag in tags:
+            if line.startswith(tag):
+                return line[len(tag):].strip()
+        return line
+    comments[:] = map(_strip, comments)
+
+
+def extract_from_dir(dirname=os.getcwd(), method_map=DEFAULT_MAPPING,
+                     options_map=None, keywords=DEFAULT_KEYWORDS,
+                     comment_tags=(), callback=None, strip_comment_tags=False):
+    """Extract messages from any source files found in the given directory.
+
+    This function generates tuples of the form:
+
+        ``(filename, lineno, message, comments)``
+
+    Which extraction method is used per file is determined by the `method_map`
+    parameter, which maps extended glob patterns to extraction method names.
+    For example, the following is the default mapping:
+
+    >>> method_map = [
+    ...     ('**.py', 'python')
+    ... ]
+
+    This basically says that files with the filename extension ".py" at any
+    level inside the directory should be processed by the "python" extraction
+    method. Files that don't match any of the mapping patterns are ignored. See
+    the documentation of the `pathmatch` function for details on the pattern
+    syntax.
+
+    The following extended mapping would also use the "genshi" extraction
+    method on any file in "templates" subdirectory:
+
+    >>> method_map = [
+    ...     ('**/templates/**.*', 'genshi'),
+    ...     ('**.py', 'python')
+    ... ]
+
+    The dictionary provided by the optional `options_map` parameter augments
+    these mappings. It uses extended glob patterns as keys, and the values are
+    dictionaries mapping options names to option values (both strings).
+
+    The glob patterns of the `options_map` do not necessarily need to be the
+    same as those used in the method mapping. For example, while all files in
+    the ``templates`` folders in an application may be Genshi applications, the
+    options for those files may differ based on extension:
+
+    >>> options_map = {
+    ...     '**/templates/**.txt': {
+    ...         'template_class': 'genshi.template:TextTemplate',
+    ...         'encoding': 'latin-1'
+    ...     },
+    ...     '**/templates/**.html': {
+    ...         'include_attrs': ''
+    ...     }
+    ... }
+
+    :param dirname: the path to the directory to extract messages from
+    :param method_map: a list of ``(pattern, method)`` tuples that maps of
+                       extraction method names to extended glob patterns
+    :param options_map: a dictionary of additional options (optional)
+    :param keywords: a dictionary mapping keywords (i.e. names of functions
+                     that should be recognized as translation functions) to
+                     tuples that specify which of their arguments contain
+                     localizable strings
+    :param comment_tags: a list of tags of translator comments to search for
+                         and include in the results
+    :param callback: a function that is called for every file that message are
+                     extracted from, just before the extraction itself is
+                     performed; the function is passed the filename, the name
+                     of the extraction method and and the options dictionary as
+                     positional arguments, in that order
+    :param strip_comment_tags: a flag that if set to `True` causes all comment
+                               tags to be removed from the collected comments.
+    :return: an iterator over ``(filename, lineno, funcname, message)`` tuples
+    :rtype: ``iterator``
+    :see: `pathmatch`
+    """
+    if options_map is None:
+        options_map = {}
+
+    absname = os.path.abspath(dirname)
+    for root, dirnames, filenames in os.walk(absname):
+        for subdir in dirnames:
+            if subdir.startswith('.') or subdir.startswith('_'):
+                dirnames.remove(subdir)
+        dirnames.sort()
+        filenames.sort()
+        for filename in filenames:
+            filename = relpath(
+                os.path.join(root, filename).replace(os.sep, '/'),
+                dirname
+            )
+            for pattern, method in method_map:
+                if pathmatch(pattern, filename):
+                    filepath = os.path.join(absname, filename)
+                    options = {}
+                    for opattern, odict in options_map.items():
+                        if pathmatch(opattern, filename):
+                            options = odict
+                    if callback:
+                        callback(filename, method, options)
+                    for lineno, message, comments in \
+                          extract_from_file(method, filepath,
+                                            keywords=keywords,
+                                            comment_tags=comment_tags,
+                                            options=options,
+                                            strip_comment_tags=
+                                                strip_comment_tags):
+                        yield filename, lineno, message, comments
+                    break
+
+
+def extract_from_file(method, filename, keywords=DEFAULT_KEYWORDS,
+                      comment_tags=(), options=None, strip_comment_tags=False):
+    """Extract messages from a specific file.
+
+    This function returns a list of tuples of the form:
+
+        ``(lineno, funcname, message)``
+
+    :param filename: the path to the file to extract messages from
+    :param method: a string specifying the extraction method (.e.g. "python")
+    :param keywords: a dictionary mapping keywords (i.e. names of functions
+                     that should be recognized as translation functions) to
+                     tuples that specify which of their arguments contain
+                     localizable strings
+    :param comment_tags: a list of translator tags to search for and include
+                         in the results
+    :param strip_comment_tags: a flag that if set to `True` causes all comment
+                               tags to be removed from the collected comments.
+    :param options: a dictionary of additional options (optional)
+    :return: the list of extracted messages
+    :rtype: `list`
+    """
+    fileobj = open(filename, 'U')
+    try:
+        return list(extract(method, fileobj, keywords, comment_tags, options,
+                            strip_comment_tags))
+    finally:
+        fileobj.close()
+
+
+def extract(method, fileobj, keywords=DEFAULT_KEYWORDS, comment_tags=(),
+            options=None, strip_comment_tags=False):
+    """Extract messages from the given file-like object using the specified
+    extraction method.
+
+    This function returns a list of tuples of the form:
+
+        ``(lineno, message, comments)``
+
+    The implementation dispatches the actual extraction to plugins, based on the
+    value of the ``method`` parameter.
+
+    >>> source = '''# foo module
+    ... def run(argv):
+    ...    print _('Hello, world!')
+    ... '''
+
+    >>> from StringIO import StringIO
+    >>> for message in extract('python', StringIO(source)):
+    ...     print message
+    (3, u'Hello, world!', [])
+
+    :param method: a string specifying the extraction method (.e.g. "python");
+                   if this is a simple name, the extraction function will be
+                   looked up by entry point; if it is an explicit reference
+                   to a function (of the form ``package.module:funcname`` or
+                   ``package.module.funcname``), the corresponding function
+                   will be imported and used
+    :param fileobj: the file-like object the messages should be extracted from
+    :param keywords: a dictionary mapping keywords (i.e. names of functions
+                     that should be recognized as translation functions) to
+                     tuples that specify which of their arguments contain
+                     localizable strings
+    :param comment_tags: a list of translator tags to search for and include
+                         in the results
+    :param options: a dictionary of additional options (optional)
+    :param strip_comment_tags: a flag that if set to `True` causes all comment
+                               tags to be removed from the collected comments.
+    :return: the list of extracted messages
+    :rtype: `list`
+    :raise ValueError: if the extraction method is not registered
+    """
+    func = None
+    if ':' in method or '.' in method:
+        if ':' not in method:
+            lastdot = method.rfind('.')
+            module, attrname = method[:lastdot], method[lastdot + 1:]
+        else:
+            module, attrname = method.split(':', 1)
+        func = getattr(__import__(module, {}, {}, [attrname]), attrname)
+    else:
+        try:
+            from pkg_resources import working_set
+        except ImportError:
+            # pkg_resources is not available, so we resort to looking up the
+            # builtin extractors directly
+            builtin = {'ignore': extract_nothing, 'python': extract_python}
+            func = builtin.get(method)
+        else:
+            for entry_point in working_set.iter_entry_points(GROUP_NAME,
+                                                             method):
+                func = entry_point.load(require=True)
+                break
+    if func is None:
+        raise ValueError('Unknown extraction method %r' % method)
+
+    results = func(fileobj, keywords.keys(), comment_tags,
+                   options=options or {})
+
+    for lineno, funcname, messages, comments in results:
+        if funcname:
+            spec = keywords[funcname] or (1,)
+        else:
+            spec = (1,)
+        if not isinstance(messages, (list, tuple)):
+            messages = [messages]
+        if not messages:
+            continue
+
+        # Validate the messages against the keyword's specification
+        msgs = []
+        invalid = False
+        # last_index is 1 based like the keyword spec
+        last_index = len(messages)
+        for index in spec:
+            if last_index < index:
+                # Not enough arguments
+                invalid = True
+                break
+            message = messages[index - 1]
+            if message is None:
+                invalid = True
+                break
+            msgs.append(message)
+        if invalid:
+            continue
+
+        first_msg_index = spec[0] - 1
+        if not messages[first_msg_index]:
+            # An empty string msgid isn't valid, emit a warning
+            where = '%s:%i' % (hasattr(fileobj, 'name') and \
+                                   fileobj.name or '(unknown)', lineno)
+            print >> sys.stderr, empty_msgid_warning % where
+            continue
+
+        messages = tuple(msgs)
+        if len(messages) == 1:
+            messages = messages[0]
+
+        if strip_comment_tags:
+            _strip_comment_tags(comments, comment_tags)
+        yield lineno, messages, comments
+
+
+def extract_nothing(fileobj, keywords, comment_tags, options):
+    """Pseudo extractor that does not actually extract anything, but simply
+    returns an empty list.
+    """
+    return []
+
+
+def extract_python(fileobj, keywords, comment_tags, options):
+    """Extract messages from Python source code.
+
+    :param fileobj: the seekable, file-like object the messages should be
+                    extracted from
+    :param keywords: a list of keywords (i.e. function names) that should be
+                     recognized as translation functions
+    :param comment_tags: a list of translator tags to search for and include
+                         in the results
+    :param options: a dictionary of additional options (optional)
+    :return: an iterator over ``(lineno, funcname, message, comments)`` tuples
+    :rtype: ``iterator``
+    """
+    funcname = lineno = message_lineno = None
+    call_stack = -1
+    buf = []
+    messages = []
+    translator_comments = []
+    in_def = in_translator_comments = False
+    comment_tag = None
+
+    encoding = parse_encoding(fileobj) or options.get('encoding', 'iso-8859-1')
+
+    tokens = generate_tokens(fileobj.readline)
+    for tok, value, (lineno, _), _, _ in tokens:
+        if call_stack == -1 and tok == NAME and value in ('def', 'class'):
+            in_def = True
+        elif tok == OP and value == '(':
+            if in_def:
+                # Avoid false positives for declarations such as:
+                # def gettext(arg='message'):
+                in_def = False
+                continue
+            if funcname:
+                message_lineno = lineno
+                call_stack += 1
+        elif in_def and tok == OP and value == ':':
+            # End of a class definition without parens
+            in_def = False
+            continue
+        elif call_stack == -1 and tok == COMMENT:
+            # Strip the comment token from the line
+            value = value.decode(encoding)[1:].strip()
+            if in_translator_comments and \
+                    translator_comments[-1][0] == lineno - 1:
+                # We're already inside a translator comment, continue appending
+                translator_comments.append((lineno, value))
+                continue
+            # If execution reaches this point, let's see if comment line
+            # starts with one of the comment tags
+            for comment_tag in comment_tags:
+                if value.startswith(comment_tag):
+                    in_translator_comments = True
+                    translator_comments.append((lineno, value))
+                    break
+        elif funcname and call_stack == 0:
+            if tok == OP and value == ')':
+                if buf:
+                    messages.append(''.join(buf))
+                    del buf[:]
+                else:
+                    messages.append(None)
+
+                if len(messages) > 1:
+                    messages = tuple(messages)
+                else:
+                    messages = messages[0]
+                # Comments don't apply unless they immediately preceed the
+                # message
+                if translator_comments and \
+                        translator_comments[-1][0] < message_lineno - 1:
+                    translator_comments = []
+
+                yield (message_lineno, funcname, messages,
+                       [comment[1] for comment in translator_comments])
+
+                funcname = lineno = message_lineno = None
+                call_stack = -1
+                messages = []
+                translator_comments = []
+                in_translator_comments = False
+            elif tok == STRING:
+                # Unwrap quotes in a safe manner, maintaining the string's
+                # encoding
+                # https://sourceforge.net/tracker/?func=detail&atid=355470&
+                # aid=617979&group_id=5470
+                value = eval('# coding=%s\n%s' % (encoding, value),
+                             {'__builtins__':{}}, {})
+                if isinstance(value, str):
+                    value = value.decode(encoding)
+                buf.append(value)
+            elif tok == OP and value == ',':
+                if buf:
+                    messages.append(''.join(buf))
+                    del buf[:]
+                else:
+                    messages.append(None)
+                if translator_comments:
+                    # We have translator comments, and since we're on a
+                    # comma(,) user is allowed to break into a new line
+                    # Let's increase the last comment's lineno in order
+                    # for the comment to still be a valid one
+                    old_lineno, old_comment = translator_comments.pop()
+                    translator_comments.append((old_lineno+1, old_comment))
+        elif call_stack > 0 and tok == OP and value == ')':
+            call_stack -= 1
+        elif funcname and call_stack == -1:
+            funcname = None
+        elif tok == NAME and value in keywords:
+            funcname = value
+
+
+def extract_javascript(fileobj, keywords, comment_tags, options):
+    """Extract messages from JavaScript source code.
+
+    :param fileobj: the seekable, file-like object the messages should be
+                    extracted from
+    :param keywords: a list of keywords (i.e. function names) that should be
+                     recognized as translation functions
+    :param comment_tags: a list of translator tags to search for and include
+                         in the results
+    :param options: a dictionary of additional options (optional)
+    :return: an iterator over ``(lineno, funcname, message, comments)`` tuples
+    :rtype: ``iterator``
+    """
+    from babel.messages.jslexer import tokenize, unquote_string
+    funcname = message_lineno = None
+    messages = []
+    last_argument = None
+    translator_comments = []
+    concatenate_next = False
+    encoding = options.get('encoding', 'utf-8')
+    last_token = None
+    call_stack = -1
+
+    for token in tokenize(fileobj.read().decode(encoding)):
+        if token.type == 'operator' and token.value == '(':
+            if funcname:
+                message_lineno = token.lineno
+                call_stack += 1
+
+        elif call_stack == -1 and token.type == 'linecomment':
+            value = token.value[2:].strip()
+            if translator_comments and \
+               translator_comments[-1][0] == token.lineno - 1:
+                translator_comments.append((token.lineno, value))
+                continue
+
+            for comment_tag in comment_tags:
+                if value.startswith(comment_tag):
+                    translator_comments.append((token.lineno, value.strip()))
+                    break
+
+        elif token.type == 'multilinecomment':
+            # only one multi-line comment may preceed a translation
+            translator_comments = []
+            value = token.value[2:-2].strip()
+            for comment_tag in comment_tags:
+                if value.startswith(comment_tag):
+                    lines = value.splitlines()
+                    if lines:
+                        lines[0] = lines[0].strip()
+                        lines[1:] = dedent('\n'.join(lines[1:])).splitlines()
+                        for offset, line in enumerate(lines):
+                            translator_comments.append((token.lineno + offset,
+                                                        line))
+                    break
+
+        elif funcname and call_stack == 0:
+            if token.type == 'operator' and token.value == ')':
+                if last_argument is not None:
+                    messages.append(last_argument)
+                if len(messages) > 1:
+                    messages = tuple(messages)
+                elif messages:
+                    messages = messages[0]
+                else:
+                    messages = None
+
+                # Comments don't apply unless they immediately preceed the
+                # message
+                if translator_comments and \
+                   translator_comments[-1][0] < message_lineno - 1:
+                    translator_comments = []
+
+                if messages is not None:
+                    yield (message_lineno, funcname, messages,
+                           [comment[1] for comment in translator_comments])
+
+                funcname = message_lineno = last_argument = None
+                concatenate_next = False
+                translator_comments = []
+                messages = []
+                call_stack = -1
+
+            elif token.type == 'string':
+                new_value = unquote_string(token.value)
+                if concatenate_next:
+                    last_argument = (last_argument or '') + new_value
+                    concatenate_next = False
+                else:
+                    last_argument = new_value
+
+            elif token.type == 'operator':
+                if token.value == ',':
+                    if last_argument is not None:
+                        messages.append(last_argument)
+                        last_argument = None
+                    else:
+                        messages.append(None)
+                    concatenate_next = False
+                elif token.value == '+':
+                    concatenate_next = True
+
+        elif call_stack > 0 and token.type == 'operator' \
+             and token.value == ')':
+            call_stack -= 1
+
+        elif funcname and call_stack == -1:
+            funcname = None
+
+        elif call_stack == -1 and token.type == 'name' and \
+             token.value in keywords and \
+             (last_token is None or last_token.type != 'name' or
+              last_token.value != 'function'):
+            funcname = token.value
+
+        last_token = token
Index: /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/babel/messages/mofile.py
===================================================================
--- /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/babel/messages/mofile.py (revision 3)
+++ /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/babel/messages/mofile.py (revision 3)
@@ -0,0 +1,121 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007 Edgewall Software
+# All rights reserved.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at http://babel.edgewall.org/wiki/License.
+#
+# This software consists of voluntary contributions made by many
+# individuals. For the exact contribution history, see the revision
+# history and logs, available at http://babel.edgewall.org/log/.
+
+"""Writing of files in the ``gettext`` MO (machine object) format.
+
+:since: version 0.9
+:see: `The Format of MO Files
+       <http://www.gnu.org/software/gettext/manual/gettext.html#MO-Files>`_
+"""
+
+import array
+import struct
+
+__all__ = ['write_mo']
+__docformat__ = 'restructuredtext en'
+
+def write_mo(fileobj, catalog, use_fuzzy=False):
+    """Write a catalog to the specified file-like object using the GNU MO file
+    format.
+    
+    >>> from babel.messages import Catalog
+    >>> from gettext import GNUTranslations
+    >>> from StringIO import StringIO
+    
+    >>> catalog = Catalog(locale='en_US')
+    >>> catalog.add('foo', 'Voh')
+    >>> catalog.add((u'bar', u'baz'), (u'Bahr', u'Batz'))
+    >>> catalog.add('fuz', 'Futz', flags=['fuzzy'])
+    >>> catalog.add('Fizz', '')
+    >>> catalog.add(('Fuzz', 'Fuzzes'), ('', ''))
+    >>> buf = StringIO()
+    
+    >>> write_mo(buf, catalog)
+    >>> buf.seek(0)
+    >>> translations = GNUTranslations(fp=buf)
+    >>> translations.ugettext('foo')
+    u'Voh'
+    >>> translations.ungettext('bar', 'baz', 1)
+    u'Bahr'
+    >>> translations.ungettext('bar', 'baz', 2)
+    u'Batz'
+    >>> translations.ugettext('fuz')
+    u'fuz'
+    >>> translations.ugettext('Fizz')
+    u'Fizz'
+    >>> translations.ugettext('Fuzz')
+    u'Fuzz'
+    >>> translations.ugettext('Fuzzes')
+    u'Fuzzes'
+    
+    :param fileobj: the file-like object to write to
+    :param catalog: the `Catalog` instance
+    :param use_fuzzy: whether translations marked as "fuzzy" should be included
+                      in the output
+    """
+    messages = list(catalog)
+    if not use_fuzzy:
+        messages[1:] = [m for m in messages[1:] if not m.fuzzy]
+    messages.sort()
+
+    ids = strs = ''
+    offsets = []
+
+    for message in messages:
+        # For each string, we need size and file offset.  Each string is NUL
+        # terminated; the NUL does not count into the size.
+        if message.pluralizable:
+            msgid = '\x00'.join([
+                msgid.encode(catalog.charset) for msgid in message.id
+            ])
+            msgstrs = []
+            for idx, string in enumerate(message.string):
+                if not string:
+                    msgstrs.append(message.id[min(int(idx), 1)])
+                else:
+                    msgstrs.append(string)
+            msgstr = '\x00'.join([
+                msgstr.encode(catalog.charset) for msgstr in msgstrs
+            ])
+        else:
+            msgid = message.id.encode(catalog.charset)
+            if not message.string:
+                msgstr = message.id.encode(catalog.charset)
+            else:
+                msgstr = message.string.encode(catalog.charset)
+        offsets.append((len(ids), len(msgid), len(strs), len(msgstr)))
+        ids += msgid + '\x00'
+        strs += msgstr + '\x00'
+
+    # The header is 7 32-bit unsigned integers.  We don't use hash tables, so
+    # the keys start right after the index tables.
+    keystart = 7 * 4 + 16 * len(messages)
+    valuestart = keystart + len(ids)
+
+    # The string table first has the list of keys, then the list of values.
+    # Each entry has first the size of the string, then the file offset.
+    koffsets = []
+    voffsets = []
+    for o1, l1, o2, l2 in offsets:
+        koffsets += [l1, o1 + keystart]
+        voffsets += [l2, o2 + valuestart]
+    offsets = koffsets + voffsets
+
+    fileobj.write(struct.pack('Iiiiiii',
+        0x950412deL,                # magic
+        0,                          # version
+        len(messages),              # number of entries
+        7 * 4,                      # start of key index
+        7 * 4 + len(messages) * 8,  # start of value index
+        0, 0                        # size and offset of hash table
+    ) + array.array("i", offsets).tostring() + ids + strs)
Index: /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/babel/messages/jslexer.py
===================================================================
--- /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/babel/messages/jslexer.py (revision 3)
+++ /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/babel/messages/jslexer.py (revision 3)
@@ -0,0 +1,175 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2008 Edgewall Software
+# All rights reserved.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at http://babel.edgewall.org/wiki/License.
+#
+# This software consists of voluntary contributions made by many
+# individuals. For the exact contribution history, see the revision
+# history and logs, available at http://babel.edgewall.org/log/.
+
+"""A simple JavaScript 1.5 lexer which is used for the JavaScript
+extractor.
+"""
+
+import re
+from operator import itemgetter
+
+
+operators = [
+    '+', '-', '*', '%', '!=', '==', '<', '>', '<=', '>=', '=',
+    '+=', '-=', '*=', '%=', '<<', '>>', '>>>', '<<=', '>>=',
+    '>>>=', '&', '&=', '|', '|=', '&&', '||', '^', '^=', '(', ')',
+    '[', ']', '{', '}', '!', '--', '++', '~', ',', ';', '.', ':'
+]
+operators.sort(lambda a, b: cmp(-len(a), -len(b)))
+
+escapes = {'b': '\b', 'f': '\f', 'n': '\n', 'r': '\r', 't': '\t'}
+
+rules = [
+    (None, re.compile(r'\s+(?u)')),
+    (None, re.compile(r'<!--.*')),
+    ('linecomment', re.compile(r'//.*')),
+    ('multilinecomment', re.compile(r'/\*.*?\*/(?us)')),
+    ('name', re.compile(r'(\$+\w*|[^\W\d]\w*)(?u)')),
+    ('number', re.compile(r'''(?x)(
+        (?:0|[1-9]\d*)
+        (\.\d+)?
+        ([eE][-+]?\d+)? |
+        (0x[a-fA-F0-9]+)
+    )''')),
+    ('operator', re.compile(r'(%s)' % '|'.join(map(re.escape, operators)))),
+    ('string', re.compile(r'''(?xs)(
+        '(?:[^'\\]*(?:\\.[^'\\]*)*)'  |
+        "(?:[^"\\]*(?:\\.[^"\\]*)*)"
+    )'''))
+]
+
+division_re = re.compile(r'/=?')
+regex_re = re.compile(r'/(?:[^/\\]*(?:\\.[^/\\]*)*)/[a-zA-Z]*(?s)')
+line_re = re.compile(r'(\r\n|\n|\r)')
+line_join_re = re.compile(r'\\' + line_re.pattern)
+uni_escape_re = re.compile(r'[a-fA-F0-9]{1,4}')
+
+
+class Token(tuple):
+    """Represents a token as returned by `tokenize`."""
+    __slots__ = ()
+
+    def __new__(cls, type, value, lineno):
+        return tuple.__new__(cls, (type, value, lineno))
+
+    type = property(itemgetter(0))
+    value = property(itemgetter(1))
+    lineno = property(itemgetter(2))
+
+
+def indicates_division(token):
+    """A helper function that helps the tokenizer to decide if the current
+    token may be followed by a division operator.
+    """
+    if token.type == 'operator':
+        return token.value in (')', ']', '}', '++', '--')
+    return token.type in ('name', 'number', 'string', 'regexp')
+
+
+def unquote_string(string):
+    """Unquote a string with JavaScript rules.  The string has to start with
+    string delimiters (``'`` or ``"``.)
+
+    :return: a string
+    """
+    assert string and string[0] == string[-1] and string[0] in '"\'', \
+        'string provided is not properly delimited'
+    string = line_join_re.sub('\\1', string[1:-1])
+    result = []
+    add = result.append
+    pos = 0
+
+    while 1:
+        # scan for the next escape
+        escape_pos = string.find('\\', pos)
+        if escape_pos < 0:
+            break
+        add(string[pos:escape_pos])
+
+        # check which character is escaped
+        next_char = string[escape_pos + 1]
+        if next_char in escapes:
+            add(escapes[next_char])
+
+        # unicode escapes.  trie to consume up to four characters of
+        # hexadecimal characters and try to interpret them as unicode
+        # character point.  If there is no such character point, put
+        # all the consumed characters into the string.
+        elif next_char in 'uU':
+            escaped = uni_escape_re.match(string, escape_pos + 2)
+            if escaped is not None:
+                escaped_value = escaped.group()
+                if len(escaped_value) == 4:
+                    try:
+                        add(unichr(int(escaped_value, 16)))
+                    except ValueError:
+                        pass
+                    else:
+                        pos = escape_pos + 6
+                        continue
+                add(next_char + escaped_value)
+                pos = escaped.end()
+                continue
+            else:
+                add(next_char)
+
+        # bogus escape.  Just remove the backslash.
+        else:
+            add(next_char)
+        pos = escape_pos + 2
+
+    if pos < len(string):
+        add(string[pos:])
+
+    return u''.join(result)
+
+
+def tokenize(source):
+    """Tokenize a JavaScript source.
+
+    :return: generator of `Token`\s
+    """
+    may_divide = False
+    pos = 0
+    lineno = 1
+    end = len(source)
+
+    while pos < end:
+        # handle regular rules first
+        for token_type, rule in rules:
+            match = rule.match(source, pos)
+            if match is not None:
+                break
+        # if we don't have a match we don't give up yet, but check for
+        # division operators or regular expression literals, based on
+        # the status of `may_divide` which is determined by the last
+        # processed non-whitespace token using `indicates_division`.
+        else:
+            if may_divide:
+                match = division_re.match(source, pos)
+                token_type = 'operator'
+            else:
+                match = regex_re.match(source, pos)
+                token_type = 'regexp'
+            if match is None:
+                # woops. invalid syntax. jump one char ahead and try again.
+                pos += 1
+                continue
+
+        token_value = match.group()
+        if token_type is not None:
+            token = Token(token_type, token_value, lineno)
+            may_divide = indicates_division(token)
+            yield token
+        lineno += len(line_re.findall(token_value))
+        pos = match.end()
Index: /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/babel/messages/pofile.py
===================================================================
--- /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/babel/messages/pofile.py (revision 3)
+++ /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/babel/messages/pofile.py (revision 3)
@@ -0,0 +1,455 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007 Edgewall Software
+# All rights reserved.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at http://babel.edgewall.org/wiki/License.
+#
+# This software consists of voluntary contributions made by many
+# individuals. For the exact contribution history, see the revision
+# history and logs, available at http://babel.edgewall.org/log/.
+
+"""Reading and writing of files in the ``gettext`` PO (portable object)
+format.
+
+:see: `The Format of PO Files
+       <http://www.gnu.org/software/gettext/manual/gettext.html#PO-Files>`_
+"""
+
+from datetime import date, datetime
+import os
+import re
+try:
+    set
+except NameError:
+    from sets import Set as set
+
+from babel import __version__ as VERSION
+from babel.messages.catalog import Catalog, Message
+from babel.util import wraptext, LOCALTZ
+
+__all__ = ['read_po', 'write_po']
+__docformat__ = 'restructuredtext en'
+
+def unescape(string):
+    r"""Reverse `escape` the given string.
+
+    >>> print unescape('"Say:\\n  \\"hello, world!\\"\\n"')
+    Say:
+      "hello, world!"
+    <BLANKLINE>
+
+    :param string: the string to unescape
+    :return: the unescaped string
+    :rtype: `str` or `unicode`
+    """
+    return string[1:-1].replace('\\\\', '\\') \
+                       .replace('\\t', '\t') \
+                       .replace('\\r', '\r') \
+                       .replace('\\n', '\n') \
+                       .replace('\\"', '\"')
+
+def denormalize(string):
+    r"""Reverse the normalization done by the `normalize` function.
+
+    >>> print denormalize(r'''""
+    ... "Say:\n"
+    ... "  \"hello, world!\"\n"''')
+    Say:
+      "hello, world!"
+    <BLANKLINE>
+
+    >>> print denormalize(r'''""
+    ... "Say:\n"
+    ... "  \"Lorem ipsum dolor sit "
+    ... "amet, consectetur adipisicing"
+    ... " elit, \"\n"''')
+    Say:
+      "Lorem ipsum dolor sit amet, consectetur adipisicing elit, "
+    <BLANKLINE>
+
+    :param string: the string to denormalize
+    :return: the denormalized string
+    :rtype: `unicode` or `str`
+    """
+    if string.startswith('""'):
+        lines = []
+        for line in string.splitlines()[1:]:
+            lines.append(unescape(line))
+        return ''.join(lines)
+    else:
+        return unescape(string)
+
+def read_po(fileobj, locale=None, domain=None, ignore_obsolete=False):
+    """Read messages from a ``gettext`` PO (portable object) file from the given
+    file-like object and return a `Catalog`.
+
+    >>> from StringIO import StringIO
+    >>> buf = StringIO('''
+    ... #: main.py:1
+    ... #, fuzzy, python-format
+    ... msgid "foo %(name)s"
+    ... msgstr ""
+    ...
+    ... # A user comment
+    ... #. An auto comment
+    ... #: main.py:3
+    ... msgid "bar"
+    ... msgid_plural "baz"
+    ... msgstr[0] ""
+    ... msgstr[1] ""
+    ... ''')
+    >>> catalog = read_po(buf)
+    >>> catalog.revision_date = datetime(2007, 04, 01)
+
+    >>> for message in catalog:
+    ...     if message.id:
+    ...         print (message.id, message.string)
+    ...         print ' ', (message.locations, message.flags)
+    ...         print ' ', (message.user_comments, message.auto_comments)
+    (u'foo %(name)s', '')
+      ([(u'main.py', 1)], set([u'fuzzy', u'python-format']))
+      ([], [])
+    ((u'bar', u'baz'), ('', ''))
+      ([(u'main.py', 3)], set([]))
+      ([u'A user comment'], [u'An auto comment'])
+
+    :param fileobj: the file-like object to read the PO file from
+    :param locale: the locale identifier or `Locale` object, or `None`
+                   if the catalog is not bound to a locale (which basically
+                   means it's a template)
+    :param domain: the message domain
+    :param ignore_obsolete: whether to ignore obsolete messages in the input
+    :return: an iterator over ``(message, translation, location)`` tuples
+    :rtype: ``iterator``
+    """
+    catalog = Catalog(locale=locale, domain=domain)
+
+    counter = [0]
+    offset = [0]
+    messages = []
+    translations = []
+    locations = []
+    flags = []
+    user_comments = []
+    auto_comments = []
+    obsolete = [False]
+    in_msgid = [False]
+    in_msgstr = [False]
+
+    def _add_message():
+        translations.sort()
+        if len(messages) > 1:
+            msgid = tuple([denormalize(m) for m in messages])
+        else:
+            msgid = denormalize(messages[0])
+        if isinstance(msgid, (list, tuple)):
+            string = []
+            for idx in range(catalog.num_plurals):
+                try:
+                    string.append(translations[idx])
+                except IndexError:
+                    string.append((idx, ''))
+            string = tuple([denormalize(t[1]) for t in string])
+        else:
+            string = denormalize(translations[0][1])
+        message = Message(msgid, string, list(locations), set(flags),
+                          auto_comments, user_comments, lineno=offset[0] + 1)
+        if obsolete[0]:
+            if not ignore_obsolete:
+                catalog.obsolete[msgid] = message
+        else:
+            catalog[msgid] = message
+        del messages[:]; del translations[:]; del locations[:];
+        del flags[:]; del auto_comments[:]; del user_comments[:]
+        obsolete[0] = False
+        counter[0] += 1
+
+    def _process_message_line(lineno, line):
+        if line.startswith('msgid_plural'):
+            in_msgid[0] = True
+            msg = line[12:].lstrip()
+            messages.append(msg)
+        elif line.startswith('msgid'):
+            in_msgid[0] = True
+            offset[0] = lineno
+            txt = line[5:].lstrip()
+            if messages:
+                _add_message()
+            messages.append(txt)
+        elif line.startswith('msgstr'):
+            in_msgid[0] = False
+            in_msgstr[0] = True
+            msg = line[6:].lstrip()
+            if msg.startswith('['):
+                idx, msg = msg[1:].split(']')
+                translations.append([int(idx), msg.lstrip()])
+            else:
+                translations.append([0, msg])
+        elif line.startswith('"'):
+            if in_msgid[0]:
+                messages[-1] += u'\n' + line.rstrip()
+            elif in_msgstr[0]:
+                translations[-1][1] += u'\n' + line.rstrip()
+
+    for lineno, line in enumerate(fileobj.readlines()):
+        line = line.strip().decode(catalog.charset)
+        if line.startswith('#'):
+            in_msgid[0] = in_msgstr[0] = False
+            if messages and translations:
+                _add_message()
+            if line[1:].startswith(':'):
+                for location in line[2:].lstrip().split():
+                    pos = location.rfind(':')
+                    if pos >= 0:
+                        try:
+                            lineno = int(location[pos + 1:])
+                        except ValueError:
+                            continue
+                        locations.append((location[:pos], lineno))
+            elif line[1:].startswith(','):
+                for flag in line[2:].lstrip().split(','):
+                    flags.append(flag.strip())
+            elif line[1:].startswith('~'):
+                obsolete[0] = True
+                _process_message_line(lineno, line[2:].lstrip())
+            elif line[1:].startswith('.'):
+                # These are called auto-comments
+                comment = line[2:].strip()
+                if comment: # Just check that we're not adding empty comments
+                    auto_comments.append(comment)
+            else:
+                # These are called user comments
+                user_comments.append(line[1:].strip())
+        else:
+            _process_message_line(lineno, line)
+
+    if messages:
+        _add_message()
+
+    # No actual messages found, but there was some info in comments, from which
+    # we'll construct an empty header message
+    elif not counter[0] and (flags or user_comments or auto_comments):
+        messages.append(u'')
+        translations.append([0, u''])
+        _add_message()
+
+    return catalog
+
+WORD_SEP = re.compile('('
+    r'\s+|'                                 # any whitespace
+    r'[^\s\w]*\w+[a-zA-Z]-(?=\w+[a-zA-Z])|' # hyphenated words
+    r'(?<=[\w\!\"\'\&\.\,\?])-{2,}(?=\w)'   # em-dash
+')')
+
+def escape(string):
+    r"""Escape the given string so that it can be included in double-quoted
+    strings in ``PO`` files.
+
+    >>> escape('''Say:
+    ...   "hello, world!"
+    ... ''')
+    '"Say:\\n  \\"hello, world!\\"\\n"'
+
+    :param string: the string to escape
+    :return: the escaped string
+    :rtype: `str` or `unicode`
+    """
+    return '"%s"' % string.replace('\\', '\\\\') \
+                          .replace('\t', '\\t') \
+                          .replace('\r', '\\r') \
+                          .replace('\n', '\\n') \
+                          .replace('\"', '\\"')
+
+def normalize(string, prefix='', width=76):
+    r"""Convert a string into a format that is appropriate for .po files.
+
+    >>> print normalize('''Say:
+    ...   "hello, world!"
+    ... ''', width=None)
+    ""
+    "Say:\n"
+    "  \"hello, world!\"\n"
+
+    >>> print normalize('''Say:
+    ...   "Lorem ipsum dolor sit amet, consectetur adipisicing elit, "
+    ... ''', width=32)
+    ""
+    "Say:\n"
+    "  \"Lorem ipsum dolor sit "
+    "amet, consectetur adipisicing"
+    " elit, \"\n"
+
+    :param string: the string to normalize
+    :param prefix: a string that should be prepended to every line
+    :param width: the maximum line width; use `None`, 0, or a negative number
+                  to completely disable line wrapping
+    :return: the normalized string
+    :rtype: `unicode`
+    """
+    if width and width > 0:
+        prefixlen = len(prefix)
+        lines = []
+        for idx, line in enumerate(string.splitlines(True)):
+            if len(escape(line)) + prefixlen > width:
+                chunks = WORD_SEP.split(line)
+                chunks.reverse()
+                while chunks:
+                    buf = []
+                    size = 2
+                    while chunks:
+                        l = len(escape(chunks[-1])) - 2 + prefixlen
+                        if size + l < width:
+                            buf.append(chunks.pop())
+                            size += l
+                        else:
+                            if not buf:
+                                # handle long chunks by putting them on a
+                                # separate line
+                                buf.append(chunks.pop())
+                            break
+                    lines.append(u''.join(buf))
+            else:
+                lines.append(line)
+    else:
+        lines = string.splitlines(True)
+
+    if len(lines) <= 1:
+        return escape(string)
+
+    # Remove empty trailing line
+    if lines and not lines[-1]:
+        del lines[-1]
+        lines[-1] += '\n'
+    return u'""\n' + u'\n'.join([(prefix + escape(l)) for l in lines])
+
+def write_po(fileobj, catalog, width=76, no_location=False, omit_header=False,
+             sort_output=False, sort_by_file=False, ignore_obsolete=False,
+             include_previous=False):
+    r"""Write a ``gettext`` PO (portable object) template file for a given
+    message catalog to the provided file-like object.
+
+    >>> catalog = Catalog()
+    >>> catalog.add(u'foo %(name)s', locations=[('main.py', 1)],
+    ...             flags=('fuzzy',))
+    >>> catalog.add((u'bar', u'baz'), locations=[('main.py', 3)])
+    >>> from StringIO import StringIO
+    >>> buf = StringIO()
+    >>> write_po(buf, catalog, omit_header=True)
+    >>> print buf.getvalue()
+    #: main.py:1
+    #, fuzzy, python-format
+    msgid "foo %(name)s"
+    msgstr ""
+    <BLANKLINE>
+    #: main.py:3
+    msgid "bar"
+    msgid_plural "baz"
+    msgstr[0] ""
+    msgstr[1] ""
+    <BLANKLINE>
+    <BLANKLINE>
+
+    :param fileobj: the file-like object to write to
+    :param catalog: the `Catalog` instance
+    :param width: the maximum line width for the generated output; use `None`,
+                  0, or a negative number to completely disable line wrapping
+    :param no_location: do not emit a location comment for every message
+    :param omit_header: do not include the ``msgid ""`` entry at the top of the
+                        output
+    :param sort_output: whether to sort the messages in the output by msgid
+    :param sort_by_file: whether to sort the messages in the output by their
+                         locations
+    :param ignore_obsolete: whether to ignore obsolete messages and not include
+                            them in the output; by default they are included as
+                            comments
+    :param include_previous: include the old msgid as a comment when
+                             updating the catalog
+    """
+    def _normalize(key, prefix=''):
+        return normalize(key, prefix=prefix, width=width) \
+            .encode(catalog.charset, 'backslashreplace')
+
+    def _write(text):
+        if isinstance(text, unicode):
+            text = text.encode(catalog.charset)
+        fileobj.write(text)
+
+    def _write_comment(comment, prefix=''):
+        lines = comment
+        if width and width > 0:
+            lines = wraptext(comment, width)
+        for line in lines:
+            _write('#%s %s\n' % (prefix, line.strip()))
+
+    def _write_message(message, prefix=''):
+        if isinstance(message.id, (list, tuple)):
+            _write('%smsgid %s\n' % (prefix, _normalize(message.id[0], prefix)))
+            _write('%smsgid_plural %s\n' % (
+                prefix, _normalize(message.id[1], prefix)
+            ))
+
+            for idx in range(catalog.num_plurals):
+                try:
+                    string = message.string[idx]
+                except IndexError:
+                    string = ''
+                _write('%smsgstr[%d] %s\n' % (
+                    prefix, idx, _normalize(string, prefix)
+                ))
+        else:
+            _write('%smsgid %s\n' % (prefix, _normalize(message.id, prefix)))
+            _write('%smsgstr %s\n' % (
+                prefix, _normalize(message.string or '', prefix)
+            ))
+
+    messages = list(catalog)
+    if sort_output:
+        messages.sort()
+    elif sort_by_file:
+        messages.sort(lambda x,y: cmp(x.locations, y.locations))
+
+    for message in messages:
+        if not message.id: # This is the header "message"
+            if omit_header:
+                continue
+            comment_header = catalog.header_comment
+            if width and width > 0:
+                lines = []
+                for line in comment_header.splitlines():
+                    lines += wraptext(line, width=width,
+                                      subsequent_indent='# ')
+                comment_header = u'\n'.join(lines) + u'\n'
+            _write(comment_header)
+
+        for comment in message.user_comments:
+            _write_comment(comment)
+        for comment in message.auto_comments:
+            _write_comment(comment, prefix='.')
+
+        if not no_location:
+            locs = u' '.join([u'%s:%d' % (filename.replace(os.sep, '/'), lineno)
+                              for filename, lineno in message.locations])
+            _write_comment(locs, prefix=':')
+        if message.flags:
+            _write('#%s\n' % ', '.join([''] + list(message.flags)))
+
+        if message.previous_id and include_previous:
+            _write_comment('msgid %s' % _normalize(message.previous_id[0]),
+                           prefix='|')
+            if len(message.previous_id) > 1:
+                _write_comment('msgid_plural %s' % _normalize(
+                    message.previous_id[1]
+                ), prefix='|')
+
+        _write_message(message)
+        _write('\n')
+
+    if not ignore_obsolete:
+        for message in catalog.obsolete.values():
+            for comment in message.user_comments:
+                _write_comment(comment)
+            _write_message(message, prefix='#~ ')
+            _write('\n')
Index: /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/babel/messages/__init__.py
===================================================================
--- /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/babel/messages/__init__.py (revision 3)
+++ /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/babel/messages/__init__.py (revision 3)
@@ -0,0 +1,16 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007 Edgewall Software
+# All rights reserved.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at http://babel.edgewall.org/wiki/License.
+#
+# This software consists of voluntary contributions made by many
+# individuals. For the exact contribution history, see the revision
+# history and logs, available at http://babel.edgewall.org/log/.
+
+"""Support for ``gettext`` message catalogs."""
+
+from babel.messages.catalog import *
Index: /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/babel/messages/frontend.py
===================================================================
--- /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/babel/messages/frontend.py (revision 3)
+++ /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/babel/messages/frontend.py (revision 3)
@@ -0,0 +1,1194 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007 Edgewall Software
+# All rights reserved.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at http://babel.edgewall.org/wiki/License.
+#
+# This software consists of voluntary contributions made by many
+# individuals. For the exact contribution history, see the revision
+# history and logs, available at http://babel.edgewall.org/log/.
+
+"""Frontends for the message extraction functionality."""
+
+from ConfigParser import RawConfigParser
+from datetime import datetime
+from distutils import log
+from distutils.cmd import Command
+from distutils.errors import DistutilsOptionError, DistutilsSetupError
+from locale import getpreferredencoding
+import logging
+from optparse import OptionParser
+import os
+import re
+import shutil
+from StringIO import StringIO
+import sys
+import tempfile
+
+from babel import __version__ as VERSION
+from babel import Locale, localedata
+from babel.core import UnknownLocaleError
+from babel.messages.catalog import Catalog
+from babel.messages.extract import extract_from_dir, DEFAULT_KEYWORDS, \
+                                   DEFAULT_MAPPING
+from babel.messages.mofile import write_mo
+from babel.messages.pofile import read_po, write_po
+from babel.messages.plurals import PLURALS
+from babel.util import odict, LOCALTZ
+
+__all__ = ['CommandLineInterface', 'compile_catalog', 'extract_messages',
+           'init_catalog', 'check_message_extractors', 'update_catalog']
+__docformat__ = 'restructuredtext en'
+
+
+class compile_catalog(Command):
+    """Catalog compilation command for use in ``setup.py`` scripts.
+
+    If correctly installed, this command is available to Setuptools-using
+    setup scripts automatically. For projects using plain old ``distutils``,
+    the command needs to be registered explicitly in ``setup.py``::
+
+        from babel.messages.frontend import compile_catalog
+
+        setup(
+            ...
+            cmdclass = {'compile_catalog': compile_catalog}
+        )
+
+    :since: version 0.9
+    :see: `Integrating new distutils commands <http://docs.python.org/dist/node32.html>`_
+    :see: `setuptools <http://peak.telecommunity.com/DevCenter/setuptools>`_
+    """
+
+    description = 'compile message catalogs to binary MO files'
+    user_options = [
+        ('domain=', 'D',
+         "domain of PO file (default 'messages')"),
+        ('directory=', 'd',
+         'path to base directory containing the catalogs'),
+        ('input-file=', 'i',
+         'name of the input file'),
+        ('output-file=', 'o',
+         "name of the output file (default "
+         "'<output_dir>/<locale>/LC_MESSAGES/<domain>.po')"),
+        ('locale=', 'l',
+         'locale of the catalog to compile'),
+        ('use-fuzzy', 'f',
+         'also include fuzzy translations'),
+        ('statistics', None,
+         'print statistics about translations')
+    ]
+    boolean_options = ['use-fuzzy', 'statistics']
+
+    def initialize_options(self):
+        self.domain = 'messages'
+        self.directory = None
+        self.input_file = None
+        self.output_file = None
+        self.locale = None
+        self.use_fuzzy = False
+        self.statistics = False
+
+    def finalize_options(self):
+        if not self.input_file and not self.directory:
+            raise DistutilsOptionError('you must specify either the input file '
+                                       'or the base directory')
+        if not self.output_file and not self.directory:
+            raise DistutilsOptionError('you must specify either the input file '
+                                       'or the base directory')
+
+    def run(self):
+        po_files = []
+        mo_files = []
+
+        if not self.input_file:
+            if self.locale:
+                po_files.append((self.locale,
+                                 os.path.join(self.directory, self.locale,
+                                              'LC_MESSAGES',
+                                              self.domain + '.po')))
+                mo_files.append(os.path.join(self.directory, self.locale,
+                                             'LC_MESSAGES',
+                                             self.domain + '.mo'))
+            else:
+                for locale in os.listdir(self.directory):
+                    po_file = os.path.join(self.directory, locale,
+                                           'LC_MESSAGES', self.domain + '.po')
+                    if os.path.exists(po_file):
+                        po_files.append((locale, po_file))
+                        mo_files.append(os.path.join(self.directory, locale,
+                                                     'LC_MESSAGES',
+                                                     self.domain + '.mo'))
+        else:
+            po_files.append((self.locale, self.input_file))
+            if self.output_file:
+                mo_files.append(self.output_file)
+            else:
+                mo_files.append(os.path.join(self.directory, self.locale,
+                                             'LC_MESSAGES',
+                                             self.domain + '.mo'))
+
+        if not po_files:
+            raise DistutilsOptionError('no message catalogs found')
+
+        for idx, (locale, po_file) in enumerate(po_files):
+            mo_file = mo_files[idx]
+            infile = open(po_file, 'r')
+            try:
+                catalog = read_po(infile, locale)
+            finally:
+                infile.close()
+
+            if self.statistics:
+                translated = 0
+                for message in list(catalog)[1:]:
+                    if message.string:
+                        translated +=1
+                percentage = 0
+                if len(catalog):
+                    percentage = translated * 100 // len(catalog)
+                log.info('%d of %d messages (%d%%) translated in %r',
+                         translated, len(catalog), percentage, po_file)
+
+            if catalog.fuzzy and not self.use_fuzzy:
+                log.warn('catalog %r is marked as fuzzy, skipping', po_file)
+                continue
+
+            for message, errors in catalog.check():
+                for error in errors:
+                    log.error('error: %s:%d: %s', po_file, message.lineno,
+                              error)
+
+            log.info('compiling catalog %r to %r', po_file, mo_file)
+
+            outfile = open(mo_file, 'wb')
+            try:
+                write_mo(outfile, catalog, use_fuzzy=self.use_fuzzy)
+            finally:
+                outfile.close()
+
+
+class extract_messages(Command):
+    """Message extraction command for use in ``setup.py`` scripts.
+
+    If correctly installed, this command is available to Setuptools-using
+    setup scripts automatically. For projects using plain old ``distutils``,
+    the command needs to be registered explicitly in ``setup.py``::
+
+        from babel.messages.frontend import extract_messages
+
+        setup(
+            ...
+            cmdclass = {'extract_messages': extract_messages}
+        )
+
+    :see: `Integrating new distutils commands <http://docs.python.org/dist/node32.html>`_
+    :see: `setuptools <http://peak.telecommunity.com/DevCenter/setuptools>`_
+    """
+
+    description = 'extract localizable strings from the project code'
+    user_options = [
+        ('charset=', None,
+         'charset to use in the output file'),
+        ('keywords=', 'k',
+         'space-separated list of keywords to look for in addition to the '
+         'defaults'),
+        ('no-default-keywords', None,
+         'do not include the default keywords'),
+        ('mapping-file=', 'F',
+         'path to the mapping configuration file'),
+        ('no-location', None,
+         'do not include location comments with filename and line number'),
+        ('omit-header', None,
+         'do not include msgid "" entry in header'),
+        ('output-file=', 'o',
+         'name of the output file'),
+        ('width=', 'w',
+         'set output line width (default 76)'),
+        ('no-wrap', None,
+         'do not break long message lines, longer than the output line width, '
+         'into several lines'),
+        ('sort-output', None,
+         'generate sorted output (default False)'),
+        ('sort-by-file', None,
+         'sort output by file location (default False)'),
+        ('msgid-bugs-address=', None,
+         'set report address for msgid'),
+        ('copyright-holder=', None,
+         'set copyright holder in output'),
+        ('add-comments=', 'c',
+         'place comment block with TAG (or those preceding keyword lines) in '
+         'output file. Seperate multiple TAGs with commas(,)'),
+        ('strip-comments', None,
+         'strip the comment TAGs from the comments.'),
+        ('input-dirs=', None,
+         'directories that should be scanned for messages'),
+    ]
+    boolean_options = [
+        'no-default-keywords', 'no-location', 'omit-header', 'no-wrap',
+        'sort-output', 'sort-by-file', 'strip-comments'
+    ]
+
+    def initialize_options(self):
+        self.charset = 'utf-8'
+        self.keywords = ''
+        self._keywords = DEFAULT_KEYWORDS.copy()
+        self.no_default_keywords = False
+        self.mapping_file = None
+        self.no_location = False
+        self.omit_header = False
+        self.output_file = None
+        self.input_dirs = None
+        self.width = 76
+        self.no_wrap = False
+        self.sort_output = False
+        self.sort_by_file = False
+        self.msgid_bugs_address = None
+        self.copyright_holder = None
+        self.add_comments = None
+        self._add_comments = []
+        self.strip_comments = False
+
+    def finalize_options(self):
+        if self.no_default_keywords and not self.keywords:
+            raise DistutilsOptionError('you must specify new keywords if you '
+                                       'disable the default ones')
+        if self.no_default_keywords:
+            self._keywords = {}
+        if self.keywords:
+            self._keywords.update(parse_keywords(self.keywords.split()))
+
+        if not self.output_file:
+            raise DistutilsOptionError('no output file specified')
+        if self.no_wrap and self.width:
+            raise DistutilsOptionError("'--no-wrap' and '--width' are mutually "
+                                       "exclusive")
+        if self.no_wrap:
+            self.width = None
+        else:
+            self.width = int(self.width)
+
+        if self.sort_output and self.sort_by_file:
+            raise DistutilsOptionError("'--sort-output' and '--sort-by-file' "
+                                       "are mutually exclusive")
+
+        if not self.input_dirs:
+            self.input_dirs = dict.fromkeys([k.split('.',1)[0]
+                for k in self.distribution.packages
+            ]).keys()
+
+        if self.add_comments:
+            self._add_comments = self.add_comments.split(',')
+
+    def run(self):
+        mappings = self._get_mappings()
+        outfile = open(self.output_file, 'w')
+        try:
+            catalog = Catalog(project=self.distribution.get_name(),
+                              version=self.distribution.get_version(),
+                              msgid_bugs_address=self.msgid_bugs_address,
+                              copyright_holder=self.copyright_holder,
+                              charset=self.charset)
+
+            for dirname, (method_map, options_map) in mappings.items():
+                def callback(filename, method, options):
+                    if method == 'ignore':
+                        return
+                    filepath = os.path.normpath(os.path.join(dirname, filename))
+                    optstr = ''
+                    if options:
+                        optstr = ' (%s)' % ', '.join(['%s="%s"' % (k, v) for
+                                                      k, v in options.items()])
+                    log.info('extracting messages from %s%s', filepath, optstr)
+
+                extracted = extract_from_dir(dirname, method_map, options_map,
+                                             keywords=self._keywords,
+                                             comment_tags=self._add_comments,
+                                             callback=callback,
+                                             strip_comment_tags=
+                                                self.strip_comments)
+                for filename, lineno, message, comments in extracted:
+                    filepath = os.path.normpath(os.path.join(dirname, filename))
+                    catalog.add(message, None, [(filepath, lineno)],
+                                auto_comments=comments)
+
+            log.info('writing PO template file to %s' % self.output_file)
+            write_po(outfile, catalog, width=self.width,
+                     no_location=self.no_location,
+                     omit_header=self.omit_header,
+                     sort_output=self.sort_output,
+                     sort_by_file=self.sort_by_file)
+        finally:
+            outfile.close()
+
+    def _get_mappings(self):
+        mappings = {}
+
+        if self.mapping_file:
+            fileobj = open(self.mapping_file, 'U')
+            try:
+                method_map, options_map = parse_mapping(fileobj)
+                for dirname in self.input_dirs:
+                    mappings[dirname] = method_map, options_map
+            finally:
+                fileobj.close()
+
+        elif getattr(self.distribution, 'message_extractors', None):
+            message_extractors = self.distribution.message_extractors
+            for dirname, mapping in message_extractors.items():
+                if isinstance(mapping, basestring):
+                    method_map, options_map = parse_mapping(StringIO(mapping))
+                else:
+                    method_map, options_map = [], {}
+                    for pattern, method, options in mapping:
+                        method_map.append((pattern, method))
+                        options_map[pattern] = options or {}
+                mappings[dirname] = method_map, options_map
+
+        else:
+            for dirname in self.input_dirs:
+                mappings[dirname] = DEFAULT_MAPPING, {}
+
+        return mappings
+
+
+def check_message_extractors(dist, name, value):
+    """Validate the ``message_extractors`` keyword argument to ``setup()``.
+
+    :param dist: the distutils/setuptools ``Distribution`` object
+    :param name: the name of the keyword argument (should always be
+                 "message_extractors")
+    :param value: the value of the keyword argument
+    :raise `DistutilsSetupError`: if the value is not valid
+    :see: `Adding setup() arguments
+           <http://peak.telecommunity.com/DevCenter/setuptools#adding-setup-arguments>`_
+    """
+    assert name == 'message_extractors'
+    if not isinstance(value, dict):
+        raise DistutilsSetupError('the value of the "message_extractors" '
+                                  'parameter must be a dictionary')
+
+
+class init_catalog(Command):
+    """New catalog initialization command for use in ``setup.py`` scripts.
+
+    If correctly installed, this command is available to Setuptools-using
+    setup scripts automatically. For projects using plain old ``distutils``,
+    the command needs to be registered explicitly in ``setup.py``::
+
+        from babel.messages.frontend import init_catalog
+
+        setup(
+            ...
+            cmdclass = {'init_catalog': init_catalog}
+        )
+
+    :see: `Integrating new distutils commands <http://docs.python.org/dist/node32.html>`_
+    :see: `setuptools <http://peak.telecommunity.com/DevCenter/setuptools>`_
+    """
+
+    description = 'create a new catalog based on a POT file'
+    user_options = [
+        ('domain=', 'D',
+         "domain of PO file (default 'messages')"),
+        ('input-file=', 'i',
+         'name of the input file'),
+        ('output-dir=', 'd',
+         'path to output directory'),
+        ('output-file=', 'o',
+         "name of the output file (default "
+         "'<output_dir>/<locale>/LC_MESSAGES/<domain>.po')"),
+        ('locale=', 'l',
+         'locale for the new localized catalog'),
+    ]
+
+    def initialize_options(self):
+        self.output_dir = None
+        self.output_file = None
+        self.input_file = None
+        self.locale = None
+        self.domain = 'messages'
+
+    def finalize_options(self):
+        if not self.input_file:
+            raise DistutilsOptionError('you must specify the input file')
+
+        if not self.locale:
+            raise DistutilsOptionError('you must provide a locale for the '
+                                       'new catalog')
+        try:
+            self._locale = Locale.parse(self.locale)
+        except UnknownLocaleError, e:
+            raise DistutilsOptionError(e)
+
+        if not self.output_file and not self.output_dir:
+            raise DistutilsOptionError('you must specify the output directory')
+        if not self.output_file:
+            self.output_file = os.path.join(self.output_dir, self.locale,
+                                            'LC_MESSAGES', self.domain + '.po')
+
+        if not os.path.exists(os.path.dirname(self.output_file)):
+            os.makedirs(os.path.dirname(self.output_file))
+
+    def run(self):
+        log.info('creating catalog %r based on %r', self.output_file,
+                 self.input_file)
+
+        infile = open(self.input_file, 'r')
+        try:
+            # Although reading from the catalog template, read_po must be fed
+            # the locale in order to correcly calculate plurals
+            catalog = read_po(infile, locale=self.locale)
+        finally:
+            infile.close()
+
+        catalog.locale = self._locale
+        catalog.fuzzy = False
+
+        outfile = open(self.output_file, 'w')
+        try:
+            write_po(outfile, catalog)
+        finally:
+            outfile.close()
+
+
+class update_catalog(Command):
+    """Catalog merging command for use in ``setup.py`` scripts.
+
+    If correctly installed, this command is available to Setuptools-using
+    setup scripts automatically. For projects using plain old ``distutils``,
+    the command needs to be registered explicitly in ``setup.py``::
+
+        from babel.messages.frontend import update_catalog
+
+        setup(
+            ...
+            cmdclass = {'update_catalog': update_catalog}
+        )
+
+    :since: version 0.9
+    :see: `Integrating new distutils commands <http://docs.python.org/dist/node32.html>`_
+    :see: `setuptools <http://peak.telecommunity.com/DevCenter/setuptools>`_
+    """
+
+    description = 'update message catalogs from a POT file'
+    user_options = [
+        ('domain=', 'D',
+         "domain of PO file (default 'messages')"),
+        ('input-file=', 'i',
+         'name of the input file'),
+        ('output-dir=', 'd',
+         'path to base directory containing the catalogs'),
+        ('output-file=', 'o',
+         "name of the output file (default "
+         "'<output_dir>/<locale>/LC_MESSAGES/<domain>.po')"),
+        ('locale=', 'l',
+         'locale of the catalog to compile'),
+        ('ignore-obsolete=', None,
+         'whether to omit obsolete messages from the output'),
+        ('no-fuzzy-matching', 'N',
+         'do not use fuzzy matching'),
+        ('previous', None,
+         'keep previous msgids of translated messages')
+    ]
+    boolean_options = ['ignore_obsolete', 'no_fuzzy_matching', 'previous']
+
+    def initialize_options(self):
+        self.domain = 'messages'
+        self.input_file = None
+        self.output_dir = None
+        self.output_file = None
+        self.locale = None
+        self.ignore_obsolete = False
+        self.no_fuzzy_matching = False
+        self.previous = False
+
+    def finalize_options(self):
+        if not self.input_file:
+            raise DistutilsOptionError('you must specify the input file')
+        if not self.output_file and not self.output_dir:
+            raise DistutilsOptionError('you must specify the output file or '
+                                       'directory')
+        if self.output_file and not self.locale:
+            raise DistutilsOptionError('you must specify the locale')
+        if self.no_fuzzy_matching and self.previous:
+            self.previous = False
+
+    def run(self):
+        po_files = []
+        if not self.output_file:
+            if self.locale:
+                po_files.append((self.locale,
+                                 os.path.join(self.output_dir, self.locale,
+                                              'LC_MESSAGES',
+                                              self.domain + '.po')))
+            else:
+                for locale in os.listdir(self.output_dir):
+                    po_file = os.path.join(self.output_dir, locale,
+                                           'LC_MESSAGES',
+                                           self.domain + '.po')
+                    if os.path.exists(po_file):
+                        po_files.append((locale, po_file))
+        else:
+            po_files.append((self.locale, self.output_file))
+
+        domain = self.domain
+        if not domain:
+            domain = os.path.splitext(os.path.basename(self.input_file))[0]
+
+        infile = open(self.input_file, 'U')
+        try:
+            template = read_po(infile)
+        finally:
+            infile.close()
+
+        if not po_files:
+            raise DistutilsOptionError('no message catalogs found')
+
+        for locale, filename in po_files:
+            log.info('updating catalog %r based on %r', filename,
+                     self.input_file)
+            infile = open(filename, 'U')
+            try:
+                catalog = read_po(infile, locale=locale, domain=domain)
+            finally:
+                infile.close()
+
+            catalog.update(template, self.no_fuzzy_matching)
+
+            tmpname = os.path.join(os.path.dirname(filename),
+                                   tempfile.gettempprefix() +
+                                   os.path.basename(filename))
+            tmpfile = open(tmpname, 'w')
+            try:
+                try:
+                    write_po(tmpfile, catalog,
+                             ignore_obsolete=self.ignore_obsolete,
+                             include_previous=self.previous)
+                finally:
+                    tmpfile.close()
+            except:
+                os.remove(tmpname)
+                raise
+
+            try:
+                os.rename(tmpname, filename)
+            except OSError:
+                # We're probably on Windows, which doesn't support atomic
+                # renames, at least not through Python
+                # If the error is in fact due to a permissions problem, that
+                # same error is going to be raised from one of the following
+                # operations
+                os.remove(filename)
+                shutil.copy(tmpname, filename)
+                os.remove(tmpname)
+
+
+class CommandLineInterface(object):
+    """Command-line interface.
+
+    This class provides a simple command-line interface to the message
+    extraction and PO file generation functionality.
+    """
+
+    usage = '%%prog %s [options] %s'
+    version = '%%prog %s' % VERSION
+    commands = {
+        'compile': 'compile message catalogs to MO files',
+        'extract': 'extract messages from source files and generate a POT file',
+        'init':    'create new message catalogs from a POT file',
+        'update':  'update existing message catalogs from a POT file'
+    }
+
+    def run(self, argv=sys.argv):
+        """Main entry point of the command-line interface.
+
+        :param argv: list of arguments passed on the command-line
+        """
+        self.parser = OptionParser(usage=self.usage % ('command', '[args]'),
+                                   version=self.version)
+        self.parser.disable_interspersed_args()
+        self.parser.print_help = self._help
+        self.parser.add_option('--list-locales', dest='list_locales',
+                               action='store_true',
+                               help="print all known locales and exit")
+        self.parser.add_option('-v', '--verbose', action='store_const',
+                               dest='loglevel', const=logging.DEBUG,
+                               help='print as much as possible')
+        self.parser.add_option('-q', '--quiet', action='store_const',
+                               dest='loglevel', const=logging.ERROR,
+                               help='print as little as possible')
+        self.parser.set_defaults(list_locales=False, loglevel=logging.INFO)
+
+        options, args = self.parser.parse_args(argv[1:])
+
+        # Configure logging
+        self.log = logging.getLogger('babel')
+        self.log.setLevel(options.loglevel)
+        handler = logging.StreamHandler()
+        handler.setLevel(options.loglevel)
+        formatter = logging.Formatter('%(message)s')
+        handler.setFormatter(formatter)
+        self.log.addHandler(handler)
+
+        if options.list_locales:
+            identifiers = localedata.list()
+            longest = max([len(identifier) for identifier in identifiers])
+            format = u'%%-%ds %%s' % (longest + 1)
+            for identifier in localedata.list():
+                locale = Locale.parse(identifier)
+                output = format % (identifier, locale.english_name)
+                print output.encode(sys.stdout.encoding or
+                                    getpreferredencoding() or
+                                    'ascii', 'replace')
+            return 0
+
+        if not args:
+            self.parser.error('incorrect number of arguments')
+
+        cmdname = args[0]
+        if cmdname not in self.commands:
+            self.parser.error('unknown command "%s"' % cmdname)
+
+        return getattr(self, cmdname)(args[1:])
+
+    def _help(self):
+        print self.parser.format_help()
+        print "commands:"
+        longest = max([len(command) for command in self.commands])
+        format = "  %%-%ds %%s" % max(8, longest + 1)
+        commands = self.commands.items()
+        commands.sort()
+        for name, description in commands:
+            print format % (name, description)
+
+    def compile(self, argv):
+        """Subcommand for compiling a message catalog to a MO file.
+
+        :param argv: the command arguments
+        :since: version 0.9
+        """
+        parser = OptionParser(usage=self.usage % ('compile', ''),
+                              description=self.commands['compile'])
+        parser.add_option('--domain', '-D', dest='domain',
+                          help="domain of MO and PO files (default '%default')")
+        parser.add_option('--directory', '-d', dest='directory',
+                          metavar='DIR', help='base directory of catalog files')
+        parser.add_option('--locale', '-l', dest='locale', metavar='LOCALE',
+                          help='locale of the catalog')
+        parser.add_option('--input-file', '-i', dest='input_file',
+                          metavar='FILE', help='name of the input file')
+        parser.add_option('--output-file', '-o', dest='output_file',
+                          metavar='FILE',
+                          help="name of the output file (default "
+                               "'<output_dir>/<locale>/LC_MESSAGES/"
+                               "<domain>.mo')")
+        parser.add_option('--use-fuzzy', '-f', dest='use_fuzzy',
+                          action='store_true',
+                          help='also include fuzzy translations (default '
+                               '%default)')
+        parser.add_option('--statistics', dest='statistics',
+                          action='store_true',
+                          help='print statistics about translations')
+
+        parser.set_defaults(domain='messages', use_fuzzy=False,
+                            compile_all=False, statistics=False)
+        options, args = parser.parse_args(argv)
+
+        po_files = []
+        mo_files = []
+        if not options.input_file:
+            if not options.directory:
+                parser.error('you must specify either the input file or the '
+                             'base directory')
+            if options.locale:
+                po_files.append((options.locale,
+                                 os.path.join(options.directory,
+                                              options.locale, 'LC_MESSAGES',
+                                              options.domain + '.po')))
+                mo_files.append(os.path.join(options.directory, options.locale,
+                                             'LC_MESSAGES',
+                                             options.domain + '.mo'))
+            else:
+                for locale in os.listdir(options.directory):
+                    po_file = os.path.join(options.directory, locale,
+                                           'LC_MESSAGES', options.domain + '.po')
+                    if os.path.exists(po_file):
+                        po_files.append((locale, po_file))
+                        mo_files.append(os.path.join(options.directory, locale,
+                                                     'LC_MESSAGES',
+                                                     options.domain + '.mo'))
+        else:
+            po_files.append((options.locale, options.input_file))
+            if options.output_file:
+                mo_files.append(options.output_file)
+            else:
+                if not options.directory:
+                    parser.error('you must specify either the input file or '
+                                 'the base directory')
+                mo_files.append(os.path.join(options.directory, options.locale,
+                                             'LC_MESSAGES',
+                                             options.domain + '.mo'))
+        if not po_files:
+            parser.error('no message catalogs found')
+
+        for idx, (locale, po_file) in enumerate(po_files):
+            mo_file = mo_files[idx]
+            infile = open(po_file, 'r')
+            try:
+                catalog = read_po(infile, locale)
+            finally:
+                infile.close()
+
+            if options.statistics:
+                translated = 0
+                for message in list(catalog)[1:]:
+                    if message.string:
+                        translated +=1
+                percentage = 0
+                if len(catalog):
+                    percentage = translated * 100 // len(catalog)
+                self.log.info("%d of %d messages (%d%%) translated in %r",
+                              translated, len(catalog), percentage, po_file)
+
+            if catalog.fuzzy and not options.use_fuzzy:
+                self.log.warn('catalog %r is marked as fuzzy, skipping',
+                              po_file)
+                continue
+
+            for message, errors in catalog.check():
+                for error in errors:
+                    self.log.error('error: %s:%d: %s', po_file, message.lineno,
+                                   error)
+
+            self.log.info('compiling catalog %r to %r', po_file, mo_file)
+
+            outfile = open(mo_file, 'wb')
+            try:
+                write_mo(outfile, catalog, use_fuzzy=options.use_fuzzy)
+            finally:
+                outfile.close()
+
+    def extract(self, argv):
+        """Subcommand for extracting messages from source files and generating
+        a POT file.
+
+        :param argv: the command arguments
+        """
+        parser = OptionParser(usage=self.usage % ('extract', 'dir1 <dir2> ...'),
+                              description=self.commands['extract'])
+        parser.add_option('--charset', dest='charset',
+                          help='charset to use in the output (default '
+                               '"%default")')
+        parser.add_option('-k', '--keyword', dest='keywords', action='append',
+                          help='keywords to look for in addition to the '
+                               'defaults. You can specify multiple -k flags on '
+                               'the command line.')
+        parser.add_option('--no-default-keywords', dest='no_default_keywords',
+                          action='store_true',
+                          help="do not include the default keywords")
+        parser.add_option('--mapping', '-F', dest='mapping_file',
+                          help='path to the extraction mapping file')
+        parser.add_option('--no-location', dest='no_location',
+                          action='store_true',
+                          help='do not include location comments with filename '
+                               'and line number')
+        parser.add_option('--omit-header', dest='omit_header',
+                          action='store_true',
+                          help='do not include msgid "" entry in header')
+        parser.add_option('-o', '--output', dest='output',
+                          help='path to the output POT file')
+        parser.add_option('-w', '--width', dest='width', type='int',
+                          help="set output line width (default %default)")
+        parser.add_option('--no-wrap', dest='no_wrap', action = 'store_true',
+                          help='do not break long message lines, longer than '
+                               'the output line width, into several lines')
+        parser.add_option('--sort-output', dest='sort_output',
+                          action='store_true',
+                          help='generate sorted output (default False)')
+        parser.add_option('--sort-by-file', dest='sort_by_file',
+                          action='store_true',
+                          help='sort output by file location (default False)')
+        parser.add_option('--msgid-bugs-address', dest='msgid_bugs_address',
+                          metavar='EMAIL@ADDRESS',
+                          help='set report address for msgid')
+        parser.add_option('--copyright-holder', dest='copyright_holder',
+                          help='set copyright holder in output')
+        parser.add_option('--add-comments', '-c', dest='comment_tags',
+                          metavar='TAG', action='append',
+                          help='place comment block with TAG (or those '
+                               'preceding keyword lines) in output file. One '
+                               'TAG per argument call')
+        parser.add_option('--strip-comment-tags', '-s',
+                          dest='strip_comment_tags', action='store_true',
+                          help='Strip the comment tags from the comments.')
+
+        parser.set_defaults(charset='utf-8', keywords=[],
+                            no_default_keywords=False, no_location=False,
+                            omit_header = False, width=76, no_wrap=False,
+                            sort_output=False, sort_by_file=False,
+                            comment_tags=[], strip_comment_tags=False)
+        options, args = parser.parse_args(argv)
+        if not args:
+            parser.error('incorrect number of arguments')
+
+        if options.output not in (None, '-'):
+            outfile = open(options.output, 'w')
+        else:
+            outfile = sys.stdout
+
+        keywords = DEFAULT_KEYWORDS.copy()
+        if options.no_default_keywords:
+            if not options.keywords:
+                parser.error('you must specify new keywords if you disable the '
+                             'default ones')
+            keywords = {}
+        if options.keywords:
+            keywords.update(parse_keywords(options.keywords))
+
+        if options.mapping_file:
+            fileobj = open(options.mapping_file, 'U')
+            try:
+                method_map, options_map = parse_mapping(fileobj)
+            finally:
+                fileobj.close()
+        else:
+            method_map = DEFAULT_MAPPING
+            options_map = {}
+
+        if options.width and options.no_wrap:
+            parser.error("'--no-wrap' and '--width' are mutually exclusive.")
+        elif not options.width and not options.no_wrap:
+            options.width = 76
+        elif not options.width and options.no_wrap:
+            options.width = 0
+
+        if options.sort_output and options.sort_by_file:
+            parser.error("'--sort-output' and '--sort-by-file' are mutually "
+                         "exclusive")
+
+        try:
+            catalog = Catalog(msgid_bugs_address=options.msgid_bugs_address,
+                              copyright_holder=options.copyright_holder,
+                              charset=options.charset)
+
+            for dirname in args:
+                if not os.path.isdir(dirname):
+                    parser.error('%r is not a directory' % dirname)
+
+                def callback(filename, method, options):
+                    if method == 'ignore':
+                        return
+                    filepath = os.path.normpath(os.path.join(dirname, filename))
+                    optstr = ''
+                    if options:
+                        optstr = ' (%s)' % ', '.join(['%s="%s"' % (k, v) for
+                                                      k, v in options.items()])
+                    self.log.info('extracting messages from %s%s', filepath,
+                                  optstr)
+
+                extracted = extract_from_dir(dirname, method_map, options_map,
+                                             keywords, options.comment_tags,
+                                             callback=callback,
+                                             strip_comment_tags=
+                                                options.strip_comment_tags)
+                for filename, lineno, message, comments in extracted:
+                    filepath = os.path.normpath(os.path.join(dirname, filename))
+                    catalog.add(message, None, [(filepath, lineno)],
+                                auto_comments=comments)
+
+            if options.output not in (None, '-'):
+                self.log.info('writing PO template file to %s' % options.output)
+            write_po(outfile, catalog, width=options.width,
+                     no_location=options.no_location,
+                     omit_header=options.omit_header,
+                     sort_output=options.sort_output,
+                     sort_by_file=options.sort_by_file)
+        finally:
+            if options.output:
+                outfile.close()
+
+    def init(self, argv):
+        """Subcommand for creating new message catalogs from a template.
+
+        :param argv: the command arguments
+        """
+        parser = OptionParser(usage=self.usage % ('init', ''),
+                              description=self.commands['init'])
+        parser.add_option('--domain', '-D', dest='domain',
+                          help="domain of PO file (default '%default')")
+        parser.add_option('--input-file', '-i', dest='input_file',
+                          metavar='FILE', help='name of the input file')
+        parser.add_option('--output-dir', '-d', dest='output_dir',
+                          metavar='DIR', help='path to output directory')
+        parser.add_option('--output-file', '-o', dest='output_file',
+                          metavar='FILE',
+                          help="name of the output file (default "
+                               "'<output_dir>/<locale>/LC_MESSAGES/"
+                               "<domain>.po')")
+        parser.add_option('--locale', '-l', dest='locale', metavar='LOCALE',
+                          help='locale for the new localized catalog')
+
+        parser.set_defaults(domain='messages')
+        options, args = parser.parse_args(argv)
+
+        if not options.locale:
+            parser.error('you must provide a locale for the new catalog')
+        try:
+            locale = Locale.parse(options.locale)
+        except UnknownLocaleError, e:
+            parser.error(e)
+
+        if not options.input_file:
+            parser.error('you must specify the input file')
+
+        if not options.output_file and not options.output_dir:
+            parser.error('you must specify the output file or directory')
+
+        if not options.output_file:
+            options.output_file = os.path.join(options.output_dir,
+                                               options.locale, 'LC_MESSAGES',
+                                               options.domain + '.po')
+        if not os.path.exists(os.path.dirname(options.output_file)):
+            os.makedirs(os.path.dirname(options.output_file))
+
+        infile = open(options.input_file, 'r')
+        try:
+            # Although reading from the catalog template, read_po must be fed
+            # the locale in order to correcly calculate plurals
+            catalog = read_po(infile, locale=options.locale)
+        finally:
+            infile.close()
+
+        catalog.locale = locale
+        catalog.revision_date = datetime.now(LOCALTZ)
+
+        self.log.info('creating catalog %r based on %r', options.output_file,
+                      options.input_file)
+
+        outfile = open(options.output_file, 'w')
+        try:
+            write_po(outfile, catalog)
+        finally:
+            outfile.close()
+
+    def update(self, argv):
+        """Subcommand for updating existing message catalogs from a template.
+
+        :param argv: the command arguments
+        :since: version 0.9
+        """
+        parser = OptionParser(usage=self.usage % ('update', ''),
+                              description=self.commands['update'])
+        parser.add_option('--domain', '-D', dest='domain',
+                          help="domain of PO file (default '%default')")
+        parser.add_option('--input-file', '-i', dest='input_file',
+                          metavar='FILE', help='name of the input file')
+        parser.add_option('--output-dir', '-d', dest='output_dir',
+                          metavar='DIR', help='path to output directory')
+        parser.add_option('--output-file', '-o', dest='output_file',
+                          metavar='FILE',
+                          help="name of the output file (default "
+                               "'<output_dir>/<locale>/LC_MESSAGES/"
+                               "<domain>.po')")
+        parser.add_option('--locale', '-l', dest='locale', metavar='LOCALE',
+                          help='locale of the translations catalog')
+        parser.add_option('--ignore-obsolete', dest='ignore_obsolete',
+                          action='store_true',
+                          help='do not include obsolete messages in the output '
+                               '(default %default)'),
+        parser.add_option('--no-fuzzy-matching', '-N', dest='no_fuzzy_matching',
+                          action='store_true',
+                          help='do not use fuzzy matching (default %default)'),
+        parser.add_option('--previous', dest='previous', action='store_true',
+                          help='keep previous msgids of translated messages '
+                               '(default %default)'),
+
+        parser.set_defaults(domain='messages', ignore_obsolete=False,
+                            no_fuzzy_matching=False, previous=False)
+        options, args = parser.parse_args(argv)
+
+        if not options.input_file:
+            parser.error('you must specify the input file')
+        if not options.output_file and not options.output_dir:
+            parser.error('you must specify the output file or directory')
+        if options.output_file and not options.locale:
+            parser.error('you must specify the loicale')
+        if options.no_fuzzy_matching and options.previous:
+            options.previous = False
+
+        po_files = []
+        if not options.output_file:
+            if options.locale:
+                po_files.append((options.locale,
+                                 os.path.join(options.output_dir,
+                                              options.locale, 'LC_MESSAGES',
+                                              options.domain + '.po')))
+            else:
+                for locale in os.listdir(options.output_dir):
+                    po_file = os.path.join(options.output_dir, locale,
+                                           'LC_MESSAGES',
+                                           options.domain + '.po')
+                    if os.path.exists(po_file):
+                        po_files.append((locale, po_file))
+        else:
+            po_files.append((options.locale, options.output_file))
+
+        domain = options.domain
+        if not domain:
+            domain = os.path.splitext(os.path.basename(options.input_file))[0]
+
+        infile = open(options.input_file, 'U')
+        try:
+            template = read_po(infile)
+        finally:
+            infile.close()
+
+        if not po_files:
+            parser.error('no message catalogs found')
+
+        for locale, filename in po_files:
+            self.log.info('updating catalog %r based on %r', filename,
+                          options.input_file)
+            infile = open(filename, 'U')
+            try:
+                catalog = read_po(infile, locale=locale, domain=domain)
+            finally:
+                infile.close()
+
+            catalog.update(template, options.no_fuzzy_matching)
+
+            tmpname = os.path.join(os.path.dirname(filename),
+                                   tempfile.gettempprefix() +
+                                   os.path.basename(filename))
+            tmpfile = open(tmpname, 'w')
+            try:
+                try:
+                    write_po(tmpfile, catalog,
+                             ignore_obsolete=options.ignore_obsolete,
+                             include_previous=options.previous)
+                finally:
+                    tmpfile.close()
+            except:
+                os.remove(tmpname)
+                raise
+
+            try:
+                os.rename(tmpname, filename)
+            except OSError:
+                # We're probably on Windows, which doesn't support atomic
+                # renames, at least not through Python
+                # If the error is in fact due to a permissions problem, that
+                # same error is going to be raised from one of the following
+                # operations
+                os.remove(filename)
+                shutil.copy(tmpname, filename)
+                os.remove(tmpname)
+
+
+def main():
+    return CommandLineInterface().run(sys.argv)
+
+def parse_mapping(fileobj, filename=None):
+    """Parse an extraction method mapping from a file-like object.
+
+    >>> buf = StringIO('''
+    ... [extractors]
+    ... custom = mypackage.module:myfunc
+    ... 
+    ... # Python source files
+    ... [python: **.py]
+    ...
+    ... # Genshi templates
+    ... [genshi: **/templates/**.html]
+    ... include_attrs =
+    ... [genshi: **/templates/**.txt]
+    ... template_class = genshi.template:TextTemplate
+    ... encoding = latin-1
+    ... 
+    ... # Some custom extractor
+    ... [custom: **/custom/*.*]
+    ... ''')
+
+    >>> method_map, options_map = parse_mapping(buf)
+    >>> len(method_map)
+    4
+
+    >>> method_map[0]
+    ('**.py', 'python')
+    >>> options_map['**.py']
+    {}
+    >>> method_map[1]
+    ('**/templates/**.html', 'genshi')
+    >>> options_map['**/templates/**.html']['include_attrs']
+    ''
+    >>> method_map[2]
+    ('**/templates/**.txt', 'genshi')
+    >>> options_map['**/templates/**.txt']['template_class']
+    'genshi.template:TextTemplate'
+    >>> options_map['**/templates/**.txt']['encoding']
+    'latin-1'
+
+    >>> method_map[3]
+    ('**/custom/*.*', 'mypackage.module:myfunc')
+    >>> options_map['**/custom/*.*']
+    {}
+
+    :param fileobj: a readable file-like object containing the configuration
+                    text to parse
+    :return: a `(method_map, options_map)` tuple
+    :rtype: `tuple`
+    :see: `extract_from_directory`
+    """
+    extractors = {}
+    method_map = []
+    options_map = {}
+
+    parser = RawConfigParser()
+    parser._sections = odict(parser._sections) # We need ordered sections
+    parser.readfp(fileobj, filename)
+    for section in parser.sections():
+        if section == 'extractors':
+            extractors = dict(parser.items(section))
+        else:
+            method, pattern = [part.strip() for part in section.split(':', 1)]
+            method_map.append((pattern, method))
+            options_map[pattern] = dict(parser.items(section))
+
+    if extractors:
+        for idx, (pattern, method) in enumerate(method_map):
+            if method in extractors:
+                method = extractors[method]
+            method_map[idx] = (pattern, method)
+
+    return (method_map, options_map)
+
+def parse_keywords(strings=[]):
+    """Parse keywords specifications from the given list of strings.
+
+    >>> kw = parse_keywords(['_', 'dgettext:2', 'dngettext:2,3'])
+    >>> for keyword, indices in sorted(kw.items()):
+    ...     print (keyword, indices)
+    ('_', None)
+    ('dgettext', (2,))
+    ('dngettext', (2, 3))
+    """
+    keywords = {}
+    for string in strings:
+        if ':' in string:
+            funcname, indices = string.split(':')
+        else:
+            funcname, indices = string, None
+        if funcname not in keywords:
+            if indices:
+                indices = tuple([(int(x)) for x in indices.split(',')])
+            keywords[funcname] = indices
+    return keywords
+
+
+if __name__ == '__main__':
+    main()
Index: /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/babel/messages/plurals.py
===================================================================
--- /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/babel/messages/plurals.py (revision 3)
+++ /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/babel/messages/plurals.py (revision 3)
@@ -0,0 +1,256 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007 Edgewall Software
+# All rights reserved.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at http://babel.edgewall.org/wiki/License.
+#
+# This software consists of voluntary contributions made by many
+# individuals. For the exact contribution history, see the revision
+# history and logs, available at http://babel.edgewall.org/log/.
+
+"""Plural form definitions."""
+
+
+from operator import itemgetter
+from babel.core import default_locale, Locale
+
+
+LC_CTYPE = default_locale('LC_CTYPE')
+
+
+PLURALS = {
+    # Afar
+    # 'aa': (),
+    # Abkhazian
+    # 'ab': (),
+    # Avestan
+    # 'ae': (),
+    # Afrikaans - From Pootle's PO's
+    'af': (2, '(n != 1)'),
+    # Akan
+    # 'ak': (),
+    # Amharic
+    # 'am': (),
+    # Aragonese
+    # 'an': (),
+    # Arabic - From Pootle's PO's
+    'ar': (6, '(n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n>=3 && n<=10 ? 3 : n>=11 && n<=99 ? 4 : 5)'),
+    # Assamese
+    # 'as': (),
+    # Avaric
+    # 'av': (),
+    # Aymara
+    # 'ay': (),
+    # Azerbaijani
+    # 'az': (),
+    # Bashkir
+    # 'ba': (),
+    # Belarusian
+    # 'be': (),
+    # Bulgarian - From Pootle's PO's
+    'bg': (2, '(n != 1)'),
+    # Bihari
+    # 'bh': (),
+    # Bislama
+    # 'bi': (),
+    # Bambara
+    # 'bm': (),
+    # Bengali - From Pootle's PO's
+    'bn': (2, '(n != 1)'),
+    # Tibetan - as discussed in private with Andrew West
+    'bo': (1, '0'),
+    # Breton
+    # 'br': (),
+    # Bosnian
+    # 'bs': (),
+    # Catalan - From Pootle's PO's
+    'ca': (2, '(n != 1)'),
+    # Chechen
+    # 'ce': (),
+    # Chamorro
+    # 'ch': (),
+    # Corsican
+    # 'co': (),
+    # Cree
+    # 'cr': (),
+    # Czech
+    'cs': (3, '(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)'),
+    # Church Slavic
+    # 'cu': (),
+    # Chuvash
+    'cv': (1, '0'),
+    # Welsh
+    'cy': (5, '(n==1 ? 1 : n==2 ? 2 : n==3 ? 3 : n==6 ? 4 : 0)'),
+    # Danish
+    'da': (2, '(n != 1)'),
+    # German
+    'de': (2, '(n != 1)'),
+    # Divehi
+    # 'dv': (),
+    # Dzongkha
+    'dz': (1, '0'),
+    # Greek
+    'el': (2, '(n != 1)'),
+    # English
+    'en': (2, '(n != 1)'),
+    # Esperanto
+    'eo': (2, '(n != 1)'),
+    # Spanish
+    'es': (2, '(n != 1)'),
+    # Estonian
+    'et': (2, '(n != 1)'),
+    # Basque - From Pootle's PO's
+    'eu': (2, '(n != 1)'),
+    # Persian - From Pootle's PO's
+    'fa': (1, '0'),
+    # Finnish
+    'fi': (2, '(n != 1)'),
+    # French
+    'fr': (2, '(n > 1)'),
+    # Friulian - From Pootle's PO's
+    'fur': (2, '(n > 1)'),
+    # Irish
+    'ga': (3, '(n==1 ? 0 : n==2 ? 1 : 2)'),
+    # Galician - From Pootle's PO's
+    'gl': (2, '(n != 1)'),
+    # Hausa - From Pootle's PO's
+    'ha': (2, '(n != 1)'),
+    # Hebrew
+    'he': (2, '(n != 1)'),
+    # Hindi - From Pootle's PO's
+    'hi': (2, '(n != 1)'),
+    # Croatian
+    'hr': (3, '(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)'),
+    # Hungarian
+    'hu': (1, '0'),
+    # Armenian - From Pootle's PO's
+    'hy': (1, '0'),
+    # Icelandic - From Pootle's PO's
+    'is': (2, '(n != 1)'),
+    # Italian
+    'it': (2, '(n != 1)'),
+    # Japanese
+    'ja': (1, '0'),
+    # Georgian - From Pootle's PO's
+    'ka': (1, '0'),
+    # Kongo - From Pootle's PO's
+    'kg': (2, '(n != 1)'),
+    # Khmer - From Pootle's PO's
+    'km': (1, '0'),
+    # Korean
+    'ko': (1, '0'),
+    # Kurdish - From Pootle's PO's
+    'ku': (2, '(n != 1)'),
+    # Lao - Another member of the Tai language family, like Thai.
+    'lo': (1, '0'),
+    # Lithuanian
+    'lt': (3, '(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2)'),
+    # Latvian
+    'lv': (3, '(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2)'),
+    # Maltese - From Pootle's PO's
+    'mt': (4, '(n==1 ? 0 : n==0 || ( n%100>1 && n%100<11) ? 1 : (n%100>10 && n%100<20 ) ? 2 : 3)'),
+    # Norwegian Bokmﾃ･l
+    'nb': (2, '(n != 1)'),
+    # Dutch
+    'nl': (2, '(n != 1)'),
+    # Norwegian Nynorsk
+    'nn': (2, '(n != 1)'),
+    # Norwegian
+    'no': (2, '(n != 1)'),
+    # Punjabi - From Pootle's PO's
+    'pa': (2, '(n != 1)'),
+    # Polish
+    'pl': (3, '(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)'),
+    # Portuguese
+    'pt': (2, '(n != 1)'),
+    # Brazilian
+    'pt_BR': (2, '(n > 1)'),
+    # Romanian - From Pootle's PO's
+    'ro': (3, '(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2)'),
+    # Russian
+    'ru': (3, '(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)'),
+    # Slovak
+    'sk': (3, '(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)'),
+    # Slovenian
+    'sl': (4, '(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3)'),
+    # Serbian - From Pootle's PO's
+    'sr': (3, '(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10< =4 && (n%100<10 || n%100>=20) ? 1 : 2)'),
+    # Southern Sotho - From Pootle's PO's
+    'st': (2, '(n != 1)'),
+    # Swedish
+    'sv': (2, '(n != 1)'),
+    # Thai
+    'th': (1, '0'),
+    # Turkish
+    'tr': (1, '0'),
+    # Ukrainian
+    'uk': (3, '(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)'),
+    # Venda - From Pootle's PO's
+    've': (2, '(n != 1)'),
+    # Vietnamese - From Pootle's PO's
+    'vi': (1, '0'),
+    # Xhosa - From Pootle's PO's
+    'xh': (2, '(n != 1)'),
+    # Chinese - From Pootle's PO's
+    'zh_CN': (1, '0'),
+    'zh_HK': (1, '0'),
+    'zh_TW': (1, '0'),
+}
+
+
+DEFAULT_PLURAL = (2, '(n != 1)')
+
+
+class _PluralTuple(tuple):
+    """A tuple with plural information."""
+
+    __slots__ = ()
+    num_plurals = property(itemgetter(0), doc="""
+    The number of plurals used by the locale.""")
+    plural_expr = property(itemgetter(1), doc="""
+    The plural expression used by the locale.""")
+    plural_forms = property(lambda x: 'npurals=%s; plural=%s' % x, doc="""
+    The plural expression used by the catalog or locale.""")
+
+    def __str__(self):
+        return self.plural_forms
+
+
+def get_plural(locale=LC_CTYPE):
+    """A tuple with the information catalogs need to perform proper
+    pluralization.  The first item of the tuple is the number of plural
+    forms, the second the plural expression.
+
+    >>> get_plural(locale='en')
+    (2, '(n != 1)')
+    >>> get_plural(locale='ga')
+    (3, '(n==1 ? 0 : n==2 ? 1 : 2)')
+
+    The object returned is a special tuple with additional members:
+
+    >>> tup = get_plural("ja")
+    >>> tup.num_plurals
+    1
+    >>> tup.plural_expr
+    '0'
+    >>> tup.plural_forms
+    'npurals=1; plural=0'
+
+    Converting the tuple into a string prints the plural forms for a
+    gettext catalog:
+
+    >>> str(tup)
+    'npurals=1; plural=0'
+    """
+    locale = Locale.parse(locale)
+    try:
+        tup = PLURALS[str(locale)]
+    except KeyError:
+        try:
+            tup = PLURALS[locale.language]
+        except KeyError:
+            tup = DEFAULT_PLURAL
+    return _PluralTuple(tup)
Index: /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/babel/messages/checkers.py
===================================================================
--- /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/babel/messages/checkers.py (revision 3)
+++ /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/babel/messages/checkers.py (revision 3)
@@ -0,0 +1,179 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007 Edgewall Software
+# All rights reserved.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at http://babel.edgewall.org/wiki/License.
+#
+# This software consists of voluntary contributions made by many
+# individuals. For the exact contribution history, see the revision
+# history and logs, available at http://babel.edgewall.org/log/.
+
+"""Various routines that help with validation of translations.
+
+:since: version 0.9
+"""
+
+from itertools import izip
+from babel.messages.catalog import TranslationError, PYTHON_FORMAT
+
+#: list of format chars that are compatible to each other
+_string_format_compatibilities = [
+    set(['i', 'd', 'u']),
+    set(['x', 'X']),
+    set(['f', 'F', 'g', 'G'])
+]
+
+
+def num_plurals(catalog, message):
+    """Verify the number of plurals in the translation."""
+    if not message.pluralizable:
+        if not isinstance(message.string, basestring):
+            raise TranslationError("Found plural forms for non-pluralizable "
+                                   "message")
+        return
+
+    # skip further tests if no catalog is provided.
+    elif catalog is None:
+        return
+
+    msgstrs = message.string
+    if not isinstance(msgstrs, (list, tuple)):
+        msgstrs = (msgstrs,)
+    if len(msgstrs) != catalog.num_plurals:
+        raise TranslationError("Wrong number of plural forms (expected %d)" %
+                               catalog.num_plurals)
+
+
+def python_format(catalog, message):
+    """Verify the format string placeholders in the translation."""
+    if 'python-format' not in message.flags:
+        return
+    msgids = message.id
+    if not isinstance(msgids, (list, tuple)):
+        msgids = (msgids,)
+    msgstrs = message.string
+    if not isinstance(msgstrs, (list, tuple)):
+        msgstrs = (msgstrs,)
+
+    for msgid, msgstr in izip(msgids, msgstrs):
+        if msgstr:
+            _validate_format(msgid, msgstr)
+
+
+def _validate_format(format, alternative):
+    """Test format string `alternative` against `format`.  `format` can be the
+    msgid of a message and `alternative` one of the `msgstr`\s.  The two
+    arguments are not interchangeable as `alternative` may contain less
+    placeholders if `format` uses named placeholders.
+
+    If `format` does not use string formatting a `ValueError` is raised.
+
+    If the string formatting of `alternative` is compatible to `format` the
+    function returns `None`, otherwise a `TranslationError` is raised.
+
+    Examples for compatible format strings:
+
+    >>> _validate_format('Hello %s!', 'Hallo %s!')
+    >>> _validate_format('Hello %i!', 'Hallo %d!')
+
+    Example for an incompatible format strings:
+
+    >>> _validate_format('Hello %(name)s!', 'Hallo %s!')
+    Traceback (most recent call last):
+      ...
+    TranslationError: the format strings are of different kinds
+
+    This function is used by the `python_format` checker.
+
+    :param format: The original format string
+    :param alternative: The alternative format string that should be checked
+                        against format
+    :return: None on success
+    :raises TranslationError: on formatting errors
+    """
+
+    def _parse(string):
+        result = []
+        for match in PYTHON_FORMAT.finditer(string):
+            name, format, typechar = match.groups()
+            if typechar == '%' and name is None:
+                continue
+            result.append((name, str(typechar)))
+        return result
+
+    def _compatible(a, b):
+        if a == b:
+            return True
+        for set in _string_format_compatibilities:
+            if a in set and b in set:
+                return True
+        return False
+
+    def _check_positional(results):
+        positional = None
+        for name, char in results:
+            if positional is None:
+                positional = name is None
+            else:
+                if (name is None) != positional:
+                    raise TranslationError('format string mixes positional '
+                                           'and named placeholders')
+        return bool(positional)
+
+    a, b = map(_parse, (format, alternative))
+
+    # if a does not use string formattings, we are dealing with invalid
+    # input data.  This function only works if the first string provided
+    # does contain string format chars
+    if not a:
+        raise ValueError('original string provided does not use string '
+                         'formatting.')
+
+    # now check if both strings are positional or named
+    a_positional, b_positional = map(_check_positional, (a, b))
+    if a_positional and not b_positional and not b:
+        raise TranslationError('placeholders are incompatible')
+    elif a_positional != b_positional:
+        raise TranslationError('the format strings are of different kinds')
+
+    # if we are operating on positional strings both must have the
+    # same number of format chars and those must be compatible
+    if a_positional:
+        if len(a) != len(b):
+            raise TranslationError('positional format placeholders are '
+                                   'unbalanced')
+        for idx, ((_, first), (_, second)) in enumerate(izip(a, b)):
+            if not _compatible(first, second):
+                raise TranslationError('incompatible format for placeholder '
+                                       '%d: %r and %r are not compatible' %
+                                       (idx + 1, first, second))
+
+    # otherwise the second string must not have names the first one
+    # doesn't have and the types of those included must be compatible
+    else:
+        type_map = dict(a)
+        for name, typechar in b:
+            if name not in type_map:
+                raise TranslationError('unknown named placeholder %r' % name)
+            elif not _compatible(typechar, type_map[name]):
+                raise TranslationError('incompatible format for '
+                                       'placeholder %r: '
+                                       '%r and %r are not compatible' %
+                                       (name, typechar, type_map[name]))
+
+
+def _find_checkers():
+    try:
+        from pkg_resources import working_set
+    except ImportError:
+        return [num_plurals, python_format]
+    checkers = []
+    for entry_point in working_set.iter_entry_points('babel.checkers'):
+        checkers.append(entry_point.load())
+    return checkers
+
+
+checkers = _find_checkers()
Index: /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/EGG-INFO/SOURCES.txt
===================================================================
--- /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/EGG-INFO/SOURCES.txt (revision 3)
+++ /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/EGG-INFO/SOURCES.txt (revision 3)
@@ -0,0 +1,589 @@
+COPYING
+ChangeLog
+INSTALL.txt
+MANIFEST.in
+README.txt
+scramble.py
+setup.cfg
+setup.py
+Babel.egg-info/PKG-INFO
+Babel.egg-info/SOURCES.txt
+Babel.egg-info/dependency_links.txt
+Babel.egg-info/entry_points.txt
+Babel.egg-info/not-zip-safe
+Babel.egg-info/top_level.txt
+babel/__init__.py
+babel/core.py
+babel/dates.py
+babel/global.dat
+babel/localedata.py
+babel/numbers.py
+babel/support.py
+babel/util.py
+babel/localedata/aa.dat
+babel/localedata/aa_DJ.dat
+babel/localedata/aa_ER.dat
+babel/localedata/aa_ER_SAAHO.dat
+babel/localedata/aa_ET.dat
+babel/localedata/af.dat
+babel/localedata/af_NA.dat
+babel/localedata/af_ZA.dat
+babel/localedata/ak.dat
+babel/localedata/ak_GH.dat
+babel/localedata/am.dat
+babel/localedata/am_ET.dat
+babel/localedata/ar.dat
+babel/localedata/ar_AE.dat
+babel/localedata/ar_BH.dat
+babel/localedata/ar_DZ.dat
+babel/localedata/ar_EG.dat
+babel/localedata/ar_IQ.dat
+babel/localedata/ar_JO.dat
+babel/localedata/ar_KW.dat
+babel/localedata/ar_LB.dat
+babel/localedata/ar_LY.dat
+babel/localedata/ar_MA.dat
+babel/localedata/ar_OM.dat
+babel/localedata/ar_QA.dat
+babel/localedata/ar_SA.dat
+babel/localedata/ar_SD.dat
+babel/localedata/ar_SY.dat
+babel/localedata/ar_TN.dat
+babel/localedata/ar_YE.dat
+babel/localedata/as.dat
+babel/localedata/as_IN.dat
+babel/localedata/az.dat
+babel/localedata/az_AZ.dat
+babel/localedata/az_Cyrl.dat
+babel/localedata/az_Cyrl_AZ.dat
+babel/localedata/az_Latn.dat
+babel/localedata/az_Latn_AZ.dat
+babel/localedata/be.dat
+babel/localedata/be_BY.dat
+babel/localedata/bg.dat
+babel/localedata/bg_BG.dat
+babel/localedata/bn.dat
+babel/localedata/bn_BD.dat
+babel/localedata/bn_IN.dat
+babel/localedata/bs.dat
+babel/localedata/bs_BA.dat
+babel/localedata/byn.dat
+babel/localedata/byn_ER.dat
+babel/localedata/ca.dat
+babel/localedata/ca_ES.dat
+babel/localedata/cch.dat
+babel/localedata/cch_NG.dat
+babel/localedata/cop.dat
+babel/localedata/cs.dat
+babel/localedata/cs_CZ.dat
+babel/localedata/cy.dat
+babel/localedata/cy_GB.dat
+babel/localedata/da.dat
+babel/localedata/da_DK.dat
+babel/localedata/de.dat
+babel/localedata/de_AT.dat
+babel/localedata/de_BE.dat
+babel/localedata/de_CH.dat
+babel/localedata/de_DE.dat
+babel/localedata/de_LI.dat
+babel/localedata/de_LU.dat
+babel/localedata/dv.dat
+babel/localedata/dv_MV.dat
+babel/localedata/dz.dat
+babel/localedata/dz_BT.dat
+babel/localedata/ee.dat
+babel/localedata/ee_GH.dat
+babel/localedata/ee_TG.dat
+babel/localedata/el.dat
+babel/localedata/el_CY.dat
+babel/localedata/el_GR.dat
+babel/localedata/el_POLYTON.dat
+babel/localedata/en.dat
+babel/localedata/en_AS.dat
+babel/localedata/en_AU.dat
+babel/localedata/en_BE.dat
+babel/localedata/en_BW.dat
+babel/localedata/en_BZ.dat
+babel/localedata/en_CA.dat
+babel/localedata/en_Dsrt.dat
+babel/localedata/en_Dsrt_US.dat
+babel/localedata/en_GB.dat
+babel/localedata/en_GU.dat
+babel/localedata/en_HK.dat
+babel/localedata/en_IE.dat
+babel/localedata/en_IN.dat
+babel/localedata/en_JM.dat
+babel/localedata/en_MH.dat
+babel/localedata/en_MP.dat
+babel/localedata/en_MT.dat
+babel/localedata/en_NA.dat
+babel/localedata/en_NZ.dat
+babel/localedata/en_PH.dat
+babel/localedata/en_PK.dat
+babel/localedata/en_SG.dat
+babel/localedata/en_Shaw.dat
+babel/localedata/en_TT.dat
+babel/localedata/en_UM.dat
+babel/localedata/en_US.dat
+babel/localedata/en_US_POSIX.dat
+babel/localedata/en_VI.dat
+babel/localedata/en_ZA.dat
+babel/localedata/en_ZW.dat
+babel/localedata/eo.dat
+babel/localedata/es.dat
+babel/localedata/es_AR.dat
+babel/localedata/es_BO.dat
+babel/localedata/es_CL.dat
+babel/localedata/es_CO.dat
+babel/localedata/es_CR.dat
+babel/localedata/es_DO.dat
+babel/localedata/es_EC.dat
+babel/localedata/es_ES.dat
+babel/localedata/es_GT.dat
+babel/localedata/es_HN.dat
+babel/localedata/es_MX.dat
+babel/localedata/es_NI.dat
+babel/localedata/es_PA.dat
+babel/localedata/es_PE.dat
+babel/localedata/es_PR.dat
+babel/localedata/es_PY.dat
+babel/localedata/es_SV.dat
+babel/localedata/es_US.dat
+babel/localedata/es_UY.dat
+babel/localedata/es_VE.dat
+babel/localedata/et.dat
+babel/localedata/et_EE.dat
+babel/localedata/eu.dat
+babel/localedata/eu_ES.dat
+babel/localedata/fa.dat
+babel/localedata/fa_AF.dat
+babel/localedata/fa_IR.dat
+babel/localedata/fi.dat
+babel/localedata/fi_FI.dat
+babel/localedata/fil.dat
+babel/localedata/fil_PH.dat
+babel/localedata/fo.dat
+babel/localedata/fo_FO.dat
+babel/localedata/fr.dat
+babel/localedata/fr_BE.dat
+babel/localedata/fr_CA.dat
+babel/localedata/fr_CH.dat
+babel/localedata/fr_FR.dat
+babel/localedata/fr_LU.dat
+babel/localedata/fr_MC.dat
+babel/localedata/fr_SN.dat
+babel/localedata/fur.dat
+babel/localedata/fur_IT.dat
+babel/localedata/ga.dat
+babel/localedata/ga_IE.dat
+babel/localedata/gaa.dat
+babel/localedata/gaa_GH.dat
+babel/localedata/gez.dat
+babel/localedata/gez_ER.dat
+babel/localedata/gez_ET.dat
+babel/localedata/gl.dat
+babel/localedata/gl_ES.dat
+babel/localedata/gu.dat
+babel/localedata/gu_IN.dat
+babel/localedata/gv.dat
+babel/localedata/gv_GB.dat
+babel/localedata/ha.dat
+babel/localedata/ha_Arab.dat
+babel/localedata/ha_Arab_NG.dat
+babel/localedata/ha_Arab_SD.dat
+babel/localedata/ha_GH.dat
+babel/localedata/ha_Latn.dat
+babel/localedata/ha_Latn_GH.dat
+babel/localedata/ha_Latn_NE.dat
+babel/localedata/ha_Latn_NG.dat
+babel/localedata/ha_NE.dat
+babel/localedata/ha_NG.dat
+babel/localedata/ha_SD.dat
+babel/localedata/haw.dat
+babel/localedata/haw_US.dat
+babel/localedata/he.dat
+babel/localedata/he_IL.dat
+babel/localedata/hi.dat
+babel/localedata/hi_IN.dat
+babel/localedata/hr.dat
+babel/localedata/hr_HR.dat
+babel/localedata/hu.dat
+babel/localedata/hu_HU.dat
+babel/localedata/hy.dat
+babel/localedata/hy_AM.dat
+babel/localedata/hy_AM_REVISED.dat
+babel/localedata/ia.dat
+babel/localedata/id.dat
+babel/localedata/id_ID.dat
+babel/localedata/ig.dat
+babel/localedata/ig_NG.dat
+babel/localedata/ii.dat
+babel/localedata/ii_CN.dat
+babel/localedata/in.dat
+babel/localedata/is.dat
+babel/localedata/is_IS.dat
+babel/localedata/it.dat
+babel/localedata/it_CH.dat
+babel/localedata/it_IT.dat
+babel/localedata/iu.dat
+babel/localedata/iw.dat
+babel/localedata/ja.dat
+babel/localedata/ja_JP.dat
+babel/localedata/ka.dat
+babel/localedata/ka_GE.dat
+babel/localedata/kaj.dat
+babel/localedata/kaj_NG.dat
+babel/localedata/kam.dat
+babel/localedata/kam_KE.dat
+babel/localedata/kcg.dat
+babel/localedata/kcg_NG.dat
+babel/localedata/kfo.dat
+babel/localedata/kfo_CI.dat
+babel/localedata/kk.dat
+babel/localedata/kk_Cyrl.dat
+babel/localedata/kk_Cyrl_KZ.dat
+babel/localedata/kk_KZ.dat
+babel/localedata/kl.dat
+babel/localedata/kl_GL.dat
+babel/localedata/km.dat
+babel/localedata/km_KH.dat
+babel/localedata/kn.dat
+babel/localedata/kn_IN.dat
+babel/localedata/ko.dat
+babel/localedata/ko_KR.dat
+babel/localedata/kok.dat
+babel/localedata/kok_IN.dat
+babel/localedata/kpe.dat
+babel/localedata/kpe_GN.dat
+babel/localedata/kpe_LR.dat
+babel/localedata/ku.dat
+babel/localedata/ku_Arab.dat
+babel/localedata/ku_Latn.dat
+babel/localedata/ku_Latn_TR.dat
+babel/localedata/ku_TR.dat
+babel/localedata/kw.dat
+babel/localedata/kw_GB.dat
+babel/localedata/ky.dat
+babel/localedata/ky_KG.dat
+babel/localedata/ln.dat
+babel/localedata/ln_CD.dat
+babel/localedata/ln_CG.dat
+babel/localedata/lo.dat
+babel/localedata/lo_LA.dat
+babel/localedata/lt.dat
+babel/localedata/lt_LT.dat
+babel/localedata/lv.dat
+babel/localedata/lv_LV.dat
+babel/localedata/mk.dat
+babel/localedata/mk_MK.dat
+babel/localedata/ml.dat
+babel/localedata/ml_IN.dat
+babel/localedata/mn.dat
+babel/localedata/mn_CN.dat
+babel/localedata/mn_Cyrl.dat
+babel/localedata/mn_Cyrl_MN.dat
+babel/localedata/mn_MN.dat
+babel/localedata/mn_Mong.dat
+babel/localedata/mn_Mong_CN.dat
+babel/localedata/mo.dat
+babel/localedata/mr.dat
+babel/localedata/mr_IN.dat
+babel/localedata/ms.dat
+babel/localedata/ms_BN.dat
+babel/localedata/ms_MY.dat
+babel/localedata/mt.dat
+babel/localedata/mt_MT.dat
+babel/localedata/my.dat
+babel/localedata/my_MM.dat
+babel/localedata/nb.dat
+babel/localedata/nb_NO.dat
+babel/localedata/ne.dat
+babel/localedata/ne_IN.dat
+babel/localedata/ne_NP.dat
+babel/localedata/nl.dat
+babel/localedata/nl_BE.dat
+babel/localedata/nl_NL.dat
+babel/localedata/nn.dat
+babel/localedata/nn_NO.dat
+babel/localedata/no.dat
+babel/localedata/nr.dat
+babel/localedata/nr_ZA.dat
+babel/localedata/nso.dat
+babel/localedata/nso_ZA.dat
+babel/localedata/ny.dat
+babel/localedata/ny_MW.dat
+babel/localedata/om.dat
+babel/localedata/om_ET.dat
+babel/localedata/om_KE.dat
+babel/localedata/or.dat
+babel/localedata/or_IN.dat
+babel/localedata/pa.dat
+babel/localedata/pa_Arab.dat
+babel/localedata/pa_Arab_PK.dat
+babel/localedata/pa_Guru.dat
+babel/localedata/pa_Guru_IN.dat
+babel/localedata/pa_IN.dat
+babel/localedata/pa_PK.dat
+babel/localedata/pl.dat
+babel/localedata/pl_PL.dat
+babel/localedata/ps.dat
+babel/localedata/ps_AF.dat
+babel/localedata/pt.dat
+babel/localedata/pt_BR.dat
+babel/localedata/pt_PT.dat
+babel/localedata/ro.dat
+babel/localedata/ro_MD.dat
+babel/localedata/ro_RO.dat
+babel/localedata/root.dat
+babel/localedata/ru.dat
+babel/localedata/ru_RU.dat
+babel/localedata/ru_UA.dat
+babel/localedata/rw.dat
+babel/localedata/rw_RW.dat
+babel/localedata/sa.dat
+babel/localedata/sa_IN.dat
+babel/localedata/se.dat
+babel/localedata/se_FI.dat
+babel/localedata/se_NO.dat
+babel/localedata/sh.dat
+babel/localedata/sh_BA.dat
+babel/localedata/sh_CS.dat
+babel/localedata/sh_YU.dat
+babel/localedata/si.dat
+babel/localedata/si_LK.dat
+babel/localedata/sid.dat
+babel/localedata/sid_ET.dat
+babel/localedata/sk.dat
+babel/localedata/sk_SK.dat
+babel/localedata/sl.dat
+babel/localedata/sl_SI.dat
+babel/localedata/so.dat
+babel/localedata/so_DJ.dat
+babel/localedata/so_ET.dat
+babel/localedata/so_KE.dat
+babel/localedata/so_SO.dat
+babel/localedata/sq.dat
+babel/localedata/sq_AL.dat
+babel/localedata/sr.dat
+babel/localedata/sr_BA.dat
+babel/localedata/sr_CS.dat
+babel/localedata/sr_Cyrl.dat
+babel/localedata/sr_Cyrl_BA.dat
+babel/localedata/sr_Cyrl_CS.dat
+babel/localedata/sr_Cyrl_ME.dat
+babel/localedata/sr_Cyrl_RS.dat
+babel/localedata/sr_Cyrl_YU.dat
+babel/localedata/sr_Latn.dat
+babel/localedata/sr_Latn_BA.dat
+babel/localedata/sr_Latn_CS.dat
+babel/localedata/sr_Latn_ME.dat
+babel/localedata/sr_Latn_RS.dat
+babel/localedata/sr_Latn_YU.dat
+babel/localedata/sr_ME.dat
+babel/localedata/sr_RS.dat
+babel/localedata/sr_YU.dat
+babel/localedata/ss.dat
+babel/localedata/ss_SZ.dat
+babel/localedata/ss_ZA.dat
+babel/localedata/st.dat
+babel/localedata/st_LS.dat
+babel/localedata/st_ZA.dat
+babel/localedata/sv.dat
+babel/localedata/sv_FI.dat
+babel/localedata/sv_SE.dat
+babel/localedata/sw.dat
+babel/localedata/sw_KE.dat
+babel/localedata/sw_TZ.dat
+babel/localedata/syr.dat
+babel/localedata/syr_SY.dat
+babel/localedata/ta.dat
+babel/localedata/ta_IN.dat
+babel/localedata/te.dat
+babel/localedata/te_IN.dat
+babel/localedata/tg.dat
+babel/localedata/tg_Cyrl.dat
+babel/localedata/tg_Cyrl_TJ.dat
+babel/localedata/tg_TJ.dat
+babel/localedata/th.dat
+babel/localedata/th_TH.dat
+babel/localedata/ti.dat
+babel/localedata/ti_ER.dat
+babel/localedata/ti_ET.dat
+babel/localedata/tig.dat
+babel/localedata/tig_ER.dat
+babel/localedata/tl.dat
+babel/localedata/tn.dat
+babel/localedata/tn_ZA.dat
+babel/localedata/to.dat
+babel/localedata/to_TO.dat
+babel/localedata/tr.dat
+babel/localedata/tr_TR.dat
+babel/localedata/trv.dat
+babel/localedata/ts.dat
+babel/localedata/ts_ZA.dat
+babel/localedata/tt.dat
+babel/localedata/tt_RU.dat
+babel/localedata/ug.dat
+babel/localedata/ug_Arab.dat
+babel/localedata/ug_Arab_CN.dat
+babel/localedata/ug_CN.dat
+babel/localedata/uk.dat
+babel/localedata/uk_UA.dat
+babel/localedata/ur.dat
+babel/localedata/ur_IN.dat
+babel/localedata/ur_PK.dat
+babel/localedata/uz.dat
+babel/localedata/uz_AF.dat
+babel/localedata/uz_Arab.dat
+babel/localedata/uz_Arab_AF.dat
+babel/localedata/uz_Cyrl.dat
+babel/localedata/uz_Cyrl_UZ.dat
+babel/localedata/uz_Latn.dat
+babel/localedata/uz_Latn_UZ.dat
+babel/localedata/uz_UZ.dat
+babel/localedata/ve.dat
+babel/localedata/ve_ZA.dat
+babel/localedata/vi.dat
+babel/localedata/vi_VN.dat
+babel/localedata/wal.dat
+babel/localedata/wal_ET.dat
+babel/localedata/wo.dat
+babel/localedata/wo_Latn.dat
+babel/localedata/wo_Latn_SN.dat
+babel/localedata/wo_SN.dat
+babel/localedata/xh.dat
+babel/localedata/xh_ZA.dat
+babel/localedata/yo.dat
+babel/localedata/yo_NG.dat
+babel/localedata/zh.dat
+babel/localedata/zh_CN.dat
+babel/localedata/zh_HK.dat
+babel/localedata/zh_Hans.dat
+babel/localedata/zh_Hans_CN.dat
+babel/localedata/zh_Hans_HK.dat
+babel/localedata/zh_Hans_MO.dat
+babel/localedata/zh_Hans_SG.dat
+babel/localedata/zh_Hant.dat
+babel/localedata/zh_Hant_HK.dat
+babel/localedata/zh_Hant_MO.dat
+babel/localedata/zh_Hant_TW.dat
+babel/localedata/zh_MO.dat
+babel/localedata/zh_SG.dat
+babel/localedata/zh_TW.dat
+babel/localedata/zu.dat
+babel/localedata/zu_ZA.dat
+babel/messages/__init__.py
+babel/messages/catalog.py
+babel/messages/checkers.py
+babel/messages/extract.py
+babel/messages/frontend.py
+babel/messages/jslexer.py
+babel/messages/mofile.py
+babel/messages/plurals.py
+babel/messages/pofile.py
+babel/messages/tests/__init__.py
+babel/messages/tests/catalog.py
+babel/messages/tests/checkers.py
+babel/messages/tests/extract.py
+babel/messages/tests/frontend.py
+babel/messages/tests/mofile.py
+babel/messages/tests/plurals.py
+babel/messages/tests/pofile.py
+babel/messages/tests/data/mapping.cfg
+babel/messages/tests/data/setup.cfg
+babel/messages/tests/data/setup.py
+babel/messages/tests/data/project/__init__.py
+babel/messages/tests/data/project/file1.py
+babel/messages/tests/data/project/file2.py
+babel/messages/tests/data/project/i18n/messages.pot
+babel/messages/tests/data/project/i18n/messages_non_fuzzy.pot
+babel/messages/tests/data/project/i18n/de_DE/LC_MESSAGES/messages.po
+babel/messages/tests/data/project/i18n/ru_RU/LC_MESSAGES/messages.po
+babel/tests/__init__.py
+babel/tests/core.py
+babel/tests/dates.py
+babel/tests/localedata.py
+babel/tests/numbers.py
+babel/tests/support.py
+babel/tests/util.py
+contrib/babel.js
+doc/cmdline.html
+doc/cmdline.txt
+doc/dates.html
+doc/dates.txt
+doc/display.html
+doc/display.txt
+doc/index.html
+doc/index.txt
+doc/intro.html
+doc/intro.txt
+doc/logo.pdf
+doc/logo.png
+doc/logo_small.png
+doc/messages.html
+doc/messages.txt
+doc/numbers.html
+doc/numbers.txt
+doc/setup.html
+doc/setup.txt
+doc/support.html
+doc/support.txt
+doc/api/api-objects.txt
+doc/api/babel-module.html
+doc/api/babel.core-module.html
+doc/api/babel.core.Locale-class.html
+doc/api/babel.core.UnknownLocaleError-class.html
+doc/api/babel.dates-module.html
+doc/api/babel.localedata-module.html
+doc/api/babel.messages-module.html
+doc/api/babel.messages.catalog-module.html
+doc/api/babel.messages.catalog.Catalog-class.html
+doc/api/babel.messages.catalog.Message-class.html
+doc/api/babel.messages.catalog.TranslationError-class.html
+doc/api/babel.messages.checkers-module.html
+doc/api/babel.messages.extract-module.html
+doc/api/babel.messages.frontend-module.html
+doc/api/babel.messages.frontend.CommandLineInterface-class.html
+doc/api/babel.messages.frontend.compile_catalog-class.html
+doc/api/babel.messages.frontend.extract_messages-class.html
+doc/api/babel.messages.frontend.init_catalog-class.html
+doc/api/babel.messages.frontend.update_catalog-class.html
+doc/api/babel.messages.jslexer-module.html
+doc/api/babel.messages.jslexer.Token-class.html
+doc/api/babel.messages.mofile-module.html
+doc/api/babel.messages.plurals-module.html
+doc/api/babel.messages.pofile-module.html
+doc/api/babel.numbers-module.html
+doc/api/babel.numbers.NumberFormatError-class.html
+doc/api/babel.support-module.html
+doc/api/babel.support.Format-class.html
+doc/api/babel.support.LazyProxy-class.html
+doc/api/babel.support.Translations-class.html
+doc/api/babel.util-module.html
+doc/api/babel.util.odict-class.html
+doc/api/class-tree.html
+doc/api/crarr.png
+doc/api/epydoc.css
+doc/api/epydoc.js
+doc/api/help.html
+doc/api/identifier-index.html
+doc/api/index.html
+doc/api/module-tree.html
+doc/api/redirect.html
+doc/api/since-index.html
+doc/common/COPYING
+doc/common/README.txt
+doc/common/doctools.py
+doc/common/template.html
+doc/common/conf/docutils.ini
+doc/common/conf/epydoc.ini
+doc/common/style/bkgnd_pattern.png
+doc/common/style/docutils.css
+doc/common/style/edgewall.css
+doc/common/style/epydoc.css
+doc/common/style/pygments.css
+doc/common/style/shadow.gif
+doc/common/style/vertbars.png
+scripts/dump_data.py
+scripts/dump_global.py
+scripts/import_cldr.py
Index: /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/EGG-INFO/top_level.txt
===================================================================
--- /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/EGG-INFO/top_level.txt (revision 3)
+++ /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/EGG-INFO/top_level.txt (revision 3)
@@ -0,0 +1,1 @@
+babel
Index: /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/EGG-INFO/PKG-INFO
===================================================================
--- /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/EGG-INFO/PKG-INFO (revision 3)
+++ /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/EGG-INFO/PKG-INFO (revision 3)
@@ -0,0 +1,18 @@
+Metadata-Version: 1.0
+Name: Babel
+Version: 0.9.4
+Summary: Internationalization utilities
+Home-page: http://babel.edgewall.org/
+Author: Edgewall Software
+Author-email: info@edgewall.org
+License: BSD
+Download-URL: http://babel.edgewall.org/wiki/Download
+Description: A collection of tools for internationalizing Python applications.
+Platform: UNKNOWN
+Classifier: Development Status :: 4 - Beta
+Classifier: Environment :: Web Environment
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: BSD License
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python
+Classifier: Topic :: Software Development :: Libraries :: Python Modules
Index: /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/EGG-INFO/entry_points.txt
===================================================================
--- /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/EGG-INFO/entry_points.txt (revision 3)
+++ /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/EGG-INFO/entry_points.txt (revision 3)
@@ -0,0 +1,22 @@
+
+    [console_scripts]
+    pybabel = babel.messages.frontend:main
+    
+    [distutils.commands]
+    compile_catalog = babel.messages.frontend:compile_catalog
+    extract_messages = babel.messages.frontend:extract_messages
+    init_catalog = babel.messages.frontend:init_catalog
+    update_catalog = babel.messages.frontend:update_catalog
+    
+    [distutils.setup_keywords]
+    message_extractors = babel.messages.frontend:check_message_extractors
+    
+    [babel.checkers]
+    num_plurals = babel.messages.checkers:num_plurals
+    python_format = babel.messages.checkers:python_format
+    
+    [babel.extractors]
+    ignore = babel.messages.extract:extract_nothing
+    python = babel.messages.extract:extract_python
+    javascript = babel.messages.extract:extract_javascript
+    
Index: /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/EGG-INFO/dependency_links.txt
===================================================================
--- /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/EGG-INFO/dependency_links.txt (revision 3)
+++ /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/EGG-INFO/dependency_links.txt (revision 3)
@@ -0,0 +1,1 @@
+
Index: /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/EGG-INFO/not-zip-safe
===================================================================
--- /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/EGG-INFO/not-zip-safe (revision 3)
+++ /galaxy-central/eggs/Babel-0.9.4-py2.6.egg/EGG-INFO/not-zip-safe (revision 3)
@@ -0,0 +1,1 @@
+
Index: /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Protocol/__init__.py
===================================================================
--- /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Protocol/__init__.py (revision 3)
+++ /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Protocol/__init__.py (revision 3)
@@ -0,0 +1,17 @@
+
+"""Cryptographic protocols
+
+Implements various cryptographic protocols.  (Don't expect to find
+network protocols here.)
+
+Crypto.Protocol.AllOrNothing   Transforms a message into a set of message
+                               blocks, such that the blocks can be
+                               recombined to get the message back.
+
+Crypto.Protocol.Chaffing       Takes a set of authenticated message blocks
+                               (the wheat) and adds a number of
+                               randomly generated blocks (the chaff).
+"""
+
+__all__ = ['AllOrNothing', 'Chaffing']
+__revision__ = "$Id: __init__.py,v 1.4 2003/02/28 15:23:21 akuchling Exp $"
Index: /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Protocol/AllOrNothing.py
===================================================================
--- /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Protocol/AllOrNothing.py (revision 3)
+++ /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Protocol/AllOrNothing.py (revision 3)
@@ -0,0 +1,295 @@
+"""This file implements all-or-nothing package transformations.
+
+An all-or-nothing package transformation is one in which some text is
+transformed into message blocks, such that all blocks must be obtained before
+the reverse transformation can be applied.  Thus, if any blocks are corrupted
+or lost, the original message cannot be reproduced.
+
+An all-or-nothing package transformation is not encryption, although a block
+cipher algorithm is used.  The encryption key is randomly generated and is
+extractable from the message blocks.
+
+This class implements the All-Or-Nothing package transformation algorithm
+described in:
+
+Ronald L. Rivest.  "All-Or-Nothing Encryption and The Package Transform"
+http://theory.lcs.mit.edu/~rivest/fusion.pdf
+
+"""
+
+__revision__ = "$Id: AllOrNothing.py,v 1.8 2003/02/28 15:23:20 akuchling Exp $"
+
+import operator
+import string
+from Crypto.Util.number import bytes_to_long, long_to_bytes
+
+
+
+class AllOrNothing:
+    """Class implementing the All-or-Nothing package transform.
+
+    Methods for subclassing:
+
+        _inventkey(key_size):
+            Returns a randomly generated key.  Subclasses can use this to
+            implement better random key generating algorithms.  The default
+            algorithm is probably not very cryptographically secure.
+
+    """
+
+    def __init__(self, ciphermodule, mode=None, IV=None):
+        """AllOrNothing(ciphermodule, mode=None, IV=None)
+
+        ciphermodule is a module implementing the cipher algorithm to
+        use.  It must provide the PEP272 interface.
+
+        Note that the encryption key is randomly generated
+        automatically when needed.  Optional arguments mode and IV are
+        passed directly through to the ciphermodule.new() method; they
+        are the feedback mode and initialization vector to use.  All
+        three arguments must be the same for the object used to create
+        the digest, and to undigest'ify the message blocks.
+        """
+
+        self.__ciphermodule = ciphermodule
+        self.__mode = mode
+        self.__IV = IV
+        self.__key_size = ciphermodule.key_size
+        if self.__key_size == 0:
+            self.__key_size = 16
+
+    __K0digit = chr(0x69)
+
+    def digest(self, text):
+        """digest(text:string) : [string]
+
+        Perform the All-or-Nothing package transform on the given
+        string.  Output is a list of message blocks describing the
+        transformed text, where each block is a string of bit length equal
+        to the ciphermodule's block_size.
+        """
+
+        # generate a random session key and K0, the key used to encrypt the
+        # hash blocks.  Rivest calls this a fixed, publically-known encryption
+        # key, but says nothing about the security implications of this key or
+        # how to choose it.
+        key = self._inventkey(self.__key_size)
+        K0 = self.__K0digit * self.__key_size
+
+        # we need two cipher objects here, one that is used to encrypt the
+        # message blocks and one that is used to encrypt the hashes.  The
+        # former uses the randomly generated key, while the latter uses the
+        # well-known key.
+        mcipher = self.__newcipher(key)
+        hcipher = self.__newcipher(K0)
+
+        # Pad the text so that its length is a multiple of the cipher's
+        # block_size.  Pad with trailing spaces, which will be eliminated in
+        # the undigest() step.
+        block_size = self.__ciphermodule.block_size
+        padbytes = block_size - (len(text) % block_size)
+        text = text + ' ' * padbytes
+
+        # Run through the algorithm:
+        # s: number of message blocks (size of text / block_size)
+        # input sequence: m1, m2, ... ms
+        # random key K' (`key' in the code)
+        # Compute output sequence: m'1, m'2, ... m's' for s' = s + 1
+        # Let m'i = mi ^ E(K', i) for i = 1, 2, 3, ..., s
+        # Let m's' = K' ^ h1 ^ h2 ^ ... hs
+        # where hi = E(K0, m'i ^ i) for i = 1, 2, ... s
+        #
+        # The one complication I add is that the last message block is hard
+        # coded to the number of padbytes added, so that these can be stripped
+        # during the undigest() step
+        s = len(text) / block_size
+        blocks = []
+        hashes = []
+        for i in range(1, s+1):
+            start = (i-1) * block_size
+            end = start + block_size
+            mi = text[start:end]
+            assert len(mi) == block_size
+            cipherblock = mcipher.encrypt(long_to_bytes(i, block_size))
+            mticki = bytes_to_long(mi) ^ bytes_to_long(cipherblock)
+            blocks.append(mticki)
+            # calculate the hash block for this block
+            hi = hcipher.encrypt(long_to_bytes(mticki ^ i, block_size))
+            hashes.append(bytes_to_long(hi))
+
+        # Add the padbytes length as a message block
+        i = i + 1
+        cipherblock = mcipher.encrypt(long_to_bytes(i, block_size))
+        mticki = padbytes ^ bytes_to_long(cipherblock)
+        blocks.append(mticki)
+
+        # calculate this block's hash
+        hi = hcipher.encrypt(long_to_bytes(mticki ^ i, block_size))
+        hashes.append(bytes_to_long(hi))
+
+        # Now calculate the last message block of the sequence 1..s'.  This
+        # will contain the random session key XOR'd with all the hash blocks,
+        # so that for undigest(), once all the hash blocks are calculated, the
+        # session key can be trivially extracted.  Calculating all the hash
+        # blocks requires that all the message blocks be received, thus the
+        # All-or-Nothing algorithm succeeds.
+        mtick_stick = bytes_to_long(key) ^ reduce(operator.xor, hashes)
+        blocks.append(mtick_stick)
+
+        # we convert the blocks to strings since in Python, byte sequences are
+        # always represented as strings.  This is more consistent with the
+        # model that encryption and hash algorithms always operate on strings.
+        return map(long_to_bytes, blocks)
+
+
+    def undigest(self, blocks):
+        """undigest(blocks : [string]) : string
+
+        Perform the reverse package transformation on a list of message
+        blocks.  Note that the ciphermodule used for both transformations
+        must be the same.  blocks is a list of strings of bit length
+        equal to the ciphermodule's block_size.
+        """
+
+        # better have at least 2 blocks, for the padbytes package and the hash
+        # block accumulator
+        if len(blocks) < 2:
+            raise ValueError, "List must be at least length 2."
+
+        # blocks is a list of strings.  We need to deal with them as long
+        # integers
+        blocks = map(bytes_to_long, blocks)
+
+        # Calculate the well-known key, to which the hash blocks are
+        # encrypted, and create the hash cipher.
+        K0 = self.__K0digit * self.__key_size
+        hcipher = self.__newcipher(K0)
+
+        # Since we have all the blocks (or this method would have been called
+        # prematurely), we can calcualte all the hash blocks.
+        hashes = []
+        for i in range(1, len(blocks)):
+            mticki = blocks[i-1] ^ i
+            hi = hcipher.encrypt(long_to_bytes(mticki))
+            hashes.append(bytes_to_long(hi))
+
+        # now we can calculate K' (key).  remember the last block contains
+        # m's' which we don't include here
+        key = blocks[-1] ^ reduce(operator.xor, hashes)
+
+        # and now we can create the cipher object
+        mcipher = self.__newcipher(long_to_bytes(key))
+        block_size = self.__ciphermodule.block_size
+
+        # And we can now decode the original message blocks
+        parts = []
+        for i in range(1, len(blocks)):
+            cipherblock = mcipher.encrypt(long_to_bytes(i, block_size))
+            mi = blocks[i-1] ^ bytes_to_long(cipherblock)
+            parts.append(mi)
+
+        # The last message block contains the number of pad bytes appended to
+        # the original text string, such that its length was an even multiple
+        # of the cipher's block_size.  This number should be small enough that
+        # the conversion from long integer to integer should never overflow
+        padbytes = int(parts[-1])
+        text = string.join(map(long_to_bytes, parts[:-1]), '')
+        return text[:-padbytes]
+
+    def _inventkey(self, key_size):
+        # TBD: Not a very secure algorithm.  Eventually, I'd like to use JHy's
+        # kernelrand module
+        import time
+        from Crypto.Util import randpool
+        # TBD: key_size * 2 to work around possible bug in RandomPool?
+        pool = randpool.RandomPool(key_size * 2)
+        while key_size > pool.entropy:
+            pool.add_event()
+
+        # we now have enough entropy in the pool to get a key_size'd key
+        return pool.get_bytes(key_size)
+
+    def __newcipher(self, key):
+        if self.__mode is None and self.__IV is None:
+            return self.__ciphermodule.new(key)
+        elif self.__IV is None:
+            return self.__ciphermodule.new(key, self.__mode)
+        else:
+            return self.__ciphermodule.new(key, self.__mode, self.__IV)
+
+
+
+if __name__ == '__main__':
+    import sys
+    import getopt
+    import base64
+
+    usagemsg = '''\
+Test module usage: %(program)s [-c cipher] [-l] [-h]
+
+Where:
+    --cipher module
+    -c module
+        Cipher module to use.  Default: %(ciphermodule)s
+
+    --aslong
+    -l
+        Print the encoded message blocks as long integers instead of base64
+        encoded strings
+
+    --help
+    -h
+        Print this help message
+'''
+
+    ciphermodule = 'AES'
+    aslong = 0
+
+    def usage(code, msg=None):
+        if msg:
+            print msg
+        print usagemsg % {'program': sys.argv[0],
+                          'ciphermodule': ciphermodule}
+        sys.exit(code)
+
+    try:
+        opts, args = getopt.getopt(sys.argv[1:],
+                                   'c:l', ['cipher=', 'aslong'])
+    except getopt.error, msg:
+        usage(1, msg)
+
+    if args:
+        usage(1, 'Too many arguments')
+
+    for opt, arg in opts:
+        if opt in ('-h', '--help'):
+            usage(0)
+        elif opt in ('-c', '--cipher'):
+            ciphermodule = arg
+        elif opt in ('-l', '--aslong'):
+            aslong = 1
+
+    # ugly hack to force __import__ to give us the end-path module
+    module = __import__('Crypto.Cipher.'+ciphermodule, None, None, ['new'])
+
+    a = AllOrNothing(module)
+    print 'Original text:\n=========='
+    print __doc__
+    print '=========='
+    msgblocks = a.digest(__doc__)
+    print 'message blocks:'
+    for i, blk in map(None, range(len(msgblocks)), msgblocks):
+        # base64 adds a trailing newline
+        print '    %3d' % i,
+        if aslong:
+            print bytes_to_long(blk)
+        else:
+            print base64.encodestring(blk)[:-1]
+    #
+    # get a new undigest-only object so there's no leakage
+    b = AllOrNothing(module)
+    text = b.undigest(msgblocks)
+    if text == __doc__:
+        print 'They match!'
+    else:
+        print 'They differ!'
Index: /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Protocol/Chaffing.py
===================================================================
--- /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Protocol/Chaffing.py (revision 3)
+++ /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Protocol/Chaffing.py (revision 3)
@@ -0,0 +1,229 @@
+"""This file implements the chaffing algorithm.
+
+Winnowing and chaffing is a technique for enhancing privacy without requiring
+strong encryption.  In short, the technique takes a set of authenticated
+message blocks (the wheat) and adds a number of chaff blocks which have
+randomly chosen data and MAC fields.  This means that to an adversary, the
+chaff blocks look as valid as the wheat blocks, and so the authentication
+would have to be performed on every block.  By tailoring the number of chaff
+blocks added to the message, the sender can make breaking the message
+computationally infeasible.  There are many other interesting properties of
+the winnow/chaff technique.
+
+For example, say Alice is sending a message to Bob.  She packetizes the
+message and performs an all-or-nothing transformation on the packets.  Then
+she authenticates each packet with a message authentication code (MAC).  The
+MAC is a hash of the data packet, and there is a secret key which she must
+share with Bob (key distribution is an exercise left to the reader).  She then
+adds a serial number to each packet, and sends the packets to Bob.
+
+Bob receives the packets, and using the shared secret authentication key,
+authenticates the MACs for each packet.  Those packets that have bad MACs are
+simply discarded.  The remainder are sorted by serial number, and passed
+through the reverse all-or-nothing transform.  The transform means that an
+eavesdropper (say Eve) must acquire all the packets before any of the data can
+be read.  If even one packet is missing, the data is useless.
+
+There's one twist: by adding chaff packets, Alice and Bob can make Eve's job
+much harder, since Eve now has to break the shared secret key, or try every
+combination of wheat and chaff packet to read any of the message.  The cool
+thing is that Bob doesn't need to add any additional code; the chaff packets
+are already filtered out because their MACs don't match (in all likelihood --
+since the data and MACs for the chaff packets are randomly chosen it is
+possible, but very unlikely that a chaff MAC will match the chaff data).  And
+Alice need not even be the party adding the chaff!  She could be completely
+unaware that a third party, say Charles, is adding chaff packets to her
+messages as they are transmitted.
+
+For more information on winnowing and chaffing see this paper:
+
+Ronald L. Rivest, "Chaffing and Winnowing: Confidentiality without Encryption"
+http://theory.lcs.mit.edu/~rivest/chaffing.txt
+
+"""
+
+__revision__ = "$Id: Chaffing.py,v 1.7 2003/02/28 15:23:21 akuchling Exp $"
+
+from Crypto.Util.number import bytes_to_long
+
+class Chaff:
+    """Class implementing the chaff adding algorithm.
+
+    Methods for subclasses:
+
+            _randnum(size):
+                Returns a randomly generated number with a byte-length equal
+                to size.  Subclasses can use this to implement better random
+                data and MAC generating algorithms.  The default algorithm is
+                probably not very cryptographically secure.  It is most
+                important that the chaff data does not contain any patterns
+                that can be used to discern it from wheat data without running
+                the MAC.
+
+    """
+
+    def __init__(self, factor=1.0, blocksper=1):
+        """Chaff(factor:float, blocksper:int)
+
+        factor is the number of message blocks to add chaff to,
+        expressed as a percentage between 0.0 and 1.0.  blocksper is
+        the number of chaff blocks to include for each block being
+        chaffed.  Thus the defaults add one chaff block to every
+        message block.  By changing the defaults, you can adjust how
+        computationally difficult it could be for an adversary to
+        brute-force crack the message.  The difficulty is expressed
+        as:
+
+            pow(blocksper, int(factor * number-of-blocks))
+
+        For ease of implementation, when factor < 1.0, only the first
+        int(factor*number-of-blocks) message blocks are chaffed.
+        """
+
+        if not (0.0<=factor<=1.0):
+            raise ValueError, "'factor' must be between 0.0 and 1.0"
+        if blocksper < 0:
+            raise ValueError, "'blocksper' must be zero or more"
+
+        self.__factor = factor
+        self.__blocksper = blocksper
+
+
+    def chaff(self, blocks):
+        """chaff( [(serial-number:int, data:string, MAC:string)] )
+        : [(int, string, string)]
+
+        Add chaff to message blocks.  blocks is a list of 3-tuples of the
+        form (serial-number, data, MAC).
+
+        Chaff is created by choosing a random number of the same
+        byte-length as data, and another random number of the same
+        byte-length as MAC.  The message block's serial number is
+        placed on the chaff block and all the packet's chaff blocks
+        are randomly interspersed with the single wheat block.  This
+        method then returns a list of 3-tuples of the same form.
+        Chaffed blocks will contain multiple instances of 3-tuples
+        with the same serial number, but the only way to figure out
+        which blocks are wheat and which are chaff is to perform the
+        MAC hash and compare values.
+        """
+
+        chaffedblocks = []
+
+        # count is the number of blocks to add chaff to.  blocksper is the
+        # number of chaff blocks to add per message block that is being
+        # chaffed.
+        count = len(blocks) * self.__factor
+        blocksper = range(self.__blocksper)
+        for i, wheat in map(None, range(len(blocks)), blocks):
+            # it shouldn't matter which of the n blocks we add chaff to, so for
+            # ease of implementation, we'll just add them to the first count
+            # blocks
+            if i < count:
+                serial, data, mac = wheat
+                datasize = len(data)
+                macsize = len(mac)
+                addwheat = 1
+                # add chaff to this block
+                for j in blocksper:
+                    import sys
+                    chaffdata = self._randnum(datasize)
+                    chaffmac = self._randnum(macsize)
+                    chaff = (serial, chaffdata, chaffmac)
+                    # mix up the order, if the 5th bit is on then put the
+                    # wheat on the list
+                    if addwheat and bytes_to_long(self._randnum(16)) & 0x40:
+                        chaffedblocks.append(wheat)
+                        addwheat = 0
+                    chaffedblocks.append(chaff)
+                if addwheat:
+                    chaffedblocks.append(wheat)
+            else:
+                # just add the wheat
+                chaffedblocks.append(wheat)
+        return chaffedblocks
+
+    def _randnum(self, size):
+        # TBD: Not a very secure algorithm.
+        # TBD: size * 2 to work around possible bug in RandomPool
+        from Crypto.Util import randpool
+        import time
+        pool = randpool.RandomPool(size * 2)
+        while size > pool.entropy:
+            pass
+
+        # we now have enough entropy in the pool to get size bytes of random
+        # data... well, probably
+        return pool.get_bytes(size)
+
+
+
+if __name__ == '__main__':
+    text = """\
+We hold these truths to be self-evident, that all men are created equal, that
+they are endowed by their Creator with certain unalienable Rights, that among
+these are Life, Liberty, and the pursuit of Happiness. That to secure these
+rights, Governments are instituted among Men, deriving their just powers from
+the consent of the governed. That whenever any Form of Government becomes
+destructive of these ends, it is the Right of the People to alter or to
+abolish it, and to institute new Government, laying its foundation on such
+principles and organizing its powers in such form, as to them shall seem most
+likely to effect their Safety and Happiness.
+"""
+    print 'Original text:\n=========='
+    print text
+    print '=========='
+
+    # first transform the text into packets
+    blocks = [] ; size = 40
+    for i in range(0, len(text), size):
+        blocks.append( text[i:i+size] )
+
+    # now get MACs for all the text blocks.  The key is obvious...
+    print 'Calculating MACs...'
+    from Crypto.Hash import HMAC, SHA
+    key = 'Jefferson'
+    macs = [HMAC.new(key, block, digestmod=SHA).digest()
+            for block in blocks]
+
+    assert len(blocks) == len(macs)
+
+    # put these into a form acceptable as input to the chaffing procedure
+    source = []
+    m = map(None, range(len(blocks)), blocks, macs)
+    print m
+    for i, data, mac in m:
+        source.append((i, data, mac))
+
+    # now chaff these
+    print 'Adding chaff...'
+    c = Chaff(factor=0.5, blocksper=2)
+    chaffed = c.chaff(source)
+
+    from base64 import encodestring
+
+    # print the chaffed message blocks.  meanwhile, separate the wheat from
+    # the chaff
+
+    wheat = []
+    print 'chaffed message blocks:'
+    for i, data, mac in chaffed:
+        # do the authentication
+        h = HMAC.new(key, data, digestmod=SHA)
+        pmac = h.digest()
+        if pmac == mac:
+            tag = '-->'
+            wheat.append(data)
+        else:
+            tag = '   '
+        # base64 adds a trailing newline
+        print tag, '%3d' % i, \
+              repr(data), encodestring(mac)[:-1]
+
+    # now decode the message packets and check it against the original text
+    print 'Undigesting wheat...'
+    newtext = "".join(wheat)
+    if newtext == text:
+        print 'They match!'
+    else:
+        print 'They differ!'
Index: /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Hash/HMAC.py
===================================================================
--- /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Hash/HMAC.py (revision 3)
+++ /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Hash/HMAC.py (revision 3)
@@ -0,0 +1,108 @@
+"""HMAC (Keyed-Hashing for Message Authentication) Python module.
+
+Implements the HMAC algorithm as described by RFC 2104.
+
+This is just a copy of the Python 2.2 HMAC module, modified to work when
+used on versions of Python before 2.2.
+"""
+
+__revision__ = "$Id: HMAC.py,v 1.5 2002/07/25 17:19:02 z3p Exp $"
+
+import string
+
+def _strxor(s1, s2):
+    """Utility method. XOR the two strings s1 and s2 (must have same length).
+    """
+    return "".join(map(lambda x, y: chr(ord(x) ^ ord(y)), s1, s2))
+
+# The size of the digests returned by HMAC depends on the underlying
+# hashing module used.
+digest_size = None
+
+class HMAC:
+    """RFC2104 HMAC class.
+
+    This supports the API for Cryptographic Hash Functions (PEP 247).
+    """
+
+    def __init__(self, key, msg = None, digestmod = None):
+        """Create a new HMAC object.
+
+        key:       key for the keyed hash object.
+        msg:       Initial input for the hash, if provided.
+        digestmod: A module supporting PEP 247. Defaults to the md5 module.
+        """
+        if digestmod == None:
+            import md5
+            digestmod = md5
+
+        self.digestmod = digestmod
+        self.outer = digestmod.new()
+        self.inner = digestmod.new()
+        try:
+            self.digest_size = digestmod.digest_size
+        except AttributeError:
+            self.digest_size = len(self.outer.digest())
+
+        blocksize = 64
+        ipad = "\x36" * blocksize
+        opad = "\x5C" * blocksize
+
+        if len(key) > blocksize:
+            key = digestmod.new(key).digest()
+
+        key = key + chr(0) * (blocksize - len(key))
+        self.outer.update(_strxor(key, opad))
+        self.inner.update(_strxor(key, ipad))
+        if (msg):
+            self.update(msg)
+
+##    def clear(self):
+##        raise NotImplementedError, "clear() method not available in HMAC."
+
+    def update(self, msg):
+        """Update this hashing object with the string msg.
+        """
+        self.inner.update(msg)
+
+    def copy(self):
+        """Return a separate copy of this hashing object.
+
+        An update to this copy won't affect the original object.
+        """
+        other = HMAC("")
+        other.digestmod = self.digestmod
+        other.inner = self.inner.copy()
+        other.outer = self.outer.copy()
+        return other
+
+    def digest(self):
+        """Return the hash value of this hashing object.
+
+        This returns a string containing 8-bit data.  The object is
+        not altered in any way by this function; you can continue
+        updating the object after calling this function.
+        """
+        h = self.outer.copy()
+        h.update(self.inner.digest())
+        return h.digest()
+
+    def hexdigest(self):
+        """Like digest(), but returns a string of hexadecimal digits instead.
+        """
+        return "".join([string.zfill(hex(ord(x))[2:], 2)
+                        for x in tuple(self.digest())])
+
+def new(key, msg = None, digestmod = None):
+    """Create a new hashing object and return it.
+
+    key: The starting key for the hash.
+    msg: if available, will immediately be hashed into the object's starting
+    state.
+
+    You can now feed arbitrary strings into the object using its update()
+    method, and can ask for the hash value at any time by calling its digest()
+    method.
+    """
+    return HMAC(key, msg, digestmod)
+
Index: /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Hash/SHA256.py
===================================================================
--- /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Hash/SHA256.py (revision 3)
+++ /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Hash/SHA256.py (revision 3)
@@ -0,0 +1,7 @@
+def __bootstrap__():
+   global __bootstrap__, __loader__, __file__
+   import sys, pkg_resources, imp
+   __file__ = pkg_resources.resource_filename(__name__,'SHA256.so')
+   __loader__ = None; del __bootstrap__, __loader__
+   imp.load_dynamic(__name__,__file__)
+__bootstrap__()
Index: /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Hash/SHA.py
===================================================================
--- /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Hash/SHA.py (revision 3)
+++ /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Hash/SHA.py (revision 3)
@@ -0,0 +1,11 @@
+
+# Just use the SHA module from the Python standard library
+
+__revision__ = "$Id: SHA.py,v 1.4 2002/07/11 14:31:19 akuchling Exp $"
+
+from sha import *
+import sha
+if hasattr(sha, 'digestsize'):
+    digest_size = digestsize
+    del digestsize
+del sha
Index: /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Hash/__init__.py
===================================================================
--- /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Hash/__init__.py (revision 3)
+++ /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Hash/__init__.py (revision 3)
@@ -0,0 +1,24 @@
+"""Hashing algorithms
+
+Hash functions take arbitrary strings as input, and produce an output
+of fixed size that is dependent on the input; it should never be
+possible to derive the input data given only the hash function's
+output.  Hash functions can be used simply as a checksum, or, in
+association with a public-key algorithm, can be used to implement
+digital signatures.
+
+The hashing modules here all support the interface described in PEP
+247, "API for Cryptographic Hash Functions".
+
+Submodules:
+Crypto.Hash.HMAC          RFC 2104: Keyed-Hashing for Message Authentication
+Crypto.Hash.MD2
+Crypto.Hash.MD4
+Crypto.Hash.MD5
+Crypto.Hash.RIPEMD
+Crypto.Hash.SHA
+"""
+
+__all__ = ['HMAC', 'MD2', 'MD4', 'MD5', 'RIPEMD', 'SHA', 'SHA256']
+__revision__ = "$Id: __init__.py,v 1.6 2003/12/19 14:24:25 akuchling Exp $"
+
Index: /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Hash/RIPEMD.py
===================================================================
--- /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Hash/RIPEMD.py (revision 3)
+++ /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Hash/RIPEMD.py (revision 3)
@@ -0,0 +1,7 @@
+def __bootstrap__():
+   global __bootstrap__, __loader__, __file__
+   import sys, pkg_resources, imp
+   __file__ = pkg_resources.resource_filename(__name__,'RIPEMD.so')
+   __loader__ = None; del __bootstrap__, __loader__
+   imp.load_dynamic(__name__,__file__)
+__bootstrap__()
Index: /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Hash/MD2.py
===================================================================
--- /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Hash/MD2.py (revision 3)
+++ /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Hash/MD2.py (revision 3)
@@ -0,0 +1,7 @@
+def __bootstrap__():
+   global __bootstrap__, __loader__, __file__
+   import sys, pkg_resources, imp
+   __file__ = pkg_resources.resource_filename(__name__,'MD2.so')
+   __loader__ = None; del __bootstrap__, __loader__
+   imp.load_dynamic(__name__,__file__)
+__bootstrap__()
Index: /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Hash/MD4.py
===================================================================
--- /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Hash/MD4.py (revision 3)
+++ /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Hash/MD4.py (revision 3)
@@ -0,0 +1,7 @@
+def __bootstrap__():
+   global __bootstrap__, __loader__, __file__
+   import sys, pkg_resources, imp
+   __file__ = pkg_resources.resource_filename(__name__,'MD4.so')
+   __loader__ = None; del __bootstrap__, __loader__
+   imp.load_dynamic(__name__,__file__)
+__bootstrap__()
Index: /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Hash/MD5.py
===================================================================
--- /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Hash/MD5.py (revision 3)
+++ /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Hash/MD5.py (revision 3)
@@ -0,0 +1,13 @@
+
+# Just use the MD5 module from the Python standard library
+
+__revision__ = "$Id: MD5.py,v 1.4 2002/07/11 14:31:19 akuchling Exp $"
+
+from md5 import *
+
+import md5
+if hasattr(md5, 'digestsize'):
+    digest_size = digestsize
+    del digestsize
+del md5
+
Index: /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/ez_setup.py
===================================================================
--- /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/ez_setup.py (revision 3)
+++ /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/ez_setup.py (revision 3)
@@ -0,0 +1,284 @@
+#!python
+"""Bootstrap setuptools installation
+
+If you want to use setuptools in your package's setup.py, just include this
+file in the same directory with it, and add this to the top of your setup.py::
+
+    from ez_setup import use_setuptools
+    use_setuptools()
+
+If you want to require a specific version of setuptools, set a download
+mirror, or use an alternate download directory, you can do so by supplying
+the appropriate options to ``use_setuptools()``.
+
+This file can also be run as a script to install or upgrade setuptools.
+"""
+import sys
+DEFAULT_VERSION = "0.6c11"
+DEFAULT_URL     = "http://pypi.python.org/packages/%s/s/setuptools/" % sys.version[:3]
+
+md5_data = {
+    'setuptools-0.6b1-py2.3.egg': '8822caf901250d848b996b7f25c6e6ca',
+    'setuptools-0.6b1-py2.4.egg': 'b79a8a403e4502fbb85ee3f1941735cb',
+    'setuptools-0.6b2-py2.3.egg': '5657759d8a6d8fc44070a9d07272d99b',
+    'setuptools-0.6b2-py2.4.egg': '4996a8d169d2be661fa32a6e52e4f82a',
+    'setuptools-0.6b3-py2.3.egg': 'bb31c0fc7399a63579975cad9f5a0618',
+    'setuptools-0.6b3-py2.4.egg': '38a8c6b3d6ecd22247f179f7da669fac',
+    'setuptools-0.6b4-py2.3.egg': '62045a24ed4e1ebc77fe039aa4e6f7e5',
+    'setuptools-0.6b4-py2.4.egg': '4cb2a185d228dacffb2d17f103b3b1c4',
+    'setuptools-0.6c1-py2.3.egg': 'b3f2b5539d65cb7f74ad79127f1a908c',
+    'setuptools-0.6c1-py2.4.egg': 'b45adeda0667d2d2ffe14009364f2a4b',
+    'setuptools-0.6c10-py2.3.egg': 'ce1e2ab5d3a0256456d9fc13800a7090',
+    'setuptools-0.6c10-py2.4.egg': '57d6d9d6e9b80772c59a53a8433a5dd4',
+    'setuptools-0.6c10-py2.5.egg': 'de46ac8b1c97c895572e5e8596aeb8c7',
+    'setuptools-0.6c10-py2.6.egg': '58ea40aef06da02ce641495523a0b7f5',
+    'setuptools-0.6c11-py2.3.egg': '2baeac6e13d414a9d28e7ba5b5a596de',
+    'setuptools-0.6c11-py2.4.egg': 'bd639f9b0eac4c42497034dec2ec0c2b',
+    'setuptools-0.6c11-py2.5.egg': '64c94f3bf7a72a13ec83e0b24f2749b2',
+    'setuptools-0.6c11-py2.6.egg': 'bfa92100bd772d5a213eedd356d64086',
+    'setuptools-0.6c2-py2.3.egg': 'f0064bf6aa2b7d0f3ba0b43f20817c27',
+    'setuptools-0.6c2-py2.4.egg': '616192eec35f47e8ea16cd6a122b7277',
+    'setuptools-0.6c3-py2.3.egg': 'f181fa125dfe85a259c9cd6f1d7b78fa',
+    'setuptools-0.6c3-py2.4.egg': 'e0ed74682c998bfb73bf803a50e7b71e',
+    'setuptools-0.6c3-py2.5.egg': 'abef16fdd61955514841c7c6bd98965e',
+    'setuptools-0.6c4-py2.3.egg': 'b0b9131acab32022bfac7f44c5d7971f',
+    'setuptools-0.6c4-py2.4.egg': '2a1f9656d4fbf3c97bf946c0a124e6e2',
+    'setuptools-0.6c4-py2.5.egg': '8f5a052e32cdb9c72bcf4b5526f28afc',
+    'setuptools-0.6c5-py2.3.egg': 'ee9fd80965da04f2f3e6b3576e9d8167',
+    'setuptools-0.6c5-py2.4.egg': 'afe2adf1c01701ee841761f5bcd8aa64',
+    'setuptools-0.6c5-py2.5.egg': 'a8d3f61494ccaa8714dfed37bccd3d5d',
+    'setuptools-0.6c6-py2.3.egg': '35686b78116a668847237b69d549ec20',
+    'setuptools-0.6c6-py2.4.egg': '3c56af57be3225019260a644430065ab',
+    'setuptools-0.6c6-py2.5.egg': 'b2f8a7520709a5b34f80946de5f02f53',
+    'setuptools-0.6c7-py2.3.egg': '209fdf9adc3a615e5115b725658e13e2',
+    'setuptools-0.6c7-py2.4.egg': '5a8f954807d46a0fb67cf1f26c55a82e',
+    'setuptools-0.6c7-py2.5.egg': '45d2ad28f9750e7434111fde831e8372',
+    'setuptools-0.6c8-py2.3.egg': '50759d29b349db8cfd807ba8303f1902',
+    'setuptools-0.6c8-py2.4.egg': 'cba38d74f7d483c06e9daa6070cce6de',
+    'setuptools-0.6c8-py2.5.egg': '1721747ee329dc150590a58b3e1ac95b',
+    'setuptools-0.6c9-py2.3.egg': 'a83c4020414807b496e4cfbe08507c03',
+    'setuptools-0.6c9-py2.4.egg': '260a2be2e5388d66bdaee06abec6342a',
+    'setuptools-0.6c9-py2.5.egg': 'fe67c3e5a17b12c0e7c541b7ea43a8e6',
+    'setuptools-0.6c9-py2.6.egg': 'ca37b1ff16fa2ede6e19383e7b59245a',
+}
+
+import sys, os
+try: from hashlib import md5
+except ImportError: from md5 import md5
+
+def _validate_md5(egg_name, data):
+    if egg_name in md5_data:
+        digest = md5(data).hexdigest()
+        if digest != md5_data[egg_name]:
+            print >>sys.stderr, (
+                "md5 validation of %s failed!  (Possible download problem?)"
+                % egg_name
+            )
+            sys.exit(2)
+    return data
+
+def use_setuptools(
+    version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir,
+    download_delay=15
+):
+    """Automatically find/download setuptools and make it available on sys.path
+
+    `version` should be a valid setuptools version number that is available
+    as an egg for download under the `download_base` URL (which should end with
+    a '/').  `to_dir` is the directory where setuptools will be downloaded, if
+    it is not already available.  If `download_delay` is specified, it should
+    be the number of seconds that will be paused before initiating a download,
+    should one be required.  If an older version of setuptools is installed,
+    this routine will print a message to ``sys.stderr`` and raise SystemExit in
+    an attempt to abort the calling script.
+    """
+    was_imported = 'pkg_resources' in sys.modules or 'setuptools' in sys.modules
+    def do_download():
+        egg = download_setuptools(version, download_base, to_dir, download_delay)
+        sys.path.insert(0, egg)
+        import setuptools; setuptools.bootstrap_install_from = egg
+    try:
+        import pkg_resources
+    except ImportError:
+        return do_download()       
+    try:
+        pkg_resources.require("setuptools>="+version); return
+    except pkg_resources.VersionConflict, e:
+        if was_imported:
+            print >>sys.stderr, (
+            "The required version of setuptools (>=%s) is not available, and\n"
+            "can't be installed while this script is running. Please install\n"
+            " a more recent version first, using 'easy_install -U setuptools'."
+            "\n\n(Currently using %r)"
+            ) % (version, e.args[0])
+            sys.exit(2)
+        else:
+            del pkg_resources, sys.modules['pkg_resources']    # reload ok
+            return do_download()
+    except pkg_resources.DistributionNotFound:
+        return do_download()
+
+def download_setuptools(
+    version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir,
+    delay = 15
+):
+    """Download setuptools from a specified location and return its filename
+
+    `version` should be a valid setuptools version number that is available
+    as an egg for download under the `download_base` URL (which should end
+    with a '/'). `to_dir` is the directory where the egg will be downloaded.
+    `delay` is the number of seconds to pause before an actual download attempt.
+    """
+    import urllib2, shutil
+    egg_name = "setuptools-%s-py%s.egg" % (version,sys.version[:3])
+    url = download_base + egg_name
+    saveto = os.path.join(to_dir, egg_name)
+    src = dst = None
+    if not os.path.exists(saveto):  # Avoid repeated downloads
+        try:
+            from distutils import log
+            if delay:
+                log.warn("""
+---------------------------------------------------------------------------
+This script requires setuptools version %s to run (even to display
+help).  I will attempt to download it for you (from
+%s), but
+you may need to enable firewall access for this script first.
+I will start the download in %d seconds.
+
+(Note: if this machine does not have network access, please obtain the file
+
+   %s
+
+and place it in this directory before rerunning this script.)
+---------------------------------------------------------------------------""",
+                    version, download_base, delay, url
+                ); from time import sleep; sleep(delay)
+            log.warn("Downloading %s", url)
+            src = urllib2.urlopen(url)
+            # Read/write all in one block, so we don't create a corrupt file
+            # if the download is interrupted.
+            data = _validate_md5(egg_name, src.read())
+            dst = open(saveto,"wb"); dst.write(data)
+        finally:
+            if src: src.close()
+            if dst: dst.close()
+    return os.path.realpath(saveto)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+def main(argv, version=DEFAULT_VERSION):
+    """Install or upgrade setuptools and EasyInstall"""
+    try:
+        import setuptools
+    except ImportError:
+        egg = None
+        try:
+            egg = download_setuptools(version, delay=0)
+            sys.path.insert(0,egg)
+            from setuptools.command.easy_install import main
+            return main(list(argv)+[egg])   # we're done here
+        finally:
+            if egg and os.path.exists(egg):
+                os.unlink(egg)
+    else:
+        if setuptools.__version__ == '0.0.1':
+            print >>sys.stderr, (
+            "You have an obsolete version of setuptools installed.  Please\n"
+            "remove it from your system entirely before rerunning this script."
+            )
+            sys.exit(2)
+
+    req = "setuptools>="+version
+    import pkg_resources
+    try:
+        pkg_resources.require(req)
+    except pkg_resources.VersionConflict:
+        try:
+            from setuptools.command.easy_install import main
+        except ImportError:
+            from easy_install import main
+        main(list(argv)+[download_setuptools(delay=0)])
+        sys.exit(0) # try to force an exit
+    else:
+        if argv:
+            from setuptools.command.easy_install import main
+            main(argv)
+        else:
+            print "Setuptools version",version,"or greater has been installed."
+            print '(Run "ez_setup.py -U setuptools" to reinstall or upgrade.)'
+
+def update_md5(filenames):
+    """Update our built-in md5 registry"""
+
+    import re
+
+    for name in filenames:
+        base = os.path.basename(name)
+        f = open(name,'rb')
+        md5_data[base] = md5(f.read()).hexdigest()
+        f.close()
+
+    data = ["    %r: %r,\n" % it for it in md5_data.items()]
+    data.sort()
+    repl = "".join(data)
+
+    import inspect
+    srcfile = inspect.getsourcefile(sys.modules[__name__])
+    f = open(srcfile, 'rb'); src = f.read(); f.close()
+
+    match = re.search("\nmd5_data = {\n([^}]+)}", src)
+    if not match:
+        print >>sys.stderr, "Internal error!"
+        sys.exit(2)
+
+    src = src[:match.start(1)] + repl + src[match.end(1):]
+    f = open(srcfile,'w')
+    f.write(src)
+    f.close()
+
+
+if __name__=='__main__':
+    if len(sys.argv)>2 and sys.argv[1]=='--md5update':
+        update_md5(sys.argv[2:])
+    else:
+        main(sys.argv[1:])
+
+
+
+
+
+
Index: /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/__init__.py
===================================================================
--- /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/__init__.py (revision 3)
+++ /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/__init__.py (revision 3)
@@ -0,0 +1,25 @@
+
+"""Python Cryptography Toolkit
+
+A collection of cryptographic modules implementing various algorithms
+and protocols.
+
+Subpackages:
+Crypto.Cipher             Secret-key encryption algorithms (AES, DES, ARC4)
+Crypto.Hash               Hashing algorithms (MD5, SHA, HMAC)
+Crypto.Protocol           Cryptographic protocols (Chaffing, all-or-nothing
+                          transform).   This package does not contain any
+                          network protocols.
+Crypto.PublicKey          Public-key encryption and signature algorithms
+                          (RSA, DSA)
+Crypto.Util               Various useful modules and functions (long-to-string
+                          conversion, random number generation, number
+                          theoretic functions)
+"""
+
+__all__ = ['Cipher', 'Hash', 'Protocol', 'PublicKey', 'Util']
+
+__version__ = '2.0.1'
+__revision__ = "$Id: __init__.py,v 1.12 2005/06/14 01:20:22 akuchling Exp $"
+
+
Index: /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/test.py
===================================================================
--- /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/test.py (revision 3)
+++ /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/test.py (revision 3)
@@ -0,0 +1,38 @@
+#
+# Test script for the Python Cryptography Toolkit.
+#
+
+__revision__ = "$Id: test.py,v 1.7 2002/07/11 14:31:19 akuchling Exp $"
+
+import os, sys
+
+
+# Add the build directory to the front of sys.path
+from distutils.util import get_platform
+s = "build/lib.%s-%.3s" % (get_platform(), sys.version)
+s = os.path.join(os.getcwd(), s)
+sys.path.insert(0, s)
+s = os.path.join(os.getcwd(), 'test')
+sys.path.insert(0, s)
+
+from Crypto.Util import test
+
+args = sys.argv[1:]
+quiet = "--quiet" in args
+if quiet: args.remove('--quiet')
+
+if not quiet:
+    print '\nStream Ciphers:'
+    print '==============='
+
+if args: test.TestStreamModules(args, verbose= not quiet)
+else: test.TestStreamModules(verbose= not quiet)
+
+if not quiet:
+    print '\nBlock Ciphers:'
+    print '=============='
+
+if args: test.TestBlockModules(args, verbose= not quiet)
+else: test.TestBlockModules(verbose= not quiet)
+
+
Index: /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/PublicKey/qNEW.py
===================================================================
--- /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/PublicKey/qNEW.py (revision 3)
+++ /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/PublicKey/qNEW.py (revision 3)
@@ -0,0 +1,170 @@
+#
+#   qNEW.py : The q-NEW signature algorithm.
+#
+#  Part of the Python Cryptography Toolkit
+#
+# Distribute and use freely; there are no restrictions on further
+# dissemination and usage except those imposed by the laws of your
+# country of residence.    This software is provided "as is" without
+# warranty of fitness for use or suitability for any purpose, express
+# or implied. Use at your own risk or not at all.
+#
+
+__revision__ = "$Id: qNEW.py,v 1.8 2003/04/04 15:13:35 akuchling Exp $"
+
+from Crypto.PublicKey import pubkey
+from Crypto.Util.number import *
+from Crypto.Hash import SHA
+
+class error (Exception):
+    pass
+
+HASHBITS = 160   # Size of SHA digests
+
+def generate(bits, randfunc, progress_func=None):
+    """generate(bits:int, randfunc:callable, progress_func:callable)
+
+    Generate a qNEW key of length 'bits', using 'randfunc' to get
+    random data and 'progress_func', if present, to display
+    the progress of the key generation.
+    """
+    obj=qNEWobj()
+
+    # Generate prime numbers p and q.  q is a 160-bit prime
+    # number.  p is another prime number (the modulus) whose bit
+    # size is chosen by the caller, and is generated so that p-1
+    # is a multiple of q.
+    #
+    # Note that only a single seed is used to
+    # generate p and q; if someone generates a key for you, you can
+    # use the seed to duplicate the key generation.  This can
+    # protect you from someone generating values of p,q that have
+    # some special form that's easy to break.
+    if progress_func:
+        progress_func('p,q\n')
+    while (1):
+        obj.q = getPrime(160, randfunc)
+        #           assert pow(2, 159L)<obj.q<pow(2, 160L)
+        obj.seed = S = long_to_bytes(obj.q)
+        C, N, V = 0, 2, {}
+        # Compute b and n such that bits-1 = b + n*HASHBITS
+        n= (bits-1) / HASHBITS
+        b= (bits-1) % HASHBITS ; powb=2L << b
+        powL1=pow(long(2), bits-1)
+        while C<4096:
+            # The V array will contain (bits-1) bits of random
+            # data, that are assembled to produce a candidate
+            # value for p.
+            for k in range(0, n+1):
+                V[k]=bytes_to_long(SHA.new(S+str(N)+str(k)).digest())
+            p = V[n] % powb
+            for k in range(n-1, -1, -1):
+                p= (p << long(HASHBITS) )+V[k]
+            p = p+powL1         # Ensure the high bit is set
+
+            # Ensure that p-1 is a multiple of q
+            p = p - (p % (2*obj.q)-1)
+
+            # If p is still the right size, and it's prime, we're done!
+            if powL1<=p and isPrime(p):
+                break
+
+            # Otherwise, increment the counter and try again
+            C, N = C+1, N+n+1
+        if C<4096:
+            break   # Ended early, so exit the while loop
+        if progress_func:
+            progress_func('4096 values of p tried\n')
+
+    obj.p = p
+    power=(p-1)/obj.q
+
+    # Next parameter: g = h**((p-1)/q) mod p, such that h is any
+    # number <p-1, and g>1.  g is kept; h can be discarded.
+    if progress_func:
+        progress_func('h,g\n')
+    while (1):
+        h=bytes_to_long(randfunc(bits)) % (p-1)
+        g=pow(h, power, p)
+        if 1<h<p-1 and g>1:
+            break
+    obj.g=g
+
+    # x is the private key information, and is
+    # just a random number between 0 and q.
+    # y=g**x mod p, and is part of the public information.
+    if progress_func:
+        progress_func('x,y\n')
+    while (1):
+        x=bytes_to_long(randfunc(20))
+        if 0 < x < obj.q:
+            break
+    obj.x, obj.y=x, pow(g, x, p)
+
+    return obj
+
+# Construct a qNEW object
+def construct(tuple):
+    """construct(tuple:(long,long,long,long)|(long,long,long,long,long)
+    Construct a qNEW object from a 4- or 5-tuple of numbers.
+    """
+    obj=qNEWobj()
+    if len(tuple) not in [4,5]:
+        raise error, 'argument for construct() wrong length'
+    for i in range(len(tuple)):
+        field = obj.keydata[i]
+        setattr(obj, field, tuple[i])
+    return obj
+
+class qNEWobj(pubkey.pubkey):
+    keydata=['p', 'q', 'g', 'y', 'x']
+
+    def _sign(self, M, K=''):
+        if (self.q<=K):
+            raise error, 'K is greater than q'
+        if M<0:
+            raise error, 'Illegal value of M (<0)'
+        if M>=pow(2,161L):
+            raise error, 'Illegal value of M (too large)'
+        r=pow(self.g, K, self.p) % self.q
+        s=(K- (r*M*self.x % self.q)) % self.q
+        return (r,s)
+    def _verify(self, M, sig):
+        r, s = sig
+        if r<=0 or r>=self.q or s<=0 or s>=self.q:
+            return 0
+        if M<0:
+            raise error, 'Illegal value of M (<0)'
+        if M<=0 or M>=pow(2,161L):
+            return 0
+        v1 = pow(self.g, s, self.p)
+        v2 = pow(self.y, M*r, self.p)
+        v = ((v1*v2) % self.p)
+        v = v % self.q
+        if v==r:
+            return 1
+        return 0
+
+    def size(self):
+        "Return the maximum number of bits that can be handled by this key."
+        return 160
+
+    def has_private(self):
+        """Return a Boolean denoting whether the object contains
+        private components."""
+        return hasattr(self, 'x')
+
+    def can_sign(self):
+        """Return a Boolean value recording whether this algorithm can generate signatures."""
+        return 1
+
+    def can_encrypt(self):
+        """Return a Boolean value recording whether this algorithm can encrypt data."""
+        return 0
+
+    def publickey(self):
+        """Return a new key object containing only the public information."""
+        return construct((self.p, self.q, self.g, self.y))
+
+object = qNEWobj
+
Index: /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/PublicKey/__init__.py
===================================================================
--- /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/PublicKey/__init__.py (revision 3)
+++ /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/PublicKey/__init__.py (revision 3)
@@ -0,0 +1,17 @@
+"""Public-key encryption and signature algorithms.
+
+Public-key encryption uses two different keys, one for encryption and
+one for decryption.  The encryption key can be made public, and the
+decryption key is kept private.  Many public-key algorithms can also
+be used to sign messages, and some can *only* be used for signatures.
+
+Crypto.PublicKey.DSA      Digital Signature Algorithm. (Signature only)
+Crypto.PublicKey.ElGamal  (Signing and encryption)
+Crypto.PublicKey.RSA      (Signing, encryption, and blinding)
+Crypto.PublicKey.qNEW     (Signature only)
+
+"""
+
+__all__ = ['RSA', 'DSA', 'ElGamal', 'qNEW']
+__revision__ = "$Id: __init__.py,v 1.4 2003/04/03 20:27:13 akuchling Exp $"
+
Index: /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/PublicKey/pubkey.py
===================================================================
--- /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/PublicKey/pubkey.py (revision 3)
+++ /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/PublicKey/pubkey.py (revision 3)
@@ -0,0 +1,172 @@
+#
+#   pubkey.py : Internal functions for public key operations
+#
+#  Part of the Python Cryptography Toolkit
+#
+# Distribute and use freely; there are no restrictions on further
+# dissemination and usage except those imposed by the laws of your
+# country of residence.  This software is provided "as is" without
+# warranty of fitness for use or suitability for any purpose, express
+# or implied. Use at your own risk or not at all.
+#
+
+__revision__ = "$Id: pubkey.py,v 1.11 2003/04/03 20:36:14 akuchling Exp $"
+
+import types, warnings
+from Crypto.Util.number import *
+
+# Basic public key class
+class pubkey:
+    def __init__(self):
+        pass
+
+    def __getstate__(self):
+        """To keep key objects platform-independent, the key data is
+        converted to standard Python long integers before being
+        written out.  It will then be reconverted as necessary on
+        restoration."""
+        d=self.__dict__
+        for key in self.keydata:
+            if d.has_key(key): d[key]=long(d[key])
+        return d
+
+    def __setstate__(self, d):
+        """On unpickling a key object, the key data is converted to the big
+number representation being used, whether that is Python long
+integers, MPZ objects, or whatever."""
+        for key in self.keydata:
+            if d.has_key(key): self.__dict__[key]=bignum(d[key])
+
+    def encrypt(self, plaintext, K):
+        """encrypt(plaintext:string|long, K:string|long) : tuple
+        Encrypt the string or integer plaintext.  K is a random
+        parameter required by some algorithms.
+        """
+        wasString=0
+        if isinstance(plaintext, types.StringType):
+            plaintext=bytes_to_long(plaintext) ; wasString=1
+        if isinstance(K, types.StringType):
+            K=bytes_to_long(K)
+        ciphertext=self._encrypt(plaintext, K)
+        if wasString: return tuple(map(long_to_bytes, ciphertext))
+        else: return ciphertext
+
+    def decrypt(self, ciphertext):
+        """decrypt(ciphertext:tuple|string|long): string
+        Decrypt 'ciphertext' using this key.
+        """
+        wasString=0
+        if not isinstance(ciphertext, types.TupleType):
+            ciphertext=(ciphertext,)
+        if isinstance(ciphertext[0], types.StringType):
+            ciphertext=tuple(map(bytes_to_long, ciphertext)) ; wasString=1
+        plaintext=self._decrypt(ciphertext)
+        if wasString: return long_to_bytes(plaintext)
+        else: return plaintext
+
+    def sign(self, M, K):
+        """sign(M : string|long, K:string|long) : tuple
+        Return a tuple containing the signature for the message M.
+        K is a random parameter required by some algorithms.
+        """
+        if (not self.has_private()):
+            raise error, 'Private key not available in this object'
+        if isinstance(M, types.StringType): M=bytes_to_long(M)
+        if isinstance(K, types.StringType): K=bytes_to_long(K)
+        return self._sign(M, K)
+
+    def verify (self, M, signature):
+        """verify(M:string|long, signature:tuple) : bool
+        Verify that the signature is valid for the message M;
+        returns true if the signature checks out.
+        """
+        if isinstance(M, types.StringType): M=bytes_to_long(M)
+        return self._verify(M, signature)
+
+    # alias to compensate for the old validate() name
+    def validate (self, M, signature):
+        warnings.warn("validate() method name is obsolete; use verify()",
+                      DeprecationWarning)
+
+    def blind(self, M, B):
+        """blind(M : string|long, B : string|long) : string|long
+        Blind message M using blinding factor B.
+        """
+        wasString=0
+        if isinstance(M, types.StringType):
+            M=bytes_to_long(M) ; wasString=1
+        if isinstance(B, types.StringType): B=bytes_to_long(B)
+        blindedmessage=self._blind(M, B)
+        if wasString: return long_to_bytes(blindedmessage)
+        else: return blindedmessage
+
+    def unblind(self, M, B):
+        """unblind(M : string|long, B : string|long) : string|long
+        Unblind message M using blinding factor B.
+        """
+        wasString=0
+        if isinstance(M, types.StringType):
+            M=bytes_to_long(M) ; wasString=1
+        if isinstance(B, types.StringType): B=bytes_to_long(B)
+        unblindedmessage=self._unblind(M, B)
+        if wasString: return long_to_bytes(unblindedmessage)
+        else: return unblindedmessage
+
+
+    # The following methods will usually be left alone, except for
+    # signature-only algorithms.  They both return Boolean values
+    # recording whether this key's algorithm can sign and encrypt.
+    def can_sign (self):
+        """can_sign() : bool
+        Return a Boolean value recording whether this algorithm can
+        generate signatures.  (This does not imply that this
+        particular key object has the private information required to
+        to generate a signature.)
+        """
+        return 1
+
+    def can_encrypt (self):
+        """can_encrypt() : bool
+        Return a Boolean value recording whether this algorithm can
+        encrypt data.  (This does not imply that this
+        particular key object has the private information required to
+        to decrypt a message.)
+        """
+        return 1
+
+    def can_blind (self):
+        """can_blind() : bool
+        Return a Boolean value recording whether this algorithm can
+        blind data.  (This does not imply that this
+        particular key object has the private information required to
+        to blind a message.)
+        """
+        return 0
+
+    # The following methods will certainly be overridden by
+    # subclasses.
+
+    def size (self):
+        """size() : int
+        Return the maximum number of bits that can be handled by this key.
+        """
+        return 0
+
+    def has_private (self):
+        """has_private() : bool
+        Return a Boolean denoting whether the object contains
+        private components.
+        """
+        return 0
+
+    def publickey (self):
+        """publickey(): object
+        Return a new key object containing only the public information.
+        """
+        return self
+
+    def __eq__ (self, other):
+        """__eq__(other): 0, 1
+        Compare us to other for equality.
+        """
+        return self.__getstate__() == other.__getstate__()
Index: /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/PublicKey/ElGamal.py
===================================================================
--- /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/PublicKey/ElGamal.py (revision 3)
+++ /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/PublicKey/ElGamal.py (revision 3)
@@ -0,0 +1,132 @@
+#
+#   ElGamal.py : ElGamal encryption/decryption and signatures
+#
+#  Part of the Python Cryptography Toolkit
+#
+# Distribute and use freely; there are no restrictions on further
+# dissemination and usage except those imposed by the laws of your
+# country of residence.  This software is provided "as is" without
+# warranty of fitness for use or suitability for any purpose, express
+# or implied. Use at your own risk or not at all.
+#
+
+__revision__ = "$Id: ElGamal.py,v 1.9 2003/04/04 19:44:26 akuchling Exp $"
+
+from Crypto.PublicKey.pubkey import *
+from Crypto.Util import number
+
+class error (Exception):
+    pass
+
+# Generate an ElGamal key with N bits
+def generate(bits, randfunc, progress_func=None):
+    """generate(bits:int, randfunc:callable, progress_func:callable)
+
+    Generate an ElGamal key of length 'bits', using 'randfunc' to get
+    random data and 'progress_func', if present, to display
+    the progress of the key generation.
+    """
+    obj=ElGamalobj()
+    # Generate prime p
+    if progress_func:
+        progress_func('p\n')
+    obj.p=bignum(getPrime(bits, randfunc))
+    # Generate random number g
+    if progress_func:
+        progress_func('g\n')
+    size=bits-1-(ord(randfunc(1)) & 63) # g will be from 1--64 bits smaller than p
+    if size<1:
+        size=bits-1
+    while (1):
+        obj.g=bignum(getPrime(size, randfunc))
+        if obj.g < obj.p:
+            break
+        size=(size+1) % bits
+        if size==0:
+            size=4
+    # Generate random number x
+    if progress_func:
+        progress_func('x\n')
+    while (1):
+        size=bits-1-ord(randfunc(1)) # x will be from 1 to 256 bits smaller than p
+        if size>2:
+            break
+    while (1):
+        obj.x=bignum(getPrime(size, randfunc))
+        if obj.x < obj.p:
+            break
+        size = (size+1) % bits
+        if size==0:
+            size=4
+    if progress_func:
+        progress_func('y\n')
+    obj.y = pow(obj.g, obj.x, obj.p)
+    return obj
+
+def construct(tuple):
+    """construct(tuple:(long,long,long,long)|(long,long,long,long,long)))
+             : ElGamalobj
+    Construct an ElGamal key from a 3- or 4-tuple of numbers.
+    """
+
+    obj=ElGamalobj()
+    if len(tuple) not in [3,4]:
+        raise error, 'argument for construct() wrong length'
+    for i in range(len(tuple)):
+        field = obj.keydata[i]
+        setattr(obj, field, tuple[i])
+    return obj
+
+class ElGamalobj(pubkey):
+    keydata=['p', 'g', 'y', 'x']
+
+    def _encrypt(self, M, K):
+        a=pow(self.g, K, self.p)
+        b=( M*pow(self.y, K, self.p) ) % self.p
+        return ( a,b )
+
+    def _decrypt(self, M):
+        if (not hasattr(self, 'x')):
+            raise error, 'Private key not available in this object'
+        ax=pow(M[0], self.x, self.p)
+        plaintext=(M[1] * inverse(ax, self.p ) ) % self.p
+        return plaintext
+
+    def _sign(self, M, K):
+        if (not hasattr(self, 'x')):
+            raise error, 'Private key not available in this object'
+        p1=self.p-1
+        if (GCD(K, p1)!=1):
+            raise error, 'Bad K value: GCD(K,p-1)!=1'
+        a=pow(self.g, K, self.p)
+        t=(M-self.x*a) % p1
+        while t<0: t=t+p1
+        b=(t*inverse(K, p1)) % p1
+        return (a, b)
+
+    def _verify(self, M, sig):
+        v1=pow(self.y, sig[0], self.p)
+        v1=(v1*pow(sig[0], sig[1], self.p)) % self.p
+        v2=pow(self.g, M, self.p)
+        if v1==v2:
+            return 1
+        return 0
+
+    def size(self):
+        "Return the maximum number of bits that can be handled by this key."
+        return number.size(self.p) - 1
+
+    def has_private(self):
+        """Return a Boolean denoting whether the object contains
+        private components."""
+        if hasattr(self, 'x'):
+            return 1
+        else:
+            return 0
+
+    def publickey(self):
+        """Return a new key object containing only the public information."""
+        return construct((self.p, self.g, self.y))
+
+
+object=ElGamalobj
Index: /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/PublicKey/RSA.py
===================================================================
--- /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/PublicKey/RSA.py (revision 3)
+++ /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/PublicKey/RSA.py (revision 3)
@@ -0,0 +1,256 @@
+#
+#   RSA.py : RSA encryption/decryption
+#
+#  Part of the Python Cryptography Toolkit
+#
+# Distribute and use freely; there are no restrictions on further
+# dissemination and usage except those imposed by the laws of your
+# country of residence.  This software is provided "as is" without
+# warranty of fitness for use or suitability for any purpose, express
+# or implied. Use at your own risk or not at all.
+#
+
+__revision__ = "$Id: RSA.py,v 1.20 2004/05/06 12:52:54 akuchling Exp $"
+
+from Crypto.PublicKey import pubkey
+from Crypto.Util import number
+
+try:
+    from Crypto.PublicKey import _fastmath
+except ImportError:
+    _fastmath = None
+
+class error (Exception):
+    pass
+
+def generate(bits, randfunc, progress_func=None):
+    """generate(bits:int, randfunc:callable, progress_func:callable)
+
+    Generate an RSA key of length 'bits', using 'randfunc' to get
+    random data and 'progress_func', if present, to display
+    the progress of the key generation.
+    """
+    obj=RSAobj()
+
+    # Generate the prime factors of n
+    if progress_func:
+        progress_func('p,q\n')
+    p = q = 1L
+    while number.size(p*q) < bits:
+        p = pubkey.getPrime(bits/2, randfunc)
+        q = pubkey.getPrime(bits/2, randfunc)
+
+    # p shall be smaller than q (for calc of u)
+    if p > q:
+        (p, q)=(q, p)
+    obj.p = p
+    obj.q = q
+
+    if progress_func:
+        progress_func('u\n')
+    obj.u = pubkey.inverse(obj.p, obj.q)
+    obj.n = obj.p*obj.q
+
+    obj.e = 65537L
+    if progress_func:
+        progress_func('d\n')
+    obj.d=pubkey.inverse(obj.e, (obj.p-1)*(obj.q-1))
+
+    assert bits <= 1+obj.size(), "Generated key is too small"
+
+    return obj
+
+def construct(tuple):
+    """construct(tuple:(long,) : RSAobj
+    Construct an RSA object from a 2-, 3-, 5-, or 6-tuple of numbers.
+    """
+
+    obj=RSAobj()
+    if len(tuple) not in [2,3,5,6]:
+        raise error, 'argument for construct() wrong length'
+    for i in range(len(tuple)):
+        field = obj.keydata[i]
+        setattr(obj, field, tuple[i])
+    if len(tuple) >= 5:
+        # Ensure p is smaller than q 
+        if obj.p>obj.q:
+            (obj.p, obj.q)=(obj.q, obj.p)
+
+    if len(tuple) == 5:
+        # u not supplied, so we're going to have to compute it.
+        obj.u=pubkey.inverse(obj.p, obj.q)
+
+    return obj
+
+class RSAobj(pubkey.pubkey):
+    keydata = ['n', 'e', 'd', 'p', 'q', 'u']
+    def _encrypt(self, plaintext, K=''):
+        if self.n<=plaintext:
+            raise error, 'Plaintext too large'
+        return (pow(plaintext, self.e, self.n),)
+
+    def _decrypt(self, ciphertext):
+        if (not hasattr(self, 'd')):
+            raise error, 'Private key not available in this object'
+        if self.n<=ciphertext[0]:
+            raise error, 'Ciphertext too large'
+        return pow(ciphertext[0], self.d, self.n)
+
+    def _sign(self, M, K=''):
+        return (self._decrypt((M,)),)
+
+    def _verify(self, M, sig):
+        m2=self._encrypt(sig[0])
+        if m2[0]==M:
+            return 1
+        else: return 0
+
+    def _blind(self, M, B):
+        tmp = pow(B, self.e, self.n)
+        return (M * tmp) % self.n
+
+    def _unblind(self, M, B):
+        tmp = pubkey.inverse(B, self.n)
+        return  (M * tmp) % self.n
+
+    def can_blind (self):
+        """can_blind() : bool
+        Return a Boolean value recording whether this algorithm can
+        blind data.  (This does not imply that this
+        particular key object has the private information required to
+        to blind a message.)
+        """
+        return 1
+
+    def size(self):
+        """size() : int
+        Return the maximum number of bits that can be handled by this key.
+        """
+        return number.size(self.n) - 1
+
+    def has_private(self):
+        """has_private() : bool
+        Return a Boolean denoting whether the object contains
+        private components.
+        """
+        if hasattr(self, 'd'):
+            return 1
+        else: return 0
+
+    def publickey(self):
+        """publickey(): RSAobj
+        Return a new key object containing only the public key information.
+        """
+        return construct((self.n, self.e))
+
+class RSAobj_c(pubkey.pubkey):
+    keydata = ['n', 'e', 'd', 'p', 'q', 'u']
+
+    def __init__(self, key):
+        self.key = key
+
+    def __getattr__(self, attr):
+        if attr in self.keydata:
+            return getattr(self.key, attr)
+        else:
+            if self.__dict__.has_key(attr):
+                self.__dict__[attr]
+            else:
+                raise AttributeError, '%s instance has no attribute %s' % (self.__class__, attr)
+
+    def __getstate__(self):
+        d = {}
+        for k in self.keydata:
+            if hasattr(self.key, k):
+                d[k]=getattr(self.key, k)
+        return d
+
+    def __setstate__(self, state):
+        n,e = state['n'], state['e']
+        if not state.has_key('d'):
+            self.key = _fastmath.rsa_construct(n,e)
+        else:
+            d = state['d']
+            if not state.has_key('q'):
+                self.key = _fastmath.rsa_construct(n,e,d)
+            else:
+                p, q, u = state['p'], state['q'], state['u']
+                self.key = _fastmath.rsa_construct(n,e,d,p,q,u)
+
+    def _encrypt(self, plain, K):
+        return (self.key._encrypt(plain),)
+
+    def _decrypt(self, cipher):
+        return self.key._decrypt(cipher[0])
+
+    def _sign(self, M, K):
+        return (self.key._sign(M),)
+
+    def _verify(self, M, sig):
+        return self.key._verify(M, sig[0])
+
+    def _blind(self, M, B):
+        return self.key._blind(M, B)
+
+    def _unblind(self, M, B):
+        return self.key._unblind(M, B)
+
+    def can_blind (self):
+        return 1
+
+    def size(self):
+        return self.key.size()
+
+    def has_private(self):
+        return self.key.has_private()
+
+    def publickey(self):
+        return construct_c((self.key.n, self.key.e))
+
+def generate_c(bits, randfunc, progress_func = None):
+    # Generate the prime factors of n
+    if progress_func:
+        progress_func('p,q\n')
+
+    p = q = 1L
+    while number.size(p*q) < bits:
+        p = pubkey.getPrime(bits/2, randfunc)
+        q = pubkey.getPrime(bits/2, randfunc)
+
+    # p shall be smaller than q (for calc of u)
+    if p > q:
+        (p, q)=(q, p)
+    if progress_func:
+        progress_func('u\n')
+    u=pubkey.inverse(p, q)
+    n=p*q
+
+    e = 65537L
+    if progress_func:
+        progress_func('d\n')
+    d=pubkey.inverse(e, (p-1)*(q-1))
+    key = _fastmath.rsa_construct(n,e,d,p,q,u)
+    obj = RSAobj_c(key)
+
+##    print p
+##    print q
+##    print number.size(p), number.size(q), number.size(q*p),
+##    print obj.size(), bits
+    assert bits <= 1+obj.size(), "Generated key is too small"
+    return obj
+
+
+def construct_c(tuple):
+    key = apply(_fastmath.rsa_construct, tuple)
+    return RSAobj_c(key)
+
+object = RSAobj
+
+generate_py = generate
+construct_py = construct
+
+if _fastmath:
+    #print "using C version of RSA"
+    generate = generate_c
+    construct = construct_c
+    error = _fastmath.error
Index: /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/PublicKey/DSA.py
===================================================================
--- /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/PublicKey/DSA.py (revision 3)
+++ /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/PublicKey/DSA.py (revision 3)
@@ -0,0 +1,238 @@
+
+#
+#   DSA.py : Digital Signature Algorithm
+#
+#  Part of the Python Cryptography Toolkit
+#
+# Distribute and use freely; there are no restrictions on further
+# dissemination and usage except those imposed by the laws of your
+# country of residence.  This software is provided "as is" without
+# warranty of fitness for use or suitability for any purpose, express
+# or implied. Use at your own risk or not at all.
+#
+
+__revision__ = "$Id: DSA.py,v 1.16 2004/05/06 12:52:54 akuchling Exp $"
+
+from Crypto.PublicKey.pubkey import *
+from Crypto.Util import number
+from Crypto.Util.number import bytes_to_long, long_to_bytes
+from Crypto.Hash import SHA
+
+try:
+    from Crypto.PublicKey import _fastmath
+except ImportError:
+    _fastmath = None
+
+class error (Exception):
+    pass
+
+def generateQ(randfunc):
+    S=randfunc(20)
+    hash1=SHA.new(S).digest()
+    hash2=SHA.new(long_to_bytes(bytes_to_long(S)+1)).digest()
+    q = bignum(0)
+    for i in range(0,20):
+        c=ord(hash1[i])^ord(hash2[i])
+        if i==0:
+            c=c | 128
+        if i==19:
+            c= c | 1
+        q=q*256+c
+    while (not isPrime(q)):
+        q=q+2
+    if pow(2,159L) < q < pow(2,160L):
+        return S, q
+    raise error, 'Bad q value generated'
+
+def generate(bits, randfunc, progress_func=None):
+    """generate(bits:int, randfunc:callable, progress_func:callable)
+
+    Generate a DSA key of length 'bits', using 'randfunc' to get
+    random data and 'progress_func', if present, to display
+    the progress of the key generation.
+    """
+
+    if bits<160:
+        raise error, 'Key length <160 bits'
+    obj=DSAobj()
+    # Generate string S and prime q
+    if progress_func:
+        progress_func('p,q\n')
+    while (1):
+        S, obj.q = generateQ(randfunc)
+        n=(bits-1)/160
+        C, N, V = 0, 2, {}
+        b=(obj.q >> 5) & 15
+        powb=pow(bignum(2), b)
+        powL1=pow(bignum(2), bits-1)
+        while C<4096:
+            for k in range(0, n+1):
+                V[k]=bytes_to_long(SHA.new(S+str(N)+str(k)).digest())
+            W=V[n] % powb
+            for k in range(n-1, -1, -1):
+                W=(W<<160L)+V[k]
+            X=W+powL1
+            p=X-(X%(2*obj.q)-1)
+            if powL1<=p and isPrime(p):
+                break
+            C, N = C+1, N+n+1
+        if C<4096:
+            break
+        if progress_func:
+            progress_func('4096 multiples failed\n')
+
+    obj.p = p
+    power=(p-1)/obj.q
+    if progress_func:
+        progress_func('h,g\n')
+    while (1):
+        h=bytes_to_long(randfunc(bits)) % (p-1)
+        g=pow(h, power, p)
+        if 1<h<p-1 and g>1:
+            break
+    obj.g=g
+    if progress_func:
+        progress_func('x,y\n')
+    while (1):
+        x=bytes_to_long(randfunc(20))
+        if 0 < x < obj.q:
+            break
+    obj.x, obj.y = x, pow(g, x, p)
+    return obj
+
+def construct(tuple):
+    """construct(tuple:(long,long,long,long)|(long,long,long,long,long)):DSAobj
+    Construct a DSA object from a 4- or 5-tuple of numbers.
+    """
+    obj=DSAobj()
+    if len(tuple) not in [4,5]:
+        raise error, 'argument for construct() wrong length'
+    for i in range(len(tuple)):
+        field = obj.keydata[i]
+        setattr(obj, field, tuple[i])
+    return obj
+
+class DSAobj(pubkey):
+    keydata=['y', 'g', 'p', 'q', 'x']
+
+    def _encrypt(self, s, Kstr):
+        raise error, 'DSA algorithm cannot encrypt data'
+
+    def _decrypt(self, s):
+        raise error, 'DSA algorithm cannot decrypt data'
+
+    def _sign(self, M, K):
+        if (K<2 or self.q<=K):
+            raise error, 'K is not between 2 and q'
+        r=pow(self.g, K, self.p) % self.q
+        s=(inverse(K, self.q)*(M+self.x*r)) % self.q
+        return (r,s)
+
+    def _verify(self, M, sig):
+        r, s = sig
+        if r<=0 or r>=self.q or s<=0 or s>=self.q:
+            return 0
+        w=inverse(s, self.q)
+        u1, u2 = (M*w) % self.q, (r*w) % self.q
+        v1 = pow(self.g, u1, self.p)
+        v2 = pow(self.y, u2, self.p)
+        v = ((v1*v2) % self.p)
+        v = v % self.q
+        if v==r:
+            return 1
+        return 0
+
+    def size(self):
+        "Return the maximum number of bits that can be handled by this key."
+        return number.size(self.p) - 1
+
+    def has_private(self):
+        """Return a Boolean denoting whether the object contains
+        private components."""
+        if hasattr(self, 'x'):
+            return 1
+        else:
+            return 0
+
+    def can_sign(self):
+        """Return a Boolean value recording whether this algorithm can generate signatures."""
+        return 1
+
+    def can_encrypt(self):
+        """Return a Boolean value recording whether this algorithm can encrypt data."""
+        return 0
+
+    def publickey(self):
+        """Return a new key object containing only the public information."""
+        return construct((self.y, self.g, self.p, self.q))
+
+object=DSAobj
+
+generate_py = generate
+construct_py = construct
+
+class DSAobj_c(pubkey):
+    keydata = ['y', 'g', 'p', 'q', 'x']
+
+    def __init__(self, key):
+        self.key = key
+
+    def __getattr__(self, attr):
+        if attr in self.keydata:
+            return getattr(self.key, attr)
+        else:
+            if self.__dict__.has_key(attr):
+                self.__dict__[attr]
+            else:
+                raise AttributeError, '%s instance has no attribute %s' % (self.__class__, attr)
+
+    def __getstate__(self):
+        d = {}
+        for k in self.keydata:
+            if hasattr(self.key, k):
+                d[k]=getattr(self.key, k)
+        return d
+
+    def __setstate__(self, state):
+        y,g,p,q = state['y'], state['g'], state['p'], state['q']
+        if not state.has_key('x'):
+            self.key = _fastmath.dsa_construct(y,g,p,q)
+        else:
+            x = state['x']
+            self.key = _fastmath.dsa_construct(y,g,p,q,x)
+
+    def _sign(self, M, K):
+        return self.key._sign(M, K)
+
+    def _verify(self, M, (r, s)):
+        return self.key._verify(M, r, s)
+
+    def size(self):
+        return self.key.size()
+
+    def has_private(self):
+        return self.key.has_private()
+
+    def publickey(self):
+        return construct_c((self.key.y, self.key.g, self.key.p, self.key.q))
+
+    def can_sign(self):
+        return 1
+
+    def can_encrypt(self):
+        return 0
+
+def generate_c(bits, randfunc, progress_func=None):
+    obj = generate_py(bits, randfunc, progress_func)
+    y,g,p,q,x = obj.y, obj.g, obj.p, obj.q, obj.x
+    return construct_c((y,g,p,q,x))
+
+def construct_c(tuple):
+    key = apply(_fastmath.dsa_construct, tuple)
+    return DSAobj_c(key)
+
+if _fastmath:
+    #print "using C version of DSA"
+    generate = generate_c
+    construct = construct_c
+    error = _fastmath.error
Index: /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/setup.py
===================================================================
--- /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/setup.py (revision 3)
+++ /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/setup.py (revision 3)
@@ -0,0 +1,164 @@
+#! /usr/bin/env python
+
+__revision__ = "$Id: setup.py,v 1.30 2005/06/14 01:20:22 akuchling Exp $"
+
+from distutils import core
+from distutils.core import Extension
+from distutils.command.build_ext import build_ext
+import os, sys
+
+if sys.version[0:1] == '1':
+    raise RuntimeError, ("The Python Cryptography Toolkit requires "
+                         "Python 2.x to build.")
+
+if sys.platform == 'win32':
+    HTONS_LIBS = ['ws2_32']
+    plat_ext = [
+                Extension("Crypto.Util.winrandom",
+                          libraries = HTONS_LIBS + ['advapi32'],
+                          include_dirs=['src/'],
+                          sources=["src/winrand.c"])
+               ]
+else:
+    HTONS_LIBS = []
+    plat_ext = []
+
+# Functions for finding libraries and files, copied from Python's setup.py.
+
+def find_file(filename, std_dirs, paths):
+    """Searches for the directory where a given file is located,
+    and returns a possibly-empty list of additional directories, or None
+    if the file couldn't be found at all.
+
+    'filename' is the name of a file, such as readline.h or libcrypto.a.
+    'std_dirs' is the list of standard system directories; if the
+        file is found in one of them, no additional directives are needed.
+    'paths' is a list of additional locations to check; if the file is
+        found in one of them, the resulting list will contain the directory.
+    """
+
+    # Check the standard locations
+    for dir in std_dirs:
+        f = os.path.join(dir, filename)
+        if os.path.exists(f): return []
+
+    # Check the additional directories
+    for dir in paths:
+        f = os.path.join(dir, filename)
+        if os.path.exists(f):
+            return [dir]
+
+    # Not found anywhere
+    return None
+
+def find_library_file(compiler, libname, std_dirs, paths):
+    filename = compiler.library_filename(libname, lib_type='shared')
+    result = find_file(filename, std_dirs, paths)
+    if result is not None: return result
+
+    filename = compiler.library_filename(libname, lib_type='static')
+    result = find_file(filename, std_dirs, paths)
+    return result
+
+class PCTBuildExt (build_ext):
+    def build_extensions(self):
+        self.extensions += [
+            # Hash functions
+            Extension("Crypto.Hash.MD4",
+                      include_dirs=['src/'],
+                      sources=["src/MD4.c"]),
+            Extension("Crypto.Hash.RIPEMD",
+                      include_dirs=['src/'],
+                      sources=["src/RIPEMD.c"],
+                      libraries=HTONS_LIBS),
+            Extension("Crypto.Hash.SHA256",
+                      include_dirs=['src/'],
+                      sources=["src/SHA256.c"]),
+
+            # Block encryption algorithms
+            Extension("Crypto.Cipher.AES",
+                      include_dirs=['src/'],
+                      sources=["src/AES.c"]),
+            Extension("Crypto.Cipher.ARC2",
+                      include_dirs=['src/'],
+                      sources=["src/ARC2.c"]),
+            Extension("Crypto.Cipher.Blowfish",
+                      include_dirs=['src/'],
+                      sources=["src/Blowfish.c"]),
+            Extension("Crypto.Cipher.CAST",
+                      include_dirs=['src/'],
+                      sources=["src/CAST.c"]),
+            Extension("Crypto.Cipher.DES",
+                      include_dirs=['src/'],
+                      sources=["src/DES.c"]),
+            Extension("Crypto.Cipher.DES3",
+                      include_dirs=['src/'],
+                      sources=["src/DES3.c"]),
+            Extension("Crypto.Cipher.IDEA",
+                      include_dirs=['src/'],
+                      sources=["src/IDEA.c"],
+                      libraries=HTONS_LIBS),
+            Extension("Crypto.Cipher.RC5",
+                      include_dirs=['src/'],
+                      sources=["src/RC5.c"]),
+
+            # Stream ciphers
+            Extension("Crypto.Cipher.ARC4",
+                      include_dirs=['src/'],
+                      sources=["src/ARC4.c"]),
+            Extension("Crypto.Cipher.XOR",
+                      include_dirs=['src/'],
+                      sources=["src/XOR.c"]),
+            ]
+
+        # Detect which modules should be compiled
+        self.detect_modules()
+        build_ext.build_extensions(self)
+
+    def detect_modules (self):
+        lib_dirs = self.compiler.library_dirs + ['/lib', '/usr/lib']
+        inc_dirs = self.compiler.include_dirs + ['/usr/include']
+        exts = []
+        if (self.compiler.find_library_file(lib_dirs, 'gmp')):
+            exts.append(Extension("Crypto.PublicKey._fastmath",
+                                  include_dirs=['src/'],
+                                  libraries=['gmp'],
+                                  sources=["src/_fastmath.c"]))
+        self.extensions += exts
+
+kw = {'name':"pycrypto",
+      'version':"2.0.1",
+      'description':"Cryptographic modules for Python.",
+      'author':"A.M. Kuchling",
+      'author_email':"amk@amk.ca",
+      'url':"http://www.amk.ca/python/code/crypto",
+
+      'cmdclass' : {'build_ext':PCTBuildExt},
+      'packages' : ["Crypto", "Crypto.Hash", "Crypto.Cipher", "Crypto.Util",
+                  "Crypto.Protocol", "Crypto.PublicKey"],
+      'package_dir' : { "Crypto":"." },
+      # One module is defined here, because build_ext won't be
+      # called unless there's at least one extension module defined.
+      'ext_modules':[Extension("Crypto.Hash.MD2",
+                             include_dirs=['src/'],
+                             sources=["src/MD2.c"])],
+     }
+
+# If we're running Python 2.3, add extra information
+if hasattr(core, 'setup_keywords'):
+    if 'classifiers' in core.setup_keywords:
+        kw['classifiers'] = [
+          'Development Status :: 4 - Beta',
+          'License :: Public Domain',
+          'Intended Audience :: Developers',
+          'Operating System :: Unix',
+          'Operating System :: Microsoft :: Windows',
+          'Operating System :: MacOS :: MacOS X',
+          'Topic :: Security :: Cryptography',
+          ]
+    if 'download_url' in core.setup_keywords:
+        kw['download_url'] = ('http://www.amk.ca/files/python/crypto/'
+                              '%s-%s.tar.gz' % (kw['name'], kw['version']) )
+
+core.setup(**kw)
+
Index: /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Cipher/AES.py
===================================================================
--- /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Cipher/AES.py (revision 3)
+++ /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Cipher/AES.py (revision 3)
@@ -0,0 +1,7 @@
+def __bootstrap__():
+   global __bootstrap__, __loader__, __file__
+   import sys, pkg_resources, imp
+   __file__ = pkg_resources.resource_filename(__name__,'AES.so')
+   __loader__ = None; del __bootstrap__, __loader__
+   imp.load_dynamic(__name__,__file__)
+__bootstrap__()
Index: /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Cipher/XOR.py
===================================================================
--- /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Cipher/XOR.py (revision 3)
+++ /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Cipher/XOR.py (revision 3)
@@ -0,0 +1,7 @@
+def __bootstrap__():
+   global __bootstrap__, __loader__, __file__
+   import sys, pkg_resources, imp
+   __file__ = pkg_resources.resource_filename(__name__,'XOR.so')
+   __loader__ = None; del __bootstrap__, __loader__
+   imp.load_dynamic(__name__,__file__)
+__bootstrap__()
Index: /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Cipher/ARC4.py
===================================================================
--- /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Cipher/ARC4.py (revision 3)
+++ /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Cipher/ARC4.py (revision 3)
@@ -0,0 +1,7 @@
+def __bootstrap__():
+   global __bootstrap__, __loader__, __file__
+   import sys, pkg_resources, imp
+   __file__ = pkg_resources.resource_filename(__name__,'ARC4.so')
+   __loader__ = None; del __bootstrap__, __loader__
+   imp.load_dynamic(__name__,__file__)
+__bootstrap__()
Index: /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Cipher/RC5.py
===================================================================
--- /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Cipher/RC5.py (revision 3)
+++ /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Cipher/RC5.py (revision 3)
@@ -0,0 +1,7 @@
+def __bootstrap__():
+   global __bootstrap__, __loader__, __file__
+   import sys, pkg_resources, imp
+   __file__ = pkg_resources.resource_filename(__name__,'RC5.so')
+   __loader__ = None; del __bootstrap__, __loader__
+   imp.load_dynamic(__name__,__file__)
+__bootstrap__()
Index: /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Cipher/CAST.py
===================================================================
--- /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Cipher/CAST.py (revision 3)
+++ /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Cipher/CAST.py (revision 3)
@@ -0,0 +1,7 @@
+def __bootstrap__():
+   global __bootstrap__, __loader__, __file__
+   import sys, pkg_resources, imp
+   __file__ = pkg_resources.resource_filename(__name__,'CAST.so')
+   __loader__ = None; del __bootstrap__, __loader__
+   imp.load_dynamic(__name__,__file__)
+__bootstrap__()
Index: /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Cipher/DES.py
===================================================================
--- /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Cipher/DES.py (revision 3)
+++ /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Cipher/DES.py (revision 3)
@@ -0,0 +1,7 @@
+def __bootstrap__():
+   global __bootstrap__, __loader__, __file__
+   import sys, pkg_resources, imp
+   __file__ = pkg_resources.resource_filename(__name__,'DES.so')
+   __loader__ = None; del __bootstrap__, __loader__
+   imp.load_dynamic(__name__,__file__)
+__bootstrap__()
Index: /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Cipher/Blowfish.py
===================================================================
--- /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Cipher/Blowfish.py (revision 3)
+++ /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Cipher/Blowfish.py (revision 3)
@@ -0,0 +1,7 @@
+def __bootstrap__():
+   global __bootstrap__, __loader__, __file__
+   import sys, pkg_resources, imp
+   __file__ = pkg_resources.resource_filename(__name__,'Blowfish.so')
+   __loader__ = None; del __bootstrap__, __loader__
+   imp.load_dynamic(__name__,__file__)
+__bootstrap__()
Index: /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Cipher/DES3.py
===================================================================
--- /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Cipher/DES3.py (revision 3)
+++ /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Cipher/DES3.py (revision 3)
@@ -0,0 +1,7 @@
+def __bootstrap__():
+   global __bootstrap__, __loader__, __file__
+   import sys, pkg_resources, imp
+   __file__ = pkg_resources.resource_filename(__name__,'DES3.so')
+   __loader__ = None; del __bootstrap__, __loader__
+   imp.load_dynamic(__name__,__file__)
+__bootstrap__()
Index: /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Cipher/__init__.py
===================================================================
--- /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Cipher/__init__.py (revision 3)
+++ /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Cipher/__init__.py (revision 3)
@@ -0,0 +1,33 @@
+"""Secret-key encryption algorithms.
+
+Secret-key encryption algorithms transform plaintext in some way that
+is dependent on a key, producing ciphertext. This transformation can
+easily be reversed, if (and, hopefully, only if) one knows the key.
+
+The encryption modules here all support the interface described in PEP
+272, "API for Block Encryption Algorithms".
+
+If you don't know which algorithm to choose, use AES because it's
+standard and has undergone a fair bit of examination.
+
+Crypto.Cipher.AES         Advanced Encryption Standard
+Crypto.Cipher.ARC2        Alleged RC2
+Crypto.Cipher.ARC4        Alleged RC4
+Crypto.Cipher.Blowfish
+Crypto.Cipher.CAST
+Crypto.Cipher.DES         The Data Encryption Standard.  Very commonly used
+                          in the past, but today its 56-bit keys are too small.
+Crypto.Cipher.DES3        Triple DES.
+Crypto.Cipher.IDEA
+Crypto.Cipher.RC5
+Crypto.Cipher.XOR         The simple XOR cipher.
+"""
+
+__all__ = ['AES', 'ARC2', 'ARC4',
+           'Blowfish', 'CAST', 'DES', 'DES3', 'IDEA', 'RC5',
+           'XOR'
+           ]
+
+__revision__ = "$Id: __init__.py,v 1.7 2003/02/28 15:28:35 akuchling Exp $"
+
+
Index: /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Cipher/IDEA.py
===================================================================
--- /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Cipher/IDEA.py (revision 3)
+++ /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Cipher/IDEA.py (revision 3)
@@ -0,0 +1,7 @@
+def __bootstrap__():
+   global __bootstrap__, __loader__, __file__
+   import sys, pkg_resources, imp
+   __file__ = pkg_resources.resource_filename(__name__,'IDEA.so')
+   __loader__ = None; del __bootstrap__, __loader__
+   imp.load_dynamic(__name__,__file__)
+__bootstrap__()
Index: /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Cipher/ARC2.py
===================================================================
--- /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Cipher/ARC2.py (revision 3)
+++ /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Cipher/ARC2.py (revision 3)
@@ -0,0 +1,7 @@
+def __bootstrap__():
+   global __bootstrap__, __loader__, __file__
+   import sys, pkg_resources, imp
+   __file__ = pkg_resources.resource_filename(__name__,'ARC2.so')
+   __loader__ = None; del __bootstrap__, __loader__
+   imp.load_dynamic(__name__,__file__)
+__bootstrap__()
Index: /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Util/RFC1751.py
===================================================================
--- /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Util/RFC1751.py (revision 3)
+++ /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Util/RFC1751.py (revision 3)
@@ -0,0 +1,342 @@
+#!/usr/local/bin/python
+# rfc1751.py : Converts between 128-bit strings and a human-readable
+# sequence of words, as defined in RFC1751: "A Convention for
+# Human-Readable 128-bit Keys", by Daniel L. McDonald.
+
+__revision__ = "$Id: RFC1751.py,v 1.6 2003/04/04 15:15:10 akuchling Exp $"
+
+
+import string, binascii
+
+binary={0:'0000', 1:'0001', 2:'0010', 3:'0011', 4:'0100', 5:'0101',
+        6:'0110', 7:'0111', 8:'1000', 9:'1001', 10:'1010', 11:'1011',
+        12:'1100', 13:'1101', 14:'1110', 15:'1111'}
+
+def _key2bin(s):
+    "Convert a key into a string of binary digits"
+    kl=map(lambda x: ord(x), s)
+    kl=map(lambda x: binary[x/16]+binary[x&15], kl)
+    return ''.join(kl)
+
+def _extract(key, start, length):
+    """Extract a bitstring from a string of binary digits, and return its
+    numeric value."""
+    k=key[start:start+length]
+    return reduce(lambda x,y: x*2+ord(y)-48, k, 0)
+
+def key_to_english (key):
+    """key_to_english(key:string) : string
+    Transform an arbitrary key into a string containing English words.
+    The key length must be a multiple of 8.
+    """
+    english=''
+    for index in range(0, len(key), 8): # Loop over 8-byte subkeys
+        subkey=key[index:index+8]
+        # Compute the parity of the key
+        skbin=_key2bin(subkey) ; p=0
+        for i in range(0, 64, 2): p=p+_extract(skbin, i, 2)
+        # Append parity bits to the subkey
+        skbin=_key2bin(subkey+chr((p<<6) & 255))
+        for i in range(0, 64, 11):
+            english=english+wordlist[_extract(skbin, i, 11)]+' '
+
+    return english[:-1]                 # Remove the trailing space
+
+def english_to_key (str):
+    """english_to_key(string):string
+    Transform a string into a corresponding key.
+    The string must contain words separated by whitespace; the number
+    of words must be a multiple of 6.
+    """
+
+    L=string.split(string.upper(str)) ; key=''
+    for index in range(0, len(L), 6):
+        sublist=L[index:index+6] ; char=9*[0] ; bits=0
+        for i in sublist:
+            index = wordlist.index(i)
+            shift = (8-(bits+11)%8) %8
+            y = index << shift
+            cl, cc, cr = (y>>16), (y>>8)&0xff, y & 0xff
+            if (shift>5):
+                char[bits/8] = char[bits/8] | cl
+                char[bits/8+1] = char[bits/8+1] | cc
+                char[bits/8+2] = char[bits/8+2] | cr
+            elif shift>-3:
+                char[bits/8] = char[bits/8] | cc
+                char[bits/8+1] = char[bits/8+1] | cr
+            else: char[bits/8] = char[bits/8] | cr
+            bits=bits+11
+        subkey=reduce(lambda x,y:x+chr(y), char, '')
+
+        # Check the parity of the resulting key
+        skbin=_key2bin(subkey)
+        p=0
+        for i in range(0, 64, 2): p=p+_extract(skbin, i, 2)
+        if (p&3) != _extract(skbin, 64, 2):
+            raise ValueError, "Parity error in resulting key"
+        key=key+subkey[0:8]
+    return key
+
+wordlist=[ "A", "ABE", "ACE", "ACT", "AD", "ADA", "ADD",
+   "AGO", "AID", "AIM", "AIR", "ALL", "ALP", "AM", "AMY", "AN", "ANA",
+   "AND", "ANN", "ANT", "ANY", "APE", "APS", "APT", "ARC", "ARE", "ARK",
+   "ARM", "ART", "AS", "ASH", "ASK", "AT", "ATE", "AUG", "AUK", "AVE",
+   "AWE", "AWK", "AWL", "AWN", "AX", "AYE", "BAD", "BAG", "BAH", "BAM",
+   "BAN", "BAR", "BAT", "BAY", "BE", "BED", "BEE", "BEG", "BEN", "BET",
+   "BEY", "BIB", "BID", "BIG", "BIN", "BIT", "BOB", "BOG", "BON", "BOO",
+   "BOP", "BOW", "BOY", "BUB", "BUD", "BUG", "BUM", "BUN", "BUS", "BUT",
+   "BUY", "BY", "BYE", "CAB", "CAL", "CAM", "CAN", "CAP", "CAR", "CAT",
+   "CAW", "COD", "COG", "COL", "CON", "COO", "COP", "COT", "COW", "COY",
+   "CRY", "CUB", "CUE", "CUP", "CUR", "CUT", "DAB", "DAD", "DAM", "DAN",
+   "DAR", "DAY", "DEE", "DEL", "DEN", "DES", "DEW", "DID", "DIE", "DIG",
+   "DIN", "DIP", "DO", "DOE", "DOG", "DON", "DOT", "DOW", "DRY", "DUB",
+   "DUD", "DUE", "DUG", "DUN", "EAR", "EAT", "ED", "EEL", "EGG", "EGO",
+   "ELI", "ELK", "ELM", "ELY", "EM", "END", "EST", "ETC", "EVA", "EVE",
+   "EWE", "EYE", "FAD", "FAN", "FAR", "FAT", "FAY", "FED", "FEE", "FEW",
+   "FIB", "FIG", "FIN", "FIR", "FIT", "FLO", "FLY", "FOE", "FOG", "FOR",
+   "FRY", "FUM", "FUN", "FUR", "GAB", "GAD", "GAG", "GAL", "GAM", "GAP",
+   "GAS", "GAY", "GEE", "GEL", "GEM", "GET", "GIG", "GIL", "GIN", "GO",
+   "GOT", "GUM", "GUN", "GUS", "GUT", "GUY", "GYM", "GYP", "HA", "HAD",
+   "HAL", "HAM", "HAN", "HAP", "HAS", "HAT", "HAW", "HAY", "HE", "HEM",
+   "HEN", "HER", "HEW", "HEY", "HI", "HID", "HIM", "HIP", "HIS", "HIT",
+   "HO", "HOB", "HOC", "HOE", "HOG", "HOP", "HOT", "HOW", "HUB", "HUE",
+   "HUG", "HUH", "HUM", "HUT", "I", "ICY", "IDA", "IF", "IKE", "ILL",
+   "INK", "INN", "IO", "ION", "IQ", "IRA", "IRE", "IRK", "IS", "IT",
+   "ITS", "IVY", "JAB", "JAG", "JAM", "JAN", "JAR", "JAW", "JAY", "JET",
+   "JIG", "JIM", "JO", "JOB", "JOE", "JOG", "JOT", "JOY", "JUG", "JUT",
+   "KAY", "KEG", "KEN", "KEY", "KID", "KIM", "KIN", "KIT", "LA", "LAB",
+   "LAC", "LAD", "LAG", "LAM", "LAP", "LAW", "LAY", "LEA", "LED", "LEE",
+   "LEG", "LEN", "LEO", "LET", "LEW", "LID", "LIE", "LIN", "LIP", "LIT",
+   "LO", "LOB", "LOG", "LOP", "LOS", "LOT", "LOU", "LOW", "LOY", "LUG",
+   "LYE", "MA", "MAC", "MAD", "MAE", "MAN", "MAO", "MAP", "MAT", "MAW",
+   "MAY", "ME", "MEG", "MEL", "MEN", "MET", "MEW", "MID", "MIN", "MIT",
+   "MOB", "MOD", "MOE", "MOO", "MOP", "MOS", "MOT", "MOW", "MUD", "MUG",
+   "MUM", "MY", "NAB", "NAG", "NAN", "NAP", "NAT", "NAY", "NE", "NED",
+   "NEE", "NET", "NEW", "NIB", "NIL", "NIP", "NIT", "NO", "NOB", "NOD",
+   "NON", "NOR", "NOT", "NOV", "NOW", "NU", "NUN", "NUT", "O", "OAF",
+   "OAK", "OAR", "OAT", "ODD", "ODE", "OF", "OFF", "OFT", "OH", "OIL",
+   "OK", "OLD", "ON", "ONE", "OR", "ORB", "ORE", "ORR", "OS", "OTT",
+   "OUR", "OUT", "OVA", "OW", "OWE", "OWL", "OWN", "OX", "PA", "PAD",
+   "PAL", "PAM", "PAN", "PAP", "PAR", "PAT", "PAW", "PAY", "PEA", "PEG",
+   "PEN", "PEP", "PER", "PET", "PEW", "PHI", "PI", "PIE", "PIN", "PIT",
+   "PLY", "PO", "POD", "POE", "POP", "POT", "POW", "PRO", "PRY", "PUB",
+   "PUG", "PUN", "PUP", "PUT", "QUO", "RAG", "RAM", "RAN", "RAP", "RAT",
+   "RAW", "RAY", "REB", "RED", "REP", "RET", "RIB", "RID", "RIG", "RIM",
+   "RIO", "RIP", "ROB", "ROD", "ROE", "RON", "ROT", "ROW", "ROY", "RUB",
+   "RUE", "RUG", "RUM", "RUN", "RYE", "SAC", "SAD", "SAG", "SAL", "SAM",
+   "SAN", "SAP", "SAT", "SAW", "SAY", "SEA", "SEC", "SEE", "SEN", "SET",
+   "SEW", "SHE", "SHY", "SIN", "SIP", "SIR", "SIS", "SIT", "SKI", "SKY",
+   "SLY", "SO", "SOB", "SOD", "SON", "SOP", "SOW", "SOY", "SPA", "SPY",
+   "SUB", "SUD", "SUE", "SUM", "SUN", "SUP", "TAB", "TAD", "TAG", "TAN",
+   "TAP", "TAR", "TEA", "TED", "TEE", "TEN", "THE", "THY", "TIC", "TIE",
+   "TIM", "TIN", "TIP", "TO", "TOE", "TOG", "TOM", "TON", "TOO", "TOP",
+   "TOW", "TOY", "TRY", "TUB", "TUG", "TUM", "TUN", "TWO", "UN", "UP",
+   "US", "USE", "VAN", "VAT", "VET", "VIE", "WAD", "WAG", "WAR", "WAS",
+   "WAY", "WE", "WEB", "WED", "WEE", "WET", "WHO", "WHY", "WIN", "WIT",
+   "WOK", "WON", "WOO", "WOW", "WRY", "WU", "YAM", "YAP", "YAW", "YE",
+   "YEA", "YES", "YET", "YOU", "ABED", "ABEL", "ABET", "ABLE", "ABUT",
+   "ACHE", "ACID", "ACME", "ACRE", "ACTA", "ACTS", "ADAM", "ADDS",
+   "ADEN", "AFAR", "AFRO", "AGEE", "AHEM", "AHOY", "AIDA", "AIDE",
+   "AIDS", "AIRY", "AJAR", "AKIN", "ALAN", "ALEC", "ALGA", "ALIA",
+   "ALLY", "ALMA", "ALOE", "ALSO", "ALTO", "ALUM", "ALVA", "AMEN",
+   "AMES", "AMID", "AMMO", "AMOK", "AMOS", "AMRA", "ANDY", "ANEW",
+   "ANNA", "ANNE", "ANTE", "ANTI", "AQUA", "ARAB", "ARCH", "AREA",
+   "ARGO", "ARID", "ARMY", "ARTS", "ARTY", "ASIA", "ASKS", "ATOM",
+   "AUNT", "AURA", "AUTO", "AVER", "AVID", "AVIS", "AVON", "AVOW",
+   "AWAY", "AWRY", "BABE", "BABY", "BACH", "BACK", "BADE", "BAIL",
+   "BAIT", "BAKE", "BALD", "BALE", "BALI", "BALK", "BALL", "BALM",
+   "BAND", "BANE", "BANG", "BANK", "BARB", "BARD", "BARE", "BARK",
+   "BARN", "BARR", "BASE", "BASH", "BASK", "BASS", "BATE", "BATH",
+   "BAWD", "BAWL", "BEAD", "BEAK", "BEAM", "BEAN", "BEAR", "BEAT",
+   "BEAU", "BECK", "BEEF", "BEEN", "BEER",
+   "BEET", "BELA", "BELL", "BELT", "BEND", "BENT", "BERG", "BERN",
+   "BERT", "BESS", "BEST", "BETA", "BETH", "BHOY", "BIAS", "BIDE",
+   "BIEN", "BILE", "BILK", "BILL", "BIND", "BING", "BIRD", "BITE",
+   "BITS", "BLAB", "BLAT", "BLED", "BLEW", "BLOB", "BLOC", "BLOT",
+   "BLOW", "BLUE", "BLUM", "BLUR", "BOAR", "BOAT", "BOCA", "BOCK",
+   "BODE", "BODY", "BOGY", "BOHR", "BOIL", "BOLD", "BOLO", "BOLT",
+   "BOMB", "BONA", "BOND", "BONE", "BONG", "BONN", "BONY", "BOOK",
+   "BOOM", "BOON", "BOOT", "BORE", "BORG", "BORN", "BOSE", "BOSS",
+   "BOTH", "BOUT", "BOWL", "BOYD", "BRAD", "BRAE", "BRAG", "BRAN",
+   "BRAY", "BRED", "BREW", "BRIG", "BRIM", "BROW", "BUCK", "BUDD",
+   "BUFF", "BULB", "BULK", "BULL", "BUNK", "BUNT", "BUOY", "BURG",
+   "BURL", "BURN", "BURR", "BURT", "BURY", "BUSH", "BUSS", "BUST",
+   "BUSY", "BYTE", "CADY", "CAFE", "CAGE", "CAIN", "CAKE", "CALF",
+   "CALL", "CALM", "CAME", "CANE", "CANT", "CARD", "CARE", "CARL",
+   "CARR", "CART", "CASE", "CASH", "CASK", "CAST", "CAVE", "CEIL",
+   "CELL", "CENT", "CERN", "CHAD", "CHAR", "CHAT", "CHAW", "CHEF",
+   "CHEN", "CHEW", "CHIC", "CHIN", "CHOU", "CHOW", "CHUB", "CHUG",
+   "CHUM", "CITE", "CITY", "CLAD", "CLAM", "CLAN", "CLAW", "CLAY",
+   "CLOD", "CLOG", "CLOT", "CLUB", "CLUE", "COAL", "COAT", "COCA",
+   "COCK", "COCO", "CODA", "CODE", "CODY", "COED", "COIL", "COIN",
+   "COKE", "COLA", "COLD", "COLT", "COMA", "COMB", "COME", "COOK",
+   "COOL", "COON", "COOT", "CORD", "CORE", "CORK", "CORN", "COST",
+   "COVE", "COWL", "CRAB", "CRAG", "CRAM", "CRAY", "CREW", "CRIB",
+   "CROW", "CRUD", "CUBA", "CUBE", "CUFF", "CULL", "CULT", "CUNY",
+   "CURB", "CURD", "CURE", "CURL", "CURT", "CUTS", "DADE", "DALE",
+   "DAME", "DANA", "DANE", "DANG", "DANK", "DARE", "DARK", "DARN",
+   "DART", "DASH", "DATA", "DATE", "DAVE", "DAVY", "DAWN", "DAYS",
+   "DEAD", "DEAF", "DEAL", "DEAN", "DEAR", "DEBT", "DECK", "DEED",
+   "DEEM", "DEER", "DEFT", "DEFY", "DELL", "DENT", "DENY", "DESK",
+   "DIAL", "DICE", "DIED", "DIET", "DIME", "DINE", "DING", "DINT",
+   "DIRE", "DIRT", "DISC", "DISH", "DISK", "DIVE", "DOCK", "DOES",
+   "DOLE", "DOLL", "DOLT", "DOME", "DONE", "DOOM", "DOOR", "DORA",
+   "DOSE", "DOTE", "DOUG", "DOUR", "DOVE", "DOWN", "DRAB", "DRAG",
+   "DRAM", "DRAW", "DREW", "DRUB", "DRUG", "DRUM", "DUAL", "DUCK",
+   "DUCT", "DUEL", "DUET", "DUKE", "DULL", "DUMB", "DUNE", "DUNK",
+   "DUSK", "DUST", "DUTY", "EACH", "EARL", "EARN", "EASE", "EAST",
+   "EASY", "EBEN", "ECHO", "EDDY", "EDEN", "EDGE", "EDGY", "EDIT",
+   "EDNA", "EGAN", "ELAN", "ELBA", "ELLA", "ELSE", "EMIL", "EMIT",
+   "EMMA", "ENDS", "ERIC", "EROS", "EVEN", "EVER", "EVIL", "EYED",
+   "FACE", "FACT", "FADE", "FAIL", "FAIN", "FAIR", "FAKE", "FALL",
+   "FAME", "FANG", "FARM", "FAST", "FATE", "FAWN", "FEAR", "FEAT",
+   "FEED", "FEEL", "FEET", "FELL", "FELT", "FEND", "FERN", "FEST",
+   "FEUD", "FIEF", "FIGS", "FILE", "FILL", "FILM", "FIND", "FINE",
+   "FINK", "FIRE", "FIRM", "FISH", "FISK", "FIST", "FITS", "FIVE",
+   "FLAG", "FLAK", "FLAM", "FLAT", "FLAW", "FLEA", "FLED", "FLEW",
+   "FLIT", "FLOC", "FLOG", "FLOW", "FLUB", "FLUE", "FOAL", "FOAM",
+   "FOGY", "FOIL", "FOLD", "FOLK", "FOND", "FONT", "FOOD", "FOOL",
+   "FOOT", "FORD", "FORE", "FORK", "FORM", "FORT", "FOSS", "FOUL",
+   "FOUR", "FOWL", "FRAU", "FRAY", "FRED", "FREE", "FRET", "FREY",
+   "FROG", "FROM", "FUEL", "FULL", "FUME", "FUND", "FUNK", "FURY",
+   "FUSE", "FUSS", "GAFF", "GAGE", "GAIL", "GAIN", "GAIT", "GALA",
+   "GALE", "GALL", "GALT", "GAME", "GANG", "GARB", "GARY", "GASH",
+   "GATE", "GAUL", "GAUR", "GAVE", "GAWK", "GEAR", "GELD", "GENE",
+   "GENT", "GERM", "GETS", "GIBE", "GIFT", "GILD", "GILL", "GILT",
+   "GINA", "GIRD", "GIRL", "GIST", "GIVE", "GLAD", "GLEE", "GLEN",
+   "GLIB", "GLOB", "GLOM", "GLOW", "GLUE", "GLUM", "GLUT", "GOAD",
+   "GOAL", "GOAT", "GOER", "GOES", "GOLD", "GOLF", "GONE", "GONG",
+   "GOOD", "GOOF", "GORE", "GORY", "GOSH", "GOUT", "GOWN", "GRAB",
+   "GRAD", "GRAY", "GREG", "GREW", "GREY", "GRID", "GRIM", "GRIN",
+   "GRIT", "GROW", "GRUB", "GULF", "GULL", "GUNK", "GURU", "GUSH",
+   "GUST", "GWEN", "GWYN", "HAAG", "HAAS", "HACK", "HAIL", "HAIR",
+   "HALE", "HALF", "HALL", "HALO", "HALT", "HAND", "HANG", "HANK",
+   "HANS", "HARD", "HARK", "HARM", "HART", "HASH", "HAST", "HATE",
+   "HATH", "HAUL", "HAVE", "HAWK", "HAYS", "HEAD", "HEAL", "HEAR",
+   "HEAT", "HEBE", "HECK", "HEED", "HEEL", "HEFT", "HELD", "HELL",
+   "HELM", "HERB", "HERD", "HERE", "HERO", "HERS", "HESS", "HEWN",
+   "HICK", "HIDE", "HIGH", "HIKE", "HILL", "HILT", "HIND", "HINT",
+   "HIRE", "HISS", "HIVE", "HOBO", "HOCK", "HOFF", "HOLD", "HOLE",
+   "HOLM", "HOLT", "HOME", "HONE", "HONK", "HOOD", "HOOF", "HOOK",
+   "HOOT", "HORN", "HOSE", "HOST", "HOUR", "HOVE", "HOWE", "HOWL",
+   "HOYT", "HUCK", "HUED", "HUFF", "HUGE", "HUGH", "HUGO", "HULK",
+   "HULL", "HUNK", "HUNT", "HURD", "HURL", "HURT", "HUSH", "HYDE",
+   "HYMN", "IBIS", "ICON", "IDEA", "IDLE", "IFFY", "INCA", "INCH",
+   "INTO", "IONS", "IOTA", "IOWA", "IRIS", "IRMA", "IRON", "ISLE",
+   "ITCH", "ITEM", "IVAN", "JACK", "JADE", "JAIL", "JAKE", "JANE",
+   "JAVA", "JEAN", "JEFF", "JERK", "JESS", "JEST", "JIBE", "JILL",
+   "JILT", "JIVE", "JOAN", "JOBS", "JOCK", "JOEL", "JOEY", "JOHN",
+   "JOIN", "JOKE", "JOLT", "JOVE", "JUDD", "JUDE", "JUDO", "JUDY",
+   "JUJU", "JUKE", "JULY", "JUNE", "JUNK", "JUNO", "JURY", "JUST",
+   "JUTE", "KAHN", "KALE", "KANE", "KANT", "KARL", "KATE", "KEEL",
+   "KEEN", "KENO", "KENT", "KERN", "KERR", "KEYS", "KICK", "KILL",
+   "KIND", "KING", "KIRK", "KISS", "KITE", "KLAN", "KNEE", "KNEW",
+   "KNIT", "KNOB", "KNOT", "KNOW", "KOCH", "KONG", "KUDO", "KURD",
+   "KURT", "KYLE", "LACE", "LACK", "LACY", "LADY", "LAID", "LAIN",
+   "LAIR", "LAKE", "LAMB", "LAME", "LAND", "LANE", "LANG", "LARD",
+   "LARK", "LASS", "LAST", "LATE", "LAUD", "LAVA", "LAWN", "LAWS",
+   "LAYS", "LEAD", "LEAF", "LEAK", "LEAN", "LEAR", "LEEK", "LEER",
+   "LEFT", "LEND", "LENS", "LENT", "LEON", "LESK", "LESS", "LEST",
+   "LETS", "LIAR", "LICE", "LICK", "LIED", "LIEN", "LIES", "LIEU",
+   "LIFE", "LIFT", "LIKE", "LILA", "LILT", "LILY", "LIMA", "LIMB",
+   "LIME", "LIND", "LINE", "LINK", "LINT", "LION", "LISA", "LIST",
+   "LIVE", "LOAD", "LOAF", "LOAM", "LOAN", "LOCK", "LOFT", "LOGE",
+   "LOIS", "LOLA", "LONE", "LONG", "LOOK", "LOON", "LOOT", "LORD",
+   "LORE", "LOSE", "LOSS", "LOST", "LOUD", "LOVE", "LOWE", "LUCK",
+   "LUCY", "LUGE", "LUKE", "LULU", "LUND", "LUNG", "LURA", "LURE",
+   "LURK", "LUSH", "LUST", "LYLE", "LYNN", "LYON", "LYRA", "MACE",
+   "MADE", "MAGI", "MAID", "MAIL", "MAIN", "MAKE", "MALE", "MALI",
+   "MALL", "MALT", "MANA", "MANN", "MANY", "MARC", "MARE", "MARK",
+   "MARS", "MART", "MARY", "MASH", "MASK", "MASS", "MAST", "MATE",
+   "MATH", "MAUL", "MAYO", "MEAD", "MEAL", "MEAN", "MEAT", "MEEK",
+   "MEET", "MELD", "MELT", "MEMO", "MEND", "MENU", "MERT", "MESH",
+   "MESS", "MICE", "MIKE", "MILD", "MILE", "MILK", "MILL", "MILT",
+   "MIMI", "MIND", "MINE", "MINI", "MINK", "MINT", "MIRE", "MISS",
+   "MIST", "MITE", "MITT", "MOAN", "MOAT", "MOCK", "MODE", "MOLD",
+   "MOLE", "MOLL", "MOLT", "MONA", "MONK", "MONT", "MOOD", "MOON",
+   "MOOR", "MOOT", "MORE", "MORN", "MORT", "MOSS", "MOST", "MOTH",
+   "MOVE", "MUCH", "MUCK", "MUDD", "MUFF", "MULE", "MULL", "MURK",
+   "MUSH", "MUST", "MUTE", "MUTT", "MYRA", "MYTH", "NAGY", "NAIL",
+   "NAIR", "NAME", "NARY", "NASH", "NAVE", "NAVY", "NEAL", "NEAR",
+   "NEAT", "NECK", "NEED", "NEIL", "NELL", "NEON", "NERO", "NESS",
+   "NEST", "NEWS", "NEWT", "NIBS", "NICE", "NICK", "NILE", "NINA",
+   "NINE", "NOAH", "NODE", "NOEL", "NOLL", "NONE", "NOOK", "NOON",
+   "NORM", "NOSE", "NOTE", "NOUN", "NOVA", "NUDE", "NULL", "NUMB",
+   "OATH", "OBEY", "OBOE", "ODIN", "OHIO", "OILY", "OINT", "OKAY",
+   "OLAF", "OLDY", "OLGA", "OLIN", "OMAN", "OMEN", "OMIT", "ONCE",
+   "ONES", "ONLY", "ONTO", "ONUS", "ORAL", "ORGY", "OSLO", "OTIS",
+   "OTTO", "OUCH", "OUST", "OUTS", "OVAL", "OVEN", "OVER", "OWLY",
+   "OWNS", "QUAD", "QUIT", "QUOD", "RACE", "RACK", "RACY", "RAFT",
+   "RAGE", "RAID", "RAIL", "RAIN", "RAKE", "RANK", "RANT", "RARE",
+   "RASH", "RATE", "RAVE", "RAYS", "READ", "REAL", "REAM", "REAR",
+   "RECK", "REED", "REEF", "REEK", "REEL", "REID", "REIN", "RENA",
+   "REND", "RENT", "REST", "RICE", "RICH", "RICK", "RIDE", "RIFT",
+   "RILL", "RIME", "RING", "RINK", "RISE", "RISK", "RITE", "ROAD",
+   "ROAM", "ROAR", "ROBE", "ROCK", "RODE", "ROIL", "ROLL", "ROME",
+   "ROOD", "ROOF", "ROOK", "ROOM", "ROOT", "ROSA", "ROSE", "ROSS",
+   "ROSY", "ROTH", "ROUT", "ROVE", "ROWE", "ROWS", "RUBE", "RUBY",
+   "RUDE", "RUDY", "RUIN", "RULE", "RUNG", "RUNS", "RUNT", "RUSE",
+   "RUSH", "RUSK", "RUSS", "RUST", "RUTH", "SACK", "SAFE", "SAGE",
+   "SAID", "SAIL", "SALE", "SALK", "SALT", "SAME", "SAND", "SANE",
+   "SANG", "SANK", "SARA", "SAUL", "SAVE", "SAYS", "SCAN", "SCAR",
+   "SCAT", "SCOT", "SEAL", "SEAM", "SEAR", "SEAT", "SEED", "SEEK",
+   "SEEM", "SEEN", "SEES", "SELF", "SELL", "SEND", "SENT", "SETS",
+   "SEWN", "SHAG", "SHAM", "SHAW", "SHAY", "SHED", "SHIM", "SHIN",
+   "SHOD", "SHOE", "SHOT", "SHOW", "SHUN", "SHUT", "SICK", "SIDE",
+   "SIFT", "SIGH", "SIGN", "SILK", "SILL", "SILO", "SILT", "SINE",
+   "SING", "SINK", "SIRE", "SITE", "SITS", "SITU", "SKAT", "SKEW",
+   "SKID", "SKIM", "SKIN", "SKIT", "SLAB", "SLAM", "SLAT", "SLAY",
+   "SLED", "SLEW", "SLID", "SLIM", "SLIT", "SLOB", "SLOG", "SLOT",
+   "SLOW", "SLUG", "SLUM", "SLUR", "SMOG", "SMUG", "SNAG", "SNOB",
+   "SNOW", "SNUB", "SNUG", "SOAK", "SOAR", "SOCK", "SODA", "SOFA",
+   "SOFT", "SOIL", "SOLD", "SOME", "SONG", "SOON", "SOOT", "SORE",
+   "SORT", "SOUL", "SOUR", "SOWN", "STAB", "STAG", "STAN", "STAR",
+   "STAY", "STEM", "STEW", "STIR", "STOW", "STUB", "STUN", "SUCH",
+   "SUDS", "SUIT", "SULK", "SUMS", "SUNG", "SUNK", "SURE", "SURF",
+   "SWAB", "SWAG", "SWAM", "SWAN", "SWAT", "SWAY", "SWIM", "SWUM",
+   "TACK", "TACT", "TAIL", "TAKE", "TALE", "TALK", "TALL", "TANK",
+   "TASK", "TATE", "TAUT", "TEAL", "TEAM", "TEAR", "TECH", "TEEM",
+   "TEEN", "TEET", "TELL", "TEND", "TENT", "TERM", "TERN", "TESS",
+   "TEST", "THAN", "THAT", "THEE", "THEM", "THEN", "THEY", "THIN",
+   "THIS", "THUD", "THUG", "TICK", "TIDE", "TIDY", "TIED", "TIER",
+   "TILE", "TILL", "TILT", "TIME", "TINA", "TINE", "TINT", "TINY",
+   "TIRE", "TOAD", "TOGO", "TOIL", "TOLD", "TOLL", "TONE", "TONG",
+   "TONY", "TOOK", "TOOL", "TOOT", "TORE", "TORN", "TOTE", "TOUR",
+   "TOUT", "TOWN", "TRAG", "TRAM", "TRAY", "TREE", "TREK", "TRIG",
+   "TRIM", "TRIO", "TROD", "TROT", "TROY", "TRUE", "TUBA", "TUBE",
+   "TUCK", "TUFT", "TUNA", "TUNE", "TUNG", "TURF", "TURN", "TUSK",
+   "TWIG", "TWIN", "TWIT", "ULAN", "UNIT", "URGE", "USED", "USER",
+   "USES", "UTAH", "VAIL", "VAIN", "VALE", "VARY", "VASE", "VAST",
+   "VEAL", "VEDA", "VEIL", "VEIN", "VEND", "VENT", "VERB", "VERY",
+   "VETO", "VICE", "VIEW", "VINE", "VISE", "VOID", "VOLT", "VOTE",
+   "WACK", "WADE", "WAGE", "WAIL", "WAIT", "WAKE", "WALE", "WALK",
+   "WALL", "WALT", "WAND", "WANE", "WANG", "WANT", "WARD", "WARM",
+   "WARN", "WART", "WASH", "WAST", "WATS", "WATT", "WAVE", "WAVY",
+   "WAYS", "WEAK", "WEAL", "WEAN", "WEAR", "WEED", "WEEK", "WEIR",
+   "WELD", "WELL", "WELT", "WENT", "WERE", "WERT", "WEST", "WHAM",
+   "WHAT", "WHEE", "WHEN", "WHET", "WHOA", "WHOM", "WICK", "WIFE",
+   "WILD", "WILL", "WIND", "WINE", "WING", "WINK", "WINO", "WIRE",
+   "WISE", "WISH", "WITH", "WOLF", "WONT", "WOOD", "WOOL", "WORD",
+   "WORE", "WORK", "WORM", "WORN", "WOVE", "WRIT", "WYNN", "YALE",
+   "YANG", "YANK", "YARD", "YARN", "YAWL", "YAWN", "YEAH", "YEAR",
+   "YELL", "YOGA", "YOKE" ]
+
+if __name__=='__main__':
+    data = [('EB33F77EE73D4053', 'TIDE ITCH SLOW REIN RULE MOT'),
+            ('CCAC2AED591056BE4F90FD441C534766',
+             'RASH BUSH MILK LOOK BAD BRIM AVID GAFF BAIT ROT POD LOVE'),
+            ('EFF81F9BFBC65350920CDD7416DE8009',
+             'TROD MUTE TAIL WARM CHAR KONG HAAG CITY BORE O TEAL AWL')
+           ]
+
+    for key, words in data:
+        print 'Trying key', key
+        key=binascii.a2b_hex(key)
+        w2=key_to_english(key)
+        if w2!=words:
+            print 'key_to_english fails on key', repr(key), ', producing', str(w2)
+        k2=english_to_key(words)
+        if k2!=key:
+            print 'english_to_key fails on key', repr(key), ', producing', repr(k2)
+
+
Index: /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Util/number.py
===================================================================
--- /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Util/number.py (revision 3)
+++ /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Util/number.py (revision 3)
@@ -0,0 +1,201 @@
+#
+#   number.py : Number-theoretic functions
+#
+#  Part of the Python Cryptography Toolkit
+#
+# Distribute and use freely; there are no restrictions on further
+# dissemination and usage except those imposed by the laws of your
+# country of residence.  This software is provided "as is" without
+# warranty of fitness for use or suitability for any purpose, express
+# or implied. Use at your own risk or not at all.
+#
+
+__revision__ = "$Id: number.py,v 1.13 2003/04/04 18:21:07 akuchling Exp $"
+
+bignum = long
+try:
+    from Crypto.PublicKey import _fastmath
+except ImportError:
+    _fastmath = None
+
+# Commented out and replaced with faster versions below
+## def long2str(n):
+##     s=''
+##     while n>0:
+##         s=chr(n & 255)+s
+##         n=n>>8
+##     return s
+
+## import types
+## def str2long(s):
+##     if type(s)!=types.StringType: return s   # Integers will be left alone
+##     return reduce(lambda x,y : x*256+ord(y), s, 0L)
+
+def size (N):
+    """size(N:long) : int
+    Returns the size of the number N in bits.
+    """
+    bits, power = 0,1L
+    while N >= power:
+        bits += 1
+        power = power << 1
+    return bits
+
+def getRandomNumber(N, randfunc):
+    """getRandomNumber(N:int, randfunc:callable):long
+    Return an N-bit random number."""
+
+    S = randfunc(N/8)
+    odd_bits = N % 8
+    if odd_bits != 0:
+        char = ord(randfunc(1)) >> (8-odd_bits)
+        S = chr(char) + S
+    value = bytes_to_long(S)
+    value |= 2L ** (N-1)                # Ensure high bit is set
+    assert size(value) >= N
+    return value
+
+def GCD(x,y):
+    """GCD(x:long, y:long): long
+    Return the GCD of x and y.
+    """
+    x = abs(x) ; y = abs(y)
+    while x > 0:
+        x, y = y % x, x
+    return y
+
+def inverse(u, v):
+    """inverse(u:long, u:long):long
+    Return the inverse of u mod v.
+    """
+    u3, v3 = long(u), long(v)
+    u1, v1 = 1L, 0L
+    while v3 > 0:
+        q=u3 / v3
+        u1, v1 = v1, u1 - v1*q
+        u3, v3 = v3, u3 - v3*q
+    while u1<0:
+        u1 = u1 + v
+    return u1
+
+# Given a number of bits to generate and a random generation function,
+# find a prime number of the appropriate size.
+
+def getPrime(N, randfunc):
+    """getPrime(N:int, randfunc:callable):long
+    Return a random N-bit prime number.
+    """
+
+    number=getRandomNumber(N, randfunc) | 1
+    while (not isPrime(number)):
+        number=number+2
+    return number
+
+def isPrime(N):
+    """isPrime(N:long):bool
+    Return true if N is prime.
+    """
+    if N == 1:
+        return 0
+    if N in sieve:
+        return 1
+    for i in sieve:
+        if (N % i)==0:
+            return 0
+
+    # Use the accelerator if available
+    if _fastmath is not None:
+        return _fastmath.isPrime(N)
+
+    # Compute the highest bit that's set in N
+    N1 = N - 1L
+    n = 1L
+    while (n<N):
+        n=n<<1L
+    n = n >> 1L
+
+    # Rabin-Miller test
+    for c in sieve[:7]:
+        a=long(c) ; d=1L ; t=n
+        while (t):  # Iterate over the bits in N1
+            x=(d*d) % N
+            if x==1L and d!=1L and d!=N1:
+                return 0  # Square root of 1 found
+            if N1 & t:
+                d=(x*a) % N
+            else:
+                d=x
+            t = t >> 1L
+        if d!=1L:
+            return 0
+    return 1
+
+# Small primes used for checking primality; these are all the primes
+# less than 256.  This should be enough to eliminate most of the odd
+# numbers before needing to do a Rabin-Miller test at all.
+
+sieve=[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59,
+       61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127,
+       131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193,
+       197, 199, 211, 223, 227, 229, 233, 239, 241, 251]
+
+# Improved conversion functions contributed by Barry Warsaw, after
+# careful benchmarking
+
+import struct
+
+def long_to_bytes(n, blocksize=0):
+    """long_to_bytes(n:long, blocksize:int) : string
+    Convert a long integer to a byte string.
+
+    If optional blocksize is given and greater than zero, pad the front of the
+    byte string with binary zeros so that the length is a multiple of
+    blocksize.
+    """
+    # after much testing, this algorithm was deemed to be the fastest
+    s = ''
+    n = long(n)
+    pack = struct.pack
+    while n > 0:
+        s = pack('>I', n & 0xffffffffL) + s
+        n = n >> 32
+    # strip off leading zeros
+    for i in range(len(s)):
+        if s[i] != '\000':
+            break
+    else:
+        # only happens when n == 0
+        s = '\000'
+        i = 0
+    s = s[i:]
+    # add back some pad bytes.  this could be done more efficiently w.r.t. the
+    # de-padding being done above, but sigh...
+    if blocksize > 0 and len(s) % blocksize:
+        s = (blocksize - len(s) % blocksize) * '\000' + s
+    return s
+
+def bytes_to_long(s):
+    """bytes_to_long(string) : long
+    Convert a byte string to a long integer.
+
+    This is (essentially) the inverse of long_to_bytes().
+    """
+    acc = 0L
+    unpack = struct.unpack
+    length = len(s)
+    if length % 4:
+        extra = (4 - length % 4)
+        s = '\000' * extra + s
+        length = length + extra
+    for i in range(0, length, 4):
+        acc = (acc << 32) + unpack('>I', s[i:i+4])[0]
+    return acc
+
+# For backwards compatibility...
+import warnings
+def long2str(n, blocksize=0):
+    warnings.warn("long2str() has been replaced by long_to_bytes()")
+    return long_to_bytes(n, blocksize)
+def str2long(s):
+    warnings.warn("str2long() has been replaced by bytes_to_long()")
+    return bytes_to_long(s)
Index: /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Util/randpool.py
===================================================================
--- /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Util/randpool.py (revision 3)
+++ /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Util/randpool.py (revision 3)
@@ -0,0 +1,421 @@
+#
+#  randpool.py : Cryptographically strong random number generation
+#
+# Part of the Python Cryptography Toolkit
+#
+# Distribute and use freely; there are no restrictions on further
+# dissemination and usage except those imposed by the laws of your
+# country of residence.  This software is provided "as is" without
+# warranty of fitness for use or suitability for any purpose, express
+# or implied. Use at your own risk or not at all.
+#
+
+__revision__ = "$Id: randpool.py,v 1.14 2004/05/06 12:56:54 akuchling Exp $"
+
+import time, array, types, warnings, os.path
+from Crypto.Util.number import long_to_bytes
+try:
+    import Crypto.Util.winrandom as winrandom
+except:
+    winrandom = None
+
+STIRNUM = 3
+
+class RandomPool:
+    """randpool.py : Cryptographically strong random number generation.
+
+    The implementation here is similar to the one in PGP.  To be
+    cryptographically strong, it must be difficult to determine the RNG's
+    output, whether in the future or the past.  This is done by using
+    a cryptographic hash function to "stir" the random data.
+
+    Entropy is gathered in the same fashion as PGP; the highest-resolution
+    clock around is read and the data is added to the random number pool.
+    A conservative estimate of the entropy is then kept.
+
+    If a cryptographically secure random source is available (/dev/urandom
+    on many Unixes, Windows CryptGenRandom on most Windows), then use
+    it.
+
+    Instance Attributes:
+    bits : int
+      Maximum size of pool in bits
+    bytes : int
+      Maximum size of pool in bytes
+    entropy : int
+      Number of bits of entropy in this pool.
+
+    Methods:
+    add_event([s]) : add some entropy to the pool
+    get_bytes(int) : get N bytes of random data
+    randomize([N]) : get N bytes of randomness from external source
+    """
+
+
+    def __init__(self, numbytes = 160, cipher=None, hash=None):
+        if hash is None:
+            from Crypto.Hash import SHA as hash
+
+        # The cipher argument is vestigial; it was removed from
+        # version 1.1 so RandomPool would work even in the limited
+        # exportable subset of the code
+        if cipher is not None:
+            warnings.warn("'cipher' parameter is no longer used")
+
+        if isinstance(hash, types.StringType):
+            # ugly hack to force __import__ to give us the end-path module
+            hash = __import__('Crypto.Hash.'+hash,
+                              None, None, ['new'])
+            warnings.warn("'hash' parameter should now be a hashing module")
+
+        self.bytes = numbytes
+        self.bits = self.bytes*8
+        self.entropy = 0
+        self._hash = hash
+
+        # Construct an array to hold the random pool,
+        # initializing it to 0.
+        self._randpool = array.array('B', [0]*self.bytes)
+
+        self._event1 = self._event2 = 0
+        self._addPos = 0
+        self._getPos = hash.digest_size
+        self._lastcounter=time.time()
+        self.__counter = 0
+
+        self._measureTickSize()        # Estimate timer resolution
+        self._randomize()
+
+    def _updateEntropyEstimate(self, nbits):
+        self.entropy += nbits
+        if self.entropy < 0:
+            self.entropy = 0
+        elif self.entropy > self.bits:
+            self.entropy = self.bits
+
+    def _randomize(self, N = 0, devname = '/dev/urandom'):
+        """_randomize(N, DEVNAME:device-filepath)
+        collects N bits of randomness from some entropy source (e.g.,
+        /dev/urandom on Unixes that have it, Windows CryptoAPI
+        CryptGenRandom, etc)
+        DEVNAME is optional, defaults to /dev/urandom.  You can change it
+        to /dev/random if you want to block till you get enough
+        entropy.
+        """
+        data = ''
+        if N <= 0:
+            nbytes = int((self.bits - self.entropy)/8+0.5)
+        else:
+            nbytes = int(N/8+0.5)
+        if winrandom:
+            # Windows CryptGenRandom provides random data.
+            data = winrandom.new().get_bytes(nbytes)
+        elif os.path.exists(devname):
+            # Many OSes support a /dev/urandom device
+            try:
+                f=open(devname)
+                data=f.read(nbytes)
+                f.close()
+            except IOError, (num, msg):
+                if num!=2: raise IOError, (num, msg)
+                # If the file wasn't found, ignore the error
+        if data:
+            self._addBytes(data)
+            # Entropy estimate: The number of bits of
+            # data obtained from the random source.
+            self._updateEntropyEstimate(8*len(data))
+        self.stir_n()                   # Wash the random pool
+
+    def randomize(self, N=0):
+        """randomize(N:int)
+        use the class entropy source to get some entropy data.
+        This is overridden by KeyboardRandomize().
+        """
+        return self._randomize(N)
+
+    def stir_n(self, N = STIRNUM):
+        """stir_n(N)
+        stirs the random pool N times
+        """
+        for i in xrange(N):
+            self.stir()
+
+    def stir (self, s = ''):
+        """stir(s:string)
+        Mix up the randomness pool.  This will call add_event() twice,
+        but out of paranoia the entropy attribute will not be
+        increased.  The optional 's' parameter is a string that will
+        be hashed with the randomness pool.
+        """
+
+        entropy=self.entropy            # Save inital entropy value
+        self.add_event()
+
+        # Loop over the randomness pool: hash its contents
+        # along with a counter, and add the resulting digest
+        # back into the pool.
+        for i in range(self.bytes / self._hash.digest_size):
+            h = self._hash.new(self._randpool)
+            h.update(str(self.__counter) + str(i) + str(self._addPos) + s)
+            self._addBytes( h.digest() )
+            self.__counter = (self.__counter + 1) & 0xFFFFffffL
+
+        self._addPos, self._getPos = 0, self._hash.digest_size
+        self.add_event()
+
+        # Restore the old value of the entropy.
+        self.entropy=entropy
+
+
+    def get_bytes (self, N):
+        """get_bytes(N:int) : string
+        Return N bytes of random data.
+        """
+
+        s=''
+        i, pool = self._getPos, self._randpool
+        h=self._hash.new()
+        dsize = self._hash.digest_size
+        num = N
+        while num > 0:
+            h.update( self._randpool[i:i+dsize] )
+            s = s + h.digest()
+            num = num - dsize
+            i = (i + dsize) % self.bytes
+            if i<dsize:
+                self.stir()
+                i=self._getPos
+
+        self._getPos = i
+        self._updateEntropyEstimate(- 8*N)
+        return s[:N]
+
+
+    def add_event(self, s=''):
+        """add_event(s:string)
+        Add an event to the random pool.  The current time is stored
+        between calls and used to estimate the entropy.  The optional
+        's' parameter is a string that will also be XORed into the pool.
+        Returns the estimated number of additional bits of entropy gain.
+        """
+        event = time.time()*1000
+        delta = self._noise()
+        s = (s + long_to_bytes(event) +
+             4*chr(0xaa) + long_to_bytes(delta) )
+        self._addBytes(s)
+        if event==self._event1 and event==self._event2:
+            # If events are coming too closely together, assume there's
+            # no effective entropy being added.
+            bits=0
+        else:
+            # Count the number of bits in delta, and assume that's the entropy.
+            bits=0
+            while delta:
+                delta, bits = delta>>1, bits+1
+            if bits>8: bits=8
+
+        self._event1, self._event2 = event, self._event1
+
+        self._updateEntropyEstimate(bits)
+        return bits
+
+    # Private functions
+    def _noise(self):
+        # Adds a bit of noise to the random pool, by adding in the
+        # current time and CPU usage of this process.
+        # The difference from the previous call to _noise() is taken
+        # in an effort to estimate the entropy.
+        t=time.time()
+        delta = (t - self._lastcounter)/self._ticksize*1e6
+        self._lastcounter = t
+        self._addBytes(long_to_bytes(long(1000*time.time())))
+        self._addBytes(long_to_bytes(long(1000*time.clock())))
+        self._addBytes(long_to_bytes(long(1000*time.time())))
+        self._addBytes(long_to_bytes(long(delta)))
+
+        # Reduce delta to a maximum of 8 bits so we don't add too much
+        # entropy as a result of this call.
+        delta=delta % 0xff
+        return int(delta)
+
+
+    def _measureTickSize(self):
+        # _measureTickSize() tries to estimate a rough average of the
+        # resolution of time that you can see from Python.  It does
+        # this by measuring the time 100 times, computing the delay
+        # between measurements, and taking the median of the resulting
+        # list.  (We also hash all the times and add them to the pool)
+        interval = [None] * 100
+        h = self._hash.new(`(id(self),id(interval))`)
+
+        # Compute 100 differences
+        t=time.time()
+        h.update(`t`)
+        i = 0
+        j = 0
+        while i < 100:
+            t2=time.time()
+            h.update(`(i,j,t2)`)
+            j += 1
+            delta=int((t2-t)*1e6)
+            if delta:
+                interval[i] = delta
+                i += 1
+                t=t2
+
+        # Take the median of the array of intervals
+        interval.sort()
+        self._ticksize=interval[len(interval)/2]
+        h.update(`(interval,self._ticksize)`)
+        # mix in the measurement times and wash the random pool
+        self.stir(h.digest())
+
+    def _addBytes(self, s):
+        "XOR the contents of the string S into the random pool"
+        i, pool = self._addPos, self._randpool
+        for j in range(0, len(s)):
+            pool[i]=pool[i] ^ ord(s[j])
+            i=(i+1) % self.bytes
+        self._addPos = i
+
+    # Deprecated method names: remove in PCT 2.1 or later.
+    def getBytes(self, N):
+        warnings.warn("getBytes() method replaced by get_bytes()",
+                      DeprecationWarning)
+        return self.get_bytes(N)
+
+    def addEvent (self, event, s=""):
+        warnings.warn("addEvent() method replaced by add_event()",
+                      DeprecationWarning)
+        return self.add_event(s + str(event))
+
+class PersistentRandomPool (RandomPool):
+    def __init__ (self, filename=None, *args, **kwargs):
+        RandomPool.__init__(self, *args, **kwargs)
+        self.filename = filename
+        if filename:
+            try:
+                # the time taken to open and read the file might have
+                # a little disk variability, modulo disk/kernel caching...
+                f=open(filename, 'rb')
+                self.add_event()
+                data = f.read()
+                self.add_event()
+                # mix in the data from the file and wash the random pool
+                self.stir(data)
+                f.close()
+            except IOError:
+                # Oh, well; the file doesn't exist or is unreadable, so
+                # we'll just ignore it.
+                pass
+
+    def save(self):
+        if self.filename == "":
+            raise ValueError, "No filename set for this object"
+        # wash the random pool before save, provides some forward secrecy for
+        # old values of the pool.
+        self.stir_n()
+        f=open(self.filename, 'wb')
+        self.add_event()
+        f.write(self._randpool.tostring())
+        f.close()
+        self.add_event()
+        # wash the pool again, provide some protection for future values
+        self.stir()
+
+# non-echoing Windows keyboard entry
+_kb = 0
+if not _kb:
+    try:
+        import msvcrt
+        class KeyboardEntry:
+            def getch(self):
+                c = msvcrt.getch()
+                if c in ('\000', '\xe0'):
+                    # function key
+                    c += msvcrt.getch()
+                return c
+            def close(self, delay = 0):
+                if delay:
+                    time.sleep(delay)
+                    while msvcrt.kbhit():
+                        msvcrt.getch()
+        _kb = 1
+    except:
+        pass
+
+# non-echoing Posix keyboard entry
+if not _kb:
+    try:
+        import termios
+        class KeyboardEntry:
+            def __init__(self, fd = 0):
+                self._fd = fd
+                self._old = termios.tcgetattr(fd)
+                new = termios.tcgetattr(fd)
+                new[3]=new[3] & ~termios.ICANON & ~termios.ECHO
+                termios.tcsetattr(fd, termios.TCSANOW, new)
+            def getch(self):
+                termios.tcflush(0, termios.TCIFLUSH) # XXX Leave this in?
+                return os.read(self._fd, 1)
+            def close(self, delay = 0):
+                if delay:
+                    time.sleep(delay)
+                    termios.tcflush(self._fd, termios.TCIFLUSH)
+                termios.tcsetattr(self._fd, termios.TCSAFLUSH, self._old)
+        _kb = 1
+    except:
+        pass
+
+class KeyboardRandomPool (PersistentRandomPool):
+    def __init__(self, *args, **kwargs):
+        PersistentRandomPool.__init__(self, *args, **kwargs)
+
+    def randomize(self, N = 0):
+        "Adds N bits of entropy to random pool.  If N is 0, fill up pool."
+        import os, string, time
+        if N <= 0:
+            bits = self.bits - self.entropy
+        else:
+            bits = N*8
+        if bits == 0:
+            return
+        print bits,'bits of entropy are now required.  Please type on the keyboard'
+        print 'until enough randomness has been accumulated.'
+        kb = KeyboardEntry()
+        s=''    # We'll save the characters typed and add them to the pool.
+        hash = self._hash
+        e = 0
+        try:
+            while e < bits:
+                temp=str(bits-e).rjust(6)
+                os.write(1, temp)
+                s=s+kb.getch()
+                e += self.add_event(s)
+                os.write(1, 6*chr(8))
+            self.add_event(s+hash.new(s).digest() )
+        finally:
+            kb.close()
+        print '\n\007 Enough.  Please wait a moment.\n'
+        self.stir_n()   # wash the random pool.
+        kb.close(4)
+
+if __name__ == '__main__':
+    pool = RandomPool()
+    print 'random pool entropy', pool.entropy, 'bits'
+    pool.add_event('something')
+    print `pool.get_bytes(100)`
+    import tempfile, os
+    fname = tempfile.mktemp()
+    pool = KeyboardRandomPool(filename=fname)
+    print 'keyboard random pool entropy', pool.entropy, 'bits'
+    pool.randomize()
+    print 'keyboard random pool entropy', pool.entropy, 'bits'
+    pool.randomize(128)
+    pool.save()
+    saved = open(fname, 'rb').read()
+    print 'saved', `saved`
+    print 'pool ', `pool._randpool.tostring()`
+    newpool = PersistentRandomPool(fname)
+    print 'persistent random pool entropy', pool.entropy, 'bits'
+    os.remove(fname)
Index: /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Util/__init__.py
===================================================================
--- /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Util/__init__.py (revision 3)
+++ /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Util/__init__.py (revision 3)
@@ -0,0 +1,16 @@
+"""Miscellaneous modules
+
+Contains useful modules that don't belong into any of the
+other Crypto.* subpackages.
+
+Crypto.Util.number        Number-theoretic functions (primality testing, etc.)
+Crypto.Util.randpool      Random number generation
+Crypto.Util.RFC1751       Converts between 128-bit keys and human-readable
+                          strings of words.
+
+"""
+
+__all__ = ['randpool', 'RFC1751', 'number']
+
+__revision__ = "$Id: __init__.py,v 1.4 2003/02/28 15:26:00 akuchling Exp $"
+
Index: /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Util/test.py
===================================================================
--- /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Util/test.py (revision 3)
+++ /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/Crypto/Util/test.py (revision 3)
@@ -0,0 +1,453 @@
+#
+#   test.py : Functions used for testing the modules
+#
+#  Part of the Python Cryptography Toolkit
+#
+# Distribute and use freely; there are no restrictions on further
+# dissemination and usage except those imposed by the laws of your
+# country of residence.  This software is provided "as is" without
+# warranty of fitness for use or suitability for any purpose, express
+# or implied. Use at your own risk or not at all.
+#
+
+__revision__ = "$Id: test.py,v 1.16 2004/08/13 22:24:18 akuchling Exp $"
+
+import binascii
+import string
+import testdata
+
+from Crypto.Cipher import *
+
+def die(string):
+    import sys
+    print '***ERROR: ', string
+#    sys.exit(0)   # Will default to continuing onward...
+
+def print_timing (size, delta, verbose):
+    if verbose:
+        if delta == 0:
+            print 'Unable to measure time -- elapsed time too small'
+        else:
+            print '%.2f K/sec' % (size/delta)
+            
+def exerciseBlockCipher(cipher, verbose):
+    import string, time
+    try:
+        ciph = eval(cipher)
+    except NameError:
+        print cipher, 'module not available'
+        return None
+    print cipher+ ':'
+    str='1'                             # Build 128K of test data
+    for i in xrange(0, 17):
+        str=str+str
+    if ciph.key_size==0: ciph.key_size=16
+    password = 'password12345678Extra text for password'[0:ciph.key_size]
+    IV = 'Test IV Test IV Test IV Test'[0:ciph.block_size]
+
+    if verbose: print '  ECB mode:',
+    obj=ciph.new(password, ciph.MODE_ECB)
+    if obj.block_size != ciph.block_size:
+        die("Module and cipher object block_size don't match")
+
+    text='1234567812345678'[0:ciph.block_size]
+    c=obj.encrypt(text)
+    if (obj.decrypt(c)!=text): die('Error encrypting "'+text+'"')
+    text='KuchlingKuchling'[0:ciph.block_size]
+    c=obj.encrypt(text)
+    if (obj.decrypt(c)!=text): die('Error encrypting "'+text+'"')
+    text='NotTodayNotEver!'[0:ciph.block_size]
+    c=obj.encrypt(text)
+    if (obj.decrypt(c)!=text): die('Error encrypting "'+text+'"')
+
+    start=time.time()
+    s=obj.encrypt(str)
+    s2=obj.decrypt(s)
+    end=time.time()
+    if (str!=s2):
+        die('Error in resulting plaintext from ECB mode')
+    print_timing(256, end-start, verbose)
+    del obj
+
+    if verbose: print '  CFB mode:',
+    obj1=ciph.new(password, ciph.MODE_CFB, IV)
+    obj2=ciph.new(password, ciph.MODE_CFB, IV)
+    start=time.time()
+    ciphertext=obj1.encrypt(str[0:65536])
+    plaintext=obj2.decrypt(ciphertext)
+    end=time.time()
+    if (plaintext!=str[0:65536]):
+        die('Error in resulting plaintext from CFB mode')
+    print_timing(64, end-start, verbose)
+    del obj1, obj2
+
+    if verbose: print '  CBC mode:',
+    obj1=ciph.new(password, ciph.MODE_CBC, IV)
+    obj2=ciph.new(password, ciph.MODE_CBC, IV)
+    start=time.time()
+    ciphertext=obj1.encrypt(str)
+    plaintext=obj2.decrypt(ciphertext)
+    end=time.time()
+    if (plaintext!=str):
+        die('Error in resulting plaintext from CBC mode')
+    print_timing(256, end-start, verbose)
+    del obj1, obj2
+
+    if verbose: print '  PGP mode:',
+    obj1=ciph.new(password, ciph.MODE_PGP, IV)
+    obj2=ciph.new(password, ciph.MODE_PGP, IV)
+    start=time.time()
+    ciphertext=obj1.encrypt(str)
+    plaintext=obj2.decrypt(ciphertext)
+    end=time.time()
+    if (plaintext!=str):
+        die('Error in resulting plaintext from PGP mode')
+    print_timing(256, end-start, verbose)
+    del obj1, obj2
+
+    if verbose: print '  OFB mode:',
+    obj1=ciph.new(password, ciph.MODE_OFB, IV)
+    obj2=ciph.new(password, ciph.MODE_OFB, IV)
+    start=time.time()
+    ciphertext=obj1.encrypt(str)
+    plaintext=obj2.decrypt(ciphertext)
+    end=time.time()
+    if (plaintext!=str):
+        die('Error in resulting plaintext from OFB mode')
+    print_timing(256, end-start, verbose)
+    del obj1, obj2
+
+    def counter(length=ciph.block_size):
+        return length * 'a'
+
+    if verbose: print '  CTR mode:',
+    obj1=ciph.new(password, ciph.MODE_CTR, counter=counter)
+    obj2=ciph.new(password, ciph.MODE_CTR, counter=counter)
+    start=time.time()
+    ciphertext=obj1.encrypt(str)
+    plaintext=obj2.decrypt(ciphertext)
+    end=time.time()
+    if (plaintext!=str):
+        die('Error in resulting plaintext from CTR mode')
+    print_timing(256, end-start, verbose)
+    del obj1, obj2
+
+    # Test the IV handling
+    if verbose: print '  Testing IV handling'
+    obj1=ciph.new(password, ciph.MODE_CBC, IV)
+    plaintext='Test'*(ciph.block_size/4)*3
+    ciphertext1=obj1.encrypt(plaintext)
+    obj1.IV=IV
+    ciphertext2=obj1.encrypt(plaintext)
+    if ciphertext1!=ciphertext2:
+        die('Error in setting IV')
+
+    # Test keyword arguments
+    obj1=ciph.new(key=password)
+    obj1=ciph.new(password, mode=ciph.MODE_CBC)
+    obj1=ciph.new(mode=ciph.MODE_CBC, key=password)
+    obj1=ciph.new(IV=IV, mode=ciph.MODE_CBC, key=password)
+
+    return ciph
+
+def exerciseStreamCipher(cipher, verbose):
+    import string, time
+    try:
+        ciph = eval(cipher)
+    except (NameError):
+        print cipher, 'module not available'
+        return None
+    print cipher + ':',
+    str='1'                             # Build 128K of test data
+    for i in xrange(0, 17):
+        str=str+str
+    key_size = ciph.key_size or 16
+    password = 'password12345678Extra text for password'[0:key_size]
+
+    obj1=ciph.new(password)
+    obj2=ciph.new(password)
+    if obj1.block_size != ciph.block_size:
+        die("Module and cipher object block_size don't match")
+    if obj1.key_size != ciph.key_size:
+        die("Module and cipher object key_size don't match")
+
+    text='1234567812345678Python'
+    c=obj1.encrypt(text)
+    if (obj2.decrypt(c)!=text): die('Error encrypting "'+text+'"')
+    text='B1FF I2 A R3A11Y |<00L D00D!!!!!'
+    c=obj1.encrypt(text)
+    if (obj2.decrypt(c)!=text): die('Error encrypting "'+text+'"')
+    text='SpamSpamSpamSpamSpamSpamSpamSpamSpam'
+    c=obj1.encrypt(text)
+    if (obj2.decrypt(c)!=text): die('Error encrypting "'+text+'"')
+
+    start=time.time()
+    s=obj1.encrypt(str)
+    str=obj2.decrypt(s)
+    end=time.time()
+    print_timing(256, end-start, verbose)
+    del obj1, obj2
+
+    return ciph
+
+def TestStreamModules(args=['arc4', 'XOR'], verbose=1):
+    import sys, string
+    args=map(string.lower, args)
+
+    if 'arc4' in args:
+        # Test ARC4 stream cipher
+        arc4=exerciseStreamCipher('ARC4', verbose)
+        if (arc4!=None):
+                for entry in testdata.arc4:
+                    key,plain,cipher=entry
+                    key=binascii.a2b_hex(key)
+                    plain=binascii.a2b_hex(plain)
+                    cipher=binascii.a2b_hex(cipher)
+                    obj=arc4.new(key)
+                    ciphertext=obj.encrypt(plain)
+                    if (ciphertext!=cipher):
+                        die('ARC4 failed on entry '+`entry`)
+
+    if 'xor' in args:
+        # Test XOR stream cipher
+        XOR=exerciseStreamCipher('XOR', verbose)
+        if (XOR!=None):
+                for entry in testdata.xor:
+                    key,plain,cipher=entry
+                    key=binascii.a2b_hex(key)
+                    plain=binascii.a2b_hex(plain)
+                    cipher=binascii.a2b_hex(cipher)
+                    obj=XOR.new(key)
+                    ciphertext=obj.encrypt(plain)
+                    if (ciphertext!=cipher):
+                        die('XOR failed on entry '+`entry`)
+
+
+def TestBlockModules(args=['aes', 'arc2', 'des', 'blowfish', 'cast', 'des3',
+                           'idea', 'rc5'],
+                     verbose=1):
+    import string
+    args=map(string.lower, args)
+    if 'aes' in args:
+        ciph=exerciseBlockCipher('AES', verbose)        # AES
+        if (ciph!=None):
+                if verbose: print '  Verifying against test suite...'
+                for entry in testdata.aes:
+                    key,plain,cipher=entry
+                    key=binascii.a2b_hex(key)
+                    plain=binascii.a2b_hex(plain)
+                    cipher=binascii.a2b_hex(cipher)
+                    obj=ciph.new(key, ciph.MODE_ECB)
+                    ciphertext=obj.encrypt(plain)
+                    if (ciphertext!=cipher):
+                        die('AES failed on entry '+`entry`)
+                        for i in ciphertext:
+                            if verbose: print hex(ord(i)),
+                        if verbose: print
+
+                for entry in testdata.aes_modes:
+                    mode, key, plain, cipher, kw = entry
+                    key=binascii.a2b_hex(key)
+                    plain=binascii.a2b_hex(plain)
+                    cipher=binascii.a2b_hex(cipher)
+                    obj=ciph.new(key, mode, **kw)
+                    obj2=ciph.new(key, mode, **kw)
+                    ciphertext=obj.encrypt(plain)
+                    if (ciphertext!=cipher):
+                        die('AES encrypt failed on entry '+`entry`)
+                        for i in ciphertext:
+                            if verbose: print hex(ord(i)),
+                        if verbose: print
+
+                    plain2=obj2.decrypt(ciphertext)
+                    if plain2!=plain:
+                        die('AES decrypt failed on entry '+`entry`)
+                        for i in plain2:
+                            if verbose: print hex(ord(i)),
+                        if verbose: print
+
+
+    if 'arc2' in args:
+        ciph=exerciseBlockCipher('ARC2', verbose)           # Alleged RC2
+        if (ciph!=None):
+                if verbose: print '  Verifying against test suite...'
+                for entry in testdata.arc2:
+                    key,plain,cipher=entry
+                    key=binascii.a2b_hex(key)
+                    plain=binascii.a2b_hex(plain)
+                    cipher=binascii.a2b_hex(cipher)
+                    obj=ciph.new(key, ciph.MODE_ECB)
+                    ciphertext=obj.encrypt(plain)
+                    if (ciphertext!=cipher):
+                        die('ARC2 failed on entry '+`entry`)
+                        for i in ciphertext:
+                            if verbose: print hex(ord(i)),
+                        print
+
+    if 'blowfish' in args:
+        ciph=exerciseBlockCipher('Blowfish',verbose)# Bruce Schneier's Blowfish cipher
+        if (ciph!=None):
+                if verbose: print '  Verifying against test suite...'
+                for entry in testdata.blowfish:
+                    key,plain,cipher=entry
+                    key=binascii.a2b_hex(key)
+                    plain=binascii.a2b_hex(plain)
+                    cipher=binascii.a2b_hex(cipher)
+                    obj=ciph.new(key, ciph.MODE_ECB)
+                    ciphertext=obj.encrypt(plain)
+                    if (ciphertext!=cipher):
+                        die('Blowfish failed on entry '+`entry`)
+                        for i in ciphertext:
+                            if verbose: print hex(ord(i)),
+                        if verbose: print
+
+    if 'cast' in args:
+        ciph=exerciseBlockCipher('CAST', verbose)        # CAST-128
+        if (ciph!=None):
+                if verbose: print '  Verifying against test suite...'
+                for entry in testdata.cast:
+                    key,plain,cipher=entry
+                    key=binascii.a2b_hex(key)
+                    plain=binascii.a2b_hex(plain)
+                    cipher=binascii.a2b_hex(cipher)
+                    obj=ciph.new(key, ciph.MODE_ECB)
+                    ciphertext=obj.encrypt(plain)
+                    if (ciphertext!=cipher):
+                        die('CAST failed on entry '+`entry`)
+                        for i in ciphertext:
+                            if verbose: print hex(ord(i)),
+                        if verbose: print
+
+                if 0:
+                    # The full-maintenance test; it requires 4 million encryptions,
+                    # and correspondingly is quite time-consuming.  I've disabled
+                    # it; it's faster to compile block/cast.c with -DTEST and run
+                    # the resulting program.
+                    a = b = '\x01\x23\x45\x67\x12\x34\x56\x78\x23\x45\x67\x89\x34\x56\x78\x9A'
+
+                    for i in range(0, 1000000):
+                        obj = cast.new(b, cast.MODE_ECB)
+                        a = obj.encrypt(a[:8]) + obj.encrypt(a[-8:])
+                        obj = cast.new(a, cast.MODE_ECB)
+                        b = obj.encrypt(b[:8]) + obj.encrypt(b[-8:])
+
+                    if a!="\xEE\xA9\xD0\xA2\x49\xFD\x3B\xA6\xB3\x43\x6F\xB8\x9D\x6D\xCA\x92":
+                        if verbose: print 'CAST test failed: value of "a" doesn\'t match'
+                    if b!="\xB2\xC9\x5E\xB0\x0C\x31\xAD\x71\x80\xAC\x05\xB8\xE8\x3D\x69\x6E":
+                        if verbose: print 'CAST test failed: value of "b" doesn\'t match'
+
+    if 'des' in args:
+        # Test/benchmark DES block cipher
+        des=exerciseBlockCipher('DES', verbose)
+        if (des!=None):
+            # Various tests taken from the DES library packaged with Kerberos V4
+            obj=des.new(binascii.a2b_hex('0123456789abcdef'), des.MODE_ECB)
+            s=obj.encrypt('Now is t')
+            if (s!=binascii.a2b_hex('3fa40e8a984d4815')):
+                die('DES fails test 1')
+            obj=des.new(binascii.a2b_hex('08192a3b4c5d6e7f'), des.MODE_ECB)
+            s=obj.encrypt('\000\000\000\000\000\000\000\000')
+            if (s!=binascii.a2b_hex('25ddac3e96176467')):
+                die('DES fails test 2')
+            obj=des.new(binascii.a2b_hex('0123456789abcdef'), des.MODE_CBC,
+                        binascii.a2b_hex('1234567890abcdef'))
+            s=obj.encrypt("Now is the time for all ")
+            if (s!=binascii.a2b_hex('e5c7cdde872bf27c43e934008c389c0f683788499a7c05f6')):
+                die('DES fails test 3')
+            obj=des.new(binascii.a2b_hex('0123456789abcdef'), des.MODE_CBC,
+                        binascii.a2b_hex('fedcba9876543210'))
+            s=obj.encrypt("7654321 Now is the time for \000\000\000\000")
+            if (s!=binascii.a2b_hex("ccd173ffab2039f4acd8aefddfd8a1eb468e91157888ba681d269397f7fe62b4")):
+                die('DES fails test 4')
+            del obj,s
+
+            # R. Rivest's test: see http://theory.lcs.mit.edu/~rivest/destest.txt
+            x=binascii.a2b_hex('9474B8E8C73BCA7D')
+            for i in range(0, 16):
+                obj=des.new(x, des.MODE_ECB)
+                if (i & 1): x=obj.decrypt(x)
+                else: x=obj.encrypt(x)
+            if x!=binascii.a2b_hex('1B1A2DDB4C642438'):
+                die("DES fails Rivest's test")
+
+            if verbose: print '  Verifying against test suite...'
+            for entry in testdata.des:
+                key,plain,cipher=entry
+                key=binascii.a2b_hex(key)
+                plain=binascii.a2b_hex(plain)
+                cipher=binascii.a2b_hex(cipher)
+                obj=des.new(key, des.MODE_ECB)
+                ciphertext=obj.encrypt(plain)
+                if (ciphertext!=cipher):
+                    die('DES failed on entry '+`entry`)
+            for entry in testdata.des_cbc:
+                key, iv, plain, cipher=entry
+                key, iv, cipher=binascii.a2b_hex(key),binascii.a2b_hex(iv),binascii.a2b_hex(cipher)
+                obj1=des.new(key, des.MODE_CBC, iv)
+                obj2=des.new(key, des.MODE_CBC, iv)
+                ciphertext=obj1.encrypt(plain)
+                if (ciphertext!=cipher):
+                    die('DES CBC mode failed on entry '+`entry`)
+
+    if 'des3' in args:
+        ciph=exerciseBlockCipher('DES3', verbose)        # Triple DES
+        if (ciph!=None):
+                if verbose: print '  Verifying against test suite...'
+                for entry in testdata.des3:
+                    key,plain,cipher=entry
+                    key=binascii.a2b_hex(key)
+                    plain=binascii.a2b_hex(plain)
+                    cipher=binascii.a2b_hex(cipher)
+                    obj=ciph.new(key, ciph.MODE_ECB)
+                    ciphertext=obj.encrypt(plain)
+                    if (ciphertext!=cipher):
+                        die('DES3 failed on entry '+`entry`)
+                        for i in ciphertext:
+                            if verbose: print hex(ord(i)),
+                        if verbose: print
+                for entry in testdata.des3_cbc:
+                    key, iv, plain, cipher=entry
+                    key, iv, cipher=binascii.a2b_hex(key),binascii.a2b_hex(iv),binascii.a2b_hex(cipher)
+                    obj1=ciph.new(key, ciph.MODE_CBC, iv)
+                    obj2=ciph.new(key, ciph.MODE_CBC, iv)
+                    ciphertext=obj1.encrypt(plain)
+                    if (ciphertext!=cipher):
+                        die('DES3 CBC mode failed on entry '+`entry`)
+
+    if 'idea' in args:
+        ciph=exerciseBlockCipher('IDEA', verbose)       # IDEA block cipher
+        if (ciph!=None):
+                if verbose: print '  Verifying against test suite...'
+                for entry in testdata.idea:
+                    key,plain,cipher=entry
+                    key=binascii.a2b_hex(key)
+                    plain=binascii.a2b_hex(plain)
+                    cipher=binascii.a2b_hex(cipher)
+                    obj=ciph.new(key, ciph.MODE_ECB)
+                    ciphertext=obj.encrypt(plain)
+                    if (ciphertext!=cipher):
+                        die('IDEA failed on entry '+`entry`)
+
+    if 'rc5' in args:
+        # Ronald Rivest's RC5 algorithm
+        ciph=exerciseBlockCipher('RC5', verbose)
+        if (ciph!=None):
+                if verbose: print '  Verifying against test suite...'
+                for entry in testdata.rc5:
+                    key,plain,cipher=entry
+                    key=binascii.a2b_hex(key)
+                    plain=binascii.a2b_hex(plain)
+                    cipher=binascii.a2b_hex(cipher)
+                    obj=ciph.new(key[4:], ciph.MODE_ECB,
+                                 version =ord(key[0]),
+                                 word_size=ord(key[1]),
+                                 rounds  =ord(key[2]) )
+                    ciphertext=obj.encrypt(plain)
+                    if (ciphertext!=cipher):
+                        die('RC5 failed on entry '+`entry`)
+                        for i in ciphertext:
+                            if verbose: print hex(ord(i)),
+                        if verbose: print
+
+
+
Index: /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/SOURCES.txt
===================================================================
--- /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/SOURCES.txt (revision 3)
+++ /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/SOURCES.txt (revision 3)
@@ -0,0 +1,37 @@
+README
+scramble.py
+./__init__.py
+./ez_setup.py
+./setup.py
+./test.py
+./Cipher/__init__.py
+./Hash/HMAC.py
+./Hash/MD5.py
+./Hash/SHA.py
+./Hash/__init__.py
+./Protocol/AllOrNothing.py
+./Protocol/Chaffing.py
+./Protocol/__init__.py
+./PublicKey/DSA.py
+./PublicKey/ElGamal.py
+./PublicKey/RSA.py
+./PublicKey/__init__.py
+./PublicKey/pubkey.py
+./PublicKey/qNEW.py
+./Util/RFC1751.py
+./Util/__init__.py
+./Util/number.py
+./Util/randpool.py
+./Util/test.py
+pycrypto.egg-info/PKG-INFO
+pycrypto.egg-info/SOURCES.txt
+pycrypto.egg-info/dependency_links.txt
+pycrypto.egg-info/top_level.txt
+src/MD2.c
+test/test_chaffing.py
+test/test_hashes.py
+test/test_number.py
+test/test_publickey.py
+test/test_randpool.py
+test/test_rfc1751.py
+test/testdata.py
Index: /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/top_level.txt
===================================================================
--- /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/top_level.txt (revision 3)
+++ /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/top_level.txt (revision 3)
@@ -0,0 +1,1 @@
+Crypto
Index: /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/PKG-INFO
===================================================================
--- /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/PKG-INFO (revision 3)
+++ /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/PKG-INFO (revision 3)
@@ -0,0 +1,18 @@
+Metadata-Version: 1.0
+Name: pycrypto
+Version: 2.0.1
+Summary: Cryptographic modules for Python.
+Home-page: http://www.amk.ca/python/code/crypto
+Author: A.M. Kuchling
+Author-email: amk@amk.ca
+License: UNKNOWN
+Download-URL: http://www.amk.ca/files/python/crypto/pycrypto-2.0.1.tar.gz
+Description: UNKNOWN
+Platform: UNKNOWN
+Classifier: Development Status :: 4 - Beta
+Classifier: License :: Public Domain
+Classifier: Intended Audience :: Developers
+Classifier: Operating System :: Unix
+Classifier: Operating System :: Microsoft :: Windows
+Classifier: Operating System :: MacOS :: MacOS X
+Classifier: Topic :: Security :: Cryptography
Index: /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/dependency_links.txt
===================================================================
--- /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/dependency_links.txt (revision 3)
+++ /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/dependency_links.txt (revision 3)
@@ -0,0 +1,1 @@
+
Index: /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/not-zip-safe
===================================================================
--- /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/not-zip-safe (revision 3)
+++ /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/not-zip-safe (revision 3)
@@ -0,0 +1,1 @@
+
Index: /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/native_libs.txt
===================================================================
--- /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/native_libs.txt (revision 3)
+++ /galaxy-central/eggs/pycrypto-2.0.1-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/native_libs.txt (revision 3)
@@ -0,0 +1,14 @@
+Crypto/Hash/MD2.so
+Crypto/Hash/MD4.so
+Crypto/Hash/RIPEMD.so
+Crypto/Hash/SHA256.so
+Crypto/Cipher/AES.so
+Crypto/Cipher/ARC2.so
+Crypto/Cipher/Blowfish.so
+Crypto/Cipher/CAST.so
+Crypto/Cipher/DES.so
+Crypto/Cipher/DES3.so
+Crypto/Cipher/IDEA.so
+Crypto/Cipher/RC5.so
+Crypto/Cipher/ARC4.so
+Crypto/Cipher/XOR.so
Index: /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/core.py
===================================================================
--- /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/core.py (revision 3)
+++ /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/core.py (revision 3)
@@ -0,0 +1,311 @@
+"""Implements nose test program and collector.
+"""
+from __future__ import generators
+
+import logging
+import os
+import sys
+import time
+import unittest
+
+from nose.config import Config, all_config_files
+from nose.loader import defaultTestLoader
+from nose.plugins.manager import PluginManager, DefaultPluginManager, \
+     RestrictedPluginManager
+from nose.result import TextTestResult
+from nose.suite import FinalizingSuiteWrapper
+from nose.util import isclass, tolist
+
+
+log = logging.getLogger('nose.core')
+compat_24 = sys.version_info >= (2, 4)
+
+__all__ = ['TestProgram', 'main', 'run', 'run_exit', 'runmodule', 'collector',
+           'TextTestRunner']
+
+            
+class TextTestRunner(unittest.TextTestRunner):
+    """Test runner that uses nose's TextTestResult to enable errorClasses,
+    as well as providing hooks for plugins to override or replace the test
+    output stream, results, and the test case itself.
+    """    
+    def __init__(self, stream=sys.stderr, descriptions=1, verbosity=1,
+                 config=None):
+        if config is None:
+            config = Config()
+        self.config = config
+        unittest.TextTestRunner.__init__(self, stream, descriptions, verbosity)
+
+    
+    def _makeResult(self):
+        return TextTestResult(self.stream,
+                              self.descriptions,
+                              self.verbosity,
+                              self.config)
+
+    def run(self, test):
+        """Overrides to provide plugin hooks and defer all output to
+        the test result class.
+        """
+        wrapper = self.config.plugins.prepareTest(test)
+        if wrapper is not None:
+            test = wrapper
+        
+        # plugins can decorate or capture the output stream
+        wrapped = self.config.plugins.setOutputStream(self.stream)
+        if wrapped is not None:
+            self.stream = wrapped
+            
+        result = self._makeResult()
+        start = time.time()
+        test(result)
+        stop = time.time()
+        result.printErrors()
+        result.printSummary(start, stop)
+        self.config.plugins.finalize(result)
+        return result
+
+    
+class TestProgram(unittest.TestProgram):
+    """Collect and run tests, returning success or failure.
+
+    The arguments to TestProgram() are the same as to
+    :func:`main()` and :func:`run()`:
+
+    * module: All tests are in this module (default: None)
+    * defaultTest: Tests to load (default: '.')
+    * argv: Command line arguments (default: None; sys.argv is read)
+    * testRunner: Test runner instance (default: None)
+    * testLoader: Test loader instance (default: None)
+    * env: Environment; ignored if config is provided (default: None;
+      os.environ is read)
+    * config: :class:`nose.config.Config` instance (default: None)
+    * suite: Suite or list of tests to run (default: None). Passing a
+      suite or lists of tests will bypass all test discovery and
+      loading. *ALSO NOTE* that if you pass a unittest.TestSuite
+      instance as the suite, context fixtures at the class, module and
+      package level will not be used, and many plugin hooks will not
+      be called. If you want normal nose behavior, either pass a list
+      of tests, or a fully-configured :class:`nose.suite.ContextSuite`.
+    * exit: Exit after running tests and printing report (default: True)
+    * plugins: List of plugins to use; ignored if config is provided
+      (default: load plugins with DefaultPluginManager)
+    * addplugins: List of **extra** plugins to use. Pass a list of plugin
+      instances in this argument to make custom plugins available while
+      still using the DefaultPluginManager.
+    """
+    verbosity = 1
+
+    def __init__(self, module=None, defaultTest='.', argv=None,
+                 testRunner=None, testLoader=None, env=None, config=None,
+                 suite=None, exit=True, plugins=None, addplugins=None):
+        if env is None:
+            env = os.environ
+        if config is None:
+            config = self.makeConfig(env, plugins)
+        if addplugins:
+            config.plugins.addPlugins(addplugins)
+        self.config = config
+        self.suite = suite
+        self.exit = exit
+        unittest.TestProgram.__init__(
+            self, module=module, defaultTest=defaultTest,
+            argv=argv, testRunner=testRunner, testLoader=testLoader)
+
+    def makeConfig(self, env, plugins=None):
+        """Load a Config, pre-filled with user config files if any are
+        found.
+        """
+        cfg_files = all_config_files()        
+        if plugins:
+            manager = PluginManager(plugins=plugins)
+        else:
+            manager = DefaultPluginManager()
+        return Config(
+            env=env, files=cfg_files, plugins=manager)
+        
+    def parseArgs(self, argv):
+        """Parse argv and env and configure running environment.
+        """
+        self.config.configure(argv, doc=self.usage())
+        log.debug("configured %s", self.config)
+
+        # quick outs: version, plugins (optparse would have already
+        # caught and exited on help)
+        if self.config.options.version:
+            from nose import __version__
+            sys.stdout = sys.__stdout__
+            print "%s version %s" % (os.path.basename(sys.argv[0]), __version__)
+            sys.exit(0)
+
+        if self.config.options.showPlugins:
+            self.showPlugins()
+            sys.exit(0)
+        
+        if self.testLoader is None:
+            self.testLoader = defaultTestLoader(config=self.config)
+        elif isclass(self.testLoader):
+            self.testLoader = self.testLoader(config=self.config)
+        plug_loader = self.config.plugins.prepareTestLoader(self.testLoader)
+        if plug_loader is not None:
+            self.testLoader = plug_loader
+        log.debug("test loader is %s", self.testLoader)
+        
+        # FIXME if self.module is a string, add it to self.testNames? not sure
+
+        if self.config.testNames:
+            self.testNames = self.config.testNames
+        else:
+            self.testNames = tolist(self.defaultTest)
+        log.debug('defaultTest %s', self.defaultTest)
+        log.debug('Test names are %s', self.testNames)
+        if self.config.workingDir is not None:
+            os.chdir(self.config.workingDir)
+        self.createTests()
+        
+    def createTests(self):
+        """Create the tests to run. If a self.suite
+        is set, then that suite will be used. Otherwise, tests will be
+        loaded from the given test names (self.testNames) using the
+        test loader.
+        """
+        log.debug("createTests called with %s", self.suite)
+        if self.suite is not None:
+            # We were given an explicit suite to run. Make sure it's
+            # loaded and wrapped correctly.
+            self.test = self.testLoader.suiteClass(self.suite)
+        else:
+            self.test = self.testLoader.loadTestsFromNames(self.testNames)
+
+    def runTests(self):
+        """Run Tests. Returns true on success, false on failure, and sets
+        self.success to the same value.
+        """
+        log.debug("runTests called")
+        if self.testRunner is None:
+            self.testRunner = TextTestRunner(stream=self.config.stream,
+                                             verbosity=self.config.verbosity,
+                                             config=self.config)
+        plug_runner = self.config.plugins.prepareTestRunner(self.testRunner)
+        if plug_runner is not None:
+            self.testRunner = plug_runner
+        result = self.testRunner.run(self.test)
+        self.success = result.wasSuccessful()
+        if self.exit:
+            sys.exit(not self.success)
+        return self.success
+
+    def showPlugins(self):
+        """Print list of available plugins.
+        """
+        import textwrap
+
+        class DummyParser:
+            def __init__(self):
+                self.options = []
+            def add_option(self, *arg, **kw):
+                self.options.append((arg, kw.pop('help', '')))
+        
+        v = self.config.verbosity
+        self.config.plugins.sort()
+        for p in self.config.plugins:            
+            print "Plugin %s" % p.name
+            if v >= 2:
+                print "  score: %s" % p.score
+                print '\n'.join(textwrap.wrap(p.help().strip(),
+                                              initial_indent='  ',
+                                              subsequent_indent='  '))
+                if v >= 3:
+                    print
+                    print "  Options:"
+                    parser = DummyParser()
+                    p.addOptions(parser)
+                    for opts, help in parser.options:
+                        print '  %s' % (', '.join(opts))
+                        if help:
+                            print '\n'.join(
+                                textwrap.wrap(help.strip(),
+                                              initial_indent='    ',
+                                              subsequent_indent='    '))
+                print
+            
+    def usage(cls):
+        return open(os.path.join(
+                os.path.dirname(__file__), 'usage.txt'), 'r').read()
+    usage = classmethod(usage)
+
+# backwards compatibility
+run_exit = main = TestProgram
+
+
+def run(*arg, **kw):
+    """Collect and run tests, returning success or failure.
+
+    The arguments to `run()` are the same as to `main()`:
+
+    * module: All tests are in this module (default: None)
+    * defaultTest: Tests to load (default: '.')
+    * argv: Command line arguments (default: None; sys.argv is read)
+    * testRunner: Test runner instance (default: None)
+    * testLoader: Test loader instance (default: None)
+    * env: Environment; ignored if config is provided (default: None;
+      os.environ is read)
+    * config: :class:`nose.config.Config` instance (default: None)
+    * suite: Suite or list of tests to run (default: None). Passing a
+      suite or lists of tests will bypass all test discovery and
+      loading. *ALSO NOTE* that if you pass a unittest.TestSuite
+      instance as the suite, context fixtures at the class, module and
+      package level will not be used, and many plugin hooks will not
+      be called. If you want normal nose behavior, either pass a list
+      of tests, or a fully-configured :class:`nose.suite.ContextSuite`.
+    * plugins: List of plugins to use; ignored if config is provided
+      (default: load plugins with DefaultPluginManager)
+    * addplugins: List of **extra** plugins to use. Pass a list of plugin
+      instances in this argument to make custom plugins available while
+      still using the DefaultPluginManager.
+      
+    With the exception that the ``exit`` argument is always set
+    to False.    
+    """
+    kw['exit'] = False
+    return TestProgram(*arg, **kw).success
+
+
+def runmodule(name='__main__', **kw):
+    """Collect and run tests in a single module only. Defaults to running
+    tests in __main__. Additional arguments to TestProgram may be passed
+    as keyword arguments.
+    """
+    main(defaultTest=name, **kw)
+
+
+def collector():
+    """TestSuite replacement entry point. Use anywhere you might use a
+    unittest.TestSuite. The collector will, by default, load options from
+    all config files and execute loader.loadTestsFromNames() on the
+    configured testNames, or '.' if no testNames are configured.
+    """    
+    # plugins that implement any of these methods are disabled, since
+    # we don't control the test runner and won't be able to run them
+    # finalize() is also not called, but plugins that use it aren't disabled,
+    # because capture needs it.
+    setuptools_incompat = ('report', 'prepareTest',
+                           'prepareTestLoader', 'prepareTestRunner',
+                           'setOutputStream')
+
+    plugins = RestrictedPluginManager(exclude=setuptools_incompat)
+    conf = Config(files=all_config_files(),
+                  plugins=plugins)
+    conf.configure(argv=['collector'])
+    loader = defaultTestLoader(conf)
+
+    if conf.testNames:
+        suite = loader.loadTestsFromNames(conf.testNames)
+    else:
+        suite = loader.loadTestsFromNames(('.',))
+    return FinalizingSuiteWrapper(suite, plugins.finalize)
+
+
+
+if __name__ == '__main__':
+    main()
Index: /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/suite.py
===================================================================
--- /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/suite.py (revision 3)
+++ /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/suite.py (revision 3)
@@ -0,0 +1,574 @@
+"""
+Test Suites
+-----------
+
+Provides a LazySuite, which is a suite whose test list is a generator
+function, and ContextSuite,which can run fixtures (setup/teardown
+functions or methods) for the context that contains its tests.
+
+"""
+from __future__ import generators
+
+import logging
+import sys
+import unittest
+from nose.case import Test
+from nose.config import Config
+from nose.proxy import ResultProxyFactory
+from nose.util import isclass, resolve_name, try_run
+
+if sys.platform == 'cli':
+    import clr
+    clr.AddReference("IronPython")
+    from IronPython.Runtime.Exceptions import StringException
+
+log = logging.getLogger(__name__)
+#log.setLevel(logging.DEBUG)
+
+# Singleton for default value -- see ContextSuite.__init__ below
+_def = object()
+
+
+class MixedContextError(Exception):
+    """Error raised when a context suite sees tests from more than
+    one context.
+    """
+    pass
+
+
+class LazySuite(unittest.TestSuite):
+    """A suite that may use a generator as its list of tests
+    """
+    def __init__(self, tests=()):
+        """Initialize the suite. tests may be an iterable or a generator
+        """
+        self._set_tests(tests)
+                
+    def __iter__(self):
+        return iter(self._tests)
+        
+    def __repr__(self):
+        return "<%s tests=generator (%s)>" % (
+            unittest._strclass(self.__class__), id(self))
+
+    def __hash__(self):
+        return object.__hash__(self)
+    
+    __str__ = __repr__
+
+    def addTest(self, test):
+        self._precache.append(test)
+
+    def __nonzero__(self):
+        log.debug("tests in %s?", id(self))
+        if self._precache:
+            return True
+        if self.test_generator is None:
+            return False
+        try:
+            test = self.test_generator.next()
+            if test is not None:
+                self._precache.append(test)
+                return True
+        except StopIteration:
+            pass
+        return False
+
+    def _get_tests(self):
+        log.debug("precache is %s", self._precache)
+        for test in self._precache:
+            yield test
+        if self.test_generator is None:
+            return
+        for test in self.test_generator:
+            yield test
+
+    def _set_tests(self, tests):
+        self._precache = []
+        is_suite = isinstance(tests, unittest.TestSuite)
+        if callable(tests) and not is_suite:
+            self.test_generator = tests()
+        elif is_suite:
+            # Suites need special treatment: they must be called like
+            # tests for their setup/teardown to run (if any)
+            self.addTests([tests])
+            self.test_generator = None
+        else:
+            self.addTests(tests)
+            self.test_generator = None
+
+    _tests = property(_get_tests, _set_tests, None,
+                      "Access the tests in this suite. Access is through a "
+                      "generator, so iteration may not be repeatable.")
+
+        
+class ContextSuite(LazySuite):
+    """A suite with context.
+
+    A ContextSuite executes fixtures (setup and teardown functions or
+    methods) for the context containing its tests.
+
+    The context may be explicitly passed. If it is not, a context (or
+    nested set of contexts) will be constructed by examining the tests
+    in the suite.
+    """    
+    failureException = unittest.TestCase.failureException
+    was_setup = False
+    was_torndown = False
+    classSetup = ('setup_class', 'setup_all', 'setupClass', 'setupAll',
+                     'setUpClass', 'setUpAll')
+    classTeardown = ('teardown_class', 'teardown_all', 'teardownClass',
+                     'teardownAll', 'tearDownClass', 'tearDownAll')
+    moduleSetup = ('setup_module', 'setupModule', 'setUpModule', 'setup',
+                   'setUp')
+    moduleTeardown = ('teardown_module', 'teardownModule', 'tearDownModule',
+                      'teardown', 'tearDown')
+    packageSetup = ('setup_package', 'setupPackage', 'setUpPackage')
+    packageTeardown = ('teardown_package', 'teardownPackage',
+                       'tearDownPackage')
+    
+    def __init__(self, tests=(), context=None, factory=None,
+                 config=None, resultProxy=None, can_split=True):
+        log.debug("Context suite for %s (%s) (%s)", tests, context, id(self))
+        self.context = context
+        self.factory = factory
+        if config is None:
+            config = Config()
+        self.config = config
+        self.resultProxy = resultProxy
+        self.has_run = False
+        self.can_split = can_split
+        LazySuite.__init__(self, tests)
+
+    def __repr__(self):
+        return "<%s context=%s>" % (
+            unittest._strclass(self.__class__),
+            getattr(self.context, '__name__', self.context))
+    __str__ = __repr__
+
+    def __hash__(self):
+        return object.__hash__(self)
+
+    # 2.3 compat -- force 2.4 call sequence
+    def __call__(self, *arg, **kw):
+        return self.run(*arg, **kw)
+
+    def exc_info(self):
+        """Hook for replacing error tuple output
+        """
+        return sys.exc_info()
+    
+    def _exc_info(self):
+        """Bottleneck to fix up IronPython string exceptions
+        """
+        e = self.exc_info()
+        if sys.platform == 'cli':
+            if isinstance(e[0], StringException):
+                # IronPython throws these StringExceptions, but
+                # traceback checks type(etype) == str. Make a real
+                # string here.
+                e = (str(e[0]), e[1], e[2])
+
+        return e
+
+    def run(self, result):
+        """Run tests in suite inside of suite fixtures.
+        """
+        # proxy the result for myself
+        if self.resultProxy:
+            result, orig = self.resultProxy(result, self), result
+        else:
+            result, orig = result, result
+        try:
+            self.setUp()
+        except KeyboardInterrupt:
+            raise
+        except:
+            result.addError(self, self._exc_info())
+            return
+        try:
+            for test in self._tests:
+                if result.shouldStop:
+                    log.debug("stopping")
+                    break
+                # each nose.case.Test will create its own result proxy
+                # so the cases need the original result, to avoid proxy
+                # chains
+                test(orig)
+        finally:
+            self.has_run = True
+            try:
+                self.tearDown()
+            except KeyboardInterrupt:
+                raise
+            except:
+                result.addError(self, self._exc_info())
+
+    def hasFixtures(self, ctx_callback=None):
+        context = self.context
+        if context is None:
+            return False
+        if self.implementsAnyFixture(context, ctx_callback=ctx_callback):
+            return True
+        # My context doesn't have any, but its ancestors might
+        factory = self.factory
+        if factory:
+            ancestors = factory.context.get(self, [])
+            for ancestor in ancestors:
+                if self.implementsAnyFixture(
+                    ancestor, ctx_callback=ctx_callback):
+                    return True
+        return False
+
+    def implementsAnyFixture(self, context, ctx_callback):
+        if isclass(context):
+            names = self.classSetup + self.classTeardown
+        else:
+            names = self.moduleSetup + self.moduleTeardown
+            if hasattr(context, '__path__'):
+                names += self.packageSetup + self.packageTeardown
+        # If my context has any fixture attribute, I have fixtures
+        fixt = False
+        for m in names:
+            if hasattr(context, m):
+                fixt = True
+                break
+        if ctx_callback is None:
+            return fixt
+        return ctx_callback(context, fixt)
+    
+    def setUp(self):
+        log.debug("suite %s setUp called, tests: %s", id(self), self._tests)
+        if not self:
+            # I have no tests
+            log.debug("suite %s has no tests", id(self))
+            return
+        if self.was_setup:
+            log.debug("suite %s already set up", id(self))
+            return
+        context = self.context
+        if context is None:
+            return
+        # before running my own context's setup, I need to
+        # ask the factory if my context's contexts' setups have been run
+        factory = self.factory
+        if factory:
+            # get a copy, since we'll be destroying it as we go
+            ancestors = factory.context.get(self, [])[:]
+            while ancestors:
+                ancestor = ancestors.pop()
+                log.debug("ancestor %s may need setup", ancestor)
+                if ancestor in factory.was_setup:
+                    continue
+                log.debug("ancestor %s does need setup", ancestor)
+                self.setupContext(ancestor)
+            if not context in factory.was_setup:
+                self.setupContext(context)
+        else:
+            self.setupContext(context)
+        self.was_setup = True
+        log.debug("completed suite setup")
+
+    def setupContext(self, context):
+        self.config.plugins.startContext(context)
+        log.debug("%s setup context %s", self, context)
+        if self.factory:
+            if context in self.factory.was_setup:
+                return
+            # note that I ran the setup for this context, so that I'll run
+            # the teardown in my teardown
+            self.factory.was_setup[context] = self
+        if isclass(context):
+            names = self.classSetup
+        else:
+            names = self.moduleSetup
+            if hasattr(context, '__path__'):
+                names = self.packageSetup + names
+        try_run(context, names)
+
+    def shortDescription(self):
+        if self.context is None:
+            return "test suite"
+        return "test suite for %s" % self.context
+
+    def tearDown(self):
+        log.debug('context teardown')
+        if not self.was_setup or self.was_torndown:
+            log.debug(
+                "No reason to teardown (was_setup? %s was_torndown? %s)"
+                % (self.was_setup, self.was_torndown))
+            return
+        self.was_torndown = True
+        context = self.context
+        if context is None:
+            log.debug("No context to tear down")
+            return
+
+        # for each ancestor... if the ancestor was setup
+        # and I did the setup, I can do teardown
+        factory = self.factory
+        if factory:
+            ancestors = factory.context.get(self, []) + [context]
+            for ancestor in ancestors:
+                log.debug('ancestor %s may need teardown', ancestor)
+                if not ancestor in factory.was_setup:
+                    log.debug('ancestor %s was not setup', ancestor)
+                    continue
+                if ancestor in factory.was_torndown:
+                    log.debug('ancestor %s already torn down', ancestor)
+                    continue
+                setup = factory.was_setup[ancestor]
+                log.debug("%s setup ancestor %s", setup, ancestor)
+                if setup is self:
+                    self.teardownContext(ancestor)
+        else:
+            self.teardownContext(context)
+        
+    def teardownContext(self, context):
+        log.debug("%s teardown context %s", self, context)
+        if self.factory:
+            if context in self.factory.was_torndown:
+                return
+            self.factory.was_torndown[context] = self
+        if isclass(context):
+            names = self.classTeardown
+        else:
+            names = self.moduleTeardown
+            if hasattr(context, '__path__'):
+                names = self.packageTeardown + names
+        try_run(context, names)
+        self.config.plugins.stopContext(context)
+
+    # FIXME the wrapping has to move to the factory?
+    def _get_wrapped_tests(self):
+        for test in self._get_tests():
+            if isinstance(test, Test) or isinstance(test, unittest.TestSuite):
+                yield test
+            else:
+                yield Test(test,
+                           config=self.config,
+                           resultProxy=self.resultProxy)
+
+    _tests = property(_get_wrapped_tests, LazySuite._set_tests, None,
+                      "Access the tests in this suite. Tests are returned "
+                      "inside of a context wrapper.")
+
+
+class ContextSuiteFactory(object):
+    """Factory for ContextSuites. Called with a collection of tests,
+    the factory decides on a hierarchy of contexts by introspecting
+    the collection or the tests themselves to find the objects
+    containing the test objects. It always returns one suite, but that
+    suite may consist of a hierarchy of nested suites.
+    """
+    suiteClass = ContextSuite
+    def __init__(self, config=None, suiteClass=None, resultProxy=_def):
+        if config is None:
+            config = Config()
+        self.config = config
+        if suiteClass is not None:
+            self.suiteClass = suiteClass
+        # Using a singleton to represent default instead of None allows
+        # passing resultProxy=None to turn proxying off.
+        if resultProxy is _def:
+            resultProxy = ResultProxyFactory(config=config)
+        self.resultProxy = resultProxy
+        self.suites = {}
+        self.context = {}
+        self.was_setup = {}
+        self.was_torndown = {}
+
+    def __call__(self, tests, **kw):
+        """Return ``ContextSuite`` for tests. ``tests`` may either
+        be a callable (in which case the resulting ContextSuite will
+        have no parent context and be evaluated lazily) or an
+        iterable. In that case the tests will wrapped in
+        nose.case.Test, be examined and the context of each found and a
+        suite of suites returned, organized into a stack with the
+        outermost suites belonging to the outermost contexts.
+        """
+        log.debug("Create suite for %s", tests)
+        context = kw.pop('context', getattr(tests, 'context', None))
+        log.debug("tests %s context %s", tests, context)
+        if context is None:
+            tests = self.wrapTests(tests)
+            try:
+                context = self.findContext(tests)
+            except MixedContextError:
+                return self.makeSuite(self.mixedSuites(tests), None, **kw)
+        return self.makeSuite(tests, context, **kw)
+        
+    def ancestry(self, context):
+        """Return the ancestry of the context (that is, all of the
+        packages and modules containing the context), in order of
+        descent with the outermost ancestor last.
+        This method is a generator.
+        """
+        log.debug("get ancestry %s", context)
+        if context is None:
+            return
+        # Methods include reference to module they are defined in, we
+        # don't want that, instead want the module the class is in now
+        # (classes are re-ancestored elsewhere).
+        if hasattr(context, 'im_class'):
+            context = context.im_class
+        if hasattr(context, '__module__'):
+            ancestors = context.__module__.split('.')
+        elif hasattr(context, '__name__'):
+            ancestors = context.__name__.split('.')[:-1]
+        else:
+            raise TypeError("%s has no ancestors?" % context)
+        while ancestors:
+            log.debug(" %s ancestors %s", context, ancestors)
+            yield resolve_name('.'.join(ancestors))                
+            ancestors.pop()
+
+    def findContext(self, tests):
+        if callable(tests) or isinstance(tests, unittest.TestSuite):
+            return None
+        context = None
+        for test in tests:
+            # Don't look at suites for contexts, only tests
+            ctx = getattr(test, 'context', None)
+            if ctx is None:
+                continue
+            if context is None:
+                context = ctx
+            elif context != ctx:
+                raise MixedContextError(
+                    "Tests with different contexts in same suite! %s != %s"
+                    % (context, ctx))
+        return context
+
+    def makeSuite(self, tests, context, **kw):
+        suite = self.suiteClass(
+            tests, context=context, config=self.config, factory=self,
+            resultProxy=self.resultProxy, **kw)
+        if context is not None:
+            self.suites.setdefault(context, []).append(suite)
+            self.context.setdefault(suite, []).append(context)
+            log.debug("suite %s has context %s", suite,
+                      getattr(context, '__name__', None))
+            for ancestor in self.ancestry(context):
+                self.suites.setdefault(ancestor, []).append(suite)
+                self.context[suite].append(ancestor)
+                log.debug("suite %s has ancestor %s", suite, ancestor.__name__)
+        return suite
+
+    def mixedSuites(self, tests):
+        """The complex case where there are tests that don't all share
+        the same context. Groups tests into suites with common ancestors,
+        according to the following (essentially tail-recursive) procedure:
+
+        Starting with the context of the first test, if it is not
+        None, look for tests in the remaining tests that share that
+        ancestor. If any are found, group into a suite with that
+        ancestor as the context, and replace the current suite with
+        that suite. Continue this process for each ancestor of the
+        first test, until all ancestors have been processed. At this
+        point if any tests remain, recurse with those tests as the
+        input, returning a list of the common suite (which may be the
+        suite or test we started with, if no common tests were found)
+        plus the results of recursion.
+        """
+        if not tests:
+            return []
+        head = tests.pop(0)
+        if not tests:
+            return [head] # short circuit when none are left to combine
+        suite = head # the common ancestry suite, so far
+        tail = tests[:]
+        context = getattr(head, 'context', None)
+        if context is not None:
+            ancestors = [context] + [a for a in self.ancestry(context)]
+            for ancestor in ancestors:
+                common = [suite] # tests with ancestor in common, so far
+                remain = [] # tests that remain to be processed
+                for test in tail:
+                    found_common = False
+                    test_ctx = getattr(test, 'context', None)
+                    if test_ctx is None:
+                        remain.append(test)
+                        continue
+                    if test_ctx is ancestor:
+                        common.append(test)
+                        continue         
+                    for test_ancestor in self.ancestry(test_ctx):
+                        if test_ancestor is ancestor:
+                            common.append(test)
+                            found_common = True
+                            break
+                    if not found_common:
+                        remain.append(test)
+                if common:
+                    suite = self.makeSuite(common, ancestor)
+                tail = remain
+        return [suite] + self.mixedSuites(tail)
+            
+    def wrapTests(self, tests):
+        log.debug("wrap %s", tests)
+        if callable(tests) or isinstance(tests, unittest.TestSuite):
+            log.debug("I won't wrap")
+            return tests
+        wrapped = []
+        for test in tests:
+            log.debug("wrapping %s", test)
+            if isinstance(test, Test) or isinstance(test, unittest.TestSuite):
+                wrapped.append(test)
+            elif isinstance(test, ContextList):
+                wrapped.append(self.makeSuite(test, context=test.context))
+            else:
+                wrapped.append(
+                    Test(test, config=self.config, resultProxy=self.resultProxy)
+                    )
+        return wrapped
+
+
+class ContextList(object):
+    """Not quite a suite -- a group of tests in a context. This is used
+    to hint the ContextSuiteFactory about what context the tests
+    belong to, in cases where it may be ambiguous or missing.
+    """
+    def __init__(self, tests, context=None):
+        self.tests = tests
+        self.context = context
+
+    def __iter__(self):
+        return iter(self.tests)
+
+
+class FinalizingSuiteWrapper(unittest.TestSuite):
+    """Wraps suite and calls final function after suite has
+    executed. Used to call final functions in cases (like running in
+    the standard test runner) where test running is not under nose's
+    control.    
+    """
+    def __init__(self, suite, finalize):
+        self.suite = suite
+        self.finalize = finalize
+
+    def __call__(self, *arg, **kw):
+        return self.run(*arg, **kw)
+
+    def run(self, *arg, **kw):
+        try:
+            return self.suite(*arg, **kw)
+        finally:
+            self.finalize(*arg, **kw)
+
+
+# backwards compat -- sort of
+class TestDir:
+    def __init__(*arg, **kw):
+        raise NotImplementedError(
+            "TestDir is not usable with nose 0.10. The class is present "
+            "in nose.suite for backwards compatibility purposes but it "
+            "may not be used.")
+
+
+class TestModule:
+    def __init__(*arg, **kw):
+        raise NotImplementedError(
+            "TestModule is not usable with nose 0.10. The class is present "
+            "in nose.suite for backwards compatibility purposes but it "
+            "may not be used.")
Index: /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/doctests.py
===================================================================
--- /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/doctests.py (revision 3)
+++ /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/doctests.py (revision 3)
@@ -0,0 +1,428 @@
+"""Use the Doctest plugin with ``--with-doctest`` or the NOSE_WITH_DOCTEST
+environment variable to enable collection and execution of :mod:`doctests
+<doctest>`.  Because doctests are usually included in the tested package
+(instead of being grouped into packages or modules of their own), nose only
+looks for them in the non-test packages it discovers in the working directory.
+
+Doctests may also be placed into files other than python modules, in which
+case they can be collected and executed by using the ``--doctest-extension``
+switch or NOSE_DOCTEST_EXTENSION environment variable to indicate which file
+extension(s) to load.
+
+When loading doctests from non-module files, use the ``--doctest-fixtures``
+switch to specify how to find modules containing fixtures for the tests. A
+module name will be produced by appending the value of that switch to the base
+name of each doctest file loaded. For example, a doctest file "widgets.rst"
+with the switch ``--doctest_fixtures=_fixt`` will load fixtures from the module
+``widgets_fixt.py``.
+
+A fixtures module may define any or all of the following functions:
+
+* setup([module]) or setup_module([module])
+   
+  Called before the test runs. You may raise SkipTest to skip all tests.
+  
+* teardown([module]) or teardown_module([module])
+
+  Called after the test runs, if setup/setup_module did not raise an
+  unhandled exception.
+
+* setup_test(test)
+
+  Called before the test. NOTE: the argument passed is a
+  doctest.DocTest instance, *not* a unittest.TestCase.
+  
+* teardown_test(test)
+ 
+  Called after the test, if setup_test did not raise an exception. NOTE: the
+  argument passed is a doctest.DocTest instance, *not* a unittest.TestCase.
+  
+Doctests are run like any other test, with the exception that output
+capture does not work; doctest does its own output capture while running a
+test.
+
+.. note ::
+
+   See :doc:`../doc_tests/test_doctest_fixtures/doctest_fixtures` for
+   additional documentation and examples.
+
+"""
+from __future__ import generators
+
+import logging
+import os
+import sys
+import unittest
+from inspect import getmodule
+from nose.plugins.base import Plugin
+from nose.suite import ContextList
+from nose.util import anyp, getpackage, test_address, resolve_name, \
+     src, tolist, isproperty
+try:
+    from cStringIO import StringIO
+except ImportError:
+    from StringIO import StringIO
+import sys
+import __builtin__
+
+log = logging.getLogger(__name__)
+
+try:
+    import doctest
+    doctest.DocTestCase
+    # system version of doctest is acceptable, but needs a monkeypatch
+except (ImportError, AttributeError):
+    # system version is too old
+    import nose.ext.dtcompat as doctest
+
+
+#
+# Doctest and coverage don't get along, so we need to create
+# a monkeypatch that will replace the part of doctest that
+# interferes with coverage reports.
+#
+# The monkeypatch is based on this zope patch:
+# http://svn.zope.org/Zope3/trunk/src/zope/testing/doctest.py?rev=28679&r1=28703&r2=28705
+#
+_orp = doctest._OutputRedirectingPdb
+
+class NoseOutputRedirectingPdb(_orp):
+    def __init__(self, out):
+        self.__debugger_used = False
+        _orp.__init__(self, out)
+
+    def set_trace(self):
+        self.__debugger_used = True
+        _orp.set_trace(self, sys._getframe().f_back)
+
+    def set_continue(self):
+        # Calling set_continue unconditionally would break unit test 
+        # coverage reporting, as Bdb.set_continue calls sys.settrace(None).
+        if self.__debugger_used:
+            _orp.set_continue(self)
+doctest._OutputRedirectingPdb = NoseOutputRedirectingPdb    
+
+
+class DoctestSuite(unittest.TestSuite):
+    """
+    Doctest suites are parallelizable at the module or file level only,
+    since they may be attached to objects that are not individually
+    addressable (like properties). This suite subclass is used when
+    loading doctests from a module to ensure that behavior.
+
+    This class is used only if the plugin is not fully prepared;
+    in normal use, the loader's suiteClass is used.
+    
+    """
+    can_split = False
+    
+    def __init__(self, tests=(), context=None, can_split=False):
+        self.context = context
+        self.can_split = can_split
+        unittest.TestSuite.__init__(self, tests=tests)
+
+    def address(self):
+        return test_address(self.context)
+
+    def __iter__(self):
+        # 2.3 compat
+        return iter(self._tests)
+
+    def __str__(self):
+        return str(self._tests)
+
+        
+class Doctest(Plugin):
+    """
+    Activate doctest plugin to find and run doctests in non-test modules.
+    """
+    extension = None
+    suiteClass = DoctestSuite
+    
+    def options(self, parser, env):
+        """Register commmandline options.
+        """
+        Plugin.options(self, parser, env)
+        parser.add_option('--doctest-tests', action='store_true',
+                          dest='doctest_tests',
+                          default=env.get('NOSE_DOCTEST_TESTS'),
+                          help="Also look for doctests in test modules. "
+                          "Note that classes, methods and functions should "
+                          "have either doctests or non-doctest tests, "
+                          "not both. [NOSE_DOCTEST_TESTS]")
+        parser.add_option('--doctest-extension', action="append",
+                          dest="doctestExtension",
+                          metavar="EXT",
+                          help="Also look for doctests in files with "
+                          "this extension [NOSE_DOCTEST_EXTENSION]")
+        parser.add_option('--doctest-result-variable',
+                          dest='doctest_result_var',
+                          default=env.get('NOSE_DOCTEST_RESULT_VAR'),
+                          metavar="VAR",
+                          help="Change the variable name set to the result of "
+                          "the last interpreter command from the default '_'. "
+                          "Can be used to avoid conflicts with the _() "
+                          "function used for text translation. "
+                          "[NOSE_DOCTEST_RESULT_VAR]")
+        parser.add_option('--doctest-fixtures', action="store",
+                          dest="doctestFixtures",
+                          metavar="SUFFIX",
+                          help="Find fixtures for a doctest file in module "
+                          "with this name appended to the base name "
+                          "of the doctest file")
+        # Set the default as a list, if given in env; otherwise
+        # an additional value set on the command line will cause
+        # an error.
+        env_setting = env.get('NOSE_DOCTEST_EXTENSION')
+        if env_setting is not None:
+            parser.set_defaults(doctestExtension=tolist(env_setting))
+
+    def configure(self, options, config):
+        """Configure plugin.
+        """
+        Plugin.configure(self, options, config)
+        self.doctest_result_var = options.doctest_result_var
+        self.doctest_tests = options.doctest_tests
+        self.extension = tolist(options.doctestExtension)
+        self.fixtures = options.doctestFixtures
+        self.finder = doctest.DocTestFinder()
+
+    def prepareTestLoader(self, loader):
+        """Capture loader's suiteClass.
+
+        This is used to create test suites from doctest files.
+        
+        """
+        self.suiteClass = loader.suiteClass
+
+    def loadTestsFromModule(self, module):
+        """Load doctests from the module.
+        """
+        log.debug("loading from %s", module)
+        if not self.matches(module.__name__):
+            log.debug("Doctest doesn't want module %s", module)
+            return
+        try:
+            tests = self.finder.find(module)
+        except AttributeError:
+            log.exception("Attribute error loading from %s", module)
+            # nose allows module.__test__ = False; doctest does not and throws
+            # AttributeError
+            return
+        if not tests:
+            log.debug("No tests found in %s", module)
+            return
+        tests.sort()
+        module_file = src(module.__file__)
+        # FIXME this breaks the id plugin somehow (tests probably don't
+        # get wrapped in result proxy or something)
+        cases = []
+        for test in tests:
+            if not test.examples:
+                continue
+            if not test.filename:
+                test.filename = module_file
+            cases.append(DocTestCase(test, result_var=self.doctest_result_var))
+        if cases:
+            yield self.suiteClass(cases, context=module, can_split=False)
+            
+    def loadTestsFromFile(self, filename):
+        """Load doctests from the file.
+
+        Tests are loaded only if filename's extension matches
+        configured doctest extension.
+
+        """
+        if self.extension and anyp(filename.endswith, self.extension):
+            name = os.path.basename(filename)
+            dh = open(filename)
+            try:
+                doc = dh.read()
+            finally:
+                dh.close()
+
+            fixture_context = None
+            globs = {'__file__': filename}
+            if self.fixtures:
+                base, ext = os.path.splitext(name)
+                dirname = os.path.dirname(filename)
+                sys.path.append(dirname)
+                fixt_mod = base + self.fixtures
+                try:
+                    fixture_context = __import__(
+                        fixt_mod, globals(), locals(), ["nop"])
+                except ImportError, e:
+                    log.debug(
+                        "Could not import %s: %s (%s)", fixt_mod, e, sys.path)
+                log.debug("Fixture module %s resolved to %s",
+                          fixt_mod, fixture_context)
+                if hasattr(fixture_context, 'globs'):
+                    globs = fixture_context.globs(globs)
+            parser = doctest.DocTestParser()
+            test = parser.get_doctest(
+                doc, globs=globs, name=name,
+                filename=filename, lineno=0)
+            if test.examples:
+                case = DocFileCase(
+                    test,
+                    setUp=getattr(fixture_context, 'setup_test', None),
+                    tearDown=getattr(fixture_context, 'teardown_test', None),
+                    result_var=self.doctest_result_var)
+                if fixture_context:
+                    yield ContextList((case,), context=fixture_context)
+                else:
+                    yield case
+            else:
+                yield False # no tests to load
+            
+    def makeTest(self, obj, parent):
+        """Look for doctests in the given object, which will be a
+        function, method or class.
+        """
+        name = getattr(obj, '__name__', 'Unnammed %s' % type(obj))
+        doctests = self.finder.find(obj, module=getmodule(parent), name=name)
+        if doctests:
+            for test in doctests:
+                if len(test.examples) == 0:
+                    continue
+                yield DocTestCase(test, obj=obj,
+                                  result_var=self.doctest_result_var)
+    
+    def matches(self, name):
+        # FIXME this seems wrong -- nothing is ever going to
+        # fail this test, since we're given a module NAME not FILE
+        if name == '__init__.py':
+            return False
+        # FIXME don't think we need include/exclude checks here?
+        return ((self.doctest_tests or not self.conf.testMatch.search(name)
+                 or (self.conf.include 
+                     and filter(None,
+                                [inc.search(name)
+                                 for inc in self.conf.include])))
+                and (not self.conf.exclude 
+                     or not filter(None,
+                                   [exc.search(name)
+                                    for exc in self.conf.exclude])))
+    
+    def wantFile(self, file):
+        """Override to select all modules and any file ending with
+        configured doctest extension.
+        """
+        # always want .py files
+        if file.endswith('.py'):
+            return True
+        # also want files that match my extension
+        if (self.extension
+            and anyp(file.endswith, self.extension)
+            and (not self.conf.exclude
+                 or not filter(None, 
+                               [exc.search(file)
+                                for exc in self.conf.exclude]))):
+            return True
+        return None
+
+
+class DocTestCase(doctest.DocTestCase):
+    """Overrides DocTestCase to
+    provide an address() method that returns the correct address for
+    the doctest case. To provide hints for address(), an obj may also
+    be passed -- this will be used as the test object for purposes of
+    determining the test address, if it is provided.
+    """
+    def __init__(self, test, optionflags=0, setUp=None, tearDown=None,
+                 checker=None, obj=None, result_var='_'):
+        self._result_var = result_var
+        self._nose_obj = obj
+        super(DocTestCase, self).__init__(
+            test, optionflags=optionflags, setUp=setUp, tearDown=tearDown,
+            checker=checker)
+    
+    def address(self):
+        if self._nose_obj is not None:
+            return test_address(self._nose_obj)
+        obj = resolve_name(self._dt_test.name)
+
+        if isproperty(obj):
+            # properties have no connection to the class they are in
+            # so we can't just look 'em up, we have to first look up
+            # the class, then stick the prop on the end
+            parts = self._dt_test.name.split('.')
+            class_name = '.'.join(parts[:-1])
+            cls = resolve_name(class_name)
+            base_addr = test_address(cls)
+            return (base_addr[0], base_addr[1],
+                    '.'.join([base_addr[2], parts[-1]]))
+        else:
+            return test_address(obj)
+    
+    # doctests loaded via find(obj) omit the module name
+    # so we need to override id, __repr__ and shortDescription
+    # bonus: this will squash a 2.3 vs 2.4 incompatiblity
+    def id(self):
+        name = self._dt_test.name
+        filename = self._dt_test.filename
+        if filename is not None:
+            pk = getpackage(filename)
+            if not name.startswith(pk):
+                name = "%s.%s" % (pk, name)
+        return name
+    
+    def __repr__(self):
+        name = self.id()
+        name = name.split('.')
+        return "%s (%s)" % (name[-1], '.'.join(name[:-1]))
+    __str__ = __repr__
+
+    def shortDescription(self):
+        return 'Doctest: %s' % self.id()
+
+    def setUp(self):
+        if self._result_var is not None:
+            self._old_displayhook = sys.displayhook
+            sys.displayhook = self._displayhook
+        super(DocTestCase, self).setUp()
+
+    def _displayhook(self, value):
+        if value is None:
+            return
+        setattr(__builtin__, self._result_var,  value)
+        print repr(value)
+
+    def tearDown(self):
+        super(DocTestCase, self).tearDown()
+        if self._result_var is not None:
+            sys.displayhook = self._old_displayhook
+            delattr(__builtin__, self._result_var)
+
+
+class DocFileCase(doctest.DocFileCase):
+    """Overrides to provide address() method that returns the correct
+    address for the doc file case.
+    """
+    def __init__(self, test, optionflags=0, setUp=None, tearDown=None,
+                 checker=None, result_var='_'):
+        self._result_var = result_var
+        super(DocFileCase, self).__init__(
+            test, optionflags=optionflags, setUp=setUp, tearDown=tearDown,
+            checker=None)
+
+    def address(self):
+        return (self._dt_test.filename, None, None)
+
+    def setUp(self):
+        if self._result_var is not None:
+            self._old_displayhook = sys.displayhook
+            sys.displayhook = self._displayhook
+        super(DocFileCase, self).setUp()
+
+    def _displayhook(self, value):
+        if value is None:
+            return
+        setattr(__builtin__, self._result_var, value)
+        print repr(value)
+
+    def tearDown(self):
+        super(DocFileCase, self).tearDown()
+        if self._result_var is not None:
+            sys.displayhook = self._old_displayhook
+            delattr(__builtin__, self._result_var)
Index: /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/multiprocess.py
===================================================================
--- /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/multiprocess.py (revision 3)
+++ /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/multiprocess.py (revision 3)
@@ -0,0 +1,525 @@
+"""
+Overview
+========
+
+.. warning ::
+
+   The multiprocess plugin is not available on Windows.
+
+The multiprocess plugin enables you to distribute your test run among a set of
+worker processes that run tests in parallel. This can speed up CPU-bound test
+runs (as long as the number of work processeses is around the number of
+processors or cores available), but is mainly useful for IO-bound tests that
+spend most of their time waiting for data to arrive from someplace else.
+
+.. note ::
+
+   See :doc:`../doc_tests/test_multiprocess/multiprocess` for additional
+   documentation and examples. Use of this plugin requires the
+   multiprocessing_ module, also available from PyPI.
+
+.. _multiprocessing : http://code.google.com/p/python-multiprocessing/
+
+How tests are distributed
+=========================
+
+The ideal case would be to dispatch each test to a worker process
+separately. This ideal is not attainable in all cases, however, because many
+test suites depend on context (class, module or package) fixtures.
+
+The plugin can't know (unless you tell it -- see below!) if a context fixture
+can be called many times concurrently (is re-entrant), or if it can be shared
+among tests running in different processes. Therefore, if a context has
+fixtures, the default behavior is to dispatch the entire suite to a worker as
+a unit.
+
+Controlling distribution
+^^^^^^^^^^^^^^^^^^^^^^^^
+
+There are two context-level variables that you can use to control this default
+behavior.
+
+If a context's fixtures are re-entrant, set ``_multiprocess_can_split_ = True``
+in the context, and the plugin will dispatch tests in suites bound to that
+context as if the context had no fixtures. This means that the fixtures will
+execute concurrently and multiple times, typically once per test.
+
+If a context's fixtures can be shared by tests running in different processes
+-- such as a package-level fixture that starts an external http server or
+initializes a shared database -- then set ``_multiprocess_shared_ = True`` in
+the context. These fixtures will then execute in the primary nose process, and
+tests in those contexts will be individually dispatched to run in parallel.
+
+How results are collected and reported
+======================================
+
+As each test or suite executes in a worker process, results (failures, errors,
+and specially handled exceptions like SkipTest) are collected in that
+process. When the worker process finishes, it returns results to the main
+nose process. There, any progress output is printed (dots!), and the
+results from the test run are combined into a consolidated result
+set. When results have been received for all dispatched tests, or all
+workers have died, the result summary is output as normal.
+
+Beware!
+=======
+
+Not all test suites will benefit from, or even operate correctly using, this
+plugin. For example, CPU-bound tests will run more slowly if you don't have
+multiple processors. There are also some differences in plugin
+interactions and behaviors due to the way in which tests are dispatched and
+loaded. In general, test loading under this plugin operates as if it were
+always in directed mode instead of discovered mode. For instance, doctests
+in test modules will always be found when using this plugin with the doctest
+plugin.
+
+But the biggest issue you will face is probably concurrency. Unless you
+have kept your tests as religiously pure unit tests, with no side-effects, no
+ordering issues, and no external dependencies, chances are you will experience
+odd, intermittent and unexplainable failures and errors when using this
+plugin. This doesn't necessarily mean the plugin is broken; it may mean that
+your test suite is not safe for concurrency.
+
+"""
+import logging
+import os
+import sys
+import time
+import traceback
+import unittest
+import nose.case
+from nose.core import TextTestRunner
+from nose import failure
+from nose import loader
+from nose.plugins.base import Plugin
+from nose.result import TextTestResult
+from nose.suite import ContextSuite
+from nose.util import test_address
+from Queue import Empty
+from warnings import warn
+try:
+    from cStringIO import StringIO
+except ImportError:
+    import StringIO
+
+log = logging.getLogger(__name__)
+
+Process = Queue = Pool = Event = None
+
+def _import_mp():
+    global Process, Queue, Pool, Event
+    if sys.platform == 'win32':
+        warn("multiprocess plugin is not available on windows",
+             RuntimeWarning)
+        return
+    try:
+        from multiprocessing import Process as Process_, \
+            Queue as Queue_, Pool as Pool_, Event as Event_
+        Process, Queue, Pool, Event = Process_, Queue_, Pool_, Event_
+    except ImportError:
+        warn("multiprocessing module is not available, multiprocess plugin "
+             "cannot be used", RuntimeWarning)
+
+        
+class TestLet:
+    def __init__(self, case):
+        try:
+            self._id = case.id()
+        except AttributeError:
+            pass
+        self._short_description = case.shortDescription()
+        self._str = str(case)
+
+    def id(self):
+        return self._id
+
+    def shortDescription(self):
+        return self._short_description
+
+    def __str__(self):
+        return self._str
+
+
+class MultiProcess(Plugin):
+    """
+    Run tests in multiple processes. Requires processing module.
+    """
+    score = 1000
+    status = {}
+    
+    def options(self, parser, env):
+        """
+        Register command-line options.
+        """
+        if sys.platform == 'win32':
+            return
+        parser.add_option("--processes", action="store",
+                          default=env.get('NOSE_PROCESSES', 0),
+                          dest="multiprocess_workers",
+                          metavar="NUM",
+                          help="Spread test run among this many processes. "
+                          "Set a number equal to the number of processors "
+                          "or cores in your machine for best results. "
+                          "[NOSE_PROCESSES]")
+        parser.add_option("--process-timeout", action="store",
+                          default=env.get('NOSE_PROCESS_TIMEOUT', 10),
+                          dest="multiprocess_timeout",
+                          metavar="SECONDS",
+                          help="Set timeout for return of results from each "
+                          "test runner process. [NOSE_PROCESS_TIMEOUT]")
+
+    def configure(self, options, config):
+        """
+        Configure plugin.
+        """
+        if sys.platform == 'win32':
+            return
+        try:
+            self.status.pop('active')
+        except KeyError:
+            pass
+        if not hasattr(options, 'multiprocess_workers'):
+            self.enabled = False
+            return
+        self.config = config
+        try:
+            workers = int(options.multiprocess_workers)
+        except (TypeError, ValueError):
+            workers = 0
+        if workers:
+            _import_mp()
+            if Process is None:
+                self.enabled = False
+                return
+            self.enabled = True
+            self.config.multiprocess_workers = workers
+            self.config.multiprocess_timeout = int(options.multiprocess_timeout)
+            self.status['active'] = True
+            
+    def prepareTestLoader(self, loader):
+        """Remember loader class so MultiProcessTestRunner can instantiate
+        the right loader.
+        """
+        self.loaderClass = loader.__class__
+
+    def prepareTestRunner(self, runner):
+        """Replace test runner with MultiProcessTestRunner.
+        """
+        # replace with our runner class
+        return MultiProcessTestRunner(stream=runner.stream,
+                                      verbosity=self.config.verbosity,
+                                      config=self.config,
+                                      loaderClass=self.loaderClass)
+
+
+class MultiProcessTestRunner(TextTestRunner):
+
+    def __init__(self, **kw):
+        self.loaderClass = kw.pop('loaderClass', loader.defaultTestLoader)
+        super(MultiProcessTestRunner, self).__init__(**kw)
+
+    def run(self, test):
+        """
+        Execute the test (which may be a test suite). If the test is a suite,
+        distribute it out among as many processes as have been configured, at
+        as fine a level as is possible given the context fixtures defined in the
+        suite or any sub-suites.
+
+        """
+        log.debug("%s.run(%s) (%s)", self, test, os.getpid())
+        wrapper = self.config.plugins.prepareTest(test)
+        if wrapper is not None:
+            test = wrapper
+
+        # plugins can decorate or capture the output stream
+        wrapped = self.config.plugins.setOutputStream(self.stream)
+        if wrapped is not None:
+            self.stream = wrapped
+
+        testQueue = Queue()
+        resultQueue = Queue()
+        tasks = {}
+        completed = {}
+        workers = []
+        to_teardown = []
+        shouldStop = Event()
+
+        result = self._makeResult()
+        start = time.time()
+
+        # dispatch and collect results
+        # put indexes only on queue because tests aren't picklable
+        for case in self.nextBatch(test):
+            log.debug("Next batch %s (%s)", case, type(case))
+            if (isinstance(case, nose.case.Test) and
+                isinstance(case.test, failure.Failure)):
+                log.debug("Case is a Failure")
+                case(result) # run here to capture the failure
+                continue
+            # handle shared fixtures
+            if isinstance(case, ContextSuite) and self.sharedFixtures(case):
+                log.debug("%s has shared fixtures", case)
+                try:
+                    case.setUp()
+                except (KeyboardInterrupt, SystemExit):
+                    raise
+                except:
+                    log.debug("%s setup failed", sys.exc_info())
+                    result.addError(case, sys.exc_info())
+                else:
+                    to_teardown.append(case)
+                    for _t in case:
+                        test_addr = self.address(_t)
+                        testQueue.put(test_addr, block=False)
+                        tasks[test_addr] = None
+                        log.debug("Queued shared-fixture test %s (%s) to %s",
+                                  len(tasks), test_addr, testQueue)
+
+            else:
+                test_addr = self.address(case)
+                testQueue.put(test_addr, block=False)
+                tasks[test_addr] = None
+                log.debug("Queued test %s (%s) to %s",
+                          len(tasks), test_addr, testQueue)
+
+        log.debug("Starting %s workers", self.config.multiprocess_workers)
+        for i in range(self.config.multiprocess_workers):
+            p = Process(target=runner, args=(i,
+                                             testQueue,
+                                             resultQueue,
+                                             shouldStop,
+                                             self.loaderClass,
+                                             result.__class__,
+                                             self.config))
+            # p.setDaemon(True)
+            p.start()
+            workers.append(p)
+            log.debug("Started worker process %s", i+1)
+
+        num_tasks = len(tasks)
+        while tasks:
+            log.debug("Waiting for results (%s/%s tasks)",
+                      len(completed), num_tasks)
+            try:
+                addr, batch_result = resultQueue.get(
+                    timeout=self.config.multiprocess_timeout)
+                log.debug('Results received for %s', addr)
+                try:
+                    tasks.pop(addr)
+                except KeyError:
+                    log.debug("Got result for unknown task? %s", addr)
+                else:
+                    completed[addr] = batch_result
+                self.consolidate(result, batch_result)
+                if (self.config.stopOnError
+                    and not result.wasSuccessful()):
+                    # set the stop condition
+                    shouldStop.set()
+                    break
+            except Empty:
+                log.debug("Timed out with %s tasks pending", len(tasks))
+                any_alive = False
+                for w in workers:
+                    if w.is_alive():
+                        any_alive = True
+                        break
+                if not any_alive:
+                    log.debug("All workers dead")
+                    break
+        log.debug("Completed %s/%s tasks (%s remain)",
+                  len(completed), num_tasks, len(tasks))
+
+        for case in to_teardown:
+            log.debug("Tearing down shared fixtures for %s", case)
+            try:
+                case.tearDown()
+            except (KeyboardInterrupt, SystemExit):
+                raise
+            except:
+                result.addError(case, sys.exc_info())
+
+        stop = time.time()
+
+        result.printErrors()
+        result.printSummary(start, stop)
+        self.config.plugins.finalize(result)
+
+        # Tell all workers to stop
+        for w in workers:
+            if w.is_alive():
+                testQueue.put('STOP', block=False)
+
+        return result
+
+    def address(self, case):
+        if hasattr(case, 'address'):
+            file, mod, call = case.address()
+        elif hasattr(case, 'context'):
+            file, mod, call = test_address(case.context)
+        else:
+            raise Exception("Unable to convert %s to address" % case)
+        parts = []
+        if file is None:
+            if mod is None:
+                raise Exception("Unaddressable case %s" % case)
+            else:
+                parts.append(mod)
+        else:
+            parts.append(file)
+        if call is not None:
+            parts.append(call)
+        return ':'.join(map(str, parts))
+
+    def nextBatch(self, test):
+        # allows tests or suites to mark themselves as not safe
+        # for multiprocess execution
+        if hasattr(test, 'context'):
+            if not getattr(test.context, '_multiprocess_', True):
+                return
+
+        if ((isinstance(test, ContextSuite)
+             and test.hasFixtures(self.checkCanSplit))
+            or not getattr(test, 'can_split', True)
+            or not isinstance(test, unittest.TestSuite)):
+            # regular test case, or a suite with context fixtures
+            
+            # special case: when run like nosetests path/to/module.py
+            # the top-level suite has only one item, and it shares
+            # the same context as that item. In that case, we want the
+            # item, not the top-level suite
+            if isinstance(test, ContextSuite):
+                contained = list(test)
+                if (len(contained) == 1
+                    and getattr(contained[0], 'context', None) == test.context):
+                    test = contained[0]
+            yield test
+        else:
+            # Suite is without fixtures at this level; but it may have
+            # fixtures at any deeper level, so we need to examine it all
+            # the way down to the case level
+            for case in test:
+                for batch in self.nextBatch(case):
+                    yield batch
+
+    def checkCanSplit(self, context, fixt):
+        """
+        Callback that we use to check whether the fixtures found in a
+        context or ancestor are ones we care about.
+
+        Contexts can tell us that their fixtures are reentrant by setting
+        _multiprocess_can_split_. So if we see that, we return False to
+        disregard those fixtures.
+        """
+        if not fixt:
+            return False
+        if getattr(context, '_multiprocess_can_split_', False):
+            return False
+        return True
+
+    def sharedFixtures(self, case):
+        context = getattr(case, 'context', None)
+        if not context:
+            return False
+        return getattr(context, '_multiprocess_shared_', False)
+
+    def consolidate(self, result, batch_result):
+        log.debug("batch result is %s" , batch_result)
+        try:
+            output, testsRun, failures, errors, errorClasses = batch_result
+        except ValueError:
+            log.debug("result in unexpected format %s", batch_result)
+            failure.Failure(*sys.exc_info())(result)
+            return
+        self.stream.write(output)
+        result.testsRun += testsRun
+        result.failures.extend(failures)
+        result.errors.extend(errors)
+        for key, (storage, label, isfail) in errorClasses.items():
+            if key not in result.errorClasses:
+                # Ordinarily storage is result attribute
+                # but it's only processed through the errorClasses
+                # dict, so it's ok to fake it here
+                result.errorClasses[key] = ([], label, isfail)
+            mystorage, _junk, _junk = result.errorClasses[key]
+            mystorage.extend(storage)
+        log.debug("Ran %s tests (%s)", testsRun, result.testsRun)
+
+
+def runner(ix, testQueue, resultQueue, shouldStop,
+           loaderClass, resultClass, config):
+    log.debug("Worker %s executing", ix)
+    loader = loaderClass(config=config)
+    loader.suiteClass.suiteClass = NoSharedFixtureContextSuite
+
+    def get():
+        case = testQueue.get(timeout=config.multiprocess_timeout)
+        return case
+
+    def makeResult():
+        stream = unittest._WritelnDecorator(StringIO())
+        result = resultClass(stream, descriptions=1,
+                             verbosity=config.verbosity,
+                             config=config)
+        plug_result = config.plugins.prepareTestResult(result)
+        if plug_result:
+            return plug_result
+        return result
+
+    def batch(result):
+        failures = [(TestLet(c), err) for c, err in result.failures]
+        errors = [(TestLet(c), err) for c, err in result.errors]
+        errorClasses = {}
+        for key, (storage, label, isfail) in result.errorClasses.items():
+            errorClasses[key] = ([(TestLet(c), err) for c, err in storage],
+                                 label, isfail)
+        return (
+            result.stream.getvalue(),
+            result.testsRun,
+            failures,
+            errors,
+            errorClasses)
+    try:
+        try:
+            for test_addr in iter(get, 'STOP'):
+                if shouldStop.is_set():
+                    break
+                result = makeResult()
+                test = loader.loadTestsFromNames([test_addr])
+                log.debug("Worker %s Test is %s (%s)", ix, test_addr, test)
+
+                try:
+                    test(result)
+                    resultQueue.put((test_addr, batch(result)))
+                except KeyboardInterrupt, SystemExit:
+                    raise
+                except:
+                    log.exception("Error running test or returning results")
+                    failure.Failure(*sys.exc_info())(result)
+                    resultQueue.put((test_addr, batch(result)))
+        except Empty:
+            log.debug("Worker %s timed out waiting for tasks", ix)
+    finally:
+        testQueue.close()
+        resultQueue.close()
+    log.debug("Worker %s ending", ix)
+
+
+class NoSharedFixtureContextSuite(ContextSuite):
+    """
+    Context suite that never fires shared fixtures.
+
+    When a context sets _multiprocess_shared_, fixtures in that context
+    are executed by the main process. Using this suite class prevents them
+    from executing in the runner process as well.
+
+    """
+
+    def setupContext(self, context):
+        if getattr(context, '_multiprocess_shared_', False):
+            return
+        super(NoSharedFixtureContextSuite, self).setupContext(context)
+
+    def teardownContext(self, context):
+        if getattr(context, '_multiprocess_shared_', False):
+            return
+        super(NoSharedFixtureContextSuite, self).teardownContext(context)
Index: /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/testid.py
===================================================================
--- /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/testid.py (revision 3)
+++ /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/testid.py (revision 3)
@@ -0,0 +1,306 @@
+"""
+This plugin adds a test id (like #1) to each test name output. After
+you've run once to generate test ids, you can re-run individual
+tests by activating the plugin and passing the ids (with or
+without the # prefix) instead of test names.
+
+For example, if your normal test run looks like::
+
+  % nosetests -v
+  tests.test_a ... ok
+  tests.test_b ... ok
+  tests.test_c ... ok
+
+When adding ``--with-id`` you'll see::
+
+  % nosetests -v --with-id
+  #1 tests.test_a ... ok
+  #2 tests.test_b ... ok
+  #2 tests.test_c ... ok
+
+Then you can re-run individual tests by supplying just an id number::
+
+  % nosetests -v --with-id 2
+  #2 tests.test_b ... ok
+
+You can also pass multiple id numbers::
+
+  % nosetests -v --with-id 2 3
+  #2 tests.test_b ... ok
+  #3 tests.test_c ... ok
+  
+Since most shells consider '#' a special character, you can leave it out when
+specifying a test id.
+
+Note that when run without the -v switch, no special output is displayed, but
+the ids file is still written.
+
+Looping over failed tests
+-------------------------
+
+This plugin also adds a mode that will direct the test runner to record
+failed tests. Subsequent test runs will then run only the tests that failed
+last time. Activate this mode with the ``--failed`` switch::
+
+ % nosetests -v --failed
+ #1 test.test_a ... ok
+ #2 test.test_b ... ERROR
+ #3 test.test_c ... FAILED
+ #4 test.test_d ... ok
+ 
+On the second run, only tests #2 and #3 will run::
+
+ % nosetests -v --failed
+ #2 test.test_b ... ERROR
+ #3 test.test_c ... FAILED
+
+As you correct errors and tests pass, they'll drop out of subsequent runs.
+
+First::
+
+ % nosetests -v --failed
+ #2 test.test_b ... ok
+ #3 test.test_c ... FAILED
+
+Second::
+
+ % nosetests -v --failed
+ #3 test.test_c ... FAILED
+
+When all tests pass, the full set will run on the next invocation.
+
+First::
+
+ % nosetests -v --failed
+ #3 test.test_c ... ok
+
+Second::
+ 
+ % nosetests -v --failed
+ #1 test.test_a ... ok
+ #2 test.test_b ... ok
+ #3 test.test_c ... ok
+ #4 test.test_d ... ok
+
+.. note ::
+
+  If you expect to use ``--failed`` regularly, it's a good idea to always run
+  run using the ``--with-id`` option. This will ensure that an id file is
+  always created, allowing you to add ``--failed`` to the command line as soon
+  as you have failing tests. Otherwise, your first run using ``--failed`` will
+  (perhaps surprisingly) run *all* tests, because there won't be an id file
+  containing the record of failed tests from your previous run.
+  
+"""
+__test__ = False
+
+import logging
+import os
+from nose.plugins import Plugin
+from nose.util import src, set
+
+try:
+    from cPickle import dump, load
+except ImportError:
+    from pickle import dump, load
+
+log = logging.getLogger(__name__)
+
+
+class TestId(Plugin):
+    """
+    Activate to add a test id (like #1) to each test name output. Activate
+    with --failed to rerun failing tests only.
+    """
+    name = 'id'
+    idfile = None
+    collecting = True
+    loopOnFailed = False
+
+    def options(self, parser, env):
+        """Register commandline options.
+        """
+        Plugin.options(self, parser, env)
+        parser.add_option('--id-file', action='store', dest='testIdFile',
+                          default='.noseids', metavar="FILE",
+                          help="Store test ids found in test runs in this "
+                          "file. Default is the file .noseids in the "
+                          "working directory.")
+        parser.add_option('--failed', action='store_true',
+                          dest='failed', default=False,
+                          help="Run the tests that failed in the last "
+                          "test run.")
+
+    def configure(self, options, conf):
+        """Configure plugin.
+        """
+        Plugin.configure(self, options, conf)
+        if options.failed:
+            self.enabled = True
+            self.loopOnFailed = True
+            log.debug("Looping on failed tests")
+        self.idfile = os.path.expanduser(options.testIdFile)
+        if not os.path.isabs(self.idfile):
+            self.idfile = os.path.join(conf.workingDir, self.idfile)
+        self.id = 1
+        # Ids and tests are mirror images: ids are {id: test address} and
+        # tests are {test address: id}
+        self.ids = {}
+        self.tests = {}
+        self.failed = []
+        self.source_names = []
+        # used to track ids seen when tests is filled from
+        # loaded ids file
+        self._seen = {}
+        self._write_hashes = options.verbosity >= 2
+
+    def finalize(self, result):
+        """Save new ids file, if needed.
+        """
+        if result.wasSuccessful():
+            self.failed = []
+        if self.collecting:
+            ids = dict(zip(self.tests.values(), self.tests.keys()))
+        else:
+            ids = self.ids
+        fh = open(self.idfile, 'w')
+        dump({'ids': ids,
+              'failed': self.failed,
+              'source_names': self.source_names}, fh)
+        fh.close()
+        log.debug('Saved test ids: %s, failed %s to %s',
+                  ids, self.failed, self.idfile)
+
+    def loadTestsFromNames(self, names, module=None):
+        """Translate ids in the list of requested names into their
+        test addresses, if they are found in my dict of tests.
+        """
+        log.debug('ltfn %s %s', names, module)
+        try:
+            fh = open(self.idfile, 'r')
+            data = load(fh)
+            if 'ids' in data:
+                self.ids = data['ids']
+                self.failed = data['failed']
+                self.source_names = data['source_names']
+            else:
+                # old ids field
+                self.ids = data
+                self.failed = []
+                self.source_names = names
+            if self.ids:
+                self.id = max(self.ids) + 1
+                self.tests = dict(zip(self.ids.values(), self.ids.keys()))
+            else:
+                self.id = 1
+            log.debug(
+                'Loaded test ids %s tests %s failed %s sources %s from %s',
+                self.ids, self.tests, self.failed, self.source_names,
+                self.idfile)
+            fh.close()
+        except IOError:
+            log.debug('IO error reading %s', self.idfile)
+
+        if self.loopOnFailed and self.failed:
+            self.collecting = False
+            names = self.failed
+            self.failed = []
+        # I don't load any tests myself, only translate names like '#2'
+        # into the associated test addresses
+        translated = []
+        new_source = []
+        really_new = []
+        for name in names:
+            trans = self.tr(name)
+            if trans != name:
+                translated.append(trans)
+            else:
+                new_source.append(name)
+        # names that are not ids and that are not in the current
+        # list of source names go into the list for next time
+        if new_source:
+            new_set = set(new_source)
+            old_set = set(self.source_names)
+            log.debug("old: %s new: %s", old_set, new_set)
+            really_new = [s for s in new_source
+                          if not s in old_set]
+            if really_new:
+                # remember new sources
+                self.source_names.extend(really_new)
+            if not translated:
+                # new set of source names, no translations
+                # means "run the requested tests"
+                names = new_source
+        else:
+            # no new names to translate and add to id set
+            self.collecting = False
+        log.debug("translated: %s new sources %s names %s",
+                  translated, really_new, names)
+        return (None, translated + really_new or names)
+
+    def makeName(self, addr):
+        log.debug("Make name %s", addr)
+        filename, module, call = addr
+        if filename is not None:
+            head = src(filename)
+        else:
+            head = module
+        if call is not None:
+            return "%s:%s" % (head, call)
+        return head
+
+    def setOutputStream(self, stream):
+        """Get handle on output stream so the plugin can print id #s
+        """
+        self.stream = stream
+
+    def startTest(self, test):
+        """Maybe output an id # before the test name.
+
+        Example output::
+
+          #1 test.test ... ok
+          #2 test.test_two ... ok
+
+        """
+        adr = test.address()
+        log.debug('start test %s (%s)', adr, adr in self.tests)
+        if adr in self.tests:
+            if adr in self._seen:
+                self.write('   ')
+            else:
+                self.write('#%s ' % self.tests[adr])
+                self._seen[adr] = 1
+            return
+        self.tests[adr] = self.id
+        self.write('#%s ' % self.id)
+        self.id += 1
+
+    def afterTest(self, test):
+        # None means test never ran, False means failed/err
+        if test.passed is False:
+            try:
+                key = str(self.tests[test.address()])
+            except KeyError:
+                # never saw this test -- startTest didn't run
+                pass
+            else:
+                if key not in self.failed:
+                    self.failed.append(key)
+
+    def tr(self, name):
+        log.debug("tr '%s'", name)
+        try:
+            key = int(name.replace('#', ''))
+        except ValueError:
+            return name
+        log.debug("Got key %s", key)
+        # I'm running tests mapped from the ids file,
+        # not collecting new ones
+        if key in self.ids:
+            return self.makeName(self.ids[key])
+        return name
+
+    def write(self, output):
+        if self._write_hashes:
+            self.stream.write(output)
Index: /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/plugintest.py
===================================================================
--- /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/plugintest.py (revision 3)
+++ /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/plugintest.py (revision 3)
@@ -0,0 +1,343 @@
+"""
+Testing Plugins
+===============
+
+The plugin interface is well-tested enough to safely unit test your
+use of its hooks with some level of confidence. However, there is also 
+a mixin for unittest.TestCase called PluginTester that's designed to 
+test plugins in their native runtime environment.
+
+Here's a simple example with a do-nothing plugin and a composed suite.
+
+    >>> import unittest
+    >>> from nose.plugins import Plugin, PluginTester
+    >>> class FooPlugin(Plugin):
+    ...     pass
+    >>> class TestPluginFoo(PluginTester, unittest.TestCase):
+    ...     activate = '--with-foo'
+    ...     plugins = [FooPlugin()]
+    ...     def test_foo(self):
+    ...         for line in self.output:
+    ...             # i.e. check for patterns
+    ...             pass
+    ... 
+    ...         # or check for a line containing ...
+    ...         assert "ValueError" in self.output
+    ...     def makeSuite(self):
+    ...         class TC(unittest.TestCase):
+    ...             def runTest(self):
+    ...                 raise ValueError("I hate foo")
+    ...         return unittest.TestSuite([TC()])
+    ...
+    >>> res = unittest.TestResult()
+    >>> case = TestPluginFoo('test_foo')
+    >>> case(res)
+    >>> res.errors
+    []
+    >>> res.failures
+    []
+    >>> res.wasSuccessful()
+    True
+    >>> res.testsRun
+    1
+
+And here is a more complex example of testing a plugin that has extra
+arguments and reads environment variables.
+    
+    >>> import unittest, os
+    >>> from nose.plugins import Plugin, PluginTester
+    >>> class FancyOutputter(Plugin):
+    ...     name = "fancy"
+    ...     def configure(self, options, conf):
+    ...         Plugin.configure(self, options, conf)
+    ...         if not self.enabled:
+    ...             return
+    ...         self.fanciness = 1
+    ...         if options.more_fancy:
+    ...             self.fanciness = 2
+    ...         if 'EVEN_FANCIER' in self.env:
+    ...             self.fanciness = 3
+    ... 
+    ...     def options(self, parser, env=os.environ):
+    ...         self.env = env
+    ...         parser.add_option('--more-fancy', action='store_true')
+    ...         Plugin.options(self, parser, env=env)
+    ... 
+    ...     def report(self, stream):
+    ...         stream.write("FANCY " * self.fanciness)
+    ... 
+    >>> class TestFancyOutputter(PluginTester, unittest.TestCase):
+    ...     activate = '--with-fancy' # enables the plugin
+    ...     plugins = [FancyOutputter()]
+    ...     args = ['--more-fancy']
+    ...     env = {'EVEN_FANCIER': '1'}
+    ... 
+    ...     def test_fancy_output(self):
+    ...         assert "FANCY FANCY FANCY" in self.output, (
+    ...                                         "got: %s" % self.output)
+    ...     def makeSuite(self):
+    ...         class TC(unittest.TestCase):
+    ...             def runTest(self):
+    ...                 raise ValueError("I hate fancy stuff")
+    ...         return unittest.TestSuite([TC()])
+    ... 
+    >>> res = unittest.TestResult()
+    >>> case = TestFancyOutputter('test_fancy_output')
+    >>> case(res)
+    >>> res.errors
+    []
+    >>> res.failures
+    []
+    >>> res.wasSuccessful()
+    True
+    >>> res.testsRun
+    1
+
+"""
+
+import re
+import sys
+from warnings import warn
+
+try:
+    from cStringIO import StringIO
+except ImportError:
+    from StringIO import StringIO
+    
+__all__ = ['PluginTester', 'run']
+
+
+class PluginTester(object):
+    """A mixin for testing nose plugins in their runtime environment.
+    
+    Subclass this and mix in unittest.TestCase to run integration/functional 
+    tests on your plugin.  When setUp() is called, the stub test suite is 
+    executed with your plugin so that during an actual test you can inspect the 
+    artifacts of how your plugin interacted with the stub test suite.
+    
+    - activate
+    
+      - the argument to send nosetests to activate the plugin
+     
+    - suitepath
+    
+      - if set, this is the path of the suite to test. Otherwise, you
+        will need to use the hook, makeSuite()
+      
+    - plugins
+
+      - the list of plugins to make available during the run. Note
+        that this does not mean these plugins will be *enabled* during
+        the run -- only the plugins enabled by the activate argument
+        or other settings in argv or env will be enabled.
+    
+    - args
+  
+      - a list of arguments to add to the nosetests command, in addition to
+        the activate argument
+    
+    - env
+    
+      - optional dict of environment variables to send nosetests
+
+    """
+    activate = None
+    suitepath = None
+    args = None
+    env = {}
+    argv = None
+    plugins = []
+    ignoreFiles = None
+    
+    def makeSuite(self):
+        """returns a suite object of tests to run (unittest.TestSuite())
+        
+        If self.suitepath is None, this must be implemented. The returned suite 
+        object will be executed with all plugins activated.  It may return 
+        None.
+        
+        Here is an example of a basic suite object you can return ::
+        
+            >>> import unittest
+            >>> class SomeTest(unittest.TestCase):
+            ...     def runTest(self):
+            ...         raise ValueError("Now do something, plugin!")
+            ... 
+            >>> unittest.TestSuite([SomeTest()]) # doctest: +ELLIPSIS
+            <unittest.TestSuite tests=[<...SomeTest testMethod=runTest>]>
+        
+        """
+        raise NotImplementedError
+    
+    def _execPlugin(self):
+        """execute the plugin on the internal test suite.
+        """
+        from nose.config import Config
+        from nose.core import TestProgram
+        from nose.plugins.manager import PluginManager
+        
+        suite = None
+        stream = StringIO()
+        conf = Config(env=self.env,
+                      stream=stream,
+                      plugins=PluginManager(plugins=self.plugins))
+        if self.ignoreFiles is not None:
+            conf.ignoreFiles = self.ignoreFiles
+        if not self.suitepath:
+            suite = self.makeSuite()
+            
+        self.nose = TestProgram(argv=self.argv, config=conf, suite=suite,
+                                exit=False)
+        self.output = AccessDecorator(stream)
+                                
+    def setUp(self):
+        """runs nosetests with the specified test suite, all plugins 
+        activated.
+        """
+        self.argv = ['nosetests', self.activate]
+        if self.args:
+            self.argv.extend(self.args)
+        if self.suitepath:
+            self.argv.append(self.suitepath)            
+
+        self._execPlugin()
+
+
+class AccessDecorator(object):
+    stream = None
+    _buf = None
+    def __init__(self, stream):
+        self.stream = stream
+        stream.seek(0)
+        self._buf = stream.read()
+        stream.seek(0)
+    def __contains__(self, val):
+        return val in self._buf
+    def __iter__(self):
+        return self.stream
+    def __str__(self):
+        return self._buf
+
+
+def blankline_separated_blocks(text):
+    block = []
+    for line in text.splitlines(True):
+        block.append(line)
+        if not line.strip():
+            yield "".join(block)
+            block = []
+    if block:
+        yield "".join(block)
+
+
+def remove_stack_traces(out):
+    # this regexp taken from Python 2.5's doctest
+    traceback_re = re.compile(r"""
+        # Grab the traceback header.  Different versions of Python have
+        # said different things on the first traceback line.
+        ^(?P<hdr> Traceback\ \(
+            (?: most\ recent\ call\ last
+            |   innermost\ last
+            ) \) :
+        )
+        \s* $                # toss trailing whitespace on the header.
+        (?P<stack> .*?)      # don't blink: absorb stuff until...
+        ^ (?P<msg> \w+ .*)   #     a line *starts* with alphanum.
+        """, re.VERBOSE | re.MULTILINE | re.DOTALL)
+    blocks = []
+    for block in blankline_separated_blocks(out):
+        blocks.append(traceback_re.sub(r"\g<hdr>\n...\n\g<msg>", block))
+    return "".join(blocks)
+
+
+def simplify_warnings(out):
+    warn_re = re.compile(r"""
+        # Cut the file and line no, up to the warning name
+        ^.*:\d+:\s
+        (?P<category>\w+): \s+        # warning category
+        (?P<detail>.+) $ \n?          # warning message
+        ^ .* $                        # stack frame
+        """, re.VERBOSE | re.MULTILINE)
+    return warn_re.sub(r"\g<category>: \g<detail>", out)
+
+
+def remove_timings(out):
+    return re.sub(
+        r"Ran (\d+ tests?) in [0-9.]+s", r"Ran \1 in ...s", out)
+
+
+def munge_nose_output_for_doctest(out):
+    """Modify nose output to make it easy to use in doctests."""
+    out = remove_stack_traces(out)
+    out = simplify_warnings(out)
+    out = remove_timings(out)
+    return out.strip()
+
+
+def run(*arg, **kw):
+    """
+    Specialized version of nose.run for use inside of doctests that
+    test test runs.
+
+    This version of run() prints the result output to stdout.  Before
+    printing, the output is processed by replacing the timing
+    information with an ellipsis (...), removing traceback stacks, and
+    removing trailing whitespace.
+
+    Use this version of run wherever you are writing a doctest that
+    tests nose (or unittest) test result output.
+
+    Note: do not use doctest: +ELLIPSIS when testing nose output,
+    since ellipses ("test_foo ... ok") in your expected test runner
+    output may match multiple lines of output, causing spurious test
+    passes!
+    """
+    from nose import run
+    from nose.config import Config
+    from nose.plugins.manager import PluginManager
+
+    buffer = StringIO()
+    if 'config' not in kw:
+        plugins = kw.pop('plugins', [])
+        if isinstance(plugins, list):
+            plugins = PluginManager(plugins=plugins)
+        env = kw.pop('env', {})
+        kw['config'] = Config(env=env, plugins=plugins)
+    if 'argv' not in kw:
+        kw['argv'] = ['nosetests', '-v']
+    kw['config'].stream = buffer
+    
+    # Set up buffering so that all output goes to our buffer,
+    # or warn user if deprecated behavior is active. If this is not
+    # done, prints and warnings will either be out of place or
+    # disappear.
+    stderr = sys.stderr
+    stdout = sys.stdout
+    if kw.pop('buffer_all', False):
+        sys.stdout = sys.stderr = buffer
+        restore = True
+    else:
+        restore = False
+        warn("The behavior of nose.plugins.plugintest.run() will change in "
+             "the next release of nose. The current behavior does not "
+             "correctly account for output to stdout and stderr. To enable "
+             "correct behavior, use run_buffered() instead, or pass "
+             "the keyword argument buffer_all=True to run().",
+             DeprecationWarning, stacklevel=2)
+    try:
+        run(*arg, **kw)
+    finally:
+        if restore:
+            sys.stderr = stderr
+            sys.stdout = stdout
+    out = buffer.getvalue()
+    print munge_nose_output_for_doctest(out)
+
+    
+def run_buffered(*arg, **kw):
+    kw['buffer_all'] = True
+    run(*arg, **kw)
+
+if __name__ == '__main__':
+    import doctest
+    doctest.testmod()
Index: /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/__init__.py
===================================================================
--- /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/__init__.py (revision 3)
+++ /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/__init__.py (revision 3)
@@ -0,0 +1,162 @@
+"""
+Writing Plugins
+---------------
+
+nose supports plugins for test collection, selection, observation and
+reporting. There are two basic rules for plugins:
+
+* Plugin classes should subclass :class:`nose.plugins.Plugin`.
+
+* Plugins may implement any of the methods described in the class
+  :doc:`IPluginInterface <interface>` in nose.plugins.base. Please note that
+  this class is for documentary purposes only; plugins may not subclass
+  IPluginInterface.
+
+Registering
+===========
+
+.. Note:: 
+  Important note: the following applies only to the default 
+  plugin manager. Other plugin managers may use different means to 
+  locate and load plugins.
+
+For nose to find a plugin, it must be part of a package that uses
+setuptools_, and the plugin must be included in the entry points defined
+in the setup.py for the package:
+
+.. code-block:: python
+
+    setup(name='Some plugin',
+        # ...
+        entry_points = {
+            'nose.plugins.0.10': [
+                'someplugin = someplugin:SomePlugin'
+                ]
+            },
+        # ...
+        )
+
+Once the package is installed with install or develop, nose will be able
+to load the plugin.
+
+.. _setuptools: http://peak.telecommunity.com/DevCenter/setuptools
+
+Registering a plugin without setuptools
+=======================================
+
+It is currently possible to register a plugin programmatically by 
+creating a custom nose runner like this :
+
+.. code-block:: python
+    
+    import nose
+    from yourplugin import YourPlugin
+    
+    if __name__ == '__main__':
+        nose.main(addplugins=[YourPlugin()])
+
+Defining options
+================
+
+All plugins must implement the methods ``options(self, parser, env)``
+and ``configure(self, options, conf)``. Subclasses of nose.plugins.Plugin
+that want the standard options should call the superclass methods.
+
+nose uses optparse.OptionParser from the standard library to parse
+arguments. A plugin's ``options()`` method receives a parser
+instance. It's good form for a plugin to use that instance only to add
+additional arguments that take only long arguments (--like-this). Most
+of nose's built-in arguments get their default value from an environment
+variable.
+
+A plugin's ``configure()`` method receives the parsed ``OptionParser`` options 
+object, as well as the current config object. Plugins should configure their
+behavior based on the user-selected settings, and may raise exceptions
+if the configured behavior is nonsensical.
+
+Logging
+=======
+
+nose uses the logging classes from the standard library. To enable users
+to view debug messages easily, plugins should use ``logging.getLogger()`` to
+acquire a logger in the ``nose.plugins`` namespace.
+
+Recipes
+=======
+
+* Writing a plugin that monitors or controls test result output
+
+  Implement any or all of ``addError``, ``addFailure``, etc., to monitor test
+  results. If you also want to monitor output, implement
+  ``setOutputStream`` and keep a reference to the output stream. If you
+  want to prevent the builtin ``TextTestResult`` output, implement
+  ``setOutputSteam`` and *return a dummy stream*. The default output will go
+  to the dummy stream, while you send your desired output to the real stream.
+
+  Example: `examples/html_plugin/htmlplug.py`_
+
+* Writing a plugin that handles exceptions
+
+  Subclass :doc:`ErrorClassPlugin <errorclasses>`.
+
+  Examples: :doc:`nose.plugins.deprecated <deprecated>`,
+  :doc:`nose.plugins.skip <skip>`
+
+* Writing a plugin that adds detail to error reports
+
+  Implement ``formatError`` and/or ``formatFailture``. The error tuple
+  you return (error class, error message, traceback) will replace the
+  original error tuple.
+
+  Examples: :doc:`nose.plugins.capture <capture>`, 
+  :doc:`nose.plugins.failuredetail <failuredetail>`
+
+* Writing a plugin that loads tests from files other than python modules
+
+  Implement ``wantFile`` and ``loadTestsFromFile``. In ``wantFile``,
+  return True for files that you want to examine for tests. In
+  ``loadTestsFromFile``, for those files, return an iterable
+  containing TestCases (or yield them as you find them;
+  ``loadTestsFromFile`` may also be a generator).
+ 
+  Example: :doc:`nose.plugins.doctests <doctests>`
+
+* Writing a plugin that prints a report
+
+  Implement ``begin`` if you need to perform setup before testing
+  begins. Implement ``report`` and output your report to the provided stream.
+ 
+  Examples: :doc:`nose.plugins.cover <cover>`, :doc:`nose.plugins.prof <prof>`
+
+* Writing a plugin that selects or rejects tests
+
+  Implement any or all ``want*``  methods. Return False to reject the test
+  candidate, True to accept it -- which  means that the test candidate
+  will pass through the rest of the system, so you must be prepared to
+  load tests from it if tests can't be loaded by the core loader or
+  another plugin -- and None if you don't care.
+ 
+  Examples: :doc:`nose.plugins.attrib <attrib>`, 
+  :doc:`nose.plugins.doctests <doctests>`, :doc:`nose.plugins.testid <testid>`
+  
+
+More Examples
+=============
+
+See any builtin plugin or example plugin in the examples_ directory in
+the nose source distribution. There is a list of third-party plugins
+`on jottit`_.
+
+.. _examples/html_plugin/htmlplug.py: http://python-nose.googlecode.com/svn/trunk/examples/html_plugin/htmlplug.py
+.. _examples: http://python-nose.googlecode.com/svn/trunk/examples
+.. _on jottit: http://nose-plugins.jottit.com/
+   
+"""
+from nose.plugins.base import Plugin
+from nose.plugins.manager import *
+from nose.plugins.plugintest import PluginTester
+
+if __name__ == '__main__':
+    import doctest
+    doctest.testmod()
+    
Index: /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/isolate.py
===================================================================
--- /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/isolate.py (revision 3)
+++ /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/isolate.py (revision 3)
@@ -0,0 +1,103 @@
+"""The isolation plugin resets the contents of sys.modules after running
+each test module or package. Use it by setting ``--with-isolation`` or the
+NOSE_WITH_ISOLATION environment variable.
+
+The effects are similar to wrapping the following functions around the
+import and execution of each test module::
+
+    def setup(module):
+        module._mods = sys.modules.copy()
+    
+    def teardown(module):
+        to_del = [ m for m in sys.modules.keys() if m not in
+                   module._mods ]
+        for mod in to_del:
+            del sys.modules[mod]
+        sys.modules.update(module._mods)
+
+Isolation works only during lazy loading. In normal use, this is only
+during discovery of modules within a directory, where the process of
+importing, loading tests and running tests from each module is
+encapsulated in a single loadTestsFromName call. This plugin
+implements loadTestsFromNames to force the same lazy-loading there,
+which allows isolation to work in directed mode as well as discovery,
+at the cost of some efficiency: lazy-loading names forces full context
+setup and teardown to run for each name, defeating the grouping that
+is normally used to ensure that context setup and teardown are run the
+fewest possible times for a given set of names.
+
+.. warning ::
+
+    This plugin should not be used in conjunction with other plugins
+    that assume that modules, once imported, will stay imported; for
+    instance, it may cause very odd results when used with the coverage
+    plugin.
+
+"""
+
+import logging
+import sys
+
+from nose.plugins import Plugin
+
+
+log = logging.getLogger('nose.plugins.isolation')
+
+class IsolationPlugin(Plugin):
+    """
+    Activate the isolation plugin to isolate changes to external
+    modules to a single test module or package. The isolation plugin
+    resets the contents of sys.modules after each test module or
+    package runs to its state before the test. PLEASE NOTE that this
+    plugin should not be used with the coverage plugin, or in any other case
+    where module reloading may produce undesirable side-effects.
+    """
+    score = 10 # I want to be last
+    name = 'isolation'
+
+    def configure(self, options, conf):
+        """Configure plugin.
+        """        
+        Plugin.configure(self, options, conf)
+        self._mod_stack = []
+
+    def beforeContext(self):
+        """Copy sys.modules onto my mod stack
+        """
+        mods = sys.modules.copy()
+        self._mod_stack.append(mods)
+
+    def afterContext(self):
+        """Pop my mod stack and restore sys.modules to the state
+        it was in when mod stack was pushed.
+        """
+        mods = self._mod_stack.pop()
+        to_del = [ m for m in sys.modules.keys() if m not in mods ]
+        if to_del:
+            log.debug('removing sys modules entries: %s', to_del)
+            for mod in to_del:
+                del sys.modules[mod]
+        sys.modules.update(mods)
+
+    def loadTestsFromNames(self, names, module=None):
+        """Create a lazy suite that calls beforeContext and afterContext
+        around each name. The side-effect of this is that full context
+        fixtures will be set up and torn down around each test named.
+        """
+        # Fast path for when we don't care
+        if not names or len(names) == 1:
+            return 
+        loader = self.loader
+        plugins = self.conf.plugins
+        def lazy():
+            for name in names:
+                plugins.beforeContext()
+                yield loader.loadTestsFromName(name, module=module)
+                plugins.afterContext()
+        return (loader.suiteClass(lazy), [])
+
+    def prepareTestLoader(self, loader):
+        """Get handle on test loader so we can use it in loadTestsFromNames.
+        """
+        self.loader = loader
+
Index: /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/deprecated.py
===================================================================
--- /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/deprecated.py (revision 3)
+++ /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/deprecated.py (revision 3)
@@ -0,0 +1,45 @@
+"""
+This plugin installs a DEPRECATED error class for the :class:`DeprecatedTest`
+exception. When :class:`DeprecatedTest` is raised, the exception will be logged
+in the deprecated attribute of the result, ``D`` or ``DEPRECATED`` (verbose)
+will be output, and the exception will not be counted as an error or failure.
+It is enabled by default, but can be turned off by using ``--no-deprecated``.
+"""
+
+from nose.plugins.errorclass import ErrorClass, ErrorClassPlugin
+
+
+class DeprecatedTest(Exception):
+    """Raise this exception to mark a test as deprecated.
+    """
+    pass
+
+
+class Deprecated(ErrorClassPlugin):
+    """
+    Installs a DEPRECATED error class for the DeprecatedTest exception. Enabled
+    by default.
+    """
+    enabled = True
+    deprecated = ErrorClass(DeprecatedTest,
+                            label='DEPRECATED',
+                            isfailure=False)
+
+    def options(self, parser, env):
+        """Register commandline options.
+        """
+        env_opt = 'NOSE_WITHOUT_DEPRECATED'
+        parser.add_option('--no-deprecated', action='store_true',
+                          dest='noDeprecated', default=env.get(env_opt, False),
+                          help="Disable special handling of DeprecatedTest "
+                          "exceptions.")
+
+    def configure(self, options, conf):
+        """Configure plugin.
+        """
+        if not self.can_configure:
+            return
+        self.conf = conf
+        disable = getattr(options, 'noDeprecated', False)
+        if disable:
+            self.enabled = False
Index: /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/allmodules.py
===================================================================
--- /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/allmodules.py (revision 3)
+++ /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/allmodules.py (revision 3)
@@ -0,0 +1,45 @@
+"""Use the AllModules plugin by passing ``--all-modules`` or setting the
+NOSE_ALL_MODULES environment variable to enable collection and execution of
+tests in all python modules. Normal nose behavior is to look for tests only in
+modules that match testMatch.
+
+More information: :doc:`../doc_tests/test_allmodules/test_allmodules`
+
+.. warning ::
+
+   This plugin can have surprising interactions with plugins that load tests
+   from what nose normally considers non-test modules, such as
+   the :doc:`doctest plugin <doctests>`. This is because any given
+   object in a module can't be loaded both by a plugin and the normal nose
+   :class:`test loader <nose.loader.TestLoader>`. Also, if you have functions
+   or classes in non-test modules that look like tests but aren't, you will
+   likely see errors as nose attempts to run them as tests.
+
+"""
+
+import os
+from nose.plugins.base import Plugin
+
+class AllModules(Plugin):
+    """Collect tests from all python modules.
+    """
+    def options(self, parser, env):
+        """Register commandline options.
+        """
+        env_opt = 'NOSE_ALL_MODULES'
+        parser.add_option('--all-modules',
+                          action="store_true",
+                          dest=self.enableOpt,
+                          default=env.get(env_opt),
+                          help="Enable plugin %s: %s [%s]" %
+                          (self.__class__.__name__, self.help(), env_opt))
+
+    def wantFile(self, file):
+        """Override to return True for all files ending with .py"""
+        # always want .py files
+        if file.endswith('.py'):
+            return True
+
+    def wantModule(self, module):
+        """Override return True for all modules"""
+        return True
Index: /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/capture.py
===================================================================
--- /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/capture.py (revision 3)
+++ /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/capture.py (revision 3)
@@ -0,0 +1,112 @@
+"""
+This plugin captures stdout during test execution. If the test fails
+or raises an error, the captured output will be appended to the error
+or failure output. It is enabled by default but can be disabled with
+the options ``-s`` or ``--nocapture``.
+
+:Options:
+  ``--nocapture``
+    Don't capture stdout (any stdout output will be printed immediately)
+
+"""
+import logging
+import os
+import sys
+from nose.plugins.base import Plugin
+from nose.util import ln
+from StringIO import StringIO
+
+
+log = logging.getLogger(__name__)
+
+class Capture(Plugin):
+    """
+    Output capture plugin. Enabled by default. Disable with ``-s`` or
+    ``--nocapture``. This plugin captures stdout during test execution,
+    appending any output captured to the error or failure output,
+    should the test fail or raise an error.
+    """
+    enabled = True
+    env_opt = 'NOSE_NOCAPTURE'
+    name = 'capture'
+    score = 500
+
+    def __init__(self):
+        self.stdout = []
+        self._buf = None
+
+    def options(self, parser, env):
+        """Register commandline options
+        """
+        parser.add_option(
+            "-s", "--nocapture", action="store_false",
+            default=not env.get(self.env_opt), dest="capture",
+            help="Don't capture stdout (any stdout output "
+            "will be printed immediately) [NOSE_NOCAPTURE]")
+
+    def configure(self, options, conf):
+        """Configure plugin. Plugin is enabled by default.
+        """
+        self.conf = conf
+        if not options.capture:
+            self.enabled = False
+
+    def afterTest(self, test):
+        """Clear capture buffer.
+        """
+        self.end()
+        self._buf = None
+
+    def begin(self):
+        """Replace sys.stdout with capture buffer.
+        """
+        self.start() # get an early handle on sys.stdout
+
+    def beforeTest(self, test):
+        """Flush capture buffer.
+        """
+        self.start()
+
+    def formatError(self, test, err):
+        """Add captured output to error report.
+        """
+        test.capturedOutput = output = self.buffer
+        self._buf = None
+        if not output:
+            # Don't return None as that will prevent other
+            # formatters from formatting and remove earlier formatters
+            # formats, instead return the err we got
+            return err
+        ec, ev, tb = err
+        return (ec, self.addCaptureToErr(ev, output), tb)
+
+    def formatFailure(self, test, err):
+        """Add captured output to failure report.
+        """
+        return self.formatError(test, err)
+
+    def addCaptureToErr(self, ev, output):
+        return '\n'.join([str(ev) , ln('>> begin captured stdout <<'),
+                          output, ln('>> end captured stdout <<')])
+
+    def start(self):
+        self.stdout.append(sys.stdout)
+        self._buf = StringIO()
+        sys.stdout = self._buf
+
+    def end(self):
+        if self.stdout:
+            sys.stdout = self.stdout.pop()
+
+    def finalize(self, result):
+        """Restore stdout.
+        """
+        while self.stdout:
+            self.end()
+
+    def _get_buffer(self):
+        if self._buf is not None:
+            return self._buf.getvalue()
+
+    buffer = property(_get_buffer, None, None,
+                      """Captured stdout output.""")
Index: /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/logcapture.py
===================================================================
--- /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/logcapture.py (revision 3)
+++ /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/logcapture.py (revision 3)
@@ -0,0 +1,192 @@
+"""
+This plugin captures logging statements issued during test execution. When an
+error or failure occurs, the captured log messages are attached to the running
+test in the test.capturedLogging attribute, and displayed with the error failure
+output. It is enabled by default but can be turned off with the option
+``--nologcapture``.
+
+You can filter captured logging statements with the ``--logging-filter`` option. 
+If set, it specifies which logger(s) will be captured; loggers that do not match
+will be passed. Example: specifying ``--logging-filter=sqlalchemy,myapp``
+will ensure that only statements logged via sqlalchemy.engine, myapp
+or myapp.foo.bar logger will be logged.
+
+You can remove other installed logging handlers with the
+``--logging-clear-handlers`` option.
+"""
+
+import logging
+from logging.handlers import BufferingHandler
+
+from nose.plugins.base import Plugin
+from nose.util import ln, safe_str
+
+try:
+    from cStringIO import StringIO
+except ImportError:
+    from StringIO import StringIO
+
+log = logging.getLogger(__name__)
+
+
+class MyMemoryHandler(BufferingHandler):
+    def __init__(self, capacity, logformat, logdatefmt, filters):
+        BufferingHandler.__init__(self, capacity)
+        fmt = logging.Formatter(logformat, logdatefmt)
+        self.setFormatter(fmt)
+        self.filters = filters
+    def flush(self):
+        pass # do nothing
+    def truncate(self):
+        self.buffer = []
+    def filter(self, record):
+        """Our custom record filtering logic.
+
+        Built-in filtering logic (via logging.Filter) is too limiting.
+        """
+        if not self.filters:
+            return True
+        matched = False
+        rname = record.name # shortcut
+        for name in self.filters:
+            if rname == name or rname.startswith(name+'.'):
+                matched = True
+        return matched
+
+
+class LogCapture(Plugin):
+    """
+    Log capture plugin. Enabled by default. Disable with --nologcapture.
+    This plugin captures logging statements issued during test execution,
+    appending any output captured to the error or failure output,
+    should the test fail or raise an error.    
+    """
+    enabled = True
+    env_opt = 'NOSE_NOLOGCAPTURE'
+    name = 'logcapture'
+    score = 500
+    logformat = '%(name)s: %(levelname)s: %(message)s'
+    logdatefmt = None
+    clear = False
+    filters = []
+    
+    def options(self, parser, env):
+        """Register commandline options.
+        """
+        parser.add_option(
+            "--nologcapture", action="store_false",
+            default=not env.get(self.env_opt), dest="logcapture",
+            help="Disable logging capture plugin. "
+                 "Logging configurtion will be left intact."
+                 " [NOSE_NOLOGCAPTURE]")
+        parser.add_option(
+            "--logging-format", action="store", dest="logcapture_format",
+            default=env.get('NOSE_LOGFORMAT') or self.logformat,
+            metavar="FORMAT",
+            help="Specify custom format to print statements. "
+                 "Uses the same format as used by standard logging handlers."
+                 " [NOSE_LOGFORMAT]")
+        parser.add_option(
+            "--logging-datefmt", action="store", dest="logcapture_datefmt",
+            default=env.get('NOSE_LOGDATEFMT') or self.logdatefmt,
+            metavar="FORMAT",
+            help="Specify custom date/time format to print statements. "
+                 "Uses the same format as used by standard logging handlers."
+                 " [NOSE_LOGDATEFMT]")
+        parser.add_option(
+            "--logging-filter", action="store", dest="logcapture_filters",
+            default=env.get('NOSE_LOGFILTER'),
+            metavar="FILTER",
+            help="Specify which statements to filter in/out. "
+                 "By default, everything is captured. If the output is too"
+                 " verbose,\nuse this option to filter out needless output.\n"
+                 "Example: filter=foo will capture statements issued ONLY to\n"
+                 " foo or foo.what.ever.sub but not foobar or other logger.\n"
+                 "Specify multiple loggers with comma: filter=foo,bar,baz."
+                 " [NOSE_LOGFILTER]\n")
+        parser.add_option(
+            "--logging-clear-handlers", action="store_true",
+            default=False, dest="logcapture_clear",
+            help="Clear all other logging handlers")
+
+    def configure(self, options, conf):
+        """Configure plugin.
+        """
+        self.conf = conf
+        # Disable if explicitly disabled, or if logging is
+        # configured via logging config file
+        if not options.logcapture or conf.loggingConfig:
+            self.enabled = False        
+        self.logformat = options.logcapture_format
+        self.logdatefmt = options.logcapture_datefmt
+        self.clear = options.logcapture_clear
+        if options.logcapture_filters:
+            self.filters = options.logcapture_filters.split(',')
+        
+    def setupLoghandler(self):
+        # setup our handler with root logger
+        root_logger = logging.getLogger()
+        if self.clear:
+            for logger in logging.Logger.manager.loggerDict.values():
+                if hasattr(logger, "handlers"):
+                    for handler in logger.handlers:
+                        logger.removeHandler(handler)
+        # make sure there isn't one already
+        # you can't simply use "if self.handler not in root_logger.handlers"
+        # since at least in unit tests this doesn't work --
+        # LogCapture() is instantiated for each test case while root_logger
+        # is module global
+        # so we always add new MyMemoryHandler instance
+        for handler in root_logger.handlers[:]:
+            if isinstance(handler, MyMemoryHandler):
+                root_logger.handlers.remove(handler)
+        root_logger.addHandler(self.handler)
+        # to make sure everything gets captured
+        root_logger.setLevel(logging.NOTSET)
+
+    def begin(self):
+        """Set up logging handler before test run begins.
+        """
+        self.start()
+
+    def start(self):
+        self.handler = MyMemoryHandler(1000, self.logformat, self.logdatefmt,
+                                       self.filters)
+        self.setupLoghandler()
+
+    def end(self):
+        pass
+
+    def beforeTest(self, test):
+        """Clear buffers and handlers before test.
+        """
+        self.setupLoghandler()
+
+    def afterTest(self, test):
+        """Clear buffers after test.
+        """
+        self.handler.truncate()
+
+    def formatFailure(self, test, err):
+        """Add captured log messages to failure output.
+        """
+        return self.formatError(test, err)
+
+    def formatError(self, test, err):
+        """Add captured log messages to error output.
+        """
+        # logic flow copied from Capture.formatError
+        test.capturedLogging = records = self.formatLogRecords()
+        if not records:
+            return err 
+        ec, ev, tb = err
+        return (ec, self.addCaptureToErr(ev, records), tb)
+
+    def formatLogRecords(self):
+        format = self.handler.format
+        return [safe_str(format(r)) for r in self.handler.buffer]
+
+    def addCaptureToErr(self, ev, records):
+        return '\n'.join([safe_str(ev), ln('>> begin captured logging <<')] + \
+                          records + \
+                          [ln('>> end captured logging <<')])
Index: /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/builtin.py
===================================================================
--- /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/builtin.py (revision 3)
+++ /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/builtin.py (revision 3)
@@ -0,0 +1,34 @@
+"""
+Lists builtin plugins.
+"""
+plugins = []
+builtins = (
+    ('nose.plugins.attrib', 'AttributeSelector'),
+    ('nose.plugins.capture', 'Capture'),
+    ('nose.plugins.logcapture', 'LogCapture'),
+    ('nose.plugins.cover', 'Coverage'),
+    ('nose.plugins.debug', 'Pdb'),
+    ('nose.plugins.deprecated', 'Deprecated'),
+    ('nose.plugins.doctests', 'Doctest'),
+    ('nose.plugins.isolate', 'IsolationPlugin'),
+    ('nose.plugins.failuredetail', 'FailureDetail'),
+    ('nose.plugins.prof', 'Profile'),
+    ('nose.plugins.skip', 'Skip'),
+    ('nose.plugins.testid', 'TestId'),
+    ('nose.plugins.multiprocess', 'MultiProcess'),
+    ('nose.plugins.xunit', 'Xunit'),
+    ('nose.plugins.allmodules', 'AllModules'),
+    ('nose.plugins.collect', 'CollectOnly'),
+    )
+
+for module, cls in builtins:
+    try:
+        plugmod = __import__(module, globals(), locals(), [cls])
+    except KeyboardInterrupt:
+        raise
+    except:
+        continue
+    plug = getattr(plugmod, cls)
+    plugins.append(plug)
+    globals()[cls] = plug
+
Index: /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/prof.py
===================================================================
--- /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/prof.py (revision 3)
+++ /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/prof.py (revision 3)
@@ -0,0 +1,154 @@
+"""This plugin will run tests using the hotshot profiler, which is part
+of the standard library. To turn it on, use the ``--with-profile`` option
+or set the NOSE_WITH_PROFILE environment variable. Profiler output can be
+controlled with the ``--profile-sort`` and ``--profile-restrict`` options,
+and the profiler output file may be changed with ``--profile-stats-file``.
+
+See the `hotshot documentation`_ in the standard library documentation for
+more details on the various output options.
+
+.. _hotshot documentation: http://docs.python.org/library/hotshot.html
+"""
+
+try:
+    import hotshot
+    from hotshot import stats
+except ImportError:
+    hotshot, stats = None, None
+import logging
+import os
+import sys
+import tempfile
+from nose.plugins.base import Plugin
+from nose.util import tolist
+
+log = logging.getLogger('nose.plugins')
+
+class Profile(Plugin):
+    """
+    Use this plugin to run tests using the hotshot profiler. 
+    """
+    pfile = None
+    clean_stats_file = False
+    def options(self, parser, env):
+        """Register commandline options.
+        """
+        if not self.available():
+            return
+        Plugin.options(self, parser, env)
+        parser.add_option('--profile-sort', action='store', dest='profile_sort',
+                          default=env.get('NOSE_PROFILE_SORT', 'cumulative'),
+                          metavar="SORT",
+                          help="Set sort order for profiler output")
+        parser.add_option('--profile-stats-file', action='store',
+                          dest='profile_stats_file',
+                          metavar="FILE",
+                          default=env.get('NOSE_PROFILE_STATS_FILE'),
+                          help='Profiler stats file; default is a new '
+                          'temp file on each run')
+        parser.add_option('--profile-restrict', action='append',
+                          dest='profile_restrict',
+                          metavar="RESTRICT",
+                          default=env.get('NOSE_PROFILE_RESTRICT'),
+                          help="Restrict profiler output. See help for "
+                          "pstats.Stats for details")
+
+    def available(cls):
+        return hotshot is not None
+    available = classmethod(available)
+        
+    def begin(self):
+        """Create profile stats file and load profiler.
+        """
+        if not self.available():
+            return
+        self._create_pfile()
+        self.prof = hotshot.Profile(self.pfile)
+
+    def configure(self, options, conf):
+        """Configure plugin.
+        """
+        if not self.available():
+            self.enabled = False
+            return
+        Plugin.configure(self, options, conf)
+        self.conf = conf
+        if options.profile_stats_file:
+            self.pfile = options.profile_stats_file
+            self.clean_stats_file = False
+        else:
+            self.pfile = None
+            self.clean_stats_file = True
+        self.fileno = None
+        self.sort = options.profile_sort
+        self.restrict = tolist(options.profile_restrict)
+            
+    def prepareTest(self, test):
+        """Wrap entire test run in :func:`prof.runcall`.
+        """
+        if not self.available():
+            return
+        log.debug('preparing test %s' % test)
+        def run_and_profile(result, prof=self.prof, test=test):
+            self._create_pfile()
+            prof.runcall(test, result)
+        return run_and_profile
+        
+    def report(self, stream):
+        """Output profiler report.
+        """
+        log.debug('printing profiler report')
+        self.prof.close()
+        prof_stats = stats.load(self.pfile)
+        prof_stats.sort_stats(self.sort)
+
+        # 2.5 has completely different stream handling from 2.4 and earlier.
+        # Before 2.5, stats objects have no stream attribute; in 2.5 and later
+        # a reference sys.stdout is stored before we can tweak it.
+        compat_25 = hasattr(stats, 'stream')
+        if compat_25:
+            tmp = prof_stats.stream
+            stats.stream = stream
+        else:
+            tmp = sys.stdout
+            sys.stdout = stream
+        try:
+            if self.restrict:
+                log.debug('setting profiler restriction to %s', self.restrict)
+                prof_stats.print_stats(*self.restrict)
+            else:
+                prof_stats.print_stats()
+        finally:
+            if compat_25:
+                stats.stream = tmp
+            else:
+                sys.stdout = tmp
+
+    def finalize(self, result):
+        """Clean up stats file, if configured to do so.
+        """
+        if not self.available():
+            return
+        try:
+            self.prof.close()
+        except AttributeError:
+            # TODO: is this trying to catch just the case where not
+            # hasattr(self.prof, "close")?  If so, the function call should be
+            # moved out of the try: suite.
+            pass
+        if self.clean_stats_file:
+            if self.fileno:
+                try:
+                    os.close(self.fileno)
+                except OSError:
+                    pass
+            try:
+                os.unlink(self.pfile)
+            except OSError:
+                pass
+        return None
+
+    def _create_pfile(self):
+        if not self.pfile:
+            self.fileno, self.pfile = tempfile.mkstemp()
+            self.clean_stats_file = True
Index: /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/skip.py
===================================================================
--- /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/skip.py (revision 3)
+++ /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/skip.py (revision 3)
@@ -0,0 +1,51 @@
+"""
+This plugin installs a SKIP error class for the SkipTest exception.
+When SkipTest is raised, the exception will be logged in the skipped
+attribute of the result, 'S' or 'SKIP' (verbose) will be output, and
+the exception will not be counted as an error or failure. This plugin
+is enabled by default but may be disabled with the ``--no-skip`` option.
+"""
+    
+from nose.plugins.errorclass import ErrorClass, ErrorClassPlugin
+
+
+class SkipTest(Exception):
+    """Raise this exception to mark a test as skipped.
+    """
+    pass
+
+
+class Skip(ErrorClassPlugin):
+    """
+    Plugin that installs a SKIP error class for the SkipTest
+    exception.  When SkipTest is raised, the exception will be logged
+    in the skipped attribute of the result, 'S' or 'SKIP' (verbose)
+    will be output, and the exception will not be counted as an error
+    or failure.
+    """
+    enabled = True
+    skipped = ErrorClass(SkipTest,
+                         label='SKIP',
+                         isfailure=False)
+
+    def options(self, parser, env):
+        """
+        Add my options to command line.
+        """
+        env_opt = 'NOSE_WITHOUT_SKIP'
+        parser.add_option('--no-skip', action='store_true',
+                          dest='noSkip', default=env.get(env_opt, False),
+                          help="Disable special handling of SkipTest "
+                          "exceptions.")
+
+    def configure(self, options, conf):
+        """
+        Configure plugin. Skip plugin is enabled by default.
+        """
+        if not self.can_configure:
+            return
+        self.conf = conf
+        disable = getattr(options, 'noSkip', False)
+        if disable:
+            self.enabled = False
+            
Index: /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/xunit.py
===================================================================
--- /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/xunit.py (revision 3)
+++ /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/xunit.py (revision 3)
@@ -0,0 +1,208 @@
+
+"""This plugin provides test results in the standard XUnit XML format.
+
+It was designed for the `Hudson`_ continuous build system but will 
+probably work for anything else that understands an XUnit-formatted XML
+representation of test results.
+
+Add this shell command to your builder ::
+    
+    nosetests --with-xunit
+
+And by default a file named nosetests.xml will be written to the 
+working directory.  
+
+In a Hudson builder, tick the box named "Publish JUnit test result report"
+under the Post-build Actions and enter this value for Test report XMLs::
+    
+    **/nosetests.xml
+
+If you need to change the name or location of the file, you can set the 
+``--xunit-file`` option.
+
+Here is an abbreviated version of what an XML test report might look like::
+    
+    <?xml version="1.0" encoding="UTF-8"?>
+    <testsuite name="nosetests" tests="1" errors="1" failures="0" skip="0">
+        <testcase classname="path_to_test_suite.TestSomething" 
+                  name="path_to_test_suite.TestSomething.test_it" time="0">
+            <error type="exceptions.TypeError">
+            Traceback (most recent call last):
+            ...            
+            TypeError: oops, wrong type
+            </error>
+        </testcase>
+    </testsuite>
+
+.. _Hudson: https://hudson.dev.java.net/
+
+"""
+
+import os
+import traceback
+import re
+import inspect
+from nose.plugins.base import Plugin
+from nose.exc import SkipTest
+from time import time
+import doctest
+
+def xmlsafe(s, encoding="utf-8"):
+    """Used internally to escape XML."""
+    if isinstance(s, unicode):
+        s = s.encode(encoding)
+    s = str(s)
+    for src, rep in [('&', '&amp;', ),
+                     ('<', '&lt;', ),
+                     ('>', '&gt;', ),
+                     ('"', '&quot;', ),
+                     ("'", '&#39;', ),
+                     ]:
+        s = s.replace(src, rep)
+    return s
+
+def nice_classname(obj):
+    """Returns a nice name for class object or class instance.
+    
+        >>> nice_classname(Exception()) # doctest: +ELLIPSIS
+        '...Exception'
+        >>> nice_classname(Exception)
+        'exceptions.Exception'
+    
+    """
+    if inspect.isclass(obj):
+        cls_name = obj.__name__
+    else:
+        cls_name = obj.__class__.__name__
+    mod = inspect.getmodule(obj)
+    if mod:
+        name = mod.__name__
+        # jython
+        if name.startswith('org.python.core.'):
+            name = name[len('org.python.core.'):]
+        return "%s.%s" % (name, cls_name)
+    else:
+        return cls_name
+
+class Xunit(Plugin):
+    """This plugin provides test results in the standard XUnit XML format."""
+    name = 'xunit'
+    score = 2000
+    encoding = 'UTF-8'
+    
+    def _timeTaken(self):
+        if hasattr(self, '_timer'):
+            taken = time() - self._timer
+        else:
+            # test died before it ran (probably error in setup())
+            # or success/failure added before test started probably 
+            # due to custom TestResult munging
+            taken = 0.0
+        return taken
+    
+    def _xmlsafe(self, s):
+        return xmlsafe(s, encoding=self.encoding)
+    
+    def options(self, parser, env):
+        """Sets additional command line options."""
+        Plugin.options(self, parser, env)
+        parser.add_option(
+            '--xunit-file', action='store',
+            dest='xunit_file', metavar="FILE",
+            default=env.get('NOSE_XUNIT_FILE', 'nosetests.xml'),
+            help=("Path to xml file to store the xunit report in. "
+                  "Default is nosetests.xml in the working directory "
+                  "[NOSE_XUNIT_FILE]"))
+
+    def configure(self, options, config):
+        """Configures the xunit plugin."""
+        Plugin.configure(self, options, config)
+        self.config = config
+        if self.enabled:
+            self.stats = {'errors': 0,
+                          'failures': 0,
+                          'passes': 0,
+                          'skipped': 0
+                          }
+            self.errorlist = []
+            self.error_report_file = open(options.xunit_file, 'w')
+
+    def report(self, stream):
+        """Writes an Xunit-formatted XML file
+
+        The file includes a report of test errors and failures.
+
+        """
+        self.stats['encoding'] = self.encoding
+        self.stats['total'] = (self.stats['errors'] + self.stats['failures']
+                               + self.stats['passes'] + self.stats['skipped'])
+        self.error_report_file.write(
+            '<?xml version="1.0" encoding="%(encoding)s"?>'
+            '<testsuite name="nosetests" tests="%(total)d" '
+            'errors="%(errors)d" failures="%(failures)d" '
+            'skip="%(skipped)d">' % self.stats)
+        self.error_report_file.write(''.join(self.errorlist))
+        self.error_report_file.write('</testsuite>')
+        self.error_report_file.close()
+        if self.config.verbosity > 1:
+            stream.writeln("-" * 70)
+            stream.writeln("XML: %s" % self.error_report_file.name)
+
+    def startTest(self, test):
+        """Initializes a timer before starting a test."""
+        self._timer = time()
+
+    def addError(self, test, err, capt=None):
+        """Add error output to Xunit report.
+        """
+        taken = self._timeTaken()
+            
+        if issubclass(err[0], SkipTest):
+            self.stats['skipped'] +=1
+            return
+        tb = ''.join(traceback.format_exception(*err))
+        self.stats['errors'] += 1
+        id = test.id()
+        self.errorlist.append(
+            '<testcase classname="%(cls)s" name="%(name)s" time="%(taken)d">'
+            '<error type="%(errtype)s">%(tb)s</error></testcase>' %
+            {'cls': self._xmlsafe('.'.join(id.split('.')[:-1])),
+             'name': self._xmlsafe(id),
+             'errtype': self._xmlsafe(nice_classname(err[0])),
+             'tb': self._xmlsafe(tb),
+             'taken': taken,
+             })
+
+    def addFailure(self, test, err, capt=None, tb_info=None):
+        """Add failure output to Xunit report.
+        """
+        taken = self._timeTaken()
+        tb = ''.join(traceback.format_exception(*err))
+        self.stats['failures'] += 1
+        id = test.id()
+        self.errorlist.append(
+            '<testcase classname="%(cls)s" name="%(name)s" time="%(taken)d">'
+            '<failure type="%(errtype)s">%(tb)s</failure></testcase>' %
+            {'cls': self._xmlsafe('.'.join(id.split('.')[:-1])),
+             'name': self._xmlsafe(id),
+             'errtype': self._xmlsafe(nice_classname(err[0])),
+             'tb': self._xmlsafe(tb),
+             'taken': taken,
+             })
+        
+    def addSuccess(self, test, capt=None):
+        """Add success output to Xunit report.
+        """
+        taken = self._timeTaken()
+            
+        self.stats['passes'] += 1
+        id = test.id()
+        self.errorlist.append(
+            '<testcase classname="%(cls)s" name="%(name)s" '
+            'time="%(taken)d" />' %
+            {'cls': self._xmlsafe('.'.join(id.split('.')[:-1])),
+             'name': self._xmlsafe(id),
+             'taken': taken,
+             })
+
+    
Index: /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/manager.py
===================================================================
--- /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/manager.py (revision 3)
+++ /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/manager.py (revision 3)
@@ -0,0 +1,434 @@
+"""
+Plugin Manager
+--------------
+
+A plugin manager class is used to load plugins, manage the list of
+loaded plugins, and proxy calls to those plugins.
+
+The plugin managers provided with nose are:
+
+:class:`PluginManager`
+    This manager doesn't implement loadPlugins, so it can only work
+    with a static list of plugins.
+
+:class:`BuiltinPluginManager`
+    This manager loads plugins referenced in ``nose.plugins.builtin``.
+
+:class:`EntryPointPluginManager`
+    This manager uses setuptools entrypoints to load plugins.
+
+:class:`DefaultPluginMananger`
+    This is the manager class that will be used by default. If
+    setuptools is installed, it is a subclass of
+    :class:`EntryPointPluginManager` and :class:`BuiltinPluginManager`;
+    otherwise, an alias to :class:`BuiltinPluginManager`.
+
+:class:`RestrictedPluginManager`
+    This manager is for use in test runs where some plugin calls are
+    not available, such as runs started with ``python setup.py test``,
+    where the test runner is the default unittest :class:`TextTestRunner`. It
+    is a subclass of :class:`DefaultPluginManager`.
+
+Writing a plugin manager
+========================
+
+If you want to load plugins via some other means, you can write a
+plugin manager and pass an instance of your plugin manager class when
+instantiating the :class:`nose.config.Config` instance that you pass to
+:class:`TestProgram` (or :func:`main` or :func:`run`).
+
+To implement your plugin loading scheme, implement ``loadPlugins()``,
+and in that method, call ``addPlugin()`` with an instance of each plugin
+you wish to make available. Make sure to call
+``super(self).loadPlugins()`` as well if have subclassed a manager
+other than ``PluginManager``.
+
+"""
+import inspect
+import logging
+import os
+import sys
+from warnings import warn
+from nose.failure import Failure
+from nose.plugins.base import IPluginInterface
+
+__all__ = ['DefaultPluginManager', 'PluginManager', 'EntryPointPluginManager',
+           'BuiltinPluginManager', 'RestrictedPluginManager']
+
+log = logging.getLogger(__name__)
+
+
+class PluginProxy(object):
+    """Proxy for plugin calls. Essentially a closure bound to the
+    given call and plugin list.
+
+    The plugin proxy also must be bound to a particular plugin
+    interface specification, so that it knows what calls are available
+    and any special handling that is required for each call.
+    """
+    interface = IPluginInterface
+    def __init__(self, call, plugins):
+        try:
+            self.method = getattr(self.interface, call)
+        except AttributeError:
+            raise AttributeError("%s is not a valid %s method"
+                                 % (call, self.interface.__name__))
+        self.call = self.makeCall(call)
+        self.plugins = []
+        for p in plugins:
+            self.addPlugin(p, call)
+    
+    def __call__(self, *arg, **kw):
+        return self.call(*arg, **kw)
+    
+    def addPlugin(self, plugin, call):
+        """Add plugin to my list of plugins to call, if it has the attribute
+        I'm bound to.
+        """
+        meth = getattr(plugin, call, None)
+        if meth is not None:
+            if call == 'loadTestsFromModule' and \
+                    len(inspect.getargspec(meth)[0]) == 2:
+                orig_meth = meth
+                meth = lambda module, path, **kwargs: orig_meth(module)
+            self.plugins.append((plugin, meth))
+
+    def makeCall(self, call):
+        if call == 'loadTestsFromNames':
+            # special case -- load tests from names behaves somewhat differently
+            # from other chainable calls, because plugins return a tuple, only
+            # part of which can be chained to the next plugin.
+            return self._loadTestsFromNames
+
+        meth = self.method
+        if getattr(meth, 'generative', False):
+            # call all plugins and yield a flattened iterator of their results
+            return lambda *arg, **kw: list(self.generate(*arg, **kw))
+        elif getattr(meth, 'chainable', False):
+            return self.chain
+        else:
+            # return a value from the first plugin that returns non-None
+            return self.simple        
+            
+    def chain(self, *arg, **kw):
+        """Call plugins in a chain, where the result of each plugin call is
+        sent to the next plugin as input. The final output result is returned.
+        """
+        result = None
+        # extract the static arguments (if any) from arg so they can
+        # be passed to each plugin call in the chain
+        static = [a for (static, a)
+                  in zip(getattr(self.method, 'static_args', []), arg)
+                  if static]
+        for p, meth in self.plugins:
+            result = meth(*arg, **kw)
+            arg = static[:]
+            arg.append(result)
+        return result
+
+    def generate(self, *arg, **kw):
+        """Call all plugins, yielding each item in each non-None result.
+        """
+        for p, meth in self.plugins:
+            result = None
+            try:
+                result = meth(*arg, **kw)
+                if result is not None:
+                    for r in result:
+                        yield r
+            except (KeyboardInterrupt, SystemExit):
+                raise
+            except:
+                exc = sys.exc_info()
+                yield Failure(*exc)
+                continue
+
+    def simple(self, *arg, **kw):
+        """Call all plugins, returning the first non-None result.
+        """
+        for p, meth in self.plugins:
+            result = meth(*arg, **kw)
+            if result is not None:
+                return result
+
+    def _loadTestsFromNames(self, names, module=None):
+        """Chainable but not quite normal. Plugins return a tuple of
+        (tests, names) after processing the names. The tests are added
+        to a suite that is accumulated throughout the full call, while
+        names are input for the next plugin in the chain.
+        """
+        suite = []
+        for p, meth in self.plugins:
+            result = meth(names, module=module)
+            if result is not None:
+                suite_part, names = result
+                if suite_part:
+                    suite.extend(suite_part)
+        return suite, names
+
+
+class NoPlugins(object):
+    """Null Plugin manager that has no plugins."""
+    interface = IPluginInterface
+    def __init__(self):
+        self.plugins = ()
+
+    def __iter__(self):
+        return ()
+
+    def _doNothing(self, *args, **kwds):
+        pass
+
+    def _emptyIterator(self, *args, **kwds):
+        return ()
+
+    def __getattr__(self, call):
+        method = getattr(self.interface, call)
+        if getattr(method, "generative", False):
+            return self._emptyIterator
+        else:
+            return self._doNothing
+
+    def addPlugin(self, plug):
+        raise NotImplementedError()
+
+    def addPlugins(self, plugins):
+        raise NotImplementedError()
+
+    def configure(self, options, config):
+        pass
+
+    def loadPlugins(self):
+        pass
+
+    def sort(self, cmpf=None):
+        pass
+
+
+class PluginManager(object):
+    """Base class for plugin managers. Does not implement loadPlugins, so it
+    may only be used with a static list of plugins.
+
+    The basic functionality of a plugin manager is to proxy all unknown
+    attributes through a ``PluginProxy`` to a list of plugins.
+
+    Note that the list of plugins *may not* be changed after the first plugin
+    call.
+    """
+    proxyClass = PluginProxy
+    
+    def __init__(self, plugins=(), proxyClass=None):
+        self._plugins = []
+        self._proxies = {}
+        if plugins:
+            self.addPlugins(plugins)
+        if proxyClass is not None:
+            self.proxyClass = proxyClass
+        
+    def __getattr__(self, call):
+        try:
+            return self._proxies[call]
+        except KeyError:
+            proxy = self.proxyClass(call, self._plugins)
+            self._proxies[call] = proxy
+        return proxy
+
+    def __iter__(self):
+        return iter(self.plugins)
+
+    def addPlugin(self, plug):
+        self._plugins.append(plug)
+
+    def addPlugins(self, plugins):
+        for plug in plugins:
+            self.addPlugin(plug)
+
+    def configure(self, options, config):
+        """Configure the set of plugins with the given options
+        and config instance. After configuration, disabled plugins
+        are removed from the plugins list.
+        """
+        log.debug("Configuring plugins")
+        self.config = config
+        cfg = PluginProxy('configure', self._plugins)
+        cfg(options, config)
+        enabled = [plug for plug in self._plugins if plug.enabled]
+        self.plugins = enabled
+        self.sort()
+        log.debug("Plugins enabled: %s", enabled)
+
+    def loadPlugins(self):
+        pass
+
+    def sort(self, cmpf=None):
+        if cmpf is None:
+            cmpf = lambda a, b: cmp(getattr(b, 'score', 1),
+                                    getattr(a, 'score', 1))
+        self._plugins.sort(cmpf)
+
+    def _get_plugins(self):
+        return self._plugins
+
+    def _set_plugins(self, plugins):
+        self._plugins = []
+        self.addPlugins(plugins)
+
+    plugins = property(_get_plugins, _set_plugins, None,
+                       """Access the list of plugins managed by
+                       this plugin manager""")
+
+
+class ZeroNinePlugin:
+    """Proxy for 0.9 plugins, adapts 0.10 calls to 0.9 standard.
+    """
+    def __init__(self, plugin):
+        self.plugin = plugin
+
+    def options(self, parser, env=os.environ):
+        self.plugin.add_options(parser, env)
+    
+    def addError(self, test, err):
+        if not hasattr(self.plugin, 'addError'):
+            return
+        # switch off to addSkip, addDeprecated if those types
+        from nose.exc import SkipTest, DeprecatedTest
+        ec, ev, tb = err
+        if issubclass(ec, SkipTest):
+            if not hasattr(self.plugin, 'addSkip'):
+                return
+            return self.plugin.addSkip(test.test)
+        elif issubclass(ec, DeprecatedTest):
+            if not hasattr(self.plugin, 'addDeprecated'):
+                return
+            return self.plugin.addDeprecated(test.test)           
+        # add capt
+        capt = test.capturedOutput
+        return self.plugin.addError(test.test, err, capt)
+
+    def loadTestsFromFile(self, filename):
+        if hasattr(self.plugin, 'loadTestsFromPath'):
+            return self.plugin.loadTestsFromPath(filename)
+
+    def addFailure(self, test, err):
+        if not hasattr(self.plugin, 'addFailure'):
+            return
+        # add capt and tbinfo
+        capt = test.capturedOutput
+        tbinfo = test.tbinfo
+        return self.plugin.addFailure(test.test, err, capt, tbinfo)
+
+    def addSuccess(self, test):
+        if not hasattr(self.plugin, 'addSuccess'):
+            return
+        capt = test.capturedOutput
+        self.plugin.addSuccess(test.test, capt)
+
+    def startTest(self, test):
+        if not hasattr(self.plugin, 'startTest'):
+            return
+        return self.plugin.startTest(test.test)
+
+    def stopTest(self, test):
+        if not hasattr(self.plugin, 'stopTest'):
+            return
+        return self.plugin.stopTest(test.test)
+
+    def __getattr__(self, val):
+        return getattr(self.plugin, val)
+
+            
+class EntryPointPluginManager(PluginManager):
+    """Plugin manager that loads plugins from the `nose.plugins` and
+    `nose.plugins.0.10` entry points.
+    """
+    entry_points = (('nose.plugins.0.10', None),
+                    ('nose.plugins', ZeroNinePlugin))
+    
+    def loadPlugins(self):
+        """Load plugins by iterating the `nose.plugins` entry point.
+        """
+        super(EntryPointPluginManager, self).loadPlugins()
+        from pkg_resources import iter_entry_points
+
+        loaded = {}
+        for entry_point, adapt in self.entry_points:
+            for ep in iter_entry_points(entry_point):
+                if ep.name in loaded:
+                    continue
+                loaded[ep.name] = True
+                log.debug('%s load plugin %s', self.__class__.__name__, ep)
+                try:
+                    plugcls = ep.load()
+                except KeyboardInterrupt:
+                    raise
+                except Exception, e:
+                    # never want a plugin load to kill the test run
+                    # but we can't log here because the logger is not yet
+                    # configured
+                    warn("Unable to load plugin %s: %s" % (ep, e),
+                         RuntimeWarning)
+                    continue
+                if adapt:
+                    plug = adapt(plugcls())
+                else:
+                    plug = plugcls()
+                self.addPlugin(plug)
+
+
+class BuiltinPluginManager(PluginManager):
+    """Plugin manager that loads plugins from the list in
+    `nose.plugins.builtin`.
+    """
+    def loadPlugins(self):
+        """Load plugins in nose.plugins.builtin
+        """
+        super(BuiltinPluginManager, self).loadPlugins()
+        from nose.plugins import builtin
+        for plug in builtin.plugins:
+            self.addPlugin(plug())
+        
+try:
+    import pkg_resources
+    class DefaultPluginManager(BuiltinPluginManager, EntryPointPluginManager):
+        pass
+except ImportError:
+    DefaultPluginManager = BuiltinPluginManager
+
+
+class RestrictedPluginManager(DefaultPluginManager):
+    """Plugin manager that restricts the plugin list to those not
+    excluded by a list of exclude methods. Any plugin that implements
+    an excluded method will be removed from the manager's plugin list
+    after plugins are loaded.
+    """
+    def __init__(self, plugins=(), exclude=(), load=True):
+        DefaultPluginManager.__init__(self, plugins)
+        self.load = load
+        self.exclude = exclude
+        self.excluded = []
+        self._excludedOpts = None
+        
+    def excludedOption(self, name):
+        if self._excludedOpts is None:
+            from optparse import OptionParser
+            self._excludedOpts = OptionParser(add_help_option=False)
+            for plugin in self.excluded:
+                plugin.options(self._excludedOpts, env={})
+        return self._excludedOpts.get_option('--' + name)
+        
+    def loadPlugins(self):
+        if self.load:
+            DefaultPluginManager.loadPlugins(self)
+        allow = []
+        for plugin in self.plugins:
+            ok = True
+            for method in self.exclude:
+                if hasattr(plugin, method):
+                    ok = False
+                    self.excluded.append(plugin)
+                    break
+            if ok:
+                allow.append(plugin)
+        self.plugins = allow
+
+    
Index: /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/failuredetail.py
===================================================================
--- /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/failuredetail.py (revision 3)
+++ /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/failuredetail.py (revision 3)
@@ -0,0 +1,43 @@
+"""
+This plugin provides assert introspection. When the plugin is enabled
+and a test failure occurs, the traceback is displayed with extra context
+around the line in which the exception was raised. Simple variable 
+substitution is also performed in the context output to provide more
+debugging information.
+"""
+    
+from nose.plugins import Plugin
+from nose.inspector import inspect_traceback
+
+class FailureDetail(Plugin):
+    """
+    Plugin that provides extra information in tracebacks of test failures.
+    """
+    score = 600 # before capture
+    
+    def options(self, parser, env):
+        """Register commmandline options.
+        """
+        parser.add_option(
+            "-d", "--detailed-errors", "--failure-detail",
+            action="store_true",
+            default=env.get('NOSE_DETAILED_ERRORS'),
+            dest="detailedErrors", help="Add detail to error"
+            " output by attempting to evaluate failed"
+            " asserts [NOSE_DETAILED_ERRORS]")
+
+    def configure(self, options, conf):
+        """Configure plugin.
+        """
+        if not self.can_configure:
+            return
+        self.enabled = options.detailedErrors
+        self.conf = conf
+
+    def formatFailure(self, test, err):
+        """Add detail from traceback inspection to error message of a failure.
+        """
+        ec, ev, tb = err
+        tbinfo = inspect_traceback(tb)
+        test.tbinfo = tbinfo
+        return (ec, '\n'.join([str(ev), tbinfo]), tb)
Index: /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/base.py
===================================================================
--- /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/base.py (revision 3)
+++ /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/base.py (revision 3)
@@ -0,0 +1,728 @@
+import os
+import textwrap
+from optparse import OptionConflictError
+from warnings import warn
+from nose.util import tolist
+
+class Plugin(object):
+    """Base class for nose plugins. It's recommended but not *necessary* to
+    subclass this class to create a plugin, but all plugins *must* implement
+    `options(self, parser, env)` and `configure(self, options, conf)`, and
+    must have the attributes `enabled`, `name` and `score`.  The `name`
+    attribute may contain hyphens ('-').
+
+    Plugins should not be enabled by default.
+
+    Subclassing Plugin (and calling the superclass methods in
+    __init__, configure, and options, if you override them) will give
+    your plugin some friendly default behavior:
+
+    * A --with-$name option will be added to the command line interface
+      to enable the plugin, and a corresponding environment variable
+      will be used as the default value. The plugin class's docstring
+      will be used as the help for this option.
+    * The plugin will not be enabled unless this option is selected by
+      the user.
+    """
+    can_configure = False
+    enabled = False
+    enableOpt = None
+    name = None
+    score = 100
+
+    def __init__(self):
+        if self.name is None:
+            self.name = self.__class__.__name__.lower()
+        if self.enableOpt is None:
+            self.enableOpt = "enable_plugin_%s" % self.name.replace('-', '_')
+
+    def addOptions(self, parser, env=None):
+        """Add command-line options for this plugin.
+
+        The base plugin class adds --with-$name by default, used to enable the
+        plugin.
+
+        .. warning :: Don't implement addOptions unless you want to override
+                      all default option handling behavior, including
+                      warnings for conflicting options. Implement
+                      :meth:`options
+                      <nose.plugins.base.IPluginInterface.options>`
+                      instead.
+        """
+        self.add_options(parser, env)
+
+    def add_options(self, parser, env=None):
+        """Non-camel-case version of func name for backwards compatibility.
+
+        .. warning ::
+
+           DEPRECATED: Do not use this method,
+           use :meth:`options <nose.plugins.base.IPluginInterface.options>`
+           instead.
+
+        """
+        # FIXME raise deprecation warning if wasn't called by wrapper
+        if env is None:
+            env = os.environ
+        try:
+            self.options(parser, env)
+            self.can_configure = True
+        except OptionConflictError, e:
+            warn("Plugin %s has conflicting option string: %s and will "
+                 "be disabled" % (self, e), RuntimeWarning)
+            self.enabled = False
+            self.can_configure = False
+
+    def options(self, parser, env):
+        """Register commandline options.
+        
+        Implement this method for normal options behavior with protection from
+        OptionConflictErrors. If you override this method and want the default
+        --with-$name option to be registered, be sure to call super().
+        """
+        env_opt = 'NOSE_WITH_%s' % self.name.upper()
+        env_opt = env_opt.replace('-', '_')
+        parser.add_option("--with-%s" % self.name,
+                          action="store_true",
+                          dest=self.enableOpt,
+                          default=env.get(env_opt),
+                          help="Enable plugin %s: %s [%s]" %
+                          (self.__class__.__name__, self.help(), env_opt))
+
+    def configure(self, options, conf):
+        """Configure the plugin and system, based on selected options.
+
+        The base plugin class sets the plugin to enabled if the enable option
+        for the plugin (self.enableOpt) is true.
+        """
+        if not self.can_configure:
+            return
+        self.conf = conf
+        if hasattr(options, self.enableOpt):
+            self.enabled = getattr(options, self.enableOpt)
+
+    def help(self):
+        """Return help for this plugin. This will be output as the help
+        section of the --with-$name option that enables the plugin.
+        """
+        if self.__class__.__doc__:
+            # doc sections are often indented; compress the spaces
+            return textwrap.dedent(self.__class__.__doc__)
+        return "(no help available)"
+
+    # Compatiblity shim
+    def tolist(self, val):
+        warn("Plugin.tolist is deprecated. Use nose.util.tolist instead",
+             DeprecationWarning)
+        return tolist(val)
+
+
+class IPluginInterface(object):
+    """
+    IPluginInteface describes the plugin API. Do not subclass or use this
+    class directly.
+    """
+    def __new__(cls, *arg, **kw):
+        raise TypeError("IPluginInterface class is for documentation only")
+
+    def addOptions(self, parser, env):
+        """Called to allow plugin to register command-line options with the
+        parser. DO NOT return a value from this method unless you want to stop
+        all other plugins from setting their options.
+
+        .. warning ::
+
+           DEPRECATED -- implement
+           :meth:`options <nose.plugins.base.IPluginInterface.options>` instead.
+        """
+        pass
+    add_options = addOptions
+    add_options.deprecated = True
+
+    def addDeprecated(self, test):
+        """Called when a deprecated test is seen. DO NOT return a value
+        unless you want to stop other plugins from seeing the deprecated
+        test.
+
+        .. warning :: DEPRECATED -- check error class in addError instead
+        """
+        pass
+    addDeprecated.deprecated = True
+
+    def addError(self, test, err):
+        """Called when a test raises an uncaught exception. DO NOT return a
+        value unless you want to stop other plugins from seeing that the
+        test has raised an error.
+
+        :param test: the test case
+        :type test: :class:`nose.case.Test`            
+        :param err: sys.exc_info() tuple
+        :type err: 3-tuple
+        """
+        pass
+    addError.changed = True
+
+    def addFailure(self, test, err):
+        """Called when a test fails. DO NOT return a value unless you
+        want to stop other plugins from seeing that the test has failed.
+
+        :param test: the test case
+        :type test: :class:`nose.case.Test`
+        :param err: 3-tuple
+        :type err: sys.exc_info() tuple
+        """
+        pass
+    addFailure.changed = True
+
+    def addSkip(self, test):
+        """Called when a test is skipped. DO NOT return a value unless
+        you want to stop other plugins from seeing the skipped test.
+
+        .. warning:: DEPRECATED -- check error class in addError instead
+        """
+        pass
+    addSkip.deprecated = True
+
+    def addSuccess(self, test):
+        """Called when a test passes. DO NOT return a value unless you
+        want to stop other plugins from seeing the passing test.
+
+        :param test: the test case
+        :type test: :class:`nose.case.Test`
+        """
+        pass
+    addSuccess.changed = True
+
+    def afterContext(self):
+        """Called after a context (generally a module) has been
+        lazy-loaded, imported, setup, had its tests loaded and
+        executed, and torn down.
+        """
+        pass
+    afterContext._new = True
+
+    def afterDirectory(self, path):
+        """Called after all tests have been loaded from directory at path
+        and run.
+
+        :param path: the directory that has finished processing
+        :type path: string
+        """
+        pass
+    afterDirectory._new = True
+
+    def afterImport(self, filename, module):
+        """Called after module is imported from filename. afterImport
+        is called even if the import failed.
+
+        :param filename: The file that was loaded
+        :type filename: string
+        :param filename: The name of the module
+        :type module: string
+        """
+        pass
+    afterImport._new = True
+
+    def afterTest(self, test):
+        """Called after the test has been run and the result recorded
+        (after stopTest).
+
+        :param test: the test case
+        :type test: :class:`nose.case.Test`
+        """
+        pass
+    afterTest._new = True
+
+    def beforeContext(self):
+        """Called before a context (generally a module) is
+        examined. Because the context is not yet loaded, plugins don't
+        get to know what the context is; so any context operations
+        should use a stack that is pushed in `beforeContext` and popped
+        in `afterContext` to ensure they operate symmetrically.
+
+        `beforeContext` and `afterContext` are mainly useful for tracking
+        and restoring global state around possible changes from within a
+        context, whatever the context may be. If you need to operate on
+        contexts themselves, see `startContext` and `stopContext`, which
+        are passed the context in question, but are called after
+        it has been loaded (imported in the module case).
+        """
+        pass
+    beforeContext._new = True
+
+    def beforeDirectory(self, path):
+        """Called before tests are loaded from directory at path.
+
+        :param path: the directory that is about to be processed
+        """
+        pass
+    beforeDirectory._new = True
+
+    def beforeImport(self, filename, module):
+        """Called before module is imported from filename.
+
+        :param filename: The file that will be loaded
+        :param module: The name of the module found in file
+        :type module: string
+        """
+    beforeImport._new = True
+
+    def beforeTest(self, test):
+        """Called before the test is run (before startTest).
+
+        :param test: the test case
+        :type test: :class:`nose.case.Test`
+        """
+        pass
+    beforeTest._new = True
+ 
+    def begin(self):
+        """Called before any tests are collected or run. Use this to
+        perform any setup needed before testing begins.
+        """
+        pass
+
+    def configure(self, options, conf):
+        """Called after the command line has been parsed, with the
+        parsed options and the config container. Here, implement any
+        config storage or changes to state or operation that are set
+        by command line options.
+
+        DO NOT return a value from this method unless you want to
+        stop all other plugins from being configured.
+        """
+        pass
+
+    def finalize(self, result):
+        """Called after all report output, including output from all
+        plugins, has been sent to the stream. Use this to print final
+        test results or perform final cleanup. Return None to allow
+        other plugins to continue printing, or any other value to stop
+        them.
+
+        :param result: test result object
+        
+        .. Note:: When tests are run under a test runner other than
+           :class:`nose.core.TextTestRunner`, such as
+           via ``python setup.py test``, this method may be called
+           **before** the default report output is sent.
+        """
+        pass
+
+    def describeTest(self, test):
+        """Return a test description.
+
+        Called by :meth:`nose.case.Test.shortDescription`.
+
+        :param test: the test case
+        :type test: :class:`nose.case.Test`
+        """
+        pass
+    describeTest._new = True
+
+    def formatError(self, test, err):
+        """Called in result.addError, before plugin.addError. If you
+        want to replace or modify the error tuple, return a new error
+        tuple.
+
+        :param test: the test case
+        :type test: :class:`nose.case.Test`
+        :param err: sys.exc_info() tuple
+        :type err: 3-tuple
+        """
+        pass
+    formatError._new = True
+    formatError.chainable = True
+    # test arg is not chainable
+    formatError.static_args = (True, False)
+
+    def formatFailure(self, test, err):
+        """Called in result.addFailure, before plugin.addFailure. If you
+        want to replace or modify the error tuple, return a new error
+        tuple. Because this method is chainable, you must return the
+        test as well, so you you'll return something like::
+
+          return (test, err)
+
+        :param test: the test case
+        :type test: :class:`nose.case.Test`
+        :param err: sys.exc_info() tuple
+        :type err: 3-tuple
+        """
+        pass
+    formatFailure._new = True
+    formatFailure.chainable = True
+    # test arg is not chainable
+    formatFailure.static_args = (True, False)
+
+    def handleError(self, test, err):
+        """Called on addError. To handle the error yourself and prevent normal
+        error processing, return a true value.
+
+        :param test: the test case
+        :type test: :class:`nose.case.Test`
+        :param err: sys.exc_info() tuple
+        :type err: 3-tuple
+        """
+        pass
+    handleError._new = True
+
+    def handleFailure(self, test, err):
+        """Called on addFailure. To handle the failure yourself and
+        prevent normal failure processing, return a true value.
+
+        :param test: the test case
+        :type test: :class:`nose.case.Test`
+        :param err: sys.exc_info() tuple
+        :type err: 3-tuple
+        """
+        pass
+    handleFailure._new = True
+
+    def loadTestsFromDir(self, path):
+        """Return iterable of tests from a directory. May be a
+        generator.  Each item returned must be a runnable
+        unittest.TestCase (or subclass) instance or suite instance.
+        Return None if your plugin cannot collect any tests from
+        directory.
+
+        :param  path: The path to the directory.
+        """
+        pass
+    loadTestsFromDir.generative = True
+    loadTestsFromDir._new = True
+    
+    def loadTestsFromModule(self, module, path=None):
+        """Return iterable of tests in a module. May be a
+        generator. Each item returned must be a runnable
+        unittest.TestCase (or subclass) instance.
+        Return None if your plugin cannot
+        collect any tests from module.
+
+        :param module: The module object
+        :type module: python module
+        :param path: the path of the module to search, to distinguish from
+            namespace package modules
+
+            .. note::
+
+               NEW. The ``path`` parameter will only be passed by nose 0.11
+               or above.
+        """
+        pass
+    loadTestsFromModule.generative = True
+
+    def loadTestsFromName(self, name, module=None, importPath=None):
+        """Return tests in this file or module. Return None if you are not able
+        to load any tests, or an iterable if you are. May be a
+        generator.
+
+        :param name: The test name. May be a file or module name plus a test
+            callable. Use split_test_name to split into parts. Or it might
+            be some crazy name of your own devising, in which case, do
+            whatever you want.
+        :param module: Module from which the name is to be loaded
+        :param importPath: Path from which file (must be a python module) was
+            found
+
+            .. warning:: DEPRECATED: this argument will NOT be passed.
+        """
+        pass
+    loadTestsFromName.generative = True
+
+    def loadTestsFromNames(self, names, module=None):
+        """Return a tuple of (tests loaded, remaining names). Return
+        None if you are not able to load any tests. Multiple plugins
+        may implement loadTestsFromNames; the remaining name list from
+        each will be passed to the next as input.
+
+        :param names: List of test names.
+        :type names: iterable
+        :param module: Module from which the names are to be loaded
+        """
+        pass
+    loadTestsFromNames._new = True
+    loadTestsFromNames.chainable = True
+
+    def loadTestsFromFile(self, filename):
+        """Return tests in this file. Return None if you are not
+        interested in loading any tests, or an iterable if you are and
+        can load some. May be a generator. *If you are interested in
+        loading tests from the file and encounter no errors, but find
+        no tests, yield False or return [False].*
+
+        .. Note:: This method replaces loadTestsFromPath from the 0.9
+                  API.
+
+        :param filename: The full path to the file or directory.
+        """
+        pass
+    loadTestsFromFile.generative = True
+    loadTestsFromFile._new = True
+
+    def loadTestsFromPath(self, path):
+        """
+        .. warning:: DEPRECATED -- use loadTestsFromFile instead
+        """
+        pass
+    loadTestsFromPath.deprecated = True
+
+    def loadTestsFromTestCase(self, cls):
+        """Return tests in this test case class. Return None if you are
+        not able to load any tests, or an iterable if you are. May be a
+        generator.
+
+        :param cls: The test case class. Must be subclass of
+           :class:`unittest.TestCase`.
+        """
+        pass
+    loadTestsFromTestCase.generative = True
+
+    def loadTestsFromTestClass(self, cls):
+        """Return tests in this test class. Class will *not* be a
+        unittest.TestCase subclass. Return None if you are not able to
+        load any tests, an iterable if you are. May be a generator.
+
+        :param cls: The test case class. Must be **not** be subclass of
+           :class:`unittest.TestCase`.
+        """
+        pass
+    loadTestsFromTestClass._new = True
+    loadTestsFromTestClass.generative = True
+
+    def makeTest(self, obj, parent):
+        """Given an object and its parent, return or yield one or more
+        test cases. Each test must be a unittest.TestCase (or subclass)
+        instance. This is called before default test loading to allow
+        plugins to load an alternate test case or cases for an
+        object. May be a generator.
+
+        :param obj: The object to be made into a test
+        :param parent: The parent of obj (eg, for a method, the class)
+        """
+        pass
+    makeTest._new = True
+    makeTest.generative = True
+
+    def options(self, parser, env):
+        """Called to allow plugin to register command line
+        options with the parser.
+
+        DO NOT return a value from this method unless you want to stop
+        all other plugins from setting their options.
+
+        :param parser: options parser instance
+        :type parser: :class:`ConfigParser.ConfigParser`
+        :param env: environment, default is os.environ
+        """
+        pass
+    options._new = True
+
+    def prepareTest(self, test):
+        """Called before the test is run by the test runner. Please
+        note the article *the* in the previous sentence: prepareTest
+        is called *only once*, and is passed the test case or test
+        suite that the test runner will execute. It is *not* called
+        for each individual test case. If you return a non-None value,
+        that return value will be run as the test. Use this hook to
+        wrap or decorate the test with another function. If you need
+        to modify or wrap individual test cases, use `prepareTestCase`
+        instead.
+
+        :param test: the test case
+        :type test: :class:`nose.case.Test`
+        """
+        pass
+
+    def prepareTestCase(self, test):
+        """Prepare or wrap an individual test case. Called before
+        execution of the test. The test passed here is a
+        nose.case.Test instance; the case to be executed is in the
+        test attribute of the passed case. To modify the test to be
+        run, you should return a callable that takes one argument (the
+        test result object) -- it is recommended that you *do not*
+        side-effect the nose.case.Test instance you have been passed.
+
+        Keep in mind that when you replace the test callable you are
+        replacing the run() method of the test case -- including the
+        exception handling and result calls, etc.
+
+        :param test: the test case
+        :type test: :class:`nose.case.Test`
+        """
+        pass
+    prepareTestCase._new = True
+    
+    def prepareTestLoader(self, loader):
+        """Called before tests are loaded. To replace the test loader,
+        return a test loader. To allow other plugins to process the
+        test loader, return None. Only one plugin may replace the test
+        loader. Only valid when using nose.TestProgram.
+
+        :param loader: :class:`nose.loader.TestLoader` 
+             (or other loader) instance
+        """
+        pass
+    prepareTestLoader._new = True
+
+    def prepareTestResult(self, result):
+        """Called before the first test is run. To use a different
+        test result handler for all tests than the given result,
+        return a test result handler. NOTE however that this handler
+        will only be seen by tests, that is, inside of the result
+        proxy system. The TestRunner and TestProgram -- whether nose's
+        or other -- will continue to see the original result
+        handler. For this reason, it is usually better to monkeypatch
+        the result (for instance, if you want to handle some
+        exceptions in a unique way). Only one plugin may replace the
+        result, but many may monkeypatch it. If you want to
+        monkeypatch and stop other plugins from doing so, monkeypatch
+        and return the patched result.
+
+        :param result: :class:`nose.result.TextTestResult` 
+             (or other result) instance
+        """
+        pass
+    prepareTestResult._new = True
+
+    def prepareTestRunner(self, runner):
+        """Called before tests are run. To replace the test runner,
+        return a test runner. To allow other plugins to process the
+        test runner, return None. Only valid when using nose.TestProgram.
+
+        :param runner: :class:`nose.core.TextTestRunner` 
+             (or other runner) instance
+        """
+        pass
+    prepareTestRunner._new = True
+        
+    def report(self, stream):
+        """Called after all error output has been printed. Print your
+        plugin's report to the provided stream. Return None to allow
+        other plugins to print reports, any other value to stop them.
+
+        :param stream: stream object; send your output here
+        :type stream: file-like object
+        """
+        pass
+
+    def setOutputStream(self, stream):
+        """Called before test output begins. To direct test output to a
+        new stream, return a stream object, which must implement a
+        `write(msg)` method. If you only want to note the stream, not
+        capture or redirect it, then return None.
+
+        :param stream: stream object; send your output here
+        :type stream: file-like object
+        """
+
+    def startContext(self, context):
+        """Called before context setup and the running of tests in the
+        context. Note that tests have already been *loaded* from the
+        context before this call.
+
+        :param context: the context about to be setup. May be a module or
+             class, or any other object that contains tests.
+        """
+        pass
+    startContext._new = True
+    
+    def startTest(self, test):
+        """Called before each test is run. DO NOT return a value unless
+        you want to stop other plugins from seeing the test start.
+
+        :param err: sys.exc_info() tuple
+        :type err: 3-tuple
+        """
+        pass
+
+    def stopContext(self, context):
+        """Called after the tests in a context have run and the
+        context has been torn down.
+
+        :param context: the context about to be setup. May be a module or
+             class, or any other object that contains tests.
+        """
+        pass
+    stopContext._new = True
+    
+    def stopTest(self, test):
+        """Called after each test is run. DO NOT return a value unless
+        you want to stop other plugins from seeing that the test has stopped.
+
+        :param err: sys.exc_info() tuple
+        :type err: 3-tuple
+        """
+        pass
+
+    def testName(self, test):
+        """Return a short test name. Called by `nose.case.Test.__str__`.
+
+        :param err: sys.exc_info() tuple
+        :type err: 3-tuple
+        """
+        pass
+    testName._new = True
+
+    def wantClass(self, cls):
+        """Return true if you want the main test selector to collect
+        tests from this class, false if you don't, and None if you don't
+        care.
+
+        :param cls: The class being examined by the selector
+        """
+        pass
+    
+    def wantDirectory(self, dirname):
+        """Return true if you want test collection to descend into this
+        directory, false if you do not, and None if you don't care.
+
+        :param dirname: Full path to directory being examined by the selector
+        """
+        pass
+    
+    def wantFile(self, file):
+        """Return true if you want to collect tests from this file,
+        false if you do not and None if you don't care.
+
+        Change from 0.9: The optional package parameter is no longer passed.
+
+        :param file: Full path to file being examined by the selector
+        """
+        pass
+    
+    def wantFunction(self, function):
+        """Return true to collect this function as a test, false to
+        prevent it from being collected, and None if you don't care.
+
+        :param function: The function object being examined by the selector
+        """
+        pass
+    
+    def wantMethod(self, method):
+        """Return true to collect this method as a test, false to
+        prevent it from being collected, and None if you don't care.
+        
+        :param method: The method object being examined by the selector
+        :type method: unbound method
+        """    
+        pass
+    
+    def wantModule(self, module):
+        """Return true if you want to collection to descend into this
+        module, false to prevent the collector from descending into the
+        module, and None if you don't care.
+
+        :param module: The module object being examined by the selector
+        :type module: python module
+        """
+        pass
+    
+    def wantModuleTests(self, module):
+        """
+        .. warning:: DEPRECATED -- this method will not be called, it has
+                     been folded into wantModule.
+        """
+        pass
+    wantModuleTests.deprecated = True
+    
Index: /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/cover.py
===================================================================
--- /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/cover.py (revision 3)
+++ /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/cover.py (revision 3)
@@ -0,0 +1,289 @@
+"""If you have Ned Batchelder's coverage_ module installed, you may activate a
+coverage report with the ``--with-coverage`` switch or NOSE_WITH_COVERAGE
+environment variable. The coverage report will cover any python source module
+imported after the start of the test run, excluding modules that match
+testMatch. If you want to include those modules too, use the ``--cover-tests``
+switch, or set the NOSE_COVER_TESTS environment variable to a true value. To
+restrict the coverage report to modules from a particular package or packages,
+use the ``--cover-packages`` switch or the NOSE_COVER_PACKAGES environment
+variable.
+
+.. _coverage: http://www.nedbatchelder.com/code/modules/coverage.html
+"""
+import logging
+import os
+import sys
+from nose.plugins.base import Plugin
+from nose.util import src, tolist
+
+log =  logging.getLogger(__name__)
+
+COVERAGE_TEMPLATE = '''<html>
+<head>
+%(title)s
+</head>
+<body>
+%(header)s
+<style>
+.coverage pre {float: left; margin: 0px 1em; border: none;
+               padding: 0px; }
+.num pre { margin: 0px }
+.nocov, .nocov pre {background-color: #faa}
+.cov, .cov pre {background-color: #cfc}
+div.coverage div { clear: both; height: 1.1em}
+</style>
+<div class="stats">
+%(stats)s
+</div>
+<div class="coverage">
+%(body)s
+</div>
+</body>
+</html>
+'''
+
+COVERAGE_STATS_TEMPLATE = '''Covered: %(covered)s lines<br/>
+Missed: %(missed)s lines<br/>
+Skipped %(skipped)s lines<br/>
+Percent: %(percent)s %%<br/>
+'''
+
+
+class Coverage(Plugin):
+    """
+    Activate a coverage report using Ned Batchelder's coverage module.
+    """
+    coverTests = False
+    coverPackages = None
+    score = 200
+    status = {}
+
+    def options(self, parser, env):
+        """
+        Add options to command line.
+        """
+        Plugin.options(self, parser, env)
+        parser.add_option("--cover-package", action="append",
+                          default=env.get('NOSE_COVER_PACKAGE'),
+                          metavar="PACKAGE",
+                          dest="cover_packages",
+                          help="Restrict coverage output to selected packages "
+                          "[NOSE_COVER_PACKAGE]")
+        parser.add_option("--cover-erase", action="store_true",
+                          default=env.get('NOSE_COVER_ERASE'),
+                          dest="cover_erase",
+                          help="Erase previously collected coverage "
+                          "statistics before run")
+        parser.add_option("--cover-tests", action="store_true",
+                          dest="cover_tests",
+                          default=env.get('NOSE_COVER_TESTS'),
+                          help="Include test modules in coverage report "
+                          "[NOSE_COVER_TESTS]")
+        parser.add_option("--cover-inclusive", action="store_true",
+                          dest="cover_inclusive",
+                          default=env.get('NOSE_COVER_INCLUSIVE'),
+                          help="Include all python files under working "
+                          "directory in coverage report.  Useful for "
+                          "discovering holes in test coverage if not all "
+                          "files are imported by the test suite. "
+                          "[NOSE_COVER_INCLUSIVE]")
+        parser.add_option("--cover-html", action="store_true",
+                          default=env.get('NOSE_COVER_HTML'),
+                          dest='cover_html',
+                          help="Produce HTML coverage information")
+        parser.add_option('--cover-html-dir', action='store',
+                          default=env.get('NOSE_COVER_HTML_DIR', 'cover'),
+                          dest='cover_html_dir',
+                          metavar='DIR',
+                          help='Produce HTML coverage information in dir')
+
+    def configure(self, options, config):
+        """
+        Configure plugin.
+        """
+        try:
+            self.status.pop('active')
+        except KeyError:
+            pass
+        Plugin.configure(self, options, config)
+        if self.enabled:
+            try:
+                import coverage
+            except ImportError:
+                log.error("Coverage not available: "
+                          "unable to import coverage module")
+                self.enabled = False
+                return
+        self.conf = config
+        self.coverErase = options.cover_erase
+        self.coverTests = options.cover_tests
+        self.coverPackages = []
+        if options.cover_packages:
+            for pkgs in [tolist(x) for x in options.cover_packages]:
+                self.coverPackages.extend(pkgs)
+        self.coverInclusive = options.cover_inclusive
+        if self.coverPackages:
+            log.info("Coverage report will include only packages: %s",
+                     self.coverPackages)
+        self.coverHtmlDir = None
+        if options.cover_html:
+            self.coverHtmlDir = options.cover_html_dir
+            log.debug('Will put HTML coverage report in %s', self.coverHtmlDir)
+        if self.enabled:
+            self.status['active'] = True
+
+    def begin(self):
+        """
+        Begin recording coverage information.
+        """
+        log.debug("Coverage begin")
+        import coverage
+        self.skipModules = sys.modules.keys()[:]
+        if self.coverErase:
+            log.debug("Clearing previously collected coverage statistics")
+            coverage.erase()
+        coverage.exclude('#pragma[: ]+[nN][oO] [cC][oO][vV][eE][rR]')
+        coverage.start()
+
+    def report(self, stream):
+        """
+        Output code coverage report.
+        """
+        log.debug("Coverage report")
+        import coverage
+        coverage.stop()
+        modules = [ module
+                    for name, module in sys.modules.items()
+                    if self.wantModuleCoverage(name, module) ]
+        log.debug("Coverage report will cover modules: %s", modules)
+        coverage.report(modules, file=stream)
+        if self.coverHtmlDir:
+            if not os.path.exists(self.coverHtmlDir):
+                os.makedirs(self.coverHtmlDir)
+            log.debug("Generating HTML coverage report")
+            files = {}
+            for m in modules:
+                if hasattr(m, '__name__') and hasattr(m, '__file__'):
+                    files[m.__name__] = m.__file__
+            coverage.annotate(files.values())
+            global_stats =  {'covered': 0, 'missed': 0, 'skipped': 0}
+            file_list = []
+            for m, f in files.iteritems():
+                if f.endswith('pyc'):
+                    f = f[:-1]
+                coverfile = f+',cover'
+                outfile, stats = self.htmlAnnotate(m, f, coverfile,
+                                                   self.coverHtmlDir)
+                for field in ('covered', 'missed', 'skipped'):
+                    global_stats[field] += stats[field]
+                file_list.append((stats['percent'], m, outfile, stats))
+                os.unlink(coverfile)
+            file_list.sort()
+            global_stats['percent'] = self.computePercent(
+                global_stats['covered'], global_stats['missed'])
+            # Now write out an index file for the coverage HTML
+            index = open(os.path.join(self.coverHtmlDir, 'index.html'), 'w')
+            index.write('<html><head><title>Coverage Index</title></head>'
+                        '<body><p>')
+            index.write(COVERAGE_STATS_TEMPLATE % global_stats)
+            index.write('<table><tr><td>File</td><td>Covered</td><td>Missed'
+                        '</td><td>Skipped</td><td>Percent</td></tr>')
+            for junk, name, outfile, stats in file_list:
+                stats['a'] = '<a href="%s">%s</a>' % (outfile, name)
+                index.write('<tr><td>%(a)s</td><td>%(covered)s</td><td>'
+                            '%(missed)s</td><td>%(skipped)s</td><td>'
+                            '%(percent)s %%</td></tr>' % stats)
+            index.write('</table></p></html')
+            index.close()
+
+    def htmlAnnotate(self, name, file, coverfile, outputDir):
+        log.debug('Name: %s file: %s' % (name, file, ))
+        rows = []
+        data = open(coverfile, 'r').read().split('\n')
+        padding = len(str(len(data)))
+        stats = {'covered': 0, 'missed': 0, 'skipped': 0}
+        for lineno, line in enumerate(data):
+            lineno += 1
+            if line:
+                status = line[0]
+                line = line[2:]
+            else:
+                status = ''
+                line = ''
+            lineno = (' ' * (padding - len(str(lineno)))) + str(lineno)
+            for old, new in (('&', '&amp;'), ('<', '&lt;'), ('>', '&gt;'),
+                             ('"', '&quot;'), ):
+                line = line.replace(old, new)
+            if status == '!':
+                rows.append('<div class="nocov"><span class="num"><pre>'
+                            '%s</pre></span><pre>%s</pre></div>' % (lineno,
+                                                                    line))
+                stats['missed'] += 1
+            elif status == '>':
+                rows.append('<div class="cov"><span class="num"><pre>%s</pre>'
+                            '</span><pre>%s</pre></div>' % (lineno, line))
+                stats['covered'] += 1
+            else:
+                rows.append('<div class="skip"><span class="num"><pre>%s</pre>'
+                            '</span><pre>%s</pre></div>' % (lineno, line))
+                stats['skipped'] += 1
+        stats['percent'] = self.computePercent(stats['covered'],
+                                               stats['missed'])
+        html = COVERAGE_TEMPLATE % {'title': '<title>%s</title>' % name,
+                                    'header': name,
+                                    'body': '\n'.join(rows),
+                                    'stats': COVERAGE_STATS_TEMPLATE % stats,
+                                   }
+        outfilename = name + '.html'
+        outfile = open(os.path.join(outputDir, outfilename), 'w')
+        outfile.write(html)
+        outfile.close()
+        return outfilename, stats
+
+    def computePercent(self, covered, missed):
+        if covered + missed == 0:
+            percent = 1
+        else:
+            percent = covered/(covered+missed+0.0)
+        return int(percent * 100)
+
+    def wantModuleCoverage(self, name, module):
+        if not hasattr(module, '__file__'):
+            log.debug("no coverage of %s: no __file__", name)
+            return False
+        module_file = src(module.__file__)
+        if not module_file or not module_file.endswith('.py'):
+            log.debug("no coverage of %s: not a python file", name)
+            return False
+        if self.coverPackages:
+            for package in self.coverPackages:
+                if (name.startswith(package)
+                    and (self.coverTests
+                         or not self.conf.testMatch.search(name))):
+                    log.debug("coverage for %s", name)
+                    return True
+        if name in self.skipModules:
+            log.debug("no coverage for %s: loaded before coverage start",
+                      name)
+            return False
+        if self.conf.testMatch.search(name) and not self.coverTests:
+            log.debug("no coverage for %s: is a test", name)
+            return False
+        # accept any package that passed the previous tests, unless
+        # coverPackages is on -- in that case, if we wanted this
+        # module, we would have already returned True
+        return not self.coverPackages
+
+    def wantFile(self, file, package=None):
+        """If inclusive coverage enabled, return true for all source files
+        in wanted packages.
+        """
+        if self.coverInclusive:
+            if file.endswith(".py"):
+                if package and self.coverPackages:
+                    for want in self.coverPackages:
+                        if package.startswith(want):
+                            return True
+                else:
+                    return True
+        return None
Index: /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/errorclass.py
===================================================================
--- /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/errorclass.py (revision 3)
+++ /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/errorclass.py (revision 3)
@@ -0,0 +1,189 @@
+"""
+ErrorClass Plugins
+------------------
+
+ErrorClass plugins provide an easy way to add support for custom
+handling of particular classes of exceptions.
+
+An ErrorClass plugin defines one or more ErrorClasses and how each is
+handled and reported on. Each error class is stored in a different
+attribute on the result, and reported separately. Each error class must
+indicate the exceptions that fall under that class, the label to use
+for reporting, and whether exceptions of the class should be
+considered as failures for the whole test run.
+
+ErrorClasses use a declarative syntax. Assign an ErrorClass to the
+attribute you wish to add to the result object, defining the
+exceptions, label and isfailure attributes. For example, to declare an
+ErrorClassPlugin that defines TodoErrors (and subclasses of TodoError)
+as an error class with the label 'TODO' that is considered a failure,
+do this:
+
+    >>> class Todo(Exception):
+    ...     pass
+    >>> class TodoError(ErrorClassPlugin):
+    ...     todo = ErrorClass(Todo, label='TODO', isfailure=True)
+
+The MetaErrorClass metaclass translates the ErrorClass declarations
+into the tuples used by the error handling and reporting functions in
+the result. This is an internal format and subject to change; you
+should always use the declarative syntax for attaching ErrorClasses to
+an ErrorClass plugin.
+    
+    >>> TodoError.errorClasses # doctest: +ELLIPSIS
+    ((<class ...Todo...>, ('todo', 'TODO', True)),)
+
+Let's see the plugin in action. First some boilerplate.
+
+    >>> import sys
+    >>> import unittest
+    >>> buf = unittest._WritelnDecorator(sys.stdout)
+
+Now define a test case that raises a Todo.
+
+    >>> class TestTodo(unittest.TestCase):
+    ...     def runTest(self):
+    ...         raise Todo("I need to test something")
+    >>> case = TestTodo()
+
+Prepare the result using our plugin. Normally this happens during the
+course of test execution within nose -- you won't be doing this
+yourself. For the purposes of this testing document, I'm stepping
+through the internal process of nose so you can see what happens at
+each step.
+
+    >>> plugin = TodoError()
+    >>> result = unittest._TextTestResult(stream=buf,
+    ...                                   descriptions=0, verbosity=2)
+    >>> plugin.prepareTestResult(result)
+
+Now run the test. TODO is printed.
+
+    >>> case(result) # doctest: +ELLIPSIS
+    runTest (....TestTodo) ... TODO: I need to test something
+
+Errors and failures are empty, but todo has our test:
+
+    >>> result.errors
+    []
+    >>> result.failures
+    []
+    >>> result.todo # doctest: +ELLIPSIS
+    [(<....TestTodo testMethod=runTest>, '...Todo: I need to test something\\n')]
+    >>> result.printErrors() # doctest: +ELLIPSIS
+    <BLANKLINE>
+    ======================================================================
+    TODO: runTest (....TestTodo)
+    ----------------------------------------------------------------------
+    Traceback (most recent call last):
+    ...
+    Todo: I need to test something
+    <BLANKLINE>
+
+Since we defined a Todo as a failure, the run was not successful.
+
+    >>> result.wasSuccessful()
+    False
+"""
+
+from new import instancemethod
+from nose.plugins.base import Plugin
+from nose.result import TextTestResult
+from nose.util import isclass
+
+class MetaErrorClass(type):
+    """Metaclass for ErrorClassPlugins that allows error classes to be
+    set up in a declarative manner.
+    """
+    def __init__(self, name, bases, attr):
+        errorClasses = []
+        for name, detail in attr.items():
+            if isinstance(detail, ErrorClass):
+                attr.pop(name)
+                for cls in detail:
+                    errorClasses.append(
+                        (cls, (name, detail.label, detail.isfailure)))
+        super(MetaErrorClass, self).__init__(name, bases, attr)
+        self.errorClasses = tuple(errorClasses)
+
+
+class ErrorClass(object):
+    def __init__(self, *errorClasses, **kw):
+        self.errorClasses = errorClasses
+        try:
+            for key in ('label', 'isfailure'):
+                setattr(self, key, kw.pop(key))
+        except KeyError:
+            raise TypeError("%r is a required named argument for ErrorClass"
+                            % key)
+
+    def __iter__(self):
+        return iter(self.errorClasses)
+
+
+class ErrorClassPlugin(Plugin):
+    """
+    Base class for ErrorClass plugins. Subclass this class and declare the
+    exceptions that you wish to handle as attributes of the subclass.
+    """
+    __metaclass__ = MetaErrorClass
+    score = 1000
+    errorClasses = ()
+
+    def addError(self, test, err):
+        err_cls, a, b = err
+        if not isclass(err_cls):
+            return
+        classes = [e[0] for e in self.errorClasses]
+        if filter(lambda c: issubclass(err_cls, c), classes):
+            return True
+
+    def prepareTestResult(self, result):
+        if not hasattr(result, 'errorClasses'):
+            self.patchResult(result)
+        for cls, (storage_attr, label, isfail) in self.errorClasses:
+            if cls not in result.errorClasses:
+                storage = getattr(result, storage_attr, [])
+                setattr(result, storage_attr, storage)
+                result.errorClasses[cls] = (storage, label, isfail)
+
+    def patchResult(self, result):
+        result._orig_addError, result.addError = \
+            result.addError, add_error_patch(result)
+        result._orig_wasSuccessful, result.wasSuccessful = \
+            result.wasSuccessful, wassuccessful_patch(result)
+        if hasattr(result, 'printErrors'):
+            result._orig_printErrors, result.printErrors = \
+                result.printErrors, print_errors_patch(result)
+        result.errorClasses = {}
+
+
+def add_error_patch(result):
+    """Create a new addError method to patch into a result instance
+    that recognizes the errorClasses attribute and deals with
+    errorclasses correctly.
+    """
+    return instancemethod(
+        TextTestResult.addError.im_func, result, result.__class__)
+
+
+def print_errors_patch(result):
+    """Create a new printErrors method that prints errorClasses items
+    as well.
+    """
+    return instancemethod(
+        TextTestResult.printErrors.im_func, result, result.__class__)
+
+
+def wassuccessful_patch(result):
+    """Create a new wasSuccessful method that checks errorClasses for
+    exceptions that were put into other slots than error or failure
+    but that still count as not success.
+    """
+    return instancemethod(
+        TextTestResult.wasSuccessful.im_func, result, result.__class__)
+
+    
+if __name__ == '__main__':
+    import doctest
+    doctest.testmod()
Index: /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/collect.py
===================================================================
--- /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/collect.py (revision 3)
+++ /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/collect.py (revision 3)
@@ -0,0 +1,94 @@
+"""
+This plugin bypasses the actual execution of tests, and instead just collects
+test names. Fixtures are also bypassed, so running nosetests with the 
+collection plugin enabled should be very quick.
+
+This plugin is useful in combination with the testid plugin (``--with-id``).
+Run both together to get an indexed list of all tests, which will enable you to
+run individual tests by index number.
+
+This plugin is also useful for counting tests in a test suite, and making
+people watching your demo think all of your tests pass.
+"""
+from nose.plugins.base import Plugin
+from nose.case import Test
+import logging
+import unittest
+
+log = logging.getLogger(__name__)
+
+
+class CollectOnly(Plugin):
+    """
+    Collect and output test names only, don't run any tests.
+    """
+    name = "collect-only"
+    enableOpt = 'collect_only'
+
+    def options(self, parser, env):
+        """Register commandline options.
+        """
+        parser.add_option('--collect-only',
+                          action='store_true',
+                          dest=self.enableOpt,
+                          default=env.get('NOSE_COLLECT_ONLY'),
+                          help="Enable collect-only: %s [COLLECT_ONLY]" %
+                          (self.help()))
+
+    def prepareTestLoader(self, loader):
+        """Install collect-only suite class in TestLoader.
+        """
+        # Disable context awareness
+        log.debug("Preparing test loader")
+        loader.suiteClass = TestSuiteFactory(self.conf)
+
+    def prepareTestCase(self, test):
+        """Replace actual test with dummy that always passes.
+        """
+        # Return something that always passes
+        log.debug("Preparing test case %s", test)
+        if not isinstance(test, Test):
+            return
+        def run(result):
+            # We need to make these plugin calls because there won't be
+            # a result proxy, due to using a stripped-down test suite
+            self.conf.plugins.startTest(test)
+            result.startTest(test)
+            self.conf.plugins.addSuccess(test)
+            result.addSuccess(test)
+            self.conf.plugins.stopTest(test)
+            result.stopTest(test)
+        return run
+
+
+class TestSuiteFactory:
+    """
+    Factory for producing configured test suites.
+    """
+    def __init__(self, conf):
+        self.conf = conf
+
+    def __call__(self, tests=(), **kw):
+        return TestSuite(tests, conf=self.conf)
+
+
+class TestSuite(unittest.TestSuite):
+    """
+    Basic test suite that bypasses most proxy and plugin calls, but does
+    wrap tests in a nose.case.Test so prepareTestCase will be called.
+    """
+    def __init__(self, tests=(), conf=None):
+        self.conf = conf
+        # Exec lazy suites: makes discovery depth-first
+        if callable(tests):
+            tests = tests()
+        log.debug("TestSuite(%r)", tests)
+        unittest.TestSuite.__init__(self, tests)
+
+    def addTest(self, test):
+        log.debug("Add test %s", test)
+        if isinstance(test, unittest.TestSuite):
+            self._tests.append(test)
+        else:
+            self._tests.append(Test(test, config=self.conf))
+
Index: /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/attrib.py
===================================================================
--- /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/attrib.py (revision 3)
+++ /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/attrib.py (revision 3)
@@ -0,0 +1,288 @@
+"""Attribute selector plugin.
+
+Oftentimes when testing you will want to select tests based on
+criteria rather then simply by filename. For example, you might want
+to run all tests except for the slow ones. You can do this with the
+Attribute selector plugin by setting attributes on your test methods.
+Here is an example:
+
+.. code-block:: python
+
+    def test_big_download():
+        import urllib
+        # commence slowness...
+
+    test_big_download.slow = 1
+
+Once you've assigned an attribute ``slow = 1`` you can exclude that
+test and all other tests having the slow attribute by running ::
+
+    $ nosetests -a '!slow'
+
+There is also a decorator available for you that will set attributes.
+Here's how to set ``slow=1`` like above with the decorator:
+
+.. code-block:: python
+
+    from nose.plugins.attrib import attr
+    @attr('slow')
+    def test_big_download():
+        import urllib
+        # commence slowness...
+
+And here's how to set an attribute with a specific value:
+
+.. code-block:: python
+
+    from nose.plugins.attrib import attr
+    @attr(speed='slow')
+    def test_big_download():
+        import urllib
+        # commence slowness...
+
+This test could be run with ::
+
+    $ nosetests -a speed=slow
+
+Below is a reference to the different syntaxes available.
+
+Simple syntax
+-------------
+
+Examples of using the ``-a`` and ``--attr`` options:
+
+* ``nosetests -a status=stable``
+   Only runs tests with attribute "status" having value "stable"
+
+* ``nosetests -a priority=2,status=stable``
+   Runs tests having both attributes and values
+
+* ``nosetests -a priority=2 -a slow``
+   Runs tests that match either attribute
+
+* ``nosetests -a tags=http``
+   If a test's ``tags`` attribute was a list and it contained the value
+   ``http`` then it would be run
+
+* ``nosetests -a slow``
+   Runs tests with the attribute ``slow`` if its value does not equal False
+   (False, [], "", etc...)
+
+* ``nosetests -a '!slow'``
+   Runs tests that do NOT have the attribute ``slow`` or have a ``slow``
+   attribute that is equal to False
+   **NOTE**:
+   if your shell (like bash) interprets '!' as a special character make sure to
+   put single quotes around it.
+
+Expression Evaluation
+---------------------
+
+Examples using the ``-A`` and ``--eval-attr`` options:
+
+* ``nosetests -A "not slow"``
+  Evaluates the Python expression "not slow" and runs the test if True
+
+* ``nosetests -A "(priority > 5) and not slow"``
+  Evaluates a complex Python expression and runs the test if True
+
+"""
+import logging
+import os
+import sys
+from inspect import isfunction
+from nose.plugins.base import Plugin
+from nose.util import tolist
+
+log = logging.getLogger('nose.plugins.attrib')
+compat_24 = sys.version_info >= (2, 4)
+
+def attr(*args, **kwargs):
+    """Decorator that adds attributes to objects
+    for use with the Attribute (-a) plugin.
+    """
+    def wrap(func):
+        for name in args:
+            # these are just True flags:
+            setattr(func, name, 1)
+        func.__dict__.update(kwargs)
+        return func
+    return wrap
+
+class ContextHelper:
+    """Returns default values for dictionary lookups."""
+    def __init__(self, obj):
+        self.obj = obj
+
+    def __getitem__(self, name):
+        return self.obj.get(name, False)
+
+
+class AttributeGetter:
+    """Helper for looking up attributes
+
+    First we check the method, and if the attribute is not present,
+    we check the method's class.
+    """
+    missing = object()
+
+    def __init__(self, cls, method):
+        self.cls = cls
+        self.method = method
+
+    def get(self, name, default=None):
+        log.debug('Get %s from %s.%s', name, self.cls, self.method)
+        val = self.method.__dict__.get(name, self.missing)
+        if val is self.missing:
+            log.debug('No attribute %s in method, getting from class',
+                      name)
+            val = getattr(self.cls, name, default)
+            log.debug('Class attribute %s value: %s', name, val)
+        return val
+
+class AttributeSelector(Plugin):
+    """Selects test cases to be run based on their attributes.
+    """
+
+    def __init__(self):
+        Plugin.__init__(self)
+        self.attribs = []
+
+    def options(self, parser, env):
+        """Register command line options"""
+        parser.add_option("-a", "--attr",
+                          dest="attr", action="append",
+                          default=env.get('NOSE_ATTR'),
+                          metavar="ATTR",
+                          help="Run only tests that have attributes "
+                          "specified by ATTR [NOSE_ATTR]")
+        # disable in < 2.4: eval can't take needed args
+        if compat_24:
+            parser.add_option("-A", "--eval-attr",
+                              dest="eval_attr", metavar="EXPR", action="append",
+                              default=env.get('NOSE_EVAL_ATTR'),
+                              help="Run only tests for whose attributes "
+                              "the Python expression EXPR evaluates "
+                              "to True [NOSE_EVAL_ATTR]")
+
+    def configure(self, options, config):
+        """Configure the plugin and system, based on selected options.
+
+        attr and eval_attr may each be lists.
+
+        self.attribs will be a list of lists of tuples. In that list, each
+        list is a group of attributes, all of which must match for the rule to
+        match.
+        """
+        self.attribs = []
+
+        # handle python eval-expression parameter
+        if compat_24 and options.eval_attr:
+            eval_attr = tolist(options.eval_attr)
+            for attr in eval_attr:
+                # "<python expression>"
+                # -> eval(expr) in attribute context must be True
+                def eval_in_context(expr, attribs):
+                    return eval(expr, None, ContextHelper(attribs))
+                self.attribs.append([(attr, eval_in_context)])
+
+        # attribute requirements are a comma separated list of
+        # 'key=value' pairs
+        if options.attr:
+            std_attr = tolist(options.attr)
+            for attr in std_attr:
+                # all attributes within an attribute group must match
+                attr_group = []
+                for attrib in attr.strip().split(","):
+                    # don't die on trailing comma
+                    if not attrib:
+                        continue
+                    items = attrib.split("=", 1)
+                    if len(items) > 1:
+                        # "name=value"
+                        # -> 'str(obj.name) == value' must be True
+                        key, value = items
+                    else:
+                        key = items[0]
+                        if key[0] == "!":
+                            # "!name"
+                            # 'bool(obj.name)' must be False
+                            key = key[1:]
+                            value = False
+                        else:
+                            # "name"
+                            # -> 'bool(obj.name)' must be True
+                            value = True
+                    attr_group.append((key, value))
+                self.attribs.append(attr_group)
+        if self.attribs:
+            self.enabled = True
+
+    def validateAttrib(self, attribs):
+        # TODO: is there a need for case-sensitive value comparison?
+        # within each group, all must match for the group to match
+        # if any group matches, then the attribute set as a whole
+        # has matched
+        any = False
+        for group in self.attribs:
+            match = True
+            for key, value in group:
+                obj_value = attribs.get(key)
+                if callable(value):
+                    if not value(key, attribs):
+                        match = False
+                        break
+                elif value is True:
+                    # value must exist and be True
+                    if not bool(obj_value):
+                        match = False
+                        break
+                elif value is False:
+                    # value must not exist or be False
+                    if bool(obj_value):
+                        match = False
+                        break
+                elif type(obj_value) in (list, tuple):
+                    # value must be found in the list attribute
+
+                    if not str(value).lower() in [str(x).lower()
+                                                  for x in obj_value]:
+                        match = False
+                        break
+                else:
+                    # value must match, convert to string and compare
+                    if (value != obj_value
+                        and str(value).lower() != str(obj_value).lower()):
+                        match = False
+                        break
+            any = any or match
+        if any:
+            # not True because we don't want to FORCE the selection of the
+            # item, only say that it is acceptable
+            return None
+        return False
+
+    def wantClass(self, cls):
+        """Accept the class if the class or any method is wanted.
+        """
+        cls_attr = cls.__dict__
+        if self.validateAttrib(cls_attr) is not False:
+            return None
+        # Methods in __dict__.values() are functions, oddly enough.
+        methods = filter(isfunction, cls_attr.values())
+        wanted = filter(lambda m: m is not False,
+                        map(self.wantFunction, methods))
+        if wanted:
+            return None
+        return False
+
+    def wantFunction(self, function):
+        """Accept the function if its attributes match.
+        """
+        return self.validateAttrib(function.__dict__)
+
+    def wantMethod(self, method):
+        """Accept the method if its attributes match.
+        """
+        attribs = AttributeGetter(method.im_class, method)
+        return self.validateAttrib(attribs)
Index: /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/debug.py
===================================================================
--- /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/debug.py (revision 3)
+++ /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/plugins/debug.py (revision 3)
@@ -0,0 +1,62 @@
+"""
+This plugin provides ``--pdb`` and ``--pdb-failures`` options. The ``--pdb``
+option will drop the test runner into pdb when it encounters an error. To
+drop into pdb on failure, use ``--pdb-failures``.
+"""
+
+import pdb
+from nose.plugins.base import Plugin
+
+class Pdb(Plugin):
+    """
+    Provides --pdb and --pdb-failures options that cause the test runner to
+    drop into pdb if it encounters an error or failure, respectively.
+    """
+    enabled_for_errors = False
+    enabled_for_failures = False
+    score = 5 # run last, among builtins
+    
+    def options(self, parser, env):
+        """Register commandline options.
+        """
+        parser.add_option(
+            "--pdb", action="store_true", dest="debugErrors",
+            default=env.get('NOSE_PDB', False),
+            help="Drop into debugger on errors")
+        parser.add_option(
+            "--pdb-failures", action="store_true",
+            dest="debugFailures",
+            default=env.get('NOSE_PDB_FAILURES', False),
+            help="Drop into debugger on failures")
+
+    def configure(self, options, conf):
+        """Configure which kinds of exceptions trigger plugin.
+        """
+        self.conf = conf
+        self.enabled = options.debugErrors or options.debugFailures
+        self.enabled_for_errors = options.debugErrors
+        self.enabled_for_failures = options.debugFailures
+
+    def addError(self, test, err):
+        """Enter pdb if configured to debug errors.
+        """
+        if not self.enabled_for_errors:
+            return
+        self.debug(err)
+
+    def addFailure(self, test, err):
+        """Enter pdb if configured to debug failures.
+        """
+        if not self.enabled_for_failures:
+            return
+        self.debug(err)
+
+    def debug(self, err):
+        import sys # FIXME why is this import here?
+        ec, ev, tb = err
+        stdout = sys.stdout
+        sys.stdout = sys.__stdout__
+        try:
+            pdb.post_mortem(tb)
+        finally:
+            sys.stdout = stdout
Index: /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/usage.txt
===================================================================
--- /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/usage.txt (revision 3)
+++ /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/usage.txt (revision 3)
@@ -0,0 +1,108 @@
+nose collects tests automatically from python source files,
+directories and packages found in its working directory (which
+defaults to the current working directory). Any python source file,
+directory or package that matches the testMatch regular expression
+(by default: `(?:^|[\b_\.-])[Tt]est)` will be collected as a test (or
+source for collection of tests). In addition, all other packages
+found in the working directory will be examined for python source files
+or directories that match testMatch. Package discovery descends all
+the way down the tree, so package.tests and package.sub.tests and
+package.sub.sub2.tests will all be collected.
+
+Within a test directory or package, any python source file matching
+testMatch will be examined for test cases. Within a test module,
+functions and classes whose names match testMatch and TestCase
+subclasses with any name will be loaded and executed as tests. Tests
+may use the assert keyword or raise AssertionErrors to indicate test
+failure. TestCase subclasses may do the same or use the various
+TestCase methods available.
+
+Selecting Tests
+---------------
+
+To specify which tests to run, pass test names on the command line:
+
+  %prog only_test_this.py
+  
+Test names specified may be file or module names, and may optionally
+indicate the test case to run by separating the module or file name
+from the test case name with a colon. Filenames may be relative or
+absolute. Examples:
+
+  %prog test.module
+  %prog another.test:TestCase.test_method
+  %prog a.test:TestCase
+  %prog /path/to/test/file.py:test_function
+  
+You may also change the working directory where nose looks for tests
+by using the -w switch:
+
+  %prog -w /path/to/tests
+
+Note, however, that support for multiple -w arguments is now deprecated
+and will be removed in a future release. As of nose 0.10, you can get
+the same behavior by specifying the target directories *without*
+the -w switch:
+
+  %prog /path/to/tests /another/path/to/tests
+
+Further customization of test selection and loading is possible
+through the use of plugins.
+
+Test result output is identical to that of unittest, except for
+the additional features (error classes, and plugin-supplied
+features such as output capture and assert introspection) detailed
+in the options below.
+
+Configuration
+-------------
+
+In addition to passing command-line options, you may also put
+configuration options in a .noserc or nose.cfg file in your home
+directory. These are standard .ini-style config files. Put your
+nosetests configuration in a [nosetests] section. Options are the
+same as on the command line, with the -- prefix removed. For
+options that are simple switches, you must supply a value:
+
+  [nosetests]
+  verbosity=3
+  with-doctest=1
+
+All configuration files that are found will be loaded and their options
+combined.
+
+Using Plugins
+-------------
+
+There are numerous nose plugins available via easy_install and
+elsewhere. To use a plugin, just install it. The plugin will add
+command line options to nosetests. To verify that the plugin is installed,
+run:
+
+  nosetests --plugins
+
+You can add -v or -vv to that command to show more information
+about each plugin.
+
+If you are running nose.main() or nose.run() from a script, you
+can specify a list of plugins to use by passing a list of plugins
+with the plugins keyword argument.
+
+0.9 plugins
+-----------
+
+nose 0.11 can use SOME plugins that were written for nose 0.9. The
+default plugin manager inserts a compatibility wrapper around 0.9
+plugins that adapts the changed plugin api calls. However, plugins
+that access nose internals are likely to fail, especially if they
+attempt to access test case or test suite classes. For example,
+plugins that try to determine if a test passed to startTest is an
+individual test or a suite will fail, partly because suites are no
+longer passed to startTest and partly because it's likely that the
+plugin is trying to find out if the test is an instance of a class
+that no longer exists.
+
+0.10 plugins
+------------
+
+All plugins written for nose 0.10 should work with nose 0.11.
Index: /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/__init__.py
===================================================================
--- /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/__init__.py (revision 3)
+++ /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/__init__.py (revision 3)
@@ -0,0 +1,15 @@
+from nose.core import collector, main, run, run_exit, runmodule
+# backwards compatibility
+from nose.exc import SkipTest, DeprecatedTest
+from nose.tools import with_setup
+
+__author__ = 'Jason Pellerin'
+__versioninfo__ = (0, 11, 1)
+__version__ = '.'.join(map(str, __versioninfo__))
+
+__all__ = [
+    'main', 'run', 'run_exit', 'runmodule', 'with_setup',
+    'SkipTest', 'DeprecatedTest', 'collector'
+    ]
+
+
Index: /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/tools.py
===================================================================
--- /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/tools.py (revision 3)
+++ /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/tools.py (revision 3)
@@ -0,0 +1,194 @@
+"""
+Tools for testing
+-----------------
+
+nose.tools provides a few convenience functions to make writing tests
+easier. You don't have to use them; nothing in the rest of nose depends
+on any of these methods.
+"""
+import re
+import time
+import unittest
+
+
+__all__ = ['ok_', 'eq_', 'make_decorator', 'raises', 'set_trace', 'timed',
+            'with_setup', 'TimeExpired', 'istest', 'nottest']
+
+
+class TimeExpired(AssertionError):
+    pass
+
+
+def ok_(expr, msg=None):
+    """Shorthand for assert. Saves 3 whole characters!
+    """
+    assert expr, msg
+
+
+def eq_(a, b, msg=None):
+    """Shorthand for 'assert a == b, "%r != %r" % (a, b)
+    """
+    assert a == b, msg or "%r != %r" % (a, b)
+
+
+def make_decorator(func):
+    """
+    Wraps a test decorator so as to properly replicate metadata
+    of the decorated function, including nose's additional stuff
+    (namely, setup and teardown).
+    """
+    def decorate(newfunc):
+        if hasattr(func, 'compat_func_name'):
+            name = func.compat_func_name
+        else:
+            name = func.__name__
+        newfunc.__dict__ = func.__dict__
+        newfunc.__doc__ = func.__doc__
+        newfunc.__module__ = func.__module__
+        if not hasattr(newfunc, 'compat_co_firstlineno'):
+            newfunc.compat_co_firstlineno = func.func_code.co_firstlineno
+        try:
+            newfunc.__name__ = name
+        except TypeError:
+            # can't set func name in 2.3
+            newfunc.compat_func_name = name
+        return newfunc
+    return decorate
+
+
+def raises(*exceptions):
+    """Test must raise one of expected exceptions to pass.
+
+    Example use::
+
+      @raises(TypeError, ValueError)
+      def test_raises_type_error():
+          raise TypeError("This test passes")
+
+      @raises(Exception)
+      def test_that_fails_by_passing():
+          pass
+
+    If you want to test many assertions about exceptions in a single test,
+    you may want to use `assert_raises` instead.
+    """
+    valid = ' or '.join([e.__name__ for e in exceptions])
+    def decorate(func):
+        name = func.__name__
+        def newfunc(*arg, **kw):
+            try:
+                func(*arg, **kw)
+            except exceptions:
+                pass
+            except:
+                raise
+            else:
+                message = "%s() did not raise %s" % (name, valid)
+                raise AssertionError(message)
+        newfunc = make_decorator(func)(newfunc)
+        return newfunc
+    return decorate
+
+
+def set_trace():
+    """Call pdb.set_trace in the calling frame, first restoring
+    sys.stdout to the real output stream. Note that sys.stdout is NOT
+    reset to whatever it was before the call once pdb is done!
+    """
+    import pdb
+    import sys
+    stdout = sys.stdout
+    sys.stdout = sys.__stdout__
+    pdb.Pdb().set_trace(sys._getframe().f_back)
+    
+
+def timed(limit):
+    """Test must finish within specified time limit to pass.
+
+    Example use::
+
+      @timed(.1)
+      def test_that_fails():
+          time.sleep(.2)
+    """
+    def decorate(func):
+        def newfunc(*arg, **kw):
+            start = time.time()
+            func(*arg, **kw)
+            end = time.time()
+            if end - start > limit:
+                raise TimeExpired("Time limit (%s) exceeded" % limit)
+        newfunc = make_decorator(func)(newfunc)
+        return newfunc
+    return decorate
+
+
+def with_setup(setup=None, teardown=None):
+    """Decorator to add setup and/or teardown methods to a test function::
+
+      @with_setup(setup, teardown)
+      def test_something():
+          " ... "
+
+    Note that `with_setup` is useful *only* for test functions, not for test
+    methods or inside of TestCase subclasses.
+    """
+    def decorate(func, setup=setup, teardown=teardown):
+        if setup:
+            if hasattr(func, 'setup'):
+                _old_s = func.setup
+                def _s():
+                    setup()
+                    _old_s()
+                func.setup = _s
+            else:
+                func.setup = setup
+        if teardown:
+            if hasattr(func, 'teardown'):
+                _old_t = func.teardown
+                def _t():
+                    _old_t()
+                    teardown()
+                func.teardown = _t
+            else:
+                func.teardown = teardown
+        return func
+    return decorate
+
+
+def istest(func):
+    """Decorator to mark a function or method as a test
+    """
+    func.__test__ = True
+    return func
+
+
+def nottest(func):
+    """Decorator to mark a function or method as *not* a test
+    """
+    func.__test__ = False
+    return func
+
+#
+# Expose assert* from unittest.TestCase
+# - give them pep8 style names
+#
+caps = re.compile('([A-Z])')
+
+def pep8(name):
+    return caps.sub(lambda m: '_' + m.groups()[0].lower(), name)
+
+class Dummy(unittest.TestCase):
+    def nop():
+        pass
+_t = Dummy('nop')
+
+for at in [ at for at in dir(_t)
+            if at.startswith('assert') and not '_' in at ]:
+    pepd = pep8(at)
+    vars()[pepd] = getattr(_t, at)
+    __all__.append(pepd)
+
+del Dummy
+del _t
+del pep8
Index: /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/importer.py
===================================================================
--- /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/importer.py (revision 3)
+++ /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/importer.py (revision 3)
@@ -0,0 +1,154 @@
+"""Implements an importer that looks only in specific path (ignoring
+sys.path), and uses a per-path cache in addition to sys.modules. This is
+necessary because test modules in different directories frequently have the
+same names, which means that the first loaded would mask the rest when using
+the builtin importer.
+"""
+import logging
+import os
+import sys
+from nose.config import Config
+
+from imp import find_module, load_module, acquire_lock, release_lock
+
+log = logging.getLogger(__name__)
+
+class Importer(object):
+    """An importer class that does only path-specific imports. That
+    is, the given module is not searched for on sys.path, but only at
+    the path or in the directory specified.
+    """
+    def __init__(self, config=None):
+        if config is None:
+            config = Config()
+        self.config = config
+
+    def importFromPath(self, path, fqname):
+        """Import a dotted-name package whose tail is at path. In other words,
+        given foo.bar and path/to/foo/bar.py, import foo from path/to/foo then
+        bar from path/to/foo/bar, returning bar.
+        """
+        # find the base dir of the package
+        path_parts = os.path.normpath(os.path.abspath(path)).split(os.sep)
+        name_parts = fqname.split('.')
+        if path_parts[-1].startswith('__init__'):
+            path_parts.pop()
+        path_parts = path_parts[:-(len(name_parts))]
+        dir_path = os.sep.join(path_parts)
+        # then import fqname starting from that dir
+        return self.importFromDir(dir_path, fqname)                
+
+    def importFromDir(self, dir, fqname):
+        """Import a module *only* from path, ignoring sys.path and
+        reloading if the version in sys.modules is not the one we want.
+        """
+        dir = os.path.normpath(os.path.abspath(dir))
+        log.debug("Import %s from %s", fqname, dir)
+
+        # FIXME reimplement local per-dir cache?
+        
+        # special case for __main__
+        if fqname == '__main__':
+            return sys.modules[fqname]
+        
+        if self.config.addPaths:
+            add_path(dir, self.config)
+            
+        path = [dir]
+        parts = fqname.split('.')
+        part_fqname = ''
+        mod = parent = fh = None
+
+        for part in parts:
+            if part_fqname == '':
+                part_fqname = part
+            else:
+                part_fqname = "%s.%s" % (part_fqname, part)
+            try:
+                acquire_lock()
+                log.debug("find module part %s (%s) in %s",
+                          part, part_fqname, path)
+                fh, filename, desc = find_module(part, path)
+                old = sys.modules.get(part_fqname)
+                if old is not None:
+                    # test modules frequently have name overlap; make sure
+                    # we get a fresh copy of anything we are trying to load
+                    # from a new path
+                    log.debug("sys.modules has %s as %s", part_fqname, old)
+                    if (self.sameModule(old, filename)
+                        or (self.config.firstPackageWins and
+                            getattr(old, '__path__', None))):
+                        mod = old
+                    else:
+                        del sys.modules[part_fqname]
+                        mod = load_module(part_fqname, fh, filename, desc)
+                else:
+                    mod = load_module(part_fqname, fh, filename, desc)
+            finally:
+                if fh:
+                    fh.close()
+                release_lock()
+            if parent:
+                setattr(parent, part, mod)
+            if hasattr(mod, '__path__'):
+                path = mod.__path__
+            parent = mod
+        return mod
+
+    def sameModule(self, mod, filename):
+        mod_paths = []
+        if hasattr(mod, '__path__'):
+            for path in mod.__path__:
+                mod_paths.append(os.path.dirname(
+                    os.path.normpath(
+                    os.path.abspath(path))))
+        elif hasattr(mod, '__file__'):
+            mod_paths.append(os.path.dirname(
+                os.path.normpath(
+                os.path.abspath(mod.__file__))))
+        else:
+            # builtin or other module-like object that
+            # doesn't have __file__; must be new
+            return False
+        new_path = os.path.dirname(os.path.normpath(filename))
+        for mod_path in mod_paths:
+            log.debug(
+                "module already loaded? mod: %s new: %s",
+                mod_path, new_path)
+            if mod_path == new_path:
+                return True
+        return False
+
+
+def add_path(path, config=None):
+    """Ensure that the path, or the root of the current package (if
+    path is in a package), is in sys.path.
+    """
+
+    # FIXME add any src-looking dirs seen too... need to get config for that
+    
+    log.debug('Add path %s' % path)    
+    if not path:
+        return []
+    added = []
+    parent = os.path.dirname(path)
+    if (parent
+        and os.path.exists(os.path.join(path, '__init__.py'))):
+        added.extend(add_path(parent, config))
+    elif not path in sys.path:
+        log.debug("insert %s into sys.path", path)
+        sys.path.insert(0, path)
+        added.append(path)
+    if config and config.srcDirs:
+        for dirname in config.srcDirs:
+            dirpath = os.path.join(path, dirname)
+            if os.path.isdir(dirpath):
+                sys.path.insert(0, dirpath)
+                added.append(dirpath)
+    return added
+
+
+def remove_path(path):
+    log.debug('Remove path %s' % path)
+    if path in sys.path:
+        sys.path.remove(path)
Index: /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/commands.py
===================================================================
--- /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/commands.py (revision 3)
+++ /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/commands.py (revision 3)
@@ -0,0 +1,146 @@
+"""
+nosetests setuptools command
+----------------------------
+
+The easiest way to run tests with nose is to use the `nosetests` setuptools
+command::
+
+  python setup.py nosetests
+
+This command has one *major* benefit over the standard `test` command: *all
+nose plugins are supported*.
+
+To configure the `nosetests` command, add a [nosetests] section to your
+setup.cfg. The [nosetests] section can contain any command line arguments that
+nosetests supports. The differences between issuing an option on the command
+line and adding it to setup.cfg are:
+
+* In setup.cfg, the -- prefix must be excluded
+* In setup.cfg, command line flags that take no arguments must be given an
+  argument flag (1, T or TRUE for active, 0, F or FALSE for inactive)
+
+Here's an example [nosetests] setup.cfg section::
+
+  [nosetests]
+  verbosity=1
+  detailed-errors=1
+  with-coverage=1
+  cover-package=nose
+  debug=nose.loader
+  pdb=1
+  pdb-failures=1
+
+If you commonly run nosetests with a large number of options, using
+the nosetests setuptools command and configuring with setup.cfg can
+make running your tests much less tedious. (Note that the same options
+and format supported in setup.cfg are supported in all other config
+files, and the nosetests script will also load config files.)
+
+Another reason to run tests with the command is that the command will
+install packages listed in your `tests_require`, as well as doing a
+complete build of your package before running tests. For packages with
+dependencies or that build C extensions, using the setuptools command
+can be more convenient than building by hand and running the nosetests
+script.
+
+Bootstrapping
+-------------
+
+If you are distributing your project and want users to be able to run tests
+without having to install nose themselves, add nose to the setup_requires
+section of your setup()::
+
+  setup(
+      # ...
+      setup_requires=['nose>=0.11']
+      )
+
+This will direct setuptools to download and activate nose during the setup
+process, making the ``nosetests`` command available.
+
+"""
+try:
+    from setuptools import Command
+except ImportError:
+    Command = nosetests = None
+else:
+    from nose.config import Config, option_blacklist, user_config_files, \
+        flag, _bool
+    from nose.core import TestProgram
+    from nose.plugins import DefaultPluginManager
+
+
+    def get_user_options(parser):
+        """convert a optparse option list into a distutils option tuple list"""
+        opt_list = []
+        for opt in parser.option_list:
+            if opt._long_opts[0][2:] in option_blacklist: 
+                continue
+            long_name = opt._long_opts[0][2:]
+            if opt.action not in ('store_true', 'store_false'):
+                long_name = long_name + "="
+            short_name = None
+            if opt._short_opts:
+                short_name =  opt._short_opts[0][1:]
+            opt_list.append((long_name, short_name, opt.help or ""))
+        return opt_list
+
+
+    class nosetests(Command):
+        description = "Run unit tests using nosetests"
+        __config = Config(files=user_config_files(),
+                          plugins=DefaultPluginManager())
+        __parser = __config.getParser()
+        user_options = get_user_options(__parser)
+
+        def initialize_options(self):
+            """create the member variables, but change hyphens to
+            underscores
+            """
+            
+            self.option_to_cmds = {}
+            for opt in self.__parser.option_list:
+                cmd_name = opt._long_opts[0][2:]
+                option_name = cmd_name.replace('-', '_')
+                self.option_to_cmds[option_name] = cmd_name
+                setattr(self, option_name, None)
+            self.attr  = None
+
+        def finalize_options(self):
+            """nothing to do here"""
+            pass
+
+        def run(self):
+            """ensure tests are capable of being run, then
+            run nose.main with a reconstructed argument list"""
+            self.run_command('egg_info')
+
+            # Build extensions in-place
+            self.reinitialize_command('build_ext', inplace=1)
+            self.run_command('build_ext')
+
+            if self.distribution.install_requires:
+                self.distribution.fetch_build_eggs(
+                    self.distribution.install_requires)
+            if self.distribution.tests_require:
+                self.distribution.fetch_build_eggs(
+                    self.distribution.tests_require)
+
+            argv = ['nosetests'] 
+            for (option_name, cmd_name) in self.option_to_cmds.items():
+                if option_name in option_blacklist:
+                    continue
+                value = getattr(self, option_name)
+                if value is not None:
+                    argv.extend(
+                        self.cfgToArg(option_name.replace('_', '-'), value))
+            TestProgram(argv=argv, config=self.__config)
+
+        def cfgToArg(self, optname, value):
+            argv = []
+            if flag(value):
+                if _bool(value):
+                    argv.append('--' + optname)
+            else:
+                argv.extend(['--' + optname, value])
+            return argv
Index: /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/twistedtools.py
===================================================================
--- /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/twistedtools.py (revision 3)
+++ /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/twistedtools.py (revision 3)
@@ -0,0 +1,165 @@
+"""
+Twisted integration
+-------------------
+
+This module provides a very simple way to integrate your tests with the
+Twisted_ event loop.
+
+You must import this module *before* importing anything from Twisted itself!
+
+Example::
+
+  from nose.twistedtools import reactor, deferred
+  
+  @deferred()
+  def test_resolve():
+      return reactor.resolve("www.python.org")
+
+Or, more realistically::
+
+  @deferred(timeout=5.0)
+  def test_resolve():
+      d = reactor.resolve("www.python.org")
+      def check_ip(ip):
+          assert ip == "67.15.36.43"
+      d.addCallback(check_ip)
+      return d
+
+.. _Twisted: http://twistedmatrix.com/trac/
+"""
+
+import sys
+from Queue import Queue, Empty
+from nose.tools import make_decorator, TimeExpired
+
+__all__ = [
+    'threaded_reactor', 'reactor', 'deferred', 'TimeExpired',
+    'stop_reactor'
+]
+
+_twisted_thread = None
+
+def threaded_reactor():
+    """
+    Start the Twisted reactor in a separate thread, if not already done.
+    Returns the reactor.
+    The thread will automatically be destroyed when all the tests are done.
+    """
+    global _twisted_thread
+    try:
+        from twisted.internet import reactor
+    except ImportError:
+        return None, None
+    if not _twisted_thread:
+        from twisted.python import threadable
+        from threading import Thread
+        _twisted_thread = Thread(target=lambda: reactor.run( \
+                installSignalHandlers=False))
+        _twisted_thread.setDaemon(True)
+        _twisted_thread.start()
+    return reactor, _twisted_thread
+
+# Export global reactor variable, as Twisted does
+reactor, reactor_thread = threaded_reactor()
+
+
+def stop_reactor():
+    """Stop the reactor and join the reactor thread until it stops.
+    Call this function in teardown at the module or package level to
+    reset the twisted system after your tests. You *must* do this if
+    you mix tests using these tools and tests using twisted.trial.
+    """
+    global _twisted_thread
+    reactor.stop()
+    reactor_thread.join()
+    _twisted_thread = None
+
+
+def deferred(timeout=None):
+    """
+    By wrapping a test function with this decorator, you can return a
+    twisted Deferred and the test will wait for the deferred to be triggered.
+    The whole test function will run inside the Twisted event loop.
+
+    The optional timeout parameter specifies the maximum duration of the test.
+    The difference with timed() is that timed() will still wait for the test
+    to end, while deferred() will stop the test when its timeout has expired.
+    The latter is more desireable when dealing with network tests, because
+    the result may actually never arrive.
+
+    If the callback is triggered, the test has passed.
+    If the errback is triggered or the timeout expires, the test has failed.
+
+    Example::
+    
+        @deferred(timeout=5.0)
+        def test_resolve():
+            return reactor.resolve("nose.python-hosting.com")
+
+    Attention! If you combine this decorator with other decorators (like
+    "raises"), deferred() must be called *first*!
+
+    In other words, this is good::
+        
+        @raises(DNSLookupError)
+        @deferred()
+        def test_error():
+            return reactor.resolve("xxxjhjhj.biz")
+
+    and this is bad::
+        
+        @deferred()
+        @raises(DNSLookupError)
+        def test_error():
+            return reactor.resolve("xxxjhjhj.biz")
+    """
+    reactor, reactor_thread = threaded_reactor()
+    if reactor is None:
+        raise ImportError("twisted is not available or could not be imported")
+    # Check for common syntax mistake
+    # (otherwise, tests can be silently ignored
+    # if one writes "@deferred" instead of "@deferred()")
+    try:
+        timeout is None or timeout + 0
+    except TypeError:
+        raise TypeError("'timeout' argument must be a number or None")
+
+    def decorate(func):
+        def wrapper(*args, **kargs):
+            q = Queue()
+            def callback(value):
+                q.put(None)
+            def errback(failure):
+                # Retrieve and save full exception info
+                try:
+                    failure.raiseException()
+                except:
+                    q.put(sys.exc_info())
+            def g():
+                try:
+                    d = func(*args, **kargs)
+                    try:
+                        d.addCallbacks(callback, errback)
+                    # Check for a common mistake and display a nice error
+                    # message
+                    except AttributeError:
+                        raise TypeError("you must return a twisted Deferred "
+                                        "from your test case!")
+                # Catch exceptions raised in the test body (from the
+                # Twisted thread)
+                except:
+                    q.put(sys.exc_info())
+            reactor.callFromThread(g)
+            try:
+                error = q.get(timeout=timeout)
+            except Empty:
+                raise TimeExpired("timeout expired before end of test (%f s.)"
+                                  % timeout)
+            # Re-raise all exceptions
+            if error is not None:
+                exc_type, exc_value, tb = error
+                raise exc_type, exc_value, tb
+        wrapper = make_decorator(func)(wrapper)
+        return wrapper
+    return decorate
+
Index: /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/config.py
===================================================================
--- /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/config.py (revision 3)
+++ /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/config.py (revision 3)
@@ -0,0 +1,571 @@
+import logging
+import optparse
+import os
+import re
+import sys
+import ConfigParser
+from optparse import OptionParser
+from nose.util import absdir, tolist
+from nose.plugins.manager import NoPlugins
+from warnings import warn
+
+log = logging.getLogger(__name__)
+
+# not allowed in config files
+option_blacklist = ['help', 'verbose']
+
+config_files = [
+    # Linux users will prefer this
+    "~/.noserc",
+    # Windows users will prefer this
+    "~/nose.cfg"
+    ]
+
+# plaforms on which the exe check defaults to off
+# Windows and IronPython
+exe_allowed_platforms = ('win32', 'cli')
+
+
+class NoSuchOptionError(Exception):
+    def __init__(self, name):
+        Exception.__init__(self, name)
+        self.name = name
+
+
+class ConfigError(Exception):
+    pass
+
+
+class ConfiguredDefaultsOptionParser(object):
+    """
+    Handler for options from commandline and config files.
+    """
+    def __init__(self, parser, config_section, error=None, file_error=None):
+        self._parser = parser
+        self._config_section = config_section
+        if error is None:
+            error = self._parser.error
+        self._error = error
+        if file_error is None:
+            file_error = lambda msg, **kw: error(msg)
+        self._file_error = file_error
+
+    def _configTuples(self, cfg, filename):
+        config = []
+        if self._config_section in cfg.sections():
+            for name, value in cfg.items(self._config_section):
+                config.append((name, value, filename))
+        return config
+
+    def _readFromFilenames(self, filenames):
+        config = []
+        for filename in filenames:
+            cfg = ConfigParser.RawConfigParser()
+            try:
+                cfg.read(filename)
+            except ConfigParser.Error, exc:
+                raise ConfigError("Error reading config file %r: %s" %
+                                  (filename, str(exc)))
+            config.extend(self._configTuples(cfg, filename))
+        return config
+
+    def _readFromFileObject(self, fh):
+        cfg = ConfigParser.RawConfigParser()
+        try:
+            filename = fh.name
+        except AttributeError:
+            filename = '<???>'
+        try:
+            cfg.readfp(fh)
+        except ConfigParser.Error, exc:
+            raise ConfigError("Error reading config file %r: %s" %
+                              (filename, str(exc)))
+        return self._configTuples(cfg, filename)
+
+    def _readConfiguration(self, config_files):
+        try:
+            config_files.readline
+        except AttributeError:
+            filename_or_filenames = config_files
+            if isinstance(filename_or_filenames, basestring):
+                filenames = [filename_or_filenames]
+            else:
+                filenames = filename_or_filenames
+            config = self._readFromFilenames(filenames)
+        else:
+            fh = config_files
+            config = self._readFromFileObject(fh)
+        return config
+
+    def _processConfigValue(self, name, value, values, parser):
+        opt_str = '--' + name
+        option = parser.get_option(opt_str)
+        if option is None:
+            raise NoSuchOptionError(name)
+        else:
+            option.process(opt_str, value, values, parser)
+
+    def _applyConfigurationToValues(self, parser, config, values):
+        for name, value, filename in config:
+            if name in option_blacklist:
+                continue
+            try:
+                self._processConfigValue(name, value, values, parser)
+            except NoSuchOptionError, exc:
+                self._file_error(
+                    "Error reading config file %r: "
+                    "no such option %r" % (filename, exc.name),
+                    name=name, filename=filename)
+            except optparse.OptionValueError, exc:
+                msg = str(exc).replace('--' + name, repr(name), 1)
+                self._file_error("Error reading config file %r: "
+                                 "%s" % (filename, msg),
+                                 name=name, filename=filename)
+
+    def parseArgsAndConfigFiles(self, args, config_files):
+        values = self._parser.get_default_values()
+        try:
+            config = self._readConfiguration(config_files)
+        except ConfigError, exc:
+            self._error(str(exc))
+        else:
+            self._applyConfigurationToValues(self._parser, config, values)
+        return self._parser.parse_args(args, values)
+
+
+class Config(object):
+    """nose configuration.
+
+    Instances of Config are used throughout nose to configure
+    behavior, including plugin lists. Here are the default values for
+    all config keys::
+
+      self.env = env = kw.pop('env', {})
+      self.args = ()
+      self.testMatch = re.compile(r'(?:^|[\\b_\\.%s-])[Tt]est' % os.sep)
+      self.addPaths = not env.get('NOSE_NOPATH', False)
+      self.configSection = 'nosetests'
+      self.debug = env.get('NOSE_DEBUG')
+      self.debugLog = env.get('NOSE_DEBUG_LOG')
+      self.exclude = None
+      self.getTestCaseNamesCompat = False
+      self.includeExe = env.get('NOSE_INCLUDE_EXE',
+                                sys.platform in exe_allowed_platforms)
+      self.ignoreFiles = (re.compile(r'^\.'),
+                          re.compile(r'^_'),
+                          re.compile(r'^setup\.py$')
+                          )
+      self.include = None
+      self.loggingConfig = None
+      self.logStream = sys.stderr
+      self.options = NoOptions()
+      self.parser = None
+      self.plugins = NoPlugins()
+      self.srcDirs = ('lib', 'src')
+      self.runOnInit = True
+      self.stopOnError = env.get('NOSE_STOP', False)
+      self.stream = sys.stderr
+      self.testNames = ()
+      self.verbosity = int(env.get('NOSE_VERBOSE', 1))
+      self.where = ()
+      self.workingDir = None   
+    """
+
+    def __init__(self, **kw):
+        self.env = env = kw.pop('env', {})
+        self.args = ()
+        self.testMatchPat = env.get('NOSE_TESTMATCH',
+                                    r'(?:^|[\b_\.%s-])[Tt]est' % os.sep)
+        self.testMatch = re.compile(self.testMatchPat)
+        self.addPaths = not env.get('NOSE_NOPATH', False)
+        self.configSection = 'nosetests'
+        self.debug = env.get('NOSE_DEBUG')
+        self.debugLog = env.get('NOSE_DEBUG_LOG')
+        self.exclude = None
+        self.getTestCaseNamesCompat = False
+        self.includeExe = env.get('NOSE_INCLUDE_EXE',
+                                  sys.platform in exe_allowed_platforms)
+        self.ignoreFiles = (re.compile(r'^\.'),
+                            re.compile(r'^_'),
+                            re.compile(r'^setup\.py$')
+                            )
+        self.include = None
+        self.loggingConfig = None
+        self.logStream = sys.stderr
+        self.options = NoOptions()
+        self.parser = None
+        self.plugins = NoPlugins()
+        self.srcDirs = ('lib', 'src')
+        self.runOnInit = True
+        self.stopOnError = env.get('NOSE_STOP', False)
+        self.stream = sys.stderr
+        self.testNames = []
+        self.verbosity = int(env.get('NOSE_VERBOSE', 1))
+        self.where = ()
+        self.workingDir = os.getcwd()
+        self.traverseNamespace = False
+        self.firstPackageWins = False
+        self.parserClass = OptionParser
+        
+        self._default = self.__dict__.copy()
+        self.update(kw)
+        self._orig = self.__dict__.copy()
+
+    def __repr__(self):
+        d = self.__dict__.copy()
+        # don't expose env, could include sensitive info
+        d['env'] = {} 
+        keys = [ k for k in d.keys()
+                 if not k.startswith('_') ]
+        keys.sort()
+        return "Config(%s)" % ', '.join([ '%s=%r' % (k, d[k])
+                                          for k in keys ])
+    __str__ = __repr__
+
+    def _parseArgs(self, argv, cfg_files):
+        def warn_sometimes(msg, name=None, filename=None):
+            if (hasattr(self.plugins, 'excludedOption') and
+                self.plugins.excludedOption(name)):
+                msg = ("Option %r in config file %r ignored: "
+                       "excluded by runtime environment" %
+                       (name, filename))
+                warn(msg, RuntimeWarning)
+            else:
+                raise ConfigError(msg)
+        parser = ConfiguredDefaultsOptionParser(
+            self.getParser(), self.configSection, file_error=warn_sometimes)
+        return parser.parseArgsAndConfigFiles(argv[1:], cfg_files)
+
+    def configure(self, argv=None, doc=None):
+        """Configure the nose running environment. Execute configure before
+        collecting tests with nose.TestCollector to enable output capture and
+        other features.
+        """
+        env = self.env
+        if argv is None:
+            argv = sys.argv
+
+        cfg_files = getattr(self, 'files', [])
+        options, args = self._parseArgs(argv, cfg_files)
+        # If -c --config has been specified on command line,
+        # load those config files and reparse
+        if getattr(options, 'files', []):
+            options, args = self._parseArgs(argv, options.files)
+
+        self.options = options
+        if args:
+            self.testNames = args
+        if options.testNames is not None:
+            self.testNames.extend(tolist(options.testNames))
+
+        # `where` is an append action, so it can't have a default value 
+        # in the parser, or that default will always be in the list
+        if not options.where:
+            options.where = env.get('NOSE_WHERE', None)
+
+        # include and exclude also
+        if not options.include:
+            options.include = env.get('NOSE_INCLUDE', [])
+        if not options.exclude:
+            options.exclude = env.get('NOSE_EXCLUDE', [])
+
+        self.addPaths = options.addPaths
+        self.stopOnError = options.stopOnError
+        self.verbosity = options.verbosity
+        self.includeExe = options.includeExe
+        self.traverseNamespace = options.traverseNamespace
+        self.debug = options.debug
+        self.debugLog = options.debugLog
+        self.loggingConfig = options.loggingConfig
+        self.firstPackageWins = options.firstPackageWins
+        self.configureLogging()
+
+        if options.where is not None:
+            self.configureWhere(options.where)
+        
+        if options.testMatch:
+            self.testMatch = re.compile(options.testMatch)
+                
+        if options.include:
+            self.include = map(re.compile, tolist(options.include))
+            log.info("Including tests matching %s", options.include)
+
+        if options.exclude:
+            self.exclude = map(re.compile, tolist(options.exclude))
+            log.info("Excluding tests matching %s", options.exclude)
+
+        # When listing plugins we don't want to run them
+        if not options.showPlugins:
+            self.plugins.configure(options, self)
+            self.plugins.begin()
+
+    def configureLogging(self):
+        """Configure logging for nose, or optionally other packages. Any logger
+        name may be set with the debug option, and that logger will be set to
+        debug level and be assigned the same handler as the nose loggers, unless
+        it already has a handler.
+        """
+        if self.loggingConfig:
+            from logging.config import fileConfig
+            fileConfig(self.loggingConfig)
+            return
+        
+        format = logging.Formatter('%(name)s: %(levelname)s: %(message)s')
+        if self.debugLog:
+            handler = logging.FileHandler(self.debugLog)
+        else:
+            handler = logging.StreamHandler(self.logStream)
+        handler.setFormatter(format)
+
+        logger = logging.getLogger('nose')
+        logger.propagate = 0
+
+        # only add our default handler if there isn't already one there
+        # this avoids annoying duplicate log messages.
+        if handler not in logger.handlers:
+            logger.addHandler(handler)
+
+        # default level    
+        lvl = logging.WARNING
+        if self.verbosity >= 5:
+            lvl = 0
+        elif self.verbosity >= 4:
+            lvl = logging.DEBUG
+        elif self.verbosity >= 3:
+            lvl = logging.INFO
+        logger.setLevel(lvl)
+
+        # individual overrides
+        if self.debug:
+            # no blanks
+            debug_loggers = [ name for name in self.debug.split(',')
+                              if name ]
+            for logger_name in debug_loggers:
+                l = logging.getLogger(logger_name)
+                l.setLevel(logging.DEBUG)
+                if not l.handlers and not logger_name.startswith('nose'):
+                    l.addHandler(handler)
+
+    def configureWhere(self, where):
+        """Configure the working directory or directories for the test run.
+        """
+        from nose.importer import add_path
+        self.workingDir = None
+        where = tolist(where)
+        warned = False
+        for path in where:
+            if not self.workingDir:
+                abs_path = absdir(path)
+                if abs_path is None:
+                    raise ValueError("Working directory %s not found, or "
+                                     "not a directory" % path)
+                log.info("Set working dir to %s", abs_path)
+                self.workingDir = abs_path
+                if self.addPaths and \
+                       os.path.exists(os.path.join(abs_path, '__init__.py')):
+                    log.info("Working directory %s is a package; "
+                             "adding to sys.path" % abs_path)
+                    add_path(abs_path)
+                continue
+            if not warned:
+                warn("Use of multiple -w arguments is deprecated and "
+                     "support may be removed in a future release. You can "
+                     "get the same behavior by passing directories without "
+                     "the -w argument on the command line, or by using the "
+                     "--tests argument in a configuration file.",
+                     DeprecationWarning)
+            self.testNames.append(path)
+
+    def default(self):
+        """Reset all config values to defaults.
+        """
+        self.__dict__.update(self._default)
+
+    def getParser(self, doc=None):
+        """Get the command line option parser.
+        """
+        if self.parser:
+            return self.parser
+        env = self.env
+        parser = self.parserClass(doc)
+        parser.add_option(
+            "-V","--version", action="store_true",
+            dest="version", default=False,
+            help="Output nose version and exit")
+        parser.add_option(
+            "-p", "--plugins", action="store_true",
+            dest="showPlugins", default=False,
+            help="Output list of available plugins and exit. Combine with "
+            "higher verbosity for greater detail")
+        parser.add_option(
+            "-v", "--verbose",
+            action="count", dest="verbosity",
+            default=self.verbosity,
+            help="Be more verbose. [NOSE_VERBOSE]")
+        parser.add_option(
+            "--verbosity", action="store", dest="verbosity",
+            metavar='VERBOSITY',
+            type="int", help="Set verbosity; --verbosity=2 is "
+            "the same as -v")
+        parser.add_option(
+            "-q", "--quiet", action="store_const", const=0, dest="verbosity",
+            help="Be less verbose")
+        parser.add_option(
+            "-c", "--config", action="append", dest="files",
+            metavar="FILES",
+            help="Load configuration from config file(s). May be specified "
+            "multiple times; in that case, all config files will be "
+            "loaded and combined")
+        parser.add_option(
+            "-w", "--where", action="append", dest="where",
+            metavar="WHERE",
+            help="Look for tests in this directory. "
+            "May be specified multiple times. The first directory passed "
+            "will be used as the working directory, in place of the current "
+            "working directory, which is the default. Others will be added "
+            "to the list of tests to execute. [NOSE_WHERE]"
+            )
+        parser.add_option(
+            "-m", "--match", "--testmatch", action="store",
+            dest="testMatch", metavar="REGEX",
+            help="Files, directories, function names, and class names "
+            "that match this regular expression are considered tests.  "
+            "Default: %s [NOSE_TESTMATCH]" % self.testMatchPat,
+            default=self.testMatchPat)
+        parser.add_option(
+            "--tests", action="store", dest="testNames", default=None,
+            metavar='NAMES',
+            help="Run these tests (comma-separated list). This argument is "
+            "useful mainly from configuration files; on the command line, "
+            "just pass the tests to run as additional arguments with no "
+            "switch.")
+        parser.add_option(
+            "-l", "--debug", action="store",
+            dest="debug", default=self.debug,
+            help="Activate debug logging for one or more systems. "
+            "Available debug loggers: nose, nose.importer, "
+            "nose.inspector, nose.plugins, nose.result and "
+            "nose.selector. Separate multiple names with a comma.")
+        parser.add_option(
+            "--debug-log", dest="debugLog", action="store",
+            default=self.debugLog, metavar="FILE",
+            help="Log debug messages to this file "
+            "(default: sys.stderr)")
+        parser.add_option(
+            "--logging-config", "--log-config",
+            dest="loggingConfig", action="store",
+            default=self.loggingConfig, metavar="FILE",
+            help="Load logging config from this file -- bypasses all other"
+            " logging config settings.")
+        parser.add_option(
+            "-e", "--exclude", action="append", dest="exclude",
+            metavar="REGEX",
+            help="Don't run tests that match regular "
+            "expression [NOSE_EXCLUDE]")
+        parser.add_option(
+            "-i", "--include", action="append", dest="include",
+            metavar="REGEX",
+            help="This regular expression will be applied to files, "
+            "directories, function names, and class names for a chance "
+            "to include additional tests that do not match TESTMATCH.  "
+            "Specify this option multiple times "
+            "to add more regular expressions [NOSE_INCLUDE]")
+        parser.add_option(
+            "-x", "--stop", action="store_true", dest="stopOnError",
+            default=self.stopOnError,
+            help="Stop running tests after the first error or failure")
+        parser.add_option(
+            "-P", "--no-path-adjustment", action="store_false",
+            dest="addPaths",
+            default=self.addPaths,
+            help="Don't make any changes to sys.path when "
+            "loading tests [NOSE_NOPATH]")
+        parser.add_option(
+            "--exe", action="store_true", dest="includeExe",
+            default=self.includeExe,
+            help="Look for tests in python modules that are "
+            "executable. Normal behavior is to exclude executable "
+            "modules, since they may not be import-safe "
+            "[NOSE_INCLUDE_EXE]")
+        parser.add_option(
+            "--noexe", action="store_false", dest="includeExe",
+            help="DO NOT look for tests in python modules that are "
+            "executable. (The default on the windows platform is to "
+            "do so.)")
+        parser.add_option(
+            "--traverse-namespace", action="store_true",
+            default=self.traverseNamespace, dest="traverseNamespace",
+            help="Traverse through all path entries of a namespace package")
+        parser.add_option(
+            "--first-package-wins", "--first-pkg-wins", "--1st-pkg-wins",
+            default=False, dest="firstPackageWins",
+            help="nose's importer will normally evict a package from sys."
+            "modules if it sees a package with the same name in a different "
+            "location. Set this option to disable that behavior.")
+
+        self.plugins.loadPlugins()
+        self.pluginOpts(parser)
+
+        self.parser = parser
+        return parser
+
+    def help(self, doc=None):
+        """Return the generated help message
+        """
+        return self.getParser(doc).format_help()
+
+    def pluginOpts(self, parser):
+        self.plugins.addOptions(parser, self.env)
+
+    def reset(self):
+        self.__dict__.update(self._orig)
+
+    def todict(self):
+        return self.__dict__.copy()
+        
+    def update(self, d):
+        self.__dict__.update(d)
+
+
+class NoOptions(object):
+    """Options container that returns None for all options.
+    """
+    def __getattr__(self, attr):
+        return None
+
+    def __nonzero__(self):
+        return False
+
+
+def user_config_files():
+    """Return path to any existing user config files
+    """
+    return filter(os.path.exists,
+                  map(os.path.expanduser, config_files))
+
+
+def all_config_files():
+    """Return path to any existing user config files, plus any setup.cfg
+    in the current working directory.
+    """
+    user = user_config_files()
+    if os.path.exists('setup.cfg'):
+        return user + ['setup.cfg']
+    return user
+
+
+# used when parsing config files
+def flag(val):
+    """Does the value look like an on/off flag?"""
+    if val == 1:
+        return True
+    elif val == 0:
+        return False
+    val = str(val)
+    if len(val) > 5:
+        return False
+    return val.upper() in ('1', '0', 'F', 'T', 'TRUE', 'FALSE', 'ON', 'OFF')
+
+
+def _bool(val):
+    return str(val).upper() in ('1', 'T', 'TRUE', 'ON')
Index: /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/loader.py
===================================================================
--- /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/loader.py (revision 3)
+++ /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/loader.py (revision 3)
@@ -0,0 +1,562 @@
+"""
+Test Loader
+-----------
+
+nose's test loader implements the same basic functionality as its
+superclass, unittest.TestLoader, but extends it by more liberal
+interpretations of what may be a test and how a test may be named.
+"""
+from __future__ import generators
+
+import logging
+import os
+import sys
+import unittest
+from inspect import isfunction, ismethod
+from nose.case import FunctionTestCase, MethodTestCase
+from nose.failure import Failure
+from nose.config import Config
+from nose.importer import Importer, add_path, remove_path
+from nose.selector import defaultSelector, TestAddress
+from nose.util import cmp_lineno, getpackage, isclass, isgenerator, ispackage, \
+    match_last, resolve_name, transplant_func, transplant_class, test_address
+from nose.suite import ContextSuiteFactory, ContextList, LazySuite
+
+
+log = logging.getLogger(__name__)
+#log.setLevel(logging.DEBUG)
+
+# for efficiency and easier mocking
+op_normpath = os.path.normpath
+op_abspath = os.path.abspath
+op_join = os.path.join
+op_isdir = os.path.isdir
+op_isfile = os.path.isfile
+
+
+__all__ = ['TestLoader', 'defaultTestLoader']
+
+
+class TestLoader(unittest.TestLoader):
+    """Test loader that extends unittest.TestLoader to:
+
+    * Load tests from test-like functions and classes that are not
+      unittest.TestCase subclasses
+    * Find and load test modules in a directory
+    * Support tests that are generators
+    * Support easy extensions of or changes to that behavior through plugins
+    """
+    config = None
+    importer = None
+    workingDir = None
+    selector = None
+    suiteClass = None
+    
+    def __init__(self, config=None, importer=None, workingDir=None,
+                 selector=None):
+        """Initialize a test loader.
+
+        Parameters (all optional):
+
+        * config: provide a `nose.config.Config`_ or other config class
+          instance; if not provided a `nose.config.Config`_ with
+          default values is used.          
+        * importer: provide an importer instance that implements
+          `importFromPath`. If not provided, a
+          `nose.importer.Importer`_ is used.
+        * workingDir: the directory to which file and module names are
+          relative. If not provided, assumed to be the current working
+          directory.
+        * selector: a selector class or instance. If a class is
+          provided, it will be instantiated with one argument, the
+          current config. If not provided, a `nose.selector.Selector`_
+          is used.
+        """
+        if config is None:
+            config = Config()
+        if importer is None:
+            importer = Importer(config=config)
+        if workingDir is None:
+            workingDir = config.workingDir
+        if selector is None:
+            selector = defaultSelector(config)
+        elif isclass(selector):
+            selector = selector(config)
+        self.config = config
+        self.importer = importer
+        self.workingDir = op_normpath(op_abspath(workingDir))
+        self.selector = selector
+        if config.addPaths:
+            add_path(workingDir, config)        
+        self.suiteClass = ContextSuiteFactory(config=config)
+        unittest.TestLoader.__init__(self)     
+
+    def getTestCaseNames(self, testCaseClass):
+        """Override to select with selector, unless
+        config.getTestCaseNamesCompat is True
+        """
+        if self.config.getTestCaseNamesCompat:
+            return unittest.TestLoader.getTestCaseNames(self, testCaseClass)
+        
+        def wanted(attr, cls=testCaseClass, sel=self.selector):
+            item = getattr(cls, attr, None)
+            if not ismethod(item):
+                return False
+            return sel.wantMethod(item)
+        cases = filter(wanted, dir(testCaseClass))
+        for base in testCaseClass.__bases__:
+            for case in self.getTestCaseNames(base):
+                if case not in cases:
+                    cases.append(case)
+        # add runTest if nothing else picked
+        if not cases and hasattr(testCaseClass, 'runTest'):
+            cases = ['runTest']
+        if self.sortTestMethodsUsing:
+            cases.sort(self.sortTestMethodsUsing)
+        return cases
+
+    def loadTestsFromDir(self, path):
+        """Load tests from the directory at path. This is a generator
+        -- each suite of tests from a module or other file is yielded
+        and is expected to be executed before the next file is
+        examined.
+        """        
+        log.debug("load from dir %s", path)
+        plugins = self.config.plugins
+        plugins.beforeDirectory(path)
+        if self.config.addPaths:
+            paths_added = add_path(path, self.config)
+
+        entries = os.listdir(path)
+        entries.sort(lambda a, b: match_last(a, b, self.config.testMatch))
+        for entry in entries:
+            # this hard-coded initial-dot test will be removed:
+            # http://code.google.com/p/python-nose/issues/detail?id=82
+            if entry.startswith('.'):
+                continue
+            entry_path = op_abspath(op_join(path, entry))
+            is_file = op_isfile(entry_path)
+            wanted = False
+            if is_file:
+                is_dir = False
+                wanted = self.selector.wantFile(entry_path)
+            else:
+                is_dir = op_isdir(entry_path)
+                if is_dir:
+                    # this hard-coded initial-underscore test will be removed:
+                    # http://code.google.com/p/python-nose/issues/detail?id=82
+                    if entry.startswith('_'):
+                        continue
+                    wanted = self.selector.wantDirectory(entry_path)
+            is_package = ispackage(entry_path)
+            if wanted:
+                if is_file:
+                    plugins.beforeContext()
+                    if entry.endswith('.py'):
+                        yield self.loadTestsFromName(
+                            entry_path, discovered=True)
+                    else:
+                        yield self.loadTestsFromFile(entry_path)
+                    plugins.afterContext()
+                elif is_package:
+                    # Load the entry as a package: given the full path,
+                    # loadTestsFromName() will figure it out
+                    yield self.loadTestsFromName(
+                        entry_path, discovered=True)
+                else:
+                    # Another test dir in this one: recurse lazily
+                    yield self.suiteClass(
+                        lambda: self.loadTestsFromDir(entry_path))
+        tests = []
+        for test in plugins.loadTestsFromDir(path):
+            tests.append(test)
+        # TODO: is this try/except needed?
+        try:
+            if tests:
+                yield self.suiteClass(tests)
+        except (KeyboardInterrupt, SystemExit):
+            raise
+        except:
+            yield self.suiteClass([Failure(*sys.exc_info())])
+        
+        # pop paths
+        if self.config.addPaths:
+            map(remove_path, paths_added)
+        plugins.afterDirectory(path)
+
+    def loadTestsFromFile(self, filename):
+        """Load tests from a non-module file. Default is to raise a
+        ValueError; plugins may implement `loadTestsFromFile` to
+        provide a list of tests loaded from the file.
+        """
+        log.debug("Load from non-module file %s", filename)
+        try:
+            tests = [test for test in
+                     self.config.plugins.loadTestsFromFile(filename)]
+            if tests:
+                # Plugins can yield False to indicate that they were
+                # unable to load tests from a file, but it was not an
+                # error -- the file just had no tests to load.
+                tests = filter(None, tests)
+                return self.suiteClass(tests)
+            else:
+                # Nothing was able to even try to load from this file
+                open(filename, 'r').close() # trigger os error
+                raise ValueError("Unable to load tests from file %s"
+                                 % filename)
+        except (KeyboardInterrupt, SystemExit):
+            raise
+        except:
+            exc = sys.exc_info()
+            return self.suiteClass(
+                [Failure(exc[0], exc[1], exc[2],
+                         address=(filename, None, None))])
+
+    def loadTestsFromGenerator(self, generator, module):
+        """Lazy-load tests from a generator function. The generator function
+        may yield either:
+
+        * a callable, or
+        * a function name resolvable within the same module
+        """
+        def generate(g=generator, m=module):
+            try:
+                for test in g():
+                    test_func, arg = self.parseGeneratedTest(test)
+                    if not callable(test_func):
+                        test_func = getattr(m, test_func)
+                    yield FunctionTestCase(test_func, arg=arg, descriptor=g)
+            except KeyboardInterrupt:
+                raise
+            except:
+                exc = sys.exc_info()
+                yield Failure(exc[0], exc[1], exc[2],
+                              address=test_address(generator))
+        return self.suiteClass(generate, context=generator, can_split=False)
+
+    def loadTestsFromGeneratorMethod(self, generator, cls):
+        """Lazy-load tests from a generator method.
+
+        This is more complicated than loading from a generator function,
+        since a generator method may yield:
+
+        * a function
+        * a bound or unbound method, or
+        * a method name
+        """
+        # convert the unbound generator method
+        # into a bound method so it can be called below
+        cls = generator.im_class
+        inst = cls()
+        method = generator.__name__
+        generator = getattr(inst, method)
+
+        def generate(g=generator, c=cls):
+            try:
+                for test in g():
+                    test_func, arg = self.parseGeneratedTest(test)
+                    if not callable(test_func):
+                        test_func = getattr(c, test_func)
+                    if ismethod(test_func):
+                        yield MethodTestCase(test_func, arg=arg, descriptor=g)
+                    elif isfunction(test_func):
+                        # In this case we're forcing the 'MethodTestCase'
+                        # to run the inline function as its test call,
+                        # but using the generator method as the 'method of
+                        # record' (so no need to pass it as the descriptor)
+                        yield MethodTestCase(g, test=test_func, arg=arg)
+                    else:
+                        yield Failure(
+                            TypeError,
+                            "%s is not a function or method" % test_func)
+            except KeyboardInterrupt:
+                raise
+            except:
+                exc = sys.exc_info()
+                yield Failure(exc[0], exc[1], exc[2],
+                              address=test_address(generator))
+        return self.suiteClass(generate, context=generator, can_split=False)
+
+    def loadTestsFromModule(self, module, path=None, discovered=False):
+        """Load all tests from module and return a suite containing
+        them. If the module has been discovered and is not test-like,
+        the suite will be empty by default, though plugins may add
+        their own tests.
+        """
+        log.debug("Load from module %s", module)
+        tests = []
+        test_classes = []
+        test_funcs = []
+        # For *discovered* modules, we only load tests when the module looks
+        # testlike. For modules we've been directed to load, we always
+        # look for tests. (discovered is set to True by loadTestsFromDir)
+        if not discovered or self.selector.wantModule(module):
+            for item in dir(module):
+                test = getattr(module, item, None)
+                # print "Check %s (%s) in %s" % (item, test, module.__name__)
+                if isclass(test):
+                    if self.selector.wantClass(test):
+                        test_classes.append(test)
+                elif isfunction(test) and self.selector.wantFunction(test):
+                    test_funcs.append(test)
+            test_classes.sort(lambda a, b: cmp(a.__name__, b.__name__))
+            test_funcs.sort(cmp_lineno)
+            tests = map(lambda t: self.makeTest(t, parent=module),
+                        test_classes + test_funcs)
+
+        # Now, descend into packages
+        # FIXME can or should this be lazy?
+        # is this syntax 2.2 compatible?
+        module_paths = getattr(module, '__path__', [])
+        if path:
+            path = os.path.realpath(path)
+        for module_path in module_paths:
+            if (self.config.traverseNamespace or not path) or \
+                    os.path.realpath(module_path).startswith(path):
+                tests.extend(self.loadTestsFromDir(module_path))
+            
+        for test in self.config.plugins.loadTestsFromModule(module, path):
+            tests.append(test)
+
+        return self.suiteClass(ContextList(tests, context=module))
+    
+    def loadTestsFromName(self, name, module=None, discovered=False):
+        """Load tests from the entity with the given name.
+
+        The name may indicate a file, directory, module, or any object
+        within a module. See `nose.util.split_test_name` for details on
+        test name parsing.
+        """
+        # FIXME refactor this method into little bites?
+        log.debug("load from %s (%s)", name, module)
+        
+        suite = self.suiteClass
+
+        # give plugins first crack
+        plug_tests = self.config.plugins.loadTestsFromName(name, module)
+        if plug_tests:
+            return suite(plug_tests)
+        
+        addr = TestAddress(name, workingDir=self.workingDir)
+        if module:
+            # Two cases:
+            #  name is class.foo
+            #    The addr will be incorrect, since it thinks class.foo is
+            #    a dotted module name. It's actually a dotted attribute
+            #    name. In this case we want to use the full submitted
+            #    name as the name to load from the module.
+            #  name is module:class.foo
+            #    The addr will be correct. The part we want is the part after
+            #    the :, which is in addr.call.
+            if addr.call:
+                name = addr.call
+            parent, obj = self.resolve(name, module)
+            if (isclass(parent)
+                and getattr(parent, '__module__', None) != module.__name__):
+                parent = transplant_class(parent, module.__name__)
+                obj = getattr(parent, obj.__name__)
+            log.debug("parent %s obj %s module %s", parent, obj, module)
+            if isinstance(obj, Failure):
+                return suite([obj])
+            else:
+                return suite(ContextList([self.makeTest(obj, parent)],
+                                         context=parent))
+        else:
+            if addr.module:
+                try:
+                    if addr.filename is None:
+                        module = resolve_name(addr.module)
+                    else:
+                        self.config.plugins.beforeImport(
+                            addr.filename, addr.module)
+                        # FIXME: to support module.name names,
+                        # do what resolve-name does and keep trying to
+                        # import, popping tail of module into addr.call,
+                        # until we either get an import or run out of
+                        # module parts
+                        try:
+                            module = self.importer.importFromPath(
+                                addr.filename, addr.module)
+                        finally:
+                            self.config.plugins.afterImport(
+                                addr.filename, addr.module)
+                except (KeyboardInterrupt, SystemExit):
+                    raise
+                except:
+                    exc = sys.exc_info()
+                    return suite([Failure(exc[0], exc[1], exc[2],
+                                          address=addr.totuple())])
+                if addr.call:
+                    return self.loadTestsFromName(addr.call, module)
+                else:
+                    return self.loadTestsFromModule(
+                        module, addr.filename,
+                        discovered=discovered)
+            elif addr.filename:
+                path = addr.filename
+                if addr.call:
+                    package = getpackage(path)
+                    if package is None:
+                        return suite([
+                            Failure(ValueError,
+                                    "Can't find callable %s in file %s: "
+                                    "file is not a python module" %
+                                    (addr.call, path),
+                                    address=addr.totuple())])
+                    return self.loadTestsFromName(addr.call, module=package)
+                else:
+                    if op_isdir(path):
+                        # In this case we *can* be lazy since we know
+                        # that each module in the dir will be fully
+                        # loaded before its tests are executed; we
+                        # also know that we're not going to be asked
+                        # to load from . and ./some_module.py *as part
+                        # of this named test load*
+                        return LazySuite(
+                            lambda: self.loadTestsFromDir(path))
+                    elif op_isfile(path):
+                        return self.loadTestsFromFile(path)
+                    else:
+                        return suite([
+                                Failure(OSError, "No such file %s" % path,
+                                        address=addr.totuple())])
+            else:
+                # just a function? what to do? I think it can only be
+                # handled when module is not None
+                return suite([
+                    Failure(ValueError, "Unresolvable test name %s" % name,
+                            address=addr.totuple())])
+
+    def loadTestsFromNames(self, names, module=None):
+        """Load tests from all names, returning a suite containing all
+        tests.
+        """
+        plug_res = self.config.plugins.loadTestsFromNames(names, module)
+        if plug_res:
+            suite, names = plug_res
+            if suite:
+                return self.suiteClass([
+                    self.suiteClass(suite),
+                    unittest.TestLoader.loadTestsFromNames(self, names, module)
+                    ])
+        return unittest.TestLoader.loadTestsFromNames(self, names, module)
+
+    def loadTestsFromTestCase(self, testCaseClass):
+        """Load tests from a unittest.TestCase subclass.
+        """
+        cases = []
+        plugins = self.config.plugins
+        for case in plugins.loadTestsFromTestCase(testCaseClass):
+            cases.append(case)
+        # For efficiency in the most common case, just call and return from
+        # super. This avoids having to extract cases and rebuild a context
+        # suite when there are no plugin-contributed cases.
+        if not cases:
+            return super(TestLoader, self).loadTestsFromTestCase(testCaseClass)
+        cases.extend(
+            [case for case in
+             super(TestLoader, self).loadTestsFromTestCase(testCaseClass)])
+        return self.suiteClass(cases)
+    
+    def loadTestsFromTestClass(self, cls):
+        """Load tests from a test class that is *not* a unittest.TestCase
+        subclass.
+
+        In this case, we can't depend on the class's `__init__` taking method
+        name arguments, so we have to compose a MethodTestCase for each
+        method in the class that looks testlike.
+        """
+        def wanted(attr, cls=cls, sel=self.selector):
+            item = getattr(cls, attr, None)
+            if not ismethod(item):
+                return False
+            return sel.wantMethod(item)
+        cases = [self.makeTest(getattr(cls, case), cls)
+                 for case in filter(wanted, dir(cls))]
+        for test in self.config.plugins.loadTestsFromTestClass(cls):
+            cases.append(test)
+        return self.suiteClass(ContextList(cases, context=cls))
+
+    def makeTest(self, obj, parent=None):
+        """Given a test object and its parent, return a test case
+        or test suite.
+        """
+        plug_tests = []
+        try:
+            addr = test_address(obj)
+        except KeyboardInterrupt:
+            raise
+        except:
+            addr = None
+        for test in self.config.plugins.makeTest(obj, parent):
+            plug_tests.append(test)
+        # TODO: is this try/except needed?
+        try:
+            if plug_tests:
+                return self.suiteClass(plug_tests)
+        except (KeyboardInterrupt, SystemExit):
+            raise
+        except:
+            exc = sys.exc_info()
+            return Failure(exc[0], exc[1], exc[2], address=addr)
+        
+        if isinstance(obj, unittest.TestCase):
+            return obj
+        elif isclass(obj):
+            if parent and obj.__module__ != parent.__name__:
+                obj = transplant_class(obj, parent.__name__)
+            if issubclass(obj, unittest.TestCase):
+                return self.loadTestsFromTestCase(obj)
+            else:
+                return self.loadTestsFromTestClass(obj)
+        elif ismethod(obj):
+            if parent is None:
+                parent = obj.__class__
+            if issubclass(parent, unittest.TestCase):
+                return parent(obj.__name__)
+            else:
+                if isgenerator(obj):
+                    return self.loadTestsFromGeneratorMethod(obj, parent)
+                else:
+                    return MethodTestCase(obj)
+        elif isfunction(obj):
+            if parent and obj.__module__ != parent.__name__:
+                obj = transplant_func(obj, parent.__name__)
+            if isgenerator(obj):
+                return self.loadTestsFromGenerator(obj, parent)
+            else:
+                return FunctionTestCase(obj)
+        else:
+            return Failure(TypeError,
+                           "Can't make a test from %s" % obj,
+                           address=addr)
+
+    def resolve(self, name, module):
+        """Resolve name within module
+        """
+        obj = module
+        parts = name.split('.')
+        for part in parts:
+            parent, obj = obj, getattr(obj, part, None)
+        if obj is None:
+            # no such test
+            obj = Failure(ValueError, "No such test %s" % name)
+        return parent, obj
+
+    def parseGeneratedTest(self, test):
+        """Given the yield value of a test generator, return a func and args.
+
+        This is used in the two loadTestsFromGenerator* methods.
+
+        """
+        if not isinstance(test, tuple):         # yield test
+            test_func, arg = (test, tuple())
+        elif len(test) == 1:                    # yield (test,)
+            test_func, arg = (test[0], tuple())
+        else:                                   # yield test, foo, bar, ...
+            assert len(test) > 1 # sanity check
+            test_func, arg = (test[0], test[1:])
+        return test_func, arg
+
+defaultTestLoader = TestLoader
+
Index: /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/inspector.py
===================================================================
--- /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/inspector.py (revision 3)
+++ /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/inspector.py (revision 3)
@@ -0,0 +1,205 @@
+"""Simple traceback introspection. Used to add additional information to
+AssertionErrors in tests, so that failure messages may be more informative.
+"""
+import inspect
+import logging
+import re
+import sys
+import textwrap
+import tokenize
+
+try:
+    from cStringIO import StringIO
+except ImportError:
+    from StringIO import StringIO
+
+log = logging.getLogger(__name__)
+
+def inspect_traceback(tb):
+    """Inspect a traceback and its frame, returning source for the expression
+    where the exception was raised, with simple variable replacement performed
+    and the line on which the exception was raised marked with '>>'
+    """
+    log.debug('inspect traceback %s', tb)
+
+    # we only want the innermost frame, where the exception was raised
+    while tb.tb_next:
+        tb = tb.tb_next
+        
+    frame = tb.tb_frame
+    lines, exc_line = tbsource(tb)
+        
+    # figure out the set of lines to grab.
+    inspect_lines, mark_line = find_inspectable_lines(lines, exc_line)
+    src = StringIO(textwrap.dedent(''.join(inspect_lines)))
+    exp = Expander(frame.f_locals, frame.f_globals)
+
+    while inspect_lines:
+        try:
+            tokenize.tokenize(src.readline, exp)
+        except tokenize.TokenError, e:
+            # this can happen if our inspectable region happens to butt up
+            # against the end of a construct like a docstring with the closing
+            # """ on separate line
+            log.debug("Tokenizer error: %s", e)
+            inspect_lines.pop(0)
+            mark_line -= 1
+            src = StringIO(textwrap.dedent(''.join(inspect_lines)))
+            exp = Expander(frame.f_locals, frame.f_globals)
+            continue
+        break
+    padded = []
+    if exp.expanded_source:
+        exp_lines = exp.expanded_source.split('\n')
+        ep = 0
+        for line in exp_lines:
+            if ep == mark_line:
+                padded.append('>>  ' + line)
+            else:
+                padded.append('    ' + line)
+            ep += 1
+    return '\n'.join(padded)
+
+
+def tbsource(tb, context=6):
+    """Get source from  a traceback object.
+
+    A tuple of two things is returned: a list of lines of context from
+    the source code, and the index of the current line within that list.
+    The optional second argument specifies the number of lines of context
+    to return, which are centered around the current line.
+
+    .. Note ::
+       This is adapted from inspect.py in the python 2.4 standard library, 
+       since a bug in the 2.3 version of inspect prevents it from correctly
+       locating source lines in a traceback frame.
+    """
+    
+    lineno = tb.tb_lineno
+    frame = tb.tb_frame
+
+    if context > 0:
+        start = lineno - 1 - context//2
+        log.debug("lineno: %s start: %s", lineno, start)
+        
+        try:
+            lines, dummy = inspect.findsource(frame)
+        except IOError:
+            lines, index = [''], 0
+        else:
+            all_lines = lines
+            start = max(start, 1)
+            start = max(0, min(start, len(lines) - context))
+            lines = lines[start:start+context]
+            index = lineno - 1 - start
+            
+            # python 2.5 compat: if previous line ends in a continuation,
+            # decrement start by 1 to match 2.4 behavior                
+            if sys.version_info >= (2, 5) and index > 0:
+                while lines[index-1].strip().endswith('\\'):
+                    start -= 1
+                    lines = all_lines[start:start+context]
+    else:
+        lines, index = [''], 0
+    log.debug("tbsource lines '''%s''' around index %s", lines, index)
+    return (lines, index)    
+
+    
+def find_inspectable_lines(lines, pos):
+    """Find lines in home that are inspectable.
+    
+    Walk back from the err line up to 3 lines, but don't walk back over
+    changes in indent level.
+
+    Walk forward up to 3 lines, counting \ separated lines as 1. Don't walk
+    over changes in indent level (unless part of an extended line)
+    """
+    cnt = re.compile(r'\\[\s\n]*$')
+    df = re.compile(r':[\s\n]*$')
+    ind = re.compile(r'^(\s*)')
+    toinspect = []
+    home = lines[pos]
+    home_indent = ind.match(home).groups()[0]
+    
+    before = lines[max(pos-3, 0):pos]
+    before.reverse()
+    after = lines[pos+1:min(pos+4, len(lines))]
+
+    for line in before:
+        if ind.match(line).groups()[0] == home_indent:
+            toinspect.append(line)
+        else:
+            break
+    toinspect.reverse()
+    toinspect.append(home)
+    home_pos = len(toinspect)-1
+    continued = cnt.search(home)
+    for line in after:
+        if ((continued or ind.match(line).groups()[0] == home_indent)
+            and not df.search(line)):
+            toinspect.append(line)
+            continued = cnt.search(line)
+        else:
+            break
+    log.debug("Inspecting lines '''%s''' around %s", toinspect, home_pos)
+    return toinspect, home_pos
+
+
+class Expander:
+    """Simple expression expander. Uses tokenize to find the names and
+    expands any that can be looked up in the frame.
+    """
+    def __init__(self, locals, globals):
+        self.locals = locals
+        self.globals = globals
+        self.lpos = None
+        self.expanded_source = ''
+         
+    def __call__(self, ttype, tok, start, end, line):
+        # TODO
+        # deal with unicode properly
+        
+        # TODO
+        # Dealing with instance members
+        #   always keep the last thing seen  
+        #   if the current token is a dot,
+        #      get ready to getattr(lastthing, this thing) on the
+        #      next call.
+        
+        if self.lpos is not None and start[1] >= self.lpos:
+            self.expanded_source += ' ' * (start[1]-self.lpos)
+        elif start[1] < self.lpos:
+            # newline, indent correctly
+            self.expanded_source += ' ' * start[1]
+        self.lpos = end[1]
+      
+        if ttype == tokenize.INDENT:
+            pass
+        elif ttype == tokenize.NAME:
+            # Clean this junk up
+            try:
+                val = self.locals[tok]
+                if callable(val):
+                    val = tok
+                else:
+                    val = repr(val)
+            except KeyError:
+                try:
+                    val = self.globals[tok]
+                    if callable(val):
+                        val = tok
+                    else:
+                        val = repr(val)
+
+                except KeyError:
+                    val = tok
+            # FIXME... not sure how to handle things like funcs, classes
+            # FIXME this is broken for some unicode strings
+            self.expanded_source += val
+        else:
+            self.expanded_source += tok
+        # if this is the end of the line and the line ends with
+        # \, then tack a \ and newline onto the output
+        # print line[end[1]:]
+        if re.match(r'\s+\\\n', line[end[1]:]):
+            self.expanded_source += ' \\\n'
Index: /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/ext/dtcompat.py
===================================================================
--- /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/ext/dtcompat.py (revision 3)
+++ /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/ext/dtcompat.py (revision 3)
@@ -0,0 +1,2272 @@
+# Module doctest.
+# Released to the public domain 16-Jan-2001, by Tim Peters (tim@python.org).
+# Major enhancements and refactoring by:
+#     Jim Fulton
+#     Edward Loper
+
+# Provided as-is; use at your own risk; no warranty; no promises; enjoy!
+#
+# Modified for inclusion in nose to provide support for DocFileTest in
+# python 2.3:
+#
+# - all doctests removed from module (they fail under 2.3 and 2.5) 
+# - now handles the $py.class extension when ran under Jython
+
+r"""Module doctest -- a framework for running examples in docstrings.
+
+In simplest use, end each module M to be tested with:
+
+def _test():
+    import doctest
+    doctest.testmod()
+
+if __name__ == "__main__":
+    _test()
+
+Then running the module as a script will cause the examples in the
+docstrings to get executed and verified:
+
+python M.py
+
+This won't display anything unless an example fails, in which case the
+failing example(s) and the cause(s) of the failure(s) are printed to stdout
+(why not stderr? because stderr is a lame hack <0.2 wink>), and the final
+line of output is "Test failed.".
+
+Run it with the -v switch instead:
+
+python M.py -v
+
+and a detailed report of all examples tried is printed to stdout, along
+with assorted summaries at the end.
+
+You can force verbose mode by passing "verbose=True" to testmod, or prohibit
+it by passing "verbose=False".  In either of those cases, sys.argv is not
+examined by testmod.
+
+There are a variety of other ways to run doctests, including integration
+with the unittest framework, and support for running non-Python text
+files containing doctests.  There are also many ways to override parts
+of doctest's default behaviors.  See the Library Reference Manual for
+details.
+"""
+
+__docformat__ = 'reStructuredText en'
+
+__all__ = [
+    # 0, Option Flags
+    'register_optionflag',
+    'DONT_ACCEPT_TRUE_FOR_1',
+    'DONT_ACCEPT_BLANKLINE',
+    'NORMALIZE_WHITESPACE',
+    'ELLIPSIS',
+    'IGNORE_EXCEPTION_DETAIL',
+    'COMPARISON_FLAGS',
+    'REPORT_UDIFF',
+    'REPORT_CDIFF',
+    'REPORT_NDIFF',
+    'REPORT_ONLY_FIRST_FAILURE',
+    'REPORTING_FLAGS',
+    # 1. Utility Functions
+    'is_private',
+    # 2. Example & DocTest
+    'Example',
+    'DocTest',
+    # 3. Doctest Parser
+    'DocTestParser',
+    # 4. Doctest Finder
+    'DocTestFinder',
+    # 5. Doctest Runner
+    'DocTestRunner',
+    'OutputChecker',
+    'DocTestFailure',
+    'UnexpectedException',
+    'DebugRunner',
+    # 6. Test Functions
+    'testmod',
+    'testfile',
+    'run_docstring_examples',
+    # 7. Tester
+    'Tester',
+    # 8. Unittest Support
+    'DocTestSuite',
+    'DocFileSuite',
+    'set_unittest_reportflags',
+    # 9. Debugging Support
+    'script_from_examples',
+    'testsource',
+    'debug_src',
+    'debug',
+]
+
+import __future__
+
+import sys, traceback, inspect, linecache, os, re
+import unittest, difflib, pdb, tempfile
+import warnings
+from StringIO import StringIO
+
+# Don't whine about the deprecated is_private function in this
+# module's tests.
+warnings.filterwarnings("ignore", "is_private", DeprecationWarning,
+                        __name__, 0)
+
+# There are 4 basic classes:
+#  - Example: a <source, want> pair, plus an intra-docstring line number.
+#  - DocTest: a collection of examples, parsed from a docstring, plus
+#    info about where the docstring came from (name, filename, lineno).
+#  - DocTestFinder: extracts DocTests from a given object's docstring and
+#    its contained objects' docstrings.
+#  - DocTestRunner: runs DocTest cases, and accumulates statistics.
+#
+# So the basic picture is:
+#
+#                             list of:
+# +------+                   +---------+                   +-------+
+# |object| --DocTestFinder-> | DocTest | --DocTestRunner-> |results|
+# +------+                   +---------+                   +-------+
+#                            | Example |
+#                            |   ...   |
+#                            | Example |
+#                            +---------+
+
+# Option constants.
+
+OPTIONFLAGS_BY_NAME = {}
+def register_optionflag(name):
+    # Create a new flag unless `name` is already known.
+    return OPTIONFLAGS_BY_NAME.setdefault(name, 1 << len(OPTIONFLAGS_BY_NAME))
+
+DONT_ACCEPT_TRUE_FOR_1 = register_optionflag('DONT_ACCEPT_TRUE_FOR_1')
+DONT_ACCEPT_BLANKLINE = register_optionflag('DONT_ACCEPT_BLANKLINE')
+NORMALIZE_WHITESPACE = register_optionflag('NORMALIZE_WHITESPACE')
+ELLIPSIS = register_optionflag('ELLIPSIS')
+IGNORE_EXCEPTION_DETAIL = register_optionflag('IGNORE_EXCEPTION_DETAIL')
+
+COMPARISON_FLAGS = (DONT_ACCEPT_TRUE_FOR_1 |
+                    DONT_ACCEPT_BLANKLINE |
+                    NORMALIZE_WHITESPACE |
+                    ELLIPSIS |
+                    IGNORE_EXCEPTION_DETAIL)
+
+REPORT_UDIFF = register_optionflag('REPORT_UDIFF')
+REPORT_CDIFF = register_optionflag('REPORT_CDIFF')
+REPORT_NDIFF = register_optionflag('REPORT_NDIFF')
+REPORT_ONLY_FIRST_FAILURE = register_optionflag('REPORT_ONLY_FIRST_FAILURE')
+
+REPORTING_FLAGS = (REPORT_UDIFF |
+                   REPORT_CDIFF |
+                   REPORT_NDIFF |
+                   REPORT_ONLY_FIRST_FAILURE)
+
+# Special string markers for use in `want` strings:
+BLANKLINE_MARKER = '<BLANKLINE>'
+ELLIPSIS_MARKER = '...'
+
+######################################################################
+## Table of Contents
+######################################################################
+#  1. Utility Functions
+#  2. Example & DocTest -- store test cases
+#  3. DocTest Parser -- extracts examples from strings
+#  4. DocTest Finder -- extracts test cases from objects
+#  5. DocTest Runner -- runs test cases
+#  6. Test Functions -- convenient wrappers for testing
+#  7. Tester Class -- for backwards compatibility
+#  8. Unittest Support
+#  9. Debugging Support
+# 10. Example Usage
+
+######################################################################
+## 1. Utility Functions
+######################################################################
+
+def is_private(prefix, base):
+    """prefix, base -> true iff name prefix + "." + base is "private".
+
+    Prefix may be an empty string, and base does not contain a period.
+    Prefix is ignored (although functions you write conforming to this
+    protocol may make use of it).
+    Return true iff base begins with an (at least one) underscore, but
+    does not both begin and end with (at least) two underscores.
+    """
+    warnings.warn("is_private is deprecated; it wasn't useful; "
+                  "examine DocTestFinder.find() lists instead",
+                  DeprecationWarning, stacklevel=2)
+    return base[:1] == "_" and not base[:2] == "__" == base[-2:]
+
+def _extract_future_flags(globs):
+    """
+    Return the compiler-flags associated with the future features that
+    have been imported into the given namespace (globs).
+    """
+    flags = 0
+    for fname in __future__.all_feature_names:
+        feature = globs.get(fname, None)
+        if feature is getattr(__future__, fname):
+            flags |= feature.compiler_flag
+    return flags
+
+def _normalize_module(module, depth=2):
+    """
+    Return the module specified by `module`.  In particular:
+      - If `module` is a module, then return module.
+      - If `module` is a string, then import and return the
+        module with that name.
+      - If `module` is None, then return the calling module.
+        The calling module is assumed to be the module of
+        the stack frame at the given depth in the call stack.
+    """
+    if inspect.ismodule(module):
+        return module
+    elif isinstance(module, (str, unicode)):
+        return __import__(module, globals(), locals(), ["*"])
+    elif module is None:
+        return sys.modules[sys._getframe(depth).f_globals['__name__']]
+    else:
+        raise TypeError("Expected a module, string, or None")
+
+def _indent(s, indent=4):
+    """
+    Add the given number of space characters to the beginning every
+    non-blank line in `s`, and return the result.
+    """
+    # This regexp matches the start of non-blank lines:
+    return re.sub('(?m)^(?!$)', indent*' ', s)
+
+def _exception_traceback(exc_info):
+    """
+    Return a string containing a traceback message for the given
+    exc_info tuple (as returned by sys.exc_info()).
+    """
+    # Get a traceback message.
+    excout = StringIO()
+    exc_type, exc_val, exc_tb = exc_info
+    traceback.print_exception(exc_type, exc_val, exc_tb, file=excout)
+    return excout.getvalue()
+
+# Override some StringIO methods.
+class _SpoofOut(StringIO):
+    def getvalue(self):
+        result = StringIO.getvalue(self)
+        # If anything at all was written, make sure there's a trailing
+        # newline.  There's no way for the expected output to indicate
+        # that a trailing newline is missing.
+        if result and not result.endswith("\n"):
+            result += "\n"
+        # Prevent softspace from screwing up the next test case, in
+        # case they used print with a trailing comma in an example.
+        if hasattr(self, "softspace"):
+            del self.softspace
+        return result
+
+    def truncate(self,   size=None):
+        StringIO.truncate(self, size)
+        if hasattr(self, "softspace"):
+            del self.softspace
+
+# Worst-case linear-time ellipsis matching.
+def _ellipsis_match(want, got):
+    if ELLIPSIS_MARKER not in want:
+        return want == got
+
+    # Find "the real" strings.
+    ws = want.split(ELLIPSIS_MARKER)
+    assert len(ws) >= 2
+
+    # Deal with exact matches possibly needed at one or both ends.
+    startpos, endpos = 0, len(got)
+    w = ws[0]
+    if w:   # starts with exact match
+        if got.startswith(w):
+            startpos = len(w)
+            del ws[0]
+        else:
+            return False
+    w = ws[-1]
+    if w:   # ends with exact match
+        if got.endswith(w):
+            endpos -= len(w)
+            del ws[-1]
+        else:
+            return False
+
+    if startpos > endpos:
+        # Exact end matches required more characters than we have, as in
+        # _ellipsis_match('aa...aa', 'aaa')
+        return False
+
+    # For the rest, we only need to find the leftmost non-overlapping
+    # match for each piece.  If there's no overall match that way alone,
+    # there's no overall match period.
+    for w in ws:
+        # w may be '' at times, if there are consecutive ellipses, or
+        # due to an ellipsis at the start or end of `want`.  That's OK.
+        # Search for an empty string succeeds, and doesn't change startpos.
+        startpos = got.find(w, startpos, endpos)
+        if startpos < 0:
+            return False
+        startpos += len(w)
+
+    return True
+
+def _comment_line(line):
+    "Return a commented form of the given line"
+    line = line.rstrip()
+    if line:
+        return '# '+line
+    else:
+        return '#'
+
+class _OutputRedirectingPdb(pdb.Pdb):
+    """
+    A specialized version of the python debugger that redirects stdout
+    to a given stream when interacting with the user.  Stdout is *not*
+    redirected when traced code is executed.
+    """
+    def __init__(self, out):
+        self.__out = out
+        pdb.Pdb.__init__(self)
+
+    def trace_dispatch(self, *args):
+        # Redirect stdout to the given stream.
+        save_stdout = sys.stdout
+        sys.stdout = self.__out
+        # Call Pdb's trace dispatch method.
+        try:
+            return pdb.Pdb.trace_dispatch(self, *args)
+        finally:
+            sys.stdout = save_stdout
+
+# [XX] Normalize with respect to os.path.pardir?
+def _module_relative_path(module, path):
+    if not inspect.ismodule(module):
+        raise TypeError, 'Expected a module: %r' % module
+    if path.startswith('/'):
+        raise ValueError, 'Module-relative files may not have absolute paths'
+
+    # Find the base directory for the path.
+    if hasattr(module, '__file__'):
+        # A normal module/package
+        basedir = os.path.split(module.__file__)[0]
+    elif module.__name__ == '__main__':
+        # An interactive session.
+        if len(sys.argv)>0 and sys.argv[0] != '':
+            basedir = os.path.split(sys.argv[0])[0]
+        else:
+            basedir = os.curdir
+    else:
+        # A module w/o __file__ (this includes builtins)
+        raise ValueError("Can't resolve paths relative to the module " +
+                         module + " (it has no __file__)")
+
+    # Combine the base directory and the path.
+    return os.path.join(basedir, *(path.split('/')))
+
+######################################################################
+## 2. Example & DocTest
+######################################################################
+## - An "example" is a <source, want> pair, where "source" is a
+##   fragment of source code, and "want" is the expected output for
+##   "source."  The Example class also includes information about
+##   where the example was extracted from.
+##
+## - A "doctest" is a collection of examples, typically extracted from
+##   a string (such as an object's docstring).  The DocTest class also
+##   includes information about where the string was extracted from.
+
+class Example:
+    """
+    A single doctest example, consisting of source code and expected
+    output.  `Example` defines the following attributes:
+
+      - source: A single Python statement, always ending with a newline.
+        The constructor adds a newline if needed.
+
+      - want: The expected output from running the source code (either
+        from stdout, or a traceback in case of exception).  `want` ends
+        with a newline unless it's empty, in which case it's an empty
+        string.  The constructor adds a newline if needed.
+
+      - exc_msg: The exception message generated by the example, if
+        the example is expected to generate an exception; or `None` if
+        it is not expected to generate an exception.  This exception
+        message is compared against the return value of
+        `traceback.format_exception_only()`.  `exc_msg` ends with a
+        newline unless it's `None`.  The constructor adds a newline
+        if needed.
+
+      - lineno: The line number within the DocTest string containing
+        this Example where the Example begins.  This line number is
+        zero-based, with respect to the beginning of the DocTest.
+
+      - indent: The example's indentation in the DocTest string.
+        I.e., the number of space characters that preceed the
+        example's first prompt.
+
+      - options: A dictionary mapping from option flags to True or
+        False, which is used to override default options for this
+        example.  Any option flags not contained in this dictionary
+        are left at their default value (as specified by the
+        DocTestRunner's optionflags).  By default, no options are set.
+    """
+    def __init__(self, source, want, exc_msg=None, lineno=0, indent=0,
+                 options=None):
+        # Normalize inputs.
+        if not source.endswith('\n'):
+            source += '\n'
+        if want and not want.endswith('\n'):
+            want += '\n'
+        if exc_msg is not None and not exc_msg.endswith('\n'):
+            exc_msg += '\n'
+        # Store properties.
+        self.source = source
+        self.want = want
+        self.lineno = lineno
+        self.indent = indent
+        if options is None: options = {}
+        self.options = options
+        self.exc_msg = exc_msg
+
+class DocTest:
+    """
+    A collection of doctest examples that should be run in a single
+    namespace.  Each `DocTest` defines the following attributes:
+
+      - examples: the list of examples.
+
+      - globs: The namespace (aka globals) that the examples should
+        be run in.
+
+      - name: A name identifying the DocTest (typically, the name of
+        the object whose docstring this DocTest was extracted from).
+
+      - filename: The name of the file that this DocTest was extracted
+        from, or `None` if the filename is unknown.
+
+      - lineno: The line number within filename where this DocTest
+        begins, or `None` if the line number is unavailable.  This
+        line number is zero-based, with respect to the beginning of
+        the file.
+
+      - docstring: The string that the examples were extracted from,
+        or `None` if the string is unavailable.
+    """
+    def __init__(self, examples, globs, name, filename, lineno, docstring):
+        """
+        Create a new DocTest containing the given examples.  The
+        DocTest's globals are initialized with a copy of `globs`.
+        """
+        assert not isinstance(examples, basestring), \
+               "DocTest no longer accepts str; use DocTestParser instead"
+        self.examples = examples
+        self.docstring = docstring
+        self.globs = globs.copy()
+        self.name = name
+        self.filename = filename
+        self.lineno = lineno
+
+    def __repr__(self):
+        if len(self.examples) == 0:
+            examples = 'no examples'
+        elif len(self.examples) == 1:
+            examples = '1 example'
+        else:
+            examples = '%d examples' % len(self.examples)
+        return ('<DocTest %s from %s:%s (%s)>' %
+                (self.name, self.filename, self.lineno, examples))
+
+
+    # This lets us sort tests by name:
+    def __cmp__(self, other):
+        if not isinstance(other, DocTest):
+            return -1
+        return cmp((self.name, self.filename, self.lineno, id(self)),
+                   (other.name, other.filename, other.lineno, id(other)))
+
+######################################################################
+## 3. DocTestParser
+######################################################################
+
+class DocTestParser:
+    """
+    A class used to parse strings containing doctest examples.
+    """
+    # This regular expression is used to find doctest examples in a
+    # string.  It defines three groups: `source` is the source code
+    # (including leading indentation and prompts); `indent` is the
+    # indentation of the first (PS1) line of the source code; and
+    # `want` is the expected output (including leading indentation).
+    _EXAMPLE_RE = re.compile(r'''
+        # Source consists of a PS1 line followed by zero or more PS2 lines.
+        (?P<source>
+            (?:^(?P<indent> [ ]*) >>>    .*)    # PS1 line
+            (?:\n           [ ]*  \.\.\. .*)*)  # PS2 lines
+        \n?
+        # Want consists of any non-blank lines that do not start with PS1.
+        (?P<want> (?:(?![ ]*$)    # Not a blank line
+                     (?![ ]*>>>)  # Not a line starting with PS1
+                     .*$\n?       # But any other line
+                  )*)
+        ''', re.MULTILINE | re.VERBOSE)
+
+    # A regular expression for handling `want` strings that contain
+    # expected exceptions.  It divides `want` into three pieces:
+    #    - the traceback header line (`hdr`)
+    #    - the traceback stack (`stack`)
+    #    - the exception message (`msg`), as generated by
+    #      traceback.format_exception_only()
+    # `msg` may have multiple lines.  We assume/require that the
+    # exception message is the first non-indented line starting with a word
+    # character following the traceback header line.
+    _EXCEPTION_RE = re.compile(r"""
+        # Grab the traceback header.  Different versions of Python have
+        # said different things on the first traceback line.
+        ^(?P<hdr> Traceback\ \(
+            (?: most\ recent\ call\ last
+            |   innermost\ last
+            ) \) :
+        )
+        \s* $                # toss trailing whitespace on the header.
+        (?P<stack> .*?)      # don't blink: absorb stuff until...
+        ^ (?P<msg> \w+ .*)   #     a line *starts* with alphanum.
+        """, re.VERBOSE | re.MULTILINE | re.DOTALL)
+
+    # A callable returning a true value iff its argument is a blank line
+    # or contains a single comment.
+    _IS_BLANK_OR_COMMENT = re.compile(r'^[ ]*(#.*)?$').match
+
+    def parse(self, string, name='<string>'):
+        """
+        Divide the given string into examples and intervening text,
+        and return them as a list of alternating Examples and strings.
+        Line numbers for the Examples are 0-based.  The optional
+        argument `name` is a name identifying this string, and is only
+        used for error messages.
+        """
+        string = string.expandtabs()
+        # If all lines begin with the same indentation, then strip it.
+        min_indent = self._min_indent(string)
+        if min_indent > 0:
+            string = '\n'.join([l[min_indent:] for l in string.split('\n')])
+
+        output = []
+        charno, lineno = 0, 0
+        # Find all doctest examples in the string:
+        for m in self._EXAMPLE_RE.finditer(string):
+            # Add the pre-example text to `output`.
+            output.append(string[charno:m.start()])
+            # Update lineno (lines before this example)
+            lineno += string.count('\n', charno, m.start())
+            # Extract info from the regexp match.
+            (source, options, want, exc_msg) = \
+                     self._parse_example(m, name, lineno)
+            # Create an Example, and add it to the list.
+            if not self._IS_BLANK_OR_COMMENT(source):
+                output.append( Example(source, want, exc_msg,
+                                    lineno=lineno,
+                                    indent=min_indent+len(m.group('indent')),
+                                    options=options) )
+            # Update lineno (lines inside this example)
+            lineno += string.count('\n', m.start(), m.end())
+            # Update charno.
+            charno = m.end()
+        # Add any remaining post-example text to `output`.
+        output.append(string[charno:])
+        return output
+
+    def get_doctest(self, string, globs, name, filename, lineno):
+        """
+        Extract all doctest examples from the given string, and
+        collect them into a `DocTest` object.
+
+        `globs`, `name`, `filename`, and `lineno` are attributes for
+        the new `DocTest` object.  See the documentation for `DocTest`
+        for more information.
+        """
+        return DocTest(self.get_examples(string, name), globs,
+                       name, filename, lineno, string)
+
+    def get_examples(self, string, name='<string>'):
+        """
+        Extract all doctest examples from the given string, and return
+        them as a list of `Example` objects.  Line numbers are
+        0-based, because it's most common in doctests that nothing
+        interesting appears on the same line as opening triple-quote,
+        and so the first interesting line is called \"line 1\" then.
+
+        The optional argument `name` is a name identifying this
+        string, and is only used for error messages.
+        """
+        return [x for x in self.parse(string, name)
+                if isinstance(x, Example)]
+
+    def _parse_example(self, m, name, lineno):
+        """
+        Given a regular expression match from `_EXAMPLE_RE` (`m`),
+        return a pair `(source, want)`, where `source` is the matched
+        example's source code (with prompts and indentation stripped);
+        and `want` is the example's expected output (with indentation
+        stripped).
+
+        `name` is the string's name, and `lineno` is the line number
+        where the example starts; both are used for error messages.
+        """
+        # Get the example's indentation level.
+        indent = len(m.group('indent'))
+
+        # Divide source into lines; check that they're properly
+        # indented; and then strip their indentation & prompts.
+        source_lines = m.group('source').split('\n')
+        self._check_prompt_blank(source_lines, indent, name, lineno)
+        self._check_prefix(source_lines[1:], ' '*indent + '.', name, lineno)
+        source = '\n'.join([sl[indent+4:] for sl in source_lines])
+
+        # Divide want into lines; check that it's properly indented; and
+        # then strip the indentation.  Spaces before the last newline should
+        # be preserved, so plain rstrip() isn't good enough.
+        want = m.group('want')
+        want_lines = want.split('\n')
+        if len(want_lines) > 1 and re.match(r' *$', want_lines[-1]):
+            del want_lines[-1]  # forget final newline & spaces after it
+        self._check_prefix(want_lines, ' '*indent, name,
+                           lineno + len(source_lines))
+        want = '\n'.join([wl[indent:] for wl in want_lines])
+
+        # If `want` contains a traceback message, then extract it.
+        m = self._EXCEPTION_RE.match(want)
+        if m:
+            exc_msg = m.group('msg')
+        else:
+            exc_msg = None
+
+        # Extract options from the source.
+        options = self._find_options(source, name, lineno)
+
+        return source, options, want, exc_msg
+
+    # This regular expression looks for option directives in the
+    # source code of an example.  Option directives are comments
+    # starting with "doctest:".  Warning: this may give false
+    # positives for string-literals that contain the string
+    # "#doctest:".  Eliminating these false positives would require
+    # actually parsing the string; but we limit them by ignoring any
+    # line containing "#doctest:" that is *followed* by a quote mark.
+    _OPTION_DIRECTIVE_RE = re.compile(r'#\s*doctest:\s*([^\n\'"]*)$',
+                                      re.MULTILINE)
+
+    def _find_options(self, source, name, lineno):
+        """
+        Return a dictionary containing option overrides extracted from
+        option directives in the given source string.
+
+        `name` is the string's name, and `lineno` is the line number
+        where the example starts; both are used for error messages.
+        """
+        options = {}
+        # (note: with the current regexp, this will match at most once:)
+        for m in self._OPTION_DIRECTIVE_RE.finditer(source):
+            option_strings = m.group(1).replace(',', ' ').split()
+            for option in option_strings:
+                if (option[0] not in '+-' or
+                    option[1:] not in OPTIONFLAGS_BY_NAME):
+                    raise ValueError('line %r of the doctest for %s '
+                                     'has an invalid option: %r' %
+                                     (lineno+1, name, option))
+                flag = OPTIONFLAGS_BY_NAME[option[1:]]
+                options[flag] = (option[0] == '+')
+        if options and self._IS_BLANK_OR_COMMENT(source):
+            raise ValueError('line %r of the doctest for %s has an option '
+                             'directive on a line with no example: %r' %
+                             (lineno, name, source))
+        return options
+
+    # This regular expression finds the indentation of every non-blank
+    # line in a string.
+    _INDENT_RE = re.compile('^([ ]*)(?=\S)', re.MULTILINE)
+
+    def _min_indent(self, s):
+        "Return the minimum indentation of any non-blank line in `s`"
+        indents = [len(indent) for indent in self._INDENT_RE.findall(s)]
+        if len(indents) > 0:
+            return min(indents)
+        else:
+            return 0
+
+    def _check_prompt_blank(self, lines, indent, name, lineno):
+        """
+        Given the lines of a source string (including prompts and
+        leading indentation), check to make sure that every prompt is
+        followed by a space character.  If any line is not followed by
+        a space character, then raise ValueError.
+        """
+        for i, line in enumerate(lines):
+            if len(line) >= indent+4 and line[indent+3] != ' ':
+                raise ValueError('line %r of the docstring for %s '
+                                 'lacks blank after %s: %r' %
+                                 (lineno+i+1, name,
+                                  line[indent:indent+3], line))
+
+    def _check_prefix(self, lines, prefix, name, lineno):
+        """
+        Check that every line in the given list starts with the given
+        prefix; if any line does not, then raise a ValueError.
+        """
+        for i, line in enumerate(lines):
+            if line and not line.startswith(prefix):
+                raise ValueError('line %r of the docstring for %s has '
+                                 'inconsistent leading whitespace: %r' %
+                                 (lineno+i+1, name, line))
+
+
+######################################################################
+## 4. DocTest Finder
+######################################################################
+
+class DocTestFinder:
+    """
+    A class used to extract the DocTests that are relevant to a given
+    object, from its docstring and the docstrings of its contained
+    objects.  Doctests can currently be extracted from the following
+    object types: modules, functions, classes, methods, staticmethods,
+    classmethods, and properties.
+    """
+
+    def __init__(self, verbose=False, parser=DocTestParser(),
+                 recurse=True, _namefilter=None, exclude_empty=True):
+        """
+        Create a new doctest finder.
+
+        The optional argument `parser` specifies a class or
+        function that should be used to create new DocTest objects (or
+        objects that implement the same interface as DocTest).  The
+        signature for this factory function should match the signature
+        of the DocTest constructor.
+
+        If the optional argument `recurse` is false, then `find` will
+        only examine the given object, and not any contained objects.
+
+        If the optional argument `exclude_empty` is false, then `find`
+        will include tests for objects with empty docstrings.
+        """
+        self._parser = parser
+        self._verbose = verbose
+        self._recurse = recurse
+        self._exclude_empty = exclude_empty
+        # _namefilter is undocumented, and exists only for temporary backward-
+        # compatibility support of testmod's deprecated isprivate mess.
+        self._namefilter = _namefilter
+
+    def find(self, obj, name=None, module=None, globs=None,
+             extraglobs=None):
+        """
+        Return a list of the DocTests that are defined by the given
+        object's docstring, or by any of its contained objects'
+        docstrings.
+
+        The optional parameter `module` is the module that contains
+        the given object.  If the module is not specified or is None, then
+        the test finder will attempt to automatically determine the
+        correct module.  The object's module is used:
+
+            - As a default namespace, if `globs` is not specified.
+            - To prevent the DocTestFinder from extracting DocTests
+              from objects that are imported from other modules.
+            - To find the name of the file containing the object.
+            - To help find the line number of the object within its
+              file.
+
+        Contained objects whose module does not match `module` are ignored.
+
+        If `module` is False, no attempt to find the module will be made.
+        This is obscure, of use mostly in tests:  if `module` is False, or
+        is None but cannot be found automatically, then all objects are
+        considered to belong to the (non-existent) module, so all contained
+        objects will (recursively) be searched for doctests.
+
+        The globals for each DocTest is formed by combining `globs`
+        and `extraglobs` (bindings in `extraglobs` override bindings
+        in `globs`).  A new copy of the globals dictionary is created
+        for each DocTest.  If `globs` is not specified, then it
+        defaults to the module's `__dict__`, if specified, or {}
+        otherwise.  If `extraglobs` is not specified, then it defaults
+        to {}.
+
+        """
+        # If name was not specified, then extract it from the object.
+        if name is None:
+            name = getattr(obj, '__name__', None)
+            if name is None:
+                raise ValueError("DocTestFinder.find: name must be given "
+                        "when obj.__name__ doesn't exist: %r" %
+                                 (type(obj),))
+
+        # Find the module that contains the given object (if obj is
+        # a module, then module=obj.).  Note: this may fail, in which
+        # case module will be None.
+        if module is False:
+            module = None
+        elif module is None:
+            module = inspect.getmodule(obj)
+
+        # Read the module's source code.  This is used by
+        # DocTestFinder._find_lineno to find the line number for a
+        # given object's docstring.
+        try:
+            file = inspect.getsourcefile(obj) or inspect.getfile(obj)
+            source_lines = linecache.getlines(file)
+            if not source_lines:
+                source_lines = None
+        except TypeError:
+            source_lines = None
+
+        # Initialize globals, and merge in extraglobs.
+        if globs is None:
+            if module is None:
+                globs = {}
+            else:
+                globs = module.__dict__.copy()
+        else:
+            globs = globs.copy()
+        if extraglobs is not None:
+            globs.update(extraglobs)
+
+        # Recursively expore `obj`, extracting DocTests.
+        tests = []
+        self._find(tests, obj, name, module, source_lines, globs, {})
+        # Sort the tests by alpha order of names, for consistency in
+        # verbose-mode output.  This was a feature of doctest in Pythons
+        # <= 2.3 that got lost by accident in 2.4.  It was repaired in
+        # 2.4.4 and 2.5.
+        tests.sort()
+        return tests
+
+    def _filter(self, obj, prefix, base):
+        """
+        Return true if the given object should not be examined.
+        """
+        return (self._namefilter is not None and
+                self._namefilter(prefix, base))
+
+    def _from_module(self, module, object):
+        """
+        Return true if the given object is defined in the given
+        module.
+        """
+        if module is None:
+            return True
+        elif inspect.isfunction(object):
+            return module.__dict__ is object.func_globals
+        elif inspect.isclass(object):
+            # Some jython classes don't set __module__
+            return module.__name__ == getattr(object, '__module__', None)
+        elif inspect.getmodule(object) is not None:
+            return module is inspect.getmodule(object)
+        elif hasattr(object, '__module__'):
+            return module.__name__ == object.__module__
+        elif isinstance(object, property):
+            return True # [XX] no way not be sure.
+        else:
+            raise ValueError("object must be a class or function")
+
+    def _find(self, tests, obj, name, module, source_lines, globs, seen):
+        """
+        Find tests for the given object and any contained objects, and
+        add them to `tests`.
+        """
+        if self._verbose:
+            print 'Finding tests in %s' % name
+
+        # If we've already processed this object, then ignore it.
+        if id(obj) in seen:
+            return
+        seen[id(obj)] = 1
+
+        # Find a test for this object, and add it to the list of tests.
+        test = self._get_test(obj, name, module, globs, source_lines)
+        if test is not None:
+            tests.append(test)
+
+        # Look for tests in a module's contained objects.
+        if inspect.ismodule(obj) and self._recurse:
+            for valname, val in obj.__dict__.items():
+                # Check if this contained object should be ignored.
+                if self._filter(val, name, valname):
+                    continue
+                valname = '%s.%s' % (name, valname)
+                # Recurse to functions & classes.
+                if ((inspect.isfunction(val) or inspect.isclass(val)) and
+                    self._from_module(module, val)):
+                    self._find(tests, val, valname, module, source_lines,
+                               globs, seen)
+
+        # Look for tests in a module's __test__ dictionary.
+        if inspect.ismodule(obj) and self._recurse:
+            for valname, val in getattr(obj, '__test__', {}).items():
+                if not isinstance(valname, basestring):
+                    raise ValueError("DocTestFinder.find: __test__ keys "
+                                     "must be strings: %r" %
+                                     (type(valname),))
+                if not (inspect.isfunction(val) or inspect.isclass(val) or
+                        inspect.ismethod(val) or inspect.ismodule(val) or
+                        isinstance(val, basestring)):
+                    raise ValueError("DocTestFinder.find: __test__ values "
+                                     "must be strings, functions, methods, "
+                                     "classes, or modules: %r" %
+                                     (type(val),))
+                valname = '%s.__test__.%s' % (name, valname)
+                self._find(tests, val, valname, module, source_lines,
+                           globs, seen)
+
+        # Look for tests in a class's contained objects.
+        if inspect.isclass(obj) and self._recurse:
+            for valname, val in obj.__dict__.items():
+                # Check if this contained object should be ignored.
+                if self._filter(val, name, valname):
+                    continue
+                # Special handling for staticmethod/classmethod.
+                if isinstance(val, staticmethod):
+                    val = getattr(obj, valname)
+                if isinstance(val, classmethod):
+                    val = getattr(obj, valname).im_func
+
+                # Recurse to methods, properties, and nested classes.
+                if ((inspect.isfunction(val) or inspect.isclass(val) or
+                      isinstance(val, property)) and
+                      self._from_module(module, val)):
+                    valname = '%s.%s' % (name, valname)
+                    self._find(tests, val, valname, module, source_lines,
+                               globs, seen)
+
+    def _get_test(self, obj, name, module, globs, source_lines):
+        """
+        Return a DocTest for the given object, if it defines a docstring;
+        otherwise, return None.
+        """
+        # Extract the object's docstring.  If it doesn't have one,
+        # then return None (no test for this object).
+        if isinstance(obj, basestring):
+            docstring = obj
+        else:
+            try:
+                if obj.__doc__ is None:
+                    docstring = ''
+                else:
+                    docstring = obj.__doc__
+                    if not isinstance(docstring, basestring):
+                        docstring = str(docstring)
+            except (TypeError, AttributeError):
+                docstring = ''
+
+        # Find the docstring's location in the file.
+        lineno = self._find_lineno(obj, source_lines)
+
+        # Don't bother if the docstring is empty.
+        if self._exclude_empty and not docstring:
+            return None
+
+        # Return a DocTest for this object.
+        if module is None:
+            filename = None
+        else:
+            filename = getattr(module, '__file__', module.__name__)
+            if filename[-4:] in (".pyc", ".pyo"):
+                filename = filename[:-1]
+            elif sys.platform.startswith('java') and \
+                    filename.endswith('$py.class'):
+                filename = '%s.py' % filename[:-9]
+        return self._parser.get_doctest(docstring, globs, name,
+                                        filename, lineno)
+
+    def _find_lineno(self, obj, source_lines):
+        """
+        Return a line number of the given object's docstring.  Note:
+        this method assumes that the object has a docstring.
+        """
+        lineno = None
+
+        # Find the line number for modules.
+        if inspect.ismodule(obj):
+            lineno = 0
+
+        # Find the line number for classes.
+        # Note: this could be fooled if a class is defined multiple
+        # times in a single file.
+        if inspect.isclass(obj):
+            if source_lines is None:
+                return None
+            pat = re.compile(r'^\s*class\s*%s\b' %
+                             getattr(obj, '__name__', '-'))
+            for i, line in enumerate(source_lines):
+                if pat.match(line):
+                    lineno = i
+                    break
+
+        # Find the line number for functions & methods.
+        if inspect.ismethod(obj): obj = obj.im_func
+        if inspect.isfunction(obj): obj = obj.func_code
+        if inspect.istraceback(obj): obj = obj.tb_frame
+        if inspect.isframe(obj): obj = obj.f_code
+        if inspect.iscode(obj):
+            lineno = getattr(obj, 'co_firstlineno', None)-1
+
+        # Find the line number where the docstring starts.  Assume
+        # that it's the first line that begins with a quote mark.
+        # Note: this could be fooled by a multiline function
+        # signature, where a continuation line begins with a quote
+        # mark.
+        if lineno is not None:
+            if source_lines is None:
+                return lineno+1
+            pat = re.compile('(^|.*:)\s*\w*("|\')')
+            for lineno in range(lineno, len(source_lines)):
+                if pat.match(source_lines[lineno]):
+                    return lineno
+
+        # We couldn't find the line number.
+        return None
+
+######################################################################
+## 5. DocTest Runner
+######################################################################
+
+class DocTestRunner:
+    # This divider string is used to separate failure messages, and to
+    # separate sections of the summary.
+    DIVIDER = "*" * 70
+
+    def __init__(self, checker=None, verbose=None, optionflags=0):
+        """
+        Create a new test runner.
+
+        Optional keyword arg `checker` is the `OutputChecker` that
+        should be used to compare the expected outputs and actual
+        outputs of doctest examples.
+
+        Optional keyword arg 'verbose' prints lots of stuff if true,
+        only failures if false; by default, it's true iff '-v' is in
+        sys.argv.
+
+        Optional argument `optionflags` can be used to control how the
+        test runner compares expected output to actual output, and how
+        it displays failures.  See the documentation for `testmod` for
+        more information.
+        """
+        self._checker = checker or OutputChecker()
+        if verbose is None:
+            verbose = '-v' in sys.argv
+        self._verbose = verbose
+        self.optionflags = optionflags
+        self.original_optionflags = optionflags
+
+        # Keep track of the examples we've run.
+        self.tries = 0
+        self.failures = 0
+        self._name2ft = {}
+
+        # Create a fake output target for capturing doctest output.
+        self._fakeout = _SpoofOut()
+
+    #/////////////////////////////////////////////////////////////////
+    # Reporting methods
+    #/////////////////////////////////////////////////////////////////
+
+    def report_start(self, out, test, example):
+        """
+        Report that the test runner is about to process the given
+        example.  (Only displays a message if verbose=True)
+        """
+        if self._verbose:
+            if example.want:
+                out('Trying:\n' + _indent(example.source) +
+                    'Expecting:\n' + _indent(example.want))
+            else:
+                out('Trying:\n' + _indent(example.source) +
+                    'Expecting nothing\n')
+
+    def report_success(self, out, test, example, got):
+        """
+        Report that the given example ran successfully.  (Only
+        displays a message if verbose=True)
+        """
+        if self._verbose:
+            out("ok\n")
+
+    def report_failure(self, out, test, example, got):
+        """
+        Report that the given example failed.
+        """
+        out(self._failure_header(test, example) +
+            self._checker.output_difference(example, got, self.optionflags))
+
+    def report_unexpected_exception(self, out, test, example, exc_info):
+        """
+        Report that the given example raised an unexpected exception.
+        """
+        out(self._failure_header(test, example) +
+            'Exception raised:\n' + _indent(_exception_traceback(exc_info)))
+
+    def _failure_header(self, test, example):
+        out = [self.DIVIDER]
+        if test.filename:
+            if test.lineno is not None and example.lineno is not None:
+                lineno = test.lineno + example.lineno + 1
+            else:
+                lineno = '?'
+            out.append('File "%s", line %s, in %s' %
+                       (test.filename, lineno, test.name))
+        else:
+            out.append('Line %s, in %s' % (example.lineno+1, test.name))
+        out.append('Failed example:')
+        source = example.source
+        out.append(_indent(source))
+        return '\n'.join(out)
+
+    #/////////////////////////////////////////////////////////////////
+    # DocTest Running
+    #/////////////////////////////////////////////////////////////////
+
+    def __run(self, test, compileflags, out):
+        """
+        Run the examples in `test`.  Write the outcome of each example
+        with one of the `DocTestRunner.report_*` methods, using the
+        writer function `out`.  `compileflags` is the set of compiler
+        flags that should be used to execute examples.  Return a tuple
+        `(f, t)`, where `t` is the number of examples tried, and `f`
+        is the number of examples that failed.  The examples are run
+        in the namespace `test.globs`.
+        """
+        # Keep track of the number of failures and tries.
+        failures = tries = 0
+
+        # Save the option flags (since option directives can be used
+        # to modify them).
+        original_optionflags = self.optionflags
+
+        SUCCESS, FAILURE, BOOM = range(3) # `outcome` state
+
+        check = self._checker.check_output
+
+        # Process each example.
+        for examplenum, example in enumerate(test.examples):
+
+            # If REPORT_ONLY_FIRST_FAILURE is set, then supress
+            # reporting after the first failure.
+            quiet = (self.optionflags & REPORT_ONLY_FIRST_FAILURE and
+                     failures > 0)
+
+            # Merge in the example's options.
+            self.optionflags = original_optionflags
+            if example.options:
+                for (optionflag, val) in example.options.items():
+                    if val:
+                        self.optionflags |= optionflag
+                    else:
+                        self.optionflags &= ~optionflag
+
+            # Record that we started this example.
+            tries += 1
+            if not quiet:
+                self.report_start(out, test, example)
+
+            # Use a special filename for compile(), so we can retrieve
+            # the source code during interactive debugging (see
+            # __patched_linecache_getlines).
+            filename = '<doctest %s[%d]>' % (test.name, examplenum)
+
+            # Run the example in the given context (globs), and record
+            # any exception that gets raised.  (But don't intercept
+            # keyboard interrupts.)
+            try:
+                # Don't blink!  This is where the user's code gets run.
+                exec compile(example.source, filename, "single",
+                             compileflags, 1) in test.globs
+                self.debugger.set_continue() # ==== Example Finished ====
+                exception = None
+            except KeyboardInterrupt:
+                raise
+            except:
+                exception = sys.exc_info()
+                self.debugger.set_continue() # ==== Example Finished ====
+
+            got = self._fakeout.getvalue()  # the actual output
+            self._fakeout.truncate(0)
+            outcome = FAILURE   # guilty until proved innocent or insane
+
+            # If the example executed without raising any exceptions,
+            # verify its output.
+            if exception is None:
+                if check(example.want, got, self.optionflags):
+                    outcome = SUCCESS
+
+            # The example raised an exception:  check if it was expected.
+            else:
+                exc_info = sys.exc_info()
+                exc_msg = traceback.format_exception_only(*exc_info[:2])[-1]
+                if not quiet:
+                    got += _exception_traceback(exc_info)
+
+                # If `example.exc_msg` is None, then we weren't expecting
+                # an exception.
+                if example.exc_msg is None:
+                    outcome = BOOM
+
+                # We expected an exception:  see whether it matches.
+                elif check(example.exc_msg, exc_msg, self.optionflags):
+                    outcome = SUCCESS
+
+                # Another chance if they didn't care about the detail.
+                elif self.optionflags & IGNORE_EXCEPTION_DETAIL:
+                    m1 = re.match(r'[^:]*:', example.exc_msg)
+                    m2 = re.match(r'[^:]*:', exc_msg)
+                    if m1 and m2 and check(m1.group(0), m2.group(0),
+                                           self.optionflags):
+                        outcome = SUCCESS
+
+            # Report the outcome.
+            if outcome is SUCCESS:
+                if not quiet:
+                    self.report_success(out, test, example, got)
+            elif outcome is FAILURE:
+                if not quiet:
+                    self.report_failure(out, test, example, got)
+                failures += 1
+            elif outcome is BOOM:
+                if not quiet:
+                    self.report_unexpected_exception(out, test, example,
+                                                     exc_info)
+                failures += 1
+            else:
+                assert False, ("unknown outcome", outcome)
+
+        # Restore the option flags (in case they were modified)
+        self.optionflags = original_optionflags
+
+        # Record and return the number of failures and tries.
+        self.__record_outcome(test, failures, tries)
+        return failures, tries
+
+    def __record_outcome(self, test, f, t):
+        """
+        Record the fact that the given DocTest (`test`) generated `f`
+        failures out of `t` tried examples.
+        """
+        f2, t2 = self._name2ft.get(test.name, (0,0))
+        self._name2ft[test.name] = (f+f2, t+t2)
+        self.failures += f
+        self.tries += t
+
+    __LINECACHE_FILENAME_RE = re.compile(r'<doctest '
+                                         r'(?P<name>[\w\.]+)'
+                                         r'\[(?P<examplenum>\d+)\]>$')
+    def __patched_linecache_getlines(self, filename):
+        m = self.__LINECACHE_FILENAME_RE.match(filename)
+        if m and m.group('name') == self.test.name:
+            example = self.test.examples[int(m.group('examplenum'))]
+            return example.source.splitlines(True)
+        else:
+            return self.save_linecache_getlines(filename)
+
+    def run(self, test, compileflags=None, out=None, clear_globs=True):
+        """
+        Run the examples in `test`, and display the results using the
+        writer function `out`.
+
+        The examples are run in the namespace `test.globs`.  If
+        `clear_globs` is true (the default), then this namespace will
+        be cleared after the test runs, to help with garbage
+        collection.  If you would like to examine the namespace after
+        the test completes, then use `clear_globs=False`.
+
+        `compileflags` gives the set of flags that should be used by
+        the Python compiler when running the examples.  If not
+        specified, then it will default to the set of future-import
+        flags that apply to `globs`.
+
+        The output of each example is checked using
+        `DocTestRunner.check_output`, and the results are formatted by
+        the `DocTestRunner.report_*` methods.
+        """
+        self.test = test
+
+        if compileflags is None:
+            compileflags = _extract_future_flags(test.globs)
+
+        save_stdout = sys.stdout
+        if out is None:
+            out = save_stdout.write
+        sys.stdout = self._fakeout
+
+        # Patch pdb.set_trace to restore sys.stdout during interactive
+        # debugging (so it's not still redirected to self._fakeout).
+        # Note that the interactive output will go to *our*
+        # save_stdout, even if that's not the real sys.stdout; this
+        # allows us to write test cases for the set_trace behavior.
+        save_set_trace = pdb.set_trace
+        self.debugger = _OutputRedirectingPdb(save_stdout)
+        self.debugger.reset()
+        pdb.set_trace = self.debugger.set_trace
+
+        # Patch linecache.getlines, so we can see the example's source
+        # when we're inside the debugger.
+        self.save_linecache_getlines = linecache.getlines
+        linecache.getlines = self.__patched_linecache_getlines
+
+        try:
+            return self.__run(test, compileflags, out)
+        finally:
+            sys.stdout = save_stdout
+            pdb.set_trace = save_set_trace
+            linecache.getlines = self.save_linecache_getlines
+            if clear_globs:
+                test.globs.clear()
+
+    #/////////////////////////////////////////////////////////////////
+    # Summarization
+    #/////////////////////////////////////////////////////////////////
+    def summarize(self, verbose=None):
+        """
+        Print a summary of all the test cases that have been run by
+        this DocTestRunner, and return a tuple `(f, t)`, where `f` is
+        the total number of failed examples, and `t` is the total
+        number of tried examples.
+
+        The optional `verbose` argument controls how detailed the
+        summary is.  If the verbosity is not specified, then the
+        DocTestRunner's verbosity is used.
+        """
+        if verbose is None:
+            verbose = self._verbose
+        notests = []
+        passed = []
+        failed = []
+        totalt = totalf = 0
+        for x in self._name2ft.items():
+            name, (f, t) = x
+            assert f <= t
+            totalt += t
+            totalf += f
+            if t == 0:
+                notests.append(name)
+            elif f == 0:
+                passed.append( (name, t) )
+            else:
+                failed.append(x)
+        if verbose:
+            if notests:
+                print len(notests), "items had no tests:"
+                notests.sort()
+                for thing in notests:
+                    print "   ", thing
+            if passed:
+                print len(passed), "items passed all tests:"
+                passed.sort()
+                for thing, count in passed:
+                    print " %3d tests in %s" % (count, thing)
+        if failed:
+            print self.DIVIDER
+            print len(failed), "items had failures:"
+            failed.sort()
+            for thing, (f, t) in failed:
+                print " %3d of %3d in %s" % (f, t, thing)
+        if verbose:
+            print totalt, "tests in", len(self._name2ft), "items."
+            print totalt - totalf, "passed and", totalf, "failed."
+        if totalf:
+            print "***Test Failed***", totalf, "failures."
+        elif verbose:
+            print "Test passed."
+        return totalf, totalt
+
+    #/////////////////////////////////////////////////////////////////
+    # Backward compatibility cruft to maintain doctest.master.
+    #/////////////////////////////////////////////////////////////////
+    def merge(self, other):
+        d = self._name2ft
+        for name, (f, t) in other._name2ft.items():
+            if name in d:
+                print "*** DocTestRunner.merge: '" + name + "' in both" \
+                    " testers; summing outcomes."
+                f2, t2 = d[name]
+                f = f + f2
+                t = t + t2
+            d[name] = f, t
+
+class OutputChecker:
+    """
+    A class used to check the whether the actual output from a doctest
+    example matches the expected output.  `OutputChecker` defines two
+    methods: `check_output`, which compares a given pair of outputs,
+    and returns true if they match; and `output_difference`, which
+    returns a string describing the differences between two outputs.
+    """
+    def check_output(self, want, got, optionflags):
+        """
+        Return True iff the actual output from an example (`got`)
+        matches the expected output (`want`).  These strings are
+        always considered to match if they are identical; but
+        depending on what option flags the test runner is using,
+        several non-exact match types are also possible.  See the
+        documentation for `TestRunner` for more information about
+        option flags.
+        """
+        # Handle the common case first, for efficiency:
+        # if they're string-identical, always return true.
+        if got == want:
+            return True
+
+        # The values True and False replaced 1 and 0 as the return
+        # value for boolean comparisons in Python 2.3.
+        if not (optionflags & DONT_ACCEPT_TRUE_FOR_1):
+            if (got,want) == ("True\n", "1\n"):
+                return True
+            if (got,want) == ("False\n", "0\n"):
+                return True
+
+        # <BLANKLINE> can be used as a special sequence to signify a
+        # blank line, unless the DONT_ACCEPT_BLANKLINE flag is used.
+        if not (optionflags & DONT_ACCEPT_BLANKLINE):
+            # Replace <BLANKLINE> in want with a blank line.
+            want = re.sub('(?m)^%s\s*?$' % re.escape(BLANKLINE_MARKER),
+                          '', want)
+            # If a line in got contains only spaces, then remove the
+            # spaces.
+            got = re.sub('(?m)^\s*?$', '', got)
+            if got == want:
+                return True
+
+        # This flag causes doctest to ignore any differences in the
+        # contents of whitespace strings.  Note that this can be used
+        # in conjunction with the ELLIPSIS flag.
+        if optionflags & NORMALIZE_WHITESPACE:
+            got = ' '.join(got.split())
+            want = ' '.join(want.split())
+            if got == want:
+                return True
+
+        # The ELLIPSIS flag says to let the sequence "..." in `want`
+        # match any substring in `got`.
+        if optionflags & ELLIPSIS:
+            if _ellipsis_match(want, got):
+                return True
+
+        # We didn't find any match; return false.
+        return False
+
+    # Should we do a fancy diff?
+    def _do_a_fancy_diff(self, want, got, optionflags):
+        # Not unless they asked for a fancy diff.
+        if not optionflags & (REPORT_UDIFF |
+                              REPORT_CDIFF |
+                              REPORT_NDIFF):
+            return False
+
+        # If expected output uses ellipsis, a meaningful fancy diff is
+        # too hard ... or maybe not.  In two real-life failures Tim saw,
+        # a diff was a major help anyway, so this is commented out.
+        # [todo] _ellipsis_match() knows which pieces do and don't match,
+        # and could be the basis for a kick-ass diff in this case.
+        ##if optionflags & ELLIPSIS and ELLIPSIS_MARKER in want:
+        ##    return False
+
+        # ndiff does intraline difference marking, so can be useful even
+        # for 1-line differences.
+        if optionflags & REPORT_NDIFF:
+            return True
+
+        # The other diff types need at least a few lines to be helpful.
+        return want.count('\n') > 2 and got.count('\n') > 2
+
+    def output_difference(self, example, got, optionflags):
+        """
+        Return a string describing the differences between the
+        expected output for a given example (`example`) and the actual
+        output (`got`).  `optionflags` is the set of option flags used
+        to compare `want` and `got`.
+        """
+        want = example.want
+        # If <BLANKLINE>s are being used, then replace blank lines
+        # with <BLANKLINE> in the actual output string.
+        if not (optionflags & DONT_ACCEPT_BLANKLINE):
+            got = re.sub('(?m)^[ ]*(?=\n)', BLANKLINE_MARKER, got)
+
+        # Check if we should use diff.
+        if self._do_a_fancy_diff(want, got, optionflags):
+            # Split want & got into lines.
+            want_lines = want.splitlines(True)  # True == keep line ends
+            got_lines = got.splitlines(True)
+            # Use difflib to find their differences.
+            if optionflags & REPORT_UDIFF:
+                diff = difflib.unified_diff(want_lines, got_lines, n=2)
+                diff = list(diff)[2:] # strip the diff header
+                kind = 'unified diff with -expected +actual'
+            elif optionflags & REPORT_CDIFF:
+                diff = difflib.context_diff(want_lines, got_lines, n=2)
+                diff = list(diff)[2:] # strip the diff header
+                kind = 'context diff with expected followed by actual'
+            elif optionflags & REPORT_NDIFF:
+                engine = difflib.Differ(charjunk=difflib.IS_CHARACTER_JUNK)
+                diff = list(engine.compare(want_lines, got_lines))
+                kind = 'ndiff with -expected +actual'
+            else:
+                assert 0, 'Bad diff option'
+            # Remove trailing whitespace on diff output.
+            diff = [line.rstrip() + '\n' for line in diff]
+            return 'Differences (%s):\n' % kind + _indent(''.join(diff))
+
+        # If we're not using diff, then simply list the expected
+        # output followed by the actual output.
+        if want and got:
+            return 'Expected:\n%sGot:\n%s' % (_indent(want), _indent(got))
+        elif want:
+            return 'Expected:\n%sGot nothing\n' % _indent(want)
+        elif got:
+            return 'Expected nothing\nGot:\n%s' % _indent(got)
+        else:
+            return 'Expected nothing\nGot nothing\n'
+
+class DocTestFailure(Exception):
+    """A DocTest example has failed in debugging mode.
+
+    The exception instance has variables:
+
+    - test: the DocTest object being run
+
+    - excample: the Example object that failed
+
+    - got: the actual output
+    """
+    def __init__(self, test, example, got):
+        self.test = test
+        self.example = example
+        self.got = got
+
+    def __str__(self):
+        return str(self.test)
+
+class UnexpectedException(Exception):
+    """A DocTest example has encountered an unexpected exception
+
+    The exception instance has variables:
+
+    - test: the DocTest object being run
+
+    - excample: the Example object that failed
+
+    - exc_info: the exception info
+    """
+    def __init__(self, test, example, exc_info):
+        self.test = test
+        self.example = example
+        self.exc_info = exc_info
+
+    def __str__(self):
+        return str(self.test)
+
+class DebugRunner(DocTestRunner):
+
+    def run(self, test, compileflags=None, out=None, clear_globs=True):
+        r = DocTestRunner.run(self, test, compileflags, out, False)
+        if clear_globs:
+            test.globs.clear()
+        return r
+
+    def report_unexpected_exception(self, out, test, example, exc_info):
+        raise UnexpectedException(test, example, exc_info)
+
+    def report_failure(self, out, test, example, got):
+        raise DocTestFailure(test, example, got)
+
+######################################################################
+## 6. Test Functions
+######################################################################
+# These should be backwards compatible.
+
+# For backward compatibility, a global instance of a DocTestRunner
+# class, updated by testmod.
+master = None
+
+def testmod(m=None, name=None, globs=None, verbose=None, isprivate=None,
+            report=True, optionflags=0, extraglobs=None,
+            raise_on_error=False, exclude_empty=False):
+    """m=None, name=None, globs=None, verbose=None, isprivate=None,
+       report=True, optionflags=0, extraglobs=None, raise_on_error=False,
+       exclude_empty=False
+
+    Test examples in docstrings in functions and classes reachable
+    from module m (or the current module if m is not supplied), starting
+    with m.__doc__.  Unless isprivate is specified, private names
+    are not skipped.
+
+    Also test examples reachable from dict m.__test__ if it exists and is
+    not None.  m.__test__ maps names to functions, classes and strings;
+    function and class docstrings are tested even if the name is private;
+    strings are tested directly, as if they were docstrings.
+
+    Return (#failures, #tests).
+
+    See doctest.__doc__ for an overview.
+
+    Optional keyword arg "name" gives the name of the module; by default
+    use m.__name__.
+
+    Optional keyword arg "globs" gives a dict to be used as the globals
+    when executing examples; by default, use m.__dict__.  A copy of this
+    dict is actually used for each docstring, so that each docstring's
+    examples start with a clean slate.
+
+    Optional keyword arg "extraglobs" gives a dictionary that should be
+    merged into the globals that are used to execute examples.  By
+    default, no extra globals are used.  This is new in 2.4.
+
+    Optional keyword arg "verbose" prints lots of stuff if true, prints
+    only failures if false; by default, it's true iff "-v" is in sys.argv.
+
+    Optional keyword arg "report" prints a summary at the end when true,
+    else prints nothing at the end.  In verbose mode, the summary is
+    detailed, else very brief (in fact, empty if all tests passed).
+
+    Optional keyword arg "optionflags" or's together module constants,
+    and defaults to 0.  This is new in 2.3.  Possible values (see the
+    docs for details):
+
+        DONT_ACCEPT_TRUE_FOR_1
+        DONT_ACCEPT_BLANKLINE
+        NORMALIZE_WHITESPACE
+        ELLIPSIS
+        IGNORE_EXCEPTION_DETAIL
+        REPORT_UDIFF
+        REPORT_CDIFF
+        REPORT_NDIFF
+        REPORT_ONLY_FIRST_FAILURE
+
+    Optional keyword arg "raise_on_error" raises an exception on the
+    first unexpected exception or failure. This allows failures to be
+    post-mortem debugged.
+
+    Deprecated in Python 2.4:
+    Optional keyword arg "isprivate" specifies a function used to
+    determine whether a name is private.  The default function is
+    treat all functions as public.  Optionally, "isprivate" can be
+    set to doctest.is_private to skip over functions marked as private
+    using the underscore naming convention; see its docs for details.
+
+    Advanced tomfoolery:  testmod runs methods of a local instance of
+    class doctest.Tester, then merges the results into (or creates)
+    global Tester instance doctest.master.  Methods of doctest.master
+    can be called directly too, if you want to do something unusual.
+    Passing report=0 to testmod is especially useful then, to delay
+    displaying a summary.  Invoke doctest.master.summarize(verbose)
+    when you're done fiddling.
+    """
+    global master
+
+    if isprivate is not None:
+        warnings.warn("the isprivate argument is deprecated; "
+                      "examine DocTestFinder.find() lists instead",
+                      DeprecationWarning)
+
+    # If no module was given, then use __main__.
+    if m is None:
+        # DWA - m will still be None if this wasn't invoked from the command
+        # line, in which case the following TypeError is about as good an error
+        # as we should expect
+        m = sys.modules.get('__main__')
+
+    # Check that we were actually given a module.
+    if not inspect.ismodule(m):
+        raise TypeError("testmod: module required; %r" % (m,))
+
+    # If no name was given, then use the module's name.
+    if name is None:
+        name = m.__name__
+
+    # Find, parse, and run all tests in the given module.
+    finder = DocTestFinder(_namefilter=isprivate, exclude_empty=exclude_empty)
+
+    if raise_on_error:
+        runner = DebugRunner(verbose=verbose, optionflags=optionflags)
+    else:
+        runner = DocTestRunner(verbose=verbose, optionflags=optionflags)
+
+    for test in finder.find(m, name, globs=globs, extraglobs=extraglobs):
+        runner.run(test)
+
+    if report:
+        runner.summarize()
+
+    if master is None:
+        master = runner
+    else:
+        master.merge(runner)
+
+    return runner.failures, runner.tries
+
+def testfile(filename, module_relative=True, name=None, package=None,
+             globs=None, verbose=None, report=True, optionflags=0,
+             extraglobs=None, raise_on_error=False, parser=DocTestParser()):
+    """
+    Test examples in the given file.  Return (#failures, #tests).
+
+    Optional keyword arg "module_relative" specifies how filenames
+    should be interpreted:
+
+      - If "module_relative" is True (the default), then "filename"
+         specifies a module-relative path.  By default, this path is
+         relative to the calling module's directory; but if the
+         "package" argument is specified, then it is relative to that
+         package.  To ensure os-independence, "filename" should use
+         "/" characters to separate path segments, and should not
+         be an absolute path (i.e., it may not begin with "/").
+
+      - If "module_relative" is False, then "filename" specifies an
+        os-specific path.  The path may be absolute or relative (to
+        the current working directory).
+
+    Optional keyword arg "name" gives the name of the test; by default
+    use the file's basename.
+
+    Optional keyword argument "package" is a Python package or the
+    name of a Python package whose directory should be used as the
+    base directory for a module relative filename.  If no package is
+    specified, then the calling module's directory is used as the base
+    directory for module relative filenames.  It is an error to
+    specify "package" if "module_relative" is False.
+
+    Optional keyword arg "globs" gives a dict to be used as the globals
+    when executing examples; by default, use {}.  A copy of this dict
+    is actually used for each docstring, so that each docstring's
+    examples start with a clean slate.
+
+    Optional keyword arg "extraglobs" gives a dictionary that should be
+    merged into the globals that are used to execute examples.  By
+    default, no extra globals are used.
+
+    Optional keyword arg "verbose" prints lots of stuff if true, prints
+    only failures if false; by default, it's true iff "-v" is in sys.argv.
+
+    Optional keyword arg "report" prints a summary at the end when true,
+    else prints nothing at the end.  In verbose mode, the summary is
+    detailed, else very brief (in fact, empty if all tests passed).
+
+    Optional keyword arg "optionflags" or's together module constants,
+    and defaults to 0.  Possible values (see the docs for details):
+
+        DONT_ACCEPT_TRUE_FOR_1
+        DONT_ACCEPT_BLANKLINE
+        NORMALIZE_WHITESPACE
+        ELLIPSIS
+        IGNORE_EXCEPTION_DETAIL
+        REPORT_UDIFF
+        REPORT_CDIFF
+        REPORT_NDIFF
+        REPORT_ONLY_FIRST_FAILURE
+
+    Optional keyword arg "raise_on_error" raises an exception on the
+    first unexpected exception or failure. This allows failures to be
+    post-mortem debugged.
+
+    Optional keyword arg "parser" specifies a DocTestParser (or
+    subclass) that should be used to extract tests from the files.
+
+    Advanced tomfoolery:  testmod runs methods of a local instance of
+    class doctest.Tester, then merges the results into (or creates)
+    global Tester instance doctest.master.  Methods of doctest.master
+    can be called directly too, if you want to do something unusual.
+    Passing report=0 to testmod is especially useful then, to delay
+    displaying a summary.  Invoke doctest.master.summarize(verbose)
+    when you're done fiddling.
+    """
+    global master
+
+    if package and not module_relative:
+        raise ValueError("Package may only be specified for module-"
+                         "relative paths.")
+
+    # Relativize the path
+    if module_relative:
+        package = _normalize_module(package)
+        filename = _module_relative_path(package, filename)
+
+    # If no name was given, then use the file's name.
+    if name is None:
+        name = os.path.basename(filename)
+
+    # Assemble the globals.
+    if globs is None:
+        globs = {}
+    else:
+        globs = globs.copy()
+    if extraglobs is not None:
+        globs.update(extraglobs)
+
+    if raise_on_error:
+        runner = DebugRunner(verbose=verbose, optionflags=optionflags)
+    else:
+        runner = DocTestRunner(verbose=verbose, optionflags=optionflags)
+
+    # Read the file, convert it to a test, and run it.
+    s = open(filename).read()
+    test = parser.get_doctest(s, globs, name, filename, 0)
+    runner.run(test)
+
+    if report:
+        runner.summarize()
+
+    if master is None:
+        master = runner
+    else:
+        master.merge(runner)
+
+    return runner.failures, runner.tries
+
+def run_docstring_examples(f, globs, verbose=False, name="NoName",
+                           compileflags=None, optionflags=0):
+    """
+    Test examples in the given object's docstring (`f`), using `globs`
+    as globals.  Optional argument `name` is used in failure messages.
+    If the optional argument `verbose` is true, then generate output
+    even if there are no failures.
+
+    `compileflags` gives the set of flags that should be used by the
+    Python compiler when running the examples.  If not specified, then
+    it will default to the set of future-import flags that apply to
+    `globs`.
+
+    Optional keyword arg `optionflags` specifies options for the
+    testing and output.  See the documentation for `testmod` for more
+    information.
+    """
+    # Find, parse, and run all tests in the given module.
+    finder = DocTestFinder(verbose=verbose, recurse=False)
+    runner = DocTestRunner(verbose=verbose, optionflags=optionflags)
+    for test in finder.find(f, name, globs=globs):
+        runner.run(test, compileflags=compileflags)
+
+######################################################################
+## 7. Tester
+######################################################################
+# This is provided only for backwards compatibility.  It's not
+# actually used in any way.
+
+class Tester:
+    def __init__(self, mod=None, globs=None, verbose=None,
+                 isprivate=None, optionflags=0):
+
+        warnings.warn("class Tester is deprecated; "
+                      "use class doctest.DocTestRunner instead",
+                      DeprecationWarning, stacklevel=2)
+        if mod is None and globs is None:
+            raise TypeError("Tester.__init__: must specify mod or globs")
+        if mod is not None and not inspect.ismodule(mod):
+            raise TypeError("Tester.__init__: mod must be a module; %r" %
+                            (mod,))
+        if globs is None:
+            globs = mod.__dict__
+        self.globs = globs
+
+        self.verbose = verbose
+        self.isprivate = isprivate
+        self.optionflags = optionflags
+        self.testfinder = DocTestFinder(_namefilter=isprivate)
+        self.testrunner = DocTestRunner(verbose=verbose,
+                                        optionflags=optionflags)
+
+    def runstring(self, s, name):
+        test = DocTestParser().get_doctest(s, self.globs, name, None, None)
+        if self.verbose:
+            print "Running string", name
+        (f,t) = self.testrunner.run(test)
+        if self.verbose:
+            print f, "of", t, "examples failed in string", name
+        return (f,t)
+
+    def rundoc(self, object, name=None, module=None):
+        f = t = 0
+        tests = self.testfinder.find(object, name, module=module,
+                                     globs=self.globs)
+        for test in tests:
+            (f2, t2) = self.testrunner.run(test)
+            (f,t) = (f+f2, t+t2)
+        return (f,t)
+
+    def rundict(self, d, name, module=None):
+        import new
+        m = new.module(name)
+        m.__dict__.update(d)
+        if module is None:
+            module = False
+        return self.rundoc(m, name, module)
+
+    def run__test__(self, d, name):
+        import new
+        m = new.module(name)
+        m.__test__ = d
+        return self.rundoc(m, name)
+
+    def summarize(self, verbose=None):
+        return self.testrunner.summarize(verbose)
+
+    def merge(self, other):
+        self.testrunner.merge(other.testrunner)
+
+######################################################################
+## 8. Unittest Support
+######################################################################
+
+_unittest_reportflags = 0
+
+def set_unittest_reportflags(flags):
+    global _unittest_reportflags
+
+    if (flags & REPORTING_FLAGS) != flags:
+        raise ValueError("Only reporting flags allowed", flags)
+    old = _unittest_reportflags
+    _unittest_reportflags = flags
+    return old
+
+
+class DocTestCase(unittest.TestCase):
+
+    def __init__(self, test, optionflags=0, setUp=None, tearDown=None,
+                 checker=None):
+
+        unittest.TestCase.__init__(self)
+        self._dt_optionflags = optionflags
+        self._dt_checker = checker
+        self._dt_test = test
+        self._dt_setUp = setUp
+        self._dt_tearDown = tearDown
+
+    def setUp(self):
+        test = self._dt_test
+
+        if self._dt_setUp is not None:
+            self._dt_setUp(test)
+
+    def tearDown(self):
+        test = self._dt_test
+
+        if self._dt_tearDown is not None:
+            self._dt_tearDown(test)
+
+        test.globs.clear()
+
+    def runTest(self):
+        test = self._dt_test
+        old = sys.stdout
+        new = StringIO()
+        optionflags = self._dt_optionflags
+
+        if not (optionflags & REPORTING_FLAGS):
+            # The option flags don't include any reporting flags,
+            # so add the default reporting flags
+            optionflags |= _unittest_reportflags
+
+        runner = DocTestRunner(optionflags=optionflags,
+                               checker=self._dt_checker, verbose=False)
+
+        try:
+            runner.DIVIDER = "-"*70
+            failures, tries = runner.run(
+                test, out=new.write, clear_globs=False)
+        finally:
+            sys.stdout = old
+
+        if failures:
+            raise self.failureException(self.format_failure(new.getvalue()))
+
+    def format_failure(self, err):
+        test = self._dt_test
+        if test.lineno is None:
+            lineno = 'unknown line number'
+        else:
+            lineno = '%s' % test.lineno
+        lname = '.'.join(test.name.split('.')[-1:])
+        return ('Failed doctest test for %s\n'
+                '  File "%s", line %s, in %s\n\n%s'
+                % (test.name, test.filename, lineno, lname, err)
+                )
+
+    def debug(self):
+        self.setUp()
+        runner = DebugRunner(optionflags=self._dt_optionflags,
+                             checker=self._dt_checker, verbose=False)
+        runner.run(self._dt_test)
+        self.tearDown()
+
+    def id(self):
+        return self._dt_test.name
+
+    def __repr__(self):
+        name = self._dt_test.name.split('.')
+        return "%s (%s)" % (name[-1], '.'.join(name[:-1]))
+
+    __str__ = __repr__
+
+    def shortDescription(self):
+        return "Doctest: " + self._dt_test.name
+
+def DocTestSuite(module=None, globs=None, extraglobs=None, test_finder=None,
+                 **options):
+    """
+    Convert doctest tests for a module to a unittest test suite.
+
+    This converts each documentation string in a module that
+    contains doctest tests to a unittest test case.  If any of the
+    tests in a doc string fail, then the test case fails.  An exception
+    is raised showing the name of the file containing the test and a
+    (sometimes approximate) line number.
+
+    The `module` argument provides the module to be tested.  The argument
+    can be either a module or a module name.
+
+    If no argument is given, the calling module is used.
+
+    A number of options may be provided as keyword arguments:
+
+    setUp
+      A set-up function.  This is called before running the
+      tests in each file. The setUp function will be passed a DocTest
+      object.  The setUp function can access the test globals as the
+      globs attribute of the test passed.
+
+    tearDown
+      A tear-down function.  This is called after running the
+      tests in each file.  The tearDown function will be passed a DocTest
+      object.  The tearDown function can access the test globals as the
+      globs attribute of the test passed.
+
+    globs
+      A dictionary containing initial global variables for the tests.
+
+    optionflags
+       A set of doctest option flags expressed as an integer.
+    """
+
+    if test_finder is None:
+        test_finder = DocTestFinder()
+
+    module = _normalize_module(module)
+    tests = test_finder.find(module, globs=globs, extraglobs=extraglobs)
+    if globs is None:
+        globs = module.__dict__
+    if not tests:
+        # Why do we want to do this? Because it reveals a bug that might
+        # otherwise be hidden.
+        raise ValueError(module, "has no tests")
+
+    tests.sort()
+    suite = unittest.TestSuite()
+    for test in tests:
+        if len(test.examples) == 0:
+            continue
+        if not test.filename:
+            filename = module.__file__
+            if filename[-4:] in (".pyc", ".pyo"):
+                filename = filename[:-1]
+            elif sys.platform.startswith('java') and \
+                    filename.endswith('$py.class'):
+                filename = '%s.py' % filename[:-9]
+            test.filename = filename
+        suite.addTest(DocTestCase(test, **options))
+
+    return suite
+
+class DocFileCase(DocTestCase):
+
+    def id(self):
+        return '_'.join(self._dt_test.name.split('.'))
+
+    def __repr__(self):
+        return self._dt_test.filename
+    __str__ = __repr__
+
+    def format_failure(self, err):
+        return ('Failed doctest test for %s\n  File "%s", line 0\n\n%s'
+                % (self._dt_test.name, self._dt_test.filename, err)
+                )
+
+def DocFileTest(path, module_relative=True, package=None,
+                globs=None, parser=DocTestParser(), **options):
+    if globs is None:
+        globs = {}
+
+    if package and not module_relative:
+        raise ValueError("Package may only be specified for module-"
+                         "relative paths.")
+
+    # Relativize the path.
+    if module_relative:
+        package = _normalize_module(package)
+        path = _module_relative_path(package, path)
+
+    # Find the file and read it.
+    name = os.path.basename(path)
+    doc = open(path).read()
+
+    # Convert it to a test, and wrap it in a DocFileCase.
+    test = parser.get_doctest(doc, globs, name, path, 0)
+    return DocFileCase(test, **options)
+
+def DocFileSuite(*paths, **kw):
+    """A unittest suite for one or more doctest files.
+
+    The path to each doctest file is given as a string; the
+    interpretation of that string depends on the keyword argument
+    "module_relative".
+
+    A number of options may be provided as keyword arguments:
+
+    module_relative
+      If "module_relative" is True, then the given file paths are
+      interpreted as os-independent module-relative paths.  By
+      default, these paths are relative to the calling module's
+      directory; but if the "package" argument is specified, then
+      they are relative to that package.  To ensure os-independence,
+      "filename" should use "/" characters to separate path
+      segments, and may not be an absolute path (i.e., it may not
+      begin with "/").
+
+      If "module_relative" is False, then the given file paths are
+      interpreted as os-specific paths.  These paths may be absolute
+      or relative (to the current working directory).
+
+    package
+      A Python package or the name of a Python package whose directory
+      should be used as the base directory for module relative paths.
+      If "package" is not specified, then the calling module's
+      directory is used as the base directory for module relative
+      filenames.  It is an error to specify "package" if
+      "module_relative" is False.
+
+    setUp
+      A set-up function.  This is called before running the
+      tests in each file. The setUp function will be passed a DocTest
+      object.  The setUp function can access the test globals as the
+      globs attribute of the test passed.
+
+    tearDown
+      A tear-down function.  This is called after running the
+      tests in each file.  The tearDown function will be passed a DocTest
+      object.  The tearDown function can access the test globals as the
+      globs attribute of the test passed.
+
+    globs
+      A dictionary containing initial global variables for the tests.
+
+    optionflags
+      A set of doctest option flags expressed as an integer.
+
+    parser
+      A DocTestParser (or subclass) that should be used to extract
+      tests from the files.
+    """
+    suite = unittest.TestSuite()
+
+    # We do this here so that _normalize_module is called at the right
+    # level.  If it were called in DocFileTest, then this function
+    # would be the caller and we might guess the package incorrectly.
+    if kw.get('module_relative', True):
+        kw['package'] = _normalize_module(kw.get('package'))
+
+    for path in paths:
+        suite.addTest(DocFileTest(path, **kw))
+
+    return suite
+
+######################################################################
+## 9. Debugging Support
+######################################################################
+
+def script_from_examples(s):
+    output = []
+    for piece in DocTestParser().parse(s):
+        if isinstance(piece, Example):
+            # Add the example's source code (strip trailing NL)
+            output.append(piece.source[:-1])
+            # Add the expected output:
+            want = piece.want
+            if want:
+                output.append('# Expected:')
+                output += ['## '+l for l in want.split('\n')[:-1]]
+        else:
+            # Add non-example text.
+            output += [_comment_line(l)
+                       for l in piece.split('\n')[:-1]]
+
+    # Trim junk on both ends.
+    while output and output[-1] == '#':
+        output.pop()
+    while output and output[0] == '#':
+        output.pop(0)
+    # Combine the output, and return it.
+    # Add a courtesy newline to prevent exec from choking (see bug #1172785)
+    return '\n'.join(output) + '\n'
+
+def testsource(module, name):
+    """Extract the test sources from a doctest docstring as a script.
+
+    Provide the module (or dotted name of the module) containing the
+    test to be debugged and the name (within the module) of the object
+    with the doc string with tests to be debugged.
+    """
+    module = _normalize_module(module)
+    tests = DocTestFinder().find(module)
+    test = [t for t in tests if t.name == name]
+    if not test:
+        raise ValueError(name, "not found in tests")
+    test = test[0]
+    testsrc = script_from_examples(test.docstring)
+    return testsrc
+
+def debug_src(src, pm=False, globs=None):
+    """Debug a single doctest docstring, in argument `src`'"""
+    testsrc = script_from_examples(src)
+    debug_script(testsrc, pm, globs)
+
+def debug_script(src, pm=False, globs=None):
+    "Debug a test script.  `src` is the script, as a string."
+    import pdb
+
+    # Note that tempfile.NameTemporaryFile() cannot be used.  As the
+    # docs say, a file so created cannot be opened by name a second time
+    # on modern Windows boxes, and execfile() needs to open it.
+    srcfilename = tempfile.mktemp(".py", "doctestdebug")
+    f = open(srcfilename, 'w')
+    f.write(src)
+    f.close()
+
+    try:
+        if globs:
+            globs = globs.copy()
+        else:
+            globs = {}
+
+        if pm:
+            try:
+                execfile(srcfilename, globs, globs)
+            except:
+                print sys.exc_info()[1]
+                pdb.post_mortem(sys.exc_info()[2])
+        else:
+            # Note that %r is vital here.  '%s' instead can, e.g., cause
+            # backslashes to get treated as metacharacters on Windows.
+            pdb.run("execfile(%r)" % srcfilename, globs, globs)
+
+    finally:
+        os.remove(srcfilename)
+
+def debug(module, name, pm=False):
+    """Debug a single doctest docstring.
+
+    Provide the module (or dotted name of the module) containing the
+    test to be debugged and the name (within the module) of the object
+    with the docstring with tests to be debugged.
+    """
+    module = _normalize_module(module)
+    testsrc = testsource(module, name)
+    debug_script(testsrc, pm, module.__dict__)
+
+
+__test__ = {}
Index: /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/ext/__init__.py
===================================================================
--- /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/ext/__init__.py (revision 3)
+++ /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/ext/__init__.py (revision 3)
@@ -0,0 +1,3 @@
+"""
+External or vendor files
+"""
Index: /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/case.py
===================================================================
--- /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/case.py (revision 3)
+++ /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/case.py (revision 3)
@@ -0,0 +1,380 @@
+"""nose unittest.TestCase subclasses. It is not necessary to subclass these
+classes when writing tests; they are used internally by nose.loader.TestLoader
+to create test cases from test functions and methods in test classes.
+"""
+import logging
+import sys
+import unittest
+from nose.config import Config
+from nose.failure import Failure # for backwards compatibility
+from nose.util import resolve_name, test_address, try_run
+
+log = logging.getLogger(__name__)
+
+
+__all__ = ['Test']
+
+
+class Test(unittest.TestCase):
+    """The universal test case wrapper.
+
+    When a plugin sees a test, it will always see an instance of this
+    class. To access the actual test case that will be run, access the
+    test property of the nose.case.Test instance.    
+    """
+    __test__ = False # do not collect
+    def __init__(self, test, config=None, resultProxy=None):
+        # sanity check
+        if not callable(test):
+            raise TypeError("nose.case.Test called with argument %r that "
+                            "is not callable. A callable is required."
+                            % test)
+        self.test = test
+        if config is None:
+            config = Config()
+        self.config = config
+        self.tbinfo = None
+        self.capturedOutput = None
+        self.resultProxy = resultProxy
+        self.plugins = config.plugins
+        self.passed = None
+        unittest.TestCase.__init__(self)
+        
+    def __call__(self, *arg, **kwarg):
+        return self.run(*arg, **kwarg)
+
+    def __str__(self):
+        name = self.plugins.testName(self)
+        if name is not None:
+            return name
+        return str(self.test)
+
+    def __repr__(self):
+        return "Test(%r)" % self.test
+
+    def afterTest(self, result):
+        """Called after test is complete (after result.stopTest)
+        """
+        try:
+            afterTest = result.afterTest
+        except AttributeError:
+            pass
+        else:
+            afterTest(self.test)
+
+    def beforeTest(self, result):
+        """Called before test is run (before result.startTest)
+        """
+        try:
+            beforeTest = result.beforeTest
+        except AttributeError:
+            pass
+        else:
+            beforeTest(self.test)
+
+    def exc_info(self):
+        """Extract exception info.
+        """        
+        exc, exv, tb = sys.exc_info()
+        return (exc, exv, tb)
+        
+    def id(self):
+        """Get a short(er) description of the test
+        """
+        return self.test.id()
+
+    def address(self):
+        """Return a round-trip name for this test, a name that can be
+        fed back as input to loadTestByName and (assuming the same
+        plugin configuration) result in the loading of this test.
+        """
+        if hasattr(self.test, 'address'):
+            return self.test.address()
+        else:
+            # not a nose case
+            return test_address(self.test)
+
+    def _context(self):
+        try:
+            return self.test.context
+        except AttributeError:
+            pass
+        try:
+            return self.test.__class__
+        except AttributeError:
+            pass
+        try:
+            return resolve_name(self.test.__module__)
+        except AttributeError:
+            pass
+        return None                
+    context = property(_context, None, None,
+                      """Get the context object of this test (if any).""")
+    
+    def run(self, result):
+        """Modified run for the test wrapper.
+
+        From here we don't call result.startTest or stopTest or
+        addSuccess.  The wrapper calls addError/addFailure only if its
+        own setup or teardown fails, or running the wrapped test fails
+        (eg, if the wrapped "test" is not callable).
+
+        Two additional methods are called, beforeTest and
+        afterTest. These give plugins a chance to modify the wrapped
+        test before it is called and do cleanup after it is
+        called. They are called unconditionally.
+        """
+        if self.resultProxy:
+            result = self.resultProxy(result, self)
+        try:
+            try:
+                self.beforeTest(result)
+                self.runTest(result)
+            except KeyboardInterrupt:
+                raise
+            except:
+                err = sys.exc_info()
+                result.addError(self, err)
+        finally:
+            self.afterTest(result)
+        
+    def runTest(self, result):
+        """Run the test. Plugins may alter the test by returning a
+        value from prepareTestCase. The value must be callable and
+        must accept one argument, the result instance.
+        """        
+        test = self.test
+        plug_test = self.config.plugins.prepareTestCase(self)
+        if plug_test is not None:
+            test = plug_test
+        test(result)
+        
+    def shortDescription(self):
+        desc = self.plugins.describeTest(self)
+        if desc is not None:
+            return desc
+        doc = self.test.shortDescription()
+        if doc is not None:
+            return doc
+        # work around bug in unittest.TestCase.shortDescription
+        # with multiline docstrings.
+        test = self.test
+        try:
+            doc = test._testMethodDoc # 2.5
+        except AttributeError:
+            try:
+                doc = test._TestCase__testMethodDoc # 2.4 and earlier
+            except AttributeError:
+                pass
+        if doc is not None:
+            doc = doc.strip().split("\n")[0].strip()
+        return doc
+
+
+class TestBase(unittest.TestCase):
+    """Common functionality for FunctionTestCase and MethodTestCase.
+    """
+    __test__ = False # do not collect
+    
+    def id(self):
+        return str(self)
+        
+    def runTest(self):
+        self.test(*self.arg)
+    
+    def shortDescription(self):
+        if hasattr(self.test, 'description'):
+            return self.test.description
+        func, arg = self._descriptors()
+        doc = getattr(func, '__doc__', None)
+        if not doc:
+            doc = str(self)
+        return doc.strip().split("\n")[0].strip()
+
+    
+class FunctionTestCase(TestBase):
+    """TestCase wrapper for test functions.
+
+    Don't use this class directly; it is used internally in nose to
+    create test cases for test functions.
+    """
+    __test__ = False # do not collect
+    
+    def __init__(self, test, setUp=None, tearDown=None, arg=tuple(),
+                 descriptor=None):
+        """Initialize the MethodTestCase.
+
+        Required argument:
+
+        * test -- the test function to call.
+
+        Optional arguments:
+
+        * setUp -- function to run at setup.
+
+        * tearDown -- function to run at teardown.
+
+        * arg -- arguments to pass to the test function. This is to support
+          generator functions that yield arguments.
+
+        * descriptor -- the function, other than the test, that should be used
+          to construct the test name. This is to support generator functions.
+        """
+        
+        self.test = test
+        self.setUpFunc = setUp
+        self.tearDownFunc = tearDown
+        self.arg = arg
+        self.descriptor = descriptor
+        TestBase.__init__(self)        
+
+    def address(self):
+        """Return a round-trip name for this test, a name that can be
+        fed back as input to loadTestByName and (assuming the same
+        plugin configuration) result in the loading of this test.
+        """
+        if self.descriptor is not None:
+            return test_address(self.descriptor)
+        else:
+            return test_address(self.test)    
+
+    def _context(self):
+        return resolve_name(self.test.__module__)
+    context = property(_context, None, None,
+                      """Get context (module) of this test""")
+        
+    def setUp(self):
+        """Run any setup function attached to the test function
+        """
+        if self.setUpFunc:
+            self.setUpFunc()
+        else:
+            names = ('setup', 'setUp', 'setUpFunc')
+            try_run(self.test, names)
+
+    def tearDown(self):
+        """Run any teardown function attached to the test function
+        """
+        if self.tearDownFunc:
+            self.tearDownFunc()
+        else:
+            names = ('teardown', 'tearDown', 'tearDownFunc')
+            try_run(self.test, names)
+        
+    def __str__(self):
+        func, arg = self._descriptors()
+        if hasattr(func, 'compat_func_name'):
+            name = func.compat_func_name
+        else:
+            name = func.__name__
+        name = "%s.%s" % (func.__module__, name)
+        if arg:
+            name = "%s%s" % (name, arg)
+        # FIXME need to include the full dir path to disambiguate
+        # in cases where test module of the same name was seen in
+        # another directory (old fromDirectory)
+        return name 
+    __repr__ = __str__
+    
+    def _descriptors(self):
+        """Get the descriptors of the test function: the function and
+        arguments that will be used to construct the test name. In
+        most cases, this is the function itself and no arguments. For
+        tests generated by generator functions, the original
+        (generator) function and args passed to the generated function
+        are returned.
+        """
+        if self.descriptor:
+            return self.descriptor, self.arg
+        else:            
+            return self.test, self.arg
+
+
+class MethodTestCase(TestBase):
+    """Test case wrapper for test methods.
+
+    Don't use this class directly; it is used internally in nose to
+    create test cases for test methods.
+    """
+    __test__ = False # do not collect
+    
+    def __init__(self, method, test=None, arg=tuple(), descriptor=None):
+        """Initialize the MethodTestCase.
+
+        Required argument:
+
+        * method -- the method to call, may be bound or unbound. In either
+          case, a new instance of the method's class will be instantiated to
+          make the call.
+
+        Optional arguments:
+
+        * test -- the test function to call. If this is passed, it will be
+          called instead of getting a new bound method of the same name as the
+          desired method from the test instance. This is to support generator
+          methods that yield inline functions.
+
+        * arg -- arguments to pass to the test function. This is to support
+          generator methods that yield arguments.
+
+        * descriptor -- the function, other than the test, that should be used
+          to construct the test name. This is to support generator methods.
+        """
+        self.method = method
+        self.test = test
+        self.arg = arg
+        self.descriptor = descriptor
+        self.cls = method.im_class
+        self.inst = self.cls()
+        if self.test is None:
+            method_name = self.method.__name__
+            self.test = getattr(self.inst, method_name)            
+        TestBase.__init__(self)
+
+    def __str__(self):
+        func, arg = self._descriptors()
+        if hasattr(func, 'compat_func_name'):
+            name = func.compat_func_name
+        else:
+            name = func.__name__
+        name = "%s.%s.%s" % (self.cls.__module__,
+                             self.cls.__name__,
+                             name)
+        if arg:
+            name = "%s%s" % (name, arg)
+        return name
+    __repr__ = __str__
+
+    def address(self):
+        """Return a round-trip name for this test, a name that can be
+        fed back as input to loadTestByName and (assuming the same
+        plugin configuration) result in the loading of this test.
+        """
+        if self.descriptor is not None:
+            return test_address(self.descriptor)
+        else:
+            return test_address(self.method)
+
+    def _context(self):
+        return self.cls
+    context = property(_context, None, None,
+                      """Get context (class) of this test""")
+
+    def setUp(self):
+        try_run(self.inst, ('setup', 'setUp'))
+
+    def tearDown(self):
+        try_run(self.inst, ('teardown', 'tearDown'))
+        
+    def _descriptors(self):
+        """Get the descriptors of the test method: the method and
+        arguments that will be used to construct the test name. In
+        most cases, this is the method itself and no arguments. For
+        tests generated by generator methods, the original
+        (generator) method and args passed to the generated method 
+        or function are returned.
+        """
+        if self.descriptor:
+            return self.descriptor, self.arg
+        else:
+            return self.method, self.arg
Index: /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/util.py
===================================================================
--- /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/util.py (revision 3)
+++ /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/util.py (revision 3)
@@ -0,0 +1,671 @@
+"""Utility functions and classes used by nose internally.
+"""
+import inspect
+import itertools
+import logging
+import os
+import re
+import sys
+import types
+import unittest
+from types import ClassType, TypeType
+
+try:
+    from compiler.consts import CO_GENERATOR
+except ImportError:
+    # IronPython doesn't have a complier module
+    CO_GENERATOR=0x20
+    
+log = logging.getLogger('nose')
+
+ident_re = re.compile(r'^[A-Za-z_][A-Za-z0-9_.]*$')
+class_types = (ClassType, TypeType)
+skip_pattern = r"(?:\.svn)|(?:[^.]+\.py[co])|(?:.*~)|(?:.*\$py\.class)"
+
+try:
+    set()
+    set = set # make from nose.util import set happy
+except NameError:
+    try:
+        from sets import Set as set
+    except ImportError:
+        pass
+
+
+def ls_tree(dir_path="",
+            skip_pattern=skip_pattern,
+            indent="|-- ", branch_indent="|   ",
+            last_indent="`-- ", last_branch_indent="    "):
+    # TODO: empty directories look like non-directory files
+    return "\n".join(_ls_tree_lines(dir_path, skip_pattern,
+                                    indent, branch_indent,
+                                    last_indent, last_branch_indent))
+
+
+def _ls_tree_lines(dir_path, skip_pattern,
+                   indent, branch_indent, last_indent, last_branch_indent):
+    if dir_path == "":
+        dir_path = os.getcwd()
+
+    lines = []
+
+    names = os.listdir(dir_path)
+    names.sort()
+    dirs, nondirs = [], []
+    for name in names:
+        if re.match(skip_pattern, name):
+            continue
+        if os.path.isdir(os.path.join(dir_path, name)):
+            dirs.append(name)
+        else:
+            nondirs.append(name)
+
+    # list non-directories first
+    entries = list(itertools.chain([(name, False) for name in nondirs],
+                                   [(name, True) for name in dirs]))
+    def ls_entry(name, is_dir, ind, branch_ind):
+        if not is_dir:
+            yield ind + name
+        else:
+            path = os.path.join(dir_path, name)
+            if not os.path.islink(path):
+                yield ind + name
+                subtree = _ls_tree_lines(path, skip_pattern,
+                                         indent, branch_indent,
+                                         last_indent, last_branch_indent)
+                for x in subtree:
+                    yield branch_ind + x
+    for name, is_dir in entries[:-1]:
+        for line in ls_entry(name, is_dir, indent, branch_indent):
+            yield line
+    if entries:
+        name, is_dir = entries[-1]
+        for line in ls_entry(name, is_dir, last_indent, last_branch_indent):
+            yield line
+
+
+def absdir(path):
+    """Return absolute, normalized path to directory, if it exists; None
+    otherwise.
+    """
+    if not os.path.isabs(path):
+        path = os.path.normpath(os.path.abspath(os.path.join(os.getcwd(),
+                                                             path)))
+    if path is None or not os.path.isdir(path):
+        return None
+    return path
+
+
+def absfile(path, where=None):
+    """Return absolute, normalized path to file (optionally in directory
+    where), or None if the file can't be found either in where or the current
+    working directory.
+    """
+    orig = path
+    if where is None:
+        where = os.getcwd()
+    if isinstance(where, list) or isinstance(where, tuple):
+        for maybe_path in where:
+            maybe_abs = absfile(path, maybe_path)
+            if maybe_abs is not None:
+                return maybe_abs
+        return None
+    if not os.path.isabs(path):
+        path = os.path.normpath(os.path.abspath(os.path.join(where, path)))
+    if path is None or not os.path.exists(path):
+        if where != os.getcwd():
+            # try the cwd instead
+            path = os.path.normpath(os.path.abspath(os.path.join(os.getcwd(),
+                                                                 orig)))
+    if path is None or not os.path.exists(path):
+        return None
+    if os.path.isdir(path):
+        # might want an __init__.py from pacakge
+        init = os.path.join(path,'__init__.py')
+        if os.path.isfile(init):
+            return init
+    elif os.path.isfile(path):
+        return path
+    return None
+
+
+def anyp(predicate, iterable):
+    for item in iterable:
+        if predicate(item):
+            return True
+    return False
+
+
+def file_like(name):
+    """A name is file-like if it is a path that exists, or it has a
+    directory part, or it ends in .py, or it isn't a legal python
+    identifier.
+    """
+    return (os.path.exists(name)
+            or os.path.dirname(name)
+            or name.endswith('.py')
+            or not ident_re.match(os.path.splitext(name)[0]))
+
+
+def cmp_lineno(a, b):
+    """Compare functions by their line numbers.
+
+    >>> cmp_lineno(isgenerator, ispackage)
+    -1
+    >>> cmp_lineno(ispackage, isgenerator)
+    1
+    >>> cmp_lineno(isgenerator, isgenerator)
+    0
+    """
+    return cmp(func_lineno(a), func_lineno(b))
+
+
+def func_lineno(func):
+    """Get the line number of a function. First looks for
+    compat_co_firstlineno, then func_code.co_first_lineno.
+    """
+    try:
+        return func.compat_co_firstlineno
+    except AttributeError:
+        try:
+            return func.func_code.co_firstlineno
+        except AttributeError:
+            return -1
+
+
+def isclass(obj):
+    """Is obj a class? Inspect's isclass is too liberal and returns True
+    for objects that can't be subclasses of anything.
+    """
+    obj_type = type(obj)
+    return obj_type in class_types or issubclass(obj_type, type)
+
+
+def isgenerator(func):
+    try:
+        return func.func_code.co_flags & CO_GENERATOR != 0
+    except AttributeError:
+        return False
+# backwards compat (issue #64)
+is_generator = isgenerator
+
+
+def ispackage(path):
+    """
+    Is this path a package directory?
+
+    >>> ispackage('nose')
+    True
+    >>> ispackage('unit_tests')
+    False
+    >>> ispackage('nose/plugins')
+    True
+    >>> ispackage('nose/loader.py')
+    False
+    """
+    if os.path.isdir(path):
+        # at least the end of the path must be a legal python identifier
+        # and __init__.py[co] must exist
+        end = os.path.basename(path)
+        if ident_re.match(end):
+            for init in ('__init__.py', '__init__.pyc', '__init__.pyo'):
+                if os.path.isfile(os.path.join(path, init)):
+                    return True
+            if sys.platform.startswith('java') and \
+                    os.path.isfile(os.path.join(path, '__init__$py.class')):
+                return True
+    return False
+
+
+def isproperty(obj):
+    """
+    Is this a property?
+
+    >>> class Foo:
+    ...     def got(self):
+    ...         return 2
+    ...     def get(self):
+    ...         return 1
+    ...     get = property(get)
+
+    >>> isproperty(Foo.got)
+    False
+    >>> isproperty(Foo.get)
+    True
+    """
+    return type(obj) == property
+
+
+def getfilename(package, relativeTo=None):
+    """Find the python source file for a package, relative to a
+    particular directory (defaults to current working directory if not
+    given).
+    """
+    if relativeTo is None:
+        relativeTo = os.getcwd()
+    path = os.path.join(relativeTo, os.sep.join(package.split('.')))
+    suffixes = ('/__init__.py', '.py')
+    for suffix in suffixes:
+        filename = path + suffix
+        if os.path.exists(filename):
+            return filename
+    return None
+
+
+def getpackage(filename):
+    """
+    Find the full dotted package name for a given python source file
+    name. Returns None if the file is not a python source file.
+
+    >>> getpackage('foo.py')
+    'foo'
+    >>> getpackage('biff/baf.py')
+    'baf'
+    >>> getpackage('nose/util.py')
+    'nose.util'
+
+    Works for directories too.
+
+    >>> getpackage('nose')
+    'nose'
+    >>> getpackage('nose/plugins')
+    'nose.plugins'
+
+    And __init__ files stuck onto directories
+
+    >>> getpackage('nose/plugins/__init__.py')
+    'nose.plugins'
+
+    Absolute paths also work.
+
+    >>> path = os.path.abspath(os.path.join('nose', 'plugins'))
+    >>> getpackage(path)
+    'nose.plugins'
+    """
+    src_file = src(filename)
+    if not src_file.endswith('.py') and not ispackage(src_file):
+        return None
+    base, ext = os.path.splitext(os.path.basename(src_file))
+    if base == '__init__':
+        mod_parts = []
+    else:
+        mod_parts = [base]
+    path, part = os.path.split(os.path.split(src_file)[0])
+    while part:
+        if ispackage(os.path.join(path, part)):
+            mod_parts.append(part)
+        else:
+            break
+        path, part = os.path.split(path)
+    mod_parts.reverse()
+    return '.'.join(mod_parts)
+
+
+def ln(label):
+    """Draw a 70-char-wide divider, with label in the middle.
+
+    >>> ln('hello there')
+    '---------------------------- hello there -----------------------------'
+    """
+    label_len = len(label) + 2
+    chunk = (70 - label_len) / 2
+    out = '%s %s %s' % ('-' * chunk, label, '-' * chunk)
+    pad = 70 - len(out)
+    if pad > 0:
+        out = out + ('-' * pad)
+    return out
+
+
+def resolve_name(name, module=None):
+    """Resolve a dotted name to a module and its parts. This is stolen
+    wholesale from unittest.TestLoader.loadTestByName.
+
+    >>> resolve_name('nose.util') #doctest: +ELLIPSIS
+    <module 'nose.util' from...>
+    >>> resolve_name('nose.util.resolve_name') #doctest: +ELLIPSIS
+    <function resolve_name at...>
+    """
+    parts = name.split('.')
+    parts_copy = parts[:]
+    if module is None:
+        while parts_copy:
+            try:
+                log.debug("__import__ %s", name)
+                module = __import__('.'.join(parts_copy))
+                break
+            except ImportError:
+                del parts_copy[-1]
+                if not parts_copy:
+                    raise
+        parts = parts[1:]
+    obj = module
+    log.debug("resolve: %s, %s, %s, %s", parts, name, obj, module)
+    for part in parts:
+        obj = getattr(obj, part)
+    return obj
+
+
+def split_test_name(test):
+    """Split a test name into a 3-tuple containing file, module, and callable
+    names, any of which (but not all) may be blank.
+
+    Test names are in the form:
+
+    file_or_module:callable
+
+    Either side of the : may be dotted. To change the splitting behavior, you
+    can alter nose.util.split_test_re.
+    """
+    norm = os.path.normpath
+    file_or_mod = test
+    fn = None
+    if not ':' in test:
+        # only a file or mod part
+        if file_like(test):
+            return (norm(test), None, None)
+        else:
+            return (None, test, None)
+
+    # could be path|mod:callable, or a : in the file path someplace
+    head, tail = os.path.split(test)
+    if not head:
+        # this is a case like 'foo:bar' -- generally a module
+        # name followed by a callable, but also may be a windows
+        # drive letter followed by a path
+        try:
+            file_or_mod, fn = test.split(':')
+            if file_like(fn):
+                # must be a funny path
+                file_or_mod, fn = test, None
+        except ValueError:
+            # more than one : in the test
+            # this is a case like c:\some\path.py:a_test
+            parts = test.split(':')
+            if len(parts[0]) == 1:
+                file_or_mod, fn = ':'.join(parts[:-1]), parts[-1]
+            else:
+                # nonsense like foo:bar:baz
+                raise ValueError("Test name '%s' could not be parsed. Please "
+                                 "format test names as path:callable or "
+                                 "module:callable.")
+    elif not tail:
+        # this is a case like 'foo:bar/'
+        # : must be part of the file path, so ignore it
+        file_or_mod = test
+    else:
+        if ':' in tail:
+            file_part, fn = tail.split(':')
+        else:
+            file_part = tail
+        file_or_mod = os.sep.join([head, file_part])
+    if file_or_mod:
+        if file_like(file_or_mod):
+            return (norm(file_or_mod), None, fn)
+        else:
+            return (None, file_or_mod, fn)
+    else:
+        return (None, None, fn)
+split_test_name.__test__ = False # do not collect
+
+
+def test_address(test):
+    """Find the test address for a test, which may be a module, filename,
+    class, method or function.
+    """
+    if hasattr(test, "address"):
+        return test.address()
+    # type-based polymorphism sucks in general, but I believe is
+    # appropriate here
+    t = type(test)
+    file = module = call = None
+    if t == types.ModuleType:
+        file = getattr(test, '__file__', None)
+        module = getattr(test, '__name__', None)
+        return (src(file), module, call)
+    if t == types.FunctionType or issubclass(t, type) or t == types.ClassType:
+        module = getattr(test, '__module__', None)
+        if module is not None:
+            m = sys.modules[module]
+            file = getattr(m, '__file__', None)
+            if file is not None:
+                file = os.path.abspath(file)
+        call = getattr(test, '__name__', None)
+        return (src(file), module, call)
+    if t == types.InstanceType:
+        return test_address(test.__class__)
+    if t == types.MethodType:
+        cls_adr = test_address(test.im_class)
+        return (src(cls_adr[0]), cls_adr[1],
+                "%s.%s" % (cls_adr[2], test.__name__))
+    # handle unittest.TestCase instances
+    if isinstance(test, unittest.TestCase):
+        if hasattr(test, '_FunctionTestCase__testFunc'):
+            # unittest FunctionTestCase
+            return test_address(test._FunctionTestCase__testFunc)
+        # regular unittest.TestCase
+        cls_adr = test_address(test.__class__)
+        # 2.5 compat: __testMethodName changed to _testMethodName
+        try:
+            method_name = test._TestCase__testMethodName
+        except AttributeError:
+            method_name = test._testMethodName
+        return (src(cls_adr[0]), cls_adr[1],
+                "%s.%s" % (cls_adr[2], method_name))
+    raise TypeError("I don't know what %s is (%s)" % (test, t))
+test_address.__test__ = False # do not collect
+
+
+def try_run(obj, names):
+    """Given a list of possible method names, try to run them with the
+    provided object. Keep going until something works. Used to run
+    setup/teardown methods for module, package, and function tests.
+    """
+    for name in names:
+        func = getattr(obj, name, None)
+        if func is not None:
+            if type(obj) == types.ModuleType:
+                # py.test compatibility
+                try:
+                    args, varargs, varkw, defaults = inspect.getargspec(func)
+                except TypeError:
+                    # Not a function. If it's callable, call it anyway
+                    if hasattr(func, '__call__'):
+                        func = func.__call__
+                    try:
+                        args, varargs, varkw, defaults = \
+                            inspect.getargspec(func)
+                        args.pop(0) # pop the self off
+                    except TypeError:
+                        raise TypeError("Attribute %s of %r is not a python "
+                                        "function. Only functions or callables"
+                                        " may be used as fixtures." %
+                                        (name, obj))
+                if len(args):
+                    log.debug("call fixture %s.%s(%s)", obj, name, obj)
+                    return func(obj)
+            log.debug("call fixture %s.%s", obj, name)
+            return func()
+
+
+def src(filename):
+    """Find the python source file for a .pyc, .pyo or $py.class file on
+    jython. Returns the filename provided if it is not a python source
+    file.
+    """
+    if filename is None:
+        return filename
+    if sys.platform.startswith('java') and filename.endswith('$py.class'):
+        return '.'.join((filename[:-9], 'py'))
+    base, ext = os.path.splitext(filename)
+    if ext in ('.pyc', '.pyo', '.py'):
+        return '.'.join((base, 'py'))
+    return filename
+
+
+def match_last(a, b, regex):
+    """Sort compare function that puts items that match a
+    regular expression last.
+
+    >>> from nose.config import Config
+    >>> c = Config()
+    >>> regex = c.testMatch
+    >>> entries = ['.', '..', 'a_test', 'src', 'lib', 'test', 'foo.py']
+    >>> entries.sort(lambda a, b: match_last(a, b, regex))
+    >>> entries
+    ['.', '..', 'foo.py', 'lib', 'src', 'a_test', 'test']
+    """
+    if regex.search(a) and not regex.search(b):
+        return 1
+    elif regex.search(b) and not regex.search(a):
+        return -1
+    return cmp(a, b)
+
+
+def tolist(val):
+    """Convert a value that may be a list or a (possibly comma-separated)
+    string into a list. The exception: None is returned as None, not [None].
+
+    >>> tolist(["one", "two"])
+    ['one', 'two']
+    >>> tolist("hello")
+    ['hello']
+    >>> tolist("separate,values, with, commas,  spaces , are    ,ok")
+    ['separate', 'values', 'with', 'commas', 'spaces', 'are', 'ok']
+    """
+    if val is None:
+        return None
+    try:
+        # might already be a list
+        val.extend([])
+        return val
+    except AttributeError:
+        pass
+    # might be a string
+    try:
+        return re.split(r'\s*,\s*', val)
+    except TypeError:
+        # who knows...
+        return list(val)
+
+
+class odict(dict):
+    """Simple ordered dict implementation, based on:
+
+    http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/107747
+    """
+    def __init__(self, *arg, **kw):
+        self._keys = []
+        super(odict, self).__init__(*arg, **kw)
+
+    def __delitem__(self, key):
+        super(odict, self).__delitem__(key)
+        self._keys.remove(key)
+
+    def __setitem__(self, key, item):
+        super(odict, self).__setitem__(key, item)
+        if key not in self._keys:
+            self._keys.append(key)
+
+    def __str__(self):
+        return "{%s}" % ', '.join(["%r: %r" % (k, v) for k, v in self.items()])
+
+    def clear(self):
+        super(odict, self).clear()
+        self._keys = []
+
+    def copy(self):
+        d = super(odict, self).copy()
+        d._keys = self._keys[:]
+        return d
+
+    def items(self):
+        return zip(self._keys, self.values())
+
+    def keys(self):
+        return self._keys[:]
+
+    def setdefault(self, key, failobj=None):
+        item = super(odict, self).setdefault(key, failobj)
+        if key not in self._keys:
+            self._keys.append(key)
+        return item
+
+    def update(self, dict):
+        super(odict, self).update(dict)
+        for key in dict.keys():
+            if key not in self._keys:
+                self._keys.append(key)
+
+    def values(self):
+        return map(self.get, self._keys)
+
+
+def transplant_func(func, module):
+    """
+    Make a function imported from module A appear as if it is located
+    in module B.
+
+    >>> from pprint import pprint
+    >>> pprint.__module__
+    'pprint'
+    >>> pp = transplant_func(pprint, __name__)
+    >>> pp.__module__
+    'nose.util'
+
+    The original function is not modified.
+
+    >>> pprint.__module__
+    'pprint'
+
+    Calling the transplanted function calls the original.
+
+    >>> pp([1, 2])
+    [1, 2]
+    >>> pprint([1,2])
+    [1, 2]
+
+    """
+    from nose.tools import make_decorator
+    def newfunc(*arg, **kw):
+        return func(*arg, **kw)
+
+    newfunc = make_decorator(func)(newfunc)
+    newfunc.__module__ = module
+    return newfunc
+
+
+def transplant_class(cls, module):
+    """
+    Make a class appear to reside in `module`, rather than the module in which
+    it is actually defined.
+
+    >>> from nose.failure import Failure
+    >>> Failure.__module__
+    'nose.failure'
+    >>> Nf = transplant_class(Failure, __name__)
+    >>> Nf.__module__
+    'nose.util'
+    >>> Nf.__name__
+    'Failure'
+
+    """
+    class C(cls):
+        pass
+    C.__module__ = module
+    C.__name__ = cls.__name__
+    return C
+
+
+def safe_str(val, encoding='utf-8'):
+    try:
+        return str(val)
+    except UnicodeEncodeError:
+        if isinstance(val, Exception):
+            return ' '.join([safe_str(arg, encoding)
+                             for arg in val])
+        return unicode(val).encode(encoding)
+
+    
+if __name__ == '__main__':
+    import doctest
+    doctest.testmod()
Index: /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/result.py
===================================================================
--- /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/result.py (revision 3)
+++ /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/result.py (revision 3)
@@ -0,0 +1,175 @@
+"""
+Test Result
+-----------
+
+Provides a TextTestResult that extends unittest._TextTestResult to
+provide support for error classes (such as the builtin skip and
+deprecated classes), and hooks for plugins to take over or extend
+reporting.
+"""
+
+import logging
+from unittest import _TextTestResult
+from nose.config import Config
+from nose.util import isclass, ln as _ln # backwards compat
+
+log = logging.getLogger('nose.result')
+
+
+def _exception_detail(exc):
+    # this is what stdlib module traceback does
+    try:
+        return str(exc)
+    except:
+        return '<unprintable %s object>' % type(exc).__name__
+
+
+class TextTestResult(_TextTestResult):
+    """Text test result that extends unittest's default test result
+    support for a configurable set of errorClasses (eg, Skip,
+    Deprecated, TODO) that extend the errors/failures/success triad.
+    """    
+    def __init__(self, stream, descriptions, verbosity, config=None,
+                 errorClasses=None):        
+        if errorClasses is None:
+            errorClasses = {}
+        self.errorClasses = errorClasses
+        if config is None:
+            config = Config()       
+        self.config = config
+        _TextTestResult.__init__(self, stream, descriptions, verbosity)
+                
+    def addError(self, test, err):
+        """Overrides normal addError to add support for
+        errorClasses. If the exception is a registered class, the
+        error will be added to the list for that class, not errors.
+        """
+        stream = getattr(self, 'stream', None)
+        ec, ev, tb = err
+        try:
+            exc_info = self._exc_info_to_string(err, test)
+        except TypeError:
+            # 2.3 compat
+            exc_info = self._exc_info_to_string(err)
+        for cls, (storage, label, isfail) in self.errorClasses.items():
+            if isclass(ec) and issubclass(ec, cls):
+                if isfail:
+                    test.passed = False
+                storage.append((test, exc_info))
+                # Might get patched into a streamless result
+                if stream is not None:
+                    if self.showAll:
+                        message = [label]
+                        detail = _exception_detail(err[1])
+                        if detail:
+                            message.append(detail)
+                        stream.writeln(": ".join(message))
+                    elif self.dots:
+                        stream.write(label[:1])
+                return
+        self.errors.append((test, exc_info))
+        test.passed = False
+        if stream is not None:
+            if self.showAll:
+                self.stream.writeln('ERROR')
+            elif self.dots:
+                stream.write('E')
+
+    def printErrors(self):
+        """Overrides to print all errorClasses errors as well.
+        """
+        _TextTestResult.printErrors(self)
+        for cls in self.errorClasses.keys():
+            storage, label, isfail = self.errorClasses[cls]
+            if isfail:
+                self.printErrorList(label, storage)
+        # Might get patched into a result with no config
+        if hasattr(self, 'config'):
+            self.config.plugins.report(self.stream)
+
+    def printSummary(self, start, stop):
+        """Called by the test runner to print the final summary of test
+        run results.
+        """
+        write = self.stream.write
+        writeln = self.stream.writeln
+        taken = float(stop - start)
+        run = self.testsRun
+        plural = run != 1 and "s" or ""
+        
+        writeln(self.separator2)
+        writeln("Ran %s test%s in %.3fs" % (run, plural, taken))
+        writeln()
+
+        summary = {}
+        eckeys = self.errorClasses.keys()
+        eckeys.sort()
+        for cls in eckeys:
+            storage, label, isfail = self.errorClasses[cls]
+            count = len(storage)
+            if not count:
+                continue
+            summary[label] = count
+        if len(self.failures):
+            summary['failures'] = len(self.failures)
+        if len(self.errors):
+            summary['errors'] = len(self.errors)
+
+        if not self.wasSuccessful():
+            write("FAILED")
+        else:
+            write("OK")
+        items = summary.items()
+        if items:
+            items.sort()
+            write(" (")
+            write(", ".join(["%s=%s" % (label, count) for
+                             label, count in items]))
+            writeln(")")
+        else:
+            writeln()
+
+    def wasSuccessful(self):
+        """Overrides to check that there are no errors in errorClasses
+        lists that are marked as errors and should cause a run to
+        fail.
+        """
+        if self.errors or self.failures:
+            return False
+        for cls in self.errorClasses.keys():
+            storage, label, isfail = self.errorClasses[cls]
+            if not isfail:
+                continue
+            if storage:
+                return False
+        return True
+
+    def _addError(self, test, err):
+        try:
+            exc_info = self._exc_info_to_string(err, test)
+        except TypeError:
+            # 2.3: does not take test arg
+            exc_info = self._exc_info_to_string(err)
+        self.errors.append((test, exc_info))
+        if self.showAll:
+            self.stream.write('ERROR')
+        elif self.dots:
+            self.stream.write('E')
+
+    def _exc_info_to_string(self, err, test=None):
+        # 2.3/2.4 -- 2.4 passes test, 2.3 does not
+        try:
+            return _TextTestResult._exc_info_to_string(self, err, test)
+        except TypeError:
+            # 2.3: does not take test arg
+            return _TextTestResult._exc_info_to_string(self, err)
+
+
+def ln(*arg, **kw):
+    from warnings import warn
+    warn("ln() has moved to nose.util from nose.result and will be removed "
+         "from nose.result in a future release. Please update your imports ",
+         DeprecationWarning)
+    return _ln(*arg, **kw)
+    
+
Index: /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/exc.py
===================================================================
--- /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/exc.py (revision 3)
+++ /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/exc.py (revision 3)
@@ -0,0 +1,9 @@
+"""Exceptions for marking tests as skipped or deprecated.
+
+This module exists to provide backwards compatibility with previous
+versions of nose where skipped and deprecated tests were core
+functionality, rather than being provided by plugins. It may be
+removed in a future release.
+"""
+from nose.plugins.skip import SkipTest
+from nose.plugins.deprecated import DeprecatedTest
Index: /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/selector.py
===================================================================
--- /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/selector.py (revision 3)
+++ /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/selector.py (revision 3)
@@ -0,0 +1,251 @@
+"""
+Test Selection
+--------------
+
+Test selection is handled by a Selector. The test loader calls the
+appropriate selector method for each object it encounters that it
+thinks may be a test.
+"""
+import logging
+import os
+import unittest
+from nose.config import Config
+from nose.util import split_test_name, src, getfilename, getpackage, ispackage
+
+log = logging.getLogger(__name__)
+
+__all__ = ['Selector', 'defaultSelector', 'TestAddress']
+
+
+# for efficiency and easier mocking
+op_join = os.path.join
+op_basename = os.path.basename
+op_exists = os.path.exists
+op_splitext = os.path.splitext
+op_isabs = os.path.isabs
+op_abspath = os.path.abspath
+
+
+class Selector(object):
+    """Core test selector. Examines test candidates and determines whether,
+    given the specified configuration, the test candidate should be selected
+    as a test.
+    """
+    def __init__(self, config):
+        if config is None:
+            config = Config()
+        self.configure(config)
+
+    def configure(self, config):
+        self.config = config
+        self.exclude = config.exclude
+        self.ignoreFiles = config.ignoreFiles
+        self.include = config.include
+        self.plugins = config.plugins
+        self.match = config.testMatch
+        
+    def matches(self, name):
+        """Does the name match my requirements?
+
+        To match, a name must match config.testMatch OR config.include
+        and it must not match config.exclude
+        """
+        return ((self.match.search(name)
+                 or (self.include and
+                     filter(None,
+                            [inc.search(name) for inc in self.include])))
+                and ((not self.exclude)
+                     or not filter(None,
+                                   [exc.search(name) for exc in self.exclude])
+                 ))
+    
+    def wantClass(self, cls):
+        """Is the class a wanted test class?
+
+        A class must be a unittest.TestCase subclass, or match test name
+        requirements. Classes that start with _ are always excluded.
+        """
+        declared = getattr(cls, '__test__', None)
+        if declared is not None:
+            wanted = declared
+        else:
+            wanted = (not cls.__name__.startswith('_')
+                      and (issubclass(cls, unittest.TestCase)
+                           or self.matches(cls.__name__)))
+        
+        plug_wants = self.plugins.wantClass(cls)        
+        if plug_wants is not None:
+            log.debug("Plugin setting selection of %s to %s", cls, plug_wants)
+            wanted = plug_wants
+        log.debug("wantClass %s? %s", cls, wanted)
+        return wanted
+
+    def wantDirectory(self, dirname):
+        """Is the directory a wanted test directory?
+
+        All package directories match, so long as they do not match exclude. 
+        All other directories must match test requirements.
+        """
+        tail = op_basename(dirname)
+        if ispackage(dirname):
+            wanted = (not self.exclude
+                      or not filter(None,
+                                    [exc.search(tail) for exc in self.exclude]
+                                    ))
+        else:
+            wanted = (self.matches(tail)
+                      or (self.config.srcDirs
+                          and tail in self.config.srcDirs))
+        plug_wants = self.plugins.wantDirectory(dirname)
+        if plug_wants is not None:
+            log.debug("Plugin setting selection of %s to %s",
+                      dirname, plug_wants)
+            wanted = plug_wants
+        log.debug("wantDirectory %s? %s", dirname, wanted)
+        return wanted
+    
+    def wantFile(self, file):
+        """Is the file a wanted test file?
+
+        The file must be a python source file and match testMatch or
+        include, and not match exclude. Files that match ignore are *never*
+        wanted, regardless of plugin, testMatch, include or exclude settings.
+        """
+        # never, ever load files that match anything in ignore
+        # (.* _* and *setup*.py by default)
+        base = op_basename(file)
+        ignore_matches = [ ignore_this for ignore_this in self.ignoreFiles
+                           if ignore_this.search(base) ]
+        if ignore_matches:
+            log.debug('%s matches ignoreFiles pattern; skipped',
+                      base) 
+            return False
+        if not self.config.includeExe and os.access(file, os.X_OK):
+            log.info('%s is executable; skipped', file)
+            return False
+        dummy, ext = op_splitext(base)
+        pysrc = ext == '.py'
+
+        wanted = pysrc and self.matches(base) 
+        plug_wants = self.plugins.wantFile(file)
+        if plug_wants is not None:
+            log.debug("plugin setting want %s to %s", file, plug_wants)
+            wanted = plug_wants
+        log.debug("wantFile %s? %s", file, wanted)
+        return wanted
+
+    def wantFunction(self, function):
+        """Is the function a test function?
+        """
+        try:
+            if hasattr(function, 'compat_func_name'):
+                funcname = function.compat_func_name
+            else:
+                funcname = function.__name__
+        except AttributeError:
+            # not a function
+            return False
+        declared = getattr(function, '__test__', None)
+        if declared is not None:
+            wanted = declared
+        else:
+            wanted = not funcname.startswith('_') and self.matches(funcname)
+        plug_wants = self.plugins.wantFunction(function)
+        if plug_wants is not None:
+            wanted = plug_wants
+        log.debug("wantFunction %s? %s", function, wanted)
+        return wanted
+
+    def wantMethod(self, method):
+        """Is the method a test method?
+        """
+        try:
+            method_name = method.__name__
+        except AttributeError:
+            # not a method
+            return False
+        if method_name.startswith('_'):
+            # never collect 'private' methods
+            return False
+        declared = getattr(method, '__test__', None)
+        if declared is not None:
+            wanted = declared
+        else:
+            wanted = self.matches(method_name)
+        plug_wants = self.plugins.wantMethod(method)
+        if plug_wants is not None:
+            wanted = plug_wants
+        log.debug("wantMethod %s? %s", method, wanted)
+        return wanted
+    
+    def wantModule(self, module):
+        """Is the module a test module?
+
+        The tail of the module name must match test requirements. One exception:
+        we always want __main__.
+        """
+        declared = getattr(module, '__test__', None)
+        if declared is not None:
+            wanted = declared
+        else:
+            wanted = self.matches(module.__name__.split('.')[-1]) \
+                     or module.__name__ == '__main__'
+        plug_wants = self.plugins.wantModule(module)
+        if plug_wants is not None:
+            wanted = plug_wants
+        log.debug("wantModule %s? %s", module, wanted)
+        return wanted
+        
+defaultSelector = Selector        
+
+
+class TestAddress(object):
+    """A test address represents a user's request to run a particular
+    test. The user may specify a filename or module (or neither),
+    and/or a callable (a class, function, or method). The naming
+    format for test addresses is:
+
+    filename_or_module:callable
+
+    Filenames that are not absolute will be made absolute relative to
+    the working dir.
+
+    The filename or module part will be considered a module name if it
+    doesn't look like a file, that is, if it doesn't exist on the file
+    system and it doesn't contain any directory separators and it
+    doesn't end in .py.
+
+    Callables may be a class name, function name, method name, or
+    class.method specification.
+    """
+    def __init__(self, name, workingDir=None):
+        if workingDir is None:
+            workingDir = os.getcwd()
+        self.name = name
+        self.workingDir = workingDir
+        self.filename, self.module, self.call = split_test_name(name)
+        log.debug('Test name %s resolved to file %s, module %s, call %s',
+                  name, self.filename, self.module, self.call)
+        if self.filename is None:
+            if self.module is not None:
+                self.filename = getfilename(self.module, self.workingDir)
+        if self.filename:
+            self.filename = src(self.filename)
+            if not op_isabs(self.filename):
+                self.filename = op_abspath(op_join(workingDir,
+                                                   self.filename))
+            if self.module is None:
+                self.module = getpackage(self.filename)
+        log.debug(
+            'Final resolution of test name %s: file %s module %s call %s',
+            name, self.filename, self.module, self.call)
+
+    def totuple(self):
+        return (self.filename, self.module, self.call)
+        
+    def __str__(self):
+        return self.name
+
+    def __repr__(self):
+        return "%s: (%s, %s, %s)" % (self.name, self.filename,
+                                     self.module, self.call)
Index: /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/proxy.py
===================================================================
--- /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/proxy.py (revision 3)
+++ /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/proxy.py (revision 3)
@@ -0,0 +1,168 @@
+"""
+Result Proxy
+------------
+
+The result proxy wraps the result instance given to each test. It
+performs two functions: enabling extended error/failure reporting
+and calling plugins.
+
+As each result event is fired, plugins are called with the same event;
+however, plugins are called with the nose.case.Test instance that
+wraps the actual test. So when a test fails and calls
+result.addFailure(self, err), the result proxy calls
+addFailure(self.test, err) for each plugin. This allows plugins to
+have a single stable interface for all test types, and also to
+manipulate the test object itself by setting the `test` attribute of
+the nose.case.Test that they receive.
+"""
+import logging
+from nose.config import Config
+
+
+log = logging.getLogger(__name__)
+
+
+def proxied_attribute(local_attr, proxied_attr, doc):
+    """Create a property that proxies attribute ``proxied_attr`` through
+    the local attribute ``local_attr``.
+    """
+    def fget(self):
+        return getattr(getattr(self, local_attr), proxied_attr)
+    def fset(self, value):
+        setattr(getattr(self, local_attr), proxied_attr, value)
+    def fdel(self):
+        delattr(getattr(self, local_attr), proxied_attr)
+    return property(fget, fset, fdel, doc)
+
+
+class ResultProxyFactory(object):
+    """Factory for result proxies. Generates a ResultProxy bound to each test
+    and the result passed to the test.
+    """
+    def __init__(self, config=None):
+        if config is None:
+            config = Config()
+        self.config = config
+        self.__prepared = False
+        self.__result = None
+
+    def __call__(self, result, test):
+        """Return a ResultProxy for the current test.
+
+        On first call, plugins are given a chance to replace the
+        result used for the remaining tests. If a plugin returns a
+        value from prepareTestResult, that object will be used as the
+        result for all tests.
+        """
+        if not self.__prepared:
+            self.__prepared = True
+            plug_result = self.config.plugins.prepareTestResult(result)
+            if plug_result is not None:
+                self.__result = result = plug_result
+        if self.__result is not None:
+            result = self.__result
+        return ResultProxy(result, test, config=self.config)
+
+
+class ResultProxy(object):
+    """Proxy to TestResults (or other results handler).
+
+    One ResultProxy is created for each nose.case.Test. The result
+    proxy calls plugins with the nose.case.Test instance (instead of
+    the wrapped test case) as each result call is made. Finally, the
+    real result method is called, also with the nose.case.Test
+    instance as the test parameter.
+    
+    """    
+    def __init__(self, result, test, config=None):
+        if config is None:
+            config = Config()
+        self.config = config
+        self.plugins = config.plugins
+        self.result = result
+        self.test = test
+
+    def __repr__(self):
+        return repr(self.result)
+
+    def assertMyTest(self, test):
+        # The test I was called with must be my .test or my
+        # .test's .test. or my .test.test's .case
+
+        case = getattr(self.test, 'test', None)
+        assert (test is self.test 
+                or test is case 
+                or test is getattr(case, '_nose_case', None)), ( 
+                "ResultProxy for %r (%s) was called with test %r (%s)" 
+                % (self.test, id(self.test), test, id(test)))
+    
+    def afterTest(self, test):
+        self.assertMyTest(test)
+        self.plugins.afterTest(self.test)
+        if hasattr(self.result, "afterTest"):
+            self.result.afterTest(self.test)
+
+    def beforeTest(self, test):
+        self.assertMyTest(test)
+        self.plugins.beforeTest(self.test)
+        if hasattr(self.result, "beforeTest"):
+            self.result.beforeTest(self.test)
+
+    def addError(self, test, err):
+        self.assertMyTest(test)
+        plugins = self.plugins
+        plugin_handled = plugins.handleError(self.test, err)
+        if plugin_handled:
+            return
+        # test.passed is set in result, to account for error classes
+        formatted = plugins.formatError(self.test, err)
+        if formatted is not None:
+            err = formatted
+        plugins.addError(self.test, err)
+        self.result.addError(self.test, err)
+        if not self.result.wasSuccessful() and self.config.stopOnError:
+            self.shouldStop = True
+
+    def addFailure(self, test, err):
+        self.assertMyTest(test)
+        plugins = self.plugins
+        plugin_handled = plugins.handleFailure(self.test, err)
+        if plugin_handled:
+            return
+        self.test.passed = False
+        formatted = plugins.formatFailure(self.test, err)
+        if formatted is not None:
+            err = formatted
+        plugins.addFailure(self.test, err)
+        self.result.addFailure(self.test, err)
+        if self.config.stopOnError:
+            self.shouldStop = True
+    
+    def addSuccess(self, test):
+        self.assertMyTest(test)
+        self.plugins.addSuccess(self.test)
+        self.result.addSuccess(self.test)
+
+    def startTest(self, test):
+        self.assertMyTest(test)
+        self.plugins.startTest(self.test)
+        self.result.startTest(self.test)
+    
+    def stop(self):
+        self.result.stop()
+    
+    def stopTest(self, test):
+        self.assertMyTest(test)
+        self.plugins.stopTest(self.test)
+        self.result.stopTest(self.test)
+
+    # proxied attributes
+    shouldStop = proxied_attribute('result', 'shouldStop',
+                                    """Should the test run stop?""")
+    errors = proxied_attribute('result', 'errors',
+                               """Tests that raised an exception""")
+    failures = proxied_attribute('result', 'failures',
+                                 """Tests that failed""")
+    testsRun = proxied_attribute('result', 'testsRun',
+                                 """Number of tests run""")
+
Index: /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/sphinx/__init__.py
===================================================================
--- /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/sphinx/__init__.py (revision 3)
+++ /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/sphinx/__init__.py (revision 3)
@@ -0,0 +1,1 @@
+pass
Index: /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/sphinx/pluginopts.py
===================================================================
--- /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/sphinx/pluginopts.py (revision 3)
+++ /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/sphinx/pluginopts.py (revision 3)
@@ -0,0 +1,184 @@
+"""
+Adds a sphinx directive that can be used to automatically document a plugin.
+
+this::
+
+ .. autoplugin :: nose.plugins.foo
+    :plugin: Pluggy
+    
+produces::
+
+  .. automodule :: nose.plugins.foo
+  
+  Options
+  -------
+
+  .. cmdoption :: --foo=BAR, --fooble=BAR
+
+    Do the foo thing to the new thing.
+
+  Plugin
+  ------
+
+  .. autoclass :: nose.plugins.foo.Pluggy
+     :members:
+
+  Source
+  ------
+
+  .. include :: path/to/nose/plugins/foo.py
+     :literal:
+
+"""
+try:
+    from docutils import nodes
+    from docutils.statemachine import ViewList
+    from docutils.parsers.rst import directives
+except ImportError:
+    pass # won't run anyway
+
+from nose.util import resolve_name
+from nose.plugins.base import Plugin
+from nose.plugins.manager import BuiltinPluginManager
+from nose.config import Config
+from nose.core import TestProgram
+from inspect import isclass
+
+def autoplugin_directive(dirname, arguments, options, content, lineno,
+                         content_offset, block_text, state, state_machine):
+    mod_name = arguments[0]
+    mod = resolve_name(mod_name)
+    plug_name = options.get('plugin', None)
+    if plug_name:
+        obj = getattr(mod, plug_name)
+    else:
+        for entry in dir(mod):
+            obj = getattr(mod, entry)
+            if isclass(obj) and issubclass(obj, Plugin) and obj is not Plugin:
+                plug_name = '%s.%s' % (mod_name, entry)
+                break
+    
+    # mod docstring
+    rst = ViewList()
+    rst.append('.. automodule :: %s\n' % mod_name, '<autodoc>')
+    rst.append('', '<autodoc>')
+    
+    # options
+    rst.append('Options', '<autodoc>')
+    rst.append('-------', '<autodoc>')
+    rst.append('', '<autodoc>')
+
+    plug = obj()
+    opts = OptBucket()
+    plug.options(opts, {})
+    for opt in opts:
+        rst.append(opt.options(), '<autodoc>')
+        rst.append('   \n', '<autodoc>')
+        rst.append('   ' + opt.help + '\n', '<autodoc>')
+        rst.append('\n', '<autodoc>')
+        
+    # plugin class
+    rst.append('Plugin', '<autodoc>')
+    rst.append('------', '<autodoc>')
+    rst.append('', '<autodoc>')
+    
+    rst.append('.. autoclass :: %s\n' % plug_name, '<autodoc>')
+    rst.append('   :members:\n', '<autodoc>')
+    rst.append('   :show-inheritance:\n', '<autodoc>')
+    rst.append('', '<autodoc>')
+    
+    # source
+    rst.append('Source', '<autodoc>')
+    rst.append('------', '<autodoc>')
+    rst.append('.. include :: %s\n' % mod.__file__.replace('.pyc', '.py'),
+               '<autodoc>')
+    rst.append('   :literal:\n', '<autodoc>')
+    rst.append('', '<autodoc>')
+    
+    node = nodes.section()
+    node.document = state.document
+    surrounding_title_styles = state.memo.title_styles
+    surrounding_section_level = state.memo.section_level
+    state.memo.title_styles = []
+    state.memo.section_level = 0
+    state.nested_parse(rst, 0, node, match_titles=1)
+    state.memo.title_styles = surrounding_title_styles
+    state.memo.section_level = surrounding_section_level
+
+    return node.children
+
+
+def autohelp_directive(dirname, arguments, options, content, lineno,
+                       content_offset, block_text, state, state_machine):
+    """produces rst from nose help"""
+    config = Config(parserClass=OptBucket,
+                    plugins=BuiltinPluginManager())
+    parser = config.getParser(TestProgram.usage())
+    rst = ViewList()
+    for line in parser.format_help().split('\n'):
+        rst.append(line, '<autodoc>')
+
+    rst.append('Options', '<autodoc>')
+    rst.append('-------', '<autodoc>')
+    rst.append('', '<autodoc>')
+    for opt in parser:
+        rst.append(opt.options(), '<autodoc>')
+        rst.append('   \n', '<autodoc>')
+        rst.append('   ' + opt.help + '\n', '<autodoc>')
+        rst.append('\n', '<autodoc>')    
+    node = nodes.section()
+    node.document = state.document
+    surrounding_title_styles = state.memo.title_styles
+    surrounding_section_level = state.memo.section_level
+    state.memo.title_styles = []
+    state.memo.section_level = 0
+    state.nested_parse(rst, 0, node, match_titles=1)
+    state.memo.title_styles = surrounding_title_styles
+    state.memo.section_level = surrounding_section_level
+
+    return node.children
+
+    
+class OptBucket(object):
+    def __init__(self, doc=None, prog='nosetests'):
+        self.opts = []
+        self.doc = doc
+        self.prog = prog
+
+    def __iter__(self):
+        return iter(self.opts)
+
+    def format_help(self):
+        return self.doc.replace('%prog', self.prog).replace(':\n', '::\n')
+    
+    def add_option(self, *arg, **kw):
+        self.opts.append(Opt(*arg, **kw))
+
+
+class Opt(object):
+    def __init__(self, *arg, **kw):
+        self.opts = arg
+        self.action = kw.pop('action', None)
+        self.default = kw.pop('default', None)
+        self.metavar = kw.pop('metavar', None)
+        self.help = kw.pop('help', None)
+
+    def options(self):
+        buf = []
+        for optstring in self.opts:
+            desc = optstring
+            if self.action not in ('store_true', 'store_false'):
+                desc += '=%s' % self.meta(optstring)
+            buf.append(desc)
+        return '.. cmdoption :: ' + ', '.join(buf)
+
+    def meta(self, optstring):
+        # FIXME optparser default metavar?
+        return self.metavar or 'DEFAULT'
+
+    
+def setup(app):
+    app.add_directive('autoplugin',
+                      autoplugin_directive, 1, (1, 0, 1),
+                      plugin=directives.unchanged)
+    app.add_directive('autohelp', autohelp_directive, 0, (0, 0, 1))
Index: /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/failure.py
===================================================================
--- /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/failure.py (revision 3)
+++ /galaxy-central/eggs/nose-0.11.1-py2.6.egg/nose/failure.py (revision 3)
@@ -0,0 +1,39 @@
+import logging
+import unittest
+from traceback import format_tb
+
+log = logging.getLogger(__name__)
+
+
+__all__ = ['Failure']
+
+
+class Failure(unittest.TestCase):
+    """Unloadable or unexecutable test.
+
+    A Failure case is placed in a test suite to indicate the presence of a
+    test that could not be loaded or executed. A common example is a test
+    module that fails to import.
+    
+    """
+    __test__ = False # do not collect
+    def __init__(self, exc_class, exc_val, tb=None, address=None):
+        log.debug("A failure! %s %s %s", exc_class, exc_val, format_tb(tb))
+        self.exc_class = exc_class
+        self.exc_val = exc_val
+        self.tb = tb
+        self._address = address
+        unittest.TestCase.__init__(self)
+
+    def __str__(self):
+        return "Failure: %s (%s)" % (
+            getattr(self.exc_class, '__name__', self.exc_class), self.exc_val)
+
+    def address(self):
+        return self._address
+    
+    def runTest(self):
+        if self.tb is not None:            
+            raise self.exc_class, self.exc_val, self.tb
+        else:
+            raise self.exc_class(self.exc_val)
Index: /galaxy-central/eggs/nose-0.11.1-py2.6.egg/EGG-INFO/SOURCES.txt
===================================================================
--- /galaxy-central/eggs/nose-0.11.1-py2.6.egg/EGG-INFO/SOURCES.txt (revision 3)
+++ /galaxy-central/eggs/nose-0.11.1-py2.6.egg/EGG-INFO/SOURCES.txt (revision 3)
@@ -0,0 +1,366 @@
+AUTHORS
+CHANGELOG
+MANIFEST.in
+NEWS
+README.txt
+install-rpm.sh
+lgpl.txt
+nosetests.1
+scramble.py
+selftest.py
+setup.cfg
+setup.py
+bin/nosetests
+doc/Makefile
+doc/api.rst
+doc/conf.py
+doc/contributing.rst
+doc/developing.rst
+doc/docstring.py
+doc/finding_tests.rst
+doc/further_reading.rst
+doc/index.html
+doc/index.rst
+doc/man.rst
+doc/manbuilder.py
+doc/manbuilder.pyc
+doc/manpage.py
+doc/manpage.pyc
+doc/more_info.rst
+doc/news.rst
+doc/plugins.rst
+doc/setuptools_integration.rst
+doc/testing.rst
+doc/testing_tools.rst
+doc/usage.rst
+doc/writing_tests.rst
+doc/.static/nose.css
+doc/.templates/index.html
+doc/.templates/indexsidebar.html
+doc/.templates/layout.html
+doc/.templates/page.html
+doc/api/commands.rst
+doc/api/config.rst
+doc/api/core.rst
+doc/api/importer.rst
+doc/api/inspector.rst
+doc/api/loader.rst
+doc/api/plugin_manager.rst
+doc/api/proxy.rst
+doc/api/result.rst
+doc/api/selector.rst
+doc/api/suite.rst
+doc/api/test_cases.rst
+doc/api/twistedtools.rst
+doc/api/util.rst
+doc/plugins/allmodules.rst
+doc/plugins/attrib.rst
+doc/plugins/builtin.rst
+doc/plugins/capture.rst
+doc/plugins/collect.rst
+doc/plugins/cover.rst
+doc/plugins/debug.rst
+doc/plugins/deprecated.rst
+doc/plugins/doctests.rst
+doc/plugins/documenting.rst
+doc/plugins/errorclasses.rst
+doc/plugins/failuredetail.rst
+doc/plugins/interface.rst
+doc/plugins/isolate.rst
+doc/plugins/logcapture.rst
+doc/plugins/multiprocess.rst
+doc/plugins/other.rst
+doc/plugins/prof.rst
+doc/plugins/skip.rst
+doc/plugins/testid.rst
+doc/plugins/testing.rst
+doc/plugins/writing.rst
+doc/plugins/xunit.rst
+examples/attrib_plugin.py
+examples/html_plugin/htmlplug.py
+examples/html_plugin/setup.py
+examples/plugin/plug.py
+examples/plugin/setup.py
+functional_tests/test_attribute_plugin.py
+functional_tests/test_buggy_generators.py
+functional_tests/test_cases.py
+functional_tests/test_collector.py
+functional_tests/test_commands.py
+functional_tests/test_config_files.py
+functional_tests/test_doctest_plugin.py
+functional_tests/test_entrypoints.py
+functional_tests/test_failuredetail_plugin.py
+functional_tests/test_generator_fixtures.py
+functional_tests/test_id_plugin.py
+functional_tests/test_importer.py
+functional_tests/test_isolate_plugin.py
+functional_tests/test_issue_072.py
+functional_tests/test_issue_082.py
+functional_tests/test_load_tests_from_test_case.py
+functional_tests/test_loader.py
+functional_tests/test_namespace_pkg.py
+functional_tests/test_plugin_api.py
+functional_tests/test_plugins.py
+functional_tests/test_plugintest.py
+functional_tests/test_program.py
+functional_tests/test_result.py
+functional_tests/test_selector.py
+functional_tests/test_skip_pdb_interaction.py
+functional_tests/test_success.py
+functional_tests/test_suite.py
+functional_tests/test_withid_failures.rst
+functional_tests/test_xunit.py
+functional_tests/doc_tests/test_addplugins/test_addplugins.rst
+functional_tests/doc_tests/test_addplugins/support/test.py
+functional_tests/doc_tests/test_allmodules/test_allmodules.rst
+functional_tests/doc_tests/test_allmodules/support/mod.py
+functional_tests/doc_tests/test_allmodules/support/test.py
+functional_tests/doc_tests/test_coverage_html/coverage_html.rst
+functional_tests/doc_tests/test_coverage_html/coverage_html_fixtures.py
+functional_tests/doc_tests/test_coverage_html/support/blah.py
+functional_tests/doc_tests/test_coverage_html/support/cover/blah.html
+functional_tests/doc_tests/test_coverage_html/support/tests/test_covered.py
+functional_tests/doc_tests/test_doctest_fixtures/doctest_fixtures.rst
+functional_tests/doc_tests/test_doctest_fixtures/doctest_fixtures_fixtures.py
+functional_tests/doc_tests/test_init_plugin/init_plugin.rst
+functional_tests/doc_tests/test_issue089/unwanted_package.rst
+functional_tests/doc_tests/test_issue089/support/unwanted_package/__init__.py
+functional_tests/doc_tests/test_issue089/support/unwanted_package/test_spam.py
+functional_tests/doc_tests/test_issue089/support/wanted_package/__init__.py
+functional_tests/doc_tests/test_issue089/support/wanted_package/test_eggs.py
+functional_tests/doc_tests/test_issue097/plugintest_environment.rst
+functional_tests/doc_tests/test_issue107/plugin_exceptions.rst
+functional_tests/doc_tests/test_issue107/support/test_spam.py
+functional_tests/doc_tests/test_issue119/empty_plugin.rst
+functional_tests/doc_tests/test_issue119/test_zeronine.py
+functional_tests/doc_tests/test_issue142/errorclass_failure.rst
+functional_tests/doc_tests/test_issue142/support/errorclass_failing_test.py
+functional_tests/doc_tests/test_issue142/support/errorclass_failure_plugin.py
+functional_tests/doc_tests/test_issue142/support/errorclass_tests.py
+functional_tests/doc_tests/test_issue145/imported_tests.rst
+functional_tests/doc_tests/test_issue145/support/package1/__init__.py
+functional_tests/doc_tests/test_issue145/support/package1/test_module.py
+functional_tests/doc_tests/test_issue145/support/package2c/__init__.py
+functional_tests/doc_tests/test_issue145/support/package2c/test_module.py
+functional_tests/doc_tests/test_issue145/support/package2f/__init__.py
+functional_tests/doc_tests/test_issue145/support/package2f/test_module.py
+functional_tests/doc_tests/test_multiprocess/multiprocess.rst
+functional_tests/doc_tests/test_multiprocess/multiprocess_fixtures.py
+functional_tests/doc_tests/test_multiprocess/support/test_can_split.py
+functional_tests/doc_tests/test_multiprocess/support/test_not_shared.py
+functional_tests/doc_tests/test_multiprocess/support/test_shared.py
+functional_tests/doc_tests/test_restricted_plugin_options/restricted_plugin_options.rst
+functional_tests/doc_tests/test_restricted_plugin_options/support/bad.cfg
+functional_tests/doc_tests/test_restricted_plugin_options/support/start.cfg
+functional_tests/doc_tests/test_restricted_plugin_options/support/test.py
+functional_tests/doc_tests/test_selector_plugin/selector_plugin.rst
+functional_tests/doc_tests/test_selector_plugin/support/mymodule.py
+functional_tests/doc_tests/test_selector_plugin/support/mypackage/__init__.py
+functional_tests/doc_tests/test_selector_plugin/support/mypackage/strings.py
+functional_tests/doc_tests/test_selector_plugin/support/mypackage/math/__init__.py
+functional_tests/doc_tests/test_selector_plugin/support/mypackage/math/basic.py
+functional_tests/doc_tests/test_selector_plugin/support/tests/testlib.py
+functional_tests/doc_tests/test_selector_plugin/support/tests/math/basic.py
+functional_tests/doc_tests/test_selector_plugin/support/tests/mymodule/my_function.py
+functional_tests/doc_tests/test_selector_plugin/support/tests/strings/cat.py
+functional_tests/doc_tests/test_xunit_plugin/test_skips.rst
+functional_tests/doc_tests/test_xunit_plugin/support/test_skip.py
+functional_tests/support/test.cfg
+functional_tests/support/test_buggy_generators.py
+functional_tests/support/att/test_attr.py
+functional_tests/support/ctx/mod_import_skip.py
+functional_tests/support/ctx/mod_setup_fails.py
+functional_tests/support/ctx/mod_setup_skip.py
+functional_tests/support/dir1/mod.py
+functional_tests/support/dir1/pak/__init__.py
+functional_tests/support/dir1/pak/mod.py
+functional_tests/support/dir1/pak/sub/__init__.py
+functional_tests/support/dir2/mod.py
+functional_tests/support/dir2/pak/__init__.py
+functional_tests/support/dir2/pak/mod.py
+functional_tests/support/dir2/pak/sub/__init__.py
+functional_tests/support/dtt/some_mod.py
+functional_tests/support/dtt/docs/doc.txt
+functional_tests/support/dtt/docs/errdoc.txt
+functional_tests/support/dtt/docs/nodoc.txt
+functional_tests/support/empty/.hidden
+functional_tests/support/ep/setup.py
+functional_tests/support/ep/someplugin.py
+functional_tests/support/ep/Some_plugin.egg-info/PKG-INFO
+functional_tests/support/ep/Some_plugin.egg-info/SOURCES.txt
+functional_tests/support/ep/Some_plugin.egg-info/dependency_links.txt
+functional_tests/support/ep/Some_plugin.egg-info/entry_points.txt
+functional_tests/support/ep/Some_plugin.egg-info/top_level.txt
+functional_tests/support/fdp/test_fdp.py
+functional_tests/support/fdp/test_fdp_no_capt.py
+functional_tests/support/gen/test.py
+functional_tests/support/id_fails/test_a.py
+functional_tests/support/id_fails/test_b.py
+functional_tests/support/idp/exm.py
+functional_tests/support/idp/tests.py
+functional_tests/support/ipt/test1/ipthelp.py
+functional_tests/support/ipt/test1/tests.py
+functional_tests/support/ipt/test2/ipthelp.py
+functional_tests/support/ipt/test2/tests.py
+functional_tests/support/issue038/test.py
+functional_tests/support/issue072/test.py
+functional_tests/support/issue082/_mypackage/__init__.py
+functional_tests/support/issue082/_mypackage/_eggs.py
+functional_tests/support/issue082/_mypackage/bacon.py
+functional_tests/support/issue082/mypublicpackage/__init__.py
+functional_tests/support/issue082/mypublicpackage/_foo.py
+functional_tests/support/issue082/mypublicpackage/bar.py
+functional_tests/support/issue130/test.py
+functional_tests/support/issue143/not-a-package/__init__.py
+functional_tests/support/issue143/not-a-package/test.py
+functional_tests/support/issue191/setup.cfg
+functional_tests/support/issue191/setup.py
+functional_tests/support/issue191/test.py
+functional_tests/support/ltfn/state.py
+functional_tests/support/ltfn/test_mod.py
+functional_tests/support/ltfn/test_pak1/__init__.py
+functional_tests/support/ltfn/test_pak1/test_mod.py
+functional_tests/support/ltfn/test_pak2/__init__.py
+functional_tests/support/ltftc/tests.py
+functional_tests/support/namespace_pkg/namespace_pkg/__init__.py
+functional_tests/support/namespace_pkg/namespace_pkg/example.py
+functional_tests/support/namespace_pkg/namespace_pkg/test_pkg.py
+functional_tests/support/namespace_pkg/site-packages/namespace_pkg/__init__.py
+functional_tests/support/namespace_pkg/site-packages/namespace_pkg/example2.py
+functional_tests/support/namespace_pkg/site-packages/namespace_pkg/test_pkg2.py
+functional_tests/support/package1/example.py
+functional_tests/support/package1/tests/test_example_function.py
+functional_tests/support/package2/maths.py
+functional_tests/support/package2/test_pak/__init__.py
+functional_tests/support/package2/test_pak/test_mod.py
+functional_tests/support/package2/test_pak/test_sub/__init__.py
+functional_tests/support/package2/test_pak/test_sub/test_mod.py
+functional_tests/support/package3/lib/a.py
+functional_tests/support/package3/src/b.py
+functional_tests/support/package3/tests/test_a.py
+functional_tests/support/package3/tests/test_b.py
+functional_tests/support/pass/test.py
+functional_tests/support/todo/test_with_todo.py
+functional_tests/support/todo/todoplug.py
+functional_tests/support/twist/test_twisted.py
+functional_tests/support/xunit/test_xunit_as_suite.py
+functional_tests/test_issue120/test_named_test_with_doctest.rst
+functional_tests/test_issue120/support/some_test.py
+nose/__init__.py
+nose/case.py
+nose/commands.py
+nose/config.py
+nose/core.py
+nose/exc.py
+nose/failure.py
+nose/importer.py
+nose/inspector.py
+nose/loader.py
+nose/proxy.py
+nose/result.py
+nose/selector.py
+nose/suite.py
+nose/tools.py
+nose/twistedtools.py
+nose/usage.txt
+nose/util.py
+nose.egg-info/PKG-INFO
+nose.egg-info/SOURCES.txt
+nose.egg-info/dependency_links.txt
+nose.egg-info/entry_points.txt
+nose.egg-info/not-zip-safe
+nose.egg-info/top_level.txt
+nose/ext/__init__.py
+nose/ext/dtcompat.py
+nose/plugins/__init__.py
+nose/plugins/allmodules.py
+nose/plugins/attrib.py
+nose/plugins/base.py
+nose/plugins/builtin.py
+nose/plugins/capture.py
+nose/plugins/collect.py
+nose/plugins/cover.py
+nose/plugins/debug.py
+nose/plugins/deprecated.py
+nose/plugins/doctests.py
+nose/plugins/errorclass.py
+nose/plugins/failuredetail.py
+nose/plugins/isolate.py
+nose/plugins/logcapture.py
+nose/plugins/manager.py
+nose/plugins/multiprocess.py
+nose/plugins/plugintest.py
+nose/plugins/prof.py
+nose/plugins/skip.py
+nose/plugins/testid.py
+nose/plugins/xunit.py
+nose/sphinx/__init__.py
+nose/sphinx/pluginopts.py
+unit_tests/helpers.py
+unit_tests/mock.py
+unit_tests/test_attribute_plugin.py
+unit_tests/test_bug105.py
+unit_tests/test_capture_plugin.py
+unit_tests/test_cases.py
+unit_tests/test_config.py
+unit_tests/test_config_defaults.rst
+unit_tests/test_core.py
+unit_tests/test_deprecated_plugin.py
+unit_tests/test_doctest_error_handling.py
+unit_tests/test_doctest_munging.rst
+unit_tests/test_id_plugin.py
+unit_tests/test_importer.py
+unit_tests/test_inspector.py
+unit_tests/test_isolation_plugin.py
+unit_tests/test_issue155.rst
+unit_tests/test_issue_006.py
+unit_tests/test_issue_064.py
+unit_tests/test_issue_065.py
+unit_tests/test_issue_100.rst
+unit_tests/test_issue_101.py
+unit_tests/test_issue_159.rst
+unit_tests/test_issue_227.py
+unit_tests/test_issue_230.py
+unit_tests/test_lazy_suite.py
+unit_tests/test_loader.py
+unit_tests/test_logcapture_plugin.py
+unit_tests/test_logging.py
+unit_tests/test_ls_tree.rst
+unit_tests/test_multiprocess_runner.py
+unit_tests/test_pdb_plugin.py
+unit_tests/test_plugin.py
+unit_tests/test_plugin_interfaces.py
+unit_tests/test_plugin_manager.py
+unit_tests/test_plugins.py
+unit_tests/test_result_proxy.py
+unit_tests/test_selector.py
+unit_tests/test_selector_plugins.py
+unit_tests/test_skip_plugin.py
+unit_tests/test_suite.py
+unit_tests/test_tools.py
+unit_tests/test_twisted.py
+unit_tests/test_twisted_testcase.py
+unit_tests/test_utils.py
+unit_tests/test_xunit.py
+unit_tests/support/script.py
+unit_tests/support/test.py
+unit_tests/support/bug101/tests.py
+unit_tests/support/bug105/tests.py
+unit_tests/support/config_defaults/a.cfg
+unit_tests/support/config_defaults/b.cfg
+unit_tests/support/config_defaults/invalid.cfg
+unit_tests/support/config_defaults/invalid_value.cfg
+unit_tests/support/doctest/err_doctests.py
+unit_tests/support/doctest/no_doctests.py
+unit_tests/support/foo/__init__.py
+unit_tests/support/foo/doctests.txt
+unit_tests/support/foo/test_foo.py
+unit_tests/support/foo/bar/__init__.py
+unit_tests/support/foo/bar/buz.py
+unit_tests/support/foo/tests/dir_test_file.py
+unit_tests/support/issue006/tests.py
+unit_tests/support/issue065/tests.py
+unit_tests/support/other/file.txt
+unit_tests/support/pkgorg/lib/modernity.py
+unit_tests/support/pkgorg/tests/test_mod.py
+unit_tests/support/test-dir/test.py
Index: /galaxy-central/eggs/nose-0.11.1-py2.6.egg/EGG-INFO/top_level.txt
===================================================================
--- /galaxy-central/eggs/nose-0.11.1-py2.6.egg/EGG-INFO/top_level.txt (revision 3)
+++ /galaxy-central/eggs/nose-0.11.1-py2.6.egg/EGG-INFO/top_level.txt (revision 3)
@@ -0,0 +1,1 @@
+nose
Index: /galaxy-central/eggs/nose-0.11.1-py2.6.egg/EGG-INFO/PKG-INFO
===================================================================
--- /galaxy-central/eggs/nose-0.11.1-py2.6.egg/EGG-INFO/PKG-INFO (revision 3)
+++ /galaxy-central/eggs/nose-0.11.1-py2.6.egg/EGG-INFO/PKG-INFO (revision 3)
@@ -0,0 +1,38 @@
+Metadata-Version: 1.0
+Name: nose
+Version: 0.11.1
+Summary: nose extends unittest to make testing easier
+Home-page: http://somethingaboutorange.com/mrl/projects/nose/
+Author: Jason Pellerin
+Author-email: jpellerin+nose@gmail.com
+License: GNU LGPL
+Download-URL: http://somethingaboutorange.com/mrl/projects/nose/nose-0.11.1.tar.gz
+Description: nose extends the test loading and running features of unittest, making
+        it easier to write, find and run tests.
+        
+        By default, nose will run tests in files or directories under the current
+        working directory whose names include "test" or "Test" at a word boundary
+        (like "test_this" or "functional_test" or "TestClass" but not
+        "libtest"). Test output is similar to that of unittest, but also includes
+        captured stdout output from failing tests, for easy print-style debugging.
+        
+        These features, and many more, are customizable through the use of
+        plugins. Plugins included with nose provide support for doctest, code
+        coverage and profiling, flexible attribute-based test selection,
+        output capture and more. More information about writing plugins may be
+        found on in the nose API documentation, here:
+        http://somethingaboutorange.com/mrl/projects/nose/
+        
+        If you have recently reported a bug marked as fixed, or have a craving for
+        the very latest, you may want the unstable development version instead:
+        http://bitbucket.org/jpellerin/nose/get/tip.gz#egg=nose-dev
+        
+Keywords: test unittest doctest automatic discovery
+Platform: UNKNOWN
+Classifier: Development Status :: 4 - Beta
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL)
+Classifier: Natural Language :: English
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python
+Classifier: Topic :: Software Development :: Testing
Index: /galaxy-central/eggs/nose-0.11.1-py2.6.egg/EGG-INFO/entry_points.txt
===================================================================
--- /galaxy-central/eggs/nose-0.11.1-py2.6.egg/EGG-INFO/entry_points.txt (revision 3)
+++ /galaxy-central/eggs/nose-0.11.1-py2.6.egg/EGG-INFO/entry_points.txt (revision 3)
@@ -0,0 +1,7 @@
+[console_scripts]
+nosetests-2.6 = nose:run_exit
+nosetests = nose:run_exit
+
+[distutils.commands]
+nosetests = nose.commands:nosetests
+
Index: /galaxy-central/eggs/nose-0.11.1-py2.6.egg/EGG-INFO/dependency_links.txt
===================================================================
--- /galaxy-central/eggs/nose-0.11.1-py2.6.egg/EGG-INFO/dependency_links.txt (revision 3)
+++ /galaxy-central/eggs/nose-0.11.1-py2.6.egg/EGG-INFO/dependency_links.txt (revision 3)
@@ -0,0 +1,1 @@
+
Index: /galaxy-central/eggs/nose-0.11.1-py2.6.egg/EGG-INFO/not-zip-safe
===================================================================
--- /galaxy-central/eggs/nose-0.11.1-py2.6.egg/EGG-INFO/not-zip-safe (revision 3)
+++ /galaxy-central/eggs/nose-0.11.1-py2.6.egg/EGG-INFO/not-zip-safe (revision 3)
@@ -0,0 +1,1 @@
+
Index: /galaxy-central/eggs/nose-0.11.1-py2.6.egg/man/man1/nosetests.1
===================================================================
--- /galaxy-central/eggs/nose-0.11.1-py2.6.egg/man/man1/nosetests.1 (revision 3)
+++ /galaxy-central/eggs/nose-0.11.1-py2.6.egg/man/man1/nosetests.1 (revision 3)
@@ -0,0 +1,461 @@
+.TH nosetests 1 "2009-04-23" "0.11" "User Commands"
+.SH NAME
+nosetests \- nicer testing for python
+.\" Man page generated from reStructeredText.
+.INDENT 0.0
+.UNINDENT
+
+.SH SYNOPSIS
+.INDENT 0.0
+.INDENT 3.5
+nosetests [options] [names]
+
+.UNINDENT
+.UNINDENT
+
+.SH DESCRIPTION
+nose collects tests automatically from python source files,
+directories and packages found in its working directory (which
+defaults to the current working directory). Any python source file,
+directory or package that matches the testMatch regular expression
+(by default: \fI(?:^|[b_.\-])[Tt]est)\fP will be collected as a test (or
+source for collection of tests). In addition, all other packages
+found in the working directory will be examined for python source files
+or directories that match testMatch. Package discovery descends all
+the way down the tree, so package.tests and package.sub.tests and
+package.sub.sub2.tests will all be collected.
+
+Within a test directory or package, any python source file matching
+testMatch will be examined for test cases. Within a test module,
+functions and classes whose names match testMatch and TestCase
+subclasses with any name will be loaded and executed as tests. Tests
+may use the assert keyword or raise AssertionErrors to indicate test
+failure. TestCase subclasses may do the same or use the various
+TestCase methods available.
+
+
+.SS Selecting Tests
+To specify which tests to run, pass test names on the command line:
+
+
+.nf
+nosetests only_test_this.py
+.fi
+Test names specified may be file or module names, and may optionally
+indicate the test case to run by separating the module or file name
+from the test case name with a colon. Filenames may be relative or
+absolute. Examples:
+
+
+.nf
+nosetests test.module
+nosetests another.test:TestCase.test_method
+nosetests a.test:TestCase
+nosetests /path/to/test/file.py:test_function
+.fi
+You may also change the working directory where nose looks for tests
+by using the \-w switch:
+
+
+.nf
+nosetests \-w /path/to/tests
+.fi
+Note, however, that support for multiple \-w arguments is now deprecated
+and will be removed in a future release. As of nose 0.10, you can get
+the same behavior by specifying the target directories \fIwithout\fP
+the \-w switch:
+
+
+.nf
+nosetests /path/to/tests /another/path/to/tests
+.fi
+Further customization of test selection and loading is possible
+through the use of plugins.
+
+Test result output is identical to that of unittest, except for
+the additional features (error classes, and plugin\-supplied
+features such as output capture and assert introspection) detailed
+in the options below.
+
+
+.SS Configuration
+In addition to passing command\-line options, you may also put
+configuration options in a .noserc or nose.cfg file in your home
+directory. These are standard .ini\-style config files. Put your
+nosetests configuration in a [nosetests] section. Options are the
+same as on the command line, with the \-\- prefix removed. For
+options that are simple switches, you must supply a value:
+
+
+.nf
+[nosetests]
+verbosity=3
+with\-doctest=1
+.fi
+All configuration files that are found will be loaded and their options
+combined.
+
+
+.SS Using Plugins
+There are numerous nose plugins available via easy_install and
+elsewhere. To use a plugin, just install it. The plugin will add
+command line options to nosetests. To verify that the plugin is installed,
+run:
+
+
+.nf
+nosetests \-\-plugins
+.fi
+You can add \-v or \-vv to that command to show more information
+about each plugin.
+
+If you are running nose.main() or nose.run() from a script, you
+can specify a list of plugins to use by passing a list of plugins
+with the plugins keyword argument.
+
+
+.SS 0.9 plugins
+nose 0.11 can use SOME plugins that were written for nose 0.9. The
+default plugin manager inserts a compatibility wrapper around 0.9
+plugins that adapts the changed plugin api calls. However, plugins
+that access nose internals are likely to fail, especially if they
+attempt to access test case or test suite classes. For example,
+plugins that try to determine if a test passed to startTest is an
+individual test or a suite will fail, partly because suites are no
+longer passed to startTest and partly because it\'s likely that the
+plugin is trying to find out if the test is an instance of a class
+that no longer exists.
+
+
+.SS 0.10 plugins
+All plugins written for nose 0.10 should work with nose 0.11.
+
+
+.SS Options
+
+.TP
+\fB\-V\fR\fR\fR, \fB\-\-version\fR\fR
+Output nose version and exit
+
+
+.TP
+\fB\-p\fR\fR\fR, \fB\-\-plugins\fR\fR
+Output list of available plugins and exit. Combine with higher verbosity for greater detail
+
+
+.TP
+\fB\-v\fR\fR=DEFAULT\fR, \fB\-\-verbose\fR\fR=DEFAULT
+Be more verbose. [NOSE_VERBOSE]
+
+
+.TP
+\fB\-\-verbosity\fR\fR=VERBOSITY
+Set verbosity; \-\-verbosity=2 is the same as \-v
+
+
+.TP
+\fB\-q\fR\fR=DEFAULT\fR, \fB\-\-quiet\fR\fR=DEFAULT
+Be less verbose
+
+
+.TP
+\fB\-c\fR\fR=FILES\fR, \fB\-\-config\fR\fR=FILES
+Load configuration from config file(s). May be specified multiple times; in that case, all config files will be loaded and combined
+
+
+.TP
+\fB\-w\fR\fR=WHERE\fR, \fB\-\-where\fR\fR=WHERE
+Look for tests in this directory. May be specified multiple times. The first directory passed will be used as the working directory, in place of the current working directory, which is the default. Others will be added to the list of tests to execute. [NOSE_WHERE]
+
+
+.TP
+\fB\-m\fR\fR=REGEX\fR, \fB\-\-match\fR\fR=REGEX\fR, \fB\-\-testmatch\fR\fR=REGEX
+Files, directories, function names, and class names that match this regular expression are considered tests.  Default: (?:^|[b_./\-])[Tt]est [NOSE_TESTMATCH]
+
+
+.TP
+\fB\-\-tests\fR\fR=NAMES
+Run these tests (comma\-separated list). This argument is useful mainly from configuration files; on the command line, just pass the tests to run as additional arguments with no switch.
+
+
+.TP
+\fB\-l\fR\fR=DEFAULT\fR, \fB\-\-debug\fR\fR=DEFAULT
+Activate debug logging for one or more systems. Available debug loggers: nose, nose.importer, nose.inspector, nose.plugins, nose.result and nose.selector. Separate multiple names with a comma.
+
+
+.TP
+\fB\-\-debug\-log\fR\fR=FILE
+Log debug messages to this file (default: sys.stderr)
+
+
+.TP
+\fB\-\-logging\-config\fR\fR=FILE\fR, \fB\-\-log\-config\fR\fR=FILE
+Load logging config from this file \-\- bypasses all other logging config settings.
+
+
+.TP
+\fB\-e\fR\fR=REGEX\fR, \fB\-\-exclude\fR\fR=REGEX
+Don\'t run tests that match regular expression [NOSE_EXCLUDE]
+
+
+.TP
+\fB\-i\fR\fR=REGEX\fR, \fB\-\-include\fR\fR=REGEX
+This regular expression will be applied to files, directories, function names, and class names for a chance to include additional tests that do not match TESTMATCH.  Specify this option multiple times to add more regular expressions [NOSE_INCLUDE]
+
+
+.TP
+\fB\-x\fR\fR\fR, \fB\-\-stop\fR\fR
+Stop running tests after the first error or failure
+
+
+.TP
+\fB\-P\fR\fR\fR, \fB\-\-no\-path\-adjustment\fR\fR
+Don\'t make any changes to sys.path when loading tests [NOSE_NOPATH]
+
+
+.TP
+\fB\-\-exe\fR\fR
+Look for tests in python modules that are executable. Normal behavior is to exclude executable modules, since they may not be import\-safe [NOSE_INCLUDE_EXE]
+
+
+.TP
+\fB\-\-noexe\fR\fR
+DO NOT look for tests in python modules that are executable. (The default on the windows platform is to do so.)
+
+
+.TP
+\fB\-\-traverse\-namespace\fR\fR
+Traverse through all path entries of a namespace package
+
+
+.TP
+\fB\-\-first\-package\-wins\fR\fR=DEFAULT\fR, \fB\-\-first\-pkg\-wins\fR\fR=DEFAULT\fR, \fB\-\-1st\-pkg\-wins\fR\fR=DEFAULT
+nose\'s importer will normally evict a package from sys.modules if it sees a package with the same name in a different location. Set this option to disable that behavior.
+
+
+.TP
+\fB\-a\fR\fR=ATTR\fR, \fB\-\-attr\fR\fR=ATTR
+Run only tests that have attributes specified by ATTR [NOSE_ATTR]
+
+
+.TP
+\fB\-A\fR\fR=EXPR\fR, \fB\-\-eval\-attr\fR\fR=EXPR
+Run only tests for whose attributes the Python expression EXPR evaluates to True [NOSE_EVAL_ATTR]
+
+
+.TP
+\fB\-s\fR\fR\fR, \fB\-\-nocapture\fR\fR
+Don\'t capture stdout (any stdout output will be printed immediately) [NOSE_NOCAPTURE]
+
+
+.TP
+\fB\-\-nologcapture\fR\fR
+Disable logging capture plugin. Logging configurtion will be left intact. [NOSE_NOLOGCAPTURE]
+
+
+.TP
+\fB\-\-logging\-format\fR\fR=FORMAT
+Specify custom format to print statements. Uses the same format as used by standard logging handlers. [NOSE_LOGFORMAT]
+
+
+.TP
+\fB\-\-logging\-datefmt\fR\fR=FORMAT
+Specify custom date/time format to print statements. Uses the same format as used by standard logging handlers. [NOSE_LOGDATEFMT]
+
+
+.TP
+\fB\-\-logging\-filter\fR\fR=FILTER
+Specify which statements to filter in/out. By default, everything is captured. If the output is too verbose,
+use this option to filter out needless output.
+Example: filter=foo will capture statements issued ONLY to
+ foo or foo.what.ever.sub but not foobar or other logger.
+Specify multiple loggers with comma: filter=foo,bar,baz. [NOSE_LOGFILTER]
+
+
+.TP
+\fB\-\-logging\-clear\-handlers\fR\fR
+Clear all other logging handlers
+
+
+.TP
+\fB\-\-with\-coverage\fR\fR
+Enable plugin Coverage: 
+Activate a coverage report using Ned Batchelder\'s coverage module.
+ [NOSE_WITH_COVERAGE]
+
+
+.TP
+\fB\-\-cover\-package\fR\fR=PACKAGE
+Restrict coverage output to selected packages [NOSE_COVER_PACKAGE]
+
+
+.TP
+\fB\-\-cover\-erase\fR\fR
+Erase previously collected coverage statistics before run
+
+
+.TP
+\fB\-\-cover\-tests\fR\fR
+Include test modules in coverage report [NOSE_COVER_TESTS]
+
+
+.TP
+\fB\-\-cover\-inclusive\fR\fR
+Include all python files under working directory in coverage report.  Useful for discovering holes in test coverage if not all files are imported by the test suite. [NOSE_COVER_INCLUSIVE]
+
+
+.TP
+\fB\-\-cover\-html\fR\fR
+Produce HTML coverage information
+
+
+.TP
+\fB\-\-cover\-html\-dir\fR\fR=DIR
+Produce HTML coverage information in dir
+
+
+.TP
+\fB\-\-pdb\fR\fR
+Drop into debugger on errors
+
+
+.TP
+\fB\-\-pdb\-failures\fR\fR
+Drop into debugger on failures
+
+
+.TP
+\fB\-\-no\-deprecated\fR\fR
+Disable special handling of DeprecatedTest exceptions.
+
+
+.TP
+\fB\-\-with\-doctest\fR\fR
+Enable plugin Doctest: 
+Activate doctest plugin to find and run doctests in non\-test modules.
+ [NOSE_WITH_DOCTEST]
+
+
+.TP
+\fB\-\-doctest\-tests\fR\fR
+Also look for doctests in test modules. Note that classes, methods and functions should have either doctests or non\-doctest tests, not both. [NOSE_DOCTEST_TESTS]
+
+
+.TP
+\fB\-\-doctest\-extension\fR\fR=EXT
+Also look for doctests in files with this extension [NOSE_DOCTEST_EXTENSION]
+
+
+.TP
+\fB\-\-doctest\-result\-variable\fR\fR=VAR
+Change the variable name set to the result of the last interpreter command from the default \'_\'. Can be used to avoid conflicts with the _() function used for text translation. [NOSE_DOCTEST_RESULT_VAR]
+
+
+.TP
+\fB\-\-doctest\-fixtures\fR\fR=SUFFIX
+Find fixtures for a doctest file in module with this name appended to the base name of the doctest file
+
+
+.TP
+\fB\-\-with\-isolation\fR\fR
+Enable plugin IsolationPlugin: 
+Activate the isolation plugin to isolate changes to external
+modules to a single test module or package. The isolation plugin
+resets the contents of sys.modules after each test module or
+package runs to its state before the test. PLEASE NOTE that this
+plugin should not be used with the coverage plugin, or in any other case
+where module reloading may produce undesirable side\-effects.
+ [NOSE_WITH_ISOLATION]
+
+
+.TP
+\fB\-d\fR\fR\fR, \fB\-\-detailed\-errors\fR\fR\fR, \fB\-\-failure\-detail\fR\fR
+Add detail to error output by attempting to evaluate failed asserts [NOSE_DETAILED_ERRORS]
+
+
+.TP
+\fB\-\-with\-profile\fR\fR
+Enable plugin Profile: 
+Use this plugin to run tests using the hotshot profiler. 
+ [NOSE_WITH_PROFILE]
+
+
+.TP
+\fB\-\-profile\-sort\fR\fR=SORT
+Set sort order for profiler output
+
+
+.TP
+\fB\-\-profile\-stats\-file\fR\fR=FILE
+Profiler stats file; default is a new temp file on each run
+
+
+.TP
+\fB\-\-profile\-restrict\fR\fR=RESTRICT
+Restrict profiler output. See help for pstats.Stats for details
+
+
+.TP
+\fB\-\-no\-skip\fR\fR
+Disable special handling of SkipTest exceptions.
+
+
+.TP
+\fB\-\-with\-id\fR\fR
+Enable plugin TestId: 
+Activate to add a test id (like #1) to each test name output. Activate
+with \-\-failed to rerun failing tests only.
+ [NOSE_WITH_ID]
+
+
+.TP
+\fB\-\-id\-file\fR\fR=FILE
+Store test ids found in test runs in this file. Default is the file .noseids in the working directory.
+
+
+.TP
+\fB\-\-failed\fR\fR
+Run the tests that failed in the last test run.
+
+
+.TP
+\fB\-\-processes\fR\fR=NUM
+Spread test run among this many processes. Set a number equal to the number of processors or cores in your machine for best results. [NOSE_PROCESSES]
+
+
+.TP
+\fB\-\-process\-timeout\fR\fR=SECONDS
+Set timeout for return of results from each test runner process. [NOSE_PROCESS_TIMEOUT]
+
+
+.TP
+\fB\-\-with\-xunit\fR\fR
+Enable plugin Xunit: This plugin provides test results in the standard XUnit XML format. [NOSE_WITH_XUNIT]
+
+
+.TP
+\fB\-\-xunit\-file\fR\fR=FILE
+Path to xml file to store the xunit report in. Default is nosetests.xml in the working directory [NOSE_XUNIT_FILE]
+
+
+.TP
+\fB\-\-all\-modules\fR\fR
+Enable plugin AllModules: Collect tests from all python modules.
+ [NOSE_ALL_MODULES]
+
+
+.TP
+\fB\-\-collect\-only\fR\fR
+Enable collect\-only: 
+Collect and output test names only, don\'t run any tests.
+ [COLLECT_ONLY]
+
+
+.SH AUTHOR
+jpellerin+nose@gmail.com
+
+.SH COPYRIGHT
+LGPL
+
+.\" Generated by docutils manpage writer on 2009-05-13 20:29.
+.\" 
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/roman.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/roman.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/roman.py (revision 3)
@@ -0,0 +1,81 @@
+"""Convert to and from Roman numerals"""
+
+__author__ = "Mark Pilgrim (f8dy@diveintopython.org)"
+__version__ = "1.4"
+__date__ = "8 August 2001"
+__copyright__ = """Copyright (c) 2001 Mark Pilgrim
+
+This program is part of "Dive Into Python", a free Python tutorial for
+experienced programmers.  Visit http://diveintopython.org/ for the
+latest version.
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the Python 2.1.1 license, available at
+http://www.python.org/2.1.1/license.html
+"""
+
+import re
+
+#Define exceptions
+class RomanError(Exception): pass
+class OutOfRangeError(RomanError): pass
+class NotIntegerError(RomanError): pass
+class InvalidRomanNumeralError(RomanError): pass
+
+#Define digit mapping
+romanNumeralMap = (('M',  1000),
+                   ('CM', 900),
+                   ('D',  500),
+                   ('CD', 400),
+                   ('C',  100),
+                   ('XC', 90),
+                   ('L',  50),
+                   ('XL', 40),
+                   ('X',  10),
+                   ('IX', 9),
+                   ('V',  5),
+                   ('IV', 4),
+                   ('I',  1))
+
+def toRoman(n):
+    """convert integer to Roman numeral"""
+    if not (0 < n < 5000):
+        raise OutOfRangeError, "number out of range (must be 1..4999)"
+    if int(n) <> n:
+        raise NotIntegerError, "decimals can not be converted"
+
+    result = ""
+    for numeral, integer in romanNumeralMap:
+        while n >= integer:
+            result += numeral
+            n -= integer
+    return result
+
+#Define pattern to detect valid Roman numerals
+romanNumeralPattern = re.compile("""
+    ^                   # beginning of string
+    M{0,4}              # thousands - 0 to 4 M's
+    (CM|CD|D?C{0,3})    # hundreds - 900 (CM), 400 (CD), 0-300 (0 to 3 C's),
+                        #            or 500-800 (D, followed by 0 to 3 C's)
+    (XC|XL|L?X{0,3})    # tens - 90 (XC), 40 (XL), 0-30 (0 to 3 X's),
+                        #        or 50-80 (L, followed by 0 to 3 X's)
+    (IX|IV|V?I{0,3})    # ones - 9 (IX), 4 (IV), 0-3 (0 to 3 I's),
+                        #        or 5-8 (V, followed by 0 to 3 I's)
+    $                   # end of string
+    """ ,re.VERBOSE)
+
+def fromRoman(s):
+    """convert Roman numeral to integer"""
+    if not s:
+        raise InvalidRomanNumeralError, 'Input can not be blank'
+    if not romanNumeralPattern.search(s):
+        raise InvalidRomanNumeralError, 'Invalid Roman numeral: %s' % s
+
+    result = 0
+    index = 0
+    for numeral, integer in romanNumeralMap:
+        while s[index:index+len(numeral)] == numeral:
+            result += integer
+            index += len(numeral)
+    return result
+
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/core.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/core.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/core.py (revision 3)
@@ -0,0 +1,613 @@
+# Authors: David Goodger
+# Contact: goodger@python.org
+# Revision: $Revision: 4208 $
+# Date: $Date: 2005-12-14 03:12:00 +0100 (Wed, 14 Dec 2005) $
+# Copyright: This module has been placed in the public domain.
+
+"""
+Calling the ``publish_*`` convenience functions (or instantiating a
+`Publisher` object) with component names will result in default
+behavior.  For custom behavior (setting component options), create
+custom component objects first, and pass *them* to
+``publish_*``/`Publisher`.  See `The Docutils Publisher`_.
+
+.. _The Docutils Publisher: http://docutils.sf.net/docs/api/publisher.html
+"""
+
+__docformat__ = 'reStructuredText'
+
+import sys
+import pprint
+from types import StringType
+from docutils import __version__, __version_details__, SettingsSpec
+from docutils import frontend, io, utils, readers, writers
+from docutils.frontend import OptionParser
+from docutils.transforms import Transformer
+import docutils.readers.doctree
+
+
+class Publisher:
+
+    """
+    A facade encapsulating the high-level logic of a Docutils system.
+    """
+
+    def __init__(self, reader=None, parser=None, writer=None,
+                 source=None, source_class=io.FileInput,
+                 destination=None, destination_class=io.FileOutput,
+                 settings=None):
+        """
+        Initial setup.  If any of `reader`, `parser`, or `writer` are not
+        specified, the corresponding ``set_...`` method should be called with
+        a component name (`set_reader` sets the parser as well).
+        """
+
+        self.document = None
+        """The document tree (`docutils.nodes` objects)."""
+
+        self.reader = reader
+        """A `docutils.readers.Reader` instance."""
+
+        self.parser = parser
+        """A `docutils.parsers.Parser` instance."""
+
+        self.writer = writer
+        """A `docutils.writers.Writer` instance."""
+
+        for component in 'reader', 'parser', 'writer':
+            assert not isinstance(getattr(self, component), StringType), \
+                   ('passed string as "%s" parameter; use "%s_name" instead'
+                    % (getattr(self, component), component, component))
+
+        self.source = source
+        """The source of input data, a `docutils.io.Input` instance."""
+
+        self.source_class = source_class
+        """The class for dynamically created source objects."""
+
+        self.destination = destination
+        """The destination for docutils output, a `docutils.io.Output`
+        instance."""
+
+        self.destination_class = destination_class
+        """The class for dynamically created destination objects."""
+
+        self.settings = settings
+        """An object containing Docutils settings as instance attributes.
+        Set by `self.process_command_line()` or `self.get_settings()`."""
+
+    def set_reader(self, reader_name, parser, parser_name):
+        """Set `self.reader` by name."""
+        reader_class = readers.get_reader_class(reader_name)
+        self.reader = reader_class(parser, parser_name)
+        self.parser = self.reader.parser
+
+    def set_writer(self, writer_name):
+        """Set `self.writer` by name."""
+        writer_class = writers.get_writer_class(writer_name)
+        self.writer = writer_class()
+
+    def set_components(self, reader_name, parser_name, writer_name):
+        if self.reader is None:
+            self.set_reader(reader_name, self.parser, parser_name)
+        if self.parser is None:
+            if self.reader.parser is None:
+                self.reader.set_parser(parser_name)
+            self.parser = self.reader.parser
+        if self.writer is None:
+            self.set_writer(writer_name)
+
+    def setup_option_parser(self, usage=None, description=None,
+                            settings_spec=None, config_section=None,
+                            **defaults):
+        if config_section:
+            if not settings_spec:
+                settings_spec = SettingsSpec()
+            settings_spec.config_section = config_section
+            parts = config_section.split()
+            if len(parts) > 1 and parts[-1] == 'application':
+                settings_spec.config_section_dependencies = ['applications']
+        #@@@ Add self.source & self.destination to components in future?
+        option_parser = OptionParser(
+            components=(self.parser, self.reader, self.writer, settings_spec),
+            defaults=defaults, read_config_files=1,
+            usage=usage, description=description)
+        return option_parser
+
+    def get_settings(self, usage=None, description=None,
+                     settings_spec=None, config_section=None, **defaults):
+        """
+        Set and return default settings (overrides in `defaults` dict).
+
+        Set components first (`self.set_reader` & `self.set_writer`).
+        Explicitly setting `self.settings` disables command line option
+        processing from `self.publish()`.
+        """
+        option_parser = self.setup_option_parser(
+            usage, description, settings_spec, config_section, **defaults)
+        self.settings = option_parser.get_default_values()
+        return self.settings
+
+    def process_programmatic_settings(self, settings_spec,
+                                      settings_overrides,
+                                      config_section):
+        if self.settings is None:
+            defaults = (settings_overrides or {}).copy()
+            # Propagate exceptions by default when used programmatically:
+            defaults.setdefault('traceback', 1)
+            self.get_settings(settings_spec=settings_spec,
+                              config_section=config_section,
+                              **defaults)
+
+    def process_command_line(self, argv=None, usage=None, description=None,
+                             settings_spec=None, config_section=None,
+                             **defaults):
+        """
+        Pass an empty list to `argv` to avoid reading `sys.argv` (the
+        default).
+
+        Set components first (`self.set_reader` & `self.set_writer`).
+        """
+        option_parser = self.setup_option_parser(
+            usage, description, settings_spec, config_section, **defaults)
+        if argv is None:
+            argv = sys.argv[1:]
+        self.settings = option_parser.parse_args(argv)
+
+    def set_io(self, source_path=None, destination_path=None):
+        if self.source is None:
+            self.set_source(source_path=source_path)
+        if self.destination is None:
+            self.set_destination(destination_path=destination_path)
+
+    def set_source(self, source=None, source_path=None):
+        if source_path is None:
+            source_path = self.settings._source
+        else:
+            self.settings._source = source_path
+        self.source = self.source_class(
+            source=source, source_path=source_path,
+            encoding=self.settings.input_encoding)
+
+    def set_destination(self, destination=None, destination_path=None):
+        if destination_path is None:
+            destination_path = self.settings._destination
+        else:
+            self.settings._destination = destination_path
+        self.destination = self.destination_class(
+            destination=destination, destination_path=destination_path,
+            encoding=self.settings.output_encoding,
+            error_handler=self.settings.output_encoding_error_handler)
+
+    def apply_transforms(self):
+        self.document.transformer.populate_from_components(
+            (self.source, self.reader, self.reader.parser, self.writer,
+             self.destination))
+        self.document.transformer.apply_transforms()
+
+    def publish(self, argv=None, usage=None, description=None,
+                settings_spec=None, settings_overrides=None,
+                config_section=None, enable_exit_status=None):
+        """
+        Process command line options and arguments (if `self.settings` not
+        already set), run `self.reader` and then `self.writer`.  Return
+        `self.writer`'s output.
+        """
+        exit = None
+        try:
+            if self.settings is None:
+                self.process_command_line(
+                    argv, usage, description, settings_spec, config_section,
+                    **(settings_overrides or {}))
+            self.set_io()
+            self.document = self.reader.read(self.source, self.parser,
+                                             self.settings)
+            self.apply_transforms()
+            output = self.writer.write(self.document, self.destination)
+            self.writer.assemble_parts()
+        except SystemExit, error:
+            exit = 1
+            exit_status = error.code
+        except Exception, error:
+            if not self.settings:       # exception too early to report nicely
+                raise
+            if self.settings.traceback: # Propagate exceptions?
+                self.debugging_dumps()
+                raise
+            self.report_Exception(error)
+            exit = 1
+            exit_status = 1
+        self.debugging_dumps()
+        if (enable_exit_status and self.document
+            and (self.document.reporter.max_level
+                 >= self.settings.exit_status_level)):
+            sys.exit(self.document.reporter.max_level + 10)
+        elif exit:
+            sys.exit(exit_status)
+        return output
+
+    def debugging_dumps(self):
+        if not self.document:
+            return
+        if self.settings.dump_settings:
+            print >>sys.stderr, '\n::: Runtime settings:'
+            print >>sys.stderr, pprint.pformat(self.settings.__dict__)
+        if self.settings.dump_internals:
+            print >>sys.stderr, '\n::: Document internals:'
+            print >>sys.stderr, pprint.pformat(self.document.__dict__)
+        if self.settings.dump_transforms:
+            print >>sys.stderr, '\n::: Transforms applied:'
+            print >>sys.stderr, (' (priority, transform class, '
+                                 'pending node details, keyword args)')
+            print >>sys.stderr, pprint.pformat(
+                [(priority, '%s.%s' % (xclass.__module__, xclass.__name__),
+                  pending and pending.details, kwargs)
+                 for priority, xclass, pending, kwargs
+                 in self.document.transformer.applied])
+        if self.settings.dump_pseudo_xml:
+            print >>sys.stderr, '\n::: Pseudo-XML:'
+            print >>sys.stderr, self.document.pformat().encode(
+                'raw_unicode_escape')
+
+    def report_Exception(self, error):
+        if isinstance(error, utils.SystemMessage):
+            self.report_SystemMessage(error)
+        elif isinstance(error, UnicodeError):
+            self.report_UnicodeError(error)
+        else:
+            print >>sys.stderr, '%s: %s' % (error.__class__.__name__, error)
+            print >>sys.stderr, ("""\
+Exiting due to error.  Use "--traceback" to diagnose.
+Please report errors to <docutils-users@lists.sf.net>.
+Include "--traceback" output, Docutils version (%s [%s]),
+Python version (%s), your OS type & version, and the
+command line used.""" % (__version__, __version_details__,
+                         sys.version.split()[0]))
+
+    def report_SystemMessage(self, error):
+        print >>sys.stderr, ('Exiting due to level-%s (%s) system message.'
+                             % (error.level,
+                                utils.Reporter.levels[error.level]))
+
+    def report_UnicodeError(self, error):
+        sys.stderr.write(
+            '%s: %s\n'
+            '\n'
+            'The specified output encoding (%s) cannot\n'
+            'handle all of the output.\n'
+            'Try setting "--output-encoding-error-handler" to\n'
+            '\n'
+            '* "xmlcharrefreplace" (for HTML & XML output);\n'
+            % (error.__class__.__name__, error,
+               self.settings.output_encoding))
+        try:
+            data = error.object[error.start:error.end]
+            sys.stderr.write(
+                '  the output will contain "%s" and should be usable.\n'
+                '* "backslashreplace" (for other output formats, Python 2.3+);\n'
+                '  look for "%s" in the output.\n'
+                % (data.encode('ascii', 'xmlcharrefreplace'),
+                   data.encode('ascii', 'backslashreplace')))
+        except AttributeError:
+            sys.stderr.write('  the output should be usable as-is.\n')
+        sys.stderr.write(
+            '* "replace"; look for "?" in the output.\n'
+            '\n'
+            '"--output-encoding-error-handler" is currently set to "%s".\n'
+            '\n'
+            'Exiting due to error.  Use "--traceback" to diagnose.\n'
+            'If the advice above doesn\'t eliminate the error,\n'
+            'please report it to <docutils-users@lists.sf.net>.\n'
+            'Include "--traceback" output, Docutils version (%s),\n'
+            'Python version (%s), your OS type & version, and the\n'
+            'command line used.\n'
+            % (self.settings.output_encoding_error_handler,
+               __version__, sys.version.split()[0]))
+
+default_usage = '%prog [options] [<source> [<destination>]]'
+default_description = ('Reads from <source> (default is stdin) and writes to '
+                       '<destination> (default is stdout).')
+
+def publish_cmdline(reader=None, reader_name='standalone',
+                    parser=None, parser_name='restructuredtext',
+                    writer=None, writer_name='pseudoxml',
+                    settings=None, settings_spec=None,
+                    settings_overrides=None, config_section=None,
+                    enable_exit_status=1, argv=None,
+                    usage=default_usage, description=default_description):
+    """
+    Set up & run a `Publisher` for command-line-based file I/O (input and
+    output file paths taken automatically from the command line).  Return the
+    encoded string output also.
+
+    Parameters: see `publish_programmatically` for the remainder.
+
+    - `argv`: Command-line argument list to use instead of ``sys.argv[1:]``.
+    - `usage`: Usage string, output if there's a problem parsing the command
+      line.
+    - `description`: Program description, output for the "--help" option
+      (along with command-line option descriptions).
+    """
+    pub = Publisher(reader, parser, writer, settings=settings)
+    pub.set_components(reader_name, parser_name, writer_name)
+    output = pub.publish(
+        argv, usage, description, settings_spec, settings_overrides,
+        config_section=config_section, enable_exit_status=enable_exit_status)
+    return output
+
+def publish_file(source=None, source_path=None,
+                 destination=None, destination_path=None,
+                 reader=None, reader_name='standalone',
+                 parser=None, parser_name='restructuredtext',
+                 writer=None, writer_name='pseudoxml',
+                 settings=None, settings_spec=None, settings_overrides=None,
+                 config_section=None, enable_exit_status=None):
+    """
+    Set up & run a `Publisher` for programmatic use with file-like I/O.
+    Return the encoded string output also.
+
+    Parameters: see `publish_programmatically`.
+    """
+    output, pub = publish_programmatically(
+        source_class=io.FileInput, source=source, source_path=source_path,
+        destination_class=io.FileOutput,
+        destination=destination, destination_path=destination_path,
+        reader=reader, reader_name=reader_name,
+        parser=parser, parser_name=parser_name,
+        writer=writer, writer_name=writer_name,
+        settings=settings, settings_spec=settings_spec,
+        settings_overrides=settings_overrides,
+        config_section=config_section,
+        enable_exit_status=enable_exit_status)
+    return output
+
+def publish_string(source, source_path=None, destination_path=None,
+                   reader=None, reader_name='standalone',
+                   parser=None, parser_name='restructuredtext',
+                   writer=None, writer_name='pseudoxml',
+                   settings=None, settings_spec=None,
+                   settings_overrides=None, config_section=None,
+                   enable_exit_status=None):
+    """
+    Set up & run a `Publisher` for programmatic use with string I/O.  Return
+    the encoded string or Unicode string output.
+
+    For encoded string output, be sure to set the 'output_encoding' setting to
+    the desired encoding.  Set it to 'unicode' for unencoded Unicode string
+    output.  Here's one way::
+
+        publish_string(..., settings_overrides={'output_encoding': 'unicode'})
+
+    Similarly for Unicode string input (`source`)::
+
+        publish_string(..., settings_overrides={'input_encoding': 'unicode'})
+
+    Parameters: see `publish_programmatically`.
+    """
+    output, pub = publish_programmatically(
+        source_class=io.StringInput, source=source, source_path=source_path,
+        destination_class=io.StringOutput,
+        destination=None, destination_path=destination_path,
+        reader=reader, reader_name=reader_name,
+        parser=parser, parser_name=parser_name,
+        writer=writer, writer_name=writer_name,
+        settings=settings, settings_spec=settings_spec,
+        settings_overrides=settings_overrides,
+        config_section=config_section,
+        enable_exit_status=enable_exit_status)
+    return output
+
+def publish_parts(source, source_path=None, source_class=io.StringInput,
+                  destination_path=None,
+                  reader=None, reader_name='standalone',
+                  parser=None, parser_name='restructuredtext',
+                  writer=None, writer_name='pseudoxml',
+                  settings=None, settings_spec=None,
+                  settings_overrides=None, config_section=None,
+                  enable_exit_status=None):
+    """
+    Set up & run a `Publisher`, and return a dictionary of document parts.
+    Dictionary keys are the names of parts, and values are Unicode strings;
+    encoding is up to the client.  For programmatic use with string I/O.
+
+    For encoded string input, be sure to set the 'input_encoding' setting to
+    the desired encoding.  Set it to 'unicode' for unencoded Unicode string
+    input.  Here's how::
+
+        publish_parts(..., settings_overrides={'input_encoding': 'unicode'})
+
+    Parameters: see `publish_programmatically`.
+    """
+    output, pub = publish_programmatically(
+        source=source, source_path=source_path, source_class=source_class,
+        destination_class=io.StringOutput,
+        destination=None, destination_path=destination_path,
+        reader=reader, reader_name=reader_name,
+        parser=parser, parser_name=parser_name,
+        writer=writer, writer_name=writer_name,
+        settings=settings, settings_spec=settings_spec,
+        settings_overrides=settings_overrides,
+        config_section=config_section,
+        enable_exit_status=enable_exit_status)
+    return pub.writer.parts
+
+def publish_doctree(source, source_path=None,
+                    source_class=io.StringInput,
+                    reader=None, reader_name='standalone',
+                    parser=None, parser_name='restructuredtext',
+                    settings=None, settings_spec=None,
+                    settings_overrides=None, config_section=None,
+                    enable_exit_status=None):
+    """
+    Set up & run a `Publisher` for programmatic use with string I/O.
+    Return the document tree.
+
+    For encoded string input, be sure to set the 'input_encoding' setting to
+    the desired encoding.  Set it to 'unicode' for unencoded Unicode string
+    input.  Here's one way::
+
+        publish_doctree(..., settings_overrides={'input_encoding': 'unicode'})
+
+    Parameters: see `publish_programmatically`.
+    """
+    pub = Publisher(reader=reader, parser=parser, writer=None,
+                    settings=settings,
+                    source_class=source_class,
+                    destination_class=io.NullOutput)
+    pub.set_components(reader_name, parser_name, 'null')
+    pub.process_programmatic_settings(
+        settings_spec, settings_overrides, config_section)
+    pub.set_source(source, source_path)
+    pub.set_destination(None, None)
+    output = pub.publish(enable_exit_status=enable_exit_status)
+    return pub.document
+
+def publish_from_doctree(document, destination_path=None,
+                         writer=None, writer_name='pseudoxml',
+                         settings=None, settings_spec=None,
+                         settings_overrides=None, config_section=None,
+                         enable_exit_status=None):
+    """
+    Set up & run a `Publisher` to render from an existing document tree data
+    structure, for programmatic use with string I/O.  Return a pair of encoded
+    string output and document parts.
+
+    Note that document.settings is overridden; if you want to use the settings
+    of the original `document`, pass settings=document.settings.
+
+    Also, new document.transformer and document.reporter objects are
+    generated.
+
+    For encoded string output, be sure to set the 'output_encoding' setting to
+    the desired encoding.  Set it to 'unicode' for unencoded Unicode string
+    output.  Here's one way::
+
+        publish_from_doctree(
+            ..., settings_overrides={'output_encoding': 'unicode'})
+
+    Parameters: `document` is a `docutils.nodes.document` object, an existing
+    document tree.
+
+    Other parameters: see `publish_programmatically`.
+    """
+    reader = docutils.readers.doctree.Reader(parser_name='null')
+    pub = Publisher(reader, None, writer,
+                    source=io.DocTreeInput(document),
+                    destination_class=io.StringOutput, settings=settings)
+    if not writer and writer_name:
+        pub.set_writer(writer_name)
+    pub.process_programmatic_settings(
+        settings_spec, settings_overrides, config_section)
+    pub.set_destination(None, destination_path)
+    return pub.publish(enable_exit_status=enable_exit_status)
+
+def publish_programmatically(source_class, source, source_path,
+                             destination_class, destination, destination_path,
+                             reader, reader_name,
+                             parser, parser_name,
+                             writer, writer_name,
+                             settings, settings_spec,
+                             settings_overrides, config_section,
+                             enable_exit_status):
+    """
+    Set up & run a `Publisher` for custom programmatic use.  Return the
+    encoded string output and the Publisher object.
+
+    Applications should not need to call this function directly.  If it does
+    seem to be necessary to call this function directly, please write to the
+    Docutils-develop mailing list
+    <http://docutils.sf.net/docs/user/mailing-lists.html#docutils-develop>.
+
+    Parameters:
+
+    * `source_class` **required**: The class for dynamically created source
+      objects.  Typically `io.FileInput` or `io.StringInput`.
+
+    * `source`: Type depends on `source_class`:
+
+      - If `source_class` is `io.FileInput`: Either a file-like object
+        (must have 'read' and 'close' methods), or ``None``
+        (`source_path` is opened).  If neither `source` nor
+        `source_path` are supplied, `sys.stdin` is used.
+
+      - If `source_class` is `io.StringInput` **required**: The input
+        string, either an encoded 8-bit string (set the
+        'input_encoding' setting to the correct encoding) or a Unicode
+        string (set the 'input_encoding' setting to 'unicode').
+
+    * `source_path`: Type depends on `source_class`:
+
+      - `io.FileInput`: Path to the input file, opened if no `source`
+        supplied.
+
+      - `io.StringInput`: Optional.  Path to the file or object that produced
+        `source`.  Only used for diagnostic output.
+
+    * `destination_class` **required**: The class for dynamically created
+      destination objects.  Typically `io.FileOutput` or `io.StringOutput`.
+
+    * `destination`: Type depends on `destination_class`:
+
+      - `io.FileOutput`: Either a file-like object (must have 'write' and
+        'close' methods), or ``None`` (`destination_path` is opened).  If
+        neither `destination` nor `destination_path` are supplied,
+        `sys.stdout` is used.
+
+      - `io.StringOutput`: Not used; pass ``None``.
+
+    * `destination_path`: Type depends on `destination_class`:
+
+      - `io.FileOutput`: Path to the output file.  Opened if no `destination`
+        supplied.
+
+      - `io.StringOutput`: Path to the file or object which will receive the
+        output; optional.  Used for determining relative paths (stylesheets,
+        source links, etc.).
+
+    * `reader`: A `docutils.readers.Reader` object.
+
+    * `reader_name`: Name or alias of the Reader class to be instantiated if
+      no `reader` supplied.
+
+    * `parser`: A `docutils.parsers.Parser` object.
+
+    * `parser_name`: Name or alias of the Parser class to be instantiated if
+      no `parser` supplied.
+
+    * `writer`: A `docutils.writers.Writer` object.
+
+    * `writer_name`: Name or alias of the Writer class to be instantiated if
+      no `writer` supplied.
+
+    * `settings`: A runtime settings (`docutils.frontend.Values`) object, for
+      dotted-attribute access to runtime settings.  It's the end result of the
+      `SettingsSpec`, config file, and option processing.  If `settings` is
+      passed, it's assumed to be complete and no further setting/config/option
+      processing is done.
+
+    * `settings_spec`: A `docutils.SettingsSpec` subclass or object.  Provides
+      extra application-specific settings definitions independently of
+      components.  In other words, the application becomes a component, and
+      its settings data is processed along with that of the other components.
+      Used only if no `settings` specified.
+
+    * `settings_overrides`: A dictionary containing application-specific
+      settings defaults that override the defaults of other components.
+      Used only if no `settings` specified.
+
+    * `config_section`: A string, the name of the configuration file section
+      for this application.  Overrides the ``config_section`` attribute
+      defined by `settings_spec`.  Used only if no `settings` specified.
+
+    * `enable_exit_status`: Boolean; enable exit status at end of processing?
+    """
+    pub = Publisher(reader, parser, writer, settings=settings,
+                    source_class=source_class,
+                    destination_class=destination_class)
+    pub.set_components(reader_name, parser_name, writer_name)
+    pub.process_programmatic_settings(
+        settings_spec, settings_overrides, config_section)
+    pub.set_source(source, source_path)
+    pub.set_destination(destination, destination_path)
+    output = pub.publish(enable_exit_status=enable_exit_status)
+    return output, pub
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/nodes.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/nodes.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/nodes.py (revision 3)
@@ -0,0 +1,1755 @@
+# Author: David Goodger
+# Contact: goodger@users.sourceforge.net
+# Revision: $Revision: 4242 $
+# Date: $Date: 2006-01-06 00:28:53 +0100 (Fri, 06 Jan 2006) $
+# Copyright: This module has been placed in the public domain.
+
+"""
+Docutils document tree element class library.
+
+Classes in CamelCase are abstract base classes or auxiliary classes. The one
+exception is `Text`, for a text (PCDATA) node; uppercase is used to
+differentiate from element classes.  Classes in lower_case_with_underscores
+are element classes, matching the XML element generic identifiers in the DTD_.
+
+The position of each node (the level at which it can occur) is significant and
+is represented by abstract base classes (`Root`, `Structural`, `Body`,
+`Inline`, etc.).  Certain transformations will be easier because we can use
+``isinstance(node, base_class)`` to determine the position of the node in the
+hierarchy.
+
+.. _DTD: http://docutils.sourceforge.net/docs/ref/docutils.dtd
+"""
+
+__docformat__ = 'reStructuredText'
+
+import sys
+import os
+import re
+import warnings
+from types import IntType, SliceType, StringType, UnicodeType, \
+     TupleType, ListType, ClassType
+from UserString import UserString
+
+
+# ==============================
+#  Functional Node Base Classes
+# ==============================
+
+class Node:
+
+    """Abstract base class of nodes in a document tree."""
+
+    parent = None
+    """Back-reference to the Node immediately containing this Node."""
+
+    document = None
+    """The `document` node at the root of the tree containing this Node."""
+
+    source = None
+    """Path or description of the input source which generated this Node."""
+
+    line = None
+    """The line number (1-based) of the beginning of this Node in `source`."""
+
+    def __nonzero__(self):
+        """
+        Node instances are always true, even if they're empty.  A node is more
+        than a simple container.  Its boolean "truth" does not depend on
+        having one or more subnodes in the doctree.
+
+        Use `len()` to check node length.  Use `None` to represent a boolean
+        false value.
+        """
+        return 1
+
+    def asdom(self, dom=None):
+        """Return a DOM **fragment** representation of this Node."""
+        if dom is None:
+            import xml.dom.minidom as dom
+        domroot = dom.Document()
+        return self._dom_node(domroot)
+
+    def pformat(self, indent='    ', level=0):
+        """
+        Return an indented pseudo-XML representation, for test purposes.
+
+        Override in subclasses.
+        """
+        raise NotImplementedError
+
+    def copy(self):
+        """Return a copy of self."""
+        raise NotImplementedError
+
+    def deepcopy(self):
+        """Return a deep copy of self (also copying children)."""
+        raise NotImplementedError
+
+    def setup_child(self, child):
+        child.parent = self
+        if self.document:
+            child.document = self.document
+            if child.source is None:
+                child.source = self.document.current_source
+            if child.line is None:
+                child.line = self.document.current_line
+
+    def walk(self, visitor):
+        """
+        Traverse a tree of `Node` objects, calling the
+        `dispatch_visit()` method of `visitor` when entering each
+        node.  (The `walkabout()` method is similar, except it also
+        calls the `dispatch_departure()` method before exiting each
+        node.)
+
+        This tree traversal supports limited in-place tree
+        modifications.  Replacing one node with one or more nodes is
+        OK, as is removing an element.  However, if the node removed
+        or replaced occurs after the current node, the old node will
+        still be traversed, and any new nodes will not.
+
+        Within ``visit`` methods (and ``depart`` methods for
+        `walkabout()`), `TreePruningException` subclasses may be raised
+        (`SkipChildren`, `SkipSiblings`, `SkipNode`, `SkipDeparture`).
+
+        Parameter `visitor`: A `NodeVisitor` object, containing a
+        ``visit`` implementation for each `Node` subclass encountered.
+        """
+        visitor.document.reporter.debug(
+            'docutils.nodes.Node.walk calling dispatch_visit for %s'
+            % self.__class__.__name__)
+        try:
+            visitor.dispatch_visit(self)
+        except (SkipChildren, SkipNode):
+            return
+        except SkipDeparture:           # not applicable; ignore
+            pass
+        children = self.children
+        try:
+            for child in children[:]:
+                child.walk(visitor)
+        except SkipSiblings:
+            pass
+
+    def walkabout(self, visitor):
+        """
+        Perform a tree traversal similarly to `Node.walk()` (which
+        see), except also call the `dispatch_departure()` method
+        before exiting each node.
+
+        Parameter `visitor`: A `NodeVisitor` object, containing a
+        ``visit`` and ``depart`` implementation for each `Node`
+        subclass encountered.
+        """
+        call_depart = 1
+        visitor.document.reporter.debug(
+            'docutils.nodes.Node.walkabout calling dispatch_visit for %s'
+            % self.__class__.__name__)
+        try:
+            try:
+                visitor.dispatch_visit(self)
+            except SkipNode:
+                return
+            except SkipDeparture:
+                call_depart = 0
+            children = self.children
+            try:
+                for child in children[:]:
+                    child.walkabout(visitor)
+            except SkipSiblings:
+                pass
+        except SkipChildren:
+            pass
+        if call_depart:
+            visitor.document.reporter.debug(
+                'docutils.nodes.Node.walkabout calling dispatch_departure '
+                'for %s' % self.__class__.__name__)
+            visitor.dispatch_departure(self)
+
+    def traverse(self, condition=None,
+                 include_self=1, descend=1, siblings=0, ascend=0):
+        """
+        Return an iterable containing
+
+        * self (if include_self is true)
+        * all descendants in tree traversal order (if descend is true)
+        * all siblings (if siblings is true) and their descendants (if
+          also descend is true)
+        * the siblings of the parent (if ascend is true) and their
+          descendants (if also descend is true), and so on
+
+        If `condition` is not None, the iterable contains only nodes
+        for which ``condition(node)`` is true.  If `condition` is a
+        node class ``cls``, it is equivalent to a function consisting
+        of ``return isinstance(node, cls)``.
+
+        If ascend is true, assume siblings to be true as well.
+
+        For example, given the following tree::
+
+            <paragraph>
+                <emphasis>      <--- emphasis.traverse() and
+                    <strong>    <--- strong.traverse() are called.
+                        Foo
+                    Bar
+                <reference name="Baz" refid="baz">
+                    Baz
+
+        Then list(emphasis.traverse()) equals ::
+
+            [<emphasis>, <strong>, <#text: Foo>, <#text: Bar>]
+
+        and list(strong.traverse(ascend=1)) equals ::
+
+            [<strong>, <#text: Foo>, <#text: Bar>, <reference>, <#text: Baz>]
+        """
+        r = []
+        if ascend:
+            siblings=1
+        if isinstance(condition, ClassType):
+            node_class = condition
+            def condition(node, node_class=node_class):
+                return isinstance(node, node_class)
+        if include_self and (condition is None or condition(self)):
+            r.append(self)
+        if descend and len(self.children):
+            for child in self:
+                r.extend(child.traverse(
+                    include_self=1, descend=1, siblings=0, ascend=0,
+                    condition=condition))
+        if siblings or ascend:
+            node = self
+            while node.parent:
+                index = node.parent.index(node)
+                for sibling in node.parent[index+1:]:
+                    r.extend(sibling.traverse(include_self=1, descend=descend,
+                                              siblings=0, ascend=0,
+                                              condition=condition))
+                if not ascend:
+                    break
+                else:
+                    node = node.parent
+        return r
+
+    def next_node(self, condition=None,
+                  include_self=0, descend=1, siblings=0, ascend=0):
+        """
+        Return the first node in the iterable returned by traverse(),
+        or None if the iterable is empty.
+
+        Parameter list is the same as of traverse.  Note that
+        include_self defaults to 0, though.
+        """
+        iterable = self.traverse(condition=condition,
+                                 include_self=include_self, descend=descend,
+                                 siblings=siblings, ascend=ascend)
+        try:
+            return iterable[0]
+        except IndexError:
+            return None
+
+class Text(Node, UserString):
+
+    """
+    Instances are terminal nodes (leaves) containing text only; no child
+    nodes or attributes.  Initialize by passing a string to the constructor.
+    Access the text itself with the `astext` method.
+    """
+
+    tagname = '#text'
+
+    children = ()
+    """Text nodes have no children, and cannot have children."""
+
+    def __init__(self, data, rawsource=''):
+        UserString.__init__(self, data)
+
+        self.rawsource = rawsource
+        """The raw text from which this element was constructed."""
+
+    def __repr__(self):
+        data = repr(self.data)
+        if len(data) > 70:
+            data = repr(self.data[:64] + ' ...')
+        return '<%s: %s>' % (self.tagname, data)
+
+    def __len__(self):
+        return len(self.data)
+
+    def shortrepr(self):
+        data = repr(self.data)
+        if len(data) > 20:
+            data = repr(self.data[:16] + ' ...')
+        return '<%s: %s>' % (self.tagname, data)
+
+    def _dom_node(self, domroot):
+        return domroot.createTextNode(self.data)
+
+    def astext(self):
+        return self.data
+
+    def copy(self):
+        return self.__class__(self.data)
+
+    def deepcopy(self):
+        return self.copy()
+
+    def pformat(self, indent='    ', level=0):
+        result = []
+        indent = indent * level
+        for line in self.data.splitlines():
+            result.append(indent + line + '\n')
+        return ''.join(result)
+
+
+class Element(Node):
+
+    """
+    `Element` is the superclass to all specific elements.
+
+    Elements contain attributes and child nodes.  Elements emulate
+    dictionaries for attributes, indexing by attribute name (a string).  To
+    set the attribute 'att' to 'value', do::
+
+        element['att'] = 'value'
+
+    There are two special attributes: 'ids' and 'names'.  Both are
+    lists of unique identifiers, and names serve as human interfaces
+    to IDs.  Names are case- and whitespace-normalized (see the
+    fully_normalize_name() function), and IDs conform to the regular
+    expression ``[a-z](-?[a-z0-9]+)*`` (see the make_id() function).
+
+    Elements also emulate lists for child nodes (element nodes and/or text
+    nodes), indexing by integer.  To get the first child node, use::
+
+        element[0]
+
+    Elements may be constructed using the ``+=`` operator.  To add one new
+    child node to element, do::
+
+        element += node
+
+    This is equivalent to ``element.append(node)``.
+
+    To add a list of multiple child nodes at once, use the same ``+=``
+    operator::
+
+        element += [node1, node2]
+
+    This is equivalent to ``element.extend([node1, node2])``.
+    """
+
+    list_attributes = ('ids', 'classes', 'names', 'dupnames', 'backrefs')
+    """List attributes, automatically initialized to empty lists for
+    all nodes."""
+
+    tagname = None
+    """The element generic identifier. If None, it is set as an instance
+    attribute to the name of the class."""
+
+    child_text_separator = '\n\n'
+    """Separator for child nodes, used by `astext()` method."""
+
+    def __init__(self, rawsource='', *children, **attributes):
+        self.rawsource = rawsource
+        """The raw text from which this element was constructed."""
+
+        self.children = []
+        """List of child nodes (elements and/or `Text`)."""
+
+        self.extend(children)           # maintain parent info
+
+        self.attributes = {}
+        """Dictionary of attribute {name: value}."""
+
+        # Initialize list attributes.
+        for att in self.list_attributes:
+            self.attributes[att] = []
+
+        for att, value in attributes.items():
+            att = att.lower()
+            if att in self.list_attributes:
+                # mutable list; make a copy for this node
+                self.attributes[att] = value[:]
+            else:
+                self.attributes[att] = value
+
+        if self.tagname is None:
+            self.tagname = self.__class__.__name__
+
+    def _dom_node(self, domroot):
+        element = domroot.createElement(self.tagname)
+        for attribute, value in self.attlist():
+            if isinstance(value, ListType):
+                value = ' '.join([serial_escape('%s' % v) for v in value])
+            element.setAttribute(attribute, '%s' % value)
+        for child in self.children:
+            element.appendChild(child._dom_node(domroot))
+        return element
+
+    def __repr__(self):
+        data = ''
+        for c in self.children:
+            data += c.shortrepr()
+            if len(data) > 60:
+                data = data[:56] + ' ...'
+                break
+        if self['names']:
+            return '<%s "%s": %s>' % (self.__class__.__name__,
+                                      '; '.join(self['names']), data)
+        else:
+            return '<%s: %s>' % (self.__class__.__name__, data)
+
+    def shortrepr(self):
+        if self['names']:
+            return '<%s "%s"...>' % (self.__class__.__name__,
+                                     '; '.join(self['names']))
+        else:
+            return '<%s...>' % self.tagname
+
+    def __str__(self):
+        return self.__unicode__().encode('raw_unicode_escape')
+
+    def __unicode__(self):
+        if self.children:
+            return u'%s%s%s' % (self.starttag(),
+                                 ''.join([str(c) for c in self.children]),
+                                 self.endtag())
+        else:
+            return self.emptytag()
+
+    def starttag(self):
+        parts = [self.tagname]
+        for name, value in self.attlist():
+            if value is None:           # boolean attribute
+                parts.append(name)
+            elif isinstance(value, ListType):
+                values = [serial_escape('%s' % v) for v in value]
+                parts.append('%s="%s"' % (name, ' '.join(values)))
+            else:
+                parts.append('%s="%s"' % (name, value))
+        return '<%s>' % ' '.join(parts)
+
+    def endtag(self):
+        return '</%s>' % self.tagname
+
+    def emptytag(self):
+        return u'<%s/>' % ' '.join([self.tagname] +
+                                    ['%s="%s"' % (n, v)
+                                     for n, v in self.attlist()])
+
+    def __len__(self):
+        return len(self.children)
+
+    def __getitem__(self, key):
+        if isinstance(key, UnicodeType) or isinstance(key, StringType):
+            return self.attributes[key]
+        elif isinstance(key, IntType):
+            return self.children[key]
+        elif isinstance(key, SliceType):
+            assert key.step in (None, 1), 'cannot handle slice with stride'
+            return self.children[key.start:key.stop]
+        else:
+            raise TypeError, ('element index must be an integer, a slice, or '
+                              'an attribute name string')
+
+    def __setitem__(self, key, item):
+        if isinstance(key, UnicodeType) or isinstance(key, StringType):
+            self.attributes[str(key)] = item
+        elif isinstance(key, IntType):
+            self.setup_child(item)
+            self.children[key] = item
+        elif isinstance(key, SliceType):
+            assert key.step in (None, 1), 'cannot handle slice with stride'
+            for node in item:
+                self.setup_child(node)
+            self.children[key.start:key.stop] = item
+        else:
+            raise TypeError, ('element index must be an integer, a slice, or '
+                              'an attribute name string')
+
+    def __delitem__(self, key):
+        if isinstance(key, UnicodeType) or isinstance(key, StringType):
+            del self.attributes[key]
+        elif isinstance(key, IntType):
+            del self.children[key]
+        elif isinstance(key, SliceType):
+            assert key.step in (None, 1), 'cannot handle slice with stride'
+            del self.children[key.start:key.stop]
+        else:
+            raise TypeError, ('element index must be an integer, a simple '
+                              'slice, or an attribute name string')
+
+    def __add__(self, other):
+        return self.children + other
+
+    def __radd__(self, other):
+        return other + self.children
+
+    def __iadd__(self, other):
+        """Append a node or a list of nodes to `self.children`."""
+        if isinstance(other, Node):
+            self.append(other)
+        elif other is not None:
+            self.extend(other)
+        return self
+
+    def astext(self):
+        return self.child_text_separator.join(
+              [child.astext() for child in self.children])
+
+    def non_default_attributes(self):
+        atts = {}
+        for key, value in self.attributes.items():
+            if self.is_not_default(key):
+                atts[key] = value
+        return atts
+
+    def attlist(self):
+        attlist = self.non_default_attributes().items()
+        attlist.sort()
+        return attlist
+
+    def get(self, key, failobj=None):
+        return self.attributes.get(key, failobj)
+
+    def hasattr(self, attr):
+        return self.attributes.has_key(attr)
+
+    def delattr(self, attr):
+        if self.attributes.has_key(attr):
+            del self.attributes[attr]
+
+    def setdefault(self, key, failobj=None):
+        return self.attributes.setdefault(key, failobj)
+
+    has_key = hasattr
+
+    def append(self, item):
+        self.setup_child(item)
+        self.children.append(item)
+
+    def extend(self, item):
+        for node in item:
+            self.append(node)
+
+    def insert(self, index, item):
+        if isinstance(item, Node):
+            self.setup_child(item)
+            self.children.insert(index, item)
+        elif item is not None:
+            self[index:index] = item
+
+    def pop(self, i=-1):
+        return self.children.pop(i)
+
+    def remove(self, item):
+        self.children.remove(item)
+
+    def index(self, item):
+        return self.children.index(item)
+
+    def is_not_default(self, key):
+        if self[key] == [] and key in self.list_attributes:
+            return 0
+        else:
+            return 1
+
+    def update_basic_atts(self, dict):
+        """
+        Update basic attributes ('ids', 'names', 'classes',
+        'dupnames', but not 'source') from node or dictionary `dict`.
+        """
+        if isinstance(dict, Node):
+            dict = dict.attributes
+        for att in ('ids', 'classes', 'names', 'dupnames'):
+            for value in dict.get(att, []):
+                if not value in self[att]:
+                    self[att].append(value)
+
+    def clear(self):
+        self.children = []
+
+    def replace(self, old, new):
+        """Replace one child `Node` with another child or children."""
+        index = self.index(old)
+        if isinstance(new, Node):
+            self.setup_child(new)
+            self[index] = new
+        elif new is not None:
+            self[index:index+1] = new
+
+    def replace_self(self, new):
+        """
+        Replace `self` node with `new`, where `new` is a node or a
+        list of nodes.
+        """
+        update = new
+        if not isinstance(new, Node):
+            # `new` is a list; update first child.
+            try:
+                update = new[0]
+            except IndexError:
+                update = None
+        if isinstance(update, Element):
+            update.update_basic_atts(self)
+        else:
+            # `update` is a Text node or `new` is an empty list.
+            # Assert that we aren't losing any attributes.
+            for att in ('ids', 'names', 'classes', 'dupnames'):
+                assert not self[att], \
+                       'Losing "%s" attribute: %s' % (att, self[att])
+        self.parent.replace(self, new)
+
+    def first_child_matching_class(self, childclass, start=0, end=sys.maxint):
+        """
+        Return the index of the first child whose class exactly matches.
+
+        Parameters:
+
+        - `childclass`: A `Node` subclass to search for, or a tuple of `Node`
+          classes. If a tuple, any of the classes may match.
+        - `start`: Initial index to check.
+        - `end`: Initial index to *not* check.
+        """
+        if not isinstance(childclass, TupleType):
+            childclass = (childclass,)
+        for index in range(start, min(len(self), end)):
+            for c in childclass:
+                if isinstance(self[index], c):
+                    return index
+        return None
+
+    def first_child_not_matching_class(self, childclass, start=0,
+                                       end=sys.maxint):
+        """
+        Return the index of the first child whose class does *not* match.
+
+        Parameters:
+
+        - `childclass`: A `Node` subclass to skip, or a tuple of `Node`
+          classes. If a tuple, none of the classes may match.
+        - `start`: Initial index to check.
+        - `end`: Initial index to *not* check.
+        """
+        if not isinstance(childclass, TupleType):
+            childclass = (childclass,)
+        for index in range(start, min(len(self), end)):
+            for c in childclass:
+                if isinstance(self.children[index], c):
+                    break
+            else:
+                return index
+        return None
+
+    def pformat(self, indent='    ', level=0):
+        return ''.join(['%s%s\n' % (indent * level, self.starttag())] +
+                       [child.pformat(indent, level+1)
+                        for child in self.children])
+
+    def copy(self):
+        return self.__class__(**self.attributes)
+
+    def deepcopy(self):
+        copy = self.copy()
+        copy.extend([child.deepcopy() for child in self.children])
+        return copy
+
+    def set_class(self, name):
+        """Add a new class to the "classes" attribute."""
+        warnings.warn('docutils.nodes.Element.set_class deprecated; '
+                      "append to Element['classes'] list attribute directly",
+                      DeprecationWarning, stacklevel=2)
+        assert ' ' not in name
+        self['classes'].append(name.lower())
+
+    def note_referenced_by(self, name=None, id=None):
+        """Note that this Element has been referenced by its name
+        `name` or id `id`."""
+        self.referenced = 1
+        # Element.expect_referenced_by_* dictionaries map names or ids
+        # to nodes whose ``referenced`` attribute is set to true as
+        # soon as this node is referenced by the given name or id.
+        # Needed for target propagation.
+        by_name = getattr(self, 'expect_referenced_by_name', {}).get(name)
+        by_id = getattr(self, 'expect_referenced_by_id', {}).get(id)
+        if by_name:
+            assert name is not None
+            by_name.referenced = 1
+        if by_id:
+            assert id is not None
+            by_id.referenced = 1
+
+
+class TextElement(Element):
+
+    """
+    An element which directly contains text.
+
+    Its children are all `Text` or `Inline` subclass nodes.  You can
+    check whether an element's context is inline simply by checking whether
+    its immediate parent is a `TextElement` instance (including subclasses).
+    This is handy for nodes like `image` that can appear both inline and as
+    standalone body elements.
+
+    If passing children to `__init__()`, make sure to set `text` to
+    ``''`` or some other suitable value.
+    """
+
+    child_text_separator = ''
+    """Separator for child nodes, used by `astext()` method."""
+
+    def __init__(self, rawsource='', text='', *children, **attributes):
+        if text != '':
+            textnode = Text(text)
+            Element.__init__(self, rawsource, textnode, *children,
+                              **attributes)
+        else:
+            Element.__init__(self, rawsource, *children, **attributes)
+
+
+class FixedTextElement(TextElement):
+
+    """An element which directly contains preformatted text."""
+
+    def __init__(self, rawsource='', text='', *children, **attributes):
+        TextElement.__init__(self, rawsource, text, *children, **attributes)
+        self.attributes['xml:space'] = 'preserve'
+
+
+# ========
+#  Mixins
+# ========
+
+class Resolvable:
+
+    resolved = 0
+
+
+class BackLinkable:
+
+    def add_backref(self, refid):
+        self['backrefs'].append(refid)
+
+
+# ====================
+#  Element Categories
+# ====================
+
+class Root: pass
+
+class Titular: pass
+
+class PreBibliographic:
+    """Category of Node which may occur before Bibliographic Nodes."""
+
+class Bibliographic: pass
+
+class Decorative(PreBibliographic): pass
+
+class Structural: pass
+
+class Body: pass
+
+class General(Body): pass
+
+class Sequential(Body):
+    """List-like elements."""
+
+class Admonition(Body): pass
+
+class Special(Body):
+    """Special internal body elements."""
+
+class Invisible(PreBibliographic):
+    """Internal elements that don't appear in output."""
+
+class Part: pass
+
+class Inline: pass
+
+class Referential(Resolvable): pass
+
+
+class Targetable(Resolvable):
+
+    referenced = 0
+
+    indirect_reference_name = None
+    """Holds the whitespace_normalized_name (contains mixed case) of a target.
+    Required for MoinMoin/reST compatibility."""
+
+
+class Labeled:
+    """Contains a `label` as its first element."""
+
+
+# ==============
+#  Root Element
+# ==============
+
+class document(Root, Structural, Element):
+
+    """
+    The document root element.
+
+    Do not instantiate this class directly; use
+    `docutils.utils.new_document()` instead.
+    """
+
+    def __init__(self, settings, reporter, *args, **kwargs):
+        Element.__init__(self, *args, **kwargs)
+
+        self.current_source = None
+        """Path to or description of the input source being processed."""
+
+        self.current_line = None
+        """Line number (1-based) of `current_source`."""
+
+        self.settings = settings
+        """Runtime settings data record."""
+
+        self.reporter = reporter
+        """System message generator."""
+
+        self.indirect_targets = []
+        """List of indirect target nodes."""
+
+        self.substitution_defs = {}
+        """Mapping of substitution names to substitution_definition nodes."""
+
+        self.substitution_names = {}
+        """Mapping of case-normalized substitution names to case-sensitive
+        names."""
+
+        self.refnames = {}
+        """Mapping of names to lists of referencing nodes."""
+
+        self.refids = {}
+        """Mapping of ids to lists of referencing nodes."""
+
+        self.nameids = {}
+        """Mapping of names to unique id's."""
+
+        self.nametypes = {}
+        """Mapping of names to hyperlink type (boolean: True => explicit,
+        False => implicit."""
+
+        self.ids = {}
+        """Mapping of ids to nodes."""
+
+        self.footnote_refs = {}
+        """Mapping of footnote labels to lists of footnote_reference nodes."""
+
+        self.citation_refs = {}
+        """Mapping of citation labels to lists of citation_reference nodes."""
+
+        self.autofootnotes = []
+        """List of auto-numbered footnote nodes."""
+
+        self.autofootnote_refs = []
+        """List of auto-numbered footnote_reference nodes."""
+
+        self.symbol_footnotes = []
+        """List of symbol footnote nodes."""
+
+        self.symbol_footnote_refs = []
+        """List of symbol footnote_reference nodes."""
+
+        self.footnotes = []
+        """List of manually-numbered footnote nodes."""
+
+        self.citations = []
+        """List of citation nodes."""
+
+        self.autofootnote_start = 1
+        """Initial auto-numbered footnote number."""
+
+        self.symbol_footnote_start = 0
+        """Initial symbol footnote symbol index."""
+
+        self.id_start = 1
+        """Initial ID number."""
+
+        self.parse_messages = []
+        """System messages generated while parsing."""
+
+        self.transform_messages = []
+        """System messages generated while applying transforms."""
+
+        import docutils.transforms
+        self.transformer = docutils.transforms.Transformer(self)
+        """Storage for transforms to be applied to this document."""
+
+        self.decoration = None
+        """Document's `decoration` node."""
+
+        self.document = self
+
+    def asdom(self, dom=None):
+        """Return a DOM representation of this document."""
+        if dom is None:
+            import xml.dom.minidom as dom
+        domroot = dom.Document()
+        domroot.appendChild(self._dom_node(domroot))
+        return domroot
+
+    def set_id(self, node, msgnode=None):
+        for id in node['ids']:
+            if self.ids.has_key(id) and self.ids[id] is not node:
+                msg = self.reporter.severe('Duplicate ID: "%s".' % id)
+                if msgnode != None:
+                    msgnode += msg
+        if not node['ids']:
+            for name in node['names']:
+                id = self.settings.id_prefix + make_id(name)
+                if id and not self.ids.has_key(id):
+                    break
+            else:
+                id = ''
+                while not id or self.ids.has_key(id):
+                    id = (self.settings.id_prefix +
+                          self.settings.auto_id_prefix + str(self.id_start))
+                    self.id_start += 1
+            node['ids'].append(id)
+        self.ids[id] = node
+        return id
+
+    def set_name_id_map(self, node, id, msgnode=None, explicit=None):
+        """
+        `self.nameids` maps names to IDs, while `self.nametypes` maps names to
+        booleans representing hyperlink type (True==explicit,
+        False==implicit).  This method updates the mappings.
+
+        The following state transition table shows how `self.nameids` ("ids")
+        and `self.nametypes` ("types") change with new input (a call to this
+        method), and what actions are performed ("implicit"-type system
+        messages are INFO/1, and "explicit"-type system messages are ERROR/3):
+
+        ====  =====  ========  ========  =======  ====  =====  =====
+         Old State    Input          Action        New State   Notes
+        -----------  --------  -----------------  -----------  -----
+        ids   types  new type  sys.msg.  dupname  ids   types
+        ====  =====  ========  ========  =======  ====  =====  =====
+        -     -      explicit  -         -        new   True
+        -     -      implicit  -         -        new   False
+        None  False  explicit  -         -        new   True
+        old   False  explicit  implicit  old      new   True
+        None  True   explicit  explicit  new      None  True
+        old   True   explicit  explicit  new,old  None  True   [#]_
+        None  False  implicit  implicit  new      None  False
+        old   False  implicit  implicit  new,old  None  False
+        None  True   implicit  implicit  new      None  True
+        old   True   implicit  implicit  new      old   True
+        ====  =====  ========  ========  =======  ====  =====  =====
+
+        .. [#] Do not clear the name-to-id map or invalidate the old target if
+           both old and new targets are external and refer to identical URIs.
+           The new target is invalidated regardless.
+        """
+        for name in node['names']:
+            if self.nameids.has_key(name):
+                self.set_duplicate_name_id(node, id, name, msgnode, explicit)
+            else:
+                self.nameids[name] = id
+                self.nametypes[name] = explicit
+
+    def set_duplicate_name_id(self, node, id, name, msgnode, explicit):
+        old_id = self.nameids[name]
+        old_explicit = self.nametypes[name]
+        self.nametypes[name] = old_explicit or explicit
+        if explicit:
+            if old_explicit:
+                level = 2
+                if old_id is not None:
+                    old_node = self.ids[old_id]
+                    if node.has_key('refuri'):
+                        refuri = node['refuri']
+                        if old_node['names'] \
+                               and old_node.has_key('refuri') \
+                               and old_node['refuri'] == refuri:
+                            level = 1   # just inform if refuri's identical
+                    if level > 1:
+                        dupname(old_node, name)
+                        self.nameids[name] = None
+                msg = self.reporter.system_message(
+                    level, 'Duplicate explicit target name: "%s".' % name,
+                    backrefs=[id], base_node=node)
+                if msgnode != None:
+                    msgnode += msg
+                dupname(node, name)
+            else:
+                self.nameids[name] = id
+                if old_id is not None:
+                    old_node = self.ids[old_id]
+                    dupname(old_node, name)
+        else:
+            if old_id is not None and not old_explicit:
+                self.nameids[name] = None
+                old_node = self.ids[old_id]
+                dupname(old_node, name)
+            dupname(node, name)
+        if not explicit or (not old_explicit and old_id is not None):
+            msg = self.reporter.info(
+                'Duplicate implicit target name: "%s".' % name,
+                backrefs=[id], base_node=node)
+            if msgnode != None:
+                msgnode += msg
+
+    def has_name(self, name):
+        return self.nameids.has_key(name)
+
+    # "note" here is an imperative verb: "take note of".
+    def note_implicit_target(self, target, msgnode=None):
+        id = self.set_id(target, msgnode)
+        self.set_name_id_map(target, id, msgnode, explicit=None)
+
+    def note_explicit_target(self, target, msgnode=None):
+        id = self.set_id(target, msgnode)
+        self.set_name_id_map(target, id, msgnode, explicit=1)
+
+    def note_refname(self, node):
+        self.refnames.setdefault(node['refname'], []).append(node)
+
+    def note_refid(self, node):
+        self.refids.setdefault(node['refid'], []).append(node)
+
+    def note_indirect_target(self, target):
+        self.indirect_targets.append(target)
+        if target['names']:
+            self.note_refname(target)
+
+    def note_anonymous_target(self, target):
+        self.set_id(target)
+
+    def note_autofootnote(self, footnote):
+        self.set_id(footnote)
+        self.autofootnotes.append(footnote)
+
+    def note_autofootnote_ref(self, ref):
+        self.set_id(ref)
+        self.autofootnote_refs.append(ref)
+
+    def note_symbol_footnote(self, footnote):
+        self.set_id(footnote)
+        self.symbol_footnotes.append(footnote)
+
+    def note_symbol_footnote_ref(self, ref):
+        self.set_id(ref)
+        self.symbol_footnote_refs.append(ref)
+
+    def note_footnote(self, footnote):
+        self.set_id(footnote)
+        self.footnotes.append(footnote)
+
+    def note_footnote_ref(self, ref):
+        self.set_id(ref)
+        self.footnote_refs.setdefault(ref['refname'], []).append(ref)
+        self.note_refname(ref)
+
+    def note_citation(self, citation):
+        self.citations.append(citation)
+
+    def note_citation_ref(self, ref):
+        self.set_id(ref)
+        self.citation_refs.setdefault(ref['refname'], []).append(ref)
+        self.note_refname(ref)
+
+    def note_substitution_def(self, subdef, def_name, msgnode=None):
+        name = whitespace_normalize_name(def_name)
+        if self.substitution_defs.has_key(name):
+            msg = self.reporter.error(
+                  'Duplicate substitution definition name: "%s".' % name,
+                  base_node=subdef)
+            if msgnode != None:
+                msgnode += msg
+            oldnode = self.substitution_defs[name]
+            dupname(oldnode, name)
+        # keep only the last definition:
+        self.substitution_defs[name] = subdef
+        # case-insensitive mapping:
+        self.substitution_names[fully_normalize_name(name)] = name
+
+    def note_substitution_ref(self, subref, refname):
+        subref['refname'] = whitespace_normalize_name(refname)
+
+    def note_pending(self, pending, priority=None):
+        self.transformer.add_pending(pending, priority)
+
+    def note_parse_message(self, message):
+        self.parse_messages.append(message)
+
+    def note_transform_message(self, message):
+        self.transform_messages.append(message)
+
+    def note_source(self, source, offset):
+        self.current_source = source
+        if offset is None:
+            self.current_line = offset
+        else:
+            self.current_line = offset + 1
+
+    def copy(self):
+        return self.__class__(self.settings, self.reporter,
+                              **self.attributes)
+
+    def get_decoration(self):
+        if not self.decoration:
+            self.decoration = decoration()
+            index = self.first_child_not_matching_class(Titular)
+            if index is None:
+                self.append(self.decoration)
+            else:
+                self.insert(index, self.decoration)
+        return self.decoration
+
+
+# ================
+#  Title Elements
+# ================
+
+class title(Titular, PreBibliographic, TextElement): pass
+class subtitle(Titular, PreBibliographic, TextElement): pass
+class rubric(Titular, TextElement): pass
+
+
+# ========================
+#  Bibliographic Elements
+# ========================
+
+class docinfo(Bibliographic, Element): pass
+class author(Bibliographic, TextElement): pass
+class authors(Bibliographic, Element): pass
+class organization(Bibliographic, TextElement): pass
+class address(Bibliographic, FixedTextElement): pass
+class contact(Bibliographic, TextElement): pass
+class version(Bibliographic, TextElement): pass
+class revision(Bibliographic, TextElement): pass
+class status(Bibliographic, TextElement): pass
+class date(Bibliographic, TextElement): pass
+class copyright(Bibliographic, TextElement): pass
+
+
+# =====================
+#  Decorative Elements
+# =====================
+
+class decoration(Decorative, Element):
+
+    def get_header(self):
+        if not len(self.children) or not isinstance(self.children[0], header):
+            self.insert(0, header())
+        return self.children[0]
+
+    def get_footer(self):
+        if not len(self.children) or not isinstance(self.children[-1], footer):
+            self.append(footer())
+        return self.children[-1]
+
+
+class header(Decorative, Element): pass
+class footer(Decorative, Element): pass
+
+
+# =====================
+#  Structural Elements
+# =====================
+
+class section(Structural, Element): pass
+
+
+class topic(Structural, Element):
+
+    """
+    Topics are terminal, "leaf" mini-sections, like block quotes with titles,
+    or textual figures.  A topic is just like a section, except that it has no
+    subsections, and it doesn't have to conform to section placement rules.
+
+    Topics are allowed wherever body elements (list, table, etc.) are allowed,
+    but only at the top level of a section or document.  Topics cannot nest
+    inside topics, sidebars, or body elements; you can't have a topic inside a
+    table, list, block quote, etc.
+    """
+
+
+class sidebar(Structural, Element):
+
+    """
+    Sidebars are like miniature, parallel documents that occur inside other
+    documents, providing related or reference material.  A sidebar is
+    typically offset by a border and "floats" to the side of the page; the
+    document's main text may flow around it.  Sidebars can also be likened to
+    super-footnotes; their content is outside of the flow of the document's
+    main text.
+
+    Sidebars are allowed wherever body elements (list, table, etc.) are
+    allowed, but only at the top level of a section or document.  Sidebars
+    cannot nest inside sidebars, topics, or body elements; you can't have a
+    sidebar inside a table, list, block quote, etc.
+    """
+
+
+class transition(Structural, Element): pass
+
+
+# ===============
+#  Body Elements
+# ===============
+
+class paragraph(General, TextElement): pass
+class compound(General, Element): pass
+class container(General, Element): pass
+class bullet_list(Sequential, Element): pass
+class enumerated_list(Sequential, Element): pass
+class list_item(Part, Element): pass
+class definition_list(Sequential, Element): pass
+class definition_list_item(Part, Element): pass
+class term(Part, TextElement): pass
+class classifier(Part, TextElement): pass
+class definition(Part, Element): pass
+class field_list(Sequential, Element): pass
+class field(Part, Element): pass
+class field_name(Part, TextElement): pass
+class field_body(Part, Element): pass
+
+
+class option(Part, Element):
+
+    child_text_separator = ''
+
+
+class option_argument(Part, TextElement):
+
+    def astext(self):
+        return self.get('delimiter', ' ') + TextElement.astext(self)
+
+
+class option_group(Part, Element):
+
+    child_text_separator = ', '
+
+
+class option_list(Sequential, Element): pass
+
+
+class option_list_item(Part, Element):
+
+    child_text_separator = '  '
+
+
+class option_string(Part, TextElement): pass
+class description(Part, Element): pass
+class literal_block(General, FixedTextElement): pass
+class doctest_block(General, FixedTextElement): pass
+class line_block(General, Element): pass
+
+
+class line(Part, TextElement):
+
+    indent = None
+
+
+class block_quote(General, Element): pass
+class attribution(Part, TextElement): pass
+class attention(Admonition, Element): pass
+class caution(Admonition, Element): pass
+class danger(Admonition, Element): pass
+class error(Admonition, Element): pass
+class important(Admonition, Element): pass
+class note(Admonition, Element): pass
+class tip(Admonition, Element): pass
+class hint(Admonition, Element): pass
+class warning(Admonition, Element): pass
+class admonition(Admonition, Element): pass
+class comment(Special, Invisible, FixedTextElement): pass
+class substitution_definition(Special, Invisible, TextElement): pass
+class target(Special, Invisible, Inline, TextElement, Targetable): pass
+class footnote(General, BackLinkable, Element, Labeled, Targetable): pass
+class citation(General, BackLinkable, Element, Labeled, Targetable): pass
+class label(Part, TextElement): pass
+class figure(General, Element): pass
+class caption(Part, TextElement): pass
+class legend(Part, Element): pass
+class table(General, Element): pass
+class tgroup(Part, Element): pass
+class colspec(Part, Element): pass
+class thead(Part, Element): pass
+class tbody(Part, Element): pass
+class row(Part, Element): pass
+class entry(Part, Element): pass
+
+
+class system_message(Special, BackLinkable, PreBibliographic, Element):
+
+    """
+    System message element.
+
+    Do not instantiate this class directly; use
+    ``document.reporter.info/warning/error/severe()`` instead.
+    """
+
+    def __init__(self, message=None, *children, **attributes):
+        if message:
+            p = paragraph('', message)
+            children = (p,) + children
+        try:
+            Element.__init__(self, '', *children, **attributes)
+        except:
+            print 'system_message: children=%r' % (children,)
+            raise
+
+    def astext(self):
+        line = self.get('line', '')
+        return u'%s:%s: (%s/%s) %s' % (self['source'], line, self['type'],
+                                       self['level'], Element.astext(self))
+
+
+class pending(Special, Invisible, Element):
+
+    """
+    The "pending" element is used to encapsulate a pending operation: the
+    operation (transform), the point at which to apply it, and any data it
+    requires.  Only the pending operation's location within the document is
+    stored in the public document tree (by the "pending" object itself); the
+    operation and its data are stored in the "pending" object's internal
+    instance attributes.
+
+    For example, say you want a table of contents in your reStructuredText
+    document.  The easiest way to specify where to put it is from within the
+    document, with a directive::
+
+        .. contents::
+
+    But the "contents" directive can't do its work until the entire document
+    has been parsed and possibly transformed to some extent.  So the directive
+    code leaves a placeholder behind that will trigger the second phase of its
+    processing, something like this::
+
+        <pending ...public attributes...> + internal attributes
+
+    Use `document.note_pending()` so that the
+    `docutils.transforms.Transformer` stage of processing can run all pending
+    transforms.
+    """
+
+    def __init__(self, transform, details=None,
+                 rawsource='', *children, **attributes):
+        Element.__init__(self, rawsource, *children, **attributes)
+
+        self.transform = transform
+        """The `docutils.transforms.Transform` class implementing the pending
+        operation."""
+
+        self.details = details or {}
+        """Detail data (dictionary) required by the pending operation."""
+
+    def pformat(self, indent='    ', level=0):
+        internals = [
+              '.. internal attributes:',
+              '     .transform: %s.%s' % (self.transform.__module__,
+                                          self.transform.__name__),
+              '     .details:']
+        details = self.details.items()
+        details.sort()
+        for key, value in details:
+            if isinstance(value, Node):
+                internals.append('%7s%s:' % ('', key))
+                internals.extend(['%9s%s' % ('', line)
+                                  for line in value.pformat().splitlines()])
+            elif value and isinstance(value, ListType) \
+                  and isinstance(value[0], Node):
+                internals.append('%7s%s:' % ('', key))
+                for v in value:
+                    internals.extend(['%9s%s' % ('', line)
+                                      for line in v.pformat().splitlines()])
+            else:
+                internals.append('%7s%s: %r' % ('', key, value))
+        return (Element.pformat(self, indent, level)
+                + ''.join([('    %s%s\n' % (indent * level, line))
+                           for line in internals]))
+
+    def copy(self):
+        return self.__class__(self.transform, self.details, self.rawsource,
+                              **self.attributes)
+
+
+class raw(Special, Inline, PreBibliographic, FixedTextElement):
+
+    """
+    Raw data that is to be passed untouched to the Writer.
+    """
+
+    pass
+
+
+# =================
+#  Inline Elements
+# =================
+
+class emphasis(Inline, TextElement): pass
+class strong(Inline, TextElement): pass
+class literal(Inline, TextElement): pass
+class reference(General, Inline, Referential, TextElement): pass
+class footnote_reference(Inline, Referential, TextElement): pass
+class citation_reference(Inline, Referential, TextElement): pass
+class substitution_reference(Inline, TextElement): pass
+class title_reference(Inline, TextElement): pass
+class abbreviation(Inline, TextElement): pass
+class acronym(Inline, TextElement): pass
+class superscript(Inline, TextElement): pass
+class subscript(Inline, TextElement): pass
+
+
+class image(General, Inline, Element):
+
+    def astext(self):
+        return self.get('alt', '')
+
+
+class inline(Inline, TextElement): pass
+class problematic(Inline, TextElement): pass
+class generated(Inline, TextElement): pass
+
+
+# ========================================
+#  Auxiliary Classes, Functions, and Data
+# ========================================
+
+node_class_names = """
+    Text
+    abbreviation acronym address admonition attention attribution author
+        authors
+    block_quote bullet_list
+    caption caution citation citation_reference classifier colspec comment
+        compound contact container copyright
+    danger date decoration definition definition_list definition_list_item
+        description docinfo doctest_block document
+    emphasis entry enumerated_list error
+    field field_body field_list field_name figure footer
+        footnote footnote_reference
+    generated
+    header hint
+    image important inline
+    label legend line line_block list_item literal literal_block
+    note
+    option option_argument option_group option_list option_list_item
+        option_string organization
+    paragraph pending problematic
+    raw reference revision row rubric
+    section sidebar status strong subscript substitution_definition
+        substitution_reference subtitle superscript system_message
+    table target tbody term tgroup thead tip title title_reference topic
+        transition
+    version
+    warning""".split()
+"""A list of names of all concrete Node subclasses."""
+
+
+class NodeVisitor:
+
+    """
+    "Visitor" pattern [GoF95]_ abstract superclass implementation for
+    document tree traversals.
+
+    Each node class has corresponding methods, doing nothing by
+    default; override individual methods for specific and useful
+    behaviour.  The `dispatch_visit()` method is called by
+    `Node.walk()` upon entering a node.  `Node.walkabout()` also calls
+    the `dispatch_departure()` method before exiting a node.
+
+    The dispatch methods call "``visit_`` + node class name" or
+    "``depart_`` + node class name", resp.
+
+    This is a base class for visitors whose ``visit_...`` & ``depart_...``
+    methods should be implemented for *all* node types encountered (such as
+    for `docutils.writers.Writer` subclasses).  Unimplemented methods will
+    raise exceptions.
+
+    For sparse traversals, where only certain node types are of interest,
+    subclass `SparseNodeVisitor` instead.  When (mostly or entirely) uniform
+    processing is desired, subclass `GenericNodeVisitor`.
+
+    .. [GoF95] Gamma, Helm, Johnson, Vlissides. *Design Patterns: Elements of
+       Reusable Object-Oriented Software*. Addison-Wesley, Reading, MA, USA,
+       1995.
+    """
+
+    optional = ()
+    """
+    Tuple containing node class names (as strings).
+
+    No exception will be raised if writers do not implement visit
+    or departure functions for these node classes.
+
+    Used to ensure transitional compatibility with existing 3rd-party writers.
+    """
+
+    def __init__(self, document):
+        self.document = document
+
+    def dispatch_visit(self, node):
+        """
+        Call self."``visit_`` + node class name" with `node` as
+        parameter.  If the ``visit_...`` method does not exist, call
+        self.unknown_visit.
+        """
+        node_name = node.__class__.__name__
+        method = getattr(self, 'visit_' + node_name, self.unknown_visit)
+        self.document.reporter.debug(
+            'docutils.nodes.NodeVisitor.dispatch_visit calling %s for %s'
+            % (method.__name__, node_name))
+        return method(node)
+
+    def dispatch_departure(self, node):
+        """
+        Call self."``depart_`` + node class name" with `node` as
+        parameter.  If the ``depart_...`` method does not exist, call
+        self.unknown_departure.
+        """
+        node_name = node.__class__.__name__
+        method = getattr(self, 'depart_' + node_name, self.unknown_departure)
+        self.document.reporter.debug(
+            'docutils.nodes.NodeVisitor.dispatch_departure calling %s for %s'
+            % (method.__name__, node_name))
+        return method(node)
+
+    def unknown_visit(self, node):
+        """
+        Called when entering unknown `Node` types.
+
+        Raise an exception unless overridden.
+        """
+        if  (node.document.settings.strict_visitor
+             or node.__class__.__name__ not in self.optional):
+            raise NotImplementedError(
+                '%s visiting unknown node type: %s'
+                % (self.__class__, node.__class__.__name__))
+
+    def unknown_departure(self, node):
+        """
+        Called before exiting unknown `Node` types.
+
+        Raise exception unless overridden.
+        """
+        if  (node.document.settings.strict_visitor
+             or node.__class__.__name__ not in self.optional):
+            raise NotImplementedError(
+                '%s departing unknown node type: %s'
+                % (self.__class__, node.__class__.__name__))
+
+
+class SparseNodeVisitor(NodeVisitor):
+
+    """
+    Base class for sparse traversals, where only certain node types are of
+    interest.  When ``visit_...`` & ``depart_...`` methods should be
+    implemented for *all* node types (such as for `docutils.writers.Writer`
+    subclasses), subclass `NodeVisitor` instead.
+    """
+
+
+class GenericNodeVisitor(NodeVisitor):
+
+    """
+    Generic "Visitor" abstract superclass, for simple traversals.
+
+    Unless overridden, each ``visit_...`` method calls `default_visit()`, and
+    each ``depart_...`` method (when using `Node.walkabout()`) calls
+    `default_departure()`. `default_visit()` (and `default_departure()`) must
+    be overridden in subclasses.
+
+    Define fully generic visitors by overriding `default_visit()` (and
+    `default_departure()`) only. Define semi-generic visitors by overriding
+    individual ``visit_...()`` (and ``depart_...()``) methods also.
+
+    `NodeVisitor.unknown_visit()` (`NodeVisitor.unknown_departure()`) should
+    be overridden for default behavior.
+    """
+
+    def default_visit(self, node):
+        """Override for generic, uniform traversals."""
+        raise NotImplementedError
+
+    def default_departure(self, node):
+        """Override for generic, uniform traversals."""
+        raise NotImplementedError
+
+def _call_default_visit(self, node):
+    self.default_visit(node)
+
+def _call_default_departure(self, node):
+    self.default_departure(node)
+
+def _nop(self, node):
+    pass
+
+def _add_node_class_names(names):
+    """Save typing with dynamic assignments:"""
+    for _name in names:
+        setattr(GenericNodeVisitor, "visit_" + _name, _call_default_visit)
+        setattr(GenericNodeVisitor, "depart_" + _name, _call_default_departure)
+        setattr(SparseNodeVisitor, 'visit_' + _name, _nop)
+        setattr(SparseNodeVisitor, 'depart_' + _name, _nop)
+
+_add_node_class_names(node_class_names)
+
+
+class TreeCopyVisitor(GenericNodeVisitor):
+
+    """
+    Make a complete copy of a tree or branch, including element attributes.
+    """
+
+    def __init__(self, document):
+        GenericNodeVisitor.__init__(self, document)
+        self.parent_stack = []
+        self.parent = []
+
+    def get_tree_copy(self):
+        return self.parent[0]
+
+    def default_visit(self, node):
+        """Copy the current node, and make it the new acting parent."""
+        newnode = node.copy()
+        self.parent.append(newnode)
+        self.parent_stack.append(self.parent)
+        self.parent = newnode
+
+    def default_departure(self, node):
+        """Restore the previous acting parent."""
+        self.parent = self.parent_stack.pop()
+
+
+class TreePruningException(Exception):
+
+    """
+    Base class for `NodeVisitor`-related tree pruning exceptions.
+
+    Raise subclasses from within ``visit_...`` or ``depart_...`` methods
+    called from `Node.walk()` and `Node.walkabout()` tree traversals to prune
+    the tree traversed.
+    """
+
+    pass
+
+
+class SkipChildren(TreePruningException):
+
+    """
+    Do not visit any children of the current node.  The current node's
+    siblings and ``depart_...`` method are not affected.
+    """
+
+    pass
+
+
+class SkipSiblings(TreePruningException):
+
+    """
+    Do not visit any more siblings (to the right) of the current node.  The
+    current node's children and its ``depart_...`` method are not affected.
+    """
+
+    pass
+
+
+class SkipNode(TreePruningException):
+
+    """
+    Do not visit the current node's children, and do not call the current
+    node's ``depart_...`` method.
+    """
+
+    pass
+
+
+class SkipDeparture(TreePruningException):
+
+    """
+    Do not call the current node's ``depart_...`` method.  The current node's
+    children and siblings are not affected.
+    """
+
+    pass
+
+
+class NodeFound(TreePruningException):
+
+    """
+    Raise to indicate that the target of a search has been found.  This
+    exception must be caught by the client; it is not caught by the traversal
+    code.
+    """
+
+    pass
+
+
+def make_id(string):
+    """
+    Convert `string` into an identifier and return it.
+
+    Docutils identifiers will conform to the regular expression
+    ``[a-z](-?[a-z0-9]+)*``.  For CSS compatibility, identifiers (the "class"
+    and "id" attributes) should have no underscores, colons, or periods.
+    Hyphens may be used.
+
+    - The `HTML 4.01 spec`_ defines identifiers based on SGML tokens:
+
+          ID and NAME tokens must begin with a letter ([A-Za-z]) and may be
+          followed by any number of letters, digits ([0-9]), hyphens ("-"),
+          underscores ("_"), colons (":"), and periods (".").
+
+    - However the `CSS1 spec`_ defines identifiers based on the "name" token,
+      a tighter interpretation ("flex" tokenizer notation; "latin1" and
+      "escape" 8-bit characters have been replaced with entities)::
+
+          unicode     \\[0-9a-f]{1,4}
+          latin1      [&iexcl;-&yuml;]
+          escape      {unicode}|\\[ -~&iexcl;-&yuml;]
+          nmchar      [-a-z0-9]|{latin1}|{escape}
+          name        {nmchar}+
+
+    The CSS1 "nmchar" rule does not include underscores ("_"), colons (":"),
+    or periods ("."), therefore "class" and "id" attributes should not contain
+    these characters. They should be replaced with hyphens ("-"). Combined
+    with HTML's requirements (the first character must be a letter; no
+    "unicode", "latin1", or "escape" characters), this results in the
+    ``[a-z](-?[a-z0-9]+)*`` pattern.
+
+    .. _HTML 4.01 spec: http://www.w3.org/TR/html401
+    .. _CSS1 spec: http://www.w3.org/TR/REC-CSS1
+    """
+    id = _non_id_chars.sub('-', ' '.join(string.lower().split()))
+    id = _non_id_at_ends.sub('', id)
+    return str(id)
+
+_non_id_chars = re.compile('[^a-z0-9]+')
+_non_id_at_ends = re.compile('^[-0-9]+|-+$')
+
+def dupname(node, name):
+    node['dupnames'].append(name)
+    node['names'].remove(name)
+    # Assume that this method is referenced, even though it isn't; we
+    # don't want to throw unnecessary system_messages.
+    node.referenced = 1
+
+def fully_normalize_name(name):
+    """Return a case- and whitespace-normalized name."""
+    return ' '.join(name.lower().split())
+
+def whitespace_normalize_name(name):
+    """Return a whitespace-normalized name."""
+    return ' '.join(name.split())
+
+def serial_escape(value):
+    """Escape string values that are elements of a list, for serialization."""
+    return value.replace('\\', r'\\').replace(' ', r'\ ')
+
+# 
+#
+# Local Variables:
+# indent-tabs-mode: nil
+# sentence-end-double-space: t
+# fill-column: 78
+# End:
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/null.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/null.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/null.py (revision 3)
@@ -0,0 +1,22 @@
+# Author: Martin Blais
+# Contact: blais@furius.ca
+# Revision: $Revision: 3629 $
+# Date: $Date: 2005-06-29 21:45:35 +0200 (Wed, 29 Jun 2005) $
+# Copyright: This module has been placed in the public domain.
+
+"""A do-nothing parser."""
+
+from docutils import parsers
+
+
+class Parser(parsers.Parser):
+
+    """A do-nothing parser."""
+
+    supported = ('null',)
+
+    config_section = 'null parser'
+    config_section_dependencies = ('parsers',)
+
+    def parse(self, inputstring, document):
+        pass
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/__init__.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/__init__.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/__init__.py (revision 3)
@@ -0,0 +1,49 @@
+# Author: David Goodger
+# Contact: goodger@users.sourceforge.net
+# Revision: $Revision: 1645 $
+# Date: $Date: 2003-08-27 22:50:43 +0200 (Wed, 27 Aug 2003) $
+# Copyright: This module has been placed in the public domain.
+
+"""
+This package contains Docutils parser modules.
+"""
+
+__docformat__ = 'reStructuredText'
+
+from docutils import Component
+
+
+class Parser(Component):
+
+    component_type = 'parser'
+    config_section = 'parsers'
+
+    def parse(self, inputstring, document):
+        """Override to parse `inputstring` into document tree `document`."""
+        raise NotImplementedError('subclass must override this method')
+
+    def setup_parse(self, inputstring, document):
+        """Initial parse setup.  Call at start of `self.parse()`."""
+        self.inputstring = inputstring
+        self.document = document
+        document.reporter.attach_observer(document.note_parse_message)
+
+    def finish_parse(self):
+        """Finalize parse details.  Call at end of `self.parse()`."""
+        self.document.reporter.detach_observer(
+            self.document.note_parse_message)
+
+
+_parser_aliases = {
+      'restructuredtext': 'rst',
+      'rest': 'rst',
+      'restx': 'rst',
+      'rtxt': 'rst',}
+
+def get_parser_class(parser_name):
+    """Return the Parser class from the `parser_name` module."""
+    parser_name = parser_name.lower()
+    if _parser_aliases.has_key(parser_name):
+        parser_name = _parser_aliases[parser_name]
+    module = __import__(parser_name, globals(), locals())
+    return module.Parser
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/directives/parts.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/directives/parts.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/directives/parts.py (revision 3)
@@ -0,0 +1,126 @@
+# Author: David Goodger, Dmitry Jemerov
+# Contact: goodger@users.sourceforge.net
+# Revision: $Revision: 3439 $
+# Date: $Date: 2005-06-06 03:20:35 +0200 (Mon, 06 Jun 2005) $
+# Copyright: This module has been placed in the public domain.
+
+"""
+Directives for document parts.
+"""
+
+__docformat__ = 'reStructuredText'
+
+from docutils import nodes, languages
+from docutils.transforms import parts
+from docutils.parsers.rst import directives
+
+
+backlinks_values = ('top', 'entry', 'none')
+
+def backlinks(arg):
+    value = directives.choice(arg, backlinks_values)
+    if value == 'none':
+        return None
+    else:
+        return value
+
+def contents(name, arguments, options, content, lineno,
+             content_offset, block_text, state, state_machine):
+    """
+    Table of contents.
+
+    The table of contents is generated in two passes: initial parse and
+    transform.  During the initial parse, a 'pending' element is generated
+    which acts as a placeholder, storing the TOC title and any options
+    internally.  At a later stage in the processing, the 'pending' element is
+    replaced by a 'topic' element, a title and the table of contents proper.
+    """
+    if not (state_machine.match_titles
+            or isinstance(state_machine.node, nodes.sidebar)):
+        error = state_machine.reporter.error(
+              'The "%s" directive may not be used within topics '
+              'or body elements.' % name,
+              nodes.literal_block(block_text, block_text), line=lineno)
+        return [error]
+    document = state_machine.document
+    language = languages.get_language(document.settings.language_code)
+    if arguments:
+        title_text = arguments[0]
+        text_nodes, messages = state.inline_text(title_text, lineno)
+        title = nodes.title(title_text, '', *text_nodes)
+    else:
+        messages = []
+        if options.has_key('local'):
+            title = None
+        else:
+            title = nodes.title('', language.labels['contents'])
+    topic = nodes.topic(classes=['contents'])
+    topic['classes'] += options.get('class', [])
+    if options.has_key('local'):
+        topic['classes'].append('local')
+    if title:
+        name = title.astext()
+        topic += title
+    else:
+        name = language.labels['contents']
+    name = nodes.fully_normalize_name(name)
+    if not document.has_name(name):
+        topic['names'].append(name)
+    document.note_implicit_target(topic)
+    pending = nodes.pending(parts.Contents, rawsource=block_text)
+    pending.details.update(options)
+    document.note_pending(pending)
+    topic += pending
+    return [topic] + messages
+
+contents.arguments = (0, 1, 1)
+contents.options = {'depth': directives.nonnegative_int,
+                    'local': directives.flag,
+                    'backlinks': backlinks,
+                    'class': directives.class_option}
+
+def sectnum(name, arguments, options, content, lineno,
+            content_offset, block_text, state, state_machine):
+    """Automatic section numbering."""
+    pending = nodes.pending(parts.SectNum)
+    pending.details.update(options)
+    state_machine.document.note_pending(pending)
+    return [pending]
+
+sectnum.options = {'depth': int,
+                   'start': int,
+                   'prefix': directives.unchanged_required,
+                   'suffix': directives.unchanged_required}
+
+def header_footer(node, name, arguments, options, content, lineno,
+                  content_offset, block_text, state, state_machine):
+    """Contents of document header or footer."""
+    if not content:
+        warning = state_machine.reporter.warning(
+            'Content block expected for the "%s" directive; none found.'
+            % name, nodes.literal_block(block_text, block_text),
+            line=lineno)
+        node.append(nodes.paragraph(
+            '', 'Problem with the "%s" directive: no content supplied.' % name))
+        return [warning]
+    text = '\n'.join(content)
+    state.nested_parse(content, content_offset, node)
+    return []
+
+def header(name, arguments, options, content, lineno,
+           content_offset, block_text, state, state_machine):
+    decoration = state_machine.document.get_decoration()
+    node = decoration.get_header()
+    return header_footer(node, name, arguments, options, content, lineno,
+                         content_offset, block_text, state, state_machine)
+
+header.content = 1
+
+def footer(name, arguments, options, content, lineno,
+           content_offset, block_text, state, state_machine):
+    decoration = state_machine.document.get_decoration()
+    node = decoration.get_footer()
+    return header_footer(node, name, arguments, options, content, lineno,
+                         content_offset, block_text, state, state_machine)
+
+footer.content = 1
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/directives/tables.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/directives/tables.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/directives/tables.py (revision 3)
@@ -0,0 +1,444 @@
+# Authors: David Goodger, David Priest
+# Contact: goodger@python.org
+# Revision: $Revision: 3900 $
+# Date: $Date: 2005-09-24 17:11:20 +0200 (Sat, 24 Sep 2005) $
+# Copyright: This module has been placed in the public domain.
+
+"""
+Directives for table elements.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import sys
+import os.path
+from docutils import io, nodes, statemachine, utils
+from docutils.utils import SystemMessagePropagation
+from docutils.parsers.rst import directives
+
+try:
+    import csv                          # new in Python 2.3
+except ImportError:
+    csv = None
+
+try:
+    import urllib2
+except ImportError:
+    urllib2 = None
+
+try:
+    True
+except NameError:                       # Python 2.2 & 2.1 compatibility
+    True = not 0
+    False = not 1
+
+
+def table(name, arguments, options, content, lineno,
+          content_offset, block_text, state, state_machine):
+    if not content:
+        warning = state_machine.reporter.warning(
+            'Content block expected for the "%s" directive; none found.'
+            % name, nodes.literal_block(block_text, block_text),
+            line=lineno)
+        return [warning]
+    title, messages = make_title(arguments, state, lineno)
+    node = nodes.Element()          # anonymous container for parsing
+    state.nested_parse(content, content_offset, node)
+    if len(node) != 1 or not isinstance(node[0], nodes.table):
+        error = state_machine.reporter.error(
+            'Error parsing content block for the "%s" directive: '
+            'exactly one table expected.'
+            % name, nodes.literal_block(block_text, block_text),
+            line=lineno)
+        return [error]
+    table_node = node[0]
+    table_node['classes'] += options.get('class', [])
+    if title:
+        table_node.insert(0, title)
+    return [table_node] + messages
+
+table.arguments = (0, 1, 1)
+table.options = {'class': directives.class_option}
+table.content = 1
+
+def make_title(arguments, state, lineno):
+    if arguments:
+        title_text = arguments[0]
+        text_nodes, messages = state.inline_text(title_text, lineno)
+        title = nodes.title(title_text, '', *text_nodes)
+    else:
+        title = None
+        messages = []
+    return title, messages
+
+
+if csv:
+    class DocutilsDialect(csv.Dialect):
+
+        """CSV dialect for `csv_table` directive function."""
+
+        delimiter = ','
+        quotechar = '"'
+        doublequote = True
+        skipinitialspace = True
+        lineterminator = '\n'
+        quoting = csv.QUOTE_MINIMAL
+
+        def __init__(self, options):
+            if options.has_key('delim'):
+                self.delimiter = str(options['delim'])
+            if options.has_key('keepspace'):
+                self.skipinitialspace = False
+            if options.has_key('quote'):
+                self.quotechar = str(options['quote'])
+            if options.has_key('escape'):
+                self.doublequote = False
+                self.escapechar = str(options['escape'])
+            csv.Dialect.__init__(self)
+
+
+    class HeaderDialect(csv.Dialect):
+
+        """CSV dialect to use for the "header" option data."""
+
+        delimiter = ','
+        quotechar = '"'
+        escapechar = '\\'
+        doublequote = False
+        skipinitialspace = True
+        lineterminator = '\n'
+        quoting = csv.QUOTE_MINIMAL
+
+
+def csv_table(name, arguments, options, content, lineno,
+             content_offset, block_text, state, state_machine):
+    try:
+        if ( not state.document.settings.file_insertion_enabled
+             and (options.has_key('file') or options.has_key('url')) ):
+            warning = state_machine.reporter.warning(
+                'File and URL access deactivated; ignoring "%s" directive.' %
+                name, nodes.literal_block(block_text,block_text), line=lineno)
+            return [warning]
+        check_requirements(name, lineno, block_text, state_machine)
+        title, messages = make_title(arguments, state, lineno)
+        csv_data, source = get_csv_data(
+            name, options, content, lineno, block_text, state, state_machine)
+        table_head, max_header_cols = process_header_option(
+            options, state_machine, lineno)
+        rows, max_cols = parse_csv_data_into_rows(
+            csv_data, DocutilsDialect(options), source, options)
+        max_cols = max(max_cols, max_header_cols)
+        header_rows = options.get('header-rows', 0) # default 0
+        stub_columns = options.get('stub-columns', 0) # default 0
+        check_table_dimensions(
+            rows, header_rows, stub_columns, name, lineno,
+            block_text, state_machine)
+        table_head.extend(rows[:header_rows])
+        table_body = rows[header_rows:]
+        col_widths = get_column_widths(
+            max_cols, name, options, lineno, block_text, state_machine)
+        extend_short_rows_with_empty_cells(max_cols, (table_head, table_body))
+    except SystemMessagePropagation, detail:
+        return [detail.args[0]]
+    except csv.Error, detail:
+        error = state_machine.reporter.error(
+            'Error with CSV data in "%s" directive:\n%s' % (name, detail),
+            nodes.literal_block(block_text, block_text), line=lineno)
+        return [error]
+    table = (col_widths, table_head, table_body)
+    table_node = state.build_table(table, content_offset, stub_columns)
+    table_node['classes'] += options.get('class', [])
+    if title:
+        table_node.insert(0, title)
+    return [table_node] + messages
+
+csv_table.arguments = (0, 1, 1)
+csv_table.options = {'header-rows': directives.nonnegative_int,
+                     'stub-columns': directives.nonnegative_int,
+                     'header': directives.unchanged,
+                     'widths': directives.positive_int_list,
+                     'file': directives.path,
+                     'url': directives.uri,
+                     'encoding': directives.encoding,
+                     'class': directives.class_option,
+                     # field delimiter char
+                     'delim': directives.single_char_or_whitespace_or_unicode,
+                     # treat whitespace after delimiter as significant
+                     'keepspace': directives.flag,
+                     # text field quote/unquote char:
+                     'quote': directives.single_char_or_unicode,
+                     # char used to escape delim & quote as-needed:
+                     'escape': directives.single_char_or_unicode,}
+csv_table.content = 1
+
+def check_requirements(name, lineno, block_text, state_machine):
+    if not csv:
+        error = state_machine.reporter.error(
+            'The "%s" directive is not compatible with this version of '
+            'Python (%s).  Requires the "csv" module, new in Python 2.3.'
+            % (name, sys.version.split()[0]),
+            nodes.literal_block(block_text, block_text), line=lineno)
+        raise SystemMessagePropagation(error)
+
+def get_csv_data(name, options, content, lineno, block_text,
+                 state, state_machine):
+    """
+    CSV data can come from the directive content, from an external file, or
+    from a URL reference.
+    """
+    encoding = options.get('encoding', state.document.settings.input_encoding)
+    if content:                         # CSV data is from directive content
+        if options.has_key('file') or options.has_key('url'):
+            error = state_machine.reporter.error(
+                  '"%s" directive may not both specify an external file and '
+                  'have content.' % name,
+                  nodes.literal_block(block_text, block_text), line=lineno)
+            raise SystemMessagePropagation(error)
+        source = content.source(0)
+        csv_data = content
+    elif options.has_key('file'):       # CSV data is from an external file
+        if options.has_key('url'):
+            error = state_machine.reporter.error(
+                  'The "file" and "url" options may not be simultaneously '
+                  'specified for the "%s" directive.' % name,
+                  nodes.literal_block(block_text, block_text), line=lineno)
+            raise SystemMessagePropagation(error)
+        source_dir = os.path.dirname(
+            os.path.abspath(state.document.current_source))
+        source = os.path.normpath(os.path.join(source_dir, options['file']))
+        source = utils.relative_path(None, source)
+        try:
+            state.document.settings.record_dependencies.add(source)
+            csv_file = io.FileInput(
+                source_path=source, encoding=encoding,
+                error_handler
+                    =state.document.settings.input_encoding_error_handler,
+                handle_io_errors=None)
+            csv_data = csv_file.read().splitlines()
+        except IOError, error:
+            severe = state_machine.reporter.severe(
+                  'Problems with "%s" directive path:\n%s.' % (name, error),
+                  nodes.literal_block(block_text, block_text), line=lineno)
+            raise SystemMessagePropagation(severe)
+    elif options.has_key('url'):        # CSV data is from a URL
+        if not urllib2:
+            severe = state_machine.reporter.severe(
+                  'Problems with the "%s" directive and its "url" option: '
+                  'unable to access the required functionality (from the '
+                  '"urllib2" module).' % name,
+                  nodes.literal_block(block_text, block_text), line=lineno)
+            raise SystemMessagePropagation(severe)
+        source = options['url']
+        try:
+            csv_text = urllib2.urlopen(source).read()
+        except (urllib2.URLError, IOError, OSError, ValueError), error:
+            severe = state_machine.reporter.severe(
+                  'Problems with "%s" directive URL "%s":\n%s.'
+                  % (name, options['url'], error),
+                  nodes.literal_block(block_text, block_text), line=lineno)
+            raise SystemMessagePropagation(severe)
+        csv_file = io.StringInput(
+            source=csv_text, source_path=source, encoding=encoding,
+            error_handler=state.document.settings.input_encoding_error_handler)
+        csv_data = csv_file.read().splitlines()
+    else:
+        error = state_machine.reporter.warning(
+            'The "%s" directive requires content; none supplied.' % (name),
+            nodes.literal_block(block_text, block_text), line=lineno)
+        raise SystemMessagePropagation(error)
+    return csv_data, source
+
+def process_header_option(options, state_machine, lineno):
+    source = state_machine.get_source(lineno - 1)
+    table_head = []
+    max_header_cols = 0
+    if options.has_key('header'):       # separate table header in option
+        rows, max_header_cols = parse_csv_data_into_rows(
+            options['header'].split('\n'), HeaderDialect(), source, options)
+        table_head.extend(rows)
+    return table_head, max_header_cols
+
+def parse_csv_data_into_rows(csv_data, dialect, source, options):
+    # csv.py doesn't do Unicode; encode temporarily as UTF-8
+    csv_reader = csv.reader([line.encode('utf-8') for line in csv_data],
+                            dialect=dialect)
+    rows = []
+    max_cols = 0
+    for row in csv_reader:
+        row_data = []
+        for cell in row:
+            # decode UTF-8 back to Unicode
+            cell_text = unicode(cell, 'utf-8')
+            cell_data = (0, 0, 0, statemachine.StringList(
+                cell_text.splitlines(), source=source))
+            row_data.append(cell_data)
+        rows.append(row_data)
+        max_cols = max(max_cols, len(row))
+    return rows, max_cols
+
+def check_table_dimensions(rows, header_rows, stub_columns, name, lineno,
+                           block_text, state_machine):
+    if len(rows) < header_rows:
+        error = state_machine.reporter.error(
+            '%s header row(s) specified but only %s row(s) of data supplied '
+            '("%s" directive).' % (header_rows, len(rows), name),
+            nodes.literal_block(block_text, block_text), line=lineno)
+        raise SystemMessagePropagation(error)
+    if len(rows) == header_rows > 0:
+        error = state_machine.reporter.error(
+            'Insufficient data supplied (%s row(s)); no data remaining for '
+            'table body, required by "%s" directive.' % (len(rows), name),
+            nodes.literal_block(block_text, block_text), line=lineno)
+        raise SystemMessagePropagation(error)
+    for row in rows:
+        if len(row) < stub_columns:
+            error = state_machine.reporter.error(
+                '%s stub column(s) specified but only %s columns(s) of data '
+                'supplied ("%s" directive).' % (stub_columns, len(row), name),
+                nodes.literal_block(block_text, block_text), line=lineno)
+            raise SystemMessagePropagation(error)
+        if len(row) == stub_columns > 0:
+            error = state_machine.reporter.error(
+                'Insufficient data supplied (%s columns(s)); no data remaining '
+                'for table body, required by "%s" directive.'
+                % (len(row), name),
+                nodes.literal_block(block_text, block_text), line=lineno)
+            raise SystemMessagePropagation(error)
+
+def get_column_widths(max_cols, name, options, lineno, block_text,
+                      state_machine):
+    if options.has_key('widths'):
+        col_widths = options['widths']
+        if len(col_widths) != max_cols:
+            error = state_machine.reporter.error(
+              '"%s" widths do not match the number of columns in table (%s).'
+              % (name, max_cols),
+              nodes.literal_block(block_text, block_text), line=lineno)
+            raise SystemMessagePropagation(error)
+    elif max_cols:
+        col_widths = [100 / max_cols] * max_cols
+    else:
+        error = state_machine.reporter.error(
+            'No table data detected in CSV file.',
+            nodes.literal_block(block_text, block_text), line=lineno)
+        raise SystemMessagePropagation(error)
+    return col_widths
+
+def extend_short_rows_with_empty_cells(columns, parts):
+    for part in parts:
+        for row in part:
+            if len(row) < columns:
+                row.extend([(0, 0, 0, [])] * (columns - len(row)))
+
+def list_table(name, arguments, options, content, lineno,
+               content_offset, block_text, state, state_machine):
+    """
+    Implement tables whose data is encoded as a uniform two-level bullet list.
+    For further ideas, see
+    http://docutils.sf.net/docs/dev/rst/alternatives.html#list-driven-tables
+    """ 
+    if not content:
+        error = state_machine.reporter.error(
+            'The "%s" directive is empty; content required.' % name,
+            nodes.literal_block(block_text, block_text), line=lineno)
+        return [error]
+    title, messages = make_title(arguments, state, lineno)
+    node = nodes.Element()          # anonymous container for parsing
+    state.nested_parse(content, content_offset, node)
+    try:
+        num_cols, col_widths = check_list_content(
+            node, name, options, content, lineno, block_text, state_machine)
+        table_data = [[item.children for item in row_list[0]]
+                      for row_list in node[0]]
+        header_rows = options.get('header-rows', 0) # default 0
+        stub_columns = options.get('stub-columns', 0) # default 0
+        check_table_dimensions(
+            table_data, header_rows, stub_columns, name, lineno,
+            block_text, state_machine)
+    except SystemMessagePropagation, detail:
+        return [detail.args[0]]
+    table_node = build_table_from_list(table_data, col_widths,
+                                       header_rows, stub_columns)
+    table_node['classes'] += options.get('class', [])
+    if title:
+        table_node.insert(0, title)
+    return [table_node] + messages
+
+list_table.arguments = (0, 1, 1)
+list_table.options = {'header-rows': directives.nonnegative_int,
+                      'stub-columns': directives.nonnegative_int,
+                      'widths': directives.positive_int_list,
+                      'class': directives.class_option}
+list_table.content = 1
+
+def check_list_content(node, name, options, content, lineno, block_text,
+                       state_machine):
+    if len(node) != 1 or not isinstance(node[0], nodes.bullet_list):
+        error = state_machine.reporter.error(
+            'Error parsing content block for the "%s" directive: '
+            'exactly one bullet list expected.' % name,
+            nodes.literal_block(block_text, block_text), line=lineno)
+        raise SystemMessagePropagation(error)
+    list_node = node[0]
+    # Check for a uniform two-level bullet list:
+    for item_index in range(len(list_node)):
+        item = list_node[item_index]
+        if len(item) != 1 or not isinstance(item[0], nodes.bullet_list):
+            error = state_machine.reporter.error(
+                'Error parsing content block for the "%s" directive: '
+                'two-level bullet list expected, but row %s does not contain '
+                'a second-level bullet list.' % (name, item_index + 1),
+                nodes.literal_block(block_text, block_text), line=lineno)
+            raise SystemMessagePropagation(error)
+        elif item_index:
+            # ATTN pychecker users: num_cols is guaranteed to be set in the
+            # "else" clause below for item_index==0, before this branch is
+            # triggered.
+            if len(item[0]) != num_cols:
+                error = state_machine.reporter.error(
+                    'Error parsing content block for the "%s" directive: '
+                    'uniform two-level bullet list expected, but row %s does '
+                    'not contain the same number of items as row 1 (%s vs %s).'
+                    % (name, item_index + 1, len(item[0]), num_cols),
+                    nodes.literal_block(block_text, block_text), line=lineno)
+                raise SystemMessagePropagation(error)
+        else:
+            num_cols = len(item[0])
+    col_widths = get_column_widths(
+        num_cols, name, options, lineno, block_text, state_machine)
+    if len(col_widths) != num_cols:
+        error = state_machine.reporter.error(
+            'Error parsing "widths" option of the "%s" directive: '
+            'number of columns does not match the table data (%s vs %s).'
+            % (name, len(col_widths), num_cols),
+            nodes.literal_block(block_text, block_text), line=lineno)
+        raise SystemMessagePropagation(error)
+    return num_cols, col_widths
+
+def build_table_from_list(table_data, col_widths, header_rows, stub_columns):
+    table = nodes.table()
+    tgroup = nodes.tgroup(cols=len(col_widths))
+    table += tgroup
+    for col_width in col_widths:
+        colspec = nodes.colspec(colwidth=col_width)
+        if stub_columns:
+            colspec.attributes['stub'] = 1
+            stub_columns -= 1
+        tgroup += colspec
+    rows = []
+    for row in table_data:
+        row_node = nodes.row()
+        for cell in row:
+            entry = nodes.entry()
+            entry += cell
+            row_node += entry
+        rows.append(row_node)
+    if header_rows:
+        thead = nodes.thead()
+        thead.extend(rows[:header_rows])
+        tgroup += thead
+    tbody = nodes.tbody()
+    tbody.extend(rows[header_rows:])
+    tgroup += tbody
+    return table
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/directives/misc.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/directives/misc.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/directives/misc.py (revision 3)
@@ -0,0 +1,408 @@
+# Authors: David Goodger, Dethe Elza
+# Contact: goodger@users.sourceforge.net
+# Revision: $Revision: 4229 $
+# Date: $Date: 2005-12-23 00:46:16 +0100 (Fri, 23 Dec 2005) $
+# Copyright: This module has been placed in the public domain.
+
+"""Miscellaneous directives."""
+
+__docformat__ = 'reStructuredText'
+
+import sys
+import os.path
+import re
+import time
+from docutils import io, nodes, statemachine, utils
+from docutils.parsers.rst import directives, roles, states
+from docutils.transforms import misc
+
+try:
+    import urllib2
+except ImportError:
+    urllib2 = None
+
+
+standard_include_path = os.path.join(os.path.dirname(states.__file__),
+                                     'include')
+
+def include(name, arguments, options, content, lineno,
+            content_offset, block_text, state, state_machine):
+    """Include a reST file as part of the content of this reST file."""
+    if not state.document.settings.file_insertion_enabled:
+        warning = state_machine.reporter.warning(
+              '"%s" directive disabled.' % name,
+              nodes.literal_block(block_text, block_text), line=lineno)
+        return [warning]
+    source = state_machine.input_lines.source(
+        lineno - state_machine.input_offset - 1)
+    source_dir = os.path.dirname(os.path.abspath(source))
+    path = directives.path(arguments[0])
+    if path.startswith('<') and  path.endswith('>'):
+        path = os.path.join(standard_include_path, path[1:-1])
+    path = os.path.normpath(os.path.join(source_dir, path))
+    path = utils.relative_path(None, path)
+    encoding = options.get('encoding', state.document.settings.input_encoding)
+    try:
+        state.document.settings.record_dependencies.add(path)
+        include_file = io.FileInput(
+            source_path=path, encoding=encoding,
+            error_handler=state.document.settings.input_encoding_error_handler,
+            handle_io_errors=None)
+    except IOError, error:
+        severe = state_machine.reporter.severe(
+              'Problems with "%s" directive path:\n%s: %s.'
+              % (name, error.__class__.__name__, error),
+              nodes.literal_block(block_text, block_text), line=lineno)
+        return [severe]
+    try:
+        include_text = include_file.read()
+    except UnicodeError, error:
+        severe = state_machine.reporter.severe(
+              'Problem with "%s" directive:\n%s: %s'
+              % (name, error.__class__.__name__, error),
+              nodes.literal_block(block_text, block_text), line=lineno)
+        return [severe]
+    if options.has_key('literal'):
+        literal_block = nodes.literal_block(include_text, include_text,
+                                            source=path)
+        literal_block.line = 1
+        return literal_block
+    else:
+        include_lines = statemachine.string2lines(include_text,
+                                                  convert_whitespace=1)
+        state_machine.insert_input(include_lines, path)
+        return []
+
+include.arguments = (1, 0, 1)
+include.options = {'literal': directives.flag,
+                   'encoding': directives.encoding}
+
+def raw(name, arguments, options, content, lineno,
+        content_offset, block_text, state, state_machine):
+    """
+    Pass through content unchanged
+
+    Content is included in output based on type argument
+
+    Content may be included inline (content section of directive) or
+    imported from a file or url.
+    """
+    if ( not state.document.settings.raw_enabled
+         or (not state.document.settings.file_insertion_enabled
+             and (options.has_key('file') or options.has_key('url'))) ):
+        warning = state_machine.reporter.warning(
+              '"%s" directive disabled.' % name,
+              nodes.literal_block(block_text, block_text), line=lineno)
+        return [warning]
+    attributes = {'format': ' '.join(arguments[0].lower().split())}
+    encoding = options.get('encoding', state.document.settings.input_encoding)
+    if content:
+        if options.has_key('file') or options.has_key('url'):
+            error = state_machine.reporter.error(
+                  '"%s" directive may not both specify an external file and '
+                  'have content.' % name,
+                  nodes.literal_block(block_text, block_text), line=lineno)
+            return [error]
+        text = '\n'.join(content)
+    elif options.has_key('file'):
+        if options.has_key('url'):
+            error = state_machine.reporter.error(
+                  'The "file" and "url" options may not be simultaneously '
+                  'specified for the "%s" directive.' % name,
+                  nodes.literal_block(block_text, block_text), line=lineno)
+            return [error]
+        source_dir = os.path.dirname(
+            os.path.abspath(state.document.current_source))
+        path = os.path.normpath(os.path.join(source_dir, options['file']))
+        path = utils.relative_path(None, path)
+        try:
+            state.document.settings.record_dependencies.add(path)
+            raw_file = io.FileInput(
+                source_path=path, encoding=encoding,
+                error_handler=state.document.settings.input_encoding_error_handler,
+                handle_io_errors=None)
+        except IOError, error:
+            severe = state_machine.reporter.severe(
+                  'Problems with "%s" directive path:\n%s.' % (name, error),
+                  nodes.literal_block(block_text, block_text), line=lineno)
+            return [severe]
+        try:
+            text = raw_file.read()
+        except UnicodeError, error:
+            severe = state_machine.reporter.severe(
+                  'Problem with "%s" directive:\n%s: %s'
+                  % (name, error.__class__.__name__, error),
+                  nodes.literal_block(block_text, block_text), line=lineno)
+            return [severe]
+        attributes['source'] = path
+    elif options.has_key('url'):
+        if not urllib2:
+            severe = state_machine.reporter.severe(
+                  'Problems with the "%s" directive and its "url" option: '
+                  'unable to access the required functionality (from the '
+                  '"urllib2" module).' % name,
+                  nodes.literal_block(block_text, block_text), line=lineno)
+            return [severe]
+        source = options['url']
+        try:
+            raw_text = urllib2.urlopen(source).read()
+        except (urllib2.URLError, IOError, OSError), error:
+            severe = state_machine.reporter.severe(
+                  'Problems with "%s" directive URL "%s":\n%s.'
+                  % (name, options['url'], error),
+                  nodes.literal_block(block_text, block_text), line=lineno)
+            return [severe]
+        raw_file = io.StringInput(
+            source=raw_text, source_path=source, encoding=encoding,
+            error_handler=state.document.settings.input_encoding_error_handler)
+        try:
+            text = raw_file.read()
+        except UnicodeError, error:
+            severe = state_machine.reporter.severe(
+                  'Problem with "%s" directive:\n%s: %s'
+                  % (name, error.__class__.__name__, error),
+                  nodes.literal_block(block_text, block_text), line=lineno)
+            return [severe]
+        attributes['source'] = source
+    else:
+        error = state_machine.reporter.warning(
+            'The "%s" directive requires content; none supplied.' % (name),
+            nodes.literal_block(block_text, block_text), line=lineno)
+        return [error]
+    raw_node = nodes.raw('', text, **attributes)
+    return [raw_node]
+
+raw.arguments = (1, 0, 1)
+raw.options = {'file': directives.path,
+               'url': directives.uri,
+               'encoding': directives.encoding}
+raw.content = 1
+
+def replace(name, arguments, options, content, lineno,
+            content_offset, block_text, state, state_machine):
+    if not isinstance(state, states.SubstitutionDef):
+        error = state_machine.reporter.error(
+            'Invalid context: the "%s" directive can only be used within a '
+            'substitution definition.' % (name),
+            nodes.literal_block(block_text, block_text), line=lineno)
+        return [error]
+    text = '\n'.join(content)
+    element = nodes.Element(text)
+    if text:
+        state.nested_parse(content, content_offset, element)
+        if len(element) != 1 or not isinstance(element[0], nodes.paragraph):
+            messages = []
+            for node in element:
+                if isinstance(node, nodes.system_message):
+                    node['backrefs'] = []
+                    messages.append(node)
+            error = state_machine.reporter.error(
+                'Error in "%s" directive: may contain a single paragraph '
+                'only.' % (name), line=lineno)
+            messages.append(error)
+            return messages
+        else:
+            return element[0].children
+    else:
+        error = state_machine.reporter.error(
+            'The "%s" directive is empty; content required.' % (name),
+            line=lineno)
+        return [error]
+
+replace.content = 1
+
+def unicode_directive(name, arguments, options, content, lineno,
+                      content_offset, block_text, state, state_machine):
+    r"""
+    Convert Unicode character codes (numbers) to characters.  Codes may be
+    decimal numbers, hexadecimal numbers (prefixed by ``0x``, ``x``, ``\x``,
+    ``U+``, ``u``, or ``\u``; e.g. ``U+262E``), or XML-style numeric character
+    entities (e.g. ``&#x262E;``).  Text following ".." is a comment and is
+    ignored.  Spaces are ignored, and any other text remains as-is.
+    """
+    if not isinstance(state, states.SubstitutionDef):
+        error = state_machine.reporter.error(
+            'Invalid context: the "%s" directive can only be used within a '
+            'substitution definition.' % (name),
+            nodes.literal_block(block_text, block_text), line=lineno)
+        return [error]
+    substitution_definition = state_machine.node
+    if options.has_key('trim'):
+        substitution_definition.attributes['ltrim'] = 1
+        substitution_definition.attributes['rtrim'] = 1
+    if options.has_key('ltrim'):
+        substitution_definition.attributes['ltrim'] = 1
+    if options.has_key('rtrim'):
+        substitution_definition.attributes['rtrim'] = 1
+    codes = unicode_comment_pattern.split(arguments[0])[0].split()
+    element = nodes.Element()
+    for code in codes:
+        try:
+            decoded = directives.unicode_code(code)
+        except ValueError, err:
+            error = state_machine.reporter.error(
+                'Invalid character code: %s\n%s: %s'
+                % (code, err.__class__.__name__, err),
+                nodes.literal_block(block_text, block_text), line=lineno)
+            return [error]
+        element += nodes.Text(decoded)
+    return element.children
+
+unicode_directive.arguments = (1, 0, 1)
+unicode_directive.options = {'trim': directives.flag,
+                             'ltrim': directives.flag,
+                             'rtrim': directives.flag}
+unicode_comment_pattern = re.compile(r'( |\n|^)\.\. ')
+
+def class_directive(name, arguments, options, content, lineno,
+                       content_offset, block_text, state, state_machine):
+    """
+    Set a "class" attribute on the directive content or the next element.
+    When applied to the next element, a "pending" element is inserted, and a
+    transform does the work later.
+    """
+    try:
+        class_value = directives.class_option(arguments[0])
+    except ValueError:
+        error = state_machine.reporter.error(
+            'Invalid class attribute value for "%s" directive: "%s".'
+            % (name, arguments[0]),
+            nodes.literal_block(block_text, block_text), line=lineno)
+        return [error]
+    node_list = []
+    if content:
+        container = nodes.Element()
+        state.nested_parse(content, content_offset, container)
+        for node in container:
+            node['classes'].extend(class_value)
+        node_list.extend(container.children)
+    else:
+        pending = nodes.pending(misc.ClassAttribute,
+                                {'class': class_value, 'directive': name},
+                                block_text)
+        state_machine.document.note_pending(pending)
+        node_list.append(pending)
+    return node_list
+
+class_directive.arguments = (1, 0, 1)
+class_directive.content = 1
+
+role_arg_pat = re.compile(r'(%s)\s*(\(\s*(%s)\s*\)\s*)?$'
+                          % ((states.Inliner.simplename,) * 2))
+def role(name, arguments, options, content, lineno,
+         content_offset, block_text, state, state_machine):
+    """Dynamically create and register a custom interpreted text role."""
+    if content_offset > lineno or not content:
+        error = state_machine.reporter.error(
+            '"%s" directive requires arguments on the first line.'
+            % name, nodes.literal_block(block_text, block_text), line=lineno)
+        return [error]
+    args = content[0]
+    match = role_arg_pat.match(args)
+    if not match:
+        error = state_machine.reporter.error(
+            '"%s" directive arguments not valid role names: "%s".'
+            % (name, args), nodes.literal_block(block_text, block_text),
+            line=lineno)
+        return [error]
+    new_role_name = match.group(1)
+    base_role_name = match.group(3)
+    messages = []
+    if base_role_name:
+        base_role, messages = roles.role(
+            base_role_name, state_machine.language, lineno, state.reporter)
+        if base_role is None:
+            error = state.reporter.error(
+                'Unknown interpreted text role "%s".' % base_role_name,
+                nodes.literal_block(block_text, block_text), line=lineno)
+            return messages + [error]
+    else:
+        base_role = roles.generic_custom_role
+    assert not hasattr(base_role, 'arguments'), (
+        'Supplemental directive arguments for "%s" directive not supported'
+        '(specified by "%r" role).' % (name, base_role))
+    try:
+        (arguments, options, content, content_offset) = (
+            state.parse_directive_block(content[1:], content_offset, base_role,
+                                        option_presets={}))
+    except states.MarkupError, detail:
+        error = state_machine.reporter.error(
+            'Error in "%s" directive:\n%s.' % (name, detail),
+            nodes.literal_block(block_text, block_text), line=lineno)
+        return messages + [error]
+    if not options.has_key('class'):
+        try:
+            options['class'] = directives.class_option(new_role_name)
+        except ValueError, detail:
+            error = state_machine.reporter.error(
+                'Invalid argument for "%s" directive:\n%s.'
+                % (name, detail),
+                nodes.literal_block(block_text, block_text), line=lineno)
+            return messages + [error]
+    role = roles.CustomRole(new_role_name, base_role, options, content)
+    roles.register_local_role(new_role_name, role)
+    return messages
+
+role.content = 1
+
+def default_role(name, arguments, options, content, lineno,
+                 content_offset, block_text, state, state_machine):
+    """Set the default interpreted text role."""
+    if not arguments:
+        if roles._roles.has_key(''):
+            # restore the "default" default role
+            del roles._roles['']
+        return []
+    role_name = arguments[0]
+    role, messages = roles.role(
+        role_name, state_machine.language, lineno, state.reporter)
+    if role is None:
+        error = state.reporter.error(
+            'Unknown interpreted text role "%s".' % role_name,
+            nodes.literal_block(block_text, block_text), line=lineno)
+        return messages + [error]
+    roles._roles[''] = role
+    # @@@ should this be local to the document, not the parser?
+    return messages
+
+default_role.arguments = (0, 1, 0)
+
+def title(name, arguments, options, content, lineno,
+          content_offset, block_text, state, state_machine):
+    state_machine.document['title'] = arguments[0]
+    return []
+
+title.arguments = (1, 0, 1)
+
+def date(name, arguments, options, content, lineno,
+         content_offset, block_text, state, state_machine):
+    if not isinstance(state, states.SubstitutionDef):
+        error = state_machine.reporter.error(
+            'Invalid context: the "%s" directive can only be used within a '
+            'substitution definition.' % (name),
+            nodes.literal_block(block_text, block_text), line=lineno)
+        return [error]
+    format = '\n'.join(content) or '%Y-%m-%d'
+    text = time.strftime(format)
+    return [nodes.Text(text)]
+
+date.content = 1
+
+def directive_test_function(name, arguments, options, content, lineno,
+                            content_offset, block_text, state, state_machine):
+    """This directive is useful only for testing purposes."""
+    if content:
+        text = '\n'.join(content)
+        info = state_machine.reporter.info(
+            'Directive processed. Type="%s", arguments=%r, options=%r, '
+            'content:' % (name, arguments, options),
+            nodes.literal_block(text, text), line=lineno)
+    else:
+        info = state_machine.reporter.info(
+            'Directive processed. Type="%s", arguments=%r, options=%r, '
+            'content: None' % (name, arguments, options), line=lineno)
+    return [info]
+
+directive_test_function.arguments = (0, 1, 1)
+directive_test_function.options = {'option': directives.unchanged_required}
+directive_test_function.content = 1
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/directives/body.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/directives/body.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/directives/body.py (revision 3)
@@ -0,0 +1,196 @@
+# Author: David Goodger
+# Contact: goodger@python.org
+# Revision: $Revision: 3963 $
+# Date: $Date: 2005-10-28 18:12:56 +0200 (Fri, 28 Oct 2005) $
+# Copyright: This module has been placed in the public domain.
+
+"""
+Directives for additional body elements.
+
+See `docutils.parsers.rst.directives` for API details.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import sys
+from docutils import nodes
+from docutils.parsers.rst import directives
+from docutils.parsers.rst.roles import set_classes
+
+              
+def topic(name, arguments, options, content, lineno,
+          content_offset, block_text, state, state_machine,
+          node_class=nodes.topic):
+    if not (state_machine.match_titles
+            or isinstance(state_machine.node, nodes.sidebar)):
+        error = state_machine.reporter.error(
+              'The "%s" directive may not be used within topics '
+              'or body elements.' % name,
+              nodes.literal_block(block_text, block_text), line=lineno)
+        return [error]
+    if not content:
+        warning = state_machine.reporter.warning(
+            'Content block expected for the "%s" directive; none found.'
+            % name, nodes.literal_block(block_text, block_text),
+            line=lineno)
+        return [warning]
+    title_text = arguments[0]
+    textnodes, messages = state.inline_text(title_text, lineno)
+    titles = [nodes.title(title_text, '', *textnodes)]
+    # sidebar uses this code
+    if options.has_key('subtitle'):
+        textnodes, more_messages = state.inline_text(options['subtitle'],
+                                                     lineno)
+        titles.append(nodes.subtitle(options['subtitle'], '', *textnodes))
+        messages.extend(more_messages)
+    text = '\n'.join(content)
+    node = node_class(text, *(titles + messages))
+    node['classes'] += options.get('class', [])
+    if text:
+        state.nested_parse(content, content_offset, node)
+    return [node]
+
+topic.arguments = (1, 0, 1)
+topic.options = {'class': directives.class_option}
+topic.content = 1
+
+def sidebar(name, arguments, options, content, lineno,
+            content_offset, block_text, state, state_machine):
+    if isinstance(state_machine.node, nodes.sidebar):
+        error = state_machine.reporter.error(
+              'The "%s" directive may not be used within a sidebar element.'
+              % name, nodes.literal_block(block_text, block_text), line=lineno)
+        return [error]
+    return topic(name, arguments, options, content, lineno,
+                 content_offset, block_text, state, state_machine,
+                 node_class=nodes.sidebar)
+
+sidebar.arguments = (1, 0, 1)
+sidebar.options = {'subtitle': directives.unchanged_required,
+                   'class': directives.class_option}
+sidebar.content = 1
+
+def line_block(name, arguments, options, content, lineno,
+               content_offset, block_text, state, state_machine):
+    if not content:
+        warning = state_machine.reporter.warning(
+            'Content block expected for the "%s" directive; none found.'
+            % name, nodes.literal_block(block_text, block_text), line=lineno)
+        return [warning]
+    block = nodes.line_block(classes=options.get('class', []))
+    node_list = [block]
+    for line_text in content:
+        text_nodes, messages = state.inline_text(line_text.strip(),
+                                                 lineno + content_offset)
+        line = nodes.line(line_text, '', *text_nodes)
+        if line_text.strip():
+            line.indent = len(line_text) - len(line_text.lstrip())
+        block += line
+        node_list.extend(messages)
+        content_offset += 1
+    state.nest_line_block_lines(block)
+    return node_list
+
+line_block.options = {'class': directives.class_option}
+line_block.content = 1
+
+def parsed_literal(name, arguments, options, content, lineno,
+                   content_offset, block_text, state, state_machine):
+    set_classes(options)
+    return block(name, arguments, options, content, lineno,
+                 content_offset, block_text, state, state_machine,
+                 node_class=nodes.literal_block)
+
+parsed_literal.options = {'class': directives.class_option}
+parsed_literal.content = 1
+
+def block(name, arguments, options, content, lineno,
+          content_offset, block_text, state, state_machine, node_class):
+    if not content:
+        warning = state_machine.reporter.warning(
+            'Content block expected for the "%s" directive; none found.'
+            % name, nodes.literal_block(block_text, block_text), line=lineno)
+        return [warning]
+    text = '\n'.join(content)
+    text_nodes, messages = state.inline_text(text, lineno)
+    node = node_class(text, '', *text_nodes, **options)
+    node.line = content_offset + 1
+    return [node] + messages
+
+def rubric(name, arguments, options, content, lineno,
+             content_offset, block_text, state, state_machine):
+    rubric_text = arguments[0]
+    textnodes, messages = state.inline_text(rubric_text, lineno)
+    rubric = nodes.rubric(rubric_text, '', *textnodes, **options)
+    return [rubric] + messages
+
+rubric.arguments = (1, 0, 1)
+rubric.options = {'class': directives.class_option}
+
+def epigraph(name, arguments, options, content, lineno,
+             content_offset, block_text, state, state_machine):
+    block_quote, messages = state.block_quote(content, content_offset)
+    block_quote['classes'].append('epigraph')
+    return [block_quote] + messages
+
+epigraph.content = 1
+
+def highlights(name, arguments, options, content, lineno,
+             content_offset, block_text, state, state_machine):
+    block_quote, messages = state.block_quote(content, content_offset)
+    block_quote['classes'].append('highlights')
+    return [block_quote] + messages
+
+highlights.content = 1
+
+def pull_quote(name, arguments, options, content, lineno,
+             content_offset, block_text, state, state_machine):
+    block_quote, messages = state.block_quote(content, content_offset)
+    block_quote['classes'].append('pull-quote')
+    return [block_quote] + messages
+
+pull_quote.content = 1
+
+def compound(name, arguments, options, content, lineno,
+             content_offset, block_text, state, state_machine):
+    text = '\n'.join(content)
+    if not text:
+        error = state_machine.reporter.error(
+            'The "%s" directive is empty; content required.' % name,
+            nodes.literal_block(block_text, block_text), line=lineno)
+        return [error]
+    node = nodes.compound(text)
+    node['classes'] += options.get('class', [])
+    state.nested_parse(content, content_offset, node)
+    return [node]
+
+compound.options = {'class': directives.class_option}
+compound.content = 1
+
+def container(name, arguments, options, content, lineno,
+              content_offset, block_text, state, state_machine):
+    text = '\n'.join(content)
+    if not text:
+        error = state_machine.reporter.error(
+            'The "%s" directive is empty; content required.' % name,
+            nodes.literal_block(block_text, block_text), line=lineno)
+        return [error]
+    try:
+        if arguments:
+            classes = directives.class_option(arguments[0])
+        else:
+            classes = []
+    except ValueError:
+        error = state_machine.reporter.error(
+            'Invalid class attribute value for "%s" directive: "%s".'
+            % (name, arguments[0]),
+            nodes.literal_block(block_text, block_text), line=lineno)
+        return [error]
+    node = nodes.container(text)
+    node['classes'].extend(classes)
+    state.nested_parse(content, content_offset, node)
+    return [node]
+
+container.arguments = (0, 1, 1)
+container.content = 1
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/directives/__init__.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/directives/__init__.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/directives/__init__.py (revision 3)
@@ -0,0 +1,449 @@
+# Author: David Goodger
+# Contact: goodger@python.org
+# Revision: $Revision: 4229 $
+# Date: $Date: 2005-12-23 00:46:16 +0100 (Fri, 23 Dec 2005) $
+# Copyright: This module has been placed in the public domain.
+
+"""
+This package contains directive implementation modules.
+
+The interface for directive functions is as follows::
+
+    def directive_fn(name, arguments, options, content, lineno,
+                     content_offset, block_text, state, state_machine):
+        code...
+
+    # Set function attributes:
+    directive_fn.arguments = ...
+    directive_fn.options = ...
+    direcitve_fn.content = ...
+
+Parameters:
+
+- ``name`` is the directive type or name (string).
+
+- ``arguments`` is a list of positional arguments (strings).
+
+- ``options`` is a dictionary mapping option names (strings) to values (type
+  depends on option conversion functions; see below).
+
+- ``content`` is a list of strings, the directive content.
+
+- ``lineno`` is the line number of the first line of the directive.
+
+- ``content_offset`` is the line offset of the first line of the content from
+  the beginning of the current input.  Used when initiating a nested parse.
+
+- ``block_text`` is a string containing the entire directive.  Include it as
+  the content of a literal block in a system message if there is a problem.
+
+- ``state`` is the state which called the directive function.
+
+- ``state_machine`` is the state machine which controls the state which called
+  the directive function.
+
+Function attributes, interpreted by the directive parser (which calls the
+directive function):
+
+- ``arguments``: A 3-tuple specifying the expected positional arguments, or
+  ``None`` if the directive has no arguments.  The 3 items in the tuple are
+  ``(required, optional, whitespace OK in last argument)``:
+
+  1. The number of required arguments.
+  2. The number of optional arguments.
+  3. A boolean, indicating if the final argument may contain whitespace.
+
+  Arguments are normally single whitespace-separated words.  The final
+  argument may contain whitespace if the third item in the argument spec tuple
+  is 1/True.  If the form of the arguments is more complex, specify only one
+  argument (either required or optional) and indicate that final whitespace is
+  OK; the client code must do any context-sensitive parsing.
+
+- ``options``: A dictionary, mapping known option names to conversion
+  functions such as `int` or `float`.  ``None`` or an empty dict implies no
+  options to parse.  Several directive option conversion functions are defined
+  in this module.
+
+  Option conversion functions take a single parameter, the option argument (a
+  string or ``None``), validate it and/or convert it to the appropriate form.
+  Conversion functions may raise ``ValueError`` and ``TypeError`` exceptions.
+
+- ``content``: A boolean; true if content is allowed.  Client code must handle
+  the case where content is required but not supplied (an empty content list
+  will be supplied).
+
+Directive functions return a list of nodes which will be inserted into the
+document tree at the point where the directive was encountered (can be an
+empty list).
+
+See `Creating reStructuredText Directives`_ for more information.
+
+.. _Creating reStructuredText Directives:
+   http://docutils.sourceforge.net/docs/howto/rst-directives.html
+"""
+
+__docformat__ = 'reStructuredText'
+
+import re
+import codecs
+from docutils import nodes
+from docutils.parsers.rst.languages import en as _fallback_language_module
+
+
+_directive_registry = {
+      'attention': ('admonitions', 'attention'),
+      'caution': ('admonitions', 'caution'),
+      'danger': ('admonitions', 'danger'),
+      'error': ('admonitions', 'error'),
+      'important': ('admonitions', 'important'),
+      'note': ('admonitions', 'note'),
+      'tip': ('admonitions', 'tip'),
+      'hint': ('admonitions', 'hint'),
+      'warning': ('admonitions', 'warning'),
+      'admonition': ('admonitions', 'admonition'),
+      'sidebar': ('body', 'sidebar'),
+      'topic': ('body', 'topic'),
+      'line-block': ('body', 'line_block'),
+      'parsed-literal': ('body', 'parsed_literal'),
+      'rubric': ('body', 'rubric'),
+      'epigraph': ('body', 'epigraph'),
+      'highlights': ('body', 'highlights'),
+      'pull-quote': ('body', 'pull_quote'),
+      'compound': ('body', 'compound'),
+      'container': ('body', 'container'),
+      #'questions': ('body', 'question_list'),
+      'table': ('tables', 'table'),
+      'csv-table': ('tables', 'csv_table'),
+      'list-table': ('tables', 'list_table'),
+      'image': ('images', 'image'),
+      'figure': ('images', 'figure'),
+      'contents': ('parts', 'contents'),
+      'sectnum': ('parts', 'sectnum'),
+      'header': ('parts', 'header'),
+      'footer': ('parts', 'footer'),
+      #'footnotes': ('parts', 'footnotes'),
+      #'citations': ('parts', 'citations'),
+      'target-notes': ('references', 'target_notes'),
+      'meta': ('html', 'meta'),
+      #'imagemap': ('html', 'imagemap'),
+      'raw': ('misc', 'raw'),
+      'include': ('misc', 'include'),
+      'replace': ('misc', 'replace'),
+      'unicode': ('misc', 'unicode_directive'),
+      'class': ('misc', 'class_directive'),
+      'role': ('misc', 'role'),
+      'default-role': ('misc', 'default_role'),
+      'title': ('misc', 'title'),
+      'date': ('misc', 'date'),
+      'restructuredtext-test-directive': ('misc', 'directive_test_function'),}
+"""Mapping of directive name to (module name, function name).  The directive
+name is canonical & must be lowercase.  Language-dependent names are defined
+in the ``language`` subpackage."""
+
+_modules = {}
+"""Cache of imported directive modules."""
+
+_directives = {}
+"""Cache of imported directive functions."""
+
+def directive(directive_name, language_module, document):
+    """
+    Locate and return a directive function from its language-dependent name.
+    If not found in the current language, check English.  Return None if the
+    named directive cannot be found.
+    """
+    normname = directive_name.lower()
+    messages = []
+    msg_text = []
+    if _directives.has_key(normname):
+        return _directives[normname], messages
+    canonicalname = None
+    try:
+        canonicalname = language_module.directives[normname]
+    except AttributeError, error:
+        msg_text.append('Problem retrieving directive entry from language '
+                        'module %r: %s.' % (language_module, error))
+    except KeyError:
+        msg_text.append('No directive entry for "%s" in module "%s".'
+                        % (directive_name, language_module.__name__))
+    if not canonicalname:
+        try:
+            canonicalname = _fallback_language_module.directives[normname]
+            msg_text.append('Using English fallback for directive "%s".'
+                            % directive_name)
+        except KeyError:
+            msg_text.append('Trying "%s" as canonical directive name.'
+                            % directive_name)
+            # The canonical name should be an English name, but just in case:
+            canonicalname = normname
+    if msg_text:
+        message = document.reporter.info(
+            '\n'.join(msg_text), line=document.current_line)
+        messages.append(message)
+    try:
+        modulename, functionname = _directive_registry[canonicalname]
+    except KeyError:
+        # Error handling done by caller.
+        return None, messages
+    if _modules.has_key(modulename):
+        module = _modules[modulename]
+    else:
+        try:
+            module = __import__(modulename, globals(), locals())
+        except ImportError, detail:
+            messages.append(document.reporter.error(
+                'Error importing directive module "%s" (directive "%s"):\n%s'
+                % (modulename, directive_name, detail),
+                line=document.current_line))
+            return None, messages
+    try:
+        function = getattr(module, functionname)
+        _directives[normname] = function
+    except AttributeError:
+        messages.append(document.reporter.error(
+            'No function "%s" in module "%s" (directive "%s").'
+            % (functionname, modulename, directive_name),
+            line=document.current_line))
+        return None, messages
+    return function, messages
+
+def register_directive(name, directive_function):
+    """
+    Register a nonstandard application-defined directive function.
+    Language lookups are not needed for such functions.
+    """
+    _directives[name] = directive_function
+
+def flag(argument):
+    """
+    Check for a valid flag option (no argument) and return ``None``.
+    (Directive option conversion function.)
+
+    Raise ``ValueError`` if an argument is found.
+    """
+    if argument and argument.strip():
+        raise ValueError('no argument is allowed; "%s" supplied' % argument)
+    else:
+        return None
+
+def unchanged_required(argument):
+    """
+    Return the argument text, unchanged.
+    (Directive option conversion function.)
+
+    Raise ``ValueError`` if no argument is found.
+    """
+    if argument is None:
+        raise ValueError('argument required but none supplied')
+    else:
+        return argument  # unchanged!
+
+def unchanged(argument):
+    """
+    Return the argument text, unchanged.
+    (Directive option conversion function.)
+
+    No argument implies empty string ("").
+    """
+    if argument is None:
+        return u''
+    else:
+        return argument  # unchanged!
+
+def path(argument):
+    """
+    Return the path argument unwrapped (with newlines removed).
+    (Directive option conversion function.)
+
+    Raise ``ValueError`` if no argument is found.
+    """
+    if argument is None:
+        raise ValueError('argument required but none supplied')
+    else:
+        path = ''.join([s.strip() for s in argument.splitlines()])
+        return path
+
+def uri(argument):
+    """
+    Return the URI argument with whitespace removed.
+    (Directive option conversion function.)
+
+    Raise ``ValueError`` if no argument is found.
+    """
+    if argument is None:
+        raise ValueError('argument required but none supplied')
+    else:
+        uri = ''.join(argument.split())
+        return uri
+
+def nonnegative_int(argument):
+    """
+    Check for a nonnegative integer argument; raise ``ValueError`` if not.
+    (Directive option conversion function.)
+    """
+    value = int(argument)
+    if value < 0:
+        raise ValueError('negative value; must be positive or zero')
+    return value
+
+length_units = ['em', 'ex', 'px', 'in', 'cm', 'mm', 'pt', 'pc']
+
+def get_measure(argument, units):
+    """
+    Check for a positive argument of one of the units and return a
+    normalized string of the form "<value><unit>" (without space in
+    between).
+    
+    To be called from directive option conversion functions.
+    """
+    match = re.match(r'^([0-9.]+) *(%s)$' % '|'.join(units), argument)
+    try:
+        assert match is not None
+        float(match.group(1))
+    except (AssertionError, ValueError):
+        raise ValueError(
+            'not a positive measure of one of the following units:\n%s'
+            % ' '.join(['"%s"' % i for i in units]))
+    return match.group(1) + match.group(2)
+
+def length_or_unitless(argument):
+    return get_measure(argument, length_units + [''])
+
+def length_or_percentage_or_unitless(argument):
+    return get_measure(argument, length_units + ['%', ''])
+
+def class_option(argument):
+    """
+    Convert the argument into a list of ID-compatible strings and return it.
+    (Directive option conversion function.)
+
+    Raise ``ValueError`` if no argument is found.
+    """
+    if argument is None:
+        raise ValueError('argument required but none supplied')
+    names = argument.split()
+    class_names = []
+    for name in names:
+        class_name = nodes.make_id(name)
+        if not class_name:
+            raise ValueError('cannot make "%s" into a class name' % name)
+        class_names.append(class_name)
+    return class_names
+
+unicode_pattern = re.compile(
+    r'(?:0x|x|\\x|U\+?|\\u)([0-9a-f]+)$|&#x([0-9a-f]+);$', re.IGNORECASE)
+
+def unicode_code(code):
+    r"""
+    Convert a Unicode character code to a Unicode character.
+    (Directive option conversion function.)
+
+    Codes may be decimal numbers, hexadecimal numbers (prefixed by ``0x``,
+    ``x``, ``\x``, ``U+``, ``u``, or ``\u``; e.g. ``U+262E``), or XML-style
+    numeric character entities (e.g. ``&#x262E;``).  Other text remains as-is.
+
+    Raise ValueError for illegal Unicode code values.
+    """
+    try:
+        if code.isdigit():                  # decimal number
+            return unichr(int(code))
+        else:
+            match = unicode_pattern.match(code)
+            if match:                       # hex number
+                value = match.group(1) or match.group(2)
+                return unichr(int(value, 16))
+            else:                           # other text
+                return code
+    except OverflowError, detail:
+        raise ValueError('code too large (%s)' % detail)
+
+def single_char_or_unicode(argument):
+    """
+    A single character is returned as-is.  Unicode characters codes are
+    converted as in `unicode_code`.  (Directive option conversion function.)
+    """
+    char = unicode_code(argument)
+    if len(char) > 1:
+        raise ValueError('%r invalid; must be a single character or '
+                         'a Unicode code' % char)
+    return char
+
+def single_char_or_whitespace_or_unicode(argument):
+    """
+    As with `single_char_or_unicode`, but "tab" and "space" are also supported.
+    (Directive option conversion function.)
+    """
+    if argument == 'tab':
+        char = '\t'
+    elif argument == 'space':
+        char = ' '
+    else:
+        char = single_char_or_unicode(argument)
+    return char
+
+def positive_int(argument):
+    """
+    Converts the argument into an integer.  Raises ValueError for negative,
+    zero, or non-integer values.  (Directive option conversion function.)
+    """
+    value = int(argument)
+    if value < 1:
+        raise ValueError('negative or zero value; must be positive')
+    return value
+
+def positive_int_list(argument):
+    """
+    Converts a space- or comma-separated list of values into a Python list
+    of integers.
+    (Directive option conversion function.)
+
+    Raises ValueError for non-positive-integer values.
+    """
+    if ',' in argument:
+        entries = argument.split(',')
+    else:
+        entries = argument.split()
+    return [positive_int(entry) for entry in entries]
+
+def encoding(argument):
+    """
+    Verfies the encoding argument by lookup.
+    (Directive option conversion function.)
+
+    Raises ValueError for unknown encodings.
+    """
+    try:
+        codecs.lookup(argument)
+    except LookupError:
+        raise ValueError('unknown encoding: "%s"' % argument)
+    return argument
+
+def choice(argument, values):
+    """
+    Directive option utility function, supplied to enable options whose
+    argument must be a member of a finite set of possible values (must be
+    lower case).  A custom conversion function must be written to use it.  For
+    example::
+
+        from docutils.parsers.rst import directives
+
+        def yesno(argument):
+            return directives.choice(argument, ('yes', 'no'))
+
+    Raise ``ValueError`` if no argument is found or if the argument's value is
+    not valid (not an entry in the supplied list).
+    """
+    try:
+        value = argument.lower().strip()
+    except AttributeError:
+        raise ValueError('must supply an argument; choose from %s'
+                         % format_values(values))
+    if value in values:
+        return value
+    else:
+        raise ValueError('"%s" unknown; choose from %s'
+                         % (argument, format_values(values)))
+
+def format_values(values):
+    return '%s, or "%s"' % (', '.join(['"%s"' % s for s in values[:-1]]),
+                            values[-1])
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/directives/references.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/directives/references.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/directives/references.py (revision 3)
@@ -0,0 +1,27 @@
+# Author: David Goodger, Dmitry Jemerov
+# Contact: goodger@users.sourceforge.net
+# Revision: $Revision: 4156 $
+# Date: $Date: 2005-12-08 05:43:13 +0100 (Thu, 08 Dec 2005) $
+# Copyright: This module has been placed in the public domain.
+
+"""
+Directives for references and targets.
+"""
+
+__docformat__ = 'reStructuredText'
+
+from docutils import nodes
+from docutils.transforms import references
+from docutils.parsers.rst import directives
+
+
+def target_notes(name, arguments, options, content, lineno,
+                 content_offset, block_text, state, state_machine):
+    """Target footnote generation."""
+    pending = nodes.pending(references.TargetNotes)
+    pending.details.update(options)
+    state_machine.document.note_pending(pending)
+    nodelist = [pending]
+    return nodelist
+
+target_notes.options = {'class': directives.class_option}
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/directives/admonitions.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/directives/admonitions.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/directives/admonitions.py (revision 3)
@@ -0,0 +1,90 @@
+# Author: David Goodger
+# Contact: goodger@users.sourceforge.net
+# Revision: $Revision: 3155 $
+# Date: $Date: 2005-04-02 23:57:06 +0200 (Sat, 02 Apr 2005) $
+# Copyright: This module has been placed in the public domain.
+
+"""
+Admonition directives.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+from docutils.parsers.rst import states, directives
+from docutils import nodes
+
+
+def make_admonition(node_class, name, arguments, options, content, lineno,
+                       content_offset, block_text, state, state_machine):
+    if not content:
+        error = state_machine.reporter.error(
+            'The "%s" admonition is empty; content required.' % (name),
+            nodes.literal_block(block_text, block_text), line=lineno)
+        return [error]
+    text = '\n'.join(content)
+    admonition_node = node_class(text)
+    if arguments:
+        title_text = arguments[0]
+        textnodes, messages = state.inline_text(title_text, lineno)
+        admonition_node += nodes.title(title_text, '', *textnodes)
+        admonition_node += messages
+        if options.has_key('class'):
+            classes = options['class']
+        else:
+            classes = ['admonition-' + nodes.make_id(title_text)]
+        admonition_node['classes'] += classes
+    state.nested_parse(content, content_offset, admonition_node)
+    return [admonition_node]
+
+def admonition(*args):
+    return make_admonition(nodes.admonition, *args)
+
+admonition.arguments = (1, 0, 1)
+admonition.options = {'class': directives.class_option}
+admonition.content = 1
+
+def attention(*args):
+    return make_admonition(nodes.attention, *args)
+
+attention.content = 1
+
+def caution(*args):
+    return make_admonition(nodes.caution, *args)
+
+caution.content = 1
+
+def danger(*args):
+    return make_admonition(nodes.danger, *args)
+
+danger.content = 1
+
+def error(*args):
+    return make_admonition(nodes.error, *args)
+
+error.content = 1
+
+def hint(*args):
+    return make_admonition(nodes.hint, *args)
+
+hint.content = 1
+
+def important(*args):
+    return make_admonition(nodes.important, *args)
+
+important.content = 1
+
+def note(*args):
+    return make_admonition(nodes.note, *args)
+
+note.content = 1
+
+def tip(*args):
+    return make_admonition(nodes.tip, *args)
+
+tip.content = 1
+
+def warning(*args):
+    return make_admonition(nodes.warning, *args)
+
+warning.content = 1
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/directives/html.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/directives/html.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/directives/html.py (revision 3)
@@ -0,0 +1,96 @@
+# Author: David Goodger
+# Contact: goodger@users.sourceforge.net
+# Revision: $Revision: 3038 $
+# Date: $Date: 2005-03-14 17:16:57 +0100 (Mon, 14 Mar 2005) $
+# Copyright: This module has been placed in the public domain.
+
+"""
+Directives for typically HTML-specific constructs.
+"""
+
+__docformat__ = 'reStructuredText'
+
+import sys
+from docutils import nodes, utils
+from docutils.parsers.rst import states
+from docutils.transforms import components
+
+
+def meta(name, arguments, options, content, lineno,
+         content_offset, block_text, state, state_machine):
+    node = nodes.Element()
+    if content:
+        new_line_offset, blank_finish = state.nested_list_parse(
+              content, content_offset, node, initial_state='MetaBody',
+              blank_finish=1, state_machine_kwargs=metaSMkwargs)
+        if (new_line_offset - content_offset) != len(content):
+            # incomplete parse of block?
+            error = state_machine.reporter.error(
+                'Invalid meta directive.',
+                nodes.literal_block(block_text, block_text), line=lineno)
+            node += error
+    else:
+        error = state_machine.reporter.error(
+            'Empty meta directive.',
+            nodes.literal_block(block_text, block_text), line=lineno)
+        node += error
+    return node.children
+
+meta.content = 1
+
+def imagemap(name, arguments, options, content, lineno,
+             content_offset, block_text, state, state_machine):
+    return []
+
+
+class MetaBody(states.SpecializedBody):
+
+    class meta(nodes.Special, nodes.PreBibliographic, nodes.Element):
+        """HTML-specific "meta" element."""
+        pass
+
+    def field_marker(self, match, context, next_state):
+        """Meta element."""
+        node, blank_finish = self.parsemeta(match)
+        self.parent += node
+        return [], next_state, []
+
+    def parsemeta(self, match):
+        name = self.parse_field_marker(match)
+        indented, indent, line_offset, blank_finish = \
+              self.state_machine.get_first_known_indented(match.end())
+        node = self.meta()
+        pending = nodes.pending(components.Filter,
+                                {'component': 'writer',
+                                 'format': 'html',
+                                 'nodes': [node]})
+        node['content'] = ' '.join(indented)
+        if not indented:
+            line = self.state_machine.line
+            msg = self.reporter.info(
+                  'No content for meta tag "%s".' % name,
+                  nodes.literal_block(line, line),
+                  line=self.state_machine.abs_line_number())
+            return msg, blank_finish
+        tokens = name.split()
+        try:
+            attname, val = utils.extract_name_value(tokens[0])[0]
+            node[attname.lower()] = val
+        except utils.NameValueError:
+            node['name'] = tokens[0]
+        for token in tokens[1:]:
+            try:
+                attname, val = utils.extract_name_value(token)[0]
+                node[attname.lower()] = val
+            except utils.NameValueError, detail:
+                line = self.state_machine.line
+                msg = self.reporter.error(
+                      'Error parsing meta tag attribute "%s": %s.'
+                      % (token, detail), nodes.literal_block(line, line),
+                      line=self.state_machine.abs_line_number())
+                return msg, blank_finish
+        self.document.note_pending(pending)
+        return pending, blank_finish
+
+
+metaSMkwargs = {'state_classes': (MetaBody,)}
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/directives/images.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/directives/images.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/directives/images.py (revision 3)
@@ -0,0 +1,152 @@
+# Author: David Goodger
+# Contact: goodger@users.sourceforge.net
+# Revision: $Revision: 4234 $
+# Date: $Date: 2005-12-29 02:14:21 +0100 (Thu, 29 Dec 2005) $
+# Copyright: This module has been placed in the public domain.
+
+"""
+Directives for figures and simple images.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import sys
+from docutils import nodes, utils
+from docutils.parsers.rst import directives, states
+from docutils.nodes import fully_normalize_name, whitespace_normalize_name
+from docutils.parsers.rst.roles import set_classes
+
+try:
+    import Image                        # PIL
+except ImportError:
+    Image = None
+
+align_h_values = ('left', 'center', 'right')
+align_v_values = ('top', 'middle', 'bottom')
+align_values = align_v_values + align_h_values
+
+def align(argument):
+    return directives.choice(argument, align_values)
+
+def image(name, arguments, options, content, lineno,
+          content_offset, block_text, state, state_machine):
+    if options.has_key('align'):
+        # check for align_v values only
+        if isinstance(state, states.SubstitutionDef):
+            if options['align'] not in align_v_values:
+                error = state_machine.reporter.error(
+                    'Error in "%s" directive: "%s" is not a valid value for '
+                    'the "align" option within a substitution definition.  '
+                    'Valid values for "align" are: "%s".'
+                    % (name, options['align'], '", "'.join(align_v_values)),
+                    nodes.literal_block(block_text, block_text), line=lineno)
+                return [error]
+        elif options['align'] not in align_h_values:
+            error = state_machine.reporter.error(
+                'Error in "%s" directive: "%s" is not a valid value for '
+                'the "align" option.  Valid values for "align" are: "%s".'
+                % (name, options['align'], '", "'.join(align_h_values)),
+                nodes.literal_block(block_text, block_text), line=lineno)
+            return [error]
+    messages = []
+    reference = directives.uri(arguments[0])
+    options['uri'] = reference
+    reference_node = None
+    if options.has_key('target'):
+        block = states.escape2null(options['target']).splitlines()
+        block = [line for line in block]
+        target_type, data = state.parse_target(block, block_text, lineno)
+        if target_type == 'refuri':
+            reference_node = nodes.reference(refuri=data)
+        elif target_type == 'refname':
+            reference_node = nodes.reference(
+                refname=fully_normalize_name(data),
+                name=whitespace_normalize_name(data))
+            reference_node.indirect_reference_name = data
+            state.document.note_refname(reference_node)
+        else:                           # malformed target
+            messages.append(data)       # data is a system message
+        del options['target']
+    set_classes(options)
+    image_node = nodes.image(block_text, **options)
+    if reference_node:
+        reference_node += image_node
+        return messages + [reference_node]
+    else:
+        return messages + [image_node]
+
+image.arguments = (1, 0, 1)
+image.options = {'alt': directives.unchanged,
+                 'height': directives.length_or_unitless,
+                 'width': directives.length_or_percentage_or_unitless,
+                 'scale': directives.nonnegative_int,
+                 'align': align,
+                 'target': directives.unchanged_required,
+                 'class': directives.class_option}
+
+def figure_align(argument):
+    return directives.choice(argument, align_h_values)
+
+def figure(name, arguments, options, content, lineno,
+           content_offset, block_text, state, state_machine):
+    figwidth = options.get('figwidth')
+    if figwidth:
+        del options['figwidth']
+    figclasses = options.get('figclass')
+    if figclasses:
+        del options['figclass']
+    align = options.get('align')
+    if align:
+        del options['align']
+    (image_node,) = image(name, arguments, options, content, lineno,
+                         content_offset, block_text, state, state_machine)
+    if isinstance(image_node, nodes.system_message):
+        return [image_node]
+    figure_node = nodes.figure('', image_node)
+    if figwidth == 'image':
+        if Image and state.document.settings.file_insertion_enabled:
+            # PIL doesn't like Unicode paths:
+            try:
+                i = Image.open(str(image_node['uri']))
+            except (IOError, UnicodeError):
+                pass
+            else:
+                state.document.settings.record_dependencies.add(image_node['uri'])
+                figure_node['width'] = i.size[0]
+    elif figwidth is not None:
+        figure_node['width'] = figwidth
+    if figclasses:
+        figure_node['classes'] += figclasses
+    if align:
+        figure_node['align'] = align
+    if content:
+        node = nodes.Element()          # anonymous container for parsing
+        state.nested_parse(content, content_offset, node)
+        first_node = node[0]
+        if isinstance(first_node, nodes.paragraph):
+            caption = nodes.caption(first_node.rawsource, '',
+                                    *first_node.children)
+            figure_node += caption
+        elif not (isinstance(first_node, nodes.comment)
+                  and len(first_node) == 0):
+            error = state_machine.reporter.error(
+                  'Figure caption must be a paragraph or empty comment.',
+                  nodes.literal_block(block_text, block_text), line=lineno)
+            return [figure_node, error]
+        if len(node) > 1:
+            figure_node += nodes.legend('', *node[1:])
+    return [figure_node]
+
+def figwidth_value(argument):
+    if argument.lower() == 'image':
+        return 'image'
+    else:
+        return directives.nonnegative_int(argument)
+
+figure.arguments = (1, 0, 1)
+figure.options = {'figwidth': figwidth_value,
+                  'figclass': directives.class_option}
+figure.options.update(image.options)
+figure.options['align'] = figure_align
+figure.content = 1
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isopub.txt
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isopub.txt (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isopub.txt (revision 3)
@@ -0,0 +1,90 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |blank|  unicode:: U+02423 .. OPEN BOX
+.. |blk12|  unicode:: U+02592 .. MEDIUM SHADE
+.. |blk14|  unicode:: U+02591 .. LIGHT SHADE
+.. |blk34|  unicode:: U+02593 .. DARK SHADE
+.. |block|  unicode:: U+02588 .. FULL BLOCK
+.. |bull|   unicode:: U+02022 .. BULLET
+.. |caret|  unicode:: U+02041 .. CARET INSERTION POINT
+.. |check|  unicode:: U+02713 .. CHECK MARK
+.. |cir|    unicode:: U+025CB .. WHITE CIRCLE
+.. |clubs|  unicode:: U+02663 .. BLACK CLUB SUIT
+.. |copysr| unicode:: U+02117 .. SOUND RECORDING COPYRIGHT
+.. |cross|  unicode:: U+02717 .. BALLOT X
+.. |Dagger| unicode:: U+02021 .. DOUBLE DAGGER
+.. |dagger| unicode:: U+02020 .. DAGGER
+.. |dash|   unicode:: U+02010 .. HYPHEN
+.. |diams|  unicode:: U+02666 .. BLACK DIAMOND SUIT
+.. |dlcrop| unicode:: U+0230D .. BOTTOM LEFT CROP
+.. |drcrop| unicode:: U+0230C .. BOTTOM RIGHT CROP
+.. |dtri|   unicode:: U+025BF .. WHITE DOWN-POINTING SMALL TRIANGLE
+.. |dtrif|  unicode:: U+025BE .. BLACK DOWN-POINTING SMALL TRIANGLE
+.. |emsp|   unicode:: U+02003 .. EM SPACE
+.. |emsp13| unicode:: U+02004 .. THREE-PER-EM SPACE
+.. |emsp14| unicode:: U+02005 .. FOUR-PER-EM SPACE
+.. |ensp|   unicode:: U+02002 .. EN SPACE
+.. |female| unicode:: U+02640 .. FEMALE SIGN
+.. |ffilig| unicode:: U+0FB03 .. LATIN SMALL LIGATURE FFI
+.. |fflig|  unicode:: U+0FB00 .. LATIN SMALL LIGATURE FF
+.. |ffllig| unicode:: U+0FB04 .. LATIN SMALL LIGATURE FFL
+.. |filig|  unicode:: U+0FB01 .. LATIN SMALL LIGATURE FI
+.. |flat|   unicode:: U+0266D .. MUSIC FLAT SIGN
+.. |fllig|  unicode:: U+0FB02 .. LATIN SMALL LIGATURE FL
+.. |frac13| unicode:: U+02153 .. VULGAR FRACTION ONE THIRD
+.. |frac15| unicode:: U+02155 .. VULGAR FRACTION ONE FIFTH
+.. |frac16| unicode:: U+02159 .. VULGAR FRACTION ONE SIXTH
+.. |frac23| unicode:: U+02154 .. VULGAR FRACTION TWO THIRDS
+.. |frac25| unicode:: U+02156 .. VULGAR FRACTION TWO FIFTHS
+.. |frac35| unicode:: U+02157 .. VULGAR FRACTION THREE FIFTHS
+.. |frac45| unicode:: U+02158 .. VULGAR FRACTION FOUR FIFTHS
+.. |frac56| unicode:: U+0215A .. VULGAR FRACTION FIVE SIXTHS
+.. |hairsp| unicode:: U+0200A .. HAIR SPACE
+.. |hearts| unicode:: U+02665 .. BLACK HEART SUIT
+.. |hellip| unicode:: U+02026 .. HORIZONTAL ELLIPSIS
+.. |hybull| unicode:: U+02043 .. HYPHEN BULLET
+.. |incare| unicode:: U+02105 .. CARE OF
+.. |ldquor| unicode:: U+0201E .. DOUBLE LOW-9 QUOTATION MARK
+.. |lhblk|  unicode:: U+02584 .. LOWER HALF BLOCK
+.. |loz|    unicode:: U+025CA .. LOZENGE
+.. |lozf|   unicode:: U+029EB .. BLACK LOZENGE
+.. |lsquor| unicode:: U+0201A .. SINGLE LOW-9 QUOTATION MARK
+.. |ltri|   unicode:: U+025C3 .. WHITE LEFT-POINTING SMALL TRIANGLE
+.. |ltrif|  unicode:: U+025C2 .. BLACK LEFT-POINTING SMALL TRIANGLE
+.. |male|   unicode:: U+02642 .. MALE SIGN
+.. |malt|   unicode:: U+02720 .. MALTESE CROSS
+.. |marker| unicode:: U+025AE .. BLACK VERTICAL RECTANGLE
+.. |mdash|  unicode:: U+02014 .. EM DASH
+.. |mldr|   unicode:: U+02026 .. HORIZONTAL ELLIPSIS
+.. |natur|  unicode:: U+0266E .. MUSIC NATURAL SIGN
+.. |ndash|  unicode:: U+02013 .. EN DASH
+.. |nldr|   unicode:: U+02025 .. TWO DOT LEADER
+.. |numsp|  unicode:: U+02007 .. FIGURE SPACE
+.. |phone|  unicode:: U+0260E .. BLACK TELEPHONE
+.. |puncsp| unicode:: U+02008 .. PUNCTUATION SPACE
+.. |rdquor| unicode:: U+0201D .. RIGHT DOUBLE QUOTATION MARK
+.. |rect|   unicode:: U+025AD .. WHITE RECTANGLE
+.. |rsquor| unicode:: U+02019 .. RIGHT SINGLE QUOTATION MARK
+.. |rtri|   unicode:: U+025B9 .. WHITE RIGHT-POINTING SMALL TRIANGLE
+.. |rtrif|  unicode:: U+025B8 .. BLACK RIGHT-POINTING SMALL TRIANGLE
+.. |rx|     unicode:: U+0211E .. PRESCRIPTION TAKE
+.. |sext|   unicode:: U+02736 .. SIX POINTED BLACK STAR
+.. |sharp|  unicode:: U+0266F .. MUSIC SHARP SIGN
+.. |spades| unicode:: U+02660 .. BLACK SPADE SUIT
+.. |squ|    unicode:: U+025A1 .. WHITE SQUARE
+.. |squf|   unicode:: U+025AA .. BLACK SMALL SQUARE
+.. |star|   unicode:: U+02606 .. WHITE STAR
+.. |starf|  unicode:: U+02605 .. BLACK STAR
+.. |target| unicode:: U+02316 .. POSITION INDICATOR
+.. |telrec| unicode:: U+02315 .. TELEPHONE RECORDER
+.. |thinsp| unicode:: U+02009 .. THIN SPACE
+.. |uhblk|  unicode:: U+02580 .. UPPER HALF BLOCK
+.. |ulcrop| unicode:: U+0230F .. TOP LEFT CROP
+.. |urcrop| unicode:: U+0230E .. TOP RIGHT CROP
+.. |utri|   unicode:: U+025B5 .. WHITE UP-POINTING SMALL TRIANGLE
+.. |utrif|  unicode:: U+025B4 .. BLACK UP-POINTING SMALL TRIANGLE
+.. |vellip| unicode:: U+022EE .. VERTICAL ELLIPSIS
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isobox.txt
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isobox.txt (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isobox.txt (revision 3)
@@ -0,0 +1,46 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |boxDL| unicode:: U+02557 .. BOX DRAWINGS DOUBLE DOWN AND LEFT
+.. |boxDl| unicode:: U+02556 .. BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
+.. |boxdL| unicode:: U+02555 .. BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
+.. |boxdl| unicode:: U+02510 .. BOX DRAWINGS LIGHT DOWN AND LEFT
+.. |boxDR| unicode:: U+02554 .. BOX DRAWINGS DOUBLE DOWN AND RIGHT
+.. |boxDr| unicode:: U+02553 .. BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
+.. |boxdR| unicode:: U+02552 .. BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
+.. |boxdr| unicode:: U+0250C .. BOX DRAWINGS LIGHT DOWN AND RIGHT
+.. |boxH|  unicode:: U+02550 .. BOX DRAWINGS DOUBLE HORIZONTAL
+.. |boxh|  unicode:: U+02500 .. BOX DRAWINGS LIGHT HORIZONTAL
+.. |boxHD| unicode:: U+02566 .. BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+.. |boxHd| unicode:: U+02564 .. BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
+.. |boxhD| unicode:: U+02565 .. BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
+.. |boxhd| unicode:: U+0252C .. BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+.. |boxHU| unicode:: U+02569 .. BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+.. |boxHu| unicode:: U+02567 .. BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
+.. |boxhU| unicode:: U+02568 .. BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
+.. |boxhu| unicode:: U+02534 .. BOX DRAWINGS LIGHT UP AND HORIZONTAL
+.. |boxUL| unicode:: U+0255D .. BOX DRAWINGS DOUBLE UP AND LEFT
+.. |boxUl| unicode:: U+0255C .. BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
+.. |boxuL| unicode:: U+0255B .. BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
+.. |boxul| unicode:: U+02518 .. BOX DRAWINGS LIGHT UP AND LEFT
+.. |boxUR| unicode:: U+0255A .. BOX DRAWINGS DOUBLE UP AND RIGHT
+.. |boxUr| unicode:: U+02559 .. BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
+.. |boxuR| unicode:: U+02558 .. BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
+.. |boxur| unicode:: U+02514 .. BOX DRAWINGS LIGHT UP AND RIGHT
+.. |boxV|  unicode:: U+02551 .. BOX DRAWINGS DOUBLE VERTICAL
+.. |boxv|  unicode:: U+02502 .. BOX DRAWINGS LIGHT VERTICAL
+.. |boxVH| unicode:: U+0256C .. BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+.. |boxVh| unicode:: U+0256B .. BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
+.. |boxvH| unicode:: U+0256A .. BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
+.. |boxvh| unicode:: U+0253C .. BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+.. |boxVL| unicode:: U+02563 .. BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+.. |boxVl| unicode:: U+02562 .. BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
+.. |boxvL| unicode:: U+02561 .. BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
+.. |boxvl| unicode:: U+02524 .. BOX DRAWINGS LIGHT VERTICAL AND LEFT
+.. |boxVR| unicode:: U+02560 .. BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+.. |boxVr| unicode:: U+0255F .. BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
+.. |boxvR| unicode:: U+0255E .. BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
+.. |boxvr| unicode:: U+0251C .. BOX DRAWINGS LIGHT VERTICAL AND RIGHT
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isogrk4-wide.txt
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isogrk4-wide.txt (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isogrk4-wide.txt (revision 3)
@@ -0,0 +1,49 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |b.alpha|  unicode:: U+1D6C2 .. MATHEMATICAL BOLD SMALL ALPHA
+.. |b.beta|   unicode:: U+1D6C3 .. MATHEMATICAL BOLD SMALL BETA
+.. |b.chi|    unicode:: U+1D6D8 .. MATHEMATICAL BOLD SMALL CHI
+.. |b.Delta|  unicode:: U+1D6AB .. MATHEMATICAL BOLD CAPITAL DELTA
+.. |b.delta|  unicode:: U+1D6C5 .. MATHEMATICAL BOLD SMALL DELTA
+.. |b.epsi|   unicode:: U+1D6C6 .. MATHEMATICAL BOLD SMALL EPSILON
+.. |b.epsiv|  unicode:: U+1D6DC .. MATHEMATICAL BOLD EPSILON SYMBOL
+.. |b.eta|    unicode:: U+1D6C8 .. MATHEMATICAL BOLD SMALL ETA
+.. |b.Gamma|  unicode:: U+1D6AA .. MATHEMATICAL BOLD CAPITAL GAMMA
+.. |b.gamma|  unicode:: U+1D6C4 .. MATHEMATICAL BOLD SMALL GAMMA
+.. |b.Gammad| unicode:: U+003DC .. GREEK LETTER DIGAMMA
+.. |b.gammad| unicode:: U+003DD .. GREEK SMALL LETTER DIGAMMA
+.. |b.iota|   unicode:: U+1D6CA .. MATHEMATICAL BOLD SMALL IOTA
+.. |b.kappa|  unicode:: U+1D6CB .. MATHEMATICAL BOLD SMALL KAPPA
+.. |b.kappav| unicode:: U+1D6DE .. MATHEMATICAL BOLD KAPPA SYMBOL
+.. |b.Lambda| unicode:: U+1D6B2 .. MATHEMATICAL BOLD CAPITAL LAMDA
+.. |b.lambda| unicode:: U+1D6CC .. MATHEMATICAL BOLD SMALL LAMDA
+.. |b.mu|     unicode:: U+1D6CD .. MATHEMATICAL BOLD SMALL MU
+.. |b.nu|     unicode:: U+1D6CE .. MATHEMATICAL BOLD SMALL NU
+.. |b.Omega|  unicode:: U+1D6C0 .. MATHEMATICAL BOLD CAPITAL OMEGA
+.. |b.omega|  unicode:: U+1D6DA .. MATHEMATICAL BOLD SMALL OMEGA
+.. |b.Phi|    unicode:: U+1D6BD .. MATHEMATICAL BOLD CAPITAL PHI
+.. |b.phi|    unicode:: U+1D6D7 .. MATHEMATICAL BOLD SMALL PHI
+.. |b.phiv|   unicode:: U+1D6DF .. MATHEMATICAL BOLD PHI SYMBOL
+.. |b.Pi|     unicode:: U+1D6B7 .. MATHEMATICAL BOLD CAPITAL PI
+.. |b.pi|     unicode:: U+1D6D1 .. MATHEMATICAL BOLD SMALL PI
+.. |b.piv|    unicode:: U+1D6E1 .. MATHEMATICAL BOLD PI SYMBOL
+.. |b.Psi|    unicode:: U+1D6BF .. MATHEMATICAL BOLD CAPITAL PSI
+.. |b.psi|    unicode:: U+1D6D9 .. MATHEMATICAL BOLD SMALL PSI
+.. |b.rho|    unicode:: U+1D6D2 .. MATHEMATICAL BOLD SMALL RHO
+.. |b.rhov|   unicode:: U+1D6E0 .. MATHEMATICAL BOLD RHO SYMBOL
+.. |b.Sigma|  unicode:: U+1D6BA .. MATHEMATICAL BOLD CAPITAL SIGMA
+.. |b.sigma|  unicode:: U+1D6D4 .. MATHEMATICAL BOLD SMALL SIGMA
+.. |b.sigmav| unicode:: U+1D6D3 .. MATHEMATICAL BOLD SMALL FINAL SIGMA
+.. |b.tau|    unicode:: U+1D6D5 .. MATHEMATICAL BOLD SMALL TAU
+.. |b.Theta|  unicode:: U+1D6AF .. MATHEMATICAL BOLD CAPITAL THETA
+.. |b.thetas| unicode:: U+1D6C9 .. MATHEMATICAL BOLD SMALL THETA
+.. |b.thetav| unicode:: U+1D6DD .. MATHEMATICAL BOLD THETA SYMBOL
+.. |b.Upsi|   unicode:: U+1D6BC .. MATHEMATICAL BOLD CAPITAL UPSILON
+.. |b.upsi|   unicode:: U+1D6D6 .. MATHEMATICAL BOLD SMALL UPSILON
+.. |b.Xi|     unicode:: U+1D6B5 .. MATHEMATICAL BOLD CAPITAL XI
+.. |b.xi|     unicode:: U+1D6CF .. MATHEMATICAL BOLD SMALL XI
+.. |b.zeta|   unicode:: U+1D6C7 .. MATHEMATICAL BOLD SMALL ZETA
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isonum.txt
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isonum.txt (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isonum.txt (revision 3)
@@ -0,0 +1,82 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |amp|    unicode:: U+00026 .. AMPERSAND
+.. |apos|   unicode:: U+00027 .. APOSTROPHE
+.. |ast|    unicode:: U+0002A .. ASTERISK
+.. |brvbar| unicode:: U+000A6 .. BROKEN BAR
+.. |bsol|   unicode:: U+0005C .. REVERSE SOLIDUS
+.. |cent|   unicode:: U+000A2 .. CENT SIGN
+.. |colon|  unicode:: U+0003A .. COLON
+.. |comma|  unicode:: U+0002C .. COMMA
+.. |commat| unicode:: U+00040 .. COMMERCIAL AT
+.. |copy|   unicode:: U+000A9 .. COPYRIGHT SIGN
+.. |curren| unicode:: U+000A4 .. CURRENCY SIGN
+.. |darr|   unicode:: U+02193 .. DOWNWARDS ARROW
+.. |deg|    unicode:: U+000B0 .. DEGREE SIGN
+.. |divide| unicode:: U+000F7 .. DIVISION SIGN
+.. |dollar| unicode:: U+00024 .. DOLLAR SIGN
+.. |equals| unicode:: U+0003D .. EQUALS SIGN
+.. |excl|   unicode:: U+00021 .. EXCLAMATION MARK
+.. |frac12| unicode:: U+000BD .. VULGAR FRACTION ONE HALF
+.. |frac14| unicode:: U+000BC .. VULGAR FRACTION ONE QUARTER
+.. |frac18| unicode:: U+0215B .. VULGAR FRACTION ONE EIGHTH
+.. |frac34| unicode:: U+000BE .. VULGAR FRACTION THREE QUARTERS
+.. |frac38| unicode:: U+0215C .. VULGAR FRACTION THREE EIGHTHS
+.. |frac58| unicode:: U+0215D .. VULGAR FRACTION FIVE EIGHTHS
+.. |frac78| unicode:: U+0215E .. VULGAR FRACTION SEVEN EIGHTHS
+.. |gt|     unicode:: U+0003E .. GREATER-THAN SIGN
+.. |half|   unicode:: U+000BD .. VULGAR FRACTION ONE HALF
+.. |horbar| unicode:: U+02015 .. HORIZONTAL BAR
+.. |hyphen| unicode:: U+02010 .. HYPHEN
+.. |iexcl|  unicode:: U+000A1 .. INVERTED EXCLAMATION MARK
+.. |iquest| unicode:: U+000BF .. INVERTED QUESTION MARK
+.. |laquo|  unicode:: U+000AB .. LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+.. |larr|   unicode:: U+02190 .. LEFTWARDS ARROW
+.. |lcub|   unicode:: U+0007B .. LEFT CURLY BRACKET
+.. |ldquo|  unicode:: U+0201C .. LEFT DOUBLE QUOTATION MARK
+.. |lowbar| unicode:: U+0005F .. LOW LINE
+.. |lpar|   unicode:: U+00028 .. LEFT PARENTHESIS
+.. |lsqb|   unicode:: U+0005B .. LEFT SQUARE BRACKET
+.. |lsquo|  unicode:: U+02018 .. LEFT SINGLE QUOTATION MARK
+.. |lt|     unicode:: U+0003C .. LESS-THAN SIGN
+.. |micro|  unicode:: U+000B5 .. MICRO SIGN
+.. |middot| unicode:: U+000B7 .. MIDDLE DOT
+.. |nbsp|   unicode:: U+000A0 .. NO-BREAK SPACE
+.. |not|    unicode:: U+000AC .. NOT SIGN
+.. |num|    unicode:: U+00023 .. NUMBER SIGN
+.. |ohm|    unicode:: U+02126 .. OHM SIGN
+.. |ordf|   unicode:: U+000AA .. FEMININE ORDINAL INDICATOR
+.. |ordm|   unicode:: U+000BA .. MASCULINE ORDINAL INDICATOR
+.. |para|   unicode:: U+000B6 .. PILCROW SIGN
+.. |percnt| unicode:: U+00025 .. PERCENT SIGN
+.. |period| unicode:: U+0002E .. FULL STOP
+.. |plus|   unicode:: U+0002B .. PLUS SIGN
+.. |plusmn| unicode:: U+000B1 .. PLUS-MINUS SIGN
+.. |pound|  unicode:: U+000A3 .. POUND SIGN
+.. |quest|  unicode:: U+0003F .. QUESTION MARK
+.. |quot|   unicode:: U+00022 .. QUOTATION MARK
+.. |raquo|  unicode:: U+000BB .. RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+.. |rarr|   unicode:: U+02192 .. RIGHTWARDS ARROW
+.. |rcub|   unicode:: U+0007D .. RIGHT CURLY BRACKET
+.. |rdquo|  unicode:: U+0201D .. RIGHT DOUBLE QUOTATION MARK
+.. |reg|    unicode:: U+000AE .. REGISTERED SIGN
+.. |rpar|   unicode:: U+00029 .. RIGHT PARENTHESIS
+.. |rsqb|   unicode:: U+0005D .. RIGHT SQUARE BRACKET
+.. |rsquo|  unicode:: U+02019 .. RIGHT SINGLE QUOTATION MARK
+.. |sect|   unicode:: U+000A7 .. SECTION SIGN
+.. |semi|   unicode:: U+0003B .. SEMICOLON
+.. |shy|    unicode:: U+000AD .. SOFT HYPHEN
+.. |sol|    unicode:: U+0002F .. SOLIDUS
+.. |sung|   unicode:: U+0266A .. EIGHTH NOTE
+.. |sup1|   unicode:: U+000B9 .. SUPERSCRIPT ONE
+.. |sup2|   unicode:: U+000B2 .. SUPERSCRIPT TWO
+.. |sup3|   unicode:: U+000B3 .. SUPERSCRIPT THREE
+.. |times|  unicode:: U+000D7 .. MULTIPLICATION SIGN
+.. |trade|  unicode:: U+02122 .. TRADE MARK SIGN
+.. |uarr|   unicode:: U+02191 .. UPWARDS ARROW
+.. |verbar| unicode:: U+0007C .. VERTICAL LINE
+.. |yen|    unicode:: U+000A5 .. YEN SIGN
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isomfrk.txt
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isomfrk.txt (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isomfrk.txt (revision 3)
@@ -0,0 +1,11 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |Cfr| unicode:: U+0212D .. BLACK-LETTER CAPITAL C
+.. |Hfr| unicode:: U+0210C .. BLACK-LETTER CAPITAL H
+.. |Ifr| unicode:: U+02111 .. BLACK-LETTER CAPITAL I
+.. |Rfr| unicode:: U+0211C .. BLACK-LETTER CAPITAL R
+.. |Zfr| unicode:: U+02128 .. BLACK-LETTER CAPITAL Z
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/xhtml1-lat1.txt
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/xhtml1-lat1.txt (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/xhtml1-lat1.txt (revision 3)
@@ -0,0 +1,102 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |Aacute| unicode:: U+000C1 .. LATIN CAPITAL LETTER A WITH ACUTE
+.. |aacute| unicode:: U+000E1 .. LATIN SMALL LETTER A WITH ACUTE
+.. |Acirc|  unicode:: U+000C2 .. LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+.. |acirc|  unicode:: U+000E2 .. LATIN SMALL LETTER A WITH CIRCUMFLEX
+.. |acute|  unicode:: U+000B4 .. ACUTE ACCENT
+.. |AElig|  unicode:: U+000C6 .. LATIN CAPITAL LETTER AE
+.. |aelig|  unicode:: U+000E6 .. LATIN SMALL LETTER AE
+.. |Agrave| unicode:: U+000C0 .. LATIN CAPITAL LETTER A WITH GRAVE
+.. |agrave| unicode:: U+000E0 .. LATIN SMALL LETTER A WITH GRAVE
+.. |Aring|  unicode:: U+000C5 .. LATIN CAPITAL LETTER A WITH RING ABOVE
+.. |aring|  unicode:: U+000E5 .. LATIN SMALL LETTER A WITH RING ABOVE
+.. |Atilde| unicode:: U+000C3 .. LATIN CAPITAL LETTER A WITH TILDE
+.. |atilde| unicode:: U+000E3 .. LATIN SMALL LETTER A WITH TILDE
+.. |Auml|   unicode:: U+000C4 .. LATIN CAPITAL LETTER A WITH DIAERESIS
+.. |auml|   unicode:: U+000E4 .. LATIN SMALL LETTER A WITH DIAERESIS
+.. |brvbar| unicode:: U+000A6 .. BROKEN BAR
+.. |Ccedil| unicode:: U+000C7 .. LATIN CAPITAL LETTER C WITH CEDILLA
+.. |ccedil| unicode:: U+000E7 .. LATIN SMALL LETTER C WITH CEDILLA
+.. |cedil|  unicode:: U+000B8 .. CEDILLA
+.. |cent|   unicode:: U+000A2 .. CENT SIGN
+.. |copy|   unicode:: U+000A9 .. COPYRIGHT SIGN
+.. |curren| unicode:: U+000A4 .. CURRENCY SIGN
+.. |deg|    unicode:: U+000B0 .. DEGREE SIGN
+.. |divide| unicode:: U+000F7 .. DIVISION SIGN
+.. |Eacute| unicode:: U+000C9 .. LATIN CAPITAL LETTER E WITH ACUTE
+.. |eacute| unicode:: U+000E9 .. LATIN SMALL LETTER E WITH ACUTE
+.. |Ecirc|  unicode:: U+000CA .. LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+.. |ecirc|  unicode:: U+000EA .. LATIN SMALL LETTER E WITH CIRCUMFLEX
+.. |Egrave| unicode:: U+000C8 .. LATIN CAPITAL LETTER E WITH GRAVE
+.. |egrave| unicode:: U+000E8 .. LATIN SMALL LETTER E WITH GRAVE
+.. |ETH|    unicode:: U+000D0 .. LATIN CAPITAL LETTER ETH
+.. |eth|    unicode:: U+000F0 .. LATIN SMALL LETTER ETH
+.. |Euml|   unicode:: U+000CB .. LATIN CAPITAL LETTER E WITH DIAERESIS
+.. |euml|   unicode:: U+000EB .. LATIN SMALL LETTER E WITH DIAERESIS
+.. |frac12| unicode:: U+000BD .. VULGAR FRACTION ONE HALF
+.. |frac14| unicode:: U+000BC .. VULGAR FRACTION ONE QUARTER
+.. |frac34| unicode:: U+000BE .. VULGAR FRACTION THREE QUARTERS
+.. |Iacute| unicode:: U+000CD .. LATIN CAPITAL LETTER I WITH ACUTE
+.. |iacute| unicode:: U+000ED .. LATIN SMALL LETTER I WITH ACUTE
+.. |Icirc|  unicode:: U+000CE .. LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+.. |icirc|  unicode:: U+000EE .. LATIN SMALL LETTER I WITH CIRCUMFLEX
+.. |iexcl|  unicode:: U+000A1 .. INVERTED EXCLAMATION MARK
+.. |Igrave| unicode:: U+000CC .. LATIN CAPITAL LETTER I WITH GRAVE
+.. |igrave| unicode:: U+000EC .. LATIN SMALL LETTER I WITH GRAVE
+.. |iquest| unicode:: U+000BF .. INVERTED QUESTION MARK
+.. |Iuml|   unicode:: U+000CF .. LATIN CAPITAL LETTER I WITH DIAERESIS
+.. |iuml|   unicode:: U+000EF .. LATIN SMALL LETTER I WITH DIAERESIS
+.. |laquo|  unicode:: U+000AB .. LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+.. |macr|   unicode:: U+000AF .. MACRON
+.. |micro|  unicode:: U+000B5 .. MICRO SIGN
+.. |middot| unicode:: U+000B7 .. MIDDLE DOT
+.. |nbsp|   unicode:: U+000A0 .. NO-BREAK SPACE
+.. |not|    unicode:: U+000AC .. NOT SIGN
+.. |Ntilde| unicode:: U+000D1 .. LATIN CAPITAL LETTER N WITH TILDE
+.. |ntilde| unicode:: U+000F1 .. LATIN SMALL LETTER N WITH TILDE
+.. |Oacute| unicode:: U+000D3 .. LATIN CAPITAL LETTER O WITH ACUTE
+.. |oacute| unicode:: U+000F3 .. LATIN SMALL LETTER O WITH ACUTE
+.. |Ocirc|  unicode:: U+000D4 .. LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+.. |ocirc|  unicode:: U+000F4 .. LATIN SMALL LETTER O WITH CIRCUMFLEX
+.. |Ograve| unicode:: U+000D2 .. LATIN CAPITAL LETTER O WITH GRAVE
+.. |ograve| unicode:: U+000F2 .. LATIN SMALL LETTER O WITH GRAVE
+.. |ordf|   unicode:: U+000AA .. FEMININE ORDINAL INDICATOR
+.. |ordm|   unicode:: U+000BA .. MASCULINE ORDINAL INDICATOR
+.. |Oslash| unicode:: U+000D8 .. LATIN CAPITAL LETTER O WITH STROKE
+.. |oslash| unicode:: U+000F8 .. LATIN SMALL LETTER O WITH STROKE
+.. |Otilde| unicode:: U+000D5 .. LATIN CAPITAL LETTER O WITH TILDE
+.. |otilde| unicode:: U+000F5 .. LATIN SMALL LETTER O WITH TILDE
+.. |Ouml|   unicode:: U+000D6 .. LATIN CAPITAL LETTER O WITH DIAERESIS
+.. |ouml|   unicode:: U+000F6 .. LATIN SMALL LETTER O WITH DIAERESIS
+.. |para|   unicode:: U+000B6 .. PILCROW SIGN
+.. |plusmn| unicode:: U+000B1 .. PLUS-MINUS SIGN
+.. |pound|  unicode:: U+000A3 .. POUND SIGN
+.. |raquo|  unicode:: U+000BB .. RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+.. |reg|    unicode:: U+000AE .. REGISTERED SIGN
+.. |sect|   unicode:: U+000A7 .. SECTION SIGN
+.. |shy|    unicode:: U+000AD .. SOFT HYPHEN
+.. |sup1|   unicode:: U+000B9 .. SUPERSCRIPT ONE
+.. |sup2|   unicode:: U+000B2 .. SUPERSCRIPT TWO
+.. |sup3|   unicode:: U+000B3 .. SUPERSCRIPT THREE
+.. |szlig|  unicode:: U+000DF .. LATIN SMALL LETTER SHARP S
+.. |THORN|  unicode:: U+000DE .. LATIN CAPITAL LETTER THORN
+.. |thorn|  unicode:: U+000FE .. LATIN SMALL LETTER THORN
+.. |times|  unicode:: U+000D7 .. MULTIPLICATION SIGN
+.. |Uacute| unicode:: U+000DA .. LATIN CAPITAL LETTER U WITH ACUTE
+.. |uacute| unicode:: U+000FA .. LATIN SMALL LETTER U WITH ACUTE
+.. |Ucirc|  unicode:: U+000DB .. LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+.. |ucirc|  unicode:: U+000FB .. LATIN SMALL LETTER U WITH CIRCUMFLEX
+.. |Ugrave| unicode:: U+000D9 .. LATIN CAPITAL LETTER U WITH GRAVE
+.. |ugrave| unicode:: U+000F9 .. LATIN SMALL LETTER U WITH GRAVE
+.. |uml|    unicode:: U+000A8 .. DIAERESIS
+.. |Uuml|   unicode:: U+000DC .. LATIN CAPITAL LETTER U WITH DIAERESIS
+.. |uuml|   unicode:: U+000FC .. LATIN SMALL LETTER U WITH DIAERESIS
+.. |Yacute| unicode:: U+000DD .. LATIN CAPITAL LETTER Y WITH ACUTE
+.. |yacute| unicode:: U+000FD .. LATIN SMALL LETTER Y WITH ACUTE
+.. |yen|    unicode:: U+000A5 .. YEN SIGN
+.. |yuml|   unicode:: U+000FF .. LATIN SMALL LETTER Y WITH DIAERESIS
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isomopf.txt
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isomopf.txt (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isomopf.txt (revision 3)
@@ -0,0 +1,13 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |Copf| unicode:: U+02102 .. DOUBLE-STRUCK CAPITAL C
+.. |Hopf| unicode:: U+0210D .. DOUBLE-STRUCK CAPITAL H
+.. |Nopf| unicode:: U+02115 .. DOUBLE-STRUCK CAPITAL N
+.. |Popf| unicode:: U+02119 .. DOUBLE-STRUCK CAPITAL P
+.. |Qopf| unicode:: U+0211A .. DOUBLE-STRUCK CAPITAL Q
+.. |Ropf| unicode:: U+0211D .. DOUBLE-STRUCK CAPITAL R
+.. |Zopf| unicode:: U+02124 .. DOUBLE-STRUCK CAPITAL Z
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/mmlextra-wide.txt
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/mmlextra-wide.txt (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/mmlextra-wide.txt (revision 3)
@@ -0,0 +1,113 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |af|                      unicode:: U+02061 .. FUNCTION APPLICATION
+.. |aopf|                    unicode:: U+1D552 .. MATHEMATICAL DOUBLE-STRUCK SMALL A
+.. |asympeq|                 unicode:: U+0224D .. EQUIVALENT TO
+.. |bopf|                    unicode:: U+1D553 .. MATHEMATICAL DOUBLE-STRUCK SMALL B
+.. |copf|                    unicode:: U+1D554 .. MATHEMATICAL DOUBLE-STRUCK SMALL C
+.. |Cross|                   unicode:: U+02A2F .. VECTOR OR CROSS PRODUCT
+.. |DD|                      unicode:: U+02145 .. DOUBLE-STRUCK ITALIC CAPITAL D
+.. |dd|                      unicode:: U+02146 .. DOUBLE-STRUCK ITALIC SMALL D
+.. |dopf|                    unicode:: U+1D555 .. MATHEMATICAL DOUBLE-STRUCK SMALL D
+.. |DownArrowBar|            unicode:: U+02913 .. DOWNWARDS ARROW TO BAR
+.. |DownBreve|               unicode:: U+00311 .. COMBINING INVERTED BREVE
+.. |DownLeftRightVector|     unicode:: U+02950 .. LEFT BARB DOWN RIGHT BARB DOWN HARPOON
+.. |DownLeftTeeVector|       unicode:: U+0295E .. LEFTWARDS HARPOON WITH BARB DOWN FROM BAR
+.. |DownLeftVectorBar|       unicode:: U+02956 .. LEFTWARDS HARPOON WITH BARB DOWN TO BAR
+.. |DownRightTeeVector|      unicode:: U+0295F .. RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR
+.. |DownRightVectorBar|      unicode:: U+02957 .. RIGHTWARDS HARPOON WITH BARB DOWN TO BAR
+.. |ee|                      unicode:: U+02147 .. DOUBLE-STRUCK ITALIC SMALL E
+.. |EmptySmallSquare|        unicode:: U+025FB .. WHITE MEDIUM SQUARE
+.. |EmptyVerySmallSquare|    unicode:: U+025AB .. WHITE SMALL SQUARE
+.. |eopf|                    unicode:: U+1D556 .. MATHEMATICAL DOUBLE-STRUCK SMALL E
+.. |Equal|                   unicode:: U+02A75 .. TWO CONSECUTIVE EQUALS SIGNS
+.. |FilledSmallSquare|       unicode:: U+025FC .. BLACK MEDIUM SQUARE
+.. |FilledVerySmallSquare|   unicode:: U+025AA .. BLACK SMALL SQUARE
+.. |fopf|                    unicode:: U+1D557 .. MATHEMATICAL DOUBLE-STRUCK SMALL F
+.. |gopf|                    unicode:: U+1D558 .. MATHEMATICAL DOUBLE-STRUCK SMALL G
+.. |GreaterGreater|          unicode:: U+02AA2 .. DOUBLE NESTED GREATER-THAN
+.. |Hat|                     unicode:: U+0005E .. CIRCUMFLEX ACCENT
+.. |hopf|                    unicode:: U+1D559 .. MATHEMATICAL DOUBLE-STRUCK SMALL H
+.. |HorizontalLine|          unicode:: U+02500 .. BOX DRAWINGS LIGHT HORIZONTAL
+.. |ic|                      unicode:: U+02063 .. INVISIBLE SEPARATOR
+.. |ii|                      unicode:: U+02148 .. DOUBLE-STRUCK ITALIC SMALL I
+.. |iopf|                    unicode:: U+1D55A .. MATHEMATICAL DOUBLE-STRUCK SMALL I
+.. |it|                      unicode:: U+02062 .. INVISIBLE TIMES
+.. |jopf|                    unicode:: U+1D55B .. MATHEMATICAL DOUBLE-STRUCK SMALL J
+.. |kopf|                    unicode:: U+1D55C .. MATHEMATICAL DOUBLE-STRUCK SMALL K
+.. |larrb|                   unicode:: U+021E4 .. LEFTWARDS ARROW TO BAR
+.. |LeftDownTeeVector|       unicode:: U+02961 .. DOWNWARDS HARPOON WITH BARB LEFT FROM BAR
+.. |LeftDownVectorBar|       unicode:: U+02959 .. DOWNWARDS HARPOON WITH BARB LEFT TO BAR
+.. |LeftRightVector|         unicode:: U+0294E .. LEFT BARB UP RIGHT BARB UP HARPOON
+.. |LeftTeeVector|           unicode:: U+0295A .. LEFTWARDS HARPOON WITH BARB UP FROM BAR
+.. |LeftTriangleBar|         unicode:: U+029CF .. LEFT TRIANGLE BESIDE VERTICAL BAR
+.. |LeftUpDownVector|        unicode:: U+02951 .. UP BARB LEFT DOWN BARB LEFT HARPOON
+.. |LeftUpTeeVector|         unicode:: U+02960 .. UPWARDS HARPOON WITH BARB LEFT FROM BAR
+.. |LeftUpVectorBar|         unicode:: U+02958 .. UPWARDS HARPOON WITH BARB LEFT TO BAR
+.. |LeftVectorBar|           unicode:: U+02952 .. LEFTWARDS HARPOON WITH BARB UP TO BAR
+.. |LessLess|                unicode:: U+02AA1 .. DOUBLE NESTED LESS-THAN
+.. |lopf|                    unicode:: U+1D55D .. MATHEMATICAL DOUBLE-STRUCK SMALL L
+.. |mapstodown|              unicode:: U+021A7 .. DOWNWARDS ARROW FROM BAR
+.. |mapstoleft|              unicode:: U+021A4 .. LEFTWARDS ARROW FROM BAR
+.. |mapstoup|                unicode:: U+021A5 .. UPWARDS ARROW FROM BAR
+.. |MediumSpace|             unicode:: U+0205F .. MEDIUM MATHEMATICAL SPACE
+.. |mopf|                    unicode:: U+1D55E .. MATHEMATICAL DOUBLE-STRUCK SMALL M
+.. |nbump|                   unicode:: U+0224E U+00338 .. GEOMETRICALLY EQUIVALENT TO with slash
+.. |nbumpe|                  unicode:: U+0224F U+00338 .. DIFFERENCE BETWEEN with slash
+.. |nesim|                   unicode:: U+02242 U+00338 .. MINUS TILDE with slash
+.. |NewLine|                 unicode:: U+0000A .. LINE FEED (LF)
+.. |NoBreak|                 unicode:: U+02060 .. WORD JOINER
+.. |nopf|                    unicode:: U+1D55F .. MATHEMATICAL DOUBLE-STRUCK SMALL N
+.. |NotCupCap|               unicode:: U+0226D .. NOT EQUIVALENT TO
+.. |NotHumpEqual|            unicode:: U+0224F U+00338 .. DIFFERENCE BETWEEN with slash
+.. |NotLeftTriangleBar|      unicode:: U+029CF U+00338 .. LEFT TRIANGLE BESIDE VERTICAL BAR with slash
+.. |NotNestedGreaterGreater| unicode:: U+02AA2 U+00338 .. DOUBLE NESTED GREATER-THAN with slash
+.. |NotNestedLessLess|       unicode:: U+02AA1 U+00338 .. DOUBLE NESTED LESS-THAN with slash
+.. |NotRightTriangleBar|     unicode:: U+029D0 U+00338 .. VERTICAL BAR BESIDE RIGHT TRIANGLE with slash
+.. |NotSquareSubset|         unicode:: U+0228F U+00338 .. SQUARE IMAGE OF with slash
+.. |NotSquareSuperset|       unicode:: U+02290 U+00338 .. SQUARE ORIGINAL OF with slash
+.. |NotSucceedsTilde|        unicode:: U+0227F U+00338 .. SUCCEEDS OR EQUIVALENT TO with slash
+.. |oopf|                    unicode:: U+1D560 .. MATHEMATICAL DOUBLE-STRUCK SMALL O
+.. |OverBar|                 unicode:: U+000AF .. MACRON
+.. |OverBrace|               unicode:: U+0FE37 .. PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET
+.. |OverBracket|             unicode:: U+023B4 .. TOP SQUARE BRACKET
+.. |OverParenthesis|         unicode:: U+0FE35 .. PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS
+.. |planckh|                 unicode:: U+0210E .. PLANCK CONSTANT
+.. |popf|                    unicode:: U+1D561 .. MATHEMATICAL DOUBLE-STRUCK SMALL P
+.. |Product|                 unicode:: U+0220F .. N-ARY PRODUCT
+.. |qopf|                    unicode:: U+1D562 .. MATHEMATICAL DOUBLE-STRUCK SMALL Q
+.. |rarrb|                   unicode:: U+021E5 .. RIGHTWARDS ARROW TO BAR
+.. |RightDownTeeVector|      unicode:: U+0295D .. DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR
+.. |RightDownVectorBar|      unicode:: U+02955 .. DOWNWARDS HARPOON WITH BARB RIGHT TO BAR
+.. |RightTeeVector|          unicode:: U+0295B .. RIGHTWARDS HARPOON WITH BARB UP FROM BAR
+.. |RightTriangleBar|        unicode:: U+029D0 .. VERTICAL BAR BESIDE RIGHT TRIANGLE
+.. |RightUpDownVector|       unicode:: U+0294F .. UP BARB RIGHT DOWN BARB RIGHT HARPOON
+.. |RightUpTeeVector|        unicode:: U+0295C .. UPWARDS HARPOON WITH BARB RIGHT FROM BAR
+.. |RightUpVectorBar|        unicode:: U+02954 .. UPWARDS HARPOON WITH BARB RIGHT TO BAR
+.. |RightVectorBar|          unicode:: U+02953 .. RIGHTWARDS HARPOON WITH BARB UP TO BAR
+.. |ropf|                    unicode:: U+1D563 .. MATHEMATICAL DOUBLE-STRUCK SMALL R
+.. |RoundImplies|            unicode:: U+02970 .. RIGHT DOUBLE ARROW WITH ROUNDED HEAD
+.. |RuleDelayed|             unicode:: U+029F4 .. RULE-DELAYED
+.. |sopf|                    unicode:: U+1D564 .. MATHEMATICAL DOUBLE-STRUCK SMALL S
+.. |Tab|                     unicode:: U+00009 .. CHARACTER TABULATION
+.. |ThickSpace|              unicode:: U+02009 U+0200A U+0200A .. space of width 5/18 em
+.. |topf|                    unicode:: U+1D565 .. MATHEMATICAL DOUBLE-STRUCK SMALL T
+.. |UnderBar|                unicode:: U+00332 .. COMBINING LOW LINE
+.. |UnderBrace|              unicode:: U+0FE38 .. PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET
+.. |UnderBracket|            unicode:: U+023B5 .. BOTTOM SQUARE BRACKET
+.. |UnderParenthesis|        unicode:: U+0FE36 .. PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS
+.. |uopf|                    unicode:: U+1D566 .. MATHEMATICAL DOUBLE-STRUCK SMALL U
+.. |UpArrowBar|              unicode:: U+02912 .. UPWARDS ARROW TO BAR
+.. |Upsilon|                 unicode:: U+003A5 .. GREEK CAPITAL LETTER UPSILON
+.. |VerticalLine|            unicode:: U+0007C .. VERTICAL LINE
+.. |VerticalSeparator|       unicode:: U+02758 .. LIGHT VERTICAL BAR
+.. |vopf|                    unicode:: U+1D567 .. MATHEMATICAL DOUBLE-STRUCK SMALL V
+.. |wopf|                    unicode:: U+1D568 .. MATHEMATICAL DOUBLE-STRUCK SMALL W
+.. |xopf|                    unicode:: U+1D569 .. MATHEMATICAL DOUBLE-STRUCK SMALL X
+.. |yopf|                    unicode:: U+1D56A .. MATHEMATICAL DOUBLE-STRUCK SMALL Y
+.. |ZeroWidthSpace|          unicode:: U+0200B .. ZERO WIDTH SPACE
+.. |zopf|                    unicode:: U+1D56B .. MATHEMATICAL DOUBLE-STRUCK SMALL Z
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/xhtml1-symbol.txt
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/xhtml1-symbol.txt (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/xhtml1-symbol.txt (revision 3)
@@ -0,0 +1,130 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |alefsym|  unicode:: U+02135 .. ALEF SYMBOL
+.. |Alpha|    unicode:: U+00391 .. GREEK CAPITAL LETTER ALPHA
+.. |alpha|    unicode:: U+003B1 .. GREEK SMALL LETTER ALPHA
+.. |and|      unicode:: U+02227 .. LOGICAL AND
+.. |ang|      unicode:: U+02220 .. ANGLE
+.. |asymp|    unicode:: U+02248 .. ALMOST EQUAL TO
+.. |Beta|     unicode:: U+00392 .. GREEK CAPITAL LETTER BETA
+.. |beta|     unicode:: U+003B2 .. GREEK SMALL LETTER BETA
+.. |bull|     unicode:: U+02022 .. BULLET
+.. |cap|      unicode:: U+02229 .. INTERSECTION
+.. |Chi|      unicode:: U+003A7 .. GREEK CAPITAL LETTER CHI
+.. |chi|      unicode:: U+003C7 .. GREEK SMALL LETTER CHI
+.. |clubs|    unicode:: U+02663 .. BLACK CLUB SUIT
+.. |cong|     unicode:: U+02245 .. APPROXIMATELY EQUAL TO
+.. |crarr|    unicode:: U+021B5 .. DOWNWARDS ARROW WITH CORNER LEFTWARDS
+.. |cup|      unicode:: U+0222A .. UNION
+.. |dArr|     unicode:: U+021D3 .. DOWNWARDS DOUBLE ARROW
+.. |darr|     unicode:: U+02193 .. DOWNWARDS ARROW
+.. |Delta|    unicode:: U+00394 .. GREEK CAPITAL LETTER DELTA
+.. |delta|    unicode:: U+003B4 .. GREEK SMALL LETTER DELTA
+.. |diams|    unicode:: U+02666 .. BLACK DIAMOND SUIT
+.. |empty|    unicode:: U+02205 .. EMPTY SET
+.. |Epsilon|  unicode:: U+00395 .. GREEK CAPITAL LETTER EPSILON
+.. |epsilon|  unicode:: U+003B5 .. GREEK SMALL LETTER EPSILON
+.. |equiv|    unicode:: U+02261 .. IDENTICAL TO
+.. |Eta|      unicode:: U+00397 .. GREEK CAPITAL LETTER ETA
+.. |eta|      unicode:: U+003B7 .. GREEK SMALL LETTER ETA
+.. |exist|    unicode:: U+02203 .. THERE EXISTS
+.. |fnof|     unicode:: U+00192 .. LATIN SMALL LETTER F WITH HOOK
+.. |forall|   unicode:: U+02200 .. FOR ALL
+.. |frasl|    unicode:: U+02044 .. FRACTION SLASH
+.. |Gamma|    unicode:: U+00393 .. GREEK CAPITAL LETTER GAMMA
+.. |gamma|    unicode:: U+003B3 .. GREEK SMALL LETTER GAMMA
+.. |ge|       unicode:: U+02265 .. GREATER-THAN OR EQUAL TO
+.. |hArr|     unicode:: U+021D4 .. LEFT RIGHT DOUBLE ARROW
+.. |harr|     unicode:: U+02194 .. LEFT RIGHT ARROW
+.. |hearts|   unicode:: U+02665 .. BLACK HEART SUIT
+.. |hellip|   unicode:: U+02026 .. HORIZONTAL ELLIPSIS
+.. |image|    unicode:: U+02111 .. BLACK-LETTER CAPITAL I
+.. |infin|    unicode:: U+0221E .. INFINITY
+.. |int|      unicode:: U+0222B .. INTEGRAL
+.. |Iota|     unicode:: U+00399 .. GREEK CAPITAL LETTER IOTA
+.. |iota|     unicode:: U+003B9 .. GREEK SMALL LETTER IOTA
+.. |isin|     unicode:: U+02208 .. ELEMENT OF
+.. |Kappa|    unicode:: U+0039A .. GREEK CAPITAL LETTER KAPPA
+.. |kappa|    unicode:: U+003BA .. GREEK SMALL LETTER KAPPA
+.. |Lambda|   unicode:: U+0039B .. GREEK CAPITAL LETTER LAMDA
+.. |lambda|   unicode:: U+003BB .. GREEK SMALL LETTER LAMDA
+.. |lang|     unicode:: U+02329 .. LEFT-POINTING ANGLE BRACKET
+.. |lArr|     unicode:: U+021D0 .. LEFTWARDS DOUBLE ARROW
+.. |larr|     unicode:: U+02190 .. LEFTWARDS ARROW
+.. |lceil|    unicode:: U+02308 .. LEFT CEILING
+.. |le|       unicode:: U+02264 .. LESS-THAN OR EQUAL TO
+.. |lfloor|   unicode:: U+0230A .. LEFT FLOOR
+.. |lowast|   unicode:: U+02217 .. ASTERISK OPERATOR
+.. |loz|      unicode:: U+025CA .. LOZENGE
+.. |minus|    unicode:: U+02212 .. MINUS SIGN
+.. |Mu|       unicode:: U+0039C .. GREEK CAPITAL LETTER MU
+.. |mu|       unicode:: U+003BC .. GREEK SMALL LETTER MU
+.. |nabla|    unicode:: U+02207 .. NABLA
+.. |ne|       unicode:: U+02260 .. NOT EQUAL TO
+.. |ni|       unicode:: U+0220B .. CONTAINS AS MEMBER
+.. |notin|    unicode:: U+02209 .. NOT AN ELEMENT OF
+.. |nsub|     unicode:: U+02284 .. NOT A SUBSET OF
+.. |Nu|       unicode:: U+0039D .. GREEK CAPITAL LETTER NU
+.. |nu|       unicode:: U+003BD .. GREEK SMALL LETTER NU
+.. |oline|    unicode:: U+0203E .. OVERLINE
+.. |Omega|    unicode:: U+003A9 .. GREEK CAPITAL LETTER OMEGA
+.. |omega|    unicode:: U+003C9 .. GREEK SMALL LETTER OMEGA
+.. |Omicron|  unicode:: U+0039F .. GREEK CAPITAL LETTER OMICRON
+.. |omicron|  unicode:: U+003BF .. GREEK SMALL LETTER OMICRON
+.. |oplus|    unicode:: U+02295 .. CIRCLED PLUS
+.. |or|       unicode:: U+02228 .. LOGICAL OR
+.. |otimes|   unicode:: U+02297 .. CIRCLED TIMES
+.. |part|     unicode:: U+02202 .. PARTIAL DIFFERENTIAL
+.. |perp|     unicode:: U+022A5 .. UP TACK
+.. |Phi|      unicode:: U+003A6 .. GREEK CAPITAL LETTER PHI
+.. |phi|      unicode:: U+003D5 .. GREEK PHI SYMBOL
+.. |Pi|       unicode:: U+003A0 .. GREEK CAPITAL LETTER PI
+.. |pi|       unicode:: U+003C0 .. GREEK SMALL LETTER PI
+.. |piv|      unicode:: U+003D6 .. GREEK PI SYMBOL
+.. |Prime|    unicode:: U+02033 .. DOUBLE PRIME
+.. |prime|    unicode:: U+02032 .. PRIME
+.. |prod|     unicode:: U+0220F .. N-ARY PRODUCT
+.. |prop|     unicode:: U+0221D .. PROPORTIONAL TO
+.. |Psi|      unicode:: U+003A8 .. GREEK CAPITAL LETTER PSI
+.. |psi|      unicode:: U+003C8 .. GREEK SMALL LETTER PSI
+.. |radic|    unicode:: U+0221A .. SQUARE ROOT
+.. |rang|     unicode:: U+0232A .. RIGHT-POINTING ANGLE BRACKET
+.. |rArr|     unicode:: U+021D2 .. RIGHTWARDS DOUBLE ARROW
+.. |rarr|     unicode:: U+02192 .. RIGHTWARDS ARROW
+.. |rceil|    unicode:: U+02309 .. RIGHT CEILING
+.. |real|     unicode:: U+0211C .. BLACK-LETTER CAPITAL R
+.. |rfloor|   unicode:: U+0230B .. RIGHT FLOOR
+.. |Rho|      unicode:: U+003A1 .. GREEK CAPITAL LETTER RHO
+.. |rho|      unicode:: U+003C1 .. GREEK SMALL LETTER RHO
+.. |sdot|     unicode:: U+022C5 .. DOT OPERATOR
+.. |Sigma|    unicode:: U+003A3 .. GREEK CAPITAL LETTER SIGMA
+.. |sigma|    unicode:: U+003C3 .. GREEK SMALL LETTER SIGMA
+.. |sigmaf|   unicode:: U+003C2 .. GREEK SMALL LETTER FINAL SIGMA
+.. |sim|      unicode:: U+0223C .. TILDE OPERATOR
+.. |spades|   unicode:: U+02660 .. BLACK SPADE SUIT
+.. |sub|      unicode:: U+02282 .. SUBSET OF
+.. |sube|     unicode:: U+02286 .. SUBSET OF OR EQUAL TO
+.. |sum|      unicode:: U+02211 .. N-ARY SUMMATION
+.. |sup|      unicode:: U+02283 .. SUPERSET OF
+.. |supe|     unicode:: U+02287 .. SUPERSET OF OR EQUAL TO
+.. |Tau|      unicode:: U+003A4 .. GREEK CAPITAL LETTER TAU
+.. |tau|      unicode:: U+003C4 .. GREEK SMALL LETTER TAU
+.. |there4|   unicode:: U+02234 .. THEREFORE
+.. |Theta|    unicode:: U+00398 .. GREEK CAPITAL LETTER THETA
+.. |theta|    unicode:: U+003B8 .. GREEK SMALL LETTER THETA
+.. |thetasym| unicode:: U+003D1 .. GREEK THETA SYMBOL
+.. |trade|    unicode:: U+02122 .. TRADE MARK SIGN
+.. |uArr|     unicode:: U+021D1 .. UPWARDS DOUBLE ARROW
+.. |uarr|     unicode:: U+02191 .. UPWARDS ARROW
+.. |upsih|    unicode:: U+003D2 .. GREEK UPSILON WITH HOOK SYMBOL
+.. |Upsilon|  unicode:: U+003A5 .. GREEK CAPITAL LETTER UPSILON
+.. |upsilon|  unicode:: U+003C5 .. GREEK SMALL LETTER UPSILON
+.. |weierp|   unicode:: U+02118 .. SCRIPT CAPITAL P
+.. |Xi|       unicode:: U+0039E .. GREEK CAPITAL LETTER XI
+.. |xi|       unicode:: U+003BE .. GREEK SMALL LETTER XI
+.. |Zeta|     unicode:: U+00396 .. GREEK CAPITAL LETTER ZETA
+.. |zeta|     unicode:: U+003B6 .. GREEK SMALL LETTER ZETA
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/mmlextra.txt
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/mmlextra.txt (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/mmlextra.txt (revision 3)
@@ -0,0 +1,87 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |af|                      unicode:: U+02061 .. FUNCTION APPLICATION
+.. |asympeq|                 unicode:: U+0224D .. EQUIVALENT TO
+.. |Cross|                   unicode:: U+02A2F .. VECTOR OR CROSS PRODUCT
+.. |DD|                      unicode:: U+02145 .. DOUBLE-STRUCK ITALIC CAPITAL D
+.. |dd|                      unicode:: U+02146 .. DOUBLE-STRUCK ITALIC SMALL D
+.. |DownArrowBar|            unicode:: U+02913 .. DOWNWARDS ARROW TO BAR
+.. |DownBreve|               unicode:: U+00311 .. COMBINING INVERTED BREVE
+.. |DownLeftRightVector|     unicode:: U+02950 .. LEFT BARB DOWN RIGHT BARB DOWN HARPOON
+.. |DownLeftTeeVector|       unicode:: U+0295E .. LEFTWARDS HARPOON WITH BARB DOWN FROM BAR
+.. |DownLeftVectorBar|       unicode:: U+02956 .. LEFTWARDS HARPOON WITH BARB DOWN TO BAR
+.. |DownRightTeeVector|      unicode:: U+0295F .. RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR
+.. |DownRightVectorBar|      unicode:: U+02957 .. RIGHTWARDS HARPOON WITH BARB DOWN TO BAR
+.. |ee|                      unicode:: U+02147 .. DOUBLE-STRUCK ITALIC SMALL E
+.. |EmptySmallSquare|        unicode:: U+025FB .. WHITE MEDIUM SQUARE
+.. |EmptyVerySmallSquare|    unicode:: U+025AB .. WHITE SMALL SQUARE
+.. |Equal|                   unicode:: U+02A75 .. TWO CONSECUTIVE EQUALS SIGNS
+.. |FilledSmallSquare|       unicode:: U+025FC .. BLACK MEDIUM SQUARE
+.. |FilledVerySmallSquare|   unicode:: U+025AA .. BLACK SMALL SQUARE
+.. |GreaterGreater|          unicode:: U+02AA2 .. DOUBLE NESTED GREATER-THAN
+.. |Hat|                     unicode:: U+0005E .. CIRCUMFLEX ACCENT
+.. |HorizontalLine|          unicode:: U+02500 .. BOX DRAWINGS LIGHT HORIZONTAL
+.. |ic|                      unicode:: U+02063 .. INVISIBLE SEPARATOR
+.. |ii|                      unicode:: U+02148 .. DOUBLE-STRUCK ITALIC SMALL I
+.. |it|                      unicode:: U+02062 .. INVISIBLE TIMES
+.. |larrb|                   unicode:: U+021E4 .. LEFTWARDS ARROW TO BAR
+.. |LeftDownTeeVector|       unicode:: U+02961 .. DOWNWARDS HARPOON WITH BARB LEFT FROM BAR
+.. |LeftDownVectorBar|       unicode:: U+02959 .. DOWNWARDS HARPOON WITH BARB LEFT TO BAR
+.. |LeftRightVector|         unicode:: U+0294E .. LEFT BARB UP RIGHT BARB UP HARPOON
+.. |LeftTeeVector|           unicode:: U+0295A .. LEFTWARDS HARPOON WITH BARB UP FROM BAR
+.. |LeftTriangleBar|         unicode:: U+029CF .. LEFT TRIANGLE BESIDE VERTICAL BAR
+.. |LeftUpDownVector|        unicode:: U+02951 .. UP BARB LEFT DOWN BARB LEFT HARPOON
+.. |LeftUpTeeVector|         unicode:: U+02960 .. UPWARDS HARPOON WITH BARB LEFT FROM BAR
+.. |LeftUpVectorBar|         unicode:: U+02958 .. UPWARDS HARPOON WITH BARB LEFT TO BAR
+.. |LeftVectorBar|           unicode:: U+02952 .. LEFTWARDS HARPOON WITH BARB UP TO BAR
+.. |LessLess|                unicode:: U+02AA1 .. DOUBLE NESTED LESS-THAN
+.. |mapstodown|              unicode:: U+021A7 .. DOWNWARDS ARROW FROM BAR
+.. |mapstoleft|              unicode:: U+021A4 .. LEFTWARDS ARROW FROM BAR
+.. |mapstoup|                unicode:: U+021A5 .. UPWARDS ARROW FROM BAR
+.. |MediumSpace|             unicode:: U+0205F .. MEDIUM MATHEMATICAL SPACE
+.. |nbump|                   unicode:: U+0224E U+00338 .. GEOMETRICALLY EQUIVALENT TO with slash
+.. |nbumpe|                  unicode:: U+0224F U+00338 .. DIFFERENCE BETWEEN with slash
+.. |nesim|                   unicode:: U+02242 U+00338 .. MINUS TILDE with slash
+.. |NewLine|                 unicode:: U+0000A .. LINE FEED (LF)
+.. |NoBreak|                 unicode:: U+02060 .. WORD JOINER
+.. |NotCupCap|               unicode:: U+0226D .. NOT EQUIVALENT TO
+.. |NotHumpEqual|            unicode:: U+0224F U+00338 .. DIFFERENCE BETWEEN with slash
+.. |NotLeftTriangleBar|      unicode:: U+029CF U+00338 .. LEFT TRIANGLE BESIDE VERTICAL BAR with slash
+.. |NotNestedGreaterGreater| unicode:: U+02AA2 U+00338 .. DOUBLE NESTED GREATER-THAN with slash
+.. |NotNestedLessLess|       unicode:: U+02AA1 U+00338 .. DOUBLE NESTED LESS-THAN with slash
+.. |NotRightTriangleBar|     unicode:: U+029D0 U+00338 .. VERTICAL BAR BESIDE RIGHT TRIANGLE with slash
+.. |NotSquareSubset|         unicode:: U+0228F U+00338 .. SQUARE IMAGE OF with slash
+.. |NotSquareSuperset|       unicode:: U+02290 U+00338 .. SQUARE ORIGINAL OF with slash
+.. |NotSucceedsTilde|        unicode:: U+0227F U+00338 .. SUCCEEDS OR EQUIVALENT TO with slash
+.. |OverBar|                 unicode:: U+000AF .. MACRON
+.. |OverBrace|               unicode:: U+0FE37 .. PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET
+.. |OverBracket|             unicode:: U+023B4 .. TOP SQUARE BRACKET
+.. |OverParenthesis|         unicode:: U+0FE35 .. PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS
+.. |planckh|                 unicode:: U+0210E .. PLANCK CONSTANT
+.. |Product|                 unicode:: U+0220F .. N-ARY PRODUCT
+.. |rarrb|                   unicode:: U+021E5 .. RIGHTWARDS ARROW TO BAR
+.. |RightDownTeeVector|      unicode:: U+0295D .. DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR
+.. |RightDownVectorBar|      unicode:: U+02955 .. DOWNWARDS HARPOON WITH BARB RIGHT TO BAR
+.. |RightTeeVector|          unicode:: U+0295B .. RIGHTWARDS HARPOON WITH BARB UP FROM BAR
+.. |RightTriangleBar|        unicode:: U+029D0 .. VERTICAL BAR BESIDE RIGHT TRIANGLE
+.. |RightUpDownVector|       unicode:: U+0294F .. UP BARB RIGHT DOWN BARB RIGHT HARPOON
+.. |RightUpTeeVector|        unicode:: U+0295C .. UPWARDS HARPOON WITH BARB RIGHT FROM BAR
+.. |RightUpVectorBar|        unicode:: U+02954 .. UPWARDS HARPOON WITH BARB RIGHT TO BAR
+.. |RightVectorBar|          unicode:: U+02953 .. RIGHTWARDS HARPOON WITH BARB UP TO BAR
+.. |RoundImplies|            unicode:: U+02970 .. RIGHT DOUBLE ARROW WITH ROUNDED HEAD
+.. |RuleDelayed|             unicode:: U+029F4 .. RULE-DELAYED
+.. |Tab|                     unicode:: U+00009 .. CHARACTER TABULATION
+.. |ThickSpace|              unicode:: U+02009 U+0200A U+0200A .. space of width 5/18 em
+.. |UnderBar|                unicode:: U+00332 .. COMBINING LOW LINE
+.. |UnderBrace|              unicode:: U+0FE38 .. PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET
+.. |UnderBracket|            unicode:: U+023B5 .. BOTTOM SQUARE BRACKET
+.. |UnderParenthesis|        unicode:: U+0FE36 .. PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS
+.. |UpArrowBar|              unicode:: U+02912 .. UPWARDS ARROW TO BAR
+.. |Upsilon|                 unicode:: U+003A5 .. GREEK CAPITAL LETTER UPSILON
+.. |VerticalLine|            unicode:: U+0007C .. VERTICAL LINE
+.. |VerticalSeparator|       unicode:: U+02758 .. LIGHT VERTICAL BAR
+.. |ZeroWidthSpace|          unicode:: U+0200B .. ZERO WIDTH SPACE
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isocyr1.txt
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isocyr1.txt (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isocyr1.txt (revision 3)
@@ -0,0 +1,73 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |Acy|    unicode:: U+00410 .. CYRILLIC CAPITAL LETTER A
+.. |acy|    unicode:: U+00430 .. CYRILLIC SMALL LETTER A
+.. |Bcy|    unicode:: U+00411 .. CYRILLIC CAPITAL LETTER BE
+.. |bcy|    unicode:: U+00431 .. CYRILLIC SMALL LETTER BE
+.. |CHcy|   unicode:: U+00427 .. CYRILLIC CAPITAL LETTER CHE
+.. |chcy|   unicode:: U+00447 .. CYRILLIC SMALL LETTER CHE
+.. |Dcy|    unicode:: U+00414 .. CYRILLIC CAPITAL LETTER DE
+.. |dcy|    unicode:: U+00434 .. CYRILLIC SMALL LETTER DE
+.. |Ecy|    unicode:: U+0042D .. CYRILLIC CAPITAL LETTER E
+.. |ecy|    unicode:: U+0044D .. CYRILLIC SMALL LETTER E
+.. |Fcy|    unicode:: U+00424 .. CYRILLIC CAPITAL LETTER EF
+.. |fcy|    unicode:: U+00444 .. CYRILLIC SMALL LETTER EF
+.. |Gcy|    unicode:: U+00413 .. CYRILLIC CAPITAL LETTER GHE
+.. |gcy|    unicode:: U+00433 .. CYRILLIC SMALL LETTER GHE
+.. |HARDcy| unicode:: U+0042A .. CYRILLIC CAPITAL LETTER HARD SIGN
+.. |hardcy| unicode:: U+0044A .. CYRILLIC SMALL LETTER HARD SIGN
+.. |Icy|    unicode:: U+00418 .. CYRILLIC CAPITAL LETTER I
+.. |icy|    unicode:: U+00438 .. CYRILLIC SMALL LETTER I
+.. |IEcy|   unicode:: U+00415 .. CYRILLIC CAPITAL LETTER IE
+.. |iecy|   unicode:: U+00435 .. CYRILLIC SMALL LETTER IE
+.. |IOcy|   unicode:: U+00401 .. CYRILLIC CAPITAL LETTER IO
+.. |iocy|   unicode:: U+00451 .. CYRILLIC SMALL LETTER IO
+.. |Jcy|    unicode:: U+00419 .. CYRILLIC CAPITAL LETTER SHORT I
+.. |jcy|    unicode:: U+00439 .. CYRILLIC SMALL LETTER SHORT I
+.. |Kcy|    unicode:: U+0041A .. CYRILLIC CAPITAL LETTER KA
+.. |kcy|    unicode:: U+0043A .. CYRILLIC SMALL LETTER KA
+.. |KHcy|   unicode:: U+00425 .. CYRILLIC CAPITAL LETTER HA
+.. |khcy|   unicode:: U+00445 .. CYRILLIC SMALL LETTER HA
+.. |Lcy|    unicode:: U+0041B .. CYRILLIC CAPITAL LETTER EL
+.. |lcy|    unicode:: U+0043B .. CYRILLIC SMALL LETTER EL
+.. |Mcy|    unicode:: U+0041C .. CYRILLIC CAPITAL LETTER EM
+.. |mcy|    unicode:: U+0043C .. CYRILLIC SMALL LETTER EM
+.. |Ncy|    unicode:: U+0041D .. CYRILLIC CAPITAL LETTER EN
+.. |ncy|    unicode:: U+0043D .. CYRILLIC SMALL LETTER EN
+.. |numero| unicode:: U+02116 .. NUMERO SIGN
+.. |Ocy|    unicode:: U+0041E .. CYRILLIC CAPITAL LETTER O
+.. |ocy|    unicode:: U+0043E .. CYRILLIC SMALL LETTER O
+.. |Pcy|    unicode:: U+0041F .. CYRILLIC CAPITAL LETTER PE
+.. |pcy|    unicode:: U+0043F .. CYRILLIC SMALL LETTER PE
+.. |Rcy|    unicode:: U+00420 .. CYRILLIC CAPITAL LETTER ER
+.. |rcy|    unicode:: U+00440 .. CYRILLIC SMALL LETTER ER
+.. |Scy|    unicode:: U+00421 .. CYRILLIC CAPITAL LETTER ES
+.. |scy|    unicode:: U+00441 .. CYRILLIC SMALL LETTER ES
+.. |SHCHcy| unicode:: U+00429 .. CYRILLIC CAPITAL LETTER SHCHA
+.. |shchcy| unicode:: U+00449 .. CYRILLIC SMALL LETTER SHCHA
+.. |SHcy|   unicode:: U+00428 .. CYRILLIC CAPITAL LETTER SHA
+.. |shcy|   unicode:: U+00448 .. CYRILLIC SMALL LETTER SHA
+.. |SOFTcy| unicode:: U+0042C .. CYRILLIC CAPITAL LETTER SOFT SIGN
+.. |softcy| unicode:: U+0044C .. CYRILLIC SMALL LETTER SOFT SIGN
+.. |Tcy|    unicode:: U+00422 .. CYRILLIC CAPITAL LETTER TE
+.. |tcy|    unicode:: U+00442 .. CYRILLIC SMALL LETTER TE
+.. |TScy|   unicode:: U+00426 .. CYRILLIC CAPITAL LETTER TSE
+.. |tscy|   unicode:: U+00446 .. CYRILLIC SMALL LETTER TSE
+.. |Ucy|    unicode:: U+00423 .. CYRILLIC CAPITAL LETTER U
+.. |ucy|    unicode:: U+00443 .. CYRILLIC SMALL LETTER U
+.. |Vcy|    unicode:: U+00412 .. CYRILLIC CAPITAL LETTER VE
+.. |vcy|    unicode:: U+00432 .. CYRILLIC SMALL LETTER VE
+.. |YAcy|   unicode:: U+0042F .. CYRILLIC CAPITAL LETTER YA
+.. |yacy|   unicode:: U+0044F .. CYRILLIC SMALL LETTER YA
+.. |Ycy|    unicode:: U+0042B .. CYRILLIC CAPITAL LETTER YERU
+.. |ycy|    unicode:: U+0044B .. CYRILLIC SMALL LETTER YERU
+.. |YUcy|   unicode:: U+0042E .. CYRILLIC CAPITAL LETTER YU
+.. |yucy|   unicode:: U+0044E .. CYRILLIC SMALL LETTER YU
+.. |Zcy|    unicode:: U+00417 .. CYRILLIC CAPITAL LETTER ZE
+.. |zcy|    unicode:: U+00437 .. CYRILLIC SMALL LETTER ZE
+.. |ZHcy|   unicode:: U+00416 .. CYRILLIC CAPITAL LETTER ZHE
+.. |zhcy|   unicode:: U+00436 .. CYRILLIC SMALL LETTER ZHE
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isocyr2.txt
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isocyr2.txt (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isocyr2.txt (revision 3)
@@ -0,0 +1,32 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |DJcy|   unicode:: U+00402 .. CYRILLIC CAPITAL LETTER DJE
+.. |djcy|   unicode:: U+00452 .. CYRILLIC SMALL LETTER DJE
+.. |DScy|   unicode:: U+00405 .. CYRILLIC CAPITAL LETTER DZE
+.. |dscy|   unicode:: U+00455 .. CYRILLIC SMALL LETTER DZE
+.. |DZcy|   unicode:: U+0040F .. CYRILLIC CAPITAL LETTER DZHE
+.. |dzcy|   unicode:: U+0045F .. CYRILLIC SMALL LETTER DZHE
+.. |GJcy|   unicode:: U+00403 .. CYRILLIC CAPITAL LETTER GJE
+.. |gjcy|   unicode:: U+00453 .. CYRILLIC SMALL LETTER GJE
+.. |Iukcy|  unicode:: U+00406 .. CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
+.. |iukcy|  unicode:: U+00456 .. CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+.. |Jsercy| unicode:: U+00408 .. CYRILLIC CAPITAL LETTER JE
+.. |jsercy| unicode:: U+00458 .. CYRILLIC SMALL LETTER JE
+.. |Jukcy|  unicode:: U+00404 .. CYRILLIC CAPITAL LETTER UKRAINIAN IE
+.. |jukcy|  unicode:: U+00454 .. CYRILLIC SMALL LETTER UKRAINIAN IE
+.. |KJcy|   unicode:: U+0040C .. CYRILLIC CAPITAL LETTER KJE
+.. |kjcy|   unicode:: U+0045C .. CYRILLIC SMALL LETTER KJE
+.. |LJcy|   unicode:: U+00409 .. CYRILLIC CAPITAL LETTER LJE
+.. |ljcy|   unicode:: U+00459 .. CYRILLIC SMALL LETTER LJE
+.. |NJcy|   unicode:: U+0040A .. CYRILLIC CAPITAL LETTER NJE
+.. |njcy|   unicode:: U+0045A .. CYRILLIC SMALL LETTER NJE
+.. |TSHcy|  unicode:: U+0040B .. CYRILLIC CAPITAL LETTER TSHE
+.. |tshcy|  unicode:: U+0045B .. CYRILLIC SMALL LETTER TSHE
+.. |Ubrcy|  unicode:: U+0040E .. CYRILLIC CAPITAL LETTER SHORT U
+.. |ubrcy|  unicode:: U+0045E .. CYRILLIC SMALL LETTER SHORT U
+.. |YIcy|   unicode:: U+00407 .. CYRILLIC CAPITAL LETTER YI
+.. |yicy|   unicode:: U+00457 .. CYRILLIC SMALL LETTER YI
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/xhtml1-special.txt
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/xhtml1-special.txt (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/xhtml1-special.txt (revision 3)
@@ -0,0 +1,37 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |bdquo|  unicode:: U+0201E .. DOUBLE LOW-9 QUOTATION MARK
+.. |circ|   unicode:: U+002C6 .. MODIFIER LETTER CIRCUMFLEX ACCENT
+.. |Dagger| unicode:: U+02021 .. DOUBLE DAGGER
+.. |dagger| unicode:: U+02020 .. DAGGER
+.. |emsp|   unicode:: U+02003 .. EM SPACE
+.. |ensp|   unicode:: U+02002 .. EN SPACE
+.. |euro|   unicode:: U+020AC .. EURO SIGN
+.. |gt|     unicode:: U+0003E .. GREATER-THAN SIGN
+.. |ldquo|  unicode:: U+0201C .. LEFT DOUBLE QUOTATION MARK
+.. |lrm|    unicode:: U+0200E .. LEFT-TO-RIGHT MARK
+.. |lsaquo| unicode:: U+02039 .. SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+.. |lsquo|  unicode:: U+02018 .. LEFT SINGLE QUOTATION MARK
+.. |lt|     unicode:: U+0003C .. LESS-THAN SIGN
+.. |mdash|  unicode:: U+02014 .. EM DASH
+.. |ndash|  unicode:: U+02013 .. EN DASH
+.. |OElig|  unicode:: U+00152 .. LATIN CAPITAL LIGATURE OE
+.. |oelig|  unicode:: U+00153 .. LATIN SMALL LIGATURE OE
+.. |permil| unicode:: U+02030 .. PER MILLE SIGN
+.. |quot|   unicode:: U+00022 .. QUOTATION MARK
+.. |rdquo|  unicode:: U+0201D .. RIGHT DOUBLE QUOTATION MARK
+.. |rlm|    unicode:: U+0200F .. RIGHT-TO-LEFT MARK
+.. |rsaquo| unicode:: U+0203A .. SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+.. |rsquo|  unicode:: U+02019 .. RIGHT SINGLE QUOTATION MARK
+.. |sbquo|  unicode:: U+0201A .. SINGLE LOW-9 QUOTATION MARK
+.. |Scaron| unicode:: U+00160 .. LATIN CAPITAL LETTER S WITH CARON
+.. |scaron| unicode:: U+00161 .. LATIN SMALL LETTER S WITH CARON
+.. |thinsp| unicode:: U+02009 .. THIN SPACE
+.. |tilde|  unicode:: U+002DC .. SMALL TILDE
+.. |Yuml|   unicode:: U+00178 .. LATIN CAPITAL LETTER Y WITH DIAERESIS
+.. |zwj|    unicode:: U+0200D .. ZERO WIDTH JOINER
+.. |zwnj|   unicode:: U+0200C .. ZERO WIDTH NON-JOINER
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isoamsa.txt
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isoamsa.txt (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isoamsa.txt (revision 3)
@@ -0,0 +1,162 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |angzarr|  unicode:: U+0237C .. RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW
+.. |cirmid|   unicode:: U+02AEF .. VERTICAL LINE WITH CIRCLE ABOVE
+.. |cudarrl|  unicode:: U+02938 .. RIGHT-SIDE ARC CLOCKWISE ARROW
+.. |cudarrr|  unicode:: U+02935 .. ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS
+.. |cularr|   unicode:: U+021B6 .. ANTICLOCKWISE TOP SEMICIRCLE ARROW
+.. |cularrp|  unicode:: U+0293D .. TOP ARC ANTICLOCKWISE ARROW WITH PLUS
+.. |curarr|   unicode:: U+021B7 .. CLOCKWISE TOP SEMICIRCLE ARROW
+.. |curarrm|  unicode:: U+0293C .. TOP ARC CLOCKWISE ARROW WITH MINUS
+.. |Darr|     unicode:: U+021A1 .. DOWNWARDS TWO HEADED ARROW
+.. |dArr|     unicode:: U+021D3 .. DOWNWARDS DOUBLE ARROW
+.. |darr2|    unicode:: U+021CA .. DOWNWARDS PAIRED ARROWS
+.. |ddarr|    unicode:: U+021CA .. DOWNWARDS PAIRED ARROWS
+.. |DDotrahd| unicode:: U+02911 .. RIGHTWARDS ARROW WITH DOTTED STEM
+.. |dfisht|   unicode:: U+0297F .. DOWN FISH TAIL
+.. |dHar|     unicode:: U+02965 .. DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT
+.. |dharl|    unicode:: U+021C3 .. DOWNWARDS HARPOON WITH BARB LEFTWARDS
+.. |dharr|    unicode:: U+021C2 .. DOWNWARDS HARPOON WITH BARB RIGHTWARDS
+.. |dlarr|    unicode:: U+02199 .. SOUTH WEST ARROW
+.. |drarr|    unicode:: U+02198 .. SOUTH EAST ARROW
+.. |duarr|    unicode:: U+021F5 .. DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW
+.. |duhar|    unicode:: U+0296F .. DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT
+.. |dzigrarr| unicode:: U+027FF .. LONG RIGHTWARDS SQUIGGLE ARROW
+.. |erarr|    unicode:: U+02971 .. EQUALS SIGN ABOVE RIGHTWARDS ARROW
+.. |hArr|     unicode:: U+021D4 .. LEFT RIGHT DOUBLE ARROW
+.. |harr|     unicode:: U+02194 .. LEFT RIGHT ARROW
+.. |harrcir|  unicode:: U+02948 .. LEFT RIGHT ARROW THROUGH SMALL CIRCLE
+.. |harrw|    unicode:: U+021AD .. LEFT RIGHT WAVE ARROW
+.. |hoarr|    unicode:: U+021FF .. LEFT RIGHT OPEN-HEADED ARROW
+.. |imof|     unicode:: U+022B7 .. IMAGE OF
+.. |lAarr|    unicode:: U+021DA .. LEFTWARDS TRIPLE ARROW
+.. |Larr|     unicode:: U+0219E .. LEFTWARDS TWO HEADED ARROW
+.. |larr2|    unicode:: U+021C7 .. LEFTWARDS PAIRED ARROWS
+.. |larrbfs|  unicode:: U+0291F .. LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND
+.. |larrfs|   unicode:: U+0291D .. LEFTWARDS ARROW TO BLACK DIAMOND
+.. |larrhk|   unicode:: U+021A9 .. LEFTWARDS ARROW WITH HOOK
+.. |larrlp|   unicode:: U+021AB .. LEFTWARDS ARROW WITH LOOP
+.. |larrpl|   unicode:: U+02939 .. LEFT-SIDE ARC ANTICLOCKWISE ARROW
+.. |larrsim|  unicode:: U+02973 .. LEFTWARDS ARROW ABOVE TILDE OPERATOR
+.. |larrtl|   unicode:: U+021A2 .. LEFTWARDS ARROW WITH TAIL
+.. |lAtail|   unicode:: U+0291B .. LEFTWARDS DOUBLE ARROW-TAIL
+.. |latail|   unicode:: U+02919 .. LEFTWARDS ARROW-TAIL
+.. |lBarr|    unicode:: U+0290E .. LEFTWARDS TRIPLE DASH ARROW
+.. |lbarr|    unicode:: U+0290C .. LEFTWARDS DOUBLE DASH ARROW
+.. |ldca|     unicode:: U+02936 .. ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS
+.. |ldrdhar|  unicode:: U+02967 .. LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN
+.. |ldrushar| unicode:: U+0294B .. LEFT BARB DOWN RIGHT BARB UP HARPOON
+.. |ldsh|     unicode:: U+021B2 .. DOWNWARDS ARROW WITH TIP LEFTWARDS
+.. |lfisht|   unicode:: U+0297C .. LEFT FISH TAIL
+.. |lHar|     unicode:: U+02962 .. LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN
+.. |lhard|    unicode:: U+021BD .. LEFTWARDS HARPOON WITH BARB DOWNWARDS
+.. |lharu|    unicode:: U+021BC .. LEFTWARDS HARPOON WITH BARB UPWARDS
+.. |lharul|   unicode:: U+0296A .. LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH
+.. |llarr|    unicode:: U+021C7 .. LEFTWARDS PAIRED ARROWS
+.. |llhard|   unicode:: U+0296B .. LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH
+.. |loarr|    unicode:: U+021FD .. LEFTWARDS OPEN-HEADED ARROW
+.. |lrarr|    unicode:: U+021C6 .. LEFTWARDS ARROW OVER RIGHTWARDS ARROW
+.. |lrarr2|   unicode:: U+021C6 .. LEFTWARDS ARROW OVER RIGHTWARDS ARROW
+.. |lrhar|    unicode:: U+021CB .. LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON
+.. |lrhar2|   unicode:: U+021CB .. LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON
+.. |lrhard|   unicode:: U+0296D .. RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH
+.. |lsh|      unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS
+.. |lurdshar| unicode:: U+0294A .. LEFT BARB UP RIGHT BARB DOWN HARPOON
+.. |luruhar|  unicode:: U+02966 .. LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP
+.. |Map|      unicode:: U+02905 .. RIGHTWARDS TWO-HEADED ARROW FROM BAR
+.. |map|      unicode:: U+021A6 .. RIGHTWARDS ARROW FROM BAR
+.. |midcir|   unicode:: U+02AF0 .. VERTICAL LINE WITH CIRCLE BELOW
+.. |mumap|    unicode:: U+022B8 .. MULTIMAP
+.. |nearhk|   unicode:: U+02924 .. NORTH EAST ARROW WITH HOOK
+.. |neArr|    unicode:: U+021D7 .. NORTH EAST DOUBLE ARROW
+.. |nearr|    unicode:: U+02197 .. NORTH EAST ARROW
+.. |nesear|   unicode:: U+02928 .. NORTH EAST ARROW AND SOUTH EAST ARROW
+.. |nhArr|    unicode:: U+021CE .. LEFT RIGHT DOUBLE ARROW WITH STROKE
+.. |nharr|    unicode:: U+021AE .. LEFT RIGHT ARROW WITH STROKE
+.. |nlArr|    unicode:: U+021CD .. LEFTWARDS DOUBLE ARROW WITH STROKE
+.. |nlarr|    unicode:: U+0219A .. LEFTWARDS ARROW WITH STROKE
+.. |nrArr|    unicode:: U+021CF .. RIGHTWARDS DOUBLE ARROW WITH STROKE
+.. |nrarr|    unicode:: U+0219B .. RIGHTWARDS ARROW WITH STROKE
+.. |nrarrc|   unicode:: U+02933 U+00338 .. WAVE ARROW POINTING DIRECTLY RIGHT with slash
+.. |nrarrw|   unicode:: U+0219D U+00338 .. RIGHTWARDS WAVE ARROW with slash
+.. |nvHarr|   unicode:: U+02904 .. LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE
+.. |nvlArr|   unicode:: U+02902 .. LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE
+.. |nvrArr|   unicode:: U+02903 .. RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE
+.. |nwarhk|   unicode:: U+02923 .. NORTH WEST ARROW WITH HOOK
+.. |nwArr|    unicode:: U+021D6 .. NORTH WEST DOUBLE ARROW
+.. |nwarr|    unicode:: U+02196 .. NORTH WEST ARROW
+.. |nwnear|   unicode:: U+02927 .. NORTH WEST ARROW AND NORTH EAST ARROW
+.. |olarr|    unicode:: U+021BA .. ANTICLOCKWISE OPEN CIRCLE ARROW
+.. |orarr|    unicode:: U+021BB .. CLOCKWISE OPEN CIRCLE ARROW
+.. |origof|   unicode:: U+022B6 .. ORIGINAL OF
+.. |rAarr|    unicode:: U+021DB .. RIGHTWARDS TRIPLE ARROW
+.. |Rarr|     unicode:: U+021A0 .. RIGHTWARDS TWO HEADED ARROW
+.. |rarr2|    unicode:: U+021C9 .. RIGHTWARDS PAIRED ARROWS
+.. |rarrap|   unicode:: U+02975 .. RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO
+.. |rarrbfs|  unicode:: U+02920 .. RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND
+.. |rarrc|    unicode:: U+02933 .. WAVE ARROW POINTING DIRECTLY RIGHT
+.. |rarrfs|   unicode:: U+0291E .. RIGHTWARDS ARROW TO BLACK DIAMOND
+.. |rarrhk|   unicode:: U+021AA .. RIGHTWARDS ARROW WITH HOOK
+.. |rarrlp|   unicode:: U+021AC .. RIGHTWARDS ARROW WITH LOOP
+.. |rarrpl|   unicode:: U+02945 .. RIGHTWARDS ARROW WITH PLUS BELOW
+.. |rarrsim|  unicode:: U+02974 .. RIGHTWARDS ARROW ABOVE TILDE OPERATOR
+.. |Rarrtl|   unicode:: U+02916 .. RIGHTWARDS TWO-HEADED ARROW WITH TAIL
+.. |rarrtl|   unicode:: U+021A3 .. RIGHTWARDS ARROW WITH TAIL
+.. |rarrw|    unicode:: U+0219D .. RIGHTWARDS WAVE ARROW
+.. |rAtail|   unicode:: U+0291C .. RIGHTWARDS DOUBLE ARROW-TAIL
+.. |ratail|   unicode:: U+0291A .. RIGHTWARDS ARROW-TAIL
+.. |RBarr|    unicode:: U+02910 .. RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW
+.. |rBarr|    unicode:: U+0290F .. RIGHTWARDS TRIPLE DASH ARROW
+.. |rbarr|    unicode:: U+0290D .. RIGHTWARDS DOUBLE DASH ARROW
+.. |rdca|     unicode:: U+02937 .. ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS
+.. |rdldhar|  unicode:: U+02969 .. RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN
+.. |rdsh|     unicode:: U+021B3 .. DOWNWARDS ARROW WITH TIP RIGHTWARDS
+.. |rfisht|   unicode:: U+0297D .. RIGHT FISH TAIL
+.. |rHar|     unicode:: U+02964 .. RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN
+.. |rhard|    unicode:: U+021C1 .. RIGHTWARDS HARPOON WITH BARB DOWNWARDS
+.. |rharu|    unicode:: U+021C0 .. RIGHTWARDS HARPOON WITH BARB UPWARDS
+.. |rharul|   unicode:: U+0296C .. RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH
+.. |rlarr|    unicode:: U+021C4 .. RIGHTWARDS ARROW OVER LEFTWARDS ARROW
+.. |rlarr2|   unicode:: U+021C4 .. RIGHTWARDS ARROW OVER LEFTWARDS ARROW
+.. |rlhar|    unicode:: U+021CC .. RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON
+.. |rlhar2|   unicode:: U+021CC .. RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON
+.. |roarr|    unicode:: U+021FE .. RIGHTWARDS OPEN-HEADED ARROW
+.. |rrarr|    unicode:: U+021C9 .. RIGHTWARDS PAIRED ARROWS
+.. |rsh|      unicode:: U+021B1 .. UPWARDS ARROW WITH TIP RIGHTWARDS
+.. |ruluhar|  unicode:: U+02968 .. RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP
+.. |searhk|   unicode:: U+02925 .. SOUTH EAST ARROW WITH HOOK
+.. |seArr|    unicode:: U+021D8 .. SOUTH EAST DOUBLE ARROW
+.. |searr|    unicode:: U+02198 .. SOUTH EAST ARROW
+.. |seswar|   unicode:: U+02929 .. SOUTH EAST ARROW AND SOUTH WEST ARROW
+.. |simrarr|  unicode:: U+02972 .. TILDE OPERATOR ABOVE RIGHTWARDS ARROW
+.. |slarr|    unicode:: U+02190 .. LEFTWARDS ARROW
+.. |srarr|    unicode:: U+02192 .. RIGHTWARDS ARROW
+.. |swarhk|   unicode:: U+02926 .. SOUTH WEST ARROW WITH HOOK
+.. |swArr|    unicode:: U+021D9 .. SOUTH WEST DOUBLE ARROW
+.. |swarr|    unicode:: U+02199 .. SOUTH WEST ARROW
+.. |swnwar|   unicode:: U+0292A .. SOUTH WEST ARROW AND NORTH WEST ARROW
+.. |Uarr|     unicode:: U+0219F .. UPWARDS TWO HEADED ARROW
+.. |uArr|     unicode:: U+021D1 .. UPWARDS DOUBLE ARROW
+.. |uarr2|    unicode:: U+021C8 .. UPWARDS PAIRED ARROWS
+.. |Uarrocir| unicode:: U+02949 .. UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE
+.. |udarr|    unicode:: U+021C5 .. UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW
+.. |udhar|    unicode:: U+0296E .. UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT
+.. |ufisht|   unicode:: U+0297E .. UP FISH TAIL
+.. |uHar|     unicode:: U+02963 .. UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT
+.. |uharl|    unicode:: U+021BF .. UPWARDS HARPOON WITH BARB LEFTWARDS
+.. |uharr|    unicode:: U+021BE .. UPWARDS HARPOON WITH BARB RIGHTWARDS
+.. |uuarr|    unicode:: U+021C8 .. UPWARDS PAIRED ARROWS
+.. |vArr|     unicode:: U+021D5 .. UP DOWN DOUBLE ARROW
+.. |varr|     unicode:: U+02195 .. UP DOWN ARROW
+.. |xhArr|    unicode:: U+027FA .. LONG LEFT RIGHT DOUBLE ARROW
+.. |xharr|    unicode:: U+027F7 .. LONG LEFT RIGHT ARROW
+.. |xlArr|    unicode:: U+027F8 .. LONG LEFTWARDS DOUBLE ARROW
+.. |xlarr|    unicode:: U+027F5 .. LONG LEFTWARDS ARROW
+.. |xmap|     unicode:: U+027FC .. LONG RIGHTWARDS ARROW FROM BAR
+.. |xrArr|    unicode:: U+027F9 .. LONG RIGHTWARDS DOUBLE ARROW
+.. |xrarr|    unicode:: U+027F6 .. LONG RIGHTWARDS ARROW
+.. |zigrarr|  unicode:: U+021DD .. RIGHTWARDS SQUIGGLE ARROW
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isoamsb.txt
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isoamsb.txt (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isoamsb.txt (revision 3)
@@ -0,0 +1,126 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |ac|       unicode:: U+0223E .. INVERTED LAZY S
+.. |acE|      unicode:: U+0223E U+00333 .. INVERTED LAZY S with double underline
+.. |amalg|    unicode:: U+02A3F .. AMALGAMATION OR COPRODUCT
+.. |barvee|   unicode:: U+022BD .. NOR
+.. |Barwed|   unicode:: U+02306 .. PERSPECTIVE
+.. |barwed|   unicode:: U+02305 .. PROJECTIVE
+.. |bsolb|    unicode:: U+029C5 .. SQUARED FALLING DIAGONAL SLASH
+.. |Cap|      unicode:: U+022D2 .. DOUBLE INTERSECTION
+.. |capand|   unicode:: U+02A44 .. INTERSECTION WITH LOGICAL AND
+.. |capbrcup| unicode:: U+02A49 .. INTERSECTION ABOVE BAR ABOVE UNION
+.. |capcap|   unicode:: U+02A4B .. INTERSECTION BESIDE AND JOINED WITH INTERSECTION
+.. |capcup|   unicode:: U+02A47 .. INTERSECTION ABOVE UNION
+.. |capdot|   unicode:: U+02A40 .. INTERSECTION WITH DOT
+.. |caps|     unicode:: U+02229 U+0FE00 .. INTERSECTION with serifs
+.. |ccaps|    unicode:: U+02A4D .. CLOSED INTERSECTION WITH SERIFS
+.. |ccups|    unicode:: U+02A4C .. CLOSED UNION WITH SERIFS
+.. |ccupssm|  unicode:: U+02A50 .. CLOSED UNION WITH SERIFS AND SMASH PRODUCT
+.. |coprod|   unicode:: U+02210 .. N-ARY COPRODUCT
+.. |Cup|      unicode:: U+022D3 .. DOUBLE UNION
+.. |cupbrcap| unicode:: U+02A48 .. UNION ABOVE BAR ABOVE INTERSECTION
+.. |cupcap|   unicode:: U+02A46 .. UNION ABOVE INTERSECTION
+.. |cupcup|   unicode:: U+02A4A .. UNION BESIDE AND JOINED WITH UNION
+.. |cupdot|   unicode:: U+0228D .. MULTISET MULTIPLICATION
+.. |cupor|    unicode:: U+02A45 .. UNION WITH LOGICAL OR
+.. |cups|     unicode:: U+0222A U+0FE00 .. UNION with serifs
+.. |cuvee|    unicode:: U+022CE .. CURLY LOGICAL OR
+.. |cuwed|    unicode:: U+022CF .. CURLY LOGICAL AND
+.. |Dagger|   unicode:: U+02021 .. DOUBLE DAGGER
+.. |dagger|   unicode:: U+02020 .. DAGGER
+.. |diam|     unicode:: U+022C4 .. DIAMOND OPERATOR
+.. |divonx|   unicode:: U+022C7 .. DIVISION TIMES
+.. |eplus|    unicode:: U+02A71 .. EQUALS SIGN ABOVE PLUS SIGN
+.. |hercon|   unicode:: U+022B9 .. HERMITIAN CONJUGATE MATRIX
+.. |intcal|   unicode:: U+022BA .. INTERCALATE
+.. |iprod|    unicode:: U+02A3C .. INTERIOR PRODUCT
+.. |loplus|   unicode:: U+02A2D .. PLUS SIGN IN LEFT HALF CIRCLE
+.. |lotimes|  unicode:: U+02A34 .. MULTIPLICATION SIGN IN LEFT HALF CIRCLE
+.. |lthree|   unicode:: U+022CB .. LEFT SEMIDIRECT PRODUCT
+.. |ltimes|   unicode:: U+022C9 .. LEFT NORMAL FACTOR SEMIDIRECT PRODUCT
+.. |midast|   unicode:: U+0002A .. ASTERISK
+.. |minusb|   unicode:: U+0229F .. SQUARED MINUS
+.. |minusd|   unicode:: U+02238 .. DOT MINUS
+.. |minusdu|  unicode:: U+02A2A .. MINUS SIGN WITH DOT BELOW
+.. |ncap|     unicode:: U+02A43 .. INTERSECTION WITH OVERBAR
+.. |ncup|     unicode:: U+02A42 .. UNION WITH OVERBAR
+.. |oast|     unicode:: U+0229B .. CIRCLED ASTERISK OPERATOR
+.. |ocir|     unicode:: U+0229A .. CIRCLED RING OPERATOR
+.. |odash|    unicode:: U+0229D .. CIRCLED DASH
+.. |odiv|     unicode:: U+02A38 .. CIRCLED DIVISION SIGN
+.. |odot|     unicode:: U+02299 .. CIRCLED DOT OPERATOR
+.. |odsold|   unicode:: U+029BC .. CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN
+.. |ofcir|    unicode:: U+029BF .. CIRCLED BULLET
+.. |ogt|      unicode:: U+029C1 .. CIRCLED GREATER-THAN
+.. |ohbar|    unicode:: U+029B5 .. CIRCLE WITH HORIZONTAL BAR
+.. |olcir|    unicode:: U+029BE .. CIRCLED WHITE BULLET
+.. |olt|      unicode:: U+029C0 .. CIRCLED LESS-THAN
+.. |omid|     unicode:: U+029B6 .. CIRCLED VERTICAL BAR
+.. |ominus|   unicode:: U+02296 .. CIRCLED MINUS
+.. |opar|     unicode:: U+029B7 .. CIRCLED PARALLEL
+.. |operp|    unicode:: U+029B9 .. CIRCLED PERPENDICULAR
+.. |oplus|    unicode:: U+02295 .. CIRCLED PLUS
+.. |osol|     unicode:: U+02298 .. CIRCLED DIVISION SLASH
+.. |Otimes|   unicode:: U+02A37 .. MULTIPLICATION SIGN IN DOUBLE CIRCLE
+.. |otimes|   unicode:: U+02297 .. CIRCLED TIMES
+.. |otimesas| unicode:: U+02A36 .. CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT
+.. |ovbar|    unicode:: U+0233D .. APL FUNCTIONAL SYMBOL CIRCLE STILE
+.. |plusacir| unicode:: U+02A23 .. PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE
+.. |plusb|    unicode:: U+0229E .. SQUARED PLUS
+.. |pluscir|  unicode:: U+02A22 .. PLUS SIGN WITH SMALL CIRCLE ABOVE
+.. |plusdo|   unicode:: U+02214 .. DOT PLUS
+.. |plusdu|   unicode:: U+02A25 .. PLUS SIGN WITH DOT BELOW
+.. |pluse|    unicode:: U+02A72 .. PLUS SIGN ABOVE EQUALS SIGN
+.. |plussim|  unicode:: U+02A26 .. PLUS SIGN WITH TILDE BELOW
+.. |plustwo|  unicode:: U+02A27 .. PLUS SIGN WITH SUBSCRIPT TWO
+.. |prod|     unicode:: U+0220F .. N-ARY PRODUCT
+.. |race|     unicode:: U+029DA .. LEFT DOUBLE WIGGLY FENCE
+.. |roplus|   unicode:: U+02A2E .. PLUS SIGN IN RIGHT HALF CIRCLE
+.. |rotimes|  unicode:: U+02A35 .. MULTIPLICATION SIGN IN RIGHT HALF CIRCLE
+.. |rthree|   unicode:: U+022CC .. RIGHT SEMIDIRECT PRODUCT
+.. |rtimes|   unicode:: U+022CA .. RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT
+.. |sdot|     unicode:: U+022C5 .. DOT OPERATOR
+.. |sdotb|    unicode:: U+022A1 .. SQUARED DOT OPERATOR
+.. |setmn|    unicode:: U+02216 .. SET MINUS
+.. |simplus|  unicode:: U+02A24 .. PLUS SIGN WITH TILDE ABOVE
+.. |smashp|   unicode:: U+02A33 .. SMASH PRODUCT
+.. |solb|     unicode:: U+029C4 .. SQUARED RISING DIAGONAL SLASH
+.. |sqcap|    unicode:: U+02293 .. SQUARE CAP
+.. |sqcaps|   unicode:: U+02293 U+0FE00 .. SQUARE CAP with serifs
+.. |sqcup|    unicode:: U+02294 .. SQUARE CUP
+.. |sqcups|   unicode:: U+02294 U+0FE00 .. SQUARE CUP with serifs
+.. |ssetmn|   unicode:: U+02216 .. SET MINUS
+.. |sstarf|   unicode:: U+022C6 .. STAR OPERATOR
+.. |subdot|   unicode:: U+02ABD .. SUBSET WITH DOT
+.. |sum|      unicode:: U+02211 .. N-ARY SUMMATION
+.. |supdot|   unicode:: U+02ABE .. SUPERSET WITH DOT
+.. |timesb|   unicode:: U+022A0 .. SQUARED TIMES
+.. |timesbar| unicode:: U+02A31 .. MULTIPLICATION SIGN WITH UNDERBAR
+.. |timesd|   unicode:: U+02A30 .. MULTIPLICATION SIGN WITH DOT ABOVE
+.. |top|      unicode:: U+022A4 .. DOWN TACK
+.. |tridot|   unicode:: U+025EC .. WHITE UP-POINTING TRIANGLE WITH DOT
+.. |triminus| unicode:: U+02A3A .. MINUS SIGN IN TRIANGLE
+.. |triplus|  unicode:: U+02A39 .. PLUS SIGN IN TRIANGLE
+.. |trisb|    unicode:: U+029CD .. TRIANGLE WITH SERIFS AT BOTTOM
+.. |tritime|  unicode:: U+02A3B .. MULTIPLICATION SIGN IN TRIANGLE
+.. |uplus|    unicode:: U+0228E .. MULTISET UNION
+.. |veebar|   unicode:: U+022BB .. XOR
+.. |wedbar|   unicode:: U+02A5F .. LOGICAL AND WITH UNDERBAR
+.. |wreath|   unicode:: U+02240 .. WREATH PRODUCT
+.. |xcap|     unicode:: U+022C2 .. N-ARY INTERSECTION
+.. |xcirc|    unicode:: U+025EF .. LARGE CIRCLE
+.. |xcup|     unicode:: U+022C3 .. N-ARY UNION
+.. |xdtri|    unicode:: U+025BD .. WHITE DOWN-POINTING TRIANGLE
+.. |xodot|    unicode:: U+02A00 .. N-ARY CIRCLED DOT OPERATOR
+.. |xoplus|   unicode:: U+02A01 .. N-ARY CIRCLED PLUS OPERATOR
+.. |xotime|   unicode:: U+02A02 .. N-ARY CIRCLED TIMES OPERATOR
+.. |xsqcup|   unicode:: U+02A06 .. N-ARY SQUARE UNION OPERATOR
+.. |xuplus|   unicode:: U+02A04 .. N-ARY UNION OPERATOR WITH PLUS
+.. |xutri|    unicode:: U+025B3 .. WHITE UP-POINTING TRIANGLE
+.. |xvee|     unicode:: U+022C1 .. N-ARY LOGICAL OR
+.. |xwedge|   unicode:: U+022C0 .. N-ARY LOGICAL AND
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isoamsc.txt
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isoamsc.txt (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isoamsc.txt (revision 3)
@@ -0,0 +1,29 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |dlcorn|  unicode:: U+0231E .. BOTTOM LEFT CORNER
+.. |drcorn|  unicode:: U+0231F .. BOTTOM RIGHT CORNER
+.. |gtlPar|  unicode:: U+02995 .. DOUBLE LEFT ARC GREATER-THAN BRACKET
+.. |langd|   unicode:: U+02991 .. LEFT ANGLE BRACKET WITH DOT
+.. |lbrke|   unicode:: U+0298B .. LEFT SQUARE BRACKET WITH UNDERBAR
+.. |lbrksld| unicode:: U+0298F .. LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+.. |lbrkslu| unicode:: U+0298D .. LEFT SQUARE BRACKET WITH TICK IN TOP CORNER
+.. |lceil|   unicode:: U+02308 .. LEFT CEILING
+.. |lfloor|  unicode:: U+0230A .. LEFT FLOOR
+.. |lmoust|  unicode:: U+023B0 .. UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION
+.. |lpargt|  unicode:: U+029A0 .. SPHERICAL ANGLE OPENING LEFT
+.. |lparlt|  unicode:: U+02993 .. LEFT ARC LESS-THAN BRACKET
+.. |ltrPar|  unicode:: U+02996 .. DOUBLE RIGHT ARC LESS-THAN BRACKET
+.. |rangd|   unicode:: U+02992 .. RIGHT ANGLE BRACKET WITH DOT
+.. |rbrke|   unicode:: U+0298C .. RIGHT SQUARE BRACKET WITH UNDERBAR
+.. |rbrksld| unicode:: U+0298E .. RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+.. |rbrkslu| unicode:: U+02990 .. RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER
+.. |rceil|   unicode:: U+02309 .. RIGHT CEILING
+.. |rfloor|  unicode:: U+0230B .. RIGHT FLOOR
+.. |rmoust|  unicode:: U+023B1 .. UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION
+.. |rpargt|  unicode:: U+02994 .. RIGHT ARC GREATER-THAN BRACKET
+.. |ulcorn|  unicode:: U+0231C .. TOP LEFT CORNER
+.. |urcorn|  unicode:: U+0231D .. TOP RIGHT CORNER
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/mmlalias.txt
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/mmlalias.txt (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/mmlalias.txt (revision 3)
@@ -0,0 +1,554 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |angle|                           unicode:: U+02220 .. ANGLE
+.. |ApplyFunction|                   unicode:: U+02061 .. FUNCTION APPLICATION
+.. |approx|                          unicode:: U+02248 .. ALMOST EQUAL TO
+.. |approxeq|                        unicode:: U+0224A .. ALMOST EQUAL OR EQUAL TO
+.. |Assign|                          unicode:: U+02254 .. COLON EQUALS
+.. |backcong|                        unicode:: U+0224C .. ALL EQUAL TO
+.. |backepsilon|                     unicode:: U+003F6 .. GREEK REVERSED LUNATE EPSILON SYMBOL
+.. |backprime|                       unicode:: U+02035 .. REVERSED PRIME
+.. |backsim|                         unicode:: U+0223D .. REVERSED TILDE
+.. |backsimeq|                       unicode:: U+022CD .. REVERSED TILDE EQUALS
+.. |Backslash|                       unicode:: U+02216 .. SET MINUS
+.. |barwedge|                        unicode:: U+02305 .. PROJECTIVE
+.. |Because|                         unicode:: U+02235 .. BECAUSE
+.. |because|                         unicode:: U+02235 .. BECAUSE
+.. |Bernoullis|                      unicode:: U+0212C .. SCRIPT CAPITAL B
+.. |between|                         unicode:: U+0226C .. BETWEEN
+.. |bigcap|                          unicode:: U+022C2 .. N-ARY INTERSECTION
+.. |bigcirc|                         unicode:: U+025EF .. LARGE CIRCLE
+.. |bigcup|                          unicode:: U+022C3 .. N-ARY UNION
+.. |bigodot|                         unicode:: U+02A00 .. N-ARY CIRCLED DOT OPERATOR
+.. |bigoplus|                        unicode:: U+02A01 .. N-ARY CIRCLED PLUS OPERATOR
+.. |bigotimes|                       unicode:: U+02A02 .. N-ARY CIRCLED TIMES OPERATOR
+.. |bigsqcup|                        unicode:: U+02A06 .. N-ARY SQUARE UNION OPERATOR
+.. |bigstar|                         unicode:: U+02605 .. BLACK STAR
+.. |bigtriangledown|                 unicode:: U+025BD .. WHITE DOWN-POINTING TRIANGLE
+.. |bigtriangleup|                   unicode:: U+025B3 .. WHITE UP-POINTING TRIANGLE
+.. |biguplus|                        unicode:: U+02A04 .. N-ARY UNION OPERATOR WITH PLUS
+.. |bigvee|                          unicode:: U+022C1 .. N-ARY LOGICAL OR
+.. |bigwedge|                        unicode:: U+022C0 .. N-ARY LOGICAL AND
+.. |bkarow|                          unicode:: U+0290D .. RIGHTWARDS DOUBLE DASH ARROW
+.. |blacklozenge|                    unicode:: U+029EB .. BLACK LOZENGE
+.. |blacksquare|                     unicode:: U+025AA .. BLACK SMALL SQUARE
+.. |blacktriangle|                   unicode:: U+025B4 .. BLACK UP-POINTING SMALL TRIANGLE
+.. |blacktriangledown|               unicode:: U+025BE .. BLACK DOWN-POINTING SMALL TRIANGLE
+.. |blacktriangleleft|               unicode:: U+025C2 .. BLACK LEFT-POINTING SMALL TRIANGLE
+.. |blacktriangleright|              unicode:: U+025B8 .. BLACK RIGHT-POINTING SMALL TRIANGLE
+.. |bot|                             unicode:: U+022A5 .. UP TACK
+.. |boxminus|                        unicode:: U+0229F .. SQUARED MINUS
+.. |boxplus|                         unicode:: U+0229E .. SQUARED PLUS
+.. |boxtimes|                        unicode:: U+022A0 .. SQUARED TIMES
+.. |Breve|                           unicode:: U+002D8 .. BREVE
+.. |bullet|                          unicode:: U+02022 .. BULLET
+.. |Bumpeq|                          unicode:: U+0224E .. GEOMETRICALLY EQUIVALENT TO
+.. |bumpeq|                          unicode:: U+0224F .. DIFFERENCE BETWEEN
+.. |CapitalDifferentialD|            unicode:: U+02145 .. DOUBLE-STRUCK ITALIC CAPITAL D
+.. |Cayleys|                         unicode:: U+0212D .. BLACK-LETTER CAPITAL C
+.. |Cedilla|                         unicode:: U+000B8 .. CEDILLA
+.. |CenterDot|                       unicode:: U+000B7 .. MIDDLE DOT
+.. |centerdot|                       unicode:: U+000B7 .. MIDDLE DOT
+.. |checkmark|                       unicode:: U+02713 .. CHECK MARK
+.. |circeq|                          unicode:: U+02257 .. RING EQUAL TO
+.. |circlearrowleft|                 unicode:: U+021BA .. ANTICLOCKWISE OPEN CIRCLE ARROW
+.. |circlearrowright|                unicode:: U+021BB .. CLOCKWISE OPEN CIRCLE ARROW
+.. |circledast|                      unicode:: U+0229B .. CIRCLED ASTERISK OPERATOR
+.. |circledcirc|                     unicode:: U+0229A .. CIRCLED RING OPERATOR
+.. |circleddash|                     unicode:: U+0229D .. CIRCLED DASH
+.. |CircleDot|                       unicode:: U+02299 .. CIRCLED DOT OPERATOR
+.. |circledR|                        unicode:: U+000AE .. REGISTERED SIGN
+.. |circledS|                        unicode:: U+024C8 .. CIRCLED LATIN CAPITAL LETTER S
+.. |CircleMinus|                     unicode:: U+02296 .. CIRCLED MINUS
+.. |CirclePlus|                      unicode:: U+02295 .. CIRCLED PLUS
+.. |CircleTimes|                     unicode:: U+02297 .. CIRCLED TIMES
+.. |ClockwiseContourIntegral|        unicode:: U+02232 .. CLOCKWISE CONTOUR INTEGRAL
+.. |CloseCurlyDoubleQuote|           unicode:: U+0201D .. RIGHT DOUBLE QUOTATION MARK
+.. |CloseCurlyQuote|                 unicode:: U+02019 .. RIGHT SINGLE QUOTATION MARK
+.. |clubsuit|                        unicode:: U+02663 .. BLACK CLUB SUIT
+.. |coloneq|                         unicode:: U+02254 .. COLON EQUALS
+.. |complement|                      unicode:: U+02201 .. COMPLEMENT
+.. |complexes|                       unicode:: U+02102 .. DOUBLE-STRUCK CAPITAL C
+.. |Congruent|                       unicode:: U+02261 .. IDENTICAL TO
+.. |ContourIntegral|                 unicode:: U+0222E .. CONTOUR INTEGRAL
+.. |Coproduct|                       unicode:: U+02210 .. N-ARY COPRODUCT
+.. |CounterClockwiseContourIntegral| unicode:: U+02233 .. ANTICLOCKWISE CONTOUR INTEGRAL
+.. |CupCap|                          unicode:: U+0224D .. EQUIVALENT TO
+.. |curlyeqprec|                     unicode:: U+022DE .. EQUAL TO OR PRECEDES
+.. |curlyeqsucc|                     unicode:: U+022DF .. EQUAL TO OR SUCCEEDS
+.. |curlyvee|                        unicode:: U+022CE .. CURLY LOGICAL OR
+.. |curlywedge|                      unicode:: U+022CF .. CURLY LOGICAL AND
+.. |curvearrowleft|                  unicode:: U+021B6 .. ANTICLOCKWISE TOP SEMICIRCLE ARROW
+.. |curvearrowright|                 unicode:: U+021B7 .. CLOCKWISE TOP SEMICIRCLE ARROW
+.. |dbkarow|                         unicode:: U+0290F .. RIGHTWARDS TRIPLE DASH ARROW
+.. |ddagger|                         unicode:: U+02021 .. DOUBLE DAGGER
+.. |ddotseq|                         unicode:: U+02A77 .. EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW
+.. |Del|                             unicode:: U+02207 .. NABLA
+.. |DiacriticalAcute|                unicode:: U+000B4 .. ACUTE ACCENT
+.. |DiacriticalDot|                  unicode:: U+002D9 .. DOT ABOVE
+.. |DiacriticalDoubleAcute|          unicode:: U+002DD .. DOUBLE ACUTE ACCENT
+.. |DiacriticalGrave|                unicode:: U+00060 .. GRAVE ACCENT
+.. |DiacriticalTilde|                unicode:: U+002DC .. SMALL TILDE
+.. |Diamond|                         unicode:: U+022C4 .. DIAMOND OPERATOR
+.. |diamond|                         unicode:: U+022C4 .. DIAMOND OPERATOR
+.. |diamondsuit|                     unicode:: U+02666 .. BLACK DIAMOND SUIT
+.. |DifferentialD|                   unicode:: U+02146 .. DOUBLE-STRUCK ITALIC SMALL D
+.. |digamma|                         unicode:: U+003DD .. GREEK SMALL LETTER DIGAMMA
+.. |div|                             unicode:: U+000F7 .. DIVISION SIGN
+.. |divideontimes|                   unicode:: U+022C7 .. DIVISION TIMES
+.. |doteq|                           unicode:: U+02250 .. APPROACHES THE LIMIT
+.. |doteqdot|                        unicode:: U+02251 .. GEOMETRICALLY EQUAL TO
+.. |DotEqual|                        unicode:: U+02250 .. APPROACHES THE LIMIT
+.. |dotminus|                        unicode:: U+02238 .. DOT MINUS
+.. |dotplus|                         unicode:: U+02214 .. DOT PLUS
+.. |dotsquare|                       unicode:: U+022A1 .. SQUARED DOT OPERATOR
+.. |doublebarwedge|                  unicode:: U+02306 .. PERSPECTIVE
+.. |DoubleContourIntegral|           unicode:: U+0222F .. SURFACE INTEGRAL
+.. |DoubleDot|                       unicode:: U+000A8 .. DIAERESIS
+.. |DoubleDownArrow|                 unicode:: U+021D3 .. DOWNWARDS DOUBLE ARROW
+.. |DoubleLeftArrow|                 unicode:: U+021D0 .. LEFTWARDS DOUBLE ARROW
+.. |DoubleLeftRightArrow|            unicode:: U+021D4 .. LEFT RIGHT DOUBLE ARROW
+.. |DoubleLeftTee|                   unicode:: U+02AE4 .. VERTICAL BAR DOUBLE LEFT TURNSTILE
+.. |DoubleLongLeftArrow|             unicode:: U+027F8 .. LONG LEFTWARDS DOUBLE ARROW
+.. |DoubleLongLeftRightArrow|        unicode:: U+027FA .. LONG LEFT RIGHT DOUBLE ARROW
+.. |DoubleLongRightArrow|            unicode:: U+027F9 .. LONG RIGHTWARDS DOUBLE ARROW
+.. |DoubleRightArrow|                unicode:: U+021D2 .. RIGHTWARDS DOUBLE ARROW
+.. |DoubleRightTee|                  unicode:: U+022A8 .. TRUE
+.. |DoubleUpArrow|                   unicode:: U+021D1 .. UPWARDS DOUBLE ARROW
+.. |DoubleUpDownArrow|               unicode:: U+021D5 .. UP DOWN DOUBLE ARROW
+.. |DoubleVerticalBar|               unicode:: U+02225 .. PARALLEL TO
+.. |DownArrow|                       unicode:: U+02193 .. DOWNWARDS ARROW
+.. |Downarrow|                       unicode:: U+021D3 .. DOWNWARDS DOUBLE ARROW
+.. |downarrow|                       unicode:: U+02193 .. DOWNWARDS ARROW
+.. |DownArrowUpArrow|                unicode:: U+021F5 .. DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW
+.. |downdownarrows|                  unicode:: U+021CA .. DOWNWARDS PAIRED ARROWS
+.. |downharpoonleft|                 unicode:: U+021C3 .. DOWNWARDS HARPOON WITH BARB LEFTWARDS
+.. |downharpoonright|                unicode:: U+021C2 .. DOWNWARDS HARPOON WITH BARB RIGHTWARDS
+.. |DownLeftVector|                  unicode:: U+021BD .. LEFTWARDS HARPOON WITH BARB DOWNWARDS
+.. |DownRightVector|                 unicode:: U+021C1 .. RIGHTWARDS HARPOON WITH BARB DOWNWARDS
+.. |DownTee|                         unicode:: U+022A4 .. DOWN TACK
+.. |DownTeeArrow|                    unicode:: U+021A7 .. DOWNWARDS ARROW FROM BAR
+.. |drbkarow|                        unicode:: U+02910 .. RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW
+.. |Element|                         unicode:: U+02208 .. ELEMENT OF
+.. |emptyset|                        unicode:: U+02205 .. EMPTY SET
+.. |eqcirc|                          unicode:: U+02256 .. RING IN EQUAL TO
+.. |eqcolon|                         unicode:: U+02255 .. EQUALS COLON
+.. |eqsim|                           unicode:: U+02242 .. MINUS TILDE
+.. |eqslantgtr|                      unicode:: U+02A96 .. SLANTED EQUAL TO OR GREATER-THAN
+.. |eqslantless|                     unicode:: U+02A95 .. SLANTED EQUAL TO OR LESS-THAN
+.. |EqualTilde|                      unicode:: U+02242 .. MINUS TILDE
+.. |Equilibrium|                     unicode:: U+021CC .. RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON
+.. |Exists|                          unicode:: U+02203 .. THERE EXISTS
+.. |expectation|                     unicode:: U+02130 .. SCRIPT CAPITAL E
+.. |ExponentialE|                    unicode:: U+02147 .. DOUBLE-STRUCK ITALIC SMALL E
+.. |exponentiale|                    unicode:: U+02147 .. DOUBLE-STRUCK ITALIC SMALL E
+.. |fallingdotseq|                   unicode:: U+02252 .. APPROXIMATELY EQUAL TO OR THE IMAGE OF
+.. |ForAll|                          unicode:: U+02200 .. FOR ALL
+.. |Fouriertrf|                      unicode:: U+02131 .. SCRIPT CAPITAL F
+.. |geq|                             unicode:: U+02265 .. GREATER-THAN OR EQUAL TO
+.. |geqq|                            unicode:: U+02267 .. GREATER-THAN OVER EQUAL TO
+.. |geqslant|                        unicode:: U+02A7E .. GREATER-THAN OR SLANTED EQUAL TO
+.. |gg|                              unicode:: U+0226B .. MUCH GREATER-THAN
+.. |ggg|                             unicode:: U+022D9 .. VERY MUCH GREATER-THAN
+.. |gnapprox|                        unicode:: U+02A8A .. GREATER-THAN AND NOT APPROXIMATE
+.. |gneq|                            unicode:: U+02A88 .. GREATER-THAN AND SINGLE-LINE NOT EQUAL TO
+.. |gneqq|                           unicode:: U+02269 .. GREATER-THAN BUT NOT EQUAL TO
+.. |GreaterEqual|                    unicode:: U+02265 .. GREATER-THAN OR EQUAL TO
+.. |GreaterEqualLess|                unicode:: U+022DB .. GREATER-THAN EQUAL TO OR LESS-THAN
+.. |GreaterFullEqual|                unicode:: U+02267 .. GREATER-THAN OVER EQUAL TO
+.. |GreaterLess|                     unicode:: U+02277 .. GREATER-THAN OR LESS-THAN
+.. |GreaterSlantEqual|               unicode:: U+02A7E .. GREATER-THAN OR SLANTED EQUAL TO
+.. |GreaterTilde|                    unicode:: U+02273 .. GREATER-THAN OR EQUIVALENT TO
+.. |gtrapprox|                       unicode:: U+02A86 .. GREATER-THAN OR APPROXIMATE
+.. |gtrdot|                          unicode:: U+022D7 .. GREATER-THAN WITH DOT
+.. |gtreqless|                       unicode:: U+022DB .. GREATER-THAN EQUAL TO OR LESS-THAN
+.. |gtreqqless|                      unicode:: U+02A8C .. GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN
+.. |gtrless|                         unicode:: U+02277 .. GREATER-THAN OR LESS-THAN
+.. |gtrsim|                          unicode:: U+02273 .. GREATER-THAN OR EQUIVALENT TO
+.. |gvertneqq|                       unicode:: U+02269 U+0FE00 .. GREATER-THAN BUT NOT EQUAL TO - with vertical stroke
+.. |Hacek|                           unicode:: U+002C7 .. CARON
+.. |hbar|                            unicode:: U+0210F .. PLANCK CONSTANT OVER TWO PI
+.. |heartsuit|                       unicode:: U+02665 .. BLACK HEART SUIT
+.. |HilbertSpace|                    unicode:: U+0210B .. SCRIPT CAPITAL H
+.. |hksearow|                        unicode:: U+02925 .. SOUTH EAST ARROW WITH HOOK
+.. |hkswarow|                        unicode:: U+02926 .. SOUTH WEST ARROW WITH HOOK
+.. |hookleftarrow|                   unicode:: U+021A9 .. LEFTWARDS ARROW WITH HOOK
+.. |hookrightarrow|                  unicode:: U+021AA .. RIGHTWARDS ARROW WITH HOOK
+.. |hslash|                          unicode:: U+0210F .. PLANCK CONSTANT OVER TWO PI
+.. |HumpDownHump|                    unicode:: U+0224E .. GEOMETRICALLY EQUIVALENT TO
+.. |HumpEqual|                       unicode:: U+0224F .. DIFFERENCE BETWEEN
+.. |iiiint|                          unicode:: U+02A0C .. QUADRUPLE INTEGRAL OPERATOR
+.. |iiint|                           unicode:: U+0222D .. TRIPLE INTEGRAL
+.. |Im|                              unicode:: U+02111 .. BLACK-LETTER CAPITAL I
+.. |ImaginaryI|                      unicode:: U+02148 .. DOUBLE-STRUCK ITALIC SMALL I
+.. |imagline|                        unicode:: U+02110 .. SCRIPT CAPITAL I
+.. |imagpart|                        unicode:: U+02111 .. BLACK-LETTER CAPITAL I
+.. |Implies|                         unicode:: U+021D2 .. RIGHTWARDS DOUBLE ARROW
+.. |in|                              unicode:: U+02208 .. ELEMENT OF
+.. |integers|                        unicode:: U+02124 .. DOUBLE-STRUCK CAPITAL Z
+.. |Integral|                        unicode:: U+0222B .. INTEGRAL
+.. |intercal|                        unicode:: U+022BA .. INTERCALATE
+.. |Intersection|                    unicode:: U+022C2 .. N-ARY INTERSECTION
+.. |intprod|                         unicode:: U+02A3C .. INTERIOR PRODUCT
+.. |InvisibleComma|                  unicode:: U+02063 .. INVISIBLE SEPARATOR
+.. |InvisibleTimes|                  unicode:: U+02062 .. INVISIBLE TIMES
+.. |langle|                          unicode:: U+02329 .. LEFT-POINTING ANGLE BRACKET
+.. |Laplacetrf|                      unicode:: U+02112 .. SCRIPT CAPITAL L
+.. |lbrace|                          unicode:: U+0007B .. LEFT CURLY BRACKET
+.. |lbrack|                          unicode:: U+0005B .. LEFT SQUARE BRACKET
+.. |LeftAngleBracket|                unicode:: U+02329 .. LEFT-POINTING ANGLE BRACKET
+.. |LeftArrow|                       unicode:: U+02190 .. LEFTWARDS ARROW
+.. |Leftarrow|                       unicode:: U+021D0 .. LEFTWARDS DOUBLE ARROW
+.. |leftarrow|                       unicode:: U+02190 .. LEFTWARDS ARROW
+.. |LeftArrowBar|                    unicode:: U+021E4 .. LEFTWARDS ARROW TO BAR
+.. |LeftArrowRightArrow|             unicode:: U+021C6 .. LEFTWARDS ARROW OVER RIGHTWARDS ARROW
+.. |leftarrowtail|                   unicode:: U+021A2 .. LEFTWARDS ARROW WITH TAIL
+.. |LeftCeiling|                     unicode:: U+02308 .. LEFT CEILING
+.. |LeftDoubleBracket|               unicode:: U+0301A .. LEFT WHITE SQUARE BRACKET
+.. |LeftDownVector|                  unicode:: U+021C3 .. DOWNWARDS HARPOON WITH BARB LEFTWARDS
+.. |LeftFloor|                       unicode:: U+0230A .. LEFT FLOOR
+.. |leftharpoondown|                 unicode:: U+021BD .. LEFTWARDS HARPOON WITH BARB DOWNWARDS
+.. |leftharpoonup|                   unicode:: U+021BC .. LEFTWARDS HARPOON WITH BARB UPWARDS
+.. |leftleftarrows|                  unicode:: U+021C7 .. LEFTWARDS PAIRED ARROWS
+.. |LeftRightArrow|                  unicode:: U+02194 .. LEFT RIGHT ARROW
+.. |Leftrightarrow|                  unicode:: U+021D4 .. LEFT RIGHT DOUBLE ARROW
+.. |leftrightarrow|                  unicode:: U+02194 .. LEFT RIGHT ARROW
+.. |leftrightarrows|                 unicode:: U+021C6 .. LEFTWARDS ARROW OVER RIGHTWARDS ARROW
+.. |leftrightharpoons|               unicode:: U+021CB .. LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON
+.. |leftrightsquigarrow|             unicode:: U+021AD .. LEFT RIGHT WAVE ARROW
+.. |LeftTee|                         unicode:: U+022A3 .. LEFT TACK
+.. |LeftTeeArrow|                    unicode:: U+021A4 .. LEFTWARDS ARROW FROM BAR
+.. |leftthreetimes|                  unicode:: U+022CB .. LEFT SEMIDIRECT PRODUCT
+.. |LeftTriangle|                    unicode:: U+022B2 .. NORMAL SUBGROUP OF
+.. |LeftTriangleEqual|               unicode:: U+022B4 .. NORMAL SUBGROUP OF OR EQUAL TO
+.. |LeftUpVector|                    unicode:: U+021BF .. UPWARDS HARPOON WITH BARB LEFTWARDS
+.. |LeftVector|                      unicode:: U+021BC .. LEFTWARDS HARPOON WITH BARB UPWARDS
+.. |leq|                             unicode:: U+02264 .. LESS-THAN OR EQUAL TO
+.. |leqq|                            unicode:: U+02266 .. LESS-THAN OVER EQUAL TO
+.. |leqslant|                        unicode:: U+02A7D .. LESS-THAN OR SLANTED EQUAL TO
+.. |lessapprox|                      unicode:: U+02A85 .. LESS-THAN OR APPROXIMATE
+.. |lessdot|                         unicode:: U+022D6 .. LESS-THAN WITH DOT
+.. |lesseqgtr|                       unicode:: U+022DA .. LESS-THAN EQUAL TO OR GREATER-THAN
+.. |lesseqqgtr|                      unicode:: U+02A8B .. LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN
+.. |LessEqualGreater|                unicode:: U+022DA .. LESS-THAN EQUAL TO OR GREATER-THAN
+.. |LessFullEqual|                   unicode:: U+02266 .. LESS-THAN OVER EQUAL TO
+.. |LessGreater|                     unicode:: U+02276 .. LESS-THAN OR GREATER-THAN
+.. |lessgtr|                         unicode:: U+02276 .. LESS-THAN OR GREATER-THAN
+.. |lesssim|                         unicode:: U+02272 .. LESS-THAN OR EQUIVALENT TO
+.. |LessSlantEqual|                  unicode:: U+02A7D .. LESS-THAN OR SLANTED EQUAL TO
+.. |LessTilde|                       unicode:: U+02272 .. LESS-THAN OR EQUIVALENT TO
+.. |ll|                              unicode:: U+0226A .. MUCH LESS-THAN
+.. |llcorner|                        unicode:: U+0231E .. BOTTOM LEFT CORNER
+.. |Lleftarrow|                      unicode:: U+021DA .. LEFTWARDS TRIPLE ARROW
+.. |lmoustache|                      unicode:: U+023B0 .. UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION
+.. |lnapprox|                        unicode:: U+02A89 .. LESS-THAN AND NOT APPROXIMATE
+.. |lneq|                            unicode:: U+02A87 .. LESS-THAN AND SINGLE-LINE NOT EQUAL TO
+.. |lneqq|                           unicode:: U+02268 .. LESS-THAN BUT NOT EQUAL TO
+.. |LongLeftArrow|                   unicode:: U+027F5 .. LONG LEFTWARDS ARROW
+.. |Longleftarrow|                   unicode:: U+027F8 .. LONG LEFTWARDS DOUBLE ARROW
+.. |longleftarrow|                   unicode:: U+027F5 .. LONG LEFTWARDS ARROW
+.. |LongLeftRightArrow|              unicode:: U+027F7 .. LONG LEFT RIGHT ARROW
+.. |Longleftrightarrow|              unicode:: U+027FA .. LONG LEFT RIGHT DOUBLE ARROW
+.. |longleftrightarrow|              unicode:: U+027F7 .. LONG LEFT RIGHT ARROW
+.. |longmapsto|                      unicode:: U+027FC .. LONG RIGHTWARDS ARROW FROM BAR
+.. |LongRightArrow|                  unicode:: U+027F6 .. LONG RIGHTWARDS ARROW
+.. |Longrightarrow|                  unicode:: U+027F9 .. LONG RIGHTWARDS DOUBLE ARROW
+.. |longrightarrow|                  unicode:: U+027F6 .. LONG RIGHTWARDS ARROW
+.. |looparrowleft|                   unicode:: U+021AB .. LEFTWARDS ARROW WITH LOOP
+.. |looparrowright|                  unicode:: U+021AC .. RIGHTWARDS ARROW WITH LOOP
+.. |LowerLeftArrow|                  unicode:: U+02199 .. SOUTH WEST ARROW
+.. |LowerRightArrow|                 unicode:: U+02198 .. SOUTH EAST ARROW
+.. |lozenge|                         unicode:: U+025CA .. LOZENGE
+.. |lrcorner|                        unicode:: U+0231F .. BOTTOM RIGHT CORNER
+.. |Lsh|                             unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS
+.. |lvertneqq|                       unicode:: U+02268 U+0FE00 .. LESS-THAN BUT NOT EQUAL TO - with vertical stroke
+.. |maltese|                         unicode:: U+02720 .. MALTESE CROSS
+.. |mapsto|                          unicode:: U+021A6 .. RIGHTWARDS ARROW FROM BAR
+.. |measuredangle|                   unicode:: U+02221 .. MEASURED ANGLE
+.. |Mellintrf|                       unicode:: U+02133 .. SCRIPT CAPITAL M
+.. |MinusPlus|                       unicode:: U+02213 .. MINUS-OR-PLUS SIGN
+.. |mp|                              unicode:: U+02213 .. MINUS-OR-PLUS SIGN
+.. |multimap|                        unicode:: U+022B8 .. MULTIMAP
+.. |napprox|                         unicode:: U+02249 .. NOT ALMOST EQUAL TO
+.. |natural|                         unicode:: U+0266E .. MUSIC NATURAL SIGN
+.. |naturals|                        unicode:: U+02115 .. DOUBLE-STRUCK CAPITAL N
+.. |nearrow|                         unicode:: U+02197 .. NORTH EAST ARROW
+.. |NegativeMediumSpace|             unicode:: U+0200B .. ZERO WIDTH SPACE
+.. |NegativeThickSpace|              unicode:: U+0200B .. ZERO WIDTH SPACE
+.. |NegativeThinSpace|               unicode:: U+0200B .. ZERO WIDTH SPACE
+.. |NegativeVeryThinSpace|           unicode:: U+0200B .. ZERO WIDTH SPACE
+.. |NestedGreaterGreater|            unicode:: U+0226B .. MUCH GREATER-THAN
+.. |NestedLessLess|                  unicode:: U+0226A .. MUCH LESS-THAN
+.. |nexists|                         unicode:: U+02204 .. THERE DOES NOT EXIST
+.. |ngeq|                            unicode:: U+02271 .. NEITHER GREATER-THAN NOR EQUAL TO
+.. |ngeqq|                           unicode:: U+02267 U+00338 .. GREATER-THAN OVER EQUAL TO with slash
+.. |ngeqslant|                       unicode:: U+02A7E U+00338 .. GREATER-THAN OR SLANTED EQUAL TO with slash
+.. |ngtr|                            unicode:: U+0226F .. NOT GREATER-THAN
+.. |nLeftarrow|                      unicode:: U+021CD .. LEFTWARDS DOUBLE ARROW WITH STROKE
+.. |nleftarrow|                      unicode:: U+0219A .. LEFTWARDS ARROW WITH STROKE
+.. |nLeftrightarrow|                 unicode:: U+021CE .. LEFT RIGHT DOUBLE ARROW WITH STROKE
+.. |nleftrightarrow|                 unicode:: U+021AE .. LEFT RIGHT ARROW WITH STROKE
+.. |nleq|                            unicode:: U+02270 .. NEITHER LESS-THAN NOR EQUAL TO
+.. |nleqq|                           unicode:: U+02266 U+00338 .. LESS-THAN OVER EQUAL TO with slash
+.. |nleqslant|                       unicode:: U+02A7D U+00338 .. LESS-THAN OR SLANTED EQUAL TO with slash
+.. |nless|                           unicode:: U+0226E .. NOT LESS-THAN
+.. |NonBreakingSpace|                unicode:: U+000A0 .. NO-BREAK SPACE
+.. |NotCongruent|                    unicode:: U+02262 .. NOT IDENTICAL TO
+.. |NotDoubleVerticalBar|            unicode:: U+02226 .. NOT PARALLEL TO
+.. |NotElement|                      unicode:: U+02209 .. NOT AN ELEMENT OF
+.. |NotEqual|                        unicode:: U+02260 .. NOT EQUAL TO
+.. |NotEqualTilde|                   unicode:: U+02242 U+00338 .. MINUS TILDE with slash
+.. |NotExists|                       unicode:: U+02204 .. THERE DOES NOT EXIST
+.. |NotGreater|                      unicode:: U+0226F .. NOT GREATER-THAN
+.. |NotGreaterEqual|                 unicode:: U+02271 .. NEITHER GREATER-THAN NOR EQUAL TO
+.. |NotGreaterFullEqual|             unicode:: U+02266 U+00338 .. LESS-THAN OVER EQUAL TO with slash
+.. |NotGreaterGreater|               unicode:: U+0226B U+00338 .. MUCH GREATER THAN with slash
+.. |NotGreaterLess|                  unicode:: U+02279 .. NEITHER GREATER-THAN NOR LESS-THAN
+.. |NotGreaterSlantEqual|            unicode:: U+02A7E U+00338 .. GREATER-THAN OR SLANTED EQUAL TO with slash
+.. |NotGreaterTilde|                 unicode:: U+02275 .. NEITHER GREATER-THAN NOR EQUIVALENT TO
+.. |NotHumpDownHump|                 unicode:: U+0224E U+00338 .. GEOMETRICALLY EQUIVALENT TO with slash
+.. |NotLeftTriangle|                 unicode:: U+022EA .. NOT NORMAL SUBGROUP OF
+.. |NotLeftTriangleEqual|            unicode:: U+022EC .. NOT NORMAL SUBGROUP OF OR EQUAL TO
+.. |NotLess|                         unicode:: U+0226E .. NOT LESS-THAN
+.. |NotLessEqual|                    unicode:: U+02270 .. NEITHER LESS-THAN NOR EQUAL TO
+.. |NotLessGreater|                  unicode:: U+02278 .. NEITHER LESS-THAN NOR GREATER-THAN
+.. |NotLessLess|                     unicode:: U+0226A U+00338 .. MUCH LESS THAN with slash
+.. |NotLessSlantEqual|               unicode:: U+02A7D U+00338 .. LESS-THAN OR SLANTED EQUAL TO with slash
+.. |NotLessTilde|                    unicode:: U+02274 .. NEITHER LESS-THAN NOR EQUIVALENT TO
+.. |NotPrecedes|                     unicode:: U+02280 .. DOES NOT PRECEDE
+.. |NotPrecedesEqual|                unicode:: U+02AAF U+00338 .. PRECEDES ABOVE SINGLE-LINE EQUALS SIGN with slash
+.. |NotPrecedesSlantEqual|           unicode:: U+022E0 .. DOES NOT PRECEDE OR EQUAL
+.. |NotReverseElement|               unicode:: U+0220C .. DOES NOT CONTAIN AS MEMBER
+.. |NotRightTriangle|                unicode:: U+022EB .. DOES NOT CONTAIN AS NORMAL SUBGROUP
+.. |NotRightTriangleEqual|           unicode:: U+022ED .. DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL
+.. |NotSquareSubsetEqual|            unicode:: U+022E2 .. NOT SQUARE IMAGE OF OR EQUAL TO
+.. |NotSquareSupersetEqual|          unicode:: U+022E3 .. NOT SQUARE ORIGINAL OF OR EQUAL TO
+.. |NotSubset|                       unicode:: U+02282 U+020D2 .. SUBSET OF with vertical line
+.. |NotSubsetEqual|                  unicode:: U+02288 .. NEITHER A SUBSET OF NOR EQUAL TO
+.. |NotSucceeds|                     unicode:: U+02281 .. DOES NOT SUCCEED
+.. |NotSucceedsEqual|                unicode:: U+02AB0 U+00338 .. SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN with slash
+.. |NotSucceedsSlantEqual|           unicode:: U+022E1 .. DOES NOT SUCCEED OR EQUAL
+.. |NotSuperset|                     unicode:: U+02283 U+020D2 .. SUPERSET OF with vertical line
+.. |NotSupersetEqual|                unicode:: U+02289 .. NEITHER A SUPERSET OF NOR EQUAL TO
+.. |NotTilde|                        unicode:: U+02241 .. NOT TILDE
+.. |NotTildeEqual|                   unicode:: U+02244 .. NOT ASYMPTOTICALLY EQUAL TO
+.. |NotTildeFullEqual|               unicode:: U+02247 .. NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO
+.. |NotTildeTilde|                   unicode:: U+02249 .. NOT ALMOST EQUAL TO
+.. |NotVerticalBar|                  unicode:: U+02224 .. DOES NOT DIVIDE
+.. |nparallel|                       unicode:: U+02226 .. NOT PARALLEL TO
+.. |nprec|                           unicode:: U+02280 .. DOES NOT PRECEDE
+.. |npreceq|                         unicode:: U+02AAF U+00338 .. PRECEDES ABOVE SINGLE-LINE EQUALS SIGN with slash
+.. |nRightarrow|                     unicode:: U+021CF .. RIGHTWARDS DOUBLE ARROW WITH STROKE
+.. |nrightarrow|                     unicode:: U+0219B .. RIGHTWARDS ARROW WITH STROKE
+.. |nshortmid|                       unicode:: U+02224 .. DOES NOT DIVIDE
+.. |nshortparallel|                  unicode:: U+02226 .. NOT PARALLEL TO
+.. |nsimeq|                          unicode:: U+02244 .. NOT ASYMPTOTICALLY EQUAL TO
+.. |nsubset|                         unicode:: U+02282 U+020D2 .. SUBSET OF with vertical line
+.. |nsubseteq|                       unicode:: U+02288 .. NEITHER A SUBSET OF NOR EQUAL TO
+.. |nsubseteqq|                      unicode:: U+02AC5 U+00338 .. SUBSET OF ABOVE EQUALS SIGN with slash
+.. |nsucc|                           unicode:: U+02281 .. DOES NOT SUCCEED
+.. |nsucceq|                         unicode:: U+02AB0 U+00338 .. SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN with slash
+.. |nsupset|                         unicode:: U+02283 U+020D2 .. SUPERSET OF with vertical line
+.. |nsupseteq|                       unicode:: U+02289 .. NEITHER A SUPERSET OF NOR EQUAL TO
+.. |nsupseteqq|                      unicode:: U+02AC6 U+00338 .. SUPERSET OF ABOVE EQUALS SIGN with slash
+.. |ntriangleleft|                   unicode:: U+022EA .. NOT NORMAL SUBGROUP OF
+.. |ntrianglelefteq|                 unicode:: U+022EC .. NOT NORMAL SUBGROUP OF OR EQUAL TO
+.. |ntriangleright|                  unicode:: U+022EB .. DOES NOT CONTAIN AS NORMAL SUBGROUP
+.. |ntrianglerighteq|                unicode:: U+022ED .. DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL
+.. |nwarrow|                         unicode:: U+02196 .. NORTH WEST ARROW
+.. |oint|                            unicode:: U+0222E .. CONTOUR INTEGRAL
+.. |OpenCurlyDoubleQuote|            unicode:: U+0201C .. LEFT DOUBLE QUOTATION MARK
+.. |OpenCurlyQuote|                  unicode:: U+02018 .. LEFT SINGLE QUOTATION MARK
+.. |orderof|                         unicode:: U+02134 .. SCRIPT SMALL O
+.. |parallel|                        unicode:: U+02225 .. PARALLEL TO
+.. |PartialD|                        unicode:: U+02202 .. PARTIAL DIFFERENTIAL
+.. |pitchfork|                       unicode:: U+022D4 .. PITCHFORK
+.. |PlusMinus|                       unicode:: U+000B1 .. PLUS-MINUS SIGN
+.. |pm|                              unicode:: U+000B1 .. PLUS-MINUS SIGN
+.. |Poincareplane|                   unicode:: U+0210C .. BLACK-LETTER CAPITAL H
+.. |prec|                            unicode:: U+0227A .. PRECEDES
+.. |precapprox|                      unicode:: U+02AB7 .. PRECEDES ABOVE ALMOST EQUAL TO
+.. |preccurlyeq|                     unicode:: U+0227C .. PRECEDES OR EQUAL TO
+.. |Precedes|                        unicode:: U+0227A .. PRECEDES
+.. |PrecedesEqual|                   unicode:: U+02AAF .. PRECEDES ABOVE SINGLE-LINE EQUALS SIGN
+.. |PrecedesSlantEqual|              unicode:: U+0227C .. PRECEDES OR EQUAL TO
+.. |PrecedesTilde|                   unicode:: U+0227E .. PRECEDES OR EQUIVALENT TO
+.. |preceq|                          unicode:: U+02AAF .. PRECEDES ABOVE SINGLE-LINE EQUALS SIGN
+.. |precnapprox|                     unicode:: U+02AB9 .. PRECEDES ABOVE NOT ALMOST EQUAL TO
+.. |precneqq|                        unicode:: U+02AB5 .. PRECEDES ABOVE NOT EQUAL TO
+.. |precnsim|                        unicode:: U+022E8 .. PRECEDES BUT NOT EQUIVALENT TO
+.. |precsim|                         unicode:: U+0227E .. PRECEDES OR EQUIVALENT TO
+.. |primes|                          unicode:: U+02119 .. DOUBLE-STRUCK CAPITAL P
+.. |Proportion|                      unicode:: U+02237 .. PROPORTION
+.. |Proportional|                    unicode:: U+0221D .. PROPORTIONAL TO
+.. |propto|                          unicode:: U+0221D .. PROPORTIONAL TO
+.. |quaternions|                     unicode:: U+0210D .. DOUBLE-STRUCK CAPITAL H
+.. |questeq|                         unicode:: U+0225F .. QUESTIONED EQUAL TO
+.. |rangle|                          unicode:: U+0232A .. RIGHT-POINTING ANGLE BRACKET
+.. |rationals|                       unicode:: U+0211A .. DOUBLE-STRUCK CAPITAL Q
+.. |rbrace|                          unicode:: U+0007D .. RIGHT CURLY BRACKET
+.. |rbrack|                          unicode:: U+0005D .. RIGHT SQUARE BRACKET
+.. |Re|                              unicode:: U+0211C .. BLACK-LETTER CAPITAL R
+.. |realine|                         unicode:: U+0211B .. SCRIPT CAPITAL R
+.. |realpart|                        unicode:: U+0211C .. BLACK-LETTER CAPITAL R
+.. |reals|                           unicode:: U+0211D .. DOUBLE-STRUCK CAPITAL R
+.. |ReverseElement|                  unicode:: U+0220B .. CONTAINS AS MEMBER
+.. |ReverseEquilibrium|              unicode:: U+021CB .. LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON
+.. |ReverseUpEquilibrium|            unicode:: U+0296F .. DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT
+.. |RightAngleBracket|               unicode:: U+0232A .. RIGHT-POINTING ANGLE BRACKET
+.. |RightArrow|                      unicode:: U+02192 .. RIGHTWARDS ARROW
+.. |Rightarrow|                      unicode:: U+021D2 .. RIGHTWARDS DOUBLE ARROW
+.. |rightarrow|                      unicode:: U+02192 .. RIGHTWARDS ARROW
+.. |RightArrowBar|                   unicode:: U+021E5 .. RIGHTWARDS ARROW TO BAR
+.. |RightArrowLeftArrow|             unicode:: U+021C4 .. RIGHTWARDS ARROW OVER LEFTWARDS ARROW
+.. |rightarrowtail|                  unicode:: U+021A3 .. RIGHTWARDS ARROW WITH TAIL
+.. |RightCeiling|                    unicode:: U+02309 .. RIGHT CEILING
+.. |RightDoubleBracket|              unicode:: U+0301B .. RIGHT WHITE SQUARE BRACKET
+.. |RightDownVector|                 unicode:: U+021C2 .. DOWNWARDS HARPOON WITH BARB RIGHTWARDS
+.. |RightFloor|                      unicode:: U+0230B .. RIGHT FLOOR
+.. |rightharpoondown|                unicode:: U+021C1 .. RIGHTWARDS HARPOON WITH BARB DOWNWARDS
+.. |rightharpoonup|                  unicode:: U+021C0 .. RIGHTWARDS HARPOON WITH BARB UPWARDS
+.. |rightleftarrows|                 unicode:: U+021C4 .. RIGHTWARDS ARROW OVER LEFTWARDS ARROW
+.. |rightleftharpoons|               unicode:: U+021CC .. RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON
+.. |rightrightarrows|                unicode:: U+021C9 .. RIGHTWARDS PAIRED ARROWS
+.. |rightsquigarrow|                 unicode:: U+0219D .. RIGHTWARDS WAVE ARROW
+.. |RightTee|                        unicode:: U+022A2 .. RIGHT TACK
+.. |RightTeeArrow|                   unicode:: U+021A6 .. RIGHTWARDS ARROW FROM BAR
+.. |rightthreetimes|                 unicode:: U+022CC .. RIGHT SEMIDIRECT PRODUCT
+.. |RightTriangle|                   unicode:: U+022B3 .. CONTAINS AS NORMAL SUBGROUP
+.. |RightTriangleEqual|              unicode:: U+022B5 .. CONTAINS AS NORMAL SUBGROUP OR EQUAL TO
+.. |RightUpVector|                   unicode:: U+021BE .. UPWARDS HARPOON WITH BARB RIGHTWARDS
+.. |RightVector|                     unicode:: U+021C0 .. RIGHTWARDS HARPOON WITH BARB UPWARDS
+.. |risingdotseq|                    unicode:: U+02253 .. IMAGE OF OR APPROXIMATELY EQUAL TO
+.. |rmoustache|                      unicode:: U+023B1 .. UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION
+.. |Rrightarrow|                     unicode:: U+021DB .. RIGHTWARDS TRIPLE ARROW
+.. |Rsh|                             unicode:: U+021B1 .. UPWARDS ARROW WITH TIP RIGHTWARDS
+.. |searrow|                         unicode:: U+02198 .. SOUTH EAST ARROW
+.. |setminus|                        unicode:: U+02216 .. SET MINUS
+.. |ShortDownArrow|                  unicode:: U+02193 .. DOWNWARDS ARROW
+.. |ShortLeftArrow|                  unicode:: U+02190 .. LEFTWARDS ARROW
+.. |shortmid|                        unicode:: U+02223 .. DIVIDES
+.. |shortparallel|                   unicode:: U+02225 .. PARALLEL TO
+.. |ShortRightArrow|                 unicode:: U+02192 .. RIGHTWARDS ARROW
+.. |ShortUpArrow|                    unicode:: U+02191 .. UPWARDS ARROW
+.. |simeq|                           unicode:: U+02243 .. ASYMPTOTICALLY EQUAL TO
+.. |SmallCircle|                     unicode:: U+02218 .. RING OPERATOR
+.. |smallsetminus|                   unicode:: U+02216 .. SET MINUS
+.. |spadesuit|                       unicode:: U+02660 .. BLACK SPADE SUIT
+.. |Sqrt|                            unicode:: U+0221A .. SQUARE ROOT
+.. |sqsubset|                        unicode:: U+0228F .. SQUARE IMAGE OF
+.. |sqsubseteq|                      unicode:: U+02291 .. SQUARE IMAGE OF OR EQUAL TO
+.. |sqsupset|                        unicode:: U+02290 .. SQUARE ORIGINAL OF
+.. |sqsupseteq|                      unicode:: U+02292 .. SQUARE ORIGINAL OF OR EQUAL TO
+.. |Square|                          unicode:: U+025A1 .. WHITE SQUARE
+.. |SquareIntersection|              unicode:: U+02293 .. SQUARE CAP
+.. |SquareSubset|                    unicode:: U+0228F .. SQUARE IMAGE OF
+.. |SquareSubsetEqual|               unicode:: U+02291 .. SQUARE IMAGE OF OR EQUAL TO
+.. |SquareSuperset|                  unicode:: U+02290 .. SQUARE ORIGINAL OF
+.. |SquareSupersetEqual|             unicode:: U+02292 .. SQUARE ORIGINAL OF OR EQUAL TO
+.. |SquareUnion|                     unicode:: U+02294 .. SQUARE CUP
+.. |Star|                            unicode:: U+022C6 .. STAR OPERATOR
+.. |straightepsilon|                 unicode:: U+003F5 .. GREEK LUNATE EPSILON SYMBOL
+.. |straightphi|                     unicode:: U+003D5 .. GREEK PHI SYMBOL
+.. |Subset|                          unicode:: U+022D0 .. DOUBLE SUBSET
+.. |subset|                          unicode:: U+02282 .. SUBSET OF
+.. |subseteq|                        unicode:: U+02286 .. SUBSET OF OR EQUAL TO
+.. |subseteqq|                       unicode:: U+02AC5 .. SUBSET OF ABOVE EQUALS SIGN
+.. |SubsetEqual|                     unicode:: U+02286 .. SUBSET OF OR EQUAL TO
+.. |subsetneq|                       unicode:: U+0228A .. SUBSET OF WITH NOT EQUAL TO
+.. |subsetneqq|                      unicode:: U+02ACB .. SUBSET OF ABOVE NOT EQUAL TO
+.. |succ|                            unicode:: U+0227B .. SUCCEEDS
+.. |succapprox|                      unicode:: U+02AB8 .. SUCCEEDS ABOVE ALMOST EQUAL TO
+.. |succcurlyeq|                     unicode:: U+0227D .. SUCCEEDS OR EQUAL TO
+.. |Succeeds|                        unicode:: U+0227B .. SUCCEEDS
+.. |SucceedsEqual|                   unicode:: U+02AB0 .. SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN
+.. |SucceedsSlantEqual|              unicode:: U+0227D .. SUCCEEDS OR EQUAL TO
+.. |SucceedsTilde|                   unicode:: U+0227F .. SUCCEEDS OR EQUIVALENT TO
+.. |succeq|                          unicode:: U+02AB0 .. SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN
+.. |succnapprox|                     unicode:: U+02ABA .. SUCCEEDS ABOVE NOT ALMOST EQUAL TO
+.. |succneqq|                        unicode:: U+02AB6 .. SUCCEEDS ABOVE NOT EQUAL TO
+.. |succnsim|                        unicode:: U+022E9 .. SUCCEEDS BUT NOT EQUIVALENT TO
+.. |succsim|                         unicode:: U+0227F .. SUCCEEDS OR EQUIVALENT TO
+.. |SuchThat|                        unicode:: U+0220B .. CONTAINS AS MEMBER
+.. |Sum|                             unicode:: U+02211 .. N-ARY SUMMATION
+.. |Superset|                        unicode:: U+02283 .. SUPERSET OF
+.. |SupersetEqual|                   unicode:: U+02287 .. SUPERSET OF OR EQUAL TO
+.. |Supset|                          unicode:: U+022D1 .. DOUBLE SUPERSET
+.. |supset|                          unicode:: U+02283 .. SUPERSET OF
+.. |supseteq|                        unicode:: U+02287 .. SUPERSET OF OR EQUAL TO
+.. |supseteqq|                       unicode:: U+02AC6 .. SUPERSET OF ABOVE EQUALS SIGN
+.. |supsetneq|                       unicode:: U+0228B .. SUPERSET OF WITH NOT EQUAL TO
+.. |supsetneqq|                      unicode:: U+02ACC .. SUPERSET OF ABOVE NOT EQUAL TO
+.. |swarrow|                         unicode:: U+02199 .. SOUTH WEST ARROW
+.. |Therefore|                       unicode:: U+02234 .. THEREFORE
+.. |therefore|                       unicode:: U+02234 .. THEREFORE
+.. |thickapprox|                     unicode:: U+02248 .. ALMOST EQUAL TO
+.. |thicksim|                        unicode:: U+0223C .. TILDE OPERATOR
+.. |ThinSpace|                       unicode:: U+02009 .. THIN SPACE
+.. |Tilde|                           unicode:: U+0223C .. TILDE OPERATOR
+.. |TildeEqual|                      unicode:: U+02243 .. ASYMPTOTICALLY EQUAL TO
+.. |TildeFullEqual|                  unicode:: U+02245 .. APPROXIMATELY EQUAL TO
+.. |TildeTilde|                      unicode:: U+02248 .. ALMOST EQUAL TO
+.. |toea|                            unicode:: U+02928 .. NORTH EAST ARROW AND SOUTH EAST ARROW
+.. |tosa|                            unicode:: U+02929 .. SOUTH EAST ARROW AND SOUTH WEST ARROW
+.. |triangle|                        unicode:: U+025B5 .. WHITE UP-POINTING SMALL TRIANGLE
+.. |triangledown|                    unicode:: U+025BF .. WHITE DOWN-POINTING SMALL TRIANGLE
+.. |triangleleft|                    unicode:: U+025C3 .. WHITE LEFT-POINTING SMALL TRIANGLE
+.. |trianglelefteq|                  unicode:: U+022B4 .. NORMAL SUBGROUP OF OR EQUAL TO
+.. |triangleq|                       unicode:: U+0225C .. DELTA EQUAL TO
+.. |triangleright|                   unicode:: U+025B9 .. WHITE RIGHT-POINTING SMALL TRIANGLE
+.. |trianglerighteq|                 unicode:: U+022B5 .. CONTAINS AS NORMAL SUBGROUP OR EQUAL TO
+.. |TripleDot|                       unicode:: U+020DB .. COMBINING THREE DOTS ABOVE
+.. |twoheadleftarrow|                unicode:: U+0219E .. LEFTWARDS TWO HEADED ARROW
+.. |twoheadrightarrow|               unicode:: U+021A0 .. RIGHTWARDS TWO HEADED ARROW
+.. |ulcorner|                        unicode:: U+0231C .. TOP LEFT CORNER
+.. |Union|                           unicode:: U+022C3 .. N-ARY UNION
+.. |UnionPlus|                       unicode:: U+0228E .. MULTISET UNION
+.. |UpArrow|                         unicode:: U+02191 .. UPWARDS ARROW
+.. |Uparrow|                         unicode:: U+021D1 .. UPWARDS DOUBLE ARROW
+.. |uparrow|                         unicode:: U+02191 .. UPWARDS ARROW
+.. |UpArrowDownArrow|                unicode:: U+021C5 .. UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW
+.. |UpDownArrow|                     unicode:: U+02195 .. UP DOWN ARROW
+.. |Updownarrow|                     unicode:: U+021D5 .. UP DOWN DOUBLE ARROW
+.. |updownarrow|                     unicode:: U+02195 .. UP DOWN ARROW
+.. |UpEquilibrium|                   unicode:: U+0296E .. UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT
+.. |upharpoonleft|                   unicode:: U+021BF .. UPWARDS HARPOON WITH BARB LEFTWARDS
+.. |upharpoonright|                  unicode:: U+021BE .. UPWARDS HARPOON WITH BARB RIGHTWARDS
+.. |UpperLeftArrow|                  unicode:: U+02196 .. NORTH WEST ARROW
+.. |UpperRightArrow|                 unicode:: U+02197 .. NORTH EAST ARROW
+.. |upsilon|                         unicode:: U+003C5 .. GREEK SMALL LETTER UPSILON
+.. |UpTee|                           unicode:: U+022A5 .. UP TACK
+.. |UpTeeArrow|                      unicode:: U+021A5 .. UPWARDS ARROW FROM BAR
+.. |upuparrows|                      unicode:: U+021C8 .. UPWARDS PAIRED ARROWS
+.. |urcorner|                        unicode:: U+0231D .. TOP RIGHT CORNER
+.. |varepsilon|                      unicode:: U+003B5 .. GREEK SMALL LETTER EPSILON
+.. |varkappa|                        unicode:: U+003F0 .. GREEK KAPPA SYMBOL
+.. |varnothing|                      unicode:: U+02205 .. EMPTY SET
+.. |varphi|                          unicode:: U+003C6 .. GREEK SMALL LETTER PHI
+.. |varpi|                           unicode:: U+003D6 .. GREEK PI SYMBOL
+.. |varpropto|                       unicode:: U+0221D .. PROPORTIONAL TO
+.. |varrho|                          unicode:: U+003F1 .. GREEK RHO SYMBOL
+.. |varsigma|                        unicode:: U+003C2 .. GREEK SMALL LETTER FINAL SIGMA
+.. |varsubsetneq|                    unicode:: U+0228A U+0FE00 .. SUBSET OF WITH NOT EQUAL TO - variant with stroke through bottom members
+.. |varsubsetneqq|                   unicode:: U+02ACB U+0FE00 .. SUBSET OF ABOVE NOT EQUAL TO - variant with stroke through bottom members
+.. |varsupsetneq|                    unicode:: U+0228B U+0FE00 .. SUPERSET OF WITH NOT EQUAL TO - variant with stroke through bottom members
+.. |varsupsetneqq|                   unicode:: U+02ACC U+0FE00 .. SUPERSET OF ABOVE NOT EQUAL TO - variant with stroke through bottom members
+.. |vartheta|                        unicode:: U+003D1 .. GREEK THETA SYMBOL
+.. |vartriangleleft|                 unicode:: U+022B2 .. NORMAL SUBGROUP OF
+.. |vartriangleright|                unicode:: U+022B3 .. CONTAINS AS NORMAL SUBGROUP
+.. |Vee|                             unicode:: U+022C1 .. N-ARY LOGICAL OR
+.. |vee|                             unicode:: U+02228 .. LOGICAL OR
+.. |Vert|                            unicode:: U+02016 .. DOUBLE VERTICAL LINE
+.. |vert|                            unicode:: U+0007C .. VERTICAL LINE
+.. |VerticalBar|                     unicode:: U+02223 .. DIVIDES
+.. |VerticalTilde|                   unicode:: U+02240 .. WREATH PRODUCT
+.. |VeryThinSpace|                   unicode:: U+0200A .. HAIR SPACE
+.. |Wedge|                           unicode:: U+022C0 .. N-ARY LOGICAL AND
+.. |wedge|                           unicode:: U+02227 .. LOGICAL AND
+.. |wp|                              unicode:: U+02118 .. SCRIPT CAPITAL P
+.. |wr|                              unicode:: U+02240 .. WREATH PRODUCT
+.. |zeetrf|                          unicode:: U+02128 .. BLACK-LETTER CAPITAL Z
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isomfrk-wide.txt
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isomfrk-wide.txt (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isomfrk-wide.txt (revision 3)
@@ -0,0 +1,58 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |Afr| unicode:: U+1D504 .. MATHEMATICAL FRAKTUR CAPITAL A
+.. |afr| unicode:: U+1D51E .. MATHEMATICAL FRAKTUR SMALL A
+.. |Bfr| unicode:: U+1D505 .. MATHEMATICAL FRAKTUR CAPITAL B
+.. |bfr| unicode:: U+1D51F .. MATHEMATICAL FRAKTUR SMALL B
+.. |Cfr| unicode:: U+0212D .. BLACK-LETTER CAPITAL C
+.. |cfr| unicode:: U+1D520 .. MATHEMATICAL FRAKTUR SMALL C
+.. |Dfr| unicode:: U+1D507 .. MATHEMATICAL FRAKTUR CAPITAL D
+.. |dfr| unicode:: U+1D521 .. MATHEMATICAL FRAKTUR SMALL D
+.. |Efr| unicode:: U+1D508 .. MATHEMATICAL FRAKTUR CAPITAL E
+.. |efr| unicode:: U+1D522 .. MATHEMATICAL FRAKTUR SMALL E
+.. |Ffr| unicode:: U+1D509 .. MATHEMATICAL FRAKTUR CAPITAL F
+.. |ffr| unicode:: U+1D523 .. MATHEMATICAL FRAKTUR SMALL F
+.. |Gfr| unicode:: U+1D50A .. MATHEMATICAL FRAKTUR CAPITAL G
+.. |gfr| unicode:: U+1D524 .. MATHEMATICAL FRAKTUR SMALL G
+.. |Hfr| unicode:: U+0210C .. BLACK-LETTER CAPITAL H
+.. |hfr| unicode:: U+1D525 .. MATHEMATICAL FRAKTUR SMALL H
+.. |Ifr| unicode:: U+02111 .. BLACK-LETTER CAPITAL I
+.. |ifr| unicode:: U+1D526 .. MATHEMATICAL FRAKTUR SMALL I
+.. |Jfr| unicode:: U+1D50D .. MATHEMATICAL FRAKTUR CAPITAL J
+.. |jfr| unicode:: U+1D527 .. MATHEMATICAL FRAKTUR SMALL J
+.. |Kfr| unicode:: U+1D50E .. MATHEMATICAL FRAKTUR CAPITAL K
+.. |kfr| unicode:: U+1D528 .. MATHEMATICAL FRAKTUR SMALL K
+.. |Lfr| unicode:: U+1D50F .. MATHEMATICAL FRAKTUR CAPITAL L
+.. |lfr| unicode:: U+1D529 .. MATHEMATICAL FRAKTUR SMALL L
+.. |Mfr| unicode:: U+1D510 .. MATHEMATICAL FRAKTUR CAPITAL M
+.. |mfr| unicode:: U+1D52A .. MATHEMATICAL FRAKTUR SMALL M
+.. |Nfr| unicode:: U+1D511 .. MATHEMATICAL FRAKTUR CAPITAL N
+.. |nfr| unicode:: U+1D52B .. MATHEMATICAL FRAKTUR SMALL N
+.. |Ofr| unicode:: U+1D512 .. MATHEMATICAL FRAKTUR CAPITAL O
+.. |ofr| unicode:: U+1D52C .. MATHEMATICAL FRAKTUR SMALL O
+.. |Pfr| unicode:: U+1D513 .. MATHEMATICAL FRAKTUR CAPITAL P
+.. |pfr| unicode:: U+1D52D .. MATHEMATICAL FRAKTUR SMALL P
+.. |Qfr| unicode:: U+1D514 .. MATHEMATICAL FRAKTUR CAPITAL Q
+.. |qfr| unicode:: U+1D52E .. MATHEMATICAL FRAKTUR SMALL Q
+.. |Rfr| unicode:: U+0211C .. BLACK-LETTER CAPITAL R
+.. |rfr| unicode:: U+1D52F .. MATHEMATICAL FRAKTUR SMALL R
+.. |Sfr| unicode:: U+1D516 .. MATHEMATICAL FRAKTUR CAPITAL S
+.. |sfr| unicode:: U+1D530 .. MATHEMATICAL FRAKTUR SMALL S
+.. |Tfr| unicode:: U+1D517 .. MATHEMATICAL FRAKTUR CAPITAL T
+.. |tfr| unicode:: U+1D531 .. MATHEMATICAL FRAKTUR SMALL T
+.. |Ufr| unicode:: U+1D518 .. MATHEMATICAL FRAKTUR CAPITAL U
+.. |ufr| unicode:: U+1D532 .. MATHEMATICAL FRAKTUR SMALL U
+.. |Vfr| unicode:: U+1D519 .. MATHEMATICAL FRAKTUR CAPITAL V
+.. |vfr| unicode:: U+1D533 .. MATHEMATICAL FRAKTUR SMALL V
+.. |Wfr| unicode:: U+1D51A .. MATHEMATICAL FRAKTUR CAPITAL W
+.. |wfr| unicode:: U+1D534 .. MATHEMATICAL FRAKTUR SMALL W
+.. |Xfr| unicode:: U+1D51B .. MATHEMATICAL FRAKTUR CAPITAL X
+.. |xfr| unicode:: U+1D535 .. MATHEMATICAL FRAKTUR SMALL X
+.. |Yfr| unicode:: U+1D51C .. MATHEMATICAL FRAKTUR CAPITAL Y
+.. |yfr| unicode:: U+1D536 .. MATHEMATICAL FRAKTUR SMALL Y
+.. |Zfr| unicode:: U+02128 .. BLACK-LETTER CAPITAL Z
+.. |zfr| unicode:: U+1D537 .. MATHEMATICAL FRAKTUR SMALL Z
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isomopf-wide.txt
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isomopf-wide.txt (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isomopf-wide.txt (revision 3)
@@ -0,0 +1,32 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |Aopf| unicode:: U+1D538 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL A
+.. |Bopf| unicode:: U+1D539 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL B
+.. |Copf| unicode:: U+02102 .. DOUBLE-STRUCK CAPITAL C
+.. |Dopf| unicode:: U+1D53B .. MATHEMATICAL DOUBLE-STRUCK CAPITAL D
+.. |Eopf| unicode:: U+1D53C .. MATHEMATICAL DOUBLE-STRUCK CAPITAL E
+.. |Fopf| unicode:: U+1D53D .. MATHEMATICAL DOUBLE-STRUCK CAPITAL F
+.. |Gopf| unicode:: U+1D53E .. MATHEMATICAL DOUBLE-STRUCK CAPITAL G
+.. |Hopf| unicode:: U+0210D .. DOUBLE-STRUCK CAPITAL H
+.. |Iopf| unicode:: U+1D540 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL I
+.. |Jopf| unicode:: U+1D541 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL J
+.. |Kopf| unicode:: U+1D542 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL K
+.. |Lopf| unicode:: U+1D543 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL L
+.. |Mopf| unicode:: U+1D544 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL M
+.. |Nopf| unicode:: U+02115 .. DOUBLE-STRUCK CAPITAL N
+.. |Oopf| unicode:: U+1D546 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL O
+.. |Popf| unicode:: U+02119 .. DOUBLE-STRUCK CAPITAL P
+.. |Qopf| unicode:: U+0211A .. DOUBLE-STRUCK CAPITAL Q
+.. |Ropf| unicode:: U+0211D .. DOUBLE-STRUCK CAPITAL R
+.. |Sopf| unicode:: U+1D54A .. MATHEMATICAL DOUBLE-STRUCK CAPITAL S
+.. |Topf| unicode:: U+1D54B .. MATHEMATICAL DOUBLE-STRUCK CAPITAL T
+.. |Uopf| unicode:: U+1D54C .. MATHEMATICAL DOUBLE-STRUCK CAPITAL U
+.. |Vopf| unicode:: U+1D54D .. MATHEMATICAL DOUBLE-STRUCK CAPITAL V
+.. |Wopf| unicode:: U+1D54E .. MATHEMATICAL DOUBLE-STRUCK CAPITAL W
+.. |Xopf| unicode:: U+1D54F .. MATHEMATICAL DOUBLE-STRUCK CAPITAL X
+.. |Yopf| unicode:: U+1D550 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL Y
+.. |Zopf| unicode:: U+02124 .. DOUBLE-STRUCK CAPITAL Z
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isomscr-wide.txt
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isomscr-wide.txt (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isomscr-wide.txt (revision 3)
@@ -0,0 +1,58 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |Ascr| unicode:: U+1D49C .. MATHEMATICAL SCRIPT CAPITAL A
+.. |ascr| unicode:: U+1D4B6 .. MATHEMATICAL SCRIPT SMALL A
+.. |Bscr| unicode:: U+0212C .. SCRIPT CAPITAL B
+.. |bscr| unicode:: U+1D4B7 .. MATHEMATICAL SCRIPT SMALL B
+.. |Cscr| unicode:: U+1D49E .. MATHEMATICAL SCRIPT CAPITAL C
+.. |cscr| unicode:: U+1D4B8 .. MATHEMATICAL SCRIPT SMALL C
+.. |Dscr| unicode:: U+1D49F .. MATHEMATICAL SCRIPT CAPITAL D
+.. |dscr| unicode:: U+1D4B9 .. MATHEMATICAL SCRIPT SMALL D
+.. |Escr| unicode:: U+02130 .. SCRIPT CAPITAL E
+.. |escr| unicode:: U+0212F .. SCRIPT SMALL E
+.. |Fscr| unicode:: U+02131 .. SCRIPT CAPITAL F
+.. |fscr| unicode:: U+1D4BB .. MATHEMATICAL SCRIPT SMALL F
+.. |Gscr| unicode:: U+1D4A2 .. MATHEMATICAL SCRIPT CAPITAL G
+.. |gscr| unicode:: U+0210A .. SCRIPT SMALL G
+.. |Hscr| unicode:: U+0210B .. SCRIPT CAPITAL H
+.. |hscr| unicode:: U+1D4BD .. MATHEMATICAL SCRIPT SMALL H
+.. |Iscr| unicode:: U+02110 .. SCRIPT CAPITAL I
+.. |iscr| unicode:: U+1D4BE .. MATHEMATICAL SCRIPT SMALL I
+.. |Jscr| unicode:: U+1D4A5 .. MATHEMATICAL SCRIPT CAPITAL J
+.. |jscr| unicode:: U+1D4BF .. MATHEMATICAL SCRIPT SMALL J
+.. |Kscr| unicode:: U+1D4A6 .. MATHEMATICAL SCRIPT CAPITAL K
+.. |kscr| unicode:: U+1D4C0 .. MATHEMATICAL SCRIPT SMALL K
+.. |Lscr| unicode:: U+02112 .. SCRIPT CAPITAL L
+.. |lscr| unicode:: U+1D4C1 .. MATHEMATICAL SCRIPT SMALL L
+.. |Mscr| unicode:: U+02133 .. SCRIPT CAPITAL M
+.. |mscr| unicode:: U+1D4C2 .. MATHEMATICAL SCRIPT SMALL M
+.. |Nscr| unicode:: U+1D4A9 .. MATHEMATICAL SCRIPT CAPITAL N
+.. |nscr| unicode:: U+1D4C3 .. MATHEMATICAL SCRIPT SMALL N
+.. |Oscr| unicode:: U+1D4AA .. MATHEMATICAL SCRIPT CAPITAL O
+.. |oscr| unicode:: U+02134 .. SCRIPT SMALL O
+.. |Pscr| unicode:: U+1D4AB .. MATHEMATICAL SCRIPT CAPITAL P
+.. |pscr| unicode:: U+1D4C5 .. MATHEMATICAL SCRIPT SMALL P
+.. |Qscr| unicode:: U+1D4AC .. MATHEMATICAL SCRIPT CAPITAL Q
+.. |qscr| unicode:: U+1D4C6 .. MATHEMATICAL SCRIPT SMALL Q
+.. |Rscr| unicode:: U+0211B .. SCRIPT CAPITAL R
+.. |rscr| unicode:: U+1D4C7 .. MATHEMATICAL SCRIPT SMALL R
+.. |Sscr| unicode:: U+1D4AE .. MATHEMATICAL SCRIPT CAPITAL S
+.. |sscr| unicode:: U+1D4C8 .. MATHEMATICAL SCRIPT SMALL S
+.. |Tscr| unicode:: U+1D4AF .. MATHEMATICAL SCRIPT CAPITAL T
+.. |tscr| unicode:: U+1D4C9 .. MATHEMATICAL SCRIPT SMALL T
+.. |Uscr| unicode:: U+1D4B0 .. MATHEMATICAL SCRIPT CAPITAL U
+.. |uscr| unicode:: U+1D4CA .. MATHEMATICAL SCRIPT SMALL U
+.. |Vscr| unicode:: U+1D4B1 .. MATHEMATICAL SCRIPT CAPITAL V
+.. |vscr| unicode:: U+1D4CB .. MATHEMATICAL SCRIPT SMALL V
+.. |Wscr| unicode:: U+1D4B2 .. MATHEMATICAL SCRIPT CAPITAL W
+.. |wscr| unicode:: U+1D4CC .. MATHEMATICAL SCRIPT SMALL W
+.. |Xscr| unicode:: U+1D4B3 .. MATHEMATICAL SCRIPT CAPITAL X
+.. |xscr| unicode:: U+1D4CD .. MATHEMATICAL SCRIPT SMALL X
+.. |Yscr| unicode:: U+1D4B4 .. MATHEMATICAL SCRIPT CAPITAL Y
+.. |yscr| unicode:: U+1D4CE .. MATHEMATICAL SCRIPT SMALL Y
+.. |Zscr| unicode:: U+1D4B5 .. MATHEMATICAL SCRIPT CAPITAL Z
+.. |zscr| unicode:: U+1D4CF .. MATHEMATICAL SCRIPT SMALL Z
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isodia.txt
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isodia.txt (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isodia.txt (revision 3)
@@ -0,0 +1,20 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |acute| unicode:: U+000B4 .. ACUTE ACCENT
+.. |breve| unicode:: U+002D8 .. BREVE
+.. |caron| unicode:: U+002C7 .. CARON
+.. |cedil| unicode:: U+000B8 .. CEDILLA
+.. |circ|  unicode:: U+002C6 .. MODIFIER LETTER CIRCUMFLEX ACCENT
+.. |dblac| unicode:: U+002DD .. DOUBLE ACUTE ACCENT
+.. |die|   unicode:: U+000A8 .. DIAERESIS
+.. |dot|   unicode:: U+002D9 .. DOT ABOVE
+.. |grave| unicode:: U+00060 .. GRAVE ACCENT
+.. |macr|  unicode:: U+000AF .. MACRON
+.. |ogon|  unicode:: U+002DB .. OGONEK
+.. |ring|  unicode:: U+002DA .. RING ABOVE
+.. |tilde| unicode:: U+002DC .. SMALL TILDE
+.. |uml|   unicode:: U+000A8 .. DIAERESIS
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isoamsn.txt
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isoamsn.txt (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isoamsn.txt (revision 3)
@@ -0,0 +1,96 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |gnap|     unicode:: U+02A8A .. GREATER-THAN AND NOT APPROXIMATE
+.. |gnE|      unicode:: U+02269 .. GREATER-THAN BUT NOT EQUAL TO
+.. |gne|      unicode:: U+02A88 .. GREATER-THAN AND SINGLE-LINE NOT EQUAL TO
+.. |gnsim|    unicode:: U+022E7 .. GREATER-THAN BUT NOT EQUIVALENT TO
+.. |gvnE|     unicode:: U+02269 U+0FE00 .. GREATER-THAN BUT NOT EQUAL TO - with vertical stroke
+.. |lnap|     unicode:: U+02A89 .. LESS-THAN AND NOT APPROXIMATE
+.. |lnE|      unicode:: U+02268 .. LESS-THAN BUT NOT EQUAL TO
+.. |lne|      unicode:: U+02A87 .. LESS-THAN AND SINGLE-LINE NOT EQUAL TO
+.. |lnsim|    unicode:: U+022E6 .. LESS-THAN BUT NOT EQUIVALENT TO
+.. |lvnE|     unicode:: U+02268 U+0FE00 .. LESS-THAN BUT NOT EQUAL TO - with vertical stroke
+.. |nap|      unicode:: U+02249 .. NOT ALMOST EQUAL TO
+.. |napE|     unicode:: U+02A70 U+00338 .. APPROXIMATELY EQUAL OR EQUAL TO with slash
+.. |napid|    unicode:: U+0224B U+00338 .. TRIPLE TILDE with slash
+.. |ncong|    unicode:: U+02247 .. NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO
+.. |ncongdot| unicode:: U+02A6D U+00338 .. CONGRUENT WITH DOT ABOVE with slash
+.. |nequiv|   unicode:: U+02262 .. NOT IDENTICAL TO
+.. |ngE|      unicode:: U+02267 U+00338 .. GREATER-THAN OVER EQUAL TO with slash
+.. |nge|      unicode:: U+02271 .. NEITHER GREATER-THAN NOR EQUAL TO
+.. |nges|     unicode:: U+02A7E U+00338 .. GREATER-THAN OR SLANTED EQUAL TO with slash
+.. |nGg|      unicode:: U+022D9 U+00338 .. VERY MUCH GREATER-THAN with slash
+.. |ngsim|    unicode:: U+02275 .. NEITHER GREATER-THAN NOR EQUIVALENT TO
+.. |nGt|      unicode:: U+0226B U+020D2 .. MUCH GREATER THAN with vertical line
+.. |ngt|      unicode:: U+0226F .. NOT GREATER-THAN
+.. |nGtv|     unicode:: U+0226B U+00338 .. MUCH GREATER THAN with slash
+.. |nlE|      unicode:: U+02266 U+00338 .. LESS-THAN OVER EQUAL TO with slash
+.. |nle|      unicode:: U+02270 .. NEITHER LESS-THAN NOR EQUAL TO
+.. |nles|     unicode:: U+02A7D U+00338 .. LESS-THAN OR SLANTED EQUAL TO with slash
+.. |nLl|      unicode:: U+022D8 U+00338 .. VERY MUCH LESS-THAN with slash
+.. |nlsim|    unicode:: U+02274 .. NEITHER LESS-THAN NOR EQUIVALENT TO
+.. |nLt|      unicode:: U+0226A U+020D2 .. MUCH LESS THAN with vertical line
+.. |nlt|      unicode:: U+0226E .. NOT LESS-THAN
+.. |nltri|    unicode:: U+022EA .. NOT NORMAL SUBGROUP OF
+.. |nltrie|   unicode:: U+022EC .. NOT NORMAL SUBGROUP OF OR EQUAL TO
+.. |nLtv|     unicode:: U+0226A U+00338 .. MUCH LESS THAN with slash
+.. |nmid|     unicode:: U+02224 .. DOES NOT DIVIDE
+.. |npar|     unicode:: U+02226 .. NOT PARALLEL TO
+.. |npr|      unicode:: U+02280 .. DOES NOT PRECEDE
+.. |nprcue|   unicode:: U+022E0 .. DOES NOT PRECEDE OR EQUAL
+.. |npre|     unicode:: U+02AAF U+00338 .. PRECEDES ABOVE SINGLE-LINE EQUALS SIGN with slash
+.. |nrtri|    unicode:: U+022EB .. DOES NOT CONTAIN AS NORMAL SUBGROUP
+.. |nrtrie|   unicode:: U+022ED .. DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL
+.. |nsc|      unicode:: U+02281 .. DOES NOT SUCCEED
+.. |nsccue|   unicode:: U+022E1 .. DOES NOT SUCCEED OR EQUAL
+.. |nsce|     unicode:: U+02AB0 U+00338 .. SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN with slash
+.. |nsim|     unicode:: U+02241 .. NOT TILDE
+.. |nsime|    unicode:: U+02244 .. NOT ASYMPTOTICALLY EQUAL TO
+.. |nsmid|    unicode:: U+02224 .. DOES NOT DIVIDE
+.. |nspar|    unicode:: U+02226 .. NOT PARALLEL TO
+.. |nsqsube|  unicode:: U+022E2 .. NOT SQUARE IMAGE OF OR EQUAL TO
+.. |nsqsupe|  unicode:: U+022E3 .. NOT SQUARE ORIGINAL OF OR EQUAL TO
+.. |nsub|     unicode:: U+02284 .. NOT A SUBSET OF
+.. |nsubE|    unicode:: U+02AC5 U+00338 .. SUBSET OF ABOVE EQUALS SIGN with slash
+.. |nsube|    unicode:: U+02288 .. NEITHER A SUBSET OF NOR EQUAL TO
+.. |nsup|     unicode:: U+02285 .. NOT A SUPERSET OF
+.. |nsupE|    unicode:: U+02AC6 U+00338 .. SUPERSET OF ABOVE EQUALS SIGN with slash
+.. |nsupe|    unicode:: U+02289 .. NEITHER A SUPERSET OF NOR EQUAL TO
+.. |ntgl|     unicode:: U+02279 .. NEITHER GREATER-THAN NOR LESS-THAN
+.. |ntlg|     unicode:: U+02278 .. NEITHER LESS-THAN NOR GREATER-THAN
+.. |nvap|     unicode:: U+0224D U+020D2 .. EQUIVALENT TO with vertical line
+.. |nVDash|   unicode:: U+022AF .. NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
+.. |nVdash|   unicode:: U+022AE .. DOES NOT FORCE
+.. |nvDash|   unicode:: U+022AD .. NOT TRUE
+.. |nvdash|   unicode:: U+022AC .. DOES NOT PROVE
+.. |nvge|     unicode:: U+02265 U+020D2 .. GREATER-THAN OR EQUAL TO with vertical line
+.. |nvgt|     unicode:: U+0003E U+020D2 .. GREATER-THAN SIGN with vertical line
+.. |nvle|     unicode:: U+02264 U+020D2 .. LESS-THAN OR EQUAL TO with vertical line
+.. |nvlt|     unicode:: U+0003C U+020D2 .. LESS-THAN SIGN with vertical line
+.. |nvltrie|  unicode:: U+022B4 U+020D2 .. NORMAL SUBGROUP OF OR EQUAL TO with vertical line
+.. |nvrtrie|  unicode:: U+022B5 U+020D2 .. CONTAINS AS NORMAL SUBGROUP OR EQUAL TO with vertical line
+.. |nvsim|    unicode:: U+0223C U+020D2 .. TILDE OPERATOR with vertical line
+.. |parsim|   unicode:: U+02AF3 .. PARALLEL WITH TILDE OPERATOR
+.. |prnap|    unicode:: U+02AB9 .. PRECEDES ABOVE NOT ALMOST EQUAL TO
+.. |prnE|     unicode:: U+02AB5 .. PRECEDES ABOVE NOT EQUAL TO
+.. |prnsim|   unicode:: U+022E8 .. PRECEDES BUT NOT EQUIVALENT TO
+.. |rnmid|    unicode:: U+02AEE .. DOES NOT DIVIDE WITH REVERSED NEGATION SLASH
+.. |scnap|    unicode:: U+02ABA .. SUCCEEDS ABOVE NOT ALMOST EQUAL TO
+.. |scnE|     unicode:: U+02AB6 .. SUCCEEDS ABOVE NOT EQUAL TO
+.. |scnsim|   unicode:: U+022E9 .. SUCCEEDS BUT NOT EQUIVALENT TO
+.. |simne|    unicode:: U+02246 .. APPROXIMATELY BUT NOT ACTUALLY EQUAL TO
+.. |solbar|   unicode:: U+0233F .. APL FUNCTIONAL SYMBOL SLASH BAR
+.. |subnE|    unicode:: U+02ACB .. SUBSET OF ABOVE NOT EQUAL TO
+.. |subne|    unicode:: U+0228A .. SUBSET OF WITH NOT EQUAL TO
+.. |supnE|    unicode:: U+02ACC .. SUPERSET OF ABOVE NOT EQUAL TO
+.. |supne|    unicode:: U+0228B .. SUPERSET OF WITH NOT EQUAL TO
+.. |vnsub|    unicode:: U+02282 U+020D2 .. SUBSET OF with vertical line
+.. |vnsup|    unicode:: U+02283 U+020D2 .. SUPERSET OF with vertical line
+.. |vsubnE|   unicode:: U+02ACB U+0FE00 .. SUBSET OF ABOVE NOT EQUAL TO - variant with stroke through bottom members
+.. |vsubne|   unicode:: U+0228A U+0FE00 .. SUBSET OF WITH NOT EQUAL TO - variant with stroke through bottom members
+.. |vsupnE|   unicode:: U+02ACC U+0FE00 .. SUPERSET OF ABOVE NOT EQUAL TO - variant with stroke through bottom members
+.. |vsupne|   unicode:: U+0228B U+0FE00 .. SUPERSET OF WITH NOT EQUAL TO - variant with stroke through bottom members
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isoamso.txt
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isoamso.txt (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isoamso.txt (revision 3)
@@ -0,0 +1,62 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |ang|      unicode:: U+02220 .. ANGLE
+.. |ange|     unicode:: U+029A4 .. ANGLE WITH UNDERBAR
+.. |angmsd|   unicode:: U+02221 .. MEASURED ANGLE
+.. |angmsdaa| unicode:: U+029A8 .. MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT
+.. |angmsdab| unicode:: U+029A9 .. MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT
+.. |angmsdac| unicode:: U+029AA .. MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT
+.. |angmsdad| unicode:: U+029AB .. MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT
+.. |angmsdae| unicode:: U+029AC .. MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP
+.. |angmsdaf| unicode:: U+029AD .. MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP
+.. |angmsdag| unicode:: U+029AE .. MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN
+.. |angmsdah| unicode:: U+029AF .. MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN
+.. |angrtvb|  unicode:: U+022BE .. RIGHT ANGLE WITH ARC
+.. |angrtvbd| unicode:: U+0299D .. MEASURED RIGHT ANGLE WITH DOT
+.. |bbrk|     unicode:: U+023B5 .. BOTTOM SQUARE BRACKET
+.. |bbrktbrk| unicode:: U+023B6 .. BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET
+.. |bemptyv|  unicode:: U+029B0 .. REVERSED EMPTY SET
+.. |beth|     unicode:: U+02136 .. BET SYMBOL
+.. |boxbox|   unicode:: U+029C9 .. TWO JOINED SQUARES
+.. |bprime|   unicode:: U+02035 .. REVERSED PRIME
+.. |bsemi|    unicode:: U+0204F .. REVERSED SEMICOLON
+.. |cemptyv|  unicode:: U+029B2 .. EMPTY SET WITH SMALL CIRCLE ABOVE
+.. |cirE|     unicode:: U+029C3 .. CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT
+.. |cirscir|  unicode:: U+029C2 .. CIRCLE WITH SMALL CIRCLE TO THE RIGHT
+.. |comp|     unicode:: U+02201 .. COMPLEMENT
+.. |daleth|   unicode:: U+02138 .. DALET SYMBOL
+.. |demptyv|  unicode:: U+029B1 .. EMPTY SET WITH OVERBAR
+.. |ell|      unicode:: U+02113 .. SCRIPT SMALL L
+.. |empty|    unicode:: U+02205 .. EMPTY SET
+.. |emptyv|   unicode:: U+02205 .. EMPTY SET
+.. |gimel|    unicode:: U+02137 .. GIMEL SYMBOL
+.. |iiota|    unicode:: U+02129 .. TURNED GREEK SMALL LETTER IOTA
+.. |image|    unicode:: U+02111 .. BLACK-LETTER CAPITAL I
+.. |imath|    unicode:: U+00131 .. LATIN SMALL LETTER DOTLESS I
+.. |inodot|   unicode:: U+00131 .. LATIN SMALL LETTER DOTLESS I
+.. |jmath|    unicode:: U+0006A .. LATIN SMALL LETTER J
+.. |jnodot|   unicode:: U+0006A .. LATIN SMALL LETTER J
+.. |laemptyv| unicode:: U+029B4 .. EMPTY SET WITH LEFT ARROW ABOVE
+.. |lltri|    unicode:: U+025FA .. LOWER LEFT TRIANGLE
+.. |lrtri|    unicode:: U+022BF .. RIGHT TRIANGLE
+.. |mho|      unicode:: U+02127 .. INVERTED OHM SIGN
+.. |nang|     unicode:: U+02220 U+020D2 .. ANGLE with vertical line
+.. |nexist|   unicode:: U+02204 .. THERE DOES NOT EXIST
+.. |oS|       unicode:: U+024C8 .. CIRCLED LATIN CAPITAL LETTER S
+.. |planck|   unicode:: U+0210F .. PLANCK CONSTANT OVER TWO PI
+.. |plankv|   unicode:: U+0210F .. PLANCK CONSTANT OVER TWO PI
+.. |raemptyv| unicode:: U+029B3 .. EMPTY SET WITH RIGHT ARROW ABOVE
+.. |range|    unicode:: U+029A5 .. REVERSED ANGLE WITH UNDERBAR
+.. |real|     unicode:: U+0211C .. BLACK-LETTER CAPITAL R
+.. |sbsol|    unicode:: U+0FE68 .. SMALL REVERSE SOLIDUS
+.. |tbrk|     unicode:: U+023B4 .. TOP SQUARE BRACKET
+.. |trpezium| unicode:: U+0FFFD .. REPLACEMENT CHARACTER
+.. |ultri|    unicode:: U+025F8 .. UPPER LEFT TRIANGLE
+.. |urtri|    unicode:: U+025F9 .. UPPER RIGHT TRIANGLE
+.. |vprime|   unicode:: U+02032 .. PRIME
+.. |vzigzag|  unicode:: U+0299A .. VERTICAL ZIGZAG LINE
+.. |weierp|   unicode:: U+02118 .. SCRIPT CAPITAL P
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isolat1.txt
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isolat1.txt (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isolat1.txt (revision 3)
@@ -0,0 +1,68 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |Aacute| unicode:: U+000C1 .. LATIN CAPITAL LETTER A WITH ACUTE
+.. |aacute| unicode:: U+000E1 .. LATIN SMALL LETTER A WITH ACUTE
+.. |Acirc|  unicode:: U+000C2 .. LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+.. |acirc|  unicode:: U+000E2 .. LATIN SMALL LETTER A WITH CIRCUMFLEX
+.. |AElig|  unicode:: U+000C6 .. LATIN CAPITAL LETTER AE
+.. |aelig|  unicode:: U+000E6 .. LATIN SMALL LETTER AE
+.. |Agrave| unicode:: U+000C0 .. LATIN CAPITAL LETTER A WITH GRAVE
+.. |agrave| unicode:: U+000E0 .. LATIN SMALL LETTER A WITH GRAVE
+.. |Aring|  unicode:: U+000C5 .. LATIN CAPITAL LETTER A WITH RING ABOVE
+.. |aring|  unicode:: U+000E5 .. LATIN SMALL LETTER A WITH RING ABOVE
+.. |Atilde| unicode:: U+000C3 .. LATIN CAPITAL LETTER A WITH TILDE
+.. |atilde| unicode:: U+000E3 .. LATIN SMALL LETTER A WITH TILDE
+.. |Auml|   unicode:: U+000C4 .. LATIN CAPITAL LETTER A WITH DIAERESIS
+.. |auml|   unicode:: U+000E4 .. LATIN SMALL LETTER A WITH DIAERESIS
+.. |Ccedil| unicode:: U+000C7 .. LATIN CAPITAL LETTER C WITH CEDILLA
+.. |ccedil| unicode:: U+000E7 .. LATIN SMALL LETTER C WITH CEDILLA
+.. |Eacute| unicode:: U+000C9 .. LATIN CAPITAL LETTER E WITH ACUTE
+.. |eacute| unicode:: U+000E9 .. LATIN SMALL LETTER E WITH ACUTE
+.. |Ecirc|  unicode:: U+000CA .. LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+.. |ecirc|  unicode:: U+000EA .. LATIN SMALL LETTER E WITH CIRCUMFLEX
+.. |Egrave| unicode:: U+000C8 .. LATIN CAPITAL LETTER E WITH GRAVE
+.. |egrave| unicode:: U+000E8 .. LATIN SMALL LETTER E WITH GRAVE
+.. |ETH|    unicode:: U+000D0 .. LATIN CAPITAL LETTER ETH
+.. |eth|    unicode:: U+000F0 .. LATIN SMALL LETTER ETH
+.. |Euml|   unicode:: U+000CB .. LATIN CAPITAL LETTER E WITH DIAERESIS
+.. |euml|   unicode:: U+000EB .. LATIN SMALL LETTER E WITH DIAERESIS
+.. |Iacute| unicode:: U+000CD .. LATIN CAPITAL LETTER I WITH ACUTE
+.. |iacute| unicode:: U+000ED .. LATIN SMALL LETTER I WITH ACUTE
+.. |Icirc|  unicode:: U+000CE .. LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+.. |icirc|  unicode:: U+000EE .. LATIN SMALL LETTER I WITH CIRCUMFLEX
+.. |Igrave| unicode:: U+000CC .. LATIN CAPITAL LETTER I WITH GRAVE
+.. |igrave| unicode:: U+000EC .. LATIN SMALL LETTER I WITH GRAVE
+.. |Iuml|   unicode:: U+000CF .. LATIN CAPITAL LETTER I WITH DIAERESIS
+.. |iuml|   unicode:: U+000EF .. LATIN SMALL LETTER I WITH DIAERESIS
+.. |Ntilde| unicode:: U+000D1 .. LATIN CAPITAL LETTER N WITH TILDE
+.. |ntilde| unicode:: U+000F1 .. LATIN SMALL LETTER N WITH TILDE
+.. |Oacute| unicode:: U+000D3 .. LATIN CAPITAL LETTER O WITH ACUTE
+.. |oacute| unicode:: U+000F3 .. LATIN SMALL LETTER O WITH ACUTE
+.. |Ocirc|  unicode:: U+000D4 .. LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+.. |ocirc|  unicode:: U+000F4 .. LATIN SMALL LETTER O WITH CIRCUMFLEX
+.. |Ograve| unicode:: U+000D2 .. LATIN CAPITAL LETTER O WITH GRAVE
+.. |ograve| unicode:: U+000F2 .. LATIN SMALL LETTER O WITH GRAVE
+.. |Oslash| unicode:: U+000D8 .. LATIN CAPITAL LETTER O WITH STROKE
+.. |oslash| unicode:: U+000F8 .. LATIN SMALL LETTER O WITH STROKE
+.. |Otilde| unicode:: U+000D5 .. LATIN CAPITAL LETTER O WITH TILDE
+.. |otilde| unicode:: U+000F5 .. LATIN SMALL LETTER O WITH TILDE
+.. |Ouml|   unicode:: U+000D6 .. LATIN CAPITAL LETTER O WITH DIAERESIS
+.. |ouml|   unicode:: U+000F6 .. LATIN SMALL LETTER O WITH DIAERESIS
+.. |szlig|  unicode:: U+000DF .. LATIN SMALL LETTER SHARP S
+.. |THORN|  unicode:: U+000DE .. LATIN CAPITAL LETTER THORN
+.. |thorn|  unicode:: U+000FE .. LATIN SMALL LETTER THORN
+.. |Uacute| unicode:: U+000DA .. LATIN CAPITAL LETTER U WITH ACUTE
+.. |uacute| unicode:: U+000FA .. LATIN SMALL LETTER U WITH ACUTE
+.. |Ucirc|  unicode:: U+000DB .. LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+.. |ucirc|  unicode:: U+000FB .. LATIN SMALL LETTER U WITH CIRCUMFLEX
+.. |Ugrave| unicode:: U+000D9 .. LATIN CAPITAL LETTER U WITH GRAVE
+.. |ugrave| unicode:: U+000F9 .. LATIN SMALL LETTER U WITH GRAVE
+.. |Uuml|   unicode:: U+000DC .. LATIN CAPITAL LETTER U WITH DIAERESIS
+.. |uuml|   unicode:: U+000FC .. LATIN SMALL LETTER U WITH DIAERESIS
+.. |Yacute| unicode:: U+000DD .. LATIN CAPITAL LETTER Y WITH ACUTE
+.. |yacute| unicode:: U+000FD .. LATIN SMALL LETTER Y WITH ACUTE
+.. |yuml|   unicode:: U+000FF .. LATIN SMALL LETTER Y WITH DIAERESIS
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isolat2.txt
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isolat2.txt (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isolat2.txt (revision 3)
@@ -0,0 +1,128 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |Abreve| unicode:: U+00102 .. LATIN CAPITAL LETTER A WITH BREVE
+.. |abreve| unicode:: U+00103 .. LATIN SMALL LETTER A WITH BREVE
+.. |Amacr|  unicode:: U+00100 .. LATIN CAPITAL LETTER A WITH MACRON
+.. |amacr|  unicode:: U+00101 .. LATIN SMALL LETTER A WITH MACRON
+.. |Aogon|  unicode:: U+00104 .. LATIN CAPITAL LETTER A WITH OGONEK
+.. |aogon|  unicode:: U+00105 .. LATIN SMALL LETTER A WITH OGONEK
+.. |Cacute| unicode:: U+00106 .. LATIN CAPITAL LETTER C WITH ACUTE
+.. |cacute| unicode:: U+00107 .. LATIN SMALL LETTER C WITH ACUTE
+.. |Ccaron| unicode:: U+0010C .. LATIN CAPITAL LETTER C WITH CARON
+.. |ccaron| unicode:: U+0010D .. LATIN SMALL LETTER C WITH CARON
+.. |Ccirc|  unicode:: U+00108 .. LATIN CAPITAL LETTER C WITH CIRCUMFLEX
+.. |ccirc|  unicode:: U+00109 .. LATIN SMALL LETTER C WITH CIRCUMFLEX
+.. |Cdot|   unicode:: U+0010A .. LATIN CAPITAL LETTER C WITH DOT ABOVE
+.. |cdot|   unicode:: U+0010B .. LATIN SMALL LETTER C WITH DOT ABOVE
+.. |Dcaron| unicode:: U+0010E .. LATIN CAPITAL LETTER D WITH CARON
+.. |dcaron| unicode:: U+0010F .. LATIN SMALL LETTER D WITH CARON
+.. |Dstrok| unicode:: U+00110 .. LATIN CAPITAL LETTER D WITH STROKE
+.. |dstrok| unicode:: U+00111 .. LATIN SMALL LETTER D WITH STROKE
+.. |Ecaron| unicode:: U+0011A .. LATIN CAPITAL LETTER E WITH CARON
+.. |ecaron| unicode:: U+0011B .. LATIN SMALL LETTER E WITH CARON
+.. |Edot|   unicode:: U+00116 .. LATIN CAPITAL LETTER E WITH DOT ABOVE
+.. |edot|   unicode:: U+00117 .. LATIN SMALL LETTER E WITH DOT ABOVE
+.. |Emacr|  unicode:: U+00112 .. LATIN CAPITAL LETTER E WITH MACRON
+.. |emacr|  unicode:: U+00113 .. LATIN SMALL LETTER E WITH MACRON
+.. |ENG|    unicode:: U+0014A .. LATIN CAPITAL LETTER ENG
+.. |eng|    unicode:: U+0014B .. LATIN SMALL LETTER ENG
+.. |Eogon|  unicode:: U+00118 .. LATIN CAPITAL LETTER E WITH OGONEK
+.. |eogon|  unicode:: U+00119 .. LATIN SMALL LETTER E WITH OGONEK
+.. |gacute| unicode:: U+001F5 .. LATIN SMALL LETTER G WITH ACUTE
+.. |Gbreve| unicode:: U+0011E .. LATIN CAPITAL LETTER G WITH BREVE
+.. |gbreve| unicode:: U+0011F .. LATIN SMALL LETTER G WITH BREVE
+.. |Gcedil| unicode:: U+00122 .. LATIN CAPITAL LETTER G WITH CEDILLA
+.. |gcedil| unicode:: U+00123 .. LATIN SMALL LETTER G WITH CEDILLA
+.. |Gcirc|  unicode:: U+0011C .. LATIN CAPITAL LETTER G WITH CIRCUMFLEX
+.. |gcirc|  unicode:: U+0011D .. LATIN SMALL LETTER G WITH CIRCUMFLEX
+.. |Gdot|   unicode:: U+00120 .. LATIN CAPITAL LETTER G WITH DOT ABOVE
+.. |gdot|   unicode:: U+00121 .. LATIN SMALL LETTER G WITH DOT ABOVE
+.. |Hcirc|  unicode:: U+00124 .. LATIN CAPITAL LETTER H WITH CIRCUMFLEX
+.. |hcirc|  unicode:: U+00125 .. LATIN SMALL LETTER H WITH CIRCUMFLEX
+.. |Hstrok| unicode:: U+00126 .. LATIN CAPITAL LETTER H WITH STROKE
+.. |hstrok| unicode:: U+00127 .. LATIN SMALL LETTER H WITH STROKE
+.. |Idot|   unicode:: U+00130 .. LATIN CAPITAL LETTER I WITH DOT ABOVE
+.. |IJlig|  unicode:: U+00132 .. LATIN CAPITAL LIGATURE IJ
+.. |ijlig|  unicode:: U+00133 .. LATIN SMALL LIGATURE IJ
+.. |Imacr|  unicode:: U+0012A .. LATIN CAPITAL LETTER I WITH MACRON
+.. |imacr|  unicode:: U+0012B .. LATIN SMALL LETTER I WITH MACRON
+.. |inodot| unicode:: U+00131 .. LATIN SMALL LETTER DOTLESS I
+.. |Iogon|  unicode:: U+0012E .. LATIN CAPITAL LETTER I WITH OGONEK
+.. |iogon|  unicode:: U+0012F .. LATIN SMALL LETTER I WITH OGONEK
+.. |Itilde| unicode:: U+00128 .. LATIN CAPITAL LETTER I WITH TILDE
+.. |itilde| unicode:: U+00129 .. LATIN SMALL LETTER I WITH TILDE
+.. |Jcirc|  unicode:: U+00134 .. LATIN CAPITAL LETTER J WITH CIRCUMFLEX
+.. |jcirc|  unicode:: U+00135 .. LATIN SMALL LETTER J WITH CIRCUMFLEX
+.. |Kcedil| unicode:: U+00136 .. LATIN CAPITAL LETTER K WITH CEDILLA
+.. |kcedil| unicode:: U+00137 .. LATIN SMALL LETTER K WITH CEDILLA
+.. |kgreen| unicode:: U+00138 .. LATIN SMALL LETTER KRA
+.. |Lacute| unicode:: U+00139 .. LATIN CAPITAL LETTER L WITH ACUTE
+.. |lacute| unicode:: U+0013A .. LATIN SMALL LETTER L WITH ACUTE
+.. |Lcaron| unicode:: U+0013D .. LATIN CAPITAL LETTER L WITH CARON
+.. |lcaron| unicode:: U+0013E .. LATIN SMALL LETTER L WITH CARON
+.. |Lcedil| unicode:: U+0013B .. LATIN CAPITAL LETTER L WITH CEDILLA
+.. |lcedil| unicode:: U+0013C .. LATIN SMALL LETTER L WITH CEDILLA
+.. |Lmidot| unicode:: U+0013F .. LATIN CAPITAL LETTER L WITH MIDDLE DOT
+.. |lmidot| unicode:: U+00140 .. LATIN SMALL LETTER L WITH MIDDLE DOT
+.. |Lstrok| unicode:: U+00141 .. LATIN CAPITAL LETTER L WITH STROKE
+.. |lstrok| unicode:: U+00142 .. LATIN SMALL LETTER L WITH STROKE
+.. |Nacute| unicode:: U+00143 .. LATIN CAPITAL LETTER N WITH ACUTE
+.. |nacute| unicode:: U+00144 .. LATIN SMALL LETTER N WITH ACUTE
+.. |napos|  unicode:: U+00149 .. LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
+.. |Ncaron| unicode:: U+00147 .. LATIN CAPITAL LETTER N WITH CARON
+.. |ncaron| unicode:: U+00148 .. LATIN SMALL LETTER N WITH CARON
+.. |Ncedil| unicode:: U+00145 .. LATIN CAPITAL LETTER N WITH CEDILLA
+.. |ncedil| unicode:: U+00146 .. LATIN SMALL LETTER N WITH CEDILLA
+.. |Odblac| unicode:: U+00150 .. LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+.. |odblac| unicode:: U+00151 .. LATIN SMALL LETTER O WITH DOUBLE ACUTE
+.. |OElig|  unicode:: U+00152 .. LATIN CAPITAL LIGATURE OE
+.. |oelig|  unicode:: U+00153 .. LATIN SMALL LIGATURE OE
+.. |Omacr|  unicode:: U+0014C .. LATIN CAPITAL LETTER O WITH MACRON
+.. |omacr|  unicode:: U+0014D .. LATIN SMALL LETTER O WITH MACRON
+.. |Racute| unicode:: U+00154 .. LATIN CAPITAL LETTER R WITH ACUTE
+.. |racute| unicode:: U+00155 .. LATIN SMALL LETTER R WITH ACUTE
+.. |Rcaron| unicode:: U+00158 .. LATIN CAPITAL LETTER R WITH CARON
+.. |rcaron| unicode:: U+00159 .. LATIN SMALL LETTER R WITH CARON
+.. |Rcedil| unicode:: U+00156 .. LATIN CAPITAL LETTER R WITH CEDILLA
+.. |rcedil| unicode:: U+00157 .. LATIN SMALL LETTER R WITH CEDILLA
+.. |Sacute| unicode:: U+0015A .. LATIN CAPITAL LETTER S WITH ACUTE
+.. |sacute| unicode:: U+0015B .. LATIN SMALL LETTER S WITH ACUTE
+.. |Scaron| unicode:: U+00160 .. LATIN CAPITAL LETTER S WITH CARON
+.. |scaron| unicode:: U+00161 .. LATIN SMALL LETTER S WITH CARON
+.. |Scedil| unicode:: U+0015E .. LATIN CAPITAL LETTER S WITH CEDILLA
+.. |scedil| unicode:: U+0015F .. LATIN SMALL LETTER S WITH CEDILLA
+.. |Scirc|  unicode:: U+0015C .. LATIN CAPITAL LETTER S WITH CIRCUMFLEX
+.. |scirc|  unicode:: U+0015D .. LATIN SMALL LETTER S WITH CIRCUMFLEX
+.. |Tcaron| unicode:: U+00164 .. LATIN CAPITAL LETTER T WITH CARON
+.. |tcaron| unicode:: U+00165 .. LATIN SMALL LETTER T WITH CARON
+.. |Tcedil| unicode:: U+00162 .. LATIN CAPITAL LETTER T WITH CEDILLA
+.. |tcedil| unicode:: U+00163 .. LATIN SMALL LETTER T WITH CEDILLA
+.. |Tstrok| unicode:: U+00166 .. LATIN CAPITAL LETTER T WITH STROKE
+.. |tstrok| unicode:: U+00167 .. LATIN SMALL LETTER T WITH STROKE
+.. |Ubreve| unicode:: U+0016C .. LATIN CAPITAL LETTER U WITH BREVE
+.. |ubreve| unicode:: U+0016D .. LATIN SMALL LETTER U WITH BREVE
+.. |Udblac| unicode:: U+00170 .. LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+.. |udblac| unicode:: U+00171 .. LATIN SMALL LETTER U WITH DOUBLE ACUTE
+.. |Umacr|  unicode:: U+0016A .. LATIN CAPITAL LETTER U WITH MACRON
+.. |umacr|  unicode:: U+0016B .. LATIN SMALL LETTER U WITH MACRON
+.. |Uogon|  unicode:: U+00172 .. LATIN CAPITAL LETTER U WITH OGONEK
+.. |uogon|  unicode:: U+00173 .. LATIN SMALL LETTER U WITH OGONEK
+.. |Uring|  unicode:: U+0016E .. LATIN CAPITAL LETTER U WITH RING ABOVE
+.. |uring|  unicode:: U+0016F .. LATIN SMALL LETTER U WITH RING ABOVE
+.. |Utilde| unicode:: U+00168 .. LATIN CAPITAL LETTER U WITH TILDE
+.. |utilde| unicode:: U+00169 .. LATIN SMALL LETTER U WITH TILDE
+.. |Wcirc|  unicode:: U+00174 .. LATIN CAPITAL LETTER W WITH CIRCUMFLEX
+.. |wcirc|  unicode:: U+00175 .. LATIN SMALL LETTER W WITH CIRCUMFLEX
+.. |Ycirc|  unicode:: U+00176 .. LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
+.. |ycirc|  unicode:: U+00177 .. LATIN SMALL LETTER Y WITH CIRCUMFLEX
+.. |Yuml|   unicode:: U+00178 .. LATIN CAPITAL LETTER Y WITH DIAERESIS
+.. |Zacute| unicode:: U+00179 .. LATIN CAPITAL LETTER Z WITH ACUTE
+.. |zacute| unicode:: U+0017A .. LATIN SMALL LETTER Z WITH ACUTE
+.. |Zcaron| unicode:: U+0017D .. LATIN CAPITAL LETTER Z WITH CARON
+.. |zcaron| unicode:: U+0017E .. LATIN SMALL LETTER Z WITH CARON
+.. |Zdot|   unicode:: U+0017B .. LATIN CAPITAL LETTER Z WITH DOT ABOVE
+.. |zdot|   unicode:: U+0017C .. LATIN SMALL LETTER Z WITH DOT ABOVE
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isoamsr.txt
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isoamsr.txt (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isoamsr.txt (revision 3)
@@ -0,0 +1,191 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |apE|      unicode:: U+02A70 .. APPROXIMATELY EQUAL OR EQUAL TO
+.. |ape|      unicode:: U+0224A .. ALMOST EQUAL OR EQUAL TO
+.. |apid|     unicode:: U+0224B .. TRIPLE TILDE
+.. |asymp|    unicode:: U+02248 .. ALMOST EQUAL TO
+.. |Barv|     unicode:: U+02AE7 .. SHORT DOWN TACK WITH OVERBAR
+.. |bcong|    unicode:: U+0224C .. ALL EQUAL TO
+.. |bepsi|    unicode:: U+003F6 .. GREEK REVERSED LUNATE EPSILON SYMBOL
+.. |bowtie|   unicode:: U+022C8 .. BOWTIE
+.. |bsim|     unicode:: U+0223D .. REVERSED TILDE
+.. |bsime|    unicode:: U+022CD .. REVERSED TILDE EQUALS
+.. |bsolhsub| unicode:: U+0005C U+02282 .. REVERSE SOLIDUS, SUBSET OF
+.. |bump|     unicode:: U+0224E .. GEOMETRICALLY EQUIVALENT TO
+.. |bumpE|    unicode:: U+02AAE .. EQUALS SIGN WITH BUMPY ABOVE
+.. |bumpe|    unicode:: U+0224F .. DIFFERENCE BETWEEN
+.. |cire|     unicode:: U+02257 .. RING EQUAL TO
+.. |Colon|    unicode:: U+02237 .. PROPORTION
+.. |Colone|   unicode:: U+02A74 .. DOUBLE COLON EQUAL
+.. |colone|   unicode:: U+02254 .. COLON EQUALS
+.. |congdot|  unicode:: U+02A6D .. CONGRUENT WITH DOT ABOVE
+.. |csub|     unicode:: U+02ACF .. CLOSED SUBSET
+.. |csube|    unicode:: U+02AD1 .. CLOSED SUBSET OR EQUAL TO
+.. |csup|     unicode:: U+02AD0 .. CLOSED SUPERSET
+.. |csupe|    unicode:: U+02AD2 .. CLOSED SUPERSET OR EQUAL TO
+.. |cuepr|    unicode:: U+022DE .. EQUAL TO OR PRECEDES
+.. |cuesc|    unicode:: U+022DF .. EQUAL TO OR SUCCEEDS
+.. |cupre|    unicode:: U+0227C .. PRECEDES OR EQUAL TO
+.. |Dashv|    unicode:: U+02AE4 .. VERTICAL BAR DOUBLE LEFT TURNSTILE
+.. |dashv|    unicode:: U+022A3 .. LEFT TACK
+.. |easter|   unicode:: U+02A6E .. EQUALS WITH ASTERISK
+.. |ecir|     unicode:: U+02256 .. RING IN EQUAL TO
+.. |ecolon|   unicode:: U+02255 .. EQUALS COLON
+.. |eDDot|    unicode:: U+02A77 .. EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW
+.. |eDot|     unicode:: U+02251 .. GEOMETRICALLY EQUAL TO
+.. |efDot|    unicode:: U+02252 .. APPROXIMATELY EQUAL TO OR THE IMAGE OF
+.. |eg|       unicode:: U+02A9A .. DOUBLE-LINE EQUAL TO OR GREATER-THAN
+.. |egs|      unicode:: U+02A96 .. SLANTED EQUAL TO OR GREATER-THAN
+.. |egsdot|   unicode:: U+02A98 .. SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE
+.. |el|       unicode:: U+02A99 .. DOUBLE-LINE EQUAL TO OR LESS-THAN
+.. |els|      unicode:: U+02A95 .. SLANTED EQUAL TO OR LESS-THAN
+.. |elsdot|   unicode:: U+02A97 .. SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE
+.. |equest|   unicode:: U+0225F .. QUESTIONED EQUAL TO
+.. |equivDD|  unicode:: U+02A78 .. EQUIVALENT WITH FOUR DOTS ABOVE
+.. |erDot|    unicode:: U+02253 .. IMAGE OF OR APPROXIMATELY EQUAL TO
+.. |esdot|    unicode:: U+02250 .. APPROACHES THE LIMIT
+.. |Esim|     unicode:: U+02A73 .. EQUALS SIGN ABOVE TILDE OPERATOR
+.. |esim|     unicode:: U+02242 .. MINUS TILDE
+.. |fork|     unicode:: U+022D4 .. PITCHFORK
+.. |forkv|    unicode:: U+02AD9 .. ELEMENT OF OPENING DOWNWARDS
+.. |frown|    unicode:: U+02322 .. FROWN
+.. |gap|      unicode:: U+02A86 .. GREATER-THAN OR APPROXIMATE
+.. |gE|       unicode:: U+02267 .. GREATER-THAN OVER EQUAL TO
+.. |gEl|      unicode:: U+02A8C .. GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN
+.. |gel|      unicode:: U+022DB .. GREATER-THAN EQUAL TO OR LESS-THAN
+.. |ges|      unicode:: U+02A7E .. GREATER-THAN OR SLANTED EQUAL TO
+.. |gescc|    unicode:: U+02AA9 .. GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL
+.. |gesdot|   unicode:: U+02A80 .. GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE
+.. |gesdoto|  unicode:: U+02A82 .. GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE
+.. |gesdotol| unicode:: U+02A84 .. GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT
+.. |gesl|     unicode:: U+022DB U+0FE00 .. GREATER-THAN slanted EQUAL TO OR LESS-THAN
+.. |gesles|   unicode:: U+02A94 .. GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL
+.. |Gg|       unicode:: U+022D9 .. VERY MUCH GREATER-THAN
+.. |gl|       unicode:: U+02277 .. GREATER-THAN OR LESS-THAN
+.. |gla|      unicode:: U+02AA5 .. GREATER-THAN BESIDE LESS-THAN
+.. |glE|      unicode:: U+02A92 .. GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL
+.. |glj|      unicode:: U+02AA4 .. GREATER-THAN OVERLAPPING LESS-THAN
+.. |gsdot|    unicode:: U+022D7 .. GREATER-THAN WITH DOT
+.. |gsim|     unicode:: U+02273 .. GREATER-THAN OR EQUIVALENT TO
+.. |gsime|    unicode:: U+02A8E .. GREATER-THAN ABOVE SIMILAR OR EQUAL
+.. |gsiml|    unicode:: U+02A90 .. GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN
+.. |Gt|       unicode:: U+0226B .. MUCH GREATER-THAN
+.. |gtcc|     unicode:: U+02AA7 .. GREATER-THAN CLOSED BY CURVE
+.. |gtcir|    unicode:: U+02A7A .. GREATER-THAN WITH CIRCLE INSIDE
+.. |gtdot|    unicode:: U+022D7 .. GREATER-THAN WITH DOT
+.. |gtquest|  unicode:: U+02A7C .. GREATER-THAN WITH QUESTION MARK ABOVE
+.. |gtrarr|   unicode:: U+02978 .. GREATER-THAN ABOVE RIGHTWARDS ARROW
+.. |homtht|   unicode:: U+0223B .. HOMOTHETIC
+.. |lap|      unicode:: U+02A85 .. LESS-THAN OR APPROXIMATE
+.. |lat|      unicode:: U+02AAB .. LARGER THAN
+.. |late|     unicode:: U+02AAD .. LARGER THAN OR EQUAL TO
+.. |lates|    unicode:: U+02AAD U+0FE00 .. LARGER THAN OR slanted EQUAL
+.. |ldot|     unicode:: U+022D6 .. LESS-THAN WITH DOT
+.. |lE|       unicode:: U+02266 .. LESS-THAN OVER EQUAL TO
+.. |lEg|      unicode:: U+02A8B .. LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN
+.. |leg|      unicode:: U+022DA .. LESS-THAN EQUAL TO OR GREATER-THAN
+.. |les|      unicode:: U+02A7D .. LESS-THAN OR SLANTED EQUAL TO
+.. |lescc|    unicode:: U+02AA8 .. LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL
+.. |lesdot|   unicode:: U+02A7F .. LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE
+.. |lesdoto|  unicode:: U+02A81 .. LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE
+.. |lesdotor| unicode:: U+02A83 .. LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT
+.. |lesg|     unicode:: U+022DA U+0FE00 .. LESS-THAN slanted EQUAL TO OR GREATER-THAN
+.. |lesges|   unicode:: U+02A93 .. LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL
+.. |lg|       unicode:: U+02276 .. LESS-THAN OR GREATER-THAN
+.. |lgE|      unicode:: U+02A91 .. LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL
+.. |Ll|       unicode:: U+022D8 .. VERY MUCH LESS-THAN
+.. |lsim|     unicode:: U+02272 .. LESS-THAN OR EQUIVALENT TO
+.. |lsime|    unicode:: U+02A8D .. LESS-THAN ABOVE SIMILAR OR EQUAL
+.. |lsimg|    unicode:: U+02A8F .. LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN
+.. |Lt|       unicode:: U+0226A .. MUCH LESS-THAN
+.. |ltcc|     unicode:: U+02AA6 .. LESS-THAN CLOSED BY CURVE
+.. |ltcir|    unicode:: U+02A79 .. LESS-THAN WITH CIRCLE INSIDE
+.. |ltdot|    unicode:: U+022D6 .. LESS-THAN WITH DOT
+.. |ltlarr|   unicode:: U+02976 .. LESS-THAN ABOVE LEFTWARDS ARROW
+.. |ltquest|  unicode:: U+02A7B .. LESS-THAN WITH QUESTION MARK ABOVE
+.. |ltrie|    unicode:: U+022B4 .. NORMAL SUBGROUP OF OR EQUAL TO
+.. |mcomma|   unicode:: U+02A29 .. MINUS SIGN WITH COMMA ABOVE
+.. |mDDot|    unicode:: U+0223A .. GEOMETRIC PROPORTION
+.. |mid|      unicode:: U+02223 .. DIVIDES
+.. |mlcp|     unicode:: U+02ADB .. TRANSVERSAL INTERSECTION
+.. |models|   unicode:: U+022A7 .. MODELS
+.. |mstpos|   unicode:: U+0223E .. INVERTED LAZY S
+.. |Pr|       unicode:: U+02ABB .. DOUBLE PRECEDES
+.. |pr|       unicode:: U+0227A .. PRECEDES
+.. |prap|     unicode:: U+02AB7 .. PRECEDES ABOVE ALMOST EQUAL TO
+.. |prcue|    unicode:: U+0227C .. PRECEDES OR EQUAL TO
+.. |prE|      unicode:: U+02AB3 .. PRECEDES ABOVE EQUALS SIGN
+.. |pre|      unicode:: U+02AAF .. PRECEDES ABOVE SINGLE-LINE EQUALS SIGN
+.. |prsim|    unicode:: U+0227E .. PRECEDES OR EQUIVALENT TO
+.. |prurel|   unicode:: U+022B0 .. PRECEDES UNDER RELATION
+.. |ratio|    unicode:: U+02236 .. RATIO
+.. |rtrie|    unicode:: U+022B5 .. CONTAINS AS NORMAL SUBGROUP OR EQUAL TO
+.. |rtriltri| unicode:: U+029CE .. RIGHT TRIANGLE ABOVE LEFT TRIANGLE
+.. |samalg|   unicode:: U+02210 .. N-ARY COPRODUCT
+.. |Sc|       unicode:: U+02ABC .. DOUBLE SUCCEEDS
+.. |sc|       unicode:: U+0227B .. SUCCEEDS
+.. |scap|     unicode:: U+02AB8 .. SUCCEEDS ABOVE ALMOST EQUAL TO
+.. |sccue|    unicode:: U+0227D .. SUCCEEDS OR EQUAL TO
+.. |scE|      unicode:: U+02AB4 .. SUCCEEDS ABOVE EQUALS SIGN
+.. |sce|      unicode:: U+02AB0 .. SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN
+.. |scsim|    unicode:: U+0227F .. SUCCEEDS OR EQUIVALENT TO
+.. |sdote|    unicode:: U+02A66 .. EQUALS SIGN WITH DOT BELOW
+.. |sfrown|   unicode:: U+02322 .. FROWN
+.. |simg|     unicode:: U+02A9E .. SIMILAR OR GREATER-THAN
+.. |simgE|    unicode:: U+02AA0 .. SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN
+.. |siml|     unicode:: U+02A9D .. SIMILAR OR LESS-THAN
+.. |simlE|    unicode:: U+02A9F .. SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN
+.. |smid|     unicode:: U+02223 .. DIVIDES
+.. |smile|    unicode:: U+02323 .. SMILE
+.. |smt|      unicode:: U+02AAA .. SMALLER THAN
+.. |smte|     unicode:: U+02AAC .. SMALLER THAN OR EQUAL TO
+.. |smtes|    unicode:: U+02AAC U+0FE00 .. SMALLER THAN OR slanted EQUAL
+.. |spar|     unicode:: U+02225 .. PARALLEL TO
+.. |sqsub|    unicode:: U+0228F .. SQUARE IMAGE OF
+.. |sqsube|   unicode:: U+02291 .. SQUARE IMAGE OF OR EQUAL TO
+.. |sqsup|    unicode:: U+02290 .. SQUARE ORIGINAL OF
+.. |sqsupe|   unicode:: U+02292 .. SQUARE ORIGINAL OF OR EQUAL TO
+.. |ssmile|   unicode:: U+02323 .. SMILE
+.. |Sub|      unicode:: U+022D0 .. DOUBLE SUBSET
+.. |subE|     unicode:: U+02AC5 .. SUBSET OF ABOVE EQUALS SIGN
+.. |subedot|  unicode:: U+02AC3 .. SUBSET OF OR EQUAL TO WITH DOT ABOVE
+.. |submult|  unicode:: U+02AC1 .. SUBSET WITH MULTIPLICATION SIGN BELOW
+.. |subplus|  unicode:: U+02ABF .. SUBSET WITH PLUS SIGN BELOW
+.. |subrarr|  unicode:: U+02979 .. SUBSET ABOVE RIGHTWARDS ARROW
+.. |subsim|   unicode:: U+02AC7 .. SUBSET OF ABOVE TILDE OPERATOR
+.. |subsub|   unicode:: U+02AD5 .. SUBSET ABOVE SUBSET
+.. |subsup|   unicode:: U+02AD3 .. SUBSET ABOVE SUPERSET
+.. |Sup|      unicode:: U+022D1 .. DOUBLE SUPERSET
+.. |supdsub|  unicode:: U+02AD8 .. SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET
+.. |supE|     unicode:: U+02AC6 .. SUPERSET OF ABOVE EQUALS SIGN
+.. |supedot|  unicode:: U+02AC4 .. SUPERSET OF OR EQUAL TO WITH DOT ABOVE
+.. |suphsol|  unicode:: U+02283 U+0002F .. SUPERSET OF, SOLIDUS
+.. |suphsub|  unicode:: U+02AD7 .. SUPERSET BESIDE SUBSET
+.. |suplarr|  unicode:: U+0297B .. SUPERSET ABOVE LEFTWARDS ARROW
+.. |supmult|  unicode:: U+02AC2 .. SUPERSET WITH MULTIPLICATION SIGN BELOW
+.. |supplus|  unicode:: U+02AC0 .. SUPERSET WITH PLUS SIGN BELOW
+.. |supsim|   unicode:: U+02AC8 .. SUPERSET OF ABOVE TILDE OPERATOR
+.. |supsub|   unicode:: U+02AD4 .. SUPERSET ABOVE SUBSET
+.. |supsup|   unicode:: U+02AD6 .. SUPERSET ABOVE SUPERSET
+.. |thkap|    unicode:: U+02248 .. ALMOST EQUAL TO
+.. |thksim|   unicode:: U+0223C .. TILDE OPERATOR
+.. |topfork|  unicode:: U+02ADA .. PITCHFORK WITH TEE TOP
+.. |trie|     unicode:: U+0225C .. DELTA EQUAL TO
+.. |twixt|    unicode:: U+0226C .. BETWEEN
+.. |Vbar|     unicode:: U+02AEB .. DOUBLE UP TACK
+.. |vBar|     unicode:: U+02AE8 .. SHORT UP TACK WITH UNDERBAR
+.. |vBarv|    unicode:: U+02AE9 .. SHORT UP TACK ABOVE SHORT DOWN TACK
+.. |VDash|    unicode:: U+022AB .. DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
+.. |Vdash|    unicode:: U+022A9 .. FORCES
+.. |vDash|    unicode:: U+022A8 .. TRUE
+.. |vdash|    unicode:: U+022A2 .. RIGHT TACK
+.. |Vdashl|   unicode:: U+02AE6 .. LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL
+.. |veebar|   unicode:: U+022BB .. XOR
+.. |vltri|    unicode:: U+022B2 .. NORMAL SUBGROUP OF
+.. |vprop|    unicode:: U+0221D .. PROPORTIONAL TO
+.. |vrtri|    unicode:: U+022B3 .. CONTAINS AS NORMAL SUBGROUP
+.. |Vvdash|   unicode:: U+022AA .. TRIPLE VERTICAL BAR RIGHT TURNSTILE
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isomscr.txt
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isomscr.txt (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isomscr.txt (revision 3)
@@ -0,0 +1,17 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |Bscr| unicode:: U+0212C .. SCRIPT CAPITAL B
+.. |Escr| unicode:: U+02130 .. SCRIPT CAPITAL E
+.. |escr| unicode:: U+0212F .. SCRIPT SMALL E
+.. |Fscr| unicode:: U+02131 .. SCRIPT CAPITAL F
+.. |gscr| unicode:: U+0210A .. SCRIPT SMALL G
+.. |Hscr| unicode:: U+0210B .. SCRIPT CAPITAL H
+.. |Iscr| unicode:: U+02110 .. SCRIPT CAPITAL I
+.. |Lscr| unicode:: U+02112 .. SCRIPT CAPITAL L
+.. |Mscr| unicode:: U+02133 .. SCRIPT CAPITAL M
+.. |oscr| unicode:: U+02134 .. SCRIPT SMALL O
+.. |Rscr| unicode:: U+0211B .. SCRIPT CAPITAL R
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isogrk1.txt
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isogrk1.txt (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isogrk1.txt (revision 3)
@@ -0,0 +1,55 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |Agr|  unicode:: U+00391 .. GREEK CAPITAL LETTER ALPHA
+.. |agr|  unicode:: U+003B1 .. GREEK SMALL LETTER ALPHA
+.. |Bgr|  unicode:: U+00392 .. GREEK CAPITAL LETTER BETA
+.. |bgr|  unicode:: U+003B2 .. GREEK SMALL LETTER BETA
+.. |Dgr|  unicode:: U+00394 .. GREEK CAPITAL LETTER DELTA
+.. |dgr|  unicode:: U+003B4 .. GREEK SMALL LETTER DELTA
+.. |EEgr| unicode:: U+00397 .. GREEK CAPITAL LETTER ETA
+.. |eegr| unicode:: U+003B7 .. GREEK SMALL LETTER ETA
+.. |Egr|  unicode:: U+00395 .. GREEK CAPITAL LETTER EPSILON
+.. |egr|  unicode:: U+003B5 .. GREEK SMALL LETTER EPSILON
+.. |Ggr|  unicode:: U+00393 .. GREEK CAPITAL LETTER GAMMA
+.. |ggr|  unicode:: U+003B3 .. GREEK SMALL LETTER GAMMA
+.. |Igr|  unicode:: U+00399 .. GREEK CAPITAL LETTER IOTA
+.. |igr|  unicode:: U+003B9 .. GREEK SMALL LETTER IOTA
+.. |Kgr|  unicode:: U+0039A .. GREEK CAPITAL LETTER KAPPA
+.. |kgr|  unicode:: U+003BA .. GREEK SMALL LETTER KAPPA
+.. |KHgr| unicode:: U+003A7 .. GREEK CAPITAL LETTER CHI
+.. |khgr| unicode:: U+003C7 .. GREEK SMALL LETTER CHI
+.. |Lgr|  unicode:: U+0039B .. GREEK CAPITAL LETTER LAMDA
+.. |lgr|  unicode:: U+003BB .. GREEK SMALL LETTER LAMDA
+.. |Mgr|  unicode:: U+0039C .. GREEK CAPITAL LETTER MU
+.. |mgr|  unicode:: U+003BC .. GREEK SMALL LETTER MU
+.. |Ngr|  unicode:: U+0039D .. GREEK CAPITAL LETTER NU
+.. |ngr|  unicode:: U+003BD .. GREEK SMALL LETTER NU
+.. |Ogr|  unicode:: U+0039F .. GREEK CAPITAL LETTER OMICRON
+.. |ogr|  unicode:: U+003BF .. GREEK SMALL LETTER OMICRON
+.. |OHgr| unicode:: U+003A9 .. GREEK CAPITAL LETTER OMEGA
+.. |ohgr| unicode:: U+003C9 .. GREEK SMALL LETTER OMEGA
+.. |Pgr|  unicode:: U+003A0 .. GREEK CAPITAL LETTER PI
+.. |pgr|  unicode:: U+003C0 .. GREEK SMALL LETTER PI
+.. |PHgr| unicode:: U+003A6 .. GREEK CAPITAL LETTER PHI
+.. |phgr| unicode:: U+003C6 .. GREEK SMALL LETTER PHI
+.. |PSgr| unicode:: U+003A8 .. GREEK CAPITAL LETTER PSI
+.. |psgr| unicode:: U+003C8 .. GREEK SMALL LETTER PSI
+.. |Rgr|  unicode:: U+003A1 .. GREEK CAPITAL LETTER RHO
+.. |rgr|  unicode:: U+003C1 .. GREEK SMALL LETTER RHO
+.. |sfgr| unicode:: U+003C2 .. GREEK SMALL LETTER FINAL SIGMA
+.. |Sgr|  unicode:: U+003A3 .. GREEK CAPITAL LETTER SIGMA
+.. |sgr|  unicode:: U+003C3 .. GREEK SMALL LETTER SIGMA
+.. |Tgr|  unicode:: U+003A4 .. GREEK CAPITAL LETTER TAU
+.. |tgr|  unicode:: U+003C4 .. GREEK SMALL LETTER TAU
+.. |THgr| unicode:: U+00398 .. GREEK CAPITAL LETTER THETA
+.. |thgr| unicode:: U+003B8 .. GREEK SMALL LETTER THETA
+.. |Ugr|  unicode:: U+003A5 .. GREEK CAPITAL LETTER UPSILON
+.. |ugr|  unicode:: U+003C5 .. GREEK SMALL LETTER UPSILON
+.. |Xgr|  unicode:: U+0039E .. GREEK CAPITAL LETTER XI
+.. |xgr|  unicode:: U+003BE .. GREEK SMALL LETTER XI
+.. |Zgr|  unicode:: U+00396 .. GREEK CAPITAL LETTER ZETA
+.. |zgr|  unicode:: U+003B6 .. GREEK SMALL LETTER ZETA
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isogrk2.txt
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isogrk2.txt (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isogrk2.txt (revision 3)
@@ -0,0 +1,26 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |Aacgr|  unicode:: U+00386 .. GREEK CAPITAL LETTER ALPHA WITH TONOS
+.. |aacgr|  unicode:: U+003AC .. GREEK SMALL LETTER ALPHA WITH TONOS
+.. |Eacgr|  unicode:: U+00388 .. GREEK CAPITAL LETTER EPSILON WITH TONOS
+.. |eacgr|  unicode:: U+003AD .. GREEK SMALL LETTER EPSILON WITH TONOS
+.. |EEacgr| unicode:: U+00389 .. GREEK CAPITAL LETTER ETA WITH TONOS
+.. |eeacgr| unicode:: U+003AE .. GREEK SMALL LETTER ETA WITH TONOS
+.. |Iacgr|  unicode:: U+0038A .. GREEK CAPITAL LETTER IOTA WITH TONOS
+.. |iacgr|  unicode:: U+003AF .. GREEK SMALL LETTER IOTA WITH TONOS
+.. |idiagr| unicode:: U+00390 .. GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+.. |Idigr|  unicode:: U+003AA .. GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
+.. |idigr|  unicode:: U+003CA .. GREEK SMALL LETTER IOTA WITH DIALYTIKA
+.. |Oacgr|  unicode:: U+0038C .. GREEK CAPITAL LETTER OMICRON WITH TONOS
+.. |oacgr|  unicode:: U+003CC .. GREEK SMALL LETTER OMICRON WITH TONOS
+.. |OHacgr| unicode:: U+0038F .. GREEK CAPITAL LETTER OMEGA WITH TONOS
+.. |ohacgr| unicode:: U+003CE .. GREEK SMALL LETTER OMEGA WITH TONOS
+.. |Uacgr|  unicode:: U+0038E .. GREEK CAPITAL LETTER UPSILON WITH TONOS
+.. |uacgr|  unicode:: U+003CD .. GREEK SMALL LETTER UPSILON WITH TONOS
+.. |udiagr| unicode:: U+003B0 .. GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+.. |Udigr|  unicode:: U+003AB .. GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
+.. |udigr|  unicode:: U+003CB .. GREEK SMALL LETTER UPSILON WITH DIALYTIKA
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isogrk3.txt
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isogrk3.txt (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isogrk3.txt (revision 3)
@@ -0,0 +1,52 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |alpha|  unicode:: U+003B1 .. GREEK SMALL LETTER ALPHA
+.. |beta|   unicode:: U+003B2 .. GREEK SMALL LETTER BETA
+.. |chi|    unicode:: U+003C7 .. GREEK SMALL LETTER CHI
+.. |Delta|  unicode:: U+00394 .. GREEK CAPITAL LETTER DELTA
+.. |delta|  unicode:: U+003B4 .. GREEK SMALL LETTER DELTA
+.. |epsi|   unicode:: U+003F5 .. GREEK LUNATE EPSILON SYMBOL
+.. |epsis|  unicode:: U+003F5 .. GREEK LUNATE EPSILON SYMBOL
+.. |epsiv|  unicode:: U+003B5 .. GREEK SMALL LETTER EPSILON
+.. |eta|    unicode:: U+003B7 .. GREEK SMALL LETTER ETA
+.. |Gamma|  unicode:: U+00393 .. GREEK CAPITAL LETTER GAMMA
+.. |gamma|  unicode:: U+003B3 .. GREEK SMALL LETTER GAMMA
+.. |Gammad| unicode:: U+003DC .. GREEK LETTER DIGAMMA
+.. |gammad| unicode:: U+003DD .. GREEK SMALL LETTER DIGAMMA
+.. |iota|   unicode:: U+003B9 .. GREEK SMALL LETTER IOTA
+.. |kappa|  unicode:: U+003BA .. GREEK SMALL LETTER KAPPA
+.. |kappav| unicode:: U+003F0 .. GREEK KAPPA SYMBOL
+.. |Lambda| unicode:: U+0039B .. GREEK CAPITAL LETTER LAMDA
+.. |lambda| unicode:: U+003BB .. GREEK SMALL LETTER LAMDA
+.. |mu|     unicode:: U+003BC .. GREEK SMALL LETTER MU
+.. |nu|     unicode:: U+003BD .. GREEK SMALL LETTER NU
+.. |Omega|  unicode:: U+003A9 .. GREEK CAPITAL LETTER OMEGA
+.. |omega|  unicode:: U+003C9 .. GREEK SMALL LETTER OMEGA
+.. |Phi|    unicode:: U+003A6 .. GREEK CAPITAL LETTER PHI
+.. |phi|    unicode:: U+003D5 .. GREEK PHI SYMBOL
+.. |phis|   unicode:: U+003D5 .. GREEK PHI SYMBOL
+.. |phiv|   unicode:: U+003C6 .. GREEK SMALL LETTER PHI
+.. |Pi|     unicode:: U+003A0 .. GREEK CAPITAL LETTER PI
+.. |pi|     unicode:: U+003C0 .. GREEK SMALL LETTER PI
+.. |piv|    unicode:: U+003D6 .. GREEK PI SYMBOL
+.. |Psi|    unicode:: U+003A8 .. GREEK CAPITAL LETTER PSI
+.. |psi|    unicode:: U+003C8 .. GREEK SMALL LETTER PSI
+.. |rho|    unicode:: U+003C1 .. GREEK SMALL LETTER RHO
+.. |rhov|   unicode:: U+003F1 .. GREEK RHO SYMBOL
+.. |Sigma|  unicode:: U+003A3 .. GREEK CAPITAL LETTER SIGMA
+.. |sigma|  unicode:: U+003C3 .. GREEK SMALL LETTER SIGMA
+.. |sigmav| unicode:: U+003C2 .. GREEK SMALL LETTER FINAL SIGMA
+.. |tau|    unicode:: U+003C4 .. GREEK SMALL LETTER TAU
+.. |Theta|  unicode:: U+00398 .. GREEK CAPITAL LETTER THETA
+.. |theta|  unicode:: U+003B8 .. GREEK SMALL LETTER THETA
+.. |thetas| unicode:: U+003B8 .. GREEK SMALL LETTER THETA
+.. |thetav| unicode:: U+003D1 .. GREEK THETA SYMBOL
+.. |Upsi|   unicode:: U+003D2 .. GREEK UPSILON WITH HOOK SYMBOL
+.. |upsi|   unicode:: U+003C5 .. GREEK SMALL LETTER UPSILON
+.. |Xi|     unicode:: U+0039E .. GREEK CAPITAL LETTER XI
+.. |xi|     unicode:: U+003BE .. GREEK SMALL LETTER XI
+.. |zeta|   unicode:: U+003B6 .. GREEK SMALL LETTER ZETA
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isogrk4.txt
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isogrk4.txt (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isogrk4.txt (revision 3)
@@ -0,0 +1,8 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |b.Gammad| unicode:: U+003DC .. GREEK LETTER DIGAMMA
+.. |b.gammad| unicode:: U+003DD .. GREEK SMALL LETTER DIGAMMA
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/s5defs.txt
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/s5defs.txt (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/s5defs.txt (revision 3)
@@ -0,0 +1,62 @@
+.. Definitions of interpreted text roles (classes) for S5/HTML data.
+.. This data file has been placed in the public domain.
+
+.. Colours
+   =======
+
+.. role:: black
+.. role:: gray
+.. role:: silver
+.. role:: white
+
+.. role:: maroon
+.. role:: red
+.. role:: magenta
+.. role:: fuchsia
+.. role:: pink
+.. role:: orange
+.. role:: yellow
+.. role:: lime
+.. role:: green
+.. role:: olive
+.. role:: teal
+.. role:: cyan
+.. role:: aqua
+.. role:: blue
+.. role:: navy
+.. role:: purple
+
+
+.. Text Sizes
+   ==========
+
+.. role:: huge
+.. role:: big
+.. role:: small
+.. role:: tiny
+
+
+.. Display in Slides (Presentation Mode) Only
+   ==========================================
+
+.. role:: slide
+   :class: slide-display
+
+
+.. Display in Outline Mode Only
+   ============================
+
+.. role:: outline
+
+
+.. Display in Print Only
+   =====================
+
+.. role:: print
+
+
+.. Incremental Display
+   ===================
+
+.. role:: incremental
+.. default-role:: incremental
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/README.txt
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/README.txt (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/README.txt (revision 3)
@@ -0,0 +1,17 @@
+============================================
+ ``docutils/parsers/rst/include`` Directory
+============================================
+
+This directory contains standard data files intended for inclusion in
+reStructuredText documents.  To access these files, use the "include"
+directive with the special syntax for standard "include" data files,
+angle brackets around the file name::
+
+    .. include:: <isonum.txt>
+
+See the documentation for the `"include" directive`__ and
+`reStructuredText Standard Substitution Definition Sets`__ for
+details.
+
+__ http://docutils.sf.net/docs/ref/rst/directives.html#include
+__ http://docutils.sf.net/docs/ref/rst/substitutions.html
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isotech.txt
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isotech.txt (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/include/isotech.txt (revision 3)
@@ -0,0 +1,168 @@
+.. This data file has been placed in the public domain.
+.. Derived from the Unicode character mappings available from
+   <http://www.w3.org/2003/entities/xml/>.
+   Processed by unicode2rstsubs.py, part of Docutils:
+   <http://docutils.sourceforge.net>.
+
+.. |acd|      unicode:: U+0223F .. SINE WAVE
+.. |aleph|    unicode:: U+02135 .. ALEF SYMBOL
+.. |And|      unicode:: U+02A53 .. DOUBLE LOGICAL AND
+.. |and|      unicode:: U+02227 .. LOGICAL AND
+.. |andand|   unicode:: U+02A55 .. TWO INTERSECTING LOGICAL AND
+.. |andd|     unicode:: U+02A5C .. LOGICAL AND WITH HORIZONTAL DASH
+.. |andslope| unicode:: U+02A58 .. SLOPING LARGE AND
+.. |andv|     unicode:: U+02A5A .. LOGICAL AND WITH MIDDLE STEM
+.. |ang90|    unicode:: U+0221F .. RIGHT ANGLE
+.. |angrt|    unicode:: U+0221F .. RIGHT ANGLE
+.. |angsph|   unicode:: U+02222 .. SPHERICAL ANGLE
+.. |angst|    unicode:: U+0212B .. ANGSTROM SIGN
+.. |ap|       unicode:: U+02248 .. ALMOST EQUAL TO
+.. |apacir|   unicode:: U+02A6F .. ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT
+.. |awconint| unicode:: U+02233 .. ANTICLOCKWISE CONTOUR INTEGRAL
+.. |awint|    unicode:: U+02A11 .. ANTICLOCKWISE INTEGRATION
+.. |becaus|   unicode:: U+02235 .. BECAUSE
+.. |bernou|   unicode:: U+0212C .. SCRIPT CAPITAL B
+.. |bne|      unicode:: U+0003D U+020E5 .. EQUALS SIGN with reverse slash
+.. |bnequiv|  unicode:: U+02261 U+020E5 .. IDENTICAL TO with reverse slash
+.. |bNot|     unicode:: U+02AED .. REVERSED DOUBLE STROKE NOT SIGN
+.. |bnot|     unicode:: U+02310 .. REVERSED NOT SIGN
+.. |bottom|   unicode:: U+022A5 .. UP TACK
+.. |cap|      unicode:: U+02229 .. INTERSECTION
+.. |Cconint|  unicode:: U+02230 .. VOLUME INTEGRAL
+.. |cirfnint| unicode:: U+02A10 .. CIRCULATION FUNCTION
+.. |compfn|   unicode:: U+02218 .. RING OPERATOR
+.. |cong|     unicode:: U+02245 .. APPROXIMATELY EQUAL TO
+.. |Conint|   unicode:: U+0222F .. SURFACE INTEGRAL
+.. |conint|   unicode:: U+0222E .. CONTOUR INTEGRAL
+.. |ctdot|    unicode:: U+022EF .. MIDLINE HORIZONTAL ELLIPSIS
+.. |cup|      unicode:: U+0222A .. UNION
+.. |cwconint| unicode:: U+02232 .. CLOCKWISE CONTOUR INTEGRAL
+.. |cwint|    unicode:: U+02231 .. CLOCKWISE INTEGRAL
+.. |cylcty|   unicode:: U+0232D .. CYLINDRICITY
+.. |disin|    unicode:: U+022F2 .. ELEMENT OF WITH LONG HORIZONTAL STROKE
+.. |Dot|      unicode:: U+000A8 .. DIAERESIS
+.. |DotDot|   unicode:: U+020DC .. COMBINING FOUR DOTS ABOVE
+.. |dsol|     unicode:: U+029F6 .. SOLIDUS WITH OVERBAR
+.. |dtdot|    unicode:: U+022F1 .. DOWN RIGHT DIAGONAL ELLIPSIS
+.. |dwangle|  unicode:: U+029A6 .. OBLIQUE ANGLE OPENING UP
+.. |elinters| unicode:: U+0FFFD .. REPLACEMENT CHARACTER
+.. |epar|     unicode:: U+022D5 .. EQUAL AND PARALLEL TO
+.. |eparsl|   unicode:: U+029E3 .. EQUALS SIGN AND SLANTED PARALLEL
+.. |equiv|    unicode:: U+02261 .. IDENTICAL TO
+.. |eqvparsl| unicode:: U+029E5 .. IDENTICAL TO AND SLANTED PARALLEL
+.. |exist|    unicode:: U+02203 .. THERE EXISTS
+.. |fltns|    unicode:: U+025B1 .. WHITE PARALLELOGRAM
+.. |fnof|     unicode:: U+00192 .. LATIN SMALL LETTER F WITH HOOK
+.. |forall|   unicode:: U+02200 .. FOR ALL
+.. |fpartint| unicode:: U+02A0D .. FINITE PART INTEGRAL
+.. |ge|       unicode:: U+02265 .. GREATER-THAN OR EQUAL TO
+.. |hamilt|   unicode:: U+0210B .. SCRIPT CAPITAL H
+.. |iff|      unicode:: U+021D4 .. LEFT RIGHT DOUBLE ARROW
+.. |iinfin|   unicode:: U+029DC .. INCOMPLETE INFINITY
+.. |imped|    unicode:: U+001B5 .. LATIN CAPITAL LETTER Z WITH STROKE
+.. |infin|    unicode:: U+0221E .. INFINITY
+.. |infintie| unicode:: U+029DD .. TIE OVER INFINITY
+.. |Int|      unicode:: U+0222C .. DOUBLE INTEGRAL
+.. |int|      unicode:: U+0222B .. INTEGRAL
+.. |intlarhk| unicode:: U+02A17 .. INTEGRAL WITH LEFTWARDS ARROW WITH HOOK
+.. |isin|     unicode:: U+02208 .. ELEMENT OF
+.. |isindot|  unicode:: U+022F5 .. ELEMENT OF WITH DOT ABOVE
+.. |isinE|    unicode:: U+022F9 .. ELEMENT OF WITH TWO HORIZONTAL STROKES
+.. |isins|    unicode:: U+022F4 .. SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+.. |isinsv|   unicode:: U+022F3 .. ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+.. |isinv|    unicode:: U+02208 .. ELEMENT OF
+.. |lagran|   unicode:: U+02112 .. SCRIPT CAPITAL L
+.. |Lang|     unicode:: U+0300A .. LEFT DOUBLE ANGLE BRACKET
+.. |lang|     unicode:: U+02329 .. LEFT-POINTING ANGLE BRACKET
+.. |lArr|     unicode:: U+021D0 .. LEFTWARDS DOUBLE ARROW
+.. |lbbrk|    unicode:: U+03014 .. LEFT TORTOISE SHELL BRACKET
+.. |le|       unicode:: U+02264 .. LESS-THAN OR EQUAL TO
+.. |loang|    unicode:: U+03018 .. LEFT WHITE TORTOISE SHELL BRACKET
+.. |lobrk|    unicode:: U+0301A .. LEFT WHITE SQUARE BRACKET
+.. |lopar|    unicode:: U+02985 .. LEFT WHITE PARENTHESIS
+.. |lowast|   unicode:: U+02217 .. ASTERISK OPERATOR
+.. |minus|    unicode:: U+02212 .. MINUS SIGN
+.. |mnplus|   unicode:: U+02213 .. MINUS-OR-PLUS SIGN
+.. |nabla|    unicode:: U+02207 .. NABLA
+.. |ne|       unicode:: U+02260 .. NOT EQUAL TO
+.. |nedot|    unicode:: U+02250 U+00338 .. APPROACHES THE LIMIT with slash
+.. |nhpar|    unicode:: U+02AF2 .. PARALLEL WITH HORIZONTAL STROKE
+.. |ni|       unicode:: U+0220B .. CONTAINS AS MEMBER
+.. |nis|      unicode:: U+022FC .. SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+.. |nisd|     unicode:: U+022FA .. CONTAINS WITH LONG HORIZONTAL STROKE
+.. |niv|      unicode:: U+0220B .. CONTAINS AS MEMBER
+.. |Not|      unicode:: U+02AEC .. DOUBLE STROKE NOT SIGN
+.. |notin|    unicode:: U+02209 .. NOT AN ELEMENT OF
+.. |notindot| unicode:: U+022F5 U+00338 .. ELEMENT OF WITH DOT ABOVE with slash
+.. |notinE|   unicode:: U+022F9 U+00338 .. ELEMENT OF WITH TWO HORIZONTAL STROKES with slash
+.. |notinva|  unicode:: U+02209 .. NOT AN ELEMENT OF
+.. |notinvb|  unicode:: U+022F7 .. SMALL ELEMENT OF WITH OVERBAR
+.. |notinvc|  unicode:: U+022F6 .. ELEMENT OF WITH OVERBAR
+.. |notni|    unicode:: U+0220C .. DOES NOT CONTAIN AS MEMBER
+.. |notniva|  unicode:: U+0220C .. DOES NOT CONTAIN AS MEMBER
+.. |notnivb|  unicode:: U+022FE .. SMALL CONTAINS WITH OVERBAR
+.. |notnivc|  unicode:: U+022FD .. CONTAINS WITH OVERBAR
+.. |nparsl|   unicode:: U+02AFD U+020E5 .. DOUBLE SOLIDUS OPERATOR with reverse slash
+.. |npart|    unicode:: U+02202 U+00338 .. PARTIAL DIFFERENTIAL with slash
+.. |npolint|  unicode:: U+02A14 .. LINE INTEGRATION NOT INCLUDING THE POLE
+.. |nvinfin|  unicode:: U+029DE .. INFINITY NEGATED WITH VERTICAL BAR
+.. |olcross|  unicode:: U+029BB .. CIRCLE WITH SUPERIMPOSED X
+.. |Or|       unicode:: U+02A54 .. DOUBLE LOGICAL OR
+.. |or|       unicode:: U+02228 .. LOGICAL OR
+.. |ord|      unicode:: U+02A5D .. LOGICAL OR WITH HORIZONTAL DASH
+.. |order|    unicode:: U+02134 .. SCRIPT SMALL O
+.. |oror|     unicode:: U+02A56 .. TWO INTERSECTING LOGICAL OR
+.. |orslope|  unicode:: U+02A57 .. SLOPING LARGE OR
+.. |orv|      unicode:: U+02A5B .. LOGICAL OR WITH MIDDLE STEM
+.. |par|      unicode:: U+02225 .. PARALLEL TO
+.. |parsl|    unicode:: U+02AFD .. DOUBLE SOLIDUS OPERATOR
+.. |part|     unicode:: U+02202 .. PARTIAL DIFFERENTIAL
+.. |permil|   unicode:: U+02030 .. PER MILLE SIGN
+.. |perp|     unicode:: U+022A5 .. UP TACK
+.. |pertenk|  unicode:: U+02031 .. PER TEN THOUSAND SIGN
+.. |phmmat|   unicode:: U+02133 .. SCRIPT CAPITAL M
+.. |pointint| unicode:: U+02A15 .. INTEGRAL AROUND A POINT OPERATOR
+.. |Prime|    unicode:: U+02033 .. DOUBLE PRIME
+.. |prime|    unicode:: U+02032 .. PRIME
+.. |profalar| unicode:: U+0232E .. ALL AROUND-PROFILE
+.. |profline| unicode:: U+02312 .. ARC
+.. |profsurf| unicode:: U+02313 .. SEGMENT
+.. |prop|     unicode:: U+0221D .. PROPORTIONAL TO
+.. |qint|     unicode:: U+02A0C .. QUADRUPLE INTEGRAL OPERATOR
+.. |qprime|   unicode:: U+02057 .. QUADRUPLE PRIME
+.. |quatint|  unicode:: U+02A16 .. QUATERNION INTEGRAL OPERATOR
+.. |radic|    unicode:: U+0221A .. SQUARE ROOT
+.. |Rang|     unicode:: U+0300B .. RIGHT DOUBLE ANGLE BRACKET
+.. |rang|     unicode:: U+0232A .. RIGHT-POINTING ANGLE BRACKET
+.. |rArr|     unicode:: U+021D2 .. RIGHTWARDS DOUBLE ARROW
+.. |rbbrk|    unicode:: U+03015 .. RIGHT TORTOISE SHELL BRACKET
+.. |roang|    unicode:: U+03019 .. RIGHT WHITE TORTOISE SHELL BRACKET
+.. |robrk|    unicode:: U+0301B .. RIGHT WHITE SQUARE BRACKET
+.. |ropar|    unicode:: U+02986 .. RIGHT WHITE PARENTHESIS
+.. |rppolint| unicode:: U+02A12 .. LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE
+.. |scpolint| unicode:: U+02A13 .. LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE
+.. |sim|      unicode:: U+0223C .. TILDE OPERATOR
+.. |simdot|   unicode:: U+02A6A .. TILDE OPERATOR WITH DOT ABOVE
+.. |sime|     unicode:: U+02243 .. ASYMPTOTICALLY EQUAL TO
+.. |smeparsl| unicode:: U+029E4 .. EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE
+.. |square|   unicode:: U+025A1 .. WHITE SQUARE
+.. |squarf|   unicode:: U+025AA .. BLACK SMALL SQUARE
+.. |strns|    unicode:: U+000AF .. MACRON
+.. |sub|      unicode:: U+02282 .. SUBSET OF
+.. |sube|     unicode:: U+02286 .. SUBSET OF OR EQUAL TO
+.. |sup|      unicode:: U+02283 .. SUPERSET OF
+.. |supe|     unicode:: U+02287 .. SUPERSET OF OR EQUAL TO
+.. |tdot|     unicode:: U+020DB .. COMBINING THREE DOTS ABOVE
+.. |there4|   unicode:: U+02234 .. THEREFORE
+.. |tint|     unicode:: U+0222D .. TRIPLE INTEGRAL
+.. |top|      unicode:: U+022A4 .. DOWN TACK
+.. |topbot|   unicode:: U+02336 .. APL FUNCTIONAL SYMBOL I-BEAM
+.. |topcir|   unicode:: U+02AF1 .. DOWN TACK WITH CIRCLE BELOW
+.. |tprime|   unicode:: U+02034 .. TRIPLE PRIME
+.. |utdot|    unicode:: U+022F0 .. UP RIGHT DIAGONAL ELLIPSIS
+.. |uwangle|  unicode:: U+029A7 .. OBLIQUE ANGLE OPENING DOWN
+.. |vangrt|   unicode:: U+0299C .. RIGHT ANGLE VARIANT WITH SQUARE
+.. |veeeq|    unicode:: U+0225A .. EQUIANGULAR TO
+.. |Verbar|   unicode:: U+02016 .. DOUBLE VERTICAL LINE
+.. |wedgeq|   unicode:: U+02259 .. ESTIMATES
+.. |xnis|     unicode:: U+022FB .. CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/__init__.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/__init__.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/__init__.py (revision 3)
@@ -0,0 +1,156 @@
+# Author: David Goodger
+# Contact: goodger@users.sourceforge.net
+# Revision: $Revision: 3416 $
+# Date: $Date: 2005-06-01 15:52:43 +0200 (Wed, 01 Jun 2005) $
+# Copyright: This module has been placed in the public domain.
+
+"""
+This is ``docutils.parsers.rst`` package. It exports a single class, `Parser`,
+the reStructuredText parser.
+
+
+Usage
+=====
+
+1. Create a parser::
+
+       parser = docutils.parsers.rst.Parser()
+
+   Several optional arguments may be passed to modify the parser's behavior.
+   Please see `Customizing the Parser`_ below for details.
+
+2. Gather input (a multi-line string), by reading a file or the standard
+   input::
+
+       input = sys.stdin.read()
+
+3. Create a new empty `docutils.nodes.document` tree::
+
+       document = docutils.utils.new_document(source, settings)
+
+   See `docutils.utils.new_document()` for parameter details.
+
+4. Run the parser, populating the document tree::
+
+       parser.parse(input, document)
+
+
+Parser Overview
+===============
+
+The reStructuredText parser is implemented as a state machine, examining its
+input one line at a time. To understand how the parser works, please first
+become familiar with the `docutils.statemachine` module, then see the
+`states` module.
+
+
+Customizing the Parser
+----------------------
+
+Anything that isn't already customizable is that way simply because that type
+of customizability hasn't been implemented yet.  Patches welcome!
+
+When instantiating an object of the `Parser` class, two parameters may be
+passed: ``rfc2822`` and ``inliner``.  Pass ``rfc2822=1`` to enable an initial
+RFC-2822 style header block, parsed as a "field_list" element (with "class"
+attribute set to "rfc2822").  Currently this is the only body-level element
+which is customizable without subclassing.  (Tip: subclass `Parser` and change
+its "state_classes" and "initial_state" attributes to refer to new classes.
+Contact the author if you need more details.)
+
+The ``inliner`` parameter takes an instance of `states.Inliner` or a subclass.
+It handles inline markup recognition.  A common extension is the addition of
+further implicit hyperlinks, like "RFC 2822".  This can be done by subclassing
+`states.Inliner`, adding a new method for the implicit markup, and adding a
+``(pattern, method)`` pair to the "implicit_dispatch" attribute of the
+subclass.  See `states.Inliner.implicit_inline()` for details.  Explicit
+inline markup can be customized in a `states.Inliner` subclass via the
+``patterns.initial`` and ``dispatch`` attributes (and new methods as
+appropriate).
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import docutils.parsers
+import docutils.statemachine
+from docutils.parsers.rst import states
+from docutils import frontend
+
+
+class Parser(docutils.parsers.Parser):
+
+    """The reStructuredText parser."""
+
+    supported = ('restructuredtext', 'rst', 'rest', 'restx', 'rtxt', 'rstx')
+    """Aliases this parser supports."""
+
+    settings_spec = (
+        'reStructuredText Parser Options',
+        None,
+        (('Recognize and link to standalone PEP references (like "PEP 258").',
+          ['--pep-references'],
+          {'action': 'store_true', 'validator': frontend.validate_boolean}),
+         ('Base URL for PEP references '
+          '(default "http://www.python.org/peps/").',
+          ['--pep-base-url'],
+          {'metavar': '<URL>', 'default': 'http://www.python.org/peps/',
+           'validator': frontend.validate_url_trailing_slash}),
+         ('Recognize and link to standalone RFC references (like "RFC 822").',
+          ['--rfc-references'],
+          {'action': 'store_true', 'validator': frontend.validate_boolean}),
+         ('Base URL for RFC references (default "http://www.faqs.org/rfcs/").',
+          ['--rfc-base-url'],
+          {'metavar': '<URL>', 'default': 'http://www.faqs.org/rfcs/',
+           'validator': frontend.validate_url_trailing_slash}),
+         ('Set number of spaces for tab expansion (default 8).',
+          ['--tab-width'],
+          {'metavar': '<width>', 'type': 'int', 'default': 8,
+           'validator': frontend.validate_nonnegative_int}),
+         ('Remove spaces before footnote references.',
+          ['--trim-footnote-reference-space'],
+          {'action': 'store_true', 'validator': frontend.validate_boolean}),
+         ('Leave spaces before footnote references.',
+          ['--leave-footnote-reference-space'],
+          {'action': 'store_false', 'dest': 'trim_footnote_reference_space',
+           'validator': frontend.validate_boolean}),
+         ('Disable directives that insert the contents of external file '
+          '("include" & "raw"); replaced with a "warning" system message.',
+          ['--no-file-insertion'],
+          {'action': 'store_false', 'default': 1,
+           'dest': 'file_insertion_enabled'}),
+         ('Enable directives that insert the contents of external file '
+          '("include" & "raw").  Enabled by default.',
+          ['--file-insertion-enabled'],
+          {'action': 'store_true', 'dest': 'file_insertion_enabled'}),
+         ('Disable the "raw" directives; replaced with a "warning" '
+          'system message.',
+          ['--no-raw'],
+          {'action': 'store_false', 'default': 1, 'dest': 'raw_enabled'}),
+         ('Enable the "raw" directive.  Enabled by default.',
+          ['--raw-enabled'],
+          {'action': 'store_true', 'dest': 'raw_enabled'}),))
+
+    config_section = 'restructuredtext parser'
+    config_section_dependencies = ('parsers',)
+
+    def __init__(self, rfc2822=None, inliner=None):
+        if rfc2822:
+            self.initial_state = 'RFC2822Body'
+        else:
+            self.initial_state = 'Body'
+        self.state_classes = states.state_classes
+        self.inliner = inliner
+
+    def parse(self, inputstring, document):
+        """Parse `inputstring` and populate `document`, a document tree."""
+        self.setup_parse(inputstring, document)
+        self.statemachine = states.RSTStateMachine(
+              state_classes=self.state_classes,
+              initial_state=self.initial_state,
+              debug=document.reporter.debug_flag)
+        inputlines = docutils.statemachine.string2lines(
+              inputstring, tab_width=document.settings.tab_width,
+              convert_whitespace=1)
+        self.statemachine.run(inputlines, document, inliner=self.inliner)
+        self.finish_parse()
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/languages/de.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/languages/de.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/languages/de.py (revision 3)
@@ -0,0 +1,97 @@
+# Authors: Engelbert Gruber; Felix Wiemann
+# Contact: grubert@users.sourceforge.net
+# Revision: $Revision: 4229 $
+# Date: $Date: 2005-12-23 00:46:16 +0100 (Fri, 23 Dec 2005) $
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+German-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      'achtung': 'attention',
+      'vorsicht': 'caution',
+      'gefahr': 'danger',
+      'fehler': 'error',
+      'hinweis': 'hint',
+      'wichtig': 'important',
+      'notiz': 'note',
+      'tipp': 'tip',
+      'warnung': 'warning',
+      'ermahnung': 'admonition',
+      'kasten': 'sidebar',
+      'seitenkasten': 'sidebar',
+      'thema': 'topic',
+      'zeilen-block': 'line-block',
+      'parsed-literal (translation required)': 'parsed-literal',
+      'rubrik': 'rubric',
+      'epigraph': 'epigraph',
+      'highlights (translation required)': 'highlights',
+      'pull-quote (translation required)': 'pull-quote', # kasten too ?
+      'zusammengesetzt': 'compound',
+      'verbund': 'compound',
+      u'container (translation required)': 'container',
+      #'fragen': 'questions',
+      'tabelle': 'table',
+      'csv-tabelle': 'csv-table',
+      'list-table (translation required)': 'list-table',
+      'meta': 'meta',
+      #'imagemap': 'imagemap',
+      'bild': 'image',
+      'abbildung': 'figure',
+      u'unver\xe4ndert': 'raw',
+      u'roh': 'raw',
+      u'einf\xfcgen': 'include',
+      'ersetzung': 'replace',
+      'ersetzen': 'replace',
+      'ersetze': 'replace',
+      'unicode': 'unicode',
+      'datum': 'date',
+      'klasse': 'class',
+      'rolle': 'role',
+      u'default-role (translation required)': 'default-role',
+      u'title (translation required)': 'title',
+      'inhalt': 'contents',
+      'kapitel-nummerierung': 'sectnum',
+      'abschnitts-nummerierung': 'sectnum',
+      u'linkziel-fu\xdfnoten': 'target-notes',
+      u'header (translation required)': 'header',
+      u'footer (translation required)': 'footer',
+      #u'fu\xdfnoten': 'footnotes',
+      #'zitate': 'citations',
+      }
+"""German name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+      u'abk\xfcrzung': 'abbreviation',
+      'akronym': 'acronym',
+      'index': 'index',
+      'tiefgestellt': 'subscript',
+      'hochgestellt': 'superscript',
+      'titel-referenz': 'title-reference',
+      'pep-referenz': 'pep-reference',
+      'rfc-referenz': 'rfc-reference',
+      'betonung': 'emphasis',
+      'fett': 'strong',
+      u'w\xf6rtlich': 'literal',
+      'benannte-referenz': 'named-reference',
+      'unbenannte-referenz': 'anonymous-reference',
+      u'fu\xdfnoten-referenz': 'footnote-reference',
+      'zitat-referenz': 'citation-reference',
+      'ersetzungs-referenz': 'substitution-reference',
+      'ziel': 'target',
+      'uri-referenz': 'uri-reference',
+      u'unver\xe4ndert': 'raw',
+      u'roh': 'raw',}
+"""Mapping of German role names to canonical role names for interpreted text.
+"""
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/languages/sv.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/languages/sv.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/languages/sv.py (revision 3)
@@ -0,0 +1,92 @@
+# Author:    Adam Chodorowski
+# Contact:   chodorowski@users.sourceforge.net
+# Revision:  $Revision: 4229 $
+# Date:      $Date: 2005-12-23 00:46:16 +0100 (Fri, 23 Dec 2005) $
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Swedish language mappings for language-dependent features of reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      u'observera': 'attention',
+      u'caution (translation required)': 'caution',
+      u'fara': 'danger',
+      u'fel': 'error',
+      u'v\u00e4gledning': 'hint',
+      u'viktigt': 'important',
+      u'notera': 'note',
+      u'tips': 'tip',
+      u'varning': 'warning',
+      u'admonition (translation required)': 'admonition',
+      u'sidebar (translation required)': 'sidebar',
+      u'\u00e4mne': 'topic',
+      u'line-block (translation required)': 'line-block',
+      u'parsed-literal (translation required)': 'parsed-literal',
+      u'mellanrubrik': 'rubric',
+      u'epigraph (translation required)': 'epigraph',
+      u'highlights (translation required)': 'highlights',
+      u'pull-quote (translation required)': 'pull-quote',
+      u'compound (translation required)': 'compound',
+      u'container (translation required)': 'container',
+      # u'fr\u00e5gor': 'questions',
+      # NOTE: A bit long, but recommended by http://www.nada.kth.se/dataterm/:
+      # u'fr\u00e5gor-och-svar': 'questions',
+      # u'vanliga-fr\u00e5gor': 'questions',  
+      u'table (translation required)': 'table',
+      u'csv-table (translation required)': 'csv-table',
+      u'list-table (translation required)': 'list-table',
+      u'meta': 'meta',
+      # u'bildkarta': 'imagemap',   # FIXME: Translation might be too literal.
+      u'bild': 'image',
+      u'figur': 'figure',
+      u'inkludera': 'include',   
+      u'r\u00e5': 'raw',            # FIXME: Translation might be too literal.
+      u'ers\u00e4tt': 'replace', 
+      u'unicode': 'unicode',
+      u'datum': 'date',
+      u'class (translation required)': 'class',
+      u'role (translation required)': 'role',
+      u'default-role (translation required)': 'default-role',
+      u'title (translation required)': 'title',
+      u'inneh\u00e5ll': 'contents',
+      u'sektionsnumrering': 'sectnum',
+      u'target-notes (translation required)': 'target-notes',
+      u'header (translation required)': 'header',
+      u'footer (translation required)': 'footer',
+      # u'fotnoter': 'footnotes',
+      # u'citeringar': 'citations',
+      }
+"""Swedish name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+      u'abbreviation (translation required)': 'abbreviation',
+      u'acronym (translation required)': 'acronym',
+      u'index (translation required)': 'index',
+      u'subscript (translation required)': 'subscript',
+      u'superscript (translation required)': 'superscript',
+      u'title-reference (translation required)': 'title-reference',
+      u'pep-reference (translation required)': 'pep-reference',
+      u'rfc-reference (translation required)': 'rfc-reference',
+      u'emphasis (translation required)': 'emphasis',
+      u'strong (translation required)': 'strong',
+      u'literal (translation required)': 'literal',
+      u'named-reference (translation required)': 'named-reference',
+      u'anonymous-reference (translation required)': 'anonymous-reference',
+      u'footnote-reference (translation required)': 'footnote-reference',
+      u'citation-reference (translation required)': 'citation-reference',
+      u'substitution-reference (translation required)': 'substitution-reference',
+      u'target (translation required)': 'target',
+      u'uri-reference (translation required)': 'uri-reference',
+      u'r\u00e5': 'raw',}
+"""Mapping of Swedish role names to canonical role names for interpreted text.
+"""
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/languages/ja.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/languages/ja.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/languages/ja.py (revision 3)
@@ -0,0 +1,115 @@
+# -*- coding: utf-8 -*-
+# Author: David Goodger
+# Contact: goodger@python.org
+# Revision: $Revision: 4229 $
+# Date: $Date: 2005-12-23 00:46:16 +0100 (Fri, 23 Dec 2005) $
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Japanese-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+# Corrections to these translations are welcome!
+# 髢馴＆縺�′縺ゅｌ縺ｰ縲√←縺�◇豁｣縺励＞鄙ｻ險ｳ繧呈蕗縺医※荳九＆縺��
+directives = {
+    # language-dependent: fixed
+    u'豕ｨ逶ｮ': 'attention',
+    u'豕ｨ諢�: 'caution',
+    u'蜊ｱ髯ｺ': 'danger',
+    u'繧ｨ繝ｩ繝ｼ': 'error',
+    u'繝偵Φ繝�: 'hint',
+    u'驥崎ｦ�: 'important',
+    u'蛯呵�: 'note',
+    u'騾壼ｱ': 'tip',
+    u'隴ｦ蜻�: 'warning',
+    u'謌貞相': 'admonition',
+    u'繧ｵ繧､繝峨ヰ繝ｼ': 'sidebar',
+    u'繝医ヴ繝�け': 'topic',
+    u'繝ｩ繧､繝ｳ繝悶Ο繝�け': 'line-block',
+    u'繝代�繧ｺ繝峨Μ繝�Λ繝ｫ': 'parsed-literal',
+    u'繝ｫ繝悶Μ繝�け': 'rubric',
+    u'繧ｨ繝斐げ繝ｩ繝�: 'epigraph',
+    u'鬘瑚ｨ': 'epigraph',
+    u'繝上う繝ｩ繧､繝�: 'highlights',
+    u'隕区園': 'highlights',
+    u'繝励Ν繧ｯ繧ｪ繝ｼ繝�: 'pull-quote',
+    u'蜷域�': 'compound',
+    u'繧ｳ繝ｳ繝�リ繝ｼ': 'container',
+    u'螳ｹ蝎ｨ': 'container',
+    u'陦ｨ': 'table',
+    u'csv陦ｨ': 'csv-table',
+    u'繝ｪ繧ｹ繝郁｡ｨ': 'list-table',
+    #u'雉ｪ蝠�: 'questions',
+    #u'蝠冗ｭ�: 'questions',
+    #u'faq': 'questions',
+    u'繝｡繧ｿ': 'meta',
+    #u'繧､繝｡繝ｼ繧ｸ繝槭�': 'imagemap',
+    u'繧､繝｡繝ｼ繧ｸ': 'image',
+    u'逕ｻ蜒�: 'image',
+    u'繝輔ぅ繧ｰ繧｢': 'figure',
+    u'蝗ｳ迚�: 'figure',
+    u'繧､繝ｳ繧ｯ繝ｫ繝ｼ繝�: 'include',
+    u'蜷ｫ繧': 'include',
+    u'邨�∩霎ｼ縺ｿ': 'include',
+    u'逕�: 'raw',
+    u'蜴�: 'raw',
+    u'謠帙∴繧�: 'replace',
+    u'蜿悶ｊ謠帙∴繧�: 'replace',
+    u'謗帙￠譖ｿ縺医ｋ': 'replace',
+    u'繝ｦ繝九さ繝ｼ繝�: 'unicode',
+    u'譌･莉�: 'date',
+    u'繧ｯ繝ｩ繧ｹ': 'class',
+    u'繝ｭ繝ｼ繝ｫ': 'role',
+    u'蠖ｹ': 'role',
+    u'繝�ぅ繝輔か繝ｫ繝医Ο繝ｼ繝ｫ': 'default-role',
+    u'譌｢螳壼ｽｹ': 'default-role',
+    u'繧ｿ繧､繝医Ν': 'title',
+    u'鬘�: 'title',                    # 鬘悟錐縲莉ｶ蜷�    u'逶ｮ谺｡': 'contents',
+    u'遽謨ｰ': 'sectnum',
+    u'繝倥ャ繝': 'header',
+    u'繝輔ャ繧ｿ': 'footer',
+    #u'閼壽ｳｨ': 'footnotes',             # 閼夊ｨｻ?
+    #u'繧ｵ繧､繝��繧ｷ繝ｧ繝ｳ': 'citations',縲縲縲# 蜃ｺ蜈ｸ縲蠑戊ｨｼ縲蠑慕畑
+    u'繧ｿ繝ｼ繧ｲ繝�ヨ繝弱�繝�: 'target-notes', # 逧�ｳｨ縲逧��豕ｨ
+    }
+"""Japanese name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+    # language-dependent: fixed
+    u'逡･': 'abbreviation',
+    u'鬆ｭ蟄苓ｪ�: 'acronym',
+    u'繧､繝ｳ繝�ャ繧ｯ繧ｹ': 'index',
+    u'邏｢蠑�: 'index',
+    u'豺ｻ蟄�: 'subscript',
+    u'荳倶ｻ�: 'subscript',
+    u'荳�: 'subscript',
+    u'荳贋ｻ�: 'superscript',
+    u'荳�: 'superscript',
+    u'鬘悟盾辣ｧ': 'title-reference',
+    u'pep蜿ら�': 'pep-reference',
+    u'rfc蜿ら�': 'rfc-reference',
+    u'蠑ｷ隱ｿ': 'emphasis',
+    u'蠑ｷ縺�: 'strong',
+    u'繝ｪ繝�Λ繝ｫ': 'literal',
+    u'謨ｴ蠖｢貂医∩': 'literal',
+    u'蜷堺ｻ伜盾辣ｧ': 'named-reference',
+    u'辟｡蜷榊盾辣ｧ': 'anonymous-reference',
+    u'閼壽ｳｨ蜿ら�': 'footnote-reference',
+    u'蜃ｺ蜈ｸ蜿ら�': 'citation-reference',
+    u'莉｣蜈･蜿ら�': 'substitution-reference',
+    u'逧�: 'target',
+    u'uri蜿ら�': 'uri-reference',
+    u'uri': 'uri-reference',
+    u'url': 'uri-reference',
+    u'逕�: 'raw',}
+"""Mapping of Japanese role names to canonical role names for interpreted
+text."""
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/languages/zh_tw.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/languages/zh_tw.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/languages/zh_tw.py (revision 3)
@@ -0,0 +1,107 @@
+# -*- coding: utf-8 -*-
+# Author: David Goodger
+# Contact: goodger@users.sourceforge.net
+# Revision: $Revision: 4229 $
+# Date: $Date: 2005-12-23 00:46:16 +0100 (Fri, 23 Dec 2005) $
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Traditional Chinese language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      # language-dependent: fixed
+      'attention (translation required)': 'attention',
+      'caution (translation required)': 'caution',
+      'danger (translation required)': 'danger',
+      'error (translation required)': 'error',
+      'hint (translation required)': 'hint',
+      'important (translation required)': 'important',
+      'note (translation required)': 'note',
+      'tip (translation required)': 'tip',
+      'warning (translation required)': 'warning',
+      'admonition (translation required)': 'admonition',
+      'sidebar (translation required)': 'sidebar',
+      'topic (translation required)': 'topic',
+      'line-block (translation required)': 'line-block',
+      'parsed-literal (translation required)': 'parsed-literal',
+      'rubric (translation required)': 'rubric',
+      'epigraph (translation required)': 'epigraph',
+      'highlights (translation required)': 'highlights',
+      'pull-quote (translation required)': 'pull-quote',
+      'compound (translation required)': 'compound',
+      u'container (translation required)': 'container',
+      #'questions (translation required)': 'questions',
+      'table (translation required)': 'table',
+      'csv-table (translation required)': 'csv-table',
+      'list-table (translation required)': 'list-table',
+      #'qa (translation required)': 'questions',
+      #'faq (translation required)': 'questions',
+      'meta (translation required)': 'meta',
+      #'imagemap (translation required)': 'imagemap',
+      'image (translation required)': 'image',
+      'figure (translation required)': 'figure',
+      'include (translation required)': 'include',
+      'raw (translation required)': 'raw',
+      'replace (translation required)': 'replace',
+      'unicode (translation required)': 'unicode',
+      u'譌･譛�: 'date',
+      'class (translation required)': 'class',
+      'role (translation required)': 'role',
+      u'default-role (translation required)': 'default-role',
+      u'title (translation required)': 'title',
+      'contents (translation required)': 'contents',
+      'sectnum (translation required)': 'sectnum',
+      'section-numbering (translation required)': 'sectnum',
+      u'header (translation required)': 'header',
+      u'footer (translation required)': 'footer',
+      #'footnotes (translation required)': 'footnotes',
+      #'citations (translation required)': 'citations',
+      'target-notes (translation required)': 'target-notes',
+      'restructuredtext-test-directive': 'restructuredtext-test-directive'}
+"""Traditional Chinese name to registered (in directives/__init__.py)
+directive name mapping."""
+
+roles = {
+    # language-dependent: fixed
+    'abbreviation (translation required)': 'abbreviation',
+    'ab (translation required)': 'abbreviation',
+    'acronym (translation required)': 'acronym',
+    'ac (translation required)': 'acronym',
+    'index (translation required)': 'index',
+    'i (translation required)': 'index',
+    'subscript (translation required)': 'subscript',
+    'sub (translation required)': 'subscript',
+    'superscript (translation required)': 'superscript',
+    'sup (translation required)': 'superscript',
+    'title-reference (translation required)': 'title-reference',
+    'title (translation required)': 'title-reference',
+    't (translation required)': 'title-reference',
+    'pep-reference (translation required)': 'pep-reference',
+    'pep (translation required)': 'pep-reference',
+    'rfc-reference (translation required)': 'rfc-reference',
+    'rfc (translation required)': 'rfc-reference',
+    'emphasis (translation required)': 'emphasis',
+    'strong (translation required)': 'strong',
+    'literal (translation required)': 'literal',
+    'named-reference (translation required)': 'named-reference',
+    'anonymous-reference (translation required)': 'anonymous-reference',
+    'footnote-reference (translation required)': 'footnote-reference',
+    'citation-reference (translation required)': 'citation-reference',
+    'substitution-reference (translation required)': 'substitution-reference',
+    'target (translation required)': 'target',
+    'uri-reference (translation required)': 'uri-reference',
+    'uri (translation required)': 'uri-reference',
+    'url (translation required)': 'uri-reference',
+    'raw (translation required)': 'raw',}
+"""Mapping of Traditional Chinese role names to canonical role names for
+interpreted text."""
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/languages/fi.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/languages/fi.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/languages/fi.py (revision 3)
@@ -0,0 +1,95 @@
+# Author: Asko Soukka
+# Contact: asko.soukka@iki.fi
+# Revision: $Revision: 4229 $
+# Date: $Date: 2005-12-23 00:46:16 +0100 (Fri, 23 Dec 2005) $
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Finnish-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      # language-dependent: fixed
+      u'huomio': u'attention',
+      u'varo': u'caution',
+      u'vaara': u'danger',
+      u'virhe': u'error',
+      u'vihje': u'hint',
+      u't\u00e4rke\u00e4\u00e4': u'important',
+      u'huomautus': u'note',
+      u'neuvo': u'tip',
+      u'varoitus': u'warning',
+      u'kehotus': u'admonition',
+      u'sivupalkki': u'sidebar',
+      u'aihe': u'topic',
+      u'rivi': u'line-block',
+      u'tasalevyinen': u'parsed-literal',
+      u'ohje': u'rubric',
+      u'epigraafi': u'epigraph',
+      u'kohokohdat': u'highlights',
+      u'lainaus': u'pull-quote',
+      u'taulukko': u'table',
+      u'csv-taulukko': u'csv-table',
+      u'list-table (translation required)': 'list-table',
+      u'compound (translation required)': 'compound',
+      u'container (translation required)': 'container',
+      #u'kysymykset': u'questions',
+      u'meta': u'meta',
+      #u'kuvakartta': u'imagemap',
+      u'kuva': u'image',
+      u'kaavio': u'figure',
+      u'sis\u00e4llyt\u00e4': u'include',
+      u'raaka': u'raw',
+      u'korvaa': u'replace',
+      u'unicode': u'unicode',
+      u'p\u00e4iv\u00e4ys': u'date',
+      u'luokka': u'class',
+      u'rooli': u'role',
+      u'default-role (translation required)': 'default-role',
+      u'title (translation required)': 'title',
+      u'sis\u00e4llys': u'contents',
+      u'kappale': u'sectnum',
+      u'header (translation required)': 'header',
+      u'footer (translation required)': 'footer',
+      #u'alaviitteet': u'footnotes',
+      #u'viitaukset': u'citations',
+      u'target-notes (translation required)': u'target-notes'}
+"""Finnish name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+    # language-dependent: fixed
+    u'lyhennys': u'abbreviation',
+    u'akronyymi': u'acronym',
+    u'kirjainsana': u'acronym',
+    u'hakemisto': u'index',
+    u'luettelo': u'index',
+    u'alaindeksi': u'subscript',
+    u'indeksi': u'subscript',
+    u'yl\u00e4indeksi': u'superscript',
+    u'title-reference (translation required)': u'title-reference',
+    u'title (translation required)': u'title-reference',
+    u'pep-reference (translation required)': u'pep-reference',
+    u'rfc-reference (translation required)': u'rfc-reference',
+    u'korostus': u'emphasis',
+    u'vahvistus': u'strong',
+    u'tasalevyinen': u'literal',
+    u'named-reference (translation required)': u'named-reference',
+    u'anonymous-reference (translation required)': u'anonymous-reference',
+    u'footnote-reference (translation required)': u'footnote-reference',
+    u'citation-reference (translation required)': u'citation-reference',
+    u'substitution-reference (translation required)': u'substitution-reference',
+    u'kohde': u'target',
+    u'uri-reference (translation required)': u'uri-reference',
+    u'raw (translation required)': 'raw',}
+"""Mapping of Finnish role names to canonical role names for interpreted text.
+"""
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/languages/__init__.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/languages/__init__.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/languages/__init__.py (revision 3)
@@ -0,0 +1,27 @@
+# Author: David Goodger
+# Contact: goodger@users.sourceforge.net
+# Revision: $Revision: 2224 $
+# Date: $Date: 2004-06-05 21:40:46 +0200 (Sat, 05 Jun 2004) $
+# Copyright: This module has been placed in the public domain.
+
+# Internationalization details are documented in
+# <http://docutils.sf.net/docs/howto/i18n.html>.
+
+"""
+This package contains modules for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+_languages = {}
+
+def get_language(language_code):
+    if _languages.has_key(language_code):
+        return _languages[language_code]
+    try:
+        module = __import__(language_code, globals(), locals())
+    except ImportError:
+        return None
+    _languages[language_code] = module
+    return module
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/languages/zh_cn.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/languages/zh_cn.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/languages/zh_cn.py (revision 3)
@@ -0,0 +1,102 @@
+# -*- coding: utf-8 -*-
+# Author: Panjunyong
+# Contact: panjy@zopechina.com
+# Revision: $Revision: 4237 $
+# Date: $Date: 2006-01-01 03:35:00 +0100 (Sun, 01 Jan 2006) $
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Simplified Chinese language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      # language-dependent: fixed
+      u'豕ｨ諢�: 'attention',
+      u'蟆丞ｿ�: 'caution',
+      u'蜊ｱ髯ｩ': 'danger',
+      u'髞呵ｯｯ': 'error',
+      u'謠千､ｺ': 'hint',
+      u'驥崎ｦ�: 'important',
+      u'豕ｨ隗｣': 'note',
+      u'謚蟾ｧ': 'tip',
+      u'隴ｦ蜻�: 'warning',
+      u'蠢蜻�: 'admonition',
+      u'萓ｧ譯�: 'sidebar',
+      u'荳ｻ鬚�: 'topic',
+      u'line-block (translation required)': 'line-block',
+      u'parsed-literal (translation required)': 'parsed-literal',
+      u'驢堤岼': 'rubric',
+      u'體ｭ譁�: 'epigraph',
+      u'隕∫せ': 'highlights',
+      u'pull-quote (translation required)': 'pull-quote',
+      u'螟榊粋': 'compound',
+      u'螳ｹ蝎ｨ': 'container',
+      #u'questions (translation required)': 'questions',
+      u'陦ｨ譬ｼ': 'table',
+      u'csv陦ｨ譬ｼ': 'csv-table',
+      u'蛻苓｡ｨ陦ｨ譬ｼ': 'list-table',
+      #u'qa (translation required)': 'questions',
+      #u'faq (translation required)': 'questions',
+      u'蜈�焚謐ｮ': 'meta',
+      #u'imagemap (translation required)': 'imagemap',
+      u'蝗ｾ迚�: 'image',
+      u'蝗ｾ萓�: 'figure',
+      u'蛹�性': 'include',
+      u'蜴滓枚': 'raw',
+      u'莉｣譖ｿ': 'replace',
+      u'扈滉ｸ遐�: 'unicode',
+      u'譌･譛�: 'date',
+      u'邀ｻ蝙�: 'class',
+      u'隗定牡': 'role',
+      u'鮟倩ｮ､隗定牡': 'default-role',
+      u'譬�｢�: 'title',
+      u'逶ｮ蠖�: 'contents',
+      u'遶闃ょｺ丞捷': 'sectnum',
+      u'鬚伜､ｴ': 'header',
+      u'鬘ｵ閼�: 'footer',
+      #u'footnotes (translation required)': 'footnotes',
+      #u'citations (translation required)': 'citations',
+      u'target-notes (translation required)': 'target-notes',
+      u'restructuredtext-test-directive': 'restructuredtext-test-directive'}
+"""Simplified Chinese name to registered (in directives/__init__.py)
+directive name mapping."""
+
+roles = {
+    # language-dependent: fixed
+    u'郛ｩ蜀�: 'abbreviation',
+    u'邂遘ｰ': 'acronym',
+    u'index (translation required)': 'index',
+    u'i (translation required)': 'index',
+    u'荳区�: 'subscript',
+    u'荳頑�: 'superscript',
+    u'title-reference (translation required)': 'title-reference',
+    u'title (translation required)': 'title-reference',
+    u't (translation required)': 'title-reference',
+    u'pep-reference (translation required)': 'pep-reference',
+    u'pep (translation required)': 'pep-reference',
+    u'rfc-reference (translation required)': 'rfc-reference',
+    u'rfc (translation required)': 'rfc-reference',
+    u'蠑ｺ隹�: 'emphasis',
+    u'蜉邊�: 'strong',
+    u'蟄鈴擇': 'literal',
+    u'named-reference (translation required)': 'named-reference',
+    u'anonymous-reference (translation required)': 'anonymous-reference',
+    u'footnote-reference (translation required)': 'footnote-reference',
+    u'citation-reference (translation required)': 'citation-reference',
+    u'substitution-reference (translation required)': 'substitution-reference',
+    u'target (translation required)': 'target',
+    u'uri-reference (translation required)': 'uri-reference',
+    u'uri (translation required)': 'uri-reference',
+    u'url (translation required)': 'uri-reference',
+    u'raw (translation required)': 'raw',}
+"""Mapping of Simplified Chinese role names to canonical role names
+for interpreted text."""
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/languages/en.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/languages/en.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/languages/en.py (revision 3)
@@ -0,0 +1,106 @@
+# Author: David Goodger
+# Contact: goodger@users.sourceforge.net
+# Revision: $Revision: 4229 $
+# Date: $Date: 2005-12-23 00:46:16 +0100 (Fri, 23 Dec 2005) $
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+English-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      # language-dependent: fixed
+      'attention': 'attention',
+      'caution': 'caution',
+      'danger': 'danger',
+      'error': 'error',
+      'hint': 'hint',
+      'important': 'important',
+      'note': 'note',
+      'tip': 'tip',
+      'warning': 'warning',
+      'admonition': 'admonition',
+      'sidebar': 'sidebar',
+      'topic': 'topic',
+      'line-block': 'line-block',
+      'parsed-literal': 'parsed-literal',
+      'rubric': 'rubric',
+      'epigraph': 'epigraph',
+      'highlights': 'highlights',
+      'pull-quote': 'pull-quote',
+      'compound': 'compound',
+      'container': 'container',
+      #'questions': 'questions',
+      'table': 'table',
+      'csv-table': 'csv-table',
+      'list-table': 'list-table',
+      #'qa': 'questions',
+      #'faq': 'questions',
+      'meta': 'meta',
+      #'imagemap': 'imagemap',
+      'image': 'image',
+      'figure': 'figure',
+      'include': 'include',
+      'raw': 'raw',
+      'replace': 'replace',
+      'unicode': 'unicode',
+      'date': 'date',
+      'class': 'class',
+      'role': 'role',
+      'default-role': 'default-role',
+      'title': 'title',
+      'contents': 'contents',
+      'sectnum': 'sectnum',
+      'section-numbering': 'sectnum',
+      'header': 'header',
+      'footer': 'footer',
+      #'footnotes': 'footnotes',
+      #'citations': 'citations',
+      'target-notes': 'target-notes',
+      'restructuredtext-test-directive': 'restructuredtext-test-directive'}
+"""English name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+    # language-dependent: fixed
+    'abbreviation': 'abbreviation',
+    'ab': 'abbreviation',
+    'acronym': 'acronym',
+    'ac': 'acronym',
+    'index': 'index',
+    'i': 'index',
+    'subscript': 'subscript',
+    'sub': 'subscript',
+    'superscript': 'superscript',
+    'sup': 'superscript',
+    'title-reference': 'title-reference',
+    'title': 'title-reference',
+    't': 'title-reference',
+    'pep-reference': 'pep-reference',
+    'pep': 'pep-reference',
+    'rfc-reference': 'rfc-reference',
+    'rfc': 'rfc-reference',
+    'emphasis': 'emphasis',
+    'strong': 'strong',
+    'literal': 'literal',
+    'named-reference': 'named-reference',
+    'anonymous-reference': 'anonymous-reference',
+    'footnote-reference': 'footnote-reference',
+    'citation-reference': 'citation-reference',
+    'substitution-reference': 'substitution-reference',
+    'target': 'target',
+    'uri-reference': 'uri-reference',
+    'uri': 'uri-reference',
+    'url': 'uri-reference',
+    'raw': 'raw',}
+"""Mapping of English role names to canonical role names for interpreted text.
+"""
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/languages/eo.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/languages/eo.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/languages/eo.py (revision 3)
@@ -0,0 +1,116 @@
+# Author: Marcelo Huerta San Martin
+# Contact: richieadler@users.sourceforge.net
+# Revision: $Revision: 4231 $
+# Date: $Date: 2005-12-23 03:10:41 +0100 (Fri, 23 Dec 2005) $
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Esperanto-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      # language-dependent: fixed
+      u'atentu': 'attention',
+      u'zorgu': 'caution',
+      u'dangxero': 'danger',
+      u'dan\u011dero': 'danger',
+      u'eraro': 'error',
+      u'spuro': 'hint',
+      u'grava': 'important',
+      u'noto': 'note',
+      u'helpeto': 'tip',
+      u'averto': 'warning',
+      u'admono': 'admonition',
+      u'flankteksto': 'sidebar',
+      u'temo': 'topic',
+      u'linea-bloko': 'line-block',
+      u'analizota-literalo': 'parsed-literal',
+      u'rubriko': 'rubric',
+      u'epigrafo': 'epigraph',
+      u'elstarajxoj': 'highlights',
+      u'elstara\u0135oj': 'highlights',
+      u'ekstera-citajxo': 'pull-quote',
+      u'ekstera-cita\u0135o': 'pull-quote',
+      u'kombinajxo': 'compound',
+      u'kombina\u0135o': 'compound',
+      u'tekstingo': 'container',
+      u'enhavilo': 'container',
+      #'questions': 'questions',
+      #'qa': 'questions',
+      #'faq': 'questions',
+      u'tabelo': 'table',
+      u'tabelo-vdk': 'csv-table', # "valoroj disigitaj per komoj"
+      u'tabelo-csv': 'csv-table',
+      u'tabelo-lista': 'list-table',
+      u'meta': 'meta',
+      #'imagemap': 'imagemap',
+      u'bildo': 'image',
+      u'figuro': 'figure',
+      u'inkludi': 'include',
+      u'senanaliza': 'raw',
+      u'anstatauxi': 'replace',
+      u'anstata\u016di': 'replace',
+      u'unicode': 'unicode',
+      u'dato': 'date',
+      u'klaso': 'class',
+      u'rolo': 'role',
+      u'preterlasita-rolo': 'default-role',
+      u'titolo': 'title',
+      u'enhavo': 'contents',
+      u'seknum': 'sectnum',
+      u'sekcia-numerado': 'sectnum',
+      u'kapsekcio': 'header',
+      u'piedsekcio': 'footer',
+      #'footnotes': 'footnotes',
+      #'citations': 'citations',
+      u'celaj-notoj': 'target-notes',
+      u'restructuredtext-test-directive': 'restructuredtext-test-directive'}
+"""Esperanto name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+    # language-dependent: fixed
+    u'mallongigo': 'abbreviation',
+    u'mall': 'abbreviation',
+    u'komenclitero': 'acronym',
+    u'kl': 'acronym',
+    u'indekso': 'index',
+    u'i': 'index',
+    u'subskribo': 'subscript',
+    u'sub': 'subscript',
+    u'supraskribo': 'superscript',
+    u'sup': 'superscript',
+    u'titola-referenco': 'title-reference',
+    u'titolo': 'title-reference',
+    u't': 'title-reference',
+    u'pep-referenco': 'pep-reference',
+    u'pep': 'pep-reference',
+    u'rfc-referenco': 'rfc-reference',
+    u'rfc': 'rfc-reference',
+    u'emfazo': 'emphasis',
+    u'forta': 'strong',
+    u'litera': 'literal',
+    u'nomita-referenco': 'named-reference',
+    u'nenomita-referenco': 'anonymous-reference',
+    u'piednota-referenco': 'footnote-reference',
+    u'citajxo-referenco': 'citation-reference',
+    u'cita\u0135o-referenco': 'citation-reference',
+    u'anstatauxa-referenco': 'substitution-reference',
+    u'anstata\u016da-referenco': 'substitution-reference',
+    u'celo': 'target',
+    u'uri-referenco': 'uri-reference',
+    u'uri': 'uri-reference',
+    u'url': 'uri-reference',
+    u'senanaliza': 'raw',
+}
+"""Mapping of Esperanto role names to canonical role names for interpreted text.
+"""
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/languages/cs.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/languages/cs.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/languages/cs.py (revision 3)
@@ -0,0 +1,106 @@
+# Author: Marek Blaha
+# Contact: mb@dat.cz
+# Revision: $Revision: 4229 $
+# Date: $Date: 2005-12-23 00:46:16 +0100 (Fri, 23 Dec 2005) $
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Czech-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      # language-dependent: fixed
+      u'pozor': 'attention',
+      u'caution (translation required)': 'caution', # jak rozlisit caution a warning?
+      u'nebezpe\u010D\u00ED': 'danger',
+      u'chyba': 'error',
+      u'rada': 'hint',
+      u'd\u016Fle\u017Eit\u00E9': 'important',
+      u'pozn\u00E1mka': 'note',
+      u'tip (translation required)': 'tip',
+      u'varov\u00E1n\u00ED': 'warning',
+      u'admonition (translation required)': 'admonition',
+      u'sidebar (translation required)': 'sidebar',
+      u't\u00E9ma': 'topic',
+      u'line-block (translation required)': 'line-block',
+      u'parsed-literal (translation required)': 'parsed-literal',
+      u'odd\u00EDl': 'rubric',
+      u'moto': 'epigraph',
+      u'highlights (translation required)': 'highlights',
+      u'pull-quote (translation required)': 'pull-quote',
+      u'compound (translation required)': 'compound',
+      u'container (translation required)': 'container',
+      #'questions': 'questions',
+      #'qa': 'questions',
+      #'faq': 'questions',
+      u'table (translation required)': 'table',
+      u'csv-table (translation required)': 'csv-table',
+      u'list-table (translation required)': 'list-table',
+      u'meta (translation required)': 'meta',
+      #'imagemap': 'imagemap',
+      u'image (translation required)': 'image',   # obrazek
+      u'figure (translation required)': 'figure', # a tady?
+      u'include (translation required)': 'include',
+      u'raw (translation required)': 'raw',
+      u'replace (translation required)': 'replace',
+      u'unicode (translation required)': 'unicode',
+      u'datum': 'date',
+      u't\u0159\u00EDda': 'class',
+      u'role (translation required)': 'role',
+      u'default-role (translation required)': 'default-role',
+      u'title (translation required)': 'title',
+      u'obsah': 'contents',
+      u'sectnum (translation required)': 'sectnum',
+      u'section-numbering (translation required)': 'sectnum',
+      u'header (translation required)': 'header',
+      u'footer (translation required)': 'footer',
+      #'footnotes': 'footnotes',
+      #'citations': 'citations',
+      u'target-notes (translation required)': 'target-notes',
+      u'restructuredtext-test-directive': 'restructuredtext-test-directive'}
+"""Czech name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+    # language-dependent: fixed
+    u'abbreviation (translation required)': 'abbreviation',
+    u'ab (translation required)': 'abbreviation',
+    u'acronym (translation required)': 'acronym',
+    u'ac (translation required)': 'acronym',
+    u'index (translation required)': 'index',
+    u'i (translation required)': 'index',
+    u'subscript (translation required)': 'subscript',
+    u'sub (translation required)': 'subscript',
+    u'superscript (translation required)': 'superscript',
+    u'sup (translation required)': 'superscript',
+    u'title-reference (translation required)': 'title-reference',
+    u'title (translation required)': 'title-reference',
+    u't (translation required)': 'title-reference',
+    u'pep-reference (translation required)': 'pep-reference',
+    u'pep (translation required)': 'pep-reference',
+    u'rfc-reference (translation required)': 'rfc-reference',
+    u'rfc (translation required)': 'rfc-reference',
+    u'emphasis (translation required)': 'emphasis',
+    u'strong (translation required)': 'strong',
+    u'literal (translation required)': 'literal',
+    u'named-reference (translation required)': 'named-reference',
+    u'anonymous-reference (translation required)': 'anonymous-reference',
+    u'footnote-reference (translation required)': 'footnote-reference',
+    u'citation-reference (translation required)': 'citation-reference',
+    u'substitution-reference (translation required)': 'substitution-reference',
+    u'target (translation required)': 'target',
+    u'uri-reference (translation required)': 'uri-reference',
+    u'uri (translation required)': 'uri-reference',
+    u'url (translation required)': 'uri-reference',
+    u'raw (translation required)': 'raw',}
+"""Mapping of Czech role names to canonical role names for interpreted text.
+"""
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/languages/pt_br.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/languages/pt_br.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/languages/pt_br.py (revision 3)
@@ -0,0 +1,106 @@
+# Author: David Goodger
+# Contact: goodger@users.sourceforge.net
+# Revision: $Revision: 4229 $
+# Date: $Date: 2005-12-23 00:46:16 +0100 (Fri, 23 Dec 2005) $
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Brazilian Portuguese-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      # language-dependent: fixed
+      u'aten\u00E7\u00E3o': 'attention',
+      'cuidado': 'caution',
+      'perigo': 'danger',
+      'erro': 'error',
+      u'sugest\u00E3o': 'hint',
+      'importante': 'important',
+      'nota': 'note',
+      'dica': 'tip',
+      'aviso': 'warning',
+      u'exorta\u00E7\u00E3o': 'admonition',
+      'barra-lateral': 'sidebar',
+      u't\u00F3pico': 'topic',
+      'bloco-de-linhas': 'line-block',
+      'literal-interpretado': 'parsed-literal',
+      'rubrica': 'rubric',
+      u'ep\u00EDgrafo': 'epigraph',
+      'destaques': 'highlights',
+      u'cita\u00E7\u00E3o-destacada': 'pull-quote',
+      u'compound (translation required)': 'compound',
+      u'container (translation required)': 'container',
+      #'perguntas': 'questions',
+      #'qa': 'questions',
+      #'faq': 'questions',
+      u'table (translation required)': 'table',
+      u'csv-table (translation required)': 'csv-table',
+      u'list-table (translation required)': 'list-table',
+      'meta': 'meta',
+      #'imagemap': 'imagemap',
+      'imagem': 'image',
+      'figura': 'figure',
+      u'inclus\u00E3o': 'include',
+      'cru': 'raw',
+      u'substitui\u00E7\u00E3o': 'replace',
+      'unicode': 'unicode',
+      'data': 'date',
+      'classe': 'class',
+      'role (translation required)': 'role',
+      u'default-role (translation required)': 'default-role',
+      u'title (translation required)': 'title',
+      u'\u00EDndice': 'contents',
+      'numsec': 'sectnum',
+      u'numera\u00E7\u00E3o-de-se\u00E7\u00F5es': 'sectnum',
+      u'header (translation required)': 'header',
+      u'footer (translation required)': 'footer',
+      #u'notas-de-rorap\u00E9': 'footnotes',
+      #u'cita\u00E7\u00F5es': 'citations',
+      u'links-no-rodap\u00E9': 'target-notes',
+      'restructuredtext-test-directive': 'restructuredtext-test-directive'}
+"""Brazilian Portuguese name to registered (in directives/__init__.py)
+directive name mapping."""
+
+roles = {
+    # language-dependent: fixed
+    u'abbrevia\u00E7\u00E3o': 'abbreviation',
+    'ab': 'abbreviation',
+    u'acr\u00F4nimo': 'acronym',
+    'ac': 'acronym',
+    u'\u00EDndice-remissivo': 'index',
+    'i': 'index',
+    'subscrito': 'subscript',
+    'sub': 'subscript',
+    'sobrescrito': 'superscript',
+    'sob': 'superscript',
+    u'refer\u00EAncia-a-t\u00EDtulo': 'title-reference',
+    u't\u00EDtulo': 'title-reference',
+    't': 'title-reference',
+    u'refer\u00EAncia-a-pep': 'pep-reference',
+    'pep': 'pep-reference',
+    u'refer\u00EAncia-a-rfc': 'rfc-reference',
+    'rfc': 'rfc-reference',
+    u'\u00EAnfase': 'emphasis',
+    'forte': 'strong',
+    'literal': 'literal',               # translation required?
+    u'refer\u00EAncia-por-nome': 'named-reference',
+    u'refer\u00EAncia-an\u00F4nima': 'anonymous-reference',
+    u'refer\u00EAncia-a-nota-de-rodap\u00E9': 'footnote-reference',
+    u'refer\u00EAncia-a-cita\u00E7\u00E3o': 'citation-reference',
+    u'refer\u00EAncia-a-substitui\u00E7\u00E3o': 'substitution-reference',
+    'alvo': 'target',
+    u'refer\u00EAncia-a-uri': 'uri-reference',
+    'uri': 'uri-reference',
+    'url': 'uri-reference',
+    'cru': 'raw',}
+"""Mapping of Brazilian Portuguese role names to canonical role names
+for interpreted text."""
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/languages/fr.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/languages/fr.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/languages/fr.py (revision 3)
@@ -0,0 +1,101 @@
+# Authors: David Goodger; William Dode
+# Contact: goodger@users.sourceforge.net
+# Revision: $Revision: 4229 $
+# Date: $Date: 2005-12-23 00:46:16 +0100 (Fri, 23 Dec 2005) $
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+French-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      u'attention': 'attention',
+      u'pr\u00E9caution': 'caution',
+      u'danger': 'danger',
+      u'erreur': 'error',
+      u'conseil': 'hint',
+      u'important': 'important',
+      u'note': 'note',
+      u'astuce': 'tip',
+      u'avertissement': 'warning',
+      u'admonition': 'admonition',
+      u'encadr\u00E9': 'sidebar',
+      u'sujet': 'topic',
+      u'bloc-textuel': 'line-block',
+      u'bloc-interpr\u00E9t\u00E9': 'parsed-literal',
+      u'code-interpr\u00E9t\u00E9': 'parsed-literal',
+      u'intertitre': 'rubric',
+      u'exergue': 'epigraph',
+      u'\u00E9pigraphe': 'epigraph',
+      u'chapeau': 'highlights',
+      u'accroche': 'pull-quote',
+      u'compound (translation required)': 'compound',
+      u'container (translation required)': 'container',
+      #u'questions': 'questions',
+      #u'qr': 'questions',
+      #u'faq': 'questions',
+      u'tableau': 'table',
+      u'csv-table (translation required)': 'csv-table',
+      u'list-table (translation required)': 'list-table',
+      u'm\u00E9ta': 'meta',
+      #u'imagemap (translation required)': 'imagemap',
+      u'image': 'image',
+      u'figure': 'figure',
+      u'inclure': 'include',
+      u'brut': 'raw',
+      u'remplacer': 'replace',
+      u'remplace': 'replace',
+      u'unicode': 'unicode',
+      u'date': 'date',
+      u'classe': 'class',
+      u'role (translation required)': 'role',
+      u'default-role (translation required)': 'default-role',
+      u'titre (translation required)': 'title',
+      u'sommaire': 'contents',
+      u'table-des-mati\u00E8res': 'contents',
+      u'sectnum': 'sectnum',
+      u'section-num\u00E9rot\u00E9e': 'sectnum',
+      u'liens': 'target-notes',
+      u'header (translation required)': 'header',
+      u'footer (translation required)': 'footer',
+      #u'footnotes (translation required)': 'footnotes',
+      #u'citations (translation required)': 'citations',
+      }
+"""French name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+      u'abr\u00E9viation': 'abbreviation',
+      u'acronyme': 'acronym',
+      u'sigle': 'acronym',
+      u'index': 'index',
+      u'indice': 'subscript',
+      u'ind': 'subscript',
+      u'exposant': 'superscript',
+      u'exp': 'superscript',
+      u'titre-r\u00E9f\u00E9rence': 'title-reference',
+      u'titre': 'title-reference',
+      u'pep-r\u00E9f\u00E9rence': 'pep-reference',
+      u'rfc-r\u00E9f\u00E9rence': 'rfc-reference',
+      u'emphase': 'emphasis',
+      u'fort': 'strong',
+      u'litt\u00E9ral': 'literal',
+      u'nomm\u00E9e-r\u00E9f\u00E9rence': 'named-reference',
+      u'anonyme-r\u00E9f\u00E9rence': 'anonymous-reference',
+      u'note-r\u00E9f\u00E9rence': 'footnote-reference',
+      u'citation-r\u00E9f\u00E9rence': 'citation-reference',
+      u'substitution-r\u00E9f\u00E9rence': 'substitution-reference',
+      u'lien': 'target',
+      u'uri-r\u00E9f\u00E9rence': 'uri-reference',
+      u'brut': 'raw',}
+"""Mapping of French role names to canonical role names for interpreted text.
+"""
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/languages/es.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/languages/es.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/languages/es.py (revision 3)
@@ -0,0 +1,123 @@
+# -*- coding: utf-8 -*-
+# Author: Marcelo Huerta San Martﾃｭn
+# Contact: richieadler@users.sourceforge.net
+# Revision: $Revision: 4231 $
+# Date: $Date: 2005-12-23 03:10:41 +0100 (Fri, 23 Dec 2005) $
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Spanish-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      u'atenci\u00f3n': 'attention',
+      u'atencion': 'attention',
+      u'precauci\u00f3n': 'caution',
+      u'precaucion': 'caution',
+      u'peligro': 'danger',
+      u'error': 'error',
+      u'sugerencia': 'hint',
+      u'importante': 'important',
+      u'nota': 'note',
+      u'consejo': 'tip',
+      u'advertencia': 'warning',
+      u'exhortacion': 'admonition',
+      u'exhortaci\u00f3n': 'admonition',
+      u'nota-al-margen': 'sidebar',
+      u'tema': 'topic',
+      u'bloque-de-lineas': 'line-block',
+      u'bloque-de-l\u00edneas': 'line-block',
+      u'literal-evaluado': 'parsed-literal',
+      u'firma': 'rubric',
+      u'ep\u00edgrafe': 'epigraph',
+      u'epigrafe': 'epigraph',
+      u'destacado': 'highlights',
+      u'cita-destacada': 'pull-quote',
+      u'combinacion': 'compound',
+      u'combinaci\u00f3n': 'compound',
+      u'contenedor': 'container',
+      #'questions': 'questions',
+      #'qa': 'questions',
+      #'faq': 'questions',
+      u'tabla': 'table',
+      u'tabla-vsc': 'csv-table',
+      u'tabla-csv': 'csv-table',
+      u'tabla-lista': 'list-table',
+      u'meta': 'meta',
+      #'imagemap': 'imagemap',
+      u'imagen': 'image',
+      u'figura': 'figure',
+      u'incluir': 'include',
+      u'sin-analisis': 'raw',
+      u'sin-an\u00e1lisis': 'raw',
+      u'reemplazar': 'replace',
+      u'unicode': 'unicode',
+      u'fecha': 'date',
+      u'clase': 'class',
+      u'rol': 'role',
+      u'rol-por-omision': 'default-role',
+      u'rol-por-omisi\u00f3n': 'default-role',
+      u'titulo': 'title',
+      u't\u00edtulo': 'title',
+      u'contenido': 'contents',
+      u'numseccion': 'sectnum',
+      u'numsecci\u00f3n': 'sectnum',
+      u'numeracion-seccion': 'sectnum',
+      u'numeraci\u00f3n-secci\u00f3n': 'sectnum',
+      u'notas-destino': 'target-notes',
+      u'cabecera': 'header',
+      u'pie': 'footer',
+      #'footnotes': 'footnotes',
+      #'citations': 'citations',
+      u'restructuredtext-test-directive': 'restructuredtext-test-directive'}
+"""Spanish name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+    u'abreviatura': 'abbreviation',
+    u'ab': 'abbreviation',
+    u'acronimo': 'acronym',
+    u'acronimo': 'acronym',
+    u'ac': 'acronym',
+    u'indice': 'index',
+    u'i': 'index',
+    u'subindice': 'subscript',
+    u'sub\u00edndice': 'subscript',
+    u'superindice': 'superscript',
+    u'super\u00edndice': 'superscript',
+    u'referencia-titulo': 'title-reference',
+    u'titulo': 'title-reference',
+    u't': 'title-reference',
+    u'referencia-pep': 'pep-reference',
+    u'pep': 'pep-reference',
+    u'referencia-rfc': 'rfc-reference',
+    u'rfc': 'rfc-reference',
+    u'enfasis': 'emphasis',
+    u'\u00e9nfasis': 'emphasis',
+    u'destacado': 'strong',
+    u'literal': 'literal',              # "literal" is also a word in Spanish :-)
+    u'referencia-con-nombre': 'named-reference',
+    u'referencia-anonima': 'anonymous-reference',
+    u'referencia-an\u00f3nima': 'anonymous-reference',
+    u'referencia-nota-al-pie': 'footnote-reference',
+    u'referencia-cita': 'citation-reference',
+    u'referencia-sustitucion': 'substitution-reference',
+    u'referencia-sustituci\u00f3n': 'substitution-reference',
+    u'destino': 'target',
+    u'referencia-uri': 'uri-reference',
+    u'uri': 'uri-reference',
+    u'url': 'uri-reference',
+    u'sin-analisis': 'raw',
+    u'sin-an\u00e1lisis': 'raw',
+}
+"""Mapping of Spanish role names to canonical role names for interpreted text.
+"""
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/languages/nl.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/languages/nl.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/languages/nl.py (revision 3)
@@ -0,0 +1,110 @@
+# Author: Martijn Pieters
+# Contact: mjpieters@users.sourceforge.net
+# Revision: $Revision: 4229 $
+# Date: $Date: 2005-12-23 00:46:16 +0100 (Fri, 23 Dec 2005) $
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Dutch-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      # language-dependent: fixed
+      'attentie': 'attention',
+      'let-op': 'caution',
+      'gevaar': 'danger',
+      'fout': 'error',
+      'hint': 'hint',
+      'belangrijk': 'important',
+      'opmerking': 'note',
+      'tip': 'tip',
+      'waarschuwing': 'warning',
+      'aanmaning': 'admonition',
+      'katern': 'sidebar',
+      'onderwerp': 'topic',
+      'lijn-blok': 'line-block',
+      'letterlijk-ontleed': 'parsed-literal',
+      'rubriek': 'rubric',
+      'opschrift': 'epigraph',
+      'hoogtepunten': 'highlights',
+      'pull-quote': 'pull-quote', # Dutch printers use the english term
+      'samenstelling': 'compound',
+      'verbinding': 'compound',
+      u'container (translation required)': 'container',
+      #'vragen': 'questions',
+      'tabel': 'table',
+      'csv-tabel': 'csv-table',
+      'lijst-tabel': 'list-table',
+      #'veelgestelde-vragen': 'questions',
+      'meta': 'meta',
+      #'imagemap': 'imagemap',
+      'beeld': 'image',
+      'figuur': 'figure',
+      'opnemen': 'include',
+      'onbewerkt': 'raw',
+      'vervang': 'replace',
+      'vervanging': 'replace',
+      'unicode': 'unicode',
+      'datum': 'date',
+      'klasse': 'class',
+      'rol': 'role',
+      u'default-role (translation required)': 'default-role',
+      'title (translation required)': 'title',
+      'inhoud': 'contents',
+      'sectnum': 'sectnum',
+      'sectie-nummering': 'sectnum',
+      'hoofdstuk-nummering': 'sectnum',
+      u'header (translation required)': 'header',
+      u'footer (translation required)': 'footer',
+      #'voetnoten': 'footnotes',
+      #'citaten': 'citations',
+      'verwijzing-voetnoten': 'target-notes',
+      'restructuredtext-test-instructie': 'restructuredtext-test-directive'}
+"""Dutch name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+    # language-dependent: fixed
+    'afkorting': 'abbreviation',
+    # 'ab': 'abbreviation',
+    'acroniem': 'acronym',
+    'ac': 'acronym',
+    'index': 'index',
+    'i': 'index',
+    'inferieur': 'subscript',
+    'inf': 'subscript',
+    'superieur': 'superscript',
+    'sup': 'superscript',
+    'titel-referentie': 'title-reference',
+    'titel': 'title-reference',
+    't': 'title-reference',
+    'pep-referentie': 'pep-reference',
+    'pep': 'pep-reference',
+    'rfc-referentie': 'rfc-reference',
+    'rfc': 'rfc-reference',
+    'nadruk': 'emphasis',
+    'extra': 'strong',
+    'extra-nadruk': 'strong',
+    'vet': 'strong',
+    'letterlijk': 'literal',
+    'benoemde-referentie': 'named-reference',
+    'anonieme-referentie': 'anonymous-reference',
+    'voetnoot-referentie': 'footnote-reference',
+    'citaat-referentie': 'citation-reference',
+    'substitie-reference': 'substitution-reference',
+    'verwijzing': 'target',
+    'uri-referentie': 'uri-reference',
+    'uri': 'uri-reference',
+    'url': 'uri-reference',
+    'onbewerkt': 'raw',}
+"""Mapping of Dutch role names to canonical role names for interpreted text.
+"""
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/languages/it.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/languages/it.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/languages/it.py (revision 3)
@@ -0,0 +1,94 @@
+# Author: Nicola Larosa, Lele Gaifax
+# Contact: docutils@tekNico.net, lele@seldati.it
+# Revision: $Revision: 4229 $
+# Date: $Date: 2005-12-23 00:46:16 +0100 (Fri, 23 Dec 2005) $
+# Copyright: This module has been placed in the public domain.
+
+# Beware: the italian translation of the reStructuredText documentation
+# at http://docit.bice.dyndns.org/static/ReST, in particular
+# http://docit.bice.dyndns.org/static/ReST/ref/rst/directives.html, needs
+# to be synced with the content of this file.
+
+"""
+Italian-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      'attenzione': 'attention',
+      'cautela': 'caution',
+      'pericolo': 'danger',
+      'errore': 'error',
+      'suggerimento': 'hint',
+      'importante': 'important',
+      'nota': 'note',
+      'consiglio': 'tip',
+      'avvertenza': 'warning',
+      'ammonizione': 'admonition',
+      'riquadro': 'sidebar',
+      'argomento': 'topic',
+      'blocco-di-righe': 'line-block',
+      'blocco-interpretato': 'parsed-literal',
+      'rubrica': 'rubric',
+      'epigrafe': 'epigraph',
+      'punti-salienti': 'highlights',
+      'estratto-evidenziato': 'pull-quote',
+      'composito': 'compound',
+      u'container (translation required)': 'container',
+      #'questions': 'questions',
+      #'qa': 'questions',
+      #'faq': 'questions',
+      'tabella': 'table',
+      'tabella-csv': 'csv-table',
+      'tabella-elenco': 'list-table',
+      'meta': 'meta',
+      #'imagemap': 'imagemap',
+      'immagine': 'image',
+      'figura': 'figure',
+      'includi': 'include',
+      'grezzo': 'raw',
+      'sostituisci': 'replace',
+      'unicode': 'unicode',
+      'data': 'date',
+      'classe': 'class',
+      'ruolo': 'role',
+      'ruolo-predefinito': 'default-role',
+      'titolo': 'title',
+      'indice': 'contents',
+      'contenuti': 'contents',
+      'seznum': 'sectnum',
+      'sezioni-autonumerate': 'sectnum',
+      'annota-riferimenti-esterni': 'target-notes',
+      'intestazione': 'header',
+      'piede-pagina': 'footer',
+      #'footnotes': 'footnotes',
+      #'citations': 'citations',
+      'restructuredtext-test-directive': 'restructuredtext-test-directive'}
+"""Italian name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+      'abbreviazione': 'abbreviation',
+      'acronimo': 'acronym',
+      'indice': 'index',
+      'deponente': 'subscript',
+      'esponente': 'superscript',
+      'riferimento-titolo': 'title-reference',
+      'riferimento-pep': 'pep-reference',
+      'riferimento-rfc': 'rfc-reference',
+      'enfasi': 'emphasis',
+      'forte': 'strong',
+      'letterale': 'literal',
+      'riferimento-con-nome': 'named-reference',
+      'riferimento-anonimo': 'anonymous-reference',
+      'riferimento-nota': 'footnote-reference',
+      'riferimento-citazione': 'citation-reference',
+      'riferimento-sostituzione': 'substitution-reference',
+      'destinazione': 'target',
+      'riferimento-uri': 'uri-reference',
+      'grezzo': 'raw',}
+"""Mapping of Italian role names to canonical role names for interpreted text.
+"""
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/languages/sk.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/languages/sk.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/languages/sk.py (revision 3)
@@ -0,0 +1,93 @@
+# Author: Miroslav Vasko
+# Contact: zemiak@zoznam.sk
+# Revision: $Revision: 4229 $
+# Date: $Date: 2005-12-23 00:46:16 +0100 (Fri, 23 Dec 2005) $
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Slovak-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      u'pozor': 'attention',
+      u'opatrne': 'caution',
+      u'nebezpe\xe8enstvo': 'danger',
+      u'chyba': 'error',
+      u'rada': 'hint',
+      u'd\xf4le\x9eit\xe9': 'important',
+      u'pozn\xe1mka': 'note',
+      u'tip (translation required)': 'tip',
+      u'varovanie': 'warning',
+      u'admonition (translation required)': 'admonition',
+      u'sidebar (translation required)': 'sidebar',
+      u't\xe9ma': 'topic',
+      u'blok-riadkov': 'line-block',
+      u'parsed-literal': 'parsed-literal',
+      u'rubric (translation required)': 'rubric',
+      u'epigraph (translation required)': 'epigraph',
+      u'highlights (translation required)': 'highlights',
+      u'pull-quote (translation required)': 'pull-quote',
+      u'compound (translation required)': 'compound',
+      u'container (translation required)': 'container',
+      #u'questions': 'questions',
+      #u'qa': 'questions',
+      #u'faq': 'questions',
+      u'table (translation required)': 'table',
+      u'csv-table (translation required)': 'csv-table',
+      u'list-table (translation required)': 'list-table',
+      u'meta': 'meta',
+      #u'imagemap': 'imagemap',
+      u'obr\xe1zok': 'image',
+      u'tvar': 'figure',
+      u'vlo\x9ei\x9d': 'include',
+      u'raw (translation required)': 'raw',
+      u'nahradi\x9d': 'replace',
+      u'unicode': 'unicode',
+      u'd\u00E1tum': 'date',
+      u'class (translation required)': 'class',
+      u'role (translation required)': 'role',
+      u'default-role (translation required)': 'default-role',
+      u'title (translation required)': 'title',
+      u'obsah': 'contents',
+      u'\xe8as\x9d': 'sectnum',
+      u'\xe8as\x9d-\xe8\xedslovanie': 'sectnum',
+      u'cie\xbeov\xe9-pozn\xe1mky': 'target-notes',
+      u'header (translation required)': 'header',
+      u'footer (translation required)': 'footer',
+      #u'footnotes': 'footnotes',
+      #u'citations': 'citations',
+      }
+"""Slovak name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+      u'abbreviation (translation required)': 'abbreviation',
+      u'acronym (translation required)': 'acronym',
+      u'index (translation required)': 'index',
+      u'subscript (translation required)': 'subscript',
+      u'superscript (translation required)': 'superscript',
+      u'title-reference (translation required)': 'title-reference',
+      u'pep-reference (translation required)': 'pep-reference',
+      u'rfc-reference (translation required)': 'rfc-reference',
+      u'emphasis (translation required)': 'emphasis',
+      u'strong (translation required)': 'strong',
+      u'literal (translation required)': 'literal',
+      u'named-reference (translation required)': 'named-reference',
+      u'anonymous-reference (translation required)': 'anonymous-reference',
+      u'footnote-reference (translation required)': 'footnote-reference',
+      u'citation-reference (translation required)': 'citation-reference',
+      u'substitution-reference (translation required)': 'substitution-reference',
+      u'target (translation required)': 'target',
+      u'uri-reference (translation required)': 'uri-reference',
+      u'raw (translation required)': 'raw',}
+"""Mapping of Slovak role names to canonical role names for interpreted text.
+"""
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/languages/ca.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/languages/ca.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/languages/ca.py (revision 3)
@@ -0,0 +1,123 @@
+# Author: Ivan Vilata i Balaguer
+# Contact: ivan@selidor.net
+# Revision: $Revision: 4229 $
+# Date: $Date: 2005-12-23 00:46:16 +0100 (Fri, 23 Dec 2005) $
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Catalan-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      # language-dependent: fixed
+      u'atenci\u00F3': 'attention',
+      u'compte': 'caution',
+      u'perill': 'danger',
+      u'error': 'error',
+      u'suggeriment': 'hint',
+      u'important': 'important',
+      u'nota': 'note',
+      u'consell': 'tip',
+      u'av\u00EDs': 'warning',
+      u'advertiment': 'admonition',
+      u'nota-al-marge': 'sidebar',
+      u'nota-marge': 'sidebar',
+      u'tema': 'topic',
+      u'bloc-de-l\u00EDnies': 'line-block',
+      u'bloc-l\u00EDnies': 'line-block',
+      u'literal-analitzat': 'parsed-literal',
+      u'r\u00FAbrica': 'rubric',
+      u'ep\u00EDgraf': 'epigraph',
+      u'sumari': 'highlights',
+      u'cita-destacada': 'pull-quote',
+      u'compost': 'compound',
+      u'container (translation required)': 'container',
+      #'questions': 'questions',
+      u'taula': 'table',
+      u'taula-csv': 'csv-table',
+      u'taula-llista': 'list-table',
+      #'qa': 'questions',
+      #'faq': 'questions',
+      u'meta': 'meta',
+      #'imagemap': 'imagemap',
+      u'imatge': 'image',
+      u'figura': 'figure',
+      u'inclou': 'include',
+      u'incloure': 'include',
+      u'cru': 'raw',
+      u'reempla\u00E7a': 'replace',
+      u'reempla\u00E7ar': 'replace',
+      u'unicode': 'unicode',
+      u'data': 'date',
+      u'classe': 'class',
+      u'rol': 'role',
+      u'default-role (translation required)': 'default-role',
+      u'title (translation required)': 'title',
+      u'contingut': 'contents',
+      u'numsec': 'sectnum',
+      u'numeraci\u00F3-de-seccions': 'sectnum',
+      u'numeraci\u00F3-seccions': 'sectnum',
+      u'cap\u00E7alera': 'header',
+      u'peu-de-p\u00E0gina': 'footer',
+      u'peu-p\u00E0gina': 'footer',
+      #'footnotes': 'footnotes',
+      #'citations': 'citations',
+      u'notes-amb-destinacions': 'target-notes',
+      u'notes-destinacions': 'target-notes',
+      u'directiva-de-prova-de-restructuredtext': 'restructuredtext-test-directive'}
+"""Catalan name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+    # language-dependent: fixed
+    u'abreviatura': 'abbreviation',
+    u'abreviaci\u00F3': 'abbreviation',
+    u'abrev': 'abbreviation',
+    u'ab': 'abbreviation',
+    u'acr\u00F2nim': 'acronym',
+    u'ac': 'acronym',
+    u'\u00EDndex': 'index',
+    u'i': 'index',
+    u'sub\u00EDndex': 'subscript',
+    u'sub': 'subscript',
+    u'super\u00EDndex': 'superscript',
+    u'sup': 'superscript',
+    u'refer\u00E8ncia-a-t\u00EDtol': 'title-reference',
+    u'refer\u00E8ncia-t\u00EDtol': 'title-reference',
+    u't\u00EDtol': 'title-reference',
+    u't': 'title-reference',
+    u'refer\u00E8ncia-a-pep': 'pep-reference',
+    u'refer\u00E8ncia-pep': 'pep-reference',
+    u'pep': 'pep-reference',
+    u'refer\u00E8ncia-a-rfc': 'rfc-reference',
+    u'refer\u00E8ncia-rfc': 'rfc-reference',
+    u'rfc': 'rfc-reference',
+    u'\u00E8mfasi': 'emphasis',
+    u'destacat': 'strong',
+    u'literal': 'literal',
+    u'refer\u00E8ncia-amb-nom': 'named-reference',
+    u'refer\u00E8ncia-nom': 'named-reference',
+    u'refer\u00E8ncia-an\u00F2nima': 'anonymous-reference',
+    u'refer\u00E8ncia-a-nota-al-peu': 'footnote-reference',
+    u'refer\u00E8ncia-nota-al-peu': 'footnote-reference',
+    u'refer\u00E8ncia-a-cita': 'citation-reference',
+    u'refer\u00E8ncia-cita': 'citation-reference',
+    u'refer\u00E8ncia-a-substituci\u00F3': 'substitution-reference',
+    u'refer\u00E8ncia-substituci\u00F3': 'substitution-reference',
+    u'destinaci\u00F3': 'target',
+    u'refer\u00E8ncia-a-uri': 'uri-reference',
+    u'refer\u00E8ncia-uri': 'uri-reference',
+    u'uri': 'uri-reference',
+    u'url': 'uri-reference',
+    u'cru': 'raw',}
+"""Mapping of Catalan role names to canonical role names for interpreted text.
+"""
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/languages/ru.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/languages/ru.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/languages/ru.py (revision 3)
@@ -0,0 +1,105 @@
+# Author: Roman Suzi
+# Contact: rnd@onego.ru
+# Revision: $Revision: 4229 $
+# Date: $Date: 2005-12-23 00:46:16 +0100 (Fri, 23 Dec 2005) $
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Russian-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+directives = {
+ u'\u0431\u043b\u043e\u043a-\u0441\u0442\u0440\u043e\u043a': u'line-block',
+ u'meta': u'meta',
+ u'\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0439-\u043b\u0438\u0442\u0435\u0440\u0430\u043b':
+ u'parsed-literal',
+ u'\u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u0430\u044f-\u0446\u0438\u0442\u0430\u0442\u0430':
+ u'pull-quote',
+ u'compound (translation required)': 'compound',
+ u'container (translation required)': 'container',
+ u'table (translation required)': 'table',
+ u'csv-table (translation required)': 'csv-table',
+ u'list-table (translation required)': 'list-table',
+ u'\u0441\u044b\u0440\u043e\u0439': u'raw',
+ u'\u0437\u0430\u043c\u0435\u043d\u0430': u'replace',
+ u'\u0442\u0435\u0441\u0442\u043e\u0432\u0430\u044f-\u0434\u0438\u0440\u0435\u043a\u0442\u0438\u0432\u0430-restructuredtext':
+ u'restructuredtext-test-directive',
+ u'\u0446\u0435\u043b\u0435\u0432\u044b\u0435-\u0441\u043d\u043e\u0441\u043a\u0438': 
+ u'target-notes',
+ u'unicode': u'unicode',
+ u'\u0434\u0430\u0442\u0430': u'date',
+ u'\u0431\u043e\u043a\u043e\u0432\u0430\u044f-\u043f\u043e\u043b\u043e\u0441\u0430':
+ u'sidebar',
+ u'\u0432\u0430\u0436\u043d\u043e': u'important',
+ u'\u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c': u'include',
+ u'\u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435': u'attention',
+ u'\u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435': u'highlights',
+ u'\u0437\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0435': u'admonition',
+ u'\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435':
+ u'image',
+ u'\u043a\u043b\u0430\u0441\u0441': u'class',
+ u'role (translation required)': 'role',
+ u'default-role (translation required)': 'default-role',
+ u'title (translation required)': 'title',
+ u'\u043d\u043e\u043c\u0435\u0440-\u0440\u0430\u0437\u0434\u0435\u043b\u0430':
+ u'sectnum',
+ u'\u043d\u0443\u043c\u0435\u0440\u0430\u0446\u0438\u044f-\u0440\u0430\u0437'
+ u'\u0434\u0435\u043b\u043e\u0432': u'sectnum',
+ u'\u043e\u043f\u0430\u0441\u043d\u043e': u'danger',
+ u'\u043e\u0441\u0442\u043e\u0440\u043e\u0436\u043d\u043e': u'caution',
+ u'\u043e\u0448\u0438\u0431\u043a\u0430': u'error',
+ u'\u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430': u'tip',
+ u'\u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d'
+ u'\u0438\u0435': u'warning',
+ u'\u043f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435': u'note',
+ u'\u0440\u0438\u0441\u0443\u043d\u043e\u043a': u'figure',
+ u'\u0440\u0443\u0431\u0440\u0438\u043a\u0430': u'rubric',
+ u'\u0441\u043e\u0432\u0435\u0442': u'hint',
+ u'\u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435': u'contents',
+ u'\u0442\u0435\u043c\u0430': u'topic',
+ u'\u044d\u043f\u0438\u0433\u0440\u0430\u0444': u'epigraph',
+ u'header (translation required)': 'header',
+ u'footer (translation required)': 'footer',}
+"""Russian name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+ u'\u0430\u043a\u0440\u043e\u043d\u0438\u043c': 'acronym',
+ u'\u0430\u043d\u043e\u043d\u0438\u043c\u043d\u0430\u044f-\u0441\u0441\u044b\u043b\u043a\u0430':
+  'anonymous-reference',
+ u'\u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e': 'literal',
+ u'\u0432\u0435\u0440\u0445\u043d\u0438\u0439-\u0438\u043d\u0434\u0435\u043a\u0441':
+  'superscript',
+ u'\u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435': 'emphasis',
+ u'\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043d\u0430\u044f-\u0441\u0441\u044b\u043b\u043a\u0430':
+  'named-reference',
+ u'\u0438\u043d\u0434\u0435\u043a\u0441': 'index',
+ u'\u043d\u0438\u0436\u043d\u0438\u0439-\u0438\u043d\u0434\u0435\u043a\u0441':
+  'subscript',
+ u'\u0441\u0438\u043b\u044c\u043d\u043e\u0435-\u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435':
+  'strong',
+ u'\u0441\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u0438\u0435':
+  'abbreviation',
+ u'\u0441\u0441\u044b\u043b\u043a\u0430-\u0437\u0430\u043c\u0435\u043d\u0430':
+  'substitution-reference',
+ u'\u0441\u0441\u044b\u043b\u043a\u0430-\u043d\u0430-pep': 'pep-reference',
+ u'\u0441\u0441\u044b\u043b\u043a\u0430-\u043d\u0430-rfc': 'rfc-reference',
+ u'\u0441\u0441\u044b\u043b\u043a\u0430-\u043d\u0430-uri': 'uri-reference',
+ u'\u0441\u0441\u044b\u043b\u043a\u0430-\u043d\u0430-\u0437\u0430\u0433\u043b\u0430\u0432\u0438\u0435':
+  'title-reference',
+ u'\u0441\u0441\u044b\u043b\u043a\u0430-\u043d\u0430-\u0441\u043d\u043e\u0441\u043a\u0443':
+  'footnote-reference',
+ u'\u0446\u0438\u0442\u0430\u0442\u043d\u0430\u044f-\u0441\u0441\u044b\u043b\u043a\u0430':
+  'citation-reference',
+ u'\u0446\u0435\u043b\u044c': 'target',
+ u'raw (translation required)': 'raw',}
+"""Mapping of Russian role names to canonical role names for interpreted text.
+"""
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/languages/af.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/languages/af.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/languages/af.py (revision 3)
@@ -0,0 +1,104 @@
+# Author: Jannie Hofmeyr
+# Contact: jhsh@sun.ac.za
+# Revision: $Revision: 4229 $
+# Date: $Date: 2005-12-23 00:46:16 +0100 (Fri, 23 Dec 2005) $
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Afrikaans-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+      'aandag': 'attention',
+      'versigtig': 'caution',
+      'gevaar': 'danger',
+      'fout': 'error',
+      'wenk': 'hint',
+      'belangrik': 'important',
+      'nota': 'note',
+      'tip': 'tip', # hint and tip both have the same translation: wenk
+      'waarskuwing': 'warning',
+      'vermaning': 'admonition',
+      'kantstreep': 'sidebar',
+      'onderwerp': 'topic',
+      'lynblok': 'line-block',
+      'parsed-literal (translation required)': 'parsed-literal',
+      'rubriek': 'rubric',
+      'epigraaf': 'epigraph',
+      'hoogtepunte': 'highlights',
+      'pull-quote (translation required)': 'pull-quote',
+      u'compound (translation required)': 'compound',
+      u'container (translation required)': 'container',
+      #'vrae': 'questions',
+      #'qa': 'questions',
+      #'faq': 'questions',
+      'table (translation required)': 'table',
+      'csv-table (translation required)': 'csv-table',
+      'list-table (translation required)': 'list-table',
+      'meta': 'meta',
+      #'beeldkaart': 'imagemap',
+      'beeld': 'image',
+      'figuur': 'figure',
+      'insluiting': 'include',
+      'rou': 'raw',
+      'vervang': 'replace',
+      'unicode': 'unicode', # should this be translated? unikode
+      'datum': 'date',
+      'klas': 'class',
+      'role (translation required)': 'role',
+      'default-role (translation required)': 'default-role',
+      'title (translation required)': 'title',
+      'inhoud': 'contents',
+      'sectnum': 'sectnum',
+      'section-numbering': 'sectnum',
+      u'header (translation required)': 'header',
+      u'footer (translation required)': 'footer',
+      #'voetnote': 'footnotes',
+      #'aanhalings': 'citations',
+      'teikennotas': 'target-notes',
+      'restructuredtext-test-directive': 'restructuredtext-test-directive'}
+"""Afrikaans name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+    'afkorting': 'abbreviation',
+    'ab': 'abbreviation',
+    'akroniem': 'acronym',
+    'ac': 'acronym',
+    'indeks': 'index',
+    'i': 'index',
+    'voetskrif': 'subscript',
+    'sub': 'subscript',
+    'boskrif': 'superscript',
+    'sup': 'superscript',
+    'titelverwysing': 'title-reference',
+    'titel': 'title-reference',
+    't': 'title-reference',
+    'pep-verwysing': 'pep-reference',
+    'pep': 'pep-reference',
+    'rfc-verwysing': 'rfc-reference',
+    'rfc': 'rfc-reference',
+    'nadruk': 'emphasis',
+    'sterk': 'strong',
+    'literal (translation required)': 'literal',
+    'benoemde verwysing': 'named-reference',
+    'anonieme verwysing': 'anonymous-reference',
+    'voetnootverwysing': 'footnote-reference',
+    'aanhalingverwysing': 'citation-reference',
+    'vervangingsverwysing': 'substitution-reference',
+    'teiken': 'target',
+    'uri-verwysing': 'uri-reference',
+    'uri': 'uri-reference',
+    'url': 'uri-reference',
+    'rou': 'raw',}
+"""Mapping of Afrikaans role names to canonical role names for interpreted text.
+"""
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/states.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/states.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/states.py (revision 3)
@@ -0,0 +1,2948 @@
+# Author: David Goodger
+# Contact: goodger@users.sourceforge.net
+# Revision: $Revision: 4258 $
+# Date: $Date: 2006-01-09 04:29:23 +0100 (Mon, 09 Jan 2006) $
+# Copyright: This module has been placed in the public domain.
+
+"""
+This is the ``docutils.parsers.restructuredtext.states`` module, the core of
+the reStructuredText parser.  It defines the following:
+
+:Classes:
+    - `RSTStateMachine`: reStructuredText parser's entry point.
+    - `NestedStateMachine`: recursive StateMachine.
+    - `RSTState`: reStructuredText State superclass.
+    - `Inliner`: For parsing inline markup.
+    - `Body`: Generic classifier of the first line of a block.
+    - `SpecializedBody`: Superclass for compound element members.
+    - `BulletList`: Second and subsequent bullet_list list_items
+    - `DefinitionList`: Second+ definition_list_items.
+    - `EnumeratedList`: Second+ enumerated_list list_items.
+    - `FieldList`: Second+ fields.
+    - `OptionList`: Second+ option_list_items.
+    - `RFC2822List`: Second+ RFC2822-style fields.
+    - `ExtensionOptions`: Parses directive option fields.
+    - `Explicit`: Second+ explicit markup constructs.
+    - `SubstitutionDef`: For embedded directives in substitution definitions.
+    - `Text`: Classifier of second line of a text block.
+    - `SpecializedText`: Superclass for continuation lines of Text-variants.
+    - `Definition`: Second line of potential definition_list_item.
+    - `Line`: Second line of overlined section title or transition marker.
+    - `Struct`: An auxiliary collection class.
+
+:Exception classes:
+    - `MarkupError`
+    - `ParserError`
+    - `MarkupMismatch`
+
+:Functions:
+    - `escape2null()`: Return a string, escape-backslashes converted to nulls.
+    - `unescape()`: Return a string, nulls removed or restored to backslashes.
+
+:Attributes:
+    - `state_classes`: set of State classes used with `RSTStateMachine`.
+
+Parser Overview
+===============
+
+The reStructuredText parser is implemented as a recursive state machine,
+examining its input one line at a time.  To understand how the parser works,
+please first become familiar with the `docutils.statemachine` module.  In the
+description below, references are made to classes defined in this module;
+please see the individual classes for details.
+
+Parsing proceeds as follows:
+
+1. The state machine examines each line of input, checking each of the
+   transition patterns of the state `Body`, in order, looking for a match.
+   The implicit transitions (blank lines and indentation) are checked before
+   any others.  The 'text' transition is a catch-all (matches anything).
+
+2. The method associated with the matched transition pattern is called.
+
+   A. Some transition methods are self-contained, appending elements to the
+      document tree (`Body.doctest` parses a doctest block).  The parser's
+      current line index is advanced to the end of the element, and parsing
+      continues with step 1.
+
+   B. Other transition methods trigger the creation of a nested state machine,
+      whose job is to parse a compound construct ('indent' does a block quote,
+      'bullet' does a bullet list, 'overline' does a section [first checking
+      for a valid section header], etc.).
+
+      - In the case of lists and explicit markup, a one-off state machine is
+        created and run to parse contents of the first item.
+
+      - A new state machine is created and its initial state is set to the
+        appropriate specialized state (`BulletList` in the case of the
+        'bullet' transition; see `SpecializedBody` for more detail).  This
+        state machine is run to parse the compound element (or series of
+        explicit markup elements), and returns as soon as a non-member element
+        is encountered.  For example, the `BulletList` state machine ends as
+        soon as it encounters an element which is not a list item of that
+        bullet list.  The optional omission of inter-element blank lines is
+        enabled by this nested state machine.
+
+      - The current line index is advanced to the end of the elements parsed,
+        and parsing continues with step 1.
+
+   C. The result of the 'text' transition depends on the next line of text.
+      The current state is changed to `Text`, under which the second line is
+      examined.  If the second line is:
+
+      - Indented: The element is a definition list item, and parsing proceeds
+        similarly to step 2.B, using the `DefinitionList` state.
+
+      - A line of uniform punctuation characters: The element is a section
+        header; again, parsing proceeds as in step 2.B, and `Body` is still
+        used.
+
+      - Anything else: The element is a paragraph, which is examined for
+        inline markup and appended to the parent element.  Processing
+        continues with step 1.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import sys
+import re
+import roman
+from types import TupleType
+from docutils import nodes, statemachine, utils, urischemes
+from docutils import ApplicationError, DataError
+from docutils.statemachine import StateMachineWS, StateWS
+from docutils.nodes import fully_normalize_name as normalize_name
+from docutils.nodes import whitespace_normalize_name
+from docutils.utils import escape2null, unescape, column_width
+from docutils.parsers.rst import directives, languages, tableparser, roles
+from docutils.parsers.rst.languages import en as _fallback_language_module
+
+
+class MarkupError(DataError): pass
+class UnknownInterpretedRoleError(DataError): pass
+class InterpretedRoleNotImplementedError(DataError): pass
+class ParserError(ApplicationError): pass
+class MarkupMismatch(Exception): pass
+
+
+class Struct:
+
+    """Stores data attributes for dotted-attribute access."""
+
+    def __init__(self, **keywordargs):
+        self.__dict__.update(keywordargs)
+
+
+class RSTStateMachine(StateMachineWS):
+
+    """
+    reStructuredText's master StateMachine.
+
+    The entry point to reStructuredText parsing is the `run()` method.
+    """
+
+    def run(self, input_lines, document, input_offset=0, match_titles=1,
+            inliner=None):
+        """
+        Parse `input_lines` and modify the `document` node in place.
+
+        Extend `StateMachineWS.run()`: set up parse-global data and
+        run the StateMachine.
+        """
+        self.language = languages.get_language(
+            document.settings.language_code)
+        self.match_titles = match_titles
+        if inliner is None:
+            inliner = Inliner()
+        inliner.init_customizations(document.settings)
+        self.memo = Struct(document=document,
+                           reporter=document.reporter,
+                           language=self.language,
+                           title_styles=[],
+                           section_level=0,
+                           section_bubble_up_kludge=0,
+                           inliner=inliner)
+        self.document = document
+        self.attach_observer(document.note_source)
+        self.reporter = self.memo.reporter
+        self.node = document
+        results = StateMachineWS.run(self, input_lines, input_offset,
+                                     input_source=document['source'])
+        assert results == [], 'RSTStateMachine.run() results should be empty!'
+        self.node = self.memo = None    # remove unneeded references
+
+
+class NestedStateMachine(StateMachineWS):
+
+    """
+    StateMachine run from within other StateMachine runs, to parse nested
+    document structures.
+    """
+
+    def run(self, input_lines, input_offset, memo, node, match_titles=1):
+        """
+        Parse `input_lines` and populate a `docutils.nodes.document` instance.
+
+        Extend `StateMachineWS.run()`: set up document-wide data.
+        """
+        self.match_titles = match_titles
+        self.memo = memo
+        self.document = memo.document
+        self.attach_observer(self.document.note_source)
+        self.reporter = memo.reporter
+        self.language = memo.language
+        self.node = node
+        results = StateMachineWS.run(self, input_lines, input_offset)
+        assert results == [], ('NestedStateMachine.run() results should be '
+                               'empty!')
+        return results
+
+
+class RSTState(StateWS):
+
+    """
+    reStructuredText State superclass.
+
+    Contains methods used by all State subclasses.
+    """
+
+    nested_sm = NestedStateMachine
+
+    def __init__(self, state_machine, debug=0):
+        self.nested_sm_kwargs = {'state_classes': state_classes,
+                                 'initial_state': 'Body'}
+        StateWS.__init__(self, state_machine, debug)
+
+    def runtime_init(self):
+        StateWS.runtime_init(self)
+        memo = self.state_machine.memo
+        self.memo = memo
+        self.reporter = memo.reporter
+        self.inliner = memo.inliner
+        self.document = memo.document
+        self.parent = self.state_machine.node
+
+    def goto_line(self, abs_line_offset):
+        """
+        Jump to input line `abs_line_offset`, ignoring jumps past the end.
+        """
+        try:
+            self.state_machine.goto_line(abs_line_offset)
+        except EOFError:
+            pass
+
+    def no_match(self, context, transitions):
+        """
+        Override `StateWS.no_match` to generate a system message.
+
+        This code should never be run.
+        """
+        self.reporter.severe(
+            'Internal error: no transition pattern match.  State: "%s"; '
+            'transitions: %s; context: %s; current line: %r.'
+            % (self.__class__.__name__, transitions, context,
+               self.state_machine.line),
+            line=self.state_machine.abs_line_number())
+        return context, None, []
+
+    def bof(self, context):
+        """Called at beginning of file."""
+        return [], []
+
+    def nested_parse(self, block, input_offset, node, match_titles=0,
+                     state_machine_class=None, state_machine_kwargs=None):
+        """
+        Create a new StateMachine rooted at `node` and run it over the input
+        `block`.
+        """
+        if state_machine_class is None:
+            state_machine_class = self.nested_sm
+        if state_machine_kwargs is None:
+            state_machine_kwargs = self.nested_sm_kwargs
+        block_length = len(block)
+        state_machine = state_machine_class(debug=self.debug,
+                                            **state_machine_kwargs)
+        state_machine.run(block, input_offset, memo=self.memo,
+                          node=node, match_titles=match_titles)
+        state_machine.unlink()
+        new_offset = state_machine.abs_line_offset()
+        # No `block.parent` implies disconnected -- lines aren't in sync:
+        if block.parent and (len(block) - block_length) != 0:
+            # Adjustment for block if modified in nested parse:
+            self.state_machine.next_line(len(block) - block_length)
+        return new_offset
+
+    def nested_list_parse(self, block, input_offset, node, initial_state,
+                          blank_finish,
+                          blank_finish_state=None,
+                          extra_settings={},
+                          match_titles=0,
+                          state_machine_class=None,
+                          state_machine_kwargs=None):
+        """
+        Create a new StateMachine rooted at `node` and run it over the input
+        `block`. Also keep track of optional intermediate blank lines and the
+        required final one.
+        """
+        if state_machine_class is None:
+            state_machine_class = self.nested_sm
+        if state_machine_kwargs is None:
+            state_machine_kwargs = self.nested_sm_kwargs.copy()
+        state_machine_kwargs['initial_state'] = initial_state
+        state_machine = state_machine_class(debug=self.debug,
+                                            **state_machine_kwargs)
+        if blank_finish_state is None:
+            blank_finish_state = initial_state
+        state_machine.states[blank_finish_state].blank_finish = blank_finish
+        for key, value in extra_settings.items():
+            setattr(state_machine.states[initial_state], key, value)
+        state_machine.run(block, input_offset, memo=self.memo,
+                          node=node, match_titles=match_titles)
+        blank_finish = state_machine.states[blank_finish_state].blank_finish
+        state_machine.unlink()
+        return state_machine.abs_line_offset(), blank_finish
+
+    def section(self, title, source, style, lineno, messages):
+        """Check for a valid subsection and create one if it checks out."""
+        if self.check_subsection(source, style, lineno):
+            self.new_subsection(title, lineno, messages)
+
+    def check_subsection(self, source, style, lineno):
+        """
+        Check for a valid subsection header.  Return 1 (true) or None (false).
+
+        When a new section is reached that isn't a subsection of the current
+        section, back up the line count (use ``previous_line(-x)``), then
+        ``raise EOFError``.  The current StateMachine will finish, then the
+        calling StateMachine can re-examine the title.  This will work its way
+        back up the calling chain until the correct section level isreached.
+
+        @@@ Alternative: Evaluate the title, store the title info & level, and
+        back up the chain until that level is reached.  Store in memo? Or
+        return in results?
+
+        :Exception: `EOFError` when a sibling or supersection encountered.
+        """
+        memo = self.memo
+        title_styles = memo.title_styles
+        mylevel = memo.section_level
+        try:                            # check for existing title style
+            level = title_styles.index(style) + 1
+        except ValueError:              # new title style
+            if len(title_styles) == memo.section_level: # new subsection
+                title_styles.append(style)
+                return 1
+            else:                       # not at lowest level
+                self.parent += self.title_inconsistent(source, lineno)
+                return None
+        if level <= mylevel:            # sibling or supersection
+            memo.section_level = level   # bubble up to parent section
+            if len(style) == 2:
+                memo.section_bubble_up_kludge = 1
+            # back up 2 lines for underline title, 3 for overline title
+            self.state_machine.previous_line(len(style) + 1)
+            raise EOFError              # let parent section re-evaluate
+        if level == mylevel + 1:        # immediate subsection
+            return 1
+        else:                           # invalid subsection
+            self.parent += self.title_inconsistent(source, lineno)
+            return None
+
+    def title_inconsistent(self, sourcetext, lineno):
+        error = self.reporter.severe(
+            'Title level inconsistent:', nodes.literal_block('', sourcetext),
+            line=lineno)
+        return error
+
+    def new_subsection(self, title, lineno, messages):
+        """Append new subsection to document tree. On return, check level."""
+        memo = self.memo
+        mylevel = memo.section_level
+        memo.section_level += 1
+        section_node = nodes.section()
+        self.parent += section_node
+        textnodes, title_messages = self.inline_text(title, lineno)
+        titlenode = nodes.title(title, '', *textnodes)
+        name = normalize_name(titlenode.astext())
+        section_node['names'].append(name)
+        section_node += titlenode
+        section_node += messages
+        section_node += title_messages
+        self.document.note_implicit_target(section_node, section_node)
+        offset = self.state_machine.line_offset + 1
+        absoffset = self.state_machine.abs_line_offset() + 1
+        newabsoffset = self.nested_parse(
+              self.state_machine.input_lines[offset:], input_offset=absoffset,
+              node=section_node, match_titles=1)
+        self.goto_line(newabsoffset)
+        if memo.section_level <= mylevel: # can't handle next section?
+            raise EOFError              # bubble up to supersection
+        # reset section_level; next pass will detect it properly
+        memo.section_level = mylevel
+
+    def paragraph(self, lines, lineno):
+        """
+        Return a list (paragraph & messages) & a boolean: literal_block next?
+        """
+        data = '\n'.join(lines).rstrip()
+        if re.search(r'(?<!\\)(\\\\)*::$', data):
+            if len(data) == 2:
+                return [], 1
+            elif data[-3] in ' \n':
+                text = data[:-3].rstrip()
+            else:
+                text = data[:-1]
+            literalnext = 1
+        else:
+            text = data
+            literalnext = 0
+        textnodes, messages = self.inline_text(text, lineno)
+        p = nodes.paragraph(data, '', *textnodes)
+        p.line = lineno
+        return [p] + messages, literalnext
+
+    def inline_text(self, text, lineno):
+        """
+        Return 2 lists: nodes (text and inline elements), and system_messages.
+        """
+        return self.inliner.parse(text, lineno, self.memo, self.parent)
+
+    def unindent_warning(self, node_name):
+        return self.reporter.warning(
+            '%s ends without a blank line; unexpected unindent.' % node_name,
+            line=(self.state_machine.abs_line_number() + 1))
+
+
+def build_regexp(definition, compile=1):
+    """
+    Build, compile and return a regular expression based on `definition`.
+
+    :Parameter: `definition`: a 4-tuple (group name, prefix, suffix, parts),
+        where "parts" is a list of regular expressions and/or regular
+        expression definitions to be joined into an or-group.
+    """
+    name, prefix, suffix, parts = definition
+    part_strings = []
+    for part in parts:
+        if type(part) is TupleType:
+            part_strings.append(build_regexp(part, None))
+        else:
+            part_strings.append(part)
+    or_group = '|'.join(part_strings)
+    regexp = '%(prefix)s(?P<%(name)s>%(or_group)s)%(suffix)s' % locals()
+    if compile:
+        return re.compile(regexp, re.UNICODE)
+    else:
+        return regexp
+
+
+class Inliner:
+
+    """
+    Parse inline markup; call the `parse()` method.
+    """
+
+    def __init__(self):
+        self.implicit_dispatch = [(self.patterns.uri, self.standalone_uri),]
+        """List of (pattern, bound method) tuples, used by
+        `self.implicit_inline`."""
+
+    def init_customizations(self, settings):
+        """Setting-based customizations; run when parsing begins."""
+        if settings.pep_references:
+            self.implicit_dispatch.append((self.patterns.pep,
+                                           self.pep_reference))
+        if settings.rfc_references:
+            self.implicit_dispatch.append((self.patterns.rfc,
+                                           self.rfc_reference))
+
+    def parse(self, text, lineno, memo, parent):
+        # Needs to be refactored for nested inline markup.
+        # Add nested_parse() method?
+        """
+        Return 2 lists: nodes (text and inline elements), and system_messages.
+
+        Using `self.patterns.initial`, a pattern which matches start-strings
+        (emphasis, strong, interpreted, phrase reference, literal,
+        substitution reference, and inline target) and complete constructs
+        (simple reference, footnote reference), search for a candidate.  When
+        one is found, check for validity (e.g., not a quoted '*' character).
+        If valid, search for the corresponding end string if applicable, and
+        check it for validity.  If not found or invalid, generate a warning
+        and ignore the start-string.  Implicit inline markup (e.g. standalone
+        URIs) is found last.
+        """
+        self.reporter = memo.reporter
+        self.document = memo.document
+        self.language = memo.language
+        self.parent = parent
+        pattern_search = self.patterns.initial.search
+        dispatch = self.dispatch
+        remaining = escape2null(text)
+        processed = []
+        unprocessed = []
+        messages = []
+        while remaining:
+            match = pattern_search(remaining)
+            if match:
+                groups = match.groupdict()
+                method = dispatch[groups['start'] or groups['backquote']
+                                  or groups['refend'] or groups['fnend']]
+                before, inlines, remaining, sysmessages = method(self, match,
+                                                                 lineno)
+                unprocessed.append(before)
+                messages += sysmessages
+                if inlines:
+                    processed += self.implicit_inline(''.join(unprocessed),
+                                                      lineno)
+                    processed += inlines
+                    unprocessed = []
+            else:
+                break
+        remaining = ''.join(unprocessed) + remaining
+        if remaining:
+            processed += self.implicit_inline(remaining, lineno)
+        return processed, messages
+
+    openers = '\'"([{<'
+    closers = '\'")]}>'
+    start_string_prefix = (r'((?<=^)|(?<=[-/: \n%s]))' % re.escape(openers))
+    end_string_suffix = (r'((?=$)|(?=[-/:.,;!? \n\x00%s]))'
+                         % re.escape(closers))
+    non_whitespace_before = r'(?<![ \n])'
+    non_whitespace_escape_before = r'(?<![ \n\x00])'
+    non_whitespace_after = r'(?![ \n])'
+    # Alphanumerics with isolated internal [-._] chars (i.e. not 2 together):
+    simplename = r'(?:(?!_)\w)+(?:[-._](?:(?!_)\w)+)*'
+    # Valid URI characters (see RFC 2396 & RFC 2732);
+    # final \x00 allows backslash escapes in URIs:
+    uric = r"""[-_.!~*'()[\];/:@&=+$,%a-zA-Z0-9\x00]"""
+    # Delimiter indicating the end of a URI (not part of the URI):
+    uri_end_delim = r"""[>]"""
+    # Last URI character; same as uric but no punctuation:
+    urilast = r"""[_~*/=+a-zA-Z0-9]"""
+    # End of a URI (either 'urilast' or 'uric followed by a
+    # uri_end_delim'):
+    uri_end = r"""(?:%(urilast)s|%(uric)s(?=%(uri_end_delim)s))""" % locals()
+    emailc = r"""[-_!~*'{|}/#?^`&=+$%a-zA-Z0-9\x00]"""
+    email_pattern = r"""
+          %(emailc)s+(?:\.%(emailc)s+)*   # name
+          (?<!\x00)@                      # at
+          %(emailc)s+(?:\.%(emailc)s*)*   # host
+          %(uri_end)s                     # final URI char
+          """
+    parts = ('initial_inline', start_string_prefix, '',
+             [('start', '', non_whitespace_after,  # simple start-strings
+               [r'\*\*',                # strong
+                r'\*(?!\*)',            # emphasis but not strong
+                r'``',                  # literal
+                r'_`',                  # inline internal target
+                r'\|(?!\|)']            # substitution reference
+               ),
+              ('whole', '', end_string_suffix, # whole constructs
+               [# reference name & end-string
+                r'(?P<refname>%s)(?P<refend>__?)' % simplename,
+                ('footnotelabel', r'\[', r'(?P<fnend>\]_)',
+                 [r'[0-9]+',               # manually numbered
+                  r'\#(%s)?' % simplename, # auto-numbered (w/ label?)
+                  r'\*',                   # auto-symbol
+                  r'(?P<citationlabel>%s)' % simplename] # citation reference
+                 )
+                ]
+               ),
+              ('backquote',             # interpreted text or phrase reference
+               '(?P<role>(:%s:)?)' % simplename, # optional role
+               non_whitespace_after,
+               ['`(?!`)']               # but not literal
+               )
+              ]
+             )
+    patterns = Struct(
+          initial=build_regexp(parts),
+          emphasis=re.compile(non_whitespace_escape_before
+                              + r'(\*)' + end_string_suffix),
+          strong=re.compile(non_whitespace_escape_before
+                            + r'(\*\*)' + end_string_suffix),
+          interpreted_or_phrase_ref=re.compile(
+              r"""
+              %(non_whitespace_escape_before)s
+              (
+                `
+                (?P<suffix>
+                  (?P<role>:%(simplename)s:)?
+                  (?P<refend>__?)?
+                )
+              )
+              %(end_string_suffix)s
+              """ % locals(), re.VERBOSE | re.UNICODE),
+          embedded_uri=re.compile(
+              r"""
+              (
+                (?:[ \n]+|^)            # spaces or beginning of line/string
+                <                       # open bracket
+                %(non_whitespace_after)s
+                ([^<>\x00]+)            # anything but angle brackets & nulls
+                %(non_whitespace_before)s
+                >                       # close bracket w/o whitespace before
+              )
+              $                         # end of string
+              """ % locals(), re.VERBOSE),
+          literal=re.compile(non_whitespace_before + '(``)'
+                             + end_string_suffix),
+          target=re.compile(non_whitespace_escape_before
+                            + r'(`)' + end_string_suffix),
+          substitution_ref=re.compile(non_whitespace_escape_before
+                                      + r'(\|_{0,2})'
+                                      + end_string_suffix),
+          email=re.compile(email_pattern % locals() + '$', re.VERBOSE),
+          uri=re.compile(
+                (r"""
+                %(start_string_prefix)s
+                (?P<whole>
+                  (?P<absolute>           # absolute URI
+                    (?P<scheme>             # scheme (http, ftp, mailto)
+                      [a-zA-Z][a-zA-Z0-9.+-]*
+                    )
+                    :
+                    (
+                      (                       # either:
+                        (//?)?                  # hierarchical URI
+                        %(uric)s*               # URI characters
+                        %(uri_end)s             # final URI char
+                      )
+                      (                       # optional query
+                        \?%(uric)s*
+                        %(uri_end)s
+                      )?
+                      (                       # optional fragment
+                        \#%(uric)s*
+                        %(uri_end)s
+                      )?
+                    )
+                  )
+                |                       # *OR*
+                  (?P<email>              # email address
+                    """ + email_pattern + r"""
+                  )
+                )
+                %(end_string_suffix)s
+                """) % locals(), re.VERBOSE),
+          pep=re.compile(
+                r"""
+                %(start_string_prefix)s
+                (
+                  (pep-(?P<pepnum1>\d+)(.txt)?) # reference to source file
+                |
+                  (PEP\s+(?P<pepnum2>\d+))      # reference by name
+                )
+                %(end_string_suffix)s""" % locals(), re.VERBOSE),
+          rfc=re.compile(
+                r"""
+                %(start_string_prefix)s
+                (RFC(-|\s+)?(?P<rfcnum>\d+))
+                %(end_string_suffix)s""" % locals(), re.VERBOSE))
+
+    def quoted_start(self, match):
+        """Return 1 if inline markup start-string is 'quoted', 0 if not."""
+        string = match.string
+        start = match.start()
+        end = match.end()
+        if start == 0:                  # start-string at beginning of text
+            return 0
+        prestart = string[start - 1]
+        try:
+            poststart = string[end]
+            if self.openers.index(prestart) \
+                  == self.closers.index(poststart):   # quoted
+                return 1
+        except IndexError:              # start-string at end of text
+            return 1
+        except ValueError:              # not quoted
+            pass
+        return 0
+
+    def inline_obj(self, match, lineno, end_pattern, nodeclass,
+                   restore_backslashes=0):
+        string = match.string
+        matchstart = match.start('start')
+        matchend = match.end('start')
+        if self.quoted_start(match):
+            return (string[:matchend], [], string[matchend:], [], '')
+        endmatch = end_pattern.search(string[matchend:])
+        if endmatch and endmatch.start(1):  # 1 or more chars
+            text = unescape(endmatch.string[:endmatch.start(1)],
+                            restore_backslashes)
+            textend = matchend + endmatch.end(1)
+            rawsource = unescape(string[matchstart:textend], 1)
+            return (string[:matchstart], [nodeclass(rawsource, text)],
+                    string[textend:], [], endmatch.group(1))
+        msg = self.reporter.warning(
+              'Inline %s start-string without end-string.'
+              % nodeclass.__name__, line=lineno)
+        text = unescape(string[matchstart:matchend], 1)
+        rawsource = unescape(string[matchstart:matchend], 1)
+        prb = self.problematic(text, rawsource, msg)
+        return string[:matchstart], [prb], string[matchend:], [msg], ''
+
+    def problematic(self, text, rawsource, message):
+        msgid = self.document.set_id(message, self.parent)
+        problematic = nodes.problematic(rawsource, text, refid=msgid)
+        prbid = self.document.set_id(problematic)
+        message.add_backref(prbid)
+        return problematic
+
+    def emphasis(self, match, lineno):
+        before, inlines, remaining, sysmessages, endstring = self.inline_obj(
+              match, lineno, self.patterns.emphasis, nodes.emphasis)
+        return before, inlines, remaining, sysmessages
+
+    def strong(self, match, lineno):
+        before, inlines, remaining, sysmessages, endstring = self.inline_obj(
+              match, lineno, self.patterns.strong, nodes.strong)
+        return before, inlines, remaining, sysmessages
+
+    def interpreted_or_phrase_ref(self, match, lineno):
+        end_pattern = self.patterns.interpreted_or_phrase_ref
+        string = match.string
+        matchstart = match.start('backquote')
+        matchend = match.end('backquote')
+        rolestart = match.start('role')
+        role = match.group('role')
+        position = ''
+        if role:
+            role = role[1:-1]
+            position = 'prefix'
+        elif self.quoted_start(match):
+            return (string[:matchend], [], string[matchend:], [])
+        endmatch = end_pattern.search(string[matchend:])
+        if endmatch and endmatch.start(1):  # 1 or more chars
+            textend = matchend + endmatch.end()
+            if endmatch.group('role'):
+                if role:
+                    msg = self.reporter.warning(
+                        'Multiple roles in interpreted text (both '
+                        'prefix and suffix present; only one allowed).',
+                        line=lineno)
+                    text = unescape(string[rolestart:textend], 1)
+                    prb = self.problematic(text, text, msg)
+                    return string[:rolestart], [prb], string[textend:], [msg]
+                role = endmatch.group('suffix')[1:-1]
+                position = 'suffix'
+            escaped = endmatch.string[:endmatch.start(1)]
+            rawsource = unescape(string[matchstart:textend], 1)
+            if rawsource[-1:] == '_':
+                if role:
+                    msg = self.reporter.warning(
+                          'Mismatch: both interpreted text role %s and '
+                          'reference suffix.' % position, line=lineno)
+                    text = unescape(string[rolestart:textend], 1)
+                    prb = self.problematic(text, text, msg)
+                    return string[:rolestart], [prb], string[textend:], [msg]
+                return self.phrase_ref(string[:matchstart], string[textend:],
+                                       rawsource, escaped, unescape(escaped))
+            else:
+                rawsource = unescape(string[rolestart:textend], 1)
+                nodelist, messages = self.interpreted(rawsource, escaped, role,
+                                                      lineno)
+                return (string[:rolestart], nodelist,
+                        string[textend:], messages)
+        msg = self.reporter.warning(
+              'Inline interpreted text or phrase reference start-string '
+              'without end-string.', line=lineno)
+        text = unescape(string[matchstart:matchend], 1)
+        prb = self.problematic(text, text, msg)
+        return string[:matchstart], [prb], string[matchend:], [msg]
+
+    def phrase_ref(self, before, after, rawsource, escaped, text):
+        match = self.patterns.embedded_uri.search(escaped)
+        if match:
+            text = unescape(escaped[:match.start(0)])
+            uri_text = match.group(2)
+            uri = ''.join(uri_text.split())
+            uri = self.adjust_uri(uri)
+            if uri:
+                target = nodes.target(match.group(1), refuri=uri)
+            else:
+                raise ApplicationError('problem with URI: %r' % uri_text)
+            if not text:
+                text = uri
+        else:
+            target = None
+        refname = normalize_name(text)
+        reference = nodes.reference(rawsource, text,
+                                    name=whitespace_normalize_name(text))
+        node_list = [reference]
+        if rawsource[-2:] == '__':
+            if target:
+                reference['refuri'] = uri
+            else:
+                reference['anonymous'] = 1
+        else:
+            if target:
+                reference['refuri'] = uri
+                target['names'].append(refname)
+                self.document.note_explicit_target(target, self.parent)
+                node_list.append(target)
+            else:
+                reference['refname'] = refname
+                self.document.note_refname(reference)
+        return before, node_list, after, []
+
+    def adjust_uri(self, uri):
+        match = self.patterns.email.match(uri)
+        if match:
+            return 'mailto:' + uri
+        else:
+            return uri
+
+    def interpreted(self, rawsource, text, role, lineno):
+        role_fn, messages = roles.role(role, self.language, lineno,
+                                       self.reporter)
+        if role_fn:
+            nodes, messages2 = role_fn(role, rawsource, text, lineno, self)
+            return nodes, messages + messages2
+        else:
+            msg = self.reporter.error(
+                'Unknown interpreted text role "%s".' % role,
+                line=lineno)
+            return ([self.problematic(rawsource, rawsource, msg)],
+                    messages + [msg])
+
+    def literal(self, match, lineno):
+        before, inlines, remaining, sysmessages, endstring = self.inline_obj(
+              match, lineno, self.patterns.literal, nodes.literal,
+              restore_backslashes=1)
+        return before, inlines, remaining, sysmessages
+
+    def inline_internal_target(self, match, lineno):
+        before, inlines, remaining, sysmessages, endstring = self.inline_obj(
+              match, lineno, self.patterns.target, nodes.target)
+        if inlines and isinstance(inlines[0], nodes.target):
+            assert len(inlines) == 1
+            target = inlines[0]
+            name = normalize_name(target.astext())
+            target['names'].append(name)
+            self.document.note_explicit_target(target, self.parent)
+        return before, inlines, remaining, sysmessages
+
+    def substitution_reference(self, match, lineno):
+        before, inlines, remaining, sysmessages, endstring = self.inline_obj(
+              match, lineno, self.patterns.substitution_ref,
+              nodes.substitution_reference)
+        if len(inlines) == 1:
+            subref_node = inlines[0]
+            if isinstance(subref_node, nodes.substitution_reference):
+                subref_text = subref_node.astext()
+                self.document.note_substitution_ref(subref_node, subref_text)
+                if endstring[-1:] == '_':
+                    reference_node = nodes.reference(
+                        '|%s%s' % (subref_text, endstring), '')
+                    if endstring[-2:] == '__':
+                        reference_node['anonymous'] = 1
+                    else:
+                        reference_node['refname'] = normalize_name(subref_text)
+                        self.document.note_refname(reference_node)
+                    reference_node += subref_node
+                    inlines = [reference_node]
+        return before, inlines, remaining, sysmessages
+
+    def footnote_reference(self, match, lineno):
+        """
+        Handles `nodes.footnote_reference` and `nodes.citation_reference`
+        elements.
+        """
+        label = match.group('footnotelabel')
+        refname = normalize_name(label)
+        string = match.string
+        before = string[:match.start('whole')]
+        remaining = string[match.end('whole'):]
+        if match.group('citationlabel'):
+            refnode = nodes.citation_reference('[%s]_' % label,
+                                               refname=refname)
+            refnode += nodes.Text(label)
+            self.document.note_citation_ref(refnode)
+        else:
+            refnode = nodes.footnote_reference('[%s]_' % label)
+            if refname[0] == '#':
+                refname = refname[1:]
+                refnode['auto'] = 1
+                self.document.note_autofootnote_ref(refnode)
+            elif refname == '*':
+                refname = ''
+                refnode['auto'] = '*'
+                self.document.note_symbol_footnote_ref(
+                      refnode)
+            else:
+                refnode += nodes.Text(label)
+            if refname:
+                refnode['refname'] = refname
+                self.document.note_footnote_ref(refnode)
+            if utils.get_trim_footnote_ref_space(self.document.settings):
+                before = before.rstrip()
+        return (before, [refnode], remaining, [])
+
+    def reference(self, match, lineno, anonymous=None):
+        referencename = match.group('refname')
+        refname = normalize_name(referencename)
+        referencenode = nodes.reference(
+            referencename + match.group('refend'), referencename,
+            name=whitespace_normalize_name(referencename))
+        if anonymous:
+            referencenode['anonymous'] = 1
+        else:
+            referencenode['refname'] = refname
+            self.document.note_refname(referencenode)
+        string = match.string
+        matchstart = match.start('whole')
+        matchend = match.end('whole')
+        return (string[:matchstart], [referencenode], string[matchend:], [])
+
+    def anonymous_reference(self, match, lineno):
+        return self.reference(match, lineno, anonymous=1)
+
+    def standalone_uri(self, match, lineno):
+        if not match.group('scheme') or urischemes.schemes.has_key(
+              match.group('scheme').lower()):
+            if match.group('email'):
+                addscheme = 'mailto:'
+            else:
+                addscheme = ''
+            text = match.group('whole')
+            unescaped = unescape(text, 0)
+            return [nodes.reference(unescape(text, 1), unescaped,
+                                    refuri=addscheme + unescaped)]
+        else:                   # not a valid scheme
+            raise MarkupMismatch
+
+    pep_url = 'pep-%04d.html'
+
+    def pep_reference(self, match, lineno):
+        text = match.group(0)
+        if text.startswith('pep-'):
+            pepnum = int(match.group('pepnum1'))
+        elif text.startswith('PEP'):
+            pepnum = int(match.group('pepnum2'))
+        else:
+            raise MarkupMismatch
+        ref = self.document.settings.pep_base_url + self.pep_url % pepnum
+        unescaped = unescape(text, 0)
+        return [nodes.reference(unescape(text, 1), unescaped, refuri=ref)]
+
+    rfc_url = 'rfc%d.html'
+
+    def rfc_reference(self, match, lineno):
+        text = match.group(0)
+        if text.startswith('RFC'):
+            rfcnum = int(match.group('rfcnum'))
+            ref = self.document.settings.rfc_base_url + self.rfc_url % rfcnum
+        else:
+            raise MarkupMismatch
+        unescaped = unescape(text, 0)
+        return [nodes.reference(unescape(text, 1), unescaped, refuri=ref)]
+
+    def implicit_inline(self, text, lineno):
+        """
+        Check each of the patterns in `self.implicit_dispatch` for a match,
+        and dispatch to the stored method for the pattern.  Recursively check
+        the text before and after the match.  Return a list of `nodes.Text`
+        and inline element nodes.
+        """
+        if not text:
+            return []
+        for pattern, method in self.implicit_dispatch:
+            match = pattern.search(text)
+            if match:
+                try:
+                    # Must recurse on strings before *and* after the match;
+                    # there may be multiple patterns.
+                    return (self.implicit_inline(text[:match.start()], lineno)
+                            + method(match, lineno) +
+                            self.implicit_inline(text[match.end():], lineno))
+                except MarkupMismatch:
+                    pass
+        return [nodes.Text(unescape(text), rawsource=unescape(text, 1))]
+
+    dispatch = {'*': emphasis,
+                '**': strong,
+                '`': interpreted_or_phrase_ref,
+                '``': literal,
+                '_`': inline_internal_target,
+                ']_': footnote_reference,
+                '|': substitution_reference,
+                '_': reference,
+                '__': anonymous_reference}
+
+
+def _loweralpha_to_int(s, _zero=(ord('a')-1)):
+    return ord(s) - _zero
+
+def _upperalpha_to_int(s, _zero=(ord('A')-1)):
+    return ord(s) - _zero
+
+def _lowerroman_to_int(s):
+    return roman.fromRoman(s.upper())
+
+
+class Body(RSTState):
+
+    """
+    Generic classifier of the first line of a block.
+    """
+
+    double_width_pad_char = tableparser.TableParser.double_width_pad_char
+    """Padding character for East Asian double-width text."""
+
+    enum = Struct()
+    """Enumerated list parsing information."""
+
+    enum.formatinfo = {
+          'parens': Struct(prefix='(', suffix=')', start=1, end=-1),
+          'rparen': Struct(prefix='', suffix=')', start=0, end=-1),
+          'period': Struct(prefix='', suffix='.', start=0, end=-1)}
+    enum.formats = enum.formatinfo.keys()
+    enum.sequences = ['arabic', 'loweralpha', 'upperalpha',
+                      'lowerroman', 'upperroman'] # ORDERED!
+    enum.sequencepats = {'arabic': '[0-9]+',
+                         'loweralpha': '[a-z]',
+                         'upperalpha': '[A-Z]',
+                         'lowerroman': '[ivxlcdm]+',
+                         'upperroman': '[IVXLCDM]+',}
+    enum.converters = {'arabic': int,
+                       'loweralpha': _loweralpha_to_int,
+                       'upperalpha': _upperalpha_to_int,
+                       'lowerroman': _lowerroman_to_int,
+                       'upperroman': roman.fromRoman}
+
+    enum.sequenceregexps = {}
+    for sequence in enum.sequences:
+        enum.sequenceregexps[sequence] = re.compile(
+              enum.sequencepats[sequence] + '$')
+
+    grid_table_top_pat = re.compile(r'\+-[-+]+-\+ *$')
+    """Matches the top (& bottom) of a full table)."""
+
+    simple_table_top_pat = re.compile('=+( +=+)+ *$')
+    """Matches the top of a simple table."""
+
+    simple_table_border_pat = re.compile('=+[ =]*$')
+    """Matches the bottom & header bottom of a simple table."""
+
+    pats = {}
+    """Fragments of patterns used by transitions."""
+
+    pats['nonalphanum7bit'] = '[!-/:-@[-`{-~]'
+    pats['alpha'] = '[a-zA-Z]'
+    pats['alphanum'] = '[a-zA-Z0-9]'
+    pats['alphanumplus'] = '[a-zA-Z0-9_-]'
+    pats['enum'] = ('(%(arabic)s|%(loweralpha)s|%(upperalpha)s|%(lowerroman)s'
+                    '|%(upperroman)s|#)' % enum.sequencepats)
+    pats['optname'] = '%(alphanum)s%(alphanumplus)s*' % pats
+    # @@@ Loosen up the pattern?  Allow Unicode?
+    pats['optarg'] = '(%(alpha)s%(alphanumplus)s*|<[^<>]+>)' % pats
+    pats['shortopt'] = r'(-|\+)%(alphanum)s( ?%(optarg)s)?' % pats
+    pats['longopt'] = r'(--|/)%(optname)s([ =]%(optarg)s)?' % pats
+    pats['option'] = r'(%(shortopt)s|%(longopt)s)' % pats
+
+    for format in enum.formats:
+        pats[format] = '(?P<%s>%s%s%s)' % (
+              format, re.escape(enum.formatinfo[format].prefix),
+              pats['enum'], re.escape(enum.formatinfo[format].suffix))
+
+    patterns = {
+          'bullet': r'[-+*]( +|$)',
+          'enumerator': r'(%(parens)s|%(rparen)s|%(period)s)( +|$)' % pats,
+          'field_marker': r':(?![: ])([^:\\]|\\.)*(?<! ):( +|$)',
+          'option_marker': r'%(option)s(, %(option)s)*(  +| ?$)' % pats,
+          'doctest': r'>>>( +|$)',
+          'line_block': r'\|( +|$)',
+          'grid_table_top': grid_table_top_pat,
+          'simple_table_top': simple_table_top_pat,
+          'explicit_markup': r'\.\.( +|$)',
+          'anonymous': r'__( +|$)',
+          'line': r'(%(nonalphanum7bit)s)\1* *$' % pats,
+          'text': r''}
+    initial_transitions = (
+          'bullet',
+          'enumerator',
+          'field_marker',
+          'option_marker',
+          'doctest',
+          'line_block',
+          'grid_table_top',
+          'simple_table_top',
+          'explicit_markup',
+          'anonymous',
+          'line',
+          'text')
+
+    def indent(self, match, context, next_state):
+        """Block quote."""
+        indented, indent, line_offset, blank_finish = \
+              self.state_machine.get_indented()
+        blockquote, messages = self.block_quote(indented, line_offset)
+        self.parent += blockquote
+        self.parent += messages
+        if not blank_finish:
+            self.parent += self.unindent_warning('Block quote')
+        return context, next_state, []
+
+    def block_quote(self, indented, line_offset):
+        blockquote_lines, attribution_lines, attribution_offset = \
+              self.check_attribution(indented, line_offset)
+        blockquote = nodes.block_quote()
+        self.nested_parse(blockquote_lines, line_offset, blockquote)
+        messages = []
+        if attribution_lines:
+            attribution, messages = self.parse_attribution(attribution_lines,
+                                                           attribution_offset)
+            blockquote += attribution
+        return blockquote, messages
+
+    # u'\u2014' is an em-dash:
+    attribution_pattern = re.compile(ur'(---?(?!-)|\u2014) *(?=[^ \n])')
+
+    def check_attribution(self, indented, line_offset):
+        """
+        Check for an attribution in the last contiguous block of `indented`.
+
+        * First line after last blank line must begin with "--" (etc.).
+        * Every line after that must have consistent indentation.
+
+        Return a 3-tuple: (block quote lines, attribution lines,
+        attribution offset).
+        """
+        #import pdb ; pdb.set_trace()
+        blank = None
+        nonblank_seen = None
+        indent = 0
+        for i in range(len(indented) - 1, 0, -1): # don't check first line
+            this_line_blank = not indented[i].strip()
+            if nonblank_seen and this_line_blank:
+                match = self.attribution_pattern.match(indented[i + 1])
+                if match:
+                    blank = i
+                break
+            elif not this_line_blank:
+                nonblank_seen = 1
+        if blank and len(indented) - blank > 2: # multi-line attribution
+            indent = (len(indented[blank + 2])
+                      - len(indented[blank + 2].lstrip()))
+            for j in range(blank + 3, len(indented)):
+                if ( indented[j]        # may be blank last line
+                     and indent != (len(indented[j])
+                                    - len(indented[j].lstrip()))):
+                    # bad shape
+                    blank = None
+                    break
+        if blank:
+            a_lines = indented[blank + 1:]
+            a_lines.trim_left(match.end(), end=1)
+            a_lines.trim_left(indent, start=1)
+            return (indented[:blank], a_lines, line_offset + blank + 1)
+        else:
+            return (indented, None, None)
+
+    def parse_attribution(self, indented, line_offset):
+        text = '\n'.join(indented).rstrip()
+        lineno = self.state_machine.abs_line_number() + line_offset
+        textnodes, messages = self.inline_text(text, lineno)
+        node = nodes.attribution(text, '', *textnodes)
+        node.line = lineno
+        return node, messages
+
+    def bullet(self, match, context, next_state):
+        """Bullet list item."""
+        bulletlist = nodes.bullet_list()
+        self.parent += bulletlist
+        bulletlist['bullet'] = match.string[0]
+        i, blank_finish = self.list_item(match.end())
+        bulletlist += i
+        offset = self.state_machine.line_offset + 1   # next line
+        new_line_offset, blank_finish = self.nested_list_parse(
+              self.state_machine.input_lines[offset:],
+              input_offset=self.state_machine.abs_line_offset() + 1,
+              node=bulletlist, initial_state='BulletList',
+              blank_finish=blank_finish)
+        self.goto_line(new_line_offset)
+        if not blank_finish:
+            self.parent += self.unindent_warning('Bullet list')
+        return [], next_state, []
+
+    def list_item(self, indent):
+        if self.state_machine.line[indent:]:
+            indented, line_offset, blank_finish = (
+                self.state_machine.get_known_indented(indent))
+        else:
+            indented, indent, line_offset, blank_finish = (
+                self.state_machine.get_first_known_indented(indent))
+        listitem = nodes.list_item('\n'.join(indented))
+        if indented:
+            self.nested_parse(indented, input_offset=line_offset,
+                              node=listitem)
+        return listitem, blank_finish
+
+    def enumerator(self, match, context, next_state):
+        """Enumerated List Item"""
+        format, sequence, text, ordinal = self.parse_enumerator(match)
+        if not self.is_enumerated_list_item(ordinal, sequence, format):
+            raise statemachine.TransitionCorrection('text')
+        enumlist = nodes.enumerated_list()
+        self.parent += enumlist
+        if sequence == '#':
+            enumlist['enumtype'] = 'arabic'
+        else:
+            enumlist['enumtype'] = sequence
+        enumlist['prefix'] = self.enum.formatinfo[format].prefix
+        enumlist['suffix'] = self.enum.formatinfo[format].suffix
+        if ordinal != 1:
+            enumlist['start'] = ordinal
+            msg = self.reporter.info(
+                'Enumerated list start value not ordinal-1: "%s" (ordinal %s)'
+                % (text, ordinal), line=self.state_machine.abs_line_number())
+            self.parent += msg
+        listitem, blank_finish = self.list_item(match.end())
+        enumlist += listitem
+        offset = self.state_machine.line_offset + 1   # next line
+        newline_offset, blank_finish = self.nested_list_parse(
+              self.state_machine.input_lines[offset:],
+              input_offset=self.state_machine.abs_line_offset() + 1,
+              node=enumlist, initial_state='EnumeratedList',
+              blank_finish=blank_finish,
+              extra_settings={'lastordinal': ordinal,
+                              'format': format,
+                              'auto': sequence == '#'})
+        self.goto_line(newline_offset)
+        if not blank_finish:
+            self.parent += self.unindent_warning('Enumerated list')
+        return [], next_state, []
+
+    def parse_enumerator(self, match, expected_sequence=None):
+        """
+        Analyze an enumerator and return the results.
+
+        :Return:
+            - the enumerator format ('period', 'parens', or 'rparen'),
+            - the sequence used ('arabic', 'loweralpha', 'upperroman', etc.),
+            - the text of the enumerator, stripped of formatting, and
+            - the ordinal value of the enumerator ('a' -> 1, 'ii' -> 2, etc.;
+              ``None`` is returned for invalid enumerator text).
+
+        The enumerator format has already been determined by the regular
+        expression match. If `expected_sequence` is given, that sequence is
+        tried first. If not, we check for Roman numeral 1. This way,
+        single-character Roman numerals (which are also alphabetical) can be
+        matched. If no sequence has been matched, all sequences are checked in
+        order.
+        """
+        groupdict = match.groupdict()
+        sequence = ''
+        for format in self.enum.formats:
+            if groupdict[format]:       # was this the format matched?
+                break                   # yes; keep `format`
+        else:                           # shouldn't happen
+            raise ParserError('enumerator format not matched')
+        text = groupdict[format][self.enum.formatinfo[format].start
+                                 :self.enum.formatinfo[format].end]
+        if text == '#':
+            sequence = '#'
+        elif expected_sequence:
+            try:
+                if self.enum.sequenceregexps[expected_sequence].match(text):
+                    sequence = expected_sequence
+            except KeyError:            # shouldn't happen
+                raise ParserError('unknown enumerator sequence: %s'
+                                  % sequence)
+        elif text == 'i':
+            sequence = 'lowerroman'
+        elif text == 'I':
+            sequence = 'upperroman'
+        if not sequence:
+            for sequence in self.enum.sequences:
+                if self.enum.sequenceregexps[sequence].match(text):
+                    break
+            else:                       # shouldn't happen
+                raise ParserError('enumerator sequence not matched')
+        if sequence == '#':
+            ordinal = 1
+        else:
+            try:
+                ordinal = self.enum.converters[sequence](text)
+            except roman.InvalidRomanNumeralError:
+                ordinal = None
+        return format, sequence, text, ordinal
+
+    def is_enumerated_list_item(self, ordinal, sequence, format):
+        """
+        Check validity based on the ordinal value and the second line.
+
+        Return true iff the ordinal is valid and the second line is blank,
+        indented, or starts with the next enumerator or an auto-enumerator.
+        """
+        if ordinal is None:
+            return None
+        try:
+            next_line = self.state_machine.next_line()
+        except EOFError:              # end of input lines
+            self.state_machine.previous_line()
+            return 1
+        else:
+            self.state_machine.previous_line()
+        if not next_line[:1].strip():   # blank or indented
+            return 1
+        result = self.make_enumerator(ordinal + 1, sequence, format)
+        if result:
+            next_enumerator, auto_enumerator = result
+            try:
+                if ( next_line.startswith(next_enumerator) or
+                     next_line.startswith(auto_enumerator) ):
+                    return 1
+            except TypeError:
+                pass
+        return None
+
+    def make_enumerator(self, ordinal, sequence, format):
+        """
+        Construct and return the next enumerated list item marker, and an
+        auto-enumerator ("#" instead of the regular enumerator).
+
+        Return ``None`` for invalid (out of range) ordinals.
+        """ #"
+        if sequence == '#':
+            enumerator = '#'
+        elif sequence == 'arabic':
+            enumerator = str(ordinal)
+        else:
+            if sequence.endswith('alpha'):
+                if ordinal > 26:
+                    return None
+                enumerator = chr(ordinal + ord('a') - 1)
+            elif sequence.endswith('roman'):
+                try:
+                    enumerator = roman.toRoman(ordinal)
+                except roman.RomanError:
+                    return None
+            else:                       # shouldn't happen
+                raise ParserError('unknown enumerator sequence: "%s"'
+                                  % sequence)
+            if sequence.startswith('lower'):
+                enumerator = enumerator.lower()
+            elif sequence.startswith('upper'):
+                enumerator = enumerator.upper()
+            else:                       # shouldn't happen
+                raise ParserError('unknown enumerator sequence: "%s"'
+                                  % sequence)
+        formatinfo = self.enum.formatinfo[format]
+        next_enumerator = (formatinfo.prefix + enumerator + formatinfo.suffix
+                           + ' ')
+        auto_enumerator = formatinfo.prefix + '#' + formatinfo.suffix + ' '
+        return next_enumerator, auto_enumerator
+
+    def field_marker(self, match, context, next_state):
+        """Field list item."""
+        field_list = nodes.field_list()
+        self.parent += field_list
+        field, blank_finish = self.field(match)
+        field_list += field
+        offset = self.state_machine.line_offset + 1   # next line
+        newline_offset, blank_finish = self.nested_list_parse(
+              self.state_machine.input_lines[offset:],
+              input_offset=self.state_machine.abs_line_offset() + 1,
+              node=field_list, initial_state='FieldList',
+              blank_finish=blank_finish)
+        self.goto_line(newline_offset)
+        if not blank_finish:
+            self.parent += self.unindent_warning('Field list')
+        return [], next_state, []
+
+    def field(self, match):
+        name = self.parse_field_marker(match)
+        lineno = self.state_machine.abs_line_number()
+        indented, indent, line_offset, blank_finish = \
+              self.state_machine.get_first_known_indented(match.end())
+        field_node = nodes.field()
+        field_node.line = lineno
+        name_nodes, name_messages = self.inline_text(name, lineno)
+        field_node += nodes.field_name(name, '', *name_nodes)
+        field_body = nodes.field_body('\n'.join(indented), *name_messages)
+        field_node += field_body
+        if indented:
+            self.parse_field_body(indented, line_offset, field_body)
+        return field_node, blank_finish
+
+    def parse_field_marker(self, match):
+        """Extract & return field name from a field marker match."""
+        field = match.group()[1:]        # strip off leading ':'
+        field = field[:field.rfind(':')] # strip off trailing ':' etc.
+        return field
+
+    def parse_field_body(self, indented, offset, node):
+        self.nested_parse(indented, input_offset=offset, node=node)
+
+    def option_marker(self, match, context, next_state):
+        """Option list item."""
+        optionlist = nodes.option_list()
+        try:
+            listitem, blank_finish = self.option_list_item(match)
+        except MarkupError, (message, lineno):
+            # This shouldn't happen; pattern won't match.
+            msg = self.reporter.error(
+                'Invalid option list marker: %s' % message, line=lineno)
+            self.parent += msg
+            indented, indent, line_offset, blank_finish = \
+                  self.state_machine.get_first_known_indented(match.end())
+            blockquote, messages = self.block_quote(indented, line_offset)
+            self.parent += blockquote
+            self.parent += messages
+            if not blank_finish:
+                self.parent += self.unindent_warning('Option list')
+            return [], next_state, []
+        self.parent += optionlist
+        optionlist += listitem
+        offset = self.state_machine.line_offset + 1   # next line
+        newline_offset, blank_finish = self.nested_list_parse(
+              self.state_machine.input_lines[offset:],
+              input_offset=self.state_machine.abs_line_offset() + 1,
+              node=optionlist, initial_state='OptionList',
+              blank_finish=blank_finish)
+        self.goto_line(newline_offset)
+        if not blank_finish:
+            self.parent += self.unindent_warning('Option list')
+        return [], next_state, []
+
+    def option_list_item(self, match):
+        offset = self.state_machine.abs_line_offset()
+        options = self.parse_option_marker(match)
+        indented, indent, line_offset, blank_finish = \
+              self.state_machine.get_first_known_indented(match.end())
+        if not indented:                # not an option list item
+            self.goto_line(offset)
+            raise statemachine.TransitionCorrection('text')
+        option_group = nodes.option_group('', *options)
+        description = nodes.description('\n'.join(indented))
+        option_list_item = nodes.option_list_item('', option_group,
+                                                  description)
+        if indented:
+            self.nested_parse(indented, input_offset=line_offset,
+                              node=description)
+        return option_list_item, blank_finish
+
+    def parse_option_marker(self, match):
+        """
+        Return a list of `node.option` and `node.option_argument` objects,
+        parsed from an option marker match.
+
+        :Exception: `MarkupError` for invalid option markers.
+        """
+        optlist = []
+        optionstrings = match.group().rstrip().split(', ')
+        for optionstring in optionstrings:
+            tokens = optionstring.split()
+            delimiter = ' '
+            firstopt = tokens[0].split('=')
+            if len(firstopt) > 1:
+                # "--opt=value" form
+                tokens[:1] = firstopt
+                delimiter = '='
+            elif (len(tokens[0]) > 2
+                  and ((tokens[0].startswith('-')
+                        and not tokens[0].startswith('--'))
+                       or tokens[0].startswith('+'))):
+                # "-ovalue" form
+                tokens[:1] = [tokens[0][:2], tokens[0][2:]]
+                delimiter = ''
+            if len(tokens) > 1 and (tokens[1].startswith('<')
+                                    and tokens[-1].endswith('>')):
+                # "-o <value1 value2>" form; join all values into one token
+                tokens[1:] = [' '.join(tokens[1:])]
+            if 0 < len(tokens) <= 2:
+                option = nodes.option(optionstring)
+                option += nodes.option_string(tokens[0], tokens[0])
+                if len(tokens) > 1:
+                    option += nodes.option_argument(tokens[1], tokens[1],
+                                                    delimiter=delimiter)
+                optlist.append(option)
+            else:
+                raise MarkupError(
+                    'wrong number of option tokens (=%s), should be 1 or 2: '
+                    '"%s"' % (len(tokens), optionstring),
+                    self.state_machine.abs_line_number() + 1)
+        return optlist
+
+    def doctest(self, match, context, next_state):
+        data = '\n'.join(self.state_machine.get_text_block())
+        self.parent += nodes.doctest_block(data, data)
+        return [], next_state, []
+
+    def line_block(self, match, context, next_state):
+        """First line of a line block."""
+        block = nodes.line_block()
+        self.parent += block
+        lineno = self.state_machine.abs_line_number()
+        line, messages, blank_finish = self.line_block_line(match, lineno)
+        block += line
+        self.parent += messages
+        if not blank_finish:
+            offset = self.state_machine.line_offset + 1   # next line
+            new_line_offset, blank_finish = self.nested_list_parse(
+                  self.state_machine.input_lines[offset:],
+                  input_offset=self.state_machine.abs_line_offset() + 1,
+                  node=block, initial_state='LineBlock',
+                  blank_finish=0)
+            self.goto_line(new_line_offset)
+        if not blank_finish:
+            self.parent += self.reporter.warning(
+                'Line block ends without a blank line.',
+                line=(self.state_machine.abs_line_number() + 1))
+        if len(block):
+            if block[0].indent is None:
+                block[0].indent = 0
+            self.nest_line_block_lines(block)
+        return [], next_state, []
+
+    def line_block_line(self, match, lineno):
+        """Return one line element of a line_block."""
+        indented, indent, line_offset, blank_finish = \
+              self.state_machine.get_first_known_indented(match.end(),
+                                                          until_blank=1)
+        text = u'\n'.join(indented)
+        text_nodes, messages = self.inline_text(text, lineno)
+        line = nodes.line(text, '', *text_nodes)
+        if match.string.rstrip() != '|': # not empty
+            line.indent = len(match.group(1)) - 1
+        return line, messages, blank_finish
+
+    def nest_line_block_lines(self, block):
+        for index in range(1, len(block)):
+            if block[index].indent is None:
+                block[index].indent = block[index - 1].indent
+        self.nest_line_block_segment(block)
+
+    def nest_line_block_segment(self, block):
+        indents = [item.indent for item in block]
+        least = min(indents)
+        new_items = []
+        new_block = nodes.line_block()
+        for item in block:
+            if item.indent > least:
+                new_block.append(item)
+            else:
+                if len(new_block):
+                    self.nest_line_block_segment(new_block)
+                    new_items.append(new_block)
+                    new_block = nodes.line_block()
+                new_items.append(item)
+        if len(new_block):
+            self.nest_line_block_segment(new_block)
+            new_items.append(new_block)
+        block[:] = new_items
+
+    def grid_table_top(self, match, context, next_state):
+        """Top border of a full table."""
+        return self.table_top(match, context, next_state,
+                              self.isolate_grid_table,
+                              tableparser.GridTableParser)
+
+    def simple_table_top(self, match, context, next_state):
+        """Top border of a simple table."""
+        return self.table_top(match, context, next_state,
+                              self.isolate_simple_table,
+                              tableparser.SimpleTableParser)
+
+    def table_top(self, match, context, next_state,
+                  isolate_function, parser_class):
+        """Top border of a generic table."""
+        nodelist, blank_finish = self.table(isolate_function, parser_class)
+        self.parent += nodelist
+        if not blank_finish:
+            msg = self.reporter.warning(
+                'Blank line required after table.',
+                line=self.state_machine.abs_line_number() + 1)
+            self.parent += msg
+        return [], next_state, []
+
+    def table(self, isolate_function, parser_class):
+        """Parse a table."""
+        block, messages, blank_finish = isolate_function()
+        if block:
+            try:
+                parser = parser_class()
+                tabledata = parser.parse(block)
+                tableline = (self.state_machine.abs_line_number() - len(block)
+                             + 1)
+                table = self.build_table(tabledata, tableline)
+                nodelist = [table] + messages
+            except tableparser.TableMarkupError, detail:
+                nodelist = self.malformed_table(
+                    block, ' '.join(detail.args)) + messages
+        else:
+            nodelist = messages
+        return nodelist, blank_finish
+
+    def isolate_grid_table(self):
+        messages = []
+        blank_finish = 1
+        try:
+            block = self.state_machine.get_text_block(flush_left=1)
+        except statemachine.UnexpectedIndentationError, instance:
+            block, source, lineno = instance.args
+            messages.append(self.reporter.error('Unexpected indentation.',
+                                                source=source, line=lineno))
+            blank_finish = 0
+        block.disconnect()
+        # for East Asian chars:
+        block.pad_double_width(self.double_width_pad_char)
+        width = len(block[0].strip())
+        for i in range(len(block)):
+            block[i] = block[i].strip()
+            if block[i][0] not in '+|': # check left edge
+                blank_finish = 0
+                self.state_machine.previous_line(len(block) - i)
+                del block[i:]
+                break
+        if not self.grid_table_top_pat.match(block[-1]): # find bottom
+            blank_finish = 0
+            # from second-last to third line of table:
+            for i in range(len(block) - 2, 1, -1):
+                if self.grid_table_top_pat.match(block[i]):
+                    self.state_machine.previous_line(len(block) - i + 1)
+                    del block[i+1:]
+                    break
+            else:
+                messages.extend(self.malformed_table(block))
+                return [], messages, blank_finish
+        for i in range(len(block)):     # check right edge
+            if len(block[i]) != width or block[i][-1] not in '+|':
+                messages.extend(self.malformed_table(block))
+                return [], messages, blank_finish
+        return block, messages, blank_finish
+
+    def isolate_simple_table(self):
+        start = self.state_machine.line_offset
+        lines = self.state_machine.input_lines
+        limit = len(lines) - 1
+        toplen = len(lines[start].strip())
+        pattern_match = self.simple_table_border_pat.match
+        found = 0
+        found_at = None
+        i = start + 1
+        while i <= limit:
+            line = lines[i]
+            match = pattern_match(line)
+            if match:
+                if len(line.strip()) != toplen:
+                    self.state_machine.next_line(i - start)
+                    messages = self.malformed_table(
+                        lines[start:i+1], 'Bottom/header table border does '
+                        'not match top border.')
+                    return [], messages, i == limit or not lines[i+1].strip()
+                found += 1
+                found_at = i
+                if found == 2 or i == limit or not lines[i+1].strip():
+                    end = i
+                    break
+            i += 1
+        else:                           # reached end of input_lines
+            if found:
+                extra = ' or no blank line after table bottom'
+                self.state_machine.next_line(found_at - start)
+                block = lines[start:found_at+1]
+            else:
+                extra = ''
+                self.state_machine.next_line(i - start - 1)
+                block = lines[start:]
+            messages = self.malformed_table(
+                block, 'No bottom table border found%s.' % extra)
+            return [], messages, not extra
+        self.state_machine.next_line(end - start)
+        block = lines[start:end+1]
+        # for East Asian chars:
+        block.pad_double_width(self.double_width_pad_char)
+        return block, [], end == limit or not lines[end+1].strip()
+
+    def malformed_table(self, block, detail=''):
+        block.replace(self.double_width_pad_char, '')
+        data = '\n'.join(block)
+        message = 'Malformed table.'
+        lineno = self.state_machine.abs_line_number() - len(block) + 1
+        if detail:
+            message += '\n' + detail
+        error = self.reporter.error(message, nodes.literal_block(data, data),
+                                    line=lineno)
+        return [error]
+
+    def build_table(self, tabledata, tableline, stub_columns=0):
+        colwidths, headrows, bodyrows = tabledata
+        table = nodes.table()
+        tgroup = nodes.tgroup(cols=len(colwidths))
+        table += tgroup
+        for colwidth in colwidths:
+            colspec = nodes.colspec(colwidth=colwidth)
+            if stub_columns:
+                colspec.attributes['stub'] = 1
+                stub_columns -= 1
+            tgroup += colspec
+        if headrows:
+            thead = nodes.thead()
+            tgroup += thead
+            for row in headrows:
+                thead += self.build_table_row(row, tableline)
+        tbody = nodes.tbody()
+        tgroup += tbody
+        for row in bodyrows:
+            tbody += self.build_table_row(row, tableline)
+        return table
+
+    def build_table_row(self, rowdata, tableline):
+        row = nodes.row()
+        for cell in rowdata:
+            if cell is None:
+                continue
+            morerows, morecols, offset, cellblock = cell
+            attributes = {}
+            if morerows:
+                attributes['morerows'] = morerows
+            if morecols:
+                attributes['morecols'] = morecols
+            entry = nodes.entry(**attributes)
+            row += entry
+            if ''.join(cellblock):
+                self.nested_parse(cellblock, input_offset=tableline+offset,
+                                  node=entry)
+        return row
+
+
+    explicit = Struct()
+    """Patterns and constants used for explicit markup recognition."""
+
+    explicit.patterns = Struct(
+          target=re.compile(r"""
+                            (
+                              _               # anonymous target
+                            |               # *OR*
+                              (?P<quote>`?)   # optional open quote
+                              (?![ `])        # first char. not space or
+                                              # backquote
+                              (?P<name>       # reference name
+                                .+?
+                              )
+                              %(non_whitespace_escape_before)s
+                              (?P=quote)      # close quote if open quote used
+                            )
+                            (?<!(?<!\x00):) # no unescaped colon at end
+                            %(non_whitespace_escape_before)s
+                            [ ]?            # optional space
+                            :               # end of reference name
+                            ([ ]+|$)        # followed by whitespace
+                            """ % vars(Inliner), re.VERBOSE),
+          reference=re.compile(r"""
+                               (
+                                 (?P<simple>%(simplename)s)_
+                               |                  # *OR*
+                                 `                  # open backquote
+                                 (?![ ])            # not space
+                                 (?P<phrase>.+?)    # hyperlink phrase
+                                 %(non_whitespace_escape_before)s
+                                 `_                 # close backquote,
+                                                    # reference mark
+                               )
+                               $                  # end of string
+                               """ % vars(Inliner), re.VERBOSE | re.UNICODE),
+          substitution=re.compile(r"""
+                                  (
+                                    (?![ ])          # first char. not space
+                                    (?P<name>.+?)    # substitution text
+                                    %(non_whitespace_escape_before)s
+                                    \|               # close delimiter
+                                  )
+                                  ([ ]+|$)           # followed by whitespace
+                                  """ % vars(Inliner), re.VERBOSE),)
+
+    def footnote(self, match):
+        lineno = self.state_machine.abs_line_number()
+        indented, indent, offset, blank_finish = \
+              self.state_machine.get_first_known_indented(match.end())
+        label = match.group(1)
+        name = normalize_name(label)
+        footnote = nodes.footnote('\n'.join(indented))
+        footnote.line = lineno
+        if name[0] == '#':              # auto-numbered
+            name = name[1:]             # autonumber label
+            footnote['auto'] = 1
+            if name:
+                footnote['names'].append(name)
+            self.document.note_autofootnote(footnote)
+        elif name == '*':               # auto-symbol
+            name = ''
+            footnote['auto'] = '*'
+            self.document.note_symbol_footnote(footnote)
+        else:                           # manually numbered
+            footnote += nodes.label('', label)
+            footnote['names'].append(name)
+            self.document.note_footnote(footnote)
+        if name:
+            self.document.note_explicit_target(footnote, footnote)
+        else:
+            self.document.set_id(footnote, footnote)
+        if indented:
+            self.nested_parse(indented, input_offset=offset, node=footnote)
+        return [footnote], blank_finish
+
+    def citation(self, match):
+        lineno = self.state_machine.abs_line_number()
+        indented, indent, offset, blank_finish = \
+              self.state_machine.get_first_known_indented(match.end())
+        label = match.group(1)
+        name = normalize_name(label)
+        citation = nodes.citation('\n'.join(indented))
+        citation.line = lineno
+        citation += nodes.label('', label)
+        citation['names'].append(name)
+        self.document.note_citation(citation)
+        self.document.note_explicit_target(citation, citation)
+        if indented:
+            self.nested_parse(indented, input_offset=offset, node=citation)
+        return [citation], blank_finish
+
+    def hyperlink_target(self, match):
+        pattern = self.explicit.patterns.target
+        lineno = self.state_machine.abs_line_number()
+        block, indent, offset, blank_finish = \
+              self.state_machine.get_first_known_indented(
+              match.end(), until_blank=1, strip_indent=0)
+        blocktext = match.string[:match.end()] + '\n'.join(block)
+        block = [escape2null(line) for line in block]
+        escaped = block[0]
+        blockindex = 0
+        while 1:
+            targetmatch = pattern.match(escaped)
+            if targetmatch:
+                break
+            blockindex += 1
+            try:
+                escaped += block[blockindex]
+            except IndexError:
+                raise MarkupError('malformed hyperlink target.', lineno)
+        del block[:blockindex]
+        block[0] = (block[0] + ' ')[targetmatch.end()-len(escaped)-1:].strip()
+        target = self.make_target(block, blocktext, lineno,
+                                  targetmatch.group('name'))
+        return [target], blank_finish
+
+    def make_target(self, block, block_text, lineno, target_name):
+        target_type, data = self.parse_target(block, block_text, lineno)
+        if target_type == 'refname':
+            target = nodes.target(block_text, '', refname=normalize_name(data))
+            target.indirect_reference_name = data
+            self.add_target(target_name, '', target, lineno)
+            self.document.note_indirect_target(target)
+            return target
+        elif target_type == 'refuri':
+            target = nodes.target(block_text, '')
+            self.add_target(target_name, data, target, lineno)
+            return target
+        else:
+            return data
+
+    def parse_target(self, block, block_text, lineno):
+        """
+        Determine the type of reference of a target.
+
+        :Return: A 2-tuple, one of:
+
+            - 'refname' and the indirect reference name
+            - 'refuri' and the URI
+            - 'malformed' and a system_message node
+        """
+        if block and block[-1].strip()[-1:] == '_': # possible indirect target
+            reference = ' '.join([line.strip() for line in block])
+            refname = self.is_reference(reference)
+            if refname:
+                return 'refname', refname
+        reference = ''.join([''.join(line.split()) for line in block])
+        return 'refuri', unescape(reference)
+
+    def is_reference(self, reference):
+        match = self.explicit.patterns.reference.match(
+            whitespace_normalize_name(reference))
+        if not match:
+            return None
+        return unescape(match.group('simple') or match.group('phrase'))
+
+    def add_target(self, targetname, refuri, target, lineno):
+        target.line = lineno
+        if targetname:
+            name = normalize_name(unescape(targetname))
+            target['names'].append(name)
+            if refuri:
+                uri = self.inliner.adjust_uri(refuri)
+                if uri:
+                    target['refuri'] = uri
+                else:
+                    raise ApplicationError('problem with URI: %r' % refuri)
+            self.document.note_explicit_target(target, self.parent)
+        else:                       # anonymous target
+            if refuri:
+                target['refuri'] = refuri
+            target['anonymous'] = 1
+            self.document.note_anonymous_target(target)
+
+    def substitution_def(self, match):
+        pattern = self.explicit.patterns.substitution
+        lineno = self.state_machine.abs_line_number()
+        block, indent, offset, blank_finish = \
+              self.state_machine.get_first_known_indented(match.end(),
+                                                          strip_indent=0)
+        blocktext = (match.string[:match.end()] + '\n'.join(block))
+        block.disconnect()
+        escaped = escape2null(block[0].rstrip())
+        blockindex = 0
+        while 1:
+            subdefmatch = pattern.match(escaped)
+            if subdefmatch:
+                break
+            blockindex += 1
+            try:
+                escaped = escaped + ' ' + escape2null(block[blockindex].strip())
+            except IndexError:
+                raise MarkupError('malformed substitution definition.',
+                                  lineno)
+        del block[:blockindex]          # strip out the substitution marker
+        block[0] = (block[0].strip() + ' ')[subdefmatch.end()-len(escaped)-1:-1]
+        if not block[0]:
+            del block[0]
+            offset += 1
+        while block and not block[-1].strip():
+            block.pop()
+        subname = subdefmatch.group('name')
+        substitution_node = nodes.substitution_definition(blocktext)
+        substitution_node.line = lineno
+        if not block:
+            msg = self.reporter.warning(
+                'Substitution definition "%s" missing contents.' % subname,
+                nodes.literal_block(blocktext, blocktext), line=lineno)
+            return [msg], blank_finish
+        block[0] = block[0].strip()
+        substitution_node['names'].append(
+            nodes.whitespace_normalize_name(subname))
+        new_abs_offset, blank_finish = self.nested_list_parse(
+              block, input_offset=offset, node=substitution_node,
+              initial_state='SubstitutionDef', blank_finish=blank_finish)
+        i = 0
+        for node in substitution_node[:]:
+            if not (isinstance(node, nodes.Inline) or
+                    isinstance(node, nodes.Text)):
+                self.parent += substitution_node[i]
+                del substitution_node[i]
+            else:
+                i += 1
+        for node in substitution_node.traverse(nodes.Element):
+            if self.disallowed_inside_substitution_definitions(node):
+                pformat = nodes.literal_block('', node.pformat().rstrip())
+                msg = self.reporter.error(
+                    'Substitution definition contains illegal element:',
+                    pformat, nodes.literal_block(blocktext, blocktext),
+                    line=lineno)
+                return [msg], blank_finish
+        if len(substitution_node) == 0:
+            msg = self.reporter.warning(
+                  'Substitution definition "%s" empty or invalid.'
+                  % subname,
+                  nodes.literal_block(blocktext, blocktext), line=lineno)
+            return [msg], blank_finish
+        self.document.note_substitution_def(
+            substitution_node, subname, self.parent)
+        return [substitution_node], blank_finish
+
+    def disallowed_inside_substitution_definitions(self, node):
+        if (node['ids'] or
+            isinstance(node, nodes.reference) and node.get('anonymous') or
+            isinstance(node, nodes.footnote_reference) and node.get('auto')):
+            return 1
+        else:
+            return 0
+
+    def directive(self, match, **option_presets):
+        """Returns a 2-tuple: list of nodes, and a "blank finish" boolean."""
+        type_name = match.group(1)
+        directive_function, messages = directives.directive(
+            type_name, self.memo.language, self.document)
+        self.parent += messages
+        if directive_function:
+            return self.run_directive(
+                directive_function, match, type_name, option_presets)
+        else:
+            return self.unknown_directive(type_name)
+
+    def run_directive(self, directive_fn, match, type_name, option_presets):
+        """
+        Parse a directive then run its directive function.
+
+        Parameters:
+
+        - `directive_fn`: The function implementing the directive.  Uses
+          function attributes ``arguments``, ``options``, and/or ``content``
+          if present.
+
+        - `match`: A regular expression match object which matched the first
+          line of the directive.
+
+        - `type_name`: The directive name, as used in the source text.
+
+        - `option_presets`: A dictionary of preset options, defaults for the
+          directive options.  Currently, only an "alt" option is passed by
+          substitution definitions (value: the substitution name), which may
+          be used by an embedded image directive.
+
+        Returns a 2-tuple: list of nodes, and a "blank finish" boolean.
+        """
+        lineno = self.state_machine.abs_line_number()
+        initial_line_offset = self.state_machine.line_offset
+        indented, indent, line_offset, blank_finish \
+                  = self.state_machine.get_first_known_indented(match.end(),
+                                                                strip_top=0)
+        block_text = '\n'.join(self.state_machine.input_lines[
+            initial_line_offset : self.state_machine.line_offset + 1])
+        try:
+            arguments, options, content, content_offset = (
+                self.parse_directive_block(indented, line_offset,
+                                           directive_fn, option_presets))
+        except MarkupError, detail:
+            error = self.reporter.error(
+                'Error in "%s" directive:\n%s.' % (type_name,
+                                                   ' '.join(detail.args)),
+                nodes.literal_block(block_text, block_text), line=lineno)
+            return [error], blank_finish
+        result = directive_fn(type_name, arguments, options, content, lineno,
+                              content_offset, block_text, self,
+                              self.state_machine)
+        return (result,
+                blank_finish or self.state_machine.is_next_line_blank())
+
+    def parse_directive_block(self, indented, line_offset, directive_fn,
+                              option_presets):
+        arguments = []
+        options = {}
+        argument_spec = getattr(directive_fn, 'arguments', None)
+        if argument_spec and argument_spec[:2] == (0, 0):
+            argument_spec = None
+        option_spec = getattr(directive_fn, 'options', None)
+        content_spec = getattr(directive_fn, 'content', None)
+        if indented and not indented[0].strip():
+            indented.trim_start()
+            line_offset += 1
+        while indented and not indented[-1].strip():
+            indented.trim_end()
+        if indented and (argument_spec or option_spec):
+            for i in range(len(indented)):
+                if not indented[i].strip():
+                    break
+            else:
+                i += 1
+            arg_block = indented[:i]
+            content = indented[i+1:]
+            content_offset = line_offset + i + 1
+        else:
+            content = indented
+            content_offset = line_offset
+            arg_block = []
+        while content and not content[0].strip():
+            content.trim_start()
+            content_offset += 1
+        if option_spec:
+            options, arg_block = self.parse_directive_options(
+                option_presets, option_spec, arg_block)
+            if arg_block and not argument_spec:
+                raise MarkupError('no arguments permitted; blank line '
+                                  'required before content block')
+        if argument_spec:
+            arguments = self.parse_directive_arguments(
+                argument_spec, arg_block)
+        if content and not content_spec:
+            raise MarkupError('no content permitted')
+        return (arguments, options, content, content_offset)
+
+    def parse_directive_options(self, option_presets, option_spec, arg_block):
+        options = option_presets.copy()
+        for i in range(len(arg_block)):
+            if arg_block[i][:1] == ':':
+                opt_block = arg_block[i:]
+                arg_block = arg_block[:i]
+                break
+        else:
+            opt_block = []
+        if opt_block:
+            success, data = self.parse_extension_options(option_spec,
+                                                         opt_block)
+            if success:                 # data is a dict of options
+                options.update(data)
+            else:                       # data is an error string
+                raise MarkupError(data)
+        return options, arg_block
+
+    def parse_directive_arguments(self, argument_spec, arg_block):
+        required, optional, last_whitespace = argument_spec
+        arg_text = '\n'.join(arg_block)
+        arguments = arg_text.split()
+        if len(arguments) < required:
+            raise MarkupError('%s argument(s) required, %s supplied'
+                              % (required, len(arguments)))
+        elif len(arguments) > required + optional:
+            if last_whitespace:
+                arguments = arg_text.split(None, required + optional - 1)
+            else:
+                raise MarkupError(
+                    'maximum %s argument(s) allowed, %s supplied'
+                    % (required + optional, len(arguments)))
+        return arguments
+
+    def parse_extension_options(self, option_spec, datalines):
+        """
+        Parse `datalines` for a field list containing extension options
+        matching `option_spec`.
+
+        :Parameters:
+            - `option_spec`: a mapping of option name to conversion
+              function, which should raise an exception on bad input.
+            - `datalines`: a list of input strings.
+
+        :Return:
+            - Success value, 1 or 0.
+            - An option dictionary on success, an error string on failure.
+        """
+        node = nodes.field_list()
+        newline_offset, blank_finish = self.nested_list_parse(
+              datalines, 0, node, initial_state='ExtensionOptions',
+              blank_finish=1)
+        if newline_offset != len(datalines): # incomplete parse of block
+            return 0, 'invalid option block'
+        try:
+            options = utils.extract_extension_options(node, option_spec)
+        except KeyError, detail:
+            return 0, ('unknown option: "%s"' % detail.args[0])
+        except (ValueError, TypeError), detail:
+            return 0, ('invalid option value: %s' % ' '.join(detail.args))
+        except utils.ExtensionOptionError, detail:
+            return 0, ('invalid option data: %s' % ' '.join(detail.args))
+        if blank_finish:
+            return 1, options
+        else:
+            return 0, 'option data incompletely parsed'
+
+    def unknown_directive(self, type_name):
+        lineno = self.state_machine.abs_line_number()
+        indented, indent, offset, blank_finish = \
+              self.state_machine.get_first_known_indented(0, strip_indent=0)
+        text = '\n'.join(indented)
+        error = self.reporter.error(
+              'Unknown directive type "%s".' % type_name,
+              nodes.literal_block(text, text), line=lineno)
+        return [error], blank_finish
+
+    def comment(self, match):
+        if not match.string[match.end():].strip() \
+              and self.state_machine.is_next_line_blank(): # an empty comment?
+            return [nodes.comment()], 1 # "A tiny but practical wart."
+        indented, indent, offset, blank_finish = \
+              self.state_machine.get_first_known_indented(match.end())
+        while indented and not indented[-1].strip():
+            indented.trim_end()
+        text = '\n'.join(indented)
+        return [nodes.comment(text, text)], blank_finish
+
+    explicit.constructs = [
+          (footnote,
+           re.compile(r"""
+                      \.\.[ ]+          # explicit markup start
+                      \[
+                      (                 # footnote label:
+                          [0-9]+          # manually numbered footnote
+                        |               # *OR*
+                          \#              # anonymous auto-numbered footnote
+                        |               # *OR*
+                          \#%s            # auto-number ed?) footnote label
+                        |               # *OR*
+                          \*              # auto-symbol footnote
+                      )
+                      \]
+                      ([ ]+|$)          # whitespace or end of line
+                      """ % Inliner.simplename, re.VERBOSE | re.UNICODE)),
+          (citation,
+           re.compile(r"""
+                      \.\.[ ]+          # explicit markup start
+                      \[(%s)\]          # citation label
+                      ([ ]+|$)          # whitespace or end of line
+                      """ % Inliner.simplename, re.VERBOSE | re.UNICODE)),
+          (hyperlink_target,
+           re.compile(r"""
+                      \.\.[ ]+          # explicit markup start
+                      _                 # target indicator
+                      (?![ ]|$)         # first char. not space or EOL
+                      """, re.VERBOSE)),
+          (substitution_def,
+           re.compile(r"""
+                      \.\.[ ]+          # explicit markup start
+                      \|                # substitution indicator
+                      (?![ ]|$)         # first char. not space or EOL
+                      """, re.VERBOSE)),
+          (directive,
+           re.compile(r"""
+                      \.\.[ ]+          # explicit markup start
+                      (%s)              # directive name
+                      [ ]?              # optional space
+                      ::                # directive delimiter
+                      ([ ]+|$)          # whitespace or end of line
+                      """ % Inliner.simplename, re.VERBOSE | re.UNICODE))]
+
+    def explicit_markup(self, match, context, next_state):
+        """Footnotes, hyperlink targets, directives, comments."""
+        nodelist, blank_finish = self.explicit_construct(match)
+        self.parent += nodelist
+        self.explicit_list(blank_finish)
+        return [], next_state, []
+
+    def explicit_construct(self, match):
+        """Determine which explicit construct this is, parse & return it."""
+        errors = []
+        for method, pattern in self.explicit.constructs:
+            expmatch = pattern.match(match.string)
+            if expmatch:
+                try:
+                    return method(self, expmatch)
+                except MarkupError, (message, lineno): # never reached?
+                    errors.append(self.reporter.warning(message, line=lineno))
+                    break
+        nodelist, blank_finish = self.comment(match)
+        return nodelist + errors, blank_finish
+
+    def explicit_list(self, blank_finish):
+        """
+        Create a nested state machine for a series of explicit markup
+        constructs (including anonymous hyperlink targets).
+        """
+        offset = self.state_machine.line_offset + 1   # next line
+        newline_offset, blank_finish = self.nested_list_parse(
+              self.state_machine.input_lines[offset:],
+              input_offset=self.state_machine.abs_line_offset() + 1,
+              node=self.parent, initial_state='Explicit',
+              blank_finish=blank_finish,
+              match_titles=self.state_machine.match_titles)
+        self.goto_line(newline_offset)
+        if not blank_finish:
+            self.parent += self.unindent_warning('Explicit markup')
+
+    def anonymous(self, match, context, next_state):
+        """Anonymous hyperlink targets."""
+        nodelist, blank_finish = self.anonymous_target(match)
+        self.parent += nodelist
+        self.explicit_list(blank_finish)
+        return [], next_state, []
+
+    def anonymous_target(self, match):
+        lineno = self.state_machine.abs_line_number()
+        block, indent, offset, blank_finish \
+              = self.state_machine.get_first_known_indented(match.end(),
+                                                            until_blank=1)
+        blocktext = match.string[:match.end()] + '\n'.join(block)
+        block = [escape2null(line) for line in block]
+        target = self.make_target(block, blocktext, lineno, '')
+        return [target], blank_finish
+
+    def line(self, match, context, next_state):
+        """Section title overline or transition marker."""
+        if self.state_machine.match_titles:
+            return [match.string], 'Line', []
+        elif match.string.strip() == '::':
+            raise statemachine.TransitionCorrection('text')
+        elif len(match.string.strip()) < 4:
+            msg = self.reporter.info(
+                'Unexpected possible title overline or transition.\n'
+                "Treating it as ordinary text because it's so short.",
+                line=self.state_machine.abs_line_number())
+            self.parent += msg
+            raise statemachine.TransitionCorrection('text')
+        else:
+            blocktext = self.state_machine.line
+            msg = self.reporter.severe(
+                  'Unexpected section title or transition.',
+                  nodes.literal_block(blocktext, blocktext),
+                  line=self.state_machine.abs_line_number())
+            self.parent += msg
+            return [], next_state, []
+
+    def text(self, match, context, next_state):
+        """Titles, definition lists, paragraphs."""
+        return [match.string], 'Text', []
+
+
+class RFC2822Body(Body):
+
+    """
+    RFC2822 headers are only valid as the first constructs in documents.  As
+    soon as anything else appears, the `Body` state should take over.
+    """
+
+    patterns = Body.patterns.copy()     # can't modify the original
+    patterns['rfc2822'] = r'[!-9;-~]+:( +|$)'
+    initial_transitions = [(name, 'Body')
+                           for name in Body.initial_transitions]
+    initial_transitions.insert(-1, ('rfc2822', 'Body')) # just before 'text'
+
+    def rfc2822(self, match, context, next_state):
+        """RFC2822-style field list item."""
+        fieldlist = nodes.field_list(classes=['rfc2822'])
+        self.parent += fieldlist
+        field, blank_finish = self.rfc2822_field(match)
+        fieldlist += field
+        offset = self.state_machine.line_offset + 1   # next line
+        newline_offset, blank_finish = self.nested_list_parse(
+              self.state_machine.input_lines[offset:],
+              input_offset=self.state_machine.abs_line_offset() + 1,
+              node=fieldlist, initial_state='RFC2822List',
+              blank_finish=blank_finish)
+        self.goto_line(newline_offset)
+        if not blank_finish:
+            self.parent += self.unindent_warning(
+                  'RFC2822-style field list')
+        return [], next_state, []
+
+    def rfc2822_field(self, match):
+        name = match.string[:match.string.find(':')]
+        indented, indent, line_offset, blank_finish = \
+              self.state_machine.get_first_known_indented(match.end(),
+                                                          until_blank=1)
+        fieldnode = nodes.field()
+        fieldnode += nodes.field_name(name, name)
+        fieldbody = nodes.field_body('\n'.join(indented))
+        fieldnode += fieldbody
+        if indented:
+            self.nested_parse(indented, input_offset=line_offset,
+                              node=fieldbody)
+        return fieldnode, blank_finish
+
+
+class SpecializedBody(Body):
+
+    """
+    Superclass for second and subsequent compound element members.  Compound
+    elements are lists and list-like constructs.
+
+    All transition methods are disabled (redefined as `invalid_input`).
+    Override individual methods in subclasses to re-enable.
+
+    For example, once an initial bullet list item, say, is recognized, the
+    `BulletList` subclass takes over, with a "bullet_list" node as its
+    container.  Upon encountering the initial bullet list item, `Body.bullet`
+    calls its ``self.nested_list_parse`` (`RSTState.nested_list_parse`), which
+    starts up a nested parsing session with `BulletList` as the initial state.
+    Only the ``bullet`` transition method is enabled in `BulletList`; as long
+    as only bullet list items are encountered, they are parsed and inserted
+    into the container.  The first construct which is *not* a bullet list item
+    triggers the `invalid_input` method, which ends the nested parse and
+    closes the container.  `BulletList` needs to recognize input that is
+    invalid in the context of a bullet list, which means everything *other
+    than* bullet list items, so it inherits the transition list created in
+    `Body`.
+    """
+
+    def invalid_input(self, match=None, context=None, next_state=None):
+        """Not a compound element member. Abort this state machine."""
+        self.state_machine.previous_line() # back up so parent SM can reassess
+        raise EOFError
+
+    indent = invalid_input
+    bullet = invalid_input
+    enumerator = invalid_input
+    field_marker = invalid_input
+    option_marker = invalid_input
+    doctest = invalid_input
+    line_block = invalid_input
+    grid_table_top = invalid_input
+    simple_table_top = invalid_input
+    explicit_markup = invalid_input
+    anonymous = invalid_input
+    line = invalid_input
+    text = invalid_input
+
+
+class BulletList(SpecializedBody):
+
+    """Second and subsequent bullet_list list_items."""
+
+    def bullet(self, match, context, next_state):
+        """Bullet list item."""
+        if match.string[0] != self.parent['bullet']:
+            # different bullet: new list
+            self.invalid_input()
+        listitem, blank_finish = self.list_item(match.end())
+        self.parent += listitem
+        self.blank_finish = blank_finish
+        return [], next_state, []
+
+
+class DefinitionList(SpecializedBody):
+
+    """Second and subsequent definition_list_items."""
+
+    def text(self, match, context, next_state):
+        """Definition lists."""
+        return [match.string], 'Definition', []
+
+
+class EnumeratedList(SpecializedBody):
+
+    """Second and subsequent enumerated_list list_items."""
+
+    def enumerator(self, match, context, next_state):
+        """Enumerated list item."""
+        format, sequence, text, ordinal = self.parse_enumerator(
+              match, self.parent['enumtype'])
+        if ( format != self.format
+             or (sequence != '#' and (sequence != self.parent['enumtype']
+                                      or self.auto
+                                      or ordinal != (self.lastordinal + 1)))
+             or not self.is_enumerated_list_item(ordinal, sequence, format)):
+            # different enumeration: new list
+            self.invalid_input()
+        if sequence == '#':
+            self.auto = 1
+        listitem, blank_finish = self.list_item(match.end())
+        self.parent += listitem
+        self.blank_finish = blank_finish
+        self.lastordinal = ordinal
+        return [], next_state, []
+
+
+class FieldList(SpecializedBody):
+
+    """Second and subsequent field_list fields."""
+
+    def field_marker(self, match, context, next_state):
+        """Field list field."""
+        field, blank_finish = self.field(match)
+        self.parent += field
+        self.blank_finish = blank_finish
+        return [], next_state, []
+
+
+class OptionList(SpecializedBody):
+
+    """Second and subsequent option_list option_list_items."""
+
+    def option_marker(self, match, context, next_state):
+        """Option list item."""
+        try:
+            option_list_item, blank_finish = self.option_list_item(match)
+        except MarkupError, (message, lineno):
+            self.invalid_input()
+        self.parent += option_list_item
+        self.blank_finish = blank_finish
+        return [], next_state, []
+
+
+class RFC2822List(SpecializedBody, RFC2822Body):
+
+    """Second and subsequent RFC2822-style field_list fields."""
+
+    patterns = RFC2822Body.patterns
+    initial_transitions = RFC2822Body.initial_transitions
+
+    def rfc2822(self, match, context, next_state):
+        """RFC2822-style field list item."""
+        field, blank_finish = self.rfc2822_field(match)
+        self.parent += field
+        self.blank_finish = blank_finish
+        return [], 'RFC2822List', []
+
+    blank = SpecializedBody.invalid_input
+
+
+class ExtensionOptions(FieldList):
+
+    """
+    Parse field_list fields for extension options.
+
+    No nested parsing is done (including inline markup parsing).
+    """
+
+    def parse_field_body(self, indented, offset, node):
+        """Override `Body.parse_field_body` for simpler parsing."""
+        lines = []
+        for line in list(indented) + ['']:
+            if line.strip():
+                lines.append(line)
+            elif lines:
+                text = '\n'.join(lines)
+                node += nodes.paragraph(text, text)
+                lines = []
+
+
+class LineBlock(SpecializedBody):
+
+    """Second and subsequent lines of a line_block."""
+
+    blank = SpecializedBody.invalid_input
+
+    def line_block(self, match, context, next_state):
+        """New line of line block."""
+        lineno = self.state_machine.abs_line_number()
+        line, messages, blank_finish = self.line_block_line(match, lineno)
+        self.parent += line
+        self.parent.parent += messages
+        self.blank_finish = blank_finish
+        return [], next_state, []
+
+
+class Explicit(SpecializedBody):
+
+    """Second and subsequent explicit markup construct."""
+
+    def explicit_markup(self, match, context, next_state):
+        """Footnotes, hyperlink targets, directives, comments."""
+        nodelist, blank_finish = self.explicit_construct(match)
+        self.parent += nodelist
+        self.blank_finish = blank_finish
+        return [], next_state, []
+
+    def anonymous(self, match, context, next_state):
+        """Anonymous hyperlink targets."""
+        nodelist, blank_finish = self.anonymous_target(match)
+        self.parent += nodelist
+        self.blank_finish = blank_finish
+        return [], next_state, []
+
+    blank = SpecializedBody.invalid_input
+
+
+class SubstitutionDef(Body):
+
+    """
+    Parser for the contents of a substitution_definition element.
+    """
+
+    patterns = {
+          'embedded_directive': re.compile(r'(%s)::( +|$)'
+                                           % Inliner.simplename, re.UNICODE),
+          'text': r''}
+    initial_transitions = ['embedded_directive', 'text']
+
+    def embedded_directive(self, match, context, next_state):
+        nodelist, blank_finish = self.directive(match,
+                                                alt=self.parent['names'][0])
+        self.parent += nodelist
+        if not self.state_machine.at_eof():
+            self.blank_finish = blank_finish
+        raise EOFError
+
+    def text(self, match, context, next_state):
+        if not self.state_machine.at_eof():
+            self.blank_finish = self.state_machine.is_next_line_blank()
+        raise EOFError
+
+
+class Text(RSTState):
+
+    """
+    Classifier of second line of a text block.
+
+    Could be a paragraph, a definition list item, or a title.
+    """
+
+    patterns = {'underline': Body.patterns['line'],
+                'text': r''}
+    initial_transitions = [('underline', 'Body'), ('text', 'Body')]
+
+    def blank(self, match, context, next_state):
+        """End of paragraph."""
+        paragraph, literalnext = self.paragraph(
+              context, self.state_machine.abs_line_number() - 1)
+        self.parent += paragraph
+        if literalnext:
+            self.parent += self.literal_block()
+        return [], 'Body', []
+
+    def eof(self, context):
+        if context:
+            self.blank(None, context, None)
+        return []
+
+    def indent(self, match, context, next_state):
+        """Definition list item."""
+        definitionlist = nodes.definition_list()
+        definitionlistitem, blank_finish = self.definition_list_item(context)
+        definitionlist += definitionlistitem
+        self.parent += definitionlist
+        offset = self.state_machine.line_offset + 1   # next line
+        newline_offset, blank_finish = self.nested_list_parse(
+              self.state_machine.input_lines[offset:],
+              input_offset=self.state_machine.abs_line_offset() + 1,
+              node=definitionlist, initial_state='DefinitionList',
+              blank_finish=blank_finish, blank_finish_state='Definition')
+        self.goto_line(newline_offset)
+        if not blank_finish:
+            self.parent += self.unindent_warning('Definition list')
+        return [], 'Body', []
+
+    def underline(self, match, context, next_state):
+        """Section title."""
+        lineno = self.state_machine.abs_line_number()
+        title = context[0].rstrip()
+        underline = match.string.rstrip()
+        source = title + '\n' + underline
+        messages = []
+        if column_width(title) > len(underline):
+            if len(underline) < 4:
+                if self.state_machine.match_titles:
+                    msg = self.reporter.info(
+                        'Possible title underline, too short for the title.\n'
+                        "Treating it as ordinary text because it's so short.",
+                        line=lineno)
+                    self.parent += msg
+                raise statemachine.TransitionCorrection('text')
+            else:
+                blocktext = context[0] + '\n' + self.state_machine.line
+                msg = self.reporter.warning(
+                    'Title underline too short.',
+                    nodes.literal_block(blocktext, blocktext), line=lineno)
+                messages.append(msg)
+        if not self.state_machine.match_titles:
+            blocktext = context[0] + '\n' + self.state_machine.line
+            msg = self.reporter.severe(
+                'Unexpected section title.',
+                nodes.literal_block(blocktext, blocktext), line=lineno)
+            self.parent += messages
+            self.parent += msg
+            return [], next_state, []
+        style = underline[0]
+        context[:] = []
+        self.section(title, source, style, lineno - 1, messages)
+        return [], next_state, []
+
+    def text(self, match, context, next_state):
+        """Paragraph."""
+        startline = self.state_machine.abs_line_number() - 1
+        msg = None
+        try:
+            block = self.state_machine.get_text_block(flush_left=1)
+        except statemachine.UnexpectedIndentationError, instance:
+            block, source, lineno = instance.args
+            msg = self.reporter.error('Unexpected indentation.',
+                                      source=source, line=lineno)
+        lines = context + list(block)
+        paragraph, literalnext = self.paragraph(lines, startline)
+        self.parent += paragraph
+        self.parent += msg
+        if literalnext:
+            try:
+                self.state_machine.next_line()
+            except EOFError:
+                pass
+            self.parent += self.literal_block()
+        return [], next_state, []
+
+    def literal_block(self):
+        """Return a list of nodes."""
+        indented, indent, offset, blank_finish = \
+              self.state_machine.get_indented()
+        while indented and not indented[-1].strip():
+            indented.trim_end()
+        if not indented:
+            return self.quoted_literal_block()
+        data = '\n'.join(indented)
+        literal_block = nodes.literal_block(data, data)
+        literal_block.line = offset + 1
+        nodelist = [literal_block]
+        if not blank_finish:
+            nodelist.append(self.unindent_warning('Literal block'))
+        return nodelist
+
+    def quoted_literal_block(self):
+        abs_line_offset = self.state_machine.abs_line_offset()
+        offset = self.state_machine.line_offset
+        parent_node = nodes.Element()
+        new_abs_offset = self.nested_parse(
+            self.state_machine.input_lines[offset:],
+            input_offset=abs_line_offset, node=parent_node, match_titles=0,
+            state_machine_kwargs={'state_classes': (QuotedLiteralBlock,),
+                                  'initial_state': 'QuotedLiteralBlock'})
+        self.goto_line(new_abs_offset)
+        return parent_node.children
+
+    def definition_list_item(self, termline):
+        indented, indent, line_offset, blank_finish = \
+              self.state_machine.get_indented()
+        definitionlistitem = nodes.definition_list_item(
+            '\n'.join(termline + list(indented)))
+        lineno = self.state_machine.abs_line_number() - 1
+        definitionlistitem.line = lineno
+        termlist, messages = self.term(termline, lineno)
+        definitionlistitem += termlist
+        definition = nodes.definition('', *messages)
+        definitionlistitem += definition
+        if termline[0][-2:] == '::':
+            definition += self.reporter.info(
+                  'Blank line missing before literal block (after the "::")? '
+                  'Interpreted as a definition list item.', line=line_offset+1)
+        self.nested_parse(indented, input_offset=line_offset, node=definition)
+        return definitionlistitem, blank_finish
+
+    classifier_delimiter = re.compile(' +: +')
+
+    def term(self, lines, lineno):
+        """Return a definition_list's term and optional classifiers."""
+        assert len(lines) == 1
+        text_nodes, messages = self.inline_text(lines[0], lineno)
+        term_node = nodes.term()
+        node_list = [term_node]
+        for i in range(len(text_nodes)):
+            node = text_nodes[i]
+            if isinstance(node, nodes.Text):
+                parts = self.classifier_delimiter.split(node.rawsource)
+                if len(parts) == 1:
+                    node_list[-1] += node
+                else:
+                    
+                    node_list[-1] += nodes.Text(parts[0].rstrip())
+                    for part in parts[1:]:
+                        classifier_node = nodes.classifier('', part)
+                        node_list.append(classifier_node)
+            else:
+                node_list[-1] += node
+        return node_list, messages
+
+
+class SpecializedText(Text):
+
+    """
+    Superclass for second and subsequent lines of Text-variants.
+
+    All transition methods are disabled. Override individual methods in
+    subclasses to re-enable.
+    """
+
+    def eof(self, context):
+        """Incomplete construct."""
+        return []
+
+    def invalid_input(self, match=None, context=None, next_state=None):
+        """Not a compound element member. Abort this state machine."""
+        raise EOFError
+
+    blank = invalid_input
+    indent = invalid_input
+    underline = invalid_input
+    text = invalid_input
+
+
+class Definition(SpecializedText):
+
+    """Second line of potential definition_list_item."""
+
+    def eof(self, context):
+        """Not a definition."""
+        self.state_machine.previous_line(2) # so parent SM can reassess
+        return []
+
+    def indent(self, match, context, next_state):
+        """Definition list item."""
+        definitionlistitem, blank_finish = self.definition_list_item(context)
+        self.parent += definitionlistitem
+        self.blank_finish = blank_finish
+        return [], 'DefinitionList', []
+
+
+class Line(SpecializedText):
+
+    """
+    Second line of over- & underlined section title or transition marker.
+    """
+
+    eofcheck = 1                        # @@@ ???
+    """Set to 0 while parsing sections, so that we don't catch the EOF."""
+
+    def eof(self, context):
+        """Transition marker at end of section or document."""
+        marker = context[0].strip()
+        if self.memo.section_bubble_up_kludge:
+            self.memo.section_bubble_up_kludge = 0
+        elif len(marker) < 4:
+            self.state_correction(context)
+        if self.eofcheck:               # ignore EOFError with sections
+            lineno = self.state_machine.abs_line_number() - 1
+            transition = nodes.transition(rawsource=context[0])
+            transition.line = lineno
+            self.parent += transition
+        self.eofcheck = 1
+        return []
+
+    def blank(self, match, context, next_state):
+        """Transition marker."""
+        lineno = self.state_machine.abs_line_number() - 1
+        marker = context[0].strip()
+        if len(marker) < 4:
+            self.state_correction(context)
+        transition = nodes.transition(rawsource=marker)
+        transition.line = lineno
+        self.parent += transition
+        return [], 'Body', []
+
+    def text(self, match, context, next_state):
+        """Potential over- & underlined title."""
+        lineno = self.state_machine.abs_line_number() - 1
+        overline = context[0]
+        title = match.string
+        underline = ''
+        try:
+            underline = self.state_machine.next_line()
+        except EOFError:
+            blocktext = overline + '\n' + title
+            if len(overline.rstrip()) < 4:
+                self.short_overline(context, blocktext, lineno, 2)
+            else:
+                msg = self.reporter.severe(
+                    'Incomplete section title.',
+                    nodes.literal_block(blocktext, blocktext), line=lineno)
+                self.parent += msg
+                return [], 'Body', []
+        source = '%s\n%s\n%s' % (overline, title, underline)
+        overline = overline.rstrip()
+        underline = underline.rstrip()
+        if not self.transitions['underline'][0].match(underline):
+            blocktext = overline + '\n' + title + '\n' + underline
+            if len(overline.rstrip()) < 4:
+                self.short_overline(context, blocktext, lineno, 2)
+            else:
+                msg = self.reporter.severe(
+                    'Missing matching underline for section title overline.',
+                    nodes.literal_block(source, source), line=lineno)
+                self.parent += msg
+                return [], 'Body', []
+        elif overline != underline:
+            blocktext = overline + '\n' + title + '\n' + underline
+            if len(overline.rstrip()) < 4:
+                self.short_overline(context, blocktext, lineno, 2)
+            else:
+                msg = self.reporter.severe(
+                      'Title overline & underline mismatch.',
+                      nodes.literal_block(source, source), line=lineno)
+                self.parent += msg
+                return [], 'Body', []
+        title = title.rstrip()
+        messages = []
+        if column_width(title) > len(overline):
+            blocktext = overline + '\n' + title + '\n' + underline
+            if len(overline.rstrip()) < 4:
+                self.short_overline(context, blocktext, lineno, 2)
+            else:
+                msg = self.reporter.warning(
+                      'Title overline too short.',
+                      nodes.literal_block(source, source), line=lineno)
+                messages.append(msg)
+        style = (overline[0], underline[0])
+        self.eofcheck = 0               # @@@ not sure this is correct
+        self.section(title.lstrip(), source, style, lineno + 1, messages)
+        self.eofcheck = 1
+        return [], 'Body', []
+
+    indent = text                       # indented title
+
+    def underline(self, match, context, next_state):
+        overline = context[0]
+        blocktext = overline + '\n' + self.state_machine.line
+        lineno = self.state_machine.abs_line_number() - 1
+        if len(overline.rstrip()) < 4:
+            self.short_overline(context, blocktext, lineno, 1)
+        msg = self.reporter.error(
+              'Invalid section title or transition marker.',
+              nodes.literal_block(blocktext, blocktext), line=lineno)
+        self.parent += msg
+        return [], 'Body', []
+
+    def short_overline(self, context, blocktext, lineno, lines=1):
+        msg = self.reporter.info(
+            'Possible incomplete section title.\nTreating the overline as '
+            "ordinary text because it's so short.", line=lineno)
+        self.parent += msg
+        self.state_correction(context, lines)
+
+    def state_correction(self, context, lines=1):
+        self.state_machine.previous_line(lines)
+        context[:] = []
+        raise statemachine.StateCorrection('Body', 'text')
+
+
+class QuotedLiteralBlock(RSTState):
+
+    """
+    Nested parse handler for quoted (unindented) literal blocks.
+
+    Special-purpose.  Not for inclusion in `state_classes`.
+    """
+
+    patterns = {'initial_quoted': r'(%(nonalphanum7bit)s)' % Body.pats,
+                'text': r''}
+    initial_transitions = ('initial_quoted', 'text')
+
+    def __init__(self, state_machine, debug=0):
+        RSTState.__init__(self, state_machine, debug)
+        self.messages = []
+        self.initial_lineno = None
+
+    def blank(self, match, context, next_state):
+        if context:
+            raise EOFError
+        else:
+            return context, next_state, []
+
+    def eof(self, context):
+        if context:
+            text = '\n'.join(context)
+            literal_block = nodes.literal_block(text, text)
+            literal_block.line = self.initial_lineno
+            self.parent += literal_block
+        else:
+            self.parent += self.reporter.warning(
+                'Literal block expected; none found.',
+                line=self.state_machine.abs_line_number())
+            self.state_machine.previous_line()
+        self.parent += self.messages
+        return []
+
+    def indent(self, match, context, next_state):
+        assert context, ('QuotedLiteralBlock.indent: context should not '
+                         'be empty!')
+        self.messages.append(
+            self.reporter.error('Unexpected indentation.',
+                                line=self.state_machine.abs_line_number()))
+        self.state_machine.previous_line()
+        raise EOFError
+
+    def initial_quoted(self, match, context, next_state):
+        """Match arbitrary quote character on the first line only."""
+        self.remove_transition('initial_quoted')
+        quote = match.string[0]
+        pattern = re.compile(re.escape(quote))
+        # New transition matches consistent quotes only:
+        self.add_transition('quoted',
+                            (pattern, self.quoted, self.__class__.__name__))
+        self.initial_lineno = self.state_machine.abs_line_number()
+        return [match.string], next_state, []
+
+    def quoted(self, match, context, next_state):
+        """Match consistent quotes on subsequent lines."""
+        context.append(match.string)
+        return context, next_state, []
+
+    def text(self, match, context, next_state):
+        if context:
+            self.messages.append(
+                self.reporter.error('Inconsistent literal block quoting.',
+                                    line=self.state_machine.abs_line_number()))
+            self.state_machine.previous_line()
+        raise EOFError
+
+
+state_classes = (Body, BulletList, DefinitionList, EnumeratedList, FieldList,
+                 OptionList, LineBlock, ExtensionOptions, Explicit, Text,
+                 Definition, Line, SubstitutionDef, RFC2822Body, RFC2822List)
+"""Standard set of State classes used to start `RSTStateMachine`."""
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/roles.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/roles.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/roles.py (revision 3)
@@ -0,0 +1,347 @@
+# Author: Edward Loper
+# Contact: edloper@gradient.cis.upenn.edu
+# Revision: $Revision: 3155 $
+# Date: $Date: 2005-04-02 23:57:06 +0200 (Sat, 02 Apr 2005) $
+# Copyright: This module has been placed in the public domain.
+
+"""
+This module defines standard interpreted text role functions, a registry for
+interpreted text roles, and an API for adding to and retrieving from the
+registry.
+
+The interface for interpreted role functions is as follows::
+
+    def role_fn(name, rawtext, text, lineno, inliner,
+                options={}, content=[]):
+        code...
+
+    # Set function attributes for customization:
+    role_fn.options = ...
+    role_fn.content = ...
+
+Parameters:
+
+- ``name`` is the local name of the interpreted text role, the role name
+  actually used in the document.
+
+- ``rawtext`` is a string containing the entire interpreted text construct.
+  Return it as a ``problematic`` node linked to a system message if there is a
+  problem.
+
+- ``text`` is the interpreted text content, with backslash escapes converted
+  to nulls (``\x00``).
+
+- ``lineno`` is the line number where the interpreted text beings.
+
+- ``inliner`` is the Inliner object that called the role function.
+  It defines the following useful attributes: ``reporter``,
+  ``problematic``, ``memo``, ``parent``, ``document``.
+
+- ``options``: A dictionary of directive options for customization, to be
+  interpreted by the role function.  Used for additional attributes for the
+  generated elements and other functionality.
+
+- ``content``: A list of strings, the directive content for customization
+  ("role" directive).  To be interpreted by the role function.
+
+Function attributes for customization, interpreted by the "role" directive:
+
+- ``options``: A dictionary, mapping known option names to conversion
+  functions such as `int` or `float`.  ``None`` or an empty dict implies no
+  options to parse.  Several directive option conversion functions are defined
+  in the `directives` module.
+
+  All role functions implicitly support the "class" option, unless disabled
+  with an explicit ``{'class': None}``.
+
+- ``content``: A boolean; true if content is allowed.  Client code must handle
+  the case where content is required but not supplied (an empty content list
+  will be supplied).
+
+Note that unlike directives, the "arguments" function attribute is not
+supported for role customization.  Directive arguments are handled by the
+"role" directive itself.
+
+Interpreted role functions return a tuple of two values:
+
+- A list of nodes which will be inserted into the document tree at the
+  point where the interpreted role was encountered (can be an empty
+  list).
+
+- A list of system messages, which will be inserted into the document tree
+  immediately after the end of the current inline block (can also be empty).
+"""
+
+__docformat__ = 'reStructuredText'
+
+from docutils import nodes, utils
+from docutils.parsers.rst import directives
+from docutils.parsers.rst.languages import en as _fallback_language_module
+
+DEFAULT_INTERPRETED_ROLE = 'title-reference'
+"""
+The canonical name of the default interpreted role.  This role is used
+when no role is specified for a piece of interpreted text.
+"""
+
+_role_registry = {}
+"""Mapping of canonical role names to role functions.  Language-dependent role
+names are defined in the ``language`` subpackage."""
+
+_roles = {}
+"""Mapping of local or language-dependent interpreted text role names to role
+functions."""
+
+def role(role_name, language_module, lineno, reporter):
+    """
+    Locate and return a role function from its language-dependent name, along
+    with a list of system messages.  If the role is not found in the current
+    language, check English.  Return a 2-tuple: role function (``None`` if the
+    named role cannot be found) and a list of system messages.
+    """
+    normname = role_name.lower()
+    messages = []
+    msg_text = []
+
+    if _roles.has_key(normname):
+        return _roles[normname], messages
+
+    if role_name:
+        canonicalname = None
+        try:
+            canonicalname = language_module.roles[normname]
+        except AttributeError, error:
+            msg_text.append('Problem retrieving role entry from language '
+                            'module %r: %s.' % (language_module, error))
+        except KeyError:
+            msg_text.append('No role entry for "%s" in module "%s".'
+                            % (role_name, language_module.__name__))
+    else:
+        canonicalname = DEFAULT_INTERPRETED_ROLE
+
+    # If we didn't find it, try English as a fallback.
+    if not canonicalname:
+        try:
+            canonicalname = _fallback_language_module.roles[normname]
+            msg_text.append('Using English fallback for role "%s".'
+                            % role_name)
+        except KeyError:
+            msg_text.append('Trying "%s" as canonical role name.'
+                            % role_name)
+            # The canonical name should be an English name, but just in case:
+            canonicalname = normname
+
+    # Collect any messages that we generated.
+    if msg_text:
+        message = reporter.info('\n'.join(msg_text), line=lineno)
+        messages.append(message)
+
+    # Look the role up in the registry, and return it.
+    if _role_registry.has_key(canonicalname):
+        role_fn = _role_registry[canonicalname]
+        register_local_role(normname, role_fn)
+        return role_fn, messages
+    else:
+        return None, messages # Error message will be generated by caller.
+
+def register_canonical_role(name, role_fn):
+    """
+    Register an interpreted text role by its canonical name.
+
+    :Parameters:
+      - `name`: The canonical name of the interpreted role.
+      - `role_fn`: The role function.  See the module docstring.
+    """
+    set_implicit_options(role_fn)
+    _role_registry[name] = role_fn
+
+def register_local_role(name, role_fn):
+    """
+    Register an interpreted text role by its local or language-dependent name.
+
+    :Parameters:
+      - `name`: The local or language-dependent name of the interpreted role.
+      - `role_fn`: The role function.  See the module docstring.
+    """
+    set_implicit_options(role_fn)
+    _roles[name] = role_fn
+
+def set_implicit_options(role_fn):
+    """
+    Add customization options to role functions, unless explicitly set or
+    disabled.
+    """
+    if not hasattr(role_fn, 'options') or role_fn.options is None:
+        role_fn.options = {'class': directives.class_option}
+    elif not role_fn.options.has_key('class'):
+        role_fn.options['class'] = directives.class_option
+
+def register_generic_role(canonical_name, node_class):
+    """For roles which simply wrap a given `node_class` around the text."""
+    role = GenericRole(canonical_name, node_class)
+    register_canonical_role(canonical_name, role)
+
+
+class GenericRole:
+
+    """
+    Generic interpreted text role, where the interpreted text is simply
+    wrapped with the provided node class.
+    """
+
+    def __init__(self, role_name, node_class):
+        self.name = role_name
+        self.node_class = node_class
+
+    def __call__(self, role, rawtext, text, lineno, inliner,
+                 options={}, content=[]):
+        set_classes(options)
+        return [self.node_class(rawtext, utils.unescape(text), **options)], []
+
+
+class CustomRole:
+
+    """
+    Wrapper for custom interpreted text roles.
+    """
+
+    def __init__(self, role_name, base_role, options={}, content=[]):
+        self.name = role_name
+        self.base_role = base_role
+        self.options = None
+        if hasattr(base_role, 'options'):
+            self.options = base_role.options
+        self.content = None
+        if hasattr(base_role, 'content'):
+            self.content = base_role.content
+        self.supplied_options = options
+        self.supplied_content = content
+
+    def __call__(self, role, rawtext, text, lineno, inliner,
+                 options={}, content=[]):
+        opts = self.supplied_options.copy()
+        opts.update(options)
+        cont = list(self.supplied_content)
+        if cont and content:
+            cont += '\n'
+        cont.extend(content)
+        return self.base_role(role, rawtext, text, lineno, inliner,
+                              options=opts, content=cont)
+
+
+def generic_custom_role(role, rawtext, text, lineno, inliner,
+                        options={}, content=[]):
+    """"""
+    # Once nested inline markup is implemented, this and other methods should
+    # recursively call inliner.nested_parse().
+    set_classes(options)
+    return [nodes.inline(rawtext, utils.unescape(text), **options)], []
+
+generic_custom_role.options = {'class': directives.class_option}
+
+
+######################################################################
+# Define and register the standard roles:
+######################################################################
+
+register_generic_role('abbreviation', nodes.abbreviation)
+register_generic_role('acronym', nodes.acronym)
+register_generic_role('emphasis', nodes.emphasis)
+register_generic_role('literal', nodes.literal)
+register_generic_role('strong', nodes.strong)
+register_generic_role('subscript', nodes.subscript)
+register_generic_role('superscript', nodes.superscript)
+register_generic_role('title-reference', nodes.title_reference)
+
+def pep_reference_role(role, rawtext, text, lineno, inliner,
+                       options={}, content=[]):
+    try:
+        pepnum = int(text)
+        if pepnum < 0 or pepnum > 9999:
+            raise ValueError
+    except ValueError:
+        msg = inliner.reporter.error(
+            'PEP number must be a number from 0 to 9999; "%s" is invalid.'
+            % text, line=lineno)
+        prb = inliner.problematic(rawtext, rawtext, msg)
+        return [prb], [msg]
+    # Base URL mainly used by inliner.pep_reference; so this is correct:
+    ref = inliner.document.settings.pep_base_url + inliner.pep_url % pepnum
+    set_classes(options)
+    return [nodes.reference(rawtext, 'PEP ' + utils.unescape(text), refuri=ref,
+                            **options)], []
+
+register_canonical_role('pep-reference', pep_reference_role)
+
+def rfc_reference_role(role, rawtext, text, lineno, inliner,
+                       options={}, content=[]):
+    try:
+        rfcnum = int(text)
+        if rfcnum <= 0:
+            raise ValueError
+    except ValueError:
+        msg = inliner.reporter.error(
+            'RFC number must be a number greater than or equal to 1; '
+            '"%s" is invalid.' % text, line=lineno)
+        prb = inliner.problematic(rawtext, rawtext, msg)
+        return [prb], [msg]
+    # Base URL mainly used by inliner.rfc_reference, so this is correct:
+    ref = inliner.document.settings.rfc_base_url + inliner.rfc_url % rfcnum
+    set_classes(options)
+    node = nodes.reference(rawtext, 'RFC ' + utils.unescape(text), refuri=ref,
+                           **options)
+    return [node], []
+
+register_canonical_role('rfc-reference', rfc_reference_role)
+
+def raw_role(role, rawtext, text, lineno, inliner, options={}, content=[]):
+    if not options.has_key('format'):
+        msg = inliner.reporter.error(
+            'No format (Writer name) is associated with this role: "%s".\n'
+            'The "raw" role cannot be used directly.\n'
+            'Instead, use the "role" directive to create a new role with '
+            'an associated format.' % role, line=lineno)
+        prb = inliner.problematic(rawtext, rawtext, msg)
+        return [prb], [msg]
+    set_classes(options)
+    node = nodes.raw(rawtext, utils.unescape(text, 1), **options)
+    return [node], []
+
+raw_role.options = {'format': directives.unchanged}
+
+register_canonical_role('raw', raw_role)
+
+
+######################################################################
+# Register roles that are currently unimplemented.
+######################################################################
+
+def unimplemented_role(role, rawtext, text, lineno, inliner, attributes={}):
+    msg = inliner.reporter.error(
+        'Interpreted text role "%s" not implemented.' % role, line=lineno)
+    prb = inliner.problematic(rawtext, rawtext, msg)
+    return [prb], [msg]
+
+register_canonical_role('index', unimplemented_role)
+register_canonical_role('named-reference', unimplemented_role)
+register_canonical_role('anonymous-reference', unimplemented_role)
+register_canonical_role('uri-reference', unimplemented_role)
+register_canonical_role('footnote-reference', unimplemented_role)
+register_canonical_role('citation-reference', unimplemented_role)
+register_canonical_role('substitution-reference', unimplemented_role)
+register_canonical_role('target', unimplemented_role)
+
+# This should remain unimplemented, for testing purposes:
+register_canonical_role('restructuredtext-unimplemented-role',
+                        unimplemented_role)
+
+
+def set_classes(options):
+    """
+    Auxiliary function to set options['classes'] and delete
+    options['class'].
+    """
+    if options.has_key('class'):
+        assert not options.has_key('classes')
+        options['classes'] = options['class']
+        del options['class']
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/tableparser.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/tableparser.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/parsers/rst/tableparser.py (revision 3)
@@ -0,0 +1,527 @@
+# Author: David Goodger
+# Contact: goodger@users.sourceforge.net
+# Revision: $Revision: 4152 $
+# Date: $Date: 2005-12-08 00:46:30 +0100 (Thu, 08 Dec 2005) $
+# Copyright: This module has been placed in the public domain.
+
+"""
+This module defines table parser classes,which parse plaintext-graphic tables
+and produce a well-formed data structure suitable for building a CALS table.
+
+:Classes:
+    - `GridTableParser`: Parse fully-formed tables represented with a grid.
+    - `SimpleTableParser`: Parse simple tables, delimited by top & bottom
+      borders.
+
+:Exception class: `TableMarkupError`
+
+:Function:
+    `update_dict_of_lists()`: Merge two dictionaries containing list values.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import re
+import sys
+from docutils import DataError
+
+
+class TableMarkupError(DataError): pass
+
+
+class TableParser:
+
+    """
+    Abstract superclass for the common parts of the syntax-specific parsers.
+    """
+
+    head_body_separator_pat = None
+    """Matches the row separator between head rows and body rows."""
+
+    double_width_pad_char = '\x00'
+    """Padding character for East Asian double-width text."""
+
+    def parse(self, block):
+        """
+        Analyze the text `block` and return a table data structure.
+
+        Given a plaintext-graphic table in `block` (list of lines of text; no
+        whitespace padding), parse the table, construct and return the data
+        necessary to construct a CALS table or equivalent.
+
+        Raise `TableMarkupError` if there is any problem with the markup.
+        """
+        self.setup(block)
+        self.find_head_body_sep()
+        self.parse_table()
+        structure = self.structure_from_cells()
+        return structure
+
+    def find_head_body_sep(self):
+        """Look for a head/body row separator line; store the line index."""
+        for i in range(len(self.block)):
+            line = self.block[i]
+            if self.head_body_separator_pat.match(line):
+                if self.head_body_sep:
+                    raise TableMarkupError(
+                        'Multiple head/body row separators in table (at line '
+                        'offset %s and %s); only one allowed.'
+                        % (self.head_body_sep, i))
+                else:
+                    self.head_body_sep = i
+                    self.block[i] = line.replace('=', '-')
+        if self.head_body_sep == 0 or self.head_body_sep == (len(self.block)
+                                                             - 1):
+            raise TableMarkupError('The head/body row separator may not be '
+                                   'the first or last line of the table.')
+
+
+class GridTableParser(TableParser):
+
+    """
+    Parse a grid table using `parse()`.
+
+    Here's an example of a grid table::
+
+        +------------------------+------------+----------+----------+
+        | Header row, column 1   | Header 2   | Header 3 | Header 4 |
+        +========================+============+==========+==========+
+        | body row 1, column 1   | column 2   | column 3 | column 4 |
+        +------------------------+------------+----------+----------+
+        | body row 2             | Cells may span columns.          |
+        +------------------------+------------+---------------------+
+        | body row 3             | Cells may  | - Table cells       |
+        +------------------------+ span rows. | - contain           |
+        | body row 4             |            | - body elements.    |
+        +------------------------+------------+---------------------+
+
+    Intersections use '+', row separators use '-' (except for one optional
+    head/body row separator, which uses '='), and column separators use '|'.
+
+    Passing the above table to the `parse()` method will result in the
+    following data structure::
+
+        ([24, 12, 10, 10],
+         [[(0, 0, 1, ['Header row, column 1']),
+           (0, 0, 1, ['Header 2']),
+           (0, 0, 1, ['Header 3']),
+           (0, 0, 1, ['Header 4'])]],
+         [[(0, 0, 3, ['body row 1, column 1']),
+           (0, 0, 3, ['column 2']),
+           (0, 0, 3, ['column 3']),
+           (0, 0, 3, ['column 4'])],
+          [(0, 0, 5, ['body row 2']),
+           (0, 2, 5, ['Cells may span columns.']),
+           None,
+           None],
+          [(0, 0, 7, ['body row 3']),
+           (1, 0, 7, ['Cells may', 'span rows.', '']),
+           (1, 1, 7, ['- Table cells', '- contain', '- body elements.']),
+           None],
+          [(0, 0, 9, ['body row 4']), None, None, None]])
+
+    The first item is a list containing column widths (colspecs). The second
+    item is a list of head rows, and the third is a list of body rows. Each
+    row contains a list of cells. Each cell is either None (for a cell unused
+    because of another cell's span), or a tuple. A cell tuple contains four
+    items: the number of extra rows used by the cell in a vertical span
+    (morerows); the number of extra columns used by the cell in a horizontal
+    span (morecols); the line offset of the first line of the cell contents;
+    and the cell contents, a list of lines of text.
+    """
+
+    head_body_separator_pat = re.compile(r'\+=[=+]+=\+ *$')
+
+    def setup(self, block):
+        self.block = block[:]           # make a copy; it may be modified
+        self.block.disconnect()         # don't propagate changes to parent
+        self.bottom = len(block) - 1
+        self.right = len(block[0]) - 1
+        self.head_body_sep = None
+        self.done = [-1] * len(block[0])
+        self.cells = []
+        self.rowseps = {0: [0]}
+        self.colseps = {0: [0]}
+
+    def parse_table(self):
+        """
+        Start with a queue of upper-left corners, containing the upper-left
+        corner of the table itself. Trace out one rectangular cell, remember
+        it, and add its upper-right and lower-left corners to the queue of
+        potential upper-left corners of further cells. Process the queue in
+        top-to-bottom order, keeping track of how much of each text column has
+        been seen.
+
+        We'll end up knowing all the row and column boundaries, cell positions
+        and their dimensions.
+        """
+        corners = [(0, 0)]
+        while corners:
+            top, left = corners.pop(0)
+            if top == self.bottom or left == self.right \
+                  or top <= self.done[left]:
+                continue
+            result = self.scan_cell(top, left)
+            if not result:
+                continue
+            bottom, right, rowseps, colseps = result
+            update_dict_of_lists(self.rowseps, rowseps)
+            update_dict_of_lists(self.colseps, colseps)
+            self.mark_done(top, left, bottom, right)
+            cellblock = self.block.get_2D_block(top + 1, left + 1,
+                                                bottom, right)
+            cellblock.disconnect()      # lines in cell can't sync with parent
+            cellblock.replace(self.double_width_pad_char, '')
+            self.cells.append((top, left, bottom, right, cellblock))
+            corners.extend([(top, right), (bottom, left)])
+            corners.sort()
+        if not self.check_parse_complete():
+            raise TableMarkupError('Malformed table; parse incomplete.')
+
+    def mark_done(self, top, left, bottom, right):
+        """For keeping track of how much of each text column has been seen."""
+        before = top - 1
+        after = bottom - 1
+        for col in range(left, right):
+            assert self.done[col] == before
+            self.done[col] = after
+
+    def check_parse_complete(self):
+        """Each text column should have been completely seen."""
+        last = self.bottom - 1
+        for col in range(self.right):
+            if self.done[col] != last:
+                return None
+        return 1
+
+    def scan_cell(self, top, left):
+        """Starting at the top-left corner, start tracing out a cell."""
+        assert self.block[top][left] == '+'
+        result = self.scan_right(top, left)
+        return result
+
+    def scan_right(self, top, left):
+        """
+        Look for the top-right corner of the cell, and make note of all column
+        boundaries ('+').
+        """
+        colseps = {}
+        line = self.block[top]
+        for i in range(left + 1, self.right + 1):
+            if line[i] == '+':
+                colseps[i] = [top]
+                result = self.scan_down(top, left, i)
+                if result:
+                    bottom, rowseps, newcolseps = result
+                    update_dict_of_lists(colseps, newcolseps)
+                    return bottom, i, rowseps, colseps
+            elif line[i] != '-':
+                return None
+        return None
+
+    def scan_down(self, top, left, right):
+        """
+        Look for the bottom-right corner of the cell, making note of all row
+        boundaries.
+        """
+        rowseps = {}
+        for i in range(top + 1, self.bottom + 1):
+            if self.block[i][right] == '+':
+                rowseps[i] = [right]
+                result = self.scan_left(top, left, i, right)
+                if result:
+                    newrowseps, colseps = result
+                    update_dict_of_lists(rowseps, newrowseps)
+                    return i, rowseps, colseps
+            elif self.block[i][right] != '|':
+                return None
+        return None
+
+    def scan_left(self, top, left, bottom, right):
+        """
+        Noting column boundaries, look for the bottom-left corner of the cell.
+        It must line up with the starting point.
+        """
+        colseps = {}
+        line = self.block[bottom]
+        for i in range(right - 1, left, -1):
+            if line[i] == '+':
+                colseps[i] = [bottom]
+            elif line[i] != '-':
+                return None
+        if line[left] != '+':
+            return None
+        result = self.scan_up(top, left, bottom, right)
+        if result is not None:
+            rowseps = result
+            return rowseps, colseps
+        return None
+
+    def scan_up(self, top, left, bottom, right):
+        """
+        Noting row boundaries, see if we can return to the starting point.
+        """
+        rowseps = {}
+        for i in range(bottom - 1, top, -1):
+            if self.block[i][left] == '+':
+                rowseps[i] = [left]
+            elif self.block[i][left] != '|':
+                return None
+        return rowseps
+
+    def structure_from_cells(self):
+        """
+        From the data collected by `scan_cell()`, convert to the final data
+        structure.
+        """
+        rowseps = self.rowseps.keys()   # list of row boundaries
+        rowseps.sort()
+        rowindex = {}
+        for i in range(len(rowseps)):
+            rowindex[rowseps[i]] = i    # row boundary -> row number mapping
+        colseps = self.colseps.keys()   # list of column boundaries
+        colseps.sort()
+        colindex = {}
+        for i in range(len(colseps)):
+            colindex[colseps[i]] = i    # column boundary -> col number map
+        colspecs = [(colseps[i] - colseps[i - 1] - 1)
+                    for i in range(1, len(colseps))] # list of column widths
+        # prepare an empty table with the correct number of rows & columns
+        onerow = [None for i in range(len(colseps) - 1)]
+        rows = [onerow[:] for i in range(len(rowseps) - 1)]
+        # keep track of # of cells remaining; should reduce to zero
+        remaining = (len(rowseps) - 1) * (len(colseps) - 1)
+        for top, left, bottom, right, block in self.cells:
+            rownum = rowindex[top]
+            colnum = colindex[left]
+            assert rows[rownum][colnum] is None, (
+                  'Cell (row %s, column %s) already used.'
+                  % (rownum + 1, colnum + 1))
+            morerows = rowindex[bottom] - rownum - 1
+            morecols = colindex[right] - colnum - 1
+            remaining -= (morerows + 1) * (morecols + 1)
+            # write the cell into the table
+            rows[rownum][colnum] = (morerows, morecols, top + 1, block)
+        assert remaining == 0, 'Unused cells remaining.'
+        if self.head_body_sep:          # separate head rows from body rows
+            numheadrows = rowindex[self.head_body_sep]
+            headrows = rows[:numheadrows]
+            bodyrows = rows[numheadrows:]
+        else:
+            headrows = []
+            bodyrows = rows
+        return (colspecs, headrows, bodyrows)
+
+
+class SimpleTableParser(TableParser):
+
+    """
+    Parse a simple table using `parse()`.
+
+    Here's an example of a simple table::
+
+        =====  =====
+        col 1  col 2
+        =====  =====
+        1      Second column of row 1.
+        2      Second column of row 2.
+               Second line of paragraph.
+        3      - Second column of row 3.
+
+               - Second item in bullet
+                 list (row 3, column 2).
+        4 is a span
+        ------------
+        5
+        =====  =====
+
+    Top and bottom borders use '=', column span underlines use '-', column
+    separation is indicated with spaces.
+
+    Passing the above table to the `parse()` method will result in the
+    following data structure, whose interpretation is the same as for
+    `GridTableParser`::
+
+        ([5, 25],
+         [[(0, 0, 1, ['col 1']),
+           (0, 0, 1, ['col 2'])]],
+         [[(0, 0, 3, ['1']),
+           (0, 0, 3, ['Second column of row 1.'])],
+          [(0, 0, 4, ['2']),
+           (0, 0, 4, ['Second column of row 2.',
+                      'Second line of paragraph.'])],
+          [(0, 0, 6, ['3']),
+           (0, 0, 6, ['- Second column of row 3.',
+                      '',
+                      '- Second item in bullet',
+                      '  list (row 3, column 2).'])],
+          [(0, 1, 10, ['4 is a span'])],
+          [(0, 0, 12, ['5']),
+           (0, 0, 12, [''])]])
+    """
+
+    head_body_separator_pat = re.compile('=[ =]*$')
+    span_pat = re.compile('-[ -]*$')
+
+    def setup(self, block):
+        self.block = block[:]           # make a copy; it will be modified
+        self.block.disconnect()         # don't propagate changes to parent
+        # Convert top & bottom borders to column span underlines:
+        self.block[0] = self.block[0].replace('=', '-')
+        self.block[-1] = self.block[-1].replace('=', '-')
+        self.head_body_sep = None
+        self.columns = []
+        self.border_end = None
+        self.table = []
+        self.done = [-1] * len(block[0])
+        self.rowseps = {0: [0]}
+        self.colseps = {0: [0]}
+
+    def parse_table(self):
+        """
+        First determine the column boundaries from the top border, then
+        process rows.  Each row may consist of multiple lines; accumulate
+        lines until a row is complete.  Call `self.parse_row` to finish the
+        job.
+        """
+        # Top border must fully describe all table columns.
+        self.columns = self.parse_columns(self.block[0], 0)
+        self.border_end = self.columns[-1][1]
+        firststart, firstend = self.columns[0]
+        offset = 1                      # skip top border
+        start = 1
+        text_found = None
+        while offset < len(self.block):
+            line = self.block[offset]
+            if self.span_pat.match(line):
+                # Column span underline or border; row is complete.
+                self.parse_row(self.block[start:offset], start,
+                               (line.rstrip(), offset))
+                start = offset + 1
+                text_found = None
+            elif line[firststart:firstend].strip():
+                # First column not blank, therefore it's a new row.
+                if text_found and offset != start:
+                    self.parse_row(self.block[start:offset], start)
+                start = offset
+                text_found = 1
+            elif not text_found:
+                start = offset + 1
+            offset += 1
+
+    def parse_columns(self, line, offset):
+        """
+        Given a column span underline, return a list of (begin, end) pairs.
+        """
+        cols = []
+        end = 0
+        while 1:
+            begin = line.find('-', end)
+            end = line.find(' ', begin)
+            if begin < 0:
+                break
+            if end < 0:
+                end = len(line)
+            cols.append((begin, end))
+        if self.columns:
+            if cols[-1][1] != self.border_end:
+                raise TableMarkupError('Column span incomplete at line '
+                                       'offset %s.' % offset)
+            # Allow for an unbounded rightmost column:
+            cols[-1] = (cols[-1][0], self.columns[-1][1])
+        return cols
+
+    def init_row(self, colspec, offset):
+        i = 0
+        cells = []
+        for start, end in colspec:
+            morecols = 0
+            try:
+                assert start == self.columns[i][0]
+                while end != self.columns[i][1]:
+                    i += 1
+                    morecols += 1
+            except (AssertionError, IndexError):
+                raise TableMarkupError('Column span alignment problem at '
+                                       'line offset %s.' % (offset + 1))
+            cells.append([0, morecols, offset, []])
+            i += 1
+        return cells
+
+    def parse_row(self, lines, start, spanline=None):
+        """
+        Given the text `lines` of a row, parse it and append to `self.table`.
+
+        The row is parsed according to the current column spec (either
+        `spanline` if provided or `self.columns`).  For each column, extract
+        text from each line, and check for text in column margins.  Finally,
+        adjust for insigificant whitespace.
+        """
+        if not (lines or spanline):
+            # No new row, just blank lines.
+            return
+        if spanline:
+            columns = self.parse_columns(*spanline)
+            span_offset = spanline[1]
+        else:
+            columns = self.columns[:]
+            span_offset = start
+        self.check_columns(lines, start, columns)
+        row = self.init_row(columns, start)
+        for i in range(len(columns)):
+            start, end = columns[i]
+            cellblock = lines.get_2D_block(0, start, len(lines), end)
+            cellblock.disconnect()      # lines in cell can't sync with parent
+            cellblock.replace(self.double_width_pad_char, '')
+            row[i][3] = cellblock
+        self.table.append(row)
+
+    def check_columns(self, lines, first_line, columns):
+        """
+        Check for text in column margins and text overflow in the last column.
+        Raise TableMarkupError if anything but whitespace is in column margins.
+        Adjust the end value for the last column if there is text overflow.
+        """
+        # "Infinite" value for a dummy last column's beginning, used to
+        # check for text overflow:
+        columns.append((sys.maxint, None))
+        lastcol = len(columns) - 2
+        for i in range(len(columns) - 1):
+            start, end = columns[i]
+            nextstart = columns[i+1][0]
+            offset = 0
+            for line in lines:
+                if i == lastcol and line[end:].strip():
+                    text = line[start:].rstrip()
+                    new_end = start + len(text)
+                    columns[i] = (start, new_end)
+                    main_start, main_end = self.columns[-1]
+                    if new_end > main_end:
+                        self.columns[-1] = (main_start, new_end)
+                elif line[end:nextstart].strip():
+                    raise TableMarkupError('Text in column margin at line '
+                                           'offset %s.' % (first_line + offset))
+                offset += 1
+        columns.pop()
+
+    def structure_from_cells(self):
+        colspecs = [end - start for start, end in self.columns]
+        first_body_row = 0
+        if self.head_body_sep:
+            for i in range(len(self.table)):
+                if self.table[i][0][2] > self.head_body_sep:
+                    first_body_row = i
+                    break
+        return (colspecs, self.table[:first_body_row],
+                self.table[first_body_row:])
+
+
+def update_dict_of_lists(master, newdata):
+    """
+    Extend the list values of `master` with those from `newdata`.
+
+    Both parameters must be dictionaries containing list values.
+    """
+    for key, values in newdata.items():
+        master.setdefault(key, []).extend(values)
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/null.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/null.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/null.py (revision 3)
@@ -0,0 +1,23 @@
+# Author: David Goodger
+# Contact: goodger@python.org
+# Revision: $Revision: 3892 $
+# Date: $Date: 2005-09-20 22:04:53 +0200 (Tue, 20 Sep 2005) $
+# Copyright: This module has been placed in the public domain.
+
+"""
+A do-nothing Writer.
+"""
+
+from docutils import writers
+
+
+class Writer(writers.UnfilteredWriter):
+
+    supported = ('null',)
+    """Formats this writer supports."""
+
+    config_section = 'null writer'
+    config_section_dependencies = ('writers',)
+
+    def translate(self):
+        pass
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/html4css1/__init__.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/html4css1/__init__.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/html4css1/__init__.py (revision 3)
@@ -0,0 +1,1601 @@
+# Author: David Goodger
+# Contact: goodger@users.sourceforge.net
+# Revision: $Revision: 4219 $
+# Date: $Date: 2005-12-15 15:32:01 +0100 (Thu, 15 Dec 2005) $
+# Copyright: This module has been placed in the public domain.
+
+"""
+Simple HyperText Markup Language document tree Writer.
+
+The output conforms to the XHTML version 1.0 Transitional DTD
+(*almost* strict).  The output contains a minimum of formatting
+information.  The cascading style sheet "html4css1.css" is required
+for proper viewing with a modern graphical browser.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import sys
+import os
+import os.path
+import time
+import re
+from types import ListType
+try:
+    import Image                        # check for the Python Imaging Library
+except ImportError:
+    Image = None
+import docutils
+from docutils import frontend, nodes, utils, writers, languages
+
+
+class Writer(writers.Writer):
+
+    supported = ('html', 'html4css1', 'xhtml')
+    """Formats this writer supports."""
+
+    default_stylesheet = 'html4css1.css'
+
+    default_stylesheet_path = utils.relative_path(
+        os.path.join(os.getcwd(), 'dummy'),
+        os.path.join(os.path.dirname(__file__), default_stylesheet))
+
+    settings_spec = (
+        'HTML-Specific Options',
+        None,
+        (('Specify a stylesheet URL, used verbatim.  Overrides '
+          '--stylesheet-path.',
+          ['--stylesheet'],
+          {'metavar': '<URL>', 'overrides': 'stylesheet_path'}),
+         ('Specify a stylesheet file, relative to the current working '
+          'directory.  The path is adjusted relative to the output HTML '
+          'file.  Overrides --stylesheet.  Default: "%s"'
+          % default_stylesheet_path,
+          ['--stylesheet-path'],
+          {'metavar': '<file>', 'overrides': 'stylesheet',
+           'default': default_stylesheet_path}),
+         ('Embed the stylesheet in the output HTML file.  The stylesheet '
+          'file must be accessible during processing (--stylesheet-path is '
+          'recommended).  This is the default.',
+          ['--embed-stylesheet'],
+          {'default': 1, 'action': 'store_true',
+           'validator': frontend.validate_boolean}),
+         ('Link to the stylesheet in the output HTML file.  Default: '
+          'embed the stylesheet, do not link to it.',
+          ['--link-stylesheet'],
+          {'dest': 'embed_stylesheet', 'action': 'store_false',
+           'validator': frontend.validate_boolean}),
+         ('Specify the initial header level.  Default is 1 for "<h1>".  '
+          'Does not affect document title & subtitle (see --no-doc-title).',
+          ['--initial-header-level'],
+          {'choices': '1 2 3 4 5 6'.split(), 'default': '1',
+           'metavar': '<level>'}),
+         ('Specify the maximum width (in characters) for one-column field '
+          'names.  Longer field names will span an entire row of the table '
+          'used to render the field list.  Default is 14 characters.  '
+          'Use 0 for "no limit".',
+          ['--field-name-limit'],
+          {'default': 14, 'metavar': '<level>',
+           'validator': frontend.validate_nonnegative_int}),
+         ('Specify the maximum width (in characters) for options in option '
+          'lists.  Longer options will span an entire row of the table used '
+          'to render the option list.  Default is 14 characters.  '
+          'Use 0 for "no limit".',
+          ['--option-limit'],
+          {'default': 14, 'metavar': '<level>',
+           'validator': frontend.validate_nonnegative_int}),
+         ('Format for footnote references: one of "superscript" or '
+          '"brackets".  Default is "brackets".',
+          ['--footnote-references'],
+          {'choices': ['superscript', 'brackets'], 'default': 'brackets',
+           'metavar': '<format>',
+           'overrides': 'trim_footnote_reference_space'}),
+         ('Format for block quote attributions: one of "dash" (em-dash '
+          'prefix), "parentheses"/"parens", or "none".  Default is "dash".',
+          ['--attribution'],
+          {'choices': ['dash', 'parentheses', 'parens', 'none'],
+           'default': 'dash', 'metavar': '<format>'}),
+         ('Remove extra vertical whitespace between items of "simple" bullet '
+          'lists and enumerated lists.  Default: enabled.',
+          ['--compact-lists'],
+          {'default': 1, 'action': 'store_true',
+           'validator': frontend.validate_boolean}),
+         ('Disable compact simple bullet and enumerated lists.',
+          ['--no-compact-lists'],
+          {'dest': 'compact_lists', 'action': 'store_false'}),
+         ('Remove extra vertical whitespace between items of simple field '
+          'lists.  Default: enabled.',
+          ['--compact-field-lists'],
+          {'default': 1, 'action': 'store_true',
+           'validator': frontend.validate_boolean}),
+         ('Disable compact simple field lists.',
+          ['--no-compact-field-lists'],
+          {'dest': 'compact_field_lists', 'action': 'store_false'}),
+         ('Omit the XML declaration.  Use with caution.',
+          ['--no-xml-declaration'],
+          {'dest': 'xml_declaration', 'default': 1, 'action': 'store_false',
+           'validator': frontend.validate_boolean}),
+         ('Obfuscate email addresses to confuse harvesters while still '
+          'keeping email links usable with standards-compliant browsers.',
+          ['--cloak-email-addresses'],
+          {'action': 'store_true', 'validator': frontend.validate_boolean}),))
+
+    settings_defaults = {'output_encoding_error_handler': 'xmlcharrefreplace'}
+
+    relative_path_settings = ('stylesheet_path',)
+
+    config_section = 'html4css1 writer'
+    config_section_dependencies = ('writers',)
+
+    def __init__(self):
+        writers.Writer.__init__(self)
+        self.translator_class = HTMLTranslator
+
+    def translate(self):
+        self.visitor = visitor = self.translator_class(self.document)
+        self.document.walkabout(visitor)
+        self.output = visitor.astext()
+        for attr in ('head_prefix', 'stylesheet', 'head', 'body_prefix',
+                     'body_pre_docinfo', 'docinfo', 'body', 'fragment',
+                     'body_suffix'):
+            setattr(self, attr, getattr(visitor, attr))
+
+    def assemble_parts(self):
+        writers.Writer.assemble_parts(self)
+        for part in ('title', 'subtitle', 'docinfo', 'body', 'header',
+                     'footer', 'meta', 'stylesheet', 'fragment',
+                     'html_prolog', 'html_head', 'html_title', 'html_subtitle',
+                     'html_body'):
+            self.parts[part] = ''.join(getattr(self.visitor, part))
+
+
+class HTMLTranslator(nodes.NodeVisitor):
+
+    """
+    This HTML writer has been optimized to produce visually compact
+    lists (less vertical whitespace).  HTML's mixed content models
+    allow list items to contain "<li><p>body elements</p></li>" or
+    "<li>just text</li>" or even "<li>text<p>and body
+    elements</p>combined</li>", each with different effects.  It would
+    be best to stick with strict body elements in list items, but they
+    affect vertical spacing in browsers (although they really
+    shouldn't).
+
+    Here is an outline of the optimization:
+
+    - Check for and omit <p> tags in "simple" lists: list items
+      contain either a single paragraph, a nested simple list, or a
+      paragraph followed by a nested simple list.  This means that
+      this list can be compact:
+
+          - Item 1.
+          - Item 2.
+
+      But this list cannot be compact:
+
+          - Item 1.
+
+            This second paragraph forces space between list items.
+
+          - Item 2.
+
+    - In non-list contexts, omit <p> tags on a paragraph if that
+      paragraph is the only child of its parent (footnotes & citations
+      are allowed a label first).
+
+    - Regardless of the above, in definitions, table cells, field bodies,
+      option descriptions, and list items, mark the first child with
+      'class="first"' and the last child with 'class="last"'.  The stylesheet
+      sets the margins (top & bottom respectively) to 0 for these elements.
+
+    The ``no_compact_lists`` setting (``--no-compact-lists`` command-line
+    option) disables list whitespace optimization.
+    """
+
+    xml_declaration = '<?xml version="1.0" encoding="%s" ?>\n'
+    doctype = ('<!DOCTYPE html'
+               ' PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"'
+               ' "http://www.w3.org/TR/xhtml1/DTD/'
+               'xhtml1-transitional.dtd">\n')
+    head_prefix_template = ('<html xmlns="http://www.w3.org/1999/xhtml"'
+                            ' xml:lang="%s" lang="%s">\n<head>\n')
+    content_type = ('<meta http-equiv="Content-Type"'
+                    ' content="text/html; charset=%s" />\n')
+    generator = ('<meta name="generator" content="Docutils %s: '
+                 'http://docutils.sourceforge.net/" />\n')
+    stylesheet_link = '<link rel="stylesheet" href="%s" type="text/css" />\n'
+    embedded_stylesheet = '<style type="text/css">\n\n%s\n</style>\n'
+    named_tags = ['a', 'applet', 'form', 'frame', 'iframe', 'img', 'map']
+    words_and_spaces = re.compile(r'\S+| +|\n')
+
+    def __init__(self, document):
+        nodes.NodeVisitor.__init__(self, document)
+        self.settings = settings = document.settings
+        lcode = settings.language_code
+        self.language = languages.get_language(lcode)
+        self.meta = [self.content_type % settings.output_encoding,
+                     self.generator % docutils.__version__]
+        self.head_prefix = []
+        self.html_prolog = []
+        if settings.xml_declaration:
+            self.head_prefix.append(self.xml_declaration
+                                    % settings.output_encoding)
+            # encoding not interpolated:
+            self.html_prolog.append(self.xml_declaration)
+        self.head_prefix.extend([self.doctype,
+                                 self.head_prefix_template % (lcode, lcode)])
+        self.html_prolog.append(self.doctype)
+        self.head = self.meta[:]
+        stylesheet = utils.get_stylesheet_reference(settings)
+        self.stylesheet = []
+        if stylesheet:
+            if settings.embed_stylesheet:
+                stylesheet = utils.get_stylesheet_reference(
+                    settings, os.path.join(os.getcwd(), 'dummy'))
+                settings.record_dependencies.add(stylesheet)
+                stylesheet_text = open(stylesheet).read()
+                self.stylesheet = [self.embedded_stylesheet % stylesheet_text]
+            else:
+                self.stylesheet = [self.stylesheet_link
+                                   % self.encode(stylesheet)]
+        self.body_prefix = ['</head>\n<body>\n']
+        # document title, subtitle display
+        self.body_pre_docinfo = []
+        # author, date, etc.
+        self.docinfo = []
+        self.body = []
+        self.fragment = []
+        self.body_suffix = ['</body>\n</html>\n']
+        self.section_level = 0
+        self.initial_header_level = int(settings.initial_header_level)
+        # A heterogenous stack used in conjunction with the tree traversal.
+        # Make sure that the pops correspond to the pushes:
+        self.context = []
+        self.topic_classes = []
+        self.colspecs = []
+        self.compact_p = 1
+        self.compact_simple = None
+        self.compact_field_list = None
+        self.in_docinfo = None
+        self.in_sidebar = None
+        self.title = []
+        self.subtitle = []
+        self.header = []
+        self.footer = []
+        self.html_head = [self.content_type] # charset not interpolated
+        self.html_title = []
+        self.html_subtitle = []
+        self.html_body = []
+        self.in_document_title = 0
+        self.in_mailto = 0
+        self.author_in_authors = None
+
+    def astext(self):
+        return ''.join(self.head_prefix + self.head
+                       + self.stylesheet + self.body_prefix
+                       + self.body_pre_docinfo + self.docinfo
+                       + self.body + self.body_suffix)
+
+    def encode(self, text):
+        """Encode special characters in `text` & return."""
+        # @@@ A codec to do these and all other HTML entities would be nice.
+        text = text.replace("&", "&amp;")
+        text = text.replace("<", "&lt;")
+        text = text.replace('"', "&quot;")
+        text = text.replace(">", "&gt;")
+        text = text.replace("@", "&#64;") # may thwart some address harvesters
+        # Replace the non-breaking space character with the HTML entity:
+        text = text.replace(u'\u00a0', "&nbsp;")
+        return text
+
+    def cloak_mailto(self, uri):
+        """Try to hide a mailto: URL from harvesters."""
+        # Encode "@" using a URL octet reference (see RFC 1738).
+        # Further cloaking with HTML entities will be done in the
+        # `attval` function.
+        return uri.replace('@', '%40')
+
+    def cloak_email(self, addr):
+        """Try to hide the link text of a email link from harversters."""
+        # Surround at-signs and periods with <span> tags.  ("@" has
+        # already been encoded to "&#64;" by the `encode` method.)
+        addr = addr.replace('&#64;', '<span>&#64;</span>')
+        addr = addr.replace('.', '<span>&#46;</span>')
+        return addr
+
+    def attval(self, text,
+               whitespace=re.compile('[\n\r\t\v\f]')):
+        """Cleanse, HTML encode, and return attribute value text."""
+        encoded = self.encode(whitespace.sub(' ', text))
+        if self.in_mailto and self.settings.cloak_email_addresses:
+            # Cloak at-signs ("%40") and periods with HTML entities.
+            encoded = encoded.replace('%40', '&#37;&#52;&#48;')
+            encoded = encoded.replace('.', '&#46;')
+        return encoded
+
+    def starttag(self, node, tagname, suffix='\n', empty=0, **attributes):
+        """
+        Construct and return a start tag given a node (id & class attributes
+        are extracted), tag name, and optional attributes.
+        """
+        tagname = tagname.lower()
+        prefix = []
+        atts = {}
+        ids = []
+        for (name, value) in attributes.items():
+            atts[name.lower()] = value
+        classes = node.get('classes', [])
+        if atts.has_key('class'):
+            classes.append(atts['class'])
+        if classes:
+            atts['class'] = ' '.join(classes)
+        assert not atts.has_key('id')
+        ids.extend(node.get('ids', []))
+        if atts.has_key('ids'):
+            ids.extend(atts['ids'])
+            del atts['ids']
+        if ids:
+            atts['id'] = ids[0]
+            for id in ids[1:]:
+                # Add empty "span" elements for additional IDs.  Note
+                # that we cannot use empty "a" elements because there
+                # may be targets inside of references, but nested "a"
+                # elements aren't allowed in XHTML (even if they do
+                # not all have a "href" attribute).
+                if empty:
+                    # Empty tag.  Insert target right in front of element.
+                    prefix.append('<span id="%s"></span>' % id)
+                else:
+                    # Non-empty tag.  Place the auxiliary <span> tag
+                    # *inside* the element, as the first child.
+                    suffix += '<span id="%s"></span>' % id
+        # !!! next 2 lines to be removed in Docutils 0.5:
+        if atts.has_key('id') and tagname in self.named_tags:
+            atts['name'] = atts['id']   # for compatibility with old browsers
+        attlist = atts.items()
+        attlist.sort()
+        parts = [tagname]
+        for name, value in attlist:
+            # value=None was used for boolean attributes without
+            # value, but this isn't supported by XHTML.
+            assert value is not None
+            if isinstance(value, ListType):
+                values = [unicode(v) for v in value]
+                parts.append('%s="%s"' % (name.lower(),
+                                          self.attval(' '.join(values))))
+            else:
+                try:
+                    uval = unicode(value)
+                except TypeError:       # for Python 2.1 compatibility:
+                    uval = unicode(str(value))
+                parts.append('%s="%s"' % (name.lower(), self.attval(uval)))
+        if empty:
+            infix = ' /'
+        else:
+            infix = ''
+        return ''.join(prefix) + '<%s%s>' % (' '.join(parts), infix) + suffix
+
+    def emptytag(self, node, tagname, suffix='\n', **attributes):
+        """Construct and return an XML-compatible empty tag."""
+        return self.starttag(node, tagname, suffix, empty=1, **attributes)
+
+    # !!! to be removed in Docutils 0.5 (change calls to use "starttag"):
+    def start_tag_with_title(self, node, tagname, **atts):
+        """ID and NAME attributes will be handled in the title."""
+        node = {'classes': node.get('classes', [])}
+        return self.starttag(node, tagname, **atts)
+
+    def set_class_on_child(self, node, class_, index=0):
+        """
+        Set class `class_` on the visible child no. index of `node`.
+        Do nothing if node has fewer children than `index`.
+        """
+        children = [n for n in node if not isinstance(n, nodes.Invisible)]
+        try:
+            child = children[index]
+        except IndexError:
+            return
+        child['classes'].append(class_)
+
+    def set_first_last(self, node):
+        self.set_class_on_child(node, 'first', 0)
+        self.set_class_on_child(node, 'last', -1)
+
+    def visit_Text(self, node):
+        text = node.astext()
+        encoded = self.encode(text)
+        if self.in_mailto and self.settings.cloak_email_addresses:
+            encoded = self.cloak_email(encoded)
+        self.body.append(encoded)
+
+    def depart_Text(self, node):
+        pass
+
+    def visit_abbreviation(self, node):
+        # @@@ implementation incomplete ("title" attribute)
+        self.body.append(self.starttag(node, 'abbr', ''))
+
+    def depart_abbreviation(self, node):
+        self.body.append('</abbr>')
+
+    def visit_acronym(self, node):
+        # @@@ implementation incomplete ("title" attribute)
+        self.body.append(self.starttag(node, 'acronym', ''))
+
+    def depart_acronym(self, node):
+        self.body.append('</acronym>')
+
+    def visit_address(self, node):
+        self.visit_docinfo_item(node, 'address', meta=None)
+        self.body.append(self.starttag(node, 'pre', CLASS='address'))
+
+    def depart_address(self, node):
+        self.body.append('\n</pre>\n')
+        self.depart_docinfo_item()
+
+    def visit_admonition(self, node, name=''):
+        self.body.append(self.start_tag_with_title(
+            node, 'div', CLASS=(name or 'admonition')))
+        if name:
+            node.insert(0, nodes.title(name, self.language.labels[name]))
+        self.set_first_last(node)
+
+    def depart_admonition(self, node=None):
+        self.body.append('</div>\n')
+
+    def visit_attention(self, node):
+        self.visit_admonition(node, 'attention')
+
+    def depart_attention(self, node):
+        self.depart_admonition()
+
+    attribution_formats = {'dash': ('&mdash;', ''),
+                           'parentheses': ('(', ')'),
+                           'parens': ('(', ')'),
+                           'none': ('', '')}
+
+    def visit_attribution(self, node):
+        prefix, suffix = self.attribution_formats[self.settings.attribution]
+        self.context.append(suffix)
+        self.body.append(
+            self.starttag(node, 'p', prefix, CLASS='attribution'))
+
+    def depart_attribution(self, node):
+        self.body.append(self.context.pop() + '</p>\n')
+
+    def visit_author(self, node):
+        if isinstance(node.parent, nodes.authors):
+            if self.author_in_authors:
+                self.body.append('\n<br />')
+        else:
+            self.visit_docinfo_item(node, 'author')
+
+    def depart_author(self, node):
+        if isinstance(node.parent, nodes.authors):
+            self.author_in_authors += 1
+        else:
+            self.depart_docinfo_item()
+
+    def visit_authors(self, node):
+        self.visit_docinfo_item(node, 'authors')
+        self.author_in_authors = 0      # initialize counter
+
+    def depart_authors(self, node):
+        self.depart_docinfo_item()
+        self.author_in_authors = None
+
+    def visit_block_quote(self, node):
+        self.body.append(self.starttag(node, 'blockquote'))
+
+    def depart_block_quote(self, node):
+        self.body.append('</blockquote>\n')
+
+    def check_simple_list(self, node):
+        """Check for a simple list that can be rendered compactly."""
+        visitor = SimpleListChecker(self.document)
+        try:
+            node.walk(visitor)
+        except nodes.NodeFound:
+            return None
+        else:
+            return 1
+
+    def is_compactable(self, node):
+        return ('compact' in node['classes']
+                or (self.settings.compact_lists
+                    and 'open' not in node['classes']
+                    and (self.compact_simple
+                         or self.topic_classes == ['contents']
+                         or self.check_simple_list(node))))
+
+    def visit_bullet_list(self, node):
+        atts = {}
+        old_compact_simple = self.compact_simple
+        self.context.append((self.compact_simple, self.compact_p))
+        self.compact_p = None
+        self.compact_simple = self.is_compactable(node)
+        if self.compact_simple and not old_compact_simple:
+            atts['class'] = 'simple'
+        self.body.append(self.starttag(node, 'ul', **atts))
+
+    def depart_bullet_list(self, node):
+        self.compact_simple, self.compact_p = self.context.pop()
+        self.body.append('</ul>\n')
+
+    def visit_caption(self, node):
+        self.body.append(self.starttag(node, 'p', '', CLASS='caption'))
+
+    def depart_caption(self, node):
+        self.body.append('</p>\n')
+
+    def visit_caution(self, node):
+        self.visit_admonition(node, 'caution')
+
+    def depart_caution(self, node):
+        self.depart_admonition()
+
+    def visit_citation(self, node):
+        self.body.append(self.starttag(node, 'table',
+                                       CLASS='docutils citation',
+                                       frame="void", rules="none"))
+        self.body.append('<colgroup><col class="label" /><col /></colgroup>\n'
+                         '<tbody valign="top">\n'
+                         '<tr>')
+        self.footnote_backrefs(node)
+
+    def depart_citation(self, node):
+        self.body.append('</td></tr>\n'
+                         '</tbody>\n</table>\n')
+
+    def visit_citation_reference(self, node):
+        href = '#' + node['refid']
+        self.body.append(self.starttag(
+            node, 'a', '[', CLASS='citation-reference', href=href))
+
+    def depart_citation_reference(self, node):
+        self.body.append(']</a>')
+
+    def visit_classifier(self, node):
+        self.body.append(' <span class="classifier-delimiter">:</span> ')
+        self.body.append(self.starttag(node, 'span', '', CLASS='classifier'))
+
+    def depart_classifier(self, node):
+        self.body.append('</span>')
+
+    def visit_colspec(self, node):
+        self.colspecs.append(node)
+        # "stubs" list is an attribute of the tgroup element:
+        node.parent.stubs.append(node.attributes.get('stub'))
+
+    def depart_colspec(self, node):
+        pass
+
+    def write_colspecs(self):
+        width = 0
+        for node in self.colspecs:
+            width += node['colwidth']
+        for node in self.colspecs:
+            colwidth = int(node['colwidth'] * 100.0 / width + 0.5)
+            self.body.append(self.emptytag(node, 'col',
+                                           width='%i%%' % colwidth))
+        self.colspecs = []
+
+    def visit_comment(self, node,
+                      sub=re.compile('-(?=-)').sub):
+        """Escape double-dashes in comment text."""
+        self.body.append('<!-- %s -->\n' % sub('- ', node.astext()))
+        # Content already processed:
+        raise nodes.SkipNode
+
+    def visit_compound(self, node):
+        self.body.append(self.starttag(node, 'div', CLASS='compound'))
+        if len(node) > 1:
+            node[0]['classes'].append('compound-first')
+            node[-1]['classes'].append('compound-last')
+            for child in node[1:-1]:
+                child['classes'].append('compound-middle')
+
+    def depart_compound(self, node):
+        self.body.append('</div>\n')
+
+    def visit_container(self, node):
+        self.body.append(self.starttag(node, 'div', CLASS='container'))
+
+    def depart_container(self, node):
+        self.body.append('</div>\n')
+
+    def visit_contact(self, node):
+        self.visit_docinfo_item(node, 'contact', meta=None)
+
+    def depart_contact(self, node):
+        self.depart_docinfo_item()
+
+    def visit_copyright(self, node):
+        self.visit_docinfo_item(node, 'copyright')
+
+    def depart_copyright(self, node):
+        self.depart_docinfo_item()
+
+    def visit_danger(self, node):
+        self.visit_admonition(node, 'danger')
+
+    def depart_danger(self, node):
+        self.depart_admonition()
+
+    def visit_date(self, node):
+        self.visit_docinfo_item(node, 'date')
+
+    def depart_date(self, node):
+        self.depart_docinfo_item()
+
+    def visit_decoration(self, node):
+        pass
+
+    def depart_decoration(self, node):
+        pass
+
+    def visit_definition(self, node):
+        self.body.append('</dt>\n')
+        self.body.append(self.starttag(node, 'dd', ''))
+        self.set_first_last(node)
+
+    def depart_definition(self, node):
+        self.body.append('</dd>\n')
+
+    def visit_definition_list(self, node):
+        self.body.append(self.starttag(node, 'dl', CLASS='docutils'))
+
+    def depart_definition_list(self, node):
+        self.body.append('</dl>\n')
+
+    def visit_definition_list_item(self, node):
+        pass
+
+    def depart_definition_list_item(self, node):
+        pass
+
+    def visit_description(self, node):
+        self.body.append(self.starttag(node, 'td', ''))
+        self.set_first_last(node)
+
+    def depart_description(self, node):
+        self.body.append('</td>')
+
+    def visit_docinfo(self, node):
+        self.context.append(len(self.body))
+        self.body.append(self.starttag(node, 'table',
+                                       CLASS='docinfo',
+                                       frame="void", rules="none"))
+        self.body.append('<col class="docinfo-name" />\n'
+                         '<col class="docinfo-content" />\n'
+                         '<tbody valign="top">\n')
+        self.in_docinfo = 1
+
+    def depart_docinfo(self, node):
+        self.body.append('</tbody>\n</table>\n')
+        self.in_docinfo = None
+        start = self.context.pop()
+        self.docinfo = self.body[start:]
+        self.body = []
+
+    def visit_docinfo_item(self, node, name, meta=1):
+        if meta:
+            meta_tag = '<meta name="%s" content="%s" />\n' \
+                       % (name, self.attval(node.astext()))
+            self.add_meta(meta_tag)
+        self.body.append(self.starttag(node, 'tr', ''))
+        self.body.append('<th class="docinfo-name">%s:</th>\n<td>'
+                         % self.language.labels[name])
+        if len(node):
+            if isinstance(node[0], nodes.Element):
+                node[0]['classes'].append('first')
+            if isinstance(node[-1], nodes.Element):
+                node[-1]['classes'].append('last')
+
+    def depart_docinfo_item(self):
+        self.body.append('</td></tr>\n')
+
+    def visit_doctest_block(self, node):
+        self.body.append(self.starttag(node, 'pre', CLASS='doctest-block'))
+
+    def depart_doctest_block(self, node):
+        self.body.append('\n</pre>\n')
+
+    def visit_document(self, node):
+        self.head.append('<title>%s</title>\n'
+                         % self.encode(node.get('title', '')))
+
+    def depart_document(self, node):
+        self.fragment.extend(self.body)
+        self.body_prefix.append(self.starttag(node, 'div', CLASS='document'))
+        self.body_suffix.insert(0, '</div>\n')
+        # skip content-type meta tag with interpolated charset value:
+        self.html_head.extend(self.head[1:])
+        self.html_body.extend(self.body_prefix[1:] + self.body_pre_docinfo
+                              + self.docinfo + self.body
+                              + self.body_suffix[:-1])
+
+    def visit_emphasis(self, node):
+        self.body.append('<em>')
+
+    def depart_emphasis(self, node):
+        self.body.append('</em>')
+
+    def visit_entry(self, node):
+        atts = {'class': []}
+        if isinstance(node.parent.parent, nodes.thead):
+            atts['class'].append('head')
+        if node.parent.parent.parent.stubs[node.parent.column]:
+            # "stubs" list is an attribute of the tgroup element
+            atts['class'].append('stub')
+        if atts['class']:
+            tagname = 'th'
+            atts['class'] = ' '.join(atts['class'])
+        else:
+            tagname = 'td'
+            del atts['class']
+        node.parent.column += 1
+        if node.has_key('morerows'):
+            atts['rowspan'] = node['morerows'] + 1
+        if node.has_key('morecols'):
+            atts['colspan'] = node['morecols'] + 1
+            node.parent.column += node['morecols']
+        self.body.append(self.starttag(node, tagname, '', **atts))
+        self.context.append('</%s>\n' % tagname.lower())
+        if len(node) == 0:              # empty cell
+            self.body.append('&nbsp;')
+        self.set_first_last(node)
+
+    def depart_entry(self, node):
+        self.body.append(self.context.pop())
+
+    def visit_enumerated_list(self, node):
+        """
+        The 'start' attribute does not conform to HTML 4.01's strict.dtd, but
+        CSS1 doesn't help. CSS2 isn't widely enough supported yet to be
+        usable.
+        """
+        atts = {}
+        if node.has_key('start'):
+            atts['start'] = node['start']
+        if node.has_key('enumtype'):
+            atts['class'] = node['enumtype']
+        # @@@ To do: prefix, suffix. How? Change prefix/suffix to a
+        # single "format" attribute? Use CSS2?
+        old_compact_simple = self.compact_simple
+        self.context.append((self.compact_simple, self.compact_p))
+        self.compact_p = None
+        self.compact_simple = self.is_compactable(node)
+        if self.compact_simple and not old_compact_simple:
+            atts['class'] = (atts.get('class', '') + ' simple').strip()
+        self.body.append(self.starttag(node, 'ol', **atts))
+
+    def depart_enumerated_list(self, node):
+        self.compact_simple, self.compact_p = self.context.pop()
+        self.body.append('</ol>\n')
+
+    def visit_error(self, node):
+        self.visit_admonition(node, 'error')
+
+    def depart_error(self, node):
+        self.depart_admonition()
+
+    def visit_field(self, node):
+        self.body.append(self.starttag(node, 'tr', '', CLASS='field'))
+
+    def depart_field(self, node):
+        self.body.append('</tr>\n')
+
+    def visit_field_body(self, node):
+        self.body.append(self.starttag(node, 'td', '', CLASS='field-body'))
+        self.set_class_on_child(node, 'first', 0)
+        field = node.parent
+        if (self.compact_field_list or
+            isinstance(field.parent, nodes.docinfo) or
+            field.parent.index(field) == len(field.parent) - 1):
+            # If we are in a compact list, the docinfo, or if this is
+            # the last field of the field list, do not add vertical
+            # space after last element.
+            self.set_class_on_child(node, 'last', -1)
+
+    def depart_field_body(self, node):
+        self.body.append('</td>\n')
+
+    def visit_field_list(self, node):
+        self.context.append((self.compact_field_list, self.compact_p))
+        self.compact_p = None
+        if 'compact' in node['classes']:
+            self.compact_field_list = 1
+        elif (self.settings.compact_field_lists
+              and 'open' not in node['classes']):
+            self.compact_field_list = 1
+        if self.compact_field_list:
+            for field in node:
+                field_body = field[-1]
+                assert isinstance(field_body, nodes.field_body)
+                children = [n for n in field_body
+                            if not isinstance(n, nodes.Invisible)]
+                if not (len(children) == 0 or
+                        len(children) == 1 and
+                        isinstance(children[0], nodes.paragraph)):
+                    self.compact_field_list = 0
+                    break
+        self.body.append(self.starttag(node, 'table', frame='void',
+                                       rules='none',
+                                       CLASS='docutils field-list'))
+        self.body.append('<col class="field-name" />\n'
+                         '<col class="field-body" />\n'
+                         '<tbody valign="top">\n')
+
+    def depart_field_list(self, node):
+        self.body.append('</tbody>\n</table>\n')
+        self.compact_field_list, self.compact_p = self.context.pop()
+
+    def visit_field_name(self, node):
+        atts = {}
+        if self.in_docinfo:
+            atts['class'] = 'docinfo-name'
+        else:
+            atts['class'] = 'field-name'
+        if ( self.settings.field_name_limit
+             and len(node.astext()) > self.settings.field_name_limit):
+            atts['colspan'] = 2
+            self.context.append('</tr>\n<tr><td>&nbsp;</td>')
+        else:
+            self.context.append('')
+        self.body.append(self.starttag(node, 'th', '', **atts))
+
+    def depart_field_name(self, node):
+        self.body.append(':</th>')
+        self.body.append(self.context.pop())
+
+    def visit_figure(self, node):
+        atts = {'class': 'figure'}
+        if node.get('width'):
+            atts['style'] = 'width: %spx' % node['width']
+        if node.get('align'):
+            atts['align'] = node['align']
+        self.body.append(self.starttag(node, 'div', **atts))
+
+    def depart_figure(self, node):
+        self.body.append('</div>\n')
+
+    def visit_footer(self, node):
+        self.context.append(len(self.body))
+
+    def depart_footer(self, node):
+        start = self.context.pop()
+        footer = [self.starttag(node, 'div', CLASS='footer'),
+                  '<hr class="footer" />\n']
+        footer.extend(self.body[start:])
+        footer.append('\n</div>\n')
+        self.footer.extend(footer)
+        self.body_suffix[:0] = footer
+        del self.body[start:]
+
+    def visit_footnote(self, node):
+        self.body.append(self.starttag(node, 'table',
+                                       CLASS='docutils footnote',
+                                       frame="void", rules="none"))
+        self.body.append('<colgroup><col class="label" /><col /></colgroup>\n'
+                         '<tbody valign="top">\n'
+                         '<tr>')
+        self.footnote_backrefs(node)
+
+    def footnote_backrefs(self, node):
+        backlinks = []
+        backrefs = node['backrefs']
+        if self.settings.footnote_backlinks and backrefs:
+            if len(backrefs) == 1:
+                self.context.append('')
+                self.context.append(
+                    '<a class="fn-backref" href="#%s" name="%s">'
+                    % (backrefs[0], node['ids'][0]))
+            else:
+                i = 1
+                for backref in backrefs:
+                    backlinks.append('<a class="fn-backref" href="#%s">%s</a>'
+                                     % (backref, i))
+                    i += 1
+                self.context.append('<em>(%s)</em> ' % ', '.join(backlinks))
+                self.context.append('<a name="%s">' % node['ids'][0])
+        else:
+            self.context.append('')
+            self.context.append('<a name="%s">' % node['ids'][0])
+        # If the node does not only consist of a label.
+        if len(node) > 1:
+            # If there are preceding backlinks, we do not set class
+            # 'first', because we need to retain the top-margin.
+            if not backlinks:
+                node[1]['classes'].append('first')
+            node[-1]['classes'].append('last')
+
+    def depart_footnote(self, node):
+        self.body.append('</td></tr>\n'
+                         '</tbody>\n</table>\n')
+
+    def visit_footnote_reference(self, node):
+        href = '#' + node['refid']
+        format = self.settings.footnote_references
+        if format == 'brackets':
+            suffix = '['
+            self.context.append(']')
+        else:
+            assert format == 'superscript'
+            suffix = '<sup>'
+            self.context.append('</sup>')
+        self.body.append(self.starttag(node, 'a', suffix,
+                                       CLASS='footnote-reference', href=href))
+
+    def depart_footnote_reference(self, node):
+        self.body.append(self.context.pop() + '</a>')
+
+    def visit_generated(self, node):
+        pass
+
+    def depart_generated(self, node):
+        pass
+
+    def visit_header(self, node):
+        self.context.append(len(self.body))
+
+    def depart_header(self, node):
+        start = self.context.pop()
+        header = [self.starttag(node, 'div', CLASS='header')]
+        header.extend(self.body[start:])
+        header.append('\n<hr class="header"/>\n</div>\n')
+        self.body_prefix.extend(header)
+        self.header.extend(header)
+        del self.body[start:]
+
+    def visit_hint(self, node):
+        self.visit_admonition(node, 'hint')
+
+    def depart_hint(self, node):
+        self.depart_admonition()
+
+    def visit_image(self, node):
+        atts = {}
+        atts['src'] = node['uri']
+        if node.has_key('width'):
+            atts['width'] = node['width']
+        if node.has_key('height'):
+            atts['height'] = node['height']
+        if node.has_key('scale'):
+            if Image and not (node.has_key('width')
+                              and node.has_key('height')):
+                try:
+                    im = Image.open(str(atts['src']))
+                except (IOError, # Source image can't be found or opened
+                        UnicodeError):  # PIL doesn't like Unicode paths.
+                    pass
+                else:
+                    if not atts.has_key('width'):
+                        atts['width'] = str(im.size[0])
+                    if not atts.has_key('height'):
+                        atts['height'] = str(im.size[1])
+                    del im
+            for att_name in 'width', 'height':
+                if atts.has_key(att_name):
+                    match = re.match(r'([0-9.]+)(\S*)$', atts[att_name])
+                    assert match
+                    atts[att_name] = '%s%s' % (
+                        float(match.group(1)) * (float(node['scale']) / 100),
+                        match.group(2))
+        style = []
+        for att_name in 'width', 'height':
+            if atts.has_key(att_name):
+                if re.match(r'^[0-9.]+$', atts[att_name]):
+                    # Interpret unitless values as pixels.
+                    atts[att_name] += 'px'
+                style.append('%s: %s;' % (att_name, atts[att_name]))
+                del atts[att_name]
+        if style:
+            atts['style'] = ' '.join(style)
+        atts['alt'] = node.get('alt', atts['src'])
+        if (isinstance(node.parent, nodes.TextElement) or
+            (isinstance(node.parent, nodes.reference) and
+             not isinstance(node.parent.parent, nodes.TextElement))):
+            # Inline context or surrounded by <a>...</a>.
+            suffix = ''
+        else:
+            suffix = '\n'
+        if node.has_key('align'):
+            if node['align'] == 'center':
+                # "align" attribute is set in surrounding "div" element.
+                self.body.append('<div align="center" class="align-center">')
+                self.context.append('</div>\n')
+                suffix = ''
+            else:
+                # "align" attribute is set in "img" element.
+                atts['align'] = node['align']
+                self.context.append('')
+            atts['class'] = 'align-%s' % node['align']
+        else:
+            self.context.append('')
+        self.body.append(self.emptytag(node, 'img', suffix, **atts))
+
+    def depart_image(self, node):
+        self.body.append(self.context.pop())
+
+    def visit_important(self, node):
+        self.visit_admonition(node, 'important')
+
+    def depart_important(self, node):
+        self.depart_admonition()
+
+    def visit_inline(self, node):
+        self.body.append(self.starttag(node, 'span', ''))
+
+    def depart_inline(self, node):
+        self.body.append('</span>')
+
+    def visit_label(self, node):
+        self.body.append(self.starttag(node, 'td', '%s[' % self.context.pop(),
+                                       CLASS='label'))
+
+    def depart_label(self, node):
+        self.body.append(']</a></td><td>%s' % self.context.pop())
+
+    def visit_legend(self, node):
+        self.body.append(self.starttag(node, 'div', CLASS='legend'))
+
+    def depart_legend(self, node):
+        self.body.append('</div>\n')
+
+    def visit_line(self, node):
+        self.body.append(self.starttag(node, 'div', suffix='', CLASS='line'))
+        if not len(node):
+            self.body.append('<br />')
+
+    def depart_line(self, node):
+        self.body.append('</div>\n')
+
+    def visit_line_block(self, node):
+        self.body.append(self.starttag(node, 'div', CLASS='line-block'))
+
+    def depart_line_block(self, node):
+        self.body.append('</div>\n')
+
+    def visit_list_item(self, node):
+        self.body.append(self.starttag(node, 'li', ''))
+        if len(node):
+            node[0]['classes'].append('first')
+
+    def depart_list_item(self, node):
+        self.body.append('</li>\n')
+
+    def visit_literal(self, node):
+        """Process text to prevent tokens from wrapping."""
+        self.body.append(
+            self.starttag(node, 'tt', '', CLASS='docutils literal'))
+        text = node.astext()
+        for token in self.words_and_spaces.findall(text):
+            if token.strip():
+                # Protect text like "--an-option" from bad line wrapping:
+                self.body.append('<span class="pre">%s</span>'
+                                 % self.encode(token))
+            elif token in ('\n', ' '):
+                # Allow breaks at whitespace:
+                self.body.append(token)
+            else:
+                # Protect runs of multiple spaces; the last space can wrap:
+                self.body.append('&nbsp;' * (len(token) - 1) + ' ')
+        self.body.append('</tt>')
+        # Content already processed:
+        raise nodes.SkipNode
+
+    def visit_literal_block(self, node):
+        self.body.append(self.starttag(node, 'pre', CLASS='literal-block'))
+
+    def depart_literal_block(self, node):
+        self.body.append('\n</pre>\n')
+
+    def visit_meta(self, node):
+        meta = self.emptytag(node, 'meta', **node.non_default_attributes())
+        self.add_meta(meta)
+
+    def depart_meta(self, node):
+        pass
+
+    def add_meta(self, tag):
+        self.meta.append(tag)
+        self.head.append(tag)
+
+    def visit_note(self, node):
+        self.visit_admonition(node, 'note')
+
+    def depart_note(self, node):
+        self.depart_admonition()
+
+    def visit_option(self, node):
+        if self.context[-1]:
+            self.body.append(', ')
+        self.body.append(self.starttag(node, 'span', '', CLASS='option'))
+
+    def depart_option(self, node):
+        self.body.append('</span>')
+        self.context[-1] += 1
+
+    def visit_option_argument(self, node):
+        self.body.append(node.get('delimiter', ' '))
+        self.body.append(self.starttag(node, 'var', ''))
+
+    def depart_option_argument(self, node):
+        self.body.append('</var>')
+
+    def visit_option_group(self, node):
+        atts = {}
+        if ( self.settings.option_limit
+             and len(node.astext()) > self.settings.option_limit):
+            atts['colspan'] = 2
+            self.context.append('</tr>\n<tr><td>&nbsp;</td>')
+        else:
+            self.context.append('')
+        self.body.append(
+            self.starttag(node, 'td', CLASS='option-group', **atts))
+        self.body.append('<kbd>')
+        self.context.append(0)          # count number of options
+
+    def depart_option_group(self, node):
+        self.context.pop()
+        self.body.append('</kbd></td>\n')
+        self.body.append(self.context.pop())
+
+    def visit_option_list(self, node):
+        self.body.append(
+              self.starttag(node, 'table', CLASS='docutils option-list',
+                            frame="void", rules="none"))
+        self.body.append('<col class="option" />\n'
+                         '<col class="description" />\n'
+                         '<tbody valign="top">\n')
+
+    def depart_option_list(self, node):
+        self.body.append('</tbody>\n</table>\n')
+
+    def visit_option_list_item(self, node):
+        self.body.append(self.starttag(node, 'tr', ''))
+
+    def depart_option_list_item(self, node):
+        self.body.append('</tr>\n')
+
+    def visit_option_string(self, node):
+        pass
+
+    def depart_option_string(self, node):
+        pass
+
+    def visit_organization(self, node):
+        self.visit_docinfo_item(node, 'organization')
+
+    def depart_organization(self, node):
+        self.depart_docinfo_item()
+
+    def should_be_compact_paragraph(self, node):
+        """
+        Determine if the <p> tags around paragraph ``node`` can be omitted.
+        """
+        if (isinstance(node.parent, nodes.document) or
+            isinstance(node.parent, nodes.compound)):
+            # Never compact paragraphs in document or compound.
+            return 0
+        for key, value in node.attlist():
+            if (node.is_not_default(key) and
+                not (key == 'classes' and value in
+                     ([], ['first'], ['last'], ['first', 'last']))):
+                # Attribute which needs to survive.
+                return 0
+        first = isinstance(node.parent[0], nodes.label) # skip label
+        for child in node.parent.children[first:]:
+            # only first paragraph can be compact
+            if isinstance(child, nodes.Invisible):
+                continue
+            if child is node:
+                break
+            return 0
+        if ( self.compact_simple
+             or self.compact_field_list
+             or (self.compact_p
+                 and (len(node.parent) == 1
+                      or len(node.parent) == 2
+                      and isinstance(node.parent[0], nodes.label)))):
+            return 1
+        return 0
+
+    def visit_paragraph(self, node):
+        if self.should_be_compact_paragraph(node):
+            self.context.append('')
+        else:
+            self.body.append(self.starttag(node, 'p', ''))
+            self.context.append('</p>\n')
+
+    def depart_paragraph(self, node):
+        self.body.append(self.context.pop())
+
+    def visit_problematic(self, node):
+        if node.hasattr('refid'):
+            self.body.append('<a href="#%s" name="%s">' % (node['refid'],
+                                                           node['ids'][0]))
+            self.context.append('</a>')
+        else:
+            self.context.append('')
+        self.body.append(self.starttag(node, 'span', '', CLASS='problematic'))
+
+    def depart_problematic(self, node):
+        self.body.append('</span>')
+        self.body.append(self.context.pop())
+
+    def visit_raw(self, node):
+        if 'html' in node.get('format', '').split():
+            t = isinstance(node.parent, nodes.TextElement) and 'span' or 'div'
+            if node['classes']:
+                self.body.append(self.starttag(node, t, suffix=''))
+            self.body.append(node.astext())
+            if node['classes']:
+                self.body.append('</%s>' % t)
+        # Keep non-HTML raw text out of output:
+        raise nodes.SkipNode
+
+    def visit_reference(self, node):
+        if node.has_key('refuri'):
+            href = node['refuri']
+            if ( self.settings.cloak_email_addresses
+                 and href.startswith('mailto:')):
+                href = self.cloak_mailto(href)
+                self.in_mailto = 1
+        else:
+            assert node.has_key('refid'), \
+                   'References must have "refuri" or "refid" attribute.'
+            href = '#' + node['refid']
+        atts = {'href': href, 'class': 'reference'}
+        if not isinstance(node.parent, nodes.TextElement):
+            assert len(node) == 1 and isinstance(node[0], nodes.image)
+            atts['class'] += ' image-reference'
+        self.body.append(self.starttag(node, 'a', '', **atts))
+
+    def depart_reference(self, node):
+        self.body.append('</a>')
+        if not isinstance(node.parent, nodes.TextElement):
+            self.body.append('\n')
+        self.in_mailto = 0
+
+    def visit_revision(self, node):
+        self.visit_docinfo_item(node, 'revision', meta=None)
+
+    def depart_revision(self, node):
+        self.depart_docinfo_item()
+
+    def visit_row(self, node):
+        self.body.append(self.starttag(node, 'tr', ''))
+        node.column = 0
+
+    def depart_row(self, node):
+        self.body.append('</tr>\n')
+
+    def visit_rubric(self, node):
+        self.body.append(self.starttag(node, 'p', '', CLASS='rubric'))
+
+    def depart_rubric(self, node):
+        self.body.append('</p>\n')
+
+    def visit_section(self, node):
+        self.section_level += 1
+        self.body.append(
+            self.start_tag_with_title(node, 'div', CLASS='section'))
+
+    def depart_section(self, node):
+        self.section_level -= 1
+        self.body.append('</div>\n')
+
+    def visit_sidebar(self, node):
+        self.body.append(
+            self.start_tag_with_title(node, 'div', CLASS='sidebar'))
+        self.set_first_last(node)
+        self.in_sidebar = 1
+
+    def depart_sidebar(self, node):
+        self.body.append('</div>\n')
+        self.in_sidebar = None
+
+    def visit_status(self, node):
+        self.visit_docinfo_item(node, 'status', meta=None)
+
+    def depart_status(self, node):
+        self.depart_docinfo_item()
+
+    def visit_strong(self, node):
+        self.body.append('<strong>')
+
+    def depart_strong(self, node):
+        self.body.append('</strong>')
+
+    def visit_subscript(self, node):
+        self.body.append(self.starttag(node, 'sub', ''))
+
+    def depart_subscript(self, node):
+        self.body.append('</sub>')
+
+    def visit_substitution_definition(self, node):
+        """Internal only."""
+        raise nodes.SkipNode
+
+    def visit_substitution_reference(self, node):
+        self.unimplemented_visit(node)
+
+    def visit_subtitle(self, node):
+        if isinstance(node.parent, nodes.sidebar):
+            self.body.append(self.starttag(node, 'p', '',
+                                           CLASS='sidebar-subtitle'))
+            self.context.append('</p>\n')
+        elif isinstance(node.parent, nodes.document):
+            self.body.append(self.starttag(node, 'h2', '', CLASS='subtitle'))
+            self.context.append('</h2>\n')
+            self.in_document_title = len(self.body)
+        elif isinstance(node.parent, nodes.section):
+            tag = 'h%s' % (self.section_level + self.initial_header_level - 1)
+            self.body.append(
+                self.starttag(node, tag, '', CLASS='section-subtitle') +
+                self.starttag({}, 'span', '', CLASS='section-subtitle'))
+            self.context.append('</span></%s>\n' % tag)
+
+    def depart_subtitle(self, node):
+        self.body.append(self.context.pop())
+        if self.in_document_title:
+            self.subtitle = self.body[self.in_document_title:-1]
+            self.in_document_title = 0
+            self.body_pre_docinfo.extend(self.body)
+            self.html_subtitle.extend(self.body)
+            del self.body[:]
+
+    def visit_superscript(self, node):
+        self.body.append(self.starttag(node, 'sup', ''))
+
+    def depart_superscript(self, node):
+        self.body.append('</sup>')
+
+    def visit_system_message(self, node):
+        self.body.append(self.starttag(node, 'div', CLASS='system-message'))
+        self.body.append('<p class="system-message-title">')
+        attr = {}
+        backref_text = ''
+        if node['ids']:
+            attr['name'] = node['ids'][0]
+        if len(node['backrefs']):
+            backrefs = node['backrefs']
+            if len(backrefs) == 1:
+                backref_text = ('; <em><a href="#%s">backlink</a></em>'
+                                % backrefs[0])
+            else:
+                i = 1
+                backlinks = []
+                for backref in backrefs:
+                    backlinks.append('<a href="#%s">%s</a>' % (backref, i))
+                    i += 1
+                backref_text = ('; <em>backlinks: %s</em>'
+                                % ', '.join(backlinks))
+        if node.hasattr('line'):
+            line = ', line %s' % node['line']
+        else:
+            line = ''
+        if attr:
+            a_start = self.starttag({}, 'a', '', **attr)
+            a_end = '</a>'
+        else:
+            a_start = a_end = ''
+        self.body.append('System Message: %s%s/%s%s '
+                         '(<tt class="docutils">%s</tt>%s)%s</p>\n'
+                         % (a_start, node['type'], node['level'], a_end,
+                            self.encode(node['source']), line, backref_text))
+
+    def depart_system_message(self, node):
+        self.body.append('</div>\n')
+
+    def visit_table(self, node):
+        self.body.append(
+            self.starttag(node, 'table', CLASS='docutils', border="1"))
+
+    def depart_table(self, node):
+        self.body.append('</table>\n')
+
+    def visit_target(self, node):
+        if not (node.has_key('refuri') or node.has_key('refid')
+                or node.has_key('refname')):
+            self.body.append(self.starttag(node, 'span', '', CLASS='target'))
+            self.context.append('</span>')
+        else:
+            self.context.append('')
+
+    def depart_target(self, node):
+        self.body.append(self.context.pop())
+
+    def visit_tbody(self, node):
+        self.write_colspecs()
+        self.body.append(self.context.pop()) # '</colgroup>\n' or ''
+        self.body.append(self.starttag(node, 'tbody', valign='top'))
+
+    def depart_tbody(self, node):
+        self.body.append('</tbody>\n')
+
+    def visit_term(self, node):
+        self.body.append(self.starttag(node, 'dt', ''))
+
+    def depart_term(self, node):
+        """
+        Leave the end tag to `self.visit_definition()`, in case there's a
+        classifier.
+        """
+        pass
+
+    def visit_tgroup(self, node):
+        # Mozilla needs <colgroup>:
+        self.body.append(self.starttag(node, 'colgroup'))
+        # Appended by thead or tbody:
+        self.context.append('</colgroup>\n')
+        node.stubs = []
+
+    def depart_tgroup(self, node):
+        pass
+
+    def visit_thead(self, node):
+        self.write_colspecs()
+        self.body.append(self.context.pop()) # '</colgroup>\n'
+        # There may or may not be a <thead>; this is for <tbody> to use:
+        self.context.append('')
+        self.body.append(self.starttag(node, 'thead', valign='bottom'))
+
+    def depart_thead(self, node):
+        self.body.append('</thead>\n')
+
+    def visit_tip(self, node):
+        self.visit_admonition(node, 'tip')
+
+    def depart_tip(self, node):
+        self.depart_admonition()
+
+    def visit_title(self, node, move_ids=1):
+        """Only 6 section levels are supported by HTML."""
+        check_id = 0
+        close_tag = '</p>\n'
+        if isinstance(node.parent, nodes.topic):
+            self.body.append(
+                  self.starttag(node, 'p', '', CLASS='topic-title first'))
+            check_id = 1
+        elif isinstance(node.parent, nodes.sidebar):
+            self.body.append(
+                  self.starttag(node, 'p', '', CLASS='sidebar-title'))
+            check_id = 1
+        elif isinstance(node.parent, nodes.Admonition):
+            self.body.append(
+                  self.starttag(node, 'p', '', CLASS='admonition-title'))
+            check_id = 1
+        elif isinstance(node.parent, nodes.table):
+            self.body.append(
+                  self.starttag(node, 'caption', ''))
+            check_id = 1
+            close_tag = '</caption>\n'
+        elif isinstance(node.parent, nodes.document):
+            self.body.append(self.starttag(node, 'h1', '', CLASS='title'))
+            self.context.append('</h1>\n')
+            self.in_document_title = len(self.body)
+        else:
+            assert isinstance(node.parent, nodes.section)
+            h_level = self.section_level + self.initial_header_level - 1
+            atts = {}
+            if (len(node.parent) >= 2 and
+                isinstance(node.parent[1], nodes.subtitle)):
+                atts['CLASS'] = 'with-subtitle'
+            self.body.append(
+                  self.starttag(node, 'h%s' % h_level, '', **atts))
+            atts = {}
+            # !!! conditional to be removed in Docutils 0.5:
+            if move_ids:
+                if node.parent['ids']:
+                    atts['ids'] = node.parent['ids']
+            if node.hasattr('refid'):
+                atts['class'] = 'toc-backref'
+                atts['href'] = '#' + node['refid']
+            if atts:
+                self.body.append(self.starttag({}, 'a', '', **atts))
+                self.context.append('</a></h%s>\n' % (h_level))
+            else:
+                self.context.append('</h%s>\n' % (h_level))
+        # !!! conditional to be removed in Docutils 0.5:
+        if check_id:
+            if node.parent['ids']:
+                atts={'ids': node.parent['ids']}
+                self.body.append(
+                    self.starttag({}, 'a', '', **atts))
+                self.context.append('</a>' + close_tag)
+            else:
+                self.context.append(close_tag)
+
+    def depart_title(self, node):
+        self.body.append(self.context.pop())
+        if self.in_document_title:
+            self.title = self.body[self.in_document_title:-1]
+            self.in_document_title = 0
+            self.body_pre_docinfo.extend(self.body)
+            self.html_title.extend(self.body)
+            del self.body[:]
+
+    def visit_title_reference(self, node):
+        self.body.append(self.starttag(node, 'cite', ''))
+
+    def depart_title_reference(self, node):
+        self.body.append('</cite>')
+
+    def visit_topic(self, node):
+        self.body.append(self.start_tag_with_title(node, 'div', CLASS='topic'))
+        self.topic_classes = node['classes']
+
+    def depart_topic(self, node):
+        self.body.append('</div>\n')
+        self.topic_classes = []
+
+    def visit_transition(self, node):
+        self.body.append(self.emptytag(node, 'hr', CLASS='docutils'))
+
+    def depart_transition(self, node):
+        pass
+
+    def visit_version(self, node):
+        self.visit_docinfo_item(node, 'version', meta=None)
+
+    def depart_version(self, node):
+        self.depart_docinfo_item()
+
+    def visit_warning(self, node):
+        self.visit_admonition(node, 'warning')
+
+    def depart_warning(self, node):
+        self.depart_admonition()
+
+    def unimplemented_visit(self, node):
+        raise NotImplementedError('visiting unimplemented node type: %s'
+                                  % node.__class__.__name__)
+
+
+class SimpleListChecker(nodes.GenericNodeVisitor):
+
+    """
+    Raise `nodes.NodeFound` if non-simple list item is encountered.
+
+    Here "simple" means a list item containing nothing other than a single
+    paragraph, a simple list, or a paragraph followed by a simple list.
+    """
+
+    def default_visit(self, node):
+        raise nodes.NodeFound
+
+    def visit_bullet_list(self, node):
+        pass
+
+    def visit_enumerated_list(self, node):
+        pass
+
+    def visit_list_item(self, node):
+        children = []
+        for child in node.children:
+            if not isinstance(child, nodes.Invisible):
+                children.append(child)
+        if (children and isinstance(children[0], nodes.paragraph)
+            and (isinstance(children[-1], nodes.bullet_list)
+                 or isinstance(children[-1], nodes.enumerated_list))):
+            children.pop()
+        if len(children) <= 1:
+            return
+        else:
+            raise nodes.NodeFound
+
+    def visit_paragraph(self, node):
+        raise nodes.SkipNode
+
+    def invisible_visit(self, node):
+        """Invisible nodes should be ignored."""
+        raise nodes.SkipNode
+
+    visit_comment = invisible_visit
+    visit_substitution_definition = invisible_visit
+    visit_target = invisible_visit
+    visit_pending = invisible_visit
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/html4css1/html4css1.css
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/html4css1/html4css1.css (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/html4css1/html4css1.css (revision 3)
@@ -0,0 +1,279 @@
+/*
+:Author: David Goodger
+:Contact: goodger@users.sourceforge.net
+:Date: $Date: 2005-12-18 01:56:14 +0100 (Sun, 18 Dec 2005) $
+:Revision: $Revision: 4224 $
+:Copyright: This stylesheet has been placed in the public domain.
+
+Default cascading style sheet for the HTML output of Docutils.
+
+See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
+customize this style sheet.
+*/
+
+/* used to remove borders from tables and images */
+.borderless, table.borderless td, table.borderless th {
+  border: 0 }
+
+table.borderless td, table.borderless th {
+  /* Override padding for "table.docutils td" with "! important".
+     The right padding separates the table cells. */
+  padding: 0 0.5em 0 0 ! important }
+
+.first {
+  /* Override more specific margin styles with "! important". */
+  margin-top: 0 ! important }
+
+.last, .with-subtitle {
+  margin-bottom: 0 ! important }
+
+.hidden {
+  display: none }
+
+a.toc-backref {
+  text-decoration: none ;
+  color: black }
+
+blockquote.epigraph {
+  margin: 2em 5em ; }
+
+dl.docutils dd {
+  margin-bottom: 0.5em }
+
+/* Uncomment (and remove this text!) to get bold-faced definition list terms
+dl.docutils dt {
+  font-weight: bold }
+*/
+
+div.abstract {
+  margin: 2em 5em }
+
+div.abstract p.topic-title {
+  font-weight: bold ;
+  text-align: center }
+
+div.admonition, div.attention, div.caution, div.danger, div.error,
+div.hint, div.important, div.note, div.tip, div.warning {
+  margin: 2em ;
+  border: medium outset ;
+  padding: 1em }
+
+div.admonition p.admonition-title, div.hint p.admonition-title,
+div.important p.admonition-title, div.note p.admonition-title,
+div.tip p.admonition-title {
+  font-weight: bold ;
+  font-family: sans-serif }
+
+div.attention p.admonition-title, div.caution p.admonition-title,
+div.danger p.admonition-title, div.error p.admonition-title,
+div.warning p.admonition-title {
+  color: red ;
+  font-weight: bold ;
+  font-family: sans-serif }
+
+/* Uncomment (and remove this text!) to get reduced vertical space in
+   compound paragraphs.
+div.compound .compound-first, div.compound .compound-middle {
+  margin-bottom: 0.5em }
+
+div.compound .compound-last, div.compound .compound-middle {
+  margin-top: 0.5em }
+*/
+
+div.dedication {
+  margin: 2em 5em ;
+  text-align: center ;
+  font-style: italic }
+
+div.dedication p.topic-title {
+  font-weight: bold ;
+  font-style: normal }
+
+div.figure {
+  margin-left: 2em ;
+  margin-right: 2em }
+
+div.footer, div.header {
+  clear: both;
+  font-size: smaller }
+
+div.line-block {
+  display: block ;
+  margin-top: 1em ;
+  margin-bottom: 1em }
+
+div.line-block div.line-block {
+  margin-top: 0 ;
+  margin-bottom: 0 ;
+  margin-left: 1.5em }
+
+div.sidebar {
+  margin-left: 1em ;
+  border: medium outset ;
+  padding: 1em ;
+  background-color: #ffffee ;
+  width: 40% ;
+  float: right ;
+  clear: right }
+
+div.sidebar p.rubric {
+  font-family: sans-serif ;
+  font-size: medium }
+
+div.system-messages {
+  margin: 5em }
+
+div.system-messages h1 {
+  color: red }
+
+div.system-message {
+  border: medium outset ;
+  padding: 1em }
+
+div.system-message p.system-message-title {
+  color: red ;
+  font-weight: bold }
+
+div.topic {
+  margin: 2em }
+
+h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
+h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
+  margin-top: 0.4em }
+
+h1.title {
+  text-align: center }
+
+h2.subtitle {
+  text-align: center }
+
+hr.docutils {
+  width: 75% }
+
+img.align-left {
+  clear: left }
+
+img.align-right {
+  clear: right }
+
+ol.simple, ul.simple {
+  margin-bottom: 1em }
+
+ol.arabic {
+  list-style: decimal }
+
+ol.loweralpha {
+  list-style: lower-alpha }
+
+ol.upperalpha {
+  list-style: upper-alpha }
+
+ol.lowerroman {
+  list-style: lower-roman }
+
+ol.upperroman {
+  list-style: upper-roman }
+
+p.attribution {
+  text-align: right ;
+  margin-left: 50% }
+
+p.caption {
+  font-style: italic }
+
+p.credits {
+  font-style: italic ;
+  font-size: smaller }
+
+p.label {
+  white-space: nowrap }
+
+p.rubric {
+  font-weight: bold ;
+  font-size: larger ;
+  color: maroon ;
+  text-align: center }
+
+p.sidebar-title {
+  font-family: sans-serif ;
+  font-weight: bold ;
+  font-size: larger }
+
+p.sidebar-subtitle {
+  font-family: sans-serif ;
+  font-weight: bold }
+
+p.topic-title {
+  font-weight: bold }
+
+pre.address {
+  margin-bottom: 0 ;
+  margin-top: 0 ;
+  font-family: serif ;
+  font-size: 100% }
+
+pre.literal-block, pre.doctest-block {
+  margin-left: 2em ;
+  margin-right: 2em ;
+  background-color: #eeeeee }
+
+span.classifier {
+  font-family: sans-serif ;
+  font-style: oblique }
+
+span.classifier-delimiter {
+  font-family: sans-serif ;
+  font-weight: bold }
+
+span.interpreted {
+  font-family: sans-serif }
+
+span.option {
+  white-space: nowrap }
+
+span.pre {
+  white-space: pre }
+
+span.problematic {
+  color: red }
+
+span.section-subtitle {
+  /* font-size relative to parent (h1..h6 element) */
+  font-size: 80% }
+
+table.citation {
+  border-left: solid 1px gray;
+  margin-left: 1px }
+
+table.docinfo {
+  margin: 2em 4em }
+
+table.docutils {
+  margin-top: 0.5em ;
+  margin-bottom: 0.5em }
+
+table.footnote {
+  border-left: solid 1px black;
+  margin-left: 1px }
+
+table.docutils td, table.docutils th,
+table.docinfo td, table.docinfo th {
+  padding-left: 0.5em ;
+  padding-right: 0.5em ;
+  vertical-align: top }
+
+table.docutils th.field-name, table.docinfo th.docinfo-name {
+  font-weight: bold ;
+  text-align: left ;
+  white-space: nowrap ;
+  padding-left: 0 }
+
+h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
+h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
+  font-size: 100% }
+
+tt.docutils {
+  background-color: #eeeeee }
+
+ul.auto-toc {
+  list-style-type: none }
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/latex2e/latex2e.tex
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/latex2e/latex2e.tex (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/latex2e/latex2e.tex (revision 3)
@@ -0,0 +1,74 @@
+% latex include file for docutils latex writer
+% --------------------------------------------
+%
+% CVS: $Id: latex2e.tex 4163 2005-12-09 04:21:34Z goodger $
+%
+% This is included at the end of the latex header in the generated file,
+% to allow overwriting defaults, although this could get hairy.
+% Generated files should process well standalone too, LaTeX might give a
+% message about a missing file.
+
+% donot indent first line of paragraph.
+\setlength{\parindent}{0pt}
+\setlength{\parskip}{5pt plus 2pt minus 1pt}
+
+% sloppy
+% ------
+% Less strict (opposite to default fussy) space size between words. Therefore
+% less hyphenation.
+\sloppy
+
+% fonts
+% -----
+% times for pdf generation, gives smaller pdf files.
+%
+% But in standard postscript fonts: courier and times/helvetica do not fit.
+% Maybe use pslatex.
+\usepackage{times}
+
+% pagestyle
+% ---------
+% headings might put section titles in the page heading, but not if
+% the table of contents is done by docutils.
+% If pagestyle{headings} is used, \geometry{headheight=10pt,headsep=1pt}
+% should be set too.
+%\pagestyle{plain}
+%
+% or use fancyhdr (untested !)
+%\usepackage{fancyhdr}
+%\pagestyle{fancy}
+%\addtolength{\headheight}{\\baselineskip}
+%\renewcommand{\sectionmark}[1]{\markboth{#1}{}}
+%\renewcommand{\subsectionmark}[1]{\markright{#1}}
+%\fancyhf{}
+%\fancyhead[LE,RO]{\\bfseries\\textsf{\Large\\thepage}}
+%\fancyhead[LO]{\\textsf{\\footnotesize\\rightmark}}
+%\fancyhead[RE]{\\textsc{\\textsf{\\footnotesize\leftmark}}}
+%\\fancyfoot[LE,RO]{\\bfseries\\textsf{\scriptsize Docutils}}
+%\fancyfoot[RE,LO]{\\textsf{\scriptsize\\today}}
+
+% geometry 
+% --------
+% = papersizes and margins
+%\geometry{a4paper,twoside,tmargin=1.5cm,
+%          headheight=1cm,headsep=0.75cm}
+
+% Do section number display
+% -------------------------
+%\makeatletter
+%\def\@seccntformat#1{}
+%\makeatother
+% no numbers in toc
+%\renewcommand{\numberline}[1]{}
+
+
+% change maketitle
+% ----------------
+%\renewcommand{\maketitle}{
+%  \begin{titlepage}
+%    \begin{center}
+%    \textsf{TITLE \@title} \\
+%       Date: \today
+%    \end{center}
+%  \end{titlepage}
+%}
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/latex2e/__init__.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/latex2e/__init__.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/latex2e/__init__.py (revision 3)
@@ -0,0 +1,2048 @@
+# Author: Engelbert Gruber
+# Contact: grubert@users.sourceforge.net
+# Revision: $Revision: 4242 $
+# Date: $Date: 2006-01-06 00:28:53 +0100 (Fri, 06 Jan 2006) $
+# Copyright: This module has been placed in the public domain.
+
+"""
+LaTeX2e document tree Writer.
+"""
+
+__docformat__ = 'reStructuredText'
+
+# code contributions from several people included, thanks to all.
+# some named: David Abrahams, Julien Letessier, Lele Gaifax, and others.
+#
+# convention deactivate code by two # e.g. ##.
+
+import sys
+import time
+import re
+import string
+from types import ListType
+from docutils import frontend, nodes, languages, writers, utils
+
+
+class Writer(writers.Writer):
+
+    supported = ('latex','latex2e')
+    """Formats this writer supports."""
+
+    settings_spec = (
+        'LaTeX-Specific Options',
+        'The LaTeX "--output-encoding" default is "latin-1:strict".',
+        (('Specify documentclass.  Default is "article".',
+          ['--documentclass'],
+          {'default': 'article', }),
+         ('Specify document options.  Multiple options can be given, '
+          'separated by commas.  Default is "10pt,a4paper".',
+          ['--documentoptions'],
+          {'default': '10pt,a4paper', }),
+         ('Use LaTeX footnotes. LaTeX supports only numbered footnotes (does it?). '
+          'Default: no, uses figures.',
+          ['--use-latex-footnotes'],
+          {'default': 0, 'action': 'store_true',
+           'validator': frontend.validate_boolean}),
+         ('Format for footnote references: one of "superscript" or '
+          '"brackets".  Default is "superscript".',
+          ['--footnote-references'],
+          {'choices': ['superscript', 'brackets'], 'default': 'superscript',
+           'metavar': '<format>',
+           'overrides': 'trim_footnote_reference_space'}),
+         ('Use LaTeX citations. '
+          'Default: no, uses figures which might get mixed with images.',
+          ['--use-latex-citations'],
+          {'default': 0, 'action': 'store_true',
+           'validator': frontend.validate_boolean}),
+         ('Format for block quote attributions: one of "dash" (em-dash '
+          'prefix), "parentheses"/"parens", or "none".  Default is "dash".',
+          ['--attribution'],
+          {'choices': ['dash', 'parentheses', 'parens', 'none'],
+           'default': 'dash', 'metavar': '<format>'}),
+         ('Specify a stylesheet file. The file will be "input" by latex in '
+          'the document header.  Default is no stylesheet ("").  '
+          'Overrides --stylesheet-path.',
+          ['--stylesheet'],
+          {'default': '', 'metavar': '<file>',
+           'overrides': 'stylesheet_path'}),
+         ('Specify a stylesheet file, relative to the current working '
+          'directory.  Overrides --stylesheet.',
+          ['--stylesheet-path'],
+          {'metavar': '<file>', 'overrides': 'stylesheet'}),
+         ('Table of contents by docutils (default) or latex. Latex (writer) '
+          'supports only one ToC per document, but docutils does not write '
+          'pagenumbers.',
+          ['--use-latex-toc'],
+          {'default': 0, 'action': 'store_true',
+           'validator': frontend.validate_boolean}),
+         ('Let LaTeX print author and date, do not show it in docutils '
+          'document info.',
+          ['--use-latex-docinfo'],
+          {'default': 0, 'action': 'store_true',
+           'validator': frontend.validate_boolean}),
+         ('Color of any hyperlinks embedded in text '
+          '(default: "blue", "0" to disable).',
+          ['--hyperlink-color'], {'default': 'blue'}),
+         ('Enable compound enumerators for nested enumerated lists '
+          '(e.g. "1.2.a.ii").  Default: disabled.',
+          ['--compound-enumerators'],
+          {'default': None, 'action': 'store_true',
+           'validator': frontend.validate_boolean}),
+         ('Disable compound enumerators for nested enumerated lists.  This is '
+          'the default.',
+          ['--no-compound-enumerators'],
+          {'action': 'store_false', 'dest': 'compound_enumerators'}),
+         ('Enable section ("." subsection ...) prefixes for compound '
+          'enumerators.  This has no effect without --compound-enumerators.  '
+          'Default: disabled.',
+          ['--section-prefix-for-enumerators'],
+          {'default': None, 'action': 'store_true',
+           'validator': frontend.validate_boolean}),
+         ('Disable section prefixes for compound enumerators.  '
+          'This is the default.',
+          ['--no-section-prefix-for-enumerators'],
+          {'action': 'store_false', 'dest': 'section_prefix_for_enumerators'}),
+         ('Set the separator between section number and enumerator '
+          'for compound enumerated lists.  Default is "-".',
+          ['--section-enumerator-separator'],
+          {'default': '-', 'metavar': '<char>'}),
+         ('When possibile, use verbatim for literal-blocks. '
+          'Default is to always use the mbox environment.',
+          ['--use-verbatim-when-possible'],
+          {'default': 0, 'action': 'store_true',
+           'validator': frontend.validate_boolean}),
+         ('Table style. "standard" with horizontal and vertical lines, '
+          '"booktabs" (LaTeX booktabs style) only horizontal lines '
+          'above and below the table and below the header or "nolines".  '
+          'Default: "standard"',
+          ['--table-style'],
+          {'choices': ['standard', 'booktabs','nolines'], 'default': 'standard',
+           'metavar': '<format>'}),
+         ('LaTeX graphicx package option. '
+          'Possible values are "dvips", "pdftex". "auto" includes LaTeX code '
+          'to use "pdftex" if processing with pdf(la)tex and dvips otherwise. '
+          'Default is no option.',
+          ['--graphicx-option'],
+          {'default': ''}),
+         ('LaTeX font encoding. '
+          'Possible values are "T1", "OT1", "" or some other fontenc option. '
+          'The font encoding influences available symbols, e.g. "<<" as one '
+          'character. Default is "" which leads to package "ae" (a T1 '
+          'emulation using CM fonts).',
+          ['--font-encoding'],
+          {'default': ''}),
+          ),)
+
+    settings_defaults = {'output_encoding': 'latin-1'}
+
+    relative_path_settings = ('stylesheet_path',)
+
+    config_section = 'latex2e writer'
+    config_section_dependencies = ('writers',)
+
+    output = None
+    """Final translated form of `document`."""
+
+    def __init__(self):
+        writers.Writer.__init__(self)
+        self.translator_class = LaTeXTranslator
+
+    def translate(self):
+        visitor = self.translator_class(self.document)
+        self.document.walkabout(visitor)
+        self.output = visitor.astext()
+        self.head_prefix = visitor.head_prefix
+        self.head = visitor.head
+        self.body_prefix = visitor.body_prefix
+        self.body = visitor.body
+        self.body_suffix = visitor.body_suffix
+
+"""
+Notes on LaTeX
+--------------
+
+* latex does not support multiple tocs in one document.
+  (might be no limitation except for docutils documentation)
+
+* width
+
+  * linewidth - width of a line in the local environment
+  * textwidth - the width of text on the page
+
+  Maybe always use linewidth ?
+
+  *Bug* inside a minipage a (e.g. Sidebar) the linewidth is
+        not changed, needs fix in docutils so that tables
+        are not too wide.
+
+        So we add locallinewidth set it initially and
+        on entering sidebar and reset on exit.
+"""
+
+class Babel:
+    """Language specifics for LaTeX."""
+    # country code by a.schlock.
+    # partly manually converted from iso and babel stuff, dialects and some
+    _ISO639_TO_BABEL = {
+        'no': 'norsk',     #XXX added by hand ( forget about nynorsk?)
+        'gd': 'scottish',  #XXX added by hand
+        'hu': 'magyar',    #XXX added by hand
+        'pt': 'portuguese',#XXX added by hand
+        'sl': 'slovenian',
+        'af': 'afrikaans',
+        'bg': 'bulgarian',
+        'br': 'breton',
+        'ca': 'catalan',
+        'cs': 'czech',
+        'cy': 'welsh',
+        'da': 'danish',
+        'fr': 'french',
+        # french, francais, canadien, acadian
+        'de': 'ngerman',  #XXX rather than german
+        # ngerman, naustrian, german, germanb, austrian
+        'el': 'greek',
+        'en': 'english',
+        # english, USenglish, american, UKenglish, british, canadian
+        'eo': 'esperanto',
+        'es': 'spanish',
+        'et': 'estonian',
+        'eu': 'basque',
+        'fi': 'finnish',
+        'ga': 'irish',
+        'gl': 'galician',
+        'he': 'hebrew',
+        'hr': 'croatian',
+        'hu': 'hungarian',
+        'is': 'icelandic',
+        'it': 'italian',
+        'la': 'latin',
+        'nl': 'dutch',
+        'pl': 'polish',
+        'pt': 'portuguese',
+        'ro': 'romanian',
+        'ru': 'russian',
+        'sk': 'slovak',
+        'sr': 'serbian',
+        'sv': 'swedish',
+        'tr': 'turkish',
+        'uk': 'ukrainian'
+    }
+
+    def __init__(self,lang):
+        self.language = lang
+        # pdflatex does not produce double quotes for ngerman in tt.
+        self.double_quote_replacment = None
+        if re.search('^de',self.language):
+            #self.quotes = ("\"`", "\"'")
+            self.quotes = ('{\\glqq}', '{\\grqq}')
+            self.double_quote_replacment = "{\\dq}"
+        else:
+            self.quotes = ("``", "''")
+        self.quote_index = 0
+
+    def next_quote(self):
+        q = self.quotes[self.quote_index]
+        self.quote_index = (self.quote_index+1)%2
+        return q
+
+    def quote_quotes(self,text):
+        t = None
+        for part in text.split('"'):
+            if t == None:
+                t = part
+            else:
+                t += self.next_quote() + part
+        return t
+
+    def double_quotes_in_tt (self,text):
+        if not self.double_quote_replacment:
+            return text
+        return text.replace('"', self.double_quote_replacment)
+
+    def get_language(self):
+        if self._ISO639_TO_BABEL.has_key(self.language):
+            return self._ISO639_TO_BABEL[self.language]
+        else:
+            # support dialects.
+            l = self.language.split("_")[0]
+            if self._ISO639_TO_BABEL.has_key(l):
+                return self._ISO639_TO_BABEL[l]
+        return None
+
+
+latex_headings = {
+        'optionlist_environment' : [
+              '\\newcommand{\\optionlistlabel}[1]{\\bf #1 \\hfill}\n'
+              '\\newenvironment{optionlist}[1]\n'
+              '{\\begin{list}{}\n'
+              '  {\\setlength{\\labelwidth}{#1}\n'
+              '   \\setlength{\\rightmargin}{1cm}\n'
+              '   \\setlength{\\leftmargin}{\\rightmargin}\n'
+              '   \\addtolength{\\leftmargin}{\\labelwidth}\n'
+              '   \\addtolength{\\leftmargin}{\\labelsep}\n'
+              '   \\renewcommand{\\makelabel}{\\optionlistlabel}}\n'
+              '}{\\end{list}}\n',
+              ],
+        'lineblock_environment' : [
+            '\\newlength{\\lineblockindentation}\n'
+            '\\setlength{\\lineblockindentation}{2.5em}\n'
+            '\\newenvironment{lineblock}[1]\n'
+            '{\\begin{list}{}\n'
+            '  {\\setlength{\\partopsep}{\\parskip}\n'
+            '   \\addtolength{\\partopsep}{\\baselineskip}\n'
+            '   \\topsep0pt\\itemsep0.15\\baselineskip\\parsep0pt\n'
+            '   \\leftmargin#1}\n'
+            ' \\raggedright}\n'
+            '{\\end{list}}\n'
+            ],
+        'footnote_floats' : [
+            '% begin: floats for footnotes tweaking.\n',
+            '\\setlength{\\floatsep}{0.5em}\n',
+            '\\setlength{\\textfloatsep}{\\fill}\n',
+            '\\addtolength{\\textfloatsep}{3em}\n',
+            '\\renewcommand{\\textfraction}{0.5}\n',
+            '\\renewcommand{\\topfraction}{0.5}\n',
+            '\\renewcommand{\\bottomfraction}{0.5}\n',
+            '\\setcounter{totalnumber}{50}\n',
+            '\\setcounter{topnumber}{50}\n',
+            '\\setcounter{bottomnumber}{50}\n',
+            '% end floats for footnotes\n',
+            ],
+        'some_commands' : [
+            '% some commands, that could be overwritten in the style file.\n'
+            '\\newcommand{\\rubric}[1]'
+            '{\\subsection*{~\\hfill {\\it #1} \\hfill ~}}\n'
+            '\\newcommand{\\titlereference}[1]{\\textsl{#1}}\n'
+            '% end of "some commands"\n',
+            ]
+        }
+
+class DocumentClass:
+    """Details of a LaTeX document class."""
+
+    # BUG: LaTeX has no deeper sections (actually paragrah is no
+    # section either).
+    # BUG: No support for unknown document classes.  Make 'article'
+    # default?
+    _class_sections = {
+        'book': ( 'chapter', 'section', 'subsection', 'subsubsection' ),
+        'scrbook': ( 'chapter', 'section', 'subsection', 'subsubsection' ),
+        'report': ( 'chapter', 'section', 'subsection', 'subsubsection' ),
+        'scrreprt': ( 'chapter', 'section', 'subsection', 'subsubsection' ),
+        'article': ( 'section', 'subsection', 'subsubsection' ),
+        'scrartcl': ( 'section', 'subsection', 'subsubsection' ),
+        }
+    _deepest_section = 'subsubsection'
+
+    def __init__(self, document_class):
+        self.document_class = document_class
+
+    def section(self, level):
+        """ Return the section name at the given level for the specific
+            document class.
+
+            Level is 1,2,3..., as level 0 is the title."""
+
+        sections = self._class_sections[self.document_class]
+        if level <= len(sections):
+            return sections[level-1]
+        else:
+            return self._deepest_section
+
+class Table:
+    """ Manage a table while traversing.
+        Maybe change to a mixin defining the visit/departs, but then
+        class Table internal variables are in the Translator.
+    """
+    def __init__(self,latex_type,table_style):
+        self._latex_type = latex_type
+        self._table_style = table_style
+        self._open = 0
+        # miscellaneous attributes
+        self._attrs = {}
+        self._col_width = []
+        self._rowspan = []
+
+    def open(self):
+        self._open = 1
+        self._col_specs = []
+        self.caption = None
+        self._attrs = {}
+        self._in_head = 0 # maybe context with search
+    def close(self):
+        self._open = 0
+        self._col_specs = None
+        self.caption = None
+        self._attrs = {}
+    def is_open(self):
+        return self._open
+    def used_packages(self):
+        if self._table_style == 'booktabs':
+            return '\\usepackage{booktabs}\n'
+        return ''
+    def get_latex_type(self):
+        return self._latex_type
+
+    def set(self,attr,value):
+        self._attrs[attr] = value
+    def get(self,attr):
+        if self._attrs.has_key(attr):
+            return self._attrs[attr]
+        return None
+    def get_vertical_bar(self):
+        if self._table_style == 'standard':
+            return '|'
+        return ''
+    # horizontal lines are drawn below a row, because we.
+    def get_opening(self):
+        return '\\begin{%s}[c]' % self._latex_type
+    def get_closing(self):
+        line = ""
+        if self._table_style == 'booktabs':
+            line = '\\bottomrule\n'
+        elif self._table_style == 'standard':
+            lines = '\\hline\n'
+        return '%s\\end{%s}' % (line,self._latex_type)
+
+    def visit_colspec(self,node):
+        self._col_specs.append(node)
+
+    def get_colspecs(self):
+        """
+        Return column specification for longtable.
+
+        Assumes reST line length being 80 characters.
+        Table width is hairy.
+
+        === ===
+        ABC DEF
+        === ===
+
+        usually gets to narrow, therefore we add 1 (fiddlefactor).
+        """
+        width = 80
+
+        total_width = 0.0
+        # first see if we get too wide.
+        for node in self._col_specs:
+            colwidth = float(node['colwidth']+1) / width
+            total_width += colwidth
+        self._col_width = []
+        self._rowspan = []
+        # donot make it full linewidth
+        factor = 0.93
+        if total_width > 1.0:
+            factor /= total_width
+        bar = self.get_vertical_bar()
+        latex_table_spec = ""
+        for node in self._col_specs:
+            colwidth = factor * float(node['colwidth']+1) / width
+            self._col_width.append(colwidth+0.005)
+            self._rowspan.append(0)
+            latex_table_spec += "%sp{%.2f\\locallinewidth}" % (bar,colwidth+0.005)
+        return latex_table_spec+bar
+
+    def get_column_width(self):
+        """ return columnwidth for current cell (not multicell)
+        """
+        return "%.2f\\locallinewidth" % self._col_width[self._cell_in_row-1]
+
+    def visit_thead(self):
+        self._in_thead = 1
+        if self._table_style == 'standard':
+            return ['\\hline\n']
+        elif self._table_style == 'booktabs':
+            return ['\\toprule\n']
+        return []
+    def depart_thead(self):
+        a = []
+        #if self._table_style == 'standard':
+        #    a.append('\\hline\n')
+        if self._table_style == 'booktabs':
+            a.append('\\midrule\n')
+        a.append('\\endhead\n')
+        # for longtable one could add firsthead, foot and lastfoot
+        self._in_thead = 0
+        return a
+    def visit_row(self):
+        self._cell_in_row = 0
+    def depart_row(self):
+        res = [' \\\\\n']
+        self._cell_in_row = None  # remove cell counter
+        for i in range(len(self._rowspan)):
+            if (self._rowspan[i]>0):
+                self._rowspan[i] -= 1
+
+        if self._table_style == 'standard':
+            rowspans = []
+            for i in range(len(self._rowspan)):
+                if (self._rowspan[i]<=0):
+                    rowspans.append(i+1)
+            if len(rowspans)==len(self._rowspan):
+                res.append('\\hline\n')
+            else:
+                cline = ''
+                rowspans.reverse()
+                # TODO merge clines
+                while 1:
+                    try:
+                        c_start = rowspans.pop()
+                    except:
+                        break
+                    cline += '\\cline{%d-%d}\n' % (c_start,c_start)
+                res.append(cline)
+        return res
+
+    def set_rowspan(self,cell,value):
+        try:
+            self._rowspan[cell] = value
+        except:
+            pass
+    def get_rowspan(self,cell):
+        try:
+            return self._rowspan[cell]
+        except:
+            return 0
+    def get_entry_number(self):
+        return self._cell_in_row
+    def visit_entry(self):
+        self._cell_in_row += 1
+
+
+class LaTeXTranslator(nodes.NodeVisitor):
+
+    # When options are given to the documentclass, latex will pass them
+    # to other packages, as done with babel.
+    # Dummy settings might be taken from document settings
+
+    latex_head = '\\documentclass[%s]{%s}\n'
+    encoding = '\\usepackage[%s]{inputenc}\n'
+    linking = '\\usepackage[colorlinks=%s,linkcolor=%s,urlcolor=%s]{hyperref}\n'
+    stylesheet = '\\input{%s}\n'
+    # add a generated on day , machine by user using docutils version.
+    generator = '%% generator Docutils: http://docutils.sourceforge.net/\n'
+
+    # use latex tableofcontents or let docutils do it.
+    use_latex_toc = 0
+
+    # TODO: use mixins for different implementations.
+    # list environment for option-list. else tabularx
+    use_optionlist_for_option_list = 1
+    # list environment for docinfo. else tabularx
+    use_optionlist_for_docinfo = 0 # NOT YET IN USE
+
+    # Use compound enumerations (1.A.1.)
+    compound_enumerators = 0
+
+    # If using compound enumerations, include section information.
+    section_prefix_for_enumerators = 0
+
+    # This is the character that separates the section ("." subsection ...)
+    # prefix from the regular list enumerator.
+    section_enumerator_separator = '-'
+
+    # default link color
+    hyperlink_color = "blue"
+
+    def __init__(self, document):
+        nodes.NodeVisitor.__init__(self, document)
+        self.settings = settings = document.settings
+        self.latex_encoding = self.to_latex_encoding(settings.output_encoding)
+        self.use_latex_toc = settings.use_latex_toc
+        self.use_latex_docinfo = settings.use_latex_docinfo
+        self.use_latex_footnotes = settings.use_latex_footnotes
+        self._use_latex_citations = settings.use_latex_citations
+        self.hyperlink_color = settings.hyperlink_color
+        self.compound_enumerators = settings.compound_enumerators
+        self.font_encoding = settings.font_encoding
+        self.section_prefix_for_enumerators = (
+            settings.section_prefix_for_enumerators)
+        self.section_enumerator_separator = (
+            settings.section_enumerator_separator.replace('_', '\\_'))
+        if self.hyperlink_color == '0':
+            self.hyperlink_color = 'black'
+            self.colorlinks = 'false'
+        else:
+            self.colorlinks = 'true'
+
+        # language: labels, bibliographic_fields, and author_separators.
+        # to allow writing labes for specific languages.
+        self.language = languages.get_language(settings.language_code)
+        self.babel = Babel(settings.language_code)
+        self.author_separator = self.language.author_separators[0]
+        self.d_options = self.settings.documentoptions
+        if self.babel.get_language():
+            self.d_options += ',%s' % \
+                    self.babel.get_language()
+
+        self.d_class = DocumentClass(settings.documentclass)
+        # object for a table while proccessing.
+        self.active_table = Table('longtable',settings.table_style)
+
+        # HACK.  Should have more sophisticated typearea handling.
+        if settings.documentclass.find('scr') == -1:
+            self.typearea = '\\usepackage[DIV12]{typearea}\n'
+        else:
+            if self.d_options.find('DIV') == -1 and self.d_options.find('BCOR') == -1:
+                self.typearea = '\\typearea{12}\n'
+            else:
+                self.typearea = ''
+
+        if self.font_encoding == 'OT1':
+            fontenc_header = ''
+        elif self.font_encoding == '':
+            fontenc_header = '\\usepackage{ae}\n\\usepackage{aeguill}\n'
+        else:
+            fontenc_header = '\\usepackage[%s]{fontenc}\n' % (self.font_encoding,)
+        input_encoding = self.encoding % self.latex_encoding
+        if self.settings.graphicx_option == '':
+            self.graphicx_package = '\\usepackage{graphicx}\n'
+        elif self.settings.graphicx_option.lower() == 'auto':
+            self.graphicx_package = '\n'.join(
+                ('%Check if we are compiling under latex or pdflatex',
+                 '\\ifx\\pdftexversion\\undefined',
+                 '  \\usepackage{graphicx}',
+                 '\\else',
+                 '  \\usepackage[pdftex]{graphicx}',
+                 '\\fi\n'))
+        else:
+            self.graphicx_package = (
+                '\\usepackage[%s]{graphicx}\n' % self.settings.graphicx_option)
+
+        self.head_prefix = [
+              self.latex_head % (self.d_options,self.settings.documentclass),
+              '\\usepackage{babel}\n',     # language is in documents settings.
+              fontenc_header,
+              '\\usepackage{shortvrb}\n',  # allows verb in footnotes.
+              input_encoding,
+              # * tabularx: for docinfo, automatic width of columns, always on one page.
+              '\\usepackage{tabularx}\n',
+              '\\usepackage{longtable}\n',
+              self.active_table.used_packages(),
+              # possible other packages.
+              # * fancyhdr
+              # * ltxtable is a combination of tabularx and longtable (pagebreaks).
+              #   but ??
+              #
+              # extra space between text in tables and the line above them
+              '\\setlength{\\extrarowheight}{2pt}\n',
+              '\\usepackage{amsmath}\n',   # what fore amsmath.
+              self.graphicx_package,
+              '\\usepackage{color}\n',
+              '\\usepackage{multirow}\n',
+              '\\usepackage{ifthen}\n',   # before hyperref!
+              self.linking % (self.colorlinks, self.hyperlink_color, self.hyperlink_color),
+              self.typearea,
+              self.generator,
+              # latex lengths
+              '\\newlength{\\admonitionwidth}\n',
+              '\\setlength{\\admonitionwidth}{0.9\\textwidth}\n'
+              # width for docinfo tablewidth
+              '\\newlength{\\docinfowidth}\n',
+              '\\setlength{\\docinfowidth}{0.9\\textwidth}\n'
+              # linewidth of current environment, so tables are not wider
+              # than the sidebar: using locallinewidth seems to defer evaluation
+              # of linewidth, this is fixing it.
+              '\\newlength{\\locallinewidth}\n',
+              # will be set later.
+              ]
+        self.head_prefix.extend( latex_headings['optionlist_environment'] )
+        self.head_prefix.extend( latex_headings['lineblock_environment'] )
+        self.head_prefix.extend( latex_headings['footnote_floats'] )
+        self.head_prefix.extend( latex_headings['some_commands'] )
+        ## stylesheet is last: so it might be possible to overwrite defaults.
+        stylesheet = utils.get_stylesheet_reference(settings)
+        if stylesheet:
+            settings.record_dependencies.add(stylesheet)
+            self.head_prefix.append(self.stylesheet % (stylesheet))
+
+        if self.linking: # and maybe check for pdf
+            self.pdfinfo = [ ]
+            self.pdfauthor = None
+            # pdftitle, pdfsubject, pdfauthor, pdfkeywords, pdfcreator, pdfproducer
+        else:
+            self.pdfinfo = None
+        # NOTE: Latex wants a date and an author, rst puts this into
+        #   docinfo, so normally we donot want latex author/date handling.
+        # latex article has its own handling of date and author, deactivate.
+        # So we always emit \title{...} \author{...} \date{...}, even if the
+        # "..." are empty strings.
+        self.head = [ ]
+        # separate title, so we can appen subtitle.
+        self.title = ''
+        # if use_latex_docinfo: collects lists of author/organization/contact/address lines
+        self.author_stack = []
+        self.date = ''
+
+        self.body_prefix = ['\\raggedbottom\n']
+        self.body = []
+        self.body_suffix = ['\n']
+        self.section_level = 0
+        self.context = []
+        self.topic_classes = []
+        # column specification for tables
+        self.table_caption = None
+        
+        # Flags to encode
+        # ---------------
+        # verbatim: to tell encode not to encode.
+        self.verbatim = 0
+        # insert_newline: to tell encode to replace blanks by "~".
+        self.insert_none_breaking_blanks = 0
+        # insert_newline: to tell encode to add latex newline.
+        self.insert_newline = 0
+        # mbox_newline: to tell encode to add mbox and newline.
+        self.mbox_newline = 0
+
+        # enumeration is done by list environment.
+        self._enum_cnt = 0
+
+        # Stack of section counters so that we don't have to use_latex_toc.
+        # This will grow and shrink as processing occurs.
+        # Initialized for potential first-level sections.
+        self._section_number = [0]
+
+        # The current stack of enumerations so that we can expand
+        # them into a compound enumeration
+        self._enumeration_counters = []
+
+        self._bibitems = []
+
+        # docinfo.
+        self.docinfo = None
+        # inside literal block: no quote mangling.
+        self.literal_block = 0
+        self.literal_block_stack = []
+        self.literal = 0
+        # true when encoding in math mode
+        self.mathmode = 0
+
+    def to_latex_encoding(self,docutils_encoding):
+        """
+        Translate docutils encoding name into latex's.
+
+        Default fallback method is remove "-" and "_" chars from docutils_encoding.
+
+        """
+        tr = {  "iso-8859-1": "latin1",     # west european
+                "iso-8859-2": "latin2",     # east european
+                "iso-8859-3": "latin3",     # esperanto, maltese
+                "iso-8859-4": "latin4",     # north european,scandinavian, baltic
+                "iso-8859-5": "iso88595",   # cyrillic (ISO)
+                "iso-8859-9": "latin5",     # turkish
+                "iso-8859-15": "latin9",    # latin9, update to latin1.
+                "mac_cyrillic": "maccyr",   # cyrillic (on Mac)
+                "windows-1251": "cp1251",   # cyrillic (on Windows)
+                "koi8-r": "koi8-r",         # cyrillic (Russian)
+                "koi8-u": "koi8-u",         # cyrillic (Ukrainian)
+                "windows-1250": "cp1250",   #
+                "windows-1252": "cp1252",   #
+                "us-ascii": "ascii",        # ASCII (US)
+                # unmatched encodings
+                #"": "applemac",
+                #"": "ansinew",  # windows 3.1 ansi
+                #"": "ascii",    # ASCII encoding for the range 32--127.
+                #"": "cp437",    # dos latine us
+                #"": "cp850",    # dos latin 1
+                #"": "cp852",    # dos latin 2
+                #"": "decmulti",
+                #"": "latin10",
+                #"iso-8859-6": ""   # arabic
+                #"iso-8859-7": ""   # greek
+                #"iso-8859-8": ""   # hebrew
+                #"iso-8859-10": ""   # latin6, more complete iso-8859-4
+             }
+        if tr.has_key(docutils_encoding.lower()):
+            return tr[docutils_encoding.lower()]
+        return docutils_encoding.translate(string.maketrans("",""),"_-").lower()
+
+    def language_label(self, docutil_label):
+        return self.language.labels[docutil_label]
+
+    latex_equivalents = {
+        u'\u00A0' : '~',
+        u'\u2013' : '{--}',
+        u'\u2014' : '{---}',
+        u'\u2018' : '`',
+        u'\u2019' : '\'',
+        u'\u201A' : ',',
+        u'\u201C' : '``',
+        u'\u201D' : '\'\'',
+        u'\u201E' : ',,',
+        u'\u2020' : '{\\dag}',
+        u'\u2021' : '{\\ddag}',
+        u'\u2026' : '{\\dots}',
+        u'\u2122' : '{\\texttrademark}',
+        u'\u21d4' : '{$\\Leftrightarrow$}',
+    }
+
+    def unicode_to_latex(self,text):
+        # see LaTeX codec
+        # http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/252124
+        # Only some special chracters are translated, for documents with many
+        # utf-8 chars one should use the LaTeX unicode package.
+        for uchar in self.latex_equivalents.keys():
+            text = text.replace(uchar,self.latex_equivalents[uchar])
+        return text
+
+    def encode(self, text):
+        """
+        Encode special characters (``# $ % & ~ _ ^ \ { }``) in `text` & return
+        """
+        # Escaping with a backslash does not help with backslashes, ~ and ^.
+
+        #     < > are only available in math-mode or tt font. (really ?)
+        #     $ starts math- mode.
+        # AND quotes
+        if self.verbatim:
+            return text
+        # compile the regexps once. do it here so one can see them.
+        #
+        # first the braces.
+        if not self.__dict__.has_key('encode_re_braces'):
+            self.encode_re_braces = re.compile(r'([{}])')
+        text = self.encode_re_braces.sub(r'{\\\1}',text)
+        if not self.__dict__.has_key('encode_re_bslash'):
+            # find backslash: except in the form '{\{}' or '{\}}'.
+            self.encode_re_bslash = re.compile(r'(?<!{)(\\)(?![{}]})')
+        # then the backslash: except in the form from line above:
+        # either '{\{}' or '{\}}'.
+        text = self.encode_re_bslash.sub(r'{\\textbackslash}', text)
+
+        # then dollar
+        text = text.replace("$", '{\\$}')
+        if not ( self.literal_block or self.literal or self.mathmode ):
+            # the vertical bar: in mathmode |,\vert or \mid
+            #   in textmode \textbar
+            text = text.replace("|", '{\\textbar}')
+            text = text.replace("<", '{\\textless}')
+            text = text.replace(">", '{\\textgreater}')
+        # then
+        text = text.replace("&", '{\\&}')
+        # the ^:
+        # * verb|^| does not work in mbox.
+        # * mathmode has wedge. hat{~} would also work.
+        # text = text.replace("^", '{\\ensuremath{^\\wedge}}')
+        text = text.replace("^", '{\\textasciicircum}')
+        text = text.replace("%", '{\\%}')
+        text = text.replace("#", '{\\#}')
+        text = text.replace("~", '{\\textasciitilde}')
+        # Separate compound characters, e.g. "--" to "-{}-".  (The
+        # actual separation is done later; see below.)
+        separate_chars = '-'
+        if self.literal_block or self.literal:
+            # In monospace-font, we also separate ",,", "``" and "''"
+            # and some other characters which can't occur in
+            # non-literal text.
+            separate_chars += ',`\'"<>'
+            # pdflatex does not produce doublequotes for ngerman.
+            text = self.babel.double_quotes_in_tt(text)
+            if self.font_encoding == 'OT1':
+                # We're using OT1 font-encoding and have to replace
+                # underscore by underlined blank, because this has
+                # correct width.
+                text = text.replace('_', '{\\underline{ }}')
+                # And the tt-backslash doesn't work in OT1, so we use
+                # a mirrored slash.
+                text = text.replace('\\textbackslash', '\\reflectbox{/}')
+            else:
+                text = text.replace('_', '{\\_}')
+        else:
+            text = self.babel.quote_quotes(text)
+            text = text.replace("_", '{\\_}')
+        for char in separate_chars * 2:
+            # Do it twice ("* 2") becaues otherwise we would replace
+            # "---" by "-{}--".
+            text = text.replace(char + char, char + '{}' + char)
+        if self.insert_newline or self.literal_block:
+            # Insert a blank before the newline, to avoid
+            # ! LaTeX Error: There's no line here to end.
+            text = text.replace("\n", '~\\\\\n')
+        elif self.mbox_newline:
+            if self.literal_block:
+                closings = "}" * len(self.literal_block_stack)
+                openings = "".join(self.literal_block_stack)
+            else:
+                closings = ""
+                openings = ""
+            text = text.replace("\n", "%s}\\\\\n\\mbox{%s" % (closings,openings))
+        text = text.replace('[', '{[}').replace(']', '{]}')
+        if self.insert_none_breaking_blanks:
+            text = text.replace(' ', '~')
+        if self.latex_encoding != 'utf8':
+            text = self.unicode_to_latex(text)
+        return text
+
+    def attval(self, text,
+               whitespace=re.compile('[\n\r\t\v\f]')):
+        """Cleanse, encode, and return attribute value text."""
+        return self.encode(whitespace.sub(' ', text))
+
+    def astext(self):
+        if self.pdfinfo is not None:
+            if self.pdfauthor:
+                self.pdfinfo.append('pdfauthor={%s}' % self.pdfauthor)
+        if self.pdfinfo:
+            pdfinfo = '\\hypersetup{\n' + ',\n'.join(self.pdfinfo) + '\n}\n'
+        else:
+            pdfinfo = ''
+        head = '\\title{%s}\n\\author{%s}\n\\date{%s}\n' % \
+               (self.title,
+                ' \\and\n'.join(['~\\\\\n'.join(author_lines)
+                                 for author_lines in self.author_stack]),
+                self.date)
+        return ''.join(self.head_prefix + [head] + self.head + [pdfinfo]
+                        + self.body_prefix  + self.body + self.body_suffix)
+
+    def visit_Text(self, node):
+        self.body.append(self.encode(node.astext()))
+
+    def depart_Text(self, node):
+        pass
+
+    def visit_address(self, node):
+        self.visit_docinfo_item(node, 'address')
+
+    def depart_address(self, node):
+        self.depart_docinfo_item(node)
+
+    def visit_admonition(self, node, name=''):
+        self.body.append('\\begin{center}\\begin{sffamily}\n')
+        self.body.append('\\fbox{\\parbox{\\admonitionwidth}{\n')
+        if name:
+            self.body.append('\\textbf{\\large '+ self.language.labels[name] + '}\n');
+        self.body.append('\\vspace{2mm}\n')
+
+
+    def depart_admonition(self, node=None):
+        self.body.append('}}\n') # end parbox fbox
+        self.body.append('\\end{sffamily}\n\\end{center}\n');
+
+    def visit_attention(self, node):
+        self.visit_admonition(node, 'attention')
+
+    def depart_attention(self, node):
+        self.depart_admonition()
+
+    def visit_author(self, node):
+        self.visit_docinfo_item(node, 'author')
+
+    def depart_author(self, node):
+        self.depart_docinfo_item(node)
+
+    def visit_authors(self, node):
+        # not used: visit_author is called anyway for each author.
+        pass
+
+    def depart_authors(self, node):
+        pass
+
+    def visit_block_quote(self, node):
+        self.body.append( '\\begin{quote}\n')
+
+    def depart_block_quote(self, node):
+        self.body.append( '\\end{quote}\n')
+
+    def visit_bullet_list(self, node):
+        if 'contents' in self.topic_classes:
+            if not self.use_latex_toc:
+                self.body.append( '\\begin{list}{}{}\n' )
+        else:
+            self.body.append( '\\begin{itemize}\n' )
+
+    def depart_bullet_list(self, node):
+        if 'contents' in self.topic_classes:
+            if not self.use_latex_toc:
+                self.body.append( '\\end{list}\n' )
+        else:
+            self.body.append( '\\end{itemize}\n' )
+
+    # Imperfect superscript/subscript handling: mathmode italicizes
+    # all letters by default.
+    def visit_superscript(self, node):
+        self.body.append('$^{')
+        self.mathmode = 1
+
+    def depart_superscript(self, node):
+        self.body.append('}$')
+        self.mathmode = 0
+
+    def visit_subscript(self, node):
+        self.body.append('$_{')
+        self.mathmode = 1
+
+    def depart_subscript(self, node):
+        self.body.append('}$')
+        self.mathmode = 0
+
+    def visit_caption(self, node):
+        self.body.append( '\\caption{' )
+
+    def depart_caption(self, node):
+        self.body.append('}')
+
+    def visit_caution(self, node):
+        self.visit_admonition(node, 'caution')
+
+    def depart_caution(self, node):
+        self.depart_admonition()
+
+    def visit_title_reference(self, node):
+        self.body.append( '\\titlereference{' )
+
+    def depart_title_reference(self, node):
+        self.body.append( '}' )
+
+    def visit_citation(self, node):
+        # TODO maybe use cite bibitems
+        if self._use_latex_citations:
+            self.context.append(len(self.body))
+        else:
+            self.body.append('\\begin{figure}[b]')
+            for id in node['ids']:
+                self.body.append('\\hypertarget{%s}' % id)
+
+    def depart_citation(self, node):
+        if self._use_latex_citations:
+            size = self.context.pop()
+            label = self.body[size]
+            text = ''.join(self.body[size+1:])
+            del self.body[size:]
+            self._bibitems.append([label, text])
+        else:
+            self.body.append('\\end{figure}\n')
+
+    def visit_citation_reference(self, node):
+        if self._use_latex_citations:
+            self.body.append('\\cite{')
+        else:
+            href = ''
+            if node.has_key('refid'):
+                href = node['refid']
+            elif node.has_key('refname'):
+                href = self.document.nameids[node['refname']]
+            self.body.append('[\\hyperlink{%s}{' % href)
+
+    def depart_citation_reference(self, node):
+        if self._use_latex_citations:
+            self.body.append('}')
+        else:
+            self.body.append('}]')
+
+    def visit_classifier(self, node):
+        self.body.append( '(\\textbf{' )
+
+    def depart_classifier(self, node):
+        self.body.append( '})\n' )
+
+    def visit_colspec(self, node):
+        self.active_table.visit_colspec(node)
+
+    def depart_colspec(self, node):
+        pass
+
+    def visit_comment(self, node):
+        # Escape end of line by a new comment start in comment text.
+        self.body.append('%% %s \n' % node.astext().replace('\n', '\n% '))
+        raise nodes.SkipNode
+
+    def visit_compound(self, node):
+        pass
+
+    def depart_compound(self, node):
+        pass
+
+    def visit_contact(self, node):
+        self.visit_docinfo_item(node, 'contact')
+
+    def depart_contact(self, node):
+        self.depart_docinfo_item(node)
+
+    def visit_container(self, node):
+        pass
+
+    def depart_container(self, node):
+        pass
+
+    def visit_copyright(self, node):
+        self.visit_docinfo_item(node, 'copyright')
+
+    def depart_copyright(self, node):
+        self.depart_docinfo_item(node)
+
+    def visit_danger(self, node):
+        self.visit_admonition(node, 'danger')
+
+    def depart_danger(self, node):
+        self.depart_admonition()
+
+    def visit_date(self, node):
+        self.visit_docinfo_item(node, 'date')
+
+    def depart_date(self, node):
+        self.depart_docinfo_item(node)
+
+    def visit_decoration(self, node):
+        pass
+
+    def depart_decoration(self, node):
+        pass
+
+    def visit_definition(self, node):
+        self.body.append('%[visit_definition]\n')
+
+    def depart_definition(self, node):
+        self.body.append('\n')
+        self.body.append('%[depart_definition]\n')
+
+    def visit_definition_list(self, node):
+        self.body.append( '\\begin{description}\n' )
+
+    def depart_definition_list(self, node):
+        self.body.append( '\\end{description}\n' )
+
+    def visit_definition_list_item(self, node):
+        self.body.append('%[visit_definition_list_item]\n')
+
+    def depart_definition_list_item(self, node):
+        self.body.append('%[depart_definition_list_item]\n')
+
+    def visit_description(self, node):
+        if self.use_optionlist_for_option_list:
+            self.body.append( ' ' )
+        else:
+            self.body.append( ' & ' )
+
+    def depart_description(self, node):
+        pass
+
+    def visit_docinfo(self, node):
+        self.docinfo = []
+        self.docinfo.append('%' + '_'*75 + '\n')
+        self.docinfo.append('\\begin{center}\n')
+        self.docinfo.append('\\begin{tabularx}{\\docinfowidth}{lX}\n')
+
+    def depart_docinfo(self, node):
+        self.docinfo.append('\\end{tabularx}\n')
+        self.docinfo.append('\\end{center}\n')
+        self.body = self.docinfo + self.body
+        # clear docinfo, so field names are no longer appended.
+        self.docinfo = None
+
+    def visit_docinfo_item(self, node, name):
+        if name == 'author':
+            if not self.pdfinfo == None:
+                if not self.pdfauthor:
+                    self.pdfauthor = self.attval(node.astext())
+                else:
+                    self.pdfauthor += self.author_separator + self.attval(node.astext())
+        if self.use_latex_docinfo:
+            if name in ('author', 'organization', 'contact', 'address'):
+                # We attach these to the last author.  If any of them precedes
+                # the first author, put them in a separate "author" group (for
+                # no better semantics).
+                if name == 'author' or not self.author_stack:
+                    self.author_stack.append([])
+                if name == 'address':   # newlines are meaningful
+                    self.insert_newline = 1
+                    text = self.encode(node.astext())
+                    self.insert_newline = 0
+                else:
+                    text = self.attval(node.astext())
+                self.author_stack[-1].append(text)
+                raise nodes.SkipNode
+            elif name == 'date':
+                self.date = self.attval(node.astext())
+                raise nodes.SkipNode
+        self.docinfo.append('\\textbf{%s}: &\n\t' % self.language_label(name))
+        if name == 'address':
+            self.insert_newline = 1
+            self.docinfo.append('{\\raggedright\n')
+            self.context.append(' } \\\\\n')
+        else:
+            self.context.append(' \\\\\n')
+        self.context.append(self.docinfo)
+        self.context.append(len(self.body))
+
+    def depart_docinfo_item(self, node):
+        size = self.context.pop()
+        dest = self.context.pop()
+        tail = self.context.pop()
+        tail = self.body[size:] + [tail]
+        del self.body[size:]
+        dest.extend(tail)
+        # for address we did set insert_newline
+        self.insert_newline = 0
+
+    def visit_doctest_block(self, node):
+        self.body.append( '\\begin{verbatim}' )
+        self.verbatim = 1
+
+    def depart_doctest_block(self, node):
+        self.body.append( '\\end{verbatim}\n' )
+        self.verbatim = 0
+
+    def visit_document(self, node):
+        self.body_prefix.append('\\begin{document}\n')
+        # titled document?
+        if self.use_latex_docinfo or len(node) and isinstance(node[0], nodes.title):
+            self.body_prefix.append('\\maketitle\n\n')
+            # alternative use titlepage environment.
+            # \begin{titlepage}
+        self.body.append('\n\\setlength{\\locallinewidth}{\\linewidth}\n')
+
+    def depart_document(self, node):
+        # TODO insertion point of bibliography should none automatic.
+        if self._use_latex_citations and len(self._bibitems)>0:
+            widest_label = ""
+            for bi in self._bibitems:
+                if len(widest_label)<len(bi[0]):
+                    widest_label = bi[0]
+            self.body.append('\n\\begin{thebibliography}{%s}\n'%widest_label)
+            for bi in self._bibitems:
+                # cite_key: underscores must not be escaped
+                cite_key = bi[0].replace(r"{\_}","_")
+                self.body.append('\\bibitem[%s]{%s}{%s}\n' % (bi[0], cite_key, bi[1]))
+            self.body.append('\\end{thebibliography}\n')
+
+        self.body_suffix.append('\\end{document}\n')
+
+    def visit_emphasis(self, node):
+        self.body.append('\\emph{')
+        self.literal_block_stack.append('\\emph{')
+
+    def depart_emphasis(self, node):
+        self.body.append('}')
+        self.literal_block_stack.pop()
+
+    def visit_entry(self, node):
+        self.active_table.visit_entry()
+        # cell separation
+        if self.active_table.get_entry_number() == 1:
+            # if the firstrow is a multirow, this actually is the second row.
+            # this gets hairy if rowspans follow each other.
+            if self.active_table.get_rowspan(0):
+                count = 0
+                while self.active_table.get_rowspan(count):
+                    count += 1
+                    self.body.append(' & ')
+                self.active_table.visit_entry() # increment cell count
+        else:
+            self.body.append(' & ')
+
+        # multi{row,column}
+        # IN WORK BUG TODO HACK continues here
+        # multirow in LaTeX simply will enlarge the cell over several rows
+        # (the following n if n is positive, the former if negative).
+        if node.has_key('morerows') and node.has_key('morecols'):
+            raise NotImplementedError('Cells that '
+            'span multiple rows *and* columns are not supported, sorry.')
+        if node.has_key('morerows'):
+            count = node['morerows'] + 1
+            self.active_table.set_rowspan(self.active_table.get_entry_number()-1,count)
+            self.body.append('\\multirow{%d}{%s}{' % \
+                    (count,self.active_table.get_column_width()))
+            self.context.append('}')
+            # BUG following rows must have empty cells.
+        elif node.has_key('morecols'):
+            # the vertical bar before column is missing if it is the first column.
+            # the one after always.
+            if self.active_table.get_entry_number() == 1:
+                bar1 = self.active_table.get_vertical_bar()
+            else:
+                bar1 = ''
+            count = node['morecols'] + 1
+            self.body.append('\\multicolumn{%d}{%sl%s}{' % \
+                    (count, bar1, self.active_table.get_vertical_bar()))
+            self.context.append('}')
+        else:
+            self.context.append('')
+
+        # header / not header
+        if isinstance(node.parent.parent, nodes.thead):
+            self.body.append('\\textbf{')
+            self.context.append('}')
+        else:
+            self.context.append('')
+
+    def depart_entry(self, node):
+        self.body.append(self.context.pop()) # header / not header
+        self.body.append(self.context.pop()) # multirow/column
+        # if following row is spanned from above.
+        if self.active_table.get_rowspan(self.active_table.get_entry_number()):
+           self.body.append(' & ')
+           self.active_table.visit_entry() # increment cell count
+
+    def visit_row(self, node):
+        self.active_table.visit_row()
+
+    def depart_row(self, node):
+        self.body.extend(self.active_table.depart_row())
+
+    def visit_enumerated_list(self, node):
+        # We create our own enumeration list environment.
+        # This allows to set the style and starting value
+        # and unlimited nesting.
+        self._enum_cnt += 1
+
+        enum_style = {'arabic':'arabic',
+                'loweralpha':'alph',
+                'upperalpha':'Alph',
+                'lowerroman':'roman',
+                'upperroman':'Roman' }
+        enum_suffix = ""
+        if node.has_key('suffix'):
+            enum_suffix = node['suffix']
+        enum_prefix = ""
+        if node.has_key('prefix'):
+            enum_prefix = node['prefix']
+        if self.compound_enumerators:
+            pref = ""
+            if self.section_prefix_for_enumerators and self.section_level:
+                for i in range(self.section_level):
+                    pref += '%d.' % self._section_number[i]
+                pref = pref[:-1] + self.section_enumerator_separator
+                enum_prefix += pref
+            for counter in self._enumeration_counters:
+                enum_prefix += counter + '.'
+        enum_type = "arabic"
+        if node.has_key('enumtype'):
+            enum_type = node['enumtype']
+        if enum_style.has_key(enum_type):
+            enum_type = enum_style[enum_type]
+        counter_name = "listcnt%d" % self._enum_cnt;
+        self._enumeration_counters.append("\\%s{%s}" % (enum_type,counter_name))
+        self.body.append('\\newcounter{%s}\n' % counter_name)
+        self.body.append('\\begin{list}{%s\\%s{%s}%s}\n' % \
+            (enum_prefix,enum_type,counter_name,enum_suffix))
+        self.body.append('{\n')
+        self.body.append('\\usecounter{%s}\n' % counter_name)
+        # set start after usecounter, because it initializes to zero.
+        if node.has_key('start'):
+            self.body.append('\\addtocounter{%s}{%d}\n' \
+                    % (counter_name,node['start']-1))
+        ## set rightmargin equal to leftmargin
+        self.body.append('\\setlength{\\rightmargin}{\\leftmargin}\n')
+        self.body.append('}\n')
+
+    def depart_enumerated_list(self, node):
+        self.body.append('\\end{list}\n')
+        self._enumeration_counters.pop()
+
+    def visit_error(self, node):
+        self.visit_admonition(node, 'error')
+
+    def depart_error(self, node):
+        self.depart_admonition()
+
+    def visit_field(self, node):
+        # real output is done in siblings: _argument, _body, _name
+        pass
+
+    def depart_field(self, node):
+        self.body.append('\n')
+        ##self.body.append('%[depart_field]\n')
+
+    def visit_field_argument(self, node):
+        self.body.append('%[visit_field_argument]\n')
+
+    def depart_field_argument(self, node):
+        self.body.append('%[depart_field_argument]\n')
+
+    def visit_field_body(self, node):
+        # BUG by attach as text we loose references.
+        if self.docinfo:
+            self.docinfo.append('%s \\\\\n' % self.encode(node.astext()))
+            raise nodes.SkipNode
+        # BUG: what happens if not docinfo
+
+    def depart_field_body(self, node):
+        self.body.append( '\n' )
+
+    def visit_field_list(self, node):
+        if not self.docinfo:
+            self.body.append('\\begin{quote}\n')
+            self.body.append('\\begin{description}\n')
+
+    def depart_field_list(self, node):
+        if not self.docinfo:
+            self.body.append('\\end{description}\n')
+            self.body.append('\\end{quote}\n')
+
+    def visit_field_name(self, node):
+        # BUG this duplicates docinfo_item
+        if self.docinfo:
+            self.docinfo.append('\\textbf{%s}: &\n\t' % self.encode(node.astext()))
+            raise nodes.SkipNode
+        else:
+            self.body.append('\\item [')
+
+    def depart_field_name(self, node):
+        if not self.docinfo:
+            self.body.append(':]')
+
+    def visit_figure(self, node):
+        if not node.attributes.has_key('align'):
+            align = 'center'
+        else:
+            align = 'flush'+node.attributes['align']
+        self.body.append( '\\begin{figure}[htbp]\\begin{%s}\n' % align )
+        self.context.append( '\\end{%s}\\end{figure}\n' % align )
+
+    def depart_figure(self, node):
+        self.body.append( self.context.pop() )
+
+    def visit_footer(self, node):
+        self.context.append(len(self.body))
+
+    def depart_footer(self, node):
+        start = self.context.pop()
+        footer = (['\n\\begin{center}\small\n']
+                  + self.body[start:] + ['\n\\end{center}\n'])
+        self.body_suffix[:0] = footer
+        del self.body[start:]
+
+    def visit_footnote(self, node):
+        if self.use_latex_footnotes:
+            num,text = node.astext().split(None,1)
+            num = self.encode(num.strip())
+            self.body.append('\\footnotetext['+num+']')
+            self.body.append('{')
+        else:
+            self.body.append('\\begin{figure}[b]')
+            for id in node['ids']:
+                self.body.append('\\hypertarget{%s}' % id)
+
+    def depart_footnote(self, node):
+        if self.use_latex_footnotes:
+            self.body.append('}\n')
+        else:
+            self.body.append('\\end{figure}\n')
+
+    def visit_footnote_reference(self, node):
+        if self.use_latex_footnotes:
+            self.body.append("\\footnotemark["+self.encode(node.astext())+"]")
+            raise nodes.SkipNode
+        href = ''
+        if node.has_key('refid'):
+            href = node['refid']
+        elif node.has_key('refname'):
+            href = self.document.nameids[node['refname']]
+        format = self.settings.footnote_references
+        if format == 'brackets':
+            suffix = '['
+            self.context.append(']')
+        elif format == 'superscript':
+            suffix = '\\raisebox{.5em}[0em]{\\scriptsize'
+            self.context.append('}')
+        else:                           # shouldn't happen
+            raise AssertionError('Illegal footnote reference format.')
+        self.body.append('%s\\hyperlink{%s}{' % (suffix,href))
+
+    def depart_footnote_reference(self, node):
+        if self.use_latex_footnotes:
+            return
+        self.body.append('}%s' % self.context.pop())
+
+    # footnote/citation label
+    def label_delim(self, node, bracket, superscript):
+        if isinstance(node.parent, nodes.footnote):
+            if self.use_latex_footnotes:
+                raise nodes.SkipNode
+            if self.settings.footnote_references == 'brackets':
+                self.body.append(bracket)
+            else:
+                self.body.append(superscript)
+        else:
+            assert isinstance(node.parent, nodes.citation)
+            if not self._use_latex_citations:
+                self.body.append(bracket)
+
+    def visit_label(self, node):
+        self.label_delim(node, '[', '$^{')
+
+    def depart_label(self, node):
+        self.label_delim(node, ']', '}$')
+
+    # elements generated by the framework e.g. section numbers.
+    def visit_generated(self, node):
+        pass
+
+    def depart_generated(self, node):
+        pass
+
+    def visit_header(self, node):
+        self.context.append(len(self.body))
+
+    def depart_header(self, node):
+        start = self.context.pop()
+        self.body_prefix.append('\n\\verb|begin_header|\n')
+        self.body_prefix.extend(self.body[start:])
+        self.body_prefix.append('\n\\verb|end_header|\n')
+        del self.body[start:]
+
+    def visit_hint(self, node):
+        self.visit_admonition(node, 'hint')
+
+    def depart_hint(self, node):
+        self.depart_admonition()
+
+    def visit_image(self, node):
+        attrs = node.attributes
+        # Add image URI to dependency list, assuming that it's
+        # referring to a local file.
+        self.settings.record_dependencies.add(attrs['uri'])
+        pre = []                        # in reverse order
+        post = []
+        include_graphics_options = ""
+        inline = isinstance(node.parent, nodes.TextElement)
+        if attrs.has_key('scale'):
+            # Could also be done with ``scale`` option to
+            # ``\includegraphics``; doing it this way for consistency.
+            pre.append('\\scalebox{%f}{' % (attrs['scale'] / 100.0,))
+            post.append('}')
+        if attrs.has_key('width'):
+            include_graphics_options = '[width=%s]' % attrs['width']
+        if attrs.has_key('align'):
+            align_prepost = {
+                # By default latex aligns the top of an image.
+                (1, 'top'): ('', ''),
+                (1, 'middle'): ('\\raisebox{-0.5\\height}{', '}'),
+                (1, 'bottom'): ('\\raisebox{-\\height}{', '}'),
+                (0, 'center'): ('{\\hfill', '\\hfill}'),
+                # These 2 don't exactly do the right thing.  The image should
+                # be floated alongside the paragraph.  See
+                # http://www.w3.org/TR/html4/struct/objects.html#adef-align-IMG
+                (0, 'left'): ('{', '\\hfill}'),
+                (0, 'right'): ('{\\hfill', '}'),}
+            try:
+                pre.append(align_prepost[inline, attrs['align']][0])
+                post.append(align_prepost[inline, attrs['align']][1])
+            except KeyError:
+                pass                    # XXX complain here?
+        if not inline:
+            pre.append('\n')
+            post.append('\n')
+        pre.reverse()
+        self.body.extend( pre )
+        self.body.append( '\\includegraphics%s{%s}' % (
+                include_graphics_options, attrs['uri'] ) )
+        self.body.extend( post )
+
+    def depart_image(self, node):
+        pass
+
+    def visit_important(self, node):
+        self.visit_admonition(node, 'important')
+
+    def depart_important(self, node):
+        self.depart_admonition()
+
+    def visit_interpreted(self, node):
+        # @@@ Incomplete, pending a proper implementation on the
+        # Parser/Reader end.
+        self.visit_literal(node)
+
+    def depart_interpreted(self, node):
+        self.depart_literal(node)
+
+    def visit_legend(self, node):
+        self.body.append('{\\small ')
+
+    def depart_legend(self, node):
+        self.body.append('}')
+
+    def visit_line(self, node):
+        self.body.append('\item[] ')
+
+    def depart_line(self, node):
+        self.body.append('\n')
+
+    def visit_line_block(self, node):
+        if isinstance(node.parent, nodes.line_block):
+            self.body.append('\\item[] \n'
+                             '\\begin{lineblock}{\\lineblockindentation}\n')
+        else:
+            self.body.append('\n\\begin{lineblock}{0em}\n')
+
+    def depart_line_block(self, node):
+        self.body.append('\\end{lineblock}\n')
+
+    def visit_list_item(self, node):
+        # Append "{}" in case the next character is "[", which would break
+        # LaTeX's list environment (no numbering and the "[" is not printed).
+        self.body.append('\\item {} ')
+
+    def depart_list_item(self, node):
+        self.body.append('\n')
+
+    def visit_literal(self, node):
+        self.literal = 1
+        self.body.append('\\texttt{')
+
+    def depart_literal(self, node):
+        self.body.append('}')
+        self.literal = 0
+
+    def visit_literal_block(self, node):
+        """
+        Render a literal-block.
+
+        Literal blocks are used for "::"-prefixed literal-indented
+        blocks of text, where the inline markup is not recognized,
+        but are also the product of the parsed-literal directive,
+        where the markup is respected.
+        """
+        # In both cases, we want to use a typewriter/monospaced typeface.
+        # For "real" literal-blocks, we can use \verbatim, while for all
+        # the others we must use \mbox.
+        #
+        # We can distinguish between the two kinds by the number of
+        # siblings the compose this node: if it is composed by a
+        # single element, it's surely is either a real one, otherwise
+        # it's a parsed-literal that does not contain any markup.
+        #
+        if (self.settings.use_verbatim_when_possible and (len(node) == 1)
+              # in case of a parsed-literal containing just a "**bold**" word:
+              and isinstance(node[0], nodes.Text)):
+            self.verbatim = 1
+            self.body.append('\\begin{quote}\\begin{verbatim}\n')
+        else:
+            self.literal_block = 1
+            self.insert_none_breaking_blanks = 1
+            if self.active_table.is_open():
+                self.body.append('\n{\\ttfamily \\raggedright \\noindent\n')
+            else:
+                # no quote inside tables, to avoid vertical sppace between
+                # table border and literal block.
+                # BUG: fails if normal text preceeds the literal block.
+                self.body.append('\\begin{quote}')
+                self.body.append('{\\ttfamily \\raggedright \\noindent\n')
+            # * obey..: is from julien and never worked for me (grubert).
+            #   self.body.append('{\\obeylines\\obeyspaces\\ttfamily\n')
+
+    def depart_literal_block(self, node):
+        if self.verbatim:
+            self.body.append('\n\\end{verbatim}\\end{quote}\n')
+            self.verbatim = 0
+        else:
+            if self.active_table.is_open():
+                self.body.append('\n}\n')
+            else:
+                self.body.append('\n')
+                self.body.append('}\\end{quote}\n')
+            self.insert_none_breaking_blanks = 0
+            self.literal_block = 0
+            # obey end: self.body.append('}\n')
+
+    def visit_meta(self, node):
+        self.body.append('[visit_meta]\n')
+        # BUG maybe set keywords for pdf
+        ##self.head.append(self.starttag(node, 'meta', **node.attributes))
+
+    def depart_meta(self, node):
+        self.body.append('[depart_meta]\n')
+
+    def visit_note(self, node):
+        self.visit_admonition(node, 'note')
+
+    def depart_note(self, node):
+        self.depart_admonition()
+
+    def visit_option(self, node):
+        if self.context[-1]:
+            # this is not the first option
+            self.body.append(', ')
+
+    def depart_option(self, node):
+        # flag tha the first option is done.
+        self.context[-1] += 1
+
+    def visit_option_argument(self, node):
+        """The delimiter betweeen an option and its argument."""
+        self.body.append(node.get('delimiter', ' '))
+
+    def depart_option_argument(self, node):
+        pass
+
+    def visit_option_group(self, node):
+        if self.use_optionlist_for_option_list:
+            self.body.append('\\item [')
+        else:
+            if len(node.astext()) > 14:
+                self.body.append('\\multicolumn{2}{l}{')
+                self.context.append('} \\\\\n  ')
+            else:
+                self.context.append('')
+            self.body.append('\\texttt{')
+        # flag for first option
+        self.context.append(0)
+
+    def depart_option_group(self, node):
+        self.context.pop() # the flag
+        if self.use_optionlist_for_option_list:
+            self.body.append('] ')
+        else:
+            self.body.append('}')
+            self.body.append(self.context.pop())
+
+    def visit_option_list(self, node):
+        self.body.append('% [option list]\n')
+        if self.use_optionlist_for_option_list:
+            self.body.append('\\begin{optionlist}{3cm}\n')
+        else:
+            self.body.append('\\begin{center}\n')
+            # BUG: use admwidth or make it relative to textwidth ?
+            self.body.append('\\begin{tabularx}{.9\\linewidth}{lX}\n')
+
+    def depart_option_list(self, node):
+        if self.use_optionlist_for_option_list:
+            self.body.append('\\end{optionlist}\n')
+        else:
+            self.body.append('\\end{tabularx}\n')
+            self.body.append('\\end{center}\n')
+
+    def visit_option_list_item(self, node):
+        pass
+
+    def depart_option_list_item(self, node):
+        if not self.use_optionlist_for_option_list:
+            self.body.append('\\\\\n')
+
+    def visit_option_string(self, node):
+        ##self.body.append(self.starttag(node, 'span', '', CLASS='option'))
+        pass
+
+    def depart_option_string(self, node):
+        ##self.body.append('</span>')
+        pass
+
+    def visit_organization(self, node):
+        self.visit_docinfo_item(node, 'organization')
+
+    def depart_organization(self, node):
+        self.depart_docinfo_item(node)
+
+    def visit_paragraph(self, node):
+        index = node.parent.index(node)
+        if not ('contents' in self.topic_classes or
+                (isinstance(node.parent, nodes.compound) and
+                 index > 0 and
+                 not isinstance(node.parent[index - 1], nodes.paragraph) and
+                 not isinstance(node.parent[index - 1], nodes.compound))):
+            self.body.append('\n')
+
+    def depart_paragraph(self, node):
+        self.body.append('\n')
+
+    def visit_problematic(self, node):
+        self.body.append('{\\color{red}\\bfseries{}')
+
+    def depart_problematic(self, node):
+        self.body.append('}')
+
+    def visit_raw(self, node):
+        if 'latex' in node.get('format', '').split():
+            self.body.append(node.astext())
+        raise nodes.SkipNode
+
+    def visit_reference(self, node):
+        # BUG: hash_char "#" is trouble some in LaTeX.
+        # mbox and other environment do not like the '#'.
+        hash_char = '\\#'
+        if node.has_key('refuri'):
+            href = node['refuri'].replace('#',hash_char)
+        elif node.has_key('refid'):
+            href = hash_char + node['refid']
+        elif node.has_key('refname'):
+            href = hash_char + self.document.nameids[node['refname']]
+        else:
+            raise AssertionError('Unknown reference.')
+        self.body.append('\\href{%s}{' % href)
+
+    def depart_reference(self, node):
+        self.body.append('}')
+
+    def visit_revision(self, node):
+        self.visit_docinfo_item(node, 'revision')
+
+    def depart_revision(self, node):
+        self.depart_docinfo_item(node)
+
+    def visit_section(self, node):
+        self.section_level += 1
+        # Initialize counter for potential subsections:
+        self._section_number.append(0)
+        # Counter for this section's level (initialized by parent section):
+        self._section_number[self.section_level - 1] += 1
+
+    def depart_section(self, node):
+        # Remove counter for potential subsections:
+        self._section_number.pop()
+        self.section_level -= 1
+
+    def visit_sidebar(self, node):
+        # BUG:  this is just a hack to make sidebars render something
+        self.body.append('\n\\setlength{\\locallinewidth}{0.9\\admonitionwidth}\n')
+        self.body.append('\\begin{center}\\begin{sffamily}\n')
+        self.body.append('\\fbox{\\colorbox[gray]{0.80}{\\parbox{\\admonitionwidth}{\n')
+
+    def depart_sidebar(self, node):
+        self.body.append('}}}\n') # end parbox colorbox fbox
+        self.body.append('\\end{sffamily}\n\\end{center}\n');
+        self.body.append('\n\\setlength{\\locallinewidth}{\\linewidth}\n')
+
+
+    attribution_formats = {'dash': ('---', ''),
+                           'parentheses': ('(', ')'),
+                           'parens': ('(', ')'),
+                           'none': ('', '')}
+
+    def visit_attribution(self, node):
+        prefix, suffix = self.attribution_formats[self.settings.attribution]
+        self.body.append('\n\\begin{flushright}\n')
+        self.body.append(prefix)
+        self.context.append(suffix)
+
+    def depart_attribution(self, node):
+        self.body.append(self.context.pop() + '\n')
+        self.body.append('\\end{flushright}\n')
+
+    def visit_status(self, node):
+        self.visit_docinfo_item(node, 'status')
+
+    def depart_status(self, node):
+        self.depart_docinfo_item(node)
+
+    def visit_strong(self, node):
+        self.body.append('\\textbf{')
+        self.literal_block_stack.append('\\textbf{')
+
+    def depart_strong(self, node):
+        self.body.append('}')
+        self.literal_block_stack.pop()
+
+    def visit_substitution_definition(self, node):
+        raise nodes.SkipNode
+
+    def visit_substitution_reference(self, node):
+        self.unimplemented_visit(node)
+
+    def visit_subtitle(self, node):
+        if isinstance(node.parent, nodes.sidebar):
+            self.body.append('~\\\\\n\\textbf{')
+            self.context.append('}\n\\smallskip\n')
+        elif isinstance(node.parent, nodes.document):
+            self.title = self.title + \
+                '\\\\\n\\large{%s}\n' % self.encode(node.astext())
+            raise nodes.SkipNode
+        elif isinstance(node.parent, nodes.section):
+            self.body.append('\\textbf{')
+            self.context.append('}\\vspace{0.2cm}\n\n\\noindent ')
+
+    def depart_subtitle(self, node):
+        self.body.append(self.context.pop())
+
+    def visit_system_message(self, node):
+        pass
+
+    def depart_system_message(self, node):
+        self.body.append('\n')
+
+    def visit_table(self, node):
+        if self.active_table.is_open():
+            print 'nested tables are not supported'
+            raise AssertionError
+        self.active_table.open()
+        self.body.append('\n' + self.active_table.get_opening())
+
+    def depart_table(self, node):
+        self.body.append(self.active_table.get_closing() + '\n')
+        self.active_table.close()
+
+    def visit_target(self, node):
+        # BUG: why not (refuri or refid or refname) means not footnote ?
+        if not (node.has_key('refuri') or node.has_key('refid')
+                or node.has_key('refname')):
+            for id in node['ids']:
+                self.body.append('\\hypertarget{%s}{' % id)
+            self.context.append('}' * len(node['ids']))
+        else:
+            self.context.append('')
+
+    def depart_target(self, node):
+        self.body.append(self.context.pop())
+
+    def visit_tbody(self, node):
+        # BUG write preamble if not yet done (colspecs not [])
+        # for tables without heads.
+        if not self.active_table.get('preamble written'):
+            self.visit_thead(None)
+            # self.depart_thead(None)
+
+    def depart_tbody(self, node):
+        pass
+
+    def visit_term(self, node):
+        self.body.append('\\item[{')
+
+    def depart_term(self, node):
+        # definition list term.
+        self.body.append('}] ')
+
+    def visit_tgroup(self, node):
+        #self.body.append(self.starttag(node, 'colgroup'))
+        #self.context.append('</colgroup>\n')
+        pass
+
+    def depart_tgroup(self, node):
+        pass
+
+    def visit_thead(self, node):
+        self.body.append('{%s}\n' % self.active_table.get_colspecs())
+        if self.active_table.caption:
+            self.body.append('\\caption{%s}\\\\\n' % self.active_table.caption)
+        self.active_table.set('preamble written',1)
+        # TODO longtable supports firsthead and lastfoot too.
+        self.body.extend(self.active_table.visit_thead())
+
+    def depart_thead(self, node):
+        # the table header written should be on every page
+        # => \endhead
+        self.body.extend(self.active_table.depart_thead())
+        # and the firsthead => \endfirsthead
+        # BUG i want a "continued from previous page" on every not
+        # firsthead, but then we need the header twice.
+        #
+        # there is a \endfoot and \endlastfoot too.
+        # but we need the number of columns to
+        # self.body.append('\\multicolumn{%d}{c}{"..."}\n' % number_of_columns)
+        # self.body.append('\\hline\n\\endfoot\n')
+        # self.body.append('\\hline\n')
+        # self.body.append('\\endlastfoot\n')
+
+    def visit_tip(self, node):
+        self.visit_admonition(node, 'tip')
+
+    def depart_tip(self, node):
+        self.depart_admonition()
+
+    def bookmark(self, node):
+        """Append latex href and pdfbookmarks for titles.
+        """
+        if node.parent['ids']:
+            for id in node.parent['ids']:
+                self.body.append('\\hypertarget{%s}{}\n' % id)
+            if not self.use_latex_toc:
+                # BUG level depends on style. pdflatex allows level 0 to 3
+                # ToC would be the only on level 0 so i choose to decrement the rest.
+                # "Table of contents" bookmark to see the ToC. To avoid this
+                # we set all zeroes to one.
+                l = self.section_level
+                if l>0:
+                    l = l-1
+                # pdftex does not like "_" subscripts in titles
+                text = self.encode(node.astext())
+                for id in node.parent['ids']:
+                    self.body.append('\\pdfbookmark[%d]{%s}{%s}\n' % \
+                                     (l, text, id))
+
+    def visit_title(self, node):
+        """Only 3 section levels are supported by LaTeX article (AFAIR)."""
+
+        if isinstance(node.parent, nodes.topic):
+            # section titles before the table of contents.
+            self.bookmark(node)
+            # BUG: latex chokes on center environment with "perhaps a missing item".
+            # so we use hfill.
+            self.body.append('\\subsubsection*{~\\hfill ')
+            # the closing brace for subsection.
+            self.context.append('\\hfill ~}\n')
+        # TODO: for admonition titles before the first section
+        # either specify every possible node or ... ?
+        elif isinstance(node.parent, nodes.sidebar) \
+        or isinstance(node.parent, nodes.admonition):
+            self.body.append('\\textbf{\\large ')
+            self.context.append('}\n\\smallskip\n')
+        elif isinstance(node.parent, nodes.table):
+            # caption must be written after column spec
+            self.active_table.caption = self.encode(node.astext())
+            raise nodes.SkipNode
+        elif self.section_level == 0:
+            # document title
+            self.title = self.encode(node.astext())
+            if not self.pdfinfo == None:
+                self.pdfinfo.append( 'pdftitle={%s}' % self.encode(node.astext()) )
+            raise nodes.SkipNode
+        else:
+            self.body.append('\n\n')
+            self.body.append('%' + '_' * 75)
+            self.body.append('\n\n')
+            self.bookmark(node)
+
+            if self.use_latex_toc:
+                section_star = ""
+            else:
+                section_star = "*"
+
+            section_name = self.d_class.section(self.section_level)
+            self.body.append('\\%s%s{' % (section_name, section_star))
+
+            self.context.append('}\n')
+
+    def depart_title(self, node):
+        self.body.append(self.context.pop())
+
+    def visit_topic(self, node):
+        self.topic_classes = node['classes']
+        if 'contents' in node['classes'] and self.use_latex_toc:
+            self.body.append('\\tableofcontents\n\n\\bigskip\n')
+            self.topic_classes = []
+            raise nodes.SkipNode
+
+    def visit_inline(self, node): # titlereference
+        self.body.append( '\\docutilsrole%s{' % node.get('class'))
+
+    def depart_inline(self, node):
+        self.body.append( '}' )
+
+    def depart_topic(self, node):
+        self.topic_classes = []
+        self.body.append('\n')
+
+    def visit_rubric(self, node):
+        self.body.append('\\rubric{')
+        self.context.append('}\n')
+
+    def depart_rubric(self, node):
+        self.body.append(self.context.pop())
+
+    def visit_transition(self, node):
+        self.body.append('\n\n')
+        self.body.append('%' + '_' * 75)
+        self.body.append('\n\\hspace*{\\fill}\\hrulefill\\hspace*{\\fill}')
+        self.body.append('\n\n')
+
+    def depart_transition(self, node):
+        pass
+
+    def visit_version(self, node):
+        self.visit_docinfo_item(node, 'version')
+
+    def depart_version(self, node):
+        self.depart_docinfo_item(node)
+
+    def visit_warning(self, node):
+        self.visit_admonition(node, 'warning')
+
+    def depart_warning(self, node):
+        self.depart_admonition()
+
+    def unimplemented_visit(self, node):
+        raise NotImplementedError('visiting unimplemented node type: %s'
+                                  % node.__class__.__name__)
+
+#    def unknown_visit(self, node):
+#    def default_visit(self, node):
+
+# vim: set ts=4 et ai :
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/__init__.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/__init__.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/__init__.py (revision 3)
@@ -0,0 +1,133 @@
+# Authors: David Goodger
+# Contact: goodger@users.sourceforge.net
+# Revision: $Revision: 4163 $
+# Date: $Date: 2005-12-09 05:21:34 +0100 (Fri, 09 Dec 2005) $
+# Copyright: This module has been placed in the public domain.
+
+"""
+This package contains Docutils Writer modules.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import os.path
+import docutils
+from docutils import languages, Component
+from docutils.transforms import universal
+
+
+class Writer(Component):
+
+    """
+    Abstract base class for docutils Writers.
+
+    Each writer module or package must export a subclass also called 'Writer'.
+    Each writer must support all standard node types listed in
+    `docutils.nodes.node_class_names`.
+
+    The `write()` method is the main entry point.
+    """
+
+    component_type = 'writer'
+    config_section = 'writers'
+
+    def get_transforms(self):
+        return Component.get_transforms(self) + [
+            universal.Messages,
+            universal.FilterMessages,
+            ]
+
+    document = None
+    """The document to write (Docutils doctree); set by `write`."""
+
+    output = None
+    """Final translated form of `document` (Unicode string for text, binary
+    string for other forms); set by `translate`."""
+
+    language = None
+    """Language module for the document; set by `write`."""
+
+    destination = None
+    """`docutils.io` Output object; where to write the document.
+    Set by `write`."""
+
+    def __init__(self):
+
+        # Currently only used by HTML writer for output fragments:
+        self.parts = {}
+        """Mapping of document part names to fragments of `self.output`.
+        Values are Unicode strings; encoding is up to the client.  The 'whole'
+        key should contain the entire document output.
+        """
+
+    def write(self, document, destination):
+        """
+        Process a document into its final form.
+
+        Translate `document` (a Docutils document tree) into the Writer's
+        native format, and write it out to its `destination` (a
+        `docutils.io.Output` subclass object).
+
+        Normally not overridden or extended in subclasses.
+        """
+        self.document = document
+        self.language = languages.get_language(
+            document.settings.language_code)
+        self.destination = destination
+        self.translate()
+        output = self.destination.write(self.output)
+        return output
+
+    def translate(self):
+        """
+        Do final translation of `self.document` into `self.output`.  Called
+        from `write`.  Override in subclasses.
+
+        Usually done with a `docutils.nodes.NodeVisitor` subclass, in
+        combination with a call to `docutils.nodes.Node.walk()` or
+        `docutils.nodes.Node.walkabout()`.  The ``NodeVisitor`` subclass must
+        support all standard elements (listed in
+        `docutils.nodes.node_class_names`) and possibly non-standard elements
+        used by the current Reader as well.
+        """
+        raise NotImplementedError('subclass must override this method')
+
+    def assemble_parts(self):
+        """Assemble the `self.parts` dictionary.  Extend in subclasses."""
+        self.parts['whole'] = self.output
+
+
+class UnfilteredWriter(Writer):
+
+    """
+    A writer that passes the document tree on unchanged (e.g. a
+    serializer.)
+
+    Documents written by UnfilteredWriters are typically reused at a
+    later date using a subclass of `readers.ReReader`.
+    """
+
+    def get_transforms(self):
+        # Do not add any transforms.  When the document is reused
+        # later, the then-used writer will add the appropriate
+        # transforms.
+        return Component.get_transforms(self)
+
+
+_writer_aliases = {
+      'html': 'html4css1',
+      'latex': 'latex2e',
+      'pprint': 'pseudoxml',
+      'pformat': 'pseudoxml',
+      'pdf': 'rlpdf',
+      'xml': 'docutils_xml',
+      's5': 's5_html'}
+
+def get_writer_class(writer_name):
+    """Return the Writer class from the `writer_name` module."""
+    writer_name = writer_name.lower()
+    if _writer_aliases.has_key(writer_name):
+        writer_name = _writer_aliases[writer_name]
+    module = __import__(writer_name, globals(), locals())
+    return module.Writer
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/pseudoxml.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/pseudoxml.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/pseudoxml.py (revision 3)
@@ -0,0 +1,33 @@
+# Authors: David Goodger
+# Contact: goodger@users.sourceforge.net
+# Revision: $Revision: 1645 $
+# Date: $Date: 2003-08-27 22:50:43 +0200 (Wed, 27 Aug 2003) $
+# Copyright: This module has been placed in the public domain.
+
+"""
+Simple internal document tree Writer, writes indented pseudo-XML.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+from docutils import writers
+
+
+class Writer(writers.Writer):
+
+    supported = ('pprint', 'pformat', 'pseudoxml')
+    """Formats this writer supports."""
+
+    config_section = 'pseudoxml writer'
+    config_section_dependencies = ('writers',)
+
+    output = None
+    """Final translated form of `document`."""
+
+    def translate(self):
+        self.output = self.document.pformat()
+
+    def supports(self, format):
+        """This writer supports all format-specific elements."""
+        return 1
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/pep_html/__init__.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/pep_html/__init__.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/pep_html/__init__.py (revision 3)
@@ -0,0 +1,108 @@
+# Author: David Goodger
+# Contact: goodger@users.sourceforge.net
+# Revision: $Revision: 4163 $
+# Date: $Date: 2005-12-09 05:21:34 +0100 (Fri, 09 Dec 2005) $
+# Copyright: This module has been placed in the public domain.
+
+"""
+PEP HTML Writer.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import sys
+import os
+import os.path
+import docutils
+from docutils import frontend, nodes, utils, writers
+from docutils.writers import html4css1
+
+
+class Writer(html4css1.Writer):
+
+    default_stylesheet = 'pep.css'
+
+    default_stylesheet_path = utils.relative_path(
+        os.path.join(os.getcwd(), 'dummy'),
+        os.path.join(os.path.dirname(__file__), default_stylesheet))
+
+    default_template = 'template.txt'
+
+    default_template_path = utils.relative_path(
+        os.path.join(os.getcwd(), 'dummy'),
+        os.path.join(os.path.dirname(__file__), default_template))
+
+    settings_spec = html4css1.Writer.settings_spec + (
+        'PEP/HTML-Specific Options',
+        'The default value for the --stylesheet-path option (defined in '
+        'HTML-Specific Options above) is "%s" for the PEP/HTML writer.'
+        % default_stylesheet_path,
+        (('Specify a template file.  Default is "%s".' % default_template_path,
+          ['--template'],
+          {'default': default_template_path, 'metavar': '<file>'}),
+         ('Python\'s home URL.  Default is "http://www.python.org".',
+          ['--python-home'],
+          {'default': 'http://www.python.org', 'metavar': '<URL>'}),
+         ('Home URL prefix for PEPs.  Default is "." (current directory).',
+          ['--pep-home'],
+          {'default': '.', 'metavar': '<URL>'}),
+         # For testing.
+         (frontend.SUPPRESS_HELP,
+          ['--no-random'],
+          {'action': 'store_true', 'validator': frontend.validate_boolean}),))
+
+    settings_default_overrides = {'stylesheet_path': default_stylesheet_path}
+
+    relative_path_settings = (html4css1.Writer.relative_path_settings
+                              + ('template',))
+
+    config_section = 'pep_html writer'
+    config_section_dependencies = ('writers', 'html4css1 writer')
+
+    def __init__(self):
+        html4css1.Writer.__init__(self)
+        self.translator_class = HTMLTranslator
+
+    def translate(self):
+        html4css1.Writer.translate(self)
+        settings = self.document.settings
+        template = open(settings.template).read()
+        # Substitutions dict for template:
+        subs = {}
+        subs['encoding'] = settings.output_encoding
+        subs['version'] = docutils.__version__
+        subs['stylesheet'] = ''.join(self.stylesheet)
+        pyhome = settings.python_home
+        subs['pyhome'] = pyhome
+        subs['pephome'] = settings.pep_home
+        if pyhome == '..':
+            subs['pepindex'] = '.'
+        else:
+            subs['pepindex'] = pyhome + '/peps'
+        index = self.document.first_child_matching_class(nodes.field_list)
+        header = self.document[index]
+        pepnum = header[0][1].astext()
+        subs['pep'] = pepnum
+        if settings.no_random:
+            subs['banner'] = 0
+        else:
+            import random
+            subs['banner'] = random.randrange(64)
+        try:
+            subs['pepnum'] = '%04i' % int(pepnum)
+        except ValueError:
+            subs['pepnum'] = pepnum
+        subs['title'] = header[1][1].astext()
+        subs['body'] = ''.join(
+            self.body_pre_docinfo + self.docinfo + self.body)
+        subs['body_suffix'] = ''.join(self.body_suffix)
+        self.output = template % subs
+
+
+class HTMLTranslator(html4css1.HTMLTranslator):
+
+    def depart_field_list(self, node):
+        html4css1.HTMLTranslator.depart_field_list(self, node)
+        if 'rfc2822' in node['classes']:
+             self.body.append('<hr />\n')
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/pep_html/template.txt
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/pep_html/template.txt (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/pep_html/template.txt (revision 3)
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="%(encoding)s" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<!--
+This HTML is auto-generated.  DO NOT EDIT THIS FILE!  If you are writing a new
+PEP, see http://www.python.org/peps/pep-0001.html for instructions and links
+to templates.  DO NOT USE THIS HTML FILE AS YOUR TEMPLATE!
+-->
+<head>
+  <meta http-equiv="Content-Type" content="text/html; charset=%(encoding)s" />
+  <meta name="generator" content="Docutils %(version)s: http://docutils.sourceforge.net/" />
+  <title>PEP %(pep)s -- %(title)s</title>
+  %(stylesheet)s</head>
+<body bgcolor="white">
+<table class="navigation" cellpadding="0" cellspacing="0"
+       width="100%%" border="0">
+<tr><td class="navicon" width="150" height="35">
+<a href="%(pyhome)s/" title="Python Home Page">
+<img src="%(pyhome)s/pics/PyBanner%(banner)03d.gif" alt="[Python]"
+ border="0" width="150" height="35" /></a></td>
+<td class="textlinks" align="left">
+[<b><a href="%(pyhome)s/">Python Home</a></b>]
+[<b><a href="%(pepindex)s/">PEP Index</a></b>]
+[<b><a href="%(pephome)s/pep-%(pepnum)s.txt">PEP Source</a></b>]
+</td></tr></table>
+<div class="document">
+%(body)s
+%(body_suffix)s
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/pep_html/pep.css
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/pep_html/pep.css (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/pep_html/pep.css (revision 3)
@@ -0,0 +1,348 @@
+/*
+:Author: David Goodger
+:Contact: goodger@users.sourceforge.net
+:date: $Date: 2005-12-09 05:21:34 +0100 (Fri, 09 Dec 2005) $
+:version: $Revision: 4163 $
+:copyright: This stylesheet has been placed in the public domain.
+
+Default cascading style sheet for the PEP HTML output of Docutils.
+*/
+
+/* "! important" is used here to override other ``margin-top`` and
+   ``margin-bottom`` styles that are later in the stylesheet or 
+   more specific.  See http://www.w3.org/TR/CSS1#the-cascade */
+.first {
+  margin-top: 0 ! important }
+
+.last, .with-subtitle {
+  margin-bottom: 0 ! important }
+
+.hidden {
+  display: none }
+
+.navigation {
+  width: 100% ;
+  background: #99ccff ;
+  margin-top: 0px ;
+  margin-bottom: 0px }
+
+.navigation .navicon {
+  width: 150px ;
+  height: 35px }
+
+.navigation .textlinks {
+  padding-left: 1em ;
+  text-align: left }
+
+.navigation td, .navigation th {
+  padding-left: 0em ;
+  padding-right: 0em ;
+  vertical-align: middle }
+
+.rfc2822 {
+  margin-top: 0.5em ;
+  margin-left: 0.5em ;
+  margin-right: 0.5em ;
+  margin-bottom: 0em }
+
+.rfc2822 td {
+  text-align: left }
+
+.rfc2822 th.field-name {
+  text-align: right ;
+  font-family: sans-serif ;
+  padding-right: 0.5em ;
+  font-weight: bold ;
+  margin-bottom: 0em }
+
+a.toc-backref {
+  text-decoration: none ;
+  color: black }
+
+blockquote.epigraph {
+  margin: 2em 5em ; }
+
+body {
+  margin: 0px ;
+  margin-bottom: 1em ;
+  padding: 0px }
+
+dl.docutils dd {
+  margin-bottom: 0.5em }
+
+div.section {
+  margin-left: 1em ;
+  margin-right: 1em ;
+  margin-bottom: 1.5em }
+
+div.section div.section {
+  margin-left: 0em ;
+  margin-right: 0em ;
+  margin-top: 1.5em }
+
+div.abstract {
+  margin: 2em 5em }
+
+div.abstract p.topic-title {
+  font-weight: bold ;
+  text-align: center }
+
+div.admonition, div.attention, div.caution, div.danger, div.error,
+div.hint, div.important, div.note, div.tip, div.warning {
+  margin: 2em ;
+  border: medium outset ;
+  padding: 1em }
+
+div.admonition p.admonition-title, div.hint p.admonition-title,
+div.important p.admonition-title, div.note p.admonition-title,
+div.tip p.admonition-title {
+  font-weight: bold ;
+  font-family: sans-serif }
+
+div.attention p.admonition-title, div.caution p.admonition-title,
+div.danger p.admonition-title, div.error p.admonition-title,
+div.warning p.admonition-title {
+  color: red ;
+  font-weight: bold ;
+  font-family: sans-serif }
+
+/* Uncomment (and remove this text!) to get reduced vertical space in
+   compound paragraphs.
+div.compound .compound-first, div.compound .compound-middle {
+  margin-bottom: 0.5em }
+
+div.compound .compound-last, div.compound .compound-middle {
+  margin-top: 0.5em }
+*/
+
+div.dedication {
+  margin: 2em 5em ;
+  text-align: center ;
+  font-style: italic }
+
+div.dedication p.topic-title {
+  font-weight: bold ;
+  font-style: normal }
+
+div.figure {
+  margin-left: 2em ;
+  margin-right: 2em }
+
+div.footer, div.header {
+  clear: both;
+  font-size: smaller }
+
+div.footer {
+  margin-left: 1em ;
+  margin-right: 1em }
+
+div.line-block {
+  display: block ;
+  margin-top: 1em ;
+  margin-bottom: 1em }
+
+div.line-block div.line-block {
+  margin-top: 0 ;
+  margin-bottom: 0 ;
+  margin-left: 1.5em }
+
+div.sidebar {
+  margin-left: 1em ;
+  border: medium outset ;
+  padding: 1em ;
+  background-color: #ffffee ;
+  width: 40% ;
+  float: right ;
+  clear: right }
+
+div.sidebar p.rubric {
+  font-family: sans-serif ;
+  font-size: medium }
+
+div.system-messages {
+  margin: 5em }
+
+div.system-messages h1 {
+  color: red }
+
+div.system-message {
+  border: medium outset ;
+  padding: 1em }
+
+div.system-message p.system-message-title {
+  color: red ;
+  font-weight: bold }
+
+div.topic {
+  margin: 2em }
+
+h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
+h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
+  margin-top: 0.4em }
+
+h1 {
+  font-family: sans-serif ;
+  font-size: large }
+
+h2 {
+  font-family: sans-serif ;
+  font-size: medium }
+
+h3 {
+  font-family: sans-serif ;
+  font-size: small }
+
+h4 {
+  font-family: sans-serif ;
+  font-style: italic ;
+  font-size: small }
+
+h5 {
+  font-family: sans-serif;
+  font-size: x-small }
+
+h6 {
+  font-family: sans-serif;
+  font-style: italic ;
+  font-size: x-small }
+
+hr.docutils {
+  width: 75% }
+
+img.align-left {
+  clear: left }
+
+img.align-right {
+  clear: right }
+
+img.borderless {
+  border: 0 }
+
+ol.simple, ul.simple {
+  margin-bottom: 1em }
+
+ol.arabic {
+  list-style: decimal }
+
+ol.loweralpha {
+  list-style: lower-alpha }
+
+ol.upperalpha {
+  list-style: upper-alpha }
+
+ol.lowerroman {
+  list-style: lower-roman }
+
+ol.upperroman {
+  list-style: upper-roman }
+
+p.attribution {
+  text-align: right ;
+  margin-left: 50% }
+
+p.caption {
+  font-style: italic }
+
+p.credits {
+  font-style: italic ;
+  font-size: smaller }
+
+p.label {
+  white-space: nowrap }
+
+p.rubric {
+  font-weight: bold ;
+  font-size: larger ;
+  color: maroon ;
+  text-align: center }
+
+p.sidebar-title {
+  font-family: sans-serif ;
+  font-weight: bold ;
+  font-size: larger }
+
+p.sidebar-subtitle {
+  font-family: sans-serif ;
+  font-weight: bold }
+
+p.topic-title {
+  font-family: sans-serif ;
+  font-weight: bold }
+
+pre.address {
+  margin-bottom: 0 ;
+  margin-top: 0 ;
+  font-family: serif ;
+  font-size: 100% }
+
+pre.literal-block, pre.doctest-block {
+  margin-left: 2em ;
+  margin-right: 2em ;
+  background-color: #eeeeee }
+
+span.classifier {
+  font-family: sans-serif ;
+  font-style: oblique }
+
+span.classifier-delimiter {
+  font-family: sans-serif ;
+  font-weight: bold }
+
+span.interpreted {
+  font-family: sans-serif }
+
+span.option {
+  white-space: nowrap }
+
+span.option-argument {
+  font-style: italic }
+
+span.pre {
+  white-space: pre }
+
+span.problematic {
+  color: red }
+
+span.section-subtitle {
+  /* font-size relative to parent (h1..h6 element) */
+  font-size: 80% }
+
+table.citation {
+  border-left: solid 1px gray;
+  margin-left: 1px }
+
+table.docinfo {
+  margin: 2em 4em }
+
+table.docutils {
+  margin-top: 0.5em ;
+  margin-bottom: 0.5em }
+
+table.footnote {
+  border-left: solid 1px black;
+  margin-left: 1px }
+
+table.docutils td, table.docutils th,
+table.docinfo td, table.docinfo th {
+  padding-left: 0.5em ;
+  padding-right: 0.5em ;
+  vertical-align: top }
+
+td.num {
+  text-align: right }
+
+th.field-name {
+  font-weight: bold ;
+  text-align: left ;
+  white-space: nowrap ;
+  padding-left: 0 }
+
+h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
+h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
+  font-size: 100% }
+
+tt.docutils {
+  background-color: #eeeeee }
+
+ul.auto-toc {
+  list-style-type: none }
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/big-white/framing.css
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/big-white/framing.css (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/big-white/framing.css (revision 3)
@@ -0,0 +1,24 @@
+/* This file has been placed in the public domain. */
+/* The following styles size, place, and layer the slide components.
+   Edit these if you want to change the overall slide layout.
+   The commented lines can be uncommented (and modified, if necessary) 
+   to help you with the rearrangement process. */
+
+/* target = 1024x768 */
+
+div#header, div#footer, .slide {width: 100%; top: 0; left: 0;}
+div#footer {display:none;}
+.slide {top: 0; width: 92%; padding: 0.25em 4% 4%; z-index: 2;}
+div#controls {left: 50%; bottom: 0; width: 50%; z-index: 100;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+  margin: 0;}
+#currentSlide {position: absolute; width: 10%; left: 45%; bottom: 1em;
+  z-index: 10;}
+html>body #currentSlide {position: fixed;}
+
+/*
+div#header {background: #FCC;}
+div#footer {background: #CCF;}
+div#controls {background: #BBD;}
+div#currentSlide {background: #FFC;}
+*/
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/big-white/pretty.css
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/big-white/pretty.css (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/big-white/pretty.css (revision 3)
@@ -0,0 +1,107 @@
+/* This file has been placed in the public domain. */
+/* Following are the presentation styles -- edit away! */
+
+html, body {margin: 0; padding: 0;}
+body {background: white; color: black;}
+:link, :visited {text-decoration: none; color: #00C;}
+#controls :active {color: #88A !important;}
+#controls :focus {outline: 1px dotted #227;}
+
+blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em;}
+blockquote p {margin: 0;}
+
+kbd {font-weight: bold; font-size: 1em;}
+sup {font-size: smaller; line-height: 1px;}
+
+.slide pre {padding: 0; margin-left: 0; margin-right: 0; font-size: 90%;}
+.slide ul ul li {list-style: square;}
+.slide img.leader {display: block; margin: 0 auto;}
+.slide tt {font-size: 90%;}
+
+.slide {font-size: 3em; font-family: sans-serif; font-weight: bold;}
+.slide h1 {padding-top: 0; z-index: 1; margin: 0; font-size: 120%;}
+.slide h2 {font-size: 110%;}
+.slide h3 {font-size: 105%;}
+h1 abbr {font-variant: small-caps;}
+
+div#controls {position: absolute; left: 50%; bottom: 0;
+  width: 50%; text-align: right; font: bold 0.9em sans-serif;}
+html>body div#controls {position: fixed; padding: 0 0 1em 0; top: auto;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+  margin: 0; padding: 0;}
+#controls #navLinks a {padding: 0; margin: 0 0.5em; 
+  border: none; color: #005; cursor: pointer;}
+#controls #navList {height: 1em;}
+#controls #navList #jumplist {position: absolute; bottom: 0; right: 0;
+  background: #DDD; color: #227;}
+
+#currentSlide {text-align: center; font-size: 0.5em; color: #444;
+  font-family: sans-serif; font-weight: bold;}
+
+#slide0 h1 {position: static; margin: 0 0 0.5em; padding-top: 0.3em; top: 0;
+  font-size: 150%; white-space: normal; background: transparent;}
+#slide0 h2 {font: 110%; font-style: italic; color: gray;}
+#slide0 h3 {margin-top: 1.5em; font-size: 1.5em;}
+#slide0 h4 {margin-top: 0; font-size: 1em;}
+
+ul.urls {list-style: none; display: inline; margin: 0;}
+.urls li {display: inline; margin: 0;}
+.external {border-bottom: 1px dotted gray;}
+html>body .external {border-bottom: none;}
+.external:after {content: " \274F"; font-size: smaller; color: #77B;}
+
+.incremental, .incremental *, .incremental *:after {
+  color: white; visibility: visible; border: 0;}
+img.incremental {visibility: hidden;}
+.slide .current {color: green;}
+
+.slide-display {display: inline ! important;}
+
+.huge {font-size: 150%;}
+.big {font-size: 120%;}
+.small {font-size: 75%;}
+.tiny {font-size: 50%;}
+.huge tt, .big tt, .small tt, .tiny tt {font-size: 115%;}
+.huge pre, .big pre, .small pre, .tiny pre {font-size: 115%;}
+
+.maroon {color: maroon;}
+.red {color: red;}
+.magenta {color: magenta;}
+.fuchsia {color: fuchsia;}
+.pink {color: #FAA;}
+.orange {color: orange;}
+.yellow {color: yellow;}
+.lime {color: lime;}
+.green {color: green;}
+.olive {color: olive;}
+.teal {color: teal;}
+.cyan {color: cyan;}
+.aqua {color: aqua;}
+.blue {color: blue;}
+.navy {color: navy;}
+.purple {color: purple;}
+.black {color: black;}
+.gray {color: gray;}
+.silver {color: silver;}
+.white {color: white;}
+
+.left {text-align: left ! important;}
+.center {text-align: center ! important;}
+.right {text-align: right ! important;}
+
+.animation {position: relative; margin: 1em 0; padding: 0;}
+.animation img {position: absolute;}
+
+/* Docutils-specific overrides */
+
+.slide table.docinfo {margin: 0.5em 0 0.5em 1em;}
+
+pre.literal-block, pre.doctest-block {background-color: white;}
+
+tt.docutils {background-color: white;}
+
+/* diagnostics */
+/*
+li:after {content: " [" attr(class) "]"; color: #F88;}
+div:before {content: "[" attr(class) "]"; color: #F88;}
+*/
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/small-black/__base__
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/small-black/__base__ (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/small-black/__base__ (revision 3)
@@ -0,0 +1,2 @@
+# base theme of this theme:
+small-white
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/small-black/pretty.css
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/small-black/pretty.css (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/small-black/pretty.css (revision 3)
@@ -0,0 +1,116 @@
+/* This file has been placed in the public domain. */
+/* Following are the presentation styles -- edit away! */
+
+html, body {margin: 0; padding: 0;}
+body {background: black; color: white;}
+:link, :visited {text-decoration: none; color: cyan;}
+#controls :active {color: #888 !important;}
+#controls :focus {outline: 1px dotted #CCC;}
+h1, h2, h3, h4 {font-size: 100%; margin: 0; padding: 0; font-weight: inherit;}
+
+blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em;}
+blockquote p {margin: 0;}
+
+kbd {font-weight: bold; font-size: 1em;}
+sup {font-size: smaller; line-height: 1px;}
+
+.slide pre {padding: 0; margin-left: 0; margin-right: 0; font-size: 90%;}
+.slide ul ul li {list-style: square;}
+.slide img.leader {display: block; margin: 0 auto;}
+.slide tt {font-size: 90%;}
+
+div#footer {font-family: sans-serif; color: #AAA; 
+  font-size: 0.5em; font-weight: bold; padding: 1em 0;}
+#footer h1 {display: block; padding: 0 1em;}
+#footer h2 {display: block; padding: 0.8em 1em 0;}
+
+.slide {font-size: 1.2em;}
+.slide h1 {padding-top: 0; z-index: 1; margin: 0; font: bold 150% sans-serif;}
+.slide h2 {font: bold 120% sans-serif; padding-top: 0.5em;}
+.slide h3 {font: bold 100% sans-serif; padding-top: 0.5em;}
+h1 abbr {font-variant: small-caps;}
+
+div#controls {position: absolute; left: 50%; bottom: 0;
+  width: 50%; text-align: right; font: bold 0.9em sans-serif;}
+html>body div#controls {position: fixed; padding: 0 0 1em 0; top: auto;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+  margin: 0; padding: 0;}
+#controls #navLinks a {padding: 0; margin: 0 0.5em; 
+  border: none; color: #888; cursor: pointer;}
+#controls #navList {height: 1em;}
+#controls #navList #jumplist {position: absolute; bottom: 0; right: 0;
+  background: black; color: #CCC;}
+
+#currentSlide {text-align: center; font-size: 0.5em; color: #AAA;
+  font-family: sans-serif; font-weight: bold;}
+
+#slide0 {padding-top: 0em}
+#slide0 h1 {position: static; margin: 1em 0 0; padding: 0;
+  font: bold 2em sans-serif; white-space: normal; background: transparent;}
+#slide0 h2 {font: bold italic 1em sans-serif; margin: 0.25em;}
+#slide0 h3 {margin-top: 1.5em; font-size: 1.5em;}
+#slide0 h4 {margin-top: 0; font-size: 1em;}
+
+ul.urls {list-style: none; display: inline; margin: 0;}
+.urls li {display: inline; margin: 0;}
+.external {border-bottom: 1px dotted gray;}
+html>body .external {border-bottom: none;}
+.external:after {content: " \274F"; font-size: smaller; color: #FCC;}
+
+.incremental, .incremental *, .incremental *:after {
+  color: black; visibility: visible; border: 0;}
+img.incremental {visibility: hidden;}
+.slide .current {color: lime;}
+
+.slide-display {display: inline ! important;}
+
+.huge {font-family: sans-serif; font-weight: bold; font-size: 150%;}
+.big {font-family: sans-serif; font-weight: bold; font-size: 120%;}
+.small {font-size: 75%;}
+.tiny {font-size: 50%;}
+.huge tt, .big tt, .small tt, .tiny tt {font-size: 115%;}
+.huge pre, .big pre, .small pre, .tiny pre {font-size: 115%;}
+
+.maroon {color: maroon;}
+.red {color: red;}
+.magenta {color: magenta;}
+.fuchsia {color: fuchsia;}
+.pink {color: #FAA;}
+.orange {color: orange;}
+.yellow {color: yellow;}
+.lime {color: lime;}
+.green {color: green;}
+.olive {color: olive;}
+.teal {color: teal;}
+.cyan {color: cyan;}
+.aqua {color: aqua;}
+.blue {color: blue;}
+.navy {color: navy;}
+.purple {color: purple;}
+.black {color: black;}
+.gray {color: gray;}
+.silver {color: silver;}
+.white {color: white;}
+
+.left {text-align: left ! important;}
+.center {text-align: center ! important;}
+.right {text-align: right ! important;}
+
+.animation {position: relative; margin: 1em 0; padding: 0;}
+.animation img {position: absolute;}
+
+/* Docutils-specific overrides */
+
+.slide table.docinfo {margin: 1em 0 0.5em 2em;}
+
+div.sidebar {background-color: black;}
+
+pre.literal-block, pre.doctest-block {background-color: black;}
+
+tt.docutils {background-color: black;}
+
+/* diagnostics */
+/*
+li:after {content: " [" attr(class) "]"; color: #F88;}
+div:before {content: "[" attr(class) "]"; color: #F88;}
+*/
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/default/print.css
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/default/print.css (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/default/print.css (revision 3)
@@ -0,0 +1,24 @@
+/* This file has been placed in the public domain. */
+/* The following rule is necessary to have all slides appear in print!
+   DO NOT REMOVE IT! */
+.slide, ul {page-break-inside: avoid; visibility: visible !important;}
+h1 {page-break-after: avoid;}
+
+body {font-size: 12pt; background: white;}
+* {color: black;}
+
+#slide0 h1 {font-size: 200%; border: none; margin: 0.5em 0 0.25em;}
+#slide0 h3 {margin: 0; padding: 0;}
+#slide0 h4 {margin: 0 0 0.5em; padding: 0;}
+#slide0 {margin-bottom: 3em;}
+
+#header {display: none;}
+#footer h1 {margin: 0; border-bottom: 1px solid; color: gray;
+  font-style: italic;}
+#footer h2, #controls {display: none;}
+
+.print {display: inline ! important;}
+
+/* The following rule keeps the layout stuff out of print.
+   Remove at your own risk! */
+.layout, .layout * {display: none !important;}
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/default/s5-core.css
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/default/s5-core.css (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/default/s5-core.css (revision 3)
@@ -0,0 +1,11 @@
+/* This file has been placed in the public domain. */
+/* Do not edit or override these styles!
+   The system will likely break if you do. */
+
+div#header, div#footer, div#controls, .slide {position: absolute;}
+html>body div#header, html>body div#footer, 
+  html>body div#controls, html>body .slide {position: fixed;}
+.handout {display: none;}
+.layout {display: block;}
+.slide, .hideme, .incremental {visibility: hidden;}
+#slide0 {visibility: visible;}
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/default/iepngfix.htc
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/default/iepngfix.htc (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/default/iepngfix.htc (revision 3)
@@ -0,0 +1,42 @@
+<public:component>
+<public:attach event="onpropertychange" onevent="doFix()" />
+
+<script>
+
+// IE5.5+ PNG Alpha Fix v1.0 by Angus Turnbull http://www.twinhelix.com
+// Free usage permitted as long as this notice remains intact.
+
+// This must be a path to a blank image. That's all the configuration you need here.
+var blankImg = 'ui/default/blank.gif';
+
+var f = 'DXImageTransform.Microsoft.AlphaImageLoader';
+
+function filt(s, m) {
+ if (filters[f]) {
+  filters[f].enabled = s ? true : false;
+  if (s) with (filters[f]) { src = s; sizingMethod = m }
+ } else if (s) style.filter = 'progid:'+f+'(src="'+s+'",sizingMethod="'+m+'")';
+}
+
+function doFix() {
+ if ((parseFloat(navigator.userAgent.match(/MSIE (\S+)/)[1]) < 5.5) ||
+  (event && !/(background|src)/.test(event.propertyName))) return;
+
+ if (tagName == 'IMG') {
+  if ((/\.png$/i).test(src)) {
+   filt(src, 'image');  // was 'scale'
+   src = blankImg;
+  } else if (src.indexOf(blankImg) < 0) filt();
+ } else if (style.backgroundImage) {
+  if (style.backgroundImage.match(/^url[("']+(.*\.png)[)"']+$/i)) {
+   var s = RegExp.$1;
+   style.backgroundImage = '';
+   filt(s, 'crop');
+  } else filt();
+ }
+}
+
+doFix();
+
+</script>
+</public:component>
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/default/outline.css
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/default/outline.css (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/default/outline.css (revision 3)
@@ -0,0 +1,16 @@
+/* This file has been placed in the public domain. */
+/* Don't change this unless you want the layout stuff to show up in the
+   outline view! */
+
+.layout div, #footer *, #controlForm * {display: none;}
+#footer, #controls, #controlForm, #navLinks, #toggle {
+  display: block; visibility: visible; margin: 0; padding: 0;}
+#toggle {float: right; padding: 0.5em;}
+html>body #toggle {position: fixed; top: 0; right: 0;}
+
+/* making the outline look pretty-ish */
+
+#slide0 h1, #slide0 h2, #slide0 h3, #slide0 h4 {border: none; margin: 0;}
+#toggle {border: 1px solid; border-width: 0 0 1px 1px; background: #FFF;}
+
+.outline {display: inline ! important;}
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/default/framing.css
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/default/framing.css (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/default/framing.css (revision 3)
@@ -0,0 +1,25 @@
+/* This file has been placed in the public domain. */
+/* The following styles size, place, and layer the slide components.
+   Edit these if you want to change the overall slide layout.
+   The commented lines can be uncommented (and modified, if necessary) 
+   to help you with the rearrangement process. */
+
+/* target = 1024x768 */
+
+div#header, div#footer, .slide {width: 100%; top: 0; left: 0;}
+div#header {position: fixed; top: 0; height: 3em; z-index: 1;}
+div#footer {top: auto; bottom: 0; height: 2.5em; z-index: 5;}
+.slide {top: 0; width: 92%; padding: 2.5em 4% 4%; z-index: 2;}
+div#controls {left: 50%; bottom: 0; width: 50%; z-index: 100;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+  margin: 0;}
+#currentSlide {position: absolute; width: 10%; left: 45%; bottom: 1em;
+  z-index: 10;}
+html>body #currentSlide {position: fixed;}
+
+/*
+div#header {background: #FCC;}
+div#footer {background: #CCF;}
+div#controls {background: #BBD;}
+div#currentSlide {background: #FFC;}
+*/
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/default/slides.css
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/default/slides.css (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/default/slides.css (revision 3)
@@ -0,0 +1,10 @@
+/* This file has been placed in the public domain. */
+
+/* required to make the slide show run at all */
+@import url(s5-core.css);
+
+/* sets basic placement and size of slide components */
+@import url(framing.css);
+
+/* styles that make the slides look good */
+@import url(pretty.css);
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/default/opera.css
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/default/opera.css (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/default/opera.css (revision 3)
@@ -0,0 +1,8 @@
+/* This file has been placed in the public domain. */
+/* DO NOT CHANGE THESE unless you really want to break Opera Show */
+.slide {
+	visibility: visible !important;
+	position: static !important;
+	page-break-before: always;
+}
+#slide0 {page-break-before: avoid;}
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/default/pretty.css
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/default/pretty.css (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/default/pretty.css (revision 3)
@@ -0,0 +1,120 @@
+/* This file has been placed in the public domain. */
+/* Following are the presentation styles -- edit away! */
+
+html, body {margin: 0; padding: 0;}
+body {background: white; color: black;}
+/* Replace the background style above with the style below (and again for
+   div#header) for a graphic: */
+/* background: white url(bodybg.gif) -16px 0 no-repeat; */
+:link, :visited {text-decoration: none; color: #00C;}
+#controls :active {color: #88A !important;}
+#controls :focus {outline: 1px dotted #227;}
+h1, h2, h3, h4 {font-size: 100%; margin: 0; padding: 0; font-weight: inherit;}
+
+blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em;}
+blockquote p {margin: 0;}
+
+kbd {font-weight: bold; font-size: 1em;}
+sup {font-size: smaller; line-height: 1px;}
+
+.slide pre {padding: 0; margin-left: 0; margin-right: 0; font-size: 90%;}
+.slide ul ul li {list-style: square;}
+.slide img.leader {display: block; margin: 0 auto;}
+.slide tt {font-size: 90%;}
+
+div#header, div#footer {background: #005; color: #AAB; font-family: sans-serif;}
+/* background: #005 url(bodybg.gif) -16px 0 no-repeat; */
+div#footer {font-size: 0.5em; font-weight: bold; padding: 1em 0;}
+#footer h1 {display: block; padding: 0 1em;}
+#footer h2 {display: block; padding: 0.8em 1em 0;}
+
+.slide {font-size: 1.2em;}
+.slide h1 {position: absolute; top: 0.45em; z-index: 1;
+  margin: 0; padding-left: 0.7em; white-space: nowrap;
+  font: bold 150% sans-serif; color: #DDE; background: #005;}
+.slide h2 {font: bold 120%/1em sans-serif; padding-top: 0.5em;}
+.slide h3 {font: bold 100% sans-serif; padding-top: 0.5em;}
+h1 abbr {font-variant: small-caps;}
+
+div#controls {position: absolute; left: 50%; bottom: 0;
+  width: 50%; text-align: right; font: bold 0.9em sans-serif;}
+html>body div#controls {position: fixed; padding: 0 0 1em 0; top: auto;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+  margin: 0; padding: 0;}
+#controls #navLinks a {padding: 0; margin: 0 0.5em; 
+  background: #005; border: none; color: #779; cursor: pointer;}
+#controls #navList {height: 1em;}
+#controls #navList #jumplist {position: absolute; bottom: 0; right: 0;
+  background: #DDD; color: #227;}
+
+#currentSlide {text-align: center; font-size: 0.5em; color: #449;
+  font-family: sans-serif; font-weight: bold;}
+
+#slide0 {padding-top: 1.5em}
+#slide0 h1 {position: static; margin: 1em 0 0; padding: 0; color: #000;
+  font: bold 2em sans-serif; white-space: normal; background: transparent;}
+#slide0 h2 {font: bold italic 1em sans-serif; margin: 0.25em;}
+#slide0 h3 {margin-top: 1.5em; font-size: 1.5em;}
+#slide0 h4 {margin-top: 0; font-size: 1em;}
+
+ul.urls {list-style: none; display: inline; margin: 0;}
+.urls li {display: inline; margin: 0;}
+.external {border-bottom: 1px dotted gray;}
+html>body .external {border-bottom: none;}
+.external:after {content: " \274F"; font-size: smaller; color: #77B;}
+
+.incremental, .incremental *, .incremental *:after {visibility: visible;
+  color: white; border: 0;}
+img.incremental {visibility: hidden;}
+.slide .current {color: green;}
+
+.slide-display {display: inline ! important;}
+
+.huge {font-family: sans-serif; font-weight: bold; font-size: 150%;}
+.big {font-family: sans-serif; font-weight: bold; font-size: 120%;}
+.small {font-size: 75%;}
+.tiny {font-size: 50%;}
+.huge tt, .big tt, .small tt, .tiny tt {font-size: 115%;}
+.huge pre, .big pre, .small pre, .tiny pre {font-size: 115%;}
+
+.maroon {color: maroon;}
+.red {color: red;}
+.magenta {color: magenta;}
+.fuchsia {color: fuchsia;}
+.pink {color: #FAA;}
+.orange {color: orange;}
+.yellow {color: yellow;}
+.lime {color: lime;}
+.green {color: green;}
+.olive {color: olive;}
+.teal {color: teal;}
+.cyan {color: cyan;}
+.aqua {color: aqua;}
+.blue {color: blue;}
+.navy {color: navy;}
+.purple {color: purple;}
+.black {color: black;}
+.gray {color: gray;}
+.silver {color: silver;}
+.white {color: white;}
+
+.left {text-align: left ! important;}
+.center {text-align: center ! important;}
+.right {text-align: right ! important;}
+
+.animation {position: relative; margin: 1em 0; padding: 0;}
+.animation img {position: absolute;}
+
+/* Docutils-specific overrides */
+
+.slide table.docinfo {margin: 1em 0 0.5em 2em;}
+
+pre.literal-block, pre.doctest-block {background-color: white;}
+
+tt.docutils {background-color: white;}
+
+/* diagnostics */
+/*
+li:after {content: " [" attr(class) "]"; color: #F88;}
+div:before {content: "[" attr(class) "]"; color: #F88;}
+*/
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/default/slides.js
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/default/slides.js (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/default/slides.js (revision 3)
@@ -0,0 +1,558 @@
+// S5 v1.1 slides.js -- released into the Public Domain
+// Modified for Docutils (http://docutils.sf.net) by David Goodger
+//
+// Please see http://www.meyerweb.com/eric/tools/s5/credits.html for
+// information about all the wonderful and talented contributors to this code!
+
+var undef;
+var slideCSS = '';
+var snum = 0;
+var smax = 1;
+var slideIDs = new Array();
+var incpos = 0;
+var number = undef;
+var s5mode = true;
+var defaultView = 'slideshow';
+var controlVis = 'visible';
+
+var isIE = navigator.appName == 'Microsoft Internet Explorer' ? 1 : 0;
+var isOp = navigator.userAgent.indexOf('Opera') > -1 ? 1 : 0;
+var isGe = navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('Safari') < 1 ? 1 : 0;
+
+function hasClass(object, className) {
+	if (!object.className) return false;
+	return (object.className.search('(^|\\s)' + className + '(\\s|$)') != -1);
+}
+
+function hasValue(object, value) {
+	if (!object) return false;
+	return (object.search('(^|\\s)' + value + '(\\s|$)') != -1);
+}
+
+function removeClass(object,className) {
+	if (!object) return;
+	object.className = object.className.replace(new RegExp('(^|\\s)'+className+'(\\s|$)'), RegExp.$1+RegExp.$2);
+}
+
+function addClass(object,className) {
+	if (!object || hasClass(object, className)) return;
+	if (object.className) {
+		object.className += ' '+className;
+	} else {
+		object.className = className;
+	}
+}
+
+function GetElementsWithClassName(elementName,className) {
+	var allElements = document.getElementsByTagName(elementName);
+	var elemColl = new Array();
+	for (var i = 0; i< allElements.length; i++) {
+		if (hasClass(allElements[i], className)) {
+			elemColl[elemColl.length] = allElements[i];
+		}
+	}
+	return elemColl;
+}
+
+function isParentOrSelf(element, id) {
+	if (element == null || element.nodeName=='BODY') return false;
+	else if (element.id == id) return true;
+	else return isParentOrSelf(element.parentNode, id);
+}
+
+function nodeValue(node) {
+	var result = "";
+	if (node.nodeType == 1) {
+		var children = node.childNodes;
+		for (var i = 0; i < children.length; ++i) {
+			result += nodeValue(children[i]);
+		}		
+	}
+	else if (node.nodeType == 3) {
+		result = node.nodeValue;
+	}
+	return(result);
+}
+
+function slideLabel() {
+	var slideColl = GetElementsWithClassName('*','slide');
+	var list = document.getElementById('jumplist');
+	smax = slideColl.length;
+	for (var n = 0; n < smax; n++) {
+		var obj = slideColl[n];
+
+		var did = 'slide' + n.toString();
+		if (obj.getAttribute('id')) {
+			slideIDs[n] = obj.getAttribute('id');
+		}
+		else {
+			obj.setAttribute('id',did);
+			slideIDs[n] = did;
+		}
+		if (isOp) continue;
+
+		var otext = '';
+		var menu = obj.firstChild;
+		if (!menu) continue; // to cope with empty slides
+		while (menu && menu.nodeType == 3) {
+			menu = menu.nextSibling;
+		}
+	 	if (!menu) continue; // to cope with slides with only text nodes
+
+		var menunodes = menu.childNodes;
+		for (var o = 0; o < menunodes.length; o++) {
+			otext += nodeValue(menunodes[o]);
+		}
+		list.options[list.length] = new Option(n + ' : '  + otext, n);
+	}
+}
+
+function currentSlide() {
+	var cs;
+	var footer_nodes;
+	var vis = 'visible';
+	if (document.getElementById) {
+		cs = document.getElementById('currentSlide');
+		footer_nodes = document.getElementById('footer').childNodes;
+	} else {
+		cs = document.currentSlide;
+		footer = document.footer.childNodes;
+	}
+	cs.innerHTML = '<span id="csHere">' + snum + '<\/span> ' + 
+		'<span id="csSep">\/<\/span> ' + 
+		'<span id="csTotal">' + (smax-1) + '<\/span>';
+	if (snum == 0) {
+		vis = 'hidden';
+	}
+	cs.style.visibility = vis;
+	for (var i = 0; i < footer_nodes.length; i++) {
+		if (footer_nodes[i].nodeType == 1) {
+			footer_nodes[i].style.visibility = vis;
+		}
+	}		
+}
+
+function go(step) {
+	if (document.getElementById('slideProj').disabled || step == 0) return;
+	var jl = document.getElementById('jumplist');
+	var cid = slideIDs[snum];
+	var ce = document.getElementById(cid);
+	if (incrementals[snum].length > 0) {
+		for (var i = 0; i < incrementals[snum].length; i++) {
+			removeClass(incrementals[snum][i], 'current');
+			removeClass(incrementals[snum][i], 'incremental');
+		}
+	}
+	if (step != 'j') {
+		snum += step;
+		lmax = smax - 1;
+		if (snum > lmax) snum = lmax;
+		if (snum < 0) snum = 0;
+	} else
+		snum = parseInt(jl.value);
+	var nid = slideIDs[snum];
+	var ne = document.getElementById(nid);
+	if (!ne) {
+		ne = document.getElementById(slideIDs[0]);
+		snum = 0;
+	}
+	if (step < 0) {incpos = incrementals[snum].length} else {incpos = 0;}
+	if (incrementals[snum].length > 0 && incpos == 0) {
+		for (var i = 0; i < incrementals[snum].length; i++) {
+			if (hasClass(incrementals[snum][i], 'current'))
+				incpos = i + 1;
+			else
+				addClass(incrementals[snum][i], 'incremental');
+		}
+	}
+	if (incrementals[snum].length > 0 && incpos > 0)
+		addClass(incrementals[snum][incpos - 1], 'current');
+	ce.style.visibility = 'hidden';
+	ne.style.visibility = 'visible';
+	jl.selectedIndex = snum;
+	currentSlide();
+	number = 0;
+}
+
+function goTo(target) {
+	if (target >= smax || target == snum) return;
+	go(target - snum);
+}
+
+function subgo(step) {
+	if (step > 0) {
+		removeClass(incrementals[snum][incpos - 1],'current');
+		removeClass(incrementals[snum][incpos], 'incremental');
+		addClass(incrementals[snum][incpos],'current');
+		incpos++;
+	} else {
+		incpos--;
+		removeClass(incrementals[snum][incpos],'current');
+		addClass(incrementals[snum][incpos], 'incremental');
+		addClass(incrementals[snum][incpos - 1],'current');
+	}
+}
+
+function toggle() {
+	var slideColl = GetElementsWithClassName('*','slide');
+	var slides = document.getElementById('slideProj');
+	var outline = document.getElementById('outlineStyle');
+	if (!slides.disabled) {
+		slides.disabled = true;
+		outline.disabled = false;
+		s5mode = false;
+		fontSize('1em');
+		for (var n = 0; n < smax; n++) {
+			var slide = slideColl[n];
+			slide.style.visibility = 'visible';
+		}
+	} else {
+		slides.disabled = false;
+		outline.disabled = true;
+		s5mode = true;
+		fontScale();
+		for (var n = 0; n < smax; n++) {
+			var slide = slideColl[n];
+			slide.style.visibility = 'hidden';
+		}
+		slideColl[snum].style.visibility = 'visible';
+	}
+}
+
+function showHide(action) {
+	var obj = GetElementsWithClassName('*','hideme')[0];
+	switch (action) {
+	case 's': obj.style.visibility = 'visible'; break;
+	case 'h': obj.style.visibility = 'hidden'; break;
+	case 'k':
+		if (obj.style.visibility != 'visible') {
+			obj.style.visibility = 'visible';
+		} else {
+			obj.style.visibility = 'hidden';
+		}
+	break;
+	}
+}
+
+// 'keys' code adapted from MozPoint (http://mozpoint.mozdev.org/)
+function keys(key) {
+	if (!key) {
+		key = event;
+		key.which = key.keyCode;
+	}
+	if (key.which == 84) {
+		toggle();
+		return;
+	}
+	if (s5mode) {
+		switch (key.which) {
+			case 10: // return
+			case 13: // enter
+				if (window.event && isParentOrSelf(window.event.srcElement, 'controls')) return;
+				if (key.target && isParentOrSelf(key.target, 'controls')) return;
+				if(number != undef) {
+					goTo(number);
+					break;
+				}
+			case 32: // spacebar
+			case 34: // page down
+			case 39: // rightkey
+			case 40: // downkey
+				if(number != undef) {
+					go(number);
+				} else if (!incrementals[snum] || incpos >= incrementals[snum].length) {
+					go(1);
+				} else {
+					subgo(1);
+				}
+				break;
+			case 33: // page up
+			case 37: // leftkey
+			case 38: // upkey
+				if(number != undef) {
+					go(-1 * number);
+				} else if (!incrementals[snum] || incpos <= 0) {
+					go(-1);
+				} else {
+					subgo(-1);
+				}
+				break;
+			case 36: // home
+				goTo(0);
+				break;
+			case 35: // end
+				goTo(smax-1);
+				break;
+			case 67: // c
+				showHide('k');
+				break;
+		}
+		if (key.which < 48 || key.which > 57) {
+			number = undef;
+		} else {
+			if (window.event && isParentOrSelf(window.event.srcElement, 'controls')) return;
+			if (key.target && isParentOrSelf(key.target, 'controls')) return;
+			number = (((number != undef) ? number : 0) * 10) + (key.which - 48);
+		}
+	}
+	return false;
+}
+
+function clicker(e) {
+	number = undef;
+	var target;
+	if (window.event) {
+		target = window.event.srcElement;
+		e = window.event;
+	} else target = e.target;
+    if (target.href != null || hasValue(target.rel, 'external') || isParentOrSelf(target, 'controls') || isParentOrSelf(target,'embed') || isParentOrSelf(target, 'object')) return true; 
+	if (!e.which || e.which == 1) {
+		if (!incrementals[snum] || incpos >= incrementals[snum].length) {
+			go(1);
+		} else {
+			subgo(1);
+		}
+	}
+}
+
+function findSlide(hash) {
+	var target = document.getElementById(hash);
+	if (target) {
+		for (var i = 0; i < slideIDs.length; i++) {
+			if (target.id == slideIDs[i]) return i;
+		}
+	}
+	return null;
+}
+
+function slideJump() {
+	if (window.location.hash == null || window.location.hash == '') {
+		currentSlide();
+		return;
+	}
+	if (window.location.hash == null) return;
+	var dest = null;
+	dest = findSlide(window.location.hash.slice(1));
+	if (dest == null) {
+		dest = 0;
+	}
+	go(dest - snum);
+}
+
+function fixLinks() {
+	var thisUri = window.location.href;
+	thisUri = thisUri.slice(0, thisUri.length - window.location.hash.length);
+	var aelements = document.getElementsByTagName('A');
+	for (var i = 0; i < aelements.length; i++) {
+		var a = aelements[i].href;
+		var slideID = a.match('\#.+');
+		if ((slideID) && (slideID[0].slice(0,1) == '#')) {
+			var dest = findSlide(slideID[0].slice(1));
+			if (dest != null) {
+				if (aelements[i].addEventListener) {
+					aelements[i].addEventListener("click", new Function("e",
+						"if (document.getElementById('slideProj').disabled) return;" +
+						"go("+dest+" - snum); " +
+						"if (e.preventDefault) e.preventDefault();"), true);
+				} else if (aelements[i].attachEvent) {
+					aelements[i].attachEvent("onclick", new Function("",
+						"if (document.getElementById('slideProj').disabled) return;" +
+						"go("+dest+" - snum); " +
+						"event.returnValue = false;"));
+				}
+			}
+		}
+	}
+}
+
+function externalLinks() {
+	if (!document.getElementsByTagName) return;
+	var anchors = document.getElementsByTagName('a');
+	for (var i=0; i<anchors.length; i++) {
+		var anchor = anchors[i];
+		if (anchor.getAttribute('href') && hasValue(anchor.rel, 'external')) {
+			anchor.target = '_blank';
+			addClass(anchor,'external');
+		}
+	}
+}
+
+function createControls() {
+	var controlsDiv = document.getElementById("controls");
+	if (!controlsDiv) return;
+	var hider = ' onmouseover="showHide(\'s\');" onmouseout="showHide(\'h\');"';
+	var hideDiv, hideList = '';
+	if (controlVis == 'hidden') {
+		hideDiv = hider;
+	} else {
+		hideList = hider;
+	}
+	controlsDiv.innerHTML = '<form action="#" id="controlForm"' + hideDiv + '>' +
+	'<div id="navLinks">' +
+	'<a accesskey="t" id="toggle" href="javascript:toggle();">&#216;<\/a>' +
+	'<a accesskey="z" id="prev" href="javascript:go(-1);">&laquo;<\/a>' +
+	'<a accesskey="x" id="next" href="javascript:go(1);">&raquo;<\/a>' +
+	'<div id="navList"' + hideList + '><select id="jumplist" onchange="go(\'j\');"><\/select><\/div>' +
+	'<\/div><\/form>';
+	if (controlVis == 'hidden') {
+		var hidden = document.getElementById('navLinks');
+	} else {
+		var hidden = document.getElementById('jumplist');
+	}
+	addClass(hidden,'hideme');
+}
+
+function fontScale() {  // causes layout problems in FireFox that get fixed if browser's Reload is used; same may be true of other Gecko-based browsers
+	if (!s5mode) return false;
+	var vScale = 22;  // both yield 32 (after rounding) at 1024x768
+	var hScale = 32;  // perhaps should auto-calculate based on theme's declared value?
+	if (window.innerHeight) {
+		var vSize = window.innerHeight;
+		var hSize = window.innerWidth;
+	} else if (document.documentElement.clientHeight) {
+		var vSize = document.documentElement.clientHeight;
+		var hSize = document.documentElement.clientWidth;
+	} else if (document.body.clientHeight) {
+		var vSize = document.body.clientHeight;
+		var hSize = document.body.clientWidth;
+	} else {
+		var vSize = 700;  // assuming 1024x768, minus chrome and such
+		var hSize = 1024; // these do not account for kiosk mode or Opera Show
+	}
+	var newSize = Math.min(Math.round(vSize/vScale),Math.round(hSize/hScale));
+	fontSize(newSize + 'px');
+	if (isGe) {  // hack to counter incremental reflow bugs
+		var obj = document.getElementsByTagName('body')[0];
+		obj.style.display = 'none';
+		obj.style.display = 'block';
+	}
+}
+
+function fontSize(value) {
+	if (!(s5ss = document.getElementById('s5ss'))) {
+		if (!isIE) {
+			document.getElementsByTagName('head')[0].appendChild(s5ss = document.createElement('style'));
+			s5ss.setAttribute('media','screen, projection');
+			s5ss.setAttribute('id','s5ss');
+		} else {
+			document.createStyleSheet();
+			document.s5ss = document.styleSheets[document.styleSheets.length - 1];
+		}
+	}
+	if (!isIE) {
+		while (s5ss.lastChild) s5ss.removeChild(s5ss.lastChild);
+		s5ss.appendChild(document.createTextNode('body {font-size: ' + value + ' !important;}'));
+	} else {
+		document.s5ss.addRule('body','font-size: ' + value + ' !important;');
+	}
+}
+
+function notOperaFix() {
+	slideCSS = document.getElementById('slideProj').href;
+	var slides = document.getElementById('slideProj');
+	var outline = document.getElementById('outlineStyle');
+	slides.setAttribute('media','screen');
+	outline.disabled = true;
+	if (isGe) {
+		slides.setAttribute('href','null');   // Gecko fix
+		slides.setAttribute('href',slideCSS); // Gecko fix
+	}
+	if (isIE && document.styleSheets && document.styleSheets[0]) {
+		document.styleSheets[0].addRule('img', 'behavior: url(ui/default/iepngfix.htc)');
+		document.styleSheets[0].addRule('div', 'behavior: url(ui/default/iepngfix.htc)');
+		document.styleSheets[0].addRule('.slide', 'behavior: url(ui/default/iepngfix.htc)');
+	}
+}
+
+function getIncrementals(obj) {
+	var incrementals = new Array();
+	if (!obj) 
+		return incrementals;
+	var children = obj.childNodes;
+	for (var i = 0; i < children.length; i++) {
+		var child = children[i];
+		if (hasClass(child, 'incremental')) {
+			if (child.nodeName == 'OL' || child.nodeName == 'UL') {
+				removeClass(child, 'incremental');
+				for (var j = 0; j < child.childNodes.length; j++) {
+					if (child.childNodes[j].nodeType == 1) {
+						addClass(child.childNodes[j], 'incremental');
+					}
+				}
+			} else {
+				incrementals[incrementals.length] = child;
+				removeClass(child,'incremental');
+			}
+		}
+		if (hasClass(child, 'show-first')) {
+			if (child.nodeName == 'OL' || child.nodeName == 'UL') {
+				removeClass(child, 'show-first');
+				if (child.childNodes[isGe].nodeType == 1) {
+					removeClass(child.childNodes[isGe], 'incremental');
+				}
+			} else {
+				incrementals[incrementals.length] = child;
+			}
+		}
+		incrementals = incrementals.concat(getIncrementals(child));
+	}
+	return incrementals;
+}
+
+function createIncrementals() {
+	var incrementals = new Array();
+	for (var i = 0; i < smax; i++) {
+		incrementals[i] = getIncrementals(document.getElementById(slideIDs[i]));
+	}
+	return incrementals;
+}
+
+function defaultCheck() {
+	var allMetas = document.getElementsByTagName('meta');
+	for (var i = 0; i< allMetas.length; i++) {
+		if (allMetas[i].name == 'defaultView') {
+			defaultView = allMetas[i].content;
+		}
+		if (allMetas[i].name == 'controlVis') {
+			controlVis = allMetas[i].content;
+		}
+	}
+}
+
+// Key trap fix, new function body for trap()
+function trap(e) {
+	if (!e) {
+		e = event;
+		e.which = e.keyCode;
+	}
+	try {
+		modifierKey = e.ctrlKey || e.altKey || e.metaKey;
+	}
+	catch(e) {
+		modifierKey = false;
+	}
+	return modifierKey || e.which == 0;
+}
+
+function startup() {
+	defaultCheck();
+	if (!isOp) createControls();
+	slideLabel();
+	fixLinks();
+	externalLinks();
+	fontScale();
+	if (!isOp) {
+		notOperaFix();
+		incrementals = createIncrementals();
+		slideJump();
+		if (defaultView == 'outline') {
+			toggle();
+		}
+		document.onkeyup = keys;
+		document.onkeypress = trap;
+		document.onclick = clicker;
+	}
+}
+
+window.onload = startup;
+window.onresize = function(){setTimeout('fontScale()', 50);}
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/small-white/framing.css
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/small-white/framing.css (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/small-white/framing.css (revision 3)
@@ -0,0 +1,24 @@
+/* This file has been placed in the public domain. */
+/* The following styles size, place, and layer the slide components.
+   Edit these if you want to change the overall slide layout.
+   The commented lines can be uncommented (and modified, if necessary) 
+    to help you with the rearrangement process. */
+
+/* target = 1024x768 */
+
+div#header, div#footer, .slide {width: 100%; top: 0; left: 0;}
+div#footer {top: auto; bottom: 0; height: 2.5em; z-index: 5;}
+.slide {top: 0; width: 92%; padding: 1em 4% 0 4%; z-index: 2;}
+div#controls {left: 50%; bottom: 0; width: 50%; z-index: 100;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+  margin: 0;}
+#currentSlide {position: absolute; width: 10%; left: 45%; bottom: 1em;
+  z-index: 10;}
+html>body #currentSlide {position: fixed;}
+
+/*
+div#header {background: #FCC;}
+div#footer {background: #CCF;}
+div#controls {background: #BBD;}
+div#currentSlide {background: #FFC;}
+*/
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/small-white/pretty.css
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/small-white/pretty.css (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/small-white/pretty.css (revision 3)
@@ -0,0 +1,114 @@
+/* This file has been placed in the public domain. */
+/* Following are the presentation styles -- edit away! */
+
+html, body {margin: 0; padding: 0;}
+body {background: white; color: black;}
+:link, :visited {text-decoration: none; color: #00C;}
+#controls :active {color: #888 !important;}
+#controls :focus {outline: 1px dotted #222;}
+h1, h2, h3, h4 {font-size: 100%; margin: 0; padding: 0; font-weight: inherit;}
+
+blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em;}
+blockquote p {margin: 0;}
+
+kbd {font-weight: bold; font-size: 1em;}
+sup {font-size: smaller; line-height: 1px;}
+
+.slide pre {padding: 0; margin-left: 0; margin-right: 0; font-size: 90%;}
+.slide ul ul li {list-style: square;}
+.slide img.leader {display: block; margin: 0 auto;}
+.slide tt {font-size: 90%;}
+
+div#footer {font-family: sans-serif; color: #444; 
+  font-size: 0.5em; font-weight: bold; padding: 1em 0;}
+#footer h1 {display: block; padding: 0 1em;}
+#footer h2 {display: block; padding: 0.8em 1em 0;}
+
+.slide {font-size: 1.2em;}
+.slide h1 {padding-top: 0; z-index: 1; margin: 0; font: bold 150% sans-serif;}
+.slide h2 {font: bold 120% sans-serif; padding-top: 0.5em;}
+.slide h3 {font: bold 100% sans-serif; padding-top: 0.5em;}
+h1 abbr {font-variant: small-caps;}
+
+div#controls {position: absolute; left: 50%; bottom: 0;
+  width: 50%; text-align: right; font: bold 0.9em sans-serif;}
+html>body div#controls {position: fixed; padding: 0 0 1em 0; top: auto;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+  margin: 0; padding: 0;}
+#controls #navLinks a {padding: 0; margin: 0 0.5em; 
+  border: none; color: #888; cursor: pointer;}
+#controls #navList {height: 1em;}
+#controls #navList #jumplist {position: absolute; bottom: 0; right: 0;
+  background: #DDD; color: #222;}
+
+#currentSlide {text-align: center; font-size: 0.5em; color: #444;
+  font-family: sans-serif; font-weight: bold;}
+
+#slide0 {padding-top: 0em}
+#slide0 h1 {position: static; margin: 1em 0 0; padding: 0;
+  font: bold 2em sans-serif; white-space: normal; background: transparent;}
+#slide0 h2 {font: bold italic 1em sans-serif; margin: 0.25em;}
+#slide0 h3 {margin-top: 1.5em; font-size: 1.5em;}
+#slide0 h4 {margin-top: 0; font-size: 1em;}
+
+ul.urls {list-style: none; display: inline; margin: 0;}
+.urls li {display: inline; margin: 0;}
+.external {border-bottom: 1px dotted gray;}
+html>body .external {border-bottom: none;}
+.external:after {content: " \274F"; font-size: smaller; color: #77B;}
+
+.incremental, .incremental *, .incremental *:after {
+  color: white; visibility: visible; border: 0; border: 0;}
+img.incremental {visibility: hidden;}
+.slide .current {color: green;}
+
+.slide-display {display: inline ! important;}
+
+.huge {font-family: sans-serif; font-weight: bold; font-size: 150%;}
+.big {font-family: sans-serif; font-weight: bold; font-size: 120%;}
+.small {font-size: 75%;}
+.tiny {font-size: 50%;}
+.huge tt, .big tt, .small tt, .tiny tt {font-size: 115%;}
+.huge pre, .big pre, .small pre, .tiny pre {font-size: 115%;}
+
+.maroon {color: maroon;}
+.red {color: red;}
+.magenta {color: magenta;}
+.fuchsia {color: fuchsia;}
+.pink {color: #FAA;}
+.orange {color: orange;}
+.yellow {color: yellow;}
+.lime {color: lime;}
+.green {color: green;}
+.olive {color: olive;}
+.teal {color: teal;}
+.cyan {color: cyan;}
+.aqua {color: aqua;}
+.blue {color: blue;}
+.navy {color: navy;}
+.purple {color: purple;}
+.black {color: black;}
+.gray {color: gray;}
+.silver {color: silver;}
+.white {color: white;}
+
+.left {text-align: left ! important;}
+.center {text-align: center ! important;}
+.right {text-align: right ! important;}
+
+.animation {position: relative; margin: 1em 0; padding: 0;}
+.animation img {position: absolute;}
+
+/* Docutils-specific overrides */
+
+.slide table.docinfo {margin: 1em 0 0.5em 2em;}
+
+pre.literal-block, pre.doctest-block {background-color: white;}
+
+tt.docutils {background-color: white;}
+
+/* diagnostics */
+/*
+li:after {content: " [" attr(class) "]"; color: #F88;}
+div:before {content: "[" attr(class) "]"; color: #F88;}
+*/
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/medium-black/__base__
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/medium-black/__base__ (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/medium-black/__base__ (revision 3)
@@ -0,0 +1,2 @@
+# base theme of this theme:
+medium-white
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/medium-black/pretty.css
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/medium-black/pretty.css (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/medium-black/pretty.css (revision 3)
@@ -0,0 +1,115 @@
+/* This file has been placed in the public domain. */
+/* Following are the presentation styles -- edit away! */
+
+html, body {margin: 0; padding: 0;}
+body {background: black; color: white;}
+:link, :visited {text-decoration: none; color: cyan;}
+#controls :active {color: #888 !important;}
+#controls :focus {outline: 1px dotted #CCC;}
+h1, h2, h3, h4 {font-size: 100%; margin: 0; padding: 0; font-weight: inherit;}
+
+blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em;}
+blockquote p {margin: 0;}
+
+kbd {font-weight: bold; font-size: 1em;}
+sup {font-size: smaller; line-height: 1px;}
+
+.slide pre {padding: 0; margin-left: 0; margin-right: 0; font-size: 90%;}
+.slide ul ul li {list-style: square;}
+.slide img.leader {display: block; margin: 0 auto;}
+.slide tt {font-size: 90%;}
+
+div#footer {font-family: sans-serif; color: #AAA; 
+  font-size: 0.5em; font-weight: bold; padding: 1em 0;}
+#footer h1 {display: block; padding: 0 1em;}
+#footer h2 {display: block; padding: 0.8em 1em 0;}
+
+.slide {font-size: 1.75em;}
+.slide h1 {padding-top: 0; z-index: 1; margin: 0; font: bold 150% sans-serif;}
+.slide h2 {font: bold 125% sans-serif; padding-top: 0.5em;}
+.slide h3 {font: bold 110% sans-serif; padding-top: 0.5em;}
+h1 abbr {font-variant: small-caps;}
+
+div#controls {position: absolute; left: 50%; bottom: 0;
+  width: 50%; text-align: right; font: bold 0.9em sans-serif;}
+html>body div#controls {position: fixed; padding: 0 0 1em 0; top: auto;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+  margin: 0; padding: 0;}
+#controls #navLinks a {padding: 0; margin: 0 0.5em; 
+  border: none; color: #888; cursor: pointer;}
+#controls #navList {height: 1em;}
+#controls #navList #jumplist {position: absolute; bottom: 0; right: 0;
+  background: black; color: #CCC;}
+
+#currentSlide {text-align: center; font-size: 0.5em; color: #AAA;
+  font-family: sans-serif; font-weight: bold;}
+
+#slide0 h1 {position: static; margin: 0 0 0.5em; padding-top: 1em; top: 0;
+  font: bold 150% sans-serif; white-space: normal; background: transparent;}
+#slide0 h2 {font: bold italic 125% sans-serif; color: gray;}
+#slide0 h3 {margin-top: 1.5em; font: bold 110% sans-serif;}
+#slide0 h4 {margin-top: 0; font-size: 1em;}
+
+ul.urls {list-style: none; display: inline; margin: 0;}
+.urls li {display: inline; margin: 0;}
+.external {border-bottom: 1px dotted gray;}
+html>body .external {border-bottom: none;}
+.external:after {content: " \274F"; font-size: smaller; color: #FCC;}
+
+.incremental, .incremental *, .incremental *:after {
+  color: black; visibility: visible; border: 0;}
+img.incremental {visibility: hidden;}
+.slide .current {color: lime;}
+
+.slide-display {display: inline ! important;}
+
+.huge {font-family: sans-serif; font-weight: bold; font-size: 150%;}
+.big {font-family: sans-serif; font-weight: bold; font-size: 120%;}
+.small {font-size: 75%;}
+.tiny {font-size: 50%;}
+.huge tt, .big tt, .small tt, .tiny tt {font-size: 115%;}
+.huge pre, .big pre, .small pre, .tiny pre {font-size: 115%;}
+
+.maroon {color: maroon;}
+.red {color: red;}
+.magenta {color: magenta;}
+.fuchsia {color: fuchsia;}
+.pink {color: #FAA;}
+.orange {color: orange;}
+.yellow {color: yellow;}
+.lime {color: lime;}
+.green {color: green;}
+.olive {color: olive;}
+.teal {color: teal;}
+.cyan {color: cyan;}
+.aqua {color: aqua;}
+.blue {color: blue;}
+.navy {color: navy;}
+.purple {color: purple;}
+.black {color: black;}
+.gray {color: gray;}
+.silver {color: silver;}
+.white {color: white;}
+
+.left {text-align: left ! important;}
+.center {text-align: center ! important;}
+.right {text-align: right ! important;}
+
+.animation {position: relative; margin: 1em 0; padding: 0;}
+.animation img {position: absolute;}
+
+/* Docutils-specific overrides */
+
+.slide table.docinfo {margin: 0.5em 0 0.5em 1em;}
+
+div.sidebar {background-color: black;}
+
+pre.literal-block, pre.doctest-block {background-color: black;}
+
+tt.docutils {background-color: black;}
+
+/* diagnostics */
+/*
+li:after {content: " [" attr(class) "]"; color: #F88;}
+div:before {content: "[" attr(class) "]"; color: #F88;}
+*/
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/README.txt
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/README.txt (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/README.txt (revision 3)
@@ -0,0 +1,6 @@
+Except where otherwise noted (default/iepngfix.htc), all files in this
+directory have been released into the Public Domain.
+
+These files are based on files from S5 1.1, released into the Public
+Domain by Eric Meyer.  For further details, please see
+http://www.meyerweb.com/eric/tools/s5/credits.html.
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/big-black/__base__
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/big-black/__base__ (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/big-black/__base__ (revision 3)
@@ -0,0 +1,2 @@
+# base theme of this theme:
+big-white
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/big-black/framing.css
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/big-black/framing.css (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/big-black/framing.css (revision 3)
@@ -0,0 +1,25 @@
+/* The following styles size, place, and layer the slide components.
+   Edit these if you want to change the overall slide layout.
+   The commented lines can be uncommented (and modified, if necessary) 
+    to help you with the rearrangement process. */
+
+/* target = 1024x768 */
+
+div#header, div#footer, .slide {width: 100%; top: 0; left: 0;}
+div#header {top: 0; z-index: 1;}
+div#footer {display:none;}
+.slide {top: 0; width: 92%; padding: 0.1em 4% 4%; z-index: 2;}
+/*  list-style: none;} */
+div#controls {left: 50%; bottom: 0; width: 50%; z-index: 100;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+  margin: 0;}
+#currentSlide {position: absolute; width: 10%; left: 45%; bottom: 1em;
+  z-index: 10;}
+html>body #currentSlide {position: fixed;}
+
+/*
+div#header {background: #FCC;}
+div#footer {background: #CCF;}
+div#controls {background: #BBD;}
+div#currentSlide {background: #FFC;}
+*/
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/big-black/pretty.css
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/big-black/pretty.css (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/big-black/pretty.css (revision 3)
@@ -0,0 +1,109 @@
+/* This file has been placed in the public domain. */
+/* Following are the presentation styles -- edit away! */
+
+html, body {margin: 0; padding: 0;}
+body {background: black; color: white;}
+:link, :visited {text-decoration: none; color: cyan;}
+#controls :active {color: #888 !important;}
+#controls :focus {outline: 1px dotted #CCC;}
+
+blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em;}
+blockquote p {margin: 0;}
+
+kbd {font-weight: bold; font-size: 1em;}
+sup {font-size: smaller; line-height: 1px;}
+
+.slide pre {padding: 0; margin-left: 0; margin-right: 0; font-size: 90%;}
+.slide ul ul li {list-style: square;}
+.slide img.leader {display: block; margin: 0 auto;}
+.slide tt {font-size: 90%;}
+
+.slide {font-size: 3em; font-family: sans-serif; font-weight: bold;}
+.slide h1 {padding-top: 0; z-index: 1; margin: 0; font-size: 120%;}
+.slide h2 {font-size: 110%;}
+.slide h3 {font-size: 105%;}
+h1 abbr {font-variant: small-caps;}
+
+div#controls {position: absolute; left: 50%; bottom: 0;
+  width: 50%; text-align: right; font: bold 0.9em sans-serif;}
+html>body div#controls {position: fixed; padding: 0 0 1em 0; top: auto;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+  margin: 0; padding: 0;}
+#controls #navLinks a {padding: 0; margin: 0 0.5em; 
+  border: none; color: #888; cursor: pointer;}
+#controls #navList {height: 1em;}
+#controls #navList #jumplist {position: absolute; bottom: 0; right: 0;
+  background: black; color: #CCC;}
+
+#currentSlide {text-align: center; font-size: 0.5em; color: #AAA;
+  font-family: sans-serif; font-weight: bold;}
+
+#slide0 h1 {position: static; margin: 0 0 0.5em; padding-top: 0.3em; top: 0;
+  font-size: 150%; white-space: normal; background: transparent;}
+#slide0 h2 {font: 110%; font-style: italic; color: gray;}
+#slide0 h3 {margin-top: 1.5em; font-size: 1.5em;}
+#slide0 h4 {margin-top: 0; font-size: 1em;}
+
+ul.urls {list-style: none; display: inline; margin: 0;}
+.urls li {display: inline; margin: 0;}
+.external {border-bottom: 1px dotted gray;}
+html>body .external {border-bottom: none;}
+.external:after {content: " \274F"; font-size: smaller; color: #FCC;}
+
+.incremental, .incremental *, .incremental *:after {
+  color: black; visibility: visible; border: 0;}
+img.incremental {visibility: hidden;}
+.slide .current {color: lime;}
+
+.slide-display {display: inline ! important;}
+
+.huge {font-size: 150%;}
+.big {font-size: 120%;}
+.small {font-size: 75%;}
+.tiny {font-size: 50%;}
+.huge tt, .big tt, .small tt, .tiny tt {font-size: 115%;}
+.huge pre, .big pre, .small pre, .tiny pre {font-size: 115%;}
+
+.maroon {color: maroon;}
+.red {color: red;}
+.magenta {color: magenta;}
+.fuchsia {color: fuchsia;}
+.pink {color: #FAA;}
+.orange {color: orange;}
+.yellow {color: yellow;}
+.lime {color: lime;}
+.green {color: green;}
+.olive {color: olive;}
+.teal {color: teal;}
+.cyan {color: cyan;}
+.aqua {color: aqua;}
+.blue {color: blue;}
+.navy {color: navy;}
+.purple {color: purple;}
+.black {color: black;}
+.gray {color: gray;}
+.silver {color: silver;}
+.white {color: white;}
+
+.left {text-align: left ! important;}
+.center {text-align: center ! important;}
+.right {text-align: right ! important;}
+
+.animation {position: relative; margin: 1em 0; padding: 0;}
+.animation img {position: absolute;}
+
+/* Docutils-specific overrides */
+
+.slide table.docinfo {margin: 0.5em 0 0.5em 1em;}
+
+div.sidebar {background-color: black;}
+
+pre.literal-block, pre.doctest-block {background-color: black;}
+
+tt.docutils {background-color: black;}
+
+/* diagnostics */
+/*
+li:after {content: " [" attr(class) "]"; color: #F88;}
+div:before {content: "[" attr(class) "]"; color: #F88;}
+*/
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/medium-white/framing.css
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/medium-white/framing.css (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/medium-white/framing.css (revision 3)
@@ -0,0 +1,24 @@
+/* This file has been placed in the public domain. */
+/* The following styles size, place, and layer the slide components.
+   Edit these if you want to change the overall slide layout.
+   The commented lines can be uncommented (and modified, if necessary) 
+    to help you with the rearrangement process. */
+
+/* target = 1024x768 */
+
+div#header, div#footer, .slide {width: 100%; top: 0; left: 0;}
+div#footer {top: auto; bottom: 0; height: 2.5em; z-index: 5;}
+.slide {top: 0; width: 92%; padding: 0.75em 4% 0 4%; z-index: 2;}
+div#controls {left: 50%; bottom: 0; width: 50%; z-index: 100;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+  margin: 0;}
+#currentSlide {position: absolute; width: 10%; left: 45%; bottom: 1em;
+  z-index: 10;}
+html>body #currentSlide {position: fixed;}
+
+/*
+div#header {background: #FCC;}
+div#footer {background: #CCF;}
+div#controls {background: #BBD;}
+div#currentSlide {background: #FFC;}
+*/
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/medium-white/pretty.css
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/medium-white/pretty.css (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/themes/medium-white/pretty.css (revision 3)
@@ -0,0 +1,113 @@
+/* This file has been placed in the public domain. */
+/* Following are the presentation styles -- edit away! */
+
+html, body {margin: 0; padding: 0;}
+body {background: white; color: black;}
+:link, :visited {text-decoration: none; color: #00C;}
+#controls :active {color: #888 !important;}
+#controls :focus {outline: 1px dotted #222;}
+h1, h2, h3, h4 {font-size: 100%; margin: 0; padding: 0; font-weight: inherit;}
+
+blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em;}
+blockquote p {margin: 0;}
+
+kbd {font-weight: bold; font-size: 1em;}
+sup {font-size: smaller; line-height: 1px;}
+
+.slide pre {padding: 0; margin-left: 0; margin-right: 0; font-size: 90%;}
+.slide ul ul li {list-style: square;}
+.slide img.leader {display: block; margin: 0 auto;}
+.slide tt {font-size: 90%;}
+
+div#footer {font-family: sans-serif; color: #444; 
+  font-size: 0.5em; font-weight: bold; padding: 1em 0;}
+#footer h1 {display: block; padding: 0 1em;}
+#footer h2 {display: block; padding: 0.8em 1em 0;}
+
+.slide {font-size: 1.75em;}
+.slide h1 {padding-top: 0; z-index: 1; margin: 0; font: bold 150% sans-serif;}
+.slide h2 {font: bold 125% sans-serif; padding-top: 0.5em;}
+.slide h3 {font: bold 110% sans-serif; padding-top: 0.5em;}
+h1 abbr {font-variant: small-caps;}
+
+div#controls {position: absolute; left: 50%; bottom: 0;
+  width: 50%; text-align: right; font: bold 0.9em sans-serif;}
+html>body div#controls {position: fixed; padding: 0 0 1em 0; top: auto;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+  margin: 0; padding: 0;}
+#controls #navLinks a {padding: 0; margin: 0 0.5em; 
+  border: none; color: #888; cursor: pointer;}
+#controls #navList {height: 1em;}
+#controls #navList #jumplist {position: absolute; bottom: 0; right: 0;
+  background: #DDD; color: #222;}
+
+#currentSlide {text-align: center; font-size: 0.5em; color: #444;
+  font-family: sans-serif; font-weight: bold;}
+
+#slide0 h1 {position: static; margin: 0 0 0.5em; padding-top: 1em; top: 0;
+  font: bold 150% sans-serif; white-space: normal; background: transparent;}
+#slide0 h2 {font: bold italic 125% sans-serif; color: gray;}
+#slide0 h3 {margin-top: 1.5em; font: bold 110% sans-serif;}
+#slide0 h4 {margin-top: 0; font-size: 1em;}
+
+ul.urls {list-style: none; display: inline; margin: 0;}
+.urls li {display: inline; margin: 0;}
+.external {border-bottom: 1px dotted gray;}
+html>body .external {border-bottom: none;}
+.external:after {content: " \274F"; font-size: smaller; color: #77B;}
+
+.incremental, .incremental *, .incremental *:after {
+  color: white; visibility: visible; border: 0;}
+img.incremental {visibility: hidden;}
+.slide .current {color: green;}
+
+.slide-display {display: inline ! important;}
+
+.huge {font-family: sans-serif; font-weight: bold; font-size: 150%;}
+.big {font-family: sans-serif; font-weight: bold; font-size: 120%;}
+.small {font-size: 75%;}
+.tiny {font-size: 50%;}
+.huge tt, .big tt, .small tt, .tiny tt {font-size: 115%;}
+.huge pre, .big pre, .small pre, .tiny pre {font-size: 115%;}
+
+.maroon {color: maroon;}
+.red {color: red;}
+.magenta {color: magenta;}
+.fuchsia {color: fuchsia;}
+.pink {color: #FAA;}
+.orange {color: orange;}
+.yellow {color: yellow;}
+.lime {color: lime;}
+.green {color: green;}
+.olive {color: olive;}
+.teal {color: teal;}
+.cyan {color: cyan;}
+.aqua {color: aqua;}
+.blue {color: blue;}
+.navy {color: navy;}
+.purple {color: purple;}
+.black {color: black;}
+.gray {color: gray;}
+.silver {color: silver;}
+.white {color: white;}
+
+.left {text-align: left ! important;}
+.center {text-align: center ! important;}
+.right {text-align: right ! important;}
+
+.animation {position: relative; margin: 1em 0; padding: 0;}
+.animation img {position: absolute;}
+
+/* Docutils-specific overrides */
+
+.slide table.docinfo {margin: 0.5em 0 0.5em 1em;}
+
+pre.literal-block, pre.doctest-block {background-color: white;}
+
+tt.docutils {background-color: white;}
+
+/* diagnostics */
+/*
+li:after {content: " [" attr(class) "]"; color: #F88;}
+div:before {content: "[" attr(class) "]"; color: #F88;}
+*/
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/__init__.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/__init__.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/s5_html/__init__.py (revision 3)
@@ -0,0 +1,326 @@
+# Author: Chris Liechti
+# Contact: cliechti@gmx.net
+# Author: David Goodger
+# Contact: goodger@python.org
+# Revision: $Revision: 4223 $
+# Date: $Date: 2005-12-18 00:52:30 +0100 (Sun, 18 Dec 2005) $
+# Copyright: This module has been placed in the public domain.
+
+"""
+S5/HTML Slideshow Writer.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import sys
+import os
+import re
+import docutils
+from docutils import frontend, nodes, utils
+from docutils.writers import html4css1
+from docutils.parsers.rst import directives
+
+themes_dir_path = utils.relative_path(
+    os.path.join(os.getcwd(), 'dummy'),
+    os.path.join(os.path.dirname(__file__), 'themes'))
+
+def find_theme(name):
+    # Where else to look for a theme?
+    # Check working dir?  Destination dir?  Config dir?  Plugins dir?
+    path = os.path.join(themes_dir_path, name)
+    if not os.path.isdir(path):
+        raise docutils.ApplicationError(
+            'Theme directory not found: %r (path: %r)' % (name, path))
+    return path
+
+
+class Writer(html4css1.Writer):
+
+    settings_spec = html4css1.Writer.settings_spec + (
+        'S5 Slideshow Specific Options',
+        'For the S5/HTML writer, the --no-toc-backlinks option '
+        '(defined in General Docutils Options above) is the default, '
+        'and should not be changed.',
+        (('Specify an installed S5 theme by name.  Overrides --theme-url.  '
+          'The default theme name is "default".  The theme files will be '
+          'copied into a "ui/<theme>" directory, in the same directory as the '
+          'destination file (output HTML).  Note that existing theme files '
+          'will not be overwritten (unless --overwrite-theme-files is used).',
+          ['--theme'],
+          {'default': 'default', 'metavar': '<name>',
+           'overrides': 'theme_url'}),
+         ('Specify an S5 theme URL.  The destination file (output HTML) will '
+          'link to this theme; nothing will be copied.  Overrides --theme.',
+          ['--theme-url'],
+          {'metavar': '<URL>', 'overrides': 'theme'}),
+         ('Allow existing theme files in the ``ui/<theme>`` directory to be '
+          'overwritten.  The default is not to overwrite theme files.',
+          ['--overwrite-theme-files'],
+          {'action': 'store_true'}),
+         ('Keep existing theme files in the ``ui/<theme>`` directory; do not '
+          'overwrite any.  This is the default.',
+          ['--keep-theme-files'],
+          {'dest': 'overwrite_theme_files', 'action': 'store_false'}),
+         ('Enable the current slide indicator ("1 / 15").  '
+          'The default is to disable it.',
+          ['--current-slide'],
+          {'action': 'store_true'}),
+         ('Disable the current slide indicator.  This is the default.',
+          ['--no-current-slide'],
+          {'dest': 'current_slide', 'action': 'store_false'}),))
+
+    settings_default_overrides = {'toc_backlinks': 0}
+
+    config_section = 's5_html writer'
+    config_section_dependencies = ('writers', 'html4css1 writer')
+
+    def __init__(self):
+        html4css1.Writer.__init__(self)
+        self.translator_class = S5HTMLTranslator
+
+
+class S5HTMLTranslator(html4css1.HTMLTranslator):
+
+    doctype = (
+        '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"'
+        ' "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\n')
+
+    s5_stylesheet_template = """\
+<!-- configuration parameters -->
+<meta name="defaultView" content="slideshow" />
+<meta name="controlVis" content="hidden" />
+<!-- style sheet links -->
+<script src="%(path)s/slides.js" type="text/javascript"></script>
+<link rel="stylesheet" href="%(path)s/slides.css"
+      type="text/css" media="projection" id="slideProj" />
+<link rel="stylesheet" href="%(path)s/outline.css"
+      type="text/css" media="screen" id="outlineStyle" />
+<link rel="stylesheet" href="%(path)s/print.css"
+      type="text/css" media="print" id="slidePrint" />
+<link rel="stylesheet" href="%(path)s/opera.css"
+      type="text/css" media="projection" id="operaFix" />\n"""
+    # The script element must go in front of the link elements to
+    # avoid a flash of unstyled content (FOUC), reproducible with
+    # Firefox.
+
+    disable_current_slide = """
+<style type="text/css">
+#currentSlide {display: none;}
+</style>\n"""
+
+    layout_template = """\
+<div class="layout">
+<div id="controls"></div>
+<div id="currentSlide"></div>
+<div id="header">
+%(header)s
+</div>
+<div id="footer">
+%(title)s%(footer)s
+</div>
+</div>\n"""
+# <div class="topleft"></div>
+# <div class="topright"></div>
+# <div class="bottomleft"></div>
+# <div class="bottomright"></div>
+
+    default_theme = 'default'
+    """Name of the default theme."""
+
+    base_theme_file = '__base__'
+    """Name of the file containing the name of the base theme."""
+
+    direct_theme_files = (
+        'slides.css', 'outline.css', 'print.css', 'opera.css', 'slides.js')
+    """Names of theme files directly linked to in the output HTML"""
+
+    indirect_theme_files = (
+        's5-core.css', 'framing.css', 'pretty.css', 'blank.gif', 'iepngfix.htc')
+    """Names of files used indirectly; imported or used by files in
+    `direct_theme_files`."""
+
+    required_theme_files = indirect_theme_files + direct_theme_files
+    """Names of mandatory theme files."""
+
+    def __init__(self, *args):
+        html4css1.HTMLTranslator.__init__(self, *args)
+        #insert S5-specific stylesheet and script stuff:
+        self.theme_file_path = None
+        self.setup_theme()
+        self.stylesheet.append(self.s5_stylesheet_template
+                               % {'path': self.theme_file_path})
+        if not self.document.settings.current_slide:
+            self.stylesheet.append(self.disable_current_slide)
+        self.add_meta('<meta name="version" content="S5 1.1" />\n')
+        self.s5_footer = []
+        self.s5_header = []
+        self.section_count = 0
+        self.theme_files_copied = None
+
+    def setup_theme(self):
+        if self.document.settings.theme:
+            self.copy_theme()
+        elif self.document.settings.theme_url:
+            self.theme_file_path = self.document.settings.theme_url
+        else:
+            raise docutils.ApplicationError(
+                'No theme specified for S5/HTML writer.')
+
+    def copy_theme(self):
+        """
+        Locate & copy theme files.
+
+        A theme may be explicitly based on another theme via a '__base__'
+        file.  The default base theme is 'default'.  Files are accumulated
+        from the specified theme, any base themes, and 'default'.
+        """
+        settings = self.document.settings
+        path = find_theme(settings.theme)
+        theme_paths = [path]
+        self.theme_files_copied = {}
+        required_files_copied = {}
+        # This is a link (URL) in HTML, so we use "/", not os.sep:
+        self.theme_file_path = '%s/%s' % ('ui', settings.theme)
+        if settings._destination:
+            dest = os.path.join(
+                os.path.dirname(settings._destination), 'ui', settings.theme)
+            if not os.path.isdir(dest):
+                os.makedirs(dest)
+        else:
+            # no destination, so we can't copy the theme
+            return
+        default = 0
+        while path:
+            for f in os.listdir(path):  # copy all files from each theme
+                if f == self.base_theme_file:
+                    continue            # ... except the "__base__" file
+                if ( self.copy_file(f, path, dest)
+                     and f in self.required_theme_files):
+                    required_files_copied[f] = 1
+            if default:
+                break                   # "default" theme has no base theme
+            # Find the "__base__" file in theme directory:
+            base_theme_file = os.path.join(path, self.base_theme_file)
+            # If it exists, read it and record the theme path:
+            if os.path.isfile(base_theme_file):
+                lines = open(base_theme_file).readlines()
+                for line in lines:
+                    line = line.strip()
+                    if line and not line.startswith('#'):
+                        path = find_theme(line)
+                        if path in theme_paths: # check for duplicates (cycles)
+                            path = None         # if found, use default base
+                        else:
+                            theme_paths.append(path)
+                        break
+                else:                   # no theme name found
+                    path = None         # use default base
+            else:                       # no base theme file found
+                path = None             # use default base
+            if not path:
+                path = find_theme(self.default_theme)
+                theme_paths.append(path)
+                default = 1
+        if len(required_files_copied) != len(self.required_theme_files):
+            # Some required files weren't found & couldn't be copied.
+            required = list(self.required_theme_files)
+            for f in required_files_copied.keys():
+                required.remove(f)
+            raise docutils.ApplicationError(
+                'Theme files not found: %s'
+                % ', '.join(['%r' % f for f in required]))
+
+    files_to_skip_pattern = re.compile(r'~$|\.bak$|#$|\.cvsignore$')
+
+    def copy_file(self, name, source_dir, dest_dir):
+        """
+        Copy file `name` from `source_dir` to `dest_dir`.
+        Return 1 if the file exists in either `source_dir` or `dest_dir`.
+        """
+        source = os.path.join(source_dir, name)
+        dest = os.path.join(dest_dir, name)
+        if self.theme_files_copied.has_key(dest):
+            return 1
+        else:
+            self.theme_files_copied[dest] = 1
+        if os.path.isfile(source):
+            if self.files_to_skip_pattern.search(source):
+                return None
+            settings = self.document.settings
+            if os.path.exists(dest) and not settings.overwrite_theme_files:
+                settings.record_dependencies.add(dest)
+            else:
+                src_file = open(source, 'rb')
+                src_data = src_file.read()
+                src_file.close()
+                dest_file = open(dest, 'wb')
+                dest_dir = dest_dir.replace(os.sep, '/')
+                dest_file.write(src_data.replace(
+                    'ui/default', dest_dir[dest_dir.rfind('ui/'):]))
+                dest_file.close()
+                settings.record_dependencies.add(source)
+            return 1
+        if os.path.isfile(dest):
+            return 1
+
+    def depart_document(self, node):
+        header = ''.join(self.s5_header)
+        footer = ''.join(self.s5_footer)
+        title = ''.join(self.html_title).replace('<h1 class="title">', '<h1>')
+        layout = self.layout_template % {'header': header,
+                                         'title': title,
+                                         'footer': footer}
+        self.fragment.extend(self.body)
+        self.body_prefix.extend(layout)
+        self.body_prefix.append('<div class="presentation">\n')
+        self.body_prefix.append(
+            self.starttag({'classes': ['slide'], 'ids': ['slide0']}, 'div'))
+        if not self.section_count:
+            self.body.append('</div>\n')
+        self.body_suffix.insert(0, '</div>\n')
+        # skip content-type meta tag with interpolated charset value:
+        self.html_head.extend(self.head[1:])
+        self.html_body.extend(self.body_prefix[1:] + self.body_pre_docinfo
+                              + self.docinfo + self.body
+                              + self.body_suffix[:-1])
+
+    def depart_footer(self, node):
+        start = self.context.pop()
+        self.s5_footer.append('<h2>')
+        self.s5_footer.extend(self.body[start:])
+        self.s5_footer.append('</h2>')
+        del self.body[start:]
+
+    def depart_header(self, node):
+        start = self.context.pop()
+        header = ['<div id="header">\n']
+        header.extend(self.body[start:])
+        header.append('\n</div>\n')
+        del self.body[start:]
+        self.s5_header.extend(header)
+
+    def visit_section(self, node):
+        if not self.section_count:
+            self.body.append('\n</div>\n')
+        self.section_count += 1
+        self.section_level += 1
+        if self.section_level > 1:
+            # dummy for matching div's
+            self.body.append(self.starttag(node, 'div', CLASS='section'))
+        else:
+            self.body.append(self.starttag(node, 'div', CLASS='slide'))
+
+    def visit_subtitle(self, node):
+        if isinstance(node.parent, nodes.section):
+            level = self.section_level + self.initial_header_level - 1
+            if level == 1:
+                level = 2
+            tag = 'h%s' % level
+            self.body.append(self.starttag(node, tag, ''))
+            self.context.append('</%s>\n' % tag)
+        else:
+            html4css1.HTMLTranslator.visit_subtitle(self, node)
+
+    def visit_title(self, node, move_ids=0):
+        html4css1.HTMLTranslator.visit_title(self, node, move_ids=move_ids)
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/docutils_xml.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/docutils_xml.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/docutils_xml.py (revision 3)
@@ -0,0 +1,75 @@
+# Authors: David Goodger
+# Contact: goodger@users.sourceforge.net
+# Revision: $Revision: 3512 $
+# Date: $Date: 2005-06-19 17:26:13 +0200 (Sun, 19 Jun 2005) $
+# Copyright: This module has been placed in the public domain.
+
+"""
+Simple internal document tree Writer, writes Docutils XML.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import docutils
+from docutils import frontend, writers
+
+
+class Writer(writers.Writer):
+
+    supported = ('xml',)
+    """Formats this writer supports."""
+
+    settings_spec = (
+        '"Docutils XML" Writer Options',
+        'Warning: the --newlines and --indents options may adversely affect '
+        'whitespace; use them only for reading convenience.',
+        (('Generate XML with newlines before and after tags.',
+          ['--newlines'],
+          {'action': 'store_true', 'validator': frontend.validate_boolean}),
+         ('Generate XML with indents and newlines.',
+          ['--indents'],
+          {'action': 'store_true', 'validator': frontend.validate_boolean}),
+         ('Omit the XML declaration.  Use with caution.',
+          ['--no-xml-declaration'],
+          {'dest': 'xml_declaration', 'default': 1, 'action': 'store_false',
+           'validator': frontend.validate_boolean}),
+         ('Omit the DOCTYPE declaration.',
+          ['--no-doctype'],
+          {'dest': 'doctype_declaration', 'default': 1,
+           'action': 'store_false', 'validator': frontend.validate_boolean}),))
+
+    settings_defaults = {'output_encoding_error_handler': 'xmlcharrefreplace'}
+
+    config_section = 'docutils_xml writer'
+    config_section_dependencies = ('writers',)
+
+    output = None
+    """Final translated form of `document`."""
+
+    xml_declaration = '<?xml version="1.0" encoding="%s"?>\n'
+    #xml_stylesheet = '<?xml-stylesheet type="text/xsl" href="%s"?>\n'
+    doctype = (
+        '<!DOCTYPE document PUBLIC'
+        ' "+//IDN docutils.sourceforge.net//DTD Docutils Generic//EN//XML"'
+        ' "http://docutils.sourceforge.net/docs/ref/docutils.dtd">\n')
+    generator = '<!-- Generated by Docutils %s -->\n'
+
+    def translate(self):
+        settings = self.document.settings
+        indent = newline = ''
+        if settings.newlines:
+            newline = '\n'
+        if settings.indents:
+            newline = '\n'
+            indent = '    '
+        output_prefix = []
+        if settings.xml_declaration:
+            output_prefix.append(
+                self.xml_declaration % settings.output_encoding)
+        if settings.doctype_declaration:
+            output_prefix.append(self.doctype)
+        output_prefix.append(self.generator % docutils.__version__)
+        docnode = self.document.asdom().childNodes[0]
+        self.output = (''.join(output_prefix)
+                       + docnode.toprettyxml(indent, newline))
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/newlatex2e/__init__.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/newlatex2e/__init__.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/newlatex2e/__init__.py (revision 3)
@@ -0,0 +1,788 @@
+# Author: Felix Wiemann
+# Contact: Felix_Wiemann@ososo.de
+# Revision: $Revision: 4242 $
+# Date: $Date: 2006-01-06 00:28:53 +0100 (Fri, 06 Jan 2006) $
+# Copyright: This module has been placed in the public domain.
+
+"""
+LaTeX2e document tree Writer.
+"""
+
+# Thanks to Engelbert Gruber and various contributors for the original
+# LaTeX writer, some code and many ideas of which have been used for
+# this writer.
+
+__docformat__ = 'reStructuredText'
+
+
+import re
+import os.path
+from types import ListType
+
+import docutils
+from docutils import nodes, writers, utils
+from docutils.writers.newlatex2e import unicode_map
+from docutils.transforms import writer_aux
+
+
+class Writer(writers.Writer):
+
+    supported = ('newlatex', 'newlatex2e')
+    """Formats this writer supports."""
+
+    default_stylesheet = 'base.tex'
+
+    default_stylesheet_path = utils.relative_path(
+        os.path.join(os.getcwd(), 'dummy'),
+        os.path.join(os.path.dirname(__file__), default_stylesheet))
+
+    settings_spec = (
+        'LaTeX-Specific Options',
+        'Note that this LaTeX writer is still EXPERIMENTAL. '
+        'You must specify the location of the tools/stylesheets/latex.tex '
+        'stylesheet file contained in the Docutils distribution tarball to '
+        'make the LaTeX output work.',
+        (('Specify a stylesheet file.  The path is used verbatim to include '
+          'the file.  Overrides --stylesheet-path.',
+          ['--stylesheet'],
+          {'default': '', 'metavar': '<file>',
+           'overrides': 'stylesheet_path'}),
+         ('Specify a stylesheet file, relative to the current working '
+          'directory.  Overrides --stylesheet.  Default: "%s"'
+          % default_stylesheet_path,
+          ['--stylesheet-path'],
+          {'metavar': '<file>', 'overrides': 'stylesheet',
+           'default': default_stylesheet_path}),
+         ('Specify a user stylesheet file.  See --stylesheet.',
+          ['--user-stylesheet'],
+          {'default': '', 'metavar': '<file>',
+           'overrides': 'user_stylesheet_path'}),
+         ('Specify a user stylesheet file.  See --stylesheet-path.',
+          ['--user-stylesheet-path'],
+          {'metavar': '<file>', 'overrides': 'user_stylesheet'})
+         ),)
+
+    settings_defaults = {
+        # Many Unicode characters are provided by unicode_map.py.
+        'output_encoding': 'ascii',
+        'output_encoding_error_handler': 'strict',
+        # Since we are using superscript footnotes, it is necessary to
+        # trim whitespace in front of footnote references.
+        'trim_footnote_reference_space': 1,
+        # Currently unsupported:
+        'docinfo_xform': 0,
+        # During development:
+        'traceback': 1
+        }
+
+    relative_path_settings = ('stylesheet_path', 'user_stylesheet_path')
+
+    config_section = 'newlatex2e writer'
+    config_section_dependencies = ('writers',)
+
+    output = None
+    """Final translated form of `document`."""
+
+    def get_transforms(self):
+        return writers.Writer.get_transforms(self) + [writer_aux.Compound]
+
+    def __init__(self):
+        writers.Writer.__init__(self)
+        self.translator_class = LaTeXTranslator
+
+    def translate(self):
+        visitor = self.translator_class(self.document)
+        self.document.walkabout(visitor)
+        assert not visitor.context, 'context not empty: %s' % visitor.context
+        self.output = visitor.astext()
+        self.head = visitor.header
+        self.body = visitor.body
+
+
+class LaTeXException(Exception):
+    """
+    Exception base class to for exceptions which influence the
+    automatic generation of LaTeX code.
+    """
+
+
+class SkipAttrParentLaTeX(LaTeXException):
+    """
+    Do not generate ``\Dattr`` and ``\renewcommand{\Dparent}{...}`` for this
+    node.
+
+    To be raised from ``before_...`` methods.
+    """
+
+
+class SkipParentLaTeX(LaTeXException):
+    """
+    Do not generate ``\renewcommand{\DNparent}{...}`` for this node.
+
+    To be raised from ``before_...`` methods.
+    """
+
+
+class LaTeXTranslator(nodes.SparseNodeVisitor):
+
+    # Country code by a.schlock.
+    # Partly manually converted from iso and babel stuff.
+    iso639_to_babel = {
+        'no': 'norsk',     # added by hand
+        'gd': 'scottish',  # added by hand
+        'sl': 'slovenian',
+        'af': 'afrikaans',
+        'bg': 'bulgarian',
+        'br': 'breton',
+        'ca': 'catalan',
+        'cs': 'czech',
+        'cy': 'welsh',
+        'da': 'danish',
+        'fr': 'french',
+        # french, francais, canadien, acadian
+        'de': 'ngerman',
+        # ngerman, naustrian, german, germanb, austrian
+        'el': 'greek',
+        'en': 'english',
+        # english, USenglish, american, UKenglish, british, canadian
+        'eo': 'esperanto',
+        'es': 'spanish',
+        'et': 'estonian',
+        'eu': 'basque',
+        'fi': 'finnish',
+        'ga': 'irish',
+        'gl': 'galician',
+        'he': 'hebrew',
+        'hr': 'croatian',
+        'hu': 'hungarian',
+        'is': 'icelandic',
+        'it': 'italian',
+        'la': 'latin',
+        'nl': 'dutch',
+        'pl': 'polish',
+        'pt': 'portuguese',
+        'ro': 'romanian',
+        'ru': 'russian',
+        'sk': 'slovak',
+        'sr': 'serbian',
+        'sv': 'swedish',
+        'tr': 'turkish',
+        'uk': 'ukrainian'
+    }
+
+    # Start with left double quote.
+    left_quote = 1
+
+    def __init__(self, document):
+        nodes.NodeVisitor.__init__(self, document)
+        self.settings = document.settings
+        self.header = []
+        self.body = []
+        self.context = []
+        self.stylesheet_path = utils.get_stylesheet_reference(
+            self.settings, os.path.join(os.getcwd(), 'dummy'))
+        if self.stylesheet_path:
+            self.settings.record_dependencies.add(self.stylesheet_path)
+        # This ugly hack will be cleaned up when refactoring the
+        # stylesheet mess.
+        self.settings.stylesheet = self.settings.user_stylesheet
+        self.settings.stylesheet_path = self.settings.user_stylesheet_path
+        self.user_stylesheet_path = utils.get_stylesheet_reference(
+            self.settings, os.path.join(os.getcwd(), 'dummy'))
+        if self.user_stylesheet_path:
+            self.settings.record_dependencies.add(self.user_stylesheet_path)
+        self.write_header()
+
+    def write_header(self):
+        a = self.header.append
+        a('%% Generated by Docutils %s <http://docutils.sourceforge.net>.'
+          % docutils.__version__)
+        a('')
+        a('% Docutils settings:')
+        lang = self.settings.language_code or ''
+        a(r'\providecommand{\Dlanguageiso}{%s}' % lang)
+        a(r'\providecommand{\Dlanguagebabel}{%s}' % self.iso639_to_babel.get(
+            lang, self.iso639_to_babel.get(lang.split('_')[0], '')))
+        a('')
+        if self.user_stylesheet_path:
+            a('% User stylesheet:')
+            a(r'\input{%s}' % self.user_stylesheet_path)
+        a('% Docutils stylesheet:')
+        a(r'\input{%s}' % self.stylesheet_path)
+        a('')
+        a('% Default definitions for Docutils nodes:')
+        for node_name in nodes.node_class_names:
+            a(r'\providecommand{\DN%s}[1]{#1}' % node_name.replace('_', ''))
+        a('')
+        a('% Auxiliary definitions:')
+        a(r'\providecommand{\Dsetattr}[2]{}')
+        a(r'\providecommand{\Dparent}{} % variable')
+        a(r'\providecommand{\Dattr}[5]{#5}')
+        a(r'\providecommand{\Dattrlen}{} % variable')
+        a(r'\providecommand{\Dtitleastext}{x} % variable')
+        a(r'\providecommand{\Dsinglebackref}{} % variable')
+        a(r'\providecommand{\Dmultiplebackrefs}{} % variable')
+        a(r'\providecommand{\Dparagraphindented}{false} % variable')
+        a('\n\n')
+
+    unicode_map = unicode_map.unicode_map # comprehensive Unicode map
+    # Fix problems with unimap.py.
+    unicode_map.update({
+        # We have AE or T1 encoding, so "``" etc. work.  The macros
+        # from unimap.py may *not* work.
+        u'\u201C': '{``}',
+        u'\u201D': "{''}",
+        u'\u201E': '{,,}',
+        })
+
+    character_map = {
+        '\\': r'{\textbackslash}',
+        '{': r'{\{}',
+        '}': r'{\}}',
+        '$': r'{\$}',
+        '&': r'{\&}',
+        '%': r'{\%}',
+        '#': r'{\#}',
+        '[': r'{[}',
+        ']': r'{]}',
+        '-': r'{-}',
+        '`': r'{`}',
+        "'": r"{'}",
+        ',': r'{,}',
+        '"': r'{"}',
+        '|': r'{\textbar}',
+        '<': r'{\textless}',
+        '>': r'{\textgreater}',
+        '^': r'{\textasciicircum}',
+        '~': r'{\textasciitilde}',
+        '_': r'{\Dtextunderscore}',
+        }
+    character_map.update(unicode_map)
+    #character_map.update(special_map)
+    
+    # `att_map` is for encoding attributes.  According to
+    # <http://www-h.eng.cam.ac.uk/help/tpl/textprocessing/teTeX/latex/latex2e-html/ltx-164.html>,
+    # the following characters are special: # $ % & ~ _ ^ \ { }
+    # These work without special treatment in macro parameters:
+    # $, &, ~, _, ^
+    att_map = {'#': '\\#',
+               '%': '\\%',
+               # We cannot do anything about backslashes.
+               '\\': '',
+               '{': '\\{',
+               '}': '\\}',
+               # The quotation mark may be redefined by babel.
+               '"': '"{}',
+               }
+    att_map.update(unicode_map)
+
+    def encode(self, text, attval=None):
+        """
+        Encode special characters in ``text`` and return it.
+
+        If attval is true, preserve as much as possible verbatim (used
+        in attribute value encoding).  If attval is 'width' or
+        'height', `text` is interpreted as a length value.
+        """
+        if attval in ('width', 'height'):
+            match = re.match(r'([0-9.]+)(\S*)$', text)
+            assert match, '%s="%s" must be a length' % (attval, text)
+            value, unit = match.groups()
+            if unit == '%':
+                value = str(float(value) / 100)
+                unit = r'\Drelativeunit'
+            elif unit in ('', 'px'):
+                # If \Dpixelunit is "pt", this gives the same notion
+                # of pixels as graphicx.
+                value = str(float(value) * 0.75)
+                unit = '\Dpixelunit'
+            return '%s%s' % (value, unit)
+        if attval:
+            get = self.att_map.get
+        else:
+            get = self.character_map.get
+        text = ''.join([get(c, c) for c in text])
+        if (self.literal_block or self.inline_literal) and not attval:
+            # NB: We can have inline literals within literal blocks.
+            # Shrink '\r\n'.
+            text = text.replace('\r\n', '\n')
+            # Convert space.  If "{ }~~~~~" is wrapped (at the
+            # brace-enclosed space "{ }"), the following non-breaking
+            # spaces ("~~~~") do *not* wind up at the beginning of the
+            # next line.  Also note that, for some not-so-obvious
+            # reason, no hyphenation is done if the breaking space ("{
+            # }") comes *after* the non-breaking spaces.
+            if self.literal_block:
+                # Replace newlines with real newlines.
+                text = text.replace('\n', '\mbox{}\\\\')
+                replace_fn = self.encode_replace_for_literal_block_spaces
+            else:
+                replace_fn = self.encode_replace_for_inline_literal_spaces
+            text = re.sub(r'\s+', replace_fn, text)
+            # Protect hyphens; if we don't, line breaks will be
+            # possible at the hyphens and even the \textnhtt macro
+            # from the hyphenat package won't change that.
+            text = text.replace('-', r'\mbox{-}')
+            text = text.replace("'", r'{\Dtextliteralsinglequote}')
+            return text
+        else:
+            if not attval:
+                # Replace space with single protected space.
+                text = re.sub(r'\s+', '{ }', text)
+                # Replace double quotes with macro calls.
+                L = []
+                for part in text.split(self.character_map['"']):
+                    if L:
+                        # Insert quote.
+                        L.append(self.left_quote and r'{\Dtextleftdblquote}'
+                                 or r'{\Dtextrightdblquote}')
+                        self.left_quote = not self.left_quote
+                    L.append(part)
+                return ''.join(L)
+            else:
+                return text
+
+    def encode_replace_for_literal_block_spaces(self, match):
+        return '~' * len(match.group())
+
+    def encode_replace_for_inline_literal_spaces(self, match):
+        return '{ }' + '~' * (len(match.group()) - 1)
+
+    def astext(self):
+        return '\n'.join(self.header) + (''.join(self.body))
+
+    def append(self, text, newline='%\n'):
+        """
+        Append text, stripping newlines, producing nice LaTeX code.
+        """
+        lines = ['  ' * self.indentation_level + line + newline
+                 for line in text.splitlines(0)]
+        self.body.append(''.join(lines))
+
+    def visit_Text(self, node):
+        self.append(self.encode(node.astext()))
+
+    def depart_Text(self, node):
+        pass
+
+    def is_indented(self, paragraph):
+        """Return true if `paragraph` should be first-line-indented."""
+        assert isinstance(paragraph, nodes.paragraph)
+        siblings = [n for n in paragraph.parent if
+                    self.is_visible(n) and not isinstance(n, nodes.Titular)]
+        index = siblings.index(paragraph)
+        if ('continued' in paragraph['classes'] or
+            index > 0 and isinstance(siblings[index-1], nodes.transition)):
+            return 0
+        # Indent all but the first paragraphs.
+        return index > 0
+
+    def before_paragraph(self, node):
+        self.append(r'\renewcommand{\Dparagraphindented}{%s}'
+                    % (self.is_indented(node) and 'true' or 'false'))
+
+    def before_title(self, node):
+        self.append(r'\renewcommand{\Dtitleastext}{%s}'
+                    % self.encode(node.astext()))
+        self.append(r'\renewcommand{\Dhassubtitle}{%s}'
+                    % ((len(node.parent) > 2 and
+                        isinstance(node.parent[1], nodes.subtitle))
+                       and 'true' or 'false'))
+
+    def before_generated(self, node):
+        if 'sectnum' in node['classes']:
+            node[0] = node[0].strip()
+
+    literal_block = 0
+
+    def visit_literal_block(self, node):
+        self.literal_block = 1
+
+    def depart_literal_block(self, node):
+        self.literal_block = 0
+
+    visit_doctest_block = visit_literal_block
+    depart_doctest_block = depart_literal_block
+
+    inline_literal = 0
+
+    def visit_literal(self, node):
+        self.inline_literal += 1
+
+    def depart_literal(self, node):
+        self.inline_literal -= 1
+
+    def visit_comment(self, node):
+        self.append('\n'.join(['% ' + line for line
+                               in node.astext().splitlines(0)]), newline='\n')
+        raise nodes.SkipChildren
+
+    def before_topic(self, node):
+        if 'contents' in node['classes']:
+            for bullet_list in list(node.traverse(nodes.bullet_list)):
+                p = bullet_list.parent
+                if isinstance(p, nodes.list_item):
+                    p.parent.insert(p.parent.index(p) + 1, bullet_list)
+                    del p[1]
+            for paragraph in node.traverse(nodes.paragraph):
+                paragraph.attributes.update(paragraph[0].attributes)
+                paragraph[:] = paragraph[0]
+                paragraph.parent['tocrefid'] = paragraph['refid']
+            node['contents'] = 1
+        else:
+            node['contents'] = 0
+
+    bullet_list_level = 0
+
+    def visit_bullet_list(self, node):
+        self.append(r'\Dsetbullet{\labelitem%s}' %
+                    ['i', 'ii', 'iii', 'iv'][min(self.bullet_list_level, 3)])
+        self.bullet_list_level += 1
+
+    def depart_bullet_list(self, node):
+        self.bullet_list_level -= 1
+
+    enum_styles = {'arabic': 'arabic', 'loweralpha': 'alph', 'upperalpha':
+                   'Alph', 'lowerroman': 'roman', 'upperroman': 'Roman'}
+
+    enum_counter = 0
+
+    def visit_enumerated_list(self, node):
+        # We create our own enumeration list environment.  This allows
+        # to set the style and starting value and unlimited nesting.
+        # Maybe this can be moved to the stylesheet?
+        self.enum_counter += 1
+        enum_prefix = self.encode(node['prefix'])
+        enum_suffix = self.encode(node['suffix'])
+        enum_type = '\\' + self.enum_styles.get(node['enumtype'], r'arabic')
+        start = node.get('start', 1) - 1
+        counter = 'Denumcounter%d' % self.enum_counter
+        self.append(r'\Dmakeenumeratedlist{%s}{%s}{%s}{%s}{%s}{'
+                    % (enum_prefix, enum_type, enum_suffix, counter, start))
+                    # for Emacs: }
+
+    def depart_enumerated_list(self, node):
+        self.append('}')  # for Emacs: {
+
+    def before_list_item(self, node):
+        # XXX needs cleanup.
+        if (len(node) and (isinstance(node[-1], nodes.TextElement) or
+                           isinstance(node[-1], nodes.Text)) and
+            node.parent.index(node) == len(node.parent) - 1):
+            node['lastitem'] = 'true'
+
+    before_line = before_list_item
+
+    def before_raw(self, node):
+        if 'latex' in node.get('format', '').split():
+            # We're inserting the text in before_raw and thus outside
+            # of \DN... and \Dattr in order to make grouping with
+            # curly brackets work.
+            self.append(node.astext())
+        raise nodes.SkipChildren
+
+    def process_backlinks(self, node, type):
+        self.append(r'\renewcommand{\Dsinglebackref}{}')
+        self.append(r'\renewcommand{\Dmultiplebackrefs}{}')
+        if len(node['backrefs']) > 1:
+            refs = []
+            for i in range(len(node['backrefs'])):
+                refs.append(r'\Dmulti%sbacklink{%s}{%s}'
+                            % (type, node['backrefs'][i], i + 1))
+            self.append(r'\renewcommand{\Dmultiplebackrefs}{(%s){ }}'
+                        % ', '.join(refs))
+        elif len(node['backrefs']) == 1:
+            self.append(r'\renewcommand{\Dsinglebackref}{%s}'
+                        % node['backrefs'][0])
+
+    def visit_footnote(self, node):
+        self.process_backlinks(node, 'footnote')
+
+    def visit_citation(self, node):
+        self.process_backlinks(node, 'citation')
+
+    def before_table(self, node):
+        # A table contains exactly one tgroup.  See before_tgroup.
+        pass
+
+    def before_tgroup(self, node):
+        widths = []
+        total_width = 0
+        for i in range(int(node['cols'])):
+            assert isinstance(node[i], nodes.colspec)
+            widths.append(int(node[i]['colwidth']) + 1)
+            total_width += widths[-1]
+        del node[:len(widths)]
+        tablespec = '|'
+        for w in widths:
+            # 0.93 is probably wrong in many cases.  XXX Find a
+            # solution which works *always*.
+            tablespec += r'p{%s\textwidth}|' % (0.93 * w /
+                                                max(total_width, 60))
+        self.append(r'\Dmaketable{%s}{' % tablespec)
+        self.context.append('}')
+        raise SkipAttrParentLaTeX
+
+    def depart_tgroup(self, node):
+        self.append(self.context.pop())
+
+    def before_row(self, node):
+        raise SkipAttrParentLaTeX
+
+    def before_thead(self, node):
+        raise SkipAttrParentLaTeX
+
+    def before_tbody(self, node):
+        raise SkipAttrParentLaTeX
+
+    def is_simply_entry(self, node):
+        return (len(node) == 1 and isinstance(node[0], nodes.paragraph) or
+                len(node) == 0)
+
+    def before_entry(self, node):
+        is_leftmost = 0
+        if node.hasattr('morerows'):
+            self.document.reporter.severe('Rowspans are not supported.')
+            # Todo: Add empty cells below rowspanning cell and issue
+            # warning instead of severe.
+        if node.hasattr('morecols'):
+            # The author got a headache trying to implement
+            # multicolumn support.
+            if not self.is_simply_entry(node):
+                self.document.reporter.severe(
+                    'Colspanning table cells may only contain one paragraph.')
+                # Todo: Same as above.
+            # The number of columns this entry spans (as a string).
+            colspan = int(node['morecols']) + 1
+            del node['morecols']
+        else:
+            colspan = 1
+        # Macro to call.
+        macro_name = r'\Dcolspan'
+        if node.parent.index(node) == 0:
+            # Leftmost column.
+            macro_name += 'left'
+            is_leftmost = 1
+        if colspan > 1:
+            self.append('%s{%s}{' % (macro_name, colspan))
+            self.context.append('}')
+        else:
+            # Do not add a multicolumn with colspan 1 beacuse we need
+            # at least one non-multicolumn cell per column to get the
+            # desired column widths, and we can only do colspans with
+            # cells consisting of only one paragraph.
+            if not is_leftmost:
+                self.append(r'\Dsubsequententry{')
+                self.context.append('}')
+            else:
+                self.context.append('')
+        if isinstance(node.parent.parent, nodes.thead):
+            node['tableheaderentry'] = 'true'
+
+        # Don't add \renewcommand{\Dparent}{...} because there must
+        # not be any non-expandable commands in front of \multicolumn.
+        raise SkipParentLaTeX
+
+    def depart_entry(self, node):
+        self.append(self.context.pop())
+
+    def before_substitution_definition(self, node):
+        raise nodes.SkipNode
+
+    indentation_level = 0
+
+    def node_name(self, node):
+        return node.__class__.__name__.replace('_', '')
+
+    # Attribute propagation order.
+    attribute_order = ['align', 'classes', 'ids']
+
+    def attribute_cmp(self, a1, a2):
+        """
+        Compare attribute names `a1` and `a2`.  Used in
+        propagate_attributes to determine propagation order.
+
+        See built-in function `cmp` for return value.
+        """
+        if a1 in self.attribute_order and a2 in self.attribute_order:
+            return cmp(self.attribute_order.index(a1),
+                       self.attribute_order.index(a2))
+        if (a1 in self.attribute_order) != (a2 in self.attribute_order):
+            # Attributes not in self.attribute_order come last.
+            return a1 in self.attribute_order and -1 or 1
+        else:
+            return cmp(a1, a2)
+
+    def propagate_attributes(self, node):
+        # Propagate attributes using \Dattr macros.
+        node_name = self.node_name(node)
+        attlist = []
+        if isinstance(node, nodes.Element):
+            attlist = node.attlist()
+        attlist.sort(lambda pair1, pair2: self.attribute_cmp(pair1[0],
+                                                             pair2[0]))
+        # `numatts` may be greater than len(attlist) due to list
+        # attributes.
+        numatts = 0
+        pass_contents = self.pass_contents(node)
+        for key, value in attlist:
+            if isinstance(value, ListType):
+                self.append(r'\renewcommand{\Dattrlen}{%s}' % len(value))
+                for i in range(len(value)):
+                    self.append(r'\Dattr{%s}{%s}{%s}{%s}{' %
+                                (i+1, key, self.encode(value[i], attval=key),
+                                 node_name))
+                    if not pass_contents:
+                        self.append('}')
+                numatts += len(value)
+            else:
+                self.append(r'\Dattr{}{%s}{%s}{%s}{' %
+                            (key, self.encode(unicode(value), attval=key),
+                             node_name))
+                if not pass_contents:
+                    self.append('}')
+                numatts += 1
+        if pass_contents:
+            self.context.append('}' * numatts)  # for Emacs: {
+        else:
+            self.context.append('')
+
+    def visit_docinfo(self, node):
+        raise NotImplementedError('Docinfo not yet implemented.')
+
+    def visit_document(self, node):
+        document = node
+        # Move IDs into TextElements.  This won't work for images.
+        # Need to review this.
+        for node in document.traverse(nodes.Element):
+            if node.has_key('ids') and not isinstance(node,
+                                                      nodes.TextElement):
+                next_text_element = node.next_node(nodes.TextElement)
+                if next_text_element:
+                    next_text_element['ids'].extend(node['ids'])
+                    node['ids'] = []
+
+    def pass_contents(self, node):
+        r"""
+        Return true if the node contents should be passed in
+        parameters of \DN... and \Dattr.
+        """
+        return not isinstance(node, (nodes.document, nodes.section))
+
+    def dispatch_visit(self, node):
+        skip_attr = skip_parent = 0
+        # TreePruningException to be propagated.
+        tree_pruning_exception = None
+        if hasattr(self, 'before_' + node.__class__.__name__):
+            try:
+                getattr(self, 'before_' + node.__class__.__name__)(node)
+            except SkipParentLaTeX:
+                skip_parent = 1
+            except SkipAttrParentLaTeX:
+                skip_attr = 1
+                skip_parent = 1
+            except nodes.SkipNode:
+                raise
+            except (nodes.SkipChildren, nodes.SkipSiblings), instance:
+                tree_pruning_exception = instance
+            except nodes.SkipDeparture:
+                raise NotImplementedError(
+                    'SkipDeparture not usable in LaTeX writer')
+
+        if not isinstance(node, nodes.Text):
+            node_name = self.node_name(node)
+            # attribute_deleters will be appended to self.context.
+            attribute_deleters = []
+            if not skip_parent and not isinstance(node, nodes.document):
+                self.append(r'\renewcommand{\Dparent}{%s}'
+                            % self.node_name(node.parent))
+                for name, value in node.attlist():
+                    if not isinstance(value, ListType) and not ':' in name:
+                        macro = r'\DcurrentN%sA%s' % (node_name, name)
+                        self.append(r'\def%s{%s}' % (
+                            macro, self.encode(unicode(value), attval=name)))
+                        attribute_deleters.append(r'\let%s=\relax' % macro)
+            self.context.append('\n'.join(attribute_deleters))
+            if self.pass_contents(node):
+                self.append(r'\DN%s{' % node_name)
+                self.context.append('}')
+            else:
+                self.append(r'\Dvisit%s' % node_name)
+                self.context.append(r'\Ddepart%s' % node_name)
+            self.indentation_level += 1
+            if not skip_attr:
+                self.propagate_attributes(node)
+            else:
+                self.context.append('')
+
+        if (isinstance(node, nodes.TextElement) and
+            not isinstance(node.parent, nodes.TextElement)):
+            # Reset current quote to left.
+            self.left_quote = 1
+
+        # Call visit_... method.
+        try:
+            nodes.SparseNodeVisitor.dispatch_visit(self, node)
+        except LaTeXException:
+            raise NotImplementedError(
+                'visit_... methods must not raise LaTeXExceptions')
+
+        if tree_pruning_exception:
+            # Propagate TreePruningException raised in before_... method.
+            raise tree_pruning_exception
+
+    def is_invisible(self, node):
+        # Return true if node is invisible or moved away in the LaTeX
+        # rendering.
+        return (not isinstance(node, nodes.Text) and
+                (isinstance(node, nodes.Invisible) or
+                 isinstance(node, nodes.footnote) or
+                 isinstance(node, nodes.citation) or
+                 # Assume raw nodes to be invisible.
+                 isinstance(node, nodes.raw) or
+                 # Floating image or figure.
+                 node.get('align') in ('left', 'right')))
+
+    def is_visible(self, node):
+        return not self.is_invisible(node)
+
+    def needs_space(self, node):
+        """Two nodes for which `needs_space` is true need auxiliary space."""
+        # Return true if node is a visible block-level element.
+        return ((isinstance(node, nodes.Body) or
+                 isinstance(node, nodes.topic)) and
+                not (self.is_invisible(node) or
+                     isinstance(node.parent, nodes.TextElement)))
+
+    def always_needs_space(self, node):
+        """
+        Always add space around nodes for which `always_needs_space()`
+        is true, regardless of whether the other node needs space as
+        well.  (E.g. transition next to section.)
+        """
+        return isinstance(node, nodes.transition)
+
+    def dispatch_departure(self, node):
+        # Call departure method.
+        nodes.SparseNodeVisitor.dispatch_departure(self, node)
+
+        if not isinstance(node, nodes.Text):
+            # Close attribute and node handler call (\DN...{...}).
+            self.indentation_level -= 1
+            self.append(self.context.pop() + self.context.pop())
+            # Delete \Dcurrent... attribute macros.
+            self.append(self.context.pop())
+            # Get next sibling.
+            next_node = node.next_node(
+                ascend=0, siblings=1, descend=0,
+                condition=self.is_visible)
+            # Insert space if necessary.
+            if  (self.needs_space(node) and self.needs_space(next_node) or
+                 self.always_needs_space(node) or
+                 self.always_needs_space(next_node)):
+                if isinstance(node, nodes.paragraph) and isinstance(next_node, nodes.paragraph):
+                    # Space between paragraphs.
+                    self.append(r'\Dparagraphspace')
+                else:
+                    # One of the elements is not a paragraph.
+                    self.append(r'\Dauxiliaryspace')
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/newlatex2e/base.tex
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/newlatex2e/base.tex (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/newlatex2e/base.tex (revision 3)
@@ -0,0 +1,1108 @@
+\makeatletter
+
+% Development notes at
+% http://docutils.python-hosting.com/wiki/NewLatex
+
+
+\providecommand{\Dprinting}{false}
+
+
+\providecommand{\DSearly}{}
+\providecommand{\DSlate}{}
+
+\providecommand{\Ddocumentclass}{scrartcl}
+\providecommand{\Ddocumentoptions}{a4paper}
+
+\documentclass[\Ddocumentoptions]{\Ddocumentclass}
+
+\DSearly
+
+
+\providecommand{\DSfontencoding}{
+  % Set up font encoding.
+  % AE is a T1-emulation.  It provides most characters and features
+  % as T1-encoded fonts but doesn't use ugly bitmap fonts.
+  \usepackage{ae}
+  % Provide the characters not contained in AE from EC bitmap fonts.
+  \usepackage{aecompl}
+  % Guillemets ("<<", ">>") in AE.
+  \usepackage{aeguill}
+}
+
+
+\providecommand{\DSsymbols}{%
+  % Fix up symbols.
+  % The Euro symbol in Computer Modern looks, um, funny.  Let's get a
+  % proper Euro symbol.
+  \RequirePackage{eurosym}%
+  \renewcommand{\texteuro}{\euro}%
+}
+
+
+% Taken from
+% <http://groups.google.de/groups?selm=1i0n5tgtplti420e1omp4pctlv19jpuhbb%404ax.com>
+% and modified.  Used with permission.
+\providecommand{\Dprovidelength}[2]{%
+  \begingroup%
+    \escapechar\m@ne%
+    \xdef\@gtempa{{\string#1}}%
+  \endgroup%
+  \expandafter\@ifundefined\@gtempa%
+  {\newlength{#1}\setlength{#1}{#2}}%
+  {}%
+}
+
+\providecommand{\Dprovidecounter}[1]{%
+  % Like \newcounter except that it doesn't crash if the counter
+  % already exists.
+  \@ifundefined{c@#1}{\newcounter{#1}}{}
+}
+
+\Dprovidelength{\Dboxparindent}{\parindent}
+\providecommand{\Dmakeboxminipage}[1]{%
+  % Make minipage for use in a box created by \Dmakefbox.
+  \begin{minipage}[t]{0.9\linewidth}%
+    \setlength{\parindent}{\Dboxparindent}%
+    #1%
+  \end{minipage}%
+}
+\providecommand{\Dmakefbox}[1]{%
+  % Make a centered, framed box.  Useful e.g. for admonitions.
+  \vspace{0.4\baselineskip}%
+  \begin{center}%
+    \fbox{\Dmakeboxminipage{#1}}%
+  \end{center}%
+  \vspace{0.4\baselineskip}%
+}
+\providecommand{\Dmakebox}[1]{%
+  % Make a centered, frameless box.  Useful e.g. for block quotes.
+  % Do not use minipages here, but create pseudo-lists to allow
+  % page-breaking.  (Don't use KOMA-script's addmargin environment
+  % because it messes up bullet lists.)
+  \Dmakelistenvironment{}{}{%
+    \setlength{\parskip}{0pt}%
+    \setlength{\parindent}{\Dboxparindent}%
+    \item{#1}%
+  }%
+}
+
+
+\RequirePackage{ifthen}
+\providecommand{\Dfrenchspacing}{true}
+\ifthenelse{\equal{\Dfrenchspacing}{true}}{\frenchspacing}{}
+
+
+\Dprovidelength{\Dblocklevelvspace}{%
+  % Space between block-level elements other than paragraphs.
+  0.7\baselineskip plus 0.3\baselineskip minus 0.2\baselineskip%
+}
+\providecommand{\Dauxiliaryspace}{%
+  \ifthenelse{\equal{\Dneedvspace}{true}}{\vspace{\Dblocklevelvspace}}{}%
+  \par\noindent%
+}
+\providecommand{\Dparagraphspace}{\par}
+\providecommand{\Dneedvspace}{true}
+
+
+\providecommand{\DSlinks}{
+  % Targets and references.
+  \RequirePackage[colorlinks=false,pdfborder={0 0 0}]{hyperref}
+
+  \providecommand{\Draisedlink}[1]{\Hy@raisedlink{##1}}
+  
+  % References.
+  % We're assuming here that the "refid" and "refuri" attributes occur
+  % only in inline context (in TextElements).
+  \providecommand{\DArefid}[5]{%
+    \ifthenelse{\equal{##4}{reference}}{%
+      \Dexplicitreference{\###3}{##5}%
+    }{%
+      % If this is not a target node (targets with refids are
+      % uninteresting and should be silently dropped).
+      \ifthenelse{\not\equal{##4}{target}}{%
+        % If this is a footnote reference, call special macro.
+        \ifthenelse{\equal{##4}{footnotereference}}{%
+          \Dimplicitfootnotereference{\###3}{##5}%
+        }{%
+          \ifthenelse{\equal{##4}{citationreference}}{%
+            \Dimplicitcitationreference{\###3}{##5}%
+          }{%
+            \Dimplicitreference{\###3}{##5}%
+          }%
+        }%
+      }{}%
+    }%
+  }
+  \providecommand{\DArefuri}[5]{%
+    \ifthenelse{\equal{##4}{target}}{%
+      % Hyperlink targets can (and should be) ignored because they are
+      % invisible.
+    }{%
+      % We only have explicit URI references, so one macro suffices.
+      \Durireference{##3}{##5}%
+    }%
+  }
+  % Targets.
+  \providecommand{\DAids}[5]{%
+    \label{##3}%
+    \ifthenelse{\equal{##4}{footnotereference}}{%
+      {%
+        \renewcommand{\HyperRaiseLinkDefault}{%
+          % Dirty hack to make backrefs to footnote references work.
+          % For some reason, \baselineskip is 0pt in fn references.
+          0.5\Doriginalbaselineskip%
+        }%
+        \Draisedlink{\hypertarget{##3}{}}##5%
+      }%
+    }{%
+      \Draisedlink{\hypertarget{##3}{}}##5%
+    }%
+  }
+  % Color in references.
+  \RequirePackage{color}
+  \providecommand{\Dimplicitreference}[2]{%
+    % Create implicit reference to ID.  Implicit references occur
+    % e.g. in TOC-backlinks of section titles.  Parameters:
+    % 1. Target.
+    % 2. Link text.
+    \href{##1}{##2}%
+  }
+  \providecommand{\Dimplicitfootnotereference}[2]{%
+    % Ditto, but for the special case of footnotes.
+    % We want them to be rendered like explicit references.
+    \Dexplicitreference{##1}{##2}%
+  }
+  \providecommand{\Dimplicitcitationreference}[2]{%
+    % Ditto for citation references.
+    \Dimplicitfootnotereference{##1}{##2}%
+  }
+  \ifthenelse{\equal{\Dprinting}{true}}{
+    \providecommand{\Dexplicitreferencecolor}{black}
+  }{
+    \providecommand{\Dexplicitreferencecolor}{blue}
+  }
+  \providecommand{\Dexplicitreference}[2]{%
+    % Create explicit reference to ID, e.g. created with "foo_".
+    % Parameters:
+    % 1. Target.
+    % 2. Link text.
+    \href{##1}{{\color{\Dexplicitreferencecolor}##2}}%
+  }
+  \providecommand{\Durireferencecolor}{\Dexplicitreferencecolor}
+  \providecommand{\Durireference}[2]{%
+    % Create reference to URI.  Parameters:
+    % 1. Target.
+    % 2. Link text.
+    \href{##1}{{\color{\Durireferencecolor}##2}}%
+  }
+}
+
+
+\providecommand{\DSlanguage}{%
+  % Set up babel.
+  \ifthenelse{\equal{\Dlanguagebabel}{}}{}{
+    \RequirePackage[\Dlanguagebabel]{babel}
+  }
+}
+
+
+
+
+\providecommand{\DAclasses}[5]{%
+  \Difdefined{DN#4C#3}{%
+    % Pass only contents, nothing else!
+    \csname DN#4C#3\endcsname{#5}%
+  }{%
+    \Difdefined{DC#3}{%
+      \csname DC#3\endcsname{#5}%
+    }{%
+      #5%
+    }%
+  }%
+}
+
+\providecommand{\Difdefined}[3]{\@ifundefined{#1}{#3}{#2}}
+
+\providecommand{\Dattr}[5]{%
+  % Global attribute dispatcher.
+  % Parameters:
+  % 1. Attribute number.
+  % 2. Attribute name.
+  % 3. Attribute value.
+  % 4. Node name.
+  % 5. Node contents.
+  \Difdefined{DN#4A#2V#3}{%
+    \csname DN#4A#2V#3\endcsname{#1}{#2}{#3}{#4}{#5}%
+  }{\Difdefined{DN#4A#2}{%
+    \csname DN#4A#2\endcsname{#1}{#2}{#3}{#4}{#5}%
+  }{\Difdefined{DA#2V#3}{%
+    \csname DA#2V#3\endcsname{#1}{#2}{#3}{#4}{#5}%
+  }{\Difdefined{DA#2}{%
+    \csname DA#2\endcsname{#1}{#2}{#3}{#4}{#5}%
+  }{#5%
+  }}}}%
+}
+
+\providecommand{\DNparagraph}[1]{%
+  \ifthenelse{\equal{\Dparagraphindented}{true}}{\indent}{\noindent}%
+  #1%
+}
+\providecommand{\Dformatboxtitle}[1]{{\Large\textbf{#1}}}
+\providecommand{\Dformatboxsubtitle}[1]{{\large\textbf{#1}}}
+\providecommand{\Dtopictitle}[1]{%
+  \Difinsidetoc{\vspace{1em}\par}{}%
+  \noindent\Dformatboxtitle{#1}%
+  \ifthenelse{\equal{\Dhassubtitle}{false}}{\vspace{1em}}{\vspace{0.5em}}%
+  \par%
+}
+\providecommand{\Dtopicsubtitle}[1]{%
+  \noindent\Dformatboxsubtitle{#1}%
+  \vspace{1em}%
+  \par%
+}
+\providecommand{\Dsidebartitle}[1]{\Dtopictitle{#1}}
+\providecommand{\Dsidebarsubtitle}[1]{\Dtopicsubtitle{#1}}
+\providecommand{\Ddocumenttitle}[1]{%
+  \begin{center}{\Huge#1}\end{center}%
+  \ifthenelse{\equal{\Dhassubtitle}{true}}{\vspace{0.1cm}}{\vspace{1cm}}%
+}
+\providecommand{\Ddocumentsubtitle}[1]{%
+  \begin{center}{\huge#1}\end{center}%
+  \vspace{1cm}%
+}
+% Can be overwritten by user stylesheet.
+\providecommand{\Dformatsectiontitle}[1]{#1}
+\providecommand{\Dformatsectionsubtitle}[1]{\Dformatsectiontitle{#1}}
+\providecommand{\Dbookmarksectiontitle}[1]{%
+  % Return text suitable for use in \section*, \subsection*, etc.,
+  % containing a PDF bookmark.  Parameter:  The title (as node tree).
+  \Draisedlink{\Dpdfbookmark{\Dtitleastext}}%
+  #1%
+}
+\providecommand{\Dsectiontitlehook}[1]{#1}
+\providecommand{\Dsectiontitle}[1]{%
+  \Dsectiontitlehook{%
+    \Ddispatchsectiontitle{\Dbookmarksectiontitle{\Dformatsectiontitle{#1}}}%
+  }%
+}
+\providecommand{\Ddispatchsectiontitle}[1]{%
+  \@ifundefined{Dsectiontitle\roman{Dsectionlevel}}{%
+    \Ddeepsectiontitle{#1}%
+  }{%
+    \csname Dsectiontitle\roman{Dsectionlevel}\endcsname{#1}%
+  }%
+}
+\providecommand{\Ddispatchsectionsubtitle}[1]{%
+  \Ddispatchsectiontitle{#1}%
+}
+\providecommand{\Dsectiontitlei}[1]{\section*{#1}}
+\providecommand{\Dsectiontitleii}[1]{\subsection*{#1}}
+\providecommand{\Ddeepsectiontitle}[1]{%
+  % Anything below \subsubsection (like \paragraph or \subparagraph)
+  % is useless because it uses the same font.  The only way to
+  % (visually) distinguish such deeply nested sections is to use
+  % section numbering.
+  \subsubsection*{#1}%
+}
+\providecommand{\Dsectionsubtitlehook}[1]{#1}
+\Dprovidelength{\Dsectionsubtitleraisedistance}{0.7em}
+\providecommand{\Dsectionsubtitlescaling}{0.85}
+\providecommand{\Dsectionsubtitle}[1]{%
+  \Dsectionsubtitlehook{%
+    % Move the subtitle nearer to the title.
+    \vspace{-\Dsectionsubtitleraisedistance}%
+    % Don't create a PDF bookmark.
+    \Ddispatchsectionsubtitle{%
+      \Dformatsectionsubtitle{\scalebox{\Dsectionsubtitlescaling}{#1}}%
+    }%
+  }%
+}
+% Boolean variable.
+\providecommand{\Dhassubtitle}{false}
+\providecommand{\DNtitle}[1]{%
+  \csname D\Dparent title\endcsname{#1}%
+}
+\providecommand{\DNsubtitle}[1]{%
+  \csname D\Dparent subtitle\endcsname{#1}%
+}
+\newcounter{Dpdfbookmarkid}
+\setcounter{Dpdfbookmarkid}{0}
+\providecommand{\Dpdfbookmark}[1]{%
+  % Temporarily decrement Desctionlevel counter.
+  \addtocounter{Dsectionlevel}{-1}%
+  %\typeout{\arabic{Dsectionlevel}}%
+  %\typeout{#1}%
+  %\typeout{docutils\roman{Dpdfbookmarkid}}%
+  %\typeout{}%
+  \pdfbookmark[\arabic{Dsectionlevel}]{#1}{docutils\arabic{Dpdfbookmarkid}}%
+  \addtocounter{Dsectionlevel}{1}%
+  \addtocounter{Dpdfbookmarkid}{1}%
+}
+
+%\providecommand{\DNliteralblock}[1]{\begin{quote}\ttfamily\raggedright#1\end{quote}}
+\providecommand{\DNliteralblock}[1]{%
+  \Dmakelistenvironment{}{%
+    \ifthenelse{\equal{\Dinsidetabular}{true}}{%
+      \setlength{\leftmargin}{0pt}%
+    }{}%
+    \setlength{\rightmargin}{0pt}%
+  }{%
+    \raggedright\item\noindent\nohyphens{\textnhtt{#1\Dfinalstrut}}%
+  }%
+}
+\providecommand{\DNdoctestblock}[1]{%
+  % Treat doctest blocks the same as literal blocks.
+  \DNliteralblock{#1}%
+}
+\RequirePackage{hyphenat}
+\providecommand{\DNliteral}[1]{\textnhtt{#1}}
+\providecommand{\DNemphasis}[1]{\emph{#1}}
+\providecommand{\DNstrong}[1]{\textbf{#1}}
+\providecommand{\Dvisitdocument}{\begin{document}\noindent}
+\providecommand{\Ddepartdocument}{\end{document}}
+\providecommand{\DNtopic}[1]{%
+  \ifthenelse{\equal{\DcurrentNtopicAcontents}{1}}{%
+    \addtocounter{Dtoclevel}{1}%
+    \par\noindent%
+    #1%
+    \addtocounter{Dtoclevel}{-1}%
+  }{%
+    \par\noindent%
+    \Dmakebox{#1}%
+  }%
+}
+\providecommand{\Dformatrubric}[1]{\textbf{#1}}
+\Dprovidelength{\Dprerubricspace}{0.3em}
+\providecommand{\DNrubric}[1]{%
+  \vspace{\Dprerubricspace}\par\noindent\Dformatrubric{#1}\par%
+}
+
+\providecommand{\Dbullet}{}
+\providecommand{\Dsetbullet}[1]{\renewcommand{\Dbullet}{#1}}
+\providecommand{\DNbulletlist}[1]{%
+  \Difinsidetoc{%
+    \Dtocbulletlist{#1}%
+  }{%
+    \Dmakelistenvironment{\Dbullet}{}{#1}%
+  }%
+}
+\renewcommand{\@pnumwidth}{2.2em}
+\providecommand{\DNlistitem}[1]{%
+  \Difinsidetoc{%
+    \ifthenelse{\equal{\theDtoclevel}{1}\and\equal{\Dlocaltoc}{false}}{%
+      {%
+        \par\addvspace{1em}\noindent%
+        \sectfont%
+        #1\hfill\pageref{\DcurrentNlistitemAtocrefid}%
+      }%
+    }{%
+      \@dottedtocline{0}{\Dtocindent}{0em}{#1}{%
+        \pageref{\DcurrentNlistitemAtocrefid}%
+      }%
+    }%
+  }{%
+    \item{#1}%
+  }%
+}
+\providecommand{\DNenumeratedlist}[1]{#1}
+\newcounter{Dsectionlevel}
+\providecommand{\Dvisitsectionhook}{}
+\providecommand{\Ddepartsectionhook}{}
+\providecommand{\Dvisitsection}{%
+  \addtocounter{Dsectionlevel}{1}%
+  \Dvisitsectionhook%
+}
+\providecommand{\Ddepartsection}{%
+  \Ddepartsectionhook%
+  \addtocounter{Dsectionlevel}{-1}%
+}
+
+% Using \_ will cause hyphenation after _ even in \textnhtt-typewriter
+% because the hyphenat package redefines \_.  So we use
+% \textunderscore here.
+\providecommand{\Dtextunderscore}{\textunderscore}
+
+\providecommand{\Dtextinlineliteralfirstspace}{{ }}
+\providecommand{\Dtextinlineliteralsecondspace}{{~}}
+
+\Dprovidelength{\Dlistspacing}{0.8\baselineskip}
+
+\providecommand{\Dsetlistrightmargin}{%
+  \ifthenelse{\lengthtest{\linewidth>12em}}{%
+    % Equal margins.
+    \setlength{\rightmargin}{\leftmargin}%
+  }{%
+    % If the line is narrower than 10em, we don't remove any further
+    % space from the right.
+    \setlength{\rightmargin}{0pt}%
+  }%
+}
+\providecommand{\Dresetlistdepth}{false}
+\Dprovidelength{\Doriginallabelsep}{\labelsep}
+\providecommand{\Dmakelistenvironment}[3]{%
+  % Make list environment with support for unlimited nesting and with
+  % reasonable default lengths.  Parameters:
+  % 1. Label (same as in list environment).
+  % 2. Spacing (same as in list environment).
+  % 3. List contents (contents of list environment).
+  \ifthenelse{\equal{\Dinsidetabular}{true}}{%
+    % Unfortunately, vertical spacing doesn't work correctly when
+    % using lists inside tabular environments, so we use a minipage.
+    \begin{minipage}[t]{\linewidth}%
+  }{}%
+    {%
+      \renewcommand{\Dneedvspace}{false}%
+      % \parsep0.5\baselineskip
+      \renewcommand{\Dresetlistdepth}{false}%
+      \ifnum \@listdepth>5%
+      \protect\renewcommand{\Dresetlistdepth}{true}%
+      \@listdepth=5%
+      \fi%
+      \begin{list}{%
+          #1%
+        }{%
+          \setlength{\itemsep}{0pt}%
+          \setlength{\partopsep}{0pt}%
+          \setlength{\topsep}{0pt}%
+                                  % List should take 90% of total width.
+          \setlength{\leftmargin}{0.05\linewidth}%
+          \ifthenelse{\lengthtest{\leftmargin<1.8em}}{%
+            \setlength{\leftmargin}{1.8em}%
+          }{}%
+          \setlength{\labelsep}{\Doriginallabelsep}%
+          \Dsetlistrightmargin%
+          #2%
+        }{%
+          #3%
+        }%
+      \end{list}%
+      \ifthenelse{\equal{\Dresetlistdepth}{true}}{\@listdepth=5}{}%
+    }%
+  \ifthenelse{\equal{\Dinsidetabular}{true}}{\end{minipage}}{}%
+}
+\providecommand{\Dfinalstrut}{\@finalstrut\@arstrutbox}
+\providecommand{\DAlastitem}[5]{#5\Dfinalstrut}
+
+\Dprovidelength{\Ditemsep}{0pt}
+\providecommand{\Dmakeenumeratedlist}[6]{%
+  % Make enumerated list.
+  % Parameters:
+  % - prefix
+  % - type (\arabic, \roman, ...)
+  % - suffix
+  % - suggested counter name
+  % - start number - 1
+  % - list contents
+  \newcounter{#4}%
+  \Dmakelistenvironment{#1#2{#4}#3}{%
+    % Use as much space as needed for the label.
+    \setlength{\labelwidth}{10em}%
+    % Reserve enough space so that the label doesn't go beyond the
+    % left margin of preceding paragraphs.  Like that:
+    %
+    %    A paragraph.
+    %
+    %   1. First item.
+    \setlength{\leftmargin}{2.5em}%
+    \Dsetlistrightmargin%
+    \setlength{\itemsep}{\Ditemsep}%
+    % Use counter recommended by Python module.
+    \usecounter{#4}%
+    % Set start value.
+    \addtocounter{#4}{#5}%
+  }{%
+    % The list contents.
+    #6%
+  }%
+}
+
+
+% Single quote in literal mode.  \textquotesingle from package
+% textcomp has wrong width when using package ae, so we use a normal
+% single curly quote here.
+\providecommand{\Dtextliteralsinglequote}{'}
+
+
+% "Tabular lists" are field lists and options lists (not definition
+% lists because there the term always appears on its own line).  We'll
+% use the terminology of field lists now ("field", "field name",
+% "field body"), but the same is also analogously applicable to option
+% lists.
+%
+% We want these lists to be breakable across pages.  We cannot
+% automatically get the narrowest possible size for the left column
+% (i.e. the field names or option groups) because tabularx does not
+% support multi-page tables, ltxtable needs to have the table in an
+% external file and we don't want to clutter the user's directories
+% with auxiliary files created by the filecontents environment, and
+% ltablex is not included in teTeX.
+%
+% Thus we set a fixed length for the left column and use list
+% environments.  This also has the nice side effect that breaking is
+% now possible anywhere, not just between fields.
+%
+% Note that we are creating a distinct list environment for each
+% field.  There is no macro for a whole tabular list!
+\Dprovidelength{\Dtabularlistfieldnamewidth}{6em}
+\Dprovidelength{\Dtabularlistfieldnamesep}{0.5em}
+\providecommand{\Dinsidetabular}{false}
+\providecommand{\Dsavefieldname}{}
+\providecommand{\Dsavefieldbody}{}
+\Dprovidelength{\Dusedfieldnamewidth}{0pt}
+\Dprovidelength{\Drealfieldnamewidth}{0pt}
+\providecommand{\Dtabularlistfieldname}[1]{\renewcommand{\Dsavefieldname}{#1}}
+\providecommand{\Dtabularlistfieldbody}[1]{\renewcommand{\Dsavefieldbody}{#1}}
+\Dprovidelength{\Dparskiptemp}{0pt}
+\providecommand{\Dtabularlistfield}[1]{%
+  {%
+    % This only saves field name and field body in \Dsavefieldname and
+    % \Dsavefieldbody, resp.  It does not insert any text into the
+    % document.
+    #1%
+    % Recalculate the real field name width everytime we encounter a
+    % tabular list field because it may have been changed using a
+    % "raw" node.
+    \setlength{\Drealfieldnamewidth}{\Dtabularlistfieldnamewidth}%
+    \addtolength{\Drealfieldnamewidth}{\Dtabularlistfieldnamesep}%
+    \Dmakelistenvironment{%
+      \makebox[\Drealfieldnamewidth][l]{\Dsavefieldname}%
+    }{%
+      \setlength{\labelwidth}{\Drealfieldnamewidth}%
+      \setlength{\leftmargin}{\Drealfieldnamewidth}%
+      \setlength{\rightmargin}{0pt}%
+      \setlength{\labelsep}{0pt}%
+    }{%
+      \item%
+      \settowidth{\Dusedfieldnamewidth}{\Dsavefieldname}%
+      \setlength{\Dparskiptemp}{\parskip}%
+      \ifthenelse{%
+        \lengthtest{\Dusedfieldnamewidth>\Dtabularlistfieldnamewidth}%
+      }{%
+        \mbox{}\par%
+        \setlength{\parskip}{0pt}%
+      }{}%
+      \Dsavefieldbody%
+      \setlength{\parskip}{\Dparskiptemp}%
+      %XXX Why did we need this?
+      %\@finalstrut\@arstrutbox%
+    }%
+    \par%
+  }%
+}
+
+\providecommand{\Dformatfieldname}[1]{\textbf{#1:}}
+\providecommand{\DNfieldlist}[1]{#1}
+\providecommand{\DNfield}[1]{\Dtabularlistfield{#1}}
+\providecommand{\DNfieldname}[1]{%
+  \Dtabularlistfieldname{%
+    \Dformatfieldname{#1}%
+  }%
+}
+\providecommand{\DNfieldbody}[1]{\Dtabularlistfieldbody{#1}}
+
+\providecommand{\Dformatoptiongroup}[1]{%
+  % Format option group, e.g. "-f file, --input file".
+  \texttt{#1}%
+}
+\providecommand{\Dformatoption}[1]{%
+  % Format option, e.g. "-f file".
+  % Put into mbox to avoid line-breaking at spaces.
+  \mbox{#1}%
+}
+\providecommand{\Dformatoptionstring}[1]{%
+  % Format option string, e.g. "-f".
+  #1%
+}
+\providecommand{\Dformatoptionargument}[1]{%
+  % Format option argument, e.g. "file".
+  \textsl{#1}%
+}
+\providecommand{\Dformatoptiondescription}[1]{%
+  % Format option description, e.g.
+  % "\DNparagraph{Read input data from file.}"
+  #1%
+}
+\providecommand{\DNoptionlist}[1]{#1}
+\providecommand{\Doptiongroupjoiner}{,{ }}
+\providecommand{\Disfirstoption}{%
+  % Auxiliary macro indicating if a given option is the first child
+  % of its option group (if it's not, it has to preceded by
+  % \Doptiongroupjoiner).
+  false%
+}
+\providecommand{\DNoptionlistitem}[1]{%
+  \Dtabularlistfield{#1}%
+}
+\providecommand{\DNoptiongroup}[1]{%
+  \renewcommand{\Disfirstoption}{true}%
+  \Dtabularlistfieldname{\Dformatoptiongroup{#1}}%
+}
+\providecommand{\DNoption}[1]{%
+  % If this is not the first option in this option group, add a
+  % joiner.
+  \ifthenelse{\equal{\Disfirstoption}{true}}{%
+    \renewcommand{\Disfirstoption}{false}%
+  }{%
+    \Doptiongroupjoiner%
+  }%
+  \Dformatoption{#1}%
+}
+\providecommand{\DNoptionstring}[1]{\Dformatoptionstring{#1}}
+\providecommand{\DNoptionargument}[1]{{ }\Dformatoptionargument{#1}}
+\providecommand{\DNdescription}[1]{%
+  \Dtabularlistfieldbody{\Dformatoptiondescription{#1}}%
+}
+
+\providecommand{\DNdefinitionlist}[1]{%
+  \begin{description}%
+    \parskip0pt%
+    #1%
+  \end{description}%
+}
+\providecommand{\DNdefinitionlistitem}[1]{%
+  % LaTeX expects the label in square brackets; we provide an empty
+  % label.
+  \item[]#1%
+}
+\providecommand{\Dformatterm}[1]{#1}
+\providecommand{\DNterm}[1]{\hspace{-5pt}\Dformatterm{#1}}
+% I'm still not sure what's the best rendering for classifiers.  The
+% colon syntax is used by reStructuredText, so it's at least WYSIWYG.
+% Use slanted text because italic would cause too much emphasis.
+\providecommand{\Dformatclassifier}[1]{\textsl{#1}}
+\providecommand{\DNclassifier}[1]{~:~\Dformatclassifier{#1}}
+\providecommand{\Dformatdefinition}[1]{#1}
+\providecommand{\DNdefinition}[1]{\par\Dformatdefinition{#1}}
+
+\providecommand{\Dlineblockindentation}{2.5em}
+\providecommand{\DNlineblock}[1]{%
+  \Dmakelistenvironment{}{%
+    \ifthenelse{\equal{\Dparent}{lineblock}}{%
+      % Parent is a line block, so indent.
+      \setlength{\leftmargin}{\Dlineblockindentation}%
+    }{%
+      % At top level; don't indent.
+      \setlength{\leftmargin}{0pt}%
+    }%
+    \setlength{\rightmargin}{0pt}%
+    \setlength{\parsep}{0pt}%
+  }{%
+    #1%
+  }%
+}
+\providecommand{\DNline}[1]{\item#1}
+
+
+\providecommand{\DNtransition}{%
+  \raisebox{0.25em}{\parbox{\linewidth}{\hspace*{\fill}\hrulefill\hrulefill\hspace*{\fill}}}%
+}
+
+
+\providecommand{\Dformatblockquote}[1]{%
+  % Format contents of block quote.
+  % This occurs in block-level context, so we cannot use \textsl.
+  {\slshape#1}%
+}
+\providecommand{\Dformatattribution}[1]{---\textup{#1}}
+\providecommand{\DNblockquote}[1]{%
+  \Dmakebox{%
+    \Dformatblockquote{#1}
+  }%
+}
+\providecommand{\DNattribution}[1]{%
+  \par%
+  \begin{flushright}\Dformatattribution{#1}\end{flushright}%
+}
+
+
+% Sidebars:
+\RequirePackage{picins}
+% Vertical and horizontal margins.
+\Dprovidelength{\Dsidebarvmargin}{0.5em}
+\Dprovidelength{\Dsidebarhmargin}{1em}
+% Padding (space between contents and frame).
+\Dprovidelength{\Dsidebarpadding}{1em}
+% Frame width.
+\Dprovidelength{\Dsidebarframewidth}{2\fboxrule}
+% Position ("l" or "r").
+\providecommand{\Dsidebarposition}{r}
+% Width.
+\Dprovidelength{\Dsidebarwidth}{0.45\linewidth}
+\providecommand{\DNsidebar}[1]{
+  \parpic[\Dsidebarposition]{%
+    \begin{minipage}[t]{\Dsidebarwidth}%
+      % Doing this with nested minipages is ugly, but I haven't found
+      % another way to place vertical space before and after the fbox.
+      \vspace{\Dsidebarvmargin}%
+      {%
+        \setlength{\fboxrule}{\Dsidebarframewidth}%
+        \setlength{\fboxsep}{\Dsidebarpadding}%
+        \fbox{%
+          \begin{minipage}[t]{\linewidth}%
+            \setlength{\parindent}{\Dboxparindent}%
+            #1%
+          \end{minipage}%
+        }%
+      }%
+      \vspace{\Dsidebarvmargin}%
+    \end{minipage}%
+  }%
+}
+
+
+% Citations and footnotes.
+\providecommand{\Dformatfootnote}[1]{%
+  % Format footnote.
+  {%
+    \footnotesize#1%
+    % \par is necessary for LaTeX to adjust baselineskip to the
+    % changed font size.
+    \par%
+  }%
+}
+\providecommand{\Dformatcitation}[1]{\Dformatfootnote{#1}}
+\Dprovidelength{\Doriginalbaselineskip}{0pt}
+\providecommand{\DNfootnotereference}[1]{%
+  {%
+    % \baselineskip is 0pt in \textsuperscript, so we save it here.
+    \setlength{\Doriginalbaselineskip}{\baselineskip}%
+    \textsuperscript{#1}%
+  }%
+}
+\providecommand{\DNcitationreference}[1]{{[}#1{]}}
+\Dprovidelength{\Dfootnotesep}{3.5pt}
+\providecommand{\Dsetfootnotespacing}{%
+  % Spacing commands executed at the beginning of footnotes.
+  \setlength{\parindent}{0pt}%
+  \hspace{1em}%
+}
+\providecommand{\DNfootnote}[1]{%
+  % See ltfloat.dtx for details.
+  {%
+    \insert\footins{%
+      \vspace{\Dfootnotesep}%
+      \Dsetfootnotespacing%
+      \Dformatfootnote{#1}%
+    }%
+  }%
+}
+\providecommand{\DNcitation}[1]{\DNfootnote{#1}}
+\providecommand{\Dformatfootnotelabel}[1]{%
+  % Keep \footnotesize in footnote labels (\textsuperscript would
+  % reduce the font size even more).
+  \textsuperscript{\footnotesize#1{ }}%
+}
+\providecommand{\Dformatcitationlabel}[1]{{[}#1{]}{ }}
+\providecommand{\Dformatmultiplebackrefs}[1]{%
+  % If in printing mode, do not write out multiple backrefs.
+  \ifthenelse{\equal{\Dprinting}{true}}{}{\textsl{#1}}%
+}
+\providecommand{\Dthislabel}{}
+\providecommand{\DNlabel}[1]{%
+  \renewcommand{\Dthislabel}{#1}
+  \ifthenelse{\not\equal{\Dsinglebackref}{}}{%
+    \let\Doriginallabel=\Dthislabel%
+    \def\Dthislabel{%
+      \Dsinglefootnotebacklink{\Dsinglebackref}{\Doriginallabel}%
+    }%
+  }{}%
+  \ifthenelse{\equal{\Dparent}{footnote}}{%
+    % Footnote label.
+    \Dformatfootnotelabel{\Dthislabel}%
+  }{%
+    \ifthenelse{\equal{\Dparent}{citation}}{%
+      % Citation label.
+      \Dformatcitationlabel{\Dthislabel}%
+    }{}%
+  }%
+  % If there are multiple backrefs, add them now.
+  \Dformatmultiplebackrefs{\Dmultiplebackrefs}%
+}
+\providecommand{\Dsinglefootnotebacklink}[2]{%
+  % Create normal backlink of a footnote label.  Parameters:
+  % 1. ID.
+  % 2. Link text.
+  % Treat like a footnote reference.
+  \Dimplicitfootnotereference{\##1}{#2}%
+}
+\providecommand{\Dmultifootnotebacklink}[2]{%
+  % Create generated backlink, as in (1, 2).  Parameters:
+  % 1. ID.
+  % 2. Link text.
+  % Treat like a footnote reference.
+  \Dimplicitfootnotereference{\##1}{#2}%
+}
+\providecommand{\Dsinglecitationbacklink}[2]{\Dsinglefootnotebacklink{#1}{#2}}
+\providecommand{\Dmulticitationbacklink}[2]{\Dmultifootnotebacklink{#1}{#2}}
+
+
+\RequirePackage{longtable}
+\providecommand{\Dmaketable}[2]{%
+  % Make table.  Parameters:
+  % 1. Table spec (like "|p|p|").
+  % 2. Table contents.
+  {%
+    \ifthenelse{\equal{\Dinsidetabular}{true}}{%
+      % Inside longtable; we cannot have nested longtables.
+      \begin{tabular}{#1}%
+        \hline%
+        #2%
+      \end{tabular}%
+    }{%
+      \renewcommand{\Dinsidetabular}{true}%
+      \begin{longtable}{#1}%
+        \hline%
+        #2%
+      \end{longtable}%
+    }%
+  }%
+}
+\providecommand{\DNthead}[1]{%
+  #1%
+  \endhead%
+}
+\providecommand{\DNrow}[1]{%
+  #1\tabularnewline%
+  \hline%
+}
+\providecommand{\Dinsidemulticolumn}{false}
+\providecommand{\Dcompensatingmulticol}[3]{%
+  \multicolumn{#1}{#2}{%
+    {%
+      \renewcommand{\Dinsidemulticolumn}{true}%
+      % Compensate for weird missing vertical space at top of paragraph.
+      \raisebox{-2.5pt}{#3}%
+    }%
+  }%
+}
+\providecommand{\Dcolspan}[2]{%
+  % Take care of the morecols attribute (but incremented by 1).
+  &%
+  \Dcompensatingmulticol{#1}{l|}{#2}%
+}
+\providecommand{\Dcolspanleft}[2]{%
+  % Like \Dmorecols, but called for the leftmost entries in a table
+  % row.
+  \Dcompensatingmulticol{#1}{|l|}{#2}%
+}
+\providecommand{\Dsubsequententry}[1]{%
+  &#1%
+}
+\providecommand{\DNentry}[1]{%
+  % The following sequence adds minimal vertical space above the top
+  % lines of the first cell paragraph, so that vertical space is
+  % balanced at the top and bottom of table cells.
+  \ifthenelse{\equal{\Dinsidemulticolumn}{false}}{%
+    \vspace{-1em}\vspace{-\parskip}\par%
+  }{}%
+  #1%
+  % No need to add an ampersand ("&"); that's done by \Dsubsequententry.
+}
+\providecommand{\DAtableheaderentry}[5]{\Dformattableheaderentry{#5}}
+\providecommand{\Dformattableheaderentry}[1]{{\bfseries#1}}
+
+
+\providecommand{\DNsystemmessage}[1]{%
+  {%
+    \ifthenelse{\equal{\Dprinting}{false}}{\color{red}}{}%
+    \bfseries%
+    #1%
+  }%
+}
+
+
+\providecommand{\Dinsidehalign}{false}
+\newsavebox{\Dalignedimagebox}
+\Dprovidelength{\Dalignedimagewidth}{0pt}
+\providecommand{\Dhalign}[2]{%
+  % Horizontally align the contents to the left or right so that the
+  % text flows around it.
+  % Parameters:
+  % 1. l or r
+  % 2. Contents.
+  \renewcommand{\Dinsidehalign}{true}%
+  % For some obscure reason \parpic consumes some vertical space.
+  \vspace{-3pt}%
+  % Now we do something *really* ugly, but this enables us to wrap the
+  % image in a minipage while still allowing tight frames when
+  % class=border (see \DNimageCborder).
+  \sbox{\Dalignedimagebox}{#2}%
+  \settowidth{\Dalignedimagewidth}{\usebox{\Dalignedimagebox}}%
+  \parpic[#1]{%
+    \begin{minipage}[b]{\Dalignedimagewidth}%
+      % Compensate for previously added space, but not entirely.
+      \vspace*{2.0pt}%
+      \vspace*{\Dfloatimagetopmargin}%
+      \usebox{\Dalignedimagebox}%
+      \vspace*{1.5pt}%
+      \vspace*{\Dfloatimagebottommargin}%
+    \end{minipage}%
+  }%
+  \renewcommand{\Dinsidehalign}{false}%
+}
+
+
+\RequirePackage{graphicx}
+% Maximum width of an image.
+\providecommand{\Dimagemaxwidth}{\linewidth}
+\providecommand{\Dfloatimagemaxwidth}{0.5\linewidth}
+% Auxiliary variable.
+\Dprovidelength{\Dcurrentimagewidth}{0pt}
+\providecommand{\DNimageAalign}[5]{%
+  \ifthenelse{\equal{#3}{left}}{%
+    \Dhalign{l}{#5}%
+  }{%
+    \ifthenelse{\equal{#3}{right}}{%
+      \Dhalign{r}{#5}%
+    }{%
+      \ifthenelse{\equal{#3}{center}}{%
+        % Text floating around centered figures is a bad idea.  Thus
+        % we use a center environment.  Note that no extra space is
+        % added by the writer, so the space added by the center
+        % environment is fine.
+        \begin{center}#5\end{center}%
+      }{%
+        #5%
+      }%
+    }%
+  }%
+}
+% Base path for images.
+\providecommand{\Dimagebase}{}
+% Auxiliary command.  Current image path.
+\providecommand{\Dimagepath}{}
+\providecommand{\DNimageAuri}[5]{%
+  % Insert image.  We treat the URI like a path here.
+  \renewcommand{\Dimagepath}{\Dimagebase#3}%
+  \Difdefined{DcurrentNimageAwidth}{%
+    \Dwidthimage{\DcurrentNimageAwidth}{\Dimagepath}%
+  }{%
+    \Dsimpleimage{\Dimagepath}%
+  }%
+}
+\Dprovidelength{\Dfloatimagevmargin}{0pt}
+\providecommand{\Dfloatimagetopmargin}{\Dfloatimagevmargin}
+\providecommand{\Dfloatimagebottommargin}{\Dfloatimagevmargin}
+\providecommand{\Dwidthimage}[2]{%
+  % Image with specified width.
+  % Parameters:
+  % 1. Image width.
+  % 2. Image path.
+  % Need to make bottom-alignment dependent on align attribute (add
+  % functional test first).  Need to observe height attribute.
+  %\begin{minipage}[b]{#1}%
+    \includegraphics[width=#1,height=\textheight,keepaspectratio]{#2}%
+  %\end{minipage}%
+}  
+\providecommand{\Dcurrentimagemaxwidth}{}
+\providecommand{\Dsimpleimage}[1]{%
+  % Insert image, without much parametrization.
+  \settowidth{\Dcurrentimagewidth}{\includegraphics{#1}}%
+  \ifthenelse{\equal{\Dinsidehalign}{true}}{%
+    \renewcommand{\Dcurrentimagemaxwidth}{\Dfloatimagemaxwidth}%
+  }{%
+    \renewcommand{\Dcurrentimagemaxwidth}{\Dimagemaxwidth}%
+  }%
+  \ifthenelse{\lengthtest{\Dcurrentimagewidth>\Dcurrentimagemaxwidth}}{%
+    \Dwidthimage{\Dcurrentimagemaxwidth}{#1}%
+  }{%
+    \Dwidthimage{\Dcurrentimagewidth}{#1}%
+  }%
+}
+\providecommand{\Dwidthimage}[2]{%
+  % Image with specified width.
+  % Parameters:
+  % 1. Image width.
+  % 2. Image path.
+  \Dwidthimage{#1}{#2}%
+}
+
+% Figures.
+\providecommand{\DNfigureAalign}[5]{%
+  % Hack to make it work Right Now.
+  %\def\DcurrentNimageAwidth{\DcurrentNfigureAwidth}%
+  %
+    %\def\DcurrentNimageAwidth{\linewidth}%
+    \DNimageAalign{#1}{#2}{#3}{#4}{%
+      \begin{minipage}[b]{0.4\linewidth}#5\end{minipage}}%
+    %\let\DcurrentNimageAwidth=\relax%
+  %
+  %\let\DcurrentNimageAwidth=\relax%
+}
+\providecommand{\DNcaption}[1]{\par\noindent{\slshape#1}}
+\providecommand{\DNlegend}[1]{\Dauxiliaryspace#1}
+
+\providecommand{\DCborder}[1]{\fbox{#1}}
+% No padding between image and border.
+\providecommand{\DNimageCborder}[1]{\frame{#1}}
+
+
+% Need to replace with language-specific stuff.  Maybe look at
+% csquotes.sty and ask the author for permission to use parts of it.
+\providecommand{\Dtextleftdblquote}{``}
+\providecommand{\Dtextrightdblquote}{''}
+
+% Table of contents:
+\Dprovidelength{\Dtocininitialsectnumwidth}{2.4em}
+\Dprovidelength{\Dtocadditionalsectnumwidth}{0.7em}
+% Level inside a table of contents.  While this is at -1, we are not
+% inside a TOC.
+\Dprovidecounter{Dtoclevel}%
+\setcounter{Dtoclevel}{-1}
+\providecommand{\Dlocaltoc}{false}%
+\providecommand{\DNtopicClocal}[1]{%
+  \renewcommand{\Dlocaltoc}{true}%
+  \addtolength{\Dtocsectnumwidth}{2\Dtocadditionalsectnumwidth}%
+  \addtolength{\Dtocindent}{-2\Dtocadditionalsectnumwidth}%
+  #1%
+  \addtolength{\Dtocindent}{2\Dtocadditionalsectnumwidth}%
+  \addtolength{\Dtocsectnumwidth}{-2\Dtocadditionalsectnumwidth}%
+  \renewcommand{\Dlocaltoc}{false}%
+}
+\Dprovidelength{\Dtocindent}{0pt}%
+\Dprovidelength{\Dtocsectnumwidth}{\Dtocininitialsectnumwidth}
+% Compensate for one additional TOC indentation space so that the
+% top-level is unindented.
+\addtolength{\Dtocsectnumwidth}{-\Dtocadditionalsectnumwidth}
+\addtolength{\Dtocindent}{-\Dtocsectnumwidth}
+\providecommand{\Difinsidetoc}[2]{%
+  \ifthenelse{\not\equal{\theDtoclevel}{-1}}{#1}{#2}%
+}
+\providecommand{\DNgeneratedCsectnum}[1]{%
+  \Difinsidetoc{%
+    % Section number inside TOC.
+    \makebox[\Dtocsectnumwidth][l]{#1}%
+  }{%
+    % Section number inside section title.
+    #1\quad%
+  }%
+}
+\providecommand{\Dtocbulletlist}[1]{%
+  \addtocounter{Dtoclevel}{1}%
+  \addtolength{\Dtocindent}{\Dtocsectnumwidth}%
+  \addtolength{\Dtocsectnumwidth}{\Dtocadditionalsectnumwidth}%
+  #1%
+  \addtolength{\Dtocsectnumwidth}{-\Dtocadditionalsectnumwidth}%
+  \addtolength{\Dtocindent}{-\Dtocsectnumwidth}%
+  \addtocounter{Dtoclevel}{-1}%
+}
+
+
+% For \Dpixelunit, the length value is pre-multiplied with 0.75, so by
+% specifying "pt" we get the same notion of "pixel" as graphicx.
+\providecommand{\Dpixelunit}{pt}
+% Normally lengths are relative to the current linewidth.
+\providecommand{\Drelativeunit}{\linewidth}
+
+
+%\RequirePackage{fixmath}
+%\RequirePackage{amsmath}
+
+
+\DSfontencoding
+\DSlanguage
+\DSlinks
+\DSsymbols
+\DSlate
+
+\makeatother
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/newlatex2e/unicode_map.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/newlatex2e/unicode_map.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/writers/newlatex2e/unicode_map.py (revision 3)
@@ -0,0 +1,2371 @@
+# Author: Felix Wiemann
+# Contact: Felix_Wiemann@ososo.de
+# Revision: $Revision: 4163 $
+# Date: $Date: 2005-12-09 05:21:34 +0100 (Fri, 09 Dec 2005) $
+# Copyright: This file has been placed in the public domain.
+
+# This is a mapping of Unicode characters to LaTeX equivalents.
+# The information has been extracted from
+# <http://www.w3.org/2003/entities/xml/unicode.xml>, written by
+# David Carlisle and Sebastian Rahtz.
+#
+# The extraction has been done by the "create_unimap.py" script
+# located at <http://docutils.sf.net/tools/dev/create_unimap.py>.
+
+unicode_map = {u'\xa0': '$~$',
+u'\xa1': '{\\textexclamdown}',
+u'\xa2': '{\\textcent}',
+u'\xa3': '{\\textsterling}',
+u'\xa4': '{\\textcurrency}',
+u'\xa5': '{\\textyen}',
+u'\xa6': '{\\textbrokenbar}',
+u'\xa7': '{\\textsection}',
+u'\xa8': '{\\textasciidieresis}',
+u'\xa9': '{\\textcopyright}',
+u'\xaa': '{\\textordfeminine}',
+u'\xab': '{\\guillemotleft}',
+u'\xac': '$\\lnot$',
+u'\xad': '$\\-$',
+u'\xae': '{\\textregistered}',
+u'\xaf': '{\\textasciimacron}',
+u'\xb0': '{\\textdegree}',
+u'\xb1': '$\\pm$',
+u'\xb2': '${^2}$',
+u'\xb3': '${^3}$',
+u'\xb4': '{\\textasciiacute}',
+u'\xb5': '$\\mathrm{\\mu}$',
+u'\xb6': '{\\textparagraph}',
+u'\xb7': '$\\cdot$',
+u'\xb8': '{\\c{}}',
+u'\xb9': '${^1}$',
+u'\xba': '{\\textordmasculine}',
+u'\xbb': '{\\guillemotright}',
+u'\xbc': '{\\textonequarter}',
+u'\xbd': '{\\textonehalf}',
+u'\xbe': '{\\textthreequarters}',
+u'\xbf': '{\\textquestiondown}',
+u'\xc0': '{\\`{A}}',
+u'\xc1': "{\\'{A}}",
+u'\xc2': '{\\^{A}}',
+u'\xc3': '{\\~{A}}',
+u'\xc4': '{\\"{A}}',
+u'\xc5': '{\\AA}',
+u'\xc6': '{\\AE}',
+u'\xc7': '{\\c{C}}',
+u'\xc8': '{\\`{E}}',
+u'\xc9': "{\\'{E}}",
+u'\xca': '{\\^{E}}',
+u'\xcb': '{\\"{E}}',
+u'\xcc': '{\\`{I}}',
+u'\xcd': "{\\'{I}}",
+u'\xce': '{\\^{I}}',
+u'\xcf': '{\\"{I}}',
+u'\xd0': '{\\DH}',
+u'\xd1': '{\\~{N}}',
+u'\xd2': '{\\`{O}}',
+u'\xd3': "{\\'{O}}",
+u'\xd4': '{\\^{O}}',
+u'\xd5': '{\\~{O}}',
+u'\xd6': '{\\"{O}}',
+u'\xd7': '{\\texttimes}',
+u'\xd8': '{\\O}',
+u'\xd9': '{\\`{U}}',
+u'\xda': "{\\'{U}}",
+u'\xdb': '{\\^{U}}',
+u'\xdc': '{\\"{U}}',
+u'\xdd': "{\\'{Y}}",
+u'\xde': '{\\TH}',
+u'\xdf': '{\\ss}',
+u'\xe0': '{\\`{a}}',
+u'\xe1': "{\\'{a}}",
+u'\xe2': '{\\^{a}}',
+u'\xe3': '{\\~{a}}',
+u'\xe4': '{\\"{a}}',
+u'\xe5': '{\\aa}',
+u'\xe6': '{\\ae}',
+u'\xe7': '{\\c{c}}',
+u'\xe8': '{\\`{e}}',
+u'\xe9': "{\\'{e}}",
+u'\xea': '{\\^{e}}',
+u'\xeb': '{\\"{e}}',
+u'\xec': '{\\`{\\i}}',
+u'\xed': "{\\'{\\i}}",
+u'\xee': '{\\^{\\i}}',
+u'\xef': '{\\"{\\i}}',
+u'\xf0': '{\\dh}',
+u'\xf1': '{\\~{n}}',
+u'\xf2': '{\\`{o}}',
+u'\xf3': "{\\'{o}}",
+u'\xf4': '{\\^{o}}',
+u'\xf5': '{\\~{o}}',
+u'\xf6': '{\\"{o}}',
+u'\xf7': '$\\div$',
+u'\xf8': '{\\o}',
+u'\xf9': '{\\`{u}}',
+u'\xfa': "{\\'{u}}",
+u'\xfb': '{\\^{u}}',
+u'\xfc': '{\\"{u}}',
+u'\xfd': "{\\'{y}}",
+u'\xfe': '{\\th}',
+u'\xff': '{\\"{y}}',
+u'\u0100': '{\\={A}}',
+u'\u0101': '{\\={a}}',
+u'\u0102': '{\\u{A}}',
+u'\u0103': '{\\u{a}}',
+u'\u0104': '{\\k{A}}',
+u'\u0105': '{\\k{a}}',
+u'\u0106': "{\\'{C}}",
+u'\u0107': "{\\'{c}}",
+u'\u0108': '{\\^{C}}',
+u'\u0109': '{\\^{c}}',
+u'\u010a': '{\\.{C}}',
+u'\u010b': '{\\.{c}}',
+u'\u010c': '{\\v{C}}',
+u'\u010d': '{\\v{c}}',
+u'\u010e': '{\\v{D}}',
+u'\u010f': '{\\v{d}}',
+u'\u0110': '{\\DJ}',
+u'\u0111': '{\\dj}',
+u'\u0112': '{\\={E}}',
+u'\u0113': '{\\={e}}',
+u'\u0114': '{\\u{E}}',
+u'\u0115': '{\\u{e}}',
+u'\u0116': '{\\.{E}}',
+u'\u0117': '{\\.{e}}',
+u'\u0118': '{\\k{E}}',
+u'\u0119': '{\\k{e}}',
+u'\u011a': '{\\v{E}}',
+u'\u011b': '{\\v{e}}',
+u'\u011c': '{\\^{G}}',
+u'\u011d': '{\\^{g}}',
+u'\u011e': '{\\u{G}}',
+u'\u011f': '{\\u{g}}',
+u'\u0120': '{\\.{G}}',
+u'\u0121': '{\\.{g}}',
+u'\u0122': '{\\c{G}}',
+u'\u0123': '{\\c{g}}',
+u'\u0124': '{\\^{H}}',
+u'\u0125': '{\\^{h}}',
+u'\u0126': '{{\\fontencoding{LELA}\\selectfont\\char40}}',
+u'\u0127': '$\\Elzxh$',
+u'\u0128': '{\\~{I}}',
+u'\u0129': '{\\~{\\i}}',
+u'\u012a': '{\\={I}}',
+u'\u012b': '{\\={\\i}}',
+u'\u012c': '{\\u{I}}',
+u'\u012d': '{\\u{\\i}}',
+u'\u012e': '{\\k{I}}',
+u'\u012f': '{\\k{i}}',
+u'\u0130': '{\\.{I}}',
+u'\u0131': '{\\i}',
+u'\u0132': '{IJ}',
+u'\u0133': '{ij}',
+u'\u0134': '{\\^{J}}',
+u'\u0135': '{\\^{\\j}}',
+u'\u0136': '{\\c{K}}',
+u'\u0137': '{\\c{k}}',
+u'\u0138': '{{\\fontencoding{LELA}\\selectfont\\char91}}',
+u'\u0139': "{\\'{L}}",
+u'\u013a': "{\\'{l}}",
+u'\u013b': '{\\c{L}}',
+u'\u013c': '{\\c{l}}',
+u'\u013d': '{\\v{L}}',
+u'\u013e': '{\\v{l}}',
+u'\u013f': '{{\\fontencoding{LELA}\\selectfont\\char201}}',
+u'\u0140': '{{\\fontencoding{LELA}\\selectfont\\char202}}',
+u'\u0141': '{\\L}',
+u'\u0142': '{\\l}',
+u'\u0143': "{\\'{N}}",
+u'\u0144': "{\\'{n}}",
+u'\u0145': '{\\c{N}}',
+u'\u0146': '{\\c{n}}',
+u'\u0147': '{\\v{N}}',
+u'\u0148': '{\\v{n}}',
+u'\u0149': "{'n}",
+u'\u014a': '{\\NG}',
+u'\u014b': '{\\ng}',
+u'\u014c': '{\\={O}}',
+u'\u014d': '{\\={o}}',
+u'\u014e': '{\\u{O}}',
+u'\u014f': '{\\u{o}}',
+u'\u0150': '{\\H{O}}',
+u'\u0151': '{\\H{o}}',
+u'\u0152': '{\\OE}',
+u'\u0153': '{\\oe}',
+u'\u0154': "{\\'{R}}",
+u'\u0155': "{\\'{r}}",
+u'\u0156': '{\\c{R}}',
+u'\u0157': '{\\c{r}}',
+u'\u0158': '{\\v{R}}',
+u'\u0159': '{\\v{r}}',
+u'\u015a': "{\\'{S}}",
+u'\u015b': "{\\'{s}}",
+u'\u015c': '{\\^{S}}',
+u'\u015d': '{\\^{s}}',
+u'\u015e': '{\\c{S}}',
+u'\u015f': '{\\c{s}}',
+u'\u0160': '{\\v{S}}',
+u'\u0161': '{\\v{s}}',
+u'\u0162': '{\\c{T}}',
+u'\u0163': '{\\c{t}}',
+u'\u0164': '{\\v{T}}',
+u'\u0165': '{\\v{t}}',
+u'\u0166': '{{\\fontencoding{LELA}\\selectfont\\char47}}',
+u'\u0167': '{{\\fontencoding{LELA}\\selectfont\\char63}}',
+u'\u0168': '{\\~{U}}',
+u'\u0169': '{\\~{u}}',
+u'\u016a': '{\\={U}}',
+u'\u016b': '{\\={u}}',
+u'\u016c': '{\\u{U}}',
+u'\u016d': '{\\u{u}}',
+u'\u016e': '{\\r{U}}',
+u'\u016f': '{\\r{u}}',
+u'\u0170': '{\\H{U}}',
+u'\u0171': '{\\H{u}}',
+u'\u0172': '{\\k{U}}',
+u'\u0173': '{\\k{u}}',
+u'\u0174': '{\\^{W}}',
+u'\u0175': '{\\^{w}}',
+u'\u0176': '{\\^{Y}}',
+u'\u0177': '{\\^{y}}',
+u'\u0178': '{\\"{Y}}',
+u'\u0179': "{\\'{Z}}",
+u'\u017a': "{\\'{z}}",
+u'\u017b': '{\\.{Z}}',
+u'\u017c': '{\\.{z}}',
+u'\u017d': '{\\v{Z}}',
+u'\u017e': '{\\v{z}}',
+u'\u0192': '$f$',
+u'\u0195': '{\\texthvlig}',
+u'\u019e': '{\\textnrleg}',
+u'\u01aa': '$\\eth$',
+u'\u01ba': '{{\\fontencoding{LELA}\\selectfont\\char195}}',
+u'\u01c2': '{\\textdoublepipe}',
+u'\u01f5': "{\\'{g}}",
+u'\u0250': '$\\Elztrna$',
+u'\u0252': '$\\Elztrnsa$',
+u'\u0254': '$\\Elzopeno$',
+u'\u0256': '$\\Elzrtld$',
+u'\u0258': '{{\\fontencoding{LEIP}\\selectfont\\char61}}',
+u'\u0259': '$\\Elzschwa$',
+u'\u025b': '$\\varepsilon$',
+u'\u0261': '{g}',
+u'\u0263': '$\\Elzpgamma$',
+u'\u0264': '$\\Elzpbgam$',
+u'\u0265': '$\\Elztrnh$',
+u'\u026c': '$\\Elzbtdl$',
+u'\u026d': '$\\Elzrtll$',
+u'\u026f': '$\\Elztrnm$',
+u'\u0270': '$\\Elztrnmlr$',
+u'\u0271': '$\\Elzltlmr$',
+u'\u0272': '{\\Elzltln}',
+u'\u0273': '$\\Elzrtln$',
+u'\u0277': '$\\Elzclomeg$',
+u'\u0278': '{\\textphi}',
+u'\u0279': '$\\Elztrnr$',
+u'\u027a': '$\\Elztrnrl$',
+u'\u027b': '$\\Elzrttrnr$',
+u'\u027c': '$\\Elzrl$',
+u'\u027d': '$\\Elzrtlr$',
+u'\u027e': '$\\Elzfhr$',
+u'\u027f': '{{\\fontencoding{LEIP}\\selectfont\\char202}}',
+u'\u0282': '$\\Elzrtls$',
+u'\u0283': '$\\Elzesh$',
+u'\u0287': '$\\Elztrnt$',
+u'\u0288': '$\\Elzrtlt$',
+u'\u028a': '$\\Elzpupsil$',
+u'\u028b': '$\\Elzpscrv$',
+u'\u028c': '$\\Elzinvv$',
+u'\u028d': '$\\Elzinvw$',
+u'\u028e': '$\\Elztrny$',
+u'\u0290': '$\\Elzrtlz$',
+u'\u0292': '$\\Elzyogh$',
+u'\u0294': '$\\Elzglst$',
+u'\u0295': '$\\Elzreglst$',
+u'\u0296': '$\\Elzinglst$',
+u'\u029e': '{\\textturnk}',
+u'\u02a4': '$\\Elzdyogh$',
+u'\u02a7': '$\\Elztesh$',
+u'\u02bc': "{'}",
+u'\u02c7': '{\\textasciicaron}',
+u'\u02c8': '$\\Elzverts$',
+u'\u02cc': '$\\Elzverti$',
+u'\u02d0': '$\\Elzlmrk$',
+u'\u02d1': '$\\Elzhlmrk$',
+u'\u02d2': '$\\Elzsbrhr$',
+u'\u02d3': '$\\Elzsblhr$',
+u'\u02d4': '$\\Elzrais$',
+u'\u02d5': '$\\Elzlow$',
+u'\u02d8': '{\\textasciibreve}',
+u'\u02d9': '{\\textperiodcentered}',
+u'\u02da': '{\\r{}}',
+u'\u02db': '{\\k{}}',
+u'\u02dc': '{\\texttildelow}',
+u'\u02dd': '{\\H{}}',
+u'\u02e5': '{\\tone{55}}',
+u'\u02e6': '{\\tone{44}}',
+u'\u02e7': '{\\tone{33}}',
+u'\u02e8': '{\\tone{22}}',
+u'\u02e9': '{\\tone{11}}',
+u'\u0300': '{\\`}',
+u'\u0301': "{\\'}",
+u'\u0302': '{\\^}',
+u'\u0303': '{\\~}',
+u'\u0304': '{\\=}',
+u'\u0306': '{\\u}',
+u'\u0307': '{\\.}',
+u'\u0308': '{\\"}',
+u'\u030a': '{\\r}',
+u'\u030b': '{\\H}',
+u'\u030c': '{\\v}',
+u'\u030f': '{\\cyrchar\\C}',
+u'\u0311': '{{\\fontencoding{LECO}\\selectfont\\char177}}',
+u'\u0318': '{{\\fontencoding{LECO}\\selectfont\\char184}}',
+u'\u0319': '{{\\fontencoding{LECO}\\selectfont\\char185}}',
+u'\u0321': '$\\Elzpalh$',
+u'\u0322': '{\\Elzrh}',
+u'\u0327': '{\\c}',
+u'\u0328': '{\\k}',
+u'\u032a': '$\\Elzsbbrg$',
+u'\u032b': '{{\\fontencoding{LECO}\\selectfont\\char203}}',
+u'\u032f': '{{\\fontencoding{LECO}\\selectfont\\char207}}',
+u'\u0335': '{\\Elzxl}',
+u'\u0336': '{\\Elzbar}',
+u'\u0337': '{{\\fontencoding{LECO}\\selectfont\\char215}}',
+u'\u0338': '{{\\fontencoding{LECO}\\selectfont\\char216}}',
+u'\u033a': '{{\\fontencoding{LECO}\\selectfont\\char218}}',
+u'\u033b': '{{\\fontencoding{LECO}\\selectfont\\char219}}',
+u'\u033c': '{{\\fontencoding{LECO}\\selectfont\\char220}}',
+u'\u033d': '{{\\fontencoding{LECO}\\selectfont\\char221}}',
+u'\u0361': '{{\\fontencoding{LECO}\\selectfont\\char225}}',
+u'\u0386': "{\\'{A}}",
+u'\u0388': "{\\'{E}}",
+u'\u0389': "{\\'{H}}",
+u'\u038a': "{\\'{}{I}}",
+u'\u038c': "{\\'{}O}",
+u'\u038e': "$\\mathrm{'Y}$",
+u'\u038f': "$\\mathrm{'\\Omega}$",
+u'\u0390': '$\\acute{\\ddot{\\iota}}$',
+u'\u0391': '$\\Alpha$',
+u'\u0392': '$\\Beta$',
+u'\u0393': '$\\Gamma$',
+u'\u0394': '$\\Delta$',
+u'\u0395': '$\\Epsilon$',
+u'\u0396': '$\\Zeta$',
+u'\u0397': '$\\Eta$',
+u'\u0398': '$\\Theta$',
+u'\u0399': '$\\Iota$',
+u'\u039a': '$\\Kappa$',
+u'\u039b': '$\\Lambda$',
+u'\u039c': '$M$',
+u'\u039d': '$N$',
+u'\u039e': '$\\Xi$',
+u'\u039f': '$O$',
+u'\u03a0': '$\\Pi$',
+u'\u03a1': '$\\Rho$',
+u'\u03a3': '$\\Sigma$',
+u'\u03a4': '$\\Tau$',
+u'\u03a5': '$\\Upsilon$',
+u'\u03a6': '$\\Phi$',
+u'\u03a7': '$\\Chi$',
+u'\u03a8': '$\\Psi$',
+u'\u03a9': '$\\Omega$',
+u'\u03aa': '$\\mathrm{\\ddot{I}}$',
+u'\u03ab': '$\\mathrm{\\ddot{Y}}$',
+u'\u03ac': "{\\'{$\\alpha$}}",
+u'\u03ad': '$\\acute{\\epsilon}$',
+u'\u03ae': '$\\acute{\\eta}$',
+u'\u03af': '$\\acute{\\iota}$',
+u'\u03b0': '$\\acute{\\ddot{\\upsilon}}$',
+u'\u03b1': '$\\alpha$',
+u'\u03b2': '$\\beta$',
+u'\u03b3': '$\\gamma$',
+u'\u03b4': '$\\delta$',
+u'\u03b5': '$\\epsilon$',
+u'\u03b6': '$\\zeta$',
+u'\u03b7': '$\\eta$',
+u'\u03b8': '{\\texttheta}',
+u'\u03b9': '$\\iota$',
+u'\u03ba': '$\\kappa$',
+u'\u03bb': '$\\lambda$',
+u'\u03bc': '$\\mu$',
+u'\u03bd': '$\\nu$',
+u'\u03be': '$\\xi$',
+u'\u03bf': '$o$',
+u'\u03c0': '$\\pi$',
+u'\u03c1': '$\\rho$',
+u'\u03c2': '$\\varsigma$',
+u'\u03c3': '$\\sigma$',
+u'\u03c4': '$\\tau$',
+u'\u03c5': '$\\upsilon$',
+u'\u03c6': '$\\varphi$',
+u'\u03c7': '$\\chi$',
+u'\u03c8': '$\\psi$',
+u'\u03c9': '$\\omega$',
+u'\u03ca': '$\\ddot{\\iota}$',
+u'\u03cb': '$\\ddot{\\upsilon}$',
+u'\u03cc': "{\\'{o}}",
+u'\u03cd': '$\\acute{\\upsilon}$',
+u'\u03ce': '$\\acute{\\omega}$',
+u'\u03d0': '{\\Pisymbol{ppi022}{87}}',
+u'\u03d1': '{\\textvartheta}',
+u'\u03d2': '$\\Upsilon$',
+u'\u03d5': '$\\phi$',
+u'\u03d6': '$\\varpi$',
+u'\u03da': '$\\Stigma$',
+u'\u03dc': '$\\Digamma$',
+u'\u03dd': '$\\digamma$',
+u'\u03de': '$\\Koppa$',
+u'\u03e0': '$\\Sampi$',
+u'\u03f0': '$\\varkappa$',
+u'\u03f1': '$\\varrho$',
+u'\u03f4': '{\\textTheta}',
+u'\u03f6': '$\\backepsilon$',
+u'\u0401': '{\\cyrchar\\CYRYO}',
+u'\u0402': '{\\cyrchar\\CYRDJE}',
+u'\u0403': "{\\cyrchar{\\'\\CYRG}}",
+u'\u0404': '{\\cyrchar\\CYRIE}',
+u'\u0405': '{\\cyrchar\\CYRDZE}',
+u'\u0406': '{\\cyrchar\\CYRII}',
+u'\u0407': '{\\cyrchar\\CYRYI}',
+u'\u0408': '{\\cyrchar\\CYRJE}',
+u'\u0409': '{\\cyrchar\\CYRLJE}',
+u'\u040a': '{\\cyrchar\\CYRNJE}',
+u'\u040b': '{\\cyrchar\\CYRTSHE}',
+u'\u040c': "{\\cyrchar{\\'\\CYRK}}",
+u'\u040e': '{\\cyrchar\\CYRUSHRT}',
+u'\u040f': '{\\cyrchar\\CYRDZHE}',
+u'\u0410': '{\\cyrchar\\CYRA}',
+u'\u0411': '{\\cyrchar\\CYRB}',
+u'\u0412': '{\\cyrchar\\CYRV}',
+u'\u0413': '{\\cyrchar\\CYRG}',
+u'\u0414': '{\\cyrchar\\CYRD}',
+u'\u0415': '{\\cyrchar\\CYRE}',
+u'\u0416': '{\\cyrchar\\CYRZH}',
+u'\u0417': '{\\cyrchar\\CYRZ}',
+u'\u0418': '{\\cyrchar\\CYRI}',
+u'\u0419': '{\\cyrchar\\CYRISHRT}',
+u'\u041a': '{\\cyrchar\\CYRK}',
+u'\u041b': '{\\cyrchar\\CYRL}',
+u'\u041c': '{\\cyrchar\\CYRM}',
+u'\u041d': '{\\cyrchar\\CYRN}',
+u'\u041e': '{\\cyrchar\\CYRO}',
+u'\u041f': '{\\cyrchar\\CYRP}',
+u'\u0420': '{\\cyrchar\\CYRR}',
+u'\u0421': '{\\cyrchar\\CYRS}',
+u'\u0422': '{\\cyrchar\\CYRT}',
+u'\u0423': '{\\cyrchar\\CYRU}',
+u'\u0424': '{\\cyrchar\\CYRF}',
+u'\u0425': '{\\cyrchar\\CYRH}',
+u'\u0426': '{\\cyrchar\\CYRC}',
+u'\u0427': '{\\cyrchar\\CYRCH}',
+u'\u0428': '{\\cyrchar\\CYRSH}',
+u'\u0429': '{\\cyrchar\\CYRSHCH}',
+u'\u042a': '{\\cyrchar\\CYRHRDSN}',
+u'\u042b': '{\\cyrchar\\CYRERY}',
+u'\u042c': '{\\cyrchar\\CYRSFTSN}',
+u'\u042d': '{\\cyrchar\\CYREREV}',
+u'\u042e': '{\\cyrchar\\CYRYU}',
+u'\u042f': '{\\cyrchar\\CYRYA}',
+u'\u0430': '{\\cyrchar\\cyra}',
+u'\u0431': '{\\cyrchar\\cyrb}',
+u'\u0432': '{\\cyrchar\\cyrv}',
+u'\u0433': '{\\cyrchar\\cyrg}',
+u'\u0434': '{\\cyrchar\\cyrd}',
+u'\u0435': '{\\cyrchar\\cyre}',
+u'\u0436': '{\\cyrchar\\cyrzh}',
+u'\u0437': '{\\cyrchar\\cyrz}',
+u'\u0438': '{\\cyrchar\\cyri}',
+u'\u0439': '{\\cyrchar\\cyrishrt}',
+u'\u043a': '{\\cyrchar\\cyrk}',
+u'\u043b': '{\\cyrchar\\cyrl}',
+u'\u043c': '{\\cyrchar\\cyrm}',
+u'\u043d': '{\\cyrchar\\cyrn}',
+u'\u043e': '{\\cyrchar\\cyro}',
+u'\u043f': '{\\cyrchar\\cyrp}',
+u'\u0440': '{\\cyrchar\\cyrr}',
+u'\u0441': '{\\cyrchar\\cyrs}',
+u'\u0442': '{\\cyrchar\\cyrt}',
+u'\u0443': '{\\cyrchar\\cyru}',
+u'\u0444': '{\\cyrchar\\cyrf}',
+u'\u0445': '{\\cyrchar\\cyrh}',
+u'\u0446': '{\\cyrchar\\cyrc}',
+u'\u0447': '{\\cyrchar\\cyrch}',
+u'\u0448': '{\\cyrchar\\cyrsh}',
+u'\u0449': '{\\cyrchar\\cyrshch}',
+u'\u044a': '{\\cyrchar\\cyrhrdsn}',
+u'\u044b': '{\\cyrchar\\cyrery}',
+u'\u044c': '{\\cyrchar\\cyrsftsn}',
+u'\u044d': '{\\cyrchar\\cyrerev}',
+u'\u044e': '{\\cyrchar\\cyryu}',
+u'\u044f': '{\\cyrchar\\cyrya}',
+u'\u0451': '{\\cyrchar\\cyryo}',
+u'\u0452': '{\\cyrchar\\cyrdje}',
+u'\u0453': "{\\cyrchar{\\'\\cyrg}}",
+u'\u0454': '{\\cyrchar\\cyrie}',
+u'\u0455': '{\\cyrchar\\cyrdze}',
+u'\u0456': '{\\cyrchar\\cyrii}',
+u'\u0457': '{\\cyrchar\\cyryi}',
+u'\u0458': '{\\cyrchar\\cyrje}',
+u'\u0459': '{\\cyrchar\\cyrlje}',
+u'\u045a': '{\\cyrchar\\cyrnje}',
+u'\u045b': '{\\cyrchar\\cyrtshe}',
+u'\u045c': "{\\cyrchar{\\'\\cyrk}}",
+u'\u045e': '{\\cyrchar\\cyrushrt}',
+u'\u045f': '{\\cyrchar\\cyrdzhe}',
+u'\u0460': '{\\cyrchar\\CYROMEGA}',
+u'\u0461': '{\\cyrchar\\cyromega}',
+u'\u0462': '{\\cyrchar\\CYRYAT}',
+u'\u0464': '{\\cyrchar\\CYRIOTE}',
+u'\u0465': '{\\cyrchar\\cyriote}',
+u'\u0466': '{\\cyrchar\\CYRLYUS}',
+u'\u0467': '{\\cyrchar\\cyrlyus}',
+u'\u0468': '{\\cyrchar\\CYRIOTLYUS}',
+u'\u0469': '{\\cyrchar\\cyriotlyus}',
+u'\u046a': '{\\cyrchar\\CYRBYUS}',
+u'\u046c': '{\\cyrchar\\CYRIOTBYUS}',
+u'\u046d': '{\\cyrchar\\cyriotbyus}',
+u'\u046e': '{\\cyrchar\\CYRKSI}',
+u'\u046f': '{\\cyrchar\\cyrksi}',
+u'\u0470': '{\\cyrchar\\CYRPSI}',
+u'\u0471': '{\\cyrchar\\cyrpsi}',
+u'\u0472': '{\\cyrchar\\CYRFITA}',
+u'\u0474': '{\\cyrchar\\CYRIZH}',
+u'\u0478': '{\\cyrchar\\CYRUK}',
+u'\u0479': '{\\cyrchar\\cyruk}',
+u'\u047a': '{\\cyrchar\\CYROMEGARND}',
+u'\u047b': '{\\cyrchar\\cyromegarnd}',
+u'\u047c': '{\\cyrchar\\CYROMEGATITLO}',
+u'\u047d': '{\\cyrchar\\cyromegatitlo}',
+u'\u047e': '{\\cyrchar\\CYROT}',
+u'\u047f': '{\\cyrchar\\cyrot}',
+u'\u0480': '{\\cyrchar\\CYRKOPPA}',
+u'\u0481': '{\\cyrchar\\cyrkoppa}',
+u'\u0482': '{\\cyrchar\\cyrthousands}',
+u'\u0488': '{\\cyrchar\\cyrhundredthousands}',
+u'\u0489': '{\\cyrchar\\cyrmillions}',
+u'\u048c': '{\\cyrchar\\CYRSEMISFTSN}',
+u'\u048d': '{\\cyrchar\\cyrsemisftsn}',
+u'\u048e': '{\\cyrchar\\CYRRTICK}',
+u'\u048f': '{\\cyrchar\\cyrrtick}',
+u'\u0490': '{\\cyrchar\\CYRGUP}',
+u'\u0491': '{\\cyrchar\\cyrgup}',
+u'\u0492': '{\\cyrchar\\CYRGHCRS}',
+u'\u0493': '{\\cyrchar\\cyrghcrs}',
+u'\u0494': '{\\cyrchar\\CYRGHK}',
+u'\u0495': '{\\cyrchar\\cyrghk}',
+u'\u0496': '{\\cyrchar\\CYRZHDSC}',
+u'\u0497': '{\\cyrchar\\cyrzhdsc}',
+u'\u0498': '{\\cyrchar\\CYRZDSC}',
+u'\u0499': '{\\cyrchar\\cyrzdsc}',
+u'\u049a': '{\\cyrchar\\CYRKDSC}',
+u'\u049b': '{\\cyrchar\\cyrkdsc}',
+u'\u049c': '{\\cyrchar\\CYRKVCRS}',
+u'\u049d': '{\\cyrchar\\cyrkvcrs}',
+u'\u049e': '{\\cyrchar\\CYRKHCRS}',
+u'\u049f': '{\\cyrchar\\cyrkhcrs}',
+u'\u04a0': '{\\cyrchar\\CYRKBEAK}',
+u'\u04a1': '{\\cyrchar\\cyrkbeak}',
+u'\u04a2': '{\\cyrchar\\CYRNDSC}',
+u'\u04a3': '{\\cyrchar\\cyrndsc}',
+u'\u04a4': '{\\cyrchar\\CYRNG}',
+u'\u04a5': '{\\cyrchar\\cyrng}',
+u'\u04a6': '{\\cyrchar\\CYRPHK}',
+u'\u04a7': '{\\cyrchar\\cyrphk}',
+u'\u04a8': '{\\cyrchar\\CYRABHHA}',
+u'\u04a9': '{\\cyrchar\\cyrabhha}',
+u'\u04aa': '{\\cyrchar\\CYRSDSC}',
+u'\u04ab': '{\\cyrchar\\cyrsdsc}',
+u'\u04ac': '{\\cyrchar\\CYRTDSC}',
+u'\u04ad': '{\\cyrchar\\cyrtdsc}',
+u'\u04ae': '{\\cyrchar\\CYRY}',
+u'\u04af': '{\\cyrchar\\cyry}',
+u'\u04b0': '{\\cyrchar\\CYRYHCRS}',
+u'\u04b1': '{\\cyrchar\\cyryhcrs}',
+u'\u04b2': '{\\cyrchar\\CYRHDSC}',
+u'\u04b3': '{\\cyrchar\\cyrhdsc}',
+u'\u04b4': '{\\cyrchar\\CYRTETSE}',
+u'\u04b5': '{\\cyrchar\\cyrtetse}',
+u'\u04b6': '{\\cyrchar\\CYRCHRDSC}',
+u'\u04b7': '{\\cyrchar\\cyrchrdsc}',
+u'\u04b8': '{\\cyrchar\\CYRCHVCRS}',
+u'\u04b9': '{\\cyrchar\\cyrchvcrs}',
+u'\u04ba': '{\\cyrchar\\CYRSHHA}',
+u'\u04bb': '{\\cyrchar\\cyrshha}',
+u'\u04bc': '{\\cyrchar\\CYRABHCH}',
+u'\u04bd': '{\\cyrchar\\cyrabhch}',
+u'\u04be': '{\\cyrchar\\CYRABHCHDSC}',
+u'\u04bf': '{\\cyrchar\\cyrabhchdsc}',
+u'\u04c0': '{\\cyrchar\\CYRpalochka}',
+u'\u04c3': '{\\cyrchar\\CYRKHK}',
+u'\u04c4': '{\\cyrchar\\cyrkhk}',
+u'\u04c7': '{\\cyrchar\\CYRNHK}',
+u'\u04c8': '{\\cyrchar\\cyrnhk}',
+u'\u04cb': '{\\cyrchar\\CYRCHLDSC}',
+u'\u04cc': '{\\cyrchar\\cyrchldsc}',
+u'\u04d4': '{\\cyrchar\\CYRAE}',
+u'\u04d5': '{\\cyrchar\\cyrae}',
+u'\u04d8': '{\\cyrchar\\CYRSCHWA}',
+u'\u04d9': '{\\cyrchar\\cyrschwa}',
+u'\u04e0': '{\\cyrchar\\CYRABHDZE}',
+u'\u04e1': '{\\cyrchar\\cyrabhdze}',
+u'\u04e8': '{\\cyrchar\\CYROTLD}',
+u'\u04e9': '{\\cyrchar\\cyrotld}',
+u'\u2002': '{\\hspace{0.6em}}',
+u'\u2003': '{\\hspace{1em}}',
+u'\u2004': '{\\hspace{0.33em}}',
+u'\u2005': '{\\hspace{0.25em}}',
+u'\u2006': '{\\hspace{0.166em}}',
+u'\u2007': '{\\hphantom{0}}',
+u'\u2008': '{\\hphantom{,}}',
+u'\u2009': '{\\hspace{0.167em}}',
+u'\u200a': '$\\mkern1mu$',
+u'\u2010': '{-}',
+u'\u2013': '{\\textendash}',
+u'\u2014': '{\\textemdash}',
+u'\u2015': '{\\rule{1em}{1pt}}',
+u'\u2016': '$\\Vert$',
+u'\u2018': '{`}',
+u'\u2019': "{'}",
+u'\u201a': '{,}',
+u'\u201b': '$\\Elzreapos$',
+u'\u201c': '{\\textquotedblleft}',
+u'\u201d': '{\\textquotedblright}',
+u'\u201e': '{,,}',
+u'\u2020': '{\\textdagger}',
+u'\u2021': '{\\textdaggerdbl}',
+u'\u2022': '{\\textbullet}',
+u'\u2024': '{.}',
+u'\u2025': '{..}',
+u'\u2026': '{\\ldots}',
+u'\u2030': '{\\textperthousand}',
+u'\u2031': '{\\textpertenthousand}',
+u'\u2032': "${'}$",
+u'\u2033': "${''}$",
+u'\u2034': "${'''}$",
+u'\u2035': '$\\backprime$',
+u'\u2039': '{\\guilsinglleft}',
+u'\u203a': '{\\guilsinglright}',
+u'\u2057': "$''''$",
+u'\u205f': '{\\mkern4mu}',
+u'\u2060': '{\\nolinebreak}',
+u'\u20a7': '{\\ensuremath{\\Elzpes}}',
+u'\u20ac': '{\\mbox{\\texteuro}}',
+u'\u20db': '$\\dddot$',
+u'\u20dc': '$\\ddddot$',
+u'\u2102': '$\\mathbb{C}$',
+u'\u210a': '{\\mathscr{g}}',
+u'\u210b': '$\\mathscr{H}$',
+u'\u210c': '$\\mathfrak{H}$',
+u'\u210d': '$\\mathbb{H}$',
+u'\u210f': '$\\hslash$',
+u'\u2110': '$\\mathscr{I}$',
+u'\u2111': '$\\mathfrak{I}$',
+u'\u2112': '$\\mathscr{L}$',
+u'\u2113': '$\\mathscr{l}$',
+u'\u2115': '$\\mathbb{N}$',
+u'\u2116': '{\\cyrchar\\textnumero}',
+u'\u2118': '$\\wp$',
+u'\u2119': '$\\mathbb{P}$',
+u'\u211a': '$\\mathbb{Q}$',
+u'\u211b': '$\\mathscr{R}$',
+u'\u211c': '$\\mathfrak{R}$',
+u'\u211d': '$\\mathbb{R}$',
+u'\u211e': '$\\Elzxrat$',
+u'\u2122': '{\\texttrademark}',
+u'\u2124': '$\\mathbb{Z}$',
+u'\u2126': '$\\Omega$',
+u'\u2127': '$\\mho$',
+u'\u2128': '$\\mathfrak{Z}$',
+u'\u2129': '$\\ElsevierGlyph{2129}$',
+u'\u212b': '{\\AA}',
+u'\u212c': '$\\mathscr{B}$',
+u'\u212d': '$\\mathfrak{C}$',
+u'\u212f': '$\\mathscr{e}$',
+u'\u2130': '$\\mathscr{E}$',
+u'\u2131': '$\\mathscr{F}$',
+u'\u2133': '$\\mathscr{M}$',
+u'\u2134': '$\\mathscr{o}$',
+u'\u2135': '$\\aleph$',
+u'\u2136': '$\\beth$',
+u'\u2137': '$\\gimel$',
+u'\u2138': '$\\daleth$',
+u'\u2153': '$\\textfrac{1}{3}$',
+u'\u2154': '$\\textfrac{2}{3}$',
+u'\u2155': '$\\textfrac{1}{5}$',
+u'\u2156': '$\\textfrac{2}{5}$',
+u'\u2157': '$\\textfrac{3}{5}$',
+u'\u2158': '$\\textfrac{4}{5}$',
+u'\u2159': '$\\textfrac{1}{6}$',
+u'\u215a': '$\\textfrac{5}{6}$',
+u'\u215b': '$\\textfrac{1}{8}$',
+u'\u215c': '$\\textfrac{3}{8}$',
+u'\u215d': '$\\textfrac{5}{8}$',
+u'\u215e': '$\\textfrac{7}{8}$',
+u'\u2190': '$\\leftarrow$',
+u'\u2191': '$\\uparrow$',
+u'\u2192': '$\\rightarrow$',
+u'\u2193': '$\\downarrow$',
+u'\u2194': '$\\leftrightarrow$',
+u'\u2195': '$\\updownarrow$',
+u'\u2196': '$\\nwarrow$',
+u'\u2197': '$\\nearrow$',
+u'\u2198': '$\\searrow$',
+u'\u2199': '$\\swarrow$',
+u'\u219a': '$\\nleftarrow$',
+u'\u219b': '$\\nrightarrow$',
+u'\u219c': '$\\arrowwaveright$',
+u'\u219d': '$\\arrowwaveright$',
+u'\u219e': '$\\twoheadleftarrow$',
+u'\u21a0': '$\\twoheadrightarrow$',
+u'\u21a2': '$\\leftarrowtail$',
+u'\u21a3': '$\\rightarrowtail$',
+u'\u21a6': '$\\mapsto$',
+u'\u21a9': '$\\hookleftarrow$',
+u'\u21aa': '$\\hookrightarrow$',
+u'\u21ab': '$\\looparrowleft$',
+u'\u21ac': '$\\looparrowright$',
+u'\u21ad': '$\\leftrightsquigarrow$',
+u'\u21ae': '$\\nleftrightarrow$',
+u'\u21b0': '$\\Lsh$',
+u'\u21b1': '$\\Rsh$',
+u'\u21b3': '$\\ElsevierGlyph{21B3}$',
+u'\u21b6': '$\\curvearrowleft$',
+u'\u21b7': '$\\curvearrowright$',
+u'\u21ba': '$\\circlearrowleft$',
+u'\u21bb': '$\\circlearrowright$',
+u'\u21bc': '$\\leftharpoonup$',
+u'\u21bd': '$\\leftharpoondown$',
+u'\u21be': '$\\upharpoonright$',
+u'\u21bf': '$\\upharpoonleft$',
+u'\u21c0': '$\\rightharpoonup$',
+u'\u21c1': '$\\rightharpoondown$',
+u'\u21c2': '$\\downharpoonright$',
+u'\u21c3': '$\\downharpoonleft$',
+u'\u21c4': '$\\rightleftarrows$',
+u'\u21c5': '$\\dblarrowupdown$',
+u'\u21c6': '$\\leftrightarrows$',
+u'\u21c7': '$\\leftleftarrows$',
+u'\u21c8': '$\\upuparrows$',
+u'\u21c9': '$\\rightrightarrows$',
+u'\u21ca': '$\\downdownarrows$',
+u'\u21cb': '$\\leftrightharpoons$',
+u'\u21cc': '$\\rightleftharpoons$',
+u'\u21cd': '$\\nLeftarrow$',
+u'\u21ce': '$\\nLeftrightarrow$',
+u'\u21cf': '$\\nRightarrow$',
+u'\u21d0': '$\\Leftarrow$',
+u'\u21d1': '$\\Uparrow$',
+u'\u21d2': '$\\Rightarrow$',
+u'\u21d3': '$\\Downarrow$',
+u'\u21d4': '$\\Leftrightarrow$',
+u'\u21d5': '$\\Updownarrow$',
+u'\u21da': '$\\Lleftarrow$',
+u'\u21db': '$\\Rrightarrow$',
+u'\u21dd': '$\\rightsquigarrow$',
+u'\u21f5': '$\\DownArrowUpArrow$',
+u'\u2200': '$\\forall$',
+u'\u2201': '$\\complement$',
+u'\u2202': '$\\partial$',
+u'\u2203': '$\\exists$',
+u'\u2204': '$\\nexists$',
+u'\u2205': '$\\varnothing$',
+u'\u2207': '$\\nabla$',
+u'\u2208': '$\\in$',
+u'\u2209': '$\\not\\in$',
+u'\u220b': '$\\ni$',
+u'\u220c': '$\\not\\ni$',
+u'\u220f': '$\\prod$',
+u'\u2210': '$\\coprod$',
+u'\u2211': '$\\sum$',
+u'\u2212': '{-}',
+u'\u2213': '$\\mp$',
+u'\u2214': '$\\dotplus$',
+u'\u2216': '$\\setminus$',
+u'\u2217': '${_\\ast}$',
+u'\u2218': '$\\circ$',
+u'\u2219': '$\\bullet$',
+u'\u221a': '$\\surd$',
+u'\u221d': '$\\propto$',
+u'\u221e': '$\\infty$',
+u'\u221f': '$\\rightangle$',
+u'\u2220': '$\\angle$',
+u'\u2221': '$\\measuredangle$',
+u'\u2222': '$\\sphericalangle$',
+u'\u2223': '$\\mid$',
+u'\u2224': '$\\nmid$',
+u'\u2225': '$\\parallel$',
+u'\u2226': '$\\nparallel$',
+u'\u2227': '$\\wedge$',
+u'\u2228': '$\\vee$',
+u'\u2229': '$\\cap$',
+u'\u222a': '$\\cup$',
+u'\u222b': '$\\int$',
+u'\u222c': '$\\int\\!\\int$',
+u'\u222d': '$\\int\\!\\int\\!\\int$',
+u'\u222e': '$\\oint$',
+u'\u222f': '$\\surfintegral$',
+u'\u2230': '$\\volintegral$',
+u'\u2231': '$\\clwintegral$',
+u'\u2232': '$\\ElsevierGlyph{2232}$',
+u'\u2233': '$\\ElsevierGlyph{2233}$',
+u'\u2234': '$\\therefore$',
+u'\u2235': '$\\because$',
+u'\u2237': '$\\Colon$',
+u'\u2238': '$\\ElsevierGlyph{2238}$',
+u'\u223a': '$\\mathbin{{:}\\!\\!{-}\\!\\!{:}}$',
+u'\u223b': '$\\homothetic$',
+u'\u223c': '$\\sim$',
+u'\u223d': '$\\backsim$',
+u'\u223e': '$\\lazysinv$',
+u'\u2240': '$\\wr$',
+u'\u2241': '$\\not\\sim$',
+u'\u2242': '$\\ElsevierGlyph{2242}$',
+u'\u2243': '$\\simeq$',
+u'\u2244': '$\\not\\simeq$',
+u'\u2245': '$\\cong$',
+u'\u2246': '$\\approxnotequal$',
+u'\u2247': '$\\not\\cong$',
+u'\u2248': '$\\approx$',
+u'\u2249': '$\\not\\approx$',
+u'\u224a': '$\\approxeq$',
+u'\u224b': '$\\tildetrpl$',
+u'\u224c': '$\\allequal$',
+u'\u224d': '$\\asymp$',
+u'\u224e': '$\\Bumpeq$',
+u'\u224f': '$\\bumpeq$',
+u'\u2250': '$\\doteq$',
+u'\u2251': '$\\doteqdot$',
+u'\u2252': '$\\fallingdotseq$',
+u'\u2253': '$\\risingdotseq$',
+u'\u2254': '{:=}',
+u'\u2255': '$=:$',
+u'\u2256': '$\\eqcirc$',
+u'\u2257': '$\\circeq$',
+u'\u2259': '$\\estimates$',
+u'\u225a': '$\\ElsevierGlyph{225A}$',
+u'\u225b': '$\\starequal$',
+u'\u225c': '$\\triangleq$',
+u'\u225f': '$\\ElsevierGlyph{225F}$',
+u'\u2260': '$\\not =$',
+u'\u2261': '$\\equiv$',
+u'\u2262': '$\\not\\equiv$',
+u'\u2264': '$\\leq$',
+u'\u2265': '$\\geq$',
+u'\u2266': '$\\leqq$',
+u'\u2267': '$\\geqq$',
+u'\u2268': '$\\lneqq$',
+u'\u2269': '$\\gneqq$',
+u'\u226a': '$\\ll$',
+u'\u226b': '$\\gg$',
+u'\u226c': '$\\between$',
+u'\u226d': '$\\not\\kern-0.3em\\times$',
+u'\u226e': '$\\not<$',
+u'\u226f': '$\\not>$',
+u'\u2270': '$\\not\\leq$',
+u'\u2271': '$\\not\\geq$',
+u'\u2272': '$\\lessequivlnt$',
+u'\u2273': '$\\greaterequivlnt$',
+u'\u2274': '$\\ElsevierGlyph{2274}$',
+u'\u2275': '$\\ElsevierGlyph{2275}$',
+u'\u2276': '$\\lessgtr$',
+u'\u2277': '$\\gtrless$',
+u'\u2278': '$\\notlessgreater$',
+u'\u2279': '$\\notgreaterless$',
+u'\u227a': '$\\prec$',
+u'\u227b': '$\\succ$',
+u'\u227c': '$\\preccurlyeq$',
+u'\u227d': '$\\succcurlyeq$',
+u'\u227e': '$\\precapprox$',
+u'\u227f': '$\\succapprox$',
+u'\u2280': '$\\not\\prec$',
+u'\u2281': '$\\not\\succ$',
+u'\u2282': '$\\subset$',
+u'\u2283': '$\\supset$',
+u'\u2284': '$\\not\\subset$',
+u'\u2285': '$\\not\\supset$',
+u'\u2286': '$\\subseteq$',
+u'\u2287': '$\\supseteq$',
+u'\u2288': '$\\not\\subseteq$',
+u'\u2289': '$\\not\\supseteq$',
+u'\u228a': '$\\subsetneq$',
+u'\u228b': '$\\supsetneq$',
+u'\u228e': '$\\uplus$',
+u'\u228f': '$\\sqsubset$',
+u'\u2290': '$\\sqsupset$',
+u'\u2291': '$\\sqsubseteq$',
+u'\u2292': '$\\sqsupseteq$',
+u'\u2293': '$\\sqcap$',
+u'\u2294': '$\\sqcup$',
+u'\u2295': '$\\oplus$',
+u'\u2296': '$\\ominus$',
+u'\u2297': '$\\otimes$',
+u'\u2298': '$\\oslash$',
+u'\u2299': '$\\odot$',
+u'\u229a': '$\\circledcirc$',
+u'\u229b': '$\\circledast$',
+u'\u229d': '$\\circleddash$',
+u'\u229e': '$\\boxplus$',
+u'\u229f': '$\\boxminus$',
+u'\u22a0': '$\\boxtimes$',
+u'\u22a1': '$\\boxdot$',
+u'\u22a2': '$\\vdash$',
+u'\u22a3': '$\\dashv$',
+u'\u22a4': '$\\top$',
+u'\u22a5': '$\\perp$',
+u'\u22a7': '$\\truestate$',
+u'\u22a8': '$\\forcesextra$',
+u'\u22a9': '$\\Vdash$',
+u'\u22aa': '$\\Vvdash$',
+u'\u22ab': '$\\VDash$',
+u'\u22ac': '$\\nvdash$',
+u'\u22ad': '$\\nvDash$',
+u'\u22ae': '$\\nVdash$',
+u'\u22af': '$\\nVDash$',
+u'\u22b2': '$\\vartriangleleft$',
+u'\u22b3': '$\\vartriangleright$',
+u'\u22b4': '$\\trianglelefteq$',
+u'\u22b5': '$\\trianglerighteq$',
+u'\u22b6': '$\\original$',
+u'\u22b7': '$\\image$',
+u'\u22b8': '$\\multimap$',
+u'\u22b9': '$\\hermitconjmatrix$',
+u'\u22ba': '$\\intercal$',
+u'\u22bb': '$\\veebar$',
+u'\u22be': '$\\rightanglearc$',
+u'\u22c0': '$\\ElsevierGlyph{22C0}$',
+u'\u22c1': '$\\ElsevierGlyph{22C1}$',
+u'\u22c2': '$\\bigcap$',
+u'\u22c3': '$\\bigcup$',
+u'\u22c4': '$\\diamond$',
+u'\u22c5': '$\\cdot$',
+u'\u22c6': '$\\star$',
+u'\u22c7': '$\\divideontimes$',
+u'\u22c8': '$\\bowtie$',
+u'\u22c9': '$\\ltimes$',
+u'\u22ca': '$\\rtimes$',
+u'\u22cb': '$\\leftthreetimes$',
+u'\u22cc': '$\\rightthreetimes$',
+u'\u22cd': '$\\backsimeq$',
+u'\u22ce': '$\\curlyvee$',
+u'\u22cf': '$\\curlywedge$',
+u'\u22d0': '$\\Subset$',
+u'\u22d1': '$\\Supset$',
+u'\u22d2': '$\\Cap$',
+u'\u22d3': '$\\Cup$',
+u'\u22d4': '$\\pitchfork$',
+u'\u22d6': '$\\lessdot$',
+u'\u22d7': '$\\gtrdot$',
+u'\u22d8': '$\\verymuchless$',
+u'\u22d9': '$\\verymuchgreater$',
+u'\u22da': '$\\lesseqgtr$',
+u'\u22db': '$\\gtreqless$',
+u'\u22de': '$\\curlyeqprec$',
+u'\u22df': '$\\curlyeqsucc$',
+u'\u22e2': '$\\not\\sqsubseteq$',
+u'\u22e3': '$\\not\\sqsupseteq$',
+u'\u22e5': '$\\Elzsqspne$',
+u'\u22e6': '$\\lnsim$',
+u'\u22e7': '$\\gnsim$',
+u'\u22e8': '$\\precedesnotsimilar$',
+u'\u22e9': '$\\succnsim$',
+u'\u22ea': '$\\ntriangleleft$',
+u'\u22eb': '$\\ntriangleright$',
+u'\u22ec': '$\\ntrianglelefteq$',
+u'\u22ed': '$\\ntrianglerighteq$',
+u'\u22ee': '$\\vdots$',
+u'\u22ef': '$\\cdots$',
+u'\u22f0': '$\\upslopeellipsis$',
+u'\u22f1': '$\\downslopeellipsis$',
+u'\u2305': '{\\barwedge}',
+u'\u2306': '$\\perspcorrespond$',
+u'\u2308': '$\\lceil$',
+u'\u2309': '$\\rceil$',
+u'\u230a': '$\\lfloor$',
+u'\u230b': '$\\rfloor$',
+u'\u2315': '$\\recorder$',
+u'\u2316': '$\\mathchar"2208$',
+u'\u231c': '$\\ulcorner$',
+u'\u231d': '$\\urcorner$',
+u'\u231e': '$\\llcorner$',
+u'\u231f': '$\\lrcorner$',
+u'\u2322': '$\\frown$',
+u'\u2323': '$\\smile$',
+u'\u2329': '$\\langle$',
+u'\u232a': '$\\rangle$',
+u'\u233d': '$\\ElsevierGlyph{E838}$',
+u'\u23a3': '$\\Elzdlcorn$',
+u'\u23b0': '$\\lmoustache$',
+u'\u23b1': '$\\rmoustache$',
+u'\u2423': '{\\textvisiblespace}',
+u'\u2460': '{\\ding{172}}',
+u'\u2461': '{\\ding{173}}',
+u'\u2462': '{\\ding{174}}',
+u'\u2463': '{\\ding{175}}',
+u'\u2464': '{\\ding{176}}',
+u'\u2465': '{\\ding{177}}',
+u'\u2466': '{\\ding{178}}',
+u'\u2467': '{\\ding{179}}',
+u'\u2468': '{\\ding{180}}',
+u'\u2469': '{\\ding{181}}',
+u'\u24c8': '$\\circledS$',
+u'\u2506': '$\\Elzdshfnc$',
+u'\u2519': '$\\Elzsqfnw$',
+u'\u2571': '$\\diagup$',
+u'\u25a0': '{\\ding{110}}',
+u'\u25a1': '$\\square$',
+u'\u25aa': '$\\blacksquare$',
+u'\u25ad': '$\\fbox{~~}$',
+u'\u25af': '$\\Elzvrecto$',
+u'\u25b1': '$\\ElsevierGlyph{E381}$',
+u'\u25b2': '{\\ding{115}}',
+u'\u25b3': '$\\bigtriangleup$',
+u'\u25b4': '$\\blacktriangle$',
+u'\u25b5': '$\\vartriangle$',
+u'\u25b8': '$\\blacktriangleright$',
+u'\u25b9': '$\\triangleright$',
+u'\u25bc': '{\\ding{116}}',
+u'\u25bd': '$\\bigtriangledown$',
+u'\u25be': '$\\blacktriangledown$',
+u'\u25bf': '$\\triangledown$',
+u'\u25c2': '$\\blacktriangleleft$',
+u'\u25c3': '$\\triangleleft$',
+u'\u25c6': '{\\ding{117}}',
+u'\u25ca': '$\\lozenge$',
+u'\u25cb': '$\\bigcirc$',
+u'\u25cf': '{\\ding{108}}',
+u'\u25d0': '$\\Elzcirfl$',
+u'\u25d1': '$\\Elzcirfr$',
+u'\u25d2': '$\\Elzcirfb$',
+u'\u25d7': '{\\ding{119}}',
+u'\u25d8': '$\\Elzrvbull$',
+u'\u25e7': '$\\Elzsqfl$',
+u'\u25e8': '$\\Elzsqfr$',
+u'\u25ea': '$\\Elzsqfse$',
+u'\u25ef': '$\\bigcirc$',
+u'\u2605': '{\\ding{72}}',
+u'\u2606': '{\\ding{73}}',
+u'\u260e': '{\\ding{37}}',
+u'\u261b': '{\\ding{42}}',
+u'\u261e': '{\\ding{43}}',
+u'\u263e': '{\\rightmoon}',
+u'\u263f': '{\\mercury}',
+u'\u2640': '{\\venus}',
+u'\u2642': '{\\male}',
+u'\u2643': '{\\jupiter}',
+u'\u2644': '{\\saturn}',
+u'\u2645': '{\\uranus}',
+u'\u2646': '{\\neptune}',
+u'\u2647': '{\\pluto}',
+u'\u2648': '{\\aries}',
+u'\u2649': '{\\taurus}',
+u'\u264a': '{\\gemini}',
+u'\u264b': '{\\cancer}',
+u'\u264c': '{\\leo}',
+u'\u264d': '{\\virgo}',
+u'\u264e': '{\\libra}',
+u'\u264f': '{\\scorpio}',
+u'\u2650': '{\\sagittarius}',
+u'\u2651': '{\\capricornus}',
+u'\u2652': '{\\aquarius}',
+u'\u2653': '{\\pisces}',
+u'\u2660': '{\\ding{171}}',
+u'\u2662': '$\\diamond$',
+u'\u2663': '{\\ding{168}}',
+u'\u2665': '{\\ding{170}}',
+u'\u2666': '{\\ding{169}}',
+u'\u2669': '{\\quarternote}',
+u'\u266a': '{\\eighthnote}',
+u'\u266d': '$\\flat$',
+u'\u266e': '$\\natural$',
+u'\u266f': '$\\sharp$',
+u'\u2701': '{\\ding{33}}',
+u'\u2702': '{\\ding{34}}',
+u'\u2703': '{\\ding{35}}',
+u'\u2704': '{\\ding{36}}',
+u'\u2706': '{\\ding{38}}',
+u'\u2707': '{\\ding{39}}',
+u'\u2708': '{\\ding{40}}',
+u'\u2709': '{\\ding{41}}',
+u'\u270c': '{\\ding{44}}',
+u'\u270d': '{\\ding{45}}',
+u'\u270e': '{\\ding{46}}',
+u'\u270f': '{\\ding{47}}',
+u'\u2710': '{\\ding{48}}',
+u'\u2711': '{\\ding{49}}',
+u'\u2712': '{\\ding{50}}',
+u'\u2713': '{\\ding{51}}',
+u'\u2714': '{\\ding{52}}',
+u'\u2715': '{\\ding{53}}',
+u'\u2716': '{\\ding{54}}',
+u'\u2717': '{\\ding{55}}',
+u'\u2718': '{\\ding{56}}',
+u'\u2719': '{\\ding{57}}',
+u'\u271a': '{\\ding{58}}',
+u'\u271b': '{\\ding{59}}',
+u'\u271c': '{\\ding{60}}',
+u'\u271d': '{\\ding{61}}',
+u'\u271e': '{\\ding{62}}',
+u'\u271f': '{\\ding{63}}',
+u'\u2720': '{\\ding{64}}',
+u'\u2721': '{\\ding{65}}',
+u'\u2722': '{\\ding{66}}',
+u'\u2723': '{\\ding{67}}',
+u'\u2724': '{\\ding{68}}',
+u'\u2725': '{\\ding{69}}',
+u'\u2726': '{\\ding{70}}',
+u'\u2727': '{\\ding{71}}',
+u'\u2729': '{\\ding{73}}',
+u'\u272a': '{\\ding{74}}',
+u'\u272b': '{\\ding{75}}',
+u'\u272c': '{\\ding{76}}',
+u'\u272d': '{\\ding{77}}',
+u'\u272e': '{\\ding{78}}',
+u'\u272f': '{\\ding{79}}',
+u'\u2730': '{\\ding{80}}',
+u'\u2731': '{\\ding{81}}',
+u'\u2732': '{\\ding{82}}',
+u'\u2733': '{\\ding{83}}',
+u'\u2734': '{\\ding{84}}',
+u'\u2735': '{\\ding{85}}',
+u'\u2736': '{\\ding{86}}',
+u'\u2737': '{\\ding{87}}',
+u'\u2738': '{\\ding{88}}',
+u'\u2739': '{\\ding{89}}',
+u'\u273a': '{\\ding{90}}',
+u'\u273b': '{\\ding{91}}',
+u'\u273c': '{\\ding{92}}',
+u'\u273d': '{\\ding{93}}',
+u'\u273e': '{\\ding{94}}',
+u'\u273f': '{\\ding{95}}',
+u'\u2740': '{\\ding{96}}',
+u'\u2741': '{\\ding{97}}',
+u'\u2742': '{\\ding{98}}',
+u'\u2743': '{\\ding{99}}',
+u'\u2744': '{\\ding{100}}',
+u'\u2745': '{\\ding{101}}',
+u'\u2746': '{\\ding{102}}',
+u'\u2747': '{\\ding{103}}',
+u'\u2748': '{\\ding{104}}',
+u'\u2749': '{\\ding{105}}',
+u'\u274a': '{\\ding{106}}',
+u'\u274b': '{\\ding{107}}',
+u'\u274d': '{\\ding{109}}',
+u'\u274f': '{\\ding{111}}',
+u'\u2750': '{\\ding{112}}',
+u'\u2751': '{\\ding{113}}',
+u'\u2752': '{\\ding{114}}',
+u'\u2756': '{\\ding{118}}',
+u'\u2758': '{\\ding{120}}',
+u'\u2759': '{\\ding{121}}',
+u'\u275a': '{\\ding{122}}',
+u'\u275b': '{\\ding{123}}',
+u'\u275c': '{\\ding{124}}',
+u'\u275d': '{\\ding{125}}',
+u'\u275e': '{\\ding{126}}',
+u'\u2761': '{\\ding{161}}',
+u'\u2762': '{\\ding{162}}',
+u'\u2763': '{\\ding{163}}',
+u'\u2764': '{\\ding{164}}',
+u'\u2765': '{\\ding{165}}',
+u'\u2766': '{\\ding{166}}',
+u'\u2767': '{\\ding{167}}',
+u'\u2776': '{\\ding{182}}',
+u'\u2777': '{\\ding{183}}',
+u'\u2778': '{\\ding{184}}',
+u'\u2779': '{\\ding{185}}',
+u'\u277a': '{\\ding{186}}',
+u'\u277b': '{\\ding{187}}',
+u'\u277c': '{\\ding{188}}',
+u'\u277d': '{\\ding{189}}',
+u'\u277e': '{\\ding{190}}',
+u'\u277f': '{\\ding{191}}',
+u'\u2780': '{\\ding{192}}',
+u'\u2781': '{\\ding{193}}',
+u'\u2782': '{\\ding{194}}',
+u'\u2783': '{\\ding{195}}',
+u'\u2784': '{\\ding{196}}',
+u'\u2785': '{\\ding{197}}',
+u'\u2786': '{\\ding{198}}',
+u'\u2787': '{\\ding{199}}',
+u'\u2788': '{\\ding{200}}',
+u'\u2789': '{\\ding{201}}',
+u'\u278a': '{\\ding{202}}',
+u'\u278b': '{\\ding{203}}',
+u'\u278c': '{\\ding{204}}',
+u'\u278d': '{\\ding{205}}',
+u'\u278e': '{\\ding{206}}',
+u'\u278f': '{\\ding{207}}',
+u'\u2790': '{\\ding{208}}',
+u'\u2791': '{\\ding{209}}',
+u'\u2792': '{\\ding{210}}',
+u'\u2793': '{\\ding{211}}',
+u'\u2794': '{\\ding{212}}',
+u'\u2798': '{\\ding{216}}',
+u'\u2799': '{\\ding{217}}',
+u'\u279a': '{\\ding{218}}',
+u'\u279b': '{\\ding{219}}',
+u'\u279c': '{\\ding{220}}',
+u'\u279d': '{\\ding{221}}',
+u'\u279e': '{\\ding{222}}',
+u'\u279f': '{\\ding{223}}',
+u'\u27a0': '{\\ding{224}}',
+u'\u27a1': '{\\ding{225}}',
+u'\u27a2': '{\\ding{226}}',
+u'\u27a3': '{\\ding{227}}',
+u'\u27a4': '{\\ding{228}}',
+u'\u27a5': '{\\ding{229}}',
+u'\u27a6': '{\\ding{230}}',
+u'\u27a7': '{\\ding{231}}',
+u'\u27a8': '{\\ding{232}}',
+u'\u27a9': '{\\ding{233}}',
+u'\u27aa': '{\\ding{234}}',
+u'\u27ab': '{\\ding{235}}',
+u'\u27ac': '{\\ding{236}}',
+u'\u27ad': '{\\ding{237}}',
+u'\u27ae': '{\\ding{238}}',
+u'\u27af': '{\\ding{239}}',
+u'\u27b1': '{\\ding{241}}',
+u'\u27b2': '{\\ding{242}}',
+u'\u27b3': '{\\ding{243}}',
+u'\u27b4': '{\\ding{244}}',
+u'\u27b5': '{\\ding{245}}',
+u'\u27b6': '{\\ding{246}}',
+u'\u27b7': '{\\ding{247}}',
+u'\u27b8': '{\\ding{248}}',
+u'\u27b9': '{\\ding{249}}',
+u'\u27ba': '{\\ding{250}}',
+u'\u27bb': '{\\ding{251}}',
+u'\u27bc': '{\\ding{252}}',
+u'\u27bd': '{\\ding{253}}',
+u'\u27be': '{\\ding{254}}',
+u'\u27f5': '$\\longleftarrow$',
+u'\u27f6': '$\\longrightarrow$',
+u'\u27f7': '$\\longleftrightarrow$',
+u'\u27f8': '$\\Longleftarrow$',
+u'\u27f9': '$\\Longrightarrow$',
+u'\u27fa': '$\\Longleftrightarrow$',
+u'\u27fc': '$\\longmapsto$',
+u'\u27ff': '$\\sim\\joinrel\\leadsto$',
+u'\u2905': '$\\ElsevierGlyph{E212}$',
+u'\u2912': '$\\UpArrowBar$',
+u'\u2913': '$\\DownArrowBar$',
+u'\u2923': '$\\ElsevierGlyph{E20C}$',
+u'\u2924': '$\\ElsevierGlyph{E20D}$',
+u'\u2925': '$\\ElsevierGlyph{E20B}$',
+u'\u2926': '$\\ElsevierGlyph{E20A}$',
+u'\u2927': '$\\ElsevierGlyph{E211}$',
+u'\u2928': '$\\ElsevierGlyph{E20E}$',
+u'\u2929': '$\\ElsevierGlyph{E20F}$',
+u'\u292a': '$\\ElsevierGlyph{E210}$',
+u'\u2933': '$\\ElsevierGlyph{E21C}$',
+u'\u2936': '$\\ElsevierGlyph{E21A}$',
+u'\u2937': '$\\ElsevierGlyph{E219}$',
+u'\u2940': '$\\Elolarr$',
+u'\u2941': '$\\Elorarr$',
+u'\u2942': '$\\ElzRlarr$',
+u'\u2944': '$\\ElzrLarr$',
+u'\u2947': '$\\Elzrarrx$',
+u'\u294e': '$\\LeftRightVector$',
+u'\u294f': '$\\RightUpDownVector$',
+u'\u2950': '$\\DownLeftRightVector$',
+u'\u2951': '$\\LeftUpDownVector$',
+u'\u2952': '$\\LeftVectorBar$',
+u'\u2953': '$\\RightVectorBar$',
+u'\u2954': '$\\RightUpVectorBar$',
+u'\u2955': '$\\RightDownVectorBar$',
+u'\u2956': '$\\DownLeftVectorBar$',
+u'\u2957': '$\\DownRightVectorBar$',
+u'\u2958': '$\\LeftUpVectorBar$',
+u'\u2959': '$\\LeftDownVectorBar$',
+u'\u295a': '$\\LeftTeeVector$',
+u'\u295b': '$\\RightTeeVector$',
+u'\u295c': '$\\RightUpTeeVector$',
+u'\u295d': '$\\RightDownTeeVector$',
+u'\u295e': '$\\DownLeftTeeVector$',
+u'\u295f': '$\\DownRightTeeVector$',
+u'\u2960': '$\\LeftUpTeeVector$',
+u'\u2961': '$\\LeftDownTeeVector$',
+u'\u296e': '$\\UpEquilibrium$',
+u'\u296f': '$\\ReverseUpEquilibrium$',
+u'\u2970': '$\\RoundImplies$',
+u'\u297c': '$\\ElsevierGlyph{E214}$',
+u'\u297d': '$\\ElsevierGlyph{E215}$',
+u'\u2980': '$\\Elztfnc$',
+u'\u2985': '$\\ElsevierGlyph{3018}$',
+u'\u2986': '$\\Elroang$',
+u'\u2993': '$<\\kern-0.58em($',
+u'\u2994': '$\\ElsevierGlyph{E291}$',
+u'\u2999': '$\\Elzddfnc$',
+u'\u299c': '$\\Angle$',
+u'\u29a0': '$\\Elzlpargt$',
+u'\u29b5': '$\\ElsevierGlyph{E260}$',
+u'\u29b6': '$\\ElsevierGlyph{E61B}$',
+u'\u29ca': '$\\ElzLap$',
+u'\u29cb': '$\\Elzdefas$',
+u'\u29cf': '$\\LeftTriangleBar$',
+u'\u29d0': '$\\RightTriangleBar$',
+u'\u29dc': '$\\ElsevierGlyph{E372}$',
+u'\u29eb': '$\\blacklozenge$',
+u'\u29f4': '$\\RuleDelayed$',
+u'\u2a04': '$\\Elxuplus$',
+u'\u2a05': '$\\ElzThr$',
+u'\u2a06': '$\\Elxsqcup$',
+u'\u2a07': '$\\ElzInf$',
+u'\u2a08': '$\\ElzSup$',
+u'\u2a0d': '$\\ElzCint$',
+u'\u2a0f': '$\\clockoint$',
+u'\u2a10': '$\\ElsevierGlyph{E395}$',
+u'\u2a16': '$\\sqrint$',
+u'\u2a25': '$\\ElsevierGlyph{E25A}$',
+u'\u2a2a': '$\\ElsevierGlyph{E25B}$',
+u'\u2a2d': '$\\ElsevierGlyph{E25C}$',
+u'\u2a2e': '$\\ElsevierGlyph{E25D}$',
+u'\u2a2f': '$\\ElzTimes$',
+u'\u2a34': '$\\ElsevierGlyph{E25E}$',
+u'\u2a35': '$\\ElsevierGlyph{E25E}$',
+u'\u2a3c': '$\\ElsevierGlyph{E259}$',
+u'\u2a3f': '$\\amalg$',
+u'\u2a53': '$\\ElzAnd$',
+u'\u2a54': '$\\ElzOr$',
+u'\u2a55': '$\\ElsevierGlyph{E36E}$',
+u'\u2a56': '$\\ElOr$',
+u'\u2a5e': '$\\perspcorrespond$',
+u'\u2a5f': '$\\Elzminhat$',
+u'\u2a63': '$\\ElsevierGlyph{225A}$',
+u'\u2a6e': '$\\stackrel{*}{=}$',
+u'\u2a75': '$\\Equal$',
+u'\u2a7d': '$\\leqslant$',
+u'\u2a7e': '$\\geqslant$',
+u'\u2a85': '$\\lessapprox$',
+u'\u2a86': '$\\gtrapprox$',
+u'\u2a87': '$\\lneq$',
+u'\u2a88': '$\\gneq$',
+u'\u2a89': '$\\lnapprox$',
+u'\u2a8a': '$\\gnapprox$',
+u'\u2a8b': '$\\lesseqqgtr$',
+u'\u2a8c': '$\\gtreqqless$',
+u'\u2a95': '$\\eqslantless$',
+u'\u2a96': '$\\eqslantgtr$',
+u'\u2a9d': '$\\Pisymbol{ppi020}{117}$',
+u'\u2a9e': '$\\Pisymbol{ppi020}{105}$',
+u'\u2aa1': '$\\NestedLessLess$',
+u'\u2aa2': '$\\NestedGreaterGreater$',
+u'\u2aaf': '$\\preceq$',
+u'\u2ab0': '$\\succeq$',
+u'\u2ab5': '$\\precneqq$',
+u'\u2ab6': '$\\succneqq$',
+u'\u2ab7': '$\\precapprox$',
+u'\u2ab8': '$\\succapprox$',
+u'\u2ab9': '$\\precnapprox$',
+u'\u2aba': '$\\succnapprox$',
+u'\u2ac5': '$\\subseteqq$',
+u'\u2ac6': '$\\supseteqq$',
+u'\u2acb': '$\\subsetneqq$',
+u'\u2acc': '$\\supsetneqq$',
+u'\u2aeb': '$\\ElsevierGlyph{E30D}$',
+u'\u2af6': '$\\Elztdcol$',
+u'\u2afd': '${{/}\\!\\!{/}}$',
+u'\u300a': '$\\ElsevierGlyph{300A}$',
+u'\u300b': '$\\ElsevierGlyph{300B}$',
+u'\u3018': '$\\ElsevierGlyph{3018}$',
+u'\u3019': '$\\ElsevierGlyph{3019}$',
+u'\u301a': '$\\openbracketleft$',
+u'\u301b': '$\\openbracketright$',
+u'\ufb00': '{ff}',
+u'\ufb01': '{fi}',
+u'\ufb02': '{fl}',
+u'\ufb03': '{ffi}',
+u'\ufb04': '{ffl}',
+u'\U0001d400': '$\\mathbf{A}$',
+u'\U0001d401': '$\\mathbf{B}$',
+u'\U0001d402': '$\\mathbf{C}$',
+u'\U0001d403': '$\\mathbf{D}$',
+u'\U0001d404': '$\\mathbf{E}$',
+u'\U0001d405': '$\\mathbf{F}$',
+u'\U0001d406': '$\\mathbf{G}$',
+u'\U0001d407': '$\\mathbf{H}$',
+u'\U0001d408': '$\\mathbf{I}$',
+u'\U0001d409': '$\\mathbf{J}$',
+u'\U0001d40a': '$\\mathbf{K}$',
+u'\U0001d40b': '$\\mathbf{L}$',
+u'\U0001d40c': '$\\mathbf{M}$',
+u'\U0001d40d': '$\\mathbf{N}$',
+u'\U0001d40e': '$\\mathbf{O}$',
+u'\U0001d40f': '$\\mathbf{P}$',
+u'\U0001d410': '$\\mathbf{Q}$',
+u'\U0001d411': '$\\mathbf{R}$',
+u'\U0001d412': '$\\mathbf{S}$',
+u'\U0001d413': '$\\mathbf{T}$',
+u'\U0001d414': '$\\mathbf{U}$',
+u'\U0001d415': '$\\mathbf{V}$',
+u'\U0001d416': '$\\mathbf{W}$',
+u'\U0001d417': '$\\mathbf{X}$',
+u'\U0001d418': '$\\mathbf{Y}$',
+u'\U0001d419': '$\\mathbf{Z}$',
+u'\U0001d41a': '$\\mathbf{a}$',
+u'\U0001d41b': '$\\mathbf{b}$',
+u'\U0001d41c': '$\\mathbf{c}$',
+u'\U0001d41d': '$\\mathbf{d}$',
+u'\U0001d41e': '$\\mathbf{e}$',
+u'\U0001d41f': '$\\mathbf{f}$',
+u'\U0001d420': '$\\mathbf{g}$',
+u'\U0001d421': '$\\mathbf{h}$',
+u'\U0001d422': '$\\mathbf{i}$',
+u'\U0001d423': '$\\mathbf{j}$',
+u'\U0001d424': '$\\mathbf{k}$',
+u'\U0001d425': '$\\mathbf{l}$',
+u'\U0001d426': '$\\mathbf{m}$',
+u'\U0001d427': '$\\mathbf{n}$',
+u'\U0001d428': '$\\mathbf{o}$',
+u'\U0001d429': '$\\mathbf{p}$',
+u'\U0001d42a': '$\\mathbf{q}$',
+u'\U0001d42b': '$\\mathbf{r}$',
+u'\U0001d42c': '$\\mathbf{s}$',
+u'\U0001d42d': '$\\mathbf{t}$',
+u'\U0001d42e': '$\\mathbf{u}$',
+u'\U0001d42f': '$\\mathbf{v}$',
+u'\U0001d430': '$\\mathbf{w}$',
+u'\U0001d431': '$\\mathbf{x}$',
+u'\U0001d432': '$\\mathbf{y}$',
+u'\U0001d433': '$\\mathbf{z}$',
+u'\U0001d434': '$\\mathsl{A}$',
+u'\U0001d435': '$\\mathsl{B}$',
+u'\U0001d436': '$\\mathsl{C}$',
+u'\U0001d437': '$\\mathsl{D}$',
+u'\U0001d438': '$\\mathsl{E}$',
+u'\U0001d439': '$\\mathsl{F}$',
+u'\U0001d43a': '$\\mathsl{G}$',
+u'\U0001d43b': '$\\mathsl{H}$',
+u'\U0001d43c': '$\\mathsl{I}$',
+u'\U0001d43d': '$\\mathsl{J}$',
+u'\U0001d43e': '$\\mathsl{K}$',
+u'\U0001d43f': '$\\mathsl{L}$',
+u'\U0001d440': '$\\mathsl{M}$',
+u'\U0001d441': '$\\mathsl{N}$',
+u'\U0001d442': '$\\mathsl{O}$',
+u'\U0001d443': '$\\mathsl{P}$',
+u'\U0001d444': '$\\mathsl{Q}$',
+u'\U0001d445': '$\\mathsl{R}$',
+u'\U0001d446': '$\\mathsl{S}$',
+u'\U0001d447': '$\\mathsl{T}$',
+u'\U0001d448': '$\\mathsl{U}$',
+u'\U0001d449': '$\\mathsl{V}$',
+u'\U0001d44a': '$\\mathsl{W}$',
+u'\U0001d44b': '$\\mathsl{X}$',
+u'\U0001d44c': '$\\mathsl{Y}$',
+u'\U0001d44d': '$\\mathsl{Z}$',
+u'\U0001d44e': '$\\mathsl{a}$',
+u'\U0001d44f': '$\\mathsl{b}$',
+u'\U0001d450': '$\\mathsl{c}$',
+u'\U0001d451': '$\\mathsl{d}$',
+u'\U0001d452': '$\\mathsl{e}$',
+u'\U0001d453': '$\\mathsl{f}$',
+u'\U0001d454': '$\\mathsl{g}$',
+u'\U0001d456': '$\\mathsl{i}$',
+u'\U0001d457': '$\\mathsl{j}$',
+u'\U0001d458': '$\\mathsl{k}$',
+u'\U0001d459': '$\\mathsl{l}$',
+u'\U0001d45a': '$\\mathsl{m}$',
+u'\U0001d45b': '$\\mathsl{n}$',
+u'\U0001d45c': '$\\mathsl{o}$',
+u'\U0001d45d': '$\\mathsl{p}$',
+u'\U0001d45e': '$\\mathsl{q}$',
+u'\U0001d45f': '$\\mathsl{r}$',
+u'\U0001d460': '$\\mathsl{s}$',
+u'\U0001d461': '$\\mathsl{t}$',
+u'\U0001d462': '$\\mathsl{u}$',
+u'\U0001d463': '$\\mathsl{v}$',
+u'\U0001d464': '$\\mathsl{w}$',
+u'\U0001d465': '$\\mathsl{x}$',
+u'\U0001d466': '$\\mathsl{y}$',
+u'\U0001d467': '$\\mathsl{z}$',
+u'\U0001d468': '$\\mathbit{A}$',
+u'\U0001d469': '$\\mathbit{B}$',
+u'\U0001d46a': '$\\mathbit{C}$',
+u'\U0001d46b': '$\\mathbit{D}$',
+u'\U0001d46c': '$\\mathbit{E}$',
+u'\U0001d46d': '$\\mathbit{F}$',
+u'\U0001d46e': '$\\mathbit{G}$',
+u'\U0001d46f': '$\\mathbit{H}$',
+u'\U0001d470': '$\\mathbit{I}$',
+u'\U0001d471': '$\\mathbit{J}$',
+u'\U0001d472': '$\\mathbit{K}$',
+u'\U0001d473': '$\\mathbit{L}$',
+u'\U0001d474': '$\\mathbit{M}$',
+u'\U0001d475': '$\\mathbit{N}$',
+u'\U0001d476': '$\\mathbit{O}$',
+u'\U0001d477': '$\\mathbit{P}$',
+u'\U0001d478': '$\\mathbit{Q}$',
+u'\U0001d479': '$\\mathbit{R}$',
+u'\U0001d47a': '$\\mathbit{S}$',
+u'\U0001d47b': '$\\mathbit{T}$',
+u'\U0001d47c': '$\\mathbit{U}$',
+u'\U0001d47d': '$\\mathbit{V}$',
+u'\U0001d47e': '$\\mathbit{W}$',
+u'\U0001d47f': '$\\mathbit{X}$',
+u'\U0001d480': '$\\mathbit{Y}$',
+u'\U0001d481': '$\\mathbit{Z}$',
+u'\U0001d482': '$\\mathbit{a}$',
+u'\U0001d483': '$\\mathbit{b}$',
+u'\U0001d484': '$\\mathbit{c}$',
+u'\U0001d485': '$\\mathbit{d}$',
+u'\U0001d486': '$\\mathbit{e}$',
+u'\U0001d487': '$\\mathbit{f}$',
+u'\U0001d488': '$\\mathbit{g}$',
+u'\U0001d489': '$\\mathbit{h}$',
+u'\U0001d48a': '$\\mathbit{i}$',
+u'\U0001d48b': '$\\mathbit{j}$',
+u'\U0001d48c': '$\\mathbit{k}$',
+u'\U0001d48d': '$\\mathbit{l}$',
+u'\U0001d48e': '$\\mathbit{m}$',
+u'\U0001d48f': '$\\mathbit{n}$',
+u'\U0001d490': '$\\mathbit{o}$',
+u'\U0001d491': '$\\mathbit{p}$',
+u'\U0001d492': '$\\mathbit{q}$',
+u'\U0001d493': '$\\mathbit{r}$',
+u'\U0001d494': '$\\mathbit{s}$',
+u'\U0001d495': '$\\mathbit{t}$',
+u'\U0001d496': '$\\mathbit{u}$',
+u'\U0001d497': '$\\mathbit{v}$',
+u'\U0001d498': '$\\mathbit{w}$',
+u'\U0001d499': '$\\mathbit{x}$',
+u'\U0001d49a': '$\\mathbit{y}$',
+u'\U0001d49b': '$\\mathbit{z}$',
+u'\U0001d49c': '$\\mathscr{A}$',
+u'\U0001d49e': '$\\mathscr{C}$',
+u'\U0001d49f': '$\\mathscr{D}$',
+u'\U0001d4a2': '$\\mathscr{G}$',
+u'\U0001d4a5': '$\\mathscr{J}$',
+u'\U0001d4a6': '$\\mathscr{K}$',
+u'\U0001d4a9': '$\\mathscr{N}$',
+u'\U0001d4aa': '$\\mathscr{O}$',
+u'\U0001d4ab': '$\\mathscr{P}$',
+u'\U0001d4ac': '$\\mathscr{Q}$',
+u'\U0001d4ae': '$\\mathscr{S}$',
+u'\U0001d4af': '$\\mathscr{T}$',
+u'\U0001d4b0': '$\\mathscr{U}$',
+u'\U0001d4b1': '$\\mathscr{V}$',
+u'\U0001d4b2': '$\\mathscr{W}$',
+u'\U0001d4b3': '$\\mathscr{X}$',
+u'\U0001d4b4': '$\\mathscr{Y}$',
+u'\U0001d4b5': '$\\mathscr{Z}$',
+u'\U0001d4b6': '$\\mathscr{a}$',
+u'\U0001d4b7': '$\\mathscr{b}$',
+u'\U0001d4b8': '$\\mathscr{c}$',
+u'\U0001d4b9': '$\\mathscr{d}$',
+u'\U0001d4bb': '$\\mathscr{f}$',
+u'\U0001d4bd': '$\\mathscr{h}$',
+u'\U0001d4be': '$\\mathscr{i}$',
+u'\U0001d4bf': '$\\mathscr{j}$',
+u'\U0001d4c0': '$\\mathscr{k}$',
+u'\U0001d4c1': '$\\mathscr{l}$',
+u'\U0001d4c2': '$\\mathscr{m}$',
+u'\U0001d4c3': '$\\mathscr{n}$',
+u'\U0001d4c5': '$\\mathscr{p}$',
+u'\U0001d4c6': '$\\mathscr{q}$',
+u'\U0001d4c7': '$\\mathscr{r}$',
+u'\U0001d4c8': '$\\mathscr{s}$',
+u'\U0001d4c9': '$\\mathscr{t}$',
+u'\U0001d4ca': '$\\mathscr{u}$',
+u'\U0001d4cb': '$\\mathscr{v}$',
+u'\U0001d4cc': '$\\mathscr{w}$',
+u'\U0001d4cd': '$\\mathscr{x}$',
+u'\U0001d4ce': '$\\mathscr{y}$',
+u'\U0001d4cf': '$\\mathscr{z}$',
+u'\U0001d4d0': '$\\mathmit{A}$',
+u'\U0001d4d1': '$\\mathmit{B}$',
+u'\U0001d4d2': '$\\mathmit{C}$',
+u'\U0001d4d3': '$\\mathmit{D}$',
+u'\U0001d4d4': '$\\mathmit{E}$',
+u'\U0001d4d5': '$\\mathmit{F}$',
+u'\U0001d4d6': '$\\mathmit{G}$',
+u'\U0001d4d7': '$\\mathmit{H}$',
+u'\U0001d4d8': '$\\mathmit{I}$',
+u'\U0001d4d9': '$\\mathmit{J}$',
+u'\U0001d4da': '$\\mathmit{K}$',
+u'\U0001d4db': '$\\mathmit{L}$',
+u'\U0001d4dc': '$\\mathmit{M}$',
+u'\U0001d4dd': '$\\mathmit{N}$',
+u'\U0001d4de': '$\\mathmit{O}$',
+u'\U0001d4df': '$\\mathmit{P}$',
+u'\U0001d4e0': '$\\mathmit{Q}$',
+u'\U0001d4e1': '$\\mathmit{R}$',
+u'\U0001d4e2': '$\\mathmit{S}$',
+u'\U0001d4e3': '$\\mathmit{T}$',
+u'\U0001d4e4': '$\\mathmit{U}$',
+u'\U0001d4e5': '$\\mathmit{V}$',
+u'\U0001d4e6': '$\\mathmit{W}$',
+u'\U0001d4e7': '$\\mathmit{X}$',
+u'\U0001d4e8': '$\\mathmit{Y}$',
+u'\U0001d4e9': '$\\mathmit{Z}$',
+u'\U0001d4ea': '$\\mathmit{a}$',
+u'\U0001d4eb': '$\\mathmit{b}$',
+u'\U0001d4ec': '$\\mathmit{c}$',
+u'\U0001d4ed': '$\\mathmit{d}$',
+u'\U0001d4ee': '$\\mathmit{e}$',
+u'\U0001d4ef': '$\\mathmit{f}$',
+u'\U0001d4f0': '$\\mathmit{g}$',
+u'\U0001d4f1': '$\\mathmit{h}$',
+u'\U0001d4f2': '$\\mathmit{i}$',
+u'\U0001d4f3': '$\\mathmit{j}$',
+u'\U0001d4f4': '$\\mathmit{k}$',
+u'\U0001d4f5': '$\\mathmit{l}$',
+u'\U0001d4f6': '$\\mathmit{m}$',
+u'\U0001d4f7': '$\\mathmit{n}$',
+u'\U0001d4f8': '$\\mathmit{o}$',
+u'\U0001d4f9': '$\\mathmit{p}$',
+u'\U0001d4fa': '$\\mathmit{q}$',
+u'\U0001d4fb': '$\\mathmit{r}$',
+u'\U0001d4fc': '$\\mathmit{s}$',
+u'\U0001d4fd': '$\\mathmit{t}$',
+u'\U0001d4fe': '$\\mathmit{u}$',
+u'\U0001d4ff': '$\\mathmit{v}$',
+u'\U0001d500': '$\\mathmit{w}$',
+u'\U0001d501': '$\\mathmit{x}$',
+u'\U0001d502': '$\\mathmit{y}$',
+u'\U0001d503': '$\\mathmit{z}$',
+u'\U0001d504': '$\\mathfrak{A}$',
+u'\U0001d505': '$\\mathfrak{B}$',
+u'\U0001d507': '$\\mathfrak{D}$',
+u'\U0001d508': '$\\mathfrak{E}$',
+u'\U0001d509': '$\\mathfrak{F}$',
+u'\U0001d50a': '$\\mathfrak{G}$',
+u'\U0001d50d': '$\\mathfrak{J}$',
+u'\U0001d50e': '$\\mathfrak{K}$',
+u'\U0001d50f': '$\\mathfrak{L}$',
+u'\U0001d510': '$\\mathfrak{M}$',
+u'\U0001d511': '$\\mathfrak{N}$',
+u'\U0001d512': '$\\mathfrak{O}$',
+u'\U0001d513': '$\\mathfrak{P}$',
+u'\U0001d514': '$\\mathfrak{Q}$',
+u'\U0001d516': '$\\mathfrak{S}$',
+u'\U0001d517': '$\\mathfrak{T}$',
+u'\U0001d518': '$\\mathfrak{U}$',
+u'\U0001d519': '$\\mathfrak{V}$',
+u'\U0001d51a': '$\\mathfrak{W}$',
+u'\U0001d51b': '$\\mathfrak{X}$',
+u'\U0001d51c': '$\\mathfrak{Y}$',
+u'\U0001d51e': '$\\mathfrak{a}$',
+u'\U0001d51f': '$\\mathfrak{b}$',
+u'\U0001d520': '$\\mathfrak{c}$',
+u'\U0001d521': '$\\mathfrak{d}$',
+u'\U0001d522': '$\\mathfrak{e}$',
+u'\U0001d523': '$\\mathfrak{f}$',
+u'\U0001d524': '$\\mathfrak{g}$',
+u'\U0001d525': '$\\mathfrak{h}$',
+u'\U0001d526': '$\\mathfrak{i}$',
+u'\U0001d527': '$\\mathfrak{j}$',
+u'\U0001d528': '$\\mathfrak{k}$',
+u'\U0001d529': '$\\mathfrak{l}$',
+u'\U0001d52a': '$\\mathfrak{m}$',
+u'\U0001d52b': '$\\mathfrak{n}$',
+u'\U0001d52c': '$\\mathfrak{o}$',
+u'\U0001d52d': '$\\mathfrak{p}$',
+u'\U0001d52e': '$\\mathfrak{q}$',
+u'\U0001d52f': '$\\mathfrak{r}$',
+u'\U0001d530': '$\\mathfrak{s}$',
+u'\U0001d531': '$\\mathfrak{t}$',
+u'\U0001d532': '$\\mathfrak{u}$',
+u'\U0001d533': '$\\mathfrak{v}$',
+u'\U0001d534': '$\\mathfrak{w}$',
+u'\U0001d535': '$\\mathfrak{x}$',
+u'\U0001d536': '$\\mathfrak{y}$',
+u'\U0001d537': '$\\mathfrak{z}$',
+u'\U0001d538': '$\\mathbb{A}$',
+u'\U0001d539': '$\\mathbb{B}$',
+u'\U0001d53b': '$\\mathbb{D}$',
+u'\U0001d53c': '$\\mathbb{E}$',
+u'\U0001d53d': '$\\mathbb{F}$',
+u'\U0001d53e': '$\\mathbb{G}$',
+u'\U0001d540': '$\\mathbb{I}$',
+u'\U0001d541': '$\\mathbb{J}$',
+u'\U0001d542': '$\\mathbb{K}$',
+u'\U0001d543': '$\\mathbb{L}$',
+u'\U0001d544': '$\\mathbb{M}$',
+u'\U0001d546': '$\\mathbb{O}$',
+u'\U0001d54a': '$\\mathbb{S}$',
+u'\U0001d54b': '$\\mathbb{T}$',
+u'\U0001d54c': '$\\mathbb{U}$',
+u'\U0001d54d': '$\\mathbb{V}$',
+u'\U0001d54e': '$\\mathbb{W}$',
+u'\U0001d54f': '$\\mathbb{X}$',
+u'\U0001d550': '$\\mathbb{Y}$',
+u'\U0001d552': '$\\mathbb{a}$',
+u'\U0001d553': '$\\mathbb{b}$',
+u'\U0001d554': '$\\mathbb{c}$',
+u'\U0001d555': '$\\mathbb{d}$',
+u'\U0001d556': '$\\mathbb{e}$',
+u'\U0001d557': '$\\mathbb{f}$',
+u'\U0001d558': '$\\mathbb{g}$',
+u'\U0001d559': '$\\mathbb{h}$',
+u'\U0001d55a': '$\\mathbb{i}$',
+u'\U0001d55b': '$\\mathbb{j}$',
+u'\U0001d55c': '$\\mathbb{k}$',
+u'\U0001d55d': '$\\mathbb{l}$',
+u'\U0001d55e': '$\\mathbb{m}$',
+u'\U0001d55f': '$\\mathbb{n}$',
+u'\U0001d560': '$\\mathbb{o}$',
+u'\U0001d561': '$\\mathbb{p}$',
+u'\U0001d562': '$\\mathbb{q}$',
+u'\U0001d563': '$\\mathbb{r}$',
+u'\U0001d564': '$\\mathbb{s}$',
+u'\U0001d565': '$\\mathbb{t}$',
+u'\U0001d566': '$\\mathbb{u}$',
+u'\U0001d567': '$\\mathbb{v}$',
+u'\U0001d568': '$\\mathbb{w}$',
+u'\U0001d569': '$\\mathbb{x}$',
+u'\U0001d56a': '$\\mathbb{y}$',
+u'\U0001d56b': '$\\mathbb{z}$',
+u'\U0001d56c': '$\\mathslbb{A}$',
+u'\U0001d56d': '$\\mathslbb{B}$',
+u'\U0001d56e': '$\\mathslbb{C}$',
+u'\U0001d56f': '$\\mathslbb{D}$',
+u'\U0001d570': '$\\mathslbb{E}$',
+u'\U0001d571': '$\\mathslbb{F}$',
+u'\U0001d572': '$\\mathslbb{G}$',
+u'\U0001d573': '$\\mathslbb{H}$',
+u'\U0001d574': '$\\mathslbb{I}$',
+u'\U0001d575': '$\\mathslbb{J}$',
+u'\U0001d576': '$\\mathslbb{K}$',
+u'\U0001d577': '$\\mathslbb{L}$',
+u'\U0001d578': '$\\mathslbb{M}$',
+u'\U0001d579': '$\\mathslbb{N}$',
+u'\U0001d57a': '$\\mathslbb{O}$',
+u'\U0001d57b': '$\\mathslbb{P}$',
+u'\U0001d57c': '$\\mathslbb{Q}$',
+u'\U0001d57d': '$\\mathslbb{R}$',
+u'\U0001d57e': '$\\mathslbb{S}$',
+u'\U0001d57f': '$\\mathslbb{T}$',
+u'\U0001d580': '$\\mathslbb{U}$',
+u'\U0001d581': '$\\mathslbb{V}$',
+u'\U0001d582': '$\\mathslbb{W}$',
+u'\U0001d583': '$\\mathslbb{X}$',
+u'\U0001d584': '$\\mathslbb{Y}$',
+u'\U0001d585': '$\\mathslbb{Z}$',
+u'\U0001d586': '$\\mathslbb{a}$',
+u'\U0001d587': '$\\mathslbb{b}$',
+u'\U0001d588': '$\\mathslbb{c}$',
+u'\U0001d589': '$\\mathslbb{d}$',
+u'\U0001d58a': '$\\mathslbb{e}$',
+u'\U0001d58b': '$\\mathslbb{f}$',
+u'\U0001d58c': '$\\mathslbb{g}$',
+u'\U0001d58d': '$\\mathslbb{h}$',
+u'\U0001d58e': '$\\mathslbb{i}$',
+u'\U0001d58f': '$\\mathslbb{j}$',
+u'\U0001d590': '$\\mathslbb{k}$',
+u'\U0001d591': '$\\mathslbb{l}$',
+u'\U0001d592': '$\\mathslbb{m}$',
+u'\U0001d593': '$\\mathslbb{n}$',
+u'\U0001d594': '$\\mathslbb{o}$',
+u'\U0001d595': '$\\mathslbb{p}$',
+u'\U0001d596': '$\\mathslbb{q}$',
+u'\U0001d597': '$\\mathslbb{r}$',
+u'\U0001d598': '$\\mathslbb{s}$',
+u'\U0001d599': '$\\mathslbb{t}$',
+u'\U0001d59a': '$\\mathslbb{u}$',
+u'\U0001d59b': '$\\mathslbb{v}$',
+u'\U0001d59c': '$\\mathslbb{w}$',
+u'\U0001d59d': '$\\mathslbb{x}$',
+u'\U0001d59e': '$\\mathslbb{y}$',
+u'\U0001d59f': '$\\mathslbb{z}$',
+u'\U0001d5a0': '$\\mathsf{A}$',
+u'\U0001d5a1': '$\\mathsf{B}$',
+u'\U0001d5a2': '$\\mathsf{C}$',
+u'\U0001d5a3': '$\\mathsf{D}$',
+u'\U0001d5a4': '$\\mathsf{E}$',
+u'\U0001d5a5': '$\\mathsf{F}$',
+u'\U0001d5a6': '$\\mathsf{G}$',
+u'\U0001d5a7': '$\\mathsf{H}$',
+u'\U0001d5a8': '$\\mathsf{I}$',
+u'\U0001d5a9': '$\\mathsf{J}$',
+u'\U0001d5aa': '$\\mathsf{K}$',
+u'\U0001d5ab': '$\\mathsf{L}$',
+u'\U0001d5ac': '$\\mathsf{M}$',
+u'\U0001d5ad': '$\\mathsf{N}$',
+u'\U0001d5ae': '$\\mathsf{O}$',
+u'\U0001d5af': '$\\mathsf{P}$',
+u'\U0001d5b0': '$\\mathsf{Q}$',
+u'\U0001d5b1': '$\\mathsf{R}$',
+u'\U0001d5b2': '$\\mathsf{S}$',
+u'\U0001d5b3': '$\\mathsf{T}$',
+u'\U0001d5b4': '$\\mathsf{U}$',
+u'\U0001d5b5': '$\\mathsf{V}$',
+u'\U0001d5b6': '$\\mathsf{W}$',
+u'\U0001d5b7': '$\\mathsf{X}$',
+u'\U0001d5b8': '$\\mathsf{Y}$',
+u'\U0001d5b9': '$\\mathsf{Z}$',
+u'\U0001d5ba': '$\\mathsf{a}$',
+u'\U0001d5bb': '$\\mathsf{b}$',
+u'\U0001d5bc': '$\\mathsf{c}$',
+u'\U0001d5bd': '$\\mathsf{d}$',
+u'\U0001d5be': '$\\mathsf{e}$',
+u'\U0001d5bf': '$\\mathsf{f}$',
+u'\U0001d5c0': '$\\mathsf{g}$',
+u'\U0001d5c1': '$\\mathsf{h}$',
+u'\U0001d5c2': '$\\mathsf{i}$',
+u'\U0001d5c3': '$\\mathsf{j}$',
+u'\U0001d5c4': '$\\mathsf{k}$',
+u'\U0001d5c5': '$\\mathsf{l}$',
+u'\U0001d5c6': '$\\mathsf{m}$',
+u'\U0001d5c7': '$\\mathsf{n}$',
+u'\U0001d5c8': '$\\mathsf{o}$',
+u'\U0001d5c9': '$\\mathsf{p}$',
+u'\U0001d5ca': '$\\mathsf{q}$',
+u'\U0001d5cb': '$\\mathsf{r}$',
+u'\U0001d5cc': '$\\mathsf{s}$',
+u'\U0001d5cd': '$\\mathsf{t}$',
+u'\U0001d5ce': '$\\mathsf{u}$',
+u'\U0001d5cf': '$\\mathsf{v}$',
+u'\U0001d5d0': '$\\mathsf{w}$',
+u'\U0001d5d1': '$\\mathsf{x}$',
+u'\U0001d5d2': '$\\mathsf{y}$',
+u'\U0001d5d3': '$\\mathsf{z}$',
+u'\U0001d5d4': '$\\mathsfbf{A}$',
+u'\U0001d5d5': '$\\mathsfbf{B}$',
+u'\U0001d5d6': '$\\mathsfbf{C}$',
+u'\U0001d5d7': '$\\mathsfbf{D}$',
+u'\U0001d5d8': '$\\mathsfbf{E}$',
+u'\U0001d5d9': '$\\mathsfbf{F}$',
+u'\U0001d5da': '$\\mathsfbf{G}$',
+u'\U0001d5db': '$\\mathsfbf{H}$',
+u'\U0001d5dc': '$\\mathsfbf{I}$',
+u'\U0001d5dd': '$\\mathsfbf{J}$',
+u'\U0001d5de': '$\\mathsfbf{K}$',
+u'\U0001d5df': '$\\mathsfbf{L}$',
+u'\U0001d5e0': '$\\mathsfbf{M}$',
+u'\U0001d5e1': '$\\mathsfbf{N}$',
+u'\U0001d5e2': '$\\mathsfbf{O}$',
+u'\U0001d5e3': '$\\mathsfbf{P}$',
+u'\U0001d5e4': '$\\mathsfbf{Q}$',
+u'\U0001d5e5': '$\\mathsfbf{R}$',
+u'\U0001d5e6': '$\\mathsfbf{S}$',
+u'\U0001d5e7': '$\\mathsfbf{T}$',
+u'\U0001d5e8': '$\\mathsfbf{U}$',
+u'\U0001d5e9': '$\\mathsfbf{V}$',
+u'\U0001d5ea': '$\\mathsfbf{W}$',
+u'\U0001d5eb': '$\\mathsfbf{X}$',
+u'\U0001d5ec': '$\\mathsfbf{Y}$',
+u'\U0001d5ed': '$\\mathsfbf{Z}$',
+u'\U0001d5ee': '$\\mathsfbf{a}$',
+u'\U0001d5ef': '$\\mathsfbf{b}$',
+u'\U0001d5f0': '$\\mathsfbf{c}$',
+u'\U0001d5f1': '$\\mathsfbf{d}$',
+u'\U0001d5f2': '$\\mathsfbf{e}$',
+u'\U0001d5f3': '$\\mathsfbf{f}$',
+u'\U0001d5f4': '$\\mathsfbf{g}$',
+u'\U0001d5f5': '$\\mathsfbf{h}$',
+u'\U0001d5f6': '$\\mathsfbf{i}$',
+u'\U0001d5f7': '$\\mathsfbf{j}$',
+u'\U0001d5f8': '$\\mathsfbf{k}$',
+u'\U0001d5f9': '$\\mathsfbf{l}$',
+u'\U0001d5fa': '$\\mathsfbf{m}$',
+u'\U0001d5fb': '$\\mathsfbf{n}$',
+u'\U0001d5fc': '$\\mathsfbf{o}$',
+u'\U0001d5fd': '$\\mathsfbf{p}$',
+u'\U0001d5fe': '$\\mathsfbf{q}$',
+u'\U0001d5ff': '$\\mathsfbf{r}$',
+u'\U0001d600': '$\\mathsfbf{s}$',
+u'\U0001d601': '$\\mathsfbf{t}$',
+u'\U0001d602': '$\\mathsfbf{u}$',
+u'\U0001d603': '$\\mathsfbf{v}$',
+u'\U0001d604': '$\\mathsfbf{w}$',
+u'\U0001d605': '$\\mathsfbf{x}$',
+u'\U0001d606': '$\\mathsfbf{y}$',
+u'\U0001d607': '$\\mathsfbf{z}$',
+u'\U0001d608': '$\\mathsfsl{A}$',
+u'\U0001d609': '$\\mathsfsl{B}$',
+u'\U0001d60a': '$\\mathsfsl{C}$',
+u'\U0001d60b': '$\\mathsfsl{D}$',
+u'\U0001d60c': '$\\mathsfsl{E}$',
+u'\U0001d60d': '$\\mathsfsl{F}$',
+u'\U0001d60e': '$\\mathsfsl{G}$',
+u'\U0001d60f': '$\\mathsfsl{H}$',
+u'\U0001d610': '$\\mathsfsl{I}$',
+u'\U0001d611': '$\\mathsfsl{J}$',
+u'\U0001d612': '$\\mathsfsl{K}$',
+u'\U0001d613': '$\\mathsfsl{L}$',
+u'\U0001d614': '$\\mathsfsl{M}$',
+u'\U0001d615': '$\\mathsfsl{N}$',
+u'\U0001d616': '$\\mathsfsl{O}$',
+u'\U0001d617': '$\\mathsfsl{P}$',
+u'\U0001d618': '$\\mathsfsl{Q}$',
+u'\U0001d619': '$\\mathsfsl{R}$',
+u'\U0001d61a': '$\\mathsfsl{S}$',
+u'\U0001d61b': '$\\mathsfsl{T}$',
+u'\U0001d61c': '$\\mathsfsl{U}$',
+u'\U0001d61d': '$\\mathsfsl{V}$',
+u'\U0001d61e': '$\\mathsfsl{W}$',
+u'\U0001d61f': '$\\mathsfsl{X}$',
+u'\U0001d620': '$\\mathsfsl{Y}$',
+u'\U0001d621': '$\\mathsfsl{Z}$',
+u'\U0001d622': '$\\mathsfsl{a}$',
+u'\U0001d623': '$\\mathsfsl{b}$',
+u'\U0001d624': '$\\mathsfsl{c}$',
+u'\U0001d625': '$\\mathsfsl{d}$',
+u'\U0001d626': '$\\mathsfsl{e}$',
+u'\U0001d627': '$\\mathsfsl{f}$',
+u'\U0001d628': '$\\mathsfsl{g}$',
+u'\U0001d629': '$\\mathsfsl{h}$',
+u'\U0001d62a': '$\\mathsfsl{i}$',
+u'\U0001d62b': '$\\mathsfsl{j}$',
+u'\U0001d62c': '$\\mathsfsl{k}$',
+u'\U0001d62d': '$\\mathsfsl{l}$',
+u'\U0001d62e': '$\\mathsfsl{m}$',
+u'\U0001d62f': '$\\mathsfsl{n}$',
+u'\U0001d630': '$\\mathsfsl{o}$',
+u'\U0001d631': '$\\mathsfsl{p}$',
+u'\U0001d632': '$\\mathsfsl{q}$',
+u'\U0001d633': '$\\mathsfsl{r}$',
+u'\U0001d634': '$\\mathsfsl{s}$',
+u'\U0001d635': '$\\mathsfsl{t}$',
+u'\U0001d636': '$\\mathsfsl{u}$',
+u'\U0001d637': '$\\mathsfsl{v}$',
+u'\U0001d638': '$\\mathsfsl{w}$',
+u'\U0001d639': '$\\mathsfsl{x}$',
+u'\U0001d63a': '$\\mathsfsl{y}$',
+u'\U0001d63b': '$\\mathsfsl{z}$',
+u'\U0001d63c': '$\\mathsfbfsl{A}$',
+u'\U0001d63d': '$\\mathsfbfsl{B}$',
+u'\U0001d63e': '$\\mathsfbfsl{C}$',
+u'\U0001d63f': '$\\mathsfbfsl{D}$',
+u'\U0001d640': '$\\mathsfbfsl{E}$',
+u'\U0001d641': '$\\mathsfbfsl{F}$',
+u'\U0001d642': '$\\mathsfbfsl{G}$',
+u'\U0001d643': '$\\mathsfbfsl{H}$',
+u'\U0001d644': '$\\mathsfbfsl{I}$',
+u'\U0001d645': '$\\mathsfbfsl{J}$',
+u'\U0001d646': '$\\mathsfbfsl{K}$',
+u'\U0001d647': '$\\mathsfbfsl{L}$',
+u'\U0001d648': '$\\mathsfbfsl{M}$',
+u'\U0001d649': '$\\mathsfbfsl{N}$',
+u'\U0001d64a': '$\\mathsfbfsl{O}$',
+u'\U0001d64b': '$\\mathsfbfsl{P}$',
+u'\U0001d64c': '$\\mathsfbfsl{Q}$',
+u'\U0001d64d': '$\\mathsfbfsl{R}$',
+u'\U0001d64e': '$\\mathsfbfsl{S}$',
+u'\U0001d64f': '$\\mathsfbfsl{T}$',
+u'\U0001d650': '$\\mathsfbfsl{U}$',
+u'\U0001d651': '$\\mathsfbfsl{V}$',
+u'\U0001d652': '$\\mathsfbfsl{W}$',
+u'\U0001d653': '$\\mathsfbfsl{X}$',
+u'\U0001d654': '$\\mathsfbfsl{Y}$',
+u'\U0001d655': '$\\mathsfbfsl{Z}$',
+u'\U0001d656': '$\\mathsfbfsl{a}$',
+u'\U0001d657': '$\\mathsfbfsl{b}$',
+u'\U0001d658': '$\\mathsfbfsl{c}$',
+u'\U0001d659': '$\\mathsfbfsl{d}$',
+u'\U0001d65a': '$\\mathsfbfsl{e}$',
+u'\U0001d65b': '$\\mathsfbfsl{f}$',
+u'\U0001d65c': '$\\mathsfbfsl{g}$',
+u'\U0001d65d': '$\\mathsfbfsl{h}$',
+u'\U0001d65e': '$\\mathsfbfsl{i}$',
+u'\U0001d65f': '$\\mathsfbfsl{j}$',
+u'\U0001d660': '$\\mathsfbfsl{k}$',
+u'\U0001d661': '$\\mathsfbfsl{l}$',
+u'\U0001d662': '$\\mathsfbfsl{m}$',
+u'\U0001d663': '$\\mathsfbfsl{n}$',
+u'\U0001d664': '$\\mathsfbfsl{o}$',
+u'\U0001d665': '$\\mathsfbfsl{p}$',
+u'\U0001d666': '$\\mathsfbfsl{q}$',
+u'\U0001d667': '$\\mathsfbfsl{r}$',
+u'\U0001d668': '$\\mathsfbfsl{s}$',
+u'\U0001d669': '$\\mathsfbfsl{t}$',
+u'\U0001d66a': '$\\mathsfbfsl{u}$',
+u'\U0001d66b': '$\\mathsfbfsl{v}$',
+u'\U0001d66c': '$\\mathsfbfsl{w}$',
+u'\U0001d66d': '$\\mathsfbfsl{x}$',
+u'\U0001d66e': '$\\mathsfbfsl{y}$',
+u'\U0001d66f': '$\\mathsfbfsl{z}$',
+u'\U0001d670': '$\\mathtt{A}$',
+u'\U0001d671': '$\\mathtt{B}$',
+u'\U0001d672': '$\\mathtt{C}$',
+u'\U0001d673': '$\\mathtt{D}$',
+u'\U0001d674': '$\\mathtt{E}$',
+u'\U0001d675': '$\\mathtt{F}$',
+u'\U0001d676': '$\\mathtt{G}$',
+u'\U0001d677': '$\\mathtt{H}$',
+u'\U0001d678': '$\\mathtt{I}$',
+u'\U0001d679': '$\\mathtt{J}$',
+u'\U0001d67a': '$\\mathtt{K}$',
+u'\U0001d67b': '$\\mathtt{L}$',
+u'\U0001d67c': '$\\mathtt{M}$',
+u'\U0001d67d': '$\\mathtt{N}$',
+u'\U0001d67e': '$\\mathtt{O}$',
+u'\U0001d67f': '$\\mathtt{P}$',
+u'\U0001d680': '$\\mathtt{Q}$',
+u'\U0001d681': '$\\mathtt{R}$',
+u'\U0001d682': '$\\mathtt{S}$',
+u'\U0001d683': '$\\mathtt{T}$',
+u'\U0001d684': '$\\mathtt{U}$',
+u'\U0001d685': '$\\mathtt{V}$',
+u'\U0001d686': '$\\mathtt{W}$',
+u'\U0001d687': '$\\mathtt{X}$',
+u'\U0001d688': '$\\mathtt{Y}$',
+u'\U0001d689': '$\\mathtt{Z}$',
+u'\U0001d68a': '$\\mathtt{a}$',
+u'\U0001d68b': '$\\mathtt{b}$',
+u'\U0001d68c': '$\\mathtt{c}$',
+u'\U0001d68d': '$\\mathtt{d}$',
+u'\U0001d68e': '$\\mathtt{e}$',
+u'\U0001d68f': '$\\mathtt{f}$',
+u'\U0001d690': '$\\mathtt{g}$',
+u'\U0001d691': '$\\mathtt{h}$',
+u'\U0001d692': '$\\mathtt{i}$',
+u'\U0001d693': '$\\mathtt{j}$',
+u'\U0001d694': '$\\mathtt{k}$',
+u'\U0001d695': '$\\mathtt{l}$',
+u'\U0001d696': '$\\mathtt{m}$',
+u'\U0001d697': '$\\mathtt{n}$',
+u'\U0001d698': '$\\mathtt{o}$',
+u'\U0001d699': '$\\mathtt{p}$',
+u'\U0001d69a': '$\\mathtt{q}$',
+u'\U0001d69b': '$\\mathtt{r}$',
+u'\U0001d69c': '$\\mathtt{s}$',
+u'\U0001d69d': '$\\mathtt{t}$',
+u'\U0001d69e': '$\\mathtt{u}$',
+u'\U0001d69f': '$\\mathtt{v}$',
+u'\U0001d6a0': '$\\mathtt{w}$',
+u'\U0001d6a1': '$\\mathtt{x}$',
+u'\U0001d6a2': '$\\mathtt{y}$',
+u'\U0001d6a3': '$\\mathtt{z}$',
+u'\U0001d6a8': '$\\mathbf{\\Alpha}$',
+u'\U0001d6a9': '$\\mathbf{\\Beta}$',
+u'\U0001d6aa': '$\\mathbf{\\Gamma}$',
+u'\U0001d6ab': '$\\mathbf{\\Delta}$',
+u'\U0001d6ac': '$\\mathbf{\\Epsilon}$',
+u'\U0001d6ad': '$\\mathbf{\\Zeta}$',
+u'\U0001d6ae': '$\\mathbf{\\Eta}$',
+u'\U0001d6af': '$\\mathbf{\\Theta}$',
+u'\U0001d6b0': '$\\mathbf{\\Iota}$',
+u'\U0001d6b1': '$\\mathbf{\\Kappa}$',
+u'\U0001d6b2': '$\\mathbf{\\Lambda}$',
+u'\U0001d6b3': '$M$',
+u'\U0001d6b4': '$N$',
+u'\U0001d6b5': '$\\mathbf{\\Xi}$',
+u'\U0001d6b6': '$O$',
+u'\U0001d6b7': '$\\mathbf{\\Pi}$',
+u'\U0001d6b8': '$\\mathbf{\\Rho}$',
+u'\U0001d6b9': '{\\mathbf{\\vartheta}}',
+u'\U0001d6ba': '$\\mathbf{\\Sigma}$',
+u'\U0001d6bb': '$\\mathbf{\\Tau}$',
+u'\U0001d6bc': '$\\mathbf{\\Upsilon}$',
+u'\U0001d6bd': '$\\mathbf{\\Phi}$',
+u'\U0001d6be': '$\\mathbf{\\Chi}$',
+u'\U0001d6bf': '$\\mathbf{\\Psi}$',
+u'\U0001d6c0': '$\\mathbf{\\Omega}$',
+u'\U0001d6c1': '$\\mathbf{\\nabla}$',
+u'\U0001d6c2': '$\\mathbf{\\Alpha}$',
+u'\U0001d6c3': '$\\mathbf{\\Beta}$',
+u'\U0001d6c4': '$\\mathbf{\\Gamma}$',
+u'\U0001d6c5': '$\\mathbf{\\Delta}$',
+u'\U0001d6c6': '$\\mathbf{\\Epsilon}$',
+u'\U0001d6c7': '$\\mathbf{\\Zeta}$',
+u'\U0001d6c8': '$\\mathbf{\\Eta}$',
+u'\U0001d6c9': '$\\mathbf{\\theta}$',
+u'\U0001d6ca': '$\\mathbf{\\Iota}$',
+u'\U0001d6cb': '$\\mathbf{\\Kappa}$',
+u'\U0001d6cc': '$\\mathbf{\\Lambda}$',
+u'\U0001d6cd': '$M$',
+u'\U0001d6ce': '$N$',
+u'\U0001d6cf': '$\\mathbf{\\Xi}$',
+u'\U0001d6d0': '$O$',
+u'\U0001d6d1': '$\\mathbf{\\Pi}$',
+u'\U0001d6d2': '$\\mathbf{\\Rho}$',
+u'\U0001d6d3': '$\\mathbf{\\varsigma}$',
+u'\U0001d6d4': '$\\mathbf{\\Sigma}$',
+u'\U0001d6d5': '$\\mathbf{\\Tau}$',
+u'\U0001d6d6': '$\\mathbf{\\Upsilon}$',
+u'\U0001d6d7': '$\\mathbf{\\Phi}$',
+u'\U0001d6d8': '$\\mathbf{\\Chi}$',
+u'\U0001d6d9': '$\\mathbf{\\Psi}$',
+u'\U0001d6da': '$\\mathbf{\\Omega}$',
+u'\U0001d6db': '$\\partial$',
+u'\U0001d6dc': '$\\in$',
+u'\U0001d6dd': '{\\mathbf{\\vartheta}}',
+u'\U0001d6de': '{\\mathbf{\\varkappa}}',
+u'\U0001d6df': '{\\mathbf{\\phi}}',
+u'\U0001d6e0': '{\\mathbf{\\varrho}}',
+u'\U0001d6e1': '{\\mathbf{\\varpi}}',
+u'\U0001d6e2': '$\\mathsl{\\Alpha}$',
+u'\U0001d6e3': '$\\mathsl{\\Beta}$',
+u'\U0001d6e4': '$\\mathsl{\\Gamma}$',
+u'\U0001d6e5': '$\\mathsl{\\Delta}$',
+u'\U0001d6e6': '$\\mathsl{\\Epsilon}$',
+u'\U0001d6e7': '$\\mathsl{\\Zeta}$',
+u'\U0001d6e8': '$\\mathsl{\\Eta}$',
+u'\U0001d6e9': '$\\mathsl{\\Theta}$',
+u'\U0001d6ea': '$\\mathsl{\\Iota}$',
+u'\U0001d6eb': '$\\mathsl{\\Kappa}$',
+u'\U0001d6ec': '$\\mathsl{\\Lambda}$',
+u'\U0001d6ed': '$M$',
+u'\U0001d6ee': '$N$',
+u'\U0001d6ef': '$\\mathsl{\\Xi}$',
+u'\U0001d6f0': '$O$',
+u'\U0001d6f1': '$\\mathsl{\\Pi}$',
+u'\U0001d6f2': '$\\mathsl{\\Rho}$',
+u'\U0001d6f3': '{\\mathsl{\\vartheta}}',
+u'\U0001d6f4': '$\\mathsl{\\Sigma}$',
+u'\U0001d6f5': '$\\mathsl{\\Tau}$',
+u'\U0001d6f6': '$\\mathsl{\\Upsilon}$',
+u'\U0001d6f7': '$\\mathsl{\\Phi}$',
+u'\U0001d6f8': '$\\mathsl{\\Chi}$',
+u'\U0001d6f9': '$\\mathsl{\\Psi}$',
+u'\U0001d6fa': '$\\mathsl{\\Omega}$',
+u'\U0001d6fb': '$\\mathsl{\\nabla}$',
+u'\U0001d6fc': '$\\mathsl{\\Alpha}$',
+u'\U0001d6fd': '$\\mathsl{\\Beta}$',
+u'\U0001d6fe': '$\\mathsl{\\Gamma}$',
+u'\U0001d6ff': '$\\mathsl{\\Delta}$',
+u'\U0001d700': '$\\mathsl{\\Epsilon}$',
+u'\U0001d701': '$\\mathsl{\\Zeta}$',
+u'\U0001d702': '$\\mathsl{\\Eta}$',
+u'\U0001d703': '$\\mathsl{\\Theta}$',
+u'\U0001d704': '$\\mathsl{\\Iota}$',
+u'\U0001d705': '$\\mathsl{\\Kappa}$',
+u'\U0001d706': '$\\mathsl{\\Lambda}$',
+u'\U0001d707': '$M$',
+u'\U0001d708': '$N$',
+u'\U0001d709': '$\\mathsl{\\Xi}$',
+u'\U0001d70a': '$O$',
+u'\U0001d70b': '$\\mathsl{\\Pi}$',
+u'\U0001d70c': '$\\mathsl{\\Rho}$',
+u'\U0001d70d': '$\\mathsl{\\varsigma}$',
+u'\U0001d70e': '$\\mathsl{\\Sigma}$',
+u'\U0001d70f': '$\\mathsl{\\Tau}$',
+u'\U0001d710': '$\\mathsl{\\Upsilon}$',
+u'\U0001d711': '$\\mathsl{\\Phi}$',
+u'\U0001d712': '$\\mathsl{\\Chi}$',
+u'\U0001d713': '$\\mathsl{\\Psi}$',
+u'\U0001d714': '$\\mathsl{\\Omega}$',
+u'\U0001d715': '$\\partial$',
+u'\U0001d716': '$\\in$',
+u'\U0001d717': '{\\mathsl{\\vartheta}}',
+u'\U0001d718': '{\\mathsl{\\varkappa}}',
+u'\U0001d719': '{\\mathsl{\\phi}}',
+u'\U0001d71a': '{\\mathsl{\\varrho}}',
+u'\U0001d71b': '{\\mathsl{\\varpi}}',
+u'\U0001d71c': '$\\mathbit{\\Alpha}$',
+u'\U0001d71d': '$\\mathbit{\\Beta}$',
+u'\U0001d71e': '$\\mathbit{\\Gamma}$',
+u'\U0001d71f': '$\\mathbit{\\Delta}$',
+u'\U0001d720': '$\\mathbit{\\Epsilon}$',
+u'\U0001d721': '$\\mathbit{\\Zeta}$',
+u'\U0001d722': '$\\mathbit{\\Eta}$',
+u'\U0001d723': '$\\mathbit{\\Theta}$',
+u'\U0001d724': '$\\mathbit{\\Iota}$',
+u'\U0001d725': '$\\mathbit{\\Kappa}$',
+u'\U0001d726': '$\\mathbit{\\Lambda}$',
+u'\U0001d727': '$M$',
+u'\U0001d728': '$N$',
+u'\U0001d729': '$\\mathbit{\\Xi}$',
+u'\U0001d72a': '$O$',
+u'\U0001d72b': '$\\mathbit{\\Pi}$',
+u'\U0001d72c': '$\\mathbit{\\Rho}$',
+u'\U0001d72d': '{\\mathbit{O}}',
+u'\U0001d72e': '$\\mathbit{\\Sigma}$',
+u'\U0001d72f': '$\\mathbit{\\Tau}$',
+u'\U0001d730': '$\\mathbit{\\Upsilon}$',
+u'\U0001d731': '$\\mathbit{\\Phi}$',
+u'\U0001d732': '$\\mathbit{\\Chi}$',
+u'\U0001d733': '$\\mathbit{\\Psi}$',
+u'\U0001d734': '$\\mathbit{\\Omega}$',
+u'\U0001d735': '$\\mathbit{\\nabla}$',
+u'\U0001d736': '$\\mathbit{\\Alpha}$',
+u'\U0001d737': '$\\mathbit{\\Beta}$',
+u'\U0001d738': '$\\mathbit{\\Gamma}$',
+u'\U0001d739': '$\\mathbit{\\Delta}$',
+u'\U0001d73a': '$\\mathbit{\\Epsilon}$',
+u'\U0001d73b': '$\\mathbit{\\Zeta}$',
+u'\U0001d73c': '$\\mathbit{\\Eta}$',
+u'\U0001d73d': '$\\mathbit{\\Theta}$',
+u'\U0001d73e': '$\\mathbit{\\Iota}$',
+u'\U0001d73f': '$\\mathbit{\\Kappa}$',
+u'\U0001d740': '$\\mathbit{\\Lambda}$',
+u'\U0001d741': '$M$',
+u'\U0001d742': '$N$',
+u'\U0001d743': '$\\mathbit{\\Xi}$',
+u'\U0001d744': '$O$',
+u'\U0001d745': '$\\mathbit{\\Pi}$',
+u'\U0001d746': '$\\mathbit{\\Rho}$',
+u'\U0001d747': '$\\mathbit{\\varsigma}$',
+u'\U0001d748': '$\\mathbit{\\Sigma}$',
+u'\U0001d749': '$\\mathbit{\\Tau}$',
+u'\U0001d74a': '$\\mathbit{\\Upsilon}$',
+u'\U0001d74b': '$\\mathbit{\\Phi}$',
+u'\U0001d74c': '$\\mathbit{\\Chi}$',
+u'\U0001d74d': '$\\mathbit{\\Psi}$',
+u'\U0001d74e': '$\\mathbit{\\Omega}$',
+u'\U0001d74f': '$\\partial$',
+u'\U0001d750': '$\\in$',
+u'\U0001d751': '{\\mathbit{\\vartheta}}',
+u'\U0001d752': '{\\mathbit{\\varkappa}}',
+u'\U0001d753': '{\\mathbit{\\phi}}',
+u'\U0001d754': '{\\mathbit{\\varrho}}',
+u'\U0001d755': '{\\mathbit{\\varpi}}',
+u'\U0001d756': '$\\mathsfbf{\\Alpha}$',
+u'\U0001d757': '$\\mathsfbf{\\Beta}$',
+u'\U0001d758': '$\\mathsfbf{\\Gamma}$',
+u'\U0001d759': '$\\mathsfbf{\\Delta}$',
+u'\U0001d75a': '$\\mathsfbf{\\Epsilon}$',
+u'\U0001d75b': '$\\mathsfbf{\\Zeta}$',
+u'\U0001d75c': '$\\mathsfbf{\\Eta}$',
+u'\U0001d75d': '$\\mathsfbf{\\Theta}$',
+u'\U0001d75e': '$\\mathsfbf{\\Iota}$',
+u'\U0001d75f': '$\\mathsfbf{\\Kappa}$',
+u'\U0001d760': '$\\mathsfbf{\\Lambda}$',
+u'\U0001d761': '$M$',
+u'\U0001d762': '$N$',
+u'\U0001d763': '$\\mathsfbf{\\Xi}$',
+u'\U0001d764': '$O$',
+u'\U0001d765': '$\\mathsfbf{\\Pi}$',
+u'\U0001d766': '$\\mathsfbf{\\Rho}$',
+u'\U0001d767': '{\\mathsfbf{\\vartheta}}',
+u'\U0001d768': '$\\mathsfbf{\\Sigma}$',
+u'\U0001d769': '$\\mathsfbf{\\Tau}$',
+u'\U0001d76a': '$\\mathsfbf{\\Upsilon}$',
+u'\U0001d76b': '$\\mathsfbf{\\Phi}$',
+u'\U0001d76c': '$\\mathsfbf{\\Chi}$',
+u'\U0001d76d': '$\\mathsfbf{\\Psi}$',
+u'\U0001d76e': '$\\mathsfbf{\\Omega}$',
+u'\U0001d76f': '$\\mathsfbf{\\nabla}$',
+u'\U0001d770': '$\\mathsfbf{\\Alpha}$',
+u'\U0001d771': '$\\mathsfbf{\\Beta}$',
+u'\U0001d772': '$\\mathsfbf{\\Gamma}$',
+u'\U0001d773': '$\\mathsfbf{\\Delta}$',
+u'\U0001d774': '$\\mathsfbf{\\Epsilon}$',
+u'\U0001d775': '$\\mathsfbf{\\Zeta}$',
+u'\U0001d776': '$\\mathsfbf{\\Eta}$',
+u'\U0001d777': '$\\mathsfbf{\\Theta}$',
+u'\U0001d778': '$\\mathsfbf{\\Iota}$',
+u'\U0001d779': '$\\mathsfbf{\\Kappa}$',
+u'\U0001d77a': '$\\mathsfbf{\\Lambda}$',
+u'\U0001d77b': '$M$',
+u'\U0001d77c': '$N$',
+u'\U0001d77d': '$\\mathsfbf{\\Xi}$',
+u'\U0001d77e': '$O$',
+u'\U0001d77f': '$\\mathsfbf{\\Pi}$',
+u'\U0001d780': '$\\mathsfbf{\\Rho}$',
+u'\U0001d781': '$\\mathsfbf{\\varsigma}$',
+u'\U0001d782': '$\\mathsfbf{\\Sigma}$',
+u'\U0001d783': '$\\mathsfbf{\\Tau}$',
+u'\U0001d784': '$\\mathsfbf{\\Upsilon}$',
+u'\U0001d785': '$\\mathsfbf{\\Phi}$',
+u'\U0001d786': '$\\mathsfbf{\\Chi}$',
+u'\U0001d787': '$\\mathsfbf{\\Psi}$',
+u'\U0001d788': '$\\mathsfbf{\\Omega}$',
+u'\U0001d789': '$\\partial$',
+u'\U0001d78a': '$\\in$',
+u'\U0001d78b': '{\\mathsfbf{\\vartheta}}',
+u'\U0001d78c': '{\\mathsfbf{\\varkappa}}',
+u'\U0001d78d': '{\\mathsfbf{\\phi}}',
+u'\U0001d78e': '{\\mathsfbf{\\varrho}}',
+u'\U0001d78f': '{\\mathsfbf{\\varpi}}',
+u'\U0001d790': '$\\mathsfbfsl{\\Alpha}$',
+u'\U0001d791': '$\\mathsfbfsl{\\Beta}$',
+u'\U0001d792': '$\\mathsfbfsl{\\Gamma}$',
+u'\U0001d793': '$\\mathsfbfsl{\\Delta}$',
+u'\U0001d794': '$\\mathsfbfsl{\\Epsilon}$',
+u'\U0001d795': '$\\mathsfbfsl{\\Zeta}$',
+u'\U0001d796': '$\\mathsfbfsl{\\Eta}$',
+u'\U0001d797': '$\\mathsfbfsl{\\vartheta}$',
+u'\U0001d798': '$\\mathsfbfsl{\\Iota}$',
+u'\U0001d799': '$\\mathsfbfsl{\\Kappa}$',
+u'\U0001d79a': '$\\mathsfbfsl{\\Lambda}$',
+u'\U0001d79b': '$M$',
+u'\U0001d79c': '$N$',
+u'\U0001d79d': '$\\mathsfbfsl{\\Xi}$',
+u'\U0001d79e': '$O$',
+u'\U0001d79f': '$\\mathsfbfsl{\\Pi}$',
+u'\U0001d7a0': '$\\mathsfbfsl{\\Rho}$',
+u'\U0001d7a1': '{\\mathsfbfsl{\\vartheta}}',
+u'\U0001d7a2': '$\\mathsfbfsl{\\Sigma}$',
+u'\U0001d7a3': '$\\mathsfbfsl{\\Tau}$',
+u'\U0001d7a4': '$\\mathsfbfsl{\\Upsilon}$',
+u'\U0001d7a5': '$\\mathsfbfsl{\\Phi}$',
+u'\U0001d7a6': '$\\mathsfbfsl{\\Chi}$',
+u'\U0001d7a7': '$\\mathsfbfsl{\\Psi}$',
+u'\U0001d7a8': '$\\mathsfbfsl{\\Omega}$',
+u'\U0001d7a9': '$\\mathsfbfsl{\\nabla}$',
+u'\U0001d7aa': '$\\mathsfbfsl{\\Alpha}$',
+u'\U0001d7ab': '$\\mathsfbfsl{\\Beta}$',
+u'\U0001d7ac': '$\\mathsfbfsl{\\Gamma}$',
+u'\U0001d7ad': '$\\mathsfbfsl{\\Delta}$',
+u'\U0001d7ae': '$\\mathsfbfsl{\\Epsilon}$',
+u'\U0001d7af': '$\\mathsfbfsl{\\Zeta}$',
+u'\U0001d7b0': '$\\mathsfbfsl{\\Eta}$',
+u'\U0001d7b1': '$\\mathsfbfsl{\\vartheta}$',
+u'\U0001d7b2': '$\\mathsfbfsl{\\Iota}$',
+u'\U0001d7b3': '$\\mathsfbfsl{\\Kappa}$',
+u'\U0001d7b4': '$\\mathsfbfsl{\\Lambda}$',
+u'\U0001d7b5': '$M$',
+u'\U0001d7b6': '$N$',
+u'\U0001d7b7': '$\\mathsfbfsl{\\Xi}$',
+u'\U0001d7b8': '$O$',
+u'\U0001d7b9': '$\\mathsfbfsl{\\Pi}$',
+u'\U0001d7ba': '$\\mathsfbfsl{\\Rho}$',
+u'\U0001d7bb': '$\\mathsfbfsl{\\varsigma}$',
+u'\U0001d7bc': '$\\mathsfbfsl{\\Sigma}$',
+u'\U0001d7bd': '$\\mathsfbfsl{\\Tau}$',
+u'\U0001d7be': '$\\mathsfbfsl{\\Upsilon}$',
+u'\U0001d7bf': '$\\mathsfbfsl{\\Phi}$',
+u'\U0001d7c0': '$\\mathsfbfsl{\\Chi}$',
+u'\U0001d7c1': '$\\mathsfbfsl{\\Psi}$',
+u'\U0001d7c2': '$\\mathsfbfsl{\\Omega}$',
+u'\U0001d7c3': '$\\partial$',
+u'\U0001d7c4': '$\\in$',
+u'\U0001d7c5': '{\\mathsfbfsl{\\vartheta}}',
+u'\U0001d7c6': '{\\mathsfbfsl{\\varkappa}}',
+u'\U0001d7c7': '{\\mathsfbfsl{\\phi}}',
+u'\U0001d7c8': '{\\mathsfbfsl{\\varrho}}',
+u'\U0001d7c9': '{\\mathsfbfsl{\\varpi}}',
+u'\U0001d7ce': '$\\mathbf{0}$',
+u'\U0001d7cf': '$\\mathbf{1}$',
+u'\U0001d7d0': '$\\mathbf{2}$',
+u'\U0001d7d1': '$\\mathbf{3}$',
+u'\U0001d7d2': '$\\mathbf{4}$',
+u'\U0001d7d3': '$\\mathbf{5}$',
+u'\U0001d7d4': '$\\mathbf{6}$',
+u'\U0001d7d5': '$\\mathbf{7}$',
+u'\U0001d7d6': '$\\mathbf{8}$',
+u'\U0001d7d7': '$\\mathbf{9}$',
+u'\U0001d7d8': '$\\mathbb{0}$',
+u'\U0001d7d9': '$\\mathbb{1}$',
+u'\U0001d7da': '$\\mathbb{2}$',
+u'\U0001d7db': '$\\mathbb{3}$',
+u'\U0001d7dc': '$\\mathbb{4}$',
+u'\U0001d7dd': '$\\mathbb{5}$',
+u'\U0001d7de': '$\\mathbb{6}$',
+u'\U0001d7df': '$\\mathbb{7}$',
+u'\U0001d7e0': '$\\mathbb{8}$',
+u'\U0001d7e1': '$\\mathbb{9}$',
+u'\U0001d7e2': '$\\mathsf{0}$',
+u'\U0001d7e3': '$\\mathsf{1}$',
+u'\U0001d7e4': '$\\mathsf{2}$',
+u'\U0001d7e5': '$\\mathsf{3}$',
+u'\U0001d7e6': '$\\mathsf{4}$',
+u'\U0001d7e7': '$\\mathsf{5}$',
+u'\U0001d7e8': '$\\mathsf{6}$',
+u'\U0001d7e9': '$\\mathsf{7}$',
+u'\U0001d7ea': '$\\mathsf{8}$',
+u'\U0001d7eb': '$\\mathsf{9}$',
+u'\U0001d7ec': '$\\mathsfbf{0}$',
+u'\U0001d7ed': '$\\mathsfbf{1}$',
+u'\U0001d7ee': '$\\mathsfbf{2}$',
+u'\U0001d7ef': '$\\mathsfbf{3}$',
+u'\U0001d7f0': '$\\mathsfbf{4}$',
+u'\U0001d7f1': '$\\mathsfbf{5}$',
+u'\U0001d7f2': '$\\mathsfbf{6}$',
+u'\U0001d7f3': '$\\mathsfbf{7}$',
+u'\U0001d7f4': '$\\mathsfbf{8}$',
+u'\U0001d7f5': '$\\mathsfbf{9}$',
+u'\U0001d7f6': '$\\mathtt{0}$',
+u'\U0001d7f7': '$\\mathtt{1}$',
+u'\U0001d7f8': '$\\mathtt{2}$',
+u'\U0001d7f9': '$\\mathtt{3}$',
+u'\U0001d7fa': '$\\mathtt{4}$',
+u'\U0001d7fb': '$\\mathtt{5}$',
+u'\U0001d7fc': '$\\mathtt{6}$',
+u'\U0001d7fd': '$\\mathtt{7}$',
+u'\U0001d7fe': '$\\mathtt{8}$',
+u'\U0001d7ff': '$\\mathtt{9}$'}
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/examples.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/examples.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/examples.py (revision 3)
@@ -0,0 +1,94 @@
+# Authors: David Goodger
+# Contact: goodger@python.org
+# Revision: $Revision: 3598 $
+# Date: $Date: 2005-06-27 13:19:35 +0200 (Mon, 27 Jun 2005) $
+# Copyright: This module has been placed in the public domain.
+
+"""
+This module contains practical examples of Docutils client code.
+
+Importing this module from client code is not recommended; its contents are
+subject to change in future Docutils releases.  Instead, it is recommended
+that you copy and paste the parts you need into your own code, modifying as
+necessary.
+"""
+
+from docutils import core, io
+
+
+def html_parts(input_string, source_path=None, destination_path=None,
+               input_encoding='unicode', doctitle=1, initial_header_level=1):
+    """
+    Given an input string, returns a dictionary of HTML document parts.
+
+    Dictionary keys are the names of parts, and values are Unicode strings;
+    encoding is up to the client.
+
+    Parameters:
+
+    - `input_string`: A multi-line text string; required.
+    - `source_path`: Path to the source file or object.  Optional, but useful
+      for diagnostic output (system messages).
+    - `destination_path`: Path to the file or object which will receive the
+      output; optional.  Used for determining relative paths (stylesheets,
+      source links, etc.).
+    - `input_encoding`: The encoding of `input_string`.  If it is an encoded
+      8-bit string, provide the correct encoding.  If it is a Unicode string,
+      use "unicode", the default.
+    - `doctitle`: Disable the promotion of a lone top-level section title to
+      document title (and subsequent section title to document subtitle
+      promotion); enabled by default.
+    - `initial_header_level`: The initial level for header elements (e.g. 1
+      for "<h1>").
+    """
+    overrides = {'input_encoding': input_encoding,
+                 'doctitle_xform': doctitle,
+                 'initial_header_level': initial_header_level}
+    parts = core.publish_parts(
+        source=input_string, source_path=source_path,
+        destination_path=destination_path,
+        writer_name='html', settings_overrides=overrides)
+    return parts
+
+def html_body(input_string, source_path=None, destination_path=None,
+              input_encoding='unicode', output_encoding='unicode',
+              doctitle=1, initial_header_level=1):
+    """
+    Given an input string, returns an HTML fragment as a string.
+
+    The return value is the contents of the <body> element.
+
+    Parameters (see `html_parts()` for the remainder):
+
+    - `output_encoding`: The desired encoding of the output.  If a Unicode
+      string is desired, use the default value of "unicode" .
+    """
+    parts = html_parts(
+        input_string=input_string, source_path=source_path,
+        destination_path=destination_path,
+        input_encoding=input_encoding, doctitle=doctitle,
+        initial_header_level=initial_header_level)
+    fragment = parts['html_body']
+    if output_encoding != 'unicode':
+        fragment = fragment.encode(output_encoding)
+    return fragment
+
+def internals(input_string, source_path=None, destination_path=None,
+              input_encoding='unicode'):
+    """
+    Return the document tree and publisher, for exploring Docutils internals.
+
+    Parameters: see `html_parts()`.
+    """
+    overrides = {'input_encoding': input_encoding}
+    output, pub = core.publish_programmatically(
+        source_class=io.StringInput, source=input_string,
+        source_path=source_path,
+        destination_class=io.NullOutput, destination=None,
+        destination_path=destination_path,
+        reader=None, reader_name='standalone',
+        parser=None, parser_name='restructuredtext',
+        writer=None, writer_name='null',
+        settings=None, settings_spec=None, settings_overrides=overrides,
+        config_section=None, enable_exit_status=None)
+    return pub.writer.document, pub
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/readers/standalone.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/readers/standalone.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/readers/standalone.py (revision 3)
@@ -0,0 +1,69 @@
+# Author: David Goodger
+# Contact: goodger@users.sourceforge.net
+# Revision: $Revision: 3892 $
+# Date: $Date: 2005-09-20 22:04:53 +0200 (Tue, 20 Sep 2005) $
+# Copyright: This module has been placed in the public domain.
+
+"""
+Standalone file Reader for the reStructuredText markup syntax.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import sys
+from docutils import frontend, readers
+from docutils.transforms import frontmatter, references, misc
+
+
+class Reader(readers.Reader):
+
+    supported = ('standalone',)
+    """Contexts this reader supports."""
+
+    document = None
+    """A single document tree."""
+
+    settings_spec = (
+        'Standalone Reader',
+        None,
+        (('Disable the promotion of a lone top-level section title to '
+          'document title (and subsequent section title to document '
+          'subtitle promotion; enabled by default).',
+          ['--no-doc-title'],
+          {'dest': 'doctitle_xform', 'action': 'store_false', 'default': 1,
+           'validator': frontend.validate_boolean}),
+         ('Disable the bibliographic field list transform (enabled by '
+          'default).',
+          ['--no-doc-info'],
+          {'dest': 'docinfo_xform', 'action': 'store_false', 'default': 1,
+           'validator': frontend.validate_boolean}),
+         ('Activate the promotion of lone subsection titles to '
+          'section subtitles (disabled by default).',
+          ['--section-subtitles'],
+          {'dest': 'sectsubtitle_xform', 'action': 'store_true', 'default': 0,
+           'validator': frontend.validate_boolean}),
+         ('Deactivate the promotion of lone subsection titles.',
+          ['--no-section-subtitles'],
+          {'dest': 'sectsubtitle_xform', 'action': 'store_false',
+           'validator': frontend.validate_boolean}),
+         ))
+
+    config_section = 'standalone reader'
+    config_section_dependencies = ('readers',)
+
+    def get_transforms(self):
+        return readers.Reader.get_transforms(self) + [
+            references.Substitutions,
+            references.PropagateTargets,
+            frontmatter.DocTitle,
+            frontmatter.SectionSubTitle,
+            frontmatter.DocInfo,
+            references.AnonymousHyperlinks,
+            references.IndirectHyperlinks,
+            references.Footnotes,
+            references.ExternalTargets,
+            references.InternalTargets,
+            references.DanglingReferences,
+            misc.Transitions,
+            ]
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/readers/python/__init__.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/readers/python/__init__.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/readers/python/__init__.py (revision 3)
@@ -0,0 +1,132 @@
+# Author: David Goodger
+# Contact: goodger@users.sourceforge.net
+# Revision: $Revision: 3038 $
+# Date: $Date: 2005-03-14 17:16:57 +0100 (Mon, 14 Mar 2005) $
+# Copyright: This module has been placed in the public domain.
+
+"""
+This package contains the Python Source Reader modules.
+
+It requires Python 2.2 or higher (`moduleparser` depends on the
+`compiler` and `tokenize` modules).
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import sys
+import docutils.readers
+from docutils.readers.python import moduleparser
+from docutils import parsers
+from docutils import nodes
+from docutils.readers.python import pynodes
+from docutils import readers
+
+class Reader(docutils.readers.Reader):
+
+    config_section = 'python reader'
+    config_section_dependencies = ('readers',)
+
+    default_parser = 'restructuredtext'
+
+    def parse(self):
+        """Parse `self.input` into a document tree."""
+        self.document = document = self.new_document()
+        module_section = moduleparser.parse_module(self.input,
+                                                   self.source.source_path)
+        module_section.walk(DocformatVisitor(self.document))
+        visitor = DocstringFormattingVisitor(
+            document=document,
+            default_parser=self.default_parser)
+        module_section.walk(visitor)
+        self.document.append(module_section)
+
+
+class DocformatVisitor(nodes.SparseNodeVisitor):
+
+    """
+    This sets docformat attributes in a module.  Wherever an assignment
+    to __docformat__ is found, we look for the enclosing scope -- a class,
+    a module, or a function -- and set the docformat attribute there.
+
+    We can't do this during the DocstringFormattingVisitor walking,
+    because __docformat__ may appear below a docstring in that format
+    (typically below the module docstring).
+    """
+
+    def visit_attribute(self, node):
+        assert isinstance(node[0], pynodes.object_name)
+        name = node[0][0].data
+        if name != '__docformat__':
+            return
+        value = None
+        for child in children:
+            if isinstance(child, pynodes.expression_value):
+                value = child[0].data
+                break
+        assert value.startswith("'") or value.startswith('"'), "__docformat__ must be assigned a string literal (not %s); line: %s" % (value, node['lineno'])
+        name = name[1:-1]
+        looking_in = node.parent
+        while not isinstance(looking_in, (pynodes.module_section,
+                                          pynodes.function_section,
+                                          pynodes.class_section)):
+            looking_in = looking_in.parent
+        looking_in['docformat'] = name
+
+
+class DocstringFormattingVisitor(nodes.SparseNodeVisitor):
+
+    def __init__(self, document, default_parser):
+        self.document = document
+        self.default_parser = default_parser
+        self.parsers = {}
+
+    def visit_docstring(self, node):
+        text = node[0].data
+        docformat = self.find_docformat(node)
+        del node[0]
+        node['docformat'] = docformat
+        parser = self.get_parser(docformat)
+        parser.parse(text, self.document)
+        for child in self.document.children:
+            node.append(child)
+        self.document.current_source = self.document.current_line = None
+        del self.document[:]
+
+    def get_parser(self, parser_name):
+        """
+        Get a parser based on its name.  We reuse parsers during this
+        visitation, so parser instances are cached.
+        """
+        parser_name = parsers._parser_aliases.get(parser_name, parser_name)
+        if not self.parsers.has_key(parser_name):
+            cls = parsers.get_parser_class(parser_name)
+            self.parsers[parser_name] = cls()
+        return self.parsers[parser_name]
+
+    def find_docformat(self, node):
+        """
+        Find the __docformat__ closest to this node (i.e., look in the
+        class or module)
+        """
+        while node:
+            if node.get('docformat'):
+                return node['docformat']
+            node = node.parent
+        return self.default_parser
+
+
+if __name__ == '__main__':
+    try:
+        import locale
+        locale.setlocale(locale.LC_ALL, '')
+    except:
+        pass
+
+    from docutils.core import publish_cmdline, default_description
+
+    description = ('Generates pseudo-XML from Python modules '
+                   '(for testing purposes).  ' + default_description)
+
+    publish_cmdline(description=description,
+                    reader=Reader())
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/readers/python/pynodes.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/readers/python/pynodes.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/readers/python/pynodes.py (revision 3)
@@ -0,0 +1,87 @@
+#! /usr/bin/env python
+
+"""
+:Author: David Goodger
+:Contact: goodger@users.sourceforge.net
+:Revision: $Revision: 1881 $
+:Date: $Date: 2004-03-24 00:21:11 +0100 (Wed, 24 Mar 2004) $
+:Copyright: This module has been placed in the public domain.
+
+"""
+
+from docutils import nodes
+from docutils.nodes import Element, TextElement, Structural, Inline, Part, \
+     Text
+import types
+
+# This is the parent class of all the other pynode classes:
+class PythonStructural(Structural): pass
+
+# =====================
+#  Structural Elements
+# =====================
+
+class module_section(PythonStructural, Element): pass    
+class class_section(PythonStructural, Element): pass
+class class_base(PythonStructural, Element): pass
+class method_section(PythonStructural, Element): pass
+class attribute(PythonStructural, Element): pass
+class function_section(PythonStructural, Element): pass
+class class_attribute_section(PythonStructural, Element): pass
+class class_attribute(PythonStructural, Element): pass
+class expression_value(PythonStructural, Element): pass
+class attribute(PythonStructural, Element): pass
+
+# Structural Support Elements
+# ---------------------------
+
+class parameter_list(PythonStructural, Element): pass
+class parameter_tuple(PythonStructural, Element): pass
+class parameter_default(PythonStructural, TextElement): pass
+class import_group(PythonStructural, TextElement): pass
+class import_from(PythonStructural, TextElement): pass
+class import_name(PythonStructural, TextElement): pass
+class import_alias(PythonStructural, TextElement): pass
+class docstring(PythonStructural, Element): pass
+
+# =================
+#  Inline Elements
+# =================
+
+# These elements cannot become references until the second
+# pass.  Initially, we'll use "reference" or "name".
+
+class object_name(PythonStructural, TextElement): pass
+class parameter_list(PythonStructural, TextElement): pass
+class parameter(PythonStructural, TextElement): pass
+class parameter_default(PythonStructural, TextElement): pass
+class class_attribute(PythonStructural, TextElement): pass
+class attribute_tuple(PythonStructural, TextElement): pass
+
+# =================
+#  Unused Elements
+# =================
+
+# These were part of the model, and maybe should be in the future, but
+# aren't now.
+#class package_section(PythonStructural, Element): pass
+#class module_attribute_section(PythonStructural, Element): pass
+#class instance_attribute_section(PythonStructural, Element): pass
+#class module_attribute(PythonStructural, TextElement): pass
+#class instance_attribute(PythonStructural, TextElement): pass
+#class exception_class(PythonStructural, TextElement): pass
+#class warning_class(PythonStructural, TextElement): pass
+
+
+# Collect all the classes we've written above
+def install_node_class_names():
+    node_class_names = []
+    for name, var in globals().items():
+        if (type(var) is types.ClassType
+            and issubclass(var, PythonStructural) \
+            and name.lower() == name):
+            node_class_names.append(var.tagname or name)
+    # Register the new node names with GenericNodeVisitor and
+    # SpecificNodeVisitor:
+    nodes._add_node_class_names(node_class_names)
+install_node_class_names()
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/readers/python/moduleparser.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/readers/python/moduleparser.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/readers/python/moduleparser.py (revision 3)
@@ -0,0 +1,760 @@
+# Author: David Goodger
+# Contact: goodger@users.sourceforge.net
+# Revision: $Revision: 4242 $
+# Date: $Date: 2006-01-06 00:28:53 +0100 (Fri, 06 Jan 2006) $
+# Copyright: This module has been placed in the public domain.
+
+"""
+Parser for Python modules.  Requires Python 2.2 or higher.
+
+The `parse_module()` function takes a module's text and file name,
+runs it through the module parser (using compiler.py and tokenize.py)
+and produces a parse tree of the source code, using the nodes as found
+in pynodes.py.  For example, given this module (x.py)::
+
+    # comment
+
+    '''Docstring'''
+
+    '''Additional docstring'''
+
+    __docformat__ = 'reStructuredText'
+
+    a = 1
+    '''Attribute docstring'''
+
+    class C(Super):
+
+        '''C's docstring'''
+
+        class_attribute = 1
+        '''class_attribute's docstring'''
+
+        def __init__(self, text=None):
+            '''__init__'s docstring'''
+
+            self.instance_attribute = (text * 7
+                                       + ' whaddyaknow')
+            '''instance_attribute's docstring'''
+
+
+    def f(x,                            # parameter x
+          y=a*5,                        # parameter y
+          *args):                       # parameter args
+        '''f's docstring'''
+        return [x + item for item in args]
+
+    f.function_attribute = 1
+    '''f.function_attribute's docstring'''
+
+The module parser will produce this module documentation tree::
+
+    <module_section filename="test data">
+        <docstring>
+            Docstring
+        <docstring lineno="5">
+            Additional docstring
+        <attribute lineno="7">
+	    <object_name>
+	        __docformat__
+            <expression_value lineno="7">
+                'reStructuredText'
+        <attribute lineno="9">
+	    <object_name>
+	        a
+            <expression_value lineno="9">
+                1
+            <docstring lineno="10">
+                Attribute docstring
+        <class_section lineno="12">
+	    <object_name>
+	        C
+            <class_base>
+	        Super
+            <docstring lineno="12">
+                C's docstring
+            <attribute lineno="16">
+	        <object_name>
+		    class_attribute
+                <expression_value lineno="16">
+                    1
+                <docstring lineno="17">
+                    class_attribute's docstring
+            <method_section lineno="19">
+	        <object_name>
+		    __init__
+                <docstring lineno="19">
+                    __init__'s docstring
+                <parameter_list lineno="19">
+                    <parameter lineno="19">
+		        <object_name>
+			    self
+                    <parameter lineno="19">
+		        <object_name>
+			    text
+                        <parameter_default lineno="19">
+                            None
+                <attribute lineno="22">
+		    <object_name>
+		        self.instance_attribute
+                    <expression_value lineno="22">
+                        (text * 7 + ' whaddyaknow')
+                    <docstring lineno="24">
+                        instance_attribute's docstring
+        <function_section lineno="27">
+	    <object_name>
+	        f
+            <docstring lineno="27">
+                f's docstring
+            <parameter_list lineno="27">
+                <parameter lineno="27">
+		    <object_name>
+		        x
+                    <comment>
+                        # parameter x
+                <parameter lineno="27">
+		    <object_name>
+		        y
+                    <parameter_default lineno="27">
+                        a * 5
+                    <comment>
+                        # parameter y
+                <parameter excess_positional="1" lineno="27">
+		    <object_name>
+		        args
+                    <comment>
+                        # parameter args
+        <attribute lineno="33">
+	    <object_name>
+	        f.function_attribute
+            <expression_value lineno="33">
+                1
+            <docstring lineno="34">
+                f.function_attribute's docstring
+
+(Comments are not implemented yet.)
+
+compiler.parse() provides most of what's needed for this doctree, and
+"tokenize" can be used to get the rest.  We can determine the line
+number from the compiler.parse() AST, and the TokenParser.rhs(lineno)
+method provides the rest.
+
+The Docutils Python reader component will transform this module doctree into a
+Python-specific Docutils doctree, and then a "stylist transform" will
+further transform it into a generic doctree.  Namespaces will have to be
+compiled for each of the scopes, but I'm not certain at what stage of
+processing.
+
+It's very important to keep all docstring processing out of this, so that it's
+a completely generic and not tool-specific.
+
+::
+
+> Why perform all of those transformations?  Why not go from the AST to a
+> generic doctree?  Or, even from the AST to the final output?
+
+I want the docutils.readers.python.moduleparser.parse_module() function to
+produce a standard documentation-oriented tree that can be used by any tool.
+We can develop it together without having to compromise on the rest of our
+design (i.e., HappyDoc doesn't have to be made to work like Docutils, and
+vice-versa).  It would be a higher-level version of what compiler.py provides.
+
+The Python reader component transforms this generic AST into a Python-specific
+doctree (it knows about modules, classes, functions, etc.), but this is
+specific to Docutils and cannot be used by HappyDoc or others.  The stylist
+transform does the final layout, converting Python-specific structures
+("class" sections, etc.) into a generic doctree using primitives (tables,
+sections, lists, etc.).  This generic doctree does *not* know about Python
+structures any more.  The advantage is that this doctree can be handed off to
+any of the output writers to create any output format we like.
+
+The latter two transforms are separate because I want to be able to have
+multiple independent layout styles (multiple runtime-selectable "stylist
+transforms").  Each of the existing tools (HappyDoc, pydoc, epydoc, Crystal,
+etc.) has its own fixed format.  I personally don't like the tables-based
+format produced by these tools, and I'd like to be able to customize the
+format easily.  That's the goal of stylist transforms, which are independent
+from the Reader component itself.  One stylist transform could produce
+HappyDoc-like output, another could produce output similar to module docs in
+the Python library reference manual, and so on.
+
+It's for exactly this reason::
+
+>> It's very important to keep all docstring processing out of this, so that
+>> it's a completely generic and not tool-specific.
+
+... but it goes past docstring processing.  It's also important to keep style
+decisions and tool-specific data transforms out of this module parser.
+
+
+Issues
+======
+
+* At what point should namespaces be computed?  Should they be part of the
+  basic AST produced by the ASTVisitor walk, or generated by another tree
+  traversal?
+
+* At what point should a distinction be made between local variables &
+  instance attributes in __init__ methods?
+
+* Docstrings are getting their lineno from their parents.  Should the
+  TokenParser find the real line no's?
+
+* Comments: include them?  How and when?  Only full-line comments, or
+  parameter comments too?  (See function "f" above for an example.)
+
+* Module could use more docstrings & refactoring in places.
+
+"""
+
+__docformat__ = 'reStructuredText'
+
+import sys
+import compiler
+import compiler.ast
+import tokenize
+import token
+from compiler.consts import OP_ASSIGN
+from compiler.visitor import ASTVisitor
+from types import StringType, UnicodeType, TupleType
+from docutils.readers.python import pynodes
+from docutils.nodes import Text
+
+
+def parse_module(module_text, filename):
+    """Return a module documentation tree from `module_text`."""
+    ast = compiler.parse(module_text)
+    token_parser = TokenParser(module_text)
+    visitor = ModuleVisitor(filename, token_parser)
+    compiler.walk(ast, visitor, walker=visitor)
+    return visitor.module
+
+class BaseVisitor(ASTVisitor):
+
+    def __init__(self, token_parser):
+        ASTVisitor.__init__(self)
+        self.token_parser = token_parser
+        self.context = []
+        self.documentable = None
+
+    def default(self, node, *args):
+        self.documentable = None
+        #print 'in default (%s)' % node.__class__.__name__
+        #ASTVisitor.default(self, node, *args)
+
+    def default_visit(self, node, *args):
+        #print 'in default_visit (%s)' % node.__class__.__name__
+        ASTVisitor.default(self, node, *args)
+
+
+class DocstringVisitor(BaseVisitor):
+
+    def visitDiscard(self, node):
+        if self.documentable:
+            self.visit(node.expr)
+
+    def visitConst(self, node):
+        if self.documentable:
+            if type(node.value) in (StringType, UnicodeType):
+                self.documentable.append(make_docstring(node.value, node.lineno))
+            else:
+                self.documentable = None
+
+    def visitStmt(self, node):
+        self.default_visit(node)
+
+
+class AssignmentVisitor(DocstringVisitor):
+
+    def visitAssign(self, node):
+        visitor = AttributeVisitor(self.token_parser)
+        compiler.walk(node, visitor, walker=visitor)
+        if visitor.attributes:
+            self.context[-1].extend(visitor.attributes)
+        if len(visitor.attributes) == 1:
+            self.documentable = visitor.attributes[0]
+        else:
+            self.documentable = None
+
+
+class ModuleVisitor(AssignmentVisitor):
+
+    def __init__(self, filename, token_parser):
+        AssignmentVisitor.__init__(self, token_parser)
+        self.filename = filename
+        self.module = None
+
+    def visitModule(self, node):
+        self.module = module = pynodes.module_section()
+        module['filename'] = self.filename
+        append_docstring(module, node.doc, node.lineno)
+        self.context.append(module)
+        self.documentable = module
+        self.visit(node.node)
+        self.context.pop()
+
+    def visitImport(self, node):
+        self.context[-1] += make_import_group(names=node.names,
+                                              lineno=node.lineno)
+        self.documentable = None
+
+    def visitFrom(self, node):
+        self.context[-1].append(
+            make_import_group(names=node.names, from_name=node.modname,
+                              lineno=node.lineno))
+        self.documentable = None
+
+    def visitFunction(self, node):
+        visitor = FunctionVisitor(self.token_parser,
+                                  function_class=pynodes.function_section)
+        compiler.walk(node, visitor, walker=visitor)
+        self.context[-1].append(visitor.function)
+
+    def visitClass(self, node):
+        visitor = ClassVisitor(self.token_parser)
+        compiler.walk(node, visitor, walker=visitor)
+        self.context[-1].append(visitor.klass)
+
+
+class AttributeVisitor(BaseVisitor):
+
+    def __init__(self, token_parser):
+        BaseVisitor.__init__(self, token_parser)
+        self.attributes = pynodes.class_attribute_section()
+
+    def visitAssign(self, node):
+        # Don't visit the expression itself, just the attribute nodes:
+        for child in node.nodes:
+            self.dispatch(child)
+        expression_text = self.token_parser.rhs(node.lineno)
+        expression = pynodes.expression_value()
+        expression.append(Text(expression_text))
+        for attribute in self.attributes:
+            attribute.append(expression)
+
+    def visitAssName(self, node):
+        self.attributes.append(make_attribute(node.name,
+                                              lineno=node.lineno))
+
+    def visitAssTuple(self, node):
+        attributes = self.attributes
+        self.attributes = []
+        self.default_visit(node)
+        n = pynodes.attribute_tuple()
+        n.extend(self.attributes)
+        n['lineno'] = self.attributes[0]['lineno']
+        attributes.append(n)
+        self.attributes = attributes
+        #self.attributes.append(att_tuple)
+
+    def visitAssAttr(self, node):
+        self.default_visit(node, node.attrname)
+
+    def visitGetattr(self, node, suffix):
+        self.default_visit(node, node.attrname + '.' + suffix)
+
+    def visitName(self, node, suffix):
+        self.attributes.append(make_attribute(node.name + '.' + suffix,
+                                              lineno=node.lineno))
+
+
+class FunctionVisitor(DocstringVisitor):
+
+    in_function = 0
+
+    def __init__(self, token_parser, function_class):
+        DocstringVisitor.__init__(self, token_parser)
+        self.function_class = function_class
+
+    def visitFunction(self, node):
+        if self.in_function:
+            self.documentable = None
+            # Don't bother with nested function definitions.
+            return
+        self.in_function = 1
+        self.function = function = make_function_like_section(
+            name=node.name,
+            lineno=node.lineno,
+            doc=node.doc,
+            function_class=self.function_class)
+        self.context.append(function)
+        self.documentable = function
+        self.parse_parameter_list(node)
+        self.visit(node.code)
+        self.context.pop()
+
+    def parse_parameter_list(self, node):
+        parameters = []
+        special = []
+        argnames = list(node.argnames)
+        if node.kwargs:
+            special.append(make_parameter(argnames[-1], excess_keyword=1))
+            argnames.pop()
+        if node.varargs:
+            special.append(make_parameter(argnames[-1],
+                                          excess_positional=1))
+            argnames.pop()
+        defaults = list(node.defaults)
+        defaults = [None] * (len(argnames) - len(defaults)) + defaults
+        function_parameters = self.token_parser.function_parameters(
+            node.lineno)
+        #print >>sys.stderr, function_parameters
+        for argname, default in zip(argnames, defaults):
+            if type(argname) is TupleType:
+                parameter = pynodes.parameter_tuple()
+                for tuplearg in argname:
+                    parameter.append(make_parameter(tuplearg))
+                argname = normalize_parameter_name(argname)
+            else:
+                parameter = make_parameter(argname)
+            if default:
+                n_default = pynodes.parameter_default()
+                n_default.append(Text(function_parameters[argname]))
+                parameter.append(n_default)
+            parameters.append(parameter)
+        if parameters or special:
+            special.reverse()
+            parameters.extend(special)
+            parameter_list = pynodes.parameter_list()
+            parameter_list.extend(parameters)
+            self.function.append(parameter_list)
+
+
+class ClassVisitor(AssignmentVisitor):
+
+    in_class = 0
+
+    def __init__(self, token_parser):
+        AssignmentVisitor.__init__(self, token_parser)
+        self.bases = []
+
+    def visitClass(self, node):
+        if self.in_class:
+            self.documentable = None
+            # Don't bother with nested class definitions.
+            return
+        self.in_class = 1
+        #import mypdb as pdb
+        #pdb.set_trace()
+        for base in node.bases:
+            self.visit(base)
+        self.klass = klass = make_class_section(node.name, self.bases,
+                                                doc=node.doc,
+                                                lineno=node.lineno)
+        self.context.append(klass)
+        self.documentable = klass
+        self.visit(node.code)
+        self.context.pop()
+
+    def visitGetattr(self, node, suffix=None):
+        if suffix:
+            name = node.attrname + '.' + suffix
+        else:
+            name = node.attrname
+        self.default_visit(node, name)
+
+    def visitName(self, node, suffix=None):
+        if suffix:
+            name = node.name + '.' + suffix
+        else:
+            name = node.name
+        self.bases.append(name)
+
+    def visitFunction(self, node):
+        if node.name == '__init__':
+            visitor = InitMethodVisitor(self.token_parser,
+                                        function_class=pynodes.method_section)
+            compiler.walk(node, visitor, walker=visitor)
+        else:
+            visitor = FunctionVisitor(self.token_parser,
+                                      function_class=pynodes.method_section)
+            compiler.walk(node, visitor, walker=visitor)
+        self.context[-1].append(visitor.function)
+
+
+class InitMethodVisitor(FunctionVisitor, AssignmentVisitor): pass
+
+
+class TokenParser:
+
+    def __init__(self, text):
+        self.text = text + '\n\n'
+        self.lines = self.text.splitlines(1)
+        self.generator = tokenize.generate_tokens(iter(self.lines).next)
+        self.next()
+
+    def __iter__(self):
+        return self
+
+    def next(self):
+        self.token = self.generator.next()
+        self.type, self.string, self.start, self.end, self.line = self.token
+        return self.token
+
+    def goto_line(self, lineno):
+        while self.start[0] < lineno:
+            self.next()
+        return token
+
+    def rhs(self, lineno):
+        """
+        Return a whitespace-normalized expression string from the right-hand
+        side of an assignment at line `lineno`.
+        """
+        self.goto_line(lineno)
+        while self.string != '=':
+            self.next()
+        self.stack = None
+        while self.type != token.NEWLINE and self.string != ';':
+            if self.string == '=' and not self.stack:
+                self.tokens = []
+                self.stack = []
+                self._type = None
+                self._string = None
+                self._backquote = 0
+            else:
+                self.note_token()
+            self.next()
+        self.next()
+        text = ''.join(self.tokens)
+        return text.strip()
+
+    closers = {')': '(', ']': '[', '}': '{'}
+    openers = {'(': 1, '[': 1, '{': 1}
+    del_ws_prefix = {'.': 1, '=': 1, ')': 1, ']': 1, '}': 1, ':': 1, ',': 1}
+    no_ws_suffix = {'.': 1, '=': 1, '(': 1, '[': 1, '{': 1}
+
+    def note_token(self):
+        if self.type == tokenize.NL:
+            return
+        del_ws = self.del_ws_prefix.has_key(self.string)
+        append_ws = not self.no_ws_suffix.has_key(self.string)
+        if self.openers.has_key(self.string):
+            self.stack.append(self.string)
+            if (self._type == token.NAME
+                or self.closers.has_key(self._string)):
+                del_ws = 1
+        elif self.closers.has_key(self.string):
+            assert self.stack[-1] == self.closers[self.string]
+            self.stack.pop()
+        elif self.string == '`':
+            if self._backquote:
+                del_ws = 1
+                assert self.stack[-1] == '`'
+                self.stack.pop()
+            else:
+                append_ws = 0
+                self.stack.append('`')
+            self._backquote = not self._backquote
+        if del_ws and self.tokens and self.tokens[-1] == ' ':
+            del self.tokens[-1]
+        self.tokens.append(self.string)
+        self._type = self.type
+        self._string = self.string
+        if append_ws:
+            self.tokens.append(' ')
+
+    def function_parameters(self, lineno):
+        """
+        Return a dictionary mapping parameters to defaults
+        (whitespace-normalized strings).
+        """
+        self.goto_line(lineno)
+        while self.string != 'def':
+            self.next()
+        while self.string != '(':
+            self.next()
+        name = None
+        default = None
+        parameter_tuple = None
+        self.tokens = []
+        parameters = {}
+        self.stack = [self.string]
+        self.next()
+        while 1:
+            if len(self.stack) == 1:
+                if parameter_tuple:
+                    # Just encountered ")".
+                    #print >>sys.stderr, 'parameter_tuple: %r' % self.tokens
+                    name = ''.join(self.tokens).strip()
+                    self.tokens = []
+                    parameter_tuple = None
+                if self.string in (')', ','):
+                    if name:
+                        if self.tokens:
+                            default_text = ''.join(self.tokens).strip()
+                        else:
+                            default_text = None
+                        parameters[name] = default_text
+                        self.tokens = []
+                        name = None
+                        default = None
+                    if self.string == ')':
+                        break
+                elif self.type == token.NAME:
+                    if name and default:
+                        self.note_token()
+                    else:
+                        assert name is None, (
+                            'token=%r name=%r parameters=%r stack=%r'
+                            % (self.token, name, parameters, self.stack))
+                        name = self.string
+                        #print >>sys.stderr, 'name=%r' % name
+                elif self.string == '=':
+                    assert name is not None, 'token=%r' % (self.token,)
+                    assert default is None, 'token=%r' % (self.token,)
+                    assert self.tokens == [], 'token=%r' % (self.token,)
+                    default = 1
+                    self._type = None
+                    self._string = None
+                    self._backquote = 0
+                elif name:
+                    self.note_token()
+                elif self.string == '(':
+                    parameter_tuple = 1
+                    self._type = None
+                    self._string = None
+                    self._backquote = 0
+                    self.note_token()
+                else:                   # ignore these tokens:
+                    assert (self.string in ('*', '**', '\n') 
+                            or self.type == tokenize.COMMENT), (
+                        'token=%r' % (self.token,))
+            else:
+                self.note_token()
+            self.next()
+        return parameters
+
+
+def make_docstring(doc, lineno):
+    n = pynodes.docstring()
+    if lineno:
+        # Really, only module docstrings don't have a line
+        # (@@: but maybe they should)
+        n['lineno'] = lineno
+    n.append(Text(doc))
+    return n
+
+def append_docstring(node, doc, lineno):
+    if doc:
+        node.append(make_docstring(doc, lineno))
+
+def make_class_section(name, bases, lineno, doc):
+    n = pynodes.class_section()
+    n['lineno'] = lineno
+    n.append(make_object_name(name))
+    for base in bases:
+        b = pynodes.class_base()
+        b.append(make_object_name(base))
+        n.append(b)
+    append_docstring(n, doc, lineno)
+    return n
+
+def make_object_name(name):
+    n = pynodes.object_name()
+    n.append(Text(name))
+    return n
+
+def make_function_like_section(name, lineno, doc, function_class):
+    n = function_class()
+    n['lineno'] = lineno
+    n.append(make_object_name(name))
+    append_docstring(n, doc, lineno)
+    return n
+
+def make_import_group(names, lineno, from_name=None):
+    n = pynodes.import_group()
+    n['lineno'] = lineno
+    if from_name:
+        n_from = pynodes.import_from()
+        n_from.append(Text(from_name))
+        n.append(n_from)
+    for name, alias in names:
+        n_name = pynodes.import_name()
+        n_name.append(Text(name))
+        if alias:
+            n_alias = pynodes.import_alias()
+            n_alias.append(Text(alias))
+            n_name.append(n_alias)
+        n.append(n_name)
+    return n
+
+def make_class_attribute(name, lineno):
+    n = pynodes.class_attribute()
+    n['lineno'] = lineno
+    n.append(Text(name))
+    return n
+
+def make_attribute(name, lineno):
+    n = pynodes.attribute()
+    n['lineno'] = lineno
+    n.append(make_object_name(name))
+    return n
+
+def make_parameter(name, excess_keyword=0, excess_positional=0):
+    """
+    excess_keyword and excess_positional must be either 1 or 0, and
+    not both of them can be 1.
+    """
+    n = pynodes.parameter()
+    n.append(make_object_name(name))
+    assert not excess_keyword or not excess_positional
+    if excess_keyword:
+        n['excess_keyword'] = 1
+    if excess_positional:
+        n['excess_positional'] = 1
+    return n
+
+def trim_docstring(text):
+    """
+    Trim indentation and blank lines from docstring text & return it.
+
+    See PEP 257.
+    """
+    if not text:
+        return text
+    # Convert tabs to spaces (following the normal Python rules)
+    # and split into a list of lines:
+    lines = text.expandtabs().splitlines()
+    # Determine minimum indentation (first line doesn't count):
+    indent = sys.maxint
+    for line in lines[1:]:
+        stripped = line.lstrip()
+        if stripped:
+            indent = min(indent, len(line) - len(stripped))
+    # Remove indentation (first line is special):
+    trimmed = [lines[0].strip()]
+    if indent < sys.maxint:
+        for line in lines[1:]:
+            trimmed.append(line[indent:].rstrip())
+    # Strip off trailing and leading blank lines:
+    while trimmed and not trimmed[-1]:
+        trimmed.pop()
+    while trimmed and not trimmed[0]:
+        trimmed.pop(0)
+    # Return a single string:
+    return '\n'.join(trimmed)
+
+def normalize_parameter_name(name):
+    """
+    Converts a tuple like ``('a', ('b', 'c'), 'd')`` into ``'(a, (b, c), d)'``
+    """
+    if type(name) is TupleType:
+        return '(%s)' % ', '.join([normalize_parameter_name(n) for n in name])
+    else:
+        return name
+
+if __name__ == '__main__':
+    import sys
+    args = sys.argv[1:]
+    if args[0] == '-v':
+        filename = args[1]
+        module_text = open(filename).read()
+        ast = compiler.parse(module_text)
+        visitor = compiler.visitor.ExampleASTVisitor()
+        compiler.walk(ast, visitor, walker=visitor, verbose=1)
+    else:
+        filename = args[0]
+        content = open(filename).read()
+        print parse_module(content, filename).pformat()
+
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/readers/__init__.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/readers/__init__.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/readers/__init__.py (revision 3)
@@ -0,0 +1,109 @@
+# Authors: David Goodger; Ueli Schlaepfer
+# Contact: goodger@users.sourceforge.net
+# Revision: $Revision: 4183 $
+# Date: $Date: 2005-12-12 05:12:02 +0100 (Mon, 12 Dec 2005) $
+# Copyright: This module has been placed in the public domain.
+
+"""
+This package contains Docutils Reader modules.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+from docutils import utils, parsers, Component
+from docutils.transforms import universal
+
+
+class Reader(Component):
+
+    """
+    Abstract base class for docutils Readers.
+
+    Each reader module or package must export a subclass also called 'Reader'.
+
+    The three steps of a Reader's responsibility are defined: `scan()`,
+    `parse()`, and `transform()`. Call `read()` to process a document.
+    """
+
+    component_type = 'reader'
+    config_section = 'readers'
+
+    def get_transforms(self):
+        return Component.get_transforms(self) + [
+            universal.Decorations,
+            universal.ExposeInternals,
+            universal.StripComments,]
+
+    def __init__(self, parser=None, parser_name=None):
+        """
+        Initialize the Reader instance.
+
+        Several instance attributes are defined with dummy initial values.
+        Subclasses may use these attributes as they wish.
+        """
+
+        self.parser = parser
+        """A `parsers.Parser` instance shared by all doctrees.  May be left
+        unspecified if the document source determines the parser."""
+
+        if parser is None and parser_name:
+            self.set_parser(parser_name)
+
+        self.source = None
+        """`docutils.io` IO object, source of input data."""
+
+        self.input = None
+        """Raw text input; either a single string or, for more complex cases,
+        a collection of strings."""
+
+    def set_parser(self, parser_name):
+        """Set `self.parser` by name."""
+        parser_class = parsers.get_parser_class(parser_name)
+        self.parser = parser_class()
+
+    def read(self, source, parser, settings):
+        self.source = source
+        if not self.parser:
+            self.parser = parser
+        self.settings = settings
+        self.input = self.source.read()
+        self.parse()
+        return self.document
+
+    def parse(self):
+        """Parse `self.input` into a document tree."""
+        self.document = document = self.new_document()
+        self.parser.parse(self.input, document)
+        document.current_source = document.current_line = None
+
+    def new_document(self):
+        """Create and return a new empty document tree (root node)."""
+        document = utils.new_document(self.source.source_path, self.settings)
+        return document
+
+
+class ReReader(Reader):
+
+    """
+    A reader which rereads an existing document tree (e.g. a
+    deserializer).
+
+    Often used in conjunction with `writers.UnfilteredWriter`.
+    """
+
+    def get_transforms(self):
+        # Do not add any transforms.  They have already been applied
+        # by the reader which originally created the document.
+        return Component.get_transforms(self)
+
+
+_reader_aliases = {}
+
+def get_reader_class(reader_name):
+    """Return the Reader class from the `reader_name` module."""
+    reader_name = reader_name.lower()
+    if _reader_aliases.has_key(reader_name):
+        reader_name = _reader_aliases[reader_name]
+    module = __import__(reader_name, globals(), locals())
+    return module.Reader
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/readers/pep.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/readers/pep.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/readers/pep.py (revision 3)
@@ -0,0 +1,50 @@
+# Author: David Goodger
+# Contact: goodger@users.sourceforge.net
+# Revision: $Revision: 3892 $
+# Date: $Date: 2005-09-20 22:04:53 +0200 (Tue, 20 Sep 2005) $
+# Copyright: This module has been placed in the public domain.
+
+"""
+Python Enhancement Proposal (PEP) Reader.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+from docutils.readers import standalone
+from docutils.transforms import peps, references, misc, frontmatter
+from docutils.parsers import rst
+
+
+class Reader(standalone.Reader):
+
+    supported = ('pep',)
+    """Contexts this reader supports."""
+
+    settings_spec = (
+        'PEP Reader Option Defaults',
+        'The --pep-references and --rfc-references options (for the '
+        'reStructuredText parser) are on by default.',
+        ())
+
+    config_section = 'pep reader'
+    config_section_dependencies = ('readers', 'standalone reader')
+
+    def get_transforms(self):
+        transforms = standalone.Reader.get_transforms(self)
+        # We have PEP-specific frontmatter handling.
+        transforms.remove(frontmatter.DocTitle)
+        transforms.remove(frontmatter.SectionSubTitle)
+        transforms.remove(frontmatter.DocInfo)
+        transforms.extend([peps.Headers, peps.Contents, peps.TargetNotes])
+        return transforms
+
+    settings_default_overrides = {'pep_references': 1, 'rfc_references': 1}
+
+    inliner_class = rst.states.Inliner
+
+    def __init__(self, parser=None, parser_name=None):
+        """`parser` should be ``None``."""
+        if parser is None:
+            parser = rst.Parser(rfc2822=1, inliner=self.inliner_class())
+        standalone.Reader.__init__(self, parser, '')
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/readers/doctree.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/readers/doctree.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/readers/doctree.py (revision 3)
@@ -0,0 +1,48 @@
+# Author: Martin Blais
+# Contact: blais@furius.ca
+# Revision: $Revision: 4006 $
+# Date: $Date: 2005-11-08 03:38:20 +0100 (Tue, 08 Nov 2005) $
+# Copyright: This module has been placed in the public domain.
+
+"""Reader for existing document trees."""
+
+from docutils import readers, utils, transforms
+
+
+class Reader(readers.ReReader):
+
+    """
+    Adapt the Reader API for an existing document tree.
+
+    The existing document tree must be passed as the ``source`` parameter to
+    the `docutils.core.Publisher` initializer, wrapped in a
+    `docutils.io.DocTreeInput` object::
+
+        pub = docutils.core.Publisher(
+            ..., source=docutils.io.DocTreeInput(document), ...)
+
+    The original document settings are overridden; if you want to use the
+    settings of the original document, pass ``settings=document.settings`` to
+    the Publisher call above.
+    """
+
+    supported = ('doctree',)
+
+    config_section = 'doctree reader'
+    config_section_dependencies = ('readers',)
+
+    def parse(self):
+        """
+        No parsing to do; refurbish the document tree instead.
+        Overrides the inherited method.
+        """
+        self.document = self.input
+        # Create fresh Transformer object, to be populated from Writer
+        # component.
+        self.document.transformer = transforms.Transformer(self.document)
+        # Replace existing settings object with new one.
+        self.document.settings = self.settings
+        # Create fresh Reporter object because it is dependent on
+        # (new) settings.
+        self.document.reporter = utils.new_reporter(
+            self.document.get('source', ''), self.document.settings)
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/__init__.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/__init__.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/__init__.py (revision 3)
@@ -0,0 +1,195 @@
+# Author: David Goodger
+# Contact: goodger@python.org
+# Revision: $Revision: 4260 $
+# Date: $Date: 2006-01-09 19:28:09 +0100 (Mon, 09 Jan 2006) $
+# Copyright: This module has been placed in the public domain.
+
+"""
+This is the Docutils (Python Documentation Utilities) package.
+
+Package Structure
+=================
+
+Modules:
+
+- __init__.py: Contains component base classes, exception classes, and
+  Docutils version information.
+
+- core.py: Contains the ``Publisher`` class and ``publish_*()`` convenience
+  functions.
+
+- frontend.py: Runtime settings (command-line interface, configuration files)
+  processing, for Docutils front-ends.
+
+- io.py: Provides a uniform API for low-level input and output.
+
+- nodes.py: Docutils document tree (doctree) node class library.
+
+- statemachine.py: A finite state machine specialized for
+  regular-expression-based text filters.
+
+- urischemes.py: Contains a complete mapping of known URI addressing
+  scheme names to descriptions.
+
+- utils.py: Contains the ``Reporter`` system warning class and miscellaneous
+  utilities.
+
+Subpackages:
+
+- languages: Language-specific mappings of terms.
+
+- parsers: Syntax-specific input parser modules or packages.
+
+- readers: Context-specific input handlers which understand the data
+  source and manage a parser.
+
+- transforms: Modules used by readers and writers to modify DPS
+  doctrees.
+
+- writers: Format-specific output translators.
+"""
+
+__docformat__ = 'reStructuredText'
+
+__version__ = '0.4'
+"""``major.minor.micro`` version number.  The micro number is bumped for API
+changes, for new functionality, and for interim project releases.  The minor
+number is bumped whenever there is a significant project release.  The major
+number will be bumped when the project is feature-complete, and perhaps if
+there is a major change in the design."""
+
+__version_details__ = 'release'
+"""Extra version details (e.g. 'snapshot 2005-05-29, r3410', 'repository',
+'release'), modified automatically & manually."""
+
+class ApplicationError(StandardError): pass
+class DataError(ApplicationError): pass
+
+
+class SettingsSpec:
+
+    """
+    Runtime setting specification base class.
+
+    SettingsSpec subclass objects used by `docutils.frontend.OptionParser`.
+    """
+
+    settings_spec = ()
+    """Runtime settings specification.  Override in subclasses.
+
+    Defines runtime settings and associated command-line options, as used by
+    `docutils.frontend.OptionParser`.  This is a tuple of:
+
+    - Option group title (string or `None` which implies no group, just a list
+      of single options).
+    
+    - Description (string or `None`).
+    
+    - A sequence of option tuples.  Each consists of:
+
+      - Help text (string)
+      
+      - List of option strings (e.g. ``['-Q', '--quux']``).
+      
+      - Dictionary of keyword arguments.  It contains arguments to the
+        OptionParser/OptionGroup ``add_option`` method, possibly with the
+        addition of a 'validator' keyword (see the
+        `docutils.frontend.OptionParser.validators` instance attribute).  Runtime
+        settings names are derived implicitly from long option names
+        ('--a-setting' becomes ``settings.a_setting``) or explicitly from the
+        'dest' keyword argument.  See optparse docs for more details.
+
+    - More triples of group title, description, options, as many times as
+      needed.  Thus, `settings_spec` tuples can be simply concatenated.
+    """
+
+    settings_defaults = None
+    """A dictionary of defaults for settings not in `settings_spec` (internal
+    settings, intended to be inaccessible by command-line and config file).
+    Override in subclasses."""
+
+    settings_default_overrides = None
+    """A dictionary of auxiliary defaults, to override defaults for settings
+    defined in other components.  Override in subclasses."""
+
+    relative_path_settings = ()
+    """Settings containing filesystem paths.  Override in subclasses.
+    Settings listed here are to be interpreted relative to the current working
+    directory."""
+
+    config_section = None
+    """The name of the config file section specific to this component
+    (lowercase, no brackets).  Override in subclasses."""
+
+    config_section_dependencies = None
+    """A list of names of config file sections that are to be applied before
+    `config_section`, in order (from general to specific).  In other words,
+    the settings in `config_section` are to be overlaid on top of the settings
+    from these sections.  The "general" section is assumed implicitly.
+    Override in subclasses."""
+
+
+class TransformSpec:
+
+    """
+    Runtime transform specification base class.
+
+    TransformSpec subclass objects used by `docutils.transforms.Transformer`.
+    """
+
+    def get_transforms(self):
+        """Transforms required by this class.  Override in subclasses."""
+        if self.default_transforms != ():
+            import warnings
+            warnings.warn('default_transforms attribute deprecated.\n'
+                          'Use get_transforms() method instead.',
+                          DeprecationWarning)
+            return list(self.default_transforms)
+        return []
+
+    # Deprecated; for compatibility.
+    default_transforms = ()
+
+    unknown_reference_resolvers = ()
+    """List of functions to try to resolve unknown references.  Unknown
+    references have a 'refname' attribute which doesn't correspond to any
+    target in the document.  Called when FinalCheckVisitor is unable to find a
+    correct target.  The list should contain functions which will try to
+    resolve unknown references, with the following signature::
+
+        def reference_resolver(node):
+            '''Returns boolean: true if resolved, false if not.'''
+
+    If the function is able to resolve the reference, it should also remove
+    the 'refname' attribute and mark the node as resolved::
+
+        del node['refname']
+        node.resolved = 1
+
+    Each function must have a "priority" attribute which will affect the order
+    the unknown_reference_resolvers are run::
+
+        reference_resolver.priority = 100
+
+    Override in subclasses."""
+
+
+class Component(SettingsSpec, TransformSpec):
+
+    """Base class for Docutils components."""
+
+    component_type = None
+    """Name of the component type ('reader', 'parser', 'writer').  Override in
+    subclasses."""
+
+    supported = ()
+    """Names for this component.  Override in subclasses."""
+    
+    def supports(self, format):
+        """
+        Is `format` supported by this component?
+
+        To be used by transforms to ask the dependent component if it supports
+        a certain input context or output format.
+        """
+        return format in self.supported
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/frontend.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/frontend.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/frontend.py (revision 3)
@@ -0,0 +1,720 @@
+# Author: David Goodger
+# Contact: goodger@users.sourceforge.net
+# Revision: $Revision: 4183 $
+# Date: $Date: 2005-12-12 05:12:02 +0100 (Mon, 12 Dec 2005) $
+# Copyright: This module has been placed in the public domain.
+
+"""
+Command-line and common processing for Docutils front-end tools.
+
+Exports the following classes:
+
+* `OptionParser`: Standard Docutils command-line processing.
+* `Option`: Customized version of `optparse.Option`; validation support.
+* `Values`: Runtime settings; objects are simple structs
+  (``object.attribute``).  Supports cumulative list settings (attributes).
+* `ConfigParser`: Standard Docutils config file processing.
+
+Also exports the following functions:
+
+* Option callbacks: `store_multiple`, `read_config_file`.
+* Setting validators: `validate_encoding`,
+  `validate_encoding_error_handler`,
+  `validate_encoding_and_error_handler`, `validate_boolean`,
+  `validate_threshold`, `validate_colon_separated_string_list`,
+  `validate_dependency_file`.
+* `make_paths_absolute`.
+"""
+
+__docformat__ = 'reStructuredText'
+
+import os
+import os.path
+import sys
+import types
+import warnings
+import ConfigParser as CP
+import codecs
+import docutils
+try:
+    import optparse
+    from optparse import SUPPRESS_HELP
+except ImportError:
+    import optik as optparse
+    from optik import SUPPRESS_HELP
+
+
+def store_multiple(option, opt, value, parser, *args, **kwargs):
+    """
+    Store multiple values in `parser.values`.  (Option callback.)
+
+    Store `None` for each attribute named in `args`, and store the value for
+    each key (attribute name) in `kwargs`.
+    """
+    for attribute in args:
+        setattr(parser.values, attribute, None)
+    for key, value in kwargs.items():
+        setattr(parser.values, key, value)
+
+def read_config_file(option, opt, value, parser):
+    """
+    Read a configuration file during option processing.  (Option callback.)
+    """
+    try:
+        new_settings = parser.get_config_file_settings(value)
+    except ValueError, error:
+        parser.error(error)
+    parser.values.update(new_settings, parser)
+
+def validate_encoding(setting, value, option_parser,
+                      config_parser=None, config_section=None):
+    try:
+        codecs.lookup(value)
+    except LookupError:
+        raise (LookupError('setting "%s": unknown encoding: "%s"'
+                           % (setting, value)),
+               None, sys.exc_info()[2])
+    return value
+
+def validate_encoding_error_handler(setting, value, option_parser,
+                                    config_parser=None, config_section=None):
+    try:
+        codecs.lookup_error(value)
+    except AttributeError:              # prior to Python 2.3
+        if value not in ('strict', 'ignore', 'replace', 'xmlcharrefreplace'):
+            raise (LookupError(
+                'unknown encoding error handler: "%s" (choices: '
+                '"strict", "ignore", "replace", or "xmlcharrefreplace")' % value),
+                   None, sys.exc_info()[2])
+    except LookupError:
+        raise (LookupError(
+            'unknown encoding error handler: "%s" (choices: '
+            '"strict", "ignore", "replace", "backslashreplace", '
+            '"xmlcharrefreplace", and possibly others; see documentation for '
+            'the Python ``codecs`` module)' % value),
+               None, sys.exc_info()[2])
+    return value
+
+def validate_encoding_and_error_handler(
+    setting, value, option_parser, config_parser=None, config_section=None):
+    """
+    Side-effect: if an error handler is included in the value, it is inserted
+    into the appropriate place as if it was a separate setting/option.
+    """
+    if ':' in value:
+        encoding, handler = value.split(':')
+        validate_encoding_error_handler(
+            setting + '_error_handler', handler, option_parser,
+            config_parser, config_section)
+        if config_parser:
+            config_parser.set(config_section, setting + '_error_handler',
+                              handler)
+        else:
+            setattr(option_parser.values, setting + '_error_handler', handler)
+    else:
+        encoding = value
+    validate_encoding(setting, encoding, option_parser,
+                      config_parser, config_section)
+    return encoding
+
+def validate_boolean(setting, value, option_parser,
+                     config_parser=None, config_section=None):
+    if isinstance(value, types.StringType):
+        try:
+            return option_parser.booleans[value.strip().lower()]
+        except KeyError:
+            raise (LookupError('unknown boolean value: "%s"' % value),
+                   None, sys.exc_info()[2])
+    return value
+
+def validate_nonnegative_int(setting, value, option_parser,
+                             config_parser=None, config_section=None):
+    value = int(value)
+    if value < 0:
+        raise ValueError('negative value; must be positive or zero')
+    return value
+
+def validate_threshold(setting, value, option_parser,
+                       config_parser=None, config_section=None):
+    try:
+        return int(value)
+    except ValueError:
+        try:
+            return option_parser.thresholds[value.lower()]
+        except (KeyError, AttributeError):
+            raise (LookupError('unknown threshold: %r.' % value),
+                   None, sys.exc_info[2])
+
+def validate_colon_separated_string_list(
+    setting, value, option_parser, config_parser=None, config_section=None):
+    if isinstance(value, types.StringType):
+        value = value.split(':')
+    else:
+        last = value.pop()
+        value.extend(last.split(':'))
+    return value
+
+def validate_url_trailing_slash(
+    setting, value, option_parser, config_parser=None, config_section=None):
+    if not value:
+        return './'
+    elif value.endswith('/'):
+        return value
+    else:
+        return value + '/'
+
+def validate_dependency_file(
+    setting, value, option_parser, config_parser=None, config_section=None):
+    try:
+        return docutils.utils.DependencyList(value)
+    except IOError:
+        return docutils.utils.DependencyList(None)
+
+def make_paths_absolute(pathdict, keys, base_path=None):
+    """
+    Interpret filesystem path settings relative to the `base_path` given.
+
+    Paths are values in `pathdict` whose keys are in `keys`.  Get `keys` from
+    `OptionParser.relative_path_settings`.
+    """
+    if base_path is None:
+        base_path = os.getcwd()
+    for key in keys:
+        if pathdict.has_key(key):
+            value = pathdict[key]
+            if isinstance(value, types.ListType):
+                value = [make_one_path_absolute(base_path, path)
+                         for path in value]
+            elif value:
+                value = make_one_path_absolute(base_path, value)
+            pathdict[key] = value
+
+def make_one_path_absolute(base_path, path):
+    return os.path.abspath(os.path.join(base_path, path))
+
+
+class Values(optparse.Values):
+
+    """
+    Updates list attributes by extension rather than by replacement.
+    Works in conjunction with the `OptionParser.lists` instance attribute.
+    """
+
+    def __init__(self, *args, **kwargs):
+        optparse.Values.__init__(self, *args, **kwargs)
+        if (not hasattr(self, 'record_dependencies')
+            or self.record_dependencies is None):
+            # Set up dependency list, in case it is needed.
+            self.record_dependencies = docutils.utils.DependencyList()
+
+    def update(self, other_dict, option_parser):
+        if isinstance(other_dict, Values):
+            other_dict = other_dict.__dict__
+        other_dict = other_dict.copy()
+        for setting in option_parser.lists.keys():
+            if (hasattr(self, setting) and other_dict.has_key(setting)):
+                value = getattr(self, setting)
+                if value:
+                    value += other_dict[setting]
+                    del other_dict[setting]
+        self._update_loose(other_dict)
+
+    def copy(self):
+        """Return a shallow copy of `self`."""
+        return self.__class__(defaults=self.__dict__)
+
+
+class Option(optparse.Option):
+
+    ATTRS = optparse.Option.ATTRS + ['validator', 'overrides']
+
+    def process(self, opt, value, values, parser):
+        """
+        Call the validator function on applicable settings and
+        evaluate the 'overrides' option.
+        Extends `optparse.Option.process`.
+        """
+        result = optparse.Option.process(self, opt, value, values, parser)
+        setting = self.dest
+        if setting:
+            if self.validator:
+                value = getattr(values, setting)
+                try:
+                    new_value = self.validator(setting, value, parser)
+                except Exception, error:
+                    raise (optparse.OptionValueError(
+                        'Error in option "%s":\n    %s: %s'
+                        % (opt, error.__class__.__name__, error)),
+                           None, sys.exc_info()[2])
+                setattr(values, setting, new_value)
+            if self.overrides:
+                setattr(values, self.overrides, None)
+        return result
+
+
+class OptionParser(optparse.OptionParser, docutils.SettingsSpec):
+
+    """
+    Parser for command-line and library use.  The `settings_spec`
+    specification here and in other Docutils components are merged to build
+    the set of command-line options and runtime settings for this process.
+
+    Common settings (defined below) and component-specific settings must not
+    conflict.  Short options are reserved for common settings, and components
+    are restrict to using long options.
+    """
+
+    standard_config_files = [
+        '/etc/docutils.conf',           # system-wide
+        './docutils.conf',              # project-specific
+        '~/.docutils']                  # user-specific
+    """Docutils configuration files, using ConfigParser syntax.  Filenames
+    will be tilde-expanded later.  Later files override earlier ones."""
+
+    threshold_choices = 'info 1 warning 2 error 3 severe 4 none 5'.split()
+    """Possible inputs for for --report and --halt threshold values."""
+
+    thresholds = {'info': 1, 'warning': 2, 'error': 3, 'severe': 4, 'none': 5}
+    """Lookup table for --report and --halt threshold values."""
+
+    booleans={'1': 1, 'on': 1, 'yes': 1, 'true': 1,
+              '0': 0, 'off': 0, 'no': 0, 'false': 0, '': 0}
+    """Lookup table for boolean configuration file settings."""
+
+    if hasattr(codecs, 'backslashreplace_errors'):
+        default_error_encoding_error_handler = 'backslashreplace'
+    else:
+        default_error_encoding_error_handler = 'replace'
+
+    settings_spec = (
+        'General Docutils Options',
+        None,
+        (('Specify the document title as metadata (not part of the document '
+          'body).  Overrides a document-provided title.  There is no default.',
+          ['--title'], {}),
+         ('Include a "Generated by Docutils" credit and link at the end '
+          'of the document.',
+          ['--generator', '-g'], {'action': 'store_true',
+                                  'validator': validate_boolean}),
+         ('Do not include a generator credit.',
+          ['--no-generator'], {'action': 'store_false', 'dest': 'generator'}),
+         ('Include the date at the end of the document (UTC).',
+          ['--date', '-d'], {'action': 'store_const', 'const': '%Y-%m-%d',
+                             'dest': 'datestamp'}),
+         ('Include the time & date at the end of the document (UTC).',
+          ['--time', '-t'], {'action': 'store_const',
+                             'const': '%Y-%m-%d %H:%M UTC',
+                             'dest': 'datestamp'}),
+         ('Do not include a datestamp of any kind.',
+          ['--no-datestamp'], {'action': 'store_const', 'const': None,
+                               'dest': 'datestamp'}),
+         ('Include a "View document source" link (relative to destination).',
+          ['--source-link', '-s'], {'action': 'store_true',
+                                    'validator': validate_boolean}),
+         ('Use the supplied <URL> verbatim for a "View document source" '
+          'link; implies --source-link.',
+          ['--source-url'], {'metavar': '<URL>'}),
+         ('Do not include a "View document source" link.',
+          ['--no-source-link'],
+          {'action': 'callback', 'callback': store_multiple,
+           'callback_args': ('source_link', 'source_url')}),
+         ('Enable backlinks from section headers to table of contents '
+          'entries.  This is the default.',
+          ['--toc-entry-backlinks'],
+          {'dest': 'toc_backlinks', 'action': 'store_const', 'const': 'entry',
+           'default': 'entry'}),
+         ('Enable backlinks from section headers to the top of the table of '
+          'contents.',
+          ['--toc-top-backlinks'],
+          {'dest': 'toc_backlinks', 'action': 'store_const', 'const': 'top'}),
+         ('Disable backlinks to the table of contents.',
+          ['--no-toc-backlinks'],
+          {'dest': 'toc_backlinks', 'action': 'store_false'}),
+         ('Enable backlinks from footnotes and citations to their '
+          'references.  This is the default.',
+          ['--footnote-backlinks'],
+          {'action': 'store_true', 'default': 1,
+           'validator': validate_boolean}),
+         ('Disable backlinks from footnotes and citations.',
+          ['--no-footnote-backlinks'],
+          {'dest': 'footnote_backlinks', 'action': 'store_false'}),
+         ('Enable Docutils section numbering (default: enabled).',
+          ['--section-numbering'],
+          {'action': 'store_true', 'dest': 'sectnum_xform',
+           'default': 1, 'validator': validate_boolean}),
+         ('Disable Docutils section numbering (default: enabled).',
+          ['--no-section-numbering'],
+          {'action': 'store_false', 'dest': 'sectnum_xform',
+           'validator': validate_boolean}),
+         ('Remove comment elements from the document tree '
+          '(default: leave them).',
+          ['--strip-comments'],
+          {'action': 'store_true', 'validator': validate_boolean}),
+         ('Leave comment elements in the document tree '
+          '(this is the default).',
+          ['--leave-comments'],
+          {'action': 'store_false', 'dest': 'strip_comments',
+           'validator': validate_boolean}),
+         ('Set verbosity threshold; report system messages at or higher than '
+          '<level> (by name or number: "info" or "1", warning/2, error/3, '
+          'severe/4; also, "none" or "5").  Default is 2 (warning).',
+          ['--report', '-r'], {'choices': threshold_choices, 'default': 2,
+                               'dest': 'report_level', 'metavar': '<level>',
+                               'validator': validate_threshold}),
+         ('Report all system messages, info-level and higher.  (Same as '
+          '"--report=info".)',
+          ['--verbose', '-v'], {'action': 'store_const', 'const': 1,
+                                'dest': 'report_level'}),
+         ('Do not report any system messages.  (Same as "--report=none".)',
+          ['--quiet', '-q'], {'action': 'store_const', 'const': 5,
+                              'dest': 'report_level'}),
+         ('Set the threshold (<level>) at or above which system messages are '
+          'converted to exceptions, halting execution immediately by '
+          'exiting (or propagating the exception if --traceback set).  '
+          'Levels as in --report.  Default is 4 (severe).',
+          ['--halt'], {'choices': threshold_choices, 'dest': 'halt_level',
+                       'default': 4, 'metavar': '<level>',
+                       'validator': validate_threshold}),
+         ('Same as "--halt=info": halt processing at the slightest problem.',
+          ['--strict'], {'action': 'store_const', 'const': 'info',
+                         'dest': 'halt_level'}),
+         ('Enable a non-zero exit status for normal exit if non-halting '
+          'system messages (at or above <level>) were generated.  Levels as '
+          'in --report.  Default is 5 (disabled).  Exit status is the maximum '
+          'system message level plus 10 (11 for INFO, etc.).',
+          ['--exit-status'], {'choices': threshold_choices,
+                              'dest': 'exit_status_level',
+                              'default': 5, 'metavar': '<level>',
+                              'validator': validate_threshold}),
+         ('Report debug-level system messages and generate diagnostic output.',
+          ['--debug'], {'action': 'store_true', 'validator': validate_boolean}),
+         ('Do not report debug-level system messages or generate diagnostic '
+          'output.',
+          ['--no-debug'], {'action': 'store_false', 'dest': 'debug'}),
+         ('Send the output of system messages (warnings) to <file>.',
+          ['--warnings'], {'dest': 'warning_stream', 'metavar': '<file>'}),
+         ('Enable Python tracebacks when halt-level system messages and '
+          'other exceptions occur.  Useful for debugging, and essential for '
+          'issue reports.',
+          ['--traceback'], {'action': 'store_true', 'default': None,
+                            'validator': validate_boolean}),
+         ('Disable Python tracebacks when errors occur; report just the error '
+          'instead.  This is the default.',
+          ['--no-traceback'], {'dest': 'traceback', 'action': 'store_false'}),
+         ('Specify the encoding of input text.  Default is locale-dependent.  '
+          'Optionally also specify the error handler for undecodable '
+          'characters, after a colon (":"); default is "strict".  (See '
+          '"--intput-encoding-error-handler".)',
+          ['--input-encoding', '-i'],
+          {'metavar': '<name[:handler]>',
+           'validator': validate_encoding_and_error_handler}),
+         ('Specify the error handler for undecodable characters in '
+          'the input.  Acceptable values include "strict", "ignore", and '
+          '"replace".  Default is "strict".  '
+          'Usually specified as part of --input-encoding.',
+          ['--input-encoding-error-handler'],
+          {'default': 'strict', 'validator': validate_encoding_error_handler}),
+         ('Specify the text encoding for output.  Default is UTF-8.  '
+          'Optionally also specify the error handler for unencodable '
+          'characters, after a colon (":"); default is "strict".  (See '
+          '"--output-encoding-error-handler".)',
+          ['--output-encoding', '-o'],
+          {'metavar': '<name[:handler]>', 'default': 'utf-8',
+           'validator': validate_encoding_and_error_handler}),
+         ('Specify the error handler for unencodable characters in '
+          'the output.  Acceptable values include "strict", "ignore", '
+          '"replace", "xmlcharrefreplace", and '
+          '"backslashreplace" (in Python 2.3+).  Default is "strict".  '
+          'Usually specified as part of --output-encoding.',
+          ['--output-encoding-error-handler'],
+          {'default': 'strict', 'validator': validate_encoding_error_handler}),
+         ('Specify the text encoding for error output.  Default is ASCII.  '
+          'Optionally also specify the error handler for unencodable '
+          'characters, after a colon (":"); default is "%s".  (See '
+          '"--output-encoding-error-handler".)'
+          % default_error_encoding_error_handler,
+          ['--error-encoding', '-e'],
+          {'metavar': '<name[:handler]>', 'default': 'ascii',
+           'validator': validate_encoding_and_error_handler}),
+         ('Specify the error handler for unencodable characters in '
+          'error output.  See --output-encoding-error-handler for acceptable '
+          'values.  Default is "%s".  Usually specified as part of '
+          '--error-encoding.' % default_error_encoding_error_handler,
+          ['--error-encoding-error-handler'],
+          {'default': default_error_encoding_error_handler,
+           'validator': validate_encoding_error_handler}),
+         ('Specify the language of input text (ISO 639 2-letter identifier).'
+          '  Default is "en" (English).',
+          ['--language', '-l'], {'dest': 'language_code', 'default': 'en',
+                                 'metavar': '<name>'}),
+         ('Write dependencies (caused e.g. by file inclusions) to '
+          '<file>.  Useful in conjunction with programs like "make".',
+          ['--record-dependencies'],
+          {'metavar': '<file>', 'validator': validate_dependency_file,
+           'default': None}),           # default set in Values class
+         ('Read configuration settings from <file>, if it exists.',
+          ['--config'], {'metavar': '<file>', 'type': 'string',
+                         'action': 'callback', 'callback': read_config_file}),
+         ("Show this program's version number and exit.",
+          ['--version', '-V'], {'action': 'version'}),
+         ('Show this help message and exit.',
+          ['--help', '-h'], {'action': 'help'}),
+         # Typically not useful for non-programmatical use.
+         (SUPPRESS_HELP, ['--id-prefix'], {'default': ''}),
+         (SUPPRESS_HELP, ['--auto-id-prefix'], {'default': 'id'}),
+         # Hidden options, for development use only:
+         (SUPPRESS_HELP, ['--dump-settings'], {'action': 'store_true'}),
+         (SUPPRESS_HELP, ['--dump-internals'], {'action': 'store_true'}),
+         (SUPPRESS_HELP, ['--dump-transforms'], {'action': 'store_true'}),
+         (SUPPRESS_HELP, ['--dump-pseudo-xml'], {'action': 'store_true'}),
+         (SUPPRESS_HELP, ['--expose-internal-attribute'],
+          {'action': 'append', 'dest': 'expose_internals',
+           'validator': validate_colon_separated_string_list}),
+         (SUPPRESS_HELP, ['--strict-visitor'], {'action': 'store_true'}),
+         ))
+    """Runtime settings and command-line options common to all Docutils front
+    ends.  Setting specs specific to individual Docutils components are also
+    used (see `populate_from_components()`)."""
+
+    settings_defaults = {'_disable_config': None,
+                         '_source': None,
+                         '_destination': None,}
+    """Defaults for settings that don't have command-line option equivalents."""
+
+    relative_path_settings = ('warning_stream',)
+
+    config_section = 'general'
+
+    version_template = ('%%prog (Docutils %s [%s])'
+                        % (docutils.__version__, docutils.__version_details__))
+    """Default version message."""
+
+    def __init__(self, components=(), defaults=None, read_config_files=None,
+                 *args, **kwargs):
+        """
+        `components` is a list of Docutils components each containing a
+        ``.settings_spec`` attribute.  `defaults` is a mapping of setting
+        default overrides.
+        """
+
+        self.lists = {}
+        """Set of list-type settings."""
+
+        optparse.OptionParser.__init__(
+            self, option_class=Option, add_help_option=None,
+            formatter=optparse.TitledHelpFormatter(width=78),
+            *args, **kwargs)
+        if not self.version:
+            self.version = self.version_template
+        # Make an instance copy (it will be modified):
+        self.relative_path_settings = list(self.relative_path_settings)
+        self.components = (self,) + tuple(components)
+        self.populate_from_components(self.components)
+        self.set_defaults(**(defaults or {}))
+        if read_config_files and not self.defaults['_disable_config']:
+            try:
+                config_settings = self.get_standard_config_settings()
+            except ValueError, error:
+                self.error(error)
+            self.set_defaults(**config_settings.__dict__)
+
+    def populate_from_components(self, components):
+        """
+        For each component, first populate from the `SettingsSpec.settings_spec`
+        structure, then from the `SettingsSpec.settings_defaults` dictionary.
+        After all components have been processed, check for and populate from
+        each component's `SettingsSpec.settings_default_overrides` dictionary.
+        """
+        for component in components:
+            if component is None:
+                continue
+            settings_spec = component.settings_spec
+            self.relative_path_settings.extend(
+                component.relative_path_settings)
+            for i in range(0, len(settings_spec), 3):
+                title, description, option_spec = settings_spec[i:i+3]
+                if title:
+                    group = optparse.OptionGroup(self, title, description)
+                    self.add_option_group(group)
+                else:
+                    group = self        # single options
+                for (help_text, option_strings, kwargs) in option_spec:
+                    option = group.add_option(help=help_text, *option_strings,
+                                              **kwargs)
+                    if kwargs.get('action') == 'append':
+                        self.lists[option.dest] = 1
+                if component.settings_defaults:
+                    self.defaults.update(component.settings_defaults)
+        for component in components:
+            if component and component.settings_default_overrides:
+                self.defaults.update(component.settings_default_overrides)
+
+    def get_standard_config_files(self):
+        """Return list of config files, from environment or standard."""
+        try:
+            config_files = os.environ['DOCUTILSCONFIG'].split(os.pathsep)
+        except KeyError:
+            config_files = self.standard_config_files
+        return [os.path.expanduser(f) for f in config_files if f.strip()]
+
+    def get_standard_config_settings(self):
+        settings = Values()
+        for filename in self.get_standard_config_files():
+            settings.update(self.get_config_file_settings(filename), self)
+        return settings
+
+    def get_config_file_settings(self, config_file):
+        """Returns a dictionary containing appropriate config file settings."""
+        parser = ConfigParser()
+        parser.read(config_file, self)
+        base_path = os.path.dirname(config_file)
+        applied = {}
+        settings = Values()
+        for component in self.components:
+            if not component:
+                continue
+            for section in (tuple(component.config_section_dependencies or ())
+                            + (component.config_section,)):
+                if applied.has_key(section):
+                    continue
+                applied[section] = 1
+                settings.update(parser.get_section(section), self)
+        make_paths_absolute(
+            settings.__dict__, self.relative_path_settings, base_path)
+        return settings.__dict__
+
+    def check_values(self, values, args):
+        """Store positional arguments as runtime settings."""
+        values._source, values._destination = self.check_args(args)
+        make_paths_absolute(values.__dict__, self.relative_path_settings,
+                            os.getcwd())
+        return values
+
+    def check_args(self, args):
+        source = destination = None
+        if args:
+            source = args.pop(0)
+            if source == '-':           # means stdin
+                source = None
+        if args:
+            destination = args.pop(0)
+            if destination == '-':      # means stdout
+                destination = None
+        if args:
+            self.error('Maximum 2 arguments allowed.')
+        if source and source == destination:
+            self.error('Do not specify the same file for both source and '
+                       'destination.  It will clobber the source file.')
+        return source, destination
+
+    def get_default_values(self):
+        """Needed to get custom `Values` instances."""
+        return Values(self.defaults)
+
+    def get_option_by_dest(self, dest):
+        """
+        Get an option by its dest.
+
+        If you're supplying a dest which is shared by several options,
+        it is undefined which option of those is returned.
+
+        A KeyError is raised if there is no option with the supplied
+        dest.
+        """
+        for group in self.option_groups + [self]:
+            for option in group.option_list:
+                if option.dest == dest:
+                    return option
+        raise KeyError('No option with dest == %r.' % dest)
+
+
+class ConfigParser(CP.ConfigParser):
+
+    old_settings = {
+        'pep_stylesheet': ('pep_html writer', 'stylesheet'),
+        'pep_stylesheet_path': ('pep_html writer', 'stylesheet_path'),
+        'pep_template': ('pep_html writer', 'template')}
+    """{old setting: (new section, new setting)} mapping, used by
+    `handle_old_config`, to convert settings from the old [options] section."""
+
+    old_warning = """
+The "[option]" section is deprecated.  Support for old-format configuration
+files may be removed in a future Docutils release.  Please revise your
+configuration files.  See <http://docutils.sf.net/docs/user/config.html>,
+section "Old-Format Configuration Files".
+"""
+
+    def read(self, filenames, option_parser):
+        if type(filenames) in (types.StringType, types.UnicodeType):
+            filenames = [filenames]
+        for filename in filenames:
+            CP.ConfigParser.read(self, filename)
+            if self.has_section('options'):
+                self.handle_old_config(filename)
+            self.validate_settings(filename, option_parser)
+
+    def handle_old_config(self, filename):
+        warnings.warn_explicit(self.old_warning, ConfigDeprecationWarning,
+                               filename, 0)
+        options = self.get_section('options')
+        if not self.has_section('general'):
+            self.add_section('general')
+        for key, value in options.items():
+            if self.old_settings.has_key(key):
+                section, setting = self.old_settings[key]
+                if not self.has_section(section):
+                    self.add_section(section)
+            else:
+                section = 'general'
+                setting = key
+            if not self.has_option(section, setting):
+                self.set(section, setting, value)
+        self.remove_section('options')
+
+    def validate_settings(self, filename, option_parser):
+        """
+        Call the validator function and implement overrides on all applicable
+        settings.
+        """
+        for section in self.sections():
+            for setting in self.options(section):
+                try:
+                    option = option_parser.get_option_by_dest(setting)
+                except KeyError:
+                    continue
+                if option.validator:
+                    value = self.get(section, setting, raw=1)
+                    try:
+                        new_value = option.validator(
+                            setting, value, option_parser,
+                            config_parser=self, config_section=section)
+                    except Exception, error:
+                        raise (ValueError(
+                            'Error in config file "%s", section "[%s]":\n'
+                            '    %s: %s\n        %s = %s'
+                            % (filename, section, error.__class__.__name__,
+                               error, setting, value)), None, sys.exc_info()[2])
+                    self.set(section, setting, new_value)
+                if option.overrides:
+                    self.set(section, option.overrides, None)
+
+    def optionxform(self, optionstr):
+        """
+        Transform '-' to '_' so the cmdline form of option names can be used.
+        """
+        return optionstr.lower().replace('-', '_')
+
+    def get_section(self, section):
+        """
+        Return a given section as a dictionary (empty if the section
+        doesn't exist).
+        """
+        section_dict = {}
+        if self.has_section(section):
+            for option in self.options(section):
+                section_dict[option] = self.get(section, option, raw=1)
+        return section_dict
+
+
+class ConfigDeprecationWarning(DeprecationWarning):
+    """Warning for deprecated configuration file features."""
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/languages/de.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/languages/de.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/languages/de.py (revision 3)
@@ -0,0 +1,60 @@
+# Authors:   David Goodger; Gunnar Schwant
+# Contact:   goodger@users.sourceforge.net
+# Revision:  $Revision: 2224 $
+# Date:      $Date: 2004-06-05 21:40:46 +0200 (Sat, 05 Jun 2004) $
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+German language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+    'author': 'Autor',
+    'authors': 'Autoren',
+    'organization': 'Organisation',
+    'address': 'Adresse',
+    'contact': 'Kontakt',
+    'version': 'Version',
+    'revision': 'Revision',
+    'status': 'Status',
+    'date': 'Datum',
+    'dedication': 'Widmung',
+    'copyright': 'Copyright',
+    'abstract': 'Zusammenfassung',
+    'attention': 'Achtung!',
+    'caution': 'Vorsicht!',
+    'danger': '!GEFAHR!',
+    'error': 'Fehler',
+    'hint': 'Hinweis',
+    'important': 'Wichtig',
+    'note': 'Bemerkung',
+    'tip': 'Tipp',
+    'warning': 'Warnung',
+    'contents': 'Inhalt'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+    'autor': 'author',
+    'autoren': 'authors',
+    'organisation': 'organization',
+    'adresse': 'address',
+    'kontakt': 'contact',
+    'version': 'version',
+    'revision': 'revision',
+    'status': 'status',
+    'datum': 'date',
+    'copyright': 'copyright',
+    'widmung': 'dedication',
+    'zusammenfassung': 'abstract'}
+"""German (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/languages/sv.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/languages/sv.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/languages/sv.py (revision 3)
@@ -0,0 +1,61 @@
+# Author:    Adam Chodorowski
+# Contact:   chodorowski@users.sourceforge.net
+# Revision:  $Revision: 2224 $
+# Date:      $Date: 2004-06-05 21:40:46 +0200 (Sat, 05 Jun 2004) $
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Swedish language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+    'author':       u'F\u00f6rfattare',
+    'authors':      u'F\u00f6rfattare',
+    'organization': u'Organisation',
+    'address':      u'Adress',
+    'contact':      u'Kontakt',
+    'version':      u'Version',
+    'revision':     u'Revision',
+    'status':       u'Status',
+    'date':         u'Datum',
+    'copyright':    u'Copyright',
+    'dedication':   u'Dedikation',
+    'abstract':     u'Sammanfattning',
+    'attention':    u'Observera!',
+    'caution':      u'Varning!',
+    'danger':       u'FARA!',
+    'error':        u'Fel',
+    'hint':         u'V\u00e4gledning',
+    'important':    u'Viktigt',
+    'note':         u'Notera',
+    'tip':          u'Tips',
+    'warning':      u'Varning',
+    'contents':     u'Inneh\u00e5ll' }
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+    # 'Author' and 'Authors' identical in Swedish; assume the plural:
+    u'f\u00f6rfattare': 'authors',
+    u' n/a':            'author',
+    u'organisation':    'organization',
+    u'adress':          'address',
+    u'kontakt':         'contact',
+    u'version':         'version',
+    u'revision':        'revision',
+    u'status':          'status',
+    u'datum':           'date',
+    u'copyright':       'copyright',
+    u'dedikation':      'dedication', 
+    u'sammanfattning':  'abstract' }
+"""Swedish (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/languages/ja.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/languages/ja.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/languages/ja.py (revision 3)
@@ -0,0 +1,63 @@
+# -*- coding: utf-8 -*-
+# Author: Hisashi Morita
+# Contact: hisashim@kt.rim.or.jp
+# Revision: $Revision: 4167 $
+# Date: $Date: 2005-12-10 03:29:55 +0100 (Sat, 10 Dec 2005) $
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Japanese-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      # fixed: language-dependent
+      'author': u'闡苓�,
+      'authors': u'闡苓�,
+      'organization': u'邨�ｹ�,
+      'address': u'菴乗園',
+      'contact': u'騾｣邨｡蜈�,
+      'version': u'繝舌�繧ｸ繝ｧ繝ｳ',
+      'revision': u'繝ｪ繝薙ず繝ｧ繝ｳ',
+      'status': u'繧ｹ繝��繧ｿ繧ｹ',
+      'date': u'譌･莉�,
+      'copyright': u'闡嶺ｽ懈ｨｩ',
+      'dedication': u'迪ｮ霎�,
+      'abstract': u'讎りｦ�,
+      'attention': u'豕ｨ逶ｮ!',
+      'caution': u'豕ｨ諢�',
+      'danger': u'!蜊ｱ髯ｺ!',
+      'error': u'繧ｨ繝ｩ繝ｼ',
+      'hint': u'繝偵Φ繝�,
+      'important': u'驥崎ｦ�,
+      'note': u'蛯呵�,
+      'tip': u'騾壼ｱ',
+      'warning': u'隴ｦ蜻�,
+      'contents': u'逶ｮ谺｡'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      # language-dependent: fixed
+      u'闡苓�: 'author',
+      u' n/a': 'authors',
+      u'邨�ｹ�: 'organization',
+      u'菴乗園': 'address',
+      u'騾｣邨｡蜈�: 'contact',
+      u'繝舌�繧ｸ繝ｧ繝ｳ': 'version',
+      u'繝ｪ繝薙ず繝ｧ繝ｳ': 'revision',
+      u'繧ｹ繝��繧ｿ繧ｹ': 'status',
+      u'譌･莉�: 'date',
+      u'闡嶺ｽ懈ｨｩ': 'copyright',
+      u'迪ｮ霎�: 'dedication',
+      u'讎りｦ�: 'abstract'}
+"""Japanese (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/languages/zh_tw.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/languages/zh_tw.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/languages/zh_tw.py (revision 3)
@@ -0,0 +1,68 @@
+# -*- coding: utf-8 -*-
+# Author: Joe YS Jaw
+# Contact: joeysj@users.sourceforge.net
+# Revision: $Revision: 3968 $
+# Date: $Date: 2005-10-29 14:28:44 +0200 (Sat, 29 Oct 2005) $
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Traditional Chinese language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      # fixed: language-dependent
+      'author': u'\u4f5c\u8005', # '菴懆� <-- Chinese word
+      'authors': u'\u4f5c\u8005\u7fa4', # '菴懆�ｾ､',
+      'organization': u'\u7d44\u7e54', # '邨�ｹ�,
+      'address': u'\u5730\u5740', # '蝨ｰ蝮',
+      'contact': u'\u9023\u7d61', # '騾｣邨｡',
+      'version': u'\u7248\u672c', # '迚域悽',
+      'revision': u'\u4fee\u8a02', # '菫ｮ險�,
+      'status': u'\u72c0\u614b', # '迢諷�,
+      'date': u'\u65e5\u671f', # '譌･譛�,
+      'copyright': u'\u7248\u6b0a', # '迚域ｬ�,
+      'dedication': u'\u984c\u737b', # '鬘檎砂',
+      'abstract': u'\u6458\u8981', # '鞫倩ｦ�,
+      'attention': u'\u6ce8\u610f\uff01', # '豕ｨ諢擾ｼ�,
+      'caution': u'\u5c0f\u5fc3\uff01', # '蟆丞ｿ�ｼ�,
+      'danger': u'\uff01\u5371\u96aa\uff01', # '�∝些髫ｪ��,
+      'error': u'\u932f\u8aa4', # '骭ｯ隱､',
+      'hint': u'\u63d0\u793a', # '謠千､ｺ',
+      'important': u'\u91cd\u8981', # '豕ｨ諢擾ｼ�,
+      'note': u'\u8a3b\u91cb', # '險ｻ驥�,
+      'tip': u'\u79d8\u8a23', # '遘倩ｨ｣',
+      'warning': u'\u8b66\u544a', # '隴ｦ蜻�,
+      'contents': u'\u76ee\u9304' # '逶ｮ骭�
+} 
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      # language-dependent: fixed
+      'author (translation required)': 'author',
+      'authors (translation required)': 'authors',
+      'organization (translation required)': 'organization',
+      'address (translation required)': 'address',
+      'contact (translation required)': 'contact',
+      'version (translation required)': 'version',
+      'revision (translation required)': 'revision',
+      'status (translation required)': 'status',
+      'date (translation required)': 'date',
+      'copyright (translation required)': 'copyright',
+      'dedication (translation required)': 'dedication',
+      'abstract (translation required)': 'abstract'}
+"""Traditional Chinese to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',',
+                     u'\uff1b', # '��
+                     u'\uff0c', # '��
+                     u'\u3001', # '縲�
+                    ]
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/languages/fi.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/languages/fi.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/languages/fi.py (revision 3)
@@ -0,0 +1,62 @@
+# Author: Asko Soukka
+# Contact: asko.soukka@iki.fi
+# Revision: $Revision: 2609 $
+# Date: $Date: 2004-09-13 21:25:33 +0200 (Mon, 13 Sep 2004) $
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Finnish-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      # fixed: language-dependent
+      u'author': u'Tekij\u00e4',
+      u'authors': u'Tekij\u00e4t',
+      u'organization': u'Yhteis\u00f6',
+      u'address': u'Osoite',
+      u'contact': u'Yhteystiedot',
+      u'version': u'Versio',
+      u'revision': u'Vedos',
+      u'status': u'Tila',
+      u'date': u'P\u00e4iv\u00e4ys',
+      u'copyright': u'Tekij\u00e4noikeudet',
+      u'dedication': u'Omistuskirjoitus',
+      u'abstract': u'Tiivistelm\u00e4',
+      u'attention': u'Huomio!',
+      u'caution': u'Varo!',
+      u'danger': u'!VAARA!',
+      u'error': u'Virhe',
+      u'hint': u'Vihje',
+      u'important': u'T\u00e4rke\u00e4\u00e4',
+      u'note': u'Huomautus',
+      u'tip': u'Neuvo',
+      u'warning': u'Varoitus',
+      u'contents': u'Sis\u00e4llys'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      # language-dependent: fixed
+      u'tekij\u00e4': u'author',
+      u'tekij\u00e4t': u'authors',
+      u'yhteis\u00f6': u'organization',
+      u'osoite': u'address',
+      u'yhteystiedot': u'contact',
+      u'versio': u'version',
+      u'vedos': u'revision',
+      u'tila': u'status',
+      u'p\u00e4iv\u00e4ys': u'date',
+      u'tekij\u00e4noikeudet': u'copyright',
+      u'omistuskirjoitus': u'dedication',
+      u'tiivistelm\u00e4': u'abstract'}
+"""Finnish (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/languages/__init__.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/languages/__init__.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/languages/__init__.py (revision 3)
@@ -0,0 +1,23 @@
+# Author: David Goodger
+# Contact: goodger@users.sourceforge.net
+# Revision: $Revision: 2224 $
+# Date: $Date: 2004-06-05 21:40:46 +0200 (Sat, 05 Jun 2004) $
+# Copyright: This module has been placed in the public domain.
+
+# Internationalization details are documented in
+# <http://docutils.sf.net/docs/howto/i18n.html>.
+
+"""
+This package contains modules for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+_languages = {}
+
+def get_language(language_code):
+    if _languages.has_key(language_code):
+        return _languages[language_code]
+    module = __import__(language_code, globals(), locals())
+    _languages[language_code] = module
+    return module
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/languages/zh_cn.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/languages/zh_cn.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/languages/zh_cn.py (revision 3)
@@ -0,0 +1,69 @@
+# -*- coding: utf-8 -*-
+# Author: Pan Junyong
+# Contact: panjy@zopechina.com
+# Revision: $Revision: 4203 $
+# Date: $Date: 2005-12-13 23:28:42 +0100 (Tue, 13 Dec 2005) $
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Simplified Chinese language mappings for language-dependent features
+of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      # fixed: language-dependent
+      'author': u'菴懆�,
+      'authors': u'菴懆�ｾ､',
+      'organization': u'扈�ｻ�,
+      'address': u'蝨ｰ蝮',
+      'contact': u'閨皮ｳｻ',
+      'version': u'迚域悽',
+      'revision': u'菫ｮ隶｢',
+      'status': u'迥ｶ諤�,
+      'date': u'譌･譛�,
+      'copyright': u'迚域揀',
+      'dedication': u'迪ｮ霎�,
+      'abstract': u'鞫倩ｦ�,
+      'attention': u'豕ｨ諢�,
+      'caution': u'蟆丞ｿ�,
+      'danger': u'蜊ｱ髯ｩ',
+      'error': u'髞呵ｯｯ',
+      'hint': u'謠千､ｺ',
+      'important': u'驥崎ｦ�,
+      'note': u'豕ｨ隗｣',
+      'tip': u'謚蟾ｧ',
+      'warning': u'隴ｦ蜻�,
+      'contents': u'逶ｮ蠖�,
+} 
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      # language-dependent: fixed
+      u'菴懆�: 'author',
+      u'菴懆�ｾ､': 'authors',
+      u'扈�ｻ�: 'organization',
+      u'蝨ｰ蝮': 'address',
+      u'閨皮ｳｻ': 'contact',
+      u'迚域悽': 'version',
+      u'菫ｮ隶｢': 'revision',
+      u'迥ｶ諤�: 'status',
+      u'譌ｶ髣ｴ': 'date',
+      u'迚域揀': 'copyright',
+      u'迪ｮ霎�: 'dedication',
+      u'鞫倩ｦ�: 'abstract'}
+"""Simplified Chinese to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',',
+                     u'\uff1b', # '��
+                     u'\uff0c', # '��
+                     u'\u3001', # '縲�
+                    ]
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/languages/en.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/languages/en.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/languages/en.py (revision 3)
@@ -0,0 +1,62 @@
+# Author: David Goodger
+# Contact: goodger@users.sourceforge.net
+# Revision: $Revision: 2224 $
+# Date: $Date: 2004-06-05 21:40:46 +0200 (Sat, 05 Jun 2004) $
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+English-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      # fixed: language-dependent
+      'author': 'Author',
+      'authors': 'Authors',
+      'organization': 'Organization',
+      'address': 'Address',
+      'contact': 'Contact',
+      'version': 'Version',
+      'revision': 'Revision',
+      'status': 'Status',
+      'date': 'Date',
+      'copyright': 'Copyright',
+      'dedication': 'Dedication',
+      'abstract': 'Abstract',
+      'attention': 'Attention!',
+      'caution': 'Caution!',
+      'danger': '!DANGER!',
+      'error': 'Error',
+      'hint': 'Hint',
+      'important': 'Important',
+      'note': 'Note',
+      'tip': 'Tip',
+      'warning': 'Warning',
+      'contents': 'Contents'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      # language-dependent: fixed
+      'author': 'author',
+      'authors': 'authors',
+      'organization': 'organization',
+      'address': 'address',
+      'contact': 'contact',
+      'version': 'version',
+      'revision': 'revision',
+      'status': 'status',
+      'date': 'date',
+      'copyright': 'copyright',
+      'dedication': 'dedication',
+      'abstract': 'abstract'}
+"""English (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/languages/eo.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/languages/eo.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/languages/eo.py (revision 3)
@@ -0,0 +1,63 @@
+# Author: Marcelo Huerta San Martin
+# Contact: richieadler@users.sourceforge.net
+# Revision: $Revision: 2224 $
+# Date: $Date: 2004-06-05 21:40:46 +0200 (Sat, 05 Jun 2004) $
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Esperanto-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      # fixed: language-dependent
+      'author': u'A\u016dtoro',
+      'authors': u'A\u016dtoroj',
+      'organization': u'Organizo',
+      'address': u'Adreso',
+      'contact': u'Kontakto',
+      'version': u'Versio',
+      'revision': u'Revido',
+      'status': u'Stato',
+      'date': u'Dato',
+      # 'copyright': u'Kopirajto',
+      'copyright': u'A\u016dtorrajto',
+      'dedication': u'Dedi\u0109o',
+      'abstract': u'Resumo',
+      'attention': u'Atentu!',
+      'caution': u'Zorgu!',
+      'danger': u'DAN\u011cERO!',
+      'error': u'Eraro',
+      'hint': u'Spuro',
+      'important': u'Grava',
+      'note': u'Noto',
+      'tip': u'Helpeto',
+      'warning': u'Averto',
+      'contents': u'Enhavo'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      # language-dependent: fixed
+      'a\u016dtoro': 'author',
+      'a\u016dtoroj': 'authors',
+      'organizo': 'organization',
+      'adreso': 'address',
+      'kontakto': 'contact',
+      'versio': 'version',
+      'revido': 'revision',
+      'stato': 'status',
+      'dato': 'date',
+      'a\u016dtorrajto': 'copyright',
+      'dedi\u0109o': 'dedication',
+      'resumo': 'abstract'}
+"""Esperanto (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/languages/cs.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/languages/cs.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/languages/cs.py (revision 3)
@@ -0,0 +1,62 @@
+# Author: Marek Blaha
+# Contact: mb@dat.cz
+# Revision: $Revision: 2224 $
+# Date: $Date: 2004-06-05 21:40:46 +0200 (Sat, 05 Jun 2004) $
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Czech-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      # fixed: language-dependent
+      'author': u'Autor',
+      'authors': u'Auto\u0159i',
+      'organization': u'Organizace',
+      'address': u'Adresa',
+      'contact': u'Kontakt',
+      'version': u'Verze',
+      'revision': u'Revize',
+      'status': u'Stav',
+      'date': u'Datum',
+      'copyright': u'Copyright',
+      'dedication': u'V\u011Bnov\u00E1n\u00ED',
+      'abstract': u'Abstrakt',
+      'attention': u'Pozor!',
+      'caution': u'Opatrn\u011B!',
+      'danger': u'!NEBEZPE\u010C\u00CD!',
+      'error': u'Chyba',
+      'hint': u'Rada',
+      'important': u'D\u016Fle\u017Eit\u00E9',
+      'note': u'Pozn\u00E1mka',
+      'tip': u'Tip',
+      'warning': u'Varov\u00E1n\u00ED',
+      'contents': u'Obsah'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      # language-dependent: fixed
+      u'autor': 'author',
+      u'auto\u0159i': 'authors',
+      u'organizace': 'organization',
+      u'adresa': 'address',
+      u'kontakt': 'contact',
+      u'verze': 'version',
+      u'revize': 'revision',
+      u'stav': 'status',
+      u'datum': 'date',
+      u'copyright': 'copyright',
+      u'v\u011Bnov\u00E1n\u00ED': 'dedication',
+      u'abstrakt': 'abstract'}
+"""Czech (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/languages/pt_br.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/languages/pt_br.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/languages/pt_br.py (revision 3)
@@ -0,0 +1,62 @@
+# Author: David Goodger
+# Contact: goodger@users.sourceforge.net
+# Revision: $Revision: 2333 $
+# Date: $Date: 2004-06-20 22:51:22 +0200 (Sun, 20 Jun 2004) $
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Brazilian Portuguese-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      # fixed: language-dependent
+      'author': u'Autor',
+      'authors': u'Autores',
+      'organization': u'Organiza\u00E7\u00E3o',
+      'address': u'Endere\u00E7o',
+      'contact': u'Contato',
+      'version': u'Vers\u00E3o',
+      'revision': u'Revis\u00E3o',
+      'status': u'Estado',
+      'date': u'Data',
+      'copyright': u'Copyright',
+      'dedication': u'Dedicat\u00F3ria',
+      'abstract': u'Resumo',
+      'attention': u'Atten\u00E7\u00E3o!',
+      'caution': u'Cuidado!',
+      'danger': u'PERIGO!',
+      'error': u'Erro',
+      'hint': u'Sugest\u00E3o',
+      'important': u'Importante',
+      'note': u'Nota',
+      'tip': u'Dica',
+      'warning': u'Aviso',
+      'contents': u'Sum\u00E1rio'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      # language-dependent: fixed
+      u'autor': 'author',
+      u'autores': 'authors',
+      u'organiza\u00E7\u00E3o': 'organization',
+      u'endere\u00E7o': 'address',
+      u'contato': 'contact',
+      u'vers\u00E3o': 'version',
+      u'revis\u00E3o': 'revision',
+      u'estado': 'status',
+      u'data': 'date',
+      u'copyright': 'copyright',
+      u'dedicat\u00F3ria': 'dedication',
+      u'resumo': 'abstract'}
+"""Brazilian Portuguese (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/languages/fr.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/languages/fr.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/languages/fr.py (revision 3)
@@ -0,0 +1,60 @@
+# Author: Stefane Fermigier
+# Contact: sf@fermigier.com
+# Revision: $Revision: 2224 $
+# Date: $Date: 2004-06-05 21:40:46 +0200 (Sat, 05 Jun 2004) $
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+French-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      u'author': u'Auteur',
+      u'authors': u'Auteurs',
+      u'organization': u'Organisation',
+      u'address': u'Adresse',
+      u'contact': u'Contact',
+      u'version': u'Version',
+      u'revision': u'R\u00e9vision',
+      u'status': u'Statut',
+      u'date': u'Date',
+      u'copyright': u'Copyright',
+      u'dedication': u'D\u00e9dicace',
+      u'abstract': u'R\u00e9sum\u00e9',
+      u'attention': u'Attention!',
+      u'caution': u'Avertissement!',
+      u'danger': u'!DANGER!',
+      u'error': u'Erreur',
+      u'hint': u'Indication',
+      u'important': u'Important',
+      u'note': u'Note',
+      u'tip': u'Astuce',
+      u'warning': u'Avis',
+      u'contents': u'Sommaire'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      u'auteur': u'author',
+      u'auteurs': u'authors',
+      u'organisation': u'organization',
+      u'adresse': u'address',
+      u'contact': u'contact',
+      u'version': u'version',
+      u'r\u00e9vision': u'revision',
+      u'statut': u'status',
+      u'date': u'date',
+      u'copyright': u'copyright',
+      u'd\u00e9dicace': u'dedication',
+      u'r\u00e9sum\u00e9': u'abstract'}
+"""French (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/languages/es.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/languages/es.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/languages/es.py (revision 3)
@@ -0,0 +1,61 @@
+# -*- coding: utf-8 -*-
+# Author: Marcelo Huerta San Martﾃｭn
+# Contact: mghsm@uol.com.ar
+# Revision: $Revision: 3968 $
+# Date: $Date: 2005-10-29 14:28:44 +0200 (Sat, 29 Oct 2005) $
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Spanish-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      'author': u'Autor',
+      'authors': u'Autores',
+      'organization': u'Organizaci\u00f3n',
+      'address': u'Direcci\u00f3n',
+      'contact': u'Contacto',
+      'version': u'Versi\u00f3n',
+      'revision': u'Revisi\u00f3n',
+      'status': u'Estado',
+      'date': u'Fecha',
+      'copyright': u'Copyright',
+      'dedication': u'Dedicatoria',
+      'abstract': u'Resumen',
+      'attention': u'\u00a1Atenci\u00f3n!',
+      'caution': u'\u00a1Precauci\u00f3n!',
+      'danger': u'\u00a1PELIGRO!',
+      'error': u'Error',
+      'hint': u'Sugerencia',
+      'important': u'Importante',
+      'note': u'Nota',
+      'tip': u'Consejo',
+      'warning': u'Advertencia',
+      'contents': u'Contenido'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      u'autor': 'author',
+      u'autores': 'authors',
+      u'organizaci\u00f3n': 'organization',
+      u'direcci\u00f3n': 'address',
+      u'contacto': 'contact',
+      u'versi\u00f3n': 'version',
+      u'revisi\u00f3n': 'revision',
+      u'estado': 'status',
+      u'fecha': 'date',
+      u'copyright': 'copyright',
+      u'dedicatoria': 'dedication',
+      u'resumen': 'abstract'}
+"""Spanish (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/languages/nl.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/languages/nl.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/languages/nl.py (revision 3)
@@ -0,0 +1,62 @@
+# Author: Martijn Pieters
+# Contact: mjpieters@users.sourceforge.net
+# Revision: $Revision: 3058 $
+# Date: $Date: 2005-03-18 21:09:22 +0100 (Fri, 18 Mar 2005) $
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Dutch-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      # fixed: language-dependent
+      'author': 'Auteur',
+      'authors': 'Auteurs',
+      'organization': 'Organisatie',
+      'address': 'Adres',
+      'contact': 'Contact',
+      'version': 'Versie',
+      'revision': 'Revisie',
+      'status': 'Status',
+      'date': 'Datum',
+      'copyright': 'Copyright',
+      'dedication': 'Toewijding',
+      'abstract': 'Samenvatting',
+      'attention': 'Attentie!',
+      'caution': 'Let op!',
+      'danger': '!GEVAAR!',
+      'error': 'Fout',
+      'hint': 'Hint',
+      'important': 'Belangrijk',
+      'note': 'Opmerking',
+      'tip': 'Tip',
+      'warning': 'Waarschuwing',
+      'contents': 'Inhoud'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      # language-dependent: fixed
+      'auteur': 'author',
+      'auteurs': 'authors',
+      'organisatie': 'organization',
+      'adres': 'address',
+      'contact': 'contact',
+      'versie': 'version',
+      'revisie': 'revision',
+      'status': 'status',
+      'datum': 'date',
+      'copyright': 'copyright',
+      'toewijding': 'dedication',
+      'samenvatting': 'abstract'}
+"""Dutch (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/languages/it.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/languages/it.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/languages/it.py (revision 3)
@@ -0,0 +1,60 @@
+# Author: Nicola Larosa
+# Contact: docutils@tekNico.net
+# Revision: $Revision: 2944 $
+# Date: $Date: 2005-01-20 13:11:50 +0100 (Thu, 20 Jan 2005) $
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Italian-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      'author': 'Autore',
+      'authors': 'Autori',
+      'organization': 'Organizzazione',
+      'address': 'Indirizzo',
+      'contact': 'Contatti',
+      'version': 'Versione',
+      'revision': 'Revisione',
+      'status': 'Status',
+      'date': 'Data',
+      'copyright': 'Copyright',
+      'dedication': 'Dedica',
+      'abstract': 'Riassunto',
+      'attention': 'Attenzione!',
+      'caution': 'Cautela!',
+      'danger': '!PERICOLO!',
+      'error': 'Errore',
+      'hint': 'Suggerimento',
+      'important': 'Importante',
+      'note': 'Nota',
+      'tip': 'Consiglio',
+      'warning': 'Avvertenza',
+      'contents': 'Indice'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      'autore': 'author',
+      'autori': 'authors',
+      'organizzazione': 'organization',
+      'indirizzo': 'address',
+      'contatto': 'contact',
+      'versione': 'version',
+      'revisione': 'revision',
+      'status': 'status',
+      'data': 'date',
+      'copyright': 'copyright',
+      'dedica': 'dedication',
+      'riassunto': 'abstract'}
+"""Italian (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/languages/sk.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/languages/sk.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/languages/sk.py (revision 3)
@@ -0,0 +1,60 @@
+# :Author: Miroslav Vasko
+# :Contact: zemiak@zoznam.sk
+# :Revision: $Revision: 2224 $
+# :Date: $Date: 2004-06-05 21:40:46 +0200 (Sat, 05 Jun 2004) $
+# :Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Slovak-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      'author': u'Autor',
+      'authors': u'Autori',
+      'organization': u'Organiz\u00E1cia',
+      'address': u'Adresa',
+      'contact': u'Kontakt',
+      'version': u'Verzia',
+      'revision': u'Rev\u00EDzia',
+      'status': u'Stav',
+      'date': u'D\u00E1tum',
+      'copyright': u'Copyright',
+      'dedication': u'Venovanie',
+      'abstract': u'Abstraktne',
+      'attention': u'Pozor!',
+      'caution': u'Opatrne!',
+      'danger': u'!NEBEZPE\u010cENSTVO!',
+      'error': u'Chyba',
+      'hint': u'Rada',
+      'important': u'D\u00F4le\u017Eit\u00E9',
+      'note': u'Pozn\u00E1mka',
+      'tip': u'Tip',
+      'warning': u'Varovanie',
+      'contents': u'Obsah'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      u'autor': 'author',
+      u'autori': 'authors',
+      u'organiz\u00E1cia': 'organization',
+      u'adresa': 'address',
+      u'kontakt': 'contact',
+      u'verzia': 'version',
+      u'rev\u00EDzia': 'revision',
+      u'stav': 'status',
+      u'd\u00E1tum': 'date',
+      u'copyright': 'copyright',
+      u'venovanie': 'dedication',
+      u'abstraktne': 'abstract'}
+"""Slovak (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/languages/ca.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/languages/ca.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/languages/ca.py (revision 3)
@@ -0,0 +1,62 @@
+# Author: Ivan Vilata i Balaguer
+# Contact: ivan@selidor.net
+# Revision: $Revision: 3276 $
+# Date: $Date: 2005-04-30 13:34:52 +0200 (Sat, 30 Apr 2005) $
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Catalan-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      # fixed: language-dependent
+      'author': u'Autor',
+      'authors': u'Autors',
+      'organization': u'Organitzaci\u00F3',
+      'address': u'Adre\u00E7a',
+      'contact': u'Contacte',
+      'version': u'Versi\u00F3',
+      'revision': u'Revisi\u00F3',
+      'status': u'Estat',
+      'date': u'Data',
+      'copyright': u'Copyright',
+      'dedication': u'Dedicat\u00F2ria',
+      'abstract': u'Resum',
+      'attention': u'Atenci\u00F3!',
+      'caution': u'Compte!',
+      'danger': u'PERILL!',
+      'error': u'Error',
+      'hint': u'Suggeriment',
+      'important': u'Important',
+      'note': u'Nota',
+      'tip': u'Consell',
+      'warning': u'Av\u00EDs',
+      'contents': u'Contingut'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      # language-dependent: fixed
+      u'autor': 'author',
+      u'autors': 'authors',
+      u'organitzaci\u00F3': 'organization',
+      u'adre\u00E7a': 'address',
+      u'contacte': 'contact',
+      u'versi\u00F3': 'version',
+      u'revisi\u00F3': 'revision',
+      u'estat': 'status',
+      u'data': 'date',
+      u'copyright': 'copyright',
+      u'dedicat\u00F2ria': 'dedication',
+      u'resum': 'abstract'}
+"""Catalan (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/languages/ru.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/languages/ru.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/languages/ru.py (revision 3)
@@ -0,0 +1,68 @@
+# Author: Roman Suzi
+# Contact: rnd@onego.ru
+# Revision: $Revision: 2999 $
+# Date: $Date: 2005-03-03 20:35:02 +0100 (Thu, 03 Mar 2005) $
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Russian-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      u'abstract': u'\u0410\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f',
+      u'address': u'\u0410\u0434\u0440\u0435\u0441',
+      u'attention': u'\u0412\u043d\u0438\u043c\u0430\u043d\u0438\u0435!',
+      u'author': u'\u0410\u0432\u0442\u043e\u0440',
+      u'authors': u'\u0410\u0432\u0442\u043e\u0440\u044b',
+      u'caution': u'\u041e\u0441\u0442\u043e\u0440\u043e\u0436\u043d\u043e!',
+      u'contact': u'\u041a\u043e\u043d\u0442\u0430\u043a\u0442',
+      u'contents':
+      u'\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435',
+      u'copyright': u'\u041f\u0440\u0430\u0432\u0430 '
+      u'\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f',
+      u'danger': u'\u041e\u041f\u0410\u0421\u041d\u041e!',
+      u'date': u'\u0414\u0430\u0442\u0430',
+      u'dedication':
+      u'\u041f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0438\u0435',
+      u'error': u'\u041e\u0448\u0438\u0431\u043a\u0430',
+      u'hint': u'\u0421\u043e\u0432\u0435\u0442',
+      u'important': u'\u0412\u0430\u0436\u043d\u043e',
+      u'note': u'\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435',
+      u'organization':
+      u'\u041e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f',
+      u'revision': u'\u0420\u0435\u0434\u0430\u043a\u0446\u0438\u044f',
+      u'status': u'\u0421\u0442\u0430\u0442\u0443\u0441',
+      u'tip': u'\u041f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430',
+      u'version': u'\u0412\u0435\u0440\u0441\u0438\u044f',
+      u'warning': u'\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436'
+      u'\u0434\u0435\u043d\u0438\u0435'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      u'\u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f': u'abstract',
+      u'\u0430\u0434\u0440\u0435\u0441': u'address',
+      u'\u0430\u0432\u0442\u043e\u0440': u'author',
+      u'\u0430\u0432\u0442\u043e\u0440\u044b': u'authors',
+      u'\u043a\u043e\u043d\u0442\u0430\u043a\u0442': u'contact',
+      u'\u043f\u0440\u0430\u0432\u0430 \u043a\u043e\u043f\u0438\u0440\u043e'
+      u'\u0432\u0430\u043d\u0438\u044f': u'copyright',
+      u'\u0434\u0430\u0442\u0430': u'date',
+      u'\u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0438\u0435':
+      u'dedication',
+      u'\u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f':
+      u'organization',
+      u'\u0440\u0435\u0434\u0430\u043a\u0446\u0438\u044f': u'revision',
+      u'\u0441\u0442\u0430\u0442\u0443\u0441': u'status',
+      u'\u0432\u0435\u0440\u0441\u0438\u044f': u'version'}
+"""Russian (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators =  [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/languages/af.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/languages/af.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/languages/af.py (revision 3)
@@ -0,0 +1,60 @@
+# Author: Jannie Hofmeyr
+# Contact: jhsh@sun.ac.za
+# Revision: $Revision: 2224 $
+# Date: $Date: 2004-06-05 21:40:46 +0200 (Sat, 05 Jun 2004) $
+# Copyright: This module has been placed in the public domain.
+
+# New language mappings are welcome.  Before doing a new translation, please
+# read <http://docutils.sf.net/docs/howto/i18n.html>.  Two files must be
+# translated for each language: one in docutils/languages, the other in
+# docutils/parsers/rst/languages.
+
+"""
+Afrikaans-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+      'author': 'Auteur',
+      'authors': 'Auteurs',
+      'organization': 'Organisasie',
+      'address': 'Adres',
+      'contact': 'Kontak',
+      'version': 'Weergawe',
+      'revision': 'Revisie',
+      'status': 'Status',
+      'date': 'Datum',
+      'copyright': 'Kopiereg',
+      'dedication': 'Opdrag',
+      'abstract': 'Opsomming',
+      'attention': 'Aandag!',
+      'caution': 'Wees versigtig!',
+      'danger': '!GEVAAR!',
+      'error': 'Fout',
+      'hint': 'Wenk',
+      'important': 'Belangrik',
+      'note': 'Nota',
+      'tip': 'Tip', # hint and tip both have the same translation: wenk
+      'warning': 'Waarskuwing',
+      'contents': 'Inhoud'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+      'auteur': 'author',
+      'auteurs': 'authors',
+      'organisasie': 'organization',
+      'adres': 'address',
+      'kontak': 'contact',
+      'weergawe': 'version',
+      'revisie': 'revision',
+      'status': 'status',
+      'datum': 'date',
+      'kopiereg': 'copyright',
+      'opdrag': 'dedication',
+      'opsomming': 'abstract'}
+"""Afrikaans (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/utils.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/utils.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/utils.py (revision 3)
@@ -0,0 +1,580 @@
+# Author: David Goodger
+# Contact: goodger@users.sourceforge.net
+# Revision: $Revision: 4152 $
+# Date: $Date: 2005-12-08 00:46:30 +0100 (Thu, 08 Dec 2005) $
+# Copyright: This module has been placed in the public domain.
+
+"""
+Miscellaneous utilities for the documentation utilities.
+"""
+
+__docformat__ = 'reStructuredText'
+
+import sys
+import os
+import os.path
+import types
+import warnings
+import unicodedata
+from types import StringType, UnicodeType
+from docutils import ApplicationError, DataError
+from docutils import frontend, nodes
+
+
+class SystemMessage(ApplicationError):
+
+    def __init__(self, system_message, level):
+        Exception.__init__(self, system_message.astext())
+        self.level = level
+
+
+class SystemMessagePropagation(ApplicationError): pass
+
+
+class Reporter:
+
+    """
+    Info/warning/error reporter and ``system_message`` element generator.
+
+    Five levels of system messages are defined, along with corresponding
+    methods: `debug()`, `info()`, `warning()`, `error()`, and `severe()`.
+
+    There is typically one Reporter object per process.  A Reporter object is
+    instantiated with thresholds for reporting (generating warnings) and
+    halting processing (raising exceptions), a switch to turn debug output on
+    or off, and an I/O stream for warnings.  These are stored as instance
+    attributes.
+
+    When a system message is generated, its level is compared to the stored
+    thresholds, and a warning or error is generated as appropriate.  Debug
+    messages are produced iff the stored debug switch is on, independently of
+    other thresholds.  Message output is sent to the stored warning stream if
+    not set to ''.
+
+    The Reporter class also employs a modified form of the "Observer" pattern
+    [GoF95]_ to track system messages generated.  The `attach_observer` method
+    should be called before parsing, with a bound method or function which
+    accepts system messages.  The observer can be removed with
+    `detach_observer`, and another added in its place.
+
+    .. [GoF95] Gamma, Helm, Johnson, Vlissides. *Design Patterns: Elements of
+       Reusable Object-Oriented Software*. Addison-Wesley, Reading, MA, USA,
+       1995.
+    """
+
+    levels = 'DEBUG INFO WARNING ERROR SEVERE'.split()
+    """List of names for system message levels, indexed by level."""
+
+    def __init__(self, source, report_level, halt_level, stream=None,
+                 debug=0, encoding='ascii', error_handler='replace'):
+        """
+        :Parameters:
+            - `source`: The path to or description of the source data.
+            - `report_level`: The level at or above which warning output will
+              be sent to `stream`.
+            - `halt_level`: The level at or above which `SystemMessage`
+              exceptions will be raised, halting execution.
+            - `debug`: Show debug (level=0) system messages?
+            - `stream`: Where warning output is sent.  Can be file-like (has a
+              ``.write`` method), a string (file name, opened for writing),
+              '' (empty string, for discarding all stream messages) or
+              `None` (implies `sys.stderr`; default).
+            - `encoding`: The encoding for stderr output.
+            - `error_handler`: The error handler for stderr output encoding.
+        """
+
+        self.source = source
+        """The path to or description of the source data."""
+
+        self.encoding = encoding
+        """The character encoding for the stderr output."""
+
+        self.error_handler = error_handler
+        """The character encoding error handler."""
+
+        self.debug_flag = debug
+        """Show debug (level=0) system messages?"""
+
+        self.report_level = report_level
+        """The level at or above which warning output will be sent
+        to `self.stream`."""
+
+        self.halt_level = halt_level
+        """The level at or above which `SystemMessage` exceptions
+        will be raised, halting execution."""
+
+        if stream is None:
+            stream = sys.stderr
+        elif type(stream) in (StringType, UnicodeType):
+            # Leave stream untouched if it's ''.
+            if stream != '':
+                if type(stream) == StringType:
+                    stream = open(stream, 'w')
+                elif type(stream) == UnicodeType:
+                    stream = open(stream.encode(), 'w')
+
+        self.stream = stream
+        """Where warning output is sent."""
+
+        self.observers = []
+        """List of bound methods or functions to call with each system_message
+        created."""
+
+        self.max_level = -1
+        """The highest level system message generated so far."""
+
+    def set_conditions(self, category, report_level, halt_level,
+                       stream=None, debug=0):
+        warnings.warn('docutils.utils.Reporter.set_conditions deprecated; '
+                      'set attributes via configuration settings or directly',
+                      DeprecationWarning, stacklevel=2)
+        self.report_level = report_level
+        self.halt_level = halt_level
+        if stream is None:
+            stream = sys.stderr
+        self.stream = stream
+        self.debug_flag = debug
+
+    def attach_observer(self, observer):
+        """
+        The `observer` parameter is a function or bound method which takes one
+        argument, a `nodes.system_message` instance.
+        """
+        self.observers.append(observer)
+
+    def detach_observer(self, observer):
+        self.observers.remove(observer)
+
+    def notify_observers(self, message):
+        for observer in self.observers:
+            observer(message)
+
+    def system_message(self, level, message, *children, **kwargs):
+        """
+        Return a system_message object.
+
+        Raise an exception or generate a warning if appropriate.
+        """
+        attributes = kwargs.copy()
+        if kwargs.has_key('base_node'):
+            source, line = get_source_line(kwargs['base_node'])
+            del attributes['base_node']
+            if source is not None:
+                attributes.setdefault('source', source)
+            if line is not None:
+                attributes.setdefault('line', line)
+        attributes.setdefault('source', self.source)
+        msg = nodes.system_message(message, level=level,
+                                   type=self.levels[level],
+                                   *children, **attributes)
+        if self.stream and (level >= self.report_level
+                            or self.debug_flag and level == 0):
+            msgtext = msg.astext().encode(self.encoding, self.error_handler)
+            print >>self.stream, msgtext
+        if level >= self.halt_level:
+            raise SystemMessage(msg, level)
+        if level > 0 or self.debug_flag:
+            self.notify_observers(msg)
+        self.max_level = max(level, self.max_level)
+        return msg
+
+    def debug(self, *args, **kwargs):
+        """
+        Level-0, "DEBUG": an internal reporting issue. Typically, there is no
+        effect on the processing. Level-0 system messages are handled
+        separately from the others.
+        """
+        if self.debug_flag:
+            return self.system_message(0, *args, **kwargs)
+
+    def info(self, *args, **kwargs):
+        """
+        Level-1, "INFO": a minor issue that can be ignored. Typically there is
+        no effect on processing, and level-1 system messages are not reported.
+        """
+        return self.system_message(1, *args, **kwargs)
+
+    def warning(self, *args, **kwargs):
+        """
+        Level-2, "WARNING": an issue that should be addressed. If ignored,
+        there may be unpredictable problems with the output.
+        """
+        return self.system_message(2, *args, **kwargs)
+
+    def error(self, *args, **kwargs):
+        """
+        Level-3, "ERROR": an error that should be addressed. If ignored, the
+        output will contain errors.
+        """
+        return self.system_message(3, *args, **kwargs)
+
+    def severe(self, *args, **kwargs):
+        """
+        Level-4, "SEVERE": a severe error that must be addressed. If ignored,
+        the output will contain severe errors. Typically level-4 system
+        messages are turned into exceptions which halt processing.
+        """
+        return self.system_message(4, *args, **kwargs)
+
+
+class ExtensionOptionError(DataError): pass
+class BadOptionError(ExtensionOptionError): pass
+class BadOptionDataError(ExtensionOptionError): pass
+class DuplicateOptionError(ExtensionOptionError): pass
+
+
+def extract_extension_options(field_list, options_spec):
+    """
+    Return a dictionary mapping extension option names to converted values.
+
+    :Parameters:
+        - `field_list`: A flat field list without field arguments, where each
+          field body consists of a single paragraph only.
+        - `options_spec`: Dictionary mapping known option names to a
+          conversion function such as `int` or `float`.
+
+    :Exceptions:
+        - `KeyError` for unknown option names.
+        - `ValueError` for invalid option values (raised by the conversion
+           function).
+        - `TypeError` for invalid option value types (raised by conversion
+           function).
+        - `DuplicateOptionError` for duplicate options.
+        - `BadOptionError` for invalid fields.
+        - `BadOptionDataError` for invalid option data (missing name,
+          missing data, bad quotes, etc.).
+    """
+    option_list = extract_options(field_list)
+    option_dict = assemble_option_dict(option_list, options_spec)
+    return option_dict
+
+def extract_options(field_list):
+    """
+    Return a list of option (name, value) pairs from field names & bodies.
+
+    :Parameter:
+        `field_list`: A flat field list, where each field name is a single
+        word and each field body consists of a single paragraph only.
+
+    :Exceptions:
+        - `BadOptionError` for invalid fields.
+        - `BadOptionDataError` for invalid option data (missing name,
+          missing data, bad quotes, etc.).
+    """
+    option_list = []
+    for field in field_list:
+        if len(field[0].astext().split()) != 1:
+            raise BadOptionError(
+                'extension option field name may not contain multiple words')
+        name = str(field[0].astext().lower())
+        body = field[1]
+        if len(body) == 0:
+            data = None
+        elif len(body) > 1 or not isinstance(body[0], nodes.paragraph) \
+              or len(body[0]) != 1 or not isinstance(body[0][0], nodes.Text):
+            raise BadOptionDataError(
+                  'extension option field body may contain\n'
+                  'a single paragraph only (option "%s")' % name)
+        else:
+            data = body[0][0].astext()
+        option_list.append((name, data))
+    return option_list
+
+def assemble_option_dict(option_list, options_spec):
+    """
+    Return a mapping of option names to values.
+
+    :Parameters:
+        - `option_list`: A list of (name, value) pairs (the output of
+          `extract_options()`).
+        - `options_spec`: Dictionary mapping known option names to a
+          conversion function such as `int` or `float`.
+
+    :Exceptions:
+        - `KeyError` for unknown option names.
+        - `DuplicateOptionError` for duplicate options.
+        - `ValueError` for invalid option values (raised by conversion
+           function).
+        - `TypeError` for invalid option value types (raised by conversion
+           function).
+    """
+    options = {}
+    for name, value in option_list:
+        convertor = options_spec[name]  # raises KeyError if unknown
+        if convertor is None:
+            raise KeyError(name)        # or if explicitly disabled
+        if options.has_key(name):
+            raise DuplicateOptionError('duplicate option "%s"' % name)
+        try:
+            options[name] = convertor(value)
+        except (ValueError, TypeError), detail:
+            raise detail.__class__('(option: "%s"; value: %r)\n%s'
+                                   % (name, value, ' '.join(detail.args)))
+    return options
+
+
+class NameValueError(DataError): pass
+
+
+def extract_name_value(line):
+    """
+    Return a list of (name, value) from a line of the form "name=value ...".
+
+    :Exception:
+        `NameValueError` for invalid input (missing name, missing data, bad
+        quotes, etc.).
+    """
+    attlist = []
+    while line:
+        equals = line.find('=')
+        if equals == -1:
+            raise NameValueError('missing "="')
+        attname = line[:equals].strip()
+        if equals == 0 or not attname:
+            raise NameValueError(
+                  'missing attribute name before "="')
+        line = line[equals+1:].lstrip()
+        if not line:
+            raise NameValueError(
+                  'missing value after "%s="' % attname)
+        if line[0] in '\'"':
+            endquote = line.find(line[0], 1)
+            if endquote == -1:
+                raise NameValueError(
+                      'attribute "%s" missing end quote (%s)'
+                      % (attname, line[0]))
+            if len(line) > endquote + 1 and line[endquote + 1].strip():
+                raise NameValueError(
+                      'attribute "%s" end quote (%s) not followed by '
+                      'whitespace' % (attname, line[0]))
+            data = line[1:endquote]
+            line = line[endquote+1:].lstrip()
+        else:
+            space = line.find(' ')
+            if space == -1:
+                data = line
+                line = ''
+            else:
+                data = line[:space]
+                line = line[space+1:].lstrip()
+        attlist.append((attname.lower(), data))
+    return attlist
+
+def new_reporter(source_path, settings):
+    """
+    Return a new Reporter object.
+
+    :Parameters:
+        `source` : string
+            The path to or description of the source text of the document.
+        `settings` : optparse.Values object
+            Runtime settings.
+    """
+    reporter = Reporter(
+        source_path, settings.report_level, settings.halt_level,
+        stream=settings.warning_stream, debug=settings.debug,
+        encoding=settings.error_encoding,
+        error_handler=settings.error_encoding_error_handler)
+    return reporter
+
+def new_document(source_path, settings=None):
+    """
+    Return a new empty document object.
+
+    :Parameters:
+        `source` : string
+            The path to or description of the source text of the document.
+        `settings` : optparse.Values object
+            Runtime settings.  If none provided, a default set will be used.
+    """
+    if settings is None:
+        settings = frontend.OptionParser().get_default_values()
+    reporter = new_reporter(source_path, settings)
+    document = nodes.document(settings, reporter, source=source_path)
+    document.note_source(source_path, -1)
+    return document
+
+def clean_rcs_keywords(paragraph, keyword_substitutions):
+    if len(paragraph) == 1 and isinstance(paragraph[0], nodes.Text):
+        textnode = paragraph[0]
+        for pattern, substitution in keyword_substitutions:
+            match = pattern.search(textnode.data)
+            if match:
+                textnode.data = pattern.sub(substitution, textnode.data)
+                return
+
+def relative_path(source, target):
+    """
+    Build and return a path to `target`, relative to `source` (both files).
+
+    If there is no common prefix, return the absolute path to `target`.
+    """
+    source_parts = os.path.abspath(source or 'dummy_file').split(os.sep)
+    target_parts = os.path.abspath(target).split(os.sep)
+    # Check first 2 parts because '/dir'.split('/') == ['', 'dir']:
+    if source_parts[:2] != target_parts[:2]:
+        # Nothing in common between paths.
+        # Return absolute path, using '/' for URLs:
+        return '/'.join(target_parts)
+    source_parts.reverse()
+    target_parts.reverse()
+    while (source_parts and target_parts
+           and source_parts[-1] == target_parts[-1]):
+        # Remove path components in common:
+        source_parts.pop()
+        target_parts.pop()
+    target_parts.reverse()
+    parts = ['..'] * (len(source_parts) - 1) + target_parts
+    return '/'.join(parts)
+
+def get_stylesheet_reference(settings, relative_to=None):
+    """
+    Retrieve a stylesheet reference from the settings object.
+    """
+    if settings.stylesheet_path:
+        assert not settings.stylesheet, \
+               'stylesheet and stylesheet_path are mutually exclusive.'
+        if relative_to == None:
+            relative_to = settings._destination
+        return relative_path(relative_to, settings.stylesheet_path)
+    else:
+        return settings.stylesheet
+
+def get_trim_footnote_ref_space(settings):
+    """
+    Return whether or not to trim footnote space.
+
+    If trim_footnote_reference_space is not None, return it.
+
+    If trim_footnote_reference_space is None, return False unless the
+    footnote reference style is 'superscript'.
+    """
+    if settings.trim_footnote_reference_space is None:
+        return hasattr(settings, 'footnote_references') and \
+               settings.footnote_references == 'superscript'
+    else:
+        return settings.trim_footnote_reference_space
+
+def get_source_line(node):
+    """
+    Return the "source" and "line" attributes from the `node` given or from
+    its closest ancestor.
+    """
+    while node:
+        if node.source or node.line:
+            return node.source, node.line
+        node = node.parent
+    return None, None
+
+def escape2null(text):
+    """Return a string with escape-backslashes converted to nulls."""
+    parts = []
+    start = 0
+    while 1:
+        found = text.find('\\', start)
+        if found == -1:
+            parts.append(text[start:])
+            return ''.join(parts)
+        parts.append(text[start:found])
+        parts.append('\x00' + text[found+1:found+2])
+        start = found + 2               # skip character after escape
+
+def unescape(text, restore_backslashes=0):
+    """
+    Return a string with nulls removed or restored to backslashes.
+    Backslash-escaped spaces are also removed.
+    """
+    if restore_backslashes:
+        return text.replace('\x00', '\\')
+    else:
+        for sep in ['\x00 ', '\x00\n', '\x00']:
+            text = ''.join(text.split(sep))
+        return text
+
+east_asian_widths = {'W': 2,   # Wide
+                     'F': 2,   # Full-width (wide)
+                     'Na': 1,  # Narrow
+                     'H': 1,   # Half-width (narrow)
+                     'N': 1,   # Neutral (not East Asian, treated as narrow)
+                     'A': 1}   # Ambiguous (s/b wide in East Asian context,
+                               # narrow otherwise, but that doesn't work)
+"""Mapping of result codes from `unicodedata.east_asian_width()` to character
+column widths."""
+
+def east_asian_column_width(text):
+    if isinstance(text, types.UnicodeType):
+        total = 0
+        for c in text:
+            total += east_asian_widths[unicodedata.east_asian_width(c)]
+        return total
+    else:
+        return len(text)
+
+if hasattr(unicodedata, 'east_asian_width'):
+    column_width = east_asian_column_width
+else:
+    column_width = len
+
+
+class DependencyList:
+
+    """
+    List of dependencies, with file recording support.
+
+    Note that the output file is not automatically closed.  You have
+    to explicitly call the close() method.
+    """
+
+    def __init__(self, output_file=None, dependencies=[]):
+        """
+        Initialize the dependency list, automatically setting the
+        output file to `output_file` (see `set_output()`) and adding
+        all supplied dependencies.
+        """
+        self.set_output(output_file)
+        for i in dependencies:
+            self.add(i)
+
+    def set_output(self, output_file):
+        """
+        Set the output file and clear the list of already added
+        dependencies.
+
+        `output_file` must be a string.  The specified file is
+        immediately overwritten.
+
+        If output_file is '-', the output will be written to stdout.
+        If it is None, no file output is done when calling add().
+        """
+        self.list = []
+        if output_file == '-':
+            self.file = sys.stdout
+        elif output_file:
+            self.file = open(output_file, 'w')
+        else:
+            self.file = None
+
+    def add(self, filename):
+        """
+        If the dependency `filename` has not already been added,
+        append it to self.list and print it to self.file if self.file
+        is not None.
+        """
+        if not filename in self.list:
+            self.list.append(filename)
+            if self.file is not None:
+                print >>self.file, filename
+
+    def close(self):
+        """
+        Close the output file.
+        """
+        self.file.close()
+        self.file = None
+
+    def __repr__(self):
+        if self.file:
+            output_file = self.file.name
+        else:
+            output_file = None
+        return '%s(%r, %s)' % (self.__class__.__name__, output_file, self.list)
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/statemachine.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/statemachine.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/statemachine.py (revision 3)
@@ -0,0 +1,1492 @@
+# Author: David Goodger
+# Contact: goodger@users.sourceforge.net
+# Revision: $Revision: 4152 $
+# Date: $Date: 2005-12-08 00:46:30 +0100 (Thu, 08 Dec 2005) $
+# Copyright: This module has been placed in the public domain.
+
+"""
+A finite state machine specialized for regular-expression-based text filters,
+this module defines the following classes:
+
+- `StateMachine`, a state machine
+- `State`, a state superclass
+- `StateMachineWS`, a whitespace-sensitive version of `StateMachine`
+- `StateWS`, a state superclass for use with `StateMachineWS`
+- `SearchStateMachine`, uses `re.search()` instead of `re.match()`
+- `SearchStateMachineWS`, uses `re.search()` instead of `re.match()`
+- `ViewList`, extends standard Python lists.
+- `StringList`, string-specific ViewList.
+
+Exception classes:
+
+- `StateMachineError`
+- `UnknownStateError`
+- `DuplicateStateError`
+- `UnknownTransitionError`
+- `DuplicateTransitionError`
+- `TransitionPatternNotFound`
+- `TransitionMethodNotFound`
+- `UnexpectedIndentationError`
+- `TransitionCorrection`: Raised to switch to another transition.
+- `StateCorrection`: Raised to switch to another state & transition.
+
+Functions:
+
+- `string2lines()`: split a multi-line string into a list of one-line strings
+
+
+How To Use This Module
+======================
+(See the individual classes, methods, and attributes for details.)
+
+1. Import it: ``import statemachine`` or ``from statemachine import ...``.
+   You will also need to ``import re``.
+
+2. Derive a subclass of `State` (or `StateWS`) for each state in your state
+   machine::
+
+       class MyState(statemachine.State):
+
+   Within the state's class definition:
+
+   a) Include a pattern for each transition, in `State.patterns`::
+
+          patterns = {'atransition': r'pattern', ...}
+
+   b) Include a list of initial transitions to be set up automatically, in
+      `State.initial_transitions`::
+
+          initial_transitions = ['atransition', ...]
+
+   c) Define a method for each transition, with the same name as the
+      transition pattern::
+
+          def atransition(self, match, context, next_state):
+              # do something
+              result = [...]  # a list
+              return context, next_state, result
+              # context, next_state may be altered
+
+      Transition methods may raise an `EOFError` to cut processing short.
+
+   d) You may wish to override the `State.bof()` and/or `State.eof()` implicit
+      transition methods, which handle the beginning- and end-of-file.
+
+   e) In order to handle nested processing, you may wish to override the
+      attributes `State.nested_sm` and/or `State.nested_sm_kwargs`.
+
+      If you are using `StateWS` as a base class, in order to handle nested
+      indented blocks, you may wish to:
+
+      - override the attributes `StateWS.indent_sm`,
+        `StateWS.indent_sm_kwargs`, `StateWS.known_indent_sm`, and/or
+        `StateWS.known_indent_sm_kwargs`;
+      - override the `StateWS.blank()` method; and/or
+      - override or extend the `StateWS.indent()`, `StateWS.known_indent()`,
+        and/or `StateWS.firstknown_indent()` methods.
+
+3. Create a state machine object::
+
+       sm = StateMachine(state_classes=[MyState, ...],
+                         initial_state='MyState')
+
+4. Obtain the input text, which needs to be converted into a tab-free list of
+   one-line strings. For example, to read text from a file called
+   'inputfile'::
+
+       input_string = open('inputfile').read()
+       input_lines = statemachine.string2lines(input_string)
+
+5. Run the state machine on the input text and collect the results, a list::
+
+       results = sm.run(input_lines)
+
+6. Remove any lingering circular references::
+
+       sm.unlink()
+"""
+
+__docformat__ = 'restructuredtext'
+
+import sys
+import re
+import types
+import unicodedata
+
+
+class StateMachine:
+
+    """
+    A finite state machine for text filters using regular expressions.
+
+    The input is provided in the form of a list of one-line strings (no
+    newlines). States are subclasses of the `State` class. Transitions consist
+    of regular expression patterns and transition methods, and are defined in
+    each state.
+
+    The state machine is started with the `run()` method, which returns the
+    results of processing in a list.
+    """
+
+    def __init__(self, state_classes, initial_state, debug=0):
+        """
+        Initialize a `StateMachine` object; add state objects.
+
+        Parameters:
+
+        - `state_classes`: a list of `State` (sub)classes.
+        - `initial_state`: a string, the class name of the initial state.
+        - `debug`: a boolean; produce verbose output if true (nonzero).
+        """
+
+        self.input_lines = None
+        """`StringList` of input lines (without newlines).
+        Filled by `self.run()`."""
+
+        self.input_offset = 0
+        """Offset of `self.input_lines` from the beginning of the file."""
+
+        self.line = None
+        """Current input line."""
+
+        self.line_offset = -1
+        """Current input line offset from beginning of `self.input_lines`."""
+
+        self.debug = debug
+        """Debugging mode on/off."""
+
+        self.initial_state = initial_state
+        """The name of the initial state (key to `self.states`)."""
+
+        self.current_state = initial_state
+        """The name of the current state (key to `self.states`)."""
+
+        self.states = {}
+        """Mapping of {state_name: State_object}."""
+
+        self.add_states(state_classes)
+
+        self.observers = []
+        """List of bound methods or functions to call whenever the current
+        line changes.  Observers are called with one argument, ``self``.
+        Cleared at the end of `run()`."""
+
+    def unlink(self):
+        """Remove circular references to objects no longer required."""
+        for state in self.states.values():
+            state.unlink()
+        self.states = None
+
+    def run(self, input_lines, input_offset=0, context=None,
+            input_source=None):
+        """
+        Run the state machine on `input_lines`. Return results (a list).
+
+        Reset `self.line_offset` and `self.current_state`. Run the
+        beginning-of-file transition. Input one line at a time and check for a
+        matching transition. If a match is found, call the transition method
+        and possibly change the state. Store the context returned by the
+        transition method to be passed on to the next transition matched.
+        Accumulate the results returned by the transition methods in a list.
+        Run the end-of-file transition. Finally, return the accumulated
+        results.
+
+        Parameters:
+
+        - `input_lines`: a list of strings without newlines, or `StringList`.
+        - `input_offset`: the line offset of `input_lines` from the beginning
+          of the file.
+        - `context`: application-specific storage.
+        - `input_source`: name or path of source of `input_lines`.
+        """
+        self.runtime_init()
+        if isinstance(input_lines, StringList):
+            self.input_lines = input_lines
+        else:
+            self.input_lines = StringList(input_lines, source=input_source)
+        self.input_offset = input_offset
+        self.line_offset = -1
+        self.current_state = self.initial_state
+        if self.debug:
+            print >>sys.stderr, (
+                '\nStateMachine.run: input_lines (line_offset=%s):\n| %s'
+                % (self.line_offset, '\n| '.join(self.input_lines)))
+        transitions = None
+        results = []
+        state = self.get_state()
+        try:
+            if self.debug:
+                print >>sys.stderr, ('\nStateMachine.run: bof transition')
+            context, result = state.bof(context)
+            results.extend(result)
+            while 1:
+                try:
+                    try:
+                        self.next_line()
+                        if self.debug:
+                            source, offset = self.input_lines.info(
+                                self.line_offset)
+                            print >>sys.stderr, (
+                                '\nStateMachine.run: line (source=%r, '
+                                'offset=%r):\n| %s'
+                                % (source, offset, self.line))
+                        context, next_state, result = self.check_line(
+                            context, state, transitions)
+                    except EOFError:
+                        if self.debug:
+                            print >>sys.stderr, (
+                                '\nStateMachine.run: %s.eof transition'
+                                % state.__class__.__name__)
+                        result = state.eof(context)
+                        results.extend(result)
+                        break
+                    else:
+                        results.extend(result)
+                except TransitionCorrection, exception:
+                    self.previous_line() # back up for another try
+                    transitions = (exception.args[0],)
+                    if self.debug:
+                        print >>sys.stderr, (
+                              '\nStateMachine.run: TransitionCorrection to '
+                              'state "%s", transition %s.'
+                              % (state.__class__.__name__, transitions[0]))
+                    continue
+                except StateCorrection, exception:
+                    self.previous_line() # back up for another try
+                    next_state = exception.args[0]
+                    if len(exception.args) == 1:
+                        transitions = None
+                    else:
+                        transitions = (exception.args[1],)
+                    if self.debug:
+                        print >>sys.stderr, (
+                              '\nStateMachine.run: StateCorrection to state '
+                              '"%s", transition %s.'
+                              % (next_state, transitions[0]))
+                else:
+                    transitions = None
+                state = self.get_state(next_state)
+        except:
+            if self.debug:
+                self.error()
+            raise
+        self.observers = []
+        return results
+
+    def get_state(self, next_state=None):
+        """
+        Return current state object; set it first if `next_state` given.
+
+        Parameter `next_state`: a string, the name of the next state.
+
+        Exception: `UnknownStateError` raised if `next_state` unknown.
+        """
+        if next_state:
+            if self.debug and next_state != self.current_state:
+                print >>sys.stderr, \
+                      ('\nStateMachine.get_state: Changing state from '
+                       '"%s" to "%s" (input line %s).'
+                       % (self.current_state, next_state,
+                          self.abs_line_number()))
+            self.current_state = next_state
+        try:
+            return self.states[self.current_state]
+        except KeyError:
+            raise UnknownStateError(self.current_state)
+
+    def next_line(self, n=1):
+        """Load `self.line` with the `n`'th next line and return it."""
+        try:
+            try:
+                self.line_offset += n
+                self.line = self.input_lines[self.line_offset]
+            except IndexError:
+                self.line = None
+                raise EOFError
+            return self.line
+        finally:
+            self.notify_observers()
+
+    def is_next_line_blank(self):
+        """Return 1 if the next line is blank or non-existant."""
+        try:
+            return not self.input_lines[self.line_offset + 1].strip()
+        except IndexError:
+            return 1
+
+    def at_eof(self):
+        """Return 1 if the input is at or past end-of-file."""
+        return self.line_offset >= len(self.input_lines) - 1
+
+    def at_bof(self):
+        """Return 1 if the input is at or before beginning-of-file."""
+        return self.line_offset <= 0
+
+    def previous_line(self, n=1):
+        """Load `self.line` with the `n`'th previous line and return it."""
+        self.line_offset -= n
+        if self.line_offset < 0:
+            self.line = None
+        else:
+            self.line = self.input_lines[self.line_offset]
+        self.notify_observers()
+        return self.line
+
+    def goto_line(self, line_offset):
+        """Jump to absolute line offset `line_offset`, load and return it."""
+        try:
+            try:
+                self.line_offset = line_offset - self.input_offset
+                self.line = self.input_lines[self.line_offset]
+            except IndexError:
+                self.line = None
+                raise EOFError
+            return self.line
+        finally:
+            self.notify_observers()
+
+    def get_source(self, line_offset):
+        """Return source of line at absolute line offset `line_offset`."""
+        return self.input_lines.source(line_offset - self.input_offset)
+
+    def abs_line_offset(self):
+        """Return line offset of current line, from beginning of file."""
+        return self.line_offset + self.input_offset
+
+    def abs_line_number(self):
+        """Return line number of current line (counting from 1)."""
+        return self.line_offset + self.input_offset + 1
+
+    def insert_input(self, input_lines, source):
+        self.input_lines.insert(self.line_offset + 1, '',
+                                source='internal padding')
+        self.input_lines.insert(self.line_offset + 1, '',
+                                source='internal padding')
+        self.input_lines.insert(self.line_offset + 2,
+                                StringList(input_lines, source))
+
+    def get_text_block(self, flush_left=0):
+        """
+        Return a contiguous block of text.
+
+        If `flush_left` is true, raise `UnexpectedIndentationError` if an
+        indented line is encountered before the text block ends (with a blank
+        line).
+        """
+        try:
+            block = self.input_lines.get_text_block(self.line_offset,
+                                                    flush_left)
+            self.next_line(len(block) - 1)
+            return block
+        except UnexpectedIndentationError, error:
+            block, source, lineno = error
+            self.next_line(len(block) - 1) # advance to last line of block
+            raise
+
+    def check_line(self, context, state, transitions=None):
+        """
+        Examine one line of input for a transition match & execute its method.
+
+        Parameters:
+
+        - `context`: application-dependent storage.
+        - `state`: a `State` object, the current state.
+        - `transitions`: an optional ordered list of transition names to try,
+          instead of ``state.transition_order``.
+
+        Return the values returned by the transition method:
+
+        - context: possibly modified from the parameter `context`;
+        - next state name (`State` subclass name);
+        - the result output of the transition, a list.
+
+        When there is no match, ``state.no_match()`` is called and its return
+        value is returned.
+        """
+        if transitions is None:
+            transitions =  state.transition_order
+        state_correction = None
+        if self.debug:
+            print >>sys.stderr, (
+                  '\nStateMachine.check_line: state="%s", transitions=%r.'
+                  % (state.__class__.__name__, transitions))
+        for name in transitions:
+            pattern, method, next_state = state.transitions[name]
+            match = self.match(pattern)
+            if match:
+                if self.debug:
+                    print >>sys.stderr, (
+                          '\nStateMachine.check_line: Matched transition '
+                          '"%s" in state "%s".'
+                          % (name, state.__class__.__name__))
+                return method(match, context, next_state)
+        else:
+            if self.debug:
+                print >>sys.stderr, (
+                      '\nStateMachine.check_line: No match in state "%s".'
+                      % state.__class__.__name__)
+            return state.no_match(context, transitions)
+
+    def match(self, pattern):
+        """
+        Return the result of a regular expression match.
+
+        Parameter `pattern`: an `re` compiled regular expression.
+        """
+        return pattern.match(self.line)
+
+    def add_state(self, state_class):
+        """
+        Initialize & add a `state_class` (`State` subclass) object.
+
+        Exception: `DuplicateStateError` raised if `state_class` was already
+        added.
+        """
+        statename = state_class.__name__
+        if self.states.has_key(statename):
+            raise DuplicateStateError(statename)
+        self.states[statename] = state_class(self, self.debug)
+
+    def add_states(self, state_classes):
+        """
+        Add `state_classes` (a list of `State` subclasses).
+        """
+        for state_class in state_classes:
+            self.add_state(state_class)
+
+    def runtime_init(self):
+        """
+        Initialize `self.states`.
+        """
+        for state in self.states.values():
+            state.runtime_init()
+
+    def error(self):
+        """Report error details."""
+        type, value, module, line, function = _exception_data()
+        print >>sys.stderr, '%s: %s' % (type, value)
+        print >>sys.stderr, 'input line %s' % (self.abs_line_number())
+        print >>sys.stderr, ('module %s, line %s, function %s'
+                             % (module, line, function))
+
+    def attach_observer(self, observer):
+        """
+        The `observer` parameter is a function or bound method which takes two
+        arguments, the source and offset of the current line.
+        """
+        self.observers.append(observer)
+
+    def detach_observer(self, observer):
+        self.observers.remove(observer)
+
+    def notify_observers(self):
+        for observer in self.observers:
+            try:
+                info = self.input_lines.info(self.line_offset)
+            except IndexError:
+                info = (None, None)
+            observer(*info)
+
+
+class State:
+
+    """
+    State superclass. Contains a list of transitions, and transition methods.
+
+    Transition methods all have the same signature. They take 3 parameters:
+
+    - An `re` match object. ``match.string`` contains the matched input line,
+      ``match.start()`` gives the start index of the match, and
+      ``match.end()`` gives the end index.
+    - A context object, whose meaning is application-defined (initial value
+      ``None``). It can be used to store any information required by the state
+      machine, and the retured context is passed on to the next transition
+      method unchanged.
+    - The name of the next state, a string, taken from the transitions list;
+      normally it is returned unchanged, but it may be altered by the
+      transition method if necessary.
+
+    Transition methods all return a 3-tuple:
+
+    - A context object, as (potentially) modified by the transition method.
+    - The next state name (a return value of ``None`` means no state change).
+    - The processing result, a list, which is accumulated by the state
+      machine.
+
+    Transition methods may raise an `EOFError` to cut processing short.
+
+    There are two implicit transitions, and corresponding transition methods
+    are defined: `bof()` handles the beginning-of-file, and `eof()` handles
+    the end-of-file. These methods have non-standard signatures and return
+    values. `bof()` returns the initial context and results, and may be used
+    to return a header string, or do any other processing needed. `eof()`
+    should handle any remaining context and wrap things up; it returns the
+    final processing result.
+
+    Typical applications need only subclass `State` (or a subclass), set the
+    `patterns` and `initial_transitions` class attributes, and provide
+    corresponding transition methods. The default object initialization will
+    take care of constructing the list of transitions.
+    """
+
+    patterns = None
+    """
+    {Name: pattern} mapping, used by `make_transition()`. Each pattern may
+    be a string or a compiled `re` pattern. Override in subclasses.
+    """
+
+    initial_transitions = None
+    """
+    A list of transitions to initialize when a `State` is instantiated.
+    Each entry is either a transition name string, or a (transition name, next
+    state name) pair. See `make_transitions()`. Override in subclasses.
+    """
+
+    nested_sm = None
+    """
+    The `StateMachine` class for handling nested processing.
+
+    If left as ``None``, `nested_sm` defaults to the class of the state's
+    controlling state machine. Override it in subclasses to avoid the default.
+    """
+
+    nested_sm_kwargs = None
+    """
+    Keyword arguments dictionary, passed to the `nested_sm` constructor.
+
+    Two keys must have entries in the dictionary:
+
+    - Key 'state_classes' must be set to a list of `State` classes.
+    - Key 'initial_state' must be set to the name of the initial state class.
+
+    If `nested_sm_kwargs` is left as ``None``, 'state_classes' defaults to the
+    class of the current state, and 'initial_state' defaults to the name of
+    the class of the current state. Override in subclasses to avoid the
+    defaults.
+    """
+
+    def __init__(self, state_machine, debug=0):
+        """
+        Initialize a `State` object; make & add initial transitions.
+
+        Parameters:
+
+        - `statemachine`: the controlling `StateMachine` object.
+        - `debug`: a boolean; produce verbose output if true (nonzero).
+        """
+
+        self.transition_order = []
+        """A list of transition names in search order."""
+
+        self.transitions = {}
+        """
+        A mapping of transition names to 3-tuples containing
+        (compiled_pattern, transition_method, next_state_name). Initialized as
+        an instance attribute dynamically (instead of as a class attribute)
+        because it may make forward references to patterns and methods in this
+        or other classes.
+        """
+
+        self.add_initial_transitions()
+
+        self.state_machine = state_machine
+        """A reference to the controlling `StateMachine` object."""
+
+        self.debug = debug
+        """Debugging mode on/off."""
+
+        if self.nested_sm is None:
+            self.nested_sm = self.state_machine.__class__
+        if self.nested_sm_kwargs is None:
+            self.nested_sm_kwargs = {'state_classes': [self.__class__],
+                                     'initial_state': self.__class__.__name__}
+
+    def runtime_init(self):
+        """
+        Initialize this `State` before running the state machine; called from
+        `self.state_machine.run()`.
+        """
+        pass
+
+    def unlink(self):
+        """Remove circular references to objects no longer required."""
+        self.state_machine = None
+
+    def add_initial_transitions(self):
+        """Make and add transitions listed in `self.initial_transitions`."""
+        if self.initial_transitions:
+            names, transitions = self.make_transitions(
+                  self.initial_transitions)
+            self.add_transitions(names, transitions)
+
+    def add_transitions(self, names, transitions):
+        """
+        Add a list of transitions to the start of the transition list.
+
+        Parameters:
+
+        - `names`: a list of transition names.
+        - `transitions`: a mapping of names to transition tuples.
+
+        Exceptions: `DuplicateTransitionError`, `UnknownTransitionError`.
+        """
+        for name in names:
+            if self.transitions.has_key(name):
+                raise DuplicateTransitionError(name)
+            if not transitions.has_key(name):
+                raise UnknownTransitionError(name)
+        self.transition_order[:0] = names
+        self.transitions.update(transitions)
+
+    def add_transition(self, name, transition):
+        """
+        Add a transition to the start of the transition list.
+
+        Parameter `transition`: a ready-made transition 3-tuple.
+
+        Exception: `DuplicateTransitionError`.
+        """
+        if self.transitions.has_key(name):
+            raise DuplicateTransitionError(name)
+        self.transition_order[:0] = [name]
+        self.transitions[name] = transition
+
+    def remove_transition(self, name):
+        """
+        Remove a transition by `name`.
+
+        Exception: `UnknownTransitionError`.
+        """
+        try:
+            del self.transitions[name]
+            self.transition_order.remove(name)
+        except:
+            raise UnknownTransitionError(name)
+
+    def make_transition(self, name, next_state=None):
+        """
+        Make & return a transition tuple based on `name`.
+
+        This is a convenience function to simplify transition creation.
+
+        Parameters:
+
+        - `name`: a string, the name of the transition pattern & method. This
+          `State` object must have a method called '`name`', and a dictionary
+          `self.patterns` containing a key '`name`'.
+        - `next_state`: a string, the name of the next `State` object for this
+          transition. A value of ``None`` (or absent) implies no state change
+          (i.e., continue with the same state).
+
+        Exceptions: `TransitionPatternNotFound`, `TransitionMethodNotFound`.
+        """
+        if next_state is None:
+            next_state = self.__class__.__name__
+        try:
+            pattern = self.patterns[name]
+            if not hasattr(pattern, 'match'):
+                pattern = re.compile(pattern)
+        except KeyError:
+            raise TransitionPatternNotFound(
+                  '%s.patterns[%r]' % (self.__class__.__name__, name))
+        try:
+            method = getattr(self, name)
+        except AttributeError:
+            raise TransitionMethodNotFound(
+                  '%s.%s' % (self.__class__.__name__, name))
+        return (pattern, method, next_state)
+
+    def make_transitions(self, name_list):
+        """
+        Return a list of transition names and a transition mapping.
+
+        Parameter `name_list`: a list, where each entry is either a transition
+        name string, or a 1- or 2-tuple (transition name, optional next state
+        name).
+        """
+        stringtype = type('')
+        names = []
+        transitions = {}
+        for namestate in name_list:
+            if type(namestate) is stringtype:
+                transitions[namestate] = self.make_transition(namestate)
+                names.append(namestate)
+            else:
+                transitions[namestate[0]] = self.make_transition(*namestate)
+                names.append(namestate[0])
+        return names, transitions
+
+    def no_match(self, context, transitions):
+        """
+        Called when there is no match from `StateMachine.check_line()`.
+
+        Return the same values returned by transition methods:
+
+        - context: unchanged;
+        - next state name: ``None``;
+        - empty result list.
+
+        Override in subclasses to catch this event.
+        """
+        return context, None, []
+
+    def bof(self, context):
+        """
+        Handle beginning-of-file. Return unchanged `context`, empty result.
+
+        Override in subclasses.
+
+        Parameter `context`: application-defined storage.
+        """
+        return context, []
+
+    def eof(self, context):
+        """
+        Handle end-of-file. Return empty result.
+
+        Override in subclasses.
+
+        Parameter `context`: application-defined storage.
+        """
+        return []
+
+    def nop(self, match, context, next_state):
+        """
+        A "do nothing" transition method.
+
+        Return unchanged `context` & `next_state`, empty result. Useful for
+        simple state changes (actionless transitions).
+        """
+        return context, next_state, []
+
+
+class StateMachineWS(StateMachine):
+
+    """
+    `StateMachine` subclass specialized for whitespace recognition.
+
+    There are three methods provided for extracting indented text blocks:
+    
+    - `get_indented()`: use when the indent is unknown.
+    - `get_known_indented()`: use when the indent is known for all lines.
+    - `get_first_known_indented()`: use when only the first line's indent is
+      known.
+    """
+
+    def get_indented(self, until_blank=0, strip_indent=1):
+        """
+        Return a block of indented lines of text, and info.
+
+        Extract an indented block where the indent is unknown for all lines.
+
+        :Parameters:
+            - `until_blank`: Stop collecting at the first blank line if true
+              (1).
+            - `strip_indent`: Strip common leading indent if true (1,
+              default).
+
+        :Return:
+            - the indented block (a list of lines of text),
+            - its indent,
+            - its first line offset from BOF, and
+            - whether or not it finished with a blank line.
+        """
+        offset = self.abs_line_offset()
+        indented, indent, blank_finish = self.input_lines.get_indented(
+              self.line_offset, until_blank, strip_indent)
+        if indented:
+            self.next_line(len(indented) - 1) # advance to last indented line
+        while indented and not indented[0].strip():
+            indented.trim_start()
+            offset += 1
+        return indented, indent, offset, blank_finish
+
+    def get_known_indented(self, indent, until_blank=0, strip_indent=1):
+        """
+        Return an indented block and info.
+
+        Extract an indented block where the indent is known for all lines.
+        Starting with the current line, extract the entire text block with at
+        least `indent` indentation (which must be whitespace, except for the
+        first line).
+
+        :Parameters:
+            - `indent`: The number of indent columns/characters.
+            - `until_blank`: Stop collecting at the first blank line if true
+              (1).
+            - `strip_indent`: Strip `indent` characters of indentation if true
+              (1, default).
+
+        :Return:
+            - the indented block,
+            - its first line offset from BOF, and
+            - whether or not it finished with a blank line.
+        """
+        offset = self.abs_line_offset()
+        indented, indent, blank_finish = self.input_lines.get_indented(
+              self.line_offset, until_blank, strip_indent,
+              block_indent=indent)
+        self.next_line(len(indented) - 1) # advance to last indented line
+        while indented and not indented[0].strip():
+            indented.trim_start()
+            offset += 1
+        return indented, offset, blank_finish
+
+    def get_first_known_indented(self, indent, until_blank=0, strip_indent=1,
+                                 strip_top=1):
+        """
+        Return an indented block and info.
+
+        Extract an indented block where the indent is known for the first line
+        and unknown for all other lines.
+
+        :Parameters:
+            - `indent`: The first line's indent (# of columns/characters).
+            - `until_blank`: Stop collecting at the first blank line if true
+              (1).
+            - `strip_indent`: Strip `indent` characters of indentation if true
+              (1, default).
+            - `strip_top`: Strip blank lines from the beginning of the block.
+
+        :Return:
+            - the indented block,
+            - its indent,
+            - its first line offset from BOF, and
+            - whether or not it finished with a blank line.
+        """
+        offset = self.abs_line_offset()
+        indented, indent, blank_finish = self.input_lines.get_indented(
+              self.line_offset, until_blank, strip_indent,
+              first_indent=indent)
+        self.next_line(len(indented) - 1) # advance to last indented line
+        if strip_top:
+            while indented and not indented[0].strip():
+                indented.trim_start()
+                offset += 1
+        return indented, indent, offset, blank_finish
+
+
+class StateWS(State):
+
+    """
+    State superclass specialized for whitespace (blank lines & indents).
+
+    Use this class with `StateMachineWS`.  The transitions 'blank' (for blank
+    lines) and 'indent' (for indented text blocks) are added automatically,
+    before any other transitions.  The transition method `blank()` handles
+    blank lines and `indent()` handles nested indented blocks.  Indented
+    blocks trigger a new state machine to be created by `indent()` and run.
+    The class of the state machine to be created is in `indent_sm`, and the
+    constructor keyword arguments are in the dictionary `indent_sm_kwargs`.
+
+    The methods `known_indent()` and `firstknown_indent()` are provided for
+    indented blocks where the indent (all lines' and first line's only,
+    respectively) is known to the transition method, along with the attributes
+    `known_indent_sm` and `known_indent_sm_kwargs`.  Neither transition method
+    is triggered automatically.
+    """
+
+    indent_sm = None
+    """
+    The `StateMachine` class handling indented text blocks.
+
+    If left as ``None``, `indent_sm` defaults to the value of
+    `State.nested_sm`.  Override it in subclasses to avoid the default.
+    """
+
+    indent_sm_kwargs = None
+    """
+    Keyword arguments dictionary, passed to the `indent_sm` constructor.
+
+    If left as ``None``, `indent_sm_kwargs` defaults to the value of
+    `State.nested_sm_kwargs`. Override it in subclasses to avoid the default.
+    """
+
+    known_indent_sm = None
+    """
+    The `StateMachine` class handling known-indented text blocks.
+
+    If left as ``None``, `known_indent_sm` defaults to the value of
+    `indent_sm`.  Override it in subclasses to avoid the default.
+    """
+
+    known_indent_sm_kwargs = None
+    """
+    Keyword arguments dictionary, passed to the `known_indent_sm` constructor.
+
+    If left as ``None``, `known_indent_sm_kwargs` defaults to the value of
+    `indent_sm_kwargs`. Override it in subclasses to avoid the default.
+    """
+
+    ws_patterns = {'blank': ' *$',
+                   'indent': ' +'}
+    """Patterns for default whitespace transitions.  May be overridden in
+    subclasses."""
+
+    ws_initial_transitions = ('blank', 'indent')
+    """Default initial whitespace transitions, added before those listed in
+    `State.initial_transitions`.  May be overridden in subclasses."""
+
+    def __init__(self, state_machine, debug=0):
+        """
+        Initialize a `StateSM` object; extends `State.__init__()`.
+
+        Check for indent state machine attributes, set defaults if not set.
+        """
+        State.__init__(self, state_machine, debug)
+        if self.indent_sm is None:
+            self.indent_sm = self.nested_sm
+        if self.indent_sm_kwargs is None:
+            self.indent_sm_kwargs = self.nested_sm_kwargs
+        if self.known_indent_sm is None:
+            self.known_indent_sm = self.indent_sm
+        if self.known_indent_sm_kwargs is None:
+            self.known_indent_sm_kwargs = self.indent_sm_kwargs
+
+    def add_initial_transitions(self):
+        """
+        Add whitespace-specific transitions before those defined in subclass.
+
+        Extends `State.add_initial_transitions()`.
+        """
+        State.add_initial_transitions(self)
+        if self.patterns is None:
+            self.patterns = {}
+        self.patterns.update(self.ws_patterns)
+        names, transitions = self.make_transitions(
+            self.ws_initial_transitions)
+        self.add_transitions(names, transitions)
+
+    def blank(self, match, context, next_state):
+        """Handle blank lines. Does nothing. Override in subclasses."""
+        return self.nop(match, context, next_state)
+
+    def indent(self, match, context, next_state):
+        """
+        Handle an indented text block. Extend or override in subclasses.
+
+        Recursively run the registered state machine for indented blocks
+        (`self.indent_sm`).
+        """
+        indented, indent, line_offset, blank_finish = \
+              self.state_machine.get_indented()
+        sm = self.indent_sm(debug=self.debug, **self.indent_sm_kwargs)
+        results = sm.run(indented, input_offset=line_offset)
+        return context, next_state, results
+
+    def known_indent(self, match, context, next_state):
+        """
+        Handle a known-indent text block. Extend or override in subclasses.
+
+        Recursively run the registered state machine for known-indent indented
+        blocks (`self.known_indent_sm`). The indent is the length of the
+        match, ``match.end()``.
+        """
+        indented, line_offset, blank_finish = \
+              self.state_machine.get_known_indented(match.end())
+        sm = self.known_indent_sm(debug=self.debug,
+                                 **self.known_indent_sm_kwargs)
+        results = sm.run(indented, input_offset=line_offset)
+        return context, next_state, results
+
+    def first_known_indent(self, match, context, next_state):
+        """
+        Handle an indented text block (first line's indent known).
+
+        Extend or override in subclasses.
+
+        Recursively run the registered state machine for known-indent indented
+        blocks (`self.known_indent_sm`). The indent is the length of the
+        match, ``match.end()``.
+        """
+        indented, line_offset, blank_finish = \
+              self.state_machine.get_first_known_indented(match.end())
+        sm = self.known_indent_sm(debug=self.debug,
+                                 **self.known_indent_sm_kwargs)
+        results = sm.run(indented, input_offset=line_offset)
+        return context, next_state, results
+
+
+class _SearchOverride:
+
+    """
+    Mix-in class to override `StateMachine` regular expression behavior.
+
+    Changes regular expression matching, from the default `re.match()`
+    (succeeds only if the pattern matches at the start of `self.line`) to
+    `re.search()` (succeeds if the pattern matches anywhere in `self.line`).
+    When subclassing a `StateMachine`, list this class **first** in the
+    inheritance list of the class definition.
+    """
+
+    def match(self, pattern):
+        """
+        Return the result of a regular expression search.
+
+        Overrides `StateMachine.match()`.
+
+        Parameter `pattern`: `re` compiled regular expression.
+        """
+        return pattern.search(self.line)
+
+
+class SearchStateMachine(_SearchOverride, StateMachine):
+    """`StateMachine` which uses `re.search()` instead of `re.match()`."""
+    pass
+
+
+class SearchStateMachineWS(_SearchOverride, StateMachineWS):
+    """`StateMachineWS` which uses `re.search()` instead of `re.match()`."""
+    pass
+
+
+class ViewList:
+
+    """
+    List with extended functionality: slices of ViewList objects are child
+    lists, linked to their parents. Changes made to a child list also affect
+    the parent list.  A child list is effectively a "view" (in the SQL sense)
+    of the parent list.  Changes to parent lists, however, do *not* affect
+    active child lists.  If a parent list is changed, any active child lists
+    should be recreated.
+
+    The start and end of the slice can be trimmed using the `trim_start()` and
+    `trim_end()` methods, without affecting the parent list.  The link between
+    child and parent lists can be broken by calling `disconnect()` on the
+    child list.
+
+    Also, ViewList objects keep track of the source & offset of each item. 
+    This information is accessible via the `source()`, `offset()`, and
+    `info()` methods.
+    """
+
+    def __init__(self, initlist=None, source=None, items=None,
+                 parent=None, parent_offset=None):
+        self.data = []
+        """The actual list of data, flattened from various sources."""
+
+        self.items = []
+        """A list of (source, offset) pairs, same length as `self.data`: the
+        source of each line and the offset of each line from the beginning of
+        its source."""
+
+        self.parent = parent
+        """The parent list."""
+
+        self.parent_offset = parent_offset
+        """Offset of this list from the beginning of the parent list."""
+
+        if isinstance(initlist, ViewList):
+            self.data = initlist.data[:]
+            self.items = initlist.items[:]
+        elif initlist is not None:
+            self.data = list(initlist)
+            if items:
+                self.items = items
+            else:
+                self.items = [(source, i) for i in range(len(initlist))]
+        assert len(self.data) == len(self.items), 'data mismatch'
+
+    def __str__(self):
+        return str(self.data)
+
+    def __repr__(self):
+        return '%s(%s, items=%s)' % (self.__class__.__name__,
+                                     self.data, self.items)
+
+    def __lt__(self, other): return self.data <  self.__cast(other)
+    def __le__(self, other): return self.data <= self.__cast(other)
+    def __eq__(self, other): return self.data == self.__cast(other)
+    def __ne__(self, other): return self.data != self.__cast(other)
+    def __gt__(self, other): return self.data >  self.__cast(other)
+    def __ge__(self, other): return self.data >= self.__cast(other)
+    def __cmp__(self, other): return cmp(self.data, self.__cast(other))
+
+    def __cast(self, other):
+        if isinstance(other, ViewList):
+            return other.data
+        else:
+            return other
+
+    def __contains__(self, item): return item in self.data
+    def __len__(self): return len(self.data)
+
+    # The __getitem__()/__setitem__() methods check whether the index
+    # is a slice first, since native list objects start supporting
+    # them directly in Python 2.3 (no exception is raised when
+    # indexing a list with a slice object; they just work).
+
+    def __getitem__(self, i):
+        if isinstance(i, types.SliceType):
+            assert i.step in (None, 1),  'cannot handle slice with stride'
+            return self.__class__(self.data[i.start:i.stop],
+                                  items=self.items[i.start:i.stop],
+                                  parent=self, parent_offset=i.start)
+        else:
+            return self.data[i]
+
+    def __setitem__(self, i, item):
+        if isinstance(i, types.SliceType):
+            assert i.step in (None, 1), 'cannot handle slice with stride'
+            if not isinstance(item, ViewList):
+                raise TypeError('assigning non-ViewList to ViewList slice')
+            self.data[i.start:i.stop] = item.data
+            self.items[i.start:i.stop] = item.items
+            assert len(self.data) == len(self.items), 'data mismatch'
+            if self.parent:
+                self.parent[i.start + self.parent_offset
+                            : i.stop + self.parent_offset] = item
+        else:
+            self.data[i] = item
+            if self.parent:
+                self.parent[i + self.parent_offset] = item
+
+    def __delitem__(self, i):
+        try:
+            del self.data[i]
+            del self.items[i]
+            if self.parent:
+                del self.parent[i + self.parent_offset]
+        except TypeError:
+            assert i.step is None, 'cannot handle slice with stride'
+            del self.data[i.start:i.stop]
+            del self.items[i.start:i.stop]
+            if self.parent:
+                del self.parent[i.start + self.parent_offset
+                                : i.stop + self.parent_offset]
+
+    def __add__(self, other):
+        if isinstance(other, ViewList):
+            return self.__class__(self.data + other.data,
+                                  items=(self.items + other.items))
+        else:
+            raise TypeError('adding non-ViewList to a ViewList')
+
+    def __radd__(self, other):
+        if isinstance(other, ViewList):
+            return self.__class__(other.data + self.data,
+                                  items=(other.items + self.items))
+        else:
+            raise TypeError('adding ViewList to a non-ViewList')
+
+    def __iadd__(self, other):
+        if isinstance(other, ViewList):
+            self.data += other.data
+        else:
+            raise TypeError('argument to += must be a ViewList')
+        return self
+
+    def __mul__(self, n):
+        return self.__class__(self.data * n, items=(self.items * n))
+
+    __rmul__ = __mul__
+
+    def __imul__(self, n):
+        self.data *= n
+        self.items *= n
+        return self
+
+    def extend(self, other):
+        if not isinstance(other, ViewList):
+            raise TypeError('extending a ViewList with a non-ViewList')
+        if self.parent:
+            self.parent.insert(len(self.data) + self.parent_offset, other)
+        self.data.extend(other.data)
+        self.items.extend(other.items)
+
+    def append(self, item, source=None, offset=0):
+        if source is None:
+            self.extend(item)
+        else:
+            if self.parent:
+                self.parent.insert(len(self.data) + self.parent_offset, item,
+                                   source, offset)
+            self.data.append(item)
+            self.items.append((source, offset))
+
+    def insert(self, i, item, source=None, offset=0):
+        if source is None:
+            if not isinstance(item, ViewList):
+                raise TypeError('inserting non-ViewList with no source given')
+            self.data[i:i] = item.data
+            self.items[i:i] = item.items
+            if self.parent:
+                index = (len(self.data) + i) % len(self.data)
+                self.parent.insert(index + self.parent_offset, item)
+        else:
+            self.data.insert(i, item)
+            self.items.insert(i, (source, offset))
+            if self.parent:
+                index = (len(self.data) + i) % len(self.data)
+                self.parent.insert(index + self.parent_offset, item,
+                                   source, offset)
+
+    def pop(self, i=-1):
+        if self.parent:
+            index = (len(self.data) + i) % len(self.data)
+            self.parent.pop(index + self.parent_offset)
+        self.items.pop(i)
+        return self.data.pop(i)
+
+    def trim_start(self, n=1):
+        """
+        Remove items from the start of the list, without touching the parent.
+        """
+        if n > len(self.data):
+            raise IndexError("Size of trim too large; can't trim %s items "
+                             "from a list of size %s." % (n, len(self.data)))
+        elif n < 0:
+            raise IndexError('Trim size must be >= 0.')
+        del self.data[:n]
+        del self.items[:n]
+        if self.parent:
+            self.parent_offset += n
+
+    def trim_end(self, n=1):
+        """
+        Remove items from the end of the list, without touching the parent.
+        """
+        if n > len(self.data):
+            raise IndexError("Size of trim too large; can't trim %s items "
+                             "from a list of size %s." % (n, len(self.data)))
+        elif n < 0:
+            raise IndexError('Trim size must be >= 0.')
+        del self.data[-n:]
+        del self.items[-n:]
+
+    def remove(self, item):
+        index = self.index(item)
+        del self[index]
+
+    def count(self, item): return self.data.count(item)
+    def index(self, item): return self.data.index(item)
+
+    def reverse(self):
+        self.data.reverse()
+        self.items.reverse()
+        self.parent = None
+
+    def sort(self, *args):
+        tmp = zip(self.data, self.items)
+        tmp.sort(*args)
+        self.data = [entry[0] for entry in tmp]
+        self.items = [entry[1] for entry in tmp]
+        self.parent = None
+
+    def info(self, i):
+        """Return source & offset for index `i`."""
+        try:
+            return self.items[i]
+        except IndexError:
+            if i == len(self.data):     # Just past the end
+                return self.items[i - 1][0], None
+            else:
+                raise
+
+    def source(self, i):
+        """Return source for index `i`."""
+        return self.info(i)[0]
+
+    def offset(self, i):
+        """Return offset for index `i`."""
+        return self.info(i)[1]
+
+    def disconnect(self):
+        """Break link between this list and parent list."""
+        self.parent = None
+
+
+class StringList(ViewList):
+
+    """A `ViewList` with string-specific methods."""
+
+    def trim_left(self, length, start=0, end=sys.maxint):
+        """
+        Trim `length` characters off the beginning of each item, in-place,
+        from index `start` to `end`.  No whitespace-checking is done on the
+        trimmed text.  Does not affect slice parent.
+        """
+        self.data[start:end] = [line[length:]
+                                for line in self.data[start:end]]
+
+    def get_text_block(self, start, flush_left=0):
+        """
+        Return a contiguous block of text.
+
+        If `flush_left` is true, raise `UnexpectedIndentationError` if an
+        indented line is encountered before the text block ends (with a blank
+        line).
+        """
+        end = start
+        last = len(self.data)
+        while end < last:
+            line = self.data[end]
+            if not line.strip():
+                break
+            if flush_left and (line[0] == ' '):
+                source, offset = self.info(end)
+                raise UnexpectedIndentationError(self[start:end], source,
+                                                 offset + 1)
+            end += 1
+        return self[start:end]
+
+    def get_indented(self, start=0, until_blank=0, strip_indent=1,
+                     block_indent=None, first_indent=None):
+        """
+        Extract and return a StringList of indented lines of text.
+
+        Collect all lines with indentation, determine the minimum indentation,
+        remove the minimum indentation from all indented lines (unless
+        `strip_indent` is false), and return them. All lines up to but not
+        including the first unindented line will be returned.
+
+        :Parameters:
+          - `start`: The index of the first line to examine.
+          - `until_blank`: Stop collecting at the first blank line if true.
+          - `strip_indent`: Strip common leading indent if true (default).
+          - `block_indent`: The indent of the entire block, if known.
+          - `first_indent`: The indent of the first line, if known.
+
+        :Return:
+          - a StringList of indented lines with mininum indent removed;
+          - the amount of the indent;
+          - a boolean: did the indented block finish with a blank line or EOF?
+        """
+        indent = block_indent           # start with None if unknown
+        end = start
+        if block_indent is not None and first_indent is None:
+            first_indent = block_indent
+        if first_indent is not None:
+            end += 1
+        last = len(self.data)
+        while end < last:
+            line = self.data[end]
+            if line and (line[0] != ' '
+                         or (block_indent is not None
+                             and line[:block_indent].strip())):
+                # Line not indented or insufficiently indented.
+                # Block finished properly iff the last indented line blank:
+                blank_finish = ((end > start)
+                                and not self.data[end - 1].strip())
+                break
+            stripped = line.lstrip()
+            if not stripped:            # blank line
+                if until_blank:
+                    blank_finish = 1
+                    break
+            elif block_indent is None:
+                line_indent = len(line) - len(stripped)
+                if indent is None:
+                    indent = line_indent
+                else:
+                    indent = min(indent, line_indent)
+            end += 1
+        else:
+            blank_finish = 1            # block ends at end of lines
+        block = self[start:end]
+        if first_indent is not None and block:
+            block.data[0] = block.data[0][first_indent:]
+        if indent and strip_indent:
+            block.trim_left(indent, start=(first_indent is not None))
+        return block, indent or 0, blank_finish
+
+    def get_2D_block(self, top, left, bottom, right, strip_indent=1):
+        block = self[top:bottom]
+        indent = right
+        for i in range(len(block.data)):
+            block.data[i] = line = block.data[i][left:right].rstrip()
+            if line:
+                indent = min(indent, len(line) - len(line.lstrip()))
+        if strip_indent and 0 < indent < right:
+            block.data = [line[indent:] for line in block.data]
+        return block
+
+    def pad_double_width(self, pad_char):
+        """
+        Pad all double-width characters in self by appending `pad_char` to each.
+        For East Asian language support.
+        """
+        if hasattr(unicodedata, 'east_asian_width'):
+            east_asian_width = unicodedata.east_asian_width
+        else:
+            return                      # new in Python 2.4
+        for i in range(len(self.data)):
+            line = self.data[i]
+            if isinstance(line, types.UnicodeType):
+                new = []
+                for char in line:
+                    new.append(char)
+                    if east_asian_width(char) in 'WF': # 'W'ide & 'F'ull-width
+                        new.append(pad_char)
+                self.data[i] = ''.join(new)
+
+    def replace(self, old, new):
+        """Replace all occurrences of substring `old` with `new`."""
+        for i in range(len(self.data)):
+            self.data[i] = self.data[i].replace(old, new)
+
+
+class StateMachineError(Exception): pass
+class UnknownStateError(StateMachineError): pass
+class DuplicateStateError(StateMachineError): pass
+class UnknownTransitionError(StateMachineError): pass
+class DuplicateTransitionError(StateMachineError): pass
+class TransitionPatternNotFound(StateMachineError): pass
+class TransitionMethodNotFound(StateMachineError): pass
+class UnexpectedIndentationError(StateMachineError): pass
+
+
+class TransitionCorrection(Exception):
+
+    """
+    Raise from within a transition method to switch to another transition.
+
+    Raise with one argument, the new transition name.
+    """
+
+
+class StateCorrection(Exception):
+
+    """
+    Raise from within a transition method to switch to another state.
+
+    Raise with one or two arguments: new state name, and an optional new
+    transition name.
+    """
+
+
+def string2lines(astring, tab_width=8, convert_whitespace=0,
+                 whitespace=re.compile('[\v\f]')):
+    """
+    Return a list of one-line strings with tabs expanded, no newlines, and
+    trailing whitespace stripped.
+
+    Each tab is expanded with between 1 and `tab_width` spaces, so that the
+    next character's index becomes a multiple of `tab_width` (8 by default).
+
+    Parameters:
+
+    - `astring`: a multi-line string.
+    - `tab_width`: the number of columns between tab stops.
+    - `convert_whitespace`: convert form feeds and vertical tabs to spaces?
+    """
+    if convert_whitespace:
+        astring = whitespace.sub(' ', astring)
+    return [s.expandtabs(tab_width).rstrip() for s in astring.splitlines()]
+
+def _exception_data():
+    """
+    Return exception information:
+
+    - the exception's class name;
+    - the exception object;
+    - the name of the file containing the offending code;
+    - the line number of the offending code;
+    - the function name of the offending code.
+    """
+    type, value, traceback = sys.exc_info()
+    while traceback.tb_next:
+        traceback = traceback.tb_next
+    code = traceback.tb_frame.f_code
+    return (type.__name__, value, code.co_filename, traceback.tb_lineno,
+            code.co_name)
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/io.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/io.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/io.py (revision 3)
@@ -0,0 +1,373 @@
+# Author: David Goodger
+# Contact: goodger@users.sourceforge.net
+# Revision: $Revision: 3654 $
+# Date: $Date: 2005-07-03 17:02:15 +0200 (Sun, 03 Jul 2005) $
+# Copyright: This module has been placed in the public domain.
+
+"""
+I/O classes provide a uniform API for low-level input and output.  Subclasses
+will exist for a variety of input/output mechanisms.
+"""
+
+__docformat__ = 'reStructuredText'
+
+import sys
+try:
+    import locale
+except:
+    pass
+from types import UnicodeType
+from docutils import TransformSpec
+
+
+class Input(TransformSpec):
+
+    """
+    Abstract base class for input wrappers.
+    """
+
+    component_type = 'input'
+
+    default_source_path = None
+
+    def __init__(self, source=None, source_path=None, encoding=None,
+                 error_handler='strict'):
+        self.encoding = encoding
+        """Text encoding for the input source."""
+
+        self.error_handler = error_handler
+        """Text decoding error handler."""
+
+        self.source = source
+        """The source of input data."""
+
+        self.source_path = source_path
+        """A text reference to the source."""
+
+        if not source_path:
+            self.source_path = self.default_source_path
+
+        self.successful_encoding = None
+        """The encoding that successfully decoded the source data."""
+
+    def __repr__(self):
+        return '%s: source=%r, source_path=%r' % (self.__class__, self.source,
+                                                  self.source_path)
+
+    def read(self):
+        raise NotImplementedError
+
+    def decode(self, data):
+        """
+        Decode a string, `data`, heuristically.
+        Raise UnicodeError if unsuccessful.
+
+        The client application should call ``locale.setlocale`` at the
+        beginning of processing::
+
+            locale.setlocale(locale.LC_ALL, '')
+        """
+        if self.encoding and self.encoding.lower() == 'unicode':
+            assert isinstance(data, UnicodeType), (
+                'input encoding is "unicode" '
+                'but input is not a unicode object')
+        if isinstance(data, UnicodeType):
+            # Accept unicode even if self.encoding != 'unicode'.
+            return data
+        encodings = [self.encoding]
+        if not self.encoding:
+            # Apply heuristics only if no encoding is explicitly given.
+            encodings.append('utf-8')
+            try:
+                encodings.append(locale.nl_langinfo(locale.CODESET))
+            except:
+                pass
+            try:
+                encodings.append(locale.getlocale()[1])
+            except:
+                pass
+            try:
+                encodings.append(locale.getdefaultlocale()[1])
+            except:
+                pass
+            encodings.append('latin-1')
+        error = None
+        error_details = ''
+        for enc in encodings:
+            if not enc:
+                continue
+            try:
+                decoded = unicode(data, enc, self.error_handler)
+                self.successful_encoding = enc
+                # Return decoded, removing BOMs.
+                return decoded.replace(u'\ufeff', u'')
+            except (UnicodeError, LookupError), error:
+                pass
+        if error is not None:
+            error_details = '\n(%s: %s)' % (error.__class__.__name__, error)
+        raise UnicodeError(
+            'Unable to decode input data.  Tried the following encodings: '
+            '%s.%s'
+            % (', '.join([repr(enc) for enc in encodings if enc]),
+               error_details))
+
+
+class Output(TransformSpec):
+
+    """
+    Abstract base class for output wrappers.
+    """
+
+    component_type = 'output'
+
+    default_destination_path = None
+
+    def __init__(self, destination=None, destination_path=None,
+                 encoding=None, error_handler='strict'):
+        self.encoding = encoding
+        """Text encoding for the output destination."""
+
+        self.error_handler = error_handler or 'strict'
+        """Text encoding error handler."""
+
+        self.destination = destination
+        """The destination for output data."""
+
+        self.destination_path = destination_path
+        """A text reference to the destination."""
+
+        if not destination_path:
+            self.destination_path = self.default_destination_path
+
+    def __repr__(self):
+        return ('%s: destination=%r, destination_path=%r'
+                % (self.__class__, self.destination, self.destination_path))
+
+    def write(self, data):
+        """`data` is a Unicode string, to be encoded by `self.encode`."""
+        raise NotImplementedError
+
+    def encode(self, data):
+        if self.encoding and self.encoding.lower() == 'unicode':
+            assert isinstance(data, UnicodeType), (
+                'the encoding given is "unicode" but the output is not '
+                'a Unicode string')
+            return data
+        if not isinstance(data, UnicodeType):
+            # Non-unicode (e.g. binary) output.
+            return data
+        else:
+            try:
+                return data.encode(self.encoding, self.error_handler)
+            except ValueError:
+                # ValueError is raised if there are unencodable chars
+                # in data and the error_handler isn't found.
+                if self.error_handler == 'xmlcharrefreplace':
+                    # We are using xmlcharrefreplace with a Python
+                    # version that doesn't support it (2.1 or 2.2), so
+                    # we emulate its behavior.
+                    return ''.join([self.xmlcharref_encode(char)
+                                    for char in data])
+                else:
+                    raise
+
+    def xmlcharref_encode(self, char):
+        """Emulate Python 2.3's 'xmlcharrefreplace' encoding error handler."""
+        try:
+            return char.encode(self.encoding, 'strict')
+        except UnicodeError:
+            return '&#%i;' % ord(char)
+
+
+class FileInput(Input):
+
+    """
+    Input for single, simple file-like objects.
+    """
+
+    def __init__(self, source=None, source_path=None,
+                 encoding=None, error_handler='strict',
+                 autoclose=1, handle_io_errors=1):
+        """
+        :Parameters:
+            - `source`: either a file-like object (which is read directly), or
+              `None` (which implies `sys.stdin` if no `source_path` given).
+            - `source_path`: a path to a file, which is opened and then read.
+            - `encoding`: the expected text encoding of the input file.
+            - `error_handler`: the encoding error handler to use.
+            - `autoclose`: close automatically after read (boolean); always
+              false if `sys.stdin` is the source.
+            - `handle_io_errors`: summarize I/O errors here, and exit?
+        """
+        Input.__init__(self, source, source_path, encoding, error_handler)
+        self.autoclose = autoclose
+        self.handle_io_errors = handle_io_errors
+        if source is None:
+            if source_path:
+                try:
+                    self.source = open(source_path)
+                except IOError, error:
+                    if not handle_io_errors:
+                        raise
+                    print >>sys.stderr, '%s: %s' % (error.__class__.__name__,
+                                                    error)
+                    print >>sys.stderr, (
+                        'Unable to open source file for reading (%r).  Exiting.'
+                        % source_path)
+                    sys.exit(1)
+            else:
+                self.source = sys.stdin
+                self.autoclose = None
+        if not source_path:
+            try:
+                self.source_path = self.source.name
+            except AttributeError:
+                pass
+
+    def read(self):
+        """
+        Read and decode a single file and return the data (Unicode string).
+        """
+        try:
+            data = self.source.read()
+        finally:
+            if self.autoclose:
+                self.close()
+        return self.decode(data)
+
+    def close(self):
+        self.source.close()
+
+
+class FileOutput(Output):
+
+    """
+    Output for single, simple file-like objects.
+    """
+
+    def __init__(self, destination=None, destination_path=None,
+                 encoding=None, error_handler='strict', autoclose=1,
+                 handle_io_errors=1):
+        """
+        :Parameters:
+            - `destination`: either a file-like object (which is written
+              directly) or `None` (which implies `sys.stdout` if no
+              `destination_path` given).
+            - `destination_path`: a path to a file, which is opened and then
+              written.
+            - `autoclose`: close automatically after write (boolean); always
+              false if `sys.stdout` is the destination.
+        """
+        Output.__init__(self, destination, destination_path,
+                        encoding, error_handler)
+        self.opened = 1
+        self.autoclose = autoclose
+        self.handle_io_errors = handle_io_errors
+        if destination is None:
+            if destination_path:
+                self.opened = None
+            else:
+                self.destination = sys.stdout
+                self.autoclose = None
+        if not destination_path:
+            try:
+                self.destination_path = self.destination.name
+            except AttributeError:
+                pass
+
+    def open(self):
+        try:
+            self.destination = open(self.destination_path, 'w')
+        except IOError, error:
+            if not self.handle_io_errors:
+                raise
+            print >>sys.stderr, '%s: %s' % (error.__class__.__name__,
+                                            error)
+            print >>sys.stderr, ('Unable to open destination file for writing '
+                                 '(%r).  Exiting.' % self.destination_path)
+            sys.exit(1)
+        self.opened = 1
+
+    def write(self, data):
+        """Encode `data`, write it to a single file, and return it."""
+        output = self.encode(data)
+        if not self.opened:
+            self.open()
+        try:
+            self.destination.write(output)
+        finally:
+            if self.autoclose:
+                self.close()
+        return output
+
+    def close(self):
+        self.destination.close()
+        self.opened = None
+
+
+class StringInput(Input):
+
+    """
+    Direct string input.
+    """
+
+    default_source_path = '<string>'
+
+    def read(self):
+        """Decode and return the source string."""
+        return self.decode(self.source)
+
+
+class StringOutput(Output):
+
+    """
+    Direct string output.
+    """
+
+    default_destination_path = '<string>'
+
+    def write(self, data):
+        """Encode `data`, store it in `self.destination`, and return it."""
+        self.destination = self.encode(data)
+        return self.destination
+
+
+class NullInput(Input):
+
+    """
+    Degenerate input: read nothing.
+    """
+
+    default_source_path = 'null input'
+
+    def read(self):
+        """Return a null string."""
+        return u''
+
+
+class NullOutput(Output):
+
+    """
+    Degenerate output: write nothing.
+    """
+
+    default_destination_path = 'null output'
+
+    def write(self, data):
+        """Do nothing ([don't even] send data to the bit bucket)."""
+        pass
+
+
+class DocTreeInput(Input):
+
+    """
+    Adapter for document tree input.
+
+    The document tree must be passed in the ``source`` parameter.
+    """
+
+    default_source_path = 'doctree input'
+
+    def read(self):
+        """Return the document tree."""
+        return self.source
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/transforms/universal.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/transforms/universal.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/transforms/universal.py (revision 3)
@@ -0,0 +1,171 @@
+# Authors: David Goodger, Ueli Schlaepfer
+# Contact: goodger@users.sourceforge.net
+# Revision: $Revision: 4183 $
+# Date: $Date: 2005-12-12 05:12:02 +0100 (Mon, 12 Dec 2005) $
+# Copyright: This module has been placed in the public domain.
+
+"""
+Transforms needed by most or all documents:
+
+- `Decorations`: Generate a document's header & footer.
+- `Messages`: Placement of system messages stored in
+  `nodes.document.transform_messages`.
+- `TestMessages`: Like `Messages`, used on test runs.
+- `FinalReferences`: Resolve remaining references.
+"""
+
+__docformat__ = 'reStructuredText'
+
+import re
+import sys
+import time
+from docutils import nodes, utils
+from docutils.transforms import TransformError, Transform
+
+
+class Decorations(Transform):
+
+    """
+    Populate a document's decoration element (header, footer).
+    """
+
+    default_priority = 820
+
+    def apply(self):
+        header_nodes = self.generate_header()
+        if header_nodes:
+            decoration = self.document.get_decoration()
+            header = decoration.get_header()
+            header.extend(header_nodes)
+        footer_nodes = self.generate_footer()
+        if footer_nodes:
+            decoration = self.document.get_decoration()
+            footer = decoration.get_footer()
+            footer.extend(footer_nodes)
+
+    def generate_header(self):
+        return None
+
+    def generate_footer(self):
+        # @@@ Text is hard-coded for now.
+        # Should be made dynamic (language-dependent).
+        settings = self.document.settings
+        if settings.generator or settings.datestamp or settings.source_link \
+               or settings.source_url:
+            text = []
+            if settings.source_link and settings._source \
+                   or settings.source_url:
+                if settings.source_url:
+                    source = settings.source_url
+                else:
+                    source = utils.relative_path(settings._destination,
+                                                 settings._source)
+                text.extend([
+                    nodes.reference('', 'View document source',
+                                    refuri=source),
+                    nodes.Text('.\n')])
+            if settings.datestamp:
+                datestamp = time.strftime(settings.datestamp, time.gmtime())
+                text.append(nodes.Text('Generated on: ' + datestamp + '.\n'))
+            if settings.generator:
+                text.extend([
+                    nodes.Text('Generated by '),
+                    nodes.reference('', 'Docutils', refuri=
+                                    'http://docutils.sourceforge.net/'),
+                    nodes.Text(' from '),
+                    nodes.reference('', 'reStructuredText', refuri='http://'
+                                    'docutils.sourceforge.net/rst.html'),
+                    nodes.Text(' source.\n')])
+            return [nodes.paragraph('', '', *text)]
+        else:
+            return None
+
+
+class ExposeInternals(Transform):
+
+    """
+    Expose internal attributes if ``expose_internals`` setting is set.
+    """
+
+    default_priority = 840
+    
+    def not_Text(self, node):
+        return not isinstance(node, nodes.Text)
+
+    def apply(self): 
+        if self.document.settings.expose_internals:
+            for node in self.document.traverse(self.not_Text):
+                for att in self.document.settings.expose_internals:
+                    value = getattr(node, att, None)
+                    if value is not None:
+                        node['internal:' + att] = value
+
+
+class Messages(Transform):
+
+    """
+    Place any system messages generated after parsing into a dedicated section
+    of the document.
+    """
+
+    default_priority = 860
+
+    def apply(self):
+        unfiltered = self.document.transform_messages
+        threshold = self.document.reporter.report_level
+        messages = []
+        for msg in unfiltered:
+            if msg['level'] >= threshold and not msg.parent:
+                messages.append(msg)
+        if messages:
+            section = nodes.section(classes=['system-messages'])
+            # @@@ get this from the language module?
+            section += nodes.title('', 'Docutils System Messages')
+            section += messages
+            self.document.transform_messages[:] = []
+            self.document += section
+
+
+class FilterMessages(Transform):
+
+    """
+    Remove system messages below verbosity threshold.
+    """
+
+    default_priority = 870
+
+    def apply(self):
+        for node in self.document.traverse(nodes.system_message):
+            if node['level'] < self.document.reporter.report_level:
+                node.parent.remove(node)
+
+
+class TestMessages(Transform):
+
+    """
+    Append all post-parse system messages to the end of the document.
+
+    Used for testing purposes.
+    """
+
+    default_priority = 880
+
+    def apply(self):
+        for msg in self.document.transform_messages:
+            if not msg.parent:
+                self.document += msg
+
+
+class StripComments(Transform):
+
+    """
+    Remove comment elements from the document tree (only if the
+    ``strip_comments`` setting is enabled).
+    """
+
+    default_priority = 740
+
+    def apply(self):
+        if self.document.settings.strip_comments:
+            for node in self.document.traverse(nodes.comment):
+                node.parent.remove(node)
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/transforms/parts.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/transforms/parts.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/transforms/parts.py (revision 3)
@@ -0,0 +1,171 @@
+# Authors: David Goodger, Ueli Schlaepfer, Dmitry Jemerov
+# Contact: goodger@users.sourceforge.net
+# Revision: $Revision: 3909 $
+# Date: $Date: 2005-09-26 20:17:31 +0200 (Mon, 26 Sep 2005) $
+# Copyright: This module has been placed in the public domain.
+
+"""
+Transforms related to document parts.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+import re
+import sys
+from docutils import nodes, utils
+from docutils.transforms import TransformError, Transform
+
+
+class SectNum(Transform):
+
+    """
+    Automatically assigns numbers to the titles of document sections.
+
+    It is possible to limit the maximum section level for which the numbers
+    are added.  For those sections that are auto-numbered, the "autonum"
+    attribute is set, informing the contents table generator that a different
+    form of the TOC should be used.
+    """
+
+    default_priority = 710
+    """Should be applied before `Contents`."""
+
+    def apply(self):
+        self.maxdepth = self.startnode.details.get('depth', sys.maxint)
+        self.startvalue = self.startnode.details.get('start', 1)
+        self.prefix = self.startnode.details.get('prefix', '')
+        self.suffix = self.startnode.details.get('suffix', '')
+        self.startnode.parent.remove(self.startnode)
+        if self.document.settings.sectnum_xform:
+            self.update_section_numbers(self.document)
+
+    def update_section_numbers(self, node, prefix=(), depth=0):
+        depth += 1
+        if prefix:
+            sectnum = 1
+        else:
+            sectnum = self.startvalue
+        for child in node:
+            if isinstance(child, nodes.section):
+                numbers = prefix + (str(sectnum),)
+                title = child[0]
+                # Use &nbsp; for spacing:
+                generated = nodes.generated(
+                    '', (self.prefix + '.'.join(numbers) + self.suffix
+                         +  u'\u00a0' * 3),
+                    classes=['sectnum'])
+                title.insert(0, generated)
+                title['auto'] = 1
+                if depth < self.maxdepth:
+                    self.update_section_numbers(child, numbers, depth)
+                sectnum += 1
+
+
+class Contents(Transform):
+
+    """
+    This transform generates a table of contents from the entire document tree
+    or from a single branch.  It locates "section" elements and builds them
+    into a nested bullet list, which is placed within a "topic" created by the
+    contents directive.  A title is either explicitly specified, taken from
+    the appropriate language module, or omitted (local table of contents).
+    The depth may be specified.  Two-way references between the table of
+    contents and section titles are generated (requires Writer support).
+
+    This transform requires a startnode, which which contains generation
+    options and provides the location for the generated table of contents (the
+    startnode is replaced by the table of contents "topic").
+    """
+
+    default_priority = 720
+
+    def apply(self):
+        details = self.startnode.details
+        if details.has_key('local'):
+            startnode = self.startnode.parent.parent
+            while not (isinstance(startnode, nodes.section)
+                       or isinstance(startnode, nodes.document)):
+                # find the ToC root: a direct ancestor of startnode
+                startnode = startnode.parent
+        else:
+            startnode = self.document
+        self.toc_id = self.startnode.parent['ids'][0]
+        if details.has_key('backlinks'):
+            self.backlinks = details['backlinks']
+        else:
+            self.backlinks = self.document.settings.toc_backlinks
+        contents = self.build_contents(startnode)
+        if len(contents):
+            self.startnode.replace_self(contents)
+        else:
+            self.startnode.parent.parent.remove(self.startnode.parent)
+
+    def build_contents(self, node, level=0):
+        level += 1
+        sections = []
+        i = len(node) - 1
+        while i >= 0 and isinstance(node[i], nodes.section):
+            sections.append(node[i])
+            i -= 1
+        sections.reverse()
+        entries = []
+        autonum = 0
+        depth = self.startnode.details.get('depth', sys.maxint)
+        for section in sections:
+            title = section[0]
+            auto = title.get('auto')    # May be set by SectNum.
+            entrytext = self.copy_and_filter(title)
+            reference = nodes.reference('', '', refid=section['ids'][0],
+                                        *entrytext)
+            ref_id = self.document.set_id(reference)
+            entry = nodes.paragraph('', '', reference)
+            item = nodes.list_item('', entry)
+            if ( self.backlinks in ('entry', 'top')
+                 and title.next_node(nodes.reference) is None):
+                if self.backlinks == 'entry':
+                    title['refid'] = ref_id
+                elif self.backlinks == 'top':
+                    title['refid'] = self.toc_id
+            if level < depth:
+                subsects = self.build_contents(section, level)
+                item += subsects
+            entries.append(item)
+        if entries:
+            contents = nodes.bullet_list('', *entries)
+            if auto:
+                contents['classes'].append('auto-toc')
+            return contents
+        else:
+            return []
+
+    def copy_and_filter(self, node):
+        """Return a copy of a title, with references, images, etc. removed."""
+        visitor = ContentsFilter(self.document)
+        node.walkabout(visitor)
+        return visitor.get_entry_text()
+
+
+class ContentsFilter(nodes.TreeCopyVisitor):
+
+    def get_entry_text(self):
+        return self.get_tree_copy().children
+
+    def visit_citation_reference(self, node):
+        raise nodes.SkipNode
+
+    def visit_footnote_reference(self, node):
+        raise nodes.SkipNode
+
+    def visit_image(self, node):
+        if node.hasattr('alt'):
+            self.parent.append(nodes.Text(node['alt']))
+        raise nodes.SkipNode
+
+    def ignore_node_but_process_children(self, node):
+        raise nodes.SkipDeparture
+
+    visit_interpreted = ignore_node_but_process_children
+    visit_problematic = ignore_node_but_process_children
+    visit_reference = ignore_node_but_process_children
+    visit_target = ignore_node_but_process_children
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/transforms/writer_aux.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/transforms/writer_aux.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/transforms/writer_aux.py (revision 3)
@@ -0,0 +1,52 @@
+# Authors: Felix Wiemann
+# Contact: Felix_Wiemann@ososo.de
+# Revision: $Revision: 3909 $
+# Date: $Date: 2005-09-26 20:17:31 +0200 (Mon, 26 Sep 2005) $
+# Copyright: This module has been placed in the public domain.
+
+"""
+Auxiliary transforms mainly to be used by Writer components.
+
+This module is called "writer_aux" because otherwise there would be
+conflicting imports like this one::
+
+    from docutils import writers
+    from docutils.transforms import writers
+"""
+
+__docformat__ = 'reStructuredText'
+
+from docutils import nodes, utils
+from docutils.transforms import Transform
+
+
+class Compound(Transform):
+
+    """
+    Flatten all compound paragraphs.  For example, transform ::
+
+        <compound>
+            <paragraph>
+            <literal_block>
+            <paragraph>
+
+    into ::
+
+        <paragraph>
+        <literal_block classes="continued">
+        <paragraph classes="continued">
+    """
+
+    default_priority = 810
+
+    def apply(self):
+        for compound in self.document.traverse(nodes.compound):
+            first_child = 1
+            for child in compound:
+                if first_child:
+                    if not isinstance(child, nodes.Invisible):
+                        first_child = 0
+                else:
+                    child['classes'].append('continued')
+            # Substitute children for compound.
+            compound.replace_self(compound[:])
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/transforms/misc.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/transforms/misc.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/transforms/misc.py (revision 3)
@@ -0,0 +1,145 @@
+# Author: David Goodger
+# Contact: goodger@users.sourceforge.net
+# Revision: $Revision: 3909 $
+# Date: $Date: 2005-09-26 20:17:31 +0200 (Mon, 26 Sep 2005) $
+# Copyright: This module has been placed in the public domain.
+
+"""
+Miscellaneous transforms.
+"""
+
+__docformat__ = 'reStructuredText'
+
+from docutils import nodes
+from docutils.transforms import Transform, TransformError
+
+
+class CallBack(Transform):
+
+    """
+    Inserts a callback into a document.  The callback is called when the
+    transform is applied, which is determined by its priority.
+
+    For use with `nodes.pending` elements.  Requires a ``details['callback']``
+    entry, a bound method or function which takes one parameter: the pending
+    node.  Other data can be stored in the ``details`` attribute or in the
+    object hosting the callback method.
+    """
+
+    default_priority = 990
+
+    def apply(self):
+        pending = self.startnode
+        pending.details['callback'](pending)
+        pending.parent.remove(pending)
+
+
+class ClassAttribute(Transform):
+
+    """
+    Move the "class" attribute specified in the "pending" node into the
+    immediately following non-comment element.
+    """
+
+    default_priority = 210
+
+    def apply(self):
+        pending = self.startnode
+        parent = pending.parent
+        child = pending
+        while parent:
+            # Check for appropriate following siblings:
+            for index in range(parent.index(child) + 1, len(parent)):
+                element = parent[index]
+                if (isinstance(element, nodes.Invisible) or
+                    isinstance(element, nodes.system_message)):
+                    continue
+                element['classes'] += pending.details['class']
+                pending.parent.remove(pending)
+                return
+            else:
+                # At end of section or container; apply to sibling
+                child = parent
+                parent = parent.parent
+        error = self.document.reporter.error(
+            'No suitable element following "%s" directive'
+            % pending.details['directive'],
+            nodes.literal_block(pending.rawsource, pending.rawsource),
+            line=pending.line)
+        pending.replace_self(error)
+
+
+class Transitions(Transform):
+
+    """
+    Move transitions at the end of sections up the tree.  Complain
+    on transitions after a title, at the beginning or end of the
+    document, and after another transition.
+
+    For example, transform this::
+
+        <section>
+            ...
+            <transition>
+        <section>
+            ...
+
+    into this::
+
+        <section>
+            ...
+        <transition>
+        <section>
+            ...
+    """
+
+    default_priority = 830
+
+    def apply(self):
+        for node in self.document.traverse(nodes.transition):
+            self.visit_transition(node)
+
+    def visit_transition(self, node):
+        index = node.parent.index(node)
+        error = None
+        if (index == 0 or
+            isinstance(node.parent[0], nodes.title) and
+            (index == 1 or
+             isinstance(node.parent[1], nodes.subtitle) and
+             index == 2)):
+            assert (isinstance(node.parent, nodes.document) or
+                    isinstance(node.parent, nodes.section))
+            error = self.document.reporter.error(
+                'Document or section may not begin with a transition.',
+                line=node.line)
+        elif isinstance(node.parent[index - 1], nodes.transition):
+            error = self.document.reporter.error(
+                'At least one body element must separate transitions; '
+                'adjacent transitions are not allowed.', line=node.line)
+        if error:
+            # Insert before node and update index.
+            node.parent.insert(index, error)
+            index += 1
+        assert index < len(node.parent)
+        if index != len(node.parent) - 1:
+            # No need to move the node.
+            return
+        # Node behind which the transition is to be moved.
+        sibling = node
+        # While sibling is the last node of its parent.
+        while index == len(sibling.parent) - 1:
+            sibling = sibling.parent
+            # If sibling is the whole document (i.e. it has no parent).
+            if sibling.parent is None:
+                # Transition at the end of document.  Do not move the
+                # transition up, and place an error behind.
+                error = self.document.reporter.error(
+                    'Document may not end with a transition.',
+                    line=node.line)
+                node.parent.insert(node.parent.index(node) + 1, error)
+                return
+            index = sibling.parent.index(sibling)
+        # Remove the original transition node.
+        node.parent.remove(node)
+        # Insert the transition after the sibling.
+        sibling.parent.insert(index + 1, node)
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/transforms/__init__.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/transforms/__init__.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/transforms/__init__.py (revision 3)
@@ -0,0 +1,176 @@
+# Authors: David Goodger, Ueli Schlaepfer
+# Contact: goodger@users.sourceforge.net
+# Revision: $Revision: 3892 $
+# Date: $Date: 2005-09-20 22:04:53 +0200 (Tue, 20 Sep 2005) $
+# Copyright: This module has been placed in the public domain.
+
+"""
+This package contains modules for standard tree transforms available
+to Docutils components. Tree transforms serve a variety of purposes:
+
+- To tie up certain syntax-specific "loose ends" that remain after the
+  initial parsing of the input plaintext. These transforms are used to
+  supplement a limited syntax.
+
+- To automate the internal linking of the document tree (hyperlink
+  references, footnote references, etc.).
+
+- To extract useful information from the document tree. These
+  transforms may be used to construct (for example) indexes and tables
+  of contents.
+
+Each transform is an optional step that a Docutils Reader may choose to
+perform on the parsed document, depending on the input context. A Docutils
+Reader may also perform Reader-specific transforms before or after performing
+these standard transforms.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+from docutils import languages, ApplicationError, TransformSpec
+
+
+class TransformError(ApplicationError): pass
+
+
+class Transform:
+
+    """
+    Docutils transform component abstract base class.
+    """
+
+    default_priority = None
+    """Numerical priority of this transform, 0 through 999 (override)."""
+
+    def __init__(self, document, startnode=None):
+        """
+        Initial setup for in-place document transforms.
+        """
+
+        self.document = document
+        """The document tree to transform."""
+
+        self.startnode = startnode
+        """Node from which to begin the transform.  For many transforms which
+        apply to the document as a whole, `startnode` is not set (i.e. its
+        value is `None`)."""
+
+        self.language = languages.get_language(
+            document.settings.language_code)
+        """Language module local to this document."""
+
+    def apply(self, **kwargs):
+        """Override to apply the transform to the document tree."""
+        raise NotImplementedError('subclass must override this method')
+
+
+class Transformer(TransformSpec):
+
+    """
+    Stores transforms (`Transform` classes) and applies them to document
+    trees.  Also keeps track of components by component type name.
+    """
+
+    def __init__(self, document):
+        self.transforms = []
+        """List of transforms to apply.  Each item is a 3-tuple:
+        ``(priority string, transform class, pending node or None)``."""
+
+        self.unknown_reference_resolvers = []
+        """List of hook functions which assist in resolving references"""
+
+        self.document = document
+        """The `nodes.document` object this Transformer is attached to."""
+
+        self.applied = []
+        """Transforms already applied, in order."""
+
+        self.sorted = 0
+        """Boolean: is `self.tranforms` sorted?"""
+
+        self.components = {}
+        """Mapping of component type name to component object.  Set by
+        `self.populate_from_components()`."""
+
+        self.serialno = 0
+        """Internal serial number to keep track of the add order of
+        transforms."""
+
+    def add_transform(self, transform_class, priority=None, **kwargs):
+        """
+        Store a single transform.  Use `priority` to override the default.
+        `kwargs` is a dictionary whose contents are passed as keyword
+        arguments to the `apply` method of the transform.  This can be used to
+        pass application-specific data to the transform instance.
+        """
+        if priority is None:
+            priority = transform_class.default_priority
+        priority_string = self.get_priority_string(priority)
+        self.transforms.append(
+            (priority_string, transform_class, None, kwargs))
+        self.sorted = 0
+
+    def add_transforms(self, transform_list):
+        """Store multiple transforms, with default priorities."""
+        for transform_class in transform_list:
+            priority_string = self.get_priority_string(
+                transform_class.default_priority)
+            self.transforms.append(
+                (priority_string, transform_class, None, {}))
+        self.sorted = 0
+
+    def add_pending(self, pending, priority=None):
+        """Store a transform with an associated `pending` node."""
+        transform_class = pending.transform
+        if priority is None:
+            priority = transform_class.default_priority
+        priority_string = self.get_priority_string(priority)
+        self.transforms.append(
+            (priority_string, transform_class, pending, {}))
+        self.sorted = 0
+
+    def get_priority_string(self, priority):
+        """
+        Return a string, `priority` combined with `self.serialno`.
+
+        This ensures FIFO order on transforms with identical priority.
+        """
+        self.serialno += 1
+        return '%03d-%03d' % (priority, self.serialno)
+
+    def populate_from_components(self, components):
+        """
+        Store each component's default transforms, with default priorities.
+        Also, store components by type name in a mapping for later lookup.
+        """
+        for component in components:
+            if component is None:
+                continue
+            self.add_transforms(component.get_transforms())
+            self.components[component.component_type] = component
+        self.sorted = 0
+        # Set up all of the reference resolvers for this transformer. Each
+        # component of this transformer is able to register its own helper
+        # functions to help resolve references.
+        unknown_reference_resolvers = []
+        for i in components:
+            unknown_reference_resolvers.extend(i.unknown_reference_resolvers)
+        decorated_list = [(f.priority, f) for f in unknown_reference_resolvers]
+        decorated_list.sort()
+        self.unknown_reference_resolvers.extend([f[1] for f in decorated_list])
+
+    def apply_transforms(self):
+        """Apply all of the stored transforms, in priority order."""
+        self.document.reporter.attach_observer(
+            self.document.note_transform_message)
+        while self.transforms:
+            if not self.sorted:
+                # Unsorted initially, and whenever a transform is added.
+                self.transforms.sort()
+                self.transforms.reverse()
+                self.sorted = 1
+            priority, transform_class, pending, kwargs = self.transforms.pop()
+            transform = transform_class(self.document, startnode=pending)
+            transform.apply(**kwargs)
+            self.applied.append((priority, transform_class, pending, kwargs))
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/transforms/references.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/transforms/references.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/transforms/references.py (revision 3)
@@ -0,0 +1,906 @@
+# Author: David Goodger
+# Contact: goodger@users.sourceforge.net
+# Revision: $Revision: 4233 $
+# Date: $Date: 2005-12-29 00:48:48 +0100 (Thu, 29 Dec 2005) $
+# Copyright: This module has been placed in the public domain.
+
+"""
+Transforms for resolving references.
+"""
+
+__docformat__ = 'reStructuredText'
+
+import sys
+import re
+from docutils import nodes, utils
+from docutils.transforms import TransformError, Transform
+
+
+class PropagateTargets(Transform):
+
+    """
+    Propagate empty internal targets to the next element.
+
+    Given the following nodes::
+
+        <target ids="internal1" names="internal1">
+        <target anonymous="1" ids="id1">
+        <target ids="internal2" names="internal2">
+        <paragraph>
+            This is a test.
+
+    PropagateTargets propagates the ids and names of the internal
+    targets preceding the paragraph to the paragraph itself::
+
+        <target refid="internal1">
+        <target anonymous="1" refid="id1">
+        <target refid="internal2">
+        <paragraph ids="internal2 id1 internal1" names="internal2 internal1">
+            This is a test.
+    """
+
+    default_priority = 260
+
+    def apply(self):
+        for target in self.document.traverse(nodes.target):
+            # Only block-level targets without reference (like ".. target:"):
+            if (isinstance(target.parent, nodes.TextElement) or
+                (target.hasattr('refid') or target.hasattr('refuri') or
+                 target.hasattr('refname'))):
+                continue
+            assert len(target) == 0, 'error: block-level target has children'
+            next_node = target.next_node(ascend=1)
+            # Do not move names and ids into Invisibles (we'd lose the
+            # attributes) or different Targetables (e.g. footnotes).
+            if (next_node is not None and
+                ((not isinstance(next_node, nodes.Invisible) and
+                  not isinstance(next_node, nodes.Targetable)) or
+                 isinstance(next_node, nodes.target))):
+                next_node['ids'].extend(target['ids'])
+                next_node['names'].extend(target['names'])
+                # Set defaults for next_node.expect_referenced_by_name/id.
+                if not hasattr(next_node, 'expect_referenced_by_name'):
+                    next_node.expect_referenced_by_name = {}
+                if not hasattr(next_node, 'expect_referenced_by_id'):
+                    next_node.expect_referenced_by_id = {}
+                for id in target['ids']:
+                    # Update IDs to node mapping.
+                    self.document.ids[id] = next_node
+                    # If next_node is referenced by id ``id``, this
+                    # target shall be marked as referenced.
+                    next_node.expect_referenced_by_id[id] = target
+                for name in target['names']:
+                    next_node.expect_referenced_by_name[name] = target
+                # If there are any expect_referenced_by_... attributes
+                # in target set, copy them to next_node.
+                next_node.expect_referenced_by_name.update(
+                    getattr(target, 'expect_referenced_by_name', {}))
+                next_node.expect_referenced_by_id.update(
+                    getattr(target, 'expect_referenced_by_id', {}))
+                # Set refid to point to the first former ID of target
+                # which is now an ID of next_node.
+                target['refid'] = target['ids'][0]
+                # Clear ids and names; they have been moved to
+                # next_node.
+                target['ids'] = []
+                target['names'] = []
+                self.document.note_refid(target)
+
+
+class AnonymousHyperlinks(Transform):
+
+    """
+    Link anonymous references to targets.  Given::
+
+        <paragraph>
+            <reference anonymous="1">
+                internal
+            <reference anonymous="1">
+                external
+        <target anonymous="1" ids="id1">
+        <target anonymous="1" ids="id2" refuri="http://external">
+
+    Corresponding references are linked via "refid" or resolved via "refuri"::
+
+        <paragraph>
+            <reference anonymous="1" refid="id1">
+                text
+            <reference anonymous="1" refuri="http://external">
+                external
+        <target anonymous="1" ids="id1">
+        <target anonymous="1" ids="id2" refuri="http://external">
+    """
+
+    default_priority = 440
+
+    def apply(self):
+        anonymous_refs = []
+        anonymous_targets = []
+        for node in self.document.traverse(nodes.reference):
+            if node.get('anonymous'):
+                anonymous_refs.append(node)
+        for node in self.document.traverse(nodes.target):
+            if node.get('anonymous'):
+                anonymous_targets.append(node)
+        if len(anonymous_refs) \
+              != len(anonymous_targets):
+            msg = self.document.reporter.error(
+                  'Anonymous hyperlink mismatch: %s references but %s '
+                  'targets.\nSee "backrefs" attribute for IDs.'
+                  % (len(anonymous_refs), len(anonymous_targets)))
+            msgid = self.document.set_id(msg)
+            for ref in anonymous_refs:
+                prb = nodes.problematic(
+                      ref.rawsource, ref.rawsource, refid=msgid)
+                prbid = self.document.set_id(prb)
+                msg.add_backref(prbid)
+                ref.replace_self(prb)
+            return
+        for ref, target in zip(anonymous_refs, anonymous_targets):
+            target.referenced = 1
+            while 1:
+                if target.hasattr('refuri'):
+                    ref['refuri'] = target['refuri']
+                    ref.resolved = 1
+                    break
+                else:
+                    if not target['ids']:
+                        # Propagated target.
+                        target = self.document.ids[target['refid']]
+                        continue
+                    ref['refid'] = target['ids'][0]
+                    self.document.note_refid(ref)
+                    break
+
+
+class IndirectHyperlinks(Transform):
+
+    """
+    a) Indirect external references::
+
+           <paragraph>
+               <reference refname="indirect external">
+                   indirect external
+           <target id="id1" name="direct external"
+               refuri="http://indirect">
+           <target id="id2" name="indirect external"
+               refname="direct external">
+
+       The "refuri" attribute is migrated back to all indirect targets
+       from the final direct target (i.e. a target not referring to
+       another indirect target)::
+
+           <paragraph>
+               <reference refname="indirect external">
+                   indirect external
+           <target id="id1" name="direct external"
+               refuri="http://indirect">
+           <target id="id2" name="indirect external"
+               refuri="http://indirect">
+
+       Once the attribute is migrated, the preexisting "refname" attribute
+       is dropped.
+
+    b) Indirect internal references::
+
+           <target id="id1" name="final target">
+           <paragraph>
+               <reference refname="indirect internal">
+                   indirect internal
+           <target id="id2" name="indirect internal 2"
+               refname="final target">
+           <target id="id3" name="indirect internal"
+               refname="indirect internal 2">
+
+       Targets which indirectly refer to an internal target become one-hop
+       indirect (their "refid" attributes are directly set to the internal
+       target's "id"). References which indirectly refer to an internal
+       target become direct internal references::
+
+           <target id="id1" name="final target">
+           <paragraph>
+               <reference refid="id1">
+                   indirect internal
+           <target id="id2" name="indirect internal 2" refid="id1">
+           <target id="id3" name="indirect internal" refid="id1">
+    """
+
+    default_priority = 460
+
+    def apply(self):
+        for target in self.document.indirect_targets:
+            if not target.resolved:
+                self.resolve_indirect_target(target)
+            self.resolve_indirect_references(target)
+
+    def resolve_indirect_target(self, target):
+        refname = target.get('refname')
+        if refname is None:
+            reftarget_id = target['refid']
+        else:
+            reftarget_id = self.document.nameids.get(refname)
+            if not reftarget_id:
+                # Check the unknown_reference_resolvers
+                for resolver_function in \
+                        self.document.transformer.unknown_reference_resolvers:
+                    if resolver_function(target):
+                        break
+                else:
+                    self.nonexistent_indirect_target(target)
+                return
+        reftarget = self.document.ids[reftarget_id]
+        reftarget.note_referenced_by(id=reftarget_id)
+        if isinstance(reftarget, nodes.target) \
+               and not reftarget.resolved and reftarget.hasattr('refname'):
+            if hasattr(target, 'multiply_indirect'):
+                #and target.multiply_indirect):
+                #del target.multiply_indirect
+                self.circular_indirect_reference(target)
+                return
+            target.multiply_indirect = 1
+            self.resolve_indirect_target(reftarget) # multiply indirect
+            del target.multiply_indirect
+        if reftarget.hasattr('refuri'):
+            target['refuri'] = reftarget['refuri']
+            if target.has_key('refid'):
+                del target['refid']
+        elif reftarget.hasattr('refid'):
+            target['refid'] = reftarget['refid']
+            self.document.note_refid(target)
+        else:
+            if reftarget['ids']:
+                target['refid'] = reftarget_id
+                self.document.note_refid(target)
+            else:
+                self.nonexistent_indirect_target(target)
+                return
+        if refname is not None:
+            del target['refname']
+        target.resolved = 1
+
+    def nonexistent_indirect_target(self, target):
+        if self.document.nameids.has_key(target['refname']):
+            self.indirect_target_error(target, 'which is a duplicate, and '
+                                       'cannot be used as a unique reference')
+        else:
+            self.indirect_target_error(target, 'which does not exist')
+
+    def circular_indirect_reference(self, target):
+        self.indirect_target_error(target, 'forming a circular reference')
+
+    def indirect_target_error(self, target, explanation):
+        naming = ''
+        reflist = []
+        if target['names']:
+            naming = '"%s" ' % target['names'][0]
+        for name in target['names']:
+            reflist.extend(self.document.refnames.get(name, []))
+        for id in target['ids']:
+            reflist.extend(self.document.refids.get(id, []))
+        naming += '(id="%s")' % target['ids'][0]
+        msg = self.document.reporter.error(
+              'Indirect hyperlink target %s refers to target "%s", %s.'
+              % (naming, target['refname'], explanation), base_node=target)
+        msgid = self.document.set_id(msg)
+        for ref in uniq(reflist):
+            prb = nodes.problematic(
+                  ref.rawsource, ref.rawsource, refid=msgid)
+            prbid = self.document.set_id(prb)
+            msg.add_backref(prbid)
+            ref.replace_self(prb)
+        target.resolved = 1
+
+    def resolve_indirect_references(self, target):
+        if target.hasattr('refid'):
+            attname = 'refid'
+            call_method = self.document.note_refid
+        elif target.hasattr('refuri'):
+            attname = 'refuri'
+            call_method = None
+        else:
+            return
+        attval = target[attname]
+        for name in target['names']:
+            reflist = self.document.refnames.get(name, [])
+            if reflist:
+                target.note_referenced_by(name=name)
+            for ref in reflist:
+                if ref.resolved:
+                    continue
+                del ref['refname']
+                ref[attname] = attval
+                if call_method:
+                    call_method(ref)
+                ref.resolved = 1
+                if isinstance(ref, nodes.target):
+                    self.resolve_indirect_references(ref)
+        for id in target['ids']:
+            reflist = self.document.refids.get(id, [])
+            if reflist:
+                target.note_referenced_by(id=id)
+            for ref in reflist:
+                if ref.resolved:
+                    continue
+                del ref['refid']
+                ref[attname] = attval
+                if call_method:
+                    call_method(ref)
+                ref.resolved = 1
+                if isinstance(ref, nodes.target):
+                    self.resolve_indirect_references(ref)
+
+
+class ExternalTargets(Transform):
+
+    """
+    Given::
+
+        <paragraph>
+            <reference refname="direct external">
+                direct external
+        <target id="id1" name="direct external" refuri="http://direct">
+
+    The "refname" attribute is replaced by the direct "refuri" attribute::
+
+        <paragraph>
+            <reference refuri="http://direct">
+                direct external
+        <target id="id1" name="direct external" refuri="http://direct">
+    """
+
+    default_priority = 640
+
+    def apply(self):
+        for target in self.document.traverse(nodes.target):
+            if target.hasattr('refuri'):
+                refuri = target['refuri']
+                for name in target['names']:
+                    reflist = self.document.refnames.get(name, [])
+                    if reflist:
+                        target.note_referenced_by(name=name)
+                    for ref in reflist:
+                        if ref.resolved:
+                            continue
+                        del ref['refname']
+                        ref['refuri'] = refuri
+                        ref.resolved = 1
+
+
+class InternalTargets(Transform):
+
+    default_priority = 660
+
+    def apply(self):
+        for target in self.document.traverse(nodes.target):
+            if not target.hasattr('refuri') and not target.hasattr('refid'):
+                self.resolve_reference_ids(target)
+
+    def resolve_reference_ids(self, target):
+        """
+        Given::
+
+            <paragraph>
+                <reference refname="direct internal">
+                    direct internal
+            <target id="id1" name="direct internal">
+
+        The "refname" attribute is replaced by "refid" linking to the target's
+        "id"::
+
+            <paragraph>
+                <reference refid="id1">
+                    direct internal
+            <target id="id1" name="direct internal">
+        """
+        for name in target['names']:
+            refid = self.document.nameids[name]
+            reflist = self.document.refnames.get(name, [])
+            if reflist:
+                target.note_referenced_by(name=name)
+            for ref in reflist:
+                if ref.resolved:
+                    continue
+                del ref['refname']
+                ref['refid'] = refid
+                ref.resolved = 1
+
+
+class Footnotes(Transform):
+
+    """
+    Assign numbers to autonumbered footnotes, and resolve links to footnotes,
+    citations, and their references.
+
+    Given the following ``document`` as input::
+
+        <document>
+            <paragraph>
+                A labeled autonumbered footnote referece:
+                <footnote_reference auto="1" id="id1" refname="footnote">
+            <paragraph>
+                An unlabeled autonumbered footnote referece:
+                <footnote_reference auto="1" id="id2">
+            <footnote auto="1" id="id3">
+                <paragraph>
+                    Unlabeled autonumbered footnote.
+            <footnote auto="1" id="footnote" name="footnote">
+                <paragraph>
+                    Labeled autonumbered footnote.
+
+    Auto-numbered footnotes have attribute ``auto="1"`` and no label.
+    Auto-numbered footnote_references have no reference text (they're
+    empty elements). When resolving the numbering, a ``label`` element
+    is added to the beginning of the ``footnote``, and reference text
+    to the ``footnote_reference``.
+
+    The transformed result will be::
+
+        <document>
+            <paragraph>
+                A labeled autonumbered footnote referece:
+                <footnote_reference auto="1" id="id1" refid="footnote">
+                    2
+            <paragraph>
+                An unlabeled autonumbered footnote referece:
+                <footnote_reference auto="1" id="id2" refid="id3">
+                    1
+            <footnote auto="1" id="id3" backrefs="id2">
+                <label>
+                    1
+                <paragraph>
+                    Unlabeled autonumbered footnote.
+            <footnote auto="1" id="footnote" name="footnote" backrefs="id1">
+                <label>
+                    2
+                <paragraph>
+                    Labeled autonumbered footnote.
+
+    Note that the footnotes are not in the same order as the references.
+
+    The labels and reference text are added to the auto-numbered ``footnote``
+    and ``footnote_reference`` elements.  Footnote elements are backlinked to
+    their references via "refids" attributes.  References are assigned "id"
+    and "refid" attributes.
+
+    After adding labels and reference text, the "auto" attributes can be
+    ignored.
+    """
+
+    default_priority = 620
+
+    autofootnote_labels = None
+    """Keep track of unlabeled autonumbered footnotes."""
+
+    symbols = [
+          # Entries 1-4 and 6 below are from section 12.51 of
+          # The Chicago Manual of Style, 14th edition.
+          '*',                          # asterisk/star
+          u'\u2020',                    # dagger &dagger;
+          u'\u2021',                    # double dagger &Dagger;
+          u'\u00A7',                    # section mark &sect;
+          u'\u00B6',                    # paragraph mark (pilcrow) &para;
+                                        # (parallels ['||'] in CMoS)
+          '#',                          # number sign
+          # The entries below were chosen arbitrarily.
+          u'\u2660',                    # spade suit &spades;
+          u'\u2665',                    # heart suit &hearts;
+          u'\u2666',                    # diamond suit &diams;
+          u'\u2663',                    # club suit &clubs;
+          ]
+
+    def apply(self):
+        self.autofootnote_labels = []
+        startnum = self.document.autofootnote_start
+        self.document.autofootnote_start = self.number_footnotes(startnum)
+        self.number_footnote_references(startnum)
+        self.symbolize_footnotes()
+        self.resolve_footnotes_and_citations()
+
+    def number_footnotes(self, startnum):
+        """
+        Assign numbers to autonumbered footnotes.
+
+        For labeled autonumbered footnotes, copy the number over to
+        corresponding footnote references.
+        """
+        for footnote in self.document.autofootnotes:
+            while 1:
+                label = str(startnum)
+                startnum += 1
+                if not self.document.nameids.has_key(label):
+                    break
+            footnote.insert(0, nodes.label('', label))
+            for name in footnote['names']:
+                for ref in self.document.footnote_refs.get(name, []):
+                    ref += nodes.Text(label)
+                    ref.delattr('refname')
+                    assert len(footnote['ids']) == len(ref['ids']) == 1
+                    ref['refid'] = footnote['ids'][0]
+                    footnote.add_backref(ref['ids'][0])
+                    self.document.note_refid(ref)
+                    ref.resolved = 1
+            if not footnote['names'] and not footnote['dupnames']:
+                footnote['names'].append(label)
+                self.document.note_explicit_target(footnote, footnote)
+                self.autofootnote_labels.append(label)
+        return startnum
+
+    def number_footnote_references(self, startnum):
+        """Assign numbers to autonumbered footnote references."""
+        i = 0
+        for ref in self.document.autofootnote_refs:
+            if ref.resolved or ref.hasattr('refid'):
+                continue
+            try:
+                label = self.autofootnote_labels[i]
+            except IndexError:
+                msg = self.document.reporter.error(
+                      'Too many autonumbered footnote references: only %s '
+                      'corresponding footnotes available.'
+                      % len(self.autofootnote_labels), base_node=ref)
+                msgid = self.document.set_id(msg)
+                for ref in self.document.autofootnote_refs[i:]:
+                    if ref.resolved or ref.hasattr('refname'):
+                        continue
+                    prb = nodes.problematic(
+                          ref.rawsource, ref.rawsource, refid=msgid)
+                    prbid = self.document.set_id(prb)
+                    msg.add_backref(prbid)
+                    ref.replace_self(prb)
+                break
+            ref += nodes.Text(label)
+            id = self.document.nameids[label]
+            footnote = self.document.ids[id]
+            ref['refid'] = id
+            self.document.note_refid(ref)
+            assert len(ref['ids']) == 1
+            footnote.add_backref(ref['ids'][0])
+            ref.resolved = 1
+            i += 1
+
+    def symbolize_footnotes(self):
+        """Add symbols indexes to "[*]"-style footnotes and references."""
+        labels = []
+        for footnote in self.document.symbol_footnotes:
+            reps, index = divmod(self.document.symbol_footnote_start,
+                                 len(self.symbols))
+            labeltext = self.symbols[index] * (reps + 1)
+            labels.append(labeltext)
+            footnote.insert(0, nodes.label('', labeltext))
+            self.document.symbol_footnote_start += 1
+            self.document.set_id(footnote)
+        i = 0
+        for ref in self.document.symbol_footnote_refs:
+            try:
+                ref += nodes.Text(labels[i])
+            except IndexError:
+                msg = self.document.reporter.error(
+                      'Too many symbol footnote references: only %s '
+                      'corresponding footnotes available.' % len(labels),
+                      base_node=ref)
+                msgid = self.document.set_id(msg)
+                for ref in self.document.symbol_footnote_refs[i:]:
+                    if ref.resolved or ref.hasattr('refid'):
+                        continue
+                    prb = nodes.problematic(
+                          ref.rawsource, ref.rawsource, refid=msgid)
+                    prbid = self.document.set_id(prb)
+                    msg.add_backref(prbid)
+                    ref.replace_self(prb)
+                break
+            footnote = self.document.symbol_footnotes[i]
+            assert len(footnote['ids']) == 1
+            ref['refid'] = footnote['ids'][0]
+            self.document.note_refid(ref)
+            footnote.add_backref(ref['ids'][0])
+            i += 1
+
+    def resolve_footnotes_and_citations(self):
+        """
+        Link manually-labeled footnotes and citations to/from their
+        references.
+        """
+        for footnote in self.document.footnotes:
+            for label in footnote['names']:
+                if self.document.footnote_refs.has_key(label):
+                    reflist = self.document.footnote_refs[label]
+                    self.resolve_references(footnote, reflist)
+        for citation in self.document.citations:
+            for label in citation['names']:
+                if self.document.citation_refs.has_key(label):
+                    reflist = self.document.citation_refs[label]
+                    self.resolve_references(citation, reflist)
+
+    def resolve_references(self, note, reflist):
+        assert len(note['ids']) == 1
+        id = note['ids'][0]
+        for ref in reflist:
+            if ref.resolved:
+                continue
+            ref.delattr('refname')
+            ref['refid'] = id
+            assert len(ref['ids']) == 1
+            note.add_backref(ref['ids'][0])
+            ref.resolved = 1
+        note.resolved = 1
+
+
+class CircularSubstitutionDefinitionError(Exception): pass
+
+
+class Substitutions(Transform):
+
+    """
+    Given the following ``document`` as input::
+
+        <document>
+            <paragraph>
+                The
+                <substitution_reference refname="biohazard">
+                    biohazard
+                 symbol is deservedly scary-looking.
+            <substitution_definition name="biohazard">
+                <image alt="biohazard" uri="biohazard.png">
+
+    The ``substitution_reference`` will simply be replaced by the
+    contents of the corresponding ``substitution_definition``.
+
+    The transformed result will be::
+
+        <document>
+            <paragraph>
+                The
+                <image alt="biohazard" uri="biohazard.png">
+                 symbol is deservedly scary-looking.
+            <substitution_definition name="biohazard">
+                <image alt="biohazard" uri="biohazard.png">
+    """
+
+    default_priority = 220
+    """The Substitutions transform has to be applied very early, before
+    `docutils.tranforms.frontmatter.DocTitle` and others."""
+
+    def apply(self):
+        defs = self.document.substitution_defs
+        normed = self.document.substitution_names
+        subreflist = self.document.traverse(nodes.substitution_reference)
+        nested = {}
+        for ref in subreflist:
+            refname = ref['refname']
+            key = None
+            if defs.has_key(refname):
+                key = refname
+            else:
+                normed_name = refname.lower()
+                if normed.has_key(normed_name):
+                    key = normed[normed_name]
+            if key is None:
+                msg = self.document.reporter.error(
+                      'Undefined substitution referenced: "%s".'
+                      % refname, base_node=ref)
+                msgid = self.document.set_id(msg)
+                prb = nodes.problematic(
+                      ref.rawsource, ref.rawsource, refid=msgid)
+                prbid = self.document.set_id(prb)
+                msg.add_backref(prbid)
+                ref.replace_self(prb)
+            else:
+                subdef = defs[key]
+                parent = ref.parent
+                index = parent.index(ref)
+                if  (subdef.attributes.has_key('ltrim')
+                     or subdef.attributes.has_key('trim')):
+                    if index > 0 and isinstance(parent[index - 1],
+                                                nodes.Text):
+                        parent.replace(parent[index - 1],
+                                       parent[index - 1].rstrip())
+                if  (subdef.attributes.has_key('rtrim')
+                     or subdef.attributes.has_key('trim')):
+                    if  (len(parent) > index + 1
+                         and isinstance(parent[index + 1], nodes.Text)):
+                        parent.replace(parent[index + 1],
+                                       parent[index + 1].lstrip())
+                subdef_copy = subdef.deepcopy()
+                try:
+                    # Take care of nested substitution references:
+                    for nested_ref in subdef_copy.traverse(
+                          nodes.substitution_reference):
+                        nested_name = normed[nested_ref['refname'].lower()]
+                        if nested_name in nested.setdefault(nested_name, []):
+                            raise CircularSubstitutionDefinitionError
+                        else:
+                            nested[nested_name].append(key)
+                            subreflist.append(nested_ref)
+                except CircularSubstitutionDefinitionError:
+                    parent = ref.parent
+                    if isinstance(parent, nodes.substitution_definition):
+                        msg = self.document.reporter.error(
+                            'Circular substitution definition detected:',
+                            nodes.literal_block(parent.rawsource,
+                                                parent.rawsource),
+                            line=parent.line, base_node=parent)
+                        parent.replace_self(msg)
+                    else:
+                        msg = self.document.reporter.error(
+                            'Circular substitution definition referenced: "%s".'
+                            % refname, base_node=ref)
+                        msgid = self.document.set_id(msg)
+                        prb = nodes.problematic(
+                            ref.rawsource, ref.rawsource, refid=msgid)
+                        prbid = self.document.set_id(prb)
+                        msg.add_backref(prbid)
+                        ref.replace_self(prb)
+                else:
+                    ref.replace_self(subdef_copy.children)
+
+
+class TargetNotes(Transform):
+
+    """
+    Creates a footnote for each external target in the text, and corresponding
+    footnote references after each reference.
+    """
+
+    default_priority = 540
+    """The TargetNotes transform has to be applied after `IndirectHyperlinks`
+    but before `Footnotes`."""
+
+
+    def __init__(self, document, startnode):
+        Transform.__init__(self, document, startnode=startnode)
+
+        self.classes = startnode.details.get('class', [])
+
+    def apply(self):
+        notes = {}
+        nodelist = []
+        for target in self.document.traverse(nodes.target):
+            # Only external targets.
+            if not target.hasattr('refuri'):
+                continue
+            names = target['names']
+            refs = []
+            for name in names:
+                refs.extend(self.document.refnames.get(name, []))
+            if not refs:
+                continue
+            footnote = self.make_target_footnote(target['refuri'], refs,
+                                                 notes)
+            if not notes.has_key(target['refuri']):
+                notes[target['refuri']] = footnote
+                nodelist.append(footnote)
+        # Take care of anonymous references.
+        for ref in self.document.traverse(nodes.reference):
+            if not ref.get('anonymous'):
+                continue
+            if ref.hasattr('refuri'):
+                footnote = self.make_target_footnote(ref['refuri'], [ref],
+                                                     notes)
+                if not notes.has_key(ref['refuri']):
+                    notes[ref['refuri']] = footnote
+                    nodelist.append(footnote)
+        self.startnode.replace_self(nodelist)
+
+    def make_target_footnote(self, refuri, refs, notes):
+        if notes.has_key(refuri):  # duplicate?
+            footnote = notes[refuri]
+            assert len(footnote['names']) == 1
+            footnote_name = footnote['names'][0]
+        else:                           # original
+            footnote = nodes.footnote()
+            footnote_id = self.document.set_id(footnote)
+            # Use uppercase letters and a colon; they can't be
+            # produced inside names by the parser.
+            footnote_name = 'TARGET_NOTE: ' + footnote_id
+            footnote['auto'] = 1
+            footnote['names'] = [footnote_name]
+            footnote_paragraph = nodes.paragraph()
+            footnote_paragraph += nodes.reference('', refuri, refuri=refuri)
+            footnote += footnote_paragraph
+            self.document.note_autofootnote(footnote)
+            self.document.note_explicit_target(footnote, footnote)
+        for ref in refs:
+            if isinstance(ref, nodes.target):
+                continue
+            refnode = nodes.footnote_reference(
+                refname=footnote_name, auto=1)
+            refnode['classes'] += self.classes
+            self.document.note_autofootnote_ref(refnode)
+            self.document.note_footnote_ref(refnode)
+            index = ref.parent.index(ref) + 1
+            reflist = [refnode]
+            if not utils.get_trim_footnote_ref_space(self.document.settings):
+                if self.classes:
+                    reflist.insert(0, nodes.inline(text=' ', Classes=self.classes))
+                else:
+                    reflist.insert(0, nodes.Text(' '))
+            ref.parent.insert(index, reflist)
+        return footnote
+
+
+class DanglingReferences(Transform):
+
+    """
+    Check for dangling references (incl. footnote & citation) and for
+    unreferenced targets.
+    """
+
+    default_priority = 850
+
+    def apply(self):
+        visitor = DanglingReferencesVisitor(
+            self.document,
+            self.document.transformer.unknown_reference_resolvers)
+        self.document.walk(visitor)
+        # *After* resolving all references, check for unreferenced
+        # targets:
+        for target in self.document.traverse(nodes.target):
+            if not target.referenced:
+                if target.get('anonymous'):
+                    # If we have unreferenced anonymous targets, there
+                    # is already an error message about anonymous
+                    # hyperlink mismatch; no need to generate another
+                    # message.
+                    continue
+                if target['names']:
+                    naming = target['names'][0]
+                elif target['ids']:
+                    naming = target['ids'][0]
+                else:
+                    # Hack: Propagated targets always have their refid
+                    # attribute set.
+                    naming = target['refid']
+                self.document.reporter.info(
+                    'Hyperlink target "%s" is not referenced.'
+                    % naming, base_node=target)
+
+
+class DanglingReferencesVisitor(nodes.SparseNodeVisitor):
+    
+    def __init__(self, document, unknown_reference_resolvers):
+        nodes.SparseNodeVisitor.__init__(self, document)
+        self.document = document
+        self.unknown_reference_resolvers = unknown_reference_resolvers
+
+    def unknown_visit(self, node):
+        pass
+
+    def visit_reference(self, node):
+        if node.resolved or not node.hasattr('refname'):
+            return
+        refname = node['refname']
+        id = self.document.nameids.get(refname)
+        if id is None:
+            for resolver_function in self.unknown_reference_resolvers:
+                if resolver_function(node):
+                    break
+            else:
+                if self.document.nameids.has_key(refname):
+                    msg = self.document.reporter.error(
+                        'Duplicate target name, cannot be used as a unique '
+                        'reference: "%s".' % (node['refname']), base_node=node)
+                else:
+                    msg = self.document.reporter.error(
+                        'Unknown target name: "%s".' % (node['refname']),
+                        base_node=node)
+                msgid = self.document.set_id(msg)
+                prb = nodes.problematic(
+                      node.rawsource, node.rawsource, refid=msgid)
+                prbid = self.document.set_id(prb)
+                msg.add_backref(prbid)
+                node.replace_self(prb)
+        else:
+            del node['refname']
+            node['refid'] = id
+            self.document.ids[id].note_referenced_by(id=id)
+            node.resolved = 1
+
+    visit_footnote_reference = visit_citation_reference = visit_reference
+
+
+def uniq(L):
+     r = []
+     for item in L:
+         if not item in r:
+             r.append(item)
+     return r
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/transforms/components.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/transforms/components.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/transforms/components.py (revision 3)
@@ -0,0 +1,54 @@
+# Author: David Goodger
+# Contact: goodger@users.sourceforge.net
+# Revision: $Revision: 3909 $
+# Date: $Date: 2005-09-26 20:17:31 +0200 (Mon, 26 Sep 2005) $
+# Copyright: This module has been placed in the public domain.
+
+"""
+Docutils component-related transforms.
+"""
+
+__docformat__ = 'reStructuredText'
+
+import sys
+import os
+import re
+import time
+from docutils import nodes, utils
+from docutils import ApplicationError, DataError
+from docutils.transforms import Transform, TransformError
+
+
+class Filter(Transform):
+
+    """
+    Include or exclude elements which depend on a specific Docutils component.
+
+    For use with `nodes.pending` elements.  A "pending" element's dictionary
+    attribute ``details`` must contain the keys "component" and "format".  The
+    value of ``details['component']`` must match the type name of the
+    component the elements depend on (e.g. "writer").  The value of
+    ``details['format']`` is the name of a specific format or context of that
+    component (e.g. "html").  If the matching Docutils component supports that
+    format or context, the "pending" element is replaced by the contents of
+    ``details['nodes']`` (a list of nodes); otherwise, the "pending" element
+    is removed.
+
+    For example, the reStructuredText "meta" directive creates a "pending"
+    element containing a "meta" element (in ``pending.details['nodes']``).
+    Only writers (``pending.details['component'] == 'writer'``) supporting the
+    "html" format (``pending.details['format'] == 'html'``) will include the
+    "meta" element; it will be deleted from the output of all other writers.
+    """
+
+    default_priority = 780
+
+    def apply(self):
+        pending = self.startnode
+        component_type = pending.details['component'] # 'reader' or 'writer'
+        format = pending.details['format']
+        component = self.document.transformer.components[component_type]
+        if component.supports(format):
+            pending.replace_self(pending.details['nodes'])
+        else:
+            pending.parent.remove(pending)
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/transforms/frontmatter.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/transforms/frontmatter.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/transforms/frontmatter.py (revision 3)
@@ -0,0 +1,514 @@
+# Authors: David Goodger, Ueli Schlaepfer
+# Contact: goodger@users.sourceforge.net
+# Revision: $Revision: 4242 $
+# Date: $Date: 2006-01-06 00:28:53 +0100 (Fri, 06 Jan 2006) $
+# Copyright: This module has been placed in the public domain.
+
+"""
+Transforms related to the front matter of a document or a section
+(information found before the main text):
+
+- `DocTitle`: Used to transform a lone top level section's title to
+  the document title, promote a remaining lone top-level section's
+  title to the document subtitle, and determine the document's title
+  metadata (document['title']) based on the document title and/or the
+  "title" setting.
+
+- `SectionSubTitle`: Used to transform a lone subsection into a
+  subtitle.
+
+- `DocInfo`: Used to transform a bibliographic field list into docinfo
+  elements.
+"""
+
+__docformat__ = 'reStructuredText'
+
+import re
+from docutils import nodes, utils
+from docutils.transforms import TransformError, Transform
+
+
+class TitlePromoter(Transform):
+
+    """
+    Abstract base class for DocTitle and SectionSubTitle transforms.
+    """
+
+    def promote_title(self, node):
+        """
+        Transform the following tree::
+
+            <node>
+                <section>
+                    <title>
+                    ...
+
+        into ::
+
+            <node>
+                <title>
+                ...
+
+        `node` is normally a document.
+        """
+        # `node` must not have a title yet.
+        assert not (len(node) and isinstance(node[0], nodes.title))
+        section, index = self.candidate_index(node)
+        if index is None:
+            return None
+        # Transfer the section's attributes to the node:
+        node.attributes.update(section.attributes)
+        # setup_child is called automatically for all nodes.
+        node[:] = (section[:1]        # section title
+                   + node[:index]     # everything that was in the
+                                      # node before the section
+                   + section[1:])     # everything that was in the section
+        assert isinstance(node[0], nodes.title)
+        return 1
+
+    def promote_subtitle(self, node):
+        """
+        Transform the following node tree::
+
+            <node>
+                <title>
+                <section>
+                    <title>
+                    ...
+
+        into ::
+
+            <node>
+                <title>
+                <subtitle>
+                ...
+        """
+        subsection, index = self.candidate_index(node)
+        if index is None:
+            return None
+        subtitle = nodes.subtitle()
+        # Transfer the subsection's attributes to the new subtitle:
+        # This causes trouble with list attributes!  To do: Write a
+        # test case which catches direct access to the `attributes`
+        # dictionary and/or write a test case which shows problems in
+        # this particular case.
+        subtitle.attributes.update(subsection.attributes)
+        # We're losing the subtitle's attributes here!  To do: Write a
+        # test case which shows this behavior.
+        # Transfer the contents of the subsection's title to the
+        # subtitle:
+        subtitle[:] = subsection[0][:]
+        node[:] = (node[:1]       # title
+                   + [subtitle]
+                   # everything that was before the section:
+                   + node[1:index]
+                   # everything that was in the subsection:
+                   + subsection[1:])
+        return 1
+
+    def candidate_index(self, node):
+        """
+        Find and return the promotion candidate and its index.
+
+        Return (None, None) if no valid candidate was found.
+        """
+        index = node.first_child_not_matching_class(
+            nodes.PreBibliographic)
+        if index is None or len(node) > (index + 1) or \
+               not isinstance(node[index], nodes.section):
+            return None, None
+        else:
+            return node[index], index
+
+
+class DocTitle(TitlePromoter):
+
+    """
+    In reStructuredText_, there is no way to specify a document title
+    and subtitle explicitly. Instead, we can supply the document title
+    (and possibly the subtitle as well) implicitly, and use this
+    two-step transform to "raise" or "promote" the title(s) (and their
+    corresponding section contents) to the document level.
+
+    1. If the document contains a single top-level section as its
+       first non-comment element, the top-level section's title
+       becomes the document's title, and the top-level section's
+       contents become the document's immediate contents. The lone
+       top-level section header must be the first non-comment element
+       in the document.
+
+       For example, take this input text::
+
+           =================
+            Top-Level Title
+           =================
+
+           A paragraph.
+
+       Once parsed, it looks like this::
+
+           <document>
+               <section names="top-level title">
+                   <title>
+                       Top-Level Title
+                   <paragraph>
+                       A paragraph.
+
+       After running the DocTitle transform, we have::
+
+           <document names="top-level title">
+               <title>
+                   Top-Level Title
+               <paragraph>
+                   A paragraph.
+
+    2. If step 1 successfully determines the document title, we
+       continue by checking for a subtitle.
+
+       If the lone top-level section itself contains a single
+       second-level section as its first non-comment element, that
+       section's title is promoted to the document's subtitle, and
+       that section's contents become the document's immediate
+       contents. Given this input text::
+
+           =================
+            Top-Level Title
+           =================
+
+           Second-Level Title
+           ~~~~~~~~~~~~~~~~~~
+
+           A paragraph.
+
+       After parsing and running the Section Promotion transform, the
+       result is::
+
+           <document names="top-level title">
+               <title>
+                   Top-Level Title
+               <subtitle names="second-level title">
+                   Second-Level Title
+               <paragraph>
+                   A paragraph.
+
+       (Note that the implicit hyperlink target generated by the
+       "Second-Level Title" is preserved on the "subtitle" element
+       itself.)
+
+    Any comment elements occurring before the document title or
+    subtitle are accumulated and inserted as the first body elements
+    after the title(s).
+
+    This transform also sets the document's metadata title
+    (document['title']).
+
+    .. _reStructuredText: http://docutils.sf.net/rst.html
+    """
+
+    default_priority = 320
+
+    def set_metadata(self):
+        """
+        Set document['title'] metadata title from the following
+        sources, listed in order of priority:
+
+        * Existing document['title'] attribute.
+        * "title" setting.
+        * Document title node (as promoted by promote_title).
+        """
+        if not self.document.hasattr('title'):
+            if self.document.settings.title is not None:
+                self.document['title'] = self.document.settings.title
+            elif len(self.document) and isinstance(self.document[0], nodes.title):
+                self.document['title'] = self.document[0].astext()
+
+    def apply(self):
+        if getattr(self.document.settings, 'doctitle_xform', 1):
+            # promote_(sub)title defined in TitlePromoter base class.
+            if self.promote_title(self.document):
+                # If a title has been promoted, also try to promote a
+                # subtitle.
+                self.promote_subtitle(self.document)
+        # Set document['title'].
+        self.set_metadata()
+
+
+class SectionSubTitle(TitlePromoter):
+
+    """
+    This works like document subtitles, but for sections.  For example, ::
+
+        <section>
+            <title>
+                Title
+            <section>
+                <title>
+                    Subtitle
+                ...
+
+    is transformed into ::
+
+        <section>
+            <title>
+                Title
+            <subtitle>
+                Subtitle
+            ...
+
+    For details refer to the docstring of DocTitle.
+    """
+
+    default_priority = 350
+
+    def apply(self):
+        if not getattr(self.document.settings, 'sectsubtitle_xform', 1):
+            return
+        for section in self.document.traverse(nodes.section):
+            # On our way through the node tree, we are deleting
+            # sections, but we call self.promote_subtitle for those
+            # sections nonetheless.  To do: Write a test case which
+            # shows the problem and discuss on Docutils-develop.
+            self.promote_subtitle(section)
+
+
+class DocInfo(Transform):
+
+    """
+    This transform is specific to the reStructuredText_ markup syntax;
+    see "Bibliographic Fields" in the `reStructuredText Markup
+    Specification`_ for a high-level description. This transform
+    should be run *after* the `DocTitle` transform.
+
+    Given a field list as the first non-comment element after the
+    document title and subtitle (if present), registered bibliographic
+    field names are transformed to the corresponding DTD elements,
+    becoming child elements of the "docinfo" element (except for a
+    dedication and/or an abstract, which become "topic" elements after
+    "docinfo").
+
+    For example, given this document fragment after parsing::
+
+        <document>
+            <title>
+                Document Title
+            <field_list>
+                <field>
+                    <field_name>
+                        Author
+                    <field_body>
+                        <paragraph>
+                            A. Name
+                <field>
+                    <field_name>
+                        Status
+                    <field_body>
+                        <paragraph>
+                            $RCSfile$
+            ...
+
+    After running the bibliographic field list transform, the
+    resulting document tree would look like this::
+
+        <document>
+            <title>
+                Document Title
+            <docinfo>
+                <author>
+                    A. Name
+                <status>
+                    frontmatter.py
+            ...
+
+    The "Status" field contained an expanded RCS keyword, which is
+    normally (but optionally) cleaned up by the transform. The sole
+    contents of the field body must be a paragraph containing an
+    expanded RCS keyword of the form "$keyword: expansion text $". Any
+    RCS keyword can be processed in any bibliographic field. The
+    dollar signs and leading RCS keyword name are removed. Extra
+    processing is done for the following RCS keywords:
+
+    - "RCSfile" expands to the name of the file in the RCS or CVS
+      repository, which is the name of the source file with a ",v"
+      suffix appended. The transform will remove the ",v" suffix.
+
+    - "Date" expands to the format "YYYY/MM/DD hh:mm:ss" (in the UTC
+      time zone). The RCS Keywords transform will extract just the
+      date itself and transform it to an ISO 8601 format date, as in
+      "2000-12-31".
+
+      (Since the source file for this text is itself stored under CVS,
+      we can't show an example of the "Date" RCS keyword because we
+      can't prevent any RCS keywords used in this explanation from
+      being expanded. Only the "RCSfile" keyword is stable; its
+      expansion text changes only if the file name changes.)
+
+    .. _reStructuredText: http://docutils.sf.net/rst.html
+    .. _reStructuredText Markup Specification:
+       http://docutils.sf.net/docs/ref/rst/restructuredtext.html
+    """
+
+    default_priority = 340
+
+    biblio_nodes = {
+          'author': nodes.author,
+          'authors': nodes.authors,
+          'organization': nodes.organization,
+          'address': nodes.address,
+          'contact': nodes.contact,
+          'version': nodes.version,
+          'revision': nodes.revision,
+          'status': nodes.status,
+          'date': nodes.date,
+          'copyright': nodes.copyright,
+          'dedication': nodes.topic,
+          'abstract': nodes.topic}
+    """Canonical field name (lowcased) to node class name mapping for
+    bibliographic fields (field_list)."""
+
+    def apply(self):
+        if not getattr(self.document.settings, 'docinfo_xform', 1):
+            return
+        document = self.document
+        index = document.first_child_not_matching_class(
+              nodes.PreBibliographic)
+        if index is None:
+            return
+        candidate = document[index]
+        if isinstance(candidate, nodes.field_list):
+            biblioindex = document.first_child_not_matching_class(
+                  (nodes.Titular, nodes.Decorative))
+            nodelist = self.extract_bibliographic(candidate)
+            del document[index]         # untransformed field list (candidate)
+            document[biblioindex:biblioindex] = nodelist
+
+    def extract_bibliographic(self, field_list):
+        docinfo = nodes.docinfo()
+        bibliofields = self.language.bibliographic_fields
+        labels = self.language.labels
+        topics = {'dedication': None, 'abstract': None}
+        for field in field_list:
+            try:
+                name = field[0][0].astext()
+                normedname = nodes.fully_normalize_name(name)
+                if not (len(field) == 2 and bibliofields.has_key(normedname)
+                        and self.check_empty_biblio_field(field, name)):
+                    raise TransformError
+                canonical = bibliofields[normedname]
+                biblioclass = self.biblio_nodes[canonical]
+                if issubclass(biblioclass, nodes.TextElement):
+                    if not self.check_compound_biblio_field(field, name):
+                        raise TransformError
+                    utils.clean_rcs_keywords(
+                          field[1][0], self.rcs_keyword_substitutions)
+                    docinfo.append(biblioclass('', '', *field[1][0]))
+                elif issubclass(biblioclass, nodes.authors):
+                    self.extract_authors(field, name, docinfo)
+                elif issubclass(biblioclass, nodes.topic):
+                    if topics[canonical]:
+                        field[-1] += self.document.reporter.warning(
+                            'There can only be one "%s" field.' % name,
+                            base_node=field)
+                        raise TransformError
+                    title = nodes.title(name, labels[canonical])
+                    topics[canonical] = biblioclass(
+                        '', title, classes=[canonical], *field[1].children)
+                else:
+                    docinfo.append(biblioclass('', *field[1].children))
+            except TransformError:
+                if len(field[-1]) == 1 \
+                       and isinstance(field[-1][0], nodes.paragraph):
+                    utils.clean_rcs_keywords(
+                        field[-1][0], self.rcs_keyword_substitutions)
+                docinfo.append(field)
+        nodelist = []
+        if len(docinfo) != 0:
+            nodelist.append(docinfo)
+        for name in ('dedication', 'abstract'):
+            if topics[name]:
+                nodelist.append(topics[name])
+        return nodelist
+
+    def check_empty_biblio_field(self, field, name):
+        if len(field[-1]) < 1:
+            field[-1] += self.document.reporter.warning(
+                  'Cannot extract empty bibliographic field "%s".' % name,
+                  base_node=field)
+            return None
+        return 1
+
+    def check_compound_biblio_field(self, field, name):
+        if len(field[-1]) > 1:
+            field[-1] += self.document.reporter.warning(
+                  'Cannot extract compound bibliographic field "%s".' % name,
+                  base_node=field)
+            return None
+        if not isinstance(field[-1][0], nodes.paragraph):
+            field[-1] += self.document.reporter.warning(
+                  'Cannot extract bibliographic field "%s" containing '
+                  'anything other than a single paragraph.' % name,
+                  base_node=field)
+            return None
+        return 1
+
+    rcs_keyword_substitutions = [
+          (re.compile(r'\$' r'Date: (\d\d\d\d)[-/](\d\d)[-/](\d\d)[ T][\d:]+'
+                      r'[^$]* \$', re.IGNORECASE), r'\1-\2-\3'),
+          (re.compile(r'\$' r'RCSfile: (.+),v \$', re.IGNORECASE), r'\1'),
+          (re.compile(r'\$[a-zA-Z]+: (.+) \$'), r'\1'),]
+
+    def extract_authors(self, field, name, docinfo):
+        try:
+            if len(field[1]) == 1:
+                if isinstance(field[1][0], nodes.paragraph):
+                    authors = self.authors_from_one_paragraph(field)
+                elif isinstance(field[1][0], nodes.bullet_list):
+                    authors = self.authors_from_bullet_list(field)
+                else:
+                    raise TransformError
+            else:
+                authors = self.authors_from_paragraphs(field)
+            authornodes = [nodes.author('', '', *author)
+                           for author in authors if author]
+            if len(authornodes) >= 1:
+                docinfo.append(nodes.authors('', *authornodes))
+            else:
+                raise TransformError
+        except TransformError:
+            field[-1] += self.document.reporter.warning(
+                  'Bibliographic field "%s" incompatible with extraction: '
+                  'it must contain either a single paragraph (with authors '
+                  'separated by one of "%s"), multiple paragraphs (one per '
+                  'author), or a bullet list with one paragraph (one author) '
+                  'per item.'
+                  % (name, ''.join(self.language.author_separators)),
+                  base_node=field)
+            raise
+
+    def authors_from_one_paragraph(self, field):
+        text = field[1][0].astext().strip()
+        if not text:
+            raise TransformError
+        for authorsep in self.language.author_separators:
+            authornames = text.split(authorsep)
+            if len(authornames) > 1:
+                break
+        authornames = [author.strip() for author in authornames]
+        authors = [[nodes.Text(author)] for author in authornames if author]
+        return authors
+
+    def authors_from_bullet_list(self, field):
+        authors = []
+        for item in field[1][0]:
+            if len(item) != 1 or not isinstance(item[0], nodes.paragraph):
+                raise TransformError
+            authors.append(item[0].children)
+        if not authors:
+            raise TransformError
+        return authors
+
+    def authors_from_paragraphs(self, field):
+        for item in field[1]:
+            if not isinstance(item, nodes.paragraph):
+                raise TransformError
+        authors = [item.children for item in field[1]]
+        return authors
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/transforms/peps.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/transforms/peps.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/transforms/peps.py (revision 3)
@@ -0,0 +1,306 @@
+# Author: David Goodger
+# Contact: goodger@users.sourceforge.net
+# Revision: $Revision: 3909 $
+# Date: $Date: 2005-09-26 20:17:31 +0200 (Mon, 26 Sep 2005) $
+# Copyright: This module has been placed in the public domain.
+
+"""
+Transforms for PEP processing.
+
+- `Headers`: Used to transform a PEP's initial RFC-2822 header.  It remains a
+  field list, but some entries get processed.
+- `Contents`: Auto-inserts a table of contents.
+- `PEPZero`: Special processing for PEP 0.
+"""
+
+__docformat__ = 'reStructuredText'
+
+import sys
+import os
+import re
+import time
+from docutils import nodes, utils, languages
+from docutils import ApplicationError, DataError
+from docutils.transforms import Transform, TransformError
+from docutils.transforms import parts, references, misc
+
+
+class Headers(Transform):
+
+    """
+    Process fields in a PEP's initial RFC-2822 header.
+    """
+
+    default_priority = 360
+
+    pep_url = 'pep-%04d.html'
+    pep_cvs_url = ('http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/python/'
+                   'python/nondist/peps/pep-%04d.txt')
+    rcs_keyword_substitutions = (
+          (re.compile(r'\$' r'RCSfile: (.+),v \$$', re.IGNORECASE), r'\1'),
+          (re.compile(r'\$[a-zA-Z]+: (.+) \$$'), r'\1'),)
+
+    def apply(self):
+        if not len(self.document):
+            # @@@ replace these DataErrors with proper system messages
+            raise DataError('Document tree is empty.')
+        header = self.document[0]
+        if not isinstance(header, nodes.field_list) or \
+              'rfc2822' not in header['classes']:
+            raise DataError('Document does not begin with an RFC-2822 '
+                            'header; it is not a PEP.')
+        pep = None
+        for field in header:
+            if field[0].astext().lower() == 'pep': # should be the first field
+                value = field[1].astext()
+                try:
+                    pep = int(value)
+                    cvs_url = self.pep_cvs_url % pep
+                except ValueError:
+                    pep = value
+                    cvs_url = None
+                    msg = self.document.reporter.warning(
+                        '"PEP" header must contain an integer; "%s" is an '
+                        'invalid value.' % pep, base_node=field)
+                    msgid = self.document.set_id(msg)
+                    prb = nodes.problematic(value, value or '(none)',
+                                            refid=msgid)
+                    prbid = self.document.set_id(prb)
+                    msg.add_backref(prbid)
+                    if len(field[1]):
+                        field[1][0][:] = [prb]
+                    else:
+                        field[1] += nodes.paragraph('', '', prb)
+                break
+        if pep is None:
+            raise DataError('Document does not contain an RFC-2822 "PEP" '
+                            'header.')
+        if pep == 0:
+            # Special processing for PEP 0.
+            pending = nodes.pending(PEPZero)
+            self.document.insert(1, pending)
+            self.document.note_pending(pending)
+        if len(header) < 2 or header[1][0].astext().lower() != 'title':
+            raise DataError('No title!')
+        for field in header:
+            name = field[0].astext().lower()
+            body = field[1]
+            if len(body) > 1:
+                raise DataError('PEP header field body contains multiple '
+                                'elements:\n%s' % field.pformat(level=1))
+            elif len(body) == 1:
+                if not isinstance(body[0], nodes.paragraph):
+                    raise DataError('PEP header field body may only contain '
+                                    'a single paragraph:\n%s'
+                                    % field.pformat(level=1))
+            elif name == 'last-modified':
+                date = time.strftime(
+                      '%d-%b-%Y',
+                      time.localtime(os.stat(self.document['source'])[8]))
+                if cvs_url:
+                    body += nodes.paragraph(
+                        '', '', nodes.reference('', date, refuri=cvs_url))
+            else:
+                # empty
+                continue
+            para = body[0]
+            if name == 'author':
+                for node in para:
+                    if isinstance(node, nodes.reference):
+                        node.replace_self(mask_email(node))
+            elif name == 'discussions-to':
+                for node in para:
+                    if isinstance(node, nodes.reference):
+                        node.replace_self(mask_email(node, pep))
+            elif name in ('replaces', 'replaced-by', 'requires'):
+                newbody = []
+                space = nodes.Text(' ')
+                for refpep in re.split(',?\s+', body.astext()):
+                    pepno = int(refpep)
+                    newbody.append(nodes.reference(
+                        refpep, refpep,
+                        refuri=(self.document.settings.pep_base_url
+                                + self.pep_url % pepno)))
+                    newbody.append(space)
+                para[:] = newbody[:-1] # drop trailing space
+            elif name == 'last-modified':
+                utils.clean_rcs_keywords(para, self.rcs_keyword_substitutions)
+                if cvs_url:
+                    date = para.astext()
+                    para[:] = [nodes.reference('', date, refuri=cvs_url)]
+            elif name == 'content-type':
+                pep_type = para.astext()
+                uri = self.document.settings.pep_base_url + self.pep_url % 12
+                para[:] = [nodes.reference('', pep_type, refuri=uri)]
+            elif name == 'version' and len(body):
+                utils.clean_rcs_keywords(para, self.rcs_keyword_substitutions)
+
+
+class Contents(Transform):
+
+    """
+    Insert an empty table of contents topic and a transform placeholder into
+    the document after the RFC 2822 header.
+    """
+
+    default_priority = 380
+
+    def apply(self):
+        language = languages.get_language(self.document.settings.language_code)
+        name = language.labels['contents']
+        title = nodes.title('', name)
+        topic = nodes.topic('', title, classes=['contents'])
+        name = nodes.fully_normalize_name(name)
+        if not self.document.has_name(name):
+            topic['names'].append(name)
+        self.document.note_implicit_target(topic)
+        pending = nodes.pending(parts.Contents)
+        topic += pending
+        self.document.insert(1, topic)
+        self.document.note_pending(pending)
+
+
+class TargetNotes(Transform):
+
+    """
+    Locate the "References" section, insert a placeholder for an external
+    target footnote insertion transform at the end, and schedule the
+    transform to run immediately.
+    """
+
+    default_priority = 520
+
+    def apply(self):
+        doc = self.document
+        i = len(doc) - 1
+        refsect = copyright = None
+        while i >= 0 and isinstance(doc[i], nodes.section):
+            title_words = doc[i][0].astext().lower().split()
+            if 'references' in title_words:
+                refsect = doc[i]
+                break
+            elif 'copyright' in title_words:
+                copyright = i
+            i -= 1
+        if not refsect:
+            refsect = nodes.section()
+            refsect += nodes.title('', 'References')
+            doc.set_id(refsect)
+            if copyright:
+                # Put the new "References" section before "Copyright":
+                doc.insert(copyright, refsect)
+            else:
+                # Put the new "References" section at end of doc:
+                doc.append(refsect)
+        pending = nodes.pending(references.TargetNotes)
+        refsect.append(pending)
+        self.document.note_pending(pending, 0)
+        pending = nodes.pending(misc.CallBack,
+                                details={'callback': self.cleanup_callback})
+        refsect.append(pending)
+        self.document.note_pending(pending, 1)
+
+    def cleanup_callback(self, pending):
+        """
+        Remove an empty "References" section.
+
+        Called after the `references.TargetNotes` transform is complete.
+        """
+        if len(pending.parent) == 2:    # <title> and <pending>
+            pending.parent.parent.remove(pending.parent)
+
+
+class PEPZero(Transform):
+
+    """
+    Special processing for PEP 0.
+    """
+
+    default_priority =760
+
+    def apply(self):
+        visitor = PEPZeroSpecial(self.document)
+        self.document.walk(visitor)
+        self.startnode.parent.remove(self.startnode)
+
+
+class PEPZeroSpecial(nodes.SparseNodeVisitor):
+
+    """
+    Perform the special processing needed by PEP 0:
+
+    - Mask email addresses.
+
+    - Link PEP numbers in the second column of 4-column tables to the PEPs
+      themselves.
+    """
+
+    pep_url = Headers.pep_url
+
+    def unknown_visit(self, node):
+        pass
+
+    def visit_reference(self, node):
+        node.replace_self(mask_email(node))
+
+    def visit_field_list(self, node):
+        if 'rfc2822' in node['classes']:
+            raise nodes.SkipNode
+
+    def visit_tgroup(self, node):
+        self.pep_table = node['cols'] == 4
+        self.entry = 0
+
+    def visit_colspec(self, node):
+        self.entry += 1
+        if self.pep_table and self.entry == 2:
+            node['classes'].append('num')
+
+    def visit_row(self, node):
+        self.entry = 0
+
+    def visit_entry(self, node):
+        self.entry += 1
+        if self.pep_table and self.entry == 2 and len(node) == 1:
+            node['classes'].append('num')
+            p = node[0]
+            if isinstance(p, nodes.paragraph) and len(p) == 1:
+                text = p.astext()
+                try:
+                    pep = int(text)
+                    ref = (self.document.settings.pep_base_url
+                           + self.pep_url % pep)
+                    p[0] = nodes.reference(text, text, refuri=ref)
+                except ValueError:
+                    pass
+
+
+non_masked_addresses = ('peps@python.org',
+                        'python-list@python.org',
+                        'python-dev@python.org')
+
+def mask_email(ref, pepno=None):
+    """
+    Mask the email address in `ref` and return a replacement node.
+
+    `ref` is returned unchanged if it contains no email address.
+
+    For email addresses such as "user@host", mask the address as "user at
+    host" (text) to thwart simple email address harvesters (except for those
+    listed in `non_masked_addresses`).  If a PEP number (`pepno`) is given,
+    return a reference including a default email subject.
+    """
+    if ref.hasattr('refuri') and ref['refuri'].startswith('mailto:'):
+        if ref['refuri'][8:] in non_masked_addresses:
+            replacement = ref[0]
+        else:
+            replacement_text = ref.astext().replace('@', '&#32;&#97;t&#32;')
+            replacement = nodes.raw('', replacement_text, format='html')
+        if pepno is None:
+            return replacement
+        else:
+            ref['refuri'] += '?subject=PEP%%20%s' % pepno
+            ref[:] = [replacement]
+            return ref
+    else:
+        return ref
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/urischemes.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/urischemes.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/docutils/urischemes.py (revision 3)
@@ -0,0 +1,138 @@
+# Author: David Goodger
+# Contact: goodger@python.org
+# Revision: $Revision: 4235 $
+# Date: $Date: 2005-12-30 04:00:25 +0100 (Fri, 30 Dec 2005) $
+# Copyright: This module has been placed in the public domain.
+
+"""
+`schemes` is a dictionary with lowercase URI addressing schemes as
+keys and descriptions as values. It was compiled from the index at
+http://www.iana.org/assignments/uri-schemes (revised 2005-11-28)
+and an older list at http://www.w3.org/Addressing/schemes.html.
+"""
+
+# Many values are blank and should be filled in with useful descriptions.
+
+schemes = {
+      'about': 'provides information on Navigator',
+      'acap': 'Application Configuration Access Protocol; RFC 2244',
+      'addbook': "To add vCard entries to Communicator's Address Book",
+      'afp': 'Apple Filing Protocol',
+      'afs': 'Andrew File System global file names',
+      'aim': 'AOL Instant Messenger',
+      'callto': 'for NetMeeting links',
+      'castanet': 'Castanet Tuner URLs for Netcaster',
+      'chttp': 'cached HTTP supported by RealPlayer',
+      'cid': 'content identifier; RFC 2392',
+      'crid': 'TV-Anytime Content Reference Identifier; RFC 4078',
+      'data': ('allows inclusion of small data items as "immediate" data; '
+               'RFC 2397'),
+      'dav': 'Distributed Authoring and Versioning Protocol; RFC 2518',
+      'dict': 'dictionary service protocol; RFC 2229',
+      'dns': 'Domain Name System resources',
+      'eid': ('External ID; non-URL data; general escape mechanism to allow '
+              'access to information for applications that are too '
+              'specialized to justify their own schemes'),
+      'fax': ('a connection to a terminal that can handle telefaxes '
+              '(facsimiles); RFC 2806'),
+      'feed' : 'NetNewsWire feed',
+      'file': 'Host-specific file names; RFC 1738',
+      'finger': '',
+      'freenet': '',
+      'ftp': 'File Transfer Protocol; RFC 1738',
+      'go': 'go; RFC 3368',
+      'gopher': 'The Gopher Protocol',
+      'gsm-sms': ('Global System for Mobile Communications Short Message '
+                  'Service'),
+      'h323': ('video (audiovisual) communication on local area networks; '
+               'RFC 3508'),
+      'h324': ('video and audio communications over low bitrate connections '
+               'such as POTS modem connections'),
+      'hdl': 'CNRI handle system',
+      'hnews': 'an HTTP-tunneling variant of the NNTP news protocol',
+      'http': 'Hypertext Transfer Protocol; RFC 2616',
+      'https': 'HTTP over SSL; RFC 2818',
+      'hydra': 'SubEthaEdit URI.  See http://www.codingmonkeys.de/subethaedit.',
+      'iioploc': 'Internet Inter-ORB Protocol Location?',
+      'ilu': 'Inter-Language Unification',
+      'im': 'Instant Messaging; RFC 3860',
+      'imap': 'Internet Message Access Protocol; RFC 2192',
+      'info': 'Information Assets with Identifiers in Public Namespaces',
+      'ior': 'CORBA interoperable object reference',
+      'ipp': 'Internet Printing Protocol; RFC 3510',
+      'irc': 'Internet Relay Chat',
+      'iris.beep': 'iris.beep; RFC 3983',
+      'iseek' : 'See www.ambrosiasw.com;  a little util for OS X.',
+      'jar': 'Java archive',
+      'javascript': ('JavaScript code; evaluates the expression after the '
+                     'colon'),
+      'jdbc': 'JDBC connection URI.',
+      'ldap': 'Lightweight Directory Access Protocol',
+      'lifn': '',
+      'livescript': '',
+      'lrq': '',
+      'mailbox': 'Mail folder access',
+      'mailserver': 'Access to data available from mail servers',
+      'mailto': 'Electronic mail address; RFC 2368',
+      'md5': '',
+      'mid': 'message identifier; RFC 2392',
+      'mocha': '',
+      'modem': ('a connection to a terminal that can handle incoming data '
+                'calls; RFC 2806'),
+      'mtqp': 'Message Tracking Query Protocol; RFC 3887',
+      'mupdate': 'Mailbox Update (MUPDATE) Protocol; RFC 3656',
+      'news': 'USENET news; RFC 1738',
+      'nfs': 'Network File System protocol; RFC 2224',
+      'nntp': 'USENET news using NNTP access; RFC 1738',
+      'opaquelocktoken': 'RFC 2518',
+      'phone': '',
+      'pop': 'Post Office Protocol; RFC 2384',
+      'pop3': 'Post Office Protocol v3',
+      'pres': 'Presence; RFC 3859',
+      'printer': '',
+      'prospero': 'Prospero Directory Service; RFC 4157',
+      'rdar' : ('URLs found in Darwin source '
+                '(http://www.opensource.apple.com/darwinsource/).'),
+      'res': '',
+      'rtsp': 'real time streaming protocol; RFC 2326',
+      'rvp': '',
+      'rwhois': '',
+      'rx': 'Remote Execution',
+      'sdp': '',
+      'service': 'service location; RFC 2609',
+      'shttp': 'secure hypertext transfer protocol',
+      'sip': 'Session Initiation Protocol; RFC 3261',
+      'sips': 'secure session intitiaion protocol; RFC 3261',
+      'smb': 'SAMBA filesystems.',
+      'snews': 'For NNTP postings via SSL',
+      'snmp': 'Simple Network Management Protocol; RFC 4088',
+      'soap.beep': 'RFC 3288',
+      'soap.beeps': 'RFC 3288',
+      'ssh': 'Reference to interactive sessions via ssh.',
+      't120': 'real time data conferencing (audiographics)',
+      'tag': 'RFC 4151',
+      'tcp': '',
+      'tel': ('a connection to a terminal that handles normal voice '
+              'telephone calls, a voice mailbox or another voice messaging '
+              'system or a service that can be operated using DTMF tones; '
+              'RFC 2806.'),
+      'telephone': 'telephone',
+      'telnet': 'Reference to interactive sessions; RFC 4248',
+      'tftp': 'Trivial File Transfer Protocol; RFC 3617',
+      'tip': 'Transaction Internet Protocol; RFC 2371',
+      'tn3270': 'Interactive 3270 emulation sessions',
+      'tv': '',
+      'urn': 'Uniform Resource Name; RFC 2141',
+      'uuid': '',
+      'vemmi': 'versatile multimedia interface; RFC 2122',
+      'videotex': '',
+      'view-source': 'displays HTML code that was generated with JavaScript',
+      'wais': 'Wide Area Information Servers; RFC 4156',
+      'whodp': '',
+      'whois++': 'Distributed directory service.',
+      'x-man-page': ('Opens man page in Terminal.app on OS X '
+                     '(see macosxhints.com)'),
+      'xmlrpc.beep': 'RFC 3529',
+      'xmlrpc.beeps': 'RFC 3529',
+      'z39.50r': 'Z39.50 Retrieval; RFC 2056',
+      'z39.50s': 'Z39.50 Session; RFC 2056',}
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/EGG-INFO/SOURCES.txt
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/EGG-INFO/SOURCES.txt (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/EGG-INFO/SOURCES.txt (revision 3)
@@ -0,0 +1,111 @@
+README.txt
+scramble.py
+docutils/__init__.py
+docutils/core.py
+docutils/examples.py
+docutils/frontend.py
+docutils/io.py
+docutils/nodes.py
+docutils/statemachine.py
+docutils/urischemes.py
+docutils/utils.py
+docutils/languages/__init__.py
+docutils/languages/af.py
+docutils/languages/ca.py
+docutils/languages/cs.py
+docutils/languages/de.py
+docutils/languages/en.py
+docutils/languages/eo.py
+docutils/languages/es.py
+docutils/languages/fi.py
+docutils/languages/fr.py
+docutils/languages/it.py
+docutils/languages/ja.py
+docutils/languages/nl.py
+docutils/languages/pt_br.py
+docutils/languages/ru.py
+docutils/languages/sk.py
+docutils/languages/sv.py
+docutils/languages/zh_cn.py
+docutils/languages/zh_tw.py
+docutils/parsers/__init__.py
+docutils/parsers/null.py
+docutils/parsers/rst/__init__.py
+docutils/parsers/rst/roles.py
+docutils/parsers/rst/states.py
+docutils/parsers/rst/tableparser.py
+docutils/parsers/rst/directives/__init__.py
+docutils/parsers/rst/directives/admonitions.py
+docutils/parsers/rst/directives/body.py
+docutils/parsers/rst/directives/html.py
+docutils/parsers/rst/directives/images.py
+docutils/parsers/rst/directives/misc.py
+docutils/parsers/rst/directives/parts.py
+docutils/parsers/rst/directives/references.py
+docutils/parsers/rst/directives/tables.py
+docutils/parsers/rst/languages/__init__.py
+docutils/parsers/rst/languages/af.py
+docutils/parsers/rst/languages/ca.py
+docutils/parsers/rst/languages/cs.py
+docutils/parsers/rst/languages/de.py
+docutils/parsers/rst/languages/en.py
+docutils/parsers/rst/languages/eo.py
+docutils/parsers/rst/languages/es.py
+docutils/parsers/rst/languages/fi.py
+docutils/parsers/rst/languages/fr.py
+docutils/parsers/rst/languages/it.py
+docutils/parsers/rst/languages/ja.py
+docutils/parsers/rst/languages/nl.py
+docutils/parsers/rst/languages/pt_br.py
+docutils/parsers/rst/languages/ru.py
+docutils/parsers/rst/languages/sk.py
+docutils/parsers/rst/languages/sv.py
+docutils/parsers/rst/languages/zh_cn.py
+docutils/parsers/rst/languages/zh_tw.py
+docutils/readers/__init__.py
+docutils/readers/doctree.py
+docutils/readers/pep.py
+docutils/readers/standalone.py
+docutils/readers/python/__init__.py
+docutils/readers/python/moduleparser.py
+docutils/readers/python/pynodes.py
+docutils/transforms/__init__.py
+docutils/transforms/components.py
+docutils/transforms/frontmatter.py
+docutils/transforms/misc.py
+docutils/transforms/parts.py
+docutils/transforms/peps.py
+docutils/transforms/references.py
+docutils/transforms/universal.py
+docutils/transforms/writer_aux.py
+docutils/writers/__init__.py
+docutils/writers/docutils_xml.py
+docutils/writers/null.py
+docutils/writers/pseudoxml.py
+docutils/writers/html4css1/__init__.py
+docutils/writers/latex2e/__init__.py
+docutils/writers/newlatex2e/__init__.py
+docutils/writers/newlatex2e/unicode_map.py
+docutils/writers/pep_html/__init__.py
+docutils/writers/s5_html/__init__.py
+extras/roman.py
+extras/docutils.egg-info/PKG-INFO
+extras/docutils.egg-info/SOURCES.txt
+extras/docutils.egg-info/dependency_links.txt
+extras/docutils.egg-info/top_level.txt
+test/test_dependencies.py
+test/test_functional.py
+test/test_io.py
+test/test_language.py
+test/test_nodes.py
+test/test_publisher.py
+test/test_settings.py
+test/test_statemachine.py
+test/test_utils.py
+test/test_viewlist.py
+tools/rst2html.py
+tools/rst2latex.py
+tools/rst2newlatex.py
+tools/rst2pseudoxml.py
+tools/rst2s5.py
+tools/rst2xml.py
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/EGG-INFO/scripts/rst2latex.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/EGG-INFO/scripts/rst2latex.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/EGG-INFO/scripts/rst2latex.py (revision 3)
@@ -0,0 +1,25 @@
+#!/afs/bx.psu.edu/project/pythons/linux-x86_64-ucs4/bin/python2.6
+
+# Author: David Goodger
+# Contact: goodger@users.sourceforge.net
+# Revision: $Revision: 2548 $
+# Date: $Date: 2004-08-29 22:04:53 +0200 (Sun, 29 Aug 2004) $
+# Copyright: This module has been placed in the public domain.
+
+"""
+A minimal front end to the Docutils Publisher, producing LaTeX.
+"""
+
+try:
+    import locale
+    locale.setlocale(locale.LC_ALL, '')
+except:
+    pass
+
+from docutils.core import publish_cmdline, default_description
+
+
+description = ('Generates LaTeX documents from standalone reStructuredText '
+               'sources.  ' + default_description)
+
+publish_cmdline(writer_name='latex', description=description)
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/EGG-INFO/scripts/rst2pseudoxml.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/EGG-INFO/scripts/rst2pseudoxml.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/EGG-INFO/scripts/rst2pseudoxml.py (revision 3)
@@ -0,0 +1,25 @@
+#!/afs/bx.psu.edu/project/pythons/linux-x86_64-ucs4/bin/python2.6
+
+# Author: David Goodger
+# Contact: goodger@users.sourceforge.net
+# Revision: $Revision: 2467 $
+# Date: $Date: 2004-07-27 18:23:44 +0200 (Tue, 27 Jul 2004) $
+# Copyright: This module has been placed in the public domain.
+
+"""
+A minimal front end to the Docutils Publisher, producing pseudo-XML.
+"""
+
+try:
+    import locale
+    locale.setlocale(locale.LC_ALL, '')
+except:
+    pass
+
+from docutils.core import publish_cmdline, default_description
+
+
+description = ('Generates pseudo-XML from standalone reStructuredText '
+               'sources (for testing purposes).  ' + default_description)
+
+publish_cmdline(description=description)
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/EGG-INFO/scripts/rst2xml.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/EGG-INFO/scripts/rst2xml.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/EGG-INFO/scripts/rst2xml.py (revision 3)
@@ -0,0 +1,25 @@
+#!/afs/bx.psu.edu/project/pythons/linux-x86_64-ucs4/bin/python2.6
+
+# Author: David Goodger
+# Contact: goodger@users.sourceforge.net
+# Revision: $Revision: 2468 $
+# Date: $Date: 2004-07-27 18:25:22 +0200 (Tue, 27 Jul 2004) $
+# Copyright: This module has been placed in the public domain.
+
+"""
+A minimal front end to the Docutils Publisher, producing Docutils XML.
+"""
+
+try:
+    import locale
+    locale.setlocale(locale.LC_ALL, '')
+except:
+    pass
+
+from docutils.core import publish_cmdline, default_description
+
+
+description = ('Generates Docutils-native XML from standalone '
+               'reStructuredText sources.  ' + default_description)
+
+publish_cmdline(writer_name='xml', description=description)
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/EGG-INFO/scripts/rst2html.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/EGG-INFO/scripts/rst2html.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/EGG-INFO/scripts/rst2html.py (revision 3)
@@ -0,0 +1,25 @@
+#!/afs/bx.psu.edu/project/pythons/linux-x86_64-ucs4/bin/python2.6
+
+# Author: David Goodger
+# Contact: goodger@python.org
+# Revision: $Revision: 3901 $
+# Date: $Date: 2005-09-25 17:49:54 +0200 (Sun, 25 Sep 2005) $
+# Copyright: This module has been placed in the public domain.
+
+"""
+A minimal front end to the Docutils Publisher, producing HTML.
+"""
+
+try:
+    import locale
+    locale.setlocale(locale.LC_ALL, '')
+except:
+    pass
+
+from docutils.core import publish_cmdline, default_description
+
+
+description = ('Generates (X)HTML documents from standalone reStructuredText '
+               'sources.  ' + default_description)
+
+publish_cmdline(writer_name='html', description=description)
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/EGG-INFO/scripts/rst2newlatex.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/EGG-INFO/scripts/rst2newlatex.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/EGG-INFO/scripts/rst2newlatex.py (revision 3)
@@ -0,0 +1,27 @@
+#!/afs/bx.psu.edu/project/pythons/linux-x86_64-ucs4/bin/python2.6
+
+# Author: David Goodger
+# Contact: goodger@users.sourceforge.net
+# Revision: $Revision: 3260 $
+# Date: $Date: 2005-04-27 01:03:00 +0200 (Wed, 27 Apr 2005) $
+# Copyright: This module has been placed in the public domain.
+
+"""
+A minimal front end to the Docutils Publisher, producing LaTeX using
+the new LaTeX writer.
+"""
+
+try:
+    import locale
+    locale.setlocale(locale.LC_ALL, '')
+except:
+    pass
+
+from docutils.core import publish_cmdline, default_description
+
+
+description = ('Generates LaTeX documents from standalone reStructuredText '
+               'sources. This writer is EXPERIMENTAL and should not be used '
+               'in a production environment. ' + default_description)
+
+publish_cmdline(writer_name='newlatex2e', description=description)
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/EGG-INFO/scripts/rst2s5.py
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/EGG-INFO/scripts/rst2s5.py (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/EGG-INFO/scripts/rst2s5.py (revision 3)
@@ -0,0 +1,26 @@
+#!/afs/bx.psu.edu/project/pythons/linux-x86_64-ucs4/bin/python2.6
+
+# Author: Chris Liechti
+# Contact: cliechti@gmx.net
+# Revision: $Revision: 4156 $
+# Date: $Date: 2005-12-08 05:43:13 +0100 (Thu, 08 Dec 2005) $
+# Copyright: This module has been placed in the public domain.
+
+"""
+A minimal front end to the Docutils Publisher, producing HTML slides using
+the S5 template system.
+"""
+
+try:
+    import locale
+    locale.setlocale(locale.LC_ALL, '')
+except:
+    pass
+
+from docutils.core import publish_cmdline, default_description
+
+
+description = ('Generates S5 (X)HTML slideshow documents from standalone '
+               'reStructuredText sources.  ' + default_description)
+
+publish_cmdline(writer_name='s5', description=description)
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/EGG-INFO/top_level.txt
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/EGG-INFO/top_level.txt (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/EGG-INFO/top_level.txt (revision 3)
@@ -0,0 +1,2 @@
+docutils
+roman
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/EGG-INFO/PKG-INFO
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/EGG-INFO/PKG-INFO (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/EGG-INFO/PKG-INFO (revision 3)
@@ -0,0 +1,38 @@
+Metadata-Version: 1.0
+Name: docutils
+Version: 0.4
+Summary: Docutils -- Python Documentation Utilities
+Home-page: http://docutils.sourceforge.net/
+Author: David Goodger
+Author-email: goodger@users.sourceforge.net
+License: public domain, Python, BSD, GPL (see COPYING.txt)
+Description: Docutils is a modular system for processing documentation
+        into useful formats, such as HTML, XML, and LaTeX.  For
+        input Docutils supports reStructuredText, an easy-to-read,
+        what-you-see-is-what-you-get plaintext markup syntax.
+Platform: OS-independent
+Classifier: Development Status :: 3 - Alpha
+Classifier: Environment :: Console
+Classifier: Intended Audience :: End Users/Desktop
+Classifier: Intended Audience :: Other Audience
+Classifier: Intended Audience :: Developers
+Classifier: Intended Audience :: System Administrators
+Classifier: License :: Public Domain
+Classifier: License :: OSI Approved :: Python Software Foundation License
+Classifier: License :: OSI Approved :: BSD License
+Classifier: License :: OSI Approved :: GNU General Public License (GPL)
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python
+Classifier: Topic :: Documentation
+Classifier: Topic :: Software Development :: Documentation
+Classifier: Topic :: Text Processing
+Classifier: Natural Language :: English
+Classifier: Natural Language :: Afrikaans
+Classifier: Natural Language :: Esperanto
+Classifier: Natural Language :: French
+Classifier: Natural Language :: German
+Classifier: Natural Language :: Italian
+Classifier: Natural Language :: Russian
+Classifier: Natural Language :: Slovak
+Classifier: Natural Language :: Spanish
+Classifier: Natural Language :: Swedish
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/EGG-INFO/dependency_links.txt
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/EGG-INFO/dependency_links.txt (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/EGG-INFO/dependency_links.txt (revision 3)
@@ -0,0 +1,1 @@
+
Index: /galaxy-central/eggs/docutils-0.4-py2.6.egg/EGG-INFO/not-zip-safe
===================================================================
--- /galaxy-central/eggs/docutils-0.4-py2.6.egg/EGG-INFO/not-zip-safe (revision 3)
+++ /galaxy-central/eggs/docutils-0.4-py2.6.egg/EGG-INFO/not-zip-safe (revision 3)
@@ -0,0 +1,1 @@
+
Index: /galaxy-central/eggs/Beaker-1.4-py2.6.egg/beaker/crypto/pbkdf2.py
===================================================================
--- /galaxy-central/eggs/Beaker-1.4-py2.6.egg/beaker/crypto/pbkdf2.py (revision 3)
+++ /galaxy-central/eggs/Beaker-1.4-py2.6.egg/beaker/crypto/pbkdf2.py (revision 3)
@@ -0,0 +1,358 @@
+#!/usr/bin/python
+# -*- coding: ascii -*-
+###########################################################################
+# PBKDF2.py - PKCS#5 v2.0 Password-Based Key Derivation
+#
+# Copyright (C) 2007 Dwayne C. Litzenberger <dlitz@dlitz.net>
+# All rights reserved.
+# 
+# Permission to use, copy, modify, and distribute this software and its
+# documentation for any purpose and without fee is hereby granted,
+# provided that the above copyright notice appear in all copies and that
+# both that copyright notice and this permission notice appear in
+# supporting documentation.
+# 
+# THE AUTHOR PROVIDES THIS SOFTWARE ``AS IS'' AND ANY EXPRESSED OR 
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 
+# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  
+# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+# Country of origin: Canada
+#
+###########################################################################
+# Sample PBKDF2 usage:
+#   from Crypto.Cipher import AES
+#   from PBKDF2 import PBKDF2
+#   import os
+#
+#   salt = os.urandom(8)    # 64-bit salt
+#   key = PBKDF2("This passphrase is a secret.", salt).read(32) # 256-bit key
+#   iv = os.urandom(16)     # 128-bit IV
+#   cipher = AES.new(key, AES.MODE_CBC, iv)
+#     ...
+#
+# Sample crypt() usage:
+#   from PBKDF2 import crypt
+#   pwhash = crypt("secret")
+#   alleged_pw = raw_input("Enter password: ")
+#   if pwhash == crypt(alleged_pw, pwhash):
+#       print "Password good"
+#   else:
+#       print "Invalid password"
+#
+###########################################################################
+# History:
+#
+#  2007-07-27 Dwayne C. Litzenberger <dlitz@dlitz.net>
+#   - Initial Release (v1.0)
+#
+#  2007-07-31 Dwayne C. Litzenberger <dlitz@dlitz.net>
+#   - Bugfix release (v1.1)
+#   - SECURITY: The PyCrypto XOR cipher (used, if available, in the _strxor
+#   function in the previous release) silently truncates all keys to 64
+#   bytes.  The way it was used in the previous release, this would only be
+#   problem if the pseudorandom function that returned values larger than
+#   64 bytes (so SHA1, SHA256 and SHA512 are fine), but I don't like
+#   anything that silently reduces the security margin from what is
+#   expected.
+#
+###########################################################################
+
+__version__ = "1.1"
+
+from struct import pack
+from binascii import b2a_hex
+from random import randint
+
+from beaker.util import b64encode
+
+try:
+    # Use PyCrypto (if available)
+    from Crypto.Hash import HMAC, SHA as SHA1
+
+except ImportError:
+    # PyCrypto not available.  Use the Python standard library.
+    import hmac as HMAC
+    import sys
+    # When using the stdlib, we have to make sure the hmac version and sha
+    # version are compatible
+    if sys.version_info[0:2] <= (2,4):
+        # hmac in python2.4 or less require the sha module
+        import sha as SHA1
+    else:
+        # NOTE: We have to use the callable with hashlib (hashlib.sha1),
+        # otherwise hmac only accepts the sha module object itself
+        from hashlib import sha1 as SHA1
+
+def strxor(a, b):
+    return "".join([chr(ord(x) ^ ord(y)) for (x, y) in zip(a, b)])
+
+class PBKDF2(object):
+    """PBKDF2.py : PKCS#5 v2.0 Password-Based Key Derivation
+    
+    This implementation takes a passphrase and a salt (and optionally an
+    iteration count, a digest module, and a MAC module) and provides a
+    file-like object from which an arbitrarily-sized key can be read.
+
+    If the passphrase and/or salt are unicode objects, they are encoded as
+    UTF-8 before they are processed.
+
+    The idea behind PBKDF2 is to derive a cryptographic key from a
+    passphrase and a salt.
+    
+    PBKDF2 may also be used as a strong salted password hash.  The
+    'crypt' function is provided for that purpose.
+    
+    Remember: Keys generated using PBKDF2 are only as strong as the
+    passphrases they are derived from.
+    """
+
+    def __init__(self, passphrase, salt, iterations=1000,
+                 digestmodule=SHA1, macmodule=HMAC):
+        if not callable(macmodule):
+            macmodule = macmodule.new
+        self.__macmodule = macmodule
+        self.__digestmodule = digestmodule
+        self._setup(passphrase, salt, iterations, self._pseudorandom)
+
+    def _pseudorandom(self, key, msg):
+        """Pseudorandom function.  e.g. HMAC-SHA1"""
+        return self.__macmodule(key=key, msg=msg,
+            digestmod=self.__digestmodule).digest()
+    
+    def read(self, bytes):
+        """Read the specified number of key bytes."""
+        if self.closed:
+            raise ValueError("file-like object is closed")
+
+        size = len(self.__buf)
+        blocks = [self.__buf]
+        i = self.__blockNum
+        while size < bytes:
+            i += 1
+            if i > 0xffffffff:
+                # We could return "" here, but 
+                raise OverflowError("derived key too long")
+            block = self.__f(i)
+            blocks.append(block)
+            size += len(block)
+        buf = "".join(blocks)
+        retval = buf[:bytes]
+        self.__buf = buf[bytes:]
+        self.__blockNum = i
+        return retval
+    
+    def __f(self, i):
+        # i must fit within 32 bits
+        assert (1 <= i and i <= 0xffffffff)
+        U = self.__prf(self.__passphrase, self.__salt + pack("!L", i))
+        result = U
+        for j in xrange(2, 1+self.__iterations):
+            U = self.__prf(self.__passphrase, U)
+            result = strxor(result, U)
+        return result
+    
+    def hexread(self, octets):
+        """Read the specified number of octets. Return them as hexadecimal.
+
+        Note that len(obj.hexread(n)) == 2*n.
+        """
+        return b2a_hex(self.read(octets))
+
+    def _setup(self, passphrase, salt, iterations, prf):
+        # Sanity checks:
+        
+        # passphrase and salt must be str or unicode (in the latter
+        # case, we convert to UTF-8)
+        if isinstance(passphrase, unicode):
+            passphrase = passphrase.encode("UTF-8")
+        if not isinstance(passphrase, str):
+            raise TypeError("passphrase must be str or unicode")
+        if isinstance(salt, unicode):
+            salt = salt.encode("UTF-8")
+        if not isinstance(salt, str):
+            raise TypeError("salt must be str or unicode")
+
+        # iterations must be an integer >= 1
+        if not isinstance(iterations, (int, long)):
+            raise TypeError("iterations must be an integer")
+        if iterations < 1:
+            raise ValueError("iterations must be at least 1")
+        
+        # prf must be callable
+        if not callable(prf):
+            raise TypeError("prf must be callable")
+
+        self.__passphrase = passphrase
+        self.__salt = salt
+        self.__iterations = iterations
+        self.__prf = prf
+        self.__blockNum = 0
+        self.__buf = ""
+        self.closed = False
+    
+    def close(self):
+        """Close the stream."""
+        if not self.closed:
+            del self.__passphrase
+            del self.__salt
+            del self.__iterations
+            del self.__prf
+            del self.__blockNum
+            del self.__buf
+            self.closed = True
+
+def crypt(word, salt=None, iterations=None):
+    """PBKDF2-based unix crypt(3) replacement.
+    
+    The number of iterations specified in the salt overrides the 'iterations'
+    parameter.
+
+    The effective hash length is 192 bits.
+    """
+    
+    # Generate a (pseudo-)random salt if the user hasn't provided one.
+    if salt is None:
+        salt = _makesalt()
+
+    # salt must be a string or the us-ascii subset of unicode
+    if isinstance(salt, unicode):
+        salt = salt.encode("us-ascii")
+    if not isinstance(salt, str):
+        raise TypeError("salt must be a string")
+
+    # word must be a string or unicode (in the latter case, we convert to UTF-8)
+    if isinstance(word, unicode):
+        word = word.encode("UTF-8")
+    if not isinstance(word, str):
+        raise TypeError("word must be a string or unicode")
+
+    # Try to extract the real salt and iteration count from the salt
+    if salt.startswith("$p5k2$"):
+        (iterations, salt, dummy) = salt.split("$")[2:5]
+        if iterations == "":
+            iterations = 400
+        else:
+            converted = int(iterations, 16)
+            if iterations != "%x" % converted:  # lowercase hex, minimum digits
+                raise ValueError("Invalid salt")
+            iterations = converted
+            if not (iterations >= 1):
+                raise ValueError("Invalid salt")
+    
+    # Make sure the salt matches the allowed character set
+    allowed = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789./"
+    for ch in salt:
+        if ch not in allowed:
+            raise ValueError("Illegal character %r in salt" % (ch,))
+
+    if iterations is None or iterations == 400:
+        iterations = 400
+        salt = "$p5k2$$" + salt
+    else:
+        salt = "$p5k2$%x$%s" % (iterations, salt)
+    rawhash = PBKDF2(word, salt, iterations).read(24)
+    return salt + "$" + b64encode(rawhash, "./")
+
+# Add crypt as a static method of the PBKDF2 class
+# This makes it easier to do "from PBKDF2 import PBKDF2" and still use
+# crypt.
+PBKDF2.crypt = staticmethod(crypt)
+
+def _makesalt():
+    """Return a 48-bit pseudorandom salt for crypt().
+    
+    This function is not suitable for generating cryptographic secrets.
+    """
+    binarysalt = "".join([pack("@H", randint(0, 0xffff)) for i in range(3)])
+    return b64encode(binarysalt, "./")
+
+def test_pbkdf2():
+    """Module self-test"""
+    from binascii import a2b_hex
+    
+    #
+    # Test vectors from RFC 3962
+    #
+
+    # Test 1
+    result = PBKDF2("password", "ATHENA.MIT.EDUraeburn", 1).read(16)
+    expected = a2b_hex("cdedb5281bb2f801565a1122b2563515")
+    if result != expected:
+        raise RuntimeError("self-test failed")
+
+    # Test 2
+    result = PBKDF2("password", "ATHENA.MIT.EDUraeburn", 1200).hexread(32)
+    expected = ("5c08eb61fdf71e4e4ec3cf6ba1f5512b"
+                "a7e52ddbc5e5142f708a31e2e62b1e13")
+    if result != expected:
+        raise RuntimeError("self-test failed")
+
+    # Test 3
+    result = PBKDF2("X"*64, "pass phrase equals block size", 1200).hexread(32)
+    expected = ("139c30c0966bc32ba55fdbf212530ac9"
+                "c5ec59f1a452f5cc9ad940fea0598ed1")
+    if result != expected:
+        raise RuntimeError("self-test failed")
+    
+    # Test 4
+    result = PBKDF2("X"*65, "pass phrase exceeds block size", 1200).hexread(32)
+    expected = ("9ccad6d468770cd51b10e6a68721be61"
+                "1a8b4d282601db3b36be9246915ec82a")
+    if result != expected:
+        raise RuntimeError("self-test failed")
+    
+    #
+    # Other test vectors
+    #
+    
+    # Chunked read
+    f = PBKDF2("kickstart", "workbench", 256)
+    result = f.read(17)
+    result += f.read(17)
+    result += f.read(1)
+    result += f.read(2)
+    result += f.read(3)
+    expected = PBKDF2("kickstart", "workbench", 256).read(40)
+    if result != expected:
+        raise RuntimeError("self-test failed")
+    
+    #
+    # crypt() test vectors
+    #
+
+    # crypt 1
+    result = crypt("cloadm", "exec")
+    expected = '$p5k2$$exec$r1EWMCMk7Rlv3L/RNcFXviDefYa0hlql'
+    if result != expected:
+        raise RuntimeError("self-test failed")
+    
+    # crypt 2
+    result = crypt("gnu", '$p5k2$c$u9HvcT4d$.....')
+    expected = '$p5k2$c$u9HvcT4d$Sd1gwSVCLZYAuqZ25piRnbBEoAesaa/g'
+    if result != expected:
+        raise RuntimeError("self-test failed")
+
+    # crypt 3
+    result = crypt("dcl", "tUsch7fU", iterations=13)
+    expected = "$p5k2$d$tUsch7fU$nqDkaxMDOFBeJsTSfABsyn.PYUXilHwL"
+    if result != expected:
+        raise RuntimeError("self-test failed")
+    
+    # crypt 4 (unicode)
+    result = crypt(u'\u0399\u03c9\u03b1\u03bd\u03bd\u03b7\u03c2',
+        '$p5k2$$KosHgqNo$9mjN8gqjt02hDoP0c2J0ABtLIwtot8cQ')
+    expected = '$p5k2$$KosHgqNo$9mjN8gqjt02hDoP0c2J0ABtLIwtot8cQ'
+    if result != expected:
+        raise RuntimeError("self-test failed")
+
+if __name__ == '__main__':
+    test_pbkdf2()
+
+# vim:set ts=4 sw=4 sts=4 expandtab:
Index: /galaxy-central/eggs/Beaker-1.4-py2.6.egg/beaker/crypto/pycrypto.py
===================================================================
--- /galaxy-central/eggs/Beaker-1.4-py2.6.egg/beaker/crypto/pycrypto.py (revision 3)
+++ /galaxy-central/eggs/Beaker-1.4-py2.6.egg/beaker/crypto/pycrypto.py (revision 3)
@@ -0,0 +1,12 @@
+"""
+Encryption module that uses pycryptopp.
+"""
+from pycryptopp.cipher import aes
+
+def aesEncrypt(data, key):
+    cipher = aes.AES(key)
+    return cipher.process(data)
+
+
+def getKeyLength():
+    return 32
Index: /galaxy-central/eggs/Beaker-1.4-py2.6.egg/beaker/crypto/__init__.py
===================================================================
--- /galaxy-central/eggs/Beaker-1.4-py2.6.egg/beaker/crypto/__init__.py (revision 3)
+++ /galaxy-central/eggs/Beaker-1.4-py2.6.egg/beaker/crypto/__init__.py (revision 3)
@@ -0,0 +1,35 @@
+from warnings import warn
+
+from beaker.crypto.pbkdf2 import PBKDF2, strxor
+from beaker.exceptions import InvalidCryptoBackendError
+
+_implementations = ('pycrypto', 'jcecrypto')
+
+keyLength = None
+for impl_name in _implementations:
+    try:
+        package = 'beaker.crypto.%s' % impl_name
+        module = __import__(package, fromlist=('aesEncrypt', 'getKeyLength'))
+        keyLength = module.getKeyLength()
+        aesEncrypt = module.aesEncrypt
+        if keyLength >= 32:
+            break
+    except:
+        pass
+
+if not keyLength:
+    raise InvalidCryptoBackendError
+
+if keyLength < 32:
+    warn('Crypto implementation only supports key lengths up to %d bits. '
+         'Generated session cookies may be incompatible with other '
+         'environments' % (keyLength * 8))
+
+def generateCryptoKeys(master_key, salt, iterations):
+    # NB: We XOR parts of the keystream into the randomly-generated parts, just
+    # in case os.urandom() isn't as random as it should be.  Note that if
+    # os.urandom() returns truly random data, this will have no effect on the
+    # overall security.
+    keystream = PBKDF2(master_key, salt, iterations=iterations)
+    cipher_key = keystream.read(keyLength)
+    return cipher_key
Index: /galaxy-central/eggs/Beaker-1.4-py2.6.egg/beaker/crypto/jcecrypto.py
===================================================================
--- /galaxy-central/eggs/Beaker-1.4-py2.6.egg/beaker/crypto/jcecrypto.py (revision 3)
+++ /galaxy-central/eggs/Beaker-1.4-py2.6.egg/beaker/crypto/jcecrypto.py (revision 3)
@@ -0,0 +1,28 @@
+"""
+Encryption module that uses the Java Cryptography Extensions (JCE).
+
+Note that in default installations of the Java Runtime Environment, the
+maximum key length is limited to 128 bits due to US export
+restrictions. This makes the generated keys incompatible with the ones
+generated by pycryptopp, which has no such restrictions. To fix this,
+download the "Unlimited Strength Jurisdiction Policy Files" from Sun,
+which will allow encryption using 256 bit AES keys.
+"""
+from javax.crypto import Cipher
+from javax.crypto.spec import SecretKeySpec, IvParameterSpec
+
+import jarray
+
+# Initialization vector filled with zeros
+_iv = IvParameterSpec(jarray.zeros(16, 'b'))
+
+def aesEncrypt(data, key):
+    cipher = Cipher.getInstance('AES/CTR/NoPadding')
+    skeySpec = SecretKeySpec(key, 'AES')
+    cipher.init(Cipher.ENCRYPT_MODE, skeySpec, _iv)
+    return cipher.doFinal(data).tostring()
+
+
+def getKeyLength():
+    maxlen = Cipher.getMaxAllowedKeyLength('AES/CTR/NoPadding')
+    return min(maxlen, 256) / 8
Index: /galaxy-central/eggs/Beaker-1.4-py2.6.egg/beaker/ext/google.py
===================================================================
--- /galaxy-central/eggs/Beaker-1.4-py2.6.egg/beaker/ext/google.py (revision 3)
+++ /galaxy-central/eggs/Beaker-1.4-py2.6.egg/beaker/ext/google.py (revision 3)
@@ -0,0 +1,115 @@
+from __future__ import absolute_import
+import cPickle
+import logging
+from datetime import datetime
+
+from beaker.container import OpenResourceNamespaceManager, Container
+from beaker.exceptions import InvalidCacheBackendError
+from beaker.synchronization import null_synchronizer
+
+log = logging.getLogger(__name__)
+
+try:
+    from google.appengine.ext import db
+except ImportError:
+    raise InvalidCacheBackendError("Datastore cache backend requires the "
+                                   "'google.appengine.ext' library")
+
+
+class GoogleNamespaceManager(OpenResourceNamespaceManager):
+    tables = {}
+    
+    def __init__(self, namespace, table_name='beaker_cache', **params):
+        """Creates a datastore namespace manager"""
+        OpenResourceNamespaceManager.__init__(self, namespace)
+        
+        def make_cache():
+            table_dict = dict(created=db.DateTimeProperty(),
+                              accessed=db.DateTimeProperty(),
+                              data=db.BlobProperty())
+            table = type(table_name, (db.Model,), table_dict)
+            return table
+        self.table_name = table_name
+        self.cache = GoogleNamespaceManager.tables.setdefault(table_name, make_cache())
+        self.hash = {}
+        self._is_new = False
+        self.loaded = False
+        self.log_debug = logging.DEBUG >= log.getEffectiveLevel()
+        
+        # Google wants namespaces to start with letters, change the namespace
+        # to start with a letter
+        self.namespace = 'p%s' % self.namespace
+    
+    def get_access_lock(self):
+        return null_synchronizer()
+
+    def get_creation_lock(self, key):
+        # this is weird, should probably be present
+        return null_synchronizer()
+
+    def do_open(self, flags):
+        # If we already loaded the data, don't bother loading it again
+        if self.loaded:
+            self.flags = flags
+            return
+        
+        item = self.cache.get_by_key_name(self.namespace)
+        
+        if not item:
+            self._is_new = True
+            self.hash = {}
+        else:
+            self._is_new = False
+            try:
+                self.hash = cPickle.loads(str(item.data))
+            except (IOError, OSError, EOFError, cPickle.PickleError):
+                if self.log_debug:
+                    log.debug("Couln't load pickle data, creating new storage")
+                self.hash = {}
+                self._is_new = True
+        self.flags = flags
+        self.loaded = True
+    
+    def do_close(self):
+        if self.flags is not None and (self.flags == 'c' or self.flags == 'w'):
+            if self._is_new:
+                item = self.cache(key_name=self.namespace)
+                item.data = cPickle.dumps(self.hash)
+                item.created = datetime.now()
+                item.accessed = datetime.now()
+                item.put()
+                self._is_new = False
+            else:
+                item = self.cache.get_by_key_name(self.namespace)
+                item.data = cPickle.dumps(self.hash)
+                item.accessed = datetime.now()
+                item.put()
+        self.flags = None
+    
+    def do_remove(self):
+        item = self.cache.get_by_key_name(self.namespace)
+        item.delete()
+        self.hash = {}
+        
+        # We can retain the fact that we did a load attempt, but since the
+        # file is gone this will be a new namespace should it be saved.
+        self._is_new = True
+
+    def __getitem__(self, key):
+        return self.hash[key]
+
+    def __contains__(self, key): 
+        return self.hash.has_key(key)
+        
+    def __setitem__(self, key, value):
+        self.hash[key] = value
+
+    def __delitem__(self, key):
+        del self.hash[key]
+
+    def keys(self):
+        return self.hash.keys()
+        
+
+class GoogleContainer(Container):
+    namespace_class = GoogleNamespaceManager
Index: /galaxy-central/eggs/Beaker-1.4-py2.6.egg/beaker/ext/sqla.py
===================================================================
--- /galaxy-central/eggs/Beaker-1.4-py2.6.egg/beaker/ext/sqla.py (revision 3)
+++ /galaxy-central/eggs/Beaker-1.4-py2.6.egg/beaker/ext/sqla.py (revision 3)
@@ -0,0 +1,124 @@
+import cPickle
+import logging
+import pickle
+from datetime import datetime
+
+from beaker.container import OpenResourceNamespaceManager, Container
+from beaker.exceptions import InvalidCacheBackendError, MissingCacheParameter
+from beaker.synchronization import file_synchronizer, null_synchronizer
+from beaker.util import verify_directory, SyncDict
+
+try:
+    import sqlalchemy as sa
+except ImportError:
+    raise InvalidCacheBackendError('SQLAlchemy, which is required by this backend, is not installed')
+
+log = logging.getLogger(__name__)
+
+class SqlaNamespaceManager(OpenResourceNamespaceManager):
+    binds = SyncDict()
+    tables = SyncDict()
+
+    def __init__(self, namespace, bind, table, data_dir=None, lock_dir=None,
+                 **kwargs):
+        """Create a namespace manager for use with a database table via
+        SQLAlchemy.
+
+        ``bind``
+            SQLAlchemy ``Engine`` or ``Connection`` object
+
+        ``table``
+            SQLAlchemy ``Table`` object in which to store namespace data.
+            This should usually be something created by ``make_cache_table``.
+        """
+        OpenResourceNamespaceManager.__init__(self, namespace)
+
+        if lock_dir:
+            self.lock_dir = lock_dir
+        elif data_dir:
+            self.lock_dir = data_dir + "/container_db_lock"
+        if self.lock_dir:
+            verify_directory(self.lock_dir)            
+
+        self.bind = self.__class__.binds.get(str(bind.url), lambda: bind)
+        self.table = self.__class__.tables.get('%s:%s' % (bind.url, table.name),
+                                               lambda: table)
+        self.hash = {}
+        self._is_new = False
+        self.loaded = False
+
+    def get_access_lock(self):
+        return null_synchronizer()
+
+    def get_creation_lock(self, key):
+        return file_synchronizer(
+            identifier ="databasecontainer/funclock/%s" % self.namespace,
+            lock_dir=self.lock_dir)
+
+    def do_open(self, flags):
+        if self.loaded:
+            self.flags = flags
+            return
+        select = sa.select([self.table.c.data],
+                           (self.table.c.namespace == self.namespace))
+        result = self.bind.execute(select).fetchone()
+        if not result:
+            self._is_new = True
+            self.hash = {}
+        else:
+            self._is_new = False
+            try:
+                self.hash = result['data']
+            except (IOError, OSError, EOFError, cPickle.PickleError,
+                    pickle.PickleError):
+                log.debug("Couln't load pickle data, creating new storage")
+                self.hash = {}
+                self._is_new = True
+        self.flags = flags
+        self.loaded = True
+
+    def do_close(self):
+        if self.flags is not None and (self.flags == 'c' or self.flags == 'w'):
+            if self._is_new:
+                insert = self.table.insert()
+                self.bind.execute(insert, namespace=self.namespace, data=self.hash,
+                                  accessed=datetime.now(), created=datetime.now())
+                self._is_new = False
+            else:
+                update = self.table.update(self.table.c.namespace == self.namespace)
+                self.bind.execute(update, data=self.hash, accessed=datetime.now())
+        self.flags = None
+
+    def do_remove(self):
+        delete = self.table.delete(self.table.c.namespace == self.namespace)
+        self.bind.execute(delete)
+        self.hash = {}
+        self._is_new = True
+
+    def __getitem__(self, key):
+        return self.hash[key]
+
+    def __contains__(self, key):
+        return self.hash.has_key(key)
+
+    def __setitem__(self, key, value):
+        self.hash[key] = value
+
+    def __delitem__(self, key):
+        del self.hash[key]
+
+    def keys(self):
+        return self.hash.keys()
+
+
+class SqlaContainer(Container):
+    namespace_manager = SqlaNamespaceManager
+
+def make_cache_table(metadata, table_name='beaker_cache'):
+    """Return a ``Table`` object suitable for storing cached values for the
+    namespace manager.  Do not create the table."""
+    return sa.Table(table_name, metadata,
+                    sa.Column('namespace', sa.String(255), primary_key=True),
+                    sa.Column('accessed', sa.DateTime, nullable=False),
+                    sa.Column('created', sa.DateTime, nullable=False),
+                    sa.Column('data', sa.PickleType, nullable=False))
Index: /galaxy-central/eggs/Beaker-1.4-py2.6.egg/beaker/ext/database.py
===================================================================
--- /galaxy-central/eggs/Beaker-1.4-py2.6.egg/beaker/ext/database.py (revision 3)
+++ /galaxy-central/eggs/Beaker-1.4-py2.6.egg/beaker/ext/database.py (revision 3)
@@ -0,0 +1,167 @@
+import cPickle
+import logging
+import pickle
+from datetime import datetime
+
+from beaker.container import OpenResourceNamespaceManager, Container
+from beaker.exceptions import InvalidCacheBackendError, MissingCacheParameter
+from beaker.synchronization import file_synchronizer, null_synchronizer
+from beaker.util import verify_directory, SyncDict
+
+sa_version = None
+
+log = logging.getLogger(__name__)
+
+try:
+    import sqlalchemy as sa
+    import sqlalchemy.pool as pool
+    from sqlalchemy import types
+    sa_version = '0.3'
+except ImportError:
+    raise InvalidCacheBackendError("Database cache backend requires the 'sqlalchemy' library")
+
+if not hasattr(sa, 'BoundMetaData'):
+    sa_version = '0.4'
+
+class DatabaseNamespaceManager(OpenResourceNamespaceManager):
+    metadatas = SyncDict()
+    tables = SyncDict()
+    
+    def __init__(self, namespace, url=None, sa_opts=None, optimistic=False,
+                 table_name='beaker_cache', data_dir=None, lock_dir=None,
+                 **params):
+        """Creates a database namespace manager
+        
+        ``url``
+            SQLAlchemy compliant db url
+        ``sa_opts``
+            A dictionary of SQLAlchemy keyword options to initialize the engine
+            with.
+        ``optimistic``
+            Use optimistic session locking, note that this will result in an
+            additional select when updating a cache value to compare version
+            numbers.
+        ``table_name``
+            The table name to use in the database for the cache.
+        """
+        OpenResourceNamespaceManager.__init__(self, namespace)
+        
+        if sa_opts is None:
+            sa_opts = params
+
+        if lock_dir:
+            self.lock_dir = lock_dir
+        elif data_dir:
+            self.lock_dir = data_dir + "/container_db_lock"
+        if self.lock_dir:
+            verify_directory(self.lock_dir)            
+        
+        # Check to see if the table's been created before
+        url = url or sa_opts['sa.url']
+        table_key = url + table_name
+        def make_cache():
+            # Check to see if we have a connection pool open already
+            meta_key = url + table_name
+            def make_meta():
+                if sa_version == '0.3':
+                    if url.startswith('mysql') and not sa_opts:
+                        sa_opts['poolclass'] = pool.QueuePool
+                    engine = sa.create_engine(url, **sa_opts)
+                    meta = sa.BoundMetaData(engine)
+                else:
+                    # SQLAlchemy pops the url, this ensures it sticks around
+                    # later
+                    sa_opts['sa.url'] = url
+                    engine = sa.engine_from_config(sa_opts, 'sa.')
+                    meta = sa.MetaData()
+                    meta.bind = engine
+                return meta
+            meta = DatabaseNamespaceManager.metadatas.get(meta_key, make_meta)
+            # Create the table object and cache it now
+            cache = sa.Table(table_name, meta,
+                             sa.Column('id', types.Integer, primary_key=True),
+                             sa.Column('namespace', types.String(255), nullable=False),
+                             sa.Column('accessed', types.DateTime, nullable=False),
+                             sa.Column('created', types.DateTime, nullable=False),
+                             sa.Column('data', types.PickleType, nullable=False),
+                             sa.UniqueConstraint('namespace')
+            )
+            cache.create(checkfirst=True)
+            return cache
+        self.hash = {}
+        self._is_new = False
+        self.loaded = False
+        self.cache = DatabaseNamespaceManager.tables.get(table_key, make_cache)
+    
+    def get_access_lock(self):
+        return null_synchronizer()
+
+    def get_creation_lock(self, key):
+        return file_synchronizer(
+            identifier ="databasecontainer/funclock/%s" % self.namespace,
+            lock_dir = self.lock_dir)
+
+    def do_open(self, flags):
+        # If we already loaded the data, don't bother loading it again
+        if self.loaded:
+            self.flags = flags
+            return
+        
+        cache = self.cache
+        result = sa.select([cache.c.data], 
+                           cache.c.namespace==self.namespace
+                          ).execute().fetchone()
+        if not result:
+            self._is_new = True
+            self.hash = {}
+        else:
+            self._is_new = False
+            try:
+                self.hash = result['data']
+            except (IOError, OSError, EOFError, cPickle.PickleError,
+                    pickle.PickleError):
+                log.debug("Couln't load pickle data, creating new storage")
+                self.hash = {}
+                self._is_new = True
+        self.flags = flags
+        self.loaded = True
+    
+    def do_close(self):
+        if self.flags is not None and (self.flags == 'c' or self.flags == 'w'):
+            cache = self.cache
+            if self._is_new:
+                cache.insert().execute(namespace=self.namespace, data=self.hash,
+                                       accessed=datetime.now(),
+                                       created=datetime.now())
+                self._is_new = False
+            else:
+                cache.update(cache.c.namespace==self.namespace).execute(
+                    data=self.hash, accessed=datetime.now())
+        self.flags = None
+    
+    def do_remove(self):
+        cache = self.cache
+        cache.delete(cache.c.namespace==self.namespace).execute()
+        self.hash = {}
+        
+        # We can retain the fact that we did a load attempt, but since the
+        # file is gone this will be a new namespace should it be saved.
+        self._is_new = True
+
+    def __getitem__(self, key): 
+        return self.hash[key]
+
+    def __contains__(self, key): 
+        return self.hash.has_key(key)
+        
+    def __setitem__(self, key, value):
+        self.hash[key] = value
+
+    def __delitem__(self, key):
+        del self.hash[key]
+
+    def keys(self):
+        return self.hash.keys()
+
+class DatabaseContainer(Container):
+    namespace_manager = DatabaseNamespaceManager
Index: /galaxy-central/eggs/Beaker-1.4-py2.6.egg/beaker/ext/memcached.py
===================================================================
--- /galaxy-central/eggs/Beaker-1.4-py2.6.egg/beaker/ext/memcached.py (revision 3)
+++ /galaxy-central/eggs/Beaker-1.4-py2.6.egg/beaker/ext/memcached.py (revision 3)
@@ -0,0 +1,69 @@
+from beaker.container import NamespaceManager, Container
+from beaker.exceptions import InvalidCacheBackendError, MissingCacheParameter
+from beaker.synchronization import file_synchronizer, null_synchronizer
+from beaker.util import verify_directory, SyncDict
+
+try:
+    import cmemcache as memcache
+except ImportError:
+    try:
+        import memcache
+    except ImportError:
+        raise InvalidCacheBackendError("Memcached cache backend requires either the 'memcache' or 'cmemcache' library")
+
+class MemcachedNamespaceManager(NamespaceManager):
+    clients = SyncDict()
+    
+    def __init__(self, namespace, url=None, data_dir=None, lock_dir=None, **params):
+        NamespaceManager.__init__(self, namespace)
+       
+        if not url:
+            raise MissingCacheParameter("url is required") 
+        
+        if lock_dir:
+            self.lock_dir = lock_dir
+        elif data_dir:
+            self.lock_dir = data_dir + "/container_mcd_lock"
+        if self.lock_dir:
+            verify_directory(self.lock_dir)            
+        
+        self.mc = MemcachedNamespaceManager.clients.get(url, 
+            memcache.Client, url.split(';'), debug=0)
+
+    def get_creation_lock(self, key):
+        return file_synchronizer(
+            identifier="memcachedcontainer/funclock/%s" % self.namespace,lock_dir = self.lock_dir)
+
+    def _format_key(self, key):
+        return self.namespace + '_' + key.replace(' ', '\302\267')
+
+    def __getitem__(self, key):
+        return self.mc.get(self._format_key(key))
+
+    def __contains__(self, key):
+        value = self.mc.get(self._format_key(key))
+        return value is not None
+
+    def has_key(self, key):
+        return key in self
+
+    def set_value(self, key, value, expiretime=None):
+        if expiretime:
+            self.mc.set(self._format_key(key), value, time=expiretime)
+        else:
+            self.mc.set(self._format_key(key), value)
+
+    def __setitem__(self, key, value):
+        self.set_value(key, value)
+        
+    def __delitem__(self, key):
+        self.mc.delete(self._format_key(key))
+
+    def do_remove(self):
+        self.mc.flush_all()
+    
+    def keys(self):
+        raise NotImplementedError("Memcache caching does not support iteration of all cache keys")
+
+class MemcachedContainer(Container):
+    namespace_class = MemcachedNamespaceManager
Index: /galaxy-central/eggs/Beaker-1.4-py2.6.egg/beaker/converters.py
===================================================================
--- /galaxy-central/eggs/Beaker-1.4-py2.6.egg/beaker/converters.py (revision 3)
+++ /galaxy-central/eggs/Beaker-1.4-py2.6.egg/beaker/converters.py (revision 3)
@@ -0,0 +1,26 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+def asbool(obj):
+    if isinstance(obj, (str, unicode)):
+        obj = obj.strip().lower()
+        if obj in ['true', 'yes', 'on', 'y', 't', '1']:
+            return True
+        elif obj in ['false', 'no', 'off', 'n', 'f', '0']:
+            return False
+        else:
+            raise ValueError(
+                "String is not true/false: %r" % obj)
+    return bool(obj)
+
+def aslist(obj, sep=None, strip=True):
+    if isinstance(obj, (str, unicode)):
+        lst = obj.split(sep)
+        if strip:
+            lst = [v.strip() for v in lst]
+        return lst
+    elif isinstance(obj, (list, tuple)):
+        return obj
+    elif obj is None:
+        return []
+    else:
+        return [obj]
Index: /galaxy-central/eggs/Beaker-1.4-py2.6.egg/beaker/middleware.py
===================================================================
--- /galaxy-central/eggs/Beaker-1.4-py2.6.egg/beaker/middleware.py (revision 3)
+++ /galaxy-central/eggs/Beaker-1.4-py2.6.egg/beaker/middleware.py (revision 3)
@@ -0,0 +1,165 @@
+import warnings
+
+try:
+    from paste.registry import StackedObjectProxy
+    beaker_session = StackedObjectProxy(name="Beaker Session")
+    beaker_cache = StackedObjectProxy(name="Cache Manager")
+except:
+    beaker_cache = None
+    beaker_session = None
+
+from beaker.cache import CacheManager
+from beaker.session import Session, SessionObject
+from beaker.util import coerce_cache_params, coerce_session_params, \
+    parse_cache_config_options
+
+
+class CacheMiddleware(object):
+    cache = beaker_cache
+    
+    def __init__(self, app, config=None, environ_key='beaker.cache', **kwargs):
+        """Initialize the Cache Middleware
+        
+        The Cache middleware will make a Cache instance available
+        every request under the ``environ['beaker.cache']`` key by
+        default. The location in environ can be changed by setting
+        ``environ_key``.
+        
+        ``config``
+            dict  All settings should be prefixed by 'cache.'. This
+            method of passing variables is intended for Paste and other
+            setups that accumulate multiple component settings in a
+            single dictionary. If config contains *no cache. prefixed
+            args*, then *all* of the config options will be used to
+            intialize the Cache objects.
+        
+        ``environ_key``
+            Location where the Cache instance will keyed in the WSGI
+            environ
+        
+        ``**kwargs``
+            All keyword arguments are assumed to be cache settings and
+            will override any settings found in ``config``
+
+        """
+        self.app = app
+        config = config or {}
+        
+        self.options = {}
+        
+        # Update the options with the parsed config
+        self.options.update(parse_cache_config_options(config))
+        
+        # Add any options from kwargs, but leave out the defaults this
+        # time
+        self.options.update(
+            parse_cache_config_options(kwargs, include_defaults=False))
+                
+        # Assume all keys are intended for cache if none are prefixed with
+        # 'cache.'
+        if not self.options and config:
+            self.options = config
+        
+        self.options.update(kwargs)
+        self.cache_manager = CacheManager(**self.options)
+        self.environ_key = environ_key
+    
+    def __call__(self, environ, start_response):
+        if environ.get('paste.registry'):
+            if environ['paste.registry'].reglist:
+                environ['paste.registry'].register(self.cache,
+                                                   self.cache_manager)
+        environ[self.environ_key] = self.cache_manager
+        return self.app(environ, start_response)
+
+
+class SessionMiddleware(object):
+    session = beaker_session
+    
+    def __init__(self, wrap_app, config=None, environ_key='beaker.session',
+                 **kwargs):
+        """Initialize the Session Middleware
+        
+        The Session middleware will make a lazy session instance
+        available every request under the ``environ['beaker.session']``
+        key by default. The location in environ can be changed by
+        setting ``environ_key``.
+        
+        ``config``
+            dict  All settings should be prefixed by 'session.'. This
+            method of passing variables is intended for Paste and other
+            setups that accumulate multiple component settings in a
+            single dictionary. If config contains *no cache. prefixed
+            args*, then *all* of the config options will be used to
+            intialize the Cache objects.
+        
+        ``environ_key``
+            Location where the Session instance will keyed in the WSGI
+            environ
+        
+        ``**kwargs``
+            All keyword arguments are assumed to be session settings and
+            will override any settings found in ``config``
+
+        """
+        config = config or {}
+        
+        # Load up the default params
+        self.options = dict(invalidate_corrupt=True, type=None, 
+                           data_dir=None, key='beaker.session.id', 
+                           timeout=None, secret=None, log_file=None)
+
+        # Pull out any config args meant for beaker session. if there are any
+        for dct in [config, kwargs]:
+            for key, val in dct.iteritems():
+                if key.startswith('beaker.session.'):
+                    self.options[key[15:]] = val
+                if key.startswith('session.'):
+                    self.options[key[8:]] = val
+                if key.startswith('session_'):
+                    warnings.warn('Session options should start with session. '
+                                  'instead of session_.', DeprecationWarning, 2)
+                    self.options[key[8:]] = val
+        
+        # Coerce and validate session params
+        coerce_session_params(self.options)
+        
+        # Assume all keys are intended for cache if none are prefixed with
+        # 'cache.'
+        if not self.options and config:
+            self.options = config
+        
+        self.options.update(kwargs)
+        self.wrap_app = wrap_app
+        self.environ_key = environ_key
+        
+    def __call__(self, environ, start_response):
+        session = SessionObject(environ, **self.options)
+        if environ.get('paste.registry'):
+            if environ['paste.registry'].reglist:
+                environ['paste.registry'].register(self.session, session)
+        environ[self.environ_key] = session
+        environ['beaker.get_session'] = self._get_session
+        
+        def session_start_response(status, headers, exc_info = None):
+            if session.accessed():
+                session.persist()
+                if session.__dict__['_headers']['set_cookie']:
+                    cookie = session.__dict__['_headers']['cookie_out']
+                    if cookie:
+                        headers.append(('Set-cookie', cookie))
+            return start_response(status, headers, exc_info)
+        return self.wrap_app(environ, session_start_response)
+    
+    def _get_session(self):
+        return Session({}, use_cookies=False, **self.options)
+
+
+def session_filter_factory(global_conf, **kwargs):
+    def filter(app):
+        return SessionMiddleware(app, global_conf, **kwargs)
+    return filter
+
+
+def session_filter_app_factory(app, global_conf, **kwargs):
+    return SessionMiddleware(app, global_conf, **kwargs)
Index: /galaxy-central/eggs/Beaker-1.4-py2.6.egg/beaker/util.py
===================================================================
--- /galaxy-central/eggs/Beaker-1.4-py2.6.egg/beaker/util.py (revision 3)
+++ /galaxy-central/eggs/Beaker-1.4-py2.6.egg/beaker/util.py (revision 3)
@@ -0,0 +1,357 @@
+"""Beaker utilities"""
+try:
+    import thread as _thread
+    import threading as _threading
+except ImportError:
+    import dummy_thread as _thread
+    import dummy_threading as _threading
+
+from datetime import datetime, timedelta
+import os
+import string
+import types
+import weakref
+import warnings
+
+try:
+    Set = set
+except NameError:
+    from sets import Set
+try:
+    from hashlib import sha1
+except ImportError:
+    from sha import sha as sha1
+
+from beaker.converters import asbool
+
+try:
+    from base64 import b64encode, b64decode
+except ImportError:
+    import binascii
+
+    _translation = [chr(_x) for _x in range(256)]
+
+    # From Python 2.5 base64.py
+    def _translate(s, altchars):
+        translation = _translation[:]
+        for k, v in altchars.items():
+            translation[ord(k)] = v
+        return s.translate(''.join(translation))
+
+    def b64encode(s, altchars=None):
+        """Encode a string using Base64.
+
+        s is the string to encode.  Optional altchars must be a string of at least
+        length 2 (additional characters are ignored) which specifies an
+        alternative alphabet for the '+' and '/' characters.  This allows an
+        application to e.g. generate url or filesystem safe Base64 strings.
+
+        The encoded string is returned.
+        """
+        # Strip off the trailing newline
+        encoded = binascii.b2a_base64(s)[:-1]
+        if altchars is not None:
+            return _translate(encoded, {'+': altchars[0], '/': altchars[1]})
+        return encoded
+
+    def b64decode(s, altchars=None):
+        """Decode a Base64 encoded string.
+
+        s is the string to decode.  Optional altchars must be a string of at least
+        length 2 (additional characters are ignored) which specifies the
+        alternative alphabet used instead of the '+' and '/' characters.
+
+        The decoded string is returned.  A TypeError is raised if s were
+        incorrectly padded or if there are non-alphabet characters present in the
+        string.
+        """
+        if altchars is not None:
+            s = _translate(s, {altchars[0]: '+', altchars[1]: '/'})
+        try:
+            return binascii.a2b_base64(s)
+        except binascii.Error, msg:
+            # Transform this exception for consistency
+            raise TypeError(msg)
+
+try:
+    from threading import local as _tlocal
+except ImportError:
+    try:
+        from dummy_threading import local as _tlocal
+    except ImportError:
+        class _tlocal(object):
+            def __init__(self):
+                self.__dict__['_tdict'] = {}
+
+            def __delattr__(self, key):
+                try:
+                    del self._tdict[(thread.get_ident(), key)]
+                except KeyError:
+                    raise AttributeError(key)
+
+            def __getattr__(self, key):
+                try:
+                    return self._tdict[(thread.get_ident(), key)]
+                except KeyError:
+                    raise AttributeError(key)
+
+            def __setattr__(self, key, value):
+                self._tdict[(thread.get_ident(), key)] = value
+
+
+__all__  = ["ThreadLocal", "Registry", "WeakValuedRegistry", "SyncDict",
+            "encoded_path", "verify_directory"]
+
+
+def verify_directory(dir):
+    """verifies and creates a directory.  tries to
+    ignore collisions with other threads and processes."""
+
+    tries = 0
+    while not os.access(dir, os.F_OK):
+        try:
+            tries += 1
+            os.makedirs(dir)
+        except:
+            if tries > 5:
+                raise
+
+    
+def deprecated(func, message):
+    def deprecated_method(*args, **kargs):
+        warnings.warn(message, DeprecationWarning, 2)
+        return func(*args, **kargs)
+    try:
+        deprecated_method.__name__ = func.__name__
+    except TypeError: # Python < 2.4
+        pass
+    deprecated_method.__doc__ = "%s\n\n%s" % (message, func.__doc__)
+    return deprecated_method
+
+class ThreadLocal(_tlocal):
+    """stores a value on a per-thread basis"""
+    
+    def put(self, value):
+        self.value = value
+    
+    def has(self):
+        return hasattr(self, 'value')
+            
+    def get(self, default=None):
+        return getattr(self, 'value', default)
+            
+    def remove(self):
+        del self.value
+    
+class SyncDict(object):
+    """
+    An efficient/threadsafe singleton map algorithm, a.k.a.
+    "get a value based on this key, and create if not found or not
+    valid" paradigm:
+    
+        exists && isvalid ? get : create
+
+    Works with weakref dictionaries and the LRUCache to handle items
+    asynchronously disappearing from the dictionary.  
+
+    Use python 2.3.3 or greater !  a major bug was just fixed in Nov.
+    2003 that was driving me nuts with garbage collection/weakrefs in
+    this section.
+
+    """    
+    def __init__(self):
+        self.mutex = _thread.allocate_lock()
+        self.dict = {}
+        
+    def get(self, key, createfunc, *args, **kwargs):
+        try:
+            if self.has_key(key):
+                return self.dict[key]
+            else:
+                return self.sync_get(key, createfunc, *args, **kwargs)
+        except KeyError:
+            return self.sync_get(key, createfunc, *args, **kwargs)
+
+    def sync_get(self, key, createfunc, *args, **kwargs):
+        self.mutex.acquire()
+        try:
+            try:
+                if self.has_key(key):
+                    return self.dict[key]
+                else:
+                    return self._create(key, createfunc, *args, **kwargs)
+            except KeyError:
+                return self._create(key, createfunc, *args, **kwargs)
+        finally:
+            self.mutex.release()
+
+    def _create(self, key, createfunc, *args, **kwargs):
+        self[key] = obj = createfunc(*args, **kwargs)
+        return obj
+
+    def has_key(self, key):
+        return self.dict.has_key(key)
+        
+    def __contains__(self, key):
+        return self.dict.__contains__(key)
+    def __getitem__(self, key):
+        return self.dict.__getitem__(key)
+    def __setitem__(self, key, value):
+        self.dict.__setitem__(key, value)
+    def __delitem__(self, key):
+        return self.dict.__delitem__(key)
+    def clear(self):
+        self.dict.clear()
+
+
+class WeakValuedRegistry(SyncDict):
+    def __init__(self):
+        self.mutex = _threading.RLock()
+        self.dict = weakref.WeakValueDictionary()
+
+            
+def encoded_path(root, identifiers, extension = ".enc", depth = 3,
+                 digest_filenames=True):
+    """Generate a unique file-accessible path from the given list of
+    identifiers starting at the given root directory."""
+    ident = string.join(identifiers, "_")
+
+    if digest_filenames:
+        ident = sha1(ident).hexdigest()
+    
+    ident = os.path.basename(ident)
+
+    tokens = []
+    for d in range(1, depth):
+        tokens.append(ident[0:d])
+    
+    dir = os.path.join(root, *tokens)
+    verify_directory(dir)
+    
+    return os.path.join(dir, ident + extension)
+
+
+def verify_options(opt, types, error):
+    if not isinstance(opt, types):
+        if not isinstance(types, tuple):
+            types = (types,)
+        coerced = False
+        for typ in types:
+            try:
+                if typ in (list, tuple):
+                    opt = [x.strip() for x in opt.split(',')]
+                else:
+                    if typ == bool:
+                        typ = asbool
+                    opt = typ(opt)
+                coerced = True
+            except:
+                pass
+            if coerced:
+                break
+        if not coerced:
+            raise Exception(error)
+    return opt
+
+
+def verify_rules(params, ruleset):
+    for key, types, message in ruleset:
+        if key in params:
+            params[key] = verify_options(params[key], types, message)
+    return params
+
+
+def coerce_session_params(params):
+    rules = [
+        ('data_dir', (str, types.NoneType), "data_dir must be a string "
+         "referring to a directory."),
+        ('lock_dir', (str,), "lock_dir must be a string referring to a "
+         "directory."),
+        ('type', (str, types.NoneType), "Session type must be a string."),
+        ('cookie_expires', (bool, datetime, timedelta), "Cookie expires was "
+         "not a boolean, datetime, or timedelta instance."),
+        ('cookie_domain', (str, types.NoneType), "Cookie domain must be a "
+         "string."),
+        ('id', (str,), "Session id must be a string."),
+        ('key', (str,), "Session key must be a string."),
+        ('secret', (str, types.NoneType), "Session secret must be a string."),
+        ('validate_key', (str, types.NoneType), "Session encrypt_key must be "
+         "a string."),
+        ('encrypt_key', (str, types.NoneType), "Session validate_key must be "
+         "a string."),
+        ('secure', (bool, types.NoneType), "Session secure must be a boolean."),
+        ('timeout', (int, types.NoneType), "Session timeout must be an "
+         "integer."),
+        ('auto', (bool, types.NoneType), "Session is created if accessed."),
+    ]
+    return verify_rules(params, rules)
+
+
+def coerce_cache_params(params):
+    rules = [
+        ('data_dir', (str, types.NoneType), "data_dir must be a string "
+         "referring to a directory."),
+        ('lock_dir', (str,), "lock_dir must be a string referring to a "
+         "directory."),
+        ('type', (str,), "Cache type must be a string."),
+        ('enabled', (bool, types.NoneType), "enabled must be true/false "
+         "if present."),
+        ('expire', (int, types.NoneType), "expire must be an integer representing "
+         "how many seconds the cache is valid for"),
+        ('regions', (list, tuple, types.NoneType), "Regions must be a "
+         "comma seperated list of valid regions")
+    ]
+    return verify_rules(params, rules)
+
+
+def parse_cache_config_options(config, include_defaults=True):
+    """Parse configuration options and validate for use with the
+    CacheManager"""
+    # Load default cache options
+    if include_defaults:
+        options= dict(type='memory', data_dir=None, expire=None, 
+                           log_file=None)
+    else:
+        options = {}
+    for key, val in config.iteritems():
+        if key.startswith('beaker.cache.'):
+            options[key[13:]] = val
+        if key.startswith('cache.'):
+            options[key[6:]] = val
+    coerce_cache_params(options)
+    
+    # Set cache to enabled if not turned off
+    if 'enabled' not in options:
+        options['enabled'] = True
+    
+    # Configure region dict if regions are available
+    regions = options.pop('regions', None)
+    if regions:
+        region_configs = {}
+        for region in regions:
+            # Setup the default cache options
+            region_options = dict(data_dir=options.get('data_dir'),
+                                  lock_dir=options.get('lock_dir'),
+                                  type=options.get('type'),
+                                  enabled=options['enabled'],
+                                  expire=options.get('expire'))
+            region_len = len(region) + 1
+            for key in options.keys():
+                if key.startswith('%s.' % region):
+                    region_options[key[region_len:]] = options.pop(key)
+            coerce_cache_params(region_options)
+            region_configs[region] = region_options
+        options['cache_regions'] = region_configs
+    return options
+
+def func_namespace(func):
+    """Generates a unique namespace for a function"""
+    kls = None
+    if hasattr(func, 'im_func'):
+        kls = func.im_class
+        func = func.im_func
+    
+    if kls:
+        return '%s.%s' % (kls.__module__, kls.__name__)
+    else:
+        return func.__module__
Index: /galaxy-central/eggs/Beaker-1.4-py2.6.egg/beaker/__init__.py
===================================================================
--- /galaxy-central/eggs/Beaker-1.4-py2.6.egg/beaker/__init__.py (revision 3)
+++ /galaxy-central/eggs/Beaker-1.4-py2.6.egg/beaker/__init__.py (revision 3)
@@ -0,0 +1,1 @@
+#
Index: /galaxy-central/eggs/Beaker-1.4-py2.6.egg/beaker/exceptions.py
===================================================================
--- /galaxy-central/eggs/Beaker-1.4-py2.6.egg/beaker/exceptions.py (revision 3)
+++ /galaxy-central/eggs/Beaker-1.4-py2.6.egg/beaker/exceptions.py (revision 3)
@@ -0,0 +1,23 @@
+"""Beaker exception classes"""
+
+class BeakerException(Exception):
+    pass
+
+
+class CreationAbortedError(Exception):
+    """deprecated."""
+
+class InvalidCacheBackendError(BeakerException, ImportError):
+    pass
+
+
+class MissingCacheParameter(BeakerException):
+    pass
+
+
+class LockError(BeakerException):
+    pass
+
+class InvalidCryptoBackendError(BeakerException, ImportError):
+    def __init__(self):
+        Exception.__init__('No supported crypto implementation was found')
Index: /galaxy-central/eggs/Beaker-1.4-py2.6.egg/beaker/synchronization.py
===================================================================
--- /galaxy-central/eggs/Beaker-1.4-py2.6.egg/beaker/synchronization.py (revision 3)
+++ /galaxy-central/eggs/Beaker-1.4-py2.6.egg/beaker/synchronization.py (revision 3)
@@ -0,0 +1,381 @@
+"""Synchronization functions.
+
+File- and mutex-based mutual exclusion synchronizers are provided,
+as well as a name-based mutex which locks within an application
+based on a string name.
+
+"""
+
+import os
+import sys
+import tempfile
+
+try:
+    import threading as _threading
+except ImportError:
+    import dummy_threading as _threading
+
+# check for fcntl module
+try:
+    sys.getwindowsversion()
+    has_flock = False
+except:
+    try:
+        import fcntl
+        has_flock = True
+    except ImportError:
+        has_flock = False
+
+from beaker import util
+from beaker.exceptions import LockError
+
+__all__  = ["file_synchronizer", "mutex_synchronizer", "null_synchronizer",
+            "NameLock", "_threading"]
+
+
+class NameLock(object):
+    """a proxy for an RLock object that is stored in a name based
+    registry.  
+    
+    Multiple threads can get a reference to the same RLock based on the
+    name alone, and synchronize operations related to that name.
+
+    """     
+    locks = util.WeakValuedRegistry()
+
+    class NLContainer(object):
+        def __init__(self, reentrant):
+            if reentrant:
+                self.lock = _threading.RLock()
+            else:
+                self.lock = _threading.Lock()
+        def __call__(self):
+            return self.lock
+
+    def __init__(self, identifier = None, reentrant = False):
+        if identifier is None:
+            self._lock = NameLock.NLContainer(reentrant)
+        else:
+            self._lock = NameLock.locks.get(identifier, NameLock.NLContainer,
+                                            reentrant)
+
+    def acquire(self, wait = True):
+        return self._lock().acquire(wait)
+
+    def release(self):
+        self._lock().release()
+
+
+_synchronizers = util.WeakValuedRegistry()
+def _synchronizer(identifier, cls, **kwargs):
+    return _synchronizers.sync_get((identifier, cls), cls, identifier, **kwargs)
+
+
+def file_synchronizer(identifier, **kwargs):
+    if not has_flock or 'lock_dir' not in kwargs:
+        return mutex_synchronizer(identifier)
+    else:
+        return _synchronizer(identifier, FileSynchronizer, **kwargs)
+
+
+def mutex_synchronizer(identifier, **kwargs):
+    return _synchronizer(identifier, ConditionSynchronizer, **kwargs)
+
+
+class null_synchronizer(object):
+    def acquire_write_lock(self, wait=True):
+        return True
+    def acquire_read_lock(self):
+        pass
+    def release_write_lock(self):
+        pass
+    def release_read_lock(self):
+        pass
+    acquire = acquire_write_lock
+    release = release_write_lock
+
+
+class SynchronizerImpl(object):
+    def __init__(self):
+        self._state = util.ThreadLocal()
+
+    class SyncState(object):
+        __slots__ = 'reentrantcount', 'writing', 'reading'
+
+        def __init__(self):
+            self.reentrantcount = 0
+            self.writing = False
+            self.reading = False
+
+    def state(self):
+        if not self._state.has():
+            state = SynchronizerImpl.SyncState()
+            self._state.put(state)
+            return state
+        else:
+            return self._state.get()
+    state = property(state)
+    
+    def release_read_lock(self):
+        state = self.state
+
+        if state.writing: 
+            raise LockError("lock is in writing state")
+        if not state.reading: 
+            raise LockError("lock is not in reading state")
+        
+        if state.reentrantcount == 1:
+            self.do_release_read_lock()
+            state.reading = False
+
+        state.reentrantcount -= 1
+        
+    def acquire_read_lock(self, wait = True):
+        state = self.state
+
+        if state.writing: 
+            raise LockError("lock is in writing state")
+        
+        if state.reentrantcount == 0:
+            x = self.do_acquire_read_lock(wait)
+            if (wait or x):
+                state.reentrantcount += 1
+                state.reading = True
+            return x
+        elif state.reading:
+            state.reentrantcount += 1
+            return True
+            
+    def release_write_lock(self):
+        state = self.state
+
+        if state.reading: 
+            raise LockError("lock is in reading state")
+        if not state.writing: 
+            raise LockError("lock is not in writing state")
+
+        if state.reentrantcount == 1:
+            self.do_release_write_lock()
+            state.writing = False
+
+        state.reentrantcount -= 1
+    
+    release = release_write_lock
+    
+    def acquire_write_lock(self, wait  = True):
+        state = self.state
+
+        if state.reading: 
+            raise LockError("lock is in reading state")
+        
+        if state.reentrantcount == 0:
+            x = self.do_acquire_write_lock(wait)
+            if (wait or x): 
+                state.reentrantcount += 1
+                state.writing = True
+            return x
+        elif state.writing:
+            state.reentrantcount += 1
+            return True
+
+    acquire = acquire_write_lock
+
+    def do_release_read_lock(self):
+        raise NotImplementedError()
+    
+    def do_acquire_read_lock(self):
+        raise NotImplementedError()
+    
+    def do_release_write_lock(self):
+        raise NotImplementedError()
+    
+    def do_acquire_write_lock(self):
+        raise NotImplementedError()
+
+
+class FileSynchronizer(SynchronizerImpl):
+    """a synchronizer which locks using flock().
+
+    Adapted for Python/multithreads from Apache::Session::Lock::File,
+    http://search.cpan.org/src/CWEST/Apache-Session-1.81/Session/Lock/File.pm
+    
+    This module does not unlink temporary files, 
+    because it interferes with proper locking.  This can cause 
+    problems on certain systems (Linux) whose file systems (ext2) do not 
+    perform well with lots of files in one directory.  To prevent this
+    you should use a script to clean out old files from your lock directory.
+    
+    """
+    def __init__(self, identifier, lock_dir):
+        super(FileSynchronizer, self).__init__()
+        self._filedescriptor = util.ThreadLocal()
+        
+        if lock_dir is None:
+            lock_dir = tempfile.gettempdir()
+        else:
+            lock_dir = lock_dir
+
+        self.filename = util.encoded_path(
+                            lock_dir, 
+                            [identifier], 
+                            extension='.lock'
+                        )
+
+    def _filedesc(self):
+        return self._filedescriptor.get()
+    _filedesc = property(_filedesc)
+        
+    def _open(self, mode):
+        filedescriptor = self._filedesc
+        if filedescriptor is None:
+            filedescriptor = os.open(self.filename, mode)
+            self._filedescriptor.put(filedescriptor)
+        return filedescriptor
+            
+    def do_acquire_read_lock(self, wait):
+        filedescriptor = self._open(os.O_CREAT | os.O_RDONLY)
+        if not wait:
+            try:
+                fcntl.flock(filedescriptor, fcntl.LOCK_SH | fcntl.LOCK_NB)
+                return True
+            except IOError:
+                os.close(filedescriptor)
+                self._filedescriptor.remove()
+                return False
+        else:
+            fcntl.flock(filedescriptor, fcntl.LOCK_SH)
+            return True
+
+    def do_acquire_write_lock(self, wait):
+        filedescriptor = self._open(os.O_CREAT | os.O_WRONLY)
+        if not wait:
+            try:
+                fcntl.flock(filedescriptor, fcntl.LOCK_EX | fcntl.LOCK_NB)
+                return True
+            except IOError:
+                os.close(filedescriptor)
+                self._filedescriptor.remove()
+                return False
+        else:
+            fcntl.flock(filedescriptor, fcntl.LOCK_EX)
+            return True
+    
+    def do_release_read_lock(self):
+        self._release_all_locks()
+    
+    def do_release_write_lock(self):
+        self._release_all_locks()
+    
+    def _release_all_locks(self):
+        filedescriptor = self._filedesc
+        if filedescriptor is not None:
+            fcntl.flock(filedescriptor, fcntl.LOCK_UN)
+            os.close(filedescriptor)
+            self._filedescriptor.remove()
+
+
+class ConditionSynchronizer(SynchronizerImpl):
+    """a synchronizer using a Condition."""
+    
+    def __init__(self, identifier):
+        super(ConditionSynchronizer, self).__init__()
+
+        # counts how many asynchronous methods are executing
+        self.async = 0
+
+        # pointer to thread that is the current sync operation
+        self.current_sync_operation = None
+
+        # condition object to lock on
+        self.condition = _threading.Condition(_threading.Lock())
+
+    def do_acquire_read_lock(self, wait = True):    
+        self.condition.acquire()
+        try:
+            # see if a synchronous operation is waiting to start
+            # or is already running, in which case we wait (or just
+            # give up and return)
+            if wait:
+                while self.current_sync_operation is not None:
+                    self.condition.wait()
+            else:
+                if self.current_sync_operation is not None:
+                    return False
+
+            self.async += 1
+        finally:
+            self.condition.release()
+
+        if not wait: 
+            return True
+        
+    def do_release_read_lock(self):
+        self.condition.acquire()
+        try:
+            self.async -= 1
+        
+            # check if we are the last asynchronous reader thread 
+            # out the door.
+            if self.async == 0:
+                # yes. so if a sync operation is waiting, notifyAll to wake
+                # it up
+                if self.current_sync_operation is not None:
+                    self.condition.notifyAll()
+            elif self.async < 0:
+                raise LockError("Synchronizer error - too many "
+                                "release_read_locks called")
+        finally:
+            self.condition.release()
+    
+    def do_acquire_write_lock(self, wait = True):
+        self.condition.acquire()
+        try:
+            # here, we are not a synchronous reader, and after returning,
+            # assuming waiting or immediate availability, we will be.
+        
+            if wait:
+                # if another sync is working, wait
+                while self.current_sync_operation is not None:
+                    self.condition.wait()
+            else:
+                # if another sync is working,
+                # we dont want to wait, so forget it
+                if self.current_sync_operation is not None:
+                    return False
+            
+            # establish ourselves as the current sync 
+            # this indicates to other read/write operations
+            # that they should wait until this is None again
+            self.current_sync_operation = _threading.currentThread()
+
+            # now wait again for asyncs to finish
+            if self.async > 0:
+                if wait:
+                    # wait
+                    self.condition.wait()
+                else:
+                    # we dont want to wait, so forget it
+                    self.current_sync_operation = None
+                    return False
+        finally:
+            self.condition.release()
+        
+        if not wait: 
+            return True
+
+    def do_release_write_lock(self):
+        self.condition.acquire()
+        try:
+            if self.current_sync_operation is not _threading.currentThread():
+                raise LockError("Synchronizer error - current thread doesnt "
+                                "have the write lock")
+
+            # reset the current sync operation so 
+            # another can get it
+            self.current_sync_operation = None
+
+            # tell everyone to get ready
+            self.condition.notifyAll()
+        finally:
+            # everyone go !!
+            self.condition.release()
Index: /galaxy-central/eggs/Beaker-1.4-py2.6.egg/beaker/container.py
===================================================================
--- /galaxy-central/eggs/Beaker-1.4-py2.6.egg/beaker/container.py (revision 3)
+++ /galaxy-central/eggs/Beaker-1.4-py2.6.egg/beaker/container.py (revision 3)
@@ -0,0 +1,595 @@
+"""Container and Namespace classes"""
+import anydbm
+import cPickle
+import logging
+import os.path
+import time
+
+import beaker.util as util
+from beaker.exceptions import CreationAbortedError, MissingCacheParameter
+from beaker.synchronization import _threading, file_synchronizer, \
+     mutex_synchronizer, NameLock, null_synchronizer
+
+__all__ = ['Value', 'Container', 'ContainerContext',
+           'MemoryContainer', 'DBMContainer', 'NamespaceManager',
+           'MemoryNamespaceManager', 'DBMNamespaceManager', 'FileContainer',
+           'OpenResourceNamespaceManager',
+           'FileNamespaceManager', 'CreationAbortedError']
+
+
+logger = logging.getLogger('beaker.container')
+if logger.isEnabledFor(logging.DEBUG):
+    debug = logger.debug
+else:
+    def debug(message, *args):
+        pass
+
+
+class NamespaceManager(object):
+    """Handles dictionary operations and locking for a namespace of
+    values.
+    
+    The implementation for setting and retrieving the namespace data is
+    handled by subclasses.
+    
+    NamespaceManager may be used alone, or may be privately accessed by
+    one or more Container objects.  Container objects provide per-key
+    services like expiration times and automatic recreation of values.
+    
+    Multiple NamespaceManagers created with a particular name will all
+    share access to the same underlying datasource and will attempt to
+    synchronize against a common mutex object.  The scope of this
+    sharing may be within a single process or across multiple
+    processes, depending on the type of NamespaceManager used.
+    
+    The NamespaceManager itself is generally threadsafe, except in the
+    case of the DBMNamespaceManager in conjunction with the gdbm dbm
+    implementation.
+
+    """
+    def __init__(self, namespace):
+        self.namespace = namespace
+        
+    def get_creation_lock(self, key):
+        raise NotImplementedError()
+
+    def do_remove(self):
+        raise NotImplementedError()
+
+    def acquire_read_lock(self):
+        pass
+
+    def release_read_lock(self):
+        pass
+
+    def acquire_write_lock(self, wait=True):
+        return True
+
+    def release_write_lock(self):
+        pass
+
+    def has_key(self, key):
+        return self.__contains__(key)
+
+    def __getitem__(self, key):
+        raise NotImplementedError()
+        
+    def __setitem__(self, key, value):
+        raise NotImplementedError()
+    
+    def set_value(self, key, value, expiretime=None):
+        """Optional set_value() method called by Value.
+        
+        Allows an expiretime to be passed, for namespace
+        implementations which can prune their collections
+        using expiretime.
+        
+        """
+        self[key] = value
+        
+    def __contains__(self, key):
+        raise NotImplementedError()
+
+    def __delitem__(self, key):
+        raise NotImplementedError()
+    
+    def keys(self):
+        raise NotImplementedError()
+    
+    def remove(self):
+        self.do_remove()
+        
+
+class OpenResourceNamespaceManager(NamespaceManager):
+    """A NamespaceManager where read/write operations require opening/
+    closing of a resource which is possibly mutexed.
+    
+    """
+    def __init__(self, namespace):
+        NamespaceManager.__init__(self, namespace)
+        self.access_lock = self.get_access_lock()
+        self.openers = 0
+        self.mutex = _threading.Lock()
+
+    def get_access_lock(self):
+        raise NotImplementedError()
+
+    def do_open(self, flags): 
+        raise NotImplementedError()
+
+    def do_close(self): 
+        raise NotImplementedError()
+
+    def acquire_read_lock(self): 
+        self.access_lock.acquire_read_lock()
+        try:
+            self.open('r', checkcount = True)
+        except:
+            self.access_lock.release_read_lock()
+            raise
+            
+    def release_read_lock(self):
+        try:
+            self.close(checkcount = True)
+        finally:
+            self.access_lock.release_read_lock()
+        
+    def acquire_write_lock(self, wait=True): 
+        r = self.access_lock.acquire_write_lock(wait)
+        try:
+            if (wait or r): 
+                self.open('c', checkcount = True)
+            return r
+        except:
+            self.access_lock.release_write_lock()
+            raise
+            
+    def release_write_lock(self): 
+        try:
+            self.close(checkcount=True)
+        finally:
+            self.access_lock.release_write_lock()
+
+    def open(self, flags, checkcount=False):
+        self.mutex.acquire()
+        try:
+            if checkcount:
+                if self.openers == 0: 
+                    self.do_open(flags)
+                self.openers += 1
+            else:
+                self.do_open(flags)
+                self.openers = 1
+        finally:
+            self.mutex.release()
+
+    def close(self, checkcount=False):
+        self.mutex.acquire()
+        try:
+            if checkcount:
+                self.openers -= 1
+                if self.openers == 0: 
+                    self.do_close()
+            else:
+                if self.openers > 0:
+                    self.do_close()
+                self.openers = 0
+        finally:
+            self.mutex.release()
+
+    def remove(self):
+        self.access_lock.acquire_write_lock()
+        try:
+            self.close(checkcount=False)
+            self.do_remove()
+        finally:
+            self.access_lock.release_write_lock()
+
+class Value(object):
+    __slots__ = 'key', 'createfunc', 'expiretime', 'expire_argument', 'starttime', 'storedtime',\
+                'namespace'
+
+    def __init__(self, key, namespace, createfunc=None, expiretime=None, starttime=None):
+        self.key = key
+        self.createfunc = createfunc
+        self.expire_argument = expiretime
+        self.starttime = starttime
+        self.storedtime = -1
+        self.namespace = namespace
+
+    def has_value(self):
+        """return true if the container has a value stored.
+
+        This is regardless of it being expired or not.
+
+        """
+        self.namespace.acquire_read_lock()
+        try:    
+            return self.namespace.has_key(self.key)
+        finally:
+            self.namespace.release_read_lock()
+
+    def can_have_value(self):
+        return self.has_current_value() or self.createfunc is not None  
+
+    def has_current_value(self):
+        self.namespace.acquire_read_lock()
+        try:    
+            has_value = self.namespace.has_key(self.key)
+            if has_value:
+                value = self.__get_value()
+                return not self._is_expired()
+            else:
+                return False
+        finally:
+            self.namespace.release_read_lock()
+
+    def _is_expired(self):
+        """Return true if this container's value is expired.
+        
+        Note that this method is only correct if has_current_value()
+        or get_value() have been called already.
+        
+        """
+        return (
+            (
+                self.starttime is not None and
+                self.storedtime < self.starttime
+            )
+            or
+            (
+                self.expiretime is not None and
+                time.time() >= self.expiretime + self.storedtime
+            )
+        )
+
+    def get_value(self):
+        self.namespace.acquire_read_lock()
+        try:
+            has_value = self.has_value()
+            if has_value:
+                try:
+                    value = self.__get_value()
+                    if not self._is_expired():
+                        return value
+                except KeyError:
+                    # guard against un-mutexed backends raising KeyError
+                    pass
+                    
+            if not self.createfunc:
+                raise KeyError(self.key)
+        finally:
+            self.namespace.release_read_lock()
+
+        has_createlock = False
+        creation_lock = self.namespace.get_creation_lock(self.key)
+        if has_value:
+            if not creation_lock.acquire(wait=False):
+                debug("get_value returning old value while new one is created")
+                return value
+            else:
+                debug("lock_creatfunc (didnt wait)")
+                has_createlock = True
+
+        if not has_createlock:
+            debug("lock_createfunc (waiting)")
+            creation_lock.acquire()
+            debug("lock_createfunc (waited)")
+
+        try:
+            # see if someone created the value already
+            self.namespace.acquire_read_lock()
+            try:
+                if self.has_value():
+                    try:
+                        value = self.__get_value()
+                        if not self._is_expired():
+                            return value
+                    except KeyError:
+                        # guard against un-mutexed backends raising KeyError
+                        pass
+            finally:
+                self.namespace.release_read_lock()
+
+            debug("get_value creating new value")
+            v = self.createfunc()
+            self.set_value(v)
+            return v
+        finally:
+            creation_lock.release()
+            debug("released create lock")
+
+    def __get_value(self):
+        value = self.namespace[self.key]
+        try:
+            self.storedtime, self.expiretime, value = value
+        except ValueError:
+            if not len(value) == 2:
+                raise
+            # Old format: upgrade
+            self.storedtime, value = value
+            self.expiretime = self.expire_argument = None
+            debug("get_value upgrading time %r expire time %r", self.storedtime, self.expire_argument)
+            self.namespace.release_read_lock()
+            self.set_value(value)
+            self.namespace.acquire_read_lock()
+        return value
+
+    def set_value(self, value):
+        self.namespace.acquire_write_lock()
+        try:
+            self.storedtime = time.time()
+            debug("set_value stored time %r expire time %r", self.storedtime, self.expire_argument)
+            self.namespace.set_value(self.key, (self.storedtime, self.expire_argument, value))
+        finally:
+            self.namespace.release_write_lock()
+
+    def clear_value(self):
+        self.namespace.acquire_write_lock()
+        try:
+            debug("clear_value")
+            if self.namespace.has_key(self.key):
+                try:
+                    del self.namespace[self.key]
+                except KeyError:
+                    # guard against un-mutexed backends raising KeyError
+                    pass
+            self.storedtime = -1
+        finally:
+            self.namespace.release_write_lock()
+
+
+class MemoryNamespaceManager(NamespaceManager):
+    namespaces = util.SyncDict()
+
+    def __init__(self, namespace, **kwargs):
+        NamespaceManager.__init__(self, namespace)
+        self.dictionary = MemoryNamespaceManager.namespaces.get(self.namespace,
+                                                                dict)
+    def get_creation_lock(self, key):
+        return NameLock(
+            identifier="memorycontainer/funclock/%s/%s" % (self.namespace, key),
+            reentrant=True
+        )
+
+    def __getitem__(self, key): 
+        return self.dictionary[key]
+
+    def __contains__(self, key): 
+        return self.dictionary.__contains__(key)
+
+    def has_key(self, key): 
+        return self.dictionary.__contains__(key)
+        
+    def __setitem__(self, key, value):
+        self.dictionary[key] = value
+    
+    def __delitem__(self, key):
+        del self.dictionary[key]
+
+    def do_remove(self):
+        self.dictionary.clear()
+        
+    def keys(self):
+        return self.dictionary.keys()
+
+
+class DBMNamespaceManager(OpenResourceNamespaceManager):
+    def __init__(self, namespace, dbmmodule=None, data_dir=None, 
+            dbm_dir=None, lock_dir=None, digest_filenames=True, **kwargs):
+        self.digest_filenames = digest_filenames
+        
+        if not dbm_dir and not data_dir:
+            raise MissingCacheParameter("data_dir or dbm_dir is required")
+        elif dbm_dir:
+            self.dbm_dir = dbm_dir
+        else:
+            self.dbm_dir = data_dir + "/container_dbm"
+        util.verify_directory(self.dbm_dir)
+        
+        if not lock_dir and not data_dir:
+            raise MissingCacheParameter("data_dir or lock_dir is required")
+        elif lock_dir:
+            self.lock_dir = lock_dir
+        else:
+            self.lock_dir = data_dir + "/container_dbm_lock"
+        util.verify_directory(self.lock_dir)
+
+        self.dbmmodule = dbmmodule or anydbm
+
+        self.dbm = None
+        OpenResourceNamespaceManager.__init__(self, namespace)
+
+        self.file = util.encoded_path(root= self.dbm_dir,
+                                      identifiers=[self.namespace],
+                                      extension='.dbm',
+                                      digest_filenames=self.digest_filenames)
+        
+        debug("data file %s", self.file)
+        self._checkfile()
+
+    def get_access_lock(self):
+        return file_synchronizer(identifier=self.namespace,
+                                 lock_dir=self.lock_dir)
+                                 
+    def get_creation_lock(self, key):
+        return file_synchronizer(
+                    identifier = "dbmcontainer/funclock/%s" % self.namespace, 
+                    lock_dir=self.lock_dir
+                )
+
+    def file_exists(self, file):
+        if os.access(file, os.F_OK): 
+            return True
+        else:
+            for ext in ('db', 'dat', 'pag', 'dir'):
+                if os.access(file + os.extsep + ext, os.F_OK):
+                    return True
+                    
+        return False
+    
+    def _checkfile(self):
+        if not self.file_exists(self.file):
+            g = self.dbmmodule.open(self.file, 'c') 
+            g.close()
+                
+    def get_filenames(self):
+        list = []
+        if os.access(self.file, os.F_OK):
+            list.append(self.file)
+            
+        for ext in ('pag', 'dir', 'db', 'dat'):
+            if os.access(self.file + os.extsep + ext, os.F_OK):
+                list.append(self.file + os.extsep + ext)
+        return list
+
+    def do_open(self, flags):
+        debug("opening dbm file %s", self.file)
+        try:
+            self.dbm = self.dbmmodule.open(self.file, flags)
+        except:
+            self._checkfile()
+            self.dbm = self.dbmmodule.open(self.file, flags)
+
+    def do_close(self):
+        if self.dbm is not None:
+            debug("closing dbm file %s", self.file)
+            self.dbm.close()
+        
+    def do_remove(self):
+        for f in self.get_filenames():
+            os.remove(f)
+        
+    def __getitem__(self, key): 
+        return cPickle.loads(self.dbm[key])
+
+    def __contains__(self, key): 
+        return self.dbm.has_key(key)
+        
+    def __setitem__(self, key, value):
+        self.dbm[key] = cPickle.dumps(value)
+
+    def __delitem__(self, key):
+        del self.dbm[key]
+
+    def keys(self):
+        return self.dbm.keys()
+
+
+class FileNamespaceManager(OpenResourceNamespaceManager):
+    def __init__(self, namespace, data_dir=None, file_dir=None, lock_dir=None,
+                 digest_filenames=True, **kwargs):
+        self.digest_filenames = digest_filenames
+        
+        if not file_dir and not data_dir:
+            raise MissingCacheParameter("data_dir or file_dir is required")
+        elif file_dir:
+            self.file_dir = file_dir
+        else:
+            self.file_dir = data_dir + "/container_file"
+        util.verify_directory(self.file_dir)
+
+        if not lock_dir and not data_dir:
+            raise MissingCacheParameter("data_dir or lock_dir is required")
+        elif lock_dir:
+            self.lock_dir = lock_dir
+        else:
+            self.lock_dir = data_dir + "/container_file_lock"
+        util.verify_directory(self.lock_dir)
+        OpenResourceNamespaceManager.__init__(self, namespace)
+
+        self.file = util.encoded_path(root=self.file_dir, 
+                                      identifiers=[self.namespace],
+                                      extension='.cache',
+                                      digest_filenames=self.digest_filenames)
+        self.hash = {}
+        
+        debug("data file %s", self.file)
+
+    def get_access_lock(self):
+        return file_synchronizer(identifier=self.namespace,
+                                 lock_dir=self.lock_dir)
+                                 
+    def get_creation_lock(self, key):
+        return file_synchronizer(
+                identifier = "filecontainer/funclock/%s" % self.namespace, 
+                lock_dir = self.lock_dir
+                )
+        
+    def file_exists(self, file):
+        return os.access(file, os.F_OK)
+
+    def do_open(self, flags):
+        if self.file_exists(self.file):
+            fh = open(self.file, 'rb')
+            try:
+                self.hash = cPickle.load(fh)
+            except (IOError, OSError, EOFError, cPickle.PickleError, ValueError):
+                pass
+            fh.close()
+
+        self.flags = flags
+        
+    def do_close(self):
+        if self.flags == 'c' or self.flags == 'w':
+            fh = open(self.file, 'wb')
+            cPickle.dump(self.hash, fh)
+            fh.close()
+
+        self.hash = {}
+        self.flags = None
+                
+    def do_remove(self):
+        os.remove(self.file)
+        self.hash = {}
+        
+    def __getitem__(self, key): 
+        return self.hash[key]
+
+    def __contains__(self, key): 
+        return self.hash.has_key(key)
+        
+    def __setitem__(self, key, value):
+        self.hash[key] = value
+
+    def __delitem__(self, key):
+        del self.hash[key]
+
+    def keys(self):
+        return self.hash.keys()
+
+
+#### legacy stuff to support the old "Container" class interface
+
+namespace_classes = {}
+
+ContainerContext = dict
+    
+class ContainerMeta(type):
+    def __init__(cls, classname, bases, dict_):
+        namespace_classes[cls] = cls.namespace_class
+        return type.__init__(cls, classname, bases, dict_)
+    def __call__(self, key, context, namespace, createfunc=None,
+                 expiretime=None, starttime=None, **kwargs):
+        if namespace in context:
+            ns = context[namespace]
+        else:
+            nscls = namespace_classes[self]
+            context[namespace] = ns = nscls(namespace, **kwargs)
+        return Value(key, ns, createfunc=createfunc,
+                     expiretime=expiretime, starttime=starttime)
+
+class Container(object):
+    __metaclass__ = ContainerMeta
+    namespace_class = NamespaceManager
+
+class FileContainer(Container):
+    namespace_class = FileNamespaceManager
+
+class MemoryContainer(Container):
+    namespace_class = MemoryNamespaceManager
+
+class DBMContainer(Container):
+    namespace_class = DBMNamespaceManager
+
+DbmContainer = DBMContainer
Index: /galaxy-central/eggs/Beaker-1.4-py2.6.egg/beaker/cache.py
===================================================================
--- /galaxy-central/eggs/Beaker-1.4-py2.6.egg/beaker/cache.py (revision 3)
+++ /galaxy-central/eggs/Beaker-1.4-py2.6.egg/beaker/cache.py (revision 3)
@@ -0,0 +1,289 @@
+"""Cache object
+
+The Cache object is used to manage a set of cache files and their
+associated backend. The backends can be rotated on the fly by
+specifying an alternate type when used.
+
+Advanced users can add new backends in beaker.backends
+
+"""
+import pkg_resources
+import warnings
+
+import beaker.container as container
+import beaker.util as util
+from beaker.exceptions import BeakerException, InvalidCacheBackendError
+
+# Initialize the basic available backends
+clsmap = {
+          'memory':container.MemoryNamespaceManager,
+          'dbm':container.DBMNamespaceManager,
+          'file':container.FileNamespaceManager,
+          }
+
+
+# Load up the additional entry point defined backends
+for entry_point in pkg_resources.iter_entry_points('beaker.backends'):
+    try:
+        NamespaceManager = entry_point.load()
+        name = entry_point.name
+        if name in clsmap:
+            raise BeakerException("NamespaceManager name conflict,'%s' "
+                                  "already loaded" % name)
+        clsmap[name] = NamespaceManager
+    except (InvalidCacheBackendError, SyntaxError):
+        # Ignore invalid backends
+        pass
+    except:
+        import sys
+        from pkg_resources import DistributionNotFound
+        # Warn when there's a problem loading a NamespaceManager
+        if not isinstance(sys.exc_info()[1], DistributionNotFound):
+            import traceback
+            from StringIO import StringIO
+            tb = StringIO()
+            traceback.print_exc(file=tb)
+            warnings.warn("Unable to load NamespaceManager entry point: '%s': "
+                          "%s" % (entry_point, tb.getvalue()), RuntimeWarning,
+                          2)
+
+
+# Load legacy-style backends
+try:
+    import beaker.ext.memcached as memcached
+    clsmap['ext:memcached'] = memcached.MemcachedNamespaceManager
+except InvalidCacheBackendError, e:
+    clsmap['ext:memcached'] = e
+
+try:
+    import beaker.ext.database as database
+    clsmap['ext:database'] = database.DatabaseNamespaceManager
+except InvalidCacheBackendError, e:
+    clsmap['ext:database'] = e
+
+try:
+    import beaker.ext.sqla as sqla
+    clsmap['ext:sqla'] = sqla.SqlaNamespaceManager
+except InvalidCacheBackendError, e:
+    clsmap['ext:sqla'] = e
+
+try:
+    import beaker.ext.google as google
+    clsmap['ext:google'] = google.GoogleNamespaceManager
+except (InvalidCacheBackendError, SyntaxError), e:
+    clsmap['ext:google'] = e
+
+
+class Cache(object):
+    """Front-end to the containment API implementing a data cache.
+
+    ``namespace``
+        the namespace of this Cache
+
+    ``type``
+        type of cache to use
+
+    ``expire``
+        seconds to keep cached data
+
+    ``expiretime``
+        seconds to keep cached data (legacy support)
+
+    ``starttime``
+        time when cache was cache was
+    """
+    def __init__(self, namespace, type='memory', expiretime=None,
+                 starttime=None, expire=None, **nsargs):
+        try:
+            cls = clsmap[type]
+            if isinstance(cls, InvalidCacheBackendError):
+                raise cls
+        except KeyError:
+            raise TypeError("Unknown cache implementation %r" % type)
+            
+        self.namespace = cls(namespace, **nsargs)
+        self.expiretime = expiretime or expire
+        self.starttime = starttime
+        self.nsargs = nsargs
+        
+    def put(self, key, value, **kw):
+        self._get_value(key, **kw).set_value(value)
+    set_value = put
+    
+    def get(self, key, **kw):
+        """Retrieve a cached value from the container"""
+        return self._get_value(key, **kw).get_value()
+    get_value = get
+    
+    def remove_value(self, key, **kw):
+        mycontainer = self._get_value(key, **kw)
+        if mycontainer.has_current_value():
+            mycontainer.clear_value()
+    remove = remove_value
+
+    def _get_value(self, key, **kw):
+        if isinstance(key, unicode):
+            key = key.encode('ascii', 'backslashreplace')
+
+        if 'type' in kw:
+            return self._legacy_get_value(key, **kw)
+
+        kw.setdefault('expiretime', self.expiretime)
+        kw.setdefault('starttime', self.starttime)
+        
+        return container.Value(key, self.namespace, **kw)
+    
+    def _legacy_get_value(self, key, type, **kw):
+        expiretime = kw.pop('expiretime', self.expiretime)
+        starttime = kw.pop('starttime', None)
+        createfunc = kw.pop('createfunc', None)
+        kwargs = self.nsargs.copy()
+        kwargs.update(kw)
+        c = Cache(self.namespace.namespace, type=type, **kwargs)
+        return c._get_value(key, expiretime=expiretime, createfunc=createfunc, 
+                            starttime=starttime)
+    _legacy_get_value = util.deprecated(_legacy_get_value, "Specifying a "
+        "'type' and other namespace configuration with cache.get()/put()/etc. "
+        "is deprecated. Specify 'type' and other namespace configuration to "
+        "cache_manager.get_cache() and/or the Cache constructor instead.")
+    
+    def clear(self):
+        """Clear all the values from the namespace"""
+        self.namespace.remove()
+    
+    # dict interface
+    def __getitem__(self, key):
+        return self.get(key)
+    
+    def __contains__(self, key):
+        return self._get_value(key).has_current_value()
+    
+    def has_key(self, key):
+        return key in self
+    
+    def __delitem__(self, key):
+        self.remove_value(key)
+    
+    def __setitem__(self, key, value):
+        self.put(key, value)
+
+
+class CacheManager(object):
+    def __init__(self, **kwargs):
+        """Initialize a CacheManager object with a set of options
+        
+        Options should be parsed with the
+        :func:`~beaker.util.parse_cache_config_options` function to
+        ensure only valid options are used.
+        
+        """
+        self.kwargs = kwargs
+        self.caches = {}
+        self.regions = kwargs.pop('cache_regions', {})
+    
+    def get_cache(self, name, **kwargs):
+        kw = self.kwargs.copy()
+        kw.update(kwargs)
+        return self.caches.setdefault(name + str(kw), Cache(name, **kw))
+    
+    def get_cache_region(self, name, region):
+        if region not in self.regions:
+            raise BeakerException('Cache region not configured: %s' % region)
+        kw = self.regions[region]
+        return self.caches.setdefault(name + str(kw), Cache(name, **kw))
+    
+    def region(self, region, *args):
+        """Decorate a function to cache itself using a cache region
+        
+        The region decorator requires arguments if there are more than
+        2 of the same named function, in the same module. This is
+        because the namespace used for the functions cache is based on
+        the functions name and the module.
+        
+        
+        Example::
+            
+            # Assuming a cache object is available like:
+            cache = CacheManager(dict_of_config_options)
+            
+            
+            def populate_things():
+                
+                @cache.region('short_term', 'some_data')
+                def load(search_term, limit, offset):
+                    return load_the_data(search_term, limit, offset)
+                
+                return load('rabbits', 20, 0)
+        
+        .. note::
+            
+            The function being decorated must only be called with
+            positional arguments.
+        
+        """
+        cache = [None]
+        key = " ".join(str(x) for x in args)
+        
+        def decorate(func):
+            def cached(*args):
+                reg = self.regions[region]
+                if not reg.get('enabled', True):
+                    return func(*args)
+                
+                if not cache[0]:
+                    namespace = util.func_namespace(func)
+                    cache[0] = self.get_cache_region(namespace, region)
+                
+                cache_key = key + " " + " ".join(str(x) for x in args)
+                def go():
+                    return func(*args)
+                
+                return cache[0].get_value(cache_key, createfunc=go)
+            return cached
+        return decorate
+
+    def cache(self, *args, **kwargs):
+        """Decorate a function to cache itself with supplied parameters
+
+        ``args`` 
+            used to make the key unique for this function, as in region()
+            above.
+
+        ``kwargs``
+            parameters to be passed to get_cache(), will override defaults
+
+        Example::
+
+            # Assuming a cache object is available like:
+            cache = CacheManager(dict_of_config_options)
+            
+            
+            def populate_things():
+                
+                @cache.cache('mycache', expire=15)
+                def load(search_term, limit, offset):
+                    return load_the_data(search_term, limit, offset)
+                
+                return load('rabbits', 20, 0)
+        
+        .. note::
+            
+            The function being decorated must only be called with
+            positional arguments. 
+
+        """
+        cache = [None]
+        key = " ".join(str(x) for x in args)
+        
+        def decorate(func):
+            def cached(*args):
+                if not cache[0]:
+                    namespace = util.func_namespace(func)
+                    cache[0] = self.get_cache(namespace, **kwargs)
+                cache_key = key + " " + " ".join(str(x) for x in args)
+                def go():
+                    return func(*args)
+
+                return cache[0].get_value(cache_key, createfunc=go)
+            return cached
+        return decorate
Index: /galaxy-central/eggs/Beaker-1.4-py2.6.egg/beaker/session.py
===================================================================
--- /galaxy-central/eggs/Beaker-1.4-py2.6.egg/beaker/session.py (revision 3)
+++ /galaxy-central/eggs/Beaker-1.4-py2.6.egg/beaker/session.py (revision 3)
@@ -0,0 +1,608 @@
+import cPickle
+import Cookie
+import hmac
+import os
+import random
+import time
+from datetime import datetime, timedelta
+try:
+    from hashlib import md5
+except ImportError:
+    from md5 import md5
+try:
+    # Use PyCrypto (if available)
+    from Crypto.Hash import HMAC, SHA as SHA1
+
+except ImportError:
+    # PyCrypto not available.  Use the Python standard library.
+    import hmac as HMAC
+    import sys
+    # When using the stdlib, we have to make sure the hmac version and sha
+    # version are compatible
+    if sys.version_info[0:2] <= (2,4):
+        # hmac in python2.4 or less require the sha module
+        import sha as SHA1
+    else:
+        # NOTE: We have to use the callable with hashlib (hashlib.sha1),
+        # otherwise hmac only accepts the sha module object itself
+        from hashlib import sha1 as SHA1
+
+# Check for pycryptopp encryption for AES
+try:
+    from beaker.crypto import generateCryptoKeys, aesEncrypt
+    crypto_ok = True
+except:
+    crypto_ok = False
+
+from beaker.cache import clsmap
+from beaker.exceptions import BeakerException
+from beaker.util import b64decode, b64encode, Set
+
+__all__ = ['SignedCookie', 'Session']
+
+getpid = hasattr(os, 'getpid') and os.getpid or (lambda : '')
+
+class SignedCookie(Cookie.BaseCookie):
+    """Extends python cookie to give digital signature support"""
+    def __init__(self, secret, input=None):
+        self.secret = secret
+        Cookie.BaseCookie.__init__(self, input)
+    
+    def value_decode(self, val):
+        val = val.strip('"')
+        sig = HMAC.new(self.secret, val[40:], SHA1).hexdigest()
+        if sig != val[:40]:
+            return None, val
+        else:
+            return val[40:], val
+    
+    def value_encode(self, val):
+        sig = HMAC.new(self.secret, val, SHA1).hexdigest()
+        return str(val), ("%s%s" % (sig, val))
+
+
+class Session(dict):
+    """Session object that uses container package for storage"""
+    def __init__(self, request, id=None, invalidate_corrupt=False,
+                 use_cookies=True, type=None, data_dir=None,
+                 key='beaker.session.id', timeout=None, cookie_expires=True,
+                 cookie_domain=None, secret=None, secure=False,
+                 namespace_class=None, **namespace_args):
+        if not type:
+            if data_dir:
+                self.type = 'file'
+            else:
+                self.type = 'memory'
+        else:
+            self.type = type
+
+        self.namespace_class = namespace_class or clsmap[self.type]
+
+        self.namespace_args = namespace_args
+        
+        self.request = request
+        self.data_dir = data_dir
+        self.key = key
+        
+        self.timeout = timeout
+        self.use_cookies = use_cookies
+        self.cookie_expires = cookie_expires
+        
+        # Default cookie domain/path
+        self._domain = cookie_domain
+        self._path = '/'
+        self.was_invalidated = False
+        self.secret = secret
+        self.secure = secure
+        self.id = id
+        self.accessed_dict = {}
+        
+        if self.use_cookies:
+            cookieheader = request.get('cookie', '')
+            if secret:
+                try:
+                    self.cookie = SignedCookie(secret, input=cookieheader)
+                except Cookie.CookieError:
+                    self.cookie = SignedCookie(secret, input=None)
+            else:
+                self.cookie = Cookie.SimpleCookie(input=cookieheader)
+            
+            if not self.id and self.key in self.cookie:
+                self.id = self.cookie[self.key].value
+        
+        self.is_new = self.id is None
+        if self.is_new:
+            self._create_id()
+            self['_accessed_time'] = self['_creation_time'] = time.time()
+        else:
+            try:
+                self.load()
+            except:
+                if invalidate_corrupt:
+                    self.invalidate()
+                else:
+                    raise
+        
+    def _create_id(self):
+        self.id = md5(
+            md5("%f%s%f%s" % (time.time(), id({}), random.random(),
+                              getpid())).hexdigest(), 
+        ).hexdigest()
+        self.is_new = True
+        self.last_accessed = None
+        if self.use_cookies:
+            self.cookie[self.key] = self.id
+            if self._domain:
+                self.cookie[self.key]['domain'] = self._domain
+            if self.secure:
+                self.cookie[self.key]['secure'] = True
+            self.cookie[self.key]['path'] = self._path
+            if self.cookie_expires is not True:
+                if self.cookie_expires is False:
+                    expires = datetime.fromtimestamp( 0x7FFFFFFF )
+                elif isinstance(self.cookie_expires, timedelta):
+                    expires = datetime.today() + self.cookie_expires
+                elif isinstance(self.cookie_expires, datetime):
+                    expires = self.cookie_expires
+                else:
+                    raise ValueError("Invalid argument for cookie_expires: %s"
+                                     % repr(self.cookie_expires))
+                self.cookie[self.key]['expires'] = \
+                    expires.strftime("%a, %d-%b-%Y %H:%M:%S GMT" )
+            self.request['cookie_out'] = self.cookie[self.key].output(header='')
+            self.request['set_cookie'] = False
+    
+    def created(self):
+        return self['_creation_time']
+    created = property(created)
+    
+    def _set_domain(self, domain):
+        self['_domain'] = domain
+        self.cookie[self.key]['domain'] = domain
+        self.request['cookie_out'] = self.cookie[self.key].output(header='')
+        self.request['set_cookie'] = True
+    
+    def _get_domain(self, domain):
+        return self._domain
+    
+    domain = property(_get_domain, _set_domain)
+    
+    def _set_path(self, path):
+        self['_path'] = path
+        self.cookie[self.key]['path'] = path
+        self.request['cookie_out'] = self.cookie[self.key].output(header='')
+        self.request['set_cookie'] = True
+    
+    def _get_domain(self, domain):
+        return self._domain
+    
+    domain = property(_get_domain, _set_domain)
+
+    def _delete_cookie(self):
+        self.request['set_cookie'] = True
+        self.cookie[self.key] = self.id
+        if self._domain:
+            self.cookie[self.key]['domain'] = self._domain
+        if self.secure:
+            self.cookie[self.key]['secure'] = True
+        self.cookie[self.key]['path'] = '/'
+        expires = datetime.today().replace(year=2003)
+        self.cookie[self.key]['expires'] = \
+            expires.strftime("%a, %d-%b-%Y %H:%M:%S GMT" )
+        self.request['cookie_out'] = self.cookie[self.key].output(header='')
+        self.request['set_cookie'] = True
+
+    def delete(self):
+        """Deletes the session from the persistent storage, and sends
+        an expired cookie out"""
+        if self.use_cookies:
+            self._delete_cookie()
+        self.clear()
+
+    def invalidate(self):
+        """Invalidates this session, creates a new session id, returns
+        to the is_new state"""
+        self.clear()
+        self.was_invalidated = True
+        self._create_id()
+        self.load()
+    
+    def load(self):
+        "Loads the data from this session from persistent storage"
+        self.namespace = self.namespace_class(self.id,
+            data_dir=self.data_dir, digest_filenames=False,
+            **self.namespace_args)
+        now = time.time()
+        self.request['set_cookie'] = True
+        
+        self.namespace.acquire_read_lock()
+        timed_out = False
+        try:
+            self.clear()
+            try:
+                session_data = self.namespace['session']
+
+                # Memcached always returns a key, its None when its not
+                # present
+                if session_data is None:
+                    session_data = {
+                        '_creation_time':now,
+                        '_accessed_time':now
+                    }
+                    self.is_new = True
+            except (KeyError, TypeError):
+                session_data = {
+                    '_creation_time':now,
+                    '_accessed_time':now
+                }
+                self.is_new = True
+            
+            if self.timeout is not None and \
+               now - session_data['_accessed_time'] > self.timeout:
+                timed_out= True
+            else:
+                # Properly set the last_accessed time, which is different
+                # than the *currently* _accessed_time
+                if self.is_new or '_accessed_time' not in session_data:
+                    self.last_accessed = None
+                else:
+                    self.last_accessed = session_data['_accessed_time']
+                
+                # Update the current _accessed_time
+                session_data['_accessed_time'] = now
+                self.update(session_data)
+                self.accessed_dict = session_data.copy()                
+        finally:
+            self.namespace.release_read_lock()
+        if timed_out:
+            self.invalidate()
+    
+    def save(self, accessed_only=False):
+        """Saves the data for this session to persistent storage
+        
+        If accessed_only is True, then only the original data loaded
+        at the beginning of the request will be saved, with the updated
+        last accessed time.
+        
+        """
+        # Look to see if its a new session that was only accessed
+        # Don't save it under that case
+        if accessed_only and self.is_new:
+            return None
+        
+        if not hasattr(self, 'namespace'):
+            self.namespace = self.namespace_class(
+                                    self.id, 
+                                    data_dir=self.data_dir,
+                                    digest_filenames=False, 
+                                    **self.namespace_args)
+        
+        self.namespace.acquire_write_lock()
+        try:
+            if accessed_only:
+                data = dict(self.accessed_dict.items())
+            else:
+                data = dict(self.items())
+            
+            # Save the data
+            if not data and 'session' in self.namespace:
+                del self.namespace['session']
+            else:
+                self.namespace['session'] = data
+        finally:
+            self.namespace.release_write_lock()
+        if self.is_new:
+            self.request['set_cookie'] = True
+    
+    def revert(self):
+        """Revert the session to its original state from its first
+        access in the request"""
+        self.clear()
+        self.update(self.accessed_dict)
+    
+    # TODO: I think both these methods should be removed.  They're from
+    # the original mod_python code i was ripping off but they really
+    # have no use here.
+    def lock(self):
+        """Locks this session against other processes/threads.  This is
+        automatic when load/save is called.
+        
+        ***use with caution*** and always with a corresponding 'unlock'
+        inside a "finally:" block, as a stray lock typically cannot be
+        unlocked without shutting down the whole application.
+
+        """
+        self.namespace.acquire_write_lock()
+
+    def unlock(self):
+        """Unlocks this session against other processes/threads.  This
+        is automatic when load/save is called.
+
+        ***use with caution*** and always within a "finally:" block, as
+        a stray lock typically cannot be unlocked without shutting down
+        the whole application.
+
+        """
+        self.namespace.release_write_lock()
+
+class CookieSession(Session):
+    """Pure cookie-based session
+    
+    Options recognized when using cookie-based sessions are slightly
+    more restricted than general sessions.
+    
+    ``key``
+        The name the cookie should be set to.
+    ``timeout``
+        How long session data is considered valid. This is used 
+        regardless of the cookie being present or not to determine
+        whether session data is still valid.
+    ``encrypt_key``
+        The key to use for the session encryption, if not provided the
+        session will not be encrypted.
+    ``validate_key``
+        The key used to sign the encrypted session
+    ``cookie_domain``
+        Domain to use for the cookie.
+    ``secure``
+        Whether or not the cookie should only be sent over SSL.
+    
+    """
+    def __init__(self, request, key='beaker.session.id', timeout=None,
+                 cookie_expires=True, cookie_domain=None, encrypt_key=None,
+                 validate_key=None, secure=False, **kwargs):
+        if not crypto_ok and encrypt_key:
+            raise BeakerException("pycryptopp is not installed, can't use "
+                                  "encrypted cookie-only Session.")
+        
+        self.request = request
+        self.key = key
+        self.timeout = timeout
+        self.cookie_expires = cookie_expires
+        self.encrypt_key = encrypt_key
+        self.validate_key = validate_key
+        self.request['set_cookie'] = False
+        self.secure = secure
+        self._domain = cookie_domain
+        self._path = '/'
+        
+        try:
+            cookieheader = request['cookie']
+        except KeyError:
+            cookieheader = ''
+        
+        if validate_key is None:
+            raise BeakerException("No validate_key specified for Cookie only "
+                                  "Session.")
+        
+        try:
+            self.cookie = SignedCookie(validate_key, input=cookieheader)
+        except Cookie.CookieError:
+            self.cookie = SignedCookie(validate_key, input=None)
+        
+        self['_id'] = self._make_id()
+        self.is_new = True
+        
+        # If we have a cookie, load it
+        if self.key in self.cookie and self.cookie[self.key].value is not None:
+            self.is_new = False
+            try:
+                self.update(self._decrypt_data())
+            except:
+                pass
+            if self.timeout is not None and time.time() - \
+               self['_accessed_time'] > self.timeout:
+                self.clear()
+            self.accessed_dict = self.copy()
+            self._create_cookie()
+    
+    def created(self):
+        return self['_creation_time']
+    created = property(created)
+    
+    def id(self):
+        return self['_id']
+    id = property(id)
+
+    def _set_domain(self, domain):
+        self['_domain'] = domain
+        self._domain = domain
+        
+    def _set_path(self, path):
+        self['_path'] = path
+        self._path = path
+    
+    def _encrypt_data(self):
+        """Serialize, encipher, and base64 the session dict"""
+        if self.encrypt_key:
+            nonce = b64encode(os.urandom(40))[:8]
+            encrypt_key = generateCryptoKeys(self.encrypt_key,
+                                             self.validate_key + nonce, 1)
+            data = cPickle.dumps(self.copy(), 2)
+            return nonce + b64encode(aesEncrypt(data, encrypt_key))
+        else:
+            data = cPickle.dumps(self.copy(), 2)
+            return b64encode(data)
+    
+    def _decrypt_data(self):
+        """Bas64, decipher, then un-serialize the data for the session
+        dict"""
+        if self.encrypt_key:
+            nonce = self.cookie[self.key].value[:8]
+            encrypt_key = generateCryptoKeys(self.encrypt_key,
+                                             self.validate_key + nonce, 1)
+            payload = b64decode(self.cookie[self.key].value[8:])
+            data = aesEncrypt(payload, encrypt_key)
+            return cPickle.loads(data)
+        else:
+            data = b64decode(self.cookie[self.key].value)
+            return cPickle.loads(data)
+    
+    def _make_id(self):
+        return md5(md5(
+            "%f%s%f%d" % (time.time(), id({}), random.random(), getpid())
+            ).hexdigest()
+        ).hexdigest()
+    
+    def save(self, accessed_only=False):
+        """Saves the data for this session to persistent storage"""
+        if accessed_only and self.is_new:
+            return
+        if accessed_only:
+            self.clear()
+            self.update(self.accessed_dict)
+        self._create_cookie()
+    
+    def expire(self):
+        """Delete the 'expires' attribute on this Session, if any."""
+        
+        self.pop('_expires', None)
+        
+    def _create_cookie(self):
+        if '_creation_time' not in self:
+            self['_creation_time'] = time.time()
+        if '_id' not in self:
+            self['_id'] = self._make_id()
+        self['_accessed_time'] = time.time()
+        
+        if self.cookie_expires is not True:
+            if self.cookie_expires is False:
+                expires = datetime.fromtimestamp( 0x7FFFFFFF )
+            elif isinstance(self.cookie_expires, timedelta):
+                expires = datetime.today() + self.cookie_expires
+            elif isinstance(self.cookie_expires, datetime):
+                expires = self.cookie_expires
+            else:
+                raise ValueError("Invalid argument for cookie_expires: %s"
+                                 % repr(self.cookie_expires))
+            self['_expires'] = expires
+        elif '_expires' in self:
+            expires = self['_expires']
+        else:
+            expires = None
+
+        val = self._encrypt_data()
+        if len(val) > 4064:
+            raise BeakerException("Cookie value is too long to store")
+        
+        self.cookie[self.key] = val
+        if '_domain' in self:
+            self.cookie[self.key]['domain'] = self['_domain']
+        elif self._domain:
+            self.cookie[self.key]['domain'] = self._domain
+        if self.secure:
+            self.cookie[self.key]['secure'] = True
+        
+        self.cookie[self.key]['path'] = self.get('_path', '/')
+        
+        if expires:
+            self.cookie[self.key]['expires'] = \
+                expires.strftime("%a, %d-%b-%Y %H:%M:%S GMT" )
+        self.request['cookie_out'] = self.cookie[self.key].output(header='')
+        self.request['set_cookie'] = True
+    
+    def delete(self):
+        """Delete the cookie, and clear the session"""
+        # Send a delete cookie request
+        self._delete_cookie()
+        self.clear()
+    
+    def invalidate(self):
+        """Clear the contents and start a new session"""
+        self.delete()
+        self['_id'] = self._make_id()
+
+
+class SessionObject(object):
+    """Session proxy/lazy creator
+    
+    This object proxies access to the actual session object, so that in
+    the case that the session hasn't been used before, it will be
+    setup. This avoid creating and loading the session from persistent
+    storage unless its actually used during the request.
+    
+    """
+    def __init__(self, environ, **params):
+        self.__dict__['_params'] = params
+        self.__dict__['_environ'] = environ
+        self.__dict__['_sess'] = None
+        self.__dict__['_headers'] = []
+    
+    def _session(self):
+        """Lazy initial creation of session object"""
+        if self.__dict__['_sess'] is None:
+            params = self.__dict__['_params']
+            environ = self.__dict__['_environ']
+            self.__dict__['_headers'] = req = {'cookie_out':None}
+            req['cookie'] = environ.get('HTTP_COOKIE')
+            if params.get('type') == 'cookie':
+                self.__dict__['_sess'] = CookieSession(req, **params)
+            else:
+                self.__dict__['_sess'] = Session(req, use_cookies=True,
+                                                 **params)
+        return self.__dict__['_sess']
+    
+    def __getattr__(self, attr):
+        return getattr(self._session(), attr)
+    
+    def __setattr__(self, attr, value):
+        setattr(self._session(), attr, value)
+    
+    def __delattr__(self, name):
+        self._session().__delattr__(name)
+    
+    def __getitem__(self, key):
+        return self._session()[key]
+    
+    def __setitem__(self, key, value):
+        self._session()[key] = value
+    
+    def __delitem__(self, key):
+        self._session().__delitem__(key)
+    
+    def __repr__(self):
+        return self._session().__repr__()
+    
+    def __iter__(self):
+        """Only works for proxying to a dict"""
+        return iter(self._session().keys())
+    
+    def __contains__(self, key):
+        return self._session().has_key(key)
+    
+    def get_by_id(self, id):
+        params = self.__dict__['_params']
+        session = Session({}, use_cookies=False, id=id, **params)
+        if session.is_new:
+            return None
+        return session
+    
+    def save(self):
+        self.__dict__['_dirty'] = True
+    
+    def delete(self):
+        self.__dict__['_dirty'] = True
+        self._session().delete()
+    
+    def persist(self):
+        """Persist the session to the storage
+        
+        If its set to autosave, then the entire session will be saved
+        regardless of if save() has been called. Otherwise, just the
+        accessed time will be updated if save() was not called, or
+        the session will be saved if save() was called.
+        
+        """
+        if self.__dict__['_params'].get('auto'):
+            self._session().save()
+        else:
+            if self.__dict__.get('_dirty'):
+                self._session().save()
+            else:
+                self._session().save(accessed_only=True)
+    
+    def dirty(self):
+        return self.__dict__.get('_dirty', False)
+    
+    def accessed(self):
+        return self.__dict__['_sess'] is not None
Index: /galaxy-central/eggs/Beaker-1.4-py2.6.egg/EGG-INFO/SOURCES.txt
===================================================================
--- /galaxy-central/eggs/Beaker-1.4-py2.6.egg/EGG-INFO/SOURCES.txt (revision 3)
+++ /galaxy-central/eggs/Beaker-1.4-py2.6.egg/EGG-INFO/SOURCES.txt (revision 3)
@@ -0,0 +1,40 @@
+.hgignore
+.hgtags
+CHANGELOG
+LICENSE
+scramble.py
+setup.cfg
+setup.py
+Beaker.egg-info/PKG-INFO
+Beaker.egg-info/SOURCES.txt
+Beaker.egg-info/dependency_links.txt
+Beaker.egg-info/entry_points.txt
+Beaker.egg-info/not-zip-safe
+Beaker.egg-info/requires.txt
+Beaker.egg-info/top_level.txt
+beaker/__init__.py
+beaker/cache.py
+beaker/container.py
+beaker/converters.py
+beaker/exceptions.py
+beaker/middleware.py
+beaker/session.py
+beaker/synchronization.py
+beaker/util.py
+beaker/crypto/__init__.py
+beaker/crypto/jcecrypto.py
+beaker/crypto/pbkdf2.py
+beaker/crypto/pycrypto.py
+beaker/ext/__init__.py
+beaker/ext/database.py
+beaker/ext/google.py
+beaker/ext/memcached.py
+beaker/ext/sqla.py
+tests/test_cache.py
+tests/test_container.py
+tests/test_cookie_only.py
+tests/test_database.py
+tests/test_increment.py
+tests/test_memcached.py
+tests/test_syncdict.py
+tests/test_synchronizer.py
Index: /galaxy-central/eggs/Beaker-1.4-py2.6.egg/EGG-INFO/top_level.txt
===================================================================
--- /galaxy-central/eggs/Beaker-1.4-py2.6.egg/EGG-INFO/top_level.txt (revision 3)
+++ /galaxy-central/eggs/Beaker-1.4-py2.6.egg/EGG-INFO/top_level.txt (revision 3)
@@ -0,0 +1,1 @@
+beaker
Index: /galaxy-central/eggs/Beaker-1.4-py2.6.egg/EGG-INFO/PKG-INFO
===================================================================
--- /galaxy-central/eggs/Beaker-1.4-py2.6.egg/EGG-INFO/PKG-INFO (revision 3)
+++ /galaxy-central/eggs/Beaker-1.4-py2.6.egg/EGG-INFO/PKG-INFO (revision 3)
@@ -0,0 +1,69 @@
+Metadata-Version: 1.0
+Name: Beaker
+Version: 1.4
+Summary: A Session and Caching library with WSGI Middleware
+Home-page: http://beaker.groovie.org
+Author: Ben Bangart, Mike Bayer, Philip Jenvey
+Author-email: ben@groovie.org, pjenvey@groovie.org
+License: BSD
+Description: Cache and Session Library
+        +++++++++++++++++++++++++
+        
+        About
+        =====
+        
+        Beaker is a web session and general caching library that includes WSGI
+        middleware for use in web applications.
+        
+        As a general caching library, Beaker can handle storing for various times
+        any Python object that can be pickled with optional back-ends on a
+        fine-grained basis.
+        
+        Beaker was built largely on the code from MyghtyUtils, then refactored and
+        extended with database support.
+        
+        Beaker includes Cache and Session WSGI middleware to ease integration with
+        WSGI capable frameworks, and is automatically used by `Pylons
+        <http://pylonshq.com/>`_.
+        
+        
+        Features
+        ========
+        
+        * Fast, robust performance
+        * Multiple reader/single writer lock system to avoid duplicate simultaneous
+        cache creation
+        * Cache back-ends include dbm, file, memory, memcached, and database (Using
+        SQLAlchemy for multiple-db vendor support)
+        * Signed cookie's to prevent session hijacking/spoofing
+        * Cookie-only sessions to remove the need for a db or file backend (ideal
+        for clustered systems)
+        * Extensible Container object to support new back-ends
+        * Cache's can be divided into namespaces (to represent templates, objects,
+        etc.) then keyed for different copies
+        * Create functions for automatic call-backs to create new cache copies after
+        expiration
+        * Fine-grained toggling of back-ends, keys, and expiration per Cache object
+        
+        
+        Documentation
+        =============
+        
+        Documentation can be found on the `Official Beaker Docs site
+        <http://beaker.groovie.org/>`_.
+        
+        
+        Source
+        ======
+        
+        The latest developer version is available in a `Mercurial repository
+        <http://bitbucket.org/bbangert/beaker/get/tip.gz#egg=Beaker-dev>`_.
+        
+Keywords: wsgi myghty session web cache middleware
+Platform: UNKNOWN
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Environment :: Web Environment
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: BSD License
+Classifier: Programming Language :: Python
+Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
Index: /galaxy-central/eggs/Beaker-1.4-py2.6.egg/EGG-INFO/entry_points.txt
===================================================================
--- /galaxy-central/eggs/Beaker-1.4-py2.6.egg/EGG-INFO/entry_points.txt (revision 3)
+++ /galaxy-central/eggs/Beaker-1.4-py2.6.egg/EGG-INFO/entry_points.txt (revision 3)
@@ -0,0 +1,13 @@
+
+          [paste.filter_factory]
+          beaker_session = beaker.middleware:session_filter_factory
+          
+          [paste.filter_app_factory]
+          beaker_session = beaker.middleware:session_filter_app_factory
+          
+          [beaker.backends]
+          database = beaker.ext.database:DatabaseNamespaceManager
+          memcached = beaker.ext.memcached:MemcachedNamespaceManager
+          google = beaker.ext.google:GoogleNamespaceManager
+          sqla = beaker.ext.sqla:SqlaNamespaceManager
+      
Index: /galaxy-central/eggs/Beaker-1.4-py2.6.egg/EGG-INFO/dependency_links.txt
===================================================================
--- /galaxy-central/eggs/Beaker-1.4-py2.6.egg/EGG-INFO/dependency_links.txt (revision 3)
+++ /galaxy-central/eggs/Beaker-1.4-py2.6.egg/EGG-INFO/dependency_links.txt (revision 3)
@@ -0,0 +1,1 @@
+
Index: /galaxy-central/eggs/Beaker-1.4-py2.6.egg/EGG-INFO/not-zip-safe
===================================================================
--- /galaxy-central/eggs/Beaker-1.4-py2.6.egg/EGG-INFO/not-zip-safe (revision 3)
+++ /galaxy-central/eggs/Beaker-1.4-py2.6.egg/EGG-INFO/not-zip-safe (revision 3)
@@ -0,0 +1,1 @@
+
Index: /galaxy-central/eggs/Beaker-1.4-py2.6.egg/EGG-INFO/requires.txt
===================================================================
--- /galaxy-central/eggs/Beaker-1.4-py2.6.egg/EGG-INFO/requires.txt (revision 3)
+++ /galaxy-central/eggs/Beaker-1.4-py2.6.egg/EGG-INFO/requires.txt (revision 3)
@@ -0,0 +1,4 @@
+
+
+[crypto]
+pycryptopp>=0.5.12
Index: /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/EGG-INFO/SOURCES.txt
===================================================================
--- /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/EGG-INFO/SOURCES.txt (revision 3)
+++ /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/EGG-INFO/SOURCES.txt (revision 3)
@@ -0,0 +1,56 @@
+MANIFEST.in
+regen-docs
+scramble.py
+setup.cfg
+setup.py
+PasteDeploy.egg-info/PKG-INFO
+PasteDeploy.egg-info/SOURCES.txt
+PasteDeploy.egg-info/dependency_links.txt
+PasteDeploy.egg-info/entry_points.txt
+PasteDeploy.egg-info/namespace_packages.txt
+PasteDeploy.egg-info/not-zip-safe
+PasteDeploy.egg-info/requires.txt
+PasteDeploy.egg-info/top_level.txt
+docs/conf.py
+docs/index.txt
+docs/license.txt
+docs/news.txt
+docs/_static/paste.css
+docs/_templates/layout.html
+docs/modules/config.txt
+docs/modules/converters.txt
+docs/modules/loadwsgi.txt
+paste/__init__.py
+paste/deploy/__init__.py
+paste/deploy/config.py
+paste/deploy/converters.py
+paste/deploy/epdesc.py
+paste/deploy/interfaces.py
+paste/deploy/loadwsgi.py
+paste/deploy/paster_templates.py
+paste/deploy/paster_templates/paste_deploy/+package+/sampleapp.py_tmpl
+paste/deploy/paster_templates/paste_deploy/+package+/wsgiapp.py_tmpl
+paste/deploy/paster_templates/paste_deploy/docs/devel_config.ini_tmpl
+paste/deploy/util/__init__.py
+paste/deploy/util/fixtypeerror.py
+paste/deploy/util/threadinglocal.py
+tests/conftest.py
+tests/fixture.py
+tests/test_basic_app.py
+tests/test_config.py
+tests/test_config_middleware.py
+tests/test_filter.py
+tests/test_load_package.py
+tests/fake_packages/FakeApp.egg/setup.py
+tests/fake_packages/FakeApp.egg/FakeApp.egg-info/PKG-INFO
+tests/fake_packages/FakeApp.egg/FakeApp.egg-info/entry_points.txt
+tests/fake_packages/FakeApp.egg/FakeApp.egg-info/top_level.txt
+tests/fake_packages/FakeApp.egg/fakeapp/__init__.py
+tests/fake_packages/FakeApp.egg/fakeapp/apps.py
+tests/fake_packages/FakeApp.egg/fakeapp/configapps.py
+tests/sample_configs/basic_app.ini
+tests/sample_configs/executable.ini
+tests/sample_configs/test_config.ini
+tests/sample_configs/test_config_included.ini
+tests/sample_configs/test_filter.ini
+tests/sample_configs/test_filter_with.ini
Index: /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/EGG-INFO/top_level.txt
===================================================================
--- /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/EGG-INFO/top_level.txt (revision 3)
+++ /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/EGG-INFO/top_level.txt (revision 3)
@@ -0,0 +1,1 @@
+paste
Index: /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/EGG-INFO/namespace_packages.txt
===================================================================
--- /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/EGG-INFO/namespace_packages.txt (revision 3)
+++ /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/EGG-INFO/namespace_packages.txt (revision 3)
@@ -0,0 +1,1 @@
+paste
Index: /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/EGG-INFO/PKG-INFO
===================================================================
--- /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/EGG-INFO/PKG-INFO (revision 3)
+++ /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/EGG-INFO/PKG-INFO (revision 3)
@@ -0,0 +1,31 @@
+Metadata-Version: 1.0
+Name: PasteDeploy
+Version: 1.3.3
+Summary: Load, configure, and compose WSGI applications and servers
+Home-page: http://pythonpaste.org/deploy/
+Author: Ian Bicking
+Author-email: ianb@colorstudy.com
+License: MIT
+Description: This tool provides code to load WSGI applications and servers from
+        URIs; these URIs can refer to Python Eggs for INI-style configuration
+        files.  `Paste Script <http://pythonpaste.org/script>`_ provides
+        commands to serve applications based on this configuration file.
+        
+        The latest version is available in a `Subversion repository
+        <http://svn.pythonpaste.org/Paste/Deploy/trunk#egg=PasteDeploy-dev>`_.
+        
+        For the latest changes see the `news file
+        <http://pythonpaste.org/deploy/news.html>`_.
+        
+Keywords: web wsgi application server
+Platform: UNKNOWN
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: MIT License
+Classifier: Programming Language :: Python
+Classifier: Topic :: Internet :: WWW/HTTP
+Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
+Classifier: Topic :: Software Development :: Libraries :: Python Modules
+Classifier: Topic :: Internet :: WWW/HTTP :: WSGI
+Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Middleware
+Classifier: Framework :: Paste
Index: /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/EGG-INFO/entry_points.txt
===================================================================
--- /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/EGG-INFO/entry_points.txt (revision 3)
+++ /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/EGG-INFO/entry_points.txt (revision 3)
@@ -0,0 +1,17 @@
+
+    [paste.filter_app_factory]
+    config = paste.deploy.config:make_config_filter [Config]
+    prefix = paste.deploy.config:make_prefix_middleware
+
+    [paste.paster_create_template]
+    paste_deploy=paste.deploy.paster_templates:PasteDeploy
+
+    [paste.entry_point_description]
+    paste.app_factory = paste.deploy.epdesc:AppFactoryDescription
+    paste.composit_factory = paste.deploy.epdesc:CompositeFactoryDescription
+    paste.composite_factory = paste.deploy.epdesc:CompositeFactoryDescription
+    paste.filter_app_factory = paste.deploy.epdesc:FilterAppFactoryDescription
+    paste.filter_factory = paste.deploy.epdesc:FilterFactoryDescription
+    paste.server_factory = paste.deploy.epdesc:ServerFactoryDescription
+    paste.server_runner = paste.deploy.epdesc:ServerRunnerDescription
+    
Index: /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/EGG-INFO/dependency_links.txt
===================================================================
--- /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/EGG-INFO/dependency_links.txt (revision 3)
+++ /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/EGG-INFO/dependency_links.txt (revision 3)
@@ -0,0 +1,1 @@
+
Index: /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/EGG-INFO/not-zip-safe
===================================================================
--- /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/EGG-INFO/not-zip-safe (revision 3)
+++ /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/EGG-INFO/not-zip-safe (revision 3)
@@ -0,0 +1,1 @@
+
Index: /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/EGG-INFO/requires.txt
===================================================================
--- /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/EGG-INFO/requires.txt (revision 3)
+++ /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/EGG-INFO/requires.txt (revision 3)
@@ -0,0 +1,6 @@
+
+
+[Paste]
+Paste
+
+[Config]
Index: /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/paste/__init__.py
===================================================================
--- /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/paste/__init__.py (revision 3)
+++ /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/paste/__init__.py (revision 3)
@@ -0,0 +1,18 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+try:
+    import pkg_resources
+    pkg_resources.declare_namespace(__name__)
+except ImportError:
+    # don't prevent use of paste if pkg_resources isn't installed
+    from pkgutil import extend_path
+    __path__ = extend_path(__path__, __name__) 
+
+try:
+    import modulefinder
+except ImportError:
+    pass
+else:
+    for p in __path__:
+        modulefinder.AddPackagePath(__name__, p)
+
Index: /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/paste/deploy/loadwsgi.py
===================================================================
--- /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/paste/deploy/loadwsgi.py (revision 3)
+++ /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/paste/deploy/loadwsgi.py (revision 3)
@@ -0,0 +1,639 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+import os
+import re
+import sys
+import urllib
+from ConfigParser import ConfigParser
+import pkg_resources
+from paste.deploy.util.fixtypeerror import fix_call
+
+__all__ = ['loadapp', 'loadserver', 'loadfilter', 'appconfig']
+
+############################################################
+## Utility functions
+############################################################
+
+def import_string(s):
+    return pkg_resources.EntryPoint.parse("x="+s).load(False)
+
+def _aslist(obj):
+    """
+    Turn object into a list; lists and tuples are left as-is, None
+    becomes [], and everything else turns into a one-element list.
+    """
+    if obj is None:
+        return []
+    elif isinstance(obj, (list, tuple)):
+        return obj
+    else:
+        return [obj]
+
+def _flatten(lst):
+    """
+    Flatten a nested list.
+    """
+    if not isinstance(lst, (list, tuple)):
+        return [lst]
+    result = []
+    for item in lst:
+        result.extend(_flatten(item))
+    return result
+
+class NicerConfigParser(ConfigParser):
+
+    def __init__(self, filename, *args, **kw):
+        ConfigParser.__init__(self, *args, **kw)
+        self.filename = filename
+
+    def defaults(self):
+        """Return the defaults, with their values interpolated (with the
+        defaults dict itself)
+
+        Mainly to support defaults using values such as %(here)s
+        """
+        defaults = ConfigParser.defaults(self).copy()
+        for key, val in defaults.iteritems():
+            defaults[key] = self._interpolate('DEFAULT', key, val, defaults)
+        return defaults
+
+    def _interpolate(self, section, option, rawval, vars):
+        try:
+            return ConfigParser._interpolate(
+                self, section, option, rawval, vars)
+        except Exception, e:
+            args = list(e.args)
+            args[0] = 'Error in file %s, [%s] %s=%r: %s' % (
+                self.filename, section, option, rawval, e)
+            e.args = tuple(args)
+            raise
+
+############################################################
+## Object types
+############################################################
+
+class _ObjectType(object):
+
+    name = None
+    egg_protocols = None
+    config_prefixes = None
+
+    def __init__(self):
+        # Normalize these variables:
+        self.egg_protocols = map(_aslist, _aslist(self.egg_protocols))
+        self.config_prefixes = map(_aslist, _aslist(self.config_prefixes))
+
+    def __repr__(self):
+        return '<%s protocols=%r prefixes=%r>' % (
+            self.name, self.egg_protocols, self.config_prefixes)
+
+    def invoke(self, context):
+        assert context.protocol in _flatten(self.egg_protocols)
+        return fix_call(context.object,
+                        context.global_conf, **context.local_conf)
+
+class _App(_ObjectType):
+
+    name = 'application'
+    egg_protocols = ['paste.app_factory', 'paste.composite_factory',
+                     'paste.composit_factory']
+    config_prefixes = [['app', 'application'], ['composite', 'composit'],
+                       'pipeline', 'filter-app']
+
+    def invoke(self, context):
+        if context.protocol in ('paste.composit_factory',
+                                'paste.composite_factory'):
+            return fix_call(context.object,
+                            context.loader, context.global_conf,
+                            **context.local_conf)
+        elif context.protocol == 'paste.app_factory':
+            return fix_call(context.object, context.global_conf, **context.local_conf)
+        else:
+            assert 0, "Protocol %r unknown" % context.protocol
+
+APP = _App()
+
+class _Filter(_ObjectType):
+    name = 'filter'
+    egg_protocols = [['paste.filter_factory', 'paste.filter_app_factory']]
+    config_prefixes = ['filter']
+
+    def invoke(self, context):
+        if context.protocol == 'paste.filter_factory':
+            return fix_call(context.object,
+                            context.global_conf, **context.local_conf)
+        elif context.protocol == 'paste.filter_app_factory':
+            def filter_wrapper(wsgi_app):
+                # This should be an object, so it has a nicer __repr__
+                return fix_call(context.object,
+                                wsgi_app, context.global_conf,
+                                **context.local_conf)
+            return filter_wrapper
+        else:
+            assert 0, "Protocol %r unknown" % context.protocol
+
+FILTER = _Filter()
+
+class _Server(_ObjectType):
+    name = 'server'
+    egg_protocols = [['paste.server_factory', 'paste.server_runner']]
+    config_prefixes = ['server']
+
+    def invoke(self, context):
+        if context.protocol == 'paste.server_factory':
+            return fix_call(context.object,
+                            context.global_conf, **context.local_conf)
+        elif context.protocol == 'paste.server_runner':
+            def server_wrapper(wsgi_app):
+                # This should be an object, so it has a nicer __repr__
+                return fix_call(context.object,
+                                wsgi_app, context.global_conf,
+                                **context.local_conf)
+            return server_wrapper
+        else:
+            assert 0, "Protocol %r unknown" % context.protocol
+
+SERVER = _Server()
+
+# Virtual type: (@@: There's clearly something crufty here;
+# this probably could be more elegant)
+class _PipeLine(_ObjectType):
+    name = 'pipeline'
+
+    def invoke(self, context):
+        app = context.app_context.create()
+        filters = [c.create() for c in context.filter_contexts]
+        filters.reverse()
+        for filter in filters:
+            app = filter(app)
+        return app
+
+PIPELINE = _PipeLine()
+
+class _FilterApp(_ObjectType):
+    name = 'filter_app'
+
+    def invoke(self, context):
+        next_app = context.next_context.create()
+        filter = context.filter_context.create()
+        return filter(next_app)
+
+FILTER_APP = _FilterApp()
+
+class _FilterWith(_App):
+    name = 'filtered_with'
+
+    def invoke(self, context):
+        filter = context.filter_context.create()
+        filtered = context.next_context.create()
+        if context.next_context.object_type is APP:
+            return filter(filtered)
+        else:
+            # filtering a filter
+            def composed(app):
+                return filter(filtered(app))
+            return composed
+
+FILTER_WITH = _FilterWith()
+
+############################################################
+## Loaders
+############################################################
+
+def loadapp(uri, name=None, **kw):
+    return loadobj(APP, uri, name=name, **kw)
+
+def loadfilter(uri, name=None, **kw):
+    return loadobj(FILTER, uri, name=name, **kw)
+
+def loadserver(uri, name=None, **kw):
+    return loadobj(SERVER, uri, name=name, **kw)
+
+def appconfig(uri, name=None, relative_to=None, global_conf=None):
+    context = loadcontext(APP, uri, name=name,
+                          relative_to=relative_to,
+                          global_conf=global_conf)
+    return context.config()
+
+_loaders = {}
+
+def loadobj(object_type, uri, name=None, relative_to=None,
+            global_conf=None):
+    context = loadcontext(
+        object_type, uri, name=name, relative_to=relative_to,
+        global_conf=global_conf)
+    return context.create()
+
+def loadcontext(object_type, uri, name=None, relative_to=None,
+                global_conf=None):
+    if '#' in uri:
+        if name is None:
+            uri, name = uri.split('#', 1)
+        else:
+            # @@: Ignore fragment or error?
+            uri = uri.split('#', 1)[0]
+    if name is None:
+        name = 'main'
+    if ':' not in uri:
+        raise LookupError("URI has no scheme: %r" % uri)
+    scheme, path = uri.split(':', 1)
+    scheme = scheme.lower()
+    if scheme not in _loaders:
+        raise LookupError(
+            "URI scheme not known: %r (from %s)"
+            % (scheme, ', '.join(_loaders.keys())))
+    return _loaders[scheme](
+        object_type,
+        uri, path, name=name, relative_to=relative_to,
+        global_conf=global_conf)
+
+def _loadconfig(object_type, uri, path, name, relative_to,
+                global_conf):
+    # De-Windowsify the paths:
+    path = path.replace('\\', '/')
+    absolute_path = True
+    if sys.platform == 'win32':
+        _absolute_re = re.compile(r'^[a-zA-Z]:')
+        if not _absolute_re.search(path):
+            absolute_path = False
+    else:
+        if not path.startswith('/'):
+            absolute_path = False
+    if not absolute_path:
+        if not relative_to:
+            raise ValueError(
+                "Cannot resolve relative uri %r; no context keyword "
+                "argument given" % uri)
+        relative_to = relative_to.replace('\\', '/')
+        if relative_to.endswith('/'):
+            path = relative_to + path
+        else:
+            path = relative_to + '/' + path
+    if path.startswith('///'):
+        path = path[2:]
+    path = urllib.unquote(path)
+    loader = ConfigLoader(path)
+    if global_conf:
+        loader.update_defaults(global_conf, overwrite=False)
+    return loader.get_context(object_type, name, global_conf)
+
+_loaders['config'] = _loadconfig
+
+def _loadegg(object_type, uri, spec, name, relative_to,
+             global_conf):
+    loader = EggLoader(spec)
+    return loader.get_context(object_type, name, global_conf)
+
+_loaders['egg'] = _loadegg
+
+############################################################
+## Loaders
+############################################################
+
+class _Loader(object):
+
+    def get_app(self, name=None, global_conf=None):
+        return self.app_context(
+            name=name, global_conf=global_conf).create()
+
+    def get_filter(self, name=None, global_conf=None):
+        return self.filter_context(
+            name=name, global_conf=global_conf).create()
+
+    def get_server(self, name=None, global_conf=None):
+        return self.server_context(
+            name=name, global_conf=global_conf).create()
+
+    def app_context(self, name=None, global_conf=None):
+        return self.get_context(
+            APP, name=name, global_conf=global_conf)
+
+    def filter_context(self, name=None, global_conf=None):
+        return self.get_context(
+            FILTER, name=name, global_conf=global_conf)
+
+    def server_context(self, name=None, global_conf=None):
+        return self.get_context(
+            SERVER, name=name, global_conf=global_conf)
+
+    _absolute_re = re.compile(r'^[a-zA-Z]+:')
+    def absolute_name(self, name):
+        """
+        Returns true if the name includes a scheme
+        """
+        if name is None:
+            return False
+        return self._absolute_re.search(name)        
+
+class ConfigLoader(_Loader):
+
+    def __init__(self, filename):
+        self.filename = filename = filename.strip()
+        self.parser = NicerConfigParser(self.filename)
+        # Don't lower-case keys:
+        self.parser.optionxform = str
+        # Stupid ConfigParser ignores files that aren't found, so
+        # we have to add an extra check:
+        if not os.path.exists(filename):
+            if filename.strip() != filename:
+                raise OSError(
+                    "File %r not found; trailing whitespace: "
+                    "did you try to use a # on the same line as a filename? "
+                    "(comments must be on their own line)" % filename)
+            raise OSError(
+                "File %r not found" % filename)
+        self.parser.read(filename)
+        self.parser._defaults.setdefault(
+            'here', os.path.dirname(os.path.abspath(filename)))
+        self.parser._defaults.setdefault(
+            '__file__', os.path.abspath(filename))
+
+    def update_defaults(self, new_defaults, overwrite=True):
+        for key, value in new_defaults.items():
+            if not overwrite and key in self.parser._defaults:
+                continue
+            self.parser._defaults[key] = value
+
+    def get_context(self, object_type, name=None, global_conf=None):
+        if self.absolute_name(name):
+            return loadcontext(object_type, name,
+                               relative_to=os.path.dirname(self.filename),
+                               global_conf=global_conf)
+        section = self.find_config_section(
+            object_type, name=name)
+        if global_conf is None:
+            global_conf = {}
+        else:
+            global_conf = global_conf.copy()
+        defaults = self.parser.defaults()
+        global_conf.update(defaults)
+        local_conf = {}
+        global_additions = {}
+        get_from_globals = {}
+        for option in self.parser.options(section):
+            if option.startswith('set '):
+                name = option[4:].strip()
+                global_additions[name] = global_conf[name] = (
+                    self.parser.get(section, option))
+            elif option.startswith('get '):
+                name = option[4:].strip()
+                get_from_globals[name] = self.parser.get(section, option)
+            else:
+                if option in defaults:
+                    # @@: It's a global option (?), so skip it
+                    continue
+                local_conf[option] = self.parser.get(section, option)
+        for local_var, glob_var in get_from_globals.items():
+            local_conf[local_var] = global_conf[glob_var]
+        if object_type in (APP, FILTER) and 'filter-with' in local_conf:
+            filter_with = local_conf.pop('filter-with')
+        else:
+            filter_with = None
+        if 'require' in local_conf:
+            for spec in local_conf['require'].split():
+                pkg_resources.require(spec)
+            del local_conf['require']
+        if section.startswith('filter-app:'):
+            context = self._filter_app_context(
+                object_type, section, name=name,
+                global_conf=global_conf, local_conf=local_conf,
+                global_additions=global_additions)
+        elif section.startswith('pipeline:'):
+            context = self._pipeline_app_context(
+                object_type, section, name=name,
+                global_conf=global_conf, local_conf=local_conf,
+                global_additions=global_additions)
+        elif 'use' in local_conf:
+            context = self._context_from_use(
+                object_type, local_conf, global_conf, global_additions,
+                section)
+        else:
+            context = self._context_from_explicit(
+                object_type, local_conf, global_conf, global_additions,
+                section)
+        if filter_with is not None:
+            filter_with_context = LoaderContext(
+                obj=None,
+                object_type=FILTER_WITH,
+                protocol=None,
+                global_conf=global_conf, local_conf=local_conf,
+                loader=self)
+            filter_with_context.filter_context = self.filter_context(
+                name=filter_with, global_conf=global_conf)
+            filter_with_context.next_context = context
+            return filter_with_context
+        return context
+
+    def _context_from_use(self, object_type, local_conf, global_conf,
+                          global_additions, section):
+        use = local_conf.pop('use')
+        context = self.get_context(
+            object_type, name=use, global_conf=global_conf)
+        context.global_conf.update(global_additions)
+        context.local_conf.update(local_conf)
+        if '__file__' in global_conf:
+            # use sections shouldn't overwrite the original __file__
+            context.global_conf['__file__'] = global_conf['__file__']
+        # @@: Should loader be overwritten?
+        context.loader = self
+        return context
+
+    def _context_from_explicit(self, object_type, local_conf, global_conf,
+                               global_addition, section):
+        possible = []
+        for protocol_options in object_type.egg_protocols:
+            for protocol in protocol_options:
+                if protocol in local_conf:
+                    possible.append((protocol, local_conf[protocol]))
+                    break
+        if len(possible) > 1:
+            raise LookupError(
+                "Multiple protocols given in section %r: %s"
+                % (section, possible))
+        if not possible:
+            raise LookupError(
+                "No loader given in section %r" % section)
+        found_protocol, found_expr = possible[0]
+        del local_conf[found_protocol]
+        value = import_string(found_expr)
+        context = LoaderContext(
+            value, object_type, found_protocol,
+            global_conf, local_conf, self)
+        return context
+
+    def _filter_app_context(self, object_type, section, name,
+                            global_conf, local_conf, global_additions):
+        if 'next' not in local_conf:
+            raise LookupError(
+                "The [%s] section in %s is missing a 'next' setting"
+                % (section, self.filename))
+        next_name = local_conf.pop('next')
+        context = LoaderContext(None, FILTER_APP, None, global_conf,
+                                local_conf, self)
+        context.next_context = self.get_context(
+            APP, next_name, global_conf)
+        if 'use' in local_conf:
+            context.filter_context = self._context_from_use(
+                FILTER, local_conf, global_conf, global_additions,
+                section)
+        else:
+            context.filter_context = self._context_from_explicit(
+                FILTER, local_conf, global_conf, global_additions,
+                section)
+        return context
+
+    def _pipeline_app_context(self, object_type, section, name,
+                              global_conf, local_conf, global_additions):
+        if 'pipeline' not in local_conf:
+            raise LookupError(
+                "The [%s] section in %s is missing a 'pipeline' setting"
+                % (section, self.filename))
+        pipeline = local_conf.pop('pipeline').split()
+        if local_conf:
+            raise LookupError(
+                "The [%s] pipeline section in %s has extra "
+                "(disallowed) settings: %s"
+                % (', '.join(local_conf.keys())))
+        context = LoaderContext(None, PIPELINE, None, global_conf,
+                                local_conf, self)
+        context.app_context = self.get_context(
+            APP, pipeline[-1], global_conf)
+        context.filter_contexts = [
+            self.get_context(FILTER, name, global_conf)
+            for name in pipeline[:-1]]
+        return context
+
+    def find_config_section(self, object_type, name=None):
+        """
+        Return the section name with the given name prefix (following the
+        same pattern as ``protocol_desc`` in ``config``.  It must have the
+        given name, or for ``'main'`` an empty name is allowed.  The
+        prefix must be followed by a ``:``.
+
+        Case is *not* ignored.
+        """
+        possible = []
+        for name_options in object_type.config_prefixes:
+            for name_prefix in name_options:
+                found = self._find_sections(
+                    self.parser.sections(), name_prefix, name)
+                if found:
+                    possible.extend(found)
+                    break
+        if not possible:
+            raise LookupError(
+                "No section %r (prefixed by %s) found in config %s"
+                % (name,
+                   ' or '.join(map(repr, _flatten(object_type.config_prefixes))),
+                   self.filename))
+        if len(possible) > 1:
+            raise LookupError(
+                "Ambiguous section names %r for section %r (prefixed by %s) "
+                "found in config %s"
+                % (possible, name,
+                   ' or '.join(map(repr, _flatten(object_type.config_prefixes))),
+                   self.filename))
+        return possible[0]
+
+    def _find_sections(self, sections, name_prefix, name):
+        found = []
+        if name is None:
+            if name_prefix in sections:
+                found.append(name_prefix)
+            name = 'main'
+        for section in sections:
+            if section.startswith(name_prefix+':'):
+                if section[len(name_prefix)+1:].strip() == name:
+                    found.append(section)
+        return found
+
+
+class EggLoader(_Loader):
+
+    def __init__(self, spec):
+        self.spec = spec
+
+    def get_context(self, object_type, name=None, global_conf=None):
+        if self.absolute_name(name):
+            return loadcontext(object_type, name,
+                               global_conf=global_conf)
+        entry_point, protocol, ep_name = self.find_egg_entry_point(
+            object_type, name=name)
+        return LoaderContext(
+            entry_point,
+            object_type,
+            protocol,
+            global_conf or {}, {},
+            self,
+            distribution=pkg_resources.get_distribution(self.spec),
+            entry_point_name=ep_name)
+
+    def find_egg_entry_point(self, object_type, name=None):
+        """
+        Returns the (entry_point, protocol) for the with the given
+        ``name``.
+        """
+        if name is None:
+            name = 'main'
+        possible = []
+        for protocol_options in object_type.egg_protocols:
+            for protocol in protocol_options:
+                pkg_resources.require(self.spec)
+                entry = pkg_resources.get_entry_info(
+                    self.spec,
+                    protocol,
+                    name)
+                if entry is not None:
+                    possible.append((entry.load(), protocol, entry.name))
+                    break
+        if not possible:
+            # Better exception
+            dist = pkg_resources.get_distribution(self.spec)
+            raise LookupError(
+                "Entry point %r not found in egg %r (dir: %s; protocols: %s; "
+                "entry_points: %s)"
+                % (name, self.spec,
+                   dist.location,
+                   ', '.join(_flatten(object_type.egg_protocols)),
+                   ', '.join(_flatten([
+                (pkg_resources.get_entry_info(self.spec, prot, name) or {}).keys()
+                for prot in protocol_options] or '(no entry points)'))))
+        if len(possible) > 1:
+            raise LookupError(
+                "Ambiguous entry points for %r in egg %r (protocols: %s)"
+                % (name, self.spec, ', '.join(_flatten(protocol_options))))
+        return possible[0]
+
+class LoaderContext(object):
+
+    def __init__(self, obj, object_type, protocol,
+                 global_conf, local_conf, loader,
+                 distribution=None, entry_point_name=None):
+        self.object = obj
+        self.object_type = object_type
+        self.protocol = protocol
+        #assert protocol in _flatten(object_type.egg_protocols), (
+        #    "Bad protocol %r; should be one of %s"
+        #    % (protocol, ', '.join(map(repr, _flatten(object_type.egg_protocols)))))
+        self.global_conf = global_conf
+        self.local_conf = local_conf
+        self.loader = loader
+        self.distribution = distribution
+        self.entry_point_name = entry_point_name
+
+    def create(self):
+        return self.object_type.invoke(self)
+
+    def config(self):
+        conf = AttrDict(self.global_conf)
+        conf.update(self.local_conf)
+        conf.local_conf = self.local_conf
+        conf.global_conf = self.global_conf
+        conf.context = self
+        return conf
+
+class AttrDict(dict):
+    """
+    A dictionary that can be assigned to.
+    """
+    pass
Index: /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/paste/deploy/converters.py
===================================================================
--- /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/paste/deploy/converters.py (revision 3)
+++ /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/paste/deploy/converters.py (revision 3)
@@ -0,0 +1,33 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+def asbool(obj):
+    if isinstance(obj, (str, unicode)):
+        obj = obj.strip().lower()
+        if obj in ['true', 'yes', 'on', 'y', 't', '1']:
+            return True
+        elif obj in ['false', 'no', 'off', 'n', 'f', '0']:
+            return False
+        else:
+            raise ValueError(
+                "String is not true/false: %r" % obj)
+    return bool(obj)
+
+def asint(obj):
+    try:
+        return int(obj)
+    except (TypeError, ValueError), e:
+        raise ValueError(
+            "Bad integer value: %r" % obj)
+
+def aslist(obj, sep=None, strip=True):
+    if isinstance(obj, (str, unicode)):
+        lst = obj.split(sep)
+        if strip:
+            lst = [v.strip() for v in lst]
+        return lst
+    elif isinstance(obj, (list, tuple)):
+        return obj
+    elif obj is None:
+        return []
+    else:
+        return [obj]
Index: /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/paste/deploy/paster_templates.py
===================================================================
--- /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/paste/deploy/paster_templates.py (revision 3)
+++ /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/paste/deploy/paster_templates.py (revision 3)
@@ -0,0 +1,33 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+import os
+from paste.script.templates import Template
+
+class PasteDeploy(Template):
+
+    _template_dir = 'paster_templates/paste_deploy'
+    summary = "A web application deployed through paste.deploy"
+    
+    egg_plugins = ['PasteDeploy']
+    
+    required_templates = ['PasteScript#basic_package']
+
+    def post(self, command, output_dir, vars):
+        for prereq in ['PasteDeploy']:
+            command.insert_into_file(
+                os.path.join(output_dir, 'setup.py'),
+                'Extra requirements',
+                '%r,\n' % prereq,
+                indent=True)
+        command.insert_into_file(
+            os.path.join(output_dir, 'setup.py'),
+            'Entry points',
+            ('      [paste.app_factory]\n'
+             '      main = %(package)s.wsgiapp:make_app\n') % vars,
+            indent=False)
+        if command.verbose:
+            print '*'*72
+            print '* Run "paster serve docs/devel_config.ini" to run the sample application'
+            print '* on http://localhost:8080'
+            print '*'*72
+        
Index: /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/paste/deploy/__init__.py
===================================================================
--- /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/paste/deploy/__init__.py (revision 3)
+++ /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/paste/deploy/__init__.py (revision 3)
@@ -0,0 +1,10 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+from loadwsgi import *
+try:
+    from config import CONFIG
+except ImportError:
+    # @@: Or should we require Paste?  Or should we put threadlocal
+    # into this package too?
+    pass
+
Index: /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/paste/deploy/epdesc.py
===================================================================
--- /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/paste/deploy/epdesc.py (revision 3)
+++ /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/paste/deploy/epdesc.py (revision 3)
@@ -0,0 +1,37 @@
+class AppFactoryDescription(object):
+    description = """
+    This gives a factory/function that can create WSGI apps
+    """
+
+class CompositeFactoryDescription(object):
+    description = """
+    This gives a factory/function that can create WSGI apps, and has
+    access to the application creator so that it can in turn fetch
+    apps based on name.
+    """
+
+class FilterAppFactoryDescription(object):
+    description = """
+    This gives a factory/function that wraps a WSGI application to
+    create another WSGI application (typically applying middleware)
+    """
+
+class FilterFactoryDescription(object):
+    description = """
+    This gives a factory/function that return a function that can wrap
+    a WSGI application and returns another WSGI application.
+    paste.filter_app_factory is the same thing with less layers.
+    """
+
+class ServerFactoryDescription(object):
+    description = """
+    This gives a factory/function that creates a server, that can be
+    called with a WSGI application to run indefinitely.
+    paste.server_runner is the same thing with less layers.
+    """
+
+class ServerRunnerDescription(object):
+    description = """
+    This gives a factory/function that, given a WSGI application and
+    configuration, will serve the application indefinitely.
+    """
Index: /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/paste/deploy/interfaces.py
===================================================================
--- /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/paste/deploy/interfaces.py (revision 3)
+++ /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/paste/deploy/interfaces.py (revision 3)
@@ -0,0 +1,202 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+############################################################
+## Functions
+############################################################
+
+def loadapp(uri, name=None, relative_to=None, global_conf=None):
+    """
+    Provided by ``paste.deploy.loadapp``.
+    
+    Load the specified URI as a WSGI application (returning IWSGIApp).
+    The ``name`` can be in the URI (typically as ``#name``).  If it is
+    and ``name`` is given, the keyword argument overrides the URI.
+
+    If the URI contains a relative filename, then ``relative_to`` is
+    used (if ``relative_to`` is not provided, then it is an error).
+
+    ``global_conf`` is used to load the configuration (additions
+    override the values).  ``global_conf`` is copied before modifying.
+    """
+
+def loadfilter(uri, name=None, relative_to=None, global_conf=None):
+    """
+    Provided by ``paste.deploy.loadfilter``.
+
+    Like ``loadapp()``, except returns in IFilter object.
+    """
+
+def loadserver(uri, name=None, relative_to=None, global_conf=None):
+    """
+    Provided by ``paste.deploy.loadserver``.
+
+    Like ``loadapp()``, except returns in IServer object.
+    """
+
+############################################################
+## Factories
+############################################################
+
+class IPasteAppFactory(object):
+
+    """
+    This is the spec for the ``paste.app_factory``
+    protocol/entry_point.
+    """
+
+    def __call__(global_conf, **local_conf):
+        """
+        Returns a WSGI application (IWSGIAPP) given the global
+        configuration and the local configuration passed in as keyword
+        arguments.
+
+        All keys are strings, but values in local_conf may not be
+        valid Python identifiers (if you use ``**kw`` you can still
+        capture these values).
+        """
+
+class IPasteCompositFactory(object):
+
+    """
+    This is the spec for the ``paste.composit_factory``
+    protocol/entry_point.
+
+    This also produces WSGI applications, like ``paste.app_factory``,
+    but is given more access to the context in which it is loaded.
+    """
+
+    def __call__(loader, global_conf, **local_conf):
+        """
+        Like IPasteAppFactory this returns a WSGI application
+        (IWSGIApp).  The ``loader`` value conforms to the ``ILoader``
+        interface, and can be used to load (contextually) more
+        applications.
+        """
+
+class IPasteFilterFactory(object):
+
+    """
+    This is the spec for the ``paste.filter_factory``
+    protocol/entry_point.
+    """
+
+    def __call__(global_conf, **local_conf):
+        """
+        Returns a IFilter object.
+        """
+
+class IPasteFilterAppFactory(object):
+
+    """
+    This is the spec for the ``paste.filter_app_factory``
+    protocol/entry_point.
+    """
+    
+    def __call__(wsgi_app, global_conf, **local_conf):
+        """
+        Returns a WSGI application that wraps ``wsgi_app``.
+
+        Note that paste.deploy creates a wrapper for these
+        objects that implement the IFilter interface.
+        """
+
+class IPasteServerFactory(object):
+
+    """
+    This is the spec for the ``paste.server_factory``
+    protocol/entry_point.
+    """
+
+    def __call__(global_conf, **local_conf):
+        """
+        Returns a IServer object.
+        """
+
+class IPasteServerRunner(object):
+
+    """
+    This is the spec for the ``paste.server_runner``
+    protocol/entry_point.
+    """
+
+    def __call__(wsgi_app, global_conf, **local_conf):
+        """
+        Serves the given WSGI application.  May serve once, many
+        times, forever; nothing about how the server works is
+        specified here.
+
+        Note that paste.deploy creates a wrapper for these
+        objects that implement the IServer interface.
+        """
+
+class ILoader(object):
+
+    """
+    This is an object passed into ``IPasteCompositFactory``.  It is
+    currently implemented in ``paste.deploy.loadwsgi`` by
+    ``ConfigLoader`` and ``EggLoader``.
+    """
+
+    def get_app(name_or_uri, global_conf=None):
+        """
+        Return an IWSGIApp object.  If the loader supports named
+        applications, then you can use a simple name; otherwise
+        you must use a full URI.
+
+        Any global configuration you pass in will be added; you should
+        generally pass through the global configuration you received.
+        """
+
+    def get_filter(name_or_uri, global_conf=None):
+        """
+        Return an IFilter object, like ``get_app``.
+        """
+                   
+    def get_server(name_or_uri, global_conf=None):
+        """
+        Return an IServer object, like ``get_app``.
+        """
+
+############################################################
+## Objects
+############################################################
+
+class IWSGIApp(object):
+
+    """
+    This is an application that conforms to `PEP 333
+    <http://www.python.org/peps/pep-0333.html>`_: Python Web Server
+    Gateway Interface v1.0
+    """
+
+    def __call__(environ, start_response):
+        """
+        Calls ``start_response(status_code, header_list)`` and returns
+        an iterator for the body of the response.
+        """
+
+class IFilter(object):
+
+    """
+    A filter is a simple case of middleware, where an object
+    wraps a single WSGI application (IWSGIApp).
+    """
+
+    def __call__(wsgi_app):
+        """
+        Returns an IWSGIApp object, typically one that wraps the
+        ``wsgi_app`` passed in.
+        """
+
+class IServer(object):
+
+    """
+    A simple server interface.
+    """
+
+    def __call__(wsgi_app):
+        """
+        Serves the given WSGI application.  May serve once, many
+        times, forever; nothing about how the server works is
+        specified here.
+        """
Index: /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/paste/deploy/config.py
===================================================================
--- /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/paste/deploy/config.py (revision 3)
+++ /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/paste/deploy/config.py (revision 3)
@@ -0,0 +1,298 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+"""Paste Configuration Middleware and Objects"""
+import threading
+import re
+# Loaded lazily
+wsgilib = None
+local = None
+
+__all__ = ['DispatchingConfig', 'CONFIG', 'ConfigMiddleware', 'PrefixMiddleware']
+
+def local_dict():
+    global config_local, local
+    try:
+        return config_local.wsgi_dict
+    except NameError:
+        from paste.deploy.util.threadinglocal import local
+        config_local = local()
+        config_local.wsgi_dict = result = {}
+        return result
+    except AttributeError:
+        config_local.wsgi_dict = result = {}
+        return result
+
+class DispatchingConfig(object):
+
+    """
+    This is a configuration object that can be used globally,
+    imported, have references held onto.  The configuration may differ
+    by thread (or may not).
+
+    Specific configurations are registered (and deregistered) either
+    for the process or for threads.
+    """
+
+    # @@: What should happen when someone tries to add this
+    # configuration to itself?  Probably the conf should become
+    # resolved, and get rid of this delegation wrapper
+
+    _constructor_lock = threading.Lock()
+
+    def __init__(self):
+        self._constructor_lock.acquire()
+        try:
+            self.dispatching_id = 0
+            while 1:
+                self._local_key = 'paste.processconfig_%i' % self.dispatching_id
+                if not local_dict().has_key(self._local_key):
+                    break
+                self.dispatching_id += 1
+        finally:
+            self._constructor_lock.release()
+        self._process_configs = []
+
+    def push_thread_config(self, conf):
+        """
+        Make ``conf`` the active configuration for this thread.
+        Thread-local configuration always overrides process-wide
+        configuration.
+
+        This should be used like::
+
+            conf = make_conf()
+            dispatching_config.push_thread_config(conf)
+            try:
+                ... do stuff ...
+            finally:
+                dispatching_config.pop_thread_config(conf)
+        """
+        local_dict().setdefault(self._local_key, []).append(conf)
+
+    def pop_thread_config(self, conf=None):
+        """
+        Remove a thread-local configuration.  If ``conf`` is given,
+        it is checked against the popped configuration and an error
+        is emitted if they don't match.
+        """
+        self._pop_from(local_dict()[self._local_key], conf)
+
+    def _pop_from(self, lst, conf):
+        popped = lst.pop()
+        if conf is not None and popped is not conf:
+            raise AssertionError(
+                "The config popped (%s) is not the same as the config "
+                "expected (%s)"
+                % (popped, conf))
+
+    def push_process_config(self, conf):
+        """
+        Like push_thread_config, but applies the configuration to
+        the entire process.
+        """
+        self._process_configs.append(conf)
+
+    def pop_process_config(self, conf=None):
+        self._pop_from(self._process_configs, conf)
+            
+    def __getattr__(self, attr):
+        conf = self.current_conf()
+        if conf is None:
+            raise AttributeError(
+                "No configuration has been registered for this process "
+                "or thread")
+        return getattr(conf, attr)
+
+    def current_conf(self):
+        thread_configs = local_dict().get(self._local_key)
+        if thread_configs:
+            return thread_configs[-1]
+        elif self._process_configs:
+            return self._process_configs[-1]
+        else:
+            return None
+
+    def __getitem__(self, key):
+        # I thought __getattr__ would catch this, but apparently not
+        conf = self.current_conf()
+        if conf is None:
+            raise TypeError(
+                "No configuration has been registered for this process "
+                "or thread")
+        return conf[key]
+
+    def __contains__(self, key):
+        # I thought __getattr__ would catch this, but apparently not
+        return self.has_key(key)
+
+    def __setitem__(self, key, value):
+        # I thought __getattr__ would catch this, but apparently not
+        conf = self.current_conf()
+        conf[key] = value
+
+CONFIG = DispatchingConfig()
+
+class ConfigMiddleware(object):
+
+    """
+    A WSGI middleware that adds a ``paste.config`` key to the request
+    environment, as well as registering the configuration temporarily
+    (for the length of the request) with ``paste.CONFIG``.
+    """
+
+    def __init__(self, application, config):
+        """
+        This delegates all requests to `application`, adding a *copy*
+        of the configuration `config`.
+        """
+        self.application = application
+        self.config = config
+
+    def __call__(self, environ, start_response):
+        global wsgilib
+        if wsgilib is None:
+            import pkg_resources
+            pkg_resources.require('Paste')
+            from paste import wsgilib
+        popped_config = None
+        if 'paste.config' in environ:
+            popped_config = environ['paste.config']        
+        conf = environ['paste.config'] = self.config.copy()
+        app_iter = None
+        CONFIG.push_thread_config(conf)
+        try:
+            app_iter = self.application(environ, start_response)
+        finally:
+            if app_iter is None:
+                # An error occurred...
+                CONFIG.pop_thread_config(conf)
+                if popped_config is not None:
+                    environ['paste.config'] = popped_config
+        if type(app_iter) in (list, tuple):
+            # Because it is a concrete iterator (not a generator) we
+            # know the configuration for this thread is no longer
+            # needed:
+            CONFIG.pop_thread_config(conf)
+            if popped_config is not None:
+                environ['paste.config'] = popped_config
+            return app_iter
+        else:
+            def close_config():
+                CONFIG.pop_thread_config(conf)
+            new_app_iter = wsgilib.add_close(app_iter, close_config)
+            return new_app_iter
+
+def make_config_filter(app, global_conf, **local_conf):
+    conf = global_conf.copy()
+    conf.update(local_conf)
+    return ConfigMiddleware(app, conf)
+
+make_config_middleware = ConfigMiddleware.__doc__
+
+class PrefixMiddleware(object):
+    """Translate a given prefix into a SCRIPT_NAME for the filtered
+    application.
+    
+    PrefixMiddleware provides a way to manually override the root prefix 
+    (SCRIPT_NAME) of your application for certain, rare situations.
+
+    When running an application under a prefix (such as '/james') in 
+    FastCGI/apache, the SCRIPT_NAME environment variable is automatically
+    set to to the appropriate value: '/james'. Pylons' URL generating 
+    functions, such as url_for, always take the SCRIPT_NAME value into account.
+
+    One situation where PrefixMiddleware is required is when an application
+    is accessed via a reverse proxy with a prefix. The application is accessed
+    through the reverse proxy via the the URL prefix '/james', whereas the
+    reverse proxy forwards those requests to the application at the prefix '/'.
+
+    The reverse proxy, being an entirely separate web server, has no way of
+    specifying the SCRIPT_NAME variable; it must be manually set by a
+    PrefixMiddleware instance. Without setting SCRIPT_NAME, url_for will
+    generate URLs such as: '/purchase_orders/1', when it should be
+    generating: '/james/purchase_orders/1'.
+
+    To filter your application through a PrefixMiddleware instance, add the
+    following to the '[app:main]' section of your .ini file:
+    
+    .. code-block:: ini
+        
+        filter-with = proxy-prefix
+
+        [filter:proxy-prefix]
+        use = egg:PasteDeploy#prefix
+        prefix = /james
+
+    The name ``proxy-prefix`` simply acts as an identifier of the filter
+    section; feel free to rename it.
+
+    Also, unless disabled, the ``X-Forwarded-Server`` header will be
+    translated to the ``Host`` header, for cases when that header is
+    lost in the proxying.  Also ``X-Forwarded-Host``, 
+    ``X-Forwarded-Scheme``, and ``X-Forwarded-Proto`` are translated.
+
+    If ``force_port`` is set, SERVER_PORT and HTTP_HOST will be
+    rewritten with the given port.  You can use a number, string (like
+    '80') or the empty string (whatever is the default port for the
+    scheme).  This is useful in situations where there is port
+    forwarding going on, and the server believes itself to be on a
+    different port than what the outside world sees.
+
+    You can also use ``scheme`` to explicitly set the scheme (like
+    ``scheme = https``).
+    """
+    def __init__(self, app, global_conf=None, prefix='/',
+                 translate_forwarded_server=True,
+                 force_port=None, scheme=None):
+        self.app = app
+        self.prefix = prefix.rstrip('/')
+        self.translate_forwarded_server = translate_forwarded_server
+        self.regprefix = re.compile("^%s(.*)$" % self.prefix)
+        self.force_port = force_port
+        self.scheme = scheme
+    
+    def __call__(self, environ, start_response):
+        url = environ['PATH_INFO']
+        url = re.sub(self.regprefix, r'\1', url)
+        if not url: url = '/'
+        environ['PATH_INFO'] = url
+        environ['SCRIPT_NAME'] = self.prefix
+        if self.translate_forwarded_server:
+            if 'HTTP_X_FORWARDED_SERVER' in environ:
+                environ['SERVER_NAME'] = environ['HTTP_HOST'] = environ.pop('HTTP_X_FORWARDED_SERVER').split(',')[0]
+            if 'HTTP_X_FORWARDED_HOST' in environ:
+                environ['HTTP_HOST'] = environ.pop('HTTP_X_FORWARDED_HOST').split(',')[0]
+            if 'HTTP_X_FORWARDED_FOR' in environ:
+                environ['REMOTE_ADDR'] = environ.pop('HTTP_X_FORWARDED_FOR')
+            if 'HTTP_X_FORWARDED_SCHEME' in environ:
+                environ['wsgi.url_scheme'] = environ.pop('HTTP_X_FORWARDED_SCHEME')
+            elif 'HTTP_X_FORWARDED_PROTO' in environ:
+                environ['wsgi.url_scheme'] = environ.pop('HTTP_X_FORWARDED_PROTO')
+        if self.force_port is not None:
+            host = environ.get('HTTP_HOST', '').split(':', 1)[0]
+            if self.force_port:
+                host = '%s:%s' % (host, self.force_port)
+                environ['SERVER_PORT'] = str(self.force_port)
+            else:
+                if environ['wsgi.url_scheme'] == 'http':
+                    port = '80'
+                else:
+                    port = '443'
+                environ['SERVER_PORT'] = port
+            environ['HTTP_HOST'] = host
+        if self.scheme is not None:
+            environ['wsgi.url_scheme'] = self.scheme
+        return self.app(environ, start_response)
+
+def make_prefix_middleware(
+    app, global_conf, prefix='/',
+    translate_forwarded_server=True,
+    force_port=None, scheme=None):
+    from paste.deploy.converters import asbool
+    translate_forwarded_server = asbool(translate_forwarded_server)
+    return PrefixMiddleware(
+        app, prefix=prefix,
+        translate_forwarded_server=translate_forwarded_server,
+        force_port=force_port, scheme=scheme)
+
+make_prefix_middleware.__doc__ = PrefixMiddleware.__doc__
Index: /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/paste/deploy/paster_templates/paste_deploy/+package+/sampleapp.py_tmpl
===================================================================
--- /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/paste/deploy/paster_templates/paste_deploy/+package+/sampleapp.py_tmpl (revision 3)
+++ /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/paste/deploy/paster_templates/paste_deploy/+package+/sampleapp.py_tmpl (revision 3)
@@ -0,0 +1,23 @@
+import cgi
+from paste.deploy import CONFIG
+
+def application(environ, start_response):
+    # Note that usually you wouldn't be writing a pure WSGI
+    # application, you might be using some framework or
+    # environment.  But as an example...
+    start_response('200 OK', [('Content-type', 'text/html')])
+    greeting = CONFIG['greeting']
+    content = [
+        '<html><head><title>%s</title></head>\n' % greeting,
+        '<body><h1>%s!</h1>\n' % greeting,
+        '<table border=1>\n',
+        ]
+    items = environ.items()
+    items.sort()
+    for key, value in items:
+        content.append('<tr><td>%s</td><td>%s</td></tr>\n'
+                        % (key, cgi.escape(repr(value))))
+    content.append('</table></body></html>')
+    return content
+
+                        
Index: /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/paste/deploy/paster_templates/paste_deploy/+package+/wsgiapp.py_tmpl
===================================================================
--- /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/paste/deploy/paster_templates/paste_deploy/+package+/wsgiapp.py_tmpl (revision 3)
+++ /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/paste/deploy/paster_templates/paste_deploy/+package+/wsgiapp.py_tmpl (revision 3)
@@ -0,0 +1,23 @@
+import sampleapp
+from paste.deploy.config import ConfigMiddleware
+
+def make_app(
+    global_conf,
+    # Optional and required configuration parameters
+    # can go here, or just **kw; greeting is required:
+    greeting,
+    **kw):
+    # This is a WSGI application:
+    app = sampleapp.application
+    # Here we merge all the keys into one configuration
+    # dictionary; you don't have to do this, but this
+    # can be convenient later to add ad hoc configuration:
+    conf = global_conf.copy()
+    conf.update(kw)
+    conf['greeting'] = greeting
+    # ConfigMiddleware means that paste.deploy.CONFIG will,
+    # during this request (threadsafe) represent the
+    # configuration dictionary we set up:
+    app = ConfigMiddleware(app, conf)
+    return app
+
Index: /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/paste/deploy/paster_templates/paste_deploy/docs/devel_config.ini_tmpl
===================================================================
--- /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/paste/deploy/paster_templates/paste_deploy/docs/devel_config.ini_tmpl (revision 3)
+++ /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/paste/deploy/paster_templates/paste_deploy/docs/devel_config.ini_tmpl (revision 3)
@@ -0,0 +1,22 @@
+[filter-app:main]
+# This puts the interactive debugger in place:
+use = egg:Paste#evalerror
+next = devel
+
+[app:devel]
+# This application is meant for interactive development
+use = egg:${project}
+debug = true
+# You can add other configuration values:
+greeting = Aloha!
+
+[app:test]
+# While this version of the configuration is for non-iteractive
+# tests (unit tests)
+use = devel
+
+[server:main]
+use = egg:Paste#http
+# Change to 0.0.0.0 to make public:
+host = 127.0.0.1
+port = 8080
Index: /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/paste/deploy/util/__init__.py
===================================================================
--- /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/paste/deploy/util/__init__.py (revision 3)
+++ /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/paste/deploy/util/__init__.py (revision 3)
@@ -0,0 +1,3 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+#
Index: /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/paste/deploy/util/threadinglocal.py
===================================================================
--- /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/paste/deploy/util/threadinglocal.py (revision 3)
+++ /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/paste/deploy/util/threadinglocal.py (revision 3)
@@ -0,0 +1,39 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+
+try:
+    import threading
+except ImportError:
+    # No threads, so "thread local" means process-global
+    class local(object):
+        pass
+else:
+    try:
+        local = threading.local
+    except AttributeError:
+        # Added in 2.4, but now we'll have to define it ourselves
+        import thread
+        class local(object):
+
+            def __init__(self):
+                self.__dict__['__objs'] = {}
+
+            def __getattr__(self, attr, g=thread.get_ident):
+                try:
+                    return self.__dict__['__objs'][g()][attr]
+                except KeyError:
+                    raise AttributeError(
+                        "No variable %s defined for the thread %s"
+                        % (attr, g()))
+
+            def __setattr__(self, attr, value, g=thread.get_ident):
+                self.__dict__['__objs'].setdefault(g(), {})[attr] = value
+
+            def __delattr__(self, attr, g=thread.get_ident):
+                try:
+                    del self.__dict__['__objs'][g()][attr]
+                except KeyError:
+                    raise AttributeError(
+                        "No variable %s defined for thread %s"
+                        % (attr, g()))
+
Index: /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/paste/deploy/util/fixtypeerror.py
===================================================================
--- /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/paste/deploy/util/fixtypeerror.py (revision 3)
+++ /galaxy-central/eggs/PasteDeploy-1.3.3-py2.6.egg/paste/deploy/util/fixtypeerror.py (revision 3)
@@ -0,0 +1,61 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+"""
+Fixes the vague error message that you get when calling a function
+with the wrong arguments.
+"""
+import inspect
+import sys
+
+def fix_type_error(exc_info, callable, varargs, kwargs):
+    """
+    Given an exception, this will test if the exception was due to a
+    signature error, and annotate the error with better information if
+    so.
+    
+    Usage::
+
+      try:
+          val = callable(*args, **kw)
+      except TypeError:
+          exc_info = fix_type_error(None, callable, args, kw)
+          raise exc_info[0], exc_info[1], exc_info[2]
+    """
+    if exc_info is None:
+        exc_info = sys.exc_info()
+    if (exc_info[0] != TypeError
+        or str(exc_info[1]).find('arguments') == -1
+        or getattr(exc_info[1], '_type_error_fixed', False)):
+        return exc_info
+    exc_info[1]._type_error_fixed = True
+    import inspect
+    argspec = inspect.formatargspec(*inspect.getargspec(callable))
+    args = ', '.join(map(_short_repr, varargs))
+    if kwargs and args:
+        args += ', '
+    if kwargs:
+        kwargs = kwargs.items()
+        kwargs.sort()
+        args += ', '.join(['%s=...' % n for n, v in kwargs])
+    gotspec = '(%s)' % args
+    msg = '%s; got %s, wanted %s' % (exc_info[1], gotspec, argspec)
+    exc_info[1].args = (msg,)
+    return exc_info
+
+def _short_repr(v):
+    v = repr(v)
+    if len(v) > 12:
+        v = v[:8]+'...'+v[-4:]
+    return v
+
+def fix_call(callable, *args, **kw):
+    """
+    Call ``callable(*args, **kw)`` fixing any type errors that come
+    out.
+    """
+    try:
+        val = callable(*args, **kw)
+    except TypeError:
+        exc_info = fix_type_error(None, callable, args, kw)
+        raise exc_info[0], exc_info[1], exc_info[2]
+    return val
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/SettingsManager.py
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/SettingsManager.py (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/SettingsManager.py (revision 3)
@@ -0,0 +1,292 @@
+import sys
+import os.path
+import copy as copyModule
+from ConfigParser import ConfigParser 
+import re
+from tokenize import Intnumber, Floatnumber, Number
+from types import *
+import types
+import new
+import time
+from StringIO import StringIO # not cStringIO because of unicode support
+import imp                 # used by SettingsManager.updateSettingsFromPySrcFile()
+
+
+numberRE = re.compile(Number)
+complexNumberRE = re.compile('[\(]*' +Number + r'[ \t]*\+[ \t]*' + Number + '[\)]*')
+
+convertableToStrTypes = (StringType, IntType, FloatType,
+                         LongType, ComplexType, NoneType,
+                         UnicodeType)
+
+##################################################
+## FUNCTIONS ##
+
+def mergeNestedDictionaries(dict1, dict2, copy=False, deepcopy=False):
+    """Recursively merge the values of dict2 into dict1.
+
+    This little function is very handy for selectively overriding settings in a
+    settings dictionary that has a nested structure.
+    """
+
+    if copy:
+        dict1 = copyModule.copy(dict1)
+    elif deepcopy:
+        dict1 = copyModule.deepcopy(dict1)
+        
+    for key,val in dict2.items():
+        if dict1.has_key(key) and type(val) == types.DictType and \
+           type(dict1[key]) == types.DictType:
+            
+            dict1[key] = mergeNestedDictionaries(dict1[key], val)
+        else:
+            dict1[key] = val
+    return dict1
+    
+def stringIsNumber(S):
+    """Return True if theString represents a Python number, False otherwise.
+    This also works for complex numbers and numbers with +/- in front."""
+
+    S = S.strip()
+    
+    if S[0] in '-+' and len(S) > 1:
+        S = S[1:].strip()
+    
+    match = complexNumberRE.match(S)
+    if not match:
+        match = numberRE.match(S)
+    if not match or (match.end() != len(S)):
+        return False
+    else:
+        return True
+        
+def convStringToNum(theString):
+    """Convert a string representation of a Python number to the Python version"""
+    
+    if not stringIsNumber(theString):
+        raise Error(theString + ' cannot be converted to a Python number')
+    return eval(theString, {}, {})
+
+
+class Error(Exception):
+    pass
+
+class NoDefault(object):
+    pass
+
+class ConfigParserCaseSensitive(ConfigParser):
+    """A case sensitive version of the standard Python ConfigParser."""
+    
+    def optionxform(self, optionstr):
+        """Don't change the case as is done in the default implemenation."""
+        return optionstr
+
+class _SettingsCollector(object):
+    """An abstract base class that provides the methods SettingsManager uses to
+    collect settings from config files and strings.
+
+    This class only collects settings it doesn't modify the _settings dictionary
+    of SettingsManager instances in any way.
+    """
+
+    _ConfigParserClass = ConfigParserCaseSensitive 
+
+    def readSettingsFromModule(self, mod, ignoreUnderscored=True):
+        """Returns all settings from a Python module.
+        """
+        S = {}
+        attrs = vars(mod)
+        for k, v in attrs.items():
+            if (ignoreUnderscored and k.startswith('_')):
+                continue
+            else:
+                S[k] = v
+        return S
+        
+    def readSettingsFromPySrcStr(self, theString):
+        """Return a dictionary of the settings in a Python src string."""
+
+        globalsDict = {'True':(1==1),
+                       'False':(0==1),
+                       }
+        newSettings = {'self':self}
+        exec (theString+os.linesep) in globalsDict, newSettings        
+        del newSettings['self']
+        module = new.module('temp_settings_module')
+        module.__dict__.update(newSettings)
+        return self.readSettingsFromModule(module)
+
+    def readSettingsFromConfigFileObj(self, inFile, convert=True):
+        """Return the settings from a config file that uses the syntax accepted by
+        Python's standard ConfigParser module (like Windows .ini files).
+
+        NOTE:
+        this method maintains case unlike the ConfigParser module, unless this
+        class was initialized with the 'caseSensitive' keyword set to False.
+
+        All setting values are initially parsed as strings. However, If the
+        'convert' arg is True this method will do the following value
+        conversions:
+        
+        * all Python numeric literals will be coverted from string to number
+        
+        * The string 'None' will be converted to the Python value None
+        
+        * The string 'True' will be converted to a Python truth value
+        
+        * The string 'False' will be converted to a Python false value
+        
+        * Any string starting with 'python:' will be treated as a Python literal
+          or expression that needs to be eval'd. This approach is useful for
+          declaring lists and dictionaries.
+
+        If a config section titled 'Globals' is present the options defined
+        under it will be treated as top-level settings.        
+        """
+        
+        p = self._ConfigParserClass()
+        p.readfp(inFile)
+        sects = p.sections()
+        newSettings = {}
+
+        sects = p.sections()
+        newSettings = {}
+        
+        for s in sects:
+            newSettings[s] = {}
+            for o in p.options(s):
+                if o != '__name__':
+                    newSettings[s][o] = p.get(s,o)
+
+        ## loop through new settings -> deal with global settings, numbers,
+        ## booleans and None ++ also deal with 'importSettings' commands
+
+        for sect, subDict in newSettings.items():
+            for key, val in subDict.items():
+                if convert:
+                    if val.lower().startswith('python:'):
+                        subDict[key] = eval(val[7:],{},{})
+                    if val.lower() == 'none':
+                        subDict[key] = None
+                    if val.lower() == 'true':
+                        subDict[key] = True
+                    if val.lower() == 'false':
+                        subDict[key] = False
+                    if stringIsNumber(val):
+                        subDict[key] = convStringToNum(val)
+                        
+                ## now deal with any 'importSettings' commands
+                if key.lower() == 'importsettings':
+                    if val.find(';') < 0:
+                        importedSettings = self.readSettingsFromPySrcFile(val)
+                    else:
+                        path = val.split(';')[0]
+                        rest = ''.join(val.split(';')[1:]).strip()
+                        parentDict = self.readSettingsFromPySrcFile(path)
+                        importedSettings = eval('parentDict["' + rest + '"]')
+                        
+                    subDict.update(mergeNestedDictionaries(subDict,
+                                                           importedSettings))
+                        
+            if sect.lower() == 'globals':
+                newSettings.update(newSettings[sect])
+                del newSettings[sect]
+                
+        return newSettings
+
+
+class SettingsManager(_SettingsCollector):
+    """A mixin class that provides facilities for managing application settings.
+    
+    SettingsManager is designed to work well with nested settings dictionaries
+    of any depth.
+    """
+
+    def __init__(self):
+        super(SettingsManager, self).__init__()
+        self._settings = {}
+        self._initializeSettings()
+
+    def _defaultSettings(self):
+        return {}
+    
+    def _initializeSettings(self):
+        """A hook that allows for complex setting initialization sequences that
+        involve references to 'self' or other settings.  For example:
+              self._settings['myCalcVal'] = self._settings['someVal'] * 15        
+        This method should be called by the class' __init__() method when needed.       
+        The dummy implementation should be reimplemented by subclasses.
+        """
+        
+        pass 
+
+    ## core post startup methods
+
+    def setting(self, name, default=NoDefault):
+        """Get a setting from self._settings, with or without a default value."""
+        
+        if default is NoDefault:
+            return self._settings[name]
+        else:
+            return self._settings.get(name, default)
+
+
+    def hasSetting(self, key):
+        """True/False"""
+        return key in self._settings
+
+    def setSetting(self, name, value):
+        """Set a setting in self._settings."""
+        self._settings[name] = value
+
+    def settings(self):
+        """Return a reference to the settings dictionary"""
+        return self._settings
+        
+    def copySettings(self):
+        """Returns a shallow copy of the settings dictionary"""
+        return copyModule.copy(self._settings)
+
+    def deepcopySettings(self):
+        """Returns a deep copy of the settings dictionary"""
+        return copyModule.deepcopy(self._settings)
+    
+    def updateSettings(self, newSettings, merge=True):
+        """Update the settings with a selective merge or a complete overwrite."""
+        
+        if merge:
+            mergeNestedDictionaries(self._settings, newSettings)
+        else:
+            self._settings.update(newSettings)
+
+
+    ## source specific update methods
+
+    def updateSettingsFromPySrcStr(self, theString, merge=True):
+        """Update the settings from a code in a Python src string."""
+        
+        newSettings = self.readSettingsFromPySrcStr(theString)
+        self.updateSettings(newSettings,
+                            merge=newSettings.get('mergeSettings',merge) )
+        
+    
+    def updateSettingsFromConfigFileObj(self, inFile, convert=True, merge=True):
+        """See the docstring for .updateSettingsFromConfigFile()
+
+        The caller of this method is responsible for closing the inFile file
+        object."""
+
+        newSettings = self.readSettingsFromConfigFileObj(inFile, convert=convert)
+        self.updateSettings(newSettings,
+                            merge=newSettings.get('mergeSettings',merge))
+
+    def updateSettingsFromConfigStr(self, configStr, convert=True, merge=True):
+        """See the docstring for .updateSettingsFromConfigFile()
+        """
+
+        configStr = '[globals]\n' + configStr
+        inFile = StringIO(configStr)
+        newSettings = self.readSettingsFromConfigFileObj(inFile, convert=convert)
+        self.updateSettings(newSettings,
+                            merge=newSettings.get('mergeSettings',merge))
+
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Parser.py
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Parser.py (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Parser.py (revision 3)
@@ -0,0 +1,2662 @@
+# $Id: Parser.py,v 1.137 2008/03/10 05:25:13 tavis_rudd Exp $
+"""Parser classes for Cheetah's Compiler
+
+Classes:
+  ParseError( Exception )
+  _LowLevelParser( Cheetah.SourceReader.SourceReader ), basically a lexer
+  _HighLevelParser( _LowLevelParser )
+  Parser === _HighLevelParser (an alias)
+
+Meta-Data
+================================================================================
+Author: Tavis Rudd <tavis@damnsimple.com>
+Version: $Revision: 1.137 $
+Start Date: 2001/08/01
+Last Revision Date: $Date: 2008/03/10 05:25:13 $
+"""
+__author__ = "Tavis Rudd <tavis@damnsimple.com>"
+__revision__ = "$Revision: 1.137 $"[11:-2]
+
+import os
+import sys
+import re
+from re import DOTALL, MULTILINE
+from types import StringType, ListType, TupleType, ClassType, TypeType
+import time
+from tokenize import pseudoprog
+import inspect
+import new
+import traceback
+
+from Cheetah.SourceReader import SourceReader
+from Cheetah import Filters
+from Cheetah import ErrorCatchers
+from Cheetah.Unspecified import Unspecified
+from Cheetah.Macros.I18n import I18n
+
+# re tools
+_regexCache = {}
+def cachedRegex(pattern):
+    if pattern not in _regexCache:
+        _regexCache[pattern] = re.compile(pattern)
+    return _regexCache[pattern]
+
+def escapeRegexChars(txt,
+                     escapeRE=re.compile(r'([\$\^\*\+\.\?\{\}\[\]\(\)\|\\])')):
+    
+    """Return a txt with all special regular expressions chars escaped."""
+    
+    return escapeRE.sub(r'\\\1' , txt)
+
+def group(*choices): return '(' + '|'.join(choices) + ')'
+def nongroup(*choices): return '(?:' + '|'.join(choices) + ')'
+def namedGroup(name, *choices): return '(P:<' + name +'>' + '|'.join(choices) + ')'
+def any(*choices): return apply(group, choices) + '*'
+def maybe(*choices): return apply(group, choices) + '?'
+
+##################################################
+## CONSTANTS & GLOBALS ##
+
+NO_CACHE = 0
+STATIC_CACHE = 1
+REFRESH_CACHE = 2
+
+SET_LOCAL = 0
+SET_GLOBAL = 1
+SET_MODULE = 2
+
+##################################################
+## Tokens for the parser ##
+
+#generic
+identchars = "abcdefghijklmnopqrstuvwxyz" \
+            "ABCDEFGHIJKLMNOPQRSTUVWXYZ_"
+namechars = identchars + "0123456789"
+
+#operators
+powerOp = '**'
+unaryArithOps = ('+', '-', '~')
+binaryArithOps = ('+', '-', '/', '//','%')
+shiftOps = ('>>','<<')
+bitwiseOps = ('&','|','^')
+assignOp = '='
+augAssignOps = ('+=','-=','/=','*=', '**=','^=','%=',
+          '>>=','<<=','&=','|=', )
+assignmentOps = (assignOp,) + augAssignOps
+
+compOps = ('<','>','==','!=','<=','>=', '<>', 'is', 'in',)
+booleanOps = ('and','or','not')
+operators = (powerOp,) + unaryArithOps + binaryArithOps \
+            + shiftOps + bitwiseOps + assignmentOps \
+            + compOps + booleanOps
+
+delimeters = ('(',')','{','}','[',']',
+              ',','.',':',';','=','`') + augAssignOps
+
+
+keywords = ('and',       'del',       'for',       'is',        'raise',
+            'assert',    'elif',      'from',      'lambda',    'return',
+            'break',     'else',      'global',    'not',       'try',   
+            'class',     'except',    'if',        'or',        'while',
+            'continue',  'exec',      'import',    'pass',
+            'def',       'finally',   'in',        'print',
+            )
+
+single3 = "'''"
+double3 = '"""'
+
+tripleQuotedStringStarts =  ("'''", '"""', 
+                             "r'''", 'r"""', "R'''", 'R"""',
+                             "u'''", 'u"""', "U'''", 'U"""',
+                             "ur'''", 'ur"""', "Ur'''", 'Ur"""',
+                             "uR'''", 'uR"""', "UR'''", 'UR"""')
+
+tripleQuotedStringPairs = {"'''": single3, '"""': double3,
+                           "r'''": single3, 'r"""': double3,
+                           "u'''": single3, 'u"""': double3,
+                           "ur'''": single3, 'ur"""': double3,
+                           "R'''": single3, 'R"""': double3,
+                           "U'''": single3, 'U"""': double3,
+                           "uR'''": single3, 'uR"""': double3,
+                           "Ur'''": single3, 'Ur"""': double3,
+                           "UR'''": single3, 'UR"""': double3,
+                           }
+
+closurePairs= {')':'(',']':'[','}':'{'}
+closurePairsRev= {'(':')','[':']','{':'}'}
+
+##################################################
+## Regex chunks for the parser ##
+
+tripleQuotedStringREs = {}
+def makeTripleQuoteRe(start, end):
+    start = escapeRegexChars(start)
+    end = escapeRegexChars(end)
+    return re.compile(r'(?:' + start + r').*?' + r'(?:' + end + r')', re.DOTALL)
+
+for start, end in tripleQuotedStringPairs.items():
+    tripleQuotedStringREs[start] = makeTripleQuoteRe(start, end)
+
+WS = r'[ \f\t]*'  
+EOL = r'\r\n|\n|\r'
+EOLZ = EOL + r'|\Z'
+escCharLookBehind = nongroup(r'(?<=\A)',r'(?<!\\)')
+nameCharLookAhead = r'(?=[A-Za-z_])'
+identRE=re.compile(r'[a-zA-Z_][a-zA-Z_0-9]*')
+EOLre=re.compile(r'(?:\r\n|\r|\n)')
+
+specialVarRE=re.compile(r'([a-zA-z_]+)@') # for matching specialVar comments
+# e.g. ##author@ Tavis Rudd
+
+unicodeDirectiveRE = re.compile(
+    r'(?:^|\r\n|\r|\n)\s*#\s{0,5}unicode[:\s]*([-\w.]*)\s*(?:\r\n|\r|\n)', re.MULTILINE)
+encodingDirectiveRE = re.compile(
+    r'(?:^|\r\n|\r|\n)\s*#\s{0,5}encoding[:\s]*([-\w.]*)\s*(?:\r\n|\r|\n)', re.MULTILINE)
+
+escapedNewlineRE = re.compile(r'(?<!\\)\\n')
+
+directiveNamesAndParsers = {
+    # importing and inheritance
+    'import':None,
+    'from':None,
+    'extends': 'eatExtends',
+    'implements': 'eatImplements',
+    'super': 'eatSuper',
+
+    # output, filtering, and caching
+    'slurp': 'eatSlurp',
+    'raw': 'eatRaw',
+    'include': 'eatInclude',
+    'cache': 'eatCache',
+    'filter': 'eatFilter',
+    'echo': None,
+    'silent': None,
+    'transform' : 'eatTransform',
+    
+    'call': 'eatCall',
+    'arg': 'eatCallArg',
+    
+    'capture': 'eatCapture',
+    
+    # declaration, assignment, and deletion
+    'attr': 'eatAttr',
+    'def': 'eatDef',
+    'block': 'eatBlock',
+    '@': 'eatDecorator',
+    'defmacro': 'eatDefMacro',
+    
+    'closure': 'eatClosure',
+    
+    'set': 'eatSet',
+    'del': None,
+    
+    # flow control
+    'if': 'eatIf',
+    'while': None,
+    'for': None,
+    'else': None,
+    'elif': None,
+    'pass': None,
+    'break': None,
+    'continue': None,
+    'stop': None,
+    'return': None,
+    'yield': None,
+    
+    # little wrappers
+    'repeat': None,
+    'unless': None,
+    
+    # error handling
+    'assert': None,
+    'raise': None,
+    'try': None,
+    'except': None,
+    'finally': None,
+    'errorCatcher': 'eatErrorCatcher',
+    
+    # intructions to the parser and compiler
+    'breakpoint': 'eatBreakPoint',
+    'compiler': 'eatCompiler',
+    'compiler-settings': 'eatCompilerSettings',
+    
+    # misc
+    'shBang': 'eatShbang',
+    'encoding': 'eatEncoding',
+    
+    'end': 'eatEndDirective',
+    }
+
+endDirectiveNamesAndHandlers = {
+    'def': 'handleEndDef',      # has short-form
+    'block': None,              # has short-form
+    'closure': None,            # has short-form
+    'cache': None,              # has short-form
+    'call': None,               # has short-form
+    'capture': None,            # has short-form
+    'filter': None,
+    'errorCatcher':None,            
+    'while': None,              # has short-form
+    'for': None,                # has short-form
+    'if': None,                 # has short-form
+    'try': None,                # has short-form
+    'repeat': None,             # has short-form
+    'unless': None,             # has short-form
+    }
+
+##################################################
+## CLASSES ##
+
+# @@TR: SyntaxError doesn't call exception.__str__ for some reason!
+#class ParseError(SyntaxError):
+class ParseError(ValueError):
+    def __init__(self, stream, msg='Invalid Syntax', extMsg='', lineno=None, col=None):
+        self.stream = stream
+        if stream.pos() >= len(stream):
+            stream.setPos(len(stream) -1)
+        self.msg = msg
+        self.extMsg = extMsg
+        self.lineno = lineno
+        self.col = col
+        
+    def __str__(self):
+        return self.report()
+
+    def report(self):
+        stream = self.stream
+        if stream.filename():
+            f = " in file %s" % stream.filename()
+        else:
+            f = ''
+        report = ''
+        if self.lineno:
+            lineno = self.lineno
+            row, col, line = (lineno, (self.col or 0),
+                              self.stream.splitlines()[lineno-1])
+        else:
+            row, col, line = self.stream.getRowColLine()
+
+        ## get the surrounding lines
+        lines = stream.splitlines()
+        prevLines = []                  # (rowNum, content)
+        for i in range(1,4):
+            if row-1-i <=0:
+                break
+            prevLines.append( (row-i,lines[row-1-i]) )
+
+        nextLines = []                  # (rowNum, content)
+        for i in range(1,4):
+            if not row-1+i < len(lines):
+                break
+            nextLines.append( (row+i,lines[row-1+i]) )
+        nextLines.reverse()
+        
+        ## print the main message
+        report += "\n\n%s\n" %self.msg
+        report += "Line %i, column %i%s\n\n" % (row, col, f)
+        report += 'Line|Cheetah Code\n'
+        report += '----|-------------------------------------------------------------\n'
+        while prevLines:
+            lineInfo = prevLines.pop()
+            report += "%(row)-4d|%(line)s\n"% {'row':lineInfo[0], 'line':lineInfo[1]}
+        report += "%(row)-4d|%(line)s\n"% {'row':row, 'line':line}
+        report += ' '*5 +' '*(col-1) + "^\n"
+        
+        while nextLines:
+            lineInfo = nextLines.pop()
+            report += "%(row)-4d|%(line)s\n"% {'row':lineInfo[0], 'line':lineInfo[1]}
+        ## add the extra msg
+        if self.extMsg:
+            report += self.extMsg + '\n'
+            
+        return report
+
+class ForbiddenSyntax(ParseError): pass
+class ForbiddenExpression(ForbiddenSyntax): pass
+class ForbiddenDirective(ForbiddenSyntax): pass
+
+class CheetahVariable:
+    def __init__(self, nameChunks, useNameMapper=True, cacheToken=None,
+                 rawSource=None):
+        self.nameChunks = nameChunks
+        self.useNameMapper = useNameMapper
+        self.cacheToken = cacheToken
+        self.rawSource = rawSource
+        
+class Placeholder(CheetahVariable): pass
+
+class ArgList:
+    """Used by _LowLevelParser.getArgList()"""
+
+    def __init__(self):
+        self.argNames = []
+        self.defVals = []
+        self.i = 0
+
+    def addArgName(self, name):
+        self.argNames.append( name )
+        self.defVals.append( None )
+
+    def next(self):
+        self.i += 1
+
+    def addToDefVal(self, token):
+        i = self.i
+        if self.defVals[i] == None:
+            self.defVals[i] = ''
+        self.defVals[i] += token
+    
+    def merge(self):
+        defVals = self.defVals
+        for i in range(len(defVals)):
+            if type(defVals[i]) == StringType:
+                defVals[i] = defVals[i].strip()
+                
+        return map(None, [i.strip() for i in self.argNames], defVals)
+    
+    def __str__(self):
+        return str(self.merge())
+    
+class _LowLevelParser(SourceReader):
+    """This class implements the methods to match or extract ('get*') the basic
+    elements of Cheetah's grammar.  It does NOT handle any code generation or
+    state management.
+    """
+
+    _settingsManager = None
+
+    def setSettingsManager(self, settingsManager):
+        self._settingsManager = settingsManager
+        
+    def setting(self, key, default=Unspecified):
+        if default is Unspecified:
+            return self._settingsManager.setting(key)
+        else:
+            return self._settingsManager.setting(key, default=default)
+        
+    def setSetting(self, key, val):
+        self._settingsManager.setSetting(key, val)
+
+    def settings(self):
+        return self._settingsManager.settings()
+        
+    def updateSettings(self, settings):
+        self._settingsManager.updateSettings(settings)
+
+    def _initializeSettings(self): 
+        self._settingsManager._initializeSettings()
+    
+    def configureParser(self):
+        """Is called by the Compiler instance after the parser has had a
+        settingsManager assigned with self.setSettingsManager() 
+        """
+        self._makeCheetahVarREs()
+        self._makeCommentREs()
+        self._makeDirectiveREs()
+        self._makePspREs()
+        self._possibleNonStrConstantChars = (
+            self.setting('commentStartToken')[0] +
+            self.setting('multiLineCommentStartToken')[0] + 
+            self.setting('cheetahVarStartToken')[0] +
+            self.setting('directiveStartToken')[0] +
+            self.setting('PSPStartToken')[0])
+        self._nonStrConstMatchers = [
+            self.matchCommentStartToken,
+            self.matchMultiLineCommentStartToken,
+            self.matchVariablePlaceholderStart,
+            self.matchExpressionPlaceholderStart,
+            self.matchDirective,
+            self.matchPSPStartToken,
+            self.matchEOLSlurpToken,
+            ]
+
+    ## regex setup ##
+
+    def _makeCheetahVarREs(self):
+        
+        """Setup the regexs for Cheetah $var parsing."""
+
+        num = r'[0-9\.]+'
+        interval =   (r'(?P<interval>' + 
+                      num + r's|' +
+                      num + r'm|' +
+                      num + r'h|' +
+                      num + r'd|' +
+                      num + r'w|' +
+                      num + ')' 
+                      )
+    
+        cacheToken = (r'(?:' +
+                      r'(?P<REFRESH_CACHE>\*' + interval + '\*)'+
+                      '|' +
+                      r'(?P<STATIC_CACHE>\*)' +
+                      '|' +                      
+                      r'(?P<NO_CACHE>)' +
+                      ')')
+        self.cacheTokenRE = cachedRegex(cacheToken)
+
+        silentPlaceholderToken = (r'(?:' +
+                                  r'(?P<SILENT>' +escapeRegexChars('!')+')'+
+                                  '|' +
+                                  r'(?P<NOT_SILENT>)' +
+                                  ')')
+        self.silentPlaceholderTokenRE = cachedRegex(silentPlaceholderToken)
+        
+        self.cheetahVarStartRE = cachedRegex(
+            escCharLookBehind +
+            r'(?P<startToken>'+escapeRegexChars(self.setting('cheetahVarStartToken'))+')'+
+            r'(?P<silenceToken>'+silentPlaceholderToken+')'+
+            r'(?P<cacheToken>'+cacheToken+')'+
+            r'(?P<enclosure>|(?:(?:\{|\(|\[)[ \t\f]*))' + # allow WS after enclosure
+            r'(?=[A-Za-z_])')
+        validCharsLookAhead = r'(?=[A-Za-z_\*!\{\(\[])'
+        self.cheetahVarStartToken = self.setting('cheetahVarStartToken')
+        self.cheetahVarStartTokenRE = cachedRegex(
+            escCharLookBehind +
+            escapeRegexChars(self.setting('cheetahVarStartToken'))
+            +validCharsLookAhead
+            )
+
+        self.cheetahVarInExpressionStartTokenRE = cachedRegex(
+            escapeRegexChars(self.setting('cheetahVarStartToken'))
+            +r'(?=[A-Za-z_])'
+            )
+
+        self.expressionPlaceholderStartRE = cachedRegex(
+            escCharLookBehind +
+            r'(?P<startToken>' + escapeRegexChars(self.setting('cheetahVarStartToken')) + ')' +
+            r'(?P<cacheToken>' + cacheToken + ')' +
+            #r'\[[ \t\f]*'
+            r'(?:\{|\(|\[)[ \t\f]*'
+            + r'(?=[^\)\}\]])'
+            )
+
+        if self.setting('EOLSlurpToken'):
+            self.EOLSlurpRE = cachedRegex(
+                escapeRegexChars(self.setting('EOLSlurpToken'))
+                + r'[ \t\f]*'
+                + r'(?:'+EOL+')'
+                )
+        else:
+            self.EOLSlurpRE = None
+
+
+    def _makeCommentREs(self):
+        """Construct the regex bits that are used in comment parsing."""
+        startTokenEsc = escapeRegexChars(self.setting('commentStartToken'))
+        self.commentStartTokenRE = cachedRegex(escCharLookBehind + startTokenEsc)
+        del startTokenEsc
+        
+        startTokenEsc = escapeRegexChars(
+            self.setting('multiLineCommentStartToken'))
+        endTokenEsc = escapeRegexChars(
+            self.setting('multiLineCommentEndToken'))
+        self.multiLineCommentTokenStartRE = cachedRegex(escCharLookBehind +
+                                                       startTokenEsc)
+        self.multiLineCommentEndTokenRE = cachedRegex(escCharLookBehind +
+                                                     endTokenEsc)
+        
+    def _makeDirectiveREs(self):
+        """Construct the regexs that are used in directive parsing."""
+        startToken = self.setting('directiveStartToken')
+        endToken = self.setting('directiveEndToken')
+        startTokenEsc = escapeRegexChars(startToken)
+        endTokenEsc = escapeRegexChars(endToken)
+        validSecondCharsLookAhead = r'(?=[A-Za-z_@])'
+        reParts = [escCharLookBehind, startTokenEsc]
+        if self.setting('allowWhitespaceAfterDirectiveStartToken'):
+            reParts.append('[ \t]*')
+        reParts.append(validSecondCharsLookAhead)
+        self.directiveStartTokenRE = cachedRegex(''.join(reParts))
+        self.directiveEndTokenRE = cachedRegex(escCharLookBehind + endTokenEsc)
+
+    def _makePspREs(self):
+        """Setup the regexs for PSP parsing."""
+        startToken = self.setting('PSPStartToken')
+        startTokenEsc = escapeRegexChars(startToken)
+        self.PSPStartTokenRE = cachedRegex(escCharLookBehind + startTokenEsc)
+        endToken = self.setting('PSPEndToken')
+        endTokenEsc = escapeRegexChars(endToken)
+        self.PSPEndTokenRE = cachedRegex(escCharLookBehind + endTokenEsc)
+
+
+    def isLineClearToStartToken(self, pos=None):
+        return self.isLineClearToPos(pos)
+
+    def matchTopLevelToken(self):
+        """Returns the first match found from the following methods:
+            self.matchCommentStartToken
+            self.matchMultiLineCommentStartToken
+            self.matchVariablePlaceholderStart
+            self.matchExpressionPlaceholderStart
+            self.matchDirective
+            self.matchPSPStartToken
+            self.matchEOLSlurpToken
+
+        Returns None if no match.
+        """
+        match = None
+        if self.peek() in self._possibleNonStrConstantChars:
+            for matcher in self._nonStrConstMatchers:
+                match = matcher()
+                if match:
+                    break
+        return match
+
+    def matchPyToken(self):
+        match = pseudoprog.match(self.src(), self.pos())
+        
+        if match and match.group() in tripleQuotedStringStarts:
+            TQSmatch = tripleQuotedStringREs[match.group()].match(self.src(), self.pos())
+            if TQSmatch:
+                return TQSmatch
+        return match
+        
+    def getPyToken(self):
+        match = self.matchPyToken()
+        if match is None:
+            raise ParseError(self)
+        elif match.group() in tripleQuotedStringStarts:
+            raise ParseError(self, msg='Malformed triple-quoted string')
+        return self.readTo(match.end())
+
+    def matchEOLSlurpToken(self):
+        if self.EOLSlurpRE:
+            return self.EOLSlurpRE.match(self.src(), self.pos())
+
+    def getEOLSlurpToken(self):
+        match = self.matchEOLSlurpToken()
+        if not match:
+            raise ParseError(self, msg='Invalid EOL slurp token')
+        return self.readTo(match.end())
+
+    def matchCommentStartToken(self):
+        return self.commentStartTokenRE.match(self.src(), self.pos())
+    
+    def getCommentStartToken(self):
+        match = self.matchCommentStartToken()
+        if not match:
+            raise ParseError(self, msg='Invalid single-line comment start token')
+        return self.readTo(match.end())
+
+    def matchMultiLineCommentStartToken(self):
+        return self.multiLineCommentTokenStartRE.match(self.src(), self.pos())
+    
+    def getMultiLineCommentStartToken(self):
+        match = self.matchMultiLineCommentStartToken()
+        if not match:
+            raise ParseError(self, msg='Invalid multi-line comment start token')
+        return self.readTo(match.end())
+
+    def matchMultiLineCommentEndToken(self):
+        return self.multiLineCommentEndTokenRE.match(self.src(), self.pos())
+    
+    def getMultiLineCommentEndToken(self):
+        match = self.matchMultiLineCommentEndToken()
+        if not match:
+            raise ParseError(self, msg='Invalid multi-line comment end token')
+        return self.readTo(match.end())
+
+    def getCommaSeparatedSymbols(self):
+        """
+            Loosely based on getDottedName to pull out comma separated
+            named chunks
+        """
+        srcLen = len(self)
+        pieces = []
+        nameChunks = []
+
+        if not self.peek() in identchars:
+            raise ParseError(self)
+    
+        while self.pos() < srcLen:
+            c = self.peek()
+            if c in namechars:
+                nameChunk = self.getIdentifier()
+                nameChunks.append(nameChunk)
+            elif c == '.':
+                if self.pos()+1 <srcLen and self.peek(1) in identchars:
+                    nameChunks.append(self.getc())
+                else:
+                    break
+            elif c == ',':
+                self.getc()
+                pieces.append(''.join(nameChunks))
+                nameChunks = []
+            elif c in (' ', '\t'):
+                self.getc()
+            else:
+                break
+
+        if nameChunks:
+            pieces.append(''.join(nameChunks))
+
+        return pieces
+    
+    def getDottedName(self):
+        srcLen = len(self)
+        nameChunks = []
+        
+        if not self.peek() in identchars:
+            raise ParseError(self)
+    
+        while self.pos() < srcLen:
+            c = self.peek()
+            if c in namechars:
+                nameChunk = self.getIdentifier()
+                nameChunks.append(nameChunk)
+            elif c == '.':
+                if self.pos()+1 <srcLen and self.peek(1) in identchars:
+                    nameChunks.append(self.getc())
+                else:
+                    break
+            else:
+                break
+
+        return ''.join(nameChunks)
+
+    def matchIdentifier(self):
+        return identRE.match(self.src(), self.pos())
+    
+    def getIdentifier(self):
+        match = self.matchIdentifier()
+        if not match:
+            raise ParseError(self, msg='Invalid identifier')
+        return self.readTo(match.end())
+
+    def matchOperator(self):
+        match = self.matchPyToken()
+        if match and match.group() not in operators:
+            match = None
+        return match
+
+    def getOperator(self):
+        match = self.matchOperator()
+        if not match:
+            raise ParseError(self, msg='Expected operator')
+        return self.readTo( match.end() )
+
+    def matchAssignmentOperator(self):
+        match = self.matchPyToken()
+        if match and match.group() not in assignmentOps:
+            match = None
+        return match
+        
+    def getAssignmentOperator(self):
+        match = self.matchAssignmentOperator()
+        if not match:
+            raise ParseError(self, msg='Expected assignment operator')
+        return self.readTo( match.end() )
+
+    def matchDirective(self):
+        """Returns False or the name of the directive matched.
+        """
+        startPos = self.pos()
+        if not self.matchDirectiveStartToken():
+            return False
+        self.getDirectiveStartToken()
+        directiveName = self.matchDirectiveName()
+        self.setPos(startPos)
+        return directiveName
+
+    def matchDirectiveName(self, directiveNameChars=identchars+'0123456789-@'):
+        startPos = self.pos()
+        possibleMatches = self._directiveNamesAndParsers.keys()
+        name = ''
+        match = None
+
+        while not self.atEnd():
+            c = self.getc()
+            if not c in directiveNameChars:
+                break
+            name += c
+            if name == '@':
+                if not self.atEnd() and self.peek() in identchars:
+                    match = '@'
+                break
+            possibleMatches = [dn for dn in possibleMatches if dn.startswith(name)]
+            if not possibleMatches:
+                break
+            elif (name in possibleMatches and (self.atEnd() or self.peek() not in directiveNameChars)):
+                match = name
+                break
+
+        self.setPos(startPos)
+        return match
+        
+    def matchDirectiveStartToken(self):
+        return self.directiveStartTokenRE.match(self.src(), self.pos())
+    
+    def getDirectiveStartToken(self):
+        match = self.matchDirectiveStartToken()
+        if not match:
+            raise ParseError(self, msg='Invalid directive start token')
+        return self.readTo(match.end())
+
+    def matchDirectiveEndToken(self):
+        return self.directiveEndTokenRE.match(self.src(), self.pos())
+    
+    def getDirectiveEndToken(self):
+        match = self.matchDirectiveEndToken()
+        if not match:
+            raise ParseError(self, msg='Invalid directive end token')
+        return self.readTo(match.end())
+
+        
+    def matchColonForSingleLineShortFormDirective(self):
+        if not self.atEnd() and self.peek()==':':
+            restOfLine = self[self.pos()+1:self.findEOL()]
+            restOfLine = restOfLine.strip()
+            if not restOfLine:
+                return False
+            elif self.commentStartTokenRE.match(restOfLine):
+                return False
+            else: # non-whitespace, non-commment chars found
+                return True
+        return False        
+
+    def matchPSPStartToken(self):
+        return self.PSPStartTokenRE.match(self.src(), self.pos())
+
+    def matchPSPEndToken(self):
+        return self.PSPEndTokenRE.match(self.src(), self.pos())
+
+    def getPSPStartToken(self):
+        match = self.matchPSPStartToken()
+        if not match:
+            raise ParseError(self, msg='Invalid psp start token')
+        return self.readTo(match.end())
+
+    def getPSPEndToken(self):
+        match = self.matchPSPEndToken()
+        if not match:
+            raise ParseError(self, msg='Invalid psp end token')
+        return self.readTo(match.end())
+
+    def matchCheetahVarStart(self):
+        """includes the enclosure and cache token"""
+        return self.cheetahVarStartRE.match(self.src(), self.pos())
+
+    def matchCheetahVarStartToken(self):
+        """includes the enclosure and cache token"""
+        return self.cheetahVarStartTokenRE.match(self.src(), self.pos())
+
+    def matchCheetahVarInExpressionStartToken(self):
+        """no enclosures or cache tokens allowed"""
+        return self.cheetahVarInExpressionStartTokenRE.match(self.src(), self.pos())
+
+    def matchVariablePlaceholderStart(self):
+        """includes the enclosure and cache token"""
+        return self.cheetahVarStartRE.match(self.src(), self.pos())
+
+    def matchExpressionPlaceholderStart(self):
+        """includes the enclosure and cache token"""
+        return self.expressionPlaceholderStartRE.match(self.src(), self.pos())        
+
+    def getCheetahVarStartToken(self):
+        """just the start token, not the enclosure or cache token"""
+        match = self.matchCheetahVarStartToken()
+        if not match:
+            raise ParseError(self, msg='Expected Cheetah $var start token')            
+        return self.readTo( match.end() )
+
+
+    def getCacheToken(self):
+        try:
+            token = self.cacheTokenRE.match(self.src(), self.pos())
+            self.setPos( token.end() )
+            return token.group()
+        except:
+            raise ParseError(self, msg='Expected cache token')
+
+    def getSilentPlaceholderToken(self):
+        try:
+            token = self.silentPlaceholderTokenRE.match(self.src(), self.pos())
+            self.setPos( token.end() )
+            return token.group()
+        except:
+            raise ParseError(self, msg='Expected silent placeholder token')
+
+
+
+    def getTargetVarsList(self):
+        varnames = []
+        while not self.atEnd():
+            if self.peek() in ' \t\f':
+                self.getWhiteSpace()
+            elif self.peek() in '\r\n':
+                break
+            elif self.startswith(','):
+                self.advance()
+            elif self.startswith('in ') or self.startswith('in\t'):
+                break
+            #elif self.matchCheetahVarStart():
+            elif self.matchCheetahVarInExpressionStartToken():
+                self.getCheetahVarStartToken()
+                self.getSilentPlaceholderToken()
+                self.getCacheToken()
+                varnames.append( self.getDottedName() )
+            elif self.matchIdentifier():
+                varnames.append( self.getDottedName() )
+            else:
+                break
+        return varnames
+        
+    def getCheetahVar(self, plain=False, skipStartToken=False):
+        """This is called when parsing inside expressions. Cache tokens are only
+        valid in placeholders so this method discards any cache tokens found.
+        """
+        if not skipStartToken:
+            self.getCheetahVarStartToken()
+        self.getSilentPlaceholderToken()
+        self.getCacheToken()
+        return self.getCheetahVarBody(plain=plain)
+            
+    def getCheetahVarBody(self, plain=False):
+        # @@TR: this should be in the compiler
+        return self._compiler.genCheetahVar(self.getCheetahVarNameChunks(), plain=plain)
+        
+    def getCheetahVarNameChunks(self):
+        
+        """
+        nameChunks = list of Cheetah $var subcomponents represented as tuples
+          [ (namemapperPart,autoCall,restOfName),
+          ]
+        where:
+          namemapperPart = the dottedName base
+          autocall = where NameMapper should use autocalling on namemapperPart
+          restOfName = any arglist, index, or slice
+
+        If restOfName contains a call arglist (e.g. '(1234)') then autocall is
+        False, otherwise it defaults to True.
+
+        EXAMPLE
+        ------------------------------------------------------------------------
+
+        if the raw CheetahVar is
+          $a.b.c[1].d().x.y.z
+          
+        nameChunks is the list
+          [ ('a.b.c',True,'[1]'),
+            ('d',False,'()'),     
+            ('x.y.z',True,''),   
+          ]
+
+        """
+
+        chunks = []
+        while self.pos() < len(self):
+            rest = ''
+            autoCall = True
+            if not self.peek() in identchars + '.':
+                break
+            elif self.peek() == '.':
+                
+                if self.pos()+1 < len(self) and self.peek(1) in identchars:
+                    self.advance()  # discard the period as it isn't needed with NameMapper
+                else:
+                    break
+                
+            dottedName = self.getDottedName()
+            if not self.atEnd() and self.peek() in '([':
+                if self.peek() == '(':
+                    rest = self.getCallArgString()
+                else:
+                    rest = self.getExpression(enclosed=True)
+                
+                period = max(dottedName.rfind('.'), 0)
+                if period:
+                    chunks.append( (dottedName[:period], autoCall, '') )
+                    dottedName = dottedName[period+1:]
+                if rest and rest[0]=='(':
+                    autoCall = False
+            chunks.append( (dottedName, autoCall, rest) )
+
+        return chunks
+    
+
+    def getCallArgString(self,
+                         enclosures=[],  # list of tuples (char, pos), where char is ({ or [ 
+                         useNameMapper=Unspecified):
+
+        """ Get a method/function call argument string. 
+
+        This method understands *arg, and **kw
+        """
+
+        # @@TR: this settings mangling should be removed
+        if useNameMapper is not Unspecified:
+            useNameMapper_orig = self.setting('useNameMapper')
+            self.setSetting('useNameMapper', useNameMapper)
+        
+        if enclosures:
+            pass
+        else:
+            if not self.peek() == '(':
+                raise ParseError(self, msg="Expected '('")
+            startPos = self.pos()
+            self.getc()
+            enclosures = [('(', startPos),
+                          ]
+        
+        argStringBits = ['(']
+        addBit = argStringBits.append
+
+        while 1:
+            if self.atEnd():
+                open = enclosures[-1][0]
+                close = closurePairsRev[open]
+                self.setPos(enclosures[-1][1])
+                raise ParseError(
+                    self, msg="EOF was reached before a matching '" + close +
+                    "' was found for the '" + open + "'")
+
+            c = self.peek()
+            if c in ")}]": # get the ending enclosure and break                
+                if not enclosures:
+                    raise ParseError(self)
+                c = self.getc()
+                open = closurePairs[c]
+                if enclosures[-1][0] == open:
+                    enclosures.pop()
+                    addBit(')')  
+                    break
+                else:
+                    raise ParseError(self)
+            elif c in " \t\f\r\n":
+                addBit(self.getc())
+            elif self.matchCheetahVarInExpressionStartToken():
+                startPos = self.pos()
+                codeFor1stToken = self.getCheetahVar()
+                WS = self.getWhiteSpace()
+                if not self.atEnd() and self.peek() == '=':
+                    nextToken = self.getPyToken()
+                    if nextToken == '=':
+                        endPos = self.pos()
+                        self.setPos(startPos)
+                        codeFor1stToken = self.getCheetahVar(plain=True)
+                        self.setPos(endPos)
+                        
+                    ## finally
+                    addBit( codeFor1stToken + WS + nextToken )
+                else:
+                    addBit( codeFor1stToken + WS)
+            elif self.matchCheetahVarStart():
+                # it has syntax that is only valid at the top level
+                self._raiseErrorAboutInvalidCheetahVarSyntaxInExpr()
+            else:
+                beforeTokenPos = self.pos()
+                token = self.getPyToken()
+                if token in ('{','(','['):
+                    self.rev()
+                    token = self.getExpression(enclosed=True)
+                token = self.transformToken(token, beforeTokenPos)
+                addBit(token)
+
+        if useNameMapper is not Unspecified:
+            self.setSetting('useNameMapper', useNameMapper_orig) # @@TR: see comment above
+
+        return ''.join(argStringBits)
+    
+    def getDefArgList(self, exitPos=None, useNameMapper=False):
+
+        """ Get an argument list. Can be used for method/function definition
+        argument lists or for #directive argument lists. Returns a list of
+        tuples in the form (argName, defVal=None) with one tuple for each arg
+        name.
+
+        These defVals are always strings, so (argName, defVal=None) is safe even
+        with a case like (arg1, arg2=None, arg3=1234*2), which would be returned as
+        [('arg1', None),
+         ('arg2', 'None'),
+         ('arg3', '1234*2'),         
+        ]
+
+        This method understands *arg, and **kw
+
+        """
+
+        if self.peek() == '(':
+            self.advance()
+        else:
+            exitPos = self.findEOL()  # it's a directive so break at the EOL
+        argList = ArgList()
+        onDefVal = False
+
+        # @@TR: this settings mangling should be removed
+        useNameMapper_orig = self.setting('useNameMapper')
+        self.setSetting('useNameMapper', useNameMapper)
+
+        while 1:
+            if self.atEnd():
+                raise ParseError(
+                    self, msg="EOF was reached before a matching ')'"+
+                    " was found for the '('")
+
+            if self.pos() == exitPos:
+                break
+
+            c = self.peek()
+            if c == ")" or self.matchDirectiveEndToken():
+                break
+            elif c == ":":
+                break            
+            elif c in " \t\f\r\n":
+                if onDefVal:
+                    argList.addToDefVal(c)
+                self.advance()
+            elif c == '=':
+                onDefVal = True
+                self.advance()
+            elif c == ",":
+                argList.next()
+                onDefVal = False
+                self.advance()
+            elif self.startswith(self.cheetahVarStartToken) and not onDefVal:
+                self.advance(len(self.cheetahVarStartToken))
+            elif self.matchIdentifier() and not onDefVal:
+                argList.addArgName( self.getIdentifier() )
+            elif onDefVal:
+                if self.matchCheetahVarInExpressionStartToken():
+                    token = self.getCheetahVar()
+                elif self.matchCheetahVarStart():
+                    # it has syntax that is only valid at the top level                    
+                    self._raiseErrorAboutInvalidCheetahVarSyntaxInExpr()
+                else:
+                    beforeTokenPos = self.pos()
+                    token = self.getPyToken()
+                    if token in ('{','(','['):
+                        self.rev()
+                        token = self.getExpression(enclosed=True)
+                    token = self.transformToken(token, beforeTokenPos)
+                argList.addToDefVal(token)
+            elif c == '*' and not onDefVal:
+                varName = self.getc()
+                if self.peek() == '*':
+                    varName += self.getc()
+                if not self.matchIdentifier():
+                    raise ParseError(self)
+                varName += self.getIdentifier()
+                argList.addArgName(varName)
+            else:
+                raise ParseError(self)
+
+                
+        self.setSetting('useNameMapper', useNameMapper_orig) # @@TR: see comment above
+        return argList.merge()
+    
+    def getExpressionParts(self,
+                           enclosed=False, 
+                           enclosures=None, # list of tuples (char, pos), where char is ({ or [ 
+                           pyTokensToBreakAt=None, # only works if not enclosed
+                           useNameMapper=Unspecified,
+                           ):
+
+        """ Get a Cheetah expression that includes $CheetahVars and break at
+        directive end tokens, the end of an enclosure, or at a specified
+        pyToken.
+        """
+
+        if useNameMapper is not Unspecified:
+            useNameMapper_orig = self.setting('useNameMapper')
+            self.setSetting('useNameMapper', useNameMapper)
+
+        if enclosures is None:
+            enclosures = []
+        
+        srcLen = len(self)
+        exprBits = []
+        while 1:
+            if self.atEnd():
+                if enclosures:
+                    open = enclosures[-1][0]
+                    close = closurePairsRev[open]
+                    self.setPos(enclosures[-1][1])
+                    raise ParseError(
+                        self, msg="EOF was reached before a matching '" + close +
+                        "' was found for the '" + open + "'")
+                else:
+                    break
+
+            c = self.peek()
+            if c in "{([":
+                exprBits.append(c)
+                enclosures.append( (c, self.pos()) )
+                self.advance()                
+            elif enclosed and not enclosures:
+                break                
+            elif c in "])}":
+                if not enclosures:
+                    raise ParseError(self)
+                open = closurePairs[c]
+                if enclosures[-1][0] == open:
+                    enclosures.pop()
+                    exprBits.append(c)
+                else:
+                    open = enclosures[-1][0]
+                    close = closurePairsRev[open]
+                    row, col = self.getRowCol()
+                    self.setPos(enclosures[-1][1])
+                    raise ParseError(
+                        self, msg= "A '" + c + "' was found at line " + str(row) +
+                        ", col " + str(col) +
+                        " before a matching '" + close +
+                        "' was found\nfor the '" + open + "'")
+                self.advance()
+                                
+            elif c in " \f\t":
+                exprBits.append(self.getWhiteSpace())            
+            elif self.matchDirectiveEndToken() and not enclosures:
+                break            
+            elif c == "\\" and self.pos()+1 < srcLen:
+                eolMatch = EOLre.match(self.src(), self.pos()+1)
+                if not eolMatch:
+                    self.advance()
+                    raise ParseError(self, msg='Line ending expected')
+                self.setPos( eolMatch.end() )
+            elif c in '\r\n':
+                if enclosures:
+                    self.advance()                    
+                else:
+                    break                    
+            elif self.matchCheetahVarInExpressionStartToken():
+                expr = self.getCheetahVar()
+                exprBits.append(expr)
+            elif self.matchCheetahVarStart():
+                # it has syntax that is only valid at the top level                
+                self._raiseErrorAboutInvalidCheetahVarSyntaxInExpr()                    
+            else:                
+                beforeTokenPos = self.pos()
+                token = self.getPyToken()
+                if (not enclosures 
+                    and pyTokensToBreakAt
+                    and token in pyTokensToBreakAt):
+                    
+                    self.setPos(beforeTokenPos)
+                    break
+
+                token = self.transformToken(token, beforeTokenPos)
+                        
+                exprBits.append(token)                    
+                if identRE.match(token):
+                    if token == 'for':
+                        expr = self.getExpression(useNameMapper=False, pyTokensToBreakAt=['in'])
+                        exprBits.append(expr)
+                    else:
+                        exprBits.append(self.getWhiteSpace())
+                        if not self.atEnd() and self.peek() == '(':
+                            exprBits.append(self.getCallArgString())                    
+        ##
+        if useNameMapper is not Unspecified:                            
+            self.setSetting('useNameMapper', useNameMapper_orig) # @@TR: see comment above
+        return exprBits
+
+    def getExpression(self,
+                      enclosed=False, 
+                      enclosures=None, # list of tuples (char, pos), where # char is ({ or [
+                      pyTokensToBreakAt=None,
+                      useNameMapper=Unspecified,
+                      ):
+        """Returns the output of self.getExpressionParts() as a concatenated
+        string rather than as a list.
+        """
+        return ''.join(self.getExpressionParts(
+            enclosed=enclosed, enclosures=enclosures,
+            pyTokensToBreakAt=pyTokensToBreakAt,
+            useNameMapper=useNameMapper))
+
+
+    def transformToken(self, token, beforeTokenPos):
+        """Takes a token from the expression being parsed and performs and
+        special transformations required by Cheetah.
+
+        At the moment only Cheetah's c'$placeholder strings' are transformed.
+        """
+        if token=='c' and not self.atEnd() and self.peek() in '\'"':
+            nextToken = self.getPyToken()
+            token = nextToken.upper()
+            theStr = eval(token)
+            endPos = self.pos()
+            if not theStr:
+                return
+            
+            if token.startswith(single3) or token.startswith(double3):
+                startPosIdx = 3
+            else:
+                startPosIdx = 1
+            #print 'CHEETAH STRING', nextToken, theStr, startPosIdx
+            self.setPos(beforeTokenPos+startPosIdx+1)
+            outputExprs = []
+            strConst = ''
+            while self.pos() < (endPos-startPosIdx):
+                if self.matchCheetahVarStart() or self.matchExpressionPlaceholderStart():
+                    if strConst:
+                        outputExprs.append(repr(strConst))
+                        strConst = ''
+                    placeholderExpr = self.getPlaceholder()
+                    outputExprs.append('str('+placeholderExpr+')')
+                else:
+                    strConst += self.getc()
+            self.setPos(endPos)
+            if strConst:
+                outputExprs.append(repr(strConst))
+            #if not self.atEnd() and self.matches('.join('):
+            #    print 'DEBUG***'
+            token = "''.join(["+','.join(outputExprs)+"])"
+        return token
+
+    def _raiseErrorAboutInvalidCheetahVarSyntaxInExpr(self):
+        match = self.matchCheetahVarStart()
+        groupdict = match.groupdict()
+        if groupdict.get('cacheToken'):
+            raise ParseError(
+                self,
+                msg='Cache tokens are not valid inside expressions. '
+                'Use them in top-level $placeholders only.')                    
+        elif groupdict.get('enclosure'):                    
+            raise ParseError(
+                self,
+                msg='Long-form placeholders - ${}, $(), $[], etc. are not valid inside expressions. '
+                'Use them in top-level $placeholders only.')
+        else:
+            raise ParseError(
+                self,
+                msg='This form of $placeholder syntax is not valid here.')
+        
+
+    def getPlaceholder(self, allowCacheTokens=False, plain=False, returnEverything=False):
+        # filtered 
+        for callback in self.setting('preparsePlaceholderHooks'):
+            callback(parser=self)
+
+        startPos = self.pos()
+        lineCol = self.getRowCol(startPos)
+        startToken = self.getCheetahVarStartToken()
+        silentPlaceholderToken = self.getSilentPlaceholderToken()
+        if silentPlaceholderToken:
+            isSilentPlaceholder = True
+        else:
+            isSilentPlaceholder = False
+            
+        
+        if allowCacheTokens:
+            cacheToken = self.getCacheToken()
+            cacheTokenParts = self.cacheTokenRE.match(cacheToken).groupdict()        
+        else:
+            cacheTokenParts = {}
+
+        if self.peek() in '({[':         
+            pos = self.pos()
+            enclosureOpenChar = self.getc()
+            enclosures = [ (enclosureOpenChar, pos) ]
+            self.getWhiteSpace()
+        else:
+            enclosures = []
+
+        filterArgs = None
+        if self.matchIdentifier(): 
+            nameChunks = self.getCheetahVarNameChunks()
+            expr = self._compiler.genCheetahVar(nameChunks[:], plain=plain)
+            restOfExpr = None
+            if enclosures:
+                WS = self.getWhiteSpace()
+                expr += WS
+                if self.setting('allowPlaceholderFilterArgs') and self.peek()==',':
+                    filterArgs = self.getCallArgString(enclosures=enclosures)[1:-1]
+                else:
+                    if self.peek()==closurePairsRev[enclosureOpenChar]:
+                        self.getc()
+                    else:
+                        restOfExpr = self.getExpression(enclosed=True, enclosures=enclosures)
+                        if restOfExpr[-1] == closurePairsRev[enclosureOpenChar]:
+                            restOfExpr = restOfExpr[:-1]
+                        expr += restOfExpr
+            rawPlaceholder = self[startPos: self.pos()]
+        else:
+            expr = self.getExpression(enclosed=True, enclosures=enclosures)
+            if expr[-1] == closurePairsRev[enclosureOpenChar]:
+                expr = expr[:-1]
+            rawPlaceholder=self[startPos: self.pos()]
+            
+        expr = self._applyExpressionFilters(expr,'placeholder',
+                                            rawExpr=rawPlaceholder,startPos=startPos)
+        for callback in self.setting('postparsePlaceholderHooks'):
+            callback(parser=self)
+
+        if returnEverything:
+            return (expr, rawPlaceholder, lineCol, cacheTokenParts,
+                    filterArgs, isSilentPlaceholder)
+        else:
+            return expr
+        
+
+class _HighLevelParser(_LowLevelParser):
+    """This class is a StateMachine for parsing Cheetah source and
+    sending state dependent code generation commands to
+    Cheetah.Compiler.Compiler.
+    """
+    def __init__(self, src, filename=None, breakPoint=None, compiler=None):
+        _LowLevelParser.__init__(self, src, filename=filename, breakPoint=breakPoint)
+        self.setSettingsManager(compiler)
+        self._compiler = compiler
+        self.setupState()
+        self.configureParser()
+
+    def setupState(self):
+        self._macros = {}        
+        self._macroDetails = {}
+        self._openDirectivesStack = []
+
+    def cleanup(self):
+        """Cleanup to remove any possible reference cycles
+        """
+        self._macros.clear()
+        for macroname, macroDetails in self._macroDetails.items():
+            macroDetails.template.shutdown()
+            del macroDetails.template
+        self._macroDetails.clear()
+
+    def configureParser(self):
+        _LowLevelParser.configureParser(self)
+        self._initDirectives()
+    
+    def _initDirectives(self):
+        def normalizeParserVal(val):
+            if isinstance(val, (str,unicode)):
+                handler = getattr(self, val)
+            elif type(val) in (ClassType, TypeType):
+                handler = val(self)
+            elif callable(val):
+                handler = val
+            elif val is None:
+                handler = val
+            else:
+                raise Exception('Invalid parser/handler value %r for %s'%(val, name))
+            return handler
+        
+        normalizeHandlerVal = normalizeParserVal
+
+        _directiveNamesAndParsers = directiveNamesAndParsers.copy()
+        customNamesAndParsers = self.setting('directiveNamesAndParsers',{})
+        _directiveNamesAndParsers.update(customNamesAndParsers)
+
+        _endDirectiveNamesAndHandlers = endDirectiveNamesAndHandlers.copy()
+        customNamesAndHandlers = self.setting('endDirectiveNamesAndHandlers',{})
+        _endDirectiveNamesAndHandlers.update(customNamesAndHandlers)        
+        
+        self._directiveNamesAndParsers = {}
+        for name, val in _directiveNamesAndParsers.items():
+            if val in (False, 0):
+                continue
+            self._directiveNamesAndParsers[name] = normalizeParserVal(val)
+
+        self._endDirectiveNamesAndHandlers = {}        
+        for name, val in _endDirectiveNamesAndHandlers.items():
+            if val in (False, 0):
+                continue
+            self._endDirectiveNamesAndHandlers[name] = normalizeHandlerVal(val)
+        
+        self._closeableDirectives = ['def','block','closure','defmacro',
+                                     'call',
+                                     'capture',
+                                     'cache',
+                                     'filter',
+                                     'if','unless',
+                                     'for','while','repeat',
+                                     'try',
+                                     ]
+        for directiveName in self.setting('closeableDirectives',[]):
+            self._closeableDirectives.append(directiveName)
+
+
+
+        macroDirectives = self.setting('macroDirectives',{})
+        macroDirectives['i18n'] = I18n
+
+
+        for macroName, callback in macroDirectives.items():
+            if type(callback) in (ClassType, TypeType):
+                callback = callback(parser=self)
+            assert callback                
+            self._macros[macroName] = callback
+            self._directiveNamesAndParsers[macroName] = self.eatMacroCall
+            
+    def _applyExpressionFilters(self, expr, exprType, rawExpr=None, startPos=None):
+        """Pipes cheetah expressions through a set of optional filter hooks.
+
+        The filters are functions which may modify the expressions or raise
+        a ForbiddenExpression exception if the expression is not allowed.  They
+        are defined in the compiler setting 'expressionFilterHooks'.
+
+        Some intended use cases:
+
+         - to implement 'restricted execution' safeguards in cases where you
+           can't trust the author of the template.
+
+         - to enforce style guidelines  
+           
+        filter call signature:  (parser, expr, exprType, rawExpr=None, startPos=None)
+         - parser is the Cheetah parser  
+         - expr is the expression to filter.  In some cases the parser will have
+           already modified it from the original source code form.  For example,
+           placeholders will have been translated into namemapper calls.  If you
+           need to work with the original source, see rawExpr.        
+         - exprType is the name of the directive, 'psp', or 'placeholder'. All
+           lowercase.  @@TR: These will eventually be replaced with a set of
+           constants.
+         - rawExpr is the original source string that Cheetah parsed.  This
+           might be None in some cases.
+         - startPos is the character position in the source string/file
+           where the parser started parsing the current expression.
+
+        @@TR: I realize this use of the term 'expression' is a bit wonky as many
+         of the 'expressions' are actually statements, but I haven't thought of
+         a better name yet.  Suggestions?
+        """
+        for callback in self.setting('expressionFilterHooks'):
+            expr = callback(parser=self, expr=expr,  exprType=exprType,
+                            rawExpr=rawExpr, startPos=startPos)
+        return expr
+
+    def _filterDisabledDirectives(self, directiveName):
+        directiveName = directiveName.lower()
+        if (directiveName in self.setting('disabledDirectives')
+            or (self.setting('enabledDirectives')
+                and directiveName not in self.setting('enabledDirectives'))):
+            for callback in self.setting('disabledDirectiveHooks'):
+                callback(parser=self, directiveName=directiveName)
+            raise ForbiddenDirective(self, msg='This %r directive is disabled'%directiveName)
+        
+    ## main parse loop
+
+    def parse(self, breakPoint=None, assertEmptyStack=True):
+        if breakPoint:
+            origBP = self.breakPoint()
+            self.setBreakPoint(breakPoint)
+            assertEmptyStack = False
+
+        while not self.atEnd():
+            if self.matchCommentStartToken():
+                self.eatComment()
+            elif self.matchMultiLineCommentStartToken():
+                self.eatMultiLineComment()
+            elif self.matchVariablePlaceholderStart():
+                self.eatPlaceholder()
+            elif self.matchExpressionPlaceholderStart():
+                self.eatPlaceholder()
+            elif self.matchDirective():
+                self.eatDirective()
+            elif self.matchPSPStartToken():
+                self.eatPSP()
+            elif self.matchEOLSlurpToken():
+                self.eatEOLSlurpToken()
+            else:
+                self.eatPlainText()
+        if assertEmptyStack:
+            self.assertEmptyOpenDirectivesStack()
+        if breakPoint:
+            self.setBreakPoint(origBP)
+            
+    ## non-directive eat methods    
+                
+    def eatPlainText(self):
+        startPos = self.pos()
+        match = None
+        while not self.atEnd():
+            match = self.matchTopLevelToken()
+            if match:
+                break
+            else:
+                self.advance()
+        strConst = self.readTo(self.pos(), start=startPos)
+        self._compiler.addStrConst(strConst)
+        return match
+
+    def eatComment(self):
+        isLineClearToStartToken = self.isLineClearToStartToken()
+        if isLineClearToStartToken:
+            self._compiler.handleWSBeforeDirective()
+        self.getCommentStartToken()            
+        comm = self.readToEOL(gobble=isLineClearToStartToken)
+        self._compiler.addComment(comm)
+
+    def eatMultiLineComment(self):
+        isLineClearToStartToken = self.isLineClearToStartToken()
+        endOfFirstLine = self.findEOL()
+
+        self.getMultiLineCommentStartToken()
+        endPos = startPos = self.pos()
+        level = 1
+        while 1:
+            endPos = self.pos()
+            if self.atEnd():
+                break
+            if self.matchMultiLineCommentStartToken():
+                self.getMultiLineCommentStartToken()
+                level += 1
+            elif self.matchMultiLineCommentEndToken():
+                self.getMultiLineCommentEndToken()
+                level -= 1
+            if not level:
+                break
+            self.advance()
+        comm = self.readTo(endPos, start=startPos)
+
+        if not self.atEnd():
+            self.getMultiLineCommentEndToken()
+
+        if (not self.atEnd()) and self.setting('gobbleWhitespaceAroundMultiLineComments'):
+            restOfLine = self[self.pos():self.findEOL()]
+            if not restOfLine.strip(): # WS only to EOL
+                self.readToEOL(gobble=isLineClearToStartToken)
+
+            if isLineClearToStartToken and (self.atEnd() or self.pos() > endOfFirstLine):
+                self._compiler.handleWSBeforeDirective()
+        
+        self._compiler.addComment(comm)
+
+    def eatPlaceholder(self):
+        (expr, rawPlaceholder,
+         lineCol, cacheTokenParts,
+         filterArgs, isSilentPlaceholder) = self.getPlaceholder(
+            allowCacheTokens=True, returnEverything=True)
+        
+        self._compiler.addPlaceholder(
+            expr,
+            filterArgs=filterArgs,
+            rawPlaceholder=rawPlaceholder,
+            cacheTokenParts=cacheTokenParts,
+            lineCol=lineCol,
+            silentMode=isSilentPlaceholder)
+        return
+        
+    def eatPSP(self):
+        # filtered
+        self._filterDisabledDirectives(directiveName='psp')
+        self.getPSPStartToken()
+        endToken = self.setting('PSPEndToken')
+        startPos = self.pos()            
+        while not self.atEnd():
+            if self.peek() == endToken[0]:
+                if self.matchPSPEndToken():
+                    break
+            self.advance()
+        pspString = self.readTo(self.pos(), start=startPos).strip()
+        pspString = self._applyExpressionFilters(pspString, 'psp', startPos=startPos)
+        self._compiler.addPSP(pspString)
+        self.getPSPEndToken()
+
+    ## generic directive eat methods
+    _simpleIndentingDirectives = '''
+    else elif for while repeat unless try except finally'''.split()
+    _simpleExprDirectives = '''
+    pass continue stop return yield break
+    del assert raise
+    silent echo    
+    import from'''.split()
+    _directiveHandlerNames = {'import':'addImportStatement',
+                              'from':'addImportStatement', }
+    def eatDirective(self):
+        directiveName = self.matchDirective()
+        self._filterDisabledDirectives(directiveName)
+
+        for callback in self.setting('preparseDirectiveHooks'):
+            callback(parser=self, directiveName=directiveName)
+
+        # subclasses can override the default behaviours here by providing an
+        # eater method in self._directiveNamesAndParsers[directiveName]
+        directiveParser = self._directiveNamesAndParsers.get(directiveName)
+        if directiveParser:
+            directiveParser()
+        elif directiveName in self._simpleIndentingDirectives:
+            handlerName = self._directiveHandlerNames.get(directiveName)
+            if not handlerName:
+                handlerName = 'add'+directiveName.capitalize()
+            handler = getattr(self._compiler, handlerName)
+            self.eatSimpleIndentingDirective(directiveName, callback=handler)
+        elif directiveName in self._simpleExprDirectives:
+            handlerName = self._directiveHandlerNames.get(directiveName)
+            if not handlerName:
+                handlerName = 'add'+directiveName.capitalize()
+            handler = getattr(self._compiler, handlerName)
+            if directiveName in ('silent', 'echo'):
+                includeDirectiveNameInExpr = False
+            else:
+                includeDirectiveNameInExpr = True
+            expr = self.eatSimpleExprDirective(
+                directiveName,
+                includeDirectiveNameInExpr=includeDirectiveNameInExpr)
+            handler(expr)
+        ##    
+        for callback in self.setting('postparseDirectiveHooks'):
+            callback(parser=self, directiveName=directiveName)
+
+    def _eatRestOfDirectiveTag(self, isLineClearToStartToken, endOfFirstLinePos):
+        foundComment = False
+        if self.matchCommentStartToken():
+            pos = self.pos()
+            self.advance()
+            if not self.matchDirective():
+                self.setPos(pos)
+                foundComment = True
+                self.eatComment() # this won't gobble the EOL
+            else:
+                self.setPos(pos)
+            
+        if not foundComment and self.matchDirectiveEndToken():
+                self.getDirectiveEndToken()
+        elif isLineClearToStartToken and (not self.atEnd()) and self.peek() in '\r\n':
+            # still gobble the EOL if a comment was found. 
+            self.readToEOL(gobble=True)
+            
+        if isLineClearToStartToken and (self.atEnd() or self.pos() > endOfFirstLinePos):
+            self._compiler.handleWSBeforeDirective()
+
+    def _eatToThisEndDirective(self, directiveName):
+        finalPos = endRawPos = startPos = self.pos()
+        directiveChar = self.setting('directiveStartToken')[0]
+        isLineClearToStartToken = False
+        while not self.atEnd():
+            if self.peek() == directiveChar:
+                if self.matchDirective() == 'end':
+                    endRawPos = self.pos()
+                    self.getDirectiveStartToken()
+                    self.advance(len('end'))
+                    self.getWhiteSpace()
+                    if self.startswith(directiveName):
+                        if self.isLineClearToStartToken(endRawPos):
+                            isLineClearToStartToken = True
+                            endRawPos = self.findBOL(endRawPos)
+                        self.advance(len(directiveName)) # to end of directiveName
+                        self.getWhiteSpace()
+                        finalPos = self.pos()
+                        break
+            self.advance()
+            finalPos = endRawPos = self.pos()
+
+        textEaten = self.readTo(endRawPos, start=startPos)
+        self.setPos(finalPos)
+        
+        endOfFirstLinePos = self.findEOL()
+        
+        if self.matchDirectiveEndToken():
+            self.getDirectiveEndToken()
+        elif isLineClearToStartToken and (not self.atEnd()) and self.peek() in '\r\n':
+            self.readToEOL(gobble=True)
+            
+        if isLineClearToStartToken and self.pos() > endOfFirstLinePos:
+            self._compiler.handleWSBeforeDirective()
+        return textEaten
+
+
+    def eatSimpleExprDirective(self, directiveName, includeDirectiveNameInExpr=True):
+        # filtered 
+        isLineClearToStartToken = self.isLineClearToStartToken()
+        endOfFirstLine = self.findEOL()
+        self.getDirectiveStartToken()
+        if not includeDirectiveNameInExpr:
+            self.advance(len(directiveName))
+        startPos = self.pos()
+        expr = self.getExpression().strip()
+        directiveName = expr.split()[0]
+        expr = self._applyExpressionFilters(expr, directiveName, startPos=startPos)
+        if directiveName in self._closeableDirectives:
+            self.pushToOpenDirectivesStack(directiveName)
+        self._eatRestOfDirectiveTag(isLineClearToStartToken, endOfFirstLine)
+        return expr
+
+    def eatSimpleIndentingDirective(self, directiveName, callback,
+                                    includeDirectiveNameInExpr=False):
+        # filtered 
+        isLineClearToStartToken = self.isLineClearToStartToken()
+        endOfFirstLinePos = self.findEOL()
+        lineCol = self.getRowCol()
+        self.getDirectiveStartToken()
+        if directiveName not in 'else elif for while try except finally'.split():
+            self.advance(len(directiveName))
+        startPos = self.pos()
+
+        self.getWhiteSpace()
+
+        expr = self.getExpression(pyTokensToBreakAt=[':'])
+        expr = self._applyExpressionFilters(expr, directiveName, startPos=startPos)
+        if self.matchColonForSingleLineShortFormDirective():
+            self.advance() # skip over :
+            if directiveName in 'else elif except finally'.split():
+                callback(expr, dedent=False, lineCol=lineCol)
+            else:
+                callback(expr, lineCol=lineCol)
+                
+            self.getWhiteSpace(max=1)
+            self.parse(breakPoint=self.findEOL(gobble=True))
+            self._compiler.commitStrConst()
+            self._compiler.dedent()
+        else:
+            if self.peek()==':':
+                self.advance()
+            self.getWhiteSpace()
+            self._eatRestOfDirectiveTag(isLineClearToStartToken, endOfFirstLinePos)
+            if directiveName in self._closeableDirectives:
+                self.pushToOpenDirectivesStack(directiveName)
+            callback(expr, lineCol=lineCol)
+
+    def eatEndDirective(self):
+        isLineClearToStartToken = self.isLineClearToStartToken()
+        self.getDirectiveStartToken()
+        self.advance(3)                 # to end of 'end'
+        self.getWhiteSpace()
+        pos = self.pos()
+        directiveName = False
+        for key in self._endDirectiveNamesAndHandlers.keys():
+            if self.find(key, pos) == pos:
+                directiveName = key
+                break
+        if not directiveName:
+            raise ParseError(self, msg='Invalid end directive')
+        
+        endOfFirstLinePos = self.findEOL()
+        self.getExpression() # eat in any extra comment-like crap
+        self._eatRestOfDirectiveTag(isLineClearToStartToken, endOfFirstLinePos)            
+        if directiveName in self._closeableDirectives:
+            self.popFromOpenDirectivesStack(directiveName)
+
+        # subclasses can override the default behaviours here by providing an
+        # end-directive handler in self._endDirectiveNamesAndHandlers[directiveName]
+        if self._endDirectiveNamesAndHandlers.get(directiveName):
+            handler = self._endDirectiveNamesAndHandlers[directiveName]
+            handler()
+        elif directiveName in 'block capture cache call filter errorCatcher'.split():
+            if key == 'block':
+                self._compiler.closeBlock()
+            elif key == 'capture':
+                self._compiler.endCaptureRegion()
+            elif key == 'cache':
+                self._compiler.endCacheRegion()
+            elif key == 'call':
+                self._compiler.endCallRegion()
+            elif key == 'filter':
+                self._compiler.closeFilterBlock()
+            elif key == 'errorCatcher':
+                self._compiler.turnErrorCatcherOff()
+        elif directiveName in 'while for if try repeat unless'.split():
+            self._compiler.commitStrConst()
+            self._compiler.dedent()
+        elif directiveName=='closure':
+            self._compiler.commitStrConst()
+            self._compiler.dedent()
+            # @@TR: temporary hack of useSearchList
+            self.setSetting('useSearchList', self._useSearchList_orig)            
+
+    ## specific directive eat methods
+    
+    def eatBreakPoint(self):
+        """Tells the parser to stop parsing at this point and completely ignore
+        everything else.
+
+        This is a debugging tool.
+        """
+        self.setBreakPoint(self.pos())
+
+    def eatShbang(self):
+        # filtered 
+        self.getDirectiveStartToken()
+        self.advance(len('shBang'))
+        self.getWhiteSpace()
+        startPos = self.pos()
+        shBang = self.readToEOL()
+        shBang = self._applyExpressionFilters(shBang, 'shbang', startPos=startPos)
+        self._compiler.setShBang(shBang.strip())
+
+    def eatEncoding(self):
+        # filtered 
+        self.getDirectiveStartToken()
+        self.advance(len('encoding'))
+        self.getWhiteSpace()
+        startPos = self.pos()
+        encoding = self.readToEOL()
+        encoding = self._applyExpressionFilters(encoding, 'encoding', startPos=startPos)               
+        self._compiler.setModuleEncoding(encoding.strip())
+        
+    def eatCompiler(self):
+        # filtered 
+        isLineClearToStartToken = self.isLineClearToStartToken()
+        endOfFirstLine = self.findEOL()
+        startPos = self.pos()
+        self.getDirectiveStartToken()
+        self.advance(len('compiler'))   # to end of 'compiler'
+        self.getWhiteSpace()
+
+        startPos = self.pos()
+        settingName = self.getIdentifier()
+
+        if settingName.lower() == 'reset':
+            self.getExpression() # gobble whitespace & junk
+            self._eatRestOfDirectiveTag(isLineClearToStartToken, endOfFirstLine)
+            self._initializeSettings()
+            self.configureParser()
+            return
+        
+        self.getWhiteSpace()
+        if self.peek() == '=':
+            self.advance()
+        else:
+            raise ParseError(self)
+        valueExpr = self.getExpression()
+        endPos = self.pos()
+
+        # @@TR: it's unlikely that anyone apply filters would have left this
+        # directive enabled:
+        # @@TR: fix up filtering, regardless
+        self._applyExpressionFilters('%s=%r'%(settingName, valueExpr),
+                                     'compiler', startPos=startPos)
+        
+        self._eatRestOfDirectiveTag(isLineClearToStartToken, endOfFirstLine)
+        try:
+            self._compiler.setCompilerSetting(settingName, valueExpr)
+        except:
+            out = sys.stderr
+            print >> out, 'An error occurred while processing the following #compiler directive.'
+            print >> out, '-'*80
+            print >> out, self[startPos:endPos]
+            print >> out, '-'*80
+            print >> out, 'Please check the syntax of these settings.'
+            print >> out, 'A full Python exception traceback follows.'
+            raise
+
+
+    def eatCompilerSettings(self):
+        # filtered         
+        isLineClearToStartToken = self.isLineClearToStartToken()
+        endOfFirstLine = self.findEOL()
+        self.getDirectiveStartToken()
+        self.advance(len('compiler-settings'))   # to end of 'settings'
+        
+        keywords = self.getTargetVarsList()
+        self.getExpression()            # gobble any garbage
+            
+        self._eatRestOfDirectiveTag(isLineClearToStartToken, endOfFirstLine)
+
+        if 'reset' in keywords:
+            self._compiler._initializeSettings()
+            self.configureParser()
+            # @@TR: this implies a single-line #compiler-settings directive, and
+            # thus we should parse forward for an end directive.
+            # Subject to change in the future
+            return 
+        startPos = self.pos()
+        settingsStr = self._eatToThisEndDirective('compiler-settings')            
+        settingsStr = self._applyExpressionFilters(settingsStr, 'compilerSettings', 
+                                                   startPos=startPos)
+        try:
+            self._compiler.setCompilerSettings(keywords=keywords, settingsStr=settingsStr)
+        except:
+            out = sys.stderr
+            print >> out, 'An error occurred while processing the following compiler settings.'
+            print >> out, '-'*80
+            print >> out, settingsStr.strip()
+            print >> out, '-'*80
+            print >> out, 'Please check the syntax of these settings.'
+            print >> out, 'A full Python exception traceback follows.'
+            raise
+
+    def eatAttr(self):
+        # filtered         
+        isLineClearToStartToken = self.isLineClearToStartToken()
+        endOfFirstLinePos = self.findEOL()
+        startPos = self.pos()
+        self.getDirectiveStartToken()
+        self.advance(len('attr'))
+        self.getWhiteSpace()
+        startPos = self.pos()
+        if self.matchCheetahVarStart():
+            self.getCheetahVarStartToken()
+        attribName = self.getIdentifier()
+        self.getWhiteSpace()
+        self.getAssignmentOperator()
+        expr = self.getExpression()
+        expr = self._applyExpressionFilters(expr, 'attr', startPos=startPos)
+        self._compiler.addAttribute(attribName, expr)
+        self._eatRestOfDirectiveTag(isLineClearToStartToken, endOfFirstLinePos)
+
+    def eatDecorator(self):
+        isLineClearToStartToken = self.isLineClearToStartToken()
+        endOfFirstLinePos = self.findEOL()
+        startPos = self.pos()
+        self.getDirectiveStartToken()
+        #self.advance() # eat @
+        startPos = self.pos()
+        decoratorExpr = self.getExpression()
+        decoratorExpr = self._applyExpressionFilters(decoratorExpr, 'decorator', startPos=startPos)
+        self._compiler.addDecorator(decoratorExpr)
+        self._eatRestOfDirectiveTag(isLineClearToStartToken, endOfFirstLinePos)
+        self.getWhiteSpace()
+
+        directiveName = self.matchDirective()
+        if not directiveName or directiveName not in ('def', 'block', 'closure', '@'):
+            raise ParseError(
+                self, msg='Expected #def, #block, #closure or another @decorator')
+        self.eatDirective()
+        
+    def eatDef(self):
+        # filtered         
+        self._eatDefOrBlock('def')
+
+    def eatBlock(self):
+        # filtered
+        startPos = self.pos()
+        methodName, rawSignature = self._eatDefOrBlock('block')
+        self._compiler._blockMetaData[methodName] = {
+            'raw':rawSignature,
+            'lineCol':self.getRowCol(startPos),
+            }
+
+    def eatClosure(self):
+        # filtered         
+        self._eatDefOrBlock('closure')
+        
+    def _eatDefOrBlock(self, directiveName):
+        # filtered 
+        assert directiveName in ('def','block','closure')
+        isLineClearToStartToken = self.isLineClearToStartToken()
+        endOfFirstLinePos = self.findEOL()
+        startPos = self.pos()
+        self.getDirectiveStartToken()
+        self.advance(len(directiveName))
+        self.getWhiteSpace()
+        if self.matchCheetahVarStart():
+            self.getCheetahVarStartToken()
+        methodName = self.getIdentifier()
+        self.getWhiteSpace()
+        if self.peek() == '(':
+            argsList = self.getDefArgList()
+            self.advance()              # past the closing ')'
+            if argsList and argsList[0][0] == 'self':
+                del argsList[0]
+        else:
+            argsList=[]
+
+        def includeBlockMarkers():
+            if self.setting('includeBlockMarkers'):
+                startMarker = self.setting('blockMarkerStart')
+                self._compiler.addStrConst(startMarker[0] + methodName + startMarker[1])
+
+        # @@TR: fix up filtering
+        self._applyExpressionFilters(self[startPos:self.pos()], 'def', startPos=startPos)
+
+        if self.matchColonForSingleLineShortFormDirective():
+            isNestedDef = (self.setting('allowNestedDefScopes')
+                           and [name for name in self._openDirectivesStack if name=='def'])
+            self.getc()
+            rawSignature = self[startPos:endOfFirstLinePos]
+            self._eatSingleLineDef(directiveName=directiveName,
+                                   methodName=methodName,
+                                   argsList=argsList,
+                                   startPos=startPos,
+                                   endPos=endOfFirstLinePos)
+            if directiveName == 'def' and not isNestedDef:
+                #@@TR: must come before _eatRestOfDirectiveTag ... for some reason
+                self._compiler.closeDef()
+            elif directiveName == 'block':
+                includeBlockMarkers()
+                self._compiler.closeBlock()
+            elif directiveName == 'closure' or isNestedDef:
+                self._compiler.dedent()
+                
+            self._eatRestOfDirectiveTag(isLineClearToStartToken, endOfFirstLinePos)
+        else:
+            if self.peek()==':':
+                self.getc()            
+            self.pushToOpenDirectivesStack(directiveName)
+            rawSignature = self[startPos:self.pos()]
+            self._eatMultiLineDef(directiveName=directiveName,
+                                  methodName=methodName,
+                                  argsList=argsList,
+                                  startPos=startPos,
+                                  isLineClearToStartToken=isLineClearToStartToken)
+            if directiveName == 'block':
+                includeBlockMarkers()
+
+        return methodName, rawSignature
+
+    def _eatMultiLineDef(self, directiveName, methodName, argsList, startPos,
+                         isLineClearToStartToken=False):
+        # filtered in calling method
+        self.getExpression()            # slurp up any garbage left at the end
+        signature = self[startPos:self.pos()]
+        endOfFirstLinePos = self.findEOL()
+        self._eatRestOfDirectiveTag(isLineClearToStartToken, endOfFirstLinePos)
+        signature = ' '.join([line.strip() for line in signature.splitlines()]) 
+        parserComment = ('## CHEETAH: generated from ' + signature + 
+                         ' at line %s, col %s' % self.getRowCol(startPos)
+                         + '.')
+
+        isNestedDef = (self.setting('allowNestedDefScopes')
+                       and len([name for name in self._openDirectivesStack if name=='def'])>1)
+        if directiveName=='block' or (directiveName=='def' and not isNestedDef):
+            self._compiler.startMethodDef(methodName, argsList, parserComment)
+        else: #closure
+            self._useSearchList_orig = self.setting('useSearchList')
+            self.setSetting('useSearchList', False)
+            self._compiler.addClosure(methodName, argsList, parserComment)
+
+        return methodName
+
+    def _eatSingleLineDef(self, directiveName, methodName, argsList, startPos, endPos):
+        # filtered in calling method        
+        fullSignature = self[startPos:endPos]
+        parserComment = ('## Generated from ' + fullSignature + 
+                         ' at line %s, col %s' % self.getRowCol(startPos)
+                         + '.')
+        isNestedDef = (self.setting('allowNestedDefScopes')
+                       and [name for name in self._openDirectivesStack if name=='def'])
+        if directiveName=='block' or (directiveName=='def' and not isNestedDef):
+            self._compiler.startMethodDef(methodName, argsList, parserComment)
+        else: #closure
+            # @@TR: temporary hack of useSearchList
+            useSearchList_orig = self.setting('useSearchList')
+            self.setSetting('useSearchList', False)            
+            self._compiler.addClosure(methodName, argsList, parserComment)            
+
+        self.getWhiteSpace(max=1)
+        self.parse(breakPoint=endPos)        
+        if directiveName=='closure' or isNestedDef: # @@TR: temporary hack of useSearchList
+            self.setSetting('useSearchList', useSearchList_orig)
+    
+    def eatExtends(self):
+        # filtered
+        isLineClearToStartToken = self.isLineClearToStartToken()
+        endOfFirstLine = self.findEOL()
+        self.getDirectiveStartToken()
+        self.advance(len('extends'))
+        self.getWhiteSpace()
+        startPos = self.pos()
+        if self.setting('allowExpressionsInExtendsDirective'):
+            baseName = self.getExpression()
+        else:
+            baseName = self.getCommaSeparatedSymbols()
+            baseName = ', '.join(baseName)
+                       
+        baseName = self._applyExpressionFilters(baseName, 'extends', startPos=startPos)
+        self._compiler.setBaseClass(baseName) # in compiler
+        self._eatRestOfDirectiveTag(isLineClearToStartToken, endOfFirstLine)
+            
+    def eatImplements(self):
+        # filtered
+        isLineClearToStartToken = self.isLineClearToStartToken()
+        endOfFirstLine = self.findEOL()
+        self.getDirectiveStartToken()
+        self.advance(len('implements'))
+        self.getWhiteSpace()       
+        startPos = self.pos()
+        methodName = self.getIdentifier()
+        if not self.atEnd() and self.peek() == '(':
+            argsList = self.getDefArgList()
+            self.advance()              # past the closing ')'
+            if argsList and argsList[0][0] == 'self':
+                del argsList[0]
+        else:
+            argsList=[]
+
+        # @@TR: need to split up filtering of the methodname and the args
+        #methodName = self._applyExpressionFilters(methodName, 'implements', startPos=startPos)
+        self._applyExpressionFilters(self[startPos:self.pos()], 'implements', startPos=startPos)
+
+        self._compiler.setMainMethodName(methodName)
+        self._compiler.setMainMethodArgs(argsList)
+            
+        self.getExpression()  # throw away and unwanted crap that got added in
+        self._eatRestOfDirectiveTag(isLineClearToStartToken, endOfFirstLine)
+
+    def eatSuper(self):
+        # filtered
+        isLineClearToStartToken = self.isLineClearToStartToken()
+        endOfFirstLine = self.findEOL()
+        self.getDirectiveStartToken()
+        self.advance(len('super'))
+        self.getWhiteSpace()
+        startPos = self.pos()
+        if not self.atEnd() and self.peek() == '(':
+            argsList = self.getDefArgList()
+            self.advance()              # past the closing ')'
+            if argsList and argsList[0][0] == 'self':
+                del argsList[0]
+        else:
+            argsList=[]
+
+        self._applyExpressionFilters(self[startPos:self.pos()], 'super', startPos=startPos)
+
+        #parserComment = ('## CHEETAH: generated from ' + signature + 
+        #                 ' at line %s, col %s' % self.getRowCol(startPos)
+        #                 + '.')
+
+        self.getExpression()  # throw away and unwanted crap that got added in
+        self._eatRestOfDirectiveTag(isLineClearToStartToken, endOfFirstLine)
+        self._compiler.addSuper(argsList)
+
+    def eatSet(self):
+        # filtered
+        isLineClearToStartToken = self.isLineClearToStartToken()
+        endOfFirstLine = self.findEOL()
+        self.getDirectiveStartToken()
+        self.advance(3)
+        self.getWhiteSpace()
+        style = SET_LOCAL
+        if self.startswith('local'):
+            self.getIdentifier()
+            self.getWhiteSpace()
+        elif self.startswith('global'):
+            self.getIdentifier()
+            self.getWhiteSpace()
+            style = SET_GLOBAL
+        elif self.startswith('module'):
+            self.getIdentifier()
+            self.getWhiteSpace()
+            style = SET_MODULE
+
+        startsWithDollar = self.matchCheetahVarStart()
+        startPos = self.pos()
+        LVALUE = self.getExpression(pyTokensToBreakAt=assignmentOps, useNameMapper=False).strip()
+        OP = self.getAssignmentOperator()
+        RVALUE = self.getExpression()        
+        expr = LVALUE + ' ' + OP + ' ' + RVALUE.strip()
+        
+        expr = self._applyExpressionFilters(expr, 'set', startPos=startPos)
+        self._eatRestOfDirectiveTag(isLineClearToStartToken, endOfFirstLine)
+
+        class Components: pass # used for 'set global'
+        exprComponents = Components()
+        exprComponents.LVALUE = LVALUE
+        exprComponents.OP = OP
+        exprComponents.RVALUE = RVALUE
+        self._compiler.addSet(expr, exprComponents, style)
+    
+    def eatSlurp(self):
+        if self.isLineClearToStartToken():
+            self._compiler.handleWSBeforeDirective()
+        self._compiler.commitStrConst()
+        self.readToEOL(gobble=True)
+
+    def eatEOLSlurpToken(self):
+        if self.isLineClearToStartToken():
+            self._compiler.handleWSBeforeDirective()
+        self._compiler.commitStrConst()
+        self.readToEOL(gobble=True)        
+
+    def eatRaw(self):
+        isLineClearToStartToken = self.isLineClearToStartToken()
+        endOfFirstLinePos = self.findEOL()
+        self.getDirectiveStartToken()
+        self.advance(len('raw'))
+        self.getWhiteSpace()
+        if self.matchColonForSingleLineShortFormDirective():
+            self.advance() # skip over :
+            self.getWhiteSpace(max=1)
+            rawBlock = self.readToEOL(gobble=False)
+        else:
+            if self.peek()==':':
+                self.advance()
+            self.getWhiteSpace()
+            self._eatRestOfDirectiveTag(isLineClearToStartToken, endOfFirstLinePos)
+            rawBlock = self._eatToThisEndDirective('raw')
+        self._compiler.addRawText(rawBlock)
+    
+    def eatInclude(self):
+        # filtered
+        isLineClearToStartToken = self.isLineClearToStartToken()
+        endOfFirstLinePos = self.findEOL()
+        self.getDirectiveStartToken()
+        self.advance(len('include'))
+
+        self.getWhiteSpace()
+        includeFrom = 'file'
+        isRaw = False
+        if self.startswith('raw'):
+            self.advance(3)
+            isRaw=True
+            
+        self.getWhiteSpace()            
+        if self.startswith('source'):
+            self.advance(len('source'))
+            includeFrom = 'str'
+            self.getWhiteSpace()
+            if not self.peek() == '=':
+                raise ParseError(self)
+            self.advance()
+        startPos = self.pos()
+        sourceExpr = self.getExpression()
+        sourceExpr = self._applyExpressionFilters(sourceExpr, 'include', startPos=startPos)        
+        self._eatRestOfDirectiveTag(isLineClearToStartToken, endOfFirstLinePos)
+        self._compiler.addInclude(sourceExpr, includeFrom, isRaw)
+
+    
+    def eatDefMacro(self):
+        # @@TR: not filtered yet
+        isLineClearToStartToken = self.isLineClearToStartToken()
+        endOfFirstLinePos = self.findEOL()
+        self.getDirectiveStartToken()
+        self.advance(len('defmacro'))
+
+        self.getWhiteSpace()
+        if self.matchCheetahVarStart():
+            self.getCheetahVarStartToken()
+        macroName = self.getIdentifier()
+        self.getWhiteSpace()
+        if self.peek() == '(':
+            argsList = self.getDefArgList(useNameMapper=False)
+            self.advance()              # past the closing ')'
+            if argsList and argsList[0][0] == 'self':
+                del argsList[0]
+        else:
+            argsList=[]
+
+        assert not self._directiveNamesAndParsers.has_key(macroName)
+        argsList.insert(0, ('src',None))
+        argsList.append(('parser','None'))
+        argsList.append(('macros','None'))
+        argsList.append(('compilerSettings','None'))
+        argsList.append(('isShortForm','None'))
+        argsList.append(('EOLCharsInShortForm','None'))        
+        argsList.append(('startPos','None'))
+        argsList.append(('endPos','None'))
+        
+        if self.matchColonForSingleLineShortFormDirective():
+            self.advance() # skip over :
+            self.getWhiteSpace(max=1)
+            macroSrc = self.readToEOL(gobble=False)
+            self.readToEOL(gobble=True)
+        else:
+            if self.peek()==':':
+                self.advance()
+            self.getWhiteSpace()
+            self._eatRestOfDirectiveTag(isLineClearToStartToken, endOfFirstLinePos)
+            macroSrc = self._eatToThisEndDirective('defmacro')
+
+        #print argsList
+        normalizedMacroSrc = ''.join(
+            ['%def callMacro('+','.join([defv and '%s=%s'%(n,defv) or n
+                                         for n,defv in argsList])
+             +')\n',
+             macroSrc,
+             '%end def'])
+
+        
+        from Cheetah.Template import Template
+        templateAPIClass = self.setting('templateAPIClassForDefMacro', default=Template)
+        compilerSettings = self.setting('compilerSettingsForDefMacro', default={})
+        searchListForMacros = self.setting('searchListForDefMacro', default=[])
+        searchListForMacros = list(searchListForMacros) # copy to avoid mutation bugs
+        searchListForMacros.append({'macros':self._macros,
+                                    'parser':self,
+                                    'compilerSettings':self.settings(),                                    
+                                    })
+        
+        templateAPIClass._updateSettingsWithPreprocessTokens(
+            compilerSettings, placeholderToken='@', directiveToken='%')
+        macroTemplateClass = templateAPIClass.compile(source=normalizedMacroSrc,
+                                                      compilerSettings=compilerSettings)
+        #print normalizedMacroSrc
+        #t = macroTemplateClass()
+        #print t.callMacro('src')
+        #print t.generatedClassCode()
+        
+        class MacroDetails: pass
+        macroDetails = MacroDetails()
+        macroDetails.macroSrc = macroSrc
+        macroDetails.argsList = argsList
+        macroDetails.template = macroTemplateClass(searchList=searchListForMacros)
+
+        self._macroDetails[macroName] = macroDetails
+        self._macros[macroName] = macroDetails.template.callMacro
+        self._directiveNamesAndParsers[macroName] = self.eatMacroCall
+
+    def eatMacroCall(self):
+        isLineClearToStartToken = self.isLineClearToStartToken()
+        endOfFirstLinePos = self.findEOL()
+        startPos = self.pos()
+        self.getDirectiveStartToken()
+        macroName = self.getIdentifier()
+        macro = self._macros[macroName]
+        if hasattr(macro, 'parse'):
+            return macro.parse(parser=self, startPos=startPos)
+        
+        if hasattr(macro, 'parseArgs'):
+            args = macro.parseArgs(parser=self, startPos=startPos)
+        else:
+            self.getWhiteSpace()
+            args = self.getExpression(useNameMapper=False,
+                                      pyTokensToBreakAt=[':']).strip()
+
+        if self.matchColonForSingleLineShortFormDirective():
+            isShortForm = True
+            self.advance() # skip over :
+            self.getWhiteSpace(max=1)
+            srcBlock = self.readToEOL(gobble=False)
+            EOLCharsInShortForm = self.readToEOL(gobble=True)
+            #self.readToEOL(gobble=False)
+        else:
+            isShortForm = False
+            if self.peek()==':':
+                self.advance()
+            self.getWhiteSpace()
+            self._eatRestOfDirectiveTag(isLineClearToStartToken, endOfFirstLinePos)
+            srcBlock = self._eatToThisEndDirective(macroName)
+
+
+        if hasattr(macro, 'convertArgStrToDict'):
+            kwArgs = macro.convertArgStrToDict(args, parser=self, startPos=startPos)
+        else:
+            def getArgs(*pargs, **kws):
+                return pargs, kws
+            exec 'positionalArgs, kwArgs = getArgs(%(args)s)'%locals()
+
+        assert not kwArgs.has_key('src')
+        kwArgs['src'] = srcBlock
+
+        if type(macro)==new.instancemethod:
+            co = macro.im_func.func_code
+        elif (hasattr(macro, '__call__')
+              and hasattr(macro.__call__, 'im_func')):
+            co = macro.__call__.im_func.func_code
+        else:
+            co = macro.func_code
+        availableKwArgs = inspect.getargs(co)[0]
+        
+        if 'parser' in availableKwArgs:
+            kwArgs['parser'] = self
+        if 'macros' in availableKwArgs:
+            kwArgs['macros'] = self._macros
+        if 'compilerSettings' in availableKwArgs:
+            kwArgs['compilerSettings'] = self.settings()
+        if 'isShortForm' in availableKwArgs:
+            kwArgs['isShortForm'] = isShortForm
+        if isShortForm and 'EOLCharsInShortForm' in availableKwArgs:
+            kwArgs['EOLCharsInShortForm'] = EOLCharsInShortForm
+
+        if 'startPos' in availableKwArgs:
+            kwArgs['startPos'] = startPos
+        if 'endPos' in availableKwArgs:
+            kwArgs['endPos'] = self.pos()
+
+        srcFromMacroOutput = macro(**kwArgs)
+
+        origParseSrc = self._src
+        origBreakPoint = self.breakPoint()
+        origPos = self.pos()
+        # add a comment to the output about the macro src that is being parsed
+        # or add a comment prefix to all the comments added by the compiler
+        self._src = srcFromMacroOutput
+        self.setPos(0)
+        self.setBreakPoint(len(srcFromMacroOutput))
+        
+        self.parse(assertEmptyStack=False)
+
+        self._src = origParseSrc
+        self.setBreakPoint(origBreakPoint)
+        self.setPos(origPos)                
+
+
+        #self._compiler.addRawText('end')
+        
+    def eatCache(self):
+        isLineClearToStartToken = self.isLineClearToStartToken()
+        endOfFirstLinePos = self.findEOL()
+        lineCol = self.getRowCol()
+        self.getDirectiveStartToken()
+        self.advance(len('cache'))
+
+        startPos = self.pos()
+        argList = self.getDefArgList(useNameMapper=True)
+        argList = self._applyExpressionFilters(argList, 'cache', startPos=startPos)
+
+        def startCache():
+            cacheInfo = self._compiler.genCacheInfoFromArgList(argList)
+            self._compiler.startCacheRegion(cacheInfo, lineCol)
+
+        if self.matchColonForSingleLineShortFormDirective():            
+            self.advance() # skip over :
+            self.getWhiteSpace(max=1)
+            startCache()
+            self.parse(breakPoint=self.findEOL(gobble=True))
+            self._compiler.endCacheRegion()
+        else:
+            if self.peek()==':':
+                self.advance()
+            self.getWhiteSpace()            
+            self._eatRestOfDirectiveTag(isLineClearToStartToken, endOfFirstLinePos)
+            self.pushToOpenDirectivesStack('cache')
+            startCache()        
+
+    def eatCall(self):
+        # @@TR: need to enable single line version of this
+        isLineClearToStartToken = self.isLineClearToStartToken()
+        endOfFirstLinePos = self.findEOL()
+        lineCol = self.getRowCol()
+        self.getDirectiveStartToken()
+        self.advance(len('call'))
+        startPos = self.pos()
+        
+        useAutocallingOrig = self.setting('useAutocalling')
+        self.setSetting('useAutocalling', False)
+        self.getWhiteSpace()
+        if self.matchCheetahVarStart():
+            functionName = self.getCheetahVar()
+        else:
+            functionName = self.getCheetahVar(plain=True, skipStartToken=True)
+        self.setSetting('useAutocalling', useAutocallingOrig)
+        # @@TR: fix up filtering
+        self._applyExpressionFilters(self[startPos:self.pos()], 'call', startPos=startPos)
+
+        self.getWhiteSpace()
+        args = self.getExpression(pyTokensToBreakAt=[':']).strip()
+        if self.matchColonForSingleLineShortFormDirective():
+            self.advance() # skip over :
+            self._compiler.startCallRegion(functionName, args, lineCol)
+            self.getWhiteSpace(max=1)
+            self.parse(breakPoint=self.findEOL(gobble=False))
+            self._compiler.endCallRegion()
+        else:
+            if self.peek()==':':
+                self.advance()
+            self.getWhiteSpace()
+            self.pushToOpenDirectivesStack("call")            
+            self._eatRestOfDirectiveTag(isLineClearToStartToken, endOfFirstLinePos)
+            self._compiler.startCallRegion(functionName, args, lineCol)
+
+    def eatCallArg(self):
+        isLineClearToStartToken = self.isLineClearToStartToken()
+        endOfFirstLinePos = self.findEOL()
+        lineCol = self.getRowCol()
+        self.getDirectiveStartToken()
+
+        self.advance(len('arg'))
+        startPos = self.pos()
+        self.getWhiteSpace()
+        argName = self.getIdentifier()
+        self.getWhiteSpace()
+        argName = self._applyExpressionFilters(argName, 'arg', startPos=startPos)
+        self._compiler.setCallArg(argName, lineCol)
+        if self.peek() == ':':
+            self.getc()
+        else:        
+            self._eatRestOfDirectiveTag(isLineClearToStartToken, endOfFirstLinePos)
+
+    def eatFilter(self):
+        isLineClearToStartToken = self.isLineClearToStartToken()
+        endOfFirstLinePos = self.findEOL()
+
+        self.getDirectiveStartToken()
+        self.advance(len('filter'))
+        self.getWhiteSpace()
+        startPos = self.pos()
+        if self.matchCheetahVarStart():
+            isKlass = True
+            theFilter = self.getExpression(pyTokensToBreakAt=[':'])
+        else:
+            isKlass = False
+            theFilter = self.getIdentifier()
+            self.getWhiteSpace()
+        theFilter = self._applyExpressionFilters(theFilter, 'filter', startPos=startPos)            
+
+        if self.matchColonForSingleLineShortFormDirective():
+            self.advance() # skip over :
+            self.getWhiteSpace(max=1)            
+            self._compiler.setFilter(theFilter, isKlass)
+            self.parse(breakPoint=self.findEOL(gobble=False))
+            self._compiler.closeFilterBlock()
+        else:
+            if self.peek()==':':
+                self.advance()
+            self.getWhiteSpace()
+            self.pushToOpenDirectivesStack("filter")
+            self._eatRestOfDirectiveTag(isLineClearToStartToken, endOfFirstLinePos)
+            self._compiler.setFilter(theFilter, isKlass)        
+
+    def eatTransform(self):
+        isLineClearToStartToken = self.isLineClearToStartToken()
+        endOfFirstLinePos = self.findEOL()
+
+        self.getDirectiveStartToken()
+        self.advance(len('transform'))
+        self.getWhiteSpace()
+        startPos = self.pos()
+        if self.matchCheetahVarStart():
+            isKlass = True
+            transformer = self.getExpression(pyTokensToBreakAt=[':'])
+        else:
+            isKlass = False
+            transformer = self.getIdentifier()
+            self.getWhiteSpace()
+        transformer = self._applyExpressionFilters(transformer, 'transform', startPos=startPos)
+
+        if self.peek()==':':
+            self.advance()
+        self.getWhiteSpace()
+        self._eatRestOfDirectiveTag(isLineClearToStartToken, endOfFirstLinePos)
+        self._compiler.setTransform(transformer, isKlass)
+
+        
+    def eatErrorCatcher(self):
+        isLineClearToStartToken = self.isLineClearToStartToken()
+        endOfFirstLinePos = self.findEOL()
+        self.getDirectiveStartToken()
+        self.advance(len('errorCatcher'))
+        self.getWhiteSpace()
+        startPos = self.pos()
+        errorCatcherName = self.getIdentifier()
+        errorCatcherName = self._applyExpressionFilters(
+            errorCatcherName, 'errorcatcher', startPos=startPos)
+        self._eatRestOfDirectiveTag(isLineClearToStartToken, endOfFirstLinePos)        
+        self._compiler.setErrorCatcher(errorCatcherName)
+
+    def eatCapture(self):
+        # @@TR:  this could be refactored to use the code in eatSimpleIndentingDirective
+        # filtered 
+        isLineClearToStartToken = self.isLineClearToStartToken()
+        endOfFirstLinePos = self.findEOL()
+        lineCol = self.getRowCol()
+
+        self.getDirectiveStartToken()
+        self.advance(len('capture'))        
+        startPos = self.pos()
+        self.getWhiteSpace()
+
+        expr = self.getExpression(pyTokensToBreakAt=[':'])
+        expr = self._applyExpressionFilters(expr, 'capture', startPos=startPos)
+        if self.matchColonForSingleLineShortFormDirective():
+            self.advance() # skip over :
+            self._compiler.startCaptureRegion(assignTo=expr, lineCol=lineCol)
+            self.getWhiteSpace(max=1)
+            self.parse(breakPoint=self.findEOL(gobble=False))
+            self._compiler.endCaptureRegion()
+        else:
+            if self.peek()==':':
+                self.advance()
+            self.getWhiteSpace()
+            self._eatRestOfDirectiveTag(isLineClearToStartToken, endOfFirstLinePos)
+            self.pushToOpenDirectivesStack("capture")
+            self._compiler.startCaptureRegion(assignTo=expr, lineCol=lineCol)
+        
+
+    def eatIf(self):
+        # filtered 
+        isLineClearToStartToken = self.isLineClearToStartToken()
+        endOfFirstLine = self.findEOL()
+        lineCol = self.getRowCol()
+        self.getDirectiveStartToken()
+        startPos = self.pos()
+        
+        expressionParts = self.getExpressionParts(pyTokensToBreakAt=[':'])
+        expr = ''.join(expressionParts).strip()
+        expr = self._applyExpressionFilters(expr, 'if', startPos=startPos)
+
+        isTernaryExpr = ('then' in expressionParts and 'else' in expressionParts)
+        if isTernaryExpr:
+            conditionExpr = []
+            trueExpr = []
+            falseExpr = []
+            currentExpr = conditionExpr
+            for part in expressionParts:
+                if part.strip()=='then':
+                    currentExpr = trueExpr
+                elif part.strip()=='else':
+                    currentExpr = falseExpr
+                else:
+                    currentExpr.append(part)
+                    
+            conditionExpr = ''.join(conditionExpr)
+            trueExpr = ''.join(trueExpr)
+            falseExpr = ''.join(falseExpr)
+            self._eatRestOfDirectiveTag(isLineClearToStartToken, endOfFirstLine)            
+            self._compiler.addTernaryExpr(conditionExpr, trueExpr, falseExpr, lineCol=lineCol)
+        elif self.matchColonForSingleLineShortFormDirective():
+            self.advance() # skip over :
+            self._compiler.addIf(expr, lineCol=lineCol)
+            self.getWhiteSpace(max=1)
+            self.parse(breakPoint=self.findEOL(gobble=True))            
+            self._compiler.commitStrConst()            
+            self._compiler.dedent()
+        else:
+            if self.peek()==':':
+                self.advance()
+            self.getWhiteSpace()                
+            self._eatRestOfDirectiveTag(isLineClearToStartToken, endOfFirstLine)            
+            self.pushToOpenDirectivesStack('if')
+            self._compiler.addIf(expr, lineCol=lineCol)
+
+    ## end directive handlers
+    def handleEndDef(self):
+        isNestedDef = (self.setting('allowNestedDefScopes')
+                       and [name for name in self._openDirectivesStack if name=='def'])
+        if not isNestedDef:
+            self._compiler.closeDef()
+        else:
+            # @@TR: temporary hack of useSearchList
+            self.setSetting('useSearchList', self._useSearchList_orig)                    
+            self._compiler.commitStrConst()
+            self._compiler.dedent()
+    ###
+
+    def pushToOpenDirectivesStack(self, directiveName):
+        assert directiveName in self._closeableDirectives
+        self._openDirectivesStack.append(directiveName)
+
+    def popFromOpenDirectivesStack(self, directiveName):
+        if not self._openDirectivesStack:
+            raise ParseError(self, msg="#end found, but nothing to end")
+        
+        if self._openDirectivesStack[-1] == directiveName:
+            del self._openDirectivesStack[-1]
+        else:
+            raise ParseError(self, msg="#end %s found, expected #end %s" %(
+                directiveName, self._openDirectivesStack[-1]))
+
+    def assertEmptyOpenDirectivesStack(self):
+        if self._openDirectivesStack:
+            errorMsg = (
+                "Some #directives are missing their corresponding #end ___ tag: %s" %(
+                ', '.join(self._openDirectivesStack)))
+            raise ParseError(self, msg=errorMsg)
+
+##################################################
+## Make an alias to export   
+Parser = _HighLevelParser
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Macros/I18n.py
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Macros/I18n.py (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Macros/I18n.py (revision 3)
@@ -0,0 +1,67 @@
+import gettext
+_ = gettext.gettext
+class I18n(object):
+    def __init__(self, parser):
+        pass
+
+## junk I'm playing with to test the macro framework 
+#    def parseArgs(self, parser, startPos):
+#        parser.getWhiteSpace()
+#        args = parser.getExpression(useNameMapper=False,
+#                                    pyTokensToBreakAt=[':']).strip()
+#        return args
+#
+#    def convertArgStrToDict(self, args, parser=None, startPos=None):
+#        def getArgs(*pargs, **kws):
+#            return pargs, kws
+#        exec 'positionalArgs, kwArgs = getArgs(%(args)s)'%locals()
+#        return kwArgs
+
+    def __call__(self,
+                 src, # aka message,
+                 plural=None,
+                 n=None, # should be a string representing the name of the
+                          # '$var' rather than $var itself                   
+                 id=None,
+                 domain=None,
+                 source=None,
+                 target=None,
+                 comment=None,
+
+                 # args that are automatically supplied by the parser when the
+                 # macro is called:
+                 parser=None,
+                 macros=None,
+                 isShortForm=False,
+                 EOLCharsInShortForm=None,
+                 startPos=None,
+                 endPos=None,
+             ):
+        """This is just a stub at this time.
+
+	   plural = the plural form of the message
+	   n = a sized argument to distinguish between single and plural forms           
+
+      	   id = msgid in the translation catalog
+	   domain = translation domain
+	   source = source lang
+	   target = a specific target lang
+	   comment = a comment to the translation team
+
+        See the following for some ideas
+        http://www.zope.org/DevHome/Wikis/DevSite/Projects/ComponentArchitecture/ZPTInternationalizationSupport
+
+        Other notes:
+        - There is no need to replicate the i18n:name attribute from plone / PTL,
+          as cheetah placeholders serve the same purpose
+    
+    
+       """
+        
+        #print macros['i18n']
+        src = _(src)
+        if isShortForm and endPos<len(parser):
+            return src+EOLCharsInShortForm
+        else:
+            return src
+        
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Macros/__init__.py
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Macros/__init__.py (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Macros/__init__.py (revision 3)
@@ -0,0 +1,1 @@
+#
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Unspecified.py
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Unspecified.py (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Unspecified.py (revision 3)
@@ -0,0 +1,9 @@
+try:
+    from ds.sys.Unspecified import Unspecified
+except ImportError:
+    class _Unspecified:
+        def __repr__(self):
+            return 'Unspecified'        
+        def __str__(self):
+            return 'Unspecified'
+    Unspecified = _Unspecified()
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/TemplateCmdLineIface.py
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/TemplateCmdLineIface.py (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/TemplateCmdLineIface.py (revision 3)
@@ -0,0 +1,107 @@
+# $Id: TemplateCmdLineIface.py,v 1.13 2006/01/10 20:34:35 tavis_rudd Exp $
+
+"""Provides a command line interface to compiled Cheetah template modules.
+
+Meta-Data
+================================================================================
+Author: Tavis Rudd <tavis@damnsimple.com>
+Version: $Revision: 1.13 $
+Start Date: 2001/12/06
+Last Revision Date: $Date: 2006/01/10 20:34:35 $
+"""
+__author__ = "Tavis Rudd <tavis@damnsimple.com>"
+__revision__ = "$Revision: 1.13 $"[11:-2]
+
+import sys
+import os
+import getopt
+import os.path
+try:
+    from cPickle import load
+except ImportError:
+    from pickle import load
+
+from Cheetah.Version import Version
+
+class Error(Exception):
+    pass
+
+class CmdLineIface:
+    """A command line interface to compiled Cheetah template modules."""
+
+    def __init__(self, templateObj,
+                 scriptName=os.path.basename(sys.argv[0]),
+                 cmdLineArgs=sys.argv[1:]):
+
+        self._template = templateObj
+        self._scriptName = scriptName
+        self._cmdLineArgs = cmdLineArgs
+
+    def run(self):
+        """The main program controller."""
+        
+        self._processCmdLineArgs()
+        print self._template
+        
+    def _processCmdLineArgs(self):
+        try:
+            self._opts, self._args = getopt.getopt(
+                self._cmdLineArgs, 'h', ['help',
+                                            'env',
+                                            'pickle=',
+                                            ])
+
+        except getopt.GetoptError, v:
+            # print help information and exit:
+            print v
+            print self.usage()
+            sys.exit(2)
+        
+        for o, a in self._opts:
+            if o in ('-h','--help'):
+                print self.usage()
+                sys.exit()
+            if o == '--env':
+                self._template.searchList().insert(0, os.environ)
+            if o == '--pickle':
+                if a == '-':
+                    unpickled = load(sys.stdin)
+                    self._template.searchList().insert(0, unpickled)
+                else:
+                    f = open(a)
+                    unpickled = load(f)
+                    f.close()
+                    self._template.searchList().insert(0, unpickled)
+
+    def usage(self):
+        return """Cheetah %(Version)s template module command-line interface
+
+Usage
+-----
+  %(scriptName)s [OPTION]
+
+Options
+-------
+  -h, --help                 Print this help information
+  
+  --env                      Use shell ENVIRONMENT variables to fill the
+                             $placeholders in the template.
+                             
+  --pickle <file>            Use a variables from a dictionary stored in Python
+                             pickle file to fill $placeholders in the template.
+                             If <file> is - stdin is used: 
+                             '%(scriptName)s --pickle -'
+
+Description
+-----------
+
+This interface allows you to execute a Cheetah template from the command line
+and collect the output.  It can prepend the shell ENVIRONMENT or a pickled
+Python dictionary to the template's $placeholder searchList, overriding the
+defaults for the $placeholders.
+
+""" % {'scriptName':self._scriptName,
+       'Version':Version,
+       }
+
+# vim: shiftwidth=4 tabstop=4 expandtab
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/__init__.py
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/__init__.py (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/__init__.py (revision 3)
@@ -0,0 +1,20 @@
+'''
+Cheetah is an open source template engine and code generation tool.
+
+It can be used standalone or combined with other tools and frameworks. Web
+development is its principle use, but Cheetah is very flexible and is also being
+used to generate C++ game code, Java, sql, form emails and even Python code.
+
+Homepage
+    http://www.cheetahtemplate.org/
+
+Documentation
+    http://cheetahtemplate.org/learn.html
+
+Mailing list
+cheetahtemplate-discuss@lists.sourceforge.net
+Subscribe at 
+    http://lists.sourceforge.net/lists/listinfo/cheetahtemplate-discuss
+'''
+
+from Version import *
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/FileUtils.py
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/FileUtils.py (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/FileUtils.py (revision 3)
@@ -0,0 +1,373 @@
+# $Id: FileUtils.py,v 1.12 2005/11/02 22:26:07 tavis_rudd Exp $
+"""File utitilies for Python:
+
+Meta-Data
+================================================================================
+Author: Tavis Rudd <tavis@damnsimple.com>
+License: This software is released for unlimited distribution under the
+         terms of the MIT license.  See the LICENSE file.
+Version: $Revision: 1.12 $
+Start Date: 2001/09/26
+Last Revision Date: $Date: 2005/11/02 22:26:07 $
+"""
+__author__ = "Tavis Rudd <tavis@damnsimple.com>"
+__revision__ = "$Revision: 1.12 $"[11:-2]
+
+
+from glob import glob
+import os
+from os import listdir
+import os.path
+import re
+from types import StringType
+from tempfile import mktemp
+
+def _escapeRegexChars(txt,
+                     escapeRE=re.compile(r'([\$\^\*\+\.\?\{\}\[\]\(\)\|\\])')):
+    return escapeRE.sub(r'\\\1' , txt)
+
+def findFiles(*args, **kw):
+    """Recursively find all the files matching a glob pattern.
+
+    This function is a wrapper around the FileFinder class.  See its docstring
+    for details about the accepted arguments, etc."""
+    
+    return FileFinder(*args, **kw).files()
+            
+def replaceStrInFiles(files, theStr, repl):
+
+    """Replace all instances of 'theStr' with 'repl' for each file in the 'files'
+    list. Returns a dictionary with data about the matches found.
+
+    This is like string.replace() on a multi-file basis.
+
+    This function is a wrapper around the FindAndReplace class. See its
+    docstring for more details."""
+    
+    pattern = _escapeRegexChars(theStr)
+    return FindAndReplace(files, pattern, repl).results()
+
+def replaceRegexInFiles(files, pattern, repl):
+
+    """Replace all instances of regex 'pattern' with 'repl' for each file in the
+    'files' list. Returns a dictionary with data about the matches found.
+
+    This is like re.sub on a multi-file basis.
+
+    This function is a wrapper around the FindAndReplace class. See its
+    docstring for more details."""
+
+    return FindAndReplace(files, pattern, repl).results()
+
+
+##################################################
+## CLASSES
+
+class FileFinder:
+    
+    """Traverses a directory tree and finds all files in it that match one of
+    the specified glob patterns."""
+    
+    def __init__(self, rootPath,
+                 globPatterns=('*',),
+                 ignoreBasenames=('CVS','.svn'),
+                 ignoreDirs=(),
+                 ):
+        
+        self._rootPath = rootPath
+        self._globPatterns = globPatterns
+        self._ignoreBasenames = ignoreBasenames
+        self._ignoreDirs = ignoreDirs
+        self._files = []
+        
+        self.walkDirTree(rootPath)
+            
+    def walkDirTree(self, dir='.',
+                    
+                    listdir=os.listdir,
+                    isdir=os.path.isdir,
+                    join=os.path.join,
+                    ):
+
+        """Recursively walk through a directory tree and find matching files."""
+        processDir = self.processDir
+        filterDir = self.filterDir
+        
+        pendingDirs = [dir]
+        addDir = pendingDirs.append
+        getDir = pendingDirs.pop
+        
+        while pendingDirs:
+            dir = getDir()
+            ##  process this dir
+            processDir(dir)
+            
+            ## and add sub-dirs 
+            for baseName in listdir(dir):
+                fullPath = join(dir, baseName)
+                if isdir(fullPath):
+                    if filterDir(baseName, fullPath):
+                        addDir( fullPath )
+
+    def filterDir(self, baseName, fullPath):
+        
+        """A hook for filtering out certain dirs. """
+        
+        return not (baseName in self._ignoreBasenames or 
+                    fullPath in self._ignoreDirs)
+    
+    def processDir(self, dir, glob=glob):
+        extend = self._files.extend
+        for pattern in self._globPatterns:
+            extend( glob(os.path.join(dir, pattern)) )
+    
+    def files(self):
+        return self._files
+
+class _GenSubberFunc:
+
+    """Converts a 'sub' string in the form that one feeds to re.sub (backrefs,
+    groups, etc.) into a function that can be used to do the substitutions in
+    the FindAndReplace class."""
+    
+    backrefRE = re.compile(r'\\([1-9][0-9]*)')
+    groupRE = re.compile(r'\\g<([a-zA-Z_][a-zA-Z_]*)>')
+    
+    def __init__(self, replaceStr):
+        self._src = replaceStr
+        self._pos = 0
+        self._codeChunks = []
+        self.parse()
+
+    def src(self):
+        return self._src
+        
+    def pos(self):
+        return self._pos
+    
+    def setPos(self, pos):
+        self._pos = pos
+
+    def atEnd(self):
+        return self._pos >= len(self._src)
+
+    def advance(self, offset=1):
+        self._pos += offset
+
+    def readTo(self, to, start=None):
+        if start == None:
+            start = self._pos
+        self._pos = to
+        if self.atEnd():
+            return self._src[start:]
+        else:
+            return self._src[start:to]
+
+    ## match and get methods
+        
+    def matchBackref(self):
+        return self.backrefRE.match(self.src(), self.pos())
+
+    def getBackref(self):
+        m = self.matchBackref()
+        self.setPos(m.end())
+        return m.group(1)
+        
+    def matchGroup(self):
+        return self.groupRE.match(self.src(), self.pos())
+
+    def getGroup(self):
+        m = self.matchGroup()
+        self.setPos(m.end())
+        return m.group(1)
+
+    ## main parse loop and the eat methods
+    
+    def parse(self):
+        while not self.atEnd():
+            if self.matchBackref():
+                self.eatBackref()
+            elif self.matchGroup():
+                self.eatGroup()
+            else:
+                self.eatStrConst()
+                
+    def eatStrConst(self):
+        startPos = self.pos()
+        while not self.atEnd():
+            if self.matchBackref() or self.matchGroup():
+                break
+            else:
+                self.advance()
+        strConst = self.readTo(self.pos(), start=startPos)
+        self.addChunk(repr(strConst))
+    
+    def eatBackref(self):
+        self.addChunk( 'm.group(' + self.getBackref() + ')' )
+
+    def eatGroup(self):
+        self.addChunk( 'm.group("' + self.getGroup() + '")' )
+    
+    def addChunk(self, chunk):
+        self._codeChunks.append(chunk)
+
+    ## code wrapping methods
+
+    def codeBody(self):
+        return ', '.join(self._codeChunks)
+
+    def code(self):
+        return "def subber(m):\n\treturn ''.join([%s])\n" % (self.codeBody())
+    
+    def subberFunc(self):
+        exec self.code()
+        return subber
+
+
+class FindAndReplace:
+    
+    """Find and replace all instances of 'patternOrRE' with 'replacement' for
+    each file in the 'files' list. This is a multi-file version of re.sub().
+
+    'patternOrRE' can be a raw regex pattern or
+    a regex object as generated by the re module. 'replacement' can be any
+    string that would work with patternOrRE.sub(replacement, fileContents).
+    """
+    
+    def __init__(self, files, patternOrRE, replacement,
+                 recordResults=True):
+
+        
+        if type(patternOrRE) == StringType:
+            self._regex = re.compile(patternOrRE)
+        else:
+            self._regex = patternOrRE
+        if type(replacement) == StringType:
+            self._subber = _GenSubberFunc(replacement).subberFunc()
+        else:
+            self._subber = replacement
+
+        self._pattern = pattern = self._regex.pattern
+        self._files = files
+        self._results = {}
+        self._recordResults = recordResults
+
+        ## see if we should use pgrep to do the file matching
+        self._usePgrep = False
+        if (os.popen3('pgrep')[2].read()).startswith('Usage:'):
+            ## now check to make sure pgrep understands the pattern
+            tmpFile = mktemp()
+            open(tmpFile, 'w').write('#')
+            if not (os.popen3('pgrep "' + pattern + '" ' + tmpFile)[2].read()):
+                # it didn't print an error msg so we're ok
+                self._usePgrep = True
+            os.remove(tmpFile)
+
+        self._run()
+
+    def results(self):
+        return self._results
+    
+    def _run(self):
+        regex = self._regex
+        subber = self._subDispatcher
+        usePgrep = self._usePgrep
+        pattern = self._pattern
+        for file in self._files:
+            if not os.path.isfile(file):
+                continue # skip dirs etc.
+            
+            self._currFile = file
+            found = False
+            if locals().has_key('orig'):
+                del orig
+            if self._usePgrep:
+                if os.popen('pgrep "' + pattern + '" ' + file ).read():
+                    found = True
+            else:
+                orig = open(file).read()
+                if regex.search(orig):
+                    found = True
+            if found:
+                if not locals().has_key('orig'):
+                    orig = open(file).read()
+                new = regex.sub(subber, orig)
+                open(file, 'w').write(new)
+
+    def _subDispatcher(self, match):
+        if self._recordResults:
+            if not self._results.has_key(self._currFile):
+                res = self._results[self._currFile] = {}
+                res['count'] = 0
+                res['matches'] = []
+            else:
+                res = self._results[self._currFile]
+            res['count'] += 1
+            res['matches'].append({'contents':match.group(),
+                                   'start':match.start(),
+                                   'end':match.end(),
+                                   }
+                                   )
+        return self._subber(match)
+
+
+class SourceFileStats:
+
+    """
+    """
+    
+    _fileStats = None
+    
+    def __init__(self, files):
+        self._fileStats = stats = {}
+        for file in files:
+            stats[file] = self.getFileStats(file)
+
+    def rawStats(self):
+        return self._fileStats
+
+    def summary(self):
+        codeLines = 0
+        blankLines = 0
+        commentLines = 0
+        totalLines = 0
+        for fileStats in self.rawStats().values():
+            codeLines += fileStats['codeLines']
+            blankLines += fileStats['blankLines']
+            commentLines += fileStats['commentLines']
+            totalLines += fileStats['totalLines']
+            
+        stats = {'codeLines':codeLines,
+                 'blankLines':blankLines,
+                 'commentLines':commentLines,
+                 'totalLines':totalLines,
+                 }
+        return stats
+        
+    def printStats(self):
+        pass
+
+    def getFileStats(self, fileName):
+        codeLines = 0
+        blankLines = 0
+        commentLines = 0 
+        commentLineRe = re.compile(r'\s#.*$')
+        blankLineRe = re.compile('\s$')
+        lines = open(fileName).read().splitlines()
+        totalLines = len(lines)
+        
+        for line in lines:
+            if commentLineRe.match(line):
+                commentLines += 1
+            elif blankLineRe.match(line):
+                blankLines += 1
+            else:
+                codeLines += 1
+
+        stats = {'codeLines':codeLines,
+                 'blankLines':blankLines,
+                 'commentLines':commentLines,
+                 'totalLines':totalLines,
+                 }
+        
+        return stats
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/DummyTransaction.py
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/DummyTransaction.py (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/DummyTransaction.py (revision 3)
@@ -0,0 +1,95 @@
+
+'''
+Provides dummy Transaction and Response classes is used by Cheetah in place
+of real Webware transactions when the Template obj is not used directly as a
+Webware servlet.
+
+Warning: This may be deprecated in the future, please do not rely on any 
+specific DummyTransaction or DummyResponse behavior
+'''
+
+import types
+
+class DummyResponseFailure(Exception):
+    pass
+
+class DummyResponse(object):
+    '''
+        A dummy Response class is used by Cheetah in place of real Webware
+        Response objects when the Template obj is not used directly as a Webware
+        servlet
+    ''' 
+    def __init__(self):
+        self._outputChunks = []
+
+    def flush(self):
+        pass
+        
+    def write(self, value):
+        self._outputChunks.append(value)
+
+    def writeln(self, txt):
+        write(txt)
+        write('\n')
+
+    def getvalue(self, outputChunks=None):
+        chunks = outputChunks or self._outputChunks
+        try: 
+            return ''.join(chunks)
+        except UnicodeDecodeError, ex:
+            nonunicode = [c for c in chunks if not isinstance(c, unicode)]
+            raise DummyResponseFailure('''Looks like you're trying to mix encoded strings with Unicode strings
+            (most likely utf-8 encoded ones)
+
+            This can happen if you're using the `EncodeUnicode` filter, or if you're manually
+            encoding strings as utf-8 before passing them in on the searchList (possible offenders: 
+            %s) 
+            (%s)''' % (nonunicode, ex))
+
+
+    def writelines(self, *lines):
+        ## not used
+        [self.writeln(ln) for ln in lines]
+        
+
+class DummyTransaction(object):
+    '''
+        A dummy Transaction class is used by Cheetah in place of real Webware
+        transactions when the Template obj is not used directly as a Webware
+        servlet.
+
+        It only provides a response object and method.  All other methods and
+        attributes make no sense in this context.
+    '''
+    def __init__(self, *args, **kwargs):
+        self._response = None
+
+    def response(self, resp=None):
+        if self._response is None:
+            self._response = resp or DummyResponse()
+        return self._response
+
+
+class TransformerResponse(DummyResponse):
+    def __init__(self, *args, **kwargs):
+        super(TransformerResponse, self).__init__(*args, **kwargs)
+        self._filter = None
+
+    def getvalue(self, **kwargs):
+        output = super(TransformerResponse, self).getvalue(**kwargs)
+        if self._filter:
+            _filter = self._filter
+            if isinstance(_filter, types.TypeType):
+                _filter = _filter()
+            return _filter.filter(output)
+        return output
+
+
+class TransformerTransaction(object):
+    def __init__(self, *args, **kwargs):
+        self._response = None
+    def response(self):
+        if self._response:
+            return self._response
+        return TransformerResponse()
+
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Django.py
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Django.py (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Django.py (revision 3)
@@ -0,0 +1,16 @@
+import Cheetah.Template
+
+def render(template_file, **kwargs):
+    '''
+        Cheetah.Django.render() takes the template filename 
+        (the filename should be a file in your Django 
+        TEMPLATE_DIRS)
+
+        Any additional keyword arguments are passed into the 
+        template are propogated into the template's searchList
+    '''
+    import django.http
+    import django.template.loader
+    source, loader = django.template.loader.find_template_source(template_file)
+    t = Cheetah.Template.Template(source, searchList=[kwargs])
+    return django.http.HttpResponse(t.__str__())
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/CheetahWrapper.py
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/CheetahWrapper.py (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/CheetahWrapper.py (revision 3)
@@ -0,0 +1,633 @@
+# $Id: CheetahWrapper.py,v 1.26 2007/10/02 01:22:04 tavis_rudd Exp $
+"""Cheetah command-line interface.
+
+2002-09-03 MSO: Total rewrite.
+2002-09-04 MSO: Bugfix, compile command was using wrong output ext.
+2002-11-08 MSO: Another rewrite.
+
+Meta-Data
+================================================================================
+Author: Tavis Rudd <tavis@damnsimple.com> and Mike Orr <sluggoster@gmail.com>>
+Version: $Revision: 1.26 $
+Start Date: 2001/03/30
+Last Revision Date: $Date: 2007/10/02 01:22:04 $
+"""
+__author__ = "Tavis Rudd <tavis@damnsimple.com> and Mike Orr <sluggoster@gmail.com>"
+__revision__ = "$Revision: 1.26 $"[11:-2]
+
+import getopt, glob, os, pprint, re, shutil, sys
+import cPickle as pickle
+from optparse import OptionParser
+
+from Cheetah.Version import Version
+from Cheetah.Template import Template, DEFAULT_COMPILER_SETTINGS
+from Cheetah.Utils.Misc import mkdirsWithPyInitFiles
+
+optionDashesRE = re.compile(  R"^-{1,2}"  )
+moduleNameRE = re.compile(  R"^[a-zA-Z_][a-zA-Z_0-9]*$"  )
+   
+def fprintfMessage(stream, format, *args):
+    if format[-1:] == '^':
+        format = format[:-1]
+    else:
+        format += '\n'
+    if args:
+        message = format % args
+    else:
+        message = format
+    stream.write(message)
+
+class Error(Exception):
+    pass
+
+
+class Bundle:
+    """Wrap the source, destination and backup paths in one neat little class.
+       Used by CheetahWrapper.getBundles().
+    """
+    def __init__(self, **kw):
+        self.__dict__.update(kw)
+
+    def __repr__(self):
+        return "<Bundle %r>" % self.__dict__
+
+
+##################################################
+## USAGE FUNCTION & MESSAGES
+
+def usage(usageMessage, errorMessage="", out=sys.stderr):
+    """Write help text, an optional error message, and abort the program.
+    """
+    out.write(WRAPPER_TOP)
+    out.write(usageMessage)
+    exitStatus = 0
+    if errorMessage:
+        out.write('\n')
+        out.write("*** USAGE ERROR ***: %s\n" % errorMessage)
+        exitStatus = 1
+    sys.exit(exitStatus)
+             
+
+WRAPPER_TOP = """\
+         __  ____________  __
+         \ \/            \/ /
+          \/    *   *     \/    CHEETAH %(Version)s Command-Line Tool
+           \      |       / 
+            \  ==----==  /      by Tavis Rudd <tavis@damnsimple.com>
+             \__________/       and Mike Orr <sluggoster@gmail.com>
+              
+""" % globals()
+
+
+HELP_PAGE1 = """\
+USAGE:
+------
+  cheetah compile [options] [FILES ...]     : Compile template definitions
+  cheetah fill [options] [FILES ...]        : Fill template definitions
+  cheetah help                              : Print this help message
+  cheetah options                           : Print options help message
+  cheetah test [options]                    : Run Cheetah's regression tests
+                                            : (same as for unittest)
+  cheetah version                           : Print Cheetah version number
+
+You may abbreviate the command to the first letter; e.g., 'h' == 'help'.
+If FILES is a single "-", read standard input and write standard output.
+Run "cheetah options" for the list of valid options.
+"""
+
+##################################################
+## CheetahWrapper CLASS
+
+class CheetahWrapper(object):
+    MAKE_BACKUPS = True
+    BACKUP_SUFFIX = ".bak"
+    _templateClass = None
+    _compilerSettings = None    
+
+    def __init__(self):
+        self.progName = None
+        self.command = None
+        self.opts = None
+        self.pathArgs = None
+        self.sourceFiles = []
+        self.searchList = []
+        self.parser = None
+
+    ##################################################
+    ## MAIN ROUTINE
+
+    def main(self, argv=None):
+        """The main program controller."""
+
+        if argv is None:
+            argv = sys.argv
+
+        # Step 1: Determine the command and arguments.
+        try:
+            self.progName = progName = os.path.basename(argv[0])
+            self.command = command = optionDashesRE.sub("", argv[1])
+            if command == 'test':
+                self.testOpts = argv[2:]
+            else:
+                self.parseOpts(argv[2:])
+        except IndexError:
+            usage(HELP_PAGE1, "not enough command-line arguments")
+
+        # Step 2: Call the command
+        meths = (self.compile, self.fill, self.help, self.options,
+            self.test, self.version)
+        for meth in meths:
+            methName = meth.__name__
+            # Or meth.im_func.func_name
+            # Or meth.func_name (Python >= 2.1 only, sometimes works on 2.0)
+            methInitial = methName[0]
+            if command in (methName, methInitial):
+                sys.argv[0] += (" " + methName)
+                # @@MO: I don't necessarily agree sys.argv[0] should be 
+                # modified.
+                meth()
+                return
+        # If none of the commands matched.
+        usage(HELP_PAGE1, "unknown command '%s'" % command)
+
+    def parseOpts(self, args):
+        C, D, W = self.chatter, self.debug, self.warn
+        self.isCompile = isCompile = self.command[0] == 'c'
+        defaultOext = isCompile and ".py" or ".html"
+        self.parser = OptionParser()
+        pao = self.parser.add_option
+        pao("--idir", action="store", dest="idir", default='', help='Input directory (defaults to current directory)')
+        pao("--odir", action="store", dest="odir", default="", help='Output directory (defaults to current directory)')
+        pao("--iext", action="store", dest="iext", default=".tmpl", help='File input extension (defaults: compile: .tmpl, fill: .tmpl)')
+        pao("--oext", action="store", dest="oext", default=defaultOext, help='File output extension (defaults: compile: .py, fill: .html)')
+        pao("-R", action="store_true", dest="recurse", default=False, help='Recurse through subdirectories looking for input files')
+        pao("--stdout", "-p", action="store_true", dest="stdout", default=False, help='Verbosely print informational messages to stdout')
+        pao("--debug", action="store_true", dest="debug", default=False, help='Print diagnostic/debug information to stderr')
+        pao("--env", action="store_true", dest="env", default=False, help='Pass the environment into the search list')
+        pao("--pickle", action="store", dest="pickle", default="", help='Unpickle FILE and pass it through in the search list')
+        pao("--flat", action="store_true", dest="flat", default=False, help='Do not build destination subdirectories')
+        pao("--nobackup", action="store_true", dest="nobackup", default=False, help='Do not make backup files when generating new ones')
+        pao("--settings", action="store", dest="compilerSettingsString", default=None, help='String of compiler settings to pass through, e.g. --settings="useNameMapper=False,useFilters=False"')
+        pao('--print-settings', action='store_true', dest='print_settings', help='Print out the list of available compiler settings')
+        pao("--templateAPIClass", action="store", dest="templateClassName", default=None, help='Name of a subclass of Cheetah.Template.Template to use for compilation, e.g. MyTemplateClass')
+        pao("--parallel", action="store", type="int", dest="parallel", default=1, help='Compile/fill templates in parallel, e.g. --parallel=4')
+        pao('--shbang', dest='shbang', default='#!/usr/bin/env python', help='Specify the shbang to place at the top of compiled templates, e.g. --shbang="#!/usr/bin/python2.6"')
+
+        opts, files = self.parser.parse_args(args)
+        self.opts = opts
+        if sys.platform == "win32":
+            new_files = []
+            for spec in files:
+                file_list = glob.glob(spec)
+                if file_list:
+                    new_files.extend(file_list)
+                else:
+                    new_files.append(spec)
+            files = new_files
+        self.pathArgs = files
+
+        D("""\
+cheetah compile %s
+Options are
+%s
+Files are %s""", args, pprint.pformat(vars(opts)), files)
+
+
+        if opts.print_settings:
+            print 
+            print '>> Available Cheetah compiler settings:'
+            from Cheetah.Compiler import _DEFAULT_COMPILER_SETTINGS
+            listing = _DEFAULT_COMPILER_SETTINGS
+            listing.sort(key=lambda l: l[0][0].lower())
+
+            for l in listing:
+                print '\t%s (default: "%s")\t%s' % l
+            sys.exit(0)
+
+        #cleanup trailing path separators
+        seps = [sep for sep in [os.sep, os.altsep] if sep]
+        for attr in ['idir', 'odir']:
+            for sep in seps:
+                path = getattr(opts, attr, None)
+                if path and path.endswith(sep):
+                    path = path[:-len(sep)]
+                    setattr(opts, attr, path)
+                    break
+
+        self._fixExts()
+        if opts.env:
+            self.searchList.insert(0, os.environ)
+        if opts.pickle:
+            f = open(opts.pickle, 'rb')
+            unpickled = pickle.load(f)
+            f.close()
+            self.searchList.insert(0, unpickled)
+        opts.verbose = not opts.stdout
+
+    ##################################################
+    ## COMMAND METHODS
+
+    def compile(self):
+        self._compileOrFill()
+
+    def fill(self):
+        from Cheetah.ImportHooks import install
+        install()        
+        self._compileOrFill()
+
+    def help(self):
+        usage(HELP_PAGE1, "", sys.stdout)
+
+    def options(self):
+        return self.parser.print_help()
+
+    def test(self):
+        # @@MO: Ugly kludge.
+        TEST_WRITE_FILENAME = 'cheetah_test_file_creation_ability.tmp'
+        try:
+            f = open(TEST_WRITE_FILENAME, 'w')
+        except:
+            sys.exit("""\
+Cannot run the tests because you don't have write permission in the current
+directory.  The tests need to create temporary files.  Change to a directory
+you do have write permission to and re-run the tests.""")
+        else:
+            f.close()
+            os.remove(TEST_WRITE_FILENAME)
+        # @@MO: End ugly kludge.
+        from Cheetah.Tests import Test
+        import unittest
+        verbosity = 1
+        if '-q' in self.testOpts:
+            verbosity = 0
+        if '-v' in self.testOpts:
+            verbosity = 2
+        runner = unittest.TextTestRunner(verbosity=verbosity)
+        runner.run(unittest.TestSuite(Test.suites))
+        
+    def version(self):
+        print Version
+
+    # If you add a command, also add it to the 'meths' variable in main().
+    
+    ##################################################
+    ## LOGGING METHODS
+
+    def chatter(self, format, *args):
+        """Print a verbose message to stdout.  But don't if .opts.stdout is
+           true or .opts.verbose is false.
+        """
+        if self.opts.stdout or not self.opts.verbose:
+            return
+        fprintfMessage(sys.stdout, format, *args)
+
+
+    def debug(self, format, *args):
+        """Print a debugging message to stderr, but don't if .debug is
+           false.
+        """
+        if self.opts.debug:
+            fprintfMessage(sys.stderr, format, *args)
+    
+    def warn(self, format, *args):
+        """Always print a warning message to stderr.
+        """
+        fprintfMessage(sys.stderr, format, *args)
+
+    def error(self, format, *args):
+        """Always print a warning message to stderr and exit with an error code.        
+        """
+        fprintfMessage(sys.stderr, format, *args)
+        sys.exit(1)
+
+    ##################################################
+    ## HELPER METHODS
+
+
+    def _fixExts(self):
+        assert self.opts.oext, "oext is empty!"
+        iext, oext = self.opts.iext, self.opts.oext
+        if iext and not iext.startswith("."):
+            self.opts.iext = "." + iext
+        if oext and not oext.startswith("."):
+            self.opts.oext = "." + oext
+    
+
+
+    def _compileOrFill(self):
+        C, D, W = self.chatter, self.debug, self.warn
+        opts, files = self.opts, self.pathArgs
+        if files == ["-"]: 
+            self._compileOrFillStdin()
+            return
+        elif not files and opts.recurse:
+            which = opts.idir and "idir" or "current"
+            C("Drilling down recursively from %s directory.", which)
+            sourceFiles = []
+            dir = os.path.join(self.opts.idir, os.curdir)
+            os.path.walk(dir, self._expandSourceFilesWalk, sourceFiles)
+        elif not files:
+            usage(HELP_PAGE1, "Neither files nor -R specified!")
+        else:
+            sourceFiles = self._expandSourceFiles(files, opts.recurse, True)
+        sourceFiles = [os.path.normpath(x) for x in sourceFiles]
+        D("All source files found: %s", sourceFiles)
+        bundles = self._getBundles(sourceFiles)
+        D("All bundles: %s", pprint.pformat(bundles))
+        if self.opts.flat:
+            self._checkForCollisions(bundles)
+
+        # In parallel mode a new process is forked for each template
+        # compilation, out of a pool of size self.opts.parallel. This is not
+        # really optimal in all cases (e.g. probably wasteful for small
+        # templates), but seems to work well in real life for me.
+        #
+        # It also won't work for Windows users, but I'm not going to lose any
+        # sleep over that.
+        if self.opts.parallel > 1:
+            bad_child_exit = 0
+            pid_pool = set()
+
+            def child_wait():
+                pid, status = os.wait()
+                pid_pool.remove(pid)
+                return os.WEXITSTATUS(status)
+
+            while bundles:
+                b = bundles.pop()
+                pid = os.fork()
+                if pid:
+                    pid_pool.add(pid)
+                else:
+                    self._compileOrFillBundle(b)
+                    sys.exit(0)
+
+                if len(pid_pool) == self.opts.parallel:
+                    bad_child_exit = child_wait()
+                    if bad_child_exit:
+                        break
+
+            while pid_pool:
+                child_exit = child_wait()
+                if not bad_child_exit:
+                    bad_child_exit = child_exit
+
+            if bad_child_exit:
+                sys.exit("Child process failed, exited with code %d" % bad_child_exit)
+
+        else:
+            for b in bundles:
+                self._compileOrFillBundle(b)
+
+    def _checkForCollisions(self, bundles):
+        """Check for multiple source paths writing to the same destination
+           path.
+        """
+        C, D, W = self.chatter, self.debug, self.warn
+        isError = False
+        dstSources = {}
+        for b in bundles:
+            if dstSources.has_key(b.dst):
+                dstSources[b.dst].append(b.src)
+            else:
+                dstSources[b.dst] = [b.src]
+        keys = dstSources.keys()
+        keys.sort()
+        for dst in keys:
+            sources = dstSources[dst]
+            if len(sources) > 1:
+                isError = True
+                sources.sort()
+                fmt = "Collision: multiple source files %s map to one destination file %s"
+                W(fmt, sources, dst)
+        if isError:
+            what = self.isCompile and "Compilation" or "Filling"
+            sys.exit("%s aborted due to collisions" % what)
+                
+
+    def _expandSourceFilesWalk(self, arg, dir, files):
+        """Recursion extension for .expandSourceFiles().
+           This method is a callback for os.path.walk().
+           'arg' is a list to which successful paths will be appended.
+        """
+        iext = self.opts.iext
+        for f in files:
+            path = os.path.join(dir, f)
+            if   path.endswith(iext) and os.path.isfile(path):
+                arg.append(path)
+            elif os.path.islink(path) and os.path.isdir(path):
+                os.path.walk(path, self._expandSourceFilesWalk, arg)
+            # If is directory, do nothing; 'walk' will eventually get it.
+
+
+    def _expandSourceFiles(self, files, recurse, addIextIfMissing):
+        """Calculate source paths from 'files' by applying the 
+           command-line options.
+        """
+        C, D, W = self.chatter, self.debug, self.warn
+        idir = self.opts.idir
+        iext = self.opts.iext
+        files = [] 
+        for f in self.pathArgs:
+            oldFilesLen = len(files)
+            D("Expanding %s", f)
+            path = os.path.join(idir, f)
+            pathWithExt = path + iext # May or may not be valid.
+            if os.path.isdir(path):
+                if recurse:
+                    os.path.walk(path, self._expandSourceFilesWalk, files)
+                else:
+                    raise Error("source file '%s' is a directory" % path)
+            elif os.path.isfile(path):
+                files.append(path)
+            elif (addIextIfMissing and not path.endswith(iext) and 
+                  os.path.isfile(pathWithExt)):
+                files.append(pathWithExt)
+                # Do not recurse directories discovered by iext appending.
+            elif os.path.exists(path):
+                W("Skipping source file '%s', not a plain file.", path)
+            else:
+                W("Skipping source file '%s', not found.", path)
+            if len(files) > oldFilesLen:
+                D("  ... found %s", files[oldFilesLen:])
+        return files
+
+
+    def _getBundles(self, sourceFiles):
+        flat = self.opts.flat
+        idir = self.opts.idir
+        iext = self.opts.iext
+        nobackup = self.opts.nobackup
+        odir = self.opts.odir
+        oext = self.opts.oext
+        idirSlash = idir + os.sep
+        bundles = []
+        for src in sourceFiles:
+            # 'base' is the subdirectory plus basename.
+            base = src
+            if idir and src.startswith(idirSlash):
+                base = src[len(idirSlash):]
+            if iext and base.endswith(iext):
+                base = base[:-len(iext)]
+            basename = os.path.basename(base)
+            if flat:
+                dst = os.path.join(odir, basename + oext)
+            else:
+                dbn = basename
+                if odir and base.startswith(os.sep):
+                    odd = odir
+                    while odd != '':
+                        idx = base.find(odd)
+                        if idx == 0:
+                            dbn = base[len(odd):]
+                            if dbn[0] == '/':
+                                dbn = dbn[1:]
+                            break
+                        odd = os.path.dirname(odd)
+                        if odd == '/':
+                            break
+                    dst = os.path.join(odir, dbn + oext)
+                else:
+                    dst = os.path.join(odir, base + oext)
+            bak = dst + self.BACKUP_SUFFIX
+            b = Bundle(src=src, dst=dst, bak=bak, base=base, basename=basename)
+            bundles.append(b)
+        return bundles
+
+
+    def _getTemplateClass(self):
+        C, D, W = self.chatter, self.debug, self.warn
+        modname = None
+        if self._templateClass:
+            return self._templateClass
+
+        modname = self.opts.templateClassName
+
+        if not modname:
+            return Template
+        p = modname.rfind('.')
+        if ':' not in modname:
+            self.error('The value of option --templateAPIClass is invalid\n'
+                       'It must be in the form "module:class", '
+                       'e.g. "Cheetah.Template:Template"')
+            
+        modname, classname = modname.split(':')
+
+        C('using --templateAPIClass=%s:%s'%(modname, classname))
+        
+        if p >= 0:
+            mod = getattr(__import__(modname[:p], {}, {}, [modname[p+1:]]), modname[p+1:])
+        else:
+            mod = __import__(modname, {}, {}, [])
+
+        klass = getattr(mod, classname, None)
+        if klass:
+            self._templateClass = klass
+            return klass
+        else:
+            self.error('**Template class specified in option --templateAPIClass not found\n'
+                       '**Falling back on Cheetah.Template:Template')
+
+
+    def _getCompilerSettings(self):
+        if self._compilerSettings:
+            return self._compilerSettings
+
+        def getkws(**kws):
+            return kws
+        if self.opts.compilerSettingsString:
+            try:
+                exec 'settings = getkws(%s)'%self.opts.compilerSettingsString
+            except:                
+                self.error("There's an error in your --settings option."
+                          "It must be valid Python syntax.\n"
+                          +"    --settings='%s'\n"%self.opts.compilerSettingsString
+                          +"  %s: %s"%sys.exc_info()[:2] 
+                          )
+
+            validKeys = DEFAULT_COMPILER_SETTINGS.keys()
+            if [k for k in settings.keys() if k not in validKeys]:
+                self.error(
+                    'The --setting "%s" is not a valid compiler setting name.'%k)
+            
+            self._compilerSettings = settings
+            return settings
+        else:
+            return {}
+
+    def _compileOrFillStdin(self):
+        TemplateClass = self._getTemplateClass()
+        compilerSettings = self._getCompilerSettings()
+        if self.isCompile:
+            pysrc = TemplateClass.compile(file=sys.stdin,
+                                          compilerSettings=compilerSettings,
+                                          returnAClass=False)
+            output = pysrc
+        else:
+            output = str(TemplateClass(file=sys.stdin, compilerSettings=compilerSettings))
+        sys.stdout.write(output)
+
+    def _compileOrFillBundle(self, b):
+        C, D, W = self.chatter, self.debug, self.warn
+        TemplateClass = self._getTemplateClass()
+        compilerSettings = self._getCompilerSettings()
+        src = b.src
+        dst = b.dst
+        base = b.base
+        basename = b.basename
+        dstDir = os.path.dirname(dst)
+        what = self.isCompile and "Compiling" or "Filling"
+        C("%s %s -> %s^", what, src, dst) # No trailing newline.
+        if os.path.exists(dst) and not self.opts.nobackup:
+            bak = b.bak
+            C(" (backup %s)", bak) # On same line as previous message.
+        else:
+            bak = None
+            C("")
+        if self.isCompile:
+            if not moduleNameRE.match(basename):
+                tup = basename, src
+                raise Error("""\
+%s: base name %s contains invalid characters.  It must
+be named according to the same rules as Python modules.""" % tup)
+            pysrc = TemplateClass.compile(file=src, returnAClass=False,
+                                          moduleName=basename,
+                                          className=basename,
+                                          commandlineopts=self.opts,
+                                          compilerSettings=compilerSettings)
+            output = pysrc
+        else:
+            #output = str(TemplateClass(file=src, searchList=self.searchList))
+            tclass = TemplateClass.compile(file=src, compilerSettings=compilerSettings)
+            output = str(tclass(searchList=self.searchList))
+            
+        if bak:
+            shutil.copyfile(dst, bak)
+        if dstDir and not os.path.exists(dstDir):
+            if self.isCompile:
+                mkdirsWithPyInitFiles(dstDir)
+            else:
+                os.makedirs(dstDir)
+        if self.opts.stdout:
+            sys.stdout.write(output)
+        else:
+            f = open(dst, 'w')
+            f.write(output)
+            f.close()
+            
+
+# Called when invoked as `cheetah`
+def _cheetah():
+    CheetahWrapper().main()
+
+# Called when invoked as `cheetah-compile`
+def _cheetah_compile():
+    sys.argv.insert(1, "compile")
+    CheetahWrapper().main()
+
+
+##################################################
+## if run from the command line
+if __name__ == '__main__':  CheetahWrapper().main()
+
+# vim: shiftwidth=4 tabstop=4 expandtab
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/convertTmplPathToModuleName.py
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/convertTmplPathToModuleName.py (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/convertTmplPathToModuleName.py (revision 3)
@@ -0,0 +1,15 @@
+import os.path
+import string
+
+l = ['_'] * 256
+for c in string.digits + string.letters:
+    l[ord(c)] = c
+_pathNameTransChars = string.join(l, '')
+del l, c
+
+def convertTmplPathToModuleName(tmplPath,
+                                _pathNameTransChars=_pathNameTransChars,
+                                splitdrive=os.path.splitdrive,
+                                translate=string.translate,
+                                ):
+    return translate(splitdrive(tmplPath)[1], _pathNameTransChars)
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/ImportManager.py
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/ImportManager.py (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/ImportManager.py (revision 3)
@@ -0,0 +1,565 @@
+# $Id: ImportManager.py,v 1.6 2007/04/03 01:56:24 tavis_rudd Exp $
+
+"""Provides an emulator/replacement for Python's standard import system.
+
+@@TR: Be warned that Import Hooks are in the deepest, darkest corner of Python's
+jungle.  If you need to start hacking with this, be prepared to get lost for a
+while. Also note, this module predates the newstyle import hooks in Python 2.3
+http://www.python.org/peps/pep-0302.html.  
+
+
+This is a hacked/documented version of Gordon McMillan's iu.py. I have:
+
+  - made it a little less terse
+
+  - added docstrings and explanatations
+
+  - standardized the variable naming scheme
+
+  - reorganized the code layout to enhance readability
+
+Meta-Data
+================================================================================
+Author: Tavis Rudd <tavis@damnsimple.com>  based on Gordon McMillan's iu.py
+License: This software is released for unlimited distribution under the
+         terms of the MIT license.  See the LICENSE file.
+Version: $Revision: 1.6 $
+Start Date: 2001/03/30
+Last Revision Date: $Date: 2007/04/03 01:56:24 $
+""" 
+__author__ = "Tavis Rudd <tavis@damnsimple.com>"
+__revision__ = "$Revision: 1.6 $"[11:-2]
+
+##################################################
+## DEPENDENCIES
+
+import sys
+import imp
+import marshal
+
+##################################################
+## CONSTANTS & GLOBALS
+
+try:
+    True,False
+except NameError:
+    True, False = (1==1),(1==0)
+
+_installed = False
+
+STRINGTYPE = type('')
+
+# _globalOwnerTypes is defined at the bottom of this file
+
+_os_stat = _os_path_join = _os_getcwd = _os_path_dirname = None
+
+##################################################
+## FUNCTIONS
+
+def _os_bootstrap():
+    """Set up 'os' module replacement functions for use during import bootstrap."""
+
+    names = sys.builtin_module_names
+
+    join = dirname = None
+    if 'posix' in names:
+        sep = '/'
+        from posix import stat, getcwd
+    elif 'nt' in names:
+        sep = '\\'
+        from nt import stat, getcwd
+    elif 'dos' in names:
+        sep = '\\'
+        from dos import stat, getcwd
+    elif 'os2' in names:
+        sep = '\\'
+        from os2 import stat, getcwd
+    elif 'mac' in names:
+        from mac import stat, getcwd
+        def join(a, b):
+            if a == '':
+                return b
+            if ':' not in a:
+                a = ':' + a
+            if a[-1:] != ':':
+                a = a + ':'
+            return a + b
+    else:
+        raise ImportError, 'no os specific module found'
+
+    if join is None:
+        def join(a, b, sep=sep):
+            if a == '':
+                return b
+            lastchar = a[-1:]
+            if lastchar == '/' or lastchar == sep:
+                return a + b
+            return a + sep + b
+
+    if dirname is None:
+        def dirname(a, sep=sep):
+            for i in range(len(a)-1, -1, -1):
+                c = a[i]
+                if c == '/' or c == sep:
+                    return a[:i]
+            return ''
+    
+    global _os_stat
+    _os_stat = stat
+
+    global _os_path_join
+    _os_path_join = join
+
+    global _os_path_dirname
+    _os_path_dirname = dirname
+    
+    global _os_getcwd
+    _os_getcwd = getcwd
+    
+_os_bootstrap()
+
+def packageName(s):
+    for i in range(len(s)-1, -1, -1):
+        if s[i] == '.':
+            break
+    else:
+        return ''
+    return s[:i]
+
+def nameSplit(s):
+    rslt = []
+    i = j = 0
+    for j in range(len(s)):
+        if s[j] == '.':
+            rslt.append(s[i:j])
+            i = j+1
+    if i < len(s):
+        rslt.append(s[i:])
+    return rslt
+
+def getPathExt(fnm):
+    for i in range(len(fnm)-1, -1, -1):
+        if fnm[i] == '.':
+            return fnm[i:]
+    return ''
+
+def pathIsDir(pathname):
+    "Local replacement for os.path.isdir()."
+    try:
+        s = _os_stat(pathname)
+    except OSError:
+        return None
+    return (s[0] & 0170000) == 0040000
+
+def getDescr(fnm):
+    ext = getPathExt(fnm)
+    for (suffix, mode, typ) in imp.get_suffixes():
+        if suffix == ext:
+            return (suffix, mode, typ)
+
+##################################################
+## CLASSES
+
+class Owner:
+    
+    """An Owner does imports from a particular piece of turf That is, there's
+    an Owner for each thing on sys.path There are owners for directories and
+    .pyz files.  There could be owners for zip files, or even URLs.  A
+    shadowpath (a dictionary mapping the names in sys.path to their owners) is
+    used so that sys.path (or a package's __path__) is still a bunch of strings,
+    """
+    
+    def __init__(self, path):
+        self.path = path
+
+    def __str__(self):
+        return self.path
+    
+    def getmod(self, nm):
+        return None
+    
+class DirOwner(Owner):
+    
+    def __init__(self, path):
+        if path == '':
+            path = _os_getcwd()
+        if not pathIsDir(path):
+            raise ValueError, "%s is not a directory" % path
+        Owner.__init__(self, path)
+        
+    def getmod(self, nm,
+               getsuffixes=imp.get_suffixes, loadco=marshal.loads, newmod=imp.new_module):
+        
+        pth =  _os_path_join(self.path, nm)
+
+        possibles = [(pth, 0, None)]
+        if pathIsDir(pth):
+            possibles.insert(0, (_os_path_join(pth, '__init__'), 1, pth))
+        py = pyc = None
+        for pth, ispkg, pkgpth in possibles:
+            for ext, mode, typ in getsuffixes():
+                attempt = pth+ext
+                try:
+                    st = _os_stat(attempt)
+                except:
+                    pass
+                else:
+                    if typ == imp.C_EXTENSION:
+                        fp = open(attempt, 'rb')
+                        mod = imp.load_module(nm, fp, attempt, (ext, mode, typ))
+                        mod.__file__ = attempt
+                        return mod
+                    elif typ == imp.PY_SOURCE:
+                        py = (attempt, st)
+                    else:
+                        pyc = (attempt, st)
+            if py or pyc:
+                break
+        if py is None and pyc is None:
+            return None
+        while 1:
+            if pyc is None or py and pyc[1][8] < py[1][8]:
+                try:
+                    co = compile(open(py[0], 'r').read()+'\n', py[0], 'exec')
+                    break
+                except SyntaxError, e:
+                    print "Invalid syntax in %s" % py[0]
+                    print e.args
+                    raise
+            elif pyc:
+                stuff = open(pyc[0], 'rb').read()
+                try:
+                    co = loadco(stuff[8:])
+                    break
+                except (ValueError, EOFError):
+                    pyc = None
+            else:
+                return None
+        mod = newmod(nm)
+        mod.__file__ = co.co_filename
+        if ispkg:
+            mod.__path__ = [pkgpth]
+            subimporter = PathImportDirector(mod.__path__)
+            mod.__importsub__ = subimporter.getmod
+        mod.__co__ = co
+        return mod
+
+
+class ImportDirector(Owner):
+    """ImportDirectors live on the metapath There's one for builtins, one for
+    frozen modules, and one for sys.path Windows gets one for modules gotten
+    from the Registry Mac would have them for PY_RESOURCE modules etc.  A
+    generalization of Owner - their concept of 'turf' is broader"""
+
+    pass
+
+class BuiltinImportDirector(ImportDirector):
+    """Directs imports of builtin modules"""
+    def __init__(self):
+        self.path = 'Builtins'
+
+    def getmod(self, nm, isbuiltin=imp.is_builtin):
+        if isbuiltin(nm):
+            mod = imp.load_module(nm, None, nm, ('','',imp.C_BUILTIN))
+            return mod
+        return None
+
+class FrozenImportDirector(ImportDirector):
+    """Directs imports of frozen modules"""
+    
+    def __init__(self):
+        self.path = 'FrozenModules'
+
+    def getmod(self, nm,
+               isFrozen=imp.is_frozen, loadMod=imp.load_module):
+        if isFrozen(nm):
+            mod = loadMod(nm, None, nm, ('','',imp.PY_FROZEN))
+            if hasattr(mod, '__path__'):
+                mod.__importsub__ = lambda name, pname=nm, owner=self: owner.getmod(pname+'.'+name)
+            return mod
+        return None
+
+
+class RegistryImportDirector(ImportDirector):
+    """Directs imports of modules stored in the Windows Registry"""
+
+    def __init__(self):
+        self.path = "WindowsRegistry"
+        self.map = {}
+        try:
+            import win32api
+            ## import win32con
+        except ImportError:
+            pass
+        else:
+            HKEY_CURRENT_USER = -2147483647
+            HKEY_LOCAL_MACHINE = -2147483646
+            KEY_ALL_ACCESS = 983103
+            subkey = r"Software\Python\PythonCore\%s\Modules" % sys.winver
+            for root in (HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE):
+                try:
+                    hkey = win32api.RegOpenKeyEx(root, subkey, 0, KEY_ALL_ACCESS)
+                except:
+                    pass
+                else:
+                    numsubkeys, numvalues, lastmodified = win32api.RegQueryInfoKey(hkey)
+                    for i in range(numsubkeys):
+                        subkeyname = win32api.RegEnumKey(hkey, i)
+                        hskey = win32api.RegOpenKeyEx(hkey, subkeyname, 0, KEY_ALL_ACCESS)
+                        val = win32api.RegQueryValueEx(hskey, '')
+                        desc = getDescr(val[0])
+                        self.map[subkeyname] = (val[0], desc)
+                        hskey.Close()
+                    hkey.Close()
+                    break
+                
+    def getmod(self, nm):
+        stuff = self.map.get(nm)
+        if stuff:
+            fnm, desc = stuff
+            fp = open(fnm, 'rb')
+            mod = imp.load_module(nm, fp, fnm, desc)
+            mod.__file__ = fnm
+            return mod
+        return None
+    
+class PathImportDirector(ImportDirector):
+    """Directs imports of modules stored on the filesystem."""
+
+    def __init__(self, pathlist=None, importers=None, ownertypes=None):
+        if pathlist is None:
+            self.path = sys.path
+        else:
+            self.path = pathlist
+        if ownertypes == None:
+            self._ownertypes = _globalOwnerTypes
+        else:
+            self._ownertypes = ownertypes
+        if importers:
+            self._shadowPath = importers
+        else:
+            self._shadowPath = {}
+        self._inMakeOwner = False
+        self._building = {}
+        
+    def getmod(self, nm):
+        mod = None
+        for thing in self.path:
+            if type(thing) is STRINGTYPE:
+                owner = self._shadowPath.get(thing, -1)
+                if owner == -1:
+                    owner = self._shadowPath[thing] = self._makeOwner(thing)
+                if owner:
+                    mod = owner.getmod(nm)
+            else:
+                mod = thing.getmod(nm)
+            if mod:
+                break
+        return mod
+    
+    def _makeOwner(self, path):
+        if self._building.get(path):
+            return None
+        self._building[path] = 1
+        owner = None
+        for klass in self._ownertypes:
+            try:
+                # this may cause an import, which may cause recursion
+                # hence the protection
+                owner = klass(path)
+            except:
+                pass
+            else:
+                break
+        del self._building[path]
+        return owner
+
+#=================ImportManager============================#
+# The one-and-only ImportManager
+# ie, the builtin import
+
+UNTRIED = -1
+
+class ImportManager:
+    # really the equivalent of builtin import
+    def __init__(self):
+        self.metapath = [
+            BuiltinImportDirector(),
+            FrozenImportDirector(),
+            RegistryImportDirector(),
+            PathImportDirector()
+        ]
+        self.threaded = 0
+        self.rlock = None
+        self.locker = None
+        self.setThreaded()
+        
+    def setThreaded(self):
+        thread = sys.modules.get('thread', None)
+        if thread and not self.threaded:
+            self.threaded = 1
+            self.rlock = thread.allocate_lock()
+            self._get_ident = thread.get_ident
+            
+    def install(self):
+        import __builtin__
+        __builtin__.__import__ = self.importHook
+        __builtin__.reload = self.reloadHook
+        
+    def importHook(self, name, globals=None, locals=None, fromlist=None, level=-1):
+        '''
+            NOTE: Currently importHook will accept the keyword-argument "level" 
+            but it will *NOT* use it (currently). Details about the "level" keyword
+            argument can be found here: http://www.python.org/doc/2.5.2/lib/built-in-funcs.html
+        '''
+        # first see if we could be importing a relative name
+        #print "importHook(%s, %s, locals, %s)" % (name, globals['__name__'], fromlist)
+        _sys_modules_get = sys.modules.get
+        contexts = [None]
+        if globals:
+            importernm = globals.get('__name__', '')
+            if importernm:
+                if hasattr(_sys_modules_get(importernm), '__path__'):
+                    contexts.insert(0,importernm)
+                else:
+                    pkgnm = packageName(importernm)
+                    if pkgnm:
+                        contexts.insert(0,pkgnm)
+        # so contexts is [pkgnm, None] or just [None]
+        # now break the name being imported up so we get:
+        # a.b.c -> [a, b, c]
+        nmparts = nameSplit(name)
+        _self_doimport = self.doimport
+        threaded = self.threaded
+        for context in contexts:
+            ctx = context
+            for i in range(len(nmparts)):
+                nm = nmparts[i]
+                #print " importHook trying %s in %s" % (nm, ctx)
+                if ctx:
+                    fqname = ctx + '.' + nm
+                else:
+                    fqname = nm
+                if threaded:
+                    self._acquire()
+                mod = _sys_modules_get(fqname, UNTRIED)
+                if mod is UNTRIED:
+                    mod = _self_doimport(nm, ctx, fqname)
+                if threaded:
+                    self._release()
+                if mod:
+                    ctx = fqname
+                else:
+                    break
+            else:
+                # no break, point i beyond end
+                i = i + 1
+            if i:
+                break
+            
+        if i<len(nmparts):
+            if ctx and hasattr(sys.modules[ctx], nmparts[i]):
+                #print "importHook done with %s %s %s (case 1)" % (name, globals['__name__'], fromlist)
+                return sys.modules[nmparts[0]]
+            del sys.modules[fqname]
+            raise ImportError, "No module named %s" % fqname
+        if fromlist is None: 
+            #print "importHook done with %s %s %s (case 2)" % (name, globals['__name__'], fromlist)
+            if context:
+                return sys.modules[context+'.'+nmparts[0]]
+            return sys.modules[nmparts[0]]
+        bottommod = sys.modules[ctx]
+        if hasattr(bottommod, '__path__'):
+            fromlist = list(fromlist)
+            i = 0
+            while i < len(fromlist):
+                nm = fromlist[i]
+                if nm == '*':
+                    fromlist[i:i+1] = list(getattr(bottommod, '__all__', []))
+                    if i >= len(fromlist):
+                        break
+                    nm = fromlist[i]
+                i = i + 1
+                if not hasattr(bottommod, nm):
+                    if self.threaded:
+                        self._acquire()
+                    mod = self.doimport(nm, ctx, ctx+'.'+nm)
+                    if self.threaded:
+                        self._release()
+                    if not mod:
+                        raise ImportError, "%s not found in %s" % (nm, ctx)
+        #print "importHook done with %s %s %s (case 3)" % (name, globals['__name__'], fromlist)
+        return bottommod
+    
+    def doimport(self, nm, parentnm, fqname):
+        # Not that nm is NEVER a dotted name at this point
+        #print "doimport(%s, %s, %s)" % (nm, parentnm, fqname)
+        if parentnm:
+            parent = sys.modules[parentnm]
+            if hasattr(parent, '__path__'):
+                importfunc = getattr(parent, '__importsub__', None)
+                if not importfunc:
+                    subimporter = PathImportDirector(parent.__path__)
+                    importfunc = parent.__importsub__ = subimporter.getmod
+                mod = importfunc(nm)
+                if mod:
+                    setattr(parent, nm, mod)
+            else:
+                #print "..parent not a package"
+                return None
+        else:
+            # now we're dealing with an absolute import
+            for director in self.metapath:
+                mod = director.getmod(nm)
+                if mod:
+                    break
+        if mod:
+            mod.__name__ = fqname
+            sys.modules[fqname] = mod
+            if hasattr(mod, '__co__'):
+                co = mod.__co__
+                del mod.__co__
+                exec co in mod.__dict__
+            if fqname == 'thread' and not self.threaded:
+##                print "thread detected!"
+                self.setThreaded()
+        else:
+            sys.modules[fqname] = None
+        #print "..found %s" % mod
+        return mod
+    
+    def reloadHook(self, mod):
+        fqnm = mod.__name__
+        nm = nameSplit(fqnm)[-1]
+        parentnm = packageName(fqnm)
+        newmod = self.doimport(nm, parentnm, fqnm)
+        mod.__dict__.update(newmod.__dict__)
+##        return newmod
+        
+    def _acquire(self):
+        if self.rlock.locked():
+            if self.locker == self._get_ident():
+                self.lockcount = self.lockcount + 1
+##                print "_acquire incrementing lockcount to", self.lockcount
+                return
+        self.rlock.acquire()
+        self.locker = self._get_ident()
+        self.lockcount = 0
+##        print "_acquire first time!"
+        
+    def _release(self):
+        if self.lockcount:
+            self.lockcount = self.lockcount - 1
+##            print "_release decrementing lockcount to", self.lockcount
+        else:
+            self.rlock.release()
+##            print "_release releasing lock!"
+
+
+##################################################
+## MORE CONSTANTS & GLOBALS
+
+_globalOwnerTypes = [
+    DirOwner,
+    Owner,
+]
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/ErrorCatchers.py
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/ErrorCatchers.py (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/ErrorCatchers.py (revision 3)
@@ -0,0 +1,62 @@
+# $Id: ErrorCatchers.py,v 1.7 2005/01/03 19:59:07 tavis_rudd Exp $
+"""ErrorCatcher class for Cheetah Templates
+
+Meta-Data
+================================================================================
+Author: Tavis Rudd <tavis@damnsimple.com>
+Version: $Revision: 1.7 $
+Start Date: 2001/08/01
+Last Revision Date: $Date: 2005/01/03 19:59:07 $
+"""
+__author__ = "Tavis Rudd <tavis@damnsimple.com>"
+__revision__ = "$Revision: 1.7 $"[11:-2]
+
+import time
+from Cheetah.NameMapper import NotFound
+
+class Error(Exception):
+    pass
+
+class ErrorCatcher:
+    _exceptionsToCatch = (NotFound,)
+    
+    def __init__(self, templateObj):
+        pass
+    
+    def exceptions(self):
+        return self._exceptionsToCatch
+    
+    def warn(self, exc_val, code, rawCode, lineCol):
+        return rawCode
+## make an alias
+Echo = ErrorCatcher
+
+class BigEcho(ErrorCatcher):
+    def warn(self, exc_val, code, rawCode, lineCol):
+        return "="*15 + "&lt;" + rawCode + " could not be found&gt;" + "="*15
+
+class KeyError(ErrorCatcher):
+    def warn(self, exc_val, code, rawCode, lineCol):
+        raise KeyError("no '%s' in this Template Object's Search List" % rawCode) 
+
+class ListErrors(ErrorCatcher):
+    """Accumulate a list of errors."""
+    _timeFormat = "%c"
+    
+    def __init__(self, templateObj):
+        ErrorCatcher.__init__(self, templateObj)
+        self._errors = []
+
+    def warn(self, exc_val, code, rawCode, lineCol):
+        dict = locals().copy()
+        del dict['self']
+        dict['time'] = time.strftime(self._timeFormat,
+                                     time.localtime(time.time()))
+        self._errors.append(dict)
+        return rawCode
+    
+    def listErrors(self):
+        """Return the list of errors."""
+        return self._errors
+
+
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/CacheRegion.py
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/CacheRegion.py (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/CacheRegion.py (revision 3)
@@ -0,0 +1,136 @@
+# $Id: CacheRegion.py,v 1.3 2006/01/28 04:19:30 tavis_rudd Exp $
+'''
+Cache holder classes for Cheetah:
+
+Cache regions are defined using the #cache Cheetah directive. Each
+cache region can be viewed as a dictionary (keyed by cacheRegionID)
+handling at least one cache item (the default one). It's possible to add
+cacheItems in a region by using the `varyBy` #cache directive parameter as
+in the following example::
+   #def getArticle
+      this is the article content.
+   #end def
+
+   #cache varyBy=$getArticleID()
+      $getArticle($getArticleID())
+   #end cache
+
+The code above will generate a CacheRegion and add new cacheItem for each value
+of $getArticleID().
+'''
+
+try:
+    from hashlib import md5
+except ImportError:
+    from md5 import md5
+
+import time
+import Cheetah.CacheStore
+
+class CacheItem(object):
+    '''
+    A CacheItem is a container storing:
+
+        - cacheID (string)
+        - refreshTime (timestamp or None) : last time the cache was refreshed
+        - data (string) : the content of the cache
+    '''
+    
+    def __init__(self, cacheItemID, cacheStore):
+        self._cacheItemID = cacheItemID
+        self._cacheStore = cacheStore
+        self._refreshTime = None
+        self._expiryTime = 0
+
+    def hasExpired(self):
+        return (self._expiryTime and time.time() > self._expiryTime)
+    
+    def setExpiryTime(self, time):
+        self._expiryTime = time
+
+    def getExpiryTime(self):
+        return self._expiryTime
+
+    def setData(self, data):
+        self._refreshTime = time.time()
+        self._cacheStore.set(self._cacheItemID, data, self._expiryTime)
+
+    def getRefreshTime(self):
+        return self._refreshTime
+
+    def getData(self):
+        assert self._refreshTime
+        return self._cacheStore.get(self._cacheItemID)
+
+    def renderOutput(self):
+        """Can be overridden to implement edge-caching"""
+        return self.getData() or ""
+
+    def clear(self):
+        self._cacheStore.delete(self._cacheItemID)
+        self._refreshTime = None
+
+class _CacheDataStoreWrapper(object):
+    def __init__(self, dataStore, keyPrefix):
+        self._dataStore = dataStore
+        self._keyPrefix = keyPrefix
+        
+    def get(self, key):
+        return self._dataStore.get(self._keyPrefix+key)
+
+    def delete(self, key):
+        self._dataStore.delete(self._keyPrefix+key)
+
+    def set(self, key, val, time=0):        
+        self._dataStore.set(self._keyPrefix+key, val, time=time)
+
+class CacheRegion(object):
+    '''
+    A `CacheRegion` stores some `CacheItem` instances.
+
+    This implementation stores the data in the memory of the current process.
+    If you need a more advanced data store, create a cacheStore class that works
+    with Cheetah's CacheStore protocol and provide it as the cacheStore argument
+    to __init__.  For example you could use
+    Cheetah.CacheStore.MemcachedCacheStore, a wrapper around the Python
+    memcached API (http://www.danga.com/memcached).
+    '''
+    _cacheItemClass = CacheItem
+    
+    def __init__(self, regionID, templateCacheIdPrefix='', cacheStore=None):
+        self._isNew = True
+        self._regionID = regionID
+        self._templateCacheIdPrefix = templateCacheIdPrefix
+        if not cacheStore:
+            cacheStore = Cheetah.CacheStore.MemoryCacheStore()
+        self._cacheStore = cacheStore
+        self._wrappedCacheDataStore = _CacheDataStoreWrapper(
+            cacheStore, keyPrefix=templateCacheIdPrefix+':'+regionID+':')
+        self._cacheItems = {}
+
+    def isNew(self):
+        return self._isNew
+        
+    def clear(self):
+        " drop all the caches stored in this cache region "
+        for cacheItemId in self._cacheItems.keys():
+            cacheItem = self._cacheItems[cacheItemId]
+            cacheItem.clear()
+            del self._cacheItems[cacheItemId]
+        
+    def getCacheItem(self, cacheItemID):
+        """ Lazy access to a cacheItem
+
+            Try to find a cache in the stored caches. If it doesn't
+            exist, it's created.
+            
+            Returns a `CacheItem` instance.
+        """
+        cacheItemID = md5(str(cacheItemID)).hexdigest()
+        
+        if not self._cacheItems.has_key(cacheItemID):
+            cacheItem = self._cacheItemClass(
+                cacheItemID=cacheItemID, cacheStore=self._wrappedCacheDataStore)
+            self._cacheItems[cacheItemID] = cacheItem
+            self._isNew = False
+        return self._cacheItems[cacheItemID]
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Templates/__init__.py
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Templates/__init__.py (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Templates/__init__.py (revision 3)
@@ -0,0 +1,1 @@
+
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Templates/_SkeletonPage.py
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Templates/_SkeletonPage.py (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Templates/_SkeletonPage.py (revision 3)
@@ -0,0 +1,215 @@
+# $Id: _SkeletonPage.py,v 1.13 2002/10/01 17:52:02 tavis_rudd Exp $
+"""A baseclass for the SkeletonPage template
+
+Meta-Data
+==========
+Author: Tavis Rudd <tavis@damnsimple.com>,
+Version: $Revision: 1.13 $
+Start Date: 2001/04/05
+Last Revision Date: $Date: 2002/10/01 17:52:02 $
+"""
+__author__ = "Tavis Rudd <tavis@damnsimple.com>"
+__revision__ = "$Revision: 1.13 $"[11:-2]
+
+##################################################
+## DEPENDENCIES ##
+
+import time, types, os, sys
+
+# intra-package imports ...
+from Cheetah.Template import Template
+
+
+##################################################
+## GLOBALS AND CONSTANTS ##
+
+True = (1==1)
+False = (0==1)
+
+##################################################
+## CLASSES ##
+        
+class _SkeletonPage(Template):
+    """A baseclass for the SkeletonPage template"""
+
+    docType = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" ' + \
+              '"http://www.w3.org/TR/html4/loose.dtd">'
+    
+    # docType = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ' + \
+    #'"http://www.w3.org/TR/xhtml1l/DTD/transitional.dtd">'
+        
+    title = ''
+    siteDomainName = 'www.example.com'
+    siteCredits = 'Designed & Implemented by Tavis Rudd'
+    siteCopyrightName = "Tavis Rudd"
+    htmlTag = '<html>'
+    
+    def __init__(self, *args, **KWs):
+        Template.__init__(self, *args, **KWs)
+        self._metaTags = {'HTTP-EQUIV':{'keywords':'Cheetah',
+                                        'Content-Type':'text/html; charset=iso-8859-1',
+                                        }, 
+                    'NAME':{'generator':'Cheetah: The Python-Powered Template Engine'}
+                    }
+        # metaTags = {'HTTP_EQUIV':{'test':1234}, 'NAME':{'test':1234,'test2':1234} }
+        self._stylesheets = {}
+        # stylesheets = {'.cssClassName':'stylesheetCode'}
+        self._stylesheetsOrder = []
+        # stylesheetsOrder = ['.cssClassName',]
+        self._stylesheetLibs = {}
+        # stylesheetLibs = {'libName':'libSrcPath'}
+        self._javascriptLibs = {}
+        self._javascriptTags = {}
+        # self._javascriptLibs = {'libName':'libSrcPath'}
+        self._bodyTagAttribs = {}
+
+    def metaTags(self):
+        """Return a formatted vesion of the self._metaTags dictionary, using the
+        formatMetaTags function from Cheetah.Macros.HTML"""
+        
+        return self.formatMetaTags(self._metaTags)
+    
+    def stylesheetTags(self):
+        """Return a formatted version of the self._stylesheetLibs and
+        self._stylesheets dictionaries.  The keys in self._stylesheets must
+        be listed in the order that they should appear in the list
+        self._stylesheetsOrder, to ensure that the style rules are defined in
+        the correct order."""
+        
+        stylesheetTagsTxt = ''
+        for title, src in self._stylesheetLibs.items():
+            stylesheetTagsTxt += '<link rel="stylesheet" type="text/css" href="' + str(src) + '" />\n'
+
+        if not self._stylesheetsOrder:
+            return stylesheetTagsTxt
+        
+        stylesheetTagsTxt += '<style type="text/css"><!--\n'
+        for identifier in self._stylesheetsOrder:
+            if not self._stylesheets.has_key(identifier):
+                warning = '# the identifier ' + identifier + \
+                          'was in stylesheetsOrder, but not in stylesheets'
+                print warning
+                stylesheetTagsTxt += warning
+                continue
+                    
+            attribsDict = self._stylesheets[identifier]
+            cssCode = ''
+            attribCode = ''
+            for k, v in attribsDict.items():
+                attribCode += str(k) + ': ' + str(v) + '; '
+            attribCode = attribCode[:-2] # get rid of the last semicolon
+                
+            cssCode = '\n' + identifier + ' {' +  attribCode + '}'
+            stylesheetTagsTxt += cssCode
+            
+        stylesheetTagsTxt += '\n//--></style>\n'
+
+        return stylesheetTagsTxt
+
+    def javascriptTags(self):
+        """Return a formatted version of the javascriptTags and
+        javascriptLibs dictionaries.  Each value in javascriptTags
+        should be a either a code string to include, or a list containing the
+        JavaScript version number and the code string. The keys can be anything.
+        The same applies for javascriptLibs, but the string should be the
+        SRC filename rather than a code string."""
+        
+        javascriptTagsTxt = []
+        for key, details in self._javascriptTags.items():
+            if type(details) not in (types.ListType, types.TupleType):
+                details = ['',details]
+                
+            javascriptTagsTxt += ['<script language="JavaScript', str(details[0]),
+                                  '" type="text/javascript"><!--\n',
+                                  str(details[0]), '\n//--></script>\n']
+
+
+        for key, details in self._javascriptLibs.items():
+            if type(details) not in (types.ListType, types.TupleType):
+                details = ['',details]
+
+            javascriptTagsTxt += ['<script language="JavaScript', str(details[0]),
+                                  '" type="text/javascript" src="',
+                                  str(details[1]), '" />\n']
+        return ''.join(javascriptTagsTxt)
+    
+    def bodyTag(self):
+        """Create a body tag from the entries in the dict bodyTagAttribs."""
+        return self.formHTMLTag('body', self._bodyTagAttribs)
+
+
+    def imgTag(self, src, alt='', width=None, height=None, border=0):
+        
+        """Dynamically generate an image tag.  Cheetah will try to convert the
+        src argument to a WebKit serverSidePath relative to the servlet's
+        location. If width and height aren't specified they are calculated using
+        PIL or ImageMagick if available."""
+        
+        src = self.normalizePath(src)
+        
+
+        if not width or not height:
+            try:                    # see if the dimensions can be calc'd with PIL
+                import Image
+                im = Image.open(src)
+                calcWidth, calcHeight = im.size
+                del im
+                if not width: width = calcWidth
+                if not height: height = calcHeight
+
+            except:
+                try:                # try imageMagick instead
+                    calcWidth, calcHeight = os.popen(
+                        'identify -format "%w,%h" ' + src).read().split(',')
+                    if not width: width = calcWidth
+                    if not height: height = calcHeight
+        
+                except:
+                    pass
+                
+        if width and height:
+            return ''.join(['<img src="', src, '" width="', str(width), '" height="', str(height),
+                           '" alt="', alt, '" border="', str(border), '" />'])
+        elif width:
+            return ''.join(['<img src="', src, '" width="', str(width),
+                           '" alt="', alt, '" border="', str(border), '" />'])
+        elif height:
+            return ''.join(['<img src="', src, '" height="', str(height),
+                           '" alt="', alt, '" border="', str(border), '" />'])
+        else:
+            return ''.join(['<img src="', src, '" alt="', alt, '" border="', str(border),'" />'])
+
+
+    def currentYr(self):
+        """Return a string representing the current yr."""
+        return time.strftime("%Y",time.localtime(time.time()))
+    
+    def currentDate(self, formatString="%b %d, %Y"):
+        """Return a string representing the current localtime."""
+        return time.strftime(formatString,time.localtime(time.time()))
+    
+    def spacer(self, width=1,height=1):
+        return '<img src="spacer.gif" width="%s" height="%s" alt="" />'% (str(width), str(height))
+    
+    def formHTMLTag(self, tagName, attributes={}):
+        """returns a string containing an HTML <tag> """
+        tagTxt = ['<', tagName.lower()]
+        for name, val in attributes.items():
+            tagTxt += [' ', name.lower(), '="', str(val),'"']
+        tagTxt.append('>')
+        return ''.join(tagTxt)
+    
+    def formatMetaTags(self, metaTags):
+        """format a dict of metaTag definitions into an HTML version"""
+        metaTagsTxt = []
+        if metaTags.has_key('HTTP-EQUIV'):
+            for http_equiv, contents in metaTags['HTTP-EQUIV'].items():
+                metaTagsTxt += ['<meta http-equiv="', str(http_equiv), '" content="',
+                                str(contents), '" />\n']
+                
+        if metaTags.has_key('NAME'):
+            for name, contents in metaTags['NAME'].items():
+                metaTagsTxt += ['<meta name="', str(name), '" content="', str(contents),
+                                '" />\n']
+        return ''.join(metaTagsTxt)
+    
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Templates/SkeletonPage.py
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Templates/SkeletonPage.py (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Templates/SkeletonPage.py (revision 3)
@@ -0,0 +1,272 @@
+
+
+"""A Skeleton HTML page template, that provides basic structure and utility methods.
+"""
+
+
+##################################################
+## DEPENDENCIES
+import sys
+import os
+import os.path
+from os.path import getmtime, exists
+import time
+import types
+import __builtin__
+from Cheetah.Version import MinCompatibleVersion as RequiredCheetahVersion
+from Cheetah.Version import MinCompatibleVersionTuple as RequiredCheetahVersionTuple
+from Cheetah.Template import Template
+from Cheetah.DummyTransaction import DummyTransaction
+from Cheetah.NameMapper import NotFound, valueForName, valueFromSearchList, valueFromFrameOrSearchList
+from Cheetah.CacheRegion import CacheRegion
+import Cheetah.Filters as Filters
+import Cheetah.ErrorCatchers as ErrorCatchers
+from Cheetah.Templates._SkeletonPage import _SkeletonPage
+
+##################################################
+## MODULE CONSTANTS
+try:
+    True, False
+except NameError:
+    True, False = (1==1), (1==0)
+VFFSL=valueFromFrameOrSearchList
+VFSL=valueFromSearchList
+VFN=valueForName
+currentTime=time.time
+__CHEETAH_version__ = '2.0rc6'
+__CHEETAH_versionTuple__ = (2, 0, 0, 'candidate', 6)
+__CHEETAH_genTime__ = 1139107954.3640411
+__CHEETAH_genTimestamp__ = 'Sat Feb  4 18:52:34 2006'
+__CHEETAH_src__ = 'src/Templates/SkeletonPage.tmpl'
+__CHEETAH_srcLastModified__ = 'Mon Oct  7 11:37:30 2002'
+__CHEETAH_docstring__ = 'Autogenerated by CHEETAH: The Python-Powered Template Engine'
+
+if __CHEETAH_versionTuple__ < RequiredCheetahVersionTuple:
+    raise AssertionError(
+      'This template was compiled with Cheetah version'
+      ' %s. Templates compiled before version %s must be recompiled.'%(
+         __CHEETAH_version__, RequiredCheetahVersion))
+
+##################################################
+## CLASSES
+
+class SkeletonPage(_SkeletonPage):
+
+    ##################################################
+    ## CHEETAH GENERATED METHODS
+
+
+    def __init__(self, *args, **KWs):
+
+        _SkeletonPage.__init__(self, *args, **KWs)
+        if not self._CHEETAH__instanceInitialized:
+            cheetahKWArgs = {}
+            allowedKWs = 'searchList namespaces filter filtersLib errorCatcher'.split()
+            for k,v in KWs.items():
+                if k in allowedKWs: cheetahKWArgs[k] = v
+            self._initCheetahInstance(**cheetahKWArgs)
+        
+
+    def writeHeadTag(self, **KWS):
+
+
+
+        ## CHEETAH: generated from #block writeHeadTag at line 22, col 1.
+        trans = KWS.get("trans")
+        if (not trans and not self._CHEETAH__isBuffering and not callable(self.transaction)):
+            trans = self.transaction # is None unless self.awake() was called
+        if not trans:
+            trans = DummyTransaction()
+            _dummyTrans = True
+        else: _dummyTrans = False
+        write = trans.response().write
+        SL = self._CHEETAH__searchList
+        _filter = self._CHEETAH__currentFilter
+        
+        ########################################
+        ## START - generated method body
+        
+        write('<head>\n<title>')
+        _v = VFFSL(SL,"title",True) # '$title' on line 24, col 8
+        if _v is not None: write(_filter(_v, rawExpr='$title')) # from line 24, col 8.
+        write('</title>\n')
+        _v = VFFSL(SL,"metaTags",True) # '$metaTags' on line 25, col 1
+        if _v is not None: write(_filter(_v, rawExpr='$metaTags')) # from line 25, col 1.
+        write(' \n')
+        _v = VFFSL(SL,"stylesheetTags",True) # '$stylesheetTags' on line 26, col 1
+        if _v is not None: write(_filter(_v, rawExpr='$stylesheetTags')) # from line 26, col 1.
+        write(' \n')
+        _v = VFFSL(SL,"javascriptTags",True) # '$javascriptTags' on line 27, col 1
+        if _v is not None: write(_filter(_v, rawExpr='$javascriptTags')) # from line 27, col 1.
+        write('\n</head>\n')
+        
+        ########################################
+        ## END - generated method body
+        
+        return _dummyTrans and trans.response().getvalue() or ""
+        
+
+    def writeBody(self, **KWS):
+
+
+
+        ## CHEETAH: generated from #block writeBody at line 36, col 1.
+        trans = KWS.get("trans")
+        if (not trans and not self._CHEETAH__isBuffering and not callable(self.transaction)):
+            trans = self.transaction # is None unless self.awake() was called
+        if not trans:
+            trans = DummyTransaction()
+            _dummyTrans = True
+        else: _dummyTrans = False
+        write = trans.response().write
+        SL = self._CHEETAH__searchList
+        _filter = self._CHEETAH__currentFilter
+        
+        ########################################
+        ## START - generated method body
+        
+        write('This skeleton page has no flesh. Its body needs to be implemented.\n')
+        
+        ########################################
+        ## END - generated method body
+        
+        return _dummyTrans and trans.response().getvalue() or ""
+        
+
+    def respond(self, trans=None):
+
+
+
+        ## CHEETAH: main method generated for this template
+        if (not trans and not self._CHEETAH__isBuffering and not callable(self.transaction)):
+            trans = self.transaction # is None unless self.awake() was called
+        if not trans:
+            trans = DummyTransaction()
+            _dummyTrans = True
+        else: _dummyTrans = False
+        write = trans.response().write
+        SL = self._CHEETAH__searchList
+        _filter = self._CHEETAH__currentFilter
+        
+        ########################################
+        ## START - generated method body
+        
+        
+        ## START CACHE REGION: ID=header. line 6, col 1 in the source.
+        _RECACHE_header = False
+        _cacheRegion_header = self.getCacheRegion(regionID='header', cacheInfo={'type': 2, 'id': 'header'})
+        if _cacheRegion_header.isNew():
+            _RECACHE_header = True
+        _cacheItem_header = _cacheRegion_header.getCacheItem('header')
+        if _cacheItem_header.hasExpired():
+            _RECACHE_header = True
+        if (not _RECACHE_header) and _cacheItem_header.getRefreshTime():
+            try:
+                _output = _cacheItem_header.renderOutput()
+            except KeyError:
+                _RECACHE_header = True
+            else:
+                write(_output)
+                del _output
+        if _RECACHE_header or not _cacheItem_header.getRefreshTime():
+            _orig_transheader = trans
+            trans = _cacheCollector_header = DummyTransaction()
+            write = _cacheCollector_header.response().write
+            _v = VFFSL(SL,"docType",True) # '$docType' on line 7, col 1
+            if _v is not None: write(_filter(_v, rawExpr='$docType')) # from line 7, col 1.
+            write('\n')
+            _v = VFFSL(SL,"htmlTag",True) # '$htmlTag' on line 8, col 1
+            if _v is not None: write(_filter(_v, rawExpr='$htmlTag')) # from line 8, col 1.
+            write('''
+<!-- This document was autogenerated by Cheetah(http://CheetahTemplate.org). 
+Do not edit it directly!
+
+Copyright ''')
+            _v = VFFSL(SL,"currentYr",True) # '$currentYr' on line 12, col 11
+            if _v is not None: write(_filter(_v, rawExpr='$currentYr')) # from line 12, col 11.
+            write(' - ')
+            _v = VFFSL(SL,"siteCopyrightName",True) # '$siteCopyrightName' on line 12, col 24
+            if _v is not None: write(_filter(_v, rawExpr='$siteCopyrightName')) # from line 12, col 24.
+            write(' - All Rights Reserved.\nFeel free to copy any javascript or html you like on this site,\nprovided you remove all links and/or references to ')
+            _v = VFFSL(SL,"siteDomainName",True) # '$siteDomainName' on line 14, col 52
+            if _v is not None: write(_filter(_v, rawExpr='$siteDomainName')) # from line 14, col 52.
+            write('''
+However, please do not copy any content or images without permission.
+
+''')
+            _v = VFFSL(SL,"siteCredits",True) # '$siteCredits' on line 17, col 1
+            if _v is not None: write(_filter(_v, rawExpr='$siteCredits')) # from line 17, col 1.
+            write('''
+
+-->
+
+
+''')
+            self.writeHeadTag(trans=trans)
+            write('\n')
+            trans = _orig_transheader
+            write = trans.response().write
+            _cacheData = _cacheCollector_header.response().getvalue()
+            _cacheItem_header.setData(_cacheData)
+            write(_cacheData)
+            del _cacheData
+            del _cacheCollector_header
+            del _orig_transheader
+        ## END CACHE REGION: header
+        
+        write('\n')
+        _v = VFFSL(SL,"bodyTag",True) # '$bodyTag' on line 34, col 1
+        if _v is not None: write(_filter(_v, rawExpr='$bodyTag')) # from line 34, col 1.
+        write('\n\n')
+        self.writeBody(trans=trans)
+        write('''
+</body>
+</html>
+
+
+
+''')
+        
+        ########################################
+        ## END - generated method body
+        
+        return _dummyTrans and trans.response().getvalue() or ""
+        
+    ##################################################
+    ## CHEETAH GENERATED ATTRIBUTES
+
+
+    _CHEETAH__instanceInitialized = False
+
+    _CHEETAH_version = __CHEETAH_version__
+
+    _CHEETAH_versionTuple = __CHEETAH_versionTuple__
+
+    _CHEETAH_genTime = __CHEETAH_genTime__
+
+    _CHEETAH_genTimestamp = __CHEETAH_genTimestamp__
+
+    _CHEETAH_src = __CHEETAH_src__
+
+    _CHEETAH_srcLastModified = __CHEETAH_srcLastModified__
+
+    _mainCheetahMethod_for_SkeletonPage= 'respond'
+
+## END CLASS DEFINITION
+
+if not hasattr(SkeletonPage, '_initCheetahAttributes'):
+    templateAPIClass = getattr(SkeletonPage, '_CHEETAH_templateClass', Template)
+    templateAPIClass._addCheetahPlumbingCodeToClass(SkeletonPage)
+
+
+# CHEETAH was developed by Tavis Rudd and Mike Orr
+# with code, advice and input from many other volunteers.
+# For more information visit http://www.CheetahTemplate.org/
+
+##################################################
+## if run from command line:
+if __name__ == '__main__':
+    from Cheetah.TemplateCmdLineIface import CmdLineIface
+    CmdLineIface(templateObj=SkeletonPage()).run()
+
+
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Templates/SkeletonPage.tmpl
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Templates/SkeletonPage.tmpl (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Templates/SkeletonPage.tmpl (revision 3)
@@ -0,0 +1,44 @@
+##doc-module: A Skeleton HTML page template, that provides basic structure and utility methods.
+################################################################################
+#extends Cheetah.Templates._SkeletonPage
+#implements respond
+################################################################################
+#cache id='header'
+$docType
+$htmlTag
+<!-- This document was autogenerated by Cheetah(http://CheetahTemplate.org). 
+Do not edit it directly!
+
+Copyright $currentYr - $siteCopyrightName - All Rights Reserved.
+Feel free to copy any javascript or html you like on this site,
+provided you remove all links and/or references to $siteDomainName
+However, please do not copy any content or images without permission.
+
+$siteCredits
+
+-->
+
+
+#block writeHeadTag
+<head>
+<title>$title</title>
+$metaTags 
+$stylesheetTags 
+$javascriptTags
+</head>
+#end block writeHeadTag
+
+#end cache header
+#################
+
+$bodyTag
+
+#block writeBody
+This skeleton page has no flesh. Its body needs to be implemented.
+#end block writeBody
+
+</body>
+</html>
+
+
+
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Filters.py
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Filters.py (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Filters.py (revision 3)
@@ -0,0 +1,233 @@
+'''
+    Filters for the #filter directive as well as #transform
+    
+    #filter results in output filters Cheetah's $placeholders .
+    #transform results in a filter on the entirety of the output
+'''
+import sys
+
+# Additional entities WebSafe knows how to transform.  No need to include
+# '<', '>' or '&' since those will have been done already.
+webSafeEntities = {' ': '&nbsp;', '"': '&quot;'}
+
+class Filter(object):
+    """A baseclass for the Cheetah Filters."""
+    
+    def __init__(self, template=None):
+        """Setup a reference to the template that is using the filter instance.
+        This reference isn't used by any of the standard filters, but is
+        available to Filter subclasses, should they need it.
+        
+        Subclasses should call this method.
+        """
+        self.template = template
+        
+    def filter(self, val, encoding=None, str=str, **kw):
+        '''
+            Pass Unicode strings through unmolested, unless an encoding is specified.
+        '''
+        if val is None:
+            return u''
+        if isinstance(val, unicode):
+            if encoding:
+                return val.encode(encoding)
+            else:
+                return val
+        else:
+            try:
+                return str(val)
+            except UnicodeEncodeError:
+                return unicode(val)
+        return u''
+
+RawOrEncodedUnicode = Filter
+
+class EncodeUnicode(Filter):
+    def filter(self, val,
+               encoding='utf8',
+               str=str,
+               **kw):
+        """Encode Unicode strings, by default in UTF-8.
+
+        >>> import Cheetah.Template
+        >>> t = Cheetah.Template.Template('''
+        ... $myvar
+        ... ${myvar, encoding='utf16'}
+        ... ''', searchList=[{'myvar': u'Asni\xe8res'}],
+        ... filter='EncodeUnicode')
+        >>> print t
+        """
+        if isinstance(val, unicode):
+            return val.encode(encoding)
+        if val is None:
+            return ''
+        return str(val)
+
+
+class Markdown(EncodeUnicode):
+    '''
+        Markdown will change regular strings to Markdown
+            (http://daringfireball.net/projects/markdown/)
+
+        Such that:
+            My Header
+            =========
+        Becaomes:
+            <h1>My Header</h1>
+
+        and so on.
+
+        Markdown is meant to be used with the #transform 
+        tag, as it's usefulness with #filter is marginal at
+        best
+    '''
+    def filter(self,  value, **kwargs):
+        # This is a bit of a hack to allow outright embedding of the markdown module
+        try:
+            import markdown
+        except ImportError:
+            print '>>> Exception raised importing the "markdown" module'
+            print '>>> Are you sure you have the ElementTree module installed?'
+            print '          http://effbot.org/downloads/#elementtree'
+            raise
+
+        encoded = super(Markdown, self).filter(value, **kwargs)
+        return markdown.markdown(encoded)
+
+class CodeHighlighter(EncodeUnicode):
+    '''
+        The CodeHighlighter filter depends on the "pygments" module which you can 
+        download and install from: http://pygments.org
+
+        What the CodeHighlighter assumes the string that it's receiving is source
+        code and uses pygments.lexers.guess_lexer() to try to guess which parser
+        to use when highlighting it. 
+
+        CodeHighlighter will return the HTML and CSS to render the code block, syntax 
+        highlighted, in a browser
+
+        NOTE: I had an issue installing pygments on Linux/amd64/Python 2.6 dealing with
+        importing of pygments.lexers, I was able to correct the failure by adding:
+            raise ImportError
+        to line 39 of pygments/plugin.py (since importing pkg_resources was causing issues)
+    '''
+    def filter(self, source, **kwargs):
+        encoded = super(CodeHighlighter, self).filter(source, **kwargs)
+        try:
+            from pygments import highlight
+            from pygments import lexers
+            from pygments import formatters
+        except ImportError, ex:
+            print '<%s> - Failed to import pygments! (%s)' % (self.__class__.__name__, ex)
+            print '-- You may need to install it from: http://pygments.org'
+            return encoded
+
+        lexer = None
+        try:
+            lexer = lexers.guess_lexer(source)
+        except lexers.ClassNotFound:
+            lexer = lexers.PythonLexer()
+
+        formatter = formatters.HtmlFormatter(cssclass='code_highlighter')
+        encoded = highlight(encoded, lexer, formatter)
+        css = formatter.get_style_defs('.code_highlighter')
+        return '''<style type="text/css"><!--
+                %(css)s
+            --></style>%(source)s''' % {'css' : css, 'source' : encoded}
+
+
+
+class MaxLen(Filter):
+    def filter(self, val, **kw):
+        """Replace None with '' and cut off at maxlen."""
+        
+        output = super(MaxLen, self).filter(val, **kw)
+        if kw.has_key('maxlen') and len(output) > kw['maxlen']:
+            return output[:kw['maxlen']]
+        return output
+
+class WebSafe(Filter):
+    """Escape HTML entities in $placeholders.
+    """
+    def filter(self, val, **kw):
+        s = super(WebSafe, self).filter(val, **kw)
+        # These substitutions are copied from cgi.escape().
+        s = s.replace("&", "&amp;") # Must be done first!
+        s = s.replace("<", "&lt;")
+        s = s.replace(">", "&gt;")
+        # Process the additional transformations if any.
+        if kw.has_key('also'):
+            also = kw['also']
+            entities = webSafeEntities   # Global variable.
+            for k in also:
+                if k in entities:
+                    v = entities[k]
+                else:
+                    v = "&#%s;" % ord(k)
+                s = s.replace(k, v)
+        return s
+
+
+class Strip(Filter):
+    """Strip leading/trailing whitespace but preserve newlines.
+
+    This filter goes through the value line by line, removing leading and
+    trailing whitespace on each line.  It does not strip newlines, so every
+    input line corresponds to one output line, with its trailing newline intact.
+
+    We do not use val.split('\n') because that would squeeze out consecutive
+    blank lines.  Instead, we search for each newline individually.  This
+    makes us unable to use the fast C .split method, but it makes the filter
+    much more widely useful.
+
+    This filter is intended to be usable both with the #filter directive and
+    with the proposed #sed directive (which has not been ratified yet.)
+    """
+    def filter(self, val, **kw):
+        s = super(Strip, self).filter(val, **kw)
+        result = []
+        start = 0   # The current line will be s[start:end].
+        while 1: # Loop through each line.
+            end = s.find('\n', start)  # Find next newline.
+            if end == -1:  # If no more newlines.
+                break
+            chunk = s[start:end].strip()
+            result.append(chunk)
+            result.append('\n')
+            start = end + 1
+        # Write the unfinished portion after the last newline, if any.
+        chunk = s[start:].strip()
+        result.append(chunk)
+        return "".join(result)
+
+class StripSqueeze(Filter):
+    """Canonicalizes every chunk of whitespace to a single space.
+
+    Strips leading/trailing whitespace.  Removes all newlines, so multi-line
+    input is joined into one ling line with NO trailing newline.
+    """
+    def filter(self, val, **kw):
+        s = super(StripSqueeze, self).filter(val, **kw)
+        s = s.split()
+        return " ".join(s)
+    
+##################################################
+## MAIN ROUTINE -- testing
+    
+def test():
+    s1 = "abc <=> &"
+    s2 = "   asdf  \n\t  1  2    3\n"
+    print "WebSafe INPUT:", `s1`
+    print "      WebSafe:", `WebSafe().filter(s1)`
+    
+    print
+    print " Strip INPUT:", `s2`
+    print "       Strip:", `Strip().filter(s2)`
+    print "StripSqueeze:", `StripSqueeze().filter(s2)`
+
+    print "Unicode:", `EncodeUnicode().filter(u'aoeu12345\u1234')`
+    
+if __name__ == "__main__":  
+    test()
+    
+# vim: shiftwidth=4 tabstop=4 expandtab
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Tools/MondoReport.py
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Tools/MondoReport.py (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Tools/MondoReport.py (revision 3)
@@ -0,0 +1,463 @@
+"""
+@@TR: This code is pretty much unsupported.
+
+MondoReport.py -- Batching module for Python and Cheetah.
+
+Version 2001-Nov-18.  Doesn't do much practical yet, but the companion
+testMondoReport.py passes all its tests.
+-Mike Orr (Iron)
+
+TODO: BatchRecord.prev/next/prev_batches/next_batches/query, prev.query,
+next.query.
+
+How about Report: .page(), .all(), .summary()?  Or PageBreaker.
+"""
+import operator, types
+try:
+    from Cheetah.NameMapper import valueForKey as lookup_func
+except ImportError:
+    def lookup_func(obj, name):
+        if hasattr(obj, name):
+            return getattr(obj, name)
+        else:
+            return obj[name] # Raises KeyError.
+
+########## CONSTANTS ##############################
+
+True, False = (1==1), (1==0)
+numericTypes = types.IntType, types.LongType, types.FloatType
+
+########## PUBLIC GENERIC FUNCTIONS ##############################
+
+class NegativeError(ValueError):
+    pass
+
+def isNumeric(v):
+    return type(v) in numericTypes
+
+def isNonNegative(v):
+    ret = isNumeric(v)
+    if ret and v < 0:
+        raise NegativeError(v)
+
+def isNotNone(v):
+    return v is not None
+
+def Roman(n):
+    n = int(n) # Raises TypeError.
+    if n < 1:
+        raise ValueError("roman numeral for zero or negative undefined: " + n)
+    roman = ''
+    while n >= 1000:
+            n = n - 1000
+            roman = roman + 'M'
+    while n >= 500:
+            n = n - 500
+            roman = roman + 'D'
+    while n >= 100:
+            n = n - 100
+            roman = roman + 'C'
+    while n >= 50:
+            n = n - 50
+            roman = roman + 'L'
+    while n >= 10:
+            n = n - 10
+            roman = roman + 'X'
+    while n >= 5:
+            n = n - 5
+            roman = roman + 'V'
+    while n < 5 and n >= 1:
+            n = n - 1
+            roman = roman + 'I'
+    roman = roman.replace('DCCCC', 'CM')
+    roman = roman.replace('CCCC', 'CD')
+    roman = roman.replace('LXXXX', 'XC')
+    roman = roman.replace('XXXX', 'XL')
+    roman = roman.replace('VIIII', 'IX')
+    roman = roman.replace('IIII', 'IV')
+    return roman
+
+
+def sum(lis):
+    return reduce(operator.add, lis, 0)
+    
+def mean(lis):
+    """Always returns a floating-point number.
+    """
+    lis_len = len(lis)
+    if lis_len == 0:
+        return 0.00 # Avoid ZeroDivisionError (not raised for floats anyway)
+    total = float( sum(lis) )
+    return total / lis_len
+
+def median(lis):
+    lis = lis[:]
+    lis.sort()
+    return lis[int(len(lis)/2)]
+
+
+def variance(lis):
+    raise NotImplementedError()
+    
+def variance_n(lis):
+    raise NotImplementedError()
+    
+def standardDeviation(lis):
+    raise NotImplementedError()
+    
+def standardDeviation_n(lis):
+    raise NotImplementedError()
+
+
+
+class IndexFormats:
+    """Eight ways to display a subscript index.
+       ("Fifty ways to leave your lover....")
+    """
+    def __init__(self, index, item=None):
+        self._index = index
+        self._number = index + 1
+        self._item = item
+
+    def index(self):
+        return self._index
+
+    __call__ = index
+
+    def number(self):
+        return self._number
+
+    def even(self):
+        return self._number % 2 == 0
+
+    def odd(self):
+        return not self.even()
+
+    def even_i(self):
+        return self._index % 2 == 0
+
+    def odd_i(self):
+        return not self.even_i()
+
+    def letter(self):
+        return self.Letter().lower()
+
+    def Letter(self):
+        n = ord('A') + self._index
+        return chr(n)
+
+    def roman(self):
+        return self.Roman().lower()
+
+    def Roman(self):
+        return Roman(self._number)
+
+    def item(self):
+        return self._item
+
+
+
+########## PRIVATE CLASSES ##############################
+
+class ValuesGetterMixin:
+    def __init__(self, origList):
+        self._origList = origList
+
+    def _getValues(self, field=None, criteria=None):
+        if field:
+            ret = [lookup_func(elm, field) for elm in self._origList]
+        else:
+            ret = self._origList
+        if criteria:
+            ret = filter(criteria, ret)
+        return ret
+
+
+class RecordStats(IndexFormats, ValuesGetterMixin):
+    """The statistics that depend on the current record.
+    """
+    def __init__(self, origList, index):
+        record = origList[index] # Raises IndexError.
+        IndexFormats.__init__(self, index, record)
+        ValuesGetterMixin.__init__(self, origList)
+    
+    def length(self):
+        return len(self._origList)
+
+    def first(self):
+        return self._index == 0
+        
+    def last(self):
+        return self._index >= len(self._origList) - 1
+
+    def _firstOrLastValue(self, field, currentIndex, otherIndex):
+        currentValue = self._origList[currentIndex] # Raises IndexError.
+        try:
+            otherValue = self._origList[otherIndex]
+        except IndexError:
+            return True
+        if field:
+            currentValue = lookup_func(currentValue, field)
+            otherValue = lookup_func(otherValue, field)
+        return currentValue != otherValue
+
+    def firstValue(self, field=None):
+        return self._firstOrLastValue(field, self._index, self._index - 1)
+
+    def lastValue(self, field=None):
+        return self._firstOrLastValue(field, self._index, self._index + 1)
+
+    # firstPage and lastPage not implemented.  Needed?
+
+    def percentOfTotal(self, field=None, suffix='%', default='N/A', decimals=2):
+        rec = self._origList[self._index]
+        if field:
+            val = lookup_func(rec, field)
+        else:
+            val = rec
+        try:
+            lis = self._getValues(field, isNumeric)
+        except NegativeError:
+            return default
+        total = sum(lis)
+        if total == 0.00: # Avoid ZeroDivisionError.
+            return default
+        val = float(val)
+        try:
+            percent = (val / total) * 100
+        except ZeroDivisionError:
+            return default
+        if decimals == 0:
+            percent = int(percent)
+        else:
+            percent = round(percent, decimals)
+        if suffix:
+            return str(percent) + suffix # String.
+        else:
+            return percent # Numeric.
+
+    def __call__(self): # Overrides IndexFormats.__call__
+        """This instance is not callable, so we override the super method.
+        """
+        raise NotImplementedError()
+
+    def prev(self):
+        if self._index == 0:
+            return None
+        else:
+            length = self.length()
+            start = self._index - length
+            return PrevNextPage(self._origList, length, start)
+
+    def next(self):
+        if self._index + self.length() == self.length():
+            return None
+        else:
+            length = self.length()
+            start = self._index + length
+            return PrevNextPage(self._origList, length, start)
+            
+    def prevPages(self):
+        raise NotImplementedError()
+        
+    def nextPages(self):
+        raise NotImplementedError()
+
+    prev_batches = prevPages
+    next_batches = nextPages
+
+    def summary(self):
+        raise NotImplementedError()
+
+
+
+    def _prevNextHelper(self, start,end,size,orphan,sequence):
+        """Copied from Zope's DT_InSV.py's "opt" function.
+        """
+        if size < 1:
+            if start > 0 and end > 0 and end >= start:
+                size=end+1-start
+            else: size=7
+
+        if start > 0:
+
+            try: sequence[start-1]
+            except: start=len(sequence)
+            # if start > l: start=l
+
+            if end > 0:
+                if end < start: end=start
+            else:
+                end=start+size-1
+                try: sequence[end+orphan-1]
+                except: end=len(sequence)
+                # if l - end < orphan: end=l
+        elif end > 0:
+            try: sequence[end-1]
+            except: end=len(sequence)
+            # if end > l: end=l
+            start=end+1-size
+            if start - 1 < orphan: start=1
+        else:
+            start=1
+            end=start+size-1
+            try: sequence[end+orphan-1]
+            except: end=len(sequence)
+            # if l - end < orphan: end=l
+        return start,end,size
+
+
+
+class Summary(ValuesGetterMixin):
+    """The summary statistics, that don't depend on the current record.
+    """
+    def __init__(self, origList):
+        ValuesGetterMixin.__init__(self, origList)
+        
+    def sum(self, field=None):
+        lis = self._getValues(field, isNumeric)
+        return sum(lis)
+
+    total = sum
+
+    def count(self, field=None):
+        lis = self._getValues(field, isNotNone)
+        return len(lis)
+        
+    def min(self, field=None):
+        lis = self._getValues(field, isNotNone)
+        return min(lis) # Python builtin function min.
+        
+    def max(self, field=None):
+        lis = self._getValues(field, isNotNone)
+        return max(lis) # Python builtin function max.
+
+    def mean(self, field=None):
+        """Always returns a floating point number.
+        """
+        lis = self._getValues(field, isNumeric)
+        return mean(lis)
+
+    average = mean
+
+    def median(self, field=None):
+        lis = self._getValues(field, isNumeric)
+        return median(lis)
+
+    def variance(self, field=None):
+        raiseNotImplementedError()
+
+    def variance_n(self, field=None):
+        raiseNotImplementedError()
+
+    def standardDeviation(self, field=None):
+        raiseNotImplementedError()
+
+    def standardDeviation_n(self, field=None):
+        raiseNotImplementedError()
+
+
+class PrevNextPage:
+    def __init__(self, origList, size, start):
+        end = start + size
+        self.start = IndexFormats(start, origList[start])
+        self.end = IndexFormats(end, origList[end])
+        self.length = size
+        
+
+########## MAIN PUBLIC CLASS ##############################
+class MondoReport:
+    _RecordStatsClass = RecordStats
+    _SummaryClass = Summary
+
+    def __init__(self, origlist):
+        self._origList = origlist
+
+    def page(self, size, start, overlap=0, orphan=0):
+        """Returns list of ($r, $a, $b)
+        """
+        if overlap != 0:
+            raise NotImplementedError("non-zero overlap")
+        if orphan != 0:
+            raise NotImplementedError("non-zero orphan")
+        origList = self._origList
+        origList_len = len(origList)
+        start = max(0, start)
+        end = min( start + size, len(self._origList) )
+        mySlice = origList[start:end]
+        ret = []
+        for rel in range(size):
+            abs_ = start + rel
+            r = mySlice[rel]
+            a = self._RecordStatsClass(origList, abs_)
+            b = self._RecordStatsClass(mySlice, rel)
+            tup = r, a, b
+            ret.append(tup)
+        return ret
+
+
+    batch = page
+
+    def all(self):
+        origList_len = len(self._origList)
+        return self.page(origList_len, 0, 0, 0)
+    
+    
+    def summary(self):
+        return self._SummaryClass(self._origList)
+
+"""
+**********************************
+    Return a pageful of records from a sequence, with statistics.
+
+       in : origlist, list or tuple.  The entire set of records.  This is
+              usually a list of objects or a list of dictionaries.
+            page, int >= 0.  Which page to display.
+            size, int >= 1.  How many records per page.
+            widow, int >=0.  Not implemented.
+            orphan, int >=0.  Not implemented.
+            base, int >=0.  Number of first page (usually 0 or 1).
+
+       out: list of (o, b) pairs.  The records for the current page.  'o' is
+              the original element from 'origlist' unchanged.  'b' is a Batch
+              object containing meta-info about 'o'.
+       exc: IndexError if 'page' or 'size' is < 1.  If 'origlist' is empty or
+              'page' is too high, it returns an empty list rather than raising
+              an error.
+        
+        origlist_len = len(origlist)
+        start = (page + base) * size
+        end = min(start + size, origlist_len)
+        ret = []
+        # widow, orphan calculation: adjust 'start' and 'end' up and down, 
+        # Set 'widow', 'orphan', 'first_nonwidow', 'first_nonorphan' attributes.
+        for i in range(start, end):
+            o = origlist[i]
+            b = Batch(origlist, size, i)
+            tup = o, b
+            ret.append(tup)
+        return ret
+
+    def prev(self):
+        # return a PrevNextPage or None
+
+    def next(self):
+        # return a PrevNextPage or None
+
+    def prev_batches(self):
+        # return a list of SimpleBatch for the previous batches
+
+    def next_batches(self):
+        # return a list of SimpleBatch for the next batches
+
+########## PUBLIC MIXIN CLASS FOR CHEETAH TEMPLATES ##############
+class MondoReportMixin:
+    def batch(self, origList, size=None, start=0, overlap=0, orphan=0):
+        bat = MondoReport(origList)
+        return bat.batch(size, start, overlap, orphan)
+    def batchstats(self, origList):
+        bat = MondoReport(origList)
+        return bat.stats()
+"""
+
+# vim: shiftwidth=4 tabstop=4 expandtab textwidth=79
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Tools/CGITemplate.py
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Tools/CGITemplate.py (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Tools/CGITemplate.py (revision 3)
@@ -0,0 +1,77 @@
+# $Id: CGITemplate.py,v 1.6 2006/01/29 02:09:59 tavis_rudd Exp $
+"""A subclass of Cheetah.Template for use in CGI scripts.
+
+Usage in a template:
+    #extends Cheetah.Tools.CGITemplate
+    #implements respond
+    $cgiHeaders#slurp
+
+Usage in a template inheriting a Python class:
+1. The template
+    #extends MyPythonClass
+    #implements respond
+    $cgiHeaders#slurp
+
+2. The Python class
+    from Cheetah.Tools import CGITemplate
+    class MyPythonClass(CGITemplate):
+        def cgiHeadersHook(self):
+            return "Content-Type: text/html; charset=koi8-r\n\n"
+
+To read GET/POST variables, use the .webInput method defined in
+Cheetah.Utils.WebInputMixin (available in all templates without importing
+anything), use Python's 'cgi' module, or make your own arrangements.
+
+This class inherits from Cheetah.Template to make it usable in Cheetah's
+single-inheritance model.  
+
+
+Meta-Data
+================================================================================
+Author: Mike Orr <iron@mso.oz.net>
+License: This software is released for unlimited distribution under the
+         terms of the MIT license.  See the LICENSE file.
+Version: $Revision: 1.6 $
+Start Date: 2001/10/03
+Last Revision Date: $Date: 2006/01/29 02:09:59 $
+""" 
+__author__ = "Mike Orr <iron@mso.oz.net>"
+__revision__ = "$Revision: 1.6 $"[11:-2]
+
+import os
+from Cheetah.Template import Template
+
+class CGITemplate(Template):
+    """Methods useful in CGI scripts.
+
+       Any class that inherits this mixin must also inherit Cheetah.Servlet.
+    """
+    
+
+    def cgiHeaders(self):
+        """Outputs the CGI headers if this is a CGI script.
+
+           Usage:  $cgiHeaders#slurp
+           Override .cgiHeadersHook() if you want to customize the headers.
+        """
+        if self.isCgi():
+            return self.cgiHeadersHook()
+
+
+
+    def cgiHeadersHook(self):
+        """Override if you want to customize the CGI headers.
+        """
+        return "Content-type: text/html\n\n"
+
+
+    def isCgi(self):
+        """Is this a CGI script?
+        """
+        env = os.environ.has_key('REQUEST_METHOD') 
+        wk = self._CHEETAH__isControlledByWebKit
+        return env and not wk
+
+
+    
+# vim: shiftwidth=4 tabstop=4 expandtab
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Tools/__init__.py
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Tools/__init__.py (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Tools/__init__.py (revision 3)
@@ -0,0 +1,8 @@
+"""This package contains classes, functions, objects and packages contributed
+   by Cheetah users.  They are not used by Cheetah itself.  There is no
+   guarantee that this directory will be included in Cheetah releases, that
+   these objects will remain here forever, or that they will remain
+   backward-compatible.
+"""
+
+# vim: shiftwidth=5 tabstop=5 expandtab
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Tools/RecursiveNull.py
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Tools/RecursiveNull.py (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Tools/RecursiveNull.py (revision 3)
@@ -0,0 +1,28 @@
+"""
+Nothing, but in a friendly way.  Good for filling in for objects you want to
+hide.  If $form.f1 is a RecursiveNull object, then
+$form.f1.anything["you"].might("use") will resolve to the empty string.
+
+This module was contributed by Ian Bicking.
+"""
+
+class RecursiveNull(object):
+    def __getattr__(self, attr):
+        return self
+    def __getitem__(self, item):
+        return self
+    def __call__(self, *args, **kwargs):
+        return self
+    def __str__(self):
+        return ''
+    def __repr__(self):
+        return ''
+    def __nonzero__(self):
+        return 0
+    def __eq__(self, x):
+        if x:
+            return False
+        return True
+    def __ne__(self, x):
+        return x and True or False
+
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Tools/SiteHierarchy.py
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Tools/SiteHierarchy.py (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Tools/SiteHierarchy.py (revision 3)
@@ -0,0 +1,182 @@
+# $Id: SiteHierarchy.py,v 1.1 2001/10/11 03:25:54 tavis_rudd Exp $
+"""Create menus and crumbs from a site hierarchy.
+
+You define the site hierarchy as lists/tuples.  Each location in the hierarchy
+is a (url, description) tuple.  Each list has the base URL/text in the 0
+position, and all the children coming after it.  Any child can be a list,
+representing further depth to the hierarchy.  See the end of the file for an
+example hierarchy.
+
+Use Hierarchy(contents, currentURL), where contents is this hierarchy, and
+currentURL is the position you are currently in.  The menubar and crumbs methods
+give you the HTML output.
+
+There are methods you can override to customize the HTML output.
+
+Meta-Data
+================================================================================
+Author: Ian Bicking <ianb@colorstudy.com>
+Version: $Revision: 1.1 $
+Start Date: 2001/07/23
+Last Revision Date: $Date: 2001/10/11 03:25:54 $
+"""
+__author__ = "Ian Bicking <ianb@colorstudy.com>"
+__version__ = "$Revision: 1.1 $"[11:-2]
+
+##################################################
+## DEPENDENCIES
+import string
+try:
+	from cStringIO import StringIO
+except ImportError:
+	from StringIO import StringIO
+
+
+##################################################
+## GLOBALS & CONSTANTS
+
+True, False = (1==1), (0==1)
+
+##################################################
+## CLASSES
+
+class Hierarchy:
+	def __init__(self, hierarchy, currentURL, prefix='', menuCSSClass=None,
+				 crumbCSSClass=None):
+		"""
+		hierarchy is described above, currentURL should be somewhere in
+		the hierarchy.  prefix will be added before all of the URLs (to
+		help mitigate the problems with absolute URLs), and if given,
+		cssClass will be used for both links *and* nonlinks.
+		"""
+
+		self._contents = hierarchy
+		self._currentURL = currentURL
+		if menuCSSClass:
+			self._menuCSSClass = ' class="%s"' % menuCSSClass
+		else:
+			self._menuCSSClass = ''
+		if crumbCSSClass:
+			self._crumbCSSClass = ' class="%s"' % crumbCSSClass
+		else:
+			self._crumbCSSClass = ''
+		self._prefix=prefix
+
+	
+	## Main output methods
+	
+	def menuList(self, menuCSSClass=None):
+		"""An indented menu list"""
+		if menuCSSClass:
+			self._menuCSSClass = ' class="%s"' % menuCSSClass
+		
+		stream = StringIO()
+		for item in self._contents[1:]:
+			self._menubarRecurse(item, 0, stream)
+		return stream.getvalue()
+
+	def crumbs(self, crumbCSSClass=None):
+		"""The home>where>you>are crumbs"""
+		if crumbCSSClass:
+			self._crumbCSSClass = ' class="%s"' % crumbCSSClass
+		
+		path = []
+		pos = self._contents
+		while 1:
+			## This is not the fastest algorithm, I'm afraid.
+			## But it probably won't be for a huge hierarchy anyway.
+			foundAny = False
+			path.append(pos[0])
+			for item in pos[1:]:
+				if self._inContents(item):
+					if type(item) is type(()):
+						path.append(item)
+						break
+					else:
+						pos = item
+						foundAny = True
+						break
+			if not foundAny:
+				break
+		if len(path) == 1:
+			return self.emptyCrumb()
+		return string.join(map(lambda x, self=self: self.crumbLink(x[0], x[1]),
+							   path), self.crumbSeperator()) + \
+							   self.crumbTerminator()
+
+	## Methods to control the Aesthetics
+	#  - override these methods for your own look
+		
+	def menuLink(self, url, text, indent):
+		if url == self._currentURL or self._prefix + url == self._currentURL:
+			return '%s<B%s>%s</B> <BR>\n' % ('&nbsp;'*2*indent,
+							 self._menuCSSClass, text)
+		else:
+			return '%s<A HREF="%s%s"%s>%s</A> <BR>\n' % \
+				   ('&nbsp;'*2*indent, self._prefix, url,
+					self._menuCSSClass, text)
+		
+	def crumbLink(self, url, text):
+		if url == self._currentURL or self._prefix + url == self._currentURL:
+			return '<B%s>%s</B>' % (text, self._crumbCSSClass)
+		else:
+			return '<A HREF="%s%s"%s>%s</A>' % \
+				   (self._prefix, url, self._crumbCSSClass, text)
+		
+	def crumbSeperator(self):
+		return '&nbsp;&gt;&nbsp;'
+	
+	def crumbTerminator(self):
+		return ''
+	
+	def emptyCrumb(self):
+		"""When you are at the homepage"""
+		return ''
+				
+	## internal methods
+	
+	def _menubarRecurse(self, contents, indent, stream):
+		if type(contents) is type(()):
+			url, text = contents
+			rest = []
+		else:
+			url, text = contents[0]
+			rest = contents[1:]
+		stream.write(self.menuLink(url, text, indent))
+		if self._inContents(contents):
+			for item in rest:
+				self._menubarRecurse(item, indent+1, stream)
+
+	def _inContents(self, contents):
+		if type(contents) is type(()):
+			return self._currentURL == contents[0]
+		for item in contents:
+			if self._inContents(item):
+				return True
+		return False
+
+##################################################
+## from the command line
+
+if __name__ == '__main__':
+	hierarchy = [('/', 'home'),
+		    ('/about', 'About Us'),
+		    [('/services', 'Services'),
+		     [('/services/products', 'Products'),
+		      ('/services/products/widget', 'The Widget'),
+		      ('/services/products/wedge', 'The Wedge'),
+		      ('/services/products/thimble', 'The Thimble'),
+		      ],
+		     ('/services/prices', 'Prices'),
+		     ],
+		    ('/contact', 'Contact Us'),
+		    ]
+
+	for url in ['/', '/services', '/services/products/widget', '/contact']:
+		print '<p>', '='*50
+		print '<br> %s: <br>\n' % url
+		n = Hierarchy(hierarchy, url, menuCSSClass='menu', crumbCSSClass='crumb',
+			      prefix='/here')
+		print n.menuList()
+		print '<p>', '-'*50
+		print n.crumbs()
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Tools/MondoReportDoc.txt
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Tools/MondoReportDoc.txt (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Tools/MondoReportDoc.txt (revision 3)
@@ -0,0 +1,391 @@
+MondoReport Documentation  
+Version 0.01 alpha 24-Nov-2001.  iron@mso.oz.net or mso@oz.net.
+Copyright (c) 2001 Mike Orr.  License: same as Python or Cheetah.
+
+* * * * *
+STATUS:  previous/next batches and query string are not implemented yet.
+Sorting not designed yet.  Considering "click on this column header to sort by
+this field" and multiple ascending/descending sort fields for a future version.
+
+Tested with Python 2.2b1.  May work with Python 2.1 or 2.0.
+
+* * * * *
+OVERVIEW
+
+MondoReport -- provide information about a list that is useful in generating
+any kind of report.  The module consists of one main public class, and some
+generic functions you may find useful in other programs.  This file contains an
+overview, syntax reference and examples.  The module is designed both for
+standalone use and for integration with the Cheetah template system
+(http://www.cheetahtemplate.org/), so the examples are in both Python and
+Cheetah.  The main uses of MondoReport are: 
+
+(A) to iterate through a list.  In this sense MR is a for-loop enhancer,
+providing information that would be verbose to calculate otherwise.
+
+(B) to separate a list into equal-size "pages" (or "batches"--the two terms are
+interchangeable) and only display the current page, plus limited information
+about the previous and next pages.
+
+(C) to extract summary statistics about a certain column ("field") in the list.
+
+* * * * *
+MAIN PUBLIC CLASS
+
+To create a MondoReport instance, supply a list to operate on.
+
+    mr = MondoReport(origList)
+
+The list may be a list of anything, but if you use the 'field' argument in any
+of the methods below, the elements must be instances or dictionaries.
+
+MondoReport assumes it's operating on an unchanging list.  Do not modify the
+list or any of its elements until you are completely finished with the
+ModoReport object and its sub-objects.  Otherwise, you may get an exception or
+incorrect results.
+
+MondoReport instances have three methods:
+
+    .page(size, start, overlap=0, orphan=0
+        sort=None, reverse=False)                => list of (r, a, b).
+
+'size' is an integer >= 1.  'start', 'overlap' and 'orphan' are integers >= 0.
+The list returned contains one triple for each record in the current page.  'r'
+is the original record.  'a' is a BatchRecord instance for the current record
+in relation to all records in the origList.  'b' is a BatchRecord instance for
+the current record in relation to all the records in that batch/page.  (There
+is a .batch method that's identical to .page.)
+
+The other options aren't implemented yet, but 'overlap' duplicates this many
+records on adjacent batches.  'orphan' moves this many records or fewer, if
+they are on a page alone, onto the neighboring page.  'sort' (string) specifies
+a field to sort the records by.  It may be suffixed by ":desc" to sort in
+descending order.  'reverse' (boolean) reverses the sort order.  If both
+":desc" and 'reverse' are specified, they will cancel each other out.  This
+sorting/reversal happens on a copy of the origList, and all objects returned
+by this method use the sorted list, except when resorting the next time.
+To do more complicated sorting, such as a hierarchy of columns, do it to the
+original list before creating the ModoReport object.
+
+    .all(sort=None, reverse=False)              => list of (r, a).
+
+Same, but the current page spans the entire origList.
+
+    .summary()                                  => Summary instance.
+
+Summary statistics for the entire origList.
+
+In Python, use .page or .all in a for loop:
+
+    from Cheetah.Tools.MondoReport import MondoReport
+    mr = MondoReport(myList)
+    for r, a, b in mr.page(20, 40):
+        # Do something with r, a and b.  The current page is the third page,
+        # with twenty records corresponding to origList[40:60].
+    if not myList:
+        # Warn the user there are no records in the list.
+
+It works the same way in Cheetah, just convert to Cheetah syntax.  This example
+assumes the template doubles as a Webware servlet, so we use the servlet's
+'$request' method to look up the CGI parameter 'start'.  The default value is 0
+for the first page.
+
+    #from Cheetah.Tools.MondoReport import MondoReport
+    #set $mr = $MondoReport($bigList)
+    #set $start = $request.field("start", 0)
+    #for $o, $a, $b in $mr.page(20, $start)
+        ... do something with $o, $a and $b ...
+    #end for
+    #unless $bigList
+        This is displayed if the original list has no elements.
+        It's equivalent to the "else" part Zope DTML's <dtml-in>.
+    #end unless
+
+* * * * *
+USING 'r' RECORDS
+
+Use 'r' just as you would the original element.  For instance:
+
+    print r.attribute     # If r is an instance.
+    print r['key']        # If r is a dictionary.
+    print r               # If r is numeric or a string.
+
+In Cheetah, you can take advantage of Universal Dotted Notation and autocalling:
+
+    $r.name        ## 'name' may be an attribute or key of 'r'.  If 'r' and/or
+                   ## 'name' is a function or method, it will be called without
+                   ## arguments.
+    $r.attribute
+    $r['key']
+    $r
+    $r().attribute()['key']()
+
+If origList is a list of name/value pairs (2-tuples or 2-lists), you may
+prefer to do this:
+
+    for (key, value), a, b in mr.page(20, 40):
+        print key, "=>", value
+    
+    #for ($key, $value), $a, $b in $mr.page(20, $start)
+        $key =&gt; $value
+    #end for
+
+* * * * *
+STATISTICS METHODS AND FIELD VALUES
+
+Certain methods below have an optional argument 'field'.  If specified, 
+MondoReport will look up that field in each affected record and use its value
+in the calculation.  MondoReport uses Cheetah's NameMapper if available,
+otherwise it uses a minimal NameMapper substitute that looks for an attribute
+or dictionary key called "field".  You'll get an exception if any record is a
+type without attributes or keys, or if one or more records is missing that
+attribute/key.
+
+If 'field' is None, MondoReport will use the entire record in its
+calculation.  This makes sense mainly if the records are a numeric type.
+
+All statistics methods filter out None values from their calculations, and
+reduce the number of records accordingly.  Most filter out non-numeric fields
+(or records).  Some raise NegativeError if a numeric field (or record) is
+negative.
+
+
+* * * * *
+BatchRecord METHODS
+
+The 'a' and 'b' objects of MondoReport.page() and MondoReport.all() provide
+these methods.
+
+    .index()
+
+The current subscript.  For 'a', this is the true subscript into origList.
+For 'b', this is relative to the current page, so the first record will be 0.
+Hint: In Cheetah, use autocalling to skip the parentheses: '$b.index'.
+
+    .number()
+
+The record's position starting from 1.  This is always '.index() + 1'.
+
+    .Letter()
+
+The letter ("A", "B", "C") corresponding to .number().  Undefined if .number()
+> 26.  The current implementation just adds the offset to 'a' and returns
+whatever character it happens to be.  
+
+To make a less dumb implementation (e.g., "Z, AA, BB" or "Z, A1, B1"):
+1) Subclass BatchRecord and override the .Letter method. 
+2) Subclass MondoReport and set the class variable .BatchRecordClass to your
+new improved class.
+
+    .letter()
+
+Same but lower case.
+
+    .Roman()
+
+The Roman numeral corresponding to .number().
+
+    .roman()
+
+Same but lower case.
+
+    .even()
+
+True if .number() is even.
+
+    .odd()
+
+True if .number() is odd.
+
+    .even_i()
+
+True if .index() is even.
+
+    .odd_i()
+
+True if .index() is odd.
+
+    .length()
+
+For 'a', number of records in origList.  For 'b', number of records on this
+page.
+
+    .item()
+
+The record itself.  You don't need this in the normal case since it's the same
+as 'r', but it's useful for previous/next batches.
+
+    .size()
+
+The 'size' argument used when this BatchRecord was created.  
+'a.size() == b.size()'.
+
+    .first()
+
+True if this is the first record.
+
+    .last()
+
+True if this is the last record.
+
+    .firstValue(field=None)
+
+True if there is no previous record, or if the previous field/record has a 
+different value.  Used for to print section headers.  For instance, if you
+are printing addresses by country, this will be true at the first occurrance
+of each country.  Or for indexes, you can have a non-printing field showing
+which letter of the alphablet this entry starts with, and then print a "B"
+header before printing the first record starting with "B".
+
+    .lastValue(field=None)
+
+True if this is the last record containing the current value in the
+field/record.
+
+    .percentOfTotal(field=None, suffix="%", default="N/A", decimals=2)
+
+Returns the percent that the current field/record is of all fields/records.
+If 'suffix' is None, returns a number; otherwise it returns a string with
+'suffix' suffixed.  If the current value is non-numeric, returns 'default'
+instead (without 'suffix').  'decimals' tells the number of decimal places to
+return; if 0, there will be no decimal point.
+
+    .prev()
+
+Returns a PrevNextBatch instance for the previous page.  If there is no
+previous page, returns None.  [Not implemented yet.]
+
+    .next()
+
+Returns a PrevNextBatch instance for the next page.  If there is no next page,
+returns None.  [Not implemented yet.]
+
+    .prevPages()
+
+Returns a list of PrevNextPage instances for every previous page, or [] if no
+previous pages.  [Not implemented yet.]
+
+    .nextPages()
+
+Returns a list of PrevNextPage instances for every next page, or [] if no next
+pages.  [Not implemented yet.]
+
+    .query(start=None, label=None, attribName="start", attribs=[])
+
+[Not implemented yet.]
+
+With no arguments, returns the HTML query string with start value removed (so
+you can append a new start value in your hyperlink).  The query string is taken
+from the 'QUERY_STRING' environmental variable, or "" if missing.  (This is
+Webware compatible.)  
+
+With 'start' (an integer >= 0), returns the query string with an updated start
+value, normally for the next or previous batch.
+
+With 'label' (a string), returns a complete HTML hyperlink:
+'<A HREF="?new_query_string">label</A>'.  You'll get a TypeError if you specify
+'label' but not 'start'.
+
+With 'attribName' (a string), uses this attribute name rather than "start".
+Useful if you have another CGI parameter "start" that's used for something
+else.
+
+With 'attribs' (a dictionary), adds these attributes to the hyperlink.
+For instance, 'attribs={"target": "_blank"}'.  Ignored unless 'label' is 
+specified too.
+
+This method assumes the start parameter is a GET variable, not a POST variable.
+
+    .summary()
+
+Returns a Summary instance.  'a.summary()' refers to all records in the
+origList, so it's the same as MondoReport.summary().  'b.summary()' refers only
+to the records on the current page.  [Not implemented yet.]
+
+* * * * *
+PrevNextPage INSTANCES
+
+[Not implemented yet.]
+
+PrevNextPage instances have the following methods:
+
+    .start()
+
+The index (true index of origList) that that page starts at.  You may also use
+'.start().index()', '.start().number()', etc.  Also
+'.start().item(field=None)'.  (Oh, so *that*'s what .item is for!)
+
+    .end()
+
+The index (true index of origList) that that page ends at.  You may also use
+'.end().index()', '.end().number()', etc.   Also
+'.end().item(field=None)'.
+
+    .length()
+
+Number of records on that page.
+
+    .query(label=None, attribName="start", attribs={}, before="", after="")
+
+[Not implemented yet.]
+
+Similar to 'a.query()' and 'b.query()', but automatically calculates the start
+value for the appropriate page.  
+
+For fancy HTML formatting, 'before' is prepended to the returned text and 
+'after' is appended.  (There was an argument 'else_' for if there is no such
+batch, but it was removed because you can't even get to this method at all in
+that case.)
+
+* * * * * *
+SUMMARY STATISTICS
+
+These methods are supported by the Summary instances returned by
+MondoReport.Summary():
+
+    .sum(field=None)
+
+Sum of all numeric values in a field, or sum of all records.
+
+    .total(field=None)
+
+Same.
+
+    .count(field=None)
+
+Number of fields/records with non-None values.
+
+    .min(field=None)
+
+Minimum value in that field/record.  Ignores None values.
+
+    .max(field=None)
+
+Maximum value in that field/record.  Ignores None values.
+
+    .mean(field=None)
+
+The mean (=average) of all numeric values in that field/record.
+
+    .average(field=None)
+
+Same.
+
+    .median(field=None)
+
+The median of all numeric values in that field/record.  This is done by sorting
+the values and taking the middle value.
+
+    .variance(field=None), .variance_n(field=None)
+    .standardDeviation(field=None), .standardDeviation_n(field=None)
+
+[Not implemented yet.]
+
+
+* * * * *
+To run the regression tests (requires unittest.py, which is standard with
+Python 2.2), run MondoReportTest.py from the command line.  The regression test
+double as usage examples.
+
+
+# vim: shiftwidth=4 tabstop=4 expandtab textwidth=79
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Utils/Indenter.py
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Utils/Indenter.py (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Utils/Indenter.py (revision 3)
@@ -0,0 +1,123 @@
+"""
+Indentation maker.
+@@TR: this code is unsupported and largely undocumented ...
+
+This version is based directly on code by Robert Kuzelj
+<robert_kuzelj@yahoo.com> and uses his directive syntax.  Some classes and
+attributes have been renamed.  Indentation is output via
+$self._CHEETAH__indenter.indent() to prevent '_indenter' being looked up on the
+searchList and another one being found.  The directive syntax will
+soon be changed somewhat.
+""" 
+
+import re
+import sys
+
+def indentize(source):
+    return IndentProcessor().process(source)
+
+class IndentProcessor(object):
+    """Preprocess #indent tags."""
+    LINE_SEP = '\n'
+    ARGS = "args"
+    INDENT_DIR = re.compile(r'[ \t]*#indent[ \t]*(?P<args>.*)')
+    DIRECTIVE = re.compile(r"[ \t]*#")
+    WS = "ws"
+    WHITESPACES = re.compile(r"(?P<ws>[ \t]*)")
+
+    INC = "++"
+    DEC = "--"
+    
+    SET = "="
+    CHAR = "char"
+    
+    ON = "on"
+    OFF = "off"
+
+    PUSH = "push"
+    POP = "pop"
+    
+    def process(self, _txt):
+        result = []
+
+        for line in _txt.splitlines():
+            match = self.INDENT_DIR.match(line)
+            if match:
+                #is indention directive
+                args = match.group(self.ARGS).strip()
+                if args == self.ON:
+                    line = "#silent $self._CHEETAH__indenter.on()"
+                elif args == self.OFF:
+                    line = "#silent $self._CHEETAH__indenter.off()"
+                elif args == self.INC:
+                    line = "#silent $self._CHEETAH__indenter.inc()"
+                elif args == self.DEC:
+                    line = "#silent $self._CHEETAH__indenter.dec()"
+                elif args.startswith(self.SET):
+                    level = int(args[1:])
+                    line = "#silent $self._CHEETAH__indenter.setLevel(%(level)d)" % {"level":level}
+                elif args.startswith('chars'):
+                    self.indentChars = eval(args.split('=')[1])
+                    line = "#silent $self._CHEETAH__indenter.setChars(%(level)d)" % {"level":level}
+                elif args.startswith(self.PUSH):
+                    line = "#silent $self._CHEETAH__indenter.push()"
+                elif args.startswith(self.POP):
+                    line = "#silent $self._CHEETAH__indenter.pop()"
+            else:
+                match = self.DIRECTIVE.match(line)
+                if not match:
+                    #is not another directive
+                    match = self.WHITESPACES.match(line)
+                    if match:
+                        size = len(match.group("ws").expandtabs(4))
+                        line = ("${self._CHEETAH__indenter.indent(%(size)d)}" % {"size":size}) + line.lstrip()
+                    else:
+                        line = "${self._CHEETAH__indenter.indent(0)}" + line
+            result.append(line)
+
+        return self.LINE_SEP.join(result)
+
+class Indenter(object):
+    """
+    A class that keeps track of the current indentation level.
+    .indent() returns the appropriate amount of indentation.
+    """
+    On = 1
+    Level = 0
+    Chars = '    '
+    LevelStack = []
+
+    def on(self):
+        self.On = 1
+    def off(self):
+        self.On = 0
+    def inc(self):
+        self.Level += 1
+    def dec(self):
+        """decrement can only be applied to values greater zero
+            values below zero don't make any sense at all!"""
+        if self.Level > 0:
+            self.Level -= 1
+    def push(self):
+        self.LevelStack.append(self.Level)
+    def pop(self):
+        """the levestack can not become -1. any attempt to do so
+           sets the level to 0!"""
+        if len(self.LevelStack) > 0:
+            self.Level = self.LevelStack.pop()
+        else:
+            self.Level = 0
+    def setLevel(self, _level):
+        """the leve can't be less than zero. any attempt to do so
+           sets the level automatically to zero!"""
+        if _level < 0:
+            self.Level = 0
+        else:
+            self.Level = _level
+    def setChar(self, _chars):
+        self.Chars = _chars
+    def indent(self, _default=0):
+        if self.On:
+            return self.Chars * self.Level
+        return " " * _default
+
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Utils/htmlDecode.py
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Utils/htmlDecode.py (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Utils/htmlDecode.py (revision 3)
@@ -0,0 +1,14 @@
+"""This is a copy of the htmlDecode function in Webware.
+
+@@TR: It implemented more efficiently.
+
+"""
+
+from Cheetah.Utils.htmlEncode import htmlCodesReversed
+
+def htmlDecode(s, codes=htmlCodesReversed):
+    """ Returns the ASCII decoded version of the given HTML string. This does
+    NOT remove normal HTML tags like <p>. It is the inverse of htmlEncode()."""
+    for code in codes:
+        s = s.replace(code[1], code[0])
+    return s
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Utils/Misc.py
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Utils/Misc.py (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Utils/Misc.py (revision 3)
@@ -0,0 +1,81 @@
+# $Id: Misc.py,v 1.8 2005/11/02 22:26:08 tavis_rudd Exp $
+"""Miscellaneous functions/objects used by Cheetah but also useful standalone.
+
+Meta-Data
+================================================================================
+Author: Mike Orr <iron@mso.oz.net>
+License: This software is released for unlimited distribution under the
+         terms of the MIT license.  See the LICENSE file.
+Version: $Revision: 1.8 $
+Start Date: 2001/11/07
+Last Revision Date: $Date: 2005/11/02 22:26:08 $
+""" 
+__author__ = "Mike Orr <iron@mso.oz.net>"
+__revision__ = "$Revision: 1.8 $"[11:-2]
+
+import os          # Used in mkdirsWithPyInitFile.
+import types       # Used in useOrRaise.
+import sys         # Used in die.
+
+##################################################
+## MISCELLANEOUS FUNCTIONS
+
+def die(reason):
+    sys.stderr.write(reason + '\n')
+    sys.exit(1)
+
+def useOrRaise(thing, errmsg=''):
+    """Raise 'thing' if it's a subclass of Exception.  Otherwise return it.
+
+    Called by: Cheetah.Servlet.cgiImport()
+    """
+    if type(thing) == types.ClassType and issubclass(thing, Exception):
+        raise thing(errmsg)
+    return thing
+
+
+def checkKeywords(dic, legalKeywords, what='argument'):
+    """Verify no illegal keyword arguments were passed to a function.
+
+    in : dic, dictionary (**kw in the calling routine).
+         legalKeywords, list of strings, the keywords that are allowed.
+         what, string, suffix for error message (see function source).
+    out: None.
+    exc: TypeError if 'dic' contains a key not in 'legalKeywords'.
+    called by: Cheetah.Template.__init__()
+    """
+    # XXX legalKeywords could be a set when sets get added to Python.
+    for k in dic.keys(): # Can be dic.iterkeys() if Python >= 2.2.
+        if k not in legalKeywords: 
+            raise TypeError("'%s' is not a valid %s" % (k, what))
+
+
+def removeFromList(list_, *elements):
+    """Save as list_.remove(each element) but don't raise an error if
+       element is missing.  Modifies 'list_' in place!  Returns None.
+    """
+    for elm in elements:
+        try:
+            list_.remove(elm)
+        except ValueError:
+            pass
+
+
+def mkdirsWithPyInitFiles(path):
+    """Same as os.makedirs (mkdir 'path' and all missing parent directories)
+       but also puts a Python '__init__.py' file in every directory it
+       creates.  Does nothing (without creating an '__init__.py' file) if the
+       directory already exists.  
+    """
+    dir, fil = os.path.split(path)
+    if dir and not os.path.exists(dir):
+        mkdirsWithPyInitFiles(dir)
+    if not os.path.exists(path):
+        os.mkdir(path)
+        init = os.path.join(path, "__init__.py")
+        f = open(init, 'w') # Open and close to produce empty file.
+        f.close()
+
+
+
+# vim: shiftwidth=4 tabstop=4 expandtab
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Utils/__init__.py
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Utils/__init__.py (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Utils/__init__.py (revision 3)
@@ -0,0 +1,1 @@
+#
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Utils/WebInputMixin.py
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Utils/WebInputMixin.py (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Utils/WebInputMixin.py (revision 3)
@@ -0,0 +1,102 @@
+# $Id: WebInputMixin.py,v 1.10 2006/01/06 21:56:54 tavis_rudd Exp $
+"""Provides helpers for Template.webInput(), a method for importing web
+transaction variables in bulk.  See the docstring of webInput for full details.
+
+Meta-Data
+================================================================================
+Author: Mike Orr <iron@mso.oz.net>
+License: This software is released for unlimited distribution under the
+         terms of the MIT license.  See the LICENSE file.
+Version: $Revision: 1.10 $
+Start Date: 2002/03/17
+Last Revision Date: $Date: 2006/01/06 21:56:54 $
+""" 
+__author__ = "Mike Orr <iron@mso.oz.net>"
+__revision__ = "$Revision: 1.10 $"[11:-2]
+
+from Cheetah.Utils.Misc import useOrRaise
+
+class NonNumericInputError(ValueError): pass
+
+##################################################
+## PRIVATE FUNCTIONS AND CLASSES
+
+class _Converter:
+    """A container object for info about type converters.
+    .name, string, name of this converter (for error messages).
+    .func, function, factory function.
+    .default, value to use or raise if the real value is missing.
+    .error, value to use or raise if .func() raises an exception.
+    """
+    def __init__(self, name, func, default, error):
+        self.name = name
+        self.func = func
+        self.default = default
+        self.error = error
+
+
+def _lookup(name, func, multi, converters):
+    """Look up a Webware field/cookie/value/session value.  Return
+    '(realName, value)' where 'realName' is like 'name' but with any
+    conversion suffix strips off.  Applies numeric conversion and
+    single vs multi values according to the comments in the source.
+    """
+    # Step 1 -- split off the conversion suffix from 'name'; e.g. "height:int".
+    # If there's no colon, the suffix is "".  'longName' is the name with the 
+    # suffix, 'shortName' is without.    
+    # XXX This implementation assumes "height:" means "height".
+    colon = name.find(':')
+    if colon != -1:
+        longName = name
+        shortName, ext = name[:colon], name[colon+1:]
+    else:
+        longName = shortName = name
+        ext = ''
+
+    # Step 2 -- look up the values by calling 'func'.
+    if longName != shortName:
+        values = func(longName, None) or func(shortName, None)
+    else:
+        values = func(shortName, None)
+    # 'values' is a list of strings, a string or None.
+
+    # Step 3 -- Coerce 'values' to a list of zero, one or more strings.
+    if   values is None:
+        values = []
+    elif isinstance(values, str):
+        values = [values]
+
+    # Step 4 -- Find a _Converter object or raise TypeError.
+    try:
+        converter = converters[ext]
+    except KeyError:
+        fmt = "'%s' is not a valid converter name in '%s'"
+        tup = (ext, longName)
+        raise TypeError(fmt % tup)    
+
+    # Step 5 -- if there's a converter func, run it on each element.
+    # If the converter raises an exception, use or raise 'converter.error'.
+    if converter.func is not None:
+        tmp = values[:]
+        values = []
+        for elm in tmp:
+            try:
+                elm = converter.func(elm)
+            except (TypeError, ValueError):
+                tup = converter.name, elm
+                errmsg = "%s '%s' contains invalid characters" % tup
+                elm = useOrRaise(converter.error, errmsg)
+            values.append(elm)
+    # 'values' is now a list of strings, ints or floats.
+
+    # Step 6 -- If we're supposed to return a multi value, return the list
+    # as is.  If we're supposed to return a single value and the list is
+    # empty, return or raise 'converter.default'.  Otherwise, return the
+    # first element in the list and ignore any additional values.
+    if   multi:
+        return shortName, values
+    if len(values) == 0:
+        return shortName, useOrRaise(converter.default)
+    return shortName, values[0]
+
+# vim: sw=4 ts=4 expandtab
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Utils/htmlEncode.py
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Utils/htmlEncode.py (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Utils/htmlEncode.py (revision 3)
@@ -0,0 +1,21 @@
+"""This is a copy of the htmlEncode function in Webware.
+
+
+@@TR: It implemented more efficiently.
+
+"""
+htmlCodes = [
+    ['&', '&amp;'],
+    ['<', '&lt;'],
+    ['>', '&gt;'],
+    ['"', '&quot;'],
+]
+htmlCodesReversed = htmlCodes[:]
+htmlCodesReversed.reverse()
+
+def htmlEncode(s, codes=htmlCodes):
+    """ Returns the HTML encoded version of the given string. This is useful to
+    display a plain ASCII text string on a web page."""
+    for code in codes:
+        s = s.replace(code[0], code[1])
+    return s
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Utils/memcache.py
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Utils/memcache.py (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Utils/memcache.py (revision 3)
@@ -0,0 +1,624 @@
+
+"""
+client module for memcached (memory cache daemon)
+
+Overview
+========
+
+See U{the MemCached homepage<http://www.danga.com/memcached>} for more about memcached.
+
+Usage summary
+=============
+
+This should give you a feel for how this module operates::
+
+    import memcache
+    mc = memcache.Client(['127.0.0.1:11211'], debug=0)
+
+    mc.set("some_key", "Some value")
+    value = mc.get("some_key")
+
+    mc.set("another_key", 3)
+    mc.delete("another_key")
+    
+    mc.set("key", "1")   # note that the key used for incr/decr must be a string.
+    mc.incr("key")
+    mc.decr("key")
+
+The standard way to use memcache with a database is like this::
+
+    key = derive_key(obj)
+    obj = mc.get(key)
+    if not obj:
+        obj = backend_api.get(...)
+        mc.set(key, obj)
+
+    # we now have obj, and future passes through this code
+    # will use the object from the cache.
+
+Detailed Documentation
+======================
+
+More detailed documentation is available in the L{Client} class.
+"""
+
+import sys
+import socket
+import time
+import types
+try:
+    import cPickle as pickle
+except ImportError:
+    import pickle
+
+__author__    = "Evan Martin <martine@danga.com>"
+__version__   = "1.2_tummy5"
+__copyright__ = "Copyright (C) 2003 Danga Interactive"
+__license__   = "Python"
+
+class _Error(Exception):
+    pass
+
+class Client:
+    """
+    Object representing a pool of memcache servers.
+    
+    See L{memcache} for an overview.
+
+    In all cases where a key is used, the key can be either:
+        1. A simple hashable type (string, integer, etc.).
+        2. A tuple of C{(hashvalue, key)}.  This is useful if you want to avoid
+        making this module calculate a hash value.  You may prefer, for
+        example, to keep all of a given user's objects on the same memcache
+        server, so you could use the user's unique id as the hash value.
+
+    @group Setup: __init__, set_servers, forget_dead_hosts, disconnect_all, debuglog
+    @group Insertion: set, add, replace
+    @group Retrieval: get, get_multi
+    @group Integers: incr, decr
+    @group Removal: delete
+    @sort: __init__, set_servers, forget_dead_hosts, disconnect_all, debuglog,\
+           set, add, replace, get, get_multi, incr, decr, delete
+    """
+
+    _usePickle = False
+    _FLAG_PICKLE  = 1<<0
+    _FLAG_INTEGER = 1<<1
+    _FLAG_LONG    = 1<<2
+
+    _SERVER_RETRIES = 10  # how many times to try finding a free server.
+
+    def __init__(self, servers, debug=0):
+        """
+        Create a new Client object with the given list of servers.
+
+        @param servers: C{servers} is passed to L{set_servers}.
+        @param debug: whether to display error messages when a server can't be
+        contacted.
+        """
+        self.set_servers(servers)
+        self.debug = debug
+        self.stats = {}
+    
+    def set_servers(self, servers):
+        """
+        Set the pool of servers used by this client.
+
+        @param servers: an array of servers.
+        Servers can be passed in two forms:
+            1. Strings of the form C{"host:port"}, which implies a default weight of 1.
+            2. Tuples of the form C{("host:port", weight)}, where C{weight} is
+            an integer weight value.
+        """
+        self.servers = [_Host(s, self.debuglog) for s in servers]
+        self._init_buckets()
+
+    def get_stats(self):
+        '''Get statistics from each of the servers.  
+
+        @return: A list of tuples ( server_identifier, stats_dictionary ).
+            The dictionary contains a number of name/value pairs specifying
+            the name of the status field and the string value associated with
+            it.  The values are not converted from strings.
+        '''
+        data = []
+        for s in self.servers:
+            if not s.connect(): continue
+            name = '%s:%s (%s)' % ( s.ip, s.port, s.weight )
+            s.send_cmd('stats')
+            serverData = {}
+            data.append(( name, serverData ))
+            readline = s.readline
+            while 1:
+                line = readline()
+                if not line or line.strip() == 'END': break
+                stats = line.split(' ', 2)
+                serverData[stats[1]] = stats[2]
+
+        return(data)
+
+    def flush_all(self):
+        'Expire all data currently in the memcache servers.'
+        for s in self.servers:
+            if not s.connect(): continue
+            s.send_cmd('flush_all')
+            s.expect("OK")
+
+    def debuglog(self, str):
+        if self.debug:
+            sys.stderr.write("MemCached: %s\n" % str)
+
+    def _statlog(self, func):
+        if not self.stats.has_key(func):
+            self.stats[func] = 1
+        else:
+            self.stats[func] += 1
+
+    def forget_dead_hosts(self):
+        """
+        Reset every host in the pool to an "alive" state.
+        """
+        for s in self.servers:
+            s.dead_until = 0
+
+    def _init_buckets(self):
+        self.buckets = []
+        for server in self.servers:
+            for i in range(server.weight):
+                self.buckets.append(server)
+
+    def _get_server(self, key):
+        if type(key) == types.TupleType:
+            serverhash = key[0]
+            key = key[1]
+        else:
+            serverhash = hash(key)
+
+        for i in range(Client._SERVER_RETRIES):
+            server = self.buckets[serverhash % len(self.buckets)]
+            if server.connect():
+                #print "(using server %s)" % server,
+                return server, key
+            serverhash = hash(str(serverhash) + str(i))
+        return None, None
+
+    def disconnect_all(self):
+        for s in self.servers:
+            s.close_socket()
+    
+    def delete(self, key, time=0):
+        '''Deletes a key from the memcache.
+        
+        @return: Nonzero on success.
+        @rtype: int
+        '''
+        server, key = self._get_server(key)
+        if not server:
+            return 0
+        self._statlog('delete')
+        if time != None:
+            cmd = "delete %s %d" % (key, time)
+        else:
+            cmd = "delete %s" % key
+
+        try:
+            server.send_cmd(cmd)
+            server.expect("DELETED")
+        except socket.error, msg:
+            server.mark_dead(msg[1])
+            return 0
+        return 1
+
+    def incr(self, key, delta=1):
+        """
+        Sends a command to the server to atomically increment the value for C{key} by
+        C{delta}, or by 1 if C{delta} is unspecified.  Returns None if C{key} doesn't
+        exist on server, otherwise it returns the new value after incrementing.
+
+        Note that the value for C{key} must already exist in the memcache, and it
+        must be the string representation of an integer.
+
+        >>> mc.set("counter", "20")  # returns 1, indicating success
+        1
+        >>> mc.incr("counter")
+        21
+        >>> mc.incr("counter")
+        22
+
+        Overflow on server is not checked.  Be aware of values approaching
+        2**32.  See L{decr}.
+
+        @param delta: Integer amount to increment by (should be zero or greater).
+        @return: New value after incrementing.
+        @rtype: int
+        """
+        return self._incrdecr("incr", key, delta)
+
+    def decr(self, key, delta=1):
+        """
+        Like L{incr}, but decrements.  Unlike L{incr}, underflow is checked and
+        new values are capped at 0.  If server value is 1, a decrement of 2
+        returns 0, not -1.
+
+        @param delta: Integer amount to decrement by (should be zero or greater).
+        @return: New value after decrementing.
+        @rtype: int
+        """
+        return self._incrdecr("decr", key, delta)
+
+    def _incrdecr(self, cmd, key, delta):
+        server, key = self._get_server(key)
+        if not server:
+            return 0
+        self._statlog(cmd)
+        cmd = "%s %s %d" % (cmd, key, delta)
+        try:
+            server.send_cmd(cmd)
+            line = server.readline()
+            return int(line)
+        except socket.error, msg:
+            server.mark_dead(msg[1])
+            return None
+
+    def add(self, key, val, time=0):
+        '''
+        Add new key with value.
+        
+        Like L{set}, but only stores in memcache if the key doesn\'t already exist.
+
+        @return: Nonzero on success.
+        @rtype: int
+        '''
+        return self._set("add", key, val, time)
+    def replace(self, key, val, time=0):
+        '''Replace existing key with value.
+        
+        Like L{set}, but only stores in memcache if the key already exists.  
+        The opposite of L{add}.
+
+        @return: Nonzero on success.
+        @rtype: int
+        '''
+        return self._set("replace", key, val, time)
+    def set(self, key, val, time=0):
+        '''Unconditionally sets a key to a given value in the memcache.
+
+        The C{key} can optionally be an tuple, with the first element being the
+        hash value, if you want to avoid making this module calculate a hash value.
+        You may prefer, for example, to keep all of a given user's objects on the
+        same memcache server, so you could use the user's unique id as the hash
+        value.
+
+        @return: Nonzero on success.
+        @rtype: int
+        '''
+        return self._set("set", key, val, time)
+    
+    def _set(self, cmd, key, val, time):
+        server, key = self._get_server(key)
+        if not server:
+            return 0
+
+        self._statlog(cmd)
+
+        flags = 0
+        if isinstance(val, types.StringTypes):
+            pass
+        elif isinstance(val, int):
+            flags |= Client._FLAG_INTEGER
+            val = "%d" % val
+        elif isinstance(val, long):
+            flags |= Client._FLAG_LONG
+            val = "%d" % val
+        elif self._usePickle:
+            flags |= Client._FLAG_PICKLE
+            val = pickle.dumps(val, 2)
+        else:
+            pass
+        
+        fullcmd = "%s %s %d %d %d\r\n%s" % (cmd, key, flags, time, len(val), val)
+        try:
+            server.send_cmd(fullcmd)
+            server.expect("STORED")
+        except socket.error, msg:
+            server.mark_dead(msg[1])
+            return 0
+        return 1
+
+    def get(self, key):
+        '''Retrieves a key from the memcache.
+        
+        @return: The value or None.
+        '''
+        server, key = self._get_server(key)
+        if not server:
+            return None
+
+        self._statlog('get')
+
+        try:
+            server.send_cmd("get %s" % key)
+            rkey, flags, rlen, = self._expectvalue(server)
+            if not rkey:
+                return None
+            value = self._recv_value(server, flags, rlen)
+            server.expect("END")
+        except (_Error, socket.error), msg:
+            if type(msg) is types.TupleType:
+                msg = msg[1]
+            server.mark_dead(msg)
+            return None
+        return value
+
+    def get_multi(self, keys):
+        '''
+        Retrieves multiple keys from the memcache doing just one query.
+        
+        >>> success = mc.set("foo", "bar")
+        >>> success = mc.set("baz", 42)
+        >>> mc.get_multi(["foo", "baz", "foobar"]) == {"foo": "bar", "baz": 42}
+        1
+
+        This method is recommended over regular L{get} as it lowers the number of
+        total packets flying around your network, reducing total latency, since
+        your app doesn\'t have to wait for each round-trip of L{get} before sending
+        the next one.
+
+        @param keys: An array of keys.
+        @return:  A dictionary of key/value pairs that were available.
+
+        '''
+
+        self._statlog('get_multi')
+
+        server_keys = {}
+
+        # build up a list for each server of all the keys we want.
+        for key in keys:
+            server, key = self._get_server(key)
+            if not server:
+                continue
+            if not server_keys.has_key(server):
+                server_keys[server] = []
+            server_keys[server].append(key)
+
+        # send out all requests on each server before reading anything
+        dead_servers = []
+        for server in server_keys.keys():
+            try:
+                server.send_cmd("get %s" % " ".join(server_keys[server]))
+            except socket.error, msg:
+                server.mark_dead(msg[1])
+                dead_servers.append(server)
+
+        # if any servers died on the way, don't expect them to respond.
+        for server in dead_servers:
+            del server_keys[server]
+
+        retvals = {}
+        for server in server_keys.keys():
+            try:
+                line = server.readline()
+                while line and line != 'END':
+                    rkey, flags, rlen = self._expectvalue(server, line)
+                    #  Bo Yang reports that this can sometimes be None
+                    if rkey is not None:
+                        val = self._recv_value(server, flags, rlen)
+                        retvals[rkey] = val
+                    line = server.readline()
+            except (_Error, socket.error), msg:
+                server.mark_dead(msg)
+        return retvals
+
+    def _expectvalue(self, server, line=None):
+        if not line:
+            line = server.readline()
+
+        if line[:5] == 'VALUE':
+            resp, rkey, flags, len = line.split()
+            flags = int(flags)
+            rlen = int(len)
+            return (rkey, flags, rlen)
+        else:
+            return (None, None, None)
+
+    def _recv_value(self, server, flags, rlen):
+        rlen += 2 # include \r\n
+        buf = server.recv(rlen)
+        if len(buf) != rlen:
+            raise _Error("received %d bytes when expecting %d" % (len(buf), rlen))
+
+        if len(buf) == rlen:
+            buf = buf[:-2]  # strip \r\n
+
+        if flags == 0:
+            val = buf
+        elif flags & Client._FLAG_INTEGER:
+            val = int(buf)
+        elif flags & Client._FLAG_LONG:
+            val = long(buf)
+        elif self._usePickle and flags & Client._FLAG_PICKLE:
+            try:
+                val = pickle.loads(buf)
+            except:
+                self.debuglog('Pickle error...\n')
+                val = None
+        else:
+            self.debuglog("unknown flags on get: %x\n" % flags)
+
+        return val
+
+class _Host:
+    _DEAD_RETRY = 30  # number of seconds before retrying a dead server.
+
+    def __init__(self, host, debugfunc=None):
+        if isinstance(host, types.TupleType):
+            host = host[0]
+            self.weight = host[1]
+        else:
+            self.weight = 1
+
+        if host.find(":") > 0:
+            self.ip, self.port = host.split(":")
+            self.port = int(self.port)
+        else:
+            self.ip, self.port = host, 11211
+
+        if not debugfunc:
+            debugfunc = lambda x: x
+        self.debuglog = debugfunc
+
+        self.deaduntil = 0
+        self.socket = None
+    
+    def _check_dead(self):
+        if self.deaduntil and self.deaduntil > time.time():
+            return 1
+        self.deaduntil = 0
+        return 0
+
+    def connect(self):
+        if self._get_socket():
+            return 1
+        return 0
+
+    def mark_dead(self, reason):
+        self.debuglog("MemCache: %s: %s.  Marking dead." % (self, reason))
+        self.deaduntil = time.time() + _Host._DEAD_RETRY
+        self.close_socket()
+        
+    def _get_socket(self):
+        if self._check_dead():
+            return None
+        if self.socket:
+            return self.socket
+        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+        # Python 2.3-ism:  s.settimeout(1)
+        try:
+            s.connect((self.ip, self.port))
+        except socket.error, msg:
+            self.mark_dead("connect: %s" % msg[1])
+            return None
+        self.socket = s
+        return s
+    
+    def close_socket(self):
+        if self.socket:
+            self.socket.close()
+            self.socket = None
+
+    def send_cmd(self, cmd):
+        if len(cmd) > 100:
+            self.socket.sendall(cmd)
+            self.socket.sendall('\r\n')
+        else:
+            self.socket.sendall(cmd + '\r\n')
+
+    def readline(self):
+        buffers = ''
+        recv = self.socket.recv
+        while 1:
+            data = recv(1)
+            if not data:
+                self.mark_dead('Connection closed while reading from %s'
+                        % repr(self))
+                break
+            if data == '\n' and buffers and buffers[-1] == '\r':
+                return(buffers[:-1])
+            buffers = buffers + data
+        return(buffers)
+
+    def expect(self, text):
+        line = self.readline()
+        if line != text:
+            self.debuglog("while expecting '%s', got unexpected response '%s'" % (text, line))
+        return line
+    
+    def recv(self, rlen):
+        buf = ''
+        recv = self.socket.recv
+        while len(buf) < rlen:
+            buf = buf + recv(rlen - len(buf))
+        return buf
+
+    def __str__(self):
+        d = ''
+        if self.deaduntil:
+            d = " (dead until %d)" % self.deaduntil
+        return "%s:%d%s" % (self.ip, self.port, d)
+
+def _doctest():
+    import doctest, memcache
+    servers = ["127.0.0.1:11211"]
+    mc = Client(servers, debug=1)
+    globs = {"mc": mc}
+    return doctest.testmod(memcache, globs=globs)
+
+if __name__ == "__main__":
+    print "Testing docstrings..."
+    _doctest()
+    print "Running tests:"
+    print
+    #servers = ["127.0.0.1:11211", "127.0.0.1:11212"]
+    servers = ["127.0.0.1:11211"]
+    mc = Client(servers, debug=1)
+
+    def to_s(val):
+        if not isinstance(val, types.StringTypes):
+            return "%s (%s)" % (val, type(val))
+        return "%s" % val
+    def test_setget(key, val):
+        print "Testing set/get {'%s': %s} ..." % (to_s(key), to_s(val)),
+        mc.set(key, val)
+        newval = mc.get(key)
+        if newval == val:
+            print "OK"
+            return 1
+        else:
+            print "FAIL"
+            return 0
+
+    class FooStruct:
+        def __init__(self):
+            self.bar = "baz"
+        def __str__(self):
+            return "A FooStruct"
+        def __eq__(self, other):
+            if isinstance(other, FooStruct):
+                return self.bar == other.bar
+            return 0
+        
+    test_setget("a_string", "some random string")
+    test_setget("an_integer", 42)
+    if test_setget("long", long(1<<30)):
+        print "Testing delete ...",
+        if mc.delete("long"):
+            print "OK"
+        else:
+            print "FAIL"
+    print "Testing get_multi ...",
+    print mc.get_multi(["a_string", "an_integer"])
+
+    print "Testing get(unknown value) ...",
+    print to_s(mc.get("unknown_value"))
+
+    f = FooStruct()
+    test_setget("foostruct", f)
+
+    print "Testing incr ...",
+    x = mc.incr("an_integer", 1)
+    if x == 43:
+        print "OK"
+    else:
+        print "FAIL"
+
+    print "Testing decr ...",
+    x = mc.decr("an_integer", 1)
+    if x == 42:
+        print "OK"
+    else:
+        print "FAIL"
+
+
+
+# vim: ts=4 sw=4 et :
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Utils/statprof.py
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Utils/statprof.py (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Utils/statprof.py (revision 3)
@@ -0,0 +1,304 @@
+## statprof.py
+## Copyright (C) 2004,2005 Andy Wingo <wingo at pobox dot com>
+## Copyright (C) 2001 Rob Browning <rlb at defaultvalue dot org>
+
+## This library is free software; you can redistribute it and/or
+## modify it under the terms of the GNU Lesser General Public
+## License as published by the Free Software Foundation; either
+## version 2.1 of the License, or (at your option) any later version.
+##
+## This library is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+## Lesser General Public License for more details.
+##
+## You should have received a copy of the GNU Lesser General Public
+## License along with this program; if not, contact:
+##
+## Free Software Foundation           Voice:  +1-617-542-5942
+## 59 Temple Place - Suite 330        Fax:    +1-617-542-2652
+## Boston, MA  02111-1307,  USA       gnu@gnu.org
+
+"""
+statprof is intended to be a fairly simple statistical profiler for
+python. It was ported directly from a statistical profiler for guile,
+also named statprof, available from guile-lib [0].
+
+[0] http://wingolog.org/software/guile-lib/statprof/
+
+To start profiling, call statprof.start():
+>>> start()
+
+Then run whatever it is that you want to profile, for example:
+>>> import test.pystone; test.pystone.pystones()
+
+Then stop the profiling and print out the results:
+>>> stop()
+>>> display()
+  %   cumulative      self          
+ time    seconds   seconds  name    
+ 26.72      1.40      0.37  pystone.py:79:Proc0
+ 13.79      0.56      0.19  pystone.py:133:Proc1
+ 13.79      0.19      0.19  pystone.py:208:Proc8
+ 10.34      0.16      0.14  pystone.py:229:Func2
+  6.90      0.10      0.10  pystone.py:45:__init__
+  4.31      0.16      0.06  pystone.py:53:copy
+    ...
+
+All of the numerical data with the exception of the calls column is
+statistically approximate. In the following column descriptions, and
+in all of statprof, "time" refers to execution time (both user and
+system), not wall clock time.
+
+% time
+    The percent of the time spent inside the procedure itself (not
+    counting children).
+
+cumulative seconds
+    The total number of seconds spent in the procedure, including
+    children.
+
+self seconds
+    The total number of seconds spent in the procedure itself (not
+    counting children).
+
+name
+    The name of the procedure.
+
+By default statprof keeps the data collected from previous runs. If you
+want to clear the collected data, call reset():
+>>> reset()
+
+reset() can also be used to change the sampling frequency. For example,
+to tell statprof to sample 50 times a second:
+>>> reset(50)
+
+This means that statprof will sample the call stack after every 1/50 of
+a second of user + system time spent running on behalf of the python
+process. When your process is idle (for example, blocking in a read(),
+as is the case at the listener), the clock does not advance. For this
+reason statprof is not currently not suitable for profiling io-bound
+operations.
+
+The profiler uses the hash of the code object itself to identify the
+procedures, so it won't confuse different procedures with the same name.
+They will show up as two different rows in the output.
+
+Right now the profiler is quite simplistic.  I cannot provide
+call-graphs or other higher level information.  What you see in the
+table is pretty much all there is. Patches are welcome :-)
+
+
+Threading
+---------
+
+Because signals only get delivered to the main thread in Python,
+statprof only profiles the main thread. However because the time
+reporting function uses per-process timers, the results can be
+significantly off if other threads' work patterns are not similar to the
+main thread's work patterns.
+
+
+Implementation notes
+--------------------
+
+The profiler works by setting the unix profiling signal ITIMER_PROF to
+go off after the interval you define in the call to reset(). When the
+signal fires, a sampling routine is run which looks at the current
+procedure that's executing, and then crawls up the stack, and for each
+frame encountered, increments that frame's code object's sample count.
+Note that if a procedure is encountered multiple times on a given stack,
+it is only counted once. After the sampling is complete, the profiler
+resets profiling timer to fire again after the appropriate interval.
+
+Meanwhile, the profiler keeps track, via os.times(), how much CPU time
+(system and user -- which is also what ITIMER_PROF tracks), has elapsed
+while code has been executing within a start()/stop() block.
+
+The profiler also tries to avoid counting or timing its own code as
+much as possible.
+"""
+
+
+from __future__ import division
+
+try:
+    import itimer
+except ImportError:
+    raise ImportError('''statprof requires the itimer python extension.
+To install it, enter the following commands from a terminal:
+
+wget http://www.cute.fi/~torppa/py-itimer/py-itimer.tar.gz
+tar zxvf py-itimer.tar.gz
+cd py-itimer
+sudo python setup.py install
+''')
+
+import signal
+import os
+
+
+__all__ = ['start', 'stop', 'reset', 'display']
+
+
+###########################################################################
+## Utils
+
+def clock():
+    times = os.times()
+    return times[0] + times[1]
+
+
+###########################################################################
+## Collection data structures
+
+class ProfileState(object):
+    def __init__(self, frequency=None):
+        self.reset(frequency)
+
+    def reset(self, frequency=None):
+        # total so far
+        self.accumulated_time = 0.0
+        # start_time when timer is active
+        self.last_start_time = None
+        # total count of sampler calls
+        self.sample_count = 0
+        # a float
+        if frequency:
+            self.sample_interval = 1.0/frequency
+        elif not hasattr(self, 'sample_interval'):
+            # default to 100 Hz
+            self.sample_interval = 1.0/100.0
+        else:
+            # leave the frequency as it was
+            pass
+        self.remaining_prof_time = None
+        # for user start/stop nesting
+        self.profile_level = 0
+        # whether to catch apply-frame
+        self.count_calls = False
+        # gc time between start() and stop()
+        self.gc_time_taken = 0
+
+    def accumulate_time(self, stop_time):
+        self.accumulated_time += stop_time - self.last_start_time
+
+state = ProfileState()
+
+## call_data := { code object: CallData }
+call_data = {}
+class CallData(object):
+    def __init__(self, code):
+        self.name = code.co_name
+        self.filename = code.co_filename
+        self.lineno = code.co_firstlineno
+        self.call_count = 0
+        self.cum_sample_count = 0
+        self.self_sample_count = 0
+        call_data[code] = self
+
+def get_call_data(code):
+    return call_data.get(code, None) or CallData(code)
+
+
+###########################################################################
+## SIGPROF handler
+
+def sample_stack_procs(frame):
+    state.sample_count += 1
+    get_call_data(frame.f_code).self_sample_count += 1
+
+    code_seen = {}
+    while frame:
+        code_seen[frame.f_code] = True
+        frame = frame.f_back
+    for code in code_seen.iterkeys():
+        get_call_data(code).cum_sample_count += 1
+
+def profile_signal_handler(signum, frame):
+    if state.profile_level > 0:
+        state.accumulate_time(clock())
+        sample_stack_procs(frame)
+        itimer.setitimer(itimer.ITIMER_PROF,
+            state.sample_interval, 0.0)
+        state.last_start_time = clock()
+
+
+###########################################################################
+## Profiling API
+
+def is_active():
+    return state.profile_level > 0
+
+def start():
+    state.profile_level += 1
+    if state.profile_level == 1:
+        state.last_start_time = clock()
+        rpt = state.remaining_prof_time
+        state.remaining_prof_time = None
+        signal.signal(signal.SIGPROF, profile_signal_handler)
+        itimer.setitimer(itimer.ITIMER_PROF,
+            rpt or state.sample_interval, 0.0)
+        state.gc_time_taken = 0 # dunno
+  
+def stop():
+    state.profile_level -= 1
+    if state.profile_level == 0:
+        state.accumulate_time(clock())
+        state.last_start_time = None
+        rpt = itimer.setitimer(itimer.ITIMER_PROF, 0.0, 0.0)
+        signal.signal(signal.SIGPROF, signal.SIG_IGN)
+        state.remaining_prof_time = rpt[0]
+        state.gc_time_taken = 0 # dunno
+    
+def reset(frequency=None):
+    assert state.profile_level == 0, "Can't reset() while statprof is running"
+    call_data.clear()
+    state.reset(frequency)
+    
+
+###########################################################################
+## Reporting API
+
+class CallStats(object):
+    def __init__(self, call_data):
+        self_samples = call_data.self_sample_count
+        cum_samples = call_data.cum_sample_count
+        nsamples = state.sample_count
+        secs_per_sample = state.accumulated_time / nsamples
+        basename = os.path.basename(call_data.filename)
+
+        self.name = '%s:%d:%s' % (basename, call_data.lineno, call_data.name)
+        self.pcnt_time_in_proc = self_samples / nsamples * 100
+        self.cum_secs_in_proc = cum_samples * secs_per_sample
+        self.self_secs_in_proc = self_samples * secs_per_sample
+        self.num_calls = None
+        self.self_secs_per_call = None
+        self.cum_secs_per_call = None
+
+    def display(self):
+        print '%6.2f %9.2f %9.2f  %s' % (self.pcnt_time_in_proc,
+                                         self.cum_secs_in_proc,
+                                         self.self_secs_in_proc,
+                                         self.name)
+
+
+def display():
+    if state.sample_count == 0:
+        print 'No samples recorded.'
+        return
+
+    l = [CallStats(x) for x in call_data.itervalues()]
+    l = [(x.self_secs_in_proc, x.cum_secs_in_proc, x) for x in l]
+    l.sort(reverse=True)
+    l = [x[2] for x in l]
+
+    print '%5.5s %10.10s   %7.7s  %-8.8s' % ('%  ', 'cumulative', 'self', '')
+    print '%5.5s  %9.9s  %8.8s  %-8.8s' % ("time", "seconds", "seconds", "name")
+
+    for x in l:
+        x.display()
+
+    print '---'
+    print 'Sample count: %d' % state.sample_count
+    print 'Total time: %f seconds' % state.accumulated_time
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Utils/VerifyType.py
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Utils/VerifyType.py (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Utils/VerifyType.py (revision 3)
@@ -0,0 +1,83 @@
+# $Id: VerifyType.py,v 1.4 2005/11/02 22:26:08 tavis_rudd Exp $
+"""Functions to verify an argument's type
+
+Meta-Data
+================================================================================
+Author: Mike Orr <iron@mso.oz.net>
+License: This software is released for unlimited distribution under the
+         terms of the MIT license.  See the LICENSE file.
+Version: $Revision: 1.4 $
+Start Date: 2001/11/07
+Last Revision Date: $Date: 2005/11/02 22:26:08 $
+""" 
+__author__ = "Mike Orr <iron@mso.oz.net>"
+__revision__ = "$Revision: 1.4 $"[11:-2]
+
+##################################################
+## DEPENDENCIES
+
+import types       # Used in VerifyTypeClass.
+
+##################################################
+## PRIVATE FUNCTIONS
+
+def _errmsg(argname, ltd, errmsgExtra=''):
+    """Construct an error message.
+
+    argname, string, the argument name.
+    ltd, string, description of the legal types.
+    errmsgExtra, string, text to append to error mssage.
+    Returns: string, the error message.
+    """
+    if errmsgExtra:
+        errmsgExtra = '\n' + errmsgExtra
+    return "arg '%s' must be %s%s" % (argname, ltd, errmsgExtra)
+
+
+##################################################
+## TYPE VERIFICATION FUNCTIONS
+
+def VerifyType(arg, argname, legalTypes, ltd, errmsgExtra=''):
+    """Verify the type of an argument.
+    
+    arg, any, the argument.
+    argname, string, name of the argument.
+    legalTypes, list of type objects, the allowed types.
+    ltd, string, description of legal types (for error message).
+    errmsgExtra, string, text to append to error message.
+    Returns: None.
+    Exceptions: TypeError if 'arg' is the wrong type.
+    """
+    if type(arg) not in legalTypes:
+        m = _errmsg(argname, ltd, errmsgExtra)
+        raise TypeError(m)
+    return True
+
+
+def VerifyTypeClass(arg, argname, legalTypes, ltd, klass, errmsgExtra=''):
+    """Same, but if it's a class, verify it's a subclass of the right class.
+
+    arg, any, the argument.
+    argname, string, name of the argument.
+    legalTypes, list of type objects, the allowed types.
+    ltd, string, description of legal types (for error message).
+    klass, class, the parent class.
+    errmsgExtra, string, text to append to the error message.
+    Returns: None.
+    Exceptions: TypeError if 'arg' is the wrong type.
+    """
+    VerifyType(arg, argname, legalTypes, ltd, errmsgExtra)
+    # If no exception, the arg is a legal type.
+    if type(arg) == types.ClassType and not issubclass(arg, klass):
+        # Must test for "is class type" to avoid TypeError from issubclass().
+        m = _errmsg(argname, ltd, errmsgExtra)
+        raise TypeError(m)
+    return True
+
+# @@MO: Commented until we determine whether it's useful.
+#def VerifyClass(arg, argname, klass, ltd):
+#    """Same, but allow *only* a subclass of the right class.
+#    """
+#    VerifyTypeClass(arg, argname, [types.ClassType], ltd, klass)
+
+# vim: shiftwidth=4 tabstop=4 expandtab
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Compiler.py
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Compiler.py (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Compiler.py (revision 3)
@@ -0,0 +1,2013 @@
+'''
+    Compiler classes for Cheetah:
+    ModuleCompiler aka 'Compiler'
+    ClassCompiler
+    MethodCompiler
+
+    If you are trying to grok this code start with ModuleCompiler.__init__,
+    ModuleCompiler.compile, and ModuleCompiler.__getattr__.
+'''
+
+import sys
+import os
+import os.path
+from os.path import getmtime, exists
+import re
+import types
+import time
+import random
+import warnings
+import copy
+
+from Cheetah.Version import Version, VersionTuple
+from Cheetah.SettingsManager import SettingsManager
+from Cheetah.Utils.Indenter import indentize # an undocumented preprocessor
+from Cheetah import ErrorCatchers
+from Cheetah import NameMapper
+from Cheetah.Parser import Parser, ParseError, specialVarRE, \
+     STATIC_CACHE, REFRESH_CACHE, SET_LOCAL, SET_GLOBAL,SET_MODULE, \
+     unicodeDirectiveRE, encodingDirectiveRE,escapedNewlineRE
+
+from Cheetah.NameMapper import NotFound, valueForName, valueFromSearchList, valueFromFrameOrSearchList
+VFFSL=valueFromFrameOrSearchList
+VFSL=valueFromSearchList
+VFN=valueForName
+currentTime=time.time
+
+class Error(Exception): pass
+
+# Settings format: (key, default, docstring)
+_DEFAULT_COMPILER_SETTINGS = [
+    ('useNameMapper', True, 'Enable NameMapper for dotted notation and searchList support'),
+    ('useSearchList', True, 'Enable the searchList, requires useNameMapper=True, if disabled, first portion of the $variable is a global, builtin, or local variable that doesn\'t need looking up in the searchList'),
+    ('allowSearchListAsMethArg', True, ''),
+    ('useAutocalling', True, 'Detect and call callable objects in searchList, requires useNameMapper=True'),
+    ('useStackFrames', True, 'Used for NameMapper.valueFromFrameOrSearchList rather than NameMapper.valueFromSearchList'),
+    ('useErrorCatcher', False, 'Turn on the #errorCatcher directive for catching NameMapper errors, etc'),
+    ('alwaysFilterNone', True, 'Filter out None prior to calling the #filter'),
+    ('useFilters', True, 'If False, pass output through str()'),
+    ('includeRawExprInFilterArgs', True, ''),
+    ('useLegacyImportMode', True, 'All #import statements are relocated to the top of the generated Python module'),
+    ('prioritizeSearchListOverSelf', False, 'When iterating the searchList, look into the searchList passed into the initializer instead of Template members first'),
+
+    ('autoAssignDummyTransactionToSelf', False, ''),
+    ('useKWsDictArgForPassingTrans', True, ''),
+
+    ('commentOffset', 1, ''),
+    ('outputRowColComments', True, ''),
+    ('includeBlockMarkers', False, 'Wrap #block\'s in a comment in the template\'s output'),
+    ('blockMarkerStart', ('\n<!-- START BLOCK: ',' -->\n'), ''),
+    ('blockMarkerEnd', ('\n<!-- END BLOCK: ',' -->\n'), ''),
+    ('defDocStrMsg', 'Autogenerated by Cheetah: The Python-Powered Template Engine', ''),
+    ('setup__str__method', False, ''),
+    ('mainMethodName', 'respond', ''),
+    ('mainMethodNameForSubclasses', 'writeBody', ''),
+    ('indentationStep', ' ' * 4, ''),
+    ('initialMethIndentLevel', 2, ''),
+    ('monitorSrcFile', False, ''),
+    ('outputMethodsBeforeAttributes', True, ''),
+    ('addTimestampsToCompilerOutput', True, ''),
+
+    ## Customizing the #extends directive
+    ('autoImportForExtendsDirective', True, ''),
+    ('handlerForExtendsDirective', None, ''),
+
+    ('disabledDirectives', [], 'List of directive keys to disable (without starting "#")'),
+    ('enabledDirectives', [], 'List of directive keys to enable (without starting "#")'),
+    ('disabledDirectiveHooks', [], 'callable(parser, directiveKey)'),
+    ('preparseDirectiveHooks', [], 'callable(parser, directiveKey)'),
+    ('postparseDirectiveHooks', [], 'callable(parser, directiveKey)'),
+    ('preparsePlaceholderHooks', [], 'callable(parser)'),
+    ('postparsePlaceholderHooks', [], 'callable(parser)'),
+    ('expressionFilterHooks', [], '''callable(parser, expr, exprType, rawExpr=None, startPos=None), exprType is the name of the directive, "psp" or "placeholder" The filters *must* return the expr or raise an expression, they can modify the expr if needed'''),
+    ('templateMetaclass', None, 'Strictly optional, only will work with new-style basecalsses as well'),
+    ('i18NFunctionName', 'self.i18n', ''),
+
+    ('cheetahVarStartToken', '$', ''),
+    ('commentStartToken', '##', ''),
+    ('multiLineCommentStartToken', '#*', ''),
+    ('multiLineCommentEndToken', '*#', ''),
+    ('gobbleWhitespaceAroundMultiLineComments', True, ''),
+    ('directiveStartToken', '#', ''),
+    ('directiveEndToken', '#', ''),
+    ('allowWhitespaceAfterDirectiveStartToken', False, ''),
+    ('PSPStartToken', '<%', ''),
+    ('PSPEndToken', '%>', ''),
+    ('EOLSlurpToken', '#', ''),
+    ('gettextTokens', ["_", "N_", "ngettext"], ''),
+    ('allowExpressionsInExtendsDirective', False, ''),
+    ('allowEmptySingleLineMethods', False, ''),
+    ('allowNestedDefScopes', True, ''),
+    ('allowPlaceholderFilterArgs', True, ''),
+]
+
+DEFAULT_COMPILER_SETTINGS = dict([(v[0], v[1]) for v in _DEFAULT_COMPILER_SETTINGS])
+
+
+
+class GenUtils(object):
+    """An abstract baseclass for the Compiler classes that provides methods that
+    perform generic utility functions or generate pieces of output code from
+    information passed in by the Parser baseclass.  These methods don't do any
+    parsing themselves.
+    """
+
+    def genTimeInterval(self, timeString):
+        ##@@ TR: need to add some error handling here
+        if timeString[-1] == 's':
+            interval = float(timeString[:-1])
+        elif timeString[-1] == 'm':
+            interval = float(timeString[:-1])*60
+        elif timeString[-1] == 'h':
+            interval = float(timeString[:-1])*60*60
+        elif timeString[-1] == 'd':
+            interval = float(timeString[:-1])*60*60*24
+        elif timeString[-1] == 'w':
+            interval = float(timeString[:-1])*60*60*24*7
+        else:                       # default to minutes
+            interval = float(timeString)*60
+        return interval
+
+    def genCacheInfo(self, cacheTokenParts):
+        """Decipher a placeholder cachetoken
+        """
+        cacheInfo = {}
+        if cacheTokenParts['REFRESH_CACHE']:
+            cacheInfo['type'] = REFRESH_CACHE
+            cacheInfo['interval'] = self.genTimeInterval(cacheTokenParts['interval'])
+        elif cacheTokenParts['STATIC_CACHE']:
+            cacheInfo['type'] = STATIC_CACHE
+        return cacheInfo                # is empty if no cache
+
+    def genCacheInfoFromArgList(self, argList):
+        cacheInfo = {'type':REFRESH_CACHE}
+        for key, val in argList:
+            if val[0] in '"\'':
+                val = val[1:-1]
+
+            if key == 'timer':
+                key = 'interval'
+                val = self.genTimeInterval(val)
+                
+            cacheInfo[key] = val
+        return cacheInfo
+        
+    def genCheetahVar(self, nameChunks, plain=False):
+        if nameChunks[0][0] in self.setting('gettextTokens'):
+            self.addGetTextVar(nameChunks) 
+        if self.setting('useNameMapper') and not plain:
+            return self.genNameMapperVar(nameChunks)
+        else:
+            return self.genPlainVar(nameChunks)
+
+    def addGetTextVar(self, nameChunks):
+        """Output something that gettext can recognize.
+        
+        This is a harmless side effect necessary to make gettext work when it
+        is scanning compiled templates for strings marked for translation.
+
+        @@TR: another marginally more efficient approach would be to put the
+        output in a dummy method that is never called.
+        """
+        # @@TR: this should be in the compiler not here
+        self.addChunk("if False:")
+        self.indent()
+        self.addChunk(self.genPlainVar(nameChunks[:]))
+        self.dedent()
+
+    def genPlainVar(self, nameChunks):        
+        """Generate Python code for a Cheetah $var without using NameMapper
+        (Unified Dotted Notation with the SearchList).
+        """
+        nameChunks.reverse()
+        chunk = nameChunks.pop()
+        pythonCode = chunk[0] + chunk[2]
+        while nameChunks:
+            chunk = nameChunks.pop()
+            pythonCode = (pythonCode + '.' + chunk[0] + chunk[2])
+        return pythonCode
+
+    def genNameMapperVar(self, nameChunks):
+        """Generate valid Python code for a Cheetah $var, using NameMapper
+        (Unified Dotted Notation with the SearchList).
+
+        nameChunks = list of var subcomponents represented as tuples
+          [ (name,useAC,remainderOfExpr),
+          ]
+        where:
+          name = the dotted name base
+          useAC = where NameMapper should use autocalling on namemapperPart
+          remainderOfExpr = any arglist, index, or slice
+
+        If remainderOfExpr contains a call arglist (e.g. '(1234)') then useAC
+        is False, otherwise it defaults to True. It is overridden by the global
+        setting 'useAutocalling' if this setting is False.
+
+        EXAMPLE
+        ------------------------------------------------------------------------
+        if the raw Cheetah Var is
+          $a.b.c[1].d().x.y.z
+          
+        nameChunks is the list
+          [ ('a.b.c',True,'[1]'), # A
+            ('d',False,'()'),     # B
+            ('x.y.z',True,''),    # C
+          ]
+        
+        When this method is fed the list above it returns
+          VFN(VFN(VFFSL(SL, 'a.b.c',True)[1], 'd',False)(), 'x.y.z',True)
+        which can be represented as
+          VFN(B`, name=C[0], executeCallables=(useAC and C[1]))C[2]
+        where:
+          VFN = NameMapper.valueForName
+          VFFSL = NameMapper.valueFromFrameOrSearchList
+          VFSL = NameMapper.valueFromSearchList # optionally used instead of VFFSL
+          SL = self.searchList()
+          useAC = self.setting('useAutocalling') # True in this example
+          
+          A = ('a.b.c',True,'[1]')
+          B = ('d',False,'()')
+          C = ('x.y.z',True,'')
+
+          C` = VFN( VFN( VFFSL(SL, 'a.b.c',True)[1],
+                         'd',False)(),
+                    'x.y.z',True)
+             = VFN(B`, name='x.y.z', executeCallables=True)
+             
+          B` = VFN(A`, name=B[0], executeCallables=(useAC and B[1]))B[2]
+          A` = VFFSL(SL, name=A[0], executeCallables=(useAC and A[1]))A[2]
+
+
+        Note, if the compiler setting useStackFrames=False (default is true)
+        then
+          A` = VFSL([locals()]+SL+[globals(), __builtin__], name=A[0], executeCallables=(useAC and A[1]))A[2]
+        This option allows Cheetah to be used with Psyco, which doesn't support
+        stack frame introspection.
+        """
+        defaultUseAC = self.setting('useAutocalling')
+        useSearchList = self.setting('useSearchList')
+
+        nameChunks.reverse()
+        name, useAC, remainder = nameChunks.pop()
+        
+        if not useSearchList:
+            firstDotIdx = name.find('.')
+            if firstDotIdx != -1 and firstDotIdx < len(name):
+                beforeFirstDot, afterDot = name[:firstDotIdx], name[firstDotIdx+1:]
+                pythonCode = ('VFN(' + beforeFirstDot +
+                              ',"' + afterDot +
+                              '",' + repr(defaultUseAC and useAC) + ')'
+                              + remainder)
+            else:
+                pythonCode = name+remainder
+        elif self.setting('useStackFrames'):
+            pythonCode = ('VFFSL(SL,'
+                          '"'+ name + '",'
+                          + repr(defaultUseAC and useAC) + ')'
+                          + remainder)
+        else:
+            pythonCode = ('VFSL([locals()]+SL+[globals(), __builtin__],'
+                          '"'+ name + '",'
+                          + repr(defaultUseAC and useAC) + ')'
+                          + remainder)
+        ##    
+        while nameChunks:
+            name, useAC, remainder = nameChunks.pop()
+            pythonCode = ('VFN(' + pythonCode +
+                          ',"' + name +
+                          '",' + repr(defaultUseAC and useAC) + ')'
+                          + remainder)
+        return pythonCode
+    
+##################################################
+## METHOD COMPILERS
+
+class MethodCompiler(GenUtils):
+    def __init__(self, methodName, classCompiler,
+                 initialMethodComment=None,
+                 decorators=None):
+        self._settingsManager = classCompiler
+        self._classCompiler = classCompiler
+        self._moduleCompiler = classCompiler._moduleCompiler
+        self._methodName = methodName
+        self._initialMethodComment = initialMethodComment
+        self._setupState()
+        self._decorators = decorators or []
+
+    def setting(self, key):
+        return self._settingsManager.setting(key)
+
+    def _setupState(self):
+        self._indent = self.setting('indentationStep')
+        self._indentLev = self.setting('initialMethIndentLevel')
+        self._pendingStrConstChunks = []
+        self._methodSignature = None
+        self._methodDef = None
+        self._docStringLines = []
+        self._methodBodyChunks = []
+
+        self._cacheRegionsStack = []
+        self._callRegionsStack = []
+        self._captureRegionsStack = []
+        self._filterRegionsStack = []
+
+        self._isErrorCatcherOn = False
+
+        self._hasReturnStatement = False
+        self._isGenerator = False
+        
+        
+    def cleanupState(self):
+        """Called by the containing class compiler instance
+        """
+        pass
+
+    def methodName(self):
+        return self._methodName
+
+    def setMethodName(self, name):
+        self._methodName = name
+        
+    ## methods for managing indentation
+    
+    def indentation(self):
+        return self._indent * self._indentLev
+    
+    def indent(self):
+        self._indentLev +=1
+        
+    def dedent(self):
+        if self._indentLev:
+            self._indentLev -=1
+        else:
+            raise Error('Attempt to dedent when the indentLev is 0')
+
+    ## methods for final code wrapping
+
+    def methodDef(self):
+        if self._methodDef:
+            return self._methodDef
+        else:
+            return self.wrapCode()
+
+    __str__ = methodDef
+    __unicode__ = methodDef
+    
+    def wrapCode(self):
+        self.commitStrConst()
+        methodDefChunks = (
+            self.methodSignature(),
+            '\n',
+            self.docString(),
+            self.methodBody() )
+        methodDef = ''.join(methodDefChunks)
+        self._methodDef = methodDef
+        return methodDef
+
+    def methodSignature(self):
+        return self._indent + self._methodSignature + ':'
+
+    def setMethodSignature(self, signature):
+        self._methodSignature = signature
+
+    def methodBody(self):
+        return ''.join( self._methodBodyChunks )
+
+    def docString(self):
+        if not self._docStringLines:
+            return ''
+        
+        ind = self._indent*2        
+        docStr = (ind + '"""\n' + ind +
+                  ('\n' + ind).join([ln.replace('"""',"'''") for ln in self._docStringLines]) +
+                  '\n' + ind + '"""\n')
+        return  docStr
+
+    ## methods for adding code
+    def addMethDocString(self, line):
+        self._docStringLines.append(line.replace('%','%%'))
+       
+    def addChunk(self, chunk):
+        self.commitStrConst()
+        chunk = "\n" + self.indentation() + chunk
+        self._methodBodyChunks.append(chunk)
+
+    def appendToPrevChunk(self, appendage):
+        self._methodBodyChunks[-1] = self._methodBodyChunks[-1] + appendage
+
+    def addWriteChunk(self, chunk):
+        self.addChunk('write(' + chunk + ')')
+
+    def addFilteredChunk(self, chunk, filterArgs=None, rawExpr=None, lineCol=None):
+        if filterArgs is None:
+            filterArgs = ''
+        if self.setting('includeRawExprInFilterArgs') and rawExpr:
+            filterArgs += ', rawExpr=%s'%repr(rawExpr)
+
+        if self.setting('alwaysFilterNone'):
+            if rawExpr and rawExpr.find('\n')==-1 and rawExpr.find('\r')==-1:
+                self.addChunk("_v = %s # %r"%(chunk, rawExpr))
+                if lineCol:
+                    self.appendToPrevChunk(' on line %s, col %s'%lineCol)
+            else:
+                self.addChunk("_v = %s"%chunk)
+                
+            if self.setting('useFilters'):
+                self.addChunk("if _v is not None: write(_filter(_v%s))"%filterArgs)
+            else:
+                self.addChunk("if _v is not None: write(str(_v))")
+        else:
+            if self.setting('useFilters'):
+                self.addChunk("write(_filter(%s%s))"%(chunk,filterArgs))
+            else:
+                self.addChunk("write(str(%s))"%chunk)
+
+    def _appendToPrevStrConst(self, strConst):
+        if self._pendingStrConstChunks:
+            self._pendingStrConstChunks.append(strConst)
+        else:
+            self._pendingStrConstChunks = [strConst]
+
+    def _unescapeCheetahVars(self, theString):
+        """Unescape any escaped Cheetah \$vars in the string.
+        """
+        
+        token = self.setting('cheetahVarStartToken')
+        return theString.replace('\\' + token, token)
+
+    def _unescapeDirectives(self, theString):
+        """Unescape any escaped Cheetah \$vars in the string.
+        """
+        
+        token = self.setting('directiveStartToken')
+        return theString.replace('\\' + token, token)
+        
+    def commitStrConst(self):
+        """Add the code for outputting the pending strConst without chopping off
+        any whitespace from it.
+        """
+        if self._pendingStrConstChunks:
+            strConst = self._unescapeCheetahVars(''.join(self._pendingStrConstChunks))
+            strConst = self._unescapeDirectives(strConst)
+            self._pendingStrConstChunks = []
+            if not strConst:
+                return
+            else:
+                reprstr = repr(strConst).replace('\\012','\n')
+                i = 0
+                out = []
+                if reprstr.startswith('u'):
+                    i = 1
+                    out = ['u']
+                body = escapedNewlineRE.sub('\n', reprstr[i+1:-1])
+                
+                if reprstr[i]=="'":
+                    out.append("'''")
+                    out.append(body)
+                    out.append("'''")
+                else:
+                    out.append('"""')
+                    out.append(body)
+                    out.append('"""')
+                self.addWriteChunk(''.join(out))
+
+    def handleWSBeforeDirective(self):
+        """Truncate the pending strCont to the beginning of the current line.
+        """
+        if self._pendingStrConstChunks:
+            src = self._pendingStrConstChunks[-1]
+            BOL = max(src.rfind('\n')+1, src.rfind('\r')+1, 0)
+            if BOL < len(src):
+                self._pendingStrConstChunks[-1] = src[:BOL]
+
+
+
+    def isErrorCatcherOn(self):
+        return self._isErrorCatcherOn
+    
+    def turnErrorCatcherOn(self):
+        self._isErrorCatcherOn = True
+
+    def turnErrorCatcherOff(self):
+        self._isErrorCatcherOn = False
+            
+    # @@TR: consider merging the next two methods into one
+    def addStrConst(self, strConst):
+        self._appendToPrevStrConst(strConst)
+
+    def addRawText(self, text):
+        self.addStrConst(text)
+        
+    def addMethComment(self, comm):
+        offSet = self.setting('commentOffset')
+        self.addChunk('#' + ' '*offSet + comm)
+
+    def addPlaceholder(self, expr, filterArgs, rawPlaceholder,
+                       cacheTokenParts, lineCol,
+                       silentMode=False):
+        cacheInfo = self.genCacheInfo(cacheTokenParts)
+        if cacheInfo:
+            cacheInfo['ID'] = repr(rawPlaceholder)[1:-1]
+            self.startCacheRegion(cacheInfo, lineCol, rawPlaceholder=rawPlaceholder)
+
+        if self.isErrorCatcherOn():
+            methodName = self._classCompiler.addErrorCatcherCall(
+                expr, rawCode=rawPlaceholder, lineCol=lineCol)
+            expr = 'self.' + methodName + '(localsDict=locals())' 
+
+        if silentMode:
+            self.addChunk('try:')
+            self.indent()            
+            self.addFilteredChunk(expr, filterArgs, rawPlaceholder, lineCol=lineCol)
+            self.dedent()
+            self.addChunk('except NotFound: pass')            
+        else:
+            self.addFilteredChunk(expr, filterArgs, rawPlaceholder, lineCol=lineCol)
+
+        if self.setting('outputRowColComments'):
+            self.appendToPrevChunk(' # from line %s, col %s' % lineCol + '.')
+        if cacheInfo:
+            self.endCacheRegion()
+
+    def addSilent(self, expr):
+        self.addChunk( expr )
+
+    def addEcho(self, expr, rawExpr=None):
+        self.addFilteredChunk(expr, rawExpr=rawExpr)
+        
+    def addSet(self, expr, exprComponents, setStyle):
+        if setStyle is SET_GLOBAL:
+            (LVALUE, OP, RVALUE) = (exprComponents.LVALUE,
+                                    exprComponents.OP,
+                                    exprComponents.RVALUE)
+            # we need to split the LVALUE to deal with globalSetVars
+            splitPos1 = LVALUE.find('.')
+            splitPos2 = LVALUE.find('[')
+            if splitPos1 > 0 and splitPos2==-1:
+                splitPos = splitPos1
+            elif splitPos1 > 0 and splitPos1 < max(splitPos2,0):
+                splitPos = splitPos1
+            else:
+                splitPos = splitPos2
+
+            if splitPos >0:
+                primary = LVALUE[:splitPos]
+                secondary = LVALUE[splitPos:]
+            else:
+                primary = LVALUE
+                secondary = ''            
+            LVALUE = 'self._CHEETAH__globalSetVars["' + primary + '"]' + secondary
+            expr = LVALUE + ' ' + OP + ' ' + RVALUE.strip()
+
+        if setStyle is SET_MODULE:
+            self._moduleCompiler.addModuleGlobal(expr)
+        else:
+            self.addChunk(expr)
+
+    def addInclude(self, sourceExpr, includeFrom, isRaw):
+        self.addChunk('self._handleCheetahInclude(' + sourceExpr +
+                           ', trans=trans, ' +
+                           'includeFrom="' + includeFrom + '", raw=' +
+                           repr(isRaw) + ')')
+
+    def addWhile(self, expr, lineCol=None):
+        self.addIndentingDirective(expr, lineCol=lineCol)
+        
+    def addFor(self, expr, lineCol=None):
+        self.addIndentingDirective(expr, lineCol=lineCol)
+
+    def addRepeat(self, expr, lineCol=None):
+        #the _repeatCount stuff here allows nesting of #repeat directives        
+        self._repeatCount = getattr(self, "_repeatCount", -1) + 1
+        self.addFor('for __i%s in range(%s)' % (self._repeatCount,expr), lineCol=lineCol)
+
+    def addIndentingDirective(self, expr, lineCol=None):
+        if expr and not expr[-1] == ':':
+            expr = expr  + ':'
+        self.addChunk( expr )
+        if lineCol:
+            self.appendToPrevChunk(' # generated from line %s, col %s'%lineCol )
+        self.indent()
+
+    def addReIndentingDirective(self, expr, dedent=True, lineCol=None):
+        self.commitStrConst()
+        if dedent:
+            self.dedent()
+        if not expr[-1] == ':':
+            expr = expr  + ':'
+            
+        self.addChunk( expr )
+        if lineCol:
+            self.appendToPrevChunk(' # generated from line %s, col %s'%lineCol )
+        self.indent()
+
+    def addIf(self, expr, lineCol=None):
+        """For a full #if ... #end if directive
+        """
+        self.addIndentingDirective(expr, lineCol=lineCol)
+
+    def addOneLineIf(self, expr, lineCol=None):
+        """For a full #if ... #end if directive
+        """
+        self.addIndentingDirective(expr, lineCol=lineCol)
+
+    def addTernaryExpr(self, conditionExpr, trueExpr, falseExpr, lineCol=None):
+        """For a single-lie #if ... then .... else ... directive
+        <condition> then <trueExpr> else <falseExpr>
+        """
+        self.addIndentingDirective(conditionExpr, lineCol=lineCol)            
+        self.addFilteredChunk(trueExpr)
+        self.dedent()
+        self.addIndentingDirective('else')            
+        self.addFilteredChunk(falseExpr)
+        self.dedent()
+
+    def addElse(self, expr, dedent=True, lineCol=None):
+        expr = re.sub(r'else[ \f\t]+if','elif', expr)
+        self.addReIndentingDirective(expr, dedent=dedent, lineCol=lineCol)
+
+    def addElif(self, expr, dedent=True, lineCol=None):
+        self.addElse(expr, dedent=dedent, lineCol=lineCol)
+        
+    def addUnless(self, expr, lineCol=None):
+        self.addIf('if not (' + expr + ')')
+
+    def addClosure(self, functionName, argsList, parserComment):
+        argStringChunks = []
+        for arg in argsList:
+            chunk = arg[0]
+            if not arg[1] == None:
+                chunk += '=' + arg[1]
+            argStringChunks.append(chunk)
+        signature = "def " + functionName + "(" + ','.join(argStringChunks) + "):"
+        self.addIndentingDirective(signature)
+        self.addChunk('#'+parserComment)
+
+    def addTry(self, expr, lineCol=None):
+        self.addIndentingDirective(expr, lineCol=lineCol)
+        
+    def addExcept(self, expr, dedent=True, lineCol=None):
+        self.addReIndentingDirective(expr, dedent=dedent, lineCol=lineCol)
+        
+    def addFinally(self, expr, dedent=True, lineCol=None):
+        self.addReIndentingDirective(expr, dedent=dedent, lineCol=lineCol)
+            
+    def addReturn(self, expr):
+        assert not self._isGenerator
+        self.addChunk(expr)
+        self._hasReturnStatement = True
+
+    def addYield(self, expr):
+        assert not self._hasReturnStatement
+        self._isGenerator = True
+        if expr.replace('yield','').strip():
+            self.addChunk(expr)
+        else:
+            self.addChunk('if _dummyTrans:')
+            self.indent()
+            self.addChunk('yield trans.response().getvalue()')
+            self.addChunk('trans = DummyTransaction()')
+            self.addChunk('write = trans.response().write')
+            self.dedent()
+            self.addChunk('else:')
+            self.indent()
+            self.addChunk(
+                'raise TypeError("This method cannot be called with a trans arg")')
+            self.dedent()
+            
+
+    def addPass(self, expr):
+        self.addChunk(expr)
+
+    def addDel(self, expr):
+        self.addChunk(expr)
+
+    def addAssert(self, expr):
+        self.addChunk(expr)
+
+    def addRaise(self, expr):
+        self.addChunk(expr)
+
+    def addBreak(self, expr):
+        self.addChunk(expr)
+
+    def addContinue(self, expr):
+        self.addChunk(expr)
+
+    def addPSP(self, PSP):
+        self.commitStrConst()
+        autoIndent = False
+        if PSP[0] == '=':
+            PSP = PSP[1:]
+            if PSP:
+                self.addWriteChunk('_filter(' + PSP + ')')
+            return
+                    
+        elif PSP.lower() == 'end':
+            self.dedent()
+            return
+        elif PSP[-1] == '$':
+            autoIndent = True
+            PSP = PSP[:-1]
+        elif PSP[-1] == ':':
+            autoIndent = True
+            
+        for line in PSP.splitlines():
+            self.addChunk(line)
+            
+        if autoIndent:
+            self.indent()
+    
+    def nextCacheID(self):
+        return ('_'+str(random.randrange(100, 999)) 
+                + str(random.randrange(10000, 99999)))
+        
+    def startCacheRegion(self, cacheInfo, lineCol, rawPlaceholder=None):
+
+        # @@TR: we should add some runtime logging to this
+        
+        ID = self.nextCacheID()
+        interval = cacheInfo.get('interval',None)
+        test = cacheInfo.get('test',None)
+        customID = cacheInfo.get('id',None)
+        if customID:
+            ID = customID
+        varyBy = cacheInfo.get('varyBy', repr(ID))
+        self._cacheRegionsStack.append(ID) # attrib of current methodCompiler
+
+        # @@TR: add this to a special class var as well
+        self.addChunk('')
+
+        self.addChunk('## START CACHE REGION: ID='+ID+
+                      '. line %s, col %s'%lineCol + ' in the source.')
+        
+        self.addChunk('_RECACHE_%(ID)s = False'%locals())
+        self.addChunk('_cacheRegion_%(ID)s = self.getCacheRegion(regionID='%locals()
+                      + repr(ID)
+                      + ', cacheInfo=%r'%cacheInfo
+                      + ')')
+        self.addChunk('if _cacheRegion_%(ID)s.isNew():'%locals())
+        self.indent()
+        self.addChunk('_RECACHE_%(ID)s = True'%locals())
+        self.dedent()
+        
+        self.addChunk('_cacheItem_%(ID)s = _cacheRegion_%(ID)s.getCacheItem('%locals()
+                      +varyBy+')')
+
+        self.addChunk('if _cacheItem_%(ID)s.hasExpired():'%locals())
+        self.indent()
+        self.addChunk('_RECACHE_%(ID)s = True'%locals())
+        self.dedent()
+            
+        if test:
+            self.addChunk('if ' + test + ':')
+            self.indent()
+            self.addChunk('_RECACHE_%(ID)s = True'%locals())
+            self.dedent()
+
+        self.addChunk('if (not _RECACHE_%(ID)s) and _cacheItem_%(ID)s.getRefreshTime():'%locals())
+        self.indent()
+        #self.addChunk('print "DEBUG"+"-"*50')
+        self.addChunk('try:')
+        self.indent()
+        self.addChunk('_output = _cacheItem_%(ID)s.renderOutput()'%locals())        
+        self.dedent()                
+        self.addChunk('except KeyError:')
+        self.indent()
+        self.addChunk('_RECACHE_%(ID)s = True'%locals())
+        #self.addChunk('print "DEBUG"+"*"*50')
+        self.dedent()                
+        self.addChunk('else:')
+        self.indent()
+        self.addWriteChunk('_output')
+        self.addChunk('del _output')
+        self.dedent()                
+
+        self.dedent()                
+
+        self.addChunk('if _RECACHE_%(ID)s or not _cacheItem_%(ID)s.getRefreshTime():'%locals())
+        self.indent()
+        self.addChunk('_orig_trans%(ID)s = trans'%locals())
+        self.addChunk('trans = _cacheCollector_%(ID)s = DummyTransaction()'%locals())
+        self.addChunk('write = _cacheCollector_%(ID)s.response().write'%locals())
+        if interval:
+            self.addChunk(("_cacheItem_%(ID)s.setExpiryTime(currentTime() +"%locals())
+                          + str(interval) + ")")
+        
+    def endCacheRegion(self):
+        ID = self._cacheRegionsStack.pop()
+        self.addChunk('trans = _orig_trans%(ID)s'%locals())
+        self.addChunk('write = trans.response().write')
+        self.addChunk('_cacheData = _cacheCollector_%(ID)s.response().getvalue()'%locals())
+        self.addChunk('_cacheItem_%(ID)s.setData(_cacheData)'%locals())
+        self.addWriteChunk('_cacheData')
+        self.addChunk('del _cacheData')        
+        self.addChunk('del _cacheCollector_%(ID)s'%locals())
+        self.addChunk('del _orig_trans%(ID)s'%locals())
+        self.dedent()
+        self.addChunk('## END CACHE REGION: '+ID)
+        self.addChunk('')
+
+    def nextCallRegionID(self):
+        return self.nextCacheID()
+
+    def startCallRegion(self, functionName, args, lineCol, regionTitle='CALL'):
+        class CallDetails(object):
+            pass
+        callDetails = CallDetails()
+        callDetails.ID = ID = self.nextCallRegionID()
+        callDetails.functionName = functionName
+        callDetails.args = args
+        callDetails.lineCol = lineCol
+        callDetails.usesKeywordArgs = False
+        self._callRegionsStack.append((ID, callDetails)) # attrib of current methodCompiler
+
+        self.addChunk('## START %(regionTitle)s REGION: '%locals()
+                      +ID
+                      +' of '+functionName
+                      +' at line %s, col %s'%lineCol + ' in the source.')
+        self.addChunk('_orig_trans%(ID)s = trans'%locals())
+        self.addChunk('_wasBuffering%(ID)s = self._CHEETAH__isBuffering'%locals())
+        self.addChunk('self._CHEETAH__isBuffering = True')
+        self.addChunk('trans = _callCollector%(ID)s = DummyTransaction()'%locals())
+        self.addChunk('write = _callCollector%(ID)s.response().write'%locals())
+
+    def setCallArg(self, argName, lineCol):
+        ID, callDetails = self._callRegionsStack[-1]
+        argName = str(argName)
+        if callDetails.usesKeywordArgs:
+            self._endCallArg()
+        else:
+            callDetails.usesKeywordArgs = True
+            self.addChunk('_callKws%(ID)s = {}'%locals())
+            self.addChunk('_currentCallArgname%(ID)s = %(argName)r'%locals())
+        callDetails.currentArgname = argName
+        
+    def _endCallArg(self):
+        ID, callDetails = self._callRegionsStack[-1]
+        currCallArg = callDetails.currentArgname
+        self.addChunk(('_callKws%(ID)s[%(currCallArg)r] ='
+                       ' _callCollector%(ID)s.response().getvalue()')%locals())
+        self.addChunk('del _callCollector%(ID)s'%locals())
+        self.addChunk('trans = _callCollector%(ID)s = DummyTransaction()'%locals())
+        self.addChunk('write = _callCollector%(ID)s.response().write'%locals())
+    
+    def endCallRegion(self, regionTitle='CALL'):
+        ID, callDetails = self._callRegionsStack[-1]
+        functionName, initialKwArgs, lineCol = (
+            callDetails.functionName, callDetails.args, callDetails.lineCol)
+
+        def reset(ID=ID):
+            self.addChunk('trans = _orig_trans%(ID)s'%locals())
+            self.addChunk('write = trans.response().write')
+            self.addChunk('self._CHEETAH__isBuffering = _wasBuffering%(ID)s '%locals())
+            self.addChunk('del _wasBuffering%(ID)s'%locals())
+            self.addChunk('del _orig_trans%(ID)s'%locals())
+
+        if not callDetails.usesKeywordArgs:
+            reset()
+            self.addChunk('_callArgVal%(ID)s = _callCollector%(ID)s.response().getvalue()'%locals())
+            self.addChunk('del _callCollector%(ID)s'%locals())
+            if initialKwArgs:
+                initialKwArgs = ', '+initialKwArgs           
+            self.addFilteredChunk('%(functionName)s(_callArgVal%(ID)s%(initialKwArgs)s)'%locals())
+            self.addChunk('del _callArgVal%(ID)s'%locals())
+        else:
+            if initialKwArgs:
+                initialKwArgs = initialKwArgs+', '
+            self._endCallArg()
+            reset()
+            self.addFilteredChunk('%(functionName)s(%(initialKwArgs)s**_callKws%(ID)s)'%locals())
+            self.addChunk('del _callKws%(ID)s'%locals())
+        self.addChunk('## END %(regionTitle)s REGION: '%locals()
+                      +ID
+                      +' of '+functionName
+                      +' at line %s, col %s'%lineCol + ' in the source.')        
+        self.addChunk('')
+        self._callRegionsStack.pop() # attrib of current methodCompiler
+
+    def nextCaptureRegionID(self):
+        return self.nextCacheID()
+
+    def startCaptureRegion(self, assignTo, lineCol):
+        class CaptureDetails: pass
+        captureDetails = CaptureDetails()
+        captureDetails.ID = ID = self.nextCaptureRegionID()
+        captureDetails.assignTo = assignTo
+        captureDetails.lineCol = lineCol
+        
+        self._captureRegionsStack.append((ID,captureDetails)) # attrib of current methodCompiler
+        self.addChunk('## START CAPTURE REGION: '+ID
+                      +' '+assignTo
+                      +' at line %s, col %s'%lineCol + ' in the source.')
+        self.addChunk('_orig_trans%(ID)s = trans'%locals())
+        self.addChunk('_wasBuffering%(ID)s = self._CHEETAH__isBuffering'%locals())
+        self.addChunk('self._CHEETAH__isBuffering = True')
+        self.addChunk('trans = _captureCollector%(ID)s = DummyTransaction()'%locals())
+        self.addChunk('write = _captureCollector%(ID)s.response().write'%locals())
+
+    def endCaptureRegion(self):
+        ID, captureDetails = self._captureRegionsStack.pop()
+        assignTo, lineCol = (captureDetails.assignTo, captureDetails.lineCol)
+        self.addChunk('trans = _orig_trans%(ID)s'%locals())
+        self.addChunk('write = trans.response().write')
+        self.addChunk('self._CHEETAH__isBuffering = _wasBuffering%(ID)s '%locals())
+        self.addChunk('%(assignTo)s = _captureCollector%(ID)s.response().getvalue()'%locals())
+        self.addChunk('del _orig_trans%(ID)s'%locals())
+        self.addChunk('del _captureCollector%(ID)s'%locals())
+        self.addChunk('del _wasBuffering%(ID)s'%locals())
+        
+    def setErrorCatcher(self, errorCatcherName):
+        self.turnErrorCatcherOn()        
+
+        self.addChunk('if self._CHEETAH__errorCatchers.has_key("' + errorCatcherName + '"):')
+        self.indent()
+        self.addChunk('self._CHEETAH__errorCatcher = self._CHEETAH__errorCatchers["' +
+            errorCatcherName + '"]')
+        self.dedent()
+        self.addChunk('else:')
+        self.indent()
+        self.addChunk('self._CHEETAH__errorCatcher = self._CHEETAH__errorCatchers["'
+                      + errorCatcherName + '"] = ErrorCatchers.'
+                      + errorCatcherName + '(self)'
+                      )
+        self.dedent()
+
+    def nextFilterRegionID(self):
+        return self.nextCacheID()
+
+    def setTransform(self, transformer, isKlass):
+        self.addChunk('trans = TransformerTransaction()')
+        self.addChunk('trans._response = trans.response()')
+        self.addChunk('trans._response._filter = %s' % transformer)
+        self.addChunk('write = trans._response.write')
+        
+    def setFilter(self, theFilter, isKlass):
+        class FilterDetails: 
+            pass
+        filterDetails = FilterDetails()
+        filterDetails.ID = ID = self.nextFilterRegionID()
+        filterDetails.theFilter = theFilter
+        filterDetails.isKlass = isKlass
+        self._filterRegionsStack.append((ID, filterDetails)) # attrib of current methodCompiler
+
+        self.addChunk('_orig_filter%(ID)s = _filter'%locals())
+        if isKlass:
+            self.addChunk('_filter = self._CHEETAH__currentFilter = ' + theFilter.strip() +
+                          '(self).filter')
+        else:
+            if theFilter.lower() == 'none':
+                self.addChunk('_filter = self._CHEETAH__initialFilter')
+            else:
+                # is string representing the name of a builtin filter
+                self.addChunk('filterName = ' + repr(theFilter))
+                self.addChunk('if self._CHEETAH__filters.has_key("' + theFilter + '"):')
+                self.indent()
+                self.addChunk('_filter = self._CHEETAH__currentFilter = self._CHEETAH__filters[filterName]')
+                self.dedent()
+                self.addChunk('else:')
+                self.indent()
+                self.addChunk('_filter = self._CHEETAH__currentFilter'
+                              +' = \\\n\t\t\tself._CHEETAH__filters[filterName] = '
+                              + 'getattr(self._CHEETAH__filtersLib, filterName)(self).filter')
+                self.dedent()
+                
+    def closeFilterBlock(self):
+        ID, filterDetails = self._filterRegionsStack.pop()
+        #self.addChunk('_filter = self._CHEETAH__initialFilter')
+        #self.addChunk('_filter = _orig_filter%(ID)s'%locals())
+        self.addChunk('_filter = self._CHEETAH__currentFilter = _orig_filter%(ID)s'%locals())
+
+class AutoMethodCompiler(MethodCompiler):
+
+    def _setupState(self):
+        MethodCompiler._setupState(self)
+        self._argStringList = [ ("self",None) ]
+        self._streamingEnabled = True
+        self._isClassMethod = None
+        self._isStaticMethod = None
+
+    def _useKWsDictArgForPassingTrans(self):
+        alreadyHasTransArg = [argname for argname,defval in self._argStringList
+                              if argname=='trans']
+        return (self.methodName()!='respond'
+                and not alreadyHasTransArg
+                and self.setting('useKWsDictArgForPassingTrans'))
+
+    def isClassMethod(self):
+        if self._isClassMethod is None:
+            self._isClassMethod = '@classmethod' in self._decorators
+        return self._isClassMethod
+
+    def isStaticMethod(self):
+        if self._isStaticMethod is None:
+            self._isStaticMethod = '@staticmethod' in self._decorators
+        return self._isStaticMethod
+    
+    def cleanupState(self):
+        MethodCompiler.cleanupState(self)
+        self.commitStrConst()
+        if self._cacheRegionsStack:
+            self.endCacheRegion()
+        if self._callRegionsStack:
+            self.endCallRegion()
+            
+        if self._streamingEnabled:
+            kwargsName = None
+            positionalArgsListName = None
+            for argname,defval in self._argStringList:
+                if argname.strip().startswith('**'):
+                    kwargsName = argname.strip().replace('**','')
+                    break
+                elif argname.strip().startswith('*'):
+                    positionalArgsListName = argname.strip().replace('*','')
+                    
+            if not kwargsName and self._useKWsDictArgForPassingTrans():
+                kwargsName = 'KWS'
+                self.addMethArg('**KWS', None)
+            self._kwargsName = kwargsName
+
+            if not self._useKWsDictArgForPassingTrans():
+                if not kwargsName and not positionalArgsListName:
+                    self.addMethArg('trans', 'None')       
+                else:
+                    self._streamingEnabled = False
+                
+        self._indentLev = self.setting('initialMethIndentLevel')
+        mainBodyChunks = self._methodBodyChunks
+        self._methodBodyChunks = []
+        self._addAutoSetupCode()
+        self._methodBodyChunks.extend(mainBodyChunks)
+        self._addAutoCleanupCode()
+        
+    def _addAutoSetupCode(self):
+        if self._initialMethodComment:
+            self.addChunk(self._initialMethodComment)
+            
+        if self._streamingEnabled and not self.isClassMethod() and not self.isStaticMethod():
+            if self._useKWsDictArgForPassingTrans() and self._kwargsName:
+                self.addChunk('trans = %s.get("trans")'%self._kwargsName)            
+            self.addChunk('if (not trans and not self._CHEETAH__isBuffering'
+                          ' and not callable(self.transaction)):')
+            self.indent()
+            self.addChunk('trans = self.transaction'
+                          ' # is None unless self.awake() was called')
+            self.dedent()
+            self.addChunk('if not trans:')
+            self.indent()
+            self.addChunk('trans = DummyTransaction()')
+            if self.setting('autoAssignDummyTransactionToSelf'):
+                self.addChunk('self.transaction = trans')            
+            self.addChunk('_dummyTrans = True')
+            self.dedent()
+            self.addChunk('else: _dummyTrans = False')
+        else:
+            self.addChunk('trans = DummyTransaction()')
+            self.addChunk('_dummyTrans = True')
+        self.addChunk('write = trans.response().write')
+        if self.setting('useNameMapper'):
+            argNames = [arg[0] for arg in self._argStringList]
+            allowSearchListAsMethArg = self.setting('allowSearchListAsMethArg')            
+            if allowSearchListAsMethArg and 'SL' in argNames:
+                pass
+            elif allowSearchListAsMethArg and 'searchList' in argNames:
+                self.addChunk('SL = searchList')
+            elif not self.isClassMethod() and not self.isStaticMethod():
+                self.addChunk('SL = self._CHEETAH__searchList')                
+            else:
+                self.addChunk('SL = [KWS]')
+        if self.setting('useFilters'):
+            if self.isClassMethod() or self.isStaticMethod():
+                self.addChunk('_filter = lambda x, **kwargs: unicode(x)')
+            else:
+                self.addChunk('_filter = self._CHEETAH__currentFilter')
+        self.addChunk('')
+        self.addChunk("#" *40)
+        self.addChunk('## START - generated method body')
+        self.addChunk('')
+
+    def _addAutoCleanupCode(self):
+        self.addChunk('')
+        self.addChunk("#" *40)
+        self.addChunk('## END - generated method body')
+        self.addChunk('')
+
+        if not self._isGenerator:
+            self.addStop()
+        self.addChunk('')
+        
+    def addStop(self, expr=None):
+        self.addChunk('return _dummyTrans and trans.response().getvalue() or ""')
+
+    def addMethArg(self, name, defVal=None):
+        self._argStringList.append( (name,defVal) )
+        
+    def methodSignature(self):
+        argStringChunks = []
+        for arg in self._argStringList:
+            chunk = arg[0]
+            if chunk == 'self' and self.isClassMethod():
+                chunk = 'cls'
+            if chunk == 'self' and self.isStaticMethod():
+                # Skip the "self" method for @staticmethod decorators
+                continue
+            if not arg[1] == None:
+                chunk += '=' + arg[1]
+            argStringChunks.append(chunk)
+        argString = (', ').join(argStringChunks)
+
+        output = []
+        if self._decorators:
+            output.append(''.join([self._indent + decorator + '\n'
+                                   for decorator in self._decorators]))
+        output.append(self._indent + "def "
+                      + self.methodName() + "(" +
+                      argString + "):\n\n")
+        return ''.join(output)
+
+
+##################################################
+## CLASS COMPILERS
+
+_initMethod_initCheetah = """\
+if not self._CHEETAH__instanceInitialized:
+    cheetahKWArgs = {}
+    allowedKWs = 'searchList namespaces filter filtersLib errorCatcher'.split()
+    for k,v in KWs.items():
+        if k in allowedKWs: cheetahKWArgs[k] = v
+    self._initCheetahInstance(**cheetahKWArgs)
+""".replace('\n','\n'+' '*8)
+
+class ClassCompiler(GenUtils):
+    methodCompilerClass = AutoMethodCompiler
+    methodCompilerClassForInit = MethodCompiler
+        
+    def __init__(self, className, mainMethodName='respond',
+                 moduleCompiler=None,
+                 fileName=None,
+                 settingsManager=None):
+
+        self._settingsManager = settingsManager
+        self._fileName = fileName
+        self._className = className
+        self._moduleCompiler = moduleCompiler
+        self._mainMethodName = mainMethodName
+        self._setupState()
+        methodCompiler = self._spawnMethodCompiler(
+            mainMethodName,
+            initialMethodComment='## CHEETAH: main method generated for this template')
+
+        self._setActiveMethodCompiler(methodCompiler)
+        if fileName and self.setting('monitorSrcFile'):
+            self._addSourceFileMonitoring(fileName)
+
+    def setting(self, key):
+        return self._settingsManager.setting(key)
+
+    def __getattr__(self, name):
+        """Provide access to the methods and attributes of the MethodCompiler
+        at the top of the activeMethods stack: one-way namespace sharing
+
+        
+        WARNING: Use .setMethods to assign the attributes of the MethodCompiler
+        from the methods of this class!!! or you will be assigning to attributes
+        of this object instead."""
+        
+        if self.__dict__.has_key(name):
+            return self.__dict__[name]
+        elif hasattr(self.__class__, name):
+            return getattr(self.__class__, name)
+        elif self._activeMethodsList and hasattr(self._activeMethodsList[-1], name):
+            return getattr(self._activeMethodsList[-1], name)
+        else:
+            raise AttributeError, name
+
+    def _setupState(self):
+        self._classDef = None
+        self._decoratorsForNextMethod = []
+        self._activeMethodsList = []        # stack while parsing/generating
+        self._finishedMethodsList = []      # store by order
+        self._methodsIndex = {}      # store by name
+        self._baseClass = 'Template'
+        self._classDocStringLines = []
+        # printed after methods in the gen class def:
+        self._generatedAttribs = ['_CHEETAH__instanceInitialized = False']
+        self._generatedAttribs.append('_CHEETAH_version = __CHEETAH_version__')
+        self._generatedAttribs.append(
+            '_CHEETAH_versionTuple = __CHEETAH_versionTuple__')
+
+        if self.setting('addTimestampsToCompilerOutput'):
+            self._generatedAttribs.append('_CHEETAH_genTime = __CHEETAH_genTime__')
+            self._generatedAttribs.append('_CHEETAH_genTimestamp = __CHEETAH_genTimestamp__')
+
+        self._generatedAttribs.append('_CHEETAH_src = __CHEETAH_src__')
+        self._generatedAttribs.append(
+            '_CHEETAH_srcLastModified = __CHEETAH_srcLastModified__')
+
+        if self.setting('templateMetaclass'):
+            self._generatedAttribs.append('__metaclass__ = '+self.setting('templateMetaclass'))
+        self._initMethChunks = []        
+        self._blockMetaData = {}
+        self._errorCatcherCount = 0
+        self._placeholderToErrorCatcherMap = {}
+
+    def cleanupState(self):
+        while self._activeMethodsList:
+            methCompiler = self._popActiveMethodCompiler()
+            self._swallowMethodCompiler(methCompiler)
+        self._setupInitMethod()
+        if self._mainMethodName == 'respond':
+            if self.setting('setup__str__method'):
+                self._generatedAttribs.append('def __str__(self): return self.respond()')
+        self.addAttribute('_mainCheetahMethod_for_' + self._className +
+                           '= ' + repr(self._mainMethodName) )
+
+    def _setupInitMethod(self):
+        __init__ = self._spawnMethodCompiler('__init__',
+                                             klass=self.methodCompilerClassForInit)
+        __init__.setMethodSignature("def __init__(self, *args, **KWs)")
+        __init__.addChunk('super(%s, self).__init__(*args, **KWs)' % self._className)
+        __init__.addChunk(_initMethod_initCheetah % {'className' : self._className})
+        for chunk in self._initMethChunks:
+            __init__.addChunk(chunk)
+        __init__.cleanupState()
+        self._swallowMethodCompiler(__init__, pos=0)
+
+    def _addSourceFileMonitoring(self, fileName):
+        # @@TR: this stuff needs auditing for Cheetah 2.0       
+        # the first bit is added to init
+        self.addChunkToInit('self._filePath = ' + repr(fileName))
+        self.addChunkToInit('self._fileMtime = ' + str(getmtime(fileName)) )
+
+        # the rest is added to the main output method of the class ('mainMethod')
+        self.addChunk('if exists(self._filePath) and ' +
+                      'getmtime(self._filePath) > self._fileMtime:')
+        self.indent()
+        self.addChunk('self._compile(file=self._filePath, moduleName='+self._className + ')')
+        self.addChunk(
+            'write(getattr(self, self._mainCheetahMethod_for_' + self._className +
+            ')(trans=trans))')            
+        self.addStop()
+        self.dedent()
+    
+    def setClassName(self, name):
+        self._className = name
+
+    def className(self):
+        return self._className
+
+    def setBaseClass(self, baseClassName):
+        self._baseClass = baseClassName
+               
+    def setMainMethodName(self, methodName):
+        if methodName == self._mainMethodName:
+            return
+        ## change the name in the methodCompiler and add new reference
+        mainMethod = self._methodsIndex[self._mainMethodName]
+        mainMethod.setMethodName(methodName)
+        self._methodsIndex[methodName] = mainMethod
+
+        ## make sure that fileUpdate code still works properly:
+        chunkToChange = ('write(self.' + self._mainMethodName + '(trans=trans))')
+        chunks = mainMethod._methodBodyChunks
+        if chunkToChange in chunks:
+            for i in range(len(chunks)):
+                if chunks[i] == chunkToChange:
+                    chunks[i] = ('write(self.' + methodName + '(trans=trans))')
+        ## get rid of the old reference and update self._mainMethodName                   
+        del self._methodsIndex[self._mainMethodName]
+        self._mainMethodName = methodName
+
+    def setMainMethodArgs(self, argsList):
+        mainMethodCompiler = self._methodsIndex[self._mainMethodName]
+        for argName, defVal in argsList:
+            mainMethodCompiler.addMethArg(argName, defVal)
+        
+          
+    def _spawnMethodCompiler(self, methodName, klass=None, 
+                             initialMethodComment=None):
+        if klass is None:
+            klass = self.methodCompilerClass
+
+        decorators = self._decoratorsForNextMethod or []
+        self._decoratorsForNextMethod = []
+        methodCompiler = klass(methodName, classCompiler=self,
+                               decorators=decorators,
+                               initialMethodComment=initialMethodComment)
+        self._methodsIndex[methodName] = methodCompiler
+        return methodCompiler
+
+    def _setActiveMethodCompiler(self, methodCompiler):
+        self._activeMethodsList.append(methodCompiler)
+
+    def _getActiveMethodCompiler(self):
+        return self._activeMethodsList[-1]
+
+    def _popActiveMethodCompiler(self):
+        return self._activeMethodsList.pop()
+
+    def _swallowMethodCompiler(self, methodCompiler, pos=None):
+        methodCompiler.cleanupState()
+        if pos==None:
+            self._finishedMethodsList.append( methodCompiler )
+        else:
+            self._finishedMethodsList.insert(pos, methodCompiler)
+        return methodCompiler
+
+    def startMethodDef(self, methodName, argsList, parserComment):
+        methodCompiler = self._spawnMethodCompiler(
+            methodName, initialMethodComment=parserComment)
+        self._setActiveMethodCompiler(methodCompiler)        
+        for argName, defVal in argsList:
+            methodCompiler.addMethArg(argName, defVal)
+        
+    def _finishedMethods(self):
+        return self._finishedMethodsList
+
+    def addDecorator(self, decoratorExpr):
+        """Set the decorator to be used with the next method in the source.
+
+        See _spawnMethodCompiler() and MethodCompiler for the details of how
+        this is used.
+        """
+        self._decoratorsForNextMethod.append(decoratorExpr)
+
+    def addClassDocString(self, line):
+        self._classDocStringLines.append( line.replace('%','%%')) 
+
+    def addChunkToInit(self,chunk):
+        self._initMethChunks.append(chunk)
+
+    def addAttribute(self, attribExpr):
+        ## first test to make sure that the user hasn't used any fancy Cheetah syntax
+        #  (placeholders, directives, etc.) inside the expression 
+        if attribExpr.find('VFN(') != -1 or attribExpr.find('VFFSL(') != -1:
+            raise ParseError(self,
+                             'Invalid #attr directive.' +
+                             ' It should only contain simple Python literals.')
+        ## now add the attribute
+        self._generatedAttribs.append(attribExpr)
+
+    def addSuper(self, argsList, parserComment=None):        
+        className = self._className #self._baseClass
+        methodName = self._getActiveMethodCompiler().methodName()
+
+        argStringChunks = []
+        for arg in argsList:
+            chunk = arg[0]
+            if not arg[1] == None:
+                chunk += '=' + arg[1]
+            argStringChunks.append(chunk)
+        argString = ','.join(argStringChunks)
+
+        self.addFilteredChunk(
+            'super(%(className)s, self).%(methodName)s(%(argString)s)'%locals())
+
+    def addErrorCatcherCall(self, codeChunk, rawCode='', lineCol=''):
+        if self._placeholderToErrorCatcherMap.has_key(rawCode):
+            methodName = self._placeholderToErrorCatcherMap[rawCode]
+            if not self.setting('outputRowColComments'):
+                self._methodsIndex[methodName].addMethDocString(
+                    'plus at line %s, col %s'%lineCol)
+            return methodName
+
+        self._errorCatcherCount += 1
+        methodName = '__errorCatcher' + str(self._errorCatcherCount)
+        self._placeholderToErrorCatcherMap[rawCode] = methodName
+        
+        catcherMeth = self._spawnMethodCompiler(
+            methodName,
+            klass=MethodCompiler,
+            initialMethodComment=('## CHEETAH: Generated from ' + rawCode +
+                                  ' at line %s, col %s'%lineCol + '.')
+            )        
+        catcherMeth.setMethodSignature('def ' + methodName +
+                                       '(self, localsDict={})')
+                                        # is this use of localsDict right?
+        catcherMeth.addChunk('try:')
+        catcherMeth.indent()
+        catcherMeth.addChunk("return eval('''" + codeChunk +
+                             "''', globals(), localsDict)")
+        catcherMeth.dedent()
+        catcherMeth.addChunk('except self._CHEETAH__errorCatcher.exceptions(), e:')
+        catcherMeth.indent()        
+        catcherMeth.addChunk("return self._CHEETAH__errorCatcher.warn(exc_val=e, code= " +
+                             repr(codeChunk) + " , rawCode= " +
+                             repr(rawCode) + " , lineCol=" + str(lineCol) +")")
+        
+        catcherMeth.cleanupState()
+        
+        self._swallowMethodCompiler(catcherMeth)
+        return methodName
+
+    def closeDef(self):
+        self.commitStrConst()
+        methCompiler = self._popActiveMethodCompiler()
+        self._swallowMethodCompiler(methCompiler)
+
+    def closeBlock(self):
+        self.commitStrConst()
+        methCompiler = self._popActiveMethodCompiler()
+        methodName = methCompiler.methodName()
+        if self.setting('includeBlockMarkers'):
+            endMarker = self.setting('blockMarkerEnd')
+            methCompiler.addStrConst(endMarker[0] + methodName + endMarker[1])
+        self._swallowMethodCompiler(methCompiler)
+        
+        #metaData = self._blockMetaData[methodName] 
+        #rawDirective = metaData['raw']
+        #lineCol = metaData['lineCol']
+        
+        ## insert the code to call the block, caching if #cache directive is on
+        codeChunk = 'self.' + methodName + '(trans=trans)'
+        self.addChunk(codeChunk)
+        
+        #self.appendToPrevChunk(' # generated from ' + repr(rawDirective) )
+        #if self.setting('outputRowColComments'):
+        #    self.appendToPrevChunk(' at line %s, col %s' % lineCol + '.')
+
+
+    ## code wrapping methods
+    
+    def classDef(self):
+        if self._classDef:
+            return self._classDef
+        else:
+            return self.wrapClassDef()
+
+    __str__ = classDef
+    __unicode__ = classDef
+    
+    def wrapClassDef(self):
+        ind = self.setting('indentationStep')
+        classDefChunks = [self.classSignature(),
+                          self.classDocstring(),
+                          ]
+        def addMethods():
+            classDefChunks.extend([
+                ind + '#'*50,
+                ind + '## CHEETAH GENERATED METHODS',
+                '\n',
+                self.methodDefs(),
+                ])
+        def addAttributes():
+            classDefChunks.extend([
+                ind + '#'*50,
+                ind + '## CHEETAH GENERATED ATTRIBUTES',
+                '\n',
+                self.attributes(),
+                ])            
+        if self.setting('outputMethodsBeforeAttributes'):
+            addMethods()
+            addAttributes()
+        else:
+            addAttributes()
+            addMethods()
+            
+        classDef = '\n'.join(classDefChunks)
+        self._classDef = classDef
+        return classDef
+
+
+    def classSignature(self):
+        return "class %s(%s):" % (self.className(), self._baseClass)
+        
+    def classDocstring(self):
+        if not self._classDocStringLines:
+            return ''
+        ind = self.setting('indentationStep')
+        docStr = ('%(ind)s"""\n%(ind)s' +
+                  '\n%(ind)s'.join(self._classDocStringLines) +
+                  '\n%(ind)s"""\n'
+                  ) % {'ind':ind}
+        return  docStr
+
+    def methodDefs(self):
+        methodDefs = [methGen.methodDef() for methGen in self._finishedMethods()]
+        return '\n\n'.join(methodDefs)
+
+    def attributes(self):
+        attribs = [self.setting('indentationStep') + str(attrib)
+                      for attrib in self._generatedAttribs ]
+        return '\n\n'.join(attribs)
+  
+class AutoClassCompiler(ClassCompiler):
+    pass
+
+##################################################
+## MODULE COMPILERS
+
+class ModuleCompiler(SettingsManager, GenUtils):
+
+    parserClass = Parser
+    classCompilerClass = AutoClassCompiler
+    
+    def __init__(self, source=None, file=None,
+                 moduleName='DynamicallyCompiledCheetahTemplate',                 
+                 mainClassName=None, # string
+                 mainMethodName=None, # string
+                 baseclassName=None, # string
+                 extraImportStatements=None, # list of strings
+                 settings=None # dict
+                 ):
+        super(ModuleCompiler, self).__init__()
+        if settings:
+            self.updateSettings(settings)
+        # disable useStackFrames if the C version of NameMapper isn't compiled
+        # it's painfully slow in the Python version and bites Windows users all
+        # the time:
+        if not NameMapper.C_VERSION:
+            if not sys.platform.startswith('java'):
+                warnings.warn(
+                    "\nYou don't have the C version of NameMapper installed! "
+                    "I'm disabling Cheetah's useStackFrames option as it is "
+                    "painfully slow with the Python version of NameMapper. "
+                    "You should get a copy of Cheetah with the compiled C version of NameMapper."
+                    )
+            self.setSetting('useStackFrames', False)                    
+
+        self._compiled = False
+        self._moduleName = moduleName
+        if not mainClassName:
+            self._mainClassName = moduleName
+        else:
+            self._mainClassName = mainClassName
+        self._mainMethodNameArg = mainMethodName
+        if mainMethodName:
+            self.setSetting('mainMethodName', mainMethodName)
+        self._baseclassName = baseclassName
+        
+        self._filePath = None
+        self._fileMtime = None
+        
+        if source and file:
+            raise TypeError("Cannot compile from a source string AND file.")
+        elif isinstance(file, basestring): # it's a filename.
+            f = open(file) # Raises IOError.
+            source = f.read()
+            f.close()
+            self._filePath = file
+            self._fileMtime = os.path.getmtime(file)
+        elif hasattr(file, 'read'):
+            source = file.read()  # Can't set filename or mtime--they're not accessible.
+        elif file:
+            raise TypeError("'file' argument must be a filename string or file-like object")
+                
+        if self._filePath:
+            self._fileDirName, self._fileBaseName = os.path.split(self._filePath)
+            self._fileBaseNameRoot, self._fileBaseNameExt = os.path.splitext(self._fileBaseName)
+
+        if not isinstance(source, basestring):
+            source = unicode(source)
+            # by converting to string here we allow objects such as other Templates
+            # to be passed in
+
+        # Handle the #indent directive by converting it to other directives.
+        # (Over the long term we'll make it a real directive.)
+        if source == "":
+            warnings.warn("You supplied an empty string for the source!", )
+        
+        else:
+            unicodeMatch = unicodeDirectiveRE.search(source)
+            encodingMatch = encodingDirectiveRE.match(source)
+            if unicodeMatch:
+                if encodingMatch:
+                    raise ParseError(
+                        self, "#encoding and #unicode are mutually exclusive! "
+                        "Use one or the other.")
+                source = unicodeDirectiveRE.sub('', source)
+                if isinstance(source, str):
+                    encoding = unicodeMatch.group(1) or 'ascii'
+                    source = unicode(source, encoding)
+            elif encodingMatch:
+                encodings = encodingMatch.groups()
+                if len(encodings):
+                    encoding = encodings[0]
+                    source = source.decode(encoding)
+            else:
+                source = unicode(source)
+
+        if source.find('#indent') != -1: #@@TR: undocumented hack
+            source = indentize(source)
+
+        self._parser = self.parserClass(source, filename=self._filePath, compiler=self)
+        self._setupCompilerState()
+        
+    def __getattr__(self, name):
+        """Provide one-way access to the methods and attributes of the
+        ClassCompiler, and thereby the MethodCompilers as well.
+
+        WARNING: Use .setMethods to assign the attributes of the ClassCompiler
+        from the methods of this class!!! or you will be assigning to attributes
+        of this object instead.
+        """
+        if self.__dict__.has_key(name):
+            return self.__dict__[name]
+        elif hasattr(self.__class__, name):
+            return getattr(self.__class__, name)
+        elif self._activeClassesList and hasattr(self._activeClassesList[-1], name):
+            return getattr(self._activeClassesList[-1], name)
+        else:
+            raise AttributeError, name
+
+    def _initializeSettings(self):
+        self.updateSettings(copy.deepcopy(DEFAULT_COMPILER_SETTINGS))
+        
+    def _setupCompilerState(self):
+        self._activeClassesList = []
+        self._finishedClassesList = []      # listed by ordered 
+        self._finishedClassIndex = {}  # listed by name
+        self._moduleDef = None
+        self._moduleShBang = '#!/usr/bin/env python'
+        self._moduleEncoding = 'ascii'
+        self._moduleEncodingStr = ''
+        self._moduleHeaderLines = []
+        self._moduleDocStringLines = []
+        self._specialVars = {}
+        self._importStatements = [
+            "import sys",
+            "import os",
+            "import os.path",
+            "import __builtin__",
+            "from os.path import getmtime, exists",
+            "import time",
+            "import types",
+            "from Cheetah.Version import MinCompatibleVersion as RequiredCheetahVersion",            
+            "from Cheetah.Version import MinCompatibleVersionTuple as RequiredCheetahVersionTuple",
+            "from Cheetah.Template import Template",
+            "from Cheetah.DummyTransaction import *",
+            "from Cheetah.NameMapper import NotFound, valueForName, valueFromSearchList, valueFromFrameOrSearchList",
+            "from Cheetah.CacheRegion import CacheRegion",
+            "import Cheetah.Filters as Filters",
+            "import Cheetah.ErrorCatchers as ErrorCatchers",
+            ]        
+
+        self._importedVarNames = ['sys',
+                                  'os',
+                                  'os.path',
+                                  'time',
+                                  'types',
+                                  'Template',
+                                  'DummyTransaction',
+                                  'NotFound',
+                                  'Filters',
+                                  'ErrorCatchers',
+                                  'CacheRegion',
+                                  ]
+        
+        self._moduleConstants = [
+            "VFFSL=valueFromFrameOrSearchList",
+            "VFSL=valueFromSearchList",
+            "VFN=valueForName",
+            "currentTime=time.time",
+            ]
+        
+    def compile(self):
+        classCompiler = self._spawnClassCompiler(self._mainClassName)            
+        if self._baseclassName:
+            classCompiler.setBaseClass(self._baseclassName)
+        self._addActiveClassCompiler(classCompiler)
+        self._parser.parse()
+        self._swallowClassCompiler(self._popActiveClassCompiler())
+        self._compiled = True
+        self._parser.cleanup()
+        
+    def _spawnClassCompiler(self, className, klass=None):
+        if klass is None:
+            klass = self.classCompilerClass
+        classCompiler = klass(className,
+                              moduleCompiler=self,
+                              mainMethodName=self.setting('mainMethodName'),
+                              fileName=self._filePath,
+                              settingsManager=self,
+                              )
+        return classCompiler
+
+    def _addActiveClassCompiler(self, classCompiler):
+        self._activeClassesList.append(classCompiler)
+
+    def _getActiveClassCompiler(self):
+        return self._activeClassesList[-1]
+
+    def _popActiveClassCompiler(self):
+        return self._activeClassesList.pop()
+
+    def _swallowClassCompiler(self, classCompiler):
+        classCompiler.cleanupState()
+        self._finishedClassesList.append( classCompiler )
+        self._finishedClassIndex[classCompiler.className()] = classCompiler
+        return classCompiler
+
+    def _finishedClasses(self):
+        return self._finishedClassesList
+
+    def importedVarNames(self):
+        return self._importedVarNames
+    
+    def addImportedVarNames(self, varNames, raw_statement=None):
+        settings = self.settings()
+        if not varNames:
+            return 
+        if not settings.get('useLegacyImportMode'):
+            if raw_statement and getattr(self, '_methodBodyChunks'):
+                self.addChunk(raw_statement)
+        else:
+            self._importedVarNames.extend(varNames)
+
+    ## methods for adding stuff to the module and class definitions
+
+    def setBaseClass(self, baseClassName):
+        if self._mainMethodNameArg:
+            self.setMainMethodName(self._mainMethodNameArg)
+        else:
+            self.setMainMethodName(self.setting('mainMethodNameForSubclasses'))
+       
+        if self.setting('handlerForExtendsDirective'):
+            handler = self.setting('handlerForExtendsDirective')
+            baseClassName = handler(compiler=self, baseClassName=baseClassName)
+            self._getActiveClassCompiler().setBaseClass(baseClassName)
+        elif (not self.setting('autoImportForExtendsDirective')
+            or baseClassName=='object' or baseClassName in self.importedVarNames()):
+            self._getActiveClassCompiler().setBaseClass(baseClassName)
+            # no need to import
+        else:
+            ##################################################
+            ## If the #extends directive contains a classname or modulename that isn't
+            #  in self.importedVarNames() already, we assume that we need to add
+            #  an implied 'from ModName import ClassName' where ModName == ClassName.
+            #  - This is the case in WebKit servlet modules.
+            #  - We also assume that the final . separates the classname from the
+            #    module name.  This might break if people do something really fancy 
+            #    with their dots and namespaces.
+            baseclasses = baseClassName.split(',')
+            for klass in baseclasses:
+                chunks = klass.split('.')
+                if len(chunks)==1:
+                    self._getActiveClassCompiler().setBaseClass(klass)
+                    if klass not in self.importedVarNames():
+                        modName = klass
+                        # we assume the class name to be the module name
+                        # and that it's not a builtin:
+                        importStatement = "from %s import %s" % (modName, klass)
+                        self.addImportStatement(importStatement)
+                        self.addImportedVarNames((klass,))
+                else:
+                    needToAddImport = True
+                    modName = chunks[0]
+                    #print chunks, ':', self.importedVarNames()
+                    for chunk in chunks[1:-1]:
+                        if modName in self.importedVarNames():
+                            needToAddImport = False
+                            finalBaseClassName = klass.replace(modName+'.', '')
+                            self._getActiveClassCompiler().setBaseClass(finalBaseClassName)
+                            break
+                        else:
+                            modName += '.'+chunk                        
+                    if needToAddImport:
+                        modName, finalClassName = '.'.join(chunks[:-1]), chunks[-1]                
+                        #if finalClassName != chunks[:-1][-1]:
+                        if finalClassName != chunks[-2]:
+                            # we assume the class name to be the module name
+                            modName = '.'.join(chunks)
+                        self._getActiveClassCompiler().setBaseClass(finalClassName)                        
+                        importStatement = "from %s import %s" % (modName, finalClassName)
+                        self.addImportStatement(importStatement)
+                        self.addImportedVarNames( [finalClassName,] ) 
+            
+    def setCompilerSetting(self, key, valueExpr):
+        self.setSetting(key, eval(valueExpr) )
+        self._parser.configureParser()
+
+    def setCompilerSettings(self, keywords, settingsStr):
+        KWs = keywords
+        merge = True
+        if 'nomerge' in KWs:
+            merge = False
+            
+        if 'reset' in KWs:
+            # @@TR: this is actually caught by the parser at the moment. 
+            # subject to change in the future
+            self._initializeSettings()
+            self._parser.configureParser()
+            return
+        elif 'python' in KWs:
+            settingsReader = self.updateSettingsFromPySrcStr
+            # this comes from SettingsManager
+        else:
+            # this comes from SettingsManager
+            settingsReader = self.updateSettingsFromConfigStr
+
+        settingsReader(settingsStr)
+        self._parser.configureParser()
+        
+    def setShBang(self, shBang):
+        self._moduleShBang = shBang
+    
+    def setModuleEncoding(self, encoding):
+        self._moduleEncoding = encoding
+
+    def getModuleEncoding(self):
+        return self._moduleEncoding
+
+    def addModuleHeader(self, line):
+        """Adds a header comment to the top of the generated module.
+        """
+        self._moduleHeaderLines.append(line)
+        
+    def addModuleDocString(self, line):        
+        """Adds a line to the generated module docstring.
+        """
+        self._moduleDocStringLines.append(line)
+
+    def addModuleGlobal(self, line):
+        """Adds a line of global module code.  It is inserted after the import
+        statements and Cheetah default module constants.
+        """
+        self._moduleConstants.append(line)
+
+    def addSpecialVar(self, basename, contents, includeUnderscores=True):
+        """Adds module __specialConstant__ to the module globals.
+        """
+        name = includeUnderscores and '__'+basename+'__' or basename
+        self._specialVars[name] = contents.strip()
+
+    def addImportStatement(self, impStatement):
+        settings = self.settings()
+        if not self._methodBodyChunks or settings.get('useLegacyImportMode'):
+            # In the case where we are importing inline in the middle of a source block
+            # we don't want to inadvertantly import the module at the top of the file either
+            self._importStatements.append(impStatement)
+
+        #@@TR 2005-01-01: there's almost certainly a cleaner way to do this!
+        importVarNames = impStatement[impStatement.find('import') + len('import'):].split(',')
+        importVarNames = [var.split()[-1] for var in importVarNames] # handles aliases
+        importVarNames = [var for var in importVarNames if not var == '*']
+        self.addImportedVarNames(importVarNames, raw_statement=impStatement) #used by #extend for auto-imports
+
+    def addAttribute(self, attribName, expr):
+        self._getActiveClassCompiler().addAttribute(attribName + ' =' + expr)
+        
+    def addComment(self, comm):
+        if re.match(r'#+$',comm):      # skip bar comments
+            return
+        
+        specialVarMatch = specialVarRE.match(comm)
+        if specialVarMatch:
+            # @@TR: this is a bit hackish and is being replaced with
+            # #set module varName = ...
+            return self.addSpecialVar(specialVarMatch.group(1),
+                                      comm[specialVarMatch.end():])
+        elif comm.startswith('doc:'):
+            addLine = self.addMethDocString
+            comm = comm[len('doc:'):].strip()
+        elif comm.startswith('doc-method:'):
+            addLine = self.addMethDocString
+            comm = comm[len('doc-method:'):].strip()
+        elif comm.startswith('doc-module:'):
+            addLine = self.addModuleDocString
+            comm = comm[len('doc-module:'):].strip()
+        elif comm.startswith('doc-class:'):
+            addLine = self.addClassDocString
+            comm = comm[len('doc-class:'):].strip()
+        elif comm.startswith('header:'):
+            addLine = self.addModuleHeader
+            comm = comm[len('header:'):].strip()
+        else:
+            addLine = self.addMethComment
+
+        for line in comm.splitlines():
+            addLine(line)
+
+    ## methods for module code wrapping
+    
+    def getModuleCode(self):
+        if not self._compiled:
+            self.compile()
+        if self._moduleDef:
+            return self._moduleDef
+        else:
+            return self.wrapModuleDef()
+        
+    __str__ = getModuleCode
+
+    def wrapModuleDef(self):
+        self.addSpecialVar('CHEETAH_docstring', self.setting('defDocStrMsg'))
+        self.addModuleGlobal('__CHEETAH_version__ = %r'%Version)
+        self.addModuleGlobal('__CHEETAH_versionTuple__ = %r'%(VersionTuple,))        
+        if self.setting('addTimestampsToCompilerOutput'):
+            self.addModuleGlobal('__CHEETAH_genTime__ = %r'%time.time())
+            self.addModuleGlobal('__CHEETAH_genTimestamp__ = %r'%self.timestamp())
+        if self._filePath:
+            timestamp = self.timestamp(self._fileMtime)
+            self.addModuleGlobal('__CHEETAH_src__ = %r'%self._filePath)
+            self.addModuleGlobal('__CHEETAH_srcLastModified__ = %r'%timestamp)
+        else:
+            self.addModuleGlobal('__CHEETAH_src__ = None')
+            self.addModuleGlobal('__CHEETAH_srcLastModified__ = None')            
+
+        moduleDef = """%(header)s
+%(docstring)s
+
+##################################################
+## DEPENDENCIES
+%(imports)s
+
+##################################################
+## MODULE CONSTANTS
+%(constants)s
+%(specialVars)s
+
+if __CHEETAH_versionTuple__ < RequiredCheetahVersionTuple:
+    raise AssertionError(
+      'This template was compiled with Cheetah version'
+      ' %%s. Templates compiled before version %%s must be recompiled.'%%(
+         __CHEETAH_version__, RequiredCheetahVersion))
+
+##################################################
+## CLASSES
+
+%(classes)s
+
+## END CLASS DEFINITION
+
+if not hasattr(%(mainClassName)s, '_initCheetahAttributes'):
+    templateAPIClass = getattr(%(mainClassName)s, '_CHEETAH_templateClass', Template)
+    templateAPIClass._addCheetahPlumbingCodeToClass(%(mainClassName)s)
+
+%(footer)s
+""" %   {'header':self.moduleHeader(),
+         'docstring':self.moduleDocstring(),
+         'specialVars':self.specialVars(),
+         'imports':self.importStatements(),
+         'constants':self.moduleConstants(),
+         'classes':self.classDefs(),
+         'footer':self.moduleFooter(),
+         'mainClassName':self._mainClassName,
+         }
+       
+        self._moduleDef = moduleDef
+        return moduleDef
+
+    def timestamp(self, theTime=None):
+        if not theTime:
+            theTime = time.time()
+        return time.asctime(time.localtime(theTime))
+    
+    def moduleHeader(self):
+        header = self._moduleShBang + '\n'
+        header += self._moduleEncodingStr + '\n'
+        if self._moduleHeaderLines:
+            offSet = self.setting('commentOffset')
+        
+            header += (
+                '#' + ' '*offSet + 
+                ('\n#'+ ' '*offSet).join(self._moduleHeaderLines) + '\n')
+
+        return header
+
+    def moduleDocstring(self):
+        if not self._moduleDocStringLines:
+            return ''
+        
+        return ('"""' +
+                '\n'.join(self._moduleDocStringLines) +
+                '\n"""\n')
+
+    def specialVars(self):
+        chunks = []
+        theVars = self._specialVars
+        keys = theVars.keys()
+        keys.sort()
+        for key in keys:
+            chunks.append(key + ' = ' + repr(theVars[key])  )
+        return '\n'.join(chunks)
+        
+    def importStatements(self):
+        return '\n'.join(self._importStatements)
+        
+    def moduleConstants(self):
+        return '\n'.join(self._moduleConstants)
+
+    def classDefs(self):
+        classDefs = [klass.classDef() for klass in self._finishedClasses()]
+        return '\n\n'.join(classDefs)
+
+    def moduleFooter(self):
+        return """
+# CHEETAH was developed by Tavis Rudd and Mike Orr
+# with code, advice and input from many other volunteers.
+# For more information visit http://www.CheetahTemplate.org/
+
+##################################################
+## if run from command line:
+if __name__ == '__main__':
+    from Cheetah.TemplateCmdLineIface import CmdLineIface
+    CmdLineIface(templateObj=%(className)s()).run()
+
+""" % {'className':self._mainClassName}
+
+
+##################################################
+## Make Compiler an alias for ModuleCompiler
+    
+Compiler = ModuleCompiler
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Template.py
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Template.py (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Template.py (revision 3)
@@ -0,0 +1,1914 @@
+'''
+Provides the core API for Cheetah.
+
+See the docstring in the Template class and the Users' Guide for more information
+'''
+
+################################################################################
+## DEPENDENCIES
+import sys                        # used in the error handling code
+import re                         # used to define the internal delims regex
+import new                        # used to bind methods and create dummy modules
+import logging
+import string
+import os.path
+import time                       # used in the cache refresh code
+from random import randrange
+import imp
+import inspect
+import StringIO
+import traceback
+import pprint
+import cgi                # Used by .webInput() if the template is a CGI script.
+import types 
+from types import StringType, ClassType
+try:
+    from types import StringTypes
+except ImportError:
+    StringTypes = (types.StringType,types.UnicodeType)
+    
+try:
+    from threading import Lock
+except ImportError:
+    class Lock:
+        def acquire(self):
+            pass
+        def release(self): 
+            pass
+
+try:
+    x = set()
+except NameError:
+    # Python 2.3 compatibility
+    from sets import Set as set
+
+from Cheetah.Version import convertVersionStringToTuple, MinCompatibleVersionTuple
+from Cheetah.Version import MinCompatibleVersion
+# Base classes for Template
+from Cheetah.Servlet import Servlet                 
+# More intra-package imports ...
+from Cheetah.Parser import ParseError, SourceReader
+from Cheetah.Compiler import Compiler, DEFAULT_COMPILER_SETTINGS
+from Cheetah import ErrorCatchers              # for placeholder tags
+from Cheetah import Filters                    # the output filters
+from Cheetah.convertTmplPathToModuleName import convertTmplPathToModuleName
+
+from Cheetah.Utils.Misc import checkKeywords     # Used in Template.__init__
+from Cheetah.Utils.Indenter import Indenter      # Used in Template.__init__ and for
+                                                 # placeholders
+from Cheetah.NameMapper import NotFound, valueFromSearchList
+from Cheetah.CacheStore import MemoryCacheStore, MemcachedCacheStore
+from Cheetah.CacheRegion import CacheRegion
+from Cheetah.Utils.WebInputMixin import _Converter, _lookup, NonNumericInputError
+
+from Cheetah.Unspecified import Unspecified
+
+# Decide whether to use the file modification time in file's cache key 
+__checkFileMtime = True
+def checkFileMtime(value):
+    globals()['__checkFileMtime'] = value
+
+class Error(Exception):
+    pass
+class PreprocessError(Error):
+    pass
+
+def hashList(l):
+    hashedList = []
+    for v in l:
+        if isinstance(v, dict):
+            v = hashDict(v)
+        elif isinstance(v, list):
+            v = hashList(v)
+        hashedList.append(v)
+    return hash(tuple(hashedList))
+
+def hashDict(d):
+    items = d.items()
+    items.sort()
+    hashedList = []
+    for k, v in items:
+        if isinstance(v, dict):
+            v = hashDict(v)
+        elif isinstance(v, list):
+            v = hashList(v)
+        hashedList.append((k,v))
+    return hash(tuple(hashedList))
+
+################################################################################
+## MODULE GLOBALS AND CONSTANTS
+
+def _genUniqueModuleName(baseModuleName):
+    """The calling code is responsible for concurrency locking.
+    """
+    if baseModuleName not in sys.modules:
+        finalName = baseModuleName
+    else:
+        finalName = ('cheetah_%s_%s_%s'%(baseModuleName,
+                                         str(time.time()).replace('.','_'),
+                                         str(randrange(10000, 99999))))
+    return finalName
+
+# Cache of a cgi.FieldStorage() instance, maintained by .webInput().
+# This is only relavent to templates used as CGI scripts.
+_formUsedByWebInput = None
+
+def updateLinecache(filename, src):
+    import linecache
+    size = len(src)
+    mtime = time.time()
+    lines = src.splitlines()
+    fullname = filename
+    linecache.cache[filename] = size, mtime, lines, fullname
+
+class CompileCacheItem(object):
+    pass
+
+class TemplatePreprocessor(object):
+    '''
+    This is used with the preprocessors argument to Template.compile().
+
+    See the docstring for Template.compile
+
+    ** Preprocessors are an advanced topic **
+    '''
+    
+    def __init__(self, settings):
+        self._settings = settings
+
+    def preprocess(self, source, file):
+        """Create an intermediate template and return the source code
+        it outputs                
+        """
+        settings = self._settings
+        if not source: # @@TR: this needs improving
+            if isinstance(file, (str, unicode)): # it's a filename.
+                f = open(file)
+                source = f.read()
+                f.close()
+            elif hasattr(file, 'read'):
+                source = file.read()
+            file = None        
+
+        templateAPIClass = settings.templateAPIClass
+        possibleKwArgs = [
+            arg for arg in
+            inspect.getargs(templateAPIClass.compile.im_func.func_code)[0]
+            if arg not in ('klass', 'source', 'file',)]
+
+        compileKwArgs = {}
+        for arg in possibleKwArgs:
+            if hasattr(settings, arg):
+                compileKwArgs[arg] = getattr(settings, arg)
+
+        tmplClass = templateAPIClass.compile(source=source, file=file, **compileKwArgs)
+        tmplInstance = tmplClass(**settings.templateInitArgs)
+        outputSource = settings.outputTransformer(tmplInstance)
+        outputFile = None
+        return outputSource, outputFile
+        
+class Template(Servlet):
+    '''
+    This class provides a) methods used by templates at runtime and b)
+    methods for compiling Cheetah source code into template classes.
+
+    This documentation assumes you already know Python and the basics of object
+    oriented programming.  If you don't know Python, see the sections of the
+    Cheetah Users' Guide for non-programmers.  It also assumes you have read
+    about Cheetah's syntax in the Users' Guide.
+
+    The following explains how to use Cheetah from within Python programs or via
+    the interpreter. If you statically compile your templates on the command
+    line using the 'cheetah' script, this is not relevant to you. Statically
+    compiled Cheetah template modules/classes (e.g. myTemplate.py:
+    MyTemplateClasss) are just like any other Python module or class. Also note,
+    most Python web frameworks (Webware, Aquarium, mod_python, Turbogears,
+    CherryPy, Quixote, etc.) provide plugins that handle Cheetah compilation for
+    you.
+
+    There are several possible usage patterns:          
+       1) tclass = Template.compile(src)
+          t1 = tclass() # or tclass(namespaces=[namespace,...])
+          t2 = tclass() # or tclass(namespaces=[namespace2,...])
+          outputStr = str(t1) # or outputStr = t1.aMethodYouDefined()
+
+          Template.compile provides a rich and very flexible API via its
+          optional arguments so there are many possible variations of this
+          pattern.  One example is:
+            tclass = Template.compile('hello $name from $caller', baseclass=dict)
+            print tclass(name='world', caller='me')
+          See the Template.compile() docstring for more details.  
+
+       2) tmplInstance = Template(src)
+             # or Template(src, namespaces=[namespace,...])
+          outputStr = str(tmplInstance) # or outputStr = tmplInstance.aMethodYouDefined(...args...)
+
+    Notes on the usage patterns:
+    
+       usage pattern 1)       
+          This is the most flexible, but it is slightly more verbose unless you
+          write a wrapper function to hide the plumbing.  Under the hood, all
+          other usage patterns are based on this approach.  Templates compiled
+          this way can #extend (subclass) any Python baseclass: old-style or
+          new-style (based on object or a builtin type).
+
+       usage pattern 2)
+          This was Cheetah's original usage pattern.  It returns an instance,
+          but you can still access the generated class via
+          tmplInstance.__class__.  If you want to use several different
+          namespace 'searchLists' with a single template source definition,
+          you're better off with Template.compile (1).
+
+          Limitations (use pattern 1 instead):
+           - Templates compiled this way can only #extend subclasses of the
+             new-style 'object' baseclass.  Cheetah.Template is a subclass of
+             'object'.  You also can not #extend dict, list, or other builtin
+             types.  
+           - If your template baseclass' __init__ constructor expects args there
+             is currently no way to pass them in.
+
+    If you need to subclass a dynamically compiled Cheetah class, do something like this:
+        from Cheetah.Template import Template
+        T1 = Template.compile('$meth1 #def meth1: this is meth1 in T1')
+        T2 = Template.compile('#implements meth1\nthis is meth1 redefined in T2', baseclass=T1)
+        print T1, T1()
+        print T2, T2()
+
+
+    Note about class and instance attribute names:
+      Attributes used by Cheetah have a special prefix to avoid confusion with
+      the attributes of the templates themselves or those of template
+      baseclasses.
+      
+      Class attributes which are used in class methods look like this:
+          klass._CHEETAH_useCompilationCache (_CHEETAH_xxx)
+
+      Instance attributes look like this:
+          klass._CHEETAH__globalSetVars (_CHEETAH__xxx with 2 underscores)
+    '''
+
+    # this is used by ._addCheetahPlumbingCodeToClass()
+    _CHEETAH_requiredCheetahMethods = (
+         '_initCheetahInstance',
+         'searchList',
+         'errorCatcher',
+         'getVar',
+         'varExists',
+         'getFileContents',
+         'i18n',
+         'runAsMainProgram',
+         'respond',
+         'shutdown',
+         'webInput',
+         'serverSidePath',
+         'generatedClassCode',
+         'generatedModuleCode',
+
+         '_getCacheStore',
+         '_getCacheStoreIdPrefix',
+         '_createCacheRegion',
+         'getCacheRegion',
+         'getCacheRegions',
+         'refreshCache',
+         
+         '_handleCheetahInclude',
+         '_getTemplateAPIClassForIncludeDirectiveCompilation',
+         )
+    _CHEETAH_requiredCheetahClassMethods = ('subclass',) 
+    _CHEETAH_requiredCheetahClassAttributes = ('cacheRegionClass','cacheStore',
+                                               'cacheStoreIdPrefix','cacheStoreClass')
+
+    ## the following are used by .compile(). Most are documented in its docstring.
+    _CHEETAH_cacheModuleFilesForTracebacks = False
+    _CHEETAH_cacheDirForModuleFiles = None # change to a dirname
+
+    _CHEETAH_compileCache = dict() # cache store for compiled code and classes
+    # To do something other than simple in-memory caching you can create an
+    # alternative cache store. It just needs to support the basics of Python's
+    # mapping/dict protocol. E.g.:
+    #   class AdvCachingTemplate(Template):
+    #       _CHEETAH_compileCache = MemoryOrFileCache()
+    _CHEETAH_compileLock = Lock() # used to prevent race conditions
+    _CHEETAH_defaultMainMethodName = None
+    _CHEETAH_compilerSettings = None
+    _CHEETAH_compilerClass = Compiler
+    _CHEETAH_cacheCompilationResults = True
+    _CHEETAH_useCompilationCache = True
+    _CHEETAH_keepRefToGeneratedCode = True
+    _CHEETAH_defaultBaseclassForTemplates = None
+    _CHEETAH_defaultClassNameForTemplates = None
+    # defaults to DEFAULT_COMPILER_SETTINGS['mainMethodName']:
+    _CHEETAH_defaultMainMethodNameForTemplates = None 
+    _CHEETAH_defaultModuleNameForTemplates = 'DynamicallyCompiledCheetahTemplate'
+    _CHEETAH_defaultModuleGlobalsForTemplates = None
+    _CHEETAH_preprocessors = None
+    _CHEETAH_defaultPreprocessorClass = TemplatePreprocessor    
+    
+    ## The following attributes are used by instance methods:
+    _CHEETAH_generatedModuleCode = None
+    NonNumericInputError = NonNumericInputError
+    _CHEETAH_cacheRegionClass = CacheRegion
+    _CHEETAH_cacheStoreClass = MemoryCacheStore
+    #_CHEETAH_cacheStoreClass = MemcachedCacheStore
+    _CHEETAH_cacheStore = None  
+    _CHEETAH_cacheStoreIdPrefix = None  
+
+    def _getCompilerClass(klass, source=None, file=None):
+        return klass._CHEETAH_compilerClass
+    _getCompilerClass = classmethod(_getCompilerClass)
+
+    def _getCompilerSettings(klass, source=None, file=None):
+        return klass._CHEETAH_compilerSettings
+    _getCompilerSettings = classmethod(_getCompilerSettings)
+    
+    def compile(klass, source=None, file=None,
+                returnAClass=True,
+                
+                compilerSettings=Unspecified,
+                compilerClass=Unspecified,
+                moduleName=None,
+                className=Unspecified,
+                mainMethodName=Unspecified,
+                baseclass=Unspecified,
+                moduleGlobals=Unspecified,
+                cacheCompilationResults=Unspecified,
+                useCache=Unspecified,
+                preprocessors=Unspecified,
+                cacheModuleFilesForTracebacks=Unspecified,
+                cacheDirForModuleFiles=Unspecified,
+                commandlineopts=None,
+                keepRefToGeneratedCode=Unspecified,                
+                ):
+        
+        """
+        The core API for compiling Cheetah source code into template classes.
+
+        This class method compiles Cheetah source code and returns a python
+        class.  You then create template instances using that class.  All
+        Cheetah's other compilation API's use this method under the hood.
+
+        Internally, this method a) parses the Cheetah source code and generates
+        Python code defining a module with a single class in it, b) dynamically
+        creates a module object with a unique name, c) execs the generated code
+        in that module's namespace then inserts the module into sys.modules, and
+        d) returns a reference to the generated class.  If you want to get the
+        generated python source code instead, pass the argument
+        returnAClass=False.
+
+        It caches generated code and classes.  See the descriptions of the
+        arguments'cacheCompilationResults' and 'useCache' for details. This
+        doesn't mean that templates will automatically recompile themselves when
+        the source file changes. Rather, if you call Template.compile(src) or
+        Template.compile(file=path) repeatedly it will attempt to return a
+        cached class definition instead of recompiling.
+
+        Hooks are provided template source preprocessing.  See the notes on the
+        'preprocessors' arg.
+
+        If you are an advanced user and need to customize the way Cheetah parses
+        source code or outputs Python code, you should check out the
+        compilerSettings argument.
+
+        Arguments:
+          You must provide either a 'source' or 'file' arg, but not both:
+            - source (string or None)
+            - file (string path, file-like object, or None)
+
+          The rest of the arguments are strictly optional. All but the first
+          have defaults in attributes of the Template class which can be
+          overridden in subclasses of this class.  Working with most of these is
+          an advanced topic.
+          
+            - returnAClass=True            
+              If false, return the generated module code rather than a class.
+
+            - compilerSettings (a dict)
+              Default: Template._CHEETAH_compilerSettings=None
+            
+              a dictionary of settings to override those defined in
+              DEFAULT_COMPILER_SETTINGS. These can also be overridden in your
+              template source code with the #compiler or #compiler-settings
+              directives.
+                  
+            - compilerClass (a class)
+              Default: Template._CHEETAH_compilerClass=Cheetah.Compiler.Compiler
+            
+              a subclass of Cheetah.Compiler.Compiler. Mucking with this is a
+              very advanced topic.
+                  
+            - moduleName (a string)
+              Default:
+                  Template._CHEETAH_defaultModuleNameForTemplates
+                  ='DynamicallyCompiledCheetahTemplate'
+            
+              What to name the generated Python module.  If the provided value is
+              None and a file arg was given, the moduleName is created from the
+              file path.  In all cases if the moduleName provided is already in
+              sys.modules it is passed through a filter that generates a unique
+              variant of the name.
+
+
+            - className (a string)
+              Default: Template._CHEETAH_defaultClassNameForTemplates=None
+              
+              What to name the generated Python class.  If the provided value is
+              None, the moduleName is use as the class name.
+
+            - mainMethodName (a string)
+              Default:
+                  Template._CHEETAH_defaultMainMethodNameForTemplates
+                  =None (and thus DEFAULT_COMPILER_SETTINGS['mainMethodName']) 
+            
+              What to name the main output generating method in the compiled
+              template class.  
+
+            - baseclass (a string or a class)
+              Default: Template._CHEETAH_defaultBaseclassForTemplates=None
+
+              Specifies the baseclass for the template without manually
+              including an #extends directive in the source. The #extends
+              directive trumps this arg.
+
+              If the provided value is a string you must make sure that a class
+              reference by that name is available to your template, either by
+              using an #import directive or by providing it in the arg
+              'moduleGlobals'.  
+
+              If the provided value is a class, Cheetah will handle all the
+              details for you.
+
+            - moduleGlobals (a dict)
+              Default: Template._CHEETAH_defaultModuleGlobalsForTemplates=None
+
+              A dict of vars that will be added to the global namespace of the
+              module the generated code is executed in, prior to the execution
+              of that code.  This should be Python values, not code strings!
+              
+            - cacheCompilationResults (True/False)
+              Default: Template._CHEETAH_cacheCompilationResults=True
+
+              Tells Cheetah to cache the generated code and classes so that they
+              can be reused if Template.compile() is called multiple times with
+              the same source and options.
+                           
+            - useCache (True/False)
+              Default: Template._CHEETAH_useCompilationCache=True
+
+              Should the compilation cache be used?  If True and a previous
+              compilation created a cached template class with the same source
+              code, compiler settings and other options, the cached template
+              class will be returned.
+
+            - cacheModuleFilesForTracebacks (True/False)
+              Default: Template._CHEETAH_cacheModuleFilesForTracebacks=False
+
+              In earlier versions of Cheetah tracebacks from exceptions that
+              were raised inside dynamically compiled Cheetah templates were
+              opaque because Python didn't have access to a python source file
+              to use in the traceback:
+        
+                File "xxxx.py", line 192, in getTextiledContent
+                  content = str(template(searchList=searchList))
+                File "cheetah_yyyy.py", line 202, in __str__
+                File "cheetah_yyyy.py", line 187, in respond
+                File "cheetah_yyyy.py", line 139, in writeBody
+               ZeroDivisionError: integer division or modulo by zero
+        
+              It is now possible to keep those files in a cache dir and allow
+              Python to include the actual source lines in tracebacks and makes
+              them much easier to understand:
+        
+               File "xxxx.py", line 192, in getTextiledContent
+                 content = str(template(searchList=searchList))
+               File "/tmp/CheetahCacheDir/cheetah_yyyy.py", line 202, in __str__
+                 def __str__(self): return self.respond()
+               File "/tmp/CheetahCacheDir/cheetah_yyyy.py", line 187, in respond
+                 self.writeBody(trans=trans)
+               File "/tmp/CheetahCacheDir/cheetah_yyyy.py", line 139, in writeBody
+                 __v = 0/0 # $(0/0)
+              ZeroDivisionError: integer division or modulo by zero
+            
+            - cacheDirForModuleFiles (a string representing a dir path)
+              Default: Template._CHEETAH_cacheDirForModuleFiles=None
+
+              See notes on cacheModuleFilesForTracebacks.
+
+            - preprocessors
+              Default: Template._CHEETAH_preprocessors=None
+
+              ** THIS IS A VERY ADVANCED TOPIC **
+              
+              These are used to transform the source code prior to compilation.
+              They provide a way to use Cheetah as a code generator for Cheetah
+              code. In other words, you use one Cheetah template to output the
+              source code for another Cheetah template.
+              
+              The major expected use cases are:
+                  
+                a) 'compile-time caching' aka 'partial template binding',
+                   wherein an intermediate Cheetah template is used to output
+                   the source for the final Cheetah template. The intermediate
+                   template is a mix of a modified Cheetah syntax (the
+                   'preprocess syntax') and standard Cheetah syntax.  The
+                   preprocessor syntax is executed at compile time and outputs
+                   Cheetah code which is then compiled in turn. This approach
+                   allows one to completely soft-code all the elements in the
+                   template which are subject to change yet have it compile to
+                   extremely efficient Python code with everything but the
+                   elements that must be variable at runtime (per browser
+                   request, etc.) compiled as static strings.  Examples of this
+                   usage pattern will be added to the Cheetah Users' Guide.
+
+                   The'preprocess syntax' is just Cheetah's standard one with
+                   alternatives for the $ and # tokens:
+                    
+                    e.g. '@' and '%' for code like this
+                     @aPreprocessVar $aRuntimeVar
+                     %if aCompileTimeCondition then yyy else zzz
+                     %% preprocessor comment
+                     
+                     #if aRunTimeCondition then aaa else bbb
+                     ## normal comment
+                     $aRuntimeVar
+                                     
+                b) adding #import and #extends directives dynamically based on
+                   the source
+                
+              If preprocessors are provided, Cheetah pipes the source code
+              through each one in the order provided.  Each preprocessor should
+              accept the args (source, file) and should return a tuple (source,
+              file).
+
+              The argument value should be a list, but a single non-list value
+              is acceptable and will automatically be converted into a list.
+              Each item in the list will be passed through
+              Template._normalizePreprocessor().  The items should either match
+              one of the following forms:
+              
+                - an object with a .preprocess(source, file) method
+                - a callable with the following signature:
+                    source, file = f(source, file)
+                
+                or one of the forms below:
+                
+                - a single string denoting the 2 'tokens' for the preprocess
+                  syntax.  The tokens should be in the order (placeholderToken,
+                  directiveToken) and should separated with a space:
+                     e.g. '@ %'
+                     klass = Template.compile(src, preprocessors='@ %')
+                     # or 
+                     klass = Template.compile(src, preprocessors=['@ %'])
+                     
+                - a dict with the following keys or an object with the
+                  following attributes (all are optional, but nothing will
+                  happen if you don't provide at least one):
+                   - tokens: same as the single string described above. You can
+                     also provide a tuple of 2 strings.
+                   - searchList: the searchList used for preprocess $placeholders
+                   - compilerSettings: used in the compilation of the intermediate
+                     template                
+                   - templateAPIClass: an optional subclass of `Template`
+                   - outputTransformer: a simple hook for passing in a callable
+                     which can do further transformations of the preprocessor
+                     output, or do something else like debug logging. The
+                     default is str().
+                   + any keyword arguments to Template.compile which you want to
+                     provide for the compilation of the intermediate template.
+                     
+                   klass = Template.compile(src,
+                          preprocessors=[ dict(tokens='@ %', searchList=[...]) ] )
+            
+        """
+        ##################################################           
+        ## normalize and validate args 
+        N = types.NoneType; S = types.StringType; U = types.UnicodeType
+        D = types.DictType; F = types.FileType
+        C = types.ClassType;  M = types.ModuleType
+        I = types.IntType; B = types.BooleanType
+        errmsg = "arg '%s' must be %s"
+
+        t = type(source)
+        if not (t is N or t is S or t is U):
+            raise TypeError(errmsg % ('source', 'string or None'))
+        t = type(file)
+        if not (t is N or t is S or t is U or t is F):
+            raise TypeError(errmsg %
+                            ('file', 'string, file-like object, or None'))
+
+        if baseclass is Unspecified:
+            baseclass = klass._CHEETAH_defaultBaseclassForTemplates
+        if isinstance(baseclass, Template):
+            baseclass = baseclass.__class__
+        t = type(baseclass)
+        if not (t is N or t is S or t is C or t is type):
+            raise TypeError(errmsg % ('baseclass', 'string, class or None'))
+
+        if cacheCompilationResults is Unspecified:
+            cacheCompilationResults = klass._CHEETAH_cacheCompilationResults
+        t = type(cacheCompilationResults)
+        if not (t is I or t is B):
+            raise TypeError(errmsg % ('cacheCompilationResults', 'boolean'))
+
+        if useCache is Unspecified:
+            useCache = klass._CHEETAH_useCompilationCache
+        t = type(useCache)
+        if not (t is I or t is B):
+            raise TypeError(errmsg % ('useCache', 'boolean'))
+
+        if compilerSettings is Unspecified:
+            compilerSettings = klass._getCompilerSettings(source, file) or {}
+        if type(compilerSettings) is not D:
+            raise TypeError(errmsg % ('compilerSettings', 'dictionary'))
+
+        if compilerClass is Unspecified:
+            compilerClass = klass._getCompilerClass(source, file)
+        if preprocessors is Unspecified:
+            preprocessors = klass._CHEETAH_preprocessors
+
+        if keepRefToGeneratedCode is Unspecified:
+            keepRefToGeneratedCode = klass._CHEETAH_keepRefToGeneratedCode
+        t = type(keepRefToGeneratedCode)
+        if not (t is I or t is B):
+            raise TypeError(errmsg % ('keepReftoGeneratedCode', 'boolean'))
+
+        t = type(moduleName)
+        if not (t is N or t is S):
+            raise TypeError(errmsg % ('moduleName', 'string or None'))
+        __orig_file__ = None
+        if not moduleName:
+            if file and type(file) in StringTypes:
+                moduleName = convertTmplPathToModuleName(file)
+                __orig_file__ = file
+            else:
+                moduleName = klass._CHEETAH_defaultModuleNameForTemplates
+
+        if className is Unspecified:
+            className = klass._CHEETAH_defaultClassNameForTemplates
+        t = type(className)
+        if not (t is N or t is S):
+            raise TypeError(errmsg % ('className', 'string or None'))
+        className = className or moduleName
+
+        if mainMethodName is Unspecified:
+            mainMethodName = klass._CHEETAH_defaultMainMethodNameForTemplates
+        t = type(mainMethodName)
+        if not (t is N or t is S):
+            raise TypeError(errmsg % ('mainMethodName', 'string or None'))
+
+        if moduleGlobals is Unspecified:
+            moduleGlobals = klass._CHEETAH_defaultModuleGlobalsForTemplates
+
+        if cacheModuleFilesForTracebacks is Unspecified:
+            cacheModuleFilesForTracebacks = klass._CHEETAH_cacheModuleFilesForTracebacks
+        t = type(cacheModuleFilesForTracebacks)
+        if not (t is I or t is B):
+            raise TypeError(errmsg %
+                            ('cacheModuleFilesForTracebacks', 'boolean'))
+
+        if cacheDirForModuleFiles is Unspecified:
+            cacheDirForModuleFiles = klass._CHEETAH_cacheDirForModuleFiles
+        t = type(cacheDirForModuleFiles)
+        if not (t is N or t is S):
+            raise TypeError(errmsg %
+                            ('cacheDirForModuleFiles', 'string or None'))
+
+        ##################################################           
+        ## handle any preprocessors
+        if preprocessors:
+            origSrc = source
+            source, file = klass._preprocessSource(source, file, preprocessors)
+
+        ##################################################                       
+        ## compilation, using cache if requested/possible
+        baseclassValue = None
+        baseclassName = None
+        if baseclass:
+            if type(baseclass) in StringTypes:
+                baseclassName = baseclass
+            elif type(baseclass) in (ClassType, type):
+                # @@TR: should soft-code this
+                baseclassName = 'CHEETAH_dynamicallyAssignedBaseClass_'+baseclass.__name__
+                baseclassValue = baseclass
+
+
+        cacheHash = None
+        cacheItem = None
+        if source or isinstance(file, basestring):
+            compilerSettingsHash = None
+            if compilerSettings:
+                compilerSettingsHash = hashDict(compilerSettings)
+
+            moduleGlobalsHash = None
+            if moduleGlobals:
+                moduleGlobalsHash = hashDict(moduleGlobals)
+
+            fileHash = None
+            if file:
+                fileHash = str(hash(file))
+                if globals()['__checkFileMtime']:
+                    fileHash += str(os.path.getmtime(file))
+                
+            try:
+                # @@TR: find some way to create a cacheHash that is consistent
+                # between process restarts.  It would allow for caching the
+                # compiled module on disk and thereby reduce the startup time
+                # for applications that use a lot of dynamically compiled
+                # templates.                
+                cacheHash = ''.join([str(v) for v in
+                                     [hash(source),
+                                      fileHash,
+                                      className,
+                                      moduleName,
+                                      mainMethodName,
+                                      hash(compilerClass),
+                                      hash(baseclass),
+                                      compilerSettingsHash,
+                                      moduleGlobalsHash,
+                                      hash(cacheDirForModuleFiles),
+                                      ]])
+            except:
+                #@@TR: should add some logging to this
+                pass
+        outputEncoding = 'ascii'
+        if useCache and cacheHash and cacheHash in klass._CHEETAH_compileCache:
+            cacheItem = klass._CHEETAH_compileCache[cacheHash]
+            generatedModuleCode = cacheItem.code
+        else:
+            compiler = compilerClass(source, file,
+                                     moduleName=moduleName,
+                                     mainClassName=className,
+                                     baseclassName=baseclassName,
+                                     mainMethodName=mainMethodName,
+                                     settings=(compilerSettings or {}))
+            if commandlineopts:
+                compiler.setShBang(commandlineopts.shbang)
+            compiler.compile()
+            generatedModuleCode = compiler.getModuleCode()
+            outputEncoding = compiler.getModuleEncoding()
+
+        if not returnAClass:
+            # This is a bit of a hackish solution to make sure we're setting the proper 
+            # encoding on generated code that is destined to be written to a file
+            if not outputEncoding == 'ascii':
+                generatedModuleCode = generatedModuleCode.split('\n')
+                generatedModuleCode.insert(1, '# -*- coding: %s -*-' % outputEncoding)
+                generatedModuleCode = '\n'.join(generatedModuleCode)
+            return generatedModuleCode.encode(outputEncoding)
+        else:
+            if cacheItem:
+                cacheItem.lastCheckoutTime = time.time()
+                return cacheItem.klass
+
+            try:
+                klass._CHEETAH_compileLock.acquire()
+                uniqueModuleName = _genUniqueModuleName(moduleName)
+                __file__ = uniqueModuleName+'.py' # relative file path with no dir part
+
+                if cacheModuleFilesForTracebacks:
+                    if not os.path.exists(cacheDirForModuleFiles):
+                        raise Exception('%s does not exist'%cacheDirForModuleFiles)
+
+                    __file__ = os.path.join(cacheDirForModuleFiles, __file__)
+                    # @@TR: might want to assert that it doesn't already exist
+                    open(__file__, 'w').write(generatedModuleCode)
+                    # @@TR: should probably restrict the perms, etc.
+
+                mod = new.module(str(uniqueModuleName))
+                if moduleGlobals:
+                    for k, v in moduleGlobals.items():
+                        setattr(mod, k, v)
+                mod.__file__ = __file__
+                if __orig_file__ and os.path.exists(__orig_file__):
+                    # this is used in the WebKit filemonitoring code
+                    mod.__orig_file__ = __orig_file__
+
+                if baseclass and baseclassValue:
+                    setattr(mod, baseclassName, baseclassValue)
+                ##
+                try:
+                    co = compile(generatedModuleCode, __file__, 'exec')
+                    exec co in mod.__dict__
+                except SyntaxError, e:
+                    try:
+                        parseError = genParserErrorFromPythonException(
+                            source, file, generatedModuleCode, exception=e)
+                    except:
+                        updateLinecache(__file__, generatedModuleCode)
+                        e.generatedModuleCode = generatedModuleCode
+                        raise e
+                    else:
+                        raise parseError
+                except Exception, e:
+                    updateLinecache(__file__, generatedModuleCode)
+                    e.generatedModuleCode = generatedModuleCode
+                    raise
+                ##
+                sys.modules[uniqueModuleName] = mod
+            finally:
+                klass._CHEETAH_compileLock.release()
+
+            templateClass = getattr(mod, className)
+
+            if (cacheCompilationResults
+                and cacheHash
+                and cacheHash not in klass._CHEETAH_compileCache):
+                
+                cacheItem = CompileCacheItem()
+                cacheItem.cacheTime = cacheItem.lastCheckoutTime = time.time()
+                cacheItem.code = generatedModuleCode
+                cacheItem.klass = templateClass
+                templateClass._CHEETAH_isInCompilationCache = True
+                klass._CHEETAH_compileCache[cacheHash] = cacheItem
+            else:
+                templateClass._CHEETAH_isInCompilationCache = False
+
+            if keepRefToGeneratedCode or cacheCompilationResults:
+                templateClass._CHEETAH_generatedModuleCode = generatedModuleCode                
+     
+            return templateClass
+    compile = classmethod(compile)
+
+    def subclass(klass, *args, **kws):
+        """Takes the same args as the .compile() classmethod and returns a
+        template that is a subclass of the template this method is called from.
+
+          T1 = Template.compile(' foo - $meth1 - bar\n#def meth1: this is T1.meth1')
+          T2 = T1.subclass('#implements meth1\n this is T2.meth1')
+        """
+        kws['baseclass'] = klass
+        if isinstance(klass, Template):
+            templateAPIClass = klass
+        else:
+            templateAPIClass = Template
+        return templateAPIClass.compile(*args, **kws)
+    subclass = classmethod(subclass)
+
+    def _preprocessSource(klass, source, file, preprocessors):
+        """Iterates through the .compile() classmethod's preprocessors argument
+        and pipes the source code through each each preprocessor.
+
+        It returns the tuple (source, file) which is then used by
+        Template.compile to finish the compilation.
+        """
+        if not isinstance(preprocessors, (list, tuple)):
+            preprocessors = [preprocessors]
+        for preprocessor in preprocessors:
+            preprocessor = klass._normalizePreprocessorArg(preprocessor)
+            source, file = preprocessor.preprocess(source, file)
+        return source, file
+    _preprocessSource = classmethod(_preprocessSource)
+
+    def _normalizePreprocessorArg(klass, arg):
+        """Used to convert the items in the .compile() classmethod's
+        preprocessors argument into real source preprocessors.  This permits the
+        use of several shortcut forms for defining preprocessors.
+        """
+        
+        if hasattr(arg, 'preprocess'):
+            return arg
+        elif callable(arg):
+            class WrapperPreprocessor:
+                def preprocess(self, source, file):
+                    return arg(source, file)
+            return WrapperPreprocessor()
+        else:
+            class Settings(object):
+                placeholderToken = None
+                directiveToken = None
+            settings = Settings()
+            if isinstance(arg, str) or isinstance(arg, (list, tuple)):
+                settings.tokens = arg
+            elif isinstance(arg, dict):
+                for k, v in arg.items():
+                    setattr(settings, k, v)   
+            else:
+                settings = arg
+
+            settings = klass._normalizePreprocessorSettings(settings)
+            return klass._CHEETAH_defaultPreprocessorClass(settings)
+
+    _normalizePreprocessorArg = classmethod(_normalizePreprocessorArg)
+        
+    def _normalizePreprocessorSettings(klass, settings):
+        settings.keepRefToGeneratedCode = True
+
+        def normalizeSearchList(searchList):
+            if not isinstance(searchList, (list, tuple)):
+                searchList = [searchList]
+            return searchList            
+
+        def normalizeTokens(tokens):
+            if isinstance(tokens, str):
+                return tokens.split() # space delimited string e.g.'@ %'
+            elif isinstance(tokens, (list, tuple)):
+                return tokens
+            else:
+                raise PreprocessError('invalid tokens argument: %r'%tokens)
+
+        if hasattr(settings, 'tokens'):
+            (settings.placeholderToken,
+             settings.directiveToken) = normalizeTokens(settings.tokens)
+            
+        if (not getattr(settings,'compilerSettings', None)
+            and not getattr(settings, 'placeholderToken', None) ):
+            
+            raise TypeError(
+                'Preprocessor requires either a "tokens" or a "compilerSettings" arg.'
+                ' Neither was provided.')
+
+        if not hasattr(settings, 'templateInitArgs'):
+            settings.templateInitArgs = {}
+        if 'searchList' not in settings.templateInitArgs:
+            if not hasattr(settings, 'searchList') and hasattr(settings, 'namespaces'):
+                settings.searchList = settings.namespaces
+            elif not hasattr(settings, 'searchList'):
+                settings.searchList = []
+            settings.templateInitArgs['searchList'] = settings.searchList
+        settings.templateInitArgs['searchList'] = (
+            normalizeSearchList(settings.templateInitArgs['searchList']))
+            
+        if not hasattr(settings, 'outputTransformer'):
+            settings.outputTransformer = unicode
+
+        if not hasattr(settings, 'templateAPIClass'):
+            class PreprocessTemplateAPIClass(klass): pass
+            settings.templateAPIClass = PreprocessTemplateAPIClass
+
+        if not hasattr(settings, 'compilerSettings'):
+            settings.compilerSettings = {}
+
+        klass._updateSettingsWithPreprocessTokens(
+            compilerSettings=settings.compilerSettings,
+            placeholderToken=settings.placeholderToken,
+            directiveToken=settings.directiveToken
+            )                            
+        return settings
+    _normalizePreprocessorSettings = classmethod(_normalizePreprocessorSettings)
+
+    def _updateSettingsWithPreprocessTokens(
+        klass, compilerSettings, placeholderToken, directiveToken):
+        
+        if (placeholderToken and 'cheetahVarStartToken' not in compilerSettings):
+            compilerSettings['cheetahVarStartToken'] = placeholderToken
+        if directiveToken:
+            if 'directiveStartToken' not in compilerSettings:
+                compilerSettings['directiveStartToken'] = directiveToken
+            if 'directiveEndToken' not in compilerSettings:
+                compilerSettings['directiveEndToken'] = directiveToken
+            if 'commentStartToken' not in compilerSettings:
+                compilerSettings['commentStartToken'] = directiveToken*2
+            if 'multiLineCommentStartToken' not in compilerSettings:
+                compilerSettings['multiLineCommentStartToken'] = (
+                    directiveToken+'*')
+            if 'multiLineCommentEndToken' not in compilerSettings:
+                compilerSettings['multiLineCommentEndToken'] = (
+                    '*'+directiveToken)
+            if 'EOLSlurpToken' not in compilerSettings:
+                compilerSettings['EOLSlurpToken'] = directiveToken
+    _updateSettingsWithPreprocessTokens = classmethod(_updateSettingsWithPreprocessTokens)
+
+    def _addCheetahPlumbingCodeToClass(klass, concreteTemplateClass):
+        """If concreteTemplateClass is not a subclass of Cheetah.Template, add
+        the required cheetah methods and attributes to it.
+
+        This is called on each new template class after it has been compiled.
+        If concreteTemplateClass is not a subclass of Cheetah.Template but
+        already has method with the same name as one of the required cheetah
+        methods, this will skip that method.
+        """
+        for methodname in klass._CHEETAH_requiredCheetahMethods:
+            if not hasattr(concreteTemplateClass, methodname):
+                method = getattr(Template, methodname)
+                newMethod = new.instancemethod(method.im_func, None, concreteTemplateClass)
+                #print methodname, method
+                setattr(concreteTemplateClass, methodname, newMethod)
+
+        for classMethName in klass._CHEETAH_requiredCheetahClassMethods:
+            if not hasattr(concreteTemplateClass, classMethName):
+                meth = getattr(klass, classMethName)
+                setattr(concreteTemplateClass, classMethName, classmethod(meth.im_func))
+            
+        for attrname in klass._CHEETAH_requiredCheetahClassAttributes:
+            attrname = '_CHEETAH_'+attrname
+            if not hasattr(concreteTemplateClass, attrname):
+                attrVal = getattr(klass, attrname)
+                setattr(concreteTemplateClass, attrname, attrVal)
+
+        if (not hasattr(concreteTemplateClass, '__str__')
+            or concreteTemplateClass.__str__ is object.__str__):
+            
+            mainMethNameAttr = '_mainCheetahMethod_for_'+concreteTemplateClass.__name__
+            mainMethName = getattr(concreteTemplateClass,mainMethNameAttr, None)
+            if mainMethName:
+                def __str__(self): 
+                    return getattr(self, mainMethName)()
+            elif (hasattr(concreteTemplateClass, 'respond')
+                  and concreteTemplateClass.respond!=Servlet.respond):
+                def __str__(self):
+                    return self.respond()
+            else:
+                def __str__(self):
+                    if hasattr(self, mainMethNameAttr):
+                        return getattr(self,mainMethNameAttr)()
+                    elif hasattr(self, 'respond'):
+                        return self.respond()
+                    else:
+                        return super(self.__class__, self).__str__()
+                    
+            __str__ = new.instancemethod(__str__, None, concreteTemplateClass)
+            setattr(concreteTemplateClass, '__str__', __str__)
+                
+    _addCheetahPlumbingCodeToClass = classmethod(_addCheetahPlumbingCodeToClass)
+
+    ## end classmethods ##
+
+    def __init__(self, source=None,
+
+                 namespaces=None, searchList=None,
+                 # use either or.  They are aliases for the same thing.
+                 
+                 file=None,
+                 filter='RawOrEncodedUnicode', # which filter from Cheetah.Filters
+                 filtersLib=Filters,
+                 errorCatcher=None,
+                 
+                 compilerSettings=Unspecified, # control the behaviour of the compiler
+                 _globalSetVars=None, # used internally for #include'd templates
+                 _preBuiltSearchList=None # used internally for #include'd templates
+                 ):        
+        """a) compiles a new template OR b) instantiates an existing template.
+
+        Read this docstring carefully as there are two distinct usage patterns.
+        You should also read this class' main docstring.
+        
+        a) to compile a new template:
+             t = Template(source=aSourceString)
+                 # or 
+             t = Template(file='some/path')
+                 # or 
+             t = Template(file=someFileObject)
+                 # or
+             namespaces = [{'foo':'bar'}]               
+             t = Template(source=aSourceString, namespaces=namespaces)
+                 # or 
+             t = Template(file='some/path', namespaces=namespaces)
+  
+             print t
+             
+        b) to create an instance of an existing, precompiled template class:
+             ## i) first you need a reference to a compiled template class:
+             tclass = Template.compile(source=src) # or just Template.compile(src)
+                 # or 
+             tclass = Template.compile(file='some/path')
+                 # or 
+             tclass = Template.compile(file=someFileObject)
+                 # or 
+             # if you used the command line compiler or have Cheetah's ImportHooks
+             # installed your template class is also available via Python's
+             # standard import mechanism:
+             from ACompileTemplate import AcompiledTemplate as tclass
+             
+             ## ii) then you create an instance
+             t = tclass(namespaces=namespaces)
+                 # or 
+             t = tclass(namespaces=namespaces, filter='RawOrEncodedUnicode')
+             print t
+
+        Arguments:
+          for usage pattern a)           
+            If you are compiling a new template, you must provide either a
+            'source' or 'file' arg, but not both:          
+              - source (string or None)
+              - file (string path, file-like object, or None)
+
+            Optional args (see below for more) :
+              - compilerSettings
+               Default: Template._CHEETAH_compilerSettings=None
+               
+               a dictionary of settings to override those defined in
+               DEFAULT_COMPILER_SETTINGS.  See
+               Cheetah.Template.DEFAULT_COMPILER_SETTINGS and the Users' Guide
+               for details.
+
+            You can pass the source arg in as a positional arg with this usage
+            pattern.  Use keywords for all other args.           
+
+          for usage pattern b)
+            Do not use positional args with this usage pattern, unless your
+            template subclasses something other than Cheetah.Template and you
+            want to pass positional args to that baseclass.  E.g.:
+              dictTemplate = Template.compile('hello $name from $caller', baseclass=dict)
+              tmplvars = dict(name='world', caller='me')
+              print dictTemplate(tmplvars)
+            This usage requires all Cheetah args to be passed in as keyword args.
+
+          optional args for both usage patterns:
+
+            - namespaces (aka 'searchList')
+              Default: None
+              
+              an optional list of namespaces (dictionaries, objects, modules,
+              etc.) which Cheetah will search through to find the variables
+              referenced in $placeholders.
+
+              If you provide a single namespace instead of a list, Cheetah will
+              automatically convert it into a list.
+                
+              NOTE: Cheetah does NOT force you to use the namespaces search list
+              and related features.  It's on by default, but you can turn if off
+              using the compiler settings useSearchList=False or
+              useNameMapper=False.
+                
+             - filter
+               Default: 'EncodeUnicode'
+               
+               Which filter should be used for output filtering. This should
+               either be a string which is the name of a filter in the
+               'filtersLib' or a subclass of Cheetah.Filters.Filter. . See the
+               Users' Guide for more details.
+
+             - filtersLib
+               Default: Cheetah.Filters
+               
+               A module containing subclasses of Cheetah.Filters.Filter. See the
+               Users' Guide for more details. 
+
+             - errorCatcher
+               Default: None
+
+               This is a debugging tool. See the Users' Guide for more details.
+               Do not use this or the #errorCatcher diretive with live
+               production systems.
+
+          Do NOT mess with the args _globalSetVars or _preBuiltSearchList!
+
+        """
+        
+        ##################################################           
+        ## Verify argument keywords and types
+
+        S = types.StringType; U = types.UnicodeType
+        L = types.ListType;   T = types.TupleType
+        D = types.DictType;   F = types.FileType
+        C = types.ClassType;  M = types.ModuleType
+        N = types.NoneType
+        errmsg = "arg '%s' must be %s"
+        errmsgextra = errmsg + "\n%s"
+
+        t = type(source)
+        if not (t is N or t is S or t is U):
+            raise TypeError(errmsg % ('source', 'string or None'))
+        t = type(file)
+        if not (t is N or t is S or t is U or t is F):
+            raise TypeError(errmsg %
+                            ('file', 'string, file open for reading, or None'))
+        t = type(filter)
+        if not (t is S or (t is C and issubclass(filter, Filters.Filter)) or
+                t is type):
+            raise TypeError(errmsgextra %
+                            ('filter', 'string or class',
+                             '(if class, must be subclass of Cheetah.Filters.Filter)'))
+        t = type(filtersLib)
+        if not (t is S or t is M):
+            raise TypeError(errmsgextra %
+                            ('filtersLib', 'string or module',
+                             '(if module, must contain subclasses of Cheetah.Filters.Filter)'))
+        t = type(errorCatcher)
+        if not (t is N or t is S or
+                (t is C and issubclass(errorCatcher, ErrorCatchers.ErrorCatcher)) or
+                t is type):
+            raise TypeError(errmsgextra %
+                            ('errorCatcher', 'string, class or None',
+                             '(if class, must be subclass of Cheetah.ErrorCatchers.ErrorCatcher)'))
+        if compilerSettings is not Unspecified:
+            if type(compilerSettings) is not D:
+                raise TypeError(errmsg %
+                                ('compilerSettings', 'dictionary'))
+        
+        if source is not None and file is not None:
+            raise TypeError("you must supply either a source string or the" + 
+                            " 'file' keyword argument, but not both")
+                    
+        ##################################################           
+        ## Do superclass initialization.
+        super(Template, self).__init__()
+
+        ##################################################           
+        ## Do required version check
+        if not hasattr(self, '_CHEETAH_versionTuple'):
+            try:
+                mod = sys.modules[self.__class__.__module__]
+                compiledVersion = mod.__CHEETAH_version__
+                compiledVersionTuple = convertVersionStringToTuple(compiledVersion)
+                if compiledVersionTuple < MinCompatibleVersionTuple:
+                    raise AssertionError(
+                     'This template was compiled with Cheetah version'
+                     ' %s. Templates compiled before version %s must be recompiled.'%(
+                        compiledVersion, MinCompatibleVersion))                    
+            except AssertionError:
+                raise 
+            except:
+                pass
+        
+        ##################################################           
+        ## Setup instance state attributes used during the life of template
+        ## post-compile
+        reserved_searchlist = dir(self)
+        if searchList:
+            for namespace in searchList:
+                if isinstance(namespace, dict):
+                    intersection = set(reserved_searchlist) & set(namespace.keys())
+                    warn = False
+                    if intersection:
+                        warn = True
+                    if isinstance(compilerSettings, dict) and compilerSettings.get('prioritizeSearchListOverSelf'):
+                        warn = False
+                    if warn:
+                        logging.info(''' The following keys are members of the Template class and will result in NameMapper collisions! ''')
+                        logging.info('''  > %s ''' % ', '.join(list(intersection)))
+                        logging.info(''' Please change the key's name or use the compiler setting "prioritizeSearchListOverSelf=True" to prevent the NameMapper from using ''')
+                        logging.info(''' the Template member in place of your searchList variable ''')
+                        
+
+        self._initCheetahInstance(
+            searchList=searchList, namespaces=namespaces,
+            filter=filter, filtersLib=filtersLib,
+            errorCatcher=errorCatcher,
+            _globalSetVars=_globalSetVars,
+            compilerSettings=compilerSettings,
+            _preBuiltSearchList=_preBuiltSearchList)
+        
+        ##################################################
+        ## Now, compile if we're meant to
+        if (source is not None) or (file is not None):
+            self._compile(source, file, compilerSettings=compilerSettings)
+
+    def generatedModuleCode(self):
+        """Return the module code the compiler generated, or None if no
+        compilation took place.
+        """
+        
+        return self._CHEETAH_generatedModuleCode
+    
+    def generatedClassCode(self):        
+        """Return the class code the compiler generated, or None if no
+        compilation took place.
+        """
+        
+        return self._CHEETAH_generatedModuleCode[
+                    self._CHEETAH_generatedModuleCode.find('\nclass '):
+                    self._CHEETAH_generatedModuleCode.find('\n## END CLASS DEFINITION')]
+    
+    def searchList(self):
+        """Return a reference to the searchlist
+        """
+        return self._CHEETAH__searchList
+
+    def errorCatcher(self):
+        """Return a reference to the current errorCatcher
+        """
+        return self._CHEETAH__errorCatcher
+
+    ## cache methods ##
+    def _getCacheStore(self):
+        if not self._CHEETAH__cacheStore:
+            if self._CHEETAH_cacheStore is not None:
+                self._CHEETAH__cacheStore = self._CHEETAH_cacheStore
+            else:
+                # @@TR: might want to provide a way to provide init args
+                self._CHEETAH__cacheStore = self._CHEETAH_cacheStoreClass()
+
+        return self._CHEETAH__cacheStore
+
+    def _getCacheStoreIdPrefix(self):
+        if self._CHEETAH_cacheStoreIdPrefix is not None:            
+            return self._CHEETAH_cacheStoreIdPrefix
+        else:
+            return str(id(self))
+    
+    def _createCacheRegion(self, regionID):
+        return self._CHEETAH_cacheRegionClass(
+            regionID=regionID,
+            templateCacheIdPrefix=self._getCacheStoreIdPrefix(),
+            cacheStore=self._getCacheStore())
+
+    def getCacheRegion(self, regionID, cacheInfo=None, create=True):
+        cacheRegion = self._CHEETAH__cacheRegions.get(regionID)
+        if not cacheRegion and create:
+            cacheRegion = self._createCacheRegion(regionID)
+            self._CHEETAH__cacheRegions[regionID] = cacheRegion
+        return cacheRegion        
+    
+    def getCacheRegions(self):
+        """Returns a dictionary of the 'cache regions' initialized in a
+        template.
+
+        Each #cache directive block or $*cachedPlaceholder is a separate 'cache
+        region'.        
+        """
+        # returns a copy to prevent users mucking it up
+        return self._CHEETAH__cacheRegions.copy()
+
+    def refreshCache(self, cacheRegionId=None, cacheItemId=None):        
+        """Refresh a cache region or a specific cache item within a region.
+        """
+        
+        if not cacheRegionId:
+            for key, cregion in self.getCacheRegions():
+                cregion.clear()
+        else:
+            cregion = self._CHEETAH__cacheRegions.get(cacheRegionId)
+            if not cregion:
+                return
+            if not cacheItemId: # clear the desired region and all its cacheItems
+                cregion.clear()
+            else: # clear one specific cache of a specific region
+                cache = cregion.getCacheItem(cacheItemId)
+                if cache:
+                    cache.clear()
+                    
+    ## end cache methods ##
+                    
+    def shutdown(self):
+        """Break reference cycles before discarding a servlet.
+        """
+        try:
+            Servlet.shutdown(self)
+        except:
+            pass
+        self._CHEETAH__searchList = None
+        self.__dict__ = {}
+            
+    ## utility functions ##   
+
+    def getVar(self, varName, default=Unspecified, autoCall=True):        
+        """Get a variable from the searchList.  If the variable can't be found
+        in the searchList, it returns the default value if one was given, or
+        raises NameMapper.NotFound.
+        """
+        
+        try:
+            return valueFromSearchList(self.searchList(), varName.replace('$',''), autoCall)
+        except NotFound:
+            if default is not Unspecified:
+                return default
+            else:
+                raise
+    
+    def varExists(self, varName, autoCall=True):
+        """Test if a variable name exists in the searchList.
+        """
+        try:
+            valueFromSearchList(self.searchList(), varName.replace('$',''), autoCall)
+            return True
+        except NotFound:
+            return False
+
+
+    hasVar = varExists
+
+
+    def i18n(self, message,
+             plural=None,
+             n=None,
+                   
+             id=None,
+             domain=None,
+             source=None,
+             target=None,
+             comment=None
+             ):
+        """This is just a stub at this time.
+
+	   plural = the plural form of the message
+	   n = a sized argument to distinguish between single and plural forms           
+
+      	   id = msgid in the translation catalog
+	   domain = translation domain
+	   source = source lang
+	   target = a specific target lang
+	   comment = a comment to the translation team
+
+        See the following for some ideas
+        http://www.zope.org/DevHome/Wikis/DevSite/Projects/ComponentArchitecture/ZPTInternationalizationSupport
+
+        Other notes:
+        - There is no need to replicate the i18n:name attribute from plone / PTL,
+          as cheetah placeholders serve the same purpose
+    
+    
+       """
+
+        return message
+
+    def getFileContents(self, path):
+        """A hook for getting the contents of a file.  The default
+        implementation just uses the Python open() function to load local files.
+        This method could be reimplemented to allow reading of remote files via
+        various protocols, as PHP allows with its 'URL fopen wrapper'
+        """
+        
+        fp = open(path,'r')
+        output = fp.read()
+        fp.close()
+        return output
+    
+    def runAsMainProgram(self):        
+        """Allows the Template to function as a standalone command-line program
+        for static page generation.
+
+        Type 'python yourtemplate.py --help to see what it's capabable of.
+        """
+
+        from TemplateCmdLineIface import CmdLineIface
+        CmdLineIface(templateObj=self).run()
+        
+    ##################################################
+    ## internal methods -- not to be called by end-users
+
+    def _initCheetahInstance(self,
+                             searchList=None,
+                             namespaces=None,
+                             filter='RawOrEncodedUnicode', # which filter from Cheetah.Filters
+                             filtersLib=Filters,
+                             errorCatcher=None,
+                             _globalSetVars=None,
+                             compilerSettings=None,
+                             _preBuiltSearchList=None):
+        """Sets up the instance attributes that cheetah templates use at
+        run-time.
+
+        This is automatically called by the __init__ method of compiled
+        templates.
+
+        Note that the names of instance attributes used by Cheetah are prefixed
+        with '_CHEETAH__' (2 underscores), where class attributes are prefixed
+        with '_CHEETAH_' (1 underscore).
+        """
+        if getattr(self, '_CHEETAH__instanceInitialized', False):
+            return
+
+        if namespaces is not None: 
+            assert searchList is None, (
+                'Provide "namespaces" or "searchList", not both!')
+            searchList = namespaces
+        if searchList is not None and not isinstance(searchList, (list, tuple)):
+            searchList = [searchList]
+
+        self._CHEETAH__globalSetVars = {}
+        if _globalSetVars is not None:
+            # this is intended to be used internally by Nested Templates in #include's
+            self._CHEETAH__globalSetVars = _globalSetVars
+            
+        if _preBuiltSearchList is not None:
+            # happens with nested Template obj creation from #include's
+            self._CHEETAH__searchList = list(_preBuiltSearchList)
+            self._CHEETAH__searchList.append(self)
+        else:
+            # create our own searchList
+            self._CHEETAH__searchList = [self._CHEETAH__globalSetVars, self]
+            if searchList is not None:
+                if isinstance(compilerSettings, dict) and compilerSettings.get('prioritizeSearchListOverSelf'):
+                    self._CHEETAH__searchList = searchList + self._CHEETAH__searchList
+                else:
+                    self._CHEETAH__searchList.extend(list(searchList))
+        self._CHEETAH__cheetahIncludes = {}
+        self._CHEETAH__cacheRegions = {}
+        self._CHEETAH__indenter = Indenter()
+
+        # @@TR: consider allowing simple callables as the filter argument
+        self._CHEETAH__filtersLib = filtersLib
+        self._CHEETAH__filters = {}
+        if isinstance(filter, basestring):
+            filterName = filter
+            klass = getattr(self._CHEETAH__filtersLib, filterName)
+        else:
+            klass = filter
+            filterName = klass.__name__            
+        self._CHEETAH__currentFilter = self._CHEETAH__filters[filterName] = klass(self).filter
+        self._CHEETAH__initialFilter = self._CHEETAH__currentFilter
+
+        self._CHEETAH__errorCatchers = {}
+        if errorCatcher:
+            if isinstance(errorCatcher, basestring):
+                errorCatcherClass = getattr(ErrorCatchers, errorCatcher)
+            elif type(errorCatcher) == ClassType:
+                errorCatcherClass = errorCatcher
+
+            self._CHEETAH__errorCatcher = ec = errorCatcherClass(self)
+            self._CHEETAH__errorCatchers[errorCatcher.__class__.__name__] = ec
+                                 
+        else:
+            self._CHEETAH__errorCatcher = None
+        self._CHEETAH__initErrorCatcher = self._CHEETAH__errorCatcher        
+
+        if not hasattr(self, 'transaction'):
+            self.transaction = None
+        self._CHEETAH__instanceInitialized = True
+        self._CHEETAH__isBuffering = False
+        self._CHEETAH__isControlledByWebKit = False 
+
+        self._CHEETAH__cacheStore = None
+        if self._CHEETAH_cacheStore is not None:
+            self._CHEETAH__cacheStore = self._CHEETAH_cacheStore
+        
+    def _compile(self, source=None, file=None, compilerSettings=Unspecified,
+                 moduleName=None, mainMethodName=None):
+        """Compile the template. This method is automatically called by
+        Template.__init__ it is provided with 'file' or 'source' args.
+
+        USERS SHOULD *NEVER* CALL THIS METHOD THEMSELVES.  Use Template.compile
+        instead.
+        """
+        if compilerSettings is Unspecified:
+            compilerSettings = self._getCompilerSettings(source, file) or {}        
+        mainMethodName = mainMethodName or self._CHEETAH_defaultMainMethodName
+        self._fileMtime = None
+        self._fileDirName = None
+        self._fileBaseName = None
+        if file and type(file) in StringTypes:
+            file = self.serverSidePath(file)
+            self._fileMtime = os.path.getmtime(file)
+            self._fileDirName, self._fileBaseName = os.path.split(file)
+        self._filePath = file
+        templateClass = self.compile(source, file,
+                                      moduleName=moduleName,
+                                      mainMethodName=mainMethodName,
+                                      compilerSettings=compilerSettings,
+                                      keepRefToGeneratedCode=True)
+        self.__class__ = templateClass
+        # must initialize it so instance attributes are accessible
+        templateClass.__init__(self,
+                               #_globalSetVars=self._CHEETAH__globalSetVars,
+                               #_preBuiltSearchList=self._CHEETAH__searchList
+                               )                               
+        if not hasattr(self, 'transaction'):
+            self.transaction = None
+
+    def _handleCheetahInclude(self, srcArg, trans=None, includeFrom='file', raw=False):        
+        """Called at runtime to handle #include directives.
+        """
+        _includeID = srcArg            
+        if not self._CHEETAH__cheetahIncludes.has_key(_includeID):
+            if not raw:
+                if includeFrom == 'file':
+                    source = None
+                    if type(srcArg) in StringTypes:
+                        if hasattr(self, 'serverSidePath'):
+                            file = path = self.serverSidePath(srcArg)
+                        else:
+                            file = path = os.path.normpath(srcArg)
+                    else:
+                        file = srcArg ## a file-like object
+                else:
+                    source = srcArg
+                    file = None
+                # @@TR: might want to provide some syntax for specifying the
+                # Template class to be used for compilation so compilerSettings
+                # can be changed.
+                compiler = self._getTemplateAPIClassForIncludeDirectiveCompilation(source, file)
+                nestedTemplateClass = compiler.compile(source=source,file=file)
+                nestedTemplate = nestedTemplateClass(_preBuiltSearchList=self.searchList(),
+                                                     _globalSetVars=self._CHEETAH__globalSetVars)
+                # Set the inner template filters to the initial filter of the
+                # outer template:
+                # this is the only really safe way to use
+                # filter='WebSafe'.
+                nestedTemplate._CHEETAH__initialFilter = self._CHEETAH__initialFilter
+                nestedTemplate._CHEETAH__currentFilter = self._CHEETAH__initialFilter   
+                self._CHEETAH__cheetahIncludes[_includeID] = nestedTemplate
+            else:
+                if includeFrom == 'file':
+                    path = self.serverSidePath(srcArg)
+                    self._CHEETAH__cheetahIncludes[_includeID] = self.getFileContents(path)
+                else:
+                    self._CHEETAH__cheetahIncludes[_includeID] = srcArg
+        ##
+        if not raw:
+            self._CHEETAH__cheetahIncludes[_includeID].respond(trans)
+        else:
+            trans.response().write(self._CHEETAH__cheetahIncludes[_includeID])
+
+    def _getTemplateAPIClassForIncludeDirectiveCompilation(self, source, file):
+        """Returns the subclass of Template which should be used to compile
+        #include directives.
+
+        This abstraction allows different compiler settings to be used in the
+        included template than were used in the parent.
+        """
+        if issubclass(self.__class__, Template):
+            return self.__class__
+        else:
+            return Template
+
+    ## functions for using templates as CGI scripts
+    def webInput(self, names, namesMulti=(), default='', src='f',
+        defaultInt=0, defaultFloat=0.00, badInt=0, badFloat=0.00, debug=False):
+        """Method for importing web transaction variables in bulk.
+
+        This works for GET/POST fields both in Webware servlets and in CGI
+        scripts, and for cookies and session variables in Webware servlets.  If
+        you try to read a cookie or session variable in a CGI script, you'll get
+        a RuntimeError.  'In a CGI script' here means 'not running as a Webware
+        servlet'.  If the CGI environment is not properly set up, Cheetah will
+        act like there's no input.
+
+        The public method provided is:
+
+          def webInput(self, names, namesMulti=(), default='', src='f',
+            defaultInt=0, defaultFloat=0.00, badInt=0, badFloat=0.00, debug=False):
+
+        This method places the specified GET/POST fields, cookies or session
+        variables into a dictionary, which is both returned and put at the
+        beginning of the searchList.  It handles:
+            
+            * single vs multiple values
+            * conversion to integer or float for specified names
+            * default values/exceptions for missing or bad values
+            * printing a snapshot of all values retrieved for debugging        
+
+        All the 'default*' and 'bad*' arguments have 'use or raise' behavior,
+        meaning that if they're a subclass of Exception, they're raised.  If
+        they're anything else, that value is substituted for the missing/bad
+        value.
+
+
+        The simplest usage is:
+
+            #silent $webInput(['choice'])
+            $choice
+
+            dic = self.webInput(['choice'])
+            write(dic['choice'])
+
+        Both these examples retrieves the GET/POST field 'choice' and print it.
+        If you leave off the'#silent', all the values would be printed too.  But
+        a better way to preview the values is
+
+            #silent $webInput(['name'], $debug=1)
+
+        because this pretty-prints all the values inside HTML <PRE> tags.
+
+        ** KLUDGE: 'debug' is supposed to insert into the template output, but it
+        wasn't working so I changed it to a'print' statement.  So the debugging
+        output will appear wherever standard output is pointed, whether at the
+        terminal, in a Webware log file, or whatever. ***
+
+        Since we didn't specify any coversions, the value is a string.  It's a
+        'single' value because we specified it in 'names' rather than
+        'namesMulti'. Single values work like this:
+        
+            * If one value is found, take it.
+            * If several values are found, choose one arbitrarily and ignore the rest.
+            * If no values are found, use or raise the appropriate 'default*' value.
+
+        Multi values work like this:
+            * If one value is found, put it in a list.
+            * If several values are found, leave them in a list.
+            * If no values are found, use the empty list ([]).  The 'default*' 
+              arguments are *not* consulted in this case.
+
+        Example: assume 'days' came from a set of checkboxes or a multiple combo
+        box on a form, and the user  chose'Monday', 'Tuesday' and 'Thursday'.
+
+            #silent $webInput([], ['days'])
+            The days you chose are: #slurp
+            #for $day in $days
+            $day #slurp
+            #end for
+
+            dic = self.webInput([], ['days'])
+            write('The days you chose are: ')
+            for day in dic['days']:
+                write(day + ' ')
+
+        Both these examples print:  'The days you chose are: Monday Tuesday Thursday'.
+
+        By default, missing strings are replaced by '' and missing/bad numbers
+        by zero.  (A'bad number' means the converter raised an exception for
+        it, usually because of non-numeric characters in the value.)  This
+        mimics Perl/PHP behavior, and simplifies coding for many applications
+        where missing/bad values *should* be blank/zero.  In those relatively
+        few cases where you must distinguish between empty-string/zero on the
+        one hand and missing/bad on the other, change the appropriate
+        'default*' and 'bad*' arguments to something like: 
+
+            * None
+            * another constant value
+            * $NonNumericInputError/self.NonNumericInputError
+            * $ValueError/ValueError
+            
+        (NonNumericInputError is defined in this class and is useful for
+        distinguishing between bad input vs a TypeError/ValueError thrown for
+        some other rason.)
+
+        Here's an example using multiple values to schedule newspaper
+        deliveries.  'checkboxes' comes from a form with checkboxes for all the
+        days of the week.  The days the user previously chose are preselected.
+        The user checks/unchecks boxes as desired and presses Submit.  The value
+        of 'checkboxes' is a list of checkboxes that were checked when Submit
+        was pressed.  Our task now is to turn on the days the user checked, turn
+        off the days he unchecked, and leave on or off the days he didn't
+        change.
+
+            dic = self.webInput([], ['dayCheckboxes'])
+            wantedDays = dic['dayCheckboxes'] # The days the user checked.
+            for day, on in self.getAllValues():
+                if   not on and wantedDays.has_key(day):
+                    self.TurnOn(day)
+                    # ... Set a flag or insert a database record ...
+                elif on and not wantedDays.has_key(day):
+                    self.TurnOff(day)
+                    # ... Unset a flag or delete a database record ...
+
+        'source' allows you to look up the variables from a number of different
+        sources:
+            'f'   fields (CGI GET/POST parameters)
+            'c'   cookies
+            's'   session variables
+            'v'   'values', meaning fields or cookies
+
+        In many forms, you're dealing only with strings, which is why the
+        'default' argument is third and the numeric arguments are banished to
+        the end.  But sometimes you want automatic number conversion, so that
+        you can do numeric comparisions in your templates without having to
+        write a bunch of conversion/exception handling code.  Example:
+
+            #silent $webInput(['name', 'height:int'])
+            $name is $height cm tall.
+            #if $height >= 300
+            Wow, you're tall!
+            #else
+            Pshaw, you're short.
+            #end if
+
+            dic = self.webInput(['name', 'height:int'])
+            name = dic[name]
+            height = dic[height]
+            write('%s is %s cm tall.' % (name, height))
+            if height > 300:
+                write('Wow, you're tall!')
+            else:
+                write('Pshaw, you're short.')
+
+        To convert a value to a number, suffix ':int' or ':float' to the name.
+        The method will search first for a 'height:int' variable and then for a
+        'height' variable.  (It will be called 'height' in the final
+        dictionary.)  If a numeric conversion fails, use or raise 'badInt' or
+        'badFloat'.  Missing values work the same way as for strings, except the
+        default is 'defaultInt' or 'defaultFloat' instead of 'default'.
+
+        If a name represents an uploaded file, the entire file will be read into
+        memory.  For more sophistocated file-upload handling, leave that name
+        out of the list and do your own handling, or wait for
+        Cheetah.Utils.UploadFileMixin.
+
+        This only in a subclass that also inherits from Webware's Servlet or
+        HTTPServlet.  Otherwise you'll get an AttributeError on 'self.request'.
+
+        EXCEPTIONS: ValueError if 'source' is not one of the stated characters.
+        TypeError if a conversion suffix is not ':int' or ':float'.
+
+        FUTURE EXPANSION: a future version of this method may allow source
+        cascading; e.g., 'vs' would look first in 'values' and then in session
+        variables.
+
+        Meta-Data
+        ================================================================================
+        Author: Mike Orr <iron@mso.oz.net>
+        License: This software is released for unlimited distribution under the
+                 terms of the MIT license.  See the LICENSE file.
+        Version: $Revision: 1.186 $
+        Start Date: 2002/03/17
+        Last Revision Date: $Date: 2008/03/10 04:48:11 $
+        """ 
+        src = src.lower()
+        isCgi = not self._CHEETAH__isControlledByWebKit
+        if   isCgi and src in ('f', 'v'):
+            global _formUsedByWebInput
+            if _formUsedByWebInput is None:
+                _formUsedByWebInput = cgi.FieldStorage()
+            source, func = 'field',   _formUsedByWebInput.getvalue
+        elif isCgi and src == 'c':
+            raise RuntimeError("can't get cookies from a CGI script")
+        elif isCgi and src == 's':
+            raise RuntimeError("can't get session variables from a CGI script")
+        elif isCgi and src == 'v':
+            source, func = 'value',   self.request().value
+        elif isCgi and src == 's':
+            source, func = 'session', self.request().session().value
+        elif src == 'f':
+            source, func = 'field',   self.request().field
+        elif src == 'c':
+            source, func = 'cookie',  self.request().cookie
+        elif src == 'v':
+            source, func = 'value',   self.request().value
+        elif src == 's':
+            source, func = 'session', self.request().session().value
+        else:
+            raise TypeError("arg 'src' invalid")
+        sources = source + 's'
+        converters = {
+            ''     : _Converter('string', None, default,      default ),
+            'int'  : _Converter('int',     int, defaultInt,   badInt  ),
+            'float': _Converter('float', float, defaultFloat, badFloat),  }
+        #pprint.pprint(locals());  return {}
+        dic = {} # Destination.
+        for name in names:
+            k, v = _lookup(name, func, False, converters)
+            dic[k] = v
+        for name in namesMulti:
+            k, v = _lookup(name, func, True, converters)
+            dic[k] = v
+        # At this point, 'dic' contains all the keys/values we want to keep.
+        # We could split the method into a superclass
+        # method for Webware/WebwareExperimental and a subclass for Cheetah.
+        # The superclass would merely 'return dic'.  The subclass would
+        # 'dic = super(ThisClass, self).webInput(names, namesMulti, ...)'
+        # and then the code below.
+        if debug:
+           print "<PRE>\n" + pprint.pformat(dic) + "\n</PRE>\n\n"
+        self.searchList().insert(0, dic)
+        return dic
+
+T = Template   # Short and sweet for debugging at the >>> prompt.
+
+
+def genParserErrorFromPythonException(source, file, generatedPyCode, exception):
+
+    #print dir(exception)
+    
+    filename = isinstance(file, (str, unicode)) and file or None
+
+    sio = StringIO.StringIO()
+    traceback.print_exc(1, sio)
+    formatedExc = sio.getvalue()
+    
+    if hasattr(exception, 'lineno'):
+        pyLineno = exception.lineno
+    else:
+        pyLineno = int(re.search('[ \t]*File.*line (\d+)', formatedExc).group(1))
+       
+    lines = generatedPyCode.splitlines()
+    
+    prevLines = []                  # (i, content)
+    for i in range(1,4):
+        if pyLineno-i <=0:
+            break
+        prevLines.append( (pyLineno+1-i,lines[pyLineno-i]) )
+    
+    nextLines = []                  # (i, content)
+    for i in range(1,4):
+        if not pyLineno+i < len(lines):
+            break
+        nextLines.append( (pyLineno+i,lines[pyLineno+i]) )
+    nextLines.reverse()
+    report = 'Line|Python Code\n'
+    report += '----|-------------------------------------------------------------\n'
+    while prevLines:
+        lineInfo = prevLines.pop()
+        report += "%(row)-4d|%(line)s\n"% {'row':lineInfo[0], 'line':lineInfo[1]}
+
+    if hasattr(exception, 'offset'):
+        report += ' '*(3+(exception.offset or 0)) + '^\n'
+    
+    while nextLines:
+        lineInfo = nextLines.pop()
+        report += "%(row)-4d|%(line)s\n"% {'row':lineInfo[0], 'line':lineInfo[1]}
+    
+    
+    message = [
+        "Error in the Python code which Cheetah generated for this template:",
+        '='*80,
+        '',
+        str(exception),
+        '',                            
+        report,
+        '='*80,
+        ]
+    cheetahPosMatch = re.search('line (\d+), col (\d+)', formatedExc)
+    if cheetahPosMatch:
+        lineno = int(cheetahPosMatch.group(1))
+        col = int(cheetahPosMatch.group(2))
+        #if hasattr(exception, 'offset'):
+        #    col = exception.offset
+        message.append('\nHere is the corresponding Cheetah code:\n')
+    else:
+        lineno = None
+        col = None
+        cheetahPosMatch = re.search('line (\d+), col (\d+)',
+                                    '\n'.join(lines[max(pyLineno-2, 0):]))
+        if cheetahPosMatch:
+            lineno = int(cheetahPosMatch.group(1))
+            col = int(cheetahPosMatch.group(2))
+            message.append('\nHere is the corresponding Cheetah code.')
+            message.append('** I had to guess the line & column numbers,'
+                           ' so they are probably incorrect:\n')
+
+    
+    message = '\n'.join(message)
+    reader = SourceReader(source, filename=filename)
+    return ParseError(reader, message, lineno=lineno,col=col)
+    
+
+# vim: shiftwidth=4 tabstop=4 expandtab
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Tests/Filters.py
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Tests/Filters.py (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Tests/Filters.py (revision 3)
@@ -0,0 +1,68 @@
+#!/usr/bin/env python
+
+import sys
+
+import Cheetah.Template
+import Cheetah.Filters
+
+import unittest_local_copy as unittest 
+
+majorVer, minorVer = sys.version_info[0], sys.version_info[1]
+versionTuple = (majorVer, minorVer)
+
+class BasicMarkdownFilterTest(unittest.TestCase):
+    '''
+        Test that our markdown filter works
+    '''
+    def test_BasicHeader(self):
+        template = '''  
+#from Cheetah.Filters import Markdown
+#transform Markdown
+$foo
+
+Header
+======
+        '''
+        expected = '''<p>bar</p>
+<h1>Header</h1>'''
+        try:
+            template = Cheetah.Template.Template(template, searchList=[{'foo' : 'bar'}])
+            template = str(template)
+            assert template == expected
+        except Exception, ex:
+            if ex.__class__.__name__ == 'MarkdownException' and majorVer == 2 and minorVer < 5:
+                print '>>> NOTE: Support for the Markdown filter will be broken for you. Markdown says: %s' % ex
+                return
+            raise
+
+
+class BasicCodeHighlighterFilterTest(unittest.TestCase):
+    '''
+        Test that our code highlighter filter works
+    '''
+    def test_Python(self):
+        template = '''  
+#from Cheetah.Filters import CodeHighlighter
+#transform CodeHighlighter
+
+def foo(self):
+    return '$foo'
+        '''
+        template = Cheetah.Template.Template(template, searchList=[{'foo' : 'bar'}])
+        template = str(template)
+        assert template, (template, 'We should have some content here...')
+
+    def test_Html(self):
+        template = '''  
+#from Cheetah.Filters import CodeHighlighter
+#transform CodeHighlighter
+
+<html><head></head><body>$foo</body></html>
+        '''
+        template = Cheetah.Template.Template(template, searchList=[{'foo' : 'bar'}])
+        template = str(template)
+        assert template, (template, 'We should have some content here...')
+
+
+if __name__ == '__main__':
+    unittest.main()
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Tests/SyntaxAndOutput.py
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Tests/SyntaxAndOutput.py (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Tests/SyntaxAndOutput.py (revision 3)
@@ -0,0 +1,3226 @@
+#!/usr/bin/env python
+# -*- coding: latin-1 -*-
+
+'''
+Syntax and Output tests.
+
+TODO
+- #finally
+- #filter
+- #errorCatcher
+- #echo
+- #silent
+'''
+
+
+##################################################
+## DEPENDENCIES ##
+
+import sys
+import types
+import re
+from copy import deepcopy
+import os
+import os.path
+import new
+import warnings
+import unittest
+
+from Cheetah.NameMapper import NotFound
+from Cheetah.NameMapper import C_VERSION as NameMapper_C_VERSION
+from Cheetah.Template import Template
+from Cheetah.Parser import ParseError
+from Cheetah.Compiler import Compiler, DEFAULT_COMPILER_SETTINGS
+
+class Unspecified(object):
+    pass
+
+majorVer, minorVer = sys.version_info[0], sys.version_info[1]
+versionTuple = (majorVer, minorVer)
+
+def testdecorator(func):
+    return func
+
+class DummyClass:
+    _called = False
+    def __str__(self):
+        return 'object'
+
+    def meth(self, arg="arff"):
+        return str(arg)
+
+    def meth1(self, arg="doo"):
+        return arg
+
+    def meth2(self, arg1="a1", arg2="a2"):
+        return str(arg1) + str(arg2)
+
+    def methWithPercentSignDefaultArg(self, arg1="110%"):
+        return str(arg1)
+
+    def callIt(self, arg=1234):
+        self._called = True
+        self._callArg = arg
+        
+
+def dummyFunc(arg="Scooby"):
+    return arg
+
+defaultTestNameSpace = {
+    'aStr':'blarg',
+    'anInt':1,
+    'aFloat':1.5,
+    'aList': ['item0','item1','item2'],
+    'aDict': {'one':'item1',
+              'two':'item2',
+              'nestedDict':{1:'nestedItem1',
+                          'two':'nestedItem2'
+                          },
+              'nestedFunc':dummyFunc,
+              },
+    'aFunc': dummyFunc,
+    'anObj': DummyClass(),
+    'aMeth': DummyClass().meth1,
+    'aStrToBeIncluded': "$aStr $anInt",
+    'none' : None,  
+    'emptyString':'',
+    'numOne':1,
+    'numTwo':2,
+    'zero':0,
+    'tenDigits': 1234567890,
+    'webSafeTest': 'abc <=> &',
+    'strip1': '  \t   strippable whitespace   \t\t  \n',
+    'strip2': '  \t   strippable whitespace   \t\t  ',
+    'strip3': '  \t   strippable whitespace   \t\t\n1 2  3\n',
+    
+    'blockToBeParsed':"""$numOne $numTwo""",
+    'includeBlock2':"""$numOne $numTwo $aSetVar""",
+    
+    'includeFileName':'parseTest.txt',
+    'listOfLambdas':[lambda x: x, lambda x: x, lambda x: x,],
+    'list': [
+    	{'index': 0, 'numOne': 1, 'numTwo': 2},
+    	{'index': 1, 'numOne': 1, 'numTwo': 2},
+        ],
+    'nameList': [('john', 'doe'), ('jane', 'smith')],
+    'letterList': ['a', 'b', 'c'],
+    '_': lambda x: 'Translated: ' + x,
+    'unicodeData':u'aoeu12345\u1234',
+    }
+
+
+##################################################
+## TEST BASE CLASSES
+
+class OutputTest(unittest.TestCase):
+    report = '''
+Template output mismatch: 
+
+    Input Template =
+%(template)s%(end)s
+
+    Expected Output =
+%(expected)s%(end)s
+
+    Actual Output =
+%(actual)s%(end)s'''
+
+    convertEOLs = True
+    _EOLreplacement = None
+    _debugEOLReplacement = False
+
+    DEBUGLEV = 0
+    _searchList = [defaultTestNameSpace]
+
+    _useNewStyleCompilation = True
+    #_useNewStyleCompilation = False
+
+    _extraCompileKwArgs = None
+
+    def searchList(self):
+        return self._searchList
+
+    def verify(self, input, expectedOutput,
+               inputEncoding=None,
+               outputEncoding=None,
+               convertEOLs=Unspecified):
+        if self._EOLreplacement:
+            if convertEOLs is Unspecified:
+                convertEOLs = self.convertEOLs
+            if convertEOLs:
+                input = input.replace('\n', self._EOLreplacement)
+                expectedOutput = expectedOutput.replace('\n', self._EOLreplacement)
+
+        self._input = input
+        if self._useNewStyleCompilation:
+            extraKwArgs = self._extraCompileKwArgs or {}
+            
+            templateClass = Template.compile(
+                source=input,
+                compilerSettings=self._getCompilerSettings(),
+                keepRefToGeneratedCode=True,
+                **extraKwArgs
+                )
+            moduleCode = templateClass._CHEETAH_generatedModuleCode
+            self.template = templateObj = templateClass(searchList=self.searchList())
+        else:
+            self.template = templateObj = Template(
+                input,
+                searchList=self.searchList(),
+                compilerSettings=self._getCompilerSettings(),
+                )
+            moduleCode = templateObj._CHEETAH_generatedModuleCode
+        if self.DEBUGLEV >= 1:
+            print moduleCode
+        try:
+            output = templateObj.respond() # rather than __str__, because of unicode
+            assert output==expectedOutput, self._outputMismatchReport(output, expectedOutput)
+        finally:
+            templateObj.shutdown()
+
+    def _getCompilerSettings(self):
+        return {}
+            
+    def _outputMismatchReport(self, output, expectedOutput):
+        if self._debugEOLReplacement and self._EOLreplacement:
+            EOLrepl = self._EOLreplacement
+            marker = '*EOL*'
+            return self.report % {'template': self._input.replace(EOLrepl,marker),
+                                  'expected': expectedOutput.replace(EOLrepl,marker),
+                                  'actual': output.replace(EOLrepl,marker),
+                                  'end': '(end)'}
+        else:
+            return self.report % {'template': self._input,
+                                  'expected': expectedOutput,
+                                  'actual': output,
+                                  'end': '(end)'}
+        
+    def genClassCode(self):
+        if hasattr(self, 'template'):
+            return self.template.generatedClassCode()
+
+    def genModuleCode(self):
+        if hasattr(self, 'template'):
+            return self.template.generatedModuleCode()
+
+##################################################
+## TEST CASE CLASSES
+
+class EmptyTemplate(OutputTest):
+    convertEOLs = False
+    def test1(self):
+        """an empty string for the template"""
+        
+        warnings.filterwarnings('error',
+                                'You supplied an empty string for the source!',
+                                UserWarning)
+        try:
+            self.verify("", "")
+        except UserWarning:
+            pass
+        else:
+            self.fail("Should warn about empty source strings.")
+        
+        try:
+            self.verify("#implements foo", "")
+        except NotImplementedError:
+            pass
+        else:
+            self.fail("This should barf about respond() not being implemented.")
+
+        self.verify("#implements respond", "")
+
+        self.verify("#implements respond(foo=1234)", "")
+
+
+class Backslashes(OutputTest):
+    convertEOLs = False
+
+    def setUp(self):
+        fp = open('backslashes.txt','w')
+        fp.write(r'\ #LogFormat "%h %l %u %t \"%r\" %>s %b"' + '\n\n\n\n\n\n\n')
+        fp.flush()
+        fp.close
+    
+    def tearDown(self):
+        if os.path.exists('backslashes.txt'):
+            os.remove('backslashes.txt')
+        
+    def test1(self):
+        """ a single \\ using rawstrings"""
+        self.verify(r"\ ",
+                    r"\ ")
+
+    def test2(self):
+        """ a single \\ using rawstrings and lots of lines"""
+        self.verify(r"\ " + "\n\n\n\n\n\n\n\n\n",
+                    r"\ " + "\n\n\n\n\n\n\n\n\n")
+
+    def test3(self):
+        """ a single \\ without using rawstrings"""
+        self.verify("\ \ ",
+                    "\ \ ")
+
+    def test4(self):
+        """ single line from an apache conf file"""
+        self.verify(r'#LogFormat "%h %l %u %t \"%r\" %>s %b"',
+                    r'#LogFormat "%h %l %u %t \"%r\" %>s %b"')
+
+    def test5(self):
+        """ single line from an apache conf file with many NEWLINES
+
+        The NEWLINES are used to make sure that MethodCompiler.commitStrConst()
+        is handling long and short strings in the same fashion.  It uses
+        triple-quotes for strings with lots of \\n in them and repr(theStr) for
+        shorter strings with only a few newlines."""
+        
+        self.verify(r'#LogFormat "%h %l %u %t \"%r\" %>s %b"' + '\n\n\n\n\n\n\n',
+                    r'#LogFormat "%h %l %u %t \"%r\" %>s %b"' + '\n\n\n\n\n\n\n')
+
+    def test6(self):
+        """ test backslash handling in an included file"""
+        self.verify(r'#include "backslashes.txt"',
+                    r'\ #LogFormat "%h %l %u %t \"%r\" %>s %b"' + '\n\n\n\n\n\n\n')
+
+    def test7(self):
+        """ a single \\ without using rawstrings plus many NEWLINES"""
+        self.verify("\ \ " + "\n\n\n\n\n\n\n\n\n",
+                    "\ \ " + "\n\n\n\n\n\n\n\n\n")
+
+    def test8(self):
+        """ single line from an apache conf file with single quotes and many NEWLINES 
+        """
+        
+        self.verify(r"""#LogFormat '%h %l %u %t \"%r\" %>s %b'""" + '\n\n\n\n\n\n\n',
+                    r"""#LogFormat '%h %l %u %t \"%r\" %>s %b'""" + '\n\n\n\n\n\n\n')
+        
+class NonTokens(OutputTest):
+    def test1(self):
+        """dollar signs not in Cheetah $vars"""
+        self.verify("$ $$ $5 $. $ test",
+                    "$ $$ $5 $. $ test")
+
+    def test2(self):
+        """hash not in #directives"""
+        self.verify("# \# #5 ",
+                    "# # #5 ")
+
+    def test3(self):
+        """escapted comments"""
+        self.verify("  \##escaped comment  ",
+                    "  ##escaped comment  ")
+
+    def test4(self):
+        """escapted multi-line comments"""
+        self.verify("  \#*escaped comment \n*#  ",
+                    "  #*escaped comment \n*#  ")
+
+    def test5(self):
+        """1 dollar sign"""
+        self.verify("$",
+                    "$")
+    def _X_test6(self):
+        """1 dollar sign followed by hash"""
+        self.verify("\n$#\n",
+                    "\n$#\n")
+
+    def test6(self):
+        """1 dollar sign followed by EOL Slurp Token"""
+        if DEFAULT_COMPILER_SETTINGS['EOLSlurpToken']:
+            self.verify("\n$%s\n"%DEFAULT_COMPILER_SETTINGS['EOLSlurpToken'],
+                        "\n$")
+        else:
+            self.verify("\n$#\n",
+                        "\n$#\n")
+            
+class Comments_SingleLine(OutputTest):
+    def test1(self):
+        """## followed by WS"""
+        self.verify("##    ",
+                    "")
+
+    def test2(self):
+        """## followed by NEWLINE"""
+        self.verify("##\n",
+                    "")
+
+    def test3(self):
+        """## followed by text then NEWLINE"""
+        self.verify("## oeuao aoe uaoe \n",
+                    "")
+    def test4(self):
+        """## gobbles leading WS"""
+        self.verify("    ## oeuao aoe uaoe \n",
+                    "")
+
+    def test5(self):
+        """## followed by text then NEWLINE, + leading WS"""
+        self.verify("    ## oeuao aoe uaoe \n",
+                    "")
+
+    def test6(self):
+        """## followed by EOF"""
+        self.verify("##",
+                    "")
+        
+    def test7(self):
+        """## followed by EOF with leading WS"""
+        self.verify("    ##",
+                    "")
+        
+    def test8(self):
+        """## gobble line
+        with text on previous and following lines"""
+        self.verify("line1\n   ## aoeu 1234   \nline2",
+                    "line1\nline2")
+
+    def test9(self):
+        """## don't gobble line
+        with text on previous and following lines"""
+        self.verify("line1\n 12 ## aoeu 1234   \nline2",
+                    "line1\n 12 \nline2")
+
+    def test10(self):
+        """## containing $placeholders
+        """
+        self.verify("##$a$b $c($d)",
+                    "")
+
+    def test11(self):
+        """## containing #for directive
+        """
+        self.verify("##for $i in range(15)",
+                    "")
+
+
+class Comments_MultiLine_NoGobble(OutputTest):
+    """
+    Multiline comments used to not gobble whitespace.  They do now, but this can
+    be turned off with a compilerSetting    
+    """
+
+    def _getCompilerSettings(self):
+        return {'gobbleWhitespaceAroundMultiLineComments':False}
+
+    def test1(self):
+        """#* *# followed by WS
+        Shouldn't gobble WS
+        """
+        self.verify("#* blarg *#   ",
+                    "   ")
+        
+    def test2(self):
+        """#* *# preceded and followed by WS
+        Shouldn't gobble WS
+        """
+        self.verify("   #* blarg *#   ",
+                    "      ")
+        
+    def test3(self):
+        """#* *# followed by WS, with NEWLINE
+        Shouldn't gobble WS
+        """
+        self.verify("#* \nblarg\n *#   ",
+                    "   ")
+        
+    def test4(self):
+        """#* *# preceded and followed by WS, with NEWLINE
+        Shouldn't gobble WS
+        """
+        self.verify("   #* \nblarg\n *#   ",
+                    "      ")
+
+class Comments_MultiLine(OutputTest):
+    """
+    Note: Multiline comments don't gobble whitespace!
+    """
+    
+    def test1(self):
+        """#* *# followed by WS
+        Should gobble WS
+        """
+        self.verify("#* blarg *#   ",
+                    "")
+        
+    def test2(self):
+        """#* *# preceded and followed by WS
+        Should gobble WS
+        """
+        self.verify("   #* blarg *#   ",
+                    "")
+        
+    def test3(self):
+        """#* *# followed by WS, with NEWLINE
+        Shouldn't gobble WS
+        """
+        self.verify("#* \nblarg\n *#   ",
+                    "")
+        
+    def test4(self):
+        """#* *# preceded and followed by WS, with NEWLINE
+        Shouldn't gobble WS
+        """
+        self.verify("   #* \nblarg\n *#   ",
+                    "")
+
+    def test5(self):
+        """#* *# containing nothing 
+        """
+        self.verify("#**#",
+                    "")
+        
+    def test6(self):
+        """#* *# containing only NEWLINES
+        """
+        self.verify("  #*\n\n\n\n\n\n\n\n*#  ",
+                    "")
+
+    def test7(self):
+        """#* *# containing $placeholders
+        """
+        self.verify("#* $var $var(1234*$c) *#",
+                    "")
+        
+    def test8(self):
+        """#* *# containing #for directive
+        """
+        self.verify("#* #for $i in range(15) *#",
+                    "")
+
+    def test9(self):
+        """ text around #* *# containing #for directive
+        """
+        self.verify("foo\nfoo bar #* #for $i in range(15) *# foo\n",
+                    "foo\nfoo bar  foo\n")
+
+    def test9(self):
+        """ text around #* *# containing #for directive and trailing whitespace
+        which should be gobbled
+        """
+        self.verify("foo\nfoo bar #* #for $i in range(15) *#   \ntest",
+                    "foo\nfoo bar \ntest")
+
+    def test10(self):
+        """ text around #* *# containing #for directive and newlines: trailing whitespace
+        which should be gobbled.
+        """
+        self.verify("foo\nfoo bar #* \n\n#for $i in range(15) \n\n*#   \ntest",
+                    "foo\nfoo bar \ntest")
+
+class Placeholders(OutputTest):
+    def test1(self):
+        """1 placeholder"""
+        self.verify("$aStr", "blarg")
+        
+    def test2(self):
+        """2 placeholders"""
+        self.verify("$aStr $anInt", "blarg 1")
+
+    def test3(self):
+        """2 placeholders, back-to-back"""
+        self.verify("$aStr$anInt", "blarg1")
+
+    def test4(self):
+        """1 placeholder enclosed in ()"""
+        self.verify("$(aStr)", "blarg")
+        
+    def test5(self):
+        """1 placeholder enclosed in {}"""
+        self.verify("${aStr}", "blarg")
+
+    def test6(self):
+        """1 placeholder enclosed in []"""
+        self.verify("$[aStr]", "blarg")
+
+    def test7(self):
+        """1 placeholder enclosed in () + WS
+
+        Test to make sure that $(<WS><identifier>.. matches
+        """
+        self.verify("$( aStr   )", "blarg")
+
+    def test8(self):
+        """1 placeholder enclosed in {} + WS"""
+        self.verify("${ aStr   }", "blarg")
+
+    def test9(self):
+        """1 placeholder enclosed in [] + WS"""
+        self.verify("$[ aStr   ]", "blarg")
+
+    def test10(self):
+        """1 placeholder enclosed in () + WS + * cache
+
+        Test to make sure that $*(<WS><identifier>.. matches
+        """
+        self.verify("$*( aStr   )", "blarg")
+
+    def test11(self):
+        """1 placeholder enclosed in {} + WS + *cache"""
+        self.verify("$*{ aStr   }", "blarg")
+
+    def test12(self):
+        """1 placeholder enclosed in [] + WS + *cache"""
+        self.verify("$*[ aStr   ]", "blarg")
+
+    def test13(self):
+        """1 placeholder enclosed in {} + WS + *<int>*cache"""
+        self.verify("$*5*{ aStr   }", "blarg")
+
+    def test14(self):
+        """1 placeholder enclosed in [] + WS + *<int>*cache"""
+        self.verify("$*5*[ aStr   ]", "blarg")
+
+    def test15(self):
+        """1 placeholder enclosed in {} + WS + *<float>*cache"""
+        self.verify("$*0.5d*{ aStr   }", "blarg")
+
+    def test16(self):
+        """1 placeholder enclosed in [] + WS + *<float>*cache"""
+        self.verify("$*.5*[ aStr   ]", "blarg")
+
+    def test17(self):
+        """1 placeholder + *<int>*cache"""
+        self.verify("$*5*aStr", "blarg")
+
+    def test18(self):
+        """1 placeholder *<float>*cache"""
+        self.verify("$*0.5h*aStr", "blarg")
+
+    def test19(self):
+        """1 placeholder surrounded by single quotes and multiple newlines"""
+        self.verify("""'\n\n\n\n'$aStr'\n\n\n\n'""",
+                    """'\n\n\n\n'blarg'\n\n\n\n'""")
+
+    def test20(self):
+        """silent mode $!placeholders """
+        self.verify("$!aStr$!nonExistant$!*nonExistant$!{nonExistant}", "blarg")
+
+        try:
+            self.verify("$!aStr$nonExistant",
+            "blarg")
+        except NotFound:
+            pass
+        else:
+            self.fail('should raise NotFound exception')
+
+    def test21(self):
+        """Make sure that $*caching is actually working"""
+        namesStr = 'You Me Them Everyone'
+        names = namesStr.split()
+
+        tmpl = Template.compile('#for name in $names: $name ', baseclass=dict)
+        assert str(tmpl({'names':names})).strip()==namesStr
+
+        tmpl = tmpl.subclass('#for name in $names: $*name ')
+        assert str(tmpl({'names':names}))=='You '*len(names)
+
+        tmpl = tmpl.subclass('#for name in $names: $*1*name ')
+        assert str(tmpl({'names':names}))=='You '*len(names)
+
+        tmpl = tmpl.subclass('#for name in $names: $*1*(name) ')
+        assert str(tmpl({'names':names}))=='You '*len(names)
+
+        if versionTuple > (2,2):
+            tmpl = tmpl.subclass('#for name in $names: $*1*(name) ')
+            assert str(tmpl(names=names))=='You '*len(names)
+
+class Placeholders_Vals(OutputTest):
+    convertEOLs = False
+    def test1(self):
+        """string"""
+        self.verify("$aStr", "blarg")
+
+    def test2(self):
+        """string - with whitespace"""
+        self.verify(" $aStr ", " blarg ")
+
+    def test3(self):
+        """empty string - with whitespace"""
+        self.verify("$emptyString", "")
+
+    def test4(self):
+        """int"""
+        self.verify("$anInt", "1")
+
+    def test5(self):
+        """float"""
+        self.verify("$aFloat", "1.5")
+
+    def test6(self):
+        """list"""
+        self.verify("$aList", "['item0', 'item1', 'item2']")
+
+    def test7(self):
+        """None
+
+        The default output filter is ReplaceNone.
+        """
+        self.verify("$none", "")
+
+    def test8(self):
+        """True, False
+        """
+        self.verify("$True $False", "%s %s"%(repr(True), repr(False)))
+
+    def test9(self):
+        """$_
+        """
+        self.verify("$_('foo')", "Translated: foo")
+
+class PlaceholderStrings(OutputTest):
+    def test1(self):
+        """some c'text $placeholder text' strings"""
+        self.verify("$str(c'$aStr')", "blarg")
+
+    def test2(self):
+        """some c'text $placeholder text' strings"""
+        self.verify("$str(c'$aStr.upper')", "BLARG")
+
+    def test3(self):
+        """some c'text $placeholder text' strings"""
+        self.verify("$str(c'$(aStr.upper.replace(c\"A$str()\",\"\"))')", "BLRG")
+
+    def test4(self):
+        """some c'text $placeholder text' strings"""
+        self.verify("#echo $str(c'$(aStr.upper)')", "BLARG")
+
+    def test5(self):
+        """some c'text $placeholder text' strings"""
+        self.verify("#if 1 then $str(c'$(aStr.upper)') else 0", "BLARG")
+
+    def test6(self):
+        """some c'text $placeholder text' strings"""
+        self.verify("#if 1\n$str(c'$(aStr.upper)')#slurp\n#else\n0#end if", "BLARG")
+
+    def test7(self):
+        """some c'text $placeholder text' strings"""
+        self.verify("#def foo(arg=c'$(\"BLARG\")')\n"
+                    "$arg#slurp\n"
+                    "#end def\n"
+                    "$foo()$foo(c'$anInt')#slurp",
+                    
+                    "BLARG1")
+
+
+
+class UnicodeStrings(OutputTest):
+    def test1(self):
+        """unicode data in placeholder
+        """
+        #self.verify(u"$unicodeData", defaultTestNameSpace['unicodeData'], outputEncoding='utf8')
+        self.verify(u"$unicodeData", defaultTestNameSpace['unicodeData'])
+
+    def test2(self):
+        """unicode data in body
+        """
+        self.verify(u"aoeu12345\u1234", u"aoeu12345\u1234")
+        #self.verify(u"#encoding utf8#aoeu12345\u1234", u"aoeu12345\u1234")
+
+class EncodingDirective(OutputTest):
+    def test1(self):
+        """basic #encoding """
+        self.verify("#encoding utf-8\n1234",
+                    "1234")
+
+    def test2(self):
+        """basic #encoding """
+        self.verify("#encoding ascii\n1234",
+                    "1234")
+
+    def test3(self):
+        """basic #encoding """
+        self.verify("#encoding utf-8\n\xe1\x88\xb4",
+                    u'\u1234', outputEncoding='utf8')
+
+    def test4(self):
+        """basic #encoding """
+        self.verify("#encoding latin-1\n\xe1\x88\xb4",
+                    u"\xe1\x88\xb4")
+
+    def test5(self):
+        """basic #encoding """
+        self.verify("#encoding latin-1\nAndr\202",
+                    u'Andr\202')
+
+class UnicodeDirective(OutputTest):
+    def test1(self):
+        """basic #unicode """
+        self.verify("#unicode utf-8\n1234",
+                    u"1234")
+        
+        self.verify("#unicode ascii\n1234",
+                    u"1234")
+
+        self.verify("#unicode latin-1\n1234",
+                    u"1234")
+
+        self.verify("#unicode latin-1\n1234�,
+                    u"1234�)
+        self.verify("#unicode: latin-1\n1234�,
+                    u"1234�)
+        self.verify("#  unicode  : latin-1\n1234�,
+                    u"1234�)
+
+        self.verify(u"#unicode latin-1\n1234�,
+                    u"1234�)
+
+        self.verify("#encoding latin-1\n1234�,
+                    u"1234�)
+
+class Placeholders_Esc(OutputTest):
+    convertEOLs = False
+    def test1(self):
+        """1 escaped placeholder"""
+        self.verify("\$var",
+                    "$var")
+    
+    def test2(self):
+        """2 escaped placeholders"""
+        self.verify("\$var \$_",
+                    "$var $_")
+
+    def test3(self):
+        """2 escaped placeholders - back to back"""
+        self.verify("\$var\$_",
+                    "$var$_")
+
+    def test4(self):
+        """2 escaped placeholders - nested"""
+        self.verify("\$var(\$_)",
+                    "$var($_)")
+
+    def test5(self):
+        """2 escaped placeholders - nested and enclosed"""
+        self.verify("\$(var(\$_)",
+                    "$(var($_)")
+
+
+class Placeholders_Calls(OutputTest):
+    def test1(self):
+        """func placeholder - no ()"""
+        self.verify("$aFunc",
+                    "Scooby")
+
+    def test2(self):
+        """func placeholder - with ()"""
+        self.verify("$aFunc()",
+                    "Scooby")
+
+    def test3(self):
+        r"""func placeholder - with (\n\n)"""
+        self.verify("$aFunc(\n\n)",
+                    "Scooby", convertEOLs=False)
+
+    def test4(self):
+        r"""func placeholder - with (\n\n) and $() enclosure"""
+        self.verify("$(aFunc(\n\n))",
+                    "Scooby", convertEOLs=False)
+
+    def test5(self):
+        r"""func placeholder - with (\n\n) and ${} enclosure"""
+        self.verify("${aFunc(\n\n)}",
+                    "Scooby", convertEOLs=False)
+        
+    def test6(self):
+        """func placeholder - with (int)"""
+        self.verify("$aFunc(1234)",
+                    "1234")
+
+    def test7(self):
+        r"""func placeholder - with (\nint\n)"""
+        self.verify("$aFunc(\n1234\n)",
+                    "1234", convertEOLs=False)
+    def test8(self):
+        """func placeholder - with (string)"""
+        self.verify("$aFunc('aoeu')",
+                    "aoeu")
+        
+    def test9(self):
+        """func placeholder - with ('''string''')"""
+        self.verify("$aFunc('''aoeu''')",
+                    "aoeu")
+    def test10(self):
+        r"""func placeholder - with ('''\nstring\n''')"""
+        self.verify("$aFunc('''\naoeu\n''')",
+                    "\naoeu\n")
+
+    def test11(self):
+        r"""func placeholder - with ('''\nstring'\n''')"""
+        self.verify("$aFunc('''\naoeu'\n''')",
+                    "\naoeu'\n")
+
+    def test12(self):
+        r'''func placeholder - with ("""\nstring\n""")'''
+        self.verify('$aFunc("""\naoeu\n""")',
+                    "\naoeu\n")
+
+    def test13(self):
+        """func placeholder - with (string*int)"""
+        self.verify("$aFunc('aoeu'*2)",
+                    "aoeuaoeu")
+
+    def test14(self):
+        """func placeholder - with (int*int)"""
+        self.verify("$aFunc(2*2)",
+                    "4")
+
+    def test15(self):
+        """func placeholder - with (int*float)"""
+        self.verify("$aFunc(2*2.0)",
+                    "4.0")
+
+    def test16(self):
+        r"""func placeholder - with (int\n*\nfloat)"""
+        self.verify("$aFunc(2\n*\n2.0)",
+                    "4.0", convertEOLs=False)
+
+    def test17(self):
+        """func placeholder - with ($arg=float)"""
+        self.verify("$aFunc($arg=4.0)",
+                    "4.0")
+
+    def test18(self):
+        """func placeholder - with (arg=float)"""
+        self.verify("$aFunc(arg=4.0)",
+                    "4.0")
+
+    def test19(self):
+        """deeply nested argstring, no enclosure"""
+        self.verify("$aFunc($arg=$aMeth($arg=$aFunc(1)))",
+                    "1")
+
+    def test20(self):
+        """deeply nested argstring, no enclosure + with WS"""
+        self.verify("$aFunc(  $arg = $aMeth( $arg = $aFunc( 1 ) ) )",
+                    "1")
+    def test21(self):
+        """deeply nested argstring, () enclosure + with WS"""
+        self.verify("$(aFunc(  $arg = $aMeth( $arg = $aFunc( 1 ) ) ) )",
+                    "1")
+        
+    def test22(self):
+        """deeply nested argstring, {} enclosure + with WS"""
+        self.verify("${aFunc(  $arg = $aMeth( $arg = $aFunc( 1 ) ) ) }",
+                    "1")
+
+    def test23(self):
+        """deeply nested argstring, [] enclosure + with WS"""
+        self.verify("$[aFunc(  $arg = $aMeth( $arg = $aFunc( 1 ) ) ) ]",
+                    "1")
+
+    def test24(self):
+        """deeply nested argstring, () enclosure + *cache"""
+        self.verify("$*(aFunc(  $arg = $aMeth( $arg = $aFunc( 1 ) ) ) )",
+                    "1")
+    def test25(self):
+        """deeply nested argstring, () enclosure + *15*cache"""
+        self.verify("$*15*(aFunc(  $arg = $aMeth( $arg = $aFunc( 1 ) ) ) )",
+                    "1")
+
+    def test26(self):
+        """a function call with the Python None kw."""
+        self.verify("$aFunc(None)",
+                    "")
+
+class NameMapper(OutputTest):
+    def test1(self):
+        """autocalling"""
+        self.verify("$aFunc! $aFunc().",
+                    "Scooby! Scooby.")
+
+    def test2(self):
+        """nested autocalling"""
+        self.verify("$aFunc($aFunc).",
+                    "Scooby.")
+
+    def test3(self):
+        """list subscription"""
+        self.verify("$aList[0]",
+                    "item0")
+
+    def test4(self):
+        """list slicing"""
+        self.verify("$aList[:2]",
+                    "['item0', 'item1']")
+        
+    def test5(self):
+        """list slicing and subcription combined"""
+        self.verify("$aList[:2][0]",
+                    "item0")
+
+    def test6(self):
+        """dictionary access - NameMapper style"""
+        self.verify("$aDict.one",
+                    "item1")
+        
+    def test7(self):
+        """dictionary access - Python style"""
+        self.verify("$aDict['one']",
+                    "item1")
+
+    def test8(self):
+        """dictionary access combined with autocalled string method"""
+        self.verify("$aDict.one.upper",
+                    "ITEM1")
+
+    def test9(self):
+        """dictionary access combined with string method"""
+        self.verify("$aDict.one.upper()",
+                    "ITEM1")
+
+    def test10(self):
+        """nested dictionary access - NameMapper style"""
+        self.verify("$aDict.nestedDict.two",
+                    "nestedItem2")
+        
+    def test11(self):
+        """nested dictionary access - Python style"""
+        self.verify("$aDict['nestedDict']['two']",
+                    "nestedItem2")
+
+    def test12(self):
+        """nested dictionary access - alternating style"""
+        self.verify("$aDict['nestedDict'].two",
+                    "nestedItem2")
+
+    def test13(self):
+        """nested dictionary access using method - alternating style"""
+        self.verify("$aDict.get('nestedDict').two",
+                    "nestedItem2")
+
+    def test14(self):
+        """nested dictionary access - NameMapper style - followed by method"""
+        self.verify("$aDict.nestedDict.two.upper",
+                    "NESTEDITEM2")
+
+    def test15(self):
+        """nested dictionary access - alternating style - followed by method"""
+        self.verify("$aDict['nestedDict'].two.upper",
+                    "NESTEDITEM2")
+
+    def test16(self):
+        """nested dictionary access - NameMapper style - followed by method, then slice"""
+        self.verify("$aDict.nestedDict.two.upper[:4]",
+                    "NEST")
+
+    def test17(self):
+        """nested dictionary access - Python style using a soft-coded key"""
+        self.verify("$aDict[$anObj.meth('nestedDict')].two",
+                    "nestedItem2")
+
+    def test18(self):
+        """object method access"""
+        self.verify("$anObj.meth1",
+                    "doo")
+
+    def test19(self):
+        """object method access, followed by complex slice"""
+        self.verify("$anObj.meth1[0: ((4/4*2)*2)/$anObj.meth1(2) ]",
+                    "do")
+
+    def test20(self):
+        """object method access, followed by a very complex slice
+        If it can pass this one, it's safe to say it works!!"""
+        self.verify("$( anObj.meth1[0:\n (\n(4/4*2)*2)/$anObj.meth1(2)\n ] )",
+                    "do")
+
+    def test21(self):
+        """object method access with % in the default arg for the meth.
+
+        This tests a bug that Jeff Johnson found and submitted a patch to SF
+        for."""
+        
+        self.verify("$anObj.methWithPercentSignDefaultArg",
+                    "110%")
+
+
+#class NameMapperDict(OutputTest):
+#
+#    _searchList = [{"update": "Yabba dabba doo!"}]
+#
+#    def test1(self):
+#        if NameMapper_C_VERSION:
+#            return # This feature is not in the C version yet.
+#        self.verify("$update", "Yabba dabba doo!")
+#
+
+class CacheDirective(OutputTest):
+    
+    def test1(self):
+        r"""simple #cache """
+        self.verify("#cache:$anInt",
+                    "1")
+
+    def test2(self):
+        r"""simple #cache + WS"""
+        self.verify("  #cache  \n$anInt#end cache",
+                    "1")
+
+    def test3(self):
+        r"""simple #cache ... #end cache"""
+        self.verify("""#cache id='cache1', timer=150m
+$anInt
+#end cache
+$aStr""",
+                    "1\nblarg")
+        
+    def test4(self):
+        r"""2 #cache ... #end cache blocks"""
+        self.verify("""#slurp
+#def foo
+#cache ID='cache1', timer=150m
+$anInt
+#end cache
+#cache id='cache2', timer=15s
+ #for $i in range(5)
+$i#slurp
+ #end for
+#end cache
+$aStr#slurp
+#end def
+$foo$foo$foo$foo$foo""",
+                    "1\n01234blarg"*5)
+
+
+    def test5(self):
+        r"""nested #cache blocks"""
+        self.verify("""#slurp
+#def foo      
+#cache ID='cache1', timer=150m
+$anInt
+#cache id='cache2', timer=15s
+ #for $i in range(5)
+$i#slurp
+ #end for
+$*(6)#slurp
+#end cache
+#end cache
+$aStr#slurp
+#end def
+$foo$foo$foo$foo$foo""",
+                    "1\n012346blarg"*5)
+        
+    def test6(self):
+        r"""Make sure that partial directives don't match"""
+        self.verify("#cache_foo",
+                    "#cache_foo")
+        self.verify("#cached",
+                    "#cached")
+
+class CallDirective(OutputTest):
+    
+    def test1(self):
+        r"""simple #call """
+        self.verify("#call int\n$anInt#end call",
+                    "1")
+        # single line version
+        self.verify("#call int: $anInt",
+                    "1")
+        self.verify("#call int: 10\n$aStr",
+                    "10\nblarg")
+
+    def test2(self):
+        r"""simple #call + WS"""
+        self.verify("#call int\n$anInt  #end call",
+                    "1")
+
+    def test3(self):
+        r"""a longer #call"""
+        self.verify('''\
+#def meth(arg)
+$arg.upper()#slurp
+#end def
+#call $meth
+$(1234+1) foo#slurp
+#end call''',
+        "1235 FOO")
+
+    def test4(self):
+        r"""#call with keyword #args"""
+        self.verify('''\
+#def meth(arg1, arg2)
+$arg1.upper() - $arg2.lower()#slurp
+#end def
+#call self.meth
+#arg arg1
+$(1234+1) foo#slurp
+#arg arg2
+UPPER#slurp
+#end call''',
+        "1235 FOO - upper")
+
+    def test5(self):
+        r"""#call with single-line keyword #args """
+        self.verify('''\
+#def meth(arg1, arg2)
+$arg1.upper() - $arg2.lower()#slurp
+#end def
+#call self.meth
+#arg arg1:$(1234+1) foo#slurp
+#arg arg2:UPPER#slurp
+#end call''',
+        "1235 FOO - upper")
+        
+    def test6(self):
+        """#call with python kwargs and cheetah output for the 1s positional
+        arg"""
+        
+        self.verify('''\
+#def meth(arg1, arg2)
+$arg1.upper() - $arg2.lower()#slurp
+#end def
+#call self.meth arg2="UPPER"
+$(1234+1) foo#slurp
+#end call''',
+        "1235 FOO - upper")
+
+    def test7(self):
+        """#call with python kwargs and #args"""
+        self.verify('''\
+#def meth(arg1, arg2, arg3)
+$arg1.upper() - $arg2.lower() - $arg3#slurp
+#end def
+#call self.meth arg2="UPPER", arg3=999
+#arg arg1:$(1234+1) foo#slurp
+#end call''',
+        "1235 FOO - upper - 999")
+        
+    def test8(self):
+        """#call with python kwargs and #args, and using a function to get the
+        function that will be called"""
+        self.verify('''\
+#def meth(arg1, arg2, arg3)
+$arg1.upper() - $arg2.lower() - $arg3#slurp
+#end def
+#call getattr(self, "meth") arg2="UPPER", arg3=999
+#arg arg1:$(1234+1) foo#slurp
+#end call''',
+        "1235 FOO - upper - 999")
+
+    def test9(self):
+        """nested #call directives"""
+        self.verify('''\
+#def meth(arg1)
+$arg1#slurp
+#end def
+#def meth2(x,y)
+$x$y#slurp
+#end def
+##
+#call self.meth
+1#slurp
+#call self.meth
+2#slurp
+#call self.meth
+3#slurp
+#end call 3
+#set two = 2
+#call self.meth2 y=c"$(10/$two)"
+#arg x
+4#slurp
+#end call 4
+#end call 2
+#end call 1''',
+        "12345")
+
+
+
+class I18nDirective(OutputTest):   
+    def test1(self):
+        r"""simple #call """
+        self.verify("#i18n \n$anInt#end i18n",
+                    "1")
+        
+        # single line version
+        self.verify("#i18n: $anInt",
+                    "1")
+        self.verify("#i18n: 10\n$aStr",
+                    "10\nblarg")
+
+
+class CaptureDirective(OutputTest):
+    def test1(self):
+        r"""simple #capture"""
+        self.verify('''\
+#capture cap1
+$(1234+1) foo#slurp
+#end capture
+$cap1#slurp
+''',
+        "1235 foo")
+
+
+    def test2(self):
+        r"""slightly more complex #capture"""
+        self.verify('''\
+#def meth(arg)
+$arg.upper()#slurp
+#end def
+#capture cap1
+$(1234+1) $anInt $meth("foo")#slurp
+#end capture
+$cap1#slurp
+''',
+        "1235 1 FOO")
+
+
+class SlurpDirective(OutputTest):
+    def test1(self):
+        r"""#slurp with 1 \n """
+        self.verify("#slurp\n",
+                    "")
+
+    def test2(self):
+        r"""#slurp with 1 \n, leading whitespace
+        Should gobble"""
+        self.verify("       #slurp\n",
+                    "")
+        
+    def test3(self):
+        r"""#slurp with 1 \n, leading content
+        Shouldn't gobble"""
+        self.verify(" 1234 #slurp\n",
+                    " 1234 ")
+        
+    def test4(self):
+        r"""#slurp with WS then \n, leading content
+        Shouldn't gobble"""
+        self.verify(" 1234 #slurp    \n",
+                    " 1234 ")
+
+    def test5(self):
+        r"""#slurp with garbage chars then \n, leading content
+        Should eat the garbage"""
+        self.verify(" 1234 #slurp garbage   \n",
+                    " 1234 ")
+
+
+
+class EOLSlurpToken(OutputTest):
+    _EOLSlurpToken = DEFAULT_COMPILER_SETTINGS['EOLSlurpToken']
+    def test1(self):
+        r"""#slurp with 1 \n """
+        self.verify("%s\n"%self._EOLSlurpToken,
+                    "")
+
+    def test2(self):
+        r"""#slurp with 1 \n, leading whitespace
+        Should gobble"""
+        self.verify("       %s\n"%self._EOLSlurpToken,
+                    "")
+    def test3(self):
+        r"""#slurp with 1 \n, leading content
+        Shouldn't gobble"""
+        self.verify(" 1234 %s\n"%self._EOLSlurpToken,
+                    " 1234 ")
+        
+    def test4(self):
+        r"""#slurp with WS then \n, leading content
+        Shouldn't gobble"""
+        self.verify(" 1234 %s    \n"%self._EOLSlurpToken,
+                    " 1234 ")
+
+    def test5(self):
+        r"""#slurp with garbage chars then \n, leading content
+        Should NOT eat the garbage"""
+        self.verify(" 1234 %s garbage   \n"%self._EOLSlurpToken,
+                    " 1234 %s garbage   \n"%self._EOLSlurpToken)
+
+if not DEFAULT_COMPILER_SETTINGS['EOLSlurpToken']:
+    del EOLSlurpToken
+
+class RawDirective(OutputTest):
+    def test1(self):
+        """#raw till EOF"""
+        self.verify("#raw\n$aFunc().\n\n",
+                    "$aFunc().\n\n")
+
+    def test2(self):
+        """#raw till #end raw"""
+        self.verify("#raw\n$aFunc().\n#end raw\n$anInt",
+                    "$aFunc().\n1")
+        
+    def test3(self):
+        """#raw till #end raw gobble WS"""
+        self.verify("  #raw  \n$aFunc().\n   #end raw  \n$anInt",
+                    "$aFunc().\n1")
+
+    def test4(self):
+        """#raw till #end raw using explicit directive closure
+        Shouldn't gobble"""
+        self.verify("  #raw  #\n$aFunc().\n   #end raw  #\n$anInt",
+                    "  \n$aFunc().\n\n1")
+
+    def test5(self):
+        """single-line short form #raw: """
+        self.verify("#raw: $aFunc().\n\n",
+                    "$aFunc().\n\n")
+
+        self.verify("#raw: $aFunc().\n$anInt",
+                    "$aFunc().\n1")
+
+class BreakpointDirective(OutputTest):
+    def test1(self):
+        """#breakpoint part way through source code"""
+        self.verify("$aFunc(2).\n#breakpoint\n$anInt",
+                    "2.\n")
+
+    def test2(self):
+        """#breakpoint at BOF"""
+        self.verify("#breakpoint\n$anInt",
+                    "")
+
+    def test3(self):
+        """#breakpoint at EOF"""
+        self.verify("$anInt\n#breakpoint",
+                    "1\n")
+
+
+class StopDirective(OutputTest):
+    def test1(self):
+        """#stop part way through source code"""
+        self.verify("$aFunc(2).\n#stop\n$anInt",
+                    "2.\n")
+
+    def test2(self):
+        """#stop at BOF"""
+        self.verify("#stop\n$anInt",
+                    "")
+
+    def test3(self):
+        """#stop at EOF"""
+        self.verify("$anInt\n#stop",
+                    "1\n")
+
+    def test4(self):
+        """#stop in pos test block"""
+        self.verify("""$anInt
+#if 1
+inside the if block
+#stop
+#end if
+blarg""",
+        "1\ninside the if block\n")
+
+    def test5(self):
+        """#stop in neg test block"""
+        self.verify("""$anInt
+#if 0
+inside the if block
+#stop
+#end if
+blarg""",
+        "1\nblarg")
+
+
+class ReturnDirective(OutputTest):
+    
+    def test1(self):
+        """#return'ing an int """
+        self.verify("""1
+$str($test-6)
+3
+#def test
+#if 1
+#return (3   *2)  \
+  + 2 
+#else
+aoeuoaeu
+#end if
+#end def
+""",
+                    "1\n2\n3\n")
+
+    def test2(self):
+        """#return'ing an string """
+        self.verify("""1
+$str($test[1])
+3
+#def test
+#if 1
+#return '123'
+#else
+aoeuoaeu
+#end if
+#end def
+""",
+                    "1\n2\n3\n")
+
+    def test3(self):
+        """#return'ing an string AND streaming other output via the transaction"""
+        self.verify("""1
+$str($test(trans=trans)[1])
+3
+#def test
+1.5
+#if 1
+#return '123'
+#else
+aoeuoaeu
+#end if
+#end def
+""",
+                    "1\n1.5\n2\n3\n")
+
+
+class YieldDirective(OutputTest):
+    convertEOLs = False
+    def test1(self):
+        """simple #yield """
+        
+        src1 = """#for i in range(10)\n#yield i\n#end for"""
+        src2 = """#for i in range(10)\n$i#slurp\n#yield\n#end for"""
+        src3 = ("#def iterator\n"
+               "#for i in range(10)\n#yield i\n#end for\n"
+               "#end def\n"
+               "#for i in $iterator\n$i#end for"
+               )
+
+
+        for src in (src1,src2,src3):
+            klass = Template.compile(src, keepRefToGeneratedCode=True)
+            #print klass._CHEETAH_generatedModuleCode
+            iter = klass().respond()
+            output = [str(i) for i in iter]
+            assert ''.join(output)=='0123456789'
+            #print ''.join(output)
+
+        # @@TR: need to expand this to cover error conditions etc.
+
+if versionTuple < (2,3):
+    del YieldDirective
+        
+class ForDirective(OutputTest):
+
+    def test1(self):
+        """#for loop with one local var"""
+        self.verify("#for $i in range(5)\n$i\n#end for",
+                    "0\n1\n2\n3\n4\n")
+
+        self.verify("#for $i in range(5):\n$i\n#end for",
+                    "0\n1\n2\n3\n4\n")
+
+        self.verify("#for $i in range(5): ##comment\n$i\n#end for",
+                    "0\n1\n2\n3\n4\n")
+
+        self.verify("#for $i in range(5) ##comment\n$i\n#end for",
+                    "0\n1\n2\n3\n4\n")
+
+
+    def test2(self):
+        """#for loop with WS in loop"""
+        self.verify("#for $i in range(5)\n$i \n#end for",
+                    "0 \n1 \n2 \n3 \n4 \n")
+        
+    def test3(self):
+        """#for loop gobble WS"""
+        self.verify("   #for $i in range(5)   \n$i \n   #end for   ",
+                    "0 \n1 \n2 \n3 \n4 \n")
+
+    def test4(self):
+        """#for loop over list"""
+        self.verify("#for $i, $j in [(0,1),(2,3)]\n$i,$j\n#end for",
+                    "0,1\n2,3\n")
+        
+    def test5(self):
+        """#for loop over list, with #slurp"""
+        self.verify("#for $i, $j in [(0,1),(2,3)]\n$i,$j#slurp\n#end for",
+                    "0,12,3")
+
+    def test6(self):
+        """#for loop with explicit closures"""
+        self.verify("#for $i in range(5)#$i#end for#",
+                    "01234")
+
+    def test7(self):
+        """#for loop with explicit closures and WS"""
+        self.verify("  #for $i in range(5)#$i#end for#  ",
+                    "  01234  ")
+
+    def test8(self):
+        """#for loop using another $var"""
+        self.verify("  #for $i in range($aFunc(5))#$i#end for#  ",
+                    "  01234  ")
+
+    def test9(self):
+        """test methods in for loops"""
+        self.verify("#for $func in $listOfLambdas\n$func($anInt)\n#end for",
+                    "1\n1\n1\n")
+
+
+    def test10(self):
+        """#for loop over list, using methods of the items"""
+        self.verify("#for i, j in [('aa','bb'),('cc','dd')]\n$i.upper,$j.upper\n#end for",
+                    "AA,BB\nCC,DD\n")
+        self.verify("#for $i, $j in [('aa','bb'),('cc','dd')]\n$i.upper,$j.upper\n#end for",
+                    "AA,BB\nCC,DD\n")
+
+    def test11(self):
+        """#for loop over list, using ($i,$j) style target list"""
+        self.verify("#for (i, j) in [('aa','bb'),('cc','dd')]\n$i.upper,$j.upper\n#end for",
+                    "AA,BB\nCC,DD\n")
+        self.verify("#for ($i, $j) in [('aa','bb'),('cc','dd')]\n$i.upper,$j.upper\n#end for",
+                    "AA,BB\nCC,DD\n")
+
+    def test12(self):
+        """#for loop over list, using i, (j,k) style target list"""
+        self.verify("#for i, (j, k) in enumerate([('aa','bb'),('cc','dd')])\n$j.upper,$k.upper\n#end for",
+                    "AA,BB\nCC,DD\n")
+        self.verify("#for $i, ($j, $k) in enumerate([('aa','bb'),('cc','dd')])\n$j.upper,$k.upper\n#end for",
+                    "AA,BB\nCC,DD\n")
+
+    def test13(self):
+        """single line #for"""
+        self.verify("#for $i in range($aFunc(5)): $i",
+                    "01234")
+
+    def test14(self):
+        """single line #for with 1 extra leading space"""
+        self.verify("#for $i in range($aFunc(5)):  $i",
+                    " 0 1 2 3 4")
+
+    def test15(self):
+        """2 times single line #for"""
+        self.verify("#for $i in range($aFunc(5)): $i#slurp\n"*2,
+                    "01234"*2)
+
+    def test16(self):
+        """false single line #for """
+        self.verify("#for $i in range(5): \n$i\n#end for",
+                    "0\n1\n2\n3\n4\n")
+
+if versionTuple < (2,3):
+    del ForDirective.test12
+
+class RepeatDirective(OutputTest):
+
+    def test1(self):
+        """basic #repeat"""
+        self.verify("#repeat 3\n1\n#end repeat",
+                    "1\n1\n1\n")
+        self.verify("#repeat 3: \n1\n#end repeat",
+                    "1\n1\n1\n")
+
+        self.verify("#repeat 3 ##comment\n1\n#end repeat",
+                    "1\n1\n1\n")
+
+        self.verify("#repeat 3: ##comment\n1\n#end repeat",
+                    "1\n1\n1\n")
+
+    def test2(self):
+        """#repeat with numeric expression"""
+        self.verify("#repeat 3*3/3\n1\n#end repeat",
+                    "1\n1\n1\n")
+    
+    def test3(self):
+        """#repeat with placeholder"""
+        self.verify("#repeat $numTwo\n1\n#end repeat",
+                    "1\n1\n")
+    
+    def test4(self):
+        """#repeat with placeholder * num"""
+        self.verify("#repeat $numTwo*1\n1\n#end repeat",
+                    "1\n1\n")
+        
+    def test5(self):
+        """#repeat with placeholder and WS"""
+        self.verify("   #repeat $numTwo   \n1\n   #end repeat   ",
+                    "1\n1\n")
+
+    def test6(self):
+        """single-line #repeat"""
+        self.verify("#repeat $numTwo: 1",
+                    "11")
+        self.verify("#repeat $numTwo: 1\n"*2,
+                    "1\n1\n"*2)
+
+        #false single-line
+        self.verify("#repeat 3:  \n1\n#end repeat",
+                    "1\n1\n1\n")
+
+
+class AttrDirective(OutputTest):
+
+    def test1(self):
+        """#attr with int"""
+        self.verify("#attr $test = 1234\n$test",
+                    "1234")
+
+    def test2(self):
+        """#attr with string"""
+        self.verify("#attr $test = 'blarg'\n$test",
+                    "blarg")
+
+    def test3(self):
+        """#attr with expression"""
+        self.verify("#attr $test = 'blarg'.upper()*2\n$test",
+                    "BLARGBLARG")
+
+    def test4(self):
+        """#attr with string + WS
+        Should gobble"""
+        self.verify("     #attr $test = 'blarg'   \n$test",
+                    "blarg")
+
+    def test5(self):
+        """#attr with string + WS + leading text
+        Shouldn't gobble"""
+        self.verify("  --   #attr $test = 'blarg'   \n$test",
+                    "  --   \nblarg")
+
+
+class DefDirective(OutputTest):
+
+    def test1(self):
+        """#def without argstring"""
+        self.verify("#def testMeth\n1234\n#end def\n$testMeth",
+                    "1234\n")
+
+        self.verify("#def testMeth ## comment\n1234\n#end def\n$testMeth",
+                    "1234\n")
+
+        self.verify("#def testMeth: ## comment\n1234\n#end def\n$testMeth",
+                    "1234\n")
+
+    def test2(self):
+        """#def without argstring, gobble WS"""
+        self.verify("   #def testMeth  \n1234\n    #end def   \n$testMeth",
+                    "1234\n")
+
+    def test3(self):
+        """#def with argstring, gobble WS"""
+        self.verify("  #def testMeth($a=999)   \n1234-$a\n  #end def\n$testMeth",
+                    "1234-999\n")
+
+    def test4(self):
+        """#def with argstring, gobble WS, string used in call"""
+        self.verify("  #def testMeth($a=999)   \n1234-$a\n  #end def\n$testMeth('ABC')",
+                    "1234-ABC\n")
+
+    def test5(self):
+        """#def with argstring, gobble WS, list used in call"""
+        self.verify("  #def testMeth($a=999)   \n1234-$a\n  #end def\n$testMeth([1,2,3])",
+                    "1234-[1, 2, 3]\n")
+
+    def test6(self):
+        """#def with 2 args, gobble WS, list used in call"""
+        self.verify("  #def testMeth($a, $b='default')   \n1234-$a$b\n  #end def\n$testMeth([1,2,3])",
+                    "1234-[1, 2, 3]default\n")
+
+    def test7(self):
+        """#def with *args, gobble WS"""
+        self.verify("  #def testMeth($*args)   \n1234-$args\n  #end def\n$testMeth",
+                    "1234-()\n")
+
+    def test8(self):
+        """#def with **KWs, gobble WS"""
+        self.verify("  #def testMeth($**KWs)   \n1234-$KWs\n  #end def\n$testMeth",
+                    "1234-{}\n")
+
+    def test9(self):
+        """#def with *args + **KWs, gobble WS"""
+        self.verify("  #def testMeth($*args, $**KWs)   \n1234-$args-$KWs\n  #end def\n$testMeth",
+                    "1234-()-{}\n")
+
+    def test10(self):
+        """#def with *args + **KWs, gobble WS"""
+        self.verify(
+            "  #def testMeth($*args, $**KWs)   \n1234-$args-$KWs.a\n  #end def\n$testMeth(1,2, a=1)",
+            "1234-(1, 2)-1\n")
+
+
+    def test11(self):
+        """single line #def with extra WS"""
+        self.verify(
+            "#def testMeth: aoeuaoeu\n- $testMeth -",
+            "- aoeuaoeu -")
+
+    def test12(self):
+        """single line #def with extra WS and nested $placeholders"""
+        self.verify(
+            "#def testMeth: $anInt $aFunc(1234)\n- $testMeth -",
+            "- 1 1234 -")
+
+    def test13(self):
+        """single line #def escaped $placeholders"""
+        self.verify(
+            "#def testMeth: \$aFunc(\$anInt)\n- $testMeth -",
+            "- $aFunc($anInt) -")
+
+    def test14(self):
+        """single line #def 1 escaped $placeholders"""
+        self.verify(
+            "#def testMeth: \$aFunc($anInt)\n- $testMeth -",
+            "- $aFunc(1) -")
+
+    def test15(self):
+        """single line #def 1 escaped $placeholders + more WS"""
+        self.verify(
+            "#def testMeth    : \$aFunc($anInt)\n- $testMeth -",
+            "- $aFunc(1) -")
+
+    def test16(self):
+        """multiline #def with $ on methodName"""
+        self.verify("#def $testMeth\n1234\n#end def\n$testMeth",
+                    "1234\n")
+
+    def test17(self):
+        """single line #def with $ on methodName"""
+        self.verify("#def $testMeth:1234\n$testMeth",
+                    "1234")
+
+    def test18(self):
+        """single line #def with an argument"""
+        self.verify("#def $testMeth($arg=1234):$arg\n$testMeth",
+                    "1234")
+
+    def test19(self):
+        """#def that extends over two lines with arguments"""
+        self.verify("#def $testMeth($arg=1234,\n"
+                    +"  $arg2=5678)\n"
+                    +"$arg $arg2\n"
+                    +"#end def\n"
+                    +"$testMeth",
+                    "1234 5678\n")
+
+class DecoratorDirective(OutputTest):
+    def test1(self):
+        """single line #def with decorator"""
+
+        self.verify("#@ blah", "#@ blah")
+        self.verify("#@23 blah", "#@23 blah")
+        self.verify("#@@TR: comment", "#@@TR: comment")
+
+        self.verify("#from Cheetah.Tests.SyntaxAndOutput import testdecorator\n"
+                    +"#@testdecorator"
+                    +"\n#def $testMeth():1234\n$testMeth",
+                    
+                    "1234")
+
+        self.verify("#from Cheetah.Tests.SyntaxAndOutput import testdecorator\n"
+                    +"#@testdecorator"
+                    +"\n#block $testMeth():1234",
+                    
+                    "1234")
+
+        try:
+            self.verify(
+                "#from Cheetah.Tests.SyntaxAndOutput import testdecorator\n"
+                +"#@testdecorator\n sdf"
+                +"\n#def $testMeth():1234\n$testMeth",                        
+
+                "1234")
+        except ParseError:
+            pass
+        else:
+            self.fail('should raise a ParseError')
+
+    def test2(self):
+        """#def with multiple decorators"""
+        self.verify("#from Cheetah.Tests.SyntaxAndOutput import testdecorator\n"
+                    +"#@testdecorator\n"
+                    +"#@testdecorator\n"
+                    +"#def testMeth\n"
+                    +"1234\n"
+                    "#end def\n"
+                    "$testMeth",
+                    "1234\n")
+
+if versionTuple < (2,4):
+    del DecoratorDirective
+
+class BlockDirective(OutputTest):
+
+    def test1(self):
+        """#block without argstring"""
+        self.verify("#block testBlock\n1234\n#end block",
+                    "1234\n")
+
+        self.verify("#block testBlock ##comment\n1234\n#end block",
+                    "1234\n")
+
+    def test2(self):
+        """#block without argstring, gobble WS"""
+        self.verify("  #block testBlock   \n1234\n  #end block  ",
+                    "1234\n")
+
+    def test3(self):
+        """#block with argstring, gobble WS
+
+        Because blocks can be reused in multiple parts of the template arguments
+        (!!with defaults!!) can be given."""
+        
+        self.verify("  #block testBlock($a=999)   \n1234-$a\n  #end block  ",
+                    "1234-999\n")
+
+    def test4(self):
+        """#block with 2 args, gobble WS"""
+        self.verify("  #block testBlock($a=999, $b=444)   \n1234-$a$b\n  #end block  ",
+                    "1234-999444\n")
+
+
+    def test5(self):
+        """#block with 2 nested blocks
+
+        Blocks can be nested to any depth and the name of the block is optional
+        for the #end block part: #end block OR #end block [name] """
+        
+        self.verify("""#block testBlock
+this is a test block
+#block outerNest
+outer
+#block innerNest
+inner
+#end block innerNest
+#end block outerNest
+---
+#end block testBlock
+""",
+                    "this is a test block\nouter\ninner\n---\n")
+
+
+    def test6(self):
+        """single line #block """
+        self.verify(
+            "#block testMeth: This is my block",
+            "This is my block")
+
+    def test7(self):
+        """single line #block with WS"""
+        self.verify(
+            "#block testMeth: This is my block",
+            "This is my block")
+
+    def test8(self):
+        """single line #block 1 escaped $placeholders"""
+        self.verify(
+            "#block testMeth: \$aFunc($anInt)",
+            "$aFunc(1)")
+
+    def test9(self):
+        """single line #block 1 escaped $placeholders + WS"""
+        self.verify(
+            "#block testMeth: \$aFunc( $anInt )",
+            "$aFunc( 1 )")
+
+    def test10(self):
+        """single line #block 1 escaped $placeholders + more WS"""
+        self.verify(
+            "#block testMeth  : \$aFunc( $anInt )",
+            "$aFunc( 1 )")
+
+    def test11(self):
+        """multiline #block $ on argstring"""
+        self.verify("#block $testBlock\n1234\n#end block",
+                    "1234\n")
+
+    def test12(self):
+        """single line #block with $ on methodName """
+        self.verify(
+            "#block $testMeth: This is my block",
+            "This is my block")
+
+    def test13(self):
+        """single line #block with an arg """
+        self.verify(
+            "#block $testMeth($arg='This is my block'): $arg",
+            "This is my block")
+
+    def test14(self):
+        """single line #block with None for content"""
+        self.verify(
+            """#block $testMeth: $None\ntest $testMeth-""",
+            "test -")
+
+    def test15(self):
+        """single line #block with nothing for content"""
+        self.verify(
+            """#block $testMeth: \nfoo\n#end block\ntest $testMeth-""",
+            "foo\ntest foo\n-")
+
+class IncludeDirective(OutputTest):
+
+    def setUp(self):
+        fp = open('parseTest.txt','w')
+        fp.write("$numOne $numTwo")
+        fp.flush()
+        fp.close
+
+    def tearDown(self):
+        if os.path.exists('parseTest.txt'):
+            os.remove('parseTest.txt')
+
+    def test1(self):
+        """#include raw of source $emptyString"""
+        self.verify("#include raw source=$emptyString",
+                    "")
+
+    def test2(self):
+        """#include raw of source $blockToBeParsed"""
+        self.verify("#include raw source=$blockToBeParsed",
+                    "$numOne $numTwo")
+
+    def test3(self):
+        """#include raw of 'parseTest.txt'"""
+        self.verify("#include raw 'parseTest.txt'",
+                    "$numOne $numTwo")
+
+    def test4(self):
+        """#include raw of $includeFileName"""
+        self.verify("#include raw $includeFileName",
+                    "$numOne $numTwo")
+
+    def test5(self):
+        """#include raw of $includeFileName, with WS"""
+        self.verify("       #include raw $includeFileName      ",
+                    "$numOne $numTwo")
+
+    def test6(self):
+        """#include raw of source= , with WS"""
+        self.verify("       #include raw source='This is my $Source '*2      ",
+                    "This is my $Source This is my $Source ")
+
+    def test7(self):
+        """#include of $blockToBeParsed"""
+        self.verify("#include source=$blockToBeParsed",
+                    "1 2")
+        
+    def test8(self):
+        """#include of $blockToBeParsed, with WS"""
+        self.verify("   #include source=$blockToBeParsed   ",
+                    "1 2")
+
+    def test9(self):
+        """#include of 'parseTest.txt', with WS"""
+        self.verify("   #include source=$blockToBeParsed   ",
+                    "1 2")
+
+    def test10(self):
+        """#include of "parseTest.txt", with WS"""
+        self.verify("   #include source=$blockToBeParsed   ",
+                    "1 2")
+        
+    def test11(self):
+        """#include of 'parseTest.txt', with WS and surrounding text"""
+        self.verify("aoeu\n  #include source=$blockToBeParsed  \naoeu",
+                    "aoeu\n1 2aoeu")
+
+    def test12(self):
+        """#include of 'parseTest.txt', with WS and explicit closure"""
+        self.verify("  #include source=$blockToBeParsed#  ",
+                    "  1 2  ")
+
+
+class SilentDirective(OutputTest):
+
+    def test1(self):
+        """simple #silent"""
+        self.verify("#silent $aFunc",
+                    "")
+
+    def test2(self):
+        """simple #silent"""
+        self.verify("#silent $anObj.callIt\n$anObj.callArg",
+                    "1234")
+
+        self.verify("#silent $anObj.callIt ##comment\n$anObj.callArg",
+                    "1234")
+
+    def test3(self):
+        """simple #silent"""
+        self.verify("#silent $anObj.callIt(99)\n$anObj.callArg",
+                    "99")
+
+class SetDirective(OutputTest):
+
+    def test1(self):
+        """simple #set"""
+        self.verify("#set $testVar = 'blarg'\n$testVar",
+                    "blarg")
+        self.verify("#set testVar = 'blarg'\n$testVar",
+                    "blarg")
+
+
+        self.verify("#set testVar = 'blarg'##comment\n$testVar",
+                    "blarg")
+
+    def test2(self):
+        """simple #set with no WS between operands"""
+        self.verify("#set       $testVar='blarg'",
+                    "")
+    def test3(self):
+        """#set + use of var"""
+        self.verify("#set $testVar = 'blarg'\n$testVar",
+                    "blarg")
+        
+    def test4(self):
+        """#set + use in an #include"""
+        self.verify("#set global $aSetVar = 1234\n#include source=$includeBlock2",
+                    "1 2 1234")
+
+    def test5(self):
+        """#set with a dictionary"""
+        self.verify(     """#set $testDict = {'one':'one1','two':'two2','three':'three3'}
+$testDict.one
+$testDict.two""",
+                         "one1\ntwo2")
+
+    def test6(self):
+        """#set with string, then used in #if block"""
+    
+        self.verify("""#set $test='a string'\n#if $test#blarg#end if""",
+                    "blarg")
+
+    def test7(self):
+        """simple #set, gobble WS"""
+        self.verify("   #set $testVar = 'blarg'   ",
+                    "")
+
+    def test8(self):
+        """simple #set, don't gobble WS"""
+        self.verify("  #set $testVar = 'blarg'#---",
+                    "  ---")
+
+    def test9(self):
+        """simple #set with a list"""
+        self.verify("   #set $testVar = [1, 2, 3]  \n$testVar",
+                    "[1, 2, 3]")
+
+    def test10(self):
+        """simple #set global with a list"""
+        self.verify("   #set global $testVar = [1, 2, 3]  \n$testVar",
+                    "[1, 2, 3]")
+
+    def test11(self):
+        """simple #set global with a list and *cache
+
+        Caching only works with global #set vars.  Local vars are not accesible
+        to the cache namespace.
+        """
+        
+        self.verify("   #set global $testVar = [1, 2, 3]  \n$*testVar",
+                    "[1, 2, 3]")
+
+    def test12(self):
+        """simple #set global with a list and *<int>*cache"""
+        self.verify("   #set global $testVar = [1, 2, 3]  \n$*5*testVar",
+                    "[1, 2, 3]")
+
+    def test13(self):
+        """simple #set with a list and *<float>*cache"""
+        self.verify("   #set global $testVar = [1, 2, 3]  \n$*.5*testVar",
+                    "[1, 2, 3]")
+
+    def test14(self):
+        """simple #set without NameMapper on"""
+        self.verify("""#compiler useNameMapper = 0\n#set $testVar = 1 \n$testVar""",
+                    "1")
+
+    def test15(self):
+        """simple #set without $"""
+        self.verify("""#set testVar = 1 \n$testVar""",
+                    "1")
+
+    def test16(self):
+        """simple #set global without $"""
+        self.verify("""#set global testVar = 1 \n$testVar""",
+                    "1")
+
+    def test17(self):
+        """simple #set module without $"""
+        self.verify("""#set module __foo__ = 'bar'\n$__foo__""",
+                    "bar")
+
+    def test18(self):
+        """#set with i,j=list style assignment"""
+        self.verify("""#set i,j = [1,2]\n$i$j""",
+                    "12")
+        self.verify("""#set $i,$j = [1,2]\n$i$j""",
+                    "12")
+
+    def test19(self):
+        """#set with (i,j)=list style assignment"""
+        self.verify("""#set (i,j) = [1,2]\n$i$j""",
+                    "12")
+        self.verify("""#set ($i,$j) = [1,2]\n$i$j""",
+                    "12")
+
+    def test20(self):
+        """#set with i, (j,k)=list style assignment"""
+        self.verify("""#set i, (j,k) = [1,(2,3)]\n$i$j$k""",
+                    "123")
+        self.verify("""#set $i, ($j,$k) = [1,(2,3)]\n$i$j$k""",
+                    "123")
+
+
+class IfDirective(OutputTest):
+
+    def test1(self):
+        """simple #if block"""
+        self.verify("#if 1\n$aStr\n#end if\n",
+                    "blarg\n")
+
+        self.verify("#if 1:\n$aStr\n#end if\n",
+                    "blarg\n")
+
+        self.verify("#if 1:   \n$aStr\n#end if\n",
+                    "blarg\n")
+
+        self.verify("#if 1: ##comment \n$aStr\n#end if\n",
+                        "blarg\n")
+
+        self.verify("#if 1 ##comment \n$aStr\n#end if\n",
+                        "blarg\n")
+
+        self.verify("#if 1##for i in range(10)#$i#end for##end if",
+                    '0123456789')
+
+        self.verify("#if 1: #for i in range(10)#$i#end for",
+                    '0123456789')
+
+        self.verify("#if 1: #for i in range(10):$i",
+                    '0123456789')
+
+    def test2(self):
+        """simple #if block, with WS"""
+        self.verify("   #if 1\n$aStr\n  #end if  \n",
+                    "blarg\n")
+    def test3(self):
+        """simple #if block, with WS and explicit closures"""
+        self.verify("   #if 1#\n$aStr\n  #end if #--\n",
+                    "   \nblarg\n  --\n")
+
+    def test4(self):
+        """#if block using $numOne"""
+        self.verify("#if $numOne\n$aStr\n#end if\n",
+                    "blarg\n")
+
+    def test5(self):
+        """#if block using $zero"""
+        self.verify("#if $zero\n$aStr\n#end if\n",
+                    "")
+    def test6(self):
+        """#if block using $emptyString"""
+        self.verify("#if $emptyString\n$aStr\n#end if\n",
+                    "")
+    def test7(self):
+        """#if ... #else ... block using a $emptyString"""
+        self.verify("#if $emptyString\n$anInt\n#else\n$anInt - $anInt\n#end if",
+                    "1 - 1\n")
+        
+    def test8(self):
+        """#if ... #elif ... #else ... block using a $emptyString"""
+        self.verify("#if $emptyString\n$c\n#elif $numOne\n$numOne\n#else\n$c - $c\n#end if",
+                    "1\n")
+
+    def test9(self):
+        """#if 'not' test, with #slurp"""
+        self.verify("#if not $emptyString\n$aStr#slurp\n#end if\n",
+                    "blarg")
+
+    def test10(self):
+        """#if block using $*emptyString
+
+        This should barf
+        """
+        try:
+            self.verify("#if $*emptyString\n$aStr\n#end if\n",
+                        "")
+        except ParseError:
+            pass
+        else:
+            self.fail('This should barf')
+
+    def test11(self):
+        """#if block using invalid top-level $(placeholder) syntax - should barf"""
+
+        for badSyntax in ("#if $*5*emptyString\n$aStr\n#end if\n",
+                          "#if ${emptyString}\n$aStr\n#end if\n",
+                          "#if $(emptyString)\n$aStr\n#end if\n",
+                          "#if $[emptyString]\n$aStr\n#end if\n",
+                          "#if $!emptyString\n$aStr\n#end if\n",
+                          ):
+            try:
+                self.verify(badSyntax, "")
+            except ParseError:
+                pass
+            else:
+                self.fail('This should barf')
+            
+    def test12(self):
+        """#if ... #else if ... #else ... block using a $emptyString
+        Same as test 8 but using else if instead of elif"""
+        self.verify("#if $emptyString\n$c\n#else if $numOne\n$numOne\n#else\n$c - $c\n#end if",
+                    "1\n")
+
+
+    def test13(self):
+        """#if# ... #else # ... block using a $emptyString with """
+        self.verify("#if $emptyString# $anInt#else#$anInt - $anInt#end if",
+                    "1 - 1")
+
+    def test14(self):
+        """single-line #if: simple"""
+        self.verify("#if $emptyString then 'true' else 'false'",
+                    "false")
+
+    def test15(self):
+        """single-line #if: more complex"""
+        self.verify("#if $anInt then 'true' else 'false'",
+                    "true")
+
+    def test16(self):
+        """single-line #if: with the words 'else' and 'then' in the output """
+        self.verify("#if ($anInt and not $emptyString==''' else ''') then $str('then') else 'else'",
+                    "then")
+
+    def test17(self):
+        """single-line #if:  """
+        self.verify("#if 1: foo\n#if 0: bar\n#if 1: foo",
+                    "foo\nfoo")
+
+
+        self.verify("#if 1: foo\n#if 0: bar\n#if 1: foo",
+                    "foo\nfoo")
+
+    def test18(self):
+        """single-line #if: \n#else: """
+        self.verify("#if 1: foo\n#elif 0: bar",
+                    "foo\n")
+
+        self.verify("#if 1: foo\n#elif 0: bar\n#else: blarg\n",
+                    "foo\n")
+
+        self.verify("#if 0: foo\n#elif 0: bar\n#else: blarg\n",
+                    "blarg\n")
+
+class UnlessDirective(OutputTest):
+    
+    def test1(self):
+        """#unless 1"""
+        self.verify("#unless 1\n 1234 \n#end unless",
+                    "")
+
+        self.verify("#unless 1:\n 1234 \n#end unless",
+                    "")
+
+        self.verify("#unless 1: ##comment\n 1234 \n#end unless",
+                    "")
+
+        self.verify("#unless 1 ##comment\n 1234 \n#end unless",
+                    "")
+
+
+    def test2(self):
+        """#unless 0"""
+        self.verify("#unless 0\n 1234 \n#end unless",
+                    " 1234 \n")
+
+    def test3(self):
+        """#unless $none"""
+        self.verify("#unless $none\n 1234 \n#end unless",
+                    " 1234 \n")
+
+    def test4(self):
+        """#unless $numTwo"""
+        self.verify("#unless $numTwo\n 1234 \n#end unless",
+                    "")
+
+    def test5(self):
+        """#unless $numTwo with WS"""
+        self.verify("   #unless $numTwo   \n 1234 \n    #end unless   ",
+                    "")
+
+    def test6(self):
+        """single-line #unless"""
+        self.verify("#unless 1: 1234", "")
+        self.verify("#unless 0: 1234", "1234")
+        self.verify("#unless 0: 1234\n"*2, "1234\n"*2)
+        
+class PSP(OutputTest):
+    
+    def test1(self):
+        """simple <%= [int] %>"""
+        self.verify("<%= 1234 %>",  "1234")
+
+    def test2(self):
+        """simple <%= [string] %>"""
+        self.verify("<%= 'blarg' %>", "blarg")
+
+    def test3(self):
+        """simple <%= None %>"""
+        self.verify("<%= None %>", "")
+    def test4(self):
+        """simple <%= [string] %> + $anInt"""
+        self.verify("<%= 'blarg' %>$anInt", "blarg1")
+
+    def test5(self):
+        """simple <%= [EXPR] %> + $anInt"""
+        self.verify("<%= ('blarg'*2).upper() %>$anInt", "BLARGBLARG1")
+
+    def test6(self):
+        """for loop in <%%>"""
+        self.verify("<% for i in range(5):%>1<%end%>", "11111")
+
+    def test7(self):
+        """for loop in <%%> and using <%=i%>"""
+        self.verify("<% for i in range(5):%><%=i%><%end%>", "01234")
+
+    def test8(self):
+        """for loop in <% $%> and using <%=i%>"""
+        self.verify("""<% for i in range(5):
+    i=i*2$%><%=i%><%end%>""", "02468")
+
+    def test9(self):
+        """for loop in <% $%> and using <%=i%> plus extra text"""
+        self.verify("""<% for i in range(5):
+    i=i*2$%><%=i%>-<%end%>""", "0-2-4-6-8-")
+
+
+class WhileDirective(OutputTest):
+    def test1(self):
+        """simple #while with a counter"""
+        self.verify("#set $i = 0\n#while $i < 5\n$i#slurp\n#set $i += 1\n#end while",
+                    "01234")
+
+class ContinueDirective(OutputTest):
+    def test1(self):
+        """#continue with a #while"""
+        self.verify("""#set $i = 0
+#while $i < 5
+#if $i == 3
+  #set $i += 1        
+  #continue
+#end if
+$i#slurp
+#set $i += 1
+#end while""",
+        "0124")
+
+    def test2(self):
+        """#continue with a #for"""
+        self.verify("""#for $i in range(5)
+#if $i == 3
+  #continue
+#end if
+$i#slurp
+#end for""",
+        "0124")
+
+class BreakDirective(OutputTest):
+    def test1(self):
+        """#break with a #while"""
+        self.verify("""#set $i = 0
+#while $i < 5
+#if $i == 3
+  #break
+#end if
+$i#slurp
+#set $i += 1
+#end while""",
+        "012")
+
+    def test2(self):
+        """#break with a #for"""
+        self.verify("""#for $i in range(5)
+#if $i == 3
+  #break
+#end if
+$i#slurp
+#end for""",
+        "012")
+
+
+class TryDirective(OutputTest):
+
+    def test1(self):
+        """simple #try 
+        """
+        self.verify("#try\n1234\n#except\nblarg\n#end try",
+                    "1234\n")
+
+    def test2(self):
+        """#try / #except with #raise
+        """
+        self.verify("#try\n#raise ValueError\n#except\nblarg\n#end try",
+                    "blarg\n")
+        
+    def test3(self):
+        """#try / #except with #raise + WS
+
+        Should gobble
+        """
+        self.verify("  #try  \n  #raise ValueError \n  #except \nblarg\n  #end try",
+                    "blarg\n")
+
+
+    def test4(self):
+        """#try / #except with #raise + WS and leading text
+        
+        Shouldn't gobble
+        """
+        self.verify("--#try  \n  #raise ValueError \n  #except \nblarg\n  #end try#--",
+                    "--\nblarg\n  --")
+
+    def test5(self):
+        """nested #try / #except with #raise
+        """
+        self.verify(
+"""#try
+  #raise ValueError
+#except
+  #try
+   #raise ValueError
+  #except
+blarg
+  #end try
+#end try""",
+                    "blarg\n")
+
+class PassDirective(OutputTest):
+    def test1(self):
+        """#pass in a #try / #except block
+        """
+        self.verify("#try\n#raise ValueError\n#except\n#pass\n#end try",
+                    "")
+
+    def test2(self):
+        """#pass in a #try / #except block + WS
+        """
+        self.verify("  #try  \n  #raise ValueError  \n  #except  \n   #pass   \n   #end try",
+                    "")
+
+
+class AssertDirective(OutputTest):
+    def test1(self):
+        """simple #assert 
+        """
+        self.verify("#set $x = 1234\n#assert $x == 1234",
+                    "")
+
+    def test2(self):
+        """simple #assert that fails
+        """
+        def test(self=self):
+            self.verify("#set $x = 1234\n#assert $x == 999",
+                        ""),
+        self.failUnlessRaises(AssertionError, test)
+        
+    def test3(self):
+        """simple #assert with WS
+        """
+        self.verify("#set $x = 1234\n   #assert $x == 1234   ",
+                    "")
+
+
+class RaiseDirective(OutputTest):
+    def test1(self):
+        """simple #raise ValueError
+
+        Should raise ValueError
+        """
+        def test(self=self):
+            self.verify("#raise ValueError",
+                        ""),
+        self.failUnlessRaises(ValueError, test)
+                              
+    def test2(self):
+        """#raise ValueError in #if block
+
+        Should raise ValueError
+        """
+        def test(self=self):
+            self.verify("#if 1\n#raise ValueError\n#end if\n",
+                        "")
+        self.failUnlessRaises(ValueError, test)
+
+
+    def test3(self):
+        """#raise ValueError in #if block
+
+        Shouldn't raise ValueError
+        """
+        self.verify("#if 0\n#raise ValueError\n#else\nblarg#end if\n",
+                    "blarg\n")
+
+
+
+class ImportDirective(OutputTest):
+    def test1(self):
+        """#import math
+        """
+        self.verify("#import math",
+                    "")
+
+    def test2(self):
+        """#import math + WS
+
+        Should gobble
+        """
+        self.verify("    #import math    ",
+                    "")
+
+    def test3(self):
+        """#import math + WS + leading text
+        
+        Shouldn't gobble
+        """
+        self.verify("  --  #import math    ",
+                    "  --  ")
+        
+    def test4(self):
+        """#from math import syn
+        """
+        self.verify("#from math import cos",
+                    "")
+
+    def test5(self):
+        """#from math import cos  + WS
+        Should gobble
+        """
+        self.verify("    #from math import cos  ",
+                    "")
+
+    def test6(self):
+        """#from math import cos  + WS + leading text
+        Shouldn't gobble
+        """
+        self.verify("  --  #from math import cos  ",
+                    "  --  ")
+
+    def test7(self):
+        """#from math import cos -- use it
+        """
+        self.verify("#from math import cos\n$cos(0)",
+                    "1.0")
+
+    def test8(self):
+        """#from math import cos,tan,sin -- and use them
+        """
+        self.verify("#from math import cos, tan, sin\n$cos(0)-$tan(0)-$sin(0)",
+                    "1.0-0.0-0.0")
+
+    def test9(self):
+        """#import os.path -- use it
+        """
+        
+        self.verify("#import os.path\n$os.path.exists('.')",
+                    repr(True))
+
+    def test10(self):
+        """#import os.path -- use it with NameMapper turned off
+        """
+        self.verify("""##
+#compiler-settings
+useNameMapper=False
+#end compiler-settings
+#import os.path
+$os.path.exists('.')""",
+                    repr(True))
+
+    def test11(self):
+        """#from math import *
+        """
+        
+        self.verify("#from math import *\n$pow(1,2) $log10(10)",
+                    "1.0 1.0")
+
+class CompilerDirective(OutputTest):
+    def test1(self):
+        """overriding the commentStartToken
+        """
+        self.verify("""$anInt##comment
+#compiler commentStartToken = '//'
+$anInt//comment
+""",
+                    "1\n1\n")
+
+    def test2(self):
+        """overriding and resetting the commentStartToken
+        """
+        self.verify("""$anInt##comment
+#compiler commentStartToken = '//'
+$anInt//comment
+#compiler reset
+$anInt//comment
+""",
+                    "1\n1\n1//comment\n")
+
+
+class CompilerSettingsDirective(OutputTest):
+    
+    def test1(self):
+        """overriding the cheetahVarStartToken
+        """
+        self.verify("""$anInt
+#compiler-settings
+cheetahVarStartToken = @
+#end compiler-settings
+@anInt
+#compiler-settings reset
+$anInt
+""",
+                    "1\n1\n1\n")
+
+    def test2(self):
+        """overriding the directiveStartToken
+        """
+        self.verify("""#set $x = 1234
+$x
+#compiler-settings
+directiveStartToken = @
+#end compiler-settings
+@set $x = 1234
+$x
+""",
+                    "1234\n1234\n")
+
+    def test3(self):
+        """overriding the commentStartToken
+        """
+        self.verify("""$anInt##comment
+#compiler-settings
+commentStartToken = //
+#end compiler-settings
+$anInt//comment
+""",
+                    "1\n1\n")
+
+if sys.platform.startswith('java'):
+    del CompilerDirective
+    del CompilerSettingsDirective
+
+class ExtendsDirective(OutputTest):
+
+    def test1(self):
+        """#extends Cheetah.Templates._SkeletonPage"""
+        self.verify("""#from Cheetah.Templates._SkeletonPage import _SkeletonPage
+#extends _SkeletonPage
+#implements respond
+$spacer()
+""",
+                    '<img src="spacer.gif" width="1" height="1" alt="" />\n')
+
+
+        self.verify("""#from Cheetah.Templates._SkeletonPage import _SkeletonPage
+#extends _SkeletonPage
+#implements respond(foo=1234)
+$spacer()$foo
+""",
+                    '<img src="spacer.gif" width="1" height="1" alt="" />1234\n')
+
+    def test2(self):
+        """#extends Cheetah.Templates.SkeletonPage without #import"""
+        self.verify("""#extends Cheetah.Templates.SkeletonPage
+#implements respond
+$spacer()
+""",
+                    '<img src="spacer.gif" width="1" height="1" alt="" />\n')
+
+    def test3(self):
+        """#extends Cheetah.Templates.SkeletonPage.SkeletonPage without #import"""
+        self.verify("""#extends Cheetah.Templates.SkeletonPage.SkeletonPage
+#implements respond
+$spacer()
+""",
+                    '<img src="spacer.gif" width="1" height="1" alt="" />\n')
+
+    def test4(self):
+        """#extends with globals and searchList test"""
+        self.verify("""#extends Cheetah.Templates.SkeletonPage
+#set global g="Hello"
+#implements respond
+$g $numOne
+""",
+                    'Hello 1\n')
+
+
+class SuperDirective(OutputTest):
+    def test1(self):
+        tmpl1 = Template.compile('''$foo $bar(99)
+        #def foo: this is base foo
+        #def bar(arg): super-$arg''')
+
+        tmpl2 = tmpl1.subclass('''
+        #implements dummy
+        #def foo
+          #super
+          This is child foo
+          #super(trans=trans)
+          $bar(1234)
+        #end def
+        #def bar(arg): #super($arg)
+        ''')
+        expected = ('this is base foo          '
+                    'This is child foo\nthis is base foo          '
+                    'super-1234\n super-99')
+        assert str(tmpl2()).strip()==expected
+
+
+class ImportantExampleCases(OutputTest):
+    def test1(self):
+        """how to make a comma-delimited list"""
+        self.verify("""#set $sep = ''
+#for $letter in $letterList
+$sep$letter#slurp
+#set $sep = ', '
+#end for
+""",
+                    "a, b, c")
+
+class FilterDirective(OutputTest):
+    convertEOLs=False
+
+    def _getCompilerSettings(self):
+        return {'useFilterArgsInPlaceholders':True}
+    
+    def test1(self):
+        """#filter Filter
+        """
+        self.verify("#filter Filter\n$none#end filter",
+                    "")
+
+        self.verify("#filter Filter: $none",
+                    "")
+
+    def test2(self):
+        """#filter ReplaceNone with WS
+        """
+        self.verify("#filter Filter  \n$none#end filter",
+                    "")
+
+    def test3(self):
+        """#filter MaxLen -- maxlen of 5"""
+
+        self.verify("#filter MaxLen  \n${tenDigits, $maxlen=5}#end filter",
+                    "12345")
+
+    def test4(self):
+        """#filter MaxLen -- no maxlen
+        """
+        self.verify("#filter MaxLen  \n${tenDigits}#end filter",
+                    "1234567890")
+
+    def test5(self):
+        """#filter WebSafe -- basic usage
+        """
+        self.verify("#filter WebSafe  \n$webSafeTest#end filter",
+                    "abc &lt;=&gt; &amp;")
+
+    def test6(self):
+        """#filter WebSafe -- also space
+        """
+        self.verify("#filter WebSafe  \n${webSafeTest, $also=' '}#end filter",
+                    "abc&nbsp;&lt;=&gt;&nbsp;&amp;")
+        
+    def test7(self):
+        """#filter WebSafe -- also space, without $ on the args
+        """
+        self.verify("#filter WebSafe  \n${webSafeTest, also=' '}#end filter",
+                    "abc&nbsp;&lt;=&gt;&nbsp;&amp;")
+
+    def test8(self):
+        """#filter Strip -- trailing newline
+        """
+        self.verify("#filter Strip\n$strip1#end filter",
+                    "strippable whitespace\n")
+
+    def test9(self):
+        """#filter Strip -- no trailing newine
+        """
+        self.verify("#filter Strip\n$strip2#end filter",
+                    "strippable whitespace")
+
+    def test10(self):
+        """#filter Strip -- multi-line
+        """
+        self.verify("#filter Strip\n$strip3#end filter",
+                    "strippable whitespace\n1 2  3\n")
+
+    def test11(self):
+        """#filter StripSqueeze -- canonicalize all whitespace to ' '
+        """
+        self.verify("#filter StripSqueeze\n$strip3#end filter",
+                    "strippable whitespace 1 2 3")
+
+
+class EchoDirective(OutputTest):
+    def test1(self):
+        """#echo 1234
+        """
+        self.verify("#echo 1234",
+                    "1234")
+
+class SilentDirective(OutputTest):
+    def test1(self):
+        """#silent 1234
+        """
+        self.verify("#silent 1234",
+                    "")
+
+class ErrorCatcherDirective(OutputTest):
+    pass
+
+
+class VarExists(OutputTest):               # Template.varExists()
+    
+    def test1(self):
+        """$varExists('$anInt')
+        """
+        self.verify("$varExists('$anInt')",
+                    repr(True))
+
+    def test2(self):
+        """$varExists('anInt')
+        """
+        self.verify("$varExists('anInt')",
+                    repr(True))
+
+    def test3(self):
+        """$varExists('$anInt')
+        """
+        self.verify("$varExists('$bogus')",
+                    repr(False))
+
+    def test4(self):
+        """$varExists('$anInt') combined with #if false
+        """
+        self.verify("#if $varExists('$bogus')\n1234\n#else\n999\n#end if",
+                    "999\n")
+
+    def test5(self):
+        """$varExists('$anInt') combined with #if true
+        """
+        self.verify("#if $varExists('$anInt')\n1234\n#else\n999#end if",
+                    "1234\n")
+
+class GetVar(OutputTest):               # Template.getVar()
+    def test1(self):
+        """$getVar('$anInt')
+        """
+        self.verify("$getVar('$anInt')",
+                    "1")
+
+    def test2(self):
+        """$getVar('anInt')
+        """
+        self.verify("$getVar('anInt')",
+                    "1")
+
+    def test3(self):
+        """$self.getVar('anInt')
+        """
+        self.verify("$self.getVar('anInt')",
+                    "1")
+        
+    def test4(self):
+        """$getVar('bogus', 1234)
+        """
+        self.verify("$getVar('bogus',  1234)",
+                    "1234")
+        
+    def test5(self):
+        """$getVar('$bogus', 1234)
+        """
+        self.verify("$getVar('$bogus',  1234)",
+                    "1234")
+
+
+class MiscComplexSyntax(OutputTest):
+    def test1(self):
+        """Complex use of {},[] and () in a #set expression
+        ----
+        #set $c = {'A':0}[{}.get('a', {'a' : 'A'}['a'])]
+        $c
+        """
+        self.verify("#set $c = {'A':0}[{}.get('a', {'a' : 'A'}['a'])]\n$c",
+                    "0")
+
+
+class CGI(OutputTest):
+    """CGI scripts with(out) the CGI environment and with(out) GET variables.
+    """
+    convertEOLs=False
+    
+    def _beginCGI(self):  
+        os.environ['REQUEST_METHOD'] = "GET"
+    def _endCGI(self):  
+        try:
+            del os.environ['REQUEST_METHOD']
+        except KeyError:
+            pass
+    _guaranteeNoCGI = _endCGI
+
+
+    def test1(self):
+        """A regular template."""
+        self._guaranteeNoCGI()
+        source = "#extends Cheetah.Tools.CGITemplate\n" + \
+                 "#implements respond\n" + \
+                 "$cgiHeaders#slurp\n" + \
+                 "Hello, world!" 
+        self.verify(source, "Hello, world!")
+
+
+    def test2(self):
+        """A CGI script."""
+        self._beginCGI()
+        source = "#extends Cheetah.Tools.CGITemplate\n" + \
+                 "#implements respond\n" + \
+                 "$cgiHeaders#slurp\n" + \
+                 "Hello, world!" 
+        self.verify(source, "Content-type: text/html\n\nHello, world!")
+        self._endCGI()
+
+
+    def test3(self):
+        """A (pseudo) Webware servlet.
+           
+           This uses the Python syntax escape to set
+           self._CHEETAH__isControlledByWebKit.           
+           We could instead do '#silent self._CHEETAH__isControlledByWebKit = True',
+           taking advantage of the fact that it will compile unchanged as long
+           as there's no '$' in the statement.  (It won't compile with an '$'
+           because that would convert to a function call, and you can't assign
+           to a function call.)  Because this isn't really being called from
+           Webware, we'd better not use any Webware services!  Likewise, we'd
+           better not call $cgiImport() because it would be misled.
+        """
+        self._beginCGI()
+        source = "#extends Cheetah.Tools.CGITemplate\n" + \
+                 "#implements respond\n" + \
+                 "<% self._CHEETAH__isControlledByWebKit = True %>#slurp\n" + \
+                 "$cgiHeaders#slurp\n" + \
+                 "Hello, world!"
+        self.verify(source, "Hello, world!")
+        self._endCGI()
+
+
+    def test4(self):
+        """A CGI script with a GET variable."""
+        self._beginCGI()
+        os.environ['QUERY_STRING'] = "cgiWhat=world"
+        source = "#extends Cheetah.Tools.CGITemplate\n" + \
+                 "#implements respond\n" + \
+                 "$cgiHeaders#slurp\n" + \
+                 "#silent $webInput(['cgiWhat'])##slurp\n" + \
+                 "Hello, $cgiWhat!"
+        self.verify(source, 
+                    "Content-type: text/html\n\nHello, world!")
+        del os.environ['QUERY_STRING']
+        self._endCGI()
+
+
+
+class WhitespaceAfterDirectiveTokens(OutputTest):
+    def _getCompilerSettings(self):
+        return {'allowWhitespaceAfterDirectiveStartToken':True}
+
+    def test1(self):
+        self.verify("# for i in range(10): $i",
+                    "0123456789")
+        self.verify("# for i in range(10)\n$i# end for",
+                    "0123456789")
+        self.verify("# for i in range(10)#$i#end for",
+                    "0123456789")
+
+
+
+class DefmacroDirective(OutputTest):
+    def _getCompilerSettings(self):
+        def aMacro(src):
+            return '$aStr'
+        
+        return {'macroDirectives':{'aMacro':aMacro
+                                   }}
+
+    def test1(self):
+        self.verify("""\
+#defmacro inc: #set @src +=1
+#set i = 1
+#inc: $i
+$i""",
+                    "2")
+
+
+
+        self.verify("""\
+#defmacro test
+#for i in range(10): @src
+#end defmacro
+#test: $i-foo#slurp
+#for i in range(3): $i""",
+                    "0-foo1-foo2-foo3-foo4-foo5-foo6-foo7-foo8-foo9-foo012")
+
+        self.verify("""\
+#defmacro test
+#for i in range(10): @src
+#end defmacro
+#test: $i-foo
+#for i in range(3): $i""",
+  "0-foo\n1-foo\n2-foo\n3-foo\n4-foo\n5-foo\n6-foo\n7-foo\n8-foo\n9-foo\n012")
+
+
+        self.verify("""\
+#defmacro test: #for i in range(10): @src
+#test: $i-foo#slurp
+-#for i in range(3): $i""",
+                    "0-foo1-foo2-foo3-foo4-foo5-foo6-foo7-foo8-foo9-foo-012")
+
+        self.verify("""\
+#defmacro test##for i in range(10): @src#end defmacro##slurp
+#test: $i-foo#slurp
+-#for i in range(3): $i""",
+                    "0-foo1-foo2-foo3-foo4-foo5-foo6-foo7-foo8-foo9-foo-012")
+
+        self.verify("""\
+#defmacro testFoo: nothing
+#defmacro test(foo=1234): #for i in range(10): @src
+#test foo=234: $i-foo#slurp
+-#for i in range(3): $i""",
+                    "0-foo1-foo2-foo3-foo4-foo5-foo6-foo7-foo8-foo9-foo-012")
+
+        self.verify("""\
+#defmacro testFoo: nothing
+#defmacro test(foo=1234): #for i in range(10): @src@foo
+#test foo='-foo'#$i#end test#-#for i in range(3): $i""",
+                    "0-foo1-foo2-foo3-foo4-foo5-foo6-foo7-foo8-foo9-foo-012")
+
+        self.verify("""\
+#defmacro testFoo: nothing
+#defmacro test(foo=1234): #for i in range(10): @src.strip()@foo
+#test foo='-foo': $i
+-#for i in range(3): $i""",
+                    "0-foo1-foo2-foo3-foo4-foo5-foo6-foo7-foo8-foo9-foo-012")
+
+    def test2(self):
+        self.verify("#aMacro: foo",
+                    "blarg")
+        self.verify("#defmacro nested: @macros.aMacro(@src)\n#nested: foo",
+                    "blarg")
+
+
+class Indenter(OutputTest):
+    convertEOLs=False
+    
+    source = """
+public class X
+{
+    #for $method in $methods
+        $getMethod($method)
+        
+    #end for
+}
+//end of class
+
+#def getMethod($method)
+    #indent ++
+    public $getType($method) ${method.Name}($getParams($method.Params));
+    #indent --
+#end def
+
+#def getParams($params)
+    #indent off
+
+    #for $counter in $range($len($params))
+        #if $counter == len($params) - 1
+                       $params[$counter]#slurp
+        #else:
+                       $params[$counter], 
+        #end if
+    #end for
+    #indent on
+#end def
+
+#def getType($method)
+    #indent push
+    #indent=0
+    #if $method.Type == "VT_VOID"
+        void#slurp
+    #elif $method.Type == "VT_INT"
+        int#slurp
+    #elif $method.Type == "VT_VARIANT"
+        Object#slurp
+    #end if
+    #indent pop
+#end def
+"""
+
+    control = """
+public class X
+{
+    public void Foo(
+                       _input, 
+                       _output);
+
+
+    public int Bar(
+                       _str1, 
+                       str2, 
+                       _str3);
+
+
+    public Object Add(
+                       value1, 
+                       value);
+
+
+}
+//end of class
+
+
+
+"""
+    def _getCompilerSettings(self):
+        return {'useFilterArgsInPlaceholders':True}
+
+    def searchList(self):    # Inside Indenter class.
+        class Method:
+            def __init__(self, _name, _type, *_params):
+                self.Name = _name
+                self.Type = _type
+                self.Params = _params
+        methods = [Method("Foo", "VT_VOID", "_input", "_output"),
+                   Method("Bar", "VT_INT", "_str1", "str2", "_str3"),
+                   Method("Add", "VT_VARIANT", "value1", "value")]
+        return [{"methods": methods}]
+
+    def test1(self):    # Inside Indenter class.
+        self.verify(self.source, self.control)
+
+
+##################################################
+## CREATE CONVERTED EOL VERSIONS OF THE TEST CASES
+
+if OutputTest._useNewStyleCompilation and versionTuple >= (2,3):
+    extraCompileKwArgsForDiffBaseclass = {'baseclass':dict}
+else:
+    extraCompileKwArgsForDiffBaseclass = {'baseclass':object}
+    
+
+def install_eols():
+    klasses = [v for v in globals().values() if isinstance(v, (types.ClassType, types.TypeType)) and issubclass(v, unittest.TestCase)]
+    for klass in klasses:
+        name = klass.__name__        
+        if hasattr(klass,'convertEOLs') and klass.convertEOLs:
+            win32Src = r"class %(name)s_Win32EOL(%(name)s): _EOLreplacement = '\r\n'"%locals()
+            macSrc = r"class %(name)s_MacEOL(%(name)s): _EOLreplacement = '\r'"%locals()
+            exec win32Src in globals() 
+            exec macSrc in globals()
+
+        if versionTuple >= (2,3):
+            src = r"class %(name)s_DiffBaseClass(%(name)s): "%locals()
+            src += " _extraCompileKwArgs = extraCompileKwArgsForDiffBaseclass"
+            exec src in globals()
+
+        del name
+        del klass
+
+##################################################
+## if run from the command line ##
+        
+if __name__ == '__main__':
+    install_eols()
+    unittest.main()
+
+# vim: shiftwidth=4 tabstop=4 expandtab
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Tests/xmlrunner.py
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Tests/xmlrunner.py (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Tests/xmlrunner.py (revision 3)
@@ -0,0 +1,381 @@
+"""
+XML Test Runner for PyUnit
+"""
+
+# Written by Sebastian Rittau <srittau@jroger.in-berlin.de> and placed in
+# the Public Domain. With contributions by Paolo Borelli.
+
+__revision__ = "$Id: /private/python/stdlib/xmlrunner.py 16654 2007-11-12T12:46:35.368945Z srittau  $"
+
+import os.path
+import re
+import sys
+import time
+import traceback
+import unittest
+from StringIO import StringIO
+from xml.sax.saxutils import escape
+
+from StringIO import StringIO
+
+
+
+class _TestInfo(object):
+
+    """Information about a particular test.
+    
+    Used by _XMLTestResult.
+    
+    """
+
+    def __init__(self, test, time):
+        _pieces = test.id().split('.')
+        (self._class, self._method) = ('.'.join(_pieces[:-1]), _pieces[-1])
+        self._time = time
+        self._error = None
+        self._failure = None
+
+
+    def print_report(self, stream):
+        """Print information about this test case in XML format to the
+        supplied stream.
+
+        """
+        stream.write('  <testcase classname="%(class)s" name="%(method)s" time="%(time).4f">' % \
+            {
+                "class": self._class,
+                "method": self._method,
+                "time": self._time,
+            })
+        if self._failure != None:
+            self._print_error(stream, 'failure', self._failure)
+        if self._error != None:
+            self._print_error(stream, 'error', self._error)
+        stream.write('</testcase>\n')
+
+    def _print_error(self, stream, tagname, error):
+        """Print information from a failure or error to the supplied stream."""
+        text = escape(str(error[1]))
+        stream.write('\n')
+        stream.write('    <%s type="%s">%s\n' \
+            % (tagname, issubclass(error[0], Exception) and error[0].__name__ or str(error[0]), text))
+        tb_stream = StringIO()
+        traceback.print_tb(error[2], None, tb_stream)
+        stream.write(escape(tb_stream.getvalue()))
+        stream.write('    </%s>\n' % tagname)
+        stream.write('  ')
+
+# Module level functions since Python 2.3 doesn't grok decorators
+def create_success(test, time):
+    """Create a _TestInfo instance for a successful test."""
+    return _TestInfo(test, time)
+
+def create_failure(test, time, failure):
+    """Create a _TestInfo instance for a failed test."""
+    info = _TestInfo(test, time)
+    info._failure = failure
+    return info
+
+def create_error(test, time, error):
+    """Create a _TestInfo instance for an erroneous test."""
+    info = _TestInfo(test, time)
+    info._error = error
+    return info
+
+class _XMLTestResult(unittest.TestResult):
+
+    """A test result class that stores result as XML.
+
+    Used by XMLTestRunner.
+
+    """
+
+    def __init__(self, classname):
+        unittest.TestResult.__init__(self)
+        self._test_name = classname
+        self._start_time = None
+        self._tests = []
+        self._error = None
+        self._failure = None
+
+    def startTest(self, test):
+        unittest.TestResult.startTest(self, test)
+        self._error = None
+        self._failure = None
+        self._start_time = time.time()
+
+    def stopTest(self, test):
+        time_taken = time.time() - self._start_time
+        unittest.TestResult.stopTest(self, test)
+        if self._error:
+            info = create_error(test, time_taken, self._error)
+        elif self._failure:
+            info = create_failure(test, time_taken, self._failure)
+        else:
+            info = create_success(test, time_taken)
+        self._tests.append(info)
+
+    def addError(self, test, err):
+        unittest.TestResult.addError(self, test, err)
+        self._error = err
+
+    def addFailure(self, test, err):
+        unittest.TestResult.addFailure(self, test, err)
+        self._failure = err
+
+    def print_report(self, stream, time_taken, out, err):
+        """Prints the XML report to the supplied stream.
+        
+        The time the tests took to perform as well as the captured standard
+        output and standard error streams must be passed in.a
+
+        """
+        stream.write('<testsuite errors="%(e)d" failures="%(f)d" ' % \
+            { "e": len(self.errors), "f": len(self.failures) })
+        stream.write('name="%(n)s" tests="%(t)d" time="%(time).3f">\n' % \
+            {
+                "n": self._test_name,
+                "t": self.testsRun,
+                "time": time_taken,
+            })
+        for info in self._tests:
+            info.print_report(stream)
+        stream.write('  <system-out><![CDATA[%s]]></system-out>\n' % out)
+        stream.write('  <system-err><![CDATA[%s]]></system-err>\n' % err)
+        stream.write('</testsuite>\n')
+
+
+class XMLTestRunner(object):
+
+    """A test runner that stores results in XML format compatible with JUnit.
+
+    XMLTestRunner(stream=None) -> XML test runner
+
+    The XML file is written to the supplied stream. If stream is None, the
+    results are stored in a file called TEST-<module>.<class>.xml in the
+    current working directory (if not overridden with the path property),
+    where <module> and <class> are the module and class name of the test class.
+
+    """
+
+    def __init__(self, *args, **kwargs):
+        self._stream = kwargs.get('stream')
+        self._filename = kwargs.get('filename')
+        self._path = "."
+
+    def run(self, test):
+        """Run the given test case or test suite."""
+        class_ = test.__class__
+        classname = class_.__module__ + "." + class_.__name__
+        if self._stream == None:
+            filename = "TEST-%s.xml" % classname
+            if self._filename:
+                filename = self._filename
+            stream = file(os.path.join(self._path, filename), "w")
+            stream.write('<?xml version="1.0" encoding="utf-8"?>\n')
+        else:
+            stream = self._stream
+
+        result = _XMLTestResult(classname)
+        start_time = time.time()
+
+        # TODO: Python 2.5: Use the with statement
+        old_stdout = sys.stdout
+        old_stderr = sys.stderr
+        sys.stdout = StringIO()
+        sys.stderr = StringIO()
+
+        try:
+            test(result)
+            try:
+                out_s = sys.stdout.getvalue()
+            except AttributeError:
+                out_s = ""
+            try:
+                err_s = sys.stderr.getvalue()
+            except AttributeError:
+                err_s = ""
+        finally:
+            sys.stdout = old_stdout
+            sys.stderr = old_stderr
+
+        time_taken = time.time() - start_time
+        result.print_report(stream, time_taken, out_s, err_s)
+        if self._stream == None:
+            stream.close()
+
+        return result
+
+    def _set_path(self, path):
+        self._path = path
+
+    path = property(lambda self: self._path, _set_path, None,
+            """The path where the XML files are stored.
+            
+            This property is ignored when the XML file is written to a file
+            stream.""")
+
+
+class XMLTestRunnerTest(unittest.TestCase):
+    def setUp(self):
+        self._stream = StringIO()
+
+    def _try_test_run(self, test_class, expected):
+
+        """Run the test suite against the supplied test class and compare the
+        XML result against the expected XML string. Fail if the expected
+        string doesn't match the actual string. All time attribute in the
+        expected string should have the value "0.000". All error and failure
+        messages are reduced to "Foobar".
+
+        """
+
+        runner = XMLTestRunner(self._stream)
+        runner.run(unittest.makeSuite(test_class))
+
+        got = self._stream.getvalue()
+        # Replace all time="X.YYY" attributes by time="0.000" to enable a
+        # simple string comparison.
+        got = re.sub(r'time="\d+\.\d+"', 'time="0.000"', got)
+        # Likewise, replace all failure and error messages by a simple "Foobar"
+        # string.
+        got = re.sub(r'(?s)<failure (.*?)>.*?</failure>', r'<failure \1>Foobar</failure>', got)
+        got = re.sub(r'(?s)<error (.*?)>.*?</error>', r'<error \1>Foobar</error>', got)
+
+        self.assertEqual(expected, got)
+
+    def test_no_tests(self):
+        """Regression test: Check whether a test run without any tests
+        matches a previous run.
+        
+        """
+        class TestTest(unittest.TestCase):
+            pass
+        self._try_test_run(TestTest, """<testsuite errors="0" failures="0" name="unittest.TestSuite" tests="0" time="0.000">
+  <system-out><![CDATA[]]></system-out>
+  <system-err><![CDATA[]]></system-err>
+</testsuite>
+""")
+
+    def test_success(self):
+        """Regression test: Check whether a test run with a successful test
+        matches a previous run.
+        
+        """
+        class TestTest(unittest.TestCase):
+            def test_foo(self):
+                pass
+        self._try_test_run(TestTest, """<testsuite errors="0" failures="0" name="unittest.TestSuite" tests="1" time="0.000">
+  <testcase classname="__main__.TestTest" name="test_foo" time="0.000"></testcase>
+  <system-out><![CDATA[]]></system-out>
+  <system-err><![CDATA[]]></system-err>
+</testsuite>
+""")
+
+    def test_failure(self):
+        """Regression test: Check whether a test run with a failing test
+        matches a previous run.
+        
+        """
+        class TestTest(unittest.TestCase):
+            def test_foo(self):
+                self.assert_(False)
+        self._try_test_run(TestTest, """<testsuite errors="0" failures="1" name="unittest.TestSuite" tests="1" time="0.000">
+  <testcase classname="__main__.TestTest" name="test_foo" time="0.000">
+    <failure type="exceptions.AssertionError">Foobar</failure>
+  </testcase>
+  <system-out><![CDATA[]]></system-out>
+  <system-err><![CDATA[]]></system-err>
+</testsuite>
+""")
+
+    def test_error(self):
+        """Regression test: Check whether a test run with a erroneous test
+        matches a previous run.
+        
+        """
+        class TestTest(unittest.TestCase):
+            def test_foo(self):
+                raise IndexError()
+        self._try_test_run(TestTest, """<testsuite errors="1" failures="0" name="unittest.TestSuite" tests="1" time="0.000">
+  <testcase classname="__main__.TestTest" name="test_foo" time="0.000">
+    <error type="exceptions.IndexError">Foobar</error>
+  </testcase>
+  <system-out><![CDATA[]]></system-out>
+  <system-err><![CDATA[]]></system-err>
+</testsuite>
+""")
+
+    def test_stdout_capture(self):
+        """Regression test: Check whether a test run with output to stdout
+        matches a previous run.
+        
+        """
+        class TestTest(unittest.TestCase):
+            def test_foo(self):
+                print "Test"
+        self._try_test_run(TestTest, """<testsuite errors="0" failures="0" name="unittest.TestSuite" tests="1" time="0.000">
+  <testcase classname="__main__.TestTest" name="test_foo" time="0.000"></testcase>
+  <system-out><![CDATA[Test
+]]></system-out>
+  <system-err><![CDATA[]]></system-err>
+</testsuite>
+""")
+
+    def test_stderr_capture(self):
+        """Regression test: Check whether a test run with output to stderr
+        matches a previous run.
+        
+        """
+        class TestTest(unittest.TestCase):
+            def test_foo(self):
+                print >>sys.stderr, "Test"
+        self._try_test_run(TestTest, """<testsuite errors="0" failures="0" name="unittest.TestSuite" tests="1" time="0.000">
+  <testcase classname="__main__.TestTest" name="test_foo" time="0.000"></testcase>
+  <system-out><![CDATA[]]></system-out>
+  <system-err><![CDATA[Test
+]]></system-err>
+</testsuite>
+""")
+
+    class NullStream(object):
+        """A file-like object that discards everything written to it."""
+        def write(self, buffer):
+            pass
+
+    def test_unittests_changing_stdout(self):
+        """Check whether the XMLTestRunner recovers gracefully from unit tests
+        that change stdout, but don't change it back properly.
+
+        """
+        class TestTest(unittest.TestCase):
+            def test_foo(self):
+                sys.stdout = XMLTestRunnerTest.NullStream()
+
+        runner = XMLTestRunner(self._stream)
+        runner.run(unittest.makeSuite(TestTest))
+
+    def test_unittests_changing_stderr(self):
+        """Check whether the XMLTestRunner recovers gracefully from unit tests
+        that change stderr, but don't change it back properly.
+
+        """
+        class TestTest(unittest.TestCase):
+            def test_foo(self):
+                sys.stderr = XMLTestRunnerTest.NullStream()
+
+        runner = XMLTestRunner(self._stream)
+        runner.run(unittest.makeSuite(TestTest))
+
+
+class XMLTestProgram(unittest.TestProgram):
+    def runTests(self):
+        if self.testRunner is None:
+            self.testRunner = XMLTestRunner()
+        unittest.TestProgram.runTests(self)
+
+main = XMLTestProgram
+
+
+if __name__ == "__main__":
+    main(module=None)
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Tests/Template.py
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Tests/Template.py (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Tests/Template.py (revision 3)
@@ -0,0 +1,353 @@
+#!/usr/bin/env python
+
+import pdb
+import sys
+import types
+import os
+import os.path
+import tempfile
+import shutil
+import unittest
+from Cheetah.Template import Template
+
+majorVer, minorVer = sys.version_info[0], sys.version_info[1]
+versionTuple = (majorVer, minorVer)
+
+class TemplateTest(unittest.TestCase):
+    pass
+
+class ClassMethods_compile(TemplateTest):
+    """I am using the same Cheetah source for each test to root out clashes
+    caused by the compile caching in Template.compile().
+    """
+    
+    def test_basicUsage(self):
+        klass = Template.compile(source='$foo')
+        t = klass(namespaces={'foo':1234})
+        assert str(t)=='1234'
+
+    def test_baseclassArg(self):
+        klass = Template.compile(source='$foo', baseclass=dict)
+        t = klass({'foo':1234})
+        assert str(t)=='1234'
+
+        klass2 = Template.compile(source='$foo', baseclass=klass)
+        t = klass2({'foo':1234})
+        assert str(t)=='1234'
+
+        klass3 = Template.compile(source='#implements dummy\n$bar', baseclass=klass2)
+        t = klass3({'foo':1234})
+        assert str(t)=='1234'
+
+        klass4 = Template.compile(source='$foo', baseclass='dict')
+        t = klass4({'foo':1234})
+        assert str(t)=='1234'
+
+    def test_moduleFileCaching(self):
+        if versionTuple < (2,3):
+            return
+        tmpDir = tempfile.mkdtemp()
+        try:
+            #print tmpDir
+            assert os.path.exists(tmpDir)
+            klass = Template.compile(source='$foo',
+                                     cacheModuleFilesForTracebacks=True,
+                                     cacheDirForModuleFiles=tmpDir)
+            mod = sys.modules[klass.__module__]
+            #print mod.__file__
+            assert os.path.exists(mod.__file__)
+            assert os.path.dirname(mod.__file__)==tmpDir
+        finally:
+            shutil.rmtree(tmpDir, True)
+
+    def test_classNameArg(self):
+        klass = Template.compile(source='$foo', className='foo123')
+        assert klass.__name__=='foo123'
+        t = klass(namespaces={'foo':1234})
+        assert str(t)=='1234'
+
+    def test_moduleNameArg(self):
+        klass = Template.compile(source='$foo', moduleName='foo99')
+        mod = sys.modules['foo99']
+        assert klass.__name__=='foo99'
+        t = klass(namespaces={'foo':1234})
+        assert str(t)=='1234'
+
+
+        klass = Template.compile(source='$foo',
+                                 moduleName='foo1',
+                                 className='foo2')
+        mod = sys.modules['foo1']
+        assert klass.__name__=='foo2'
+        t = klass(namespaces={'foo':1234})
+        assert str(t)=='1234'
+
+
+    def test_mainMethodNameArg(self):
+        klass = Template.compile(source='$foo',
+                                 className='foo123',
+                                 mainMethodName='testMeth')
+        assert klass.__name__=='foo123'
+        t = klass(namespaces={'foo':1234})
+        #print t.generatedClassCode()
+        assert str(t)=='1234'
+        assert t.testMeth()=='1234'
+
+        klass = Template.compile(source='$foo',
+                                 moduleName='fooXXX',                                 
+                                 className='foo123',
+                                 mainMethodName='testMeth',
+                                 baseclass=dict)
+        assert klass.__name__=='foo123'
+        t = klass({'foo':1234})
+        #print t.generatedClassCode()
+        assert str(t)=='1234'
+        assert t.testMeth()=='1234'
+
+
+
+    def test_moduleGlobalsArg(self):
+        klass = Template.compile(source='$foo',
+                                 moduleGlobals={'foo':1234})
+        t = klass()
+        assert str(t)=='1234'
+
+        klass2 = Template.compile(source='$foo', baseclass='Test1',
+                                  moduleGlobals={'Test1':dict})
+        t = klass2({'foo':1234})
+        assert str(t)=='1234'
+
+        klass3 = Template.compile(source='$foo', baseclass='Test1',
+                                  moduleGlobals={'Test1':dict, 'foo':1234})
+        t = klass3()
+        assert str(t)=='1234'
+
+
+    def test_keepRefToGeneratedCodeArg(self):
+        klass = Template.compile(source='$foo',
+                                 className='unique58',
+                                 cacheCompilationResults=False,
+                                 keepRefToGeneratedCode=False)
+        t = klass(namespaces={'foo':1234})
+        assert str(t)=='1234'
+        assert not t.generatedModuleCode()
+
+
+        klass2 = Template.compile(source='$foo',
+                                 className='unique58',
+                                 keepRefToGeneratedCode=True)
+        t = klass2(namespaces={'foo':1234})
+        assert str(t)=='1234'
+        assert t.generatedModuleCode()
+
+        klass3 = Template.compile(source='$foo',
+                                 className='unique58',
+                                 keepRefToGeneratedCode=False)
+        t = klass3(namespaces={'foo':1234})
+        assert str(t)=='1234'
+        # still there as this class came from the cache
+        assert t.generatedModuleCode() 
+
+
+    def test_compilationCache(self):
+        klass = Template.compile(source='$foo',
+                                 className='unique111',
+                                 cacheCompilationResults=False)
+        t = klass(namespaces={'foo':1234})
+        assert str(t)=='1234'
+        assert not klass._CHEETAH_isInCompilationCache
+
+
+        # this time it will place it in the cache
+        klass = Template.compile(source='$foo',
+                                 className='unique111',
+                                 cacheCompilationResults=True)
+        t = klass(namespaces={'foo':1234})
+        assert str(t)=='1234'
+        assert klass._CHEETAH_isInCompilationCache
+
+        # by default it will be in the cache
+        klass = Template.compile(source='$foo',
+                                 className='unique999099')
+        t = klass(namespaces={'foo':1234})
+        assert str(t)=='1234'
+        assert klass._CHEETAH_isInCompilationCache
+
+
+class ClassMethods_subclass(TemplateTest):
+
+    def test_basicUsage(self):
+        klass = Template.compile(source='$foo', baseclass=dict)
+        t = klass({'foo':1234})
+        assert str(t)=='1234'
+
+        klass2 = klass.subclass(source='$foo')
+        t = klass2({'foo':1234})
+        assert str(t)=='1234'
+
+        klass3 = klass2.subclass(source='#implements dummy\n$bar')
+        t = klass3({'foo':1234})
+        assert str(t)=='1234'
+        
+
+class Preprocessors(TemplateTest):
+
+    def test_basicUsage1(self):
+        src='''\
+        %set foo = @a
+        $(@foo*10)
+        @a'''
+        src = '\n'.join([ln.strip() for ln in src.splitlines()])
+        preprocessors = {'tokens':'@ %',
+                         'namespaces':{'a':99}
+                         }
+        klass = Template.compile(src, preprocessors=preprocessors)
+        assert str(klass())=='990\n99'
+
+    def test_normalizePreprocessorArgVariants(self):
+        src='%set foo = 12\n%%comment\n$(@foo*10)'
+
+        class Settings1: tokens = '@ %' 
+        Settings1 = Settings1()
+            
+        from Cheetah.Template import TemplatePreprocessor
+        settings = Template._normalizePreprocessorSettings(Settings1)
+        preprocObj = TemplatePreprocessor(settings)
+
+        def preprocFunc(source, file):
+            return '$(12*10)', None
+
+        class TemplateSubclass(Template):
+            pass
+
+        compilerSettings = {'cheetahVarStartToken':'@',
+                            'directiveStartToken':'%',
+                            'commentStartToken':'%%',
+                            }
+        
+        for arg in ['@ %',
+                    {'tokens':'@ %'},
+                    {'compilerSettings':compilerSettings},
+                    {'compilerSettings':compilerSettings,
+                     'templateInitArgs':{}},
+                    {'tokens':'@ %',
+                     'templateAPIClass':TemplateSubclass},
+                    Settings1,
+                    preprocObj,
+                    preprocFunc,                    
+                    ]:
+            
+            klass = Template.compile(src, preprocessors=arg)
+            assert str(klass())=='120'
+
+
+    def test_complexUsage(self):
+        src='''\
+        %set foo = @a
+        %def func1: #def func(arg): $arg("***")
+        %% comment
+        $(@foo*10)
+        @func1
+        $func(lambda x:c"--$x--@a")'''
+        src = '\n'.join([ln.strip() for ln in src.splitlines()])
+
+        
+        for arg in [{'tokens':'@ %', 'namespaces':{'a':99} },
+                    {'tokens':'@ %', 'namespaces':{'a':99} },
+                    ]:
+            klass = Template.compile(src, preprocessors=arg)
+            t = klass()
+            assert str(t)=='990\n--***--99'
+
+
+
+    def test_i18n(self):
+        src='''\
+        %i18n: This is a $string that needs translation
+        %i18n id="foo", domain="root": This is a $string that needs translation
+        '''
+        src = '\n'.join([ln.strip() for ln in src.splitlines()])
+        klass = Template.compile(src, preprocessors='@ %', baseclass=dict)
+        t = klass({'string':'bit of text'})
+        #print str(t), repr(str(t))
+        assert str(t)==('This is a bit of text that needs translation\n'*2)[:-1]
+
+
+class TryExceptImportTest(TemplateTest):
+    def test_FailCase(self):
+        ''' Test situation where an inline #import statement will get relocated '''
+        source = '''
+            #def myFunction()
+                Ahoy!
+                #try
+                    #import sys
+                #except ImportError
+                    $print "This will never happen!"
+                #end try
+            #end def
+            '''
+        # This should raise an IndentationError (if the bug exists)
+        klass = Template.compile(source=source, compilerSettings={'useLegacyImportMode' : False})
+        t = klass(namespaces={'foo' : 1234})
+
+class ClassMethodSupport(TemplateTest):
+    def test_BasicDecorator(self):
+        if sys.version_info[0] == 2 and sys.version_info[1] == 3:
+                print 'This version of Python doesn\'t support decorators, skipping tests'
+                return
+        template = '''
+            #@classmethod
+            #def myClassMethod()
+                #return '$foo = %s' % $foo
+            #end def
+        '''
+        template = Template.compile(source=template)
+        try:
+            rc = template.myClassMethod(foo='bar')
+            assert rc == '$foo = bar', (rc, 'Template class method didn\'t return what I expected')
+        except AttributeError, ex:
+            self.fail(ex)
+
+class StaticMethodSupport(TemplateTest):
+    def test_BasicDecorator(self):
+        if sys.version_info[0] == 2 and sys.version_info[1] == 3:
+                print 'This version of Python doesn\'t support decorators, skipping tests'
+                return
+        template = '''
+            #@staticmethod
+            #def myStaticMethod()
+                #return '$foo = %s' % $foo
+            #end def
+        '''
+        template = Template.compile(source=template)
+        try:
+            rc = template.myStaticMethod(foo='bar')
+            assert rc == '$foo = bar', (rc, 'Template class method didn\'t return what I expected')
+        except AttributeError, ex:
+            self.fail(ex)
+
+class Useless(object):
+    def boink(self):
+        return [1, 2, 3]
+
+class MultipleInheritanceSupport(TemplateTest):
+    def runTest(self):
+        template = '''
+            #extends Template, Useless
+            #def foo()
+                #return [4,5] + $boink()
+            #end def
+        '''
+        template = Template.compile(template,
+                moduleGlobals={'Useless' : Useless},
+                compilerSettings={'autoImportForExtendsDirective' : False})
+        template = template()
+        result = template.foo()
+        assert result == [4, 5, 1, 2, 3], (result, 'Unexpected result')
+
+
+##################################################
+## if run from the command line ##
+        
+if __name__ == '__main__':
+    unittest.main()
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Tests/Test.py
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Tests/Test.py (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Tests/Test.py (revision 3)
@@ -0,0 +1,47 @@
+#!/usr/bin/env python
+'''
+Core module of Cheetah's Unit-testing framework
+
+TODO
+================================================================================
+# combo tests
+# negative test cases for expected exceptions
+# black-box vs clear-box testing
+# do some tests that run the Template for long enough to check that the refresh code works
+'''
+
+import sys
+import unittest
+
+import SyntaxAndOutput
+import NameMapper
+import Filters
+import Template
+import Cheps
+import Regressions
+import Unicode
+import CheetahWrapper
+
+SyntaxAndOutput.install_eols()
+
+suites = [
+   unittest.findTestCases(SyntaxAndOutput),
+   unittest.findTestCases(NameMapper),
+   unittest.findTestCases(Filters),
+   unittest.findTestCases(Template),
+   #unittest.findTestCases(Cheps),
+   unittest.findTestCases(Regressions),
+   unittest.findTestCases(Unicode),
+]
+
+if not sys.platform.startswith('java'):
+    suites.append(unittest.findTestCases(CheetahWrapper))
+
+if __name__ == '__main__':
+    runner = unittest.TextTestRunner()
+    if 'xml' in sys.argv:
+        import xmlrunner
+        runner = xmlrunner.XMLTestRunner(filename='Cheetah-Tests.xml')
+    
+    results = runner.run(unittest.TestSuite(suites))
+
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Tests/__init__.py
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Tests/__init__.py (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Tests/__init__.py (revision 3)
@@ -0,0 +1,1 @@
+#
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Tests/Performance.py
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Tests/Performance.py (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Tests/Performance.py (revision 3)
@@ -0,0 +1,221 @@
+#!/usr/bin/env python
+
+import Cheetah.NameMapper 
+import Cheetah.Template
+from Cheetah.Utils import statprof
+
+import os
+import sys
+import unittest
+
+from test import pystone
+import time
+
+# This can be turned on with the `--debug` flag when running the test
+# and will cause the tests to all just dump out how long they took
+# insteasd of asserting on duration
+DEBUG = False
+
+# TOLERANCE in Pystones
+kPS = 1000
+TOLERANCE = 0.5*kPS 
+
+class DurationError(AssertionError):
+    pass
+
+_pystone_calibration_mark = None
+def _pystone_calibration():
+    global _pystone_calibration_mark
+    if not _pystone_calibration_mark:
+        _pystone_calibration_mark = pystone.pystones(loops=pystone.LOOPS)
+    return _pystone_calibration_mark
+
+def perftest(max_num_pystones, current_pystone=None):
+    '''
+        Performance test decorator based off the 'timedtest' 
+        decorator found in this Active State recipe:
+            http://code.activestate.com/recipes/440700/
+    '''
+    if not isinstance(max_num_pystones, float):
+        max_num_pystones = float(max_num_pystones)
+
+    if not current_pystone:
+        current_pystone = _pystone_calibration()
+
+    def _test(function):
+        def wrapper(*args, **kw):
+            start_time = time.time()
+            try:
+                return function(*args, **kw)
+            finally:
+                total_time = time.time() - start_time
+                if total_time == 0:
+                    pystone_total_time = 0
+                else:
+                    pystone_rate = current_pystone[0] / current_pystone[1]
+                    pystone_total_time = total_time / pystone_rate
+                global DEBUG
+                if DEBUG:
+                    print 'The test "%s" took: %s pystones' % (function.func_name,
+                        pystone_total_time)
+                else:
+                    if pystone_total_time > (max_num_pystones + TOLERANCE):
+                        raise DurationError((('Test too long (%.2f Ps, '
+                                        'need at most %.2f Ps)')
+                                        % (pystone_total_time,
+                                            max_num_pystones)))
+        return wrapper
+    return _test
+
+
+class DynamicTemplatePerformanceTest(unittest.TestCase):
+    loops = 10
+    #@perftest(1200)
+    def test_BasicDynamic(self):
+        template = '''
+            #def foo(arg1, arg2)
+                #pass
+            #end def
+        '''
+        for i in xrange(self.loops):
+            klass = Cheetah.Template.Template.compile(template)
+            assert klass
+    test_BasicDynamic = perftest(1200)(test_BasicDynamic)
+
+class PerformanceTest(unittest.TestCase):
+    iterations = 1000000
+    display = False
+    def setUp(self):
+        super(PerformanceTest, self).setUp()
+        statprof.start()
+
+    def runTest(self):
+        for i in xrange(self.iterations):
+            if hasattr(self, 'performanceSample'):
+                self.display = True
+                self.performanceSample()
+
+    def tearDown(self):
+        super(PerformanceTest, self).tearDown()
+        statprof.stop()
+        if self.display:
+            print '>>> %s (%d iterations) ' % (self.__class__.__name__,
+                    self.iterations)
+            statprof.display()
+
+class DynamicMethodCompilationTest(PerformanceTest):
+    def performanceSample(self):
+        template = '''
+            #import sys
+            #import os
+            #def testMethod()
+                #set foo = [1, 2, 3, 4]
+                #return $foo[0]
+            #end def
+        '''
+        template = Cheetah.Template.Template.compile(template, 
+            keepRefToGeneratedCode=False)
+        template = template()
+        value = template.testMethod()
+
+class DynamicSimpleCompilationTest(PerformanceTest):
+    def performanceSample(self):
+        template = '''
+            #import sys
+            #import os
+            #set foo = [1,2,3,4]
+
+            Well hello there! This is basic.
+
+            Here's an array too: $foo
+        '''
+        template = Cheetah.Template.Template.compile(template, 
+            keepRefToGeneratedCode=False)
+        template = template()
+        template = unicode(template)
+
+
+class FilterTest(PerformanceTest):
+    template = None
+    def setUp(self):
+        super(FilterTest, self).setUp()
+        template = '''
+            #import sys
+            #import os
+            #set foo = [1, 2, 3, 4]
+
+            $foo, $foo, $foo
+        '''
+        template = Cheetah.Template.Template.compile(template, 
+            keepRefToGeneratedCode=False)
+        self.template = template()
+
+    def performanceSample(self):
+        value = unicode(self.template)
+
+
+class LongCompileTest(PerformanceTest):
+    ''' Test the compilation on a sufficiently large template '''
+    def compile(self, template):
+        return Cheetah.Template.Template.compile(template, keepRefToGeneratedCode=False)
+
+    def performanceSample(self):
+        template = '''
+            #import sys
+            #import Cheetah.Template
+
+            #extends Cheetah.Template.Template
+
+            #def header()
+                <center><h2>This is my header</h2></center>
+            #end def
+            
+            #def footer()
+                #return "Huzzah"
+            #end def
+
+            #def scripts()
+                #pass
+            #end def
+
+            #def respond()
+                <html>
+                    <head>
+                        <title>${title}</title>
+                        
+                        $scripts()
+                    </head>
+                    <body>
+                        $header()
+
+                        #for $i in $xrange(10)
+                            This is just some stupid page!
+                            <br/>
+                        #end for
+
+                        <br/>
+                        $footer()
+                    </body>
+                    </html>
+            #end def
+            
+        '''
+        return self.compile(template)
+
+class LongCompile_CompilerSettingsTest(LongCompileTest):
+    def compile(self, template):
+        return Cheetah.Template.Template.compile(template, keepRefToGeneratedCode=False,
+            compilerSettings={'useStackFrames' : True, 'useAutocalling' : True})
+
+class LongCompileAndRun(LongCompileTest):
+    def performanceSample(self):
+        template = super(LongCompileAndRun, self).performanceSample()
+        template = template(searchList=[{'title' : 'foo'}])
+        template = template.respond()
+            
+
+if __name__ == '__main__':
+    if '--debug' in sys.argv:
+        DEBUG = True
+        sys.argv = [arg for arg in sys.argv if not arg == '--debug']
+    unittest.main()
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Tests/CheetahWrapper.py
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Tests/CheetahWrapper.py (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Tests/CheetahWrapper.py (revision 3)
@@ -0,0 +1,545 @@
+#!/usr/bin/env python
+'''
+Tests for the 'cheetah' command.
+
+Besides unittest usage, recognizes the following command-line options:
+    --list CheetahWrapper.py
+        List all scenarios that are tested.  The argument is the path
+        of this script.
+     --nodelete
+        Don't delete scratch directory at end.
+     --output
+        Show the output of each subcommand.  (Normally suppressed.)
+'''
+import os
+import popen2
+import re                                     # Used by listTests.
+import shutil
+import sys
+import tempfile
+import unittest
+
+from optparse import OptionParser
+from Cheetah.CheetahWrapper import CheetahWrapper  # Used by NoBackup.
+
+
+DELETE = True # True to clean up after ourselves, False for debugging.
+OUTPUT = False # Normally False, True for debugging.
+
+BACKUP_SUFFIX = CheetahWrapper.BACKUP_SUFFIX
+
+def warn(msg):
+    sys.stderr.write(msg + '\n')
+
+class CFBase(unittest.TestCase):
+    """Base class for "cheetah compile" and "cheetah fill" unit tests.
+    """
+    srcDir = '' # Nonblank to create source directory.
+    subdirs = ('child', 'child/grandkid') # Delete in reverse order.
+    srcFiles = ('a.tmpl', 'child/a.tmpl', 'child/grandkid/a.tmpl')
+    expectError = False # Used by --list option.
+
+    def inform(self, message):
+        if self.verbose:
+            print message
+
+    def setUp(self):
+        """Create the top-level directories, subdirectories and .tmpl
+           files.
+        """
+        I = self.inform
+        # Step 1: Create the scratch directory and chdir into it.
+        self.scratchDir = scratchDir = tempfile.mktemp() 
+        os.mkdir(scratchDir)
+        self.origCwd = os.getcwd()
+        os.chdir(scratchDir)
+        if self.srcDir:
+            os.mkdir(self.srcDir)
+        # Step 2: Create source subdirectories.
+        for dir in self.subdirs:
+            os.mkdir(dir)
+        # Step 3: Create the .tmpl files, each in its proper directory.
+        for fil in self.srcFiles:
+            f = open(fil, 'w')
+            f.write("Hello, world!\n")
+            f.close()
+            
+
+    def tearDown(self):
+        os.chdir(self.origCwd)
+        if DELETE:
+            shutil.rmtree(self.scratchDir, True) # Ignore errors.
+            if os.path.exists(self.scratchDir):
+                warn("Warning: unable to delete scratch directory %s")
+        else:
+            warn("Warning: not deleting scratch directory %s" % self.scratchDir)
+
+
+    def _checkDestFileHelper(self, path, expected, 
+        allowSurroundingText, errmsg):
+        """Low-level helper to check a destination file.
+
+           in : path, string, the destination path.
+                expected, string, the expected contents.
+                allowSurroundingtext, bool, allow the result to contain
+                  additional text around the 'expected' substring?
+                errmsg, string, the error message.  It may contain the
+                  following "%"-operator keys: path, expected, result.
+           out: None
+        """
+        path = os.path.abspath(path)
+        exists = os.path.exists(path)
+        msg = "destination file missing: %s" % path
+        self.failUnless(exists, msg)
+        f = open(path, 'r')
+        result = f.read()
+        f.close()
+        if allowSurroundingText:
+            success = result.find(expected) != -1
+        else:
+            success = result == expected
+        msg = errmsg % locals()
+        self.failUnless(success, msg)
+
+
+    def checkCompile(self, path):
+        # Raw string to prevent "\n" from being converted to a newline.
+        #expected = R"write('Hello, world!\n')"
+        expected = "Hello, world!" # might output a u'' string
+        errmsg = """\
+destination file %(path)s doesn't contain expected substring:
+%(expected)r"""
+        self._checkDestFileHelper(path, expected, True, errmsg)
+
+
+    def checkFill(self, path):
+        expected = "Hello, world!\n"
+        errmsg = """\
+destination file %(path)s contains wrong result.
+Expected %(expected)r
+Found %(result)r"""
+        self._checkDestFileHelper(path, expected, False, errmsg)
+
+
+    def checkSubdirPyInit(self, path):
+        """Verify a destination subdirectory exists and contains an
+           __init__.py file.
+        """
+        exists = os.path.exists(path)
+        msg = "destination subdirectory %s misssing" % path
+        self.failUnless(exists, msg)
+        initPath = os.path.join(path, "__init__.py")
+        exists = os.path.exists(initPath)
+        msg = "destination init file missing: %s" % initPath
+        self.failUnless(exists, msg)
+
+
+    def checkNoBackup(self, path):
+        """Verify 'path' does not exist.  (To check --nobackup.)
+        """
+        exists = os.path.exists(path)
+        msg = "backup file exists in spite of --nobackup: %s" % path
+        self.failIf(exists, msg)
+
+
+    def assertWin32Subprocess(self, cmd):
+        _in, _out = os.popen4(cmd)
+        _in.close()
+        output = _out.read()
+        rc = _out.close()
+        if rc is None:
+            rc = 0
+        return rc, output
+
+    def assertPosixSubprocess(self, cmd):
+        process = popen2.Popen4(cmd)
+        process.tochild.close()
+        output = process.fromchild.read()
+        status = process.wait()
+        process.fromchild.close()
+        return status, output
+
+    def assertSubprocess(self, cmd, nonzero=False):
+        status, output = None, None
+        if sys.platform == 'win32':
+            status, output = self.assertWin32Subprocess(cmd)
+        else:
+            status, output = self.assertPosixSubprocess(cmd)
+
+        if not nonzero:
+            self.failUnlessEqual(status, 0, '''Subprocess exited with a non-zero status (%d)
+                            %s''' % (status, output))
+        else:
+            self.failIfEqual(status, 0, '''Subprocess exited with a zero status (%d)
+                            %s''' % (status, output))
+        return output 
+    
+    def go(self, cmd, expectedStatus=0, expectedOutputSubstring=None):
+        """Run a "cheetah compile" or "cheetah fill" subcommand.
+
+           in : cmd, string, the command to run.
+                expectedStatus, int, subcommand's expected output status.
+                  0 if the subcommand is expected to succeed, 1-255 otherwise.
+                expectedOutputSubstring, string, substring which much appear
+                  in the standard output or standard error.  None to skip this
+                  test.
+           out: None.
+        """
+        output = self.assertSubprocess(cmd)
+        if expectedOutputSubstring is not None:
+            msg = "substring %r not found in subcommand output: %s" % \
+                (expectedOutputSubstring, cmd)
+            substringTest = output.find(expectedOutputSubstring) != -1
+            self.failUnless(substringTest, msg)
+
+
+class CFIdirBase(CFBase):
+    """Subclass for tests with --idir.
+    """
+    srcDir = 'SRC'
+    subdirs = ('SRC/child', 'SRC/child/grandkid') # Delete in reverse order.
+    srcFiles = ('SRC/a.tmpl', 'SRC/child/a.tmpl', 'SRC/child/grandkid/a.tmpl')
+
+
+
+##################################################
+## TEST CASE CLASSES
+
+class OneFile(CFBase):
+    def testCompile(self):
+        self.go("cheetah compile a.tmpl")
+        self.checkCompile("a.py")
+
+    def testFill(self):
+        self.go("cheetah fill a.tmpl")
+        self.checkFill("a.html")
+
+    def testText(self):
+        self.go("cheetah fill --oext txt a.tmpl")
+        self.checkFill("a.txt")
+
+
+class OneFileNoExtension(CFBase):
+    def testCompile(self):
+        self.go("cheetah compile a")
+        self.checkCompile("a.py")
+
+    def testFill(self):
+        self.go("cheetah fill a")
+        self.checkFill("a.html")
+
+    def testText(self):
+        self.go("cheetah fill --oext txt a")
+        self.checkFill("a.txt")
+
+
+class SplatTmpl(CFBase):
+    def testCompile(self):
+        self.go("cheetah compile *.tmpl")
+        self.checkCompile("a.py")
+
+    def testFill(self):
+        self.go("cheetah fill *.tmpl")
+        self.checkFill("a.html")
+
+    def testText(self):
+        self.go("cheetah fill --oext txt *.tmpl")
+        self.checkFill("a.txt")
+
+class ThreeFilesWithSubdirectories(CFBase):
+    def testCompile(self):
+        self.go("cheetah compile a.tmpl child/a.tmpl child/grandkid/a.tmpl")
+        self.checkCompile("a.py")
+        self.checkCompile("child/a.py")
+        self.checkCompile("child/grandkid/a.py")
+
+    def testFill(self):
+        self.go("cheetah fill a.tmpl child/a.tmpl child/grandkid/a.tmpl")
+        self.checkFill("a.html")
+        self.checkFill("child/a.html")
+        self.checkFill("child/grandkid/a.html")
+
+    def testText(self):
+        self.go("cheetah fill --oext txt a.tmpl child/a.tmpl child/grandkid/a.tmpl")
+        self.checkFill("a.txt")
+        self.checkFill("child/a.txt")
+        self.checkFill("child/grandkid/a.txt")
+
+
+class ThreeFilesWithSubdirectoriesNoExtension(CFBase):
+    def testCompile(self):
+        self.go("cheetah compile a child/a child/grandkid/a")
+        self.checkCompile("a.py")
+        self.checkCompile("child/a.py")
+        self.checkCompile("child/grandkid/a.py")
+
+    def testFill(self):
+        self.go("cheetah fill a child/a child/grandkid/a")
+        self.checkFill("a.html")
+        self.checkFill("child/a.html")
+        self.checkFill("child/grandkid/a.html")
+
+    def testText(self):
+        self.go("cheetah fill --oext txt a child/a child/grandkid/a")
+        self.checkFill("a.txt")
+        self.checkFill("child/a.txt")
+        self.checkFill("child/grandkid/a.txt")
+
+
+class SplatTmplWithSubdirectories(CFBase):
+    def testCompile(self):
+        self.go("cheetah compile *.tmpl child/*.tmpl child/grandkid/*.tmpl")
+        self.checkCompile("a.py")
+        self.checkCompile("child/a.py")
+        self.checkCompile("child/grandkid/a.py")
+
+    def testFill(self):
+        self.go("cheetah fill *.tmpl child/*.tmpl child/grandkid/*.tmpl")
+        self.checkFill("a.html")
+        self.checkFill("child/a.html")
+        self.checkFill("child/grandkid/a.html")
+
+    def testText(self):
+        self.go("cheetah fill --oext txt *.tmpl child/*.tmpl child/grandkid/*.tmpl")
+        self.checkFill("a.txt")
+        self.checkFill("child/a.txt")
+        self.checkFill("child/grandkid/a.txt")
+
+
+class OneFileWithOdir(CFBase):
+    def testCompile(self):
+        self.go("cheetah compile --odir DEST a.tmpl")
+        self.checkSubdirPyInit("DEST")
+        self.checkCompile("DEST/a.py")
+
+    def testFill(self):
+        self.go("cheetah fill --odir DEST a.tmpl")
+        self.checkFill("DEST/a.html")
+
+    def testText(self):
+        self.go("cheetah fill --odir DEST --oext txt a.tmpl")
+        self.checkFill("DEST/a.txt")
+
+
+class VarietyWithOdir(CFBase):
+    def testCompile(self):
+        self.go("cheetah compile --odir DEST a.tmpl child/a child/grandkid/*.tmpl")
+        self.checkSubdirPyInit("DEST")
+        self.checkSubdirPyInit("DEST/child")
+        self.checkSubdirPyInit("DEST/child/grandkid")
+        self.checkCompile("DEST/a.py")
+        self.checkCompile("DEST/child/a.py")
+        self.checkCompile("DEST/child/grandkid/a.py")
+
+    def testFill(self):
+        self.go("cheetah fill --odir DEST a.tmpl child/a child/grandkid/*.tmpl")
+        self.checkFill("DEST/a.html")
+        self.checkFill("DEST/child/a.html")
+        self.checkFill("DEST/child/grandkid/a.html")
+
+    def testText(self):
+        self.go("cheetah fill --odir DEST --oext txt a.tmpl child/a child/grandkid/*.tmpl")
+        self.checkFill("DEST/a.txt")
+        self.checkFill("DEST/child/a.txt")
+        self.checkFill("DEST/child/grandkid/a.txt")
+
+
+class RecurseExplicit(CFBase):
+    def testCompile(self):
+        self.go("cheetah compile -R child")
+        self.checkCompile("child/a.py")
+        self.checkCompile("child/grandkid/a.py")
+
+    def testFill(self):
+        self.go("cheetah fill -R child")
+        self.checkFill("child/a.html")
+        self.checkFill("child/grandkid/a.html")
+
+    def testText(self):
+        self.go("cheetah fill -R --oext txt child")
+        self.checkFill("child/a.txt")
+        self.checkFill("child/grandkid/a.txt")
+
+
+class RecurseImplicit(CFBase):
+    def testCompile(self):
+        self.go("cheetah compile -R")
+        self.checkCompile("child/a.py")
+        self.checkCompile("child/grandkid/a.py")
+
+    def testFill(self):
+        self.go("cheetah fill -R")
+        self.checkFill("a.html")
+        self.checkFill("child/a.html")
+        self.checkFill("child/grandkid/a.html")
+
+    def testText(self):
+        self.go("cheetah fill -R --oext txt")
+        self.checkFill("a.txt")
+        self.checkFill("child/a.txt")
+        self.checkFill("child/grandkid/a.txt")
+
+
+class RecurseExplicitWIthOdir(CFBase):
+    def testCompile(self):
+        self.go("cheetah compile -R --odir DEST child")
+        self.checkSubdirPyInit("DEST/child")
+        self.checkSubdirPyInit("DEST/child/grandkid")
+        self.checkCompile("DEST/child/a.py")
+        self.checkCompile("DEST/child/grandkid/a.py")
+
+    def testFill(self):
+        self.go("cheetah fill -R --odir DEST child")
+        self.checkFill("DEST/child/a.html")
+        self.checkFill("DEST/child/grandkid/a.html")
+
+    def testText(self):
+        self.go("cheetah fill -R --odir DEST --oext txt child")
+        self.checkFill("DEST/child/a.txt")
+        self.checkFill("DEST/child/grandkid/a.txt")
+
+
+class Flat(CFBase):
+    def testCompile(self):
+        self.go("cheetah compile --flat child/a.tmpl")
+        self.checkCompile("a.py")
+
+    def testFill(self):
+        self.go("cheetah fill --flat child/a.tmpl")
+        self.checkFill("a.html")
+
+    def testText(self):
+        self.go("cheetah fill --flat --oext txt child/a.tmpl")
+        self.checkFill("a.txt")
+
+
+class FlatRecurseCollision(CFBase):
+    expectError = True
+
+    def testCompile(self):
+        self.assertSubprocess("cheetah compile -R --flat", nonzero=True)
+
+    def testFill(self):
+        self.assertSubprocess("cheetah fill -R --flat", nonzero=True)
+
+    def testText(self):
+        self.assertSubprocess("cheetah fill -R --flat", nonzero=True)
+
+
+class IdirRecurse(CFIdirBase):
+    def testCompile(self):
+        self.go("cheetah compile -R --idir SRC child")
+        self.checkSubdirPyInit("child")
+        self.checkSubdirPyInit("child/grandkid")
+        self.checkCompile("child/a.py")
+        self.checkCompile("child/grandkid/a.py")
+
+    def testFill(self):
+        self.go("cheetah fill -R --idir SRC child")
+        self.checkFill("child/a.html")
+        self.checkFill("child/grandkid/a.html")
+
+    def testText(self):
+        self.go("cheetah fill -R --idir SRC --oext txt child")
+        self.checkFill("child/a.txt")
+        self.checkFill("child/grandkid/a.txt")
+
+
+class IdirOdirRecurse(CFIdirBase):
+    def testCompile(self):
+        self.go("cheetah compile -R --idir SRC --odir DEST child")
+        self.checkSubdirPyInit("DEST/child")
+        self.checkSubdirPyInit("DEST/child/grandkid")
+        self.checkCompile("DEST/child/a.py")
+        self.checkCompile("DEST/child/grandkid/a.py")
+
+    def testFill(self):
+        self.go("cheetah fill -R --idir SRC --odir DEST child")
+        self.checkFill("DEST/child/a.html")
+        self.checkFill("DEST/child/grandkid/a.html")
+
+    def testText(self):
+        self.go("cheetah fill -R --idir SRC --odir DEST --oext txt child")
+        self.checkFill("DEST/child/a.txt")
+        self.checkFill("DEST/child/grandkid/a.txt")
+
+
+class IdirFlatRecurseCollision(CFIdirBase):
+    expectError = True
+
+    def testCompile(self):
+        self.assertSubprocess("cheetah compile -R --flat --idir SRC", nonzero=True)
+
+    def testFill(self):
+        self.assertSubprocess("cheetah fill -R --flat --idir SRC", nonzero=True)
+
+    def testText(self):
+        self.assertSubprocess("cheetah fill -R --flat --idir SRC --oext txt", nonzero=True)
+
+
+class NoBackup(CFBase):
+    """Run the command twice each time and verify a backup file is 
+       *not* created.
+    """
+    def testCompile(self):
+        self.go("cheetah compile --nobackup a.tmpl")
+        self.go("cheetah compile --nobackup a.tmpl")
+        self.checkNoBackup("a.py" + BACKUP_SUFFIX)
+
+    def testFill(self):
+        self.go("cheetah fill --nobackup a.tmpl")
+        self.go("cheetah fill --nobackup a.tmpl")
+        self.checkNoBackup("a.html" + BACKUP_SUFFIX)
+
+    def testText(self):
+        self.go("cheetah fill --nobackup --oext txt a.tmpl")
+        self.go("cheetah fill --nobackup --oext txt a.tmpl")
+        self.checkNoBackup("a.txt" + BACKUP_SUFFIX)
+
+def listTests(cheetahWrapperFile):
+    """cheetahWrapperFile, string, path of this script.
+
+       XXX TODO: don't print test where expectError is true.
+    """
+    rx = re.compile( R'self\.go\("(.*?)"\)' )
+    f = open(cheetahWrapperFile)
+    while 1:
+        lin = f.readline()
+        if not lin:
+            break
+        m = rx.search(lin)
+        if m:
+            print m.group(1)
+    f.close()
+
+def main():
+    global DELETE, OUTPUT
+    parser = OptionParser()
+    parser.add_option("--list", action="store", dest="listTests")
+    parser.add_option("--nodelete", action="store_true")
+    parser.add_option("--output", action="store_true")
+    # The following options are passed to unittest.
+    parser.add_option("-e", "--explain", action="store_true")
+    parser.add_option("-v", "--verbose", action="store_true")
+    parser.add_option("-q", "--quiet", action="store_true")
+    opts, files = parser.parse_args()
+    if opts.nodelete:
+        DELETE = False
+    if opts.output:
+        OUTPUT = True
+    if opts.listTests:
+        listTests(opts.listTests)
+    else:
+        # Eliminate script-specific command-line arguments to prevent
+        # errors in unittest.
+        del sys.argv[1:]
+        for opt in ("explain", "verbose", "quiet"):
+            if getattr(opts, opt):
+                sys.argv.append("--" + opt)
+        sys.argv.extend(files)
+        unittest.main()
+        
+if __name__ == '__main__':
+    main()
+
+# vim: sw=4 ts=4 expandtab
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Tests/Cheps.py
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Tests/Cheps.py (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Tests/Cheps.py (revision 3)
@@ -0,0 +1,39 @@
+#!/usr/bin/env python
+
+import unittest
+
+import Cheetah
+import Cheetah.Parser
+import Cheetah.Template
+
+class Chep_2_Conditionalized_Import_Behavior(unittest.TestCase):
+    def test_ModuleLevelImport(self):
+        ''' Verify module level (traditional) import behavior '''
+        pass
+
+    def test_InlineImport(self):
+        ''' Verify (new) inline import behavior works '''
+        template = '''
+            #def funky($s)
+                #try
+                    #import urllib
+                #except ImportError
+                    #pass
+                #end try
+                #return urllib.quote($s)
+            #end def
+        '''
+        try:
+            template = Cheetah.Template.Template.compile(template)
+        except Cheetah.Parser.ParseError, ex:
+            self.fail('Failed to properly generate code %s' % ex)
+        template = template()
+        rc = tepmlate.funky('abc def')
+        assert rc == 'abc+def'
+
+    def test_LegacyMode(self):
+        ''' Verify disabling of CHEP #2 works '''
+        pass
+
+if __name__ == '__main__':
+    unittest.main()
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Tests/Regressions.py
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Tests/Regressions.py (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Tests/Regressions.py (revision 3)
@@ -0,0 +1,247 @@
+#!/usr/bin/env python
+
+import Cheetah.NameMapper 
+import Cheetah.Template
+
+import sys
+import unittest
+
+
+majorVer, minorVer = sys.version_info[0], sys.version_info[1]
+versionTuple = (majorVer, minorVer)
+
+def isPython23():
+    ''' Python 2.3 is still supported by Cheetah, but doesn't support decorators '''
+    return majorVer == 2 and minorVer < 4
+
+class GetAttrException(Exception):
+    pass
+
+class CustomGetAttrClass(object):
+    def __getattr__(self, name):
+        raise GetAttrException('FAIL, %s' % name)
+
+class GetAttrTest(unittest.TestCase):
+    '''
+        Test for an issue occurring when __getatttr__() raises an exception
+        causing NameMapper to raise a NotFound exception
+    '''
+    def test_ValidException(self):
+        o = CustomGetAttrClass()
+        try:
+            print o.attr
+        except GetAttrException, e:
+            # expected
+            return
+        except:
+            self.fail('Invalid exception raised: %s' % e)
+        self.fail('Should have had an exception raised')
+
+    def test_NotFoundException(self):
+        template = '''
+            #def raiseme()
+                $obj.attr
+            #end def'''
+
+        template = Cheetah.Template.Template.compile(template, compilerSettings={}, keepRefToGeneratedCode=True)
+        template = template(searchList=[{'obj' : CustomGetAttrClass()}])
+        assert template, 'We should have a valid template object by now'
+
+        self.failUnlessRaises(GetAttrException, template.raiseme)
+
+
+class InlineImportTest(unittest.TestCase):
+    def test_FromFooImportThing(self):
+        '''
+            Verify that a bug introduced in v2.1.0 where an inline:
+                #from module import class
+            would result in the following code being generated:
+                import class
+        '''
+        template = '''
+            #def myfunction()
+                #if True
+                    #from os import path
+                    #return 17
+                    Hello!
+                #end if
+            #end def
+        '''
+        template = Cheetah.Template.Template.compile(template, compilerSettings={'useLegacyImportMode' : False}, keepRefToGeneratedCode=True)
+        template = template(searchList=[{}])
+
+        assert template, 'We should have a valid template object by now'
+
+        rc = template.myfunction()
+        assert rc == 17, (template, 'Didn\'t get a proper return value')
+
+    def test_ImportFailModule(self):
+        template = '''
+            #try
+                #import invalidmodule
+            #except
+                #set invalidmodule = dict(FOO='BAR!')
+            #end try
+
+            $invalidmodule.FOO
+        '''
+        template = Cheetah.Template.Template.compile(template, compilerSettings={'useLegacyImportMode' : False}, keepRefToGeneratedCode=True)
+        template = template(searchList=[{}])
+
+        assert template, 'We should have a valid template object by now'
+        assert str(template), 'We weren\'t able to properly generate the result from the template'
+
+    def test_ProperImportOfBadModule(self):
+        template = '''
+            #from invalid import fail
+                
+            This should totally $fail
+        '''
+        self.failUnlessRaises(ImportError, Cheetah.Template.Template.compile, template, compilerSettings={'useLegacyImportMode' : False}, keepRefToGeneratedCode=True)
+
+    def test_AutoImporting(self):
+        template = '''
+            #extends FakeyTemplate
+
+            Boo!
+        '''
+        self.failUnlessRaises(ImportError, Cheetah.Template.Template.compile, template)
+
+    def test_StuffBeforeImport_Legacy(self):
+        template = '''
+###
+### I like comments before import
+###
+#extends Foo
+Bar
+'''
+        self.failUnlessRaises(ImportError, Cheetah.Template.Template.compile, template, compilerSettings={'useLegacyImportMode' : True}, keepRefToGeneratedCode=True)
+
+
+class Mantis_Issue_11_Regression_Test(unittest.TestCase):
+    ''' 
+        Test case for bug outlined in Mantis issue #11:
+            
+        Output:
+        Traceback (most recent call last):
+          File "test.py", line 12, in <module>
+            t.respond()
+          File "DynamicallyCompiledCheetahTemplate.py", line 86, in respond
+          File "/usr/lib64/python2.6/cgi.py", line 1035, in escape
+            s = s.replace("&", "&") # Must be done first! 
+    '''
+    def test_FailingBehavior(self):
+        import cgi
+        template = Cheetah.Template.Template("$escape($request)", searchList=[{'escape' : cgi.escape, 'request' : 'foobar'}])
+        assert template
+        self.failUnlessRaises(AttributeError, template.respond)
+
+
+    def test_FailingBehaviorWithSetting(self):
+        import cgi
+        template = Cheetah.Template.Template("$escape($request)", 
+                searchList=[{'escape' : cgi.escape, 'request' : 'foobar'}], 
+                compilerSettings={'prioritizeSearchListOverSelf' : True})
+        assert template
+        assert template.respond()
+
+class Mantis_Issue_21_Regression_Test(unittest.TestCase):
+    ''' 
+        Test case for bug outlined in issue #21
+
+        Effectively @staticmethod and @classmethod
+        decorated methods in templates don't 
+        properly define the _filter local, which breaks
+        when using the NameMapper
+    '''
+    def runTest(self):
+        if isPython23():
+            return
+        template = '''
+            #@staticmethod
+            #def testMethod()
+                This is my $output
+            #end def
+        '''
+        template = Cheetah.Template.Template.compile(template)
+        assert template
+        assert template.testMethod(output='bug') # raises a NameError: global name '_filter' is not defined
+
+
+class Mantis_Issue_22_Regression_Test(unittest.TestCase):
+    ''' 
+        Test case for bug outlined in issue #22
+
+        When using @staticmethod and @classmethod
+        in conjunction with the #filter directive
+        the generated code for the #filter is reliant
+        on the `self` local, breaking the function
+    '''
+    def test_NoneFilter(self):
+        # XXX: Disabling this test for now
+        return
+        if isPython23():
+            return
+        template = '''
+            #@staticmethod
+            #def testMethod()
+                #filter None
+                    This is my $output
+                #end filter
+            #end def
+        '''
+        template = Cheetah.Template.Template.compile(template)
+        assert template
+        assert template.testMethod(output='bug')
+
+    def test_DefinedFilter(self):
+        # XXX: Disabling this test for now
+        return
+        if isPython23():
+            return
+        template = '''
+            #@staticmethod
+            #def testMethod()
+                #filter Filter
+                    This is my $output
+                #end filter
+            #end def
+        '''
+        # The generated code for the template's testMethod() should look something
+        # like this in the 'error' case:
+        '''
+        @staticmethod
+        def testMethod(**KWS):
+            ## CHEETAH: generated from #def testMethod() at line 3, col 13.
+            trans = DummyTransaction()
+            _dummyTrans = True
+            write = trans.response().write
+            SL = [KWS]
+            _filter = lambda x, **kwargs: unicode(x)
+
+            ########################################
+            ## START - generated method body
+
+            _orig_filter_18517345 = _filter
+            filterName = u'Filter'
+            if self._CHEETAH__filters.has_key("Filter"):
+                _filter = self._CHEETAH__currentFilter = self._CHEETAH__filters[filterName]
+            else:
+                _filter = self._CHEETAH__currentFilter = \
+                            self._CHEETAH__filters[filterName] = getattr(self._CHEETAH__filtersLib, filterName)(self).filter
+            write(u'                    This is my ')
+            _v = VFFSL(SL,"output",True) # u'$output' on line 5, col 32
+            if _v is not None: write(_filter(_v, rawExpr=u'$output')) # from line 5, col 32.
+
+            ########################################
+            ## END - generated method body
+
+            return _dummyTrans and trans.response().getvalue() or ""
+        '''
+        template = Cheetah.Template.Template.compile(template)
+        assert template
+        assert template.testMethod(output='bug')
+
+
+if __name__ == '__main__':
+    unittest.main()
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Tests/unittest_local_copy.py
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Tests/unittest_local_copy.py (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Tests/unittest_local_copy.py (revision 3)
@@ -0,0 +1,978 @@
+#!/usr/bin/env python
+""" This is a hacked version of PyUnit that extends its reporting capabilities
+with optional meta data on the test cases.  It also makes it possible to
+separate the standard and error output streams in TextTestRunner.
+
+It's a hack rather than a set of subclasses because a) Steve had used double
+underscore private attributes for some things I needed access to, and b) the
+changes affected so many classes that it was easier just to hack it.
+
+The changes are in the following places:
+TestCase:
+   - minor refactoring of  __init__ and __call__ internals
+   - added some attributes and methods for storing and retrieving meta data
+
+_TextTestResult
+   - refactored the stream handling
+   - incorporated all the output code from TextTestRunner
+   - made the output of FAIL and ERROR information more flexible and
+     incorporated the new meta data from TestCase
+   - added a flag called 'explain' to __init__ that controls whether the new '
+     explanation'   meta data from TestCase is printed along with tracebacks
+   
+TextTestRunner
+   - delegated all output to _TextTestResult
+   - added 'err' and 'explain' to the __init__ signature to match the changes
+     in _TextTestResult
+   
+TestProgram
+   - added -e and --explain as flags on the command line
+
+-- Tavis Rudd <tavis@redonions.net> (Sept 28th, 2001)
+
+- _TestTextResult.printErrorList(): print blank line after each traceback
+
+-- Mike Orr <mso@oz.net> (Nov 11, 2002)
+
+TestCase methods copied from unittest in Python 2.3:
+  - .assertAlmostEqual(first, second, places=7, msg=None): to N decimal places.
+  - .failIfAlmostEqual(first, second, places=7, msg=None)
+
+-- Mike Orr (Jan 5, 2004)
+
+
+Below is the original docstring for unittest.
+---------------------------------------------------------------------------
+Python unit testing framework, based on Erich Gamma's JUnit and Kent Beck's
+Smalltalk testing framework.
+
+This module contains the core framework classes that form the basis of
+specific test cases and suites (TestCase, TestSuite etc.), and also a
+text-based utility class for running the tests and reporting the results
+(TextTestRunner).
+
+Simple usage:
+
+    import unittest
+
+    class IntegerArithmenticTestCase(unittest.TestCase):
+        def testAdd(self):  ## test method names begin 'test*'
+            self.assertEquals((1 + 2), 3)
+            self.assertEquals(0 + 1, 1)
+        def testMultiply(self);
+            self.assertEquals((0 * 10), 0)
+            self.assertEquals((5 * 8), 40)
+
+    if __name__ == '__main__':
+        unittest.main()
+
+Further information is available in the bundled documentation, and from
+
+  http://pyunit.sourceforge.net/
+
+Copyright (c) 1999, 2000, 2001 Steve Purcell
+This module is free software, and you may redistribute it and/or modify
+it under the same terms as Python itself, so long as this copyright message
+and disclaimer are retained in their original form.
+
+IN NO EVENT SHALL THE AUTHOR BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
+SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF
+THIS CODE, EVEN IF THE AUTHOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGE.
+
+THE AUTHOR SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE.  THE CODE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS,
+AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE,
+SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+"""
+
+__author__ = "Steve Purcell"
+__email__ = "stephen_purcell at yahoo dot com"
+__revision__ = "$Revision: 1.11 $"[11:-2]
+
+
+##################################################
+## DEPENDENCIES ##
+
+import os
+import re
+import string
+import sys
+import time
+import traceback
+import types
+import pprint
+
+##################################################
+## CONSTANTS & GLOBALS
+
+try:
+    True,False
+except NameError:
+    True, False = (1==1),(1==0)
+
+##############################################################################
+# Test framework core
+##############################################################################
+
+
+class TestResult:
+    """Holder for test result information.
+
+    Test results are automatically managed by the TestCase and TestSuite
+    classes, and do not need to be explicitly manipulated by writers of tests.
+
+    Each instance holds the total number of tests run, and collections of
+    failures and errors that occurred among those test runs. The collections
+    contain tuples of (testcase, exceptioninfo), where exceptioninfo is a
+    tuple of values as returned by sys.exc_info().
+    """
+    def __init__(self):
+        self.failures = []
+        self.errors = []
+        self.testsRun = 0
+        self.shouldStop = 0
+
+    def startTest(self, test):
+        "Called when the given test is about to be run"
+        self.testsRun = self.testsRun + 1
+
+    def stopTest(self, test):
+        "Called when the given test has been run"
+        pass
+
+    def addError(self, test, err):
+        "Called when an error has occurred"
+        self.errors.append((test, err))
+
+    def addFailure(self, test, err):
+        "Called when a failure has occurred"
+        self.failures.append((test, err))
+
+    def addSuccess(self, test):
+        "Called when a test has completed successfully"
+        pass
+
+    def wasSuccessful(self):
+        "Tells whether or not this result was a success"
+        return len(self.failures) == len(self.errors) == 0
+
+    def stop(self):
+        "Indicates that the tests should be aborted"
+        self.shouldStop = 1
+
+    def __repr__(self):
+        return "<%s run=%i errors=%i failures=%i>" % \
+               (self.__class__, self.testsRun, len(self.errors),
+                len(self.failures))
+        
+class TestCase:
+    """A class whose instances are single test cases.
+
+    By default, the test code itself should be placed in a method named
+    'runTest'.
+
+    If the fixture may be used for many test cases, create as
+    many test methods as are needed. When instantiating such a TestCase
+    subclass, specify in the constructor arguments the name of the test method
+    that the instance is to execute.
+
+    Test authors should subclass TestCase for their own tests. Construction
+    and deconstruction of the test's environment ('fixture') can be
+    implemented by overriding the 'setUp' and 'tearDown' methods respectively.
+
+    If it is necessary to override the __init__ method, the base class
+    __init__ method must always be called. It is important that subclasses
+    should not change the signature of their __init__ method, since instances
+    of the classes are instantiated automatically by parts of the framework
+    in order to be run.
+    """
+
+    # This attribute determines which exception will be raised when
+    # the instance's assertion methods fail; test methods raising this
+    # exception will be deemed to have 'failed' rather than 'errored'
+
+    failureException = AssertionError
+
+    # the name of the fixture.  Used for displaying meta data about the test
+    name = None
+    
+    def __init__(self, methodName='runTest'):
+        """Create an instance of the class that will use the named test
+        method when executed. Raises a ValueError if the instance does
+        not have a method with the specified name.
+        """
+        self._testMethodName = methodName
+        self._setupTestMethod()
+        self._setupMetaData()
+
+    def _setupTestMethod(self):
+        try:
+            self._testMethod = getattr(self, self._testMethodName)
+        except AttributeError:
+            raise ValueError, "no such test method in %s: %s" % \
+                  (self.__class__, self._testMethodName)
+        
+    ## meta data methods
+        
+    def _setupMetaData(self):
+        """Setup the default meta data for the test case:
+
+        - id: self.__class__.__name__ + testMethodName OR self.name + testMethodName
+        - description: 1st line of Class docstring + 1st line of method docstring
+        - explanation: rest of Class docstring + rest of method docstring
+        
+        """
+
+        
+        testDoc = self._testMethod.__doc__ or '\n'
+        testDocLines = testDoc.splitlines()
+        
+        testDescription = testDocLines[0].strip() 
+        if len(testDocLines) > 1:
+            testExplanation = '\n'.join(
+                [ln.strip() for ln in testDocLines[1:]]
+                ).strip()
+        else:
+            testExplanation = ''
+            
+        fixtureDoc = self.__doc__ or '\n'
+        fixtureDocLines = fixtureDoc.splitlines()
+        fixtureDescription = fixtureDocLines[0].strip()
+        if len(fixtureDocLines) > 1:
+            fixtureExplanation = '\n'.join(
+                [ln.strip() for ln in fixtureDocLines[1:]]
+                ).strip()
+        else:
+            fixtureExplanation = ''
+        
+        if not self.name:
+            self.name = self.__class__
+        self._id = "%s.%s" % (self.name, self._testMethodName)
+        
+        if not fixtureDescription:
+            self._description = testDescription
+        else:
+            self._description = fixtureDescription + ', ' + testDescription
+
+        if not fixtureExplanation:
+            self._explanation = testExplanation
+        else:
+            self._explanation = ['Fixture Explanation:',
+                                 '--------------------',
+                                 fixtureExplanation,
+                                 '',
+                                 'Test Explanation:',
+                                 '-----------------',
+                                 testExplanation
+                                 ]
+            self._explanation = '\n'.join(self._explanation)
+
+    def id(self):
+        return self._id
+
+    def setId(self, id):
+        self._id = id
+
+    def describe(self):
+        """Returns a one-line description of the test, or None if no
+        description has been provided.
+
+        The default implementation of this method returns the first line of
+        the specified test method's docstring.
+        """
+        return self._description
+
+    shortDescription = describe
+    
+    def setDescription(self, descr):
+        self._description = descr
+    
+    def explain(self):
+        return self._explanation
+
+    def setExplanation(self, expln):
+        self._explanation = expln
+
+    ## core methods
+
+    def setUp(self):
+        "Hook method for setting up the test fixture before exercising it."
+        pass
+    
+    def run(self, result=None):
+        return self(result)
+        
+    def tearDown(self):
+        "Hook method for deconstructing the test fixture after testing it."
+        pass
+
+    def debug(self):
+        """Run the test without collecting errors in a TestResult"""
+        self.setUp()
+        self._testMethod()
+        self.tearDown()
+
+    ## internal methods
+
+    def defaultTestResult(self):
+        return TestResult()
+    
+    def __call__(self, result=None):
+        if result is None:
+            result = self.defaultTestResult()
+        
+        result.startTest(self)
+        try:
+            try:
+                self.setUp()
+            except:
+                result.addError(self, self.__exc_info())
+                return
+            
+            ok = 0
+            try:
+                self._testMethod()
+                ok = 1
+            except self.failureException, e:
+                result.addFailure(self, self.__exc_info())
+            except:
+                result.addError(self, self.__exc_info())
+            try:
+                self.tearDown()
+            except:
+                result.addError(self, self.__exc_info())
+                ok = 0
+            if ok:
+                result.addSuccess(self)
+        finally:
+            result.stopTest(self)
+            
+        return result
+        
+    def countTestCases(self):
+        return 1
+       
+    def __str__(self):
+        return "%s (%s)" % (self._testMethodName, self.__class__)
+
+    def __repr__(self):
+        return "<%s testMethod=%s>" % \
+               (self.__class__, self._testMethodName)
+
+    def __exc_info(self):
+        """Return a version of sys.exc_info() with the traceback frame
+           minimised; usually the top level of the traceback frame is not
+           needed.
+        """
+        exctype, excvalue, tb = sys.exc_info()
+        if sys.platform[:4] == 'java': ## tracebacks look different in Jython
+            return (exctype, excvalue, tb)
+        newtb = tb.tb_next
+        if newtb is None:
+            return (exctype, excvalue, tb)
+        return (exctype, excvalue, newtb)
+
+    ## methods for use by the test cases
+
+    def fail(self, msg=None):
+        """Fail immediately, with the given message."""
+        raise self.failureException, msg
+
+    def failIf(self, expr, msg=None):
+        "Fail the test if the expression is true."
+        if expr: raise self.failureException, msg
+
+    def failUnless(self, expr, msg=None):
+        """Fail the test unless the expression is true."""
+        if not expr: raise self.failureException, msg
+
+    def failUnlessRaises(self, excClass, callableObj, *args, **kwargs):
+        """Fail unless an exception of class excClass is thrown
+           by callableObj when invoked with arguments args and keyword
+           arguments kwargs. If a different type of exception is
+           thrown, it will not be caught, and the test case will be
+           deemed to have suffered an error, exactly as for an
+           unexpected exception.
+        """
+        try:
+            apply(callableObj, args, kwargs)
+        except excClass:
+            return
+        else:
+            if hasattr(excClass,'__name__'): excName = excClass.__name__
+            else: excName = str(excClass)
+            raise self.failureException, excName
+
+    def failUnlessEqual(self, first, second, msg=None):
+        """Fail if the two objects are unequal as determined by the '!='
+           operator.
+        """
+        if first != second:
+            raise self.failureException, (msg or '%s != %s' % (first, second))
+
+    def failIfEqual(self, first, second, msg=None):
+        """Fail if the two objects are equal as determined by the '=='
+           operator.
+        """
+        if first == second:
+            raise self.failureException, (msg or '%s == %s' % (first, second))
+
+    def failUnlessAlmostEqual(self, first, second, places=7, msg=None):
+        """Fail if the two objects are unequal as determined by their
+           difference rounded to the given number of decimal places
+           (default 7) and comparing to zero.
+
+           Note that decimal places (from zero) is usually not the same
+           as significant digits (measured from the most signficant digit).
+        """
+        if round(second-first, places) != 0:
+            raise self.failureException, \
+                  (msg or '%s != %s within %s places' % (`first`, `second`, `places` ))
+
+    def failIfAlmostEqual(self, first, second, places=7, msg=None):
+        """Fail if the two objects are equal as determined by their
+           difference rounded to the given number of decimal places
+           (default 7) and comparing to zero.
+
+           Note that decimal places (from zero) is usually not the same
+           as significant digits (measured from the most signficant digit).
+        """
+        if round(second-first, places) == 0:
+            raise self.failureException, \
+                  (msg or '%s == %s within %s places' % (`first`, `second`, `places`))
+
+    ## aliases
+
+    assertEqual = assertEquals = failUnlessEqual
+
+    assertNotEqual = assertNotEquals = failIfEqual
+
+    assertAlmostEqual = assertAlmostEquals = failUnlessAlmostEqual
+
+    assertNotAlmostEqual = assertNotAlmostEquals = failIfAlmostEqual
+
+    assertRaises = failUnlessRaises
+
+    assert_ = failUnless
+
+
+class FunctionTestCase(TestCase):
+    """A test case that wraps a test function.
+
+    This is useful for slipping pre-existing test functions into the
+    PyUnit framework. Optionally, set-up and tidy-up functions can be
+    supplied. As with TestCase, the tidy-up ('tearDown') function will
+    always be called if the set-up ('setUp') function ran successfully.
+    """
+
+    def __init__(self, testFunc, setUp=None, tearDown=None,
+                 description=None):
+        TestCase.__init__(self)
+        self.__setUpFunc = setUp
+        self.__tearDownFunc = tearDown
+        self.__testFunc = testFunc
+        self.__description = description
+
+    def setUp(self):
+        if self.__setUpFunc is not None:
+            self.__setUpFunc()
+
+    def tearDown(self):
+        if self.__tearDownFunc is not None:
+            self.__tearDownFunc()
+
+    def runTest(self):
+        self.__testFunc()
+
+    def id(self):
+        return self.__testFunc.__name__
+
+    def __str__(self):
+        return "%s (%s)" % (self.__class__, self.__testFunc.__name__)
+
+    def __repr__(self):
+        return "<%s testFunc=%s>" % (self.__class__, self.__testFunc)
+
+
+    def describe(self):
+        if self.__description is not None: return self.__description
+        doc = self.__testFunc.__doc__
+        return doc and string.strip(string.split(doc, "\n")[0]) or None
+    
+    ## aliases
+    shortDescription = describe
+
+class TestSuite:
+    """A test suite is a composite test consisting of a number of TestCases.
+
+    For use, create an instance of TestSuite, then add test case instances.
+    When all tests have been added, the suite can be passed to a test
+    runner, such as TextTestRunner. It will run the individual test cases
+    in the order in which they were added, aggregating the results. When
+    subclassing, do not forget to call the base class constructor.
+    """
+    def __init__(self, tests=(), suiteName=None):
+        self._tests = []
+        self._testMap = {}
+        self.suiteName = suiteName
+        self.addTests(tests)
+
+    def __repr__(self):
+        return "<%s tests=%s>" % (self.__class__, pprint.pformat(self._tests))
+
+    __str__ = __repr__
+
+    def countTestCases(self):
+        cases = 0
+        for test in self._tests:
+            cases = cases + test.countTestCases()
+        return cases
+
+    def addTest(self, test):
+        self._tests.append(test)
+        if isinstance(test, TestSuite) and test.suiteName:
+            name = test.suiteName
+        elif isinstance(test, TestCase):
+            #print test, test._testMethodName
+            name = test._testMethodName
+        else:
+            name = test.__class__.__name__
+        self._testMap[name] = test
+        
+    def addTests(self, tests):
+        for test in tests:
+            self.addTest(test)
+
+    def getTestForName(self, name):
+        return self._testMap[name]
+
+    def run(self, result):
+        return self(result)
+
+    def __call__(self, result):
+        for test in self._tests:
+            if result.shouldStop:
+                break
+            test(result)
+        return result
+
+    def debug(self):
+        """Run the tests without collecting errors in a TestResult"""
+        for test in self._tests: test.debug()
+
+
+##############################################################################
+# Text UI
+##############################################################################
+
+class StreamWrapper:
+    def __init__(self, out=sys.stdout, err=sys.stderr):
+        self._streamOut = out
+        self._streamErr = err
+
+    def write(self, txt):
+        self._streamOut.write(txt)
+        self._streamOut.flush()
+    
+    def writeln(self, *lines):
+        for line in lines:
+            self.write(line + '\n')
+        if not lines:
+            self.write('\n')
+
+    def writeErr(self, txt):
+        self._streamErr.write(txt)
+    
+    def writelnErr(self, *lines):
+        for line in lines:
+            self.writeErr(line + '\n')
+        if not lines:
+            self.writeErr('\n')
+
+
+class _TextTestResult(TestResult, StreamWrapper):
+    _separatorWidth = 70
+    _sep1 = '='
+    _sep2 = '-'
+    _errorSep1 = '*'
+    _errorSep2 = '-'
+    _errorSep3 = ''
+    
+    def __init__(self,
+                 stream=sys.stdout,
+                 errStream=sys.stderr,
+                 verbosity=1,
+                 explain=False):
+        
+        TestResult.__init__(self)
+        StreamWrapper.__init__(self, out=stream, err=errStream)        
+
+        self._verbosity = verbosity
+        self._showAll = verbosity > 1
+        self._dots = (verbosity == 1)
+        self._explain = explain
+
+    ## startup and shutdown methods
+        
+    def beginTests(self):
+        self._startTime = time.time()
+
+    def endTests(self):
+        self._stopTime = time.time()
+        self._timeTaken = float(self._stopTime - self._startTime)
+
+    def stop(self):
+        self.shouldStop = 1
+        
+    ## methods called for each test
+        
+    def startTest(self, test):
+        TestResult.startTest(self, test)
+        if self._showAll:
+            self.write("%s (%s)" %( test.id(), test.describe() ) )
+            self.write(" ... ")
+
+    def addSuccess(self, test):
+        TestResult.addSuccess(self, test)
+        if self._showAll:
+            self.writeln("ok")
+        elif self._dots:
+            self.write('.')
+
+    def addError(self, test, err):
+        TestResult.addError(self, test, err)
+        if self._showAll:
+            self.writeln("ERROR")
+        elif self._dots:
+            self.write('E')
+        if err[0] is KeyboardInterrupt:
+            self.stop()
+
+    def addFailure(self, test, err):
+        TestResult.addFailure(self, test, err)
+        if self._showAll:
+            self.writeln("FAIL")
+        elif self._dots:
+            self.write('F')
+
+    ## display methods
+
+    def summarize(self):
+        self.printErrors()
+        self.writeSep2()
+        run = self.testsRun
+        self.writeln("Ran %d test%s in %.3fs" %
+                            (run, run == 1 and "" or "s", self._timeTaken))
+        self.writeln()
+        if not self.wasSuccessful():
+            self.writeErr("FAILED (")
+            failed, errored = map(len, (self.failures, self.errors))
+            if failed:
+                self.writeErr("failures=%d" % failed)
+            if errored:
+                if failed: self.writeErr(", ")
+                self.writeErr("errors=%d" % errored)
+            self.writelnErr(")")
+        else:
+            self.writelnErr("OK")
+
+    def writeSep1(self):
+        self.writeln(self._sep1 * self._separatorWidth)
+
+    def writeSep2(self):
+        self.writeln(self._sep2 * self._separatorWidth)
+
+    def writeErrSep1(self):
+        self.writeln(self._errorSep1 * self._separatorWidth)
+
+    def writeErrSep2(self):
+        self.writeln(self._errorSep2 * self._separatorWidth)
+
+    def printErrors(self):
+        if self._dots or self._showAll:
+            self.writeln()
+        self.printErrorList('ERROR', self.errors)
+        self.printErrorList('FAIL', self.failures)
+
+    def printErrorList(self, flavour, errors):
+        for test, err in errors:
+            self.writeErrSep1()
+            self.writelnErr("%s %s (%s)" % (flavour, test.id(), test.describe() ))
+            if self._explain:
+                expln = test.explain()
+                if expln:
+                    self.writeErrSep2()
+                    self.writeErr( expln )
+                    self.writelnErr()
+
+            self.writeErrSep2()
+            for line in apply(traceback.format_exception, err):
+                for l in line.split("\n")[:-1]:
+                    self.writelnErr(l)
+            self.writelnErr("")
+
+class TextTestRunner:
+    def __init__(self, 
+                 stream=sys.stdout,
+                 errStream=sys.stderr,
+                 verbosity=1,
+                 explain=False):
+
+        self._out = stream
+        self._err = errStream
+        self._verbosity = verbosity
+        self._explain = explain
+        
+    ## main methods
+
+    def run(self, test):
+        result = self._makeResult()
+        result.beginTests()
+        test( result )
+        result.endTests()       
+        result.summarize()
+        
+        return result
+    
+    ## internal methods
+
+    def _makeResult(self):
+        return _TextTestResult(stream=self._out,
+                               errStream=self._err,
+                               verbosity=self._verbosity,
+                               explain=self._explain,
+                               )
+
+##############################################################################
+# Locating and loading tests
+##############################################################################
+
+class TestLoader:
+    """This class is responsible for loading tests according to various
+    criteria and returning them wrapped in a Test
+    """
+    testMethodPrefix = 'test'
+    sortTestMethodsUsing = cmp
+    suiteClass = TestSuite
+
+    def loadTestsFromTestCase(self, testCaseClass):
+        """Return a suite of all tests cases contained in testCaseClass"""
+        return self.suiteClass(tests=map(testCaseClass,
+                                         self.getTestCaseNames(testCaseClass)),
+                               suiteName=testCaseClass.__name__)
+
+    def loadTestsFromModule(self, module):
+        """Return a suite of all tests cases contained in the given module"""
+        tests = []
+        for name in dir(module):
+            obj = getattr(module, name)
+            if type(obj) == types.ClassType and issubclass(obj, TestCase):
+                tests.append(self.loadTestsFromTestCase(obj))
+        return self.suiteClass(tests)
+
+    def loadTestsFromName(self, name, module=None):
+        """Return a suite of all tests cases given a string specifier.
+
+        The name may resolve either to a module, a test case class, a
+        test method within a test case class, or a callable object which
+        returns a TestCase or TestSuite instance.
+
+        The method optionally resolves the names relative to a given module.
+        """
+        parts = string.split(name, '.')
+        if module is None:
+            if not parts:
+                raise ValueError, "incomplete test name: %s" % name
+            else:
+                parts_copy = parts[:]
+                while parts_copy:
+                    try:
+                        module = __import__(string.join(parts_copy,'.'))
+                        break
+                    except ImportError:
+                        del parts_copy[-1]
+                        if not parts_copy: raise
+                parts = parts[1:]
+        obj = module
+        for part in parts:
+            if isinstance(obj, TestSuite):
+                obj = obj.getTestForName(part)
+            else:
+                obj = getattr(obj, part)
+
+        if type(obj) == types.ModuleType:
+            return self.loadTestsFromModule(obj)
+        elif type(obj) == types.ClassType and issubclass(obj, TestCase):
+            return self.loadTestsFromTestCase(obj)
+        elif type(obj) == types.UnboundMethodType:
+            return obj.im_class(obj.__name__)
+        elif isinstance(obj, TestSuite):
+            return obj
+        elif isinstance(obj, TestCase):
+            return obj
+        elif callable(obj):
+            test = obj()
+            if not isinstance(test, TestCase) and \
+               not isinstance(test, TestSuite):
+                raise ValueError, \
+                      "calling %s returned %s, not a test" %(obj,test)
+            return test
+        else:
+            raise ValueError, "don't know how to make test from: %s" % obj
+
+    def loadTestsFromNames(self, names, module=None):
+        """Return a suite of all tests cases found using the given sequence
+        of string specifiers. See 'loadTestsFromName()'.
+        """
+        suites = []
+        for name in names:
+            suites.append(self.loadTestsFromName(name, module))
+        return self.suiteClass(suites)
+
+    def getTestCaseNames(self, testCaseClass):
+        """Return a sorted sequence of method names found within testCaseClass.
+        """
+        testFnNames = [fn for fn in dir(testCaseClass) if fn.startswith(self.testMethodPrefix)]
+        if hasattr(testCaseClass, 'runTest'):
+            testFnNames.append('runTest')
+        for baseclass in testCaseClass.__bases__:
+            for testFnName in self.getTestCaseNames(baseclass):
+                if testFnName not in testFnNames:  # handle overridden methods
+                    testFnNames.append(testFnName)
+        if self.sortTestMethodsUsing:
+            testFnNames.sort(self.sortTestMethodsUsing)
+        return testFnNames
+
+
+
+defaultTestLoader = TestLoader()
+
+
+##############################################################################
+# Patches for old functions: these functions should be considered obsolete
+##############################################################################
+
+def _makeLoader(prefix, sortUsing, suiteClass=None):
+    loader = TestLoader()
+    loader.sortTestMethodsUsing = sortUsing
+    loader.testMethodPrefix = prefix
+    if suiteClass: loader.suiteClass = suiteClass
+    return loader
+
+def getTestCaseNames(testCaseClass, prefix, sortUsing=cmp):
+    return _makeLoader(prefix, sortUsing).getTestCaseNames(testCaseClass)
+
+def makeSuite(testCaseClass, prefix='test', sortUsing=cmp, suiteClass=TestSuite):
+    return _makeLoader(prefix, sortUsing, suiteClass).loadTestsFromTestCase(testCaseClass)
+
+def findTestCases(module, prefix='test', sortUsing=cmp, suiteClass=TestSuite):
+    return _makeLoader(prefix, sortUsing, suiteClass).loadTestsFromModule(module)
+
+##############################################################################
+# Facilities for running tests from the command line
+##############################################################################
+
+class TestProgram:
+    """A command-line program that runs a set of tests; this is primarily
+       for making test modules conveniently executable.
+    """
+    USAGE = """\
+Usage: %(progName)s [options] [test] [...]
+
+Options:
+  -h, --help       Show this message
+  -v, --verbose    Verbose output
+  -q, --quiet      Minimal output
+  -e, --expain     Output extra test details if there is a failure or error
+  
+Examples:
+  %(progName)s                               - run default set of tests
+  %(progName)s MyTestSuite                   - run suite 'MyTestSuite'
+  %(progName)s MyTestSuite.MyTestCase        - run suite 'MyTestSuite'
+  %(progName)s MyTestCase.testSomething      - run MyTestCase.testSomething
+  %(progName)s MyTestCase                    - run all 'test*' test methods
+                                               in MyTestCase
+"""
+    def __init__(self, module='__main__', defaultTest=None,
+                 argv=None, testRunner=None, testLoader=defaultTestLoader,
+                 testSuite=None):
+        if type(module) == type(''):
+            self.module = __import__(module)
+            for part in string.split(module,'.')[1:]:
+                self.module = getattr(self.module, part)
+        else:
+            self.module = module
+        if argv is None:
+            argv = sys.argv
+        self.test = testSuite
+        self.verbosity = 1
+        self.explain = 0
+        self.defaultTest = defaultTest
+        self.testRunner = testRunner
+        self.testLoader = testLoader
+        self.progName = os.path.basename(argv[0])
+        self.parseArgs(argv)
+        self.runTests()
+
+    def usageExit(self, msg=None):
+        if msg: print msg
+        print self.USAGE % self.__dict__
+        sys.exit(2)
+
+    def parseArgs(self, argv):
+        import getopt
+        try:
+            options, args = getopt.getopt(argv[1:], 'hHvqer',
+                                  ['help','verbose','quiet','explain', 'raise'])
+            for opt, value in options:
+                if opt in ('-h','-H','--help'):
+                    self.usageExit()
+                if opt in ('-q','--quiet'):
+                    self.verbosity = 0
+                if opt in ('-v','--verbose'):
+                    self.verbosity = 2
+                if opt in ('-e','--explain'):
+                    self.explain = True
+            if len(args) == 0 and self.defaultTest is None and self.test is None:
+                self.test = self.testLoader.loadTestsFromModule(self.module)
+                return
+            if len(args) > 0:
+                self.testNames = args
+            else:
+                self.testNames = (self.defaultTest,)
+            self.createTests()
+        except getopt.error, msg:
+            self.usageExit(msg)
+
+    def createTests(self):
+        if self.test == None:
+            self.test = self.testLoader.loadTestsFromNames(self.testNames,
+                                                           self.module)
+
+    def runTests(self):
+        if self.testRunner is None:
+            self.testRunner = TextTestRunner(verbosity=self.verbosity,
+                                             explain=self.explain)
+        result = self.testRunner.run(self.test)
+        self._cleanupAfterRunningTests()
+        sys.exit(not result.wasSuccessful())
+
+    def _cleanupAfterRunningTests(self):
+        """A hook method that is called immediately prior to calling
+        sys.exit(not result.wasSuccessful()) in self.runTests().
+        """
+        pass
+
+main = TestProgram
+
+
+##############################################################################
+# Executing this module from the command line
+##############################################################################
+
+if __name__ == "__main__":
+    main(module=None)
+
+# vim: shiftwidth=4 tabstop=4 expandtab
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Tests/NameMapper.py
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Tests/NameMapper.py (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Tests/NameMapper.py (revision 3)
@@ -0,0 +1,525 @@
+#!/usr/bin/env python
+
+from __future__ import generators
+import sys
+import types
+import os
+import os.path
+
+import unittest
+from Cheetah.NameMapper import NotFound, valueForKey, \
+     valueForName, valueFromSearchList, valueFromFrame, valueFromFrameOrSearchList
+
+
+class DummyClass:
+    classVar1 = 123
+
+    def __init__(self):
+        self.instanceVar1 = 123
+        
+    def __str__(self):
+        return 'object'
+
+    def meth(self, arg="arff"):
+        return str(arg)
+
+    def meth1(self, arg="doo"):
+        return arg
+
+    def meth2(self, arg1="a1", arg2="a2"):
+        raise ValueError
+
+    def meth3(self):
+        """Tests a bug that Jeff Johnson reported on Oct 1, 2001"""
+        
+        x = 'A string'
+        try:
+            for i in [1,2,3,4]:
+                if x == 2:	
+                    pass
+                
+                if x == 'xx':
+                    pass
+            return x
+        except:
+            raise
+
+
+def dummyFunc(arg="Scooby"):
+    return arg
+
+def funcThatRaises():
+    raise ValueError
+
+                 
+testNamespace = {
+    'aStr':'blarg',
+    'anInt':1,
+    'aFloat':1.5,
+    'aDict': {'one':'item1',
+              'two':'item2',
+              'nestedDict':{'one':'nestedItem1',
+                            'two':'nestedItem2',
+                            'funcThatRaises':funcThatRaises,
+                            'aClass': DummyClass,
+                            },
+              'nestedFunc':dummyFunc,
+              },
+    'aClass': DummyClass,    
+    'aFunc': dummyFunc,
+    'anObj': DummyClass(),
+    'aMeth': DummyClass().meth1,
+    'none' : None,  
+    'emptyString':'',
+    'funcThatRaises':funcThatRaises,
+    }
+    
+autoCallResults = {'aFunc':'Scooby',
+                   'aMeth':'doo',
+                   }
+
+results = testNamespace.copy()
+results.update({'anObj.meth1':'doo',
+                'aDict.one':'item1',
+                'aDict.nestedDict':testNamespace['aDict']['nestedDict'],
+                'aDict.nestedDict.one':'nestedItem1',
+                'aDict.nestedDict.aClass':DummyClass,
+                'aDict.nestedFunc':'Scooby',
+                'aClass.classVar1':123,
+                'anObj.instanceVar1':123,
+                'anObj.meth3':'A string',
+                })
+
+for k in testNamespace.keys():
+    # put them in the globals for the valueFromFrame tests
+    exec '%s = testNamespace[k]'%k
+
+##################################################
+## TEST BASE CLASSES
+
+class NameMapperTest(unittest.TestCase):
+    failureException = (NotFound,AssertionError)
+    _testNamespace = testNamespace
+    _results = results
+    
+    def namespace(self):
+        return self._testNamespace
+
+    def VFN(self, name, autocall=True):
+        return valueForName(self.namespace(), name, autocall)
+
+    def VFS(self, searchList, name, autocall=True):
+        return valueFromSearchList(searchList, name, autocall)
+
+    
+    # alias to be overriden later
+    get = VFN
+
+    def check(self, name):
+        got = self.get(name)
+        if autoCallResults.has_key(name):
+            expected = autoCallResults[name]
+        else:
+            expected = self._results[name]
+        assert got == expected
+        
+
+##################################################
+## TEST CASE CLASSES
+
+class VFN(NameMapperTest):
+
+    def test1(self):
+        """string in dict lookup"""
+        self.check('aStr')
+
+    def test2(self):
+        """string in dict lookup in a loop"""
+        for i in range(10):
+            self.check('aStr')
+            
+    def test3(self):
+        """int in dict lookup"""
+        self.check('anInt')
+
+    def test4(self):
+        """int in dict lookup in a loop"""
+        for i in range(10):
+            self.check('anInt')
+
+    def test5(self):
+        """float in dict lookup"""
+        self.check('aFloat')
+
+    def test6(self):
+        """float in dict lookup in a loop"""
+        for i in range(10):
+            self.check('aFloat')
+          
+    def test7(self):
+        """class in dict lookup"""
+        self.check('aClass')
+
+    def test8(self):
+        """class in dict lookup in a loop"""
+        for i in range(10):
+            self.check('aClass')
+            
+    def test9(self):
+        """aFunc in dict lookup"""
+        self.check('aFunc')
+
+    def test10(self):
+        """aFunc in dict lookup in a loop"""
+        for i in range(10):
+            self.check('aFunc')
+
+    def test11(self):
+        """aMeth in dict lookup"""
+        self.check('aMeth')
+
+    def test12(self):
+        """aMeth in dict lookup in a loop"""
+        for i in range(10):
+            self.check('aMeth')
+
+    def test13(self):
+        """aMeth in dict lookup"""
+        self.check('aMeth')
+
+    def test14(self):
+        """aMeth in dict lookup in a loop"""
+        for i in range(10):
+            self.check('aMeth')
+
+    def test15(self):
+        """anObj in dict lookup"""
+        self.check('anObj')
+
+    def test16(self):
+        """anObj in dict lookup in a loop"""
+        for i in range(10):
+            self.check('anObj')
+
+    def test17(self):
+        """aDict in dict lookup"""
+        self.check('aDict')
+
+    def test18(self):
+        """aDict in dict lookup in a loop"""
+        for i in range(10):
+            self.check('aDict')
+
+    def test17(self):
+        """aDict in dict lookup"""
+        self.check('aDict')
+
+    def test18(self):
+        """aDict in dict lookup in a loop"""
+        for i in range(10):
+            self.check('aDict')
+
+    def test19(self):
+        """aClass.classVar1 in dict lookup"""
+        self.check('aClass.classVar1')
+
+    def test20(self):
+        """aClass.classVar1 in dict lookup in a loop"""
+        for i in range(10):
+            self.check('aClass.classVar1')
+
+
+    def test23(self):
+        """anObj.instanceVar1 in dict lookup"""
+        self.check('anObj.instanceVar1')
+
+    def test24(self):
+        """anObj.instanceVar1 in dict lookup in a loop"""
+        for i in range(10):
+            self.check('anObj.instanceVar1')
+
+    ## tests 22, 25, and 26 removed when the underscored lookup was removed
+
+    def test27(self):
+        """anObj.meth1 in dict lookup"""
+        self.check('anObj.meth1')
+
+    def test28(self):
+        """anObj.meth1 in dict lookup in a loop"""
+        for i in range(10):
+            self.check('anObj.meth1')
+
+    def test29(self):
+        """aDict.one in dict lookup"""
+        self.check('aDict.one')
+
+    def test30(self):
+        """aDict.one in dict lookup in a loop"""
+        for i in range(10):
+            self.check('aDict.one')
+
+    def test31(self):
+        """aDict.nestedDict in dict lookup"""
+        self.check('aDict.nestedDict')
+
+    def test32(self):
+        """aDict.nestedDict in dict lookup in a loop"""
+        for i in range(10):
+            self.check('aDict.nestedDict')
+            
+    def test33(self):
+        """aDict.nestedDict.one in dict lookup"""
+        self.check('aDict.nestedDict.one')
+
+    def test34(self):
+        """aDict.nestedDict.one in dict lookup in a loop"""
+        for i in range(10):
+            self.check('aDict.nestedDict.one')
+            
+    def test35(self):
+        """aDict.nestedFunc in dict lookup"""
+        self.check('aDict.nestedFunc')
+
+    def test36(self):
+        """aDict.nestedFunc in dict lookup in a loop"""
+        for i in range(10):
+            self.check('aDict.nestedFunc')
+
+    def test37(self):
+        """aDict.nestedFunc in dict lookup - without autocalling"""
+        assert self.get('aDict.nestedFunc', False) == dummyFunc
+
+    def test38(self):
+        """aDict.nestedFunc in dict lookup in a loop - without autocalling"""
+        for i in range(10):
+            assert self.get('aDict.nestedFunc', False) == dummyFunc
+
+    def test39(self):
+        """aMeth in dict lookup - without autocalling"""
+        assert self.get('aMeth', False) == self.namespace()['aMeth']
+
+    def test40(self):
+        """aMeth in dict lookup in a loop - without autocalling"""
+        for i in range(10):
+            assert self.get('aMeth', False) == self.namespace()['aMeth']
+
+    def test41(self):
+        """anObj.meth3 in dict lookup"""
+        self.check('anObj.meth3')
+
+    def test42(self):
+        """aMeth in dict lookup in a loop"""
+        for i in range(10):
+            self.check('anObj.meth3')
+
+    def test43(self):
+        """NotFound test"""
+
+        def test(self=self):
+            self.get('anObj.methX')    
+        self.assertRaises(NotFound,test)
+        
+    def test44(self):
+        """NotFound test in a loop"""
+        def test(self=self):
+            self.get('anObj.methX')    
+
+        for i in range(10):
+            self.assertRaises(NotFound,test)
+            
+    def test45(self):
+        """Other exception from meth test"""
+
+        def test(self=self):
+            self.get('anObj.meth2')    
+        self.assertRaises(ValueError, test)
+        
+    def test46(self):
+        """Other exception from meth test in a loop"""
+        def test(self=self):
+            self.get('anObj.meth2')    
+
+        for i in range(10):
+            self.assertRaises(ValueError,test)
+
+    def test47(self):
+        """None in dict lookup"""
+        self.check('none')
+
+    def test48(self):
+        """None in dict lookup in a loop"""
+        for i in range(10):
+            self.check('none')
+            
+    def test49(self):
+        """EmptyString in dict lookup"""
+        self.check('emptyString')
+
+    def test50(self):
+        """EmptyString in dict lookup in a loop"""
+        for i in range(10):
+            self.check('emptyString')
+
+    def test51(self):
+        """Other exception from func test"""
+
+        def test(self=self):
+            self.get('funcThatRaises')    
+        self.assertRaises(ValueError, test)
+        
+    def test52(self):
+        """Other exception from func test in a loop"""
+        def test(self=self):
+            self.get('funcThatRaises')    
+
+        for i in range(10):
+            self.assertRaises(ValueError,test)
+
+
+    def test53(self):
+        """Other exception from func test"""
+
+        def test(self=self):
+            self.get('aDict.nestedDict.funcThatRaises')    
+        self.assertRaises(ValueError, test)
+        
+    def test54(self):
+        """Other exception from func test in a loop"""
+        def test(self=self):
+            self.get('aDict.nestedDict.funcThatRaises')    
+
+        for i in range(10):
+            self.assertRaises(ValueError,test)
+
+    def test55(self):
+        """aDict.nestedDict.aClass in dict lookup"""
+        self.check('aDict.nestedDict.aClass')
+
+    def test56(self):
+        """aDict.nestedDict.aClass in dict lookup in a loop"""
+        for i in range(10):
+            self.check('aDict.nestedDict.aClass')
+
+    def test57(self):
+        """aDict.nestedDict.aClass in dict lookup - without autocalling"""
+        assert self.get('aDict.nestedDict.aClass', False) == DummyClass
+
+    def test58(self):
+        """aDict.nestedDict.aClass in dict lookup in a loop - without autocalling"""
+        for i in range(10):
+            assert self.get('aDict.nestedDict.aClass', False) == DummyClass
+
+    def test59(self):
+        """Other exception from func test -- but without autocalling shouldn't raise"""
+
+        self.get('aDict.nestedDict.funcThatRaises', False)    
+        
+    def test60(self):
+        """Other exception from func test in a loop -- but without autocalling shouldn't raise"""
+
+        for i in range(10):
+            self.get('aDict.nestedDict.funcThatRaises', False)    
+
+class VFS(VFN):
+    _searchListLength = 1
+    
+    def searchList(self):
+        lng = self._searchListLength
+        if lng == 1:
+            return [self.namespace()]
+        elif lng == 2:
+            return [self.namespace(),{'dummy':1234}]
+        elif lng == 3:
+            # a tuple for kicks
+            return ({'dummy':1234}, self.namespace(),{'dummy':1234})
+        elif lng == 4:
+            # a generator for more kicks
+            return self.searchListGenerator()
+
+    def searchListGenerator(self):
+        class Test:
+            pass
+        for i in [Test(),{'dummy':1234}, self.namespace(),{'dummy':1234}]:
+            yield i
+  
+    def get(self, name, autocall=True):
+        return self.VFS(self.searchList(), name, autocall)
+        
+class VFS_2namespaces(VFS):
+    _searchListLength = 2
+    
+class VFS_3namespaces(VFS):
+    _searchListLength = 3
+
+class VFS_4namespaces(VFS):
+    _searchListLength = 4
+    
+class VFF(VFN): 
+    def get(self, name, autocall=True):
+        ns = self._testNamespace
+        aStr = ns['aStr'] 
+        aFloat = ns['aFloat']
+        none = 'some'
+        return valueFromFrame(name, autocall)
+
+    def setUp(self):
+        """Mod some of the data
+        """
+        self._testNamespace = ns = self._testNamespace.copy()
+        self._results = res = self._results.copy()
+        ns['aStr'] = res['aStr'] = 'BLARG'
+        ns['aFloat'] = res['aFloat'] = 0.1234
+        res['none'] = 'some'
+        res['True'] = True
+        res['False'] = False
+        res['None'] = None
+        res['eval'] = eval
+
+    def test_VFF_1(self):
+        """Builtins"""
+        self.check('True')
+        self.check('None')
+        self.check('False')
+        assert self.get('eval', False)==eval
+        assert self.get('range', False)==range
+
+class VFFSL(VFS):
+    _searchListLength = 1
+
+    def setUp(self):
+        """Mod some of the data
+        """
+        self._testNamespace = ns = self._testNamespace.copy()
+        self._results = res = self._results.copy()
+        ns['aStr'] = res['aStr'] = 'BLARG'
+        ns['aFloat'] = res['aFloat'] = 0.1234
+        res['none'] = 'some'
+        
+        del ns['anInt'] # will be picked up by globals
+        
+    def VFFSL(self, searchList, name, autocall=True):
+        anInt = 1
+        none = 'some'
+        return valueFromFrameOrSearchList(searchList, name, autocall)
+    
+    def get(self, name, autocall=True):
+        return self.VFFSL(self.searchList(), name, autocall)
+
+class VFFSL_2(VFFSL):
+    _searchListLength = 2
+
+class VFFSL_3(VFFSL):
+    _searchListLength = 3
+
+class VFFSL_4(VFFSL):
+    _searchListLength = 4
+
+if sys.platform.startswith('java'):
+    del VFF, VFFSL, VFFSL_2, VFFSL_3, VFFSL_4
+
+
+##################################################
+## if run from the command line ##
+        
+if __name__ == '__main__':
+    unittest.main()
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Tests/Unicode.py
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Tests/Unicode.py (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Tests/Unicode.py (revision 3)
@@ -0,0 +1,183 @@
+#!/usr/bin/env python
+# -*- encoding: utf8 -*-
+
+from Cheetah.Template import Template
+from Cheetah import CheetahWrapper
+from Cheetah import DummyTransaction
+import imp
+import os
+import sys
+import tempfile
+import unittest
+
+class CommandLineTest(unittest.TestCase):
+    def createAndCompile(self, source):
+        sourcefile = '-'
+        while sourcefile.find('-') != -1:
+            sourcefile = tempfile.mktemp()
+        
+        fd = open('%s.tmpl' % sourcefile, 'w')
+        fd.write(source)
+        fd.close()
+
+        wrap = CheetahWrapper.CheetahWrapper()
+        wrap.main(['cheetah', 'compile', '--nobackup', sourcefile])
+        module_path, module_name = os.path.split(sourcefile)
+        module = loadModule(module_name, [module_path])
+        template = getattr(module, module_name)
+        return template
+
+class JBQ_UTF8_Test1(unittest.TestCase):
+    def runTest(self):
+        t = Template.compile(source="""Main file with |$v|
+
+        $other""")
+
+        otherT = Template.compile(source="Other template with |$v|")
+        other = otherT()
+        t.other = other
+
+        t.v = u'Unicode String'
+        t.other.v = u'Unicode String'
+
+        assert unicode(t())
+
+class JBQ_UTF8_Test2(unittest.TestCase):
+    def runTest(self):
+        t = Template.compile(source="""Main file with |$v|
+
+        $other""")
+
+        otherT = Template.compile(source="Other template with |$v|")
+        other = otherT()
+        t.other = other
+
+        t.v = u'Unicode String with eacute ﾃｩ'
+        t.other.v = u'Unicode String'
+
+        assert unicode(t())
+
+
+class JBQ_UTF8_Test3(unittest.TestCase):
+    def runTest(self):
+        t = Template.compile(source="""Main file with |$v|
+
+        $other""")
+
+        otherT = Template.compile(source="Other template with |$v|")
+        other = otherT()
+        t.other = other
+
+        t.v = u'Unicode String with eacute ﾃｩ'
+        t.other.v = u'Unicode String and an eacute ﾃｩ'
+
+        assert unicode(t())
+
+class JBQ_UTF8_Test4(unittest.TestCase):
+    def runTest(self):
+        t = Template.compile(source="""#encoding utf-8
+        Main file with |$v| and eacute in the template ﾃｩ""")
+
+        t.v = 'Unicode String'
+
+        assert unicode(t())
+
+class JBQ_UTF8_Test5(unittest.TestCase):
+    def runTest(self):
+        t = Template.compile(source="""#encoding utf-8
+        Main file with |$v| and eacute in the template ﾃｩ""")
+
+        t.v = u'Unicode String'
+
+        assert unicode(t())
+
+def loadModule(moduleName, path=None):
+    if path:
+        assert isinstance(path, list)
+    try:
+        mod = sys.modules[moduleName]
+    except KeyError:
+        fp = None
+
+        try:
+            fp, pathname, description = imp.find_module(moduleName, path)
+            mod = imp.load_module(moduleName, fp, pathname, description)
+        finally:
+            if fp:
+                fp.close()
+    return mod
+
+class JBQ_UTF8_Test6(unittest.TestCase):
+    def runTest(self):
+        source = """#encoding utf-8
+        #set $someUnicodeString = u"Bﾃｩbﾃｩ"
+        Main file with |$v| and eacute in the template ﾃｩ"""
+        t = Template.compile(source=source)
+
+        t.v = u'Unicode String'
+
+        assert unicode(t())
+
+class JBQ_UTF8_Test7(CommandLineTest):
+    def runTest(self):
+        source = """#encoding utf-8
+        #set $someUnicodeString = u"Bﾃｩbﾃｩ"
+        Main file with |$v| and eacute in the template ﾃｩ"""
+
+        template = self.createAndCompile(source)
+        template.v = u'Unicode String'
+
+        assert unicode(template())
+
+class JBQ_UTF8_Test8(CommandLineTest):
+    def testStaticCompile(self):
+        source = """#encoding utf-8
+#set $someUnicodeString = u"Bﾃｩbﾃｩ"
+$someUnicodeString"""
+
+        template = self.createAndCompile(source)()
+
+        a = unicode(template).encode("utf-8")
+        self.assertEquals("Bﾃｩbﾃｩ", a)
+
+    def testDynamicCompile(self):
+        source = """#encoding utf-8
+#set $someUnicodeString = u"Bﾃｩbﾃｩ"
+$someUnicodeString"""
+
+        template = Template(source = source)
+
+        a = unicode(template).encode("utf-8")
+        self.assertEquals("Bﾃｩbﾃｩ", a)
+
+class Unicode_in_SearchList_Test(CommandLineTest):
+    def test_BasicASCII(self):
+        source = '''This is $adjective'''
+
+        template = self.createAndCompile(source)
+        assert template and issubclass(template, Template)
+        template = template(searchList=[{'adjective' : u'neat'}])
+        assert template.respond()
+
+    def test_Thai(self):
+        # The string is something in Thai
+        source = '''This is $foo $adjective'''
+        template = self.createAndCompile(source)
+        assert template and issubclass(template, Template)
+        template = template(searchList=[{'foo' : 'bar', 
+            'adjective' : u'\u0e22\u0e34\u0e19\u0e14\u0e35\u0e15\u0e49\u0e2d\u0e19\u0e23\u0e31\u0e1a'}])
+        assert template.respond()
+
+    def test_ErrorReporting(self):
+        utf8 = '\xe0\xb8\xa2\xe0\xb8\xb4\xe0\xb8\x99\xe0\xb8\x94\xe0\xb8\xb5\xe0\xb8\x95\xe0\xb9\x89\xe0\xb8\xad\xe0\xb8\x99\xe0\xb8\xa3\xe0\xb8\xb1\xe0\xb8\x9a'
+
+        source = '''This is $adjective'''
+        template = self.createAndCompile(source)
+        assert template and issubclass(template, Template)
+        template = template(searchList=[{'adjective' : utf8}])
+        self.failUnlessRaises(DummyTransaction.DummyResponseFailure, template.respond)
+
+
+
+if __name__ == '__main__':
+    unittest.main()
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Tests/VerifyType.py
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Tests/VerifyType.py (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Tests/VerifyType.py (revision 3)
@@ -0,0 +1,158 @@
+#!/usr/bin/env python 
+import unittest
+
+from Cheetah.Utils import VerifyType
+from Cheetah import _verifytype
+
+class VerifyType_Test(unittest.TestCase):
+    def test_Verified(self):
+        arg = 'foo'
+        legalTypes = [str, unicode]
+        try:
+            rc = VerifyType.VerifyType(arg, 'arg', legalTypes, 'string') 
+            assert rc
+        except TypeError:
+            self.fail('Should not have raised a TypeError here')
+
+        try:
+            rc = _verifytype.verifyType(arg, 'arg', legalTypes, 'string')
+            assert rc
+        except TypeError:
+            self.fail('Should not have raised a TypeError here')
+
+    def test_Unverified(self):
+        arg = 'foo'
+        legalTypes = [list, dict]
+        self.failUnlessRaises(TypeError, VerifyType.VerifyType, arg,
+                    'arg', legalTypes, 'list or dict')
+        self.failUnlessRaises(TypeError, _verifytype.verifyType, arg,
+                    'arg', legalTypes, 'list or dict')
+
+    def test_IncorrectNumberOfArgs(self):
+        arg = 'foo'
+        legalTypes = [str, unicode]
+
+        self.failUnlessRaises(TypeError,  VerifyType.VerifyType)
+        self.failUnlessRaises(TypeError, _verifytype.verifyType)
+
+        self.failUnlessRaises(TypeError,  VerifyType.VerifyType, arg)
+        self.failUnlessRaises(TypeError, _verifytype.verifyType, arg)
+
+        self.failUnlessRaises(TypeError,  VerifyType.VerifyType, arg,
+                    'arg')
+        self.failUnlessRaises(TypeError, _verifytype.verifyType, arg,
+                    'arg')
+
+        self.failUnlessRaises(TypeError,  VerifyType.VerifyType, arg,
+                    'arg', legalTypes)
+        self.failUnlessRaises(TypeError, _verifytype.verifyType, arg,
+                    'arg', legalTypes)
+
+        self.failUnlessRaises(TypeError,  VerifyType.VerifyType, arg,
+                    'arg', legalTypes, 'string', 'errmsgExtra', 'one more')
+        self.failUnlessRaises(TypeError, _verifytype.verifyType, arg,
+                    'arg', legalTypes, 'string', 'errmsgExtra', 'one more')
+
+    def test_LegalTypesNotIterable(self):
+        arg = 'foo'
+        legalTypes = 1
+
+        self.failUnlessRaises(TypeError,  VerifyType.VerifyType, arg,
+                    'arg', legalTypes, 'string')
+        self.failUnlessRaises(TypeError, _verifytype.verifyType, arg,
+                    'arg', legalTypes, 'string')
+
+class FakeClass(dict):
+    pass
+
+class VerifyTypeClass_Test(unittest.TestCase):
+    def test_VerifiedClass(self):
+        arg = FakeClass
+        legalTypes = [type]
+        try:
+            rc = VerifyType.VerifyTypeClass(arg, 'arg', legalTypes, '', dict) 
+            assert rc
+        except TypeError:
+            self.fail('Should not have raised a TypeError here')
+
+        try:
+            rc = _verifytype.verifyTypeClass(arg, 'arg', legalTypes, 'foo', dict)
+            assert rc
+        except TypeError:
+            self.fail('Should not have raised a TypeError here')
+
+    def test_UnverifiedClass(self):
+        arg = FakeClass
+        legalTypes = [type]
+        self.failUnlessRaises(TypeError,  VerifyType.VerifyTypeClass, arg,
+                    legalTypes, 'subclass of list', list)
+        self.failUnlessRaises(TypeError, _verifytype.verifyTypeClass, arg,
+                    legalTypes, 'subclass of list', list)
+
+    def test_Verified(self):
+        arg = 'foo'
+        legalTypes = [str, unicode]
+        try:
+            rc = VerifyType.VerifyTypeClass(arg, 'arg', legalTypes, 'string', int) 
+            assert rc
+        except TypeError:
+            self.fail('Should not have raised a TypeError here')
+
+        try:
+            rc = _verifytype.verifyTypeClass(arg, 'arg', legalTypes, 'string', int)
+            assert rc
+        except TypeError:
+            self.fail('Should not have raised a TypeError here')
+
+    def test_Unverified(self):
+        arg = 'foo'
+        legalTypes = [list, dict]
+        self.failUnlessRaises(TypeError,  VerifyType.VerifyTypeClass, arg,
+                    'arg', legalTypes, 'list or dict', int)
+        self.failUnlessRaises(TypeError, _verifytype.verifyTypeClass, arg,
+                    'arg', legalTypes, 'list or dict', int)
+
+    def test_IncorrectNumberOfArgs(self):
+        arg = 'foo'
+        legalTypes = [str, unicode]
+
+        self.failUnlessRaises(TypeError,  VerifyType.VerifyTypeClass)
+        self.failUnlessRaises(TypeError, _verifytype.verifyTypeClass)
+
+        self.failUnlessRaises(TypeError,  VerifyType.VerifyTypeClass, arg)
+        self.failUnlessRaises(TypeError, _verifytype.verifyTypeClass, arg)
+
+        self.failUnlessRaises(TypeError,  VerifyType.VerifyTypeClass, arg,
+                    'arg')
+        self.failUnlessRaises(TypeError, _verifytype.verifyTypeClass, arg,
+                    'arg')
+
+        self.failUnlessRaises(TypeError,  VerifyType.VerifyTypeClass, arg,
+                    'arg', legalTypes)
+        self.failUnlessRaises(TypeError, _verifytype.verifyTypeClass, arg,
+                    'arg', legalTypes)
+
+        self.failUnlessRaises(TypeError,  VerifyType.VerifyTypeClass, arg,
+                    'arg', legalTypes, 'string')
+        self.failUnlessRaises(TypeError, _verifytype.verifyTypeClass, arg,
+                    'arg', legalTypes, 'string')
+
+        self.failUnlessRaises(TypeError,  VerifyType.VerifyTypeClass, arg,
+                    'arg', legalTypes, 'string', int, 'errmsgExtra', 'one more')
+        self.failUnlessRaises(TypeError, _verifytype.verifyTypeClass, arg,
+                    'arg', legalTypes, 'string', int, 'errmsgExtra', 'one more')
+
+    def test_LegalTypesNotIterable(self):
+        arg = 'foo'
+        legalTypes = 1
+
+        self.failUnlessRaises(TypeError,  VerifyType.VerifyTypeClass, arg,
+                    'arg', legalTypes, 'string', int)
+        self.failUnlessRaises(TypeError, _verifytype.verifyTypeClass, arg,
+                    'arg', legalTypes, 'string', int)
+
+
+
+
+if __name__ == '__main__':
+    unittest.main()
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/ImportHooks.py
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/ImportHooks.py (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/ImportHooks.py (revision 3)
@@ -0,0 +1,138 @@
+# $Id: ImportHooks.py,v 1.27 2007/11/16 18:28:47 tavis_rudd Exp $
+
+"""Provides some import hooks to allow Cheetah's .tmpl files to be imported
+directly like Python .py modules.
+
+To use these:
+  import Cheetah.ImportHooks
+  Cheetah.ImportHooks.install()
+
+Meta-Data
+================================================================================
+Author: Tavis Rudd <tavis@damnsimple.com>
+License: This software is released for unlimited distribution under the
+         terms of the MIT license.  See the LICENSE file.
+Version: $Revision: 1.27 $
+Start Date: 2001/03/30
+Last Revision Date: $Date: 2007/11/16 18:28:47 $
+""" 
+__author__ = "Tavis Rudd <tavis@damnsimple.com>"
+__revision__ = "$Revision: 1.27 $"[11:-2]
+
+import sys
+import os.path
+import types
+import __builtin__
+import new
+import imp
+from threading import RLock
+import string
+import traceback
+from Cheetah import ImportManager
+from Cheetah.ImportManager import DirOwner
+from Cheetah.Compiler import Compiler
+from Cheetah.convertTmplPathToModuleName import convertTmplPathToModuleName
+
+_installed = False
+
+##################################################
+## HELPER FUNCS
+
+_cacheDir = []
+def setCacheDir(cacheDir):
+    global _cacheDir
+    _cacheDir.append(cacheDir)
+    
+##################################################
+## CLASSES
+
+class CheetahDirOwner(DirOwner):
+    _lock = RLock()
+    _acquireLock = _lock.acquire
+    _releaseLock = _lock.release
+
+    templateFileExtensions = ('.tmpl',)
+
+    def getmod(self, name):
+        self._acquireLock()
+        try:        
+            mod = DirOwner.getmod(self, name)
+            if mod:
+                return mod
+
+            for ext in self.templateFileExtensions:
+                tmplPath =  os.path.join(self.path, name + ext)
+                if os.path.exists(tmplPath):
+                    try:
+                        return self._compile(name, tmplPath)
+                    except:
+                        # @@TR: log the error
+                        exc_txt = traceback.format_exc()
+                        exc_txt ='  '+('  \n'.join(exc_txt.splitlines()))
+                        raise ImportError(
+                            'Error while compiling Cheetah module'
+                        ' %(name)s, original traceback follows:\n%(exc_txt)s'%locals())
+            ##
+            return None
+
+        finally:
+            self._releaseLock()          
+
+    def _compile(self, name, tmplPath):
+        ## @@ consider adding an ImportError raiser here
+        code = str(Compiler(file=tmplPath, moduleName=name,
+                            mainClassName=name))
+        if _cacheDir:
+            __file__ = os.path.join(_cacheDir[0],
+                                    convertTmplPathToModuleName(tmplPath)) + '.py'
+            try:
+                open(__file__, 'w').write(code)
+            except OSError:
+                ## @@ TR: need to add some error code here
+                traceback.print_exc(file=sys.stderr)
+                __file__ = tmplPath
+        else:
+            __file__ = tmplPath
+        co = compile(code+'\n', __file__, 'exec')
+
+        mod = imp.new_module(name)
+        mod.__file__ = co.co_filename
+        if _cacheDir:
+            mod.__orig_file__ = tmplPath # @@TR: this is used in the WebKit
+                                         # filemonitoring code
+        mod.__co__ = co
+        return mod
+        
+
+##################################################
+## FUNCTIONS
+
+def install(templateFileExtensions=('.tmpl',)):
+    """Install the Cheetah Import Hooks"""
+
+    global _installed
+    if not _installed:
+        CheetahDirOwner.templateFileExtensions = templateFileExtensions
+        import __builtin__
+        if type(__builtin__.__import__) == types.BuiltinFunctionType:
+            global __oldimport__
+            __oldimport__ = __builtin__.__import__
+            ImportManager._globalOwnerTypes.insert(0, CheetahDirOwner)
+            #ImportManager._globalOwnerTypes.append(CheetahDirOwner)            
+            global _manager
+            _manager=ImportManager.ImportManager()
+            _manager.setThreaded()
+            _manager.install()
+        
+def uninstall():
+    """Uninstall the Cheetah Import Hooks"""    
+    global _installed
+    if not _installed:
+        import __builtin__
+        if type(__builtin__.__import__) == types.MethodType:
+            __builtin__.__import__ = __oldimport__
+            global _manager
+            del _manager
+
+if __name__ == '__main__':
+    install()
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/CacheStore.py
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/CacheStore.py (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/CacheStore.py (revision 3)
@@ -0,0 +1,108 @@
+'''
+Provides several CacheStore backends for Cheetah's caching framework.  The
+methods provided by these classes have the same semantics as those in the
+python-memcached API, except for their return values:
+
+set(key, val, time=0)
+  set the value unconditionally
+add(key, val, time=0)
+  set only if the server doesn't already have this key
+replace(key, val, time=0)
+  set only if the server already have this key
+get(key, val)
+  returns val or raises a KeyError
+delete(key)
+  deletes or raises a KeyError
+'''
+import time
+
+from Cheetah.Utils.memcache import Client as MemcachedClient
+
+class Error(Exception):
+    pass
+
+class AbstractCacheStore(object):
+
+    def set(self, key, val, time=None):
+        raise NotImplementedError
+
+    def add(self, key, val, time=None):
+        raise NotImplementedError
+
+    def replace(self, key, val, time=None):
+        raise NotImplementedError
+
+    def delete(self, key):
+        raise NotImplementedError
+
+    def get(self, key):
+        raise NotImplementedError
+
+class MemoryCacheStore(AbstractCacheStore):
+    def __init__(self):
+        self._data = {}
+
+    def set(self, key, val, time=0):
+        self._data[key] = (val, time)
+
+    def add(self, key, val, time=0):
+        if self._data.has_key(key):
+            raise Error('a value for key %r is already in the cache'%key)
+        self._data[key] = (val, time)
+
+    def replace(self, key, val, time=0):
+        if self._data.has_key(key):
+            raise Error('a value for key %r is already in the cache'%key)
+        self._data[key] = (val, time)
+
+    def delete(self, key):
+        del self._data[key]
+        
+    def get(self, key):
+        (val, exptime) = self._data[key]
+        if exptime and time.time() > exptime:
+            del self._data[key]
+            raise KeyError(key)
+        else:
+            return val
+
+    def clear(self):
+        self._data.clear()        
+                  
+class MemcachedCacheStore(AbstractCacheStore):
+    servers = ('127.0.0.1:11211')
+    def __init__(self, servers=None, debug=False):
+        if servers is None:
+            servers = self.servers
+            
+        self._client = MemcachedClient(servers, debug)
+
+    def set(self, key, val, time=0):
+        self._client.set(key, val, time)
+
+    def add(self, key, val, time=0):
+        res = self._client.add(key, val, time)        
+        if not res:
+            raise Error('a value for key %r is already in the cache'%key)
+        self._data[key] = (val, time)
+
+    def replace(self, key, val, time=0):
+        res = self._client.replace(key, val, time)        
+        if not res:
+            raise Error('a value for key %r is already in the cache'%key)
+        self._data[key] = (val, time)
+
+    def delete(self, key):
+        res = self._client.delete(key, time=0)        
+        if not res:
+            raise KeyError(key)
+        
+    def get(self, key):
+        val = self._client.get(key)
+        if val is None:
+            raise KeyError(key)
+        else:
+            return val
+
+    def clear(self):
+        self._client.flush_all()        
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/SourceReader.py
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/SourceReader.py (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/SourceReader.py (revision 3)
@@ -0,0 +1,303 @@
+# $Id: SourceReader.py,v 1.15 2007/04/03 01:57:42 tavis_rudd Exp $
+"""SourceReader class for Cheetah's Parser and CodeGenerator
+
+Meta-Data
+================================================================================
+Author: Tavis Rudd <tavis@damnsimple.com>
+License: This software is released for unlimited distribution under the
+         terms of the MIT license.  See the LICENSE file.
+Version: $Revision: 1.15 $
+Start Date: 2001/09/19
+Last Revision Date: $Date: 2007/04/03 01:57:42 $
+"""
+__author__ = "Tavis Rudd <tavis@damnsimple.com>"
+__revision__ = "$Revision: 1.15 $"[11:-2]
+
+import re
+import sys
+
+EOLre = re.compile(r'[ \f\t]*(?:\r\n|\r|\n)')
+EOLZre = re.compile(r'(?:\r\n|\r|\n|\Z)')
+ENCODINGsearch = re.compile("coding[=:]\s*([-\w.]+)").search
+
+class Error(Exception):
+    pass
+                                
+class SourceReader:
+    def __init__(self, src, filename=None, breakPoint=None, encoding=None):
+
+        ## @@TR 2005-01-17: the following comes from a patch Terrel Shumway
+        ## contributed to add unicode support to the reading of Cheetah source
+        ## files with dynamically compiled templates. All the existing unit
+        ## tests pass but, it needs more testing and some test cases of its
+        ## own. My instinct is to move this up into the code that passes in the
+        ## src string rather than leaving it here.  As implemented here it
+        ## forces all src strings to unicode, which IMO is not what we want.
+        #  if encoding is None:
+        #      # peek at the encoding in the first two lines
+        #      m = EOLZre.search(src)
+        #      pos = m.end()
+        #      if pos<len(src):
+        #          m = EOLZre.search(src,pos)
+        #          pos = m.end()
+        #      m = ENCODINGsearch(src,0,pos)
+        #      if m:
+        #          encoding = m.group(1)
+        #      else:
+        #          encoding  = sys.getfilesystemencoding()
+        #  self._encoding = encoding
+        #  if type(src) is not unicode:
+        #      src = src.decode(encoding)
+        ## end of Terrel's patch
+
+        self._src = src
+        self._filename = filename
+
+        self._srcLen = len(src)
+        if breakPoint == None:
+            self._breakPoint = self._srcLen
+        else:
+            self.setBreakPoint(breakPoint)
+        self._pos = 0
+        self._bookmarks = {}
+        self._posTobookmarkMap = {}
+
+        ## collect some meta-information
+        self._EOLs = []
+        pos = 0
+        while pos < len(self):
+            EOLmatch = EOLZre.search(src, pos)
+            self._EOLs.append(EOLmatch.start())
+            pos = EOLmatch.end()
+            
+        self._BOLs = []
+        for pos in self._EOLs:
+            BOLpos = self.findBOL(pos)
+            self._BOLs.append(BOLpos)
+        
+    def src(self):
+        return self._src
+
+    def filename(self):
+        return self._filename
+
+    def __len__(self):
+        return self._breakPoint
+    
+    def __getitem__(self, i):
+        self.checkPos(i)
+        return self._src[i]
+    
+    def __getslice__(self, i, j):
+        i = max(i, 0); j = max(j, 0)
+        return self._src[i:j]
+
+    def splitlines(self):
+        if not hasattr(self, '_srcLines'):                
+            self._srcLines = self._src.splitlines()
+        return self._srcLines
+
+    def lineNum(self, pos=None):
+        if pos == None:
+            pos = self._pos
+            
+        for i in range(len(self._BOLs)):
+            if pos >= self._BOLs[i] and pos <= self._EOLs[i]:
+                return i
+            
+    def getRowCol(self, pos=None):
+        if pos == None:
+            pos = self._pos
+        lineNum = self.lineNum(pos)
+        BOL, EOL = self._BOLs[lineNum], self._EOLs[lineNum]
+        return lineNum+1, pos-BOL+1
+            
+    def getRowColLine(self, pos=None):
+        if pos == None:
+            pos = self._pos
+        row, col = self.getRowCol(pos)    
+        return row, col, self.splitlines()[row-1]
+
+    def getLine(self, pos):
+        if pos == None:
+            pos = self._pos
+        lineNum = self.lineNum(pos)
+        return self.splitlines()[lineNum]
+        
+    def pos(self):
+        return self._pos
+    
+    def setPos(self, pos):
+        self.checkPos(pos)
+        self._pos = pos
+
+
+    def validPos(self, pos):
+        return pos <= self._breakPoint and pos >=0 
+                    
+    def checkPos(self, pos):
+        if not pos <= self._breakPoint:
+            raise Error("pos (" + str(pos) + ") is invalid: beyond the stream's end (" +
+                        str(self._breakPoint-1) + ")" )
+        elif not pos >=0:
+            raise Error("pos (" + str(pos) + ") is invalid: less than 0" )
+
+    def breakPoint(self):
+        return self._breakPoint
+    
+    def setBreakPoint(self, pos):
+        if pos > self._srcLen:
+            raise Error("New breakpoint (" + str(pos) +
+                        ") is invalid: beyond the end of stream's source string (" +
+                        str(self._srcLen) + ")" )
+        elif not pos >= 0:
+            raise Error("New breakpoint (" + str(pos) + ") is invalid: less than 0" )        
+        
+        self._breakPoint = pos
+
+    def setBookmark(self, name):
+        self._bookmarks[name] = self._pos
+        self._posTobookmarkMap[self._pos] = name
+
+    def hasBookmark(self, name):
+        return self._bookmarks.has_key(name)
+    
+    def gotoBookmark(self, name):
+        if not self.hasBookmark(name):
+            raise Error("Invalid bookmark (" + name + ") is invalid: does not exist")
+        pos = self._bookmarks[name]
+        if not self.validPos(pos):
+            raise Error("Invalid bookmark (" + name + ', '+
+                        str(pos) + ") is invalid: pos is out of range" )        
+        self._pos = pos
+
+    def atEnd(self):
+        return self._pos >= self._breakPoint
+
+    def atStart(self):
+        return self._pos == 0
+                          
+    def peek(self, offset=0):
+        self.checkPos(self._pos+offset)
+        pos = self._pos + offset
+        return self._src[pos]
+
+    def getc(self):
+        pos = self._pos
+        if self.validPos(pos+1):
+            self._pos += 1
+        return self._src[pos]
+
+    def ungetc(self, c=None):
+        if not self.atStart():
+            raise Error('Already at beginning of stream')
+
+        self._pos -= 1
+        if not c==None:
+            self._src[self._pos] = c
+
+    def advance(self, offset=1):
+        self.checkPos(self._pos + offset)
+        self._pos += offset
+
+    def rev(self, offset=1):
+        self.checkPos(self._pos - offset)
+        self._pos -= offset
+               
+    def read(self, offset):
+        self.checkPos(self._pos + offset)
+        start = self._pos
+        self._pos += offset
+        return self._src[start:self._pos]
+
+    def readTo(self, to, start=None):
+        self.checkPos(to)
+        if start == None:
+            start = self._pos
+        self._pos = to
+        return self._src[start:to]
+
+        
+    def readToEOL(self, start=None, gobble=True):
+        EOLmatch = EOLZre.search(self.src(), self.pos())
+        if gobble:
+            pos = EOLmatch.end()
+        else:
+            pos = EOLmatch.start()
+        return self.readTo(to=pos, start=start)
+    
+
+    def find(self, it, pos=None):
+        if pos == None:
+            pos = self._pos
+        return self._src.find(it, pos )
+
+    def startswith(self, it, pos=None):
+        if self.find(it, pos) == self.pos():
+            return True
+        else:
+            return False
+                    
+    def rfind(self, it, pos):
+        if pos == None:
+            pos = self._pos
+        return self._src.rfind(it, pos)
+        
+    def findBOL(self, pos=None):
+        if pos == None:
+            pos = self._pos
+        src = self.src()
+        return max(src.rfind('\n',0,pos)+1, src.rfind('\r',0,pos)+1, 0)
+        
+    def findEOL(self, pos=None, gobble=False):
+        if pos == None:
+            pos = self._pos
+
+        match = EOLZre.search(self.src(), pos)
+        if gobble:
+            return match.end()
+        else:
+            return match.start()
+    
+    def isLineClearToPos(self, pos=None):
+        if pos == None:
+            pos = self.pos()
+        self.checkPos(pos)            
+        src = self.src()
+        BOL = self.findBOL()
+        return BOL == pos or src[BOL:pos].isspace()
+
+    def matches(self, strOrRE):
+        if isinstance(strOrRE, (str, unicode)):
+            return self.startswith(strOrRE, pos=self.pos())
+        else: # assume an re object
+            return strOrRE.match(self.src(), self.pos())
+
+    def matchWhiteSpace(self, WSchars=' \f\t'):
+        return (not self.atEnd()) and  self.peek() in WSchars
+
+    def getWhiteSpace(self, max=None, WSchars=' \f\t'):
+        if not self.matchWhiteSpace(WSchars):
+            return ''
+        start = self.pos()
+        breakPoint = self.breakPoint()
+        if max is not None:
+            breakPoint = min(breakPoint, self.pos()+max)
+        while self.pos() < breakPoint:
+            self.advance()
+            if not self.matchWhiteSpace(WSchars):
+                break
+        return self.src()[start:self.pos()]
+
+    def matchNonWhiteSpace(self, WSchars=' \f\t\n\r'):
+        return self.atEnd() or not self.peek() in WSchars
+
+    def getNonWhiteSpace(self, WSchars=' \f\t\n\r'):
+        if not self.matchNonWhiteSpace(WSchars):
+            return ''
+        start = self.pos()
+        while self.pos() < self.breakPoint():
+            self.advance()
+            if not self.matchNonWhiteSpace(WSchars):
+                break
+        return self.src()[start:self.pos()]
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Servlet.py
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Servlet.py (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Servlet.py (revision 3)
@@ -0,0 +1,112 @@
+'''
+Provides an abstract Servlet baseclass for Cheetah's Template class
+'''
+
+import sys
+import os.path
+
+isWebwareInstalled = False
+try:
+    try:
+        from ds.appserver.Servlet import Servlet as BaseServlet
+    except:
+        from WebKit.Servlet import Servlet as BaseServlet
+    isWebwareInstalled = True
+
+    if not issubclass(BaseServlet, object):
+        class NewStyleBaseServlet(BaseServlet, object):
+            pass
+        BaseServlet = NewStyleBaseServlet
+except:
+    class BaseServlet(object): 
+        _reusable = 1
+        _threadSafe = 0
+    
+        def awake(self, transaction):
+            pass
+            
+        def sleep(self, transaction):
+            pass
+
+        def shutdown(self):
+            pass
+
+##################################################
+## CLASSES
+
+class Servlet(BaseServlet):
+    
+    """This class is an abstract baseclass for Cheetah.Template.Template.
+
+    It wraps WebKit.Servlet and provides a few extra convenience methods that
+    are also found in WebKit.Page.  It doesn't do any of the HTTP method
+    resolution that is done in WebKit.HTTPServlet
+    """
+    
+    transaction = None
+    application = None
+    request = None
+    session = None
+    
+    def __init__(self, *args, **kwargs):
+        super(Servlet, self).__init__(*args, **kwargs)
+       
+        # this default will be changed by the .awake() method
+        self._CHEETAH__isControlledByWebKit = False 
+        
+    ## methods called by Webware during the request-response
+        
+    def awake(self, transaction):
+        super(Servlet, self).awake(transaction)
+        
+        # a hack to signify that the servlet is being run directly from WebKit
+        self._CHEETAH__isControlledByWebKit = True
+        
+        self.transaction = transaction        
+        #self.application = transaction.application
+        self.response = response = transaction.response
+        self.request = transaction.request
+
+        # Temporary hack to accomodate bug in
+        # WebKit.Servlet.Servlet.serverSidePath: it uses 
+        # self._request even though this attribute does not exist.
+        # This attribute WILL disappear in the future.
+        self._request = transaction.request()
+
+        
+        self.session = transaction.session
+        self.write = response().write
+        #self.writeln = response.writeln
+        
+    def respond(self, trans=None):
+        raise NotImplementedError("""\
+couldn't find the template's main method.  If you are using #extends
+without #implements, try adding '#implements respond' to your template
+definition.""")
+
+    def sleep(self, transaction):
+        super(Servlet, self).sleep(transaction)
+        self.session = None
+        self.request  = None
+        self._request  = None        
+        self.response = None
+        self.transaction = None
+
+    def shutdown(self):
+        pass
+
+    def serverSidePath(self, path=None,
+                       normpath=os.path.normpath,
+                       abspath=os.path.abspath
+                       ):
+        
+        if self._CHEETAH__isControlledByWebKit:
+            return super(Servlet, self).serverSidePath(path)
+        elif path:
+            return normpath(abspath(path.replace("\\",'/')))
+        elif hasattr(self, '_filePath') and self._filePath:
+            return normpath(abspath(self._filePath))
+        else:
+            return None
+
+# vim: shiftwidth=4 tabstop=4 expandtab
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/_namemapper.py
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/_namemapper.py (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/_namemapper.py (revision 3)
@@ -0,0 +1,7 @@
+def __bootstrap__():
+   global __bootstrap__, __loader__, __file__
+   import sys, pkg_resources, imp
+   __file__ = pkg_resources.resource_filename(__name__,'_namemapper.so')
+   __loader__ = None; del __bootstrap__, __loader__
+   imp.load_dynamic(__name__,__file__)
+__bootstrap__()
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/NameMapper.py
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/NameMapper.py (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/NameMapper.py (revision 3)
@@ -0,0 +1,379 @@
+# $Id: NameMapper.py,v 1.32 2007/12/10 19:20:09 tavis_rudd Exp $
+
+"""This module supports Cheetah's optional NameMapper syntax.
+
+Overview
+================================================================================
+
+NameMapper provides a simple syntax for accessing Python data structures,
+functions, and methods from Cheetah. It's called NameMapper because it 'maps'
+simple 'names' in Cheetah templates to possibly more complex syntax in Python.
+
+Its purpose is to make working with Cheetah easy for non-programmers.
+Specifically, non-programmers using Cheetah should NOT need to be taught (a)
+what the difference is between an object and a dictionary, (b) what functions
+and methods are, and (c) what 'self' is.  A further aim (d) is to buffer the
+code in Cheetah templates from changes in the implementation of the Python data
+structures behind them.
+
+Consider this scenario:
+
+You are building a customer information system. The designers with you want to
+use information from your system on the client's website --AND-- they want to
+understand the display code and so they can maintian it themselves.
+
+You write a UI class with a 'customers' method that returns a dictionary of all
+the customer objects.  Each customer object has an 'address' method that returns
+the a dictionary with information about the customer's address.  The designers
+want to be able to access that information.
+
+Using PSP, the display code for the website would look something like the
+following, assuming your servlet subclasses the class you created for managing
+customer information:
+
+  <%= self.customer()[ID].address()['city'] %>   (42 chars)
+
+Using Cheetah's NameMapper syntax it could be any of the following:
+
+   $self.customers()[$ID].address()['city']       (39 chars)
+   --OR--                                         
+   $customers()[$ID].address()['city']           
+   --OR--                                         
+   $customers()[$ID].address().city              
+   --OR--                                         
+   $customers()[$ID].address.city                
+   --OR--                                         
+   $customers()[$ID].address.city
+   --OR--
+   $customers[$ID].address.city                   (27 chars)                   
+   
+   
+Which of these would you prefer to explain to the designers, who have no
+programming experience?  The last form is 15 characters shorter than the PSP
+and, conceptually, is far more accessible. With PHP or ASP, the code would be
+even messier than the PSP
+
+This is a rather extreme example and, of course, you could also just implement
+'$getCustomer($ID).city' and obey the Law of Demeter (search Google for more on that).
+But good object orientated design isn't the point here.
+
+Details
+================================================================================
+The parenthesized letters below correspond to the aims in the second paragraph.
+
+DICTIONARY ACCESS (a)
+---------------------
+
+NameMapper allows access to items in a dictionary using the same dotted notation
+used to access object attributes in Python.  This aspect of NameMapper is known
+as 'Unified Dotted Notation'.
+
+For example, with Cheetah it is possible to write:
+   $customers()['kerr'].address()  --OR--  $customers().kerr.address()
+where the second form is in NameMapper syntax.
+
+This only works with dictionary keys that are also valid python identifiers:
+  regex = '[a-zA-Z_][a-zA-Z_0-9]*'
+
+
+AUTOCALLING (b,d)
+-----------------
+
+NameMapper automatically detects functions and methods in Cheetah $vars and calls
+them if the parentheses have been left off.  
+
+For example if 'a' is an object, 'b' is a method
+  $a.b
+is equivalent to
+  $a.b()
+
+If b returns a dictionary, then following variations are possible
+  $a.b.c  --OR--  $a.b().c  --OR--  $a.b()['c']
+where 'c' is a key in the dictionary that a.b() returns.
+
+Further notes:
+* NameMapper autocalls the function or method without any arguments.  Thus
+autocalling can only be used with functions or methods that either have no
+arguments or have default values for all arguments.
+
+* NameMapper only autocalls functions and methods.  Classes and callable object instances
+will not be autocalled.  
+
+* Autocalling can be disabled using Cheetah's 'useAutocalling' setting.
+
+LEAVING OUT 'self' (c,d)
+------------------------
+
+NameMapper makes it possible to access the attributes of a servlet in Cheetah
+without needing to include 'self' in the variable names.  See the NAMESPACE
+CASCADING section below for details.
+
+NAMESPACE CASCADING (d)
+--------------------
+...
+
+Implementation details
+================================================================================
+
+* NameMapper's search order is dictionary keys then object attributes
+
+* NameMapper.NotFound is raised if a value can't be found for a name.
+
+Performance and the C version
+================================================================================
+
+Cheetah comes with both a C version and a Python version of NameMapper.  The C
+version is significantly faster and the exception tracebacks are much easier to
+read.  It's still slower than standard Python syntax, but you won't notice the
+difference in realistic usage scenarios.
+
+Cheetah uses the optimized C version (_namemapper.c) if it has
+been compiled or falls back to the Python version if not.
+
+Meta-Data
+================================================================================
+Authors: Tavis Rudd <tavis@damnsimple.com>,
+         Chuck Esterbrook <echuck@mindspring.com>
+Version: $Revision: 1.32 $
+Start Date: 2001/04/03
+Last Revision Date: $Date: 2007/12/10 19:20:09 $
+"""
+from __future__ import generators
+__author__ = "Tavis Rudd <tavis@damnsimple.com>," +\
+             "\nChuck Esterbrook <echuck@mindspring.com>"
+__revision__ = "$Revision: 1.32 $"[11:-2]
+import types
+from types import StringType, InstanceType, ClassType, TypeType
+from pprint import pformat
+import inspect
+import pdb
+
+_INCLUDE_NAMESPACE_REPR_IN_NOTFOUND_EXCEPTIONS = False
+_ALLOW_WRAPPING_OF_NOTFOUND_EXCEPTIONS = True
+__all__ = ['NotFound',
+           'hasKey',
+           'valueForKey',
+           'valueForName',
+           'valueFromSearchList',
+           'valueFromFrameOrSearchList',
+           'valueFromFrame',
+           ]
+
+if not hasattr(inspect.imp, 'get_suffixes'):
+    # This is to fix broken behavior of the inspect module under the 
+    # Google App Engine, see the following issue:
+    # http://bugs.communitycheetah.org/view.php?id=10
+    setattr(inspect.imp, 'get_suffixes', lambda: [('.py', 'U', 1)])
+
+## N.B. An attempt is made at the end of this module to import C versions of
+## these functions.  If _namemapper.c has been compiled succesfully and the
+## import goes smoothly, the Python versions defined here will be replaced with
+## the C versions.
+
+class NotFound(LookupError):
+    pass
+
+def _raiseNotFoundException(key, namespace):
+    excString = "cannot find '%s'"%key
+    if _INCLUDE_NAMESPACE_REPR_IN_NOTFOUND_EXCEPTIONS:
+        excString += ' in the namespace %s'%pformat(namespace)
+    raise NotFound(excString)
+
+def _wrapNotFoundException(exc, fullName, namespace):
+    if not _ALLOW_WRAPPING_OF_NOTFOUND_EXCEPTIONS:
+        raise 
+    else:
+        excStr = exc.args[0]
+        if excStr.find('while searching')==-1: # only wrap once!
+            excStr +=" while searching for '%s'"%fullName
+            if _INCLUDE_NAMESPACE_REPR_IN_NOTFOUND_EXCEPTIONS:
+                excStr += ' in the namespace %s'%pformat(namespace)
+            exc.args = (excStr,)
+        raise
+
+def _isInstanceOrClass(obj):
+    if type(obj) in (InstanceType, ClassType):
+        # oldstyle
+        return True
+
+    if hasattr(obj, "__class__"):
+        # newstyle
+        if hasattr(obj, 'mro'):
+            # type/class
+            return True
+        elif (hasattr(obj, 'im_func') or hasattr(obj, 'func_code') or hasattr(obj, '__self__')):
+            # method, func, or builtin func
+            return False
+        elif hasattr(obj, '__init__'):
+            # instance
+            return True
+    return False
+    
+def hasKey(obj, key):
+    """Determine if 'obj' has 'key' """
+    if hasattr(obj,'has_key') and obj.has_key(key):
+        return True
+    elif hasattr(obj, key):
+        return True
+    else:
+        return False
+
+def valueForKey(obj, key):
+    if hasattr(obj, 'has_key') and obj.has_key(key):
+        return obj[key]
+    elif hasattr(obj, key):
+        return getattr(obj, key)
+    else:
+        _raiseNotFoundException(key, obj)
+
+def _valueForName(obj, name, executeCallables=False):
+    nameChunks=name.split('.')
+    for i in range(len(nameChunks)):
+        key = nameChunks[i]
+        if hasattr(obj, 'has_key') and obj.has_key(key):
+            nextObj = obj[key]
+        else:
+            try:
+                nextObj = getattr(obj, key)
+            except AttributeError:
+                _raiseNotFoundException(key, obj)
+        
+        if executeCallables and callable(nextObj) and not _isInstanceOrClass(nextObj):
+            obj = nextObj()
+        else:
+            obj = nextObj
+    return obj
+
+def valueForName(obj, name, executeCallables=False):
+    try:
+        return _valueForName(obj, name, executeCallables)
+    except NotFound, e:
+        _wrapNotFoundException(e, fullName=name, namespace=obj)
+
+def valueFromSearchList(searchList, name, executeCallables=False):
+    key = name.split('.')[0]
+    for namespace in searchList:
+        if hasKey(namespace, key):
+            return _valueForName(namespace, name,
+                                executeCallables=executeCallables)
+    _raiseNotFoundException(key, searchList)
+
+def _namespaces(callerFrame, searchList=None):
+    yield callerFrame.f_locals
+    if searchList:
+        for namespace in searchList:
+            yield namespace
+    yield callerFrame.f_globals
+    yield __builtins__
+
+def valueFromFrameOrSearchList(searchList, name, executeCallables=False,
+                               frame=None):
+    def __valueForName():
+        try:
+            return _valueForName(namespace, name, executeCallables=executeCallables)
+        except NotFound, e:
+            _wrapNotFoundException(e, fullName=name, namespace=searchList)
+    try:
+        if not frame:
+            frame = inspect.stack()[1][0]
+        key = name.split('.')[0]
+        for namespace in _namespaces(frame, searchList):
+            if hasKey(namespace, key):
+                return __valueForName()
+        _raiseNotFoundException(key, searchList)
+    finally:
+        del frame
+
+def valueFromFrame(name, executeCallables=False, frame=None):
+    # @@TR consider implementing the C version the same way
+    # at the moment it provides a seperate but mirror implementation
+    # to valueFromFrameOrSearchList
+    try: 
+        if not frame:
+            frame = inspect.stack()[1][0]
+        return valueFromFrameOrSearchList(searchList=None,
+                                          name=name,
+                                          executeCallables=executeCallables,
+                                          frame=frame)
+    finally:
+        del frame
+
+def hasName(obj, name):
+    #Not in the C version
+    """Determine if 'obj' has the 'name' """
+    key = name.split('.')[0]
+    if not hasKey(obj, key):
+        return False
+    try:
+        valueForName(obj, name)
+        return True
+    except NotFound:
+        return False
+try:
+    from _namemapper import NotFound, valueForKey, valueForName, \
+         valueFromSearchList, valueFromFrameOrSearchList, valueFromFrame
+    # it is possible with Jython or Windows, for example, that _namemapper.c hasn't been compiled
+    C_VERSION = True
+except:
+    C_VERSION = False
+
+##################################################
+## CLASSES
+
+class Mixin:
+    """@@ document me"""
+    def valueForName(self, name):
+        return valueForName(self, name)
+
+    def valueForKey(self, key):
+        return valueForKey(self, key)
+
+##################################################
+## if run from the command line ##
+
+def example():
+    class A(Mixin):
+        classVar = 'classVar val'
+        def method(self,arg='method 1 default arg'):
+            return arg
+
+        def method2(self, arg='meth 2 default arg'):
+            return {'item1':arg}
+
+        def method3(self, arg='meth 3 default'):
+            return arg
+
+    class B(A):
+        classBvar = 'classBvar val'
+
+    a = A()
+    a.one = 'valueForOne'
+    def function(whichOne='default'):
+        values = {
+            'default': 'default output',
+            'one': 'output option one',
+            'two': 'output option two'
+            }
+        return values[whichOne]
+
+    a.dic = {
+        'func': function,
+        'method': a.method3,
+        'item': 'itemval',
+        'subDict': {'nestedMethod':a.method3}
+        }
+    b = 'this is local b'
+
+    print valueForKey(a.dic,'subDict')
+    print valueForName(a, 'dic.item')
+    print valueForName(vars(), 'b')
+    print valueForName(__builtins__, 'dir')()
+    print valueForName(vars(), 'a.classVar')
+    print valueForName(vars(), 'a.dic.func', executeCallables=True)
+    print valueForName(vars(), 'a.method2.item1', executeCallables=True)
+
+if __name__ == '__main__':
+    example()
+
+
+
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Version.py
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Version.py (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/Cheetah/Version.py (revision 3)
@@ -0,0 +1,58 @@
+Version = '2.2.2'
+VersionTuple = (2, 2, 2,'final', 0)
+
+MinCompatibleVersion = '2.0rc6'
+MinCompatibleVersionTuple = (2,0,0,'candidate',6)
+
+####
+def convertVersionStringToTuple(s):
+    versionNum = [0,0,0]
+    releaseType = 'final'
+    releaseTypeSubNum = 0
+    if s.find('a')!=-1:
+        num, releaseTypeSubNum = s.split('a')
+        releaseType = 'alpha'
+    elif s.find('b')!=-1:
+        num, releaseTypeSubNum = s.split('b')
+        releaseType = 'beta'
+    elif s.find('rc')!=-1:
+        num, releaseTypeSubNum = s.split('rc')
+        releaseType = 'candidate'
+    else:
+        num = s
+    num = num.split('.')
+    for i in range(len(num)):
+        versionNum[i] = int(num[i])        
+    if len(versionNum)<3:
+        versionNum += [0]
+    releaseTypeSubNum = int(releaseTypeSubNum)
+    
+    return tuple(versionNum+[releaseType,releaseTypeSubNum])
+
+
+if __name__ == '__main__':
+    c = convertVersionStringToTuple
+    print c('2.0a1')
+    print c('2.0b1')
+    print c('2.0rc1')
+    print c('2.0')
+    print c('2.0.2')
+
+
+    assert c('0.9.19b1') < c('0.9.19')
+    assert c('0.9b1') < c('0.9.19')
+    
+    assert c('2.0a2') > c('2.0a1')
+    assert c('2.0b1') > c('2.0a2')
+    assert c('2.0b2') > c('2.0b1')
+    assert c('2.0b2') == c('2.0b2')
+
+    assert c('2.0rc1') > c('2.0b1')
+    assert c('2.0rc2') > c('2.0rc1')
+    assert c('2.0rc2') > c('2.0b1')
+
+    assert c('2.0') > c('2.0a1')
+    assert c('2.0') > c('2.0b1')
+    assert c('2.0') > c('2.0rc1')
+    assert c('2.0.1') > c('2.0')
+    assert c('2.0rc1') > c('2.0b1')
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/SOURCES.txt
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/SOURCES.txt (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/SOURCES.txt (revision 3)
@@ -0,0 +1,79 @@
+CHANGES
+LICENSE
+MANIFEST.in
+README
+SetupConfig.py
+SetupTools.py
+TODO
+ez_setup.py
+scramble.py
+setup.cfg
+setup.py
+Cheetah.egg-info/PKG-INFO
+Cheetah.egg-info/SOURCES.txt
+Cheetah.egg-info/dependency_links.txt
+Cheetah.egg-info/top_level.txt
+bin/cheetah
+bin/cheetah-compile
+cheetah/CacheRegion.py
+cheetah/CacheStore.py
+cheetah/CheetahWrapper.py
+cheetah/Compiler.py
+cheetah/Django.py
+cheetah/DummyTransaction.py
+cheetah/ErrorCatchers.py
+cheetah/FileUtils.py
+cheetah/Filters.py
+cheetah/ImportHooks.py
+cheetah/ImportManager.py
+cheetah/NameMapper.py
+cheetah/Parser.py
+cheetah/Servlet.py
+cheetah/SettingsManager.py
+cheetah/SourceReader.py
+cheetah/Template.py
+cheetah/TemplateCmdLineIface.py
+cheetah/Unspecified.py
+cheetah/Version.py
+cheetah/__init__.py
+cheetah/convertTmplPathToModuleName.py
+cheetah/Macros/I18n.py
+cheetah/Macros/__init__.py
+cheetah/Templates/SkeletonPage.py
+cheetah/Templates/SkeletonPage.tmpl
+cheetah/Templates/_SkeletonPage.py
+cheetah/Templates/__init__.py
+cheetah/Tests/CheetahWrapper.py
+cheetah/Tests/Cheps.py
+cheetah/Tests/Filters.py
+cheetah/Tests/NameMapper.py
+cheetah/Tests/Performance.py
+cheetah/Tests/Regressions.py
+cheetah/Tests/SyntaxAndOutput.py
+cheetah/Tests/Template.py
+cheetah/Tests/Test.py
+cheetah/Tests/Unicode.py
+cheetah/Tests/VerifyType.py
+cheetah/Tests/__init__.py
+cheetah/Tests/unittest_local_copy.py
+cheetah/Tests/xmlrunner.py
+cheetah/Tools/CGITemplate.py
+cheetah/Tools/MondoReport.py
+cheetah/Tools/MondoReportDoc.txt
+cheetah/Tools/RecursiveNull.py
+cheetah/Tools/SiteHierarchy.py
+cheetah/Tools/__init__.py
+cheetah/Tools/turbocheetah/__init__.py
+cheetah/Tools/turbocheetah/cheetahsupport.py
+cheetah/Tools/turbocheetah/tests/__init__.py
+cheetah/Tools/turbocheetah/tests/test_template.py
+cheetah/Utils/Indenter.py
+cheetah/Utils/Misc.py
+cheetah/Utils/VerifyType.py
+cheetah/Utils/WebInputMixin.py
+cheetah/Utils/__init__.py
+cheetah/Utils/htmlDecode.py
+cheetah/Utils/htmlEncode.py
+cheetah/Utils/memcache.py
+cheetah/Utils/statprof.py
+cheetah/c/_namemapper.c
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/cheetah
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/cheetah (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/cheetah (revision 3)
@@ -0,0 +1,3 @@
+#!/usr/bin/python2.6
+from Cheetah.CheetahWrapper import _cheetah
+_cheetah()
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/cheetah-compile
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/cheetah-compile (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/cheetah-compile (revision 3)
@@ -0,0 +1,3 @@
+#!/usr/bin/python2.6
+from Cheetah.CheetahWrapper import _cheetah_compile
+_cheetah_compile()
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/top_level.txt
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/top_level.txt (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/top_level.txt (revision 3)
@@ -0,0 +1,1 @@
+Cheetah
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/PKG-INFO
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/PKG-INFO (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/PKG-INFO (revision 3)
@@ -0,0 +1,47 @@
+Metadata-Version: 1.0
+Name: Cheetah
+Version: 2.2.2
+Summary: Cheetah is a template engine and code generation tool.
+Home-page: http://www.cheetahtemplate.org/
+Author: R. Tyler Ballance
+Author-email: cheetahtemplate-discuss@lists.sf.net
+License: UNKNOWN
+Description: Cheetah is an open source template engine and code generation tool.
+        
+        It can be used standalone or combined with other tools and frameworks. Web
+        development is its principle use, but Cheetah is very flexible and is also being
+        used to generate C++ game code, Java, sql, form emails and even Python code.
+        
+        Documentation
+        ================================================================================
+        For a high-level introduction to Cheetah please refer to the User's Guide
+        at http://www.cheetahtemplate.org/learn.html
+        
+        Mailing list
+        ================================================================================
+        cheetahtemplate-discuss@lists.sourceforge.net
+        Subscribe at http://lists.sourceforge.net/lists/listinfo/cheetahtemplate-discuss
+        
+        Credits
+        ================================================================================
+        http://www.cheetahtemplate.org/credits.html
+        
+        Recent Changes
+        ================================================================================
+        See http://www.cheetahtemplate.org/CHANGES.txt for full details
+        
+        
+Platform: UNKNOWN
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Intended Audience :: Developers
+Classifier: Intended Audience :: System Administrators
+Classifier: License :: OSI Approved :: MIT License
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python
+Classifier: Topic :: Internet :: WWW/HTTP
+Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
+Classifier: Topic :: Internet :: WWW/HTTP :: Site Management
+Classifier: Topic :: Software Development :: Code Generators
+Classifier: Topic :: Software Development :: Libraries :: Python Modules
+Classifier: Topic :: Software Development :: User Interfaces
+Classifier: Topic :: Text Processing
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/dependency_links.txt
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/dependency_links.txt (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/dependency_links.txt (revision 3)
@@ -0,0 +1,1 @@
+
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/not-zip-safe
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/not-zip-safe (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/not-zip-safe (revision 3)
@@ -0,0 +1,1 @@
+
Index: /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/native_libs.txt
===================================================================
--- /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/native_libs.txt (revision 3)
+++ /galaxy-central/eggs/Cheetah-2.2.2-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/native_libs.txt (revision 3)
@@ -0,0 +1,1 @@
+Cheetah/_namemapper.so
Index: /galaxy-central/eggs/twill-0.9-py2.6.egg/EGG-INFO/SOURCES.txt
===================================================================
--- /galaxy-central/eggs/twill-0.9-py2.6.egg/EGG-INFO/SOURCES.txt (revision 3)
+++ /galaxy-central/eggs/twill-0.9-py2.6.egg/EGG-INFO/SOURCES.txt (revision 3)
@@ -0,0 +1,58 @@
+README.txt
+scramble.py
+twill-fork
+twill/__init__.py
+twill/_browser.py
+twill/browser.py
+twill/commands.py
+twill/errors.py
+twill/namespaces.py
+twill/parse.py
+twill/shell.py
+twill/unit.py
+twill/utils.py
+twill/wsgi_intercept.py
+twill.egg-info/PKG-INFO
+twill.egg-info/SOURCES.txt
+twill.egg-info/dependency_links.txt
+twill.egg-info/entry_points.txt
+twill.egg-info/top_level.txt
+twill/extensions/__init__.py
+twill/extensions/argparse.py
+twill/extensions/check_links.py
+twill/extensions/csv_iterate.py
+twill/extensions/dirstack.py
+twill/extensions/dns_check.py
+twill/extensions/formfill.py
+twill/extensions/mailman_sf.py
+twill/extensions/require.py
+twill/extensions/test_extensions.py
+twill/extensions/match_parse/__init__.py
+twill/extensions/match_parse/test-match_parse.py
+twill/other_packages/__init__.py
+twill/other_packages/pyparsing.py
+twill/other_packages/subprocess.py
+twill/other_packages/_mechanize_dist/ClientForm.py
+twill/other_packages/_mechanize_dist/__init__.py
+twill/other_packages/_mechanize_dist/_auth.py
+twill/other_packages/_mechanize_dist/_beautifulsoup.py
+twill/other_packages/_mechanize_dist/_clientcookie.py
+twill/other_packages/_mechanize_dist/_debug.py
+twill/other_packages/_mechanize_dist/_gzip.py
+twill/other_packages/_mechanize_dist/_headersutil.py
+twill/other_packages/_mechanize_dist/_html.py
+twill/other_packages/_mechanize_dist/_http.py
+twill/other_packages/_mechanize_dist/_lwpcookiejar.py
+twill/other_packages/_mechanize_dist/_mechanize.py
+twill/other_packages/_mechanize_dist/_mozillacookiejar.py
+twill/other_packages/_mechanize_dist/_msiecookiejar.py
+twill/other_packages/_mechanize_dist/_opener.py
+twill/other_packages/_mechanize_dist/_pullparser.py
+twill/other_packages/_mechanize_dist/_request.py
+twill/other_packages/_mechanize_dist/_response.py
+twill/other_packages/_mechanize_dist/_rfc3986.py
+twill/other_packages/_mechanize_dist/_seek.py
+twill/other_packages/_mechanize_dist/_upgrade.py
+twill/other_packages/_mechanize_dist/_urllib2.py
+twill/other_packages/_mechanize_dist/_useragent.py
+twill/other_packages/_mechanize_dist/_util.py
Index: /galaxy-central/eggs/twill-0.9-py2.6.egg/EGG-INFO/scripts/twill-fork
===================================================================
--- /galaxy-central/eggs/twill-0.9-py2.6.egg/EGG-INFO/scripts/twill-fork (revision 3)
+++ /galaxy-central/eggs/twill-0.9-py2.6.egg/EGG-INFO/scripts/twill-fork (revision 3)
@@ -0,0 +1,145 @@
+#!/afs/bx.psu.edu/project/pythons/linux-x86_64-ucs4/bin/python2.6
+# This file is part of the twill source distribution.
+#
+# twill is a extensible scriptlet language for testing Web apps,
+# available at http://twill.idyll.org/.
+#
+# Contact author: C. Titus Brown, titus@idyll.org.
+#
+# This program and all associated source code files are Copyright (C)
+# 2005-2007 by C. Titus Brown.  It is released under the MIT license;
+# please see the included LICENSE.txt file for more information, or
+# go to http://www.opensource.org/licenses/mit-license.php.
+
+"""
+twill multiprocess execution system.
+"""
+
+import sys, os, time
+from twill import execute_file
+from optparse import OptionParser
+from cPickle import load, dump
+
+###
+# make sure that the current working directory is in the path.  does this
+# work on Windows??
+
+if not '.' in sys.path:
+    sys.path.append('.')
+###
+
+#### OPTIONS
+
+parser = OptionParser()
+
+parser.add_option('-u', '--url', nargs=1, action="store", dest="url",
+                  help="start at the given URL before each script")
+
+parser.add_option('-n', '--number', nargs=1, action="store", dest="number",
+                  default=1, type="int",
+                  help="number of times to run the given script(s)")
+
+parser.add_option('-p', '--processes', nargs=1, action="store",
+                  dest="processes", default=1, type="int",
+                  help="number of processes to execute in parallel")
+
+####
+
+# parse arguments.
+(options, args) = parser.parse_args()
+
+if not len(args):
+    sys.stderr.write('Error!  Must specify one or more scripts to execute...\n')
+    sys.exit(-1)
+
+average_number = int(options.number / options.processes)
+last_number = average_number + options.number % options.processes
+is_parent = True
+child_pids = []
+
+#
+# start a bunch of child processes & record their pids in the parent.
+#
+
+for i in range(0, options.processes):
+    pid = os.fork()
+    if pid == 0:
+        if i == 0:
+            repeat = last_number        # make sure we execute 'em *all*
+        else:
+            repeat = average_number
+            
+        is_parent = False
+        break
+    else:
+        child_pids.append(pid)          # keep track of children
+
+#
+# set the children up to run & record their stats
+#
+
+failed = False
+
+if not is_parent:
+    print '[twill-fork: pid %d : executing %d times]' % (os.getpid(), repeat)
+
+    start_time = time.time()
+
+    for i in range(0, repeat):
+        for filename in args:
+            execute_file(filename, initial_url=options.url)
+        
+    end_time = time.time()
+    this_time = end_time - start_time
+
+    # write statistics
+    fp = open('.status.%d' % (os.getpid(),), 'w')
+    info = (this_time, repeat)
+    dump(info, fp)
+    fp.close()
+
+else:                                   # is_parent
+    total_time = 0.
+    total_exec = 0
+
+    # iterate over all the child pids, wait 'til they finish, and then
+    # sum statistics.
+    
+    left_childs = child_pids[:]
+    for child_pid in left_childs:
+        child_pid, status = os.waitpid(child_pid, 0)
+
+        # status != 0 indicates failure:
+        
+        if status != 0:
+            print '[twill-fork parent: process %d FAILED: exit status %d]' % (child_pid, status,)
+            print '[twill-fork parent: (not counting stats for this process)]'
+            failed = True
+        else:
+            # record statistics, otherwise
+            
+            fp = open('.status.%d' % (child_pid,))
+            (this_time, n_executed) = load(fp)
+            fp.close()
+            os.unlink('.status.%d' % (child_pid,))
+
+            total_time += this_time
+            total_exec += n_executed
+
+    #
+    # summarize
+    #
+
+    print '\n---'
+    print 'n processes: %d' % (options.processes,)
+    print 'total executed: %d' % (total_exec,)
+    print 'total time to execute: %f' % (total_time,)
+    if total_exec:
+        print 'average time: %f' % (total_time / total_exec,)
+    else:
+        print '(nothing completed, no average!)'
+
+if failed:
+    sys.exit(-1)
+
+sys.exit(0)
Index: /galaxy-central/eggs/twill-0.9-py2.6.egg/EGG-INFO/top_level.txt
===================================================================
--- /galaxy-central/eggs/twill-0.9-py2.6.egg/EGG-INFO/top_level.txt (revision 3)
+++ /galaxy-central/eggs/twill-0.9-py2.6.egg/EGG-INFO/top_level.txt (revision 3)
@@ -0,0 +1,1 @@
+twill
Index: /galaxy-central/eggs/twill-0.9-py2.6.egg/EGG-INFO/PKG-INFO
===================================================================
--- /galaxy-central/eggs/twill-0.9-py2.6.egg/EGG-INFO/PKG-INFO (revision 3)
+++ /galaxy-central/eggs/twill-0.9-py2.6.egg/EGG-INFO/PKG-INFO (revision 3)
@@ -0,0 +1,24 @@
+Metadata-Version: 1.0
+Name: twill
+Version: 0.9
+Summary: twill Web browsing language
+Home-page: http://twill.idyll.org/
+Author: C. Titus Brown
+Author-email: titus@caltech.edu
+License: MIT
+Download-URL: http://darcs.idyll.org/~t/projects/twill-0.9.tar.gz
+Description: A scripting system for automating Web browsing.  Useful for testing
+        Web pages or grabbing data from password-protected sites automatically.
+        
+Platform: UNKNOWN
+Classifier: Development Status :: 4 - Beta
+Classifier: Environment :: Console
+Classifier: Intended Audience :: Developers
+Classifier: Intended Audience :: System Administrators
+Classifier: License :: OSI Approved :: MIT License
+Classifier: Natural Language :: English
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Other Scripting Engines
+Classifier: Topic :: Internet :: WWW/HTTP
+Classifier: Topic :: Software Development :: Testing
Index: /galaxy-central/eggs/twill-0.9-py2.6.egg/EGG-INFO/entry_points.txt
===================================================================
--- /galaxy-central/eggs/twill-0.9-py2.6.egg/EGG-INFO/entry_points.txt (revision 3)
+++ /galaxy-central/eggs/twill-0.9-py2.6.egg/EGG-INFO/entry_points.txt (revision 3)
@@ -0,0 +1,3 @@
+[console_scripts]
+twill-sh = twill.shell:main
+
Index: /galaxy-central/eggs/twill-0.9-py2.6.egg/EGG-INFO/dependency_links.txt
===================================================================
--- /galaxy-central/eggs/twill-0.9-py2.6.egg/EGG-INFO/dependency_links.txt (revision 3)
+++ /galaxy-central/eggs/twill-0.9-py2.6.egg/EGG-INFO/dependency_links.txt (revision 3)
@@ -0,0 +1,1 @@
+
Index: /galaxy-central/eggs/twill-0.9-py2.6.egg/EGG-INFO/not-zip-safe
===================================================================
--- /galaxy-central/eggs/twill-0.9-py2.6.egg/EGG-INFO/not-zip-safe (revision 3)
+++ /galaxy-central/eggs/twill-0.9-py2.6.egg/EGG-INFO/not-zip-safe (revision 3)
@@ -0,0 +1,1 @@
+
Index: /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/extensions/csv_iterate.py
===================================================================
--- /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/extensions/csv_iterate.py (revision 3)
+++ /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/extensions/csv_iterate.py (revision 3)
@@ -0,0 +1,33 @@
+"""
+An extension function to iterate over a list of comma-separated values.
+
+Function 'csv_iterate' reads a file containing one or more rows of
+comma-separated columns, assigns them to col1...colN, and, for each row,
+executes the given twill script.
+"""
+
+__all__ = ['csv_iterate']
+
+DEBUG=True
+
+import csv
+
+def csv_iterate(filename, scriptname):
+    """
+    >> csv_iterate <csv_file> <script>
+
+    For each line in <csv_file>, read in a list of comma-separated values,
+    put them in $col1...$colN, and execute <script>.
+    """
+    from twill import namespaces, execute_file, commands
+
+    global_dict, local_dict = namespaces.get_twill_glocals()
+
+    reader = csv.reader(open(filename, "rb"))
+    for i, row in enumerate(reader):
+        if DEBUG:
+            print>>commands.OUT,'csv_iterate: on row %d of %s' % (i, filename,)
+        for i, col in enumerate(row):
+            global_dict["col%d" % (i + 1,)] = col
+
+        execute_file(scriptname, no_reset=True)
Index: /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/extensions/formfill.py
===================================================================
--- /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/extensions/formfill.py (revision 3)
+++ /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/extensions/formfill.py (revision 3)
@@ -0,0 +1,127 @@
+"""
+Extension functions for easier form filling.
+
+(This module is a dumping ground for features that may ultimately get
+added into the main twill command set.)
+
+Commands:
+
+ * fv_match -- fill in *all* fields that match a regexp (unlike 'formvalue'
+        which will complain about multiple matches).  Useful for forms
+        with lots of repeated fieldnames -- 'field-1', 'field-2', etc.
+
+ * fv_multi -- fill in multiple form fields at once, e.g.
+
+          fv_multi <formname> field1=value1 field2=value2 field3=value3
+
+ * fv_multi_sub -- same as 'fv_multi', followed by a 'submit'.
+        
+"""
+
+import twill, twill.utils
+import re
+
+__all__ = [ 'fv_match', 'fv_multi_match', 'fv_multi', 'fv_multi_sub' ]
+
+def fv_match(formname, regexp, value):
+    """
+    >> fv_match <formname> <field regexp> <value>
+
+    Set value of *all* form fields with a name that matches the given
+    regular expression.
+
+    (Unlike 'formvalue' or 'fv', this will not complain about multiple
+    matches!)
+    """
+    state = twill.get_browser()
+    
+    form = state.get_form(formname)
+    if not form:
+        print 'no such form', formname
+        return
+
+    regexp = re.compile(regexp)
+
+    matches = [ ctl for ctl in form.controls if regexp.search(str(ctl.name)) ]
+
+    if matches:
+        print '-- matches %d' % (len(matches),)
+
+        n = 0
+        for control in matches:
+            state.clicked(form, control)
+            if control.readonly:
+                continue
+
+            n += 1
+            twill.utils.set_form_control_value(control, value)
+
+        print 'set %d values total' % (n,)
+
+def fv_multi_match(formname, regexp, *values):
+    """
+    >> fv_multi_match <formname> <field regexp> <value> [<value> [<value>..]]
+
+    Set value of each consecutive matching form field with the next specified
+    value.  If there are no more values, use the last for all remaining form
+    fields
+    """
+    state = twill.get_browser()
+    
+    form = state.get_form(formname)
+    if not form:
+        print 'no such form', formname
+        return
+
+    regexp = re.compile(regexp)
+
+    matches = [ ctl for ctl in form.controls if regexp.search(str(ctl.name)) ]
+
+    if matches:
+        print '-- matches %d, values %d' % (len(matches), len(values))
+
+        n = 0
+        for control in matches:
+            state.clicked(form, control)
+            if control.readonly:
+                continue
+            try:
+                twill.utils.set_form_control_value(control, values[n])
+            except IndexError, e:
+                twill.utils.set_form_control_value(control, values[-1])
+            n += 1
+
+        print 'set %d values total' % (n,)
+
+
+def fv_multi(formname, *pairs):
+    """
+    >> fv_multi <formname> [ <pair1> [ <pair2> [ <pair3> ]]]
+
+    Set multiple form fields; each pair should be of the form
+    
+        fieldname=value
+
+    The pair will be split around the first '=', and
+    'fv <formname> fieldname value' will be executed in the order the
+    pairs are given.
+    """
+    from twill import commands
+
+    for p in pairs:
+        fieldname, value = p.split('=', 1)
+        commands.fv(formname, fieldname, value)
+
+def fv_multi_sub(formname, *pairs):
+    """
+    >> fv_multi_sub <formname> [ <pair1> [ <pair2> [ <pair3> ]]]
+
+    Set multiple form fields (as with 'fv_multi') and then submit().
+    """
+    from twill import commands
+
+    for p in pairs:
+        fieldname, value = p.split('=', 1)
+        commands.fv(formname, fieldname, value)
+
+    commands.submit()
Index: /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/extensions/require.py
===================================================================
--- /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/extensions/require.py (revision 3)
+++ /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/extensions/require.py (revision 3)
@@ -0,0 +1,146 @@
+"""
+A simple set of extensions to manage post-load requirements for pages.
+
+Commands:
+
+   require       -- turn on post-load requirements; either 'success' or
+                    'links_ok'.
+                    
+   no_require    -- turn off requirements.
+   
+   skip_require  -- for the next page visit, skip requirements processing.
+   
+   flush_visited -- flush the list of already visited pages
+                    (for links checking)
+"""
+
+__all__ = ['require', 'skip_require', 'flush_visited', 'no_require']
+
+DEBUG=False
+
+###
+
+_requirements = []                      # what requirements to satisfy
+
+ignore_once = False                     # reset after each hook call
+ignore_always = False                   # never reset
+links_visited = {}                      # list of known good links, for
+                                        #   link checking.
+
+def _require_post_load_hook(action, *args, **kwargs):
+    """
+    post-load hook function to be called after each page is loaded.
+    
+    See TwillBrowser._journey() for more information.
+    """
+    if action == 'back':                # do nothing on a 'back'
+        return
+    
+    from twill import commands
+    OUT=commands.OUT
+
+    global ignore_once
+    global ignore_always
+    
+    if ignore_once or ignore_always:
+        ignore_once = False
+        return
+    
+    for what in _requirements:
+
+        ####
+        ####
+        ####
+        
+        if what == 'success':
+            if DEBUG:
+                print>>OUT, 'REQUIRING success'
+            commands.code(200)
+            
+        ####
+        ####
+        ####
+            
+        elif what == 'links_ok':
+            from check_links import check_links
+            
+            ignore_always = True
+            if DEBUG:
+                print>>OUT, 'REQUIRING functioning links'
+                print>>OUT, '(already visited:)'
+                print "\n\t".join(links_visited.keys())
+                
+            try:
+                check_links(visited=links_visited)
+            finally:
+                ignore_always = False
+
+#######
+
+#
+# twill command-line functions.
+#
+
+def skip_require():
+    """
+    >> skip_require
+
+    Skip the post-page-load requirements.
+    """
+    global ignore_once
+    ignore_once = True
+
+def require(what):
+    """
+    >> require <what>
+
+    After each page is loaded, require that 'what' be satisfied.  'what'
+    can be:
+      * 'success' -- HTTP return code is 200
+      * 'links_ok' -- all of the links on the page load OK (see 'check_links'
+                      extension module)
+    """
+    global _requirements
+    from twill import commands
+
+    #
+    # install the post-load hook function.
+    #
+
+    if _require_post_load_hook not in commands.browser._post_load_hooks:
+        if DEBUG:
+            print>>commands.OUT, 'INSTALLING POST-LOAD HOOK'
+        commands.browser._post_load_hooks.append(_require_post_load_hook)
+
+    #
+    # add the requirement.
+    #
+
+    if what not in _requirements:
+        if DEBUG:
+            print>>commands.OUT, 'Adding requirement', what
+        _requirements.append(what)
+
+def no_require():
+    """
+    >> no_require
+
+    Remove all post-load requirements.
+    """
+    from twill import commands
+    
+    l = commands.browser._post_load_hooks
+    l = [ fn for fn in l if fn != _require_post_load_hook ]
+    commands.browser._post_load_hooks = l
+
+    global _requirements
+    _requirements = []
+
+def flush_visited():
+    """
+    >> flush_visited
+    
+    Flush the list of pages successfully visited already.
+    """
+    global links_visited
+    links_visited.clear()
Index: /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/extensions/check_links.py
===================================================================
--- /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/extensions/check_links.py (revision 3)
+++ /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/extensions/check_links.py (revision 3)
@@ -0,0 +1,186 @@
+"""
+Extension functions to check all of the links on a page.
+
+Usage:
+
+   check_links [ <pattern> ]
+
+Make sure that all of the HTTP links on the current page can be visited
+successfully.  If 'pattern' is given, check only URLs that match that
+regular expression.
+
+If option 'check_links.only_collect_bad_links' is on, then all bad
+links are silently collected across all calls to check_links.  The
+function 'report_bad_links' can then be used to report all of the links,
+together with their referring pages.
+"""
+
+__all__ = ['check_links', 'report_bad_links']
+
+DEBUG=True
+
+import re
+from twill import commands
+from twill.errors import TwillAssertionError
+
+### first, set up config options & persistent 'bad links' memory...
+
+if commands._options.get('check_links.only_collection_bad_links') is None:
+    commands._options['check_links.only_collect_bad_links'] = False
+
+bad_links_dict = {}
+
+#
+# main function: 'check_links'
+#
+
+def check_links(pattern = '', visited={}):
+    """
+    >> check_links [ <pattern> ]
+
+    Make sure that all of the HTTP links on the current page can be visited
+    with an HTTP response 200 (success).  If 'pattern' is given, interpret
+    it as a regular expression that link URLs must contain in order to be
+    tested, e.g.
+
+        check_links http://.*\.google\.com
+
+    would check only links to google URLs.  Note that because 'follow'
+    is used to visit the pages, the referrer URL is properly set on the
+    visit.
+    """
+    from twill import commands
+
+    if DEBUG:
+        print 'in check_links'
+    
+    OUT = commands.OUT
+    browser = commands.browser
+
+    #
+    # compile the regexp
+    #
+    
+    regexp = None
+    if pattern:
+        regexp = re.compile(pattern)
+
+    #
+    # iterate over all links, collecting those that match.
+    #
+    # note that in the case of duplicate URLs, only one of the
+    # links is actually followed!
+    #
+
+    collected_urls = {}
+
+    links = list(browser._browser.links())
+    if not links:
+        if DEBUG:
+            print>>OUT, "no links to check!?"
+        return
+        
+    for link in links:
+        url = link.absolute_url
+        url = url.split('#', 1)[0]      # get rid of subpage pointers
+
+        if not (url.startswith('http://') or url.startswith('https://')):
+            if DEBUG:
+               print>>OUT, "url '%s' is not an HTTP link; ignoring" % (url,)
+            continue
+
+        if regexp:
+            if regexp.search(url):
+                collected_urls[url] = link
+                if DEBUG:
+                    print>>OUT, "Gathered URL %s -- matched regexp" % (url,)
+            elif DEBUG:
+                print>>OUT, "URL %s doesn't match regexp" % (url,)
+        else:
+            collected_urls[url] = link
+            if DEBUG:
+                print>>OUT, "Gathered URL %s." % (url,)
+
+    #
+    # now, for each unique URL, follow the link. Trap ALL exceptions
+    # as failures.
+    #
+
+    failed = []
+    for link in collected_urls.values():
+        went = False
+        try:
+            if DEBUG:
+                print>>OUT, "Trying %s" % (link.absolute_url,),
+                
+            if not visited.has_key(link.absolute_url):
+                went = True
+                browser.follow_link(link)
+                
+                code = browser.get_code()
+                assert code == 200
+
+                visited[link.absolute_url] = 1
+                
+                if DEBUG:
+                    print>>OUT, '...success!'
+            else:
+                if DEBUG:
+                    print>>OUT, ' (already visited successfully)'
+        except:
+            failed.append(link.absolute_url)
+            if DEBUG:
+                print>>OUT, '...failure ;('
+
+        if went:
+            browser.back()
+
+    if failed:
+        if commands._options['check_links.only_collect_bad_links']:
+            for l in failed:
+                refering_pages = bad_links_dict.get(l, [])
+                print '***', browser.get_url()
+                refering_pages.append(browser.get_url())
+                bad_links_dict[l] = refering_pages
+        else:
+            print>>OUT, '\nCould not follow %d links' % (len(failed),)
+            print>>OUT, '\t%s\n' % '\n\t'.join(failed)
+            raise TwillAssertionError("broken links on page")
+
+def report_bad_links(fail_if_exist='+', flush_bad_links='+'):
+    """
+    >> report_bad_links [<fail-if-exist> [<flush-bad-links>]]
+
+    Report all of the links collected across check_links runs (collected
+    if and only if the config option check_links.only_collect_bad_links
+    is set).
+
+    If <fail-if-exist> is false (true by default) then the command will
+    fail after reporting any bad links.
+
+    If <flush-bad-links> is false (true by default) then the list of
+    bad links will be retained across the function call.
+    """
+    global bad_links_dict
+    
+    from twill import utils
+    fail_if_exist = utils.make_boolean(fail_if_exist)
+    flush_bad_links = utils.make_boolean(flush_bad_links)
+
+    from twill import commands
+    OUT = commands.OUT
+
+    if not bad_links_dict:
+        print>>OUT, '\nNo bad links to report.\n'
+    else:
+        print>>OUT, '\nCould not follow %d links' % (len(bad_links_dict),)
+        for page, referers in bad_links_dict.items():
+            err_msg = "\t link '%s' (occurs on: " % (page,)\
+                      + ",".join(referers) + ')' 
+            print>>OUT, err_msg
+
+        if flush_bad_links:
+            bad_links_dict = {}
+
+        if fail_if_exist:
+            raise TwillAssertionError("broken links encountered")
Index: /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/extensions/test_extensions.py
===================================================================
--- /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/extensions/test_extensions.py (revision 3)
+++ /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/extensions/test_extensions.py (revision 3)
@@ -0,0 +1,15 @@
+"""
+Used in test-shell, to test default command execution & extensions.
+"""
+
+flag = False
+
+__all__ = ['flag_true', 'assert_flag']
+
+def flag_true():
+    global flag
+    flag = True
+
+def assert_flag():
+    global flag
+    assert flag
Index: /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/extensions/__init__.py
===================================================================
--- /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/extensions/__init__.py (revision 3)
+++ /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/extensions/__init__.py (revision 3)
@@ -0,0 +1,1 @@
+#
Index: /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/extensions/match_parse/__init__.py
===================================================================
--- /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/extensions/match_parse/__init__.py (revision 3)
+++ /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/extensions/match_parse/__init__.py (revision 3)
@@ -0,0 +1,91 @@
+"""
+sureshvv's extension for slicing and dicing variables with regular expressions.
+"""
+
+import re
+from twill.namespaces import get_twill_glocals
+from twill.commands import browser
+
+def showvar(which):
+     """
+     >> showvar var
+
+     Shows the value of the variable 'var'.
+     """
+     global_dict, local_dict = get_twill_glocals()
+     
+     d = global_dict.copy()
+     d.update(local_dict)
+     
+     print d.get(str(which))
+
+def split(what):
+     """
+     >> split <regexp>
+
+     Sets __matchlist__ to re.split(regexp, page).
+     """
+     page = browser.get_html()
+
+     m = re.split(what, page)
+
+     global_dict, local_dict = get_twill_glocals()
+     local_dict['__matchlist__'] = m
+
+def findall(what):
+     """
+     >> findall <regexp>
+
+     Sets __matchlist__ to re.findall(regexp, page).
+     """
+     page = browser.get_html()
+
+     regexp = re.compile(what, re.DOTALL)
+     m = regexp.findall(page)
+
+     global_dict, local_dict = get_twill_glocals()
+     local_dict['__matchlist__'] = m
+
+def getmatch(where, what):
+     """
+     >> getmatch into_var expression
+
+     Evaluates an expression against __match__ and puts it into 'into_var'.
+     """
+     global_dict, local_dict = get_twill_glocals()
+     match = local_dict['__match__']
+     local_dict[where] = _do_eval(match, what)
+
+def setmatch(what):
+     """
+     >> setmatch expression
+
+     Sets each element __matchlist__ to eval(expression); 'm' is set
+     to each element of __matchlist__ prior to processing.
+     """
+     global_dict, local_dict = get_twill_glocals()
+     
+     match = local_dict['__matchlist__']
+     if isinstance(match, str):         # convert to list
+          match = [ match, ]
+          
+     new_match = [ _do_eval(m, what) for m in match ]
+     local_dict['__matchlist__'] = new_match
+
+def _do_eval(match, exp):
+     """
+     Used internally to evaluate an expresseion
+     """
+     return eval(exp, globals(), {'m': match})
+
+def popmatch(which):
+     """
+     >> popmatch index
+
+     Pops __matchlist__[i] into __match__.
+     """
+     global_dict, local_dict = get_twill_glocals()
+     
+     matchlist = local_dict['__matchlist__']
+     match = matchlist.pop(int(which))
+     local_dict['__match__'] = match
Index: /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/extensions/match_parse/test-match_parse.py
===================================================================
--- /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/extensions/match_parse/test-match_parse.py (revision 3)
+++ /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/extensions/match_parse/test-match_parse.py (revision 3)
@@ -0,0 +1,1 @@
+#
Index: /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/extensions/dns_check.py
===================================================================
--- /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/extensions/dns_check.py (revision 3)
+++ /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/extensions/dns_check.py (revision 3)
@@ -0,0 +1,141 @@
+"""
+Extension functions to help query/assert name service information.
+
+Functions:
+
+  * dns_resolves -- assert that a host resolves to a specific IP address.
+  * dns_a -- assert that a host directly resolves to a specific IP address
+  * dns_cname -- assert that a host is an alias for another hostname.
+  * dnx_mx -- assert that a given host is a mail exchanger for the given name.
+  * dns_ns -- assert that a given hostname is a name server for the given name.
+"""
+
+import socket
+from twill.errors import TwillAssertionError
+
+try:
+    import dns.resolver
+except ImportError:
+    raise Exception("ERROR: must have dnspython installed to use the DNS extension module")
+
+def dns_a(host, ipaddress, server=None):
+    """
+    >> dns_a <name> <ipaddress> [<name server>]
+
+    Assert that <name> resolves to <ipaddress> (and is an A record).
+    Optionally use the given name server.
+    """
+    if not is_ip_addr(ipaddress):
+        raise Exception("<ipaddress> parameter must be an IP address, not a hostname")
+
+    for answer in _query(host, 'A', server):
+        if ipaddress == answer.address:
+            return True
+
+    raise TwillAssertionError
+
+def dns_cname(host, cname, server=None):
+    """
+    >> dns_cname <name> <alias_for> [<name server>]
+
+    Assert that <name> is a CNAME alias for <alias_for>  Optionally use
+    <name server>.
+    """
+    if is_ip_addr(cname):
+        raise Exception("<alias_for> parameter must be a hostname, not an IP address")
+    
+    cname = dns.name.from_text(cname)
+    
+    for answer in _query(host, 'CNAME', server):
+        if cname == answer.target:
+            return True
+
+    raise TwillAssertionError
+
+def dns_resolves(host, ipaddress, server=None):
+    """
+    >> dns_resolves <name> <name2/ipaddress> [<name server>]
+    
+    Assert that <name> ultimately resolves to the given IP address (or
+    the same IP address that 'name2' resolves to).  Optionally use the
+    given name server.
+    """
+    if not is_ip_addr(ipaddress):
+        ipaddress = _resolve_name(ipaddress, server)
+        
+    for answer in _query(host, 1, server):
+        if ipaddress == answer.address:
+            return True
+
+    raise TwillAssertionError
+
+def dns_mx(host, mailserver, server=None):
+    """
+    >> dns_mx <name> <mailserver> [<name server>]
+
+    Assert that <mailserver> is a mailserver for <name>.
+    """
+    mailserver = dns.name.from_text(mailserver)
+    
+    for rdata in _query(host, 'MX', server):
+        if mailserver == rdata.exchange:
+            return True
+
+    raise TwillAssertionError
+
+def dns_ns(host, query_ns, server=None):
+    """
+    >> dns_ns <domain> <nameserver> [<name server to use>]
+
+    Assert that <nameserver> is a mailserver for <domain>.
+    """
+    query_ns = dns.name.from_text(query_ns)
+    
+    for answer in _query(host, 'NS', server):
+        if query_ns == answer.target:
+            return True
+
+    raise TwillAssertionError
+
+###
+
+def is_ip_addr(text):
+    """
+    Check the 'name' to see if it's just an IP address.
+    """
+    
+    try:
+        v = dns.ipv4.inet_aton(text)
+        return True
+    except socket.error:
+        return False
+
+def _resolve_name(name, server):
+    """
+    Resolve the given name to an IP address.
+    """
+    if is_ip_addr(name):
+        return name
+    
+    r = dns.resolver.Resolver()
+    if server:
+        r.nameservers = [_resolve_name(server, None)]
+
+    answers = r.query(name)
+
+    answer = None
+    for answer in answers:              # @CTB !?
+        break
+
+    assert answer
+    return str(answer)
+
+def _query(query, query_type, server):
+    """
+    Query, perhaps via the given name server.  (server=None to use default).
+    """
+    r = dns.resolver.Resolver()
+    if server:
+        r.nameservers = [_resolve_name(server, None)]
+
+    return r.query(query, query_type)
Index: /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/extensions/argparse.py
===================================================================
--- /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/extensions/argparse.py (revision 3)
+++ /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/extensions/argparse.py (revision 3)
@@ -0,0 +1,38 @@
+"""
+Extension functions for parsing sys.argv.
+
+Commands:
+
+   get_args -- load all command-line arguments after the last --
+      into $arg1...$argN.
+   
+"""
+
+import twill.utils
+
+def get_args(require=0):
+    """
+    >> get_args [<require>]
+
+    Load the command line arguments after the last '--' into $arg1...$argN,
+    optionally requiring at least 'require' such arguments.
+    """
+    from twill import commands, namespaces, shell, errors
+
+    global_dict, local_dict = namespaces.get_twill_glocals()
+
+    require = int(require)
+
+    if len(shell.twillargs) < require:
+        from twill.errors import TwillAssertionError
+        raise TwillAssertionError("too few arguments; %d rather than %d" % \
+                                    (len(shell.twillargs), require,))
+
+    if shell.twillargs:
+        for i, arg in enumerate(shell.twillargs):
+            global_dict["arg%d" % (i + 1,)] = arg
+
+        print>>commands.OUT, "get_args: loaded %d args as $arg1..$arg%d." % \
+                             (i + 1, i + 1)
+    else:
+        print>>commands.OUT, "no arguments to parse!"
Index: /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/extensions/dirstack.py
===================================================================
--- /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/extensions/dirstack.py (revision 3)
+++ /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/extensions/dirstack.py (revision 3)
@@ -0,0 +1,44 @@
+"""
+Extension functions for manipulating the current working directory (cwd).
+
+Commands:
+
+   chdir -- push the cwd onto the directory stack & change to the new location.
+   popd  -- change to the last directory on the directory stack.
+"""
+import os
+
+_dirstack = []
+
+def chdir(where):
+    """
+    >> chdir <where>
+
+    Change to the new location, after saving the current directory onto
+    the directory stack.  The global variable __dir__ is set to the cwd.
+    """
+    from twill import commands
+    
+    cwd = os.getcwd()
+    _dirstack.append(cwd)
+    print cwd
+
+    os.chdir(where)
+    print>>commands.OUT, 'changed directory to "%s"' % (where,)
+
+    commands.setglobal('__dir__', where)
+
+def popd():
+    """
+    >> popd
+
+    Change back to the last directory on the directory stack.  The global
+    variable __dir__ is set to the cwd.
+    """
+    from twill import commands
+    
+    where = _dirstack.pop()
+    os.chdir(where)
+    print>>commands.OUT, 'popped back to directory "%s"' % (where,)
+
+    commands.setglobal('__dir__', where)
Index: /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/extensions/mailman_sf.py
===================================================================
--- /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/extensions/mailman_sf.py (revision 3)
+++ /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/extensions/mailman_sf.py (revision 3)
@@ -0,0 +1,64 @@
+"""
+Extension functions to discard all moderated messages in a SourceForge-based
+mailman queue.
+
+(Currently there is no way to do this without manually selecting 'discard'
+for each and every message.)
+"""
+
+import twill, twill.utils
+import re
+
+# export:
+__all__ = ['discard_all_messages',
+           'exit_if_empty'
+           ]
+
+def exit_if_empty():
+    """
+    >> exit_if_empty
+
+    Exit the script currently running, if there are no deferred messages
+    on the current page.
+    """
+    state = twill.get_browser()
+    form = state.get_form("1")
+    if not form:
+        print "No messages; exiting."
+        raise SystemExit
+    
+def discard_all_messages():
+    """
+    >> discard_all_messages
+
+    Set all buttons to "discard".
+    """
+    _formvalue_by_regexp_setall("1", "^\d+$", "3")
+
+### utility functions
+
+def _formvalue_by_regexp_setall(formname, fieldname, value):
+    state = twill.get_browser()
+    
+    form = state.get_form(formname)
+    if not form:
+        print 'no such form', formname
+        return
+
+    regexp = re.compile(fieldname)
+
+    matches = [ ctl for ctl in form.controls if regexp.search(str(ctl.name)) ]
+
+    if matches:
+        print '-- matches %d' % (len(matches),)
+
+        n = 0
+        for control in matches:
+            state.clicked(form, control)
+            if control.readonly:
+                continue
+
+            n += 1
+            twill.utils.set_form_control_value(control, value)
+
+        print 'set %d values total' % (n,)
Index: /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/subprocess.py
===================================================================
--- /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/subprocess.py (revision 3)
+++ /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/subprocess.py (revision 3)
@@ -0,0 +1,1149 @@
+# subprocess - Subprocesses with accessible I/O streams
+#
+# For more information about this module, see PEP 324.
+#
+# This module should remain compatible with Python 2.2, see PEP 291.
+#
+# Copyright (c) 2003-2005 by Peter Astrand <astrand@lysator.liu.se>
+#
+# Licensed to PSF under a Contributor Agreement.
+# See http://www.python.org/2.4/license for licensing details.
+
+r"""subprocess - Subprocesses with accessible I/O streams
+
+This module allows you to spawn processes, connect to their
+input/output/error pipes, and obtain their return codes.  This module
+intends to replace several other, older modules and functions, like:
+
+os.system
+os.spawn*
+os.popen*
+popen2.*
+commands.*
+
+Information about how the subprocess module can be used to replace these
+modules and functions can be found below.
+
+
+
+Using the subprocess module
+===========================
+This module defines one class called Popen:
+
+class Popen(args, bufsize=0, executable=None,
+            stdin=None, stdout=None, stderr=None,
+            preexec_fn=None, close_fds=False, shell=False,
+            cwd=None, env=None, universal_newlines=False,
+            startupinfo=None, creationflags=0):
+
+
+Arguments are:
+
+args should be a string, or a sequence of program arguments.  The
+program to execute is normally the first item in the args sequence or
+string, but can be explicitly set by using the executable argument.
+
+On UNIX, with shell=False (default): In this case, the Popen class
+uses os.execvp() to execute the child program.  args should normally
+be a sequence.  A string will be treated as a sequence with the string
+as the only item (the program to execute).
+
+On UNIX, with shell=True: If args is a string, it specifies the
+command string to execute through the shell.  If args is a sequence,
+the first item specifies the command string, and any additional items
+will be treated as additional shell arguments.
+
+On Windows: the Popen class uses CreateProcess() to execute the child
+program, which operates on strings.  If args is a sequence, it will be
+converted to a string using the list2cmdline method.  Please note that
+not all MS Windows applications interpret the command line the same
+way: The list2cmdline is designed for applications using the same
+rules as the MS C runtime.
+
+bufsize, if given, has the same meaning as the corresponding argument
+to the built-in open() function: 0 means unbuffered, 1 means line
+buffered, any other positive value means use a buffer of
+(approximately) that size.  A negative bufsize means to use the system
+default, which usually means fully buffered.  The default value for
+bufsize is 0 (unbuffered).
+
+stdin, stdout and stderr specify the executed programs' standard
+input, standard output and standard error file handles, respectively.
+Valid values are PIPE, an existing file descriptor (a positive
+integer), an existing file object, and None.  PIPE indicates that a
+new pipe to the child should be created.  With None, no redirection
+will occur; the child's file handles will be inherited from the
+parent.  Additionally, stderr can be STDOUT, which indicates that the
+stderr data from the applications should be captured into the same
+file handle as for stdout.
+
+If preexec_fn is set to a callable object, this object will be called
+in the child process just before the child is executed.
+
+If close_fds is true, all file descriptors except 0, 1 and 2 will be
+closed before the child process is executed.
+
+if shell is true, the specified command will be executed through the
+shell.
+
+If cwd is not None, the current directory will be changed to cwd
+before the child is executed.
+
+If env is not None, it defines the environment variables for the new
+process.
+
+If universal_newlines is true, the file objects stdout and stderr are
+opened as a text files, but lines may be terminated by any of '\n',
+the Unix end-of-line convention, '\r', the Macintosh convention or
+'\r\n', the Windows convention.  All of these external representations
+are seen as '\n' by the Python program.  Note: This feature is only
+available if Python is built with universal newline support (the
+default).  Also, the newlines attribute of the file objects stdout,
+stdin and stderr are not updated by the communicate() method.
+
+The startupinfo and creationflags, if given, will be passed to the
+underlying CreateProcess() function.  They can specify things such as
+appearance of the main window and priority for the new process.
+(Windows only)
+
+
+This module also defines two shortcut functions:
+
+call(*args, **kwargs):
+    Run command with arguments.  Wait for command to complete, then
+    return the returncode attribute.
+
+    The arguments are the same as for the Popen constructor.  Example:
+
+    retcode = call(["ls", "-l"])
+
+
+Exceptions
+----------
+Exceptions raised in the child process, before the new program has
+started to execute, will be re-raised in the parent.  Additionally,
+the exception object will have one extra attribute called
+'child_traceback', which is a string containing traceback information
+from the childs point of view.
+
+The most common exception raised is OSError.  This occurs, for
+example, when trying to execute a non-existent file.  Applications
+should prepare for OSErrors.
+
+A ValueError will be raised if Popen is called with invalid arguments.
+
+
+Security
+--------
+Unlike some other popen functions, this implementation will never call
+/bin/sh implicitly.  This means that all characters, including shell
+metacharacters, can safely be passed to child processes.
+
+
+Popen objects
+=============
+Instances of the Popen class have the following methods:
+
+poll()
+    Check if child process has terminated.  Returns returncode
+    attribute.
+
+wait()
+    Wait for child process to terminate.  Returns returncode attribute.
+
+communicate(input=None)
+    Interact with process: Send data to stdin.  Read data from stdout
+    and stderr, until end-of-file is reached.  Wait for process to
+    terminate.  The optional stdin argument should be a string to be
+    sent to the child process, or None, if no data should be sent to
+    the child.
+
+    communicate() returns a tuple (stdout, stderr).
+
+    Note: The data read is buffered in memory, so do not use this
+    method if the data size is large or unlimited.
+
+The following attributes are also available:
+
+stdin
+    If the stdin argument is PIPE, this attribute is a file object
+    that provides input to the child process.  Otherwise, it is None.
+
+stdout
+    If the stdout argument is PIPE, this attribute is a file object
+    that provides output from the child process.  Otherwise, it is
+    None.
+
+stderr
+    If the stderr argument is PIPE, this attribute is file object that
+    provides error output from the child process.  Otherwise, it is
+    None.
+
+pid
+    The process ID of the child process.
+
+returncode
+    The child return code.  A None value indicates that the process
+    hasn't terminated yet.  A negative value -N indicates that the
+    child was terminated by signal N (UNIX only).
+
+
+Replacing older functions with the subprocess module
+====================================================
+In this section, "a ==> b" means that b can be used as a replacement
+for a.
+
+Note: All functions in this section fail (more or less) silently if
+the executed program cannot be found; this module raises an OSError
+exception.
+
+In the following examples, we assume that the subprocess module is
+imported with "from subprocess import *".
+
+
+Replacing /bin/sh shell backquote
+---------------------------------
+output=`mycmd myarg`
+==>
+output = Popen(["mycmd", "myarg"], stdout=PIPE).communicate()[0]
+
+
+Replacing shell pipe line
+-------------------------
+output=`dmesg | grep hda`
+==>
+p1 = Popen(["dmesg"], stdout=PIPE)
+p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
+output = p2.communicate()[0]
+
+
+Replacing os.system()
+---------------------
+sts = os.system("mycmd" + " myarg")
+==>
+p = Popen("mycmd" + " myarg", shell=True)
+sts = os.waitpid(p.pid, 0)
+
+Note:
+
+* Calling the program through the shell is usually not required.
+
+* It's easier to look at the returncode attribute than the
+  exitstatus.
+
+A more real-world example would look like this:
+
+try:
+    retcode = call("mycmd" + " myarg", shell=True)
+    if retcode < 0:
+        print >>sys.stderr, "Child was terminated by signal", -retcode
+    else:
+        print >>sys.stderr, "Child returned", retcode
+except OSError, e:
+    print >>sys.stderr, "Execution failed:", e
+
+
+Replacing os.spawn*
+-------------------
+P_NOWAIT example:
+
+pid = os.spawnlp(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg")
+==>
+pid = Popen(["/bin/mycmd", "myarg"]).pid
+
+
+P_WAIT example:
+
+retcode = os.spawnlp(os.P_WAIT, "/bin/mycmd", "mycmd", "myarg")
+==>
+retcode = call(["/bin/mycmd", "myarg"])
+
+
+Vector example:
+
+os.spawnvp(os.P_NOWAIT, path, args)
+==>
+Popen([path] + args[1:])
+
+
+Environment example:
+
+os.spawnlpe(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg", env)
+==>
+Popen(["/bin/mycmd", "myarg"], env={"PATH": "/usr/bin"})
+
+
+Replacing os.popen*
+-------------------
+pipe = os.popen(cmd, mode='r', bufsize)
+==>
+pipe = Popen(cmd, shell=True, bufsize=bufsize, stdout=PIPE).stdout
+
+pipe = os.popen(cmd, mode='w', bufsize)
+==>
+pipe = Popen(cmd, shell=True, bufsize=bufsize, stdin=PIPE).stdin
+
+
+(child_stdin, child_stdout) = os.popen2(cmd, mode, bufsize)
+==>
+p = Popen(cmd, shell=True, bufsize=bufsize,
+          stdin=PIPE, stdout=PIPE, close_fds=True)
+(child_stdin, child_stdout) = (p.stdin, p.stdout)
+
+
+(child_stdin,
+ child_stdout,
+ child_stderr) = os.popen3(cmd, mode, bufsize)
+==>
+p = Popen(cmd, shell=True, bufsize=bufsize,
+          stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True)
+(child_stdin,
+ child_stdout,
+ child_stderr) = (p.stdin, p.stdout, p.stderr)
+
+
+(child_stdin, child_stdout_and_stderr) = os.popen4(cmd, mode, bufsize)
+==>
+p = Popen(cmd, shell=True, bufsize=bufsize,
+          stdin=PIPE, stdout=PIPE, stderr=STDOUT, close_fds=True)
+(child_stdin, child_stdout_and_stderr) = (p.stdin, p.stdout)
+
+
+Replacing popen2.*
+------------------
+Note: If the cmd argument to popen2 functions is a string, the command
+is executed through /bin/sh.  If it is a list, the command is directly
+executed.
+
+(child_stdout, child_stdin) = popen2.popen2("somestring", bufsize, mode)
+==>
+p = Popen(["somestring"], shell=True, bufsize=bufsize
+          stdin=PIPE, stdout=PIPE, close_fds=True)
+(child_stdout, child_stdin) = (p.stdout, p.stdin)
+
+
+(child_stdout, child_stdin) = popen2.popen2(["mycmd", "myarg"], bufsize, mode)
+==>
+p = Popen(["mycmd", "myarg"], bufsize=bufsize,
+          stdin=PIPE, stdout=PIPE, close_fds=True)
+(child_stdout, child_stdin) = (p.stdout, p.stdin)
+
+The popen2.Popen3 and popen3.Popen4 basically works as subprocess.Popen,
+except that:
+
+* subprocess.Popen raises an exception if the execution fails
+* the capturestderr argument is replaced with the stderr argument.
+* stdin=PIPE and stdout=PIPE must be specified.
+* popen2 closes all filedescriptors by default, but you have to specify
+  close_fds=True with subprocess.Popen.
+
+
+"""
+
+import sys
+mswindows = (sys.platform == "win32")
+
+import os
+import types
+import traceback
+
+if mswindows:
+    import threading
+    import msvcrt
+    if 0: # <-- change this to use pywin32 instead of the _subprocess driver
+        import pywintypes
+        from win32api import GetStdHandle, STD_INPUT_HANDLE, \
+                             STD_OUTPUT_HANDLE, STD_ERROR_HANDLE
+        from win32api import GetCurrentProcess, DuplicateHandle, \
+                             GetModuleFileName, GetVersion
+        from win32con import DUPLICATE_SAME_ACCESS, SW_HIDE
+        from win32pipe import CreatePipe
+        from win32process import CreateProcess, STARTUPINFO, \
+                                 GetExitCodeProcess, STARTF_USESTDHANDLES, \
+                                 STARTF_USESHOWWINDOW, CREATE_NEW_CONSOLE
+        from win32event import WaitForSingleObject, INFINITE, WAIT_OBJECT_0
+    else:
+        from _subprocess import *
+        class STARTUPINFO:
+            dwFlags = 0
+            hStdInput = None
+            hStdOutput = None
+            hStdError = None
+            wShowWindow = 0
+        class pywintypes:
+            error = IOError
+else:
+    import select
+    import errno
+    import fcntl
+    import pickle
+
+__all__ = ["Popen", "PIPE", "STDOUT", "call"]
+
+try:
+    MAXFD = os.sysconf("SC_OPEN_MAX")
+except:
+    MAXFD = 256
+
+# True/False does not exist on 2.2.0
+try:
+    False
+except NameError:
+    False = 0
+    True = 1
+
+_active = []
+
+def _cleanup():
+    for inst in _active[:]:
+        inst.poll()
+
+PIPE = -1
+STDOUT = -2
+
+
+def call(*args, **kwargs):
+    """Run command with arguments.  Wait for command to complete, then
+    return the returncode attribute.
+
+    The arguments are the same as for the Popen constructor.  Example:
+
+    retcode = call(["ls", "-l"])
+    """
+    return Popen(*args, **kwargs).wait()
+
+
+def list2cmdline(seq):
+    """
+    Translate a sequence of arguments into a command line
+    string, using the same rules as the MS C runtime:
+
+    1) Arguments are delimited by white space, which is either a
+       space or a tab.
+
+    2) A string surrounded by double quotation marks is
+       interpreted as a single argument, regardless of white space
+       contained within.  A quoted string can be embedded in an
+       argument.
+
+    3) A double quotation mark preceded by a backslash is
+       interpreted as a literal double quotation mark.
+
+    4) Backslashes are interpreted literally, unless they
+       immediately precede a double quotation mark.
+
+    5) If backslashes immediately precede a double quotation mark,
+       every pair of backslashes is interpreted as a literal
+       backslash.  If the number of backslashes is odd, the last
+       backslash escapes the next double quotation mark as
+       described in rule 3.
+    """
+
+    # See
+    # http://msdn.microsoft.com/library/en-us/vccelng/htm/progs_12.asp
+    result = []
+    needquote = False
+    for arg in seq:
+        bs_buf = []
+
+        # Add a space to separate this argument from the others
+        if result:
+            result.append(' ')
+
+        needquote = (" " in arg) or ("\t" in arg)
+        if needquote:
+            result.append('"')
+
+        for c in arg:
+            if c == '\\':
+                # Don't know if we need to double yet.
+                bs_buf.append(c)
+            elif c == '"':
+                # Double backspaces.
+                result.append('\\' * len(bs_buf)*2)
+                bs_buf = []
+                result.append('\\"')
+            else:
+                # Normal char
+                if bs_buf:
+                    result.extend(bs_buf)
+                    bs_buf = []
+                result.append(c)
+
+        # Add remaining backspaces, if any.
+        if bs_buf:
+            result.extend(bs_buf)
+
+        if needquote:
+            result.extend(bs_buf)
+            result.append('"')
+
+    return ''.join(result)
+
+
+class Popen(object):
+    def __init__(self, args, bufsize=0, executable=None,
+                 stdin=None, stdout=None, stderr=None,
+                 preexec_fn=None, close_fds=False, shell=False,
+                 cwd=None, env=None, universal_newlines=False,
+                 startupinfo=None, creationflags=0):
+        """Create new Popen instance."""
+        _cleanup()
+
+        if not isinstance(bufsize, (int, long)):
+            raise TypeError("bufsize must be an integer")
+
+        if mswindows:
+            if preexec_fn is not None:
+                raise ValueError("preexec_fn is not supported on Windows "
+                                 "platforms")
+            if close_fds:
+                raise ValueError("close_fds is not supported on Windows "
+                                 "platforms")
+        else:
+            # POSIX
+            if startupinfo is not None:
+                raise ValueError("startupinfo is only supported on Windows "
+                                 "platforms")
+            if creationflags != 0:
+                raise ValueError("creationflags is only supported on Windows "
+                                 "platforms")
+
+        self.stdin = None
+        self.stdout = None
+        self.stderr = None
+        self.pid = None
+        self.returncode = None
+        self.universal_newlines = universal_newlines
+
+        # Input and output objects. The general principle is like
+        # this:
+        #
+        # Parent                   Child
+        # ------                   -----
+        # p2cwrite   ---stdin--->  p2cread
+        # c2pread    <--stdout---  c2pwrite
+        # errread    <--stderr---  errwrite
+        #
+        # On POSIX, the child objects are file descriptors.  On
+        # Windows, these are Windows file handles.  The parent objects
+        # are file descriptors on both platforms.  The parent objects
+        # are None when not using PIPEs. The child objects are None
+        # when not redirecting.
+
+        (p2cread, p2cwrite,
+         c2pread, c2pwrite,
+         errread, errwrite) = self._get_handles(stdin, stdout, stderr)
+
+        self._execute_child(args, executable, preexec_fn, close_fds,
+                            cwd, env, universal_newlines,
+                            startupinfo, creationflags, shell,
+                            p2cread, p2cwrite,
+                            c2pread, c2pwrite,
+                            errread, errwrite)
+
+        if p2cwrite:
+            self.stdin = os.fdopen(p2cwrite, 'wb', bufsize)
+        if c2pread:
+            if universal_newlines:
+                self.stdout = os.fdopen(c2pread, 'rU', bufsize)
+            else:
+                self.stdout = os.fdopen(c2pread, 'rb', bufsize)
+        if errread:
+            if universal_newlines:
+                self.stderr = os.fdopen(errread, 'rU', bufsize)
+            else:
+                self.stderr = os.fdopen(errread, 'rb', bufsize)
+
+        _active.append(self)
+
+
+    def _translate_newlines(self, data):
+        data = data.replace("\r\n", "\n")
+        data = data.replace("\r", "\n")
+        return data
+
+
+    if mswindows:
+        #
+        # Windows methods
+        #
+        def _get_handles(self, stdin, stdout, stderr):
+            """Construct and return tupel with IO objects:
+            p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite
+            """
+            if stdin == None and stdout == None and stderr == None:
+                return (None, None, None, None, None, None)
+
+            p2cread, p2cwrite = None, None
+            c2pread, c2pwrite = None, None
+            errread, errwrite = None, None
+
+            if stdin == None:
+                p2cread = GetStdHandle(STD_INPUT_HANDLE)
+            elif stdin == PIPE:
+                p2cread, p2cwrite = CreatePipe(None, 0)
+                # Detach and turn into fd
+                p2cwrite = p2cwrite.Detach()
+                p2cwrite = msvcrt.open_osfhandle(p2cwrite, 0)
+            elif type(stdin) == types.IntType:
+                p2cread = msvcrt.get_osfhandle(stdin)
+            else:
+                # Assuming file-like object
+                p2cread = msvcrt.get_osfhandle(stdin.fileno())
+            p2cread = self._make_inheritable(p2cread)
+
+            if stdout == None:
+                c2pwrite = GetStdHandle(STD_OUTPUT_HANDLE)
+            elif stdout == PIPE:
+                c2pread, c2pwrite = CreatePipe(None, 0)
+                # Detach and turn into fd
+                c2pread = c2pread.Detach()
+                c2pread = msvcrt.open_osfhandle(c2pread, 0)
+            elif type(stdout) == types.IntType:
+                c2pwrite = msvcrt.get_osfhandle(stdout)
+            else:
+                # Assuming file-like object
+                c2pwrite = msvcrt.get_osfhandle(stdout.fileno())
+            c2pwrite = self._make_inheritable(c2pwrite)
+
+            if stderr == None:
+                errwrite = GetStdHandle(STD_ERROR_HANDLE)
+            elif stderr == PIPE:
+                errread, errwrite = CreatePipe(None, 0)
+                # Detach and turn into fd
+                errread = errread.Detach()
+                errread = msvcrt.open_osfhandle(errread, 0)
+            elif stderr == STDOUT:
+                errwrite = c2pwrite
+            elif type(stderr) == types.IntType:
+                errwrite = msvcrt.get_osfhandle(stderr)
+            else:
+                # Assuming file-like object
+                errwrite = msvcrt.get_osfhandle(stderr.fileno())
+            errwrite = self._make_inheritable(errwrite)
+
+            return (p2cread, p2cwrite,
+                    c2pread, c2pwrite,
+                    errread, errwrite)
+
+
+        def _make_inheritable(self, handle):
+            """Return a duplicate of handle, which is inheritable"""
+            return DuplicateHandle(GetCurrentProcess(), handle,
+                                   GetCurrentProcess(), 0, 1,
+                                   DUPLICATE_SAME_ACCESS)
+
+
+        def _find_w9xpopen(self):
+            """Find and return absolut path to w9xpopen.exe"""
+            w9xpopen = os.path.join(os.path.dirname(GetModuleFileName(0)),
+                                    "w9xpopen.exe")
+            if not os.path.exists(w9xpopen):
+                # Eeek - file-not-found - possibly an embedding
+                # situation - see if we can locate it in sys.exec_prefix
+                w9xpopen = os.path.join(os.path.dirname(sys.exec_prefix),
+                                        "w9xpopen.exe")
+                if not os.path.exists(w9xpopen):
+                    raise RuntimeError("Cannot locate w9xpopen.exe, which is "
+                                       "needed for Popen to work with your "
+                                       "shell or platform.")
+            return w9xpopen
+
+
+        def _execute_child(self, args, executable, preexec_fn, close_fds,
+                           cwd, env, universal_newlines,
+                           startupinfo, creationflags, shell,
+                           p2cread, p2cwrite,
+                           c2pread, c2pwrite,
+                           errread, errwrite):
+            """Execute program (MS Windows version)"""
+
+            if not isinstance(args, types.StringTypes):
+                args = list2cmdline(args)
+
+            # Process startup details
+            if startupinfo == None:
+                startupinfo = STARTUPINFO()
+            if None not in (p2cread, c2pwrite, errwrite):
+                startupinfo.dwFlags |= STARTF_USESTDHANDLES
+                startupinfo.hStdInput = p2cread
+                startupinfo.hStdOutput = c2pwrite
+                startupinfo.hStdError = errwrite
+
+            if shell:
+                startupinfo.dwFlags |= STARTF_USESHOWWINDOW
+                startupinfo.wShowWindow = SW_HIDE
+                comspec = os.environ.get("COMSPEC", "cmd.exe")
+                args = comspec + " /c " + args
+                if (GetVersion() >= 0x80000000L or
+                        os.path.basename(comspec).lower() == "command.com"):
+                    # Win9x, or using command.com on NT. We need to
+                    # use the w9xpopen intermediate program. For more
+                    # information, see KB Q150956
+                    # (http://web.archive.org/web/20011105084002/http://support.microsoft.com/support/kb/articles/Q150/9/56.asp)
+                    w9xpopen = self._find_w9xpopen()
+                    args = '"%s" %s' % (w9xpopen, args)
+                    # Not passing CREATE_NEW_CONSOLE has been known to
+                    # cause random failures on win9x.  Specifically a
+                    # dialog: "Your program accessed mem currently in
+                    # use at xxx" and a hopeful warning about the
+                    # stability of your system.  Cost is Ctrl+C wont
+                    # kill children.
+                    creationflags |= CREATE_NEW_CONSOLE
+
+            # Start the process
+            try:
+                hp, ht, pid, tid = CreateProcess(executable, args,
+                                         # no special security
+                                         None, None,
+                                         # must inherit handles to pass std
+                                         # handles
+                                         1,
+                                         creationflags,
+                                         env,
+                                         cwd,
+                                         startupinfo)
+            except pywintypes.error, e:
+                # Translate pywintypes.error to WindowsError, which is
+                # a subclass of OSError.  FIXME: We should really
+                # translate errno using _sys_errlist (or simliar), but
+                # how can this be done from Python?
+                raise WindowsError(*e.args)
+
+            # Retain the process handle, but close the thread handle
+            self._handle = hp
+            self.pid = pid
+            ht.Close()
+
+            # Child is launched. Close the parent's copy of those pipe
+            # handles that only the child should have open.  You need
+            # to make sure that no handles to the write end of the
+            # output pipe are maintained in this process or else the
+            # pipe will not close when the child process exits and the
+            # ReadFile will hang.
+            if p2cread != None:
+                p2cread.Close()
+            if c2pwrite != None:
+                c2pwrite.Close()
+            if errwrite != None:
+                errwrite.Close()
+
+
+        def poll(self):
+            """Check if child process has terminated.  Returns returncode
+            attribute."""
+            if self.returncode == None:
+                if WaitForSingleObject(self._handle, 0) == WAIT_OBJECT_0:
+                    self.returncode = GetExitCodeProcess(self._handle)
+                    _active.remove(self)
+            return self.returncode
+
+
+        def wait(self):
+            """Wait for child process to terminate.  Returns returncode
+            attribute."""
+            if self.returncode == None:
+                obj = WaitForSingleObject(self._handle, INFINITE)
+                self.returncode = GetExitCodeProcess(self._handle)
+                _active.remove(self)
+            return self.returncode
+
+
+        def _readerthread(self, fh, buffer):
+            buffer.append(fh.read())
+
+
+        def communicate(self, input=None):
+            """Interact with process: Send data to stdin.  Read data from
+            stdout and stderr, until end-of-file is reached.  Wait for
+            process to terminate.  The optional input argument should be a
+            string to be sent to the child process, or None, if no data
+            should be sent to the child.
+
+            communicate() returns a tuple (stdout, stderr)."""
+            stdout = None # Return
+            stderr = None # Return
+
+            if self.stdout:
+                stdout = []
+                stdout_thread = threading.Thread(target=self._readerthread,
+                                                 args=(self.stdout, stdout))
+                stdout_thread.setDaemon(True)
+                stdout_thread.start()
+            if self.stderr:
+                stderr = []
+                stderr_thread = threading.Thread(target=self._readerthread,
+                                                 args=(self.stderr, stderr))
+                stderr_thread.setDaemon(True)
+                stderr_thread.start()
+
+            if self.stdin:
+                if input != None:
+                    self.stdin.write(input)
+                self.stdin.close()
+
+            if self.stdout:
+                stdout_thread.join()
+            if self.stderr:
+                stderr_thread.join()
+
+            # All data exchanged.  Translate lists into strings.
+            if stdout != None:
+                stdout = stdout[0]
+            if stderr != None:
+                stderr = stderr[0]
+
+            # Translate newlines, if requested.  We cannot let the file
+            # object do the translation: It is based on stdio, which is
+            # impossible to combine with select (unless forcing no
+            # buffering).
+            if self.universal_newlines and hasattr(open, 'newlines'):
+                if stdout:
+                    stdout = self._translate_newlines(stdout)
+                if stderr:
+                    stderr = self._translate_newlines(stderr)
+
+            self.wait()
+            return (stdout, stderr)
+
+    else:
+        #
+        # POSIX methods
+        #
+        def _get_handles(self, stdin, stdout, stderr):
+            """Construct and return tupel with IO objects:
+            p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite
+            """
+            p2cread, p2cwrite = None, None
+            c2pread, c2pwrite = None, None
+            errread, errwrite = None, None
+
+            if stdin == None:
+                pass
+            elif stdin == PIPE:
+                p2cread, p2cwrite = os.pipe()
+            elif type(stdin) == types.IntType:
+                p2cread = stdin
+            else:
+                # Assuming file-like object
+                p2cread = stdin.fileno()
+
+            if stdout == None:
+                pass
+            elif stdout == PIPE:
+                c2pread, c2pwrite = os.pipe()
+            elif type(stdout) == types.IntType:
+                c2pwrite = stdout
+            else:
+                # Assuming file-like object
+                c2pwrite = stdout.fileno()
+
+            if stderr == None:
+                pass
+            elif stderr == PIPE:
+                errread, errwrite = os.pipe()
+            elif stderr == STDOUT:
+                errwrite = c2pwrite
+            elif type(stderr) == types.IntType:
+                errwrite = stderr
+            else:
+                # Assuming file-like object
+                errwrite = stderr.fileno()
+
+            return (p2cread, p2cwrite,
+                    c2pread, c2pwrite,
+                    errread, errwrite)
+
+
+        def _set_cloexec_flag(self, fd):
+            try:
+                cloexec_flag = fcntl.FD_CLOEXEC
+            except AttributeError:
+                cloexec_flag = 1
+
+            old = fcntl.fcntl(fd, fcntl.F_GETFD)
+            fcntl.fcntl(fd, fcntl.F_SETFD, old | cloexec_flag)
+
+
+        def _close_fds(self, but):
+            for i in xrange(3, MAXFD):
+                if i == but:
+                    continue
+                try:
+                    os.close(i)
+                except:
+                    pass
+
+
+        def _execute_child(self, args, executable, preexec_fn, close_fds,
+                           cwd, env, universal_newlines,
+                           startupinfo, creationflags, shell,
+                           p2cread, p2cwrite,
+                           c2pread, c2pwrite,
+                           errread, errwrite):
+            """Execute program (POSIX version)"""
+
+            if isinstance(args, types.StringTypes):
+                args = [args]
+
+            if shell:
+                args = ["/bin/sh", "-c"] + args
+
+            if executable == None:
+                executable = args[0]
+
+            # For transferring possible exec failure from child to parent
+            # The first char specifies the exception type: 0 means
+            # OSError, 1 means some other error.
+            errpipe_read, errpipe_write = os.pipe()
+            self._set_cloexec_flag(errpipe_write)
+
+            self.pid = os.fork()
+            if self.pid == 0:
+                # Child
+                try:
+                    # Close parent's pipe ends
+                    if p2cwrite:
+                        os.close(p2cwrite)
+                    if c2pread:
+                        os.close(c2pread)
+                    if errread:
+                        os.close(errread)
+                    os.close(errpipe_read)
+
+                    # Dup fds for child
+                    if p2cread:
+                        os.dup2(p2cread, 0)
+                    if c2pwrite:
+                        os.dup2(c2pwrite, 1)
+                    if errwrite:
+                        os.dup2(errwrite, 2)
+
+                    # Close pipe fds.  Make sure we doesn't close the same
+                    # fd more than once.
+                    if p2cread:
+                        os.close(p2cread)
+                    if c2pwrite and c2pwrite not in (p2cread,):
+                        os.close(c2pwrite)
+                    if errwrite and errwrite not in (p2cread, c2pwrite):
+                        os.close(errwrite)
+
+                    # Close all other fds, if asked for
+                    if close_fds:
+                        self._close_fds(but=errpipe_write)
+
+                    if cwd != None:
+                        os.chdir(cwd)
+
+                    if preexec_fn:
+                        apply(preexec_fn)
+
+                    if env == None:
+                        os.execvp(executable, args)
+                    else:
+                        os.execvpe(executable, args, env)
+
+                except:
+                    exc_type, exc_value, tb = sys.exc_info()
+                    # Save the traceback and attach it to the exception object
+                    exc_lines = traceback.format_exception(exc_type,
+                                                           exc_value,
+                                                           tb)
+                    exc_value.child_traceback = ''.join(exc_lines)
+                    os.write(errpipe_write, pickle.dumps(exc_value))
+
+                # This exitcode won't be reported to applications, so it
+                # really doesn't matter what we return.
+                os._exit(255)
+
+            # Parent
+            os.close(errpipe_write)
+            if p2cread and p2cwrite:
+                os.close(p2cread)
+            if c2pwrite and c2pread:
+                os.close(c2pwrite)
+            if errwrite and errread:
+                os.close(errwrite)
+
+            # Wait for exec to fail or succeed; possibly raising exception
+            data = os.read(errpipe_read, 1048576) # Exceptions limited to 1 MB
+            os.close(errpipe_read)
+            if data != "":
+                os.waitpid(self.pid, 0)
+                child_exception = pickle.loads(data)
+                raise child_exception
+
+
+        def _handle_exitstatus(self, sts):
+            if os.WIFSIGNALED(sts):
+                self.returncode = -os.WTERMSIG(sts)
+            elif os.WIFEXITED(sts):
+                self.returncode = os.WEXITSTATUS(sts)
+            else:
+                # Should never happen
+                raise RuntimeError("Unknown child exit status!")
+
+            _active.remove(self)
+
+
+        def poll(self):
+            """Check if child process has terminated.  Returns returncode
+            attribute."""
+            if self.returncode == None:
+                try:
+                    pid, sts = os.waitpid(self.pid, os.WNOHANG)
+                    if pid == self.pid:
+                        self._handle_exitstatus(sts)
+                except os.error:
+                    pass
+            return self.returncode
+
+
+        def wait(self):
+            """Wait for child process to terminate.  Returns returncode
+            attribute."""
+            if self.returncode == None:
+                pid, sts = os.waitpid(self.pid, 0)
+                self._handle_exitstatus(sts)
+            return self.returncode
+
+
+        def communicate(self, input=None):
+            """Interact with process: Send data to stdin.  Read data from
+            stdout and stderr, until end-of-file is reached.  Wait for
+            process to terminate.  The optional input argument should be a
+            string to be sent to the child process, or None, if no data
+            should be sent to the child.
+
+            communicate() returns a tuple (stdout, stderr)."""
+            read_set = []
+            write_set = []
+            stdout = None # Return
+            stderr = None # Return
+
+            if self.stdin:
+                # Flush stdio buffer.  This might block, if the user has
+                # been writing to .stdin in an uncontrolled fashion.
+                self.stdin.flush()
+                if input:
+                    write_set.append(self.stdin)
+                else:
+                    self.stdin.close()
+            if self.stdout:
+                read_set.append(self.stdout)
+                stdout = []
+            if self.stderr:
+                read_set.append(self.stderr)
+                stderr = []
+
+            while read_set or write_set:
+                rlist, wlist, xlist = select.select(read_set, write_set, [])
+
+                if self.stdin in wlist:
+                    # When select has indicated that the file is writable,
+                    # we can write up to PIPE_BUF bytes without risk
+                    # blocking.  POSIX defines PIPE_BUF >= 512
+                    bytes_written = os.write(self.stdin.fileno(), input[:512])
+                    input = input[bytes_written:]
+                    if not input:
+                        self.stdin.close()
+                        write_set.remove(self.stdin)
+
+                if self.stdout in rlist:
+                    data = os.read(self.stdout.fileno(), 1024)
+                    if data == "":
+                        self.stdout.close()
+                        read_set.remove(self.stdout)
+                    stdout.append(data)
+
+                if self.stderr in rlist:
+                    data = os.read(self.stderr.fileno(), 1024)
+                    if data == "":
+                        self.stderr.close()
+                        read_set.remove(self.stderr)
+                    stderr.append(data)
+
+            # All data exchanged.  Translate lists into strings.
+            if stdout != None:
+                stdout = ''.join(stdout)
+            if stderr != None:
+                stderr = ''.join(stderr)
+
+            # Translate newlines, if requested.  We cannot let the file
+            # object do the translation: It is based on stdio, which is
+            # impossible to combine with select (unless forcing no
+            # buffering).
+            if self.universal_newlines and hasattr(open, 'newlines'):
+                if stdout:
+                    stdout = self._translate_newlines(stdout)
+                if stderr:
+                    stderr = self._translate_newlines(stderr)
+
+            self.wait()
+            return (stdout, stderr)
+
+
+def _demo_posix():
+    #
+    # Example 1: Simple redirection: Get process list
+    #
+    plist = Popen(["ps"], stdout=PIPE).communicate()[0]
+    print "Process list:"
+    print plist
+
+    #
+    # Example 2: Change uid before executing child
+    #
+    if os.getuid() == 0:
+        p = Popen(["id"], preexec_fn=lambda: os.setuid(100))
+        p.wait()
+
+    #
+    # Example 3: Connecting several subprocesses
+    #
+    print "Looking for 'hda'..."
+    p1 = Popen(["dmesg"], stdout=PIPE)
+    p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
+    print repr(p2.communicate()[0])
+
+    #
+    # Example 4: Catch execution error
+    #
+    print
+    print "Trying a weird file..."
+    try:
+        print Popen(["/this/path/does/not/exist"]).communicate()
+    except OSError, e:
+        if e.errno == errno.ENOENT:
+            print "The file didn't exist.  I thought so..."
+            print "Child traceback:"
+            print e.child_traceback
+        else:
+            print "Error", e.errno
+    else:
+        print >>sys.stderr, "Gosh.  No error."
+
+
+def _demo_windows():
+    #
+    # Example 1: Connecting several subprocesses
+    #
+    print "Looking for 'PROMPT' in set output..."
+    p1 = Popen("set", stdout=PIPE, shell=True)
+    p2 = Popen('find "PROMPT"', stdin=p1.stdout, stdout=PIPE)
+    print repr(p2.communicate()[0])
+
+    #
+    # Example 2: Simple execution of program
+    #
+    print "Executing calc..."
+    p = Popen("calc")
+    p.wait()
+
+
+if __name__ == "__main__":
+    if mswindows:
+        _demo_windows()
+    else:
+        _demo_posix()
Index: /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/pyparsing.py
===================================================================
--- /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/pyparsing.py (revision 3)
+++ /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/pyparsing.py (revision 3)
@@ -0,0 +1,2518 @@
+# module pyparsing.py
+#
+# Copyright (c) 2003-2006  Paul T. McGuire
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+#  Todo:
+#  - add pprint() - pretty-print output of defined BNF
+#
+#from __future__ import generators
+
+__doc__ = \
+"""
+pyparsing module - Classes and methods to define and execute parsing grammars
+
+The pyparsing module is an alternative approach to creating and executing simple grammars, 
+vs. the traditional lex/yacc approach, or the use of regular expressions.  With pyparsing, you
+don't need to learn a new syntax for defining grammars or matching expressions - the parsing module 
+provides a library of classes that you use to construct the grammar directly in Python.
+
+Here is a program to parse "Hello, World!" (or any greeting of the form "<salutation>, <addressee>!")::
+
+    from pyparsing import Word, alphas
+    
+    # define grammar of a greeting
+    greet = Word( alphas ) + "," + Word( alphas ) + "!" 
+    
+    hello = "Hello, World!"
+    print hello, "->", greet.parseString( hello )
+
+The program outputs the following::
+
+    Hello, World! -> ['Hello', ',', 'World', '!']
+
+The Python representation of the grammar is quite readable, owing to the self-explanatory 
+class names, and the use of '+', '|' and '^' operators.
+
+The parsed results returned from parseString() can be accessed as a nested list, a dictionary, or an 
+object with named attributes.
+
+The pyparsing module handles some of the problems that are typically vexing when writing text parsers:
+ - extra or missing whitespace (the above program will also handle "Hello,World!", "Hello  ,  World  !", etc.)
+ - quoted strings
+ - embedded comments
+"""
+__version__ = "1.4.1"
+__versionTime__ = "05 February 2006 12:24"
+__author__ = "Paul McGuire <ptmcg@users.sourceforge.net>"
+
+import string
+import copy,sys
+import warnings
+import re
+#~ sys.stderr.write( "testing pyparsing module, version %s, %s\n" % (__version__,__versionTime__ ) )
+
+def _ustr(obj):
+    """Drop-in replacement for str(obj) that tries to be Unicode friendly. It first tries
+       str(obj). If that fails with a UnicodeEncodeError, then it tries unicode(obj). It
+       then < returns the unicode object | encodes it with the default encoding | ... >.
+    """
+    try:
+        # If this works, then _ustr(obj) has the same behaviour as str(obj), so
+        # it won't break any existing code.
+        return str(obj)
+        
+    except UnicodeEncodeError, e:
+        # The Python docs (http://docs.python.org/ref/customization.html#l2h-182)
+        # state that "The return value must be a string object". However, does a
+        # unicode object (being a subclass of basestring) count as a "string
+        # object"?
+        # If so, then return a unicode object:
+        return unicode(obj)
+        # Else encode it... but how? There are many choices... :)
+        # Replace unprintables with escape codes?
+        #return unicode(obj).encode(sys.getdefaultencoding(), 'backslashreplace_errors')
+        # Replace unprintables with question marks?
+        #return unicode(obj).encode(sys.getdefaultencoding(), 'replace')
+        # ...
+
+def _str2dict(strg):
+    return dict( [(c,0) for c in strg] )
+
+alphas     = string.lowercase + string.uppercase
+nums       = string.digits
+hexnums    = nums + "ABCDEFabcdef"
+alphanums  = alphas + nums    
+
+class ParseBaseException(Exception):
+    """base exception class for all parsing runtime exceptions"""
+    __slots__ = ( "loc","msg","pstr","parserElement" )
+    # Performance tuning: we construct a *lot* of these, so keep this
+    # constructor as small and fast as possible        
+    def __init__( self, pstr, loc, msg, elem=None ):
+        self.loc = loc
+        self.msg = msg
+        self.pstr = pstr
+        self.parserElement = elem
+
+    def __getattr__( self, aname ):
+        """supported attributes by name are:
+            - lineno - returns the line number of the exception text
+            - col - returns the column number of the exception text
+            - line - returns the line containing the exception text
+        """
+        if( aname == "lineno" ):
+            return lineno( self.loc, self.pstr )
+        elif( aname in ("col", "column") ):
+            return col( self.loc, self.pstr )
+        elif( aname == "line" ):
+            return line( self.loc, self.pstr )
+        else:
+            raise AttributeError, aname
+
+    def __str__( self ):
+        return "%s (at char %d), (line:%d, col:%d)" % ( self.msg, self.loc, self.lineno, self.column )
+    def __repr__( self ):
+        return _ustr(self)
+    def markInputline( self, markerString = ">!<" ):
+        """Extracts the exception line from the input string, and marks 
+           the location of the exception with a special symbol.
+        """
+        line_str = self.line
+        line_column = self.column - 1
+        if markerString:
+            line_str = "".join( [line_str[:line_column], markerString, line_str[line_column:]])
+        return line_str.strip()
+
+class ParseException(ParseBaseException):
+    """exception thrown when parse expressions don't match class"""
+    """supported attributes by name are:
+        - lineno - returns the line number of the exception text
+        - col - returns the column number of the exception text
+        - line - returns the line containing the exception text
+    """
+    pass
+    
+class ParseFatalException(ParseBaseException):
+    """user-throwable exception thrown when inconsistent parse content
+       is found; stops all parsing immediately"""
+    pass
+    
+class RecursiveGrammarException(Exception):
+    """exception thrown by validate() if the grammar could be improperly recursive"""
+    def __init__( self, parseElementList ):
+        self.parseElementTrace = parseElementList
+    
+    def __str__( self ):
+        return "RecursiveGrammarException: %s" % self.parseElementTrace
+
+class ParseResults(object):
+    """Structured parse results, to provide multiple means of access to the parsed data:
+       - as a list (len(results))
+       - by list index (results[0], results[1], etc.)
+       - by attribute (results.<resultsName>)
+       """
+    __slots__ = ( "__toklist", "__tokdict", "__doinit", "__name", "__parent", "__modal" )
+    def __new__(cls, toklist, name=None, asList=True, modal=True ):
+        if isinstance(toklist, cls):
+            return toklist
+        retobj = object.__new__(cls)
+        retobj.__doinit = True
+        return retobj
+        
+    # Performance tuning: we construct a *lot* of these, so keep this
+    # constructor as small and fast as possible
+    def __init__( self, toklist, name=None, asList=True, modal=True ):
+        if self.__doinit:
+            self.__doinit = False
+            self.__name = None
+            self.__parent = None
+            self.__modal = modal
+            if isinstance(toklist, list):
+                self.__toklist = toklist[:]
+            else:
+                self.__toklist = [toklist]
+            self.__tokdict = dict()
+
+        if name:
+            if not self.__name:
+                self.__modal = self.__modal and modal
+            if isinstance(name,int):
+                name = _ustr(name) # will always return a str, but use _ustr for consistency
+            self.__name = name
+            if not toklist in (None,'',[]):
+                if isinstance(toklist,basestring): 
+                    toklist = [ toklist ]
+                if asList:
+                    if isinstance(toklist,ParseResults):
+                        self[name] = (toklist.copy(),-1)
+                    else:
+                        self[name] = (ParseResults(toklist[0]),-1)
+                    self[name].__name = name
+                else:
+                    try:
+                        self[name] = toklist[0]
+                    except TypeError:
+                        self[name] = toklist
+
+    def __getitem__( self, i ):
+        if isinstance( i, (int,slice) ):
+            return self.__toklist[i]
+        else:
+            if self.__modal:
+                return self.__tokdict[i][-1][0]
+            else:
+                return ParseResults([ v[0] for v in self.__tokdict[i] ])
+
+    def __setitem__( self, k, v ):
+        if isinstance(v,tuple):
+            self.__tokdict[k] = self.__tokdict.get(k,list()) + [v]
+            sub = v[0]
+        else:
+            self.__tokdict[k] = self.__tokdict.get(k,list()) + [(v,0)]
+            sub = v
+        if isinstance(sub,ParseResults):
+            sub.__parent = self
+        
+    def __delitem__( self, i ):
+        del self.__toklist[i]
+
+    def __contains__( self, k ):
+        return self.__tokdict.has_key(k)
+        
+    def __len__( self ): return len( self.__toklist )
+    def __iter__( self ): return iter( self.__toklist )
+    def keys( self ): 
+        """Returns all named result keys."""
+        return self.__tokdict.keys()
+    
+    def items( self ): 
+        """Returns all named result keys and values as a list of tuples."""
+        return [(k,v[-1][0]) for k,v in self.__tokdict.items()]
+    
+    def values( self ): 
+        """Returns all named result values."""
+        return [ v[-1][0] for v in self.__tokdict.values() ]
+
+    def __getattr__( self, name ):
+        if name not in self.__slots__:
+            if self.__tokdict.has_key( name ):
+                if self.__modal:
+                    return self.__tokdict[name][-1][0]
+                else:
+                    return ParseResults([ v[0] for v in self.__tokdict[name] ])
+            else:
+                return ""
+        return None
+
+    def __iadd__( self, other ):
+        if other.__tokdict:
+            offset = len(self.__toklist)
+            addoffset = ( lambda a: (a<0 and offset) or (a+offset) )
+            otherdictitems = [(k,(v[0],addoffset(v[1])) ) for (k,vlist) in other.__tokdict.items() for v in vlist]
+            for k,v in otherdictitems:
+                self[k] = v
+                if isinstance(v[0],ParseResults):
+                    v[0].__parent = self
+        self.__toklist += other.__toklist
+        del other
+        return self
+       
+    def __repr__( self ):
+        return "(%s, %s)" % ( repr( self.__toklist ), repr( self.__tokdict ) )
+
+    def __str__( self ):
+        out = "["
+        sep = ""
+        for i in self.__toklist:
+            if isinstance(i, ParseResults):
+                out += sep + _ustr(i)
+            else:
+                out += sep + repr(i)
+            sep = ", "
+        out += "]"
+        return out
+
+    def _asStringList( self, sep='' ):
+        out = []
+        for item in self.__toklist:
+            if out and sep:
+                out.append(sep)
+            if isinstance( item, ParseResults ):
+                out += item._asStringList()
+            else:
+                out.append( _ustr(item) )
+        return out
+
+    def asList( self ):
+        """Returns the parse results as a nested list of matching tokens, all converted to strings."""
+        out = []
+        for res in self.__toklist:
+            if isinstance(res,ParseResults):
+                out.append( res.asList() )
+            else:
+                out.append( res )
+        return out
+
+    def asDict( self ):
+        """Returns the named parse results as dictionary."""
+        return dict( self.items() )
+
+    def copy( self ):
+        """Returns a new copy of a ParseResults object."""
+        ret = ParseResults( self.__toklist )
+        ret.__tokdict = self.__tokdict.copy()
+        ret.__parent = self.__parent
+        ret.__modal = self.__modal
+        ret.__name = self.__name
+        return ret
+        
+    def asXML( self, doctag=None, namedItemsOnly=False, indent="", formatted=True ):
+        """Returns the parse results as XML. Tags are created for tokens and lists that have defined results names."""
+        nl = "\n"
+        out = []
+        namedItems = dict( [ (v[1],k) for (k,vlist) in self.__tokdict.items() for v in vlist ] )
+        nextLevelIndent = indent + "  "
+        
+        # collapse out indents if formatting is not desired
+        if not formatted:
+            indent = ""
+            nextLevelIndent = ""
+            nl = ""
+            
+        selfTag = None
+        if doctag is not None:
+            selfTag = doctag
+        else:
+            if self.__name:
+                selfTag = self.__name
+        
+        if not selfTag:
+            if namedItemsOnly:
+                return ""
+            else:
+                selfTag = "ITEM"
+                
+        out += [ nl, indent, "<", selfTag, ">" ]
+        
+        worklist = self.__toklist
+        for i,res in enumerate(worklist):
+            if isinstance(res,ParseResults):
+                if i in namedItems:
+                    out += [ res.asXML(namedItems[i], namedItemsOnly and doctag is None, nextLevelIndent,formatted)]
+                else:
+                    out += [ res.asXML(None, namedItemsOnly and doctag is None, nextLevelIndent,formatted)]
+            else:
+                # individual token, see if there is a name for it
+                resTag = None
+                if i in namedItems:
+                    resTag = namedItems[i]
+                if not resTag:
+                    if namedItemsOnly:
+                        continue
+                    else:
+                        resTag = "ITEM"
+                out += [ nl, nextLevelIndent, "<", resTag, ">", _ustr(res), "</", resTag, ">" ]
+        
+        out += [ nl, indent, "</", selfTag, ">" ]
+        return "".join(out)
+
+
+    def __lookup(self,sub):
+        for k,vlist in self.__tokdict.items():
+            for v,loc in vlist:
+                if sub is v:
+                    return k
+        return None
+            
+    def getName(self):
+        """Returns the results name for this token expression."""
+        if self.__name:
+            return self.__name
+        elif self.__parent:
+            par = self.__parent
+            if par:
+                return par.__lookup(self)
+            else:
+                return None
+        elif (len(self) == 1 and 
+               len(self.__tokdict) == 1 and
+               self.__tokdict.values()[0][0][1] in (0,-1)):
+            return self.__tokdict.keys()[0]
+        else:
+            return None
+
+def col (loc,strg):
+    """Returns current column within a string, counting newlines as line separators.
+   The first column is number 1.
+   """
+    return loc - strg.rfind("\n", 0, loc)
+
+def lineno(loc,strg):
+    """Returns current line number within a string, counting newlines as line separators.
+   The first line is number 1.
+   """
+    return strg.count("\n",0,loc) + 1
+
+def line( loc, strg ):
+    """Returns the line of text containing loc within a string, counting newlines as line separators.
+       """
+    lastCR = strg.rfind("\n", 0, loc)
+    nextCR = strg.find("\n", loc)
+    if nextCR > 0:
+        return strg[lastCR+1:nextCR]
+    else:
+        return strg[lastCR+1:]
+
+def _defaultStartDebugAction( instring, loc, expr ):
+    print "Match",expr,"at loc",loc,"(%d,%d)" % ( lineno(loc,instring), col(loc,instring) )
+
+def _defaultSuccessDebugAction( instring, startloc, endloc, expr, toks ):
+    print "Matched",expr,"->",toks.asList()
+    
+def _defaultExceptionDebugAction( instring, loc, expr, exc ):
+    print "Exception raised:", exc
+
+def nullDebugAction(*args):
+    """'Do-nothing' debug action, to suppress debugging output during parsing."""
+    pass
+
+class ParserElement(object):
+    """Abstract base level parser element class."""
+    DEFAULT_WHITE_CHARS = " \n\t\r"
+
+    def setDefaultWhitespaceChars( chars ):
+        """Overrides the default whitespace chars
+        """
+        ParserElement.DEFAULT_WHITE_CHARS = chars
+    setDefaultWhitespaceChars = staticmethod(setDefaultWhitespaceChars)
+    
+    def __init__( self, savelist=False ):
+        self.parseAction = None
+        #~ self.name = "<unknown>"  # don't define self.name, let subclasses try/except upcall
+        self.strRepr = None
+        self.resultsName = None
+        self.saveAsList = savelist
+        self.skipWhitespace = True
+        self.whiteChars = ParserElement.DEFAULT_WHITE_CHARS
+        self.mayReturnEmpty = False
+        self.keepTabs = False
+        self.ignoreExprs = []
+        self.debug = False
+        self.streamlined = False
+        self.mayIndexError = True
+        self.errmsg = ""
+        self.modalResults = True
+        self.debugActions = ( None, None, None )
+        self.re = None
+
+    def copy( self ):
+        """Make a copy of this ParserElement.  Useful for defining different parse actions
+           for the same parsing pattern, using copies of the original parse element."""
+        cpy = copy.copy( self )
+        cpy.whiteChars = ParserElement.DEFAULT_WHITE_CHARS
+        return cpy
+
+    def setName( self, name ):
+        """Define name for this expression, for use in debugging."""
+        self.name = name
+        self.errmsg = "Expected " + self.name
+        return self
+
+    def setResultsName( self, name, listAllMatches=False ):
+        """Define name for referencing matching tokens as a nested attribute 
+           of the returned parse results.
+           NOTE: this returns a *copy* of the original ParserElement object;
+           this is so that the client can define a basic element, such as an
+           integer, and reference it in multiple places with different names.
+        """
+        newself = self.copy()
+        newself.resultsName = name
+        newself.modalResults = not listAllMatches
+        return newself
+
+    def setParseAction( self, fn ):
+        """Define action to perform when successfully matching parse element definition.
+           Parse action fn is a callable method with the arguments (s, loc, toks) where:
+            - s   = the original string being parsed
+            - loc = the location of the matching substring
+            - toks = a list of the matched tokens, packaged as a ParseResults object
+           If the function fn modifies the tokens, it can return them as the return
+           value from fn, and the modified list of tokens will replace the original.
+           Otherwise, fn does not need to return any value.
+        """
+        self.parseAction = fn
+        return self
+
+    def skipIgnorables( self, instring, loc ):
+        exprsFound = True
+        while exprsFound:
+            exprsFound = False
+            for e in self.ignoreExprs:
+                try:
+                    while 1:
+                        loc,dummy = e.parse( instring, loc )
+                        exprsFound = True
+                except ParseException:
+                    pass
+        return loc
+
+    def preParse( self, instring, loc ):
+        if self.ignoreExprs:
+            loc = self.skipIgnorables( instring, loc )
+        
+        if self.skipWhitespace:
+            wt = self.whiteChars
+            instrlen = len(instring)
+            while loc < instrlen and instring[loc] in wt:
+                loc += 1
+                
+        return loc
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        return loc, []
+
+    def postParse( self, instring, loc, tokenlist ):
+        return tokenlist
+
+    #~ @profile
+    def parse( self, instring, loc, doActions=True, callPreParse=True ):
+        debugging = ( self.debug ) #and doActions )
+
+        if debugging:
+            #~ print "Match",self,"at loc",loc,"(%d,%d)" % ( lineno(loc,instring), col(loc,instring) )
+            if (self.debugActions[0] ):
+                self.debugActions[0]( instring, loc, self )
+            if callPreParse:
+                loc = self.preParse( instring, loc )
+            tokensStart = loc
+            try:
+                try:
+                    loc,tokens = self.parseImpl( instring, loc, doActions )
+                except IndexError:
+                    raise ParseException, ( instring, len(instring), self.errmsg, self )
+            except ParseException, err:
+                #~ print "Exception raised:", err
+                if (self.debugActions[2] ):
+                    self.debugActions[2]( instring, tokensStart, self, err )
+                raise
+        else:
+            if callPreParse:
+                loc = self.preParse( instring, loc )
+            tokensStart = loc
+            if self.mayIndexError or loc >= len(instring):
+                try:
+                    loc,tokens = self.parseImpl( instring, loc, doActions )
+                except IndexError:
+                    raise ParseException, ( instring, len(instring), self.errmsg, self )
+            else:
+                loc,tokens = self.parseImpl( instring, loc, doActions )
+        
+        tokens = self.postParse( instring, loc, tokens )
+
+        retTokens = ParseResults( tokens, self.resultsName, asList=self.saveAsList, modal=self.modalResults )
+        if self.parseAction and doActions:
+            if debugging:
+                try:
+                    tokens = self.parseAction( instring, tokensStart, retTokens )
+                    if tokens is not None:
+                        if isinstance(tokens,tuple):
+                            tokens = tokens[1]
+                        retTokens = ParseResults( tokens, 
+                                                  self.resultsName, 
+                                                  asList=self.saveAsList and isinstance(tokens,(ParseResults,list)), 
+                                                  modal=self.modalResults )
+                except ParseException, err:
+                    #~ print "Exception raised in user parse action:", err
+                    if (self.debugActions[2] ):
+                        self.debugActions[2]( instring, tokensStart, self, err )
+                    raise
+            else:
+                tokens = self.parseAction( instring, tokensStart, retTokens )
+                if tokens is not None:
+                    if isinstance(tokens,tuple):
+                        tokens = tokens[1]
+                    retTokens = ParseResults( tokens, 
+                                              self.resultsName, 
+                                              asList=self.saveAsList and isinstance(tokens,(ParseResults,list)), 
+                                              modal=self.modalResults )
+
+        if debugging:
+            #~ print "Matched",self,"->",retTokens.asList()
+            if (self.debugActions[1] ):
+                self.debugActions[1]( instring, tokensStart, loc, self, retTokens )
+
+        return loc, retTokens
+
+    def tryParse( self, instring, loc ):
+        return self.parse( instring, loc, doActions=False )[0]
+
+    def parseString( self, instring ):
+        """Execute the parse expression with the given string.
+           This is the main interface to the client code, once the complete 
+           expression has been built.
+        """
+        if not self.streamlined:
+            self.streamline()
+            self.saveAsList = True
+        for e in self.ignoreExprs:
+            e.streamline()
+        if self.keepTabs:
+            loc, tokens = self.parse( instring, 0 )
+        else:
+            loc, tokens = self.parse( instring.expandtabs(), 0 )
+        return tokens
+
+    def scanString( self, instring ):
+        """Scan the input string for expression matches.  Each match will return the matching tokens, start location, and end location."""
+        if not self.streamlined:
+            self.streamline()
+        for e in self.ignoreExprs:
+            e.streamline()
+        
+        if not self.keepTabs:
+            instring = instring.expandtabs()
+        instrlen = len(instring)
+        loc = 0
+        preparseFn = self.preParse
+        parseFn = self.parse
+        while loc < instrlen:
+            try:
+                loc = preparseFn( instring, loc )
+                nextLoc,tokens = parseFn( instring, loc, callPreParse=False )
+            except ParseException:
+                loc += 1
+            else:
+                yield tokens, loc, nextLoc
+                loc = nextLoc
+        
+    def transformString( self, instring ):
+        """Extension to scanString, to modify matching text with modified tokens that may
+           be returned from a parse action.  To use transformString, define a grammar and 
+           attach a parse action to it that modifies the returned token list.  
+           Invoking transformString() on a target string will then scan for matches, 
+           and replace the matched text patterns according to the logic in the parse 
+           action.  transformString() returns the resulting transformed string."""
+        out = []
+        lastE = 0
+        # force preservation of <TAB>s, to minimize unwanted transformation of string, and to
+        # keep string locs straight between transformString and scanString
+        self.keepTabs = True
+        for t,s,e in self.scanString( instring ):
+            out.append( instring[lastE:s] )
+            if t:
+                if isinstance(t,ParseResults):
+                    out += t.asList()
+                elif isinstance(t,list):
+                    out += t
+                else:
+                    out.append(t)
+            lastE = e
+        out.append(instring[lastE:])
+        return "".join(out)
+
+    def searchString( self, instring ):
+        """Another extension to scanString, simplifying the access to the tokens found
+           to match the given parse expression.
+        """
+        return [ t[0] for t,s,e in self.scanString( instring ) ]
+            
+    def __add__(self, other ):
+        """Implementation of + operator - returns And"""
+        if isinstance( other, basestring ):
+            other = Literal( other )
+        if not isinstance( other, ParserElement ):
+            warnings.warn("Cannot add element of type %s to ParserElement" % type(other),
+                    SyntaxWarning, stacklevel=2)
+        return And( [ self, other ] )
+
+    def __radd__(self, other ):
+        """Implementation of += operator"""
+        if isinstance( other, basestring ):
+            other = Literal( other )
+        if not isinstance( other, ParserElement ):
+            warnings.warn("Cannot add element of type %s to ParserElement" % type(other),
+                    SyntaxWarning, stacklevel=2)
+        return other + self
+
+    def __or__(self, other ):
+        """Implementation of | operator - returns MatchFirst"""
+        if isinstance( other, basestring ):
+            other = Literal( other )
+        if not isinstance( other, ParserElement ):
+            warnings.warn("Cannot add element of type %s to ParserElement" % type(other),
+                    SyntaxWarning, stacklevel=2)
+        return MatchFirst( [ self, other ] )
+
+    def __ror__(self, other ):
+        """Implementation of |= operator"""
+        if isinstance( other, basestring ):
+            other = Literal( other )
+        if not isinstance( other, ParserElement ):
+            warnings.warn("Cannot add element of type %s to ParserElement" % type(other),
+                    SyntaxWarning, stacklevel=2)
+        return other | self
+
+    def __xor__(self, other ):
+        """Implementation of ^ operator - returns Or"""
+        if isinstance( other, basestring ):
+            other = Literal( other )
+        if not isinstance( other, ParserElement ):
+            warnings.warn("Cannot add element of type %s to ParserElement" % type(other),
+                    SyntaxWarning, stacklevel=2)
+        return Or( [ self, other ] )
+
+    def __rxor__(self, other ):
+        """Implementation of ^= operator"""
+        if isinstance( other, basestring ):
+            other = Literal( other )
+        if not isinstance( other, ParserElement ):
+            warnings.warn("Cannot add element of type %s to ParserElement" % type(other),
+                    SyntaxWarning, stacklevel=2)
+        return other ^ self
+
+    def __and__(self, other ):
+        """Implementation of & operator - returns Each"""
+        if isinstance( other, basestring ):
+            other = Literal( other )
+        if not isinstance( other, ParserElement ):
+            warnings.warn("Cannot add element of type %s to ParserElement" % type(other),
+                    SyntaxWarning, stacklevel=2)
+        return Each( [ self, other ] )
+
+    def __rand__(self, other ):
+        """Implementation of right-& operator"""
+        if isinstance( other, basestring ):
+            other = Literal( other )
+        if not isinstance( other, ParserElement ):
+            warnings.warn("Cannot add element of type %s to ParserElement" % type(other),
+                    SyntaxWarning, stacklevel=2)
+        return other & self
+
+    def __invert__( self ):
+        """Implementation of ~ operator - returns NotAny"""
+        return NotAny( self )
+
+    def suppress( self ):
+        """Suppresses the output of this ParserElement; useful to keep punctuation from
+           cluttering up returned output.
+        """
+        return Suppress( self )
+
+    def leaveWhitespace( self ):
+        """Disables the skipping of whitespace before matching the characters in the 
+           ParserElement's defined pattern.  This is normally only used internally by
+           the pyparsing module, but may be needed in some whitespace-sensitive grammars.
+        """
+        self.skipWhitespace = False
+        return self
+
+    def setWhitespaceChars( self, chars ):
+        """Overrides the default whitespace chars
+        """
+        self.skipWhitespace = True
+        self.whiteChars = chars
+        
+    def parseWithTabs( self ):
+        """Overrides default behavior to expand <TAB>s to spaces before parsing the input string.
+           Must be called before parseString when the input grammar contains elements that 
+           match <TAB> characters."""
+        self.keepTabs = True
+        return self
+        
+    def ignore( self, other ):
+        """Define expression to be ignored (e.g., comments) while doing pattern 
+           matching; may be called repeatedly, to define multiple comment or other
+           ignorable patterns.
+        """
+        if isinstance( other, Suppress ):
+            if other not in self.ignoreExprs:
+                self.ignoreExprs.append( other )
+        else:
+            self.ignoreExprs.append( Suppress( other ) )
+        return self
+
+    def setDebugActions( self, startAction, successAction, exceptionAction ):
+        """Enable display of debugging messages while doing pattern matching."""
+        self.debugActions = (startAction or _defaultStartDebugAction, 
+                             successAction or _defaultSuccessDebugAction, 
+                             exceptionAction or _defaultExceptionDebugAction)
+        self.debug = True
+        return self
+
+    def setDebug( self, flag=True ):
+        """Enable display of debugging messages while doing pattern matching."""
+        if flag:
+            self.setDebugActions( _defaultStartDebugAction, _defaultSuccessDebugAction, _defaultExceptionDebugAction )
+        else:
+            self.debug = False
+        return self
+
+    def __str__( self ):
+        return self.name
+
+    def __repr__( self ):
+        return _ustr(self)
+        
+    def streamline( self ):
+        self.streamlined = True
+        self.strRepr = None
+        return self
+        
+    def checkRecursion( self, parseElementList ):
+        pass
+        
+    def validate( self, validateTrace=[] ):
+        """Check defined expressions for valid structure, check for infinite recursive definitions."""
+        self.checkRecursion( [] )
+
+    def parseFile( self, file_or_filename ):
+        """Execute the parse expression on the given file or filename.
+           If a filename is specified (instead of a file object),
+           the entire file is opened, read, and closed before parsing.
+        """
+        try:
+            file_contents = file_or_filename.read()
+        except AttributeError:
+            f = open(file_or_filename, "rb")
+            file_contents = f.read()
+            f.close()
+        return self.parseString(file_contents)
+
+
+class Token(ParserElement):
+    """Abstract ParserElement subclass, for defining atomic matching patterns."""
+    def __init__( self ):
+        super(Token,self).__init__( savelist=False )
+        self.myException = ParseException("",0,"",self)
+
+    def setName(self, name):
+        s = super(Token,self).setName(name)
+        self.errmsg = "Expected " + self.name
+        s.myException.msg = self.errmsg
+        return s
+
+
+class Empty(Token):
+    """An empty token, will always match."""
+    def __init__( self ):
+        super(Empty,self).__init__()
+        self.name = "Empty"
+        self.mayReturnEmpty = True
+        self.mayIndexError = False
+
+
+class NoMatch(Token):
+    """A token that will never match."""
+    def __init__( self ):
+        super(NoMatch,self).__init__()
+        self.name = "NoMatch"
+        self.mayReturnEmpty = True
+        self.mayIndexError = False
+        self.errmsg = "Unmatchable token"
+        self.myException.msg = self.errmsg
+        
+    def parseImpl( self, instring, loc, doActions=True ):
+        exc = self.myException
+        exc.loc = loc
+        exc.pstr = instring
+        raise exc
+
+
+class Literal(Token):
+    """Token to exactly match a specified string."""
+    def __init__( self, matchString ):
+        super(Literal,self).__init__()
+        self.match = matchString
+        self.matchLen = len(matchString)
+        try:
+            self.firstMatchChar = matchString[0]
+        except IndexError:
+            warnings.warn("null string passed to Literal; use Empty() instead", 
+                            SyntaxWarning, stacklevel=2)
+            self.__class__ = Empty
+        self.name = '"%s"' % self.match
+        self.errmsg = "Expected " + self.name
+        self.mayReturnEmpty = False
+        self.myException.msg = self.errmsg
+        self.mayIndexError = False
+
+    # Performance tuning: this routine gets called a *lot*
+    # if this is a single character match string  and the first character matches,
+    # short-circuit as quickly as possible, and avoid calling startswith
+    #~ @profile
+    def parseImpl( self, instring, loc, doActions=True ):
+        if (instring[loc] == self.firstMatchChar and
+            (self.matchLen==1 or instring.startswith(self.match,loc)) ):
+            return loc+self.matchLen, self.match
+        #~ raise ParseException, ( instring, loc, self.errmsg )
+        exc = self.myException
+        exc.loc = loc
+        exc.pstr = instring
+        raise exc
+
+class Keyword(Token):
+    """Token to exactly match a specified string as a keyword, that is, it must be 
+       immediately followed by a non-keyword character.  Compare with Literal::
+         Literal("if") will match the leading 'if' in 'ifAndOnlyIf'.
+         Keyword("if") will not; it will only match the leading 'if in 'if x=1', or 'if(y==2)'
+       Accepts two optional constructor arguments in addition to the keyword string:
+       identChars is a string of characters that would be valid identifier characters,
+       defaulting to all alphanumerics + "_" and "$"; caseless allows case-insensitive
+       matching, default is False.
+    """
+    DEFAULT_KEYWORD_CHARS = alphanums+"_$"
+    
+    def __init__( self, matchString, identChars=DEFAULT_KEYWORD_CHARS, caseless=False ):
+        super(Keyword,self).__init__()
+        self.match = matchString
+        self.matchLen = len(matchString)
+        try:
+            self.firstMatchChar = matchString[0]
+        except IndexError:
+            warnings.warn("null string passed to Keyword; use Empty() instead", 
+                            SyntaxWarning, stacklevel=2)
+        self.name = '"%s"' % self.match
+        self.errmsg = "Expected " + self.name
+        self.mayReturnEmpty = False
+        self.myException.msg = self.errmsg
+        self.mayIndexError = False
+        self.caseless = caseless
+        if caseless:
+            self.caselessmatch = matchString.upper()
+            identChars = identChars.upper()
+        self.identChars = _str2dict(identChars)
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if self.caseless:
+            if ( (instring[ loc:loc+self.matchLen ].upper() == self.caselessmatch) and
+                 (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen].upper() not in self.identChars) and
+                 (loc == 0 or instring[loc-1].upper() not in self.identChars) ):
+                return loc+self.matchLen, self.match
+        else:
+            if (instring[loc] == self.firstMatchChar and
+                (self.matchLen==1 or instring.startswith(self.match,loc)) and
+                (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen] not in self.identChars) and
+                (loc == 0 or instring[loc-1] not in self.identChars) ):
+                return loc+self.matchLen, self.match
+        #~ raise ParseException, ( instring, loc, self.errmsg )
+        exc = self.myException
+        exc.loc = loc
+        exc.pstr = instring
+        raise exc
+        
+    def copy(self):
+        c = super(Keyword,self).copy()
+        c.identChars = Keyword.DEFAULT_KEYWORD_CHARS
+        return c
+        
+    def setDefaultKeywordChars( chars ):
+        """Overrides the default Keyword chars
+        """
+        Keyword.DEFAULT_KEYWORD_CHARS = chars
+    setDefaultKeywordChars = staticmethod(setDefaultKeywordChars)        
+
+
+class CaselessLiteral(Literal):
+    """Token to match a specified string, ignoring case of letters.
+       Note: the matched results will always be in the case of the given
+       match string, NOT the case of the input text.
+    """
+    def __init__( self, matchString ):
+        super(CaselessLiteral,self).__init__( matchString.upper() )
+        # Preserve the defining literal.
+        self.returnString = matchString
+        self.name = "'%s'" % self.returnString
+        self.errmsg = "Expected " + self.name
+        self.myException.msg = self.errmsg
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if instring[ loc:loc+self.matchLen ].upper() == self.match:
+            return loc+self.matchLen, self.returnString
+        #~ raise ParseException, ( instring, loc, self.errmsg )
+        exc = self.myException
+        exc.loc = loc
+        exc.pstr = instring
+        raise exc
+
+class CaselessKeyword(Keyword):
+    def __init__( self, matchString, identChars=Keyword.DEFAULT_KEYWORD_CHARS ):
+        super(CaselessKeyword,self).__init__( matchString, identCars, caseless=True )
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if ( (instring[ loc:loc+self.matchLen ].upper() == self.caselessmatch) and
+             (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen].upper() not in self.identChars) ):
+            return loc+self.matchLen, self.match
+        #~ raise ParseException, ( instring, loc, self.errmsg )
+        exc = self.myException
+        exc.loc = loc
+        exc.pstr = instring
+        raise exc
+
+class Word(Token):
+    """Token for matching words composed of allowed character sets.
+       Defined with string containing all allowed initial characters,
+       an optional string containing allowed body characters (if omitted,
+       defaults to the initial character set), and an optional minimum,
+       maximum, and/or exact length.
+    """
+    def __init__( self, initChars, bodyChars=None, min=1, max=0, exact=0 ):
+        super(Word,self).__init__()
+        self.initCharsOrig = initChars
+        self.initChars = _str2dict(initChars)
+        if bodyChars :
+            self.bodyCharsOrig = bodyChars
+            self.bodyChars = _str2dict(bodyChars)
+        else:
+            self.bodyCharsOrig = initChars
+            self.bodyChars = _str2dict(initChars)
+            
+        self.maxSpecified = max > 0
+
+        self.minLen = min
+
+        if max > 0:
+            self.maxLen = max
+        else:
+            self.maxLen = sys.maxint
+
+        if exact > 0:
+            self.maxLen = exact
+            self.minLen = exact
+
+        self.name = _ustr(self)
+        self.errmsg = "Expected " + self.name
+        self.myException.msg = self.errmsg
+        self.mayIndexError = False
+        
+        if ' ' not in self.initCharsOrig+self.bodyCharsOrig and (min==1 and max==0 and exact==0):
+            if self.bodyCharsOrig == self.initCharsOrig:
+                self.reString = "[%s]+" % _escapeRegexRangeChars(self.initCharsOrig)
+            elif len(self.bodyCharsOrig) == 1:
+                self.reString = "%s[%s]*" % \
+                                      (re.escape(self.initCharsOrig),
+                                      _escapeRegexRangeChars(self.bodyCharsOrig),)
+            else:
+                self.reString = "[%s][%s]*" % \
+                                      (_escapeRegexRangeChars(self.initCharsOrig),
+                                      _escapeRegexRangeChars(self.bodyCharsOrig),)
+            try:
+                self.re = re.compile( self.reString )
+            except:
+                self.re = None
+        
+    def parseImpl( self, instring, loc, doActions=True ):
+        if self.re:
+            result = self.re.match(instring,loc)
+            if not result:
+                exc = self.myException
+                exc.loc = loc
+                exc.pstr = instring
+                raise exc
+            
+            loc = result.end()
+            return loc,result.group()
+        
+        if not(instring[ loc ] in self.initChars):
+            #~ raise ParseException, ( instring, loc, self.errmsg )
+            exc = self.myException
+            exc.loc = loc
+            exc.pstr = instring
+            raise exc
+        start = loc
+        loc += 1
+        instrlen = len(instring)
+        bodychars = self.bodyChars
+        maxloc = start + self.maxLen
+        maxloc = min( maxloc, instrlen )
+        while loc < maxloc and instring[loc] in bodychars:
+            loc += 1
+            
+        throwException = False
+        if loc - start < self.minLen:
+            throwException = True
+        if self.maxSpecified and loc < instrlen and instring[loc] in bodychars:
+            throwException = True
+
+        if throwException:
+            #~ raise ParseException, ( instring, loc, self.errmsg )
+            exc = self.myException
+            exc.loc = loc
+            exc.pstr = instring
+            raise exc
+
+        return loc, instring[start:loc]
+
+    def __str__( self ):
+        try:
+            return super(Word,self).__str__()
+        except:
+            pass
+
+            
+        if self.strRepr is None:
+            
+            def charsAsStr(s):
+                if len(s)>4:
+                    return s[:4]+"..."
+                else:
+                    return s
+            
+            if ( self.initCharsOrig != self.bodyCharsOrig ):
+                self.strRepr = "W:(%s,%s)" % ( charsAsStr(self.initCharsOrig), charsAsStr(self.bodyCharsOrig) )
+            else:
+                self.strRepr = "W:(%s)" % charsAsStr(self.initCharsOrig)
+
+        return self.strRepr
+
+
+class Regex(Token):
+    """Token for matching strings that match a given regular expression.
+       Defined with string specifying the regular expression in a form recognized by the inbuilt Python re module.
+    """
+    def __init__( self, pattern, flags=0):
+        """The parameters pattern and flags are passed to the re.compile() function as-is. See the Python re module for an explanation of the acceptable patterns and flags."""
+        super(Regex,self).__init__()
+        
+        if len(pattern) == 0:
+            warnings.warn("null string passed to Regex; use Empty() instead", 
+                    SyntaxWarning, stacklevel=2)
+    
+        self.pattern = pattern
+        self.flags = flags
+        
+        try:
+            self.re = re.compile(self.pattern, self.flags)
+            self.reString = self.pattern
+        except Exception,e:
+            warnings.warn("invalid pattern (%s) passed to Regex" % pattern, 
+                SyntaxWarning, stacklevel=2)
+            raise
+
+        self.name = _ustr(self)
+        self.errmsg = "Expected " + self.name
+        self.myException.msg = self.errmsg
+        self.mayIndexError = False
+        self.mayReturnEmpty = True
+    
+    def parseImpl( self, instring, loc, doActions=True ):
+        result = self.re.match(instring,loc)
+        if not result:
+            exc = self.myException
+            exc.loc = loc
+            exc.pstr = instring
+            raise exc
+        
+        loc = result.end()
+        d = result.groupdict()
+        ret = ParseResults(result.group())
+        if d:
+            for k in d.keys():
+                ret[k] = d[k]
+        return loc,ret
+    
+    def __str__( self ):
+        try:
+            return super(Regex,self).__str__()
+        except:
+            pass
+        
+        if self.strRepr is None:
+            self.strRepr = "Re:(%s)" % repr(self.pattern)
+        
+        return self.strRepr
+
+
+class QuotedString(Token):
+    """Token for matching strings that are delimited by quoting characters.
+    """
+    def __init__( self, quoteChar, escChar=None, escQuote=None, multiline=False, unquoteResults=True):
+        """
+           Defined with the following parameters:
+           - quoteCharacter - string of one or more characters defining the quote delimiting string
+           - escapeCharacter - character to escape quotes, typically backslash (default=None)
+           - escapedQuote - special quote sequence to escape an embedded quote string (such as SQL's "" to escape and embedded ") (default=None)
+           - multiline - boolean indicating whether quotes can span multiple lines (default=False)
+           - unquoteResults - boolean indicating whether the matched text should be unquoted (default=True)
+        """
+        super(QuotedString,self).__init__()
+        
+        # remove white space from quote char - wont work anyway
+        quoteChar = quoteChar.strip()
+        if len(quoteChar) == 0:
+            warnings.warn("quoteChar cannot be the empty string",SyntaxWarning,stacklevel=2)
+            raise SyntaxError()
+        
+        self.quoteChar = quoteChar
+        self.quoteCharLen = len(quoteChar)
+        self.firstQuoteChar = quoteChar[0]
+        self.escChar = escChar
+        self.escQuote = escQuote
+        self.unquoteResults = unquoteResults
+        
+        if multiline:
+            self.flags = re.MULTILINE | re.DOTALL
+            self.pattern = r'%s([^%s%s]' % \
+                ( re.escape(self.quoteChar),
+                  _escapeRegexRangeChars(self.quoteChar[0]),
+                  (escChar is not None and _escapeRegexRangeChars(escChar) or '') )
+        else:
+            self.flags = 0
+            self.pattern = r'%s([^%s\n\r%s]' % \
+                ( re.escape(self.quoteChar),
+                  _escapeRegexRangeChars(self.quoteChar[0]),
+                  (escChar is not None and _escapeRegexRangeChars(escChar) or '') )
+        if len(self.quoteChar) > 1:
+            self.pattern += (
+                '|(' + ')|('.join(["%s[^%s]" % (re.escape(self.quoteChar[:i]),
+                                               _escapeRegexRangeChars(self.quoteChar[i])) 
+                                    for i in range(len(self.quoteChar)-1,0,-1)]) + ')'
+                )
+        if escQuote:
+            self.pattern += (r'|(%s)' % re.escape(escQuote))
+        if escChar:
+            self.pattern += (r'|(%s.)' % re.escape(escChar))
+            self.escCharReplacePattern = re.escape(self.escChar)+"(.)"
+        self.pattern += (r')*%s' % re.escape(self.quoteChar))
+        
+        try:
+            self.re = re.compile(self.pattern, self.flags)
+            self.reString = self.pattern
+        except Exception,e:
+            warnings.warn("invalid pattern (%s) passed to Regex" % self.pattern, 
+                SyntaxWarning, stacklevel=2)
+            raise
+
+        self.name = _ustr(self)
+        self.errmsg = "Expected " + self.name
+        self.myException.msg = self.errmsg
+        self.mayIndexError = False
+        self.mayReturnEmpty = True
+    
+    def parseImpl( self, instring, loc, doActions=True ):
+        result = instring[loc] == self.firstQuoteChar and self.re.match(instring,loc) or None
+        if not result:
+            exc = self.myException
+            exc.loc = loc
+            exc.pstr = instring
+            raise exc
+        
+        loc = result.end()
+        ret = result.group()
+        
+        if self.unquoteResults:
+            
+            # strip off quotes
+            ret = ret[self.quoteCharLen:-self.quoteCharLen]
+                
+            if isinstance(ret,basestring):
+                # replace escaped characters
+                if self.escChar:
+                    ret = re.sub(self.escCharReplacePattern,"\g<1>",ret)
+
+                # replace escaped quotes
+                if self.escQuote:
+                    ret = ret.replace(self.escQuote, self.quoteChar)
+
+        return loc, ret
+    
+    def __str__( self ):
+        try:
+            return super(QuotedString,self).__str__()
+        except:
+            pass
+        
+        if self.strRepr is None:
+            self.strRepr = "quoted string, delimited by %s characters" % self.quoteChar
+        
+        return self.strRepr
+
+
+class CharsNotIn(Token):
+    """Token for matching words composed of characters *not* in a given set.
+       Defined with string containing all disallowed characters, and an optional 
+       minimum, maximum, and/or exact length.
+    """
+    def __init__( self, notChars, min=1, max=0, exact=0 ):
+        super(CharsNotIn,self).__init__()
+        self.skipWhitespace = False
+        self.notChars = notChars
+        
+        self.minLen = min
+
+        if max > 0:
+            self.maxLen = max
+        else:
+            self.maxLen = sys.maxint
+
+        if exact > 0:
+            self.maxLen = exact
+            self.minLen = exact
+        
+        self.name = _ustr(self)
+        self.errmsg = "Expected " + self.name
+        self.mayReturnEmpty = ( self.minLen == 0 )
+        self.myException.msg = self.errmsg
+        self.mayIndexError = False
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if instring[loc] in self.notChars:
+            #~ raise ParseException, ( instring, loc, self.errmsg )
+            exc = self.myException
+            exc.loc = loc
+            exc.pstr = instring
+            raise exc
+            
+        start = loc
+        loc += 1
+        notchars = self.notChars
+        maxlen = min( start+self.maxLen, len(instring) )
+        while loc < maxlen and \
+              (instring[loc] not in notchars):
+            loc += 1
+
+        if loc - start < self.minLen:
+            #~ raise ParseException, ( instring, loc, self.errmsg )
+            exc = self.myException
+            exc.loc = loc
+            exc.pstr = instring
+            raise exc
+
+        return loc, instring[start:loc]
+
+    def __str__( self ):
+        try:
+            return super(CharsNotIn, self).__str__()
+        except:
+            pass
+
+        if self.strRepr is None:
+            if len(self.notChars) > 4:
+                self.strRepr = "!W:(%s...)" % self.notChars[:4]
+            else:
+                self.strRepr = "!W:(%s)" % self.notChars
+        
+        return self.strRepr
+
+class White(Token):
+    """Special matching class for matching whitespace.  Normally, whitespace is ignored
+       by pyparsing grammars.  This class is included when some whitespace structures
+       are significant.  Define with a string containing the whitespace characters to be
+       matched; default is " \\t\\n".  Also takes optional min, max, and exact arguments,
+       as defined for the Word class."""
+    whiteStrs = {
+        " " : "<SPC>",
+        "\t": "<TAB>",
+        "\n": "<LF>",
+        "\r": "<CR>",
+        "\f": "<FF>",
+        }
+    def __init__(self, ws=" \t\r\n", min=1, max=0, exact=0):
+        super(White,self).__init__()
+        self.matchWhite = ws
+        self.whiteChars = "".join([c for c in self.whiteChars if c not in self.matchWhite])
+        #~ self.leaveWhitespace()
+        self.name = ("".join([White.whiteStrs[c] for c in self.matchWhite]))
+        self.mayReturnEmpty = True
+        self.errmsg = "Expected " + self.name
+        self.myException.msg = self.errmsg
+
+        self.minLen = min
+
+        if max > 0:
+            self.maxLen = max
+        else:
+            self.maxLen = sys.maxint
+
+        if exact > 0:
+            self.maxLen = exact
+            self.minLen = exact
+            
+    def parseImpl( self, instring, loc, doActions=True ):
+        if not(instring[ loc ] in self.matchWhite):
+            #~ raise ParseException, ( instring, loc, self.errmsg )
+            exc = self.myException
+            exc.loc = loc
+            exc.pstr = instring
+            raise exc
+        start = loc
+        loc += 1
+        maxloc = start + self.maxLen
+        maxloc = min( maxloc, len(instring) )
+        while loc < maxloc and instring[loc] in self.matchWhite:
+            loc += 1
+
+        if loc - start < self.minLen:
+            #~ raise ParseException, ( instring, loc, self.errmsg )
+            exc = self.myException
+            exc.loc = loc
+            exc.pstr = instring
+            raise exc
+
+        return loc, instring[start:loc]
+
+
+class PositionToken(Token):
+    def __init__( self ):
+        super(PositionToken,self).__init__()
+        self.name=self.__class__.__name__
+        self.mayReturnEmpty = True
+
+class GoToColumn(PositionToken):
+    """Token to advance to a specific column of input text; useful for tabular report scraping."""
+    def __init__( self, colno ):
+        super(GoToColumn,self).__init__()
+        self.col = colno
+
+    def preParse( self, instring, loc ):
+        if col(loc,instring) != self.col:
+            instrlen = len(instring)
+            if self.ignoreExprs:
+                loc = self.skipIgnorables( instring, loc )
+            while loc < instrlen and instring[loc].isspace() and col( loc, instring ) != self.col :
+                loc += 1
+        return loc
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        thiscol = col( loc, instring )
+        if thiscol > self.col:
+            raise ParseException, ( instring, loc, "Text not in expected column", self )
+        newloc = loc + self.col - thiscol
+        ret = instring[ loc: newloc ]
+        return newloc, ret
+
+class LineStart(PositionToken):
+    """Matches if current position is at the beginning of a line within the parse string"""
+    def __init__( self ):
+        super(LineStart,self).__init__()
+        self.whiteChars = " \t"
+        self.errmsg = "Expected start of line"
+        self.myException.msg = self.errmsg
+
+    def preParse( self, instring, loc ):
+        loc = super(LineStart,self).preParse(instring,loc)
+        if instring[loc] == "\n":
+            loc += 1
+        return loc
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if not( loc==0 or ( loc<len(instring) and instring[loc-1] == "\n" ) ): #col(loc, instring) != 1:
+            #~ raise ParseException, ( instring, loc, "Expected start of line" )
+            exc = self.myException
+            exc.loc = loc
+            exc.pstr = instring
+            raise exc
+        return loc, []
+
+class LineEnd(PositionToken):
+    """Matches if current position is at the end of a line within the parse string"""
+    def __init__( self ):
+        super(LineEnd,self).__init__()
+        self.whiteChars = " \t"
+        self.errmsg = "Expected end of line"
+        self.myException.msg = self.errmsg
+    
+    def parseImpl( self, instring, loc, doActions=True ):
+        if loc<len(instring):
+            if instring[loc] == "\n":
+                return loc+1, "\n"
+            else:
+                #~ raise ParseException, ( instring, loc, "Expected end of line" )
+                exc = self.myException
+                exc.loc = loc
+                exc.pstr = instring
+                raise exc
+        else:
+            return loc, []
+
+class StringStart(PositionToken):
+    """Matches if current position is at the beginning of the parse string"""
+    def __init__( self ):
+        super(StringStart,self).__init__()
+        self.errmsg = "Expected start of text"
+        self.myException.msg = self.errmsg
+    
+    def parseImpl( self, instring, loc, doActions=True ):
+        if loc != 0:
+            # see if entire string up to here is just whitespace and ignoreables
+            if loc != self.preParse( instring, 0 ):
+                #~ raise ParseException, ( instring, loc, "Expected start of text" )
+                exc = self.myException
+                exc.loc = loc
+                exc.pstr = instring
+                raise exc
+        return loc, []
+
+class StringEnd(PositionToken):
+    """Matches if current position is at the end of the parse string"""
+    def __init__( self ):
+        super(StringEnd,self).__init__()
+        self.errmsg = "Expected end of text"
+        self.myException.msg = self.errmsg
+    
+    def parseImpl( self, instring, loc, doActions=True ):
+        if loc < len(instring):
+            #~ raise ParseException, ( instring, loc, "Expected end of text" )
+            exc = self.myException
+            exc.loc = loc
+            exc.pstr = instring
+            raise exc
+        return loc, []
+
+
+class ParseExpression(ParserElement):
+    """Abstract subclass of ParserElement, for combining and post-processing parsed tokens."""
+    def __init__( self, exprs, savelist = False ):
+        super(ParseExpression,self).__init__(savelist)
+        if isinstance( exprs, list ):
+            self.exprs = exprs
+        elif isinstance( exprs, basestring ):
+            self.exprs = [ Literal( exprs ) ]
+        else:
+            self.exprs = [ exprs ]
+
+    def __getitem__( self, i ):
+        return self.exprs[i]
+
+    def append( self, other ):
+        self.exprs.append( other )
+        self.strRepr = None
+        return self
+
+    def leaveWhitespace( self ):
+        """Extends leaveWhitespace defined in base class, and also invokes leaveWhitespace on
+           all contained expressions."""
+        self.skipWhitespace = False
+        self.exprs = [ copy.copy(e) for e in self.exprs ]
+        for e in self.exprs:
+            e.leaveWhitespace()
+        return self
+
+    def ignore( self, other ):
+        if isinstance( other, Suppress ):
+            if other not in self.ignoreExprs:
+                super( ParseExpression, self).ignore( other )
+                for e in self.exprs:
+                    e.ignore( self.ignoreExprs[-1] )
+        else:
+            super( ParseExpression, self).ignore( other )
+            for e in self.exprs:
+                e.ignore( self.ignoreExprs[-1] )
+        return self
+
+    def __str__( self ):
+        try:
+            return super(ParseExpression,self).__str__()
+        except:
+            pass
+            
+        if self.strRepr is None:
+            self.strRepr = "%s:(%s)" % ( self.__class__.__name__, _ustr(self.exprs) )
+        return self.strRepr
+
+    def streamline( self ):
+        super(ParseExpression,self).streamline()
+
+        for e in self.exprs:
+            e.streamline()
+
+        # collapse nested And's of the form And( And( And( a,b), c), d) to And( a,b,c,d )
+        # but only if there are no parse actions or resultsNames on the nested And's
+        # (likewise for Or's and MatchFirst's)
+        if ( len(self.exprs) == 2 ):
+            other = self.exprs[0]
+            if ( isinstance( other, self.__class__ ) and
+                  other.parseAction is None and
+                  other.resultsName is None and
+                  not other.debug ):
+                self.exprs = other.exprs[:] + [ self.exprs[1] ]
+                self.strRepr = None
+
+            other = self.exprs[-1]
+            if ( isinstance( other, self.__class__ ) and
+                  other.parseAction is None and
+                  other.resultsName is None and
+                  not other.debug ):
+                self.exprs = self.exprs[:-1] + other.exprs[:]
+                self.strRepr = None
+
+        return self
+
+    def setResultsName( self, name, listAllMatches=False ):
+        ret = super(ParseExpression,self).setResultsName(name,listAllMatches)
+        #~ ret.saveAsList = True
+        return ret
+    
+    def validate( self, validateTrace=[] ):
+        tmp = validateTrace[:]+[self]
+        for e in self.exprs:
+            e.validate(tmp)
+        self.checkRecursion( [] )
+
+
+class And(ParseExpression):
+    """Requires all given ParseExpressions to be found in the given order.
+       Expressions may be separated by whitespace.
+       May be constructed using the '+' operator.
+    """
+    def __init__( self, exprs, savelist = True ):
+        super(And,self).__init__(exprs, savelist)
+        self.mayReturnEmpty = True
+        for e in exprs:
+            if not e.mayReturnEmpty:
+                self.mayReturnEmpty = False
+                break
+        self.skipWhitespace = exprs[0].skipWhitespace
+        self.whiteChars = exprs[0].whiteChars
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        loc, resultlist = self.exprs[0].parse( instring, loc, doActions )
+        for e in self.exprs[1:]:
+            loc, exprtokens = e.parse( instring, loc, doActions )
+            if exprtokens or exprtokens.keys():
+                resultlist += exprtokens
+        return loc, resultlist
+
+    def __iadd__(self, other ):
+        if isinstance( other, basestring ):
+            other = Literal( other )
+        return self.append( other ) #And( [ self, other ] )
+        
+    def checkRecursion( self, parseElementList ):
+        subRecCheckList = parseElementList[:] + [ self ]
+        for e in self.exprs:
+            e.checkRecursion( subRecCheckList )
+            if not e.mayReturnEmpty:
+                break
+                
+    def __str__( self ):
+        if hasattr(self,"name"):
+            return self.name
+            
+        if self.strRepr is None:
+            self.strRepr = "{" + " ".join( [ _ustr(e) for e in self.exprs ] ) + "}"
+        
+        return self.strRepr
+    
+
+class Or(ParseExpression):
+    """Requires that at least one ParseExpression is found.
+       If two expressions match, the expression that matches the longest string will be used.
+       May be constructed using the '^' operator.
+    """
+    def __init__( self, exprs, savelist = False ):
+        super(Or,self).__init__(exprs, savelist)
+        self.mayReturnEmpty = False
+        for e in exprs:
+            if e.mayReturnEmpty:
+                self.mayReturnEmpty = True
+                break
+    
+    def parseImpl( self, instring, loc, doActions=True ):
+        maxExcLoc = -1
+        maxMatchLoc = -1
+        for e in self.exprs:
+            try:
+                loc2 = e.tryParse( instring, loc )
+            except ParseException, err:
+                if err.loc > maxExcLoc:
+                    maxException = err
+                    maxExcLoc = err.loc
+            except IndexError, err:
+                if len(instring) > maxExcLoc:
+                    maxException = ParseException(instring,len(instring),e.errmsg,self)
+                    maxExcLoc = len(instring)
+            else:
+                if loc2 > maxMatchLoc:
+                    maxMatchLoc = loc2
+                    maxMatchExp = e
+        
+        if maxMatchLoc < 0:
+            if self.exprs:
+                raise maxException
+            else:
+                raise ParseException(instring, loc, "no defined alternatives to match", self)
+
+        return maxMatchExp.parse( instring, loc, doActions )
+
+    def __ixor__(self, other ):
+        if isinstance( other, basestring ):
+            other = Literal( other )
+        return self.append( other ) #Or( [ self, other ] )
+
+    def __str__( self ):
+        if hasattr(self,"name"):
+            return self.name
+            
+        if self.strRepr is None:
+            self.strRepr = "{" + " ^ ".join( [ _ustr(e) for e in self.exprs ] ) + "}"
+        
+        return self.strRepr
+    
+    def checkRecursion( self, parseElementList ):
+        subRecCheckList = parseElementList[:] + [ self ]
+        for e in self.exprs:
+            e.checkRecursion( subRecCheckList )
+
+
+class MatchFirst(ParseExpression):
+    """Requires that at least one ParseExpression is found.
+       If two expressions match, the first one listed is the one that will match.
+       May be constructed using the '|' operator.
+    """
+    def __init__( self, exprs, savelist = False ):
+        super(MatchFirst,self).__init__(exprs, savelist)
+        if exprs:
+            self.mayReturnEmpty = False
+            for e in exprs:
+                if e.mayReturnEmpty:
+                    self.mayReturnEmpty = True
+                    break
+        else:
+            self.mayReturnEmpty = True
+    
+    def parseImpl( self, instring, loc, doActions=True ):
+        maxExcLoc = -1
+        for e in self.exprs:
+            try:
+                ret = e.parse( instring, loc, doActions )
+                return ret
+            except ParseException, err:
+                if err.loc > maxExcLoc:
+                    maxException = err
+                    maxExcLoc = err.loc
+            except IndexError, err:
+                if len(instring) > maxExcLoc:
+                    maxException = ParseException(instring,len(instring),e.errmsg,self)
+                    maxExcLoc = len(instring)
+
+        # only got here if no expression matched, raise exception for match that made it the furthest
+        else:
+            if self.exprs:
+                raise maxException
+            else:
+                raise ParseException(instring, loc, "no defined alternatives to match", self)
+
+    def __ior__(self, other ):
+        if isinstance( other, basestring ):
+            other = Literal( other )
+        return self.append( other ) #MatchFirst( [ self, other ] )
+
+    def __str__( self ):
+        if hasattr(self,"name"):
+            return self.name
+            
+        if self.strRepr is None:
+            self.strRepr = "{" + " | ".join( [ _ustr(e) for e in self.exprs ] ) + "}"
+        
+        return self.strRepr
+    
+    def checkRecursion( self, parseElementList ):
+        subRecCheckList = parseElementList[:] + [ self ]
+        for e in self.exprs:
+            e.checkRecursion( subRecCheckList )
+
+class Each(ParseExpression):
+    """Requires all given ParseExpressions to be found, but in any order.
+       Expressions may be separated by whitespace.
+       May be constructed using the '&' operator.
+    """
+    def __init__( self, exprs, savelist = True ):
+        super(Each,self).__init__(exprs, savelist)
+        self.mayReturnEmpty = True
+        for e in exprs:
+            if not e.mayReturnEmpty:
+                self.mayReturnEmpty = False
+                break
+        self.skipWhitespace = True
+        self.optionals = [ e.expr for e in exprs if isinstance(e,Optional) ]
+        self.multioptionals = [ e.expr for e in exprs if isinstance(e,ZeroOrMore) ]
+        self.multirequired = [ e.expr for e in exprs if isinstance(e,OneOrMore) ]
+        self.required = [ e for e in exprs if not isinstance(e,(Optional,ZeroOrMore,OneOrMore)) ]
+        self.required += self.multirequired
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        tmpLoc = loc
+        tmpReqd = self.required[:]
+        tmpOpt  = self.optionals[:]
+        matchOrder = []
+
+        keepMatching = True
+        while keepMatching:
+            tmpExprs = tmpReqd + tmpOpt + self.multioptionals + self.multirequired
+            failed = []
+            for e in tmpExprs:
+                try:
+                    tmpLoc = e.tryParse( instring, tmpLoc )
+                except ParseException:
+                    failed.append(e)
+                else:
+                    matchOrder.append(e)
+                    if e in tmpReqd:
+                        tmpReqd.remove(e)
+                    elif e in tmpOpt:
+                        tmpOpt.remove(e)
+            if len(failed) == len(tmpExprs):
+                keepMatching = False
+        
+        if tmpReqd:
+            missing = ", ".join( [ str(e) for e in tmpReqd ] )
+            raise ParseException(instring,loc,"Missing one or more required elements (%s)" % missing )
+
+        resultlist = []
+        for e in matchOrder:
+            loc,results = e.parse(instring,loc,doActions)
+            resultlist.append(results)
+            
+        finalResults = ParseResults([])
+        for r in resultlist:
+            dups = {}
+            for k in r.keys():
+                if k in finalResults.keys():
+                    tmp = ParseResults(finalResults[k])
+                    tmp += ParseResults(r[k])
+                    dups[k] = tmp
+            finalResults += ParseResults(r)
+            for k,v in dups.items():
+                finalResults[k] = v
+        return loc, finalResults
+
+    def __str__( self ):
+        if hasattr(self,"name"):
+            return self.name
+            
+        if self.strRepr is None:
+            self.strRepr = "{" + " & ".join( [ _ustr(e) for e in self.exprs ] ) + "}"
+        
+        return self.strRepr
+    
+    def checkRecursion( self, parseElementList ):
+        subRecCheckList = parseElementList[:] + [ self ]
+        for e in self.exprs:
+            e.checkRecursion( subRecCheckList )
+
+
+class ParseElementEnhance(ParserElement):
+    """Abstract subclass of ParserElement, for combining and post-processing parsed tokens."""
+    def __init__( self, expr, savelist=False ):
+        super(ParseElementEnhance,self).__init__(savelist)
+        if isinstance( expr, basestring ):
+            expr = Literal(expr)
+        self.expr = expr
+        self.strRepr = None
+        if expr is not None:
+            self.mayIndexError = expr.mayIndexError
+            self.skipWhitespace = expr.skipWhitespace
+            self.whiteChars = expr.whiteChars
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if self.expr is not None:
+            return self.expr.parse( instring, loc, doActions )
+        else:
+            raise ParseException(instring,loc,"",self)
+
+    def leaveWhitespace( self ):
+        self.skipWhitespace = False
+        self.expr = copy.copy(self.expr)
+        if self.expr is not None:
+            self.expr.leaveWhitespace()
+        return self
+
+    def ignore( self, other ):
+        if isinstance( other, Suppress ):
+            if other not in self.ignoreExprs:
+                super( ParseElementEnhance, self).ignore( other )
+                if self.expr is not None:
+                    self.expr.ignore( self.ignoreExprs[-1] )
+        else:
+            super( ParseElementEnhance, self).ignore( other )
+            if self.expr is not None:
+                self.expr.ignore( self.ignoreExprs[-1] )
+        return self
+
+    def streamline( self ):
+        super(ParseElementEnhance,self).streamline()
+        if self.expr is not None:
+            self.expr.streamline()
+        return self
+
+    def checkRecursion( self, parseElementList ):
+        if self in parseElementList:
+            raise RecursiveGrammarException( parseElementList+[self] )
+        subRecCheckList = parseElementList[:] + [ self ]
+        if self.expr is not None:
+            self.expr.checkRecursion( subRecCheckList )
+        
+    def validate( self, validateTrace=[] ):
+        tmp = validateTrace[:]+[self]
+        if self.expr is not None:
+            self.expr.validate(tmp)
+        self.checkRecursion( [] )
+    
+    def __str__( self ):
+        try:
+            return super(ParseElementEnhance,self).__str__()
+        except:
+            pass
+            
+        if self.strRepr is None and self.expr is not None:
+            self.strRepr = "%s:(%s)" % ( self.__class__.__name__, _ustr(self.expr) )
+        return self.strRepr
+
+
+class FollowedBy(ParseElementEnhance):
+    """Lookahead matching of the given parse expression.  FollowedBy
+    does *not* advance the parsing position within the input string, it only 
+    verifies that the specified parse expression matches at the current 
+    position.  FollowedBy always returns a null token list."""
+    def __init__( self, expr ):
+        super(FollowedBy,self).__init__(expr)
+        self.mayReturnEmpty = True
+        
+    def parseImpl( self, instring, loc, doActions=True ):
+        self.expr.tryParse( instring, loc )
+        return loc, []
+
+
+class NotAny(ParseElementEnhance):
+    """Lookahead to disallow matching with the given parse expression.  NotAny
+    does *not* advance the parsing position within the input string, it only 
+    verifies that the specified parse expression does *not* match at the current 
+    position.  Also, NotAny does *not* skip over leading whitespace. NotAny 
+    always returns a null token list.  May be constructed using the '~' operator."""
+    def __init__( self, expr ):
+        super(NotAny,self).__init__(expr)
+        #~ self.leaveWhitespace()
+        self.skipWhitespace = False  # do NOT use self.leaveWhitespace(), don't want to propagate to exprs
+        self.mayReturnEmpty = True
+        self.errmsg = "Found unexpected token, "+_ustr(self.expr)
+        self.myException = ParseException("",0,self.errmsg,self)
+        
+    def parseImpl( self, instring, loc, doActions=True ):
+        try:
+            self.expr.tryParse( instring, loc )
+        except (ParseException,IndexError):
+            pass
+        else:
+            #~ raise ParseException, (instring, loc, self.errmsg )
+            exc = self.myException
+            exc.loc = loc
+            exc.pstr = instring
+            raise exc
+        return loc, []
+
+    def __str__( self ):
+        if hasattr(self,"name"):
+            return self.name
+            
+        if self.strRepr is None:
+            self.strRepr = "~{" + _ustr(self.expr) + "}"
+        
+        return self.strRepr
+
+
+class ZeroOrMore(ParseElementEnhance):
+    """Optional repetition of zero or more of the given expression."""
+    def __init__( self, expr ):
+        super(ZeroOrMore,self).__init__(expr)
+        self.mayReturnEmpty = True
+    
+    def parseImpl( self, instring, loc, doActions=True ):
+        tokens = []
+        try:
+            loc, tokens = self.expr.parse( instring, loc, doActions )
+            hasIgnoreExprs = ( len(self.ignoreExprs) > 0 )
+            while 1:
+                if hasIgnoreExprs:
+                    loc = self.skipIgnorables( instring, loc )
+                loc, tmptokens = self.expr.parse( instring, loc, doActions )
+                if tmptokens or tmptokens.keys():
+                    tokens += tmptokens
+        except (ParseException,IndexError):
+            pass
+
+        return loc, tokens
+
+    def __str__( self ):
+        if hasattr(self,"name"):
+            return self.name
+            
+        if self.strRepr is None:
+            self.strRepr = "[" + _ustr(self.expr) + "]..."
+        
+        return self.strRepr
+    
+    def setResultsName( self, name, listAllMatches=False ):
+        ret = super(ZeroOrMore,self).setResultsName(name,listAllMatches)
+        ret.saveAsList = True
+        return ret
+    
+
+class OneOrMore(ParseElementEnhance):
+    """Repetition of one or more of the given expression."""
+    def parseImpl( self, instring, loc, doActions=True ):
+        # must be at least one
+        loc, tokens = self.expr.parse( instring, loc, doActions )
+        try:
+            hasIgnoreExprs = ( len(self.ignoreExprs) > 0 )
+            while 1:
+                if hasIgnoreExprs:
+                    loc = self.skipIgnorables( instring, loc )
+                loc, tmptokens = self.expr.parse( instring, loc, doActions )
+                if tmptokens or tmptokens.keys():
+                    tokens += tmptokens
+        except (ParseException,IndexError):
+            pass
+
+        return loc, tokens
+
+    def __str__( self ):
+        if hasattr(self,"name"):
+            return self.name
+            
+        if self.strRepr is None:
+            self.strRepr = "{" + _ustr(self.expr) + "}..."
+        
+        return self.strRepr
+    
+    def setResultsName( self, name, listAllMatches=False ):
+        ret = super(OneOrMore,self).setResultsName(name,listAllMatches)
+        ret.saveAsList = True
+        return ret
+    
+
+class Optional(ParseElementEnhance):
+    """Optional matching of the given expression.
+       A default return string can also be specified, if the optional expression
+       is not found.
+    """
+    def __init__( self, exprs, default=None ):
+        super(Optional,self).__init__( exprs, savelist=False )
+        self.defaultValue = default
+        self.mayReturnEmpty = True
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        try:
+            loc, tokens = self.expr.parse( instring, loc, doActions )
+        except (ParseException,IndexError):
+            if self.defaultValue is not None:
+                tokens = [ self.defaultValue ]
+            else:
+                tokens = []
+
+        return loc, tokens
+
+    def __str__( self ):
+        if hasattr(self,"name"):
+            return self.name
+            
+        if self.strRepr is None:
+            self.strRepr = "[" + _ustr(self.expr) + "]"
+        
+        return self.strRepr
+
+
+class SkipTo(ParseElementEnhance):
+    """Token for skipping over all undefined text until the matched expression is found.
+       If include is set to true, the matched expression is also consumed.  The ignore
+       argument is used to define grammars (typically quoted strings and comments) that 
+       might contain false matches.
+    """
+    def __init__( self, other, include=False, ignore=None ):
+        super( SkipTo, self ).__init__( other )
+        if ignore is not None:
+            self.expr = copy.copy( self.expr )
+            self.expr.ignore(ignore)
+        self.mayReturnEmpty = True
+        self.mayIndexError = False
+        self.includeMatch = include
+        self.errmsg = "No match found for "+_ustr(self.expr)
+        self.myException = ParseException("",0,self.errmsg,self)
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        startLoc = loc
+        instrlen = len(instring)
+        expr = self.expr
+        while loc < instrlen:
+            try:
+                loc = expr.skipIgnorables( instring, loc )
+                expr.parse( instring, loc, doActions=False, callPreParse=False )
+                if self.includeMatch:
+                    skipText = instring[startLoc:loc]
+                    loc,mat = expr.parse(instring,loc)
+                    if mat:
+                        return loc, [ skipText, mat ]
+                    else:
+                        return loc, [ skipText ]
+                else:
+                    return loc, [ instring[startLoc:loc] ]
+            except (ParseException,IndexError):
+                loc += 1
+        exc = self.myException
+        exc.loc = loc
+        exc.pstr = instring
+        raise exc
+
+class Forward(ParseElementEnhance):
+    """Forward declaration of an expression to be defined later -
+       used for recursive grammars, such as algebraic infix notation.
+       When the expression is known, it is assigned to the Forward variable using the '<<' operator.
+       
+       Note: take care when assigning to Forward to not overlook precedence of operators.
+       Specifically, '|' has a lower precedence than '<<', so that::
+          fwdExpr << a | b | c
+       will actually be evaluated as::
+          (fwdExpr << a) | b | c
+       thereby leaving b and c out as parseable alternatives.  It is recommended that you
+       explicitly group the values inserted into the Forward::
+          fwdExpr << (a | b | c)
+    """
+    def __init__( self, other=None ):
+        super(Forward,self).__init__( other, savelist=False )
+
+    def __lshift__( self, other ):
+        self.expr = other
+        self.mayReturnEmpty = other.mayReturnEmpty
+        self.strRepr = None
+        return self
+
+    def leaveWhitespace( self ):
+        self.skipWhitespace = False
+        return self
+
+    def streamline( self ):
+        if not self.streamlined:
+            self.streamlined = True
+            if self.expr is not None: 
+                self.expr.streamline()
+        return self
+
+    def validate( self, validateTrace=[] ):
+        if self not in validateTrace:
+            tmp = validateTrace[:]+[self]
+            if self.expr is not None: 
+                self.expr.validate(tmp)
+        self.checkRecursion([])        
+        
+    def __str__( self ):
+        if hasattr(self,"name"):
+            return self.name
+
+        self.__class__ = _ForwardNoRecurse
+        try:
+            if self.expr is not None: 
+                retString = _ustr(self.expr)
+            else:
+                retString = "None"
+        finally:
+            self.__class__ = Forward
+        return "Forward: "+retString
+
+class _ForwardNoRecurse(Forward):
+    def __str__( self ):
+        return "..."
+        
+class TokenConverter(ParseElementEnhance):
+    """Abstract subclass of ParseExpression, for converting parsed results."""
+    def __init__( self, expr, savelist=False ):
+        super(TokenConverter,self).__init__( expr )#, savelist )
+
+
+class Upcase(TokenConverter):
+    """Converter to upper case all matching tokens."""
+    def __init__(self, *args):
+        super(Upcase,self).__init__(*args)
+        warnings.warn("Upcase class is deprecated, use upcaseTokens parse action instead", 
+                       DeprecationWarning,stacklevel=2)
+    
+    def postParse( self, instring, loc, tokenlist ):
+        return map( string.upper, tokenlist )
+
+
+class Combine(TokenConverter):
+    """Converter to concatenate all matching tokens to a single string.
+       By default, the matching patterns must also be contiguous in the input string;
+       this can be disabled by specifying 'adjacent=False' in the constructor.
+    """
+    def __init__( self, expr, joinString="", adjacent=True ):
+        super(Combine,self).__init__( expr )
+        # suppress whitespace-stripping in contained parse expressions, but re-enable it on the Combine itself
+        if adjacent:
+            self.leaveWhitespace()
+        self.adjacent = adjacent
+        self.skipWhitespace = True
+        self.joinString = joinString
+
+    def ignore( self, other ):
+        if self.adjacent:
+            ParserElement.ignore(self, other)
+        else:
+            super( Combine, self).ignore( other )
+        return self
+
+    def postParse( self, instring, loc, tokenlist ):
+        retToks = tokenlist.copy()
+        del retToks[:]
+        retToks += ParseResults([ "".join(tokenlist._asStringList(self.joinString)) ], modal=self.modalResults)
+
+        if self.resultsName and len(retToks.keys())>0:
+            return [ retToks ]
+        else:
+            return retToks
+
+class Group(TokenConverter):
+    """Converter to return the matched tokens as a list - useful for returning tokens of ZeroOrMore and OneOrMore expressions."""
+    def __init__( self, expr ):
+        super(Group,self).__init__( expr )
+        self.saveAsList = True
+
+    def postParse( self, instring, loc, tokenlist ):
+        return [ tokenlist ]
+        
+class Dict(TokenConverter):
+    """Converter to return a repetitive expression as a list, but also as a dictionary.
+       Each element can also be referenced using the first token in the expression as its key.
+       Useful for tabular report scraping when the first column can be used as a item key.
+    """
+    def __init__( self, exprs ):
+        super(Dict,self).__init__( exprs )
+        self.saveAsList = True
+
+    def postParse( self, instring, loc, tokenlist ):
+        for i,tok in enumerate(tokenlist):
+            ikey = _ustr(tok[0]).strip()
+            if len(tok)==1:
+                tokenlist[ikey] = ("",i)
+            elif len(tok)==2 and not isinstance(tok[1],ParseResults):
+                tokenlist[ikey] = (tok[1],i)
+            else:
+                dictvalue = tok.copy() #ParseResults(i)
+                del dictvalue[0]
+                if len(dictvalue)!= 1 or (isinstance(dictvalue,ParseResults) and dictvalue.keys()):
+                    tokenlist[ikey] = (dictvalue,i)
+                else:
+                    tokenlist[ikey] = (dictvalue[0],i)
+
+        if self.resultsName:
+            return [ tokenlist ]
+        else:
+            return tokenlist
+
+
+class Suppress(TokenConverter):
+    """Converter for ignoring the results of a parsed expression."""
+    def postParse( self, instring, loc, tokenlist ):
+        return []
+    
+    def suppress( self ):
+        return self
+
+#
+# global helpers
+#
+def delimitedList( expr, delim=",", combine=False ):
+    """Helper to define a delimited list of expressions - the delimiter defaults to ','.
+       By default, the list elements and delimiters can have intervening whitespace, and 
+       comments, but this can be overridden by passing 'combine=True' in the constructor.
+       If combine is set to True, the matching tokens are returned as a single token
+       string, with the delimiters included; otherwise, the matching tokens are returned
+       as a list of tokens, with the delimiters suppressed.
+    """
+    if combine:
+        return Combine( expr + ZeroOrMore( delim + expr ) ).setName(_ustr(expr)+_ustr(delim)+"...")
+    else:
+        return ( expr + ZeroOrMore( Suppress( delim ) + expr ) ).setName(_ustr(expr)+_ustr(delim)+"...")
+
+def _escapeRegexRangeChars(s):
+    #~  escape these chars: ^-]
+    for c in r"\^-]":
+        s = s.replace(c,"\\"+c)
+    s = s.replace("\n",r"\n")
+    s = s.replace("\t",r"\t")
+    return _ustr(s)
+    
+def oneOf( strs, caseless=False, useRegex=True ):
+    """Helper to quickly define a set of alternative Literals, and makes sure to do 
+       longest-first testing when there is a conflict, regardless of the input order, 
+       but returns a MatchFirst for best performance.  
+       
+       Parameters:
+        - strs - a string of space-delimited literals, or a list of string literals
+        - caseless - (default=False) - treat all literals as caseless
+        - useRegex - (default=True) - as an optimization, will generate a Regex
+          object; otherwise, will generate a MatchFirst object (if caseless=True, or
+          if creating a Regex raises an exception)
+    """
+    if caseless:
+        isequal = ( lambda a,b: a.upper() == b.upper() )
+        masks = ( lambda a,b: b.upper().startswith(a.upper()) )
+        parseElementClass = CaselessLiteral
+    else:
+        isequal = ( lambda a,b: a == b )
+        masks = ( lambda a,b: b.startswith(a) )
+        parseElementClass = Literal
+    
+    if isinstance(strs,list):
+        symbols = strs[:]
+    elif isinstance(strs,basestring):
+        symbols = strs.split()
+    else:
+        warnings.warn("Invalid argument to oneOf, expected string or list",
+                SyntaxWarning, stacklevel=2)
+        
+    i = 0
+    while i < len(symbols)-1:
+        cur = symbols[i]
+        for j,other in enumerate(symbols[i+1:]):
+            if ( isequal(other, cur) ):
+                del symbols[i+j+1]
+                break
+            elif ( masks(cur, other) ):
+                del symbols[i+j+1]
+                symbols.insert(i,other)
+                cur = other
+                break
+        else:
+            i += 1
+
+    if not caseless and useRegex:
+        #~ print strs,"->", "|".join( [ _escapeRegexChars(sym) for sym in symbols] )
+        try:
+            if len(symbols)==len("".join(symbols)):
+                return Regex( "[%s]" % "".join( [ _escapeRegexRangeChars(sym) for sym in symbols] ) )
+            else:
+                return Regex( "|".join( [ re.escape(sym) for sym in symbols] ) )
+        except:
+            warnings.warn("Exception creating Regex for oneOf, building MatchFirst",
+                    SyntaxWarning, stacklevel=2)
+
+
+    # last resort, just use MatchFirst
+    return MatchFirst( [ parseElementClass(sym) for sym in symbols ] )
+
+def dictOf( key, value ):
+    """Helper to easily and clearly define a dictionary by specifying the respective patterns
+       for the key and value.  Takes care of defining the Dict, ZeroOrMore, and Group tokens
+       in the proper order.  The key pattern can include delimiting markers or punctuation,
+       as long as they are suppressed, thereby leaving the significant key text.  The value
+       pattern can include named results, so that the Dict results can include named token 
+       fields.
+    """
+    return Dict( ZeroOrMore( Group ( key + value ) ) )
+
+_bslash = "\\"
+printables = "".join( [ c for c in string.printable if c not in string.whitespace ] )
+
+# convenience constants for positional expressions
+empty       = Empty().setName("empty")
+lineStart   = LineStart().setName("lineStart")
+lineEnd     = LineEnd().setName("lineEnd")
+stringStart = StringStart().setName("stringStart")
+stringEnd   = StringEnd().setName("stringEnd")
+
+_escapedPunc = Word( _bslash, r"\[]-*.$+^?()~ ", exact=2 ).setParseAction(lambda s,l,t:t[0][1])
+_printables_less_backslash = "".join([ c for c in printables if c not in  r"\]" ])
+_escapedHexChar = Combine( Suppress(_bslash + "0x") + Word(hexnums) ).setParseAction(lambda s,l,t:unichr(int(t[0],16)))
+_escapedOctChar = Combine( Suppress(_bslash) + Word("0","01234567") ).setParseAction(lambda s,l,t:unichr(int(t[0],8)))
+_singleChar = _escapedPunc | _escapedHexChar | _escapedOctChar | Word(_printables_less_backslash,exact=1)
+_charRange = Group(_singleChar + Suppress("-") + _singleChar)
+_reBracketExpr = "[" + Optional("^").setResultsName("negate") + Group( OneOrMore( _charRange | _singleChar ) ).setResultsName("body") + "]"
+
+_expanded = lambda p: (isinstance(p,ParseResults) and ''.join([ unichr(c) for c in range(ord(p[0]),ord(p[1])+1) ]) or p)
+        
+def srange(s):
+    r"""Helper to easily define string ranges for use in Word construction.  Borrows
+       syntax from regexp '[]' string range definitions::
+          srange("[0-9]")   -> "0123456789"
+          srange("[a-z]")   -> "abcdefghijklmnopqrstuvwxyz"
+          srange("[a-z$_]") -> "abcdefghijklmnopqrstuvwxyz$_"
+       The input string must be enclosed in []'s, and the returned string is the expanded 
+       character set joined into a single string.
+       The values enclosed in the []'s may be::
+          a single character
+          an escaped character with a leading backslash (such as \- or \])
+          an escaped hex character with a leading '\0x' (\0x21, which is a '!' character)
+          an escaped octal character with a leading '\0' (\041, which is a '!' character)
+          a range of any of the above, separated by a dash ('a-z', etc.)
+          any combination of the above ('aeiouy', 'a-zA-Z0-9_$', etc.)
+    """
+    try:
+        return "".join([_expanded(part) for part in _reBracketExpr.parseString(s).body])
+    except:
+        return ""
+
+def replaceWith(replStr):
+    """Helper method for common parse actions that simply return a literal value.  Especially 
+       useful when used with transformString().
+    """
+    def _replFunc(*args):
+        return [replStr]
+    return _replFunc
+
+def removeQuotes(s,l,t):
+    """Helper parse action for removing quotation marks from parsed quoted strings.
+       To use, add this parse action to quoted string using::
+         quotedString.setParseAction( removeQuotes )
+    """
+    return t[0][1:-1]
+
+def upcaseTokens(s,l,t):
+    """Helper parse action to convert tokens to upper case."""
+    return map( str.upper, t )
+
+def downcaseTokens(s,l,t):
+    """Helper parse action to convert tokens to lower case."""
+    return map( str.lower, t )
+
+def _makeTags(tagStr, xml):
+    """Internal helper to construct opening and closing tag expressions, given a tag name"""
+    tagAttrName = Word(alphanums)
+    if (xml):
+        tagAttrValue = dblQuotedString.copy().setParseAction( removeQuotes )
+        openTag = Suppress("<") + Keyword(tagStr) + \
+                Dict(ZeroOrMore(Group( tagAttrName + Suppress("=") + tagAttrValue ))) + \
+                Optional("/",default=[False]).setResultsName("empty").setParseAction(lambda s,l,t:t[0]=='/') + Suppress(">")
+    else:
+        printablesLessRAbrack = "".join( [ c for c in printables if c not in ">" ] )
+        tagAttrValue = quotedString.copy().setParseAction( removeQuotes ) | Word(printablesLessRAbrack)
+        openTag = Suppress("<") + Keyword(tagStr,caseless=True) + \
+                Dict(ZeroOrMore(Group( tagAttrName.setParseAction(downcaseTokens) + \
+                Suppress("=") + tagAttrValue ))) + \
+                Optional("/",default=[False]).setResultsName("empty").setParseAction(lambda s,l,t:t[0]=='/') + Suppress(">")
+    closeTag = Combine("</" + Keyword(tagStr,caseless=not xml) + ">")
+    
+    openTag = openTag.setResultsName("start"+"".join(tagStr.replace(":"," ").title().split())).setName("<%s>" % tagStr)
+    closeTag = closeTag.setResultsName("end"+"".join(tagStr.replace(":"," ").title().split())).setName("</%s>" % tagStr)
+    
+    return openTag, closeTag
+
+def makeHTMLTags(tagStr):
+    """Helper to construct opening and closing tag expressions for HTML, given a tag name"""
+    return _makeTags( tagStr, False )
+
+def makeXMLTags(tagStr):
+    """Helper to construct opening and closing tag expressions for XML, given a tag name"""
+    return _makeTags( tagStr, True )
+
+alphas8bit = srange(r"[\0xc0-\0xd6\0xd8-\0xf6\0xf8-\0xfe]")
+
+_escapedChar = Regex(r"\\.")
+dblQuotedString = Regex(r'"([^"\n\r\\]|("")|(\\.))*"').setName("string enclosed in double quotes")
+sglQuotedString = Regex(r"'([^'\n\r\\]|('')|(\\.))*'").setName("string enclosed in single quotes")
+quotedString = Regex(r'''("([^"\n\r\\]|("")|(\\.))*")|('([^'\n\r\\]|('')|(\\.))*')''').setName("quotedString using single or double quotes")
+
+# it's easy to get these comment structures wrong - they're very common, so may as well make them available
+cStyleComment = Regex(r"\/\*[\s\S]*?\*\/").setName("C style comment")
+htmlComment = Regex(r"<!--[\s\S]*?-->")
+restOfLine = Regex(r".*").leaveWhitespace()
+dblSlashComment = Regex(r"\/\/.*").setName("// comment")
+cppStyleComment = Regex(r"(\/\*[\s\S]*?\*\/)|(\/\/.*)").setName("C++ style comment")
+javaStyleComment = cppStyleComment
+pythonStyleComment = Regex(r"#.*").setName("Python style comment")
+_noncomma = "".join( [ c for c in printables if c != "," ] )
+_commasepitem = Combine(OneOrMore(Word(_noncomma) + 
+                                  Optional( Word(" \t") + 
+                                            ~Literal(",") + ~LineEnd() ) ) ).streamline().setName("commaItem")
+commaSeparatedList = delimitedList( Optional( quotedString | _commasepitem, default="") ).setName("commaSeparatedList")
+
+
+if __name__ == "__main__":
+
+    def test( teststring ):
+        print teststring,"->",
+        try:
+            tokens = simpleSQL.parseString( teststring )
+            tokenlist = tokens.asList()
+            print tokenlist
+            print "tokens = ",        tokens
+            print "tokens.columns =", tokens.columns
+            print "tokens.tables =",  tokens.tables
+            print tokens.asXML("SQL",True)
+        except ParseException, err:
+            print err.line
+            print " "*(err.column-1) + "^"
+            print err
+        print
+
+    selectToken    = CaselessLiteral( "select" )
+    fromToken      = CaselessLiteral( "from" )
+
+    ident          = Word( alphas, alphanums + "_$" )
+    columnName     = delimitedList( ident, ".", combine=True ).setParseAction( upcaseTokens )
+    columnNameList = Group( delimitedList( columnName ) )#.setName("columns")
+    tableName      = delimitedList( ident, ".", combine=True ).setParseAction( upcaseTokens )
+    tableNameList  = Group( delimitedList( tableName ) )#.setName("tables")
+    simpleSQL      = ( selectToken + \
+                     ( '*' | columnNameList ).setResultsName( "columns" ) + \
+                     fromToken + \
+                     tableNameList.setResultsName( "tables" ) )
+    
+    test( "SELECT * from XYZZY, ABC" )
+    test( "select * from SYS.XYZZY" )
+    test( "Select A from Sys.dual" )
+    test( "Select AA,BB,CC from Sys.dual" )
+    test( "Select A, B, C from Sys.dual" )
+    test( "Select A, B, C from Sys.dual" )
+    test( "Xelect A, B, C from Sys.dual" )
+    test( "Select A, B, C frox Sys.dual" )
+    test( "Select" )
+    test( "Select ^^^ frox Sys.dual" )
+    test( "Select A, B, C from Sys.dual, Table2   " )
Index: /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_pullparser.py
===================================================================
--- /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_pullparser.py (revision 3)
+++ /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_pullparser.py (revision 3)
@@ -0,0 +1,334 @@
+"""A simple "pull API" for HTML parsing, after Perl's HTML::TokeParser.
+
+Examples
+
+This program extracts all links from a document.  It will print one
+line for each link, containing the URL and the textual description
+between the <A>...</A> tags:
+
+import pullparser, sys
+f = file(sys.argv[1])
+p = pullparser.PullParser(f)
+for token in p.tags("a"):
+    if token.type == "endtag": continue
+    url = dict(token.attrs).get("href", "-")
+    text = p.get_compressed_text(endat=("endtag", "a"))
+    print "%s\t%s" % (url, text)
+
+This program extracts the <TITLE> from the document:
+
+import pullparser, sys
+f = file(sys.argv[1])
+p = pullparser.PullParser(f)
+if p.get_tag("title"):
+    title = p.get_compressed_text()
+    print "Title: %s" % title
+
+
+Copyright 2003-2006 John J. Lee <jjl@pobox.com>
+Copyright 1998-2001 Gisle Aas (original libwww-perl code)
+
+This code is free software; you can redistribute it and/or modify it
+under the terms of the BSD or ZPL 2.1 licenses.
+
+"""
+
+import re, htmlentitydefs
+import sgmllib, HTMLParser
+
+from _html import unescape, unescape_charref
+
+
+class NoMoreTokensError(Exception): pass
+
+class Token:
+    """Represents an HTML tag, declaration, processing instruction etc.
+
+    Behaves as both a tuple-like object (ie. iterable) and has attributes
+    .type, .data and .attrs.
+
+    >>> t = Token("starttag", "a", [("href", "http://www.python.org/")])
+    >>> t == ("starttag", "a", [("href", "http://www.python.org/")])
+    True
+    >>> (t.type, t.data) == ("starttag", "a")
+    True
+    >>> t.attrs == [("href", "http://www.python.org/")]
+    True
+
+    Public attributes
+
+    type: one of "starttag", "endtag", "startendtag", "charref", "entityref",
+     "data", "comment", "decl", "pi", after the corresponding methods of
+     HTMLParser.HTMLParser
+    data: For a tag, the tag name; otherwise, the relevant data carried by the
+     tag, as a string
+    attrs: list of (name, value) pairs representing HTML attributes
+     (or None if token does not represent an opening tag)
+
+    """
+    def __init__(self, type, data, attrs=None):
+        self.type = type
+        self.data = data
+        self.attrs = attrs
+    def __iter__(self):
+        return iter((self.type, self.data, self.attrs))
+    def __eq__(self, other):
+        type, data, attrs = other
+        if (self.type == type and
+            self.data == data and
+            self.attrs == attrs):
+            return True
+        else:
+            return False
+    def __ne__(self, other): return not self.__eq__(other)
+    def __repr__(self):
+        args = ", ".join(map(repr, [self.type, self.data, self.attrs]))
+        return self.__class__.__name__+"(%s)" % args
+
+def iter_until_exception(fn, exception, *args, **kwds):
+    while 1:
+        try:
+            yield fn(*args, **kwds)
+        except exception:
+            raise StopIteration
+
+
+class _AbstractParser:
+    chunk = 1024
+    compress_re = re.compile(r"\s+")
+    def __init__(self, fh, textify={"img": "alt", "applet": "alt"},
+                 encoding="ascii", entitydefs=None):
+        """
+        fh: file-like object (only a .read() method is required) from which to
+         read HTML to be parsed
+        textify: mapping used by .get_text() and .get_compressed_text() methods
+         to represent opening tags as text
+        encoding: encoding used to encode numeric character references by
+         .get_text() and .get_compressed_text() ("ascii" by default)
+
+        entitydefs: mapping like {"amp": "&", ...} containing HTML entity
+         definitions (a sensible default is used).  This is used to unescape
+         entities in .get_text() (and .get_compressed_text()) and attribute
+         values.  If the encoding can not represent the character, the entity
+         reference is left unescaped.  Note that entity references (both
+         numeric - e.g. &#123; or &#xabc; - and non-numeric - e.g. &amp;) are
+         unescaped in attribute values and the return value of .get_text(), but
+         not in data outside of tags.  Instead, entity references outside of
+         tags are represented as tokens.  This is a bit odd, it's true :-/
+
+        If the element name of an opening tag matches a key in the textify
+        mapping then that tag is converted to text.  The corresponding value is
+        used to specify which tag attribute to obtain the text from.  textify
+        maps from element names to either:
+
+          - an HTML attribute name, in which case the HTML attribute value is
+            used as its text value along with the element name in square
+            brackets (eg."alt text goes here[IMG]", or, if the alt attribute
+            were missing, just "[IMG]")
+          - a callable object (eg. a function) which takes a Token and returns
+            the string to be used as its text value
+
+        If textify has no key for an element name, nothing is substituted for
+        the opening tag.
+
+        Public attributes:
+
+        encoding and textify: see above
+
+        """
+        self._fh = fh
+        self._tokenstack = []  # FIFO
+        self.textify = textify
+        self.encoding = encoding
+        if entitydefs is None:
+            entitydefs = htmlentitydefs.name2codepoint
+        self._entitydefs = entitydefs
+
+    def __iter__(self): return self
+
+    def tags(self, *names):
+        return iter_until_exception(self.get_tag, NoMoreTokensError, *names)
+
+    def tokens(self, *tokentypes):
+        return iter_until_exception(self.get_token, NoMoreTokensError, *tokentypes)
+
+    def next(self):
+        try:
+            return self.get_token()
+        except NoMoreTokensError:
+            raise StopIteration()
+
+    def get_token(self, *tokentypes):
+        """Pop the next Token object from the stack of parsed tokens.
+
+        If arguments are given, they are taken to be token types in which the
+        caller is interested: tokens representing other elements will be
+        skipped.  Element names must be given in lower case.
+
+        Raises NoMoreTokensError.
+
+        """
+        while 1:
+            while self._tokenstack:
+                token = self._tokenstack.pop(0)
+                if tokentypes:
+                    if token.type in tokentypes:
+                        return token
+                else:
+                    return token
+            data = self._fh.read(self.chunk)
+            if not data:
+                raise NoMoreTokensError()
+            self.feed(data)
+
+    def unget_token(self, token):
+        """Push a Token back onto the stack."""
+        self._tokenstack.insert(0, token)
+
+    def get_tag(self, *names):
+        """Return the next Token that represents an opening or closing tag.
+
+        If arguments are given, they are taken to be element names in which the
+        caller is interested: tags representing other elements will be skipped.
+        Element names must be given in lower case.
+
+        Raises NoMoreTokensError.
+
+        """
+        while 1:
+            tok = self.get_token()
+            if tok.type not in ["starttag", "endtag", "startendtag"]:
+                continue
+            if names:
+                if tok.data in names:
+                    return tok
+            else:
+                return tok
+
+    def get_text(self, endat=None):
+        """Get some text.
+
+        endat: stop reading text at this tag (the tag is included in the
+         returned text); endtag is a tuple (type, name) where type is
+         "starttag", "endtag" or "startendtag", and name is the element name of
+         the tag (element names must be given in lower case)
+
+        If endat is not given, .get_text() will stop at the next opening or
+        closing tag, or when there are no more tokens (no exception is raised).
+        Note that .get_text() includes the text representation (if any) of the
+        opening tag, but pushes the opening tag back onto the stack.  As a
+        result, if you want to call .get_text() again, you need to call
+        .get_tag() first (unless you want an empty string returned when you
+        next call .get_text()).
+
+        Entity references are translated using the value of the entitydefs
+        constructor argument (a mapping from names to characters like that
+        provided by the standard module htmlentitydefs).  Named entity
+        references that are not in this mapping are left unchanged.
+
+        The textify attribute is used to translate opening tags into text: see
+        the class docstring.
+
+        """
+        text = []
+        tok = None
+        while 1:
+            try:
+                tok = self.get_token()
+            except NoMoreTokensError:
+                # unget last token (not the one we just failed to get)
+                if tok: self.unget_token(tok)
+                break
+            if tok.type == "data":
+                text.append(tok.data)
+            elif tok.type == "entityref":
+                t = unescape("&%s;"%tok.data, self._entitydefs, self.encoding)
+                text.append(t)
+            elif tok.type == "charref":
+                t = unescape_charref(tok.data, self.encoding)
+                text.append(t)
+            elif tok.type in ["starttag", "endtag", "startendtag"]:
+                tag_name = tok.data
+                if tok.type in ["starttag", "startendtag"]:
+                    alt = self.textify.get(tag_name)
+                    if alt is not None:
+                        if callable(alt):
+                            text.append(alt(tok))
+                        elif tok.attrs is not None:
+                            for k, v in tok.attrs:
+                                if k == alt:
+                                    text.append(v)
+                            text.append("[%s]" % tag_name.upper())
+                if endat is None or endat == (tok.type, tag_name):
+                    self.unget_token(tok)
+                    break
+        return "".join(text)
+
+    def get_compressed_text(self, *args, **kwds):
+        """
+        As .get_text(), but collapses each group of contiguous whitespace to a
+        single space character, and removes all initial and trailing
+        whitespace.
+
+        """
+        text = self.get_text(*args, **kwds)
+        text = text.strip()
+        return self.compress_re.sub(" ", text)
+
+    def handle_startendtag(self, tag, attrs):
+        self._tokenstack.append(Token("startendtag", tag, attrs))
+    def handle_starttag(self, tag, attrs):
+        self._tokenstack.append(Token("starttag", tag, attrs))
+    def handle_endtag(self, tag):
+        self._tokenstack.append(Token("endtag", tag))
+    def handle_charref(self, name):
+        self._tokenstack.append(Token("charref", name))
+    def handle_entityref(self, name):
+        self._tokenstack.append(Token("entityref", name))
+    def handle_data(self, data):
+        self._tokenstack.append(Token("data", data))
+    def handle_comment(self, data):
+        self._tokenstack.append(Token("comment", data))
+    def handle_decl(self, decl):
+        self._tokenstack.append(Token("decl", decl))
+    def unknown_decl(self, data):
+        # XXX should this call self.error instead?
+        #self.error("unknown declaration: " + `data`)
+        self._tokenstack.append(Token("decl", data))
+    def handle_pi(self, data):
+        self._tokenstack.append(Token("pi", data))
+
+    def unescape_attr(self, name):
+        return unescape(name, self._entitydefs, self.encoding)
+    def unescape_attrs(self, attrs):
+        escaped_attrs = []
+        for key, val in attrs:
+            escaped_attrs.append((key, self.unescape_attr(val)))
+        return escaped_attrs
+
+class PullParser(_AbstractParser, HTMLParser.HTMLParser):
+    def __init__(self, *args, **kwds):
+        HTMLParser.HTMLParser.__init__(self)
+        _AbstractParser.__init__(self, *args, **kwds)
+    def unescape(self, name):
+        # Use the entitydefs passed into constructor, not
+        # HTMLParser.HTMLParser's entitydefs.
+        return self.unescape_attr(name)
+
+class TolerantPullParser(_AbstractParser, sgmllib.SGMLParser):
+    def __init__(self, *args, **kwds):
+        sgmllib.SGMLParser.__init__(self)
+        _AbstractParser.__init__(self, *args, **kwds)
+    def unknown_starttag(self, tag, attrs):
+        attrs = self.unescape_attrs(attrs)
+        self._tokenstack.append(Token("starttag", tag, attrs))
+    def unknown_endtag(self, tag):
+        self._tokenstack.append(Token("endtag", tag))
+
+
+def _test():
+   import doctest, _pullparser
+   return doctest.testmod(_pullparser)
+
+if __name__ == "__main__":
+   _test()
Index: /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_lwpcookiejar.py
===================================================================
--- /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_lwpcookiejar.py (revision 3)
+++ /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_lwpcookiejar.py (revision 3)
@@ -0,0 +1,185 @@
+"""Load / save to libwww-perl (LWP) format files.
+
+Actually, the format is slightly extended from that used by LWP's
+(libwww-perl's) HTTP::Cookies, to avoid losing some RFC 2965 information
+not recorded by LWP.
+
+It uses the version string "2.0", though really there isn't an LWP Cookies
+2.0 format.  This indicates that there is extra information in here
+(domain_dot and port_spec) while still being compatible with libwww-perl,
+I hope.
+
+Copyright 2002-2006 John J Lee <jjl@pobox.com>
+Copyright 1997-1999 Gisle Aas (original libwww-perl code)
+
+This code is free software; you can redistribute it and/or modify it
+under the terms of the BSD or ZPL 2.1 licenses (see the file
+COPYING.txt included with the distribution).
+
+"""
+
+import time, re, logging
+
+from _clientcookie import reraise_unmasked_exceptions, FileCookieJar, Cookie, \
+     MISSING_FILENAME_TEXT, LoadError
+from _headersutil import join_header_words, split_header_words
+from _util import iso2time, time2isoz
+
+debug = logging.getLogger("mechanize").debug
+
+
+def lwp_cookie_str(cookie):
+    """Return string representation of Cookie in an the LWP cookie file format.
+
+    Actually, the format is extended a bit -- see module docstring.
+
+    """
+    h = [(cookie.name, cookie.value),
+         ("path", cookie.path),
+         ("domain", cookie.domain)]
+    if cookie.port is not None: h.append(("port", cookie.port))
+    if cookie.path_specified: h.append(("path_spec", None))
+    if cookie.port_specified: h.append(("port_spec", None))
+    if cookie.domain_initial_dot: h.append(("domain_dot", None))
+    if cookie.secure: h.append(("secure", None))
+    if cookie.expires: h.append(("expires",
+                               time2isoz(float(cookie.expires))))
+    if cookie.discard: h.append(("discard", None))
+    if cookie.comment: h.append(("comment", cookie.comment))
+    if cookie.comment_url: h.append(("commenturl", cookie.comment_url))
+    if cookie.rfc2109: h.append(("rfc2109", None))
+
+    keys = cookie.nonstandard_attr_keys()
+    keys.sort()
+    for k in keys:
+        h.append((k, str(cookie.get_nonstandard_attr(k))))
+
+    h.append(("version", str(cookie.version)))
+
+    return join_header_words([h])
+
+class LWPCookieJar(FileCookieJar):
+    """
+    The LWPCookieJar saves a sequence of"Set-Cookie3" lines.
+    "Set-Cookie3" is the format used by the libwww-perl libary, not known
+    to be compatible with any browser, but which is easy to read and
+    doesn't lose information about RFC 2965 cookies.
+
+    Additional methods
+
+    as_lwp_str(ignore_discard=True, ignore_expired=True)
+
+    """
+
+    magic_re = r"^\#LWP-Cookies-(\d+\.\d+)"
+
+    def as_lwp_str(self, ignore_discard=True, ignore_expires=True):
+        """Return cookies as a string of "\n"-separated "Set-Cookie3" headers.
+
+        ignore_discard and ignore_expires: see docstring for FileCookieJar.save
+
+        """
+        now = time.time()
+        r = []
+        for cookie in self:
+            if not ignore_discard and cookie.discard:
+                debug("   Not saving %s: marked for discard", cookie.name)
+                continue
+            if not ignore_expires and cookie.is_expired(now):
+                debug("   Not saving %s: expired", cookie.name)
+                continue
+            r.append("Set-Cookie3: %s" % lwp_cookie_str(cookie))
+        return "\n".join(r+[""])
+
+    def save(self, filename=None, ignore_discard=False, ignore_expires=False):
+        if filename is None:
+            if self.filename is not None: filename = self.filename
+            else: raise ValueError(MISSING_FILENAME_TEXT)
+
+        f = open(filename, "w")
+        try:
+            debug("Saving LWP cookies file")
+            # There really isn't an LWP Cookies 2.0 format, but this indicates
+            # that there is extra information in here (domain_dot and
+            # port_spec) while still being compatible with libwww-perl, I hope.
+            f.write("#LWP-Cookies-2.0\n")
+            f.write(self.as_lwp_str(ignore_discard, ignore_expires))
+        finally:
+            f.close()
+
+    def _really_load(self, f, filename, ignore_discard, ignore_expires):
+        magic = f.readline()
+        if not re.search(self.magic_re, magic):
+            msg = "%s does not seem to contain cookies" % filename
+            raise LoadError(msg)
+
+        now = time.time()
+
+        header = "Set-Cookie3:"
+        boolean_attrs = ("port_spec", "path_spec", "domain_dot",
+                         "secure", "discard", "rfc2109")
+        value_attrs = ("version",
+                       "port", "path", "domain",
+                       "expires",
+                       "comment", "commenturl")
+
+        try:
+            while 1:
+                line = f.readline()
+                if line == "": break
+                if not line.startswith(header):
+                    continue
+                line = line[len(header):].strip()
+
+                for data in split_header_words([line]):
+                    name, value = data[0]
+                    standard = {}
+                    rest = {}
+                    for k in boolean_attrs:
+                        standard[k] = False
+                    for k, v in data[1:]:
+                        if k is not None:
+                            lc = k.lower()
+                        else:
+                            lc = None
+                        # don't lose case distinction for unknown fields
+                        if (lc in value_attrs) or (lc in boolean_attrs):
+                            k = lc
+                        if k in boolean_attrs:
+                            if v is None: v = True
+                            standard[k] = v
+                        elif k in value_attrs:
+                            standard[k] = v
+                        else:
+                            rest[k] = v
+
+                    h = standard.get
+                    expires = h("expires")
+                    discard = h("discard")
+                    if expires is not None:
+                        expires = iso2time(expires)
+                    if expires is None:
+                        discard = True
+                    domain = h("domain")
+                    domain_specified = domain.startswith(".")
+                    c = Cookie(h("version"), name, value,
+                               h("port"), h("port_spec"),
+                               domain, domain_specified, h("domain_dot"),
+                               h("path"), h("path_spec"),
+                               h("secure"),
+                               expires,
+                               discard,
+                               h("comment"),
+                               h("commenturl"),
+                               rest,
+                               h("rfc2109"),
+                               ) 
+                    if not ignore_discard and c.discard:
+                        continue
+                    if not ignore_expires and c.is_expired(now):
+                        continue
+                    self.set_cookie(c)
+        except:
+            reraise_unmasked_exceptions((IOError,))
+            raise LoadError("invalid Set-Cookie3 format file %s" % filename)
+
Index: /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_useragent.py
===================================================================
--- /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_useragent.py (revision 3)
+++ /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_useragent.py (revision 3)
@@ -0,0 +1,347 @@
+"""Convenient HTTP UserAgent class.
+
+This is a subclass of urllib2.OpenerDirector.
+
+
+Copyright 2003-2006 John J. Lee <jjl@pobox.com>
+
+This code is free software; you can redistribute it and/or modify it under
+the terms of the BSD or ZPL 2.1 licenses (see the file COPYING.txt
+included with the distribution).
+
+"""
+
+import sys, warnings, urllib2
+
+import _opener
+import _urllib2
+import _auth
+import _gzip
+import _response
+
+
+class UserAgentBase(_opener.OpenerDirector):
+    """Convenient user-agent class.
+
+    Do not use .add_handler() to add a handler for something already dealt with
+    by this code.
+
+    The only reason at present for the distinction between UserAgent and
+    UserAgentBase is so that classes that depend on .seek()able responses
+    (e.g. mechanize.Browser) can inherit from UserAgentBase.  The subclass
+    UserAgent exposes a .set_seekable_responses() method that allows switching
+    off the adding of a .seek() method to responses.
+
+    Public attributes:
+
+    addheaders: list of (name, value) pairs specifying headers to send with
+     every request, unless they are overridden in the Request instance.
+
+     >>> ua = UserAgentBase()
+     >>> ua.addheaders = [
+     ...  ("User-agent", "Mozilla/5.0 (compatible)"),
+     ...  ("From", "responsible.person@example.com")]
+
+    """
+
+    handler_classes = {
+        # scheme handlers
+        "http": _urllib2.HTTPHandler,
+        # CacheFTPHandler is buggy, at least in 2.3, so we don't use it
+        "ftp": _urllib2.FTPHandler,
+        "file": _urllib2.FileHandler,
+
+        # other handlers
+        "_unknown": _urllib2.UnknownHandler,
+        # HTTP{S,}Handler depend on HTTPErrorProcessor too
+        "_http_error": _urllib2.HTTPErrorProcessor,
+        "_http_request_upgrade": _urllib2.HTTPRequestUpgradeProcessor,
+        "_http_default_error": _urllib2.HTTPDefaultErrorHandler,
+
+        # feature handlers
+        "_basicauth": _urllib2.HTTPBasicAuthHandler,
+        "_digestauth": _urllib2.HTTPDigestAuthHandler,
+        "_redirect": _urllib2.HTTPRedirectHandler,
+        "_cookies": _urllib2.HTTPCookieProcessor,
+        "_refresh": _urllib2.HTTPRefreshProcessor,
+        "_equiv": _urllib2.HTTPEquivProcessor,
+        "_proxy": _urllib2.ProxyHandler,
+        "_proxy_basicauth": _urllib2.ProxyBasicAuthHandler,
+        "_proxy_digestauth": _urllib2.ProxyDigestAuthHandler,
+        "_robots": _urllib2.HTTPRobotRulesProcessor,
+        "_gzip": _gzip.HTTPGzipProcessor,  # experimental!
+
+        # debug handlers
+        "_debug_redirect": _urllib2.HTTPRedirectDebugProcessor,
+        "_debug_response_body": _urllib2.HTTPResponseDebugProcessor,
+        }
+
+    default_schemes = ["http", "ftp", "file"]
+    default_others = ["_unknown", "_http_error", "_http_request_upgrade",
+                      "_http_default_error",
+                      ]
+    default_features = ["_redirect", "_cookies",
+                        "_refresh", "_equiv",
+                        "_basicauth", "_digestauth",
+                        "_proxy", "_proxy_basicauth", "_proxy_digestauth",
+                        "_robots",
+                        ]
+    if hasattr(_urllib2, 'HTTPSHandler'):
+        handler_classes["https"] = _urllib2.HTTPSHandler
+        default_schemes.append("https")
+
+    def __init__(self):
+        _opener.OpenerDirector.__init__(self)
+
+        ua_handlers = self._ua_handlers = {}
+        for scheme in (self.default_schemes+
+                       self.default_others+
+                       self.default_features):
+            klass = self.handler_classes[scheme]
+            ua_handlers[scheme] = klass()
+        for handler in ua_handlers.itervalues():
+            self.add_handler(handler)
+
+        # Yuck.
+        # Ensure correct default constructor args were passed to
+        # HTTPRefreshProcessor and HTTPEquivProcessor.
+        if "_refresh" in ua_handlers:
+            self.set_handle_refresh(True)
+        if "_equiv" in ua_handlers:
+            self.set_handle_equiv(True)
+        # Ensure default password managers are installed.
+        pm = ppm = None
+        if "_basicauth" in ua_handlers or "_digestauth" in ua_handlers:
+            pm = _urllib2.HTTPPasswordMgrWithDefaultRealm()
+        if ("_proxy_basicauth" in ua_handlers or
+            "_proxy_digestauth" in ua_handlers):
+            ppm = _auth.HTTPProxyPasswordMgr()
+        self.set_password_manager(pm)
+        self.set_proxy_password_manager(ppm)
+        # set default certificate manager
+        if "https" in ua_handlers:
+            cm = _urllib2.HTTPSClientCertMgr()
+            self.set_client_cert_manager(cm)
+
+    def close(self):
+        _opener.OpenerDirector.close(self)
+        self._ua_handlers = None
+
+    # XXX
+##     def set_timeout(self, timeout):
+##         self._timeout = timeout
+##     def set_http_connection_cache(self, conn_cache):
+##         self._http_conn_cache = conn_cache
+##     def set_ftp_connection_cache(self, conn_cache):
+##         # XXX ATM, FTP has cache as part of handler; should it be separate?
+##         self._ftp_conn_cache = conn_cache
+
+    def set_handled_schemes(self, schemes):
+        """Set sequence of URL scheme (protocol) strings.
+
+        For example: ua.set_handled_schemes(["http", "ftp"])
+
+        If this fails (with ValueError) because you've passed an unknown
+        scheme, the set of handled schemes will not be changed.
+
+        """
+        want = {}
+        for scheme in schemes:
+            if scheme.startswith("_"):
+                raise ValueError("not a scheme '%s'" % scheme)
+            if scheme not in self.handler_classes:
+                raise ValueError("unknown scheme '%s'")
+            want[scheme] = None
+
+        # get rid of scheme handlers we don't want
+        for scheme, oldhandler in self._ua_handlers.items():
+            if scheme.startswith("_"): continue  # not a scheme handler
+            if scheme not in want:
+                self._replace_handler(scheme, None)
+            else:
+                del want[scheme]  # already got it
+        # add the scheme handlers that are missing
+        for scheme in want.keys():
+            self._set_handler(scheme, True)
+
+    def set_cookiejar(self, cookiejar):
+        """Set a mechanize.CookieJar, or None."""
+        self._set_handler("_cookies", obj=cookiejar)
+
+    # XXX could use Greg Stein's httpx for some of this instead?
+    # or httplib2??
+    def set_proxies(self, proxies):
+        """Set a dictionary mapping URL scheme to proxy specification, or None.
+
+        e.g. {"http": "joe:password@myproxy.example.com:3128",
+              "ftp": "proxy.example.com"}
+
+        """
+        self._set_handler("_proxy", obj=proxies)
+
+    def add_password(self, url, user, password, realm=None):
+        self._password_manager.add_password(realm, url, user, password)
+    def add_proxy_password(self, user, password, hostport=None, realm=None):
+        self._proxy_password_manager.add_password(
+            realm, hostport, user, password)
+
+    def add_client_certificate(self, url, key_file, cert_file):
+        """Add an SSL client certificate, for HTTPS client auth.
+
+        key_file and cert_file must be filenames of the key and certificate
+        files, in PEM format.  You can use e.g. OpenSSL to convert a p12 (PKCS
+        12) file to PEM format:
+
+        openssl pkcs12 -clcerts -nokeys -in cert.p12 -out cert.pem
+        openssl pkcs12 -nocerts -in cert.p12 -out key.pem
+
+
+        Note that client certificate password input is very inflexible ATM.  At
+        the moment this seems to be console only, which is presumably the
+        default behaviour of libopenssl.  In future mechanize may support
+        third-party libraries that (I assume) allow more options here.
+
+        """
+        self._client_cert_manager.add_key_cert(url, key_file, cert_file)
+
+    # the following are rarely useful -- use add_password / add_proxy_password
+    # instead
+    def set_password_manager(self, password_manager):
+        """Set a mechanize.HTTPPasswordMgrWithDefaultRealm, or None."""
+        self._password_manager = password_manager
+        self._set_handler("_basicauth", obj=password_manager)
+        self._set_handler("_digestauth", obj=password_manager)
+    def set_proxy_password_manager(self, password_manager):
+        """Set a mechanize.HTTPProxyPasswordMgr, or None."""
+        self._proxy_password_manager = password_manager
+        self._set_handler("_proxy_basicauth", obj=password_manager)
+        self._set_handler("_proxy_digestauth", obj=password_manager)
+    def set_client_cert_manager(self, cert_manager):
+        """Set a mechanize.HTTPClientCertMgr, or None."""
+        self._client_cert_manager = cert_manager
+        handler = self._ua_handlers["https"]
+        handler.client_cert_manager = cert_manager
+
+    # these methods all take a boolean parameter
+    def set_handle_robots(self, handle):
+        """Set whether to observe rules from robots.txt."""
+        self._set_handler("_robots", handle)
+    def set_handle_redirect(self, handle):
+        """Set whether to handle HTTP 30x redirections."""
+        self._set_handler("_redirect", handle)
+    def set_handle_refresh(self, handle, max_time=None, honor_time=True):
+        """Set whether to handle HTTP Refresh headers."""
+        self._set_handler("_refresh", handle, constructor_kwds=
+                          {"max_time": max_time, "honor_time": honor_time})
+    def set_handle_equiv(self, handle, head_parser_class=None):
+        """Set whether to treat HTML http-equiv headers like HTTP headers.
+
+        Response objects may be .seek()able if this is set (currently returned
+        responses are, raised HTTPError exception responses are not).
+
+        """
+        if head_parser_class is not None:
+            constructor_kwds = {"head_parser_class": head_parser_class}
+        else:
+            constructor_kwds={}
+        self._set_handler("_equiv", handle, constructor_kwds=constructor_kwds)
+    def set_handle_gzip(self, handle):
+        """Handle gzip transfer encoding.
+
+        """
+        if handle:
+            warnings.warn(
+                "gzip transfer encoding is experimental!", stacklevel=2)
+        self._set_handler("_gzip", handle)
+    def set_debug_redirects(self, handle):
+        """Log information about HTTP redirects (including refreshes).
+
+        Logging is performed using module logging.  The logger name is
+        "mechanize.http_redirects".  To actually print some debug output,
+        eg:
+
+        import sys, logging
+        logger = logging.getLogger("mechanize.http_redirects")
+        logger.addHandler(logging.StreamHandler(sys.stdout))
+        logger.setLevel(logging.INFO)
+
+        Other logger names relevant to this module:
+
+        "mechanize.http_responses"
+        "mechanize.cookies" (or "cookielib" if running Python 2.4)
+
+        To turn on everything:
+
+        import sys, logging
+        logger = logging.getLogger("mechanize")
+        logger.addHandler(logging.StreamHandler(sys.stdout))
+        logger.setLevel(logging.INFO)
+
+        """
+        self._set_handler("_debug_redirect", handle)
+    def set_debug_responses(self, handle):
+        """Log HTTP response bodies.
+
+        See docstring for .set_debug_redirects() for details of logging.
+
+        Response objects may be .seek()able if this is set (currently returned
+        responses are, raised HTTPError exception responses are not).
+
+        """
+        self._set_handler("_debug_response_body", handle)
+    def set_debug_http(self, handle):
+        """Print HTTP headers to sys.stdout."""
+        level = int(bool(handle))
+        for scheme in "http", "https":
+            h = self._ua_handlers.get(scheme)
+            if h is not None:
+                h.set_http_debuglevel(level)
+
+    def _set_handler(self, name, handle=None, obj=None,
+                     constructor_args=(), constructor_kwds={}):
+        if handle is None:
+            handle = obj is not None
+        if handle:
+            handler_class = self.handler_classes[name]
+            if obj is not None:
+                newhandler = handler_class(obj)
+            else:
+                newhandler = handler_class(*constructor_args, **constructor_kwds)
+        else:
+            newhandler = None
+        self._replace_handler(name, newhandler)
+
+    def _replace_handler(self, name, newhandler=None):
+        # first, if handler was previously added, remove it
+        if name is not None:
+            handler = self._ua_handlers.get(name)
+            if handler:
+                try:
+                    self.handlers.remove(handler)
+                except ValueError:
+                    pass
+        # then add the replacement, if any
+        if newhandler is not None:
+            self.add_handler(newhandler)
+            self._ua_handlers[name] = newhandler
+
+
+class UserAgent(UserAgentBase):
+
+    def __init__(self):
+        UserAgentBase.__init__(self)
+        self._seekable = False
+
+    def set_seekable_responses(self, handle):
+        """Make response objects .seek()able."""
+        self._seekable = bool(handle)
+
+    def open(self, fullurl, data=None):
+        if self._seekable:
+            def bound_open(fullurl, data=None):
+                return UserAgentBase.open(self, fullurl, data)
+            response = _opener.wrapped_open(
+                bound_open, _response.seek_wrapped_response, fullurl, data)
+        else:
+            response = UserAgentBase.open(self, fullurl, data)
+        return response
Index: /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_mozillacookiejar.py
===================================================================
--- /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_mozillacookiejar.py (revision 3)
+++ /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_mozillacookiejar.py (revision 3)
@@ -0,0 +1,159 @@
+"""Mozilla / Netscape cookie loading / saving.
+
+Copyright 2002-2006 John J Lee <jjl@pobox.com>
+Copyright 1997-1999 Gisle Aas (original libwww-perl code)
+
+This code is free software; you can redistribute it and/or modify it
+under the terms of the BSD or ZPL 2.1 licenses (see the file
+COPYING.txt included with the distribution).
+
+"""
+
+import re, time, logging
+
+from _clientcookie import reraise_unmasked_exceptions, FileCookieJar, Cookie, \
+     MISSING_FILENAME_TEXT, LoadError
+debug = logging.getLogger("ClientCookie").debug
+
+
+class MozillaCookieJar(FileCookieJar):
+    """
+
+    WARNING: you may want to backup your browser's cookies file if you use
+    this class to save cookies.  I *think* it works, but there have been
+    bugs in the past!
+
+    This class differs from CookieJar only in the format it uses to save and
+    load cookies to and from a file.  This class uses the Mozilla/Netscape
+    `cookies.txt' format.  lynx uses this file format, too.
+
+    Don't expect cookies saved while the browser is running to be noticed by
+    the browser (in fact, Mozilla on unix will overwrite your saved cookies if
+    you change them on disk while it's running; on Windows, you probably can't
+    save at all while the browser is running).
+
+    Note that the Mozilla/Netscape format will downgrade RFC2965 cookies to
+    Netscape cookies on saving.
+
+    In particular, the cookie version and port number information is lost,
+    together with information about whether or not Path, Port and Discard were
+    specified by the Set-Cookie2 (or Set-Cookie) header, and whether or not the
+    domain as set in the HTTP header started with a dot (yes, I'm aware some
+    domains in Netscape files start with a dot and some don't -- trust me, you
+    really don't want to know any more about this).
+
+    Note that though Mozilla and Netscape use the same format, they use
+    slightly different headers.  The class saves cookies using the Netscape
+    header by default (Mozilla can cope with that).
+
+    """
+    magic_re = "#( Netscape)? HTTP Cookie File"
+    header = """\
+    # Netscape HTTP Cookie File
+    # http://www.netscape.com/newsref/std/cookie_spec.html
+    # This is a generated file!  Do not edit.
+
+"""
+
+    def _really_load(self, f, filename, ignore_discard, ignore_expires):
+        now = time.time()
+
+        magic = f.readline()
+        if not re.search(self.magic_re, magic):
+            f.close()
+            raise LoadError(
+                "%s does not look like a Netscape format cookies file" %
+                filename)
+
+        try:
+            while 1:
+                line = f.readline()
+                if line == "": break
+
+                # last field may be absent, so keep any trailing tab
+                if line.endswith("\n"): line = line[:-1]
+
+                # skip comments and blank lines XXX what is $ for?
+                if (line.strip().startswith("#") or
+                    line.strip().startswith("$") or
+                    line.strip() == ""):
+                    continue
+
+                domain, domain_specified, path, secure, expires, name, value = \
+                        line.split("\t")
+                secure = (secure == "TRUE")
+                domain_specified = (domain_specified == "TRUE")
+                if name == "":
+                    name = value
+                    value = None
+
+                initial_dot = domain.startswith(".")
+                assert domain_specified == initial_dot
+
+                discard = False
+                if expires == "":
+                    expires = None
+                    discard = True
+
+                # assume path_specified is false
+                c = Cookie(0, name, value,
+                           None, False,
+                           domain, domain_specified, initial_dot,
+                           path, False,
+                           secure,
+                           expires,
+                           discard,
+                           None,
+                           None,
+                           {})
+                if not ignore_discard and c.discard:
+                    continue
+                if not ignore_expires and c.is_expired(now):
+                    continue
+                self.set_cookie(c)
+
+        except:
+            reraise_unmasked_exceptions((IOError,))
+            raise LoadError("invalid Netscape format file %s: %s" %
+                          (filename, line))
+
+    def save(self, filename=None, ignore_discard=False, ignore_expires=False):
+        if filename is None:
+            if self.filename is not None: filename = self.filename
+            else: raise ValueError(MISSING_FILENAME_TEXT)
+
+        f = open(filename, "w")
+        try:
+            debug("Saving Netscape cookies.txt file")
+            f.write(self.header)
+            now = time.time()
+            for cookie in self:
+                if not ignore_discard and cookie.discard:
+                    debug("   Not saving %s: marked for discard", cookie.name)
+                    continue
+                if not ignore_expires and cookie.is_expired(now):
+                    debug("   Not saving %s: expired", cookie.name)
+                    continue
+                if cookie.secure: secure = "TRUE"
+                else: secure = "FALSE"
+                if cookie.domain.startswith("."): initial_dot = "TRUE"
+                else: initial_dot = "FALSE"
+                if cookie.expires is not None:
+                    expires = str(cookie.expires)
+                else:
+                    expires = ""
+                if cookie.value is None:
+                    # cookies.txt regards 'Set-Cookie: foo' as a cookie
+                    # with no name, whereas cookielib regards it as a
+                    # cookie with no value.
+                    name = ""
+                    value = cookie.name
+                else:
+                    name = cookie.name
+                    value = cookie.value
+                f.write(
+                    "\t".join([cookie.domain, initial_dot, cookie.path,
+                               secure, expires, name, value])+
+                    "\n")
+        finally:
+            f.close()
Index: /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_response.py
===================================================================
--- /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_response.py (revision 3)
+++ /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_response.py (revision 3)
@@ -0,0 +1,514 @@
+"""Response classes.
+
+The seek_wrapper code is not used if you're using UserAgent with
+.set_seekable_responses(False), or if you're using the urllib2-level interface
+without SeekableProcessor or HTTPEquivProcessor.  Class closeable_response is
+instantiated by some handlers (AbstractHTTPHandler), but the closeable_response
+interface is only depended upon by Browser-level code.  Function
+upgrade_response is only used if you're using Browser or
+ResponseUpgradeProcessor.
+
+
+Copyright 2006 John J. Lee <jjl@pobox.com>
+
+This code is free software; you can redistribute it and/or modify it
+under the terms of the BSD or ZPL 2.1 licenses (see the file COPYING.txt
+included with the distribution).
+
+"""
+
+import copy, mimetools
+from cStringIO import StringIO
+import urllib2
+
+# XXX Andrew Dalke kindly sent me a similar class in response to my request on
+# comp.lang.python, which I then proceeded to lose.  I wrote this class
+# instead, but I think he's released his code publicly since, could pinch the
+# tests from it, at least...
+
+# For testing seek_wrapper invariant (note that
+# test_urllib2.HandlerTest.test_seekable is expected to fail when this
+# invariant checking is turned on).  The invariant checking is done by module
+# ipdc, which is available here:
+# http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/436834
+## from ipdbc import ContractBase
+## class seek_wrapper(ContractBase):
+class seek_wrapper:
+    """Adds a seek method to a file object.
+
+    This is only designed for seeking on readonly file-like objects.
+
+    Wrapped file-like object must have a read method.  The readline method is
+    only supported if that method is present on the wrapped object.  The
+    readlines method is always supported.  xreadlines and iteration are
+    supported only for Python 2.2 and above.
+
+    Public attributes:
+
+    wrapped: the wrapped file object
+    is_closed: true iff .close() has been called
+
+    WARNING: All other attributes of the wrapped object (ie. those that are not
+    one of wrapped, read, readline, readlines, xreadlines, __iter__ and next)
+    are passed through unaltered, which may or may not make sense for your
+    particular file object.
+
+    """
+    # General strategy is to check that cache is full enough, then delegate to
+    # the cache (self.__cache, which is a cStringIO.StringIO instance).  A seek
+    # position (self.__pos) is maintained independently of the cache, in order
+    # that a single cache may be shared between multiple seek_wrapper objects.
+    # Copying using module copy shares the cache in this way.
+
+    def __init__(self, wrapped):
+        self.wrapped = wrapped
+        self.__read_complete_state = [False]
+        self.__is_closed_state = [False]
+        self.__have_readline = hasattr(self.wrapped, "readline")
+        self.__cache = StringIO()
+        self.__pos = 0  # seek position
+
+    def invariant(self):
+        # The end of the cache is always at the same place as the end of the
+        # wrapped file.
+        return self.wrapped.tell() == len(self.__cache.getvalue())
+
+    def close(self):
+        self.wrapped.close()
+        self.is_closed = True
+
+    def __getattr__(self, name):
+        if name == "is_closed":
+            return self.__is_closed_state[0]
+        elif name == "read_complete":
+            return self.__read_complete_state[0]
+
+        wrapped = self.__dict__.get("wrapped")
+        if wrapped:
+            return getattr(wrapped, name)
+
+        return getattr(self.__class__, name)
+
+    def __setattr__(self, name, value):
+        if name == "is_closed":
+            self.__is_closed_state[0] = bool(value)
+        elif name == "read_complete":
+            if not self.is_closed:
+                self.__read_complete_state[0] = bool(value)
+        else:
+            self.__dict__[name] = value
+
+    def seek(self, offset, whence=0):
+        assert whence in [0,1,2]
+
+        # how much data, if any, do we need to read?
+        if whence == 2:  # 2: relative to end of *wrapped* file
+            if offset < 0: raise ValueError("negative seek offset")
+            # since we don't know yet where the end of that file is, we must
+            # read everything
+            to_read = None
+        else:
+            if whence == 0:  # 0: absolute
+                if offset < 0: raise ValueError("negative seek offset")
+                dest = offset
+            else:  # 1: relative to current position
+                pos = self.__pos
+                if pos < offset:
+                    raise ValueError("seek to before start of file")
+                dest = pos + offset
+            end = len(self.__cache.getvalue())
+            to_read = dest - end
+            if to_read < 0:
+                to_read = 0
+
+        if to_read != 0:
+            self.__cache.seek(0, 2)
+            if to_read is None:
+                assert whence == 2
+                self.__cache.write(self.wrapped.read())
+                self.read_complete = True
+                self.__pos = self.__cache.tell() - offset
+            else:
+                data = self.wrapped.read(to_read)
+                if not data:
+                    self.read_complete = True
+                else:
+                    self.__cache.write(data)
+                # Don't raise an exception even if we've seek()ed past the end
+                # of .wrapped, since fseek() doesn't complain in that case.
+                # Also like fseek(), pretend we have seek()ed past the end,
+                # i.e. not:
+                #self.__pos = self.__cache.tell()
+                # but rather:
+                self.__pos = dest
+        else:
+            self.__pos = dest
+
+    def tell(self):
+        return self.__pos
+
+    def __copy__(self):
+        cpy = self.__class__(self.wrapped)
+        cpy.__cache = self.__cache
+        cpy.__read_complete_state = self.__read_complete_state
+        cpy.__is_closed_state = self.__is_closed_state
+        return cpy
+
+    def get_data(self):
+        pos = self.__pos
+        try:
+            self.seek(0)
+            return self.read(-1)
+        finally:
+            self.__pos = pos
+
+    def read(self, size=-1):
+        pos = self.__pos
+        end = len(self.__cache.getvalue())
+        available = end - pos
+
+        # enough data already cached?
+        if size <= available and size != -1:
+            self.__cache.seek(pos)
+            self.__pos = pos+size
+            return self.__cache.read(size)
+
+        # no, so read sufficient data from wrapped file and cache it
+        self.__cache.seek(0, 2)
+        if size == -1:
+            self.__cache.write(self.wrapped.read())
+            self.read_complete = True
+        else:
+            to_read = size - available
+            assert to_read > 0
+            data = self.wrapped.read(to_read)
+            if not data:
+                self.read_complete = True
+            else:
+                self.__cache.write(data)
+        self.__cache.seek(pos)
+
+        data = self.__cache.read(size)
+        self.__pos = self.__cache.tell()
+        assert self.__pos == pos + len(data)
+        return data
+
+    def readline(self, size=-1):
+        if not self.__have_readline:
+            raise NotImplementedError("no readline method on wrapped object")
+
+        # line we're about to read might not be complete in the cache, so
+        # read another line first
+        pos = self.__pos
+        self.__cache.seek(0, 2)
+        data = self.wrapped.readline()
+        if not data:
+            self.read_complete = True
+        else:
+            self.__cache.write(data)
+        self.__cache.seek(pos)
+
+        data = self.__cache.readline()
+        if size != -1:
+            r = data[:size]
+            self.__pos = pos+size
+        else:
+            r = data
+            self.__pos = pos+len(data)
+        return r
+
+    def readlines(self, sizehint=-1):
+        pos = self.__pos
+        self.__cache.seek(0, 2)
+        self.__cache.write(self.wrapped.read())
+        self.read_complete = True
+        self.__cache.seek(pos)
+        data = self.__cache.readlines(sizehint)
+        self.__pos = self.__cache.tell()
+        return data
+
+    def __iter__(self): return self
+    def next(self):
+        line = self.readline()
+        if line == "": raise StopIteration
+        return line
+
+    xreadlines = __iter__
+
+    def __repr__(self):
+        return ("<%s at %s whose wrapped object = %r>" %
+                (self.__class__.__name__, hex(abs(id(self))), self.wrapped))
+
+
+class response_seek_wrapper(seek_wrapper):
+
+    """
+    Supports copying response objects and setting response body data.
+
+    """
+
+    def __init__(self, wrapped):
+        seek_wrapper.__init__(self, wrapped)
+        self._headers = self.wrapped.info()
+
+    def __copy__(self):
+        cpy = seek_wrapper.__copy__(self)
+        # copy headers from delegate
+        cpy._headers = copy.copy(self.info())
+        return cpy
+
+    # Note that .info() and .geturl() (the only two urllib2 response methods
+    # that are not implemented by seek_wrapper) must be here explicitly rather
+    # than by seek_wrapper's __getattr__ delegation) so that the nasty
+    # dynamically-created HTTPError classes in get_seek_wrapper_class() get the
+    # wrapped object's implementation, and not HTTPError's.
+
+    def info(self):
+        return self._headers
+
+    def geturl(self):
+        return self.wrapped.geturl()
+
+    def set_data(self, data):
+        self.seek(0)
+        self.read()
+        self.close()
+        cache = self._seek_wrapper__cache = StringIO()
+        cache.write(data)
+        self.seek(0)
+
+
+class eoffile:
+    # file-like object that always claims to be at end-of-file...
+    def read(self, size=-1): return ""
+    def readline(self, size=-1): return ""
+    def __iter__(self): return self
+    def next(self): return ""
+    def close(self): pass
+
+class eofresponse(eoffile):
+    def __init__(self, url, headers, code, msg):
+        self._url = url
+        self._headers = headers
+        self.code = code
+        self.msg = msg
+    def geturl(self): return self._url
+    def info(self): return self._headers
+
+
+class closeable_response:
+    """Avoids unnecessarily clobbering urllib.addinfourl methods on .close().
+
+    Only supports responses returned by mechanize.HTTPHandler.
+
+    After .close(), the following methods are supported:
+
+    .read()
+    .readline()
+    .info()
+    .geturl()
+    .__iter__()
+    .next()
+    .close()
+
+    and the following attributes are supported:
+
+    .code
+    .msg
+
+    Also supports pickling (but the stdlib currently does something to prevent
+    it: http://python.org/sf/1144636).
+
+    """
+    # presence of this attr indicates is useable after .close()
+    closeable_response = None
+
+    def __init__(self, fp, headers, url, code, msg):
+        self._set_fp(fp)
+        self._headers = headers
+        self._url = url
+        self.code = code
+        self.msg = msg
+
+    def _set_fp(self, fp):
+        self.fp = fp
+        self.read = self.fp.read
+        self.readline = self.fp.readline
+        if hasattr(self.fp, "readlines"): self.readlines = self.fp.readlines
+        if hasattr(self.fp, "fileno"):
+            self.fileno = self.fp.fileno
+        else:
+            self.fileno = lambda: None
+        self.__iter__ = self.fp.__iter__
+        self.next = self.fp.next
+
+    def __repr__(self):
+        return '<%s at %s whose fp = %r>' % (
+            self.__class__.__name__, hex(abs(id(self))), self.fp)
+
+    def info(self):
+        return self._headers
+
+    def geturl(self):
+        return self._url
+
+    def close(self):
+        wrapped = self.fp
+        wrapped.close()
+        new_wrapped = eofresponse(
+            self._url, self._headers, self.code, self.msg)
+        self._set_fp(new_wrapped)
+
+    def __getstate__(self):
+        # There are three obvious options here:
+        # 1. truncate
+        # 2. read to end
+        # 3. close socket, pickle state including read position, then open
+        #    again on unpickle and use Range header
+        # XXXX um, 4. refuse to pickle unless .close()d.  This is better,
+        #  actually ("errors should never pass silently").  Pickling doesn't
+        #  work anyway ATM, because of http://python.org/sf/1144636 so fix
+        #  this later
+
+        # 2 breaks pickle protocol, because one expects the original object
+        # to be left unscathed by pickling.  3 is too complicated and
+        # surprising (and too much work ;-) to happen in a sane __getstate__.
+        # So we do 1.
+
+        state = self.__dict__.copy()
+        new_wrapped = eofresponse(
+            self._url, self._headers, self.code, self.msg)
+        state["wrapped"] = new_wrapped
+        return state
+
+def test_response(data='test data', headers=[],
+                  url="http://example.com/", code=200, msg="OK"):
+    return make_response(data, headers, url, code, msg)
+
+def test_html_response(data='test data', headers=[],
+                       url="http://example.com/", code=200, msg="OK"):
+    headers += [("Content-type", "text/html")]
+    return make_response(data, headers, url, code, msg)
+
+def make_response(data, headers, url, code, msg):
+    """Convenient factory for objects implementing response interface.
+
+    data: string containing response body data
+    headers: sequence of (name, value) pairs
+    url: URL of response
+    code: integer response code (e.g. 200)
+    msg: string response code message (e.g. "OK")
+
+    """
+    mime_headers = make_headers(headers)
+    r = closeable_response(StringIO(data), mime_headers, url, code, msg)
+    return response_seek_wrapper(r)
+
+
+def make_headers(headers):
+    """
+    headers: sequence of (name, value) pairs
+    """
+    hdr_text = []
+    for name_value in headers:
+        hdr_text.append("%s: %s" % name_value)
+    return mimetools.Message(StringIO("\n".join(hdr_text)))
+
+
+# Rest of this module is especially horrible, but needed, at least until fork
+# urllib2.  Even then, may want to preseve urllib2 compatibility.
+
+def get_seek_wrapper_class(response):
+    # in order to wrap response objects that are also exceptions, we must
+    # dynamically subclass the exception :-(((
+    if (isinstance(response, urllib2.HTTPError) and
+        not hasattr(response, "seek")):
+        if response.__class__.__module__ == "__builtin__":
+            exc_class_name = response.__class__.__name__
+        else:
+            exc_class_name = "%s.%s" % (
+                response.__class__.__module__, response.__class__.__name__)
+
+        class httperror_seek_wrapper(response_seek_wrapper, response.__class__):
+            # this only derives from HTTPError in order to be a subclass --
+            # the HTTPError behaviour comes from delegation
+
+            _exc_class_name = exc_class_name
+
+            def __init__(self, wrapped):
+                response_seek_wrapper.__init__(self, wrapped)
+                # be compatible with undocumented HTTPError attributes :-(
+                self.hdrs = wrapped.info()
+                self.filename = wrapped.geturl()
+
+            def __repr__(self):
+                return (
+                    "<%s (%s instance) at %s "
+                    "whose wrapped object = %r>" % (
+                    self.__class__.__name__, self._exc_class_name,
+                    hex(abs(id(self))), self.wrapped)
+                    )
+        wrapper_class = httperror_seek_wrapper
+    else:
+        wrapper_class = response_seek_wrapper
+    return wrapper_class
+
+def seek_wrapped_response(response):
+    """Return a copy of response that supports seekable response interface.
+
+    Accepts responses from both mechanize and urllib2 handlers.
+
+    Copes with both oridinary response instances and HTTPError instances (which
+    can't be simply wrapped due to the requirement of preserving the exception
+    base class).
+    """
+    if not hasattr(response, "seek"):
+        wrapper_class = get_seek_wrapper_class(response)
+        response = wrapper_class(response)
+    assert hasattr(response, "get_data")
+    return response
+
+def upgrade_response(response):
+    """Return a copy of response that supports Browser response interface.
+
+    Browser response interface is that of "seekable responses"
+    (response_seek_wrapper), plus the requirement that responses must be
+    useable after .close() (closeable_response).
+
+    Accepts responses from both mechanize and urllib2 handlers.
+
+    Copes with both ordinary response instances and HTTPError instances (which
+    can't be simply wrapped due to the requirement of preserving the exception
+    base class).
+    """
+    wrapper_class = get_seek_wrapper_class(response)
+    if hasattr(response, "closeable_response"):
+        if not hasattr(response, "seek"):
+            response = wrapper_class(response)
+        assert hasattr(response, "get_data")
+        return copy.copy(response)
+
+    # a urllib2 handler constructed the response, i.e. the response is an
+    # urllib.addinfourl or a urllib2.HTTPError, instead of a
+    # _Util.closeable_response as returned by e.g. mechanize.HTTPHandler
+    try:
+        code = response.code
+    except AttributeError:
+        code = None
+    try:
+        msg = response.msg
+    except AttributeError:
+        msg = None
+
+    # may have already-.read() data from .seek() cache
+    data = None
+    get_data = getattr(response, "get_data", None)
+    if get_data:
+        data = get_data()
+
+    response = closeable_response(
+        response.fp, response.info(), response.geturl(), code, msg)
+    response = wrapper_class(response)
+    if data:
+        response.set_data(data)
+    return response
Index: /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/__init__.py
===================================================================
--- /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/__init__.py (revision 3)
+++ /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/__init__.py (revision 3)
@@ -0,0 +1,123 @@
+__all__ = [
+    'AbstractBasicAuthHandler',
+    'AbstractDigestAuthHandler',
+    'BaseHandler',
+    'Browser',
+    'BrowserStateError',
+    'CacheFTPHandler',
+    'ContentTooShortError',
+    'Cookie',
+    'CookieJar',
+    'CookiePolicy',
+    'DefaultCookiePolicy',
+    'DefaultFactory',
+    'FTPHandler',
+    'Factory',
+    'FileCookieJar',
+    'FileHandler',
+    'FormNotFoundError',
+    'FormsFactory',
+    'HTTPBasicAuthHandler',
+    'HTTPCookieProcessor',
+    'HTTPDefaultErrorHandler',
+    'HTTPDigestAuthHandler',
+    'HTTPEquivProcessor',
+    'HTTPError',
+    'HTTPErrorProcessor',
+    'HTTPHandler',
+    'HTTPPasswordMgr',
+    'HTTPPasswordMgrWithDefaultRealm',
+    'HTTPProxyPasswordMgr',
+    'HTTPRedirectDebugProcessor',
+    'HTTPRedirectHandler',
+    'HTTPRefererProcessor',
+    'HTTPRefreshProcessor',
+    'HTTPRequestUpgradeProcessor',
+    'HTTPResponseDebugProcessor',
+    'HTTPRobotRulesProcessor',
+    'HTTPSClientCertMgr',
+    'HTTPSHandler',
+    'HeadParser',
+    'History',
+    'LWPCookieJar',
+    'Link',
+    'LinkNotFoundError',
+    'LinksFactory',
+    'LoadError',
+    'MSIECookieJar',
+    'MozillaCookieJar',
+    'OpenerDirector',
+    'OpenerFactory',
+    'ParseError',
+    'ProxyBasicAuthHandler',
+    'ProxyDigestAuthHandler',
+    'ProxyHandler',
+    'Request',
+    'ResponseUpgradeProcessor',
+    'RobotExclusionError',
+    'RobustFactory',
+    'RobustFormsFactory',
+    'RobustLinksFactory',
+    'RobustTitleFactory',
+    'SeekableProcessor',
+    'SeekableResponseOpener',
+    'TitleFactory',
+    'URLError',
+    'USE_BARE_EXCEPT',
+    'UnknownHandler',
+    'UserAgent',
+    'UserAgentBase',
+    'XHTMLCompatibleHeadParser',
+    '__version__',
+    'build_opener',
+    'install_opener',
+    'lwp_cookie_str',
+    'make_response',
+    'request_host',
+    'response_seek_wrapper',  # XXX deprecate in public interface?
+    'seek_wrapped_response'   # XXX should probably use this internally in place of response_seek_wrapper()
+    'str2time',
+    'urlopen',
+    'urlretrieve']
+
+from _mechanize import __version__
+
+# high-level stateful browser-style interface
+from _mechanize import \
+     Browser, History, \
+     BrowserStateError, LinkNotFoundError, FormNotFoundError
+
+# configurable URL-opener interface
+from _useragent import UserAgentBase, UserAgent
+from _html import \
+     ParseError, \
+     Link, \
+     Factory, DefaultFactory, RobustFactory, \
+     FormsFactory, LinksFactory, TitleFactory, \
+     RobustFormsFactory, RobustLinksFactory, RobustTitleFactory
+
+# urllib2 work-alike interface (part from mechanize, part from urllib2)
+# This is a superset of the urllib2 interface.
+from _urllib2 import *
+
+# misc
+from _opener import ContentTooShortError, OpenerFactory, urlretrieve
+from _util import http2time as str2time
+from _response import \
+     response_seek_wrapper, seek_wrapped_response, make_response
+from _http import HeadParser
+try:
+    from _http import XHTMLCompatibleHeadParser
+except ImportError:
+    pass
+
+# cookies
+from _clientcookie import Cookie, CookiePolicy, DefaultCookiePolicy, \
+     CookieJar, FileCookieJar, LoadError, request_host
+from _lwpcookiejar import LWPCookieJar, lwp_cookie_str
+from _mozillacookiejar import MozillaCookieJar
+from _msiecookiejar import MSIECookieJar
+
+# If you hate the idea of turning bugs into warnings, do:
+# import mechanize; mechanize.USE_BARE_EXCEPT = False
+USE_BARE_EXCEPT = True
Index: /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_auth.py
===================================================================
--- /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_auth.py (revision 3)
+++ /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_auth.py (revision 3)
@@ -0,0 +1,500 @@
+"""HTTP Authentication and Proxy support.
+
+All but HTTPProxyPasswordMgr come from Python 2.5.
+
+
+Copyright 2006 John J. Lee <jjl@pobox.com>
+
+This code is free software; you can redistribute it and/or modify it under
+the terms of the BSD or ZPL 2.1 licenses (see the file COPYING.txt
+included with the distribution).
+
+"""
+
+import re, base64, urlparse, posixpath, md5, sha, sys, copy
+
+from urllib2 import BaseHandler
+from urllib import getproxies, unquote, splittype, splituser, splitpasswd, \
+     splitport
+
+
+def _parse_proxy(proxy):
+    """Return (scheme, user, password, host/port) given a URL or an authority.
+
+    If a URL is supplied, it must have an authority (host:port) component.
+    According to RFC 3986, having an authority component means the URL must
+    have two slashes after the scheme:
+
+    >>> _parse_proxy('file:/ftp.example.com/')
+    Traceback (most recent call last):
+    ValueError: proxy URL with no authority: 'file:/ftp.example.com/'
+
+    The first three items of the returned tuple may be None.
+
+    Examples of authority parsing:
+
+    >>> _parse_proxy('proxy.example.com')
+    (None, None, None, 'proxy.example.com')
+    >>> _parse_proxy('proxy.example.com:3128')
+    (None, None, None, 'proxy.example.com:3128')
+
+    The authority component may optionally include userinfo (assumed to be
+    username:password):
+
+    >>> _parse_proxy('joe:password@proxy.example.com')
+    (None, 'joe', 'password', 'proxy.example.com')
+    >>> _parse_proxy('joe:password@proxy.example.com:3128')
+    (None, 'joe', 'password', 'proxy.example.com:3128')
+
+    Same examples, but with URLs instead:
+
+    >>> _parse_proxy('http://proxy.example.com/')
+    ('http', None, None, 'proxy.example.com')
+    >>> _parse_proxy('http://proxy.example.com:3128/')
+    ('http', None, None, 'proxy.example.com:3128')
+    >>> _parse_proxy('http://joe:password@proxy.example.com/')
+    ('http', 'joe', 'password', 'proxy.example.com')
+    >>> _parse_proxy('http://joe:password@proxy.example.com:3128')
+    ('http', 'joe', 'password', 'proxy.example.com:3128')
+
+    Everything after the authority is ignored:
+
+    >>> _parse_proxy('ftp://joe:password@proxy.example.com/rubbish:3128')
+    ('ftp', 'joe', 'password', 'proxy.example.com')
+
+    Test for no trailing '/' case:
+
+    >>> _parse_proxy('http://joe:password@proxy.example.com')
+    ('http', 'joe', 'password', 'proxy.example.com')
+
+    """
+    scheme, r_scheme = splittype(proxy)
+    if not r_scheme.startswith("/"):
+        # authority
+        scheme = None
+        authority = proxy
+    else:
+        # URL
+        if not r_scheme.startswith("//"):
+            raise ValueError("proxy URL with no authority: %r" % proxy)
+        # We have an authority, so for RFC 3986-compliant URLs (by ss 3.
+        # and 3.3.), path is empty or starts with '/'
+        end = r_scheme.find("/", 2)
+        if end == -1:
+            end = None
+        authority = r_scheme[2:end]
+    userinfo, hostport = splituser(authority)
+    if userinfo is not None:
+        user, password = splitpasswd(userinfo)
+    else:
+        user = password = None
+    return scheme, user, password, hostport
+
+class ProxyHandler(BaseHandler):
+    # Proxies must be in front
+    handler_order = 100
+
+    def __init__(self, proxies=None):
+        if proxies is None:
+            proxies = getproxies()
+        assert hasattr(proxies, 'has_key'), "proxies must be a mapping"
+        self.proxies = proxies
+        for type, url in proxies.items():
+            setattr(self, '%s_open' % type,
+                    lambda r, proxy=url, type=type, meth=self.proxy_open: \
+                    meth(r, proxy, type))
+
+    def proxy_open(self, req, proxy, type):
+        orig_type = req.get_type()
+        proxy_type, user, password, hostport = _parse_proxy(proxy)
+        if proxy_type is None:
+            proxy_type = orig_type
+        if user and password:
+            user_pass = '%s:%s' % (unquote(user), unquote(password))
+            creds = base64.encodestring(user_pass).strip()
+            req.add_header('Proxy-authorization', 'Basic ' + creds)
+        hostport = unquote(hostport)
+        req.set_proxy(hostport, proxy_type)
+        if orig_type == proxy_type:
+            # let other handlers take care of it
+            return None
+        else:
+            # need to start over, because the other handlers don't
+            # grok the proxy's URL type
+            # e.g. if we have a constructor arg proxies like so:
+            # {'http': 'ftp://proxy.example.com'}, we may end up turning
+            # a request for http://acme.example.com/a into one for
+            # ftp://proxy.example.com/a
+            return self.parent.open(req)
+
+class HTTPPasswordMgr:
+
+    def __init__(self):
+        self.passwd = {}
+
+    def add_password(self, realm, uri, user, passwd):
+        # uri could be a single URI or a sequence
+        if isinstance(uri, basestring):
+            uri = [uri]
+        if not realm in self.passwd:
+            self.passwd[realm] = {}
+        for default_port in True, False:
+            reduced_uri = tuple(
+                [self.reduce_uri(u, default_port) for u in uri])
+            self.passwd[realm][reduced_uri] = (user, passwd)
+
+    def find_user_password(self, realm, authuri):
+        domains = self.passwd.get(realm, {})
+        for default_port in True, False:
+            reduced_authuri = self.reduce_uri(authuri, default_port)
+            for uris, authinfo in domains.iteritems():
+                for uri in uris:
+                    if self.is_suburi(uri, reduced_authuri):
+                        return authinfo
+        return None, None
+
+    def reduce_uri(self, uri, default_port=True):
+        """Accept authority or URI and extract only the authority and path."""
+        # note HTTP URLs do not have a userinfo component
+        parts = urlparse.urlsplit(uri)
+        if parts[1]:
+            # URI
+            scheme = parts[0]
+            authority = parts[1]
+            path = parts[2] or '/'
+        else:
+            # host or host:port
+            scheme = None
+            authority = uri
+            path = '/'
+        host, port = splitport(authority)
+        if default_port and port is None and scheme is not None:
+            dport = {"http": 80,
+                     "https": 443,
+                     }.get(scheme)
+            if dport is not None:
+                authority = "%s:%d" % (host, dport)
+        return authority, path
+
+    def is_suburi(self, base, test):
+        """Check if test is below base in a URI tree
+
+        Both args must be URIs in reduced form.
+        """
+        if base == test:
+            return True
+        if base[0] != test[0]:
+            return False
+        common = posixpath.commonprefix((base[1], test[1]))
+        if len(common) == len(base[1]):
+            return True
+        return False
+
+
+class HTTPPasswordMgrWithDefaultRealm(HTTPPasswordMgr):
+
+    def find_user_password(self, realm, authuri):
+        user, password = HTTPPasswordMgr.find_user_password(self, realm,
+                                                            authuri)
+        if user is not None:
+            return user, password
+        return HTTPPasswordMgr.find_user_password(self, None, authuri)
+
+
+class AbstractBasicAuthHandler:
+
+    rx = re.compile('[ \t]*([^ \t]+)[ \t]+realm="([^"]*)"', re.I)
+
+    # XXX there can actually be multiple auth-schemes in a
+    # www-authenticate header.  should probably be a lot more careful
+    # in parsing them to extract multiple alternatives
+
+    def __init__(self, password_mgr=None):
+        if password_mgr is None:
+            password_mgr = HTTPPasswordMgr()
+        self.passwd = password_mgr
+        self.add_password = self.passwd.add_password
+
+    def http_error_auth_reqed(self, authreq, host, req, headers):
+        # host may be an authority (without userinfo) or a URL with an
+        # authority
+        # XXX could be multiple headers
+        authreq = headers.get(authreq, None)
+        if authreq:
+            mo = AbstractBasicAuthHandler.rx.search(authreq)
+            if mo:
+                scheme, realm = mo.groups()
+                if scheme.lower() == 'basic':
+                    return self.retry_http_basic_auth(host, req, realm)
+
+    def retry_http_basic_auth(self, host, req, realm):
+        user, pw = self.passwd.find_user_password(realm, host)
+        if pw is not None:
+            raw = "%s:%s" % (user, pw)
+            auth = 'Basic %s' % base64.encodestring(raw).strip()
+            if req.headers.get(self.auth_header, None) == auth:
+                return None
+            newreq = copy.copy(req)
+            newreq.add_header(self.auth_header, auth)
+            newreq.visit = False
+            return self.parent.open(newreq)
+        else:
+            return None
+
+
+class HTTPBasicAuthHandler(AbstractBasicAuthHandler, BaseHandler):
+
+    auth_header = 'Authorization'
+
+    def http_error_401(self, req, fp, code, msg, headers):
+        url = req.get_full_url()
+        return self.http_error_auth_reqed('www-authenticate',
+                                          url, req, headers)
+
+
+class ProxyBasicAuthHandler(AbstractBasicAuthHandler, BaseHandler):
+
+    auth_header = 'Proxy-authorization'
+
+    def http_error_407(self, req, fp, code, msg, headers):
+        # http_error_auth_reqed requires that there is no userinfo component in
+        # authority.  Assume there isn't one, since urllib2 does not (and
+        # should not, RFC 3986 s. 3.2.1) support requests for URLs containing
+        # userinfo.
+        authority = req.get_host()
+        return self.http_error_auth_reqed('proxy-authenticate',
+                                          authority, req, headers)
+
+
+def randombytes(n):
+    """Return n random bytes."""
+    # Use /dev/urandom if it is available.  Fall back to random module
+    # if not.  It might be worthwhile to extend this function to use
+    # other platform-specific mechanisms for getting random bytes.
+    if os.path.exists("/dev/urandom"):
+        f = open("/dev/urandom")
+        s = f.read(n)
+        f.close()
+        return s
+    else:
+        L = [chr(random.randrange(0, 256)) for i in range(n)]
+        return "".join(L)
+
+class AbstractDigestAuthHandler:
+    # Digest authentication is specified in RFC 2617.
+
+    # XXX The client does not inspect the Authentication-Info header
+    # in a successful response.
+
+    # XXX It should be possible to test this implementation against
+    # a mock server that just generates a static set of challenges.
+
+    # XXX qop="auth-int" supports is shaky
+
+    def __init__(self, passwd=None):
+        if passwd is None:
+            passwd = HTTPPasswordMgr()
+        self.passwd = passwd
+        self.add_password = self.passwd.add_password
+        self.retried = 0
+        self.nonce_count = 0
+
+    def reset_retry_count(self):
+        self.retried = 0
+
+    def http_error_auth_reqed(self, auth_header, host, req, headers):
+        authreq = headers.get(auth_header, None)
+        if self.retried > 5:
+            # Don't fail endlessly - if we failed once, we'll probably
+            # fail a second time. Hm. Unless the Password Manager is
+            # prompting for the information. Crap. This isn't great
+            # but it's better than the current 'repeat until recursion
+            # depth exceeded' approach <wink>
+            raise HTTPError(req.get_full_url(), 401, "digest auth failed",
+                            headers, None)
+        else:
+            self.retried += 1
+        if authreq:
+            scheme = authreq.split()[0]
+            if scheme.lower() == 'digest':
+                return self.retry_http_digest_auth(req, authreq)
+
+    def retry_http_digest_auth(self, req, auth):
+        token, challenge = auth.split(' ', 1)
+        chal = parse_keqv_list(parse_http_list(challenge))
+        auth = self.get_authorization(req, chal)
+        if auth:
+            auth_val = 'Digest %s' % auth
+            if req.headers.get(self.auth_header, None) == auth_val:
+                return None
+            newreq = copy.copy(req)
+            newreq.add_unredirected_header(self.auth_header, auth_val)
+            newreq.visit = False
+            return self.parent.open(newreq)
+
+    def get_cnonce(self, nonce):
+        # The cnonce-value is an opaque
+        # quoted string value provided by the client and used by both client
+        # and server to avoid chosen plaintext attacks, to provide mutual
+        # authentication, and to provide some message integrity protection.
+        # This isn't a fabulous effort, but it's probably Good Enough.
+        dig = sha.new("%s:%s:%s:%s" % (self.nonce_count, nonce, time.ctime(),
+                                       randombytes(8))).hexdigest()
+        return dig[:16]
+
+    def get_authorization(self, req, chal):
+        try:
+            realm = chal['realm']
+            nonce = chal['nonce']
+            qop = chal.get('qop')
+            algorithm = chal.get('algorithm', 'MD5')
+            # mod_digest doesn't send an opaque, even though it isn't
+            # supposed to be optional
+            opaque = chal.get('opaque', None)
+        except KeyError:
+            return None
+
+        H, KD = self.get_algorithm_impls(algorithm)
+        if H is None:
+            return None
+
+        user, pw = self.passwd.find_user_password(realm, req.get_full_url())
+        if user is None:
+            return None
+
+        # XXX not implemented yet
+        if req.has_data():
+            entdig = self.get_entity_digest(req.get_data(), chal)
+        else:
+            entdig = None
+
+        A1 = "%s:%s:%s" % (user, realm, pw)
+        A2 = "%s:%s" % (req.get_method(),
+                        # XXX selector: what about proxies and full urls
+                        req.get_selector())
+        if qop == 'auth':
+            self.nonce_count += 1
+            ncvalue = '%08x' % self.nonce_count
+            cnonce = self.get_cnonce(nonce)
+            noncebit = "%s:%s:%s:%s:%s" % (nonce, ncvalue, cnonce, qop, H(A2))
+            respdig = KD(H(A1), noncebit)
+        elif qop is None:
+            respdig = KD(H(A1), "%s:%s" % (nonce, H(A2)))
+        else:
+            # XXX handle auth-int.
+            pass
+
+        # XXX should the partial digests be encoded too?
+
+        base = 'username="%s", realm="%s", nonce="%s", uri="%s", ' \
+               'response="%s"' % (user, realm, nonce, req.get_selector(),
+                                  respdig)
+        if opaque:
+            base += ', opaque="%s"' % opaque
+        if entdig:
+            base += ', digest="%s"' % entdig
+        base += ', algorithm="%s"' % algorithm
+        if qop:
+            base += ', qop=auth, nc=%s, cnonce="%s"' % (ncvalue, cnonce)
+        return base
+
+    def get_algorithm_impls(self, algorithm):
+        # lambdas assume digest modules are imported at the top level
+        if algorithm == 'MD5':
+            H = lambda x: md5.new(x).hexdigest()
+        elif algorithm == 'SHA':
+            H = lambda x: sha.new(x).hexdigest()
+        # XXX MD5-sess
+        KD = lambda s, d: H("%s:%s" % (s, d))
+        return H, KD
+
+    def get_entity_digest(self, data, chal):
+        # XXX not implemented yet
+        return None
+
+
+class HTTPDigestAuthHandler(BaseHandler, AbstractDigestAuthHandler):
+    """An authentication protocol defined by RFC 2069
+
+    Digest authentication improves on basic authentication because it
+    does not transmit passwords in the clear.
+    """
+
+    auth_header = 'Authorization'
+    handler_order = 490
+
+    def http_error_401(self, req, fp, code, msg, headers):
+        host = urlparse.urlparse(req.get_full_url())[1]
+        retry = self.http_error_auth_reqed('www-authenticate',
+                                           host, req, headers)
+        self.reset_retry_count()
+        return retry
+
+
+class ProxyDigestAuthHandler(BaseHandler, AbstractDigestAuthHandler):
+
+    auth_header = 'Proxy-Authorization'
+    handler_order = 490
+
+    def http_error_407(self, req, fp, code, msg, headers):
+        host = req.get_host()
+        retry = self.http_error_auth_reqed('proxy-authenticate',
+                                           host, req, headers)
+        self.reset_retry_count()
+        return retry
+
+
+# XXX ugly implementation, should probably not bother deriving
+class HTTPProxyPasswordMgr(HTTPPasswordMgr):
+    # has default realm and host/port
+    def add_password(self, realm, uri, user, passwd):
+        # uri could be a single URI or a sequence
+        if uri is None or isinstance(uri, basestring):
+            uris = [uri]
+        else:
+            uris = uri
+        passwd_by_domain = self.passwd.setdefault(realm, {})
+        for uri in uris:
+            for default_port in True, False:
+                reduced_uri = self.reduce_uri(uri, default_port)
+                passwd_by_domain[reduced_uri] = (user, passwd)
+
+    def find_user_password(self, realm, authuri):
+        attempts = [(realm, authuri), (None, authuri)]
+        # bleh, want default realm to take precedence over default
+        # URI/authority, hence this outer loop
+        for default_uri in False, True:
+            for realm, authuri in attempts:
+                authinfo_by_domain = self.passwd.get(realm, {})
+                for default_port in True, False:
+                    reduced_authuri = self.reduce_uri(authuri, default_port)
+                    for uri, authinfo in authinfo_by_domain.iteritems():
+                        if uri is None and not default_uri:
+                            continue
+                        if self.is_suburi(uri, reduced_authuri):
+                            return authinfo
+                    user, password = None, None
+
+                    if user is not None:
+                        break
+        return user, password
+
+    def reduce_uri(self, uri, default_port=True):
+        if uri is None:
+            return None
+        return HTTPPasswordMgr.reduce_uri(self, uri, default_port)
+
+    def is_suburi(self, base, test):
+        if base is None:
+            # default to the proxy's host/port
+            hostport, path = test
+            base = (hostport, "/")
+        return HTTPPasswordMgr.is_suburi(self, base, test)
+
+
+class HTTPSClientCertMgr(HTTPPasswordMgr):
+    # implementation inheritance: this is not a proper subclass
+    def add_key_cert(self, uri, key_file, cert_file):
+        self.add_password(None, uri, key_file, cert_file)
+    def find_key_cert(self, authuri):
+        return HTTPPasswordMgr.find_user_password(self, None, authuri)
Index: /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_mechanize.py
===================================================================
--- /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_mechanize.py (revision 3)
+++ /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_mechanize.py (revision 3)
@@ -0,0 +1,678 @@
+"""Stateful programmatic WWW navigation, after Perl's WWW::Mechanize.
+
+Copyright 2003-2006 John J. Lee <jjl@pobox.com>
+Copyright 2003 Andy Lester (original Perl code)
+
+This code is free software; you can redistribute it and/or modify it
+under the terms of the BSD or ZPL 2.1 licenses (see the file COPYING.txt
+included with the distribution).
+
+"""
+
+import urllib2, sys, copy, re, os, urllib
+
+
+from _useragent import UserAgentBase
+from _html import DefaultFactory
+import _response
+import _request
+import _rfc3986
+
+__version__ = (0, 1, 8, "b", None)  # 0.1.8b
+
+class BrowserStateError(Exception): pass
+class LinkNotFoundError(Exception): pass
+class FormNotFoundError(Exception): pass
+
+
+def sanepathname2url(path):
+    urlpath = urllib.pathname2url(path)
+    if os.name == "nt" and urlpath.startswith("///"):
+        urlpath = urlpath[2:]
+    # XXX don't ask me about the mac...
+    return urlpath
+
+
+class History:
+    """
+
+    Though this will become public, the implied interface is not yet stable.
+
+    """
+    def __init__(self):
+        self._history = []  # LIFO
+    def add(self, request, response):
+        self._history.append((request, response))
+    def back(self, n, _response):
+        response = _response  # XXX move Browser._response into this class?
+        while n > 0 or response is None:
+            try:
+                request, response = self._history.pop()
+            except IndexError:
+                raise BrowserStateError("already at start of history")
+            n -= 1
+        return request, response
+    def clear(self):
+        del self._history[:]
+    def close(self):
+        for request, response in self._history:
+            if response is not None:
+                response.close()
+        del self._history[:]
+
+
+class HTTPRefererProcessor(urllib2.BaseHandler):
+    def http_request(self, request):
+        # See RFC 2616 14.36.  The only times we know the source of the
+        # request URI has a URI associated with it are redirect, and
+        # Browser.click() / Browser.submit() / Browser.follow_link().
+        # Otherwise, it's the user's job to add any Referer header before
+        # .open()ing.
+        if hasattr(request, "redirect_dict"):
+            request = self.parent._add_referer_header(
+                request, origin_request=False)
+        return request
+
+    https_request = http_request
+
+
+class Browser(UserAgentBase):
+    """Browser-like class with support for history, forms and links.
+
+    BrowserStateError is raised whenever the browser is in the wrong state to
+    complete the requested operation - eg., when .back() is called when the
+    browser history is empty, or when .follow_link() is called when the current
+    response does not contain HTML data.
+
+    Public attributes:
+
+    request: current request (mechanize.Request or urllib2.Request)
+    form: currently selected form (see .select_form())
+
+    """
+
+    handler_classes = copy.copy(UserAgentBase.handler_classes)
+    handler_classes["_referer"] = HTTPRefererProcessor
+    default_features = copy.copy(UserAgentBase.default_features)
+    default_features.append("_referer")
+
+    def __init__(self,
+                 factory=None,
+                 history=None,
+                 request_class=None,
+                 ):
+        """
+
+        Only named arguments should be passed to this constructor.
+
+        factory: object implementing the mechanize.Factory interface.
+        history: object implementing the mechanize.History interface.  Note
+         this interface is still experimental and may change in future.
+        request_class: Request class to use.  Defaults to mechanize.Request
+         by default for Pythons older than 2.4, urllib2.Request otherwise.
+
+        The Factory and History objects passed in are 'owned' by the Browser,
+        so they should not be shared across Browsers.  In particular,
+        factory.set_response() should not be called except by the owning
+        Browser itself.
+
+        Note that the supplied factory's request_class is overridden by this
+        constructor, to ensure only one Request class is used.
+
+        """
+        self._handle_referer = True
+
+        if history is None:
+            history = History()
+        self._history = history
+
+        if request_class is None:
+            if not hasattr(urllib2.Request, "add_unredirected_header"):
+                request_class = _request.Request
+            else:
+                request_class = urllib2.Request  # Python >= 2.4
+
+        if factory is None:
+            factory = DefaultFactory()
+        factory.set_request_class(request_class)
+        self._factory = factory
+        self.request_class = request_class
+
+        self.request = None
+        self._set_response(None, False)
+
+        # do this last to avoid __getattr__ problems
+        UserAgentBase.__init__(self)
+
+    def close(self):
+        UserAgentBase.close(self)
+        if self._response is not None:
+            self._response.close()    
+        if self._history is not None:
+            self._history.close()
+            self._history = None
+
+        # make use after .close easy to spot
+        self.form = None
+        self.request = self._response = None
+        self.request = self.response = self.set_response = None
+        self.geturl =  self.reload = self.back = None
+        self.clear_history = self.set_cookie = self.links = self.forms = None
+        self.viewing_html = self.encoding = self.title = None
+        self.select_form = self.click = self.submit = self.click_link = None
+        self.follow_link = self.find_link = None
+
+    def set_handle_referer(self, handle):
+        """Set whether to add Referer header to each request.
+
+        This base class does not implement this feature (so don't turn this on
+        if you're using this base class directly), but the subclass
+        mechanize.Browser does.
+
+        """
+        self._set_handler("_referer", handle)
+        self._handle_referer = bool(handle)
+
+    def _add_referer_header(self, request, origin_request=True):
+        if self.request is None:
+            return request
+        scheme = request.get_type()
+        original_scheme = self.request.get_type()
+        if scheme not in ["http", "https"]:
+            return request
+        if not origin_request and not self.request.has_header("Referer"):
+            return request
+
+        if (self._handle_referer and
+            original_scheme in ["http", "https"] and
+            not (original_scheme == "https" and scheme != "https")):
+            # strip URL fragment (RFC 2616 14.36)
+            parts = _rfc3986.urlsplit(self.request.get_full_url())
+            parts = parts[:-1]+(None,)
+            referer = _rfc3986.urlunsplit(parts)
+            request.add_unredirected_header("Referer", referer)
+        return request
+
+    def open_novisit(self, url, data=None):
+        """Open a URL without visiting it.
+
+        The browser state (including .request, .response(), history, forms and
+        links) are all left unchanged by calling this function.
+
+        The interface is the same as for .open().
+
+        This is useful for things like fetching images.
+
+        See also .retrieve().
+
+        """
+        return self._mech_open(url, data, visit=False)
+
+    def open(self, url, data=None):
+        return self._mech_open(url, data)
+
+    def _mech_open(self, url, data=None, update_history=True, visit=None):
+        try:
+            url.get_full_url
+        except AttributeError:
+            # string URL -- convert to absolute URL if required
+            scheme, authority = _rfc3986.urlsplit(url)[:2]
+            if scheme is None:
+                # relative URL
+                if self._response is None:
+                    raise BrowserStateError(
+                        "can't fetch relative reference: "
+                        "not viewing any document")
+                url = _rfc3986.urljoin(self._response.geturl(), url)
+
+        request = self._request(url, data, visit)
+        visit = request.visit
+        if visit is None:
+            visit = True
+
+        if visit:
+            self._visit_request(request, update_history)
+
+        success = True
+        try:
+            response = UserAgentBase.open(self, request, data)
+        except urllib2.HTTPError, error:
+            success = False
+            if error.fp is None:  # not a response
+                raise
+            response = error
+##         except (IOError, socket.error, OSError), error:
+##             # Yes, urllib2 really does raise all these :-((
+##             # See test_urllib2.py for examples of socket.gaierror and OSError,
+##             # plus note that FTPHandler raises IOError.
+##             # XXX I don't seem to have an example of exactly socket.error being
+##             #  raised, only socket.gaierror...
+##             # I don't want to start fixing these here, though, since this is a
+##             # subclass of OpenerDirector, and it would break old code.  Even in
+##             # Python core, a fix would need some backwards-compat. hack to be
+##             # acceptable.
+##             raise
+
+        if visit:
+            self._set_response(response, False)
+            response = copy.copy(self._response)
+        elif response is not None:
+            response = _response.upgrade_response(response)
+
+        if not success:
+            raise response
+        return response
+
+    def __str__(self):
+        text = []
+        text.append("<%s " % self.__class__.__name__)
+        if self._response:
+            text.append("visiting %s" % self._response.geturl())
+        else:
+            text.append("(not visiting a URL)")
+        if self.form:
+            text.append("\n selected form:\n %s\n" % str(self.form))
+        text.append(">")
+        return "".join(text)
+
+    def response(self):
+        """Return a copy of the current response.
+
+        The returned object has the same interface as the object returned by
+        .open() (or urllib2.urlopen()).
+
+        """
+        return copy.copy(self._response)
+
+    def open_local_file(self, filename):
+        path = sanepathname2url(os.path.abspath(filename))
+        url = 'file://'+path
+        return self.open(url)
+
+    def set_response(self, response):
+        """Replace current response with (a copy of) response.
+
+        response may be None.
+
+        This is intended mostly for HTML-preprocessing.
+        """
+        self._set_response(response, True)
+
+    def _set_response(self, response, close_current):
+        # sanity check, necessary but far from sufficient
+        if not (response is None or
+                (hasattr(response, "info") and hasattr(response, "geturl") and
+                 hasattr(response, "read")
+                 )
+                ):
+            raise ValueError("not a response object")
+
+        self.form = None
+        if response is not None:
+            response = _response.upgrade_response(response)
+        if close_current and self._response is not None:
+            self._response.close()
+        self._response = response
+        self._factory.set_response(response)
+
+    def visit_response(self, response, request=None):
+        """Visit the response, as if it had been .open()ed.
+
+        Unlike .set_response(), this updates history rather than replacing the
+        current response.
+        """
+        if request is None:
+            request = _request.Request(response.geturl())
+        self._visit_request(request, True)
+        self._set_response(response, False)
+
+    def _visit_request(self, request, update_history):
+        if self._response is not None:
+            self._response.close()
+        if self.request is not None and update_history:
+            self._history.add(self.request, self._response)
+        self._response = None
+        # we want self.request to be assigned even if UserAgentBase.open
+        # fails
+        self.request = request
+
+    def geturl(self):
+        """Get URL of current document."""
+        if self._response is None:
+            raise BrowserStateError("not viewing any document")
+        return self._response.geturl()
+
+    def reload(self):
+        """Reload current document, and return response object."""
+        if self.request is None:
+            raise BrowserStateError("no URL has yet been .open()ed")
+        if self._response is not None:
+            self._response.close()
+        return self._mech_open(self.request, update_history=False)
+
+    def back(self, n=1):
+        """Go back n steps in history, and return response object.
+
+        n: go back this number of steps (default 1 step)
+
+        """
+        if self._response is not None:
+            self._response.close()
+        self.request, response = self._history.back(n, self._response)
+        self.set_response(response)
+        if not response.read_complete:
+            return self.reload()
+        return copy.copy(response)
+
+    def clear_history(self):
+        self._history.clear()
+
+    def set_cookie(self, cookie_string):
+        """Request to set a cookie.
+
+        Note that it is NOT necessary to call this method under ordinary
+        circumstances: cookie handling is normally entirely automatic.  The
+        intended use case is rather to simulate the setting of a cookie by
+        client script in a web page (e.g. JavaScript).  In that case, use of
+        this method is necessary because mechanize currently does not support
+        JavaScript, VBScript, etc.
+
+        The cookie is added in the same way as if it had arrived with the
+        current response, as a result of the current request.  This means that,
+        for example, if it is not appropriate to set the cookie based on the
+        current request, no cookie will be set.
+
+        The cookie will be returned automatically with subsequent responses
+        made by the Browser instance whenever that's appropriate.
+
+        cookie_string should be a valid value of the Set-Cookie header.
+
+        For example:
+
+        browser.set_cookie(
+            "sid=abcdef; expires=Wednesday, 09-Nov-06 23:12:40 GMT")
+
+        Currently, this method does not allow for adding RFC 2986 cookies.
+        This limitation will be lifted if anybody requests it.
+
+        """
+        if self._response is None:
+            raise BrowserStateError("not viewing any document")
+        if self.request.get_type() not in ["http", "https"]:
+            raise BrowserStateError("can't set cookie for non-HTTP/HTTPS "
+                                    "transactions")
+        cookiejar = self._ua_handlers["_cookies"].cookiejar
+        response = self.response()  # copy
+        headers = response.info()
+        headers["Set-cookie"] = cookie_string
+        cookiejar.extract_cookies(response, self.request)
+
+    def links(self, **kwds):
+        """Return iterable over links (mechanize.Link objects)."""
+        if not self.viewing_html():
+            raise BrowserStateError("not viewing HTML")
+        links = self._factory.links()
+        if kwds:
+            return self._filter_links(links, **kwds)
+        else:
+            return links
+
+    def forms(self):
+        """Return iterable over forms.
+
+        The returned form objects implement the ClientForm.HTMLForm interface.
+
+        """
+        if not self.viewing_html():
+            raise BrowserStateError("not viewing HTML")
+        return self._factory.forms()
+
+    def global_form(self):
+        """Return the global form object, or None if the factory implementation
+        did not supply one.
+
+        The "global" form object contains all controls that are not descendants of
+        any FORM element.
+
+        The returned form object implements the ClientForm.HTMLForm interface.
+
+        This is a separate method since the global form is not regarded as part
+        of the sequence of forms in the document -- mostly for
+        backwards-compatibility.
+
+        """
+        if not self.viewing_html():
+            raise BrowserStateError("not viewing HTML")
+        return self._factory.global_form
+
+    def viewing_html(self):
+        """Return whether the current response contains HTML data."""
+        if self._response is None:
+            raise BrowserStateError("not viewing any document")
+        return self._factory.is_html
+
+    def encoding(self):
+        if self._response is None:
+            raise BrowserStateError("not viewing any document")
+        return self._factory.encoding
+
+    def title(self):
+        """Return title, or None if there is no title element in the document.
+
+        Tags are stripped or textified as described in docs for
+        PullParser.get_text() method of pullparser module.
+
+        """
+        if not self.viewing_html():
+            raise BrowserStateError("not viewing HTML")
+        return self._factory.title
+
+    def select_form(self, name=None, predicate=None, nr=None):
+        """Select an HTML form for input.
+
+        This is a bit like giving a form the "input focus" in a browser.
+
+        If a form is selected, the Browser object supports the HTMLForm
+        interface, so you can call methods like .set_value(), .set(), and
+        .click().
+
+        Another way to select a form is to assign to the .form attribute.  The
+        form assigned should be one of the objects returned by the .forms()
+        method.
+
+        At least one of the name, predicate and nr arguments must be supplied.
+        If no matching form is found, mechanize.FormNotFoundError is raised.
+
+        If name is specified, then the form must have the indicated name.
+
+        If predicate is specified, then the form must match that function.  The
+        predicate function is passed the HTMLForm as its single argument, and
+        should return a boolean value indicating whether the form matched.
+
+        nr, if supplied, is the sequence number of the form (where 0 is the
+        first).  Note that control 0 is the first form matching all the other
+        arguments (if supplied); it is not necessarily the first control in the
+        form.  The "global form" (consisting of all form controls not contained
+        in any FORM element) is considered not to be part of this sequence and
+        to have no name, so will not be matched unless both name and nr are
+        None.
+
+        """
+        if not self.viewing_html():
+            raise BrowserStateError("not viewing HTML")
+        if (name is None) and (predicate is None) and (nr is None):
+            raise ValueError(
+                "at least one argument must be supplied to specify form")
+
+        global_form = self._factory.global_form
+        if nr is None and name is None and \
+               predicate is not None and predicate(global_form):
+            self.form = global_form
+            return
+
+        orig_nr = nr
+        for form in self.forms():
+            if name is not None and name != form.name:
+                continue
+            if predicate is not None and not predicate(form):
+                continue
+            if nr:
+                nr -= 1
+                continue
+            self.form = form
+            break  # success
+        else:
+            # failure
+            description = []
+            if name is not None: description.append("name '%s'" % name)
+            if predicate is not None:
+                description.append("predicate %s" % predicate)
+            if orig_nr is not None: description.append("nr %d" % orig_nr)
+            description = ", ".join(description)
+            raise FormNotFoundError("no form matching "+description)
+
+    def click(self, *args, **kwds):
+        """See ClientForm.HTMLForm.click for documentation."""
+        if not self.viewing_html():
+            raise BrowserStateError("not viewing HTML")
+        request = self.form.click(*args, **kwds)
+        return self._add_referer_header(request)
+
+    def submit(self, *args, **kwds):
+        """Submit current form.
+
+        Arguments are as for ClientForm.HTMLForm.click().
+
+        Return value is same as for Browser.open().
+
+        """
+        return self.open(self.click(*args, **kwds))
+
+    def click_link(self, link=None, **kwds):
+        """Find a link and return a Request object for it.
+
+        Arguments are as for .find_link(), except that a link may be supplied
+        as the first argument.
+
+        """
+        if not self.viewing_html():
+            raise BrowserStateError("not viewing HTML")
+        if not link:
+            link = self.find_link(**kwds)
+        else:
+            if kwds:
+                raise ValueError(
+                    "either pass a Link, or keyword arguments, not both")
+        request = self.request_class(link.absolute_url)
+        return self._add_referer_header(request)
+
+    def follow_link(self, link=None, **kwds):
+        """Find a link and .open() it.
+
+        Arguments are as for .click_link().
+
+        Return value is same as for Browser.open().
+
+        """
+        return self.open(self.click_link(link, **kwds))
+
+    def find_link(self, **kwds):
+        """Find a link in current page.
+
+        Links are returned as mechanize.Link objects.
+
+        # Return third link that .search()-matches the regexp "python"
+        # (by ".search()-matches", I mean that the regular expression method
+        # .search() is used, rather than .match()).
+        find_link(text_regex=re.compile("python"), nr=2)
+
+        # Return first http link in the current page that points to somewhere
+        # on python.org whose link text (after tags have been removed) is
+        # exactly "monty python".
+        find_link(text="monty python",
+                  url_regex=re.compile("http.*python.org"))
+
+        # Return first link with exactly three HTML attributes.
+        find_link(predicate=lambda link: len(link.attrs) == 3)
+
+        Links include anchors (<a>), image maps (<area>), and frames (<frame>,
+        <iframe>).
+
+        All arguments must be passed by keyword, not position.  Zero or more
+        arguments may be supplied.  In order to find a link, all arguments
+        supplied must match.
+
+        If a matching link is not found, mechanize.LinkNotFoundError is raised.
+
+        text: link text between link tags: eg. <a href="blah">this bit</a> (as
+         returned by pullparser.get_compressed_text(), ie. without tags but
+         with opening tags "textified" as per the pullparser docs) must compare
+         equal to this argument, if supplied
+        text_regex: link text between tag (as defined above) must match the
+         regular expression object or regular expression string passed as this
+         argument, if supplied
+        name, name_regex: as for text and text_regex, but matched against the
+         name HTML attribute of the link tag
+        url, url_regex: as for text and text_regex, but matched against the
+         URL of the link tag (note this matches against Link.url, which is a
+         relative or absolute URL according to how it was written in the HTML)
+        tag: element name of opening tag, eg. "a"
+        predicate: a function taking a Link object as its single argument,
+         returning a boolean result, indicating whether the links
+        nr: matches the nth link that matches all other criteria (default 0)
+
+        """
+        try:
+            return self._filter_links(self._factory.links(), **kwds).next()
+        except StopIteration:
+            raise LinkNotFoundError()
+
+    def __getattr__(self, name):
+        # pass through ClientForm / DOMForm methods and attributes
+        form = self.__dict__.get("form")
+        if form is None:
+            raise AttributeError(
+                "%s instance has no attribute %s (perhaps you forgot to "
+                ".select_form()?)" % (self.__class__, name))
+        return getattr(form, name)
+
+    def _filter_links(self, links,
+                    text=None, text_regex=None,
+                    name=None, name_regex=None,
+                    url=None, url_regex=None,
+                    tag=None,
+                    predicate=None,
+                    nr=0
+                    ):
+        if not self.viewing_html():
+            raise BrowserStateError("not viewing HTML")
+
+        found_links = []
+        orig_nr = nr
+
+        for link in links:
+            if url is not None and url != link.url:
+                continue
+            if url_regex is not None and not re.search(url_regex, link.url):
+                continue
+            if (text is not None and
+                (link.text is None or text != link.text)):
+                continue
+            if (text_regex is not None and
+                (link.text is None or not re.search(text_regex, link.text))):
+                continue
+            if name is not None and name != dict(link.attrs).get("name"):
+                continue
+            if name_regex is not None:
+                link_name = dict(link.attrs).get("name")
+                if link_name is None or not re.search(name_regex, link_name):
+                    continue
+            if tag is not None and tag != link.tag:
+                continue
+            if predicate is not None and not predicate(link):
+                continue
+            if nr:
+                nr -= 1
+                continue
+            yield link
+            nr = orig_nr
Index: /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/ClientForm.py
===================================================================
--- /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/ClientForm.py (revision 3)
+++ /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/ClientForm.py (revision 3)
@@ -0,0 +1,3373 @@
+"""HTML form handling for web clients.
+
+ClientForm is a Python module for handling HTML forms on the client
+side, useful for parsing HTML forms, filling them in and returning the
+completed forms to the server.  It has developed from a port of Gisle
+Aas' Perl module HTML::Form, from the libwww-perl library, but the
+interface is not the same.
+
+The most useful docstring is the one for HTMLForm.
+
+RFC 1866: HTML 2.0
+RFC 1867: Form-based File Upload in HTML
+RFC 2388: Returning Values from Forms: multipart/form-data
+HTML 3.2 Specification, W3C Recommendation 14 January 1997 (for ISINDEX)
+HTML 4.01 Specification, W3C Recommendation 24 December 1999
+
+
+Copyright 2002-2006 John J. Lee <jjl@pobox.com>
+Copyright 2005 Gary Poster
+Copyright 2005 Zope Corporation
+Copyright 1998-2000 Gisle Aas.
+
+This code is free software; you can redistribute it and/or modify it
+under the terms of the BSD or ZPL 2.1 licenses (see the file
+COPYING.txt included with the distribution).
+
+"""
+
+# XXX
+# add an __all__
+# Remove parser testing hack
+# safeUrl()-ize action
+# Switch to unicode throughout (would be 0.3.x)
+#  See Wichert Akkerman's 2004-01-22 message to c.l.py.
+# Add charset parameter to Content-type headers?  How to find value??
+# Add some more functional tests
+#  Especially single and multiple file upload on the internet.
+#  Does file upload work when name is missing?  Sourceforge tracker form
+#   doesn't like it.  Check standards, and test with Apache.  Test
+#   binary upload with Apache.
+# mailto submission & enctype text/plain
+# I'm not going to fix this unless somebody tells me what real servers
+#  that want this encoding actually expect: If enctype is
+#  application/x-www-form-urlencoded and there's a FILE control present.
+#  Strictly, it should be 'name=data' (see HTML 4.01 spec., section
+#  17.13.2), but I send "name=" ATM.  What about multiple file upload??
+
+# Would be nice, but I'm not going to do it myself:
+# -------------------------------------------------
+# Maybe a 0.4.x?
+#   Replace by_label etc. with moniker / selector concept. Allows, eg.,
+#    a choice between selection by value / id / label / element
+#    contents.  Or choice between matching labels exactly or by
+#    substring.  Etc.
+#   Remove deprecated methods.
+#   ...what else?
+# Work on DOMForm.
+# XForms?  Don't know if there's a need here.
+
+
+try: True
+except NameError:
+    True = 1
+    False = 0
+
+try: bool
+except NameError:
+    def bool(expr):
+        if expr: return True
+        else: return False
+
+try:
+    import logging
+except ImportError:
+    def debug(msg, *args, **kwds):
+        pass
+else:
+    _logger = logging.getLogger("ClientForm")
+    OPTIMIZATION_HACK = True
+
+    def debug(msg, *args, **kwds):
+        if OPTIMIZATION_HACK:
+            return
+
+        try:
+            raise Exception()
+        except:
+            caller_name = (
+                sys.exc_info()[2].tb_frame.f_back.f_back.f_code.co_name)
+        extended_msg = '%%s %s' % msg
+        extended_args = (caller_name,)+args
+        debug = _logger.debug(extended_msg, *extended_args, **kwds)
+
+    def _show_debug_messages():
+        global OPTIMIZATION_HACK
+        OPTIMIZATION_HACK = False
+        _logger.setLevel(logging.DEBUG)
+        handler = logging.StreamHandler(sys.stdout)
+        handler.setLevel(logging.DEBUG)
+        _logger.addHandler(handler)
+
+import sys, urllib, urllib2, types, mimetools, copy, urlparse, \
+       htmlentitydefs, re, random
+from cStringIO import StringIO
+
+import sgmllib
+# monkeypatch to fix http://www.python.org/sf/803422 :-(
+sgmllib.charref = re.compile("&#(x?[0-9a-fA-F]+)[^0-9a-fA-F]")
+
+# HTMLParser.HTMLParser is recent, so live without it if it's not available
+# (also, sgmllib.SGMLParser is much more tolerant of bad HTML)
+try:
+    import HTMLParser
+except ImportError:
+    HAVE_MODULE_HTMLPARSER = False
+else:
+    HAVE_MODULE_HTMLPARSER = True
+
+try:
+    import warnings
+except ImportError:
+    def deprecation(message):
+        pass
+else:
+    def deprecation(message):
+        warnings.warn(message, DeprecationWarning, stacklevel=2)
+
+VERSION = "0.2.7"
+
+CHUNK = 1024  # size of chunks fed to parser, in bytes
+
+DEFAULT_ENCODING = "latin-1"
+
+class Missing: pass
+
+_compress_re = re.compile(r"\s+")
+def compress_text(text): return _compress_re.sub(" ", text.strip())
+
+def normalize_line_endings(text):
+    return re.sub(r"(?:(?<!\r)\n)|(?:\r(?!\n))", "\r\n", text)
+
+
+# This version of urlencode is from my Python 1.5.2 back-port of the
+# Python 2.1 CVS maintenance branch of urllib.  It will accept a sequence
+# of pairs instead of a mapping -- the 2.0 version only accepts a mapping.
+def urlencode(query,doseq=False,):
+    """Encode a sequence of two-element tuples or dictionary into a URL query \
+string.
+
+    If any values in the query arg are sequences and doseq is true, each
+    sequence element is converted to a separate parameter.
+
+    If the query arg is a sequence of two-element tuples, the order of the
+    parameters in the output will match the order of parameters in the
+    input.
+    """
+
+    if hasattr(query,"items"):
+        # mapping objects
+        query = query.items()
+    else:
+        # it's a bother at times that strings and string-like objects are
+        # sequences...
+        try:
+            # non-sequence items should not work with len()
+            x = len(query)
+            # non-empty strings will fail this
+            if len(query) and type(query[0]) != types.TupleType:
+                raise TypeError()
+            # zero-length sequences of all types will get here and succeed,
+            # but that's a minor nit - since the original implementation
+            # allowed empty dicts that type of behavior probably should be
+            # preserved for consistency
+        except TypeError:
+            ty,va,tb = sys.exc_info()
+            raise TypeError("not a valid non-string sequence or mapping "
+                            "object", tb)
+
+    l = []
+    if not doseq:
+        # preserve old behavior
+        for k, v in query:
+            k = urllib.quote_plus(str(k))
+            v = urllib.quote_plus(str(v))
+            l.append(k + '=' + v)
+    else:
+        for k, v in query:
+            k = urllib.quote_plus(str(k))
+            if type(v) == types.StringType:
+                v = urllib.quote_plus(v)
+                l.append(k + '=' + v)
+            elif type(v) == types.UnicodeType:
+                # is there a reasonable way to convert to ASCII?
+                # encode generates a string, but "replace" or "ignore"
+                # lose information and "strict" can raise UnicodeError
+                v = urllib.quote_plus(v.encode("ASCII","replace"))
+                l.append(k + '=' + v)
+            else:
+                try:
+                    # is this a sufficient test for sequence-ness?
+                    x = len(v)
+                except TypeError:
+                    # not a sequence
+                    v = urllib.quote_plus(str(v))
+                    l.append(k + '=' + v)
+                else:
+                    # loop over the sequence
+                    for elt in v:
+                        l.append(k + '=' + urllib.quote_plus(str(elt)))
+    return '&'.join(l)
+
+def unescape(data, entities, encoding=DEFAULT_ENCODING):
+    if data is None or "&" not in data:
+        return data
+
+    def replace_entities(match, entities=entities, encoding=encoding):
+        ent = match.group()
+        if ent[1] == "#":
+            return unescape_charref(ent[2:-1], encoding)
+
+        repl = entities.get(ent)
+        if repl is not None:
+            if type(repl) != type(""):
+                try:
+                    repl = repl.encode(encoding)
+                except UnicodeError:
+                    repl = ent
+        else:
+            repl = ent
+
+        return repl
+
+    return re.sub(r"&#?[A-Za-z0-9]+?;", replace_entities, data)
+
+def unescape_charref(data, encoding):
+    name, base = data, 10
+    if name.startswith("x"):
+        name, base= name[1:], 16
+    uc = unichr(int(name, base))
+    if encoding is None:
+        return uc
+    else:
+        try:
+            repl = uc.encode(encoding)
+        except UnicodeError:
+            repl = "&#%s;" % data
+        return repl
+
+def get_entitydefs():
+    import htmlentitydefs
+    from codecs import latin_1_decode
+    entitydefs = {}
+    try:
+        htmlentitydefs.name2codepoint
+    except AttributeError:
+        entitydefs = {}
+        for name, char in htmlentitydefs.entitydefs.items():
+            uc = latin_1_decode(char)[0]
+            if uc.startswith("&#") and uc.endswith(";"):
+                uc = unescape_charref(uc[2:-1], None)
+            entitydefs["&%s;" % name] = uc
+    else:
+        for name, codepoint in htmlentitydefs.name2codepoint.items():
+            entitydefs["&%s;" % name] = unichr(codepoint)
+    return entitydefs
+
+
+def issequence(x):
+    try:
+        x[0]
+    except (TypeError, KeyError):
+        return False
+    except IndexError:
+        pass
+    return True
+
+def isstringlike(x):
+    try: x+""
+    except: return False
+    else: return True
+
+
+def choose_boundary():
+    """Return a string usable as a multipart boundary."""
+    # follow IE and firefox
+    nonce = "".join([str(random.randint(0, sys.maxint-1)) for i in 0,1,2])
+    return "-"*27 + nonce
+
+# This cut-n-pasted MimeWriter from standard library is here so can add
+# to HTTP headers rather than message body when appropriate.  It also uses
+# \r\n in place of \n.  This is a bit nasty.
+class MimeWriter:
+
+    """Generic MIME writer.
+
+    Methods:
+
+    __init__()
+    addheader()
+    flushheaders()
+    startbody()
+    startmultipartbody()
+    nextpart()
+    lastpart()
+
+    A MIME writer is much more primitive than a MIME parser.  It
+    doesn't seek around on the output file, and it doesn't use large
+    amounts of buffer space, so you have to write the parts in the
+    order they should occur on the output file.  It does buffer the
+    headers you add, allowing you to rearrange their order.
+
+    General usage is:
+
+    f = <open the output file>
+    w = MimeWriter(f)
+    ...call w.addheader(key, value) 0 or more times...
+
+    followed by either:
+
+    f = w.startbody(content_type)
+    ...call f.write(data) for body data...
+
+    or:
+
+    w.startmultipartbody(subtype)
+    for each part:
+        subwriter = w.nextpart()
+        ...use the subwriter's methods to create the subpart...
+    w.lastpart()
+
+    The subwriter is another MimeWriter instance, and should be
+    treated in the same way as the toplevel MimeWriter.  This way,
+    writing recursive body parts is easy.
+
+    Warning: don't forget to call lastpart()!
+
+    XXX There should be more state so calls made in the wrong order
+    are detected.
+
+    Some special cases:
+
+    - startbody() just returns the file passed to the constructor;
+      but don't use this knowledge, as it may be changed.
+
+    - startmultipartbody() actually returns a file as well;
+      this can be used to write the initial 'if you can read this your
+      mailer is not MIME-aware' message.
+
+    - If you call flushheaders(), the headers accumulated so far are
+      written out (and forgotten); this is useful if you don't need a
+      body part at all, e.g. for a subpart of type message/rfc822
+      that's (mis)used to store some header-like information.
+
+    - Passing a keyword argument 'prefix=<flag>' to addheader(),
+      start*body() affects where the header is inserted; 0 means
+      append at the end, 1 means insert at the start; default is
+      append for addheader(), but insert for start*body(), which use
+      it to determine where the Content-type header goes.
+
+    """
+
+    def __init__(self, fp, http_hdrs=None):
+        self._http_hdrs = http_hdrs
+        self._fp = fp
+        self._headers = []
+        self._boundary = []
+        self._first_part = True
+
+    def addheader(self, key, value, prefix=0,
+                  add_to_http_hdrs=0):
+        """
+        prefix is ignored if add_to_http_hdrs is true.
+        """
+        lines = value.split("\r\n")
+        while lines and not lines[-1]: del lines[-1]
+        while lines and not lines[0]: del lines[0]
+        if add_to_http_hdrs:
+            value = "".join(lines)
+            self._http_hdrs.append((key, value))
+        else:
+            for i in range(1, len(lines)):
+                lines[i] = "    " + lines[i].strip()
+            value = "\r\n".join(lines) + "\r\n"
+            line = key + ": " + value
+            if prefix:
+                self._headers.insert(0, line)
+            else:
+                self._headers.append(line)
+
+    def flushheaders(self):
+        self._fp.writelines(self._headers)
+        self._headers = []
+
+    def startbody(self, ctype=None, plist=[], prefix=1,
+                  add_to_http_hdrs=0, content_type=1):
+        """
+        prefix is ignored if add_to_http_hdrs is true.
+        """
+        if content_type and ctype:
+            for name, value in plist:
+                ctype = ctype + ';\r\n %s=%s' % (name, value)
+            self.addheader("Content-type", ctype, prefix=prefix,
+                           add_to_http_hdrs=add_to_http_hdrs)
+        self.flushheaders()
+        if not add_to_http_hdrs: self._fp.write("\r\n")
+        self._first_part = True
+        return self._fp
+
+    def startmultipartbody(self, subtype, boundary=None, plist=[], prefix=1,
+                           add_to_http_hdrs=0, content_type=1):
+        boundary = boundary or choose_boundary()
+        self._boundary.append(boundary)
+        return self.startbody("multipart/" + subtype,
+                              [("boundary", boundary)] + plist,
+                              prefix=prefix,
+                              add_to_http_hdrs=add_to_http_hdrs,
+                              content_type=content_type)
+
+    def nextpart(self):
+        boundary = self._boundary[-1]
+        if self._first_part:
+            self._first_part = False
+        else:
+            self._fp.write("\r\n")
+        self._fp.write("--" + boundary + "\r\n")
+        return self.__class__(self._fp)
+
+    def lastpart(self):
+        if self._first_part:
+            self.nextpart()
+        boundary = self._boundary.pop()
+        self._fp.write("\r\n--" + boundary + "--\r\n")
+
+
+class LocateError(ValueError): pass
+class AmbiguityError(LocateError): pass
+class ControlNotFoundError(LocateError): pass
+class ItemNotFoundError(LocateError): pass
+
+class ItemCountError(ValueError): pass
+
+# for backwards compatibility, ParseError derives from exceptions that were
+# raised by versions of ClientForm <= 0.2.5
+if HAVE_MODULE_HTMLPARSER:
+    SGMLLIB_PARSEERROR = sgmllib.SGMLParseError
+    class ParseError(sgmllib.SGMLParseError,
+                     HTMLParser.HTMLParseError,
+                     ):
+        pass
+else:
+    if hasattr(sgmllib, "SGMLParseError"):
+        SGMLLIB_PARSEERROR = sgmllib.SGMLParseError
+        class ParseError(sgmllib.SGMLParseError):
+            pass
+    else:
+        SGMLLIB_PARSEERROR = RuntimeError
+        class ParseError(RuntimeError):
+            pass
+
+
+class _AbstractFormParser:
+    """forms attribute contains HTMLForm instances on completion."""
+    # thanks to Moshe Zadka for an example of sgmllib/htmllib usage
+    def __init__(self, entitydefs=None, encoding=DEFAULT_ENCODING):
+        if entitydefs is None:
+            entitydefs = get_entitydefs()
+        self._entitydefs = entitydefs
+        self._encoding = encoding
+
+        self.base = None
+        self.forms = []
+        self.labels = []
+        self._current_label = None
+        self._current_form = None
+        self._select = None
+        self._optgroup = None
+        self._option = None
+        self._textarea = None
+
+        # forms[0] will contain all controls that are outside of any form
+        # self._global_form is an alias for self.forms[0]
+        self._global_form = None
+        self.start_form([])
+        self.end_form()
+        self._current_form = self._global_form = self.forms[0]
+
+    def do_base(self, attrs):
+        debug("%s", attrs)
+        for key, value in attrs:
+            if key == "href":
+                self.base = value
+
+    def end_body(self):
+        debug("")
+        if self._current_label is not None:
+            self.end_label()
+        if self._current_form is not self._global_form:
+            self.end_form()
+
+    def start_form(self, attrs):
+        debug("%s", attrs)
+        if self._current_form is not self._global_form:
+            raise ParseError("nested FORMs")
+        name = None
+        action = None
+        enctype = "application/x-www-form-urlencoded"
+        method = "GET"
+        d = {}
+        for key, value in attrs:
+            if key == "name":
+                name = value
+            elif key == "action":
+                action = value
+            elif key == "method":
+                method = value.upper()
+            elif key == "enctype":
+                enctype = value.lower()
+            d[key] = value
+        controls = []
+        self._current_form = (name, action, method, enctype), d, controls
+
+    def end_form(self):
+        debug("")
+        if self._current_label is not None:
+            self.end_label()
+        if self._current_form is self._global_form:
+            raise ParseError("end of FORM before start")
+        self.forms.append(self._current_form)
+        self._current_form = self._global_form
+
+    def start_select(self, attrs):
+        debug("%s", attrs)
+        if self._select is not None:
+            raise ParseError("nested SELECTs")
+        if self._textarea is not None:
+            raise ParseError("SELECT inside TEXTAREA")
+        d = {}
+        for key, val in attrs:
+            d[key] = val
+
+        self._select = d
+        self._add_label(d)
+
+        self._append_select_control({"__select": d})
+
+    def end_select(self):
+        debug("")
+        if self._current_form is self._global_form:
+            return
+        if self._select is None:
+            raise ParseError("end of SELECT before start")
+
+        if self._option is not None:
+            self._end_option()
+
+        self._select = None
+
+    def start_optgroup(self, attrs):
+        debug("%s", attrs)
+        if self._select is None:
+            raise ParseError("OPTGROUP outside of SELECT")
+        d = {}
+        for key, val in attrs:
+            d[key] = val
+
+        self._optgroup = d
+
+    def end_optgroup(self):
+        debug("")
+        if self._optgroup is None:
+            raise ParseError("end of OPTGROUP before start")
+        self._optgroup = None
+
+    def _start_option(self, attrs):
+        debug("%s", attrs)
+        if self._select is None:
+            raise ParseError("OPTION outside of SELECT")
+        if self._option is not None:
+            self._end_option()
+
+        d = {}
+        for key, val in attrs:
+            d[key] = val
+
+        self._option = {}
+        self._option.update(d)
+        if (self._optgroup and self._optgroup.has_key("disabled") and
+            not self._option.has_key("disabled")):
+            self._option["disabled"] = None
+
+    def _end_option(self):
+        debug("")
+        if self._option is None:
+            raise ParseError("end of OPTION before start")
+
+        contents = self._option.get("contents", "").strip()
+        self._option["contents"] = contents
+        if not self._option.has_key("value"):
+            self._option["value"] = contents
+        if not self._option.has_key("label"):
+            self._option["label"] = contents
+        # stuff dict of SELECT HTML attrs into a special private key
+        #  (gets deleted again later)
+        self._option["__select"] = self._select
+        self._append_select_control(self._option)
+        self._option = None
+
+    def _append_select_control(self, attrs):
+        debug("%s", attrs)
+        controls = self._current_form[2]
+        name = self._select.get("name")
+        controls.append(("select", name, attrs))
+
+    def start_textarea(self, attrs):
+        debug("%s", attrs)
+        if self._textarea is not None:
+            raise ParseError("nested TEXTAREAs")
+        if self._select is not None:
+            raise ParseError("TEXTAREA inside SELECT")
+        d = {}
+        for key, val in attrs:
+            d[key] = val
+        self._add_label(d)
+
+        self._textarea = d
+
+    def end_textarea(self):
+        debug("")
+        if self._current_form is self._global_form:
+            return
+        if self._textarea is None:
+            raise ParseError("end of TEXTAREA before start")
+        controls = self._current_form[2]
+        name = self._textarea.get("name")
+        controls.append(("textarea", name, self._textarea))
+        self._textarea = None
+
+    def start_label(self, attrs):
+        debug("%s", attrs)
+        if self._current_label:
+            self.end_label()
+        d = {}
+        for key, val in attrs:
+            d[key] = val
+        taken = bool(d.get("for"))  # empty id is invalid
+        d["__text"] = ""
+        d["__taken"] = taken
+        if taken:
+            self.labels.append(d)
+        self._current_label = d
+
+    def end_label(self):
+        debug("")
+        label = self._current_label
+        if label is None:
+            # something is ugly in the HTML, but we're ignoring it
+            return
+        self._current_label = None
+        label["__text"] = label["__text"]
+        # if it is staying around, it is True in all cases
+        del label["__taken"]
+
+    def _add_label(self, d):
+        #debug("%s", d)
+        if self._current_label is not None:
+            if self._current_label["__taken"]:
+                self.end_label()  # be fuzzy
+            else:
+                self._current_label["__taken"] = True
+                d["__label"] = self._current_label
+
+    def handle_data(self, data):
+        debug("%s", data)
+
+        # according to http://www.w3.org/TR/html4/appendix/notes.html#h-B.3.1
+        # line break immediately after start tags or immediately before end
+        # tags must be ignored, but real browsers only ignore a line break
+        # after a start tag, so we'll do that.
+        if data[0:2] == "\r\n":
+            data = data[2:]
+        if data[0:1] in ["\n", "\r"]:
+            data = data[1:]
+
+        if self._option is not None:
+            # self._option is a dictionary of the OPTION element's HTML
+            # attributes, but it has two special keys, one of which is the
+            # special "contents" key contains text between OPTION tags (the
+            # other is the "__select" key: see the end_option method)
+            map = self._option
+            key = "contents"
+        elif self._textarea is not None:
+            map = self._textarea
+            key = "value"
+            data = normalize_line_endings(data)
+        # not if within option or textarea
+        elif self._current_label is not None:
+            map = self._current_label
+            key = "__text"
+        else:
+            return
+
+        if not map.has_key(key):
+            map[key] = data
+        else:
+            map[key] = map[key] + data
+
+    def do_button(self, attrs):
+        debug("%s", attrs)
+        d = {}
+        d["type"] = "submit"  # default
+        for key, val in attrs:
+            d[key] = val
+        controls = self._current_form[2]
+
+        type = d["type"]
+        name = d.get("name")
+        # we don't want to lose information, so use a type string that
+        # doesn't clash with INPUT TYPE={SUBMIT,RESET,BUTTON}
+        # e.g. type for BUTTON/RESET is "resetbutton"
+        #     (type for INPUT/RESET is "reset")
+        type = type+"button"
+        self._add_label(d)
+        controls.append((type, name, d))
+
+    def do_input(self, attrs):
+        debug("%s", attrs)
+        d = {}
+        d["type"] = "text"  # default
+        for key, val in attrs:
+            d[key] = val
+        controls = self._current_form[2]
+
+        type = d["type"]
+        name = d.get("name")
+        self._add_label(d)
+        controls.append((type, name, d))
+
+    def do_isindex(self, attrs):
+        debug("%s", attrs)
+        d = {}
+        for key, val in attrs:
+            d[key] = val
+        controls = self._current_form[2]
+
+        self._add_label(d)
+        # isindex doesn't have type or name HTML attributes
+        controls.append(("isindex", None, d))
+
+    def handle_entityref(self, name):
+        #debug("%s", name)
+        self.handle_data(unescape(
+            '&%s;' % name, self._entitydefs, self._encoding))
+
+    def handle_charref(self, name):
+        #debug("%s", name)
+        self.handle_data(unescape_charref(name, self._encoding))
+
+    def unescape_attr(self, name):
+        #debug("%s", name)
+        return unescape(name, self._entitydefs, self._encoding)
+
+    def unescape_attrs(self, attrs):
+        #debug("%s", attrs)
+        escaped_attrs = {}
+        for key, val in attrs.items():
+            try:
+                val.items
+            except AttributeError:
+                escaped_attrs[key] = self.unescape_attr(val)
+            else:
+                # e.g. "__select" -- yuck!
+                escaped_attrs[key] = self.unescape_attrs(val)
+        return escaped_attrs
+
+    def unknown_entityref(self, ref): self.handle_data("&%s;" % ref)
+    def unknown_charref(self, ref): self.handle_data("&#%s;" % ref)
+
+
+if not HAVE_MODULE_HTMLPARSER:
+    class XHTMLCompatibleFormParser:
+        def __init__(self, entitydefs=None, encoding=DEFAULT_ENCODING):
+            raise ValueError("HTMLParser could not be imported")
+else:
+    class XHTMLCompatibleFormParser(_AbstractFormParser, HTMLParser.HTMLParser):
+        """Good for XHTML, bad for tolerance of incorrect HTML."""
+        # thanks to Michael Howitz for this!
+        def __init__(self, entitydefs=None, encoding=DEFAULT_ENCODING):
+            HTMLParser.HTMLParser.__init__(self)
+            _AbstractFormParser.__init__(self, entitydefs, encoding)
+
+        def feed(self, data):
+            try:
+                HTMLParser.HTMLParser.feed(self, data)
+            except HTMLParser.HTMLParseError, exc:
+                raise ParseError(exc)
+
+        def start_option(self, attrs):
+            _AbstractFormParser._start_option(self, attrs)
+
+        def end_option(self):
+            _AbstractFormParser._end_option(self)
+
+        def handle_starttag(self, tag, attrs):
+            try:
+                method = getattr(self, "start_" + tag)
+            except AttributeError:
+                try:
+                    method = getattr(self, "do_" + tag)
+                except AttributeError:
+                    pass  # unknown tag
+                else:
+                    method(attrs)
+            else:
+                method(attrs)
+
+        def handle_endtag(self, tag):
+            try:
+                method = getattr(self, "end_" + tag)
+            except AttributeError:
+                pass  # unknown tag
+            else:
+                method()
+
+        def unescape(self, name):
+            # Use the entitydefs passed into constructor, not
+            # HTMLParser.HTMLParser's entitydefs.
+            return self.unescape_attr(name)
+
+        def unescape_attr_if_required(self, name):
+            return name  # HTMLParser.HTMLParser already did it
+        def unescape_attrs_if_required(self, attrs):
+            return attrs  # ditto
+
+
+class _AbstractSgmllibParser(_AbstractFormParser):
+
+    def do_option(self, attrs):
+        _AbstractFormParser._start_option(self, attrs)
+
+    if sys.version_info[:2] >= (2,5):
+        # we override this attr to decode hex charrefs
+        entity_or_charref = re.compile(
+            '&(?:([a-zA-Z][-.a-zA-Z0-9]*)|#(x?[0-9a-fA-F]+))(;?)')
+        def convert_entityref(self, name):
+            return unescape("&%s;" % name, self._entitydefs, self._encoding)
+        def convert_charref(self, name):
+            return unescape_charref("%s" % name, self._encoding)
+        def unescape_attr_if_required(self, name):
+            return name  # sgmllib already did it
+        def unescape_attrs_if_required(self, attrs):
+            return attrs  # ditto
+    else:
+        def unescape_attr_if_required(self, name):
+            return self.unescape_attr(name)
+        def unescape_attrs_if_required(self, attrs):
+            return self.unescape_attrs(attrs)
+
+
+class FormParser(_AbstractSgmllibParser, sgmllib.SGMLParser):
+    """Good for tolerance of incorrect HTML, bad for XHTML."""
+    def __init__(self, entitydefs=None, encoding=DEFAULT_ENCODING):
+        sgmllib.SGMLParser.__init__(self)
+        _AbstractFormParser.__init__(self, entitydefs, encoding)
+
+    def feed(self, data):
+        try:
+            sgmllib.SGMLParser.feed(self, data)
+        except SGMLLIB_PARSEERROR, exc:
+            raise ParseError(exc)
+
+
+
+# sigh, must support mechanize by allowing dynamic creation of classes based on
+# its bundled copy of BeautifulSoup (which was necessary because of dependency
+# problems)
+
+def _create_bs_classes(bs,
+                       icbinbs,
+                       ):
+    class _AbstractBSFormParser(_AbstractSgmllibParser):
+        bs_base_class = None
+        def __init__(self, entitydefs=None, encoding=DEFAULT_ENCODING):
+            _AbstractFormParser.__init__(self, entitydefs, encoding)
+            self.bs_base_class.__init__(self)
+        def handle_data(self, data):
+            _AbstractFormParser.handle_data(self, data)
+            self.bs_base_class.handle_data(self, data)
+        def feed(self, data):
+            try:
+                self.bs_base_class.feed(self, data)
+            except SGMLLIB_PARSEERROR, exc:
+                raise ParseError(exc)
+
+
+    class RobustFormParser(_AbstractBSFormParser, bs):
+        """Tries to be highly tolerant of incorrect HTML."""
+        pass
+    RobustFormParser.bs_base_class = bs
+    class NestingRobustFormParser(_AbstractBSFormParser, icbinbs):
+        """Tries to be highly tolerant of incorrect HTML.
+
+        Different from RobustFormParser in that it more often guesses nesting
+        above missing end tags (see BeautifulSoup docs).
+
+        """
+        pass
+    NestingRobustFormParser.bs_base_class = icbinbs
+
+    return RobustFormParser, NestingRobustFormParser
+
+try:
+    if sys.version_info[:2] < (2, 2):
+        raise ImportError  # BeautifulSoup uses generators
+    import BeautifulSoup
+except ImportError:
+    pass
+else:
+    RobustFormParser, NestingRobustFormParser = _create_bs_classes(
+        BeautifulSoup.BeautifulSoup, BeautifulSoup.ICantBelieveItsBeautifulSoup
+        )
+
+
+#FormParser = XHTMLCompatibleFormParser  # testing hack
+#FormParser = RobustFormParser  # testing hack
+
+
+def ParseResponseEx(response,
+                    select_default=False,
+                    form_parser_class=FormParser,
+                    request_class=urllib2.Request,
+                    entitydefs=None,
+                    encoding=DEFAULT_ENCODING,
+
+                    # private
+                    _urljoin=urlparse.urljoin,
+                    _urlparse=urlparse.urlparse,
+                    _urlunparse=urlparse.urlunparse,
+                    ):
+    """Identical to ParseResponse, except that:
+
+    1. The returned list contains an extra item.  The first form in the list
+    contains all controls not contained in any FORM element.
+
+    2. The arguments ignore_errors and backwards_compat have been removed.
+
+    3. Backwards-compatibility mode (backwards_compat=True) is not available.
+    """
+    return _ParseFileEx(response, response.geturl(),
+                        select_default,
+                        False,
+                        form_parser_class,
+                        request_class,
+                        entitydefs,
+                        False,
+                        encoding,
+                        _urljoin=_urljoin,
+                        _urlparse=_urlparse,
+                        _urlunparse=_urlunparse,
+                        )
+
+def ParseFileEx(file, base_uri,
+                select_default=False,
+                form_parser_class=FormParser,
+                request_class=urllib2.Request,
+                entitydefs=None,
+                encoding=DEFAULT_ENCODING,
+
+                # private
+                _urljoin=urlparse.urljoin,
+                _urlparse=urlparse.urlparse,
+                _urlunparse=urlparse.urlunparse,
+                ):
+    """Identical to ParseFile, except that:
+
+    1. The returned list contains an extra item.  The first form in the list
+    contains all controls not contained in any FORM element.
+
+    2. The arguments ignore_errors and backwards_compat have been removed.
+
+    3. Backwards-compatibility mode (backwards_compat=True) is not available.
+    """
+    return _ParseFileEx(file, base_uri,
+                        select_default,
+                        False,
+                        form_parser_class,
+                        request_class,
+                        entitydefs,
+                        False,
+                        encoding,
+                        _urljoin=_urljoin,
+                        _urlparse=_urlparse,
+                        _urlunparse=_urlunparse,
+                        )
+
+def ParseResponse(response, *args, **kwds):
+    """Parse HTTP response and return a list of HTMLForm instances.
+
+    The return value of urllib2.urlopen can be conveniently passed to this
+    function as the response parameter.
+
+    ClientForm.ParseError is raised on parse errors.
+
+    response: file-like object (supporting read() method) with a method
+     geturl(), returning the URI of the HTTP response
+    select_default: for multiple-selection SELECT controls and RADIO controls,
+     pick the first item as the default if none are selected in the HTML
+    form_parser_class: class to instantiate and use to pass
+    request_class: class to return from .click() method (default is
+     urllib2.Request)
+    entitydefs: mapping like {"&amp;": "&", ...} containing HTML entity
+     definitions (a sensible default is used)
+    encoding: character encoding used for encoding numeric character references
+     when matching link text.  ClientForm does not attempt to find the encoding
+     in a META HTTP-EQUIV attribute in the document itself (mechanize, for
+     example, does do that and will pass the correct value to ClientForm using
+     this parameter).
+
+    backwards_compat: boolean that determines whether the returned HTMLForm
+     objects are backwards-compatible with old code.  If backwards_compat is
+     true:
+
+     - ClientForm 0.1 code will continue to work as before.
+
+     - Label searches that do not specify a nr (number or count) will always
+       get the first match, even if other controls match.  If
+       backwards_compat is False, label searches that have ambiguous results
+       will raise an AmbiguityError.
+
+     - Item label matching is done by strict string comparison rather than
+       substring matching.
+
+     - De-selecting individual list items is allowed even if the Item is
+       disabled.
+
+    The backwards_compat argument will be deprecated in a future release.
+
+    Pass a true value for select_default if you want the behaviour specified by
+    RFC 1866 (the HTML 2.0 standard), which is to select the first item in a
+    RADIO or multiple-selection SELECT control if none were selected in the
+    HTML.  Most browsers (including Microsoft Internet Explorer (IE) and
+    Netscape Navigator) instead leave all items unselected in these cases.  The
+    W3C HTML 4.0 standard leaves this behaviour undefined in the case of
+    multiple-selection SELECT controls, but insists that at least one RADIO
+    button should be checked at all times, in contradiction to browser
+    behaviour.
+
+    There is a choice of parsers.  ClientForm.XHTMLCompatibleFormParser (uses
+    HTMLParser.HTMLParser) works best for XHTML, ClientForm.FormParser (uses
+    sgmllib.SGMLParser) (the default) works better for ordinary grubby HTML.
+    Note that HTMLParser is only available in Python 2.2 and later.  You can
+    pass your own class in here as a hack to work around bad HTML, but at your
+    own risk: there is no well-defined interface.
+
+    """
+    return _ParseFileEx(response, response.geturl(), *args, **kwds)[1:]
+
+def ParseFile(file, base_uri, *args, **kwds):
+    """Parse HTML and return a list of HTMLForm instances.
+
+    ClientForm.ParseError is raised on parse errors.
+
+    file: file-like object (supporting read() method) containing HTML with zero
+     or more forms to be parsed
+    base_uri: the URI of the document (note that the base URI used to submit
+     the form will be that given in the BASE element if present, not that of
+     the document)
+
+    For the other arguments and further details, see ParseResponse.__doc__.
+
+    """
+    return _ParseFileEx(file, base_uri, *args, **kwds)[1:]
+
+def _ParseFileEx(file, base_uri,
+                 select_default=False,
+                 ignore_errors=False,
+                 form_parser_class=FormParser,
+                 request_class=urllib2.Request,
+                 entitydefs=None,
+                 backwards_compat=True,
+                 encoding=DEFAULT_ENCODING,
+                 _urljoin=urlparse.urljoin,
+                 _urlparse=urlparse.urlparse,
+                 _urlunparse=urlparse.urlunparse,
+                 ):
+    if backwards_compat:
+        deprecation("operating in backwards-compatibility mode")
+    fp = form_parser_class(entitydefs, encoding)
+    
+    file.seek(0)
+    
+    while 1:
+        data = file.read(CHUNK)
+        try:
+            fp.feed(data)
+        except ParseError, e:
+            e.base_uri = base_uri
+            raise
+        if len(data) != CHUNK: break
+    if fp.base is not None:
+        # HTML BASE element takes precedence over document URI
+        base_uri = fp.base
+    labels = []  # Label(label) for label in fp.labels]
+    id_to_labels = {}
+    for l in fp.labels:
+        label = Label(l)
+        labels.append(label)
+        for_id = l["for"]
+        coll = id_to_labels.get(for_id)
+        if coll is None:
+            id_to_labels[for_id] = [label]
+        else:
+            coll.append(label)
+    forms = []
+    for (name, action, method, enctype), attrs, controls in fp.forms:
+        if action is None:
+            action = base_uri
+        else:
+            action = _urljoin(base_uri, action)
+        action = fp.unescape_attr_if_required(action)
+        name = fp.unescape_attr_if_required(name)
+        attrs = fp.unescape_attrs_if_required(attrs)
+        # would be nice to make HTMLForm class (form builder) pluggable
+        form = HTMLForm(
+            action, method, enctype, name, attrs, request_class,
+            forms, labels, id_to_labels, backwards_compat)
+        form._urlparse = _urlparse
+        form._urlunparse = _urlunparse
+        for ii in range(len(controls)):
+            type, name, attrs = controls[ii]
+            attrs = fp.unescape_attrs_if_required(attrs)
+            name = fp.unescape_attr_if_required(name)
+            # index=ii*10 allows ImageControl to return multiple ordered pairs
+            form.new_control(type, name, attrs, select_default=select_default,
+                             index=ii*10)
+        forms.append(form)
+    for form in forms:
+        form.fixup()
+    return forms
+
+
+class Label:
+    def __init__(self, attrs):
+        self.id = attrs.get("for")
+        self._text = attrs.get("__text").strip()
+        self._ctext = compress_text(self._text)
+        self.attrs = attrs
+        self._backwards_compat = False  # maintained by HTMLForm
+
+    def __getattr__(self, name):
+        if name == "text":
+            if self._backwards_compat:
+                return self._text
+            else:
+                return self._ctext
+        return getattr(Label, name)
+
+    def __setattr__(self, name, value):
+        if name == "text":
+            # don't see any need for this, so make it read-only
+            raise AttributeError("text attribute is read-only")
+        self.__dict__[name] = value
+
+    def __str__(self):
+        return "<Label(id=%r, text=%r)>" % (self.id, self.text)
+
+
+def _get_label(attrs):
+    text = attrs.get("__label")
+    if text is not None:
+        return Label(text)
+    else:
+        return None
+
+class Control:
+    """An HTML form control.
+
+    An HTMLForm contains a sequence of Controls.  The Controls in an HTMLForm
+    are accessed using the HTMLForm.find_control method or the
+    HTMLForm.controls attribute.
+
+    Control instances are usually constructed using the ParseFile /
+    ParseResponse functions.  If you use those functions, you can ignore the
+    rest of this paragraph.  A Control is only properly initialised after the
+    fixup method has been called.  In fact, this is only strictly necessary for
+    ListControl instances.  This is necessary because ListControls are built up
+    from ListControls each containing only a single item, and their initial
+    value(s) can only be known after the sequence is complete.
+
+    The types and values that are acceptable for assignment to the value
+    attribute are defined by subclasses.
+
+    If the disabled attribute is true, this represents the state typically
+    represented by browsers by 'greying out' a control.  If the disabled
+    attribute is true, the Control will raise AttributeError if an attempt is
+    made to change its value.  In addition, the control will not be considered
+    'successful' as defined by the W3C HTML 4 standard -- ie. it will
+    contribute no data to the return value of the HTMLForm.click* methods.  To
+    enable a control, set the disabled attribute to a false value.
+
+    If the readonly attribute is true, the Control will raise AttributeError if
+    an attempt is made to change its value.  To make a control writable, set
+    the readonly attribute to a false value.
+
+    All controls have the disabled and readonly attributes, not only those that
+    may have the HTML attributes of the same names.
+
+    On assignment to the value attribute, the following exceptions are raised:
+    TypeError, AttributeError (if the value attribute should not be assigned
+    to, because the control is disabled, for example) and ValueError.
+
+    If the name or value attributes are None, or the value is an empty list, or
+    if the control is disabled, the control is not successful.
+
+    Public attributes:
+
+    type: string describing type of control (see the keys of the
+     HTMLForm.type2class dictionary for the allowable values) (readonly)
+    name: name of control (readonly)
+    value: current value of control (subclasses may allow a single value, a
+     sequence of values, or either)
+    disabled: disabled state
+    readonly: readonly state
+    id: value of id HTML attribute
+
+    """
+    def __init__(self, type, name, attrs, index=None):
+        """
+        type: string describing type of control (see the keys of the
+         HTMLForm.type2class dictionary for the allowable values)
+        name: control name
+        attrs: HTML attributes of control's HTML element
+
+        """
+        raise NotImplementedError()
+
+    def add_to_form(self, form):
+        self._form = form
+        form.controls.append(self)
+
+    def fixup(self):
+        pass
+
+    def is_of_kind(self, kind):
+        raise NotImplementedError()
+
+    def clear(self):
+        raise NotImplementedError()
+
+    def __getattr__(self, name): raise NotImplementedError()
+    def __setattr__(self, name, value): raise NotImplementedError()
+
+    def pairs(self):
+        """Return list of (key, value) pairs suitable for passing to urlencode.
+        """
+        return [(k, v) for (i, k, v) in self._totally_ordered_pairs()]
+
+    def _totally_ordered_pairs(self):
+        """Return list of (key, value, index) tuples.
+
+        Like pairs, but allows preserving correct ordering even where several
+        controls are involved.
+
+        """
+        raise NotImplementedError()
+
+    def _write_mime_data(self, mw, name, value):
+        """Write data for a subitem of this control to a MimeWriter."""
+        # called by HTMLForm
+        mw2 = mw.nextpart()
+        mw2.addheader("Content-disposition",
+                      'form-data; name="%s"' % name, 1)
+        f = mw2.startbody(prefix=0)
+        f.write(value)
+
+    def __str__(self):
+        raise NotImplementedError()
+
+    def get_labels(self):
+        """Return all labels (Label instances) for this control.
+        
+        If the control was surrounded by a <label> tag, that will be the first
+        label; all other labels, connected by 'for' and 'id', are in the order
+        that appear in the HTML.
+
+        """
+        res = []
+        if self._label:
+            res.append(self._label)
+        if self.id:
+            res.extend(self._form._id_to_labels.get(self.id, ()))
+        return res
+
+
+#---------------------------------------------------
+class ScalarControl(Control):
+    """Control whose value is not restricted to one of a prescribed set.
+
+    Some ScalarControls don't accept any value attribute.  Otherwise, takes a
+    single value, which must be string-like.
+
+    Additional read-only public attribute:
+
+    attrs: dictionary mapping the names of original HTML attributes of the
+     control to their values
+
+    """
+    def __init__(self, type, name, attrs, index=None):
+        self._index = index
+        self._label = _get_label(attrs)
+        self.__dict__["type"] = type.lower()
+        self.__dict__["name"] = name
+        self._value = attrs.get("value")
+        self.disabled = attrs.has_key("disabled")
+        self.readonly = attrs.has_key("readonly")
+        self.id = attrs.get("id")
+
+        self.attrs = attrs.copy()
+
+        self._clicked = False
+
+        self._urlparse = urlparse.urlparse
+        self._urlunparse = urlparse.urlunparse
+
+    def __getattr__(self, name):
+        if name == "value":
+            return self.__dict__["_value"]
+        else:
+            raise AttributeError("%s instance has no attribute '%s'" %
+                                 (self.__class__.__name__, name))
+
+    def __setattr__(self, name, value):
+        if name == "value":
+            if not isstringlike(value):
+                raise TypeError("must assign a string")
+            elif self.readonly:
+                raise AttributeError("control '%s' is readonly" % self.name)
+            elif self.disabled:
+                raise AttributeError("control '%s' is disabled" % self.name)
+            self.__dict__["_value"] = value
+        elif name in ("name", "type"):
+            raise AttributeError("%s attribute is readonly" % name)
+        else:
+            self.__dict__[name] = value
+
+    def _totally_ordered_pairs(self):
+        name = self.name
+        value = self.value
+        if name is None or value is None or self.disabled:
+            return []
+        return [(self._index, name, value)]
+
+    def clear(self):
+        if self.readonly:
+            raise AttributeError("control '%s' is readonly" % self.name)
+        self.__dict__["_value"] = None
+
+    def __str__(self):
+        name = self.name
+        value = self.value
+        if name is None: name = "<None>"
+        if value is None: value = "<None>"
+
+        infos = []
+        if self.disabled: infos.append("disabled")
+        if self.readonly: infos.append("readonly")
+        info = ", ".join(infos)
+        if info: info = " (%s)" % info
+
+        return "<%s(%s=%s)%s>" % (self.__class__.__name__, name, value, info)
+
+
+#---------------------------------------------------
+class TextControl(ScalarControl):
+    """Textual input control.
+
+    Covers:
+
+    INPUT/TEXT
+    INPUT/PASSWORD
+    INPUT/HIDDEN
+    TEXTAREA
+
+    """
+    def __init__(self, type, name, attrs, index=None):
+        ScalarControl.__init__(self, type, name, attrs, index)
+        if self.type == "hidden": self.readonly = True
+        if self._value is None:
+            self._value = ""
+
+    def is_of_kind(self, kind): return kind == "text"
+
+#---------------------------------------------------
+class FileControl(ScalarControl):
+    """File upload with INPUT TYPE=FILE.
+
+    The value attribute of a FileControl is always None.  Use add_file instead.
+
+    Additional public method: add_file
+
+    """
+
+    def __init__(self, type, name, attrs, index=None):
+        ScalarControl.__init__(self, type, name, attrs, index)
+        self._value = None
+        self._upload_data = []
+
+    def is_of_kind(self, kind): return kind == "file"
+
+    def clear(self):
+        if self.readonly:
+            raise AttributeError("control '%s' is readonly" % self.name)
+        self._upload_data = []
+
+    def __setattr__(self, name, value):
+        if name in ("value", "name", "type"):
+            raise AttributeError("%s attribute is readonly" % name)
+        else:
+            self.__dict__[name] = value
+
+    def add_file(self, file_object, content_type=None, filename=None):
+        if not hasattr(file_object, "read"):
+            raise TypeError("file-like object must have read method")
+        if content_type is not None and not isstringlike(content_type):
+            raise TypeError("content type must be None or string-like")
+        if filename is not None and not isstringlike(filename):
+            raise TypeError("filename must be None or string-like")
+        if content_type is None:
+            content_type = "application/octet-stream"
+        self._upload_data.append((file_object, content_type, filename))
+
+    def _totally_ordered_pairs(self):
+        # XXX should it be successful even if unnamed?
+        if self.name is None or self.disabled:
+            return []
+        return [(self._index, self.name, "")]
+
+    def _write_mime_data(self, mw, _name, _value):
+        # called by HTMLForm
+        # assert _name == self.name and _value == ''
+        if len(self._upload_data) == 1:
+            # single file
+            file_object, content_type, filename = self._upload_data[0]
+            mw2 = mw.nextpart()
+            fn_part = filename and ('; filename="%s"' % filename) or ""
+            disp = 'form-data; name="%s"%s' % (self.name, fn_part)
+            mw2.addheader("Content-disposition", disp, prefix=1)
+            fh = mw2.startbody(content_type, prefix=0)
+            fh.write(file_object.read())
+        elif len(self._upload_data) != 0:
+            # multiple files
+            mw2 = mw.nextpart()
+            disp = 'form-data; name="%s"' % self.name
+            mw2.addheader("Content-disposition", disp, prefix=1)
+            fh = mw2.startmultipartbody("mixed", prefix=0)
+            for file_object, content_type, filename in self._upload_data:
+                mw3 = mw2.nextpart()
+                fn_part = filename and ('; filename="%s"' % filename) or ""
+                disp = "file%s" % fn_part
+                mw3.addheader("Content-disposition", disp, prefix=1)
+                fh2 = mw3.startbody(content_type, prefix=0)
+                fh2.write(file_object.read())
+            mw2.lastpart()
+
+    def __str__(self):
+        name = self.name
+        if name is None: name = "<None>"
+
+        if not self._upload_data:
+            value = "<No files added>"
+        else:
+            value = []
+            for file, ctype, filename in self._upload_data:
+                if filename is None:
+                    value.append("<Unnamed file>")
+                else:
+                    value.append(filename)
+            value = ", ".join(value)
+
+        info = []
+        if self.disabled: info.append("disabled")
+        if self.readonly: info.append("readonly")
+        info = ", ".join(info)
+        if info: info = " (%s)" % info
+
+        return "<%s(%s=%s)%s>" % (self.__class__.__name__, name, value, info)
+
+
+#---------------------------------------------------
+class IsindexControl(ScalarControl):
+    """ISINDEX control.
+
+    ISINDEX is the odd-one-out of HTML form controls.  In fact, it isn't really
+    part of regular HTML forms at all, and predates it.  You're only allowed
+    one ISINDEX per HTML document.  ISINDEX and regular form submission are
+    mutually exclusive -- either submit a form, or the ISINDEX.
+
+    Having said this, since ISINDEX controls may appear in forms (which is
+    probably bad HTML), ParseFile / ParseResponse will include them in the
+    HTMLForm instances it returns.  You can set the ISINDEX's value, as with
+    any other control (but note that ISINDEX controls have no name, so you'll
+    need to use the type argument of set_value!).  When you submit the form,
+    the ISINDEX will not be successful (ie., no data will get returned to the
+    server as a result of its presence), unless you click on the ISINDEX
+    control, in which case the ISINDEX gets submitted instead of the form:
+
+    form.set_value("my isindex value", type="isindex")
+    urllib2.urlopen(form.click(type="isindex"))
+
+    ISINDEX elements outside of FORMs are ignored.  If you want to submit one
+    by hand, do it like so:
+
+    url = urlparse.urljoin(page_uri, "?"+urllib.quote_plus("my isindex value"))
+    result = urllib2.urlopen(url)
+
+    """
+    def __init__(self, type, name, attrs, index=None):
+        ScalarControl.__init__(self, type, name, attrs, index)
+        if self._value is None:
+            self._value = ""
+
+    def is_of_kind(self, kind): return kind in ["text", "clickable"]
+
+    def _totally_ordered_pairs(self):
+        return []
+
+    def _click(self, form, coord, return_type, request_class=urllib2.Request):
+        # Relative URL for ISINDEX submission: instead of "foo=bar+baz",
+        # want "bar+baz".
+        # This doesn't seem to be specified in HTML 4.01 spec. (ISINDEX is
+        # deprecated in 4.01, but it should still say how to submit it).
+        # Submission of ISINDEX is explained in the HTML 3.2 spec, though.
+        parts = self._urlparse(form.action)
+        rest, (query, frag) = parts[:-2], parts[-2:]
+        parts = rest + (urllib.quote_plus(self.value), None)
+        url = self._urlunparse(parts)
+        req_data = url, None, []
+
+        if return_type == "pairs":
+            return []
+        elif return_type == "request_data":
+            return req_data
+        else:
+            return request_class(url)
+
+    def __str__(self):
+        value = self.value
+        if value is None: value = "<None>"
+
+        infos = []
+        if self.disabled: infos.append("disabled")
+        if self.readonly: infos.append("readonly")
+        info = ", ".join(infos)
+        if info: info = " (%s)" % info
+
+        return "<%s(%s)%s>" % (self.__class__.__name__, value, info)
+
+
+#---------------------------------------------------
+class IgnoreControl(ScalarControl):
+    """Control that we're not interested in.
+
+    Covers:
+
+    INPUT/RESET
+    BUTTON/RESET
+    INPUT/BUTTON
+    BUTTON/BUTTON
+
+    These controls are always unsuccessful, in the terminology of HTML 4 (ie.
+    they never require any information to be returned to the server).
+
+    BUTTON/BUTTON is used to generate events for script embedded in HTML.
+
+    The value attribute of IgnoreControl is always None.
+
+    """
+    def __init__(self, type, name, attrs, index=None):
+        ScalarControl.__init__(self, type, name, attrs, index)
+        self._value = None
+
+    def is_of_kind(self, kind): return False
+
+    def __setattr__(self, name, value):
+        if name == "value":
+            raise AttributeError(
+                "control '%s' is ignored, hence read-only" % self.name)
+        elif name in ("name", "type"):
+            raise AttributeError("%s attribute is readonly" % name)
+        else:
+            self.__dict__[name] = value
+
+
+#---------------------------------------------------
+# ListControls
+
+# helpers and subsidiary classes
+
+class Item:
+    def __init__(self, control, attrs, index=None):
+        label = _get_label(attrs)
+        self.__dict__.update({
+            "name": attrs["value"],
+            "_labels": label and [label] or [],
+            "attrs": attrs,
+            "_control": control,
+            "disabled": attrs.has_key("disabled"),
+            "_selected": False,
+            "id": attrs.get("id"),
+            "_index": index,
+            })
+        control.items.append(self)
+
+    def get_labels(self):
+        """Return all labels (Label instances) for this item.
+        
+        For items that represent radio buttons or checkboxes, if the item was
+        surrounded by a <label> tag, that will be the first label; all other
+        labels, connected by 'for' and 'id', are in the order that appear in
+        the HTML.
+        
+        For items that represent select options, if the option had a label
+        attribute, that will be the first label.  If the option has contents
+        (text within the option tags) and it is not the same as the label
+        attribute (if any), that will be a label.  There is nothing in the
+        spec to my knowledge that makes an option with an id unable to be the
+        target of a label's for attribute, so those are included, if any, for
+        the sake of consistency and completeness.
+
+        """
+        res = []
+        res.extend(self._labels)
+        if self.id:
+            res.extend(self._control._form._id_to_labels.get(self.id, ()))
+        return res
+
+    def __getattr__(self, name):
+        if name=="selected":
+            return self._selected
+        raise AttributeError(name)
+
+    def __setattr__(self, name, value):
+        if name == "selected":
+            self._control._set_selected_state(self, value)
+        elif name == "disabled":
+            self.__dict__["disabled"] = bool(value)
+        else:
+            raise AttributeError(name)
+
+    def __str__(self):
+        res = self.name
+        if self.selected:
+            res = "*" + res
+        if self.disabled:
+            res = "(%s)" % res
+        return res
+
+    def __repr__(self):
+        attrs = [("name", self.name), ("id", self.id)]+self.attrs.items()
+        return "<%s %s>" % (
+            self.__class__.__name__,
+            " ".join(["%s=%r" % (k, v) for k, v in attrs])
+            )
+
+def disambiguate(items, nr, **kwds):
+    msgs = []
+    for key, value in kwds.items():
+        msgs.append("%s=%r" % (key, value))
+    msg = " ".join(msgs)
+    if not items:
+        raise ItemNotFoundError(msg)
+    if nr is None:
+        if len(items) > 1:
+            raise AmbiguityError(msg)
+        nr = 0
+    if len(items) <= nr:
+        raise ItemNotFoundError(msg)
+    return items[nr]
+
+class ListControl(Control):
+    """Control representing a sequence of items.
+
+    The value attribute of a ListControl represents the successful list items
+    in the control.  The successful list items are those that are selected and
+    not disabled.
+
+    ListControl implements both list controls that take a length-1 value
+    (single-selection) and those that take length >1 values
+    (multiple-selection).
+
+    ListControls accept sequence values only.  Some controls only accept
+    sequences of length 0 or 1 (RADIO, and single-selection SELECT).
+    In those cases, ItemCountError is raised if len(sequence) > 1.  CHECKBOXes
+    and multiple-selection SELECTs (those having the "multiple" HTML attribute)
+    accept sequences of any length.
+
+    Note the following mistake:
+
+    control.value = some_value
+    assert control.value == some_value    # not necessarily true
+
+    The reason for this is that the value attribute always gives the list items
+    in the order they were listed in the HTML.
+
+    ListControl items can also be referred to by their labels instead of names.
+    Use the label argument to .get(), and the .set_value_by_label(),
+    .get_value_by_label() methods.
+
+    Note that, rather confusingly, though SELECT controls are represented in
+    HTML by SELECT elements (which contain OPTION elements, representing
+    individual list items), CHECKBOXes and RADIOs are not represented by *any*
+    element.  Instead, those controls are represented by a collection of INPUT
+    elements.  For example, this is a SELECT control, named "control1":
+
+    <select name="control1">
+     <option>foo</option>
+     <option value="1">bar</option>
+    </select>
+
+    and this is a CHECKBOX control, named "control2":
+
+    <input type="checkbox" name="control2" value="foo" id="cbe1">
+    <input type="checkbox" name="control2" value="bar" id="cbe2">
+
+    The id attribute of a CHECKBOX or RADIO ListControl is always that of its
+    first element (for example, "cbe1" above).
+
+
+    Additional read-only public attribute: multiple.
+
+    """
+
+    # ListControls are built up by the parser from their component items by
+    # creating one ListControl per item, consolidating them into a single
+    # master ListControl held by the HTMLForm:
+
+    # -User calls form.new_control(...)
+    # -Form creates Control, and calls control.add_to_form(self).
+    # -Control looks for a Control with the same name and type in the form,
+    #  and if it finds one, merges itself with that control by calling
+    #  control.merge_control(self).  The first Control added to the form, of
+    #  a particular name and type, is the only one that survives in the
+    #  form.
+    # -Form calls control.fixup for all its controls.  ListControls in the
+    #  form know they can now safely pick their default values.
+
+    # To create a ListControl without an HTMLForm, use:
+
+    # control.merge_control(new_control)
+
+    # (actually, it's much easier just to use ParseFile)
+
+    _label = None
+
+    def __init__(self, type, name, attrs={}, select_default=False,
+                 called_as_base_class=False, index=None):
+        """
+        select_default: for RADIO and multiple-selection SELECT controls, pick
+         the first item as the default if no 'selected' HTML attribute is
+         present
+
+        """
+        if not called_as_base_class:
+            raise NotImplementedError()
+
+        self.__dict__["type"] = type.lower()
+        self.__dict__["name"] = name
+        self._value = attrs.get("value")
+        self.disabled = False
+        self.readonly = False
+        self.id = attrs.get("id")
+
+        # As Controls are merged in with .merge_control(), self.attrs will
+        # refer to each Control in turn -- always the most recently merged
+        # control.  Each merged-in Control instance corresponds to a single
+        # list item: see ListControl.__doc__.
+        self.items = []
+        self._form = None
+
+        self._select_default = select_default
+        self._clicked = False
+
+    def clear(self):
+        self.value = []
+
+    def is_of_kind(self, kind):
+        if kind  == "list":
+            return True
+        elif kind == "multilist":
+            return bool(self.multiple)
+        elif kind == "singlelist":
+            return not self.multiple
+        else:
+            return False
+
+    def get_items(self, name=None, label=None, id=None,
+                  exclude_disabled=False):
+        """Return matching items by name or label.
+
+        For argument docs, see the docstring for .get()
+
+        """
+        if name is not None and not isstringlike(name):
+            raise TypeError("item name must be string-like")
+        if label is not None and not isstringlike(label):
+            raise TypeError("item label must be string-like")
+        if id is not None and not isstringlike(id):
+            raise TypeError("item id must be string-like")
+        items = []  # order is important
+        compat = self._form.backwards_compat
+        for o in self.items:
+            if exclude_disabled and o.disabled:
+                continue
+            if name is not None and o.name != name:
+                continue
+            if label is not None:
+                for l in o.get_labels():
+                    if ((compat and l.text == label) or
+                        (not compat and l.text.find(label) > -1)):
+                        break
+                else:
+                    continue
+            if id is not None and o.id != id:
+                continue
+            items.append(o)
+        return items
+
+    def get(self, name=None, label=None, id=None, nr=None,
+            exclude_disabled=False):
+        """Return item by name or label, disambiguating if necessary with nr.
+
+        All arguments must be passed by name, with the exception of 'name',
+        which may be used as a positional argument.
+
+        If name is specified, then the item must have the indicated name.
+
+        If label is specified, then the item must have a label whose
+        whitespace-compressed, stripped, text substring-matches the indicated
+        label string (eg. label="please choose" will match
+        "  Do  please  choose an item ").
+
+        If id is specified, then the item must have the indicated id.
+
+        nr is an optional 0-based index of the items matching the query.
+
+        If nr is the default None value and more than item is found, raises
+        AmbiguityError (unless the HTMLForm instance's backwards_compat
+        attribute is true).
+
+        If no item is found, or if items are found but nr is specified and not
+        found, raises ItemNotFoundError.
+
+        Optionally excludes disabled items.
+
+        """
+        if nr is None and self._form.backwards_compat:
+            nr = 0  # :-/
+        items = self.get_items(name, label, id, exclude_disabled)
+        return disambiguate(items, nr, name=name, label=label, id=id)
+
+    def _get(self, name, by_label=False, nr=None, exclude_disabled=False):
+        # strictly for use by deprecated methods
+        if by_label:
+            name, label = None, name
+        else:
+            name, label = name, None
+        return self.get(name, label, nr, exclude_disabled)
+
+    def toggle(self, name, by_label=False, nr=None):
+        """Deprecated: given a name or label and optional disambiguating index
+        nr, toggle the matching item's selection.
+
+        Selecting items follows the behavior described in the docstring of the
+        'get' method.
+
+        if the item is disabled, or this control is disabled or readonly,
+        raise AttributeError.
+
+        """
+        deprecation(
+            "item = control.get(...); item.selected = not item.selected")
+        o = self._get(name, by_label, nr)
+        self._set_selected_state(o, not o.selected)
+
+    def set(self, selected, name, by_label=False, nr=None):
+        """Deprecated: given a name or label and optional disambiguating index
+        nr, set the matching item's selection to the bool value of selected.
+
+        Selecting items follows the behavior described in the docstring of the
+        'get' method.
+
+        if the item is disabled, or this control is disabled or readonly,
+        raise AttributeError.
+
+        """
+        deprecation(
+            "control.get(...).selected = <boolean>")
+        self._set_selected_state(self._get(name, by_label, nr), selected)
+
+    def _set_selected_state(self, item, action):
+        # action:
+        # bool False: off
+        # bool True: on
+        if self.disabled:
+            raise AttributeError("control '%s' is disabled" % self.name)
+        if self.readonly:
+            raise AttributeError("control '%s' is readonly" % self.name)
+        action == bool(action)
+        compat = self._form.backwards_compat
+        if not compat and item.disabled:
+            raise AttributeError("item is disabled")
+        else:
+            if compat and item.disabled and action:
+                raise AttributeError("item is disabled")
+            if self.multiple:
+                item.__dict__["_selected"] = action
+            else:
+                if not action:
+                    item.__dict__["_selected"] = False
+                else:
+                    for o in self.items:
+                        o.__dict__["_selected"] = False
+                    item.__dict__["_selected"] = True
+
+    def toggle_single(self, by_label=None):
+        """Deprecated: toggle the selection of the single item in this control.
+        
+        Raises ItemCountError if the control does not contain only one item.
+        
+        by_label argument is ignored, and included only for backwards
+        compatibility.
+
+        """
+        deprecation(
+            "control.items[0].selected = not control.items[0].selected")
+        if len(self.items) != 1:
+            raise ItemCountError(
+                "'%s' is not a single-item control" % self.name)
+        item = self.items[0]
+        self._set_selected_state(item, not item.selected)
+
+    def set_single(self, selected, by_label=None):
+        """Deprecated: set the selection of the single item in this control.
+        
+        Raises ItemCountError if the control does not contain only one item.
+        
+        by_label argument is ignored, and included only for backwards
+        compatibility.
+
+        """
+        deprecation(
+            "control.items[0].selected = <boolean>")
+        if len(self.items) != 1:
+            raise ItemCountError(
+                "'%s' is not a single-item control" % self.name)
+        self._set_selected_state(self.items[0], selected)
+
+    def get_item_disabled(self, name, by_label=False, nr=None):
+        """Get disabled state of named list item in a ListControl."""
+        deprecation(
+            "control.get(...).disabled")
+        return self._get(name, by_label, nr).disabled
+
+    def set_item_disabled(self, disabled, name, by_label=False, nr=None):
+        """Set disabled state of named list item in a ListControl.
+
+        disabled: boolean disabled state
+
+        """
+        deprecation(
+            "control.get(...).disabled = <boolean>")
+        self._get(name, by_label, nr).disabled = disabled
+
+    def set_all_items_disabled(self, disabled):
+        """Set disabled state of all list items in a ListControl.
+
+        disabled: boolean disabled state
+
+        """
+        for o in self.items:
+            o.disabled = disabled
+
+    def get_item_attrs(self, name, by_label=False, nr=None):
+        """Return dictionary of HTML attributes for a single ListControl item.
+
+        The HTML element types that describe list items are: OPTION for SELECT
+        controls, INPUT for the rest.  These elements have HTML attributes that
+        you may occasionally want to know about -- for example, the "alt" HTML
+        attribute gives a text string describing the item (graphical browsers
+        usually display this as a tooltip).
+
+        The returned dictionary maps HTML attribute names to values.  The names
+        and values are taken from the original HTML.
+
+        """
+        deprecation(
+            "control.get(...).attrs")
+        return self._get(name, by_label, nr).attrs
+
+    def add_to_form(self, form):
+        assert self._form is None or form == self._form, (
+            "can't add control to more than one form")
+        self._form = form
+        if self.name is None:
+            # always count nameless elements as separate controls
+            Control.add_to_form(self, form)
+        else:
+            try:
+                control = form.find_control(self.name, self.type)
+            except (ControlNotFoundError, AmbiguityError):
+                Control.add_to_form(self, form)
+            else:
+                control.merge_control(self)
+
+    def merge_control(self, control):
+        assert bool(control.multiple) == bool(self.multiple)
+        # usually, isinstance(control, self.__class__)
+        self.items.extend(control.items)
+
+    def fixup(self):
+        """
+        ListControls are built up from component list items (which are also
+        ListControls) during parsing.  This method should be called after all
+        items have been added.  See ListControl.__doc__ for the reason this is
+        required.
+
+        """
+        # Need to set default selection where no item was indicated as being
+        # selected by the HTML:
+
+        # CHECKBOX:
+        #  Nothing should be selected.
+        # SELECT/single, SELECT/multiple and RADIO:
+        #  RFC 1866 (HTML 2.0): says first item should be selected.
+        #  W3C HTML 4.01 Specification: says that client behaviour is
+        #   undefined in this case.  For RADIO, exactly one must be selected,
+        #   though which one is undefined.
+        #  Both Netscape and Microsoft Internet Explorer (IE) choose first
+        #   item for SELECT/single.  However, both IE5 and Mozilla (both 1.0
+        #   and Firebird 0.6) leave all items unselected for RADIO and
+        #   SELECT/multiple.
+
+        # Since both Netscape and IE all choose the first item for
+        # SELECT/single, we do the same.  OTOH, both Netscape and IE
+        # leave SELECT/multiple with nothing selected, in violation of RFC 1866
+        # (but not in violation of the W3C HTML 4 standard); the same is true
+        # of RADIO (which *is* in violation of the HTML 4 standard).  We follow
+        # RFC 1866 if the _select_default attribute is set, and Netscape and IE
+        # otherwise.  RFC 1866 and HTML 4 are always violated insofar as you
+        # can deselect all items in a RadioControl.
+        
+        for o in self.items: 
+            # set items' controls to self, now that we've merged
+            o.__dict__["_control"] = self
+
+    def __getattr__(self, name):
+        if name == "value":
+            compat = self._form.backwards_compat
+            if self.name is None:
+                return []
+            return [o.name for o in self.items if o.selected and
+                    (not o.disabled or compat)]
+        else:
+            raise AttributeError("%s instance has no attribute '%s'" %
+                                 (self.__class__.__name__, name))
+
+    def __setattr__(self, name, value):
+        if name == "value":
+            if self.disabled:
+                raise AttributeError("control '%s' is disabled" % self.name)
+            if self.readonly:
+                raise AttributeError("control '%s' is readonly" % self.name)
+            self._set_value(value)
+        elif name in ("name", "type", "multiple"):
+            raise AttributeError("%s attribute is readonly" % name)
+        else:
+            self.__dict__[name] = value
+
+    def _set_value(self, value):
+        if value is None or isstringlike(value):
+            raise TypeError("ListControl, must set a sequence")
+        if not value:
+            compat = self._form.backwards_compat
+            for o in self.items:
+                if not o.disabled or compat:
+                    o.selected = False
+        elif self.multiple:
+            self._multiple_set_value(value)
+        elif len(value) > 1:
+            raise ItemCountError(
+                "single selection list, must set sequence of "
+                "length 0 or 1")
+        else:
+            self._single_set_value(value)
+
+    def _get_items(self, name, target=1):
+        all_items = self.get_items(name)
+        items = [o for o in all_items if not o.disabled]
+        if len(items) < target:
+            if len(all_items) < target:
+                raise ItemNotFoundError(
+                    "insufficient items with name %r" % name)
+            else:
+                raise AttributeError(
+                    "insufficient non-disabled items with name %s" % name)
+        on = []
+        off = []
+        for o in items:
+            if o.selected:
+                on.append(o)
+            else:
+                off.append(o)
+        return on, off
+
+    def _single_set_value(self, value):
+        assert len(value) == 1
+        on, off = self._get_items(value[0])
+        assert len(on) <= 1
+        if not on:
+            off[0].selected = True
+
+    def _multiple_set_value(self, value):
+        compat = self._form.backwards_compat
+        turn_on = []  # transactional-ish
+        turn_off = [item for item in self.items if
+                    item.selected and (not item.disabled or compat)]
+        names = {}
+        for nn in value:
+            if nn in names.keys():
+                names[nn] += 1
+            else:
+                names[nn] = 1
+        for name, count in names.items():
+            on, off = self._get_items(name, count)
+            for i in range(count):
+                if on:
+                    item = on[0]
+                    del on[0]
+                    del turn_off[turn_off.index(item)]
+                else:
+                    item = off[0]
+                    del off[0]
+                    turn_on.append(item)
+        for item in turn_off:
+            item.selected = False
+        for item in turn_on:
+            item.selected = True
+
+    def set_value_by_label(self, value):
+        """Set the value of control by item labels.
+
+        value is expected to be an iterable of strings that are substrings of
+        the item labels that should be selected.  Before substring matching is
+        performed, the original label text is whitespace-compressed
+        (consecutive whitespace characters are converted to a single space
+        character) and leading and trailing whitespace is stripped.  Ambiguous
+        labels are accepted without complaint if the form's backwards_compat is
+        True; otherwise, it will not complain as long as all ambiguous labels
+        share the same item name (e.g. OPTION value).
+
+        """
+        if isstringlike(value):
+            raise TypeError(value)
+        if not self.multiple and len(value) > 1:
+            raise ItemCountError(
+                "single selection list, must set sequence of "
+                "length 0 or 1")
+        items = []
+        for nn in value:
+            found = self.get_items(label=nn)
+            if len(found) > 1:
+                if not self._form.backwards_compat:
+                    # ambiguous labels are fine as long as item names (e.g.
+                    # OPTION values) are same
+                    opt_name = found[0].name
+                    if [o for o in found[1:] if o.name != opt_name]:
+                        raise AmbiguityError(nn)
+                else:
+                    # OK, we'll guess :-(  Assume first available item.
+                    found = found[:1]
+            for o in found:
+                # For the multiple-item case, we could try to be smarter,
+                # saving them up and trying to resolve, but that's too much.
+                if self._form.backwards_compat or o not in items:
+                    items.append(o)
+                    break
+            else:  # all of them are used
+                raise ItemNotFoundError(nn)
+        # now we have all the items that should be on
+        # let's just turn everything off and then back on.
+        self.value = []
+        for o in items:
+            o.selected = True
+
+    def get_value_by_label(self):
+        """Return the value of the control as given by normalized labels."""
+        res = []
+        compat = self._form.backwards_compat
+        for o in self.items:
+            if (not o.disabled or compat) and o.selected:
+                for l in o.get_labels():
+                    if l.text:
+                        res.append(l.text)
+                        break
+                else:
+                    res.append(None)
+        return res
+
+    def possible_items(self, by_label=False):
+        """Deprecated: return the names or labels of all possible items.
+
+        Includes disabled items, which may be misleading for some use cases.
+
+        """
+        deprecation(
+            "[item.name for item in self.items]")
+        if by_label:
+            res = []
+            for o in self.items:
+                for l in o.get_labels():
+                    if l.text:
+                        res.append(l.text)
+                        break
+                else:
+                    res.append(None)
+            return res
+        return [o.name for o in self.items]
+
+    def _totally_ordered_pairs(self):
+        if self.disabled or self.name is None:
+            return []
+        else:
+            return [(o._index, self.name, o.name) for o in self.items
+                    if o.selected and not o.disabled]
+
+    def __str__(self):
+        name = self.name
+        if name is None: name = "<None>"
+
+        display = [str(o) for o in self.items]
+
+        infos = []
+        if self.disabled: infos.append("disabled")
+        if self.readonly: infos.append("readonly")
+        info = ", ".join(infos)
+        if info: info = " (%s)" % info
+
+        return "<%s(%s=[%s])%s>" % (self.__class__.__name__,
+                                    name, ", ".join(display), info)
+
+
+class RadioControl(ListControl):
+    """
+    Covers:
+
+    INPUT/RADIO
+
+    """
+    def __init__(self, type, name, attrs, select_default=False, index=None):
+        attrs.setdefault("value", "on")
+        ListControl.__init__(self, type, name, attrs, select_default,
+                             called_as_base_class=True, index=index)
+        self.__dict__["multiple"] = False
+        o = Item(self, attrs, index)
+        o.__dict__["_selected"] = attrs.has_key("checked")
+
+    def fixup(self):
+        ListControl.fixup(self)
+        found = [o for o in self.items if o.selected and not o.disabled]
+        if not found:
+            if self._select_default:
+                for o in self.items:
+                    if not o.disabled:
+                        o.selected = True
+                        break
+        else:
+            # Ensure only one item selected.  Choose the last one,
+            # following IE and Firefox.
+            for o in found[:-1]:
+                o.selected = False
+
+    def get_labels(self):
+        return []
+
+class CheckboxControl(ListControl):
+    """
+    Covers:
+
+    INPUT/CHECKBOX
+
+    """
+    def __init__(self, type, name, attrs, select_default=False, index=None):
+        attrs.setdefault("value", "on")
+        ListControl.__init__(self, type, name, attrs, select_default,
+                             called_as_base_class=True, index=index)
+        self.__dict__["multiple"] = True
+        o = Item(self, attrs, index)
+        o.__dict__["_selected"] = attrs.has_key("checked")
+
+    def get_labels(self):
+        return []
+
+
+class SelectControl(ListControl):
+    """
+    Covers:
+
+    SELECT (and OPTION)
+
+
+    OPTION 'values', in HTML parlance, are Item 'names' in ClientForm parlance.
+
+    SELECT control values and labels are subject to some messy defaulting
+    rules.  For example, if the HTML representation of the control is:
+
+    <SELECT name=year>
+      <OPTION value=0 label="2002">current year</OPTION>
+      <OPTION value=1>2001</OPTION>
+      <OPTION>2000</OPTION>
+    </SELECT>
+
+    The items, in order, have labels "2002", "2001" and "2000", whereas their
+    names (the OPTION values) are "0", "1" and "2000" respectively.  Note that
+    the value of the last OPTION in this example defaults to its contents, as
+    specified by RFC 1866, as do the labels of the second and third OPTIONs.
+
+    The OPTION labels are sometimes more meaningful than the OPTION values,
+    which can make for more maintainable code.
+
+    Additional read-only public attribute: attrs
+
+    The attrs attribute is a dictionary of the original HTML attributes of the
+    SELECT element.  Other ListControls do not have this attribute, because in
+    other cases the control as a whole does not correspond to any single HTML
+    element.  control.get(...).attrs may be used as usual to get at the HTML
+    attributes of the HTML elements corresponding to individual list items (for
+    SELECT controls, these are OPTION elements).
+
+    Another special case is that the Item.attrs dictionaries have a special key
+    "contents" which does not correspond to any real HTML attribute, but rather
+    contains the contents of the OPTION element:
+
+    <OPTION>this bit</OPTION>
+
+    """
+    # HTML attributes here are treated slightly differently from other list
+    # controls:
+    # -The SELECT HTML attributes dictionary is stuffed into the OPTION
+    #  HTML attributes dictionary under the "__select" key.
+    # -The content of each OPTION element is stored under the special
+    #  "contents" key of the dictionary.
+    # After all this, the dictionary is passed to the SelectControl constructor
+    # as the attrs argument, as usual.  However:
+    # -The first SelectControl constructed when building up a SELECT control
+    #  has a constructor attrs argument containing only the __select key -- so
+    #  this SelectControl represents an empty SELECT control.
+    # -Subsequent SelectControls have both OPTION HTML-attribute in attrs and
+    #  the __select dictionary containing the SELECT HTML-attributes.
+
+    def __init__(self, type, name, attrs, select_default=False, index=None):
+        # fish out the SELECT HTML attributes from the OPTION HTML attributes
+        # dictionary
+        self.attrs = attrs["__select"].copy()
+        self.__dict__["_label"] = _get_label(self.attrs)
+        self.__dict__["id"] = self.attrs.get("id")
+        self.__dict__["multiple"] = self.attrs.has_key("multiple")
+        # the majority of the contents, label, and value dance already happened
+        contents = attrs.get("contents")
+        attrs = attrs.copy()
+        del attrs["__select"]
+
+        ListControl.__init__(self, type, name, self.attrs, select_default,
+                             called_as_base_class=True, index=index)
+        self.disabled = self.attrs.has_key("disabled")
+        self.readonly = self.attrs.has_key("readonly")
+        if attrs.has_key("value"):
+            # otherwise it is a marker 'select started' token
+            o = Item(self, attrs, index)
+            o.__dict__["_selected"] = attrs.has_key("selected")
+            # add 'label' label and contents label, if different.  If both are
+            # provided, the 'label' label is used for display in HTML 
+            # 4.0-compliant browsers (and any lower spec? not sure) while the
+            # contents are used for display in older or less-compliant
+            # browsers.  We make label objects for both, if the values are
+            # different.
+            label = attrs.get("label")
+            if label:
+                o._labels.append(Label({"__text": label}))
+                if contents and contents != label:
+                    o._labels.append(Label({"__text": contents}))
+            elif contents:
+                o._labels.append(Label({"__text": contents}))
+
+    def fixup(self):
+        ListControl.fixup(self)
+        # Firefox doesn't exclude disabled items from those considered here
+        # (i.e. from 'found', for both branches of the if below).  Note that
+        # IE6 doesn't support the disabled attribute on OPTIONs at all.
+        found = [o for o in self.items if o.selected]
+        if not found:
+            if not self.multiple or self._select_default:
+                for o in self.items:
+                    if not o.disabled:
+                        was_disabled = self.disabled
+                        self.disabled = False
+                        try:
+                            o.selected = True
+                        finally:
+                            o.disabled = was_disabled
+                        break
+        elif not self.multiple:
+            # Ensure only one item selected.  Choose the last one,
+            # following IE and Firefox.
+            for o in found[:-1]:
+                o.selected = False
+
+
+#---------------------------------------------------
+class SubmitControl(ScalarControl):
+    """
+    Covers:
+
+    INPUT/SUBMIT
+    BUTTON/SUBMIT
+
+    """
+    def __init__(self, type, name, attrs, index=None):
+        ScalarControl.__init__(self, type, name, attrs, index)
+        # IE5 defaults SUBMIT value to "Submit Query"; Firebird 0.6 leaves it
+        # blank, Konqueror 3.1 defaults to "Submit".  HTML spec. doesn't seem
+        # to define this.
+        if self.value is None: self.value = ""
+        self.readonly = True
+
+    def get_labels(self):
+        res = []
+        if self.value:
+            res.append(Label({"__text": self.value}))
+        res.extend(ScalarControl.get_labels(self))
+        return res
+
+    def is_of_kind(self, kind): return kind == "clickable"
+
+    def _click(self, form, coord, return_type, request_class=urllib2.Request):
+        self._clicked = coord
+        r = form._switch_click(return_type, request_class)
+        self._clicked = False
+        return r
+
+    def _totally_ordered_pairs(self):
+        if not self._clicked:
+            return []
+        return ScalarControl._totally_ordered_pairs(self)
+
+
+#---------------------------------------------------
+class ImageControl(SubmitControl):
+    """
+    Covers:
+
+    INPUT/IMAGE
+
+    Coordinates are specified using one of the HTMLForm.click* methods.
+
+    """
+    def __init__(self, type, name, attrs, index=None):
+        SubmitControl.__init__(self, type, name, attrs, index)
+        self.readonly = False
+
+    def _totally_ordered_pairs(self):
+        clicked = self._clicked
+        if self.disabled or not clicked:
+            return []
+        name = self.name
+        if name is None: return []
+        pairs = [
+            (self._index, "%s.x" % name, str(clicked[0])),
+            (self._index+1, "%s.y" % name, str(clicked[1])),
+            ]
+        value = self._value
+        if value:
+            pairs.append((self._index+2, name, value))
+        return pairs
+
+    get_labels = ScalarControl.get_labels
+
+# aliases, just to make str(control) and str(form) clearer
+class PasswordControl(TextControl): pass
+class HiddenControl(TextControl): pass
+class TextareaControl(TextControl): pass
+class SubmitButtonControl(SubmitControl): pass
+
+
+def is_listcontrol(control): return control.is_of_kind("list")
+
+
+class HTMLForm:
+    """Represents a single HTML <form> ... </form> element.
+
+    A form consists of a sequence of controls that usually have names, and
+    which can take on various values.  The values of the various types of
+    controls represent variously: text, zero-or-one-of-many or many-of-many
+    choices, and files to be uploaded.  Some controls can be clicked on to
+    submit the form, and clickable controls' values sometimes include the
+    coordinates of the click.
+
+    Forms can be filled in with data to be returned to the server, and then
+    submitted, using the click method to generate a request object suitable for
+    passing to urllib2.urlopen (or the click_request_data or click_pairs
+    methods if you're not using urllib2).
+
+    import ClientForm
+    forms = ClientForm.ParseFile(html, base_uri)
+    form = forms[0]
+
+    form["query"] = "Python"
+    form.find_control("nr_results").get("lots").selected = True
+
+    response = urllib2.urlopen(form.click())
+
+    Usually, HTMLForm instances are not created directly.  Instead, the
+    ParseFile or ParseResponse factory functions are used.  If you do construct
+    HTMLForm objects yourself, however, note that an HTMLForm instance is only
+    properly initialised after the fixup method has been called (ParseFile and
+    ParseResponse do this for you).  See ListControl.__doc__ for the reason
+    this is required.
+
+    Indexing a form (form["control_name"]) returns the named Control's value
+    attribute.  Assignment to a form index (form["control_name"] = something)
+    is equivalent to assignment to the named Control's value attribute.  If you
+    need to be more specific than just supplying the control's name, use the
+    set_value and get_value methods.
+
+    ListControl values are lists of item names (specifically, the names of the
+    items that are selected and not disabled, and hence are "successful" -- ie.
+    cause data to be returned to the server).  The list item's name is the
+    value of the corresponding HTML element's"value" attribute.
+
+    Example:
+
+      <INPUT type="CHECKBOX" name="cheeses" value="leicester"></INPUT>
+      <INPUT type="CHECKBOX" name="cheeses" value="cheddar"></INPUT>
+
+    defines a CHECKBOX control with name "cheeses" which has two items, named
+    "leicester" and "cheddar".
+
+    Another example:
+
+      <SELECT name="more_cheeses">
+        <OPTION>1</OPTION>
+        <OPTION value="2" label="CHEDDAR">cheddar</OPTION>
+      </SELECT>
+
+    defines a SELECT control with name "more_cheeses" which has two items,
+    named "1" and "2" (because the OPTION element's value HTML attribute
+    defaults to the element contents -- see SelectControl.__doc__ for more on
+    these defaulting rules).
+
+    To select, deselect or otherwise manipulate individual list items, use the
+    HTMLForm.find_control() and ListControl.get() methods.  To set the whole
+    value, do as for any other control: use indexing or the set_/get_value
+    methods.
+
+    Example:
+
+    # select *only* the item named "cheddar"
+    form["cheeses"] = ["cheddar"]
+    # select "cheddar", leave other items unaffected
+    form.find_control("cheeses").get("cheddar").selected = True
+
+    Some controls (RADIO and SELECT without the multiple attribute) can only
+    have zero or one items selected at a time.  Some controls (CHECKBOX and
+    SELECT with the multiple attribute) can have multiple items selected at a
+    time.  To set the whole value of a ListControl, assign a sequence to a form
+    index:
+
+    form["cheeses"] = ["cheddar", "leicester"]
+
+    If the ListControl is not multiple-selection, the assigned list must be of
+    length one.
+
+    To check if a control has an item, if an item is selected, or if an item is
+    successful (selected and not disabled), respectively:
+
+    "cheddar" in [item.name for item in form.find_control("cheeses").items]
+    "cheddar" in [item.name for item in form.find_control("cheeses").items and
+                  item.selected]
+    "cheddar" in form["cheeses"]  # (or "cheddar" in form.get_value("cheeses"))
+
+    Note that some list items may be disabled (see below).
+
+    Note the following mistake:
+
+    form[control_name] = control_value
+    assert form[control_name] == control_value  # not necessarily true
+
+    The reason for this is that form[control_name] always gives the list items
+    in the order they were listed in the HTML.
+
+    List items (hence list values, too) can be referred to in terms of list
+    item labels rather than list item names using the appropriate label
+    arguments.  Note that each item may have several labels.
+
+    The question of default values of OPTION contents, labels and values is
+    somewhat complicated: see SelectControl.__doc__ and
+    ListControl.get_item_attrs.__doc__ if you think you need to know.
+
+    Controls can be disabled or readonly.  In either case, the control's value
+    cannot be changed until you clear those flags (see example below).
+    Disabled is the state typically represented by browsers by 'greying out' a
+    control.  Disabled controls are not 'successful' -- they don't cause data
+    to get returned to the server.  Readonly controls usually appear in
+    browsers as read-only text boxes.  Readonly controls are successful.  List
+    items can also be disabled.  Attempts to select or deselect disabled items
+    fail with AttributeError.
+
+    If a lot of controls are readonly, it can be useful to do this:
+
+    form.set_all_readonly(False)
+
+    To clear a control's value attribute, so that it is not successful (until a
+    value is subsequently set):
+
+    form.clear("cheeses")
+
+    More examples:
+
+    control = form.find_control("cheeses")
+    control.disabled = False
+    control.readonly = False
+    control.get("gruyere").disabled = True
+    control.items[0].selected = True
+
+    See the various Control classes for further documentation.  Many methods
+    take name, type, kind, id, label and nr arguments to specify the control to
+    be operated on: see HTMLForm.find_control.__doc__.
+
+    ControlNotFoundError (subclass of ValueError) is raised if the specified
+    control can't be found.  This includes occasions where a non-ListControl
+    is found, but the method (set, for example) requires a ListControl.
+    ItemNotFoundError (subclass of ValueError) is raised if a list item can't
+    be found.  ItemCountError (subclass of ValueError) is raised if an attempt
+    is made to select more than one item and the control doesn't allow that, or
+    set/get_single are called and the control contains more than one item.
+    AttributeError is raised if a control or item is readonly or disabled and
+    an attempt is made to alter its value.
+
+    Security note: Remember that any passwords you store in HTMLForm instances
+    will be saved to disk in the clear if you pickle them (directly or
+    indirectly).  The simplest solution to this is to avoid pickling HTMLForm
+    objects.  You could also pickle before filling in any password, or just set
+    the password to "" before pickling.
+
+
+    Public attributes:
+
+    action: full (absolute URI) form action
+    method: "GET" or "POST"
+    enctype: form transfer encoding MIME type
+    name: name of form (None if no name was specified)
+    attrs: dictionary mapping original HTML form attributes to their values
+
+    controls: list of Control instances; do not alter this list
+     (instead, call form.new_control to make a Control and add it to the
+     form, or control.add_to_form if you already have a Control instance)
+
+
+
+    Methods for form filling:
+    -------------------------
+
+    Most of the these methods have very similar arguments.  See
+    HTMLForm.find_control.__doc__ for details of the name, type, kind, label
+    and nr arguments.
+
+    def find_control(self,
+                     name=None, type=None, kind=None, id=None, predicate=None,
+                     nr=None, label=None)
+
+    get_value(name=None, type=None, kind=None, id=None, nr=None,
+              by_label=False,  # by_label is deprecated
+              label=None)
+    set_value(value,
+              name=None, type=None, kind=None, id=None, nr=None,
+              by_label=False,  # by_label is deprecated
+              label=None)
+
+    clear_all()
+    clear(name=None, type=None, kind=None, id=None, nr=None, label=None)
+
+    set_all_readonly(readonly)
+
+
+    Method applying only to FileControls:
+
+    add_file(file_object,
+             content_type="application/octet-stream", filename=None,
+             name=None, id=None, nr=None, label=None)
+
+
+    Methods applying only to clickable controls:
+
+    click(name=None, type=None, id=None, nr=0, coord=(1,1), label=None)
+    click_request_data(name=None, type=None, id=None, nr=0, coord=(1,1),
+                       label=None)
+    click_pairs(name=None, type=None, id=None, nr=0, coord=(1,1), label=None)
+
+    """
+
+    type2class = {
+        "text": TextControl,
+        "password": PasswordControl,
+        "hidden": HiddenControl,
+        "textarea": TextareaControl,
+
+        "isindex": IsindexControl,
+
+        "file": FileControl,
+
+        "button": IgnoreControl,
+        "buttonbutton": IgnoreControl,
+        "reset": IgnoreControl,
+        "resetbutton": IgnoreControl,
+
+        "submit": SubmitControl,
+        "submitbutton": SubmitButtonControl,
+        "image": ImageControl,
+
+        "radio": RadioControl,
+        "checkbox": CheckboxControl,
+        "select": SelectControl,
+        }
+
+#---------------------------------------------------
+# Initialisation.  Use ParseResponse / ParseFile instead.
+
+    def __init__(self, action, method="GET",
+                 enctype="application/x-www-form-urlencoded",
+                 name=None, attrs=None,
+                 request_class=urllib2.Request,
+                 forms=None, labels=None, id_to_labels=None,
+                 backwards_compat=True):
+        """
+        In the usual case, use ParseResponse (or ParseFile) to create new
+        HTMLForm objects.
+
+        action: full (absolute URI) form action
+        method: "GET" or "POST"
+        enctype: form transfer encoding MIME type
+        name: name of form
+        attrs: dictionary mapping original HTML form attributes to their values
+
+        """
+        self.action = action
+        self.method = method
+        self.enctype = enctype
+        self.name = name
+        if attrs is not None:
+            self.attrs = attrs.copy()
+        else:
+            self.attrs = {}
+        self.controls = []
+        self._request_class = request_class
+
+        # these attributes are used by zope.testbrowser
+        self._forms = forms  # this is a semi-public API!
+        self._labels = labels  # this is a semi-public API!
+        self._id_to_labels = id_to_labels  # this is a semi-public API!
+
+        self.backwards_compat = backwards_compat  # note __setattr__
+
+        self._urlunparse = urlparse.urlunparse
+        self._urlparse = urlparse.urlparse
+
+    def __getattr__(self, name):
+        if name == "backwards_compat":
+            return self._backwards_compat
+        return getattr(HTMLForm, name)
+
+    def __setattr__(self, name, value):
+        # yuck
+        if name == "backwards_compat":
+            name = "_backwards_compat"
+            value = bool(value)
+            for cc in self.controls:
+                try:
+                    items = cc.items 
+                except AttributeError:
+                    continue
+                else:
+                    for ii in items:
+                        for ll in ii.get_labels():
+                            ll._backwards_compat = value
+        self.__dict__[name] = value
+
+    def new_control(self, type, name, attrs,
+                    ignore_unknown=False, select_default=False, index=None):
+        """Adds a new control to the form.
+
+        This is usually called by ParseFile and ParseResponse.  Don't call it
+        youself unless you're building your own Control instances.
+
+        Note that controls representing lists of items are built up from
+        controls holding only a single list item.  See ListControl.__doc__ for
+        further information.
+
+        type: type of control (see Control.__doc__ for a list)
+        attrs: HTML attributes of control
+        ignore_unknown: if true, use a dummy Control instance for controls of
+         unknown type; otherwise, use a TextControl
+        select_default: for RADIO and multiple-selection SELECT controls, pick
+         the first item as the default if no 'selected' HTML attribute is
+         present (this defaulting happens when the HTMLForm.fixup method is
+         called)
+        index: index of corresponding element in HTML (see
+         MoreFormTests.test_interspersed_controls for motivation)
+
+        """
+        type = type.lower()
+        klass = self.type2class.get(type)
+        if klass is None:
+            if ignore_unknown:
+                klass = IgnoreControl
+            else:
+                klass = TextControl
+
+        a = attrs.copy()
+        if issubclass(klass, ListControl):
+            control = klass(type, name, a, select_default, index)
+        else:
+            control = klass(type, name, a, index)
+        control.add_to_form(self)
+        control._urlparse = self._urlparse
+        control._urlunparse = self._urlunparse
+
+    def fixup(self):
+        """Normalise form after all controls have been added.
+
+        This is usually called by ParseFile and ParseResponse.  Don't call it
+        youself unless you're building your own Control instances.
+
+        This method should only be called once, after all controls have been
+        added to the form.
+
+        """
+        for control in self.controls:
+            control.fixup()
+        self.backwards_compat = self._backwards_compat
+
+#---------------------------------------------------
+    def __str__(self):
+        header = "%s%s %s %s" % (
+            (self.name and self.name+" " or ""),
+            self.method, self.action, self.enctype)
+        rep = [header]
+        for control in self.controls:
+            rep.append("  %s" % str(control))
+        return "<%s>" % "\n".join(rep)
+
+#---------------------------------------------------
+# Form-filling methods.
+
+    def __getitem__(self, name):
+        return self.find_control(name).value
+    def __contains__(self, name):
+        return bool(self.find_control(name))
+    def __setitem__(self, name, value):
+        control = self.find_control(name)
+        try:
+            control.value = value
+        except AttributeError, e:
+            raise ValueError(str(e))
+
+    def get_value(self,
+                  name=None, type=None, kind=None, id=None, nr=None,
+                  by_label=False,  # by_label is deprecated
+                  label=None):
+        """Return value of control.
+
+        If only name and value arguments are supplied, equivalent to
+
+        form[name]
+
+        """
+        if by_label:
+            deprecation("form.get_value_by_label(...)")
+        c = self.find_control(name, type, kind, id, label=label, nr=nr)
+        if by_label:
+            try:
+                meth = c.get_value_by_label
+            except AttributeError:
+                raise NotImplementedError(
+                    "control '%s' does not yet support by_label" % c.name)
+            else:
+                return meth()
+        else:
+            return c.value
+    def set_value(self, value,
+                  name=None, type=None, kind=None, id=None, nr=None,
+                  by_label=False,  # by_label is deprecated
+                  label=None):
+        """Set value of control.
+
+        If only name and value arguments are supplied, equivalent to
+
+        form[name] = value
+
+        """
+        if by_label:
+            deprecation("form.get_value_by_label(...)")
+        c = self.find_control(name, type, kind, id, label=label, nr=nr)
+        if by_label:
+            try:
+                meth = c.set_value_by_label
+            except AttributeError:
+                raise NotImplementedError(
+                    "control '%s' does not yet support by_label" % c.name)
+            else:
+                meth(value)
+        else:
+            c.value = value
+    def get_value_by_label(
+        self, name=None, type=None, kind=None, id=None, label=None, nr=None):
+        """
+
+        All arguments should be passed by name.
+
+        """
+        c = self.find_control(name, type, kind, id, label=label, nr=nr)
+        return c.get_value_by_label()
+
+    def set_value_by_label(
+        self, value,
+        name=None, type=None, kind=None, id=None, label=None, nr=None):
+        """
+
+        All arguments should be passed by name.
+
+        """
+        c = self.find_control(name, type, kind, id, label=label, nr=nr)
+        c.set_value_by_label(value)
+
+    def set_all_readonly(self, readonly):
+        for control in self.controls:
+            control.readonly = bool(readonly)
+
+    def clear_all(self):
+        """Clear the value attributes of all controls in the form.
+
+        See HTMLForm.clear.__doc__.
+
+        """
+        for control in self.controls:
+            control.clear()
+
+    def clear(self,
+              name=None, type=None, kind=None, id=None, nr=None, label=None):
+        """Clear the value attribute of a control.
+
+        As a result, the affected control will not be successful until a value
+        is subsequently set.  AttributeError is raised on readonly controls.
+
+        """
+        c = self.find_control(name, type, kind, id, label=label, nr=nr)
+        c.clear()
+
+
+#---------------------------------------------------
+# Form-filling methods applying only to ListControls.
+
+    def possible_items(self,  # deprecated
+                       name=None, type=None, kind=None, id=None,
+                       nr=None, by_label=False, label=None):
+        """Return a list of all values that the specified control can take."""
+        c = self._find_list_control(name, type, kind, id, label, nr)
+        return c.possible_items(by_label)
+
+    def set(self, selected, item_name,  # deprecated
+            name=None, type=None, kind=None, id=None, nr=None,
+            by_label=False, label=None):
+        """Select / deselect named list item.
+
+        selected: boolean selected state
+
+        """
+        self._find_list_control(name, type, kind, id, label, nr).set(
+            selected, item_name, by_label)
+    def toggle(self, item_name,  # deprecated
+               name=None, type=None, kind=None, id=None, nr=None,
+               by_label=False, label=None):
+        """Toggle selected state of named list item."""
+        self._find_list_control(name, type, kind, id, label, nr).toggle(
+            item_name, by_label)
+
+    def set_single(self, selected,  # deprecated
+                   name=None, type=None, kind=None, id=None,
+                   nr=None, by_label=None, label=None):
+        """Select / deselect list item in a control having only one item.
+
+        If the control has multiple list items, ItemCountError is raised.
+
+        This is just a convenience method, so you don't need to know the item's
+        name -- the item name in these single-item controls is usually
+        something meaningless like "1" or "on".
+
+        For example, if a checkbox has a single item named "on", the following
+        two calls are equivalent:
+
+        control.toggle("on")
+        control.toggle_single()
+
+        """  # by_label ignored and deprecated
+        self._find_list_control(
+            name, type, kind, id, label, nr).set_single(selected)
+    def toggle_single(self, name=None, type=None, kind=None, id=None,
+                      nr=None, by_label=None, label=None):  # deprecated
+        """Toggle selected state of list item in control having only one item.
+
+        The rest is as for HTMLForm.set_single.__doc__.
+
+        """  # by_label ignored and deprecated
+        self._find_list_control(name, type, kind, id, label, nr).toggle_single()
+
+#---------------------------------------------------
+# Form-filling method applying only to FileControls.
+
+    def add_file(self, file_object, content_type=None, filename=None,
+                 name=None, id=None, nr=None, label=None):
+        """Add a file to be uploaded.
+
+        file_object: file-like object (with read method) from which to read
+         data to upload
+        content_type: MIME content type of data to upload
+        filename: filename to pass to server
+
+        If filename is None, no filename is sent to the server.
+
+        If content_type is None, the content type is guessed based on the
+        filename and the data from read from the file object.
+
+        XXX
+        At the moment, guessed content type is always application/octet-stream.
+        Use sndhdr, imghdr modules.  Should also try to guess HTML, XML, and
+        plain text.
+
+        Note the following useful HTML attributes of file upload controls (see
+        HTML 4.01 spec, section 17):
+
+        accept: comma-separated list of content types that the server will
+         handle correctly; you can use this to filter out non-conforming files
+        size: XXX IIRC, this is indicative of whether form wants multiple or
+         single files
+        maxlength: XXX hint of max content length in bytes?
+
+        """
+        self.find_control(name, "file", id=id, label=label, nr=nr).add_file(
+            file_object, content_type, filename)
+
+#---------------------------------------------------
+# Form submission methods, applying only to clickable controls.
+
+    def click(self, name=None, type=None, id=None, nr=0, coord=(1,1),
+              request_class=urllib2.Request,
+              label=None):
+        """Return request that would result from clicking on a control.
+
+        The request object is a urllib2.Request instance, which you can pass to
+        urllib2.urlopen (or ClientCookie.urlopen).
+
+        Only some control types (INPUT/SUBMIT & BUTTON/SUBMIT buttons and
+        IMAGEs) can be clicked.
+
+        Will click on the first clickable control, subject to the name, type
+        and nr arguments (as for find_control).  If no name, type, id or number
+        is specified and there are no clickable controls, a request will be
+        returned for the form in its current, un-clicked, state.
+
+        IndexError is raised if any of name, type, id or nr is specified but no
+        matching control is found.  ValueError is raised if the HTMLForm has an
+        enctype attribute that is not recognised.
+
+        You can optionally specify a coordinate to click at, which only makes a
+        difference if you clicked on an image.
+
+        """
+        return self._click(name, type, id, label, nr, coord, "request",
+                           self._request_class)
+
+    def click_request_data(self,
+                           name=None, type=None, id=None,
+                           nr=0, coord=(1,1),
+                           request_class=urllib2.Request,
+                           label=None):
+        """As for click method, but return a tuple (url, data, headers).
+
+        You can use this data to send a request to the server.  This is useful
+        if you're using httplib or urllib rather than urllib2.  Otherwise, use
+        the click method.
+
+        # Untested.  Have to subclass to add headers, I think -- so use urllib2
+        # instead!
+        import urllib
+        url, data, hdrs = form.click_request_data()
+        r = urllib.urlopen(url, data)
+
+        # Untested.  I don't know of any reason to use httplib -- you can get
+        # just as much control with urllib2.
+        import httplib, urlparse
+        url, data, hdrs = form.click_request_data()
+        tup = urlparse(url)
+        host, path = tup[1], urlparse.urlunparse((None, None)+tup[2:])
+        conn = httplib.HTTPConnection(host)
+        if data:
+            httplib.request("POST", path, data, hdrs)
+        else:
+            httplib.request("GET", path, headers=hdrs)
+        r = conn.getresponse()
+
+        """
+        return self._click(name, type, id, label, nr, coord, "request_data",
+                           self._request_class)
+
+    def click_pairs(self, name=None, type=None, id=None,
+                    nr=0, coord=(1,1),
+                    label=None):
+        """As for click_request_data, but returns a list of (key, value) pairs.
+
+        You can use this list as an argument to ClientForm.urlencode.  This is
+        usually only useful if you're using httplib or urllib rather than
+        urllib2 or ClientCookie.  It may also be useful if you want to manually
+        tweak the keys and/or values, but this should not be necessary.
+        Otherwise, use the click method.
+
+        Note that this method is only useful for forms of MIME type
+        x-www-form-urlencoded.  In particular, it does not return the
+        information required for file upload.  If you need file upload and are
+        not using urllib2, use click_request_data.
+
+        Also note that Python 2.0's urllib.urlencode is slightly broken: it
+        only accepts a mapping, not a sequence of pairs, as an argument.  This
+        messes up any ordering in the argument.  Use ClientForm.urlencode
+        instead.
+
+        """
+        return self._click(name, type, id, label, nr, coord, "pairs",
+                           self._request_class)
+
+#---------------------------------------------------
+
+    def find_control(self,
+                     name=None, type=None, kind=None, id=None,
+                     predicate=None, nr=None,
+                     label=None):
+        """Locate and return some specific control within the form.
+
+        At least one of the name, type, kind, predicate and nr arguments must
+        be supplied.  If no matching control is found, ControlNotFoundError is
+        raised.
+
+        If name is specified, then the control must have the indicated name.
+
+        If type is specified then the control must have the specified type (in
+        addition to the types possible for <input> HTML tags: "text",
+        "password", "hidden", "submit", "image", "button", "radio", "checkbox",
+        "file" we also have "reset", "buttonbutton", "submitbutton",
+        "resetbutton", "textarea", "select" and "isindex").
+
+        If kind is specified, then the control must fall into the specified
+        group, each of which satisfies a particular interface.  The types are
+        "text", "list", "multilist", "singlelist", "clickable" and "file".
+
+        If id is specified, then the control must have the indicated id.
+
+        If predicate is specified, then the control must match that function.
+        The predicate function is passed the control as its single argument,
+        and should return a boolean value indicating whether the control
+        matched.
+
+        nr, if supplied, is the sequence number of the control (where 0 is the
+        first).  Note that control 0 is the first control matching all the
+        other arguments (if supplied); it is not necessarily the first control
+        in the form.  If no nr is supplied, AmbiguityError is raised if
+        multiple controls match the other arguments (unless the
+        .backwards-compat attribute is true).
+
+        If label is specified, then the control must have this label.  Note
+        that radio controls and checkboxes never have labels: their items do.
+
+        """
+        if ((name is None) and (type is None) and (kind is None) and
+            (id is None) and (label is None) and (predicate is None) and
+            (nr is None)):
+            raise ValueError(
+                "at least one argument must be supplied to specify control")
+        return self._find_control(name, type, kind, id, label, predicate, nr)
+
+#---------------------------------------------------
+# Private methods.
+
+    def _find_list_control(self,
+                           name=None, type=None, kind=None, id=None, 
+                           label=None, nr=None):
+        if ((name is None) and (type is None) and (kind is None) and
+            (id is None) and (label is None) and (nr is None)):
+            raise ValueError(
+                "at least one argument must be supplied to specify control")
+
+        return self._find_control(name, type, kind, id, label, 
+                                  is_listcontrol, nr)
+
+    def _find_control(self, name, type, kind, id, label, predicate, nr):
+        if ((name is not None) and (name is not Missing) and
+            not isstringlike(name)):
+            raise TypeError("control name must be string-like")
+        if (type is not None) and not isstringlike(type):
+            raise TypeError("control type must be string-like")
+        if (kind is not None) and not isstringlike(kind):
+            raise TypeError("control kind must be string-like")
+        if (id is not None) and not isstringlike(id):
+            raise TypeError("control id must be string-like")
+        if (label is not None) and not isstringlike(label):
+            raise TypeError("control label must be string-like")
+        if (predicate is not None) and not callable(predicate):
+            raise TypeError("control predicate must be callable")
+        if (nr is not None) and nr < 0:
+            raise ValueError("control number must be a positive integer")
+
+        orig_nr = nr
+        found = None
+        ambiguous = False
+        if nr is None and self.backwards_compat:
+            nr = 0
+
+        for control in self.controls:
+            if ((name is not None and name != control.name) and
+                (name is not Missing or control.name is not None)):
+                continue
+            if type is not None and type != control.type:
+                continue
+            if kind is not None and not control.is_of_kind(kind):
+                continue
+            if id is not None and id != control.id:
+                continue
+            if predicate and not predicate(control):
+                continue
+            if label:
+                for l in control.get_labels():
+                    if l.text.find(label) > -1:
+                        break
+                else:
+                    continue
+            if nr is not None:
+                if nr == 0:
+                    return control  # early exit: unambiguous due to nr
+                nr -= 1
+                continue
+            if found:
+                ambiguous = True
+                break
+            found = control
+
+        if found and not ambiguous:
+            return found
+
+        description = []
+        if name is not None: description.append("name %s" % repr(name))
+        if type is not None: description.append("type '%s'" % type)
+        if kind is not None: description.append("kind '%s'" % kind)
+        if id is not None: description.append("id '%s'" % id)
+        if label is not None: description.append("label '%s'" % label)
+        if predicate is not None:
+            description.append("predicate %s" % predicate)
+        if orig_nr: description.append("nr %d" % orig_nr)
+        description = ", ".join(description)
+
+        if ambiguous:
+            raise AmbiguityError("more than one control matching "+description)
+        elif not found:
+            raise ControlNotFoundError("no control matching "+description)
+        assert False
+
+    def _click(self, name, type, id, label, nr, coord, return_type,
+               request_class=urllib2.Request):
+        try:
+            control = self._find_control(
+                name, type, "clickable", id, label, None, nr)
+        except ControlNotFoundError:
+            if ((name is not None) or (type is not None) or (id is not None) or
+                (nr != 0)):
+                raise
+            # no clickable controls, but no control was explicitly requested,
+            # so return state without clicking any control
+            return self._switch_click(return_type, request_class)
+        else:
+            return control._click(self, coord, return_type, request_class)
+
+    def _pairs(self):
+        """Return sequence of (key, value) pairs suitable for urlencoding."""
+        return [(k, v) for (i, k, v, c_i) in self._pairs_and_controls()]
+
+
+    def _pairs_and_controls(self):
+        """Return sequence of (index, key, value, control_index)
+        of totally ordered pairs suitable for urlencoding.
+
+        control_index is the index of the control in self.controls
+        """
+        pairs = []
+        for control_index in range(len(self.controls)):
+            control = self.controls[control_index]
+            for ii, key, val in control._totally_ordered_pairs():
+                pairs.append((ii, key, val, control_index))
+
+        # stable sort by ONLY first item in tuple
+        pairs.sort()
+
+        return pairs
+
+    def _request_data(self):
+        """Return a tuple (url, data, headers)."""
+        method = self.method.upper()
+        #scheme, netloc, path, parameters, query, frag = urlparse.urlparse(self.action)
+        parts = self._urlparse(self.action)
+        rest, (query, frag) = parts[:-2], parts[-2:]
+
+        if method == "GET":
+            if self.enctype != "application/x-www-form-urlencoded":
+                raise ValueError(
+                    "unknown GET form encoding type '%s'" % self.enctype)
+            parts = rest + (urlencode(self._pairs()), None)
+            uri = self._urlunparse(parts)
+            return uri, None, []
+        elif method == "POST":
+            parts = rest + (query, None)
+            uri = self._urlunparse(parts)
+            if self.enctype == "application/x-www-form-urlencoded":
+                return (uri, urlencode(self._pairs()),
+                        [("Content-type", self.enctype)])
+            elif self.enctype == "multipart/form-data":
+                data = StringIO()
+                http_hdrs = []
+                mw = MimeWriter(data, http_hdrs)
+                f = mw.startmultipartbody("form-data", add_to_http_hdrs=True,
+                                          prefix=0)
+                for ii, k, v, control_index in self._pairs_and_controls():
+                    self.controls[control_index]._write_mime_data(mw, k, v)
+                mw.lastpart()
+                return uri, data.getvalue(), http_hdrs
+            else:
+                raise ValueError(
+                    "unknown POST form encoding type '%s'" % self.enctype)
+        else:
+            raise ValueError("Unknown method '%s'" % method)
+
+    def _switch_click(self, return_type, request_class=urllib2.Request):
+        # This is called by HTMLForm and clickable Controls to hide switching
+        # on return_type.
+        if return_type == "pairs":
+            return self._pairs()
+        elif return_type == "request_data":
+            return self._request_data()
+        else:
+            req_data = self._request_data()
+            req = request_class(req_data[0], req_data[1])
+            for key, val in req_data[2]:
+                add_hdr = req.add_header
+                if key.lower() == "content-type":
+                    try:
+                        add_hdr = req.add_unredirected_header
+                    except AttributeError:
+                        # pre-2.4 and not using ClientCookie
+                        pass
+                add_hdr(key, val)
+            return req
Index: /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_html.py
===================================================================
--- /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_html.py (revision 3)
+++ /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_html.py (revision 3)
@@ -0,0 +1,607 @@
+"""HTML handling.
+
+Copyright 2003-2006 John J. Lee <jjl@pobox.com>
+
+This code is free software; you can redistribute it and/or modify it under
+the terms of the BSD or ZPL 2.1 licenses (see the file COPYING.txt
+included with the distribution).
+
+"""
+
+import re, copy, htmlentitydefs
+import sgmllib, HTMLParser, ClientForm
+
+import _request
+from _headersutil import split_header_words, is_html as _is_html
+import _rfc3986
+
+DEFAULT_ENCODING = "latin-1"
+
+
+# the base classe is purely for backwards compatibility
+class ParseError(ClientForm.ParseError): pass
+
+
+class CachingGeneratorFunction(object):
+    """Caching wrapper around a no-arguments iterable."""
+
+    def __init__(self, iterable):
+        self._cache = []
+        # wrap iterable to make it non-restartable (otherwise, repeated
+        # __call__ would give incorrect results)
+        self._iterator = iter(iterable)
+
+    def __call__(self):
+        cache = self._cache
+        for item in cache:
+            yield item
+        for item in self._iterator:
+            cache.append(item)
+            yield item
+
+
+class EncodingFinder:
+    def __init__(self, default_encoding):
+        self._default_encoding = default_encoding
+    def encoding(self, response):
+        # HTTPEquivProcessor may be in use, so both HTTP and HTTP-EQUIV
+        # headers may be in the response.  HTTP-EQUIV headers come last,
+        # so try in order from first to last.
+        for ct in response.info().getheaders("content-type"):
+            for k, v in split_header_words([ct])[0]:
+                if k == "charset":
+                    return v
+        return self._default_encoding
+
+class ResponseTypeFinder:
+    def __init__(self, allow_xhtml):
+        self._allow_xhtml = allow_xhtml
+    def is_html(self, response, encoding):
+        ct_hdrs = response.info().getheaders("content-type")
+        url = response.geturl()
+        # XXX encoding
+        return _is_html(ct_hdrs, url, self._allow_xhtml)
+
+
+# idea for this argument-processing trick is from Peter Otten
+class Args:
+    def __init__(self, args_map):
+        self.dictionary = dict(args_map)
+    def __getattr__(self, key):
+        try:
+            return self.dictionary[key]
+        except KeyError:
+            return getattr(self.__class__, key)
+
+def form_parser_args(
+    select_default=False,
+    form_parser_class=None,
+    request_class=None,
+    backwards_compat=False,
+    ):
+    return Args(locals())
+
+
+class Link:
+    def __init__(self, base_url, url, text, tag, attrs):
+        assert None not in [url, tag, attrs]
+        self.base_url = base_url
+        self.absolute_url = _rfc3986.urljoin(base_url, url)
+        self.url, self.text, self.tag, self.attrs = url, text, tag, attrs
+    def __cmp__(self, other):
+        try:
+            for name in "url", "text", "tag", "attrs":
+                if getattr(self, name) != getattr(other, name):
+                    return -1
+        except AttributeError:
+            return -1
+        return 0
+    def __repr__(self):
+        return "Link(base_url=%r, url=%r, text=%r, tag=%r, attrs=%r)" % (
+            self.base_url, self.url, self.text, self.tag, self.attrs)
+
+
+class LinksFactory:
+
+    def __init__(self,
+                 link_parser_class=None,
+                 link_class=Link,
+                 urltags=None,
+                 ):
+        import _pullparser
+        if link_parser_class is None:
+            link_parser_class = _pullparser.TolerantPullParser
+        self.link_parser_class = link_parser_class
+        self.link_class = link_class
+        if urltags is None:
+            urltags = {
+                "a": "href",
+                "area": "href",
+                "frame": "src",
+                "iframe": "src",
+                }
+        self.urltags = urltags
+        self._response = None
+        self._encoding = None
+
+    def set_response(self, response, base_url, encoding):
+        self._response = response
+        self._encoding = encoding
+        self._base_url = base_url
+
+    def links(self):
+        """Return an iterator that provides links of the document."""
+        response = self._response
+        encoding = self._encoding
+        base_url = self._base_url
+        p = self.link_parser_class(response, encoding=encoding)
+
+        try:
+            for token in p.tags(*(self.urltags.keys()+["base"])):
+                if token.type == "endtag":
+                    continue
+                if token.data == "base":
+                    base_href = dict(token.attrs).get("href")
+                    if base_href is not None:
+                        base_url = base_href
+                    continue
+                attrs = dict(token.attrs)
+                tag = token.data
+                name = attrs.get("name")
+                text = None
+                # XXX use attr_encoding for ref'd doc if that doc does not
+                #  provide one by other means
+                #attr_encoding = attrs.get("charset")
+                url = attrs.get(self.urltags[tag])  # XXX is "" a valid URL?
+                if not url:
+                    # Probably an <A NAME="blah"> link or <AREA NOHREF...>.
+                    # For our purposes a link is something with a URL, so
+                    # ignore this.
+                    continue
+
+                url = _rfc3986.clean_url(url, encoding)
+                if tag == "a":
+                    if token.type != "startendtag":
+                        # hmm, this'd break if end tag is missing
+                        text = p.get_compressed_text(("endtag", tag))
+                    # but this doesn't work for eg.
+                    # <a href="blah"><b>Andy</b></a>
+                    #text = p.get_compressed_text()
+
+                yield Link(base_url, url, text, tag, token.attrs)
+        except sgmllib.SGMLParseError, exc:
+            raise ParseError(exc)
+
+class FormsFactory:
+
+    """Makes a sequence of objects satisfying ClientForm.HTMLForm interface.
+
+    After calling .forms(), the .global_form attribute is a form object
+    containing all controls not a descendant of any FORM element.
+
+    For constructor argument docs, see ClientForm.ParseResponse
+    argument docs.
+
+    """
+
+    def __init__(self,
+                 select_default=False,
+                 form_parser_class=None,
+                 request_class=None,
+                 backwards_compat=False,
+                 ):
+        import ClientForm
+        self.select_default = select_default
+        if form_parser_class is None:
+            form_parser_class = ClientForm.FormParser
+        self.form_parser_class = form_parser_class
+        if request_class is None:
+            request_class = _request.Request
+        self.request_class = request_class
+        self.backwards_compat = backwards_compat
+        self._response = None
+        self.encoding = None
+        self.global_form = None
+
+    def set_response(self, response, encoding):
+        self._response = response
+        self.encoding = encoding
+        self.global_form = None
+
+    def forms(self):
+        import ClientForm
+        encoding = self.encoding
+        try:
+            forms = ClientForm.ParseResponseEx(
+                self._response,
+                select_default=self.select_default,
+                form_parser_class=self.form_parser_class,
+                request_class=self.request_class,
+                encoding=encoding,
+                _urljoin=_rfc3986.urljoin,
+                _urlparse=_rfc3986.urlsplit,
+                _urlunparse=_rfc3986.urlunsplit,
+                )
+        except ClientForm.ParseError, exc:
+            raise ParseError(exc)
+        self.global_form = forms[0]
+        return forms[1:]
+
+class TitleFactory:
+    def __init__(self):
+        self._response = self._encoding = None
+
+    def set_response(self, response, encoding):
+        self._response = response
+        self._encoding = encoding
+
+    def title(self):
+        import _pullparser
+        p = _pullparser.TolerantPullParser(
+            self._response, encoding=self._encoding)
+        try:
+            try:
+                p.get_tag("title")
+            except _pullparser.NoMoreTokensError:
+                return None
+            else:
+                return p.get_text()
+        except sgmllib.SGMLParseError, exc:
+            raise ParseError(exc)
+
+
+def unescape(data, entities, encoding):
+    if data is None or "&" not in data:
+        return data
+
+    def replace_entities(match):
+        ent = match.group()
+        if ent[1] == "#":
+            return unescape_charref(ent[2:-1], encoding)
+
+        repl = entities.get(ent[1:-1])
+        if repl is not None:
+            repl = unichr(repl)
+            if type(repl) != type(""):
+                try:
+                    repl = repl.encode(encoding)
+                except UnicodeError:
+                    repl = ent
+        else:
+            repl = ent
+        return repl
+
+    return re.sub(r"&#?[A-Za-z0-9]+?;", replace_entities, data)
+
+def unescape_charref(data, encoding):
+    name, base = data, 10
+    if name.startswith("x"):
+        name, base= name[1:], 16
+    uc = unichr(int(name, base))
+    if encoding is None:
+        return uc
+    else:
+        try:
+            repl = uc.encode(encoding)
+        except UnicodeError:
+            repl = "&#%s;" % data
+        return repl
+
+
+# bizarre import gymnastics for bundled BeautifulSoup
+import _beautifulsoup
+import ClientForm
+RobustFormParser, NestingRobustFormParser = ClientForm._create_bs_classes(
+    _beautifulsoup.BeautifulSoup, _beautifulsoup.ICantBelieveItsBeautifulSoup
+    )
+# monkeypatch sgmllib to fix http://www.python.org/sf/803422 :-(
+import sgmllib
+sgmllib.charref = re.compile("&#(x?[0-9a-fA-F]+)[^0-9a-fA-F]")
+
+class MechanizeBs(_beautifulsoup.BeautifulSoup):
+    _entitydefs = htmlentitydefs.name2codepoint
+    # don't want the magic Microsoft-char workaround
+    PARSER_MASSAGE = [(re.compile('(<[^<>]*)/>'),
+                       lambda(x):x.group(1) + ' />'),
+                      (re.compile('<!\s+([^<>]*)>'),
+                       lambda(x):'<!' + x.group(1) + '>')
+                      ]
+
+    def __init__(self, encoding, text=None, avoidParserProblems=True,
+                 initialTextIsEverything=True):
+        self._encoding = encoding
+        _beautifulsoup.BeautifulSoup.__init__(
+            self, text, avoidParserProblems, initialTextIsEverything)
+
+    def handle_charref(self, ref):
+        t = unescape("&#%s;"%ref, self._entitydefs, self._encoding)
+        self.handle_data(t)
+    def handle_entityref(self, ref):
+        t = unescape("&%s;"%ref, self._entitydefs, self._encoding)
+        self.handle_data(t)
+    def unescape_attrs(self, attrs):
+        escaped_attrs = []
+        for key, val in attrs:
+            val = unescape(val, self._entitydefs, self._encoding)
+            escaped_attrs.append((key, val))
+        return escaped_attrs
+
+class RobustLinksFactory:
+
+    compress_re = re.compile(r"\s+")
+
+    def __init__(self,
+                 link_parser_class=None,
+                 link_class=Link,
+                 urltags=None,
+                 ):
+        import _beautifulsoup
+        if link_parser_class is None:
+            link_parser_class = MechanizeBs
+        self.link_parser_class = link_parser_class
+        self.link_class = link_class
+        if urltags is None:
+            urltags = {
+                "a": "href",
+                "area": "href",
+                "frame": "src",
+                "iframe": "src",
+                }
+        self.urltags = urltags
+        self._bs = None
+        self._encoding = None
+        self._base_url = None
+
+    def set_soup(self, soup, base_url, encoding):
+        self._bs = soup
+        self._base_url = base_url
+        self._encoding = encoding
+
+    def links(self):
+        import _beautifulsoup
+        bs = self._bs
+        base_url = self._base_url
+        encoding = self._encoding
+        gen = bs.recursiveChildGenerator()
+        for ch in bs.recursiveChildGenerator():
+            if (isinstance(ch, _beautifulsoup.Tag) and
+                ch.name in self.urltags.keys()+["base"]):
+                link = ch
+                attrs = bs.unescape_attrs(link.attrs)
+                attrs_dict = dict(attrs)
+                if link.name == "base":
+                    base_href = attrs_dict.get("href")
+                    if base_href is not None:
+                        base_url = base_href
+                    continue
+                url_attr = self.urltags[link.name]
+                url = attrs_dict.get(url_attr)
+                if not url:
+                    continue
+                url = _rfc3986.clean_url(url, encoding)
+                text = link.fetchText(lambda t: True)
+                if not text:
+                    # follow _pullparser's weird behaviour rigidly
+                    if link.name == "a":
+                        text = ""
+                    else:
+                        text = None
+                else:
+                    text = self.compress_re.sub(" ", " ".join(text).strip())
+                yield Link(base_url, url, text, link.name, attrs)
+
+
+class RobustFormsFactory(FormsFactory):
+    def __init__(self, *args, **kwds):
+        import ClientForm
+        args = form_parser_args(*args, **kwds)
+        if args.form_parser_class is None:
+            args.form_parser_class = RobustFormParser
+        FormsFactory.__init__(self, **args.dictionary)
+
+    def set_response(self, response, encoding):
+        self._response = response
+        self.encoding = encoding
+
+
+class RobustTitleFactory:
+    def __init__(self):
+        self._bs = self._encoding = None
+
+    def set_soup(self, soup, encoding):
+        self._bs = soup
+        self._encoding = encoding
+
+    def title(self):
+        import _beautifulsoup
+        title = self._bs.first("title")
+        if title == _beautifulsoup.Null:
+            return None
+        else:
+            return title.firstText(lambda t: True)
+
+
+class Factory:
+    """Factory for forms, links, etc.
+
+    This interface may expand in future.
+
+    Public methods:
+
+    set_request_class(request_class)
+    set_response(response)
+    forms()
+    links()
+
+    Public attributes:
+
+    Note that accessing these attributes may raise ParseError.
+
+    encoding: string specifying the encoding of response if it contains a text
+     document (this value is left unspecified for documents that do not have
+     an encoding, e.g. an image file)
+    is_html: true if response contains an HTML document (XHTML may be
+     regarded as HTML too)
+    title: page title, or None if no title or not HTML
+    global_form: form object containing all controls that are not descendants
+     of any FORM element, or None if the forms_factory does not support
+     supplying a global form
+
+    """
+
+    LAZY_ATTRS = ["encoding", "is_html", "title", "global_form"]
+
+    def __init__(self, forms_factory, links_factory, title_factory,
+                 encoding_finder=EncodingFinder(DEFAULT_ENCODING),
+                 response_type_finder=ResponseTypeFinder(allow_xhtml=False),
+                 ):
+        """
+
+        Pass keyword arguments only.
+
+        default_encoding: character encoding to use if encoding cannot be
+         determined (or guessed) from the response.  You should turn on
+         HTTP-EQUIV handling if you want the best chance of getting this right
+         without resorting to this default.  The default value of this
+         parameter (currently latin-1) may change in future.
+
+        """
+        self._forms_factory = forms_factory
+        self._links_factory = links_factory
+        self._title_factory = title_factory
+        self._encoding_finder = encoding_finder
+        self._response_type_finder = response_type_finder
+
+        self.set_response(None)
+
+    def set_request_class(self, request_class):
+        """Set urllib2.Request class.
+
+        ClientForm.HTMLForm instances returned by .forms() will return
+        instances of this class when .click()ed.
+
+        """
+        self._forms_factory.request_class = request_class
+
+    def set_response(self, response):
+        """Set response.
+
+        The response must either be None or implement the same interface as
+        objects returned by urllib2.urlopen().
+
+        """
+        self._response = response
+        self._forms_genf = self._links_genf = None
+        self._get_title = None
+        for name in self.LAZY_ATTRS:
+            try:
+                delattr(self, name)
+            except AttributeError:
+                pass
+
+    def __getattr__(self, name):
+        if name not in self.LAZY_ATTRS:
+            return getattr(self.__class__, name)
+
+        if name == "encoding":
+            self.encoding = self._encoding_finder.encoding(
+                copy.copy(self._response))
+            return self.encoding
+        elif name == "is_html":
+            self.is_html = self._response_type_finder.is_html(
+                copy.copy(self._response), self.encoding)
+            return self.is_html
+        elif name == "title":
+            if self.is_html:
+                self.title = self._title_factory.title()
+            else:
+                self.title = None
+            return self.title
+        elif name == "global_form":
+            self.forms()
+            return self.global_form
+
+    def forms(self):
+        """Return iterable over ClientForm.HTMLForm-like objects.
+
+        Raises mechanize.ParseError on failure.
+        """
+        # this implementation sets .global_form as a side-effect, for benefit
+        # of __getattr__ impl
+        if self._forms_genf is None:
+            try:
+                self._forms_genf = CachingGeneratorFunction(
+                    self._forms_factory.forms())
+            except:  # XXXX define exception!
+                self.set_response(self._response)
+                raise
+            self.global_form = getattr(
+                self._forms_factory, "global_form", None)
+        return self._forms_genf()
+
+    def links(self):
+        """Return iterable over mechanize.Link-like objects.
+
+        Raises mechanize.ParseError on failure.
+        """
+        if self._links_genf is None:
+            try:
+                self._links_genf = CachingGeneratorFunction(
+                    self._links_factory.links())
+            except:  # XXXX define exception!
+                self.set_response(self._response)
+                raise
+        return self._links_genf()
+
+class DefaultFactory(Factory):
+    """Based on sgmllib."""
+    def __init__(self, i_want_broken_xhtml_support=False):
+        Factory.__init__(
+            self,
+            forms_factory=FormsFactory(),
+            links_factory=LinksFactory(),
+            title_factory=TitleFactory(),
+            response_type_finder=ResponseTypeFinder(
+                allow_xhtml=i_want_broken_xhtml_support),
+            )
+
+    def set_response(self, response):
+        Factory.set_response(self, response)
+        if response is not None:
+            self._forms_factory.set_response(
+                copy.copy(response), self.encoding)
+            self._links_factory.set_response(
+                copy.copy(response), response.geturl(), self.encoding)
+            self._title_factory.set_response(
+                copy.copy(response), self.encoding)
+
+class RobustFactory(Factory):
+    """Based on BeautifulSoup, hopefully a bit more robust to bad HTML than is
+    DefaultFactory.
+
+    """
+    def __init__(self, i_want_broken_xhtml_support=False,
+                 soup_class=None):
+        Factory.__init__(
+            self,
+            forms_factory=RobustFormsFactory(),
+            links_factory=RobustLinksFactory(),
+            title_factory=RobustTitleFactory(),
+            response_type_finder=ResponseTypeFinder(
+                allow_xhtml=i_want_broken_xhtml_support),
+            )
+        if soup_class is None:
+            soup_class = MechanizeBs
+        self._soup_class = soup_class
+
+    def set_response(self, response):
+        import _beautifulsoup
+        Factory.set_response(self, response)
+        if response is not None:
+            data = response.read()
+            soup = self._soup_class(self.encoding, data)
+            self._forms_factory.set_response(
+                copy.copy(response), self.encoding)
+            self._links_factory.set_soup(
+                soup, response.geturl(), self.encoding)
+            self._title_factory.set_soup(soup, self.encoding)
Index: /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_rfc3986.py
===================================================================
--- /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_rfc3986.py (revision 3)
+++ /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_rfc3986.py (revision 3)
@@ -0,0 +1,240 @@
+"""RFC 3986 URI parsing and relative reference resolution / absolutization.
+
+(aka splitting and joining)
+
+Copyright 2006 John J. Lee <jjl@pobox.com>
+
+This code is free software; you can redistribute it and/or modify it under
+the terms of the BSD or ZPL 2.1 licenses (see the file COPYING.txt
+included with the distribution).
+
+"""
+
+# XXX Wow, this is ugly.  Overly-direct translation of the RFC ATM.
+
+import sys, re, posixpath, urllib
+
+## def chr_range(a, b):
+##     return "".join(map(chr, range(ord(a), ord(b)+1)))
+
+## UNRESERVED_URI_CHARS = ("ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+##                         "abcdefghijklmnopqrstuvwxyz"
+##                         "0123456789"
+##                         "-_.~")
+## RESERVED_URI_CHARS = "!*'();:@&=+$,/?#[]"
+## URI_CHARS = RESERVED_URI_CHARS+UNRESERVED_URI_CHARS+'%'
+# this re matches any character that's not in URI_CHARS
+BAD_URI_CHARS_RE = re.compile("[^A-Za-z0-9\-_.~!*'();:@&=+$,/?%#[\]]")
+
+
+def clean_url(url, encoding):
+    # percent-encode illegal URI characters
+    # Trying to come up with test cases for this gave me a headache, revisit
+    # when do switch to unicode.
+    # Somebody else's comments (lost the attribution):
+##     - IE will return you the url in the encoding you send it
+##     - Mozilla/Firefox will send you latin-1 if there's no non latin-1
+##     characters in your link. It will send you utf-8 however if there are...
+    if type(url) == type(""):
+        url = url.decode(encoding, "replace")
+    url = url.strip()
+    # for second param to urllib.quote(), we want URI_CHARS, minus the
+    # 'always_safe' characters that urllib.quote() never percent-encodes
+    return urllib.quote(url.encode(encoding), "!*'();:@&=+$,/?%#[]~")
+
+def is_clean_uri(uri):
+    """
+    >>> is_clean_uri("ABC!")
+    True
+    >>> is_clean_uri(u"ABC!")
+    True
+    >>> is_clean_uri("ABC|")
+    False
+    >>> is_clean_uri(u"ABC|")
+    False
+    >>> is_clean_uri("http://example.com/0")
+    True
+    >>> is_clean_uri(u"http://example.com/0")
+    True
+    """
+    # note module re treats bytestrings as through they were decoded as latin-1
+    # so this function accepts both unicode and bytestrings
+    return not bool(BAD_URI_CHARS_RE.search(uri))
+
+
+SPLIT_MATCH = re.compile(
+    r"^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?").match
+def urlsplit(absolute_uri):
+    """Return scheme, authority, path, query, fragment."""
+    match = SPLIT_MATCH(absolute_uri)
+    if match:
+        g = match.groups()
+        return g[1], g[3], g[4], g[6], g[8]
+
+def urlunsplit(parts):
+    scheme, authority, path, query, fragment = parts
+    r = []
+    append = r.append
+    if scheme is not None:
+        append(scheme)
+        append(":")
+    if authority is not None:
+        append("//")
+        append(authority)
+    append(path)
+    if query is not None:
+        append("?")
+        append(query)
+    if fragment is not None:
+        append("#")
+        append(fragment)
+    return "".join(r)
+
+def urljoin(base_uri, uri_reference):
+    return urlunsplit(urljoin_parts(urlsplit(base_uri),
+                                    urlsplit(uri_reference)))
+
+# oops, this doesn't do the same thing as the literal translation
+# from the RFC below
+## def urljoin_parts(base_parts, reference_parts):
+##     scheme, authority, path, query, fragment = base_parts
+##     rscheme, rauthority, rpath, rquery, rfragment = reference_parts
+
+##     # compute target URI path
+##     if rpath == "":
+##         tpath = path
+##     else:
+##         tpath = rpath
+##         if not tpath.startswith("/"):
+##             tpath = merge(authority, path, tpath)
+##         tpath = posixpath.normpath(tpath)
+
+##     if rscheme is not None:
+##         return (rscheme, rauthority, tpath, rquery, rfragment)
+##     elif rauthority is not None:
+##         return (scheme, rauthority, tpath, rquery, rfragment)
+##     elif rpath == "":
+##         if rquery is not None:
+##             tquery = rquery
+##         else:
+##             tquery = query
+##         return (scheme, authority, tpath, tquery, rfragment)
+##     else:
+##         return (scheme, authority, tpath, rquery, rfragment)
+
+def urljoin_parts(base_parts, reference_parts):
+    scheme, authority, path, query, fragment = base_parts
+    rscheme, rauthority, rpath, rquery, rfragment = reference_parts
+
+    if rscheme == scheme:
+        rscheme = None
+
+    if rscheme is not None:
+        tscheme, tauthority, tpath, tquery = (
+            rscheme, rauthority, remove_dot_segments(rpath), rquery)
+    else:
+        if rauthority is not None:
+            tauthority, tpath, tquery = (
+                rauthority, remove_dot_segments(rpath), rquery)
+        else:
+            if rpath == "":
+                tpath = path
+                if rquery is not None:
+                    tquery = rquery
+                else:
+                    tquery = query
+            else:
+                if rpath.startswith("/"):
+                    tpath = remove_dot_segments(rpath)
+                else:
+                    tpath = merge(authority, path, rpath)
+                    tpath = remove_dot_segments(tpath)
+                tquery = rquery
+            tauthority = authority
+        tscheme = scheme
+    tfragment = rfragment
+    return (tscheme, tauthority, tpath, tquery, tfragment)
+
+# um, something *vaguely* like this is what I want, but I have to generate
+# lots of test cases first, if only to understand what it is that
+# remove_dot_segments really does...
+## def remove_dot_segments(path):
+##     if path == '':
+##         return ''
+##     comps = path.split('/')
+##     new_comps = []
+##     for comp in comps:
+##         if comp in ['.', '']:
+##             if not new_comps or new_comps[-1]:
+##                 new_comps.append('')
+##             continue
+##         if comp != '..':
+##             new_comps.append(comp)
+##         elif new_comps:
+##             new_comps.pop()
+##     return '/'.join(new_comps)
+
+
+def remove_dot_segments(path):
+    r = []
+    while path:
+        # A
+        if path.startswith("../"):
+            path = path[3:]
+            continue
+        if path.startswith("./"):
+            path = path[2:]
+            continue
+        # B
+        if path.startswith("/./"):
+            path = path[2:]
+            continue
+        if path == "/.":
+            path = "/"
+            continue
+        # C
+        if path.startswith("/../"):
+            path = path[3:]
+            if r:
+                r.pop()
+            continue
+        if path == "/..":
+            path = "/"
+            if r:
+                r.pop()
+            continue
+        # D
+        if path == ".":
+            path = path[1:]
+            continue
+        if path == "..":
+            path = path[2:]
+            continue
+        # E
+        start = 0
+        if path.startswith("/"):
+            start = 1
+        ii = path.find("/", start)
+        if ii < 0:
+            ii = None
+        r.append(path[:ii])
+        if ii is None:
+            break
+        path = path[ii:]
+    return "".join(r)
+
+def merge(base_authority, base_path, ref_path):
+    # XXXX Oddly, the sample Perl implementation of this by Roy Fielding
+    # doesn't even take base_authority as a parameter, despite the wording in
+    # the RFC suggesting otherwise.  Perhaps I'm missing some obvious identity.
+    #if base_authority is not None and base_path == "":
+    if base_path == "":
+        return "/" + ref_path
+    ii = base_path.rfind("/")
+    if ii >= 0:
+        return base_path[:ii+1] + ref_path
+    return ref_path
+
+if __name__ == "__main__":
+    import doctest
+    doctest.testmod()
Index: /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_clientcookie.py
===================================================================
--- /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_clientcookie.py (revision 3)
+++ /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_clientcookie.py (revision 3)
@@ -0,0 +1,1651 @@
+"""HTTP cookie handling for web clients.
+
+This module originally developed from my port of Gisle Aas' Perl module
+HTTP::Cookies, from the libwww-perl library.
+
+Docstrings, comments and debug strings in this code refer to the
+attributes of the HTTP cookie system as cookie-attributes, to distinguish
+them clearly from Python attributes.
+
+                        CookieJar____
+                        /     \      \
+            FileCookieJar      \      \
+             /    |   \         \      \
+ MozillaCookieJar | LWPCookieJar \      \
+                  |               |      \
+                  |   ---MSIEBase |       \
+                  |  /      |     |        \
+                  | /   MSIEDBCookieJar BSDDBCookieJar
+                  |/    
+               MSIECookieJar
+
+Comments to John J Lee <jjl@pobox.com>.
+
+
+Copyright 2002-2006 John J Lee <jjl@pobox.com>
+Copyright 1997-1999 Gisle Aas (original libwww-perl code)
+Copyright 2002-2003 Johnny Lee (original MSIE Perl code)
+
+This code is free software; you can redistribute it and/or modify it
+under the terms of the BSD or ZPL 2.1 licenses (see the file
+COPYING.txt included with the distribution).
+
+"""
+
+import sys, re, copy, time, struct, urllib, types, logging
+try:
+    import threading
+    _threading = threading; del threading
+except ImportError:
+    import dummy_threading
+    _threading = dummy_threading; del dummy_threading
+import httplib  # only for the default HTTP port
+
+MISSING_FILENAME_TEXT = ("a filename was not supplied (nor was the CookieJar "
+                         "instance initialised with one)")
+DEFAULT_HTTP_PORT = str(httplib.HTTP_PORT)
+
+from _headersutil import split_header_words, parse_ns_headers
+from _util import isstringlike
+import _rfc3986
+
+debug = logging.getLogger("mechanize.cookies").debug
+
+
+def reraise_unmasked_exceptions(unmasked=()):
+    # There are a few catch-all except: statements in this module, for
+    # catching input that's bad in unexpected ways.
+    # This function re-raises some exceptions we don't want to trap.
+    import mechanize, warnings
+    if not mechanize.USE_BARE_EXCEPT:
+        raise
+    unmasked = unmasked + (KeyboardInterrupt, SystemExit, MemoryError)
+    etype = sys.exc_info()[0]
+    if issubclass(etype, unmasked):
+        raise
+    # swallowed an exception
+    import traceback, StringIO
+    f = StringIO.StringIO()
+    traceback.print_exc(None, f)
+    msg = f.getvalue()
+    warnings.warn("mechanize bug!\n%s" % msg, stacklevel=2)
+
+
+IPV4_RE = re.compile(r"\.\d+$")
+def is_HDN(text):
+    """Return True if text is a host domain name."""
+    # XXX
+    # This may well be wrong.  Which RFC is HDN defined in, if any (for
+    #  the purposes of RFC 2965)?
+    # For the current implementation, what about IPv6?  Remember to look
+    #  at other uses of IPV4_RE also, if change this.
+    return not (IPV4_RE.search(text) or
+                text == "" or
+                text[0] == "." or text[-1] == ".")
+
+def domain_match(A, B):
+    """Return True if domain A domain-matches domain B, according to RFC 2965.
+
+    A and B may be host domain names or IP addresses.
+
+    RFC 2965, section 1:
+
+    Host names can be specified either as an IP address or a HDN string.
+    Sometimes we compare one host name with another.  (Such comparisons SHALL
+    be case-insensitive.)  Host A's name domain-matches host B's if
+
+         *  their host name strings string-compare equal; or
+
+         * A is a HDN string and has the form NB, where N is a non-empty
+            name string, B has the form .B', and B' is a HDN string.  (So,
+            x.y.com domain-matches .Y.com but not Y.com.)
+
+    Note that domain-match is not a commutative operation: a.b.c.com
+    domain-matches .c.com, but not the reverse.
+
+    """
+    # Note that, if A or B are IP addresses, the only relevant part of the
+    # definition of the domain-match algorithm is the direct string-compare.
+    A = A.lower()
+    B = B.lower()
+    if A == B:
+        return True
+    if not is_HDN(A):
+        return False
+    i = A.rfind(B)
+    has_form_nb = not (i == -1 or i == 0)
+    return (
+        has_form_nb and
+        B.startswith(".") and
+        is_HDN(B[1:])
+        )
+
+def liberal_is_HDN(text):
+    """Return True if text is a sort-of-like a host domain name.
+
+    For accepting/blocking domains.
+
+    """
+    return not IPV4_RE.search(text)
+
+def user_domain_match(A, B):
+    """For blocking/accepting domains.
+
+    A and B may be host domain names or IP addresses.
+
+    """
+    A = A.lower()
+    B = B.lower()
+    if not (liberal_is_HDN(A) and liberal_is_HDN(B)):
+        if A == B:
+            # equal IP addresses
+            return True
+        return False
+    initial_dot = B.startswith(".")
+    if initial_dot and A.endswith(B):
+        return True
+    if not initial_dot and A == B:
+        return True
+    return False
+
+cut_port_re = re.compile(r":\d+$")
+def request_host(request):
+    """Return request-host, as defined by RFC 2965.
+
+    Variation from RFC: returned value is lowercased, for convenient
+    comparison.
+
+    """
+    url = request.get_full_url()
+    host = _rfc3986.urlsplit(url)[1]
+    if host is None:
+        host = request.get_header("Host", "")
+
+    # remove port, if present
+    host = cut_port_re.sub("", host, 1)
+    return host.lower()
+
+def eff_request_host(request):
+    """Return a tuple (request-host, effective request-host name).
+
+    As defined by RFC 2965, except both are lowercased.
+
+    """
+    erhn = req_host = request_host(request)
+    if req_host.find(".") == -1 and not IPV4_RE.search(req_host):
+        erhn = req_host + ".local"
+    return req_host, erhn
+
+def request_path(request):
+    """request-URI, as defined by RFC 2965."""
+    url = request.get_full_url()
+    path, query, frag = _rfc3986.urlsplit(url)[2:]
+    path = escape_path(path)
+    req_path = _rfc3986.urlunsplit((None, None, path, query, frag))
+    if not req_path.startswith("/"):
+        req_path = "/"+req_path
+    return req_path
+
+def request_port(request):
+    host = request.get_host()
+    i = host.find(':')
+    if i >= 0:
+        port = host[i+1:]
+        try:
+            int(port)
+        except ValueError:
+            debug("nonnumeric port: '%s'", port)
+            return None
+    else:
+        port = DEFAULT_HTTP_PORT
+    return port
+
+# Characters in addition to A-Z, a-z, 0-9, '_', '.', and '-' that don't
+# need to be escaped to form a valid HTTP URL (RFCs 2396 and 1738).
+HTTP_PATH_SAFE = "%/;:@&=+$,!~*'()"
+ESCAPED_CHAR_RE = re.compile(r"%([0-9a-fA-F][0-9a-fA-F])")
+def uppercase_escaped_char(match):
+    return "%%%s" % match.group(1).upper()
+def escape_path(path):
+    """Escape any invalid characters in HTTP URL, and uppercase all escapes."""
+    # There's no knowing what character encoding was used to create URLs
+    # containing %-escapes, but since we have to pick one to escape invalid
+    # path characters, we pick UTF-8, as recommended in the HTML 4.0
+    # specification:
+    # http://www.w3.org/TR/REC-html40/appendix/notes.html#h-B.2.1
+    # And here, kind of: draft-fielding-uri-rfc2396bis-03
+    # (And in draft IRI specification: draft-duerst-iri-05)
+    # (And here, for new URI schemes: RFC 2718)
+    if isinstance(path, types.UnicodeType):
+        path = path.encode("utf-8")
+    path = urllib.quote(path, HTTP_PATH_SAFE)
+    path = ESCAPED_CHAR_RE.sub(uppercase_escaped_char, path)
+    return path
+
+def reach(h):
+    """Return reach of host h, as defined by RFC 2965, section 1.
+
+    The reach R of a host name H is defined as follows:
+
+       *  If
+
+          -  H is the host domain name of a host; and,
+
+          -  H has the form A.B; and
+
+          -  A has no embedded (that is, interior) dots; and
+
+          -  B has at least one embedded dot, or B is the string "local".
+             then the reach of H is .B.
+
+       *  Otherwise, the reach of H is H.
+
+    >>> reach("www.acme.com")
+    '.acme.com'
+    >>> reach("acme.com")
+    'acme.com'
+    >>> reach("acme.local")
+    '.local'
+
+    """
+    i = h.find(".")
+    if i >= 0:
+        #a = h[:i]  # this line is only here to show what a is
+        b = h[i+1:]
+        i = b.find(".")
+        if is_HDN(h) and (i >= 0 or b == "local"):
+            return "."+b
+    return h
+
+def is_third_party(request):
+    """
+
+    RFC 2965, section 3.3.6:
+
+        An unverifiable transaction is to a third-party host if its request-
+        host U does not domain-match the reach R of the request-host O in the
+        origin transaction.
+
+    """
+    req_host = request_host(request)
+    # the origin request's request-host was stuffed into request by
+    # _urllib2_support.AbstractHTTPHandler
+    return not domain_match(req_host, reach(request.origin_req_host))
+
+
+class Cookie:
+    """HTTP Cookie.
+
+    This class represents both Netscape and RFC 2965 cookies.
+
+    This is deliberately a very simple class.  It just holds attributes.  It's
+    possible to construct Cookie instances that don't comply with the cookie
+    standards.  CookieJar.make_cookies is the factory function for Cookie
+    objects -- it deals with cookie parsing, supplying defaults, and
+    normalising to the representation used in this class.  CookiePolicy is
+    responsible for checking them to see whether they should be accepted from
+    and returned to the server.
+
+    version: integer;
+    name: string;
+    value: string (may be None);
+    port: string; None indicates no attribute was supplied (eg. "Port", rather
+     than eg. "Port=80"); otherwise, a port string (eg. "80") or a port list
+     string (eg. "80,8080")
+    port_specified: boolean; true if a value was supplied with the Port
+     cookie-attribute
+    domain: string;
+    domain_specified: boolean; true if Domain was explicitly set
+    domain_initial_dot: boolean; true if Domain as set in HTTP header by server
+     started with a dot (yes, this really is necessary!)
+    path: string;
+    path_specified: boolean; true if Path was explicitly set
+    secure:  boolean; true if should only be returned over secure connection
+    expires: integer; seconds since epoch (RFC 2965 cookies should calculate
+     this value from the Max-Age attribute)
+    discard: boolean, true if this is a session cookie; (if no expires value,
+     this should be true)
+    comment: string;
+    comment_url: string;
+    rfc2109: boolean; true if cookie arrived in a Set-Cookie: (not
+     Set-Cookie2:) header, but had a version cookie-attribute of 1
+    rest: mapping of other cookie-attributes
+
+    Note that the port may be present in the headers, but unspecified ("Port"
+    rather than"Port=80", for example); if this is the case, port is None.
+
+    """
+
+    def __init__(self, version, name, value,
+                 port, port_specified,
+                 domain, domain_specified, domain_initial_dot,
+                 path, path_specified,
+                 secure,
+                 expires,
+                 discard,
+                 comment,
+                 comment_url,
+                 rest,
+                 rfc2109=False,
+                 ):
+
+        if version is not None: version = int(version)
+        if expires is not None: expires = int(expires)
+        if port is None and port_specified is True:
+            raise ValueError("if port is None, port_specified must be false")
+
+        self.version = version
+        self.name = name
+        self.value = value
+        self.port = port
+        self.port_specified = port_specified
+        # normalise case, as per RFC 2965 section 3.3.3
+        self.domain = domain.lower()
+        self.domain_specified = domain_specified
+        # Sigh.  We need to know whether the domain given in the
+        # cookie-attribute had an initial dot, in order to follow RFC 2965
+        # (as clarified in draft errata).  Needed for the returned $Domain
+        # value.
+        self.domain_initial_dot = domain_initial_dot
+        self.path = path
+        self.path_specified = path_specified
+        self.secure = secure
+        self.expires = expires
+        self.discard = discard
+        self.comment = comment
+        self.comment_url = comment_url
+        self.rfc2109 = rfc2109
+
+        self._rest = copy.copy(rest)
+
+    def has_nonstandard_attr(self, name):
+        return self._rest.has_key(name)
+    def get_nonstandard_attr(self, name, default=None):
+        return self._rest.get(name, default)
+    def set_nonstandard_attr(self, name, value):
+        self._rest[name] = value
+    def nonstandard_attr_keys(self):
+        return self._rest.keys()
+
+    def is_expired(self, now=None):
+        if now is None: now = time.time()
+        return (self.expires is not None) and (self.expires <= now)
+
+    def __str__(self):
+        if self.port is None: p = ""
+        else: p = ":"+self.port
+        limit = self.domain + p + self.path
+        if self.value is not None:
+            namevalue = "%s=%s" % (self.name, self.value)
+        else:
+            namevalue = self.name
+        return "<Cookie %s for %s>" % (namevalue, limit)
+
+    def __repr__(self):
+        args = []
+        for name in ["version", "name", "value",
+                     "port", "port_specified",
+                     "domain", "domain_specified", "domain_initial_dot",
+                     "path", "path_specified",
+                     "secure", "expires", "discard", "comment", "comment_url",
+                     ]:
+            attr = getattr(self, name)
+            args.append("%s=%s" % (name, repr(attr)))
+        args.append("rest=%s" % repr(self._rest))
+        args.append("rfc2109=%s" % repr(self.rfc2109))
+        return "Cookie(%s)" % ", ".join(args)
+
+
+class CookiePolicy:
+    """Defines which cookies get accepted from and returned to server.
+
+    May also modify cookies.
+
+    The subclass DefaultCookiePolicy defines the standard rules for Netscape
+    and RFC 2965 cookies -- override that if you want a customised policy.
+
+    As well as implementing set_ok and return_ok, implementations of this
+    interface must also supply the following attributes, indicating which
+    protocols should be used, and how.  These can be read and set at any time,
+    though whether that makes complete sense from the protocol point of view is
+    doubtful.
+
+    Public attributes:
+
+    netscape: implement netscape protocol
+    rfc2965: implement RFC 2965 protocol
+    rfc2109_as_netscape:
+       WARNING: This argument will change or go away if is not accepted into
+                the Python standard library in this form!
+     If true, treat RFC 2109 cookies as though they were Netscape cookies.  The
+     default is for this attribute to be None, which means treat 2109 cookies
+     as RFC 2965 cookies unless RFC 2965 handling is switched off (which it is,
+     by default), and as Netscape cookies otherwise.
+    hide_cookie2: don't add Cookie2 header to requests (the presence of
+     this header indicates to the server that we understand RFC 2965
+     cookies)
+
+    """
+    def set_ok(self, cookie, request):
+        """Return true if (and only if) cookie should be accepted from server.
+
+        Currently, pre-expired cookies never get this far -- the CookieJar
+        class deletes such cookies itself.
+
+        cookie: mechanize.Cookie object
+        request: object implementing the interface defined by
+         CookieJar.extract_cookies.__doc__
+
+        """
+        raise NotImplementedError()
+
+    def return_ok(self, cookie, request):
+        """Return true if (and only if) cookie should be returned to server.
+
+        cookie: mechanize.Cookie object
+        request: object implementing the interface defined by
+         CookieJar.add_cookie_header.__doc__
+
+        """
+        raise NotImplementedError()
+
+    def domain_return_ok(self, domain, request):
+        """Return false if cookies should not be returned, given cookie domain.
+
+        This is here as an optimization, to remove the need for checking every
+        cookie with a particular domain (which may involve reading many files).
+        The default implementations of domain_return_ok and path_return_ok
+        (return True) leave all the work to return_ok.
+
+        If domain_return_ok returns true for the cookie domain, path_return_ok
+        is called for the cookie path.  Otherwise, path_return_ok and return_ok
+        are never called for that cookie domain.  If path_return_ok returns
+        true, return_ok is called with the Cookie object itself for a full
+        check.  Otherwise, return_ok is never called for that cookie path.
+
+        Note that domain_return_ok is called for every *cookie* domain, not
+        just for the *request* domain.  For example, the function might be
+        called with both ".acme.com" and "www.acme.com" if the request domain is
+        "www.acme.com".  The same goes for path_return_ok.
+
+        For argument documentation, see the docstring for return_ok.
+
+        """
+        return True
+
+    def path_return_ok(self, path, request):
+        """Return false if cookies should not be returned, given cookie path.
+
+        See the docstring for domain_return_ok.
+
+        """
+        return True
+
+
+class DefaultCookiePolicy(CookiePolicy):
+    """Implements the standard rules for accepting and returning cookies.
+
+    Both RFC 2965 and Netscape cookies are covered.  RFC 2965 handling is
+    switched off by default.
+
+    The easiest way to provide your own policy is to override this class and
+    call its methods in your overriden implementations before adding your own
+    additional checks.
+
+    import mechanize
+    class MyCookiePolicy(mechanize.DefaultCookiePolicy):
+        def set_ok(self, cookie, request):
+            if not mechanize.DefaultCookiePolicy.set_ok(
+                self, cookie, request):
+                return False
+            if i_dont_want_to_store_this_cookie():
+                return False
+            return True
+
+    In addition to the features required to implement the CookiePolicy
+    interface, this class allows you to block and allow domains from setting
+    and receiving cookies.  There are also some strictness switches that allow
+    you to tighten up the rather loose Netscape protocol rules a little bit (at
+    the cost of blocking some benign cookies).
+
+    A domain blacklist and whitelist is provided (both off by default).  Only
+    domains not in the blacklist and present in the whitelist (if the whitelist
+    is active) participate in cookie setting and returning.  Use the
+    blocked_domains constructor argument, and blocked_domains and
+    set_blocked_domains methods (and the corresponding argument and methods for
+    allowed_domains).  If you set a whitelist, you can turn it off again by
+    setting it to None.
+
+    Domains in block or allow lists that do not start with a dot must
+    string-compare equal.  For example, "acme.com" matches a blacklist entry of
+    "acme.com", but "www.acme.com" does not.  Domains that do start with a dot
+    are matched by more specific domains too.  For example, both "www.acme.com"
+    and "www.munitions.acme.com" match ".acme.com" (but "acme.com" itself does
+    not).  IP addresses are an exception, and must match exactly.  For example,
+    if blocked_domains contains "192.168.1.2" and ".168.1.2" 192.168.1.2 is
+    blocked, but 193.168.1.2 is not.
+
+    Additional Public Attributes:
+
+    General strictness switches
+
+    strict_domain: don't allow sites to set two-component domains with
+     country-code top-level domains like .co.uk, .gov.uk, .co.nz. etc.
+     This is far from perfect and isn't guaranteed to work!
+
+    RFC 2965 protocol strictness switches
+
+    strict_rfc2965_unverifiable: follow RFC 2965 rules on unverifiable
+     transactions (usually, an unverifiable transaction is one resulting from
+     a redirect or an image hosted on another site); if this is false, cookies
+     are NEVER blocked on the basis of verifiability
+
+    Netscape protocol strictness switches
+
+    strict_ns_unverifiable: apply RFC 2965 rules on unverifiable transactions
+     even to Netscape cookies
+    strict_ns_domain: flags indicating how strict to be with domain-matching
+     rules for Netscape cookies:
+      DomainStrictNoDots: when setting cookies, host prefix must not contain a
+       dot (eg. www.foo.bar.com can't set a cookie for .bar.com, because
+       www.foo contains a dot)
+      DomainStrictNonDomain: cookies that did not explicitly specify a Domain
+       cookie-attribute can only be returned to a domain that string-compares
+       equal to the domain that set the cookie (eg. rockets.acme.com won't
+       be returned cookies from acme.com that had no Domain cookie-attribute)
+      DomainRFC2965Match: when setting cookies, require a full RFC 2965
+       domain-match
+      DomainLiberal and DomainStrict are the most useful combinations of the
+       above flags, for convenience
+    strict_ns_set_initial_dollar: ignore cookies in Set-Cookie: headers that
+     have names starting with '$'
+    strict_ns_set_path: don't allow setting cookies whose path doesn't
+     path-match request URI
+
+    """
+
+    DomainStrictNoDots = 1
+    DomainStrictNonDomain = 2
+    DomainRFC2965Match = 4
+
+    DomainLiberal = 0
+    DomainStrict = DomainStrictNoDots|DomainStrictNonDomain
+
+    def __init__(self,
+                 blocked_domains=None, allowed_domains=None,
+                 netscape=True, rfc2965=False,
+                 # WARNING: this argument will change or go away if is not
+                 # accepted into the Python standard library in this form!
+                 # default, ie. treat 2109 as netscape iff not rfc2965
+                 rfc2109_as_netscape=None,
+                 hide_cookie2=False,
+                 strict_domain=False,
+                 strict_rfc2965_unverifiable=True,
+                 strict_ns_unverifiable=False,
+                 strict_ns_domain=DomainLiberal,
+                 strict_ns_set_initial_dollar=False,
+                 strict_ns_set_path=False,
+                 ):
+        """
+        Constructor arguments should be used as keyword arguments only.
+
+        blocked_domains: sequence of domain names that we never accept cookies
+         from, nor return cookies to
+        allowed_domains: if not None, this is a sequence of the only domains
+         for which we accept and return cookies
+
+        For other arguments, see CookiePolicy.__doc__ and
+        DefaultCookiePolicy.__doc__..
+
+        """
+        self.netscape = netscape
+        self.rfc2965 = rfc2965
+        self.rfc2109_as_netscape = rfc2109_as_netscape
+        self.hide_cookie2 = hide_cookie2
+        self.strict_domain = strict_domain
+        self.strict_rfc2965_unverifiable = strict_rfc2965_unverifiable
+        self.strict_ns_unverifiable = strict_ns_unverifiable
+        self.strict_ns_domain = strict_ns_domain
+        self.strict_ns_set_initial_dollar = strict_ns_set_initial_dollar
+        self.strict_ns_set_path = strict_ns_set_path
+
+        if blocked_domains is not None:
+            self._blocked_domains = tuple(blocked_domains)
+        else:
+            self._blocked_domains = ()
+
+        if allowed_domains is not None:
+            allowed_domains = tuple(allowed_domains)
+        self._allowed_domains = allowed_domains
+
+    def blocked_domains(self):
+        """Return the sequence of blocked domains (as a tuple)."""
+        return self._blocked_domains
+    def set_blocked_domains(self, blocked_domains):
+        """Set the sequence of blocked domains."""
+        self._blocked_domains = tuple(blocked_domains)
+
+    def is_blocked(self, domain):
+        for blocked_domain in self._blocked_domains:
+            if user_domain_match(domain, blocked_domain):
+                return True
+        return False
+
+    def allowed_domains(self):
+        """Return None, or the sequence of allowed domains (as a tuple)."""
+        return self._allowed_domains
+    def set_allowed_domains(self, allowed_domains):
+        """Set the sequence of allowed domains, or None."""
+        if allowed_domains is not None:
+            allowed_domains = tuple(allowed_domains)
+        self._allowed_domains = allowed_domains
+
+    def is_not_allowed(self, domain):
+        if self._allowed_domains is None:
+            return False
+        for allowed_domain in self._allowed_domains:
+            if user_domain_match(domain, allowed_domain):
+                return False
+        return True
+
+    def set_ok(self, cookie, request):
+        """
+        If you override set_ok, be sure to call this method.  If it returns
+        false, so should your subclass (assuming your subclass wants to be more
+        strict about which cookies to accept).
+
+        """
+        debug(" - checking cookie %s", cookie)
+
+        assert cookie.name is not None
+
+        for n in "version", "verifiability", "name", "path", "domain", "port":
+            fn_name = "set_ok_"+n
+            fn = getattr(self, fn_name)
+            if not fn(cookie, request):
+                return False
+
+        return True
+
+    def set_ok_version(self, cookie, request):
+        if cookie.version is None:
+            # Version is always set to 0 by parse_ns_headers if it's a Netscape
+            # cookie, so this must be an invalid RFC 2965 cookie.
+            debug("   Set-Cookie2 without version attribute (%s)", cookie)
+            return False
+        if cookie.version > 0 and not self.rfc2965:
+            debug("   RFC 2965 cookies are switched off")
+            return False
+        elif cookie.version == 0 and not self.netscape:
+            debug("   Netscape cookies are switched off")
+            return False
+        return True
+
+    def set_ok_verifiability(self, cookie, request):
+        if request.unverifiable and is_third_party(request):
+            if cookie.version > 0 and self.strict_rfc2965_unverifiable:
+                debug("   third-party RFC 2965 cookie during "
+                             "unverifiable transaction")
+                return False
+            elif cookie.version == 0 and self.strict_ns_unverifiable:
+                debug("   third-party Netscape cookie during "
+                             "unverifiable transaction")
+                return False
+        return True
+
+    def set_ok_name(self, cookie, request):
+        # Try and stop servers setting V0 cookies designed to hack other
+        # servers that know both V0 and V1 protocols.
+        if (cookie.version == 0 and self.strict_ns_set_initial_dollar and
+            cookie.name.startswith("$")):
+            debug("   illegal name (starts with '$'): '%s'", cookie.name)
+            return False
+        return True
+
+    def set_ok_path(self, cookie, request):
+        if cookie.path_specified:
+            req_path = request_path(request)
+            if ((cookie.version > 0 or
+                 (cookie.version == 0 and self.strict_ns_set_path)) and
+                not req_path.startswith(cookie.path)):
+                debug("   path attribute %s is not a prefix of request "
+                      "path %s", cookie.path, req_path)
+                return False
+        return True
+
+    def set_ok_countrycode_domain(self, cookie, request):
+        """Return False if explicit cookie domain is not acceptable.
+
+        Called by set_ok_domain, for convenience of overriding by
+        subclasses.
+
+        """
+        if cookie.domain_specified and self.strict_domain:
+            domain = cookie.domain
+            # since domain was specified, we know that:
+            assert domain.startswith(".")
+            if domain.count(".") == 2:
+                # domain like .foo.bar
+                i = domain.rfind(".")
+                tld = domain[i+1:]
+                sld = domain[1:i]
+                if (sld.lower() in [
+                    "co", "ac",
+                    "com", "edu", "org", "net", "gov", "mil", "int",
+                    "aero", "biz", "cat", "coop", "info", "jobs", "mobi",
+                    "museum", "name", "pro", "travel",
+                    ] and
+                    len(tld) == 2):
+                    # domain like .co.uk
+                    return False
+        return True
+
+    def set_ok_domain(self, cookie, request):
+        if self.is_blocked(cookie.domain):
+            debug("   domain %s is in user block-list", cookie.domain)
+            return False
+        if self.is_not_allowed(cookie.domain):
+            debug("   domain %s is not in user allow-list", cookie.domain)
+            return False
+        if not self.set_ok_countrycode_domain(cookie, request):
+            debug("   country-code second level domain %s", cookie.domain)
+            return False
+        if cookie.domain_specified:
+            req_host, erhn = eff_request_host(request)
+            domain = cookie.domain
+            if domain.startswith("."):
+                undotted_domain = domain[1:]
+            else:
+                undotted_domain = domain
+            embedded_dots = (undotted_domain.find(".") >= 0)
+            if not embedded_dots and domain != ".local":
+                debug("   non-local domain %s contains no embedded dot",
+                      domain)
+                return False
+            if cookie.version == 0:
+                if (not erhn.endswith(domain) and
+                    (not erhn.startswith(".") and
+                     not ("."+erhn).endswith(domain))):
+                    debug("   effective request-host %s (even with added "
+                          "initial dot) does not end end with %s",
+                          erhn, domain)
+                    return False
+            if (cookie.version > 0 or
+                (self.strict_ns_domain & self.DomainRFC2965Match)):
+                if not domain_match(erhn, domain):
+                    debug("   effective request-host %s does not domain-match "
+                          "%s", erhn, domain)
+                    return False
+            if (cookie.version > 0 or
+                (self.strict_ns_domain & self.DomainStrictNoDots)):
+                host_prefix = req_host[:-len(domain)]
+                if (host_prefix.find(".") >= 0 and
+                    not IPV4_RE.search(req_host)):
+                    debug("   host prefix %s for domain %s contains a dot",
+                          host_prefix, domain)
+                    return False
+        return True
+
+    def set_ok_port(self, cookie, request):
+        if cookie.port_specified:
+            req_port = request_port(request)
+            if req_port is None:
+                req_port = "80"
+            else:
+                req_port = str(req_port)
+            for p in cookie.port.split(","):
+                try:
+                    int(p)
+                except ValueError:
+                    debug("   bad port %s (not numeric)", p)
+                    return False
+                if p == req_port:
+                    break
+            else:
+                debug("   request port (%s) not found in %s",
+                      req_port, cookie.port)
+                return False
+        return True
+
+    def return_ok(self, cookie, request):
+        """
+        If you override return_ok, be sure to call this method.  If it returns
+        false, so should your subclass (assuming your subclass wants to be more
+        strict about which cookies to return).
+
+        """
+        # Path has already been checked by path_return_ok, and domain blocking
+        # done by domain_return_ok.
+        debug(" - checking cookie %s", cookie)
+
+        for n in "version", "verifiability", "secure", "expires", "port", "domain":
+            fn_name = "return_ok_"+n
+            fn = getattr(self, fn_name)
+            if not fn(cookie, request):
+                return False
+        return True
+
+    def return_ok_version(self, cookie, request):
+        if cookie.version > 0 and not self.rfc2965:
+            debug("   RFC 2965 cookies are switched off")
+            return False
+        elif cookie.version == 0 and not self.netscape:
+            debug("   Netscape cookies are switched off")
+            return False
+        return True
+
+    def return_ok_verifiability(self, cookie, request):
+        if request.unverifiable and is_third_party(request):
+            if cookie.version > 0 and self.strict_rfc2965_unverifiable:
+                debug("   third-party RFC 2965 cookie during unverifiable "
+                      "transaction")
+                return False
+            elif cookie.version == 0 and self.strict_ns_unverifiable:
+                debug("   third-party Netscape cookie during unverifiable "
+                      "transaction")
+                return False
+        return True
+
+    def return_ok_secure(self, cookie, request):
+        if cookie.secure and request.get_type() != "https":
+            debug("   secure cookie with non-secure request")
+            return False
+        return True
+
+    def return_ok_expires(self, cookie, request):
+        if cookie.is_expired(self._now):
+            debug("   cookie expired")
+            return False
+        return True
+
+    def return_ok_port(self, cookie, request):
+        if cookie.port:
+            req_port = request_port(request)
+            if req_port is None:
+                req_port = "80"
+            for p in cookie.port.split(","):
+                if p == req_port:
+                    break
+            else:
+                debug("   request port %s does not match cookie port %s",
+                      req_port, cookie.port)
+                return False
+        return True
+
+    def return_ok_domain(self, cookie, request):
+        req_host, erhn = eff_request_host(request)
+        domain = cookie.domain
+
+        # strict check of non-domain cookies: Mozilla does this, MSIE5 doesn't
+        if (cookie.version == 0 and
+            (self.strict_ns_domain & self.DomainStrictNonDomain) and
+            not cookie.domain_specified and domain != erhn):
+            debug("   cookie with unspecified domain does not string-compare "
+                  "equal to request domain")
+            return False
+
+        if cookie.version > 0 and not domain_match(erhn, domain):
+            debug("   effective request-host name %s does not domain-match "
+                  "RFC 2965 cookie domain %s", erhn, domain)
+            return False
+        if cookie.version == 0 and not ("."+erhn).endswith(domain):
+            debug("   request-host %s does not match Netscape cookie domain "
+                  "%s", req_host, domain)
+            return False
+        return True
+
+    def domain_return_ok(self, domain, request):
+        # Liberal check of domain.  This is here as an optimization to avoid
+        # having to load lots of MSIE cookie files unless necessary.
+
+        # Munge req_host and erhn to always start with a dot, so as to err on
+        # the side of letting cookies through.
+        dotted_req_host, dotted_erhn = eff_request_host(request)
+        if not dotted_req_host.startswith("."):
+            dotted_req_host = "."+dotted_req_host
+        if not dotted_erhn.startswith("."):
+            dotted_erhn = "."+dotted_erhn
+        if not (dotted_req_host.endswith(domain) or
+                dotted_erhn.endswith(domain)):
+            #debug("   request domain %s does not match cookie domain %s",
+            #      req_host, domain)
+            return False
+
+        if self.is_blocked(domain):
+            debug("   domain %s is in user block-list", domain)
+            return False
+        if self.is_not_allowed(domain):
+            debug("   domain %s is not in user allow-list", domain)
+            return False
+
+        return True
+
+    def path_return_ok(self, path, request):
+        debug("- checking cookie path=%s", path)
+        req_path = request_path(request)
+        if not req_path.startswith(path):
+            debug("  %s does not path-match %s", req_path, path)
+            return False
+        return True
+
+
+def vals_sorted_by_key(adict):
+    keys = adict.keys()
+    keys.sort()
+    return map(adict.get, keys)
+
+class MappingIterator:
+    """Iterates over nested mapping, depth-first, in sorted order by key."""
+    def __init__(self, mapping):
+        self._s = [(vals_sorted_by_key(mapping), 0, None)]  # LIFO stack
+
+    def __iter__(self): return self
+
+    def next(self):
+        # this is hairy because of lack of generators
+        while 1:
+            try:
+                vals, i, prev_item = self._s.pop()
+            except IndexError:
+                raise StopIteration()
+            if i < len(vals):
+                item = vals[i]
+                i = i + 1
+                self._s.append((vals, i, prev_item))
+                try:
+                    item.items
+                except AttributeError:
+                    # non-mapping
+                    break
+                else:
+                    # mapping
+                    self._s.append((vals_sorted_by_key(item), 0, item))
+                    continue
+        return item
+
+
+# Used as second parameter to dict.get method, to distinguish absent
+# dict key from one with a None value.
+class Absent: pass
+
+class CookieJar:
+    """Collection of HTTP cookies.
+
+    You may not need to know about this class: try mechanize.urlopen().
+
+    The major methods are extract_cookies and add_cookie_header; these are all
+    you are likely to need.
+
+    CookieJar supports the iterator protocol:
+
+    for cookie in cookiejar:
+        # do something with cookie
+
+    Methods:
+
+    add_cookie_header(request)
+    extract_cookies(response, request)
+    make_cookies(response, request)
+    set_cookie_if_ok(cookie, request)
+    set_cookie(cookie)
+    clear_session_cookies()
+    clear_expired_cookies()
+    clear(domain=None, path=None, name=None)
+
+    Public attributes
+
+    policy: CookiePolicy object
+
+    """
+
+    non_word_re = re.compile(r"\W")
+    quote_re = re.compile(r"([\"\\])")
+    strict_domain_re = re.compile(r"\.?[^.]*")
+    domain_re = re.compile(r"[^.]*")
+    dots_re = re.compile(r"^\.+")
+
+    def __init__(self, policy=None):
+        """
+        See CookieJar.__doc__ for argument documentation.
+
+        """
+        if policy is None:
+            policy = DefaultCookiePolicy()
+        self._policy = policy
+
+        self._cookies = {}
+
+        # for __getitem__ iteration in pre-2.2 Pythons
+        self._prev_getitem_index = 0
+
+    def set_policy(self, policy):
+        self._policy = policy
+
+    def _cookies_for_domain(self, domain, request):
+        cookies = []
+        if not self._policy.domain_return_ok(domain, request):
+            return []
+        debug("Checking %s for cookies to return", domain)
+        cookies_by_path = self._cookies[domain]
+        for path in cookies_by_path.keys():
+            if not self._policy.path_return_ok(path, request):
+                continue
+            cookies_by_name = cookies_by_path[path]
+            for cookie in cookies_by_name.values():
+                if not self._policy.return_ok(cookie, request):
+                    debug("   not returning cookie")
+                    continue
+                debug("   it's a match")
+                cookies.append(cookie)
+        return cookies
+
+    def _cookies_for_request(self, request):
+        """Return a list of cookies to be returned to server."""
+        cookies = []
+        for domain in self._cookies.keys():
+            cookies.extend(self._cookies_for_domain(domain, request))
+        return cookies
+
+    def _cookie_attrs(self, cookies):
+        """Return a list of cookie-attributes to be returned to server.
+
+        like ['foo="bar"; $Path="/"', ...]
+
+        The $Version attribute is also added when appropriate (currently only
+        once per request).
+
+        """
+        # add cookies in order of most specific (ie. longest) path first
+        def decreasing_size(a, b): return cmp(len(b.path), len(a.path))
+        cookies.sort(decreasing_size)
+
+        version_set = False
+
+        attrs = []
+        for cookie in cookies:
+            # set version of Cookie header
+            # XXX
+            # What should it be if multiple matching Set-Cookie headers have
+            #  different versions themselves?
+            # Answer: there is no answer; was supposed to be settled by
+            #  RFC 2965 errata, but that may never appear...
+            version = cookie.version
+            if not version_set:
+                version_set = True
+                if version > 0:
+                    attrs.append("$Version=%s" % version)
+
+            # quote cookie value if necessary
+            # (not for Netscape protocol, which already has any quotes
+            #  intact, due to the poorly-specified Netscape Cookie: syntax)
+            if ((cookie.value is not None) and
+                self.non_word_re.search(cookie.value) and version > 0):
+                value = self.quote_re.sub(r"\\\1", cookie.value)
+            else:
+                value = cookie.value
+
+            # add cookie-attributes to be returned in Cookie header
+            if cookie.value is None:
+                attrs.append(cookie.name)
+            else:
+                attrs.append("%s=%s" % (cookie.name, value))
+            if version > 0:
+                if cookie.path_specified:
+                    attrs.append('$Path="%s"' % cookie.path)
+                if cookie.domain.startswith("."):
+                    domain = cookie.domain
+                    if (not cookie.domain_initial_dot and
+                        domain.startswith(".")):
+                        domain = domain[1:]
+                    attrs.append('$Domain="%s"' % domain)
+                if cookie.port is not None:
+                    p = "$Port"
+                    if cookie.port_specified:
+                        p = p + ('="%s"' % cookie.port)
+                    attrs.append(p)
+
+        return attrs
+
+    def add_cookie_header(self, request):
+        """Add correct Cookie: header to request (urllib2.Request object).
+
+        The Cookie2 header is also added unless policy.hide_cookie2 is true.
+
+        The request object (usually a urllib2.Request instance) must support
+        the methods get_full_url, get_host, get_type, has_header, get_header,
+        header_items and add_unredirected_header, as documented by urllib2, and
+        the port attribute (the port number).  Actually,
+        RequestUpgradeProcessor will automatically upgrade your Request object
+        to one with has_header, get_header, header_items and
+        add_unredirected_header, if it lacks those methods, for compatibility
+        with pre-2.4 versions of urllib2.
+
+        """
+        debug("add_cookie_header")
+        self._policy._now = self._now = int(time.time())
+
+        req_host, erhn = eff_request_host(request)
+        strict_non_domain = (
+            self._policy.strict_ns_domain & self._policy.DomainStrictNonDomain)
+
+        cookies = self._cookies_for_request(request)
+
+        attrs = self._cookie_attrs(cookies)
+        if attrs:
+            if not request.has_header("Cookie"):
+                request.add_unredirected_header("Cookie", "; ".join(attrs))
+
+        # if necessary, advertise that we know RFC 2965
+        if self._policy.rfc2965 and not self._policy.hide_cookie2:
+            for cookie in cookies:
+                if cookie.version != 1 and not request.has_header("Cookie2"):
+                    request.add_unredirected_header("Cookie2", '$Version="1"')
+                    break
+
+        self.clear_expired_cookies()
+
+    def _normalized_cookie_tuples(self, attrs_set):
+        """Return list of tuples containing normalised cookie information.
+
+        attrs_set is the list of lists of key,value pairs extracted from
+        the Set-Cookie or Set-Cookie2 headers.
+
+        Tuples are name, value, standard, rest, where name and value are the
+        cookie name and value, standard is a dictionary containing the standard
+        cookie-attributes (discard, secure, version, expires or max-age,
+        domain, path and port) and rest is a dictionary containing the rest of
+        the cookie-attributes.
+
+        """
+        cookie_tuples = []
+
+        boolean_attrs = "discard", "secure"
+        value_attrs = ("version",
+                       "expires", "max-age",
+                       "domain", "path", "port",
+                       "comment", "commenturl")
+
+        for cookie_attrs in attrs_set:
+            name, value = cookie_attrs[0]
+
+            # Build dictionary of standard cookie-attributes (standard) and
+            # dictionary of other cookie-attributes (rest).
+
+            # Note: expiry time is normalised to seconds since epoch.  V0
+            # cookies should have the Expires cookie-attribute, and V1 cookies
+            # should have Max-Age, but since V1 includes RFC 2109 cookies (and
+            # since V0 cookies may be a mish-mash of Netscape and RFC 2109), we
+            # accept either (but prefer Max-Age).
+            max_age_set = False
+
+            bad_cookie = False
+
+            standard = {}
+            rest = {}
+            for k, v in cookie_attrs[1:]:
+                lc = k.lower()
+                # don't lose case distinction for unknown fields
+                if lc in value_attrs or lc in boolean_attrs:
+                    k = lc
+                if k in boolean_attrs and v is None:
+                    # boolean cookie-attribute is present, but has no value
+                    # (like "discard", rather than "port=80")
+                    v = True
+                if standard.has_key(k):
+                    # only first value is significant
+                    continue
+                if k == "domain":
+                    if v is None:
+                        debug("   missing value for domain attribute")
+                        bad_cookie = True
+                        break
+                    # RFC 2965 section 3.3.3
+                    v = v.lower()
+                if k == "expires":
+                    if max_age_set:
+                        # Prefer max-age to expires (like Mozilla)
+                        continue
+                    if v is None:
+                        debug("   missing or invalid value for expires "
+                              "attribute: treating as session cookie")
+                        continue
+                if k == "max-age":
+                    max_age_set = True
+                    try:
+                        v = int(v)
+                    except ValueError:
+                        debug("   missing or invalid (non-numeric) value for "
+                              "max-age attribute")
+                        bad_cookie = True
+                        break
+                    # convert RFC 2965 Max-Age to seconds since epoch
+                    # XXX Strictly you're supposed to follow RFC 2616
+                    #   age-calculation rules.  Remember that zero Max-Age is a
+                    #   is a request to discard (old and new) cookie, though.
+                    k = "expires"
+                    v = self._now + v
+                if (k in value_attrs) or (k in boolean_attrs):
+                    if (v is None and
+                        k not in ["port", "comment", "commenturl"]):
+                        debug("   missing value for %s attribute" % k)
+                        bad_cookie = True
+                        break
+                    standard[k] = v
+                else:
+                    rest[k] = v
+
+            if bad_cookie:
+                continue
+
+            cookie_tuples.append((name, value, standard, rest))
+
+        return cookie_tuples
+
+    def _cookie_from_cookie_tuple(self, tup, request):
+        # standard is dict of standard cookie-attributes, rest is dict of the
+        # rest of them
+        name, value, standard, rest = tup
+
+        domain = standard.get("domain", Absent)
+        path = standard.get("path", Absent)
+        port = standard.get("port", Absent)
+        expires = standard.get("expires", Absent)
+
+        # set the easy defaults
+        version = standard.get("version", None)
+        if version is not None: version = int(version)
+        secure = standard.get("secure", False)
+        # (discard is also set if expires is Absent)
+        discard = standard.get("discard", False)
+        comment = standard.get("comment", None)
+        comment_url = standard.get("commenturl", None)
+
+        # set default path
+        if path is not Absent and path != "":
+            path_specified = True
+            path = escape_path(path)
+        else:
+            path_specified = False
+            path = request_path(request)
+            i = path.rfind("/")
+            if i != -1:
+                if version == 0:
+                    # Netscape spec parts company from reality here
+                    path = path[:i]
+                else:
+                    path = path[:i+1]
+            if len(path) == 0: path = "/"
+
+        # set default domain
+        domain_specified = domain is not Absent
+        # but first we have to remember whether it starts with a dot
+        domain_initial_dot = False
+        if domain_specified:
+            domain_initial_dot = bool(domain.startswith("."))
+        if domain is Absent:
+            req_host, erhn = eff_request_host(request)
+            domain = erhn
+        elif not domain.startswith("."):
+            domain = "."+domain
+
+        # set default port
+        port_specified = False
+        if port is not Absent:
+            if port is None:
+                # Port attr present, but has no value: default to request port.
+                # Cookie should then only be sent back on that port.
+                port = request_port(request)
+            else:
+                port_specified = True
+                port = re.sub(r"\s+", "", port)
+        else:
+            # No port attr present.  Cookie can be sent back on any port.
+            port = None
+
+        # set default expires and discard
+        if expires is Absent:
+            expires = None
+            discard = True
+        elif expires <= self._now:
+            # Expiry date in past is request to delete cookie.  This can't be
+            # in DefaultCookiePolicy, because can't delete cookies there.
+            try:
+                self.clear(domain, path, name)
+            except KeyError:
+                pass
+            debug("Expiring cookie, domain='%s', path='%s', name='%s'",
+                  domain, path, name)
+            return None
+
+        return Cookie(version,
+                      name, value,
+                      port, port_specified,
+                      domain, domain_specified, domain_initial_dot,
+                      path, path_specified,
+                      secure,
+                      expires,
+                      discard,
+                      comment,
+                      comment_url,
+                      rest)
+
+    def _cookies_from_attrs_set(self, attrs_set, request):
+        cookie_tuples = self._normalized_cookie_tuples(attrs_set)
+
+        cookies = []
+        for tup in cookie_tuples:
+            cookie = self._cookie_from_cookie_tuple(tup, request)
+            if cookie: cookies.append(cookie)
+        return cookies
+
+    def _process_rfc2109_cookies(self, cookies):
+        if self._policy.rfc2109_as_netscape is None:
+            rfc2109_as_netscape = not self._policy.rfc2965
+        else:
+            rfc2109_as_netscape = self._policy.rfc2109_as_netscape
+        for cookie in cookies:
+            if cookie.version == 1:
+                cookie.rfc2109 = True
+                if rfc2109_as_netscape: 
+                    # treat 2109 cookies as Netscape cookies rather than
+                    # as RFC2965 cookies
+                    cookie.version = 0
+
+    def make_cookies(self, response, request):
+        """Return sequence of Cookie objects extracted from response object.
+
+        See extract_cookies.__doc__ for the interfaces required of the
+        response and request arguments.
+
+        """
+        # get cookie-attributes for RFC 2965 and Netscape protocols
+        headers = response.info()
+        rfc2965_hdrs = headers.getheaders("Set-Cookie2")
+        ns_hdrs = headers.getheaders("Set-Cookie")
+
+        rfc2965 = self._policy.rfc2965
+        netscape = self._policy.netscape
+
+        if ((not rfc2965_hdrs and not ns_hdrs) or
+            (not ns_hdrs and not rfc2965) or
+            (not rfc2965_hdrs and not netscape) or
+            (not netscape and not rfc2965)):
+            return []  # no relevant cookie headers: quick exit
+
+        try:
+            cookies = self._cookies_from_attrs_set(
+                split_header_words(rfc2965_hdrs), request)
+        except:
+            reraise_unmasked_exceptions()
+            cookies = []
+
+        if ns_hdrs and netscape:
+            try:
+                # RFC 2109 and Netscape cookies
+                ns_cookies = self._cookies_from_attrs_set(
+                    parse_ns_headers(ns_hdrs), request)
+            except:
+                reraise_unmasked_exceptions()
+                ns_cookies = []
+            self._process_rfc2109_cookies(ns_cookies)
+
+            # Look for Netscape cookies (from Set-Cookie headers) that match
+            # corresponding RFC 2965 cookies (from Set-Cookie2 headers).
+            # For each match, keep the RFC 2965 cookie and ignore the Netscape
+            # cookie (RFC 2965 section 9.1).  Actually, RFC 2109 cookies are
+            # bundled in with the Netscape cookies for this purpose, which is
+            # reasonable behaviour.
+            if rfc2965:
+                lookup = {}
+                for cookie in cookies:
+                    lookup[(cookie.domain, cookie.path, cookie.name)] = None
+
+                def no_matching_rfc2965(ns_cookie, lookup=lookup):
+                    key = ns_cookie.domain, ns_cookie.path, ns_cookie.name
+                    return not lookup.has_key(key)
+                ns_cookies = filter(no_matching_rfc2965, ns_cookies)
+
+            if ns_cookies:
+                cookies.extend(ns_cookies)
+
+        return cookies
+
+    def set_cookie_if_ok(self, cookie, request):
+        """Set a cookie if policy says it's OK to do so.
+
+        cookie: mechanize.Cookie instance
+        request: see extract_cookies.__doc__ for the required interface
+
+        """
+        self._policy._now = self._now = int(time.time())
+
+        if self._policy.set_ok(cookie, request):
+            self.set_cookie(cookie)
+
+    def set_cookie(self, cookie):
+        """Set a cookie, without checking whether or not it should be set.
+
+        cookie: mechanize.Cookie instance
+        """
+        c = self._cookies
+        if not c.has_key(cookie.domain): c[cookie.domain] = {}
+        c2 = c[cookie.domain]
+        if not c2.has_key(cookie.path): c2[cookie.path] = {}
+        c3 = c2[cookie.path]
+        c3[cookie.name] = cookie
+
+    def extract_cookies(self, response, request):
+        """Extract cookies from response, where allowable given the request.
+
+        Look for allowable Set-Cookie: and Set-Cookie2: headers in the response
+        object passed as argument.  Any of these headers that are found are
+        used to update the state of the object (subject to the policy.set_ok
+        method's approval).
+
+        The response object (usually be the result of a call to
+        mechanize.urlopen, or similar) should support an info method, which
+        returns a mimetools.Message object (in fact, the 'mimetools.Message
+        object' may be any object that provides a getallmatchingheaders
+        method).
+
+        The request object (usually a urllib2.Request instance) must support
+        the methods get_full_url and get_host, as documented by urllib2, and
+        the port attribute (the port number).  The request is used to set
+        default values for cookie-attributes as well as for checking that the
+        cookie is OK to be set.
+
+        """
+        debug("extract_cookies: %s", response.info())
+        self._policy._now = self._now = int(time.time())
+
+        for cookie in self.make_cookies(response, request):
+            if self._policy.set_ok(cookie, request):
+                debug(" setting cookie: %s", cookie)
+                self.set_cookie(cookie)
+
+    def clear(self, domain=None, path=None, name=None):
+        """Clear some cookies.
+
+        Invoking this method without arguments will clear all cookies.  If
+        given a single argument, only cookies belonging to that domain will be
+        removed.  If given two arguments, cookies belonging to the specified
+        path within that domain are removed.  If given three arguments, then
+        the cookie with the specified name, path and domain is removed.
+
+        Raises KeyError if no matching cookie exists.
+
+        """
+        if name is not None:
+            if (domain is None) or (path is None):
+                raise ValueError(
+                    "domain and path must be given to remove a cookie by name")
+            del self._cookies[domain][path][name]
+        elif path is not None:
+            if domain is None:
+                raise ValueError(
+                    "domain must be given to remove cookies by path")
+            del self._cookies[domain][path]
+        elif domain is not None:
+            del self._cookies[domain]
+        else:
+            self._cookies = {}
+
+    def clear_session_cookies(self):
+        """Discard all session cookies.
+
+        Discards all cookies held by object which had either no Max-Age or
+        Expires cookie-attribute or an explicit Discard cookie-attribute, or
+        which otherwise have ended up with a true discard attribute.  For
+        interactive browsers, the end of a session usually corresponds to
+        closing the browser window.
+
+        Note that the save method won't save session cookies anyway, unless you
+        ask otherwise by passing a true ignore_discard argument.
+
+        """
+        for cookie in self:
+            if cookie.discard:
+                self.clear(cookie.domain, cookie.path, cookie.name)
+
+    def clear_expired_cookies(self):
+        """Discard all expired cookies.
+
+        You probably don't need to call this method: expired cookies are never
+        sent back to the server (provided you're using DefaultCookiePolicy),
+        this method is called by CookieJar itself every so often, and the save
+        method won't save expired cookies anyway (unless you ask otherwise by
+        passing a true ignore_expires argument).
+
+        """
+        now = time.time()
+        for cookie in self:
+            if cookie.is_expired(now):
+                self.clear(cookie.domain, cookie.path, cookie.name)
+
+    def __getitem__(self, i):
+        if i == 0:
+            self._getitem_iterator = self.__iter__()
+        elif self._prev_getitem_index != i-1: raise IndexError(
+            "CookieJar.__getitem__ only supports sequential iteration")
+        self._prev_getitem_index = i
+        try:
+            return self._getitem_iterator.next()
+        except StopIteration:
+            raise IndexError()
+
+    def __iter__(self):
+        return MappingIterator(self._cookies)
+
+    def __len__(self):
+        """Return number of contained cookies."""
+        i = 0
+        for cookie in self: i = i + 1
+        return i
+
+    def __repr__(self):
+        r = []
+        for cookie in self: r.append(repr(cookie))
+        return "<%s[%s]>" % (self.__class__, ", ".join(r))
+
+    def __str__(self):
+        r = []
+        for cookie in self: r.append(str(cookie))
+        return "<%s[%s]>" % (self.__class__, ", ".join(r))
+
+
+class LoadError(Exception): pass
+
+class FileCookieJar(CookieJar):
+    """CookieJar that can be loaded from and saved to a file.
+
+    Additional methods
+
+    save(filename=None, ignore_discard=False, ignore_expires=False)
+    load(filename=None, ignore_discard=False, ignore_expires=False)
+    revert(filename=None, ignore_discard=False, ignore_expires=False)
+
+    Additional public attributes
+
+    filename: filename for loading and saving cookies
+
+    Additional public readable attributes
+
+    delayload: request that cookies are lazily loaded from disk; this is only
+     a hint since this only affects performance, not behaviour (unless the
+     cookies on disk are changing); a CookieJar object may ignore it (in fact,
+     only MSIECookieJar lazily loads cookies at the moment)
+
+    """
+
+    def __init__(self, filename=None, delayload=False, policy=None):
+        """
+        See FileCookieJar.__doc__ for argument documentation.
+
+        Cookies are NOT loaded from the named file until either the load or
+        revert method is called.
+
+        """
+        CookieJar.__init__(self, policy)
+        if filename is not None and not isstringlike(filename):
+            raise ValueError("filename must be string-like")
+        self.filename = filename
+        self.delayload = bool(delayload)
+
+    def save(self, filename=None, ignore_discard=False, ignore_expires=False):
+        """Save cookies to a file.
+
+        filename: name of file in which to save cookies
+        ignore_discard: save even cookies set to be discarded
+        ignore_expires: save even cookies that have expired
+
+        The file is overwritten if it already exists, thus wiping all its
+        cookies.  Saved cookies can be restored later using the load or revert
+        methods.  If filename is not specified, self.filename is used; if
+        self.filename is None, ValueError is raised.
+
+        """
+        raise NotImplementedError()
+
+    def load(self, filename=None, ignore_discard=False, ignore_expires=False):
+        """Load cookies from a file.
+
+        Old cookies are kept unless overwritten by newly loaded ones.
+
+        Arguments are as for .save().
+
+        If filename is not specified, self.filename is used; if self.filename
+        is None, ValueError is raised.  The named file must be in the format
+        understood by the class, or LoadError will be raised.  This format will
+        be identical to that written by the save method, unless the load format
+        is not sufficiently well understood (as is the case for MSIECookieJar).
+
+        """
+        if filename is None:
+            if self.filename is not None: filename = self.filename
+            else: raise ValueError(MISSING_FILENAME_TEXT)
+
+        f = open(filename)
+        try:
+            self._really_load(f, filename, ignore_discard, ignore_expires)
+        finally:
+            f.close()
+
+    def revert(self, filename=None,
+               ignore_discard=False, ignore_expires=False):
+        """Clear all cookies and reload cookies from a saved file.
+
+        Raises LoadError (or IOError) if reversion is not successful; the
+        object's state will not be altered if this happens.
+
+        """
+        if filename is None:
+            if self.filename is not None: filename = self.filename
+            else: raise ValueError(MISSING_FILENAME_TEXT)
+
+        old_state = copy.deepcopy(self._cookies)
+        self._cookies = {}
+        try:
+            self.load(filename, ignore_discard, ignore_expires)
+        except (LoadError, IOError):
+            self._cookies = old_state
+            raise
Index: /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_headersutil.py
===================================================================
--- /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_headersutil.py (revision 3)
+++ /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_headersutil.py (revision 3)
@@ -0,0 +1,226 @@
+"""Utility functions for HTTP header value parsing and construction.
+
+Copyright 1997-1998, Gisle Aas
+Copyright 2002-2006, John J. Lee
+
+This code is free software; you can redistribute it and/or modify it
+under the terms of the BSD or ZPL 2.1 licenses (see the file
+COPYING.txt included with the distribution).
+
+"""
+
+import os, re
+from types import StringType
+from types import UnicodeType
+STRING_TYPES = StringType, UnicodeType
+
+from _util import http2time
+import _rfc3986
+
+def is_html(ct_headers, url, allow_xhtml=False):
+    """
+    ct_headers: Sequence of Content-Type headers
+    url: Response URL
+
+    """
+    if not ct_headers:
+        # guess
+        ext = os.path.splitext(_rfc3986.urlsplit(url)[2])[1]
+        html_exts = [".htm", ".html"]
+        if allow_xhtml:
+            html_exts += [".xhtml"]
+        return ext in html_exts
+    # use first header
+    ct = split_header_words(ct_headers)[0][0][0]
+    html_types = ["text/html"]
+    if allow_xhtml:
+        html_types += [
+            "text/xhtml", "text/xml",
+            "application/xml", "application/xhtml+xml",
+            ]
+    return ct in html_types
+
+def unmatched(match):
+    """Return unmatched part of re.Match object."""
+    start, end = match.span(0)
+    return match.string[:start]+match.string[end:]
+
+token_re =        re.compile(r"^\s*([^=\s;,]+)")
+quoted_value_re = re.compile(r"^\s*=\s*\"([^\"\\]*(?:\\.[^\"\\]*)*)\"")
+value_re =        re.compile(r"^\s*=\s*([^\s;,]*)")
+escape_re = re.compile(r"\\(.)")
+def split_header_words(header_values):
+    r"""Parse header values into a list of lists containing key,value pairs.
+
+    The function knows how to deal with ",", ";" and "=" as well as quoted
+    values after "=".  A list of space separated tokens are parsed as if they
+    were separated by ";".
+
+    If the header_values passed as argument contains multiple values, then they
+    are treated as if they were a single value separated by comma ",".
+
+    This means that this function is useful for parsing header fields that
+    follow this syntax (BNF as from the HTTP/1.1 specification, but we relax
+    the requirement for tokens).
+
+      headers           = #header
+      header            = (token | parameter) *( [";"] (token | parameter))
+
+      token             = 1*<any CHAR except CTLs or separators>
+      separators        = "(" | ")" | "<" | ">" | "@"
+                        | "," | ";" | ":" | "\" | <">
+                        | "/" | "[" | "]" | "?" | "="
+                        | "{" | "}" | SP | HT
+
+      quoted-string     = ( <"> *(qdtext | quoted-pair ) <"> )
+      qdtext            = <any TEXT except <">>
+      quoted-pair       = "\" CHAR
+
+      parameter         = attribute "=" value
+      attribute         = token
+      value             = token | quoted-string
+
+    Each header is represented by a list of key/value pairs.  The value for a
+    simple token (not part of a parameter) is None.  Syntactically incorrect
+    headers will not necessarily be parsed as you would want.
+
+    This is easier to describe with some examples:
+
+    >>> split_header_words(['foo="bar"; port="80,81"; discard, bar=baz'])
+    [[('foo', 'bar'), ('port', '80,81'), ('discard', None)], [('bar', 'baz')]]
+    >>> split_header_words(['text/html; charset="iso-8859-1"'])
+    [[('text/html', None), ('charset', 'iso-8859-1')]]
+    >>> split_header_words([r'Basic realm="\"foo\bar\""'])
+    [[('Basic', None), ('realm', '"foobar"')]]
+
+    """
+    assert type(header_values) not in STRING_TYPES
+    result = []
+    for text in header_values:
+        orig_text = text
+        pairs = []
+        while text:
+            m = token_re.search(text)
+            if m:
+                text = unmatched(m)
+                name = m.group(1)
+                m = quoted_value_re.search(text)
+                if m:  # quoted value
+                    text = unmatched(m)
+                    value = m.group(1)
+                    value = escape_re.sub(r"\1", value)
+                else:
+                    m = value_re.search(text)
+                    if m:  # unquoted value
+                        text = unmatched(m)
+                        value = m.group(1)
+                        value = value.rstrip()
+                    else:
+                        # no value, a lone token
+                        value = None
+                pairs.append((name, value))
+            elif text.lstrip().startswith(","):
+                # concatenated headers, as per RFC 2616 section 4.2
+                text = text.lstrip()[1:]
+                if pairs: result.append(pairs)
+                pairs = []
+            else:
+                # skip junk
+                non_junk, nr_junk_chars = re.subn("^[=\s;]*", "", text)
+                assert nr_junk_chars > 0, (
+                    "split_header_words bug: '%s', '%s', %s" %
+                    (orig_text, text, pairs))
+                text = non_junk
+        if pairs: result.append(pairs)
+    return result
+
+join_escape_re = re.compile(r"([\"\\])")
+def join_header_words(lists):
+    """Do the inverse of the conversion done by split_header_words.
+
+    Takes a list of lists of (key, value) pairs and produces a single header
+    value.  Attribute values are quoted if needed.
+
+    >>> join_header_words([[("text/plain", None), ("charset", "iso-8859/1")]])
+    'text/plain; charset="iso-8859/1"'
+    >>> join_header_words([[("text/plain", None)], [("charset", "iso-8859/1")]])
+    'text/plain, charset="iso-8859/1"'
+
+    """
+    headers = []
+    for pairs in lists:
+        attr = []
+        for k, v in pairs:
+            if v is not None:
+                if not re.search(r"^\w+$", v):
+                    v = join_escape_re.sub(r"\\\1", v)  # escape " and \
+                    v = '"%s"' % v
+                if k is None:  # Netscape cookies may have no name
+                    k = v
+                else:
+                    k = "%s=%s" % (k, v)
+            attr.append(k)
+        if attr: headers.append("; ".join(attr))
+    return ", ".join(headers)
+
+def parse_ns_headers(ns_headers):
+    """Ad-hoc parser for Netscape protocol cookie-attributes.
+
+    The old Netscape cookie format for Set-Cookie can for instance contain
+    an unquoted "," in the expires field, so we have to use this ad-hoc
+    parser instead of split_header_words.
+
+    XXX This may not make the best possible effort to parse all the crap
+    that Netscape Cookie headers contain.  Ronald Tschalar's HTTPClient
+    parser is probably better, so could do worse than following that if
+    this ever gives any trouble.
+
+    Currently, this is also used for parsing RFC 2109 cookies.
+
+    """
+    known_attrs = ("expires", "domain", "path", "secure",
+                   # RFC 2109 attrs (may turn up in Netscape cookies, too)
+                   "port", "max-age")
+
+    result = []
+    for ns_header in ns_headers:
+        pairs = []
+        version_set = False
+        params = re.split(r";\s*", ns_header)
+        for ii in range(len(params)):
+            param = params[ii]
+            param = param.rstrip()
+            if param == "": continue
+            if "=" not in param:
+                k, v = param, None
+            else:
+                k, v = re.split(r"\s*=\s*", param, 1)
+                k = k.lstrip()
+            if ii != 0:
+                lc = k.lower()
+                if lc in known_attrs:
+                    k = lc
+                if k == "version":
+                    # This is an RFC 2109 cookie.
+                    version_set = True
+                if k == "expires":
+                    # convert expires date to seconds since epoch
+                    if v.startswith('"'): v = v[1:]
+                    if v.endswith('"'): v = v[:-1]
+                    v = http2time(v)  # None if invalid
+            pairs.append((k, v))
+
+        if pairs:
+            if not version_set:
+                pairs.append(("version", "0"))
+            result.append(pairs)
+
+    return result
+
+
+def _test():
+   import doctest, _headersutil
+   return doctest.testmod(_headersutil)
+
+if __name__ == "__main__":
+   _test()
Index: /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_gzip.py
===================================================================
--- /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_gzip.py (revision 3)
+++ /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_gzip.py (revision 3)
@@ -0,0 +1,103 @@
+import urllib2
+from cStringIO import StringIO
+import _response
+
+# GzipConsumer was taken from Fredrik Lundh's effbot.org-0.1-20041009 library
+class GzipConsumer:
+
+    def __init__(self, consumer):
+        self.__consumer = consumer
+        self.__decoder = None
+        self.__data = ""
+
+    def __getattr__(self, key):
+        return getattr(self.__consumer, key)
+
+    def feed(self, data):
+        if self.__decoder is None:
+            # check if we have a full gzip header
+            data = self.__data + data
+            try:
+                i = 10
+                flag = ord(data[3])
+                if flag & 4: # extra
+                    x = ord(data[i]) + 256*ord(data[i+1])
+                    i = i + 2 + x
+                if flag & 8: # filename
+                    while ord(data[i]):
+                        i = i + 1
+                    i = i + 1
+                if flag & 16: # comment
+                    while ord(data[i]):
+                        i = i + 1
+                    i = i + 1
+                if flag & 2: # crc
+                    i = i + 2
+                if len(data) < i:
+                    raise IndexError("not enough data")
+                if data[:3] != "\x1f\x8b\x08":
+                    raise IOError("invalid gzip data")
+                data = data[i:]
+            except IndexError:
+                self.__data = data
+                return # need more data
+            import zlib
+            self.__data = ""
+            self.__decoder = zlib.decompressobj(-zlib.MAX_WBITS)
+        data = self.__decoder.decompress(data)
+        if data:
+            self.__consumer.feed(data)
+
+    def close(self):
+        if self.__decoder:
+            data = self.__decoder.flush()
+            if data:
+                self.__consumer.feed(data)
+        self.__consumer.close()
+
+
+# --------------------------------------------------------------------
+
+# the rest of this module is John Lee's stupid code, not
+# Fredrik's nice code :-)
+
+class stupid_gzip_consumer:
+    def __init__(self): self.data = []
+    def feed(self, data): self.data.append(data)
+
+class stupid_gzip_wrapper(_response.closeable_response):
+    def __init__(self, response):
+        self._response = response
+
+        c = stupid_gzip_consumer()
+        gzc = GzipConsumer(c)
+        gzc.feed(response.read())
+        self.__data = StringIO("".join(c.data))
+
+    def read(self, size=-1):
+        return self.__data.read(size)
+    def readline(self, size=-1):
+        return self.__data.readline(size)
+    def readlines(self, sizehint=-1):
+        return self.__data.readlines(size)
+
+    def __getattr__(self, name):
+        # delegate unknown methods/attributes
+        return getattr(self._response, name)
+
+class HTTPGzipProcessor(urllib2.BaseHandler):
+    handler_order = 200  # response processing before HTTPEquivProcessor
+
+    def http_request(self, request):
+        request.add_header("Accept-Encoding", "gzip")
+        return request
+
+    def http_response(self, request, response):
+        # post-process response
+        enc_hdrs = response.info().getheaders("Content-encoding")
+        for enc_hdr in enc_hdrs:
+            if ("gzip" in enc_hdr) or ("compress" in enc_hdr):
+                return stupid_gzip_wrapper(response)
+        return response
+
+    https_response = http_response
Index: /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_urllib2.py
===================================================================
--- /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_urllib2.py (revision 3)
+++ /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_urllib2.py (revision 3)
@@ -0,0 +1,60 @@
+# urllib2 work-alike interface
+# ...from urllib2...
+from urllib2 import \
+     URLError, \
+     HTTPError
+# ...and from mechanize
+from _opener import OpenerDirector, \
+     SeekableResponseOpener, \
+     build_opener, install_opener, urlopen
+from _auth import \
+     HTTPPasswordMgr, \
+     HTTPPasswordMgrWithDefaultRealm, \
+     AbstractBasicAuthHandler, \
+     AbstractDigestAuthHandler, \
+     HTTPProxyPasswordMgr, \
+     ProxyHandler, \
+     ProxyBasicAuthHandler, \
+     ProxyDigestAuthHandler, \
+     HTTPBasicAuthHandler, \
+     HTTPDigestAuthHandler, \
+     HTTPSClientCertMgr
+from _request import \
+     Request
+from _http import \
+     RobotExclusionError
+
+# handlers...
+# ...from urllib2...
+from urllib2 import \
+     BaseHandler, \
+     UnknownHandler, \
+     FTPHandler, \
+     CacheFTPHandler, \
+     FileHandler
+# ...and from mechanize
+from _http import \
+     HTTPHandler, \
+     HTTPDefaultErrorHandler, \
+     HTTPRedirectHandler, \
+     HTTPEquivProcessor, \
+     HTTPCookieProcessor, \
+     HTTPRefererProcessor, \
+     HTTPRefreshProcessor, \
+     HTTPErrorProcessor, \
+     HTTPRobotRulesProcessor
+from _upgrade import \
+     HTTPRequestUpgradeProcessor, \
+     ResponseUpgradeProcessor
+from _debug import \
+     HTTPResponseDebugProcessor, \
+     HTTPRedirectDebugProcessor
+from _seek import \
+     SeekableProcessor
+# crap ATM
+## from _gzip import \
+##      HTTPGzipProcessor
+import httplib
+if hasattr(httplib, 'HTTPS'):
+    from _http import HTTPSHandler
+del httplib
Index: /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_util.py
===================================================================
--- /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_util.py (revision 3)
+++ /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_util.py (revision 3)
@@ -0,0 +1,279 @@
+"""Utility functions and date/time routines.
+
+ Copyright 2002-2006 John J Lee <jjl@pobox.com>
+
+This code is free software; you can redistribute it and/or modify it
+under the terms of the BSD or ZPL 2.1 licenses (see the file
+COPYING.txt included with the distribution).
+
+"""
+
+import re, string, time, warnings
+
+def deprecation(message):
+    warnings.warn(message, DeprecationWarning, stacklevel=3)
+def hide_deprecations():
+    warnings.filterwarnings('ignore', category=DeprecationWarning)
+def reset_deprecations():
+    warnings.filterwarnings('default', category=DeprecationWarning)
+
+
+def isstringlike(x):
+    try: x+""
+    except: return False
+    else: return True
+
+## def caller():
+##     try:
+##         raise SyntaxError
+##     except:
+##         import sys
+##     return sys.exc_traceback.tb_frame.f_back.f_back.f_code.co_name
+
+
+from calendar import timegm
+
+# Date/time conversion routines for formats used by the HTTP protocol.
+
+EPOCH = 1970
+def my_timegm(tt):
+    year, month, mday, hour, min, sec = tt[:6]
+    if ((year >= EPOCH) and (1 <= month <= 12) and (1 <= mday <= 31) and
+        (0 <= hour <= 24) and (0 <= min <= 59) and (0 <= sec <= 61)):
+        return timegm(tt)
+    else:
+        return None
+
+days = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]
+months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun",
+          "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
+months_lower = []
+for month in months: months_lower.append(month.lower())
+
+
+def time2isoz(t=None):
+    """Return a string representing time in seconds since epoch, t.
+
+    If the function is called without an argument, it will use the current
+    time.
+
+    The format of the returned string is like "YYYY-MM-DD hh:mm:ssZ",
+    representing Universal Time (UTC, aka GMT).  An example of this format is:
+
+    1994-11-24 08:49:37Z
+
+    """
+    if t is None: t = time.time()
+    year, mon, mday, hour, min, sec = time.gmtime(t)[:6]
+    return "%04d-%02d-%02d %02d:%02d:%02dZ" % (
+        year, mon, mday, hour, min, sec)
+
+def time2netscape(t=None):
+    """Return a string representing time in seconds since epoch, t.
+
+    If the function is called without an argument, it will use the current
+    time.
+
+    The format of the returned string is like this:
+
+    Wed, DD-Mon-YYYY HH:MM:SS GMT
+
+    """
+    if t is None: t = time.time()
+    year, mon, mday, hour, min, sec, wday = time.gmtime(t)[:7]
+    return "%s %02d-%s-%04d %02d:%02d:%02d GMT" % (
+        days[wday], mday, months[mon-1], year, hour, min, sec)
+
+
+UTC_ZONES = {"GMT": None, "UTC": None, "UT": None, "Z": None}
+
+timezone_re = re.compile(r"^([-+])?(\d\d?):?(\d\d)?$")
+def offset_from_tz_string(tz):
+    offset = None
+    if UTC_ZONES.has_key(tz):
+        offset = 0
+    else:
+        m = timezone_re.search(tz)
+        if m:
+            offset = 3600 * int(m.group(2))
+            if m.group(3):
+                offset = offset + 60 * int(m.group(3))
+            if m.group(1) == '-':
+                offset = -offset
+    return offset
+
+def _str2time(day, mon, yr, hr, min, sec, tz):
+    # translate month name to number
+    # month numbers start with 1 (January)
+    try:
+        mon = months_lower.index(mon.lower())+1
+    except ValueError:
+        # maybe it's already a number
+        try:
+            imon = int(mon)
+        except ValueError:
+            return None
+        if 1 <= imon <= 12:
+            mon = imon
+        else:
+            return None
+
+    # make sure clock elements are defined
+    if hr is None: hr = 0
+    if min is None: min = 0
+    if sec is None: sec = 0
+
+    yr = int(yr)
+    day = int(day)
+    hr = int(hr)
+    min = int(min)
+    sec = int(sec)
+
+    if yr < 1000:
+        # find "obvious" year
+        cur_yr = time.localtime(time.time())[0]
+        m = cur_yr % 100
+        tmp = yr
+        yr = yr + cur_yr - m
+        m = m - tmp
+        if abs(m) > 50:
+            if m > 0: yr = yr + 100
+            else: yr = yr - 100
+
+    # convert UTC time tuple to seconds since epoch (not timezone-adjusted)
+    t = my_timegm((yr, mon, day, hr, min, sec, tz))
+
+    if t is not None:
+        # adjust time using timezone string, to get absolute time since epoch
+        if tz is None:
+            tz = "UTC"
+        tz = tz.upper()
+        offset = offset_from_tz_string(tz)
+        if offset is None:
+            return None
+        t = t - offset
+
+    return t
+
+
+strict_re = re.compile(r"^[SMTWF][a-z][a-z], (\d\d) ([JFMASOND][a-z][a-z]) (\d\d\d\d) (\d\d):(\d\d):(\d\d) GMT$")
+wkday_re = re.compile(
+    r"^(?:Sun|Mon|Tue|Wed|Thu|Fri|Sat)[a-z]*,?\s*", re.I)
+loose_http_re = re.compile(
+    r"""^
+    (\d\d?)            # day
+       (?:\s+|[-\/])
+    (\w+)              # month
+        (?:\s+|[-\/])
+    (\d+)              # year
+    (?:
+          (?:\s+|:)    # separator before clock
+       (\d\d?):(\d\d)  # hour:min
+       (?::(\d\d))?    # optional seconds
+    )?                 # optional clock
+       \s*
+    ([-+]?\d{2,4}|(?![APap][Mm]\b)[A-Za-z]+)? # timezone
+       \s*
+    (?:\(\w+\))?       # ASCII representation of timezone in parens.
+       \s*$""", re.X)
+def http2time(text):
+    """Returns time in seconds since epoch of time represented by a string.
+
+    Return value is an integer.
+
+    None is returned if the format of str is unrecognized, the time is outside
+    the representable range, or the timezone string is not recognized.  If the
+    string contains no timezone, UTC is assumed.
+
+    The timezone in the string may be numerical (like "-0800" or "+0100") or a
+    string timezone (like "UTC", "GMT", "BST" or "EST").  Currently, only the
+    timezone strings equivalent to UTC (zero offset) are known to the function.
+
+    The function loosely parses the following formats:
+
+    Wed, 09 Feb 1994 22:23:32 GMT       -- HTTP format
+    Tuesday, 08-Feb-94 14:15:29 GMT     -- old rfc850 HTTP format
+    Tuesday, 08-Feb-1994 14:15:29 GMT   -- broken rfc850 HTTP format
+    09 Feb 1994 22:23:32 GMT            -- HTTP format (no weekday)
+    08-Feb-94 14:15:29 GMT              -- rfc850 format (no weekday)
+    08-Feb-1994 14:15:29 GMT            -- broken rfc850 format (no weekday)
+
+    The parser ignores leading and trailing whitespace.  The time may be
+    absent.
+
+    If the year is given with only 2 digits, the function will select the
+    century that makes the year closest to the current date.
+
+    """
+    # fast exit for strictly conforming string
+    m = strict_re.search(text)
+    if m:
+        g = m.groups()
+        mon = months_lower.index(g[1].lower()) + 1
+        tt = (int(g[2]), mon, int(g[0]),
+              int(g[3]), int(g[4]), float(g[5]))
+        return my_timegm(tt)
+
+    # No, we need some messy parsing...
+
+    # clean up
+    text = text.lstrip()
+    text = wkday_re.sub("", text, 1)  # Useless weekday
+
+    # tz is time zone specifier string
+    day, mon, yr, hr, min, sec, tz = [None]*7
+
+    # loose regexp parse
+    m = loose_http_re.search(text)
+    if m is not None:
+        day, mon, yr, hr, min, sec, tz = m.groups()
+    else:
+        return None  # bad format
+
+    return _str2time(day, mon, yr, hr, min, sec, tz)
+
+
+iso_re = re.compile(
+    """^
+    (\d{4})              # year
+       [-\/]?
+    (\d\d?)              # numerical month
+       [-\/]?
+    (\d\d?)              # day
+   (?:
+         (?:\s+|[-:Tt])  # separator before clock
+      (\d\d?):?(\d\d)    # hour:min
+      (?::?(\d\d(?:\.\d*)?))?  # optional seconds (and fractional)
+   )?                    # optional clock
+      \s*
+   ([-+]?\d\d?:?(:?\d\d)?
+    |Z|z)?               # timezone  (Z is "zero meridian", i.e. GMT)
+      \s*$""", re.X)
+def iso2time(text):
+    """
+    As for http2time, but parses the ISO 8601 formats:
+
+    1994-02-03 14:15:29 -0100    -- ISO 8601 format
+    1994-02-03 14:15:29          -- zone is optional
+    1994-02-03                   -- only date
+    1994-02-03T14:15:29          -- Use T as separator
+    19940203T141529Z             -- ISO 8601 compact format
+    19940203                     -- only date
+
+    """
+    # clean up
+    text = text.lstrip()
+
+    # tz is time zone specifier string
+    day, mon, yr, hr, min, sec, tz = [None]*7
+
+    # loose regexp parse
+    m = iso_re.search(text)
+    if m is not None:
+        # XXX there's an extra bit of the timezone I'm ignoring here: is
+        #   this the right thing to do?
+        yr, mon, day, hr, min, sec, tz, _ = m.groups()
+    else:
+        return None  # bad format
+
+    return _str2time(day, mon, yr, hr, min, sec, tz)
Index: /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_http.py
===================================================================
--- /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_http.py (revision 3)
+++ /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_http.py (revision 3)
@@ -0,0 +1,729 @@
+"""HTTP related handlers.
+
+Note that some other HTTP handlers live in more specific modules: _auth.py,
+_gzip.py, etc.
+
+
+Copyright 2002-2006 John J Lee <jjl@pobox.com>
+
+This code is free software; you can redistribute it and/or modify it
+under the terms of the BSD or ZPL 2.1 licenses (see the file
+COPYING.txt included with the distribution).
+
+"""
+
+import copy, time, tempfile, htmlentitydefs, re, logging, socket, \
+       urllib2, urllib, httplib, sgmllib
+from urllib2 import URLError, HTTPError, BaseHandler
+from cStringIO import StringIO
+
+from _request import Request
+from _util import isstringlike
+from _response import closeable_response, response_seek_wrapper
+from _html import unescape, unescape_charref
+from _headersutil import is_html
+from _clientcookie import CookieJar, request_host
+import _rfc3986
+
+debug = logging.getLogger("mechanize").debug
+
+# monkeypatch urllib2.HTTPError to show URL
+## def urllib2_str(self):
+##     return 'HTTP Error %s: %s (%s)' % (
+##         self.code, self.msg, self.geturl())
+## urllib2.HTTPError.__str__ = urllib2_str
+
+
+CHUNK = 1024  # size of chunks fed to HTML HEAD parser, in bytes
+DEFAULT_ENCODING = 'latin-1'
+
+
+# This adds "refresh" to the list of redirectables and provides a redirection
+# algorithm that doesn't go into a loop in the presence of cookies
+# (Python 2.4 has this new algorithm, 2.3 doesn't).
+class HTTPRedirectHandler(BaseHandler):
+    # maximum number of redirections to any single URL
+    # this is needed because of the state that cookies introduce
+    max_repeats = 4
+    # maximum total number of redirections (regardless of URL) before
+    # assuming we're in a loop
+    max_redirections = 10
+
+    # Implementation notes:
+
+    # To avoid the server sending us into an infinite loop, the request
+    # object needs to track what URLs we have already seen.  Do this by
+    # adding a handler-specific attribute to the Request object.  The value
+    # of the dict is used to count the number of times the same URL has
+    # been visited.  This is needed because visiting the same URL twice
+    # does not necessarily imply a loop, thanks to state introduced by
+    # cookies.
+
+    # Always unhandled redirection codes:
+    # 300 Multiple Choices: should not handle this here.
+    # 304 Not Modified: no need to handle here: only of interest to caches
+    #     that do conditional GETs
+    # 305 Use Proxy: probably not worth dealing with here
+    # 306 Unused: what was this for in the previous versions of protocol??
+
+    def redirect_request(self, newurl, req, fp, code, msg, headers):
+        """Return a Request or None in response to a redirect.
+
+        This is called by the http_error_30x methods when a redirection
+        response is received.  If a redirection should take place, return a
+        new Request to allow http_error_30x to perform the redirect;
+        otherwise, return None to indicate that an HTTPError should be
+        raised.
+
+        """
+        if code in (301, 302, 303, "refresh") or \
+               (code == 307 and not req.has_data()):
+            # Strictly (according to RFC 2616), 301 or 302 in response to
+            # a POST MUST NOT cause a redirection without confirmation
+            # from the user (of urllib2, in this case).  In practice,
+            # essentially all clients do redirect in this case, so we do
+            # the same.
+            # XXX really refresh redirections should be visiting; tricky to
+            #  fix, so this will wait until post-stable release
+            new = Request(newurl,
+                          headers=req.headers,
+                          origin_req_host=req.get_origin_req_host(),
+                          unverifiable=True,
+                          visit=False,
+                          )
+            new._origin_req = getattr(req, "_origin_req", req)
+            return new
+        else:
+            raise HTTPError(req.get_full_url(), code, msg, headers, fp)
+
+    def http_error_302(self, req, fp, code, msg, headers):
+        # Some servers (incorrectly) return multiple Location headers
+        # (so probably same goes for URI).  Use first header.
+        if headers.has_key('location'):
+            newurl = headers.getheaders('location')[0]
+        elif headers.has_key('uri'):
+            newurl = headers.getheaders('uri')[0]
+        else:
+            return
+        newurl = _rfc3986.clean_url(newurl, "latin-1")
+        newurl = _rfc3986.urljoin(req.get_full_url(), newurl)
+
+        # XXX Probably want to forget about the state of the current
+        # request, although that might interact poorly with other
+        # handlers that also use handler-specific request attributes
+        new = self.redirect_request(newurl, req, fp, code, msg, headers)
+        if new is None:
+            return
+
+        # loop detection
+        # .redirect_dict has a key url if url was previously visited.
+        if hasattr(req, 'redirect_dict'):
+            visited = new.redirect_dict = req.redirect_dict
+            if (visited.get(newurl, 0) >= self.max_repeats or
+                len(visited) >= self.max_redirections):
+                raise HTTPError(req.get_full_url(), code,
+                                self.inf_msg + msg, headers, fp)
+        else:
+            visited = new.redirect_dict = req.redirect_dict = {}
+        visited[newurl] = visited.get(newurl, 0) + 1
+
+        # Don't close the fp until we are sure that we won't use it
+        # with HTTPError.  
+        fp.read()
+        fp.close()
+
+        return self.parent.open(new)
+
+    http_error_301 = http_error_303 = http_error_307 = http_error_302
+    http_error_refresh = http_error_302
+
+    inf_msg = "The HTTP server returned a redirect error that would " \
+              "lead to an infinite loop.\n" \
+              "The last 30x error message was:\n"
+
+
+# XXX would self.reset() work, instead of raising this exception?
+class EndOfHeadError(Exception): pass
+class AbstractHeadParser:
+    # only these elements are allowed in or before HEAD of document
+    head_elems = ("html", "head",
+                  "title", "base",
+                  "script", "style", "meta", "link", "object")
+    _entitydefs = htmlentitydefs.name2codepoint
+    _encoding = DEFAULT_ENCODING
+
+    def __init__(self):
+        self.http_equiv = []
+
+    def start_meta(self, attrs):
+        http_equiv = content = None
+        for key, value in attrs:
+            if key == "http-equiv":
+                http_equiv = self.unescape_attr_if_required(value)
+            elif key == "content":
+                content = self.unescape_attr_if_required(value)
+        if http_equiv is not None and content is not None:
+            self.http_equiv.append((http_equiv, content))
+
+    def end_head(self):
+        raise EndOfHeadError()
+
+    def handle_entityref(self, name):
+        #debug("%s", name)
+        self.handle_data(unescape(
+            '&%s;' % name, self._entitydefs, self._encoding))
+
+    def handle_charref(self, name):
+        #debug("%s", name)
+        self.handle_data(unescape_charref(name, self._encoding))
+
+    def unescape_attr(self, name):
+        #debug("%s", name)
+        return unescape(name, self._entitydefs, self._encoding)
+
+    def unescape_attrs(self, attrs):
+        #debug("%s", attrs)
+        escaped_attrs = {}
+        for key, val in attrs.items():
+            escaped_attrs[key] = self.unescape_attr(val)
+        return escaped_attrs
+
+    def unknown_entityref(self, ref):
+        self.handle_data("&%s;" % ref)
+
+    def unknown_charref(self, ref):
+        self.handle_data("&#%s;" % ref)
+
+
+try:
+    import HTMLParser
+except ImportError:
+    pass
+else:
+    class XHTMLCompatibleHeadParser(AbstractHeadParser,
+                                    HTMLParser.HTMLParser):
+        def __init__(self):
+            HTMLParser.HTMLParser.__init__(self)
+            AbstractHeadParser.__init__(self)
+
+        def handle_starttag(self, tag, attrs):
+            if tag not in self.head_elems:
+                raise EndOfHeadError()
+            try:
+                method = getattr(self, 'start_' + tag)
+            except AttributeError:
+                try:
+                    method = getattr(self, 'do_' + tag)
+                except AttributeError:
+                    pass # unknown tag
+                else:
+                    method(attrs)
+            else:
+                method(attrs)
+
+        def handle_endtag(self, tag):
+            if tag not in self.head_elems:
+                raise EndOfHeadError()
+            try:
+                method = getattr(self, 'end_' + tag)
+            except AttributeError:
+                pass # unknown tag
+            else:
+                method()
+
+        def unescape(self, name):
+            # Use the entitydefs passed into constructor, not
+            # HTMLParser.HTMLParser's entitydefs.
+            return self.unescape_attr(name)
+
+        def unescape_attr_if_required(self, name):
+            return name  # HTMLParser.HTMLParser already did it
+
+class HeadParser(AbstractHeadParser, sgmllib.SGMLParser):
+
+    def _not_called(self):
+        assert False
+
+    def __init__(self):
+        sgmllib.SGMLParser.__init__(self)
+        AbstractHeadParser.__init__(self)
+
+    def handle_starttag(self, tag, method, attrs):
+        if tag not in self.head_elems:
+            raise EndOfHeadError()
+        if tag == "meta":
+            method(attrs)
+
+    def unknown_starttag(self, tag, attrs):
+        self.handle_starttag(tag, self._not_called, attrs)
+
+    def handle_endtag(self, tag, method):
+        if tag in self.head_elems:
+            method()
+        else:
+            raise EndOfHeadError()
+
+    def unescape_attr_if_required(self, name):
+        return self.unescape_attr(name)
+
+def parse_head(fileobj, parser):
+    """Return a list of key, value pairs."""
+    while 1:
+        data = fileobj.read(CHUNK)
+        try:
+            parser.feed(data)
+        except EndOfHeadError:
+            break
+        if len(data) != CHUNK:
+            # this should only happen if there is no HTML body, or if
+            # CHUNK is big
+            break
+    return parser.http_equiv
+
+class HTTPEquivProcessor(BaseHandler):
+    """Append META HTTP-EQUIV headers to regular HTTP headers."""
+
+    handler_order = 300  # before handlers that look at HTTP headers
+
+    def __init__(self, head_parser_class=HeadParser,
+                 i_want_broken_xhtml_support=False,
+                 ):
+        self.head_parser_class = head_parser_class
+        self._allow_xhtml = i_want_broken_xhtml_support
+
+    def http_response(self, request, response):
+        if not hasattr(response, "seek"):
+            response = response_seek_wrapper(response)
+        http_message = response.info()
+        url = response.geturl()
+        ct_hdrs = http_message.getheaders("content-type")
+        if is_html(ct_hdrs, url, self._allow_xhtml):
+            try:
+                try:
+                    html_headers = parse_head(response, self.head_parser_class())
+                finally:
+                    response.seek(0)
+            except (HTMLParser.HTMLParseError,
+                    sgmllib.SGMLParseError):
+                pass
+            else:
+                for hdr, val in html_headers:
+                    # add a header
+                    http_message.dict[hdr.lower()] = val
+                    text = hdr + ": " + val
+                    for line in text.split("\n"):
+                        http_message.headers.append(line + "\n")
+        return response
+
+    https_response = http_response
+
+class HTTPCookieProcessor(BaseHandler):
+    """Handle HTTP cookies.
+
+    Public attributes:
+
+    cookiejar: CookieJar instance
+
+    """
+    def __init__(self, cookiejar=None):
+        if cookiejar is None:
+            cookiejar = CookieJar()
+        self.cookiejar = cookiejar
+
+    def http_request(self, request):
+        self.cookiejar.add_cookie_header(request)
+        return request
+
+    def http_response(self, request, response):
+        self.cookiejar.extract_cookies(response, request)
+        return response
+
+    https_request = http_request
+    https_response = http_response
+
+try:
+    import robotparser
+except ImportError:
+    pass
+else:
+    class MechanizeRobotFileParser(robotparser.RobotFileParser):
+
+        def __init__(self, url='', opener=None):
+            import _opener
+            robotparser.RobotFileParser.__init__(self, url)
+            self._opener = opener
+
+        def set_opener(self, opener=None):
+            if opener is None:
+                opener = _opener.OpenerDirector()
+            self._opener = opener
+
+        def read(self):
+            """Reads the robots.txt URL and feeds it to the parser."""
+            if self._opener is None:
+                self.set_opener()
+            req = Request(self.url, unverifiable=True, visit=False)
+            try:
+                f = self._opener.open(req)
+            except HTTPError, f:
+                pass
+            except (IOError, socket.error, OSError), exc:
+                robotparser._debug("ignoring error opening %r: %s" %
+                                   (self.url, exc))
+                return
+            lines = []
+            line = f.readline()
+            while line:
+                lines.append(line.strip())
+                line = f.readline()
+            status = f.code
+            if status == 401 or status == 403:
+                self.disallow_all = True
+                robotparser._debug("disallow all")
+            elif status >= 400:
+                self.allow_all = True
+                robotparser._debug("allow all")
+            elif status == 200 and lines:
+                robotparser._debug("parse lines")
+                self.parse(lines)
+
+    class RobotExclusionError(urllib2.HTTPError):
+        def __init__(self, request, *args):
+            apply(urllib2.HTTPError.__init__, (self,)+args)
+            self.request = request
+
+    class HTTPRobotRulesProcessor(BaseHandler):
+        # before redirections, after everything else
+        handler_order = 800
+
+        try:
+            from httplib import HTTPMessage
+        except:
+            from mimetools import Message
+            http_response_class = Message
+        else:
+            http_response_class = HTTPMessage
+
+        def __init__(self, rfp_class=MechanizeRobotFileParser):
+            self.rfp_class = rfp_class
+            self.rfp = None
+            self._host = None
+
+        def http_request(self, request):
+            scheme = request.get_type()
+            if scheme not in ["http", "https"]:
+                # robots exclusion only applies to HTTP
+                return request
+
+            if request.get_selector() == "/robots.txt":
+                # /robots.txt is always OK to fetch
+                return request
+
+            host = request.get_host()
+
+            # robots.txt requests don't need to be allowed by robots.txt :-)
+            origin_req = getattr(request, "_origin_req", None)
+            if (origin_req is not None and
+                origin_req.get_selector() == "/robots.txt" and
+                origin_req.get_host() == host
+                ):
+                return request
+
+            if host != self._host:
+                self.rfp = self.rfp_class()
+                try:
+                    self.rfp.set_opener(self.parent)
+                except AttributeError:
+                    debug("%r instance does not support set_opener" %
+                          self.rfp.__class__)
+                self.rfp.set_url(scheme+"://"+host+"/robots.txt")
+                self.rfp.read()
+                self._host = host
+
+            ua = request.get_header("User-agent", "")
+            if self.rfp.can_fetch(ua, request.get_full_url()):
+                return request
+            else:
+                # XXX This should really have raised URLError.  Too late now...
+                msg = "request disallowed by robots.txt"
+                raise RobotExclusionError(
+                    request,
+                    request.get_full_url(),
+                    403, msg,
+                    self.http_response_class(StringIO()), StringIO(msg))
+
+        https_request = http_request
+
+class HTTPRefererProcessor(BaseHandler):
+    """Add Referer header to requests.
+
+    This only makes sense if you use each RefererProcessor for a single
+    chain of requests only (so, for example, if you use a single
+    HTTPRefererProcessor to fetch a series of URLs extracted from a single
+    page, this will break).
+
+    There's a proper implementation of this in mechanize.Browser.
+
+    """
+    def __init__(self):
+        self.referer = None
+
+    def http_request(self, request):
+        if ((self.referer is not None) and
+            not request.has_header("Referer")):
+            request.add_unredirected_header("Referer", self.referer)
+        return request
+
+    def http_response(self, request, response):
+        self.referer = response.geturl()
+        return response
+
+    https_request = http_request
+    https_response = http_response
+
+
+def clean_refresh_url(url):
+    # e.g. Firefox 1.5 does (something like) this
+    if ((url.startswith('"') and url.endswith('"')) or
+        (url.startswith("'") and url.endswith("'"))):
+        url = url[1:-1]
+    return _rfc3986.clean_url(url, "latin-1")  # XXX encoding
+
+def parse_refresh_header(refresh):
+    """
+    >>> parse_refresh_header("1; url=http://example.com/")
+    (1.0, 'http://example.com/')
+    >>> parse_refresh_header("1; url='http://example.com/'")
+    (1.0, 'http://example.com/')
+    >>> parse_refresh_header("1")
+    (1.0, None)
+    >>> parse_refresh_header("blah")
+    Traceback (most recent call last):
+    ValueError: invalid literal for float(): blah
+
+    """
+
+    ii = refresh.find(";")
+    if ii != -1:
+        pause, newurl_spec = float(refresh[:ii]), refresh[ii+1:]
+        jj = newurl_spec.find("=")
+        key = None
+        if jj != -1:
+            key, newurl = newurl_spec[:jj], newurl_spec[jj+1:]
+            newurl = clean_refresh_url(newurl)
+        if key is None or key.strip().lower() != "url":
+            raise ValueError()
+    else:
+        pause, newurl = float(refresh), None
+    return pause, newurl
+
+class HTTPRefreshProcessor(BaseHandler):
+    """Perform HTTP Refresh redirections.
+
+    Note that if a non-200 HTTP code has occurred (for example, a 30x
+    redirect), this processor will do nothing.
+
+    By default, only zero-time Refresh headers are redirected.  Use the
+    max_time attribute / constructor argument to allow Refresh with longer
+    pauses.  Use the honor_time attribute / constructor argument to control
+    whether the requested pause is honoured (with a time.sleep()) or
+    skipped in favour of immediate redirection.
+
+    Public attributes:
+
+    max_time: see above
+    honor_time: see above
+
+    """
+    handler_order = 1000
+
+    def __init__(self, max_time=0, honor_time=True):
+        self.max_time = max_time
+        self.honor_time = honor_time
+
+    def http_response(self, request, response):
+        code, msg, hdrs = response.code, response.msg, response.info()
+
+        if code == 200 and hdrs.has_key("refresh"):
+            refresh = hdrs.getheaders("refresh")[0]
+            try:
+                pause, newurl = parse_refresh_header(refresh)
+            except ValueError:
+                debug("bad Refresh header: %r" % refresh)
+                return response
+            if newurl is None:
+                newurl = response.geturl()
+            if (self.max_time is None) or (pause <= self.max_time):
+                if pause > 1E-3 and self.honor_time:
+                    time.sleep(pause)
+                hdrs["location"] = newurl
+                # hardcoded http is NOT a bug
+                response = self.parent.error(
+                    "http", request, response,
+                    "refresh", msg, hdrs)
+
+        return response
+
+    https_response = http_response
+
+class HTTPErrorProcessor(BaseHandler):
+    """Process HTTP error responses.
+
+    The purpose of this handler is to to allow other response processors a
+    look-in by removing the call to parent.error() from
+    AbstractHTTPHandler.
+
+    For non-200 error codes, this just passes the job on to the
+    Handler.<proto>_error_<code> methods, via the OpenerDirector.error
+    method.  Eventually, urllib2.HTTPDefaultErrorHandler will raise an
+    HTTPError if no other handler handles the error.
+
+    """
+    handler_order = 1000  # after all other processors
+
+    def http_response(self, request, response):
+        code, msg, hdrs = response.code, response.msg, response.info()
+
+        if code != 200:
+            # hardcoded http is NOT a bug
+            response = self.parent.error(
+                "http", request, response, code, msg, hdrs)
+
+        return response
+
+    https_response = http_response
+
+
+class HTTPDefaultErrorHandler(BaseHandler):
+    def http_error_default(self, req, fp, code, msg, hdrs):
+        # why these error methods took the code, msg, headers args in the first
+        # place rather than a response object, I don't know, but to avoid
+        # multiple wrapping, we're discarding them
+
+        if isinstance(fp, urllib2.HTTPError):
+            response = fp
+        else:
+            response = urllib2.HTTPError(
+                req.get_full_url(), code, msg, hdrs, fp)
+        assert code == response.code
+        assert msg == response.msg
+        assert hdrs == response.hdrs
+        raise response
+
+
+class AbstractHTTPHandler(BaseHandler):
+
+    def __init__(self, debuglevel=0):
+        self._debuglevel = debuglevel
+
+    def set_http_debuglevel(self, level):
+        self._debuglevel = level
+
+    def do_request_(self, request):
+        host = request.get_host()
+        if not host:
+            raise URLError('no host given')
+
+        if request.has_data():  # POST
+            data = request.get_data()
+            if not request.has_header('Content-type'):
+                request.add_unredirected_header(
+                    'Content-type',
+                    'application/x-www-form-urlencoded')
+
+        scheme, sel = urllib.splittype(request.get_selector())
+        sel_host, sel_path = urllib.splithost(sel)
+        if not request.has_header('Host'):
+            request.add_unredirected_header('Host', sel_host or host)
+        for name, value in self.parent.addheaders:
+            name = name.capitalize()
+            if not request.has_header(name):
+                request.add_unredirected_header(name, value)
+
+        return request
+
+    def do_open(self, http_class, req):
+        """Return an addinfourl object for the request, using http_class.
+
+        http_class must implement the HTTPConnection API from httplib.
+        The addinfourl return value is a file-like object.  It also
+        has methods and attributes including:
+            - info(): return a mimetools.Message object for the headers
+            - geturl(): return the original request URL
+            - code: HTTP status code
+        """
+        host = req.get_host()
+        if not host:
+            raise URLError('no host given')
+
+        h = http_class(host) # will parse host:port
+        h.set_debuglevel(self._debuglevel)
+
+        headers = dict(req.headers)
+        headers.update(req.unredirected_hdrs)
+        # We want to make an HTTP/1.1 request, but the addinfourl
+        # class isn't prepared to deal with a persistent connection.
+        # It will try to read all remaining data from the socket,
+        # which will block while the server waits for the next request.
+        # So make sure the connection gets closed after the (only)
+        # request.
+        headers["Connection"] = "close"
+        headers = dict(
+            [(name.title(), val) for name, val in headers.items()])
+        try:
+            h.request(req.get_method(), req.get_selector(), req.data, headers)
+            r = h.getresponse()
+        except socket.error, err: # XXX what error?
+            raise URLError(err)
+
+        # Pick apart the HTTPResponse object to get the addinfourl
+        # object initialized properly.
+
+        # Wrap the HTTPResponse object in socket's file object adapter
+        # for Windows.  That adapter calls recv(), so delegate recv()
+        # to read().  This weird wrapping allows the returned object to
+        # have readline() and readlines() methods.
+
+        # XXX It might be better to extract the read buffering code
+        # out of socket._fileobject() and into a base class.
+
+        r.recv = r.read
+        fp = socket._fileobject(r)
+
+        resp = closeable_response(fp, r.msg, req.get_full_url(),
+                                  r.status, r.reason)
+        return resp
+
+
+class HTTPHandler(AbstractHTTPHandler):
+    def http_open(self, req):
+        return self.do_open(httplib.HTTPConnection, req)
+
+    http_request = AbstractHTTPHandler.do_request_
+
+if hasattr(httplib, 'HTTPS'):
+
+    class HTTPSConnectionFactory:
+        def __init__(self, key_file, cert_file):
+            self._key_file = key_file
+            self._cert_file = cert_file
+        def __call__(self, hostport):
+            return httplib.HTTPSConnection(
+                hostport,
+                key_file=self._key_file, cert_file=self._cert_file)
+
+    class HTTPSHandler(AbstractHTTPHandler):
+        def __init__(self, client_cert_manager=None):
+            AbstractHTTPHandler.__init__(self)
+            self.client_cert_manager = client_cert_manager
+
+        def https_open(self, req):
+            if self.client_cert_manager is not None:
+                key_file, cert_file = self.client_cert_manager.find_key_cert(
+                    req.get_full_url())
+                conn_factory = HTTPSConnectionFactory(key_file, cert_file)
+            else:
+                conn_factory = httplib.HTTPSConnection
+            return self.do_open(conn_factory, req)
+
+        https_request = AbstractHTTPHandler.do_request_
Index: /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_msiecookiejar.py
===================================================================
--- /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_msiecookiejar.py (revision 3)
+++ /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_msiecookiejar.py (revision 3)
@@ -0,0 +1,387 @@
+"""Microsoft Internet Explorer cookie loading on Windows.
+
+Copyright 2002-2003 Johnny Lee <typo_pl@hotmail.com> (MSIE Perl code)
+Copyright 2002-2006 John J Lee <jjl@pobox.com> (The Python port)
+
+This code is free software; you can redistribute it and/or modify it
+under the terms of the BSD or ZPL 2.1 licenses (see the file
+COPYING.txt included with the distribution).
+
+"""
+
+# XXX names and comments are not great here
+
+import os, re, time, struct, logging
+if os.name == "nt":
+    import _winreg
+
+from _clientcookie import FileCookieJar, CookieJar, Cookie, \
+     MISSING_FILENAME_TEXT, LoadError
+
+debug = logging.getLogger("mechanize").debug
+
+
+def regload(path, leaf):
+    key = _winreg.OpenKey(_winreg.HKEY_CURRENT_USER, path, 0,
+                          _winreg.KEY_ALL_ACCESS)
+    try:
+        value = _winreg.QueryValueEx(key, leaf)[0]
+    except WindowsError:
+        value = None
+    return value
+
+WIN32_EPOCH = 0x019db1ded53e8000L  # 1970 Jan 01 00:00:00 in Win32 FILETIME
+
+def epoch_time_offset_from_win32_filetime(filetime):
+    """Convert from win32 filetime to seconds-since-epoch value.
+
+    MSIE stores create and expire times as Win32 FILETIME, which is 64
+    bits of 100 nanosecond intervals since Jan 01 1601.
+
+    mechanize expects time in 32-bit value expressed in seconds since the
+    epoch (Jan 01 1970).
+
+    """
+    if filetime < WIN32_EPOCH:
+        raise ValueError("filetime (%d) is before epoch (%d)" %
+                         (filetime, WIN32_EPOCH))
+
+    return divmod((filetime - WIN32_EPOCH), 10000000L)[0]
+
+def binary_to_char(c): return "%02X" % ord(c)
+def binary_to_str(d): return "".join(map(binary_to_char, list(d)))
+
+class MSIEBase:
+    magic_re = re.compile(r"Client UrlCache MMF Ver \d\.\d.*")
+    padding = "\x0d\xf0\xad\x0b"
+
+    msie_domain_re = re.compile(r"^([^/]+)(/.*)$")
+    cookie_re = re.compile("Cookie\:.+\@([\x21-\xFF]+).*?"
+                           "(.+\@[\x21-\xFF]+\.txt)")
+
+    # path under HKEY_CURRENT_USER from which to get location of index.dat
+    reg_path = r"software\microsoft\windows" \
+               r"\currentversion\explorer\shell folders"
+    reg_key = "Cookies"
+
+    def __init__(self):
+        self._delayload_domains = {}
+
+    def _delayload_domain(self, domain):
+        # if necessary, lazily load cookies for this domain
+        delayload_info = self._delayload_domains.get(domain)
+        if delayload_info is not None:
+            cookie_file, ignore_discard, ignore_expires = delayload_info
+            try:
+                self.load_cookie_data(cookie_file,
+                                      ignore_discard, ignore_expires)
+            except (LoadError, IOError):
+                debug("error reading cookie file, skipping: %s", cookie_file)
+            else:
+                del self._delayload_domains[domain]
+
+    def _load_cookies_from_file(self, filename):
+        debug("Loading MSIE cookies file: %s", filename)
+        cookies = []
+
+        cookies_fh = open(filename)
+
+        try:
+            while 1:
+                key = cookies_fh.readline()
+                if key == "": break
+
+                rl = cookies_fh.readline
+                def getlong(rl=rl): return long(rl().rstrip())
+                def getstr(rl=rl): return rl().rstrip()
+
+                key = key.rstrip()
+                value = getstr()
+                domain_path = getstr()
+                flags = getlong()  # 0x2000 bit is for secure I think
+                lo_expire = getlong()
+                hi_expire = getlong()
+                lo_create = getlong()
+                hi_create = getlong()
+                sep = getstr()
+
+                if "" in (key, value, domain_path, flags, hi_expire, lo_expire,
+                          hi_create, lo_create, sep) or (sep != "*"):
+                    break
+
+                m = self.msie_domain_re.search(domain_path)
+                if m:
+                    domain = m.group(1)
+                    path = m.group(2)
+
+                    cookies.append({"KEY": key, "VALUE": value, "DOMAIN": domain,
+                                    "PATH": path, "FLAGS": flags, "HIXP": hi_expire,
+                                    "LOXP": lo_expire, "HICREATE": hi_create,
+                                    "LOCREATE": lo_create})
+        finally:
+            cookies_fh.close()
+
+        return cookies
+
+    def load_cookie_data(self, filename,
+                         ignore_discard=False, ignore_expires=False):
+        """Load cookies from file containing actual cookie data.
+
+        Old cookies are kept unless overwritten by newly loaded ones.
+
+        You should not call this method if the delayload attribute is set.
+
+        I think each of these files contain all cookies for one user, domain,
+        and path.
+
+        filename: file containing cookies -- usually found in a file like
+         C:\WINNT\Profiles\joe\Cookies\joe@blah[1].txt
+
+        """
+        now = int(time.time())
+
+        cookie_data = self._load_cookies_from_file(filename)
+
+        for cookie in cookie_data:
+            flags = cookie["FLAGS"]
+            secure = ((flags & 0x2000) != 0)
+            filetime = (cookie["HIXP"] << 32) + cookie["LOXP"]
+            expires = epoch_time_offset_from_win32_filetime(filetime)
+            if expires < now:
+                discard = True
+            else:
+                discard = False
+            domain = cookie["DOMAIN"]
+            initial_dot = domain.startswith(".")
+            if initial_dot:
+                domain_specified = True
+            else:
+                # MSIE 5 does not record whether the domain cookie-attribute
+                # was specified.
+                # Assuming it wasn't is conservative, because with strict
+                # domain matching this will match less frequently; with regular
+                # Netscape tail-matching, this will match at exactly the same
+                # times that domain_specified = True would.  It also means we
+                # don't have to prepend a dot to achieve consistency with our
+                # own & Mozilla's domain-munging scheme.
+                domain_specified = False
+
+            # assume path_specified is false
+            # XXX is there other stuff in here? -- eg. comment, commentURL?
+            c = Cookie(0,
+                       cookie["KEY"], cookie["VALUE"],
+                       None, False,
+                       domain, domain_specified, initial_dot,
+                       cookie["PATH"], False,
+                       secure,
+                       expires,
+                       discard,
+                       None,
+                       None,
+                       {"flags": flags})
+            if not ignore_discard and c.discard:
+                continue
+            if not ignore_expires and c.is_expired(now):
+                continue
+            CookieJar.set_cookie(self, c)
+
+    def load_from_registry(self, ignore_discard=False, ignore_expires=False,
+                           username=None):
+        """
+        username: only required on win9x
+
+        """
+        cookies_dir = regload(self.reg_path, self.reg_key)
+        filename = os.path.normpath(os.path.join(cookies_dir, "INDEX.DAT"))
+        self.load(filename, ignore_discard, ignore_expires, username)
+
+    def _really_load(self, index, filename, ignore_discard, ignore_expires,
+                     username):
+        now = int(time.time())
+
+        if username is None:
+            username = os.environ['USERNAME'].lower()
+
+        cookie_dir = os.path.dirname(filename)
+
+        data = index.read(256)
+        if len(data) != 256:
+            raise LoadError("%s file is too short" % filename)
+
+        # Cookies' index.dat file starts with 32 bytes of signature
+        # followed by an offset to the first record, stored as a little-
+        # endian DWORD.
+        sig, size, data = data[:32], data[32:36], data[36:]
+        size = struct.unpack("<L", size)[0]
+
+        # check that sig is valid
+        if not self.magic_re.match(sig) or size != 0x4000:
+            raise LoadError("%s ['%s' %s] does not seem to contain cookies" %
+                          (str(filename), sig, size))
+
+        # skip to start of first record
+        index.seek(size, 0)
+
+        sector = 128  # size of sector in bytes
+
+        while 1:
+            data = ""
+
+            # Cookies are usually in two contiguous sectors, so read in two
+            # sectors and adjust if not a Cookie.
+            to_read = 2 * sector
+            d = index.read(to_read)
+            if len(d) != to_read:
+                break
+            data = data + d
+
+            # Each record starts with a 4-byte signature and a count
+            # (little-endian DWORD) of sectors for the record.
+            sig, size, data = data[:4], data[4:8], data[8:]
+            size = struct.unpack("<L", size)[0]
+
+            to_read = (size - 2) * sector
+
+##             from urllib import quote
+##             print "data", quote(data)
+##             print "sig", quote(sig)
+##             print "size in sectors", size
+##             print "size in bytes", size*sector
+##             print "size in units of 16 bytes", (size*sector) / 16
+##             print "size to read in bytes", to_read
+##             print
+
+            if sig != "URL ":
+                assert (sig in ("HASH", "LEAK",
+                                self.padding, "\x00\x00\x00\x00"),
+                        "unrecognized MSIE index.dat record: %s" %
+                        binary_to_str(sig))
+                if sig == "\x00\x00\x00\x00":
+                    # assume we've got all the cookies, and stop
+                    break
+                if sig == self.padding:
+                    continue
+                # skip the rest of this record
+                assert to_read >= 0
+                if size != 2:
+                    assert to_read != 0
+                    index.seek(to_read, 1)
+                continue
+
+            # read in rest of record if necessary
+            if size > 2:
+                more_data = index.read(to_read)
+                if len(more_data) != to_read: break
+                data = data + more_data
+
+            cookie_re = ("Cookie\:%s\@([\x21-\xFF]+).*?" % username +
+                         "(%s\@[\x21-\xFF]+\.txt)" % username)
+            m = re.search(cookie_re, data, re.I)
+            if m:
+                cookie_file = os.path.join(cookie_dir, m.group(2))
+                if not self.delayload:
+                    try:
+                        self.load_cookie_data(cookie_file,
+                                              ignore_discard, ignore_expires)
+                    except (LoadError, IOError):
+                        debug("error reading cookie file, skipping: %s",
+                              cookie_file)
+                else:
+                    domain = m.group(1)
+                    i = domain.find("/")
+                    if i != -1:
+                        domain = domain[:i]
+
+                    self._delayload_domains[domain] = (
+                        cookie_file, ignore_discard, ignore_expires)
+
+
+class MSIECookieJar(MSIEBase, FileCookieJar):
+    """FileCookieJar that reads from the Windows MSIE cookies database.
+
+    MSIECookieJar can read the cookie files of Microsoft Internet Explorer
+    (MSIE) for Windows version 5 on Windows NT and version 6 on Windows XP and
+    Windows 98.  Other configurations may also work, but are untested.  Saving
+    cookies in MSIE format is NOT supported.  If you save cookies, they'll be
+    in the usual Set-Cookie3 format, which you can read back in using an
+    instance of the plain old CookieJar class.  Don't save using the same
+    filename that you loaded cookies from, because you may succeed in
+    clobbering your MSIE cookies index file!
+
+    You should be able to have LWP share Internet Explorer's cookies like
+    this (note you need to supply a username to load_from_registry if you're on
+    Windows 9x or Windows ME):
+
+    cj = MSIECookieJar(delayload=1)
+    # find cookies index file in registry and load cookies from it
+    cj.load_from_registry()
+    opener = mechanize.build_opener(mechanize.HTTPCookieProcessor(cj))
+    response = opener.open("http://example.com/")
+
+    Iterating over a delayloaded MSIECookieJar instance will not cause any
+    cookies to be read from disk.  To force reading of all cookies from disk,
+    call read_all_cookies.  Note that the following methods iterate over self:
+    clear_temporary_cookies, clear_expired_cookies, __len__, __repr__, __str__
+    and as_string.
+
+    Additional methods:
+
+    load_from_registry(ignore_discard=False, ignore_expires=False,
+                       username=None)
+    load_cookie_data(filename, ignore_discard=False, ignore_expires=False)
+    read_all_cookies()
+
+    """
+    def __init__(self, filename=None, delayload=False, policy=None):
+        MSIEBase.__init__(self)
+        FileCookieJar.__init__(self, filename, delayload, policy)
+
+    def set_cookie(self, cookie):
+        if self.delayload:
+            self._delayload_domain(cookie.domain)
+        CookieJar.set_cookie(self, cookie)
+
+    def _cookies_for_request(self, request):
+        """Return a list of cookies to be returned to server."""
+        domains = self._cookies.copy()
+        domains.update(self._delayload_domains)
+        domains = domains.keys()
+
+        cookies = []
+        for domain in domains:
+            cookies.extend(self._cookies_for_domain(domain, request))
+        return cookies
+
+    def _cookies_for_domain(self, domain, request):
+        if not self._policy.domain_return_ok(domain, request):
+            return []
+        debug("Checking %s for cookies to return", domain)
+        if self.delayload:
+            self._delayload_domain(domain)
+        return CookieJar._cookies_for_domain(self, domain, request)
+
+    def read_all_cookies(self):
+        """Eagerly read in all cookies."""
+        if self.delayload:
+            for domain in self._delayload_domains.keys():
+                self._delayload_domain(domain)
+
+    def load(self, filename, ignore_discard=False, ignore_expires=False,
+             username=None):
+        """Load cookies from an MSIE 'index.dat' cookies index file.
+
+        filename: full path to cookie index file
+        username: only required on win9x
+
+        """
+        if filename is None:
+            if self.filename is not None: filename = self.filename
+            else: raise ValueError(MISSING_FILENAME_TEXT)
+
+        index = open(filename, "rb")
+
+        try:
+            self._really_load(index, filename, ignore_discard, ignore_expires,
+                              username)
+        finally:
+            index.close()
Index: /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_debug.py
===================================================================
--- /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_debug.py (revision 3)
+++ /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_debug.py (revision 3)
@@ -0,0 +1,28 @@
+import logging
+
+from urllib2 import BaseHandler
+from _response import response_seek_wrapper
+
+
+class HTTPResponseDebugProcessor(BaseHandler):
+    handler_order = 900  # before redirections, after everything else
+
+    def http_response(self, request, response):
+        if not hasattr(response, "seek"):
+            response = response_seek_wrapper(response)
+        info = logging.getLogger("mechanize.http_responses").info
+        try:
+            info(response.read())
+        finally:
+            response.seek(0)
+        info("*****************************************************")
+        return response
+
+    https_response = http_response
+
+class HTTPRedirectDebugProcessor(BaseHandler):
+    def http_request(self, request):
+        if hasattr(request, "redirect_dict"):
+            info = logging.getLogger("mechanize.http_redirects").info
+            info("redirecting to %s", request.get_full_url())
+        return request
Index: /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_beautifulsoup.py
===================================================================
--- /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_beautifulsoup.py (revision 3)
+++ /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_beautifulsoup.py (revision 3)
@@ -0,0 +1,1080 @@
+"""Beautiful Soup
+Elixir and Tonic
+"The Screen-Scraper's Friend"
+v2.1.1
+http://www.crummy.com/software/BeautifulSoup/
+
+Beautiful Soup parses arbitrarily invalid XML- or HTML-like substance
+into a tree representation. It provides methods and Pythonic idioms
+that make it easy to search and modify the tree.
+
+A well-formed XML/HTML document will yield a well-formed data
+structure. An ill-formed XML/HTML document will yield a
+correspondingly ill-formed data structure. If your document is only
+locally well-formed, you can use this library to find and process the
+well-formed part of it. The BeautifulSoup class has heuristics for
+obtaining a sensible parse tree in the face of common HTML errors.
+
+Beautiful Soup has no external dependencies. It works with Python 2.2
+and up.
+
+Beautiful Soup defines classes for four different parsing strategies:
+
+ * BeautifulStoneSoup, for parsing XML, SGML, or your domain-specific
+   language that kind of looks like XML.
+
+ * BeautifulSoup, for parsing run-of-the-mill HTML code, be it valid
+   or invalid.
+
+ * ICantBelieveItsBeautifulSoup, for parsing valid but bizarre HTML
+   that trips up BeautifulSoup.
+
+ * BeautifulSOAP, for making it easier to parse XML documents that use
+   lots of subelements containing a single string, where you'd prefer
+   they put that string into an attribute (such as SOAP messages).
+
+You can subclass BeautifulStoneSoup or BeautifulSoup to create a
+parsing strategy specific to an XML schema or a particular bizarre
+HTML document. Typically your subclass would just override
+SELF_CLOSING_TAGS and/or NESTABLE_TAGS.
+""" #"
+from __future__ import generators
+
+__author__ = "Leonard Richardson (leonardr@segfault.org)"
+__version__ = "2.1.1"
+__date__ = "$Date: 2004/10/18 00:14:20 $"
+__copyright__ = "Copyright (c) 2004-2005 Leonard Richardson"
+__license__ = "PSF"
+
+from sgmllib import SGMLParser, SGMLParseError
+import types
+import re
+import sgmllib
+
+#This code makes Beautiful Soup able to parse XML with namespaces
+sgmllib.tagfind = re.compile('[a-zA-Z][-_.:a-zA-Z0-9]*')
+
+class NullType(object):
+
+    """Similar to NoneType with a corresponding singleton instance
+    'Null' that, unlike None, accepts any message and returns itself.
+
+    Examples:
+    >>> Null("send", "a", "message")("and one more",
+    ...      "and what you get still") is Null
+    True
+    """
+
+    def __new__(cls):                    return Null
+    def __call__(self, *args, **kwargs): return Null
+##    def __getstate__(self, *args):       return Null
+    def __getattr__(self, attr):         return Null
+    def __getitem__(self, item):         return Null
+    def __setattr__(self, attr, value):  pass
+    def __setitem__(self, item, value):  pass
+    def __len__(self):                   return 0
+    # FIXME: is this a python bug? otherwise ``for x in Null: pass``
+    #        never terminates...
+    def __iter__(self):                  return iter([])
+    def __contains__(self, item):        return False
+    def __repr__(self):                  return "Null"
+Null = object.__new__(NullType)
+
+class PageElement:
+    """Contains the navigational information for some part of the page
+    (either a tag or a piece of text)"""
+
+    def setup(self, parent=Null, previous=Null):
+        """Sets up the initial relations between this element and
+        other elements."""
+        self.parent = parent
+        self.previous = previous
+        self.next = Null
+        self.previousSibling = Null
+        self.nextSibling = Null
+        if self.parent and self.parent.contents:
+            self.previousSibling = self.parent.contents[-1]
+            self.previousSibling.nextSibling = self
+
+    def findNext(self, name=None, attrs={}, text=None):
+        """Returns the first item that matches the given criteria and
+        appears after this Tag in the document."""
+        return self._first(self.fetchNext, name, attrs, text)
+    firstNext = findNext
+
+    def fetchNext(self, name=None, attrs={}, text=None, limit=None):
+        """Returns all items that match the given criteria and appear
+        before after Tag in the document."""
+        return self._fetch(name, attrs, text, limit, self.nextGenerator)
+
+    def findNextSibling(self, name=None, attrs={}, text=None):
+        """Returns the closest sibling to this Tag that matches the
+        given criteria and appears after this Tag in the document."""
+        return self._first(self.fetchNextSiblings, name, attrs, text)
+    firstNextSibling = findNextSibling
+
+    def fetchNextSiblings(self, name=None, attrs={}, text=None, limit=None):
+        """Returns the siblings of this Tag that match the given
+        criteria and appear after this Tag in the document."""
+        return self._fetch(name, attrs, text, limit, self.nextSiblingGenerator)
+
+    def findPrevious(self, name=None, attrs={}, text=None):
+        """Returns the first item that matches the given criteria and
+        appears before this Tag in the document."""
+        return self._first(self.fetchPrevious, name, attrs, text)
+
+    def fetchPrevious(self, name=None, attrs={}, text=None, limit=None):
+        """Returns all items that match the given criteria and appear
+        before this Tag in the document."""
+        return self._fetch(name, attrs, text, limit, self.previousGenerator)
+    firstPrevious = findPrevious
+
+    def findPreviousSibling(self, name=None, attrs={}, text=None):
+        """Returns the closest sibling to this Tag that matches the
+        given criteria and appears before this Tag in the document."""
+        return self._first(self.fetchPreviousSiblings, name, attrs, text)
+    firstPreviousSibling = findPreviousSibling
+
+    def fetchPreviousSiblings(self, name=None, attrs={}, text=None,
+                              limit=None):
+        """Returns the siblings of this Tag that match the given
+        criteria and appear before this Tag in the document."""
+        return self._fetch(name, attrs, text, limit,
+                           self.previousSiblingGenerator)
+
+    def findParent(self, name=None, attrs={}):
+        """Returns the closest parent of this Tag that matches the given
+        criteria."""
+        r = Null
+        l = self.fetchParents(name, attrs, 1)
+        if l:
+            r = l[0]
+        return r
+    firstParent = findParent
+
+    def fetchParents(self, name=None, attrs={}, limit=None):
+        """Returns the parents of this Tag that match the given
+        criteria."""
+        return self._fetch(name, attrs, None, limit, self.parentGenerator)
+
+    #These methods do the real heavy lifting.
+
+    def _first(self, method, name, attrs, text):
+        r = Null
+        l = method(name, attrs, text, 1)
+        if l:
+            r = l[0]
+        return r
+    
+    def _fetch(self, name, attrs, text, limit, generator):
+        "Iterates over a generator looking for things that match."
+        if not hasattr(attrs, 'items'):
+            attrs = {'class' : attrs}
+
+        results = []
+        g = generator()
+        while True:
+            try:
+                i = g.next()
+            except StopIteration:
+                break
+            found = None
+            if isinstance(i, Tag):
+                if not text:
+                    if not name or self._matches(i, name):
+                        match = True
+                        for attr, matchAgainst in attrs.items():
+                            check = i.get(attr)
+                            if not self._matches(check, matchAgainst):
+                                match = False
+                                break
+                        if match:
+                            found = i
+            elif text:
+                if self._matches(i, text):
+                    found = i                    
+            if found:
+                results.append(found)
+                if limit and len(results) >= limit:
+                    break
+        return results
+
+    #Generators that can be used to navigate starting from both
+    #NavigableTexts and Tags.                
+    def nextGenerator(self):
+        i = self
+        while i:
+            i = i.next
+            yield i
+
+    def nextSiblingGenerator(self):
+        i = self
+        while i:
+            i = i.nextSibling
+            yield i
+
+    def previousGenerator(self):
+        i = self
+        while i:
+            i = i.previous
+            yield i
+
+    def previousSiblingGenerator(self):
+        i = self
+        while i:
+            i = i.previousSibling
+            yield i
+
+    def parentGenerator(self):
+        i = self
+        while i:
+            i = i.parent
+            yield i
+
+    def _matches(self, chunk, howToMatch):
+        #print 'looking for %s in %s' % (howToMatch, chunk)
+        #
+        # If given a list of items, return true if the list contains a
+        # text element that matches.
+        if isList(chunk) and not isinstance(chunk, Tag):
+            for tag in chunk:
+                if isinstance(tag, NavigableText) and self._matches(tag, howToMatch):
+                    return True
+            return False
+        if callable(howToMatch):
+            return howToMatch(chunk)
+        if isinstance(chunk, Tag):
+            #Custom match methods take the tag as an argument, but all other
+            #ways of matching match the tag name as a string
+            chunk = chunk.name
+        #Now we know that chunk is a string
+        if not isinstance(chunk, basestring):
+            chunk = str(chunk)
+        if hasattr(howToMatch, 'match'):
+            # It's a regexp object.
+            return howToMatch.search(chunk)
+        if isList(howToMatch):
+            return chunk in howToMatch
+        if hasattr(howToMatch, 'items'):
+            return howToMatch.has_key(chunk)
+        #It's just a string
+        return str(howToMatch) == chunk
+
+class NavigableText(PageElement):
+
+    def __getattr__(self, attr):
+        "For backwards compatibility, text.string gives you text"
+        if attr == 'string':
+            return self
+        else:
+            raise AttributeError, "'%s' object has no attribute '%s'" % (self.__class__.__name__, attr)
+        
+class NavigableString(str, NavigableText):
+    pass
+
+class NavigableUnicodeString(unicode, NavigableText):
+    pass
+
+class Tag(PageElement):
+
+    """Represents a found HTML tag with its attributes and contents."""
+
+    def __init__(self, name, attrs=None, parent=Null, previous=Null):
+        "Basic constructor."
+        self.name = name
+        if attrs == None:
+            attrs = []
+        self.attrs = attrs
+        self.contents = []
+        self.setup(parent, previous)
+        self.hidden = False
+
+    def get(self, key, default=None):
+        """Returns the value of the 'key' attribute for the tag, or
+        the value given for 'default' if it doesn't have that
+        attribute."""
+        return self._getAttrMap().get(key, default)    
+
+    def __getitem__(self, key):
+        """tag[key] returns the value of the 'key' attribute for the tag,
+        and throws an exception if it's not there."""
+        return self._getAttrMap()[key]
+
+    def __iter__(self):
+        "Iterating over a tag iterates over its contents."
+        return iter(self.contents)
+
+    def __len__(self):
+        "The length of a tag is the length of its list of contents."
+        return len(self.contents)
+
+    def __contains__(self, x):
+        return x in self.contents
+
+    def __nonzero__(self):
+        "A tag is non-None even if it has no contents."
+        return True
+
+    def __setitem__(self, key, value):        
+        """Setting tag[key] sets the value of the 'key' attribute for the
+        tag."""
+        self._getAttrMap()
+        self.attrMap[key] = value
+        found = False
+        for i in range(0, len(self.attrs)):
+            if self.attrs[i][0] == key:
+                self.attrs[i] = (key, value)
+                found = True
+        if not found:
+            self.attrs.append((key, value))
+        self._getAttrMap()[key] = value
+
+    def __delitem__(self, key):
+        "Deleting tag[key] deletes all 'key' attributes for the tag."
+        for item in self.attrs:
+            if item[0] == key:
+                self.attrs.remove(item)
+                #We don't break because bad HTML can define the same
+                #attribute multiple times.
+            self._getAttrMap()
+            if self.attrMap.has_key(key):
+                del self.attrMap[key]
+
+    def __call__(self, *args, **kwargs):
+        """Calling a tag like a function is the same as calling its
+        fetch() method. Eg. tag('a') returns a list of all the A tags
+        found within this tag."""
+        return apply(self.fetch, args, kwargs)
+
+    def __getattr__(self, tag):
+        if len(tag) > 3 and tag.rfind('Tag') == len(tag)-3:
+            return self.first(tag[:-3])
+        elif tag.find('__') != 0:
+            return self.first(tag)
+
+    def __eq__(self, other):
+        """Returns true iff this tag has the same name, the same attributes,
+        and the same contents (recursively) as the given tag.
+
+        NOTE: right now this will return false if two tags have the
+        same attributes in a different order. Should this be fixed?"""
+        if not hasattr(other, 'name') or not hasattr(other, 'attrs') or not hasattr(other, 'contents') or self.name != other.name or self.attrs != other.attrs or len(self) != len(other):
+            return False
+        for i in range(0, len(self.contents)):
+            if self.contents[i] != other.contents[i]:
+                return False
+        return True
+
+    def __ne__(self, other):
+        """Returns true iff this tag is not identical to the other tag,
+        as defined in __eq__."""
+        return not self == other
+
+    def __repr__(self):
+        """Renders this tag as a string."""
+        return str(self)
+
+    def __unicode__(self):
+        return self.__str__(1)
+
+    def __str__(self, needUnicode=None, showStructureIndent=None):
+        """Returns a string or Unicode representation of this tag and
+        its contents.
+
+        NOTE: since Python's HTML parser consumes whitespace, this
+        method is not certain to reproduce the whitespace present in
+        the original string."""
+        
+        attrs = []
+        if self.attrs:
+            for key, val in self.attrs:
+                attrs.append('%s="%s"' % (key, val))
+        close = ''
+        closeTag = ''
+        if self.isSelfClosing():
+            close = ' /'
+        else:
+            closeTag = '</%s>' % self.name
+        indentIncrement = None        
+        if showStructureIndent != None:
+            indentIncrement = showStructureIndent
+            if not self.hidden:
+                indentIncrement += 1
+        contents = self.renderContents(indentIncrement, needUnicode=needUnicode)        
+        if showStructureIndent:
+            space = '\n%s' % (' ' * showStructureIndent)
+        if self.hidden:
+            s = contents
+        else:
+            s = []
+            attributeString = ''
+            if attrs:
+                attributeString = ' ' + ' '.join(attrs)            
+            if showStructureIndent:
+                s.append(space)
+            s.append('<%s%s%s>' % (self.name, attributeString, close))
+            s.append(contents)
+            if closeTag and showStructureIndent != None:
+                s.append(space)
+            s.append(closeTag)
+            s = ''.join(s)
+        isUnicode = type(s) == types.UnicodeType
+        if needUnicode and not isUnicode:
+            s = unicode(s)
+        elif isUnicode and needUnicode==False:
+            s = str(s)
+        return s
+
+    def prettify(self, needUnicode=None):
+        return self.__str__(needUnicode, showStructureIndent=True)
+
+    def renderContents(self, showStructureIndent=None, needUnicode=None):
+        """Renders the contents of this tag as a (possibly Unicode) 
+        string."""
+        s=[]
+        for c in self:
+            text = None
+            if isinstance(c, NavigableUnicodeString) or type(c) == types.UnicodeType:
+                text = unicode(c)
+            elif isinstance(c, Tag):
+                s.append(c.__str__(needUnicode, showStructureIndent))
+            elif needUnicode:
+                text = unicode(c)
+            else:
+                text = str(c)
+            if text:
+                if showStructureIndent != None:
+                    if text[-1] == '\n':
+                        text = text[:-1]
+                s.append(text)
+        return ''.join(s)    
+
+    #Soup methods
+
+    def firstText(self, text, recursive=True):
+        """Convenience method to retrieve the first piece of text matching the
+        given criteria. 'text' can be a string, a regular expression object,
+        a callable that takes a string and returns whether or not the
+        string 'matches', etc."""
+        return self.first(recursive=recursive, text=text)
+
+    def fetchText(self, text, recursive=True, limit=None):
+        """Convenience method to retrieve all pieces of text matching the
+        given criteria. 'text' can be a string, a regular expression object,
+        a callable that takes a string and returns whether or not the
+        string 'matches', etc."""
+        return self.fetch(recursive=recursive, text=text, limit=limit)
+
+    def first(self, name=None, attrs={}, recursive=True, text=None):
+        """Return only the first child of this
+        Tag matching the given criteria."""
+        r = Null
+        l = self.fetch(name, attrs, recursive, text, 1)
+        if l:
+            r = l[0]
+        return r
+    findChild = first
+
+    def fetch(self, name=None, attrs={}, recursive=True, text=None,
+              limit=None):
+        """Extracts a list of Tag objects that match the given
+        criteria.  You can specify the name of the Tag and any
+        attributes you want the Tag to have.
+
+        The value of a key-value pair in the 'attrs' map can be a
+        string, a list of strings, a regular expression object, or a
+        callable that takes a string and returns whether or not the
+        string matches for some custom definition of 'matches'. The
+        same is true of the tag name."""
+        generator = self.recursiveChildGenerator
+        if not recursive:
+            generator = self.childGenerator
+        return self._fetch(name, attrs, text, limit, generator)
+    fetchChildren = fetch
+    
+    #Utility methods
+
+    def isSelfClosing(self):
+        """Returns true iff this is a self-closing tag as defined in the HTML
+        standard.
+
+        TODO: This is specific to BeautifulSoup and its subclasses, but it's
+        used by __str__"""
+        return self.name in BeautifulSoup.SELF_CLOSING_TAGS
+
+    def append(self, tag):
+        """Appends the given tag to the contents of this tag."""
+        self.contents.append(tag)
+
+    #Private methods
+
+    def _getAttrMap(self):
+        """Initializes a map representation of this tag's attributes,
+        if not already initialized."""
+        if not getattr(self, 'attrMap'):
+            self.attrMap = {}
+            for (key, value) in self.attrs:
+                self.attrMap[key] = value 
+        return self.attrMap
+
+    #Generator methods
+    def childGenerator(self):
+        for i in range(0, len(self.contents)):
+            yield self.contents[i]
+        raise StopIteration
+    
+    def recursiveChildGenerator(self):
+        stack = [(self, 0)]
+        while stack:
+            tag, start = stack.pop()
+            if isinstance(tag, Tag):            
+                for i in range(start, len(tag.contents)):
+                    a = tag.contents[i]
+                    yield a
+                    if isinstance(a, Tag) and tag.contents:
+                        if i < len(tag.contents) - 1:
+                            stack.append((tag, i+1))
+                        stack.append((a, 0))
+                        break
+        raise StopIteration
+
+
+def isList(l):
+    """Convenience method that works with all 2.x versions of Python
+    to determine whether or not something is listlike."""
+    return hasattr(l, '__iter__') \
+           or (type(l) in (types.ListType, types.TupleType))
+
+def buildTagMap(default, *args):
+    """Turns a list of maps, lists, or scalars into a single map.
+    Used to build the SELF_CLOSING_TAGS and NESTABLE_TAGS maps out
+    of lists and partial maps."""
+    built = {}
+    for portion in args:
+        if hasattr(portion, 'items'):
+            #It's a map. Merge it.
+            for k,v in portion.items():
+                built[k] = v
+        elif isList(portion):
+            #It's a list. Map each item to the default.
+            for k in portion:
+                built[k] = default
+        else:
+            #It's a scalar. Map it to the default.
+            built[portion] = default
+    return built
+
+class BeautifulStoneSoup(Tag, SGMLParser):
+
+    """This class contains the basic parser and fetch code. It defines
+    a parser that knows nothing about tag behavior except for the
+    following:
+   
+      You can't close a tag without closing all the tags it encloses.
+      That is, "<foo><bar></foo>" actually means
+      "<foo><bar></bar></foo>".
+
+    [Another possible explanation is "<foo><bar /></foo>", but since
+    this class defines no SELF_CLOSING_TAGS, it will never use that
+    explanation.]
+
+    This class is useful for parsing XML or made-up markup languages,
+    or when BeautifulSoup makes an assumption counter to what you were
+    expecting."""
+
+    SELF_CLOSING_TAGS = {}
+    NESTABLE_TAGS = {}
+    RESET_NESTING_TAGS = {}
+    QUOTE_TAGS = {}
+
+    #As a public service we will by default silently replace MS smart quotes
+    #and similar characters with their HTML or ASCII equivalents.
+    MS_CHARS = { '\x80' : '&euro;',
+                 '\x81' : ' ',
+                 '\x82' : '&sbquo;',
+                 '\x83' : '&fnof;',
+                 '\x84' : '&bdquo;',
+                 '\x85' : '&hellip;',
+                 '\x86' : '&dagger;',
+                 '\x87' : '&Dagger;',
+                 '\x88' : '&caret;',
+                 '\x89' : '%',
+                 '\x8A' : '&Scaron;',
+                 '\x8B' : '&lt;',
+                 '\x8C' : '&OElig;',
+                 '\x8D' : '?',
+                 '\x8E' : 'Z',
+                 '\x8F' : '?',
+                 '\x90' : '?',
+                 '\x91' : '&lsquo;',
+                 '\x92' : '&rsquo;',
+                 '\x93' : '&ldquo;',
+                 '\x94' : '&rdquo;',
+                 '\x95' : '&bull;',
+                 '\x96' : '&ndash;',
+                 '\x97' : '&mdash;',
+                 '\x98' : '&tilde;',
+                 '\x99' : '&trade;',
+                 '\x9a' : '&scaron;',
+                 '\x9b' : '&gt;',
+                 '\x9c' : '&oelig;',
+                 '\x9d' : '?',
+                 '\x9e' : 'z',
+                 '\x9f' : '&Yuml;',}
+
+    PARSER_MASSAGE = [(re.compile('(<[^<>]*)/>'),
+                       lambda(x):x.group(1) + ' />'),
+                      (re.compile('<!\s+([^<>]*)>'),
+                       lambda(x):'<!' + x.group(1) + '>'),
+                      (re.compile("([\x80-\x9f])"),
+                       lambda(x): BeautifulStoneSoup.MS_CHARS.get(x.group(1)))
+                      ]
+
+    ROOT_TAG_NAME = '[document]'
+
+    def __init__(self, text=None, avoidParserProblems=True,
+                 initialTextIsEverything=True):
+        """Initialize this as the 'root tag' and feed in any text to
+        the parser.
+
+        NOTE about avoidParserProblems: sgmllib will process most bad
+        HTML, and BeautifulSoup has tricks for dealing with some HTML
+        that kills sgmllib, but Beautiful Soup can nonetheless choke
+        or lose data if your data uses self-closing tags or
+        declarations incorrectly. By default, Beautiful Soup sanitizes
+        its input to avoid the vast majority of these problems. The
+        problems are relatively rare, even in bad HTML, so feel free
+        to pass in False to avoidParserProblems if they don't apply to
+        you, and you'll get better performance. The only reason I have
+        this turned on by default is so I don't get so many tech
+        support questions.
+
+        The two most common instances of invalid HTML that will choke
+        sgmllib are fixed by the default parser massage techniques:
+
+         <br/> (No space between name of closing tag and tag close)
+         <! --Comment--> (Extraneous whitespace in declaration)
+
+        You can pass in a custom list of (RE object, replace method)
+        tuples to get Beautiful Soup to scrub your input the way you
+        want."""
+        Tag.__init__(self, self.ROOT_TAG_NAME)
+        if avoidParserProblems \
+           and not isList(avoidParserProblems):
+            avoidParserProblems = self.PARSER_MASSAGE            
+        self.avoidParserProblems = avoidParserProblems
+        SGMLParser.__init__(self)
+        self.quoteStack = []
+        self.hidden = 1
+        self.reset()
+        if hasattr(text, 'read'):
+            #It's a file-type object.
+            text = text.read()
+        if text:
+            self.feed(text)
+        if initialTextIsEverything:
+            self.done()
+
+    def __getattr__(self, methodName):
+        """This method routes method call requests to either the SGMLParser
+        superclass or the Tag superclass, depending on the method name."""
+        if methodName.find('start_') == 0 or methodName.find('end_') == 0 \
+               or methodName.find('do_') == 0:
+            return SGMLParser.__getattr__(self, methodName)
+        elif methodName.find('__') != 0:
+            return Tag.__getattr__(self, methodName)
+        else:
+            raise AttributeError
+
+    def feed(self, text):
+        if self.avoidParserProblems:
+            for fix, m in self.avoidParserProblems:
+                text = fix.sub(m, text)
+        SGMLParser.feed(self, text)
+
+    def done(self):
+        """Called when you're done parsing, so that the unclosed tags can be
+        correctly processed."""
+        self.endData() #NEW
+        while self.currentTag.name != self.ROOT_TAG_NAME:
+            self.popTag()
+            
+    def reset(self):
+        SGMLParser.reset(self)
+        self.currentData = []
+        self.currentTag = None
+        self.tagStack = []
+        self.pushTag(self)        
+    
+    def popTag(self):
+        tag = self.tagStack.pop()
+        # Tags with just one string-owning child get the child as a
+        # 'string' property, so that soup.tag.string is shorthand for
+        # soup.tag.contents[0]
+        if len(self.currentTag.contents) == 1 and \
+           isinstance(self.currentTag.contents[0], NavigableText):
+            self.currentTag.string = self.currentTag.contents[0]
+
+        #print "Pop", tag.name
+        if self.tagStack:
+            self.currentTag = self.tagStack[-1]
+        return self.currentTag
+
+    def pushTag(self, tag):
+        #print "Push", tag.name
+        if self.currentTag:
+            self.currentTag.append(tag)
+        self.tagStack.append(tag)
+        self.currentTag = self.tagStack[-1]
+
+    def endData(self):
+        currentData = ''.join(self.currentData)
+        if currentData:
+            if not currentData.strip():
+                if '\n' in currentData:
+                    currentData = '\n'
+                else:
+                    currentData = ' '
+            c = NavigableString
+            if type(currentData) == types.UnicodeType:
+                c = NavigableUnicodeString
+            o = c(currentData)
+            o.setup(self.currentTag, self.previous)
+            if self.previous:
+                self.previous.next = o
+            self.previous = o
+            self.currentTag.contents.append(o)
+        self.currentData = []
+
+    def _popToTag(self, name, inclusivePop=True):
+        """Pops the tag stack up to and including the most recent
+        instance of the given tag. If inclusivePop is false, pops the tag
+        stack up to but *not* including the most recent instqance of
+        the given tag."""
+        if name == self.ROOT_TAG_NAME:
+            return            
+
+        numPops = 0
+        mostRecentTag = None
+        for i in range(len(self.tagStack)-1, 0, -1):
+            if name == self.tagStack[i].name:
+                numPops = len(self.tagStack)-i
+                break
+        if not inclusivePop:
+            numPops = numPops - 1
+
+        for i in range(0, numPops):
+            mostRecentTag = self.popTag()
+        return mostRecentTag    
+
+    def _smartPop(self, name):
+
+        """We need to pop up to the previous tag of this type, unless
+        one of this tag's nesting reset triggers comes between this
+        tag and the previous tag of this type, OR unless this tag is a
+        generic nesting trigger and another generic nesting trigger
+        comes between this tag and the previous tag of this type.
+
+        Examples:
+         <p>Foo<b>Bar<p> should pop to 'p', not 'b'.
+         <p>Foo<table>Bar<p> should pop to 'table', not 'p'.
+         <p>Foo<table><tr>Bar<p> should pop to 'tr', not 'p'.
+         <p>Foo<b>Bar<p> should pop to 'p', not 'b'.
+
+         <li><ul><li> *<li>* should pop to 'ul', not the first 'li'.
+         <tr><table><tr> *<tr>* should pop to 'table', not the first 'tr'
+         <td><tr><td> *<td>* should pop to 'tr', not the first 'td'
+        """
+
+        nestingResetTriggers = self.NESTABLE_TAGS.get(name)
+        isNestable = nestingResetTriggers != None
+        isResetNesting = self.RESET_NESTING_TAGS.has_key(name)
+        popTo = None
+        inclusive = True
+        for i in range(len(self.tagStack)-1, 0, -1):
+            p = self.tagStack[i]
+            if (not p or p.name == name) and not isNestable:
+                #Non-nestable tags get popped to the top or to their
+                #last occurance.
+                popTo = name
+                break
+            if (nestingResetTriggers != None
+                and p.name in nestingResetTriggers) \
+                or (nestingResetTriggers == None and isResetNesting
+                    and self.RESET_NESTING_TAGS.has_key(p.name)):
+                
+                #If we encounter one of the nesting reset triggers
+                #peculiar to this tag, or we encounter another tag
+                #that causes nesting to reset, pop up to but not
+                #including that tag.
+
+                popTo = p.name
+                inclusive = False
+                break
+            p = p.parent
+        if popTo:
+            self._popToTag(popTo, inclusive)
+
+    def unknown_starttag(self, name, attrs, selfClosing=0):
+        #print "Start tag %s" % name
+        if self.quoteStack:
+            #This is not a real tag.
+            #print "<%s> is not real!" % name
+            attrs = ''.join(map(lambda(x, y): ' %s="%s"' % (x, y), attrs))
+            self.handle_data('<%s%s>' % (name, attrs))
+            return
+        self.endData()
+        if not name in self.SELF_CLOSING_TAGS and not selfClosing:
+            self._smartPop(name)
+        tag = Tag(name, attrs, self.currentTag, self.previous)        
+        if self.previous:
+            self.previous.next = tag
+        self.previous = tag
+        self.pushTag(tag)
+        if selfClosing or name in self.SELF_CLOSING_TAGS:
+            self.popTag()                
+        if name in self.QUOTE_TAGS:
+            #print "Beginning quote (%s)" % name
+            self.quoteStack.append(name)
+            self.literal = 1
+
+    def unknown_endtag(self, name):
+        if self.quoteStack and self.quoteStack[-1] != name:
+            #This is not a real end tag.
+            #print "</%s> is not real!" % name
+            self.handle_data('</%s>' % name)
+            return
+        self.endData()
+        self._popToTag(name)
+        if self.quoteStack and self.quoteStack[-1] == name:
+            self.quoteStack.pop()
+            self.literal = (len(self.quoteStack) > 0)
+
+    def handle_data(self, data):
+        self.currentData.append(data)
+
+    def handle_pi(self, text):
+        "Propagate processing instructions right through."
+        self.handle_data("<?%s>" % text)
+
+    def handle_comment(self, text):
+        "Propagate comments right through."
+        self.handle_data("<!--%s-->" % text)
+
+    def handle_charref(self, ref):
+        "Propagate char refs right through."
+        self.handle_data('&#%s;' % ref)
+
+    def handle_entityref(self, ref):
+        "Propagate entity refs right through."
+        self.handle_data('&%s;' % ref)
+        
+    def handle_decl(self, data):
+        "Propagate DOCTYPEs and the like right through."
+        self.handle_data('<!%s>' % data)
+
+    def parse_declaration(self, i):
+        """Treat a bogus SGML declaration as raw data. Treat a CDATA
+        declaration as regular data."""
+        j = None
+        if self.rawdata[i:i+9] == '<![CDATA[':
+             k = self.rawdata.find(']]>', i)
+             if k == -1:
+                 k = len(self.rawdata)
+             self.handle_data(self.rawdata[i+9:k])
+             j = k+3
+        else:
+            try:
+                j = SGMLParser.parse_declaration(self, i)
+            except SGMLParseError:
+                toHandle = self.rawdata[i:]
+                self.handle_data(toHandle)
+                j = i + len(toHandle)
+        return j
+
+class BeautifulSoup(BeautifulStoneSoup):
+
+    """This parser knows the following facts about HTML:
+
+    * Some tags have no closing tag and should be interpreted as being
+      closed as soon as they are encountered.
+
+    * The text inside some tags (ie. 'script') may contain tags which
+      are not really part of the document and which should be parsed
+      as text, not tags. If you want to parse the text as tags, you can
+      always fetch it and parse it explicitly.
+
+    * Tag nesting rules:
+
+      Most tags can't be nested at all. For instance, the occurance of
+      a <p> tag should implicitly close the previous <p> tag.
+
+       <p>Para1<p>Para2
+        should be transformed into:
+       <p>Para1</p><p>Para2
+
+      Some tags can be nested arbitrarily. For instance, the occurance
+      of a <blockquote> tag should _not_ implicitly close the previous
+      <blockquote> tag.
+
+       Alice said: <blockquote>Bob said: <blockquote>Blah
+        should NOT be transformed into:
+       Alice said: <blockquote>Bob said: </blockquote><blockquote>Blah
+
+      Some tags can be nested, but the nesting is reset by the
+      interposition of other tags. For instance, a <tr> tag should
+      implicitly close the previous <tr> tag within the same <table>,
+      but not close a <tr> tag in another table.
+
+       <table><tr>Blah<tr>Blah
+        should be transformed into:
+       <table><tr>Blah</tr><tr>Blah
+        but,
+       <tr>Blah<table><tr>Blah
+        should NOT be transformed into
+       <tr>Blah<table></tr><tr>Blah
+
+    Differing assumptions about tag nesting rules are a major source
+    of problems with the BeautifulSoup class. If BeautifulSoup is not
+    treating as nestable a tag your page author treats as nestable,
+    try ICantBelieveItsBeautifulSoup before writing your own
+    subclass."""
+
+    SELF_CLOSING_TAGS = buildTagMap(None, ['br' , 'hr', 'input', 'img', 'meta',
+                                           'spacer', 'link', 'frame', 'base'])
+
+    QUOTE_TAGS = {'script': None}
+    
+    #According to the HTML standard, each of these inline tags can
+    #contain another tag of the same type. Furthermore, it's common
+    #to actually use these tags this way.
+    NESTABLE_INLINE_TAGS = ['span', 'font', 'q', 'object', 'bdo', 'sub', 'sup',
+                            'center']
+
+    #According to the HTML standard, these block tags can contain
+    #another tag of the same type. Furthermore, it's common
+    #to actually use these tags this way.
+    NESTABLE_BLOCK_TAGS = ['blockquote', 'div', 'fieldset', 'ins', 'del']
+
+    #Lists can contain other lists, but there are restrictions.    
+    NESTABLE_LIST_TAGS = { 'ol' : [],
+                           'ul' : [],
+                           'li' : ['ul', 'ol'],
+                           'dl' : [],
+                           'dd' : ['dl'],
+                           'dt' : ['dl'] }
+
+    #Tables can contain other tables, but there are restrictions.    
+    NESTABLE_TABLE_TAGS = {'table' : [], 
+                           'tr' : ['table', 'tbody', 'tfoot', 'thead'],
+                           'td' : ['tr'],
+                           'th' : ['tr'],
+                           }
+
+    NON_NESTABLE_BLOCK_TAGS = ['address', 'form', 'p', 'pre']
+
+    #If one of these tags is encountered, all tags up to the next tag of
+    #this type are popped.
+    RESET_NESTING_TAGS = buildTagMap(None, NESTABLE_BLOCK_TAGS, 'noscript',
+                                     NON_NESTABLE_BLOCK_TAGS,
+                                     NESTABLE_LIST_TAGS,
+                                     NESTABLE_TABLE_TAGS)
+
+    NESTABLE_TAGS = buildTagMap([], NESTABLE_INLINE_TAGS, NESTABLE_BLOCK_TAGS,
+                                NESTABLE_LIST_TAGS, NESTABLE_TABLE_TAGS)
+    
+class ICantBelieveItsBeautifulSoup(BeautifulSoup):
+
+    """The BeautifulSoup class is oriented towards skipping over
+    common HTML errors like unclosed tags. However, sometimes it makes
+    errors of its own. For instance, consider this fragment:
+
+     <b>Foo<b>Bar</b></b>
+
+    This is perfectly valid (if bizarre) HTML. However, the
+    BeautifulSoup class will implicitly close the first b tag when it
+    encounters the second 'b'. It will think the author wrote
+    "<b>Foo<b>Bar", and didn't close the first 'b' tag, because
+    there's no real-world reason to bold something that's already
+    bold. When it encounters '</b></b>' it will close two more 'b'
+    tags, for a grand total of three tags closed instead of two. This
+    can throw off the rest of your document structure. The same is
+    true of a number of other tags, listed below.
+
+    It's much more common for someone to forget to close (eg.) a 'b'
+    tag than to actually use nested 'b' tags, and the BeautifulSoup
+    class handles the common case. This class handles the
+    not-co-common case: where you can't believe someone wrote what
+    they did, but it's valid HTML and BeautifulSoup screwed up by
+    assuming it wouldn't be.
+
+    If this doesn't do what you need, try subclassing this class or
+    BeautifulSoup, and providing your own list of NESTABLE_TAGS."""
+
+    I_CANT_BELIEVE_THEYRE_NESTABLE_INLINE_TAGS = \
+     ['em', 'big', 'i', 'small', 'tt', 'abbr', 'acronym', 'strong',
+      'cite', 'code', 'dfn', 'kbd', 'samp', 'strong', 'var', 'b',
+      'big']
+
+    I_CANT_BELIEVE_THEYRE_NESTABLE_BLOCK_TAGS = ['noscript']
+
+    NESTABLE_TAGS = buildTagMap([], BeautifulSoup.NESTABLE_TAGS,
+                                I_CANT_BELIEVE_THEYRE_NESTABLE_BLOCK_TAGS,
+                                I_CANT_BELIEVE_THEYRE_NESTABLE_INLINE_TAGS)
+
+class BeautifulSOAP(BeautifulStoneSoup):
+    """This class will push a tag with only a single string child into
+    the tag's parent as an attribute. The attribute's name is the tag
+    name, and the value is the string child. An example should give
+    the flavor of the change:
+
+    <foo><bar>baz</bar></foo>
+     =>
+    <foo bar="baz"><bar>baz</bar></foo>
+
+    You can then access fooTag['bar'] instead of fooTag.barTag.string.
+
+    This is, of course, useful for scraping structures that tend to
+    use subelements instead of attributes, such as SOAP messages. Note
+    that it modifies its input, so don't print the modified version
+    out.
+
+    I'm not sure how many people really want to use this class; let me
+    know if you do. Mainly I like the name."""
+
+    def popTag(self):
+        if len(self.tagStack) > 1:
+            tag = self.tagStack[-1]
+            parent = self.tagStack[-2]
+            parent._getAttrMap()
+            if (isinstance(tag, Tag) and len(tag.contents) == 1 and
+                isinstance(tag.contents[0], NavigableText) and 
+                not parent.attrMap.has_key(tag.name)):
+                parent[tag.name] = tag.contents[0]
+        BeautifulStoneSoup.popTag(self)
+
+#Enterprise class names! It has come to our attention that some people
+#think the names of the Beautiful Soup parser classes are too silly
+#and "unprofessional" for use in enterprise screen-scraping. We feel
+#your pain! For such-minded folk, the Beautiful Soup Consortium And
+#All-Night Kosher Bakery recommends renaming this file to
+#"RobustParser.py" (or, in cases of extreme enterprisitude,
+#"RobustParserBeanInterface.class") and using the following
+#enterprise-friendly class aliases:
+class RobustXMLParser(BeautifulStoneSoup):
+    pass
+class RobustHTMLParser(BeautifulSoup):
+    pass
+class RobustWackAssHTMLParser(ICantBelieveItsBeautifulSoup):
+    pass
+class SimplifyingSOAPParser(BeautifulSOAP):
+    pass
+
+###
+
+
+#By default, act as an HTML pretty-printer.
+if __name__ == '__main__':
+    import sys
+    soup = BeautifulStoneSoup(sys.stdin.read())
+    print soup.prettify()
Index: /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_seek.py
===================================================================
--- /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_seek.py (revision 3)
+++ /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_seek.py (revision 3)
@@ -0,0 +1,16 @@
+from urllib2 import BaseHandler
+from _util import deprecation
+from _response import response_seek_wrapper
+
+
+class SeekableProcessor(BaseHandler):
+    """Deprecated: Make responses seekable."""
+
+    def __init__(self):
+        deprecation(
+            "See http://wwwsearch.sourceforge.net/mechanize/doc.html#seekable")
+
+    def any_response(self, request, response):
+        if not hasattr(response, "seek"):
+            return response_seek_wrapper(response)
+        return response
Index: /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_upgrade.py
===================================================================
--- /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_upgrade.py (revision 3)
+++ /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_upgrade.py (revision 3)
@@ -0,0 +1,40 @@
+from urllib2 import BaseHandler
+
+from _request import Request
+from _response import upgrade_response
+from _util import deprecation
+
+
+class HTTPRequestUpgradeProcessor(BaseHandler):
+    # upgrade urllib2.Request to this module's Request
+    # yuck!
+    handler_order = 0  # before anything else
+
+    def http_request(self, request):
+        if not hasattr(request, "add_unredirected_header"):
+            newrequest = Request(request._Request__original, request.data,
+                                 request.headers)
+            try: newrequest.origin_req_host = request.origin_req_host
+            except AttributeError: pass
+            try: newrequest.unverifiable = request.unverifiable
+            except AttributeError: pass
+            try: newrequest.visit = request.visit
+            except AttributeError: pass
+            request = newrequest
+        return request
+
+    https_request = http_request
+
+
+class ResponseUpgradeProcessor(BaseHandler):
+    # upgrade responses to be .close()able without becoming unusable
+    handler_order = 0  # before anything else
+
+    def __init__(self):
+        deprecation(
+            "See http://wwwsearch.sourceforge.net/mechanize/doc.html#seekable")
+
+    def any_response(self, request, response):
+        if not hasattr(response, 'closeable_response'):
+            response = upgrade_response(response)
+        return response
Index: /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_opener.py
===================================================================
--- /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_opener.py (revision 3)
+++ /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_opener.py (revision 3)
@@ -0,0 +1,421 @@
+"""Integration with Python standard library module urllib2: OpenerDirector
+class.
+
+Copyright 2004-2006 John J Lee <jjl@pobox.com>
+
+This code is free software; you can redistribute it and/or modify it
+under the terms of the BSD or ZPL 2.1 licenses (see the file
+COPYING.txt included with the distribution).
+
+"""
+
+import os, urllib2, bisect, urllib, httplib, types, tempfile
+try:
+    import threading as _threading
+except ImportError:
+    import dummy_threading as _threading
+try:
+    set
+except NameError:
+    import sets
+    set = sets.Set
+
+import _http
+import _upgrade
+import _rfc3986
+import _response
+from _util import isstringlike
+from _request import Request
+
+
+class ContentTooShortError(urllib2.URLError):
+    def __init__(self, reason, result):
+        urllib2.URLError.__init__(self, reason)
+        self.result = result
+
+
+class OpenerDirector(urllib2.OpenerDirector):
+    def __init__(self):
+        urllib2.OpenerDirector.__init__(self)
+        # really none of these are (sanely) public -- the lack of initial
+        # underscore on some is just due to following urllib2
+        self.process_response = {}
+        self.process_request = {}
+        self._any_request = {}
+        self._any_response = {}
+        self._handler_index_valid = True
+        self._tempfiles = []
+
+    def add_handler(self, handler):
+        if handler in self.handlers:
+            return
+        # XXX why does self.handlers need to be sorted?
+        bisect.insort(self.handlers, handler)
+        handler.add_parent(self)
+        self._handler_index_valid = False
+
+    def _maybe_reindex_handlers(self):
+        if self._handler_index_valid:
+            return
+
+        handle_error = {}
+        handle_open = {}
+        process_request = {}
+        process_response = {}
+        any_request = set()
+        any_response = set()
+        unwanted = []
+
+        for handler in self.handlers:
+            added = False
+            for meth in dir(handler):
+                if meth in ["redirect_request", "do_open", "proxy_open"]:
+                    # oops, coincidental match
+                    continue
+
+                if meth == "any_request":
+                    any_request.add(handler)
+                    added = True
+                    continue
+                elif meth == "any_response":
+                    any_response.add(handler)
+                    added = True
+                    continue
+
+                ii = meth.find("_")
+                scheme = meth[:ii]
+                condition = meth[ii+1:]
+
+                if condition.startswith("error"):
+                    jj = meth[ii+1:].find("_") + ii + 1
+                    kind = meth[jj+1:]
+                    try:
+                        kind = int(kind)
+                    except ValueError:
+                        pass
+                    lookup = handle_error.setdefault(scheme, {})
+                elif condition == "open":
+                    kind = scheme
+                    lookup = handle_open
+                elif condition == "request":
+                    kind = scheme
+                    lookup = process_request
+                elif condition == "response":
+                    kind = scheme
+                    lookup = process_response
+                else:
+                    continue
+
+                lookup.setdefault(kind, set()).add(handler)
+                added = True
+
+            if not added:
+                unwanted.append(handler)
+
+        for handler in unwanted:
+            self.handlers.remove(handler)
+
+        # sort indexed methods
+        # XXX could be cleaned up
+        for lookup in [process_request, process_response]:
+            for scheme, handlers in lookup.iteritems():
+                lookup[scheme] = handlers
+        for scheme, lookup in handle_error.iteritems():
+            for code, handlers in lookup.iteritems():
+                handlers = list(handlers)
+                handlers.sort()
+                lookup[code] = handlers
+        for scheme, handlers in handle_open.iteritems():
+            handlers = list(handlers)
+            handlers.sort()
+            handle_open[scheme] = handlers
+
+        # cache the indexes
+        self.handle_error = handle_error
+        self.handle_open = handle_open
+        self.process_request = process_request
+        self.process_response = process_response
+        self._any_request = any_request
+        self._any_response = any_response
+
+    def _request(self, url_or_req, data, visit):
+        if isstringlike(url_or_req):
+            req = Request(url_or_req, data, visit=visit)
+        else:
+            # already a urllib2.Request or mechanize.Request instance
+            req = url_or_req
+            if data is not None:
+                req.add_data(data)
+            # XXX yuck, give request a .visit attribute if it doesn't have one
+            try:
+                req.visit
+            except AttributeError:
+                req.visit = None
+            if visit is not None:
+                req.visit = visit
+        return req
+
+    def open(self, fullurl, data=None):
+        req = self._request(fullurl, data, None)
+        req_scheme = req.get_type()
+
+        self._maybe_reindex_handlers()
+
+        # pre-process request
+        # XXX should we allow a Processor to change the URL scheme
+        #   of the request?
+        request_processors = set(self.process_request.get(req_scheme, []))
+        request_processors.update(self._any_request)
+        request_processors = list(request_processors)
+        request_processors.sort()
+        for processor in request_processors:
+            for meth_name in ["any_request", req_scheme+"_request"]:
+                meth = getattr(processor, meth_name, None)
+                if meth:
+                    req = meth(req)
+
+        # In Python >= 2.4, .open() supports processors already, so we must
+        # call ._open() instead.
+        urlopen = getattr(urllib2.OpenerDirector, "_open",
+                          urllib2.OpenerDirector.open)
+        response = urlopen(self, req, data)
+
+        # post-process response
+        response_processors = set(self.process_response.get(req_scheme, []))
+        response_processors.update(self._any_response)
+        response_processors = list(response_processors)
+        response_processors.sort()
+        for processor in response_processors:
+            for meth_name in ["any_response", req_scheme+"_response"]:
+                meth = getattr(processor, meth_name, None)
+                if meth:
+                    response = meth(req, response)
+
+        return response
+
+    def error(self, proto, *args):
+        if proto in ['http', 'https']:
+            # XXX http[s] protocols are special-cased
+            dict = self.handle_error['http'] # https is not different than http
+            proto = args[2]  # YUCK!
+            meth_name = 'http_error_%s' % proto
+            http_err = 1
+            orig_args = args
+        else:
+            dict = self.handle_error
+            meth_name = proto + '_error'
+            http_err = 0
+        args = (dict, proto, meth_name) + args
+        result = apply(self._call_chain, args)
+        if result:
+            return result
+
+        if http_err:
+            args = (dict, 'default', 'http_error_default') + orig_args
+            return apply(self._call_chain, args)
+
+    BLOCK_SIZE = 1024*8
+    def retrieve(self, fullurl, filename=None, reporthook=None, data=None):
+        """Returns (filename, headers).
+
+        For remote objects, the default filename will refer to a temporary
+        file.  Temporary files are removed when the OpenerDirector.close()
+        method is called.
+
+        For file: URLs, at present the returned filename is None.  This may
+        change in future.
+
+        If the actual number of bytes read is less than indicated by the
+        Content-Length header, raises ContentTooShortError (a URLError
+        subclass).  The exception's .result attribute contains the (filename,
+        headers) that would have been returned.
+
+        """
+        req = self._request(fullurl, data, False)
+        scheme = req.get_type()
+        fp = self.open(req)
+        headers = fp.info()
+        if filename is None and scheme == 'file':
+            # XXX req.get_selector() seems broken here, return None,
+            #   pending sanity :-/
+            return None, headers
+            #return urllib.url2pathname(req.get_selector()), headers
+        if filename:
+            tfp = open(filename, 'wb')
+        else:
+            path = _rfc3986.urlsplit(fullurl)[2]
+            suffix = os.path.splitext(path)[1]
+            fd, filename = tempfile.mkstemp(suffix)
+            self._tempfiles.append(filename)
+            tfp = os.fdopen(fd, 'wb')
+
+        result = filename, headers
+        bs = self.BLOCK_SIZE
+        size = -1
+        read = 0
+        blocknum = 0
+        if reporthook:
+            if "content-length" in headers:
+                size = int(headers["Content-Length"])
+            reporthook(blocknum, bs, size)
+        while 1:
+            block = fp.read(bs)
+            if block == "":
+                break
+            read += len(block)
+            tfp.write(block)
+            blocknum += 1
+            if reporthook:
+                reporthook(blocknum, bs, size)
+        fp.close()
+        tfp.close()
+        del fp
+        del tfp
+
+        # raise exception if actual size does not match content-length header
+        if size >= 0 and read < size:
+            raise ContentTooShortError(
+                "retrieval incomplete: "
+                "got only %i out of %i bytes" % (read, size),
+                result
+                )
+
+        return result
+
+    def close(self):
+        urllib2.OpenerDirector.close(self)
+
+        # make it very obvious this object is no longer supposed to be used
+        self.open = self.error = self.retrieve = self.add_handler = None
+
+        if self._tempfiles:
+            for filename in self._tempfiles:
+                try:
+                    os.unlink(filename)
+                except OSError:
+                    pass
+            del self._tempfiles[:]
+
+
+def wrapped_open(urlopen, process_response_object, fullurl, data=None):
+    success = True
+    try:
+        response = urlopen(fullurl, data)
+    except urllib2.HTTPError, error:
+        success = False
+        if error.fp is None:  # not a response
+            raise
+        response = error
+
+    if response is not None:
+        response = process_response_object(response)
+
+    if not success:
+        raise response
+    return response
+
+class ResponseProcessingOpener(OpenerDirector):
+
+    def open(self, fullurl, data=None):
+        def bound_open(fullurl, data=None):
+            return OpenerDirector.open(self, fullurl, data)
+        return wrapped_open(
+            bound_open, self.process_response_object, fullurl, data)
+
+    def process_response_object(self, response):
+        return response
+
+
+class SeekableResponseOpener(ResponseProcessingOpener):
+    def process_response_object(self, response):
+        return _response.seek_wrapped_response(response)
+
+
+class OpenerFactory:
+    """This class's interface is quite likely to change."""
+
+    default_classes = [
+        # handlers
+        urllib2.ProxyHandler,
+        urllib2.UnknownHandler,
+        _http.HTTPHandler,  # derived from new AbstractHTTPHandler
+        _http.HTTPDefaultErrorHandler,
+        _http.HTTPRedirectHandler,  # bugfixed
+        urllib2.FTPHandler,
+        urllib2.FileHandler,
+        # processors
+        _upgrade.HTTPRequestUpgradeProcessor,
+        _http.HTTPCookieProcessor,
+        _http.HTTPErrorProcessor,
+        ]
+    if hasattr(httplib, 'HTTPS'):
+        default_classes.append(_http.HTTPSHandler)
+    handlers = []
+    replacement_handlers = []
+
+    def __init__(self, klass=OpenerDirector):
+        self.klass = klass
+
+    def build_opener(self, *handlers):
+        """Create an opener object from a list of handlers and processors.
+
+        The opener will use several default handlers and processors, including
+        support for HTTP and FTP.
+
+        If any of the handlers passed as arguments are subclasses of the
+        default handlers, the default handlers will not be used.
+
+        """
+        opener = self.klass()
+        default_classes = list(self.default_classes)
+        skip = []
+        for klass in default_classes:
+            for check in handlers:
+                if type(check) == types.ClassType:
+                    if issubclass(check, klass):
+                        skip.append(klass)
+                elif type(check) == types.InstanceType:
+                    if isinstance(check, klass):
+                        skip.append(klass)
+        for klass in skip:
+            default_classes.remove(klass)
+
+        for klass in default_classes:
+            opener.add_handler(klass())
+        for h in handlers:
+            if type(h) == types.ClassType:
+                h = h()
+            opener.add_handler(h)
+
+        return opener
+
+
+build_opener = OpenerFactory().build_opener
+
+_opener = None
+urlopen_lock = _threading.Lock()
+def urlopen(url, data=None):
+    global _opener
+    if _opener is None:
+        urlopen_lock.acquire()
+        try:
+            if _opener is None:
+                _opener = build_opener()
+        finally:
+            urlopen_lock.release()
+    return _opener.open(url, data)
+
+def urlretrieve(url, filename=None, reporthook=None, data=None):
+    global _opener
+    if _opener is None:
+        urlopen_lock.acquire()
+        try:
+            if _opener is None:
+                _opener = build_opener()
+        finally:
+            urlopen_lock.release()
+    return _opener.retrieve(url, filename, reporthook, data)
+
+def install_opener(opener):
+    global _opener
+    _opener = opener
Index: /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_request.py
===================================================================
--- /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_request.py (revision 3)
+++ /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/_mechanize_dist/_request.py (revision 3)
@@ -0,0 +1,86 @@
+"""Integration with Python standard library module urllib2: Request class.
+
+Copyright 2004-2006 John J Lee <jjl@pobox.com>
+
+This code is free software; you can redistribute it and/or modify it
+under the terms of the BSD or ZPL 2.1 licenses (see the file
+COPYING.txt included with the distribution).
+
+"""
+
+import urllib2, urllib, logging
+
+from _clientcookie import request_host
+import _rfc3986
+
+warn = logging.getLogger("mechanize").warning
+# don't complain about missing logging handler
+logging.getLogger("mechanize").setLevel(logging.ERROR)
+
+
+class Request(urllib2.Request):
+    def __init__(self, url, data=None, headers={},
+                 origin_req_host=None, unverifiable=False, visit=None):
+        # In mechanize 0.2, the interpretation of a unicode url argument will
+        # change: A unicode url argument will be interpreted as an IRI, and a
+        # bytestring as a URI. For now, we accept unicode or bytestring.  We
+        # don't insist that the value is always a URI (specifically, must only
+        # contain characters which are legal), because that might break working
+        # code (who knows what bytes some servers want to see, especially with
+        # browser plugins for internationalised URIs).
+        if not _rfc3986.is_clean_uri(url):
+            warn("url argument is not a URI "
+                 "(contains illegal characters) %r" % url)
+        urllib2.Request.__init__(self, url, data, headers)
+        self.selector = None
+        self.unredirected_hdrs = {}
+        self.visit = visit
+
+        # All the terminology below comes from RFC 2965.
+        self.unverifiable = unverifiable
+        # Set request-host of origin transaction.
+        # The origin request-host is needed in order to decide whether
+        # unverifiable sub-requests (automatic redirects, images embedded
+        # in HTML, etc.) are to third-party hosts.  If they are, the
+        # resulting transactions might need to be conducted with cookies
+        # turned off.
+        if origin_req_host is None:
+            origin_req_host = request_host(self)
+        self.origin_req_host = origin_req_host
+
+    def get_selector(self):
+        return urllib.splittag(self.__r_host)[0]
+
+    def get_origin_req_host(self):
+        return self.origin_req_host
+
+    def is_unverifiable(self):
+        return self.unverifiable
+
+    def add_unredirected_header(self, key, val):
+        """Add a header that will not be added to a redirected request."""
+        self.unredirected_hdrs[key.capitalize()] = val
+
+    def has_header(self, header_name):
+        """True iff request has named header (regular or unredirected)."""
+        return (header_name in self.headers or
+                header_name in self.unredirected_hdrs)
+
+    def get_header(self, header_name, default=None):
+        return self.headers.get(
+            header_name,
+            self.unredirected_hdrs.get(header_name, default))
+
+    def header_items(self):
+        hdrs = self.unredirected_hdrs.copy()
+        hdrs.update(self.headers)
+        return hdrs.items()
+
+    def __str__(self):
+        return "<Request for %s>" % self.get_full_url()
+
+    def get_method(self):
+        if self.has_data():
+            return "POST"
+        else:
+            return "GET"
Index: /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/__init__.py
===================================================================
--- /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/__init__.py (revision 3)
+++ /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/other_packages/__init__.py (revision 3)
@@ -0,0 +1,1 @@
+#
Index: /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/parse.py
===================================================================
--- /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/parse.py (revision 3)
+++ /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/parse.py (revision 3)
@@ -0,0 +1,278 @@
+"""
+Code parsing and evaluation for the twill mini-language.
+"""
+
+import sys
+from cStringIO import StringIO
+
+from errors import TwillAssertionError, TwillNameError
+from pyparsing import OneOrMore, Word, printables, quotedString, Optional, \
+     alphas, alphanums, ParseException, ZeroOrMore, restOfLine, Combine, \
+     Literal, Group, removeQuotes, CharsNotIn
+
+import twill.commands as commands
+import namespaces
+import re
+
+### pyparsing stuff
+
+# basically, a valid Python identifier:
+command = Word(alphas + "_", alphanums + "_")
+command = command.setResultsName('command')
+command.setName("command")
+
+# arguments to it.
+
+# we need to reimplement all this junk from pyparsing because pcre's
+# idea of escapable characters contains a lot more than the C-like
+# thing pyparsing implements
+_bslash = "\\"
+_sglQuote = Literal("'")
+_dblQuote = Literal('"')
+_escapables = printables
+_escapedChar = Word(_bslash, _escapables, exact=2)
+dblQuotedString = Combine( _dblQuote + ZeroOrMore( CharsNotIn('\\"\n\r') | _escapedChar | '""' ) + _dblQuote ).streamline().setName("string enclosed in double quotes")
+sglQuotedString = Combine( _sglQuote + ZeroOrMore( CharsNotIn("\\'\n\r") | _escapedChar | "''" ) + _sglQuote ).streamline().setName("string enclosed in single quotes")
+quotedArg = ( dblQuotedString | sglQuotedString )
+quotedArg.setParseAction(removeQuotes)
+quotedArg.setName("quotedArg")
+
+plainArgChars = printables.replace('#', '').replace('"', '').replace("'", "")
+plainArg = Word(plainArgChars)
+plainArg.setName("plainArg")
+
+arguments = Group(ZeroOrMore(quotedArg | plainArg))
+arguments = arguments.setResultsName('arguments')
+arguments.setName("arguments")
+
+# comment line.
+comment = Literal('#') + restOfLine
+comment = comment.suppress()
+comment.setName('comment')
+
+full_command = (
+    comment
+    | (command + arguments + Optional(comment))
+    )
+full_command.setName('full_command')
+
+###
+
+command_list = []           # filled in by namespaces.init_global_dict().
+
+### command/argument handling.
+
+def process_args(args, globals_dict, locals_dict):
+    """
+    Take a list of string arguments parsed via pyparsing and evaluate
+    the special variables ('__*').
+
+    Return a new list.
+    """
+    newargs = []
+    for arg in args:
+        # __variable substitution.
+        if arg.startswith('__'):
+            try:
+                val = eval(arg, globals_dict, locals_dict)
+            except NameError:           # not in dictionary; don't interpret.
+                val = arg
+
+
+            print '*** VAL IS', val, 'FOR', arg
+            
+            if isinstance(val, str):
+                newargs.append(val)
+            else:
+                newargs.extend(val)
+                
+        # $variable substitution
+        elif arg.startswith('$') and not arg.startswith('${'):
+            try:
+                val = eval(arg[1:], globals_dict, locals_dict)
+            except NameError:           # not in dictionary; don't interpret.
+                val = arg
+            newargs.append(val)
+        else:
+            newargs.append(variable_substitution(arg, globals_dict, locals_dict))
+
+    newargs = [ i.replace('\\n', '\n') for i in newargs ]
+
+    return newargs
+
+###
+
+def execute_command(cmd, args, globals_dict, locals_dict, cmdinfo):
+    """
+    Actually execute the command.
+
+    Side effects: __args__ is set to the argument tuple, __cmd__ is set to
+    the command.
+    """
+    global command_list                 # all supported commands:
+    # execute command.
+    locals_dict['__cmd__'] = cmd
+    locals_dict['__args__'] = args
+
+    if cmd not in command_list:
+        raise TwillNameError("unknown twill command: '%s'" % (cmd,))
+
+    eval_str = "%s(*__args__)" % (cmd,)
+
+    # compile the code object so that we can get 'cmdinfo' into the
+    # error tracebacks.
+    codeobj = compile(eval_str, cmdinfo, 'eval')
+
+    # eval the codeobj in the appropriate dictionary.
+    result = eval(codeobj, globals_dict, locals_dict)
+    
+    # set __url__
+    locals_dict['__url__'] = commands.browser.get_url()
+
+    return result
+
+###
+
+_print_commands = False
+
+def parse_command(line, globals_dict, locals_dict):
+    """
+    Parse command.
+    """
+    res = full_command.parseString(line)
+    if res:
+        if _print_commands:
+            print>>commands.OUT, "twill: executing cmd '%s'" % (line.strip(),)
+            
+        args = process_args(res.arguments.asList(), globals_dict, locals_dict)
+        return (res.command, args)
+
+    return None, None                   # e.g. a comment
+
+###
+
+def execute_string(buf, **kw):
+    """
+    Execute commands from a string buffer.
+    """
+    fp = StringIO(buf)
+    
+    kw['source'] = ['<string buffer>']
+    if not kw.has_key('no_reset'):
+       kw['no_reset'] = True
+    
+    _execute_script(fp, **kw)
+
+def execute_file(filename, **kw):
+    """
+    Execute commands from a file.
+    """
+    # read the input lines
+    if filename == "-":
+        inp = sys.stdin
+    else:
+        inp = open(filename)
+
+    kw['source'] = filename
+
+    _execute_script(inp, **kw)
+    
+def _execute_script(inp, **kw):
+    """
+    Execute lines taken from a file-like iterator.
+    """
+    # initialize new local dictionary & get global + current local
+    namespaces.new_local_dict()
+    globals_dict, locals_dict = namespaces.get_twill_glocals()
+    
+    locals_dict['__url__'] = commands.browser.get_url()
+
+    # reset browser
+    if not kw.get('no_reset'):
+        commands.reset_browser()
+
+    # go to a specific URL?
+    init_url = kw.get('initial_url')
+    if init_url:
+        commands.go(init_url)
+        locals_dict['__url__'] = commands.browser.get_url()
+
+    # should we catch exceptions on failure?
+    catch_errors = False
+    if kw.get('never_fail'):
+        catch_errors = True
+
+    # sourceinfo stuff
+    sourceinfo = kw.get('source', "<input>")
+    
+    try:
+
+        for n, line in enumerate(inp):
+            if not line.strip():            # skip empty lines
+                continue
+
+            cmdinfo = "%s:%d" % (sourceinfo, n,)
+            print 'AT LINE:', cmdinfo
+
+            cmd, args = parse_command(line, globals_dict, locals_dict)
+            if cmd is None:
+                continue
+
+            try:
+                execute_command(cmd, args, globals_dict, locals_dict, cmdinfo)
+            except SystemExit:
+                # abort script execution, if a SystemExit is raised.
+                return
+            except TwillAssertionError, e:
+                print>>commands.ERR, '''\
+Oops!  Twill assertion error on line %d of '%s' while executing
+
+  >> %s
+
+%s
+''' % (n, sourceinfo, line.strip(), e)
+                if not catch_errors:
+                    raise
+            except Exception, e:
+                print>>commands.ERR, '''\
+EXCEPTION raised at line %d of '%s'
+
+      %s
+
+Error message: '%s'
+
+''' % (n, sourceinfo, line.strip(),str(e).strip(),)
+
+                if not catch_errors:
+                    raise
+
+    finally:
+        namespaces.pop_local_dict()
+
+###
+
+def debug_print_commands(flag):
+    """
+    Turn on/off printing of commands as they are executed.  'flag' is bool.
+    """
+    global _print_commands
+    _print_commands = bool(flag)
+        
+
+variable_expression = re.compile("\${(.*?)}")
+
+def variable_substitution(raw_str, globals_dict, locals_dict):
+    str=''
+    pos = 0
+    for m in variable_expression.finditer(raw_str):
+        str = str+raw_str[pos:m.start()]
+        try:
+            str = str + eval(m.group(1), globals_dict, locals_dict)
+        except NameError:
+            str = str + m.group()
+        pos = m.end()
+
+    str = str+raw_str[pos:]
+
+    return str
+
Index: /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/errors.py
===================================================================
--- /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/errors.py (revision 3)
+++ /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/errors.py (revision 3)
@@ -0,0 +1,17 @@
+class TwillException(Exception):
+    """
+    General twill exception.
+    """
+    pass
+
+class TwillAssertionError(TwillException):
+    """
+    AssertionError to raise upon failure of some twill command.
+    """
+    pass
+
+class TwillNameError(TwillException):
+    """
+    Error to raise when an unknown command is called.
+    """
+    pass
Index: /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/__init__.py
===================================================================
--- /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/__init__.py (revision 3)
+++ /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/__init__.py (revision 3)
@@ -0,0 +1,88 @@
+# This file is part of the twill source distribution.
+#
+# twill is a extensible scriptlet language for testing Web apps,
+# available at http://twill.idyll.org/.
+#
+# Contact author: C. Titus Brown, titus@idyll.org.
+#
+# This program and all associated source code files are Copyright (C)
+# 2005-2007 by C. Titus Brown.  It is released under the MIT license;
+# please see the included LICENSE.txt file for more information, or
+# go to http://www.opensource.org/licenses/mit-license.php.
+
+"""
+twill Web testing language & associated utilities.
+"""
+
+__version__ = "0.9"
+
+#import warnings
+#warnings.defaultaction = "error"
+
+#import pychecker.checker
+
+__all__ = [ "TwillCommandLoop",
+            "execute_file",
+            "execute_string",
+            "get_browser",
+            "add_wsgi_intercept",
+            "remove_wsgi_intercept",
+            "set_output",
+            "set_errout"]
+
+#
+# add extensions (twill/extensions) and the the wwwsearch & pyparsing
+# stuff from twill/included-packages/.  NOTE: this works with eggs! hooray!
+#
+
+import sys, os.path
+thisdir = os.path.dirname(__file__)
+
+# add extensions directory at the *end* of sys.path.  This means that
+# user extensions will take priority over twill extensions.
+extensions = os.path.join(thisdir, 'extensions')
+sys.path.append(extensions)
+
+# add other_packages in at the *beginning*, so that the correct
+# (patched) versions of pyparsing and mechanize get imported.
+wwwsearchlib = os.path.join(thisdir, 'other_packages')
+sys.path.insert(0, wwwsearchlib)
+
+# the two core components of twill:
+from shell import TwillCommandLoop
+from parse import execute_file, execute_string
+
+# convenience function or two...
+from commands import get_browser
+
+def get_browser_state():
+    import warnings
+    warnings.warn("""\
+get_browser_state is deprecated; use 'twill.get_browser() instead.
+""", DeprecationWarning)
+    return get_browser()
+
+# initialize global dict
+import namespaces
+namespaces.init_global_dict()
+
+from wsgi_intercept import add_wsgi_intercept, remove_wsgi_intercept
+
+def set_output(fp):
+    """
+    Have standard output from twill go to the given fp instead of
+    stdout.  fp=None will reset to stdout.
+    """
+    import commands, browser
+    commands.OUT = browser.OUT = fp
+
+def set_errout(fp):
+    """
+    Have error output from twill go to the given fp instead of stderr.
+    fp=None will reset to stderr.
+    """
+    import commands
+    if fp:
+        commands.ERR = fp
+    else:
+        commands.ERR = sys.stderr
Index: /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/namespaces.py
===================================================================
--- /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/namespaces.py (revision 3)
+++ /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/namespaces.py (revision 3)
@@ -0,0 +1,57 @@
+"""
+Global and local dictionaries, + initialization/utility functions.
+"""
+
+global_dict = {}
+
+def init_global_dict():
+    """
+    Initialize global dictionary with twill commands.
+
+    This must be done after all the other modules are loaded, so that all
+    of the commands are already defined.
+    """
+    exec "from twill.commands import *" in global_dict
+    import twill.commands
+    command_list = twill.commands.__all__
+    
+    import twill.parse
+    twill.parse.command_list.extend(command_list)
+
+# local dictionaries.
+_local_dict_stack = []
+
+###
+
+# local dictionary management functions.
+
+def new_local_dict():
+    """
+    Initialize a new local dictionary & push it onto the stack.
+    """
+    d = {}
+    _local_dict_stack.append(d)
+
+    return d
+
+def pop_local_dict():
+    """
+    Get rid of the current local dictionary.
+    """
+    _local_dict_stack.pop()
+
+###
+
+def get_twill_glocals():
+    """
+    Return global dict & current local dictionary.
+    """
+    global global_dict, _local_dict_stack
+    assert global_dict is not None, "must initialize global namespace first!"
+
+    if len(_local_dict_stack) == 0:
+        new_local_dict()
+
+    return global_dict, _local_dict_stack[-1]
+
+###
Index: /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/unit.py
===================================================================
--- /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/unit.py (revision 3)
+++ /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/unit.py (revision 3)
@@ -0,0 +1,89 @@
+"""
+Support functionality for using twill in unit tests.
+"""
+
+import sys, os, time
+from cStringIO import StringIO
+
+# package import
+from parse import execute_file
+
+class TestInfo:
+    """
+    Object containing info for a test: script to run, server function to
+    run, and port to run it on.  Note that information about server port
+    *must* be decided by the end of the __init__ function.
+
+    The optional sleep argument specifies how many seconds to wait for the
+    server to set itself up.  Default is 0.
+    """
+    
+    def __init__(self, script, server_fn, port, sleep=0):
+        self.script = script
+        self.server_fn = server_fn
+        self.port = port
+        self.stdout = None
+        self.stderr = None
+        self.sleep = sleep
+
+    def start_server(self):
+        # save old stdout/stderr
+        old_out, old_err = sys.stdout, sys.stderr
+
+        # create new stdout/stderr
+        self.stdout = sys.stdout = StringIO()
+        self.stderr = sys.stderr = StringIO()
+        
+        try:
+            self.server_fn()
+        finally:
+            # restore stdout/stderr
+            sys.stdout, sys.stderr = old_out, old_err
+
+    def run_script(self):
+        """
+        Run the given twill script on the given server.
+        """
+        time.sleep(self.sleep)
+        url = self.get_url()
+        execute_file(self.script, initial_url=url)
+
+    def get_url(self):
+        "Calculate the test server URL."
+        return "http://localhost:%d/" % (self.port,)
+
+#
+# run_test
+#
+
+def run_test(test_info):
+    """
+    Run a test on a Web site where the Web site is running in a child
+    process.
+    """
+    pid = os.fork()
+
+    if pid is 0:
+        run_child_process(test_info)
+        # never returns...
+
+    #
+    # run twill test script.
+    #
+    
+    child_pid = pid
+    try:
+        test_info.run_script()
+    finally:
+        os.kill(child_pid, 9)
+
+#
+# run_child_process
+#
+        
+def run_child_process(test_info):
+    """
+    Run a Web server in a child process.
+    """
+    test_info.start_server()
+    sys.exit(0)
Index: /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/utils.py
===================================================================
--- /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/utils.py (revision 3)
+++ /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/utils.py (revision 3)
@@ -0,0 +1,481 @@
+"""
+Various ugly utility functions for twill.
+
+Apart from various simple utility functions, twill's robust parsing
+code is implemented in the ConfigurableParsingFactory class.
+"""
+
+from cStringIO import StringIO
+import os
+import base64
+
+import subprocess
+
+import _mechanize_dist as mechanize
+from _mechanize_dist import ClientForm
+from _mechanize_dist._util import time
+from _mechanize_dist._http import HTTPRefreshProcessor
+from _mechanize_dist import BrowserStateError
+
+class ResultWrapper:
+    """
+    Deal with mechanize/urllib2/whatever results, and present them in a
+    unified form.  Returned by 'journey'-wrapped functions.
+    """
+    def __init__(self, http_code, url, page):
+        if http_code is not None:
+            self.http_code = int(http_code)
+        else:
+            self.http_code = 200
+        self.url = url
+        self.page = page
+
+    def get_url(self):
+        return self.url
+
+    def get_http_code(self):
+        return self.http_code
+
+    def get_page(self):
+        return self.page
+
+def trunc(s, length):
+    """
+    Truncate a string s to length length, by cutting off the last 
+    (length-4) characters and replacing them with ' ...'
+    """
+    if not s:
+        return ''
+    
+    if len(s) > length:
+        return s[:length-4] + ' ...'
+    
+    return s
+
+def print_form(n, f, OUT):
+    """
+    Pretty-print the given form, assigned # n.
+    """
+    if f.name:
+        print>>OUT, '\nForm name=%s (#%d)' % (f.name, n + 1)
+    else:
+        print>>OUT, '\nForm #%d' % (n + 1,)
+
+    if f.controls:
+        print>>OUT, "## ## __Name__________________ __Type___ __ID________ __Value__________________"
+
+
+    submit_indices = {}
+    n = 1
+    for c in f.controls:
+        if c.is_of_kind('clickable'):
+            submit_indices[c] = n
+            n += 1
+            
+    clickies = [c for c in f.controls if c.is_of_kind('clickable')]
+    nonclickies = [c for c in f.controls if c not in clickies]
+
+    for n, field in enumerate(f.controls):
+        if hasattr(field, 'items'):
+            items = [ i.name for i in field.items ]
+            value_displayed = "%s of %s" % (field.value, items)
+        else:
+            value_displayed = "%s" % (field.value,)
+
+        if field.is_of_kind('clickable'):
+            submit_index = "%-2s" % (submit_indices[field],)
+        else:
+            submit_index = "  "
+        strings = ("%-2s" % (n + 1,),
+                   submit_index,
+                   "%-24s %-9s" % (trunc(str(field.name), 24),
+                                   trunc(field.type, 9)),
+                   "%-12s" % (trunc(field.id or "(None)", 12),),
+                   trunc(value_displayed, 40),
+                   )
+        for s in strings:
+            print>>OUT, s,
+        print>>OUT, ''
+
+    print ''
+
+def make_boolean(value):
+    """
+    Convert the input value into a boolean like so:
+    
+    >> make_boolean('true')
+    True
+    >> make_boolean('false')
+    False
+    >> make_boolean('1')
+    True
+    >> make_boolean('0')
+    False
+    >> make_boolean('+')
+    True
+    >> make_boolean('-')
+    False
+    """
+    value = str(value)
+    value = value.lower().strip()
+
+    # true/false
+    if value in ('true', 'false'):
+        if value == 'true':
+            return True
+        return False
+
+    # 0/nonzero
+    try:
+        ival = int(value)
+        return bool(ival)
+    except ValueError:
+        pass
+
+    # +/-
+    if value in ('+', '-'):
+        if value == '+':
+            return True
+        return False
+
+    # on/off
+    if value in ('on', 'off'):
+        if value == 'on':
+            return True
+        return False
+
+    raise TwillException("unable to convert '%s' into true/false" % (value,))
+
+def set_form_control_value(control, val):
+    """
+    Helper function to deal with setting form values on checkboxes, lists etc.
+    """
+    if isinstance(control, ClientForm.CheckboxControl):
+        try:
+            checkbox = control.get()
+            checkbox.selected = make_boolean(val)
+            return
+        except ClientForm.AmbiguityError:
+            # if there's more than one checkbox, use the behaviour for
+            # ClientForm.ListControl, below.
+            pass
+            
+    if isinstance(control, ClientForm.ListControl):
+        #
+        # for ListControls (checkboxes, multiselect, etc.) we first need
+        # to find the right *value*.  Then we need to set it +/-.
+        #
+
+        # figure out if we want to *select* it, or if we want to *deselect*
+        # it (flag T/F).  By default (no +/-) select...
+        
+        if val.startswith('-'):
+            val = val[1:]
+            flag = False
+        else:
+            flag = True
+            if val.startswith('+'):
+                val = val[1:]
+
+        # now, select the value.
+
+        try:
+            item = control.get(name=val)
+        except ClientForm.ItemNotFoundError:
+            try:
+                item = control.get(label=val)
+            except ClientForm.AmbiguityError:
+                raise ClientForm.ItemNotFoundError('multiple matches to value/label "%s" in list control' % (val,))
+            except ClientForm.ItemNotFoundError:
+                raise ClientForm.ItemNotFoundError('cannot find value/label "%s" in list control' % (val,))
+
+        if flag:
+            item.selected = 1
+        else:
+            item.selected = 0
+    else:
+        control.value = val
+
+def _all_the_same_submit(matches):
+    """
+    Utility function to check to see if a list of controls all really
+    belong to the same control: for use with checkboxes, hidden, and
+    submit buttons.
+    """
+    name = None
+    value = None
+    for match in matches:
+        if match.type not in ['submit', 'hidden']:
+            return False
+        if name is None:
+            name = match.name
+            value = match.value
+        else:
+            if match.name != name or match.value!= value:
+                return False
+    return True
+
+def _all_the_same_checkbox(matches):
+    """
+    Check whether all these controls are actually the the same
+    checkbox.
+
+    Hidden controls can combine with checkboxes, to allow form
+    processors to ensure a False value is returned even if user
+    does not check the checkbox. Without the hidden control, no
+    value would be returned.
+    """
+    name = None
+    for match in matches:
+        if match.type not in ['checkbox', 'hidden']:
+            return False
+        if name is None:
+            name = match.name
+        else:
+            if match.name != name:
+                return False
+    return True
+
+def unique_match(matches):
+    return len(matches) == 1 or \
+           _all_the_same_checkbox(matches) or \
+           _all_the_same_submit(matches)
+
+#
+# stuff to run 'tidy'...
+#
+
+_tidy_cmd = ["tidy", "-q", "-ashtml"]
+_tidy_exists = True
+
+def run_tidy(html):
+    """
+    Run the 'tidy' command-line program on the given HTML string.
+
+    Return a 2-tuple (output, errors).  (None, None) will be returned if
+    'tidy' doesn't exist or otherwise fails.
+    """
+    global _tidy_cmd, _tidy_exists
+
+    from commands import _options
+    require_tidy = _options.get('require_tidy')
+
+    if not _tidy_exists:
+        if require_tidy:
+            raise TwillException("tidy does not exist and require_tidy is set")
+        return (None, None)
+    
+    #
+    # run the command, if we think it exists
+    #
+    
+    clean_html = None
+    if _tidy_exists:
+        try:
+            process = subprocess.Popen(_tidy_cmd, stdin=subprocess.PIPE,
+                                       stdout=subprocess.PIPE,
+                                       stderr=subprocess.PIPE, bufsize=0,
+                                       shell=False)
+        
+            (stdout, stderr) = process.communicate(html)
+
+            clean_html = stdout
+            errors = stderr
+        except OSError:
+            _tidy_exists = False
+
+    errors = None
+    if require_tidy and clean_html is None:
+        raise TwillException("tidy does not exist and require_tidy is set")
+
+    return (clean_html, errors)
+
+class ConfigurableParsingFactory(mechanize.Factory):
+    """
+    A factory that listens to twill config options regarding parsing.
+
+    First: clean up passed-in HTML using tidy?
+    Second: parse using the regular parser, or BeautifulSoup?
+    Third: should we fail on, or ignore, parse errors?
+    """
+    
+    def __init__(self):
+        self.basic_factory = mechanize.DefaultFactory()
+        self.soup_factory = mechanize.RobustFactory()
+
+        self.set_response(None)
+
+    def set_request_class(self, request_class):
+        self.basic_factory.set_request_class(request_class)
+        self.soup_factory.set_request_class(request_class)
+
+    def set_response(self, response):
+        if not response:
+            self.factory = None
+            self._orig_html = self._html = self._url = None
+            return
+
+        ###
+
+        if self.use_BS():
+            self.factory = self.soup_factory
+        else:
+            self.factory = self.basic_factory
+        cleaned_response = self._cleanup_html(response)
+        self.factory.set_response(cleaned_response)
+
+    def links(self):
+        return self.factory.links()
+    
+    def forms(self):
+        return self.factory.forms()
+
+    def get_global_form(self):
+        return self.factory.global_form
+    global_form = property(get_global_form)
+
+    def _get_title(self):
+        return self.factory.title
+    title = property(_get_title)
+
+    def _get_encoding(self):
+        return self.factory.encoding
+    encoding = property(_get_encoding)
+
+    def _get_is_html(self):
+        return self.factory.is_html
+    is_html = property(_get_is_html)
+
+    def _cleanup_html(self, response):
+        response.seek(0)
+        self._orig_html = response.read()
+        self._url = response.geturl()
+        response.seek(0)
+
+        self._html = self._orig_html
+
+        from twill.commands import _options
+        use_tidy = _options.get('use_tidy')
+        if use_tidy:
+            (new_html, errors) = run_tidy(self._html)
+            if new_html:
+                self._html = new_html
+
+        return mechanize.make_response(self._html, response._headers.items(),
+                                       response._url, response.code,
+                                       response.msg)
+                                       
+    def use_BS(self):
+        from twill.commands import _options
+        flag = _options.get('use_BeautifulSoup')
+
+        return flag
+
+###
+
+class FixedHTTPBasicAuthHandler(mechanize.HTTPBasicAuthHandler):
+    """
+    Fix a bug that exists through Python 2.4 (but NOT in 2.5!)
+    """
+    def retry_http_basic_auth(self, host, req, realm):
+        user,pw = self.passwd.find_user_password(realm, req.get_full_url())
+        # ----------------------------------------------^^^^^^^^^^^^^^^^^^ CTB
+        if pw is not None:
+            raw = "%s:%s" % (user, pw)
+            auth = 'Basic %s' % base64.encodestring(raw).strip()
+            if req.headers.get(self.auth_header, None) == auth:
+                return None
+            req.add_header(self.auth_header, auth)
+            return self.parent.open(req)
+        else:
+            return None
+    
+
+###
+
+_debug_print_refresh = False
+class FunctioningHTTPRefreshProcessor(HTTPRefreshProcessor):
+    """
+    Fix an issue where the 'content' component of the http-equiv=refresh
+    tag may not contain 'url='.  CTB hack.
+    """
+    def http_response(self, request, response):
+        from twill.commands import OUT, _options
+        do_refresh = _options.get('acknowledge_equiv_refresh')
+        
+        code, msg, hdrs = response.code, response.msg, response.info()
+
+        if code == 200 and hdrs.has_key("refresh") and do_refresh:
+            refresh = hdrs.getheaders("refresh")[0]
+            
+            if _debug_print_refresh:
+                print>>OUT, "equiv-refresh DEBUG: code 200, hdrs has 'refresh'"
+                print>>OUT, "equiv-refresh DEBUG: refresh header is", refresh
+                
+            i = refresh.find(";")
+            if i != -1:
+                pause, newurl_spec = refresh[:i], refresh[i+1:]
+                pause = int(pause)
+
+                if _debug_print_refresh:
+                    print>>OUT, "equiv-refresh DEBUG: pause:", pause
+                    print>>OUT, "equiv-refresh DEBUG: new url:", newurl_spec
+                
+                j = newurl_spec.find("=")
+                if j != -1:
+                    newurl = newurl_spec[j+1:]
+                else:
+                    newurl = newurl_spec
+
+                if _debug_print_refresh:
+                    print>>OUT, "equiv-refresh DEBUG: final url:", newurl
+
+                print>>OUT, "Following HTTP-EQUIV=REFRESH to %s" % (newurl,)
+                    
+                if (self.max_time is None) or (pause <= self.max_time):
+                    if pause != 0 and 0:  # CTB hack! ==#  and self.honor_time:
+                        time.sleep(pause)
+                    hdrs["location"] = newurl
+                    # hardcoded http is NOT a bug
+                    response = self.parent.error(
+                        "http", request, response,
+                        "refresh", msg, hdrs)
+
+        return response
+
+    https_response = http_response
+
+####
+
+class HistoryStack(mechanize._mechanize.History):
+    def __len__(self):
+        return len(self._history)
+    def __getitem__(self, i):
+        return self._history[i]
+    
+####
+
+def _is_valid_filename(f):
+    return not (f.endswith('~') or f.endswith('.bak') or f.endswith('.old'))
+
+def gather_filenames(arglist):
+    """
+    Collect script files from within directories.
+    """
+    l = []
+
+    for filename in arglist:
+        if os.path.isdir(filename):
+            thislist = []
+            for (dirpath, dirnames, filenames) in os.walk(filename):
+                for f in filenames:
+                    if _is_valid_filename(f):
+                        f = os.path.join(dirpath, f)
+                        thislist.append(f)
+                        
+            thislist.sort()
+            l.extend(thislist)
+        else:
+            l.append(filename)
+
+    return l
Index: /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/commands.py
===================================================================
--- /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/commands.py (revision 3)
+++ /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/commands.py (revision 3)
@@ -0,0 +1,893 @@
+"""
+Implementation of all of the individual 'twill' commands available through
+twill-sh.
+"""
+
+import sys
+import _mechanize_dist as mechanize
+from _mechanize_dist import ClientForm
+from _mechanize_dist._headersutil import is_html
+
+OUT=None
+ERR=sys.stderr
+
+# export:
+__all__ = ['get_browser',
+           'reset_browser',
+           'extend_with',
+           'exit',
+           'go',
+           'reload',
+           'url',
+           'code',
+           'follow',
+           'find',
+           'notfind',
+           'back',
+           'show',
+           'echo',
+           'save_html',
+           'sleep',
+           'agent',
+           'showforms',
+           'showlinks',
+           'showhistory',
+           'submit',
+           'formvalue',
+           'fv',
+           'formaction',
+           'fa',
+           'formclear',
+           'formfile',
+           'getinput',
+           'getpassword',
+           'save_cookies',
+           'load_cookies',
+           'clear_cookies',
+           'show_cookies',
+           'add_auth',
+           'run',
+           'runfile',
+           'setglobal',
+           'setlocal',
+           'debug',
+           'title',
+           'exit',
+           'config',
+           'tidy_ok',
+           'redirect_output',
+           'reset_output',
+           'redirect_error',
+           'reset_error',
+           'add_extra_header',
+           'show_extra_headers',
+           'clear_extra_headers',
+           'info'
+           ]
+
+import re, getpass, time
+
+from browser import TwillBrowser
+
+from errors import TwillException, TwillAssertionError
+import utils
+from utils import set_form_control_value, run_tidy
+from namespaces import get_twill_glocals
+        
+browser = TwillBrowser()
+
+def get_browser():
+    return browser
+
+def reset_browser():
+    """
+    >> reset_browser
+
+    Reset the browser completely.
+    """
+    global browser
+    browser._browser.close()
+    browser = TwillBrowser()
+
+    global _options
+    _options = {}
+    _options.update(_orig_options)
+
+###
+
+def exit(code="0"):
+    """
+    exit [<code>]
+
+    Exits twill, with the given exit code (defaults to 0, "no error").
+    """
+    raise SystemExit(int(code))
+
+def go(url):
+    """
+    >> go <url>
+    
+    Visit the URL given.
+    """
+    browser.go(url)
+    return browser.get_url()
+
+def reload():
+    """
+    >> reload
+    
+    Reload the current URL.
+    """
+    browser.reload()
+    return browser.get_url()
+
+def code(should_be):
+    """
+    >> code <int>
+    
+    Check to make sure the response code for the last page is as given.
+    """
+    should_be = int(should_be)
+    if browser.get_code() != int(should_be):
+        raise TwillAssertionError("code is %s != %s" % (browser.get_code(),
+                                                        should_be))
+
+def tidy_ok():
+    """
+    >> tidy_ok
+
+    Assert that 'tidy' produces no warnings or errors when run on the current
+    page.
+
+    If 'tidy' cannot be run, will fail silently (unless 'tidy_should_exist'
+    option is true; see 'config' command).
+    """
+    page = browser.get_html()
+    if page is None:
+        raise TwillAssertionError("not viewing HTML!")
+        
+    (clean_page, errors) = run_tidy(page)
+    if clean_page is None:              # tidy doesn't exist...
+        if _options.get('tidy_should_exist'):
+            raise TwillAssertionError("cannot run 'tidy'")
+    elif errors:
+        raise TwillAssertionError("tidy errors:\n====\n%s\n====\n" % (errors,))
+
+    # page is fine.
+
+def url(should_be):
+    """
+    >> url <regexp>
+
+    Check to make sure that the current URL matches the regexp.  The local
+    variable __match__ is set to the matching part of the URL.
+    """
+    regexp = re.compile(should_be)
+    current_url = browser.get_url()
+
+    m = None
+    if current_url is not None:
+        m = regexp.search(current_url)
+    else:
+        current_url = ''
+
+    if not m:
+        raise TwillAssertionError("""\
+current url is '%s';
+does not match '%s'
+""" % (current_url, should_be,))
+
+    if m.groups():
+        match_str = m.group(1)
+    else:
+        match_str = m.group(0)
+
+    global_dict, local_dict = get_twill_glocals()
+    local_dict['__match__'] = match_str
+    return match_str
+
+def follow(what):
+    """
+    >> follow <regexp>
+    
+    Find the first matching link on the page & visit it.
+    """
+    regexp = re.compile(what)
+    link = browser.find_link(regexp)
+
+    if link:
+        browser.follow_link(link)
+        return browser.get_url()
+
+    raise TwillAssertionError("no links match to '%s'" % (what,))
+
+def _parseFindFlags(flags):
+    KNOWN_FLAGS = {
+        'i': re.IGNORECASE,
+        'm': re.MULTILINE,
+        's': re.DOTALL,
+        }
+    finalFlags = 0
+    for char in flags:
+        try:
+            finalFlags |= KNOWN_FLAGS[char]
+        except IndexError:
+            raise TwillAssertionError("unknown 'find' flag %r" % char)
+    return finalFlags
+
+def find(what, flags=''):
+    """
+    >> find <regexp> [<flags>]
+    
+    Succeed if the regular expression is on the page.  Sets the local
+    variable __match__ to the matching text.
+
+    Flags is a string consisting of the following characters:
+
+    * i: ignorecase
+    * m: multiline
+    * s: dotall
+
+    For explanations of these, please see the Python re module
+    documentation.
+    """
+    regexp = re.compile(what, _parseFindFlags(flags))
+    page = browser.get_html()
+
+    m = regexp.search(page)
+    if not m:
+        raise TwillAssertionError("no match to '%s'" % (what,))
+
+    if m.groups():
+        match_str = m.group(1)
+    else:
+        match_str = m.group(0)
+
+    _, local_dict = get_twill_glocals()
+    local_dict['__match__'] = match_str
+
+def notfind(what, flags=''):
+    """
+    >> notfind <regexp> [<flags>]
+    
+    Fail if the regular expression is on the page.
+    """
+    regexp = re.compile(what, _parseFindFlags(flags))
+    page = browser.get_html()
+
+    if regexp.search(page):
+        raise TwillAssertionError("match to '%s'" % (what,))
+
+def back():
+    """
+    >> back
+    
+    Return to the previous page.
+    """
+    browser.back()
+    return browser.get_url()
+
+def show():
+    """
+    >> show
+    
+    Show the HTML for the current page.
+    """
+    html = browser.get_html()
+    print>>OUT, html
+    return html
+
+def echo(*strs):
+    """
+    >> echo <list> <of> <strings>
+    
+    Echo the arguments to the screen.
+    """
+    strs = map(str, strs)
+    s = " ".join(strs)
+    print>>OUT, s
+
+def save_html(filename=None):
+    """
+    >> save_html [<filename>]
+    
+    Save the HTML for the current page into <filename>.  If no filename
+    given, construct the filename from the URL.
+    """
+    html = browser.get_html()
+    if html is None:
+        print>>OUT, "No page to save."
+        return
+
+    if filename is None:
+        url = browser.get_url()
+        url = url.split('?')[0]
+        filename = url.split('/')[-1]
+        if filename is "":
+            filename = 'index.html'
+
+        print>>OUT, "(Using filename '%s')" % (filename,)
+
+    f = open(filename, 'w')
+    f.write(html)
+    f.close()
+
+def sleep(interval=1):
+    """
+    >> sleep [<interval>]
+
+    Sleep for the specified amount of time.
+    If no interval is given, sleep for 1 second.
+    """
+    time.sleep(float(interval))
+
+_agent_map = dict(
+    ie5='Mozilla/4.0 (compatible; MSIE 5.0; Windows NT 5.1)',
+    ie55='Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.1)',
+    ie6='Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)',
+    moz17='Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7) Gecko/20040616',
+    opera7='Opera/7.0 (Windows NT 5.1; U) [en]',
+    konq32='Mozilla/5.0 (compatible; Konqueror/3.2.3; Linux 2.4.14; X11; i686)',
+    saf11='Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/100 (KHTML, like Gecko) Safari/100',
+    aol9='Mozilla/4.0 (compatible; MSIE 5.5; AOL 9.0; Windows NT 5.1)',)
+
+def agent(what):
+    """
+    >> agent <agent>
+    
+    Set the agent string (identifying the browser brand).
+
+    Some convenient shortcuts:
+      ie5, ie55, ie6, moz17, opera7, konq32, saf11, aol9.
+    """
+    what = what.strip()
+    agent = _agent_map.get(what, what)
+    browser.set_agent_string(agent)
+
+def submit(submit_button=None):
+    """
+    >> submit [<buttonspec>]
+    
+    Submit the current form (the one last clicked on) by clicking on the
+    n'th submission button.  If no "buttonspec" is given, submit the current
+    form by using the last clicked submit button.
+
+    The form to submit is the last form clicked on with a 'formvalue' command.
+
+    The button used to submit is chosen based on 'buttonspec'.  If 'buttonspec'
+    is given, it's matched against buttons using the same rules that
+    'formvalue' uses.  If 'buttonspec' is not given, submit uses the last
+    submit button clicked on by 'formvalue'.  If none can be found,
+    submit submits the form with no submit button clicked.
+    """
+    browser.submit(submit_button)
+
+def showforms():
+    """
+    >> showforms
+    
+    Show all of the forms on the current page.
+    """
+    browser.showforms()
+    return browser._browser.forms()
+
+def showlinks():
+    """
+    >> showlinks
+    
+    Show all of the links on the current page.
+    """
+    browser.showlinks()
+    return browser._browser.links()
+
+def showhistory():
+    """
+    >> showhistory
+
+    Show the browser history (what URLs were visited).
+    """
+    browser.showhistory()
+    return browser._browser._history
+    
+def formclear(formname):
+    """
+    >> formclear <formname>
+    
+    Run 'clear' on all of the controls in this form.
+    """
+    form = browser.get_form(formname)
+    for control in form.controls:
+        if control.readonly:
+            continue
+
+        control.clear()
+
+def formvalue(formname, fieldname, value):
+    """
+    >> formvalue <formname> <field> <value>
+
+    Set value of a form field.
+
+    There are some ambiguities in the way formvalue deals with lists:
+    'formvalue' will *add* the given value to a list of multiple selection,
+    for lists that allow it.
+
+    Forms are matched against 'formname' as follows:
+      1. regexp match to actual form name;
+      2. if 'formname' is an integer, it's tried as an index.
+
+    Form controls are matched against 'fieldname' as follows:
+      1. unique exact match to control name;
+      2. unique regexp match to control name;
+      3. if fieldname is an integer, it's tried as an index;
+      4. unique & exact match to submit-button values.
+
+    Formvalue ignores read-only fields completely; if they're readonly,
+    nothing is done, unless the config options ('config' command) are
+    changed.
+
+    'formvalue' is available as 'fv' as well.
+    """
+    form = browser.get_form(formname)
+    if not form:
+        raise TwillAssertionError("no matching forms!")
+
+    control = browser.get_form_field(form, fieldname)
+
+    browser.clicked(form, control)
+
+    if control.readonly and _options['readonly_controls_writeable']:
+        print>>OUT, 'forcing read-only form field to writeable'
+        control.readonly = False
+        
+    if control.readonly or isinstance(control, ClientForm.IgnoreControl):
+        print>>OUT, 'form field is read-only or ignorable; nothing done.'
+        return
+
+    if isinstance(control, ClientForm.FileControl):
+        raise TwillException('form field is for file upload; use "formfile" instead')
+
+    set_form_control_value(control, value)
+
+fv = formvalue
+
+def formaction(formname, action):
+    """
+    >> formaction <formname> <action_url>
+
+    Sets action parameter on form to action_url
+    """
+    form = browser.get_form(formname)
+    form.action = action
+
+fa = formaction
+
+def formfile(formname, fieldname, filename, content_type=None):
+    """
+    >> formfile <form> <field> <filename> [ <content_type> ]
+
+    Upload a file via an "upload file" form field.
+    """
+    import os.path
+    filename = filename.replace('/', os.path.sep)
+
+    form = browser.get_form(formname)
+    control = browser.get_form_field(form, fieldname)
+
+    if not control.is_of_kind('file'):
+        raise TwillException('ERROR: field is not a file upload field!')
+
+    browser.clicked(form, control)
+    fp = open(filename, 'rb')
+    control.add_file(fp, content_type, filename)
+
+    print>>OUT, '\nAdded file "%s" to file upload field "%s"\n' % (filename,
+                                                             control.name,)
+
+def extend_with(module_name):
+    """
+    >> extend_with <module>
+    
+    Import contents of given module.
+    """
+    global_dict, local_dict = get_twill_glocals()
+
+    exec "from %s import *" % (module_name,) in global_dict
+
+    ### now add the commands into the commands available for the shell,
+    ### and print out some nice stuff about what the extension module does.
+
+    import sys
+    mod = sys.modules.get(module_name)
+
+    ###
+
+    import twill.shell, twill.parse
+    
+    fnlist = getattr(mod, '__all__', None)
+    if fnlist is None:
+        fnlist = [ fn for fn in dir(mod) if callable(getattr(mod, fn)) ]
+
+    for command in fnlist:
+        fn = getattr(mod, command)
+        twill.shell.add_command(command, fn.__doc__)
+        twill.parse.command_list.append(command)
+
+    ###
+    
+    print>>OUT, "Imported extension module '%s'." % (module_name,)
+    print>>OUT, "(at %s)\n" % (mod.__file__,)
+
+    if twill.shell.interactive:
+        if mod.__doc__:
+            print>>OUT, "Description:\n\n%s\n" % (mod.__doc__.strip(),)
+        else:
+            if fnlist:
+                print>>OUT, 'New commands:\n'
+                for name in fnlist:
+                    print>>OUT, '\t', name
+
+                print>>OUT, ''
+
+def getinput(prompt):
+    """
+    >> getinput <prompt>
+    Get input, store it in '__input__'.
+    """
+    _, local_dict = get_twill_glocals()
+
+    inp = raw_input(prompt)
+
+    local_dict['__input__'] = inp
+    return inp
+
+def getpassword(prompt):
+    """
+    >> getpassword <prompt>
+    
+    Get a password ("invisible input"), store it in '__password__'.
+    """
+    _, local_dict = get_twill_glocals()
+
+    inp = getpass.getpass(prompt)
+
+    local_dict['__password__'] = inp
+    return inp
+
+def save_cookies(filename):
+    """
+    >> save_cookies <filename>
+
+    Save all of the current cookies to the given file.
+    """
+    browser.save_cookies(filename)
+
+def load_cookies(filename):
+    """
+    >> load_cookies <filename>
+
+    Clear the cookie jar and load cookies from the given file.
+    """
+    browser.load_cookies(filename)
+
+def clear_cookies():
+    """
+    >> clear_cookies
+
+    Clear the cookie jar.
+    """
+    browser.clear_cookies()
+
+def show_cookies():
+    """
+    >> show_cookies
+
+    Show all of the cookies in the cookie jar.
+    """
+    browser.show_cookies()
+
+def add_auth(realm, uri, user, passwd):
+    """
+    >> add_auth <realm> <uri> <user> <passwd>
+
+    Add HTTP Basic Authentication information for the given realm/uri.
+    """
+    # swap around the type of HTTPPasswordMgr and
+    # HTTPPasswordMgrWithDefaultRealm depending on if with_default_realm 
+    # is on or not.
+    if _options['with_default_realm']:
+        realm = None
+
+        if browser.creds.__class__ == mechanize.HTTPPasswordMgr:
+            passwds = browser.creds.passwd
+            browser.creds = mechanize.HTTPPasswordMgrWithDefaultRealm()
+            browser.creds.passwd = passwds
+            print>>OUT, 'Changed to using HTTPPasswordMgrWithDefaultRealm'
+    else:
+        if browser.creds.__class__ == mechanize.HTTPPasswordMgrWithDefaultRealm:
+            passwds = browser.creds.passwd
+            browser.creds = mechanize.HTTPPasswordMgr()
+            browser.creds.passwd = passwds
+            print>>OUT, 'Changed to using HTTPPasswordMgr'
+
+    browser.creds.add_password(realm, uri, user, passwd)
+
+    print>>OUT, "Added auth info: realm '%s' / URI '%s' / user '%s'" % (realm,
+                                                                  uri,
+                                                                  user,)
+
+def debug(what, level):
+    """
+    >> debug <what> <level>
+
+    <what> can be:
+       * http (any level >= 1), to display the HTTP transactions.
+       * commands (any level >= 1), to display the commands being executed.
+       * equiv-refresh (any level >= 1) to display HTTP-EQUIV refresh handling.
+    """
+    import parse
+
+    try:
+        level = int(level)
+    except ValueError:
+        flag = utils.make_boolean(level)
+        if flag:
+            level = 1
+        else:
+            level = 0
+
+    print>>OUT, 'DEBUG: setting %s debugging to level %d' % (what, level)
+    
+    if what == "http":
+        browser._browser.set_debug_http(level)
+    elif what == 'equiv-refresh':
+        if level:
+            utils._debug_print_refresh = True
+        else:
+            utils._debug_print_refresh = False
+    elif what == 'commands':
+        if level:
+            parse.debug_print_commands(True)
+        else:
+            parse.debug_print_commands(False)
+    else:
+        raise TwillException('unknown debugging type: "%s"' % (what,))
+
+def run(cmd):
+    """
+    >> run <command>
+
+    <command> can be any valid python command; 'exec' is used to run it.
+    """
+    # @CTB: use pyparsing to grok the command?  make sure that quoting works...
+    
+    # execute command.
+    global_dict, local_dict = get_twill_glocals()
+    
+    import commands
+
+    # set __url__
+    local_dict['__cmd__'] = cmd
+    local_dict['__url__'] = commands.browser.get_url()
+
+    exec(cmd, global_dict, local_dict)
+
+def runfile(*files):
+    """
+    >> runfile <file1> [ <file2> ... ]
+
+    """
+    import parse
+    global_dict, local_dict = get_twill_glocals()
+
+    for f in files:
+        parse.execute_file(f, no_reset=True)
+
+def setglobal(name, value):
+    """
+    setglobal <name> <value>
+
+    Sets the variable <name> to the value <value> in the global namespace.
+    """
+    global_dict, local_dict = get_twill_glocals()
+    global_dict[name] = value
+
+def setlocal(name, value):
+    """
+    setlocal <name> <value>
+
+    Sets the variable <name> to the value <value> in the local namespace.
+    """
+    global_dict, local_dict = get_twill_glocals()
+    local_dict[name] = value
+
+def title(what):
+    """
+    >> title <regexp>
+    
+    Succeed if the regular expression is in the page title.
+    """
+    regexp = re.compile(what)
+    title = browser.get_title()
+
+    print>>OUT, "title is '%s'." % (title,)
+
+    m = regexp.search(title)
+    if not m:
+        raise TwillAssertionError("title does not contain '%s'" % (what,))
+
+    if m.groups():
+        match_str = m.group(1)
+    else:
+        match_str = m.group(0)
+
+    global_dict, local_dict = get_twill_glocals()
+    local_dict['__match__'] = match_str
+    return match_str
+
+def redirect_output(filename):
+    """
+    >> redirect_output <filename>
+
+    Append all twill output to the given file.
+    """
+    import twill
+    fp = open(filename, 'a')
+    twill.set_output(fp)
+
+def reset_output():
+    """
+    >> reset_output
+
+    Reset twill output to go to the screen.
+    """
+    import twill
+    twill.set_output(None)
+
+def redirect_error(filename):
+    """
+    >> redirect_error <filename>
+
+    Append all twill error output to the given file.
+    """
+    import twill
+    fp = open(filename, 'a')
+    twill.set_errout(fp)
+
+def reset_error():
+    """
+    >> reset_error
+    
+    Reset twill error output to go to the screen.
+    """
+    import twill
+    twill.set_errout(None)
+
+def add_extra_header(header_key, header_value):
+    """
+    >> add_header <name> <value>
+
+    Add an HTTP header to each HTTP request.  See 'show_extra_headers' and
+    'clear_extra_headers'.
+    """
+    browser._browser.addheaders += [(header_key, header_value)]
+
+def show_extra_headers():
+    """
+    >> show_extra_headers
+
+    Show any extra headers being added to each HTTP request.
+    """
+    l = browser._browser.addheaders
+
+    if l:
+        print 'The following HTTP headers are added to each request:'
+    
+        for k, v in l:
+            print '  "%s" = "%s"' % (k, v,)
+            
+        print ''
+    else:
+        print '** no extra HTTP headers **'
+
+def clear_extra_headers():
+    """
+    >> clear_extra_headers
+
+    Remove all user-defined HTTP headers.  See 'add_extra_header' and
+    'show_extra_headers'.
+    """
+    browser._browser.addheaders = []
+
+### options
+
+_orig_options = dict(readonly_controls_writeable=False,
+                     use_tidy=True,
+                     require_tidy=False,
+                     use_BeautifulSoup=True,
+                     require_BeautifulSoup=False,
+                     allow_parse_errors=True,
+                     with_default_realm=False,
+                     acknowledge_equiv_refresh=True
+                     )
+
+_options = {}
+_options.update(_orig_options)           # make a copy
+
+def config(key=None, value=None):
+    """
+    >> config [<key> [<int value>]]
+
+    Configure/report various options.  If no <value> is given, report
+    the current key value; if no <key> given, report current settings.
+
+    So far:
+
+     * 'acknowledge_equiv_refresh', default 1 -- follow HTTP-EQUIV=REFRESH
+     * 'readonly_controls_writeable', default 0 -- make ro controls writeable
+     * 'require_tidy', default 0 -- *require* that tidy be installed
+     * 'use_BeautifulSoup', default 1 -- use the BeautifulSoup parser
+     * 'use_tidy', default 1 -- use tidy, if it's installed
+     * 'with_default_realm', default 0 -- use a default realm for HTTP AUTH
+
+    Deprecated:
+     * 'allow_parse_errors' has been removed.
+    """
+    import utils
+    
+    if key is None:
+        keys = _options.keys()
+        keys.sort()
+
+        print>>OUT, 'current configuration:'
+        for k in keys:
+            print>>OUT, '\t%s : %s' % (k, _options[k])
+        print>>OUT, ''
+    else:
+        v = _options.get(key)
+        if v is None:
+            print>>OUT, '*** no such configuration key', key
+            print>>OUT, 'valid keys are:', ";".join(_options.keys())
+            raise TwillException('no such configuration key: %s' % (key,))
+        elif value is None:
+            print>>OUT, ''
+            print>>OUT, 'key %s: value %s' % (key, v)
+            print>>OUT, ''
+        else:
+            value = utils.make_boolean(value)
+            _options[key] = value
+
+def info():
+    """
+    >> info
+
+    Report information on current page.
+    """
+    current_url = browser.get_url()
+    if current_url is None:
+        print "We're not on a page!"
+        return
+    
+    content_type = browser._browser._response.info().getheaders("content-type")
+    check_html = is_html(content_type, current_url)
+
+    code = browser.get_code()
+
+
+    print >>OUT, '\nPage information:'
+    print >>OUT, '\tURL:', current_url
+    print >>OUT, '\tHTTP code:', code
+    print >>OUT, '\tContent type:', content_type[0],
+    if check_html:
+        print >>OUT, '(HTML)'
+    else:
+        print ''
+    if check_html:
+        title = browser.get_title()
+        print >>OUT, '\tPage title:', title
+
+        forms = browser.get_all_forms()
+        if len(forms):
+            print >>OUT, '\tThis page contains %d form(s)' % (len(forms),)
+            
+    print >>OUT, ''
Index: /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/_browser.py
===================================================================
--- /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/_browser.py (revision 3)
+++ /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/_browser.py (revision 3)
@@ -0,0 +1,36 @@
+"""
+A subclass of the mechanize browser patched to fix various bits.
+"""
+
+# wwwsearch imports
+from _mechanize_dist import Browser as MechanizeBrowser
+
+import wsgi_intercept
+from utils import FixedHTTPBasicAuthHandler, FunctioningHTTPRefreshProcessor
+
+def build_http_handler():
+    from _mechanize_dist._urllib2 import HTTPHandler
+
+    class MyHTTPHandler(HTTPHandler):
+        def http_open(self, req):
+            return self.do_open(wsgi_intercept.WSGI_HTTPConnection, req)
+
+    return MyHTTPHandler
+
+class PatchedMechanizeBrowser(MechanizeBrowser):
+    """
+    A patched version of the mechanize browser class.  Currently
+    installs the WSGI intercept handler & fixes a problem with
+    mechanize/urllib2 Basic Authentication.
+    """
+    def __init__(self, *args, **kwargs):
+        # install WSGI intercept handler.
+        self.handler_classes['http'] = build_http_handler()
+
+        # fix basic auth.
+        self.handler_classes['_basicauth'] = FixedHTTPBasicAuthHandler
+
+        # make refresh work even for somewhat mangled refresh directives.
+        self.handler_classes['_refresh'] = FunctioningHTTPRefreshProcessor
+
+        MechanizeBrowser.__init__(self, *args, **kwargs)
Index: /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/browser.py
===================================================================
--- /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/browser.py (revision 3)
+++ /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/browser.py (revision 3)
@@ -0,0 +1,549 @@
+"""
+Implements TwillBrowser, a simple stateful wrapper for mechanize.Browser.
+
+See _browser.py for mechanize code.
+"""
+
+OUT=None
+
+# Python imports
+import re
+
+# wwwsearch imports
+import _mechanize_dist as mechanize
+from _mechanize_dist import BrowserStateError, LinkNotFoundError, ClientForm
+
+# twill package imports
+from _browser import PatchedMechanizeBrowser
+from utils import print_form, ConfigurableParsingFactory, \
+     ResultWrapper, unique_match, HistoryStack
+from errors import TwillException
+     
+
+#
+# TwillBrowser
+#
+
+class TwillBrowser(object):
+    """
+    Wrap mechanize behavior in a simple stateful way.
+
+    Public variables:
+
+      * result -- mechanize-style 'result' object.
+    """
+    def __init__(self):
+        #
+        # create special link/forms parsing code to run tidy on HTML first.
+        #
+        
+        factory = ConfigurableParsingFactory()
+
+        #
+        # Create the mechanize browser.
+        #
+        
+        b = PatchedMechanizeBrowser(history=HistoryStack(), factory=factory)
+
+        self._browser = b
+        
+        self.result = None
+        self.last_submit_button = None
+
+        #
+        # create & set a cookie jar.
+        #
+        
+        policy = mechanize.DefaultCookiePolicy(rfc2965=True)
+        cj = mechanize.LWPCookieJar(policy=policy)
+        self._browser.set_cookiejar(cj)
+        self.cj = cj
+
+        # Ask for MIME type 'text/html' by preference.
+        self._browser.addheaders = [("Accept", "text/html; */*")]
+
+        # ignore robots.txt
+        self._browser.set_handle_robots(None)
+
+        # create an HTTP auth handler
+        self.creds = mechanize.HTTPPasswordMgr()
+
+        # do handle HTTP-EQUIV properly.
+        self._browser.set_handle_equiv(True)
+
+        # callables to be called after each page load.
+        self._post_load_hooks = []
+
+    ### get/set HTTP authentication stuff.
+
+    def _set_creds(self, creds):
+        self._creds = creds
+        self._browser.set_password_manager(creds)
+
+    def _get_creds(self):
+        return self._creds
+
+    creds = property(_get_creds, _set_creds)
+        
+    def go(self, url):
+        """
+        Visit given URL.
+        """
+        try_urls = [ url, ]
+
+        # if this is an absolute URL that is just missing the 'http://' at
+        # the beginning, try fixing that.
+        
+        if url.find('://') == -1:
+            full_url = 'http://%s' % (url,)  # mimic browser behavior
+            try_urls.append(full_url)
+
+        # if this is a '?' URL, then assume that we want to tack it onto
+        # the end of the current URL.
+
+        if url.startswith('?'):
+            current_url = self.get_url()
+            current_url = current_url.split('?')[0]
+            try_urls = [ current_url + url, ]
+
+        success = False
+
+        for u in try_urls:
+            try:
+                self._journey('open', u)
+                success = True
+                break
+            except IOError:             # @CTB test this!
+                pass
+
+        if success:
+            print>>OUT, '==> at', self.get_url()
+        else:
+            raise BrowserStateError("cannot go to '%s'" % (url,))
+
+    def reload(self):
+        """
+        Tell the browser to reload the current page.
+        """
+        self._journey('reload')
+        print>>OUT, '==> reloaded'
+
+    def back(self):
+        """
+        Return to previous page, if possible.
+        """
+        try:
+            self._journey('back')
+            print>>OUT, '==> back to', self.get_url()
+        except BrowserStateError:
+            print>>OUT, '==> back at empty page.'
+
+    def get_code(self):
+        """
+        Get the HTTP status code received for the current page.
+        """
+        if self.result:
+            return self.result.get_http_code()
+        return None
+
+    def get_html(self):
+        """
+        Get the HTML for the current page.
+        """
+        if self.result:
+            return self.result.get_page()
+        return None
+
+    def get_title(self):
+        """
+        Get content of the HTML title element for the current page.
+        """
+        return self._browser.title()
+
+    def get_url(self):
+        """
+        Get the URL of the current page.
+        """
+        if self.result:
+            return self.result.get_url()
+        return None
+
+    def find_link(self, pattern):
+        """
+        Find the first link with a URL, link text, or name matching the
+        given pattern.
+        """
+
+        #
+        # first, try to find a link matching that regexp.
+        #
+        
+        try:
+            l = self._browser.find_link(url_regex=pattern)
+        except LinkNotFoundError:
+
+            #
+            # then, look for a text match.
+            #
+            
+            try:
+                l = self._browser.find_link(text_regex=pattern)
+            except LinkNotFoundError:
+                #
+                # finally, look for a name match.
+                #
+                
+                try:
+                    l = self._browser.find_link(name_regex=pattern)
+                except LinkNotFoundError:
+                    l = None
+
+        return l
+
+    def follow_link(self, link):
+        """
+        Follow the given link.
+        """
+        self._journey('follow_link', link)
+        print>>OUT, '==> at', self.get_url()
+
+    def set_agent_string(self, agent):
+        """
+        Set the agent string to the given value.
+        """
+        for i in xrange(len(self._browser.addheaders)):
+            if self._browser.addheaders[i][0] == "User-agent":
+                del self._browser.addheaders[i]
+                break
+        self._browser.addheaders += [("User-agent", agent)]
+
+    def showforms(self):
+        """
+        Pretty-print all of the forms.  Include the global form (form
+        elements outside of <form> pairs) as forms[0] iff present.
+        """
+        forms = self.get_all_forms()
+        
+        for n, f in enumerate(forms):
+            print_form(n, f, OUT)
+
+    def showlinks(self):
+        """
+        Pretty-print all of the links.
+        """
+        print>>OUT, 'Links:\n'
+        for n, link in enumerate(self._browser.links()):
+            print>>OUT, "%d. %s ==> %s" % (n, link.text, link.url,)
+        print>>OUT, ''
+
+    def showhistory(self):
+        """
+        Pretty-print the history of links visited.
+        """
+        print>>OUT, ''
+        print>>OUT, 'History: (%d pages total) ' % (len(self._browser._history))
+
+        n = 1
+        for (req, resp) in self._browser._history:
+            if req and resp:            # only print those that back() will go
+                print>>OUT, "\t%d. %s" % (n, resp.geturl())
+                n += 1
+            
+        print>>OUT, ''
+
+    def get_all_forms(self):
+        """
+        Return a list of all of the forms, with global_form at index 0
+        iff present.
+        """
+        global_form = self._browser.global_form()
+        forms = list(self._browser.forms())
+
+        if global_form.controls:
+            forms.insert(0, global_form)
+            
+        return forms
+
+    def get_form(self, formname):
+        """
+        Return the first form that matches 'formname'.
+        """
+        formname = str(formname)
+        
+        forms = self.get_all_forms()
+        
+        # first try ID
+        for f in forms:
+            id = f.attrs.get("id")
+            if id and str(id) == formname:
+                return f
+        
+        # next try regexps
+        regexp = re.compile(formname)
+        for f in forms:
+            if f.name and regexp.search(f.name):
+                return f
+
+        # ok, try number
+        try:
+            formnum = int(formname)
+            if formnum >= 1 and formnum <= len(forms):
+                return forms[formnum - 1]
+        except ValueError:              # int() failed
+            pass
+        except IndexError:              # formnum was incorrect
+            pass
+
+        return None
+
+    def get_form_field(self, form, fieldname):
+        """
+        Return the control that matches 'fieldname'.  Must be
+        a *unique* regexp/exact string match.
+        """
+        fieldname = str(fieldname)
+        
+        found = None
+        found_multiple = False
+
+        matches = [ c for c in form.controls if str(c.id) == fieldname ]
+
+        # test exact match.
+        if matches:
+            if unique_match(matches):
+                found = matches[0]
+            else:
+                found_multiple = True   # record for error reporting.
+        
+        matches = [ c for c in form.controls if str(c.name) == fieldname ]
+
+        # test exact match.
+        if matches:
+            if unique_match(matches):
+                found = matches[0]
+            else:
+                found_multiple = True   # record for error reporting.
+
+        # test index.
+        if found is None:
+            # try num
+            clickies = [c for c in form.controls]
+            try:
+                fieldnum = int(fieldname) - 1
+                found = clickies[fieldnum]
+            except ValueError:          # int() failed
+                pass
+            except IndexError:          # fieldnum was incorrect
+                pass
+
+        # test regexp match
+        if found is None:
+            regexp = re.compile(fieldname)
+
+            matches = [ ctl for ctl in form.controls \
+                        if regexp.search(str(ctl.name)) ]
+
+            if matches:
+                if unique_match(matches):
+                    found = matches[0]
+                else:
+                    found_multiple = True # record for error
+
+        if found is None:
+            # try value, for readonly controls like submit keys
+            clickies = [ c for c in form.controls if c.value == fieldname \
+                         and c.readonly ]
+            if clickies:
+                if len(clickies) == 1:
+                    found = clickies[0]
+                else:
+                    found_multiple = True   # record for error
+
+        # error out?
+        if found is None:
+            if not found_multiple:
+                raise TwillException('no field matches "%s"' % (fieldname,))
+            else:
+                raise TwillException('multiple matches to "%s"' % (fieldname,))
+
+        return found
+
+    def clicked(self, form, control):
+        """
+        Record a 'click' in a specific form.
+        """
+        if self._browser.form != form:
+            # construct a function to choose a particular form; select_form
+            # can use this to pick out a precise form.
+
+            def choose_this_form(test_form, this_form=form):
+                if test_form is this_form:
+                    return True
+
+                return False
+
+            self._browser.select_form(predicate=choose_this_form)
+            assert self._browser.form == form
+
+            self.last_submit_button = None
+
+        # record the last submit button clicked.
+        if isinstance(control, ClientForm.SubmitControl):
+            self.last_submit_button = control
+
+    def submit(self, fieldname=None):
+        """
+        Submit the currently clicked form using the given field.
+        """
+        if fieldname is not None:
+            fieldname = str(fieldname)
+        
+        if not self.get_all_forms():
+            raise TwillException("no forms on this page!")
+        
+        ctl = None
+        
+        form = self._browser.form
+        if form is None:
+            forms = [ i for i in self.get_all_forms() ]
+            if len(forms) == 1:
+                form = forms[0]
+            else:
+                raise TwillException("""\
+more than one form; you must select one (use 'fv') before submitting\
+""")
+
+        # no fieldname?  see if we can use the last submit button clicked...
+        if not fieldname:
+            if self.last_submit_button:
+                ctl = self.last_submit_button
+            else:
+                # get first submit button in form.
+                submits = [ c for c in form.controls \
+                            if isinstance(c, ClientForm.SubmitControl) ]
+
+                if len(submits):
+                    ctl = submits[0]
+                
+        else:
+            # fieldname given; find it.
+            ctl = self.get_form_field(form, fieldname)
+
+        #
+        # now set up the submission by building the request object that
+        # will be sent in the form submission.
+        #
+        
+        if ctl:
+            # submit w/button
+            print>>OUT, """\
+Note: submit is using submit button: name="%s", value="%s"
+""" % (ctl.name, ctl.value)
+            
+            if isinstance(ctl, ClientForm.ImageControl):
+                request = ctl._click(form, (1,1), "", mechanize.Request)
+            else:
+                request = ctl._click(form, True, "", mechanize.Request)
+                
+        else:
+            # submit w/o submit button.
+            request = form._click(None, None, None, None, 0, None,
+                                  "", mechanize.Request)
+
+        #
+        # add referer information.  this may require upgrading the
+        # request object to have an 'add_unredirected_header' function.
+        #
+
+        upgrade = self._browser._ua_handlers.get('_http_request_upgrade')
+        if upgrade:
+            request = upgrade.http_request(request)
+            request = self._browser._add_referer_header(request)
+
+        #
+        # now actually GO.
+        #
+        
+        self._journey('open', request)
+
+    def save_cookies(self, filename):
+        """
+        Save cookies into the given file.
+        """
+        self.cj.save(filename, ignore_discard=True, ignore_expires=True)
+
+    def load_cookies(self, filename):
+        """
+        Load cookies from the given file.
+        """
+        self.cj.load(filename, ignore_discard=True, ignore_expires=True)
+
+    def clear_cookies(self):
+        """
+        Delete all of the cookies.
+        """
+        self.cj.clear()
+
+    def show_cookies(self):
+        """
+        Pretty-print all of the cookies.
+        """
+        print>>OUT, '''
+There are %d cookie(s) in the cookiejar.
+''' % (len(self.cj,))
+        
+        if len(self.cj):
+            for cookie in self.cj:
+                print>>OUT, '\t', cookie
+
+            print>>OUT, ''
+
+    #### private functions.
+
+    def _journey(self, func_name, *args, **kwargs):
+        """
+        'func_name' should be the name of a mechanize method that either
+        returns a 'result' object or raises a HTTPError, e.g.
+        one of 'open', 'reload', 'back', or 'follow_link'.
+
+        journey then runs that function with the given arguments and turns
+        the results into a nice friendly standard ResultWrapper object, which
+        is stored as 'self.result'.
+
+        All exceptions other than HTTPError are unhandled.
+        
+        (Idea stolen straight from PBP.)
+        """
+        # reset
+        self.last_submit_button = None
+        self.result = None
+
+        func = getattr(self._browser, func_name)
+        try:
+            r = func(*args, **kwargs)
+        except mechanize.HTTPError, e:
+            r = e
+
+        # seek back to 0 if a seek() function is present.
+        seek_fn = getattr(r, 'seek', None)
+        if seek_fn:
+            seek_fn(0)
+
+        # some URLs, like 'file:' URLs, don't have return codes.  In this
+        # case, assume success (code=200) if no such attribute.
+        code = getattr(r, 'code', 200)
+
+        ## special case refresh loops!?
+        if code == 'refresh':
+            raise TwillException("""\
+infinite refresh loop discovered; aborting.
+Try turning off acknowledge_equiv_refresh...""")
+
+        self.result = ResultWrapper(code, r.geturl(), r.read())
+
+        #
+        # Now call all of the post load hooks with the function name.
+        #
+        
+        for callable in self._post_load_hooks:
+            callable(func_name, *args, **kwargs)
Index: /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/wsgi_intercept.py
===================================================================
--- /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/wsgi_intercept.py (revision 3)
+++ /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/wsgi_intercept.py (revision 3)
@@ -0,0 +1,411 @@
+"""
+wsgi_intercept.WSGI_HTTPConnection is a replacement for
+httplib.HTTPConnection that intercepts certain HTTP connections into a
+WSGI application.
+
+Use 'add_wsgi_intercept' and 'remove_wsgi_intercept' to control this behavior.
+"""
+
+import sys
+from httplib import HTTPConnection
+import urllib
+from cStringIO import StringIO
+import traceback
+
+debuglevel = 0
+# 1 basic
+# 2 verbose
+
+####
+
+#
+# Specify which hosts/ports to target for interception to a given WSGI app.
+#
+# For simplicity's sake, intercept ENTIRE host/port combinations;
+# intercepting only specific URL subtrees gets complicated, because we don't
+# have that information in the HTTPConnection.connect() function that does the
+# redirection.
+#
+# format: key=(host, port), value=(create_app, top_url)
+#
+# (top_url becomes the SCRIPT_NAME)
+
+_wsgi_intercept = {}
+
+def add_wsgi_intercept(host, port, app_create_fn, script_name=''):
+    """
+    Add a WSGI intercept call for host:port, using the app returned
+    by app_create_fn with a SCRIPT_NAME of 'script_name' (default '').
+    """
+    _wsgi_intercept[(host, port)] = (app_create_fn, script_name)
+
+def remove_wsgi_intercept(host, port):
+    """
+    Remove the WSGI intercept call for (host, port).
+    """
+    key = (host, port)
+    if _wsgi_intercept.has_key(key):
+        del _wsgi_intercept[key]
+
+#
+# make_environ: behave like a Web server.  Take in 'input', and behave
+# as if you're bound to 'host' and 'port'; build an environment dict
+# for the WSGI app.
+#
+# This is where the magic happens, folks.
+#
+
+def make_environ(inp, host, port, script_name):
+    """
+    Take 'inp' as if it were HTTP-speak being received on host:port,
+    and parse it into a WSGI-ok environment dictionary.  Return the
+    dictionary.
+
+    Set 'SCRIPT_NAME' from the 'script_name' input, and, if present,
+    remove it from the beginning of the PATH_INFO variable.
+    """
+    #
+    # parse the input up to the first blank line (or its end).
+    #
+
+    environ = {}
+    
+    method_line = inp.readline()
+    
+    content_type = None
+    content_length = None
+    cookies = []
+    
+    for line in inp:
+        if not line.strip():
+            break
+
+        k, v = line.strip().split(':', 1)
+        v = v.lstrip()
+
+        #
+        # take care of special headers, and for the rest, put them
+        # into the environ with HTTP_ in front.
+        #
+
+        if k.lower() == 'content-type':
+            content_type = v
+        elif k.lower() == 'content-length':
+            content_length = v
+        elif k.lower() == 'cookie' or k.lower() == 'cookie2':
+            cookies.append(v)
+        else:
+            h = k.upper()
+            h = h.replace('-', '_')
+            environ['HTTP_' + h] = v
+            
+        if debuglevel >= 2:
+            print 'HEADER:', k, v
+
+    #
+    # decode the method line
+    #
+
+    if debuglevel >= 2:
+        print 'METHOD LINE:', method_line
+        
+    method, url, protocol = method_line.split(' ')
+
+    # clean the script_name off of the url, if it's there.
+    if not url.startswith(script_name):
+        script_name = ''                # @CTB what to do -- bad URL.  scrap?
+    else:
+        url = url[len(script_name):]
+
+    url = url.split('?', 1)
+    path_info = urllib.unquote_plus(url[0])
+    query_string = ""
+    if len(url) == 2:
+        query_string = urllib.unquote_plus(url[1])
+
+    if debuglevel:
+        print "method: %s; script_name: %s; path_info: %s; query_string: %s" % (method, script_name, path_info, query_string)
+
+    r = inp.read()
+    inp = StringIO(r)
+
+    #
+    # fill out our dictionary.
+    #
+    
+    environ.update({ "wsgi.version" : (1,0),
+                     "wsgi.url_scheme": "http",
+                     "wsgi.input" : inp,           # to read for POSTs
+                     "wsgi.errors" : StringIO(),
+                     "wsgi.multithread" : 0,
+                     "wsgi.multiprocess" : 0,
+                     "wsgi.run_once" : 0,
+    
+                     "REQUEST_METHOD" : method,
+                     "SCRIPT_NAME" : script_name,
+                     "PATH_INFO" : path_info,
+          
+                     "SERVER_NAME" : host,
+                     "SERVER_PORT" : str(port),
+                     "SERVER_PROTOCOL" : protocol,
+
+                     "REMOTE_ADDR" : '127.0.0.1',
+                     })
+
+    #
+    # query_string, content_type & length are optional.
+    #
+
+    if query_string:
+        environ['QUERY_STRING'] = query_string
+    else:
+        environ['QUERY_STRING'] = ''
+        
+    if content_type:
+        environ['CONTENT_TYPE'] = content_type
+        if debuglevel >= 2:
+            print 'CONTENT-TYPE:', content_type
+    if content_length:
+        environ['CONTENT_LENGTH'] = content_length
+        if debuglevel >= 2:
+            print 'CONTENT-LENGTH:', content_length
+
+    #
+    # handle cookies.
+    #
+    if cookies:
+        environ['HTTP_COOKIE'] = "; ".join(cookies)
+
+    if debuglevel:
+        print 'WSGI environ dictionary:', environ
+
+    return environ
+
+#
+# fake socket for WSGI intercept stuff.
+#
+
+class wsgi_fake_socket:
+    """
+    Handle HTTP traffic and stuff into a WSGI application object instead.
+
+    Note that this class assumes:
+    
+     1. 'makefile' is called (by the response class) only after all of the
+        data has been sent to the socket by the request class;
+     2. non-persistent (i.e. non-HTTP/1.1) connections.
+    """
+    def __init__(self, app, host, port, script_name):
+        self.app = app                  # WSGI app object
+        self.host = host
+        self.port = port
+        self.script_name = script_name  # SCRIPT_NAME (app mount point)
+
+        self.inp = StringIO()           # stuff written into this "socket"
+        self.write_results = []          # results from the 'write_fn'
+        self.results = None             # results from running the app
+        self.output = StringIO()        # all output from the app, incl headers
+
+    def makefile(self, *args, **kwargs):
+        """
+        'makefile' is called by the HTTPResponse class once all of the
+        data has been written.  So, in this interceptor class, we need to:
+        
+          1. build a start_response function that grabs all the headers
+             returned by the WSGI app;
+          2. create a wsgi.input file object 'inp', containing all of the
+             traffic;
+          3. build an environment dict out of the traffic in inp;
+          4. run the WSGI app & grab the result object;
+          5. concatenate & return the result(s) read from the result object.
+        """
+
+        # dynamically construct the start_response function for no good reason.
+
+        def start_response(status, headers, exc_info=None):
+            # construct the HTTP request.
+            self.output.write("HTTP/1.0 " + status + "\n")
+            
+            for k, v in headers:
+                self.output.write('%s: %s\n' % (k, v,))
+            self.output.write('\n')
+
+            def write_fn(s):
+                self.write_results.append(s)
+            return write_fn
+
+        # construct the wsgi.input file from everything that's been
+        # written to this "socket".
+        inp = StringIO(self.inp.getvalue())
+
+        # build the environ dictionary.
+        environ = make_environ(inp, self.host, self.port, self.script_name)
+
+        # run the application.
+        app_result = self.app(environ, start_response)
+        self.result = iter(app_result)
+
+        ###
+
+        # read all of the results.  the trick here is to get the *first*
+        # bit of data from the app via the generator, *then* grab & return
+        # the data passed back from the 'write' function, and then return
+        # the generator data.  this is because the 'write' fn doesn't
+        # necessarily get called until the first result is requested from
+        # the app function.
+        #
+        # see twill tests, 'test_wrapper_intercept' for a test that breaks
+        # if this is done incorrectly.
+
+        try:
+            generator_data = None
+            try:
+                generator_data = self.result.next()
+
+            finally:
+                for data in self.write_results:
+                    self.output.write(data)
+
+            if generator_data:
+                self.output.write(generator_data)
+
+                while 1:
+                    data = self.result.next()
+                    self.output.write(data)
+                    
+        except StopIteration:
+            pass
+
+        if hasattr(app_result, 'close'):
+            app_result.close()
+            
+        if debuglevel >= 2:
+            print "***", self.output.getvalue(), "***"
+
+        # return the concatenated results.
+        return StringIO(self.output.getvalue())
+
+    def sendall(self, str):
+        """
+        Save all the traffic to self.inp.
+        """
+        if debuglevel >= 2:
+            print ">>>", str, ">>>"
+
+        self.inp.write(str)
+
+    def close(self):
+        "Do nothing, for now."
+        pass
+
+#
+# WSGI_HTTPConnection
+#
+
+class WSGI_HTTPConnection(HTTPConnection):
+    """
+    Intercept all traffic to certain hosts & redirect into a WSGI
+    application object.
+    """
+    def get_app(self, host, port):
+        """
+        Return the app object for the given (host, port).
+        """
+        key = (host, int(port))
+
+        app, script_name = None, None
+        
+        if _wsgi_intercept.has_key(key):
+            (app_fn, script_name) = _wsgi_intercept[key]
+            app = app_fn()
+
+        return app, script_name        
+    
+    def connect(self):
+        """
+        Override the connect() function to intercept calls to certain
+        host/ports.
+        """
+        if debuglevel:
+            sys.stderr.write('connect: %s, %s\n' % (self.host, self.port,))
+                             
+        try:
+            (app, script_name) = self.get_app(self.host, self.port)
+            if app:
+                if debuglevel:
+                    sys.stderr.write('INTERCEPTING call to %s:%s\n' % \
+                                     (self.host, self.port,))
+                self.sock = wsgi_fake_socket(app, self.host, self.port,
+                                             script_name)
+            else:
+                HTTPConnection.connect(self)
+                
+        except Exception, e:
+            if debuglevel:              # intercept & print out tracebacks
+                traceback.print_exc()
+            raise
+
+### DEBUGGING CODE -- to help me figure out communications stuff. ###
+
+# (ignore me, please)
+
+'''
+import socket
+    
+class file_wrapper:
+    def __init__(self, fp):
+        self.fp = fp
+
+    def readline(self):
+        d = self.fp.readline()
+        if debuglevel:
+            print 'file_wrapper readline:', d
+        return d
+
+    def __iter__(self):
+        return self
+
+    def next(self):
+        d = self.fp.next()
+        if debuglevel:
+            print 'file_wrapper next:', d
+        return d
+
+    def read(self, *args):
+        d = self.fp.read(*args)
+        if debuglevel:
+            print 'file_wrapper read:', d
+        return d
+
+    def close(self):
+        if debuglevel:
+            print 'file_wrapper close'
+        self.fp.close()
+
+class intercept_socket:
+    """
+    A socket that intercepts everything written to it & read from it.
+    """
+
+    def __init__(self):
+        for res in socket.getaddrinfo("floating.caltech.edu", 80, 0,
+                                      socket.SOCK_STREAM):
+            af, socktype, proto, canonname, sa = res
+            self.sock = socket.socket(af, socktype, proto)
+            self._open = True
+            self.sock.connect(sa)
+            break
+
+    def makefile(self, *args, **kwargs):
+        fp = self.sock.makefile('rb', 0)
+        return file_wrapper(fp)
+
+    def sendall(self, str):
+        if not self._open:
+            raise Exception
+
+        return self.sock.sendall(str)
+    
+    def close(self):
+        self._open = False
+'''
Index: /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/shell.py
===================================================================
--- /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/shell.py (revision 3)
+++ /galaxy-central/eggs/twill-0.9-py2.6.egg/twill/shell.py (revision 3)
@@ -0,0 +1,393 @@
+"""
+A command-line interpreter for twill.
+
+This is an implementation of a command-line interpreter based on the
+'Cmd' class in the 'cmd' package of the default Python distribution.
+"""
+
+import cmd
+from twill import commands, parse, __version__
+import namespaces
+
+try:
+    import readline
+except:
+    readline = None
+
+def make_cmd_fn(cmd):
+    """
+    Dynamically define a twill shell command function based on an imported
+    function name.  (This is where the twill.commands functions actually
+    get executed.)
+    """
+    
+    def do_cmd(rest_of_line, cmd=cmd):
+        global_dict, local_dict = namespaces.get_twill_glocals()
+
+        args = []
+        if rest_of_line.strip() != "":
+            try:
+                args = parse.arguments.parseString(rest_of_line)[0]
+                args = parse.process_args(args, global_dict,local_dict)
+            except Exception, e:
+                print '\nINPUT ERROR: %s\n' % (str(e),)
+                return
+
+        try:
+            parse.execute_command(cmd, args, global_dict, local_dict,
+                                  "<shell>")
+        except SystemExit:
+            raise
+        except Exception, e:
+            print '\nERROR: %s\n' % (str(e),)
+
+    return do_cmd
+
+def make_help_cmd(cmd, docstring):
+    """
+    Dynamically define a twill shell help function for the given
+    command/docstring.
+    """
+    def help_cmd(message=docstring, cmd=cmd):
+        print '=' * 15
+        print '\nHelp for command %s:\n' % (cmd,)
+        print message.strip()
+        print ''
+        print '=' * 15
+        print ''
+        
+    return help_cmd
+
+###
+
+class Singleton(object):
+    def __new__(cls, *args, **kwds):
+        it = cls.__dict__.get("__it__")
+        if it is not None:
+            return it
+        cls.__it__ = it = object.__new__(cls)
+        it.init(*args, **kwds)
+        return it
+    
+    def init(self, *args, **kwds):
+        pass
+
+#
+# TwillCommandLoop
+#
+
+def add_command(cmd, docstring):
+    x = get_command_shell()
+    if x:
+        x.add_command(cmd, docstring)
+        
+def get_command_shell():
+    return getattr(TwillCommandLoop, '__it__', None)
+
+class TwillCommandLoop(Singleton, cmd.Cmd):
+    """
+    Command-line interpreter for twill commands.  Singleton object: you
+    can't create more than one of these at a time.
+
+    Note: most of the do_ and help_ functions are dynamically created
+    by the metaclass.
+    """
+    def init(self, **kw):
+        if kw.has_key('stdin'):
+            cmd.Cmd.__init__(self, None, stdin=kw['stdin'])
+            self.use_rawinput = False
+        else:
+            cmd.Cmd.__init__(self)
+
+        # initialize a new local namespace.
+        namespaces.new_local_dict()
+
+        # import readline history, if available.
+        if readline:
+            try:
+                readline.read_history_file('.twill-history')
+            except IOError:
+                pass
+
+        # fail on unknown commands? for test-shell, primarily.
+        self.fail_on_unknown = kw.get('fail_on_unknown', False)
+
+        # handle initial URL argument
+        if kw.get('initial_url'):
+            commands.go(kw['initial_url'])
+            
+        self._set_prompt()
+
+        self.names = []
+        
+        global_dict, local_dict = namespaces.get_twill_glocals()
+
+        ### add all of the commands from twill.
+        for command in parse.command_list:
+            fn = global_dict.get(command)
+            self.add_command(command, fn.__doc__)
+
+    def add_command(self, command, docstring):
+        """
+        Add the given command into the lexicon of all commands.
+        """
+        do_name = 'do_%s' % (command,)
+        do_cmd = make_cmd_fn(command)
+        setattr(self, do_name, do_cmd)
+
+        if docstring:
+            help_cmd = make_help_cmd(command, docstring)
+            help_name = 'help_%s' % (command,)
+            setattr(self, help_name, help_cmd)
+
+        self.names.append(do_name)
+
+    def get_names(self):
+        """
+        Return the list of commands.
+        """
+        return self.names
+
+    def complete_formvalue(self, text, line, begin, end):
+        # formvalue <formname> <field> <value>
+        cmd, args = parse.parse_command(line + '.', {}, {})
+        place = len(args)
+        if place == 1:
+            return self.provide_formname(text)
+        elif place == 2:
+            formname = args[0]
+            return self.provide_field(formname, text)
+        return []
+    complete_fv = complete_formvalue
+
+    def provide_formname(self, prefix):
+        names = []
+        forms = commands.browser._browser.forms()
+        for f in forms:
+            id = f.attrs.get('id')
+            if id and id.startswith(prefix):
+                names.append(id)
+                continue
+            name = f.name
+            if name and name.startswith(prefix):
+                names.append(name)
+        return names
+
+    def provide_field(self, formname, prefix):
+        names = []
+        form = commands.browser.get_form(formname)
+        if not form:
+            return []
+        for c in form.controls:
+            id = c.id
+            if id and id.startswith(prefix):
+                names.append(id)
+                continue
+            name = c.name
+            if name and name.startswith(prefix):
+                names.append(name)
+        return names
+
+    def _set_prompt(self):
+        "Set the prompt to the current page."
+        url = commands.browser.get_url()
+        if url is None:
+            url = " *empty page* "
+        self.prompt = "current page: %s\n>> " % (url,)
+
+    def precmd(self, line):
+        "Run before each command; save."
+        return line
+
+    def postcmd(self, stop, line):
+        "Run after each command; set prompt."
+        self._set_prompt()
+        
+        return stop
+
+    def default(self, line):
+        "Called when unknown command is executed."
+
+        # empty lines ==> emptyline(); here we just want to remove
+        # leading whitespace.
+        line = line.strip()
+
+        # look for command
+        global_dict, local_dict = namespaces.get_twill_glocals()
+        cmd, args = parse.parse_command(line, global_dict, local_dict)
+
+        # ignore comments & empty stuff
+        if cmd is None:
+            return
+
+        try:
+            parse.execute_command(cmd, args, global_dict, local_dict,
+                                  "<shell>")
+        except SystemExit:
+            raise
+        except Exception, e:
+            print '\nERROR: %s\n' % (str(e),)
+            if self.fail_on_unknown:
+                raise
+
+    def emptyline(self):
+        "Ignore empty lines."
+        pass
+
+    def do_EOF(self, *args):
+        "Exit on CTRL-D"
+        if readline:
+            readline.write_history_file('.twill-history')
+            
+        raise SystemExit()
+
+    def help_help(self):
+        print "\nWhat do YOU think the command 'help' does?!?\n"
+
+    def do_version(self, *args):
+        print "\ntwill version %s.\n" % (__version__,)
+        print "See http://www.idyll.org/~t/www-tools/twill/ for more info."
+        print ""
+
+    def help_version(self):
+        print "\nPrint version information.\n"
+
+    def do_exit(self, *args):
+        raise SystemExit()
+
+    def help_exit(self):
+        print "\nExit twill.\n"
+
+    do_quit = do_exit
+    help_quit = help_exit
+
+####
+
+twillargs = []                          # contains sys.argv *after* last '--'
+interactive = False                     # 'True' if interacting with user
+def main():
+    global twillargs, interactive
+    
+    import sys
+    from twill import TwillCommandLoop, execute_file, __version__
+    from twill.utils import gather_filenames
+    from optparse import OptionParser
+    from cStringIO import StringIO
+
+    ###
+    # make sure that the current working directory is in the path.  does this
+    # work on Windows??
+
+    if not '.' in sys.path:
+        sys.path.append('.')
+    ###
+
+    #### OPTIONS
+
+    parser = OptionParser()
+
+    parser.add_option('-q', '--quiet', action="store_true", dest="quiet",
+                      help = 'do not show normal output')
+
+    parser.add_option('-i', '--interactive', action="store_true", dest="interact",
+              help = 'drop into an interactive shell after running files (if any)')
+
+    parser.add_option('-f', '--fail', action="store_true", dest="fail",
+                      help = 'fail exit on first file to fail')
+
+    parser.add_option('-n', '--never-fail', action="store_true",
+                      dest="never_fail",
+                      help = 'continue executing scripts past errors')
+
+    parser.add_option('-v', '--version', action="store_true", dest="show_version",
+                      help = 'show version information and exit')
+
+    parser.add_option('-u', '--url', nargs=1, action="store", dest="url",
+                      help="start at the given URL before each script")
+
+    ####
+
+    # parse arguments.
+    sysargs = sys.argv[1:]
+    if '--' in sysargs:
+        found = False
+        for last in range(len(sysargs) - 1, -1, -1):
+            if sysargs[last] == '--':
+                found = True
+                break
+
+        if found:
+            twillargs = sysargs[last + 1:]
+            sysargs = sysargs[:last]
+
+    (options, args) = parser.parse_args(sysargs)
+
+    if options.show_version:
+        print 'twill version %s.' % (__version__,)
+        sys.exit(0)
+
+    if options.quiet:
+        assert not options.interact, "interactive mode is incompatible with -q"
+        assert args, "interactive mode is incompatible with -q"
+
+        old_stdout = sys.stdout
+        sys.stdout = StringIO()
+
+    # If run from the command line, find & run any scripts put on the command
+    # line.  If none, drop into an interactive AutoShell.
+
+    failed = False
+    if len(args):
+        success = []
+        failure = []
+
+        filenames = gather_filenames(args)
+
+        for filename in filenames:
+            print '>> EXECUTING FILE', filename
+
+            try:
+                interactive = False
+                execute_file(filename,
+                             initial_url=options.url,
+                             never_fail=options.never_fail)
+                success.append(filename)
+            except Exception, e:
+                if options.fail:
+#                    import pdb
+#                    _, _, tb = sys.exc_info()
+#                    pdb.post_mortem(tb)
+                    raise
+                else:
+                    print '** UNHANDLED EXCEPTION:', str(e)
+                    failure.append(filename)
+
+        print '--'
+        print '%d of %d files SUCCEEDED.' % (len(success),
+                                             len(success) + len(failure),)
+        if len(failure):
+            print 'Failed:\n\t',
+            print "\n\t".join(failure)
+            failed = True
+
+    if not args or options.interact:
+        welcome_msg = ""
+        if not args:
+            welcome_msg = "\n -= Welcome to twill! =-\n"
+
+        interactive = True
+        shell = TwillCommandLoop(initial_url=options.url)
+
+        while 1:
+            try:
+                shell.cmdloop(welcome_msg)
+            except KeyboardInterrupt:
+                sys.stdout.write('\n')
+            except SystemExit:
+                raise
+
+            welcome_msg = ""
+
+    if failed:
+        sys.exit(1)
+    sys.exit(0)
Index: /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/EGG-INFO/SOURCES.txt
===================================================================
--- /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/EGG-INFO/SOURCES.txt (revision 3)
+++ /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/EGG-INFO/SOURCES.txt (revision 3)
@@ -0,0 +1,87 @@
+ez_setup.py
+regen-docs
+scramble.py
+setup.cfg
+setup.py
+PasteScript.egg-info/PKG-INFO
+PasteScript.egg-info/SOURCES.txt
+PasteScript.egg-info/dependency_links.txt
+PasteScript.egg-info/entry_points.txt
+PasteScript.egg-info/namespace_packages.txt
+PasteScript.egg-info/not-zip-safe
+PasteScript.egg-info/requires.txt
+PasteScript.egg-info/top_level.txt
+docs/conf.py
+docs/developer.txt
+docs/example_app.ini
+docs/example_cgi_app.ini
+docs/index.txt
+docs/license.txt
+docs/news.txt
+docs/_static/paste.css
+docs/_templates/layout.html
+docs/modules/checkperms.txt
+docs/modules/command.txt
+docs/modules/copydir.txt
+docs/modules/filemaker.txt
+docs/modules/templates.txt
+docs/modules/testapp.txt
+docs/modules/util.secret.txt
+paste/__init__.py
+paste/script/__init__.py
+paste/script/appinstall.py
+paste/script/bool_optparse.py
+paste/script/cgi_server.py
+paste/script/checkperms.py
+paste/script/cherrypy_server.py
+paste/script/command.py
+paste/script/copydir.py
+paste/script/create_distro.py
+paste/script/default_sysconfig.py
+paste/script/entrypoints.py
+paste/script/epdesc.py
+paste/script/exe.py
+paste/script/filemaker.py
+paste/script/flup_server.py
+paste/script/grep.py
+paste/script/help.py
+paste/script/interfaces.py
+paste/script/pluginlib.py
+paste/script/request.py
+paste/script/serve.py
+paste/script/templates.py
+paste/script/testapp.py
+paste/script/twisted_web2_server.py
+paste/script/wsgiutils_server.py
+paste/script/paster-templates/basic_package/setup.cfg
+paste/script/paster-templates/basic_package/setup.py_tmpl
+paste/script/paster-templates/basic_package/+package+/__init__.py
+paste/script/paster-templates/basic_package/docs/license.txt_tmpl
+paste/script/util/__init__.py
+paste/script/util/logging_config.py
+paste/script/util/secret.py
+paste/script/util/string24.py
+paste/script/util/subprocess24.py
+paste/script/util/uuid.py
+paste/script/wsgiserver/__init__.py
+scripts/paster
+tests/conftest.py
+tests/test_egg_finder.py
+tests/test_logging_config.py
+tests/test_plugin_adder.py
+tests/test_template_introspect.py
+tests/appsetup/test_make_project.py
+tests/appsetup/testfiles/admin_index.py
+tests/appsetup/testfiles/conftest.py
+tests/appsetup/testfiles/iscape.txt
+tests/appsetup/testfiles/test_forbidden.py
+tests/fake_packages/FakePlugin.egg/setup.py
+tests/fake_packages/FakePlugin.egg/FakePlugin.egg-info/PKG-INFO
+tests/fake_packages/FakePlugin.egg/FakePlugin.egg-info/entry_points.txt
+tests/fake_packages/FakePlugin.egg/FakePlugin.egg-info/paster_plugins.txt
+tests/fake_packages/FakePlugin.egg/FakePlugin.egg-info/top_level.txt
+tests/fake_packages/FakePlugin.egg/fakeplugin/__init__.py
+tests/sample_templates/test1.txt
+tests/sample_templates/test2.py_tmpl
+tests/sample_templates/test3.ini_tmpl
+tests/sample_templates/test4.html_tmpl
Index: /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/EGG-INFO/scripts/paster
===================================================================
--- /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/EGG-INFO/scripts/paster (revision 3)
+++ /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/EGG-INFO/scripts/paster (revision 3)
@@ -0,0 +1,18 @@
+#!/afs/bx.psu.edu/project/pythons/linux-x86_64-ucs4/bin/python2.6
+import os
+import sys
+
+try:
+    here = __file__
+except NameError:
+    # Python 2.2
+    here = sys.argv[0]
+
+relative_paste = os.path.join(
+    os.path.dirname(os.path.dirname(os.path.abspath(here))), 'paste')
+
+if os.path.exists(relative_paste):
+    sys.path.insert(0, os.path.dirname(relative_paste))
+
+from paste.script import command
+command.run()
Index: /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/EGG-INFO/top_level.txt
===================================================================
--- /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/EGG-INFO/top_level.txt (revision 3)
+++ /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/EGG-INFO/top_level.txt (revision 3)
@@ -0,0 +1,1 @@
+paste
Index: /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/EGG-INFO/namespace_packages.txt
===================================================================
--- /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/EGG-INFO/namespace_packages.txt (revision 3)
+++ /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/EGG-INFO/namespace_packages.txt (revision 3)
@@ -0,0 +1,1 @@
+paste
Index: /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/EGG-INFO/PKG-INFO
===================================================================
--- /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/EGG-INFO/PKG-INFO (revision 3)
+++ /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/EGG-INFO/PKG-INFO (revision 3)
@@ -0,0 +1,43 @@
+Metadata-Version: 1.0
+Name: PasteScript
+Version: 1.7.3
+Summary: A pluggable command-line frontend, including commands to setup package file layouts
+Home-page: http://pythonpaste.org/script/
+Author: Ian Bicking
+Author-email: ianb@colorstudy.com
+License: MIT
+Description: This is a pluggable command-line tool.
+        
+        It includes some built-in features;
+        
+        * Create file layouts for packages.  For instance, ``paste create
+        --template=basic_package MyPackage`` will create a `setuptools
+        <http://peak.telecommunity.com/DevCenter/setuptools>`_-ready
+        file layout.
+        
+        * Serving up web applications, with configuration based on
+        `paste.deploy <http://pythonpaste.org/deploy/paste-deploy.html>`_.
+        
+        The latest version is available in a `Subversion repository
+        <http://svn.pythonpaste.org/Paste/Script/trunk#egg=PasteScript-dev>`_.
+        
+        For the latest changes see the `news file
+        <http://pythonpaste.org/script/news.html>`_.
+        
+        Changes in 1.7.3
+        ----------------
+        
+        * CherryPy wsgiserver updated to 3.1.1, fixes a regression in Python
+        2.5 plus a couple other small fixes.
+        
+        
+Keywords: web wsgi setuptools framework command-line setup
+Platform: UNKNOWN
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: MIT License
+Classifier: Programming Language :: Python
+Classifier: Topic :: Internet :: WWW/HTTP
+Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
+Classifier: Topic :: Software Development :: Libraries :: Python Modules
+Classifier: Framework :: Paste
Index: /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/EGG-INFO/entry_points.txt
===================================================================
--- /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/EGG-INFO/entry_points.txt (revision 3)
+++ /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/EGG-INFO/entry_points.txt (revision 3)
@@ -0,0 +1,59 @@
+
+    [paste.global_paster_command]
+    help=paste.script.help:HelpCommand
+    create=paste.script.create_distro:CreateDistroCommand [Templating]
+    serve=paste.script.serve:ServeCommand [Config]
+    request=paste.script.request:RequestCommand [Config]
+    post=paste.script.request:RequestCommand [Config]
+    exe=paste.script.exe:ExeCommand
+    points=paste.script.entrypoints:EntryPointCommand
+    make-config=paste.script.appinstall:MakeConfigCommand
+    setup-app=paste.script.appinstall:SetupCommand
+
+    [paste.paster_command]
+    grep = paste.script.grep:GrepCommand
+
+    [paste.paster_create_template]
+    basic_package=paste.script.templates:BasicPackage
+
+    [paste.server_runner]
+    wsgiutils=paste.script.wsgiutils_server:run_server [WSGIUtils]
+    flup_ajp_thread=paste.script.flup_server:run_ajp_thread [Flup]
+    flup_ajp_fork=paste.script.flup_server:run_ajp_fork [Flup]
+    flup_fcgi_thread=paste.script.flup_server:run_fcgi_thread [Flup]
+    flup_fcgi_fork=paste.script.flup_server:run_fcgi_fork [Flup]
+    flup_scgi_thread=paste.script.flup_server:run_scgi_thread [Flup]
+    flup_scgi_fork=paste.script.flup_server:run_scgi_fork [Flup]
+    cgi=paste.script.cgi_server:paste_run_cgi
+    cherrypy=paste.script.cherrypy_server:cpwsgi_server
+    twisted=paste.script.twisted_web2_server:run_twisted
+
+    [paste.app_factory]
+    test=paste.script.testapp:make_test_application
+
+    [paste.entry_point_description]
+    paste.entry_point_description = paste.script.epdesc:MetaEntryPointDescription
+    paste.paster_create_template = paste.script.epdesc:CreateTemplateDescription
+    paste.paster_command = paste.script.epdesc:PasterCommandDescription
+    paste.global_paster_command = paste.script.epdesc:GlobalPasterCommandDescription
+    paste.app_install = paste.script.epdesc:AppInstallDescription
+
+    # These aren't part of Paste Script particularly, but
+    # we'll document them here
+    console_scripts = paste.script.epdesc:ConsoleScriptsDescription
+    # @@: Need non-console scripts...
+    distutils.commands = paste.script.epdesc:DistutilsCommandsDescription
+    distutils.setup_keywords = paste.script.epdesc:SetupKeywordsDescription
+    egg_info.writers = paste.script.epdesc:EggInfoWriters
+    # @@: Not sure what this does:
+    #setuptools.file_finders = paste.script.epdesc:SetuptoolsFileFinders
+    
+    [console_scripts]
+    paster=paste.script.command:run
+
+    [distutils.setup_keywords]
+    paster_plugins = setuptools.dist:assert_string_list
+
+    [egg_info.writers]
+    paster_plugins.txt = setuptools.command.egg_info:write_arg
+    
Index: /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/EGG-INFO/dependency_links.txt
===================================================================
--- /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/EGG-INFO/dependency_links.txt (revision 3)
+++ /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/EGG-INFO/dependency_links.txt (revision 3)
@@ -0,0 +1,1 @@
+
Index: /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/EGG-INFO/not-zip-safe
===================================================================
--- /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/EGG-INFO/not-zip-safe (revision 3)
+++ /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/EGG-INFO/not-zip-safe (revision 3)
@@ -0,0 +1,1 @@
+
Index: /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/EGG-INFO/requires.txt
===================================================================
--- /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/EGG-INFO/requires.txt (revision 3)
+++ /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/EGG-INFO/requires.txt (revision 3)
@@ -0,0 +1,20 @@
+
+
+[Templating]
+
+
+[Config]
+PasteDeploy
+
+[WSGIUtils]
+WSGIUtils
+
+[Flup]
+Flup
+
+[Cheetah]
+Cheetah
+
+[Paste]
+PasteDeploy
+Cheetah
Index: /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/cgi_server.py
===================================================================
--- /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/cgi_server.py (revision 3)
+++ /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/cgi_server.py (revision 3)
@@ -0,0 +1,71 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+import os
+import sys
+
+## FIXME: this should be deprecated in favor of wsgiref
+
+def paste_run_cgi(wsgi_app, global_conf):
+    run_with_cgi(wsgi_app)
+
+stdout = sys.__stdout__
+
+# Taken from the WSGI spec:
+
+def run_with_cgi(application):
+
+    environ = dict(os.environ.items())
+    environ['wsgi.input']        = sys.stdin
+    environ['wsgi.errors']       = sys.stderr
+    environ['wsgi.version']      = (1,0)
+    environ['wsgi.multithread']  = False
+    environ['wsgi.multiprocess'] = True
+    environ['wsgi.run_once']    = True
+
+    if environ.get('HTTPS','off') in ('on','1'):
+        environ['wsgi.url_scheme'] = 'https'
+    else:
+        environ['wsgi.url_scheme'] = 'http'
+
+    headers_set = []
+    headers_sent = []
+
+    def write(data):
+        if not headers_set:
+             raise AssertionError("write() before start_response()")
+
+        elif not headers_sent:
+             # Before the first output, send the stored headers
+             status, response_headers = headers_sent[:] = headers_set
+             stdout.write('Status: %s\r\n' % status)
+             for header in response_headers:
+                 stdout.write('%s: %s\r\n' % header)
+             stdout.write('\r\n')
+
+        stdout.write(data)
+        stdout.flush()
+
+    def start_response(status,response_headers,exc_info=None):
+        if exc_info:
+            try:
+                if headers_sent:
+                    # Re-raise original exception if headers sent
+                    raise exc_info[0], exc_info[1], exc_info[2]
+            finally:
+                exc_info = None     # avoid dangling circular ref
+        elif headers_set:
+            raise AssertionError("Headers already set!")
+            
+        headers_set[:] = [status,response_headers]
+        return write
+
+    result = application(environ, start_response)
+    try:
+        for data in result:
+            if data:    # don't send headers until body appears
+                write(data)
+        if not headers_sent:
+            write('')   # send headers now if body was empty
+    finally:
+        if hasattr(result,'close'):
+            result.close()
Index: /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/help.py
===================================================================
--- /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/help.py (revision 3)
+++ /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/help.py (revision 3)
@@ -0,0 +1,60 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+from command import Command, get_commands
+from command import parser as base_parser
+
+class HelpCommand(Command):
+
+    summary = "Display help"
+    usage = '[COMMAND]'
+
+    max_args = 1
+
+    parser = Command.standard_parser()
+
+    def command(self):
+        if not self.args:
+            self.generic_help()
+            return
+
+        name = self.args[0]
+        commands = get_commands()
+        if name not in commands:
+            print 'No such command: %s' % name
+            self.generic_help()
+            return
+
+        command = commands[name].load()
+        runner = command(name)
+        runner.run(['-h'])
+        
+    def generic_help(self):
+        base_parser.print_help()
+        print
+        commands_grouped = {}
+        commands = get_commands()
+        longest = max([len(n) for n in commands.keys()])
+        for name, command in commands.items():
+            try:
+                command = command.load()
+            except Exception, e:
+                print 'Cannot load command %s: %s' % (name, e)
+                continue
+            if getattr(command, 'hidden', False):
+                continue
+            commands_grouped.setdefault(
+                command.group_name, []).append((name, command))
+        commands_grouped = commands_grouped.items()
+        commands_grouped.sort()
+        print 'Commands:'
+        for group, commands in commands_grouped:
+            if group:
+                print group + ':'
+            commands.sort()
+            for name, command in commands:
+                print '  %s  %s' % (self.pad(name, length=longest),
+                                    command.summary)
+                #if command.description:
+                #    print self.indent_block(command.description, 4)
+            print
+        
Index: /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/request.py
===================================================================
--- /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/request.py (revision 3)
+++ /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/request.py (revision 3)
@@ -0,0 +1,189 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+import os
+import re
+import sys
+import urlparse
+import urllib
+from command import Command, BadCommand
+from paste.deploy import loadapp, loadserver
+from paste.wsgilib import raw_interactive
+
+class RequestCommand(Command):
+
+    min_args = 2
+    usage = 'CONFIG_FILE URL [OPTIONS/ARGUMENTS]'
+    takes_config_file = 1
+    summary = "Run a request for the described application"
+    description = """\
+    This command makes an artifical request to a web application that
+    uses a paste.deploy configuration file for the server and
+    application.
+
+    Use 'paster request config.ini /url' to request /url.  Use
+    'paster post config.ini /url < data' to do a POST with the given
+    request body.
+
+    If the URL is relative (doesn't begin with /) it is interpreted as
+    relative to /.command/.  The variable environ['paste.command_request']
+    will be set to True in the request, so your application can distinguish
+    these calls from normal requests.
+
+    Note that you can pass options besides the options listed here; any unknown
+    options will be passed to the application in environ['QUERY_STRING'].
+    """
+    
+    parser = Command.standard_parser(quiet=True)
+    parser.add_option('-n', '--app-name',
+                      dest='app_name',
+                      metavar='NAME',
+                      help="Load the named application (default main)")
+    parser.add_option('--config-var',
+                      dest='config_vars',
+                      metavar='NAME:VALUE',
+                      action='append',
+                      help="Variable to make available in the config for %()s substitution "
+                      "(you can use this option multiple times)")
+    parser.add_option('--header',
+                      dest='headers',
+                      metavar='NAME:VALUE',
+                      action='append',
+                      help="Header to add to request (you can use this option multiple times)")
+    parser.add_option('--display-headers',
+                      dest='display_headers',
+                      action='store_true',
+                      help='Display headers before the response body')
+
+    ARG_OPTIONS = ['-n', '--app-name', '--config-var', '--header']
+    OTHER_OPTIONS = ['--display-headers']
+    
+    ## FIXME: some kind of verbosity?
+    ## FIXME: allow other methods than POST and GET?
+
+    _scheme_re = re.compile(r'^[a-z][a-z]+:', re.I)
+
+    def command(self):
+        vars = {}
+        app_spec = self.args[0]
+        url = self.args[1]
+        url = urlparse.urljoin('/.command/', url)
+        if self.options.config_vars:
+            for item in self.option.config_vars:
+                if ':' not in item:
+                    raise BadCommand(
+                        "Bad option, should be name:value : --config-var=%s" % item)
+                name, value = item.split(':', 1)
+                vars[name] = value
+        headers = {}
+        if self.options.headers:
+            for item in self.options.headers:
+                if ':' not in item:
+                    raise BadCommand(
+                        "Bad option, should be name:value : --header=%s" % item)
+                name, value = item.split(':', 1)
+                headers[name] = value.strip()
+        if not self._scheme_re.search(app_spec):
+            app_spec = 'config:'+app_spec
+        if self.options.app_name:
+            if '#' in app_spec:
+                app_spec = app_spec.split('#', 1)[0]
+            app_spec = app_spec + '#' + options.app_name
+        app = loadapp(app_spec, relative_to=os.getcwd(), global_conf=vars)
+        if self.command_name.lower() == 'post':
+            request_method = 'POST'
+        else:
+            request_method = 'GET'
+        qs = []
+        for item in self.args[2:]:
+            if '=' in item:
+                item = urllib.quote(item.split('=', 1)[0]) + '=' + urllib.quote(item.split('=', 1)[1])
+            else:
+                item = urllib.quote(item)
+            qs.append(item)
+        qs = '&'.join(qs)
+        
+        environ = {
+            'REQUEST_METHOD': request_method,
+            ## FIXME: shouldn't be static (an option?):
+            'CONTENT_TYPE': 'text/plain',
+            'wsgi.run_once': True,
+            'wsgi.multithread': False,
+            'wsgi.multiprocess': False,
+            'wsgi.errors': sys.stderr,
+            'QUERY_STRING': qs,
+            'HTTP_ACCEPT': 'text/plain;q=1.0, */*;q=0.1',
+            'paste.command_request': True,
+            }
+        if request_method == 'POST':
+            environ['wsgi.input'] = sys.stdin
+            environ['CONTENT_LENGTH'] = '-1'
+        for name, value in headers.items():
+            if name.lower() == 'content-type':
+                name = 'CONTENT_TYPE'
+            else:
+                name = 'HTTP_'+name.upper().replace('-', '_')
+            environ[name] = value
+            
+        status, headers, output, errors = raw_interactive(app, url, **environ)
+        assert not errors, "errors should be printed directly to sys.stderr"
+        if self.options.display_headers:
+            for name, value in headers:
+                sys.stdout.write('%s: %s\n' % (name, value))
+            sys.stdout.write('\n')
+        sys.stdout.write(output)
+        sys.stdout.flush()
+        status_int = int(status.split()[0])
+        if status_int != 200:
+            return status_int
+
+    def parse_args(self, args):
+        if args == ['-h']:
+            Command.parse_args(self, args)
+            return
+        # These are the arguments parsed normally:
+        normal_args = []
+        # And these are arguments passed to the URL:
+        extra_args = []
+        # This keeps track of whether we have the two required positional arguments:
+        pos_args = 0
+        while args:
+            start = args[0]
+            if not start.startswith('-'):
+                if pos_args < 2:
+                    pos_args += 1
+                    normal_args.append(start)
+                    args.pop(0)
+                    continue
+                else:
+                    normal_args.append(start)
+                    args.pop(0)
+                    continue
+            else:
+                found = False
+                for option in self.ARG_OPTIONS:
+                    if start == option:
+                        normal_args.append(start)
+                        args.pop(0)
+                        if not args:
+                            raise BadCommand(
+                                "Option %s takes an argument" % option)
+                        normal_args.append(args.pop(0))
+                        found = True
+                        break
+                    elif start.startswith(option+'='):
+                        normal_args.append(start)
+                        args.pop(0)
+                        found = True
+                        break
+                if found:
+                    continue
+                if start in self.OTHER_OPTIONS:
+                    normal_args.append(start)
+                    args.pop(0)
+                    continue
+                extra_args.append(start)
+                args.pop(0)
+        Command.parse_args(self, normal_args)
+        # Add the extra arguments back in:
+        self.args = self.args + extra_args
+            
Index: /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/twisted_web2_server.py
===================================================================
--- /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/twisted_web2_server.py (revision 3)
+++ /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/twisted_web2_server.py (revision 3)
@@ -0,0 +1,20 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+# @@: THIS IS INCOMPLETE!
+
+def run_twisted(wsgi_app, global_conf,
+                host='127.0.0.1', port='8080'):
+    host = host or None
+    import twisted.web2.wsgi
+    import twisted.web2.log
+    import twisted.web2.channel
+    import twisted.web2.server
+    import twisted.internet.reactor
+    wsgi_resource = twisted.web2.wsgi.WSGIResource(wsgi_app)
+    resource = twisted.web2.log.LogWrapperResource(wsgi_resource)
+    twisted.web2.log.DefaultCommonAccessLoggingObserver().start()
+    site = twisted.web2.server.Site(resource)
+    factory = twisted.web2.channel.HTTPFactory(site)
+    # --- start reactor for listen port
+    twisted.internet.reactor.listenTCP(int(port), factory, interface=host)
+    twisted.internet.reactor.run()
Index: /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/cherrypy_server.py
===================================================================
--- /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/cherrypy_server.py (revision 3)
+++ /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/cherrypy_server.py (revision 3)
@@ -0,0 +1,101 @@
+"""
+Entry point for CherryPy's WSGI server
+"""
+import paste.script.wsgiserver as wsgiserver
+
+def cpwsgi_server(app, global_conf=None, host='127.0.0.1', port=None,
+                  ssl_pem=None, protocol_version=None, numthreads=None,
+                  server_name=None, max=None, request_queue_size=None,
+                  timeout=None):
+    """
+    Serves the specified WSGI app via CherryPyWSGIServer.
+
+    ``app``
+
+        The WSGI 'application callable'; multiple WSGI applications
+        may be passed as (script_name, callable) pairs.
+
+    ``host``
+
+        This is the ipaddress to bind to (or a hostname if your
+        nameserver is properly configured).  This defaults to
+        127.0.0.1, which is not a public interface.
+
+    ``port``
+
+        The port to run on, defaults to 8080 for HTTP, or 4443 for
+        HTTPS. This can be a string or an integer value.
+
+    ``ssl_pem``
+
+        This an optional SSL certificate file (via OpenSSL) You can
+        generate a self-signed test PEM certificate file as follows:
+
+            $ openssl genrsa 1024 > host.key
+            $ chmod 400 host.key
+            $ openssl req -new -x509 -nodes -sha1 -days 365  \\
+                          -key host.key > host.cert
+            $ cat host.cert host.key > host.pem
+            $ chmod 400 host.pem
+
+    ``protocol_version``
+
+        The protocol used by the server, by default ``HTTP/1.1``.
+
+    ``numthreads``
+
+        The number of worker threads to create.
+
+    ``server_name``
+
+        The string to set for WSGI's SERVER_NAME environ entry.
+
+    ``max``
+
+        The maximum number of queued requests. (defaults to -1 = no
+        limit).
+
+    ``request_queue_size``
+
+        The 'backlog' argument to socket.listen(); specifies the
+        maximum number of queued connections.
+
+    ``timeout``
+
+        The timeout in seconds for accepted connections.
+    """
+    is_ssl = False
+    if ssl_pem:
+        port = port or 4443
+        is_ssl = True
+
+    if not port:
+        if ':' in host:
+            host, port = host.split(':', 1)
+        else:
+            port = 8080
+    bind_addr = (host, int(port))
+
+    kwargs = {}
+    for var_name in ('numthreads', 'max', 'request_queue_size', 'timeout'):
+        var = locals()[var_name]
+        if var is not None:
+            kwargs[var_name] = int(var)
+
+    server = wsgiserver.CherryPyWSGIServer(bind_addr, app,
+                                           server_name=server_name, **kwargs)
+    server.ssl_certificate = server.ssl_private_key = ssl_pem
+    if protocol_version:
+        server.protocol = protocol_version
+
+    try:
+        protocol = is_ssl and 'https' or 'http'
+        if host == '0.0.0.0':
+            print 'serving on 0.0.0.0:%s view at %s://127.0.0.1:%s' % \
+                (port, protocol, port)
+        else:
+            print "serving on %s://%s:%s" % (protocol, host, port)
+        server.start()
+    except (KeyboardInterrupt, SystemExit):
+        server.stop()
+    return server
Index: /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/flup_server.py
===================================================================
--- /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/flup_server.py (revision 3)
+++ /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/flup_server.py (revision 3)
@@ -0,0 +1,119 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+from paste.deploy.converters import aslist, asbool
+from paste.script.serve import ensure_port_cleanup
+import warnings
+
+def warn(name, stacklevel=3):
+    # Deprecated 2007-12-17
+    warnings.warn(
+        'The egg:PasteScript#flup_%s entry point is deprecated; please use egg:Flup#%s instead'
+        % (name, name),
+        DeprecationWarning, stacklevel=stacklevel)
+
+def run_ajp_thread(wsgi_app, global_conf,
+                   scriptName='', host='localhost', port='8009',
+                   allowedServers='127.0.0.1'):
+    import flup.server.ajp
+    warn('ajp_thread')
+    addr = (host, int(port))
+    ensure_port_cleanup([addr])
+    s = flup.server.ajp.WSGIServer(
+        wsgi_app,
+        scriptName=scriptName,
+        bindAddress=addr,
+        allowedServers=aslist(allowedServers),
+        )
+    s.run()
+    
+def run_ajp_fork(wsgi_app, global_conf,
+                 scriptName='', host='localhost', port='8009',
+                 allowedServers='127.0.0.1'):
+    import flup.server.ajp_fork
+    warn('ajp_fork')
+    addr = (host, int(port))
+    ensure_port_cleanup([addr])
+    s = flup.server.ajp_fork.WSGIServer(
+        wsgi_app,
+        scriptName=scriptName,
+        bindAddress=addr,
+        allowedServers=aslist(allowedServers),
+        )
+    s.run()
+
+def run_fcgi_thread(wsgi_app, global_conf,
+                    host=None, port=None,
+                    socket=None, umask=None,
+                    multiplexed=False):
+    import flup.server.fcgi
+    warn('fcgi_thread')
+    if socket:
+        assert host is None and port is None
+        sock = socket
+    elif host:
+        assert host is not None and port is not None
+        sock = (host, int(port))
+        ensure_port_cleanup([sock])
+    else:
+        sock = None
+    if umask is not None:
+        umask = int(umask)
+    s = flup.server.fcgi.WSGIServer(
+        wsgi_app,
+        bindAddress=sock, umask=umask,
+        multiplexed=asbool(multiplexed))
+    s.run()
+
+def run_fcgi_fork(wsgi_app, global_conf,
+                  host=None, port=None,
+                  socket=None, umask=None,
+                  multiplexed=False):
+    import flup.server.fcgi_fork
+    warn('fcgi_fork')
+    if socket:
+        assert host is None and port is None
+        sock = socket
+    elif host:
+        assert host is not None and port is not None
+        sock = (host, int(port))
+        ensure_port_cleanup([sock])
+    else:
+        sock = None
+    if umask is not None:
+        umask = int(umask)
+    s = flup.server.fcgi_fork.WSGIServer(
+        wsgi_app,
+        bindAddress=sock, umask=umask,
+        multiplexed=asbool(multiplexed))
+    s.run()
+
+def run_scgi_thread(wsgi_app, global_conf,
+                    scriptName='', host='localhost', port='4000',
+                    allowedServers='127.0.0.1'):
+    import flup.server.scgi
+    warn('scgi_thread')
+    addr = (host, int(port))
+    ensure_port_cleanup([addr])
+    s = flup.server.scgi.WSGIServer(
+        wsgi_app,
+        scriptName=scriptName,
+        bindAddress=addr,
+        allowedServers=aslist(allowedServers),
+        )
+    s.run()
+
+def run_scgi_fork(wsgi_app, global_conf,
+                  scriptName='', host='localhost', port='4000',
+                  allowedServers='127.0.0.1'):
+    import flup.server.scgi_fork
+    warn('scgi_fork')
+    addr = (host, int(port))
+    ensure_port_cleanup([addr])
+    s = flup.server.scgi_fork.WSGIServer(
+        wsgi_app,
+        scriptName=scriptName,
+        bindAddress=addr,
+        allowedServers=aslist(allowedServers),
+        )
+    s.run()
+    
Index: /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/grep.py
===================================================================
--- /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/grep.py (revision 3)
+++ /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/grep.py (revision 3)
@@ -0,0 +1,168 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+import os
+import py_compile
+import marshal
+import inspect
+import re
+from command import Command
+import pluginlib
+
+class GrepCommand(Command):
+
+    summary = 'Search project for symbol'
+    usage = 'SYMBOL'
+
+    max_args = 1
+    min_args = 1
+
+    bad_names = ['.svn', 'CVS', '_darcs']
+
+    parser = Command.standard_parser()
+
+    parser.add_option(
+        '-x', '--exclude-module',
+        metavar="module.name",
+        dest="exclude_modules",
+        action="append",
+        help="Don't search the given module")
+
+    parser.add_option(
+        '-t', '--add-type',
+        metavar=".ext",
+        dest="add_types",
+        action="append",
+        help="Search the given type of files")
+
+    def command(self):
+        self.exclude_modules = self.options.exclude_modules or []
+        self.add_types = self.options.add_types or []
+        self.symbol = self.args[0]
+        self.basedir = os.path.dirname(
+            pluginlib.find_egg_info_dir(os.getcwd()))
+        if self.verbose:
+            print "Searching in %s" % self.basedir
+        self.total_files = 0
+        self.search_dir(self.basedir)
+        if self.verbose > 1:
+            print "Searched %i files" % self.total_files
+
+    def search_dir(self, dir):
+        names = os.listdir(dir)
+        names.sort()
+        dirs = []
+        for name in names:
+            full = os.path.join(dir, name)
+            if name in self.bad_names:
+                continue
+            if os.path.isdir(full):
+                # Breadth-first; we'll do this later...
+                dirs.append(full)
+                continue
+            for t in self.add_types:
+                if name.lower().endswith(t.lower()):
+                    self.search_text(full)
+            if not name.endswith('.py'):
+                continue
+            self.search_file(full)
+        for dir in dirs:
+            self.search_dir(dir)
+
+    def search_file(self, filename):
+        self.total_files += 1
+        if not filename.endswith('.py'):
+            self.search_text(filename)
+            return
+        pyc = filename[:-2]+'pyc'
+        if not os.path.exists(pyc):
+            py_compile.compile(filename)
+        if not os.path.exists(pyc):
+            # Invalid syntax...
+            self.search_text(filename, as_module=True)
+            return
+        f = open(pyc, 'rb')
+        # .pyc Header:
+        f.read(8)
+        code = marshal.load(f)
+        f.close()
+        self.search_code(code, filename, [])
+        
+    def search_code(self, code, filename, path):
+        if code.co_name != "?":
+            path = path + [code.co_name]
+        else:
+            path = path
+        sym = self.symbol
+        if sym in code.co_varnames:
+            self.found(code, filename, path)
+        elif sym in code.co_names:
+            self.found(code, filename, path)
+        for const in code.co_consts:
+            if const == sym:
+                self.found(code, filename, path)
+            if inspect.iscode(const):
+                if not const.co_filename == filename:
+                    continue
+                self.search_code(const, filename, path)
+
+    def search_text(self, filename, as_module=False):
+        f = open(filename, 'rb')
+        lineno = 0
+        any = False
+        for line in f:
+            lineno += 1
+            if line.find(self.symbol) != -1:
+                if not any:
+                    any = True
+                    if as_module:
+                        print '%s (unloadable)' % self.module_name(filename)
+                    else:
+                        print self.relative_name(filename)
+                print '  %3i  %s' % (lineno, line)
+                if not self.verbose:
+                    break
+        f.close()
+                
+    def found(self, code, filename, path):
+        print self.display(filename, path)
+        self.find_occurance(code)
+
+    def find_occurance(self, code):
+        f = open(code.co_filename, 'rb')
+        lineno = 0
+        for index, line in zip(xrange(code.co_firstlineno), f):
+            lineno += 1
+            pass
+        lines = []
+        first_indent = None
+        for line in f:
+            lineno += 1
+            if line.find(self.symbol) != -1:
+                this_indent = len(re.match(r'^[ \t]*', line).group(0))
+                if first_indent is None:
+                    first_indent = this_indent
+                else:
+                    if this_indent < first_indent:
+                        break
+                print '  %3i  %s' % (lineno, line[first_indent:].rstrip())
+                if not self.verbose:
+                    break
+
+    def module_name(self, filename):
+        assert filename, startswith(self.basedir)
+        mod = filename[len(self.basedir):].strip('/').strip(os.path.sep)
+        mod = os.path.splitext(mod)[0]
+        mod = mod.replace(os.path.sep, '.').replace('/', '.')
+        return mod
+
+    def relative_name(self, filename):
+        assert filename, startswith(self.basedir)
+        name = filename[len(self.basedir):].strip('/').strip(os.path.sep)
+        return name
+
+    def display(self, filename, path):
+        parts = '.'.join(path)
+        if parts:
+            parts = ':' + parts
+        return self.module_name(filename) + parts
+        
Index: /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/entrypoints.py
===================================================================
--- /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/entrypoints.py (revision 3)
+++ /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/entrypoints.py (revision 3)
@@ -0,0 +1,269 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+import textwrap
+import os
+import pkg_resources
+from command import Command, BadCommand
+import fnmatch
+import re
+import traceback
+from cStringIO import StringIO
+import inspect
+import types
+
+class EntryPointCommand(Command):
+
+    usage = "ENTRY_POINT"
+    summary = "Show information about entry points"
+    
+    description = """\
+    Shows information about one or many entry points (you can use
+    wildcards for entry point names).  Entry points are used for Egg
+    plugins, and are named resources -- like an application, template
+    plugin, or other resource.  Entry points have a [group] which
+    defines what kind of object they describe, and inside groups each
+    entry point is named.
+    """
+    
+    max_args = 2
+
+    parser = Command.standard_parser(verbose=False)
+    parser.add_option('--list', '-l',
+                      dest='list_entry_points',
+                      action='store_true',
+                      help='List all the kinds of entry points on the system')
+    parser.add_option('--egg', '-e',
+                      dest='show_egg',
+                      help="Show all the entry points for the given Egg")
+    parser.add_option('--regex',
+                      dest='use_regex',
+                      action='store_true',
+                      help="Make pattern match as regular expression, not just a wildcard pattern")
+
+    def command(self):
+        if self.options.list_entry_points:
+            return self.list_entry_points()
+        if self.options.show_egg:
+            return self.show_egg(self.options.show_egg)
+        if not self.args:
+            raise BadCommand("You must give an entry point (or --list)")
+        pattern = self.get_pattern(self.args[0])
+        groups = self.get_groups_by_pattern(pattern)
+        if not groups:
+            raise BadCommand('No group matched %s' % self.args[0])
+        ep_pat = None
+        if len(self.args) > 1:
+            ep_pat = self.get_pattern(self.args[1])
+        for group in groups:
+            desc = self.get_group_description(group)
+            print '[%s]' % group
+            if desc:
+                print self.wrap(desc)
+                print
+            by_dist = {}
+            self.print_entry_points_by_group(group, ep_pat)
+
+    def print_entry_points_by_group(self, group, ep_pat):
+        env = pkg_resources.Environment()
+        project_names = list(env)
+        project_names.sort()
+        for project_name in project_names:
+            dists = list(env[project_name])
+            assert dists
+            dist = dists[0]
+            entries = dist.get_entry_map(group).values()
+            if ep_pat:
+                entries = [e for e in entries
+                           if ep_pat.search(e.name)]
+            if not entries:
+                continue
+            if len(dists) > 1:
+                print '%s (+ %i older versions)' % (
+                    dist, len(dists)-1)
+            else:
+                print '%s' % dist
+            entries.sort(lambda a, b: cmp(a.name, b.name))
+            for entry in entries:
+                print self._ep_description(entry)
+                desc = self.get_entry_point_description(entry, group)
+                if desc and desc.description:
+                    print self.wrap(desc.description, indent=4)
+
+    def show_egg(self, egg_name):
+        group_pat = None
+        if self.args:
+            group_pat = self.get_pattern(self.args[0])
+        ep_pat = None
+        if len(self.args) > 1:
+            ep_pat = self.get_pattern(self.args[1])
+        if egg_name.startswith('egg:'):
+            egg_name = egg_name[4:]
+        dist = pkg_resources.get_distribution(egg_name)
+        entry_map = dist.get_entry_map()
+        entry_groups = entry_map.items()
+        entry_groups.sort()
+        for group, points in entry_groups:
+            if group_pat and not group_pat.search(group):
+                continue
+            print '[%s]' % group
+            points = points.items()
+            points.sort()
+            for name, entry in points:
+                if ep_pat:
+                    if not ep_pat.search(name):
+                        continue
+                print self._ep_description(entry)
+                desc = self.get_entry_point_description(entry, group)
+                if desc and desc.description:
+                    print self.wrap(desc.description, indent=2)
+                print
+
+    def wrap(self, text, indent=0):
+        text = dedent(text)
+        width = int(os.environ.get('COLUMNS', 70)) - indent
+        text = '\n'.join([line.rstrip() for line in text.splitlines()])
+        paras = text.split('\n\n')
+        new_paras = []
+        for para in paras:
+            if para.lstrip() == para:
+                # leading whitespace means don't rewrap
+                para = '\n'.join(textwrap.wrap(para, width))
+            new_paras.append(para)
+        text = '\n\n'.join(new_paras)
+        lines = [' '*indent + line
+                 for line in text.splitlines()]
+        return '\n'.join(lines)
+
+    def _ep_description(self, ep, pad_name=None):
+        name = ep.name
+        if pad_name is not None:
+            name = name + ' '*(pad_name-len(name))
+        dest = ep.module_name
+        if ep.attrs:
+            dest = dest + ':' + '.'.join(ep.attrs)
+        return '%s = %s' % (name, dest)
+
+    def get_pattern(self, s):
+        if not s:
+            return None
+        if self.options.use_regex:
+            return re.compile(s)
+        else:
+            return re.compile(fnmatch.translate(s), re.I)
+
+    def list_entry_points(self):
+        pattern = self.get_pattern(self.args and self.args[0])
+        groups = self.get_groups_by_pattern(pattern)
+        print '%i entry point groups found:' % len(groups)
+        for group in groups:
+            desc = self.get_group_description(group)
+            print '[%s]' % group
+            if desc:
+                if hasattr(desc, 'description'):
+                    desc = desc.description
+                print self.wrap(desc, indent=2)
+
+    def get_groups_by_pattern(self, pattern):
+        env = pkg_resources.Environment()
+        eps = {}
+        for project_name in env:
+            for dist in env[project_name]:
+                for name in pkg_resources.get_entry_map(dist):
+                    if pattern and not pattern.search(name):
+                        continue
+                    if (not pattern
+                        and name.startswith('paste.description.')):
+                        continue
+                    eps[name] = None
+        eps = eps.keys()
+        eps.sort()
+        return eps
+    
+    def get_group_description(self, group):
+        for entry in pkg_resources.iter_entry_points('paste.entry_point_description'):
+            if entry.name == group:
+                ep = entry.load()
+                if hasattr(ep, 'description'):
+                    return ep.description
+                else:
+                    return ep
+        return None
+
+    def get_entry_point_description(self, ep, group):
+        try:
+            return self._safe_get_entry_point_description(ep, group)
+        except Exception, e:
+            out = StringIO()
+            traceback.print_exc(file=out)
+            return ErrorDescription(e, out.getvalue())
+
+    def _safe_get_entry_point_description(self, ep, group):
+        ep.dist.activate()
+        meta_group = 'paste.description.'+group
+        meta = ep.dist.get_entry_info(meta_group, ep.name)
+        if not meta:
+            generic = list(pkg_resources.iter_entry_points(
+                meta_group, 'generic'))
+            if not generic:
+                return super_generic(ep.load())
+            # @@: Error if len(generic) > 1?
+            obj = generic[0].load()
+            desc = obj(ep, group)
+        else:
+            desc = meta.load()
+        return desc
+    
+class EntryPointDescription(object):
+
+    def __init__(self, group):
+        self.group = group
+
+    # Should define:
+    # * description
+
+class SuperGeneric(object):
+
+    def __init__(self, doc_object):
+        self.doc_object = doc_object
+        self.description = dedent(self.doc_object.__doc__)
+        try:
+            if isinstance(self.doc_object, (type, types.ClassType)):
+                func = self.doc_object.__init__.im_func
+            elif (hasattr(self.doc_object, '__call__')
+                  and not isinstance(self.doc_object, types.FunctionType)):
+                func = self.doc_object.__call__
+            else:
+                func = self.doc_object
+            if hasattr(func, '__paste_sig__'):
+                sig = func.__paste_sig__
+            else:
+                sig = inspect.getargspec(func)
+                sig = inspect.formatargspec(*sig)
+        except TypeError:
+            sig = None
+        if sig:
+            if self.description:
+                self.description = '%s\n\n%s' % (
+                    sig, self.description)
+            else:
+                self.description = sig
+
+def dedent(s):
+    if s is None:
+        return s
+    s = s.strip('\n').strip('\r')
+    return textwrap.dedent(s)
+
+def super_generic(obj):
+    desc = SuperGeneric(obj)
+    if not desc.description:
+        return None
+    return desc
+
+class ErrorDescription(object):
+
+    def __init__(self, exc, tb):
+        self.exc = exc
+        self.tb = '\n'.join(tb)
+        self.description = 'Error loading: %s' % exc
+        
Index: /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/templates.py
===================================================================
--- /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/templates.py (revision 3)
+++ /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/templates.py (revision 3)
@@ -0,0 +1,278 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+import sys
+import os
+import inspect
+import copydir
+import command
+
+from paste.util.template import paste_script_template_renderer
+
+class Template(object):
+
+    # Subclasses must define:
+    # _template_dir (or template_dir())
+    # summary
+
+    # Variables this template uses (mostly for documentation now)
+    # a list of instances of var()
+    vars = []
+
+    # Eggs that should be added as plugins:
+    egg_plugins = []
+
+    # Templates that must be applied first:
+    required_templates = []
+
+    # Use Cheetah for substituting templates:
+    use_cheetah = False
+    # If true, then read all the templates to find the variables:
+    read_vars_from_templates = False
+
+    # You can also give this function/method to use something other
+    # than Cheetah or string.Template.  The function should be of the
+    # signature template_renderer(content, vars, filename=filename).
+    # Careful you don't turn this into a method by putting a function
+    # here (without staticmethod)!
+    template_renderer = None
+
+    def __init__(self, name):
+        self.name = name
+        self._read_vars = None
+    
+    def module_dir(self):
+        """Returns the module directory of this template."""
+        mod = sys.modules[self.__class__.__module__]
+        return os.path.dirname(mod.__file__)
+
+    def template_dir(self):
+        assert self._template_dir is not None, (
+            "Template %r didn't set _template_dir" % self)
+        if isinstance( self._template_dir, tuple):
+            return self._template_dir
+        else:
+            return os.path.join(self.module_dir(), self._template_dir)
+
+    def run(self, command, output_dir, vars):
+        self.pre(command, output_dir, vars)
+        self.write_files(command, output_dir, vars)
+        self.post(command, output_dir, vars)
+
+    def check_vars(self, vars, cmd):
+        expect_vars = self.read_vars(cmd)
+        if not expect_vars:
+            # Assume that variables aren't defined
+            return vars
+        converted_vars = {}
+        unused_vars = vars.copy()
+        errors = []
+        for var in expect_vars:
+            if var.name not in unused_vars:
+                if cmd.interactive:
+                    prompt = 'Enter %s' % var.full_description()
+                    response = cmd.challenge(prompt, var.default, var.should_echo)
+                    converted_vars[var.name] = response
+                elif var.default is command.NoDefault:
+                    errors.append('Required variable missing: %s'
+                                  % var.full_description())
+                else:
+                    converted_vars[var.name] = var.default
+            else:
+                converted_vars[var.name] = unused_vars.pop(var.name)
+        if errors:
+            raise command.BadCommand(
+                'Errors in variables:\n%s' % '\n'.join(errors))
+        converted_vars.update(unused_vars)
+        vars.update(converted_vars)
+        return converted_vars
+        
+    def read_vars(self, command=None):
+        if self._read_vars is not None:
+            return self._read_vars
+        assert (not self.read_vars_from_templates
+                or self.use_cheetah), (
+            "You can only read variables from templates if using Cheetah")
+        if not self.read_vars_from_templates:
+            self._read_vars = self.vars
+            return self.vars
+        
+        vars = self.vars[:]
+        var_names = [var.name for var in self.vars]
+        read_vars = find_args_in_dir(
+            self.template_dir(),
+            verbose=command and command.verbose > 1).items()
+        read_vars.sort()
+        for var_name, var in read_vars:
+            if var_name not in var_names:
+                vars.append(var)
+        self._read_vars = vars
+        return vars
+
+    def write_files(self, command, output_dir, vars):
+        template_dir = self.template_dir()
+        if not os.path.exists(output_dir):
+            print "Creating directory %s" % output_dir
+            if not command.simulate:
+                # Don't let copydir create this top-level directory,
+                # since copydir will svn add it sometimes:
+                os.makedirs(output_dir)
+        copydir.copy_dir(template_dir, output_dir,
+                         vars,
+                         verbosity=command.verbose,
+                         simulate=command.options.simulate,
+                         interactive=command.interactive,
+                         overwrite=command.options.overwrite,
+                         indent=1,
+                         use_cheetah=self.use_cheetah,
+                         template_renderer=self.template_renderer)
+
+    def print_vars(self, indent=0):
+        vars = self.read_vars()
+        var.print_vars(vars)
+        
+    def pre(self, command, output_dir, vars):
+        """
+        Called before template is applied.
+        """
+        pass
+
+    def post(self, command, output_dir, vars):
+        """
+        Called after template is applied.
+        """
+        pass
+
+NoDefault = command.NoDefault
+
+class var(object):
+
+    def __init__(self, name, description,
+                 default='', should_echo=True):
+        self.name = name
+        self.description = description
+        self.default = default
+        self.should_echo = should_echo
+
+    def __repr__(self):
+        return '<%s %s default=%r should_echo=%s>' % (
+            self.__class__.__name__,
+            self.name, self.default, self.should_echo)
+
+    def full_description(self):
+        if self.description:
+            return '%s (%s)' % (self.name, self.description)
+        else:
+            return self.name
+
+    def print_vars(cls, vars, indent=0):
+        max_name = max([len(v.name) for v in vars])
+        for var in vars:
+            if var.description:
+                print '%s%s%s  %s' % (
+                    ' '*indent,
+                    var.name,
+                    ' '*(max_name-len(var.name)),
+                    var.description)
+            else:
+                print '  %s' % var.name
+            if var.default is not command.NoDefault:
+                print '      default: %r' % var.default
+            if var.should_echo is True:
+                print '      should_echo: %s' % var.should_echo
+        print
+
+    print_vars = classmethod(print_vars)
+
+class BasicPackage(Template):
+
+    _template_dir = 'paster-templates/basic_package'
+    summary = "A basic setuptools-enabled package"
+    vars = [
+        var('version', 'Version (like 0.1)'),
+        var('description', 'One-line description of the package'),
+        var('long_description', 'Multi-line description (in reST)'),
+        var('keywords', 'Space-separated keywords/tags'),
+        var('author', 'Author name'),
+        var('author_email', 'Author email'),
+        var('url', 'URL of homepage'),
+        var('license_name', 'License name'),
+        var('zip_safe', 'True/False: if the package can be distributed as a .zip file', default=False),
+        ]
+
+    template_renderer = staticmethod(paste_script_template_renderer)
+    
+_skip_variables = ['VFN', 'currentTime', 'self', 'VFFSL', 'dummyTrans',
+                   'getmtime', 'trans']
+
+def find_args_in_template(template):
+    if isinstance(template, (str, unicode)):
+        # Treat as filename:
+        import Cheetah.Template
+        template = Cheetah.Template.Template(file=template)
+    if not hasattr(template, 'body'):
+        # Don't know...
+        return None
+    method = template.body
+    args, varargs, varkw, defaults = inspect.getargspec(method)
+    defaults=list(defaults or [])
+    vars = []
+    while args:
+        if len(args) == len(defaults):
+            default = defaults.pop(0)
+        else:
+            default = command.NoDefault
+        arg = args.pop(0)
+        if arg in _skip_variables:
+            continue
+        # @@: No way to get description yet
+        vars.append(
+            var(arg, description=None,
+                default=default))
+    return vars
+
+def find_args_in_dir(dir, verbose=False):
+    all_vars = {}
+    for fn in os.listdir(dir):
+        if fn.startswith('.') or fn == 'CVS' or fn == '_darcs':
+            continue
+        full = os.path.join(dir, fn)
+        if os.path.isdir(full):
+            inner_vars = find_args_in_dir(full)
+        elif full.endswith('_tmpl'):
+            inner_vars = {}
+            found = find_args_in_template(full)
+            if found is None:
+                # Couldn't read variables
+                if verbose:
+                    print 'Template %s has no parseable variables' % full
+                continue
+            for var in found:
+                inner_vars[var.name] = var
+        else:
+            # Not a template, don't read it
+            continue
+        if verbose:
+            print 'Found variable(s) %s in Template %s' % (
+                ', '.join(inner_vars.keys()), full)
+        for var_name, var in inner_vars.items():
+            # Easy case:
+            if var_name not in all_vars:
+                all_vars[var_name] = var
+                continue
+            # Emit warnings if the variables don't match well:
+            cur_var = all_vars[var_name]
+            if not cur_var.description:
+                cur_var.description = var.description
+            elif (cur_var.description and var.description
+                  and var.description != cur_var.description):
+                print >> sys.stderr, (
+                    "Variable descriptions do not match: %s: %s and %s"
+                    % (var_name, cur_var.description, var.description))
+            if (cur_var.default is not command.NoDefault
+                and var.default is not command.NoDefault
+                and cur_var.default != var.default):
+                print >> sys.stderr, (
+                    "Variable defaults do not match: %s: %r and %r"
+                    % (var_name, cur_var.default, var.default))
+    return all_vars
+
Index: /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/filemaker.py
===================================================================
--- /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/filemaker.py (revision 3)
+++ /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/filemaker.py (revision 3)
@@ -0,0 +1,362 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+import os
+import glob
+import pkg_resources
+from paste.script import pluginlib, copydir
+from paste.script.command import BadCommand
+difflib = None
+try:
+    import subprocess
+except ImportError:
+    from paste.script.util import subprocess24 as subprocess
+
+class FileOp(object):
+    """
+    Enhance the ease of file copying/processing from a package into a target
+    project
+    """
+    
+    def __init__(self, simulate=False, 
+                       verbose=True, 
+                       interactive=True,
+                       source_dir=None,
+                       template_vars=None):
+        """
+        Initialize our File operation helper object
+        
+        source_dir
+            Should refer to the directory within the package
+            that contains the templates to be used for the other copy
+            operations. It is assumed that packages will keep all their
+            templates under a hierarchy starting here.
+          
+            This should be an absolute path passed in, for example::
+          
+                FileOp(source_dir=os.path.dirname(__file__) + '/templates')
+        """
+        self.simulate = simulate
+        self.verbose = verbose
+        self.interactive = interactive
+        if template_vars is None:
+            template_vars = {}
+        self.template_vars = template_vars
+        self.source_dir = source_dir
+        self.use_pkg_resources = isinstance(source_dir, tuple)
+    
+    def copy_file(self, template, dest, filename=None, add_py=True, package=True,
+                  template_renderer=None):
+        """
+        Copy a file from the source location to somewhere in the
+        destination.
+        
+        template
+            The filename underneath self.source_dir to copy/process
+        dest
+            The destination directory in the project relative to where
+            this command is being run
+        filename
+            What to name the file in the target project, use the same name
+            as the template if not provided
+        add_py
+            Add a .py extension to all files copied
+        package
+            Whether or not this file is part of a Python package, and any
+            directories created should contain a __init__.py file as well.
+        template_renderer
+            An optional template renderer
+        
+        """
+        if not filename:
+            filename = template.split('/')[0]
+            if filename.endswith('_tmpl'):
+                filename = filename[:-5]
+        base_package, cdir = self.find_dir(dest, package)
+        self.template_vars['base_package'] = base_package
+        content = self.load_content(base_package, cdir, filename, template,
+                                    template_renderer=template_renderer)
+        if add_py:
+            # @@: Why is it a default to add a .py extension? 
+            filename = '%s.py' % filename
+        dest = os.path.join(cdir, filename)
+        self.ensure_file(dest, content, package)
+    
+    def copy_dir(self, template_dir, dest, destname=None, package=True):
+        """
+        Copy a directory recursively, processing any files within it
+        that need to be processed (end in _tmpl).
+        
+        template_dir
+            Directory under self.source_dir to copy/process
+        dest
+            Destination directory into which this directory will be copied
+            to.
+        destname
+            Use this name instead of the original template_dir name for
+            creating the directory
+        package
+            This directory will be a Python package and needs to have a
+            __init__.py file.
+        """
+        # @@: This should actually be implemented
+        raise NotImplementedError
+
+    def load_content(self, base_package, base, name, template,
+                     template_renderer=None):
+        blank = os.path.join(base, name + '.py')
+        read_content = True
+        if not os.path.exists(blank):
+            if self.use_pkg_resources:
+                fullpath = '/'.join([self.source_dir[1], template])
+                content = pkg_resources.resource_string(
+                    self.source_dir[0], fullpath)
+                read_content = False
+                blank = fullpath
+            else:
+                blank = os.path.join(self.source_dir,
+                                     template)
+        if read_content:
+            f = open(blank, 'r')
+            content = f.read()
+            f.close()
+        if blank.endswith('_tmpl'):
+            content = copydir.substitute_content(
+                content, self.template_vars, filename=blank,
+                template_renderer=template_renderer)
+        return content
+
+    def find_dir(self, dirname, package=False):
+        egg_info = pluginlib.find_egg_info_dir(os.getcwd())
+        # @@: Should give error about egg_info when top_level.txt missing
+        f = open(os.path.join(egg_info, 'top_level.txt'))
+        packages = [l.strip() for l in f.readlines()
+                    if l.strip() and not l.strip().startswith('#')]
+        f.close()
+        if not len(packages):
+            raise BadCommand("No top level dir found for %s" % dirname)
+        # @@: This doesn't support deeper servlet directories,
+        # or packages not kept at the top level.
+        base = os.path.dirname(egg_info)
+        possible = []
+        for pkg in packages:
+            d = os.path.join(base, pkg, dirname)
+            if os.path.exists(d):
+                possible.append((pkg, d))
+        if not possible:
+            self.ensure_dir(os.path.join(base, packages[0], dirname),
+                            package=package)
+            return self.find_dir(dirname)
+        if len(possible) > 1:
+            raise BadCommand(
+                "Multiple %s dirs found (%s)" % (dirname, possible))
+        return possible[0]
+    
+    def parse_path_name_args(self, name):
+        """
+        Given the name, assume that the first argument is a path/filename
+        combination. Return the name and dir of this. If the name ends with
+        '.py' that will be erased.
+        
+        Examples:
+            comments             ->          comments, ''
+            admin/comments       ->          comments, 'admin'
+            h/ab/fred            ->          fred, 'h/ab'
+        """
+        if name.endswith('.py'):
+            # Erase extensions
+            name = name[:-3]
+        if '.' in name:
+            # Turn into directory name:
+            name = name.replace('.', os.path.sep)
+        if '/' != os.path.sep:
+            name = name.replace('/', os.path.sep)
+        parts = name.split(os.path.sep)
+        name = parts[-1]
+        if not parts[:-1]:
+            dir = ''
+        elif len(parts[:-1]) == 1:
+            dir = parts[0]
+        else:
+            dir = os.path.join(*parts[:-1])
+        return name, dir
+    
+    def ensure_dir(self, dir, svn_add=True, package=False):
+        """
+        Ensure that the directory exists, creating it if necessary.
+        Respects verbosity and simulation.
+
+        Adds directory to subversion if ``.svn/`` directory exists in
+        parent, and directory was created.
+        
+        package
+            If package is True, any directories created will contain a
+            __init__.py file.
+        
+        """
+        dir = dir.rstrip(os.sep)
+        if not dir:
+            # we either reached the parent-most directory, or we got
+            # a relative directory
+            # @@: Should we make sure we resolve relative directories
+            # first?  Though presumably the current directory always
+            # exists.
+            return
+        if not os.path.exists(dir):
+            self.ensure_dir(os.path.dirname(dir), svn_add=svn_add, package=package)
+            if self.verbose:
+                print 'Creating %s' % self.shorten(dir)
+            if not self.simulate:
+                os.mkdir(dir)
+            if (svn_add and
+                os.path.exists(os.path.join(os.path.dirname(dir), '.svn'))):
+                self.svn_command('add', dir)
+            if package:
+                initfile = os.path.join(dir, '__init__.py')
+                f = open(initfile, 'wb')
+                f.write("#\n")
+                f.close()
+                print 'Creating %s' % self.shorten(initfile)
+                if (svn_add and
+                    os.path.exists(os.path.join(os.path.dirname(dir), '.svn'))):
+                    self.svn_command('add', initfile)
+        else:
+            if self.verbose > 1:
+                print "Directory already exists: %s" % self.shorten(dir)
+
+    def ensure_file(self, filename, content, svn_add=True, package=False):
+        """
+        Ensure a file named ``filename`` exists with the given
+        content.  If ``--interactive`` has been enabled, this will ask
+        the user what to do if a file exists with different content.
+        """
+        global difflib
+        self.ensure_dir(os.path.dirname(filename), svn_add=svn_add, package=package)
+        if not os.path.exists(filename):
+            if self.verbose:
+                print 'Creating %s' % filename
+            if not self.simulate:
+                f = open(filename, 'wb')
+                f.write(content)
+                f.close()
+            if svn_add and os.path.exists(os.path.join(os.path.dirname(filename), '.svn')):
+                self.svn_command('add', filename)
+            return
+        f = open(filename, 'rb')
+        old_content = f.read()
+        f.close()
+        if content == old_content:
+            if self.verbose > 1:
+                print 'File %s matches expected content' % filename
+            return
+        if self.interactive:
+            print 'Warning: file %s does not match expected content' % filename
+            if difflib is None:
+                import difflib
+            diff = difflib.context_diff(
+                content.splitlines(),
+                old_content.splitlines(),
+                'expected ' + filename,
+                filename)
+            print '\n'.join(diff)
+            if self.interactive:
+                while 1:
+                    s = raw_input(
+                        'Overwrite file with new content? [y/N] ').strip().lower()
+                    if not s:
+                        s = 'n'
+                    if s.startswith('y'):
+                        break
+                    if s.startswith('n'):
+                        return
+                    print 'Unknown response; Y or N please'
+            else:
+                return
+                    
+        if self.verbose:
+            print 'Overwriting %s with new content' % filename
+        if not self.simulate:
+            f = open(filename, 'wb')
+            f.write(content)
+            f.close()
+
+    def shorten(self, fn, *paths):
+        """
+        Return a shorted form of the filename (relative to the current
+        directory), typically for displaying in messages.  If
+        ``*paths`` are present, then use os.path.join to create the
+        full filename before shortening.
+        """
+        if paths:
+            fn = os.path.join(fn, *paths)
+        if fn.startswith(os.getcwd()):
+            return fn[len(os.getcwd()):].lstrip(os.path.sep)
+        else:
+            return fn
+
+    _svn_failed = False
+
+    def svn_command(self, *args, **kw):
+        """
+        Run an svn command, but don't raise an exception if it fails.
+        """
+        try:
+            return self.run_command('svn', *args, **kw)
+        except OSError, e:
+            if not self._svn_failed:
+                print 'Unable to run svn command (%s); proceeding anyway' % e
+                self._svn_failed = True
+
+    def run_command(self, cmd, *args, **kw):
+        """
+        Runs the command, respecting verbosity and simulation.
+        Returns stdout, or None if simulating.
+        """
+        cwd = popdefault(kw, 'cwd', os.getcwd())
+        capture_stderr = popdefault(kw, 'capture_stderr', False)
+        expect_returncode = popdefault(kw, 'expect_returncode', False)
+        assert not kw, ("Arguments not expected: %s" % kw)
+        if capture_stderr:
+            stderr_pipe = subprocess.STDOUT
+        else:
+            stderr_pipe = subprocess.PIPE
+        try:
+            proc = subprocess.Popen([cmd] + list(args),
+                                    cwd=cwd,
+                                    stderr=stderr_pipe,
+                                    stdout=subprocess.PIPE)
+        except OSError, e:
+            if e.errno != 2:
+                # File not found
+                raise
+            raise OSError(
+                "The expected executable %s was not found (%s)"
+                % (cmd, e))
+        if self.verbose:
+            print 'Running %s %s' % (cmd, ' '.join(args))
+        if self.simulate:
+            return None
+        stdout, stderr = proc.communicate()
+        if proc.returncode and not expect_returncode:
+            if not self.verbose:
+                print 'Running %s %s' % (cmd, ' '.join(args))
+            print 'Error (exit code: %s)' % proc.returncode
+            if stderr:
+                print stderr
+            raise OSError("Error executing command %s" % cmd)
+        if self.verbose > 2:
+            if stderr:
+                print 'Command error output:'
+                print stderr
+            if stdout:
+                print 'Command output:'
+                print stdout
+        return stdout
+
+def popdefault(dict, name, default=None):
+    if name not in dict:
+        return default
+    else:
+        v = dict[name]
+        del dict[name]
+        return v
+
Index: /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/__init__.py
===================================================================
--- /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/__init__.py (revision 3)
+++ /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/__init__.py (revision 3)
@@ -0,0 +1,3 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+#
Index: /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/epdesc.py
===================================================================
--- /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/epdesc.py (revision 3)
+++ /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/epdesc.py (revision 3)
@@ -0,0 +1,57 @@
+class MetaEntryPointDescription(object):
+    description = """
+    This is an entry point that describes other entry points.
+    """
+
+class CreateTemplateDescription(object):
+    description = """
+    Entry point for creating the file layout for a new project
+    from a template.
+    """
+
+class PasterCommandDescription(object):
+    description = """
+    Entry point that adds a command to the ``paster`` script
+    to a project that has specifically enabled the command.
+    """
+
+class GlobalPasterCommandDescription(object):
+    description = """
+    Entry point that adds a command to the ``paster`` script
+    globally.
+    """
+
+class AppInstallDescription(object):
+    description = """
+    This defines a runner that can install the application given a
+    configuration file.
+    """
+
+##################################################
+## Not in Paste per se, but we'll document
+## them...
+
+class ConsoleScriptsDescription(object):
+    description = """
+    When a package is installed, any entry point listed here will be
+    turned into a command-line script.
+    """
+
+class DistutilsCommandsDescription(object):
+    description = """
+    This will add a new command when running
+    ``python setup.py entry-point-name`` if the
+    package uses setuptools.
+    """
+
+class SetupKeywordsDescription(object):
+    description = """
+    This adds a new keyword to setup.py's setup() function, and a
+    validator to validate the value.
+    """
+
+class EggInfoWriters(object):
+    description = """
+    This adds a new writer that creates files in the PkgName.egg-info/
+    directory.
+    """
Index: /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/paster-templates/basic_package/+package+/__init__.py
===================================================================
--- /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/paster-templates/basic_package/+package+/__init__.py (revision 3)
+++ /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/paster-templates/basic_package/+package+/__init__.py (revision 3)
@@ -0,0 +1,1 @@
+#
Index: /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/paster-templates/basic_package/setup.py_tmpl
===================================================================
--- /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/paster-templates/basic_package/setup.py_tmpl (revision 3)
+++ /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/paster-templates/basic_package/setup.py_tmpl (revision 3)
@@ -0,0 +1,26 @@
+from setuptools import setup, find_packages
+import sys, os
+
+version = {{repr(version or "0.0")}}
+
+setup(name={{repr(project)}},
+      version=version,
+      description="{{description or ''}}",
+      long_description="""\
+{{long_description or ''}}""",
+      classifiers=[], # Get strings from http://pypi.python.org/pypi?%3Aaction=list_classifiers
+      keywords={{repr(keywords or '')}},
+      author={{repr(author or '')}},
+      author_email={{repr(author_email or '')}},
+      url={{repr(url or '')}},
+      license={{repr(license_name or '')}},
+      packages=find_packages(exclude=['ez_setup', 'examples', 'tests']),
+      include_package_data=True,
+      zip_safe={{repr(bool(zip_safe or False))}},
+      install_requires=[
+          # -*- Extra requirements: -*-
+      ],
+      entry_points="""
+      # -*- Entry points: -*-
+      """,
+      )
Index: /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/paster-templates/basic_package/setup.cfg
===================================================================
--- /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/paster-templates/basic_package/setup.cfg (revision 3)
+++ /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/paster-templates/basic_package/setup.cfg (revision 3)
@@ -0,0 +1,3 @@
+[egg_info]
+tag_build = dev
+tag_svn_revision = true
Index: /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/appinstall.py
===================================================================
--- /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/appinstall.py (revision 3)
+++ /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/appinstall.py (revision 3)
@@ -0,0 +1,613 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+"""
+Provides the two commands for preparing an application:
+``prepare-app`` and ``setup-app``
+"""
+
+import os
+import sys
+if sys.version_info < (2, 4):
+    from paste.script.util import string24 as string
+else:
+    import string
+import new
+from cStringIO import StringIO
+from paste.script.command import Command, BadCommand, run as run_command
+import paste.script.templates
+from paste.script import copydir
+import pkg_resources
+Cheetah = None
+from ConfigParser import ConfigParser
+from paste.util import import_string
+from paste.deploy import appconfig
+from paste.script.util import uuid
+from paste.script.util import secret
+
+class AbstractInstallCommand(Command):
+
+    default_interactive = 1
+
+    default_sysconfigs = [
+        (False, '/etc/paste/sysconfig.py'),
+        (False, '/usr/local/etc/paste/sysconfig.py'),
+        (True, 'paste.script.default_sysconfig'),
+        ]
+    if os.environ.get('HOME'):
+        default_sysconfigs.insert(
+            0, (False, os.path.join(os.environ['HOME'], '.paste', 'config',
+                                    'sysconfig.py')))
+    if os.environ.get('PASTE_SYSCONFIG'):
+        default_sysconfigs.insert(
+            0, (False, os.environ['PASTE_SYSCONFIG']))
+
+    def run(self, args):
+        # This is overridden so we can parse sys-config before we pass
+        # it to optparse
+        self.sysconfigs = self.default_sysconfigs
+        new_args = []
+        while args:
+            if args[0].startswith('--no-default-sysconfig'):
+                self.sysconfigs = []
+                args.pop(0)
+                continue
+            if args[0].startswith('--sysconfig='):
+                self.sysconfigs.insert(
+                    0, (True, args.pop(0)[len('--sysconfig='):]))
+                continue
+            if args[0] == '--sysconfig':
+                args.pop(0)
+                if not args:
+                    raise BadCommand, (
+                        "You gave --sysconfig as the last argument without "
+                        "a value")
+                self.sysconfigs.insert(0, (True, args.pop(0)))
+                continue
+            new_args.append(args.pop(0))
+        self.load_sysconfigs()
+        return super(AbstractInstallCommand, self).run(new_args)
+
+    #@classmethod
+    def standard_parser(cls, **kw):
+        parser = super(AbstractInstallCommand, cls).standard_parser(**kw)
+        parser.add_option('--sysconfig',
+                          action="append",
+                          dest="sysconfigs",
+                          help="System configuration file")
+        parser.add_option('--no-default-sysconfig',
+                          action='store_true',
+                          dest='no_default_sysconfig',
+                          help="Don't load the default sysconfig files")
+        parser.add_option(
+            '--easy-install',
+            action='append',
+            dest='easy_install_op',
+            metavar='OP',
+            help='An option to add if invoking easy_install (like --easy-install=exclude-scripts)')
+        parser.add_option(
+            '--no-install',
+            action='store_true',
+            dest='no_install',
+            help="Don't try to install the package (it must already be installed)")
+        parser.add_option(
+            '-f', '--find-links',
+            action='append',
+            dest='easy_install_find_links',
+            metavar='URL',
+            help='Passed through to easy_install')
+
+        return parser
+
+    standard_parser = classmethod(standard_parser)
+
+    ########################################
+    ## Sysconfig Handling
+    ########################################
+
+    def load_sysconfigs(self):
+        configs = self.sysconfigs[:]
+        configs.reverse()
+        self.sysconfig_modules = []
+        for index, (explicit, name) in enumerate(configs):
+            # @@: At some point I'd like to give the specialized
+            # modules some access to the values in earlier modules,
+            # e.g., to specialize those values or functions.  That's
+            # why these modules are loaded backwards.
+            if name.endswith('.py'):
+                if not os.path.exists(name):
+                    if explicit:
+                        raise BadCommand, (
+                            "sysconfig file %s does not exist"
+                            % name)
+                    else:
+                        continue
+                globs = {}
+                execfile(name, globs)
+                mod = new.module('__sysconfig_%i__' % index)
+                for name, value in globs.items():
+                    setattr(mod, name, value)
+                mod.__file__ = name
+            else:
+                try:
+                    mod = import_string.simple_import(name)
+                except ImportError, e:
+                    if explicit:
+                        raise
+                    else:
+                        continue
+            mod.paste_command = self
+            self.sysconfig_modules.insert(0, mod)
+        # @@: I'd really prefer to clone the parser here somehow,
+        # not to modify it in place
+        parser = self.parser
+        self.call_sysconfig_functions('add_custom_options', parser)
+
+    def get_sysconfig_option(self, name, default=None):
+        """
+        Return the value of the given option in the first sysconfig
+        module in which it is found, or ``default`` (None) if not
+        found in any.
+        """
+        for mod in self.sysconfig_modules:
+            if hasattr(mod, name):
+                return getattr(mod, name)
+        return default
+
+    def get_sysconfig_options(self, name):
+        """
+        Return the option value for the given name in all the
+        sysconfig modules in which is is found (``[]`` if none).
+        """
+        return [getattr(mod, name) for mod in self.sysconfig_modules
+                if hasattr(mod, name)]
+
+    def call_sysconfig_function(self, name, *args, **kw):
+        """
+        Call the specified function in the first sysconfig module it
+        is defined in.  ``NameError`` if no function is found.
+        """
+        val = self.get_sysconfig_option(name)
+        if val is None:
+            raise NameError, (
+                "Method %s not found in any sysconfig module" % name)
+        return val(*args, **kw)
+
+    def call_sysconfig_functions(self, name, *args, **kw):
+        """
+        Call all the named functions in the sysconfig modules,
+        returning a list of the return values.
+        """
+        return [method(*args, **kw) for method in
+                self.get_sysconfig_options(name)]
+
+    def sysconfig_install_vars(self, installer):
+        """
+        Return the folded results of calling the
+        ``install_variables()`` functions.
+        """
+        result = {}
+        all_vars = self.call_sysconfig_functions(
+            'install_variables', installer)
+        all_vars.reverse()
+        for vardict in all_vars:
+            result.update(vardict)
+        return result
+
+    ########################################
+    ## Distributions
+    ########################################
+
+    def get_distribution(self, req):
+        """
+        This gets a distribution object, and installs the distribution
+        if required.
+        """
+        try:
+            dist = pkg_resources.get_distribution(req)
+            if self.verbose:
+                print 'Distribution already installed:'
+                print ' ', dist, 'from', dist.location
+            return dist
+        except pkg_resources.DistributionNotFound:
+            if self.options.no_install:
+                print "Because --no-install was given, we won't try to install the package %s" % req
+                raise
+            options = ['-v', '-m']
+            for op in self.options.easy_install_op or []:
+                if not op.startswith('-'):
+                    op = '--'+op
+                options.append(op)
+            for op in self.options.easy_install_find_links or []:
+                options.append('--find-links=%s' % op)
+            if self.simulate:
+                raise BadCommand(
+                    "Must install %s, but in simulation mode" % req)
+            print "Must install %s" % req
+            from setuptools.command import easy_install
+            from setuptools import setup
+            setup(script_args=['-q', 'easy_install']
+                  + options + [req])
+            return pkg_resources.get_distribution(req)
+
+    def get_installer(self, distro, ep_group, ep_name):
+        installer_class = distro.load_entry_point(
+            'paste.app_install', ep_name)
+        installer = installer_class(
+            distro, ep_group, ep_name)
+        return installer
+    
+
+class MakeConfigCommand(AbstractInstallCommand):
+
+    default_verbosity = 1
+    max_args = None
+    min_args = 1
+    summary = "Install a package and create a fresh config file/directory"
+    usage = "PACKAGE_NAME [CONFIG_FILE] [VAR=VALUE]"
+
+    description = """\
+    Note: this is an experimental command, and it will probably change
+    in several ways by the next release.
+
+    make-config is part of a two-phase installation process (the
+    second phase is setup-app).  make-config installs the package
+    (using easy_install) and asks it to create a bare configuration
+    file or directory (possibly filling in defaults from the extra
+    variables you give).
+    """
+
+    parser = AbstractInstallCommand.standard_parser(
+        simulate=True, quiet=True, no_interactive=True)
+    parser.add_option('--info',
+                      action="store_true",
+                      dest="show_info",
+                      help="Show information on the package (after installing it), but do not write a config.")
+    parser.add_option('--name',
+                      action='store',
+                      dest='ep_name',
+                      help='The name of the application contained in the distribution (default "main")')
+    parser.add_option('--entry-group',
+                      action='store',
+                      dest='ep_group',
+                      default='paste.app_factory',
+                      help='The entry point group to install (i.e., the kind of application; default paste.app_factory')
+    parser.add_option('--edit',
+                      action='store_true',
+                      dest='edit',
+                      help='Edit the configuration file after generating it (using $EDITOR)')
+    parser.add_option('--setup',
+                      action='store_true',
+                      dest='run_setup',
+                      help='Run setup-app immediately after generating (and possibly editing) the configuration file')
+
+    def command(self):
+        self.requirement = self.args[0]
+        if '#' in self.requirement:
+            if self.options.ep_name is not None:
+                raise BadCommand(
+                    "You may not give both --name and a requirement with "
+                    "#name")
+            self.requirement, self.options.ep_name = self.requirement.split('#', 1)
+        if not self.options.ep_name:
+            self.options.ep_name = 'main'
+        self.distro = self.get_distribution(self.requirement)
+        self.installer = self.get_installer(
+            self.distro, self.options.ep_group, self.options.ep_name)
+        if self.options.show_info:
+            if len(self.args) > 1:
+                raise BadCommand(
+                    "With --info you can only give one argument")
+            return self.show_info()
+        if len(self.args) < 2:
+            # See if sysconfig can give us a default filename
+            options = filter(None, self.call_sysconfig_functions(
+                'default_config_filename', self.installer))
+            if not options:
+                raise BadCommand(
+                    "You must give a configuration filename")
+            self.config_file = options[0]
+        else:
+            self.config_file = self.args[1]
+        self.check_config_file()
+        self.project_name = self.distro.project_name
+        self.vars = self.sysconfig_install_vars(self.installer)
+        self.vars.update(self.parse_vars(self.args[2:]))
+        self.vars['project_name'] = self.project_name
+        self.vars['requirement'] = self.requirement
+        self.vars['ep_name'] = self.options.ep_name
+        self.vars['ep_group'] = self.options.ep_group
+        self.vars.setdefault('app_name', self.project_name.lower())
+        self.vars.setdefault('app_instance_uuid', uuid.uuid4())
+        self.vars.setdefault('app_instance_secret', secret.secret_string())
+        if self.verbose > 1:
+            print_vars = self.vars.items()
+            print_vars.sort()
+            print 'Variables for installation:'
+            for name, value in print_vars:
+                print '  %s: %r' % (name, value)
+        self.installer.write_config(self, self.config_file, self.vars)
+        edit_success = True
+        if self.options.edit:
+            edit_success = self.run_editor()
+        setup_configs = self.installer.editable_config_files(self.config_file)
+        # @@: We'll just assume the first file in the list is the one
+        # that works with setup-app...
+        setup_config = setup_configs[0]
+        if self.options.run_setup:
+            if not edit_success:
+                print 'Config-file editing was not successful.'
+                if self.ask('Run setup-app anyway?', default=False):
+                    self.run_setup(setup_config)
+            else:
+                self.run_setup(setup_config)
+        else:
+            filenames = self.installer.editable_config_files(self.config_file)
+            assert not isinstance(filenames, basestring), (
+                "editable_config_files returned a string, not a list")
+            if not filenames and filenames is not None:
+                print 'No config files need editing'
+            else:
+                print 'Now you should edit the config files'
+                if filenames:
+                    for fn in filenames:
+                        print '  %s' % fn
+
+    def show_info(self):
+        text = self.installer.description(None)
+        print text
+
+    def check_config_file(self):
+        if self.installer.expect_config_directory is None:
+            return
+        fn = self.config_file
+        if self.installer.expect_config_directory:
+            if os.path.splitext(fn)[1]:
+                raise BadCommand(
+                    "The CONFIG_FILE argument %r looks like a filename, "
+                    "and a directory name is expected" % fn)
+        else:
+            if fn.endswith('/') or not os.path.splitext(fn):
+                raise BadCommand(
+                    "The CONFIG_FILE argument %r looks like a directory "
+                    "name and a filename is expected" % fn)
+
+    def run_setup(self, filename):
+        run_command(['setup-app', filename])
+
+    def run_editor(self):
+        filenames = self.installer.editable_config_files(self.config_file)
+        if filenames is None:
+            print 'Warning: the config file is not known (--edit ignored)'
+            return False
+        if not filenames:
+            print 'Warning: no config files need editing (--edit ignored)'
+            return True
+        if len(filenames) > 1:
+            print 'Warning: there is more than one editable config file (--edit ignored)'
+            return False
+        if not os.environ.get('EDITOR'):
+            print 'Error: you must set $EDITOR if using --edit'
+            return False
+        if self.verbose:
+            print '%s %s' % (os.environ['EDITOR'], filenames[0])
+        retval = os.system('$EDITOR %s' % filenames[0])
+        if retval:
+            print 'Warning: editor %s returned with error code %i' % (
+                os.environ['EDITOR'], retval)
+            return False
+        return True
+        
+class SetupCommand(AbstractInstallCommand):
+
+    default_verbosity = 1
+    max_args = 1
+    min_args = 1
+    summary = "Setup an application, given a config file"
+    usage = "CONFIG_FILE"
+
+    description = """\
+    Note: this is an experimental command, and it will probably change
+    in several ways by the next release.
+
+    Setup an application according to its configuration file.  This is
+    the second part of a two-phase web application installation
+    process (the first phase is prepare-app).  The setup process may
+    consist of things like creating directories and setting up
+    databases.
+    """
+
+    parser = AbstractInstallCommand.standard_parser(
+        simulate=True, quiet=True, interactive=True)
+    parser.add_option('--name',
+                      action='store',
+                      dest='section_name',
+                      default=None,
+                      help='The name of the section to set up (default: app:main)')
+
+    def command(self):
+        config_spec = self.args[0]
+        section = self.options.section_name
+        if section is None:
+            if '#' in config_spec:
+                config_spec, section = config_spec.split('#', 1)
+            else:
+                section = 'main'
+        if not ':' in section:
+            plain_section = section
+            section = 'app:'+section
+        else:
+            plain_section = section.split(':', 1)[0]
+        if not config_spec.startswith('config:'):
+            config_spec = 'config:' + config_spec
+        if plain_section != 'main':
+            config_spec += '#' + plain_section
+        config_file = config_spec[len('config:'):].split('#', 1)[0]
+        config_file = os.path.join(os.getcwd(), config_file)
+        self.logging_file_config(config_file)
+        conf = appconfig(config_spec, relative_to=os.getcwd())
+        ep_name = conf.context.entry_point_name
+        ep_group = conf.context.protocol
+        dist = conf.context.distribution
+        if dist is None:
+            raise BadCommand(
+                "The section %r is not the application (probably a filter).  You should add #section_name, where section_name is the section that configures your application" % plain_section)
+        installer = self.get_installer(dist, ep_group, ep_name)
+        installer.setup_config(
+            self, config_file, section, self.sysconfig_install_vars(installer))
+        self.call_sysconfig_functions(
+            'post_setup_hook', installer, config_file)
+        
+        
+class Installer(object):
+
+    """
+    Abstract base class for installers, and also a generic
+    installer that will run off config files in the .egg-info
+    directory of a distribution.
+
+    Packages that simply refer to this installer can provide a file
+    ``*.egg-info/paste_deploy_config.ini_tmpl`` that will be
+    interpreted by Cheetah.  They can also provide ``websetup``
+    modules with a ``setup_app(command, conf, vars)`` (or the
+    now-deprecated ``setup_config(command, filename, section, vars)``)
+    function, that will be called.
+
+    In the future other functions or configuration files may be
+    called.
+    """
+
+    # If this is true, then try to detect filename-looking config_file
+    # values, and reject them.  Conversely, if false try to detect
+    # directory-looking values and reject them.  None means don't
+    # check.
+    expect_config_directory = False
+    
+    # Set this to give a default config filename when none is
+    # specified:
+    default_config_filename = None
+
+    # Set this to true to use Cheetah to fill your templates, or false
+    # to not do so:
+    use_cheetah = True
+
+    def __init__(self, dist, ep_group, ep_name):
+        self.dist = dist
+        self.ep_group = ep_group
+        self.ep_name = ep_name
+
+    def description(self, config):
+        return 'An application'
+        
+    def write_config(self, command, filename, vars):
+        """
+        Writes the content to the filename (directory or single file).
+        You should use the ``command`` object, which respects things
+        like simulation and interactive.  ``vars`` is a dictionary
+        of user-provided variables.
+        """
+        command.ensure_file(filename, self.config_content(command, vars))
+
+    def editable_config_files(self, filename):
+        """
+        Return a list of filenames; this is primarily used when the
+        filename is treated as a directory and several configuration
+        files are created.  The default implementation returns the
+        file itself.  Return None if you don't know what files should
+        be edited on installation.
+        """
+        if not self.expect_config_directory:
+            return [filename]
+        else:
+            return None
+
+    def config_content(self, command, vars):
+        """
+        Called by ``self.write_config``, this returns the text content
+        for the config file, given the provided variables.
+
+        The default implementation reads
+        ``Package.egg-info/paste_deploy_config.ini_tmpl`` and fills it
+        with the variables.
+        """
+        global Cheetah
+        meta_name = 'paste_deploy_config.ini_tmpl'
+        if not self.dist.has_metadata(meta_name):
+            if command.verbose:
+                print 'No %s found' % meta_name
+            return self.simple_config(vars)
+        return self.template_renderer(
+            self.dist.get_metadata(meta_name), vars, filename=meta_name)
+
+    def template_renderer(self, content, vars, filename=None):
+        """
+        Subclasses may override this to provide different template
+        substitution (e.g., use a different template engine).
+        """
+        if self.use_cheetah:
+            import Cheetah.Template
+            tmpl = Cheetah.Template.Template(content,
+                                             searchList=[vars])
+            return copydir.careful_sub(
+                tmpl, vars, filename)
+        else:
+            tmpl = string.Template(content)
+            return tmpl.substitute(vars)
+
+    def simple_config(self, vars):
+        """
+        Return a very simple configuration file for this application.
+        """
+        if self.ep_name != 'main':
+            ep_name = '#'+self.ep_name
+        else:
+            ep_name = ''
+        return ('[app:main]\n'
+                'use = egg:%s%s\n'
+                % (self.dist.project_name, ep_name))
+
+    def setup_config(self, command, filename, section, vars):
+        """
+        Called to setup an application, given its configuration
+        file/directory.
+
+        The default implementation calls
+        ``package.websetup.setup_config(command, filename, section,
+        vars)`` or ``package.websetup.setup_app(command, config,
+        vars)``
+
+        With ``setup_app`` the ``config`` object is a dictionary with
+        the extra attributes ``global_conf``, ``local_conf`` and
+        ``filename``
+        """
+        modules = [
+            line.strip()
+            for line in self.dist.get_metadata_lines('top_level.txt')
+            if line.strip() and not line.strip().startswith('#')]
+        if not modules:
+            print 'No modules are listed in top_level.txt'
+            print 'Try running python setup.py egg_info to regenerate that file'
+        for mod_name in modules:
+            mod_name = mod_name + '.websetup'
+            mod = import_string.try_import_module(mod_name)
+            if mod is None:
+                continue
+            if command.verbose:
+                print 'Running setup_config() from %s' % mod_name
+            if hasattr(mod, 'setup_app'):
+                self._call_setup_app(
+                    mod.setup_app, command, filename, section, vars)
+            elif hasattr(mod, 'setup_config'):
+                mod.setup_config(command, filename, section, vars)
+            else:
+                print 'No setup_app() or setup_config() function in %s (%s)' % (
+                    mod.__name__, mod.__file__)
+
+    def _call_setup_app(self, func, command, filename, section, vars):
+        filename = os.path.abspath(filename)
+        if ':' in section:
+            section = section.split(':', 1)[1]
+        conf = 'config:%s#%s' % (filename, section)
+        conf = appconfig(conf)
+        conf.filename = filename
+        func(command, conf, vars)
+
Index: /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/default_sysconfig.py
===================================================================
--- /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/default_sysconfig.py (revision 3)
+++ /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/default_sysconfig.py (revision 3)
@@ -0,0 +1,44 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+"""
+This module contains default sysconfig settings.
+
+The command object is inserted into this module as a global variable
+``paste_command``, and can be used inside functions.
+"""
+
+def add_custom_options(parser):
+    """
+    This method can modify the ``parser`` object (which is an
+    ``optparse.OptionParser`` instance).  This can be used to add new
+    options to the command.
+    """
+    pass
+
+def default_config_filename(installer):
+    """
+    This function can return a default filename or directory for the
+    configuration file, if none was explicitly given.
+
+    Return None to mean no preference.  The first non-None returning
+    value will be used.
+
+    Pay attention to ``installer.expect_config_directory`` here,
+    and to ``installer.default_config_filename``.  
+    """
+    return installer.default_config_filename
+
+def install_variables(installer):
+    """
+    Returns a dictionary of variables for use later in the process
+    (e.g., filling a configuration file).  These are combined from all
+    sysconfig files.
+    """
+    return {}
+
+def post_setup_hook(installer, config_file):
+    """
+    This is called at the very end of ``paster setup-app``.  You
+    might use it to register an application globally.
+    """
+    pass
Index: /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/bool_optparse.py
===================================================================
--- /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/bool_optparse.py (revision 3)
+++ /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/bool_optparse.py (revision 3)
@@ -0,0 +1,60 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+"""
+A subclass of ``optparse.OptionParser`` that allows boolean long
+options (like ``--verbose``) to also take arguments (like
+``--verbose=true``).  Arguments *must* use ``=``.
+"""
+
+import optparse
+try:
+    _ = optparse._
+except AttributeError:
+    from gettext import gettext as _
+
+class BoolOptionParser(optparse.OptionParser):
+
+    def _process_long_opt(self, rargs, values):
+        arg = rargs.pop(0)
+
+        # Value explicitly attached to arg?  Pretend it's the next
+        # argument.
+        if "=" in arg:
+            (opt, next_arg) = arg.split("=", 1)
+            rargs.insert(0, next_arg)
+            had_explicit_value = True
+        else:
+            opt = arg
+            had_explicit_value = False
+
+        opt = self._match_long_opt(opt)
+        option = self._long_opt[opt]
+        if option.takes_value():
+            nargs = option.nargs
+            if len(rargs) < nargs:
+                if nargs == 1:
+                    self.error(_("%s option requires an argument") % opt)
+                else:
+                    self.error(_("%s option requires %d arguments")
+                               % (opt, nargs))
+            elif nargs == 1:
+                value = rargs.pop(0)
+            else:
+                value = tuple(rargs[0:nargs])
+                del rargs[0:nargs]
+
+        elif had_explicit_value:
+            value = rargs[0].lower().strip()
+            del rargs[0:1]
+            if value in ('true', 'yes', 'on', '1', 'y', 't'):
+                value = None
+            elif value in ('false', 'no', 'off', '0', 'n', 'f'):
+                # Don't process
+                return
+            else:
+                self.error(_('%s option takes a boolean value only (true/false)') % opt)
+
+        else:
+            value = None
+
+        option.process(opt, value, values, self)
Index: /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/copydir.py
===================================================================
--- /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/copydir.py (revision 3)
+++ /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/copydir.py (revision 3)
@@ -0,0 +1,431 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+import os
+import pkg_resources
+import sys
+if sys.version_info < (2, 4):
+    from paste.script.util import string24 as string
+else:
+    import string
+import cgi
+import urllib
+import re
+Cheetah = None
+try:
+    import subprocess
+except ImportError:
+    from paste.script.util import subprocess24 as subprocess
+import inspect
+
+class SkipTemplate(Exception):
+    """
+    Raised to indicate that the template should not be copied over.
+    Raise this exception during the substitution of your template
+    """
+
+def copy_dir(source, dest, vars, verbosity, simulate, indent=0,
+             use_cheetah=False, sub_vars=True, interactive=False,
+             svn_add=True, overwrite=True, template_renderer=None):
+    """
+    Copies the ``source`` directory to the ``dest`` directory.
+
+    ``vars``: A dictionary of variables to use in any substitutions.
+
+    ``verbosity``: Higher numbers will show more about what is happening.
+
+    ``simulate``: If true, then don't actually *do* anything.
+
+    ``indent``: Indent any messages by this amount.
+
+    ``sub_vars``: If true, variables in ``_tmpl`` files and ``+var+``
+    in filenames will be substituted.
+
+    ``use_cheetah``: If true, then any templates encountered will be
+    substituted with Cheetah.  Otherwise ``template_renderer`` or
+    ``string.Template`` will be used for templates.
+
+    ``svn_add``: If true, any files written out in directories with
+    ``.svn/`` directories will be added (via ``svn add``).
+
+    ``overwrite``: If false, then don't every overwrite anything.
+
+    ``interactive``: If you are overwriting a file and interactive is
+    true, then ask before overwriting.
+
+    ``template_renderer``: This is a function for rendering templates
+    (if you don't want to use Cheetah or string.Template).  It should
+    have the signature ``template_renderer(content_as_string,
+    vars_as_dict, filename=filename)``.
+    """
+    # This allows you to use a leading +dot+ in filenames which would
+    # otherwise be skipped because leading dots make the file hidden:
+    vars.setdefault('dot', '.')
+    vars.setdefault('plus', '+')
+    use_pkg_resources = isinstance(source, tuple)
+    if use_pkg_resources:
+        names = pkg_resources.resource_listdir(source[0], source[1])
+    else:
+        names = os.listdir(source)
+    names.sort()
+    pad = ' '*(indent*2)
+    if not os.path.exists(dest):
+        if verbosity >= 1:
+            print '%sCreating %s/' % (pad, dest)
+        if not simulate:
+            svn_makedirs(dest, svn_add=svn_add, verbosity=verbosity,
+                         pad=pad)
+    elif verbosity >= 2:
+        print '%sDirectory %s exists' % (pad, dest)
+    for name in names:
+        if use_pkg_resources:
+            full = '/'.join([source[1], name])
+        else:
+            full = os.path.join(source, name)
+        reason = should_skip_file(name)
+        if reason:
+            if verbosity >= 2:
+                reason = pad + reason % {'filename': full}
+                print reason
+            continue
+        if sub_vars:
+            dest_full = os.path.join(dest, substitute_filename(name, vars))
+        sub_file = False
+        if dest_full.endswith('_tmpl'):
+            dest_full = dest_full[:-5]
+            sub_file = sub_vars
+        if use_pkg_resources and pkg_resources.resource_isdir(source[0], full):
+            if verbosity:
+                print '%sRecursing into %s' % (pad, os.path.basename(full))
+            copy_dir((source[0], full), dest_full, vars, verbosity, simulate,
+                     indent=indent+1, use_cheetah=use_cheetah,
+                     sub_vars=sub_vars, interactive=interactive,
+                     svn_add=svn_add, template_renderer=template_renderer)
+            continue
+        elif not use_pkg_resources and os.path.isdir(full):
+            if verbosity:
+                print '%sRecursing into %s' % (pad, os.path.basename(full))
+            copy_dir(full, dest_full, vars, verbosity, simulate,
+                     indent=indent+1, use_cheetah=use_cheetah,
+                     sub_vars=sub_vars, interactive=interactive,
+                     svn_add=svn_add, template_renderer=template_renderer)
+            continue
+        elif use_pkg_resources:
+            content = pkg_resources.resource_string(source[0], full)
+        else:
+            f = open(full, 'rb')
+            content = f.read()
+            f.close()
+        if sub_file:
+            try:
+                content = substitute_content(content, vars, filename=full,
+                                             use_cheetah=use_cheetah,
+                                             template_renderer=template_renderer)
+            except SkipTemplate:
+                continue
+            if content is None:
+                continue
+        already_exists = os.path.exists(dest_full)
+        if already_exists:
+            f = open(dest_full, 'rb')
+            old_content = f.read()
+            f.close()
+            if old_content == content:
+                if verbosity:
+                    print '%s%s already exists (same content)' % (pad, dest_full)
+                continue
+            if interactive:
+                if not query_interactive(
+                    full, dest_full, content, old_content,
+                    simulate=simulate):
+                    continue
+            elif not overwrite:
+                continue
+        if verbosity and use_pkg_resources:
+            print '%sCopying %s to %s' % (pad, full, dest_full)
+        elif verbosity:
+            print '%sCopying %s to %s' % (pad, os.path.basename(full), dest_full)
+        if not simulate:
+            f = open(dest_full, 'wb')
+            f.write(content)
+            f.close()
+        if svn_add and not already_exists:
+            if not os.path.exists(os.path.join(os.path.dirname(os.path.abspath(dest_full)), '.svn')):
+                if verbosity > 1:
+                    print '%s.svn/ does not exist; cannot add file' % pad
+            else:
+                cmd = ['svn', 'add', dest_full]
+                if verbosity > 1:
+                    print '%sRunning: %s' % (pad, ' '.join(cmd))
+                if not simulate:
+                    # @@: Should
+                    proc = subprocess.Popen(cmd, stdout=subprocess.PIPE)
+                    stdout, stderr = proc.communicate()
+                    if verbosity > 1 and stdout:
+                        print 'Script output:'
+                        print stdout
+        elif svn_add and already_exists and verbosity > 1:
+            print '%sFile already exists (not doing svn add)' % pad
+
+def should_skip_file(name):
+    """
+    Checks if a file should be skipped based on its name.
+
+    If it should be skipped, returns the reason, otherwise returns
+    None.
+    """
+    if name.startswith('.'):
+        return 'Skipping hidden file %(filename)s'
+    if name.endswith('~') or name.endswith('.bak'):
+        return 'Skipping backup file %(filename)s'
+    if name.endswith('.pyc'):
+        return 'Skipping .pyc file %(filename)s'
+    if name.endswith('$py.class'):
+        return 'Skipping $py.class file %(filename)s'
+    if name in ('CVS', '_darcs'):
+        return 'Skipping version control directory %(filename)s'
+    return None
+
+# Overridden on user's request:
+all_answer = None
+
+def query_interactive(src_fn, dest_fn, src_content, dest_content,
+                      simulate):
+    global all_answer
+    from difflib import unified_diff, context_diff
+    u_diff = list(unified_diff(
+        dest_content.splitlines(),
+        src_content.splitlines(),
+        dest_fn, src_fn))
+    c_diff = list(context_diff(
+        dest_content.splitlines(),
+        src_content.splitlines(),
+        dest_fn, src_fn))
+    added = len([l for l in u_diff if l.startswith('+')
+                   and not l.startswith('+++')])
+    removed = len([l for l in u_diff if l.startswith('-')
+                   and not l.startswith('---')])
+    if added > removed:
+        msg = '; %i lines added' % (added-removed)
+    elif removed > added:
+        msg = '; %i lines removed' % (removed-added)
+    else:
+        msg = ''
+    print 'Replace %i bytes with %i bytes (%i/%i lines changed%s)' % (
+        len(dest_content), len(src_content),
+        removed, len(dest_content.splitlines()), msg)
+    prompt = 'Overwrite %s [y/n/d/B/?] ' % dest_fn
+    while 1:
+        if all_answer is None:
+            response = raw_input(prompt).strip().lower()
+        else:
+            response = all_answer
+        if not response or response[0] == 'b':
+            import shutil
+            new_dest_fn = dest_fn + '.bak'
+            n = 0
+            while os.path.exists(new_dest_fn):
+                n += 1
+                new_dest_fn = dest_fn + '.bak' + str(n)
+            print 'Backing up %s to %s' % (dest_fn, new_dest_fn)
+            if not simulate:
+                shutil.copyfile(dest_fn, new_dest_fn)
+            return True
+        elif response.startswith('all '):
+            rest = response[4:].strip()
+            if not rest or rest[0] not in ('y', 'n', 'b'):
+                print query_usage
+                continue
+            response = all_answer = rest[0]
+        if response[0] == 'y':
+            return True
+        elif response[0] == 'n':
+            return False
+        elif response == 'dc':
+            print '\n'.join(c_diff)
+        elif response[0] == 'd':
+            print '\n'.join(u_diff)
+        else:
+            print query_usage
+
+query_usage = """\
+Responses:
+  Y(es):    Overwrite the file with the new content.
+  N(o):     Do not overwrite the file.
+  D(iff):   Show a unified diff of the proposed changes (dc=context diff)
+  B(ackup): Save the current file contents to a .bak file
+            (and overwrite)
+  Type "all Y/N/B" to use Y/N/B for answer to all future questions
+"""
+
+def svn_makedirs(dir, svn_add, verbosity, pad):
+    parent = os.path.dirname(os.path.abspath(dir))
+    if not os.path.exists(parent):
+        svn_makedirs(parent, svn_add, verbosity, pad)
+    os.mkdir(dir)
+    if not svn_add:
+        return
+    if not os.path.exists(os.path.join(parent, '.svn')):
+        if verbosity > 1:
+            print '%s.svn/ does not exist; cannot add directory' % pad
+        return
+    cmd = ['svn', 'add', dir]
+    if verbosity > 1:
+        print '%sRunning: %s' % (pad, ' '.join(cmd))
+    proc = subprocess.Popen(cmd, stdout=subprocess.PIPE)
+    stdout, stderr = proc.communicate()
+    if verbosity > 1 and stdout:
+        print 'Script output:'
+        print stdout
+
+def substitute_filename(fn, vars):
+    for var, value in vars.items():
+        fn = fn.replace('+%s+' % var, str(value))
+    return fn
+
+def substitute_content(content, vars, filename='<string>',
+                       use_cheetah=False, template_renderer=None):
+    global Cheetah
+    v = standard_vars.copy()
+    v.update(vars)
+    vars = v
+    if template_renderer is not None:
+        return template_renderer(content, vars, filename=filename)
+    if not use_cheetah:
+        tmpl = LaxTemplate(content)
+        try:
+            return tmpl.substitute(TypeMapper(v))
+        except Exception, e:
+            _add_except(e, ' in file %s' % filename)
+            raise
+    if Cheetah is None:
+        import Cheetah.Template
+    tmpl = Cheetah.Template.Template(source=content,
+                                     searchList=[vars])
+    return careful_sub(tmpl, vars, filename)
+
+def careful_sub(cheetah_template, vars, filename):
+    """
+    Substitutes the template with the variables, using the
+    .body() method if it exists.  It assumes that the variables
+    were also passed in via the searchList.
+    """
+    if not hasattr(cheetah_template, 'body'):
+        return sub_catcher(filename, vars, str, cheetah_template)
+    body = cheetah_template.body
+    args, varargs, varkw, defaults = inspect.getargspec(body)
+    call_vars = {}
+    for arg in args:
+        if arg in vars:
+            call_vars[arg] = vars[arg]
+    return sub_catcher(filename, vars, body, **call_vars)
+
+def sub_catcher(filename, vars, func, *args, **kw):
+    """
+    Run a substitution, returning the value.  If an error occurs, show
+    the filename.  If the error is a NameError, show the variables.
+    """
+    try:
+        return func(*args, **kw)
+    except SkipTemplate, e:
+        print 'Skipping file %s' % filename
+        if str(e):
+            print str(e)
+        raise
+    except Exception, e:
+        print 'Error in file %s:' % filename
+        if isinstance(e, NameError):
+            items = vars.items()
+            items.sort()
+            for name, value in items:
+                print '%s = %r' % (name, value)
+        raise
+
+def html_quote(s):
+    if s is None:
+        return ''
+    return cgi.escape(str(s), 1)
+
+def url_quote(s):
+    if s is None:
+        return ''
+    return urllib.quote(str(s))
+
+def test(conf, true_cond, false_cond=None):
+    if conf:
+        return true_cond
+    else:
+        return false_cond
+
+def skip_template(condition=True, *args):
+    """
+    Raise SkipTemplate, which causes copydir to skip the template
+    being processed.  If you pass in a condition, only raise if that
+    condition is true (allows you to use this with string.Template)
+
+    If you pass any additional arguments, they will be used to
+    instantiate SkipTemplate (generally use like
+    ``skip_template(license=='GPL', 'Skipping file; not using GPL')``)
+    """
+    if condition:
+        raise SkipTemplate(*args)
+
+def _add_except(exc, info):
+    if not hasattr(exc, 'args') or exc.args is None:
+        return
+    args = list(exc.args)
+    if args:
+        args[0] += ' ' + info
+    else:
+        args = [info]
+    exc.args = tuple(args)
+    return
+    
+
+standard_vars = {
+    'nothing': None,
+    'html_quote': html_quote,
+    'url_quote': url_quote,
+    'empty': '""',
+    'test': test,
+    'repr': repr,
+    'str': str,
+    'bool': bool,
+    'SkipTemplate': SkipTemplate,
+    'skip_template': skip_template,
+    }
+
+class TypeMapper(dict):
+
+    def __getitem__(self, item):
+        options = item.split('|')
+        for op in options[:-1]:
+            try:
+                value = eval_with_catch(op, dict(self.items()))
+                break
+            except (NameError, KeyError):
+                pass
+        else:
+            value = eval(options[-1], dict(self.items()))
+        if value is None:
+            return ''
+        else:
+            return str(value)
+
+def eval_with_catch(expr, vars):
+    try:
+        return eval(expr, vars)
+    except Exception, e:
+        _add_except(e, 'in expression %r' % expr)
+        raise
+        
+class LaxTemplate(string.Template):
+    # This change of pattern allows for anything in braces, but
+    # only identifiers outside of braces:
+    pattern = r"""
+    \$(?:
+      (?P<escaped>\$)             |   # Escape sequence of two delimiters
+      (?P<named>[_a-z][_a-z0-9]*) |   # delimiter and a Python identifier
+      {(?P<braced>.*?)}           |   # delimiter and a braced identifier
+      (?P<invalid>)                   # Other ill-formed delimiter exprs
+    )
+    """
Index: /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/wsgiserver/__init__.py
===================================================================
--- /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/wsgiserver/__init__.py (revision 3)
+++ /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/wsgiserver/__init__.py (revision 3)
@@ -0,0 +1,1783 @@
+"""A high-speed, production ready, thread pooled, generic WSGI server.
+
+Simplest example on how to use this module directly
+(without using CherryPy's application machinery):
+
+    from cherrypy import wsgiserver
+    
+    def my_crazy_app(environ, start_response):
+        status = '200 OK'
+        response_headers = [('Content-type','text/plain')]
+        start_response(status, response_headers)
+        return ['Hello world!\n']
+    
+    server = wsgiserver.CherryPyWSGIServer(
+                ('0.0.0.0', 8070), my_crazy_app,
+                server_name='www.cherrypy.example')
+    
+The CherryPy WSGI server can serve as many WSGI applications 
+as you want in one instance by using a WSGIPathInfoDispatcher:
+    
+    d = WSGIPathInfoDispatcher({'/': my_crazy_app, '/blog': my_blog_app})
+    server = wsgiserver.CherryPyWSGIServer(('0.0.0.0', 80), d)
+    
+Want SSL support? Just set these attributes:
+    
+    server.ssl_certificate = <filename>
+    server.ssl_private_key = <filename>
+    
+    if __name__ == '__main__':
+        try:
+            server.start()
+        except KeyboardInterrupt:
+            server.stop()
+
+This won't call the CherryPy engine (application side) at all, only the
+WSGI server, which is independant from the rest of CherryPy. Don't
+let the name "CherryPyWSGIServer" throw you; the name merely reflects
+its origin, not its coupling.
+
+For those of you wanting to understand internals of this module, here's the
+basic call flow. The server's listening thread runs a very tight loop,
+sticking incoming connections onto a Queue:
+
+    server = CherryPyWSGIServer(...)
+    server.start()
+    while True:
+        tick()
+        # This blocks until a request comes in:
+        child = socket.accept()
+        conn = HTTPConnection(child, ...)
+        server.requests.put(conn)
+
+Worker threads are kept in a pool and poll the Queue, popping off and then
+handling each connection in turn. Each connection can consist of an arbitrary
+number of requests and their responses, so we run a nested loop:
+
+    while True:
+        conn = server.requests.get()
+        conn.communicate()
+        ->  while True:
+                req = HTTPRequest(...)
+                req.parse_request()
+                ->  # Read the Request-Line, e.g. "GET /page HTTP/1.1"
+                    req.rfile.readline()
+                    req.read_headers()
+                req.respond()
+                ->  response = wsgi_app(...)
+                    try:
+                        for chunk in response:
+                            if chunk:
+                                req.write(chunk)
+                    finally:
+                        if hasattr(response, "close"):
+                            response.close()
+                if req.close_connection:
+                    return
+"""
+
+
+import base64
+import os
+import Queue
+import re
+quoted_slash = re.compile("(?i)%2F")
+import rfc822
+import socket
+try:
+    import cStringIO as StringIO
+except ImportError:
+    import StringIO
+
+_fileobject_uses_str_type = isinstance(socket._fileobject(None)._rbuf, basestring)
+
+import sys
+import threading
+import time
+import traceback
+from urllib import unquote
+from urlparse import urlparse
+import warnings
+
+try:
+    from OpenSSL import SSL
+    from OpenSSL import crypto
+except ImportError:
+    SSL = None
+
+import errno
+
+def plat_specific_errors(*errnames):
+    """Return error numbers for all errors in errnames on this platform.
+    
+    The 'errno' module contains different global constants depending on
+    the specific platform (OS). This function will return the list of
+    numeric values for a given list of potential names.
+    """
+    errno_names = dir(errno)
+    nums = [getattr(errno, k) for k in errnames if k in errno_names]
+    # de-dupe the list
+    return dict.fromkeys(nums).keys()
+
+socket_error_eintr = plat_specific_errors("EINTR", "WSAEINTR")
+
+socket_errors_to_ignore = plat_specific_errors(
+    "EPIPE",
+    "EBADF", "WSAEBADF",
+    "ENOTSOCK", "WSAENOTSOCK",
+    "ETIMEDOUT", "WSAETIMEDOUT",
+    "ECONNREFUSED", "WSAECONNREFUSED",
+    "ECONNRESET", "WSAECONNRESET",
+    "ECONNABORTED", "WSAECONNABORTED",
+    "ENETRESET", "WSAENETRESET",
+    "EHOSTDOWN", "EHOSTUNREACH",
+    )
+socket_errors_to_ignore.append("timed out")
+
+socket_errors_nonblocking = plat_specific_errors(
+    'EAGAIN', 'EWOULDBLOCK', 'WSAEWOULDBLOCK')
+
+comma_separated_headers = ['ACCEPT', 'ACCEPT-CHARSET', 'ACCEPT-ENCODING',
+    'ACCEPT-LANGUAGE', 'ACCEPT-RANGES', 'ALLOW', 'CACHE-CONTROL',
+    'CONNECTION', 'CONTENT-ENCODING', 'CONTENT-LANGUAGE', 'EXPECT',
+    'IF-MATCH', 'IF-NONE-MATCH', 'PRAGMA', 'PROXY-AUTHENTICATE', 'TE',
+    'TRAILER', 'TRANSFER-ENCODING', 'UPGRADE', 'VARY', 'VIA', 'WARNING',
+    'WWW-AUTHENTICATE']
+
+
+class WSGIPathInfoDispatcher(object):
+    """A WSGI dispatcher for dispatch based on the PATH_INFO.
+    
+    apps: a dict or list of (path_prefix, app) pairs.
+    """
+    
+    def __init__(self, apps):
+        try:
+            apps = apps.items()
+        except AttributeError:
+            pass
+        
+        # Sort the apps by len(path), descending
+        apps.sort()
+        apps.reverse()
+        
+        # The path_prefix strings must start, but not end, with a slash.
+        # Use "" instead of "/".
+        self.apps = [(p.rstrip("/"), a) for p, a in apps]
+    
+    def __call__(self, environ, start_response):
+        path = environ["PATH_INFO"] or "/"
+        for p, app in self.apps:
+            # The apps list should be sorted by length, descending.
+            if path.startswith(p + "/") or path == p:
+                environ = environ.copy()
+                environ["SCRIPT_NAME"] = environ["SCRIPT_NAME"] + p
+                environ["PATH_INFO"] = path[len(p):]
+                return app(environ, start_response)
+        
+        start_response('404 Not Found', [('Content-Type', 'text/plain'),
+                                         ('Content-Length', '0')])
+        return ['']
+
+
+class MaxSizeExceeded(Exception):
+    pass
+
+class SizeCheckWrapper(object):
+    """Wraps a file-like object, raising MaxSizeExceeded if too large."""
+    
+    def __init__(self, rfile, maxlen):
+        self.rfile = rfile
+        self.maxlen = maxlen
+        self.bytes_read = 0
+    
+    def _check_length(self):
+        if self.maxlen and self.bytes_read > self.maxlen:
+            raise MaxSizeExceeded()
+    
+    def read(self, size=None):
+        data = self.rfile.read(size)
+        self.bytes_read += len(data)
+        self._check_length()
+        return data
+    
+    def readline(self, size=None):
+        if size is not None:
+            data = self.rfile.readline(size)
+            self.bytes_read += len(data)
+            self._check_length()
+            return data
+        
+        # User didn't specify a size ...
+        # We read the line in chunks to make sure it's not a 100MB line !
+        res = []
+        while True:
+            data = self.rfile.readline(256)
+            self.bytes_read += len(data)
+            self._check_length()
+            res.append(data)
+            # See http://www.cherrypy.org/ticket/421
+            if len(data) < 256 or data[-1:] == "\n":
+                return ''.join(res)
+    
+    def readlines(self, sizehint=0):
+        # Shamelessly stolen from StringIO
+        total = 0
+        lines = []
+        line = self.readline()
+        while line:
+            lines.append(line)
+            total += len(line)
+            if 0 < sizehint <= total:
+                break
+            line = self.readline()
+        return lines
+    
+    def close(self):
+        self.rfile.close()
+    
+    def __iter__(self):
+        return self
+    
+    def next(self):
+        data = self.rfile.next()
+        self.bytes_read += len(data)
+        self._check_length()
+        return data
+
+
+class HTTPRequest(object):
+    """An HTTP Request (and response).
+    
+    A single HTTP connection may consist of multiple request/response pairs.
+    
+    send: the 'send' method from the connection's socket object.
+    wsgi_app: the WSGI application to call.
+    environ: a partial WSGI environ (server and connection entries).
+        The caller MUST set the following entries:
+        * All wsgi.* entries, including .input
+        * SERVER_NAME and SERVER_PORT
+        * Any SSL_* entries
+        * Any custom entries like REMOTE_ADDR and REMOTE_PORT
+        * SERVER_SOFTWARE: the value to write in the "Server" response header.
+        * ACTUAL_SERVER_PROTOCOL: the value to write in the Status-Line of
+            the response. From RFC 2145: "An HTTP server SHOULD send a
+            response version equal to the highest version for which the
+            server is at least conditionally compliant, and whose major
+            version is less than or equal to the one received in the
+            request.  An HTTP server MUST NOT send a version for which
+            it is not at least conditionally compliant."
+    
+    outheaders: a list of header tuples to write in the response.
+    ready: when True, the request has been parsed and is ready to begin
+        generating the response. When False, signals the calling Connection
+        that the response should not be generated and the connection should
+        close.
+    close_connection: signals the calling Connection that the request
+        should close. This does not imply an error! The client and/or
+        server may each request that the connection be closed.
+    chunked_write: if True, output will be encoded with the "chunked"
+        transfer-coding. This value is set automatically inside
+        send_headers.
+    """
+    
+    max_request_header_size = 0
+    max_request_body_size = 0
+    
+    def __init__(self, wfile, environ, wsgi_app):
+        self.rfile = environ['wsgi.input']
+        self.wfile = wfile
+        self.environ = environ.copy()
+        self.wsgi_app = wsgi_app
+        
+        self.ready = False
+        self.started_response = False
+        self.status = ""
+        self.outheaders = []
+        self.sent_headers = False
+        self.close_connection = False
+        self.chunked_write = False
+    
+    def parse_request(self):
+        """Parse the next HTTP request start-line and message-headers."""
+        self.rfile.maxlen = self.max_request_header_size
+        self.rfile.bytes_read = 0
+        
+        try:
+            self._parse_request()
+        except MaxSizeExceeded:
+            self.simple_response("413 Request Entity Too Large")
+            return
+    
+    def _parse_request(self):
+        # HTTP/1.1 connections are persistent by default. If a client
+        # requests a page, then idles (leaves the connection open),
+        # then rfile.readline() will raise socket.error("timed out").
+        # Note that it does this based on the value given to settimeout(),
+        # and doesn't need the client to request or acknowledge the close
+        # (although your TCP stack might suffer for it: cf Apache's history
+        # with FIN_WAIT_2).
+        request_line = self.rfile.readline()
+        if not request_line:
+            # Force self.ready = False so the connection will close.
+            self.ready = False
+            return
+        
+        if request_line == "\r\n":
+            # RFC 2616 sec 4.1: "...if the server is reading the protocol
+            # stream at the beginning of a message and receives a CRLF
+            # first, it should ignore the CRLF."
+            # But only ignore one leading line! else we enable a DoS.
+            request_line = self.rfile.readline()
+            if not request_line:
+                self.ready = False
+                return
+        
+        environ = self.environ
+        
+        try:
+            method, path, req_protocol = request_line.strip().split(" ", 2)
+        except ValueError:
+            self.simple_response(400, "Malformed Request-Line")
+            return
+        
+        environ["REQUEST_METHOD"] = method
+        
+        # path may be an abs_path (including "http://host.domain.tld");
+        scheme, location, path, params, qs, frag = urlparse(path)
+        
+        if frag:
+            self.simple_response("400 Bad Request",
+                                 "Illegal #fragment in Request-URI.")
+            return
+        
+        if scheme:
+            environ["wsgi.url_scheme"] = scheme
+        if params:
+            path = path + ";" + params
+        
+        environ["SCRIPT_NAME"] = ""
+        
+        # Unquote the path+params (e.g. "/this%20path" -> "this path").
+        # http://www.w3.org/Protocols/rfc2616/rfc2616-sec5.html#sec5.1.2
+        #
+        # But note that "...a URI must be separated into its components
+        # before the escaped characters within those components can be
+        # safely decoded." http://www.ietf.org/rfc/rfc2396.txt, sec 2.4.2
+        atoms = [unquote(x) for x in quoted_slash.split(path)]
+        path = "%2F".join(atoms)
+        environ["PATH_INFO"] = path
+        
+        # Note that, like wsgiref and most other WSGI servers,
+        # we unquote the path but not the query string.
+        environ["QUERY_STRING"] = qs
+        
+        # Compare request and server HTTP protocol versions, in case our
+        # server does not support the requested protocol. Limit our output
+        # to min(req, server). We want the following output:
+        #     request    server     actual written   supported response
+        #     protocol   protocol  response protocol    feature set
+        # a     1.0        1.0           1.0                1.0
+        # b     1.0        1.1           1.1                1.0
+        # c     1.1        1.0           1.0                1.0
+        # d     1.1        1.1           1.1                1.1
+        # Notice that, in (b), the response will be "HTTP/1.1" even though
+        # the client only understands 1.0. RFC 2616 10.5.6 says we should
+        # only return 505 if the _major_ version is different.
+        rp = int(req_protocol[5]), int(req_protocol[7])
+        server_protocol = environ["ACTUAL_SERVER_PROTOCOL"]
+        sp = int(server_protocol[5]), int(server_protocol[7])
+        if sp[0] != rp[0]:
+            self.simple_response("505 HTTP Version Not Supported")
+            return
+        # Bah. "SERVER_PROTOCOL" is actually the REQUEST protocol.
+        environ["SERVER_PROTOCOL"] = req_protocol
+        self.response_protocol = "HTTP/%s.%s" % min(rp, sp)
+        
+        # If the Request-URI was an absoluteURI, use its location atom.
+        if location:
+            environ["SERVER_NAME"] = location
+        
+        # then all the http headers
+        try:
+            self.read_headers()
+        except ValueError, ex:
+            self.simple_response("400 Bad Request", repr(ex.args))
+            return
+        
+        mrbs = self.max_request_body_size
+        if mrbs and int(environ.get("CONTENT_LENGTH", 0)) > mrbs:
+            self.simple_response("413 Request Entity Too Large")
+            return
+        
+        # Persistent connection support
+        if self.response_protocol == "HTTP/1.1":
+            # Both server and client are HTTP/1.1
+            if environ.get("HTTP_CONNECTION", "") == "close":
+                self.close_connection = True
+        else:
+            # Either the server or client (or both) are HTTP/1.0
+            if environ.get("HTTP_CONNECTION", "") != "Keep-Alive":
+                self.close_connection = True
+        
+        # Transfer-Encoding support
+        te = None
+        if self.response_protocol == "HTTP/1.1":
+            te = environ.get("HTTP_TRANSFER_ENCODING")
+            if te:
+                te = [x.strip().lower() for x in te.split(",") if x.strip()]
+        
+        self.chunked_read = False
+        
+        if te:
+            for enc in te:
+                if enc == "chunked":
+                    self.chunked_read = True
+                else:
+                    # Note that, even if we see "chunked", we must reject
+                    # if there is an extension we don't recognize.
+                    self.simple_response("501 Unimplemented")
+                    self.close_connection = True
+                    return
+        
+        # From PEP 333:
+        # "Servers and gateways that implement HTTP 1.1 must provide
+        # transparent support for HTTP 1.1's "expect/continue" mechanism.
+        # This may be done in any of several ways:
+        #   1. Respond to requests containing an Expect: 100-continue request
+        #      with an immediate "100 Continue" response, and proceed normally.
+        #   2. Proceed with the request normally, but provide the application
+        #      with a wsgi.input stream that will send the "100 Continue"
+        #      response if/when the application first attempts to read from
+        #      the input stream. The read request must then remain blocked
+        #      until the client responds.
+        #   3. Wait until the client decides that the server does not support
+        #      expect/continue, and sends the request body on its own.
+        #      (This is suboptimal, and is not recommended.)
+        #
+        # We used to do 3, but are now doing 1. Maybe we'll do 2 someday,
+        # but it seems like it would be a big slowdown for such a rare case.
+        if environ.get("HTTP_EXPECT", "") == "100-continue":
+            self.simple_response(100)
+        
+        self.ready = True
+    
+    def read_headers(self):
+        """Read header lines from the incoming stream."""
+        environ = self.environ
+        
+        while True:
+            line = self.rfile.readline()
+            if not line:
+                # No more data--illegal end of headers
+                raise ValueError("Illegal end of headers.")
+            
+            if line == '\r\n':
+                # Normal end of headers
+                break
+            
+            if line[0] in ' \t':
+                # It's a continuation line.
+                v = line.strip()
+            else:
+                k, v = line.split(":", 1)
+                k, v = k.strip().upper(), v.strip()
+                envname = "HTTP_" + k.replace("-", "_")
+            
+            if k in comma_separated_headers:
+                existing = environ.get(envname)
+                if existing:
+                    v = ", ".join((existing, v))
+            environ[envname] = v
+        
+        ct = environ.pop("HTTP_CONTENT_TYPE", None)
+        if ct is not None:
+            environ["CONTENT_TYPE"] = ct
+        cl = environ.pop("HTTP_CONTENT_LENGTH", None)
+        if cl is not None:
+            environ["CONTENT_LENGTH"] = cl
+    
+    def decode_chunked(self):
+        """Decode the 'chunked' transfer coding."""
+        cl = 0
+        data = StringIO.StringIO()
+        while True:
+            line = self.rfile.readline().strip().split(";", 1)
+            chunk_size = int(line.pop(0), 16)
+            if chunk_size <= 0:
+                break
+##            if line: chunk_extension = line[0]
+            cl += chunk_size
+            data.write(self.rfile.read(chunk_size))
+            crlf = self.rfile.read(2)
+            if crlf != "\r\n":
+                self.simple_response("400 Bad Request",
+                                     "Bad chunked transfer coding "
+                                     "(expected '\\r\\n', got %r)" % crlf)
+                return
+        
+        # Grab any trailer headers
+        self.read_headers()
+        
+        data.seek(0)
+        self.environ["wsgi.input"] = data
+        self.environ["CONTENT_LENGTH"] = str(cl) or ""
+        return True
+    
+    def respond(self):
+        """Call the appropriate WSGI app and write its iterable output."""
+        # Set rfile.maxlen to ensure we don't read past Content-Length.
+        # This will also be used to read the entire request body if errors
+        # are raised before the app can read the body.
+        if self.chunked_read:
+            # If chunked, Content-Length will be 0.
+            self.rfile.maxlen = self.max_request_body_size
+        else:
+            cl = int(self.environ.get("CONTENT_LENGTH", 0))
+            if self.max_request_body_size:
+                self.rfile.maxlen = min(cl, self.max_request_body_size)
+            else:
+                self.rfile.maxlen = cl
+        self.rfile.bytes_read = 0
+        
+        try:
+            self._respond()
+        except MaxSizeExceeded:
+            if not self.sent_headers:
+                self.simple_response("413 Request Entity Too Large")
+            return
+    
+    def _respond(self):
+        if self.chunked_read:
+            if not self.decode_chunked():
+                self.close_connection = True
+                return
+        
+        response = self.wsgi_app(self.environ, self.start_response)
+        try:
+            for chunk in response:
+                # "The start_response callable must not actually transmit
+                # the response headers. Instead, it must store them for the
+                # server or gateway to transmit only after the first
+                # iteration of the application return value that yields
+                # a NON-EMPTY string, or upon the application's first
+                # invocation of the write() callable." (PEP 333)
+                if chunk:
+                    self.write(chunk)
+        finally:
+            if hasattr(response, "close"):
+                response.close()
+        
+        if (self.ready and not self.sent_headers):
+            self.sent_headers = True
+            self.send_headers()
+        if self.chunked_write:
+            self.wfile.sendall("0\r\n\r\n")
+    
+    def simple_response(self, status, msg=""):
+        """Write a simple response back to the client."""
+        status = str(status)
+        buf = ["%s %s\r\n" % (self.environ['ACTUAL_SERVER_PROTOCOL'], status),
+               "Content-Length: %s\r\n" % len(msg),
+               "Content-Type: text/plain\r\n"]
+        
+        if status[:3] == "413" and self.response_protocol == 'HTTP/1.1':
+            # Request Entity Too Large
+            self.close_connection = True
+            buf.append("Connection: close\r\n")
+        
+        buf.append("\r\n")
+        if msg:
+            buf.append(msg)
+        
+        try:
+            self.wfile.sendall("".join(buf))
+        except socket.error, x:
+            if x.args[0] not in socket_errors_to_ignore:
+                raise
+    
+    def start_response(self, status, headers, exc_info = None):
+        """WSGI callable to begin the HTTP response."""
+        # "The application may call start_response more than once,
+        # if and only if the exc_info argument is provided."
+        if self.started_response and not exc_info:
+            raise AssertionError("WSGI start_response called a second "
+                                 "time with no exc_info.")
+        
+        # "if exc_info is provided, and the HTTP headers have already been
+        # sent, start_response must raise an error, and should raise the
+        # exc_info tuple."
+        if self.sent_headers:
+            try:
+                raise exc_info[0], exc_info[1], exc_info[2]
+            finally:
+                exc_info = None
+        
+        self.started_response = True
+        self.status = status
+        self.outheaders.extend(headers)
+        return self.write
+    
+    def write(self, chunk):
+        """WSGI callable to write unbuffered data to the client.
+        
+        This method is also used internally by start_response (to write
+        data from the iterable returned by the WSGI application).
+        """
+        if not self.started_response:
+            raise AssertionError("WSGI write called before start_response.")
+        
+        if not self.sent_headers:
+            self.sent_headers = True
+            self.send_headers()
+        
+        if self.chunked_write and chunk:
+            buf = [hex(len(chunk))[2:], "\r\n", chunk, "\r\n"]
+            self.wfile.sendall("".join(buf))
+        else:
+            self.wfile.sendall(chunk)
+    
+    def send_headers(self):
+        """Assert, process, and send the HTTP response message-headers."""
+        hkeys = [key.lower() for key, value in self.outheaders]
+        status = int(self.status[:3])
+        
+        if status == 413:
+            # Request Entity Too Large. Close conn to avoid garbage.
+            self.close_connection = True
+        elif "content-length" not in hkeys:
+            # "All 1xx (informational), 204 (no content),
+            # and 304 (not modified) responses MUST NOT
+            # include a message-body." So no point chunking.
+            if status < 200 or status in (204, 205, 304):
+                pass
+            else:
+                if (self.response_protocol == 'HTTP/1.1'
+                    and self.environ["REQUEST_METHOD"] != 'HEAD'):
+                    # Use the chunked transfer-coding
+                    self.chunked_write = True
+                    self.outheaders.append(("Transfer-Encoding", "chunked"))
+                else:
+                    # Closing the conn is the only way to determine len.
+                    self.close_connection = True
+        
+        if "connection" not in hkeys:
+            if self.response_protocol == 'HTTP/1.1':
+                # Both server and client are HTTP/1.1 or better
+                if self.close_connection:
+                    self.outheaders.append(("Connection", "close"))
+            else:
+                # Server and/or client are HTTP/1.0
+                if not self.close_connection:
+                    self.outheaders.append(("Connection", "Keep-Alive"))
+        
+        if (not self.close_connection) and (not self.chunked_read):
+            # Read any remaining request body data on the socket.
+            # "If an origin server receives a request that does not include an
+            # Expect request-header field with the "100-continue" expectation,
+            # the request includes a request body, and the server responds
+            # with a final status code before reading the entire request body
+            # from the transport connection, then the server SHOULD NOT close
+            # the transport connection until it has read the entire request,
+            # or until the client closes the connection. Otherwise, the client
+            # might not reliably receive the response message. However, this
+            # requirement is not be construed as preventing a server from
+            # defending itself against denial-of-service attacks, or from
+            # badly broken client implementations."
+            size = self.rfile.maxlen - self.rfile.bytes_read
+            if size > 0:
+                self.rfile.read(size)
+        
+        if "date" not in hkeys:
+            self.outheaders.append(("Date", rfc822.formatdate()))
+        
+        if "server" not in hkeys:
+            self.outheaders.append(("Server", self.environ['SERVER_SOFTWARE']))
+        
+        buf = [self.environ['ACTUAL_SERVER_PROTOCOL'], " ", self.status, "\r\n"]
+        try:
+            buf += [k + ": " + v + "\r\n" for k, v in self.outheaders]
+        except TypeError:
+            if not isinstance(k, str):
+                raise TypeError("WSGI response header key %r is not a string.")
+            if not isinstance(v, str):
+                raise TypeError("WSGI response header value %r is not a string.")
+            else:
+                raise
+        buf.append("\r\n")
+        self.wfile.sendall("".join(buf))
+
+
+class NoSSLError(Exception):
+    """Exception raised when a client speaks HTTP to an HTTPS socket."""
+    pass
+
+
+class FatalSSLAlert(Exception):
+    """Exception raised when the SSL implementation signals a fatal alert."""
+    pass
+
+
+if not _fileobject_uses_str_type:
+    class CP_fileobject(socket._fileobject):
+        """Faux file object attached to a socket object."""
+
+        def sendall(self, data):
+            """Sendall for non-blocking sockets."""
+            while data:
+                try:
+                    bytes_sent = self.send(data)
+                    data = data[bytes_sent:]
+                except socket.error, e:
+                    if e.args[0] not in socket_errors_nonblocking:
+                        raise
+
+        def send(self, data):
+            return self._sock.send(data)
+
+        def flush(self):
+            if self._wbuf:
+                buffer = "".join(self._wbuf)
+                self._wbuf = []
+                self.sendall(buffer)
+
+        def recv(self, size):
+            while True:
+                try:
+                    return self._sock.recv(size)
+                except socket.error, e:
+                    if (e.args[0] not in socket_errors_nonblocking
+                        and e.args[0] not in socket_error_eintr):
+                        raise
+
+        def read(self, size=-1):
+            # Use max, disallow tiny reads in a loop as they are very inefficient.
+            # We never leave read() with any leftover data from a new recv() call
+            # in our internal buffer.
+            rbufsize = max(self._rbufsize, self.default_bufsize)
+            # Our use of StringIO rather than lists of string objects returned by
+            # recv() minimizes memory usage and fragmentation that occurs when
+            # rbufsize is large compared to the typical return value of recv().
+            buf = self._rbuf
+            buf.seek(0, 2)  # seek end
+            if size < 0:
+                # Read until EOF
+                self._rbuf = StringIO.StringIO()  # reset _rbuf.  we consume it via buf.
+                while True:
+                    data = self.recv(rbufsize)
+                    if not data:
+                        break
+                    buf.write(data)
+                return buf.getvalue()
+            else:
+                # Read until size bytes or EOF seen, whichever comes first
+                buf_len = buf.tell()
+                if buf_len >= size:
+                    # Already have size bytes in our buffer?  Extract and return.
+                    buf.seek(0)
+                    rv = buf.read(size)
+                    self._rbuf = StringIO.StringIO()
+                    self._rbuf.write(buf.read())
+                    return rv
+
+                self._rbuf = StringIO.StringIO()  # reset _rbuf.  we consume it via buf.
+                while True:
+                    left = size - buf_len
+                    # recv() will malloc the amount of memory given as its
+                    # parameter even though it often returns much less data
+                    # than that.  The returned data string is short lived
+                    # as we copy it into a StringIO and free it.  This avoids
+                    # fragmentation issues on many platforms.
+                    data = self.recv(left)
+                    if not data:
+                        break
+                    n = len(data)
+                    if n == size and not buf_len:
+                        # Shortcut.  Avoid buffer data copies when:
+                        # - We have no data in our buffer.
+                        # AND
+                        # - Our call to recv returned exactly the
+                        #   number of bytes we were asked to read.
+                        return data
+                    if n == left:
+                        buf.write(data)
+                        del data  # explicit free
+                        break
+                    assert n <= left, "recv(%d) returned %d bytes" % (left, n)
+                    buf.write(data)
+                    buf_len += n
+                    del data  # explicit free
+                    #assert buf_len == buf.tell()
+                return buf.getvalue()
+
+        def readline(self, size=-1):
+            buf = self._rbuf
+            buf.seek(0, 2)  # seek end
+            if buf.tell() > 0:
+                # check if we already have it in our buffer
+                buf.seek(0)
+                bline = buf.readline(size)
+                if bline.endswith('\n') or len(bline) == size:
+                    self._rbuf = StringIO.StringIO()
+                    self._rbuf.write(buf.read())
+                    return bline
+                del bline
+            if size < 0:
+                # Read until \n or EOF, whichever comes first
+                if self._rbufsize <= 1:
+                    # Speed up unbuffered case
+                    buf.seek(0)
+                    buffers = [buf.read()]
+                    self._rbuf = StringIO.StringIO()  # reset _rbuf.  we consume it via buf.
+                    data = None
+                    recv = self.recv
+                    while data != "\n":
+                        data = recv(1)
+                        if not data:
+                            break
+                        buffers.append(data)
+                    return "".join(buffers)
+
+                buf.seek(0, 2)  # seek end
+                self._rbuf = StringIO.StringIO()  # reset _rbuf.  we consume it via buf.
+                while True:
+                    data = self.recv(self._rbufsize)
+                    if not data:
+                        break
+                    nl = data.find('\n')
+                    if nl >= 0:
+                        nl += 1
+                        buf.write(data[:nl])
+                        self._rbuf.write(data[nl:])
+                        del data
+                        break
+                    buf.write(data)
+                return buf.getvalue()
+            else:
+                # Read until size bytes or \n or EOF seen, whichever comes first
+                buf.seek(0, 2)  # seek end
+                buf_len = buf.tell()
+                if buf_len >= size:
+                    buf.seek(0)
+                    rv = buf.read(size)
+                    self._rbuf = StringIO.StringIO()
+                    self._rbuf.write(buf.read())
+                    return rv
+                self._rbuf = StringIO.StringIO()  # reset _rbuf.  we consume it via buf.
+                while True:
+                    data = self.recv(self._rbufsize)
+                    if not data:
+                        break
+                    left = size - buf_len
+                    # did we just receive a newline?
+                    nl = data.find('\n', 0, left)
+                    if nl >= 0:
+                        nl += 1
+                        # save the excess data to _rbuf
+                        self._rbuf.write(data[nl:])
+                        if buf_len:
+                            buf.write(data[:nl])
+                            break
+                        else:
+                            # Shortcut.  Avoid data copy through buf when returning
+                            # a substring of our first recv().
+                            return data[:nl]
+                    n = len(data)
+                    if n == size and not buf_len:
+                        # Shortcut.  Avoid data copy through buf when
+                        # returning exactly all of our first recv().
+                        return data
+                    if n >= left:
+                        buf.write(data[:left])
+                        self._rbuf.write(data[left:])
+                        break
+                    buf.write(data)
+                    buf_len += n
+                    #assert buf_len == buf.tell()
+                return buf.getvalue()
+
+else:
+    class CP_fileobject(socket._fileobject):
+        """Faux file object attached to a socket object."""
+
+        def sendall(self, data):
+            """Sendall for non-blocking sockets."""
+            while data:
+                try:
+                    bytes_sent = self.send(data)
+                    data = data[bytes_sent:]
+                except socket.error, e:
+                    if e.args[0] not in socket_errors_nonblocking:
+                        raise
+
+        def send(self, data):
+            return self._sock.send(data)
+
+        def flush(self):
+            if self._wbuf:
+                buffer = "".join(self._wbuf)
+                self._wbuf = []
+                self.sendall(buffer)
+
+        def recv(self, size):
+            while True:
+                try:
+                    return self._sock.recv(size)
+                except socket.error, e:
+                    if (e.args[0] not in socket_errors_nonblocking
+                        and e.args[0] not in socket_error_eintr):
+                        raise
+
+        def read(self, size=-1):
+            if size < 0:
+                # Read until EOF
+                buffers = [self._rbuf]
+                self._rbuf = ""
+                if self._rbufsize <= 1:
+                    recv_size = self.default_bufsize
+                else:
+                    recv_size = self._rbufsize
+
+                while True:
+                    data = self.recv(recv_size)
+                    if not data:
+                        break
+                    buffers.append(data)
+                return "".join(buffers)
+            else:
+                # Read until size bytes or EOF seen, whichever comes first
+                data = self._rbuf
+                buf_len = len(data)
+                if buf_len >= size:
+                    self._rbuf = data[size:]
+                    return data[:size]
+                buffers = []
+                if data:
+                    buffers.append(data)
+                self._rbuf = ""
+                while True:
+                    left = size - buf_len
+                    recv_size = max(self._rbufsize, left)
+                    data = self.recv(recv_size)
+                    if not data:
+                        break
+                    buffers.append(data)
+                    n = len(data)
+                    if n >= left:
+                        self._rbuf = data[left:]
+                        buffers[-1] = data[:left]
+                        break
+                    buf_len += n
+                return "".join(buffers)
+
+        def readline(self, size=-1):
+            data = self._rbuf
+            if size < 0:
+                # Read until \n or EOF, whichever comes first
+                if self._rbufsize <= 1:
+                    # Speed up unbuffered case
+                    assert data == ""
+                    buffers = []
+                    while data != "\n":
+                        data = self.recv(1)
+                        if not data:
+                            break
+                        buffers.append(data)
+                    return "".join(buffers)
+                nl = data.find('\n')
+                if nl >= 0:
+                    nl += 1
+                    self._rbuf = data[nl:]
+                    return data[:nl]
+                buffers = []
+                if data:
+                    buffers.append(data)
+                self._rbuf = ""
+                while True:
+                    data = self.recv(self._rbufsize)
+                    if not data:
+                        break
+                    buffers.append(data)
+                    nl = data.find('\n')
+                    if nl >= 0:
+                        nl += 1
+                        self._rbuf = data[nl:]
+                        buffers[-1] = data[:nl]
+                        break
+                return "".join(buffers)
+            else:
+                # Read until size bytes or \n or EOF seen, whichever comes first
+                nl = data.find('\n', 0, size)
+                if nl >= 0:
+                    nl += 1
+                    self._rbuf = data[nl:]
+                    return data[:nl]
+                buf_len = len(data)
+                if buf_len >= size:
+                    self._rbuf = data[size:]
+                    return data[:size]
+                buffers = []
+                if data:
+                    buffers.append(data)
+                self._rbuf = ""
+                while True:
+                    data = self.recv(self._rbufsize)
+                    if not data:
+                        break
+                    buffers.append(data)
+                    left = size - buf_len
+                    nl = data.find('\n', 0, left)
+                    if nl >= 0:
+                        nl += 1
+                        self._rbuf = data[nl:]
+                        buffers[-1] = data[:nl]
+                        break
+                    n = len(data)
+                    if n >= left:
+                        self._rbuf = data[left:]
+                        buffers[-1] = data[:left]
+                        break
+                    buf_len += n
+                return "".join(buffers)
+    
+
+class SSL_fileobject(CP_fileobject):
+    """SSL file object attached to a socket object."""
+    
+    ssl_timeout = 3
+    ssl_retry = .01
+    
+    def _safe_call(self, is_reader, call, *args, **kwargs):
+        """Wrap the given call with SSL error-trapping.
+        
+        is_reader: if False EOF errors will be raised. If True, EOF errors
+            will return "" (to emulate normal sockets).
+        """
+        start = time.time()
+        while True:
+            try:
+                return call(*args, **kwargs)
+            except SSL.WantReadError:
+                # Sleep and try again. This is dangerous, because it means
+                # the rest of the stack has no way of differentiating
+                # between a "new handshake" error and "client dropped".
+                # Note this isn't an endless loop: there's a timeout below.
+                time.sleep(self.ssl_retry)
+            except SSL.WantWriteError:
+                time.sleep(self.ssl_retry)
+            except SSL.SysCallError, e:
+                if is_reader and e.args == (-1, 'Unexpected EOF'):
+                    return ""
+                
+                errnum = e.args[0]
+                if is_reader and errnum in socket_errors_to_ignore:
+                    return ""
+                raise socket.error(errnum)
+            except SSL.Error, e:
+                if is_reader and e.args == (-1, 'Unexpected EOF'):
+                    return ""
+                
+                thirdarg = None
+                try:
+                    thirdarg = e.args[0][0][2]
+                except IndexError:
+                    pass
+                
+                if thirdarg == 'http request':
+                    # The client is talking HTTP to an HTTPS server.
+                    raise NoSSLError()
+                raise FatalSSLAlert(*e.args)
+            except:
+                raise
+            
+            if time.time() - start > self.ssl_timeout:
+                raise socket.timeout("timed out")
+
+    def recv(self, *args, **kwargs):
+        buf = []
+        r = super(SSL_fileobject, self).recv
+        while True:
+            data = self._safe_call(True, r, *args, **kwargs)
+            buf.append(data)
+            p = self._sock.pending()
+            if not p:
+                return "".join(buf)
+    
+    def sendall(self, *args, **kwargs):
+        return self._safe_call(False, super(SSL_fileobject, self).sendall, *args, **kwargs)
+
+    def send(self, *args, **kwargs):
+        return self._safe_call(False, super(SSL_fileobject, self).send, *args, **kwargs)
+
+
+class HTTPConnection(object):
+    """An HTTP connection (active socket).
+    
+    socket: the raw socket object (usually TCP) for this connection.
+    wsgi_app: the WSGI application for this server/connection.
+    environ: a WSGI environ template. This will be copied for each request.
+    
+    rfile: a fileobject for reading from the socket.
+    send: a function for writing (+ flush) to the socket.
+    """
+    
+    rbufsize = -1
+    RequestHandlerClass = HTTPRequest
+    environ = {"wsgi.version": (1, 0),
+               "wsgi.url_scheme": "http",
+               "wsgi.multithread": True,
+               "wsgi.multiprocess": False,
+               "wsgi.run_once": False,
+               "wsgi.errors": sys.stderr,
+               }
+    
+    def __init__(self, sock, wsgi_app, environ):
+        self.socket = sock
+        self.wsgi_app = wsgi_app
+        
+        # Copy the class environ into self.
+        self.environ = self.environ.copy()
+        self.environ.update(environ)
+        
+        if SSL and isinstance(sock, SSL.ConnectionType):
+            timeout = sock.gettimeout()
+            self.rfile = SSL_fileobject(sock, "rb", self.rbufsize)
+            self.rfile.ssl_timeout = timeout
+            self.wfile = SSL_fileobject(sock, "wb", -1)
+            self.wfile.ssl_timeout = timeout
+        else:
+            self.rfile = CP_fileobject(sock, "rb", self.rbufsize)
+            self.wfile = CP_fileobject(sock, "wb", -1)
+        
+        # Wrap wsgi.input but not HTTPConnection.rfile itself.
+        # We're also not setting maxlen yet; we'll do that separately
+        # for headers and body for each iteration of self.communicate
+        # (if maxlen is 0 the wrapper doesn't check length).
+        self.environ["wsgi.input"] = SizeCheckWrapper(self.rfile, 0)
+    
+    def communicate(self):
+        """Read each request and respond appropriately."""
+        try:
+            while True:
+                # (re)set req to None so that if something goes wrong in
+                # the RequestHandlerClass constructor, the error doesn't
+                # get written to the previous request.
+                req = None
+                req = self.RequestHandlerClass(self.wfile, self.environ,
+                                               self.wsgi_app)
+                
+                # This order of operations should guarantee correct pipelining.
+                req.parse_request()
+                if not req.ready:
+                    return
+                
+                req.respond()
+                if req.close_connection:
+                    return
+        
+        except socket.error, e:
+            errnum = e.args[0]
+            if errnum == 'timed out':
+                if req and not req.sent_headers:
+                    req.simple_response("408 Request Timeout")
+            elif errnum not in socket_errors_to_ignore:
+                if req and not req.sent_headers:
+                    req.simple_response("500 Internal Server Error",
+                                        format_exc())
+            return
+        except (KeyboardInterrupt, SystemExit):
+            raise
+        except FatalSSLAlert, e:
+            # Close the connection.
+            return
+        except NoSSLError:
+            # Unwrap our wfile
+            req.wfile = CP_fileobject(self.socket, "wb", -1)
+            if req and not req.sent_headers:
+                req.simple_response("400 Bad Request",
+                    "The client sent a plain HTTP request, but "
+                    "this server only speaks HTTPS on this port.")
+        except Exception, e:
+            if req and not req.sent_headers:
+                req.simple_response("500 Internal Server Error", format_exc())
+    
+    def close(self):
+        """Close the socket underlying this connection."""
+        self.rfile.close()
+        
+        # Python's socket module does NOT call close on the kernel socket
+        # when you call socket.close(). We do so manually here because we
+        # want this server to send a FIN TCP segment immediately. Note this
+        # must be called *before* calling socket.close(), because the latter
+        # drops its reference to the kernel socket.
+        self.socket._sock.close()
+        
+        self.socket.close()
+
+
+def format_exc(limit=None):
+    """Like print_exc() but return a string. Backport for Python 2.3."""
+    try:
+        etype, value, tb = sys.exc_info()
+        return ''.join(traceback.format_exception(etype, value, tb, limit))
+    finally:
+        etype = value = tb = None
+
+
+_SHUTDOWNREQUEST = None
+
+class WorkerThread(threading.Thread):
+    """Thread which continuously polls a Queue for Connection objects.
+    
+    server: the HTTP Server which spawned this thread, and which owns the
+        Queue and is placing active connections into it.
+    ready: a simple flag for the calling server to know when this thread
+        has begun polling the Queue.
+    
+    Due to the timing issues of polling a Queue, a WorkerThread does not
+    check its own 'ready' flag after it has started. To stop the thread,
+    it is necessary to stick a _SHUTDOWNREQUEST object onto the Queue
+    (one for each running WorkerThread).
+    """
+    
+    conn = None
+    
+    def __init__(self, server):
+        self.ready = False
+        self.server = server
+        threading.Thread.__init__(self)
+    
+    def run(self):
+        try:
+            self.ready = True
+            while True:
+                conn = self.server.requests.get()
+                if conn is _SHUTDOWNREQUEST:
+                    return
+                
+                self.conn = conn
+                try:
+                    conn.communicate()
+                finally:
+                    conn.close()
+                    self.conn = None
+        except (KeyboardInterrupt, SystemExit), exc:
+            self.server.interrupt = exc
+
+
+class ThreadPool(object):
+    """A Request Queue for the CherryPyWSGIServer which pools threads.
+    
+    ThreadPool objects must provide min, get(), put(obj), start()
+    and stop(timeout) attributes.
+    """
+    
+    def __init__(self, server, min=10, max=-1):
+        self.server = server
+        self.min = min
+        self.max = max
+        self._threads = []
+        self._queue = Queue.Queue()
+        self.get = self._queue.get
+    
+    def start(self):
+        """Start the pool of threads."""
+        for i in xrange(self.min):
+            self._threads.append(WorkerThread(self.server))
+        for worker in self._threads:
+            worker.setName("CP WSGIServer " + worker.getName())
+            worker.start()
+        for worker in self._threads:
+            while not worker.ready:
+                time.sleep(.1)
+    
+    def _get_idle(self):
+        """Number of worker threads which are idle. Read-only."""
+        return len([t for t in self._threads if t.conn is None])
+    idle = property(_get_idle, doc=_get_idle.__doc__)
+    
+    def put(self, obj):
+        self._queue.put(obj)
+        if obj is _SHUTDOWNREQUEST:
+            return
+    
+    def grow(self, amount):
+        """Spawn new worker threads (not above self.max)."""
+        for i in xrange(amount):
+            if self.max > 0 and len(self._threads) >= self.max:
+                break
+            worker = WorkerThread(self.server)
+            worker.setName("CP WSGIServer " + worker.getName())
+            self._threads.append(worker)
+            worker.start()
+    
+    def shrink(self, amount):
+        """Kill off worker threads (not below self.min)."""
+        # Grow/shrink the pool if necessary.
+        # Remove any dead threads from our list
+        for t in self._threads:
+            if not t.isAlive():
+                self._threads.remove(t)
+                amount -= 1
+        
+        if amount > 0:
+            for i in xrange(min(amount, len(self._threads) - self.min)):
+                # Put a number of shutdown requests on the queue equal
+                # to 'amount'. Once each of those is processed by a worker,
+                # that worker will terminate and be culled from our list
+                # in self.put.
+                self._queue.put(_SHUTDOWNREQUEST)
+    
+    def stop(self, timeout=5):
+        # Must shut down threads here so the code that calls
+        # this method can know when all threads are stopped.
+        for worker in self._threads:
+            self._queue.put(_SHUTDOWNREQUEST)
+        
+        # Don't join currentThread (when stop is called inside a request).
+        current = threading.currentThread()
+        while self._threads:
+            worker = self._threads.pop()
+            if worker is not current and worker.isAlive():
+                try:
+                    if timeout is None or timeout < 0:
+                        worker.join()
+                    else:
+                        worker.join(timeout)
+                        if worker.isAlive():
+                            # We exhausted the timeout.
+                            # Forcibly shut down the socket.
+                            c = worker.conn
+                            if c and not c.rfile.closed:
+                                if SSL and isinstance(c.socket, SSL.ConnectionType):
+                                    # pyOpenSSL.socket.shutdown takes no args
+                                    c.socket.shutdown()
+                                else:
+                                    c.socket.shutdown(socket.SHUT_RD)
+                            worker.join()
+                except (AssertionError,
+                        # Ignore repeated Ctrl-C.
+                        # See http://www.cherrypy.org/ticket/691.
+                        KeyboardInterrupt), exc1:
+                    pass
+
+
+
+class SSLConnection:
+    """A thread-safe wrapper for an SSL.Connection.
+    
+    *args: the arguments to create the wrapped SSL.Connection(*args).
+    """
+    
+    def __init__(self, *args):
+        self._ssl_conn = SSL.Connection(*args)
+        self._lock = threading.RLock()
+    
+    for f in ('get_context', 'pending', 'send', 'write', 'recv', 'read',
+              'renegotiate', 'bind', 'listen', 'connect', 'accept',
+              'setblocking', 'fileno', 'shutdown', 'close', 'get_cipher_list',
+              'getpeername', 'getsockname', 'getsockopt', 'setsockopt',
+              'makefile', 'get_app_data', 'set_app_data', 'state_string',
+              'sock_shutdown', 'get_peer_certificate', 'want_read',
+              'want_write', 'set_connect_state', 'set_accept_state',
+              'connect_ex', 'sendall', 'settimeout'):
+        exec """def %s(self, *args):
+        self._lock.acquire()
+        try:
+            return self._ssl_conn.%s(*args)
+        finally:
+            self._lock.release()
+""" % (f, f)
+
+
+try:
+    import fcntl
+except ImportError:
+    try:
+        from ctypes import windll, WinError
+    except ImportError:
+        def prevent_socket_inheritance(sock):
+            """Dummy function, since neither fcntl nor ctypes are available."""
+            pass
+    else:
+        def prevent_socket_inheritance(sock):
+            """Mark the given socket fd as non-inheritable (Windows)."""
+            if not windll.kernel32.SetHandleInformation(sock.fileno(), 1, 0):
+                raise WinError()
+else:
+    def prevent_socket_inheritance(sock):
+        """Mark the given socket fd as non-inheritable (POSIX)."""
+        fd = sock.fileno()
+        old_flags = fcntl.fcntl(fd, fcntl.F_GETFD)
+        fcntl.fcntl(fd, fcntl.F_SETFD, old_flags | fcntl.FD_CLOEXEC)
+
+
+class CherryPyWSGIServer(object):
+    """An HTTP server for WSGI.
+    
+    bind_addr: The interface on which to listen for connections.
+        For TCP sockets, a (host, port) tuple. Host values may be any IPv4
+        or IPv6 address, or any valid hostname. The string 'localhost' is a
+        synonym for '127.0.0.1' (or '::1', if your hosts file prefers IPv6).
+        The string '0.0.0.0' is a special IPv4 entry meaning "any active
+        interface" (INADDR_ANY), and '::' is the similar IN6ADDR_ANY for
+        IPv6. The empty string or None are not allowed.
+        
+        For UNIX sockets, supply the filename as a string.
+    wsgi_app: the WSGI 'application callable'; multiple WSGI applications
+        may be passed as (path_prefix, app) pairs.
+    numthreads: the number of worker threads to create (default 10).
+    server_name: the string to set for WSGI's SERVER_NAME environ entry.
+        Defaults to socket.gethostname().
+    max: the maximum number of queued requests (defaults to -1 = no limit).
+    request_queue_size: the 'backlog' argument to socket.listen();
+        specifies the maximum number of queued connections (default 5).
+    timeout: the timeout in seconds for accepted connections (default 10).
+    
+    nodelay: if True (the default since 3.1), sets the TCP_NODELAY socket
+        option.
+    
+    protocol: the version string to write in the Status-Line of all
+        HTTP responses. For example, "HTTP/1.1" (the default). This
+        also limits the supported features used in the response.
+    
+    
+    SSL/HTTPS
+    ---------
+    The OpenSSL module must be importable for SSL functionality.
+    You can obtain it from http://pyopenssl.sourceforge.net/
+    
+    ssl_certificate: the filename of the server SSL certificate.
+    ssl_privatekey: the filename of the server's private key file.
+    
+    If either of these is None (both are None by default), this server
+    will not use SSL. If both are given and are valid, they will be read
+    on server start and used in the SSL context for the listening socket.
+    """
+    
+    protocol = "HTTP/1.1"
+    _bind_addr = "127.0.0.1"
+    version = "CherryPy/3.1.1"
+    ready = False
+    _interrupt = None
+    
+    nodelay = True
+    
+    ConnectionClass = HTTPConnection
+    environ = {}
+    
+    # Paths to certificate and private key files
+    ssl_certificate = None
+    ssl_private_key = None
+    
+    def __init__(self, bind_addr, wsgi_app, numthreads=10, server_name=None,
+                 max=-1, request_queue_size=5, timeout=10, shutdown_timeout=5):
+        self.requests = ThreadPool(self, min=numthreads or 1, max=max)
+        
+        if callable(wsgi_app):
+            # We've been handed a single wsgi_app, in CP-2.1 style.
+            # Assume it's mounted at "".
+            self.wsgi_app = wsgi_app
+        else:
+            # We've been handed a list of (path_prefix, wsgi_app) tuples,
+            # so that the server can call different wsgi_apps, and also
+            # correctly set SCRIPT_NAME.
+            warnings.warn("The ability to pass multiple apps is deprecated "
+                          "and will be removed in 3.2. You should explicitly "
+                          "include a WSGIPathInfoDispatcher instead.",
+                          DeprecationWarning)
+            self.wsgi_app = WSGIPathInfoDispatcher(wsgi_app)
+        
+        self.bind_addr = bind_addr
+        if not server_name:
+            server_name = socket.gethostname()
+        self.server_name = server_name
+        self.request_queue_size = request_queue_size
+        
+        self.timeout = timeout
+        self.shutdown_timeout = shutdown_timeout
+    
+    def _get_numthreads(self):
+        return self.requests.min
+    def _set_numthreads(self, value):
+        self.requests.min = value
+    numthreads = property(_get_numthreads, _set_numthreads)
+    
+    def __str__(self):
+        return "%s.%s(%r)" % (self.__module__, self.__class__.__name__,
+                              self.bind_addr)
+    
+    def _get_bind_addr(self):
+        return self._bind_addr
+    def _set_bind_addr(self, value):
+        if isinstance(value, tuple) and value[0] in ('', None):
+            # Despite the socket module docs, using '' does not
+            # allow AI_PASSIVE to work. Passing None instead
+            # returns '0.0.0.0' like we want. In other words:
+            #     host    AI_PASSIVE     result
+            #      ''         Y         192.168.x.y
+            #      ''         N         192.168.x.y
+            #     None        Y         0.0.0.0
+            #     None        N         127.0.0.1
+            # But since you can get the same effect with an explicit
+            # '0.0.0.0', we deny both the empty string and None as values.
+            raise ValueError("Host values of '' or None are not allowed. "
+                             "Use '0.0.0.0' (IPv4) or '::' (IPv6) instead "
+                             "to listen on all active interfaces.")
+        self._bind_addr = value
+    bind_addr = property(_get_bind_addr, _set_bind_addr,
+        doc="""The interface on which to listen for connections.
+        
+        For TCP sockets, a (host, port) tuple. Host values may be any IPv4
+        or IPv6 address, or any valid hostname. The string 'localhost' is a
+        synonym for '127.0.0.1' (or '::1', if your hosts file prefers IPv6).
+        The string '0.0.0.0' is a special IPv4 entry meaning "any active
+        interface" (INADDR_ANY), and '::' is the similar IN6ADDR_ANY for
+        IPv6. The empty string or None are not allowed.
+        
+        For UNIX sockets, supply the filename as a string.""")
+    
+    def start(self):
+        """Run the server forever."""
+        # We don't have to trap KeyboardInterrupt or SystemExit here,
+        # because cherrpy.server already does so, calling self.stop() for us.
+        # If you're using this server with another framework, you should
+        # trap those exceptions in whatever code block calls start().
+        self._interrupt = None
+        
+        # Select the appropriate socket
+        if isinstance(self.bind_addr, basestring):
+            # AF_UNIX socket
+            
+            # So we can reuse the socket...
+            try: os.unlink(self.bind_addr)
+            except: pass
+            
+            # So everyone can access the socket...
+            try: os.chmod(self.bind_addr, 0777)
+            except: pass
+            
+            info = [(socket.AF_UNIX, socket.SOCK_STREAM, 0, "", self.bind_addr)]
+        else:
+            # AF_INET or AF_INET6 socket
+            # Get the correct address family for our host (allows IPv6 addresses)
+            host, port = self.bind_addr
+            try:
+                info = socket.getaddrinfo(host, port, socket.AF_UNSPEC,
+                                          socket.SOCK_STREAM, 0, socket.AI_PASSIVE)
+            except socket.gaierror:
+                # Probably a DNS issue. Assume IPv4.
+                info = [(socket.AF_INET, socket.SOCK_STREAM, 0, "", self.bind_addr)]
+        
+        self.socket = None
+        msg = "No socket could be created"
+        for res in info:
+            af, socktype, proto, canonname, sa = res
+            try:
+                self.bind(af, socktype, proto)
+            except socket.error, msg:
+                if self.socket:
+                    self.socket.close()
+                self.socket = None
+                continue
+            break
+        if not self.socket:
+            raise socket.error, msg
+        
+        # Timeout so KeyboardInterrupt can be caught on Win32
+        self.socket.settimeout(1)
+        self.socket.listen(self.request_queue_size)
+        
+        # Create worker threads
+        self.requests.start()
+        
+        self.ready = True
+        while self.ready:
+            self.tick()
+            if self.interrupt:
+                while self.interrupt is True:
+                    # Wait for self.stop() to complete. See _set_interrupt.
+                    time.sleep(0.1)
+                if self.interrupt:
+                    raise self.interrupt
+    
+    def bind(self, family, type, proto=0):
+        """Create (or recreate) the actual socket object."""
+        self.socket = socket.socket(family, type, proto)
+        prevent_socket_inheritance(self.socket)
+        self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
+        if self.nodelay:
+            self.socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
+        if self.ssl_certificate and self.ssl_private_key:
+            if SSL is None:
+                raise ImportError("You must install pyOpenSSL to use HTTPS.")
+            
+            # See http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/442473
+            ctx = SSL.Context(SSL.SSLv23_METHOD)
+            ctx.use_privatekey_file(self.ssl_private_key)
+            ctx.use_certificate_file(self.ssl_certificate)
+            self.socket = SSLConnection(ctx, self.socket)
+            self.populate_ssl_environ()
+            
+            # If listening on the IPV6 any address ('::' = IN6ADDR_ANY),
+            # activate dual-stack. See http://www.cherrypy.org/ticket/871.
+            if (not isinstance(self.bind_addr, basestring)
+                and self.bind_addr[0] == '::' and family == socket.AF_INET6):
+                try:
+                    self.socket.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, 0)
+                except (AttributeError, socket.error):
+                    # Apparently, the socket option is not available in
+                    # this machine's TCP stack
+                    pass
+        
+        self.socket.bind(self.bind_addr)
+    
+    def tick(self):
+        """Accept a new connection and put it on the Queue."""
+        try:
+            s, addr = self.socket.accept()
+            prevent_socket_inheritance(s)
+            if not self.ready:
+                return
+            if hasattr(s, 'settimeout'):
+                s.settimeout(self.timeout)
+            
+            environ = self.environ.copy()
+            # SERVER_SOFTWARE is common for IIS. It's also helpful for
+            # us to pass a default value for the "Server" response header.
+            if environ.get("SERVER_SOFTWARE") is None:
+                environ["SERVER_SOFTWARE"] = "%s WSGI Server" % self.version
+            # set a non-standard environ entry so the WSGI app can know what
+            # the *real* server protocol is (and what features to support).
+            # See http://www.faqs.org/rfcs/rfc2145.html.
+            environ["ACTUAL_SERVER_PROTOCOL"] = self.protocol
+            environ["SERVER_NAME"] = self.server_name
+            
+            if isinstance(self.bind_addr, basestring):
+                # AF_UNIX. This isn't really allowed by WSGI, which doesn't
+                # address unix domain sockets. But it's better than nothing.
+                environ["SERVER_PORT"] = ""
+            else:
+                environ["SERVER_PORT"] = str(self.bind_addr[1])
+                # optional values
+                # Until we do DNS lookups, omit REMOTE_HOST
+                environ["REMOTE_ADDR"] = addr[0]
+                environ["REMOTE_PORT"] = str(addr[1])
+            
+            conn = self.ConnectionClass(s, self.wsgi_app, environ)
+            self.requests.put(conn)
+        except socket.timeout:
+            # The only reason for the timeout in start() is so we can
+            # notice keyboard interrupts on Win32, which don't interrupt
+            # accept() by default
+            return
+        except socket.error, x:
+            if x.args[0] in socket_error_eintr:
+                # I *think* this is right. EINTR should occur when a signal
+                # is received during the accept() call; all docs say retry
+                # the call, and I *think* I'm reading it right that Python
+                # will then go ahead and poll for and handle the signal
+                # elsewhere. See http://www.cherrypy.org/ticket/707.
+                return
+            if x.args[0] in socket_errors_nonblocking:
+                # Just try again. See http://www.cherrypy.org/ticket/479.
+                return
+            if x.args[0] in socket_errors_to_ignore:
+                # Our socket was closed.
+                # See http://www.cherrypy.org/ticket/686.
+                return
+            raise
+    
+    def _get_interrupt(self):
+        return self._interrupt
+    def _set_interrupt(self, interrupt):
+        self._interrupt = True
+        self.stop()
+        self._interrupt = interrupt
+    interrupt = property(_get_interrupt, _set_interrupt,
+                         doc="Set this to an Exception instance to "
+                             "interrupt the server.")
+    
+    def stop(self):
+        """Gracefully shutdown a server that is serving forever."""
+        self.ready = False
+        
+        sock = getattr(self, "socket", None)
+        if sock:
+            if not isinstance(self.bind_addr, basestring):
+                # Touch our own socket to make accept() return immediately.
+                try:
+                    host, port = sock.getsockname()[:2]
+                except socket.error, x:
+                    if x.args[1] != "Bad file descriptor":
+                        raise
+                else:
+                    # Note that we're explicitly NOT using AI_PASSIVE,
+                    # here, because we want an actual IP to touch.
+                    # localhost won't work if we've bound to a public IP,
+                    # but it will if we bound to '0.0.0.0' (INADDR_ANY).
+                    for res in socket.getaddrinfo(host, port, socket.AF_UNSPEC,
+                                                  socket.SOCK_STREAM):
+                        af, socktype, proto, canonname, sa = res
+                        s = None
+                        try:
+                            s = socket.socket(af, socktype, proto)
+                            # See http://groups.google.com/group/cherrypy-users/
+                            #        browse_frm/thread/bbfe5eb39c904fe0
+                            s.settimeout(1.0)
+                            s.connect((host, port))
+                            s.close()
+                        except socket.error:
+                            if s:
+                                s.close()
+            if hasattr(sock, "close"):
+                sock.close()
+            self.socket = None
+        
+        self.requests.stop(self.shutdown_timeout)
+    
+    def populate_ssl_environ(self):
+        """Create WSGI environ entries to be merged into each request."""
+        cert = open(self.ssl_certificate, 'rb').read()
+        cert = crypto.load_certificate(crypto.FILETYPE_PEM, cert)
+        ssl_environ = {
+            "wsgi.url_scheme": "https",
+            "HTTPS": "on",
+            # pyOpenSSL doesn't provide access to any of these AFAICT
+##            'SSL_PROTOCOL': 'SSLv2',
+##            SSL_CIPHER 	string 	The cipher specification name
+##            SSL_VERSION_INTERFACE 	string 	The mod_ssl program version
+##            SSL_VERSION_LIBRARY 	string 	The OpenSSL program version
+            }
+        
+        # Server certificate attributes
+        ssl_environ.update({
+            'SSL_SERVER_M_VERSION': cert.get_version(),
+            'SSL_SERVER_M_SERIAL': cert.get_serial_number(),
+##            'SSL_SERVER_V_START': Validity of server's certificate (start time),
+##            'SSL_SERVER_V_END': Validity of server's certificate (end time),
+            })
+        
+        for prefix, dn in [("I", cert.get_issuer()),
+                           ("S", cert.get_subject())]:
+            # X509Name objects don't seem to have a way to get the
+            # complete DN string. Use str() and slice it instead,
+            # because str(dn) == "<X509Name object '/C=US/ST=...'>"
+            dnstr = str(dn)[18:-2]
+            
+            wsgikey = 'SSL_SERVER_%s_DN' % prefix
+            ssl_environ[wsgikey] = dnstr
+            
+            # The DN should be of the form: /k1=v1/k2=v2, but we must allow
+            # for any value to contain slashes itself (in a URL).
+            while dnstr:
+                pos = dnstr.rfind("=")
+                dnstr, value = dnstr[:pos], dnstr[pos + 1:]
+                pos = dnstr.rfind("/")
+                dnstr, key = dnstr[:pos], dnstr[pos + 1:]
+                if key and value:
+                    wsgikey = 'SSL_SERVER_%s_DN_%s' % (prefix, key)
+                    ssl_environ[wsgikey] = value
+        
+        self.environ.update(ssl_environ)
+
Index: /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/command.py
===================================================================
--- /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/command.py (revision 3)
+++ /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/command.py (revision 3)
@@ -0,0 +1,787 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+import pkg_resources
+import sys
+import optparse
+import bool_optparse
+import os
+import re
+import textwrap
+import pluginlib
+import ConfigParser
+import getpass
+try:
+    import subprocess
+except ImportError:
+    from paste.script.util import subprocess24 as subprocess
+difflib = None
+
+if sys.version_info >= (2, 6):
+    from logging.config import fileConfig
+else:
+    # Use our custom fileConfig -- 2.5.1's with a custom Formatter class
+    # and less strict whitespace (which were incorporated into 2.6's)
+    from paste.script.util.logging_config import fileConfig
+
+class BadCommand(Exception):
+
+    def __init__(self, message, exit_code=2):
+        self.message = message
+        self.exit_code = exit_code
+        Exception.__init__(self, message)
+
+class NoDefault(object):
+    pass
+
+dist = pkg_resources.get_distribution('PasteScript')
+
+python_version = sys.version.splitlines()[0].strip()
+
+parser = optparse.OptionParser(add_help_option=False,
+                               version='%s from %s (python %s)'
+                               % (dist, dist.location, python_version),
+                               usage='%prog [paster_options] COMMAND [command_options]')
+
+parser.add_option(
+    '--plugin',
+    action='append',
+    dest='plugins',
+    help="Add a plugin to the list of commands (plugins are Egg specs; will also require() the Egg)")
+parser.add_option(
+    '-h', '--help',
+    action='store_true',
+    dest='do_help',
+    help="Show this help message")
+parser.disable_interspersed_args()
+
+# @@: Add an option to run this in another Python interpreter
+
+system_plugins = []
+
+def run(args=None):
+    if (not args and
+        len(sys.argv) >= 2
+        and os.environ.get('_') and sys.argv[0] != os.environ['_']
+        and os.environ['_'] == sys.argv[1]):
+        # probably it's an exe execution
+        args = ['exe', os.environ['_']] + sys.argv[2:]
+    if args is None:
+        args = sys.argv[1:]
+    options, args = parser.parse_args(args)
+    options.base_parser = parser
+    system_plugins.extend(options.plugins or [])
+    commands = get_commands()
+    if options.do_help:
+        args = ['help'] + args
+    if not args:
+        print 'Usage: %s COMMAND' % sys.argv[0]
+        args = ['help']
+    command_name = args[0]
+    if command_name not in commands:
+        command = NotFoundCommand
+    else:
+        command = commands[command_name].load()
+    invoke(command, command_name, options, args[1:])
+
+def parse_exe_file(config):
+    import shlex
+    p = ConfigParser.RawConfigParser()
+    p.read([config])
+    command_name = 'exe'
+    options = []
+    if p.has_option('exe', 'command'):
+        command_name = p.get('exe', 'command')
+    if p.has_option('exe', 'options'):
+        options = shlex.split(p.get('exe', 'options'))
+    if p.has_option('exe', 'sys.path'):
+        paths = shlex.split(p.get('exe', 'sys.path'))
+        paths = [os.path.abspath(os.path.join(os.path.dirname(config), p))
+                 for p in paths]
+        for path in paths:
+            pkg_resources.working_set.add_entry(path)
+            sys.path.insert(0, path)
+    args = [command_name, config] + options
+    return args
+
+def get_commands():
+    plugins = system_plugins[:]
+    egg_info_dir = pluginlib.find_egg_info_dir(os.getcwd())
+    if egg_info_dir:
+        plugins.append(os.path.splitext(os.path.basename(egg_info_dir))[0])
+        base_dir = os.path.dirname(egg_info_dir)
+        if base_dir not in sys.path:
+            sys.path.insert(0, base_dir)
+            pkg_resources.working_set.add_entry(base_dir)
+    plugins = pluginlib.resolve_plugins(plugins)
+    commands = pluginlib.load_commands_from_plugins(plugins)
+    commands.update(pluginlib.load_global_commands())
+    return commands
+
+def invoke(command, command_name, options, args):
+    try:
+        runner = command(command_name)
+        exit_code = runner.run(args)
+    except BadCommand, e:
+        print e.message
+        exit_code = e.exit_code
+    sys.exit(exit_code)
+
+
+class Command(object):
+
+    def __init__(self, name):
+        self.command_name = name
+
+    max_args = None
+    max_args_error = 'You must provide no more than %(max_args)s arguments'
+    min_args = None
+    min_args_error = 'You must provide at least %(min_args)s arguments'
+    required_args = None
+    # If this command takes a configuration file, set this to 1 or -1
+    # Then if invoked through #! the config file will be put into the positional
+    # arguments -- at the beginning with 1, at the end with -1
+    takes_config_file = None
+
+    # Grouped in help messages by this:
+    group_name = ''
+
+    required_args = ()
+    description = None
+    usage = ''
+    hidden = False
+    # This is the default verbosity level; --quiet subtracts,
+    # --verbose adds:
+    default_verbosity = 0
+    # This is the default interactive state:
+    default_interactive = 0
+    return_code = 0
+
+    BadCommand = BadCommand
+
+    # Must define:
+    #   parser
+    #   summary
+    #   command()
+
+    def run(self, args):
+        self.parse_args(args)
+        
+        # Setup defaults:
+        for name, default in [('verbose', 0),
+                              ('quiet', 0),
+                              ('interactive', False),
+                              ('overwrite', False)]:
+            if not hasattr(self.options, name):
+                setattr(self.options, name, default)
+        if getattr(self.options, 'simulate', False):
+            self.options.verbose = max(self.options.verbose, 1)
+        self.interactive = self.default_interactive
+        if getattr(self.options, 'interactive', False):
+            self.interactive += self.options.interactive
+        if getattr(self.options, 'no_interactive', False):
+            self.interactive = False
+        self.verbose = self.default_verbosity
+        self.verbose += self.options.verbose
+        self.verbose -= self.options.quiet
+        self.simulate = getattr(self.options, 'simulate', False)
+
+        # For #! situations:
+        if (os.environ.get('PASTE_CONFIG_FILE')
+            and self.takes_config_file is not None):
+            take = self.takes_config_file
+            filename = os.environ.get('PASTE_CONFIG_FILE')
+            if take == 1:
+                self.args.insert(0, filename)
+            elif take == -1:
+                self.args.append(filename)
+            else:
+                assert 0, (
+                    "Value takes_config_file must be None, 1, or -1 (not %r)"
+                    % take)
+
+        if (os.environ.get('PASTE_DEFAULT_QUIET')):
+            self.verbose = 0
+
+        # Validate:
+        if self.min_args is not None and len(self.args) < self.min_args:
+            raise BadCommand(
+                self.min_args_error % {'min_args': self.min_args,
+                                       'actual_args': len(self.args)})
+        if self.max_args is not None and len(self.args) > self.max_args:
+            raise BadCommand(
+                self.max_args_error % {'max_args': self.max_args,
+                                       'actual_args': len(self.args)})
+        for var_name, option_name in self.required_args:
+            if not getattr(self.options, var_name, None):
+                raise BadCommand(
+                    'You must provide the option %s' % option_name)
+        result = self.command()
+        if result is None:
+            return self.return_code
+        else:
+            return result
+
+    def parse_args(self, args):
+        if self.usage:
+            usage = ' '+self.usage
+        else:
+            usage = ''
+        self.parser.usage = "%%prog [options]%s\n%s" % (
+            usage, self.summary)
+        self.parser.prog = '%s %s' % (sys.argv[0], self.command_name)
+        if self.description:
+            desc = self.description
+            desc = textwrap.dedent(desc)
+            self.parser.description = desc
+        self.options, self.args = self.parser.parse_args(args)
+
+    ########################################
+    ## Utility methods
+    ########################################
+
+    def here(cls):
+        mod = sys.modules[cls.__module__]
+        return os.path.dirname(mod.__file__)
+
+    here = classmethod(here)
+
+    def ask(self, prompt, safe=False, default=True):
+        """
+        Prompt the user.  Default can be true, false, ``'careful'`` or
+        ``'none'``.  If ``'none'`` then the user must enter y/n.  If
+        ``'careful'`` then the user must enter yes/no (long form).
+
+        If the interactive option is over two (``-ii``) then ``safe``
+        will be used as a default.  This option should be the
+        do-nothing option.
+        """
+        # @@: Should careful be a separate argument?
+
+        if self.options.interactive >= 2:
+            default = safe
+        if default == 'careful':
+            prompt += ' [yes/no]?'
+        elif default == 'none':
+            prompt += ' [y/n]?'
+        elif default:
+            prompt += ' [Y/n]? '
+        else:
+            prompt += ' [y/N]? '
+        while 1:
+            response = raw_input(prompt).strip().lower()
+            if not response:
+                if default in ('careful', 'none'):
+                    print 'Please enter yes or no'
+                    continue
+                return default
+            if default == 'careful':
+                if response in ('yes', 'no'):
+                    return response == 'yes'
+                print 'Please enter "yes" or "no"'
+                continue
+            if response[0].lower() in ('y', 'n'):
+                return response[0].lower() == 'y'
+            print 'Y or N please'
+
+    def challenge(self, prompt, default=NoDefault, should_echo=True):
+        """
+        Prompt the user for a variable.
+        """
+        if default is not NoDefault:
+            prompt += ' [%r]' % default
+        prompt += ': '
+        while 1:
+            if should_echo:
+                prompt_method = raw_input
+            else:
+                prompt_method = getpass.getpass
+            response = prompt_method(prompt).strip()
+            if not response:
+                if default is not NoDefault:
+                    return default
+                else:
+                    continue
+            else:
+                return response
+        
+    def pad(self, s, length, dir='left'):
+        if len(s) >= length:
+            return s
+        if dir == 'left':
+            return s + ' '*(length-len(s))
+        else:
+            return ' '*(length-len(s)) + s
+
+    def standard_parser(cls, verbose=True,
+                        interactive=False,
+                        no_interactive=False,
+                        simulate=False,
+                        quiet=False,
+                        overwrite=False):
+        """
+        Create a standard ``OptionParser`` instance.
+        
+        Typically used like::
+
+            class MyCommand(Command):
+                parser = Command.standard_parser()
+
+        Subclasses may redefine ``standard_parser``, so use the
+        nearest superclass's class method.
+        """
+        parser = bool_optparse.BoolOptionParser()
+        if verbose:
+            parser.add_option('-v', '--verbose',
+                              action='count',
+                              dest='verbose',
+                              default=0)
+        if quiet:
+            parser.add_option('-q', '--quiet',
+                              action='count',
+                              dest='quiet',
+                              default=0)
+        if no_interactive:
+            parser.add_option('--no-interactive',
+                              action="count",
+                              dest="no_interactive",
+                              default=0)
+        if interactive:
+            parser.add_option('-i', '--interactive',
+                              action='count',
+                              dest='interactive',
+                              default=0)
+        if simulate:
+            parser.add_option('-n', '--simulate',
+                              action='store_true',
+                              dest='simulate',
+                              default=False)
+        if overwrite:
+            parser.add_option('-f', '--overwrite',
+                              dest="overwrite",
+                              action="store_true",
+                              help="Overwrite files (warnings will be emitted for non-matching files otherwise)")
+        return parser
+
+    standard_parser = classmethod(standard_parser)
+
+    def shorten(self, fn, *paths):
+        """
+        Return a shorted form of the filename (relative to the current
+        directory), typically for displaying in messages.  If
+        ``*paths`` are present, then use os.path.join to create the
+        full filename before shortening.
+        """
+        if paths:
+            fn = os.path.join(fn, *paths)
+        if fn.startswith(os.getcwd()):
+            return fn[len(os.getcwd()):].lstrip(os.path.sep)
+        else:
+            return fn
+
+    def ensure_dir(self, dir, svn_add=True):
+        """
+        Ensure that the directory exists, creating it if necessary.
+        Respects verbosity and simulation.
+
+        Adds directory to subversion if ``.svn/`` directory exists in
+        parent, and directory was created.
+        """
+        dir = dir.rstrip(os.sep)
+        if not dir:
+            # we either reached the parent-most directory, or we got
+            # a relative directory
+            # @@: Should we make sure we resolve relative directories
+            # first?  Though presumably the current directory always
+            # exists.
+            return
+        if not os.path.exists(dir):
+            self.ensure_dir(os.path.dirname(dir))
+            if self.verbose:
+                print 'Creating %s' % self.shorten(dir)
+            if not self.simulate:
+                os.mkdir(dir)
+            if (svn_add and
+                os.path.exists(os.path.join(os.path.dirname(dir), '.svn'))):
+                self.svn_command('add', dir)
+        else:
+            if self.verbose > 1:
+                print "Directory already exists: %s" % self.shorten(dir)
+
+    def ensure_file(self, filename, content, svn_add=True):
+        """
+        Ensure a file named ``filename`` exists with the given
+        content.  If ``--interactive`` has been enabled, this will ask
+        the user what to do if a file exists with different content.
+        """
+        global difflib
+        assert content is not None, (
+            "You cannot pass a content of None")
+        self.ensure_dir(os.path.dirname(filename), svn_add=svn_add)
+        if not os.path.exists(filename):
+            if self.verbose:
+                print 'Creating %s' % filename
+            if not self.simulate:
+                f = open(filename, 'wb')
+                f.write(content)
+                f.close()
+            if svn_add and os.path.exists(os.path.join(os.path.dirname(filename), '.svn')):
+                self.svn_command('add', filename,
+                                 warn_returncode=True)
+            return
+        f = open(filename, 'rb')
+        old_content = f.read()
+        f.close()
+        if content == old_content:
+            if self.verbose > 1:
+                print 'File %s matches expected content' % filename
+            return
+        if not self.options.overwrite:
+            print 'Warning: file %s does not match expected content' % filename
+            if difflib is None:
+                import difflib
+            diff = difflib.context_diff(
+                content.splitlines(),
+                old_content.splitlines(),
+                'expected ' + filename,
+                filename)
+            print '\n'.join(diff)
+            if self.interactive:
+                while 1:
+                    s = raw_input(
+                        'Overwrite file with new content? [y/N] ').strip().lower()
+                    if not s:
+                        s = 'n'
+                    if s.startswith('y'):
+                        break
+                    if s.startswith('n'):
+                        return
+                    print 'Unknown response; Y or N please'
+            else:
+                return
+                    
+        if self.verbose:
+            print 'Overwriting %s with new content' % filename
+        if not self.simulate:
+            f = open(filename, 'wb')
+            f.write(content)
+            f.close()
+
+    def insert_into_file(self, filename, marker_name, text,
+                         indent=False):
+        """
+        Inserts ``text`` into the file, right after the given marker.
+        Markers look like: ``-*- <marker_name>[:]? -*-``, and the text
+        will go on the immediately following line.
+
+        Raises ``ValueError`` if the marker is not found.
+
+        If ``indent`` is true, then the text will be indented at the
+        same level as the marker.
+        """
+        if not text.endswith('\n'):
+            raise ValueError(
+                "The text must end with a newline: %r" % text)
+        if not os.path.exists(filename) and self.simulate:
+            # If we are doing a simulation, it's expected that some
+            # files won't exist...
+            if self.verbose:
+                print 'Would (if not simulating) insert text into %s' % (
+                    self.shorten(filename))
+            return
+                
+        f = open(filename)
+        lines = f.readlines()
+        f.close()
+        regex = re.compile(r'-\*-\s+%s:?\s+-\*-' % re.escape(marker_name),
+                           re.I)
+        for i in range(len(lines)):
+            if regex.search(lines[i]):
+                # Found it!
+                if (lines[i:] and len(lines[i:]) > 1 and
+                    ''.join(lines[i+1:]).strip().startswith(text.strip())):
+                    # Already have it!
+                    print 'Warning: line already found in %s (not inserting' % filename
+                    print '  %s' % lines[i]
+                    return
+                
+                if indent:
+                    text = text.lstrip()
+                    match = re.search(r'^[ \t]*', lines[i])
+                    text = match.group(0) + text
+                lines[i+1:i+1] = [text]
+                break
+        else:
+            errstr = (
+                "Marker '-*- %s -*-' not found in %s"
+                % (marker_name, filename))
+            if 1 or self.simulate: # @@: being permissive right now
+                print 'Warning: %s' % errstr
+            else:
+                raise ValueError(errstr)
+        if self.verbose:
+            print 'Updating %s' % self.shorten(filename)
+        if not self.simulate:
+            f = open(filename, 'w')
+            f.write(''.join(lines))
+            f.close()
+
+    def run_command(self, cmd, *args, **kw):
+        """
+        Runs the command, respecting verbosity and simulation.
+        Returns stdout, or None if simulating.
+        
+        Keyword arguments:
+        
+        cwd: 
+            the current working directory to run the command in
+        capture_stderr: 
+            if true, then both stdout and stderr will be returned
+        expect_returncode: 
+            if true, then don't fail if the return code is not 0
+        force_no_simulate:
+            if true, run the command even if --simulate
+        """
+        cmd = self.quote_first_command_arg(cmd)
+        cwd = popdefault(kw, 'cwd', os.getcwd())
+        capture_stderr = popdefault(kw, 'capture_stderr', False)
+        expect_returncode = popdefault(kw, 'expect_returncode', False)
+        force = popdefault(kw, 'force_no_simulate', False)
+        warn_returncode = popdefault(kw, 'warn_returncode', False)
+        if warn_returncode:
+            expect_returncode = True
+        simulate = self.simulate
+        if force:
+            simulate = False
+        assert not kw, ("Arguments not expected: %s" % kw)
+        if capture_stderr:
+            stderr_pipe = subprocess.STDOUT
+        else:
+            stderr_pipe = subprocess.PIPE
+        try:
+            proc = subprocess.Popen([cmd] + list(args),
+                                    cwd=cwd,
+                                    stderr=stderr_pipe,
+                                    stdout=subprocess.PIPE)
+        except OSError, e:
+            if e.errno != 2:
+                # File not found
+                raise
+            raise OSError(
+                "The expected executable %s was not found (%s)"
+                % (cmd, e))
+        if self.verbose:
+            print 'Running %s %s' % (cmd, ' '.join(args))
+        if simulate:
+            return None
+        stdout, stderr = proc.communicate()
+        if proc.returncode and not expect_returncode:
+            if not self.verbose:
+                print 'Running %s %s' % (cmd, ' '.join(args))
+            print 'Error (exit code: %s)' % proc.returncode
+            if stderr:
+                print stderr
+            raise OSError("Error executing command %s" % cmd)
+        if self.verbose > 2:
+            if stderr:
+                print 'Command error output:'
+                print stderr
+            if stdout:
+                print 'Command output:'
+                print stdout
+        elif proc.returncode and warn_returncode:
+            print 'Warning: command failed (%s %s)' % (cmd, ' '.join(args))
+            print 'Exited with code %s' % proc.returncode
+        return stdout
+
+    def quote_first_command_arg(self, arg):
+        """
+        There's a bug in Windows when running an executable that's
+        located inside a path with a space in it.  This method handles
+        that case, or on non-Windows systems or an executable with no
+        spaces, it just leaves well enough alone.
+        """
+        if (sys.platform != 'win32'
+            or ' ' not in arg):
+            # Problem does not apply:
+            return arg
+        try:
+            import win32api
+        except ImportError:
+            raise ValueError(
+                "The executable %r contains a space, and in order to "
+                "handle this issue you must have the win32api module "
+                "installed" % arg)
+        arg = win32api.GetShortPathName(arg)
+        return arg
+
+    _svn_failed = False
+
+    def svn_command(self, *args, **kw):
+        """
+        Run an svn command, but don't raise an exception if it fails.
+        """
+        try:
+            return self.run_command('svn', *args, **kw)
+        except OSError, e:
+            if not self._svn_failed:
+                print 'Unable to run svn command (%s); proceeding anyway' % e
+                self._svn_failed = True
+
+    def write_file(self, filename, content, source=None,
+                   binary=True, svn_add=True):
+        """
+        Like ``ensure_file``, but without the interactivity.  Mostly
+        deprecated.  (I think I forgot it existed)
+        """
+        import warnings
+        warnings.warn(
+            "command.write_file has been replaced with "
+            "command.ensure_file",
+            DeprecationWarning, 2)
+        if os.path.exists(filename):
+            if binary:
+                f = open(filename, 'rb')
+            else:
+                f = open(filename, 'r')
+            old_content = f.read()
+            f.close()
+            if content == old_content:
+                if self.verbose:
+                    print 'File %s exists with same content' % (
+                        self.shorten(filename))
+                return
+            if (not self.simulate and self.options.interactive):
+                if not self.ask('Overwrite file %s?' % filename):
+                    return
+        if self.verbose > 1 and source:
+            print 'Writing %s from %s' % (self.shorten(filename),
+                                          self.shorten(source))
+        elif self.verbose:
+            print 'Writing %s' % self.shorten(filename)
+        if not self.simulate:
+            already_existed = os.path.exists(filename)
+            if binary:
+                f = open(filename, 'wb')
+            else:
+                f = open(filename, 'w')
+            f.write(content)
+            f.close()
+            if (not already_existed
+                and svn_add
+                and os.path.exists(os.path.join(os.path.dirname(filename), '.svn'))):
+                self.svn_command('add', filename)
+
+    def parse_vars(self, args):
+        """
+        Given variables like ``['a=b', 'c=d']`` turns it into ``{'a':
+        'b', 'c': 'd'}``
+        """
+        result = {}
+        for arg in args:
+            if '=' not in arg:
+                raise BadCommand(
+                    'Variable assignment %r invalid (no "=")'
+                    % arg)
+            name, value = arg.split('=', 1)
+            result[name] = value
+        return result
+    
+    def read_vars(self, config, section='pastescript'):
+        """
+        Given a configuration filename, this will return a map of values.
+        """
+        result = {}
+        p = ConfigParser.RawConfigParser()
+        p.read([config])
+        if p.has_section(section):
+            for key, value in p.items(section):
+                if key.endswith('__eval__'):
+                    result[key[:-len('__eval__')]] = eval(value)
+                else:
+                    result[key] = value
+        return result
+
+    def write_vars(self, config, vars, section='pastescript'):
+        """
+        Given a configuration filename, this will add items in the
+        vars mapping to the configuration file.  Will create the
+        configuration file if it doesn't exist.
+        """
+        modified = False
+
+        p = ConfigParser.RawConfigParser()
+        if not os.path.exists(config):
+            f = open(config, 'w')
+            f.write('')
+            f.close()
+            modified = True
+        p.read([config])
+        if not p.has_section(section):
+            p.add_section(section)
+            modified = True
+
+        existing_options = p.options(section)
+        for key, value in vars.items():
+            if (key not in existing_options and
+                '%s__eval__' % key not in existing_options):
+                if not isinstance(value, str):
+                    p.set(section, '%s__eval__' % key, repr(value))
+                else:
+                    p.set(section, key, value)
+                modified = True
+
+        if modified:
+            p.write(open(config, 'w'))
+        
+    def indent_block(self, text, indent=2, initial=None):
+        """
+        Indent the block of text (each line is indented).  If you give
+        ``initial``, then that is used in lieue of ``indent`` for the
+        first line.
+        """
+        if initial is None:
+            initial = indent
+        lines = text.splitlines()
+        first = (' '*initial) + lines[0]
+        rest = [(' '*indent)+l for l in lines[1:]]
+        return '\n'.join([first]+rest)
+
+    def logging_file_config(self, config_file):
+        """
+        Setup logging via the logging module's fileConfig function with the
+        specified ``config_file``, if applicable.
+        """
+        parser = ConfigParser.ConfigParser()
+        parser.read([config_file])
+        if parser.has_section('loggers'):
+            fileConfig(config_file)
+
+class NotFoundCommand(Command):
+
+    def run(self, args):
+        #for name, value in os.environ.items():
+        #    print '%s: %s' % (name, value)
+        #print sys.argv
+        print ('Command %r not known (you may need to run setup.py egg_info)'
+               % self.command_name)
+        commands = get_commands().items()
+        commands.sort()
+        if not commands:
+            print 'No commands registered.'
+            print 'Have you installed Paste Script?'
+            print '(try running python setup.py develop)'
+            return 2
+        print 'Known commands:'
+        longest = max([len(n) for n, c in commands])
+        for name, command in commands:
+            print '  %s  %s' % (self.pad(name, length=longest),
+                                command.load().summary)
+        return 2
+
+def popdefault(dict, name, default=None):
+    if name not in dict:
+        return default
+    else:
+        v = dict[name]
+        del dict[name]
+        return v
Index: /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/testapp.py
===================================================================
--- /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/testapp.py (revision 3)
+++ /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/testapp.py (revision 3)
@@ -0,0 +1,101 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+import cgi
+import os
+
+html_page_template = '''
+<html>
+<head>
+  <title>Test Application</title>
+</head>
+<body>
+<h1>Test Application: Working!</h1>
+
+<table border="1">
+%(environ)s
+</table>
+
+<p>
+Note: to see an error report, append <code>?error=true</code>
+to the URL
+</p>
+
+</body>
+</html>
+'''
+
+html_row_template = '''
+<tr>
+ <td><b>%(key)s</b></td>
+ <td><tt>%(value_literal)s</b></td>
+</tr>
+'''
+
+text_page_template = '%(environ)s'
+text_row_template = '%(key)s: %(value_repr)s\n'
+
+def make_literal(value):
+    value = cgi.escape(value, 1)
+    value = value.replace('\n\r', '\n')
+    value = value.replace('\r', '\n')
+    value = value.replace('\n', '<br>\n')
+    return value
+
+class TestApplication(object):
+
+    """
+    A test WSGI application, that prints out all the environmental
+    variables, and if you add ``?error=t`` to the URL it will
+    deliberately throw an exception.
+    """
+
+    def __init__(self, global_conf=None, text=False):
+        self.global_conf = global_conf
+        self.text = text
+
+    def __call__(self, environ, start_response):
+        if environ.get('QUERY_STRING', '').find('error=') >= 0:
+            assert 0, "Here is your error report, ordered and delivered"
+        if self.text:
+            page_template = text_page_template
+            row_template = text_row_template
+            content_type = 'text/plain; charset=utf8'
+        else:
+            page_template = html_page_template
+            row_template = html_row_template
+            content_type = 'text/html; charset=utf8'
+        keys = environ.keys()
+        keys.sort()
+        rows = []
+        for key in keys:
+            data = {'key': key}
+            value = environ[key]
+            data['value'] = value
+            try:
+                value = repr(value)
+            except Exception, e:
+                value = 'Cannot use repr(): %s' % e
+            data['value_repr'] = value
+            data['value_literal'] = make_literal(value)
+            row = row_template % data
+            rows.append(row)
+        rows = ''.join(rows)
+        page = page_template % {'environ': rows}
+        if isinstance(page, unicode):
+            page = page.encode('utf8')
+        headers = [('Content-type', content_type)]
+        start_response('200 OK', headers)
+        return [page]
+    
+
+def make_test_application(global_conf, text=False, lint=False):
+    from paste.deploy.converters import asbool
+    text = asbool(text)
+    lint = asbool(lint)
+    app = TestApplication(global_conf=global_conf, text=text)
+    if lint:
+        from paste.lint import middleware
+        app = middleware(app)
+    return app
+
+make_test_application.__doc__ = TestApplication.__doc__
Index: /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/wsgiutils_server.py
===================================================================
--- /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/wsgiutils_server.py (revision 3)
+++ /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/wsgiutils_server.py (revision 3)
@@ -0,0 +1,19 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+from paste.script.serve import ensure_port_cleanup
+from paste.translogger import TransLogger
+
+def run_server(wsgi_app, global_conf, host='localhost',
+               port=8080):
+    from wsgiutils import wsgiServer
+    import logging
+    logged_app = TransLogger(wsgi_app)
+    port = int(port)
+    # For some reason this is problematic on this server:
+    ensure_port_cleanup([(host, port)], maxtries=2, sleeptime=0.5)
+    app_map = {'': logged_app}
+    server = wsgiServer.WSGIServer((host, port), app_map)
+    logged_app.logger.info('Starting HTTP server on http://%s:%s',
+                           host, port)
+    server.serve_forever()
+    
Index: /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/exe.py
===================================================================
--- /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/exe.py (revision 3)
+++ /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/exe.py (revision 3)
@@ -0,0 +1,107 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+import re
+import os
+import sys
+import shlex
+import pkg_resources
+import command
+
+class ExeCommand(command.Command):
+
+    parser = command.Command.standard_parser(verbose=False)
+    summary = "Run #! executable files"
+    description = """\
+Use this at the top of files like:
+
+  #!/usr/bin/env /path/to/paster exe subcommand <command options>
+
+The rest of the file will be used as a config file for the given
+command, if it wants a config file.
+
+You can also include an [exe] section in the file, which looks
+like:
+
+  [exe]
+  command = serve
+  log_file = /path/to/log
+  add = /path/to/other/config.ini
+
+Which translates to:
+
+  paster serve --log-file=/path/to/log /path/to/other/config.ini
+"""
+    
+    hidden = True
+
+    _exe_section_re = re.compile(r'^\s*\[\s*exe\s*\]\s*$')
+    _section_re = re.compile(r'^\s*\[')
+
+    def run(self, argv):
+        if argv and argv[0] in ('-h', '--help'):
+            print self.description
+            return
+        
+        if os.environ.get('REQUEST_METHOD'):
+            # We're probably in a CGI environment
+            sys.stdout = sys.stderr
+            os.environ['PASTE_DEFAULT_QUIET'] = 'true'
+            # Maybe import cgitb or something?
+            
+        if '_' not in os.environ:
+            print "Warning: this command is intended to be run with a #! like:"
+            print "  #!/usr/bin/env paster exe"
+            print "It only works with /usr/bin/env, and only as a #! line."
+            # Should I actually shlex.split the args?
+            filename = argv[-1]
+            args = argv[:-1]
+            extra_args = []
+        else:
+            filename = os.environ['_']
+            extra_args = argv[:]
+            args = []
+            while extra_args:
+                if extra_args[0] == filename:
+                    extra_args.pop(0)
+                    break
+                args.append(extra_args.pop(0))
+        vars = {'here': os.path.dirname(filename),
+                '__file__': filename}
+        f = open(filename)
+        lines = f.readlines()
+        f.close()
+        options = {}
+        lineno = 1
+        while lines:
+            if self._exe_section_re.search(lines[0]):
+                lines.pop(0)
+                break
+            lines.pop(0)
+            lineno += 1
+        pre_options = []
+        options = args
+        for line in lines:
+            lineno += 1
+            line = line.strip()
+            if not line or line.startswith('#'):
+                continue
+            if self._section_re.search(line):
+                break
+            if '=' not in line:
+                raise command.BadCommand('Missing = in %s at %s: %r'
+                                         % (filename, lineno, line))
+            name, value = line.split('=', 1)
+            name = name.strip()
+            value = value.strip()
+            if name == 'require':
+                pkg_resources.require(value)
+            elif name == 'command' or name == 'add':
+                options.extend(shlex.split(value))
+            elif name == 'plugin':
+                options[:0] = ['--plugin', value]
+            else:
+                value = value % vars
+                options.append('--%s=%s' % (name.replace('_', '-'), value))
+        os.environ['PASTE_CONFIG_FILE'] = filename
+        options.extend(extra_args)
+        command.run(options)
Index: /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/interfaces.py
===================================================================
--- /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/interfaces.py (revision 3)
+++ /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/interfaces.py (revision 3)
@@ -0,0 +1,49 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+class IAppInstall(object):
+
+    """
+    The interface for objects in the entry point group
+    ``paste.app_install``
+    """
+
+    def __init__(distribution, entry_group, entry_name):
+        """
+        An object representing a specific application (the
+        distribution is a pkg_resource.Distribution object), for the
+        given entry point name in the given group.  Right now the only
+        group used for this is ``'paste.app_factory'``.
+        """
+                 
+    def description(sys_config):
+        """
+        Return a text description of the application and its
+        configuration.  ``sys_config`` is a dictionary representing
+        the system configuration, and can be used for giving more
+        explicit defaults if the application preparation uses the
+        system configuration.  It may be None, in which case the
+        description should be more abstract.
+
+        Applications are free to ignore ``sys_config``.
+        """
+
+    def write_config(command, filename, sys_config):
+        """
+        Write a fresh config file to ``filename``.  ``command`` is a
+        ``paste.script.command.Command`` object, and should be used
+        for the actual operations.  It handles things like simulation
+        and verbosity.
+
+        ``sys_config`` is (if given) a dictionary of system-wide
+        configuration options.
+        """
+
+    def setup_config(command, config_filename,
+                     config_section, sys_config):
+        """
+        Set up the application, using ``command`` (to ensure simulate,
+        etc).  The application is described by the configuration file
+        ``config_filename``.  ``sys_config`` is the system
+        configuration (though probably the values from it should have
+        already been encorporated into the configuration file).
+        """
Index: /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/checkperms.py
===================================================================
--- /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/checkperms.py (revision 3)
+++ /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/checkperms.py (revision 3)
@@ -0,0 +1,441 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+"""
+This is a module to check the filesystem for the presence and
+permissions of certain files.  It can also be used to correct the
+permissions (but not existance) of those files.
+
+Currently only supports Posix systems (with Posixy permissions).
+Permission stuff can probably be stubbed out later.
+"""
+import os
+
+def read_perm_spec(spec):
+    """
+    Reads a spec like 'rw-r--r--' into a octal number suitable for
+    chmod.  That is characters in groups of three -- first group is
+    user, second for group, third for other (all other people).  The
+    characters are r (read), w (write), and x (executable), though the
+    executable can also be s (sticky).  Files in sticky directories
+    get the directories permission setting.
+
+    Examples::
+
+      >>> print oct(read_perm_spec('rw-r--r--'))
+      0644
+      >>> print oct(read_perm_spec('rw-rwsr--'))
+      02664
+      >>> print oct(read_perm_spec('r-xr--r--'))
+      0544
+      >>> print oct(read_perm_spec('r--------'))
+      0400
+    """
+    total_mask = 0
+    # suid/sgid modes give this mask in user, group, other mode:
+    set_bits = (04000, 02000, 0)
+    pieces = (spec[0:3], spec[3:6], spec[6:9])
+    for i, (mode, set_bit) in enumerate(zip(pieces, set_bits)):
+        mask = 0
+        read, write, exe = list(mode)
+        if read == 'r':
+            mask = mask | 4
+        elif read != '-':
+            raise ValueError, (
+                "Character %r unexpected (should be '-' or 'r')"
+                % read)
+        if write == 'w':
+            mask = mask | 2
+        elif write != '-':
+            raise ValueError, (
+                "Character %r unexpected (should be '-' or 'w')"
+                % write)
+        if exe == 'x':
+            mask = mask | 1
+        elif exe not in ('s', '-'):
+            raise ValueError, (
+                "Character %r unexpected (should be '-', 'x', or 's')"
+                % exe)
+        if exe == 's' and i == 2:
+            raise ValueError, (
+                "The 'other' executable setting cannot be suid/sgid ('s')")
+        mask = mask << ((2-i)*3)
+        if exe == 's':
+            mask = mask | set_bit
+        total_mask = total_mask | mask
+    return total_mask
+
+modes = [
+    (04000, 'setuid bit',
+     'setuid bit: make contents owned by directory owner'),
+    (02000, 'setgid bit',
+     'setgid bit: make contents inherit permissions from directory'),
+    (01000, 'sticky bit',
+     'sticky bit: append-only directory'),
+    (00400, 'read by owner', 'read by owner'),
+    (00200, 'write by owner', 'write by owner'),
+    (00100, 'execute by owner', 'owner can search directory'),
+    (00040, 'allow read by group members',
+     'allow read by group members',),
+    (00020, 'allow write by group members',
+     'allow write by group members'),
+    (00010, 'execute by group members',
+     'group members can search directory'),
+    (00004, 'read by others', 'read by others'),
+    (00002, 'write by others', 'write by others'),
+    (00001, 'execution by others', 'others can search directory'),
+    ]
+
+exe_bits = [0100, 0010, 0001]
+exe_mask = 0111
+full_mask = 07777
+
+def mode_diff(filename, mode, **kw):
+    """
+    Returns the differences calculated using ``calc_mode_diff``
+    """
+    cur_mode = os.stat(filename).st_mode
+    return calc_mode_diff(cur_mode, mode, **kw)
+
+def calc_mode_diff(cur_mode, mode, keep_exe=True,
+                   not_set='not set: ',
+                   set='set: '):
+    """
+    Gives the difference between the actual mode of the file and the
+    given mode.  If ``keep_exe`` is true, then if the mode doesn't
+    include any executable information the executable information will
+    simply be ignored.  High bits are also always ignored (except
+    suid/sgid and sticky bit).
+
+    Returns a list of differences (empty list if no differences)
+    """
+    for exe_bit in exe_bits:
+        if mode & exe_bit:
+            keep_exe = False
+    diffs = []
+    isdir = os.path.isdir(filename)
+    for bit, file_desc, dir_desc in modes:
+        if keep_exe and bit in exe_bits:
+            continue
+        if isdir:
+            desc = dir_desc
+        else:
+            desc = file_desc
+        if (mode & bit) and not (cur_mode & bit):
+            diffs.append(not_set + desc)
+        if not (mode & bit) and (cur_mode & bit):
+            diffs.append(set + desc)
+    return diffs
+
+def calc_set_mode(cur_mode, mode, keep_exe=True):
+    """
+    Calculates the new mode given the current node ``cur_mode`` and
+    the mode spec ``mode`` and if ``keep_exe`` is true then also keep
+    the executable bits in ``cur_mode`` if ``mode`` has no executable
+    bits in it.  Return the new mode.
+
+    Examples::
+
+      >>> print oct(calc_set_mode(0775, 0644))
+      0755
+      >>> print oct(calc_set_mode(0775, 0744))
+      0744
+      >>> print oct(calc_set_mode(010600, 0644))
+      010644
+      >>> print oct(calc_set_mode(0775, 0644, False))
+      0644
+    """
+    for exe_bit in exe_bits:
+        if mode & exe_bit:
+            keep_exe = False
+    # This zeros-out full_mask parts of the current mode:
+    keep_parts = (cur_mode | full_mask) ^ full_mask
+    if keep_exe:
+        keep_parts = keep_parts | (cur_mode & exe_mask)
+    new_mode = keep_parts | mode
+    return new_mode
+
+def set_mode(filename, mode, **kw):
+    """
+    Sets the mode on ``filename`` using ``calc_set_mode``
+    """
+    cur_mode = os.stat(filename).st_mode
+    new_mode = calc_set_mode(cur_mode, mode, **kw)
+    os.chmod(filename, new_mode)
+
+def calc_ownership_spec(spec):
+    """
+    Calculates what a string spec means, returning (uid, username,
+    gid, groupname), where there can be None values meaning no
+    preference.
+
+    The spec is a string like ``owner:group``.  It may use numbers
+    instead of user/group names.  It may leave out ``:group``.  It may
+    use '-' to mean any-user/any-group.
+
+    """
+    import grp
+    import pwd
+    user = group = None
+    uid = gid = None
+    if ':' in spec:
+        user_spec, group_spec = spec.split(':', 1)
+    else:
+        user_spec, group_spec = spec, '-'
+    if user_spec == '-':
+        user_spec = '0'
+    if group_spec == '-':
+        group_spec = '0'
+    try:
+        uid = int(user_spec)
+    except ValueError:
+        uid = pwd.getpwnam(user_spec)
+        user = user_spec
+    else:
+        if not uid:
+            uid = user = None
+        else:
+            user = pwd.getpwuid(uid).pw_name
+    try:
+        gid = int(group_spec)
+    except ValueError:
+        gid = grp.getgrnam(group_spec)
+        group = group_spec
+    else:
+        if not gid:
+            gid = group = None
+        else:
+            group = grp.getgrgid(gid).gr_name
+    return (uid, user, gid, group)
+
+def ownership_diff(filename, spec):
+    """
+    Return a list of differences between the ownership of ``filename``
+    and the spec given.
+    """
+    import grp
+    import pwd
+    diffs = []
+    uid, user, gid, group = calc_ownership_spec(spec)
+    st = os.stat(filename)
+    if uid and uid != st.st_uid:
+        diffs.append('owned by %s (should be %s)' %
+                     (pwd.getpwuid(st.st_uid).pw_name, user))
+    if gid and gid != st.st_gid:
+        diffs.append('group %s (should be %s)' %
+                     (grp.getgrgid(st.st_gid).gr_name, group))
+    return diffs
+
+def set_ownership(filename, spec):
+    """
+    Set the ownership of ``filename`` given the spec.
+    """
+    uid, user, gid, group = calc_ownership_spec(spec)
+    st = os.stat(filename)
+    if not uid:
+        uid = st.st_uid
+    if not gid:
+        gid = st.st_gid
+    os.chmod(filename, uid, gid)
+
+class PermissionSpec(object):
+    """
+    Represents a set of specifications for permissions.
+
+    Typically reads from a file that looks like this::
+
+      rwxrwxrwx user:group filename
+
+    If the filename ends in /, then it expected to be a directory, and
+    the directory is made executable automatically, and the contents
+    of the directory are given the same permission (recursively).  By
+    default the executable bit on files is left as-is, unless the
+    permissions specifically say it should be on in some way.
+
+    You can use 'nomodify filename' for permissions to say that any
+    permission is okay, and permissions should not be changed.
+
+    Use 'noexist filename' to say that a specific file should not
+    exist.
+
+    Use 'symlink filename symlinked_to' to assert a symlink destination
+
+    The entire file is read, and most specific rules are used for each
+    file (i.e., a rule for a subdirectory overrides the rule for a
+    superdirectory).  Order does not matter.
+    """
+
+    def __init__(self):
+        self.paths = {}
+
+    def parsefile(self, filename):
+        f = open(filename)
+        lines = f.readlines()
+        f.close()
+        self.parselines(lines, filename=filename)
+
+    commands = {}
+
+    def parselines(self, lines, filename=None):
+        for lineindex, line in enumerate(lines):
+            line = line.strip()
+            if not line or line.startswith('#'):
+                continue
+            parts = line.split()
+            command = parts[0]
+            if command in self.commands:
+                cmd = self.commands[command](*parts[1:])
+            else:
+                cmd = self.commands['*'](*parts)
+            self.paths[cmd.path] = cmd
+
+    def check(self):
+        action = _Check(self)
+        self.traverse(action)
+
+    def fix(self):
+        action = _Fixer(self)
+        self.traverse(action)
+
+    def traverse(self, action):
+        paths = self.paths_sorted()
+        checked = {}
+        for path, checker in list(paths)[::-1]:
+            self.check_tree(action, path, paths, checked)
+        for path, checker in paths:
+            if path not in checked:
+                action.noexists(path, checker)
+
+    def traverse_tree(self, action, path, paths, checked):
+        if path in checked:
+            return
+        self.traverse_path(action, path, paths, checked)
+        if os.path.isdir(path):
+            for fn in os.listdir(path):
+                fn = os.path.join(path, fn)
+                self.traverse_tree(action, fn, paths, checked)
+
+    def traverse_path(self, action, path, paths, checked):
+        checked[path] = None
+        for check_path, checker in paths:
+            if path.startswith(check_path):
+                action.check(check_path, checker)
+                if not checker.inherit:
+                    break 
+
+    def paths_sorted(self):
+        paths = self.paths.items()
+        paths.sort(lambda a, b: -cmp(len(a[0]), len(b[0])))
+                  
+class _Rule(object):
+    class __metaclass__(type):
+        def __new__(meta, class_name, bases, d):
+            cls = type.__new__(meta, class_name, bases, d)
+            PermissionSpec.commands[cls.__name__] = cls
+            return cls
+
+    inherit = False
+    def noexists(self):
+        return ['Path %s does not exist' % path]
+
+class _NoModify(_Rule):
+
+    name = 'nomodify'
+                
+    def __init__(self, path):
+        self.path = path
+
+    def fix(self, path):
+        pass
+
+class _NoExist(_Rule):
+
+    name = 'noexist'
+
+    def __init__(self, path):
+        self.path = path
+
+    def check(self, path):
+        return ['Path %s should not exist' % path]
+
+    def noexists(self, path):
+        return []
+
+    def fix(self, path):
+        # @@: Should delete?
+        pass
+
+class _SymLink(_Rule):
+
+    name = 'symlink'
+    inherit = True
+
+    def __init__(self, path, dest):
+        self.path = path
+        self.dest = dest
+
+    def check(self, path):
+        assert path == self.path, (
+            "_Symlink should only be passed specific path %s (not %s)"
+            % (self.path, path))
+        try:
+            link = os.path.readlink(path)
+        except OSError:
+            if e.errno != 22:
+                raise
+            return ['Path %s is not a symlink (should point to %s)'
+                    % (path, self.dest)]
+        if link != self.dest:
+            return ['Path %s should symlink to %s, not %s'
+                    % (path, self.dest, link)]
+        return []
+
+    def fix(self, path):
+        assert path == self.path, (
+            "_Symlink should only be passed specific path %s (not %s)"
+            % (self.path, path))
+        if not os.path.exists(path):
+            os.symlink(path, self.dest)
+        else:
+            # @@: This should correct the symlink or something:
+            print 'Not symlinking %s' % path
+
+class _Permission(_Rule):
+
+    name = '*'
+
+    def __init__(self, perm, owner, dir):
+        self.perm_spec = read_perm_spec(perm)
+        self.owner = owner
+        self.dir = dir
+
+    def check(self, path):
+        return mode_diff(path, self.perm_spec)
+
+    def fix(self, path):
+        set_mode(path, self.perm_spec)
+
+class _Strategy(object):
+
+    def __init__(self, spec):
+        self.spec = spec
+
+class _Check(_Strategy):
+    
+    def noexists(self, path, checker):
+        checker.noexists(path)
+
+    def check(self, path, checker):
+        checker.check(path)
+
+class _Fixer(_Strategy):
+
+    def noexists(self, path, checker):
+        pass
+
+    def check(self, path, checker):
+        checker.fix(path)
+
+if __name__ == '__main__':
+    import doctest
+    doctest.testmod()
+    
Index: /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/serve.py
===================================================================
--- /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/serve.py (revision 3)
+++ /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/serve.py (revision 3)
@@ -0,0 +1,643 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+# @@: This should be moved to paste.deploy
+# For discussion of daemonizing:
+#   http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/278731
+# Code taken also from QP:
+#   http://www.mems-exchange.org/software/qp/
+#   From lib/site.py
+import re
+import os
+import errno
+import sys
+import time
+try:
+    import subprocess
+except ImportError:
+    from paste.util import subprocess24 as subprocess
+from command import Command, BadCommand
+from paste.deploy import loadapp, loadserver
+import threading
+import atexit
+import logging
+import ConfigParser
+
+MAXFD = 1024
+
+jython = sys.platform.startswith('java')
+
+class DaemonizeException(Exception):
+    pass
+
+
+class ServeCommand(Command):
+
+    min_args = 0
+    usage = 'CONFIG_FILE [start|stop|restart|status] [var=value]'
+    takes_config_file = 1
+    summary = "Serve the described application"
+    description = """\
+    This command serves a web application that uses a paste.deploy
+    configuration file for the server and application.  
+    
+    If start/stop/restart is given, then --daemon is implied, and it will
+    start (normal operation), stop (--stop-daemon), or do both.
+
+    You can also include variable assignments like 'http_port=8080'
+    and then use %(http_port)s in your config files.
+    """
+    
+    # used by subclasses that configure apps and servers differently
+    requires_config_file = True
+
+    parser = Command.standard_parser(quiet=True)
+    parser.add_option('-n', '--app-name',
+                      dest='app_name',
+                      metavar='NAME',
+                      help="Load the named application (default main)")
+    parser.add_option('-s', '--server',
+                      dest='server',
+                      metavar='SERVER_TYPE',
+                      help="Use the named server.")
+    parser.add_option('--server-name',
+                      dest='server_name',
+                      metavar='SECTION_NAME',
+                      help="Use the named server as defined in the configuration file (default: main)")
+    if hasattr(os, 'fork'):
+        parser.add_option('--daemon',
+                          dest="daemon",
+                          action="store_true",
+                          help="Run in daemon (background) mode")
+    parser.add_option('--pid-file',
+                      dest='pid_file',
+                      metavar='FILENAME',
+                      help="Save PID to file (default to paster.pid if running in daemon mode)")
+    parser.add_option('--log-file',
+                      dest='log_file',
+                      metavar='LOG_FILE',
+                      help="Save output to the given log file (redirects stdout)")
+    parser.add_option('--reload',
+                      dest='reload',
+                      action='store_true',
+                      help="Use auto-restart file monitor")
+    parser.add_option('--reload-interval',
+                      dest='reload_interval',
+                      default=1,
+                      help="Seconds between checking files (low number can cause significant CPU usage)")
+    parser.add_option('--monitor-restart',
+                      dest='monitor_restart',
+                      action='store_true',
+                      help="Auto-restart server if it dies")
+    parser.add_option('--status',
+                      action='store_true',
+                      dest='show_status',
+                      help="Show the status of the (presumably daemonized) server")
+
+
+    if hasattr(os, 'setuid'):
+        # I don't think these are available on Windows
+        parser.add_option('--user',
+                          dest='set_user',
+                          metavar="USERNAME",
+                          help="Set the user (usually only possible when run as root)")
+        parser.add_option('--group',
+                          dest='set_group',
+                          metavar="GROUP",
+                          help="Set the group (usually only possible when run as root)")
+
+    parser.add_option('--stop-daemon',
+                      dest='stop_daemon',
+                      action='store_true',
+                      help='Stop a daemonized server (given a PID file, or default paster.pid file)')
+
+    if jython:
+        parser.add_option('--disable-jython-reloader',
+                          action='store_true',
+                          dest='disable_jython_reloader',
+                          help="Disable the Jython reloader")
+
+
+    _scheme_re = re.compile(r'^[a-z][a-z]+:', re.I)
+
+    default_verbosity = 1
+
+    _reloader_environ_key = 'PYTHON_RELOADER_SHOULD_RUN'
+    _monitor_environ_key = 'PASTE_MONITOR_SHOULD_RUN'
+
+    possible_subcommands = ('start', 'stop', 'restart', 'status')
+    def command(self):
+        if self.options.stop_daemon:
+            return self.stop_daemon()
+
+        if not hasattr(self.options, 'set_user'):
+            # Windows case:
+            self.options.set_user = self.options.set_group = None
+        # @@: Is this the right stage to set the user at?
+        self.change_user_group(
+            self.options.set_user, self.options.set_group)
+
+        if self.requires_config_file:
+            if not self.args:
+                raise BadCommand('You must give a config file')
+            app_spec = self.args[0]
+            if (len(self.args) > 1
+                and self.args[1] in self.possible_subcommands):
+                cmd = self.args[1]
+                restvars = self.args[2:]
+            else:
+                cmd = None
+                restvars = self.args[1:]
+        else:
+            app_spec = ""
+            if (self.args
+                and self.args[0] in self.possible_subcommands):
+                cmd = self.args[0]
+                restvars = self.args[1:]
+            else:
+                cmd = None
+                restvars = self.args[:]
+
+        jython_monitor = False
+        if self.options.reload:
+            if jython and not self.options.disable_jython_reloader:
+                # JythonMonitor raises the special SystemRestart
+                # exception that'll cause the Jython interpreter to
+                # reload in the existing Java process (avoiding
+                # subprocess startup time)
+                try:
+                    from paste.reloader import JythonMonitor
+                except ImportError:
+                    pass
+                else:
+                    jython_monitor = JythonMonitor(poll_interval=int(
+                            self.options.reload_interval))
+                    if self.requires_config_file:
+                        jython_monitor.watch_file(self.args[0])
+
+            if not jython_monitor:
+                if os.environ.get(self._reloader_environ_key):
+                    from paste import reloader
+                    if self.verbose > 1:
+                        print 'Running reloading file monitor'
+                    reloader.install(int(self.options.reload_interval))
+                    if self.requires_config_file:
+                        reloader.watch_file(self.args[0])
+                else:
+                    return self.restart_with_reloader()
+
+        if cmd not in (None, 'start', 'stop', 'restart', 'status'):
+            raise BadCommand(
+                'Error: must give start|stop|restart (not %s)' % cmd)
+
+        if cmd == 'status' or self.options.show_status:
+            return self.show_status()
+
+        if cmd == 'restart' or cmd == 'stop':
+            result = self.stop_daemon()
+            if result:
+                if cmd == 'restart':
+                    print "Could not stop daemon; aborting"
+                else:
+                    print "Could not stop daemon"
+                return result
+            if cmd == 'stop':
+                return result
+
+        app_name = self.options.app_name
+        vars = self.parse_vars(restvars)
+        if not self._scheme_re.search(app_spec):
+            app_spec = 'config:' + app_spec
+        server_name = self.options.server_name
+        if self.options.server:
+            server_spec = 'egg:PasteScript'
+            assert server_name is None
+            server_name = self.options.server
+        else:
+            server_spec = app_spec
+        base = os.getcwd()
+
+        if getattr(self.options, 'daemon', False):
+            if not self.options.pid_file:
+                self.options.pid_file = 'paster.pid'
+            if not self.options.log_file:
+                self.options.log_file = 'paster.log'
+
+        # Ensure the log file is writeable
+        if self.options.log_file:
+            try:
+                writeable_log_file = open(self.options.log_file, 'a')
+            except IOError, ioe:
+                msg = 'Error: Unable to write to log file: %s' % ioe
+                raise BadCommand(msg)
+            writeable_log_file.close()
+
+        # Ensure the pid file is writeable
+        if self.options.pid_file:
+            try:
+                writeable_pid_file = open(self.options.pid_file, 'a')
+            except IOError, ioe:
+                msg = 'Error: Unable to write to pid file: %s' % ioe
+                raise BadCommand(msg)
+            writeable_pid_file.close()
+
+        if getattr(self.options, 'daemon', False):
+            try:
+                self.daemonize()
+            except DaemonizeException, ex:
+                if self.verbose > 0:
+                    print str(ex)
+                return
+
+        if (self.options.monitor_restart
+            and not os.environ.get(self._monitor_environ_key)):
+            return self.restart_with_monitor()
+
+        if self.options.pid_file:
+            self.record_pid(self.options.pid_file)
+
+        if self.options.log_file:
+            stdout_log = LazyWriter(self.options.log_file, 'a')
+            sys.stdout = stdout_log
+            sys.stderr = stdout_log
+            logging.basicConfig(stream=stdout_log)
+
+        log_fn = app_spec
+        if log_fn.startswith('config:'):
+            log_fn = app_spec[len('config:'):]
+        elif log_fn.startswith('egg:'):
+            log_fn = None
+        if log_fn:
+            log_fn = os.path.join(base, log_fn)
+            self.logging_file_config(log_fn)
+
+        server = self.loadserver(server_spec, name=server_name,
+                                 relative_to=base, global_conf=vars)
+        app = self.loadapp(app_spec, name=app_name,
+                           relative_to=base, global_conf=vars)
+
+        if self.verbose > 0:
+            if hasattr(os, 'getpid'):
+                msg = 'Starting server in PID %i.' % os.getpid()
+            else:
+                msg = 'Starting server.'
+            print msg
+
+        def serve():
+            try:
+                server(app)
+            except (SystemExit, KeyboardInterrupt), e:
+                if self.verbose > 1:
+                    raise
+                if str(e):
+                    msg = ' '+str(e)
+                else:
+                    msg = ''
+                print 'Exiting%s (-v to see traceback)' % msg
+
+        if jython_monitor:
+            # JythonMonitor has to be ran from the main thread
+            threading.Thread(target=serve).start()
+            print 'Starting Jython file monitor'
+            jython_monitor.periodic_reload()
+        else:
+            serve()
+    
+    def loadserver(self, server_spec, name, relative_to, **kw):
+            return loadserver(
+                server_spec, name=name,
+                relative_to=relative_to, **kw)
+    
+    def loadapp(self, app_spec, name, relative_to, **kw):
+            return loadapp(
+                app_spec, name=name, relative_to=relative_to,
+                **kw)
+
+    def daemonize(self):
+        pid = live_pidfile(self.options.pid_file)
+        if pid:
+            raise DaemonizeException(
+                "Daemon is already running (PID: %s from PID file %s)"
+                % (pid, self.options.pid_file))
+
+        if self.verbose > 0:
+            print 'Entering daemon mode'
+        pid = os.fork()
+        if pid:
+            # The forked process also has a handle on resources, so we
+            # *don't* want proper termination of the process, we just
+            # want to exit quick (which os._exit() does)
+            os._exit(0)
+        # Make this the session leader
+        os.setsid()
+        # Fork again for good measure!
+        pid = os.fork()
+        if pid:
+            os._exit(0)
+
+        # @@: Should we set the umask and cwd now?
+
+        import resource  # Resource usage information.
+        maxfd = resource.getrlimit(resource.RLIMIT_NOFILE)[1]
+        if (maxfd == resource.RLIM_INFINITY):
+            maxfd = MAXFD
+        # Iterate through and close all file descriptors.
+        for fd in range(0, maxfd):
+            try:
+                os.close(fd)
+            except OSError:  # ERROR, fd wasn't open to begin with (ignored)
+                pass
+
+        if (hasattr(os, "devnull")):
+            REDIRECT_TO = os.devnull
+        else:
+            REDIRECT_TO = "/dev/null"
+        os.open(REDIRECT_TO, os.O_RDWR)  # standard input (0)
+        # Duplicate standard input to standard output and standard error.
+        os.dup2(0, 1)  # standard output (1)
+        os.dup2(0, 2)  # standard error (2)
+        
+    def record_pid(self, pid_file):
+        pid = os.getpid()
+        if self.verbose > 1:
+            print 'Writing PID %s to %s' % (pid, pid_file)
+        f = open(pid_file, 'w')
+        f.write(str(pid))
+        f.close()
+        atexit.register(_remove_pid_file, pid, pid_file, self.verbose)
+
+    def stop_daemon(self):
+        pid_file = self.options.pid_file or 'paster.pid'
+        if not os.path.exists(pid_file):
+            print 'No PID file exists in %s' % pid_file
+            return 1
+        pid = read_pidfile(pid_file)
+        if not pid:
+            print "Not a valid PID file in %s" % pid_file
+            return 1
+        pid = live_pidfile(pid_file)
+        if not pid:
+            print "PID in %s is not valid (deleting)" % pid_file
+            try:
+                os.unlink(pid_file)
+            except (OSError, IOError), e:
+                print "Could not delete: %s" % e
+                return 2
+            return 1
+        for j in range(10):
+            if not live_pidfile(pid_file):
+                break
+            import signal
+            os.kill(pid, signal.SIGTERM)
+            time.sleep(1)
+        else:
+            print "failed to kill web process %s" % pid
+            return 3
+        if os.path.exists(pid_file):
+            os.unlink(pid_file)
+        return 0
+
+    def show_status(self):
+        pid_file = self.options.pid_file or 'paster.pid'
+        if not os.path.exists(pid_file):
+            print 'No PID file %s' % pid_file
+            return 1
+        pid = read_pidfile(pid_file)
+        if not pid:
+            print 'No PID in file %s' % pid_file
+            return 1
+        pid = live_pidfile(pid_file)
+        if not pid:
+            print 'PID %s in %s is not running' % (pid, pid_file)
+            return 1
+        print 'Server running in PID %s' % pid
+        return 0
+
+    def restart_with_reloader(self):
+        self.restart_with_monitor(reloader=True)
+
+    def restart_with_monitor(self, reloader=False):
+        if self.verbose > 0:
+            if reloader:
+                print 'Starting subprocess with file monitor'
+            else:
+                print 'Starting subprocess with monitor parent'
+        while 1:
+            args = [self.quote_first_command_arg(sys.executable)] + sys.argv
+            new_environ = os.environ.copy()
+            if reloader:
+                new_environ[self._reloader_environ_key] = 'true'
+            else:
+                new_environ[self._monitor_environ_key] = 'true'
+            proc = None
+            try:
+                try:
+                    _turn_sigterm_into_systemexit()
+                    proc = subprocess.Popen(args, env=new_environ)
+                    exit_code = proc.wait()
+                    proc = None
+                except KeyboardInterrupt:
+                    print '^C caught in monitor process'
+                    if self.verbose > 1:
+                        raise
+                    return 1
+            finally:
+                if (proc is not None
+                    and hasattr(os, 'kill')):
+                    import signal
+                    try:
+                        os.kill(proc.pid, signal.SIGTERM)
+                    except (OSError, IOError):
+                        pass
+                
+            if reloader:
+                # Reloader always exits with code 3; but if we are
+                # a monitor, any exit code will restart
+                if exit_code != 3:
+                    return exit_code
+            if self.verbose > 0:
+                print '-'*20, 'Restarting', '-'*20
+
+    def change_user_group(self, user, group):
+        if not user and not group:
+            return
+        import pwd, grp
+        uid = gid = None
+        if group:
+            try:
+                gid = int(group)
+                group = grp.getgrgid(gid).gr_name
+            except ValueError:
+                import grp
+                try:
+                    entry = grp.getgrnam(group)
+                except KeyError:
+                    raise BadCommand(
+                        "Bad group: %r; no such group exists" % group)
+                gid = entry.gr_gid
+        try:
+            uid = int(user)
+            user = pwd.getpwuid(uid).pw_name
+        except ValueError:
+            try:
+                entry = pwd.getpwnam(user)
+            except KeyError:
+                raise BadCommand(
+                    "Bad username: %r; no such user exists" % user)
+            if not gid:
+                gid = entry.pw_gid
+            uid = entry.pw_uid
+        if self.verbose > 0:
+            print 'Changing user to %s:%s (%s:%s)' % (
+                user, group or '(unknown)', uid, gid)
+        if gid:
+            os.setgid(gid)
+        if uid:
+            os.setuid(uid)
+            
+class LazyWriter(object):
+
+    """
+    File-like object that opens a file lazily when it is first written
+    to.
+    """
+
+    def __init__(self, filename, mode='w'):
+        self.filename = filename
+        self.fileobj = None
+        self.lock = threading.Lock()
+        self.mode = mode
+        
+    def open(self):
+        if self.fileobj is None:
+            self.lock.acquire()
+            try:
+                if self.fileobj is None:
+                    self.fileobj = open(self.filename, self.mode)
+            finally:
+                self.lock.release()
+        return self.fileobj
+
+    def write(self, text):
+        fileobj = self.open()
+        fileobj.write(text)
+        fileobj.flush()
+
+    def writelines(self, text):
+        fileobj = self.open()
+        fileobj.writelines(text)
+        fileobj.flush()
+
+    def flush(self):
+        self.open().flush()
+
+def live_pidfile(pidfile):
+    """(pidfile:str) -> int | None
+    Returns an int found in the named file, if there is one,
+    and if there is a running process with that process id.
+    Return None if no such process exists.
+    """
+    pid = read_pidfile(pidfile)
+    if pid:
+        try:
+            os.kill(int(pid), 0)
+            return pid
+        except OSError, e:
+            if e.errno == errno.EPERM:
+                return pid
+    return None
+
+def read_pidfile(filename):
+    if os.path.exists(filename):
+        try:
+            f = open(filename)
+            content = f.read()
+            f.close()
+            return int(content.strip())
+        except (ValueError, IOError):
+            return None
+    else:
+        return None
+        
+def _remove_pid_file(written_pid, filename, verbosity):
+    current_pid = os.getpid()
+    if written_pid != current_pid:
+        # A forked process must be exiting, not the process that
+        # wrote the PID file
+        return
+    if not os.path.exists(filename):
+        return
+    f = open(filename)
+    content = f.read().strip()
+    f.close()
+    try:
+        pid_in_file = int(content)
+    except ValueError:
+        pass
+    else:
+        if pid_in_file != current_pid:
+            print "PID file %s contains %s, not expected PID %s" % (
+                filename, pid_in_file, current_pid)
+            return
+    if verbosity > 0:
+        print "Removing PID file %s" % filename
+    try:
+        os.unlink(filename)
+        return
+    except OSError, e:
+        # Record, but don't give traceback
+        print "Cannot remove PID file: %s" % e
+    # well, at least lets not leave the invalid PID around...
+    try:
+        f = open(filename, 'w')
+        f.write('')
+        f.close()
+    except OSError, e:
+        print 'Stale PID left in file: %s (%e)' % (filename, e)
+    else:
+        print 'Stale PID removed'
+        
+            
+def ensure_port_cleanup(bound_addresses, maxtries=30, sleeptime=2):
+    """
+    This makes sure any open ports are closed.
+
+    Does this by connecting to them until they give connection
+    refused.  Servers should call like::
+
+        import paste.script
+        ensure_port_cleanup([80, 443])
+    """
+    atexit.register(_cleanup_ports, bound_addresses, maxtries=maxtries,
+                    sleeptime=sleeptime)
+
+def _cleanup_ports(bound_addresses, maxtries=30, sleeptime=2):
+    # Wait for the server to bind to the port.
+    import socket
+    import errno
+    for bound_address in bound_addresses:
+        for attempt in range(maxtries):
+            sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+            try:
+                sock.connect(bound_address)
+            except socket.error, e:
+                if e.args[0] != errno.ECONNREFUSED:
+                    raise
+                break
+            else:
+                time.sleep(sleeptime)
+        else:
+            raise SystemExit('Timeout waiting for port.')
+        sock.close()
+
+def _turn_sigterm_into_systemexit():
+    """
+    Attempts to turn a SIGTERM exception into a SystemExit exception.
+    """
+    try:
+        import signal
+    except ImportError:
+        return
+    def handle_term(signo, frame):
+        raise SystemExit
+    signal.signal(signal.SIGTERM, handle_term)
+    
Index: /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/pluginlib.py
===================================================================
--- /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/pluginlib.py (revision 3)
+++ /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/pluginlib.py (revision 3)
@@ -0,0 +1,134 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+import os
+import pkg_resources
+
+def add_plugin(egg_info_dir, plugin_name):
+    """
+    Add the plugin to the given distribution (or spec), in
+    .egg-info/paster_plugins.txt
+    """
+    fn = os.path.join(egg_info_dir, 'paster_plugins.txt')
+    if not os.path.exists(fn):
+        lines = []
+    else:
+        f = open(fn)
+        lines = [l.strip() for l in f.readlines() if l.strip()]
+        f.close()
+    if plugin_name in lines:
+        # Nothing to do
+        return
+    lines.append(plugin_name)
+    if not os.path.exists(os.path.dirname(fn)):
+        os.makedirs(os.path.dirname(fn))
+    f = open(fn, 'w')
+    for line in lines:
+        f.write(line)
+        f.write('\n')
+    f.close()
+
+def remove_plugin(egg_info_dir, plugin_name):
+    """
+    Remove the plugin to the given distribution (or spec), in
+    .egg-info/paster_plugins.txt.  Raises ValueError if the
+    plugin is not in the file.
+    """
+    fn = os.path.join(egg_info_dir, 'paster_plugins.txt')
+    if not os.path.exists(fn):
+        raise ValueError(
+            "Cannot remove plugin from %s; file does not exist"
+            % fn)
+    f = open(fn)
+    lines = [l.strip() for l in f.readlines() if l.strip()]
+    f.close()
+    for line in lines:
+        # What about version specs?
+        if line.lower() == plugin_name.lower():
+            break
+    else:
+        raise ValueError(
+            "Plugin %s not found in file %s (from: %s)"
+            % (plugin_name, fn, lines))
+    lines.remove(line)
+    print 'writing', lines
+    f = open(fn, 'w')
+    for line in lines:
+        f.write(line)
+        f.write('\n')
+    f.close()
+    
+def find_egg_info_dir(dir):
+    while 1:
+        try:
+            filenames = os.listdir(dir)
+        except OSError:
+            # Probably permission denied or something
+            return None
+        for fn in filenames:
+            if fn.endswith('.egg-info'):
+                return os.path.join(dir, fn)
+        parent = os.path.dirname(dir)
+        if parent == dir:
+            # Top-most directory
+            return None
+        dir = parent
+
+def resolve_plugins(plugin_list):
+    found = []
+    while plugin_list:
+        plugin = plugin_list.pop()
+        try:
+            pkg_resources.require(plugin)
+        except pkg_resources.DistributionNotFound, e:
+            msg = '%sNot Found%s: %s (did you run python setup.py develop?)'
+            if str(e) != plugin:
+                e.args = (msg % (str(e) + ': ', ' for', plugin)),
+            else:
+                e.args = (msg % ('', '', plugin)),
+            raise
+        found.append(plugin)
+        dist = get_distro(plugin)
+        if dist.has_metadata('paster_plugins.txt'):
+            data = dist.get_metadata('paster_plugins.txt')
+            for add_plugin in parse_lines(data):
+                if add_plugin not in found:
+                    plugin_list.append(add_plugin)
+    return map(get_distro, found)
+
+def get_distro(spec):
+    return pkg_resources.get_distribution(spec)
+
+def load_commands_from_plugins(plugins):
+    commands = {}
+    for plugin in plugins:
+        commands.update(pkg_resources.get_entry_map(
+            plugin, group='paste.paster_command'))
+    return commands
+
+def parse_lines(data):
+    result = []
+    for line in data.splitlines():
+        line = line.strip()
+        if line and not line.startswith('#'):
+            result.append(line)
+    return result
+
+def load_global_commands():
+    commands = {}
+    for p in pkg_resources.iter_entry_points('paste.global_paster_command'):
+        commands[p.name] = p
+    return commands
+
+def egg_name(dist_name):
+    return pkg_resources.to_filename(pkg_resources.safe_name(dist_name))
+
+def egg_info_dir(base_dir, dist_name):
+    all = []
+    for dir_extension in ['.'] + os.listdir(base_dir):
+        full = os.path.join(base_dir, dir_extension,
+                            egg_name(dist_name)+'.egg-info')
+        all.append(full)
+        if os.path.exists(full):
+            return full
+    raise IOError("No egg-info directory found (looked in %s)"
+                  % ', '.join(all))
Index: /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/util/logging_config.py
===================================================================
--- /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/util/logging_config.py (revision 3)
+++ /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/util/logging_config.py (revision 3)
@@ -0,0 +1,354 @@
+# Copyright 2001-2005 by Vinay Sajip. All Rights Reserved.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation for any purpose and without fee is hereby granted,
+# provided that the above copyright notice appear in all copies and that
+# both that copyright notice and this permission notice appear in
+# supporting documentation, and that the name of Vinay Sajip
+# not be used in advertising or publicity pertaining to distribution
+# of the software without specific, written prior permission.
+# VINAY SAJIP DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
+# VINAY SAJIP BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
+# IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+"""
+Configuration functions for the logging package for Python. The core package
+is based on PEP 282 and comments thereto in comp.lang.python, and influenced
+by Apache's log4j system.
+
+Should work under Python versions >= 1.5.2, except that source line
+information is not available unless 'sys._getframe()' is.
+
+Copyright (C) 2001-2004 Vinay Sajip. All Rights Reserved.
+
+To use, simply 'import logging' and log away!
+"""
+
+import sys, logging, logging.handlers, string, socket, struct, os, traceback, types
+
+try:
+    import thread
+    import threading
+except ImportError:
+    thread = None
+
+from SocketServer import ThreadingTCPServer, StreamRequestHandler
+
+
+DEFAULT_LOGGING_CONFIG_PORT = 9030
+
+if sys.platform == "win32":
+    RESET_ERROR = 10054   #WSAECONNRESET
+else:
+    RESET_ERROR = 104     #ECONNRESET
+
+#
+#   The following code implements a socket listener for on-the-fly
+#   reconfiguration of logging.
+#
+#   _listener holds the server object doing the listening
+_listener = None
+
+def fileConfig(fname, defaults=None):
+    """
+    Read the logging configuration from a ConfigParser-format file.
+
+    This can be called several times from an application, allowing an end user
+    the ability to select from various pre-canned configurations (if the
+    developer provides a mechanism to present the choices and load the chosen
+    configuration).
+    In versions of ConfigParser which have the readfp method [typically
+    shipped in 2.x versions of Python], you can pass in a file-like object
+    rather than a filename, in which case the file-like object will be read
+    using readfp.
+    """
+    import ConfigParser
+
+    cp = ConfigParser.ConfigParser(defaults)
+    if hasattr(cp, 'readfp') and hasattr(fname, 'readline'):
+        cp.readfp(fname)
+    else:
+        cp.read(fname)
+
+    formatters = _create_formatters(cp)
+
+    # critical section
+    logging._acquireLock()
+    try:
+        logging._handlers.clear()
+        if hasattr(logging, '_handlerList'):
+            del logging._handlerList[:]
+        # Handlers add themselves to logging._handlers
+        handlers = _install_handlers(cp, formatters)
+        _install_loggers(cp, handlers)
+    finally:
+        logging._releaseLock()
+
+
+def _resolve(name):
+    """Resolve a dotted name to a global object."""
+    name = string.split(name, '.')
+    used = name.pop(0)
+    found = __import__(used)
+    for n in name:
+        used = used + '.' + n
+        try:
+            found = getattr(found, n)
+        except AttributeError:
+            __import__(used)
+            found = getattr(found, n)
+    return found
+
+
+def _create_formatters(cp):
+    """Create and return formatters"""
+    flist = cp.get("formatters", "keys")
+    if not len(flist):
+        return {}
+    flist = string.split(flist, ",")
+    formatters = {}
+    for form in flist:
+        form = string.strip(form)
+        sectname = "formatter_%s" % form
+        opts = cp.options(sectname)
+        if "format" in opts:
+            fs = cp.get(sectname, "format", 1)
+        else:
+            fs = None
+        if "datefmt" in opts:
+            dfs = cp.get(sectname, "datefmt", 1)
+        else:
+            dfs = None
+        c = logging.Formatter
+        if "class" in opts:
+            class_name = cp.get(sectname, "class")
+            if class_name:
+                c = _resolve(class_name)
+        f = c(fs, dfs)
+        formatters[form] = f
+    return formatters
+
+
+def _install_handlers(cp, formatters):
+    """Install and return handlers"""
+    hlist = cp.get("handlers", "keys")
+    if not len(hlist):
+        return {}
+    hlist = string.split(hlist, ",")
+    handlers = {}
+    fixups = [] #for inter-handler references
+    for hand in hlist:
+        hand = string.strip(hand)
+        sectname = "handler_%s" % hand
+        klass = cp.get(sectname, "class")
+        opts = cp.options(sectname)
+        if "formatter" in opts:
+            fmt = cp.get(sectname, "formatter")
+        else:
+            fmt = ""
+        try:
+            klass = eval(klass, vars(logging))
+        except (AttributeError, NameError):
+            klass = _resolve(klass)
+        args = cp.get(sectname, "args")
+        args = eval(args, vars(logging))
+        h = apply(klass, args)
+        if "level" in opts:
+            level = cp.get(sectname, "level")
+            h.setLevel(logging._levelNames[level])
+        if len(fmt):
+            h.setFormatter(formatters[fmt])
+        #temporary hack for FileHandler and MemoryHandler.
+        if klass == logging.handlers.MemoryHandler:
+            if "target" in opts:
+                target = cp.get(sectname,"target")
+            else:
+                target = ""
+            if len(target): #the target handler may not be loaded yet, so keep for later...
+                fixups.append((h, target))
+        handlers[hand] = h
+    #now all handlers are loaded, fixup inter-handler references...
+    for h, t in fixups:
+        h.setTarget(handlers[t])
+    return handlers
+
+
+def _install_loggers(cp, handlers):
+    """Create and install loggers"""
+
+    # configure the root first
+    llist = cp.get("loggers", "keys")
+    llist = string.split(llist, ",")
+    llist = map(lambda x: string.strip(x), llist)
+    llist.remove("root")
+    sectname = "logger_root"
+    root = logging.root
+    log = root
+    opts = cp.options(sectname)
+    if "level" in opts:
+        level = cp.get(sectname, "level")
+        log.setLevel(logging._levelNames[level])
+    for h in root.handlers[:]:
+        root.removeHandler(h)
+    hlist = cp.get(sectname, "handlers")
+    if len(hlist):
+        hlist = string.split(hlist, ",")
+        for hand in hlist:
+            log.addHandler(handlers[string.strip(hand)])
+
+    #and now the others...
+    #we don't want to lose the existing loggers,
+    #since other threads may have pointers to them.
+    #existing is set to contain all existing loggers,
+    #and as we go through the new configuration we
+    #remove any which are configured. At the end,
+    #what's left in existing is the set of loggers
+    #which were in the previous configuration but
+    #which are not in the new configuration.
+    existing = root.manager.loggerDict.keys()
+    #now set up the new ones...
+    for log in llist:
+        sectname = "logger_%s" % log
+        qn = cp.get(sectname, "qualname")
+        opts = cp.options(sectname)
+        if "propagate" in opts:
+            propagate = cp.getint(sectname, "propagate")
+        else:
+            propagate = 1
+        logger = logging.getLogger(qn)
+        if qn in existing:
+            existing.remove(qn)
+        if "level" in opts:
+            level = cp.get(sectname, "level")
+            logger.setLevel(logging._levelNames[level])
+        for h in logger.handlers[:]:
+            logger.removeHandler(h)
+        logger.propagate = propagate
+        logger.disabled = 0
+        hlist = cp.get(sectname, "handlers")
+        if len(hlist):
+            hlist = string.split(hlist, ",")
+            for hand in hlist:
+                logger.addHandler(handlers[string.strip(hand)])
+
+    #Disable any old loggers. There's no point deleting
+    #them as other threads may continue to hold references
+    #and by disabling them, you stop them doing any logging.
+    for log in existing:
+        root.manager.loggerDict[log].disabled = 1
+
+
+def listen(port=DEFAULT_LOGGING_CONFIG_PORT):
+    """
+    Start up a socket server on the specified port, and listen for new
+    configurations.
+
+    These will be sent as a file suitable for processing by fileConfig().
+    Returns a Thread object on which you can call start() to start the server,
+    and which you can join() when appropriate. To stop the server, call
+    stopListening().
+    """
+    if not thread:
+        raise NotImplementedError, "listen() needs threading to work"
+
+    class ConfigStreamHandler(StreamRequestHandler):
+        """
+        Handler for a logging configuration request.
+
+        It expects a completely new logging configuration and uses fileConfig
+        to install it.
+        """
+        def handle(self):
+            """
+            Handle a request.
+
+            Each request is expected to be a 4-byte length, packed using
+            struct.pack(">L", n), followed by the config file.
+            Uses fileConfig() to do the grunt work.
+            """
+            import tempfile
+            try:
+                conn = self.connection
+                chunk = conn.recv(4)
+                if len(chunk) == 4:
+                    slen = struct.unpack(">L", chunk)[0]
+                    chunk = self.connection.recv(slen)
+                    while len(chunk) < slen:
+                        chunk = chunk + conn.recv(slen - len(chunk))
+                    #Apply new configuration. We'd like to be able to
+                    #create a StringIO and pass that in, but unfortunately
+                    #1.5.2 ConfigParser does not support reading file
+                    #objects, only actual files. So we create a temporary
+                    #file and remove it later.
+                    file = tempfile.mktemp(".ini")
+                    f = open(file, "w")
+                    f.write(chunk)
+                    f.close()
+                    try:
+                        fileConfig(file)
+                    except (KeyboardInterrupt, SystemExit):
+                        raise
+                    except:
+                        traceback.print_exc()
+                    os.remove(file)
+            except socket.error, e:
+                if type(e.args) != types.TupleType:
+                    raise
+                else:
+                    errcode = e.args[0]
+                    if errcode != RESET_ERROR:
+                        raise
+
+    class ConfigSocketReceiver(ThreadingTCPServer):
+        """
+        A simple TCP socket-based logging config receiver.
+        """
+
+        allow_reuse_address = 1
+
+        def __init__(self, host='localhost', port=DEFAULT_LOGGING_CONFIG_PORT,
+                     handler=None):
+            ThreadingTCPServer.__init__(self, (host, port), handler)
+            logging._acquireLock()
+            self.abort = 0
+            logging._releaseLock()
+            self.timeout = 1
+
+        def serve_until_stopped(self):
+            import select
+            abort = 0
+            while not abort:
+                rd, wr, ex = select.select([self.socket.fileno()],
+                                           [], [],
+                                           self.timeout)
+                if rd:
+                    self.handle_request()
+                logging._acquireLock()
+                abort = self.abort
+                logging._releaseLock()
+
+    def serve(rcvr, hdlr, port):
+        server = rcvr(port=port, handler=hdlr)
+        global _listener
+        logging._acquireLock()
+        _listener = server
+        logging._releaseLock()
+        server.serve_until_stopped()
+
+    return threading.Thread(target=serve,
+                            args=(ConfigSocketReceiver,
+                                  ConfigStreamHandler, port))
+
+def stopListening():
+    """
+    Stop the listening server which was created with a call to listen().
+    """
+    global _listener
+    if _listener:
+        logging._acquireLock()
+        _listener.abort = 1
+        _listener = None
+        logging._releaseLock()
Index: /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/util/string24.py
===================================================================
--- /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/util/string24.py (revision 3)
+++ /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/util/string24.py (revision 3)
@@ -0,0 +1,533 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+"""A collection of string operations (most are no longer used).
+
+Warning: most of the code you see here isn't normally used nowadays.
+Beginning with Python 1.6, many of these functions are implemented as
+methods on the standard string object. They used to be implemented by
+a built-in module called strop, but strop is now obsolete itself.
+
+Public module variables:
+
+whitespace -- a string containing all characters considered whitespace
+lowercase -- a string containing all characters considered lowercase letters
+uppercase -- a string containing all characters considered uppercase letters
+letters -- a string containing all characters considered letters
+digits -- a string containing all characters considered decimal digits
+hexdigits -- a string containing all characters considered hexadecimal digits
+octdigits -- a string containing all characters considered octal digits
+punctuation -- a string containing all characters considered punctuation
+printable -- a string containing all characters considered printable
+
+"""
+
+# Some strings for ctype-style character classification
+whitespace = ' \t\n\r\v\f'
+lowercase = 'abcdefghijklmnopqrstuvwxyz'
+uppercase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+letters = lowercase + uppercase
+ascii_lowercase = lowercase
+ascii_uppercase = uppercase
+ascii_letters = ascii_lowercase + ascii_uppercase
+digits = '0123456789'
+hexdigits = digits + 'abcdef' + 'ABCDEF'
+octdigits = '01234567'
+punctuation = """!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~"""
+printable = digits + letters + punctuation + whitespace
+
+# Case conversion helpers
+# Use str to convert Unicode literal in case of -U
+# Note that Cookie.py bogusly uses _idmap :(
+l = map(chr, xrange(256))
+_idmap = str('').join(l)
+del l
+
+# Functions which aren't available as string methods.
+
+# Capitalize the words in a string, e.g. " aBc  dEf " -> "Abc Def".
+# See also regsub.capwords().
+def capwords(s, sep=None):
+    """capwords(s, [sep]) -> string
+
+    Split the argument into words using split, capitalize each
+    word using capitalize, and join the capitalized words using
+    join. Note that this replaces runs of whitespace characters by
+    a single space.
+
+    """
+    return (sep or ' ').join([x.capitalize() for x in s.split(sep)])
+
+
+# Construct a translation string
+_idmapL = None
+def maketrans(fromstr, tostr):
+    """maketrans(frm, to) -> string
+
+    Return a translation table (a string of 256 bytes long)
+    suitable for use in string.translate.  The strings frm and to
+    must be of the same length.
+
+    """
+    if len(fromstr) != len(tostr):
+        raise ValueError, "maketrans arguments must have same length"
+    global _idmapL
+    if not _idmapL:
+        _idmapL = map(None, _idmap)
+    L = _idmapL[:]
+    fromstr = map(ord, fromstr)
+    for i in range(len(fromstr)):
+        L[fromstr[i]] = tostr[i]
+    return ''.join(L)
+
+
+
+####################################################################
+import re as _re
+
+class _multimap:
+    """Helper class for combining multiple mappings.
+
+    Used by .{safe_,}substitute() to combine the mapping and keyword
+    arguments.
+    """
+    def __init__(self, primary, secondary):
+        self._primary = primary
+        self._secondary = secondary
+
+    def __getitem__(self, key):
+        try:
+            return self._primary[key]
+        except KeyError:
+            return self._secondary[key]
+
+
+class _TemplateMetaclass(type):
+    pattern = r"""
+    %(delim)s(?:
+      (?P<escaped>%(delim)s) |   # Escape sequence of two delimiters
+      (?P<named>%(id)s)      |   # delimiter and a Python identifier
+      {(?P<braced>%(id)s)}   |   # delimiter and a braced identifier
+      (?P<invalid>)              # Other ill-formed delimiter exprs
+    )
+    """
+
+    def __init__(cls, name, bases, dct):
+        super(_TemplateMetaclass, cls).__init__(name, bases, dct)
+        if 'pattern' in dct:
+            pattern = cls.pattern
+        else:
+            pattern = _TemplateMetaclass.pattern % {
+                'delim' : _re.escape(cls.delimiter),
+                'id'    : cls.idpattern,
+                }
+        cls.pattern = _re.compile(pattern, _re.IGNORECASE | _re.VERBOSE)
+
+
+class Template:
+    """A string class for supporting $-substitutions."""
+    __metaclass__ = _TemplateMetaclass
+
+    delimiter = '$'
+    idpattern = r'[_a-z][_a-z0-9]*'
+
+    def __init__(self, template):
+        self.template = template
+
+    # Search for $$, $identifier, ${identifier}, and any bare $'s
+
+    def _invalid(self, mo):
+        i = mo.start('invalid')
+        lines = self.template[:i].splitlines(True)
+        if not lines:
+            colno = 1
+            lineno = 1
+        else:
+            colno = i - len(''.join(lines[:-1]))
+            lineno = len(lines)
+        raise ValueError('Invalid placeholder in string: line %d, col %d' %
+                         (lineno, colno))
+
+    def substitute(self, *args, **kws):
+        if len(args) > 1:
+            raise TypeError('Too many positional arguments')
+        if not args:
+            mapping = kws
+        elif kws:
+            mapping = _multimap(kws, args[0])
+        else:
+            mapping = args[0]
+        # Helper function for .sub()
+        def convert(mo):
+            # Check the most common path first.
+            named = mo.group('named') or mo.group('braced')
+            if named is not None:
+                val = mapping[named]
+                # We use this idiom instead of str() because the latter will
+                # fail if val is a Unicode containing non-ASCII characters.
+                return '%s' % val
+            if mo.group('escaped') is not None:
+                return self.delimiter
+            if mo.group('invalid') is not None:
+                self._invalid(mo)
+            raise ValueError('Unrecognized named group in pattern',
+                             self.pattern)
+        return self.pattern.sub(convert, self.template)
+
+    def safe_substitute(self, *args, **kws):
+        if len(args) > 1:
+            raise TypeError('Too many positional arguments')
+        if not args:
+            mapping = kws
+        elif kws:
+            mapping = _multimap(kws, args[0])
+        else:
+            mapping = args[0]
+        # Helper function for .sub()
+        def convert(mo):
+            named = mo.group('named')
+            if named is not None:
+                try:
+                    # We use this idiom instead of str() because the latter
+                    # will fail if val is a Unicode containing non-ASCII
+                    return '%s' % mapping[named]
+                except KeyError:
+                    return self.delimiter + named
+            braced = mo.group('braced')
+            if braced is not None:
+                try:
+                    return '%s' % mapping[braced]
+                except KeyError:
+                    return self.delimiter + '{' + braced + '}'
+            if mo.group('escaped') is not None:
+                return self.delimiter
+            if mo.group('invalid') is not None:
+                return self.delimiter
+            raise ValueError('Unrecognized named group in pattern',
+                             self.pattern)
+        return self.pattern.sub(convert, self.template)
+
+
+
+####################################################################
+# NOTE: Everything below here is deprecated.  Use string methods instead.
+# This stuff will go away in Python 3.0.
+
+# Backward compatible names for exceptions
+index_error = ValueError
+atoi_error = ValueError
+atof_error = ValueError
+atol_error = ValueError
+
+# convert UPPER CASE letters to lower case
+def lower(s):
+    """lower(s) -> string
+
+    Return a copy of the string s converted to lowercase.
+
+    """
+    return s.lower()
+
+# Convert lower case letters to UPPER CASE
+def upper(s):
+    """upper(s) -> string
+
+    Return a copy of the string s converted to uppercase.
+
+    """
+    return s.upper()
+
+# Swap lower case letters and UPPER CASE
+def swapcase(s):
+    """swapcase(s) -> string
+
+    Return a copy of the string s with upper case characters
+    converted to lowercase and vice versa.
+
+    """
+    return s.swapcase()
+
+# Strip leading and trailing tabs and spaces
+def strip(s, chars=None):
+    """strip(s [,chars]) -> string
+
+    Return a copy of the string s with leading and trailing
+    whitespace removed.
+    If chars is given and not None, remove characters in chars instead.
+    If chars is unicode, S will be converted to unicode before stripping.
+
+    """
+    return s.strip(chars)
+
+# Strip leading tabs and spaces
+def lstrip(s, chars=None):
+    """lstrip(s [,chars]) -> string
+
+    Return a copy of the string s with leading whitespace removed.
+    If chars is given and not None, remove characters in chars instead.
+
+    """
+    return s.lstrip(chars)
+
+# Strip trailing tabs and spaces
+def rstrip(s, chars=None):
+    """rstrip(s [,chars]) -> string
+
+    Return a copy of the string s with trailing whitespace removed.
+    If chars is given and not None, remove characters in chars instead.
+
+    """
+    return s.rstrip(chars)
+
+
+# Split a string into a list of space/tab-separated words
+def split(s, sep=None, maxsplit=-1):
+    """split(s [,sep [,maxsplit]]) -> list of strings
+
+    Return a list of the words in the string s, using sep as the
+    delimiter string.  If maxsplit is given, splits at no more than
+    maxsplit places (resulting in at most maxsplit+1 words).  If sep
+    is not specified or is None, any whitespace string is a separator.
+
+    (split and splitfields are synonymous)
+
+    """
+    return s.split(sep, maxsplit)
+splitfields = split
+
+# Split a string into a list of space/tab-separated words
+def rsplit(s, sep=None, maxsplit=-1):
+    """rsplit(s [,sep [,maxsplit]]) -> list of strings
+
+    Return a list of the words in the string s, using sep as the
+    delimiter string, starting at the end of the string and working
+    to the front.  If maxsplit is given, at most maxsplit splits are
+    done. If sep is not specified or is None, any whitespace string
+    is a separator.
+    """
+    return s.rsplit(sep, maxsplit)
+
+# Join fields with optional separator
+def join(words, sep = ' '):
+    """join(list [,sep]) -> string
+
+    Return a string composed of the words in list, with
+    intervening occurrences of sep.  The default separator is a
+    single space.
+
+    (joinfields and join are synonymous)
+
+    """
+    return sep.join(words)
+joinfields = join
+
+# Find substring, raise exception if not found
+def index(s, *args):
+    """index(s, sub [,start [,end]]) -> int
+
+    Like find but raises ValueError when the substring is not found.
+
+    """
+    return s.index(*args)
+
+# Find last substring, raise exception if not found
+def rindex(s, *args):
+    """rindex(s, sub [,start [,end]]) -> int
+
+    Like rfind but raises ValueError when the substring is not found.
+
+    """
+    return s.rindex(*args)
+
+# Count non-overlapping occurrences of substring
+def count(s, *args):
+    """count(s, sub[, start[,end]]) -> int
+
+    Return the number of occurrences of substring sub in string
+    s[start:end].  Optional arguments start and end are
+    interpreted as in slice notation.
+
+    """
+    return s.count(*args)
+
+# Find substring, return -1 if not found
+def find(s, *args):
+    """find(s, sub [,start [,end]]) -> in
+
+    Return the lowest index in s where substring sub is found,
+    such that sub is contained within s[start,end].  Optional
+    arguments start and end are interpreted as in slice notation.
+
+    Return -1 on failure.
+
+    """
+    return s.find(*args)
+
+# Find last substring, return -1 if not found
+def rfind(s, *args):
+    """rfind(s, sub [,start [,end]]) -> int
+
+    Return the highest index in s where substring sub is found,
+    such that sub is contained within s[start,end].  Optional
+    arguments start and end are interpreted as in slice notation.
+
+    Return -1 on failure.
+
+    """
+    return s.rfind(*args)
+
+# for a bit of speed
+_float = float
+_int = int
+_long = long
+
+# Convert string to float
+def atof(s):
+    """atof(s) -> float
+
+    Return the floating point number represented by the string s.
+
+    """
+    return _float(s)
+
+
+# Convert string to integer
+def atoi(s , base=10):
+    """atoi(s [,base]) -> int
+
+    Return the integer represented by the string s in the given
+    base, which defaults to 10.  The string s must consist of one
+    or more digits, possibly preceded by a sign.  If base is 0, it
+    is chosen from the leading characters of s, 0 for octal, 0x or
+    0X for hexadecimal.  If base is 16, a preceding 0x or 0X is
+    accepted.
+
+    """
+    return _int(s, base)
+
+
+# Convert string to long integer
+def atol(s, base=10):
+    """atol(s [,base]) -> long
+
+    Return the long integer represented by the string s in the
+    given base, which defaults to 10.  The string s must consist
+    of one or more digits, possibly preceded by a sign.  If base
+    is 0, it is chosen from the leading characters of s, 0 for
+    octal, 0x or 0X for hexadecimal.  If base is 16, a preceding
+    0x or 0X is accepted.  A trailing L or l is not accepted,
+    unless base is 0.
+
+    """
+    return _long(s, base)
+
+
+# Left-justify a string
+def ljust(s, width, *args):
+    """ljust(s, width[, fillchar]) -> string
+
+    Return a left-justified version of s, in a field of the
+    specified width, padded with spaces as needed.  The string is
+    never truncated.  If specified the fillchar is used instead of spaces.
+
+    """
+    return s.ljust(width, *args)
+
+# Right-justify a string
+def rjust(s, width, *args):
+    """rjust(s, width[, fillchar]) -> string
+
+    Return a right-justified version of s, in a field of the
+    specified width, padded with spaces as needed.  The string is
+    never truncated.  If specified the fillchar is used instead of spaces.
+
+    """
+    return s.rjust(width, *args)
+
+# Center a string
+def center(s, width, *args):
+    """center(s, width[, fillchar]) -> string
+
+    Return a center version of s, in a field of the specified
+    width. padded with spaces as needed.  The string is never
+    truncated.  If specified the fillchar is used instead of spaces.
+
+    """
+    return s.center(width, *args)
+
+# Zero-fill a number, e.g., (12, 3) --> '012' and (-3, 3) --> '-03'
+# Decadent feature: the argument may be a string or a number
+# (Use of this is deprecated; it should be a string as with ljust c.s.)
+def zfill(x, width):
+    """zfill(x, width) -> string
+
+    Pad a numeric string x with zeros on the left, to fill a field
+    of the specified width.  The string x is never truncated.
+
+    """
+    if not isinstance(x, basestring):
+        x = repr(x)
+    return x.zfill(width)
+
+# Expand tabs in a string.
+# Doesn't take non-printing chars into account, but does understand \n.
+def expandtabs(s, tabsize=8):
+    """expandtabs(s [,tabsize]) -> string
+
+    Return a copy of the string s with all tab characters replaced
+    by the appropriate number of spaces, depending on the current
+    column, and the tabsize (default 8).
+
+    """
+    return s.expandtabs(tabsize)
+
+# Character translation through look-up table.
+def translate(s, table, deletions=""):
+    """translate(s,table [,deletions]) -> string
+
+    Return a copy of the string s, where all characters occurring
+    in the optional argument deletions are removed, and the
+    remaining characters have been mapped through the given
+    translation table, which must be a string of length 256.  The
+    deletions argument is not allowed for Unicode strings.
+
+    """
+    if deletions:
+        return s.translate(table, deletions)
+    else:
+        # Add s[:0] so that if s is Unicode and table is an 8-bit string,
+        # table is converted to Unicode.  This means that table *cannot*
+        # be a dictionary -- for that feature, use u.translate() directly.
+        return s.translate(table + s[:0])
+
+# Capitalize a string, e.g. "aBc  dEf" -> "Abc  def".
+def capitalize(s):
+    """capitalize(s) -> string
+
+    Return a copy of the string s with only its first character
+    capitalized.
+
+    """
+    return s.capitalize()
+
+# Substring replacement (global)
+def replace(s, old, new, maxsplit=-1):
+    """replace (str, old, new[, maxsplit]) -> string
+
+    Return a copy of string str with all occurrences of substring
+    old replaced by new. If the optional argument maxsplit is
+    given, only the first maxsplit occurrences are replaced.
+
+    """
+    return s.replace(old, new, maxsplit)
+
+
+# Try importing optional built-in module "strop" -- if it exists,
+# it redefines some string operations that are 100-1000 times faster.
+# It also defines values for whitespace, lowercase and uppercase
+# that match <ctype.h>'s definitions.
+
+try:
+    from strop import maketrans, lowercase, uppercase, whitespace
+    letters = lowercase + uppercase
+except ImportError:
+    pass                                          # Use the original versions
Index: /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/util/subprocess24.py
===================================================================
--- /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/util/subprocess24.py (revision 3)
+++ /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/util/subprocess24.py (revision 3)
@@ -0,0 +1,1154 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+# subprocess - Subprocesses with accessible I/O streams
+#
+# For more information about this module, see PEP 324.
+#
+# This module should remain compatible with Python 2.2, see PEP 291.
+#
+# Copyright (c) 2003-2005 by Peter Astrand <astrand@lysator.liu.se>
+#
+# Licensed to PSF under a Contributor Agreement.
+# See http://www.python.org/2.4/license for licensing details.
+
+r"""subprocess - Subprocesses with accessible I/O streams
+
+This module allows you to spawn processes, connect to their
+input/output/error pipes, and obtain their return codes.  This module
+intends to replace several other, older modules and functions, like:
+
+os.system
+os.spawn*
+os.popen*
+popen2.*
+commands.*
+
+Information about how the subprocess module can be used to replace these
+modules and functions can be found below.
+
+
+
+Using the subprocess module
+===========================
+This module defines one class called Popen:
+
+class Popen(args, bufsize=0, executable=None,
+            stdin=None, stdout=None, stderr=None,
+            preexec_fn=None, close_fds=False, shell=False,
+            cwd=None, env=None, universal_newlines=False,
+            startupinfo=None, creationflags=0):
+
+
+Arguments are:
+
+args should be a string, or a sequence of program arguments.  The
+program to execute is normally the first item in the args sequence or
+string, but can be explicitly set by using the executable argument.
+
+On UNIX, with shell=False (default): In this case, the Popen class
+uses os.execvp() to execute the child program.  args should normally
+be a sequence.  A string will be treated as a sequence with the string
+as the only item (the program to execute).
+
+On UNIX, with shell=True: If args is a string, it specifies the
+command string to execute through the shell.  If args is a sequence,
+the first item specifies the command string, and any additional items
+will be treated as additional shell arguments.
+
+On Windows: the Popen class uses CreateProcess() to execute the child
+program, which operates on strings.  If args is a sequence, it will be
+converted to a string using the list2cmdline method.  Please note that
+not all MS Windows applications interpret the command line the same
+way: The list2cmdline is designed for applications using the same
+rules as the MS C runtime.
+
+bufsize, if given, has the same meaning as the corresponding argument
+to the built-in open() function: 0 means unbuffered, 1 means line
+buffered, any other positive value means use a buffer of
+(approximately) that size.  A negative bufsize means to use the system
+default, which usually means fully buffered.  The default value for
+bufsize is 0 (unbuffered).
+
+stdin, stdout and stderr specify the executed programs' standard
+input, standard output and standard error file handles, respectively.
+Valid values are PIPE, an existing file descriptor (a positive
+integer), an existing file object, and None.  PIPE indicates that a
+new pipe to the child should be created.  With None, no redirection
+will occur; the child's file handles will be inherited from the
+parent.  Additionally, stderr can be STDOUT, which indicates that the
+stderr data from the applications should be captured into the same
+file handle as for stdout.
+
+If preexec_fn is set to a callable object, this object will be called
+in the child process just before the child is executed.
+
+If close_fds is true, all file descriptors except 0, 1 and 2 will be
+closed before the child process is executed.
+
+if shell is true, the specified command will be executed through the
+shell.
+
+If cwd is not None, the current directory will be changed to cwd
+before the child is executed.
+
+If env is not None, it defines the environment variables for the new
+process.
+
+If universal_newlines is true, the file objects stdout and stderr are
+opened as a text files, but lines may be terminated by any of '\n',
+the Unix end-of-line convention, '\r', the Macintosh convention or
+'\r\n', the Windows convention.  All of these external representations
+are seen as '\n' by the Python program.  Note: This feature is only
+available if Python is built with universal newline support (the
+default).  Also, the newlines attribute of the file objects stdout,
+stdin and stderr are not updated by the communicate() method.
+
+The startupinfo and creationflags, if given, will be passed to the
+underlying CreateProcess() function.  They can specify things such as
+appearance of the main window and priority for the new process.
+(Windows only)
+
+
+This module also defines two shortcut functions:
+
+call(*args, **kwargs):
+    Run command with arguments.  Wait for command to complete, then
+    return the returncode attribute.
+
+    The arguments are the same as for the Popen constructor.  Example:
+
+    retcode = call(["ls", "-l"])
+
+
+Exceptions
+----------
+Exceptions raised in the child process, before the new program has
+started to execute, will be re-raised in the parent.  Additionally,
+the exception object will have one extra attribute called
+'child_traceback', which is a string containing traceback information
+from the childs point of view.
+
+The most common exception raised is OSError.  This occurs, for
+example, when trying to execute a non-existent file.  Applications
+should prepare for OSErrors.
+
+A ValueError will be raised if Popen is called with invalid arguments.
+
+
+Security
+--------
+Unlike some other popen functions, this implementation will never call
+/bin/sh implicitly.  This means that all characters, including shell
+metacharacters, can safely be passed to child processes.
+
+
+Popen objects
+=============
+Instances of the Popen class have the following methods:
+
+poll()
+    Check if child process has terminated.  Returns returncode
+    attribute.
+
+wait()
+    Wait for child process to terminate.  Returns returncode attribute.
+
+communicate(input=None)
+    Interact with process: Send data to stdin.  Read data from stdout
+    and stderr, until end-of-file is reached.  Wait for process to
+    terminate.  The optional stdin argument should be a string to be
+    sent to the child process, or None, if no data should be sent to
+    the child.
+
+    communicate() returns a tuple (stdout, stderr).
+
+    Note: The data read is buffered in memory, so do not use this
+    method if the data size is large or unlimited.
+
+The following attributes are also available:
+
+stdin
+    If the stdin argument is PIPE, this attribute is a file object
+    that provides input to the child process.  Otherwise, it is None.
+
+stdout
+    If the stdout argument is PIPE, this attribute is a file object
+    that provides output from the child process.  Otherwise, it is
+    None.
+
+stderr
+    If the stderr argument is PIPE, this attribute is file object that
+    provides error output from the child process.  Otherwise, it is
+    None.
+
+pid
+    The process ID of the child process.
+
+returncode
+    The child return code.  A None value indicates that the process
+    hasn't terminated yet.  A negative value -N indicates that the
+    child was terminated by signal N (UNIX only).
+
+
+Replacing older functions with the subprocess module
+====================================================
+In this section, "a ==> b" means that b can be used as a replacement
+for a.
+
+Note: All functions in this section fail (more or less) silently if
+the executed program cannot be found; this module raises an OSError
+exception.
+
+In the following examples, we assume that the subprocess module is
+imported with "from subprocess import *".
+
+
+Replacing /bin/sh shell backquote
+---------------------------------
+output=`mycmd myarg`
+==>
+output = Popen(["mycmd", "myarg"], stdout=PIPE).communicate()[0]
+
+
+Replacing shell pipe line
+-------------------------
+output=`dmesg | grep hda`
+==>
+p1 = Popen(["dmesg"], stdout=PIPE)
+p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
+output = p2.communicate()[0]
+
+
+Replacing os.system()
+---------------------
+sts = os.system("mycmd" + " myarg")
+==>
+p = Popen("mycmd" + " myarg", shell=True)
+sts = os.waitpid(p.pid, 0)
+
+Note:
+
+* Calling the program through the shell is usually not required.
+
+* It's easier to look at the returncode attribute than the
+  exitstatus.
+
+A more real-world example would look like this:
+
+try:
+    retcode = call("mycmd" + " myarg", shell=True)
+    if retcode < 0:
+        print >>sys.stderr, "Child was terminated by signal", -retcode
+    else:
+        print >>sys.stderr, "Child returned", retcode
+except OSError, e:
+    print >>sys.stderr, "Execution failed:", e
+
+
+Replacing os.spawn*
+-------------------
+P_NOWAIT example:
+
+pid = os.spawnlp(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg")
+==>
+pid = Popen(["/bin/mycmd", "myarg"]).pid
+
+
+P_WAIT example:
+
+retcode = os.spawnlp(os.P_WAIT, "/bin/mycmd", "mycmd", "myarg")
+==>
+retcode = call(["/bin/mycmd", "myarg"])
+
+
+Vector example:
+
+os.spawnvp(os.P_NOWAIT, path, args)
+==>
+Popen([path] + args[1:])
+
+
+Environment example:
+
+os.spawnlpe(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg", env)
+==>
+Popen(["/bin/mycmd", "myarg"], env={"PATH": "/usr/bin"})
+
+
+Replacing os.popen*
+-------------------
+pipe = os.popen(cmd, mode='r', bufsize)
+==>
+pipe = Popen(cmd, shell=True, bufsize=bufsize, stdout=PIPE).stdout
+
+pipe = os.popen(cmd, mode='w', bufsize)
+==>
+pipe = Popen(cmd, shell=True, bufsize=bufsize, stdin=PIPE).stdin
+
+
+(child_stdin, child_stdout) = os.popen2(cmd, mode, bufsize)
+==>
+p = Popen(cmd, shell=True, bufsize=bufsize,
+          stdin=PIPE, stdout=PIPE, close_fds=True)
+(child_stdin, child_stdout) = (p.stdin, p.stdout)
+
+
+(child_stdin,
+ child_stdout,
+ child_stderr) = os.popen3(cmd, mode, bufsize)
+==>
+p = Popen(cmd, shell=True, bufsize=bufsize,
+          stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True)
+(child_stdin,
+ child_stdout,
+ child_stderr) = (p.stdin, p.stdout, p.stderr)
+
+
+(child_stdin, child_stdout_and_stderr) = os.popen4(cmd, mode, bufsize)
+==>
+p = Popen(cmd, shell=True, bufsize=bufsize,
+          stdin=PIPE, stdout=PIPE, stderr=STDOUT, close_fds=True)
+(child_stdin, child_stdout_and_stderr) = (p.stdin, p.stdout)
+
+
+Replacing popen2.*
+------------------
+Note: If the cmd argument to popen2 functions is a string, the command
+is executed through /bin/sh.  If it is a list, the command is directly
+executed.
+
+(child_stdout, child_stdin) = popen2.popen2("somestring", bufsize, mode)
+==>
+p = Popen(["somestring"], shell=True, bufsize=bufsize
+          stdin=PIPE, stdout=PIPE, close_fds=True)
+(child_stdout, child_stdin) = (p.stdout, p.stdin)
+
+
+(child_stdout, child_stdin) = popen2.popen2(["mycmd", "myarg"], bufsize, mode)
+==>
+p = Popen(["mycmd", "myarg"], bufsize=bufsize,
+          stdin=PIPE, stdout=PIPE, close_fds=True)
+(child_stdout, child_stdin) = (p.stdout, p.stdin)
+
+The popen2.Popen3 and popen3.Popen4 basically works as subprocess.Popen,
+except that:
+
+* subprocess.Popen raises an exception if the execution fails
+* the capturestderr argument is replaced with the stderr argument.
+* stdin=PIPE and stdout=PIPE must be specified.
+* popen2 closes all filedescriptors by default, but you have to specify
+  close_fds=True with subprocess.Popen.
+
+
+"""
+
+import sys
+mswindows = (sys.platform == "win32")
+
+import os
+import types
+import traceback
+
+if mswindows:
+    import threading
+    import msvcrt
+    if 0: # <-- change this to use pywin32 instead of the _subprocess driver
+        import pywintypes
+        from win32api import GetStdHandle, STD_INPUT_HANDLE, \
+                             STD_OUTPUT_HANDLE, STD_ERROR_HANDLE
+        from win32api import GetCurrentProcess, DuplicateHandle, \
+                             GetModuleFileName, GetVersion
+        from win32con import DUPLICATE_SAME_ACCESS, SW_HIDE
+        from win32pipe import CreatePipe
+        from win32process import CreateProcess, STARTUPINFO, \
+                                 GetExitCodeProcess, STARTF_USESTDHANDLES, \
+                                 STARTF_USESHOWWINDOW, CREATE_NEW_CONSOLE
+        from win32event import WaitForSingleObject, INFINITE, WAIT_OBJECT_0
+    else:
+        raise ImportError(
+            "Windows subprocess module must be installed: see "
+            "http://effbot.org/downloads/#subprocess")
+        from _subprocess import *
+        class STARTUPINFO:
+            dwFlags = 0
+            hStdInput = None
+            hStdOutput = None
+            hStdError = None
+        class pywintypes:
+            error = IOError
+else:
+    import select
+    import errno
+    import fcntl
+    import pickle
+
+__all__ = ["Popen", "PIPE", "STDOUT", "call"]
+
+try:
+    MAXFD = os.sysconf("SC_OPEN_MAX")
+except:
+    MAXFD = 256
+
+# True/False does not exist on 2.2.0
+try:
+    False
+except NameError:
+    False = 0
+    True = 1
+
+_active = []
+
+def _cleanup():
+    for inst in _active[:]:
+        inst.poll()
+
+PIPE = -1
+STDOUT = -2
+
+
+def call(*args, **kwargs):
+    """Run command with arguments.  Wait for command to complete, then
+    return the returncode attribute.
+
+    The arguments are the same as for the Popen constructor.  Example:
+
+    retcode = call(["ls", "-l"])
+    """
+    return Popen(*args, **kwargs).wait()
+
+
+def list2cmdline(seq):
+    """
+    Translate a sequence of arguments into a command line
+    string, using the same rules as the MS C runtime:
+
+    1) Arguments are delimited by white space, which is either a
+       space or a tab.
+
+    2) A string surrounded by double quotation marks is
+       interpreted as a single argument, regardless of white space
+       contained within.  A quoted string can be embedded in an
+       argument.
+
+    3) A double quotation mark preceded by a backslash is
+       interpreted as a literal double quotation mark.
+
+    4) Backslashes are interpreted literally, unless they
+       immediately precede a double quotation mark.
+
+    5) If backslashes immediately precede a double quotation mark,
+       every pair of backslashes is interpreted as a literal
+       backslash.  If the number of backslashes is odd, the last
+       backslash escapes the next double quotation mark as
+       described in rule 3.
+    """
+
+    # See
+    # http://msdn.microsoft.com/library/en-us/vccelng/htm/progs_12.asp
+    result = []
+    needquote = False
+    for arg in seq:
+        bs_buf = []
+
+        # Add a space to separate this argument from the others
+        if result:
+            result.append(' ')
+
+        needquote = (" " in arg) or ("\t" in arg)
+        if needquote:
+            result.append('"')
+
+        for c in arg:
+            if c == '\\':
+                # Don't know if we need to double yet.
+                bs_buf.append(c)
+            elif c == '"':
+                # Double backspaces.
+                result.append('\\' * len(bs_buf)*2)
+                bs_buf = []
+                result.append('\\"')
+            else:
+                # Normal char
+                if bs_buf:
+                    result.extend(bs_buf)
+                    bs_buf = []
+                result.append(c)
+
+        # Add remaining backspaces, if any.
+        if bs_buf:
+            result.extend(bs_buf)
+
+        if needquote:
+            result.extend(bs_buf)
+            result.append('"')
+
+    return ''.join(result)
+
+
+class Popen(object):
+    def __init__(self, args, bufsize=0, executable=None,
+                 stdin=None, stdout=None, stderr=None,
+                 preexec_fn=None, close_fds=False, shell=False,
+                 cwd=None, env=None, universal_newlines=False,
+                 startupinfo=None, creationflags=0):
+        """Create new Popen instance."""
+        _cleanup()
+
+        if not isinstance(bufsize, (int, long)):
+            raise TypeError("bufsize must be an integer")
+
+        if mswindows:
+            if preexec_fn is not None:
+                raise ValueError("preexec_fn is not supported on Windows "
+                                 "platforms")
+            if close_fds:
+                raise ValueError("close_fds is not supported on Windows "
+                                 "platforms")
+        else:
+            # POSIX
+            if startupinfo is not None:
+                raise ValueError("startupinfo is only supported on Windows "
+                                 "platforms")
+            if creationflags != 0:
+                raise ValueError("creationflags is only supported on Windows "
+                                 "platforms")
+
+        self.stdin = None
+        self.stdout = None
+        self.stderr = None
+        self.pid = None
+        self.returncode = None
+        self.universal_newlines = universal_newlines
+
+        # Input and output objects. The general principle is like
+        # this:
+        #
+        # Parent                   Child
+        # ------                   -----
+        # p2cwrite   ---stdin--->  p2cread
+        # c2pread    <--stdout---  c2pwrite
+        # errread    <--stderr---  errwrite
+        #
+        # On POSIX, the child objects are file descriptors.  On
+        # Windows, these are Windows file handles.  The parent objects
+        # are file descriptors on both platforms.  The parent objects
+        # are None when not using PIPEs. The child objects are None
+        # when not redirecting.
+
+        (p2cread, p2cwrite,
+         c2pread, c2pwrite,
+         errread, errwrite) = self._get_handles(stdin, stdout, stderr)
+
+        self._execute_child(args, executable, preexec_fn, close_fds,
+                            cwd, env, universal_newlines,
+                            startupinfo, creationflags, shell,
+                            p2cread, p2cwrite,
+                            c2pread, c2pwrite,
+                            errread, errwrite)
+
+        if p2cwrite:
+            self.stdin = os.fdopen(p2cwrite, 'wb', bufsize)
+        if c2pread:
+            if universal_newlines:
+                self.stdout = os.fdopen(c2pread, 'rU', bufsize)
+            else:
+                self.stdout = os.fdopen(c2pread, 'rb', bufsize)
+        if errread:
+            if universal_newlines:
+                self.stderr = os.fdopen(errread, 'rU', bufsize)
+            else:
+                self.stderr = os.fdopen(errread, 'rb', bufsize)
+
+        _active.append(self)
+
+
+    def _translate_newlines(self, data):
+        data = data.replace("\r\n", "\n")
+        data = data.replace("\r", "\n")
+        return data
+
+
+    if mswindows:
+        #
+        # Windows methods
+        #
+        def _get_handles(self, stdin, stdout, stderr):
+            """Construct and return tupel with IO objects:
+            p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite
+            """
+            if stdin == None and stdout == None and stderr == None:
+                return (None, None, None, None, None, None)
+
+            p2cread, p2cwrite = None, None
+            c2pread, c2pwrite = None, None
+            errread, errwrite = None, None
+
+            if stdin == None:
+                p2cread = GetStdHandle(STD_INPUT_HANDLE)
+            elif stdin == PIPE:
+                p2cread, p2cwrite = CreatePipe(None, 0)
+                # Detach and turn into fd
+                p2cwrite = p2cwrite.Detach()
+                p2cwrite = msvcrt.open_osfhandle(p2cwrite, 0)
+            elif type(stdin) == types.IntType:
+                p2cread = msvcrt.get_osfhandle(stdin)
+            else:
+                # Assuming file-like object
+                p2cread = msvcrt.get_osfhandle(stdin.fileno())
+            p2cread = self._make_inheritable(p2cread)
+
+            if stdout == None:
+                c2pwrite = GetStdHandle(STD_OUTPUT_HANDLE)
+            elif stdout == PIPE:
+                c2pread, c2pwrite = CreatePipe(None, 0)
+                # Detach and turn into fd
+                c2pread = c2pread.Detach()
+                c2pread = msvcrt.open_osfhandle(c2pread, 0)
+            elif type(stdout) == types.IntType:
+                c2pwrite = msvcrt.get_osfhandle(stdout)
+            else:
+                # Assuming file-like object
+                c2pwrite = msvcrt.get_osfhandle(stdout.fileno())
+            c2pwrite = self._make_inheritable(c2pwrite)
+
+            if stderr == None:
+                errwrite = GetStdHandle(STD_ERROR_HANDLE)
+            elif stderr == PIPE:
+                errread, errwrite = CreatePipe(None, 0)
+                # Detach and turn into fd
+                errread = errread.Detach()
+                errread = msvcrt.open_osfhandle(errread, 0)
+            elif stderr == STDOUT:
+                errwrite = c2pwrite
+            elif type(stderr) == types.IntType:
+                errwrite = msvcrt.get_osfhandle(stderr)
+            else:
+                # Assuming file-like object
+                errwrite = msvcrt.get_osfhandle(stderr.fileno())
+            errwrite = self._make_inheritable(errwrite)
+
+            return (p2cread, p2cwrite,
+                    c2pread, c2pwrite,
+                    errread, errwrite)
+
+
+        def _make_inheritable(self, handle):
+            """Return a duplicate of handle, which is inheritable"""
+            return DuplicateHandle(GetCurrentProcess(), handle,
+                                   GetCurrentProcess(), 0, 1,
+                                   DUPLICATE_SAME_ACCESS)
+
+
+        def _find_w9xpopen(self):
+            """Find and return absolut path to w9xpopen.exe"""
+            w9xpopen = os.path.join(os.path.dirname(GetModuleFileName(0)),
+                                    "w9xpopen.exe")
+            if not os.path.exists(w9xpopen):
+                # Eeek - file-not-found - possibly an embedding
+                # situation - see if we can locate it in sys.exec_prefix
+                w9xpopen = os.path.join(os.path.dirname(sys.exec_prefix),
+                                        "w9xpopen.exe")
+                if not os.path.exists(w9xpopen):
+                    raise RuntimeError("Cannot locate w9xpopen.exe, which is "
+                                       "needed for Popen to work with your "
+                                       "shell or platform.")
+            return w9xpopen
+
+
+        def _execute_child(self, args, executable, preexec_fn, close_fds,
+                           cwd, env, universal_newlines,
+                           startupinfo, creationflags, shell,
+                           p2cread, p2cwrite,
+                           c2pread, c2pwrite,
+                           errread, errwrite):
+            """Execute program (MS Windows version)"""
+
+            if not isinstance(args, types.StringTypes):
+                args = list2cmdline(args)
+
+            # Process startup details
+            default_startupinfo = STARTUPINFO()
+            if startupinfo == None:
+                startupinfo = default_startupinfo
+            if not None in (p2cread, c2pwrite, errwrite):
+                startupinfo.dwFlags |= STARTF_USESTDHANDLES
+                startupinfo.hStdInput = p2cread
+                startupinfo.hStdOutput = c2pwrite
+                startupinfo.hStdError = errwrite
+
+            if shell:
+                default_startupinfo.dwFlags |= STARTF_USESHOWWINDOW
+                default_startupinfo.wShowWindow = SW_HIDE
+                comspec = os.environ.get("COMSPEC", "cmd.exe")
+                args = comspec + " /c " + args
+                if (GetVersion() >= 0x80000000L or
+                        os.path.basename(comspec).lower() == "command.com"):
+                    # Win9x, or using command.com on NT. We need to
+                    # use the w9xpopen intermediate program. For more
+                    # information, see KB Q150956
+                    # (http://web.archive.org/web/20011105084002/http://support.microsoft.com/support/kb/articles/Q150/9/56.asp)
+                    w9xpopen = self._find_w9xpopen()
+                    args = '"%s" %s' % (w9xpopen, args)
+                    # Not passing CREATE_NEW_CONSOLE has been known to
+                    # cause random failures on win9x.  Specifically a
+                    # dialog: "Your program accessed mem currently in
+                    # use at xxx" and a hopeful warning about the
+                    # stability of your system.  Cost is Ctrl+C wont
+                    # kill children.
+                    creationflags |= CREATE_NEW_CONSOLE
+
+            # Start the process
+            try:
+                hp, ht, pid, tid = CreateProcess(executable, args,
+                                         # no special security
+                                         None, None,
+                                         # must inherit handles to pass std
+                                         # handles
+                                         1,
+                                         creationflags,
+                                         env,
+                                         cwd,
+                                         startupinfo)
+            except pywintypes.error, e:
+                # Translate pywintypes.error to WindowsError, which is
+                # a subclass of OSError.  FIXME: We should really
+                # translate errno using _sys_errlist (or simliar), but
+                # how can this be done from Python?
+                raise WindowsError(*e.args)
+
+            # Retain the process handle, but close the thread handle
+            self._handle = hp
+            self.pid = pid
+            ht.Close()
+
+            # Child is launched. Close the parent's copy of those pipe
+            # handles that only the child should have open.  You need
+            # to make sure that no handles to the write end of the
+            # output pipe are maintained in this process or else the
+            # pipe will not close when the child process exits and the
+            # ReadFile will hang.
+            if p2cread != None:
+                p2cread.Close()
+            if c2pwrite != None:
+                c2pwrite.Close()
+            if errwrite != None:
+                errwrite.Close()
+
+
+        def poll(self):
+            """Check if child process has terminated.  Returns returncode
+            attribute."""
+            if self.returncode == None:
+                if WaitForSingleObject(self._handle, 0) == WAIT_OBJECT_0:
+                    self.returncode = GetExitCodeProcess(self._handle)
+                    _active.remove(self)
+            return self.returncode
+
+
+        def wait(self):
+            """Wait for child process to terminate.  Returns returncode
+            attribute."""
+            if self.returncode == None:
+                obj = WaitForSingleObject(self._handle, INFINITE)
+                self.returncode = GetExitCodeProcess(self._handle)
+                _active.remove(self)
+            return self.returncode
+
+
+        def _readerthread(self, fh, buffer):
+            buffer.append(fh.read())
+
+
+        def communicate(self, input=None):
+            """Interact with process: Send data to stdin.  Read data from
+            stdout and stderr, until end-of-file is reached.  Wait for
+            process to terminate.  The optional input argument should be a
+            string to be sent to the child process, or None, if no data
+            should be sent to the child.
+
+            communicate() returns a tuple (stdout, stderr)."""
+            stdout = None # Return
+            stderr = None # Return
+
+            if self.stdout:
+                stdout = []
+                stdout_thread = threading.Thread(target=self._readerthread,
+                                                 args=(self.stdout, stdout))
+                stdout_thread.setDaemon(True)
+                stdout_thread.start()
+            if self.stderr:
+                stderr = []
+                stderr_thread = threading.Thread(target=self._readerthread,
+                                                 args=(self.stderr, stderr))
+                stderr_thread.setDaemon(True)
+                stderr_thread.start()
+
+            if self.stdin:
+                if input != None:
+                    self.stdin.write(input)
+                self.stdin.close()
+
+            if self.stdout:
+                stdout_thread.join()
+            if self.stderr:
+                stderr_thread.join()
+
+            # All data exchanged.  Translate lists into strings.
+            if stdout != None:
+                stdout = stdout[0]
+            if stderr != None:
+                stderr = stderr[0]
+
+            # Translate newlines, if requested.  We cannot let the file
+            # object do the translation: It is based on stdio, which is
+            # impossible to combine with select (unless forcing no
+            # buffering).
+            if self.universal_newlines and hasattr(open, 'newlines'):
+                if stdout:
+                    stdout = self._translate_newlines(stdout)
+                if stderr:
+                    stderr = self._translate_newlines(stderr)
+
+            self.wait()
+            return (stdout, stderr)
+
+    else:
+        #
+        # POSIX methods
+        #
+        def _get_handles(self, stdin, stdout, stderr):
+            """Construct and return tupel with IO objects:
+            p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite
+            """
+            p2cread, p2cwrite = None, None
+            c2pread, c2pwrite = None, None
+            errread, errwrite = None, None
+
+            if stdin == None:
+                pass
+            elif stdin == PIPE:
+                p2cread, p2cwrite = os.pipe()
+            elif type(stdin) == types.IntType:
+                p2cread = stdin
+            else:
+                # Assuming file-like object
+                p2cread = stdin.fileno()
+
+            if stdout == None:
+                pass
+            elif stdout == PIPE:
+                c2pread, c2pwrite = os.pipe()
+            elif type(stdout) == types.IntType:
+                c2pwrite = stdout
+            else:
+                # Assuming file-like object
+                c2pwrite = stdout.fileno()
+
+            if stderr == None:
+                pass
+            elif stderr == PIPE:
+                errread, errwrite = os.pipe()
+            elif stderr == STDOUT:
+                errwrite = c2pwrite
+            elif type(stderr) == types.IntType:
+                errwrite = stderr
+            else:
+                # Assuming file-like object
+                errwrite = stderr.fileno()
+
+            return (p2cread, p2cwrite,
+                    c2pread, c2pwrite,
+                    errread, errwrite)
+
+
+        def _set_cloexec_flag(self, fd):
+            try:
+                cloexec_flag = fcntl.FD_CLOEXEC
+            except AttributeError:
+                cloexec_flag = 1
+
+            old = fcntl.fcntl(fd, fcntl.F_GETFD)
+            fcntl.fcntl(fd, fcntl.F_SETFD, old | cloexec_flag)
+
+
+        def _close_fds(self, but):
+            for i in range(3, MAXFD):
+                if i == but:
+                    continue
+                try:
+                    os.close(i)
+                except:
+                    pass
+
+
+        def _execute_child(self, args, executable, preexec_fn, close_fds,
+                           cwd, env, universal_newlines,
+                           startupinfo, creationflags, shell,
+                           p2cread, p2cwrite,
+                           c2pread, c2pwrite,
+                           errread, errwrite):
+            """Execute program (POSIX version)"""
+
+            if isinstance(args, types.StringTypes):
+                args = [args]
+
+            if shell:
+                args = ["/bin/sh", "-c"] + args
+
+            if executable == None:
+                executable = args[0]
+
+            # For transferring possible exec failure from child to parent
+            # The first char specifies the exception type: 0 means
+            # OSError, 1 means some other error.
+            errpipe_read, errpipe_write = os.pipe()
+            self._set_cloexec_flag(errpipe_write)
+
+            self.pid = os.fork()
+            if self.pid == 0:
+                # Child
+                try:
+                    # Close parent's pipe ends
+                    if p2cwrite:
+                        os.close(p2cwrite)
+                    if c2pread:
+                        os.close(c2pread)
+                    if errread:
+                        os.close(errread)
+                    os.close(errpipe_read)
+
+                    # Dup fds for child
+                    if p2cread:
+                        os.dup2(p2cread, 0)
+                    if c2pwrite:
+                        os.dup2(c2pwrite, 1)
+                    if errwrite:
+                        os.dup2(errwrite, 2)
+
+                    # Close pipe fds.  Make sure we doesn't close the same
+                    # fd more than once.
+                    if p2cread:
+                        os.close(p2cread)
+                    if c2pwrite and c2pwrite not in (p2cread,):
+                        os.close(c2pwrite)
+                    if errwrite and errwrite not in (p2cread, c2pwrite):
+                        os.close(errwrite)
+
+                    # Close all other fds, if asked for
+                    if close_fds:
+                        self._close_fds(but=errpipe_write)
+
+                    if cwd != None:
+                        os.chdir(cwd)
+
+                    if preexec_fn:
+                        apply(preexec_fn)
+
+                    if env == None:
+                        os.execvp(executable, args)
+                    else:
+                        os.execvpe(executable, args, env)
+
+                except:
+                    exc_type, exc_value, tb = sys.exc_info()
+                    # Save the traceback and attach it to the exception object
+                    exc_lines = traceback.format_exception(exc_type,
+                                                           exc_value,
+                                                           tb)
+                    exc_value.child_traceback = ''.join(exc_lines)
+                    os.write(errpipe_write, pickle.dumps(exc_value))
+
+                # This exitcode won't be reported to applications, so it
+                # really doesn't matter what we return.
+                os._exit(255)
+
+            # Parent
+            os.close(errpipe_write)
+            if p2cread and p2cwrite:
+                os.close(p2cread)
+            if c2pwrite and c2pread:
+                os.close(c2pwrite)
+            if errwrite and errread:
+                os.close(errwrite)
+
+            # Wait for exec to fail or succeed; possibly raising exception
+            data = os.read(errpipe_read, 1048576) # Exceptions limited to 1 MB
+            os.close(errpipe_read)
+            if data != "":
+                os.waitpid(self.pid, 0)
+                child_exception = pickle.loads(data)
+                raise child_exception
+
+
+        def _handle_exitstatus(self, sts):
+            if os.WIFSIGNALED(sts):
+                self.returncode = -os.WTERMSIG(sts)
+            elif os.WIFEXITED(sts):
+                self.returncode = os.WEXITSTATUS(sts)
+            else:
+                # Should never happen
+                raise RuntimeError("Unknown child exit status!")
+
+            _active.remove(self)
+
+
+        def poll(self):
+            """Check if child process has terminated.  Returns returncode
+            attribute."""
+            if self.returncode == None:
+                try:
+                    pid, sts = os.waitpid(self.pid, os.WNOHANG)
+                    if pid == self.pid:
+                        self._handle_exitstatus(sts)
+                except os.error:
+                    pass
+            return self.returncode
+
+
+        def wait(self):
+            """Wait for child process to terminate.  Returns returncode
+            attribute."""
+            if self.returncode == None:
+                pid, sts = os.waitpid(self.pid, 0)
+                self._handle_exitstatus(sts)
+            return self.returncode
+
+
+        def communicate(self, input=None):
+            """Interact with process: Send data to stdin.  Read data from
+            stdout and stderr, until end-of-file is reached.  Wait for
+            process to terminate.  The optional input argument should be a
+            string to be sent to the child process, or None, if no data
+            should be sent to the child.
+
+            communicate() returns a tuple (stdout, stderr)."""
+            read_set = []
+            write_set = []
+            stdout = None # Return
+            stderr = None # Return
+
+            if self.stdin:
+                # Flush stdio buffer.  This might block, if the user has
+                # been writing to .stdin in an uncontrolled fashion.
+                self.stdin.flush()
+                if input:
+                    write_set.append(self.stdin)
+                else:
+                    self.stdin.close()
+            if self.stdout:
+                read_set.append(self.stdout)
+                stdout = []
+            if self.stderr:
+                read_set.append(self.stderr)
+                stderr = []
+
+            while read_set or write_set:
+                rlist, wlist, xlist = select.select(read_set, write_set, [])
+
+                if self.stdin in wlist:
+                    # When select has indicated that the file is writable,
+                    # we can write up to PIPE_BUF bytes without risk
+                    # blocking.  POSIX defines PIPE_BUF >= 512
+                    bytes_written = os.write(self.stdin.fileno(), input[:512])
+                    input = input[bytes_written:]
+                    if not input:
+                        self.stdin.close()
+                        write_set.remove(self.stdin)
+
+                if self.stdout in rlist:
+                    data = os.read(self.stdout.fileno(), 1024)
+                    if data == "":
+                        self.stdout.close()
+                        read_set.remove(self.stdout)
+                    stdout.append(data)
+
+                if self.stderr in rlist:
+                    data = os.read(self.stderr.fileno(), 1024)
+                    if data == "":
+                        self.stderr.close()
+                        read_set.remove(self.stderr)
+                    stderr.append(data)
+
+            # All data exchanged.  Translate lists into strings.
+            if stdout != None:
+                stdout = ''.join(stdout)
+            if stderr != None:
+                stderr = ''.join(stderr)
+
+            # Translate newlines, if requested.  We cannot let the file
+            # object do the translation: It is based on stdio, which is
+            # impossible to combine with select (unless forcing no
+            # buffering).
+            if self.universal_newlines and hasattr(open, 'newlines'):
+                if stdout:
+                    stdout = self._translate_newlines(stdout)
+                if stderr:
+                    stderr = self._translate_newlines(stderr)
+
+            self.wait()
+            return (stdout, stderr)
+
+
+def _demo_posix():
+    #
+    # Example 1: Simple redirection: Get process list
+    #
+    plist = Popen(["ps"], stdout=PIPE).communicate()[0]
+    print "Process list:"
+    print plist
+
+    #
+    # Example 2: Change uid before executing child
+    #
+    if os.getuid() == 0:
+        p = Popen(["id"], preexec_fn=lambda: os.setuid(100))
+        p.wait()
+
+    #
+    # Example 3: Connecting several subprocesses
+    #
+    print "Looking for 'hda'..."
+    p1 = Popen(["dmesg"], stdout=PIPE)
+    p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
+    print repr(p2.communicate()[0])
+
+    #
+    # Example 4: Catch execution error
+    #
+    print
+    print "Trying a weird file..."
+    try:
+        print Popen(["/this/path/does/not/exist"]).communicate()
+    except OSError, e:
+        if e.errno == errno.ENOENT:
+            print "The file didn't exist.  I thought so..."
+            print "Child traceback:"
+            print e.child_traceback
+        else:
+            print "Error", e.errno
+    else:
+        print >>sys.stderr, "Gosh.  No error."
+
+
+def _demo_windows():
+    #
+    # Example 1: Connecting several subprocesses
+    #
+    print "Looking for 'PROMPT' in set output..."
+    p1 = Popen("set", stdout=PIPE, shell=True)
+    p2 = Popen('find "PROMPT"', stdin=p1.stdout, stdout=PIPE)
+    print repr(p2.communicate()[0])
+
+    #
+    # Example 2: Simple execution of program
+    #
+    print "Executing calc..."
+    p = Popen("calc")
+    p.wait()
+
+
+if __name__ == "__main__":
+    if mswindows:
+        _demo_windows()
+    else:
+        _demo_posix()
Index: /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/util/__init__.py
===================================================================
--- /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/util/__init__.py (revision 3)
+++ /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/util/__init__.py (revision 3)
@@ -0,0 +1,3 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+#
Index: /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/util/secret.py
===================================================================
--- /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/util/secret.py (revision 3)
+++ /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/util/secret.py (revision 3)
@@ -0,0 +1,32 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+"""
+Create random secrets.
+"""
+
+import os
+import random
+
+def random_bytes(length):
+    """
+    Return a string of the given length.  Uses ``os.urandom`` if it
+    can, or just pseudo-random numbers otherwise.
+    """
+    try:
+        return os.urandom(length)
+    except AttributeError:
+        return ''.join([
+            chr(random.randrange(256)) for i in xrange(length)])
+
+def secret_string(length=25):
+    """
+    Returns a random string of the given length.  The string
+    is a base64-encoded version of a set of random bytes, truncated
+    to the given length (and without any newlines).
+    """
+    s = random_bytes(length).encode('base64')
+    for badchar in '\n\r=':
+        s = s.replace(badchar, '')
+    # We're wasting some characters here.  But random characters are
+    # cheap ;)
+    return s[:length]
Index: /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/util/uuid.py
===================================================================
--- /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/util/uuid.py (revision 3)
+++ /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/util/uuid.py (revision 3)
@@ -0,0 +1,240 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+"""UUID (universally unique identifiers) as specified in RFC 4122.
+
+This module provides the UUID class and the functions uuid1(), uuid3(),
+uuid4(), uuid5() for generating version 1, 3, 4, and 5 UUIDs respectively.
+
+This module works with Python 2.3 or higher."""
+
+__author__ = 'Ka-Ping Yee <ping@zesty.ca>'
+__date__ = '$Date: 2005/11/30 11:51:58 $'.split()[1].replace('/', '-')
+__version__ = '$Revision: 1.10 $'
+
+RESERVED_NCS, RFC_4122, RESERVED_MICROSOFT, RESERVED_FUTURE = [
+    'reserved for NCS compatibility', 'specified in RFC 4122',
+    'reserved for Microsoft compatibility', 'reserved for future definition']
+
+class UUID(object):
+    """Instances of the UUID class represent UUIDs as specified in RFC 4122.
+    Converting a UUID to a string using str() produces a string in the form
+    "{12345678-1234-1234-1234-123456789abc}".  The UUID constructor accepts
+    a similar string (braces and hyphens optional), or six integer arguments
+    (with 32-bit, 16-bit, 16-bit, 8-bit, 8-bit, and 48-bit values
+    respectively).  UUID objects have the following attributes:
+
+        bytes       gets or sets the UUID as a 16-byte string
+
+        urn         gets the UUID as a URN as specified in RFC 4122
+
+        variant     gets or sets the UUID variant as one of the constants
+                    RESERVED_NCS, RFC_4122, RESERVED_MICROSOFT, RESERVED_FUTURE
+
+        version     gets or sets the UUID version number (1 through 5)
+    """
+
+    def __init__(self, *args):
+        """Create a UUID either from a string representation in hexadecimal
+        or from six integers (32-bit time_low, 16-bit time_mid, 16-bit
+        time_hi_ver, 8-bit clock_hi_res, 8-bit clock_low, 48-bit node)."""
+        if len(args) == 1:
+            digits = args[0].replace('urn:', '').replace('uuid:', '')
+            digits = digits.replace('{', '').replace('}', '').replace('-', '')
+            assert len(digits) == 32, ValueError('badly formed UUID string')
+            time_low = int(digits[:8], 16)
+            time_mid = int(digits[8:12], 16)
+            time_hi_ver = int(digits[12:16], 16)
+            clock_hi_res = int(digits[16:18], 16)
+            clock_low = int(digits[18:20], 16)
+            node = int(digits[20:32], 16)
+        else:
+            (time_low, time_mid, time_hi_ver,
+             clock_hi_res, clock_low, node) = args
+        assert 0 <= time_low < 0x100000000, ValueError('time_low out of range')
+        assert 0 <= time_mid < 1<<16, ValueError('time_mid out of range')
+        assert 0 <= time_hi_ver < 1<<16, ValueError('time_hi_ver out of range')
+        assert 0 <= clock_hi_res < 1<<8, ValueError('clock_hi_res out of range')
+        assert 0 <= clock_low < 1<<8, ValueError('clock_low out of range')
+        assert 0 <= node < 0x1000000000000, ValueError('node out of range')
+        self.time_low = time_low
+        self.time_mid = time_mid
+        self.time_hi_ver = time_hi_ver
+        self.clock_hi_res = clock_hi_res
+        self.clock_low = clock_low
+        self.node = node
+
+    def __cmp__(self, other):
+        return cmp(self.bytes, getattr(other, 'bytes', other))
+
+    def __str__(self):
+        return '{%08x-%04x-%04x-%02x%02x-%012x}' % (
+            self.time_low, self.time_mid, self.time_hi_ver,
+            self.clock_hi_res, self.clock_low, self.node)
+
+    def __repr__(self):
+        return 'UUID(%r)' % str(self)
+
+    def get_bytes(self):
+        def byte(n):
+            return chr(n & 0xff)
+
+        return (byte(self.time_low >> 24) + byte(self.time_low >> 16) +
+                byte(self.time_low >> 8) + byte(self.time_low) +
+                byte(self.time_mid >> 8) + byte(self.time_mid) +
+                byte(self.time_hi_ver >> 8) + byte(self.time_hi_ver) +
+                byte(self.clock_hi_res) + byte(self.clock_low) +
+                byte(self.node >> 40) + byte(self.node >> 32) +
+                byte(self.node >> 24) + byte(self.node >> 16) +
+                byte(self.node >> 8) + byte(self.node))
+
+    def set_bytes(self, bytes):
+        values = map(ord, bytes)
+        self.time_low = ((values[0] << 24) + (values[1] << 16) +
+                         (values[2] << 8) + values[3])
+        self.time_mid = (values[4] << 8) + values[5]
+        self.time_hi_ver = (values[6] << 8) + values[7]
+        self.clock_hi_res = values[8]
+        self.clock_low = values[9]
+        self.node = ((values[10] << 40) + (values[11] << 32) +
+                     (values[12] << 24) + (values[13] << 16) +
+                     (values[14] << 8) + values[15])
+
+    bytes = property(get_bytes, set_bytes)
+
+    def get_urn(self):
+        return 'urn:uuid:%08x-%04x-%04x-%02x%02x-%012x' % (
+            self.time_low, self.time_mid, self.time_hi_ver,
+            self.clock_hi_res, self.clock_low, self.node)
+
+    urn = property(get_urn)
+
+    def get_variant(self):
+        if not self.clock_hi_res & 0x80:
+            return RESERVED_NCS
+        elif not self.clock_hi_res & 0x40:
+            return RFC_4122
+        elif not self.clock_hi_res & 0x20:
+            return RESERVED_MICROSOFT
+        else:
+            return RESERVED_FUTURE
+
+    def set_variant(self, variant):
+        if variant == RESERVED_NCS:
+            self.clock_hi_res &= 0x7f
+        elif variant == RFC_4122:
+            self.clock_hi_res &= 0x3f
+            self.clock_hi_res |= 0x80
+        elif variant == RESERVED_MICROSOFT:
+            self.clock_hi_res &= 0x1f
+            self.clock_hi_res |= 0xc0
+        elif variant == RESERVED_FUTURE:
+            self.clock_hi_res &= 0x1f
+            self.clock_hi_res |= 0xe0
+        else:
+            raise ValueError('illegal variant identifier')
+
+    variant = property(get_variant, set_variant)
+
+    def get_version(self):
+        return self.time_hi_ver >> 12
+
+    def set_version(self, version):
+        assert 1 <= version <= 5, ValueError('illegal version number')
+        self.time_hi_ver &= 0x0fff
+        self.time_hi_ver |= (version << 12)
+
+    version = property(get_version, set_version)
+
+def unixgetaddr(program):
+    """Get the hardware address on a Unix machine."""
+    from os import popen
+    for line in popen(program):
+        words = line.lower().split()
+        if 'hwaddr' in words:
+            addr = words[words.index('hwaddr') + 1]
+            return int(addr.replace(':', ''), 16)
+        if 'ether' in words:
+            addr = words[words.index('ether') + 1]
+            return int(addr.replace(':', ''), 16)
+
+def wingetaddr(program):
+    """Get the hardware address on a Windows machine."""
+    from os import popen
+    for line in popen(program + ' /all'):
+        if line.strip().lower().startswith('physical address'):
+            addr = line.split(':')[-1].strip()
+            return int(addr.replace('-', ''), 16)
+
+def getaddr():
+    """Get the hardware address as a 48-bit integer."""
+    from os.path import join, isfile
+    for dir in ['/sbin', '/usr/sbin', r'c:\windows',
+                r'c:\windows\system', r'c:\windows\system32']:
+        if isfile(join(dir, 'ifconfig')):
+            return unixgetaddr(join(dir, 'ifconfig'))
+        if isfile(join(dir, 'ipconfig.exe')):
+            return wingetaddr(join(dir, 'ipconfig.exe'))
+
+def uuid1():
+    """Generate a UUID based on the time and hardware address."""
+    from time import time
+    from random import randrange
+    nanoseconds = int(time() * 1e9)
+    # 0x01b21dd213814000 is the number of 100-ns intervals between the
+    # UUID epoch 1582-10-15 00:00:00 and the Unix epoch 1970-01-01 00:00:00.
+    timestamp = int(nanoseconds/100) + 0x01b21dd213814000
+    clock = randrange(1<<16) # don't use stable storage
+    time_low = timestamp & (0x100000000 - 1)
+    time_mid = (timestamp >> 32) & 0xffff
+    time_hi_ver = (timestamp >> 48) & 0x0fff
+    clock_low = clock & 0xff
+    clock_hi_res = (clock >> 8) & 0x3f
+    node = getaddr()
+    uuid = UUID(time_low, time_mid, time_hi_ver, clock_low, clock_hi_res, node)
+    uuid.variant = RFC_4122
+    uuid.version = 1
+    return uuid
+
+def uuid3(namespace, name):
+    """Generate a UUID from the MD5 hash of a namespace UUID and a name."""
+    try:
+        from hashlib import md5
+    except ImportError:
+        from md5 import md5
+    uuid = UUID(0, 0, 0, 0, 0, 0)
+    uuid.bytes = md5(namespace.bytes + name).digest()[:16]
+    uuid.variant = RFC_4122
+    uuid.version = 3
+    return uuid
+
+def uuid4():
+    """Generate a random UUID."""
+    try:
+        from os import urandom
+    except:
+        from random import randrange
+        uuid = UUID(randrange(1<<32L), randrange(1<<16), randrange(1<<16),
+                    randrange(1<<8), randrange(1<<8), randrange(1<<48L))
+    else:
+        uuid = UUID(0, 0, 0, 0, 0, 0)
+        uuid.bytes = urandom(16)
+    uuid.variant = RFC_4122
+    uuid.version = 4
+    return uuid
+
+def uuid5(namespace, name):
+    """Generate a UUID from the SHA-1 hash of a namespace UUID and a name."""
+    try:
+        from hashlib import sha1
+    except ImportError:
+        from sha import sha as sha1
+    uuid = UUID(0, 0, 0, 0, 0, 0)
+    uuid.bytes = sha1(namespace.bytes + name).digest()[:16]
+    uuid.variant = RFC_4122
+    uuid.version = 5
+    return uuid
+
+NAMESPACE_DNS = UUID('{6ba7b810-9dad-11d1-80b4-00c04fd430c8}')
+NAMESPACE_URL = UUID('{6ba7b811-9dad-11d1-80b4-00c04fd430c8}')
+NAMESPACE_OID = UUID('{6ba7b812-9dad-11d1-80b4-00c04fd430c8}')
+NAMESPACE_X500 = UUID('{6ba7b814-9dad-11d1-80b4-00c04fd430c8}')
Index: /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/create_distro.py
===================================================================
--- /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/create_distro.py (revision 3)
+++ /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/script/create_distro.py (revision 3)
@@ -0,0 +1,417 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+import re
+import sys
+import os
+import pkg_resources
+from command import Command, BadCommand
+import copydir
+import pluginlib
+import fnmatch
+try:
+    set
+except NameError:
+    from sets import Set as set
+
+class CreateDistroCommand(Command):
+
+    usage = 'PACKAGE_NAME [VAR=VALUE VAR2=VALUE2 ...]'
+    summary = "Create the file layout for a Python distribution"
+    short_description = summary
+
+    description = """\
+    Create a new project.  Projects are typically Python packages,
+    ready for distribution.  Projects are created from templates, and
+    represent different kinds of projects -- associated with a
+    particular framework for instance.
+    """
+
+    parser = Command.standard_parser(
+        simulate=True, no_interactive=True, quiet=True, overwrite=True)
+    parser.add_option('-t', '--template',
+                      dest='templates',
+                      metavar='TEMPLATE',
+                      action='append',
+                      help="Add a template to the create process")
+    parser.add_option('-o', '--output-dir',
+                      dest='output_dir',
+                      metavar='DIR',
+                      default='.',
+                      help="Write put the directory into DIR (default current directory)")
+    parser.add_option('--svn-repository',
+                      dest='svn_repository',
+                      metavar='REPOS',
+                      help="Create package at given repository location (this will create the standard trunk/ tags/ branches/ hierarchy)")
+    parser.add_option('--list-templates',
+                      dest='list_templates',
+                      action='store_true',
+                      help="List all templates available")
+    parser.add_option('--list-variables',
+                      dest="list_variables",
+                      action="store_true",
+                      help="List all variables expected by the given template (does not create a package)")
+    parser.add_option('--inspect-files',
+                      dest='inspect_files',
+                      action='store_true',
+                      help="Show where the files in the given (already created) directory came from (useful when using multiple templates)")
+    parser.add_option('--config',
+                      action='store',
+                      dest='config',
+                      help="Template variables file")
+
+    _bad_chars_re = re.compile('[^a-zA-Z0-9_]')
+
+    default_verbosity = 1
+    default_interactive = 1
+
+    def command(self):
+        if self.options.list_templates:
+            return self.list_templates()
+        asked_tmpls = self.options.templates or ['basic_package']
+        templates = []
+        for tmpl_name in asked_tmpls:
+            self.extend_templates(templates, tmpl_name)
+        if self.options.list_variables:
+            return self.list_variables(templates)
+        if self.verbose:
+            print 'Selected and implied templates:'
+            max_tmpl_name = max([len(tmpl_name) for tmpl_name, tmpl in templates])
+            for tmpl_name, tmpl in templates:
+                print '  %s%s  %s' % (
+                    tmpl_name, ' '*(max_tmpl_name-len(tmpl_name)),
+                    tmpl.summary)
+            print
+        if not self.args:
+            if self.interactive:
+                dist_name = self.challenge('Enter project name')
+            else:
+                raise BadCommand('You must provide a PACKAGE_NAME')
+        else:
+            dist_name = self.args[0].lstrip(os.path.sep)
+
+        templates = [tmpl for name, tmpl in templates]
+        output_dir = os.path.join(self.options.output_dir, dist_name)
+        
+        pkg_name = self._bad_chars_re.sub('', dist_name.lower())
+        vars = {'project': dist_name,
+                'package': pkg_name,
+                'egg': pluginlib.egg_name(dist_name),
+                }
+        vars.update(self.parse_vars(self.args[1:]))
+        if self.options.config and os.path.exists(self.options.config):
+            for key, value in self.read_vars(self.options.config).items():
+                vars.setdefault(key, value)
+        
+        if self.verbose: # @@: > 1?
+            self.display_vars(vars)
+
+        if self.options.inspect_files:
+            self.inspect_files(
+                output_dir, templates, vars)
+            return
+        if not os.path.exists(output_dir):
+            # We want to avoid asking questions in copydir if the path
+            # doesn't exist yet
+            copydir.all_answer = 'y'
+        
+        if self.options.svn_repository:
+            self.setup_svn_repository(output_dir, dist_name)
+
+        # First we want to make sure all the templates get a chance to
+        # set their variables, all at once, with the most specialized
+        # template going first (the last template is the most
+        # specialized)...
+        for template in templates[::-1]:
+            vars = template.check_vars(vars, self)
+
+        # Gather all the templates egg_plugins into one var
+        egg_plugins = set()
+        for template in templates:
+            egg_plugins.update(template.egg_plugins)
+        egg_plugins = list(egg_plugins)
+        egg_plugins.sort()
+        vars['egg_plugins'] = egg_plugins
+            
+        for template in templates:
+            self.create_template(
+                template, output_dir, vars)
+
+        found_setup_py = False
+        paster_plugins_mtime = None
+        if os.path.exists(os.path.join(output_dir, 'setup.py')):
+            # Grab paster_plugins.txt's mtime; used to determine if the
+            # egg_info command wrote to it
+            try:
+                egg_info_dir = pluginlib.egg_info_dir(output_dir, dist_name)
+            except IOError:
+                egg_info_dir = None
+            if egg_info_dir is not None:
+                plugins_path = os.path.join(egg_info_dir, 'paster_plugins.txt')
+                if os.path.exists(plugins_path):
+                    paster_plugins_mtime = os.path.getmtime(plugins_path)
+
+            self.run_command(sys.executable, 'setup.py', 'egg_info',
+                             cwd=output_dir,
+                             # This shouldn't be necessary, but a bug in setuptools 0.6c3 is causing a (not entirely fatal) problem that I don't want to fix right now:
+                             expect_returncode=True)
+            found_setup_py = True
+        elif self.verbose > 1:
+            print 'No setup.py (cannot run egg_info)'
+
+        package_dir = vars.get('package_dir', None)
+        if package_dir:
+            output_dir = os.path.join(output_dir, package_dir)
+
+        # With no setup.py this doesn't make sense:
+        if found_setup_py:
+            # Only write paster_plugins.txt if it wasn't written by
+            # egg_info (the correct way). leaving us to do it is
+            # deprecated and you'll get warned
+            egg_info_dir = pluginlib.egg_info_dir(output_dir, dist_name)
+            plugins_path = os.path.join(egg_info_dir, 'paster_plugins.txt')
+            if len(egg_plugins) and (not os.path.exists(plugins_path) or \
+                    os.path.getmtime(plugins_path) == paster_plugins_mtime):
+                if self.verbose:
+                    print >> sys.stderr, \
+                        ('Manually creating paster_plugins.txt (deprecated! '
+                         'pass a paster_plugins keyword to setup() instead)')
+                for plugin in egg_plugins:
+                    if self.verbose:
+                        print 'Adding %s to paster_plugins.txt' % plugin
+                    if not self.simulate:
+                        pluginlib.add_plugin(egg_info_dir, plugin)
+        
+        if self.options.svn_repository:
+            self.add_svn_repository(vars, output_dir)
+
+        if self.options.config:
+            write_vars = vars.copy()
+            del write_vars['project']
+            del write_vars['package']
+            self.write_vars(self.options.config, write_vars)
+        
+    def create_template(self, template, output_dir, vars):
+        if self.verbose:
+            print 'Creating template %s' % template.name
+        template.run(self, output_dir, vars)
+
+    def setup_svn_repository(self, output_dir, dist_name):
+        # @@: Use subprocess
+        svn_repos = self.options.svn_repository
+        svn_repos_path = os.path.join(svn_repos, dist_name).replace('\\','/')
+        svn_command = 'svn'
+        if sys.platform == 'win32':
+            svn_command += '.exe'
+        # @@: The previous method of formatting this string using \ doesn't work on Windows
+        cmd = '%(svn_command)s mkdir %(svn_repos_path)s' + \
+            ' %(svn_repos_path)s/trunk %(svn_repos_path)s/tags' + \
+            ' %(svn_repos_path)s/branches -m "New project %(dist_name)s"'
+        cmd = cmd % {
+            'svn_repos_path': svn_repos_path, 
+            'dist_name': dist_name,
+            'svn_command':svn_command,
+        }
+        if self.verbose:
+            print "Running:"
+            print cmd
+        if not self.simulate:
+            os.system(cmd)
+        svn_repos_path_trunk = os.path.join(svn_repos_path,'trunk').replace('\\','/')
+        cmd = svn_command+' co "%s" "%s"' % (svn_repos_path_trunk, output_dir)
+        if self.verbose:
+            print "Running %s" % cmd
+        if not self.simulate:
+            os.system(cmd)
+
+    ignore_egg_info_files = [
+        'top_level.txt',
+        'entry_points.txt',
+        'requires.txt',
+        'PKG-INFO',
+        'namespace_packages.txt',
+        'SOURCES.txt',
+        'dependency_links.txt',
+        'not-zip-safe']
+
+    def add_svn_repository(self, vars, output_dir):
+        svn_repos = self.options.svn_repository
+        egg_info_dir = pluginlib.egg_info_dir(output_dir, vars['project'])
+        svn_command = 'svn'
+        if sys.platform == 'win32':
+            svn_command += '.exe'
+        self.run_command(svn_command, 'add', '-N', egg_info_dir)
+        paster_plugins_file = os.path.join(
+            egg_info_dir, 'paster_plugins.txt')
+        if os.path.exists(paster_plugins_file):
+            self.run_command(svn_command, 'add', paster_plugins_file)
+        self.run_command(svn_command, 'ps', 'svn:ignore',
+                         '\n'.join(self.ignore_egg_info_files),
+                         egg_info_dir)
+        if self.verbose:
+            print ("You must next run 'svn commit' to commit the "
+                   "files to repository")
+
+    def extend_templates(self, templates, tmpl_name):
+        if '#' in tmpl_name:
+            dist_name, tmpl_name = tmpl_name.split('#', 1)
+        else:
+            dist_name, tmpl_name = None, tmpl_name
+        if dist_name is None:
+            for entry in self.all_entry_points():
+                if entry.name == tmpl_name:
+                    tmpl = entry.load()(entry.name)
+                    dist_name = entry.dist.project_name
+                    break
+            else:
+                raise LookupError(
+                    'Template by name %r not found' % tmpl_name)
+        else:
+            dist = pkg_resources.get_distribution(dist_name)
+            entry = dist.get_entry_info(
+                'paste.paster_create_template', tmpl_name)
+            tmpl = entry.load()(entry.name)
+        full_name = '%s#%s' % (dist_name, tmpl_name)
+        for item_full_name, item_tmpl in templates:
+            if item_full_name == full_name:
+                # Already loaded
+                return
+        for req_name in tmpl.required_templates:
+            self.extend_templates(templates, req_name)
+        templates.append((full_name, tmpl))
+        
+    def all_entry_points(self):
+        if not hasattr(self, '_entry_points'):
+            self._entry_points = list(pkg_resources.iter_entry_points(
+            'paste.paster_create_template'))
+        return self._entry_points
+
+    def display_vars(self, vars):
+        vars = vars.items()
+        vars.sort()
+        print 'Variables:'
+        max_var = max([len(n) for n, v in vars])
+        for name, value in vars:
+            print '  %s:%s  %s' % (
+                name, ' '*(max_var-len(name)), value)
+        
+    def list_templates(self):
+        templates = []
+        for entry in self.all_entry_points():
+            try:
+                templates.append(entry.load()(entry.name))
+            except Exception, e:
+                # We will not be stopped!
+                print 'Warning: could not load entry point %s (%s: %s)' % (
+                    entry.name, e.__class__.__name__, e)
+        max_name = max([len(t.name) for t in templates])
+        templates.sort(lambda a, b: cmp(a.name, b.name))
+        print 'Available templates:'
+        for template in templates:
+            # @@: Wrap description
+            print '  %s:%s  %s' % (
+                template.name,
+                ' '*(max_name-len(template.name)),
+                template.summary)
+        
+    def inspect_files(self, output_dir, templates, vars):
+        file_sources = {}
+        for template in templates:
+            self._find_files(template, vars, file_sources)
+        self._show_files(output_dir, file_sources)
+        self._show_leftovers(output_dir, file_sources)
+
+    def _find_files(self, template, vars, file_sources):
+        tmpl_dir = template.template_dir()
+        self._find_template_files(
+            template, tmpl_dir, vars, file_sources)
+
+    def _find_template_files(self, template, tmpl_dir, vars,
+                             file_sources, join=''):
+        full_dir = os.path.join(tmpl_dir, join)
+        for name in os.listdir(full_dir):
+            if name.startswith('.'):
+                continue
+            if os.path.isdir(os.path.join(full_dir, name)):
+                self._find_template_files(
+                    template, tmpl_dir, vars, file_sources,
+                    join=os.path.join(join, name))
+                continue
+            partial = os.path.join(join, name)
+            for name, value in vars.items():
+                partial = partial.replace('+%s+' % name, value)
+            if partial.endswith('_tmpl'):
+                partial = partial[:-5]
+            file_sources.setdefault(partial, []).append(template)
+
+    _ignore_filenames = ['.*', '*.pyc', '*.bak*']
+    _ignore_dirs = ['CVS', '_darcs', '.svn']
+
+    def _show_files(self, output_dir, file_sources, join='', indent=0):
+        pad = ' '*(2*indent)
+        full_dir = os.path.join(output_dir, join)
+        names = os.listdir(full_dir)
+        dirs = [n for n in names
+                if os.path.isdir(os.path.join(full_dir, n))]
+        fns = [n for n in names
+               if not os.path.isdir(os.path.join(full_dir, n))]
+        dirs.sort()
+        names.sort()
+        for name in names:
+            skip_this = False
+            for ext in self._ignore_filenames:
+                if fnmatch.fnmatch(name, ext):
+                    if self.verbose > 1:
+                        print '%sIgnoring %s' % (pad, name)
+                    skip_this = True
+                    break
+            if skip_this:
+                continue
+            partial = os.path.join(join, name)
+            if partial not in file_sources:
+                if self.verbose > 1:
+                    print '%s%s (not from template)' % (pad, name)
+                continue
+            templates = file_sources.pop(partial)
+            print '%s%s from:' % (pad, name)
+            for template in templates:
+                print '%s  %s' % (pad, template.name)
+        for dir in dirs:
+            if dir in self._ignore_dirs:
+                continue
+            print '%sRecursing into %s/' % (pad, dir)
+            self._show_files(
+                output_dir, file_sources,
+                join=os.path.join(join, dir),
+                indent=indent+1)
+
+    def _show_leftovers(self, output_dir, file_sources):
+        if not file_sources:
+            return
+        print 
+        print 'These files were supposed to be generated by templates'
+        print 'but were not found:'
+        file_sources = file_sources.items()
+        file_sources.sort()
+        for partial, templates in file_sources:
+            print '  %s from:' % partial
+            for template in templates:
+                print '    %s' % template.name
+
+    def list_variables(self, templates):
+        for tmpl_name, tmpl in templates:
+            if not tmpl.read_vars():
+                if self.verbose > 1:
+                    self._show_template_vars(
+                        tmpl_name, tmpl, 'No variables found')
+                continue
+            self._show_template_vars(tmpl_name, tmpl)
+
+    def _show_template_vars(self, tmpl_name, tmpl, message=None):
+        title = '%s (from %s)' % (tmpl.name, tmpl_name)
+        print title
+        print '-'*len(title)
+        if message is not None:
+            print '  %s' % message
+            print
+            return
+        tmpl.print_vars(indent=2)
Index: /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/__init__.py
===================================================================
--- /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/__init__.py (revision 3)
+++ /galaxy-central/eggs/PasteScript-1.7.3-py2.6.egg/paste/__init__.py (revision 3)
@@ -0,0 +1,18 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+try:
+    import pkg_resources
+    pkg_resources.declare_namespace(__name__)
+except ImportError:
+    # don't prevent use of paste if pkg_resources isn't installed
+    from pkgutil import extend_path
+    __path__ = extend_path(__path__, __name__) 
+
+try:
+    import modulefinder
+except ImportError:
+    pass
+else:
+    for p in __path__:
+        modulefinder.AddPackagePath(__name__, p)
+
Index: /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/changeset/ansisql.py
===================================================================
--- /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/changeset/ansisql.py (revision 3)
+++ /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/changeset/ansisql.py (revision 3)
@@ -0,0 +1,371 @@
+"""
+   Extensions to SQLAlchemy for altering existing tables.
+
+   At the moment, this isn't so much based off of ANSI as much as
+   things that just happen to work with multiple databases.
+"""
+import sqlalchemy as sa
+from sqlalchemy.engine.base import Connection, Dialect
+from sqlalchemy.sql.compiler import SchemaGenerator
+from sqlalchemy.schema import ForeignKeyConstraint
+from migrate.changeset import constraint, exceptions
+
+SchemaIterator = sa.engine.SchemaIterator
+
+
+class RawAlterTableVisitor(object):
+    """Common operations for ``ALTER TABLE`` statements."""
+
+    def _to_table(self, param):
+        """Returns the table object for the given param object."""
+        if isinstance(param, (sa.Column, sa.Index, sa.schema.Constraint)):
+            ret = param.table
+        else:
+            ret = param
+        return ret
+
+    def _to_table_name(self, param):
+        """Returns the table name for the given param object."""
+        ret = self._to_table(param)
+        if isinstance(ret, sa.Table):
+            ret = ret.fullname
+        return ret
+
+    def _do_quote_table_identifier(self, identifier):
+        """Returns a quoted version of the given table identifier."""
+        return '"%s"'%identifier
+
+    def start_alter_table(self, param):
+        """Returns the start of an ``ALTER TABLE`` SQL-Statement.
+
+        Use the param object to determine the table name and use it
+        for building the SQL statement.
+
+        :param param: object to determine the table from
+        :type param: :class:`sqlalchemy.Column`, :class:`sqlalchemy.Index`,
+          :class:`sqlalchemy.schema.Constraint`, :class:`sqlalchemy.Table`,
+          or string (table name)
+        """
+        table = self._to_table(param)
+        table_name = self._to_table_name(table)
+        self.append('\nALTER TABLE %s ' % \
+                        self._do_quote_table_identifier(table_name))
+        return table
+
+    def _pk_constraint(self, table, column, status):
+        """Create a primary key constraint from a table, column.
+
+        Status: true if the constraint is being added; false if being dropped
+        """
+        if isinstance(column, basestring):
+            column = getattr(table.c, name)
+
+        ret = constraint.PrimaryKeyConstraint(*table.primary_key)
+        if status:
+            # Created PK
+            ret.c.append(column)
+        else:
+            # Dropped PK
+            names = [c.name for c in cons.c]
+            index = names.index(col.name)
+            del ret.c[index]
+
+        # Allow explicit PK name assignment
+        if isinstance(pk, basestring):
+            ret.name = pk
+        return ret
+
+
+class AlterTableVisitor(SchemaIterator, RawAlterTableVisitor):
+    """Common operations for ``ALTER TABLE`` statements"""
+    pass
+
+
+class ANSIColumnGenerator(AlterTableVisitor, SchemaGenerator):
+    """Extends ansisql generator for column creation (alter table add col)"""
+
+    def visit_column(self, column):
+        """Create a column (table already exists).
+
+        :param column: column object
+        :type column: :class:`sqlalchemy.Column`
+        """
+        table = self.start_alter_table(column)
+        self.append(" ADD ")
+        colspec = self.get_column_specification(column)
+        self.append(colspec)
+        self.execute()
+
+    def visit_table(self, table):
+        """Default table visitor, does nothing.
+
+        :param table: table object
+        :type table: :class:`sqlalchemy.Table`
+        """
+        pass
+
+
+class ANSIColumnDropper(AlterTableVisitor):
+    """Extends ANSI SQL dropper for column dropping (``ALTER TABLE
+    DROP COLUMN``)."""
+
+    def visit_column(self, column):
+        """Drop a column from its table.
+
+        :param column: the column object
+        :type column: :class:`sqlalchemy.Column`
+        """
+        table = self.start_alter_table(column)
+        self.append(' DROP COLUMN %s' % \
+                        self._do_quote_column_identifier(column.name))
+        self.execute()
+
+
+class ANSISchemaChanger(AlterTableVisitor, SchemaGenerator):
+    """Manages changes to existing schema elements.
+
+    Note that columns are schema elements; ``ALTER TABLE ADD COLUMN``
+    is in SchemaGenerator.
+
+    All items may be renamed. Columns can also have many of their properties -
+    type, for example - changed.
+
+    Each function is passed a tuple, containing (object,name); where
+    object is a type of object you'd expect for that function
+    (ie. table for visit_table) and name is the object's new
+    name. NONE means the name is unchanged.
+    """
+
+    def _do_quote_column_identifier(self, identifier):
+        """override this function to define how identifiers (table and
+        column names) should be written in the SQL.  For instance, in
+        PostgreSQL, double quotes should surround the identifier
+        """
+        return identifier
+
+    def visit_table(self, param):
+        """Rename a table. Other ops aren't supported."""
+        table, newname = param
+        self.start_alter_table(table)
+        self.append("RENAME TO %s"%newname)
+        self.execute()
+
+    def visit_column(self, delta):
+        """Rename/change a column."""
+        # ALTER COLUMN is implemented as several ALTER statements
+        keys = delta.keys()
+        if 'type' in keys:
+            self._run_subvisit(delta, self._visit_column_type)
+        if 'nullable' in keys:
+            self._run_subvisit(delta, self._visit_column_nullable)
+        if 'server_default' in keys:
+            # Skip 'default': only handle server-side defaults, others
+            # are managed by the app, not the db.
+            self._run_subvisit(delta, self._visit_column_default)
+        if 'name' in keys:
+            self._run_subvisit(delta, self._visit_column_name)
+
+    def _run_subvisit(self, delta, func, col_name=None, table_name=None):
+        if table_name is None:
+            table_name = self._to_table(delta.table)
+        if col_name is None:
+            col_name = delta.current_name
+        ret = func(table_name, col_name, delta)
+        self.execute()
+        return ret
+
+    def _visit_column_foreign_key(self, delta):
+        table = delta.table
+        column = getattr(table.c, delta.current_name)
+        cons = constraint.ForeignKeyConstraint(column, autoload=True)
+        fk = delta['foreign_key']
+        if fk:
+            # For now, cons.columns is limited to one column:
+            # no multicolumn FKs
+            column.foreign_key = ForeignKey(*cons.columns)
+        else:
+            column_foreign_key = None
+        cons.drop()
+        cons.create()
+
+    def _visit_column_primary_key(self, delta):
+        table = delta.table
+        col = getattr(table.c, delta.current_name)
+        pk = delta['primary_key']
+        cons = self._pk_constraint(table, col, pk)
+        cons.drop()
+        cons.create()
+
+    def _visit_column_nullable(self, table_name, col_name, delta):
+        nullable = delta['nullable']
+        table = self._to_table(delta)
+        self.start_alter_table(table_name)
+        self.append("ALTER COLUMN %s " % \
+                        self._do_quote_column_identifier(col_name))
+        if nullable:
+            self.append("DROP NOT NULL")
+        else:
+            self.append("SET NOT NULL")
+
+    def _visit_column_default(self, table_name, col_name, delta):
+        server_default = delta['server_default']
+        # Dummy column: get_col_default_string needs a column for some
+        # reason
+        dummy = sa.Column(None, None, server_default=server_default)
+        default_text = self.get_column_default_string(dummy)
+        self.start_alter_table(table_name)
+        self.append("ALTER COLUMN %s " % \
+                        self._do_quote_column_identifier(col_name))
+        if default_text is not None:
+            self.append("SET DEFAULT %s"%default_text)
+        else:
+            self.append("DROP DEFAULT")
+
+    def _visit_column_type(self, table_name, col_name, delta):
+        type = delta['type']
+        if not isinstance(type, sa.types.AbstractType):
+            # It's the class itself, not an instance... make an
+            # instance
+            type = type()
+        type_text = type.dialect_impl(self.dialect).get_col_spec()
+        self.start_alter_table(table_name)
+        self.append("ALTER COLUMN %s TYPE %s" % \
+                        (self._do_quote_column_identifier(col_name),
+                         type_text))
+
+    def _visit_column_name(self, table_name, col_name, delta):
+        new_name = delta['name']
+        self.start_alter_table(table_name)
+        self.append('RENAME COLUMN %s TO %s' % \
+                        (self._do_quote_column_identifier(col_name),
+                         self._do_quote_column_identifier(new_name)))
+
+    def visit_index(self, param):
+        """Rename an index; #36"""
+        index, newname = param
+        self.append("ALTER INDEX %s RENAME TO %s" % (index.name, newname))
+        self.execute()
+
+
+class ANSIConstraintCommon(AlterTableVisitor):
+    """
+    Migrate's constraints require a separate creation function from
+    SA's: Migrate's constraints are created independently of a table;
+    SA's are created at the same time as the table.
+    """
+
+    def get_constraint_name(self, cons):
+        """Gets a name for the given constraint.
+
+        If the name is already set it will be used otherwise the
+        constraint's :meth:`autoname
+        <migrate.changeset.constraint.ConstraintChangeset.autoname>`
+        method is used.
+
+        :param cons: constraint object
+        :type cons: :class:`migrate.changeset.constraint.ConstraintChangeset`
+        """
+        if cons.name is not None:
+            ret = cons.name
+        else:
+            ret = cons.name = cons.autoname()
+        return ret
+
+
+class ANSIConstraintGenerator(ANSIConstraintCommon):
+
+    def get_constraint_specification(self, cons, **kwargs):
+        if isinstance(cons, constraint.PrimaryKeyConstraint):
+            col_names = ','.join([i.name for i in cons.columns])
+            ret = "PRIMARY KEY (%s)" % col_names
+            if cons.name:
+                # Named constraint
+                ret = ("CONSTRAINT %s " % cons.name)+ret
+        elif isinstance(cons, constraint.ForeignKeyConstraint):
+            params = dict(
+                columns=','.join([c.name for c in cons.columns]),
+                reftable=cons.reftable,
+                referenced=','.join([c.name for c in cons.referenced]),
+                name=self.get_constraint_name(cons),
+            )
+            ret = "CONSTRAINT %(name)s FOREIGN KEY (%(columns)s) "\
+                "REFERENCES %(reftable)s (%(referenced)s)" % params
+            if cons.onupdate:
+                ret = ret + " ON UPDATE %s" % cons.onupdate
+            if cons.ondelete:
+                ret = ret + " ON DELETE %s" % cons.ondelete
+        elif isinstance(cons, constraint.CheckConstraint):
+            ret = "CHECK (%s)" % cons.sqltext
+        else:
+            raise exceptions.InvalidConstraintError(cons)
+        return ret
+
+    def _visit_constraint(self, constraint):
+        table = self.start_alter_table(constraint)
+        self.append("ADD ")
+        spec = self.get_constraint_specification(constraint)
+        self.append(spec)
+        self.execute()
+
+    def visit_migrate_primary_key_constraint(self, *p, **k):
+        return self._visit_constraint(*p, **k)
+
+    def visit_migrate_foreign_key_constraint(self, *p, **k):
+        return self._visit_constraint(*p, **k)
+
+    def visit_migrate_check_constraint(self, *p, **k):
+        return self._visit_constraint(*p, **k)
+
+
+class ANSIConstraintDropper(ANSIConstraintCommon):
+
+    def _visit_constraint(self, constraint):
+        self.start_alter_table(constraint)
+        self.append("DROP CONSTRAINT ")
+        self.append(self.get_constraint_name(constraint))
+        self.execute()
+
+    def visit_migrate_primary_key_constraint(self, *p, **k):
+        return self._visit_constraint(*p, **k)
+
+    def visit_migrate_foreign_key_constraint(self, *p, **k):
+        return self._visit_constraint(*p, **k)
+
+    def visit_migrate_check_constraint(self, *p, **k):
+        return self._visit_constraint(*p, **k)
+
+
+class ANSIFKGenerator(AlterTableVisitor, SchemaGenerator):
+    """Extends ansisql generator for column creation (alter table add col)"""
+
+    def __init__(self, *args, **kwargs):
+        self.fk = kwargs.get('fk', None)
+        if self.fk:
+            del kwargs['fk']
+        super(ANSIFKGenerator, self).__init__(*args, **kwargs)
+
+    def visit_column(self, column):
+        """Create foreign keys for a column (table already exists); #32"""
+
+        if self.fk:
+            self.add_foreignkey(self.fk.constraint)
+
+        if self.buffer.getvalue() !='':
+            self.execute()
+
+    def visit_table(self, table):
+        pass
+
+
+class ANSIDialect(object):
+    columngenerator = ANSIColumnGenerator
+    columndropper = ANSIColumnDropper
+    schemachanger = ANSISchemaChanger
+    columnfkgenerator = ANSIFKGenerator
+
+    @classmethod
+    def visitor(self, name):
+        return getattr(self, name)
+
+    def reflectconstraints(self, connection, table_name):
+        raise NotImplementedError()
Index: /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/changeset/__init__.py
===================================================================
--- /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/changeset/__init__.py (revision 3)
+++ /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/changeset/__init__.py (revision 3)
@@ -0,0 +1,8 @@
+"""
+   This module extends SQLAlchemy and provides additional DDL [#]_
+   support.
+
+   .. [#] SQL Data Definition Language
+"""
+from migrate.changeset.schema import *
+from migrate.changeset.constraint import *
Index: /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/changeset/databases/__init__.py
===================================================================
--- /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/changeset/databases/__init__.py (revision 3)
+++ /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/changeset/databases/__init__.py (revision 3)
@@ -0,0 +1,10 @@
+"""
+   This module contains database dialect specific changeset
+   implementations.
+"""
+__all__=[
+'postgres',
+'sqlite',
+'mysql',
+'oracle',
+]
Index: /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/changeset/databases/visitor.py
===================================================================
--- /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/changeset/databases/visitor.py (revision 3)
+++ /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/changeset/databases/visitor.py (revision 3)
@@ -0,0 +1,34 @@
+"""
+   Module for visitor class mapping.
+"""
+import sqlalchemy as sa
+from migrate.changeset.databases import sqlite, postgres, mysql, oracle
+from migrate.changeset import ansisql
+
+# Map SA dialects to the corresponding Migrate extensions
+dialects = {
+    sa.engine.default.DefaultDialect: ansisql.ANSIDialect,
+    sa.databases.sqlite.SQLiteDialect: sqlite.SQLiteDialect,
+    sa.databases.postgres.PGDialect: postgres.PGDialect,
+    sa.databases.mysql.MySQLDialect: mysql.MySQLDialect,
+    sa.databases.oracle.OracleDialect: oracle.OracleDialect,
+}
+
+
+def get_engine_visitor(engine, name):
+    """
+    Get the visitor implementation for the given database engine.
+    """
+    return get_dialect_visitor(engine.dialect, name)
+
+
+def get_dialect_visitor(sa_dialect, name):
+    """
+    Get the visitor implementation for the given dialect.
+
+    Finds the visitor implementation based on the dialect class and
+    returns and instance initialized with the given name.
+    """
+    sa_dialect_cls = sa_dialect.__class__
+    migrate_dialect_cls = dialects[sa_dialect_cls]
+    return migrate_dialect_cls.visitor(name)
Index: /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/changeset/databases/sqlite.py
===================================================================
--- /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/changeset/databases/sqlite.py (revision 3)
+++ /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/changeset/databases/sqlite.py (revision 3)
@@ -0,0 +1,107 @@
+"""
+   `SQLite`_ database specific implementations of changeset classes.
+
+   .. _`SQLite`: http://www.sqlite.org/
+"""
+from migrate.changeset import ansisql, constraint, exceptions
+from sqlalchemy.databases import sqlite as sa_base
+from sqlalchemy import Table, MetaData
+#import sqlalchemy as sa
+
+SQLiteSchemaGenerator = sa_base.SQLiteSchemaGenerator
+
+
+class SQLiteHelper(object):
+
+    def visit_column(self, param):
+        try:
+            table = self._to_table(param.table)
+        except:
+            table = self._to_table(param)
+            raise
+        table_name = self._to_table_name(table)
+        self.append('ALTER TABLE %s RENAME TO migration_tmp' % table_name)
+        self.execute()
+
+        insertion_string = self._modify_table(table, param)
+
+        table.create()
+        self.append(insertion_string % {'table_name': table_name})
+        self.execute()
+        self.append('DROP TABLE migration_tmp')
+        self.execute()
+
+
+class SQLiteColumnGenerator(SQLiteSchemaGenerator,
+                            ansisql.ANSIColumnGenerator):
+    pass
+
+
+class SQLiteColumnDropper(SQLiteHelper, ansisql.ANSIColumnDropper):
+
+    def _modify_table(self, table, column):
+        del table.columns[column.name]
+        columns = ','.join([c.name for c in table.columns])
+        return 'INSERT INTO %(table_name)s SELECT ' + columns + \
+            ' from migration_tmp'
+
+
+class SQLiteSchemaChanger(SQLiteHelper, ansisql.ANSISchemaChanger):
+
+    def _not_supported(self, op):
+        raise exceptions.NotSupportedError("SQLite does not support "
+            "%s; see http://www.sqlite.org/lang_altertable.html"%op)
+
+    def _modify_table(self, table, delta):
+        column = table.columns[delta.current_name]
+        for k, v in delta.items():
+            setattr(column, k, v)
+        return 'INSERT INTO %(table_name)s SELECT * from migration_tmp'
+
+    def visit_index(self, param):
+        self._not_supported('ALTER INDEX')
+
+    def _do_quote_column_identifier(self, identifier):
+        return '"%s"'%identifier
+
+
+class SQLiteConstraintGenerator(ansisql.ANSIConstraintGenerator):
+
+    def visit_migrate_primary_key_constraint(self, constraint):
+        tmpl = "CREATE UNIQUE INDEX %s ON %s ( %s )"
+        cols = ','.join([c.name for c in constraint.columns])
+        tname = constraint.table.name
+        name = constraint.name
+        msg = tmpl % (name, tname, cols)
+        self.append(msg)
+        self.execute()
+
+
+class SQLiteFKGenerator(SQLiteSchemaChanger, ansisql.ANSIFKGenerator):
+    def visit_column(self, column):
+        """Create foreign keys for a column (table already exists); #32"""
+
+        if self.fk:
+            self._not_supported("ALTER TABLE ADD FOREIGN KEY")
+
+        if self.buffer.getvalue() !='':
+            self.execute()
+
+
+class SQLiteConstraintDropper(ansisql.ANSIColumnDropper):
+
+    def visit_migrate_primary_key_constraint(self, constraint):
+        tmpl = "DROP INDEX %s "
+        name = constraint.name
+        msg = tmpl % (name)
+        self.append(msg)
+        self.execute()
+
+
+class SQLiteDialect(ansisql.ANSIDialect):
+    columngenerator = SQLiteColumnGenerator
+    columndropper = SQLiteColumnDropper
+    schemachanger = SQLiteSchemaChanger
+    constraintgenerator = SQLiteConstraintGenerator
+    constraintdropper = SQLiteConstraintDropper
+    columnfkgenerator = SQLiteFKGenerator
Index: /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/changeset/databases/mysql.py
===================================================================
--- /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/changeset/databases/mysql.py (revision 3)
+++ /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/changeset/databases/mysql.py (revision 3)
@@ -0,0 +1,100 @@
+"""
+   MySQL database specific implementations of changeset classes.
+"""
+
+from migrate.changeset import ansisql, exceptions
+from sqlalchemy.databases import mysql as sa_base
+#import sqlalchemy as sa
+
+MySQLSchemaGenerator = sa_base.MySQLSchemaGenerator
+
+
+class MySQLColumnGenerator(MySQLSchemaGenerator, ansisql.ANSIColumnGenerator):
+
+    def _do_quote_table_identifier(self, identifier):
+        return '%s'%identifier
+    pass
+
+
+class MySQLColumnDropper(ansisql.ANSIColumnDropper):
+
+    def _do_quote_table_identifier(self, identifier):
+        return '%s'%identifier
+
+    def _do_quote_column_identifier(self, identifier):
+        return '%s'%identifier
+
+
+class MySQLSchemaChanger(MySQLSchemaGenerator, ansisql.ANSISchemaChanger):
+
+    def visit_column(self, delta):
+        keys = delta.keys()
+        if 'type' in keys or 'nullable' in keys or 'name' in keys:
+            self._run_subvisit(delta, self._visit_column_change)
+        if 'server_default' in keys:
+            # Column name might have changed above
+            col_name = delta.get('name', delta.current_name)
+            self._run_subvisit(delta, self._visit_column_default,
+                               col_name=col_name)
+
+    def _visit_column_change(self, table_name, col_name, delta):
+        if not hasattr(delta, 'result_column'):
+            # Mysql needs the whole column definition, not just a lone
+            # name/type
+            raise exceptions.NotSupportedError(
+                "A column object is required to do this")
+
+        column = delta.result_column
+        # needed by get_column_specification
+        if not column.table:
+            column.table = delta.table
+        colspec = self.get_column_specification(column)
+        self.start_alter_table(table_name)
+        self.append("CHANGE COLUMN ")
+        self.append(col_name)
+        self.append(' ')
+        self.append(colspec)
+
+    def visit_index(self, param):
+        # If MySQL can do this, I can't find how
+        raise exceptions.NotSupportedError("MySQL cannot rename indexes")
+
+    def _do_quote_table_identifier(self, identifier):
+        return '%s'%identifier
+
+
+class MySQLConstraintGenerator(ansisql.ANSIConstraintGenerator):
+
+    def _do_quote_table_identifier(self, identifier):
+        return '%s'%identifier
+
+
+class MySQLConstraintDropper(ansisql.ANSIConstraintDropper):
+    #def visit_constraint(self,constraint):
+    #    if isinstance(constraint,sqlalchemy.schema.PrimaryKeyConstraint):
+    #        return self._visit_constraint_pk(constraint)
+    #    elif isinstance(constraint,sqlalchemy.schema.ForeignKeyConstraint):
+    #        return self._visit_constraint_fk(constraint)
+    #    return super(MySQLConstraintDropper,self).visit_constraint(constraint)
+
+    def visit_migrate_primary_key_constraint(self, constraint):
+        self.start_alter_table(constraint)
+        self.append("DROP PRIMARY KEY")
+        self.execute()
+
+    def visit_migrate_foreign_key_constraint(self, constraint):
+        self.start_alter_table(constraint)
+        self.append("DROP FOREIGN KEY ")
+        self.append(constraint.name)
+        self.execute()
+
+    def _do_quote_table_identifier(self, identifier):
+        return '%s'%identifier
+
+
+class MySQLDialect(ansisql.ANSIDialect):
+    columngenerator = MySQLColumnGenerator
+    columndropper = MySQLColumnDropper
+    schemachanger = MySQLSchemaChanger
+    constraintgenerator = MySQLConstraintGenerator
+    constraintdropper = MySQLConstraintDropper
Index: /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/changeset/databases/oracle.py
===================================================================
--- /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/changeset/databases/oracle.py (revision 3)
+++ /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/changeset/databases/oracle.py (revision 3)
@@ -0,0 +1,109 @@
+"""
+   Oracle database specific implementations of changeset classes.
+"""
+
+from migrate.changeset import ansisql, exceptions
+from sqlalchemy.databases import oracle as sa_base
+import sqlalchemy as sa
+
+OracleSchemaGenerator = sa_base.OracleSchemaGenerator
+
+
+class OracleColumnGenerator(OracleSchemaGenerator,
+                            ansisql.ANSIColumnGenerator):
+    pass
+
+
+class OracleColumnDropper(ansisql.ANSIColumnDropper):
+    pass
+
+
+class OracleSchemaChanger(OracleSchemaGenerator, ansisql.ANSISchemaChanger):
+
+    def get_column_specification(self, column, **kwargs):
+        # Ignore the NOT NULL generated
+        override_nullable = kwargs.pop('override_nullable', None)
+        if override_nullable:
+            orig = column.nullable
+            column.nullable = True
+        ret = super(OracleSchemaChanger, self).get_column_specification(
+            column, **kwargs)
+        if override_nullable:
+            column.nullable = orig
+        return ret
+
+    def visit_column(self, delta):
+        keys = delta.keys()
+        if 'type' in keys or 'nullable' in keys or 'default' in keys \
+                or 'server_default' in keys:
+            self._run_subvisit(delta, self._visit_column_change)
+        if 'name' in keys:
+            self._run_subvisit(delta, self._visit_column_name)
+
+    def _visit_column_change(self, table_name, col_name, delta):
+        if not hasattr(delta, 'result_column'):
+            # Oracle needs the whole column definition, not just a
+            # lone name/type
+            raise exceptions.NotSupportedError(
+                "A column object is required to do this")
+
+        column = delta.result_column
+        # Oracle cannot drop a default once created, but it can set it
+        # to null.  We'll do that if default=None
+        # http://forums.oracle.com/forums/message.jspa?\
+        # messageID=1273234#1273234
+        dropdefault_hack = (column.server_default is None \
+                                and 'server_default' in delta.keys())
+        # Oracle apparently doesn't like it when we say "not null" if
+        # the column's already not null. Fudge it, so we don't need a
+        # new function
+        notnull_hack = ((not column.nullable) \
+                            and ('nullable' not in delta.keys()))
+        # We need to specify NULL if we're removing a NOT NULL
+        # constraint
+        null_hack = (column.nullable and ('nullable' in delta.keys()))
+
+        if dropdefault_hack:
+            column.server_default = sa.PassiveDefault(sa.sql.null())
+        if notnull_hack:
+            column.nullable = True
+        colspec=self.get_column_specification(column,
+                                              override_nullable=null_hack)
+        if null_hack:
+            colspec += ' NULL'
+        if notnull_hack:
+            column.nullable = False
+        if dropdefault_hack:
+            column.server_default = None
+
+        self.start_alter_table(table_name)
+        self.append("MODIFY ")
+        self.append(colspec)
+
+
+class OracleConstraintCommon(object):
+
+    def get_constraint_name(self, cons):
+        # Oracle constraints can't guess their name like other DBs
+        if not cons.name:
+            raise exceptions.NotSupportedError(
+                "Oracle constraint names must be explicitly stated")
+        return cons.name
+
+
+class OracleConstraintGenerator(OracleConstraintCommon,
+                                ansisql.ANSIConstraintGenerator):
+    pass
+
+
+class OracleConstraintDropper(OracleConstraintCommon,
+                              ansisql.ANSIConstraintDropper):
+    pass
+
+
+class OracleDialect(ansisql.ANSIDialect):
+    columngenerator = OracleColumnGenerator
+    columndropper = OracleColumnDropper
+    schemachanger = OracleSchemaChanger
+    constraintgenerator = OracleConstraintGenerator
+    constraintdropper = OracleConstraintDropper
Index: /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/changeset/databases/postgres.py
===================================================================
--- /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/changeset/databases/postgres.py (revision 3)
+++ /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/changeset/databases/postgres.py (revision 3)
@@ -0,0 +1,57 @@
+"""
+   `PostgreSQL`_ database specific implementations of changeset classes.
+
+   .. _`PostgreSQL`: http://www.postgresql.org/
+"""
+from migrate.changeset import ansisql
+from sqlalchemy.databases import postgres as sa_base
+#import sqlalchemy as sa
+
+
+PGSchemaGenerator = sa_base.PGSchemaGenerator
+
+
+class PGSchemaGeneratorMixin(object):
+    """Common code used by the PostgreSQL specific classes."""
+
+    def _do_quote_table_identifier(self, identifier):
+        return identifier
+
+    def _do_quote_column_identifier(self, identifier):
+        return '"%s"'%identifier
+
+
+class PGColumnGenerator(PGSchemaGenerator, ansisql.ANSIColumnGenerator,
+                        PGSchemaGeneratorMixin):
+    """PostgreSQL column generator implementation."""
+    pass
+
+
+class PGColumnDropper(ansisql.ANSIColumnDropper, PGSchemaGeneratorMixin):
+    """PostgreSQL column dropper implementation."""
+    pass
+
+
+class PGSchemaChanger(ansisql.ANSISchemaChanger, PGSchemaGeneratorMixin):
+    """PostgreSQL schema changer implementation."""
+    pass
+
+
+class PGConstraintGenerator(ansisql.ANSIConstraintGenerator,
+                            PGSchemaGeneratorMixin):
+    """PostgreSQL constraint generator implementation."""
+    pass
+
+
+class PGConstraintDropper(ansisql.ANSIConstraintDropper,
+                          PGSchemaGeneratorMixin):
+    """PostgreSQL constaint dropper implementation."""
+    pass
+
+
+class PGDialect(ansisql.ANSIDialect):
+    columngenerator = PGColumnGenerator
+    columndropper = PGColumnDropper
+    schemachanger = PGSchemaChanger
+    constraintgenerator = PGConstraintGenerator
+    constraintdropper = PGConstraintDropper
Index: /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/changeset/schema.py
===================================================================
--- /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/changeset/schema.py (revision 3)
+++ /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/changeset/schema.py (revision 3)
@@ -0,0 +1,409 @@
+"""
+   Schema module providing common schema operations.
+"""
+import re
+import sqlalchemy
+from migrate.changeset.databases.visitor import get_engine_visitor
+
+__all__ = [
+'create_column',
+'drop_column',
+'alter_column',
+'rename_table',
+'rename_index',
+]
+
+
+def create_column(column, table=None, *p, **k):
+    if table is not None:
+        return table.create_column(column, *p, **k)
+    return column.create(*p, **k)
+
+
+def drop_column(column, table=None, *p, **k):
+    if table is not None:
+        return table.drop_column(column, *p, **k)
+    return column.drop(*p, **k)
+
+
+def _to_table(table, engine=None):
+    if isinstance(table, sqlalchemy.Table):
+        return table
+    # Given: table name, maybe an engine
+    meta = sqlalchemy.MetaData()
+    if engine is not None:
+        meta.bind = engine
+    return sqlalchemy.Table(table, meta)
+
+
+def _to_index(index, table=None, engine=None):
+    if isinstance(index, sqlalchemy.Index):
+        return index
+    # Given: index name; table name required
+    table = _to_table(table, engine)
+    ret = sqlalchemy.Index(index)
+    ret.table = table
+    return ret
+
+
+def rename_table(table, name, engine=None):
+    """Rename a table, given the table's current name and the new
+    name."""
+    table = _to_table(table, engine)
+    table.rename(name)
+
+
+def rename_index(index, name, table=None, engine=None):
+    """Rename an index.
+
+    Takes an index name/object, a table name/object, and an
+    engine. Engine and table aren't required if an index object is
+    given.
+    """
+    index = _to_index(index, table, engine)
+    index.rename(name)
+
+
+def _engine_run_visitor(engine, visitorcallable, element, **kwargs):
+    conn = engine.connect()
+    try:
+        element.accept_schema_visitor(visitorcallable(engine.dialect,
+                                                      connection=conn))
+    finally:
+        conn.close()
+
+
+def alter_column(*p, **k):
+    """Alter a column.
+
+    Parameters: column name, table name, an engine, and the properties
+    of that column to change
+    """
+    if len(p) and isinstance(p[0], sqlalchemy.Column):
+        col = p[0]
+    else:
+        col = None
+    if 'table' not in k:
+        k['table'] = col.table
+    if 'engine' not in k:
+        k['engine'] = k['table'].bind
+    engine = k['engine']
+    delta = _ColumnDelta(*p, **k)
+    visitorcallable = get_engine_visitor(engine, 'schemachanger')
+    _engine_run_visitor(engine, visitorcallable, delta)
+
+    # Update column
+    if col is not None:
+        # Special case: change column key on rename, if key not
+        # explicit
+        #
+        # Used by SA : table.c.[key]
+        #
+        # This fails if the key was explit AND equal to the column
+        # name.  (It changes the key name when it shouldn't.)
+        #
+        # Not much we can do about it.
+        if 'name' in delta.keys():
+            if (col.name == col.key):
+                newname = delta['name']
+                del col.table.c[col.key]
+                setattr(col, 'key', newname)
+                col.table.c[col.key] = col
+        # Change all other attrs
+        for key, val in delta.iteritems():
+            setattr(col, key, val)
+
+
+def _normalize_table(column, table):
+    if table is not None:
+        if table is not column.table:
+            # This is a bit of a hack: we end up with dupe PK columns here
+            pk_names = map(lambda c: c.name, table.primary_key)
+            if column.primary_key and pk_names.count(column.name):
+                index = pk_names.index(column_name)
+                del table.primary_key[index]
+            table.append_column(column)
+    return column.table
+
+
+class _WrapRename(object):
+
+    def __init__(self, item, name):
+        self.item = item
+        self.name = name
+
+    def accept_schema_visitor(self, visitor):
+        if isinstance(self.item, sqlalchemy.Table):
+            suffix = 'table'
+        elif isinstance(self.item, sqlalchemy.Column):
+            suffix = 'column'
+        elif isinstance(self.item, sqlalchemy.Index):
+            suffix = 'index'
+        funcname = 'visit_%s' % suffix
+        func = getattr(visitor, funcname)
+        param = self.item, self.name
+        return func(param)
+
+
+class _ColumnDelta(dict):
+    """Extracts the differences between two columns/column-parameters"""
+
+    def __init__(self, *p, **k):
+        """Extract ALTER-able differences from two columns.
+
+        May receive parameters arranged in several different ways:
+         * old_column_object,new_column_object,*parameters Identifies
+            attributes that differ between the two columns.
+            Parameters specified outside of either column are always
+            executed and override column differences.
+         * column_object,[current_name,]*parameters Parameters
+            specified are changed; table name is extracted from column
+            object.  Name is changed to column_object.name from
+            current_name, if current_name is specified. If not
+            specified, name is unchanged.
+         * current_name,table,*parameters 'table' may be either an
+            object or a name
+        """
+        # Things are initialized differently depending on how many column
+        # parameters are given. Figure out how many and call the appropriate
+        # method.
+        if len(p) >= 1 and isinstance(p[0], sqlalchemy.Column):
+            # At least one column specified
+            if len(p) >= 2 and isinstance(p[1], sqlalchemy.Column):
+                # Two columns specified
+                func = self._init_2col
+            else:
+                # Exactly one column specified
+                func = self._init_1col
+        else:
+            # Zero columns specified
+            func = self._init_0col
+        diffs = func(*p, **k)
+        self._set_diffs(diffs)
+    # Column attributes that can be altered
+    diff_keys = ('name', 'type', 'nullable', 'default', 'server_default',
+                 'primary_key', 'foreign_key')
+
+    def _get_table_name(self):
+        if isinstance(self._table, basestring):
+            ret = self._table
+        else:
+            ret = self._table.name
+        return ret
+    table_name = property(_get_table_name)
+
+    def _get_table(self):
+        if isinstance(self._table, basestring):
+            ret = None
+        else:
+            ret = self._table
+        return ret
+    table = property(_get_table)
+
+    def _init_0col(self, current_name, *p, **k):
+        p, k = self._init_normalize_params(p, k)
+        table = k.pop('table')
+        self.current_name = current_name
+        self._table = table
+        return k
+
+    def _init_1col(self, col, *p, **k):
+        p, k = self._init_normalize_params(p, k)
+        self._table = k.pop('table', None) or col.table
+        self.result_column = col.copy()
+        if 'current_name' in k:
+            # Renamed
+            self.current_name = k.pop('current_name')
+            k.setdefault('name', col.name)
+        else:
+            self.current_name = col.name
+        return k
+
+    def _init_2col(self, start_col, end_col, *p, **k):
+        p, k = self._init_normalize_params(p, k)
+        self.result_column = start_col.copy()
+        self._table = k.pop('table', None) or start_col.table \
+            or end_col.table
+        self.current_name = start_col.name
+        for key in ('name', 'nullable', 'default', 'server_default',
+                    'primary_key', 'foreign_key'):
+            val = getattr(end_col, key, None)
+            if getattr(start_col, key, None) != val:
+                k.setdefault(key, val)
+        if not self.column_types_eq(start_col.type, end_col.type):
+            k.setdefault('type', end_col.type)
+        return k
+
+    def _init_normalize_params(self, p, k):
+        p = list(p)
+        if len(p):
+            k.setdefault('name', p.pop(0))
+        if len(p):
+            k.setdefault('type', p.pop(0))
+        # TODO: sequences? FKs?
+        return p, k
+
+    def _set_diffs(self, diffs):
+        for key in self.diff_keys:
+            if key in diffs:
+                self[key] = diffs[key]
+                if getattr(self, 'result_column', None) is not None:
+                    setattr(self.result_column, key, diffs[key])
+
+    def column_types_eq(self, this, that):
+        ret = isinstance(this, that.__class__)
+        ret = ret or isinstance(that, this.__class__)
+        # String length is a special case
+        if ret and isinstance(that, sqlalchemy.types.String):
+            ret = (getattr(this, 'length', None) == \
+                       getattr(that, 'length', None))
+        return ret
+
+    def accept_schema_visitor(self, visitor):
+        return visitor.visit_column(self)
+
+
+class ChangesetTable(object):
+    """Changeset extensions to SQLAlchemy tables."""
+
+    def create_column(self, column):
+        """Creates a column.
+
+        The column parameter may be a column definition or the name of
+        a column in this table.
+        """
+        if not isinstance(column, sqlalchemy.Column):
+            # It's a column name
+            column = getattr(self.c, str(column))
+        column.create(table=self)
+
+    def drop_column(self, column):
+        """Drop a column, given its name or definition."""
+        if not isinstance(column, sqlalchemy.Column):
+            # It's a column name
+            try:
+                column = getattr(self.c, str(column), None)
+            except AttributeError:
+                # That column isn't part of the table. We don't need
+                # its entire definition to drop the column, just its
+                # name, so create a dummy column with the same name.
+                column = sqlalchemy.Column(str(column))
+        column.drop(table=self)
+
+    def _meta_key(self):
+        return sqlalchemy.schema._get_table_key(self.name, self.schema)
+
+    def deregister(self):
+        """Remove this table from its metadata"""
+        key = self._meta_key()
+        meta = self.metadata
+        if key in meta.tables:
+            del meta.tables[key]
+
+    def rename(self, name, *args, **kwargs):
+        """Rename this table.
+
+        This changes both the database name and the name of this
+        Python object
+        """
+        engine = self.bind
+        visitorcallable = get_engine_visitor(engine, 'schemachanger')
+        param = _WrapRename(self, name)
+        _engine_run_visitor(engine, visitorcallable, param, *args, **kwargs)
+
+        # Fix metadata registration
+        meta = self.metadata
+        self.deregister()
+        self.name = name
+        self._set_parent(meta)
+
+    def _get_fullname(self):
+        """Fullname should always be up to date"""
+        # Copied from Table constructor
+        if self.schema is not None:
+            ret = "%s.%s"%(self.schema, self.name)
+        else:
+            ret = self.name
+        return ret
+
+    fullname = property(_get_fullname, (lambda self, val: None))
+
+
+class ChangesetColumn(object):
+    """Changeset extensions to SQLAlchemy columns"""
+
+    def alter(self, *p, **k):
+        """Alter a column's definition: ``ALTER TABLE ALTER COLUMN``.
+
+        May supply a new column object, or a list of properties to
+        change.
+
+        For example; the following are equivalent:
+            col.alter(Column('myint', Integer, nullable=False))
+            col.alter('myint', Integer, nullable=False)
+            col.alter(name='myint', type=Integer, nullable=False)
+
+        Column name, type, default, and nullable may be changed
+        here. Note that for column defaults, only PassiveDefaults are
+        managed by the database - changing others doesn't make sense.
+        """
+        if 'table' not in k:
+            k['table'] = self.table
+        if 'engine' not in k:
+            k['engine'] = k['table'].bind
+        return alter_column(self, *p, **k)
+
+    def create(self, table=None, *args, **kwargs):
+        """Create this column in the database.
+
+        Assumes the given table exists. ``ALTER TABLE ADD COLUMN``,
+        for most databases.
+        """
+        table = _normalize_table(self, table)
+        engine = table.bind
+        visitorcallable = get_engine_visitor(engine, 'columngenerator')
+        engine._run_visitor(visitorcallable, self, *args, **kwargs)
+
+        #add in foreign keys
+        if self.foreign_keys:
+            for fk in self.foreign_keys:
+                visitorcallable = get_engine_visitor(engine,
+                                                     'columnfkgenerator')
+                engine._run_visitor(visitorcallable, self, fk=fk)
+        return self
+
+    def drop(self, table=None, *args, **kwargs):
+        """Drop this column from the database, leaving its table intact.
+
+        ``ALTER TABLE DROP COLUMN``, for most databases.
+        """
+        table = _normalize_table(self, table)
+        engine = table.bind
+        visitorcallable = get_engine_visitor(engine, 'columndropper')
+        engine._run_visitor(lambda dialect, conn: visitorcallable(conn),
+                            self, *args, **kwargs)
+        return self
+
+
+class ChangesetIndex(object):
+    """Changeset extensions to SQLAlchemy Indexes."""
+
+    def rename(self, name, *args, **kwargs):
+        """Change the name of an index.
+
+        This changes both the Python object name and the database
+        name.
+        """
+        engine = self.table.bind
+        visitorcallable = get_engine_visitor(engine, 'schemachanger')
+        param = _WrapRename(self, name)
+        _engine_run_visitor(engine, visitorcallable, param, *args, **kwargs)
+        self.name = name
+
+
+def _patch():
+    """All the 'ugly' operations that patch SQLAlchemy's internals."""
+    sqlalchemy.schema.Table.__bases__ += (ChangesetTable, )
+    sqlalchemy.schema.Column.__bases__ += (ChangesetColumn, )
+    sqlalchemy.schema.Index.__bases__ += (ChangesetIndex, )
+_patch()
Index: /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/changeset/exceptions.py
===================================================================
--- /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/changeset/exceptions.py (revision 3)
+++ /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/changeset/exceptions.py (revision 3)
@@ -0,0 +1,24 @@
+"""
+   This module provides exception classes.
+"""
+
+
+class Error(Exception):
+    """
+    Changeset error.
+    """
+    pass
+
+
+class NotSupportedError(Error):
+    """
+    Not supported error.
+    """
+    pass
+
+
+class InvalidConstraintError(Error):
+    """
+    Invalid constraint error.
+    """
+    pass
Index: /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/changeset/constraint.py
===================================================================
--- /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/changeset/constraint.py (revision 3)
+++ /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/changeset/constraint.py (revision 3)
@@ -0,0 +1,213 @@
+"""
+   This module defines standalone schema constraint classes.
+"""
+import sqlalchemy
+from sqlalchemy import schema
+
+
+class ConstraintChangeset(object):
+    """Base class for Constraint classes.
+    """
+
+    def _normalize_columns(self, cols, fullname=False):
+        """Given: column objects or names; return col names and
+        (maybe) a table"""
+        colnames = []
+        table = None
+        for col in cols:
+            if isinstance(col, schema.Column):
+                if col.table is not None and table is None:
+                    table = col.table
+                if fullname:
+                    col = '.'.join((col.table.name, col.name))
+                else:
+                    col = col.name
+            colnames.append(col)
+        return colnames, table
+
+    def create(self, engine=None):
+        """Create the constraint in the database.
+
+        :param engine: the database engine to use. If this is
+          :keyword:`None` the instance's engine will be used
+        :type engine: :class:`sqlalchemy.engine.base.Engine`
+        """
+        if engine is None:
+            engine = self.engine
+        engine.create(self)
+
+    def drop(self, engine=None):
+        """Drop the constraint from the database.
+
+        :param engine: the database engine to use. If this is
+          :keyword:`None` the instance's engine will be used
+        :type engine: :class:`sqlalchemy.engine.base.Engine`
+        """
+        if engine is None:
+            engine = self.engine
+        engine.drop(self)
+
+    def _derived_metadata(self):
+        return self.table._derived_metadata()
+
+    def accept_schema_visitor(self, visitor, *p, **k):
+        """
+        :raises: :exc:`NotImplementedError` if this method is not \
+overridden by a subclass
+        """
+        raise NotImplementedError()
+
+    def _accept_schema_visitor(self, visitor, func, *p, **k):
+        """Call the visitor only if it defines the given function"""
+        try:
+            func = getattr(visitor, func)
+        except AttributeError:
+            return
+        return func(self)
+
+    def autoname(self):
+        """Automatically generate a name for the constraint instance.
+
+        Subclasses must implement this method.
+
+        :raises: :exc:`NotImplementedError` if this method is not \
+overridden by a subclass
+        """
+        raise NotImplementedError()
+
+
+def _engine_run_visitor(engine, visitorcallable, element, **kwargs):
+    conn = engine.connect()
+    try:
+        element.accept_schema_visitor(visitorcallable(conn))
+    finally:
+        conn.close()
+
+
+class PrimaryKeyConstraint(ConstraintChangeset, schema.PrimaryKeyConstraint):
+    """Primary key constraint class."""
+
+    def __init__(self, *cols, **kwargs):
+        colnames, table = self._normalize_columns(cols)
+        table = kwargs.pop('table', table)
+        super(PrimaryKeyConstraint, self).__init__(*colnames, **kwargs)
+        if table is not None:
+            self._set_parent(table)
+
+    def _set_parent(self, table):
+        self.table = table
+        return super(ConstraintChangeset, self)._set_parent(table)
+
+    def create(self, *args, **kwargs):
+        from migrate.changeset.databases.visitor import get_engine_visitor
+        visitorcallable = get_engine_visitor(self.table.bind,
+                                             'constraintgenerator')
+        _engine_run_visitor(self.table.bind, visitorcallable, self)
+
+    def autoname(self):
+        """Mimic the database's automatic constraint names"""
+        ret = "%(table)s_pkey"%dict(
+            table=self.table.name,
+        )
+        return ret
+
+    def drop(self, *args, **kwargs):
+        from migrate.changeset.databases.visitor import get_engine_visitor
+        visitorcallable = get_engine_visitor(self.table.bind,
+                                             'constraintdropper')
+        _engine_run_visitor(self.table.bind, visitorcallable, self)
+        self.columns.clear()
+        return self
+
+    def accept_schema_visitor(self, visitor, *p, **k):
+        func = 'visit_migrate_primary_key_constraint'
+        return self._accept_schema_visitor(visitor, func, *p, **k)
+
+
+class ForeignKeyConstraint(ConstraintChangeset, schema.ForeignKeyConstraint):
+    """Foreign key constraint class."""
+
+    def __init__(self, columns, refcolumns, *p, **k):
+        colnames, table = self._normalize_columns(columns)
+        table = k.pop('table', table)
+        refcolnames, reftable = self._normalize_columns(refcolumns,
+                                                        fullname=True)
+        super(ForeignKeyConstraint, self).__init__(colnames, refcolnames, *p,
+                                                   **k)
+        if table is not None:
+            self._set_parent(table)
+
+    def _get_referenced(self):
+        return [e.column for e in self.elements]
+    referenced = property(_get_referenced)
+
+    def _get_reftable(self):
+        return self.referenced[0].table
+    reftable = property(_get_reftable)
+
+    def autoname(self):
+        """Mimic the database's automatic constraint names"""
+        ret = "%(table)s_%(reftable)s_fkey"%dict(
+            table=self.table.name,
+            reftable=self.reftable.name,
+        )
+        return ret
+
+    def create(self, *args, **kwargs):
+        from migrate.changeset.databases.visitor import get_engine_visitor
+        visitorcallable = get_engine_visitor(self.table.bind,
+                                             'constraintgenerator')
+        _engine_run_visitor(self.table.bind, visitorcallable, self)
+        return self
+
+    def drop(self, *args, **kwargs):
+        from migrate.changeset.databases.visitor import get_engine_visitor
+        visitorcallable = get_engine_visitor(self.table.bind,
+                                             'constraintdropper')
+        _engine_run_visitor(self.table.bind, visitorcallable, self)
+        self.columns.clear()
+        return self
+
+    def accept_schema_visitor(self, visitor, *p, **k):
+        func = 'visit_migrate_foreign_key_constraint'
+        return self._accept_schema_visitor(visitor, func, *p, **k)
+
+
+class CheckConstraint(ConstraintChangeset, schema.CheckConstraint):
+    """Check constraint class."""
+
+    def __init__(self, sqltext, *args, **kwargs):
+        cols = kwargs.pop('columns')
+        colnames, table = self._normalize_columns(cols)
+        table = kwargs.pop('table', table)
+        ConstraintChangeset.__init__(self, *args, **kwargs)
+        schema.CheckConstraint.__init__(self, sqltext, *args, **kwargs)
+        if table is not None:
+            self._set_parent(table)
+        self.colnames = colnames
+
+    def _set_parent(self, table):
+        self.table = table
+        return super(ConstraintChangeset, self)._set_parent(table)
+
+    def create(self):
+        from migrate.changeset.databases.visitor import get_engine_visitor
+        visitorcallable = get_engine_visitor(self.table.bind,
+                                             'constraintgenerator')
+        _engine_run_visitor(self.table.bind, visitorcallable, self)
+
+    def drop(self):
+        from migrate.changeset.databases.visitor import get_engine_visitor
+        visitorcallable = get_engine_visitor(self.table.bind,
+                                             'constraintdropper')
+        _engine_run_visitor(self.table.bind, visitorcallable, self)
+        self.columns.clear()
+        return self
+
+    def autoname(self):
+        return "%(table)s_%(cols)s_check" % \
+            {"table": self.table.name, "cols": "_".join(self.colnames)}
+
+    def accept_schema_visitor(self, visitor, *args, **kwargs):
+        func = 'visit_migrate_check_constraint'
+        return self._accept_schema_visitor(visitor, func, *args, **kwargs)
Index: /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/schemadiff.py
===================================================================
--- /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/schemadiff.py (revision 3)
+++ /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/schemadiff.py (revision 3)
@@ -0,0 +1,197 @@
+"""
+   Schema differencing support.
+"""
+import sqlalchemy
+
+
+def getDiffOfModelAgainstDatabase(model, conn, excludeTables=None):
+    """
+    Return differences of model against database.
+
+    :return: object which will evaluate to :keyword:`True` if there \
+      are differences else :keyword:`False`.
+    """
+    return SchemaDiff(model, conn, excludeTables)
+
+
+def getDiffOfModelAgainstModel(oldmodel, model, conn, excludeTables=None):
+    """
+    Return differences of model against another model.
+
+    :return: object which will evaluate to :keyword:`True` if there \
+      are differences else :keyword:`False`.
+    """
+    return SchemaDiff(model, conn, excludeTables, oldmodel=oldmodel)
+
+
+class SchemaDiff(object):
+    """
+    Differences of model against database.
+    """
+
+    def __init__(self, model, conn, excludeTables=None, oldmodel=None):
+        """
+        :param model: Python model's metadata
+        :param conn: active database connection.
+        """
+        self.model = model
+        self.conn = conn
+        if not excludeTables:
+            # [] can't be default value in Python parameter
+            excludeTables = []
+        self.excludeTables = excludeTables
+        if oldmodel:
+            self.reflected_model = oldmodel
+        else:
+            self.reflected_model = sqlalchemy.MetaData(conn, reflect=True)
+        self.tablesMissingInDatabase, self.tablesMissingInModel, \
+            self.tablesWithDiff = [], [], []
+        self.colDiffs = {}
+        self.compareModelToDatabase()
+
+    def compareModelToDatabase(self):
+        """
+        Do actual comparison.
+        """
+        # Setup common variables.
+        cc = self.conn.contextual_connect()
+        schemagenerator = self.conn.dialect.schemagenerator(
+            self.conn.dialect, cc)
+
+        # For each in model, find missing in database.
+        for modelName, modelTable in self.model.tables.items():
+            if modelName in self.excludeTables:
+                continue
+            reflectedTable = self.reflected_model.tables.get(modelName, None)
+            if reflectedTable:
+                # Table exists.
+                pass
+            else:
+                self.tablesMissingInDatabase.append(modelTable)
+
+        # For each in database, find missing in model.
+        for reflectedName, reflectedTable in \
+                self.reflected_model.tables.items():
+            if reflectedName in self.excludeTables:
+                continue
+            modelTable = self.model.tables.get(reflectedName, None)
+            if modelTable:
+                # Table exists.
+
+                # Find missing columns in database.
+                for modelCol in modelTable.columns:
+                    databaseCol = reflectedTable.columns.get(modelCol.name,
+                                                             None)
+                    if databaseCol:
+                        pass
+                    else:
+                        self.storeColumnMissingInDatabase(modelTable, modelCol)
+
+                # Find missing columns in model.
+                for databaseCol in reflectedTable.columns:
+                    modelCol = modelTable.columns.get(databaseCol.name, None)
+                    if modelCol:
+                        # Compare attributes of column.
+                        modelDecl = \
+                            schemagenerator.get_column_specification(
+                            modelCol)
+                        databaseDecl = \
+                            schemagenerator.get_column_specification(
+                            databaseCol)
+                        if modelDecl != databaseDecl:
+                            # Unfortunately, sometimes the database
+                            # decl won't quite match the model, even
+                            # though they're the same.
+                            mc, dc = modelCol.type.__class__, \
+                                databaseCol.type.__class__
+                            if (issubclass(mc, dc) \
+                                    or issubclass(dc, mc)) \
+                                    and modelCol.nullable == \
+                                    databaseCol.nullable:
+                                # Types and nullable are the same.
+                                pass
+                            else:
+                                self.storeColumnDiff(
+                                    modelTable, modelCol, databaseCol,
+                                    modelDecl, databaseDecl)
+                    else:
+                        self.storeColumnMissingInModel(modelTable, databaseCol)
+            else:
+                self.tablesMissingInModel.append(reflectedTable)
+
+    def __str__(self):
+        ''' Summarize differences. '''
+
+        def colDiffDetails():
+            colout = []
+            for table in self.tablesWithDiff:
+                tableName = table.name
+                missingInDatabase, missingInModel, diffDecl = \
+                    self.colDiffs[tableName]
+                if missingInDatabase:
+                    colout.append(
+                        '    %s missing columns in database: %s' % \
+                            (tableName, ', '.join(
+                                [col.name for col in missingInDatabase])))
+                if missingInModel:
+                    colout.append(
+                        '    %s missing columns in model: %s' % \
+                            (tableName, ', '.join(
+                                [col.name for col in missingInModel])))
+                if diffDecl:
+                    colout.append(
+                        '    %s with different declaration of columns\
+ in database: %s' % (tableName, str(diffDecl)))
+            return colout
+
+        out = []
+        if self.tablesMissingInDatabase:
+            out.append(
+                '  tables missing in database: %s' % \
+                    ', '.join(
+                    [table.name for table in self.tablesMissingInDatabase]))
+        if self.tablesMissingInModel:
+            out.append(
+                '  tables missing in model: %s' % \
+                    ', '.join(
+                    [table.name for table in self.tablesMissingInModel]))
+        if self.tablesWithDiff:
+            out.append(
+                '  tables with differences: %s' % \
+                    ', '.join([table.name for table in self.tablesWithDiff]))
+
+        if out:
+            out.insert(0, 'Schema diffs:')
+            out.extend(colDiffDetails())
+            return '\n'.join(out)
+        else:
+            return 'No schema diffs'
+
+    def __len__(self):
+        """
+        Used in bool evaluation, return of 0 means no diffs.
+        """
+        return len(self.tablesMissingInDatabase) + \
+            len(self.tablesMissingInModel) + len(self.tablesWithDiff)
+
+    def storeColumnMissingInDatabase(self, table, col):
+        if table not in self.tablesWithDiff:
+            self.tablesWithDiff.append(table)
+        missingInDatabase, missingInModel, diffDecl = \
+            self.colDiffs.setdefault(table.name, ([], [], []))
+        missingInDatabase.append(col)
+
+    def storeColumnMissingInModel(self, table, col):
+        if table not in self.tablesWithDiff:
+            self.tablesWithDiff.append(table)
+        missingInDatabase, missingInModel, diffDecl = \
+            self.colDiffs.setdefault(table.name, ([], [], []))
+        missingInModel.append(col)
+
+    def storeColumnDiff(self, table, modelCol, databaseCol, modelDecl,
+                        databaseDecl):
+        if table not in self.tablesWithDiff:
+            self.tablesWithDiff.append(table)
+        missingInDatabase, missingInModel, diffDecl = \
+            self.colDiffs.setdefault(table.name, ([], [], []))
+        diffDecl.append((modelCol, databaseCol, modelDecl, databaseDecl))
Index: /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/genmodel.py
===================================================================
--- /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/genmodel.py (revision 3)
+++ /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/genmodel.py (revision 3)
@@ -0,0 +1,221 @@
+"""
+   Code to generate a Python model from a database or differences
+   between a model and database.
+
+   Some of this is borrowed heavily from the AutoCode project at:
+   http://code.google.com/p/sqlautocode/
+"""
+
+import sys
+
+import migrate
+import sqlalchemy
+
+
+HEADER = """
+## File autogenerated by genmodel.py
+
+from sqlalchemy import *
+meta = MetaData()
+"""
+
+DECLARATIVE_HEADER = """
+## File autogenerated by genmodel.py
+
+from sqlalchemy import *
+from sqlalchemy.ext import declarative
+
+Base = declarative.declarative_base()
+"""
+
+
+class ModelGenerator(object):
+
+    def __init__(self, diff, declarative=False):
+        self.diff = diff
+        self.declarative = declarative
+        # is there an easier way to get this?
+        dialectModule = sys.modules[self.diff.conn.dialect.__module__]
+        self.colTypeMappings = dict((v, k) for k, v in \
+                                        dialectModule.colspecs.items())
+
+    def column_repr(self, col):
+        kwarg = []
+        if col.key != col.name:
+            kwarg.append('key')
+        if col.primary_key:
+            col.primary_key = True  # otherwise it dumps it as 1
+            kwarg.append('primary_key')
+        if not col.nullable:
+            kwarg.append('nullable')
+        if col.onupdate:
+            kwarg.append('onupdate')
+        if col.default:
+            if col.primary_key:
+                # I found that PostgreSQL automatically creates a
+                # default value for the sequence, but let's not show
+                # that.
+                pass
+            else:
+                kwarg.append('default')
+        ks = ', '.join('%s=%r' % (k, getattr(col, k)) for k in kwarg)
+
+        # crs: not sure if this is good idea, but it gets rid of extra
+        # u''
+        name = col.name.encode('utf8')
+        type = self.colTypeMappings.get(col.type.__class__, None)
+        if type:
+            # Make the column type be an instance of this type.
+            type = type()
+        else:
+            # We must already be a model type, no need to map from the
+            # database-specific types.
+            type = col.type
+
+        data = {
+            'name': name,
+            'type': type,
+            'constraints': ', '.join([repr(cn) for cn in col.constraints]),
+            'args': ks and ks or ''}
+
+        if data['constraints']:
+            if data['args']:
+                data['args'] = ',' + data['args']
+
+        if data['constraints'] or data['args']:
+            data['maybeComma'] = ','
+        else:
+            data['maybeComma'] = ''
+
+        commonStuff = """ %(maybeComma)s %(constraints)s %(args)s)""" % data
+        commonStuff = commonStuff.strip()
+        data['commonStuff'] = commonStuff
+        if self.declarative:
+            return """%(name)s = Column(%(type)r%(commonStuff)s""" % data
+        else:
+            return """Column(%(name)r, %(type)r%(commonStuff)s""" % data
+
+    def getTableDefn(self, table):
+        out = []
+        tableName = table.name
+        if self.declarative:
+            out.append("class %(table)s(Base):" % {'table': tableName})
+            out.append("  __tablename__ = '%(table)s'" % {'table': tableName})
+            for col in table.columns:
+                out.append("  %s" % self.column_repr(col))
+        else:
+            out.append("%(table)s = Table('%(table)s', meta," % \
+                           {'table': tableName})
+            for col in table.columns:
+                out.append("  %s," % self.column_repr(col))
+            out.append(")")
+        return out
+
+    def toPython(self):
+        """Assume database is current and model is empty."""
+        out = []
+        if self.declarative:
+            out.append(DECLARATIVE_HEADER)
+        else:
+            out.append(HEADER)
+        out.append("")
+        for table in self.diff.tablesMissingInModel:
+            out.extend(self.getTableDefn(table))
+            out.append("")
+        return '\n'.join(out)
+
+    def toUpgradeDowngradePython(self, indent='    '):
+        ''' Assume model is most current and database is out-of-date. '''
+
+        decls = ['meta = MetaData(migrate_engine)']
+        for table in self.diff.tablesMissingInModel + \
+                self.diff.tablesMissingInDatabase:
+            decls.extend(self.getTableDefn(table))
+
+        upgradeCommands, downgradeCommands = [], []
+        for table in self.diff.tablesMissingInModel:
+            tableName = table.name
+            upgradeCommands.append("%(table)s.drop()" % {'table': tableName})
+            downgradeCommands.append("%(table)s.create()" % \
+                                         {'table': tableName})
+        for table in self.diff.tablesMissingInDatabase:
+            tableName = table.name
+            upgradeCommands.append("%(table)s.create()" % {'table': tableName})
+            downgradeCommands.append("%(table)s.drop()" % {'table': tableName})
+
+        return (
+            '\n'.join(decls),
+            '\n'.join(['%s%s' % (indent, line) for line in upgradeCommands]),
+            '\n'.join(['%s%s' % (indent, line) for line in downgradeCommands]))
+
+    def applyModel(self):
+        """Apply model to current database."""
+        # Yuck! We have to import from changeset to apply the
+        # monkey-patch to allow column adding/dropping.
+        from migrate.changeset import schema
+
+        def dbCanHandleThisChange(missingInDatabase, missingInModel, diffDecl):
+            if missingInDatabase and not missingInModel and not diffDecl:
+                # Even sqlite can handle this.
+                return True
+            else:
+                return not self.diff.conn.url.drivername.startswith('sqlite')
+
+        meta = sqlalchemy.MetaData(self.diff.conn.engine)
+
+        for table in self.diff.tablesMissingInModel:
+            table = table.tometadata(meta)
+            table.drop()
+        for table in self.diff.tablesMissingInDatabase:
+            table = table.tometadata(meta)
+            table.create()
+        for modelTable in self.diff.tablesWithDiff:
+            modelTable = modelTable.tometadata(meta)
+            dbTable = self.diff.reflected_model.tables[modelTable.name]
+            tableName = modelTable.name
+            missingInDatabase, missingInModel, diffDecl = \
+                self.diff.colDiffs[tableName]
+            if dbCanHandleThisChange(missingInDatabase, missingInModel,
+                                     diffDecl):
+                for col in missingInDatabase:
+                    modelTable.columns[col.name].create()
+                for col in missingInModel:
+                    dbTable.columns[col.name].drop()
+                for modelCol, databaseCol, modelDecl, databaseDecl in diffDecl:
+                    databaseCol.alter(modelCol)
+            else:
+                # Sqlite doesn't support drop column, so you have to
+                # do more: create temp table, copy data to it, drop
+                # old table, create new table, copy data back.
+                #
+                # I wonder if this is guaranteed to be unique?
+                tempName = '_temp_%s' % modelTable.name
+
+                def getCopyStatement():
+                    preparer = self.diff.conn.engine.dialect.preparer
+                    commonCols = []
+                    for modelCol in modelTable.columns:
+                        if modelCol.name in dbTable.columns:
+                            commonCols.append(modelCol.name)
+                    commonColsStr = ', '.join(commonCols)
+                    return 'INSERT INTO %s (%s) SELECT %s FROM %s' % \
+                        (tableName, commonColsStr, commonColsStr, tempName)
+
+                # Move the data in one transaction, so that we don't
+                # leave the database in a nasty state.
+                connection = self.diff.conn.connect()
+                trans = connection.begin()
+                try:
+                    connection.execute(
+                        'CREATE TEMPORARY TABLE %s as SELECT * from %s' % \
+                            (tempName, modelTable.name))
+                    # make sure the drop takes place inside our
+                    # transaction with the bind parameter
+                    modelTable.drop(bind=connection)
+                    modelTable.create(bind=connection)
+                    connection.execute(getCopyStatement())
+                    connection.execute('DROP TABLE %s' % tempName)
+                    trans.commit()
+                except:
+                    trans.rollback()
+                    raise
Index: /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/cfgparse.py
===================================================================
--- /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/cfgparse.py (revision 3)
+++ /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/cfgparse.py (revision 3)
@@ -0,0 +1,27 @@
+"""
+   Configuration parser module.
+"""
+
+from ConfigParser import ConfigParser
+
+from migrate.versioning.base import *
+from migrate.versioning import pathed
+
+
+class Parser(ConfigParser):
+    """A project configuration file."""
+
+    def to_dict(self, sections=None):
+        """It's easier to access config values like dictionaries"""
+        return self._sections
+
+
+class Config(pathed.Pathed, Parser):
+    """Configuration class."""
+
+    def __init__(self, path, *p, **k):
+        """Confirm the config file exists; read it."""
+        self.require_found(path)
+        pathed.Pathed.__init__(self, path)
+        Parser.__init__(self, *p, **k)
+        self.read(path)
Index: /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/__init__.py
===================================================================
--- /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/__init__.py (revision 3)
+++ /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/__init__.py (revision 3)
@@ -0,0 +1,5 @@
+"""
+   This package provides functionality to create and manage
+   repositories of database schema changesets and to apply these
+   changesets to databases.
+"""
Index: /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/schema.py
===================================================================
--- /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/schema.py (revision 3)
+++ /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/schema.py (revision 3)
@@ -0,0 +1,198 @@
+"""
+   Database schema version management.
+"""
+from sqlalchemy import (Table, Column, MetaData, String, Text, Integer,
+    create_engine)
+from sqlalchemy.sql import and_
+from sqlalchemy import exceptions as sa_exceptions
+
+from migrate.versioning import exceptions, genmodel, schemadiff
+from migrate.versioning.repository import Repository
+from migrate.versioning.util import load_model
+from migrate.versioning.version import VerNum
+
+
+class ControlledSchema(object):
+    """A database under version control"""
+
+    def __init__(self, engine, repository):
+        if isinstance(repository, str):
+            repository=Repository(repository)
+        self.engine = engine
+        self.repository = repository
+        self.meta=MetaData(engine)
+        self._load()
+
+    def __eq__(self, other):
+        return (self.repository is other.repository \
+            and self.version == other.version)
+
+    def _load(self):
+        """Load controlled schema version info from DB"""
+        tname = self.repository.version_table
+        self.meta=MetaData(self.engine)
+        if not hasattr(self, 'table') or self.table is None:
+            try:
+                self.table = Table(tname, self.meta, autoload=True)
+            except (exceptions.NoSuchTableError):
+                raise exceptions.DatabaseNotControlledError(tname)
+        # TODO?: verify that the table is correct (# cols, etc.)
+        result = self.engine.execute(self.table.select(
+                    self.table.c.repository_id == str(self.repository.id)))
+        data = list(result)[0]
+        # TODO?: exception if row count is bad
+        # TODO: check repository id, exception if incorrect
+        self.version = data['version']
+
+    def _get_repository(self):
+        """
+        Given a database engine, try to guess the repository.
+
+        :raise: :exc:`NotImplementedError`
+        """
+        # TODO: no guessing yet; for now, a repository must be supplied
+        raise NotImplementedError()
+
+    @classmethod
+    def create(cls, engine, repository, version=None):
+        """
+        Declare a database to be under a repository's version control.
+        """
+        # Confirm that the version # is valid: positive, integer,
+        # exists in repos
+        if type(repository) is str:
+            repository=Repository(repository)
+        version = cls._validate_version(repository, version)
+        table=cls._create_table_version(engine, repository, version)
+        # TODO: history table
+        # Load repository information and return
+        return cls(engine, repository)
+
+    @classmethod
+    def _validate_version(cls, repository, version):
+        """
+        Ensures this is a valid version number for this repository.
+
+        :raises: :exc:`cls.InvalidVersionError` if invalid
+        :return: valid version number
+        """
+        if version is None:
+            version = 0
+        try:
+            version = VerNum(version) # raises valueerror
+            if version < 0 or version > repository.latest:
+                raise ValueError()
+        except ValueError:
+            raise exceptions.InvalidVersionError(version)
+        return version
+
+    @classmethod
+    def _create_table_version(cls, engine, repository, version):
+        """
+        Creates the versioning table in a database.
+        """
+        # Create tables
+        tname = repository.version_table
+        meta = MetaData(engine)
+
+        table = Table(
+            tname, meta,
+            Column('repository_id', String(255), primary_key=True),
+            Column('repository_path', Text),
+            Column('version', Integer), )
+
+        if not table.exists():
+            table.create()
+
+        # Insert data
+        try:
+            engine.execute(table.insert(), repository_id=repository.id,
+                           repository_path=repository.path,
+                           version=int(version))
+        except sa_exceptions.IntegrityError:
+            # An Entry for this repo already exists.
+            raise exceptions.DatabaseAlreadyControlledError()
+        return table
+
+    @classmethod
+    def compare_model_to_db(cls, engine, model, repository):
+        """
+        Compare the current model against the current database.
+        """
+        if isinstance(repository, basestring):
+            repository=Repository(repository)
+        model = load_model(model)
+        diff = schemadiff.getDiffOfModelAgainstDatabase(
+            model, engine, excludeTables=[repository.version_table])
+        return diff
+
+    @classmethod
+    def create_model(cls, engine, repository, declarative=False):
+        """
+        Dump the current database as a Python model.
+        """
+        if isinstance(repository, basestring):
+            repository=Repository(repository)
+        diff = schemadiff.getDiffOfModelAgainstDatabase(
+            MetaData(), engine, excludeTables=[repository.version_table])
+        return genmodel.ModelGenerator(diff, declarative).toPython()
+
+    def update_db_from_model(self, model):
+        """
+        Modify the database to match the structure of the current Python model.
+        """
+        if isinstance(self.repository, basestring):
+            self.repository=Repository(self.repository)
+        model = load_model(model)
+        diff = schemadiff.getDiffOfModelAgainstDatabase(
+            model, self.engine, excludeTables=[self.repository.version_table])
+        genmodel.ModelGenerator(diff).applyModel()
+        update = self.table.update(
+            self.table.c.repository_id == str(self.repository.id))
+        self.engine.execute(update, version=int(self.repository.latest))
+
+    def drop(self):
+        """
+        Remove version control from a database.
+        """
+        try:
+            self.table.drop()
+        except (sa_exceptions.SQLError):
+            raise exceptions.DatabaseNotControlledError(str(self.table))
+
+    def _engine_db(self, engine):
+        """
+        Returns the database name of an engine - ``postgres``, ``sqlite`` ...
+        """
+        # TODO: This is a bit of a hack...
+        return str(engine.dialect.__module__).split('.')[-1]
+
+    def changeset(self, version=None):
+        database = self._engine_db(self.engine)
+        start_ver = self.version
+        changeset = self.repository.changeset(database, start_ver, version)
+        return changeset
+
+    def runchange(self, ver, change, step):
+        startver = ver
+        endver = ver + step
+        # Current database version must be correct! Don't run if corrupt!
+        if self.version != startver:
+            raise exceptions.InvalidVersionError("%s is not %s" % \
+                                                     (self.version, startver))
+        # Run the change
+        change.run(self.engine, step)
+        # Update/refresh database version
+        update = self.table.update(
+            and_(self.table.c.version == int(startver),
+                 self.table.c.repository_id == str(self.repository.id)))
+        self.engine.execute(update, version=int(endver))
+        self._load()
+
+    def upgrade(self, version=None):
+        """
+        Upgrade (or downgrade) to a specified version, or latest version.
+        """
+        changeset = self.changeset(version)
+        for ver, change in changeset:
+            self.runchange(ver, change, changeset.step)
Index: /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/pathed.py
===================================================================
--- /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/pathed.py (revision 3)
+++ /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/pathed.py (revision 3)
@@ -0,0 +1,72 @@
+"""
+   A path/directory class.
+"""
+
+import os
+import shutil
+
+from migrate.versioning import exceptions
+from migrate.versioning.base import *
+from migrate.versioning.util import KeyedInstance
+
+
+class Pathed(KeyedInstance):
+    """
+    A class associated with a path/directory tree.
+
+    Only one instance of this class may exist for a particular file;
+    __new__ will return an existing instance if possible
+    """
+    parent = None
+
+    @classmethod
+    def _key(cls, path):
+        return str(path)
+
+    def __init__(self, path):
+        self.path = path
+        if self.__class__.parent is not None:
+            self._init_parent(path)
+
+    def _init_parent(self, path):
+        """Try to initialize this object's parent, if it has one"""
+        parent_path = self.__class__._parent_path(path)
+        self.parent = self.__class__.parent(parent_path)
+        log.info("Getting parent %r:%r" % (self.__class__.parent, parent_path))
+        self.parent._init_child(path, self)
+
+    def _init_child(self, child, path):
+        """Run when a child of this object is initialized.
+
+        Parameters: the child object; the path to this object (its
+        parent)
+        """
+
+    @classmethod
+    def _parent_path(cls, path):
+        """
+        Fetch the path of this object's parent from this object's path.
+        """
+        # os.path.dirname(), but strip directories like files (like
+        # unix basename)
+        #
+        # Treat directories like files...
+        if path[-1] == '/':
+            path=path[:-1]
+        ret = os.path.dirname(path)
+        return ret
+
+    @classmethod
+    def require_notfound(cls, path):
+        """Ensures a given path does not already exist"""
+        if os.path.exists(path):
+            raise exceptions.PathFoundError(path)
+
+    @classmethod
+    def require_found(cls, path):
+        """Ensures a given path already exists"""
+        if not os.path.exists(path):
+            raise exceptions.PathNotFoundError(path)
+
+    def __str__(self):
+        return self.path
Index: /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/templates/repository/default/migrate.cfg
===================================================================
--- /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/templates/repository/default/migrate.cfg (revision 3)
+++ /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/templates/repository/default/migrate.cfg (revision 3)
@@ -0,0 +1,20 @@
+[db_settings]
+# Used to identify which repository this database is versioned under.
+# You can use the name of your project.
+repository_id=${repository_id}
+
+# The name of the database table used to track the schema version.
+# This name shouldn't already be used by your project.
+# If this is changed once a database is under version control, you'll need to 
+# change the table name in each database too. 
+version_table=${version_table}
+
+# When committing a change script, Migrate will attempt to generate the 
+# sql for all supported databases; normally, if one of them fails - probably
+# because you don't have that database installed - it is ignored and the 
+# commit continues, perhaps ending successfully. 
+# Databases in this list MUST compile successfully during a commit, or the 
+# entire commit will fail. List the databases your application will actually 
+# be using to ensure your updates to that database work properly.
+# This must be a list; example: ['postgres','sqlite']
+required_dbs=${required_dbs}
Index: /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/templates/repository/default/README
===================================================================
--- /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/templates/repository/default/README (revision 3)
+++ /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/templates/repository/default/README (revision 3)
@@ -0,0 +1,4 @@
+This is a database migration repository.
+
+More information at
+http://code.google.com/p/sqlalchemy-migrate/
Index: /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/templates/script/logsql.py_tmpl
===================================================================
--- /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/templates/script/logsql.py_tmpl (revision 3)
+++ /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/templates/script/logsql.py_tmpl (revision 3)
@@ -0,0 +1,12 @@
+from sqlalchemy import *
+from migrate import *
+logsql=True
+
+def upgrade():
+    # Upgrade operations go here. Don't create your own engine; use the engine
+    # named 'migrate_engine' imported from migrate.
+    pass
+
+def downgrade():
+    # Operations to reverse the above upgrade go here.
+    pass
Index: /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/templates/script/default.py_tmpl
===================================================================
--- /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/templates/script/default.py_tmpl (revision 3)
+++ /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/templates/script/default.py_tmpl (revision 3)
@@ -0,0 +1,11 @@
+from sqlalchemy import *
+from migrate import *
+
+def upgrade():
+    # Upgrade operations go here. Don't create your own engine; use the engine
+    # named 'migrate_engine' imported from migrate.
+    pass
+
+def downgrade():
+    # Operations to reverse the above upgrade go here.
+    pass
Index: /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/templates/manage.py_tmpl
===================================================================
--- /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/templates/manage.py_tmpl (revision 3)
+++ /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/templates/manage.py_tmpl (revision 3)
@@ -0,0 +1,4 @@
+#!/usr/bin/env python
+from migrate.versioning.shell import main
+
+main(%(defaults)s)
Index: /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/shell.py
===================================================================
--- /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/shell.py (revision 3)
+++ /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/shell.py (revision 3)
@@ -0,0 +1,159 @@
+"""The migrate command-line tool."""
+
+import sys
+import inspect
+from optparse import OptionParser, BadOptionError
+
+from migrate.versioning.base import *
+from migrate.versioning import api, exceptions
+
+
+alias = dict(
+    s=api.script,
+    vc=api.version_control,
+    dbv=api.db_version,
+    v=api.version,
+)
+
+def alias_setup():
+    global alias
+    for key,val in alias.iteritems():
+        setattr(api,key,val)
+alias_setup()
+
+
+class PassiveOptionParser(OptionParser):
+
+    def _process_args(self, largs, rargs, values):
+        """little hack to support all --some_option=value parameters"""
+
+        while rargs:
+            arg = rargs[0]
+            if arg == "--":
+                del rargs[0]
+                return
+            elif arg[0:2] == "--":
+                # if parser does not know about the option, pass it along (make it anonymous)
+                try:
+                    opt = arg.split('=', 1)[0]
+                    self._match_long_opt(opt)
+                except BadOptionError:
+                    largs.append(arg)
+                    del rargs[0]
+                else:
+                    self._process_long_opt(rargs, values)
+            elif arg[:1] == "-" and len(arg) > 1:
+                self._process_short_opts(rargs, values)
+            elif self.allow_interspersed_args:
+                largs.append(arg)
+                del rargs[0]
+
+def main(argv=None, **kwargs):
+    """kwargs are default options that can be overriden with passing --some_option to cmdline"""
+
+    argv = argv or list(sys.argv[1:])
+    commands = list(api.__all__)
+    commands.sort()
+
+    usage="""%%prog COMMAND ...
+
+    Available commands:
+        %s
+
+    Enter "%%prog help COMMAND" for information on a particular command.
+    """ % '\n\t'.join(commands)
+
+    parser = PassiveOptionParser(usage=usage)
+    parser.add_option("-v", "--verbose", action="store_true", dest="verbose")
+    parser.add_option("-d", "--debug", action="store_true", dest="debug")
+    parser.add_option("-f", "--force", action="store_true", dest="force")
+    help_commands = ['help', '-h', '--help']
+    HELP = False
+
+    try:
+        command = argv.pop(0)
+        if command in help_commands:
+            HELP = True
+            command = argv.pop(0)
+    except IndexError:
+        parser.print_help()
+        return
+
+    command_func = getattr(api, command, None)
+    if command_func is None or command.startswith('_'):
+        parser.error("Invalid command %s" % command)
+
+    parser.set_usage(inspect.getdoc(command_func))
+    f_args, f_varargs, f_kwargs, f_defaults = inspect.getargspec(command_func)
+    for arg in f_args:
+        parser.add_option(
+            "--%s" % arg,
+            dest=arg,
+            action='store',
+            type="string")
+
+    # display help of the current command
+    if HELP:
+        parser.print_help()
+        return
+
+    options, args = parser.parse_args(argv)
+
+    # override kwargs with anonymous parameters
+    override_kwargs = dict()
+    for arg in list(args):
+        if arg.startswith('--'):
+            args.remove(arg)
+            if '=' in arg:
+                opt, value = arg[2:].split('=', 1)
+            else:
+                opt = arg[2:]
+                value = True
+            override_kwargs[opt] = value
+
+    # override kwargs with options if user is overwriting
+    for key, value in options.__dict__.iteritems():
+        if value is not None:
+            override_kwargs[key] = value
+
+    # arguments that function accepts without passed kwargs
+    f_required = list(f_args)
+    candidates = dict(kwargs)
+    candidates.update(override_kwargs)
+    for key, value in candidates.iteritems():
+        if key in f_args:
+            f_required.remove(key)
+
+    # map function arguments to parsed arguments
+    for arg in args:
+        try:
+            kw = f_required.pop(0)
+        except IndexError:
+            parser.error("Too many arguments for command %s: %s" % (command, arg))
+        kwargs[kw] = arg
+
+    # apply overrides
+    kwargs.update(override_kwargs)
+
+    # check if all args are given
+    try:
+        num_defaults = len(f_defaults)
+    except TypeError:
+        num_defaults = 0
+    f_args_default = f_args[len(f_args) - num_defaults:]
+    required = list(set(f_required) - set(f_args_default))
+    if required:
+        parser.error("Not enough arguments for command %s: %s not specified" % (command, ', '.join(required)))
+
+    # handle command
+    try:
+        ret = command_func(**kwargs)
+        if ret is not None:
+            print ret
+    except (exceptions.UsageError, exceptions.KnownError), e:
+        if e.args[0] is None:
+            parser.print_help()
+        parser.error(e.args[0])
+
+if __name__ == "__main__":
+    main()
Index: /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/api.py
===================================================================
--- /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/api.py (revision 3)
+++ /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/api.py (revision 3)
@@ -0,0 +1,367 @@
+"""
+   This module provides an external API to the versioning system.
+
+   .. versionchanged:: 0.4.5 
+    ``--preview_sql`` displays source file when using SQL scripts. If Python script is used,
+    it runs the action with mocked engine and returns captured SQL statements.
+
+   .. versionchanged:: 0.4.5
+    Deprecated ``--echo`` parameter in favour of new :func:`migrate.versioning.util.construct_engine` behavior.
+"""
+
+# Dear migrate developers,
+#
+# please do not comment this module using sphinx syntax because its
+# docstrings are presented as user help and most users cannot
+# interpret sphinx annotated ReStructuredText.
+#
+# Thanks,
+# Jan Dittberner
+
+import sys
+import inspect
+import warnings
+
+from migrate.versioning import (exceptions, repository, schema, version,
+    script as script_) # command name conflict
+from migrate.versioning.util import catch_known_errors, construct_engine
+
+
+__all__ = [
+    'help',
+    'create',
+    'script',
+    'script_sql',
+    'make_update_script_for_model',
+    'version',
+    'source',
+    'version_control',
+    'db_version',
+    'upgrade',
+    'downgrade',
+    'drop_version_control',
+    'manage',
+    'test',
+    'compare_model_to_db',
+    'create_model',
+    'update_db_from_model',
+]
+
+Repository = repository.Repository
+ControlledSchema = schema.ControlledSchema
+VerNum = version.VerNum
+PythonScript = script_.PythonScript
+SqlScript = script_.SqlScript
+
+
+# deprecated
+def help(cmd=None, **opts):
+    """%prog help COMMAND
+
+    Displays help on a given command.
+    """
+    if cmd is None:
+        raise exceptions.UsageError(None)
+    try:
+        func = globals()[cmd]
+    except:
+        raise exceptions.UsageError(
+            "'%s' isn't a valid command. Try 'help COMMAND'" % cmd)
+    ret = func.__doc__
+    if sys.argv[0]:
+        ret = ret.replace('%prog', sys.argv[0])
+    return ret
+
+@catch_known_errors
+def create(repository, name, **opts):
+    """%prog create REPOSITORY_PATH NAME [--table=TABLE]
+
+    Create an empty repository at the specified path.
+
+    You can specify the version_table to be used; by default, it is
+    'migrate_version'.  This table is created in all version-controlled
+    databases.
+    """
+    repo_path = Repository.create(repository, name, **opts)
+
+
+@catch_known_errors
+def script(description, repository, **opts):
+    """%prog script [--repository=REPOSITORY_PATH] DESCRIPTION
+
+    Create an empty change script using the next unused version number
+    appended with the given description.
+
+    For instance, manage.py script "Add initial tables" creates:
+    repository/versions/001_Add_initial_tables.py
+    """
+    repo = Repository(repository)
+    repo.create_script(description, **opts)
+
+
+@catch_known_errors
+def script_sql(database, repository, **opts):
+    """%prog script_sql [--repository=REPOSITORY_PATH] DATABASE
+
+    Create empty change SQL scripts for given DATABASE, where DATABASE
+    is either specific ('postgres', 'mysql', 'oracle', 'sqlite', etc.)
+    or generic ('default').
+
+    For instance, manage.py script_sql postgres creates:
+    repository/versions/001_postgres_upgrade.sql and
+    repository/versions/001_postgres_postgres.sql
+    """
+    repo = Repository(repository)
+    repo.create_script_sql(database, **opts)
+
+
+def test(repository, url=None, **opts):
+    """%prog test REPOSITORY_PATH URL [VERSION]
+
+    Performs the upgrade and downgrade option on the given
+    database. This is not a real test and may leave the database in a
+    bad state. You should therefore better run the test on a copy of
+    your database.
+    """
+    engine = construct_engine(url, **opts)
+    repos = Repository(repository)
+    script = repos.version(None).script()
+
+    # Upgrade
+    print "Upgrading...",
+    script.run(engine, 1)
+    print "done"
+
+    print "Downgrading...",
+    script.run(engine, -1)
+    print "done"
+    print "Success"
+
+
+def version(repository, **opts):
+    """%prog version REPOSITORY_PATH
+
+    Display the latest version available in a repository.
+    """
+    repo = Repository(repository)
+    return repo.latest
+
+
+def source(version, dest=None, repository=None, **opts):
+    """%prog source VERSION [DESTINATION] --repository=REPOSITORY_PATH
+
+    Display the Python code for a particular version in this
+    repository.  Save it to the file at DESTINATION or, if omitted,
+    send to stdout.
+    """
+    if repository is None:
+        raise exceptions.UsageError("A repository must be specified")
+    repo = Repository(repository)
+    ret = repo.version(version).script().source()
+    if dest is not None:
+        dest = open(dest, 'w')
+        dest.write(ret)
+        dest.close()
+        ret = None
+    return ret
+
+
+def version_control(url, repository, version=None, **opts):
+    """%prog version_control URL REPOSITORY_PATH [VERSION]
+
+    Mark a database as under this repository's version control.
+
+    Once a database is under version control, schema changes should
+    only be done via change scripts in this repository.
+
+    This creates the table version_table in the database.
+
+    The url should be any valid SQLAlchemy connection string.
+
+    By default, the database begins at version 0 and is assumed to be
+    empty.  If the database is not empty, you may specify a version at
+    which to begin instead. No attempt is made to verify this
+    version's correctness - the database schema is expected to be
+    identical to what it would be if the database were created from
+    scratch.
+    """
+    engine = construct_engine(url, **opts)
+    ControlledSchema.create(engine, repository, version)
+
+
+def db_version(url, repository, **opts):
+    """%prog db_version URL REPOSITORY_PATH
+
+    Show the current version of the repository with the given
+    connection string, under version control of the specified
+    repository.
+
+    The url should be any valid SQLAlchemy connection string.
+    """
+    engine = construct_engine(url, **opts)
+    schema = ControlledSchema(engine, repository)
+    return schema.version
+
+
+def upgrade(url, repository, version=None, **opts):
+    """%prog upgrade URL REPOSITORY_PATH [VERSION] [--preview_py|--preview_sql]
+
+    Upgrade a database to a later version.
+
+    This runs the upgrade() function defined in your change scripts.
+
+    By default, the database is updated to the latest available
+    version. You may specify a version instead, if you wish.
+
+    You may preview the Python or SQL code to be executed, rather than
+    actually executing it, using the appropriate 'preview' option.
+    """
+    err = "Cannot upgrade a database of version %s to version %s. "\
+        "Try 'downgrade' instead."
+    return _migrate(url, repository, version, upgrade=True, err=err, **opts)
+
+
+def downgrade(url, repository, version, **opts):
+    """%prog downgrade URL REPOSITORY_PATH VERSION [--preview_py|--preview_sql]
+
+    Downgrade a database to an earlier version.
+
+    This is the reverse of upgrade; this runs the downgrade() function
+    defined in your change scripts.
+
+    You may preview the Python or SQL code to be executed, rather than
+    actually executing it, using the appropriate 'preview' option.
+    """
+    err = "Cannot downgrade a database of version %s to version %s. "\
+        "Try 'upgrade' instead."
+    return _migrate(url, repository, version, upgrade=False, err=err, **opts)
+    
+
+def drop_version_control(url, repository, **opts):
+    """%prog drop_version_control URL REPOSITORY_PATH
+
+    Removes version control from a database.
+    """
+    engine = construct_engine(url, **opts)
+    schema = ControlledSchema(engine, repository)
+    schema.drop()
+
+
+def manage(file, **opts):
+    """%prog manage FILENAME VARIABLES...
+
+    Creates a script that runs Migrate with a set of default values.
+
+    For example::
+
+        %prog manage manage.py --repository=/path/to/repository \
+--url=sqlite:///project.db
+
+    would create the script manage.py. The following two commands
+    would then have exactly the same results::
+
+        python manage.py version
+        %prog version --repository=/path/to/repository
+    """
+    return repository.manage(file, **opts)
+
+
+def compare_model_to_db(url, model, repository, **opts):
+    """%prog compare_model_to_db URL MODEL REPOSITORY_PATH
+
+    Compare the current model (assumed to be a module level variable
+    of type sqlalchemy.MetaData) against the current database.
+
+    NOTE: This is EXPERIMENTAL.
+    """  # TODO: get rid of EXPERIMENTAL label
+    engine = construct_engine(url, **opts)
+    print ControlledSchema.compare_model_to_db(engine, model, repository)
+
+
+def create_model(url, repository, **opts):
+    """%prog create_model URL REPOSITORY_PATH
+
+    Dump the current database as a Python model to stdout.
+
+    NOTE: This is EXPERIMENTAL.
+    """  # TODO: get rid of EXPERIMENTAL label
+    engine = construct_engine(url, **opts)
+    declarative = opts.get('declarative', False)
+    print ControlledSchema.create_model(engine, repository, declarative)
+
+
+# TODO: get rid of this? if we don't add back path param
+@catch_known_errors
+def make_update_script_for_model(url, oldmodel, model, repository, **opts):
+    """%prog make_update_script_for_model URL OLDMODEL MODEL REPOSITORY_PATH
+
+    Create a script changing the old Python model to the new (current)
+    Python model, sending to stdout.
+
+    NOTE: This is EXPERIMENTAL.
+    """  # TODO: get rid of EXPERIMENTAL label
+    engine = construct_engine(url, **opts)
+    print PythonScript.make_update_script_for_model(
+        engine, oldmodel, model, repository, **opts)
+
+
+def update_db_from_model(url, model, repository, **opts):
+    """%prog update_db_from_model URL MODEL REPOSITORY_PATH
+
+    Modify the database to match the structure of the current Python
+    model. This also sets the db_version number to the latest in the
+    repository.
+
+    NOTE: This is EXPERIMENTAL.
+    """  # TODO: get rid of EXPERIMENTAL label
+    engine = construct_engine(url, **opts)
+    schema = ControlledSchema(engine, repository)
+    schema.update_db_from_model(model)
+
+
+def _migrate(url, repository, version, upgrade, err, **opts):
+    engine = construct_engine(url, **opts)
+    schema = ControlledSchema(engine, repository)
+    version = _migrate_version(schema, version, upgrade, err)
+
+    changeset = schema.changeset(version)
+    for ver, change in changeset:
+        nextver = ver + changeset.step
+        print '%s -> %s... ' % (ver, nextver)
+
+        if opts.get('preview_sql'):
+            if isinstance(change, PythonScript):
+                print change.preview_sql(url, changeset.step, **opts)
+            elif isinstance(change, SqlScript):
+                print change.source()
+
+        elif opts.get('preview_py'):
+            source_ver = max(ver, nextver)
+            module = schema.repository.version(source_ver).script().module
+            funcname = upgrade and "upgrade" or "downgrade"
+            func = getattr(module, funcname)
+            if isinstance(change, PythonScript):
+                print inspect.getsource(func)
+            else:
+                raise UsageError("Python source can be only displayed"
+                    " for python migration files")
+        else:
+            schema.runchange(ver, change, changeset.step)
+            print 'done'
+
+
+def _migrate_version(schema, version, upgrade, err):
+    if version is None:
+        return version
+    # Version is specified: ensure we're upgrading in the right direction
+    # (current version < target version for upgrading; reverse for down)
+    version = VerNum(version)
+    cur = schema.version
+    if upgrade is not None:
+        if upgrade:
+            direction = cur <= version
+        else:
+            direction = cur >= version
+        if not direction:
+            raise exceptions.KnownError(err % (cur, version))
+    return version
Index: /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/template.py
===================================================================
--- /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/template.py (revision 3)
+++ /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/template.py (revision 3)
@@ -0,0 +1,78 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+import os
+import shutil
+import sys
+from pkg_resources import resource_filename
+
+from migrate.versioning.base import *
+from migrate.versioning import pathed
+
+
+class Packaged(pathed.Pathed):
+    """An object assoc'ed with a Python package"""
+
+    def __init__(self, pkg):
+        self.pkg = pkg
+        path = self._find_path(pkg)
+        super(Packaged, self).__init__(path)
+
+    @classmethod
+    def _find_path(cls, pkg):
+        pkg_name, resource_name = pkg.rsplit('.', 1)
+        ret = resource_filename(pkg_name, resource_name)
+        return ret
+
+class Collection(Packaged):
+    """A collection of templates of a specific type"""
+
+    _default = None
+
+    def get_path(self, file):
+        return os.path.join(self.path, str(file))
+
+    def get_pkg(self, file):
+        return (self.pkg, str(file))
+
+class RepositoryCollection(Collection):
+    _default = 'default'
+
+class ScriptCollection(Collection):
+    _default = 'default.py_tmpl'
+
+class Template(Packaged):
+    """Finds the paths/packages of various Migrate templates"""
+
+    _repository = 'repository'
+    _script = 'script'
+    _manage = 'manage.py_tmpl'
+
+    def __init__(self, pkg):
+        super(Template, self).__init__(pkg)
+        self.repository=RepositoryCollection('.'.join((self.pkg, self._repository)))
+        self.script=ScriptCollection('.'.join((self.pkg, self._script)))
+
+    def get_item(self, attr, filename=None, as_pkg=None, as_str=None):
+        item = getattr(self, attr)
+        if filename is None:
+            filename = getattr(item, '_default')
+        if as_pkg:
+            ret = item.get_pkg(filename)
+            if as_str:
+                ret = '.'.join(ret)
+        else:
+            ret = item.get_path(filename)
+        return ret
+
+    def get_repository(self, filename=None, as_pkg=None, as_str=None):
+        return self.get_item('repository', filename, as_pkg, as_str)
+    
+    def get_script(self, filename=None, as_pkg=None, as_str=None):
+        return self.get_item('script', filename, as_pkg, as_str)
+
+    def manage(self, **k):
+        return (self.pkg, self._manage)
+
+template_pkg = 'migrate.versioning.templates'
+template = Template(template_pkg)
Index: /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/script/py.py
===================================================================
--- /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/script/py.py (revision 3)
+++ /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/script/py.py (revision 3)
@@ -0,0 +1,116 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+import shutil
+from StringIO import StringIO
+
+import migrate
+from migrate.versioning import exceptions, genmodel, schemadiff
+from migrate.versioning.base import operations
+from migrate.versioning.template import template
+from migrate.versioning.script import base
+from migrate.versioning.util import import_path, load_model, construct_engine
+
+class PythonScript(base.BaseScript):
+
+    @classmethod
+    def create(cls, path, **opts):
+        """Create an empty migration script"""
+        cls.require_notfound(path)
+
+        # TODO: Use the default script template (defined in the template
+        # module) for now, but we might want to allow people to specify a
+        # different one later.
+        template_file = None
+        src = template.get_script(template_file)
+        shutil.copy(src, path)
+
+    @classmethod
+    def make_update_script_for_model(cls, engine, oldmodel,
+                                     model, repository, **opts):
+        """Create a migration script"""
+        
+        # Compute differences.
+        if isinstance(repository, basestring):
+            # oh dear, an import cycle!
+            from migrate.versioning.repository import Repository
+            repository = Repository(repository)
+        oldmodel = load_model(oldmodel)
+        model = load_model(model)
+        diff = schemadiff.getDiffOfModelAgainstModel(
+            oldmodel,
+            model,
+            engine,
+            excludeTables=[repository.version_table])
+        decls, upgradeCommands, downgradeCommands = \
+            genmodel.ModelGenerator(diff).toUpgradeDowngradePython()
+
+        # Store differences into file.
+        template_file = None
+        src = template.get_script(template_file)
+        contents = open(src).read()
+        search = 'def upgrade():'
+        contents = contents.replace(search, '\n\n'.join((decls, search)), 1)
+        if upgradeCommands:
+            contents = contents.replace('    pass', upgradeCommands, 1)
+        if downgradeCommands:
+            contents = contents.replace('    pass', downgradeCommands, 1)
+        return contents
+
+    @classmethod
+    def verify_module(cls,path):
+        """Ensure this is a valid script, or raise InvalidScriptError"""
+        # Try to import and get the upgrade() func
+        try:
+            module=import_path(path)
+        except:
+            # If the script itself has errors, that's not our problem
+            raise
+        try:
+            assert callable(module.upgrade)
+        except Exception, e:
+            raise exceptions.InvalidScriptError(path + ': %s' % str(e))
+        return module
+
+    def preview_sql(self, url, step, **args):
+        """Mock engine to store all executable calls in a string \
+        and execute the step"""
+        buf = StringIO()
+        args['engine_arg_strategy'] = 'mock'
+        args['engine_arg_executor'] = lambda s, p='': buf.write(s + p)
+        engine = construct_engine(url, **args)
+
+        self.run(engine, step)
+
+        return buf.getvalue()
+            
+    def run(self, engine, step):
+        """Core method of Script file. \
+            Exectues update() or downgrade() function"""
+        if step > 0:
+            op = 'upgrade'
+        elif step < 0:
+            op = 'downgrade'
+        else:
+            raise exceptions.ScriptError("%d is not a valid step" % step)
+        funcname = base.operations[op]
+        
+        migrate.migrate_engine = engine
+        #migrate.run.migrate_engine = migrate.migrate_engine = engine
+        func = self._func(funcname)
+        func()
+        migrate.migrate_engine = None
+        #migrate.run.migrate_engine = migrate.migrate_engine = None
+
+    @property
+    def module(self):
+        if not hasattr(self,'_module'):
+            self._module = self.verify_module(self.path)
+        return self._module
+
+    def _func(self, funcname):
+        fn = getattr(self.module, funcname, None)
+        if not fn:
+            msg = "The function %s is not defined in this script"
+            raise exceptions.ScriptError(msg%funcname)
+        return fn
Index: /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/script/base.py
===================================================================
--- /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/script/base.py (revision 3)
+++ /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/script/base.py (revision 3)
@@ -0,0 +1,45 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+from migrate.versioning.base import log,operations
+from migrate.versioning import pathed,exceptions
+
+
+class BaseScript(pathed.Pathed):
+    """Base class for other types of scripts
+    All scripts have the following properties:
+
+    source (script.source())
+      The source code of the script
+    version (script.version())
+      The version number of the script
+    operations (script.operations())
+      The operations defined by the script: upgrade(), downgrade() or both.
+      Returns a tuple of operations.
+      Can also check for an operation with ex. script.operation(Script.ops.up)
+    """
+
+    def __init__(self,path):
+        log.info('Loading script %s...' % path)
+        self.verify(path)
+        super(BaseScript, self).__init__(path)
+        log.info('Script %s loaded successfully' % path)
+    
+    @classmethod
+    def verify(cls,path):
+        """Ensure this is a valid script, or raise InvalidScriptError
+        This version simply ensures the script file's existence
+        """
+        try:
+            cls.require_found(path)
+        except:
+            raise exceptions.InvalidScriptError(path)
+
+    def source(self):
+        fd = open(self.path)
+        ret = fd.read()
+        fd.close()
+        return ret
+
+    def run(self, engine):
+        raise NotImplementedError()
Index: /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/script/__init__.py
===================================================================
--- /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/script/__init__.py (revision 3)
+++ /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/script/__init__.py (revision 3)
@@ -0,0 +1,3 @@
+from py import PythonScript
+from sql import SqlScript
+from base import BaseScript
Index: /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/script/sql.py
===================================================================
--- /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/script/sql.py (revision 3)
+++ /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/script/sql.py (revision 3)
@@ -0,0 +1,27 @@
+from migrate.versioning.script import base
+
+class SqlScript(base.BaseScript):
+    """A file containing plain SQL statements."""
+    def run(self, engine, step):
+        text = self.source()
+        # Don't rely on SA's autocommit here
+        # (SA uses .startswith to check if a commit is needed. What if script
+        # starts with a comment?)
+        conn = engine.connect()
+        try:
+            trans = conn.begin()
+            try:
+                # ###HACK: SQLite doesn't allow multiple statements through
+                # its execute() method, but it provides executescript() instead
+                dbapi = conn.engine.raw_connection()
+                if getattr(dbapi, 'executescript', None):
+                    dbapi.executescript(text)
+                else:
+                    conn.execute(text)
+                # Success
+                trans.commit()
+            except:
+                trans.rollback()
+                raise
+        finally:
+            conn.close()
Index: /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/repository.py
===================================================================
--- /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/repository.py (revision 3)
+++ /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/repository.py (revision 3)
@@ -0,0 +1,184 @@
+"""
+   SQLAlchemy migrate repository management.
+"""
+import os
+import shutil
+import string
+from pkg_resources import resource_string, resource_filename
+
+from migrate.versioning import exceptions, script, version, pathed, cfgparse
+from migrate.versioning.template import template
+from migrate.versioning.base import *
+
+
+class Changeset(dict):
+    """A collection of changes to be applied to a database.
+
+    Changesets are bound to a repository and manage a set of logsql
+    scripts from that repository.
+
+    Behaves like a dict, for the most part. Keys are ordered based on
+    start/end.
+    """
+
+    def __init__(self, start, *changes, **k):
+        """
+        Give a start version; step must be explicitly stated.
+        """
+        self.step = k.pop('step', 1)
+        self.start = version.VerNum(start)
+        self.end = self.start
+        for change in changes:
+            self.add(change)
+
+    def __iter__(self):
+        return iter(self.items())
+
+    def keys(self):
+        """
+        In a series of upgrades x -> y, keys are version x. Sorted.
+        """
+        ret = super(Changeset, self).keys()
+        # Reverse order if downgrading
+        ret.sort(reverse=(self.step < 1))
+        return ret
+
+    def values(self):
+        return [self[k] for k in self.keys()]
+
+    def items(self):
+        return zip(self.keys(), self.values())
+
+    def add(self, change):
+        key = self.end
+        self.end += self.step
+        self[key] = change
+
+    def run(self, *p, **k):
+        for version, script in self:
+            script.run(*p, **k)
+
+
+class Repository(pathed.Pathed):
+    """A project's change script repository"""
+    _config = 'migrate.cfg'
+    _versions = 'versions'
+
+    def __init__(self, path):
+        log.info('Loading repository %s...' % path)
+        self.verify(path)
+        super(Repository, self).__init__(path)
+        self.config=cfgparse.Config(os.path.join(self.path, self._config))
+        self.versions=version.Collection(os.path.join(self.path,
+                                                      self._versions))
+        log.info('Repository %s loaded successfully' % path)
+        log.debug('Config: %r' % self.config.to_dict())
+
+    @classmethod
+    def verify(cls, path):
+        """
+        Ensure the target path is a valid repository.
+
+        :raises: :exc:`InvalidRepositoryError` if not valid
+        """
+        # Ensure the existance of required files
+        try:
+            cls.require_found(path)
+            cls.require_found(os.path.join(path, cls._config))
+            cls.require_found(os.path.join(path, cls._versions))
+        except exceptions.PathNotFoundError, e:
+            raise exceptions.InvalidRepositoryError(path)
+
+    @classmethod
+    def prepare_config(cls, pkg, rsrc, name, **opts):
+        """
+        Prepare a project configuration file for a new project.
+        """
+        # Prepare opts
+        defaults=dict(
+            version_table='migrate_version',
+            repository_id=name,
+            required_dbs=[], )
+        for key, val in defaults.iteritems():
+            if (key not in opts) or (opts[key] is None):
+                opts[key]=val
+
+        tmpl = resource_string(pkg, rsrc)
+        ret = string.Template(tmpl).substitute(opts)
+        return ret
+
+    @classmethod
+    def create(cls, path, name, **opts):
+        """Create a repository at a specified path"""
+        cls.require_notfound(path)
+
+        pkg, rsrc = template.get_repository(as_pkg=True)
+        tmplpkg = '.'.join((pkg, rsrc))
+        tmplfile = resource_filename(pkg, rsrc)
+        config_text = cls.prepare_config(tmplpkg, cls._config, name, **opts)
+        # Create repository
+        try:
+            shutil.copytree(tmplfile, path)
+            # Edit config defaults
+            fd = open(os.path.join(path, cls._config), 'w')
+            fd.write(config_text)
+            fd.close()
+            # Create a management script
+            manager = os.path.join(path, 'manage.py')
+            manage(manager, repository=path)
+        except:
+            log.error("There was an error creating your repository")
+        return cls(path)
+
+    def create_script(self, description, **k):
+        self.versions.create_new_python_version(description, **k)
+
+    def create_script_sql(self, database, **k):
+        self.versions.create_new_sql_version(database, **k)
+
+    latest=property(lambda self: self.versions.latest)
+    version_table=property(lambda self: self.config.get('db_settings',
+                                                        'version_table'))
+    id=property(lambda self: self.config.get('db_settings', 'repository_id'))
+
+    def version(self, *p, **k):
+        return self.versions.version(*p, **k)
+
+    @classmethod
+    def clear(cls):
+        super(Repository, cls).clear()
+        version.Collection.clear()
+
+    def changeset(self, database, start, end=None):
+        """
+        Create a changeset to migrate this dbms from ver. start to end/latest.
+        """
+        start = version.VerNum(start)
+        if end is None:
+            end = self.latest
+        else:
+            end = version.VerNum(end)
+        if start <= end:
+            step = 1
+            range_mod = 1
+            op = 'upgrade'
+        else:
+            step = -1
+            range_mod = 0
+            op = 'downgrade'
+        versions = range(start+range_mod, end+range_mod, step)
+        changes = [self.version(v).script(database, op) for v in versions]
+        ret = Changeset(start, step=step, *changes)
+        return ret
+
+
+def manage(file, **opts):
+    """Create a project management script"""
+    pkg, rsrc = template.manage(as_pkg=True)
+    tmpl = resource_string(pkg, rsrc)
+    vars = ",".join(["%s='%s'" % vars for vars in opts.iteritems()])
+    result = tmpl%dict(defaults=vars)
+
+    fd = open(file, 'w')
+    fd.write(result)
+    fd.close()
Index: /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/exceptions.py
===================================================================
--- /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/exceptions.py (revision 3)
+++ /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/exceptions.py (revision 3)
@@ -0,0 +1,87 @@
+"""
+   Provide exception classes for :mod:`migrate.versioning`
+"""
+
+
+class Error(Exception):
+    """Error base class."""
+    pass
+
+
+class ApiError(Error):
+    """Base class for API errors."""
+    pass
+
+
+class KnownError(ApiError):
+    """A known error condition."""
+
+
+class UsageError(ApiError):
+    """A known error condition where help should be displayed."""
+
+
+class ControlledSchemaError(Error):
+    """Base class for controlled schema errors."""
+    pass
+
+
+class InvalidVersionError(ControlledSchemaError):
+    """Invalid version number."""
+
+
+class DatabaseNotControlledError(ControlledSchemaError):
+    """Database should be under version control, but it's not."""
+
+
+class DatabaseAlreadyControlledError(ControlledSchemaError):
+    """Database shouldn't be under version control, but it is"""
+
+
+class WrongRepositoryError(ControlledSchemaError):
+    """This database is under version control by another repository."""
+
+
+class NoSuchTableError(ControlledSchemaError):
+    """The table does not exist."""
+    pass
+
+
+class PathError(Error):
+    """Base class for path errors."""
+    pass
+
+
+class PathNotFoundError(PathError):
+    """A path with no file was required; found a file."""
+    pass
+
+
+class PathFoundError(PathError):
+    """A path with a file was required; found no file."""
+    pass
+
+
+class RepositoryError(Error):
+    """Base class for repository errors."""
+    pass
+
+
+class InvalidRepositoryError(RepositoryError):
+    """Invalid repository error."""
+    pass
+
+
+class ScriptError(Error):
+    """Base class for script errors."""
+    pass
+
+
+class InvalidScriptError(ScriptError):
+    """Invalid script error."""
+    pass
+
+
+class InvalidVersionError(Error):
+    """Invalid version error."""
+    pass
Index: /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/base/__init__.py
===================================================================
--- /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/base/__init__.py (revision 3)
+++ /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/base/__init__.py (revision 3)
@@ -0,0 +1,5 @@
+"""Things that should be imported by all migrate packages"""
+
+#__all__ = ['logging','log','databases','operations']
+from logger import logging,log
+from const import databases,operations
Index: /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/base/logger.py
===================================================================
--- /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/base/logger.py (revision 3)
+++ /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/base/logger.py (revision 3)
@@ -0,0 +1,9 @@
+"""Manages logging (to stdout) for our versioning system.
+"""
+import logging
+
+log=logging.getLogger('migrate.versioning')
+log.setLevel(logging.WARNING)
+log.addHandler(logging.StreamHandler())
+
+__all__=['log','logging']
Index: /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/base/const.py
===================================================================
--- /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/base/const.py (revision 3)
+++ /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/base/const.py (revision 3)
@@ -0,0 +1,10 @@
+__all__ = ['databases','operations']
+
+#databases = ('sqlite','postgres','mysql','oracle','mssql','firebird')
+databases = ('sqlite','postgres','mysql','oracle','mssql')
+
+# Map operation names to function names
+from sqlalchemy.util import OrderedDict
+operations = OrderedDict()
+operations['upgrade'] = 'upgrade'
+operations['downgrade'] = 'downgrade'
Index: /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/version.py
===================================================================
--- /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/version.py (revision 3)
+++ /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/version.py (revision 3)
@@ -0,0 +1,219 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+import os
+import re
+import shutil
+
+from migrate.versioning import exceptions, pathed, script
+
+
+class VerNum(object):
+    """A version number"""
+
+    _instances = dict()
+
+    def __new__(cls, value):
+        val = str(value)
+        if val not in cls._instances:
+            cls._instances[val] = super(VerNum, cls).__new__(cls)
+        ret = cls._instances[val]
+        return ret
+
+    def __init__(self,value):
+        self.value = str(int(value))
+        if self < 0:
+            raise ValueError("Version number cannot be negative")
+
+    def __add__(self, value):
+        ret = int(self) + int(value)
+        return VerNum(ret)
+
+    def __sub__(self, value):
+        return self + (int(value) * -1)
+
+    def __cmp__(self, value):
+        return int(self) - int(value)
+
+    def __repr__(self):
+        return "<VerNum(%s)>" % self.value
+
+    def __str__(self):
+        return str(self.value)
+
+    def __int__(self):
+        return int(self.value)
+
+
+class Collection(pathed.Pathed):
+    """A collection of versioning scripts in a repository"""
+
+    FILENAME_WITH_VERSION = re.compile(r'^(\d{3,}).*')
+
+    def __init__(self, path):
+        """Collect current version scripts in repository"""
+        super(Collection, self).__init__(path)
+        
+        # Create temporary list of files, allowing skipped version numbers.
+        files = os.listdir(path)
+        if '1' in files:
+            # deprecation
+            raise Exception('It looks like you have a repository in the old '
+                'format (with directories for each version). '
+                'Please convert repository before proceeding.')
+
+        tempVersions = dict()
+        for filename in files:
+            match = self.FILENAME_WITH_VERSION.match(filename)
+            if match:
+                num = int(match.group(1))
+                tempVersions.setdefault(num, []).append(filename)
+            else:
+                pass  # Must be a helper file or something, let's ignore it.
+
+        # Create the versions member where the keys
+        # are VerNum's and the values are Version's.
+        self.versions = dict()
+        for num, files in tempVersions.items():
+            self.versions[VerNum(num)] = Version(num, path, files)
+
+    @property
+    def latest(self):
+        return max([VerNum(0)] + self.versions.keys())
+
+    def create_new_python_version(self, description, **k):
+        """Create Python files for new version"""
+        ver = self.latest + 1
+        extra = str_to_filename(description)
+
+        if extra:
+            if extra == '_':
+                extra = ''
+            elif not extra.startswith('_'):
+                extra = '_%s' % extra
+
+        filename = '%03d%s.py' % (ver, extra)
+        filepath = self._version_path(filename)
+
+        if os.path.exists(filepath):
+            raise Exception('Script already exists: %s' % filepath)
+        else:
+            script.PythonScript.create(filepath)
+
+        self.versions[ver] = Version(ver, self.path, [filename])
+        
+    def create_new_sql_version(self, database, **k):
+        """Create SQL files for new version"""
+        ver = self.latest + 1
+        self.versions[ver] = Version(ver, self.path, [])
+
+        # Create new files.
+        for op in ('upgrade', 'downgrade'):
+            filename = '%03d_%s_%s.sql' % (ver, database, op)
+            filepath = self._version_path(filename)
+            if os.path.exists(filepath):
+                raise Exception('Script already exists: %s' % filepath)
+            else:
+                open(filepath, "w").close()
+            self.versions[ver].add_script(filepath)
+        
+    def version(self, vernum=None):
+        """Returns latest Version if vernum is not given. \
+        Otherwise, returns wanted version"""
+        if vernum is None:
+            vernum = self.latest
+        return self.versions[VerNum(vernum)]
+
+    @classmethod
+    def clear(cls):
+        super(Collection, cls).clear()
+
+    def _version_path(self, ver):
+        """Returns path of file in versions repository"""
+        return os.path.join(self.path, str(ver))
+
+
+class Version(object):
+    """A single version in a collection """
+
+    def __init__(self, vernum, path, filelist):
+        self.version = VerNum(vernum)
+
+        # Collect scripts in this folder
+        self.sql = dict()
+        self.python = None
+
+        for script in filelist:
+            self.add_script(os.path.join(path, script))
+    
+    def script(self, database=None, operation=None):
+        """Returns SQL or Python Script"""
+        for db in (database, 'default'):
+            # Try to return a .sql script first
+            try:
+                return self.sql[db][operation]
+            except KeyError:
+                continue  # No .sql script exists
+
+        # TODO: maybe add force Python parameter?
+        ret = self.python
+
+        assert ret is not None
+        return ret
+
+    # deprecated?
+    @classmethod
+    def create(cls, path):
+        os.mkdir(path)
+        # create the version as a proper Python package
+        initfile = os.path.join(path, "__init__.py")
+        if not os.path.exists(initfile):
+            # just touch the file
+            open(initfile, "w").close()
+        try:
+            ret = cls(path)
+        except:
+            os.rmdir(path)
+            raise
+        return ret
+
+    def add_script(self, path):
+        """Add script to Collection/Version"""
+        if path.endswith(Extensions.py):
+            self._add_script_py(path)
+        elif path.endswith(Extensions.sql):
+            self._add_script_sql(path)
+
+    SQL_FILENAME = re.compile(r'^(\d+)_([^_]+)_([^_]+).sql')
+
+    def _add_script_sql(self, path):
+        match = self.SQL_FILENAME.match(os.path.basename(path))
+
+        if match:
+            version, dbms, op = match.group(1), match.group(2), match.group(3)
+        else:
+            raise exceptions.ScriptError("Invalid SQL script name %s" % path)
+
+        # File the script into a dictionary
+        self.sql.setdefault(dbms, {})[op] = script.SqlScript(path)
+
+    def _add_script_py(self, path):
+        if self.python is not None:
+            raise Exception('You can only have one Python script per version,'
+                ' but you have: %s and %s' % (self.python, path))
+        self.python = script.PythonScript(path)
+
+class Extensions:
+    """A namespace for file extensions"""
+    py = 'py'
+    sql = 'sql'
+
+def str_to_filename(s):
+    """Replaces spaces, (double and single) quotes
+    and double underscores to underscores
+    """
+
+    s = s.replace(' ', '_').replace('"', '_').replace("'", '_')
+    while '__' in s:
+        s = s.replace('__', '_')
+    return s
Index: /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/util/__init__.py
===================================================================
--- /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/util/__init__.py (revision 3)
+++ /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/util/__init__.py (revision 3)
@@ -0,0 +1,122 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+import warnings
+from decorator import decorator
+from pkg_resources import EntryPoint
+
+from sqlalchemy import create_engine
+
+from migrate.versioning import exceptions
+from migrate.versioning.util.keyedinstance import KeyedInstance
+from migrate.versioning.util.importpath import import_path
+
+
+def load_model(dotted_name):
+    """Import module and use module-level variable".
+
+    :param dotted_name: path to model in form of string: ``some.python.module:Class``
+    
+    .. versionchanged:: 0.5.4
+
+    """
+    if isinstance(dotted_name, basestring):
+        if ':' not in dotted_name:
+            # backwards compatibility
+            warnings.warn('model should be in form of module.model:User '
+                'and not module.model.User', DeprecationWarning)
+            dotted_name = ':'.join(dotted_name.rsplit('.', 1))
+        return EntryPoint.parse('x=%s' % dotted_name).load(False)
+    else:
+        # Assume it's already loaded.
+        return dotted_name
+
+def asbool(obj):
+    """Do everything to use object as bool"""
+    if isinstance(obj, (str, unicode)):
+        obj = obj.strip().lower()
+        if obj in ['true', 'yes', 'on', 'y', 't', '1']:
+            return True
+        elif obj in ['false', 'no', 'off', 'n', 'f', '0']:
+            return False
+        else:
+            raise ValueError("String is not true/false: %r" % obj)
+    if obj in (True, False):
+        return bool(obj)
+    else:
+        raise ValueError("String is not true/false: %r" % obj)
+
+def guess_obj_type(obj):
+    """Do everything to guess object type from string
+    
+    Tries to convert to `int`, `bool` and finally returns if not succeded.
+    
+    .. versionadded: 0.5.4
+    """
+
+    result = None
+
+    try:
+        result = int(obj)
+    except:
+        pass
+
+    if result is None:
+        try:
+            result = asbool(obj)
+        except:
+            pass
+
+    if result is not None:
+        return result
+    else:
+        return obj
+
+@decorator
+def catch_known_errors(f, *a, **kw):
+    """Decorator that catches known api errors
+    
+    .. versionadded: 0.5.4
+    """
+
+    try:
+        f(*a, **kw)
+    except exceptions.PathFoundError, e:
+        raise exceptions.KnownError("The path %s already exists" % e.args[0])
+
+def construct_engine(url, **opts):
+    """.. versionadded:: 0.5.4
+
+    Constructs and returns SQLAlchemy engine.
+
+    Currently, there are 2 ways to pass create_engine options to :mod:`migrate.versioning.api` functions:
+
+    :param engine_dict: python dictionary of options to pass to `create_engine`
+    :param engine_arg_*: keyword parameters to pass to `create_engine` (evaluated with :func:`migrate.versioning.util.guess_obj_type`)
+
+    .. note::
+
+        keyword parameters override ``engine_dict`` values.
+
+    """
+    
+    # get options for create_engine
+    if opts.get('engine_dict') and isinstance(opts['engine_dict'], dict):
+        kwargs = opts['engine_dict']
+    else:
+        kwargs = dict()
+
+    # DEPRECATED: handle echo the old way
+    echo = asbool(opts.get('echo', False))
+    if echo:
+        warnings.warn('echo=True parameter is deprecated, pass '
+            'engine_arg_echo=True or engine_dict={"echo": True}',
+            DeprecationWarning)
+        kwargs['echo'] = echo
+    
+    # parse keyword arguments
+    for key, value in opts.iteritems():
+        if key.startswith('engine_arg_'):
+            kwargs[key[11:]] = guess_obj_type(value)
+    
+    return create_engine(url, **kwargs)
Index: /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/util/keyedinstance.py
===================================================================
--- /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/util/keyedinstance.py (revision 3)
+++ /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/util/keyedinstance.py (revision 3)
@@ -0,0 +1,36 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+class KeyedInstance(object):
+    """A class whose instances have a unique identifier of some sort
+    No two instances with the same unique ID should exist - if we try to create
+    a second instance, the first should be returned. 
+    """
+
+    _instances = dict()
+
+    def __new__(cls, *p, **k):
+        instances = cls._instances
+        clskey = str(cls)
+        if clskey not in instances:
+            instances[clskey] = dict()
+        instances = instances[clskey]
+
+        key = cls._key(*p, **k)
+        if key not in instances:
+            instances[key] = super(KeyedInstance, cls).__new__(cls)
+        return instances[key]
+
+    @classmethod
+    def _key(cls, *p, **k):
+        """Given a unique identifier, return a dictionary key
+        This should be overridden by child classes, to specify which parameters 
+        should determine an object's uniqueness
+        """
+        raise NotImplementedError()
+
+    @classmethod
+    def clear(cls):
+        # Allow cls.clear() as well as uniqueInstance.clear(cls)
+        if str(cls) in cls._instances:
+            del cls._instances[str(cls)]
Index: /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/util/importpath.py
===================================================================
--- /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/util/importpath.py (revision 3)
+++ /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/util/importpath.py (revision 3)
@@ -0,0 +1,16 @@
+import os
+import sys
+
+def import_path(fullpath):
+    """ Import a file with full path specification. Allows one to
+        import from anywhere, something __import__ does not do. 
+    """
+    # http://zephyrfalcon.org/weblog/arch_d7_2002_08_31.html
+    path, filename = os.path.split(fullpath)
+    filename, ext = os.path.splitext(filename)
+    sys.path.append(path)
+    module = __import__(filename)
+    reload(module) # Might be out of date during tests
+    del sys.path[-1]
+    return module
+
Index: /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/migrate_repository.py
===================================================================
--- /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/migrate_repository.py (revision 3)
+++ /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/versioning/migrate_repository.py (revision 3)
@@ -0,0 +1,97 @@
+"""
+   Script to migrate repository from sqlalchemy <= 0.4.4 to the new
+   repository schema. This shouldn't use any other migrate modules, so
+   that it can work in any version.
+"""
+
+import os
+import sys
+
+
+def usage():
+    """Gives usage information."""
+    print """Usage: %(prog)s repository-to-migrate
+
+    Upgrade your repository to the new flat format.
+
+    NOTE: You should probably make a backup before running this.
+    """ % {'prog': sys.argv[0]}
+
+    sys.exit(1)
+
+
+def delete_file(filepath):
+    """Deletes a file and prints a message."""
+    print '    Deleting file: %s' % filepath
+    os.remove(filepath)
+
+
+def move_file(src, tgt):
+    """Moves a file and prints a message."""
+    print '    Moving file %s to %s' % (src, tgt)
+    if os.path.exists(tgt):
+        raise Exception(
+            'Cannot move file %s because target %s already exists' % \
+                (src, tgt))
+    os.rename(src, tgt)
+
+
+def delete_directory(dirpath):
+    """Delete a directory and print a message."""
+    print '    Deleting directory: %s' % dirpath
+    os.rmdir(dirpath)
+
+
+def migrate_repository(repos):
+    """Does the actual migration to the new repository format."""
+    print 'Migrating repository at: %s to new format' % repos
+    versions = '%s/versions' % repos
+    dirs = os.listdir(versions)
+    # Only use int's in list.
+    numdirs = [int(dirname) for dirname in dirs if dirname.isdigit()]
+    numdirs.sort()  # Sort list.
+    for dirname in numdirs:
+        origdir = '%s/%s' % (versions, dirname)
+        print '  Working on directory: %s' % origdir
+        files = os.listdir(origdir)
+        files.sort()
+        for filename in files:
+            # Delete compiled Python files.
+            if filename.endswith('.pyc') or filename.endswith('.pyo'):
+                delete_file('%s/%s' % (origdir, filename))
+
+            # Delete empty __init__.py files.
+            origfile = '%s/__init__.py' % origdir
+            if os.path.exists(origfile) and len(open(origfile).read()) == 0:
+                delete_file(origfile)
+
+            # Move sql upgrade scripts.
+            if filename.endswith('.sql'):
+                version, dbms, operation = filename.split('.', 3)[0:3]
+                origfile = '%s/%s' % (origdir, filename)
+                # For instance:  2.postgres.upgrade.sql ->
+                #  002_postgres_upgrade.sql
+                tgtfile = '%s/%03d_%s_%s.sql' % (
+                    versions, int(version), dbms, operation)
+                move_file(origfile, tgtfile)
+
+        # Move Python upgrade script.
+        pyfile = '%s.py' % dirname
+        pyfilepath = '%s/%s' % (origdir, pyfile)
+        if os.path.exists(pyfilepath):
+            tgtfile = '%s/%03d.py' % (versions, int(dirname))
+            move_file(pyfilepath, tgtfile)
+
+        # Try to remove directory. Will fail if it's not empty.
+        delete_directory(origdir)
+
+
+def main():
+    """Main function to be called when using this script."""
+    if len(sys.argv) != 2:
+        usage()
+    migrate_repository(sys.argv[1])
+
+
+if __name__ == '__main__':
+    main()
Index: /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/__init__.py
===================================================================
--- /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/__init__.py (revision 3)
+++ /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/migrate/__init__.py (revision 3)
@@ -0,0 +1,6 @@
+"""
+   SQLAlchemy migrate provides two APIs :mod:`migrate.versioning` for
+   database schema version and repository management and
+   :mod:`migrate.changeset` that allows to define database schema changes
+   using Python.
+"""
Index: /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/EGG-INFO/SOURCES.txt
===================================================================
--- /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/EGG-INFO/SOURCES.txt (revision 3)
+++ /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/EGG-INFO/SOURCES.txt (revision 3)
@@ -0,0 +1,104 @@
+CHANGELOG
+MANIFEST.in
+README
+TODO
+scramble.py
+setup.cfg
+setup.py
+test_db.cfg.tmpl
+docs/Makefile
+docs/api.rst
+docs/changelog.rst
+docs/changeset.rst
+docs/conf.py
+docs/download.rst
+docs/index.rst
+docs/tools.rst
+docs/versioning.rst
+docs/historical/ProjectDesignDecisionsAutomation.trac
+docs/historical/ProjectDesignDecisionsScriptFormat.trac
+docs/historical/ProjectDesignDecisionsVersioning.trac
+docs/historical/ProjectDetailedDesign.trac
+docs/historical/ProjectGoals.trac
+docs/historical/ProjectProposal.txt
+docs/historical/RepositoryFormat.trac
+docs/historical/RepositoryFormat2.trac
+docs/theme/almodovar.css
+docs/theme/layout.css
+docs/theme/layout.html
+migrate/__init__.py
+migrate/changeset/__init__.py
+migrate/changeset/ansisql.py
+migrate/changeset/constraint.py
+migrate/changeset/exceptions.py
+migrate/changeset/schema.py
+migrate/changeset/databases/__init__.py
+migrate/changeset/databases/mysql.py
+migrate/changeset/databases/oracle.py
+migrate/changeset/databases/postgres.py
+migrate/changeset/databases/sqlite.py
+migrate/changeset/databases/visitor.py
+migrate/versioning/__init__.py
+migrate/versioning/api.py
+migrate/versioning/cfgparse.py
+migrate/versioning/exceptions.py
+migrate/versioning/genmodel.py
+migrate/versioning/migrate_repository.py
+migrate/versioning/pathed.py
+migrate/versioning/repository.py
+migrate/versioning/schema.py
+migrate/versioning/schemadiff.py
+migrate/versioning/shell.py
+migrate/versioning/template.py
+migrate/versioning/version.py
+migrate/versioning/base/__init__.py
+migrate/versioning/base/const.py
+migrate/versioning/base/logger.py
+migrate/versioning/script/__init__.py
+migrate/versioning/script/base.py
+migrate/versioning/script/py.py
+migrate/versioning/script/sql.py
+migrate/versioning/templates/__init__.py
+migrate/versioning/templates/manage.py_tmpl
+migrate/versioning/templates/repository/__init__.py
+migrate/versioning/templates/repository/default/README
+migrate/versioning/templates/repository/default/__init__.py
+migrate/versioning/templates/repository/default/migrate.cfg
+migrate/versioning/templates/repository/default/versions/__init__.py
+migrate/versioning/templates/script/__init__.py
+migrate/versioning/templates/script/default.py_tmpl
+migrate/versioning/templates/script/logsql.py_tmpl
+migrate/versioning/util/__init__.py
+migrate/versioning/util/importpath.py
+migrate/versioning/util/keyedinstance.py
+sqlalchemy_migrate.egg-info/PKG-INFO
+sqlalchemy_migrate.egg-info/SOURCES.txt
+sqlalchemy_migrate.egg-info/dependency_links.txt
+sqlalchemy_migrate.egg-info/entry_points.txt
+sqlalchemy_migrate.egg-info/requires.txt
+sqlalchemy_migrate.egg-info/top_level.txt
+test/__init__.py
+test/changeset/__init__.py
+test/changeset/test_changeset.py
+test/changeset/test_constraint.py
+test/fixture/__init__.py
+test/fixture/base.py
+test/fixture/database.py
+test/fixture/pathed.py
+test/fixture/shell.py
+test/integrated/__init__.py
+test/integrated/test_docs.py
+test/versioning/__init__.py
+test/versioning/test_cfgparse.py
+test/versioning/test_database.py
+test/versioning/test_keyedinstance.py
+test/versioning/test_pathed.py
+test/versioning/test_repository.py
+test/versioning/test_runchangeset.py
+test/versioning/test_schema.py
+test/versioning/test_schemadiff.py
+test/versioning/test_script.py
+test/versioning/test_shell.py
+test/versioning/test_template.py
+test/versioning/test_util.py
+test/versioning/test_version.py
Index: /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/EGG-INFO/top_level.txt
===================================================================
--- /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/EGG-INFO/top_level.txt (revision 3)
+++ /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/EGG-INFO/top_level.txt (revision 3)
@@ -0,0 +1,1 @@
+migrate
Index: /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/EGG-INFO/PKG-INFO
===================================================================
--- /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/EGG-INFO/PKG-INFO (revision 3)
+++ /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/EGG-INFO/PKG-INFO (revision 3)
@@ -0,0 +1,14 @@
+Metadata-Version: 1.0
+Name: sqlalchemy-migrate
+Version: 0.5.4
+Summary: Database schema migration for SQLAlchemy
+Home-page: http://code.google.com/p/sqlalchemy-migrate/
+Author: Jan Dittberner
+Author-email: jan@dittberner.info
+License: MIT
+Description: 
+        Inspired by Ruby on Rails' migrations, Migrate provides a way to deal with database schema changes in `SQLAlchemy <http://sqlalchemy.org>`_ projects.
+        
+        Migrate extends SQLAlchemy to have database changeset handling. It provides a database change repository mechanism which can be used from the command line as well as from inside python code.
+        
+Platform: UNKNOWN
Index: /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/EGG-INFO/entry_points.txt
===================================================================
--- /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/EGG-INFO/entry_points.txt (revision 3)
+++ /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/EGG-INFO/entry_points.txt (revision 3)
@@ -0,0 +1,5 @@
+
+    [console_scripts]
+    migrate = migrate.versioning.shell:main
+    migrate-repository = migrate.versioning.migrate_repository:main
+    
Index: /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/EGG-INFO/dependency_links.txt
===================================================================
--- /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/EGG-INFO/dependency_links.txt (revision 3)
+++ /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/EGG-INFO/dependency_links.txt (revision 3)
@@ -0,0 +1,1 @@
+
Index: /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/EGG-INFO/not-zip-safe
===================================================================
--- /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/EGG-INFO/not-zip-safe (revision 3)
+++ /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/EGG-INFO/not-zip-safe (revision 3)
@@ -0,0 +1,1 @@
+
Index: /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/EGG-INFO/requires.txt
===================================================================
--- /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/EGG-INFO/requires.txt (revision 3)
+++ /galaxy-central/eggs/sqlalchemy_migrate-0.5.4-py2.6.egg/EGG-INFO/requires.txt (revision 3)
@@ -0,0 +1,5 @@
+sqlalchemy >= 0.5
+decorator
+
+[docs]
+sphinx >= 0.5
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/EGG-INFO/SOURCES.txt
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/EGG-INFO/SOURCES.txt (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/EGG-INFO/SOURCES.txt (revision 3)
@@ -0,0 +1,188 @@
+scramble.py
+setup.cfg
+setup.py
+Paste.egg-info/PKG-INFO
+Paste.egg-info/SOURCES.txt
+Paste.egg-info/dependency_links.txt
+Paste.egg-info/entry_points.txt
+Paste.egg-info/namespace_packages.txt
+Paste.egg-info/not-zip-safe
+Paste.egg-info/requires.txt
+Paste.egg-info/top_level.txt
+docs/DeveloperGuidelines.txt
+docs/StyleGuide.txt
+docs/default.css
+docs/develop-example.txt
+docs/developer-features.txt
+docs/do-it-yourself-framework.txt
+docs/enabled.txt
+docs/index.txt
+docs/install-example.txt
+docs/license.txt
+docs/news.txt
+docs/package_index.txt
+docs/paste-httpserver-threadpool.txt
+docs/related-projects.txt
+docs/test_server.ini
+docs/testing-applications.txt
+docs/url-parsing-with-wsgi.txt
+docs/community/index.txt
+docs/community/mailing-list.txt
+docs/community/repository.txt
+docs/download/index.txt
+docs/include/contact.txt
+docs/include/reference_header.txt
+docs/web/default-site.css
+docs/web/index.txt
+docs/web/site.js
+docs/web/style.css
+paste/__init__.py
+paste/cascade.py
+paste/cgiapp.py
+paste/cgitb_catcher.py
+paste/config.py
+paste/errordocument.py
+paste/fileapp.py
+paste/fixture.py
+paste/flup_session.py
+paste/gzipper.py
+paste/httpexceptions.py
+paste/httpheaders.py
+paste/httpserver.py
+paste/lint.py
+paste/modpython.py
+paste/pony.py
+paste/progress.py
+paste/proxy.py
+paste/recursive.py
+paste/registry.py
+paste/reloader.py
+paste/request.py
+paste/response.py
+paste/session.py
+paste/transaction.py
+paste/translogger.py
+paste/url.py
+paste/urlmap.py
+paste/urlparser.py
+paste/wsgilib.py
+paste/wsgiwrappers.py
+paste/auth/__init__.py
+paste/auth/auth_tkt.py
+paste/auth/basic.py
+paste/auth/cas.py
+paste/auth/cookie.py
+paste/auth/digest.py
+paste/auth/form.py
+paste/auth/grantip.py
+paste/auth/multi.py
+paste/auth/open_id.py
+paste/debug/__init__.py
+paste/debug/debugapp.py
+paste/debug/doctest_webapp.py
+paste/debug/fsdiff.py
+paste/debug/prints.py
+paste/debug/profile.py
+paste/debug/testserver.py
+paste/debug/watchthreads.py
+paste/debug/wdg_validate.py
+paste/evalexception/__init__.py
+paste/evalexception/evalcontext.py
+paste/evalexception/middleware.py
+paste/evalexception/media/debug.js
+paste/evalexception/media/minus.jpg
+paste/evalexception/media/plus.jpg
+paste/evalexception/mochikit/MochiKit.js
+paste/evalexception/mochikit/__package__.js
+paste/exceptions/__init__.py
+paste/exceptions/collector.py
+paste/exceptions/errormiddleware.py
+paste/exceptions/formatter.py
+paste/exceptions/reporter.py
+paste/exceptions/serial_number_generator.py
+paste/util/PySourceColor.py
+paste/util/UserDict24.py
+paste/util/__init__.py
+paste/util/classinit.py
+paste/util/classinstance.py
+paste/util/converters.py
+paste/util/dateinterval.py
+paste/util/datetimeutil.py
+paste/util/doctest24.py
+paste/util/filemixin.py
+paste/util/finddata.py
+paste/util/findpackage.py
+paste/util/import_string.py
+paste/util/intset.py
+paste/util/ip4.py
+paste/util/killthread.py
+paste/util/looper.py
+paste/util/mimeparse.py
+paste/util/multidict.py
+paste/util/quoting.py
+paste/util/scgiserver.py
+paste/util/string24.py
+paste/util/subprocess24.py
+paste/util/template.py
+paste/util/threadedprint.py
+paste/util/threadinglocal.py
+tests/conftest.py
+tests/test_cgiapp.py
+tests/test_cgitb_catcher.py
+tests/test_config.py
+tests/test_doctests.py
+tests/test_errordocument.py
+tests/test_fileapp.py
+tests/test_fixture.py
+tests/test_grantip.py
+tests/test_gzipper.py
+tests/test_httpheaders.py
+tests/test_import_string.py
+tests/test_multidict.py
+tests/test_profilemiddleware.py
+tests/test_proxy.py
+tests/test_recursive.py
+tests/test_registry.py
+tests/test_request.py
+tests/test_request_form.py
+tests/test_response.py
+tests/test_session.py
+tests/test_template.txt
+tests/test_urlmap.py
+tests/test_urlparser.py
+tests/test_wsgiwrappers.py
+tests/cgiapp_data/error.cgi
+tests/cgiapp_data/form.cgi
+tests/cgiapp_data/ok.cgi
+tests/cgiapp_data/stderr.cgi
+tests/test_auth/test_auth_cookie.py
+tests/test_auth/test_auth_digest.py
+tests/test_exceptions/__init__.py
+tests/test_exceptions/test_error_middleware.py
+tests/test_exceptions/test_formatter.py
+tests/test_exceptions/test_httpexceptions.py
+tests/test_exceptions/test_reporter.py
+tests/test_util/test_datetimeutil.py
+tests/urlparser_data/__init__.py
+tests/urlparser_data/secured.txt
+tests/urlparser_data/deep/index.html
+tests/urlparser_data/deep/sub/Main.txt
+tests/urlparser_data/find_file/index.txt
+tests/urlparser_data/find_file/test 3.html
+tests/urlparser_data/find_file/test2.html
+tests/urlparser_data/find_file/dir with spaces/test 4.html
+tests/urlparser_data/hook/__init__.py
+tests/urlparser_data/hook/app.py
+tests/urlparser_data/hook/index.py
+tests/urlparser_data/not_found/__init__.py
+tests/urlparser_data/not_found/recur/__init__.py
+tests/urlparser_data/not_found/recur/isfound.txt
+tests/urlparser_data/not_found/simple/__init__.py
+tests/urlparser_data/not_found/simple/found.txt
+tests/urlparser_data/not_found/user/__init__.py
+tests/urlparser_data/not_found/user/list.py
+tests/urlparser_data/python/__init__.py
+tests/urlparser_data/python/simpleapp.py
+tests/urlparser_data/python/stream.py
+tests/urlparser_data/python/sub/__init__.py
+tests/urlparser_data/python/sub/simpleapp.py
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/EGG-INFO/top_level.txt
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/EGG-INFO/top_level.txt (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/EGG-INFO/top_level.txt (revision 3)
@@ -0,0 +1,1 @@
+paste
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/EGG-INFO/namespace_packages.txt
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/EGG-INFO/namespace_packages.txt (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/EGG-INFO/namespace_packages.txt (revision 3)
@@ -0,0 +1,1 @@
+paste
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/EGG-INFO/PKG-INFO
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/EGG-INFO/PKG-INFO (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/EGG-INFO/PKG-INFO (revision 3)
@@ -0,0 +1,119 @@
+Metadata-Version: 1.0
+Name: Paste
+Version: 1.6
+Summary: Tools for using a Web Server Gateway Interface stack
+Home-page: http://pythonpaste.org
+Author: Ian Bicking
+Author-email: ianb@colorstudy.com
+License: MIT
+Description: These provide several pieces of "middleware" (or filters) that can be nested to build web applications.  Each
+        piece of middleware uses the WSGI (`PEP 333`_) interface, and should
+        be compatible with other middleware based on those interfaces.
+        
+        .. _PEP 333: http://www.python.org/peps/pep-0333.html
+        
+        Includes these features...
+        
+        Testing
+        -------
+        
+        * A fixture for testing WSGI applications conveniently and in-process,
+        in ``paste.fixture``
+        
+        * A fixture for testing command-line applications, also in
+        ``paste.fixture``
+        
+        * Check components for WSGI-compliance in ``paste.lint``
+        
+        Dispatching
+        -----------
+        
+        * Chain and cascade WSGI applications (returning the first non-error
+        response) in ``paste.cascade``
+        
+        * Dispatch to several WSGI applications based on URL prefixes, in
+        ``paste.urlmap``
+        
+        * Allow applications to make subrequests and forward requests
+        internally, in ``paste.recursive``
+        
+        Web Application
+        ---------------
+        
+        * Run CGI programs as WSGI applications in ``paste.cgiapp``
+        
+        * Traverse files and load WSGI applications from ``.py`` files (or
+        static files), in ``paste.urlparser``
+        
+        * Serve static directories of files, also in ``paste.urlparser``; also
+        in that module serving from Egg resources using ``pkg_resources``.
+        
+        Tools
+        -----
+        
+        * Catch HTTP-related exceptions (e.g., ``HTTPNotFound``) and turn them
+        into proper responses in ``paste.httpexceptions``
+        
+        * Several authentication techniques, including HTTP (Basic and
+        Digest), signed cookies, and CAS single-signon, in the
+        ``paste.auth`` package.
+        
+        * Create sessions in ``paste.session`` and ``paste.flup_session``
+        
+        * Gzip responses in ``paste.gzip``
+        
+        * A wide variety of routines for manipulating WSGI requests and
+        producing responses, in ``paste.request``, ``paste.response`` and
+        ``paste.wsgilib``
+        
+        Debugging Filters
+        -----------------
+        
+        * Catch (optionally email) errors with extended tracebacks (using
+        Zope/ZPT conventions) in ``paste.exceptions``
+        
+        * Catch errors presenting a `cgitb
+        <http://python.org/doc/current/lib/module-cgitb.html>`_-based
+        output, in ``paste.cgitb_catcher``.
+        
+        * Profile each request and append profiling information to the HTML,
+        in ``paste.debug.profile``
+        
+        * Capture ``print`` output and present it in the browser for
+        debugging, in ``paste.debug.prints``
+        
+        * Validate all HTML output from applications using the `WDG Validator
+        <http://www.htmlhelp.com/tools/validator/>`_, appending any errors
+        or warnings to the page, in ``paste.debug.wdg_validator``
+        
+        Other Tools
+        -----------
+        
+        * A file monitor to allow restarting the server when files have been
+        updated (for automatic restarting when editing code) in
+        ``paste.reloader``
+        
+        * A class for generating and traversing URLs, and creating associated
+        HTML code, in ``paste.url``
+        
+        The latest version is available in a `Subversion repository
+        <http://svn.pythonpaste.org/Paste/trunk#egg=Paste-dev>`_.
+        
+        For the latest changes see the `news file
+        <http://pythonpaste.org/news.html>`_.
+        
+        
+Keywords: web application server wsgi
+Platform: UNKNOWN
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: MIT License
+Classifier: Programming Language :: Python
+Classifier: Topic :: Internet :: WWW/HTTP
+Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
+Classifier: Topic :: Software Development :: Libraries :: Python Modules
+Classifier: Topic :: Internet :: WWW/HTTP :: WSGI
+Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application
+Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Middleware
+Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Server
+Classifier: Framework :: Paste
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/EGG-INFO/entry_points.txt
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/EGG-INFO/entry_points.txt (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/EGG-INFO/entry_points.txt (revision 3)
@@ -0,0 +1,46 @@
+
+      [paste.app_factory]
+      cgi = paste.cgiapp:make_cgi_application [subprocess]
+      static = paste.urlparser:make_static
+      pkg_resources = paste.urlparser:make_pkg_resources
+      urlparser = paste.urlparser:make_url_parser
+      proxy = paste.proxy:make_proxy
+      test = paste.debug.debugapp:make_test_app
+      test_slow = paste.debug.debugapp:make_slow_app
+      transparent_proxy = paste.proxy:make_transparent_proxy
+      watch_threads = paste.debug.watchthreads:make_watch_threads
+
+      [paste.composite_factory]
+      urlmap = paste.urlmap:urlmap_factory
+      cascade = paste.cascade:make_cascade
+
+      [paste.filter_app_factory]
+      error_catcher = paste.exceptions.errormiddleware:make_error_middleware
+      cgitb = paste.cgitb_catcher:make_cgitb_middleware
+      flup_session = paste.flup_session:make_session_middleware [Flup]
+      gzip = paste.gzipper:make_gzip_middleware
+      httpexceptions = paste.httpexceptions:make_middleware
+      lint = paste.lint:make_middleware
+      printdebug = paste.debug.prints:PrintDebugMiddleware 
+      profile = paste.debug.profile:make_profile_middleware [hotshot]
+      recursive = paste.recursive:make_recursive_middleware
+      # This isn't good enough to deserve the name egg:Paste#session:
+      paste_session = paste.session:make_session_middleware
+      wdg_validate = paste.debug.wdg_validate:make_wdg_validate_middleware [subprocess]
+      evalerror = paste.evalexception.middleware:make_eval_exception
+      auth_tkt = paste.auth.auth_tkt:make_auth_tkt_middleware
+      auth_basic = paste.auth.basic:make_basic
+      auth_digest = paste.auth.digest:make_digest
+      auth_form = paste.auth.form:make_form
+      grantip = paste.auth.grantip:make_grantip
+      openid = paste.auth.open_id:make_open_id_middleware [openid]
+      pony = paste.pony:make_pony
+      errordocument = paste.errordocument:make_errordocument
+      auth_cookie = paste.auth.cookie:make_auth_cookie
+      translogger = paste.translogger:make_filter
+      config = paste.config:make_config_filter
+      registry = paste.registry:make_registry_manager
+
+      [paste.server_runner]
+      http = paste.httpserver:server_runner
+      
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/EGG-INFO/dependency_links.txt
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/EGG-INFO/dependency_links.txt (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/EGG-INFO/dependency_links.txt (revision 3)
@@ -0,0 +1,1 @@
+
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/EGG-INFO/not-zip-safe
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/EGG-INFO/not-zip-safe (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/EGG-INFO/not-zip-safe (revision 3)
@@ -0,0 +1,1 @@
+
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/EGG-INFO/requires.txt
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/EGG-INFO/requires.txt (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/EGG-INFO/requires.txt (revision 3)
@@ -0,0 +1,15 @@
+
+
+[Flup]
+flup
+
+[openid]
+python-openid
+
+[Paste]
+
+
+[hotshot]
+
+
+[subprocess]
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/wsgiwrappers.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/wsgiwrappers.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/wsgiwrappers.py (revision 3)
@@ -0,0 +1,581 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+"""WSGI Wrappers for a Request and Response
+
+The WSGIRequest and WSGIResponse objects are light wrappers to make it easier
+to deal with an incoming request and sending a response.
+"""
+import re
+import warnings
+from pprint import pformat
+from Cookie import SimpleCookie
+from paste.request import EnvironHeaders, get_cookie_dict, \
+    parse_dict_querystring, parse_formvars
+from paste.util.multidict import MultiDict, UnicodeMultiDict
+from paste.registry import StackedObjectProxy
+from paste.response import HeaderDict
+from paste.wsgilib import encode_unicode_app_iter
+from paste.httpheaders import ACCEPT_LANGUAGE
+from paste.util.mimeparse import desired_matches
+
+__all__ = ['WSGIRequest', 'WSGIResponse']
+
+_CHARSET_RE = re.compile(r';\s*charset=([^;]*)', re.I)
+
+class DeprecatedSettings(StackedObjectProxy):
+    def _push_object(self, obj):
+        warnings.warn('paste.wsgiwrappers.settings is deprecated: Please use '
+                      'paste.wsgiwrappers.WSGIRequest.defaults instead',
+                      DeprecationWarning, 3)
+        WSGIResponse.defaults._push_object(obj)
+        StackedObjectProxy._push_object(self, obj)
+
+# settings is deprecated: use WSGIResponse.defaults instead
+settings = DeprecatedSettings(default=dict())
+
+class environ_getter(object):
+    """For delegating an attribute to a key in self.environ."""
+    # @@: Also __set__?  Should setting be allowed?
+    def __init__(self, key, default='', default_factory=None):
+        self.key = key
+        self.default = default
+        self.default_factory = default_factory
+    def __get__(self, obj, type=None):
+        if type is None:
+            return self
+        if self.key not in obj.environ:
+            if self.default_factory:
+                val = obj.environ[self.key] = self.default_factory()
+                return val
+            else:
+                return self.default
+        return obj.environ[self.key]
+
+    def __repr__(self):
+        return '<Proxy for WSGI environ %r key>' % self.key
+
+class WSGIRequest(object):
+    """WSGI Request API Object
+
+    This object represents a WSGI request with a more friendly interface.
+    This does not expose every detail of the WSGI environment, and attempts
+    to express nothing beyond what is available in the environment
+    dictionary.
+
+    The only state maintained in this object is the desired ``charset``,
+    its associated ``errors`` handler, and the ``decode_param_names``
+    option.
+
+    The incoming parameter values will be automatically coerced to unicode
+    objects of the ``charset`` encoding when ``charset`` is set. The
+    incoming parameter names are not decoded to unicode unless the
+    ``decode_param_names`` option is enabled.
+
+    When unicode is expected, ``charset`` will overridden by the the
+    value of the ``Content-Type`` header's charset parameter if one was
+    specified by the client.
+
+    The class variable ``defaults`` specifies default values for
+    ``charset``, ``errors``, and ``langauge``. These can be overridden for the
+    current request via the registry.
+        
+    The ``language`` default value is considered the fallback during i18n
+    translations to ensure in odd cases that mixed languages don't occur should
+    the ``language`` file contain the string but not another language in the
+    accepted languages list. The ``language`` value only applies when getting
+    a list of accepted languages from the HTTP Accept header.
+    
+    This behavior is duplicated from Aquarium, and may seem strange but is
+    very useful. Normally, everything in the code is in "en-us".  However, 
+    the "en-us" translation catalog is usually empty.  If the user requests
+    ``["en-us", "zh-cn"]`` and a translation isn't found for a string in
+    "en-us", you don't want gettext to fallback to "zh-cn".  You want it to 
+    just use the string itself.  Hence, if a string isn't found in the
+    ``language`` catalog, the string in the source code will be used.
+
+    *All* other state is kept in the environment dictionary; this is
+    essential for interoperability.
+
+    You are free to subclass this object.
+
+    """
+    defaults = StackedObjectProxy(default=dict(charset=None, errors='replace',
+                                               decode_param_names=False,
+                                               language='en-us'))
+    def __init__(self, environ):
+        self.environ = environ
+        # This isn't "state" really, since the object is derivative:
+        self.headers = EnvironHeaders(environ)
+        
+        defaults = self.defaults._current_obj()
+        self.charset = defaults.get('charset')
+        if self.charset:
+            # There's a charset: params will be coerced to unicode. In that
+            # case, attempt to use the charset specified by the browser
+            browser_charset = self.determine_browser_charset()
+            if browser_charset:
+                self.charset = browser_charset
+        self.errors = defaults.get('errors', 'strict')
+        self.decode_param_names = defaults.get('decode_param_names', False)
+        self._languages = None
+    
+    body = environ_getter('wsgi.input')
+    scheme = environ_getter('wsgi.url_scheme')
+    method = environ_getter('REQUEST_METHOD')
+    script_name = environ_getter('SCRIPT_NAME')
+    path_info = environ_getter('PATH_INFO')
+
+    def urlvars(self):
+        """
+        Return any variables matched in the URL (e.g.,
+        ``wsgiorg.routing_args``).
+        """
+        if 'paste.urlvars' in self.environ:
+            return self.environ['paste.urlvars']
+        elif 'wsgiorg.routing_args' in self.environ:
+            return self.environ['wsgiorg.routing_args'][1]
+        else:
+            return {}
+    urlvars = property(urlvars, doc=urlvars.__doc__)
+    
+    def is_xhr(self):
+        """Returns a boolean if X-Requested-With is present and a XMLHttpRequest"""
+        return self.environ.get('HTTP_X_REQUESTED_WITH', '') == 'XMLHttpRequest'
+    is_xhr = property(is_xhr, doc=is_xhr.__doc__)
+    
+    def host(self):
+        """Host name provided in HTTP_HOST, with fall-back to SERVER_NAME"""
+        return self.environ.get('HTTP_HOST', self.environ.get('SERVER_NAME'))
+    host = property(host, doc=host.__doc__)
+
+    def languages(self):
+        """Return a list of preferred languages, most preferred first.
+        
+        The list may be empty.
+        """
+        if self._languages is not None:
+            return self._languages
+        acceptLanguage = self.environ.get('HTTP_ACCEPT_LANGUAGE')
+        langs = ACCEPT_LANGUAGE.parse(self.environ)
+        fallback = self.defaults.get('language', 'en-us')
+        if not fallback:
+            return langs
+        if fallback not in langs:
+            langs.append(fallback)
+        index = langs.index(fallback)
+        langs[index+1:] = []
+        self._languages = langs
+        return self._languages
+    languages = property(languages, doc=languages.__doc__)
+    
+    def _GET(self):
+        return parse_dict_querystring(self.environ)
+
+    def GET(self):
+        """
+        Dictionary-like object representing the QUERY_STRING
+        parameters. Always present, if possibly empty.
+
+        If the same key is present in the query string multiple times, a
+        list of its values can be retrieved from the ``MultiDict`` via
+        the ``getall`` method.
+
+        Returns a ``MultiDict`` container or a ``UnicodeMultiDict`` when
+        ``charset`` is set.
+        """
+        params = self._GET()
+        if self.charset:
+            params = UnicodeMultiDict(params, encoding=self.charset,
+                                      errors=self.errors,
+                                      decode_keys=self.decode_param_names)
+        return params
+    GET = property(GET, doc=GET.__doc__)
+
+    def _POST(self):
+        return parse_formvars(self.environ, include_get_vars=False)
+
+    def POST(self):
+        """Dictionary-like object representing the POST body.
+
+        Most values are encoded strings, or unicode strings when
+        ``charset`` is set. There may also be FieldStorage objects
+        representing file uploads. If this is not a POST request, or the
+        body is not encoded fields (e.g., an XMLRPC request) then this
+        will be empty.
+
+        This will consume wsgi.input when first accessed if applicable,
+        but the raw version will be put in
+        environ['paste.parsed_formvars'].
+
+        Returns a ``MultiDict`` container or a ``UnicodeMultiDict`` when
+        ``charset`` is set.
+        """
+        params = self._POST()
+        if self.charset:
+            params = UnicodeMultiDict(params, encoding=self.charset,
+                                      errors=self.errors,
+                                      decode_keys=self.decode_param_names)
+        return params
+    POST = property(POST, doc=POST.__doc__)
+
+    def params(self):
+        """Dictionary-like object of keys from POST, GET, URL dicts
+
+        Return a key value from the parameters, they are checked in the
+        following order: POST, GET, URL
+
+        Additional methods supported:
+
+        ``getlist(key)``
+            Returns a list of all the values by that key, collected from
+            POST, GET, URL dicts
+
+        Returns a ``MultiDict`` container or a ``UnicodeMultiDict`` when
+        ``charset`` is set.
+        """
+        params = MultiDict()
+        params.update(self._POST())
+        params.update(self._GET())
+        if self.charset:
+            params = UnicodeMultiDict(params, encoding=self.charset,
+                                      errors=self.errors,
+                                      decode_keys=self.decode_param_names)
+        return params
+    params = property(params, doc=params.__doc__)
+
+    def cookies(self):
+        """Dictionary of cookies keyed by cookie name.
+
+        Just a plain dictionary, may be empty but not None.
+        
+        """
+        return get_cookie_dict(self.environ)
+    cookies = property(cookies, doc=cookies.__doc__)
+
+    def determine_browser_charset(self):
+        """
+        Determine the encoding as specified by the browser via the
+        Content-Type's charset parameter, if one is set
+        """
+        charset_match = _CHARSET_RE.search(self.headers.get('Content-Type', ''))
+        if charset_match:
+            return charset_match.group(1)
+
+    def match_accept(self, mimetypes):
+        """Return a list of specified mime-types that the browser's HTTP Accept
+        header allows in the order provided."""
+        return desired_matches(mimetypes, 
+                               self.environ.get('HTTP_ACCEPT', '*/*'))
+
+    def __repr__(self):
+        """Show important attributes of the WSGIRequest"""
+        pf = pformat
+        msg = '<%s.%s object at 0x%x method=%s,' % \
+            (self.__class__.__module__, self.__class__.__name__,
+             id(self), pf(self.method))
+        msg += '\nscheme=%s, host=%s, script_name=%s, path_info=%s,' % \
+            (pf(self.scheme), pf(self.host), pf(self.script_name),
+             pf(self.path_info))
+        msg += '\nlanguges=%s,' % pf(self.languages)
+        if self.charset:
+            msg += ' charset=%s, errors=%s,' % (pf(self.charset),
+                                                pf(self.errors))
+        msg += '\nGET=%s,' % pf(self.GET)
+        msg += '\nPOST=%s,' % pf(self.POST)
+        msg += '\ncookies=%s>' % pf(self.cookies)
+        return msg
+
+class WSGIResponse(object):
+    """A basic HTTP response with content, headers, and out-bound cookies
+
+    The class variable ``defaults`` specifies default values for
+    ``content_type``, ``charset`` and ``errors``. These can be overridden
+    for the current request via the registry.
+
+    """
+    defaults = StackedObjectProxy(
+        default=dict(content_type='text/html', charset='utf-8', 
+                     errors='strict', headers={'Cache-Control':'no-cache'})
+        )
+    def __init__(self, content='', mimetype=None, code=200):
+        self._iter = None
+        self._is_str_iter = True
+
+        self.content = content
+        self.headers = HeaderDict()
+        self.cookies = SimpleCookie()
+        self.status_code = code
+
+        defaults = self.defaults._current_obj()
+        if not mimetype:
+            mimetype = defaults.get('content_type', 'text/html')
+            charset = defaults.get('charset')
+            if charset:
+                mimetype = '%s; charset=%s' % (mimetype, charset)
+        self.headers.update(defaults.get('headers', {}))
+        self.headers['Content-Type'] = mimetype
+        self.errors = defaults.get('errors', 'strict')
+
+    def __str__(self):
+        """Returns a rendition of the full HTTP message, including headers.
+
+        When the content is an iterator, the actual content is replaced with the
+        output of str(iterator) (to avoid exhausting the iterator).
+        """
+        if self._is_str_iter:
+            content = ''.join(self.get_content())
+        else:
+            content = str(self.content)
+        return '\n'.join(['%s: %s' % (key, value)
+            for key, value in self.headers.headeritems()]) \
+            + '\n\n' + content
+    
+    def __call__(self, environ, start_response):
+        """Convenience call to return output and set status information
+        
+        Conforms to the WSGI interface for calling purposes only.
+        
+        Example usage:
+        
+        .. code-block:: Python
+
+            def wsgi_app(environ, start_response):
+                response = WSGIResponse()
+                response.write("Hello world")
+                response.headers['Content-Type'] = 'latin1'
+                return response(environ, start_response)
+        
+        """
+        status_text = STATUS_CODE_TEXT[self.status_code]
+        status = '%s %s' % (self.status_code, status_text)
+        response_headers = self.headers.headeritems()
+        for c in self.cookies.values():
+            response_headers.append(('Set-Cookie', c.output(header='')))
+        start_response(status, response_headers)
+        is_file = isinstance(self.content, file)
+        if 'wsgi.file_wrapper' in environ and is_file:
+            return environ['wsgi.file_wrapper'](self.content)
+        elif is_file:
+            return iter(lambda: self.content.read(), '')
+        return self.get_content()
+    
+    def determine_charset(self):
+        """
+        Determine the encoding as specified by the Content-Type's charset
+        parameter, if one is set
+        """
+        charset_match = _CHARSET_RE.search(self.headers.get('Content-Type', ''))
+        if charset_match:
+            return charset_match.group(1)
+    
+    def has_header(self, header):
+        """
+        Case-insensitive check for a header
+        """
+        warnings.warn('WSGIResponse.has_header is deprecated, use '
+                      'WSGIResponse.headers.has_key instead', DeprecationWarning,
+                      2)
+        return self.headers.has_key(header)
+
+    def set_cookie(self, key, value='', max_age=None, expires=None, path='/',
+                   domain=None, secure=None):
+        """
+        Define a cookie to be sent via the outgoing HTTP headers
+        """
+        self.cookies[key] = value
+        for var_name, var_value in [
+            ('max_age', max_age), ('path', path), ('domain', domain),
+            ('secure', secure), ('expires', expires)]:
+            if var_value is not None and var_value is not False:
+                self.cookies[key][var_name.replace('_', '-')] = var_value
+
+    def delete_cookie(self, key, path='/', domain=None):
+        """
+        Notify the browser the specified cookie has expired and should be
+        deleted (via the outgoing HTTP headers)
+        """
+        self.cookies[key] = ''
+        if path is not None:
+            self.cookies[key]['path'] = path
+        if domain is not None:
+            self.cookies[key]['domain'] = path
+        self.cookies[key]['expires'] = 0
+        self.cookies[key]['max-age'] = 0
+
+    def _set_content(self, content):
+        if hasattr(content, '__iter__'):
+            self._iter = content
+            if isinstance(content, list):
+                self._is_str_iter = True
+            else:
+                self._is_str_iter = False
+        else:
+            self._iter = [content]
+            self._is_str_iter = True
+    content = property(lambda self: self._iter, _set_content,
+                       doc='Get/set the specified content, where content can '
+                       'be: a string, a list of strings, a generator function '
+                       'that yields strings, or an iterable object that '
+                       'produces strings.')
+
+    def get_content(self):
+        """
+        Returns the content as an iterable of strings, encoding each element of
+        the iterator from a Unicode object if necessary.
+        """
+        charset = self.determine_charset()
+        if charset:
+            return encode_unicode_app_iter(self.content, charset, self.errors)
+        else:
+            return self.content
+    
+    def wsgi_response(self):
+        """
+        Return this WSGIResponse as a tuple of WSGI formatted data, including:
+        (status, headers, iterable)
+        """
+        status_text = STATUS_CODE_TEXT[self.status_code]
+        status = '%s %s' % (self.status_code, status_text)
+        response_headers = self.headers.headeritems()
+        for c in self.cookies.values():
+            response_headers.append(('Set-Cookie', c.output(header='')))
+        return status, response_headers, self.get_content()
+    
+    # The remaining methods partially implement the file-like object interface.
+    # See http://docs.python.org/lib/bltin-file-objects.html
+    def write(self, content):
+        if not self._is_str_iter:
+            raise IOError, "This %s instance's content is not writable: (content " \
+                'is an iterator)' % self.__class__.__name__
+        self.content.append(content)
+
+    def flush(self):
+        pass
+
+    def tell(self):
+        if not self._is_str_iter:
+            raise IOError, 'This %s instance cannot tell its position: (content ' \
+                'is an iterator)' % self.__class__.__name__
+        return sum([len(chunk) for chunk in self._iter])
+
+    ########################################
+    ## Content-type and charset
+
+    def charset__get(self):
+        """
+        Get/set the charset (in the Content-Type)
+        """
+        header = self.headers.get('content-type')
+        if not header:
+            return None
+        match = _CHARSET_RE.search(header)
+        if match:
+            return match.group(1)
+        return None
+
+    def charset__set(self, charset):
+        if charset is None:
+            del self.charset
+            return
+        try:
+            header = self.headers.pop('content-type')
+        except KeyError:
+            raise AttributeError(
+                "You cannot set the charset when no content-type is defined")
+        match = _CHARSET_RE.search(header)
+        if match:
+            header = header[:match.start()] + header[match.end():]
+        header += '; charset=%s' % charset
+        self.headers['content-type'] = header
+
+    def charset__del(self):
+        try:
+            header = self.headers.pop('content-type')
+        except KeyError:
+            # Don't need to remove anything
+            return
+        match = _CHARSET_RE.search(header)
+        if match:
+            header = header[:match.start()] + header[match.end():]
+        self.headers['content-type'] = header
+
+    charset = property(charset__get, charset__set, charset__del, doc=charset__get.__doc__)
+
+    def content_type__get(self):
+        """
+        Get/set the Content-Type header (or None), *without* the
+        charset or any parameters.
+
+        If you include parameters (or ``;`` at all) when setting the
+        content_type, any existing parameters will be deleted;
+        otherwise they will be preserved.
+        """
+        header = self.headers.get('content-type')
+        if not header:
+            return None
+        return header.split(';', 1)[0]
+
+    def content_type__set(self, value):
+        if ';' not in value:
+            header = self.headers.get('content-type', '')
+            if ';' in header:
+                params = header.split(';', 1)[1]
+                value += ';' + params
+        self.headers['content-type'] = value
+
+    def content_type__del(self):
+        try:
+            del self.headers['content-type']
+        except KeyError:
+            pass
+
+    content_type = property(content_type__get, content_type__set,
+                            content_type__del, doc=content_type__get.__doc__)
+
+## @@ I'd love to remove this, but paste.httpexceptions.get_exception
+##    doesn't seem to work...
+# See http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
+STATUS_CODE_TEXT = {
+    100: 'CONTINUE',
+    101: 'SWITCHING PROTOCOLS',
+    200: 'OK',
+    201: 'CREATED',
+    202: 'ACCEPTED',
+    203: 'NON-AUTHORITATIVE INFORMATION',
+    204: 'NO CONTENT',
+    205: 'RESET CONTENT',
+    206: 'PARTIAL CONTENT',
+    226: 'IM USED',
+    300: 'MULTIPLE CHOICES',
+    301: 'MOVED PERMANENTLY',
+    302: 'FOUND',
+    303: 'SEE OTHER',
+    304: 'NOT MODIFIED',
+    305: 'USE PROXY',
+    306: 'RESERVED',
+    307: 'TEMPORARY REDIRECT',
+    400: 'BAD REQUEST',
+    401: 'UNAUTHORIZED',
+    402: 'PAYMENT REQUIRED',
+    403: 'FORBIDDEN',
+    404: 'NOT FOUND',
+    405: 'METHOD NOT ALLOWED',
+    406: 'NOT ACCEPTABLE',
+    407: 'PROXY AUTHENTICATION REQUIRED',
+    408: 'REQUEST TIMEOUT',
+    409: 'CONFLICT',
+    410: 'GONE',
+    411: 'LENGTH REQUIRED',
+    412: 'PRECONDITION FAILED',
+    413: 'REQUEST ENTITY TOO LARGE',
+    414: 'REQUEST-URI TOO LONG',
+    415: 'UNSUPPORTED MEDIA TYPE',
+    416: 'REQUESTED RANGE NOT SATISFIABLE',
+    417: 'EXPECTATION FAILED',
+    500: 'INTERNAL SERVER ERROR',
+    501: 'NOT IMPLEMENTED',
+    502: 'BAD GATEWAY',
+    503: 'SERVICE UNAVAILABLE',
+    504: 'GATEWAY TIMEOUT',
+    505: 'HTTP VERSION NOT SUPPORTED',
+}
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/response.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/response.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/response.py (revision 3)
@@ -0,0 +1,240 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+"""Routines to generate WSGI responses"""
+
+############################################################
+## Headers
+############################################################
+import warnings
+
+class HeaderDict(dict):
+
+    """
+    This represents response headers.  It handles the headers as a
+    dictionary, with case-insensitive keys.
+
+    Also there is an ``.add(key, value)`` method, which sets the key,
+    or adds the value to the current value (turning it into a list if
+    necessary).
+
+    For passing to WSGI there is a ``.headeritems()`` method which is
+    like ``.items()`` but unpacks value that are lists.  It also
+    handles encoding -- all headers are encoded in ASCII (if they are
+    unicode).
+
+    @@: Should that encoding be ISO-8859-1 or UTF-8?  I'm not sure
+    what the spec says.
+    """
+
+    def __getitem__(self, key):
+        return dict.__getitem__(self, self.normalize(key))
+
+    def __setitem__(self, key, value):
+        dict.__setitem__(self, self.normalize(key), value)
+
+    def __delitem__(self, key):
+        dict.__delitem__(self, self.normalize(key))
+
+    def __contains__(self, key):
+        return dict.__contains__(self, self.normalize(key))
+
+    has_key = __contains__
+
+    def get(self, key, failobj=None):
+        return dict.get(self, self.normalize(key), failobj)
+
+    def setdefault(self, key, failobj=None):
+        return dict.setdefault(self, self.normalize(key), failobj)
+        
+    def pop(self, key):
+        return dict.pop(self, self.normalize(key))
+
+    def update(self, other):
+        for key in other:
+            self[self.normalize(key)] = other[key]
+
+    def normalize(self, key):
+        return str(key).lower().strip()
+
+    def add(self, key, value):
+        key = self.normalize(key)
+        if key in self:
+            if isinstance(self[key], list):
+                self[key].append(value)
+            else:
+                self[key] = [self[key], value]
+        else:
+            self[key] = value
+
+    def headeritems(self):
+        result = []
+        for key, value in self.items():
+            if isinstance(value, list):
+                for v in value:
+                    result.append((key, str(v)))
+            else:
+                result.append((key, str(value)))
+        return result
+
+    #@classmethod
+    def fromlist(cls, seq):
+        self = cls()
+        for name, value in seq:
+            self.add(name, value)
+        return self
+    
+    fromlist = classmethod(fromlist)
+
+def has_header(headers, name):
+    """
+    Is header named ``name`` present in headers?
+    """
+    name = name.lower()
+    for header, value in headers:
+        if header.lower() == name:
+            return True
+    return False
+
+def header_value(headers, name):
+    """
+    Returns the header's value, or None if no such header.  If a
+    header appears more than once, all the values of the headers
+    are joined with ','.   Note that this is consistent /w RFC 2616
+    section 4.2 which states:
+
+        It MUST be possible to combine the multiple header fields
+        into one "field-name: field-value" pair, without changing
+        the semantics of the message, by appending each subsequent
+        field-value to the first, each separated by a comma.
+
+    However, note that the original netscape usage of 'Set-Cookie',
+    especially in MSIE which contains an 'expires' date will is not
+    compatible with this particular concatination method.
+    """
+    name = name.lower()
+    result = [value for header, value in headers
+              if header.lower() == name]
+    if result:
+        return ','.join(result)
+    else:
+        return None
+
+def remove_header(headers, name):
+    """
+    Removes the named header from the list of headers.  Returns the
+    value of that header, or None if no header found.  If multiple
+    headers are found, only the last one is returned.
+    """
+    name = name.lower()
+    i = 0
+    result = None
+    while i < len(headers):
+        if headers[i][0].lower() == name:
+            result = headers[i][1]
+            del headers[i]
+            continue
+        i += 1
+    return result
+
+def replace_header(headers, name, value):
+    """
+    Updates the headers replacing the first occurance of the given name
+    with the value provided; asserting that no further occurances
+    happen. Note that this is _not_ the same as remove_header and then
+    append, as two distinct operations (del followed by an append) are
+    not atomic in a threaded environment. Returns the previous header
+    value for the provided name, if any.   Clearly one should not use
+    this function with ``set-cookie`` or other names that may have more
+    than one occurance in the headers.
+    """
+    name = name.lower()
+    i = 0
+    result = None
+    while i < len(headers):
+        if headers[i][0].lower() == name:
+            assert not result, "two values for the header '%s' found" % name
+            result = headers[i][1]
+            headers[i] = (name, value)
+        i += 1
+    if not result:
+        headers.append((name, value))
+    return result
+
+
+############################################################
+## Deprecated methods
+############################################################
+
+def error_body_response(error_code, message, __warn=True):
+    """
+    Returns a standard HTML response page for an HTTP error.
+    **Note:** Deprecated
+    """
+    if __warn:
+        warnings.warn(
+            'wsgilib.error_body_response is deprecated; use the '
+            'wsgi_application method on an HTTPException object '
+            'instead', DeprecationWarning, 2)
+    return '''\
+<html>
+  <head>
+    <title>%(error_code)s</title>
+  </head>
+  <body>
+  <h1>%(error_code)s</h1>
+  %(message)s
+  </body>
+</html>''' % {
+        'error_code': error_code,
+        'message': message,
+        }
+
+
+def error_response(environ, error_code, message,
+                   debug_message=None, __warn=True):
+    """
+    Returns the status, headers, and body of an error response.
+
+    Use like:
+    
+    .. code-block:: Python
+
+        status, headers, body = wsgilib.error_response(
+            '301 Moved Permanently', 'Moved to <a href="%s">%s</a>'
+            % (url, url))
+        start_response(status, headers)
+        return [body]
+    
+    **Note:** Deprecated
+    """
+    if __warn:
+        warnings.warn(
+            'wsgilib.error_response is deprecated; use the '
+            'wsgi_application method on an HTTPException object '
+            'instead', DeprecationWarning, 2)
+    if debug_message and environ.get('paste.config', {}).get('debug'):
+        message += '\n\n<!-- %s -->' % debug_message
+    body = error_body_response(error_code, message, __warn=False)
+    headers = [('content-type', 'text/html'),
+               ('content-length', str(len(body)))]
+    return error_code, headers, body
+
+def error_response_app(error_code, message, debug_message=None,
+                       __warn=True):
+    """
+    An application that emits the given error response.
+
+    **Note:** Deprecated
+    """
+    if __warn:
+        warnings.warn(
+            'wsgilib.error_response_app is deprecated; use the '
+            'wsgi_application method on an HTTPException object '
+            'instead', DeprecationWarning, 2)
+    def application(environ, start_response):
+        status, headers, body = error_response(
+            environ, error_code, message,
+            debug_message=debug_message, __warn=False)
+        start_response(status, headers)
+        return [body]
+    return application
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/__init__.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/__init__.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/__init__.py (revision 3)
@@ -0,0 +1,13 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+try:
+    import pkg_resources
+    pkg_resources.declare_namespace(__name__)
+except ImportError:
+    # don't prevent use of paste if pkg_resources isn't installed
+    from pkgutil import extend_path
+    __path__ = extend_path(__path__, __name__) 
+
+import modulefinder
+for p in __path__:
+    modulefinder.AddPackagePath(__name__, p)
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/debug/wdg_validate.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/debug/wdg_validate.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/debug/wdg_validate.py (revision 3)
@@ -0,0 +1,117 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+"""
+Middleware that tests the validity of all generated HTML using the
+`WDG HTML Validator <http://www.htmlhelp.com/tools/validator/>`_
+"""
+
+from cStringIO import StringIO
+try:
+    import subprocess
+except ImportError:
+    from paste.util import subprocess24 as subprocess
+from paste import wsgilib
+import re
+import cgi
+
+__all__ = ['WDGValidateMiddleware']
+
+class WDGValidateMiddleware(object):
+
+    """
+    Middleware that checks HTML and appends messages about the validity of
+    the HTML.  Uses: http://www.htmlhelp.com/tools/validator/ -- interacts
+    with the command line client.  Use the configuration ``wdg_path`` to
+    override the path (default: looks for ``validate`` in $PATH).
+
+    To install, in your web context's __init__.py::
+
+        def urlparser_wrap(environ, start_response, app):
+            return wdg_validate.WDGValidateMiddleware(app)(
+                environ, start_response)
+
+    Or in your configuration::
+
+        middleware.append('paste.wdg_validate.WDGValidateMiddleware')
+    """
+
+    _end_body_regex = re.compile(r'</body>', re.I)
+
+    def __init__(self, app, global_conf=None, wdg_path='validate'):
+        self.app = app
+        self.wdg_path = wdg_path
+
+    def __call__(self, environ, start_response):
+        output = StringIO()
+        response = []
+
+        def writer_start_response(status, headers, exc_info=None):
+            response.extend((status, headers))
+            start_response(status, headers, exc_info)
+            return output.write
+
+        app_iter = self.app(environ, writer_start_response)
+        try:
+            for s in app_iter:
+                output.write(s)
+        finally:
+            if hasattr(app_iter, 'close'):
+                app_iter.close()
+        page = output.getvalue()
+        status, headers = response
+        v = wsgilib.header_value(headers, 'content-type') or ''
+        if (not v.startswith('text/html')
+            and not v.startswith('text/xhtml')
+            and not v.startswith('application/xhtml')):
+            # Can't validate
+            # @@: Should validate CSS too... but using what?
+            return [page]
+        ops = []
+        if v.startswith('text/xhtml+xml'):
+            ops.append('--xml')
+        # @@: Should capture encoding too
+        html_errors = self.call_wdg_validate(
+            self.wdg_path, ops, page)
+        if not html_errors:
+            return [page]
+        return self.add_error(page, html_errors)
+    
+    def call_wdg_validate(self, wdg_path, ops, page):
+        if subprocess is None:
+            raise ValueError(
+                "This middleware requires the subprocess module from "
+                "Python 2.4")
+        proc = subprocess.Popen([wdg_path] + ops,
+                                shell=False,
+                                close_fds=True,
+                                stdout=subprocess.PIPE,
+                                stdin=subprocess.PIPE,
+                                stderr=subprocess.STDOUT)
+        stdout = proc.communicate(page)[0]
+        proc.wait()
+        return stdout
+            
+    def add_error(self, html_page, html_errors):
+        add_text = ('<pre style="background-color: #ffd; color: #600; '
+                    'border: 1px solid #000;">%s</pre>'
+                    % cgi.escape(html_errors))
+        match = self._end_body_regex.search(html_page)
+        if match:
+            return [html_page[:match.start()]
+                    + add_text
+                    + html_page[match.end():]]
+        else:
+            return [html_page + add_text]
+
+def make_wdg_validate_middleware(
+    app, global_conf, wdg_path='validate'):
+    """
+    Wraps the application in the WDG validator from
+    http://www.htmlhelp.com/tools/validator/
+
+    Validation errors are appended to the text of each page.
+    You can configure this by giving the path to the validate
+    executable (by default picked up from $PATH)
+    """
+    return WDGValidateMiddleware(
+        app, global_conf, wdg_path=wdg_path)
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/debug/__init__.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/debug/__init__.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/debug/__init__.py (revision 3)
@@ -0,0 +1,5 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+"""
+Package for debugging and development tools
+"""
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/debug/prints.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/debug/prints.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/debug/prints.py (revision 3)
@@ -0,0 +1,140 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+"""
+Middleware that displays everything that is printed inline in
+application pages.
+
+Anything printed during the request will get captured and included on
+the page.  It will usually be included as a floating element in the
+top right hand corner of the page.  If you want to override this
+you can include a tag in your template where it will be placed::
+
+  <pre id="paste-debug-prints"></pre>
+
+You might want to include ``style="white-space: normal"``, as all the
+whitespace will be quoted, and this allows the text to wrap if
+necessary.
+
+"""
+
+from cStringIO import StringIO
+import re
+import cgi
+from paste.util import threadedprint
+from paste import wsgilib
+from paste import response
+
+_threadedprint_installed = False
+
+__all__ = ['PrintDebugMiddleware']
+
+class TeeFile(object):
+
+    def __init__(self, files):
+        self.files = files
+
+    def write(self, v):
+        if isinstance(v, unicode):
+            # WSGI is picky in this case
+            v = str(v)
+        for file in self.files:
+            file.write(v)
+
+class PrintDebugMiddleware(object):
+
+    """
+    This middleware captures all the printed statements, and inlines
+    them in HTML pages, so that you can see all the (debug-intended)
+    print statements in the page itself.
+
+    There are two keys added to the environment to control this:
+    ``environ['paste.printdebug_listeners']`` is a list of functions
+    that will be called everytime something is printed.
+
+    ``environ['paste.remove_printdebug']`` is a function that, if
+    called, will disable printing of output for that request.
+    """
+
+    log_template = (
+        '<pre style="width: 40%%; border: 2px solid #000; white-space: normal; '
+        'background-color: #ffd; color: #000; float: right;">'
+        '<b style="border-bottom: 1px solid #000">Log messages</b><br>'
+        '%s</pre>')
+
+    def __init__(self, app, global_conf=None, force_content_type=False,
+                 print_wsgi_errors=True):
+        # @@: global_conf should be handled separately and only for
+        # the entry point
+        self.app = app
+        self.force_content_type = force_content_type
+        if isinstance(print_wsgi_errors, basestring):
+            from paste.deploy.converters import asbool
+            print_wsgi_errors = asbool(print_wsgi_errors)
+        self.print_wsgi_errors = print_wsgi_errors
+
+    def __call__(self, environ, start_response):
+        global _threadedprint_installed
+        if environ.get('paste.testing'):
+            # In a testing environment this interception isn't
+            # useful:
+            return self.app(environ, start_response)
+        if not _threadedprint_installed:
+            # @@: Not strictly threadsafe
+            _threadedprint_installed = True
+            threadedprint.install(leave_stdout=True)
+        removed = []
+        def remove_printdebug():
+            removed.append(None)
+        environ['paste.remove_printdebug'] = remove_printdebug
+        logged = StringIO()
+        listeners = [logged]
+        environ['paste.printdebug_listeners'] = listeners
+        if self.print_wsgi_errors:
+            listeners.append(environ['wsgi.errors'])
+        replacement_stdout = TeeFile(listeners)
+        threadedprint.register(replacement_stdout)
+        try:
+            status, headers, body = wsgilib.intercept_output(
+                environ, self.app)
+            if status is None:
+                # Some error occurred
+                status = '500 Server Error'
+                headers = [('Content-type', 'text/html')]
+                start_response(status, headers)
+                if not body:
+                    body = 'An error occurred'
+            content_type = response.header_value(headers, 'content-type')
+            if (removed or
+                (not self.force_content_type and
+                 (not content_type
+                  or not content_type.startswith('text/html')))):
+                if replacement_stdout == logged:
+                    # Then the prints will be lost, unless...
+                    environ['wsgi.errors'].write(logged.getvalue())
+                start_response(status, headers)
+                return [body]
+            response.remove_header(headers, 'content-length')
+            body = self.add_log(body, logged.getvalue())
+            start_response(status, headers)
+            return [body]
+        finally:
+            threadedprint.deregister()
+
+    _body_re = re.compile(r'<body[^>]*>', re.I)
+    _explicit_re = re.compile(r'<pre\s*[^>]*id="paste-debug-prints".*?>',
+                              re.I+re.S)
+    
+    def add_log(self, html, log):
+        if not log:
+            return html
+        text = cgi.escape(log)
+        text = text.replace('\n', '<br>')
+        text = text.replace('  ', '&nbsp; ')
+        match = self._explicit_re.search(html)
+        if not match:
+            text = self.log_template % text
+            match = self._body_re.search(html)
+        if not match:
+            return text + html
+        else:
+            return html[:match.end()] + text + html[match.end():]
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/debug/profile.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/debug/profile.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/debug/profile.py (revision 3)
@@ -0,0 +1,227 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+"""
+Middleware that profiles the request and displays profiling
+information at the bottom of each page.
+"""
+
+
+import sys
+import os
+import hotshot
+import hotshot.stats
+import threading
+import cgi
+import time
+from cStringIO import StringIO
+from paste import response
+
+__all__ = ['ProfileMiddleware', 'profile_decorator']
+
+class ProfileMiddleware(object):
+
+    """
+    Middleware that profiles all requests.
+
+    All HTML pages will have profiling information appended to them.
+    The data is isolated to that single request, and does not include
+    data from previous requests.
+
+    This uses the ``hotshot`` module, which affects performance of the
+    application.  It also runs in a single-threaded mode, so it is
+    only usable in development environments.
+    """
+
+    style = ('background-color: #ff9; color: #000; '
+             'border: 2px solid #000; padding: 5px;')
+
+    def __init__(self, app, global_conf=None,
+                 log_filename='profile.log.tmp',
+                 limit=40):
+        self.app = app
+        self.lock = threading.Lock()
+        self.log_filename = log_filename
+        self.limit = limit
+
+    def __call__(self, environ, start_response):
+        catch_response = []
+        body = []
+        def replace_start_response(status, headers, exc_info=None):
+            catch_response.extend([status, headers])
+            start_response(status, headers, exc_info)
+            return body.append
+        def run_app():
+            app_iter = self.app(environ, replace_start_response)
+            try:
+                body.extend(app_iter)
+            finally:
+                if hasattr(app_iter, 'close'):
+                    app_iter.close()
+        self.lock.acquire()
+        try:
+            prof = hotshot.Profile(self.log_filename)
+            prof.addinfo('URL', environ.get('PATH_INFO', ''))
+            try:
+                prof.runcall(run_app)
+            finally:
+                prof.close()
+            body = ''.join(body)
+            headers = catch_response[1]
+            content_type = response.header_value(headers, 'content-type')
+            if not content_type.startswith('text/html'):
+                # We can't add info to non-HTML output
+                return [body]
+            stats = hotshot.stats.load(self.log_filename)
+            stats.strip_dirs()
+            stats.sort_stats('time', 'calls')
+            output = capture_output(stats.print_stats, self.limit)
+            output_callers = capture_output(
+                stats.print_callers, self.limit)
+            body += '<pre style="%s">%s\n%s</pre>' % (
+                self.style, cgi.escape(output), cgi.escape(output_callers))
+            return [body]
+        finally:
+            self.lock.release()
+
+def capture_output(func, *args, **kw):
+    # Not threadsafe! (that's okay when ProfileMiddleware uses it,
+    # though, since it synchronizes itself.)
+    out = StringIO()
+    old_stdout = sys.stdout
+    sys.stdout = out
+    try:
+        func(*args, **kw)
+    finally:
+        sys.stdout = old_stdout
+    return out.getvalue()
+
+def profile_decorator(**options):
+
+    """
+    Profile a single function call.
+    
+    Used around a function, like::
+
+        @profile_decorator(options...)
+        def ...
+
+    All calls to the function will be profiled.  The options are
+    all keywords, and are:
+
+        log_file:
+            The filename to log to (or ``'stdout'`` or ``'stderr'``).
+            Default: stderr.
+        display_limit:
+            Only show the top N items, default: 20.
+        sort_stats:
+            A list of string-attributes to sort on.  Default
+            ``('time', 'calls')``.
+        strip_dirs:
+            Strip directories/module names from files?  Default True.
+        add_info:
+            If given, this info will be added to the report (for your
+            own tracking).  Default: none.
+        log_filename:
+            The temporary filename to log profiling data to.  Default;
+            ``./profile_data.log.tmp``
+        no_profile:
+            If true, then don't actually profile anything.  Useful for
+            conditional profiling.
+    """
+
+    if options.get('no_profile'):
+        def decorator(func):
+            return func
+        return decorator
+    def decorator(func):
+        def replacement(*args, **kw):
+            return DecoratedProfile(func, **options)(*args, **kw)
+        return replacement
+    return decorator
+
+class DecoratedProfile(object):
+
+    lock = threading.Lock()
+
+    def __init__(self, func, **options):
+        self.func = func
+        self.options = options
+
+    def __call__(self, *args, **kw):
+        self.lock.acquire()
+        try:
+            return self.profile(self.func, *args, **kw)
+        finally:
+            self.lock.release()
+
+    def profile(self, func, *args, **kw):
+        ops = self.options
+        prof_filename = ops.get('log_filename', 'profile_data.log.tmp')
+        prof = hotshot.Profile(prof_filename)
+        prof.addinfo('Function Call',
+                     self.format_function(func, *args, **kw))
+        if ops.get('add_info'):
+            prof.addinfo('Extra info', ops['add_info'])
+        exc_info = None
+        try:
+            start_time = time.time()
+            try:
+                result = prof.runcall(func, *args, **kw)
+            except:
+                exc_info = sys.exc_info()
+            end_time = time.time()
+        finally:
+            prof.close()
+        stats = hotshot.stats.load(prof_filename)
+        os.unlink(prof_filename)
+        if ops.get('strip_dirs', True):
+            stats.strip_dirs()
+        stats.sort_stats(*ops.get('sort_stats', ('time', 'calls')))
+        display_limit = ops.get('display_limit', 20)
+        output = capture_output(stats.print_stats, display_limit)
+        output_callers = capture_output(
+            stats.print_callers, display_limit)
+        output_file = ops.get('log_file')
+        if output_file in (None, 'stderr'):
+            f = sys.stderr
+        elif output_file in ('-', 'stdout'):
+            f = sys.stdout
+        else:
+            f = open(output_file, 'a')
+            f.write('\n%s\n' % ('-'*60))
+            f.write('Date: %s\n' % time.strftime('%c'))
+        f.write('Function call: %s\n'
+                % self.format_function(func, *args, **kw))
+        f.write('Wall time: %0.2f seconds\n'
+                % (end_time - start_time))
+        f.write(output)
+        f.write(output_callers)
+        if output_file not in (None, '-', 'stdout', 'stderr'):
+            f.close()
+        if exc_info:
+            # We captured an exception earlier, now we re-raise it
+            raise exc_info[0], exc_info[1], exc_info[2]
+        return result
+        
+    def format_function(self, func, *args, **kw):
+        args = map(repr, args)
+        args.extend(
+            ['%s=%r' % (k, v) for k, v in kw.items()])
+        return '%s(%s)' % (func.__name__, ', '.join(args))
+            
+            
+def make_profile_middleware(
+    app, global_conf,
+    log_filename='profile.log.tmp',
+    limit=40):
+    """
+    Wrap the application in a component that will profile each
+    request.  The profiling data is then appended to the output
+    of each page.
+
+    Note that this serializes all requests (i.e., removing
+    concurrency).  Therefore never use this in production.
+    """
+    limit = int(limit)
+    return ProfileMiddleware(
+        app, log_filename=log_filename, limit=limit)
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/debug/fsdiff.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/debug/fsdiff.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/debug/fsdiff.py (revision 3)
@@ -0,0 +1,409 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+"""
+Module to find differences over time in a filesystem
+
+Basically this takes a snapshot of a directory, then sees what changes
+were made.  The contents of the files are not checked, so you can
+detect that the content was changed, but not what the old version of
+the file was.
+"""
+
+import os
+from fnmatch import fnmatch
+from datetime import datetime
+from paste.util.UserDict24 import IterableUserDict
+import operator
+import re
+
+__all__ = ['Diff', 'Snapshot', 'File', 'Dir', 'report_expected_diffs',
+           'show_diff']
+
+class Diff(object):
+
+    """
+    Represents the difference between two snapshots
+    """
+
+    def __init__(self, before, after):
+        self.before = before
+        self.after = after
+        self._calculate()
+
+    def _calculate(self):
+        before = self.before.data
+        after = self.after.data
+        self.deleted = {}
+        self.updated = {}
+        self.created = after.copy()
+        for path, f in before.items():
+            if path not in after:
+                self.deleted[path] = f
+                continue
+            del self.created[path]
+            if f.mtime < after[path].mtime:
+                self.updated[path] = after[path]
+
+    def __str__(self):
+        return self.report()
+
+    def report(self, header=True, dates=False):
+        s = []
+        if header:
+            s.append('Difference in %s from %s to %s:' %
+                     (self.before.base_path,
+                      self.before.calculated,
+                      self.after.calculated))
+        for name, files, show_size in [
+            ('created', self.created, True),
+            ('deleted', self.deleted, True),
+            ('updated', self.updated, True)]:
+            if files:
+                s.append('-- %s: -------------------' % name)
+                files = files.items()
+                files.sort()
+                last = ''
+                for path, f in files:
+                    t = '  %s' % _space_prefix(last, path, indent=4,
+                                               include_sep=False)
+                    last = path
+                    if show_size and f.size != 'N/A':
+                        t += '  (%s bytes)' % f.size
+                    if dates:
+                        parts = []
+                        if self.before.get(path):
+                            parts.append(self.before[path].mtime)
+                        if self.after.get(path):
+                            parts.append(self.after[path].mtime)
+                        t += ' (mtime: %s)' % ('->'.join(map(repr, parts)))
+                    s.append(t)
+        if len(s) == 1:
+            s.append('  (no changes)')
+        return '\n'.join(s)
+
+class Snapshot(IterableUserDict):
+
+    """
+    Represents a snapshot of a set of files.  Has a dictionary-like
+    interface, keyed relative to ``base_path``
+    """
+
+    def __init__(self, base_path, files=None, ignore_wildcards=(),
+                 ignore_paths=(), ignore_hidden=True):
+        self.base_path = base_path
+        self.ignore_wildcards = ignore_wildcards
+        self.ignore_hidden = ignore_hidden
+        self.ignore_paths = ignore_paths
+        self.calculated = None
+        self.data = files or {}
+        if files is None:
+            self.find_files()
+
+    ############################################################
+    ## File finding
+    ############################################################
+
+    def find_files(self):
+        """
+        Find all the files under the base path, and put them in
+        ``self.data``
+        """
+        self._find_traverse('', self.data)
+        self.calculated = datetime.now()
+
+    def _ignore_file(self, fn):
+        if fn in self.ignore_paths:
+            return True
+        if self.ignore_hidden and os.path.basename(fn).startswith('.'):
+            return True
+        for pat in self.ignore_wildcards:
+            if fnmatch(fn, pat):
+                return True
+        return False
+
+    def _ignore_file(self, fn):
+        if fn in self.ignore_paths:
+            return True
+        if self.ignore_hidden and os.path.basename(fn).startswith('.'):
+            return True
+        return False
+
+    def _find_traverse(self, path, result):
+        full = os.path.join(self.base_path, path)
+        if os.path.isdir(full):
+            if path:
+                # Don't actually include the base path
+                result[path] = Dir(self.base_path, path)
+            for fn in os.listdir(full):
+                fn = os.path.join(path, fn)
+                if self._ignore_file(fn):
+                    continue
+                self._find_traverse(fn, result)
+        else:
+            result[path] = File(self.base_path, path)
+
+    def __repr__(self):
+        return '<%s in %r from %r>' % (
+            self.__class__.__name__, self.base_path,
+            self.calculated or '(no calculation done)')
+
+    def compare_expected(self, expected, comparison=operator.eq,
+                         differ=None, not_found=None,
+                         include_success=False):
+        """
+        Compares a dictionary of ``path: content`` to the
+        found files.  Comparison is done by equality, or the
+        ``comparison(actual_content, expected_content)`` function given.
+
+        Returns dictionary of differences, keyed by path.  Each
+        difference is either noted, or the output of
+        ``differ(actual_content, expected_content)`` is given.
+
+        If a file does not exist and ``not_found`` is given, then
+        ``not_found(path)`` is put in.
+        """
+        result = {}
+        for path in expected:
+            orig_path = path
+            path = path.strip('/')
+            if path not in self.data:
+                if not_found:
+                    msg = not_found(path)
+                else:
+                    msg = 'not found'
+                result[path] = msg
+                continue
+            expected_content = expected[orig_path]
+            file = self.data[path]
+            actual_content = file.bytes
+            if not comparison(actual_content, expected_content):
+                if differ:
+                    msg = differ(actual_content, expected_content)
+                else:
+                    if len(actual_content) < len(expected_content):
+                        msg = 'differ (%i bytes smaller)' % (
+                            len(expected_content) - len(actual_content))
+                    elif len(actual_content) > len(expected_content):
+                        msg = 'differ (%i bytes larger)' % (
+                            len(actual_content) - len(expected_content))
+                    else:
+                        msg = 'diff (same size)'
+                result[path] = msg
+            elif include_success:
+                result[path] = 'same!'
+        return result
+
+    def diff_to_now(self):
+        return Diff(self, self.clone())
+
+    def clone(self):
+        return self.__class__(base_path=self.base_path,
+                              ignore_wildcards=self.ignore_wildcards,
+                              ignore_paths=self.ignore_paths,
+                              ignore_hidden=self.ignore_hidden)
+
+class File(object):
+
+    """
+    Represents a single file found as the result of a command.
+
+    Has attributes:
+
+    ``path``:
+        The path of the file, relative to the ``base_path``
+
+    ``full``:
+        The full path
+
+    ``stat``:
+        The results of ``os.stat``.  Also ``mtime`` and ``size``
+        contain the ``.st_mtime`` and ``st_size`` of the stat.
+
+    ``bytes``:
+        The contents of the file.
+
+    You may use the ``in`` operator with these objects (tested against
+    the contents of the file), and the ``.mustcontain()`` method.
+    """
+
+    file = True
+    dir = False
+
+    def __init__(self, base_path, path):
+        self.base_path = base_path
+        self.path = path
+        self.full = os.path.join(base_path, path)
+        self.stat = os.stat(self.full)
+        self.mtime = self.stat.st_mtime
+        self.size = self.stat.st_size
+        self._bytes = None
+
+    def bytes__get(self):
+        if self._bytes is None:
+            f = open(self.full, 'rb')
+            self._bytes = f.read()
+            f.close()
+        return self._bytes
+    bytes = property(bytes__get)
+
+    def __contains__(self, s):
+        return s in self.bytes
+
+    def mustcontain(self, s):
+        __tracebackhide__ = True
+        bytes = self.bytes
+        if s not in bytes:
+            print 'Could not find %r in:' % s
+            print bytes
+            assert s in bytes
+
+    def __repr__(self):
+        return '<%s %s:%s>' % (
+            self.__class__.__name__,
+            self.base_path, self.path)
+
+class Dir(File):
+
+    """
+    Represents a directory created by a command.
+    """
+
+    file = False
+    dir = True
+
+    def __init__(self, base_path, path):
+        self.base_path = base_path
+        self.path = path
+        self.full = os.path.join(base_path, path)
+        self.size = 'N/A'
+        self.mtime = 'N/A'
+
+    def __repr__(self):
+        return '<%s %s:%s>' % (
+            self.__class__.__name__,
+            self.base_path, self.path)
+
+    def bytes__get(self):
+        raise NotImplementedError(
+            "Directory %r doesn't have content" % self)
+
+    bytes = property(bytes__get)
+    
+
+def _space_prefix(pref, full, sep=None, indent=None, include_sep=True):
+    """
+    Anything shared by pref and full will be replaced with spaces
+    in full, and full returned.
+
+    Example::
+
+        >>> _space_prefix('/foo/bar', '/foo')
+        '    /bar'
+    """
+    if sep is None:
+        sep = os.path.sep
+    pref = pref.split(sep)
+    full = full.split(sep)
+    padding = []
+    while pref and full and pref[0] == full[0]:
+        if indent is None:
+            padding.append(' ' * (len(full[0]) + len(sep)))
+        else:
+            padding.append(' ' * indent)
+        full.pop(0)
+        pref.pop(0)
+    if padding:
+        if include_sep:
+            return ''.join(padding) + sep + sep.join(full)
+        else:
+            return ''.join(padding) + sep.join(full)
+    else:
+        return sep.join(full)
+
+def report_expected_diffs(diffs, colorize=False):
+    """
+    Takes the output of compare_expected, and returns a string
+    description of the differences.
+    """
+    if not diffs:
+        return 'No differences'
+    diffs = diffs.items()
+    diffs.sort()
+    s = []
+    last = ''
+    for path, desc in diffs:
+        t = _space_prefix(last, path, indent=4, include_sep=False)
+        if colorize:
+            t = color_line(t, 11)
+        last = path
+        if len(desc.splitlines()) > 1:
+            cur_indent = len(re.search(r'^[ ]*', t).group(0))
+            desc = indent(cur_indent+2, desc)
+            if colorize:
+                t += '\n'
+                for line in desc.splitlines():
+                    if line.strip().startswith('+'):
+                        line = color_line(line, 10)
+                    elif line.strip().startswith('-'):
+                        line = color_line(line, 9)
+                    else:
+                        line = color_line(line, 14)
+                    t += line+'\n'
+            else:
+                t += '\n' + desc
+        else:
+            t += ' '+desc
+        s.append(t)
+    s.append('Files with differences: %s' % len(diffs))
+    return '\n'.join(s)
+
+def color_code(foreground=None, background=None):
+    """
+    0  black
+    1  red
+    2  green
+    3  yellow
+    4  blue
+    5  magenta (purple)
+    6  cyan
+    7  white (gray)
+
+    Add 8 to get high-intensity
+    """
+    if foreground is None and background is None:
+        # Reset
+        return '\x1b[0m'
+    codes = []
+    if foreground is None:
+        codes.append('[39m')
+    elif foreground > 7:
+        codes.append('[1m')
+        codes.append('[%im' % (22+foreground))
+    else:
+        codes.append('[%im' % (30+foreground))
+    if background is None:
+        codes.append('[49m')
+    else:
+        codes.append('[%im' % (40+background))
+    return '\x1b' + '\x1b'.join(codes)
+
+def color_line(line, foreground=None, background=None):
+    match = re.search(r'^(\s*)', line)
+    return (match.group(1) + color_code(foreground, background)
+            + line[match.end():] + color_code())
+
+def indent(indent, text):
+    return '\n'.join(
+        [' '*indent + l for l in text.splitlines()])
+
+def show_diff(actual_content, expected_content):
+    actual_lines = [l.strip() for l in actual_content.splitlines()
+                    if l.strip()]
+    expected_lines = [l.strip() for l in expected_content.splitlines()
+                      if l.strip()]
+    if len(actual_lines) == len(expected_lines) == 1:
+        return '%r not %r' % (actual_lines[0], expected_lines[0])
+    if not actual_lines:
+        return 'Empty; should have:\n'+expected_content
+    import difflib
+    return '\n'.join(difflib.ndiff(actual_lines, expected_lines))
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/debug/watchthreads.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/debug/watchthreads.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/debug/watchthreads.py (revision 3)
@@ -0,0 +1,347 @@
+"""
+Watches the key ``paste.httpserver.thread_pool`` to see how many
+threads there are and report on any wedged threads.
+"""
+import sys
+import cgi
+import time
+import traceback
+from cStringIO import StringIO
+from thread import get_ident
+from paste import httpexceptions
+from paste.request import construct_url, parse_formvars
+from paste.util.template import HTMLTemplate, bunch
+
+page_template = HTMLTemplate('''
+<html>
+ <head>
+  <style type="text/css">
+   body {
+     font-family: sans-serif;
+   }
+   table.environ tr td {
+     border-bottom: #bbb 1px solid;
+   }
+   table.environ tr td.bottom {
+     border-bottom: none;
+   }
+   table.thread {
+     border: 1px solid #000;
+     margin-bottom: 1em;
+   }
+   table.thread tr td {
+     border-bottom: #999 1px solid;
+     padding-right: 1em;
+   }
+   table.thread tr td.bottom {
+     border-bottom: none;
+   }
+   table.thread tr.this_thread td {
+     background-color: #006;
+     color: #fff;
+   }
+   a.button {
+     background-color: #ddd;
+     border: #aaa outset 2px;
+     text-decoration: none;
+     margin-top: 10px;
+     font-size: 80%;
+     color: #000;
+   }
+   a.button:hover {
+     background-color: #eee;
+     border: #bbb outset 2px;
+   }
+   a.button:active {
+     border: #bbb inset 2px;
+   }
+  </style>
+  <title>{{title}}</title>
+ </head>
+ <body>
+  <h1>{{title}}</h1>
+  {{if kill_thread_id}}
+  <div style="background-color: #060; color: #fff;
+              border: 2px solid #000;">
+  Thread {{kill_thread_id}} killed
+  </div>
+  {{endif}}
+  <div>Pool size: {{nworkers}}
+       {{if actual_workers > nworkers}}
+         + {{actual_workers-nworkers}} extra
+       {{endif}}
+       ({{nworkers_used}} used including current request)<br>
+       idle: {{len(track_threads["idle"])}},
+       busy: {{len(track_threads["busy"])}},
+       hung: {{len(track_threads["hung"])}},
+       dying: {{len(track_threads["dying"])}},
+       zombie: {{len(track_threads["zombie"])}}</div>
+
+{{for thread in threads}}
+
+<table class="thread">
+ <tr {{if thread.thread_id == this_thread_id}}class="this_thread"{{endif}}>
+  <td>
+   <b>Thread</b>
+   {{if thread.thread_id == this_thread_id}}
+   (<i>this</i> request)
+   {{endif}}</td>
+  <td>
+   <b>{{thread.thread_id}}
+    {{if allow_kill}}
+    <form action="{{script_name}}/kill" method="POST"
+          style="display: inline">
+      <input type="hidden" name="thread_id" value="{{thread.thread_id}}">
+      <input type="submit" value="kill">
+    </form>
+    {{endif}}
+   </b>
+  </td>
+ </tr>
+ <tr>
+  <td>Time processing request</td>
+  <td>{{thread.time_html|html}}</td>
+ </tr>
+ <tr>
+  <td>URI</td>
+  <td>{{if thread.uri == 'unknown'}}
+      unknown
+      {{else}}<a href="{{thread.uri}}">{{thread.uri_short}}</a>
+      {{endif}}
+  </td>
+ <tr>
+  <td colspan="2" class="bottom">
+   <a href="#" class="button" style="width: 9em; display: block"
+      onclick="
+        var el = document.getElementById('environ-{{thread.thread_id}}');
+        if (el.style.display) {
+            el.style.display = '';
+            this.innerHTML = \'&#9662; Hide environ\';
+        } else {
+            el.style.display = 'none';
+            this.innerHTML = \'&#9656; Show environ\';
+        }
+        return false
+      ">&#9656; Show environ</a>
+   
+   <div id="environ-{{thread.thread_id}}" style="display: none">
+    {{if thread.environ:}}
+    <table class="environ">
+     {{for loop, item in looper(sorted(thread.environ.items()))}}
+     {{py:key, value=item}}
+     <tr>
+      <td {{if loop.last}}class="bottom"{{endif}}>{{key}}</td>
+      <td {{if loop.last}}class="bottom"{{endif}}>{{value}}</td>
+     </tr>
+     {{endfor}}
+    </table>
+    {{else}}
+    Thread is in process of starting
+    {{endif}}
+   </div>
+
+   {{if thread.traceback}}
+   <a href="#" class="button" style="width: 9em; display: block"
+      onclick="
+        var el = document.getElementById('traceback-{{thread.thread_id}}');
+        if (el.style.display) {
+            el.style.display = '';
+            this.innerHTML = \'&#9662; Hide traceback\';
+        } else {
+            el.style.display = 'none';
+            this.innerHTML = \'&#9656; Show traceback\';
+        }
+        return false
+      ">&#9656; Show traceback</a>
+
+    <div id="traceback-{{thread.thread_id}}" style="display: none">
+      <pre class="traceback">{{thread.traceback}}</pre>
+    </div>
+    {{endif}}
+
+  </td>
+ </tr>
+</table>
+
+{{endfor}}
+
+ </body>
+</html>
+''', name='watchthreads.page_template')
+
+class WatchThreads(object):
+
+    """
+    Application that watches the threads in ``paste.httpserver``,
+    showing the length each thread has been working on a request.
+
+    If allow_kill is true, then you can kill errant threads through
+    this application.
+
+    This application can expose private information (specifically in
+    the environment, like cookies), so it should be protected.
+    """
+
+    def __init__(self, allow_kill=False):
+        self.allow_kill = allow_kill
+
+    def __call__(self, environ, start_response):
+        if 'paste.httpserver.thread_pool' not in environ:
+            start_response('403 Forbidden', [('Content-type', 'text/plain')])
+            return ['You must use the threaded Paste HTTP server to use this application']
+        if environ.get('PATH_INFO') == '/kill':
+            return self.kill(environ, start_response)
+        else:
+            return self.show(environ, start_response)
+
+    def show(self, environ, start_response):
+        start_response('200 OK', [('Content-type', 'text/html')])
+        form = parse_formvars(environ)
+        if form.get('kill'):
+            kill_thread_id = form['kill']
+        else:
+            kill_thread_id = None
+        thread_pool = environ['paste.httpserver.thread_pool']
+        nworkers = thread_pool.nworkers
+        now = time.time()
+
+
+        workers = thread_pool.worker_tracker.items()
+        workers.sort(key=lambda v: v[1][0])
+        threads = []
+        for thread_id, (time_started, worker_environ) in workers:
+            thread = bunch()
+            threads.append(thread)
+            if worker_environ:
+                thread.uri = construct_url(worker_environ)
+            else:
+                thread.uri = 'unknown'
+            thread.thread_id = thread_id
+            thread.time_html = format_time(now-time_started)
+            thread.uri_short = shorten(thread.uri)
+            thread.environ = worker_environ
+            thread.traceback = traceback_thread(thread_id)
+            
+        page = page_template.substitute(
+            title="Thread Pool Worker Tracker",
+            nworkers=nworkers,
+            actual_workers=len(thread_pool.workers),
+            nworkers_used=len(workers),
+            script_name=environ['SCRIPT_NAME'],
+            kill_thread_id=kill_thread_id,
+            allow_kill=self.allow_kill,
+            threads=threads,
+            this_thread_id=get_ident(),
+            track_threads=thread_pool.track_threads())
+
+        return [page]
+
+    def kill(self, environ, start_response):
+        if not self.allow_kill:
+            exc = httpexceptions.HTTPForbidden(
+                'Killing threads has not been enabled.  Shame on you '
+                'for trying!')
+            return exc(environ, start_response)
+        vars = parse_formvars(environ)
+        thread_id = int(vars['thread_id'])
+        thread_pool = environ['paste.httpserver.thread_pool']
+        if thread_id not in thread_pool.worker_tracker:
+            exc = httpexceptions.PreconditionFailed(
+                'You tried to kill thread %s, but it is not working on '
+                'any requests' % thread_id)
+            return exc(environ, start_response)
+        thread_pool.kill_worker(thread_id)
+        script_name = environ['SCRIPT_NAME'] or '/'
+        exc = httpexceptions.HTTPFound(
+            headers=[('Location', script_name+'?kill=%s' % thread_id)])
+        return exc(environ, start_response)
+        
+def traceback_thread(thread_id):
+    """
+    Returns a plain-text traceback of the given thread, or None if it
+    can't get a traceback.
+    """
+    if not hasattr(sys, '_current_frames'):
+        # Only 2.5 has support for this, with this special function
+        return None
+    frames = sys._current_frames()
+    if not thread_id in frames:
+        return None
+    frame = frames[thread_id]
+    out = StringIO()
+    traceback.print_stack(frame, file=out)
+    return out.getvalue()
+
+hide_keys = ['paste.httpserver.thread_pool']
+
+def format_environ(environ):
+    if environ is None:
+        return environ_template.substitute(
+            key='---',
+            value='No environment registered for this thread yet')
+    environ_rows = []
+    for key, value in sorted(environ.items()):
+        if key in hide_keys:
+            continue
+        try:
+            if key.upper() != key:
+                value = repr(value)
+            environ_rows.append(
+                environ_template.substitute(
+                key=cgi.escape(str(key)),
+                value=cgi.escape(str(value))))
+        except Exception, e:
+            environ_rows.append(
+                environ_template.substitute(
+                key=cgi.escape(str(key)),
+                value='Error in <code>repr()</code>: %s' % e))
+    return ''.join(environ_rows)
+    
+def format_time(time_length):
+    if time_length >= 60*60:
+        # More than an hour
+        time_string = '%i:%02i:%02i' % (int(time_length/60/60),
+                                        int(time_length/60) % 60,
+                                        time_length % 60)
+    elif time_length >= 120:
+        time_string = '%i:%02i' % (int(time_length/60),
+                                   time_length % 60)
+    elif time_length > 60:
+        time_string = '%i sec' % time_length
+    elif time_length > 1:
+        time_string = '%0.1f sec' % time_length
+    else:
+        time_string = '%0.2f sec' % time_length
+    if time_length < 5:
+        return time_string
+    elif time_length < 120:
+        return '<span style="color: #900">%s</span>' % time_string
+    else:
+        return '<span style="background-color: #600; color: #fff">%s</span>' % time_string
+
+def shorten(s):
+    if len(s) > 60:
+        return s[:40]+'...'+s[-10:]
+    else:
+        return s
+
+def make_watch_threads(global_conf, allow_kill=False):
+    from paste.deploy.converters import asbool
+    return WatchThreads(allow_kill=asbool(allow_kill))
+make_watch_threads.__doc__ = WatchThreads.__doc__
+
+def make_bad_app(global_conf, pause=0):
+    pause = int(pause)
+    def bad_app(environ, start_response):
+        import thread
+        if pause:
+            time.sleep(pause)
+        else:
+            count = 0
+            while 1:
+                print "I'm alive %s (%s)" % (count, thread.get_ident())
+                time.sleep(10)
+                count += 1
+        start_response('200 OK', [('content-type', 'text/plain')])
+        return ['OK, paused %s seconds' % pause]
+    return bad_app
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/debug/doctest_webapp.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/debug/doctest_webapp.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/debug/doctest_webapp.py (revision 3)
@@ -0,0 +1,435 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+#!/usr/bin/env python2.4
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+
+"""
+These are functions for use when doctest-testing a document.
+"""
+
+try:
+    import subprocess
+except ImportError:
+    from paste.util import subprocess24 as subprocess
+import doctest
+import os
+import sys
+import shutil
+import re
+import cgi
+import rfc822
+from cStringIO import StringIO
+from paste.util import PySourceColor
+
+
+here = os.path.abspath(__file__)
+paste_parent = os.path.dirname(
+    os.path.dirname(os.path.dirname(here)))
+
+def run(command):
+    data = run_raw(command)
+    if data:
+        print data
+
+def run_raw(command):
+    """
+    Runs the string command, returns any output.
+    """
+    proc = subprocess.Popen(command, shell=True,
+                            stderr=subprocess.STDOUT,
+                            stdout=subprocess.PIPE, env=_make_env())
+    data = proc.stdout.read()
+    proc.wait()
+    while data.endswith('\n') or data.endswith('\r'):
+        data = data[:-1]
+    if data:
+        data = '\n'.join(
+            [l for l in data.splitlines() if l])
+        return data
+    else:
+        return ''
+
+def run_command(command, name, and_print=False):
+    output = run_raw(command)
+    data = '$ %s\n%s' % (command, output)
+    show_file('shell-command', name, description='shell transcript',
+              data=data)
+    if and_print and output:
+        print output
+
+def _make_env():
+    env = os.environ.copy()
+    env['PATH'] = (env.get('PATH', '')
+                   + ':'
+                   + os.path.join(paste_parent, 'scripts')
+                   + ':'
+                   + os.path.join(paste_parent, 'paste', '3rd-party',
+                                  'sqlobject-files', 'scripts'))
+    env['PYTHONPATH'] = (env.get('PYTHONPATH', '')
+                         + ':'
+                         + paste_parent)
+    return env
+
+def clear_dir(dir):
+    """
+    Clears (deletes) the given directory
+    """
+    shutil.rmtree(dir, True)
+
+def ls(dir=None, recurse=False, indent=0):
+    """
+    Show a directory listing
+    """
+    dir = dir or os.getcwd()
+    fns = os.listdir(dir)
+    fns.sort()
+    for fn in fns:
+        full = os.path.join(dir, fn)
+        if os.path.isdir(full):
+            fn = fn + '/'
+        print ' '*indent + fn
+        if os.path.isdir(full) and recurse:
+            ls(dir=full, recurse=True, indent=indent+2)
+
+default_app = None
+default_url = None
+
+def set_default_app(app, url):
+    global default_app
+    global default_url
+    default_app = app
+    default_url = url
+
+def resource_filename(fn):
+    """
+    Returns the filename of the resource -- generally in the directory
+    resources/DocumentName/fn
+    """
+    return os.path.join(
+        os.path.dirname(sys.testing_document_filename),
+        'resources',
+        os.path.splitext(os.path.basename(sys.testing_document_filename))[0],
+        fn)
+
+def show(path_info, example_name):
+    fn = resource_filename(example_name + '.html')
+    out = StringIO()
+    assert default_app is not None, (
+        "No default_app set")
+    url = default_url + path_info
+    out.write('<span class="doctest-url"><a href="%s">%s</a></span><br>\n'
+              % (url, url))
+    out.write('<div class="doctest-example">\n')
+    proc = subprocess.Popen(
+        ['paster', 'serve' '--server=console', '--no-verbose',
+         '--url=' + path_info],
+        stderr=subprocess.PIPE,
+        stdout=subprocess.PIPE,
+        env=_make_env())
+    stdout, errors = proc.communicate()
+    stdout = StringIO(stdout)
+    headers = rfc822.Message(stdout)
+    content = stdout.read()
+    for header, value in headers.items():
+        if header.lower() == 'status' and int(value.split()[0]) == 200:
+            continue
+        if header.lower() in ('content-type', 'content-length'):
+            continue
+        if (header.lower() == 'set-cookie'
+            and value.startswith('_SID_')):
+            continue
+        out.write('<span class="doctest-header">%s: %s</span><br>\n'
+                  % (header, value))
+    lines = [l for l in content.splitlines() if l.strip()]
+    for line in lines:
+        out.write(line + '\n')
+    if errors:
+        out.write('<pre class="doctest-errors">%s</pre>'
+                  % errors)
+    out.write('</div>\n')
+    result = out.getvalue()
+    if not os.path.exists(fn):
+        f = open(fn, 'wb')
+        f.write(result)
+        f.close()
+    else:
+        f = open(fn, 'rb')
+        expected = f.read()
+        f.close()
+        if not html_matches(expected, result):
+            print 'Pages did not match.  Expected from %s:' % fn
+            print '-'*60
+            print expected
+            print '='*60
+            print 'Actual output:'
+            print '-'*60
+            print result
+
+def html_matches(pattern, text):
+    regex = re.escape(pattern)
+    regex = regex.replace(r'\.\.\.', '.*')
+    regex = re.sub(r'0x[0-9a-f]+', '.*', regex)
+    regex = '^%s$' % regex
+    return re.search(regex, text)
+
+def convert_docstring_string(data):
+    if data.startswith('\n'):
+        data = data[1:]
+    lines = data.splitlines()
+    new_lines = []
+    for line in lines:
+        if line.rstrip() == '.':
+            new_lines.append('')
+        else:
+            new_lines.append(line)
+    data = '\n'.join(new_lines) + '\n'
+    return data
+
+def create_file(path, version, data):
+    data = convert_docstring_string(data)
+    write_data(path, data)
+    show_file(path, version)
+
+def append_to_file(path, version, data):
+    data = convert_docstring_string(data)
+    f = open(path, 'a')
+    f.write(data)
+    f.close()
+    # I think these appends can happen so quickly (in less than a second)
+    # that the .pyc file doesn't appear to be expired, even though it
+    # is after we've made this change; so we have to get rid of the .pyc
+    # file:
+    if path.endswith('.py'):
+        pyc_file = path + 'c'
+        if os.path.exists(pyc_file):
+            os.unlink(pyc_file)
+    show_file(path, version, description='added to %s' % path,
+              data=data)
+
+def show_file(path, version, description=None, data=None):
+    ext = os.path.splitext(path)[1]
+    if data is None:
+        f = open(path, 'rb')
+        data = f.read()
+        f.close()
+    if ext == '.py':
+        html = ('<div class="source-code">%s</div>' 
+                % PySourceColor.str2html(data, PySourceColor.dark))
+    else:
+        html = '<pre class="source-code">%s</pre>' % cgi.escape(data, 1)
+    html = '<span class="source-filename">%s</span><br>%s' % (
+        description or path, html)
+    write_data(resource_filename('%s.%s.gen.html' % (path, version)),
+               html)
+
+def call_source_highlight(input, format):
+    proc = subprocess.Popen(['source-highlight', '--out-format=html',
+                             '--no-doc', '--css=none',
+                             '--src-lang=%s' % format], shell=False,
+                            stdout=subprocess.PIPE)
+    stdout, stderr = proc.communicate(input)
+    result = stdout
+    proc.wait()
+    return result
+
+
+def write_data(path, data):
+    dir = os.path.dirname(os.path.abspath(path))
+    if not os.path.exists(dir):
+        os.makedirs(dir)
+    f = open(path, 'wb')
+    f.write(data)
+    f.close()
+    
+
+def change_file(path, changes):
+    f = open(os.path.abspath(path), 'rb')
+    lines = f.readlines()
+    f.close()
+    for change_type, line, text in changes:
+        if change_type == 'insert':
+            lines[line:line] = [text]
+        elif change_type == 'delete':
+            lines[line:text] = []
+        else:
+            assert 0, (
+                "Unknown change_type: %r" % change_type)
+    f = open(path, 'wb')
+    f.write(''.join(lines))
+    f.close()
+
+class LongFormDocTestParser(doctest.DocTestParser):
+
+    """
+    This parser recognizes some reST comments as commands, without
+    prompts or expected output, like:
+
+    .. run:
+
+        do_this(...
+        ...)
+    """
+
+    _EXAMPLE_RE = re.compile(r"""
+        # Source consists of a PS1 line followed by zero or more PS2 lines.
+        (?: (?P<source>
+                (?:^(?P<indent> [ ]*) >>>    .*)    # PS1 line
+                (?:\n           [ ]*  \.\.\. .*)*)  # PS2 lines
+            \n?
+            # Want consists of any non-blank lines that do not start with PS1.
+            (?P<want> (?:(?![ ]*$)    # Not a blank line
+                         (?![ ]*>>>)  # Not a line starting with PS1
+                         .*$\n?       # But any other line
+                      )*))
+        | 
+        (?: # This is for longer commands that are prefixed with a reST
+            # comment like '.. run:' (two colons makes that a directive).
+            # These commands cannot have any output.
+
+            (?:^\.\.[ ]*(?P<run>run):[ ]*\n) # Leading command/command
+            (?:[ ]*\n)?         # Blank line following
+            (?P<runsource>
+                (?:(?P<runindent> [ ]+)[^ ].*$)
+                (?:\n [ ]+ .*)*)
+            )
+        |
+        (?: # This is for shell commands
+
+            (?P<shellsource>
+                (?:^(P<shellindent> [ ]*) [$] .*)   # Shell line
+                (?:\n               [ ]*  [>] .*)*) # Continuation
+            \n?
+            # Want consists of any non-blank lines that do not start with $
+            (?P<shellwant> (?:(?![ ]*$)
+                              (?![ ]*[$]$)
+                              .*$\n?
+                           )*))
+        """, re.MULTILINE | re.VERBOSE)
+
+    def _parse_example(self, m, name, lineno):
+        r"""
+        Given a regular expression match from `_EXAMPLE_RE` (`m`),
+        return a pair `(source, want)`, where `source` is the matched
+        example's source code (with prompts and indentation stripped);
+        and `want` is the example's expected output (with indentation
+        stripped).
+
+        `name` is the string's name, and `lineno` is the line number
+        where the example starts; both are used for error messages.
+
+        >>> def parseit(s):
+        ...     p = LongFormDocTestParser()
+        ...     return p._parse_example(p._EXAMPLE_RE.search(s), '<string>', 1)
+        >>> parseit('>>> 1\n1')
+        ('1', {}, '1', None)
+        >>> parseit('>>> (1\n... +1)\n2')
+        ('(1\n+1)', {}, '2', None)
+        >>> parseit('.. run:\n\n    test1\n    test2\n')
+        ('test1\ntest2', {}, '', None)
+        """
+        # Get the example's indentation level.
+        runner = m.group('run') or ''
+        indent = len(m.group('%sindent' % runner))
+        
+        # Divide source into lines; check that they're properly
+        # indented; and then strip their indentation & prompts.
+        source_lines = m.group('%ssource' % runner).split('\n')
+        if runner:
+            self._check_prefix(source_lines[1:], ' '*indent, name, lineno)
+        else:
+            self._check_prompt_blank(source_lines, indent, name, lineno)
+            self._check_prefix(source_lines[2:], ' '*indent + '.', name, lineno)
+        if runner:
+            source = '\n'.join([sl[indent:] for sl in source_lines])
+        else:
+            source = '\n'.join([sl[indent+4:] for sl in source_lines])
+
+        if runner:
+            want = ''
+            exc_msg = None
+        else:
+            # Divide want into lines; check that it's properly indented; and
+            # then strip the indentation.  Spaces before the last newline should
+            # be preserved, so plain rstrip() isn't good enough.
+            want = m.group('want')
+            want_lines = want.split('\n')
+            if len(want_lines) > 1 and re.match(r' *$', want_lines[-1]):
+                del want_lines[-1]  # forget final newline & spaces after it
+            self._check_prefix(want_lines, ' '*indent, name,
+                               lineno + len(source_lines))
+            want = '\n'.join([wl[indent:] for wl in want_lines])
+
+            # If `want` contains a traceback message, then extract it.
+            m = self._EXCEPTION_RE.match(want)
+            if m:
+                exc_msg = m.group('msg')
+            else:
+                exc_msg = None
+
+        # Extract options from the source.
+        options = self._find_options(source, name, lineno)
+
+        return source, options, want, exc_msg
+
+
+    def parse(self, string, name='<string>'):
+        """
+        Divide the given string into examples and intervening text,
+        and return them as a list of alternating Examples and strings.
+        Line numbers for the Examples are 0-based.  The optional
+        argument `name` is a name identifying this string, and is only
+        used for error messages.
+        """
+        string = string.expandtabs()
+        # If all lines begin with the same indentation, then strip it.
+        min_indent = self._min_indent(string)
+        if min_indent > 0:
+            string = '\n'.join([l[min_indent:] for l in string.split('\n')])
+
+        output = []
+        charno, lineno = 0, 0
+        # Find all doctest examples in the string:
+        for m in self._EXAMPLE_RE.finditer(string):
+            # Add the pre-example text to `output`.
+            output.append(string[charno:m.start()])
+            # Update lineno (lines before this example)
+            lineno += string.count('\n', charno, m.start())
+            # Extract info from the regexp match.
+            (source, options, want, exc_msg) = \
+                     self._parse_example(m, name, lineno)
+            # Create an Example, and add it to the list.
+            if not self._IS_BLANK_OR_COMMENT(source):
+                # @@: Erg, this is the only line I need to change...
+                output.append(doctest.Example(
+                    source, want, exc_msg,
+                    lineno=lineno,
+                    indent=min_indent+len(m.group('indent') or m.group('runindent')),
+                    options=options))
+            # Update lineno (lines inside this example)
+            lineno += string.count('\n', m.start(), m.end())
+            # Update charno.
+            charno = m.end()
+        # Add any remaining post-example text to `output`.
+        output.append(string[charno:])
+        return output
+
+
+
+if __name__ == '__main__':
+    if sys.argv[1:] and sys.argv[1] == 'doctest':
+        doctest.testmod()
+        sys.exit()
+    if not paste_parent in sys.path:
+        sys.path.append(paste_parent)
+    for fn in sys.argv[1:]:
+        fn = os.path.abspath(fn)
+        # @@: OK, ick; but this module gets loaded twice
+        sys.testing_document_filename = fn
+        doctest.testfile(
+            fn, module_relative=False,
+            optionflags=doctest.ELLIPSIS|doctest.REPORT_ONLY_FIRST_FAILURE,
+            parser=LongFormDocTestParser())
+        new = os.path.splitext(fn)[0] + '.html'
+        assert new != fn
+        os.system('rst2html.py %s > %s' % (fn, new))
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/debug/testserver.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/debug/testserver.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/debug/testserver.py (revision 3)
@@ -0,0 +1,93 @@
+# (c) 2005 Clark C. Evans
+# This module is part of the Python Paste Project and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+# This code was written with funding by http://prometheusresearch.com
+"""
+WSGI Test Server
+
+This builds upon paste.util.baseserver to customize it for regressions
+where using raw_interactive won't do.
+
+
+"""
+import time
+from paste.httpserver import *
+
+class WSGIRegressionServer(WSGIServer):
+    """
+    A threaded WSGIServer for use in regression testing.  To use this
+    module, call serve(application, regression=True), and then call
+    server.accept() to let it handle one request.  When finished, use
+    server.stop() to shutdown the server. Note that all pending requests
+    are processed before the server shuts down.
+    """
+    defaulttimeout = 10
+    def __init__ (self, *args, **kwargs):
+        WSGIServer.__init__(self, *args, **kwargs)
+        self.stopping = []
+        self.pending = []
+        self.timeout = self.defaulttimeout
+        # this is a local connection, be quick
+        self.socket.settimeout(2) 
+    def serve_forever(self):
+        from threading import Thread
+        thread = Thread(target=self.serve_pending)
+        thread.start()
+    def reset_expires(self):
+        if self.timeout:
+            self.expires = time.time() + self.timeout
+    def close_request(self, *args, **kwargs):
+        WSGIServer.close_request(self, *args, **kwargs)
+        self.pending.pop()
+        self.reset_expires()
+    def serve_pending(self):
+        self.reset_expires()
+        while not self.stopping or self.pending:
+            now = time.time()
+            if now > self.expires and self.timeout:
+                # note regression test doesn't handle exceptions in
+                # threads very well; so we just print and exit
+                print "\nWARNING: WSGIRegressionServer timeout exceeded\n"
+                break
+            if self.pending:
+                self.handle_request()
+            time.sleep(.1)
+    def stop(self):
+        """ stop the server (called from tester's thread) """
+        self.stopping.append(True)
+    def accept(self, count = 1):
+        """ accept another request (called from tester's thread) """
+        assert not self.stopping
+        [self.pending.append(True) for x in range(count)]
+
+def serve(application, host=None, port=None, handler=None):
+    server = WSGIRegressionServer(application, host, port, handler)
+    print "serving on %s:%s" % server.server_address
+    server.serve_forever()
+    return server
+
+if __name__ == '__main__':
+    import urllib
+    from paste.wsgilib import dump_environ
+    server = serve(dump_environ)
+    baseuri = ("http://%s:%s" % server.server_address)
+
+    def fetch(path):
+        # tell the server to humor exactly one more request
+        server.accept(1)
+        # not needed; but this is what you do if the server 
+        # may not respond in a resonable time period
+        import socket
+        socket.setdefaulttimeout(5)
+        # build a uri, fetch and return
+        return urllib.urlopen(baseuri + path).read()
+      
+    assert "PATH_INFO: /foo" in fetch("/foo")
+    assert "PATH_INFO: /womble" in fetch("/womble")
+
+    # ok, let's make one more final request...
+    server.accept(1)
+    # and then schedule a stop()
+    server.stop()
+    # and then... fetch it...
+    urllib.urlopen(baseuri)
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/debug/debugapp.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/debug/debugapp.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/debug/debugapp.py (revision 3)
@@ -0,0 +1,79 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+# (c) 2005 Clark C. Evans
+# This module is part of the Python Paste Project and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+# This code was written with funding by http://prometheusresearch.com
+"""
+Various Applications for Debugging/Testing Purposes
+"""
+
+import time
+__all__ = ['SimpleApplication', 'SlowConsumer']
+
+
+class SimpleApplication(object):
+    """
+    Produces a simple web page
+    """
+    def __call__(self, environ, start_response):
+        body = "<html><body>simple</body></html>"
+        start_response("200 OK", [('Content-Type', 'text/html'),
+                                  ('Content-Length', str(len(body)))])
+        return [body]
+
+class SlowConsumer(object):
+    """
+    Consumes an upload slowly...
+
+    NOTE: This should use the iterator form of ``wsgi.input``,
+          but it isn't implemented in paste.httpserver.
+    """
+    def __init__(self, chunk_size = 4096, delay = 1, progress = True):
+        self.chunk_size = chunk_size
+        self.delay = delay
+        self.progress = True
+
+    def __call__(self, environ, start_response):
+        size = 0
+        total  = environ.get('CONTENT_LENGTH')
+        if total:
+            remaining = int(total)
+            while remaining > 0:
+                if self.progress:
+                    print "%s of %s remaining" % (remaining, total)
+                if remaining > 4096:
+                    chunk = environ['wsgi.input'].read(4096)
+                else:
+                    chunk = environ['wsgi.input'].read(remaining)
+                if not chunk:
+                    break
+                size += len(chunk)
+                remaining -= len(chunk)
+                if self.delay:
+                    time.sleep(self.delay)
+            body = "<html><body>%d bytes</body></html>" % size
+        else:
+            body = ('<html><body>\n'
+                '<form method="post" enctype="multipart/form-data">\n'
+                '<input type="file" name="file">\n'
+                '<input type="submit" >\n'
+                '</form></body></html>\n')
+        print "bingles"
+        start_response("200 OK", [('Content-Type', 'text/html'),
+                                  ('Content-Length', len(body))])
+        return [body]
+
+def make_test_app(global_conf):
+    return SimpleApplication()
+
+make_test_app.__doc__ = SimpleApplication.__doc__
+
+def make_slow_app(global_conf, chunk_size=4096, delay=1, progress=True):
+    from paste.deploy.converters import asbool
+    return SlowConsumer(
+        chunk_size=int(chunk_size),
+        delay=int(delay),
+        progress=asbool(progress))
+
+make_slow_app.__doc__ = SlowConsumer.__doc__
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/urlmap.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/urlmap.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/urlmap.py (revision 3)
@@ -0,0 +1,251 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+"""
+Map URL prefixes to WSGI applications.  See ``URLMap``
+"""
+
+from UserDict import DictMixin
+import re
+import os
+from paste import httpexceptions
+
+__all__ = ['URLMap', 'PathProxyURLMap']
+
+def urlmap_factory(loader, global_conf, **local_conf):
+    if 'not_found_app' in local_conf:
+        not_found_app = local_conf.pop('not_found_app')
+    else:
+        not_found_app = global_conf.get('not_found_app')
+    if not_found_app:
+        not_found_app = loader.get_app(not_found_app, global_conf=global_conf)
+    urlmap = URLMap(not_found_app=not_found_app)
+    for path, app_name in local_conf.items():
+        path = parse_path_expression(path)
+        app = loader.get_app(app_name, global_conf=global_conf)
+        urlmap[path] = app
+    return urlmap
+
+def parse_path_expression(path):
+    """
+    Parses a path expression like 'domain foobar.com port 20 /' or
+    just '/foobar' for a path alone.  Returns as an address that
+    URLMap likes.
+    """
+    parts = path.split()
+    domain = port = path = None
+    while parts:
+        if parts[0] == 'domain':
+            parts.pop(0)
+            if not parts:
+                raise ValueError("'domain' must be followed with a domain name")
+            if domain:
+                raise ValueError("'domain' given twice")
+            domain = parts.pop(0)
+        elif parts[0] == 'port':
+            parts.pop(0)
+            if not parts:
+                raise ValueError("'port' must be followed with a port number")
+            if port:
+                raise ValueError("'port' given twice")
+            port = parts.pop(0)
+        else:
+            if path:
+                raise ValueError("more than one path given (have %r, got %r)"
+                                 % (path, parts[0]))
+            path = parts.pop(0)
+    s = ''
+    if domain:
+        s = 'http://%s' % domain
+    if port:
+        if not domain:
+            raise ValueError("If you give a port, you must also give a domain")
+        s += ':' + port
+    if path:
+        if s:
+            s += '/'
+        s += path
+    return s
+
+class URLMap(DictMixin):
+
+    """
+    URLMap instances are dictionary-like object that dispatch to one
+    of several applications based on the URL.
+
+    The dictionary keys are URLs to match (like
+    ``PATH_INFO.startswith(url)``), and the values are applications to
+    dispatch to.  URLs are matched most-specific-first, i.e., longest
+    URL first.  The ``SCRIPT_NAME`` and ``PATH_INFO`` environmental
+    variables are adjusted to indicate the new context.
+    
+    URLs can also include domains, like ``http://blah.com/foo``, or as
+    tuples ``('blah.com', '/foo')``.  This will match domain names; without
+    the ``http://domain`` or with a domain of ``None`` any domain will be
+    matched (so long as no other explicit domain matches).  """
+    
+    def __init__(self, not_found_app=None):
+        self.applications = []
+        if not not_found_app:
+            not_found_app = self.not_found_app
+        self.not_found_application = not_found_app
+
+    norm_url_re = re.compile('//+')
+    domain_url_re = re.compile('^(http|https)://')
+
+    def not_found_app(self, environ, start_response):
+        mapper = environ.get('paste.urlmap_object')
+        if mapper:
+            matches = [p for p, a in mapper.applications]
+            extra = 'defined apps: %s' % (
+                ',\n  '.join(map(repr, matches)))
+        else:
+            extra = ''
+        extra += '\nSCRIPT_NAME: %r' % environ.get('SCRIPT_NAME')
+        extra += '\nPATH_INFO: %r' % environ.get('PATH_INFO')
+        extra += '\nHTTP_HOST: %r' % environ.get('HTTP_HOST')
+        app = httpexceptions.HTTPNotFound(
+            environ['PATH_INFO'],
+            comment=extra).wsgi_application
+        return app(environ, start_response)
+
+    def normalize_url(self, url, trim=True):
+        if isinstance(url, (list, tuple)):
+            domain = url[0]
+            url = self.normalize_url(url[1])[1]
+            return domain, url
+        assert (not url or url.startswith('/') 
+                or self.domain_url_re.search(url)), (
+            "URL fragments must start with / or http:// (you gave %r)" % url)
+        match = self.domain_url_re.search(url)
+        if match:
+            url = url[match.end():]
+            if '/' in url:
+                domain, url = url.split('/', 1)
+                url = '/' + url
+            else:
+                domain, url = url, ''
+        else:
+            domain = None
+        url = self.norm_url_re.sub('/', url)
+        if trim:
+            url = url.rstrip('/')
+        return domain, url
+
+    def sort_apps(self):
+        """
+        Make sure applications are sorted with longest URLs first
+        """
+        def key(app_desc):
+            (domain, url), app = app_desc
+            if not domain:
+                # Make sure empty domains sort last:
+                return '\xff', -len(url)
+            else:
+                return domain, -len(url)
+        apps = [(key(desc), desc) for desc in self.applications]
+        apps.sort()
+        self.applications = [desc for (sortable, desc) in apps]
+
+    def __setitem__(self, url, app):
+        if app is None:
+            try:
+                del self[url]
+            except KeyError:
+                pass
+            return
+        dom_url = self.normalize_url(url)
+        if dom_url in self:
+            del self[dom_url]
+        self.applications.append((dom_url, app))
+        self.sort_apps()
+
+    def __getitem__(self, url):
+        dom_url = self.normalize_url(url)
+        for app_url, app in self.applications:
+            if app_url == dom_url:
+                return app
+        raise KeyError(
+            "No application with the url %r (domain: %r; existing: %s)" 
+            % (url[1], url[0] or '*', self.applications))
+
+    def __delitem__(self, url):
+        url = self.normalize_url(url)
+        for app_url, app in self.applications:
+            if app_url == url:
+                self.applications.remove((app_url, app))
+                break
+        else:
+            raise KeyError(
+                "No application with the url %r" % (url,))
+
+    def keys(self):
+        return [app_url for app_url, app in self.applications]
+
+    def __call__(self, environ, start_response):
+        host = environ.get('HTTP_HOST', environ.get('SERVER_NAME')).lower()
+        if ':' in host:
+            host, port = host.split(':', 1)
+        else:
+            if environ['wsgi.url_scheme'] == 'http':
+                port = '80'
+            else:
+                port = '443'
+        path_info = environ.get('PATH_INFO')
+        path_info = self.normalize_url(path_info, False)[1]
+        for (domain, app_url), app in self.applications:
+            if domain and domain != host and domain != host+':'+port:
+                continue
+            if (path_info == app_url
+                or path_info.startswith(app_url + '/')):
+                environ['SCRIPT_NAME'] += app_url
+                environ['PATH_INFO'] = path_info[len(app_url):]
+                return app(environ, start_response)
+        environ['paste.urlmap_object'] = self
+        return self.not_found_application(environ, start_response)
+    
+            
+class PathProxyURLMap(object):
+
+    """
+    This is a wrapper for URLMap that catches any strings that
+    are passed in as applications; these strings are treated as
+    filenames (relative to `base_path`) and are passed to the
+    callable `builder`, which will return an application.
+
+    This is intended for cases when configuration files can be
+    treated as applications.
+
+    `base_paste_url` is the URL under which all applications added through
+    this wrapper must go.  Use ``""`` if you want this to not
+    change incoming URLs.
+    """
+
+    def __init__(self, map, base_paste_url, base_path, builder):
+        self.map = map
+        self.base_paste_url = self.map.normalize_url(base_paste_url)
+        self.base_path = base_path
+        self.builder = builder
+        
+    def __setitem__(self, url, app):
+        if isinstance(app, (str, unicode)):
+            app_fn = os.path.join(self.base_path, app)
+            app = self.builder(app_fn)
+        url = self.map.normalize_url(url)
+        # @@: This means http://foo.com/bar will potentially
+        # match foo.com, but /base_paste_url/bar, which is unintuitive
+        url = (url[0] or self.base_paste_url[0], 
+               self.base_paste_url[1] + url[1])
+        self.map[url] = app
+
+    def __getattr__(self, attr):
+        return getattr(self.map, attr)
+
+    # This is really the only settable attribute
+    def not_found_application__get(self):
+        return self.map.not_found_application
+    def not_found_application__set(self, value):
+        self.map.not_found_application = value
+    not_found_application = property(not_found_application__get,
+                                     not_found_application__set)
+        
+    
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/wsgilib.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/wsgilib.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/wsgilib.py (revision 3)
@@ -0,0 +1,593 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+
+"""
+A module of many disparate routines.
+"""
+
+# functions which moved to paste.request and paste.response
+# Deprecated around 15 Dec 2005
+from paste.request import get_cookies, parse_querystring, parse_formvars
+from paste.request import construct_url, path_info_split, path_info_pop
+from paste.response import HeaderDict, has_header, header_value, remove_header
+from paste.response import error_body_response, error_response, error_response_app
+
+from traceback import print_exception
+import urllib
+from cStringIO import StringIO
+import sys
+from urlparse import urlsplit
+import warnings
+
+__all__ = ['add_close', 'add_start_close', 'capture_output', 'catch_errors',
+           'catch_errors_app', 'chained_app_iters', 'construct_url',
+           'dump_environ', 'encode_unicode_app_iter', 'error_body_response',
+           'error_response', 'get_cookies', 'has_header', 'header_value',
+           'interactive', 'intercept_output', 'path_info_pop',
+           'path_info_split', 'raw_interactive', 'send_file']
+
+class add_close(object):
+    """
+    An an iterable that iterates over app_iter, then calls
+    close_func.
+    """
+
+    def __init__(self, app_iterable, close_func):
+        self.app_iterable = app_iterable
+        self.app_iter = iter(app_iterable)
+        self.close_func = close_func
+        self._closed = False
+
+    def __iter__(self):
+        return self
+
+    def next(self):
+        return self.app_iter.next()
+
+    def close(self):
+        self._closed = True
+        if hasattr(self.app_iterable, 'close'):
+            self.app_iterable.close()
+        self.close_func()
+
+    def __del__(self):
+        if not self._closed:
+            # We can't raise an error or anything at this stage
+            print >> sys.stderr, (
+                "Error: app_iter.close() was not called when finishing "
+                "WSGI request. finalization function %s not called"
+                % self.close_func)
+
+class add_start_close(object):
+    """
+    An an iterable that iterates over app_iter, calls start_func
+    before the first item is returned, then calls close_func at the
+    end.
+    """
+
+    def __init__(self, app_iterable, start_func, close_func=None):
+        self.app_iterable = app_iterable
+        self.app_iter = iter(app_iterable)
+        self.first = True
+        self.start_func = start_func
+        self.close_func = close_func
+        self._closed = False
+
+    def __iter__(self):
+        return self
+
+    def next(self):
+        if self.first:
+            self.start_func()
+            self.first = False
+        return self.app_iter.next()
+
+    def close(self):
+        self._closed = True
+        if hasattr(self.app_iterable, 'close'):
+            self.app_iterable.close()
+        if self.close_func is not None:
+            self.close_func()
+
+    def __del__(self):
+        if not self._closed:
+            # We can't raise an error or anything at this stage
+            print >> sys.stderr, (
+                "Error: app_iter.close() was not called when finishing "
+                "WSGI request. finalization function %s not called"
+                % self.close_func)
+
+class chained_app_iters(object):
+
+    """
+    Chains several app_iters together, also delegating .close() to each
+    of them.
+    """
+
+    def __init__(self, *chained):
+        self.app_iters = chained
+        self.chained = [iter(item) for item in chained]
+        self._closed = False
+
+    def __iter__(self):
+        return self
+
+    def next(self):
+        if len(self.chained) == 1:
+            return self.chained[0].next()
+        else:
+            try:
+                return self.chained[0].next()
+            except StopIteration:
+                self.chained.pop(0)
+                return self.next()
+
+    def close(self):
+        self._closed = True
+        got_exc = None
+        for app_iter in self.app_iters:
+            try:
+                if hasattr(app_iter, 'close'):
+                    app_iter.close()
+            except:
+                got_exc = sys.exc_info()
+        if got_exc:
+            raise got_exc[0], got_exc[1], got_exc[2]
+
+    def __del__(self):
+        if not self._closed:
+            # We can't raise an error or anything at this stage
+            print >> sys.stderr, (
+                "Error: app_iter.close() was not called when finishing "
+                "WSGI request. finalization function %s not called"
+                % self.close_func)
+
+class encode_unicode_app_iter(object):
+    """
+    Encodes an app_iterable's unicode responses as strings
+    """
+
+    def __init__(self, app_iterable, encoding=sys.getdefaultencoding(),
+                 errors='strict'):
+        self.app_iterable = app_iterable
+        self.app_iter = iter(app_iterable)
+        self.encoding = encoding
+        self.errors = errors
+
+    def __iter__(self):
+        return self
+
+    def next(self):
+        content = self.app_iter.next()
+        if isinstance(content, unicode):
+            content = content.encode(self.encoding, self.errors)
+        return content
+
+    def close(self):
+        if hasattr(self.app_iterable, 'close'):
+            self.app_iterable.close()
+
+def catch_errors(application, environ, start_response, error_callback,
+                 ok_callback=None):
+    """
+    Runs the application, and returns the application iterator (which should be
+    passed upstream).  If an error occurs then error_callback will be called with
+    exc_info as its sole argument.  If no errors occur and ok_callback is given,
+    then it will be called with no arguments.
+    """
+    try:
+        app_iter = application(environ, start_response)
+    except:
+        error_callback(sys.exc_info())
+        raise
+    if type(app_iter) in (list, tuple):
+        # These won't produce exceptions
+        if ok_callback:
+            ok_callback()
+        return app_iter
+    else:
+        return _wrap_app_iter(app_iter, error_callback, ok_callback)
+
+class _wrap_app_iter(object):
+
+    def __init__(self, app_iterable, error_callback, ok_callback):
+        self.app_iterable = app_iterable
+        self.app_iter = iter(app_iterable)
+        self.error_callback = error_callback
+        self.ok_callback = ok_callback
+        if hasattr(self.app_iterable, 'close'):
+            self.close = self.app_iterable.close
+
+    def __iter__(self):
+        return self
+
+    def next(self):
+        try:
+            return self.app_iter.next()
+        except StopIteration:
+            if self.ok_callback:
+                self.ok_callback()
+            raise
+        except:
+            self.error_callback(sys.exc_info())
+            raise
+
+def catch_errors_app(application, environ, start_response, error_callback_app,
+                     ok_callback=None, catch=Exception):
+    """
+    Like ``catch_errors``, except error_callback_app should be a
+    callable that will receive *three* arguments -- ``environ``,
+    ``start_response``, and ``exc_info``.  It should call
+    ``start_response`` (*with* the exc_info argument!) and return an
+    iterator.
+    """
+    try:
+        app_iter = application(environ, start_response)
+    except catch:
+        return error_callback_app(environ, start_response, sys.exc_info())
+    if type(app_iter) in (list, tuple):
+        # These won't produce exceptions
+        if ok_callback is not None:
+            ok_callback()
+        return app_iter
+    else:
+        return _wrap_app_iter_app(
+            environ, start_response, app_iter,
+            error_callback_app, ok_callback, catch=catch)
+
+class _wrap_app_iter_app(object):
+
+    def __init__(self, environ, start_response, app_iterable,
+                 error_callback_app, ok_callback, catch=Exception):
+        self.environ = environ
+        self.start_response = start_response
+        self.app_iterable = app_iterable
+        self.app_iter = iter(app_iterable)
+        self.error_callback_app = error_callback_app
+        self.ok_callback = ok_callback
+        self.catch = catch
+        if hasattr(self.app_iterable, 'close'):
+            self.close = self.app_iterable.close
+
+    def __iter__(self):
+        return self
+
+    def next(self):
+        try:
+            return self.app_iter.next()
+        except StopIteration:
+            if self.ok_callback:
+                self.ok_callback()
+            raise
+        except self.catch:
+            if hasattr(self.app_iterable, 'close'):
+                try:
+                    self.app_iterable.close()
+                except:
+                    # @@: Print to wsgi.errors?
+                    pass
+            new_app_iterable = self.error_callback_app(
+                self.environ, self.start_response, sys.exc_info())
+            app_iter = iter(new_app_iterable)
+            if hasattr(new_app_iterable, 'close'):
+                self.close = new_app_iterable.close
+            self.next = app_iter.next
+            return self.next()
+
+def raw_interactive(application, path='', raise_on_wsgi_error=False,
+                    **environ):
+    """
+    Runs the application in a fake environment.
+    """
+    assert "path_info" not in environ, "argument list changed"
+    if raise_on_wsgi_error:
+        errors = ErrorRaiser()
+    else:
+        errors = StringIO()
+    basic_environ = {
+        # mandatory CGI variables
+        'REQUEST_METHOD': 'GET',     # always mandatory
+        'SCRIPT_NAME': '',           # may be empty if app is at the root
+        'PATH_INFO': '',             # may be empty if at root of app
+        'SERVER_NAME': 'localhost',  # always mandatory
+        'SERVER_PORT': '80',         # always mandatory 
+        'SERVER_PROTOCOL': 'HTTP/1.0',
+        # mandatory wsgi variables
+        'wsgi.version': (1, 0),
+        'wsgi.url_scheme': 'http',
+        'wsgi.input': StringIO(''),
+        'wsgi.errors': errors,
+        'wsgi.multithread': False,
+        'wsgi.multiprocess': False,
+        'wsgi.run_once': False,
+        }
+    if path:
+        (_, _, path_info, query, fragment) = urlsplit(str(path))
+        path_info = urllib.unquote(path_info)
+        basic_environ['PATH_INFO'] = path_info
+        if query:
+            basic_environ['QUERY_STRING'] = query
+    for name, value in environ.items():
+        name = name.replace('__', '.')
+        basic_environ[name] = value
+    if ('SERVER_NAME' in basic_environ
+        and 'HTTP_HOST' not in basic_environ):
+        basic_environ['HTTP_HOST'] = basic_environ['SERVER_NAME']
+    istream = basic_environ['wsgi.input']
+    if isinstance(istream, str):
+        basic_environ['wsgi.input'] = StringIO(istream)
+        basic_environ['CONTENT_LENGTH'] = len(istream)
+    data = {}
+    output = []
+    headers_set = []
+    headers_sent = []
+    def start_response(status, headers, exc_info=None):
+        if exc_info:
+            try:
+                if headers_sent:
+                    # Re-raise original exception only if headers sent
+                    raise exc_info[0], exc_info[1], exc_info[2]
+            finally:
+                # avoid dangling circular reference
+                exc_info = None
+        elif headers_set:
+            # You cannot set the headers more than once, unless the
+            # exc_info is provided.
+            raise AssertionError("Headers already set and no exc_info!")
+        headers_set.append(True)
+        data['status'] = status
+        data['headers'] = headers
+        return output.append
+    app_iter = application(basic_environ, start_response)
+    try:
+        try:
+            for s in app_iter:
+                if not isinstance(s, str):
+                    raise ValueError(
+                        "The app_iter response can only contain str (not "
+                        "unicode); got: %r" % s)
+                headers_sent.append(True)
+                if not headers_set:
+                    raise AssertionError("Content sent w/o headers!")
+                output.append(s)
+        except TypeError, e:
+            # Typically "iteration over non-sequence", so we want
+            # to give better debugging information...
+            e.args = ((e.args[0] + ' iterable: %r' % app_iter),) + e.args[1:]
+            raise
+    finally:
+        if hasattr(app_iter, 'close'):
+            app_iter.close()
+    return (data['status'], data['headers'], ''.join(output),
+            errors.getvalue())
+
+class ErrorRaiser(object):
+
+    def flush(self):
+        pass
+
+    def write(self, value):
+        if not value:
+            return
+        raise AssertionError(
+            "No errors should be written (got: %r)" % value)
+
+    def writelines(self, seq):
+        raise AssertionError(
+            "No errors should be written (got lines: %s)" % list(seq))
+
+    def getvalue(self):
+        return ''
+
+def interactive(*args, **kw):
+    """
+    Runs the application interatively, wrapping `raw_interactive` but
+    returning the output in a formatted way.
+    """
+    status, headers, content, errors = raw_interactive(*args, **kw)
+    full = StringIO()
+    if errors:
+        full.write('Errors:\n')
+        full.write(errors.strip())
+        full.write('\n----------end errors\n')
+    full.write(status + '\n')
+    for name, value in headers:
+        full.write('%s: %s\n' % (name, value))
+    full.write('\n')
+    full.write(content)
+    return full.getvalue()
+interactive.proxy = 'raw_interactive'
+
+def dump_environ(environ, start_response):
+    """
+    Application which simply dumps the current environment
+    variables out as a plain text response.
+    """
+    output = []
+    keys = environ.keys()
+    keys.sort()
+    for k in keys:
+        v = str(environ[k]).replace("\n","\n    ")
+        output.append("%s: %s\n" % (k, v))
+    output.append("\n")
+    content_length = environ.get("CONTENT_LENGTH", '')
+    if content_length:
+        output.append(environ['wsgi.input'].read(int(content_length)))
+        output.append("\n")
+    output = "".join(output)
+    headers = [('Content-Type', 'text/plain'),
+               ('Content-Length', str(len(output)))]
+    start_response("200 OK", headers)
+    return [output]
+
+def send_file(filename):
+    warnings.warn(
+        "wsgilib.send_file has been moved to paste.fileapp.FileApp",
+        DeprecationWarning, 2)
+    from paste import fileapp
+    return fileapp.FileApp(filename)
+
+def capture_output(environ, start_response, application):
+    """
+    Runs application with environ and start_response, and captures
+    status, headers, and body.
+
+    Sends status and header, but *not* body.  Returns (status,
+    headers, body).  Typically this is used like:
+    
+    .. code-block:: Python
+
+        def dehtmlifying_middleware(application):
+            def replacement_app(environ, start_response):
+                status, headers, body = capture_output(
+                    environ, start_response, application)
+                content_type = header_value(headers, 'content-type')
+                if (not content_type
+                    or not content_type.startswith('text/html')):
+                    return [body]
+                body = re.sub(r'<.*?>', '', body)
+                return [body]
+            return replacement_app
+
+    """
+    warnings.warn(
+        'wsgilib.capture_output has been deprecated in favor '
+        'of wsgilib.intercept_output',
+        DeprecationWarning, 2)
+    data = []
+    output = StringIO()
+    def replacement_start_response(status, headers, exc_info=None):
+        if data:
+            data[:] = []
+        data.append(status)
+        data.append(headers)
+        start_response(status, headers, exc_info)
+        return output.write
+    app_iter = application(environ, replacement_start_response)
+    try:
+        for item in app_iter:
+            output.write(item)
+    finally:
+        if hasattr(app_iter, 'close'):
+            app_iter.close()
+    if not data:
+        data.append(None)
+    if len(data) < 2:
+        data.append(None)
+    data.append(output.getvalue())
+    return data
+
+def intercept_output(environ, application, conditional=None,
+                     start_response=None):
+    """
+    Runs application with environ and captures status, headers, and
+    body.  None are sent on; you must send them on yourself (unlike
+    ``capture_output``)
+
+    Typically this is used like:
+    
+    .. code-block:: Python
+
+        def dehtmlifying_middleware(application):
+            def replacement_app(environ, start_response):
+                status, headers, body = intercept_output(
+                    environ, application)
+                content_type = header_value(headers, 'content-type')
+                if (not content_type
+                    or not content_type.startswith('text/html')):
+                    return [body]
+                body = re.sub(r'<.*?>', '', body)
+                return [body]
+            return replacement_app
+
+    A third optional argument ``conditional`` should be a function
+    that takes ``conditional(status, headers)`` and returns False if
+    the request should not be intercepted.  In that case
+    ``start_response`` will be called and ``(None, None, app_iter)``
+    will be returned.  You must detect that in your code and return
+    the app_iter, like:
+    
+    .. code-block:: Python
+
+        def dehtmlifying_middleware(application):
+            def replacement_app(environ, start_response):
+                status, headers, body = intercept_output(
+                    environ, application,
+                    lambda s, h: header_value(headers, 'content-type').startswith('text/html'),
+                    start_response)
+                if status is None:
+                    return body
+                body = re.sub(r'<.*?>', '', body)
+                return [body]
+            return replacement_app
+    """
+    if conditional is not None and start_response is None:
+        raise TypeError(
+            "If you provide conditional you must also provide "
+            "start_response")
+    data = []
+    output = StringIO()
+    def replacement_start_response(status, headers, exc_info=None):
+        if conditional is not None and not conditional(status, headers):
+            data.append(None)
+            return start_response(status, headers, exc_info)
+        if data:
+            data[:] = []
+        data.append(status)
+        data.append(headers)
+        return output.write
+    app_iter = application(environ, replacement_start_response)
+    if data[0] is None:
+        return (None, None, app_iter)
+    try:
+        for item in app_iter:
+            output.write(item)
+    finally:
+        if hasattr(app_iter, 'close'):
+            app_iter.close()
+    if not data:
+        data.append(None)
+    if len(data) < 2:
+        data.append(None)
+    data.append(output.getvalue())
+    return data
+
+## Deprecation warning wrapper:
+
+class ResponseHeaderDict(HeaderDict):
+
+    def __init__(self, *args, **kw):
+        warnings.warn(
+            "The class wsgilib.ResponseHeaderDict has been moved "
+            "to paste.response.HeaderDict",
+            DeprecationWarning, 2)
+        HeaderDict.__init__(self, *args, **kw)
+
+def _warn_deprecated(new_func):
+    new_name = new_func.func_name
+    new_path = new_func.func_globals['__name__'] + '.' + new_name
+    def replacement(*args, **kw):
+        warnings.warn(
+            "The function wsgilib.%s has been moved to %s"
+            % (new_name, new_path),
+            DeprecationWarning, 2)
+        return new_func(*args, **kw)
+    try:
+        replacement.func_name = new_func.func_name
+    except:
+        pass
+    return replacement
+
+# Put warnings wrapper in place for all public functions that
+# were imported from elsewhere:
+
+for _name in __all__:
+    _func = globals()[_name]
+    if (hasattr(_func, 'func_globals')
+        and _func.func_globals['__name__'] != __name__):
+        globals()[_name] = _warn_deprecated(_func)
+
+if __name__ == '__main__':
+    import doctest
+    doctest.testmod()
+    
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/url.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/url.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/url.py (revision 3)
@@ -0,0 +1,475 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+
+"""
+This module implements a class for handling URLs.
+"""
+import urllib
+import cgi
+from paste import request
+# Imported lazily from FormEncode:
+variabledecode = None
+
+__all__ = ["URL", "Image"]
+
+def html_quote(v):
+    if v is None:
+        return ''
+    return cgi.escape(str(v), 1)
+
+def url_quote(v):
+    if v is None:
+        return ''
+    return urllib.quote(str(v))
+
+url_unquote = urllib.unquote
+
+def js_repr(v):
+    if v is None:
+        return 'null'
+    elif v is False:
+        return 'false'
+    elif v is True:
+        return 'true'
+    elif isinstance(v, list):
+        return '[%s]' % ', '.join(map(js_repr, v))
+    elif isinstance(v, dict):
+        return '{%s}' % ', '.join(
+            ['%s: %s' % (js_repr(key), js_repr(value))
+             for key, value in v])
+    elif isinstance(v, str):
+        return repr(v)
+    elif isinstance(v, unicode):
+        # @@: how do you do Unicode literals in Javascript?
+        return repr(v.encode('UTF-8'))
+    elif isinstance(v, (float, int)):
+        return repr(v)
+    elif isinstance(v, long):
+        return repr(v).lstrip('L')
+    elif hasattr(v, '__js_repr__'):
+        return v.__js_repr__()
+    else:
+        raise ValueError(
+            "I don't know how to turn %r into a Javascript representation"
+            % v)
+
+class URLResource(object):
+
+    """
+    This is an abstract superclass for different kinds of URLs
+    """
+
+    default_params = {}
+
+    def __init__(self, url, vars=None, attrs=None,
+                 params=None):
+        self.url = url or '/'
+        self.vars = vars or []
+        self.attrs = attrs or {}
+        self.params = self.default_params.copy()
+        self.original_params = params or {}
+        if params:
+            self.params.update(params)
+
+    #@classmethod
+    def from_environ(cls, environ, with_query_string=True,
+                     with_path_info=True, script_name=None,
+                     path_info=None, querystring=None):
+        url = request.construct_url(
+            environ, with_query_string=False,
+            with_path_info=with_path_info, script_name=script_name,
+            path_info=path_info)
+        if with_query_string:
+            if querystring is None:
+                vars = request.parse_querystring(environ)
+            else:
+                vars = cgi.parse_qsl(
+                    querystring,
+                    keep_blank_values=True,
+                    strict_parsing=False)
+        else:
+            vars = None
+        v = cls(url, vars=vars)
+        return v
+
+    from_environ = classmethod(from_environ)
+
+    def __call__(self, *args, **kw):
+        res = self._add_positional(args)
+        res = res._add_vars(kw)
+        return res
+
+    def __getitem__(self, item):
+        if '=' in item:
+            name, value = item.split('=', 1)
+            return self._add_vars({url_unquote(name): url_unquote(value)})
+        return self._add_positional((item,))
+
+    def attr(self, **kw):
+        for key in kw.keys():
+            if key.endswith('_'):
+                kw[key[:-1]] = kw[key]
+                del kw[key]
+        new_attrs = self.attrs.copy()
+        new_attrs.update(kw)
+        return self.__class__(self.url, vars=self.vars,
+                              attrs=new_attrs,
+                              params=self.original_params)
+
+    def param(self, **kw):
+        new_params = self.original_params.copy()
+        new_params.update(kw)
+        return self.__class__(self.url, vars=self.vars,
+                              attrs=self.attrs,
+                              params=new_params)
+
+    def coerce_vars(self, vars):
+        global variabledecode
+        need_variable_encode = False
+        for key, value in vars.items():
+            if isinstance(value, dict):
+                need_variable_encode = True
+            if key.endswith('_'):
+                vars[key[:-1]] = vars[key]
+                del vars[key]
+        if need_variable_encode:
+            if variabledecode is None:
+                from formencode import variabledecode
+            vars = variabledecode.variable_encode(vars)
+        return vars
+
+    
+    def var(self, **kw):
+        kw = self.coerce_vars(kw)
+        new_vars = self.vars + kw.items()
+        return self.__class__(self.url, vars=new_vars,
+                              attrs=self.attrs,
+                              params=self.original_params)
+
+    def setvar(self, **kw):
+        """
+        Like ``.var(...)``, except overwrites keys, where .var simply
+        extends the keys.  Setting a variable to None here will
+        effectively delete it.
+        """
+        kw = self.coerce_vars(kw)
+        new_vars = []
+        for name, values in self.vars:
+            if name in kw:
+                continue
+            new_vars.append((name, values))
+        new_vars.extend(kw.items())
+        return self.__class__(self.url, vars=new_vars,
+                              attrs=self.attrs,
+                              params=self.original_params)
+
+    def setvars(self, **kw):
+        """
+        Creates a copy of this URL, but with all the variables set/reset
+        (like .setvar(), except clears past variables at the same time)
+        """
+        return self.__class__(self.url, vars=kw.items(),
+                              attrs=self.attrs,
+                              params=self.original_params)
+
+    def addpath(self, *paths):
+        u = self
+        for path in paths:
+            path = str(path).lstrip('/')
+            new_url = u.url
+            if not new_url.endswith('/'):
+                new_url += '/'
+            u = u.__class__(new_url+path, vars=u.vars,
+                            attrs=u.attrs,
+                            params=u.original_params)
+        return u
+            
+    __div__ = addpath
+
+    def become(self, OtherClass):
+        return OtherClass(self.url, vars=self.vars,
+                          attrs=self.attrs,
+                          params=self.original_params)
+    
+    def href__get(self):
+        s = self.url
+        if self.vars:
+            s += '?'
+            vars = []
+            for name, val in self.vars:
+                if isinstance(val, (list, tuple)):
+                    val = [v for v in val if v is not None]
+                elif val is None:
+                    continue
+                vars.append((name, val))
+            s += urllib.urlencode(vars, True)
+        return s
+
+    href = property(href__get)
+
+    def __repr__(self):
+        base = '<%s %s' % (self.__class__.__name__,
+                           self.href or "''")
+        if self.attrs:
+            base += ' attrs(%s)' % (
+                ' '.join(['%s="%s"' % (html_quote(n), html_quote(v))
+                          for n, v in self.attrs.items()]))
+        if self.original_params:
+            base += ' params(%s)' % (
+                ', '.join(['%s=%r' % (n, v)
+                           for n, v in self.attrs.items()]))
+        return base + '>'
+    
+    def html__get(self):
+        if not self.params.get('tag'):
+            raise ValueError(
+                "You cannot get the HTML of %r until you set the "
+                "'tag' param'" % self)
+        content = self._get_content()
+        tag = '<%s' % self.params.get('tag')
+        attrs = ' '.join([
+            '%s="%s"' % (html_quote(n), html_quote(v))
+            for n, v in self._html_attrs()])
+        if attrs:
+            tag += ' ' + attrs
+        tag += self._html_extra()
+        if content is None:
+            return tag + ' />'
+        else:
+            return '%s>%s</%s>' % (tag, content, self.params.get('tag'))
+
+    html = property(html__get)
+
+    def _html_attrs(self):
+        return self.attrs.items()
+
+    def _html_extra(self):
+        return ''
+
+    def _get_content(self):
+        """
+        Return the content for a tag (for self.html); return None
+        for an empty tag (like ``<img />``)
+        """
+        raise NotImplementedError
+    
+    def _add_vars(self, vars):
+        raise NotImplementedError
+
+    def _add_positional(self, args):
+        raise NotImplementedError
+
+class URL(URLResource):
+
+    r"""
+    >>> u = URL('http://localhost')
+    >>> u
+    <URL http://localhost>
+    >>> u = u['view']
+    >>> str(u)
+    'http://localhost/view'
+    >>> u['//foo'].param(content='view').html
+    '<a href="http://localhost/view/foo">view</a>'
+    >>> u.param(confirm='Really?', content='goto').html
+    '<a href="http://localhost/view" onclick="return confirm(\'Really?\')">goto</a>'
+    >>> u(title='See "it"', content='goto').html
+    '<a href="http://localhost/view?title=See+%22it%22">goto</a>'
+    >>> u('another', var='fuggetaboutit', content='goto').html
+    '<a href="http://localhost/view/another?var=fuggetaboutit">goto</a>'
+    >>> u.attr(content='goto').html
+    Traceback (most recent call last):
+        ....
+    ValueError: You must give a content param to <URL http://localhost/view attrs(content="goto")> generate anchor tags
+    >>> str(u['foo=bar%20stuff'])
+    'http://localhost/view?foo=bar+stuff'
+    """
+
+    default_params = {'tag': 'a'}
+
+    def __str__(self):
+        return self.href
+
+    def _get_content(self):
+        if not self.params.get('content'):
+            raise ValueError(
+                "You must give a content param to %r generate anchor tags"
+                % self)
+        return self.params['content']
+
+    def _add_vars(self, vars):
+        url = self
+        for name in ('confirm', 'content'):
+            if name in vars:
+                url = url.param(**{name: vars.pop(name)})
+        if 'target' in vars:
+            url = url.attr(target=vars.pop('target'))
+        return url.var(**vars)
+
+    def _add_positional(self, args):
+        return self.addpath(*args)
+
+    def _html_attrs(self):
+        attrs = self.attrs.items()
+        attrs.insert(0, ('href', self.href))
+        if self.params.get('confirm'):
+            attrs.append(('onclick', 'return confirm(%s)'
+                          % js_repr(self.params['confirm'])))
+        return attrs
+
+    def onclick_goto__get(self):
+        return 'location.href=%s; return false' % js_repr(self.href)
+
+    onclick_goto = property(onclick_goto__get)
+
+    def button__get(self):
+        return self.become(Button)
+
+    button = property(button__get)
+
+    def js_popup__get(self):
+        return self.become(JSPopup)
+
+    js_popup = property(js_popup__get)
+            
+class Image(URLResource):
+
+    r"""
+    >>> i = Image('/images')
+    >>> i = i / '/foo.png'
+    >>> i.html
+    '<img src="/images/foo.png" />'
+    >>> str(i['alt=foo'])
+    '<img src="/images/foo.png" alt="foo" />'
+    >>> i.href
+    '/images/foo.png'
+    """
+    
+    default_params = {'tag': 'img'}
+
+    def __str__(self):
+        return self.html
+
+    def _get_content(self):
+        return None
+
+    def _add_vars(self, vars):
+        return self.attr(**vars)
+
+    def _add_positional(self, args):
+        return self.addpath(*args)
+
+    def _html_attrs(self):
+        attrs = self.attrs.items()
+        attrs.insert(0, ('src', self.href))
+        return attrs
+
+class Button(URLResource):
+
+    r"""
+    >>> u = URL('/')
+    >>> u = u / 'delete'
+    >>> b = u.button['confirm=Sure?'](id=5, content='del')
+    >>> str(b)
+    '<button onclick="if (confirm(\'Sure?\')) {location.href=\'/delete?id=5\'}; return false">del</button>'
+    """
+
+    default_params = {'tag': 'button'}
+
+    def __str__(self):
+        return self.html
+
+    def _get_content(self):
+        if self.params.get('content'):
+            return self.params['content']
+        if self.attrs.get('value'):
+            return self.attrs['content']
+        # @@: Error?
+        return None
+
+    def _add_vars(self, vars):
+        button = self
+        if 'confirm' in vars:
+            button = button.param(confirm=vars.pop('confirm'))
+        if 'content' in vars:
+            button = button.param(content=vars.pop('content'))
+        return button.var(**vars)
+
+    def _add_positional(self, args):
+        return self.addpath(*args)
+
+    def _html_attrs(self):
+        attrs = self.attrs.items()
+        onclick = 'location.href=%s' % js_repr(self.href)
+        if self.params.get('confirm'):
+            onclick = 'if (confirm(%s)) {%s}' % (
+                js_repr(self.params['confirm']), onclick)
+        onclick += '; return false'
+        attrs.insert(0, ('onclick', onclick))
+        return attrs
+
+class JSPopup(URLResource):
+
+    r"""
+    >>> u = URL('/')
+    >>> u = u / 'view'
+    >>> j = u.js_popup(content='view')
+    >>> j.html
+    '<a href="/view" onclick="window.open(\'/view\', \'_blank\'); return false" target="_blank">view</a>'
+    """
+
+    default_params = {'tag': 'a', 'target': '_blank'}
+
+    def _add_vars(self, vars):
+        button = self
+        for var in ('width', 'height', 'stripped', 'content'):
+            if var in vars:
+                button = button.param(**{var: vars.pop(var)})
+        return button.var(**vars)
+
+    def _window_args(self):
+        p = self.params
+        features = []
+        if p.get('stripped'):
+            p['location'] = p['status'] = p['toolbar'] = '0'
+        for param in 'channelmode directories fullscreen location menubar resizable scrollbars status titlebar'.split():
+            if param not in p:
+                continue
+            v = p[param]
+            if v not in ('yes', 'no', '1', '0'):
+                if v:
+                    v = '1'
+                else:
+                    v = '0'
+            features.append('%s=%s' % (param, v))
+        for param in 'height left top width':
+            if not p.get(param):
+                continue
+            features.append('%s=%s' % (param, p[param]))
+        args = [self.href, p['target']]
+        if features:
+            args.append(','.join(features))
+        return ', '.join(map(js_repr, args))
+
+    def _html_attrs(self):
+        attrs = self.attrs.items()
+        onclick = ('window.open(%s); return false'
+                   % self._window_args())
+        attrs.insert(0, ('target', self.params['target']))
+        attrs.insert(0, ('onclick', onclick))
+        attrs.insert(0, ('href', self.href))
+        return attrs
+
+    def _get_content(self):
+        if not self.params.get('content'):
+            raise ValueError(
+                "You must give a content param to %r generate anchor tags"
+                % self)
+        return self.params['content']
+
+    def _add_positional(self, args):
+        return self.addpath(*args)
+
+if __name__ == '__main__':
+    import doctest
+    doctest.testmod()
+    
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/cgiapp.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/cgiapp.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/cgiapp.py (revision 3)
@@ -0,0 +1,269 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+
+"""
+Application that runs a CGI script.
+"""
+import os
+import subprocess
+try:
+    import select
+except ImportError:
+    select = None
+
+from paste.util import converters
+
+__all__ = ['CGIError', 'CGIApplication']
+
+class CGIError(Exception):
+    """
+    Raised when the CGI script can't be found or doesn't
+    act like a proper CGI script.
+    """
+
+class CGIApplication(object):
+
+    """
+    This object acts as a proxy to a CGI application.  You pass in the
+    script path (``script``), an optional path to search for the
+    script (if the name isn't absolute) (``path``).  If you don't give
+    a path, then ``$PATH`` will be used.
+    """
+
+    def __init__(self, 
+                 global_conf,
+                 script,
+                 path=None,
+                 include_os_environ=True,
+                 query_string=None):
+        if global_conf:
+            raise NotImplemented(
+                "global_conf is no longer supported for CGIApplication "
+                "(use make_cgi_application); please pass None instead")
+        self.script_filename = script
+        if path is None:
+            path = os.environ.get('PATH', '').split(':')
+        self.path = path
+        if '?' in script:
+            assert query_string is None, (
+                "You cannot have '?' in your script name (%r) and also "
+                "give a query_string (%r)" % (script, query_string))
+            script, query_string = script.split('?', 1)
+        if os.path.abspath(script) != script:
+            # relative path
+            for path_dir in self.path:
+                if os.path.exists(os.path.join(path_dir, script)):
+                    self.script = os.path.join(path_dir, script)
+                    break
+            else:
+                raise CGIError(
+                    "Script %r not found in path %r"
+                    % (script, self.path))
+        else:
+            self.script = script
+        self.include_os_environ = include_os_environ
+        self.query_string = query_string
+
+    def __call__(self, environ, start_response):
+        if 'REQUEST_URI' not in environ:
+            environ['REQUEST_URI'] = (
+                environ.get('SCRIPT_NAME', '')
+                + environ.get('PATH_INFO', ''))
+        if self.include_os_environ:
+            cgi_environ = os.environ.copy()
+        else:
+            cgi_environ = {}
+        for name in environ:
+            # Should unicode values be encoded?
+            if (name.upper() == name
+                and isinstance(environ[name], str)):
+                cgi_environ[name] = environ[name]
+        if self.query_string is not None:
+            old = cgi_environ.get('QUERY_STRING', '')
+            if old:
+                old += '&'
+            cgi_environ['QUERY_STRING'] = old + self.query_string
+        cgi_environ['SCRIPT_FILENAME'] = self.script
+        proc = subprocess.Popen(
+            [self.script],
+            stdin=subprocess.PIPE,
+            stdout=subprocess.PIPE,
+            stderr=subprocess.PIPE,
+            env=cgi_environ,
+            cwd=os.path.dirname(self.script),
+            )
+        writer = CGIWriter(environ, start_response)
+        if select:
+            proc_communicate(
+                proc,
+                stdin=StdinReader.from_environ(environ),
+                stdout=writer,
+                stderr=environ['wsgi.errors'])
+        else:
+            stdout, stderr = proc.communicate(StdinReader.from_environ(environ).read())
+            if stderr:
+                environ['wsgi.errors'].write(stderr)
+            writer(stdout)
+        if not writer.headers_finished:
+            start_response(writer.status, writer.headers)
+        return []
+
+class CGIWriter(object):
+
+    def __init__(self, environ, start_response):
+        self.environ = environ
+        self.start_response = start_response
+        self.status = '200 OK'
+        self.headers = []
+        self.headers_finished = False
+        self.writer = None
+        self.buffer = ''
+
+    def write(self, data):
+        if self.headers_finished:
+            self.writer(data)
+            return
+        self.buffer += data
+        while '\n' in self.buffer:
+            if '\r\n' in self.buffer:
+                line1, self.buffer = self.buffer.split('\r\n', 1)
+            else:
+                line1, self.buffer = self.buffer.split('\n', 1)
+            if not line1:
+                self.headers_finished = True
+                self.writer = self.start_response(
+                    self.status, self.headers)
+                self.writer(self.buffer)
+                del self.buffer
+                del self.headers
+                del self.status
+                break
+            elif ':' not in line1:
+                raise CGIError(
+                    "Bad header line: %r" % line1)
+            else:
+                name, value = line1.split(':', 1)
+                value = value.lstrip()
+                name = name.strip()
+                if name.lower() == 'status':
+                    self.status = value
+                else:
+                    self.headers.append((name, value))
+
+class StdinReader(object):
+
+    def __init__(self, stdin, content_length):
+        self.stdin = stdin
+        self.content_length = content_length
+
+    def from_environ(cls, environ):
+        length = environ.get('CONTENT_LENGTH')
+        if length:
+            length = int(length)
+        else:
+            length = 0
+        return cls(environ['wsgi.input'], length)
+
+    from_environ = classmethod(from_environ)
+
+    def read(self, size=None):
+        if not self.content_length:
+            return ''
+        if size is None:
+            text = self.stdin.read(self.content_length)
+        else:
+            text = self.stdin.read(min(self.content_length, size))
+        self.content_length -= len(text)
+        return text
+
+def proc_communicate(proc, stdin=None, stdout=None, stderr=None):
+    """
+    Run the given process, piping input/output/errors to the given
+    file-like objects (which need not be actual file objects, unlike
+    the arguments passed to Popen).  Wait for process to terminate.
+
+    Note: this is taken from the posix version of
+    subprocess.Popen.communicate, but made more general through the
+    use of file-like objects.
+    """
+    read_set = []
+    write_set = []
+    input_buffer = ''
+    trans_nl = proc.universal_newlines and hasattr(open, 'newlines')
+
+    if proc.stdin:
+        # Flush stdio buffer.  This might block, if the user has
+        # been writing to .stdin in an uncontrolled fashion.
+        proc.stdin.flush()
+        if input:
+            write_set.append(proc.stdin)
+        else:
+            proc.stdin.close()
+    else:
+        assert stdin is None
+    if proc.stdout:
+        read_set.append(proc.stdout)
+    else:
+        assert stdout is None
+    if proc.stderr:
+        read_set.append(proc.stderr)
+    else:
+        assert stderr is None
+
+    while read_set or write_set:
+        rlist, wlist, xlist = select.select(read_set, write_set, [])
+
+        if proc.stdin in wlist:
+            # When select has indicated that the file is writable,
+            # we can write up to PIPE_BUF bytes without risk
+            # blocking.  POSIX defines PIPE_BUF >= 512
+            next, input_buffer = input_buffer, ''
+            next_len = 512-len(next)
+            if next_len:
+                next += stdin.read(next_len)
+            if not next:
+                proc.stdin.close()
+                write_set.remove(proc.stdin)
+            else:
+                bytes_written = os.write(proc.stdin.fileno(), next)
+                if bytes_written < len(next):
+                    input_buffer = next[bytes_written:]
+
+        if proc.stdout in rlist:
+            data = os.read(proc.stdout.fileno(), 1024)
+            if data == "":
+                proc.stdout.close()
+                read_set.remove(proc.stdout)
+            if trans_nl:
+                data = proc._translate_newlines(data)
+            stdout.write(data)
+
+        if proc.stderr in rlist:
+            data = os.read(proc.stderr.fileno(), 1024)
+            if data == "":
+                proc.stderr.close()
+                read_set.remove(proc.stderr)
+            if trans_nl:
+                data = proc._translate_newlines(data)
+            stderr.write(data)
+
+    try:
+        proc.wait()
+    except OSError, e:
+        if e.errno != 10:
+            raise
+    
+def make_cgi_application(global_conf, script, path=None, include_os_environ=None,
+                         query_string=None):
+    """
+    This object acts as a proxy to a CGI application.  You pass in the
+    script path (``script``), an optional path to search for the
+    script (if the name isn't absolute) (``path``).  If you don't give
+    a path, then ``$PATH`` will be used.
+    """
+    if path is None:
+        path = global_conf.get('path') or global_conf.get('PATH')
+    include_os_environ = converters.asbool(include_os_environ)
+    return CGIApplication(
+        script, path=path, include_os_environ=include_os_environ,
+        query_string=query_string)
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/config.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/config.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/config.py (revision 3)
@@ -0,0 +1,120 @@
+# (c) 2006 Ian Bicking, Philip Jenvey and contributors
+# Written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+"""Paste Configuration Middleware and Objects"""
+from paste.registry import RegistryManager, StackedObjectProxy
+
+__all__ = ['DispatchingConfig', 'CONFIG', 'ConfigMiddleware']
+
+class DispatchingConfig(StackedObjectProxy):
+    """
+    This is a configuration object that can be used globally,
+    imported, have references held onto.  The configuration may differ
+    by thread (or may not).
+
+    Specific configurations are registered (and deregistered) either
+    for the process or for threads.
+    """
+    # @@: What should happen when someone tries to add this
+    # configuration to itself?  Probably the conf should become
+    # resolved, and get rid of this delegation wrapper
+
+    def __init__(self, name='DispatchingConfig'):
+        super(DispatchingConfig, self).__init__(name=name)
+        self.__dict__['_process_configs'] = []
+
+    def push_thread_config(self, conf):
+        """
+        Make ``conf`` the active configuration for this thread.
+        Thread-local configuration always overrides process-wide
+        configuration.
+
+        This should be used like::
+
+            conf = make_conf()
+            dispatching_config.push_thread_config(conf)
+            try:
+                ... do stuff ...
+            finally:
+                dispatching_config.pop_thread_config(conf)
+        """
+        self._push_object(conf)
+
+    def pop_thread_config(self, conf=None):
+        """
+        Remove a thread-local configuration.  If ``conf`` is given,
+        it is checked against the popped configuration and an error
+        is emitted if they don't match.
+        """
+        self._pop_object(conf)
+
+    def push_process_config(self, conf):
+        """
+        Like push_thread_config, but applies the configuration to
+        the entire process.
+        """
+        self._process_configs.append(conf)
+
+    def pop_process_config(self, conf=None):
+        self._pop_from(self._process_configs, conf)
+
+    def _pop_from(self, lst, conf):
+        popped = lst.pop()
+        if conf is not None and popped is not conf:
+            raise AssertionError(
+                "The config popped (%s) is not the same as the config "
+                "expected (%s)"
+                % (popped, conf))
+
+    def _current_obj(self):
+        try:
+            return super(DispatchingConfig, self)._current_obj()
+        except TypeError:
+            if self._process_configs:
+                return self._process_configs[-1]
+            raise AttributeError(
+                "No configuration has been registered for this process "
+                "or thread")
+    current = current_conf = _current_obj
+
+CONFIG = DispatchingConfig()
+
+no_config = object()
+class ConfigMiddleware(RegistryManager):
+    """
+    A WSGI middleware that adds a ``paste.config`` key (by default)
+    to the request environment, as well as registering the
+    configuration temporarily (for the length of the request) with
+    ``paste.config.CONFIG`` (or any other ``DispatchingConfig``
+    object).
+    """
+
+    def __init__(self, application, config, dispatching_config=CONFIG,
+                 environ_key='paste.config'):
+        """
+        This delegates all requests to `application`, adding a *copy*
+        of the configuration `config`.
+        """
+        def register_config(environ, start_response):
+            popped_config = environ.get(environ_key, no_config)
+            current_config = environ[environ_key] = config.copy()
+            environ['paste.registry'].register(dispatching_config,
+                                               current_config)
+
+            try:
+                app_iter = application(environ, start_response)
+            finally:
+                if popped_config is no_config:
+                    environ.pop(environ_key, None)
+                else:
+                    environ[environ_key] = popped_config
+            return app_iter
+
+        super(self.__class__, self).__init__(register_config)
+
+def make_config_filter(app, global_conf, **local_conf):
+    conf = global_conf.copy()
+    conf.update(local_conf)
+    return ConfigMiddleware(app, conf)
+
+make_config_middleware = ConfigMiddleware.__doc__
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/httpserver.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/httpserver.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/httpserver.py (revision 3)
@@ -0,0 +1,1383 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+# (c) 2005 Clark C. Evans
+# This module is part of the Python Paste Project and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+# This code was written with funding by http://prometheusresearch.com
+"""
+WSGI HTTP Server
+
+This is a minimalistic WSGI server using Python's built-in BaseHTTPServer;
+if pyOpenSSL is installed, it also provides SSL capabilities.
+"""
+
+# @@: add in protection against HTTP/1.0 clients who claim to
+#     be 1.1 but do not send a Content-Length
+
+# @@: add support for chunked encoding, this is not a 1.1 server
+#     till this is completed.
+
+import atexit
+import traceback
+import socket, sys, threading, urlparse, Queue, urllib
+import posixpath
+import time
+import thread
+import os
+from itertools import count
+from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
+from SocketServer import ThreadingMixIn
+from paste.util import converters
+import logging
+try:
+    from paste.util import killthread
+except ImportError:
+    # Not available, probably no ctypes
+    killthread = None
+
+__all__ = ['WSGIHandlerMixin', 'WSGIServer', 'WSGIHandler', 'serve']
+__version__ = "0.5"
+
+class ContinueHook(object):
+    """
+    When a client request includes a 'Expect: 100-continue' header, then
+    it is the responsibility of the server to send 100 Continue when it
+    is ready for the content body.  This allows authentication, access
+    levels, and other exceptions to be detected *before* bandwith is
+    spent on the request body.
+
+    This is a rfile wrapper that implements this functionality by
+    sending 100 Continue to the client immediately after the user
+    requests the content via a read() operation on the rfile stream.
+    After this response is sent, it becomes a pass-through object.
+    """
+
+    def __init__(self, rfile, write):
+        self._ContinueFile_rfile = rfile
+        self._ContinueFile_write = write
+        for attr in ('close', 'closed', 'fileno', 'flush',
+                     'mode', 'bufsize', 'softspace'):
+            if hasattr(rfile, attr):
+                setattr(self, attr, getattr(rfile, attr))
+        for attr in ('read', 'readline', 'readlines'):
+            if hasattr(rfile, attr):
+                setattr(self, attr, getattr(self, '_ContinueFile_' + attr))
+
+    def _ContinueFile_send(self):
+        self._ContinueFile_write("HTTP/1.1 100 Continue\r\n\r\n")
+        rfile = self._ContinueFile_rfile
+        for attr in ('read', 'readline', 'readlines'):
+            if hasattr(rfile, attr):
+                setattr(self, attr, getattr(rfile, attr))
+
+    def _ContinueFile_read(self, size=-1):
+        self._ContinueFile_send()
+        return self._ContinueFile_rfile.readline(size)
+
+    def _ContinueFile_readline(self, size=-1):
+        self._ContinueFile_send()
+        return self._ContinueFile_rfile.readline(size)
+
+    def _ContinueFile_readlines(self, sizehint=0):
+        self._ContinueFile_send()
+        return self._ContinueFile_rfile.readlines(sizehint)
+
+class WSGIHandlerMixin:
+    """
+    WSGI mix-in for HTTPRequestHandler
+
+    This class is a mix-in to provide WSGI functionality to any
+    HTTPRequestHandler derivative (as provided in Python's BaseHTTPServer).
+    This assumes a ``wsgi_application`` handler on ``self.server``.
+    """
+    lookup_addresses = True
+
+    def log_request(self, *args, **kwargs):
+        """ disable success request logging
+
+        Logging transactions should not be part of a WSGI server,
+        if you want logging; look at paste.translogger
+        """
+        pass
+
+    def log_message(self, *args, **kwargs):
+        """ disable error message logging
+
+        Logging transactions should not be part of a WSGI server,
+        if you want logging; look at paste.translogger
+        """
+        pass
+
+    def version_string(self):
+        """ behavior that BaseHTTPServer should have had """
+        if not self.sys_version:
+            return self.server_version
+        else:
+            return self.server_version + ' ' + self.sys_version
+
+    def wsgi_write_chunk(self, chunk):
+        """
+        Write a chunk of the output stream; send headers if they
+        have not already been sent.
+        """
+        if not self.wsgi_headers_sent and not self.wsgi_curr_headers:
+            raise RuntimeError(
+                "Content returned before start_response called")
+        if not self.wsgi_headers_sent:
+            self.wsgi_headers_sent = True
+            (status, headers) = self.wsgi_curr_headers
+            code, message = status.split(" ", 1)
+            self.send_response(int(code), message)
+            #
+            # HTTP/1.1 compliance; either send Content-Length or
+            # signal that the connection is being closed.
+            #
+            send_close = True
+            for (k, v) in  headers:
+                lk = k.lower()
+                if 'content-length' == lk:
+                    send_close = False
+                if 'connection' == lk:
+                    if 'close' == v.lower():
+                        self.close_connection = 1
+                        send_close = False
+                self.send_header(k, v)
+            if send_close:
+                self.close_connection = 1
+                self.send_header('Connection', 'close')
+
+            self.end_headers()
+        self.wfile.write(chunk)
+
+    def wsgi_start_response(self, status, response_headers, exc_info=None):
+        if exc_info:
+            try:
+                if self.wsgi_headers_sent:
+                    raise exc_info[0], exc_info[1], exc_info[2]
+                else:
+                    # In this case, we're going to assume that the
+                    # higher-level code is currently handling the
+                    # issue and returning a resonable response.
+                    # self.log_error(repr(exc_info))
+                    pass
+            finally:
+                exc_info = None
+        elif self.wsgi_curr_headers:
+            assert 0, "Attempt to set headers a second time w/o an exc_info"
+        self.wsgi_curr_headers = (status, response_headers)
+        return self.wsgi_write_chunk
+
+    def wsgi_setup(self, environ=None):
+        """
+        Setup the member variables used by this WSGI mixin, including
+        the ``environ`` and status member variables.
+
+        After the basic environment is created; the optional ``environ``
+        argument can be used to override any settings.
+        """
+
+        (scheme, netloc, path, query, fragment) = urlparse.urlsplit(self.path)
+        path = urllib.unquote(path)
+        endslash = path.endswith('/')
+        path = posixpath.normpath(path)
+        if endslash and path != '/':
+            # Put the slash back...
+            path += '/'
+        (server_name, server_port) = self.server.server_address
+
+        rfile = self.rfile
+        if 'HTTP/1.1' == self.protocol_version and \
+                '100-continue' == self.headers.get('Expect','').lower():
+            rfile = ContinueHook(rfile, self.wfile.write)
+        else:
+            # We can put in the protection to keep from over-reading the
+            # file
+            try:
+                content_length = int(self.headers.get('Content-Length', '0'))
+            except ValueError:
+                content_length = 0
+            if not hasattr(self.connection, 'get_context'):
+                # @@: LimitedLengthFile is currently broken in connection
+                # with SSL (sporatic errors that are diffcult to trace, but
+                # ones that go away when you don't use LimitedLengthFile)
+                rfile = LimitedLengthFile(rfile, content_length)
+
+        remote_address = self.client_address[0]
+        self.wsgi_environ = {
+                'wsgi.version': (1,0)
+               ,'wsgi.url_scheme': 'http'
+               ,'wsgi.input': rfile
+               ,'wsgi.errors': sys.stderr
+               ,'wsgi.multithread': True
+               ,'wsgi.multiprocess': False
+               ,'wsgi.run_once': False
+               # CGI variables required by PEP-333
+               ,'REQUEST_METHOD': self.command
+               ,'SCRIPT_NAME': '' # application is root of server
+               ,'PATH_INFO': path
+               ,'QUERY_STRING': query
+               ,'CONTENT_TYPE': self.headers.get('Content-Type', '')
+               ,'CONTENT_LENGTH': self.headers.get('Content-Length', '0')
+               ,'SERVER_NAME': server_name
+               ,'SERVER_PORT': str(server_port)
+               ,'SERVER_PROTOCOL': self.request_version
+               # CGI not required by PEP-333
+               ,'REMOTE_ADDR': remote_address
+               }
+        if scheme:
+            self.wsgi_environ['paste.httpserver.proxy.scheme'] = scheme
+        if netloc:
+            self.wsgi_environ['paste.httpserver.proxy.host'] = netloc
+
+        if self.lookup_addresses:
+            # @@: make lookup_addreses actually work, at this point
+            #     it has been address_string() is overriden down in
+            #     file and hence is a noop
+            if remote_address.startswith("192.168.") \
+            or remote_address.startswith("10.") \
+            or remote_address.startswith("172.16."):
+                pass
+            else:
+                address_string = None # self.address_string()
+                if address_string:
+                    self.wsgi_environ['REMOTE_HOST'] = address_string
+                
+        if hasattr(self.server, 'thread_pool'):
+            # Now that we know what the request was for, we should
+            # tell the thread pool what its worker is working on
+            self.server.thread_pool.worker_tracker[thread.get_ident()][1] = self.wsgi_environ
+            self.wsgi_environ['paste.httpserver.thread_pool'] = self.server.thread_pool
+        
+        for k, v in self.headers.items():
+            key = 'HTTP_' + k.replace("-","_").upper()
+            if key in ('HTTP_CONTENT_TYPE','HTTP_CONTENT_LENGTH'):
+                continue
+            self.wsgi_environ[key] = ','.join(self.headers.getheaders(k))
+        
+        if hasattr(self.connection,'get_context'):
+            self.wsgi_environ['wsgi.url_scheme'] = 'https'
+            # @@: extract other SSL parameters from pyOpenSSL at...
+            # http://www.modssl.org/docs/2.8/ssl_reference.html#ToC25
+
+        if environ:
+            assert isinstance(environ, dict)
+            self.wsgi_environ.update(environ)
+            if 'on' == environ.get('HTTPS'):
+                self.wsgi_environ['wsgi.url_scheme'] = 'https'
+
+        self.wsgi_curr_headers = None
+        self.wsgi_headers_sent = False
+
+    def wsgi_connection_drop(self, exce, environ=None):
+        """
+        Override this if you're interested in socket exceptions, such
+        as when the user clicks 'Cancel' during a file download.
+        """
+        pass
+
+    def wsgi_execute(self, environ=None):
+        """
+        Invoke the server's ``wsgi_application``.
+        """
+
+        self.wsgi_setup(environ)
+
+        try:
+            result = self.server.wsgi_application(self.wsgi_environ,
+                                                  self.wsgi_start_response)
+            try:
+                for chunk in result:
+                    self.wsgi_write_chunk(chunk)
+                if not self.wsgi_headers_sent:
+                    self.wsgi_write_chunk('')
+            finally:
+                if hasattr(result,'close'):
+                    result.close()
+                result = None
+        except socket.error, exce:
+            self.wsgi_connection_drop(exce, environ)
+            return
+        except:
+            if not self.wsgi_headers_sent:
+                error_msg = "Internal Server Error\n"
+                self.wsgi_curr_headers = (
+                    '500 Internal Server Error',
+                    [('Content-type', 'text/plain'),
+                     ('Content-length', str(len(error_msg)))])
+                self.wsgi_write_chunk("Internal Server Error\n")
+            raise
+
+#
+# SSL Functionality
+#
+# This implementation was motivated by Sebastien Martini's SSL example
+# http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/442473
+#
+try:
+    from OpenSSL import SSL, tsafe
+    SocketErrors = (socket.error, SSL.ZeroReturnError, SSL.SysCallError)
+except ImportError:
+    # Do not require pyOpenSSL to be installed, but disable SSL
+    # functionality in that case.
+    SSL = None
+    SocketErrors = (socket.error,)
+    class SecureHTTPServer(HTTPServer):
+        def __init__(self, server_address, RequestHandlerClass,
+                     ssl_context=None):
+            assert not ssl_context, "pyOpenSSL not installed"
+            HTTPServer.__init__(self, server_address, RequestHandlerClass)
+else:
+
+    class _ConnFixer(object):
+        """ wraps a socket connection so it implements makefile """
+        def __init__(self, conn):
+            self.__conn = conn
+        def makefile(self, mode, bufsize):
+            return socket._fileobject(self.__conn, mode, bufsize)
+        def __getattr__(self, attrib):
+            return getattr(self.__conn, attrib)
+
+    class SecureHTTPServer(HTTPServer):
+        """
+        Provides SSL server functionality on top of the BaseHTTPServer
+        by overriding _private_ members of Python's standard
+        distribution. The interface for this instance only changes by
+        adding a an optional ssl_context attribute to the constructor:
+
+              cntx = SSL.Context(SSL.SSLv23_METHOD)
+              cntx.use_privatekey_file("host.pem")
+              cntx.use_certificate_file("host.pem")
+
+        """
+
+        def __init__(self, server_address, RequestHandlerClass,
+                     ssl_context=None):
+            # This overrides the implementation of __init__ in python's
+            # SocketServer.TCPServer (which BaseHTTPServer.HTTPServer
+            # does not override, thankfully).
+            HTTPServer.__init__(self, server_address, RequestHandlerClass)
+            self.socket = socket.socket(self.address_family,
+                                        self.socket_type)
+            self.ssl_context = ssl_context
+            if ssl_context:
+                class TSafeConnection(tsafe.Connection):
+                    def settimeout(self, *args):
+                        self._lock.acquire()
+                        try:
+                            return self._ssl_conn.settimeout(*args)
+                        finally:
+                            self._lock.release()
+                self.socket = TSafeConnection(ssl_context, self.socket)
+            self.server_bind()
+            self.server_activate()
+
+        def get_request(self):
+            # The default SSL request object does not seem to have a
+            # ``makefile(mode, bufsize)`` method as expected by
+            # Socketserver.StreamRequestHandler.
+            (conn, info) = self.socket.accept()
+            if self.ssl_context:
+                conn = _ConnFixer(conn)
+            return (conn, info)
+
+    def _auto_ssl_context():
+        import OpenSSL, time, random
+        pkey = OpenSSL.crypto.PKey()
+        pkey.generate_key(OpenSSL.crypto.TYPE_RSA, 768)
+
+        cert = OpenSSL.crypto.X509()
+
+        cert.set_serial_number(random.randint(0, sys.maxint))
+        cert.gmtime_adj_notBefore(0)
+        cert.gmtime_adj_notAfter(60 * 60 * 24 * 365)
+        cert.get_subject().CN = '*'
+        cert.get_subject().O = 'Dummy Certificate'
+        cert.get_issuer().CN = 'Untrusted Authority'
+        cert.get_issuer().O = 'Self-Signed'
+        cert.set_pubkey(pkey)
+        cert.sign(pkey, 'md5')
+
+        ctx = SSL.Context(SSL.SSLv23_METHOD)
+        ctx.use_privatekey(pkey)
+        ctx.use_certificate(cert)
+
+        return ctx
+
+class WSGIHandler(WSGIHandlerMixin, BaseHTTPRequestHandler):
+    """
+    A WSGI handler that overrides POST, GET and HEAD to delegate
+    requests to the server's ``wsgi_application``.
+    """
+    server_version = 'PasteWSGIServer/' + __version__
+
+    def handle_one_request(self):
+        """Handle a single HTTP request.
+
+        You normally don't need to override this method; see the class
+        __doc__ string for information on how to handle specific HTTP
+        commands such as GET and POST.
+
+        """
+        self.raw_requestline = self.rfile.readline()
+        if not self.raw_requestline:
+            self.close_connection = 1
+            return
+        if not self.parse_request(): # An error code has been sent, just exit
+            return
+        self.wsgi_execute()
+
+    def handle(self):
+        # don't bother logging disconnects while handling a request
+        try:
+            BaseHTTPRequestHandler.handle(self)
+        except SocketErrors, exce:
+            self.wsgi_connection_drop(exce)
+
+    def address_string(self):
+        """Return the client address formatted for logging.
+        
+        This is overridden so that no hostname lookup is done.
+        """
+        return ''
+
+class LimitedLengthFile(object):
+    def __init__(self, file, length):
+        self.file = file
+        self.length = length
+        self._consumed = 0
+
+    def __repr__(self):
+        base_repr = repr(self.file)
+        return base_repr[:-1] + ' length=%s>' % self.length
+
+    def read(self, length=None):
+        left = self.length - self._consumed
+        if length is None:
+            length = left
+        else:
+            length = min(length, left)
+        # next two lines are hnecessary only if read(0) blocks
+        if not left:
+            return ''
+        data = self.file.read(length)
+        self._consumed += len(data)
+        return data
+
+    def readline(self, *args):
+        data = self.file.readline(self.length - self._consumed)
+        self._consumed += len(data)
+        return data
+
+    def readlines(self, hint=None):
+        data = self.file.readlines(hint)
+        for chunk in data:
+            self._consumed += len(chunk)
+        return data
+
+    def __iter__(self):
+        return self
+
+    def next(self):
+        if self.length - self._consumed <= 0:
+            raise StopIteration
+        return self.readline()
+
+    ## Optional methods ##
+
+    def seek(self, place):
+        self.file.seek(place)
+        self._consumed = place
+
+    def tell(self):
+        if hasattr(self.file, 'tell'):
+            return self.file.tell()
+        else:
+            return self._consumed
+
+class ThreadPool(object):
+    """
+    Generic thread pool with a queue of callables to consume.
+
+    Keeps a notion of the status of its worker threads:
+
+    idle: worker thread with nothing to do
+
+    busy: worker thread doing its job
+
+    hung: worker thread that's been doing a job for too long
+
+    dying: a hung thread that has been killed, but hasn't died quite
+    yet.
+
+    zombie: what was a worker thread that we've tried to kill but
+    isn't dead yet.
+
+    At any time you can call track_threads, to get a dictionary with
+    these keys and lists of thread_ids that fall in that status.  All
+    keys will be present, even if they point to emty lists.
+
+    hung threads are threads that have been busy more than
+    hung_thread_limit seconds.  Hung threads are killed when they live
+    longer than kill_thread_limit seconds.  A thread is then
+    considered dying for dying_limit seconds, if it is still alive
+    after that it is considered a zombie.
+
+    When there are no idle workers and a request comes in, another
+    worker *may* be spawned.  If there are less than spawn_if_under
+    threads in the busy state, another thread will be spawned.  So if
+    the limit is 5, and there are 4 hung threads and 6 busy threads,
+    no thread will be spawned.
+
+    When there are more than max_zombie_threads_before_die zombie
+    threads, a SystemExit exception will be raised, stopping the
+    server.  Use 0 or None to never raise this exception.  Zombie
+    threads *should* get cleaned up, but killing threads is no
+    necessarily reliable.  This is turned off by default, since it is
+    only a good idea if you've deployed the server with some process
+    watching from above (something similar to daemontools or zdaemon).
+
+    Each worker thread only processes ``max_requests`` tasks before it
+    dies and replaces itself with a new worker thread.
+    """
+
+    
+    SHUTDOWN = object()
+
+    def __init__(
+        self, nworkers, name="ThreadPool", daemon=False,
+        max_requests=100, # threads are killed after this many requests
+        hung_thread_limit=30, # when a thread is marked "hung"
+        kill_thread_limit=1800, # when you kill that hung thread
+        dying_limit=300, # seconds that a kill should take to go into effect (longer than this and the thread is a "zombie")
+        spawn_if_under=5, # spawn if there's too many hung threads
+        max_zombie_threads_before_die=0, # when to give up on the process
+        hung_check_period=100, # every 100 requests check for hung workers
+        logger=None, # Place to log messages to
+        error_email=None, # Person(s) to notify if serious problem occurs
+        ):
+        """
+        Create thread pool with `nworkers` worker threads.
+        """
+        self.nworkers = nworkers
+        self.max_requests = max_requests
+        self.name = name
+        self.queue = Queue.Queue()
+        self.workers = []
+        self.daemon = daemon
+        if logger is None:
+            logger = logging.getLogger('paste.httpserver.ThreadPool')
+        if isinstance(logger, basestring):
+            logger = logging.getLogger(logger)
+        self.logger = logger
+        self.error_email = error_email
+        self._worker_count = count()
+
+        assert (not kill_thread_limit
+                or kill_thread_limit >= hung_thread_limit), (
+            "kill_thread_limit (%s) should be higher than hung_thread_limit (%s)"
+            % (kill_thread_limit, hung_thread_limit))
+        if not killthread:
+            kill_thread_limit = 0
+            self.logger.info(
+                "Cannot use kill_thread_limit as ctypes/killthread is not available")
+        self.kill_thread_limit = kill_thread_limit
+        self.dying_limit = dying_limit
+        self.hung_thread_limit = hung_thread_limit
+        assert spawn_if_under <= nworkers, (
+            "spawn_if_under (%s) should be less than nworkers (%s)"
+            % (spawn_if_under, nworkers))
+        self.spawn_if_under = spawn_if_under
+        self.max_zombie_threads_before_die = max_zombie_threads_before_die
+        self.hung_check_period = hung_check_period
+        self.requests_since_last_hung_check = 0
+        # Used to keep track of what worker is doing what:
+        self.worker_tracker = {}
+        # Used to keep track of the workers not doing anything:
+        self.idle_workers = []
+        # Used to keep track of threads that have been killed, but maybe aren't dead yet:
+        self.dying_threads = {}
+        # This is used to track when we last had to add idle workers;
+        # we shouldn't cull extra workers until some time has passed
+        # (hung_thread_limit) since workers were added:
+        self._last_added_new_idle_workers = 0
+        if not daemon:
+            atexit.register(self.shutdown)
+        for i in range(self.nworkers):
+            self.add_worker_thread(message='Initial worker pool')
+
+    def add_task(self, task):
+        """
+        Add a task to the queue
+        """
+        self.logger.debug('Added task (%i tasks queued)', self.queue.qsize())
+        if self.hung_check_period:
+            self.requests_since_last_hung_check += 1
+            if self.requests_since_last_hung_check > self.hung_check_period:
+                self.requests_since_last_hung_check = 0
+                self.kill_hung_threads()
+        if not self.idle_workers and self.spawn_if_under:
+            # spawn_if_under can come into effect...
+            busy = 0
+            now = time.time()
+            self.logger.debug('No idle workers for task; checking if we need to make more workers')
+            for worker in self.workers:
+                if not hasattr(worker, 'thread_id'):
+                    # Not initialized
+                    continue
+                time_started, info = self.worker_tracker.get(worker.thread_id,
+                                                             (None, None))
+                if time_started is not None:
+                    if now - time_started < self.hung_thread_limit:
+                        busy += 1
+            if busy < self.spawn_if_under:
+                self.logger.info(
+                    'No idle tasks, and only %s busy tasks; adding %s more '
+                    'workers', busy, self.spawn_if_under-busy)
+                self._last_added_new_idle_workers = time.time()
+                for i in range(self.spawn_if_under - busy):
+                    self.add_worker_thread(message='Response to lack of idle workers')
+            else:
+                self.logger.debug(
+                    'No extra workers needed (%s busy workers)',
+                    busy)
+        if (len(self.workers) > self.nworkers
+            and len(self.idle_workers) > 3
+            and time.time()-self._last_added_new_idle_workers > self.hung_thread_limit):
+            # We've spawned worers in the past, but they aren't needed
+            # anymore; kill off some
+            self.logger.info(
+                'Culling %s extra workers (%s idle workers present)',
+                len(self.workers)-self.nworkers, len(self.idle_workers))
+            self.logger.debug(
+                'Idle workers: %s', self.idle_workers)
+            for i in range(len(self.workers) - self.nworkers):
+                self.queue.put(self.SHUTDOWN)
+        self.queue.put(task)
+
+    def track_threads(self):
+        """
+        Return a dict summarizing the threads in the pool (as
+        described in the ThreadPool docstring).
+        """
+        result = dict(idle=[], busy=[], hung=[], dying=[], zombie=[])
+        now = time.time()
+        for worker in self.workers:
+            if not hasattr(worker, 'thread_id'):
+                # The worker hasn't fully started up, we should just
+                # ignore it
+                continue
+            time_started, info = self.worker_tracker.get(worker.thread_id,
+                                                         (None, None))
+            if time_started is not None:
+                if now - time_started > self.hung_thread_limit:
+                    result['hung'].append(worker)
+                else:
+                    result['busy'].append(worker)
+            else:
+                result['idle'].append(worker)
+        for thread_id, (time_killed, worker) in self.dying_threads.items():
+            if not self.thread_exists(thread_id):
+                # Cull dying threads that are actually dead and gone
+                self.logger.info('Killed thread %s no longer around',
+                                 thread_id)
+                try:
+                    del self.dying_threads[thread_id]
+                except KeyError:
+                    pass
+                continue
+            if now - time_killed > self.dying_limit:
+                result['zombie'].append(worker)
+            else:
+                result['dying'].append(worker)
+        return result
+
+    def kill_worker(self, thread_id):
+        """
+        Removes the worker with the given thread_id from the pool, and
+        replaces it with a new worker thread.
+
+        This should only be done for mis-behaving workers.
+        """
+        if killthread is None:
+            raise RuntimeError(
+                "Cannot kill worker; killthread/ctypes not available")
+        thread_obj = threading._active.get(thread_id)
+        killthread.async_raise(thread_id, SystemExit)
+        try:
+            del self.worker_tracker[thread_id]
+        except KeyError:
+            pass
+        self.logger.info('Killing thread %s', thread_id)
+        if thread_obj in self.workers:
+            self.workers.remove(thread_obj)
+        self.dying_threads[thread_id] = (time.time(), thread_obj)
+        self.add_worker_thread(message='Replacement for killed thread %s' % thread_id)
+
+    def thread_exists(self, thread_id):
+        """
+        Returns true if a thread with this id is still running
+        """
+        return thread_id in threading._active
+
+    def add_worker_thread(self, *args, **kwargs):
+        index = self._worker_count.next()
+        worker = threading.Thread(target=self.worker_thread_callback,
+                                  args=args, kwargs=kwargs,
+                                  name=("worker %d" % index))
+        worker.setDaemon(self.daemon)
+        worker.start()
+
+    def kill_hung_threads(self):
+        """
+        Tries to kill any hung threads
+        """
+        if not self.kill_thread_limit:
+            # No killing should occur
+            return
+        now = time.time()
+        max_time = 0
+        total_time = 0
+        idle_workers = 0
+        starting_workers = 0
+        working_workers = 0
+        killed_workers = 0
+        for worker in self.workers:
+            if not hasattr(worker, 'thread_id'):
+                # Not setup yet
+                starting_workers += 1
+                continue
+            time_started, info = self.worker_tracker.get(worker.thread_id,
+                                                         (None, None))
+            if time_started is None:
+                # Must be idle
+                idle_workers += 1
+                continue
+            working_workers += 1
+            max_time = max(max_time, now-time_started)
+            total_time += now-time_started
+            if now - time_started > self.kill_thread_limit:
+                self.logger.warning(
+                    'Thread %s hung (working on task for %i seconds)',
+                    worker.thread_id, now - time_started)
+                try:
+                    import pprint
+                    info_desc = pprint.pformat(info)
+                except:
+                    out = StringIO()
+                    traceback.print_exc(file=out)
+                    info_desc = 'Error:\n%s' % out.getvalue()
+                self.notify_problem(
+                    "Killing worker thread (id=%(thread_id)s) because it has been \n"
+                    "working on task for %(time)s seconds (limit is %(limit)s)\n"
+                    "Info on task:\n"
+                    "%(info)s"
+                    % dict(thread_id=worker.thread_id,
+                           time=now - time_started,
+                           limit=self.kill_thread_limit,
+                           info=info_desc))
+                self.kill_worker(worker.thread_id)
+                killed_workers += 1
+        if working_workers:
+            ave_time = float(total_time) / working_workers
+            ave_time = '%.2fsec' % ave_time
+        else:
+            ave_time = 'N/A'
+        self.logger.info(
+            "kill_hung_threads status: %s threads (%s working, %s idle, %s starting) "
+            "ave time %s, max time %.2fsec, killed %s workers"
+            % (idle_workers + starting_workers + working_workers,
+               working_workers, idle_workers, starting_workers,
+               ave_time, max_time, killed_workers))
+        self.check_max_zombies()
+
+    def check_max_zombies(self):
+        """
+        Check if we've reached max_zombie_threads_before_die; if so
+        then kill the entire process.
+        """
+        if not self.max_zombie_threads_before_die:
+            return
+        found = []
+        now = time.time()
+        for thread_id, (time_killed, worker) in self.dying_threads.items():
+            if not self.thread_exists(thread_id):
+                # Cull dying threads that are actually dead and gone
+                try:
+                    del self.dying_threads[thread_id]
+                except KeyError:
+                    pass
+                continue
+            if now - time_killed > self.dying_limit:
+                found.append(thread_id)
+        if found:
+            self.logger.info('Found %s zombie threads', found)
+        if len(found) > self.max_zombie_threads_before_die:
+            self.logger.fatal(
+                'Exiting process because %s zombie threads is more than %s limit',
+                len(found), self.max_zombie_threads_before_die)
+            self.notify_problem(
+                "Exiting process because %(found)s zombie threads "
+                "(more than limit of %(limit)s)\n"
+                "Bad threads (ids):\n"
+                "  %(ids)s\n"
+                % dict(found=len(found),
+                       limit=self.max_zombie_threads_before_die,
+                       ids="\n  ".join(map(str, found))),
+                subject="Process restart (too many zombie threads)")
+            self.shutdown(10)
+            print 'Shutting down', threading.currentThread()
+            raise ServerExit(3)
+
+    def worker_thread_callback(self, message=None):
+        """
+        Worker thread should call this method to get and process queued
+        callables.
+        """
+        thread_obj = threading.currentThread()
+        thread_id = thread_obj.thread_id = thread.get_ident()
+        self.workers.append(thread_obj)
+        self.idle_workers.append(thread_id)
+        requests_processed = 0
+        add_replacement_worker = False
+        self.logger.debug('Started new worker %s: %s', thread_id, message)
+        try:
+            while True:
+                if self.max_requests and self.max_requests < requests_processed:
+                    # Replace this thread then die
+                    self.logger.debug('Thread %s processed %i requests (limit %s); stopping thread'
+                                      % (thread_id, requests_processed, self.max_requests))
+                    add_replacement_worker = True
+                    break
+                runnable = self.queue.get()
+                if runnable is ThreadPool.SHUTDOWN:
+                    self.logger.debug('Worker %s asked to SHUTDOWN', thread_id)
+                    break
+                try:
+                    self.idle_workers.remove(thread_id)
+                except ValueError:
+                    pass
+                self.worker_tracker[thread_id] = [time.time(), None]
+                requests_processed += 1
+                try:
+                    try:
+                        runnable()
+                    except:
+                        # We are later going to call sys.exc_clear(),
+                        # removing all remnants of any exception, so
+                        # we should log it now.  But ideally no
+                        # exception should reach this level
+                        print >> sys.stderr, (
+                            'Unexpected exception in worker %r' % runnable)
+                        traceback.print_exc()
+                    if thread_id in self.dying_threads:
+                        # That last exception was intended to kill me
+                        break
+                finally:
+                    try:
+                        del self.worker_tracker[thread_id]
+                    except KeyError:
+                        pass
+                    sys.exc_clear()
+                self.idle_workers.append(thread_id)
+        finally:
+            try:
+                del self.worker_tracker[thread_id]
+            except KeyError:
+                pass
+            try:
+                self.idle_workers.remove(thread_id)
+            except ValueError:
+                pass
+            try:
+                self.workers.remove(thread_obj)
+            except ValueError:
+                pass
+            try:
+                del self.dying_threads[thread_id]
+            except KeyError:
+                pass
+            if add_replacement_worker:
+                self.add_worker_thread(message='Voluntary replacement for thread %s' % thread_id)
+
+    def shutdown(self, force_quit_timeout=0):
+        """
+        Shutdown the queue (after finishing any pending requests).
+        """
+        self.logger.info('Shutting down threadpool')
+        # Add a shutdown request for every worker
+        for i in range(len(self.workers)):
+            self.queue.put(ThreadPool.SHUTDOWN)
+        # Wait for each thread to terminate
+        hung_workers = []
+        for worker in self.workers:
+            worker.join(0.5)
+            if worker.isAlive():
+                hung_workers.append(worker)
+        zombies = []
+        for thread_id in self.dying_threads:
+            if self.thread_exists(thread_id):
+                zombies.append(thread_id)
+        if hung_workers or zombies:
+            self.logger.info("%s workers didn't stop properly, and %s zombies",
+                             len(hung_workers), len(zombies))
+            if hung_workers:
+                for worker in hung_workers:
+                    self.kill_worker(worker.thread_id)
+                self.logger.info('Workers killed forcefully')
+            if force_quit_timeout:
+                hung = []
+                timed_out = False
+                need_force_quit = bool(zombies)
+                for workers in self.workers:
+                    if not timed_out and worker.isAlive():
+                        timed_out = True
+                        worker.join(force_quit_timeout)
+                    if worker.isAlive():
+                        print "Worker %s won't die" % worker
+                        need_force_quit = True
+                if need_force_quit:
+                    import atexit
+                    # Remove the threading atexit callback
+                    for callback in list(atexit._exithandlers):
+                        func = getattr(callback[0], 'im_func', None)
+                        if not func:
+                            continue
+                        globs = getattr(func, 'func_globals', {})
+                        mod = globs.get('__name__')
+                        if mod == 'threading':
+                            atexit._exithandlers.remove(callback)
+                    atexit._run_exitfuncs()
+                    print 'Forcefully exiting process'
+                    os._exit(3)
+                else:
+                    self.logger.info('All workers eventually killed')
+        else:
+            self.logger.info('All workers stopped')
+
+    def notify_problem(self, msg, subject=None, spawn_thread=True):
+        """
+        Called when there's a substantial problem.  msg contains the
+        body of the notification, subject the summary.
+
+        If spawn_thread is true, then the email will be send in
+        another thread (so this doesn't block).
+        """
+        if not self.error_email:
+            return
+        if spawn_thread:
+            t = threading.Thread(
+                target=self.notify_problem,
+                args=(msg, subject, False))
+            t.start()
+            return
+        from_address = 'errors@localhost'
+        if not subject:
+            subject = msg.strip().splitlines()[0]
+            subject = subject[:50]
+            subject = '[http threadpool] %s' % subject
+        headers = [
+            "To: %s" % self.error_email,
+            "From: %s" % from_address,
+            "Subject: %s" % subject,
+            ]
+        try:
+            system = ' '.join(os.uname())
+        except:
+            system = '(unknown)'
+        body = (
+            "An error has occurred in the paste.httpserver.ThreadPool\n"
+            "Error:\n"
+            "  %(msg)s\n"
+            "Occurred at: %(time)s\n"
+            "PID: %(pid)s\n"
+            "System: %(system)s\n"
+            "Server .py file: %(file)s\n"
+            % dict(msg=msg,
+                   time=time.strftime("%c"),
+                   pid=os.getpid(),
+                   system=system,
+                   file=os.path.abspath(__file__),
+                   ))
+        message = '\n'.join(headers) + "\n\n" + body
+        import smtplib
+        server = smtplib.SMTP('localhost')
+        error_emails = [
+            e.strip() for e in self.error_email.split(",")
+            if e.strip()]
+        server.sendmail(from_address, error_emails, message)
+        server.quit()
+        print 'email sent to', error_emails, message
+        
+class ThreadPoolMixIn(object):
+    """
+    Mix-in class to process requests from a thread pool
+    """
+    def __init__(self, nworkers, daemon=False, **threadpool_options):
+        # Create and start the workers
+        self.running = True
+        assert nworkers > 0, "ThreadPoolMixIn servers must have at least one worker"
+        self.thread_pool = ThreadPool(
+            nworkers,
+            "ThreadPoolMixIn HTTP server on %s:%d"
+            % (self.server_name, self.server_port),
+            daemon,
+            **threadpool_options)
+
+    def process_request(self, request, client_address):
+        """
+        Queue the request to be processed by on of the thread pool threads
+        """
+        # This sets the socket to blocking mode (and no timeout) since it
+        # may take the thread pool a little while to get back to it. (This
+        # is the default but since we set a timeout on the parent socket so
+        # that we can trap interrupts we need to restore this,.)
+        request.setblocking(1)
+        # Queue processing of the request
+        self.thread_pool.add_task(
+             lambda: self.process_request_in_thread(request, client_address))
+
+    def handle_error(self, request, client_address):
+        exc_class, exc, tb = sys.exc_info()
+        if exc_class is ServerExit:
+            # This is actually a request to stop the server
+            raise
+        return super(ThreadPoolMixIn, self).handle_error(request, client_address)
+
+    def process_request_in_thread(self, request, client_address):
+        """
+        The worker thread should call back here to do the rest of the
+        request processing. Error handling normaller done in 'handle_request'
+        must be done here.
+        """
+        try:
+            self.finish_request(request, client_address)
+            self.close_request(request)
+        except:
+            self.handle_error(request, client_address)
+            self.close_request(request)
+
+    def serve_forever(self):
+        """
+        Overrides `serve_forever` to shut the threadpool down cleanly.
+        """
+        try:
+            while self.running:
+                try:
+                    self.handle_request()
+                except socket.timeout:
+                    # Timeout is expected, gives interrupts a chance to
+                    # propogate, just keep handling
+                    pass
+        finally:
+            self.thread_pool.shutdown()
+
+    def server_activate(self):
+        """
+        Overrides server_activate to set timeout on our listener socket.
+        """
+        # We set the timeout here so that we can trap interrupts on windows
+        self.socket.settimeout(1)
+        self.socket.listen(self.request_queue_size)
+
+    def server_close(self):
+        """
+        Finish pending requests and shutdown the server.
+        """
+        self.running = False
+        self.socket.close()
+        self.thread_pool.shutdown(60)
+
+class WSGIServerBase(SecureHTTPServer):
+    def __init__(self, wsgi_application, server_address,
+                 RequestHandlerClass=None, ssl_context=None):
+        SecureHTTPServer.__init__(self, server_address,
+                                  RequestHandlerClass, ssl_context)
+        self.wsgi_application = wsgi_application
+        self.wsgi_socket_timeout = None
+
+    def get_request(self):
+        # If there is a socket_timeout, set it on the accepted
+        (conn,info) = SecureHTTPServer.get_request(self)
+        if self.wsgi_socket_timeout:
+            conn.settimeout(self.wsgi_socket_timeout)
+        return (conn, info)
+
+class WSGIServer(ThreadingMixIn, WSGIServerBase):
+    daemon_threads = False
+
+class WSGIThreadPoolServer(ThreadPoolMixIn, WSGIServerBase):
+    def __init__(self, wsgi_application, server_address,
+                 RequestHandlerClass=None, ssl_context=None,
+                 nworkers=10, daemon_threads=False,
+                 threadpool_options=None):
+        WSGIServerBase.__init__(self, wsgi_application, server_address,
+                                RequestHandlerClass, ssl_context)
+        if threadpool_options is None:
+            threadpool_options = {}
+        ThreadPoolMixIn.__init__(self, nworkers, daemon_threads,
+                                 **threadpool_options)
+
+class ServerExit(SystemExit):
+    """
+    Raised to tell the server to really exit (SystemExit is normally
+    caught)
+    """
+
+def serve(application, host=None, port=None, handler=None, ssl_pem=None,
+          ssl_context=None, server_version=None, protocol_version=None,
+          start_loop=True, daemon_threads=None, socket_timeout=None,
+          use_threadpool=None, threadpool_workers=10,
+          threadpool_options=None):
+    """
+    Serves your ``application`` over HTTP(S) via WSGI interface
+
+    ``host``
+
+        This is the ipaddress to bind to (or a hostname if your
+        nameserver is properly configured).  This defaults to
+        127.0.0.1, which is not a public interface.
+
+    ``port``
+
+        The port to run on, defaults to 8080 for HTTP, or 4443 for
+        HTTPS. This can be a string or an integer value.
+
+    ``handler``
+
+        This is the HTTP request handler to use, it defaults to
+        ``WSGIHandler`` in this module.
+
+    ``ssl_pem``
+
+        This an optional SSL certificate file (via OpenSSL). You can
+        supply ``*`` and a development-only certificate will be
+        created for you, or you can generate a self-signed test PEM
+        certificate file as follows::
+
+            $ openssl genrsa 1024 > host.key
+            $ chmod 400 host.key
+            $ openssl req -new -x509 -nodes -sha1 -days 365  \\
+                          -key host.key > host.cert
+            $ cat host.cert host.key > host.pem
+            $ chmod 400 host.pem
+
+    ``ssl_context``
+
+        This an optional SSL context object for the server.  A SSL
+        context will be automatically constructed for you if you supply
+        ``ssl_pem``.  Supply this to use a context of your own
+        construction.
+
+    ``server_version``
+
+        The version of the server as reported in HTTP response line. This
+        defaults to something like "PasteWSGIServer/0.5".  Many servers
+        hide their code-base identity with a name like 'Amnesiac/1.0'
+
+    ``protocol_version``
+
+        This sets the protocol used by the server, by default
+        ``HTTP/1.0``. There is some support for ``HTTP/1.1``, which
+        defaults to nicer keep-alive connections.  This server supports
+        ``100 Continue``, but does not yet support HTTP/1.1 Chunked
+        Encoding. Hence, if you use HTTP/1.1, you're somewhat in error
+        since chunked coding is a mandatory requirement of a HTTP/1.1
+        server.  If you specify HTTP/1.1, every response *must* have a
+        ``Content-Length`` and you must be careful not to read past the
+        end of the socket.
+
+    ``start_loop``
+
+        This specifies if the server loop (aka ``server.serve_forever()``)
+        should be called; it defaults to ``True``.
+
+    ``daemon_threads``
+
+        This flag specifies if when your webserver terminates all
+        in-progress client connections should be droppped.  It defaults
+        to ``False``.   You might want to set this to ``True`` if you
+        are using ``HTTP/1.1`` and don't set a ``socket_timeout``.
+
+    ``socket_timeout``
+
+        This specifies the maximum amount of time that a connection to a
+        given client will be kept open.  At this time, it is a rude
+        disconnect, but at a later time it might follow the RFC a bit
+        more closely.
+
+    ``use_threadpool``
+
+        Server requests from a pool of worker threads (``threadpool_workers``)
+        rather than creating a new thread for each request. This can
+        substantially reduce latency since there is a high cost associated
+        with thread creation.
+
+    ``threadpool_workers``
+
+        Number of worker threads to create when ``use_threadpool`` is true. This
+        can be a string or an integer value.
+
+    ``threadpool_options``
+
+        A dictionary of options to be used when instantiating the
+        threadpool.  See paste.httpserver.ThreadPool for specific
+        options (``threadpool_workers`` is a specific option that can
+        also go here).
+    """
+    is_ssl = False
+    if ssl_pem or ssl_context:
+        assert SSL, "pyOpenSSL is not installed"
+        is_ssl = True
+        port = int(port or 4443)
+        if not ssl_context:
+            if ssl_pem == '*':
+                ssl_context = _auto_ssl_context()
+            else:
+                ssl_context = SSL.Context(SSL.SSLv23_METHOD)
+                ssl_context.use_privatekey_file(ssl_pem)
+                ssl_context.use_certificate_chain_file(ssl_pem)
+
+    host = host or '127.0.0.1'
+    if not port:
+        if ':' in host:
+            host, port = host.split(':', 1)
+        else:
+            port = 8080
+    server_address = (host, int(port))
+
+    if not handler:
+        handler = WSGIHandler
+    if server_version:
+        handler.server_version = server_version
+        handler.sys_version = None
+    if protocol_version:
+        assert protocol_version in ('HTTP/0.9', 'HTTP/1.0', 'HTTP/1.1')
+        handler.protocol_version = protocol_version
+
+    if use_threadpool is None:
+        use_threadpool = True
+
+    if converters.asbool(use_threadpool):
+        server = WSGIThreadPoolServer(application, server_address, handler,
+                                      ssl_context, int(threadpool_workers),
+                                      daemon_threads,
+                                      threadpool_options=threadpool_options)
+    else:
+        server = WSGIServer(application, server_address, handler, ssl_context)
+        if daemon_threads:
+            server.daemon_threads = daemon_threads
+
+    if socket_timeout:
+        server.wsgi_socket_timeout = int(socket_timeout)
+
+    if converters.asbool(start_loop):
+        protocol = is_ssl and 'https' or 'http'
+        host, port = server.server_address
+        if host == '0.0.0.0':
+            print 'serving on 0.0.0.0:%s view at %s://127.0.0.1:%s' % \
+                (port, protocol, port)
+        else:
+            print "serving on %s://%s:%s" % (protocol, host, port)
+        try:
+            server.serve_forever()
+        except KeyboardInterrupt:
+            # allow CTRL+C to shutdown
+            pass
+    return server
+
+# For paste.deploy server instantiation (egg:Paste#http)
+# Note: this gets a separate function because it has to expect string
+# arguments (though that's not much of an issue yet, ever?)
+def server_runner(wsgi_app, global_conf, **kwargs):
+    from paste.deploy.converters import asbool
+    for name in ['port', 'socket_timeout', 'threadpool_workers',
+                 'threadpool_hung_thread_limit',
+                 'threadpool_kill_thread_limit',
+                 'threadpool_dying_limit', 'threadpool_spawn_if_under',
+                 'threadpool_max_zombie_threads_before_die',
+                 'threadpool_hung_check_period',
+                 'threadpool_max_requests']:
+        if name in kwargs:
+            kwargs[name] = int(kwargs[name])
+    for name in ['use_threadpool', 'daemon_threads']:
+        if name in kwargs:
+            kwargs[name] = asbool(kwargs[name])
+    threadpool_options = {}
+    for name, value in kwargs.items():
+        if name.startswith('threadpool_') and name != 'threadpool_workers':
+            threadpool_options[name[len('threadpool_'):]] = value
+            del kwargs[name]
+    if ('error_email' not in threadpool_options
+        and 'error_email' in global_conf):
+        threadpool_options['error_email'] = global_conf['error_email']
+    kwargs['threadpool_options'] = threadpool_options
+    serve(wsgi_app, **kwargs)
+
+server_runner.__doc__ = serve.__doc__ + """
+
+    You can also set these threadpool options:
+
+    ``threadpool_max_requests``:
+
+        The maximum number of requests a worker thread will process
+        before dying (and replacing itself with a new worker thread).
+        Default 100.
+
+    ``threadpool_hung_thread_limit``:
+
+        The number of seconds a thread can work on a task before it is
+        considered hung (stuck).  Default 30 seconds.
+
+    ``threadpool_kill_thread_limit``:
+
+        The number of seconds a thread can work before you should kill it
+        (assuming it will never finish).  Default 600 seconds (10 minutes).
+
+    ``threadpool_dying_limit``:
+
+        The length of time after killing a thread that it should actually
+        disappear.  If it lives longer than this, it is considered a
+        "zombie".  Note that even in easy situations killing a thread can
+        be very slow.  Default 300 seconds (5 minutes).
+
+    ``threadpool_spawn_if_under``:
+
+        If there are no idle threads and a request comes in, and there are
+        less than this number of *busy* threads, then add workers to the
+        pool.  Busy threads are threads that have taken less than
+        ``threadpool_hung_thread_limit`` seconds so far.  So if you get
+        *lots* of requests but they complete in a reasonable amount of time,
+        the requests will simply queue up (adding more threads probably
+        wouldn't speed them up).  But if you have lots of hung threads and
+        one more request comes in, this will add workers to handle it.
+        Default 5.
+
+    ``threadpool_max_zombie_threads_before_die``:
+
+        If there are more zombies than this, just kill the process.  This is
+        only good if you have a monitor that will automatically restart
+        the server.  This can clean up the mess.  Default 0 (disabled).
+
+    `threadpool_hung_check_period``:
+
+        Every X requests, check for hung threads that need to be killed,
+        or for zombie threads that should cause a restart.  Default 100
+        requests.
+
+    ``threadpool_logger``:
+
+        Logging messages will go the logger named here.
+
+    ``threadpool_error_email`` (or global ``error_email`` setting):
+
+        When threads are killed or the process restarted, this email
+        address will be contacted (using an SMTP server on localhost).
+"""
+
+
+if __name__ == '__main__':
+    from paste.wsgilib import dump_environ
+    #serve(dump_environ, ssl_pem="test.pem")
+    serve(dump_environ, server_version="Wombles/1.0",
+          protocol_version="HTTP/1.1", port="8888")
+
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/recursive.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/recursive.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/recursive.py (revision 3)
@@ -0,0 +1,401 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+"""
+Middleware to make internal requests and forward requests internally.
+
+When applied, several keys are added to the environment that will allow
+you to trigger recursive redirects and forwards.
+
+  paste.recursive.include:
+      When you call
+      ``environ['paste.recursive.include'](new_path_info)`` a response
+      will be returned.  The response has a ``body`` attribute, a
+      ``status`` attribute, and a ``headers`` attribute.
+
+  paste.recursive.script_name:
+      The ``SCRIPT_NAME`` at the point that recursive lives.  Only
+      paths underneath this path can be redirected to.
+
+  paste.recursive.old_path_info:
+      A list of previous ``PATH_INFO`` values from previous redirects.
+
+Raise ``ForwardRequestException(new_path_info)`` to do a forward
+(aborting the current request).
+"""
+
+from cStringIO import StringIO
+import warnings
+
+__all__ = ['RecursiveMiddleware']
+__pudge_all__ =  ['RecursiveMiddleware', 'ForwardRequestException']
+
+class CheckForRecursionMiddleware(object):
+    def __init__(self, app, env):
+        self.app = app
+        self.env = env
+        
+    def __call__(self, environ, start_response):
+        path_info = environ.get('PATH_INFO','')
+        if path_info in self.env.get(
+            'paste.recursive.old_path_info', []):
+            raise AssertionError(
+                "Forwarding loop detected; %r visited twice (internal "
+                "redirect path: %s)"
+                % (path_info, self.env['paste.recursive.old_path_info']))
+        old_path_info = self.env.setdefault('paste.recursive.old_path_info', [])
+        old_path_info.append(self.env.get('PATH_INFO', ''))
+        return self.app(environ, start_response)
+
+class RecursiveMiddleware(object):
+
+    """
+    A WSGI middleware that allows for recursive and forwarded calls.
+    All these calls go to the same 'application', but presumably that
+    application acts differently with different URLs.  The forwarded
+    URLs must be relative to this container.
+
+    Interface is entirely through the ``paste.recursive.forward`` and
+    ``paste.recursive.include`` environmental keys.
+    """
+
+    def __init__(self, application, global_conf=None):
+        self.application = application
+
+    def __call__(self, environ, start_response):
+        environ['paste.recursive.forward'] = Forwarder(
+            self.application, 
+            environ, 
+            start_response)
+        environ['paste.recursive.include'] = Includer(
+            self.application, 
+            environ, 
+            start_response)
+        environ['paste.recursive.include_app_iter'] = IncluderAppIter(
+            self.application,
+            environ,
+            start_response)
+        my_script_name = environ.get('SCRIPT_NAME', '')
+        environ['paste.recursive.script_name'] = my_script_name
+        try:
+            return self.application(environ, start_response)
+        except ForwardRequestException, e:
+            middleware = CheckForRecursionMiddleware(
+                e.factory(self), environ)
+            return middleware(environ, start_response)
+
+class ForwardRequestException(Exception):
+    """
+    Used to signal that a request should be forwarded to a different location.
+    
+    ``url``
+        The URL to forward to starting with a ``/`` and relative to 
+        ``RecursiveMiddleware``. URL fragments can also contain query strings 
+        so ``/error?code=404`` would be a valid URL fragment.
+    
+    ``environ``
+        An altertative WSGI environment dictionary to use for the forwarded 
+        request. If specified is used *instead* of the ``url_fragment``
+     
+    ``factory``
+        If specifed ``factory`` is used instead of ``url`` or ``environ``. 
+        ``factory`` is a callable that takes a WSGI application object 
+        as the first argument and returns an initialised WSGI middleware
+        which can alter the forwarded response.
+
+    Basic usage (must have ``RecursiveMiddleware`` present) :
+    
+    .. code-block:: Python
+    
+        from paste.recursive import ForwardRequestException
+        def app(environ, start_response):
+            if environ['PATH_INFO'] == '/hello':
+                start_response("200 OK", [('Content-type', 'text/plain')])
+                return ['Hello World!']
+            elif environ['PATH_INFO'] == '/error':
+                start_response("404 Not Found", [('Content-type', 'text/plain')])
+                return ['Page not found']
+            else:
+                raise ForwardRequestException('/error')
+                
+        from paste.recursive import RecursiveMiddleware
+        app = RecursiveMiddleware(app)
+        
+    If you ran this application and visited ``/hello`` you would get a 
+    ``Hello World!`` message. If you ran the application and visited 
+    ``/not_found`` a ``ForwardRequestException`` would be raised and the caught
+    by the ``RecursiveMiddleware``. The ``RecursiveMiddleware`` would then 
+    return the headers and response from the ``/error`` URL but would display 
+    a ``404 Not found`` status message.
+    
+    You could also specify an ``environ`` dictionary instead of a url. Using 
+    the same example as before:
+    
+    .. code-block:: Python
+    
+        def app(environ, start_response):
+            ... same as previous example ...
+            else:
+                new_environ = environ.copy()
+                new_environ['PATH_INFO'] = '/error'
+                raise ForwardRequestException(environ=new_environ)
+                
+    Finally, if you want complete control over every aspect of the forward you
+    can specify a middleware factory. For example to keep the old status code 
+    but use the headers and resposne body from the forwarded response you might
+    do this:
+    
+    .. code-block:: Python
+
+        from paste.recursive import ForwardRequestException
+        from paste.recursive import RecursiveMiddleware
+        from paste.errordocument import StatusKeeper
+
+        def app(environ, start_response):
+            if environ['PATH_INFO'] == '/hello':
+                start_response("200 OK", [('Content-type', 'text/plain')])
+                return ['Hello World!']
+            elif environ['PATH_INFO'] == '/error':
+                start_response("404 Not Found", [('Content-type', 'text/plain')])
+                return ['Page not found']
+            else:
+                def factory(app):
+                    return StatusKeeper(app, status='404 Not Found', url='/error')
+                raise ForwardRequestException(factory=factory)
+
+        app = RecursiveMiddleware(app)
+    """
+
+    def __init__(
+        self, 
+        url=None, 
+        environ={}, 
+        factory=None, 
+        path_info=None):
+        # Check no incompatible options have been chosen
+        if factory and url:
+            raise TypeError(
+                'You cannot specify factory and a url in '
+                'ForwardRequestException')
+        elif factory and environ:
+            raise TypeError(
+                'You cannot specify factory and environ in '
+                'ForwardRequestException')
+        if url and environ:
+            raise TypeError(
+                'You cannot specify environ and url in '
+                'ForwardRequestException')
+
+        # set the path_info or warn about its use.
+        if path_info:
+            if not url:
+                warnings.warn(
+                    "ForwardRequestException(path_info=...) has been deprecated; please "
+                    "use ForwardRequestException(url=...)",
+                    DeprecationWarning, 2)
+            else:
+                raise TypeError('You cannot use url and path_info in ForwardRequestException')
+            self.path_info = path_info
+    
+        # If the url can be treated as a path_info do that
+        if url and not '?' in str(url): 
+            self.path_info = url
+            
+        # Base middleware
+        class ForwardRequestExceptionMiddleware(object):
+            def __init__(self, app):
+                self.app = app
+                            
+        # Otherwise construct the appropriate middleware factory
+        if hasattr(self, 'path_info'):
+            p = self.path_info
+            def factory_(app):
+                class PathInfoForward(ForwardRequestExceptionMiddleware):
+                    def __call__(self, environ, start_response):
+                        environ['PATH_INFO'] = p
+                        return self.app(environ, start_response)
+                return PathInfoForward(app)
+            self.factory = factory_
+        elif url:
+            def factory_(app):
+                class URLForward(ForwardRequestExceptionMiddleware):
+                    def __call__(self, environ, start_response):
+                        environ['PATH_INFO'] = url.split('?')[0]
+                        environ['QUERY_STRING'] = url.split('?')[1]
+                        return self.app(environ, start_response)
+                return URLForward(app)
+            self.factory = factory_
+        elif environ:
+            def factory_(app):
+                class EnvironForward(ForwardRequestExceptionMiddleware):
+                    def __call__(self, environ_, start_response):
+                        return self.app(environ, start_response)
+                return EnvironForward(app)
+            self.factory = factory_
+        else:
+            self.factory = factory
+
+class Recursive(object):
+
+    def __init__(self, application, environ, start_response):
+        self.application = application
+        self.original_environ = environ.copy()
+        self.previous_environ = environ
+        self.start_response = start_response
+
+    def __call__(self, path, extra_environ=None):
+        """
+        `extra_environ` is an optional dictionary that is also added
+        to the forwarded request.  E.g., ``{'HTTP_HOST': 'new.host'}``
+        could be used to forward to a different virtual host.
+        """
+        environ = self.original_environ.copy()
+        if extra_environ:
+            environ.update(extra_environ)
+        environ['paste.recursive.previous_environ'] = self.previous_environ
+        base_path = self.original_environ.get('SCRIPT_NAME')
+        if path.startswith('/'):
+            assert path.startswith(base_path), (
+                "You can only forward requests to resources under the "
+                "path %r (not %r)" % (base_path, path))
+            path = path[len(base_path)+1:]
+        assert not path.startswith('/')
+        path_info = '/' + path
+        environ['PATH_INFO'] = path_info
+        environ['REQUEST_METHOD'] = 'GET'
+        environ['CONTENT_LENGTH'] = '0'
+        environ['CONTENT_TYPE'] = ''
+        environ['wsgi.input'] = StringIO('')
+        return self.activate(environ)
+
+    def activate(self, environ):
+        raise NotImplementedError
+
+    def __repr__(self):
+        return '<%s.%s from %s>' % (
+            self.__class__.__module__,
+            self.__class__.__name__,
+            self.original_environ.get('SCRIPT_NAME') or '/')
+
+class Forwarder(Recursive):
+
+    """
+    The forwarder will try to restart the request, except with
+    the new `path` (replacing ``PATH_INFO`` in the request).
+
+    It must not be called after and headers have been returned.
+    It returns an iterator that must be returned back up the call
+    stack, so it must be used like:
+    
+    .. code-block:: Python
+
+        return environ['paste.recursive.forward'](path)
+
+    Meaningful transformations cannot be done, since headers are
+    sent directly to the server and cannot be inspected or
+    rewritten.
+    """
+
+    def activate(self, environ):
+        warnings.warn(
+            "recursive.Forwarder has been deprecated; please use "
+            "ForwardRequestException",
+            DeprecationWarning, 2)
+        return self.application(environ, self.start_response)
+    
+
+class Includer(Recursive):
+
+    """
+    Starts another request with the given path and adding or
+    overwriting any values in the `extra_environ` dictionary.
+    Returns an IncludeResponse object.
+    """
+    
+    def activate(self, environ):
+        response = IncludedResponse()
+        def start_response(status, headers, exc_info=None):
+            if exc_info:
+                raise exc_info[0], exc_info[1], exc_info[2]
+            response.status = status
+            response.headers = headers
+            return response.write
+        app_iter = self.application(environ, start_response)
+        try:
+            for s in app_iter:
+                response.write(s)
+        finally:
+            if hasattr(app_iter, 'close'):
+                app_iter.close()
+        response.close()
+        return response
+
+class IncludedResponse(object):
+
+    def __init__(self):
+        self.headers = None
+        self.status = None
+        self.output = StringIO()
+        self.str = None
+
+    def close(self):
+        self.str = self.output.getvalue()
+        self.output.close()
+        self.output = None
+
+    def write(self, s):
+        assert self.output is not None, (
+            "This response has already been closed and no further data "
+            "can be written.")
+        self.output.write(s)
+
+    def __str__(self):
+        return self.body
+
+    def body__get(self):
+        if self.str is None:
+            return self.output.getvalue()
+        else:
+            return self.str
+    body = property(body__get)
+
+
+class IncluderAppIter(Recursive):
+    """
+    Like Includer, but just stores the app_iter response
+    (be sure to call close on the response!)
+    """
+
+    def activate(self, environ):
+        response = IncludedAppIterResponse()
+        def start_response(status, headers, exc_info=None):
+            if exc_info:
+                raise exc_info[0], exc_info[1], exc_info[2]
+            response.status = status
+            response.headers = headers
+            return response.write
+        app_iter = self.application(environ, start_response)
+        response.app_iter = app_iter
+        return response
+
+class IncludedAppIterResponse(object):
+
+    def __init__(self):
+        self.status = None
+        self.headers = None
+        self.accumulated = []
+        self.app_iter = None
+        self._closed = False
+
+    def close(self):
+        assert not self._closed, (
+            "Tried to close twice")
+        if hasattr(self.app_iter, 'close'):
+            self.app_iter.close()
+            
+    def write(self, s):
+        self.accumulated.append
+
+def make_recursive_middleware(app, global_conf):
+    return RecursiveMiddleware(app)
+
+make_recursive_middleware.__doc__ = __doc__
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/flup_session.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/flup_session.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/flup_session.py (revision 3)
@@ -0,0 +1,108 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+
+"""
+Creates a session object.
+
+In your application, use::
+
+    environ['paste.flup_session_service'].session
+
+This will return a dictionary.  The contents of this dictionary will
+be saved to disk when the request is completed.  The session will be
+created when you first fetch the session dictionary, and a cookie will
+be sent in that case.  There's current no way to use sessions without
+cookies, and there's no way to delete a session except to clear its
+data.
+"""
+
+from paste import httpexceptions
+from paste import wsgilib
+import flup.middleware.session
+flup_session = flup.middleware.session
+
+# This is a dictionary of existing stores, keyed by a tuple of
+# store type and parameters
+store_cache = {}
+
+class NoDefault(object):
+    pass
+
+class SessionMiddleware(object):
+
+    session_classes = {
+        'memory': (flup_session.MemorySessionStore,
+                   [('session_timeout', 'timeout', int, 60)]),
+        'disk': (flup_session.DiskSessionStore,
+                 [('session_timeout', 'timeout', int, 60),
+                  ('session_dir', 'storeDir', str, '/tmp/sessions')]),
+        'shelve': (flup_session.ShelveSessionStore,
+                   [('session_timeout', 'timeout', int, 60),
+                    ('session_file', 'storeFile', str,
+                     '/tmp/session.shelve')]),
+        }
+
+
+    def __init__(self, app,
+                 global_conf=None,
+                 session_type=NoDefault,
+                 cookie_name=NoDefault,
+                 **store_config
+                 ):
+        self.application = app
+        if session_type is NoDefault:
+            session_type = global_conf.get('session_type', 'disk')
+        self.session_type = session_type
+        try:
+            self.store_class, self.store_args = self.session_classes[self.session_type]
+        except KeyError:
+            raise KeyError(
+                "The session_type %s is unknown (I know about %s)"
+                % (self.session_type,
+                   ', '.join(self.session_classes.keys())))
+        kw = {}
+        for config_name, kw_name, coercer, default in self.store_args:
+            value = coercer(store_config.get(config_name, default))
+            kw[kw_name] = value
+        self.store = self.store_class(**kw)
+        if cookie_name is NoDefault:
+            cookie_name = global_conf.get('session_cookie', '_SID_')
+        self.cookie_name = cookie_name
+        
+    def __call__(self, environ, start_response):
+        service = flup_session.SessionService(
+            self.store, environ, cookieName=self.cookie_name,
+            fieldName=self.cookie_name)
+        environ['paste.flup_session_service'] = service
+
+        def cookie_start_response(status, headers, exc_info=None):
+            service.addCookie(headers)
+            return start_response(status, headers, exc_info)
+
+        try:
+            app_iter = self.application(environ, cookie_start_response)
+        except httpexceptions.HTTPException, e:
+            headers = (e.headers or {}).items()
+            service.addCookie(headers)
+            e.headers = dict(headers)
+            service.close()
+            raise
+        except:
+            service.close()
+            raise
+
+        return wsgilib.add_close(app_iter, service.close)
+            
+def make_session_middleware(app, global_conf,
+                            session_type=NoDefault,
+                            cookie_name=NoDefault,
+                            **store_config):
+    """
+    Wraps the application in a session-managing middleware.
+    The session service can then be found in
+    ``environ['paste.flup_session_service']``
+    """
+    return SessionMiddleware(
+        app, global_conf=global_conf,
+        session_type=session_type, cookie_name=cookie_name,
+        **store_config)
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/auth/cookie.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/auth/cookie.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/auth/cookie.py (revision 3)
@@ -0,0 +1,388 @@
+# (c) 2005 Clark C. Evans
+# This module is part of the Python Paste Project and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+# This code was written with funding by http://prometheusresearch.com
+"""
+Cookie "Saved" Authentication
+
+This authentication middleware saves the current REMOTE_USER,
+REMOTE_SESSION, and any other environment variables specified in a
+cookie so that it can be retrieved during the next request without
+requiring re-authentication. This uses a session cookie on the client
+side (so it goes away when the user closes their window) and does
+server-side expiration.
+
+Following is a very simple example where a form is presented asking for
+a user name (no actual checking), and dummy session identifier (perhaps
+corresponding to a database session id) is stored in the cookie.
+
+::
+
+  >>> from paste.httpserver import serve
+  >>> from paste.fileapp import DataApp
+  >>> from paste.httpexceptions import *
+  >>> from paste.auth.cookie import AuthCookieHandler
+  >>> from paste.wsgilib import parse_querystring
+  >>> def testapp(environ, start_response):
+  ...     user = dict(parse_querystring(environ)).get('user','')
+  ...     if user:
+  ...         environ['REMOTE_USER'] = user
+  ...         environ['REMOTE_SESSION'] = 'a-session-id'
+  ...     if environ.get('REMOTE_USER'):
+  ...         page = '<html><body>Welcome %s (%s)</body></html>'
+  ...         page %= (environ['REMOTE_USER'], environ['REMOTE_SESSION'])
+  ...     else:
+  ...         page = ('<html><body><form><input name="user" />'
+  ...                 '<input type="submit" /></form></body></html>')
+  ...     return DataApp(page, content_type="text/html")(
+  ...                    environ, start_response)
+  >>> serve(AuthCookieHandler(testapp))
+  serving on...
+
+"""
+
+import sha, hmac, base64, random, time, warnings
+from paste.request import get_cookies
+
+def make_time(value):
+    return time.strftime("%Y%m%d%H%M", time.gmtime(value))
+_signature_size = len(hmac.new('x', 'x', sha).digest())
+_header_size = _signature_size + len(make_time(time.time()))
+
+# @@: Should this be using urllib.quote?
+# build encode/decode functions to safely pack away values
+_encode = [('\\', '\\x5c'), ('"', '\\x22'),
+           ('=', '\\x3d'), (';', '\\x3b')]
+_decode = [(v, k) for (k, v) in _encode]
+_decode.reverse()
+def encode(s, sublist = _encode):
+    return reduce((lambda a, (b, c): a.replace(b, c)), sublist, str(s))
+decode = lambda s: encode(s, _decode)
+
+class CookieTooLarge(RuntimeError):
+    def __init__(self, content, cookie):
+        RuntimeError.__init__("Signed cookie exceeds maximum size of 4096")
+        self.content = content
+        self.cookie = cookie
+
+_all_chars = ''.join([chr(x) for x in range(0, 255)])
+def new_secret():
+    """ returns a 64 byte secret """
+    return ''.join(random.sample(_all_chars, 64))
+
+class AuthCookieSigner(object):
+    """
+    save/restore ``environ`` entries via digially signed cookie
+
+    This class converts content into a timed and digitally signed
+    cookie, as well as having the facility to reverse this procedure.
+    If the cookie, after the content is encoded and signed exceeds the
+    maximum length (4096), then CookieTooLarge exception is raised.
+
+    The timeout of the cookie is handled on the server side for a few
+    reasons.  First, if a 'Expires' directive is added to a cookie, then
+    the cookie becomes persistent (lasting even after the browser window
+    has closed). Second, the user's clock may be wrong (perhaps
+    intentionally). The timeout is specified in minutes; and expiration
+    date returned is rounded to one second.
+
+    Constructor Arguments:
+
+        ``secret``
+
+            This is a secret key if you want to syncronize your keys so
+            that the cookie will be good across a cluster of computers.
+            It is recommended via the HMAC specification (RFC 2104) that
+            the secret key be 64 bytes since this is the block size of
+            the hashing.  If you do not provide a secret key, a random
+            one is generated each time you create the handler; this
+            should be sufficient for most cases.
+
+        ``timeout``
+
+            This is the time (in minutes) from which the cookie is set
+            to expire.  Note that on each request a new (replacement)
+            cookie is sent, hence this is effectively a session timeout
+            parameter for your entire cluster.  If you do not provide a
+            timeout, it is set at 30 minutes.
+
+        ``maxlen``
+
+            This is the maximum size of the *signed* cookie; hence the
+            actual content signed will be somewhat less.  If the cookie
+            goes over this size, a ``CookieTooLarge`` exception is
+            raised so that unexpected handling of cookies on the client
+            side are avoided.  By default this is set at 4k (4096 bytes),
+            which is the standard cookie size limit.
+
+    """
+    def __init__(self, secret = None, timeout = None, maxlen = None):
+        self.timeout = timeout or 30
+        if isinstance(timeout, basestring):
+            raise ValueError(
+                "Timeout must be a number (minutes), not a string (%r)"
+                % timeout)
+        self.maxlen  = maxlen or 4096
+        self.secret = secret or new_secret()
+
+    def sign(self, content):
+        """
+        Sign the content returning a valid cookie (that does not
+        need to be escaped and quoted).  The expiration of this
+        cookie is handled server-side in the auth() function.
+        """
+        cookie = base64.encodestring(
+            hmac.new(self.secret, content, sha).digest() +
+            make_time(time.time() + 60*self.timeout) +
+            content).replace("/", "_").replace("=", "~")
+        if len(cookie) > self.maxlen:
+            raise CookieTooLarge(content, cookie)
+        return cookie
+
+    def auth(self, cookie):
+        """
+        Authenticate the cooke using the signature, verify that it
+        has not expired; and return the cookie's content
+        """
+        decode = base64.decodestring(
+            cookie.replace("_", "/").replace("~", "="))
+        signature = decode[:_signature_size]
+        expires = decode[_signature_size:_header_size]
+        content = decode[_header_size:]
+        if signature == hmac.new(self.secret, content, sha).digest():
+            if int(expires) > int(make_time(time.time())):
+                return content
+            else:
+                # This is the normal case of an expired cookie; just
+                # don't bother doing anything here.
+                pass
+        else:
+            # This case can happen if the server is restarted with a
+            # different secret; or if the user's IP address changed
+            # due to a proxy.  However, it could also be a break-in
+            # attempt -- so should it be reported?
+            pass
+
+class AuthCookieEnviron(list):
+    """
+    a list of environment keys to be saved via cookie
+
+    An instance of this object, found at ``environ['paste.auth.cookie']``
+    lists the `environ` keys that were restored from or will be added
+    to the digially signed cookie.  This object can be accessed from an
+    `environ` variable by using this module's name.
+    """
+    def __init__(self, handler, scanlist):
+        list.__init__(self, scanlist)
+        self.handler = handler
+    def append(self, value):
+        if value in self:
+            return
+        list.append(self, str(value))
+
+class AuthCookieHandler(object):
+    """
+    the actual handler that should be put in your middleware stack
+
+    This middleware uses cookies to stash-away a previously authenticated
+    user (and perhaps other variables) so that re-authentication is not
+    needed.  This does not implement sessions; and therefore N servers
+    can be syncronized to accept the same saved authentication if they
+    all use the same cookie_name and secret.
+
+    By default, this handler scans the `environ` for the REMOTE_USER
+    and REMOTE_SESSION key; if found, it is stored. It can be
+    configured to scan other `environ` keys as well -- but be careful
+    not to exceed 2-3k (so that the encoded and signed cookie does not
+    exceed 4k). You can ask it to handle other environment variables
+    by doing:
+
+       ``environ['paste.auth.cookie'].append('your.environ.variable')``
+
+
+    Constructor Arguments:
+
+        ``application``
+
+            This is the wrapped application which will have access to
+            the ``environ['REMOTE_USER']`` restored by this middleware.
+
+        ``cookie_name``
+
+            The name of the cookie used to store this content, by default
+            it is ``PASTE_AUTH_COOKIE``.
+
+        ``scanlist``
+
+            This is the initial set of ``environ`` keys to
+            save/restore to the signed cookie.  By default is consists
+            only of ``REMOTE_USER`` and ``REMOTE_SESSION``; any tuple
+            or list of environment keys will work.  However, be
+            careful, as the total saved size is limited to around 3k.
+
+        ``signer``
+
+            This is the signer object used to create the actual cookie
+            values, by default, it is ``AuthCookieSigner`` and is passed
+            the remaining arguments to this function: ``secret``,
+            ``timeout``, and ``maxlen``.
+
+    At this time, each cookie is individually signed.  To store more
+    than the 4k of data; it is possible to sub-class this object to
+    provide different ``environ_name`` and ``cookie_name``
+    """
+    environ_name = 'paste.auth.cookie'
+    cookie_name  = 'PASTE_AUTH_COOKIE'
+    signer_class = AuthCookieSigner
+    environ_class = AuthCookieEnviron
+
+    def __init__(self, application, cookie_name=None, scanlist=None,
+                 signer=None, secret=None, timeout=None, maxlen=None):
+        if not signer:
+            signer = self.signer_class(secret, timeout, maxlen)
+        self.signer = signer
+        self.scanlist = scanlist or ('REMOTE_USER','REMOTE_SESSION')
+        self.application = application
+        self.cookie_name = cookie_name or self.cookie_name
+
+    def __call__(self, environ, start_response):
+        if self.environ_name in environ:
+            raise AssertionError("AuthCookie already installed!")
+        scanlist = self.environ_class(self, self.scanlist)
+        jar = get_cookies(environ)
+        if jar.has_key(self.cookie_name):
+            content = self.signer.auth(jar[self.cookie_name].value)
+            if content:
+                for pair in content.split(";"):
+                    (k, v) = pair.split("=")
+                    k = decode(k)
+                    if k not in scanlist:
+                        scanlist.append(k)
+                    if k in environ:
+                        continue
+                    environ[k] = decode(v)
+                    if 'REMOTE_USER' == k:
+                        environ['AUTH_TYPE'] = 'cookie'
+        environ[self.environ_name] = scanlist
+        if "paste.httpexceptions" in environ:
+            warnings.warn("Since paste.httpexceptions is hooked in your "
+                "processing chain before paste.auth.cookie, if an "
+                "HTTPRedirection is raised, the cookies this module sets "
+                "will not be included in your response.\n")
+
+        def response_hook(status, response_headers, exc_info=None):
+            """
+            Scan the environment for keys specified in the scanlist,
+            pack up their values, signs the content and issues a cookie.
+            """
+            scanlist = environ.get(self.environ_name)
+            assert scanlist and isinstance(scanlist, self.environ_class)
+            content = []
+            for k in scanlist:
+                v = environ.get(k)
+                if v is not None:
+                    if type(v) is not str:
+                        raise ValueError(
+                            "The value of the environmental variable %r "
+                            "is not a str (only str is allowed; got %r)"
+                            % (k, v))
+                    content.append("%s=%s" % (encode(k), encode(v)))
+            if content:
+                content = ";".join(content)
+                content = self.signer.sign(content)
+                cookie = '%s=%s; Path=/;' % (self.cookie_name, content)
+                if 'https' == environ['wsgi.url_scheme']:
+                    cookie += ' secure;'
+                response_headers.append(('Set-Cookie', cookie))
+            return start_response(status, response_headers, exc_info)
+        return self.application(environ, response_hook)
+
+middleware = AuthCookieHandler
+
+# Paste Deploy entry point:
+def make_auth_cookie(
+    app, global_conf,
+    # Should this get picked up from global_conf somehow?:
+    cookie_name='PASTE_AUTH_COOKIE',
+    scanlist=('REMOTE_USER', 'REMOTE_SESSION'),
+    # signer cannot be set
+    secret=None,
+    timeout=30,
+    maxlen=4096):
+    """
+    This middleware uses cookies to stash-away a previously
+    authenticated user (and perhaps other variables) so that
+    re-authentication is not needed.  This does not implement
+    sessions; and therefore N servers can be syncronized to accept the
+    same saved authentication if they all use the same cookie_name and
+    secret.
+
+    By default, this handler scans the `environ` for the REMOTE_USER
+    and REMOTE_SESSION key; if found, it is stored. It can be
+    configured to scan other `environ` keys as well -- but be careful
+    not to exceed 2-3k (so that the encoded and signed cookie does not
+    exceed 4k). You can ask it to handle other environment variables
+    by doing:
+
+       ``environ['paste.auth.cookie'].append('your.environ.variable')``
+
+    Configuration:
+
+        ``cookie_name``
+
+            The name of the cookie used to store this content, by
+            default it is ``PASTE_AUTH_COOKIE``.
+
+        ``scanlist``
+
+            This is the initial set of ``environ`` keys to
+            save/restore to the signed cookie.  By default is consists
+            only of ``REMOTE_USER`` and ``REMOTE_SESSION``; any
+            space-separated list of environment keys will work.
+            However, be careful, as the total saved size is limited to
+            around 3k.
+
+        ``secret``
+
+            The secret that will be used to sign the cookies.  If you
+            don't provide one (and none is set globally) then a random
+            secret will be created.  Each time the server is restarted
+            a new secret will then be created and all cookies will
+            become invalid!  This can be any string value.
+
+        ``timeout``
+
+            The time to keep the cookie, expressed in minutes.  This
+            is handled server-side, so a new cookie with a new timeout
+            is added to every response.
+
+        ``maxlen``
+
+            The maximum length of the cookie that is sent (default 4k,
+            which is a typical browser maximum)
+        
+    """
+    if isinstance(scanlist, basestring):
+        scanlist = scanlist.split()
+    if secret is None and global_conf.get('secret'):
+        secret = global_conf['secret']
+    try:
+        timeout = int(timeout)
+    except ValueError:
+        raise ValueError('Bad value for timeout (must be int): %r'
+                         % timeout)
+    try:
+        maxlen = int(maxlen)
+    except ValueError:
+        raise ValueError('Bad value for maxlen (must be int): %r'
+                         % maxlen)
+    return AuthCookieHandler(
+        app, cookie_name=cookie_name, scanlist=scanlist,
+        secret=secret, timeout=timeout, maxlen=maxlen)
+
+__all__ = ['AuthCookieHandler', 'AuthCookieSigner', 'AuthCookieEnviron']
+
+if "__main__" == __name__:
+    import doctest
+    doctest.testmod(optionflags=doctest.ELLIPSIS)
+
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/auth/multi.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/auth/multi.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/auth/multi.py (revision 3)
@@ -0,0 +1,79 @@
+# (c) 2005 Clark C. Evans
+# This module is part of the Python Paste Project and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+# This code was written with funding by http://prometheusresearch.com
+"""
+Authentication via Multiple Methods
+
+In some environments, the choice of authentication method to be used
+depends upon the environment and is not "fixed".  This middleware allows
+N authentication methods to be registered along with a goodness function
+which determines which method should be used. The following example
+demonstrates how to use both form and digest authentication in a server
+stack; by default it uses form-based authentication unless
+``*authmeth=digest`` is specified as a query argument.
+
+>>> from paste.auth import form, cookie, digest, multi
+>>> from paste.wsgilib import dump_environ
+>>> from paste.httpserver import serve
+>>>
+>>> multi = multi.MultiHandler(dump_environ)
+>>> def authfunc(environ, realm, user):
+...     return digest.digest_password(realm, user, user)
+>>> multi.add_method('digest', digest.middleware, "Test Realm", authfunc)
+>>> multi.set_query_argument('digest')
+>>>
+>>> def authfunc(environ, username, password):
+...     return username == password
+>>> multi.add_method('form', form.middleware, authfunc)
+>>> multi.set_default('form')
+>>> serve(cookie.middleware(multi))
+serving on...
+
+"""
+
+class MultiHandler(object):
+    """
+    Multiple Authentication Handler
+
+    This middleware provides two othogonal facilities:
+
+      - a manner to register any number of authentication middlewares
+
+      - a mechanism to register predicates which cause one of the
+        registered middlewares to be used depending upon the request
+
+    If none of the predicates returns True, then the application is
+    invoked directly without middleware
+    """
+    def __init__(self, application):
+        self.application = application
+        self.default = application
+        self.binding = {}
+        self.predicate = []
+    def add_method(self, name, factory, *args, **kwargs):
+        self.binding[name] = factory(self.application, *args, **kwargs)
+    def add_predicate(self, name, checker):
+        self.predicate.append((checker, self.binding[name]))
+    def set_default(self, name):
+        """ set default authentication method """
+        self.default = self.binding[name]
+    def set_query_argument(self, name, key = '*authmeth', value = None):
+        """ choose authentication method based on a query argument """
+        lookfor = "%s=%s" % (key, value or name)
+        self.add_predicate(name,
+            lambda environ: lookfor in environ.get('QUERY_STRING',''))
+    def __call__(self, environ, start_response):
+        for (checker, binding) in self.predicate:
+            if checker(environ):
+                return binding(environ, start_response)
+        return self.default(environ, start_response)
+
+middleware = MultiHandler
+
+__all__ = ['MultiHandler']
+
+if "__main__" == __name__:
+    import doctest
+    doctest.testmod(optionflags=doctest.ELLIPSIS)
+
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/auth/open_id.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/auth/open_id.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/auth/open_id.py (revision 3)
@@ -0,0 +1,412 @@
+# (c) 2005 Ben Bangert
+# This module is part of the Python Paste Project and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+"""
+OpenID Authentication (Consumer)
+
+OpenID is a distributed authentication system for single sign-on originally
+developed at/for LiveJournal.com.
+
+    http://openid.net/
+
+URL. You can have multiple identities in the same way you can have multiple
+URLs. All OpenID does is provide a way to prove that you own a URL (identity).
+And it does this without passing around your password, your email address, or
+anything you don't want it to. There's no profile exchange component at all:
+your profiile is your identity URL, but recipients of your identity can then
+learn more about you from any public, semantically interesting documents
+linked thereunder (FOAF, RSS, Atom, vCARD, etc.).
+
+``Note``: paste.auth.openid requires installation of the Python-OpenID
+libraries::
+
+    http://www.openidenabled.com/
+
+This module is based highly off the consumer.py that Python OpenID comes with.
+
+Using the OpenID Middleware
+===========================
+
+Using the OpenID middleware is fairly easy, the most minimal example using the
+basic login form thats included::
+
+    # Add to your wsgi app creation
+    from paste.auth import open_id
+
+    wsgi_app = open_id.middleware(wsgi_app, '/somewhere/to/store/openid/data')
+
+You will now have the OpenID form available at /oid on your site. Logging in will
+verify that the login worked.
+
+A more complete login should involve having the OpenID middleware load your own
+login page after verifying the OpenID URL so that you can retain the login
+information in your webapp (session, cookies, etc.)::
+
+    wsgi_app = open_id.middleware(wsgi_app, '/somewhere/to/store/openid/data',
+                                  login_redirect='/your/login/code')
+
+Your login code should then be configured to retrieve 'paste.auth.open_id' for
+the users OpenID URL. If this key does not exist, the user has not logged in.
+
+Once the login is retrieved, it should be saved in your webapp, and the user
+should be redirected to wherever they would normally go after a successful
+login.
+"""
+
+__all__ = ['AuthOpenIDHandler']
+
+import cgi
+import urlparse
+import re
+
+import paste.request
+from paste import httpexceptions
+
+def quoteattr(s):
+    qs = cgi.escape(s, 1)
+    return '"%s"' % (qs,)
+
+# You may need to manually add the openid package into your
+# python path if you don't have it installed with your system python.
+# If so, uncomment the line below, and change the path where you have
+# Python-OpenID.
+# sys.path.append('/path/to/openid/')
+
+from openid.store import filestore
+from openid.consumer import consumer
+from openid.oidutil import appendArgs
+
+class AuthOpenIDHandler(object):
+    """
+    This middleware implements OpenID Consumer behavior to authenticate a
+    URL against an OpenID Server.
+    """
+
+    def __init__(self, app, data_store_path, auth_prefix='/oid',
+                 login_redirect=None, catch_401=False,
+                 url_to_username=None):
+        """
+        Initialize the OpenID middleware
+
+        ``app``
+            Your WSGI app to call
+            
+        ``data_store_path``
+            Directory to store crypto data in for use with OpenID servers.
+            
+        ``auth_prefix``
+            Location for authentication process/verification
+            
+        ``login_redirect``
+            Location to load after successful process of login
+            
+        ``catch_401``
+            If true, then any 401 responses will turn into open ID login
+            requirements.
+            
+        ``url_to_username``
+            A function called like ``url_to_username(environ, url)``, which should
+            return a string username.  If not given, the URL will be the username.
+        """
+        store = filestore.FileOpenIDStore(data_store_path)
+        self.oidconsumer = consumer.OpenIDConsumer(store)
+
+        self.app = app
+        self.auth_prefix = auth_prefix
+        self.data_store_path = data_store_path
+        self.login_redirect = login_redirect
+        self.catch_401 = catch_401
+        self.url_to_username = url_to_username
+
+    def __call__(self, environ, start_response):
+        if environ['PATH_INFO'].startswith(self.auth_prefix):
+            # Let's load everything into a request dict to pass around easier
+            request = dict(environ=environ, start=start_response, body=[])
+            request['base_url'] = paste.request.construct_url(environ, with_path_info=False,
+                                                              with_query_string=False)
+
+            path = re.sub(self.auth_prefix, '', environ['PATH_INFO'])
+            request['parsed_uri'] = urlparse.urlparse(path)
+            request['query'] = dict(paste.request.parse_querystring(environ))
+
+            path = request['parsed_uri'][2]
+            if path == '/' or not path:
+                return self.render(request)
+            elif path == '/verify':
+                return self.do_verify(request)
+            elif path == '/process':
+                return self.do_process(request)
+            else:
+                return self.not_found(request)
+        else:
+            if self.catch_401:
+                return self.catch_401_app_call(environ, start_response)
+            return self.app(environ, start_response)
+
+    def catch_401_app_call(self, environ, start_response):
+        """
+        Call the application, and redirect if the app returns a 401 response
+        """
+        was_401 = []
+        def replacement_start_response(status, headers, exc_info=None):
+            if int(status.split(None, 1)) == 401:
+                # @@: Do I need to append something to go back to where we
+                # came from?
+                was_401.append(1)
+                def dummy_writer(v):
+                    pass
+                return dummy_writer
+            else:
+                return start_response(status, headers, exc_info)
+        app_iter = self.app(environ, replacement_start_response)
+        if was_401:
+            try:
+                list(app_iter)
+            finally:
+                if hasattr(app_iter, 'close'):
+                    app_iter.close()
+            redir_url = paste.request.construct_url(environ, with_path_info=False,
+                                                    with_query_string=False)
+            exc = httpexceptions.HTTPTemporaryRedirect(redir_url)
+            return exc.wsgi_application(environ, start_response)
+        else:
+            return app_iter
+
+    def do_verify(self, request):
+        """Process the form submission, initating OpenID verification.
+        """
+
+        # First, make sure that the user entered something
+        openid_url = request['query'].get('openid_url')
+        if not openid_url:
+            return self.render(request, 'Enter an identity URL to verify.',
+                        css_class='error', form_contents=openid_url)
+
+        oidconsumer = self.oidconsumer
+
+        # Then, ask the library to begin the authorization.
+        # Here we find out the identity server that will verify the
+        # user's identity, and get a token that allows us to
+        # communicate securely with the identity server.
+        status, info = oidconsumer.beginAuth(openid_url)
+
+        # If the URL was unusable (either because of network
+        # conditions, a server error, or that the response returned
+        # was not an OpenID identity page), the library will return
+        # an error code. Let the user know that that URL is unusable.
+        if status in [consumer.HTTP_FAILURE, consumer.PARSE_ERROR]:
+            if status == consumer.HTTP_FAILURE:
+                fmt = 'Failed to retrieve <q>%s</q>'
+            else:
+                fmt = 'Could not find OpenID information in <q>%s</q>'
+
+            message = fmt % (cgi.escape(openid_url),)
+            return self.render(request, message, css_class='error', form_contents=openid_url)
+        elif status == consumer.SUCCESS:
+            # The URL was a valid identity URL. Now we construct a URL
+            # that will get us to process the server response. We will
+            # need the token from the beginAuth call when processing
+            # the response. A cookie or a session object could be used
+            # to accomplish this, but for simplicity here we just add
+            # it as a query parameter of the return-to URL.
+            return_to = self.build_url(request, 'process', token=info.token)
+
+            # Now ask the library for the URL to redirect the user to
+            # his OpenID server. It is required for security that the
+            # return_to URL must be under the specified trust_root. We
+            # just use the base_url for this server as a trust root.
+            redirect_url = oidconsumer.constructRedirect(
+                info, return_to, trust_root=request['base_url'])
+
+            # Send the redirect response
+            return self.redirect(request, redirect_url)
+        else:
+            assert False, 'Not reached'
+
+    def do_process(self, request):
+        """Handle the redirect from the OpenID server.
+        """
+        oidconsumer = self.oidconsumer
+
+        # retrieve the token from the environment (in this case, the URL)
+        token = request['query'].get('token', '')
+
+        # Ask the library to check the response that the server sent
+        # us.  Status is a code indicating the response type. info is
+        # either None or a string containing more information about
+        # the return type.
+        status, info = oidconsumer.completeAuth(token, request['query'])
+
+        css_class = 'error'
+        openid_url = None
+        if status == consumer.FAILURE and info:
+            # In the case of failure, if info is non-None, it is the
+            # URL that we were verifying. We include it in the error
+            # message to help the user figure out what happened.
+            openid_url = info
+            fmt = "Verification of %s failed."
+            message = fmt % (cgi.escape(openid_url),)
+        elif status == consumer.SUCCESS:
+            # Success means that the transaction completed without
+            # error. If info is None, it means that the user cancelled
+            # the verification.
+            css_class = 'alert'
+            if info:
+                # This is a successful verification attempt. If this
+                # was a real application, we would do our login,
+                # comment posting, etc. here.
+                openid_url = info
+                if self.url_to_username:
+                    username = self.url_to_username(request['environ'], openid_url)
+                else:
+                    username = openid_url
+                if 'paste.auth_tkt.set_user' in request['environ']:
+                    request['environ']['paste.auth_tkt.set_user'](username)
+                if not self.login_redirect:
+                    fmt = ("If you had supplied a login redirect path, you would have "
+                           "been redirected there.  "
+                           "You have successfully verified %s as your identity.")
+                    message = fmt % (cgi.escape(openid_url),)
+                else:
+                    # @@: This stuff doesn't make sense to me; why not a remote redirect?
+                    request['environ']['paste.auth.open_id'] = openid_url
+                    request['environ']['PATH_INFO'] = self.login_redirect
+                    return self.app(request['environ'], request['start'])
+                    #exc = httpexceptions.HTTPTemporaryRedirect(self.login_redirect)
+                    #return exc.wsgi_application(request['environ'], request['start'])
+            else:
+                # cancelled
+                message = 'Verification cancelled'
+        else:
+            # Either we don't understand the code or there is no
+            # openid_url included with the error. Give a generic
+            # failure message. The library should supply debug
+            # information in a log.
+            message = 'Verification failed.'
+
+        return self.render(request, message, css_class, openid_url)
+
+    def build_url(self, request, action, **query):
+        """Build a URL relative to the server base_url, with the given
+        query parameters added."""
+        base = urlparse.urljoin(request['base_url'], self.auth_prefix + '/' + action)
+        return appendArgs(base, query)
+
+    def redirect(self, request, redirect_url):
+        """Send a redirect response to the given URL to the browser."""
+        response_headers = [('Content-type', 'text/plain'),
+                            ('Location', redirect_url)]
+        request['start']('302 REDIRECT', response_headers)
+        return ["Redirecting to %s" % redirect_url]
+
+    def not_found(self, request):
+        """Render a page with a 404 return code and a message."""
+        fmt = 'The path <q>%s</q> was not understood by this server.'
+        msg = fmt % (request['parsed_uri'],)
+        openid_url = request['query'].get('openid_url')
+        return self.render(request, msg, 'error', openid_url, status='404 Not Found')
+
+    def render(self, request, message=None, css_class='alert', form_contents=None,
+               status='200 OK', title="Python OpenID Consumer"):
+        """Render a page."""
+        response_headers = [('Content-type', 'text/html')]
+        request['start'](str(status), response_headers)
+
+        self.page_header(request, title)
+        if message:
+            request['body'].append("<div class='%s'>" % (css_class,))
+            request['body'].append(message)
+            request['body'].append("</div>")
+        self.page_footer(request, form_contents)
+        return request['body']
+
+    def page_header(self, request, title):
+        """Render the page header"""
+        request['body'].append('''\
+<html>
+  <head><title>%s</title></head>
+  <style type="text/css">
+      * {
+        font-family: verdana,sans-serif;
+      }
+      body {
+        width: 50em;
+        margin: 1em;
+      }
+      div {
+        padding: .5em;
+      }
+      table {
+        margin: none;
+        padding: none;
+      }
+      .alert {
+        border: 1px solid #e7dc2b;
+        background: #fff888;
+      }
+      .error {
+        border: 1px solid #ff0000;
+        background: #ffaaaa;
+      }
+      #verify-form {
+        border: 1px solid #777777;
+        background: #dddddd;
+        margin-top: 1em;
+        padding-bottom: 0em;
+      }
+  </style>
+  <body>
+    <h1>%s</h1>
+    <p>
+      This example consumer uses the <a
+      href="http://openid.schtuff.com/">Python OpenID</a> library. It
+      just verifies that the URL that you enter is your identity URL.
+    </p>
+''' % (title, title))
+
+    def page_footer(self, request, form_contents):
+        """Render the page footer"""
+        if not form_contents:
+            form_contents = ''
+
+        request['body'].append('''\
+    <div id="verify-form">
+      <form method="get" action=%s>
+        Identity&nbsp;URL:
+        <input type="text" name="openid_url" value=%s />
+        <input type="submit" value="Verify" />
+      </form>
+    </div>
+  </body>
+</html>
+''' % (quoteattr(self.build_url(request, 'verify')), quoteattr(form_contents)))
+
+
+middleware = AuthOpenIDHandler
+
+def make_open_id_middleware(
+    app,
+    global_conf,
+    # Should this default to something, or inherit something from global_conf?:
+    data_store_path,
+    auth_prefix='/oid',
+    login_redirect=None,
+    catch_401=False,
+    url_to_username=None,
+    apply_auth_tkt=False,
+    auth_tkt_logout_path=None):
+    from paste.deploy.converters import asbool
+    from paste.util import import_string
+    catch_401 = asbool(catch_401)
+    if url_to_username and isinstance(url_to_username, basestring):
+        url_to_username = import_string.eval_import(url_to_username)
+    apply_auth_tkt = asbool(apply_auth_tkt)
+    new_app = AuthOpenIDHandler(
+        app, data_store_path=data_store_path, auth_prefix=auth_prefix,
+        login_redirect=login_redirect, catch_401=catch_401,
+        url_to_username=url_to_username or None)
+    if apply_auth_tkt:
+        from paste.auth import auth_tkt
+        new_app = auth_tkt.make_auth_tkt_middleware(
+            new_app, global_conf, logout_path=auth_tkt_logout_path)
+    return new_app
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/auth/__init__.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/auth/__init__.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/auth/__init__.py (revision 3)
@@ -0,0 +1,9 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+"""
+Package for authentication/identification of requests.
+
+The objective of this package is to provide single-focused middleware
+components that implement a particular specification.  Integration of
+the components into a usable system is up to a higher-level framework.
+"""
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/auth/digest.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/auth/digest.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/auth/digest.py (revision 3)
@@ -0,0 +1,209 @@
+# (c) 2005 Clark C. Evans
+# This module is part of the Python Paste Project and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+# This code was written with funding by http://prometheusresearch.com
+"""
+Digest HTTP/1.1 Authentication
+
+This module implements ``Digest`` authentication as described by
+RFC 2617 [1]_ .
+
+Basically, you just put this module before your application, and it
+takes care of requesting and handling authentication requests.  This
+module has been tested with several common browsers "out-in-the-wild".
+
+>>> from paste.wsgilib import dump_environ
+>>> from paste.httpserver import serve
+>>> # from paste.auth.digest import digest_password, AuthDigestHandler
+>>> realm = 'Test Realm'
+>>> def authfunc(environ, realm, username):
+...     return digest_password(realm, username, username)
+>>> serve(AuthDigestHandler(dump_environ, realm, authfunc))
+serving on...
+
+This code has not been audited by a security expert, please use with
+caution (or better yet, report security holes). At this time, this
+implementation does not provide for further challenges, nor does it
+support Authentication-Info header.  It also uses md5, and an option
+to use sha would be a good thing.
+
+.. [1] http://www.faqs.org/rfcs/rfc2617.html
+"""
+from paste.httpexceptions import HTTPUnauthorized
+from paste.httpheaders import *
+import md5, time, random
+
+def digest_password(realm, username, password):
+    """ construct the appropriate hashcode needed for HTTP digest """
+    return md5.md5("%s:%s:%s" % (username, realm, password)).hexdigest()
+
+class AuthDigestAuthenticator(object):
+    """ implementation of RFC 2617 - HTTP Digest Authentication """
+    def __init__(self, realm, authfunc):
+        self.nonce    = {} # list to prevent replay attacks
+        self.authfunc = authfunc
+        self.realm    = realm
+
+    def build_authentication(self, stale = ''):
+        """ builds the authentication error """
+        nonce  = md5.md5(
+            "%s:%s" % (time.time(), random.random())).hexdigest()
+        opaque = md5.md5(
+            "%s:%s" % (time.time(), random.random())).hexdigest()
+        self.nonce[nonce] = None
+        parts = {'realm': self.realm, 'qop': 'auth',
+                 'nonce': nonce, 'opaque': opaque }
+        if stale:
+            parts['stale'] = 'true'
+        head = ", ".join(['%s="%s"' % (k, v) for (k, v) in parts.items()])
+        head = [("WWW-Authenticate", 'Digest %s' % head)]
+        return HTTPUnauthorized(headers=head)
+
+    def compute(self, ha1, username, response, method,
+                      path, nonce, nc, cnonce, qop):
+        """ computes the authentication, raises error if unsuccessful """
+        if not ha1:
+            return self.build_authentication()
+        ha2 = md5.md5('%s:%s' % (method, path)).hexdigest()
+        if qop:
+            chk = "%s:%s:%s:%s:%s:%s" % (ha1, nonce, nc, cnonce, qop, ha2)
+        else:
+            chk = "%s:%s:%s" % (ha1, nonce, ha2)
+        if response != md5.md5(chk).hexdigest():
+            if nonce in self.nonce:
+                del self.nonce[nonce]
+            return self.build_authentication()
+        pnc = self.nonce.get(nonce,'00000000')
+        if nc <= pnc:
+            if nonce in self.nonce:
+                del self.nonce[nonce]
+            return self.build_authentication(stale = True)
+        self.nonce[nonce] = nc
+        return username
+
+    def authenticate(self, environ):
+        """ This function takes a WSGI environment and authenticates
+            the request returning authenticated user or error.
+        """
+        method = REQUEST_METHOD(environ)
+        fullpath = SCRIPT_NAME(environ) + PATH_INFO(environ)
+        authorization = AUTHORIZATION(environ)
+        if not authorization:
+            return self.build_authentication()
+        (authmeth, auth) = authorization.split(" ", 1)
+        if 'digest' != authmeth.lower():
+            return self.build_authentication()
+        amap = {}
+        for itm in auth.split(", "):
+            (k,v) = [s.strip() for s in itm.split("=", 1)]
+            amap[k] = v.replace('"', '')
+        try:
+            username = amap['username']
+            authpath = amap['uri']
+            nonce    = amap['nonce']
+            realm    = amap['realm']
+            response = amap['response']
+            assert authpath.split("?", 1)[0] in fullpath
+            assert realm == self.realm
+            qop      = amap.get('qop', '')
+            cnonce   = amap.get('cnonce', '')
+            nc       = amap.get('nc', '00000000')
+            if qop:
+                assert 'auth' == qop
+                assert nonce and nc
+        except:
+            return self.build_authentication()
+        ha1 = self.authfunc(environ, realm, username)
+        return self.compute(ha1, username, response, method, authpath,
+                            nonce, nc, cnonce, qop)
+
+    __call__ = authenticate
+
+class AuthDigestHandler(object):
+    """
+    middleware for HTTP Digest authentication (RFC 2617)
+
+    This component follows the procedure below:
+
+        0. If the REMOTE_USER environment variable is already populated;
+           then this middleware is a no-op, and the request is passed
+           along to the application.
+
+        1. If the HTTP_AUTHORIZATION header was not provided or specifies
+           an algorithem other than ``digest``, then a HTTPUnauthorized
+           response is generated with the challenge.
+
+        2. If the response is malformed or or if the user's credientials
+           do not pass muster, another HTTPUnauthorized is raised.
+
+        3. If all goes well, and the user's credintials pass; then
+           REMOTE_USER environment variable is filled in and the
+           AUTH_TYPE is listed as 'digest'.
+
+    Parameters:
+
+        ``application``
+
+            The application object is called only upon successful
+            authentication, and can assume ``environ['REMOTE_USER']``
+            is set.  If the ``REMOTE_USER`` is already set, this
+            middleware is simply pass-through.
+
+        ``realm``
+
+            This is a identifier for the authority that is requesting
+            authorization.  It is shown to the user and should be unique
+            within the domain it is being used.
+
+        ``authfunc``
+
+            This is a callback function which performs the actual
+            authentication; the signature of this callback is:
+
+              authfunc(environ, realm, username) -> hashcode
+
+            This module provides a 'digest_password' helper function
+            which can help construct the hashcode; it is recommended
+            that the hashcode is stored in a database, not the user's
+            actual password (since you only need the hashcode).
+    """
+    def __init__(self, application, realm, authfunc):
+        self.authenticate = AuthDigestAuthenticator(realm, authfunc)
+        self.application = application
+
+    def __call__(self, environ, start_response):
+        username = REMOTE_USER(environ)
+        if not username:
+            result = self.authenticate(environ)
+            if isinstance(result, str):
+                AUTH_TYPE.update(environ,'digest')
+                REMOTE_USER.update(environ, result)
+            else:
+                return result.wsgi_application(environ, start_response)
+        return self.application(environ, start_response)
+
+middleware = AuthDigestHandler
+
+__all__ = ['digest_password', 'AuthDigestHandler' ]
+
+def make_digest(app, global_conf, realm, authfunc, **kw):
+    """
+    Grant access via digest authentication
+
+    Config looks like this::
+
+      [filter:grant]
+      use = egg:Paste#auth_digest
+      realm=myrealm
+      authfunc=somepackage.somemodule:somefunction
+      
+    """
+    from paste.util.import_string import eval_import
+    import types
+    authfunc = eval_import(authfunc)
+    assert isinstance(authfunc, types.FunctionType), "authfunc must resolve to a function"
+    return AuthDigestHandler(app, realm, authfunc)
+
+if "__main__" == __name__:
+    import doctest
+    doctest.testmod(optionflags=doctest.ELLIPSIS)
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/auth/basic.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/auth/basic.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/auth/basic.py (revision 3)
@@ -0,0 +1,122 @@
+# (c) 2005 Clark C. Evans
+# This module is part of the Python Paste Project and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+# This code was written with funding by http://prometheusresearch.com
+"""
+Basic HTTP/1.0 Authentication
+
+This module implements ``Basic`` authentication as described in
+HTTP/1.0 specification [1]_ .  Do not use this module unless you
+are using SSL or need to work with very out-dated clients, instead
+use ``digest`` authentication.
+
+>>> from paste.wsgilib import dump_environ
+>>> from paste.httpserver import serve
+>>> # from paste.auth.basic import AuthBasicHandler
+>>> realm = 'Test Realm'
+>>> def authfunc(environ, username, password):
+...     return username == password
+>>> serve(AuthBasicHandler(dump_environ, realm, authfunc))
+serving on...
+
+.. [1] http://www.w3.org/Protocols/HTTP/1.0/draft-ietf-http-spec.html#BasicAA
+"""
+from paste.httpexceptions import HTTPUnauthorized
+from paste.httpheaders import *
+
+class AuthBasicAuthenticator(object):
+    """
+    implements ``Basic`` authentication details
+    """
+    type = 'basic'
+    def __init__(self, realm, authfunc):
+        self.realm = realm
+        self.authfunc = authfunc
+
+    def build_authentication(self):
+        head = WWW_AUTHENTICATE.tuples('Basic realm="%s"' % self.realm)
+        return HTTPUnauthorized(headers=head)
+
+    def authenticate(self, environ):
+        authorization = AUTHORIZATION(environ)
+        if not authorization:
+            return self.build_authentication()
+        (authmeth, auth) = authorization.split(' ', 1)
+        if 'basic' != authmeth.lower():
+            return self.build_authentication()
+        auth = auth.strip().decode('base64')
+        username, password = auth.split(':', 1)
+        if self.authfunc(environ, username, password):
+            return username
+        return self.build_authentication()
+
+    __call__ = authenticate
+
+class AuthBasicHandler(object):
+    """
+    HTTP/1.0 ``Basic`` authentication middleware
+
+    Parameters:
+
+        ``application``
+
+            The application object is called only upon successful
+            authentication, and can assume ``environ['REMOTE_USER']``
+            is set.  If the ``REMOTE_USER`` is already set, this
+            middleware is simply pass-through.
+
+        ``realm``
+
+            This is a identifier for the authority that is requesting
+            authorization.  It is shown to the user and should be unique
+            within the domain it is being used.
+
+        ``authfunc``
+
+            This is a mandatory user-defined function which takes a
+            ``environ``, ``username`` and ``password`` for its first
+            three arguments.  It should return ``True`` if the user is
+            authenticated.
+
+    """
+    def __init__(self, application, realm, authfunc):
+        self.application = application
+        self.authenticate = AuthBasicAuthenticator(realm, authfunc)
+
+    def __call__(self, environ, start_response):
+        username = REMOTE_USER(environ)
+        if not username:
+            result = self.authenticate(environ)
+            if isinstance(result, str):
+                AUTH_TYPE.update(environ, 'basic')
+                REMOTE_USER.update(environ, result)
+            else:
+                return result.wsgi_application(environ, start_response)
+        return self.application(environ, start_response)
+
+middleware = AuthBasicHandler
+
+__all__ = ['AuthBasicHandler']
+
+def make_basic(app, global_conf, realm, authfunc, **kw):
+    """
+    Grant access via basic authentication
+
+    Config looks like this::
+
+      [filter:grant]
+      use = egg:Paste#auth_basic
+      realm=myrealm
+      authfunc=somepackage.somemodule:somefunction
+      
+    """
+    from paste.util.import_string import eval_import
+    import types
+    authfunc = eval_import(authfunc)
+    assert isinstance(authfunc, types.FunctionType), "authfunc must resolve to a function"
+    return AuthBasicHandler(app, realm, authfunc)
+    
+
+if "__main__" == __name__:
+    import doctest
+    doctest.testmod(optionflags=doctest.ELLIPSIS)
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/auth/auth_tkt.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/auth/auth_tkt.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/auth/auth_tkt.py (revision 3)
@@ -0,0 +1,342 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+##########################################################################
+#
+# Copyright (c) 2005 Imaginary Landscape LLC and Contributors.
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+##########################################################################
+"""
+Implementation of cookie signing as done in `mod_auth_tkt
+<http://www.openfusion.com.au/labs/mod_auth_tkt/>`_.
+
+mod_auth_tkt is an Apache module that looks for these signed cookies
+and sets ``REMOTE_USER``, ``REMOTE_USER_TOKENS`` (a comma-separated
+list of groups) and ``REMOTE_USER_DATA`` (arbitrary string data).
+
+This module is an alternative to the ``paste.auth.cookie`` module;
+it's primary benefit is compatibility with mod_auth_tkt, which in turn
+makes it possible to use the same authentication process with
+non-Python code run under Apache.
+"""
+
+import time as time_mod
+import md5
+import Cookie
+from paste import request
+
+class AuthTicket(object):
+
+    """
+    This class represents an authentication token.  You must pass in
+    the shared secret, the userid, and the IP address.  Optionally you
+    can include tokens (a list of strings, representing role names),
+    'user_data', which is arbitrary data available for your own use in
+    later scripts.  Lastly, you can override the cookie name and
+    timestamp.
+
+    Once you provide all the arguments, use .cookie_value() to
+    generate the appropriate authentication ticket.  .cookie()
+    generates a Cookie object, the str() of which is the complete
+    cookie header to be sent.
+
+    CGI usage::
+
+        token = auth_tkt.AuthTick('sharedsecret', 'username',
+            os.environ['REMOTE_ADDR'], tokens=['admin'])
+        print 'Status: 200 OK'
+        print 'Content-type: text/html'
+        print token.cookie()
+        print
+        ... redirect HTML ...
+
+    Webware usage::
+
+        token = auth_tkt.AuthTick('sharedsecret', 'username',
+            self.request().environ()['REMOTE_ADDR'], tokens=['admin'])
+        self.response().setCookie('auth_tkt', token.cookie_value())
+
+    Be careful not to do an HTTP redirect after login; use meta
+    refresh or Javascript -- some browsers have bugs where cookies
+    aren't saved when set on a redirect.
+    """
+
+    def __init__(self, secret, userid, ip, tokens=(), user_data='',
+                 time=None, cookie_name='auth_tkt',
+                 secure=False):
+        self.secret = secret
+        self.userid = userid
+        self.ip = ip
+        self.tokens = ','.join(tokens)
+        self.user_data = user_data
+        if time is None:
+            self.time = time_mod.time()
+        else:
+            self.time = time
+        self.cookie_name = cookie_name
+        self.secure = secure
+
+    def digest(self):
+        return calculate_digest(
+            self.ip, self.time, self.secret, self.userid, self.tokens,
+            self.user_data)
+
+    def cookie_value(self):
+        v = '%s%08x%s!' % (self.digest(), int(self.time), self.userid)
+        if self.tokens:
+            v += self.tokens + '!'
+        v += self.user_data
+        return v
+
+    def cookie(self):
+        c = Cookie.SimpleCookie()
+        c[self.cookie_name] = self.cookie_value().encode('base64').strip().replace('\n', '')
+        c[self.cookie_name]['path'] = '/'
+        if self.secure:
+            c[self.cookie_name]['secure'] = 'true'
+        return c
+
+class BadTicket(Exception):
+    """
+    Exception raised when a ticket can't be parsed.  If we get
+    far enough to determine what the expected digest should have
+    been, expected is set.  This should not be shown by default,
+    but can be useful for debugging.
+    """
+    def __init__(self, msg, expected=None):
+        self.expected = expected
+        Exception.__init__(self, msg)
+
+def parse_ticket(secret, ticket, ip):
+    """
+    Parse the ticket, returning (timestamp, userid, tokens, user_data).
+
+    If the ticket cannot be parsed, ``BadTicket`` will be raised with
+    an explanation.
+    """
+    ticket = ticket.strip('"')
+    digest = ticket[:32]
+    try:
+        timestamp = int(ticket[32:40], 16)
+    except ValueError, e:
+        raise BadTicket('Timestamp is not a hex integer: %s' % e)
+    try:
+        userid, data = ticket[40:].split('!', 1)
+    except ValueError:
+        raise BadTicket('userid is not followed by !')
+    if '!' in data:
+        tokens, user_data = data.split('!', 1)
+    else:
+        # @@: Is this the right order?
+        tokens = ''
+        user_data = data
+    
+    expected = calculate_digest(ip, timestamp, secret,
+                                userid, tokens, user_data)
+
+    if expected != digest:
+        raise BadTicket('Digest signature is not correct',
+                        expected=(expected, digest))
+
+    tokens = tokens.split(',')
+
+    return (timestamp, userid, tokens, user_data)
+    
+def calculate_digest(ip, timestamp, secret, userid, tokens, user_data):
+    secret = maybe_encode(secret)
+    userid = maybe_encode(userid)
+    tokens = maybe_encode(tokens)
+    user_data = maybe_encode(user_data)
+    digest0 = md5.new(
+        encode_ip_timestamp(ip, timestamp) + secret + userid + '\0'
+        + tokens + '\0' + user_data).hexdigest()
+    digest = md5.new(digest0 + secret).hexdigest()
+    return digest
+
+def encode_ip_timestamp(ip, timestamp):
+    ip_chars = ''.join(map(chr, map(int, ip.split('.'))))
+    t = int(timestamp)
+    ts = ((t & 0xff000000) >> 24,
+          (t & 0xff0000) >> 16,
+          (t & 0xff00) >> 8,
+          t & 0xff)
+    ts_chars = ''.join(map(chr, ts))
+    return ip_chars + ts_chars
+
+def maybe_encode(s, encoding='utf8'):
+    if isinstance(s, unicode):
+        s = s.encode(encoding)
+    return s
+
+class AuthTKTMiddleware(object):
+
+    """
+    Middleware that checks for signed cookies that match what
+    `mod_auth_tkt <http://www.openfusion.com.au/labs/mod_auth_tkt/>`_
+    looks for (if you have mod_auth_tkt installed, you don't need this
+    middleware, since Apache will set the environmental variables for
+    you).
+
+    Arguments:
+    
+    ``secret``:
+        A secret that should be shared by any instances of this application.
+        If this app is served from more than one machine, they should all 
+        have the same secret.
+        
+    ``cookie_name``:
+        The name of the cookie to read and write from.  Default ``auth_tkt``.
+        
+    ``secure``:
+        If the cookie should be set as 'secure' (only sent over SSL) and if
+        the login must be over SSL.
+        
+    ``include_ip``:
+        If the cookie should include the user's IP address.  If so, then 
+        if they change IPs their cookie will be invalid.
+        
+    ``logout_path``:
+        The path under this middleware that should signify a logout.  The
+        page will be shown as usual, but the user will also be logged out
+        when they visit this page.
+        
+    If used with mod_auth_tkt, then these settings (except logout_path) should 
+    match the analogous Apache configuration settings.
+
+    This also adds two functions to the request:
+
+    ``environ['paste.auth_tkt.set_user'](userid, tokens='', user_data='')``
+
+        This sets a cookie that logs the user in.  ``tokens`` is a
+        string (comma-separated groups) or a list of strings.
+        ``user_data`` is a string for your own use.
+
+    ``environ['paste.auth_tkt.logout_user']()``
+
+        Logs out the user.
+    """
+
+    def __init__(self, app, secret, cookie_name='auth_tkt', secure=False,
+                 include_ip=True, logout_path=None):
+        self.app = app
+        self.secret = secret
+        self.cookie_name = cookie_name
+        self.secure = secure
+        self.include_ip = include_ip
+        self.logout_path = logout_path
+
+    def __call__(self, environ, start_response):
+        cookies = request.get_cookies(environ)
+        if cookies.has_key(self.cookie_name):
+            cookie_value = cookies[self.cookie_name].value
+        else:
+            cookie_value = ''
+        if cookie_value:
+            if self.include_ip:
+                remote_addr = environ['REMOTE_ADDR']
+            else:
+                # mod_auth_tkt uses this dummy value when IP is not
+                # checked:
+                remote_addr = '0.0.0.0'
+            # @@: This should handle bad signatures better:
+            # Also, timeouts should cause cookie refresh
+            timestamp, userid, tokens, user_data = parse_ticket(
+                self.secret, cookie_value, remote_addr)
+            tokens = ','.join(tokens)
+            environ['REMOTE_USER'] = userid
+            if environ.get('REMOTE_USER_TOKENS'):
+                # We want to add tokens/roles to what's there:
+                tokens = environ['REMOTE_USER_TOKENS'] + ',' + tokens
+            environ['REMOTE_USER_TOKENS'] = tokens
+            environ['REMOTE_USER_DATA'] = user_data
+            environ['AUTH_TYPE'] = 'cookie'
+        set_cookies = []
+        def set_user(userid, tokens='', user_data=''):
+            set_cookies.extend(self.set_user_cookie(
+                environ, userid, tokens, user_data))
+        def logout_user():
+            set_cookies.extend(self.logout_user_cookie(environ))
+        environ['paste.auth_tkt.set_user'] = set_user
+        environ['paste.auth_tkt.logout_user'] = logout_user
+        if self.logout_path and environ.get('PATH_INFO') == self.logout_path:
+            logout_user()
+        def cookie_setting_start_response(status, headers, exc_info=None):
+            headers.extend(set_cookies)
+            return start_response(status, headers, exc_info)
+        return self.app(environ, cookie_setting_start_response)
+
+    def set_user_cookie(self, environ, userid, tokens, user_data):
+        if not isinstance(tokens, basestring):
+            tokens = ','.join(tokens)
+        if self.include_ip:
+            remote_addr = environ['REMOTE_ADDR']
+        else:
+            remote_addr = '0.0.0.0'
+        ticket = AuthTicket(
+            self.secret,
+            userid,
+            remote_addr,
+            tokens=tokens,
+            user_data=user_data,
+            cookie_name=self.cookie_name,
+            secure=self.secure)
+        # @@: Should we set REMOTE_USER etc in the current
+        # environment right now as well?
+        cookies = [
+            ('Set-Cookie', '%s=%s; Path=/' % (
+            self.cookie_name, ticket.cookie_value()))]
+        return cookies
+    
+    def logout_user_cookie(self, environ):
+        cur_domain = environ.get('HTTP_HOST', environ.get('SERVER_NAME'))
+        wild_domain = '.' + cur_domain
+        cookies = [
+            ('Set-Cookie', '%s=""; Path=/' % self.cookie_name),
+            ('Set-Cookie', '%s=""; Path=/; Domain=%s' %
+             (self.cookie_name, cur_domain)),
+            ('Set-Cookie', '%s=""; Path=/; Domain=%s' %
+             (self.cookie_name, wild_domain)),
+            ]
+        return cookies
+
+def make_auth_tkt_middleware(
+    app,
+    global_conf,
+    secret=None,
+    cookie_name='auth_tkt',
+    secure=False,
+    include_ip=True,
+    logout_path=None):
+    """
+    Creates the `AuthTKTMiddleware
+    <class-paste.auth.auth_tkt.AuthTKTMiddleware.html>`_.
+
+    ``secret`` is requird, but can be set globally or locally.
+    """
+    from paste.deploy.converters import asbool
+    secure = asbool(secure)
+    include_ip = asbool(include_ip)
+    if secret is None:
+        secret = global_conf.get('secret')
+    if not secret:
+        raise ValueError(
+            "You must provide a 'secret' (in global or local configuration)")
+    return AuthTKTMiddleware(
+        app, secret, cookie_name, secure, include_ip, logout_path or None)
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/auth/form.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/auth/form.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/auth/form.py (revision 3)
@@ -0,0 +1,149 @@
+# (c) 2005 Clark C. Evans
+# This module is part of the Python Paste Project and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+# This code was written with funding by http://prometheusresearch.com
+"""
+Authentication via HTML Form
+
+This is a very simple HTML form login screen that asks for the username
+and password.  This middleware component requires that an authorization
+function taking the name and passsword and that it be placed in your
+application stack. This class does not include any session management
+code or way to save the user's authorization; however, it is easy enough
+to put ``paste.auth.cookie`` in your application stack.
+
+>>> from paste.wsgilib import dump_environ
+>>> from paste.httpserver import serve
+>>> from paste.auth.cookie import AuthCookieHandler
+>>> from paste.auth.form import AuthFormHandler
+>>> def authfunc(environ, username, password):
+...    return username == password
+>>> serve(AuthCookieHandler(
+...           AuthFormHandler(dump_environ, authfunc)))
+serving on...
+
+"""
+from paste.request import construct_url, parse_formvars
+
+TEMPLATE = """\
+<html>
+  <head><title>Please Login!</title></head>
+  <body>
+    <h1>Please Login</h1>
+    <form action="%s" method="post">
+      <dl>
+        <dt>Username:</dt>
+        <dd><input type="text" name="username"></dd>
+        <dt>Password:</dt>
+        <dd><input type="password" name="password"></dd>
+      </dl>
+      <input type="submit" name="authform" />
+      <hr />
+    </form>
+  </body>
+</html>
+"""
+
+class AuthFormHandler(object):
+    """
+    HTML-based login middleware
+
+    This causes a HTML form to be returned if ``REMOTE_USER`` is
+    not found in the ``environ``.  If the form is returned, the
+    ``username`` and ``password`` combination are given to a
+    user-supplied authentication function, ``authfunc``.  If this
+    is successful, then application processing continues.
+
+    Parameters:
+
+        ``application``
+
+            The application object is called only upon successful
+            authentication, and can assume ``environ['REMOTE_USER']``
+            is set.  If the ``REMOTE_USER`` is already set, this
+            middleware is simply pass-through.
+
+        ``authfunc``
+
+            This is a mandatory user-defined function which takes a
+            ``environ``, ``username`` and ``password`` for its first
+            three arguments.  It should return ``True`` if the user is
+            authenticated.
+
+        ``template``
+
+            This is an optional (a default is provided) HTML
+            fragment that takes exactly one ``%s`` substution
+            argument; which *must* be used for the form's ``action``
+            to ensure that this middleware component does not alter
+            the current path.  The HTML form must use ``POST`` and
+            have two input names:  ``username`` and ``password``.
+
+    Since the authentication form is submitted (via ``POST``)
+    neither the ``PATH_INFO`` nor the ``QUERY_STRING`` are accessed,
+    and hence the current path remains _unaltered_ through the
+    entire authentication process. If authentication succeeds, the
+    ``REQUEST_METHOD`` is converted from a ``POST`` to a ``GET``,
+    so that a redirect is unnecessary (unlike most form auth
+    implementations)
+    """
+
+    def __init__(self, application, authfunc, template=None):
+        self.application = application
+        self.authfunc = authfunc
+        self.template = template or TEMPLATE
+
+    def __call__(self, environ, start_response):
+        username = environ.get('REMOTE_USER','')
+        if username:
+            return self.application(environ, start_response)
+
+        if 'POST' == environ['REQUEST_METHOD']:
+            formvars = parse_formvars(environ, include_get_vars=False)
+            username = formvars.get('username')
+            password = formvars.get('password')
+            if username and password:
+                if self.authfunc(environ, username, password):
+                    environ['AUTH_TYPE'] = 'form'
+                    environ['REMOTE_USER'] = username
+                    environ['REQUEST_METHOD'] = 'GET'
+                    environ['CONTENT_LENGTH'] = ''
+                    environ['CONTENT_TYPE'] = ''
+                    del environ['paste.parsed_formvars']
+                    return self.application(environ, start_response)
+
+        content = self.template % construct_url(environ)
+        start_response("200 OK", [('Content-Type', 'text/html'),
+                                  ('Content-Length', str(len(content)))])
+        return [content]
+
+middleware = AuthFormHandler
+
+__all__ = ['AuthFormHandler']
+
+def make_form(app, global_conf, realm, authfunc, **kw):
+    """
+    Grant access via form authentication
+
+    Config looks like this::
+
+      [filter:grant]
+      use = egg:Paste#auth_form
+      realm=myrealm
+      authfunc=somepackage.somemodule:somefunction
+      
+    """
+    from paste.util.import_string import eval_import
+    import types
+    authfunc = eval_import(authfunc)
+    assert isinstance(authfunc, types.FunctionType), "authfunc must resolve to a function"
+    template = kw.get('template')
+    if template is not None:
+        template = eval_import(template)
+        assert isinstance(template, str), "template must resolve to a string"
+
+    return AuthFormHandler(app, authfunc, template)
+
+if "__main__" == __name__:
+    import doctest
+    doctest.testmod(optionflags=doctest.ELLIPSIS)
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/auth/grantip.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/auth/grantip.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/auth/grantip.py (revision 3)
@@ -0,0 +1,113 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+"""
+Grant roles and logins based on IP address.
+"""
+from paste.util import ip4
+
+class GrantIPMiddleware(object):
+
+    """
+    On each request, ``ip_map`` is checked against ``REMOTE_ADDR``
+    and logins and roles are assigned based on that.
+
+    ``ip_map`` is a map of {ip_mask: (username, roles)}.  Either
+    ``username`` or ``roles`` may be None.  Roles may also be prefixed
+    with ``-``, like ``'-system'`` meaning that role should be
+    revoked.  ``'__remove__'`` for a username will remove the username.
+
+    If ``clobber_username`` is true (default) then any user
+    specification will override the current value of ``REMOTE_USER``.
+    ``'__remove__'`` will always clobber the username.
+
+    ``ip_mask`` is something that `paste.util.ip4:IP4Range
+    <class-paste.util.ip4.IP4Range.html>`_ can parse.  Simple IP
+    addresses, IP/mask, ip<->ip ranges, and hostnames are allowed.
+    """
+
+    def __init__(self, app, ip_map, clobber_username=True):
+        self.app = app
+        self.ip_map = []
+        for key, value in ip_map.items():
+            self.ip_map.append((ip4.IP4Range(key),
+                                self._convert_user_role(value[0], value[1])))
+        self.clobber_username = clobber_username
+
+    def _convert_user_role(self, username, roles):
+        if roles and isinstance(roles, basestring):
+            roles = roles.split(',')
+        return (username, roles)
+        
+    def __call__(self, environ, start_response):
+        addr = ip4.ip2int(environ['REMOTE_ADDR'], False)
+        remove_user = False
+        add_roles = []
+        for range, (username, roles) in self.ip_map:
+            if addr in range:
+                if roles:
+                    add_roles.extend(roles)
+                if username == '__remove__':
+                    remove_user = True
+                elif username:
+                    if (not environ.get('REMOTE_USER')
+                        or self.clobber_username):
+                        environ['REMOTE_USER'] = username
+        if (remove_user and 'REMOTE_USER' in environ):
+            del environ['REMOTE_USER']
+        if roles:
+            self._set_roles(environ, add_roles)
+        return self.app(environ, start_response)
+
+    def _set_roles(self, environ, roles):
+        cur_roles = environ.get('REMOTE_USER_TOKENS', '').split(',')
+        # Get rid of empty roles:
+        cur_roles = filter(None, cur_roles)
+        remove_roles = []
+        for role in roles:
+            if role.startswith('-'):
+                remove_roles.append(role[1:])
+            else:
+                if role not in cur_roles:
+                    cur_roles.append(role)
+        for role in remove_roles:
+            if role in cur_roles:
+                cur_roles.remove(role)
+        environ['REMOTE_USER_TOKENS'] = ','.join(cur_roles)
+        
+                
+def make_grantip(app, global_conf, clobber_username=False, **kw):
+    """
+    Grant roles or usernames based on IP addresses.
+
+    Config looks like this::
+
+      [filter:grant]
+      use = egg:Paste#grantip
+      clobber_username = true
+      # Give localhost system role (no username):
+      127.0.0.1 = -:system
+      # Give everyone in 192.168.0.* editor role:
+      192.168.0.0/24 = -:editor
+      # Give one IP the username joe:
+      192.168.0.7 = joe
+      # And one IP is should not be logged in:
+      192.168.0.10 = __remove__:-editor
+      
+    """
+    from paste.deploy.converters import asbool
+    clobber_username = asbool(clobber_username)
+    ip_map = {}
+    for key, value in kw.items():
+        if ':' in value:
+            username, role = value.split(':', 1)
+        else:
+            username = value
+            role = ''
+        if username == '-':
+            username = ''
+        if role == '-':
+            role = ''
+        ip_map[key] = value
+    return GrantIPMiddleware(app, ip_map, clobber_username)
+    
+    
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/auth/cas.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/auth/cas.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/auth/cas.py (revision 3)
@@ -0,0 +1,99 @@
+# (c) 2005 Clark C. Evans
+# This module is part of the Python Paste Project and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+# This code was written with funding by http://prometheusresearch.com
+"""
+CAS 1.0 Authentication
+
+The Central Authentication System is a straight-forward single sign-on
+mechanism developed by Yale University's ITS department.  It has since
+enjoyed widespread success and is deployed at many major universities
+and some corporations.
+
+    https://clearinghouse.ja-sig.org/wiki/display/CAS/Home
+    http://www.yale.edu/tp/auth/usingcasatyale.html
+
+This implementation has the goal of maintaining current path arguments
+passed to the system so that it can be used as middleware at any stage
+of processing.  It has the secondary goal of allowing for other
+authentication methods to be used concurrently.
+"""
+import urllib
+from paste.request import construct_url
+from paste.httpexceptions import HTTPSeeOther, HTTPForbidden
+
+class CASLoginFailure(HTTPForbidden):
+    """ The exception raised if the authority returns 'no' """
+
+class CASAuthenticate(HTTPSeeOther):
+    """ The exception raised to authenticate the user """
+
+def AuthCASHandler(application, authority):
+    """
+    middleware to implement CAS 1.0 authentication
+
+    There are several possible outcomes:
+
+    0. If the REMOTE_USER environment variable is already populated;
+       then this middleware is a no-op, and the request is passed along
+       to the application.
+
+    1. If a query argument 'ticket' is found, then an attempt to
+       validate said ticket /w the authentication service done.  If the
+       ticket is not validated; an 403 'Forbidden' exception is raised.
+       Otherwise, the REMOTE_USER variable is set with the NetID that
+       was validated and AUTH_TYPE is set to "cas".
+
+    2. Otherwise, a 303 'See Other' is returned to the client directing
+       them to login using the CAS service.  After logon, the service
+       will send them back to this same URL, only with a 'ticket' query
+       argument.
+
+    Parameters:
+
+        ``authority``
+
+            This is a fully-qualified URL to a CAS 1.0 service. The URL
+            should end with a '/' and have the 'login' and 'validate'
+            sub-paths as described in the CAS 1.0 documentation.
+
+    """
+    assert authority.endswith("/") and authority.startswith("http")
+    def cas_application(environ, start_response):
+        username = environ.get('REMOTE_USER','')
+        if username:
+            return application(environ, start_response)
+        qs = environ.get('QUERY_STRING','').split("&")
+        if qs and qs[-1].startswith("ticket="):
+            # assume a response from the authority
+            ticket = qs.pop().split("=", 1)[1]
+            environ['QUERY_STRING'] = "&".join(qs)
+            service = construct_url(environ)
+            args = urllib.urlencode(
+                    {'service': service,'ticket': ticket})
+            requrl = authority + "validate?" + args
+            result = urllib.urlopen(requrl).read().split("\n")
+            if 'yes' == result[0]:
+                environ['REMOTE_USER'] = result[1]
+                environ['AUTH_TYPE'] = 'cas'
+                return application(environ, start_response)
+            exce = CASLoginFailure()
+        else:
+            service = construct_url(environ)
+            args = urllib.urlencode({'service': service})
+            location = authority + "login?" + args
+            exce = CASAuthenticate(location)
+        return exce.wsgi_application(environ, start_response)
+    return cas_application
+
+middleware = AuthCASHandler
+
+__all__ = ['CASLoginFailure', 'CASAuthenticate', 'AuthCASHandler' ]
+
+if '__main__' == __name__:
+    authority = "https://secure.its.yale.edu/cas/servlet/"
+    from paste.wsgilib import dump_environ
+    from paste.httpserver import serve
+    from paste.httpexceptions import *
+    serve(HTTPExceptionHandler(
+             AuthCASHandler(dump_environ, authority)))
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/httpheaders.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/httpheaders.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/httpheaders.py (revision 3)
@@ -0,0 +1,1097 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+# (c) 2005 Ian Bicking, Clark C. Evans and contributors
+# This module is part of the Python Paste Project and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+# Some of this code was funded by: http://prometheusresearch.com
+"""
+HTTP Message Header Fields (see RFC 4229)
+
+This contains general support for HTTP/1.1 message headers [1]_ in a
+manner that supports WSGI ``environ`` [2]_ and ``response_headers``
+[3]_. Specifically, this module defines a ``HTTPHeader`` class whose
+instances correspond to field-name items.  The actual field-content for
+the message-header is stored in the appropriate WSGI collection (either
+the ``environ`` for requests, or ``response_headers`` for responses).
+
+Each ``HTTPHeader`` instance is a callable (defining ``__call__``)
+that takes one of the following:
+
+  - an ``environ`` dictionary, returning the corresponding header
+    value by according to the WSGI's ``HTTP_`` prefix mechanism, e.g.,
+    ``USER_AGENT(environ)`` returns ``environ.get('HTTP_USER_AGENT')``
+
+  - a ``response_headers`` list, giving a comma-delimited string for
+    each corresponding ``header_value`` tuple entries (see below).
+
+  - a sequence of string ``*args`` that are comma-delimited into
+    a single string value: ``CONTENT_TYPE("text/html","text/plain")``
+    returns ``"text/html, text/plain"``
+
+  - a set of ``**kwargs`` keyword arguments that are used to create
+    a header value, in a manner dependent upon the particular header in
+    question (to make value construction easier and error-free):
+    ``CONTENT_DISPOSITION(max_age=CONTENT_DISPOSITION.ONEWEEK)``
+    returns ``"public, max-age=60480"``
+
+Each ``HTTPHeader`` instance also provides several methods to act on
+a WSGI collection, for removing and setting header values.
+
+  ``delete(collection)``
+
+    This method removes all entries of the corresponding header from
+    the given collection (``environ`` or ``response_headers``), e.g.,
+    ``USER_AGENT.remove(environ)`` deletes the 'HTTP_USER_AGENT' entry
+    from the ``environ``.
+
+  ``update(collection, *args, **kwargs)``
+
+    This method does an in-place replacement of the given header entry,
+    for example: ``CONTENT_LENGTH(response_headers,len(body))``
+
+    The first argument is a valid ``environ`` dictionary or
+    ``response_headers`` list; remaining arguments are passed on to
+    ``__call__(*args, **kwargs)`` for value construction.
+
+  ``apply(collection, **kwargs)``
+
+    This method is similar to update, only that it may affect other
+    headers.  For example, according to recommendations in RFC 2616,
+    certain Cache-Control configurations should also set the
+    ``Expires`` header for HTTP/1.0 clients. By default, ``apply()``
+    is simply ``update()`` but limited to keyword arguments.
+
+This particular approach to managing headers within a WSGI collection
+has several advantages:
+
+  1. Typos in the header name are easily detected since they become a
+     ``NameError`` when executed.  The approach of using header strings
+     directly can be problematic; for example, the following should
+     return ``None`` : ``environ.get("HTTP_ACCEPT_LANGUAGES")``
+
+  2. For specific headers with validation, using ``__call__`` will
+     result in an automatic header value check.  For example, the
+     _ContentDisposition header will reject a value having ``maxage``
+     or ``max_age`` (the appropriate parameter is ``max-age`` ).
+
+  3. When appending/replacing headers, the field-name has the suggested
+     RFC capitalization (e.g. ``Content-Type`` or ``ETag``) for
+     user-agents that incorrectly use case-sensitive matches.
+
+  4. Some headers (such as ``Content-Type``) are 0, that is,
+     only one entry of this type may occur in a given set of
+     ``response_headers``.  This module knows about those cases and
+     enforces this cardinality constraint.
+
+  5. The exact details of WSGI header management are abstracted so
+     the programmer need not worry about operational differences
+     between ``environ`` dictionary or ``response_headers`` list.
+
+  6. Sorting of ``HTTPHeaders`` is done following the RFC suggestion
+     that general-headers come first, followed by request and response
+     headers, and finishing with entity-headers.
+
+  7. Special care is given to exceptional cases such as Set-Cookie
+     which violates the RFC's recommendation about combining header
+     content into a single entry using comma separation.
+
+A particular difficulty with HTTP message headers is a categorization
+of sorts as described in section 4.2:
+
+    Multiple message-header fields with the same field-name MAY be
+    present in a message if and only if the entire field-value for
+    that header field is defined as a comma-separated list [i.e.,
+    #(values)]. It MUST be possible to combine the multiple header
+    fields into one "field-name: field-value" pair, without changing
+    the semantics of the message, by appending each subsequent
+    field-value to the first, each separated by a comma.
+
+This creates three fundamentally different kinds of headers:
+
+  - Those that do not have a #(values) production, and hence are
+    singular and may only occur once in a set of response fields;
+    this case is handled by the ``_SingleValueHeader`` subclass.
+
+  - Those which have the #(values) production and follow the
+    combining rule outlined above; our ``_MultiValueHeader`` case.
+
+  - Those which are multi-valued, but cannot be combined (such as the
+    ``Set-Cookie`` header due to its ``Expires`` parameter); or where
+    combining them into a single header entry would cause common
+    user-agents to fail (``WWW-Authenticate``, ``Warning``) since
+    they fail to handle dates even when properly quoted. This case
+    is handled by ``_MultiEntryHeader``.
+
+Since this project does not have time to provide rigorous support
+and validation for all headers, it does a basic construction of
+headers listed in RFC 2616 (plus a few others) so that they can
+be obtained by simply doing ``from paste.httpheaders import *``;
+the name of the header instance is the "common name" less any
+dashes to give CamelCase style names.
+
+.. [1] http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2
+.. [2] http://www.python.org/peps/pep-0333.html#environ-variables
+.. [3] http://www.python.org/peps/pep-0333.html#the-start-response-callable
+
+"""
+import urllib2
+import re
+from mimetypes import guess_type
+from rfc822 import formatdate, parsedate_tz, mktime_tz
+from time import time as now
+from httpexceptions import HTTPBadRequest
+
+__all__ = ['get_header', 'list_headers', 'normalize_headers',
+           'HTTPHeader', 'EnvironVariable' ]
+
+class EnvironVariable(str):
+    """
+    a CGI ``environ`` variable as described by WSGI
+
+    This is a helper object so that standard WSGI ``environ`` variables
+    can be extracted w/o syntax error possibility.
+    """
+    def __call__(self, environ):
+        return environ.get(self,'')
+    def __repr__(self):
+        return '<EnvironVariable %s>' % self
+    def update(self, environ, value):
+        environ[self] = value
+REMOTE_USER    = EnvironVariable("REMOTE_USER")
+REMOTE_SESSION = EnvironVariable("REMOTE_SESSION")
+AUTH_TYPE      = EnvironVariable("AUTH_TYPE")
+REQUEST_METHOD = EnvironVariable("REQUEST_METHOD")
+SCRIPT_NAME    = EnvironVariable("SCRIPT_NAME")
+PATH_INFO      = EnvironVariable("PATH_INFO")
+
+for _name, _obj in globals().items():
+    if isinstance(_obj, EnvironVariable):
+        __all__.append(_name)
+
+_headers = {}
+
+class HTTPHeader(object):
+    """
+    an HTTP header
+
+    HTTPHeader instances represent a particular ``field-name`` of an
+    HTTP message header. They do not hold a field-value, but instead
+    provide operations that work on is corresponding values.  Storage
+    of the actual field values is done with WSGI ``environ`` or
+    ``response_headers`` as appropriate.  Typically, a sub-classes that
+    represent a specific HTTP header, such as _ContentDisposition, are
+    0.  Once constructed the HTTPHeader instances themselves
+    are immutable and stateless.
+
+    For purposes of documentation a "container" refers to either a
+    WSGI ``environ`` dictionary, or a ``response_headers`` list.
+
+    Member variables (and correspondingly constructor arguments).
+
+      ``name``
+
+          the ``field-name`` of the header, in "common form"
+          as presented in RFC 2616; e.g. 'Content-Type'
+
+      ``category``
+
+          one of 'general', 'request', 'response', or 'entity'
+
+      ``version``
+
+          version of HTTP (informational) with which the header should
+          be recognized
+
+      ``sort_order``
+
+          sorting order to be applied before sorting on
+          field-name when ordering headers in a response
+
+    Special Methods:
+
+       ``__call__``
+
+           The primary method of the HTTPHeader instance is to make
+           it a callable, it takes either a collection, a string value,
+           or keyword arguments and attempts to find/construct a valid
+           field-value
+
+       ``__lt__``
+
+           This method is used so that HTTPHeader objects can be
+           sorted in a manner suggested by RFC 2616.
+
+       ``__str__``
+
+           The string-value for instances of this class is
+           the ``field-name``.
+
+    Primary Methods:
+
+       ``delete()``
+
+           remove the all occurrences (if any) of the given
+           header in the collection provided
+
+       ``update()``
+
+           replaces (if they exist) all field-value items
+           in the given collection with the value provided
+
+       ``tuples()``
+
+           returns a set of (field-name, field-value) tuples
+           5 for extending ``response_headers``
+
+    Custom Methods (these may not be implemented):
+
+       ``apply()``
+
+           similar to ``update``, but with two differences; first,
+           only keyword arguments can be used, and second, specific
+           sub-classes may introduce side-effects
+
+       ``parse()``
+
+           converts a string value of the header into a more usable
+           form, such as time in seconds for a date header, etc.
+
+    The collected versions of initialized header instances are immediately
+    registered and accessible through the ``get_header`` function.  Do not
+    inherit from this directly, use one of ``_SingleValueHeader``,
+    ``_MultiValueHeader``, or ``_MultiEntryHeader`` as appropriate.
+    """
+
+    #
+    # Things which can be customized
+    #
+    version = '1.1'
+    category = 'general'
+    reference = ''
+    extensions = {}
+
+    def compose(self, **kwargs):
+        """
+        build header value from keyword arguments
+
+        This method is used to build the corresponding header value when
+        keyword arguments (or no arguments) were provided.  The result
+        should be a sequence of values.  For example, the ``Expires``
+        header takes a keyword argument ``time`` (e.g. time.time()) from
+        which it returns a the corresponding date.
+        """
+        raise NotImplementedError()
+
+    def parse(self, *args, **kwargs):
+        """
+        convert raw header value into more usable form
+
+        This method invokes ``values()`` with the arguments provided,
+        parses the header results, and then returns a header-specific
+        data structure corresponding to the header.  For example, the
+        ``Expires`` header returns seconds (as returned by time.time())
+        """
+        raise NotImplementedError()
+
+    def apply(self, collection, **kwargs):
+        """
+        update the collection /w header value (may have side effects)
+
+        This method is similar to ``update`` only that usage may result
+        in other headers being changed as recommended by the corresponding
+        specification.  The return value is defined by the particular
+        sub-class. For example, the ``_CacheControl.apply()`` sets the
+        ``Expires`` header in addition to its normal behavior.
+        """
+        self.update(collection, **kwargs)
+
+    #
+    # Things which are standardized (mostly)
+    #
+    def __new__(cls, name, category=None, reference=None, version=None):
+        """
+        construct a new ``HTTPHeader`` instance
+
+        We use the ``__new__`` operator to ensure that only one
+        ``HTTPHeader`` instance exists for each field-name, and to
+        register the header so that it can be found/enumerated.
+        """
+        self = get_header(name, raiseError=False)
+        if self:
+            # Allow the registration to happen again, but assert
+            # that everything is identical.
+            assert self.name == name, \
+                "duplicate registration with different capitalization"
+            assert self.category == category, \
+                "duplicate registration with different category"
+            assert cls == self.__class__, \
+                "duplicate registration with different class"
+            return self
+
+        self = object.__new__(cls)
+        self.name = name
+        assert isinstance(self.name, str)
+        self.category = category or self.category
+        self.version  = version or self.version
+        self.reference = reference or self.reference
+        _headers[self.name.lower()] = self
+        self.sort_order = {'general': 1, 'request': 2,
+                           'response': 3, 'entity': 4 }[self.category]
+        self._environ_name = getattr(self, '_environ_name',
+                                'HTTP_'+ self.name.upper().replace("-","_"))
+        self._headers_name = getattr(self, '_headers_name',
+                                 self.name.lower())
+        assert self.version in ('1.1', '1.0', '0.9')
+        return self
+
+    def __str__(self):
+        return self.name
+
+    def __lt__(self, other):
+        """
+        sort header instances as specified by RFC 2616
+
+        Re-define sorting so that general headers are first, followed
+        by request/response headers, and then entity headers.  The
+        list.sort() methods use the less-than operator for this purpose.
+        """
+        if isinstance(other, HTTPHeader):
+            if self.sort_order != other.sort_order:
+                return self.sort_order < other.sort_order
+            return self.name < other.name
+        return False
+
+    def __repr__(self):
+        ref = self.reference and (' (%s)' % self.reference) or ''
+        return '<%s %s%s>' % (self.__class__.__name__, self.name, ref)
+
+    def values(self, *args, **kwargs):
+        """
+        find/construct field-value(s) for the given header
+
+        Resolution is done according to the following arguments:
+
+        - If only keyword arguments are given, then this is equivalent
+          to ``compose(**kwargs)``.
+
+        - If the first (and only) argument is a dict, it is assumed
+          to be a WSGI ``environ`` and the result of the corresponding
+          ``HTTP_`` entry is returned.
+
+        - If the first (and only) argument is a list, it is assumed
+          to be a WSGI ``response_headers`` and the field-value(s)
+          for this header are collected and returned.
+
+        - In all other cases, the arguments are collected, checked that
+          they are string values, possibly verified by the header's
+          logic, and returned.
+
+        At this time it is an error to provide keyword arguments if args
+        is present (this might change).  It is an error to provide both
+        a WSGI object and also string arguments.  If no arguments are
+        provided, then ``compose()`` is called to provide a default
+        value for the header; if there is not default it is an error.
+        """
+        if not args:
+            return self.compose(**kwargs)
+        if list == type(args[0]):
+            assert 1 == len(args)
+            result = []
+            name = self.name.lower()
+            for value in [value for header, value in args[0]
+                         if header.lower() == name]:
+                result.append(value)
+            return result
+        if dict == type(args[0]):
+            assert 1 == len(args) and 'wsgi.version' in args[0]
+            value = args[0].get(self._environ_name)
+            if not value:
+                return ()
+            return (value,)
+        for item in args:
+            assert not type(item) in (dict, list)
+        return args
+
+    def __call__(self, *args, **kwargs):
+        """
+        converts ``values()`` into a string value
+
+        This method converts the results of ``values()`` into a string
+        value for common usage.  By default, it is asserted that only
+        one value exists; if you need to access all values then either
+        call ``values()`` directly, or inherit ``_MultiValueHeader``
+        which overrides this method to return a comma separated list of
+        values as described by section 4.2 of RFC 2616.
+        """
+        values = self.values(*args, **kwargs)
+        assert isinstance(values, (tuple, list))
+        if not values:
+            return ''
+        assert len(values) == 1, "more than one value: %s" % repr(values)
+        return str(values[0]).strip()
+
+    def delete(self, collection):
+        """
+        removes all occurances of the header from the collection provided
+        """
+        if type(collection) == dict:
+            if self._environ_name in collection:
+                del collection[self._environ_name]
+            return self
+        assert list == type(collection)
+        i = 0
+        while i < len(collection):
+            if collection[i][0].lower() == self._headers_name:
+                del collection[i]
+                continue
+            i += 1
+
+    def update(self, collection, *args, **kwargs):
+        """
+        updates the collection with the provided header value
+
+        This method replaces (in-place when possible) all occurrences of
+        the given header with the provided value.  If no value is
+        provided, this is the same as ``remove`` (note that this case
+        can only occur if the target is a collection w/o a corresponding
+        header value). The return value is the new header value (which
+        could be a list for ``_MultiEntryHeader`` instances).
+        """
+        value = self.__call__(*args, **kwargs)
+        if not value:
+            self.remove(collection)
+            return
+        if type(collection) == dict:
+            collection[self._environ_name] = value
+            return
+        assert list == type(collection)
+        i = 0
+        found = False
+        while i < len(collection):
+            if collection[i][0].lower() == self._headers_name:
+                if found:
+                    del collection[i]
+                    continue
+                collection[i] = (self.name, value)
+                found = True
+            i += 1
+        if not found:
+            collection.append((self.name, value))
+
+    def tuples(self, *args, **kwargs):
+        value = self.__call__(*args, **kwargs)
+        if not value:
+            return ()
+        return [(self.name, value)]
+
+class _SingleValueHeader(HTTPHeader):
+    """
+    a ``HTTPHeader`` with exactly a single value
+
+    This is the default behavior of ``HTTPHeader`` where returning a
+    the string-value of headers via ``__call__`` assumes that only
+    a single value exists.
+    """
+    pass
+
+class _MultiValueHeader(HTTPHeader):
+    """
+    a ``HTTPHeader`` with one or more values
+
+    The field-value for these header instances is is allowed to be more
+    than one value; whereby the ``__call__`` method returns a comma
+    separated list as described by section 4.2 of RFC 2616.
+    """
+
+    def __call__(self, *args, **kwargs):
+        results = self.values(*args, **kwargs)
+        if not results:
+            return ''
+        return ", ".join([str(v).strip() for v in results])
+
+    def parse(self, *args, **kwargs):
+        value = self.__call__(*args, **kwargs)
+        values = value.split(',')
+        return [
+            v.strip() for v in values
+            if v.strip()]
+
+class _MultiEntryHeader(HTTPHeader):
+    """
+    a multi-value ``HTTPHeader`` where items cannot be combined with a comma
+
+    This header is multi-valued, but the values should not be combined
+    with a comma since the header is not in compliance with RFC 2616
+    (Set-Cookie due to Expires parameter) or which common user-agents do
+    not behave well when the header values are combined.
+    """
+
+    def update(self, collection, *args, **kwargs):
+        assert list == type(collection), "``environ`` may not be updated"
+        self.delete(collection)
+        collection.extend(self.tuples(*args, **kwargs))
+
+    def tuples(self, *args, **kwargs):
+        values = self.values(*args, **kwargs)
+        if not values:
+            return ()
+        return [(self.name, value.strip()) for value in values]
+
+def get_header(name, raiseError=True):
+    """
+    find the given ``HTTPHeader`` instance
+
+    This function finds the corresponding ``HTTPHeader`` for the
+    ``name`` provided.  So that python-style names can be used,
+    underscores are converted to dashes before the lookup.
+    """
+    retval = _headers.get(str(name).strip().lower().replace("_","-"))
+    if not retval and raiseError:
+        raise AssertionError("'%s' is an unknown header" % name)
+    return retval
+
+def list_headers(general=None, request=None, response=None, entity=None):
+    " list all headers for a given category "
+    if not (general or request or response or entity):
+        general = request = response = entity = True
+    search = []
+    for (bool, strval) in ((general, 'general'), (request, 'request'),
+                           (response, 'response'), (entity, 'entity')):
+        if bool:
+            search.append(strval)
+    return [head for head in _headers.values() if head.category in search]
+
+def normalize_headers(response_headers, strict=True):
+    """
+    sort headers as suggested by  RFC 2616
+
+    This alters the underlying response_headers to use the common
+    name for each header; as well as sorting them with general
+    headers first, followed by request/response headers, then
+    entity headers, and unknown headers last.
+    """
+    category = {}
+    for idx in range(len(response_headers)):
+        (key, val) = response_headers[idx]
+        head = get_header(key, strict)
+        if not head:
+            newhead = '-'.join([x.capitalize() for x in 
+                                key.replace("_","-").split("-")])
+            response_headers[idx] = (newhead, val)
+            category[newhead] = 4
+            continue
+        response_headers[idx] = (str(head), val)
+        category[str(head)] = head.sort_order
+    def compare(a, b):
+        ac = category[a[0]]
+        bc = category[b[0]]
+        if ac == bc:
+            return cmp(a[0], b[0])
+        return cmp(ac, bc)
+    response_headers.sort(compare)
+
+class _DateHeader(_SingleValueHeader):
+    """
+    handle date-based headers
+
+    This extends the ``_SingleValueHeader`` object with specific
+    treatment of time values:
+
+    - It overrides ``compose`` to provide a sole keyword argument
+      ``time`` which is an offset in seconds from the current time.
+
+    - A ``time`` method is provided which parses the given value
+      and returns the current time value.
+    """
+
+    def compose(self, time=None, delta=None):
+        time = time or now()
+        if delta:
+            assert type(delta) == int
+            time += delta
+        return (formatdate(time),)
+
+    def parse(self, *args, **kwargs):
+        """ return the time value (in seconds since 1970) """
+        value = self.__call__(*args, **kwargs)
+        if value:
+            try:
+                return mktime_tz(parsedate_tz(value))
+            except TypeError:
+                raise HTTPBadRequest((
+                    "Received an ill-formed timestamp for %s: %s\r\n") %
+                    (self.name, value))
+
+#
+# Following are specific HTTP headers. Since these classes are mostly
+# singletons, there is no point in keeping the class around once it has
+# been instantiated, so we use the same name.
+#
+
+class _CacheControl(_MultiValueHeader):
+    """
+    Cache-Control, RFC 2616 14.9  (use ``CACHE_CONTROL``)
+
+    This header can be constructed (using keyword arguments), by
+    first specifying one of the following mechanisms:
+
+      ``public``
+
+          if True, this argument specifies that the
+          response, as a whole, may be cashed.
+
+      ``private``
+
+          if True, this argument specifies that the response, as a
+          whole, may be cashed; this implementation does not support
+          the enumeration of private fields
+
+      ``no_cache``
+
+          if True, this argument specifies that the response, as a
+          whole, may not be cashed; this implementation does not
+          support the enumeration of private fields
+
+    In general, only one of the above three may be True, the other 2
+    must then be False or None.  If all three are None, then the cache
+    is assumed to be ``public``.  Following one of these mechanism
+    specifiers are various modifiers:
+
+      ``no_store``
+
+          indicates if content may be stored on disk;
+          otherwise cache is limited to memory (note:
+          users can still save the data, this applies
+          to intermediate caches)
+
+      ``max_age``
+
+          the maximum duration (in seconds) for which
+          the content should be cached; if ``no-cache``
+          is specified, this defaults to 0 seconds
+
+      ``s_maxage``
+
+          the maximum duration (in seconds) for which the
+          content should be allowed in a shared cache.
+
+      ``no_transform``
+
+          specifies that an intermediate cache should
+          not convert the content from one type to
+          another (e.g. transform a BMP to a PNG).
+
+      ``extensions``
+
+          gives additional cache-control extensions,
+          such as items like, community="UCI" (14.9.6)
+
+    The usage of ``apply()`` on this header has side-effects. As
+    recommended by RFC 2616, if ``max_age`` is provided, then then the
+    ``Expires`` header is also calculated for HTTP/1.0 clients and
+    proxies (this is done at the time ``apply()`` is called).  For
+    ``no-cache`` and for ``private`` cases, we either do not want the
+    response cached or do not want any response accidently returned to
+    other users; so to prevent this case, we set the ``Expires`` header
+    to the time of the request, signifying to HTTP/1.0 transports that
+    the content isn't to be cached.  If you are using SSL, your
+    communication is already "private", so to work with HTTP/1.0
+    browsers over SSL, consider specifying your cache as ``public`` as
+    the distinction between public and private is moot.
+    """
+
+    # common values for max-age; "good enough" approximates
+    ONE_HOUR  = 60*60
+    ONE_DAY   = ONE_HOUR * 24
+    ONE_WEEK  = ONE_DAY * 7
+    ONE_MONTH = ONE_DAY * 30
+    ONE_YEAR  = ONE_WEEK * 52
+
+    def _compose(self, public=None, private=None, no_cache=None,
+                 no_store=False, max_age=None, s_maxage=None,
+                 no_transform=False, **extensions):
+        assert isinstance(max_age, (type(None), int))
+        assert isinstance(s_maxage, (type(None), int))
+        expires = 0
+        result = []
+        if private is True:
+            assert not public and not no_cache and not s_maxage
+            result.append('private')
+        elif no_cache is True:
+            assert not public and not private and not max_age
+            result.append('no-cache')
+        else:
+            assert public is None or public is True
+            assert not private and not no_cache
+            expires = max_age
+            result.append('public')
+        if no_store:
+            result.append('no-store')
+        if no_transform:
+            result.append('no-transform')
+        if max_age is not None:
+            result.append('max-age=%d' % max_age)
+        if s_maxage is not None:
+            result.append('s-maxage=%d' % s_maxage)
+        for (k, v) in extensions.items():
+            if k not in self.extensions:
+                raise AssertionError("unexpected extension used: '%s'" % k)
+            result.append('%s="%s"' % (k.replace("_", "-"), v))
+        return (result, expires)
+
+    def compose(self, **kwargs):
+        (result, expires) = self._compose(**kwargs)
+        return result
+
+    def apply(self, collection, **kwargs):
+        """ returns the offset expiration in seconds """
+        (result, expires) = self._compose(**kwargs)
+        if expires is not None:
+            EXPIRES.update(collection, delta=expires)
+        self.update(collection, *result)
+        return expires
+
+_CacheControl('Cache-Control', 'general', 'RFC 2616, 14.9')
+
+class _ContentType(_SingleValueHeader):
+    """
+    Content-Type, RFC 2616 section 14.17
+
+    Unlike other headers, use the CGI variable instead.
+    """
+    version = '1.0'
+    _environ_name = 'CONTENT_TYPE'
+
+    # common mimetype constants
+    UNKNOWN    = 'application/octet-stream'
+    TEXT_PLAIN = 'text/plain'
+    TEXT_HTML  = 'text/html'
+    TEXT_XML   = 'text/xml'
+
+    def compose(self, major=None, minor=None, charset=None):
+        if not major:
+            if minor in ('plain', 'html', 'xml'):
+                major = 'text'
+            else:
+                assert not minor and not charset
+                return (self.UNKNOWN,)
+        if not minor:
+            minor = "*"
+        result = "%s/%s" % (major, minor)
+        if charset:
+            result += "; charset=%s" % charset
+        return (result,)
+
+_ContentType('Content-Type', 'entity', 'RFC 2616, 14.17')
+
+class _ContentLength(_SingleValueHeader):
+    """
+    Content-Length, RFC 2616 section 14.13
+
+    Unlike other headers, use the CGI variable instead.
+    """
+    version = "1.0"
+    _environ_name = 'CONTENT_LENGTH'
+
+_ContentLength('Content-Length', 'entity', 'RFC 2616, 14.13')
+
+class _ContentDisposition(_SingleValueHeader):
+    """
+    Content-Disposition, RFC 2183 (use ``CONTENT_DISPOSITION``)
+
+    This header can be constructed (using keyword arguments),
+    by first specifying one of the following mechanisms:
+
+      ``attachment``
+
+          if True, this specifies that the content should not be
+          shown in the browser and should be handled externally,
+          even if the browser could render the content
+
+      ``inline``
+
+         exclusive with attachment; indicates that the content
+         should be rendered in the browser if possible, but
+         otherwise it should be handled externally
+
+    Only one of the above 2 may be True.  If both are None, then
+    the disposition is assumed to be an ``attachment``. These are
+    distinct fields since support for field enumeration may be
+    added in the future.
+
+      ``filename``
+
+          the filename parameter, if any, to be reported; if
+          this is None, then the current object's filename
+          attribute is used
+
+    The usage of ``apply()`` on this header has side-effects. If
+    filename is provided, and Content-Type is not set or is
+    'application/octet-stream', then the mimetypes.guess is used to
+    upgrade the Content-Type setting.
+    """
+
+    def _compose(self, attachment=None, inline=None, filename=None):
+        result = []
+        if inline is True:
+            assert not attachment
+            result.append('inline')
+        else:
+            assert not inline
+            result.append('attachment')
+        if filename:
+            assert '"' not in filename
+            filename = filename.split("/")[-1]
+            filename = filename.split("\\")[-1]
+            result.append('filename="%s"' % filename)
+        return (("; ".join(result),), filename)
+
+    def compose(self, **kwargs):
+        (result, mimetype) = self._compose(**kwargs)
+        return result
+
+    def apply(self, collection, **kwargs):
+        """ return the new Content-Type side-effect value """
+        (result, filename) = self._compose(**kwargs)
+        mimetype = CONTENT_TYPE(collection)
+        if filename and (not mimetype or CONTENT_TYPE.UNKNOWN == mimetype):
+            mimetype, _ = guess_type(filename)
+            if mimetype and CONTENT_TYPE.UNKNOWN != mimetype:
+                CONTENT_TYPE.update(collection, mimetype)
+        self.update(collection, *result)
+        return mimetype
+
+_ContentDisposition('Content-Disposition', 'entity', 'RFC 2183')
+
+class _IfModifiedSince(_DateHeader):
+    """
+    If-Modified-Since, RFC 2616 section 14.25
+    """
+    version = '1.0'
+
+    def __call__(self, *args, **kwargs):
+        """
+        Split the value on ';' incase the header includes extra attributes. E.g.
+        IE 6 is known to send:
+        If-Modified-Since: Sun, 25 Jun 2006 20:36:35 GMT; length=1506
+        """
+        return _DateHeader.__call__(self, *args, **kwargs).split(';', 1)[0]
+
+    def parse(self, *args, **kwargs):
+        value = _DateHeader.parse(self, *args, **kwargs)
+        if value and value > now():
+            raise HTTPBadRequest((
+              "Please check your system clock.\r\n"
+              "According to this server, the time provided in the\r\n"
+              "%s header is in the future.\r\n") % self.name)
+        return value
+_IfModifiedSince('If-Modified-Since', 'request', 'RFC 2616, 14.25')
+
+class _Range(_MultiValueHeader):
+    """
+    Range, RFC 2616 14.35 (use ``RANGE``)
+
+    According to section 14.16, the response to this message should be a
+    206 Partial Content and that if multiple non-overlapping byte ranges
+    are requested (it is an error to request multiple overlapping
+    ranges) the result should be sent as multipart/byteranges mimetype.
+
+    The server should respond with '416 Requested Range Not Satisfiable'
+    if the requested ranges are out-of-bounds.  The specification also
+    indicates that a syntax error in the Range request should result in
+    the header being ignored rather than a '400 Bad Request'.
+    """
+
+    def parse(self, *args, **kwargs):
+        """
+        Returns a tuple (units, list), where list is a sequence of
+        (begin, end) tuples; and end is None if it was not provided.
+        """
+        value = self.__call__(*args, **kwargs)
+        if not value:
+            return None
+        ranges = []
+        last_end   = -1
+        try:
+            (units, range) = value.split("=", 1)
+            units = units.strip().lower()
+            for item in range.split(","):
+                (begin, end) = item.split("-")
+                if not begin.strip():
+                    begin = 0
+                else:
+                    begin = int(begin)
+                if begin <= last_end:
+                    raise ValueError()
+                if not end.strip():
+                    end = None
+                else:
+                    end = int(end)
+                last_end = end
+                ranges.append((begin, end))
+        except ValueError:
+            # In this case where the Range header is malformed,
+            # section 14.16 says to treat the request as if the
+            # Range header was not present.  How do I log this?
+            return None
+        return (units, ranges)
+_Range('Range', 'request', 'RFC 2616, 14.35')
+
+class _AcceptLanguage(_MultiValueHeader):
+    """
+    Accept-Language, RFC 2616 section 14.4
+    """
+
+    def parse(self, *args, **kwargs):
+        """
+        Return a list of language tags sorted by their "q" values.  For example,
+        "en-us,en;q=0.5" should return ``["en-us", "en"]``.  If there is no
+        ``Accept-Language`` header present, default to ``[]``.
+        """
+        header = self.__call__(*args, **kwargs)
+        if header is None:
+            return []
+        langs = [v for v in header.split(",") if v]
+        qs = []
+        for lang in langs:
+            pieces = lang.split(";")
+            lang, params = pieces[0].strip().lower(), pieces[1:]
+            q = 1
+            for param in params:
+                if '=' not in param:
+                    # Malformed request; probably a bot, we'll ignore
+                    continue
+                lvalue, rvalue = param.split("=")
+                lvalue = lvalue.strip().lower()
+                rvalue = rvalue.strip()
+                if lvalue == "q":
+                    q = float(rvalue)
+            qs.append((lang, q))
+        qs.sort(lambda a, b: -cmp(a[1], b[1]))
+        return [lang for (lang, q) in qs]
+_AcceptLanguage('Accept-Language', 'request', 'RFC 2616, 14.4')
+
+class _AcceptRanges(_MultiValueHeader):
+    """
+    Accept-Ranges, RFC 2616 section 14.5
+    """
+    def compose(self, none=None, bytes=None):
+        if bytes:
+            return ('bytes',)
+        return ('none',)
+_AcceptRanges('Accept-Ranges', 'response', 'RFC 2616, 14.5')
+
+class _ContentRange(_SingleValueHeader):
+    """
+    Content-Range, RFC 2616 section 14.6
+    """
+    def compose(self, first_byte=None, last_byte=None, total_length=None):
+        retval = "bytes %d-%d/%d" % (first_byte, last_byte, total_length)
+        assert last_byte == -1 or first_byte <= last_byte
+        assert last_byte  < total_length
+        return (retval,)
+_ContentRange('Content-Range', 'entity', 'RFC 2616, 14.6')
+
+class _Authorization(_SingleValueHeader):
+    """
+    Authorization, RFC 2617 (RFC 2616, 14.8)
+    """
+    def compose(self, digest=None, basic=None, username=None, password=None,
+                challenge=None, path=None, method=None):
+        assert username and password
+        if basic or not challenge:
+            assert not digest
+            userpass = "%s:%s" % (username.strip(), password.strip())
+            return "Basic %s" % userpass.encode('base64').strip()
+        assert challenge and not basic
+        path = path or "/"
+        (_, realm) = challenge.split('realm="')
+        (realm, _) = realm.split('"', 1)
+        auth = urllib2.AbstractDigestAuthHandler()
+        auth.add_password(realm, path, username, password)
+        (token, challenge) = challenge.split(' ', 1)
+        chal = urllib2.parse_keqv_list(urllib2.parse_http_list(challenge))
+        class FakeRequest(object):
+            def get_full_url(self):
+                return path
+            def has_data(self):
+                return False
+            def get_method(self):
+                return method or "GET"
+            get_selector = get_full_url
+        retval = "Digest %s" % auth.get_authorization(FakeRequest(), chal)
+        return (retval,)
+_Authorization('Authorization', 'request', 'RFC 2617')
+
+#
+# For now, construct a minimalistic version of the field-names; at a
+# later date more complicated headers may sprout content constructors.
+# The items commented out have concrete variants.
+#
+for (name,              category, version, style,      comment) in \
+(("Accept"             ,'request' ,'1.1','multi-value','RFC 2616, 14.1' )
+,("Accept-Charset"     ,'request' ,'1.1','multi-value','RFC 2616, 14.2' )
+,("Accept-Encoding"    ,'request' ,'1.1','multi-value','RFC 2616, 14.3' )
+#,("Accept-Language"    ,'request' ,'1.1','multi-value','RFC 2616, 14.4' )
+#,("Accept-Ranges"      ,'response','1.1','multi-value','RFC 2616, 14.5' )
+,("Age"                ,'response','1.1','singular'   ,'RFC 2616, 14.6' )
+,("Allow"              ,'entity'  ,'1.0','multi-value','RFC 2616, 14.7' )
+#,("Authorization"      ,'request' ,'1.0','singular'   ,'RFC 2616, 14.8' )
+#,("Cache-Control"      ,'general' ,'1.1','multi-value','RFC 2616, 14.9' )
+,("Cookie"             ,'request' ,'1.0','multi-value','RFC 2109/Netscape')
+,("Connection"         ,'general' ,'1.1','multi-value','RFC 2616, 14.10')
+,("Content-Encoding"   ,'entity'  ,'1.0','multi-value','RFC 2616, 14.11')
+#,("Content-Disposition",'entity'  ,'1.1','multi-value','RFC 2616, 15.5' )
+,("Content-Language"   ,'entity'  ,'1.1','multi-value','RFC 2616, 14.12')
+#,("Content-Length"     ,'entity'  ,'1.0','singular'   ,'RFC 2616, 14.13')
+,("Content-Location"   ,'entity'  ,'1.1','singular'   ,'RFC 2616, 14.14')
+,("Content-MD5"        ,'entity'  ,'1.1','singular'   ,'RFC 2616, 14.15')
+#,("Content-Range"      ,'entity'  ,'1.1','singular'   ,'RFC 2616, 14.16')
+#,("Content-Type"       ,'entity'  ,'1.0','singular'   ,'RFC 2616, 14.17')
+,("Date"               ,'general' ,'1.0','date-header','RFC 2616, 14.18')
+,("ETag"               ,'response','1.1','singular'   ,'RFC 2616, 14.19')
+,("Expect"             ,'request' ,'1.1','multi-value','RFC 2616, 14.20')
+,("Expires"            ,'entity'  ,'1.0','date-header','RFC 2616, 14.21')
+,("From"               ,'request' ,'1.0','singular'   ,'RFC 2616, 14.22')
+,("Host"               ,'request' ,'1.1','singular'   ,'RFC 2616, 14.23')
+,("If-Match"           ,'request' ,'1.1','multi-value','RFC 2616, 14.24')
+#,("If-Modified-Since"  ,'request' ,'1.0','date-header','RFC 2616, 14.25')
+,("If-None-Match"      ,'request' ,'1.1','multi-value','RFC 2616, 14.26')
+,("If-Range"           ,'request' ,'1.1','singular'   ,'RFC 2616, 14.27')
+,("If-Unmodified-Since",'request' ,'1.1','date-header' ,'RFC 2616, 14.28')
+,("Last-Modified"      ,'entity'  ,'1.0','date-header','RFC 2616, 14.29')
+,("Location"           ,'response','1.0','singular'   ,'RFC 2616, 14.30')
+,("Max-Forwards"       ,'request' ,'1.1','singular'   ,'RFC 2616, 14.31')
+,("Pragma"             ,'general' ,'1.0','multi-value','RFC 2616, 14.32')
+,("Proxy-Authenticate" ,'response','1.1','multi-value','RFC 2616, 14.33')
+,("Proxy-Authorization",'request' ,'1.1','singular'   ,'RFC 2616, 14.34')
+#,("Range"              ,'request' ,'1.1','multi-value','RFC 2616, 14.35')
+,("Referer"            ,'request' ,'1.0','singular'   ,'RFC 2616, 14.36')
+,("Retry-After"        ,'response','1.1','singular'   ,'RFC 2616, 14.37')
+,("Server"             ,'response','1.0','singular'   ,'RFC 2616, 14.38')
+,("Set-Cookie"         ,'response','1.0','multi-entry','RFC 2109/Netscape')
+,("TE"                 ,'request' ,'1.1','multi-value','RFC 2616, 14.39')
+,("Trailer"            ,'general' ,'1.1','multi-value','RFC 2616, 14.40')
+,("Transfer-Encoding"  ,'general' ,'1.1','multi-value','RFC 2616, 14.41')
+,("Upgrade"            ,'general' ,'1.1','multi-value','RFC 2616, 14.42')
+,("User-Agent"         ,'request' ,'1.0','singular'   ,'RFC 2616, 14.43')
+,("Vary"               ,'response','1.1','multi-value','RFC 2616, 14.44')
+,("Via"                ,'general' ,'1.1','multi-value','RFC 2616, 14.45')
+,("Warning"            ,'general' ,'1.1','multi-entry','RFC 2616, 14.46')
+,("WWW-Authenticate"   ,'response','1.0','multi-entry','RFC 2616, 14.47')):
+    klass = {'multi-value': _MultiValueHeader,
+             'multi-entry': _MultiEntryHeader,
+             'date-header': _DateHeader,
+             'singular'   : _SingleValueHeader}[style]
+    klass(name, category, comment, version).__doc__ = comment
+    del klass
+
+for head in _headers.values():
+    headname = head.name.replace("-","_").upper()
+    locals()[headname] = head
+    __all__.append(headname)
+
+__pudge_all__ = __all__[:]
+for _name, _obj in globals().items():
+    if isinstance(_obj, type) and issubclass(_obj, HTTPHeader):
+        __pudge_all__.append(_name)
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/urlparser.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/urlparser.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/urlparser.py (revision 3)
@@ -0,0 +1,648 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+"""
+WSGI applications that parse the URL and dispatch to on-disk resources
+"""
+
+import os
+import sys
+import imp
+import mimetypes
+try:
+    import pkg_resources
+except ImportError:
+    pkg_resources = None
+from paste import request
+from paste import fileapp
+from paste.util import import_string
+from paste import httpexceptions
+from httpheaders import ETAG
+from paste.util import converters
+
+class NoDefault(object):
+    pass
+
+__all__ = ['URLParser', 'StaticURLParser', 'PkgResourcesParser']
+
+class URLParser(object):
+
+    """
+    WSGI middleware
+
+    Application dispatching, based on URL.  An instance of `URLParser` is
+    an application that loads and delegates to other applications.  It
+    looks for files in its directory that match the first part of
+    PATH_INFO; these may have an extension, but are not required to have
+    one, in which case the available files are searched to find the
+    appropriate file.  If it is ambiguous, a 404 is returned and an error
+    logged.
+
+    By default there is a constructor for .py files that loads the module,
+    and looks for an attribute ``application``, which is a ready
+    application object, or an attribute that matches the module name,
+    which is a factory for building applications, and is called with no
+    arguments.
+
+    URLParser will also look in __init__.py for special overrides.
+    These overrides are:
+
+    ``urlparser_hook(environ)``
+        This can modify the environment.  Its return value is ignored,
+        and it cannot be used to change the response in any way.  You
+        *can* use this, for example, to manipulate SCRIPT_NAME/PATH_INFO
+        (try to keep them consistent with the original URL -- but
+        consuming PATH_INFO and moving that to SCRIPT_NAME is ok).
+
+    ``urlparser_wrap(environ, start_response, app)``:
+        After URLParser finds the application, it calls this function
+        (if present).  If this function doesn't call
+        ``app(environ, start_response)`` then the application won't be
+        called at all!  This can be used to allocate resources (with
+        ``try:finally:``) or otherwise filter the output of the
+        application.
+
+    ``not_found_hook(environ, start_response)``:
+        If no file can be found (*in this directory*) to match the
+        request, then this WSGI application will be called.  You can
+        use this to change the URL and pass the request back to
+        URLParser again, or on to some other application.  This
+        doesn't catch all ``404 Not Found`` responses, just missing
+        files.
+
+    ``application(environ, start_response)``:
+        This basically overrides URLParser completely, and the given
+        application is used for all requests.  ``urlparser_wrap`` and
+        ``urlparser_hook`` are still called, but the filesystem isn't
+        searched in any way.
+    """
+
+    parsers_by_directory = {}
+
+    # This is lazily initialized
+    init_module = NoDefault
+
+    global_constructors = {}
+
+    def __init__(self, global_conf,
+                 directory, base_python_name,
+                 index_names=NoDefault,
+                 hide_extensions=NoDefault,
+                 ignore_extensions=NoDefault,
+                 constructors=None,
+                 **constructor_conf):
+        """
+        Create a URLParser object that looks at `directory`.
+        `base_python_name` is the package that this directory
+        represents, thus any Python modules in this directory will
+        be given names under this package.
+        """
+        if global_conf:
+            import warnings
+            warnings.warn(
+                'The global_conf argument to URLParser is deprecated; '
+                'either pass in None or {}, or use make_url_parser',
+                DeprecationWarning)
+        else:
+            global_conf = {}
+        if os.path.sep != '/':
+            directory = directory.replace(os.path.sep, '/')
+        self.directory = directory
+        self.base_python_name = base_python_name
+        # This logic here should be deprecated since it is in
+        # make_url_parser
+        if index_names is NoDefault:
+            index_names = global_conf.get(
+                'index_names', ('index', 'Index', 'main', 'Main'))
+        self.index_names = converters.aslist(index_names)
+        if hide_extensions is NoDefault:
+            hide_extensions = global_conf.get(
+                'hide_extensions', ('.pyc', '.bak', '.py~', '.pyo'))
+        self.hide_extensions = converters.aslist(hide_extensions)
+        if ignore_extensions is NoDefault:
+            ignore_extensions = global_conf.get(
+                'ignore_extensions', ())
+        self.ignore_extensions = converters.aslist(ignore_extensions)
+        self.constructors = self.global_constructors.copy()
+        if constructors:
+            self.constructors.update(constructors)
+        # @@: Should we also check the global options for constructors?
+        for name, value in constructor_conf.items():
+            if not name.startswith('constructor '):
+                raise ValueError(
+                    "Only extra configuration keys allowed are "
+                    "'constructor .ext = import_expr'; you gave %r "
+                    "(=%r)" % (name, value))
+            ext = name[len('constructor '):].strip()
+            if isinstance(value, (str, unicode)):
+                value = import_string.eval_import(value)
+            self.constructors[ext] = value
+
+    def __call__(self, environ, start_response):
+        environ['paste.urlparser.base_python_name'] = self.base_python_name
+        if self.init_module is NoDefault:
+            self.init_module = self.find_init_module(environ)
+        path_info = environ.get('PATH_INFO', '')
+        if not path_info:
+            return self.add_slash(environ, start_response)
+        if (self.init_module
+            and getattr(self.init_module, 'urlparser_hook', None)):
+            self.init_module.urlparser_hook(environ)
+        orig_path_info = environ['PATH_INFO']
+        orig_script_name = environ['SCRIPT_NAME']
+        application, filename = self.find_application(environ)
+        if not application:
+            if (self.init_module
+                and getattr(self.init_module, 'not_found_hook', None)
+                and environ.get('paste.urlparser.not_found_parser') is not self):
+                not_found_hook = self.init_module.not_found_hook
+                environ['paste.urlparser.not_found_parser'] = self
+                environ['PATH_INFO'] = orig_path_info
+                environ['SCRIPT_NAME'] = orig_script_name
+                return not_found_hook(environ, start_response)
+            if filename is None:
+                name, rest_of_path = request.path_info_split(environ['PATH_INFO'])
+                if not name:
+                    name = 'one of %s' % ', '.join(
+                        self.index_names or
+                        ['(no index_names defined)'])
+
+                return self.not_found(
+                    environ, start_response,
+                    'Tried to load %s from directory %s'
+                    % (name, self.directory))
+            else:
+                environ['wsgi.errors'].write(
+                    'Found resource %s, but could not construct application\n'
+                    % filename)
+                return self.not_found(
+                    environ, start_response,
+                    'Tried to load %s from directory %s'
+                    % (filename, self.directory))
+        if (self.init_module
+            and getattr(self.init_module, 'urlparser_wrap', None)):
+            return self.init_module.urlparser_wrap(
+                environ, start_response, application)
+        else:
+            return application(environ, start_response)
+
+    def find_application(self, environ):
+        if (self.init_module
+            and getattr(self.init_module, 'application', None)
+            and not environ.get('paste.urlparser.init_application') == environ['SCRIPT_NAME']):
+            environ['paste.urlparser.init_application'] = environ['SCRIPT_NAME']
+            return self.init_module.application, None
+        name, rest_of_path = request.path_info_split(environ['PATH_INFO'])
+        environ['PATH_INFO'] = rest_of_path
+        if name is not None:
+            environ['SCRIPT_NAME'] = environ.get('SCRIPT_NAME', '') + '/' + name
+        if not name:
+            names = self.index_names
+            for index_name in names:
+                filename = self.find_file(environ, index_name)
+                if filename:
+                    break
+            else:
+                # None of the index files found
+                filename = None
+        else:
+            filename = self.find_file(environ, name)
+        if filename is None:
+            return None, filename
+        else:
+            return self.get_application(environ, filename), filename
+
+    def not_found(self, environ, start_response, debug_message=None):
+        exc = httpexceptions.HTTPNotFound(
+            'The resource at %s could not be found'
+            % request.construct_url(environ),
+            comment='SCRIPT_NAME=%r; PATH_INFO=%r; looking in %r; debug: %s'
+            % (environ.get('SCRIPT_NAME'), environ.get('PATH_INFO'),
+               self.directory, debug_message or '(none)'))
+        return exc.wsgi_application(environ, start_response)
+
+    def add_slash(self, environ, start_response):
+        """
+        This happens when you try to get to a directory
+        without a trailing /
+        """
+        url = request.construct_url(environ, with_query_string=False)
+        url += '/'
+        if environ.get('QUERY_STRING'):
+            url += '?' + environ['QUERY_STRING']
+        exc = httpexceptions.HTTPMovedPermanently(
+            'The resource has moved to %s - you should be redirected '
+            'automatically.''' % url,
+            headers=[('location', url)])
+        return exc.wsgi_application(environ, start_response)
+
+    def find_file(self, environ, base_filename):
+        possible = []
+        """Cache a few values to reduce function call overhead"""
+        for filename in os.listdir(self.directory):
+            base, ext = os.path.splitext(filename)
+            full_filename = os.path.join(self.directory, filename)
+            if (ext in self.hide_extensions
+                or not base):
+                continue
+            if filename == base_filename:
+                possible.append(full_filename)
+                continue
+            if ext in self.ignore_extensions:
+                continue
+            if base == base_filename:
+                possible.append(full_filename)
+        if not possible:
+            #environ['wsgi.errors'].write(
+            #    'No file found matching %r in %s\n'
+            #    % (base_filename, self.directory))
+            return None
+        if len(possible) > 1:
+            # If there is an exact match, this isn't 'ambiguous'
+            # per se; it might mean foo.gif and foo.gif.back for
+            # instance
+            if full_filename in possible:
+                return full_filename
+            else:
+                environ['wsgi.errors'].write(
+                    'Ambiguous URL: %s; matches files %s\n'
+                    % (request.construct_url(environ),
+                       ', '.join(possible)))
+            return None
+        return possible[0]
+
+    def get_application(self, environ, filename):
+        if os.path.isdir(filename):
+            t = 'dir'
+        else:
+            t = os.path.splitext(filename)[1]
+        constructor = self.constructors.get(t, self.constructors.get('*'))
+        if constructor is None:
+            #environ['wsgi.errors'].write(
+            #    'No constructor found for %s\n' % t)
+            return constructor
+        app = constructor(self, environ, filename)
+        if app is None:
+            #environ['wsgi.errors'].write(
+            #    'Constructor %s return None for %s\n' %
+            #    (constructor, filename))
+            pass
+        return app
+
+    def register_constructor(cls, extension, constructor):
+        """
+        Register a function as a constructor.  Registered constructors
+        apply to all instances of `URLParser`.
+
+        The extension should have a leading ``.``, or the special
+        extensions ``dir`` (for directories) and ``*`` (a catch-all).
+
+        `constructor` must be a callable that takes two arguments:
+        ``environ`` and ``filename``, and returns a WSGI application.
+        """
+        d = cls.global_constructors
+        assert not d.has_key(extension), (
+            "A constructor already exists for the extension %r (%r) "
+            "when attemption to register constructor %r"
+            % (extension, d[extension], constructor))
+        d[extension] = constructor
+    register_constructor = classmethod(register_constructor)
+
+    def get_parser(self, directory, base_python_name):
+        """
+        Get a parser for the given directory, or create one if
+        necessary.  This way parsers can be cached and reused.
+
+        # @@: settings are inherited from the first caller
+        """
+        try:
+            return self.parsers_by_directory[(directory, base_python_name)]
+        except KeyError:
+            parser = self.__class__(
+                {},
+                directory, base_python_name,
+                index_names=self.index_names,
+                hide_extensions=self.hide_extensions,
+                ignore_extensions=self.ignore_extensions,
+                constructors=self.constructors)
+            self.parsers_by_directory[(directory, base_python_name)] = parser
+            return parser
+
+    def find_init_module(self, environ):
+        filename = os.path.join(self.directory, '__init__.py')
+        if not os.path.exists(filename):
+            return None
+        return load_module(environ, filename)
+
+    def __repr__(self):
+        return '<%s directory=%r; module=%s at %s>' % (
+            self.__class__.__name__,
+            self.directory,
+            self.base_python_name,
+            hex(abs(id(self))))
+
+def make_directory(parser, environ, filename):
+    base_python_name = environ['paste.urlparser.base_python_name']
+    if base_python_name:
+        base_python_name += "." + os.path.basename(filename)
+    else:
+        base_python_name = os.path.basename(filename)
+    return parser.get_parser(filename, base_python_name)
+
+URLParser.register_constructor('dir', make_directory)
+
+def make_unknown(parser, environ, filename):
+    return fileapp.FileApp(filename)
+
+URLParser.register_constructor('*', make_unknown)
+
+def load_module(environ, filename):
+    base_python_name = environ['paste.urlparser.base_python_name']
+    module_name = os.path.splitext(os.path.basename(filename))[0]
+    if base_python_name:
+        module_name = base_python_name + '.' + module_name
+    return load_module_from_name(environ, filename, module_name,
+                                 environ['wsgi.errors'])
+
+def load_module_from_name(environ, filename, module_name, errors):
+    if sys.modules.has_key(module_name):
+        return sys.modules[module_name]
+    init_filename = os.path.join(os.path.dirname(filename), '__init__.py')
+    if not os.path.exists(init_filename):
+        try:
+            f = open(init_filename, 'w')
+        except (OSError, IOError), e:
+            errors.write(
+                'Cannot write __init__.py file into directory %s (%s)\n'
+                % (os.path.dirname(filename), e))
+            return None
+        f.write('#\n')
+        f.close()
+    fp = None
+    if sys.modules.has_key(module_name):
+        return sys.modules[module_name]
+    if '.' in module_name:
+        parent_name = '.'.join(module_name.split('.')[:-1])
+        base_name = module_name.split('.')[-1]
+        parent = load_module_from_name(environ, os.path.dirname(filename),
+                                       parent_name, errors)
+    else:
+        base_name = module_name
+    fp = None
+    try:
+        fp, pathname, stuff = imp.find_module(
+            base_name, [os.path.dirname(filename)])
+        module = imp.load_module(module_name, fp, pathname, stuff)
+    finally:
+        if fp is not None:
+            fp.close()
+    return module
+
+def make_py(parser, environ, filename):
+    module = load_module(environ, filename)
+    if not module:
+        return None
+    if hasattr(module, 'application') and module.application:
+        return getattr(module.application, 'wsgi_application', module.application)
+    base_name = module.__name__.split('.')[-1]
+    if hasattr(module, base_name):
+        obj = getattr(module, base_name)
+        if hasattr(obj, 'wsgi_application'):
+            return obj.wsgi_application
+        else:
+            # @@: Old behavior; should probably be deprecated eventually:
+            return getattr(module, base_name)()
+    environ['wsgi.errors'].write(
+        "Cound not find application or %s in %s\n"
+        % (base_name, module))
+    return None
+
+URLParser.register_constructor('.py', make_py)
+
+class StaticURLParser(object):
+    
+    """
+    Like ``URLParser`` but only serves static files.
+
+    ``cache_max_age``:
+      integer specifies Cache-Control max_age in seconds
+    """
+    # @@: Should URLParser subclass from this?
+
+    def __init__(self, directory, root_directory=None,
+                 cache_max_age=None):
+        if os.path.sep != '/':
+            directory = directory.replace(os.path.sep, '/')
+        self.directory = directory
+        self.root_directory = root_directory
+        if root_directory is not None:
+            self.root_directory = os.path.normpath(self.root_directory)
+        else:
+            self.root_directory = directory
+        self.cache_max_age = cache_max_age
+        if os.path.sep != '/':
+            directory = directory.replace('/', os.path.sep)
+            self.root_directory = self.root_directory.replace('/', os.path.sep)
+
+    def __call__(self, environ, start_response):
+        path_info = environ.get('PATH_INFO', '')
+        if not path_info:
+            return self.add_slash(environ, start_response)
+        if path_info == '/':
+            # @@: This should obviously be configurable
+            filename = 'index.html'
+        else:
+            filename = request.path_info_pop(environ)
+        full = os.path.normpath(os.path.join(self.directory, filename))
+        if os.path.sep != '/':
+            full = full.replace('/', os.path.sep)
+        if self.root_directory is not None and not full.startswith(self.root_directory):
+            # Out of bounds
+            return self.not_found(environ, start_response)
+        if not os.path.exists(full):
+            return self.not_found(environ, start_response)
+        if os.path.isdir(full):
+            # @@: Cache?
+            child_root = self.root_directory is not None and \
+                self.root_directory or self.directory
+            return self.__class__(full, root_directory=child_root, 
+                                  cache_max_age=self.cache_max_age)(environ,
+                                                                   start_response)
+        if environ.get('PATH_INFO') and environ.get('PATH_INFO') != '/':
+            return self.error_extra_path(environ, start_response)
+        if_none_match = environ.get('HTTP_IF_NONE_MATCH')
+        if if_none_match:
+            mytime = os.stat(full).st_mtime
+            if str(mytime) == if_none_match:
+                headers = []
+                ETAG.update(headers, mytime)
+                start_response('304 Not Modified', headers)
+                return [''] # empty body
+        
+        fa = self.make_app(full)
+        if self.cache_max_age:
+            fa.cache_control(max_age=self.cache_max_age)
+        return fa(environ, start_response)
+
+    def make_app(self, filename):
+        return fileapp.FileApp(filename)
+
+    def add_slash(self, environ, start_response):
+        """
+        This happens when you try to get to a directory
+        without a trailing /
+        """
+        url = request.construct_url(environ, with_query_string=False)
+        url += '/'
+        if environ.get('QUERY_STRING'):
+            url += '?' + environ['QUERY_STRING']
+        exc = httpexceptions.HTTPMovedPermanently(
+            'The resource has moved to %s - you should be redirected '
+            'automatically.''' % url,
+            headers=[('location', url)])
+        return exc.wsgi_application(environ, start_response)
+        
+    def not_found(self, environ, start_response, debug_message=None):
+        exc = httpexceptions.HTTPNotFound(
+            'The resource at %s could not be found'
+            % request.construct_url(environ),
+            comment='SCRIPT_NAME=%r; PATH_INFO=%r; looking in %r; debug: %s'
+            % (environ.get('SCRIPT_NAME'), environ.get('PATH_INFO'),
+               self.directory, debug_message or '(none)'))
+        return exc.wsgi_application(environ, start_response)
+
+    def error_extra_path(self, environ, start_response):
+        exc = httpexceptions.HTTPNotFound(
+            'The trailing path %r is not allowed' % environ['PATH_INFO'])
+        return exc.wsgi_application(environ, start_response)
+    
+    def __repr__(self):
+        return '<%s %r>' % (self.__class__.__name__, self.directory)
+
+def make_static(global_conf, document_root, cache_max_age=None):
+    """
+    Return a WSGI application that serves a directory (configured
+    with document_root)
+    
+    cache_max_age - integer specifies CACHE_CONTROL max_age in seconds
+    """
+    if cache_max_age is not None:
+        cache_max_age = int(cache_max_age)
+    return StaticURLParser(
+        document_root, cache_max_age=cache_max_age)
+
+class PkgResourcesParser(StaticURLParser):
+
+    def __init__(self, egg_or_spec, resource_name, manager=None, root_resource=None):
+        if pkg_resources is None:
+            raise NotImplementedError("This class requires pkg_resources.")
+        if isinstance(egg_or_spec, (str, unicode)):
+            self.egg = pkg_resources.get_distribution(egg_or_spec)
+        else:
+            self.egg = egg_or_spec
+        self.resource_name = resource_name
+        if manager is None:
+            manager = pkg_resources.ResourceManager()
+        self.manager = manager
+        if root_resource is None:
+            root_resource = resource_name
+        self.root_resource = os.path.normpath(root_resource)
+
+    def __repr__(self):
+        return '<%s for %s:%r>' % (
+            self.__class__.__name__,
+            self.egg.project_name,
+            self.resource_name)
+
+    def __call__(self, environ, start_response):
+        path_info = environ.get('PATH_INFO', '')
+        if not path_info:
+            return self.add_slash(environ, start_response)
+        if path_info == '/':
+            # @@: This should obviously be configurable
+            filename = 'index.html'
+        else:
+            filename = request.path_info_pop(environ)
+        resource = os.path.normpath(self.resource_name + '/' + filename)
+        if self.root_resource is not None and not resource.startswith(self.root_resource):
+            # Out of bounds
+            return self.not_found(environ, start_response)
+        if not self.egg.has_resource(resource):
+            return self.not_found(environ, start_response)
+        if self.egg.resource_isdir(resource):
+            # @@: Cache?
+            child_root = self.root_resource is not None and self.root_resource or \
+                self.resource_name
+            return self.__class__(self.egg, resource, self.manager,
+                                  root_resource=child_root)(environ, start_response)
+        if environ.get('PATH_INFO') and environ.get('PATH_INFO') != '/':
+            return self.error_extra_path(environ, start_response)
+        
+        type, encoding = mimetypes.guess_type(resource)
+        if not type:
+            type = 'application/octet-stream'
+        # @@: I don't know what to do with the encoding.
+        try:
+            file = self.egg.get_resource_stream(self.manager, resource)
+        except (IOError, OSError), e:
+            exc = httpexceptions.HTTPForbidden(
+                'You are not permitted to view this file (%s)' % e)
+            return exc.wsgi_application(environ, start_response)
+        start_response('200 OK',
+                       [('content-type', type)])
+        return fileapp._FileIter(file)
+        
+    def not_found(self, environ, start_response, debug_message=None):
+        exc = httpexceptions.HTTPNotFound(
+            'The resource at %s could not be found'
+            % request.construct_url(environ),
+            comment='SCRIPT_NAME=%r; PATH_INFO=%r; looking in egg:%s#%r; debug: %s'
+            % (environ.get('SCRIPT_NAME'), environ.get('PATH_INFO'),
+               self.egg, self.resource_name, debug_message or '(none)'))
+        return exc.wsgi_application(environ, start_response)
+
+def make_pkg_resources(global_conf, egg, resource_name=''):
+    """
+    A static file parser that loads data from an egg using
+    ``pkg_resources``.  Takes a configuration value ``egg``, which is
+    an egg spec, and a base ``resource_name`` (default empty string)
+    which is the path in the egg that this starts at.
+    """
+    if pkg_resources is None:
+        raise NotImplementedError("This function requires pkg_resources.")
+    return PkgResourcesParser(egg, resource_name)
+
+def make_url_parser(global_conf, directory, base_python_name,
+                    index_names=None, hide_extensions=None,
+                    ignore_extensions=None,
+                    **constructor_conf):
+    """
+    Create a URLParser application that looks in ``directory``, which
+    should be the directory for the Python package named in
+    ``base_python_name``.  ``index_names`` are used when viewing the
+    directory (like ``'index'`` for ``'index.html'``).
+    ``hide_extensions`` are extensions that are not viewable (like
+    ``'.pyc'``) and ``ignore_extensions`` are viewable but only if an
+    explicit extension is given.
+    """
+    if index_names is None:
+        index_names = global_conf.get(
+            'index_names', ('index', 'Index', 'main', 'Main'))
+    index_names = converters.aslist(index_names)
+
+    if hide_extensions is None:
+        hide_extensions = global_conf.get(
+            'hide_extensions', ('.pyc', 'bak', 'py~'))
+    hide_extensions = converters.aslist(hide_extensions)
+    
+    if ignore_extensions is None:
+        ignore_extensions = global_conf.get(
+            'ignore_extensions', ())
+    ignore_extensions = converters.aslist(ignore_extensions)
+    # There's no real way to set constructors currently...
+    
+    return URLParser({}, directory, base_python_name,
+                     index_names=index_names,
+                     hide_extensions=hide_extensions,
+                     ignore_extensions=ignore_extensions,
+                     **constructor_conf)
+
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/fileapp.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/fileapp.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/fileapp.py (revision 3)
@@ -0,0 +1,313 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+# (c) 2005 Ian Bicking, Clark C. Evans and contributors
+# This module is part of the Python Paste Project and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+"""
+This module handles sending static content such as in-memory data or
+files.  At this time it has cache helpers and understands the
+if-modified-since request header.
+"""
+
+import os, time, mimetypes, zipfile, tarfile
+from paste.httpexceptions import *
+from paste.httpheaders import *
+
+CACHE_SIZE = 4096
+BLOCK_SIZE = 4096 * 16
+
+__all__ = ['DataApp', 'FileApp', 'ArchiveStore']
+
+class DataApp(object):
+    """
+    Returns an application that will send content in a single chunk,
+    this application has support for setting cache-control and for
+    responding to conditional (or HEAD) requests.
+
+    Constructor Arguments:
+
+        ``content``     the content being sent to the client
+
+        ``headers``     the headers to send /w the response
+
+        The remaining ``kwargs`` correspond to headers, where the
+        underscore is replaced with a dash.  These values are only
+        added to the headers if they are not already provided; thus,
+        they can be used for default values.  Examples include, but
+        are not limited to:
+
+            ``content_type``
+            ``content_encoding``
+            ``content_location``
+
+    ``cache_control()``
+
+        This method provides validated construction of the ``Cache-Control``
+        header as well as providing for automated filling out of the
+        ``EXPIRES`` header for HTTP/1.0 clients.
+
+    ``set_content()``
+
+        This method provides a mechanism to set the content after the
+        application has been constructed.  This method does things
+        like changing ``Last-Modified`` and ``Content-Length`` headers.
+
+    """
+
+    allowed_methods = ('GET', 'HEAD')
+    
+    def __init__(self, content, headers=None, allowed_methods=None,
+                 **kwargs):
+        assert isinstance(headers, (type(None), list))
+        self.expires = None
+        self.content = None
+        self.content_length = None
+        self.last_modified = 0
+        if allowed_methods is not None:
+            self.allowed_methods = allowed_methods
+        self.headers = headers or []
+        for (k, v) in kwargs.items():
+            header = get_header(k)
+            header.update(self.headers, v)
+        ACCEPT_RANGES.update(self.headers, bytes=True)
+        if not CONTENT_TYPE(self.headers):
+            CONTENT_TYPE.update(self.headers)
+        if content is not None:
+            self.set_content(content)
+
+    def cache_control(self, **kwargs):
+        self.expires = CACHE_CONTROL.apply(self.headers, **kwargs) or None
+        return self
+
+    def set_content(self, content, last_modified=None):
+        assert content is not None
+        if last_modified is None:
+            self.last_modified = time.time()
+        else:
+            self.last_modified = last_modified
+        self.content = content
+        self.content_length = len(content)
+        LAST_MODIFIED.update(self.headers, time=self.last_modified)
+        return self
+
+    def content_disposition(self, **kwargs):
+        CONTENT_DISPOSITION.apply(self.headers, **kwargs)
+        return self
+
+    def __call__(self, environ, start_response):
+        method = environ['REQUEST_METHOD'].upper()
+        if method not in self.allowed_methods:
+            exc = HTTPMethodNotAllowed(
+                'You cannot %s a file' % method,
+                headers=[('Allow', ','.join(self.allowed_methods))])
+            return exc(environ, start_response)
+        return self.get(environ, start_response)
+
+    def calculate_etag(self):
+        return str(self.last_modified) + '-' + str(self.content_length)
+
+    def get(self, environ, start_response):
+        headers = self.headers[:]
+        current_etag = self.calculate_etag()
+        ETAG.update(headers, current_etag)
+        if self.expires is not None:
+            EXPIRES.update(headers, delta=self.expires)
+
+        try:
+            client_etags = IF_NONE_MATCH.parse(environ)
+            if client_etags:
+                for etag in client_etags:
+                    if etag == current_etag or etag == '*':
+                        # horribly inefficient, n^2 performance, yuck!
+                        for head in list_headers(entity=True):
+                            head.delete(headers)
+                        start_response('304 Not Modified', headers)
+                        return ['']
+        except HTTPBadRequest, exce:
+            return exce.wsgi_application(environ, start_response)
+
+        # If we get If-None-Match and If-Modified-Since, and
+        # If-None-Match doesn't match, then we should not try to
+        # figure out If-Modified-Since (which has 1-second granularity
+        # and just isn't as accurate)
+        if not client_etags:
+            try:
+                client_clock = IF_MODIFIED_SINCE.parse(environ)
+                if client_clock >= int(self.last_modified):
+                    # horribly inefficient, n^2 performance, yuck!
+                    for head in list_headers(entity=True):
+                        head.delete(headers)
+                    start_response('304 Not Modified', headers)
+                    return [''] # empty body
+            except HTTPBadRequest, exce:
+                return exce.wsgi_application(environ, start_response)
+
+        (lower, upper) = (0, self.content_length - 1)
+        range = RANGE.parse(environ)
+        if range and 'bytes' == range[0] and 1 == len(range[1]):
+            (lower, upper) = range[1][0]
+            upper = upper or (self.content_length - 1)
+            if upper >= self.content_length or lower > upper:
+                return HTTPRequestRangeNotSatisfiable((
+                  "Range request was made beyond the end of the content,\r\n"
+                  "which is %s long.\r\n  Range: %s\r\n") % (
+                     self.content_length, RANGE(environ))
+                ).wsgi_application(environ, start_response)
+
+        content_length = upper - lower + 1
+        CONTENT_RANGE.update(headers, first_byte=lower, last_byte=upper,
+                            total_length = self.content_length)
+        CONTENT_LENGTH.update(headers, content_length)
+        if content_length == self.content_length:
+            start_response('200 OK', headers)
+        else:
+            start_response('206 Partial Content', headers)
+        if self.content is not None:
+            return [self.content[lower:upper+1]]
+        return (lower, content_length)
+
+class FileApp(DataApp):
+    """
+    Returns an application that will send the file at the given
+    filename.  Adds a mime type based on ``mimetypes.guess_type()``.
+    See DataApp for the arguments beyond ``filename``.
+    """
+
+    def __init__(self, filename, headers=None, **kwargs):
+        self.filename = filename
+        content_type, content_encoding = self.guess_type()
+        if content_type and 'content_type' not in kwargs:
+            kwargs['content_type'] = content_type
+        if content_encoding and 'content_encoding' not in kwargs:
+            kwargs['content_encoding'] = content_encoding
+        DataApp.__init__(self, None, headers, **kwargs)
+
+    def guess_type(self):
+        return mimetypes.guess_type(self.filename)
+
+    def update(self, force=False):
+        stat = os.stat(self.filename)
+        if not force and stat.st_mtime == self.last_modified:
+            return
+        self.last_modified = stat.st_mtime
+        if stat.st_size < CACHE_SIZE:
+            fh = open(self.filename,"rb")
+            self.set_content(fh.read(), stat.st_mtime)
+            fh.close()
+        else:
+            self.content = None
+            self.content_length = stat.st_size
+            # This is updated automatically if self.set_content() is
+            # called
+            LAST_MODIFIED.update(self.headers, time=self.last_modified)
+
+    def get(self, environ, start_response):
+        is_head = environ['REQUEST_METHOD'].upper() == 'HEAD'
+        if 'max-age=0' in CACHE_CONTROL(environ).lower():
+            self.update(force=True) # RFC 2616 13.2.6
+        else:
+            self.update()
+        if not self.content:
+            if not os.path.exists(self.filename):
+                exc = HTTPNotFound(
+                    'The resource does not exist',
+                    comment="No file at %r" % self.filename)
+                return exc(environ, start_response)
+            try:
+                file = open(self.filename, 'rb')
+            except (IOError, OSError), e:
+                exc = HTTPForbidden(
+                    'You are not permitted to view this file (%s)' % e)
+                return exc.wsgi_application(
+                    environ, start_response)
+        retval = DataApp.get(self, environ, start_response)
+        if isinstance(retval, list):
+            # cached content, exception, or not-modified
+            if is_head:
+                return ['']
+            return retval
+        (lower, content_length) = retval
+        if is_head:
+            return ['']
+        file.seek(lower)
+        return _FileIter(file, size=content_length)
+
+class _FileIter(object):
+
+    def __init__(self, file, block_size=None, size=None):
+        self.file = file
+        self.size = size
+        self.block_size = block_size or BLOCK_SIZE
+
+    def __iter__(self):
+        return self
+
+    def next(self):
+        chunk_size = self.block_size
+        if self.size is not None:
+            if chunk_size > self.size:
+                chunk_size = self.size
+            self.size -= chunk_size
+        data = self.file.read(chunk_size)
+        if not data:
+            raise StopIteration
+        return data
+
+    def close(self):
+        self.file.close()
+
+class ArchiveStore(object):
+    """
+    Returns an application that serves up a DataApp for items requested
+    in a given zip or tar archive.
+
+    Constructor Arguments:
+
+        ``filepath``    the path to the archive being served
+
+    ``cache_control()``
+
+        This method provides validated construction of the ``Cache-Control``
+        header as well as providing for automated filling out of the
+        ``EXPIRES`` header for HTTP/1.0 clients.
+    """
+    
+    def __init__(self, filepath):
+        if zipfile.is_zipfile(filepath):
+            self.archive = zipfile.ZipFile(filepath,"r")
+        elif tarfile.is_tarfile(filepath):
+            self.archive = tarfile.TarFileCompat(filepath,"r")
+        else:
+            raise AssertionError("filepath '%s' is not a zip or tar " % filepath)
+        self.expires = None
+        self.last_modified = time.time()
+        self.cache = {}
+
+    def cache_control(self, **kwargs):
+        self.expires = CACHE_CONTROL.apply(self.headers, **kwargs) or None
+        return self
+
+    def __call__(self, environ, start_response):
+        path = environ.get("PATH_INFO","")
+        if path.startswith("/"):
+            path = path[1:]
+        application = self.cache.get(path)
+        if application:
+            return application(environ, start_response)
+        try:
+            info = self.archive.getinfo(path)
+        except KeyError:
+            exc = HTTPNotFound("The file requested, '%s', was not found." % path)
+            return exc.wsgi_application(environ, start_response)
+        if info.filename.endswith("/"):
+            exc = HTTPNotFound("Path requested, '%s', is not a file." % path)
+            return exc.wsgi_application(environ, start_response)
+        content_type, content_encoding = mimetypes.guess_type(info.filename)
+        app = DataApp(None, content_type = content_type, 
+                            content_encoding = content_encoding)
+        app.set_content(self.archive.read(path), 
+                time.mktime(info.date_time + (0,0,0)))
+        self.cache[path] = app
+        app.expires = self.expires
+        return app(environ, start_response)
+
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/gzipper.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/gzipper.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/gzipper.py (revision 3)
@@ -0,0 +1,111 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+
+"""
+WSGI middleware
+
+Gzip-encodes the response.
+"""
+
+import gzip
+from paste.response import header_value, remove_header
+from paste.httpheaders import CONTENT_LENGTH
+
+try:
+    from cStringIO import StringIO
+except ImportError:
+    from StringIO import StringIO
+
+class GzipOutput(object):
+    pass
+
+class middleware(object):
+
+    def __init__(self, application, compress_level=6):
+        self.application = application
+        self.compress_level = int(compress_level)
+
+    def __call__(self, environ, start_response):
+        if 'gzip' not in environ.get('HTTP_ACCEPT_ENCODING', ''):
+            # nothing for us to do, so this middleware will
+            # be a no-op:
+            return self.application(environ, start_response)
+        response = GzipResponse(start_response, self.compress_level)
+        app_iter = self.application(environ,
+                                    response.gzip_start_response)
+        if app_iter:
+            response.finish_response(app_iter)
+
+        return response.write()
+
+class GzipResponse(object):
+
+    def __init__(self, start_response, compress_level):
+        self.start_response = start_response
+        self.compress_level = compress_level
+        self.buffer = StringIO()
+        self.compressible = False
+        self.content_length = None
+
+    def gzip_start_response(self, status, headers, exc_info=None):
+        self.headers = headers
+        ct = header_value(headers,'content-type')
+        ce = header_value(headers,'content-encoding')
+        self.compressible = False
+        if ct and (ct.startswith('text/') or ct.startswith('application/')) \
+            and 'zip' not in ct:
+            self.compressible = True
+        if ce:
+            self.compressible = False
+        if self.compressible:
+            headers.append(('content-encoding', 'gzip'))
+        remove_header(headers, 'content-length')
+        self.headers = headers
+        self.status = status
+        return self.buffer.write
+
+    def write(self):
+        out = self.buffer
+        out.seek(0)
+        s = out.getvalue()
+        out.close()
+        return [s]
+
+    def finish_response(self, app_iter):
+        if self.compressible:
+            output = gzip.GzipFile(mode='wb', compresslevel=self.compress_level,
+                fileobj=self.buffer)
+        else:
+            output = self.buffer
+        try:
+            for s in app_iter:
+                output.write(s)
+            if self.compressible:
+                output.close()
+        finally:
+            if hasattr(app_iter, 'close'):
+                app_iter.close()
+        content_length = self.buffer.tell()
+        CONTENT_LENGTH.update(self.headers, content_length)
+        self.start_response(self.status, self.headers)
+
+def filter_factory(application, **conf):
+    import warnings
+    warnings.warn(
+        'This function is deprecated; use make_gzip_middleware instead',
+        DeprecationWarning, 2)
+    def filter(application):
+        return middleware(application)
+    return filter
+
+def make_gzip_middleware(app, global_conf, compress_level=6):
+    """
+    Wrap the middleware, so that it applies gzipping to a response
+    when it is supported by the browser and the content is of
+    type ``text/*`` or ``application/*``
+    """
+    compress_level = int(compress_level)
+    return middleware(app, compress_level=compress_level)
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/proxy.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/proxy.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/proxy.py (revision 3)
@@ -0,0 +1,266 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+"""
+An application that proxies WSGI requests to a remote server.
+
+TODO:
+
+* Send ``Via`` header?  It's not clear to me this is a Via in the
+  style of a typical proxy.
+
+* Other headers or metadata?  I put in X-Forwarded-For, but that's it.
+
+* Signed data of non-HTTP keys?  This would be for things like
+  REMOTE_USER.
+
+* Something to indicate what the original URL was?  The original host,
+  scheme, and base path.
+
+* Rewriting ``Location`` headers?  mod_proxy does this.
+
+* Rewriting body?  (Probably not on this one -- that can be done with
+  a different middleware that wraps this middleware)
+
+* Example::  
+    
+    use = egg:Paste#proxy
+    address = http://server3:8680/exist/rest/db/orgs/sch/config/
+    allowed_request_methods = GET
+  
+"""
+
+import httplib
+import urlparse
+import urllib
+
+from paste import httpexceptions
+from paste.util.converters import aslist
+
+# Remove these headers from response (specify lower case header
+# names):
+filtered_headers = (     
+    'transfer-encoding',    
+)
+
+class Proxy(object):
+
+    def __init__(self, address, allowed_request_methods=(),
+                 suppress_http_headers=()):
+        self.address = address
+        self.parsed = urlparse.urlsplit(address)
+        self.scheme = self.parsed[0].lower()
+        self.host = self.parsed[1]
+        self.path = self.parsed[2]
+        self.allowed_request_methods = [
+            x.lower() for x in allowed_request_methods if x]
+        
+        self.suppress_http_headers = [
+            x.lower() for x in suppress_http_headers if x]
+
+    def __call__(self, environ, start_response):
+        if (self.allowed_request_methods and 
+            environ['REQUEST_METHOD'].lower() not in self.allowed_request_methods):
+            return httpexceptions.HTTPBadRequest("Disallowed")(environ, start_response)
+
+        if self.scheme == 'http':
+            ConnClass = httplib.HTTPConnection
+        elif self.scheme == 'https':
+            ConnClass = httplib.HTTPSConnection
+        else:
+            raise ValueError(
+                "Unknown scheme for %r: %r" % (self.address, self.scheme))
+        conn = ConnClass(self.host)
+        headers = {}
+        for key, value in environ.items():
+            if key.startswith('HTTP_'):
+                key = key[5:].lower().replace('_', '-')
+                if key == 'host' or key in self.suppress_http_headers:
+                    continue
+                headers[key] = value
+        headers['host'] = self.host
+        if 'REMOTE_ADDR' in environ:
+            headers['x-forwarded-for'] = environ['REMOTE_ADDR']
+        if environ.get('CONTENT_TYPE'):
+            headers['content-type'] = environ['CONTENT_TYPE']
+        if environ.get('CONTENT_LENGTH'):
+            length = int(environ['CONTENT_LENGTH'])
+            body = environ['wsgi.input'].read(length)
+        else:
+            body = ''
+            
+        path_info = urllib.quote(environ['PATH_INFO'])
+        if self.path:            
+            request_path = path_info
+            if request_path[0] == '/':
+                request_path = request_path[1:]
+                
+            path = urlparse.urljoin(self.path, request_path)
+        else:
+            path = path_info
+            
+        conn.request(environ['REQUEST_METHOD'],
+                     path,
+                     body, headers)
+        res = conn.getresponse()
+        headers_out = parse_headers(res.msg)
+        
+        status = '%s %s' % (res.status, res.reason)
+        start_response(status, headers_out)
+        # @@: Default?
+        length = res.getheader('content-length')
+        if length is not None:
+            body = res.read(int(length))
+        else:
+            body = res.read()
+        conn.close()
+        return [body]
+
+def make_proxy(global_conf, address, allowed_request_methods="",
+               suppress_http_headers=""):
+    """
+    Make a WSGI application that proxies to another address:
+    
+    ``address``
+        the full URL ending with a trailing ``/``
+        
+    ``allowed_request_methods``:
+        a space seperated list of request methods (e.g., ``GET POST``)
+        
+    ``suppress_http_headers``
+        a space seperated list of http headers (lower case, without
+        the leading ``http_``) that should not be passed on to target
+        host
+    """
+    allowed_request_methods = aslist(allowed_request_methods)
+    suppress_http_headers = aslist(suppress_http_headers)
+    return Proxy(
+        address,
+        allowed_request_methods=allowed_request_methods,
+        suppress_http_headers=suppress_http_headers)
+
+
+class TransparentProxy(object):
+
+    """
+    A proxy that sends the request just as it was given, including
+    respecting HTTP_HOST, wsgi.url_scheme, etc.
+
+    This is a way of translating WSGI requests directly to real HTTP
+    requests.  All information goes in the environment; modify it to
+    modify the way the request is made.
+
+    If you specify ``force_host`` (and optionally ``force_scheme``)
+    then HTTP_HOST won't be used to determine where to connect to;
+    instead a specific host will be connected to, but the ``Host``
+    header in the request will remain intact.
+    """
+
+    def __init__(self, force_host=None,
+                 force_scheme='http'):
+        self.force_host = force_host
+        self.force_scheme = force_scheme
+
+    def __repr__(self):
+        return '<%s %s force_host=%r force_scheme=%r>' % (
+            self.__class__.__name__,
+            hex(id(self)),
+            self.force_host, self.force_scheme)
+
+    def __call__(self, environ, start_response):
+        scheme = environ['wsgi.url_scheme']
+        if self.force_host is None:
+            conn_scheme = scheme
+        else:
+            conn_scheme = self.force_scheme
+        if conn_scheme == 'http':
+            ConnClass = httplib.HTTPConnection
+        elif conn_scheme == 'https':
+            ConnClass = httplib.HTTPSConnection
+        else:
+            raise ValueError(
+                "Unknown scheme %r" % scheme)
+        if 'HTTP_HOST' not in environ:
+            raise ValueError(
+                "WSGI environ must contain an HTTP_HOST key")
+        host = environ['HTTP_HOST']
+        if self.force_host is None:
+            conn_host = host
+        else:
+            conn_host = self.force_host
+        conn = ConnClass(conn_host)
+        headers = {}
+        for key, value in environ.items():
+            if key.startswith('HTTP_'):
+                key = key[5:].lower().replace('_', '-')
+                headers[key] = value
+        headers['host'] = host
+        if 'REMOTE_ADDR' in environ and 'HTTP_X_FORWARDED_FOR' not in environ:
+            headers['x-forwarded-for'] = environ['REMOTE_ADDR']
+        if environ.get('CONTENT_TYPE'):
+            headers['content-type'] = environ['CONTENT_TYPE']
+        if environ.get('CONTENT_LENGTH'):
+            length = int(environ['CONTENT_LENGTH'])
+            body = environ['wsgi.input'].read(length)
+        elif 'CONTENT_LENGTH' not in environ:
+            body = ''
+            length = 0
+        else:
+            body = ''
+            length = 0
+        
+        path = (environ.get('SCRIPT_NAME', '')
+                + environ.get('PATH_INFO', ''))
+        path = urllib.quote(path)
+        if 'QUERY_STRING' in environ:
+            path += '?' + environ['QUERY_STRING']
+        conn.request(environ['REQUEST_METHOD'],
+                     path, body, headers)
+        res = conn.getresponse()
+        headers_out = parse_headers(res.msg)
+                
+        status = '%s %s' % (res.status, res.reason)
+        start_response(status, headers_out)
+        # @@: Default?
+        length = res.getheader('content-length')
+        if length is not None:
+            body = res.read(int(length))
+        else:
+            body = res.read()
+        conn.close()
+        return [body]
+
+def parse_headers(message):
+    """
+    Turn a Message object into a list of WSGI-style headers.
+    """
+    headers_out = []        
+    for full_header in message.headers:
+        if not full_header:            
+            # Shouldn't happen, but we'll just ignore
+            continue                     
+        if full_header[0].isspace():
+            # Continuation line, add to the last header
+            if not headers_out:                        
+                raise ValueError(
+                    "First header starts with a space (%r)" % full_header)
+            last_header, last_value = headers_out.pop()                   
+            value = last_value + ' ' + full_header.strip()
+            headers_out.append((last_header, value))      
+            continue                                
+        try:        
+            header, value = full_header.split(':', 1)
+        except:                                      
+            raise ValueError("Invalid header: %r" % full_header)
+        value = value.strip()                                   
+        if header.lower() not in filtered_headers:
+            headers_out.append((header, value))   
+    return headers_out
+
+def make_transparent_proxy(
+    global_conf, force_host=None, force_scheme='http'):
+    """
+    Create a proxy that connects to a specific host, but does
+    absolutely no other filtering, including the Host header.
+    """
+    return TransparentProxy(force_host=force_host,
+                            force_scheme=force_scheme)
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/cascade.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/cascade.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/cascade.py (revision 3)
@@ -0,0 +1,124 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+
+"""
+Cascades through several applications, so long as applications
+return ``404 Not Found``.
+"""
+from paste import httpexceptions
+from paste.util import converters
+import tempfile
+from cStringIO import StringIO
+
+__all__ = ['Cascade']
+
+def make_cascade(loader, global_conf, catch='404', **local_conf):
+    """
+    Expects configuration like:
+
+    [composit:cascade]
+    use = egg:Paste#cascade
+    # all start with 'app' and are sorted alphabetically
+    app1 = foo
+    app2 = bar
+    ...
+    catch = 404 500 ...
+    """
+    catch = map(int, converters.aslist(catch))
+    apps = []
+    for name, value in local_conf.items():
+        if not name.startswith('app'):
+            raise ValueError(
+                "Bad configuration key %r (=%r); all configuration keys "
+                "must start with 'app'"
+                % (name, value))
+        app = loader.get_app(value, global_conf=global_conf)
+        apps.append((name, app))
+    apps.sort()
+    apps = [app for name, app in apps]
+    return Cascade(apps, catch=catch)
+    
+class Cascade(object):
+
+    """
+    Passed a list of applications, ``Cascade`` will try each of them
+    in turn.  If one returns a status code listed in ``catch`` (by
+    default just ``404 Not Found``) then the next application is
+    tried.
+
+    If all applications fail, then the last application's failure
+    response is used.
+    """
+
+    def __init__(self, applications, catch=(404,)):
+        self.apps = applications
+        self.catch_codes = {}
+        self.catch_exceptions = []
+        for error in catch:
+            if isinstance(error, str):
+                error = int(error.split(None, 1)[0])
+            if isinstance(error, httpexceptions.HTTPException):
+                exc = error
+                code = error.code
+            else:
+                exc = httpexceptions.get_exception(error)
+                code = error
+            self.catch_codes[code] = exc
+            self.catch_exceptions.append(exc)
+        self.catch_exceptions = tuple(self.catch_exceptions)
+                
+    def __call__(self, environ, start_response):
+        failed = []
+        def repl_start_response(status, headers, exc_info=None):
+            code = int(status.split(None, 1)[0])
+            if code in self.catch_codes:
+                failed.append(None)
+                return _consuming_writer
+            return start_response(status, headers, exc_info)
+
+        try:
+            length = int(environ.get('CONTENT_LENGTH', 0) or 0)
+        except ValueError:
+            length = 0
+        if length > 0:
+            # We have to copy wsgi.input
+            copy_wsgi_input = True
+            if length > 4096 or length < 0:
+                f = tempfile.TemporaryFile()
+                if length < 0:
+                    f.write(environ['wsgi.input'].read())
+                else:
+                    copy_len = length
+                    while copy_len > 0:
+                        chunk = environ['wsgi.input'].read(min(copy_len, 4096))
+                        f.write(chunk)
+                        copy_len -= len(chunk)
+                f.seek(0)
+            else:
+                f = StringIO(environ['wsgi.input'].read(length))
+            environ['wsgi.input'] = f
+        else:
+            copy_wsgi_input = False
+        for app in self.apps[:-1]:
+            environ_copy = environ.copy()
+            if copy_wsgi_input:
+                environ_copy['wsgi.input'].seek(0)
+            failed = []
+            try:
+                v = app(environ_copy, repl_start_response)
+                if not failed:
+                    return v
+                else:
+                    if hasattr(v, 'close'):
+                        # Exhaust the iterator first:
+                        list(v)
+                        # then close:
+                        v.close()
+            except self.catch_exceptions, e:
+                pass
+        if copy_wsgi_input:
+            environ['wsgi.input'].seek(0)
+        return self.apps[-1](environ, start_response)
+
+def _consuming_writer(s):
+    pass
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/pony.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/pony.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/pony.py (revision 3)
@@ -0,0 +1,57 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+"""
+We have a pony and/or a unicorn.
+"""
+from paste.request import construct_url
+
+PONY = """
+eJyFkkFuxCAMRfdzCisbJxK2D5D2JpbMrlI3XXQZDt9PCG0ySgcWIMT79rcN0XClUJlZRB9jVmci
+FmV19khjgRFl0RzrKmqzvY8lRUWFlXvCrD7UbAQR/17NUvGhypAF9og16vWtkC8DzUayS6pN3/dR
+ki0OnpzKjUBFpmlC7zVFRNL1rwoq6PWXXQSnIm9WoTzlM2//ke21o5g/l1ckRhiPbkDZXsKIR7l1
+36hF9uMhnRiVjI8UgYjlsIKCrXXpcA9iX5y7zMmtG0fUpW61Ssttipf6cp3WARfkMVoYFryi2a+w
+o/2dhW0OXfcMTnmh53oR9egzPs+qkpY9IKxdUVRP5wHO7UDAuI6moA2N+/z4vtc2k8B+AIBimVU=
+"""
+
+UNICORN = """
+eJyVVD1vhDAM3e9XeAtIxB5P6qlDx0OMXVBzSpZOHdsxP762E0JAnMgZ8Zn37OePAPC60eV1Dl5b
+SS7fB6DmQNGhtegpNlPIQS8HmkYGdSqNqDF9wcMYus4TuBYGsZwIPqXfEoNir5K+R3mbzhlR4JMW
+eGpikPpn9wHl2sDgEH1270guZwzKDRf3nTztMvfI5r3fJqEmNxdCyISBcWjNgjPG8Egg2hgT3mJi
+KBwNvmPB1hbWJ3TwBfMlqdTzxNyDE2H8zOD5HA4KkqJGPVY/TwnxmPA82kdSJNj7zs+R0d1pB+JO
+xn2DKgsdxAfFS2pfTSD0Fb6Uzv7dCQSvE5JmZQEQ90vNjBU1GPuGQpCPS8cGo+dQgjIKqxnJTXbw
+ucFzPFVIJXtzk6BXKGPnYsKzvFmGx7A0j6Zqvlvk5rETXbMWTGWj0RFc8QNPYVfhJfMMniCPazWJ
+lGtPZecIGJWW6oL2hpbWRZEkChe8eg5Wb7xx/MBZBFjxeZPEss+mRQ3Uhc8WQv684seSRO7i3nb4
+7HlKUg8sraz47LmXyh8S0somADvoUpoHjGWl+rUkF0H+EIf/gbyyMg58BBk6L634/fkHUCodMw==
+"""
+
+
+class PonyMiddleware(object):
+
+    def __init__(self, application):
+        self.application = application
+
+    def __call__(self, environ, start_response):
+        path_info = environ.get('PATH_INFO', '')
+        if path_info == '/pony':
+            url = construct_url(environ, with_query_string=False)
+            if 'horn' in environ.get('QUERY_STRING', ''):
+                data = UNICORN
+                link = 'remove horn!'
+            else:
+                data = PONY
+                url += '?horn'
+                link = 'add horn!'
+            msg = data.decode('base64').decode('zlib')
+            msg = '<pre>%s\n<a href="%s">%s</a></pre>' % (
+                msg, url, link)
+            start_response('200 OK', [('content-type', 'text/html')])
+            return [msg]
+        else:
+            return self.application(environ, start_response)
+
+def make_pony(app, global_conf):
+    """
+    Adds pony power to any application, at /pony
+    """
+    return PonyMiddleware(app)
+
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/fixture.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/fixture.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/fixture.py (revision 3)
@@ -0,0 +1,1710 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+"""
+Routines for testing WSGI applications.
+
+Most interesting is the `TestApp <class-paste.fixture.TestApp.html>`_
+for testing WSGI applications, and the `TestFileEnvironment
+<class-paste.fixture.TestFileEnvironment.html>`_ class for testing the
+effects of command-line scripts.
+"""
+
+import sys
+import random
+import urllib
+import urlparse
+import mimetypes
+import time
+import cgi
+import os
+import shutil
+import webbrowser
+import smtplib
+import shlex
+from Cookie import BaseCookie
+try:
+    from cStringIO import StringIO
+except ImportError:
+    from StringIO import StringIO
+import re
+try:
+    import subprocess
+except ImportError:
+    from paste.util import subprocess24 as subprocess
+
+from paste import wsgilib
+from paste import lint
+from paste.response import HeaderDict
+
+def tempnam_no_warning(*args):
+    """
+    An os.tempnam with the warning turned off, because sometimes
+    you just need to use this and don't care about the stupid
+    security warning.
+    """
+    return os.tempnam(*args)
+
+class NoDefault(object):
+    pass
+
+def sorted(l):
+    l = list(l)
+    l.sort()
+    return l
+
+class Dummy_smtplib(object):
+
+    existing = None
+
+    def __init__(self, server):
+        import warnings
+        warnings.warn(
+            'Dummy_smtplib is not maintained and is deprecated',
+            DeprecationWarning, 2)
+        assert not self.existing, (
+            "smtplib.SMTP() called again before Dummy_smtplib.existing.reset() "
+            "called.")
+        self.server = server
+        self.open = True
+        self.__class__.existing = self
+
+    def quit(self):
+        assert self.open, (
+            "Called %s.quit() twice" % self)
+        self.open = False
+
+    def sendmail(self, from_address, to_addresses, msg):
+        self.from_address = from_address
+        self.to_addresses = to_addresses
+        self.message = msg
+
+    def install(cls):
+        smtplib.SMTP = cls
+
+    install = classmethod(install)
+
+    def reset(self):
+        assert not self.open, (
+            "SMTP connection not quit")
+        self.__class__.existing = None
+
+class AppError(Exception):
+    pass
+
+class TestApp(object):
+
+    # for py.test
+    disabled = True
+
+    def __init__(self, app, namespace=None, relative_to=None,
+                 extra_environ=None, pre_request_hook=None,
+                 post_request_hook=None):
+        """
+        Wraps a WSGI application in a more convenient interface for
+        testing.
+
+        ``app`` may be an application, or a Paste Deploy app
+        URI, like ``'config:filename.ini#test'``.
+
+        ``namespace`` is a dictionary that will be written to (if
+        provided).  This can be used with doctest or some other
+        system, and the variable ``res`` will be assigned everytime
+        you make a request (instead of returning the request).
+
+        ``relative_to`` is a directory, and filenames used for file
+        uploads are calculated relative to this.  Also ``config:``
+        URIs that aren't absolute.
+
+        ``extra_environ`` is a dictionary of values that should go
+        into the environment for each request.  These can provide a
+        communication channel with the application.
+
+        ``pre_request_hook`` is a function to be called prior to
+        making requests (such as ``post`` or ``get``). This function
+        must take one argument (the instance of the TestApp).
+
+        ``post_request_hook`` is a function, similar to
+        ``pre_request_hook``, to be called after requests are made.
+        """
+        if isinstance(app, (str, unicode)):
+            from paste.deploy import loadapp
+            # @@: Should pick up relative_to from calling module's
+            # __file__
+            app = loadapp(app, relative_to=relative_to)
+        self.app = app
+        self.namespace = namespace
+        self.relative_to = relative_to
+        if extra_environ is None:
+            extra_environ = {}
+        self.extra_environ = extra_environ
+        self.pre_request_hook = pre_request_hook
+        self.post_request_hook = post_request_hook
+        self.reset()
+
+    def reset(self):
+        """
+        Resets the state of the application; currently just clears
+        saved cookies.
+        """
+        self.cookies = {}
+
+    def _make_environ(self):
+        environ = self.extra_environ.copy()
+        environ['paste.throw_errors'] = True
+        return environ
+
+    def get(self, url, params=None, headers=None, extra_environ=None,
+            status=None, expect_errors=False):
+        """
+        Get the given url (well, actually a path like
+        ``'/page.html'``).
+
+        ``params``:
+            A query string, or a dictionary that will be encoded
+            into a query string.  You may also include a query
+            string on the ``url``.
+
+        ``headers``:
+            A dictionary of extra headers to send.
+
+        ``extra_environ``:
+            A dictionary of environmental variables that should
+            be added to the request.
+
+        ``status``:
+            The integer status code you expect (if not 200 or 3xx).
+            If you expect a 404 response, for instance, you must give
+            ``status=404`` or it will be an error.  You can also give
+            a wildcard, like ``'3*'`` or ``'*'``.
+
+        ``expect_errors``:
+            If this is not true, then if anything is written to
+            ``wsgi.errors`` it will be an error.  If it is true, then
+            non-200/3xx responses are also okay.
+
+        Returns a `response object
+        <class-paste.fixture.TestResponse.html>`_
+        """
+        if extra_environ is None:
+            extra_environ = {}
+        # Hide from py.test:
+        __tracebackhide__ = True
+        if params:
+            if not isinstance(params, (str, unicode)):
+                params = urllib.urlencode(params, doseq=True)
+            if '?' in url:
+                url += '&'
+            else:
+                url += '?'
+            url += params
+        environ = self._make_environ()
+        url = str(url)
+        if '?' in url:
+            url, environ['QUERY_STRING'] = url.split('?', 1)
+        else:
+            environ['QUERY_STRING'] = ''
+        self._set_headers(headers, environ)
+        environ.update(extra_environ)
+        req = TestRequest(url, environ, expect_errors)
+        return self.do_request(req, status=status)
+
+    def _gen_request(self, method, url, params='', headers=None, extra_environ=None,
+             status=None, upload_files=None, expect_errors=False):
+        """
+        Do a generic request.  
+        """
+        if headers is None:
+            headers = {}
+        if extra_environ is None:
+            extra_environ = {}
+        environ = self._make_environ()
+        # @@: Should this be all non-strings?
+        if isinstance(params, (list, tuple, dict)):
+            params = urllib.urlencode(params)
+        if upload_files:
+            params = cgi.parse_qsl(params, keep_blank_values=True)
+            content_type, params = self.encode_multipart(
+                params, upload_files)
+            environ['CONTENT_TYPE'] = content_type
+        elif params:
+            environ.setdefault('CONTENT_TYPE', 'application/x-www-form-urlencoded')
+        if '?' in url:
+            url, environ['QUERY_STRING'] = url.split('?', 1)
+        else:
+            environ['QUERY_STRING'] = ''
+        environ['CONTENT_LENGTH'] = str(len(params))
+        environ['REQUEST_METHOD'] = method
+        environ['wsgi.input'] = StringIO(params)
+        self._set_headers(headers, environ)
+        environ.update(extra_environ)
+        req = TestRequest(url, environ, expect_errors)
+        return self.do_request(req, status=status)
+
+    def post(self, url, params='', headers=None, extra_environ=None,
+             status=None, upload_files=None, expect_errors=False):
+        """
+        Do a POST request.  Very like the ``.get()`` method.
+        ``params`` are put in the body of the request.
+
+        ``upload_files`` is for file uploads.  It should be a list of
+        ``[(fieldname, filename, file_content)]``.  You can also use
+        just ``[(fieldname, filename)]`` and the file content will be
+        read from disk.
+
+        Returns a `response object
+        <class-paste.fixture.TestResponse.html>`_
+        """
+        return self._gen_request('POST', url, params=params, headers=headers,
+                                 extra_environ=extra_environ,status=status,
+                                 upload_files=upload_files,
+                                 expect_errors=expect_errors)
+
+    def put(self, url, params='', headers=None, extra_environ=None,
+             status=None, upload_files=None, expect_errors=False):
+        """
+        Do a PUT request.  Very like the ``.get()`` method.
+        ``params`` are put in the body of the request.
+
+        ``upload_files`` is for file uploads.  It should be a list of
+        ``[(fieldname, filename, file_content)]``.  You can also use
+        just ``[(fieldname, filename)]`` and the file content will be
+        read from disk.
+
+        Returns a `response object
+        <class-paste.fixture.TestResponse.html>`_
+        """
+        return self._gen_request('PUT', url, params=params, headers=headers,
+                                 extra_environ=extra_environ,status=status,
+                                 upload_files=upload_files,
+                                 expect_errors=expect_errors)
+
+    def delete(self, url, params='', headers=None, extra_environ=None,
+               status=None, expect_errors=False):
+        """
+        Do a DELETE request.  Very like the ``.get()`` method.
+        ``params`` are put in the body of the request.
+
+        Returns a `response object
+        <class-paste.fixture.TestResponse.html>`_
+        """
+        return self._gen_request('DELETE', url, params=params, headers=headers,
+                                 extra_environ=extra_environ,status=status,
+                                 upload_files=None, expect_errors=expect_errors)
+
+    
+
+
+    def _set_headers(self, headers, environ):
+        """
+        Turn any headers into environ variables
+        """
+        if not headers:
+            return
+        for header, value in headers.items():
+            if header.lower() == 'content-type':
+                var = 'CONTENT_TYPE'
+            elif header.lower() == 'content-length':
+                var = 'CONTENT_LENGTH'
+            else:
+                var = 'HTTP_%s' % header.replace('-', '_').upper()
+            environ[var] = value
+
+    def encode_multipart(self, params, files):
+        """
+        Encodes a set of parameters (typically a name/value list) and
+        a set of files (a list of (name, filename, file_body)) into a
+        typical POST body, returning the (content_type, body).
+        """
+        boundary = '----------a_BoUnDaRy%s$' % random.random()
+        lines = []
+        for key, value in params:
+            lines.append('--'+boundary)
+            lines.append('Content-Disposition: form-data; name="%s"' % key)
+            lines.append('')
+            lines.append(value)
+        for file_info in files:
+            key, filename, value = self._get_file_info(file_info)
+            lines.append('--'+boundary)
+            lines.append('Content-Disposition: form-data; name="%s"; filename="%s"'
+                         % (key, filename))
+            fcontent = mimetypes.guess_type(filename)[0]
+            lines.append('Content-Type: %s' %
+                         fcontent or 'application/octet-stream')
+            lines.append('')
+            lines.append(value)
+        lines.append('--' + boundary + '--')
+        lines.append('')
+        body = '\r\n'.join(lines)
+        content_type = 'multipart/form-data; boundary=%s' % boundary
+        return content_type, body
+
+    def _get_file_info(self, file_info):
+        if len(file_info) == 2:
+            # It only has a filename
+            filename = file_info[1]
+            if self.relative_to:
+                filename = os.path.join(self.relative_to, filename)
+            f = open(filename, 'rb')
+            content = f.read()
+            f.close()
+            return (file_info[0], filename, content)
+        elif len(file_info) == 3:
+            return file_info
+        else:
+            raise ValueError(
+                "upload_files need to be a list of tuples of (fieldname, "
+                "filename, filecontent) or (fieldname, filename); "
+                "you gave: %r"
+                % repr(file_info)[:100])
+
+    def do_request(self, req, status):
+        """
+        Executes the given request (``req``), with the expected
+        ``status``.  Generally ``.get()`` and ``.post()`` are used
+        instead.
+        """
+        if self.pre_request_hook:
+            self.pre_request_hook(self)
+        __tracebackhide__ = True
+        if self.cookies:
+            c = BaseCookie()
+            for name, value in self.cookies.items():
+                c[name] = value
+            req.environ['HTTP_COOKIE'] = str(c).split(': ', 1)[1]
+        req.environ['paste.testing'] = True
+        req.environ['paste.testing_variables'] = {}
+        app = lint.middleware(self.app)
+        old_stdout = sys.stdout
+        out = CaptureStdout(old_stdout)
+        try:
+            sys.stdout = out
+            start_time = time.time()
+            raise_on_wsgi_error = not req.expect_errors
+            raw_res = wsgilib.raw_interactive(
+                app, req.url,
+                raise_on_wsgi_error=raise_on_wsgi_error,
+                **req.environ)
+            end_time = time.time()
+        finally:
+            sys.stdout = old_stdout
+            sys.stderr.write(out.getvalue())
+        res = self._make_response(raw_res, end_time - start_time)
+        res.request = req
+        for name, value in req.environ['paste.testing_variables'].items():
+            if hasattr(res, name):
+                raise ValueError(
+                    "paste.testing_variables contains the variable %r, but "
+                    "the response object already has an attribute by that "
+                    "name" % name)
+            setattr(res, name, value)
+        if self.namespace is not None:
+            self.namespace['res'] = res
+        if not req.expect_errors:
+            self._check_status(status, res)
+            self._check_errors(res)
+        res.cookies_set = {}
+        for header in res.all_headers('set-cookie'):
+            c = BaseCookie(header)
+            for key, morsel in c.items():
+                self.cookies[key] = morsel.value
+                res.cookies_set[key] = morsel.value
+        if self.post_request_hook:
+            self.post_request_hook(self)
+        if self.namespace is None:
+            # It's annoying to return the response in doctests, as it'll
+            # be printed, so we only return it is we couldn't assign
+            # it anywhere
+            return res
+
+    def _check_status(self, status, res):
+        __tracebackhide__ = True
+        if status == '*':
+            return
+        if isinstance(status, (list, tuple)):
+            if res.status not in status:
+                raise AppError(
+                    "Bad response: %s (not one of %s for %s)\n%s"
+                    % (res.full_status, ', '.join(map(str, status)),
+                       res.request.url, res.body))
+            return
+        if status is None:
+            if res.status >= 200 and res.status < 400:
+                return
+            raise AppError(
+                "Bad response: %s (not 200 OK or 3xx redirect for %s)\n%s"
+                % (res.full_status, res.request.url,
+                   res.body))
+        if status != res.status:
+            raise AppError(
+                "Bad response: %s (not %s)" % (res.full_status, status))
+
+    def _check_errors(self, res):
+        if res.errors:
+            raise AppError(
+                "Application had errors logged:\n%s" % res.errors)
+
+    def _make_response(self, (status, headers, body, errors), total_time):
+        return TestResponse(self, status, headers, body, errors,
+                            total_time)
+
+class CaptureStdout(object):
+
+    def __init__(self, actual):
+        self.captured = StringIO()
+        self.actual = actual
+
+    def write(self, s):
+        self.captured.write(s)
+        self.actual.write(s)
+
+    def flush(self):
+        self.actual.flush()
+
+    def writelines(self, lines):
+        for item in lines:
+            self.write(item)
+
+    def getvalue(self):
+        return self.captured.getvalue()
+
+class TestResponse(object):
+
+    # for py.test
+    disabled = True
+
+    """
+    Instances of this class are return by `TestApp
+    <class-paste.fixture.TestApp.html>`_
+    """
+
+    def __init__(self, test_app, status, headers, body, errors,
+                 total_time):
+        self.test_app = test_app
+        self.status = int(status.split()[0])
+        self.full_status = status
+        self.headers = headers
+        self.header_dict = HeaderDict.fromlist(self.headers)
+        self.body = body
+        self.errors = errors
+        self._normal_body = None
+        self.time = total_time
+        self._forms_indexed = None
+
+    def forms__get(self):
+        """
+        Returns a dictionary of ``Form`` objects.  Indexes are both in
+        order (from zero) and by form id (if the form is given an id).
+        """
+        if self._forms_indexed is None:
+            self._parse_forms()
+        return self._forms_indexed
+
+    forms = property(forms__get,
+                     doc="""
+                     A list of <form>s found on the page (instances of
+                     `Form <class-paste.fixture.Form.html>`_)
+                     """)
+
+    def form__get(self):
+        forms = self.forms
+        if not forms:
+            raise TypeError(
+                "You used response.form, but no forms exist")
+        if 1 in forms:
+            # There is more than one form
+            raise TypeError(
+                "You used response.form, but more than one form exists")
+        return forms[0]
+
+    form = property(form__get,
+                    doc="""
+                    Returns a single `Form
+                    <class-paste.fixture.Form.html>`_ instance; it
+                    is an error if there are multiple forms on the
+                    page.
+                    """)
+
+    _tag_re = re.compile(r'<(/?)([:a-z0-9_\-]*)(.*?)>', re.S|re.I)
+
+    def _parse_forms(self):
+        forms = self._forms_indexed = {}
+        form_texts = []
+        started = None
+        for match in self._tag_re.finditer(self.body):
+            end = match.group(1) == '/'
+            tag = match.group(2).lower()
+            if tag != 'form':
+                continue
+            if end:
+                assert started, (
+                    "</form> unexpected at %s" % match.start())
+                form_texts.append(self.body[started:match.end()])
+                started = None
+            else:
+                assert not started, (
+                    "Nested form tags at %s" % match.start())
+                started = match.start()
+        assert not started, (
+            "Danging form: %r" % self.body[started:])
+        for i, text in enumerate(form_texts):
+            form = Form(self, text)
+            forms[i] = form
+            if form.id:
+                forms[form.id] = form
+
+    def header(self, name, default=NoDefault):
+        """
+        Returns the named header; an error if there is not exactly one
+        matching header (unless you give a default -- always an error
+        if there is more than one header)
+        """
+        found = None
+        for cur_name, value in self.headers:
+            if cur_name.lower() == name.lower():
+                assert not found, (
+                    "Ambiguous header: %s matches %r and %r"
+                    % (name, found, value))
+                found = value
+        if found is None:
+            if default is NoDefault:
+                raise KeyError(
+                    "No header found: %r (from %s)"
+                    % (name, ', '.join([n for n, v in self.headers])))
+            else:
+                return default
+        return found
+
+    def all_headers(self, name):
+        """
+        Gets all headers by the ``name``, returns as a list
+        """
+        found = []
+        for cur_name, value in self.headers:
+            if cur_name.lower() == name.lower():
+                found.append(value)
+        return found
+
+    def follow(self, **kw):
+        """
+        If this request is a redirect, follow that redirect.  It
+        is an error if this is not a redirect response.  Returns
+        another response object.
+        """
+        assert self.status >= 300 and self.status < 400, (
+            "You can only follow redirect responses (not %s)"
+            % self.full_status)
+        location = self.header('location')
+        type, rest = urllib.splittype(location)
+        host, path = urllib.splithost(rest)
+        # @@: We should test that it's not a remote redirect
+        return self.test_app.get(location, **kw)
+
+    def click(self, description=None, linkid=None, href=None,
+              anchor=None, index=None, verbose=False):
+        """
+        Click the link as described.  Each of ``description``,
+        ``linkid``, and ``url`` are *patterns*, meaning that they are
+        either strings (regular expressions), compiled regular
+        expressions (objects with a ``search`` method), or callables
+        returning true or false.
+
+        All the given patterns are ANDed together:
+
+        * ``description`` is a pattern that matches the contents of the
+          anchor (HTML and all -- everything between ``<a...>`` and
+          ``</a>``)
+
+        * ``linkid`` is a pattern that matches the ``id`` attribute of
+          the anchor.  It will receive the empty string if no id is
+          given.
+
+        * ``href`` is a pattern that matches the ``href`` of the anchor;
+          the literal content of that attribute, not the fully qualified
+          attribute.
+
+        * ``anchor`` is a pattern that matches the entire anchor, with
+          its contents.
+
+        If more than one link matches, then the ``index`` link is
+        followed.  If ``index`` is not given and more than one link
+        matches, or if no link matches, then ``IndexError`` will be
+        raised.
+
+        If you give ``verbose`` then messages will be printed about
+        each link, and why it does or doesn't match.  If you use
+        ``app.click(verbose=True)`` you'll see a list of all the
+        links.
+
+        You can use multiple criteria to essentially assert multiple
+        aspects about the link, e.g., where the link's destination is.
+        """
+        __tracebackhide__ = True
+        found_html, found_desc, found_attrs = self._find_element(
+            tag='a', href_attr='href',
+            href_extract=None,
+            content=description,
+            id=linkid, 
+            href_pattern=href,
+            html_pattern=anchor,
+            index=index, verbose=verbose)
+        return self.goto(found_attrs['uri'])
+
+    def clickbutton(self, description=None, buttonid=None, href=None,
+                    button=None, index=None, verbose=False):
+        """
+        Like ``.click()``, except looks for link-like buttons.
+        This kind of button should look like
+        ``<button onclick="...location.href='url'...">``.
+        """
+        __tracebackhide__ = True
+        found_html, found_desc, found_attrs = self._find_element(
+            tag='button', href_attr='onclick',
+            href_extract=re.compile(r"location\.href='(.*?)'"),
+            content=description,
+            id=buttonid,
+            href_pattern=href,
+            html_pattern=button,
+            index=index, verbose=verbose)
+        return self.goto(found_attrs['uri'])
+
+    def _find_element(self, tag, href_attr, href_extract,
+                      content, id,
+                      href_pattern,
+                      html_pattern,
+                      index, verbose):
+        content_pat = _make_pattern(content)
+        id_pat = _make_pattern(id)
+        href_pat = _make_pattern(href_pattern)
+        html_pat = _make_pattern(html_pattern)
+
+        _tag_re = re.compile(r'<%s\s+(.*?)>(.*?)</%s>' % (tag, tag),
+                             re.I+re.S)
+
+        def printlog(s):
+            if verbose:
+                print s
+
+        found_links = []
+        total_links = 0
+        for match in _tag_re.finditer(self.body):
+            el_html = match.group(0)
+            el_attr = match.group(1)
+            el_content = match.group(2)
+            attrs = _parse_attrs(el_attr)
+            if verbose:
+                printlog('Element: %r' % el_html)
+            if not attrs.get(href_attr):
+                printlog('  Skipped: no %s attribute' % href_attr)
+                continue
+            el_href = attrs[href_attr]
+            if href_extract:
+                m = href_extract.search(el_href)
+                if not m:
+                    printlog("  Skipped: doesn't match extract pattern")
+                    continue
+                el_href = m.group(1)
+            attrs['uri'] = el_href
+            if el_href.startswith('#'):
+                printlog('  Skipped: only internal fragment href')
+                continue
+            if el_href.startswith('javascript:'):
+                printlog('  Skipped: cannot follow javascript:')
+                continue
+            total_links += 1
+            if content_pat and not content_pat(el_content):
+                printlog("  Skipped: doesn't match description")
+                continue
+            if id_pat and not id_pat(attrs.get('id', '')):
+                printlog("  Skipped: doesn't match id")
+                continue
+            if href_pat and not href_pat(el_href):
+                printlog("  Skipped: doesn't match href")
+                continue
+            if html_pat and not html_pat(el_html):
+                printlog("  Skipped: doesn't match html")
+                continue
+            printlog("  Accepted")
+            found_links.append((el_html, el_content, attrs))
+        if not found_links:
+            raise IndexError(
+                "No matching elements found (from %s possible)"
+                % total_links)
+        if index is None:
+            if len(found_links) > 1:
+                raise IndexError(
+                    "Multiple links match: %s"
+                    % ', '.join([repr(anc) for anc, d, attr in found_links]))
+            found_link = found_links[0]
+        else:
+            try:
+                found_link = found_links[index]
+            except IndexError:
+                raise IndexError(
+                    "Only %s (out of %s) links match; index %s out of range"
+                    % (len(found_links), total_links, index))
+        return found_link
+
+    def goto(self, href, method='get', **args):
+        """
+        Go to the (potentially relative) link ``href``, using the
+        given method (``'get'`` or ``'post'``) and any extra arguments
+        you want to pass to the ``app.get()`` or ``app.post()``
+        methods.
+
+        All hostnames and schemes will be ignored.
+        """
+        scheme, host, path, query, fragment = urlparse.urlsplit(href)
+        # We
+        scheme = host = fragment = ''
+        href = urlparse.urlunsplit((scheme, host, path, query, fragment))
+        href = urlparse.urljoin(self.request.full_url, href)
+        method = method.lower()
+        assert method in ('get', 'post'), (
+            'Only "get" or "post" are allowed for method (you gave %r)'
+            % method)
+        if method == 'get':
+            method = self.test_app.get
+        else:
+            method = self.test_app.post
+        return method(href, **args)
+
+    _normal_body_regex = re.compile(r'[ \n\r\t]+')
+
+    def normal_body__get(self):
+        if self._normal_body is None:
+            self._normal_body = self._normal_body_regex.sub(
+                ' ', self.body)
+        return self._normal_body
+
+    normal_body = property(normal_body__get,
+                           doc="""
+                           Return the whitespace-normalized body
+                           """)
+
+    def __contains__(self, s):
+        """
+        A response 'contains' a string if it is present in the body
+        of the response.  Whitespace is normalized when searching
+        for a string.
+        """
+        if not isinstance(s, (str, unicode)):
+            s = str(s)
+        return (self.body.find(s) != -1
+                or self.normal_body.find(s) != -1)
+
+    def mustcontain(self, *strings, **kw):
+        """
+        Assert that the response contains all of the strings passed
+        in as arguments.
+
+        Equivalent to::
+
+            assert string in res
+        """
+        if 'no' in kw:
+            no = kw['no']
+            del kw['no']
+            if isinstance(no, basestring):
+                no = [no]
+        else:
+            no = []
+        if kw:
+            raise TypeError(
+                "The only keyword argument allowed is 'no'")
+        for s in strings:
+            if not s in self:
+                print >> sys.stderr, "Actual response (no %r):" % s
+                print >> sys.stderr, self
+                raise IndexError(
+                    "Body does not contain string %r" % s)
+        for no_s in no:
+            if no_s in self:
+                print >> sys.stderr, "Actual response (has %r)" % s
+                print >> sys.stderr, self
+                raise IndexError(
+                    "Body contains string %r" % s)
+
+    def __repr__(self):
+        return '<Response %s %r>' % (self.full_status, self.body[:20])
+
+    def __str__(self):
+        simple_body = '\n'.join([l for l in self.body.splitlines()
+                                 if l.strip()])
+        return 'Response: %s\n%s\n%s' % (
+            self.status,
+            '\n'.join(['%s: %s' % (n, v) for n, v in self.headers]),
+            simple_body)
+
+    def showbrowser(self):
+        """
+        Show this response in a browser window (for debugging purposes,
+        when it's hard to read the HTML).
+        """
+        fn = tempnam_no_warning(None, 'paste-fixture') + '.html'
+        f = open(fn, 'wb')
+        f.write(self.body)
+        f.close()
+        url = 'file:' + fn.replace(os.sep, '/')
+        webbrowser.open_new(url)
+
+class TestRequest(object):
+
+    # for py.test
+    disabled = True
+
+    """
+    Instances of this class are created by `TestApp
+    <class-paste.fixture.TestApp.html>`_ with the ``.get()`` and
+    ``.post()`` methods, and are consumed there by ``.do_request()``.
+
+    Instances are also available as a ``.req`` attribute on
+    `TestResponse <class-paste.fixture.TestResponse.html>`_ instances.
+
+    Useful attributes:
+
+    ``url``:
+        The url (actually usually the path) of the request, without
+        query string.
+
+    ``environ``:
+        The environment dictionary used for the request.
+
+    ``full_url``:
+        The url/path, with query string.
+    """
+
+    def __init__(self, url, environ, expect_errors=False):
+        if url.startswith('http://localhost'):
+            url = url[len('http://localhost'):]
+        self.url = url
+        self.environ = environ
+        if environ.get('QUERY_STRING'):
+            self.full_url = url + '?' + environ['QUERY_STRING']
+        else:
+            self.full_url = url
+        self.expect_errors = expect_errors
+
+
+class Form(object):
+
+    """
+    This object represents a form that has been found in a page.
+    This has a couple useful attributes:
+
+    ``text``:
+        the full HTML of the form.
+
+    ``action``:
+        the relative URI of the action.
+
+    ``method``:
+        the method (e.g., ``'GET'``).
+
+    ``id``:
+        the id, or None if not given.
+
+    ``fields``:
+        a dictionary of fields, each value is a list of fields by
+        that name.  ``<input type=\"radio\">`` and ``<select>`` are
+        both represented as single fields with multiple options.
+    """
+
+    # @@: This really should be using Mechanize/ClientForm or
+    # something...
+
+    _tag_re = re.compile(r'<(/?)([:a-z0-9_\-]*)([^>]*?)>', re.I)
+
+    def __init__(self, response, text):
+        self.response = response
+        self.text = text
+        self._parse_fields()
+        self._parse_action()
+
+    def _parse_fields(self):
+        in_select = None
+        in_textarea = None
+        fields = {}
+        for match in self._tag_re.finditer(self.text):
+            end = match.group(1) == '/'
+            tag = match.group(2).lower()
+            if tag not in ('input', 'select', 'option', 'textarea',
+                           'button'):
+                continue
+            if tag == 'select' and end:
+                assert in_select, (
+                    '%r without starting select' % match.group(0))
+                in_select = None
+                continue
+            if tag == 'textarea' and end:
+                assert in_textarea, (
+                    "</textarea> with no <textarea> at %s" % match.start())
+                in_textarea[0].value = html_unquote(self.text[in_textarea[1]:match.start()])
+                in_textarea = None
+                continue
+            if end:
+                continue
+            attrs = _parse_attrs(match.group(3))
+            if 'name' in attrs:
+                name = attrs.pop('name')
+            else:
+                name = None
+            if tag == 'option':
+                in_select.options.append((attrs.get('value'),
+                                          'selected' in attrs))
+                continue
+            if tag == 'input' and attrs.get('type') == 'radio':
+                field = fields.get(name)
+                if not field:
+                    field = Radio(self, tag, name, match.start(), **attrs)
+                    fields.setdefault(name, []).append(field)
+                else:
+                    field = field[0]
+                    assert isinstance(field, Radio)
+                field.options.append((attrs.get('value'),
+                                      'checked' in attrs))
+                continue
+            tag_type = tag
+            if tag == 'input':
+                tag_type = attrs.get('type', 'text').lower()
+            FieldClass = Field.classes.get(tag_type, Field)
+            field = FieldClass(self, tag, name, match.start(), **attrs)
+            if tag == 'textarea':
+                assert not in_textarea, (
+                    "Nested textareas: %r and %r"
+                    % (in_textarea, match.group(0)))
+                in_textarea = field, match.end()
+            elif tag == 'select':
+                assert not in_select, (
+                    "Nested selects: %r and %r"
+                    % (in_select, match.group(0)))
+                in_select = field
+            fields.setdefault(name, []).append(field)
+        self.fields = fields
+
+    def _parse_action(self):
+        self.action = None
+        for match in self._tag_re.finditer(self.text):
+            end = match.group(1) == '/'
+            tag = match.group(2).lower()
+            if tag != 'form':
+                continue
+            if end:
+                break
+            attrs = _parse_attrs(match.group(3))
+            self.action = attrs.get('action', '')
+            self.method = attrs.get('method', 'GET')
+            self.id = attrs.get('id')
+            # @@: enctype?
+        else:
+            assert 0, "No </form> tag found"
+        assert self.action is not None, (
+            "No <form> tag found")
+
+    def __setitem__(self, name, value):
+        """
+        Set the value of the named field.  If there is 0 or multiple
+        fields by that name, it is an error.
+
+        Setting the value of a ``<select>`` selects the given option
+        (and confirms it is an option).  Setting radio fields does the
+        same.  Checkboxes get boolean values.  You cannot set hidden
+        fields or buttons.
+
+        Use ``.set()`` if there is any ambiguity and you must provide
+        an index.
+        """
+        fields = self.fields.get(name)
+        assert fields is not None, (
+            "No field by the name %r found (fields: %s)"
+            % (name, ', '.join(map(repr, self.fields.keys()))))
+        assert len(fields) == 1, (
+            "Multiple fields match %r: %s"
+            % (name, ', '.join(map(repr, fields))))
+        fields[0].value = value
+
+    def __getitem__(self, name):
+        """
+        Get the named field object (ambiguity is an error).
+        """
+        fields = self.fields.get(name)
+        assert fields is not None, (
+            "No field by the name %r found" % name)
+        assert len(fields) == 1, (
+            "Multiple fields match %r: %s"
+            % (name, ', '.join(map(repr, fields))))
+        return fields[0]
+
+    def set(self, name, value, index=None):
+        """
+        Set the given name, using ``index`` to disambiguate.
+        """
+        if index is None:
+            self[name] = value
+        else:
+            fields = self.fields.get(name)
+            assert fields is not None, (
+                "No fields found matching %r" % name)
+            field = fields[index]
+            field.value = value
+
+    def get(self, name, index=None, default=NoDefault):
+        """
+        Get the named/indexed field object, or ``default`` if no field
+        is found.
+        """
+        fields = self.fields.get(name)
+        if fields is None and default is not NoDefault:
+            return default
+        if index is None:
+            return self[name]
+        else:
+            fields = self.fields.get(name)
+            assert fields is not None, (
+                "No fields found matching %r" % name)
+            field = fields[index]
+            return field
+
+    def select(self, name, value, index=None):
+        """
+        Like ``.set()``, except also confirms the target is a
+        ``<select>``.
+        """
+        field = self.get(name, index=index)
+        assert isinstance(field, Select)
+        field.value = value
+
+    def submit(self, name=None, index=None, **args):
+        """
+        Submits the form.  If ``name`` is given, then also select that
+        button (using ``index`` to disambiguate)``.
+
+        Any extra keyword arguments are passed to the ``.get()`` or
+        ``.post()`` method.
+        """
+        fields = self.submit_fields(name, index=index)
+        return self.response.goto(self.action, method=self.method,
+                                  params=fields, **args)
+
+    def submit_fields(self, name=None, index=None):
+        """
+        Return a list of ``[(name, value), ...]`` for the current
+        state of the form.
+        """
+        submit = []
+        if name is not None:
+            field = self.get(name, index=index)
+            submit.append((field.name, field.value_if_submitted()))
+        for name, fields in self.fields.items():
+            for field in fields:
+                value = field.value
+                if value is None:
+                    continue
+                submit.append((name, value))
+        return submit
+
+
+_attr_re = re.compile(r'([^= \n\r\t]+)[ \n\r\t]*(?:=[ \n\r\t]*(?:"([^"]*)"|([^"][^ \n\r\t>]*)))?', re.S)
+
+def _parse_attrs(text):
+    attrs = {}
+    for match in _attr_re.finditer(text):
+        attr_name = match.group(1).lower()
+        attr_body = match.group(2) or match.group(3)
+        attr_body = html_unquote(attr_body or '')
+        attrs[attr_name] = attr_body
+    return attrs
+
+class Field(object):
+
+    """
+    Field object.
+    """
+
+    # Dictionary of field types (select, radio, etc) to classes
+    classes = {}
+
+    settable = True
+
+    def __init__(self, form, tag, name, pos,
+                 value=None, id=None, **attrs):
+        self.form = form
+        self.tag = tag
+        self.name = name
+        self.pos = pos
+        self._value = value
+        self.id = id
+        self.attrs = attrs
+
+    def value__set(self, value):
+        if not self.settable:
+            raise AttributeError(
+                "You cannot set the value of the <%s> field %r"
+                % (self.tag, self.name))
+        self._value = value
+
+    def force_value(self, value):
+        """
+        Like setting a value, except forces it even for, say, hidden
+        fields.
+        """
+        self._value = value
+
+    def value__get(self):
+        return self._value
+
+    value = property(value__get, value__set)
+
+class Select(Field):
+
+    """
+    Field representing ``<select>``
+    """
+
+    def __init__(self, *args, **attrs):
+        super(Select, self).__init__(*args, **attrs)
+        self.options = []
+        self.multiple = attrs.get('multiple')
+        assert not self.multiple, (
+            "<select multiple> not yet supported")
+        # Undetermined yet:
+        self.selectedIndex = None
+
+    def value__set(self, value):
+        for i, (option, checked) in enumerate(self.options):
+            if option == str(value):
+                self.selectedIndex = i
+                break
+        else:
+            raise ValueError(
+                "Option %r not found (from %s)"
+                % (value, ', '.join(
+                [repr(o) for o, c in self.options])))
+
+    def value__get(self):
+        if self.selectedIndex is not None:
+            return self.options[self.selectedIndex][0]
+        else:
+            for option, checked in self.options:
+                if checked:
+                    return option
+            else:
+                if self.options:
+                    return self.options[0][0]
+                else:
+                    return None
+
+    value = property(value__get, value__set)
+
+Field.classes['select'] = Select
+
+class Radio(Select):
+
+    """
+    Field representing ``<input type="radio">``
+    """
+
+Field.classes['radio'] = Radio
+
+class Checkbox(Field):
+
+    """
+    Field representing ``<input type="checkbox">``
+    """
+
+    def __init__(self, *args, **attrs):
+        super(Checkbox, self).__init__(*args, **attrs)
+        self.checked = 'checked' in attrs
+
+    def value__set(self, value):
+        self.checked = not not value
+
+    def value__get(self):
+        if self.checked:
+            if self._value is None:
+                # @@: 'on'?
+                return 'checked'
+            else:
+                return self._value
+        else:
+            return None
+
+    value = property(value__get, value__set)
+
+Field.classes['checkbox'] = Checkbox
+
+class Text(Field):
+    """
+    Field representing ``<input type="text">``
+    """
+    def __init__(self, form, tag, name, pos,
+                 value='', id=None, **attrs):
+        #text fields default to empty string        
+        Field.__init__(self, form, tag, name, pos,
+                       value=value, id=id, **attrs)
+                        
+Field.classes['text'] = Text
+
+class Textarea(Text):
+    """
+    Field representing ``<textarea>``
+    """
+
+Field.classes['textarea'] = Textarea
+
+class Hidden(Text):
+    """
+    Field representing ``<input type="hidden">``
+    """
+
+Field.classes['hidden'] = Hidden
+
+class Submit(Field):
+    """
+    Field representing ``<input type="submit">`` and ``<button>``
+    """
+    
+    settable = False
+
+    def value__get(self):
+        return None
+
+    value = property(value__get)
+
+    def value_if_submitted(self):
+        return self._value
+
+Field.classes['submit'] = Submit
+
+Field.classes['button'] = Submit
+
+Field.classes['image'] = Submit
+
+############################################################
+## Command-line testing
+############################################################
+
+
+class TestFileEnvironment(object):
+
+    """
+    This represents an environment in which files will be written, and
+    scripts will be run.
+    """
+
+    # for py.test
+    disabled = True
+
+    def __init__(self, base_path, template_path=None,
+                 script_path=None,
+                 environ=None, cwd=None, start_clear=True,
+                 ignore_paths=None, ignore_hidden=True):
+        """
+        Creates an environment.  ``base_path`` is used as the current
+        working directory, and generally where changes are looked for.
+
+        ``template_path`` is the directory to look for *template*
+        files, which are files you'll explicitly add to the
+        environment.  This is done with ``.writefile()``.
+
+        ``script_path`` is the PATH for finding executables.  Usually
+        grabbed from ``$PATH``.
+
+        ``environ`` is the operating system environment,
+        ``os.environ`` if not given.
+
+        ``cwd`` is the working directory, ``base_path`` by default.
+
+        If ``start_clear`` is true (default) then the ``base_path``
+        will be cleared (all files deleted) when an instance is
+        created.  You can also use ``.clear()`` to clear the files.
+
+        ``ignore_paths`` is a set of specific filenames that should be
+        ignored when created in the environment.  ``ignore_hidden``
+        means, if true (default) that filenames and directories
+        starting with ``'.'`` will be ignored.
+        """
+        self.base_path = base_path
+        self.template_path = template_path
+        if environ is None:
+            environ = os.environ.copy()
+        self.environ = environ
+        if script_path is None:
+            if sys.platform == 'win32':
+                script_path = environ.get('PATH', '').split(';')
+            else:       
+                script_path = environ.get('PATH', '').split(':')
+        self.script_path = script_path
+        if cwd is None:
+            cwd = base_path
+        self.cwd = cwd
+        if start_clear:
+            self.clear()
+        elif not os.path.exists(base_path):
+            os.makedirs(base_path)
+        self.ignore_paths = ignore_paths or []
+        self.ignore_hidden = ignore_hidden
+
+    def run(self, script, *args, **kw):
+        """
+        Run the command, with the given arguments.  The ``script``
+        argument can have space-separated arguments, or you can use
+        the positional arguments.
+
+        Keywords allowed are:
+
+        ``expect_error``: (default False)
+            Don't raise an exception in case of errors
+        ``expect_stderr``: (default ``expect_error``)
+            Don't raise an exception if anything is printed to stderr
+        ``stdin``: (default ``""``)
+            Input to the script
+        ``printresult``: (default True)
+            Print the result after running
+        ``cwd``: (default ``self.cwd``)
+            The working directory to run in
+
+        Returns a `ProcResponse
+        <class-paste.fixture.ProcResponse.html>`_ object.
+        """
+        __tracebackhide__ = True
+        expect_error = _popget(kw, 'expect_error', False)
+        expect_stderr = _popget(kw, 'expect_stderr', expect_error)
+        cwd = _popget(kw, 'cwd', self.cwd)
+        stdin = _popget(kw, 'stdin', None)
+        printresult = _popget(kw, 'printresult', True)
+        args = map(str, args)
+        assert not kw, (
+            "Arguments not expected: %s" % ', '.join(kw.keys()))
+        if ' ' in script:
+            assert not args, (
+                "You cannot give a multi-argument script (%r) "
+                "and arguments (%s)" % (script, args))
+            script, args = script.split(None, 1)
+            args = shlex.split(args)
+        script = self._find_exe(script)
+        all = [script] + args
+        files_before = self._find_files()
+        proc = subprocess.Popen(all, stdin=subprocess.PIPE,
+                                stderr=subprocess.PIPE,
+                                stdout=subprocess.PIPE,
+                                cwd=cwd,
+                                env=self.environ)
+        stdout, stderr = proc.communicate(stdin)
+        files_after = self._find_files()
+        result = ProcResult(
+            self, all, stdin, stdout, stderr,
+            returncode=proc.returncode,
+            files_before=files_before,
+            files_after=files_after)
+        if printresult:
+            print result
+            print '-'*40
+        if not expect_error:
+            result.assert_no_error()
+        if not expect_stderr:
+            result.assert_no_stderr()
+        return result
+
+    def _find_exe(self, script_name):
+        if self.script_path is None:
+            script_name = os.path.join(self.cwd, script_name)
+            if not os.path.exists(script_name):
+                raise OSError(
+                    "Script %s does not exist" % script_name)
+            return script_name
+        for path in self.script_path:
+            fn = os.path.join(path, script_name)
+            if os.path.exists(fn):
+                return fn
+        raise OSError(
+            "Script %s could not be found in %s"
+            % (script_name, ':'.join(self.script_path)))
+
+    def _find_files(self):
+        result = {}
+        for fn in os.listdir(self.base_path):
+            if self._ignore_file(fn):
+                continue
+            self._find_traverse(fn, result)
+        return result
+
+    def _ignore_file(self, fn):
+        if fn in self.ignore_paths:
+            return True
+        if self.ignore_hidden and os.path.basename(fn).startswith('.'):
+            return True
+        return False
+
+    def _find_traverse(self, path, result):
+        full = os.path.join(self.base_path, path)
+        if os.path.isdir(full):
+            result[path] = FoundDir(self.base_path, path)
+            for fn in os.listdir(full):
+                fn = os.path.join(path, fn)
+                if self._ignore_file(fn):
+                    continue
+                self._find_traverse(fn, result)
+        else:
+            result[path] = FoundFile(self.base_path, path)
+
+    def clear(self):
+        """
+        Delete all the files in the base directory.
+        """
+        if os.path.exists(self.base_path):
+            shutil.rmtree(self.base_path)
+        os.mkdir(self.base_path)
+
+    def writefile(self, path, content=None,
+                  frompath=None):
+        """
+        Write a file to the given path.  If ``content`` is given then
+        that text is written, otherwise the file in ``frompath`` is
+        used.  ``frompath`` is relative to ``self.template_path``
+        """
+        full = os.path.join(self.base_path, path)
+        if not os.path.exists(os.path.dirname(full)):
+            os.makedirs(os.path.dirname(full))
+        f = open(full, 'wb')
+        if content is not None:
+            f.write(content)
+        if frompath is not None:
+            if self.template_path:
+                frompath = os.path.join(self.template_path, frompath)
+            f2 = open(frompath, 'rb')
+            f.write(f2.read())
+            f2.close()
+        f.close()
+        return FoundFile(self.base_path, path)
+
+class ProcResult(object):
+
+    """
+    Represents the results of running a command in
+    `TestFileEnvironment
+    <class-paste.fixture.TestFileEnvironment.html>`_.
+
+    Attributes to pay particular attention to:
+
+    ``stdout``, ``stderr``:
+        What is produced
+
+    ``files_created``, ``files_deleted``, ``files_updated``:
+        Dictionaries mapping filenames (relative to the ``base_dir``)
+        to `FoundFile <class-paste.fixture.FoundFile.html>`_ or
+        `FoundDir <class-paste.fixture.FoundDir.html>`_ objects.
+    """
+
+    def __init__(self, test_env, args, stdin, stdout, stderr,
+                 returncode, files_before, files_after):
+        self.test_env = test_env
+        self.args = args
+        self.stdin = stdin
+        self.stdout = stdout
+        self.stderr = stderr
+        self.returncode = returncode
+        self.files_before = files_before
+        self.files_after = files_after
+        self.files_deleted = {}
+        self.files_updated = {}
+        self.files_created = files_after.copy()
+        for path, f in files_before.items():
+            if path not in files_after:
+                self.files_deleted[path] = f
+                continue
+            del self.files_created[path]
+            if f.mtime < files_after[path].mtime:
+                self.files_updated[path] = files_after[path]
+
+    def assert_no_error(self):
+        __tracebackhide__ = True
+        assert self.returncode is 0, (
+            "Script returned code: %s" % self.returncode)
+
+    def assert_no_stderr(self):
+        __tracebackhide__ = True
+        if self.stderr:
+            print 'Error output:'
+            print self.stderr
+            raise AssertionError("stderr output not expected")
+
+    def __str__(self):
+        s = ['Script result: %s' % ' '.join(self.args)]
+        if self.returncode:
+            s.append('  return code: %s' % self.returncode)
+        if self.stderr:
+            s.append('-- stderr: --------------------')
+            s.append(self.stderr)
+        if self.stdout:
+            s.append('-- stdout: --------------------')
+            s.append(self.stdout)
+        for name, files, show_size in [
+            ('created', self.files_created, True),
+            ('deleted', self.files_deleted, True),
+            ('updated', self.files_updated, True)]:
+            if files:
+                s.append('-- %s: -------------------' % name)
+                files = files.items()
+                files.sort()
+                last = ''
+                for path, f in files:
+                    t = '  %s' % _space_prefix(last, path, indent=4,
+                                               include_sep=False)
+                    last = path
+                    if show_size and f.size != 'N/A':
+                        t += '  (%s bytes)' % f.size
+                    s.append(t)
+        return '\n'.join(s)
+
+class FoundFile(object):
+
+    """
+    Represents a single file found as the result of a command.
+
+    Has attributes:
+
+    ``path``:
+        The path of the file, relative to the ``base_path``
+
+    ``full``:
+        The full path
+
+    ``stat``:
+        The results of ``os.stat``.  Also ``mtime`` and ``size``
+        contain the ``.st_mtime`` and ``st_size`` of the stat.
+
+    ``bytes``:
+        The contents of the file.
+
+    You may use the ``in`` operator with these objects (tested against
+    the contents of the file), and the ``.mustcontain()`` method.
+    """
+
+    file = True
+    dir = False
+
+    def __init__(self, base_path, path):
+        self.base_path = base_path
+        self.path = path
+        self.full = os.path.join(base_path, path)
+        self.stat = os.stat(self.full)
+        self.mtime = self.stat.st_mtime
+        self.size = self.stat.st_size
+        self._bytes = None
+
+    def bytes__get(self):
+        if self._bytes is None:
+            f = open(self.full, 'rb')
+            self._bytes = f.read()
+            f.close()
+        return self._bytes
+    bytes = property(bytes__get)
+
+    def __contains__(self, s):
+        return s in self.bytes
+
+    def mustcontain(self, s):
+        __tracebackhide__ = True
+        bytes = self.bytes
+        if s not in bytes:
+            print 'Could not find %r in:' % s
+            print bytes
+            assert s in bytes
+
+    def __repr__(self):
+        return '<%s %s:%s>' % (
+            self.__class__.__name__,
+            self.base_path, self.path)
+
+class FoundDir(object):
+
+    """
+    Represents a directory created by a command.
+    """
+
+    file = False
+    dir = True
+
+    def __init__(self, base_path, path):
+        self.base_path = base_path
+        self.path = path
+        self.full = os.path.join(base_path, path)
+        self.size = 'N/A'
+        self.mtime = 'N/A'
+
+    def __repr__(self):
+        return '<%s %s:%s>' % (
+            self.__class__.__name__,
+            self.base_path, self.path)
+
+def _popget(d, key, default=None):
+    """
+    Pop the key if found (else return default)
+    """
+    if key in d:
+        return d.pop(key)
+    return default
+
+def _space_prefix(pref, full, sep=None, indent=None, include_sep=True):
+    """
+    Anything shared by pref and full will be replaced with spaces
+    in full, and full returned.
+    """
+    if sep is None:
+        sep = os.path.sep
+    pref = pref.split(sep)
+    full = full.split(sep)
+    padding = []
+    while pref and full and pref[0] == full[0]:
+        if indent is None:
+            padding.append(' ' * (len(full[0]) + len(sep)))
+        else:
+            padding.append(' ' * indent)
+        full.pop(0)
+        pref.pop(0)
+    if padding:
+        if include_sep:
+            return ''.join(padding) + sep + sep.join(full)
+        else:
+            return ''.join(padding) + sep.join(full)
+    else:
+        return sep.join(full)
+
+def _make_pattern(pat):
+    if pat is None:
+        return None
+    if isinstance(pat, (str, unicode)):
+        pat = re.compile(pat)
+    if hasattr(pat, 'search'):
+        return pat.search
+    if callable(pat):
+        return pat
+    assert 0, (
+        "Cannot make callable pattern object out of %r" % pat)
+
+def setup_module(module=None):
+    """
+    This is used by py.test if it is in the module, so you can
+    import this directly.
+
+    Use like::
+
+        from paste.tests.fixture import setup_module
+    """
+    if module is None:
+        # The module we were called from must be the module...
+        module = sys._getframe().f_back.f_globals['__name__']
+    if isinstance(module, (str, unicode)):
+        module = sys.modules[module]
+    if hasattr(module, 'reset_state'):
+        module.reset_state()
+
+def html_unquote(v):
+    """
+    Unquote (some) entities in HTML.  (incomplete)
+    """
+    for ent, repl in [('&nbsp;', ' '), ('&gt;', '>'),
+                      ('&lt;', '<'), ('&quot;', '"'),
+                      ('&amp;', '&')]:
+        v = v.replace(ent, repl)
+    return v
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/request.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/request.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/request.py (revision 3)
@@ -0,0 +1,405 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+# (c) 2005 Ian Bicking and contributors
+# This module is part of the Python Paste Project and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+"""
+This module provides helper routines with work directly on a WSGI
+environment to solve common requirements.
+
+   * get_cookies(environ)
+   * parse_querystring(environ)
+   * parse_formvars(environ, include_get_vars=True)
+   * construct_url(environ, with_query_string=True, with_path_info=True,
+                   script_name=None, path_info=None, querystring=None)
+   * path_info_split(path_info)
+   * path_info_pop(environ)
+   * resolve_relative_url(url, environ)
+
+"""
+import cgi
+from Cookie import SimpleCookie
+from StringIO import StringIO
+import urlparse
+import urllib
+try:
+    from UserDict import DictMixin
+except ImportError:
+    from paste.util.UserDict24 import DictMixin
+from paste.util.multidict import MultiDict
+
+__all__ = ['get_cookies', 'get_cookie_dict', 'parse_querystring',
+           'parse_formvars', 'construct_url', 'path_info_split',
+           'path_info_pop', 'resolve_relative_url', 'EnvironHeaders']
+
+def get_cookies(environ):
+    """
+    Gets a cookie object (which is a dictionary-like object) from the
+    request environment; caches this value in case get_cookies is
+    called again for the same request.
+
+    """
+    header = environ.get('HTTP_COOKIE', '')
+    if environ.has_key('paste.cookies'):
+        cookies, check_header = environ['paste.cookies']
+        if check_header == header:
+            return cookies
+    cookies = SimpleCookie()
+    cookies.load(header)
+    environ['paste.cookies'] = (cookies, header)
+    return cookies
+
+def get_cookie_dict(environ):
+    """Return a *plain* dictionary of cookies as found in the request.
+
+    Unlike ``get_cookies`` this returns a dictionary, not a
+    ``SimpleCookie`` object.  For incoming cookies a dictionary fully
+    represents the information.  Like ``get_cookies`` this caches and
+    checks the cache.
+    """
+    header = environ.get('HTTP_COOKIE')
+    if not header:
+        return {}
+    if environ.has_key('paste.cookies.dict'):
+        cookies, check_header = environ['paste.cookies.dict']
+        if check_header == header:
+            return cookies
+    cookies = SimpleCookie()
+    cookies.load(header)
+    result = {}
+    for name in cookies:
+        result[name] = cookies[name].value
+    environ['paste.cookies.dict'] = (result, header)
+    return result
+
+def parse_querystring(environ):
+    """
+    Parses a query string into a list like ``[(name, value)]``.
+    Caches this value in case parse_querystring is called again
+    for the same request.
+
+    You can pass the result to ``dict()``, but be aware that keys that
+    appear multiple times will be lost (only the last value will be
+    preserved).
+
+    """
+    source = environ.get('QUERY_STRING', '')
+    if not source:
+        return []
+    if 'paste.parsed_querystring' in environ:
+        parsed, check_source = environ['paste.parsed_querystring']
+        if check_source == source:
+            return parsed
+    parsed = cgi.parse_qsl(source, keep_blank_values=True,
+                           strict_parsing=False)
+    environ['paste.parsed_querystring'] = (parsed, source)
+    return parsed
+
+def parse_dict_querystring(environ):
+    """Parses a query string like parse_querystring, but returns a MultiDict
+
+    Caches this value in case parse_dict_querystring is called again
+    for the same request.
+
+    Example::
+
+        >>> environ = {'QUERY_STRING': 'day=Monday&user=fred&user=jane'}
+        >>> parsed = parse_dict_querystring(environ)
+
+        >>> parsed['day']
+        'Monday'
+        >>> parsed['user']
+        'fred'
+        >>> parsed.getall('user')
+        ['fred', 'jane']
+
+    """
+    source = environ.get('QUERY_STRING', '')
+    if not source:
+        return MultiDict()
+    if 'paste.parsed_dict_querystring' in environ:
+        parsed, check_source = environ['paste.parsed_dict_querystring']
+        if check_source == source:
+            return parsed
+    parsed = cgi.parse_qsl(source, keep_blank_values=True,
+                           strict_parsing=False)
+    multi = MultiDict(parsed)
+    environ['paste.parsed_dict_querystring'] = (multi, source)
+    return multi
+
+def parse_formvars(environ, include_get_vars=True):
+    """Parses the request, returning a MultiDict of form variables.
+
+    If ``include_get_vars`` is true then GET (query string) variables
+    will also be folded into the MultiDict.
+
+    All values should be strings, except for file uploads which are
+    left as ``FieldStorage`` instances.
+
+    If the request was not a normal form request (e.g., a POST with an
+    XML body) then ``environ['wsgi.input']`` won't be read.
+    """
+    source = environ['wsgi.input']
+    if 'paste.parsed_formvars' in environ:
+        parsed, check_source = environ['paste.parsed_formvars']
+        if check_source == source:
+            if include_get_vars:
+                parsed.update(parse_querystring(environ))
+            return parsed
+    # @@: Shouldn't bother FieldStorage parsing during GET/HEAD and
+    # fake_out_cgi requests
+    type = environ.get('CONTENT_TYPE', '').lower()
+    if ';' in type:
+        type = type.split(';', 1)[0]
+    fake_out_cgi = type not in ('', 'application/x-www-form-urlencoded',
+                                'multipart/form-data')
+    # FieldStorage assumes a default CONTENT_LENGTH of -1, but a
+    # default of 0 is better:
+    if not environ.get('CONTENT_LENGTH'):
+        environ['CONTENT_LENGTH'] = '0'
+    # Prevent FieldStorage from parsing QUERY_STRING during GET/HEAD
+    # requests
+    old_query_string = environ.get('QUERY_STRING','')
+    environ['QUERY_STRING'] = ''
+    if fake_out_cgi:
+        input = StringIO('')
+        old_content_type = environ.get('CONTENT_TYPE')
+        old_content_length = environ.get('CONTENT_LENGTH')
+        environ['CONTENT_LENGTH'] = '0'
+        environ['CONTENT_TYPE'] = ''    
+    else:
+        input = environ['wsgi.input']
+    fs = cgi.FieldStorage(fp=input,
+                          environ=environ,
+                          keep_blank_values=1)
+    environ['QUERY_STRING'] = old_query_string
+    if fake_out_cgi:
+        environ['CONTENT_TYPE'] = old_content_type
+        environ['CONTENT_LENGTH'] = old_content_length
+    formvars = MultiDict()
+    if isinstance(fs.value, list):
+        for name in fs.keys():
+            values = fs[name]
+            if not isinstance(values, list):
+                values = [values]
+            for value in values:
+                if not value.filename:
+                    value = value.value
+                formvars.add(name, value)
+    environ['paste.parsed_formvars'] = (formvars, source)
+    if include_get_vars:
+        formvars.update(parse_querystring(environ))
+    return formvars
+
+def construct_url(environ, with_query_string=True, with_path_info=True,
+                  script_name=None, path_info=None, querystring=None):
+    """Reconstructs the URL from the WSGI environment.
+
+    You may override SCRIPT_NAME, PATH_INFO, and QUERYSTRING with
+    the keyword arguments.
+
+    """
+    url = environ['wsgi.url_scheme']+'://'
+
+    if environ.get('HTTP_HOST'):
+        host = environ['HTTP_HOST']
+        port = None
+        if ':' in host:
+            host, port = host.split(':', 1)
+            if environ['wsgi.url_scheme'] == 'https':
+                if port == '443':
+                    port = None
+            elif environ['wsgi.url_scheme'] == 'http':
+                if port == '80':
+                    port = None
+        url += host
+        if port:
+            url += ':%s' % port
+    else:
+        url += environ['SERVER_NAME']
+        if environ['wsgi.url_scheme'] == 'https':
+            if environ['SERVER_PORT'] != '443':
+                url += ':' + environ['SERVER_PORT']
+        else:
+            if environ['SERVER_PORT'] != '80':
+                url += ':' + environ['SERVER_PORT']
+
+    if script_name is None:
+        url += urllib.quote(environ.get('SCRIPT_NAME',''))
+    else:
+        url += urllib.quote(script_name)
+    if with_path_info:
+        if path_info is None:
+            url += urllib.quote(environ.get('PATH_INFO',''))
+        else:
+            url += urllib.quote(path_info)
+    if with_query_string:
+        if querystring is None:
+            if environ.get('QUERY_STRING'):
+                url += '?' + environ['QUERY_STRING']
+        elif querystring:
+            url += '?' + querystring
+    return url
+
+def resolve_relative_url(url, environ):
+    """
+    Resolve the given relative URL as being relative to the
+    location represented by the environment.  This can be used
+    for redirecting to a relative path.  Note: if url is already
+    absolute, this function will (intentionally) have no effect
+    on it.
+
+    """
+    cur_url = construct_url(environ, with_query_string=False)
+    return urlparse.urljoin(cur_url, url)
+
+def path_info_split(path_info):
+    """
+    Splits off the first segment of the path.  Returns (first_part,
+    rest_of_path).  first_part can be None (if PATH_INFO is empty), ''
+    (if PATH_INFO is '/'), or a name without any /'s.  rest_of_path
+    can be '' or a string starting with /.
+
+    """
+    if not path_info:
+        return None, ''
+    assert path_info.startswith('/'), (
+        "PATH_INFO should start with /: %r" % path_info)
+    path_info = path_info.lstrip('/')
+    if '/' in path_info:
+        first, rest = path_info.split('/', 1)
+        return first, '/' + rest
+    else:
+        return path_info, ''
+
+def path_info_pop(environ):
+    """
+    'Pops' off the next segment of PATH_INFO, pushing it onto
+    SCRIPT_NAME, and returning that segment.
+
+    For instance::
+
+        >>> def call_it(script_name, path_info):
+        ...     env = {'SCRIPT_NAME': script_name, 'PATH_INFO': path_info}
+        ...     result = path_info_pop(env)
+        ...     print 'SCRIPT_NAME=%r; PATH_INFO=%r; returns=%r' % (
+        ...         env['SCRIPT_NAME'], env['PATH_INFO'], result)
+        >>> call_it('/foo', '/bar')
+        SCRIPT_NAME='/foo/bar'; PATH_INFO=''; returns='bar'
+        >>> call_it('/foo/bar', '')
+        SCRIPT_NAME='/foo/bar'; PATH_INFO=''; returns=None
+        >>> call_it('/foo/bar', '/')
+        SCRIPT_NAME='/foo/bar/'; PATH_INFO=''; returns=''
+        >>> call_it('', '/1/2/3')
+        SCRIPT_NAME='/1'; PATH_INFO='/2/3'; returns='1'
+        >>> call_it('', '//1/2')
+        SCRIPT_NAME='//1'; PATH_INFO='/2'; returns='1'
+
+    """
+    path = environ.get('PATH_INFO', '')
+    if not path:
+        return None
+    while path.startswith('/'):
+        environ['SCRIPT_NAME'] += '/'
+        path = path[1:]
+    if '/' not in path:
+        environ['SCRIPT_NAME'] += path
+        environ['PATH_INFO'] = ''
+        return path
+    else:
+        segment, path = path.split('/', 1)
+        environ['PATH_INFO'] = '/' + path
+        environ['SCRIPT_NAME'] += segment
+        return segment
+
+_parse_headers_special = {
+    # This is a Zope convention, but we'll allow it here:
+    'HTTP_CGI_AUTHORIZATION': 'Authorization',
+    'CONTENT_LENGTH': 'Content-Length',
+    'CONTENT_TYPE': 'Content-Type',
+    }
+
+def parse_headers(environ):
+    """
+    Parse the headers in the environment (like ``HTTP_HOST``) and
+    yield a sequence of those (header_name, value) tuples.
+    """
+    # @@: Maybe should parse out comma-separated headers?
+    for cgi_var, value in environ.iteritems():
+        if cgi_var in _parse_headers_special:
+            yield _parse_headers_special[cgi_var], value
+        elif cgi_var.startswith('HTTP_'):
+            yield cgi_var[5:].title().replace('_', '-'), value
+
+class EnvironHeaders(DictMixin):
+    """An object that represents the headers as present in a
+    WSGI environment.
+
+    This object is a wrapper (with no internal state) for a WSGI
+    request object, representing the CGI-style HTTP_* keys as a
+    dictionary.  Because a CGI environment can only hold one value for
+    each key, this dictionary is single-valued (unlike outgoing
+    headers).
+    """
+
+    def __init__(self, environ):
+        self.environ = environ
+
+    def _trans_name(self, name):
+        key = 'HTTP_'+name.replace('-', '_').upper()
+        if key == 'HTTP_CONTENT_LENGTH':
+            key = 'CONTENT_LENGTH'
+        elif key == 'HTTP_CONTENT_TYPE':
+            key = 'CONTENT_TYPE'
+        return key
+
+    def _trans_key(self, key):
+        if key == 'CONTENT_TYPE':
+            return 'Content-Type'
+        elif key == 'CONTENT_LENGTH':
+            return 'Content-Length'
+        elif key.startswith('HTTP_'):
+            return key[5:].replace('_', '-').title()
+        else:
+            return None
+        
+    def __getitem__(self, item):
+        return self.environ[self._trans_name(item)]
+
+    def __setitem__(self, item, value):
+        # @@: Should this dictionary be writable at all?
+        self.environ[self._trans_name(item)] = value
+
+    def __delitem__(self, item):
+        del self.environ[self._trans_name(item)]
+
+    def __iter__(self):
+        for key in self.environ:
+            name = self._trans_key(key)
+            if name is not None:
+                yield name
+
+    def keys(self):
+        return list(iter(self))
+
+    def __contains__(self, item):
+        return self._trans_name(item) in self.environ
+
+def _cgi_FieldStorage__repr__patch(self):
+    """ monkey patch for FieldStorage.__repr__
+
+    Unbelievely, the default __repr__ on FieldStorage reads
+    the entire file content instead of being sane about it.
+    This is a simple replacement that doesn't do that
+    """
+    if self.file:
+        return "FieldStorage(%r, %r)" % (
+                self.name, self.filename)
+    return "FieldStorage(%r, %r, %r)" % (
+             self.name, self.filename, self.value)
+
+cgi.FieldStorage.__repr__ = _cgi_FieldStorage__repr__patch
+
+if __name__ == '__main__':
+    import doctest
+    doctest.testmod()
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/errordocument.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/errordocument.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/errordocument.py (revision 3)
@@ -0,0 +1,372 @@
+# (c) 2005-2006 James Gardner <james@pythonweb.org>
+# This module is part of the Python Paste Project and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+"""
+Middleware to display error documents for certain status codes
+
+The middleware in this module can be used to intercept responses with
+specified status codes and internally forward the request to an appropriate
+URL where the content can be displayed to the user as an error document.
+"""
+
+import warnings
+from urlparse import urlparse
+from paste.recursive import ForwardRequestException, RecursiveMiddleware
+from paste.util import converters
+from paste.response import replace_header
+
+def forward(app, codes):
+    """
+    Intercepts a response with a particular status code and returns the 
+    content from a specified URL instead.
+    
+    The arguments are:
+    
+    ``app``
+        The WSGI application or middleware chain.
+
+    ``codes``
+        A dictionary of integer status codes and the URL to be displayed
+        if the response uses that code.
+        
+    For example, you might want to create a static file to display a 
+    "File Not Found" message at the URL ``/error404.html`` and then use
+    ``forward`` middleware to catch all 404 status codes and display the page
+    you created. In this example ``app`` is your exisiting WSGI 
+    applicaiton::
+
+        from paste.errordocument import forward
+        app = forward(app, codes={404:'/error404.html'})
+
+    """
+    for code in codes:
+        if not isinstance(code, int):
+            raise TypeError('All status codes should be type int. '
+                '%s is not valid'%repr(code))
+                
+    def error_codes_mapper(code, message, environ, global_conf, codes):
+        if codes.has_key(code):
+            return codes[code]
+        else:
+            return None
+
+    #return _StatusBasedRedirect(app, error_codes_mapper, codes=codes)
+    return RecursiveMiddleware(
+        StatusBasedForward(
+            app, 
+            error_codes_mapper, 
+            codes=codes,
+        )
+    )
+
+class StatusKeeper(object):
+    def __init__(self, app, status, url, headers):
+        self.app = app
+        self.status = status
+        self.url = url
+        self.headers = headers
+
+    def __call__(self, environ, start_response):
+        def keep_status_start_response(status, headers, exc_info=None):
+            for header, value in headers:
+                if header.lower() == 'set-cookie':
+                    self.headers.append((header, value))
+                else:
+                    replace_header(self.headers, header, value)
+            return start_response(self.status, self.headers, exc_info)
+        parts = self.url.split('?')
+        environ['PATH_INFO'] = parts[0]
+        if len(parts) > 1:
+            environ['QUERY_STRING'] = parts[1]
+        else:
+            environ['QUERY_STRING'] = ''
+        #raise Exception(self.url, self.status)
+        return self.app(environ, keep_status_start_response)
+        
+class StatusBasedForward(object):
+    """
+    Middleware that lets you test a response against a custom mapper object to
+    programatically determine whether to internally forward to another URL and
+    if so, which URL to forward to.
+    
+    If you don't need the full power of this middleware you might choose to use
+    the simpler ``forward`` middleware instead.
+
+    The arguments are:
+    
+    ``app``
+        The WSGI application or middleware chain.
+        
+    ``mapper`` 
+        A callable that takes a status code as the
+        first parameter, a message as the second, and accepts optional environ,
+        global_conf and named argments afterwards. It should return a
+        URL to forward to or ``None`` if the code is not to be intercepted.
+
+    ``global_conf``
+        Optional default configuration from your config file. If ``debug`` is
+        set to ``true`` a message will be written to ``wsgi.errors`` on each
+        internal forward stating the URL forwarded to.
+    
+    ``**params`` 
+        Optional, any other configuration and extra arguments you wish to 
+        pass which will in turn be passed back to the custom mapper object.
+
+    Here is an example where a ``404 File Not Found`` status response would be
+    redirected to the URL ``/error?code=404&message=File%20Not%20Found``. This 
+    could be useful for passing the status code and message into another 
+    application to display an error document:
+    
+    .. code-block:: Python
+    
+        from paste.errordocument import StatusBasedForward
+        from paste.recursive import RecursiveMiddleware
+        from urllib import urlencode
+        
+        def error_mapper(code, message, environ, global_conf, kw)
+            if code in [404, 500]:
+                params = urlencode({'message':message, 'code':code})
+                url = '/error?'%(params)
+                return url
+            else:
+                return None
+    
+        app = RecursiveMiddleware(
+            StatusBasedForward(app, mapper=error_mapper),
+        )
+
+    """
+
+    def __init__(self, app, mapper, global_conf=None, **params):
+        if global_conf is None:
+            global_conf = {}
+        # @@: global_conf shouldn't really come in here, only in a
+        # separate make_status_based_forward function
+        if global_conf:
+            self.debug = converters.asbool(global_conf.get('debug', False))
+        else:
+            self.debug = False
+        self.application = app
+        self.mapper = mapper
+        self.global_conf = global_conf
+        self.params = params
+
+    def __call__(self, environ, start_response):
+        url = []
+        
+        def change_response(status, headers, exc_info=None):
+            status_code = status.split(' ')
+            try:
+                code = int(status_code[0])
+            except (ValueError, TypeError):
+                raise Exception(
+                    'StatusBasedForward middleware '
+                    'received an invalid status code %s'%repr(status_code[0])
+                )
+            message = ' '.join(status_code[1:])
+            new_url = self.mapper(
+                code, 
+                message, 
+                environ, 
+                self.global_conf, 
+                **self.params
+            )
+            if not (new_url == None or isinstance(new_url, str)):
+                raise TypeError(
+                    'Expected the url to internally '
+                    'redirect to in the StatusBasedForward mapper'
+                    'to be a string or None, not %s'%repr(new_url)
+                )
+            if new_url:
+                url.append([new_url, status, headers])
+            else:
+                return start_response(status, headers, exc_info)
+
+        app_iter = self.application(environ, change_response)
+        if url:
+            if hasattr(app_iter, 'close'):
+                app_iter.close()
+
+            def factory(app):
+                return StatusKeeper(app, status=url[0][1], url=url[0][0],
+                                    headers=url[0][2])
+            raise ForwardRequestException(factory=factory)
+        else:
+            return app_iter
+
+def make_errordocument(app, global_conf, **kw):
+    """
+    Paste Deploy entry point to create a error document wrapper. 
+    
+    Use like::
+
+        [filter-app:main]
+        use = egg:Paste#errordocument
+        next = real-app
+        500 = /lib/msg/500.html
+        404 = /lib/msg/404.html
+    """
+    map = {}
+    for status, redir_loc in kw.items():
+        try:
+            status = int(status)
+        except ValueError:
+            raise ValueError('Bad status code: %r' % status)
+        map[status] = redir_loc
+    forwarder = forward(app, map)
+    return forwarder
+
+__pudge_all__ = [
+    'forward',
+    'make_errordocument',
+    'empty_error',
+    'make_empty_error',
+    'StatusBasedForward',
+]
+
+
+###############################################################################
+## Deprecated
+###############################################################################
+
+def custom_forward(app, mapper, global_conf=None, **kw):
+    """
+    Deprectated; use StatusBasedForward instead.
+    """
+    warnings.warn(
+        "errordocuments.custom_forward has been deprecated; please "
+        "use errordocuments.StatusBasedForward",
+        DeprecationWarning, 2)
+    if global_conf is None:
+        global_conf = {}
+    return _StatusBasedRedirect(app, mapper, global_conf, **kw)
+
+class _StatusBasedRedirect(object):
+    """
+    Deprectated; use StatusBasedForward instead.
+    """
+    def __init__(self, app, mapper, global_conf=None, **kw):
+
+        warnings.warn(
+            "errordocuments._StatusBasedRedirect has been deprecated; please "
+            "use errordocuments.StatusBasedForward",
+            DeprecationWarning, 2)
+
+        if global_conf is None:
+            global_conf = {}
+        self.application = app
+        self.mapper = mapper
+        self.global_conf = global_conf
+        self.kw = kw
+        self.fallback_template = """
+            <html>
+            <head>
+            <title>Error %(code)s</title>
+            </html>
+            <body>
+            <h1>Error %(code)s</h1>
+            <p>%(message)s</p>
+            <hr>
+            <p>
+                Additionally an error occurred trying to produce an 
+                error document.  A description of the error was logged
+                to <tt>wsgi.errors</tt>.
+            </p>
+            </body>
+            </html>                
+        """
+        
+    def __call__(self, environ, start_response):
+        url = []
+        code_message = []
+        try:
+            def change_response(status, headers, exc_info=None):
+                new_url = None
+                parts = status.split(' ')
+                try:
+                    code = int(parts[0])
+                except ValueError, TypeError:
+                    raise Exception(
+                        '_StatusBasedRedirect middleware '
+                        'received an invalid status code %s'%repr(parts[0])
+                    )
+                message = ' '.join(parts[1:])
+                new_url = self.mapper(
+                    code, 
+                    message, 
+                    environ, 
+                    self.global_conf, 
+                    self.kw
+                )
+                if not (new_url == None or isinstance(new_url, str)):
+                    raise TypeError(
+                        'Expected the url to internally '
+                        'redirect to in the _StatusBasedRedirect error_mapper'
+                        'to be a string or None, not %s'%repr(new_url)
+                    )
+                if new_url:
+                    url.append(new_url)
+                code_message.append([code, message])
+                return start_response(status, headers, exc_info)
+            app_iter = self.application(environ, change_response)
+        except:
+            try:
+                import sys
+                error = str(sys.exc_info()[1])
+            except:
+                error = ''
+            try:
+                code, message = code_message[0]
+            except:
+                code, message = ['', '']
+            environ['wsgi.errors'].write(
+                'Error occurred in _StatusBasedRedirect '
+                'intercepting the response: '+str(error)
+            )
+            return [self.fallback_template
+                    % {'message': message, 'code': code}]
+        else:
+            if url:
+                url_ = url[0]
+                new_environ = {}
+                for k, v in environ.items():
+                    if k != 'QUERY_STRING':
+                        new_environ['QUERY_STRING'] = urlparse(url_)[4]
+                    else:
+                        new_environ[k] = v
+                class InvalidForward(Exception):
+                    pass
+                def eat_start_response(status, headers, exc_info=None):
+                    """
+                    We don't want start_response to do anything since it
+                    has already been called
+                    """
+                    if status[:3] != '200':
+                        raise InvalidForward(
+                            "The URL %s to internally forward "
+                            "to in order to create an error document did not "
+                            "return a '200' status code." % url_
+                        )
+                forward = environ['paste.recursive.forward']
+                old_start_response = forward.start_response
+                forward.start_response = eat_start_response
+                try:
+                    app_iter = forward(url_, new_environ)
+                except InvalidForward, e:
+                    code, message = code_message[0]
+                    environ['wsgi.errors'].write(
+                        'Error occurred in '
+                        '_StatusBasedRedirect redirecting '
+                        'to new URL: '+str(url[0])
+                    )
+                    return [
+                        self.fallback_template%{
+                            'message':message,
+                            'code':code,
+                        }
+                    ]
+                else:
+                    forward.start_response = old_start_response
+                    return app_iter
+            else:
+                return app_iter
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/exceptions/serial_number_generator.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/exceptions/serial_number_generator.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/exceptions/serial_number_generator.py (revision 3)
@@ -0,0 +1,117 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+
+"""
+Creates a human-readable identifier, using numbers and digits,
+avoiding ambiguous numbers and letters.  hash_identifier can be used
+to create compact representations that are unique for a certain string
+(or concatenation of strings)
+"""
+
+import md5
+
+good_characters = "23456789abcdefghjkmnpqrtuvwxyz"
+
+base = len(good_characters)
+
+def make_identifier(number):
+    """
+    Encodes a number as an identifier.
+    """
+    if not isinstance(number, (int, long)):
+        raise ValueError(
+            "You can only make identifiers out of integers (not %r)"
+            % number)
+    if number < 0:
+        raise ValueError(
+            "You cannot make identifiers out of negative numbers: %r"
+            % number)
+    result = []
+    while number:
+        next = number % base
+        result.append(good_characters[next])
+        # Note, this depends on integer rounding of results:
+        number = number / base
+    return ''.join(result)
+
+def hash_identifier(s, length, pad=True, hasher=md5, prefix='',
+                    group=None, upper=False):
+    """
+    Hashes the string (with the given hashing module), then turns that
+    hash into an identifier of the given length (using modulo to
+    reduce the length of the identifier).  If ``pad`` is False, then
+    the minimum-length identifier will be used; otherwise the
+    identifier will be padded with 0's as necessary.
+
+    ``prefix`` will be added last, and does not count towards the
+    target length.  ``group`` will group the characters with ``-`` in
+    the given lengths, and also does not count towards the target
+    length.  E.g., ``group=4`` will cause a identifier like
+    ``a5f3-hgk3-asdf``.  Grouping occurs before the prefix.
+    """
+    if length > 26 and hasher is md5:
+        raise ValueError, (
+            "md5 cannot create hashes longer than 26 characters in "
+            "length (you gave %s)" % length)
+    if isinstance(s, unicode):
+        s = s.encode('utf-8')
+    h = hasher.new(str(s))
+    bin_hash = h.digest()
+    modulo = base ** length
+    number = 0
+    for c in list(bin_hash):
+        number = (number * 256 + ord(c)) % modulo
+    ident = make_identifier(number)
+    if pad:
+        ident = good_characters[0]*(length-len(ident)) + ident
+    if group:
+        parts = []
+        while ident:
+            parts.insert(0, ident[-group:])
+            ident = ident[:-group]
+        ident = '-'.join(parts)
+    if upper:
+        ident = ident.upper()
+    return prefix + ident
+
+# doctest tests:
+__test__ = {
+    'make_identifier': """
+    >>> make_identifier(0)
+    ''
+    >>> make_identifier(1000)
+    'c53'
+    >>> make_identifier(-100)
+    Traceback (most recent call last):
+        ...
+    ValueError: You cannot make identifiers out of negative numbers: -100
+    >>> make_identifier('test')
+    Traceback (most recent call last):
+        ...
+    ValueError: You can only make identifiers out of integers (not 'test')
+    >>> make_identifier(1000000000000)
+    'c53x9rqh3'
+    """,
+    'hash_identifier': """
+    >>> hash_identifier(0, 5)
+    'cy2dr'
+    >>> hash_identifier(0, 10)
+    'cy2dr6rg46'
+    >>> hash_identifier('this is a test of a long string', 5)
+    'awatu'
+    >>> hash_identifier(0, 26)
+    'cy2dr6rg46cx8t4w2f3nfexzk4'
+    >>> hash_identifier(0, 30)
+    Traceback (most recent call last):
+        ...
+    ValueError: md5 cannot create hashes longer than 26 characters in length (you gave 30)
+    >>> hash_identifier(0, 10, group=4)
+    'cy-2dr6-rg46'
+    >>> hash_identifier(0, 10, group=4, upper=True, prefix='M-')
+    'M-CY-2DR6-RG46'
+    """}
+
+if __name__ == '__main__':
+    import doctest
+    doctest.testmod()
+    
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/exceptions/__init__.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/exceptions/__init__.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/exceptions/__init__.py (revision 3)
@@ -0,0 +1,6 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+"""
+Package for catching exceptions and displaying annotated exception
+reports
+"""
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/exceptions/reporter.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/exceptions/reporter.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/exceptions/reporter.py (revision 3)
@@ -0,0 +1,142 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+
+from email.MIMEText import MIMEText
+from email.MIMEMultipart import MIMEMultipart
+import smtplib
+import time
+try:
+    from socket import sslerror
+except ImportError:
+    sslerror = None
+from paste.exceptions import formatter
+
+class Reporter(object):
+
+    def __init__(self, **conf):
+        for name, value in conf.items():
+            if not hasattr(self, name):
+                raise TypeError(
+                    "The keyword argument %s was not expected"
+                    % name)
+            setattr(self, name, value)
+        self.check_params()
+
+    def check_params(self):
+        pass
+
+    def format_date(self, exc_data):
+        return time.strftime('%c', exc_data.date)
+
+    def format_html(self, exc_data, **kw):
+        return formatter.format_html(exc_data, **kw)
+
+    def format_text(self, exc_data, **kw):
+        return formatter.format_text(exc_data, **kw)
+
+class EmailReporter(Reporter):
+
+    to_addresses = None
+    from_address = None
+    smtp_server = 'localhost'
+    smtp_username = None
+    smtp_password = None
+    smtp_use_tls = False
+    subject_prefix = ''
+
+    def report(self, exc_data):
+        msg = self.assemble_email(exc_data)
+        server = smtplib.SMTP(self.smtp_server)
+        if self.smtp_use_tls:
+            server.ehlo()
+            server.starttls()
+            server.ehlo()
+        if self.smtp_username and self.smtp_password:
+            server.login(self.smtp_username, self.smtp_password)
+        server.sendmail(self.from_address,
+                        self.to_addresses, msg.as_string())
+        try:
+            server.quit()
+        except sslerror:
+            # sslerror is raised in tls connections on closing sometimes
+            pass
+
+    def check_params(self):
+        if not self.to_addresses:
+            raise ValueError("You must set to_addresses")
+        if not self.from_address:
+            raise ValueError("You must set from_address")
+        if isinstance(self.to_addresses, (str, unicode)):
+            self.to_addresses = [self.to_addresses]
+
+    def assemble_email(self, exc_data):
+        short_html_version = self.format_html(
+            exc_data, show_hidden_frames=False)
+        long_html_version = self.format_html(
+            exc_data, show_hidden_frames=True)
+        text_version = self.format_text(
+            exc_data, show_hidden_frames=False)
+        msg = MIMEMultipart()
+        msg.set_type('multipart/alternative')
+        msg.preamble = msg.epilogue = ''
+        text_msg = MIMEText(text_version)
+        text_msg.set_type('text/plain')
+        text_msg.set_param('charset', 'ASCII')
+        msg.attach(text_msg)
+        html_msg = MIMEText(short_html_version)
+        html_msg.set_type('text/html')
+        # @@: Correct character set?
+        html_msg.set_param('charset', 'UTF-8')
+        html_long = MIMEText(long_html_version)
+        html_long.set_type('text/html')
+        html_long.set_param('charset', 'UTF-8')
+        msg.attach(html_msg)
+        msg.attach(html_long)
+        subject = '%s: %s' % (exc_data.exception_type,
+                           formatter.truncate(str(exc_data.exception_value)))
+        msg['Subject'] = self.subject_prefix + subject
+        msg['From'] = self.from_address
+        msg['To'] = ', '.join(self.to_addresses)
+        return msg
+
+class LogReporter(Reporter):
+
+    filename = None
+    show_hidden_frames = True
+
+    def check_params(self):
+        assert self.filename is not None, (
+            "You must give a filename")
+
+    def report(self, exc_data):
+        text = self.format_text(
+            exc_data, show_hidden_frames=self.show_hidden_frames)
+        f = open(self.filename, 'a')
+        try:
+            f.write(text + '\n' + '-'*60 + '\n')
+        finally:
+            f.close()
+
+class FileReporter(Reporter):
+
+    file = None
+    show_hidden_frames = True
+
+    def check_params(self):
+        assert self.file is not None, (
+            "You must give a file object")
+
+    def report(self, exc_data):
+        text = self.format_text(
+            exc_data, show_hidden_frames=self.show_hidden_frames)
+        print text
+        self.file.write(text + '\n' + '-'*60 + '\n')
+
+class WSGIAppReporter(Reporter):
+
+    def __init__(self, exc_data):
+        self.exc_data = exc_data
+
+    def __call__(self, environ, start_response):
+        start_response('500 Server Error', [('Content-type', 'text/html')])
+        return [formatter.format_html(self.exc_data)]
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/exceptions/formatter.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/exceptions/formatter.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/exceptions/formatter.py (revision 3)
@@ -0,0 +1,564 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+
+"""
+Formatters for the exception data that comes from ExceptionCollector.
+"""
+# @@: TODO:
+# Use this: http://www.zope.org/Members/tino/VisualTraceback/VisualTracebackNews
+
+import cgi
+import re
+from paste.util import PySourceColor
+
+def html_quote(s):
+    return cgi.escape(str(s), True)
+
+class AbstractFormatter(object):
+
+    general_data_order = ['object', 'source_url']
+
+    def __init__(self, show_hidden_frames=False,
+                 include_reusable=True,
+                 show_extra_data=True,
+                 trim_source_paths=()):
+        self.show_hidden_frames = show_hidden_frames
+        self.trim_source_paths = trim_source_paths
+        self.include_reusable = include_reusable
+        self.show_extra_data = show_extra_data
+
+    def format_collected_data(self, exc_data):
+        general_data = {}
+        if self.show_extra_data:
+            for name, value_list in exc_data.extra_data.items():
+                if isinstance(name, tuple):
+                    importance, title = name
+                else:
+                    importance, title = 'normal', name
+                for value in value_list:
+                    general_data[(importance, name)] = self.format_extra_data(
+                        importance, title, value)
+        lines = []
+        frames = self.filter_frames(exc_data.frames)
+        for frame in frames:
+            sup = frame.supplement
+            if sup:
+                if sup.object:
+                    general_data[('important', 'object')] = self.format_sup_object(
+                        sup.object)
+                if sup.source_url:
+                    general_data[('important', 'source_url')] = self.format_sup_url(
+                        sup.source_url)
+                if sup.line:
+                    lines.append(self.format_sup_line_pos(sup.line, sup.column))
+                if sup.expression:
+                    lines.append(self.format_sup_expression(sup.expression))
+                if sup.warnings:
+                    for warning in sup.warnings:
+                        lines.append(self.format_sup_warning(warning))
+                if sup.info:
+                    lines.extend(self.format_sup_info(sup.info))
+            if frame.supplement_exception:
+                lines.append('Exception in supplement:')
+                lines.append(self.quote_long(frame.supplement_exception))
+            if frame.traceback_info:
+                lines.append(self.format_traceback_info(frame.traceback_info))
+            filename = frame.filename
+            if filename and self.trim_source_paths:
+                for path, repl in self.trim_source_paths:
+                    if filename.startswith(path):
+                        filename = repl + filename[len(path):]
+                        break
+            lines.append(self.format_source_line(filename or '?', frame))
+            source = frame.get_source_line()
+            long_source = frame.get_source_line(2)
+            if source:
+                lines.append(self.format_long_source(
+                    source, long_source))
+        etype = exc_data.exception_type
+        if not isinstance(etype, basestring):
+            etype = etype.__name__
+        exc_info = self.format_exception_info(
+            etype,
+            exc_data.exception_value)
+        data_by_importance = {'important': [], 'normal': [],
+                              'supplemental': [], 'extra': []}
+        for (importance, name), value in general_data.items():
+            data_by_importance[importance].append(
+                (name, value))
+        for value in data_by_importance.values():
+            value.sort()
+        return self.format_combine(data_by_importance, lines, exc_info)
+
+    def filter_frames(self, frames):
+        """
+        Removes any frames that should be hidden, according to the
+        values of traceback_hide, self.show_hidden_frames, and the
+        hidden status of the final frame.
+        """
+        if self.show_hidden_frames:
+            return frames
+        new_frames = []
+        hidden = False
+        for frame in frames:
+            hide = frame.traceback_hide
+            # @@: It would be nice to signal a warning if an unknown
+            # hide string was used, but I'm not sure where to put
+            # that warning.
+            if hide == 'before':
+                new_frames = []
+                hidden = False
+            elif hide == 'before_and_this':
+                new_frames = []
+                hidden = False
+                continue
+            elif hide == 'reset':
+                hidden = False
+            elif hide == 'reset_and_this':
+                hidden = False
+                continue
+            elif hide == 'after':
+                hidden = True
+            elif hide == 'after_and_this':
+                hidden = True
+                continue
+            elif hide:
+                continue
+            elif hidden:
+                continue
+            new_frames.append(frame)
+        if frames[-1] not in new_frames:
+            # We must include the last frame; that we don't indicates
+            # that the error happened where something was "hidden",
+            # so we just have to show everything
+            return frames
+        return new_frames
+
+    def pretty_string_repr(self, s):
+        """
+        Formats the string as a triple-quoted string when it contains
+        newlines.
+        """
+        if '\n' in s:
+            s = repr(s)
+            s = s[0]*3 + s[1:-1] + s[-1]*3
+            s = s.replace('\\n', '\n')
+            return s
+        else:
+            return repr(s)
+
+    def long_item_list(self, lst):
+        """
+        Returns true if the list contains items that are long, and should
+        be more nicely formatted.
+        """
+        how_many = 0
+        for item in lst:
+            if len(repr(item)) > 40:
+                how_many += 1
+                if how_many >= 3:
+                    return True
+        return False
+
+class TextFormatter(AbstractFormatter):
+
+    def quote(self, s):
+        return s
+    def quote_long(self, s):
+        return s
+    def emphasize(self, s):
+        return s
+    def format_sup_object(self, obj):
+        return 'In object: %s' % self.emphasize(self.quote(repr(obj)))
+    def format_sup_url(self, url):
+        return 'URL: %s' % self.quote(url)
+    def format_sup_line_pos(self, line, column):
+        if column:
+            return self.emphasize('Line %i, Column %i' % (line, column))
+        else:
+            return self.emphasize('Line %i' % line)
+    def format_sup_expression(self, expr):
+        return self.emphasize('In expression: %s' % self.quote(expr))
+    def format_sup_warning(self, warning):
+        return 'Warning: %s' % self.quote(warning)
+    def format_sup_info(self, info):
+        return [self.quote_long(info)]
+    def format_source_line(self, filename, frame):
+        return 'File %r, line %s in %s' % (
+            filename, frame.lineno or '?', frame.name or '?')
+    def format_long_source(self, source, long_source):
+        return self.format_source(source)
+    def format_source(self, source_line):
+        return '  ' + self.quote(source_line.strip())
+    def format_exception_info(self, etype, evalue):
+        return self.emphasize(
+            '%s: %s' % (self.quote(etype), self.quote(evalue)))
+    def format_traceback_info(self, info):
+        return info
+        
+    def format_combine(self, data_by_importance, lines, exc_info):
+        lines[:0] = [value for n, value in data_by_importance['important']]
+        lines.append(exc_info)
+        for name in 'normal', 'supplemental', 'extra':
+            lines.extend([value for n, value in data_by_importance[name]])
+        return self.format_combine_lines(lines)
+
+    def format_combine_lines(self, lines):
+        return '\n'.join(lines)
+
+    def format_extra_data(self, importance, title, value):
+        if isinstance(value, str):
+            s = self.pretty_string_repr(value)
+            if '\n' in s:
+                return '%s:\n%s' % (title, s)
+            else:
+                return '%s: %s' % (title, s)
+        elif isinstance(value, dict):
+            lines = ['\n', title, '-'*len(title)]
+            items = value.items()
+            items.sort()
+            for n, v in items:
+                try:
+                    v = repr(v)
+                except Exception, e:
+                    v = 'Cannot display: %s' % e
+                v = truncate(v)
+                lines.append('  %s: %s' % (n, v))
+            return '\n'.join(lines)
+        elif (isinstance(value, (list, tuple))
+              and self.long_item_list(value)):
+            parts = [truncate(repr(v)) for v in value]
+            return '%s: [\n    %s]' % (
+                title, ',\n    '.join(parts))
+        else:
+            return '%s: %s' % (title, truncate(repr(value)))
+
+class HTMLFormatter(TextFormatter):
+
+    def quote(self, s):
+        return html_quote(s)
+    def quote_long(self, s):
+        return '<pre>%s</pre>' % self.quote(s)
+    def emphasize(self, s):
+        return '<b>%s</b>' % s
+    def format_sup_url(self, url):
+        return 'URL: <a href="%s">%s</a>' % (url, url)
+    def format_combine_lines(self, lines):
+        return '<br>\n'.join(lines)
+    def format_source_line(self, filename, frame):
+        name = self.quote(frame.name or '?')
+        return 'Module <span class="module" title="%s">%s</span>:<b>%s</b> in <code>%s</code>' % (
+            filename, frame.modname or '?', frame.lineno or '?',
+            name)
+        return 'File %r, line %s in <tt>%s</tt>' % (
+            filename, frame.lineno, name)
+    def format_long_source(self, source, long_source):
+        q_long_source = str2html(long_source, False, 4, True)
+        q_source = str2html(source, True, 0, False)
+        return ('<code style="display: none" class="source" source-type="long"><a class="switch_source" onclick="return switch_source(this, \'long\')" href="#">&lt;&lt;&nbsp; </a>%s</code>'
+                '<code class="source" source-type="short"><a onclick="return switch_source(this, \'short\')" class="switch_source" href="#">&gt;&gt;&nbsp; </a>%s</code>'
+                % (q_long_source,
+                   q_source))
+    def format_source(self, source_line):
+        return '&nbsp;&nbsp;<code class="source">%s</code>' % self.quote(source_line.strip())
+    def format_traceback_info(self, info):
+        return '<pre>%s</pre>' % self.quote(info)
+
+    def format_extra_data(self, importance, title, value):
+        if isinstance(value, str):
+            s = self.pretty_string_repr(value)
+            if '\n' in s:
+                return '%s:<br><pre>%s</pre>' % (title, self.quote(s))
+            else:
+                return '%s: <tt>%s</tt>' % (title, self.quote(s))
+        elif isinstance(value, dict):
+            return self.zebra_table(title, value)
+        elif (isinstance(value, (list, tuple))
+              and self.long_item_list(value)):
+            return '%s: <tt>[<br>\n&nbsp; &nbsp; %s]</tt>' % (
+                title, ',<br>&nbsp; &nbsp; '.join(map(self.quote, map(repr, value))))
+        else:
+            return '%s: <tt>%s</tt>' % (title, self.quote(repr(value)))
+
+    def format_combine(self, data_by_importance, lines, exc_info):
+        lines[:0] = [value for n, value in data_by_importance['important']]
+        lines.append(exc_info)
+        for name in 'normal', 'supplemental':
+            lines.extend([value for n, value in data_by_importance[name]])
+        if data_by_importance['extra']:
+            lines.append(
+                '<script type="text/javascript">\nshow_button(\'extra_data\', \'extra data\');\n</script>\n' +
+                '<div id="extra_data" class="hidden-data">\n')
+            lines.extend([value for n, value in data_by_importance['extra']])
+            lines.append('</div>')
+        text = self.format_combine_lines(lines)
+        if self.include_reusable:
+            return error_css + hide_display_js + text
+        else:
+            # Usually because another error is already on this page,
+            # and so the js & CSS are unneeded
+            return text
+
+    def zebra_table(self, title, rows, table_class="variables"):
+        if isinstance(rows, dict):
+            rows = rows.items()
+            rows.sort()
+        table = ['<table class="%s">' % table_class,
+                 '<tr class="header"><th colspan="2">%s</th></tr>'
+                 % self.quote(title)]
+        odd = False
+        for name, value in rows:
+            try:
+                value = repr(value)
+            except Exception, e:
+                value = 'Cannot print: %s' % e
+            odd = not odd
+            table.append(
+                '<tr class="%s"><td>%s</td>'
+                % (odd and 'odd' or 'even', self.quote(name)))
+            table.append(
+                '<td><tt>%s</tt></td></tr>'
+                % make_wrappable(self.quote(truncate(value))))
+        table.append('</table>')
+        return '\n'.join(table)
+
+hide_display_js = r'''
+<script type="text/javascript">
+function hide_display(id) {
+    var el = document.getElementById(id);
+    if (el.className == "hidden-data") {
+        el.className = "";
+        return true;
+    } else {
+        el.className = "hidden-data";
+        return false;
+    }
+}
+document.write('<style type="text/css">\n');
+document.write('.hidden-data {display: none}\n');
+document.write('</style>\n');
+function show_button(toggle_id, name) {
+    document.write('<a href="#' + toggle_id
+        + '" onclick="javascript:hide_display(\'' + toggle_id
+        + '\')" class="button">' + name + '</a><br>');
+}
+
+function switch_source(el, hide_type) {
+    while (el) {
+        if (el.getAttribute &&
+            el.getAttribute('source-type') == hide_type) {
+            break;
+        }
+        el = el.parentNode;
+    }
+    if (! el) {
+        return false;
+    }
+    el.style.display = 'none';
+    if (hide_type == 'long') {
+        while (el) {
+            if (el.getAttribute &&
+                el.getAttribute('source-type') == 'short') {
+                break;
+            }
+            el = el.nextSibling;
+        }
+    } else {
+        while (el) {
+            if (el.getAttribute &&
+                el.getAttribute('source-type') == 'long') {
+                break;
+            }
+            el = el.previousSibling;
+        }
+    }
+    if (el) {
+        el.style.display = '';
+    }
+    return false;
+}
+
+</script>'''
+    
+
+error_css = """
+<style type="text/css">
+body {
+  font-family: Helvetica, sans-serif;
+}
+
+table {
+  width: 100%;
+}
+
+tr.header {
+  background-color: #006;
+  color: #fff;
+}
+
+tr.even {
+  background-color: #ddd;
+}
+
+table.variables td {
+  vertical-align: top;
+  overflow: auto;
+}
+
+a.button {
+  background-color: #ccc;
+  border: 2px outset #aaa;
+  color: #000;
+  text-decoration: none;
+}
+
+a.button:hover {
+  background-color: #ddd;
+}
+
+code.source {
+  color: #006;
+}
+
+a.switch_source {
+  color: #090;
+  text-decoration: none;
+}
+
+a.switch_source:hover {
+  background-color: #ddd;
+}
+
+.source-highlight {
+  background-color: #ff9;
+}
+
+</style>
+"""
+
+def format_html(exc_data, include_hidden_frames=False, **ops):
+    if not include_hidden_frames:
+        return HTMLFormatter(**ops).format_collected_data(exc_data)
+    short_er = format_html(exc_data, show_hidden_frames=False, **ops)
+    # @@: This should have a way of seeing if the previous traceback
+    # was actually trimmed at all
+    ops['include_reusable'] = False
+    ops['show_extra_data'] = False
+    long_er = format_html(exc_data, show_hidden_frames=True, **ops)
+    text_er = format_text(exc_data, show_hidden_frames=True, **ops)
+    return """
+    %s
+    <br>
+    <script type="text/javascript">
+    show_button('full_traceback', 'full traceback')
+    </script>
+    <div id="full_traceback" class="hidden-data">
+    %s
+    </div>
+    <br>
+    <script type="text/javascript">
+    show_button('text_version', 'text version')
+    </script>
+    <div id="text_version" class="hidden-data">
+    <textarea style="width: 100%%" rows=10 cols=60>%s</textarea>
+    </div>
+    """ % (short_er, long_er, cgi.escape(text_er))
+        
+def format_text(exc_data, **ops):
+    return TextFormatter(**ops).format_collected_data(exc_data)
+
+whitespace_re = re.compile(r'  +')
+pre_re = re.compile(r'</?pre.*?>')
+error_re = re.compile(r'<h3>ERROR: .*?</h3>')
+
+def str2html(src, strip=False, indent_subsequent=0,
+             highlight_inner=False):
+    """
+    Convert a string to HTML.  Try to be really safe about it,
+    returning a quoted version of the string if nothing else works.
+    """
+    try:
+        return _str2html(src, strip=strip,
+                         indent_subsequent=indent_subsequent,
+                         highlight_inner=highlight_inner)
+    except:
+        return html_quote(src)
+
+def _str2html(src, strip=False, indent_subsequent=0,
+              highlight_inner=False):
+    if strip:
+        src = src.strip()
+    orig_src = src
+    try:
+        src = PySourceColor.str2html(src, form='snip')
+        src = error_re.sub('', src)
+        src = pre_re.sub('', src)
+        src = re.sub(r'^[\n\r]{0,1}', '', src)
+        src = re.sub(r'[\n\r]{0,1}$', '', src)
+    except:
+        src = html_quote(orig_src)
+    lines = src.splitlines()
+    if len(lines) == 1:
+        return lines[0]
+    indent = ' '*indent_subsequent
+    for i in range(1, len(lines)):
+        lines[i] = indent+lines[i]
+        if highlight_inner and i == len(lines)/2:
+            lines[i] = '<span class="source-highlight">%s</span>' % lines[i]
+    src = '<br>\n'.join(lines)
+    src = whitespace_re.sub(
+        lambda m: '&nbsp;'*(len(m.group(0))-1) + ' ', src)
+    return src
+
+def truncate(string, limit=1000):
+    """
+    Truncate the string to the limit number of
+    characters
+    """
+    if len(string) > limit:
+        return string[:limit-20]+'...'+string[-17:]
+    else:
+        return string
+
+def make_wrappable(html, wrap_limit=60,
+                   split_on=';?&@!$#-/\\"\''):
+    # Currently using <wbr>, maybe should use &#8203;
+    #   http://www.cs.tut.fi/~jkorpela/html/nobr.html
+    if len(html) <= wrap_limit:
+        return html
+    words = html.split()
+    new_words = []
+    for word in words:
+        wrapped_word = ''
+        while len(word) > wrap_limit:
+            for char in split_on:
+                if char in word:
+                    first, rest = word.split(char, 1)
+                    wrapped_word += first+char+'<wbr>'
+                    word = rest
+                    break
+            else:
+                for i in range(0, len(word), wrap_limit):
+                    wrapped_word += word[i:i+wrap_limit]+'<wbr>'
+                word = ''
+        wrapped_word += word
+        new_words.append(wrapped_word)
+    return ' '.join(new_words)
+
+def make_pre_wrappable(html, wrap_limit=60,
+                       split_on=';?&@!$#-/\\"\''):
+    """
+    Like ``make_wrappable()`` but intended for text that will
+    go in a ``<pre>`` block, so wrap on a line-by-line basis.
+    """
+    lines = html.splitlines()
+    new_lines = []
+    for line in lines:
+        if len(line) > wrap_limit:
+            for char in split_on:
+                if char in line:
+                    parts = line.split(char)
+                    line = '<wbr>'.join(parts)
+                    break
+        new_lines.append(line)
+    return '\n'.join(lines)
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/exceptions/collector.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/exceptions/collector.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/exceptions/collector.py (revision 3)
@@ -0,0 +1,514 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+##############################################################################
+#
+# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+## Originally zExceptions.ExceptionFormatter from Zope;
+## Modified by Ian Bicking, Imaginary Landscape, 2005
+"""
+An exception collector that finds traceback information plus
+supplements
+"""
+
+import sys
+import traceback
+import time
+try:
+    from cStringIO import StringIO
+except ImportError:
+    from StringIO import StringIO
+import linecache
+from paste.exceptions import serial_number_generator
+import warnings
+
+DEBUG_EXCEPTION_FORMATTER = True
+DEBUG_IDENT_PREFIX = 'E-'
+
+__all__ = ['collect_exception', 'ExceptionCollector']
+
+class ExceptionCollector(object):
+
+    """
+    Produces a data structure that can be used by formatters to
+    display exception reports.
+
+    Magic variables:
+
+    If you define one of these variables in your local scope, you can
+    add information to tracebacks that happen in that context.  This
+    allows applications to add all sorts of extra information about
+    the context of the error, including URLs, environmental variables,
+    users, hostnames, etc.  These are the variables we look for:
+
+    ``__traceback_supplement__``:
+        You can define this locally or globally (unlike all the other
+        variables, which must be defined locally).
+
+        ``__traceback_supplement__`` is a tuple of ``(factory, arg1,
+        arg2...)``.  When there is an exception, ``factory(arg1, arg2,
+        ...)`` is called, and the resulting object is inspected for
+        supplemental information.
+
+    ``__traceback_info__``:
+        This information is added to the traceback, usually fairly
+        literally.
+
+    ``__traceback_hide__``:
+        If set and true, this indicates that the frame should be
+        hidden from abbreviated tracebacks.  This way you can hide
+        some of the complexity of the larger framework and let the
+        user focus on their own errors.
+
+        By setting it to ``'before'``, all frames before this one will
+        be thrown away.  By setting it to ``'after'`` then all frames
+        after this will be thrown away until ``'reset'`` is found.  In
+        each case the frame where it is set is included, unless you
+        append ``'_and_this'`` to the value (e.g.,
+        ``'before_and_this'``).
+
+        Note that formatters will ignore this entirely if the frame
+        that contains the error wouldn't normally be shown according
+        to these rules.
+
+    ``__traceback_reporter__``:
+        This should be a reporter object (see the reporter module),
+        or a list/tuple of reporter objects.  All reporters found this
+        way will be given the exception, innermost first.
+
+    ``__traceback_decorator__``:
+        This object (defined in a local or global scope) will get the
+        result of this function (the CollectedException defined
+        below).  It may modify this object in place, or return an
+        entirely new object.  This gives the object the ability to
+        manipulate the traceback arbitrarily.
+
+    The actually interpretation of these values is largely up to the
+    reporters and formatters.
+    
+    ``collect_exception(*sys.exc_info())`` will return an object with
+    several attributes:
+
+    ``frames``:
+        A list of frames
+    ``exception_formatted``:
+        The formatted exception, generally a full traceback
+    ``exception_type``:
+        The type of the exception, like ``ValueError``
+    ``exception_value``:
+        The string value of the exception, like ``'x not in list'``
+    ``identification_code``:
+        A hash of the exception data meant to identify the general
+        exception, so that it shares this code with other exceptions
+        that derive from the same problem.  The code is a hash of
+        all the module names and function names in the traceback,
+        plus exception_type.  This should be shown to users so they
+        can refer to the exception later. (@@: should it include a
+        portion that allows identification of the specific instance
+        of the exception as well?)
+        
+    The list of frames goes innermost first.  Each frame has these
+    attributes; some values may be None if they could not be
+    determined.
+
+    ``modname``:
+        the name of the module
+    ``filename``:
+        the filename of the module
+    ``lineno``:
+        the line of the error
+    ``revision``:
+        the contents of __version__ or __revision__
+    ``name``:
+        the function name
+    ``supplement``:
+        an object created from ``__traceback_supplement__``
+    ``supplement_exception``:
+        a simple traceback of any exception ``__traceback_supplement__``
+        created
+    ``traceback_info``:
+        the str() of any ``__traceback_info__`` variable found in the local
+        scope (@@: should it str()-ify it or not?)
+    ``traceback_hide``:
+        the value of any ``__traceback_hide__`` variable
+    ``traceback_log``:
+        the value of any ``__traceback_log__`` variable
+    
+
+    ``__traceback_supplement__`` is thrown away, but a fixed
+    set of attributes are captured; each of these attributes is
+    optional.
+
+    ``object``:
+        the name of the object being visited
+    ``source_url``:
+        the original URL requested
+    ``line``:
+        the line of source being executed (for interpreters, like ZPT)
+    ``column``:
+        the column of source being executed
+    ``expression``:
+        the expression being evaluated (also for interpreters)
+    ``warnings``:
+        a list of (string) warnings to be displayed
+    ``getInfo``:
+        a function/method that takes no arguments, and returns a string
+        describing any extra information
+    ``extraData``:
+        a function/method that takes no arguments, and returns a
+        dictionary.  The contents of this dictionary will not be
+        displayed in the context of the traceback, but globally for
+        the exception.  Results will be grouped by the keys in the
+        dictionaries (which also serve as titles).  The keys can also
+        be tuples of (importance, title); in this case the importance
+        should be ``important`` (shows up at top), ``normal`` (shows
+        up somewhere; unspecified), ``supplemental`` (shows up at
+        bottom), or ``extra`` (shows up hidden or not at all).
+
+    These are used to create an object with attributes of the same
+    names (``getInfo`` becomes a string attribute, not a method).
+    ``__traceback_supplement__`` implementations should be careful to
+    produce values that are relatively static and unlikely to cause
+    further errors in the reporting system -- any complex
+    introspection should go in ``getInfo()`` and should ultimately
+    return a string.
+
+    Note that all attributes are optional, and under certain
+    circumstances may be None or may not exist at all -- the collector
+    can only do a best effort, but must avoid creating any exceptions
+    itself.
+
+    Formatters may want to use ``__traceback_hide__`` as a hint to
+    hide frames that are part of the 'framework' or underlying system.
+    There are a variety of rules about special values for this
+    variables that formatters should be aware of.
+    
+    TODO:
+
+    More attributes in __traceback_supplement__?  Maybe an attribute
+    that gives a list of local variables that should also be
+    collected?  Also, attributes that would be explicitly meant for
+    the entire request, not just a single frame.  Right now some of
+    the fixed set of attributes (e.g., source_url) are meant for this
+    use, but there's no explicit way for the supplement to indicate
+    new values, e.g., logged-in user, HTTP referrer, environment, etc.
+    Also, the attributes that do exist are Zope/Web oriented.
+
+    More information on frames?  cgitb, for instance, produces
+    extensive information on local variables.  There exists the
+    possibility that getting this information may cause side effects,
+    which can make debugging more difficult; but it also provides
+    fodder for post-mortem debugging.  However, the collector is not
+    meant to be configurable, but to capture everything it can and let
+    the formatters be configurable.  Maybe this would have to be a
+    configuration value, or maybe it could be indicated by another
+    magical variable (which would probably mean 'show all local
+    variables below this frame')
+    """
+
+    show_revisions = 0
+
+    def __init__(self, limit=None):
+        self.limit = limit
+
+    def getLimit(self):
+        limit = self.limit
+        if limit is None:
+            limit = getattr(sys, 'tracebacklimit', None)
+        return limit
+
+    def getRevision(self, globals):
+        if not self.show_revisions:
+            return None
+        revision = globals.get('__revision__', None)
+        if revision is None:
+            # Incorrect but commonly used spelling
+            revision = globals.get('__version__', None)
+
+        if revision is not None:
+            try:
+                revision = str(revision).strip()
+            except:
+                revision = '???'
+        return revision
+
+    def collectSupplement(self, supplement, tb):
+        result = {}
+
+        for name in ('object', 'source_url', 'line', 'column',
+                     'expression', 'warnings'):
+            result[name] = getattr(supplement, name, None)
+
+        func = getattr(supplement, 'getInfo', None)
+        if func:
+            result['info'] = func()
+        else:
+            result['info'] = None
+        func = getattr(supplement, 'extraData', None)
+        if func:
+            result['extra'] = func()
+        else:
+            result['extra'] = None
+        return SupplementaryData(**result)
+
+    def collectLine(self, tb, extra_data):
+        f = tb.tb_frame
+        lineno = tb.tb_lineno
+        co = f.f_code
+        filename = co.co_filename
+        name = co.co_name
+        globals = f.f_globals
+        locals = f.f_locals
+        if not hasattr(locals, 'has_key'):
+            # Something weird about this frame; it's not a real dict
+            warnings.warn(
+                "Frame %s has an invalid locals(): %r" % (
+                globals.get('__name__', 'unknown'), locals))
+            locals = {}
+        data = {}
+        data['modname'] = globals.get('__name__', None)
+        data['filename'] = filename
+        data['lineno'] = lineno
+        data['revision'] = self.getRevision(globals)
+        data['name'] = name
+        data['tbid'] = id(tb)
+
+        # Output a traceback supplement, if any.
+        if locals.has_key('__traceback_supplement__'):
+            # Use the supplement defined in the function.
+            tbs = locals['__traceback_supplement__']
+        elif globals.has_key('__traceback_supplement__'):
+            # Use the supplement defined in the module.
+            # This is used by Scripts (Python).
+            tbs = globals['__traceback_supplement__']
+        else:
+            tbs = None
+        if tbs is not None:
+            factory = tbs[0]
+            args = tbs[1:]
+            try:
+                supp = factory(*args)
+                data['supplement'] = self.collectSupplement(supp, tb)
+                if data['supplement'].extra:
+                    for key, value in data['supplement'].extra.items():
+                        extra_data.setdefault(key, []).append(value)
+            except:
+                if DEBUG_EXCEPTION_FORMATTER:
+                    out = StringIO()
+                    traceback.print_exc(file=out)
+                    text = out.getvalue()
+                    data['supplement_exception'] = text
+                # else just swallow the exception.
+
+        try:
+            tbi = locals.get('__traceback_info__', None)
+            if tbi is not None:
+                data['traceback_info'] = str(tbi)
+        except:
+            pass
+
+        marker = []
+        for name in ('__traceback_hide__', '__traceback_log__',
+                     '__traceback_decorator__'):
+            try:
+                tbh = locals.get(name, globals.get(name, marker))
+                if tbh is not marker:
+                    data[name[2:-2]] = tbh
+            except:
+                pass
+
+        return data
+
+    def collectExceptionOnly(self, etype, value):
+        return traceback.format_exception_only(etype, value)
+
+    def collectException(self, etype, value, tb, limit=None):
+        # The next line provides a way to detect recursion.
+        __exception_formatter__ = 1
+        frames = []
+        ident_data = []
+        traceback_decorators = []
+        if limit is None:
+            limit = self.getLimit()
+        n = 0
+        extra_data = {}
+        while tb is not None and (limit is None or n < limit):
+            if tb.tb_frame.f_locals.get('__exception_formatter__'):
+                # Stop recursion. @@: should make a fake ExceptionFrame
+                frames.append('(Recursive formatException() stopped)\n')
+                break
+            data = self.collectLine(tb, extra_data)
+            frame = ExceptionFrame(**data)
+            frames.append(frame)
+            if frame.traceback_decorator is not None:
+                traceback_decorators.append(frame.traceback_decorator)
+            ident_data.append(frame.modname or '?')
+            ident_data.append(frame.name or '?')
+            tb = tb.tb_next
+            n = n + 1
+        ident_data.append(str(etype))
+        ident = serial_number_generator.hash_identifier(
+            ' '.join(ident_data), length=5, upper=True,
+            prefix=DEBUG_IDENT_PREFIX)
+
+        result = CollectedException(
+            frames=frames,
+            exception_formatted=self.collectExceptionOnly(etype, value),
+            exception_type=etype,
+            exception_value=str(value),
+            identification_code=ident,
+            date=time.localtime(),
+            extra_data=extra_data)
+        if etype is ImportError:
+            extra_data[('important', 'sys.path')] = [sys.path]
+        for decorator in traceback_decorators:
+            try:
+                new_result = decorator(result)
+                if new_result is not None:
+                    result = new_result
+            except:
+                pass
+        return result
+
+limit = 200
+
+class Bunch(object):
+
+    """
+    A generic container
+    """
+
+    def __init__(self, **attrs):
+        for name, value in attrs.items():
+            setattr(self, name, value)
+
+    def __repr__(self):
+        name = '<%s ' % self.__class__.__name__
+        name += ' '.join(['%s=%r' % (name, str(value)[:30])
+                          for name, value in self.__dict__.items()
+                          if not name.startswith('_')])
+        return name + '>'
+
+class CollectedException(Bunch):
+    """
+    This is the result of collection the exception; it contains copies
+    of data of interest.
+    """
+    # A list of frames (ExceptionFrame instances), innermost last:
+    frames = []
+    # The result of traceback.format_exception_only; this looks
+    # like a normal traceback you'd see in the interactive interpreter
+    exception_formatted = None
+    # The *string* representation of the type of the exception
+    # (@@: should we give the # actual class? -- we can't keep the
+    # actual exception around, but the class should be safe)
+    # Something like 'ValueError'
+    exception_type = None
+    # The string representation of the exception, from ``str(e)``.
+    exception_value = None
+    # An identifier which should more-or-less classify this particular
+    # exception, including where in the code it happened.
+    identification_code = None
+    # The date, as time.localtime() returns:
+    date = None
+    # A dictionary of supplemental data:
+    extra_data = {}
+
+class SupplementaryData(Bunch):
+    """
+    The result of __traceback_supplement__.  We don't keep the
+    supplement object around, for fear of GC problems and whatnot.
+    (@@: Maybe I'm being too superstitious about copying only specific
+    information over)
+    """
+
+    # These attributes are copied from the object, or left as None
+    # if the object doesn't have these attributes:
+    object = None
+    source_url = None
+    line = None
+    column = None
+    expression = None
+    warnings = None
+    # This is the *return value* of supplement.getInfo():
+    info = None
+
+class ExceptionFrame(Bunch):
+    """
+    This represents one frame of the exception.  Each frame is a
+    context in the call stack, typically represented by a line
+    number and module name in the traceback.
+    """
+
+    # The name of the module; can be None, especially when the code
+    # isn't associated with a module.
+    modname = None
+    # The filename (@@: when no filename, is it None or '?'?)
+    filename = None
+    # Line number
+    lineno = None
+    # The value of __revision__ or __version__ -- but only if
+    # show_revision = True (by defaut it is false).  (@@: Why not
+    # collect this?)
+    revision = None
+    # The name of the function with the error (@@: None or '?' when
+    # unknown?)
+    name = None
+    # A SupplementaryData object, if __traceback_supplement__ was found
+    # (and produced no errors)
+    supplement = None
+    # If accessing __traceback_supplement__ causes any error, the
+    # plain-text traceback is stored here
+    supplement_exception = None
+    # The str() of any __traceback_info__ value found
+    traceback_info = None
+    # The value of __traceback_hide__
+    traceback_hide = False
+    # The value of __traceback_decorator__
+    traceback_decorator = None
+    # The id() of the traceback scope, can be used to reference the
+    # scope for use elsewhere
+    tbid = None
+
+    def get_source_line(self, context=0):
+        """
+        Return the source of the current line of this frame.  You
+        probably want to .strip() it as well, as it is likely to have
+        leading whitespace.
+
+        If context is given, then that many lines on either side will
+        also be returned.  E.g., context=1 will give 3 lines.
+        """
+        if not self.filename or not self.lineno:
+            return None
+        lines = []
+        for lineno in range(self.lineno-context, self.lineno+context+1):
+            lines.append(linecache.getline(self.filename, lineno))
+        return ''.join(lines)
+        
+if hasattr(sys, 'tracebacklimit'):
+    limit = min(limit, sys.tracebacklimit)
+
+col = ExceptionCollector()
+
+def collect_exception(t, v, tb, limit=None):
+    """
+    Collection an exception from ``sys.exc_info()``.
+    
+    Use like::
+
+      try:
+          blah blah
+      except:
+          exc_data = collect_exception(*sys.exc_info())
+    """
+    return col.collectException(t, v, tb, limit=limit)
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/exceptions/errormiddleware.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/exceptions/errormiddleware.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/exceptions/errormiddleware.py (revision 3)
@@ -0,0 +1,443 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+
+"""
+Error handler middleware
+"""
+import sys
+import traceback
+import cgi
+try:
+    from cStringIO import StringIO
+except ImportError:
+    from StringIO import StringIO
+from paste.exceptions import formatter, collector, reporter
+from paste import wsgilib
+from paste import request
+
+__all__ = ['ErrorMiddleware', 'handle_exception']
+
+class _NoDefault(object):
+    def __repr__(self):
+        return '<NoDefault>'
+NoDefault = _NoDefault()
+
+class ErrorMiddleware(object):
+
+    """
+    Error handling middleware
+    
+    Usage::
+
+        error_caching_wsgi_app = ErrorMiddleware(wsgi_app)
+
+    Settings:
+
+      ``debug``:
+          If true, then tracebacks will be shown in the browser.
+
+      ``error_email``:
+          an email address (or list of addresses) to send exception 
+          reports to
+
+      ``error_log``:
+          a filename to append tracebacks to
+
+      ``show_exceptions_in_wsgi_errors``:
+          If true, then errors will be printed to ``wsgi.errors`` 
+          (frequently a server error log, or stderr).
+
+      ``from_address``, ``smtp_server``, ``error_subject_prefix``, ``smtp_username``, ``smtp_password``, ``smtp_use_tls``:
+          variables to control the emailed exception reports
+
+      ``error_message``:
+          When debug mode is off, the error message to show to users.
+
+      ``xmlhttp_key``:
+          When this key (default ``_``) is in the request GET variables
+          (not POST!), expect that this is an XMLHttpRequest, and the
+          response should be more minimal; it should not be a complete
+          HTML page.
+
+    Environment Configuration:
+    
+      ``paste.throw_errors``:
+          If this setting in the request environment is true, then this
+          middleware is disabled. This can be useful in a testing situation
+          where you don't want errors to be caught and transformed.
+
+      ``paste.expected_exceptions``:
+          When this middleware encounters an exception listed in this
+          environment variable and when the ``start_response`` has not 
+          yet occurred, the exception will be re-raised instead of being
+          caught.  This should generally be set by middleware that may 
+          (but probably shouldn't be) installed above this middleware, 
+          and wants to get certain exceptions.  Exceptions raised after
+          ``start_response`` have been called are always caught since
+          by definition they are no longer expected.
+
+    """
+
+    def __init__(self, application, global_conf=None,
+                 debug=NoDefault,
+                 error_email=None,
+                 error_log=None,
+                 show_exceptions_in_wsgi_errors=NoDefault,
+                 from_address=None,
+                 smtp_server=None,
+                 smtp_username=None,
+                 smtp_password=None,
+                 smtp_use_tls=False,
+                 error_subject_prefix=None,
+                 error_message=None,
+                 xmlhttp_key=None):
+        from paste.util import converters
+        self.application = application
+        # @@: global_conf should be handled elsewhere in a separate
+        # function for the entry point
+        if global_conf is None:
+            global_conf = {}
+        if debug is NoDefault:
+            debug = converters.asbool(global_conf.get('debug'))
+        if show_exceptions_in_wsgi_errors is NoDefault:
+            show_exceptions_in_wsgi_errors = converters.asbool(global_conf.get('show_exceptions_in_wsgi_errors'))
+        self.debug_mode = converters.asbool(debug)
+        if error_email is None:
+            error_email = (global_conf.get('error_email')
+                           or global_conf.get('admin_email')
+                           or global_conf.get('webmaster_email')
+                           or global_conf.get('sysadmin_email'))
+        self.error_email = converters.aslist(error_email)
+        self.error_log = error_log
+        self.show_exceptions_in_wsgi_errors = show_exceptions_in_wsgi_errors
+        if from_address is None:
+            from_address = global_conf.get('error_from_address', 'errors@localhost')
+        self.from_address = from_address
+        if smtp_server is None:
+            smtp_server = global_conf.get('smtp_server', 'localhost')
+        self.smtp_server = smtp_server
+        self.smtp_username = smtp_username or global_conf.get('smtp_username')
+        self.smtp_password = smtp_password or global_conf.get('smtp_password')
+        self.smtp_use_tls = smtp_use_tls or converters.asbool(global_conf.get('smtp_use_tls'))
+        self.error_subject_prefix = error_subject_prefix or ''
+        if error_message is None:
+            error_message = global_conf.get('error_message')
+        self.error_message = error_message
+        if xmlhttp_key is None:
+            xmlhttp_key = global_conf.get('xmlhttp_key', '_')
+        self.xmlhttp_key = xmlhttp_key
+            
+    def __call__(self, environ, start_response):
+        """
+        The WSGI application interface.
+        """
+        # We want to be careful about not sending headers twice,
+        # and the content type that the app has committed to (if there
+        # is an exception in the iterator body of the response)
+        if environ.get('paste.throw_errors'):
+            return self.application(environ, start_response)
+        environ['paste.throw_errors'] = True
+
+        try:
+            __traceback_supplement__ = Supplement, self, environ
+            app_iter = self.application(environ, start_response)
+            return self.make_catching_iter(app_iter, environ)
+        except:
+            exc_info = sys.exc_info()
+            try:
+                for expect in environ.get('paste.expected_exceptions', []):
+                    if isinstance(exc_info[1], expect):
+                        raise
+                start_response('500 Internal Server Error',
+                               [('content-type', 'text/html')],
+                               exc_info)
+                # @@: it would be nice to deal with bad content types here
+                response = self.exception_handler(exc_info, environ)
+                return [response]
+            finally:
+                # clean up locals...
+                exc_info = None
+
+    def make_catching_iter(self, app_iter, environ):
+        if isinstance(app_iter, (list, tuple)):
+            # These don't raise
+            return app_iter
+        return CatchingIter(app_iter, environ, self)
+
+    def exception_handler(self, exc_info, environ):
+        simple_html_error = False
+        if self.xmlhttp_key:
+            get_vars = wsgilib.parse_querystring(environ)
+            if dict(get_vars).get(self.xmlhttp_key):
+                simple_html_error = True
+        return handle_exception(
+            exc_info, environ['wsgi.errors'],
+            html=True,
+            debug_mode=self.debug_mode,
+            error_email=self.error_email,
+            error_log=self.error_log,
+            show_exceptions_in_wsgi_errors=self.show_exceptions_in_wsgi_errors,
+            error_email_from=self.from_address,
+            smtp_server=self.smtp_server,
+            smtp_username=self.smtp_username,
+            smtp_password=self.smtp_password,
+            smtp_use_tls=self.smtp_use_tls,
+            error_subject_prefix=self.error_subject_prefix,
+            error_message=self.error_message,
+            simple_html_error=simple_html_error)
+
+class CatchingIter(object):
+
+    """
+    A wrapper around the application iterator that will catch
+    exceptions raised by the a generator, or by the close method, and
+    display or report as necessary.
+    """
+
+    def __init__(self, app_iter, environ, error_middleware):
+        self.app_iterable = app_iter
+        self.app_iterator = iter(app_iter)
+        self.environ = environ
+        self.error_middleware = error_middleware
+        self.closed = False
+
+    def __iter__(self):
+        return self
+
+    def next(self):
+        __traceback_supplement__ = (
+            Supplement, self.error_middleware, self.environ)
+        if self.closed:
+            raise StopIteration
+        try:
+            return self.app_iterator.next()
+        except StopIteration:
+            self.closed = True
+            close_response = self._close()
+            if close_response is not None:
+                return close_response
+            else:
+                raise StopIteration
+        except:
+            self.closed = True
+            close_response = self._close()
+            response = self.error_middleware.exception_handler(
+                sys.exc_info(), self.environ)
+            if close_response is not None:
+                response += (
+                    '<hr noshade>Error in .close():<br>%s'
+                    % close_response)
+            return response
+
+    def close(self):
+        # This should at least print something to stderr if the
+        # close method fails at this point
+        if not self.closed:
+            self._close()
+
+    def _close(self):
+        """Close and return any error message"""
+        if not hasattr(self.app_iterable, 'close'):
+            return None
+        try:
+            self.app_iterable.close()
+            return None
+        except:
+            close_response = self.error_middleware.exception_handler(
+                sys.exc_info(), self.environ)
+            return close_response
+
+
+class Supplement(object):
+
+    """
+    This is a supplement used to display standard WSGI information in
+    the traceback.
+    """
+
+    def __init__(self, middleware, environ):
+        self.middleware = middleware
+        self.environ = environ
+        self.source_url = request.construct_url(environ)
+
+    def extraData(self):
+        data = {}
+        cgi_vars = data[('extra', 'CGI Variables')] = {}
+        wsgi_vars = data[('extra', 'WSGI Variables')] = {}
+        hide_vars = ['paste.config', 'wsgi.errors', 'wsgi.input',
+                     'wsgi.multithread', 'wsgi.multiprocess',
+                     'wsgi.run_once', 'wsgi.version',
+                     'wsgi.url_scheme']
+        for name, value in self.environ.items():
+            if name.upper() == name:
+                if value:
+                    cgi_vars[name] = value
+            elif name not in hide_vars:
+                wsgi_vars[name] = value
+        if self.environ['wsgi.version'] != (1, 0):
+            wsgi_vars['wsgi.version'] = self.environ['wsgi.version']
+        proc_desc = tuple([int(bool(self.environ[key]))
+                           for key in ('wsgi.multiprocess',
+                                       'wsgi.multithread',
+                                       'wsgi.run_once')])
+        wsgi_vars['wsgi process'] = self.process_combos[proc_desc]
+        wsgi_vars['application'] = self.middleware.application
+        if 'paste.config' in self.environ:
+            data[('extra', 'Configuration')] = dict(self.environ['paste.config'])
+        return data
+
+    process_combos = {
+        # multiprocess, multithread, run_once
+        (0, 0, 0): 'Non-concurrent server',
+        (0, 1, 0): 'Multithreaded',
+        (1, 0, 0): 'Multiprocess',
+        (1, 1, 0): 'Multi process AND threads (?)',
+        (0, 0, 1): 'Non-concurrent CGI',
+        (0, 1, 1): 'Multithread CGI (?)',
+        (1, 0, 1): 'CGI',
+        (1, 1, 1): 'Multi thread/process CGI (?)',
+        }
+    
+def handle_exception(exc_info, error_stream, html=True,
+                     debug_mode=False,
+                     error_email=None,
+                     error_log=None,
+                     show_exceptions_in_wsgi_errors=False,
+                     error_email_from='errors@localhost',
+                     smtp_server='localhost',
+                     smtp_username=None, 
+                     smtp_password=None, 
+                     smtp_use_tls=False,
+                     error_subject_prefix='',
+                     error_message=None,
+                     simple_html_error=False,
+                     ):
+    """
+    For exception handling outside of a web context
+
+    Use like::
+
+        import sys
+        import paste
+        import paste.error_middleware
+        try:
+            do stuff
+        except:
+            paste.error_middleware.exception_handler(
+                sys.exc_info(), paste.CONFIG, sys.stderr, html=False)
+
+    If you want to report, but not fully catch the exception, call
+    ``raise`` after ``exception_handler``, which (when given no argument)
+    will reraise the exception.
+    """
+    reported = False
+    exc_data = collector.collect_exception(*exc_info)
+    extra_data = ''
+    if error_email:
+        rep = reporter.EmailReporter(
+            to_addresses=error_email,
+            from_address=error_email_from,
+            smtp_server=smtp_server,
+            smtp_username=smtp_username,
+            smtp_password=smtp_password,
+            smtp_use_tls=smtp_use_tls,
+            subject_prefix=error_subject_prefix)
+        rep_err = send_report(rep, exc_data, html=html)
+        if rep_err:
+            extra_data += rep_err
+        else:
+            reported = True
+    if error_log:
+        rep = reporter.LogReporter(
+            filename=error_log)
+        rep_err = send_report(rep, exc_data, html=html)
+        if rep_err:
+            extra_data += rep_err
+        else:
+            reported = True
+    if show_exceptions_in_wsgi_errors:
+        rep = reporter.FileReporter(
+            file=error_stream)
+        rep_err = send_report(rep, exc_data, html=html)
+        if rep_err:
+            extra_data += rep_err
+        else:
+            reported = True
+    else:
+        error_stream.write('Error - %s: %s\n' % (
+            exc_data.exception_type, exc_data.exception_value))
+    if html:
+        if debug_mode and simple_html_error:
+            return_error = formatter.format_html(
+                exc_data, include_hidden_frames=False,
+                include_reusable=False, show_extra_data=False)
+            reported = True
+        elif debug_mode and not simple_html_error:
+            error_html = formatter.format_html(
+                exc_data,
+                include_hidden_frames=True,
+                include_reusable=False)
+            head_html = formatter.error_css + formatter.hide_display_js
+            return_error = error_template(
+                head_html, error_html, extra_data)
+            extra_data = ''
+            reported = True
+        else:
+            msg = error_message or '''
+            An error occurred.  See the error logs for more information.
+            (Turn debug on to display exception reports here)
+            '''
+            return_error = error_template('', msg, '')
+    else:
+        return_error = None
+    if not reported and error_stream:
+        err_report = formatter.format_text(exc_data, show_hidden_frames=True)
+        err_report += '\n' + '-'*60 + '\n'
+        error_stream.write(err_report)
+    if extra_data:
+        error_stream.write(extra_data)
+    return return_error
+
+def send_report(rep, exc_data, html=True):
+    try:
+        rep.report(exc_data)
+    except:
+        output = StringIO()
+        traceback.print_exc(file=output)
+        if html:
+            return """
+            <p>Additionally an error occurred while sending the %s report:
+
+            <pre>%s</pre>
+            </p>""" % (
+                cgi.escape(str(rep)), output.getvalue())
+        else:
+            return (
+                "Additionally an error occurred while sending the "
+                "%s report:\n%s" % (str(rep), output.getvalue()))
+    else:
+        return ''
+
+def error_template(head_html, exception, extra):
+    return '''
+    <html>
+    <head>
+    <title>Server Error</title>
+    %s
+    </head>
+    <body>
+    <h1>Server Error</h1>
+    %s
+    %s
+    </body>
+    </html>''' % (head_html, exception, extra)
+
+def make_error_middleware(app, global_conf, **kw):
+    return ErrorMiddleware(app, global_conf=global_conf, **kw)
+
+doc_lines = ErrorMiddleware.__doc__.splitlines(True)
+for i in range(len(doc_lines)):
+    if doc_lines[i].strip().startswith('Settings'):
+        make_error_middleware.__doc__ = ''.join(doc_lines[i:])
+        break
+del i, doc_lines
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/reloader.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/reloader.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/reloader.py (revision 3)
@@ -0,0 +1,115 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+"""
+A file monitor and server restarter.
+
+Use this like:
+
+..code-block:: Python
+
+    import reloader
+    reloader.install()
+
+Then make sure your server is installed with a shell script like::
+
+    err=3
+    while test "$err" -eq 3 ; do
+        python server.py
+        err="$?"
+    done
+
+or is run from this .bat file (if you use Windows)::
+
+    @echo off
+    :repeat
+        python server.py
+    if %errorlevel% == 3 goto repeat
+
+or run a monitoring process in Python (``paster serve --reload`` does
+this).  Use the watch_file(filename) function to cause a
+reload/restart for other other non-Python files (e.g., configuration
+files).
+"""
+
+import os
+import sys
+import time
+import threading
+from paste.util.classinstance import classinstancemethod
+
+def install(poll_interval=1):
+    """
+    Install the reloading monitor.
+
+    On some platforms server threads may not terminate when the main
+    thread does, causing ports to remain open/locked.  The
+    ``raise_keyboard_interrupt`` option creates a unignorable signal
+    which causes the whole application to shut-down (rudely).
+    """
+    mon = Monitor(poll_interval=poll_interval)
+    t = threading.Thread(target=mon.periodic_reload)
+    t.setDaemon(True)
+    t.start()
+
+class Monitor(object):
+
+    instances = []
+    global_extra_files = []
+
+    def __init__(self, poll_interval):
+        self.module_mtimes = {}
+        self.keep_running = True
+        self.poll_interval = poll_interval
+        self.extra_files = self.global_extra_files[:]
+        self.instances.append(self)
+
+    def periodic_reload(self):
+        while 1:
+            if not self.check_reload():
+                # use os._exit() here and not sys.exit() since within a
+                # thread sys.exit() just closes the given thread and
+                # won't kill the process; note os._exit does not call
+                # any atexit callbacks, nor does it do finally blocks,
+                # flush open files, etc.  In otherwords, it is rude.
+                os._exit(3)
+                break
+            time.sleep(self.poll_interval)
+
+    def check_reload(self):
+        filenames = self.extra_files[:]
+        for module in sys.modules.values():
+            try:
+                filenames.append(module.__file__)
+            except AttributeError:
+                continue
+        for filename in filenames:
+            try:
+                stat = os.stat(filename)
+                if stat:
+                    mtime = stat.st_mtime
+                else:
+                    mtime = 0
+            except (OSError, IOError):
+                continue
+            if filename.endswith('.pyc') and os.path.exists(filename[:-1]):
+                mtime = max(os.stat(filename[:-1]).st_mtime, mtime)
+            if not self.module_mtimes.has_key(filename):
+                self.module_mtimes[filename] = mtime
+            elif self.module_mtimes[filename] < mtime:
+                print >> sys.stderr, (
+                    "%s changed; reloading..." % filename)
+                return False
+        return True
+
+    def watch_file(self, cls, filename):
+        filename = os.path.abspath(filename)
+        if self is None:
+            for instance in cls.instances:
+                instance.watch_file(filename)
+            cls.global_extra_files.append(filename)
+        else:
+            self.extra_files.append(filename)
+
+    watch_file = classinstancemethod(watch_file)
+
+watch_file = Monitor.watch_file
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/progress.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/progress.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/progress.py (revision 3)
@@ -0,0 +1,222 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+# (c) 2005 Clark C. Evans
+# This module is part of the Python Paste Project and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+# This code was written with funding by http://prometheusresearch.com
+"""
+Upload Progress Monitor
+
+This is a WSGI middleware component which monitors the status of files
+being uploaded.  It includes a small query application which will return
+a list of all files being uploaded by particular session/user.
+
+>>> from paste.httpserver import serve
+>>> from paste.urlmap import URLMap
+>>> from paste.auth.basic import AuthBasicHandler
+>>> from paste.debug.debugapp import SlowConsumer, SimpleApplication
+>>> # from paste.progress import *
+>>> realm = 'Test Realm'
+>>> def authfunc(username, password):
+...     return username == password
+>>> map = URLMap({})
+>>> ups = UploadProgressMonitor(map, threshold=1024)
+>>> map['/upload'] = SlowConsumer()
+>>> map['/simple'] = SimpleApplication()
+>>> map['/report'] = UploadProgressReporter(ups)
+>>> serve(AuthBasicHandler(ups, realm, authfunc))
+serving on...
+
+.. note::
+
+   This is experimental, and will change in the future.
+"""
+import time
+from paste.wsgilib import catch_errors
+
+DEFAULT_THRESHOLD = 1024 * 1024  # one megabyte
+DEFAULT_TIMEOUT   = 60*5         # five minutes
+ENVIRON_RECEIVED  = 'paste.bytes_received'
+REQUEST_STARTED   = 'paste.request_started'
+REQUEST_FINISHED  = 'paste.request_finished'
+
+class _ProgressFile(object):
+    """
+    This is the input-file wrapper used to record the number of
+    ``paste.bytes_received`` for the given request.
+    """
+
+    def __init__(self, environ, rfile):
+        self._ProgressFile_environ = environ
+        self._ProgressFile_rfile   = rfile
+        self.flush = rfile.flush
+        self.write = rfile.write
+        self.writelines = rfile.writelines
+
+    def __iter__(self):
+        environ = self._ProgressFile_environ
+        riter = iter(self._ProgressFile_rfile)
+        def iterwrap():
+            for chunk in riter:
+                environ[ENVIRON_RECEIVED] += len(chunk)
+                yield chunk
+        return iter(iterwrap)
+
+    def read(self, size=-1):
+        chunk = self._ProgressFile_rfile.read(size)
+        self._ProgressFile_environ[ENVIRON_RECEIVED] += len(chunk)
+        return chunk
+
+    def readline(self):
+        chunk = self._ProgressFile_rfile.readline()
+        self._ProgressFile_environ[ENVIRON_RECEIVED] += len(chunk)
+        return chunk
+
+    def readlines(self, hint=None):
+        chunk = self._ProgressFile_rfile.readlines(hint)
+        self._ProgressFile_environ[ENVIRON_RECEIVED] += len(chunk)
+        return chunk
+
+class UploadProgressMonitor(object):
+    """
+    monitors and reports on the status of uploads in progress
+
+    Parameters:
+
+        ``application``
+
+            This is the next application in the WSGI stack.
+
+        ``threshold``
+
+            This is the size in bytes that is needed for the
+            upload to be included in the monitor.
+
+        ``timeout``
+
+            This is the amount of time (in seconds) that a upload
+            remains in the monitor after it has finished.
+
+    Methods:
+
+        ``uploads()``
+
+            This returns a list of ``environ`` dict objects for each
+            upload being currently monitored, or finished but whose time
+            has not yet expired.
+
+    For each request ``environ`` that is monitored, there are several
+    variables that are stored:
+
+        ``paste.bytes_received``
+
+            This is the total number of bytes received for the given
+            request; it can be compared with ``CONTENT_LENGTH`` to
+            build a percentage complete.  This is an integer value.
+
+        ``paste.request_started``
+
+            This is the time (in seconds) when the request was started
+            as obtained from ``time.time()``.  One would want to format
+            this for presentation to the user, if necessary.
+
+        ``paste.request_finished``
+
+            This is the time (in seconds) when the request was finished,
+            canceled, or otherwise disconnected.  This is None while
+            the given upload is still in-progress.
+
+    TODO: turn monitor into a queue and purge queue of finished
+          requests that have passed the timeout period.
+    """
+    def __init__(self, application, threshold=None, timeout=None):
+        self.application = application
+        self.threshold = threshold or DEFAULT_THRESHOLD
+        self.timeout   = timeout   or DEFAULT_TIMEOUT
+        self.monitor   = []
+
+    def __call__(self, environ, start_response):
+        length = environ.get('CONTENT_LENGTH', 0)
+        if length and int(length) > self.threshold:
+            # replace input file object
+            self.monitor.append(environ)
+            environ[ENVIRON_RECEIVED] = 0
+            environ[REQUEST_STARTED] = time.time()
+            environ[REQUEST_FINISHED] = None
+            environ['wsgi.input'] = \
+                _ProgressFile(environ, environ['wsgi.input'])
+            def finalizer(exc_info=None):
+                environ[REQUEST_FINISHED] = time.time()
+            return catch_errors(self.application, environ,
+                       start_response, finalizer, finalizer)
+        return self.application(environ, start_response)
+
+    def uploads(self):
+        return self.monitor
+
+class UploadProgressReporter(object):
+    """
+    reports on the progress of uploads for a given user
+
+    This reporter returns a JSON file (for use in AJAX) listing the
+    uploads in progress for the given user.  By default, this reporter
+    uses the ``REMOTE_USER`` environment to compare between the current
+    request and uploads in-progress.  If they match, then a response
+    record is formed.
+
+        ``match()``
+
+            This member function can be overriden to provide alternative
+            matching criteria.  It takes two environments, the first
+            is the current request, the second is a current upload.
+
+        ``report()``
+
+            This member function takes an environment and builds a
+            ``dict`` that will be used to create a JSON mapping for
+            the given upload.  By default, this just includes the
+            percent complete and the request url.
+
+    """
+    def __init__(self, monitor):
+        self.monitor   = monitor
+
+    def match(self, search_environ, upload_environ):
+        if search_environ.get('REMOTE_USER', None) == \
+           upload_environ.get('REMOTE_USER', 0):
+            return True
+        return False
+
+    def report(self, environ):
+        retval = { 'started': time.strftime("%Y-%m-%d %H:%M:%S",
+                                time.gmtime(environ[REQUEST_STARTED])),
+                   'finished': '',
+                   'content_length': environ.get('CONTENT_LENGTH'),
+                   'bytes_received': environ[ENVIRON_RECEIVED],
+                   'path_info': environ.get('PATH_INFO',''),
+                   'query_string': environ.get('QUERY_STRING','')}
+        finished = environ[REQUEST_FINISHED]
+        if finished:
+            retval['finished'] = time.strftime("%Y:%m:%d %H:%M:%S",
+                                               time.gmtime(finished))
+        return retval
+
+    def __call__(self, environ, start_response):
+        body = []
+        for map in [self.report(env) for env in self.monitor.uploads()
+                                             if self.match(environ, env)]:
+            parts = []
+            for k, v in map.items():
+                v = str(v).replace("\\", "\\\\").replace('"', '\\"')
+                parts.append('%s: "%s"' % (k, v))
+            body.append("{ %s }" % ", ".join(parts))
+        body = "[ %s ]" % ", ".join(body)
+        start_response("200 OK", [('Content-Type', 'text/plain'),
+                                  ('Content-Length', len(body))])
+        return [body]
+
+__all__ = ['UploadProgressMonitor', 'UploadProgressReporter']
+
+if "__main__" == __name__:
+    import doctest
+    doctest.testmod(optionflags=doctest.ELLIPSIS)
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/lint.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/lint.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/lint.py (revision 3)
@@ -0,0 +1,436 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+# Also licenced under the Apache License, 2.0: http://opensource.org/licenses/apache2.0.php
+# Licensed to PSF under a Contributor Agreement
+"""
+Middleware to check for obedience to the WSGI specification.
+
+Some of the things this checks:
+
+* Signature of the application and start_response (including that
+  keyword arguments are not used).
+
+* Environment checks:
+
+  - Environment is a dictionary (and not a subclass).
+
+  - That all the required keys are in the environment: REQUEST_METHOD,
+    SERVER_NAME, SERVER_PORT, wsgi.version, wsgi.input, wsgi.errors,
+    wsgi.multithread, wsgi.multiprocess, wsgi.run_once
+
+  - That HTTP_CONTENT_TYPE and HTTP_CONTENT_LENGTH are not in the
+    environment (these headers should appear as CONTENT_LENGTH and
+    CONTENT_TYPE).
+
+  - Warns if QUERY_STRING is missing, as the cgi module acts
+    unpredictably in that case.
+
+  - That CGI-style variables (that don't contain a .) have
+    (non-unicode) string values
+
+  - That wsgi.version is a tuple
+
+  - That wsgi.url_scheme is 'http' or 'https' (@@: is this too
+    restrictive?)
+
+  - Warns if the REQUEST_METHOD is not known (@@: probably too
+    restrictive).
+
+  - That SCRIPT_NAME and PATH_INFO are empty or start with /
+
+  - That at least one of SCRIPT_NAME or PATH_INFO are set.
+
+  - That CONTENT_LENGTH is a positive integer.
+
+  - That SCRIPT_NAME is not '/' (it should be '', and PATH_INFO should
+    be '/').
+
+  - That wsgi.input has the methods read, readline, readlines, and
+    __iter__
+
+  - That wsgi.errors has the methods flush, write, writelines
+
+* The status is a string, contains a space, starts with an integer,
+  and that integer is in range (> 100).
+
+* That the headers is a list (not a subclass, not another kind of
+  sequence).
+
+* That the items of the headers are tuples of strings.
+
+* That there is no 'status' header (that is used in CGI, but not in
+  WSGI).
+
+* That the headers don't contain newlines or colons, end in _ or -, or
+  contain characters codes below 037.
+
+* That Content-Type is given if there is content (CGI often has a
+  default content type, but WSGI does not).
+
+* That no Content-Type is given when there is no content (@@: is this
+  too restrictive?)
+
+* That the exc_info argument to start_response is a tuple or None.
+
+* That all calls to the writer are with strings, and no other methods
+  on the writer are accessed.
+
+* That wsgi.input is used properly:
+
+  - .read() is called with zero or one argument
+
+  - That it returns a string
+
+  - That readline, readlines, and __iter__ return strings
+
+  - That .close() is not called
+
+  - No other methods are provided
+
+* That wsgi.errors is used properly:
+
+  - .write() and .writelines() is called with a string
+
+  - That .close() is not called, and no other methods are provided.
+
+* The response iterator:
+
+  - That it is not a string (it should be a list of a single string; a
+    string will work, but perform horribly).
+
+  - That .next() returns a string
+
+  - That the iterator is not iterated over until start_response has
+    been called (that can signal either a server or application
+    error).
+
+  - That .close() is called (doesn't raise exception, only prints to
+    sys.stderr, because we only know it isn't called when the object
+    is garbage collected).
+"""
+
+import re
+import sys
+from types import DictType, StringType, TupleType, ListType
+import warnings
+
+header_re = re.compile(r'^[a-zA-Z][a-zA-Z0-9\-_]*$')
+bad_header_value_re = re.compile(r'[\000-\037]')
+
+class WSGIWarning(Warning):
+    """
+    Raised in response to WSGI-spec-related warnings
+    """
+
+def middleware(application, global_conf=None):
+
+    """
+    When applied between a WSGI server and a WSGI application, this
+    middleware will check for WSGI compliancy on a number of levels.
+    This middleware does not modify the request or response in any
+    way, but will throw an AssertionError if anything seems off
+    (except for a failure to close the application iterator, which
+    will be printed to stderr -- there's no way to throw an exception
+    at that point).
+    """
+    
+    def lint_app(*args, **kw):
+        assert len(args) == 2, "Two arguments required"
+        assert not kw, "No keyword arguments allowed"
+        environ, start_response = args
+
+        check_environ(environ)
+
+        # We use this to check if the application returns without
+        # calling start_response:
+        start_response_started = []
+
+        def start_response_wrapper(*args, **kw):
+            assert len(args) == 2 or len(args) == 3, (
+                "Invalid number of arguments: %s" % args)
+            assert not kw, "No keyword arguments allowed"
+            status = args[0]
+            headers = args[1]
+            if len(args) == 3:
+                exc_info = args[2]
+            else:
+                exc_info = None
+
+            check_status(status)
+            check_headers(headers)
+            check_content_type(status, headers)
+            check_exc_info(exc_info)
+
+            start_response_started.append(None)
+            return WriteWrapper(start_response(*args))
+
+        environ['wsgi.input'] = InputWrapper(environ['wsgi.input'])
+        environ['wsgi.errors'] = ErrorWrapper(environ['wsgi.errors'])
+
+        iterator = application(environ, start_response_wrapper)
+        assert iterator is not None and iterator != False, (
+            "The application must return an iterator, if only an empty list")
+
+        check_iterator(iterator)
+
+        return IteratorWrapper(iterator, start_response_started)
+
+    return lint_app
+
+class InputWrapper(object):
+
+    def __init__(self, wsgi_input):
+        self.input = wsgi_input
+
+    def read(self, *args):
+        assert len(args) <= 1
+        v = self.input.read(*args)
+        assert type(v) is type("")
+        return v
+
+    def readline(self, *args):
+        v = self.input.readline(*args)
+        assert type(v) is type("")
+        return v
+
+    def readlines(self, *args):
+        assert len(args) <= 1
+        lines = self.input.readlines(*args)
+        assert type(lines) is type([])
+        for line in lines:
+            assert type(line) is type("")
+        return lines
+    
+    def __iter__(self):
+        while 1:
+            line = self.readline()
+            if not line:
+                return
+            yield line
+
+    def close(self):
+        assert 0, "input.close() must not be called"
+
+class ErrorWrapper(object):
+
+    def __init__(self, wsgi_errors):
+        self.errors = wsgi_errors
+
+    def write(self, s):
+        assert type(s) is type("")
+        self.errors.write(s)
+
+    def flush(self):
+        self.errors.flush()
+
+    def writelines(self, seq):
+        for line in seq:
+            self.write(line)
+
+    def close(self):
+        assert 0, "errors.close() must not be called"
+
+class WriteWrapper(object):
+
+    def __init__(self, wsgi_writer):
+        self.writer = wsgi_writer
+
+    def __call__(self, s):
+        assert type(s) is type("")
+        self.writer(s)
+
+class PartialIteratorWrapper(object):
+
+    def __init__(self, wsgi_iterator):
+        self.iterator = wsgi_iterator
+
+    def __iter__(self):
+        # We want to make sure __iter__ is called
+        return IteratorWrapper(self.iterator)
+
+class IteratorWrapper(object):
+
+    def __init__(self, wsgi_iterator, check_start_response):
+        self.original_iterator = wsgi_iterator
+        self.iterator = iter(wsgi_iterator)
+        self.closed = False
+        self.check_start_response = check_start_response
+
+    def __iter__(self):
+        return self
+
+    def next(self):
+        assert not self.closed, (
+            "Iterator read after closed")
+        v = self.iterator.next()
+        if self.check_start_response is not None:
+            assert self.check_start_response, (
+                "The application returns and we started iterating over its body, but start_response has not yet been called")
+            self.check_start_response = None
+        return v
+        
+    def close(self):
+        self.closed = True
+        if hasattr(self.original_iterator, 'close'):
+            self.original_iterator.close()
+
+    def __del__(self):
+        if not self.closed:
+            sys.stderr.write(
+                "Iterator garbage collected without being closed")
+        assert self.closed, (
+            "Iterator garbage collected without being closed")
+
+def check_environ(environ):
+    assert type(environ) is DictType, (
+        "Environment is not of the right type: %r (environment: %r)"
+        % (type(environ), environ))
+    
+    for key in ['REQUEST_METHOD', 'SERVER_NAME', 'SERVER_PORT',
+                'wsgi.version', 'wsgi.input', 'wsgi.errors',
+                'wsgi.multithread', 'wsgi.multiprocess',
+                'wsgi.run_once']:
+        assert key in environ, (
+            "Environment missing required key: %r" % key)
+
+    for key in ['HTTP_CONTENT_TYPE', 'HTTP_CONTENT_LENGTH']:
+        assert key not in environ, (
+            "Environment should not have the key: %s "
+            "(use %s instead)" % (key, key[5:]))
+
+    if 'QUERY_STRING' not in environ:
+        warnings.warn(
+            'QUERY_STRING is not in the WSGI environment; the cgi '
+            'module will use sys.argv when this variable is missing, '
+            'so application errors are more likely',
+            WSGIWarning)
+
+    for key in environ.keys():
+        if '.' in key:
+            # Extension, we don't care about its type
+            continue
+        assert type(environ[key]) is StringType, (
+            "Environmental variable %s is not a string: %r (value: %r)"
+            % (key, type(environ[key]), environ[key]))
+        
+    assert type(environ['wsgi.version']) is TupleType, (
+        "wsgi.version should be a tuple (%r)" % environ['wsgi.version'])
+    assert environ['wsgi.url_scheme'] in ('http', 'https'), (
+        "wsgi.url_scheme unknown: %r" % environ['wsgi.url_scheme'])
+
+    check_input(environ['wsgi.input'])
+    check_errors(environ['wsgi.errors'])
+
+    # @@: these need filling out:
+    if environ['REQUEST_METHOD'] not in (
+        'GET', 'HEAD', 'POST', 'OPTIONS','PUT','DELETE','TRACE'):
+        warnings.warn(
+            "Unknown REQUEST_METHOD: %r" % environ['REQUEST_METHOD'],
+            WSGIWarning)
+
+    assert (not environ.get('SCRIPT_NAME')
+            or environ['SCRIPT_NAME'].startswith('/')), (
+        "SCRIPT_NAME doesn't start with /: %r" % environ['SCRIPT_NAME'])
+    assert (not environ.get('PATH_INFO')
+            or environ['PATH_INFO'].startswith('/')), (
+        "PATH_INFO doesn't start with /: %r" % environ['PATH_INFO'])
+    if environ.get('CONTENT_LENGTH'):
+        assert int(environ['CONTENT_LENGTH']) >= 0, (
+            "Invalid CONTENT_LENGTH: %r" % environ['CONTENT_LENGTH'])
+
+    if not environ.get('SCRIPT_NAME'):
+        assert environ.has_key('PATH_INFO'), (
+            "One of SCRIPT_NAME or PATH_INFO are required (PATH_INFO "
+            "should at least be '/' if SCRIPT_NAME is empty)")
+    assert environ.get('SCRIPT_NAME') != '/', (
+        "SCRIPT_NAME cannot be '/'; it should instead be '', and "
+        "PATH_INFO should be '/'")
+
+def check_input(wsgi_input):
+    for attr in ['read', 'readline', 'readlines', '__iter__']:
+        assert hasattr(wsgi_input, attr), (
+            "wsgi.input (%r) doesn't have the attribute %s"
+            % (wsgi_input, attr))
+
+def check_errors(wsgi_errors):
+    for attr in ['flush', 'write', 'writelines']:
+        assert hasattr(wsgi_errors, attr), (
+            "wsgi.errors (%r) doesn't have the attribute %s"
+            % (wsgi_errors, attr))
+
+def check_status(status):
+    assert type(status) is StringType, (
+        "Status must be a string (not %r)" % status)
+    # Implicitly check that we can turn it into an integer:
+    status_code = status.split(None, 1)[0]
+    assert len(status_code) == 3, (
+        "Status codes must be three characters: %r" % status_code)
+    status_int = int(status_code)
+    assert status_int >= 100, "Status code is invalid: %r" % status_int
+    if len(status) < 4 or status[3] != ' ':
+        warnings.warn(
+            "The status string (%r) should be a three-digit integer "
+            "followed by a single space and a status explanation"
+            % status, WSGIWarning)
+
+def check_headers(headers):
+    assert type(headers) is ListType, (
+        "Headers (%r) must be of type list: %r"
+        % (headers, type(headers)))
+    header_names = {}
+    for item in headers:
+        assert type(item) is TupleType, (
+            "Individual headers (%r) must be of type tuple: %r"
+            % (item, type(item)))
+        assert len(item) == 2
+        name, value = item
+        assert name.lower() != 'status', (
+            "The Status header cannot be used; it conflicts with CGI "
+            "script, and HTTP status is not given through headers "
+            "(value: %r)." % value)
+        header_names[name.lower()] = None
+        assert '\n' not in name and ':' not in name, (
+            "Header names may not contain ':' or '\\n': %r" % name)
+        assert header_re.search(name), "Bad header name: %r" % name
+        assert not name.endswith('-') and not name.endswith('_'), (
+            "Names may not end in '-' or '_': %r" % name)
+        assert not bad_header_value_re.search(value), (
+            "Bad header value: %r (bad char: %r)"
+            % (value, bad_header_value_re.search(value).group(0)))
+
+def check_content_type(status, headers):
+    code = int(status.split(None, 1)[0])
+    # @@: need one more person to verify this interpretation of RFC 2616
+    #     http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
+    NO_MESSAGE_BODY = (201, 204, 304)
+    NO_MESSAGE_TYPE = (204, 304)
+    for name, value in headers:
+        if name.lower() == 'content-type':
+            if code not in NO_MESSAGE_TYPE:
+                return
+            assert 0, (("Content-Type header found in a %s response, "
+                        "which must not return content.") % code)
+    if code not in NO_MESSAGE_BODY:
+        assert 0, "No Content-Type header found in headers (%s)" % headers
+
+def check_exc_info(exc_info):
+    assert exc_info is None or type(exc_info) is type(()), (
+        "exc_info (%r) is not a tuple: %r" % (exc_info, type(exc_info)))
+    # More exc_info checks?
+
+def check_iterator(iterator):
+    # Technically a string is legal, which is why it's a really bad
+    # idea, because it may cause the response to be returned
+    # character-by-character
+    assert not isinstance(iterator, str), (
+        "You should not return a string as your application iterator, "
+        "instead return a single-item list containing that string.")
+
+def make_middleware(application, global_conf):
+    # @@: global_conf should be taken out of the middleware function,
+    # and isolated here
+    return middleware(application)
+
+make_middleware.__doc__ = __doc__
+
+__all__ = ['middleware', 'make_middleware']
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/registry.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/registry.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/registry.py (revision 3)
@@ -0,0 +1,506 @@
+# (c) 2005 Ben Bangert
+# This module is part of the Python Paste Project and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+"""Registry for handling request-local module globals sanely
+
+Dealing with module globals in a thread-safe way is good if your
+application is the sole responder in a thread, however that approach fails
+to properly account for various scenarios that occur with WSGI applications
+and middleware.
+
+What is actually needed in the case where a module global is desired that
+is always set properly depending on the current request, is a stacked
+thread-local object. Such an object is popped or pushed during the request
+cycle so that it properly represents the object that should be active for
+the current request.
+
+To make it easy to deal with such variables, this module provides a special
+StackedObjectProxy class which you can instantiate and attach to your
+module where you'd like others to access it. The object you'd like this to
+actually "be" during the request is then registered with the
+RegistryManager middleware, which ensures that for the scope of the current
+WSGI application everything will work properly.
+
+Example:
+
+.. code-block:: Python
+    
+    #yourpackage/__init__.py
+    
+    from paste.registry import RegistryManager, StackedObjectProxy
+    myglobal = StackedObjectProxy()
+    
+    #wsgi app stack
+    app = RegistryManager(yourapp)
+    
+    #inside your wsgi app
+    class yourapp(object):
+        def __call__(self, environ, start_response):
+            obj = someobject  # The request-local object you want to access
+                              # via yourpackage.myglobal
+            if environ.has_key('paste.registry'):
+                environ['paste.registry'].register(myglobal, obj)
+
+You will then be able to import yourpackage anywhere in your WSGI app or in
+the calling stack below it and be assured that it is using the object you
+registered with Registry.
+
+RegistryManager can be in the WSGI stack multiple times, each time it
+appears it registers a new request context.
+
+
+Performance
+===========
+
+The overhead of the proxy object is very minimal, however if you are using
+proxy objects extensively (Thousands of accesses per request or more), there
+are some ways to avoid them. A proxy object runs approximately 3-20x slower
+than direct access to the object, this is rarely your performance bottleneck
+when developing web applications.
+
+Should you be developing a system which may be accessing the proxy object
+thousands of times per request, the performance of the proxy will start to
+become more noticeable. In that circumstance, the problem can be avoided by
+getting at the actual object via the proxy with the ``_current_obj`` function:
+
+.. code-block:: Python
+    
+    #sessions.py
+    Session = StackedObjectProxy()
+    # ... initialization code, etc.
+    
+    # somemodule.py
+    import sessions
+    
+    def somefunc():
+        session = sessions.Session._current_obj()
+        # ... tons of session access
+
+This way the proxy is used only once to retrieve the object for the current
+context and the overhead is minimized while still making it easy to access
+the underlying object. The ``_current_obj`` function is preceded by an
+underscore to more likely avoid clashing with the contained object's
+attributes.
+
+**NOTE:** This is *highly* unlikely to be an issue in the vast majority of
+cases, and requires incredibly large amounts of proxy object access before
+one should consider the proxy object to be causing slow-downs. This section
+is provided solely in the extremely rare case that it is an issue so that a
+quick way to work around it is documented.
+
+"""
+import sys
+import paste.util.threadinglocal as threadinglocal
+
+__all__ = ['StackedObjectProxy', 'RegistryManager', 'StackedObjectRestorer',
+           'restorer']
+
+class NoDefault(object): pass
+
+class StackedObjectProxy(object):
+    """Track an object instance internally using a stack
+    
+    The StackedObjectProxy proxies access to an object internally using a
+    stacked thread-local. This makes it safe for complex WSGI environments
+    where access to the object may be desired in multiple places without
+    having to pass the actual object around.
+    
+    New objects are added to the top of the stack with _push_object while
+    objects can be removed with _pop_object. 
+    
+    """
+    def __init__(self, default=NoDefault, name="Default"):
+        """Create a new StackedObjectProxy
+        
+        If a default is given, its used in every thread if no other object
+        has been pushed on.
+        
+        """
+        self.__dict__['____name__'] = name
+        self.__dict__['____local__'] = threadinglocal.local()
+        if default is not NoDefault:
+            self.__dict__['____default_object__'] = default
+    
+    def __getattr__(self, attr):
+        return getattr(self._current_obj(), attr)
+    
+    def __setattr__(self, attr, value):
+        setattr(self._current_obj(), attr, value)
+    
+    def __delattr__(self, name):
+        delattr(self._current_obj(), name)
+    
+    def __getitem__(self, key):
+        return self._current_obj()[key]
+    
+    def __setitem__(self, key, value):
+        self._current_obj()[key] = value
+    
+    def __delitem__(self, key):
+        del self._current_obj()[key]
+
+    def __call__(self, *args, **kw):
+        return self._current_obj()(*args, **kw)
+    
+    def __repr__(self):
+        try:
+            return repr(self._current_obj())
+        except (TypeError, AttributeError):
+            return '<%s.%s object at 0x%x>' % (self.__class__.__module__,
+                                               self.__class__.__name__,
+                                               id(self))
+    
+    def __iter__(self):
+        return iter(self._current_obj())
+    
+    def __len__(self):
+        return len(self._current_obj())
+    
+    def __contains__(self, key):
+        return key in self._current_obj()
+
+    def __nonzero__(self):
+        return bool(self._current_obj())
+
+    def _current_obj(self):
+        """Returns the current active object being proxied to
+        
+        In the event that no object was pushed, the default object if
+        provided will be used. Otherwise, a TypeError will be raised.
+        
+        """
+        objects = getattr(self.____local__, 'objects', None)
+        if objects:
+            return objects[-1]
+        else:
+            obj = self.__dict__.get('____default_object__', NoDefault)
+            if obj is not NoDefault:
+                return obj
+            else:
+                raise TypeError(
+                    'No object (name: %s) has been registered for this '
+                    'thread' % self.____name__)
+
+    def _push_object(self, obj):
+        """Make ``obj`` the active object for this thread-local.
+        
+        This should be used like:
+        
+        .. code-block:: Python
+
+            obj = yourobject()
+            module.glob = StackedObjectProxy()
+            module.glob._push_object(obj)
+            try:
+                ... do stuff ...
+            finally:
+                module.glob._pop_object(conf)
+        
+        """
+        if not hasattr(self.____local__, 'objects'):
+            self.____local__.objects = []
+        self.____local__.objects.append(obj)
+    
+    def _pop_object(self, obj=None):
+        """Remove a thread-local object.
+        
+        If ``obj`` is given, it is checked against the popped object and an
+        error is emitted if they don't match.
+        
+        """
+        if not hasattr(self.____local__, 'objects'):
+            raise AssertionError('No object has been registered for this thread')
+        popped = self.____local__.objects.pop()
+        if obj:
+            if popped is not obj:
+                raise AssertionError(
+                    'The object popped (%s) is not the same as the object '
+                    'expected (%s)' % (popped, obj))
+
+    def _object_stack(self):
+        """Returns all of the objects stacked in this container
+
+        (Might return [] if there are none)
+        """
+        try:
+            return self.____local__.objects[:]
+        except AssertionError:
+            return []
+
+    # The following methods will be swapped for their original versions by
+    # StackedObjectRestorer when restoration is enabled. The original
+    # functions (e.g. _current_obj) will be available at _current_obj_orig
+
+    def _current_obj_restoration(self):
+        request_id = restorer.in_restoration()
+        if request_id:
+            return restorer.get_saved_proxied_obj(self, request_id)
+        return self._current_obj_orig()
+    _current_obj_restoration.__doc__ = \
+        ('%s\n(StackedObjectRestorer restoration enabled)' % \
+         _current_obj.__doc__)
+
+    def _push_object_restoration(self, obj):
+        if not restorer.in_restoration():
+            self._push_object_orig(obj)
+    _push_object_restoration.__doc__ = \
+        ('%s\n(StackedObjectRestorer restoration enabled)' % \
+         _push_object.__doc__)
+
+    def _pop_object_restoration(self, obj=None):
+        if not restorer.in_restoration():
+            self._pop_object_orig(obj)
+    _pop_object_restoration.__doc__ = \
+        ('%s\n(StackedObjectRestorer restoration enabled)' % \
+         _pop_object.__doc__)
+
+class Registry(object):
+    """Track objects and stacked object proxies for removal
+    
+    The Registry object is instantiated a single time for the request no
+    matter how many times the RegistryManager is used in a WSGI stack. Each
+    RegistryManager must call ``prepare`` before continuing the call to
+    start a new context for object registering.
+    
+    Each context is tracked with a dict inside a list. The last list
+    element is the currently executing context. Each context dict is keyed
+    by the id of the StackedObjectProxy instance being proxied, the value
+    is a tuple of the StackedObjectProxy instance and the object being
+    tracked.
+    
+    """
+    def __init__(self):
+        """Create a new Registry object
+        
+        ``prepare`` must still be called before this Registry object can be
+        used to register objects.
+        
+        """
+        self.reglist = []
+    
+    def prepare(self):
+        """Used to create a new registry context
+        
+        Anytime a new RegistryManager is called, ``prepare`` needs to be
+        called on the existing Registry object. This sets up a new context
+        for registering objects.
+        
+        """
+        self.reglist.append({})
+    
+    def register(self, stacked, obj):
+        """Register an object with a StackedObjectProxy"""
+        myreglist = self.reglist[-1]
+        stacked_id = id(stacked)
+        if stacked_id in myreglist:
+            stacked._pop_object(myreglist[stacked_id][1])
+            del myreglist[stacked_id]
+        stacked._push_object(obj)
+        myreglist[stacked_id] = (stacked, obj)
+    
+    # Replace now does the same thing as register
+    replace = register
+    
+    def cleanup(self):
+        """Remove all objects from all StackedObjectProxy instances that
+        were tracked at this Registry context"""
+        for stacked, obj in self.reglist[-1].itervalues():
+            stacked._pop_object(obj)
+        self.reglist.pop()
+        
+class RegistryManager(object):
+    """Creates and maintains a Registry context
+    
+    RegistryManager creates a new registry context for the registration of
+    StackedObjectProxy instances. Multiple RegistryManager's can be in a
+    WSGI stack and will manage the context so that the StackedObjectProxies
+    always proxy to the proper object.
+    
+    The object being registered can be any object sub-class, list, or dict.
+    
+    Registering objects is done inside a WSGI application under the
+    RegistryManager instance, using the ``environ['paste.registry']``
+    object which is a Registry instance.
+        
+    """
+    def __init__(self, application):
+        self.application = application
+        
+    def __call__(self, environ, start_response):
+        app_iter = None
+        reg = environ.setdefault('paste.registry', Registry())
+        reg.prepare()
+        try:
+            app_iter = self.application(environ, start_response)
+        except Exception, e:
+            # Regardless of if the content is an iterable, generator, list
+            # or tuple, we clean-up right now. If its an iterable/generator
+            # care should be used to ensure the generator has its own ref
+            # to the actual object
+            if environ.get('paste.evalexception'):
+                # EvalException is present in the WSGI stack
+                expected = False
+                for expect in environ.get('paste.expected_exceptions', []):
+                    if isinstance(e, expect):
+                        expected = True
+                if not expected:
+                    # An unexpected exception: save state for EvalException
+                    restorer.save_registry_state(environ)
+            reg.cleanup()
+            raise
+        except:
+            # Save state for EvalException if it's present
+            if environ.get('paste.evalexception'):
+                restorer.save_registry_state(environ)
+            reg.cleanup()
+            raise
+        else:
+            reg.cleanup()
+        
+        return app_iter
+
+class StackedObjectRestorer(object):
+    """Track StackedObjectProxies and their proxied objects for automatic
+    restoration within EvalException's interactive debugger.
+
+    An instance of this class tracks all StackedObjectProxy state in existence
+    when unexpected exceptions are raised by WSGI applications housed by
+    EvalException and RegistryManager. Like EvalException, this information is
+    stored for the life of the process.
+
+    When an unexpected exception occurs and EvalException is present in the
+    WSGI stack, save_registry_state is intended to be called to store the
+    Registry state and enable automatic restoration on all currently registered
+    StackedObjectProxies.
+
+    With restoration enabled, those StackedObjectProxies' _current_obj
+    (overwritten by _current_obj_restoration) method's strategy is modified:
+    it will return its appropriate proxied object from the restorer when
+    a restoration context is active in the current thread.
+
+    The StackedObjectProxies' _push/pop_object methods strategies are also
+    changed: they no-op when a restoration context is active in the current
+    thread (because the pushing/popping work is all handled by the
+    Registry/restorer).
+
+    The request's Registry objects' reglists are restored from the restorer
+    when a restoration context begins, enabling the Registry methods to work
+    while their changes are tracked by the restorer.
+
+    The overhead of enabling restoration is negligible (another threadlocal
+    access for the changed StackedObjectProxy methods) for normal use outside
+    of a restoration context, but worth mentioning when combined with
+    StackedObjectProxies normal overhead. Once enabled it does not turn off,
+    however:
+
+    o Enabling restoration only occurs after an unexpected exception is
+    detected. The server is likely to be restarted shortly after the exception
+    is raised to fix the cause
+
+    o StackedObjectRestorer is only enabled when EvalException is enabled (not
+    on a production server) and RegistryManager exists in the middleware
+    stack"""
+    def __init__(self):
+        # Registries and their saved reglists by request_id
+        self.saved_registry_states = {}
+        self.restoration_context_id = threadinglocal.local()
+
+    def save_registry_state(self, environ):
+        """Save the state of this request's Registry (if it hasn't already been
+        saved) to the saved_registry_states dict, keyed by the request's unique
+        identifier"""
+        registry = environ.get('paste.registry')
+        if not registry or not len(registry.reglist) or \
+                self.get_request_id(environ) in self.saved_registry_states:
+            # No Registry, no state to save, or this request's state has
+            # already been saved
+            return
+
+        self.saved_registry_states[self.get_request_id(environ)] = \
+            (registry, registry.reglist[:])
+
+        # Tweak the StackedObjectProxies we want to save state for -- change
+        # their methods to act differently when a restoration context is active
+        # in the current thread
+        for reglist in registry.reglist:
+            for stacked, obj in reglist.itervalues():
+                self.enable_restoration(stacked)
+
+    def get_saved_proxied_obj(self, stacked, request_id):
+        """Retrieve the saved object proxied by the specified
+        StackedObjectProxy for the request identified by request_id"""
+        # All state for the request identified by request_id
+        reglist = self.saved_registry_states[request_id][1]
+
+        # The top of the stack was current when the exception occurred
+        stack_level = len(reglist) - 1
+        stacked_id = id(stacked)
+        while True:
+            if stack_level < 0:
+                # Nothing registered: Call _current_obj_orig to raise a
+                # TypeError
+                return stacked._current_obj_orig()
+            context = reglist[stack_level]
+            if stacked_id in context:
+                break
+            # This StackedObjectProxy may not have been registered by the
+            # RegistryManager that was active when the exception was raised --
+            # continue searching down the stack until it's found
+            stack_level -= 1
+        return context[stacked_id][1]
+
+    def enable_restoration(self, stacked):
+        """Replace the specified StackedObjectProxy's methods with their
+        respective restoration versions.
+
+        _current_obj_restoration forces recovery of the saved proxied object
+        when a restoration context is active in the current thread.
+
+        _push/pop_object_restoration avoid pushing/popping data
+        (pushing/popping is only done at the Registry level) when a restoration
+        context is active in the current thread"""
+        if '_current_obj_orig' in stacked.__dict__:
+            # Restoration already enabled
+            return
+
+        for func_name in ('_current_obj', '_push_object', '_pop_object'):
+            orig_func = getattr(stacked, func_name)
+            restoration_func = getattr(stacked, func_name + '_restoration')
+            stacked.__dict__[func_name + '_orig'] = orig_func
+            stacked.__dict__[func_name] = restoration_func
+
+    def get_request_id(self, environ):
+        """Return a unique identifier for the current request"""
+        from paste.evalexception.middleware import get_debug_count
+        return get_debug_count(environ)
+
+    def restoration_begin(self, request_id):
+        """Enable a restoration context in the current thread for the specified
+        request_id"""
+        if request_id in self.saved_registry_states:
+            # Restore the old Registry object's state
+            registry, reglist = self.saved_registry_states[request_id]
+            registry.reglist = reglist
+
+        self.restoration_context_id.request_id = request_id
+
+    def restoration_end(self):
+        """Register a restoration context as finished, if one exists"""
+        try:
+            del self.restoration_context_id.request_id
+        except AttributeError:
+            pass
+
+    def in_restoration(self):
+        """Determine if a restoration context is active for the current thread.
+        Returns the request_id it's active for if so, otherwise False"""
+        return getattr(self.restoration_context_id, 'request_id', False)
+
+restorer = StackedObjectRestorer()
+
+
+# Paste Deploy entry point
+def make_registry_manager(app, global_conf):
+    return RegistryManager(app)
+
+make_registry_manager.__doc__ = RegistryManager.__doc__
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/evalexception/media/debug.js
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/evalexception/media/debug.js (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/evalexception/media/debug.js (revision 3)
@@ -0,0 +1,161 @@
+function showFrame(anchor) {
+    var tbid = anchor.getAttribute('tbid');
+    var expanded = anchor.expanded;
+    if (expanded) {
+        MochiKit.DOM.hideElement(anchor.expandedElement);
+        anchor.expanded = false;
+        _swapImage(anchor);
+        return false;
+    }
+    anchor.expanded = true;
+    if (anchor.expandedElement) {
+        MochiKit.DOM.showElement(anchor.expandedElement);
+        _swapImage(anchor);
+        $('debug_input_'+tbid).focus();
+        return false;
+    }
+    var url = debug_base
+        + '/show_frame?tbid=' + tbid
+        + '&debugcount=' + debug_count;
+    var d = MochiKit.Async.doSimpleXMLHttpRequest(url);
+    d.addCallbacks(function (data) {
+        var el = MochiKit.DOM.DIV({});
+        anchor.parentNode.insertBefore(el, anchor.nextSibling);
+        el.innerHTML = data.responseText;
+        anchor.expandedElement = el;
+        _swapImage(anchor);
+        $('debug_input_'+tbid).focus();
+    }, function (error) {
+        showError(error.req.responseText);
+    });
+    return false;
+}
+
+function _swapImage(anchor) {
+    var el = anchor.getElementsByTagName('IMG')[0];
+    if (anchor.expanded) {
+        var img = 'minus.jpg';
+    } else {
+        var img = 'plus.jpg';
+    }
+    el.src = debug_base + '/media/' + img;
+}
+
+function submitInput(button, tbid) {
+    var input = $(button.getAttribute('input-from'));
+    var output = $(button.getAttribute('output-to'));
+    var url = debug_base
+        + '/exec_input';
+    var history = input.form.history;
+    input.historyPosition = 0;
+    if (! history) {
+        history = input.form.history = [];
+    }
+    history.push(input.value);
+    var vars = {
+        tbid: tbid,
+        debugcount: debug_count,
+        input: input.value
+    };
+    MochiKit.DOM.showElement(output);
+    var d = MochiKit.Async.doSimpleXMLHttpRequest(url, vars);
+    d.addCallbacks(function (data) {
+        var result = data.responseText;
+        output.innerHTML += result;
+        input.value = '';
+        input.focus();
+    }, function (error) {
+        showError(error.req.responseText);
+    });
+    return false;
+}
+
+function showError(msg) {
+    var el = $('error-container');
+    if (el.innerHTML) {
+        el.innerHTML += '<hr noshade>\n' + msg;
+    } else {
+        el.innerHTML = msg;
+    }
+    MochiKit.DOM.showElement('error-area');
+}
+
+function clearError() {
+    var el = $('error-container');
+    el.innerHTML = '';
+    MochiKit.DOM.hideElement('error-area');
+}
+
+function expandInput(button) {
+    var input = button.form.elements.input;
+    stdops = {
+        name: 'input',
+        style: 'width: 100%',
+        autocomplete: 'off'
+    };
+    if (input.tagName == 'INPUT') {
+        var newEl = MochiKit.DOM.TEXTAREA(stdops);
+        var text = 'Contract';
+    } else {
+        stdops['type'] = 'text';
+        stdops['onkeypress'] = 'upArrow(this)';
+        var newEl = MochiKit.DOM.INPUT(stdops);
+        var text = 'Expand';
+    }
+    newEl.value = input.value;
+    newEl.id = input.id;
+    MochiKit.DOM.swapDOM(input, newEl);
+    newEl.focus();
+    button.value = text;
+    return false;
+}
+
+function upArrow(input, event) {
+    if (window.event) {
+        event = window.event;
+    }
+    if (event.keyCode != 38 && event.keyCode != 40) {
+        // not an up- or down-arrow
+        return true;
+    }
+    var dir = event.keyCode == 38 ? 1 : -1;
+    var history = input.form.history;
+    if (! history) {
+        history = input.form.history = [];
+    }
+    var pos = input.historyPosition || 0;
+    if (! pos && dir == -1) {
+        return true;
+    }
+    if (! pos && input.value) {
+        history.push(input.value);
+        pos = 1;
+    }
+    pos += dir;
+    if (history.length-pos < 0) {
+        pos = 1;
+    }
+    if (history.length-pos > history.length-1) {
+        input.value = '';
+        return true;
+    }
+    input.historyPosition = pos;
+    var line = history[history.length-pos];
+    input.value = line;
+}
+
+function expandLong(anchor) {
+    var span = anchor;
+    while (span) {
+        if (span.style && span.style.display == 'none') {
+            break;
+        }
+        span = span.nextSibling;
+    }
+    if (! span) {
+        return false;
+    }
+    MochiKit.DOM.showElement(span);
+    MochiKit.DOM.hideElement(anchor);
+    return false;
+}
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/evalexception/evalcontext.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/evalexception/evalcontext.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/evalexception/evalcontext.py (revision 3)
@@ -0,0 +1,68 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+from cStringIO import StringIO
+import traceback
+import threading
+import pdb
+import sys
+
+exec_lock = threading.Lock()
+
+class EvalContext(object):
+
+    """
+    Class that represents a interactive interface.  It has its own
+    namespace.  Use eval_context.exec_expr(expr) to run commands; the
+    output of those commands is returned, as are print statements.
+
+    This is essentially what doctest does, and is taken directly from
+    doctest.
+    """
+
+    def __init__(self, namespace, globs):
+        self.namespace = namespace
+        self.globs = globs
+
+    def exec_expr(self, s):
+        out = StringIO()
+        exec_lock.acquire()
+        save_stdout = sys.stdout
+        try:
+            debugger = _OutputRedirectingPdb(save_stdout)
+            debugger.reset()
+            pdb.set_trace = debugger.set_trace
+            sys.stdout = out
+            try:
+                code = compile(s, '<web>', "single", 0, 1)
+                exec code in self.namespace, self.globs
+                debugger.set_continue()
+            except KeyboardInterrupt:
+                raise
+            except:
+                traceback.print_exc(file=out)
+                debugger.set_continue()
+        finally:
+            sys.stdout = save_stdout
+            exec_lock.release()
+        return out.getvalue()
+
+# From doctest
+class _OutputRedirectingPdb(pdb.Pdb):
+    """
+    A specialized version of the python debugger that redirects stdout
+    to a given stream when interacting with the user.  Stdout is *not*
+    redirected when traced code is executed.
+    """
+    def __init__(self, out):
+        self.__out = out
+        pdb.Pdb.__init__(self)
+
+    def trace_dispatch(self, *args):
+        # Redirect stdout to the given stream.
+        save_stdout = sys.stdout
+        sys.stdout = self.__out
+        # Call Pdb's trace dispatch method.
+        try:
+            return pdb.Pdb.trace_dispatch(self, *args)
+        finally:
+            sys.stdout = save_stdout
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/evalexception/middleware.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/evalexception/middleware.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/evalexception/middleware.py (revision 3)
@@ -0,0 +1,611 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+"""
+Exception-catching middleware that allows interactive debugging.
+
+This middleware catches all unexpected exceptions.  A normal
+traceback, like produced by
+``paste.exceptions.errormiddleware.ErrorMiddleware`` is given, plus
+controls to see local variables and evaluate expressions in a local
+context.
+
+This can only be used in single-process environments, because
+subsequent requests must go back to the same process that the
+exception originally occurred in.  Threaded or non-concurrent
+environments both work.
+
+This shouldn't be used in production in any way.  That would just be
+silly.
+
+If calling from an XMLHttpRequest call, if the GET variable ``_`` is
+given then it will make the response more compact (and less
+Javascripty), since if you use innerHTML it'll kill your browser.  You
+can look for the header X-Debug-URL in your 500 responses if you want
+to see the full debuggable traceback.  Also, this URL is printed to
+``wsgi.errors``, so you can open it up in another browser window.
+"""
+import sys
+import os
+import cgi
+import traceback
+from cStringIO import StringIO
+import pprint
+import itertools
+import time
+import re
+from paste.exceptions import errormiddleware, formatter, collector
+from paste import wsgilib
+from paste import urlparser
+from paste import httpexceptions
+from paste import registry
+from paste import request
+from paste import response
+import evalcontext
+
+limit = 200
+
+def html_quote(v):
+    """
+    Escape HTML characters, plus translate None to ''
+    """
+    if v is None:
+        return ''
+    return cgi.escape(str(v), 1)
+
+def preserve_whitespace(v, quote=True):
+    """
+    Quote a value for HTML, preserving whitespace (translating
+    newlines to ``<br>`` and multiple spaces to use ``&nbsp;``).
+
+    If ``quote`` is true, then the value will be HTML quoted first.
+    """
+    if quote:
+        v = html_quote(v)
+    v = v.replace('\n', '<br>\n')
+    v = re.sub(r'()(  +)', _repl_nbsp, v)
+    v = re.sub(r'(\n)( +)', _repl_nbsp, v)
+    v = re.sub(r'^()( +)', _repl_nbsp, v)
+    return '<code>%s</code>' % v
+
+def _repl_nbsp(match):
+    if len(match.group(2)) == 1:
+        return '&nbsp;'
+    return match.group(1) + '&nbsp;' * (len(match.group(2))-1) + ' '
+
+def simplecatcher(application):
+    """
+    A simple middleware that catches errors and turns them into simple
+    tracebacks.
+    """
+    def simplecatcher_app(environ, start_response):
+        try:
+            return application(environ, start_response)
+        except:
+            out = StringIO()
+            traceback.print_exc(file=out)
+            start_response('500 Server Error',
+                           [('content-type', 'text/html')],
+                           sys.exc_info())
+            res = out.getvalue()
+            return ['<h3>Error</h3><pre>%s</pre>'
+                    % html_quote(res)]
+    return simplecatcher_app
+
+def wsgiapp():
+    """
+    Turns a function or method into a WSGI application.
+    """
+    def decorator(func):
+        def wsgiapp_wrapper(*args):
+            # we get 3 args when this is a method, two when it is
+            # a function :(
+            if len(args) == 3:
+                environ = args[1]
+                start_response = args[2]
+                args = [args[0]]
+            else:
+                environ, start_response = args
+                args = []
+            def application(environ, start_response):
+                form = wsgilib.parse_formvars(environ,
+                                              include_get_vars=True)
+                headers = response.HeaderDict(
+                    {'content-type': 'text/html',
+                     'status': '200 OK'})
+                form['environ'] = environ
+                form['headers'] = headers
+                res = func(*args, **form.mixed())
+                status = headers.pop('status')
+                start_response(status, headers.headeritems())
+                return [res]
+            app = httpexceptions.make_middleware(application)
+            app = simplecatcher(app)
+            return app(environ, start_response)
+        wsgiapp_wrapper.exposed = True
+        return wsgiapp_wrapper
+    return decorator
+
+def get_debug_info(func):
+    """
+    A decorator (meant to be used under ``wsgiapp()``) that resolves
+    the ``debugcount`` variable to a ``DebugInfo`` object (or gives an
+    error if it can't be found).
+    """
+    def debug_info_replacement(self, **form):
+        try:
+            if 'debugcount' not in form:
+                raise ValueError('You must provide a debugcount parameter')
+            debugcount = form.pop('debugcount')
+            try:
+                debugcount = int(debugcount)
+            except ValueError:
+                raise ValueError('Bad value for debugcount')
+            if debugcount not in self.debug_infos:
+                raise ValueError(
+                    'Debug %s no longer found (maybe it has expired?)'
+                    % debugcount)
+            debug_info = self.debug_infos[debugcount]
+            return func(self, debug_info=debug_info, **form)
+        except ValueError, e:
+            form['headers']['status'] = '500 Server Error'
+            return '<html>There was an error: %s</html>' % html_quote(e)
+    return debug_info_replacement
+            
+debug_counter = itertools.count(int(time.time()))
+def get_debug_count(environ):
+    """
+    Return the unique debug count for the current request
+    """
+    if 'paste.evalexception.debug_count' in environ:
+        return environ['paste.evalexception.debug_count']
+    else:
+        environ['paste.evalexception.debug_count'] = next = debug_counter.next()
+        return next
+
+class EvalException(object):
+
+    def __init__(self, application, global_conf=None,
+                 xmlhttp_key=None):
+        self.application = application
+        self.debug_infos = {}
+        if xmlhttp_key is None:
+            if global_conf is None:
+                xmlhttp_key = '_'
+            else:
+                xmlhttp_key = global_conf.get('xmlhttp_key', '_')
+        self.xmlhttp_key = xmlhttp_key
+
+    def __call__(self, environ, start_response):
+        assert not environ['wsgi.multiprocess'], (
+            "The EvalException middleware is not usable in a "
+            "multi-process environment")
+        environ['paste.evalexception'] = self
+        if environ.get('PATH_INFO', '').startswith('/_debug/'):
+            return self.debug(environ, start_response)
+        else:
+            return self.respond(environ, start_response)
+
+    def debug(self, environ, start_response):
+        assert request.path_info_pop(environ) == '_debug'
+        next_part = request.path_info_pop(environ)
+        method = getattr(self, next_part, None)
+        if not method:
+            exc = httpexceptions.HTTPNotFound(
+                '%r not found when parsing %r'
+                % (next_part, wsgilib.construct_url(environ)))
+            return exc.wsgi_application(environ, start_response)
+        if not getattr(method, 'exposed', False):
+            exc = httpexceptions.HTTPForbidden(
+                '%r not allowed' % next_part)
+            return exc.wsgi_application(environ, start_response)
+        return method(environ, start_response)
+
+    def media(self, environ, start_response):
+        """
+        Static path where images and other files live
+        """
+        app = urlparser.StaticURLParser(
+            os.path.join(os.path.dirname(__file__), 'media'))
+        return app(environ, start_response)
+    media.exposed = True
+
+    def mochikit(self, environ, start_response):
+        """
+        Static path where MochiKit lives
+        """
+        app = urlparser.StaticURLParser(
+            os.path.join(os.path.dirname(__file__), 'mochikit'))
+        return app(environ, start_response)
+    mochikit.exposed = True
+
+    def summary(self, environ, start_response):
+        """
+        Returns a JSON-format summary of all the cached
+        exception reports
+        """
+        start_response('200 OK', [('Content-type', 'text/x-json')])
+        data = [];
+        items = self.debug_infos.values()
+        items.sort(lambda a, b: cmp(a.created, b.created))
+        data = [item.json() for item in items]
+        return [repr(data)]
+    summary.exposed = True
+
+    def view(self, environ, start_response):
+        """
+        View old exception reports
+        """
+        id = int(request.path_info_pop(environ))
+        if id not in self.debug_infos:
+            start_response(
+                '500 Server Error',
+                [('Content-type', 'text/html')])
+            return [
+                "Traceback by id %s does not exist (maybe "
+                "the server has been restarted?)"
+                % id]
+        debug_info = self.debug_infos[id]
+        return debug_info.wsgi_application(environ, start_response)
+    view.exposed = True
+
+    def make_view_url(self, environ, base_path, count):
+        return base_path + '/_debug/view/%s' % count
+
+    #@wsgiapp()
+    #@get_debug_info
+    def show_frame(self, tbid, debug_info, **kw):
+        frame = debug_info.frame(int(tbid))
+        vars = frame.tb_frame.f_locals
+        if vars:
+            registry.restorer.restoration_begin(debug_info.counter)
+            local_vars = make_table(vars)
+            registry.restorer.restoration_end()
+        else:
+            local_vars = 'No local vars'
+        return input_form(tbid, debug_info) + local_vars
+
+    show_frame = wsgiapp()(get_debug_info(show_frame))
+
+    #@wsgiapp()
+    #@get_debug_info
+    def exec_input(self, tbid, debug_info, input, **kw):
+        if not input.strip():
+            return ''
+        input = input.rstrip() + '\n'
+        frame = debug_info.frame(int(tbid))
+        vars = frame.tb_frame.f_locals
+        glob_vars = frame.tb_frame.f_globals
+        context = evalcontext.EvalContext(vars, glob_vars)
+        registry.restorer.restoration_begin(debug_info.counter)
+        output = context.exec_expr(input)
+        registry.restorer.restoration_end()
+        input_html = formatter.str2html(input)
+        return ('<code style="color: #060">&gt;&gt;&gt;</code> '
+                '<code>%s</code><br>\n%s'
+                % (preserve_whitespace(input_html, quote=False),
+                   preserve_whitespace(output)))
+
+    exec_input = wsgiapp()(get_debug_info(exec_input))
+
+    def respond(self, environ, start_response):
+        if environ.get('paste.throw_errors'):
+            return self.application(environ, start_response)
+        base_path = request.construct_url(environ, with_path_info=False,
+                                          with_query_string=False)
+        environ['paste.throw_errors'] = True
+        started = []
+        def detect_start_response(status, headers, exc_info=None):
+            try:
+                return start_response(status, headers, exc_info)
+            except:
+                raise
+            else:
+                started.append(True)
+        try:
+            __traceback_supplement__ = errormiddleware.Supplement, self, environ
+            app_iter = self.application(environ, detect_start_response)
+            try:
+                return_iter = list(app_iter)
+                return return_iter
+            finally:
+                if hasattr(app_iter, 'close'):
+                    app_iter.close()
+        except:
+            exc_info = sys.exc_info()
+            for expected in environ.get('paste.expected_exceptions', []):
+                if isinstance(exc_info[1], expected):
+                    raise
+
+            # Tell the Registry to save its StackedObjectProxies current state
+            # for later restoration
+            registry.restorer.save_registry_state(environ)
+
+            count = get_debug_count(environ)
+            view_uri = self.make_view_url(environ, base_path, count)
+            if not started:
+                headers = [('content-type', 'text/html')]
+                headers.append(('X-Debug-URL', view_uri))
+                start_response('500 Internal Server Error',
+                               headers,
+                               exc_info)
+            environ['wsgi.errors'].write('Debug at: %s\n' % view_uri)
+
+            exc_data = collector.collect_exception(*exc_info)
+            debug_info = DebugInfo(count, exc_info, exc_data, base_path,
+                                   environ, view_uri)
+            assert count not in self.debug_infos
+            self.debug_infos[count] = debug_info
+
+            if self.xmlhttp_key:
+                get_vars = wsgilib.parse_querystring(environ)
+                if dict(get_vars).get(self.xmlhttp_key):
+                    exc_data = collector.collect_exception(*exc_info)
+                    html = formatter.format_html(
+                        exc_data, include_hidden_frames=False,
+                        include_reusable=False, show_extra_data=False)
+                    return [html]
+
+            # @@: it would be nice to deal with bad content types here
+            return debug_info.content()
+
+    def exception_handler(self, exc_info, environ):
+        simple_html_error = False
+        if self.xmlhttp_key:
+            get_vars = wsgilib.parse_querystring(environ)
+            if dict(get_vars).get(self.xmlhttp_key):
+                simple_html_error = True
+        return errormiddleware.handle_exception(
+            exc_info, environ['wsgi.errors'],
+            html=True,
+            debug_mode=True,
+            simple_html_error=simple_html_error)
+
+class DebugInfo(object):
+
+    def __init__(self, counter, exc_info, exc_data, base_path,
+                 environ, view_uri):
+        self.counter = counter
+        self.exc_data = exc_data
+        self.base_path = base_path
+        self.environ = environ
+        self.view_uri = view_uri
+        self.created = time.time()
+        self.exc_type, self.exc_value, self.tb = exc_info
+        __exception_formatter__ = 1
+        self.frames = []
+        n = 0
+        tb = self.tb
+        while tb is not None and (limit is None or n < limit):
+            if tb.tb_frame.f_locals.get('__exception_formatter__'):
+                # Stop recursion. @@: should make a fake ExceptionFrame
+                break
+            self.frames.append(tb)
+            tb = tb.tb_next
+            n += 1
+
+    def json(self):
+        """Return the JSON-able representation of this object"""
+        return {
+            'uri': self.view_uri,
+            'created': time.strftime('%c', time.gmtime(self.created)),
+            'created_timestamp': self.created,
+            'exception_type': str(self.exc_type),
+            'exception': str(self.exc_value),
+            }
+
+    def frame(self, tbid):
+        for frame in self.frames:
+            if id(frame) == tbid:
+                return frame
+        else:
+            raise ValueError, (
+                "No frame by id %s found from %r" % (tbid, self.frames))
+
+    def wsgi_application(self, environ, start_response):
+        start_response('200 OK', [('content-type', 'text/html')])
+        return self.content()
+
+    def content(self):
+        html = format_eval_html(self.exc_data, self.base_path, self.counter)
+        head_html = (formatter.error_css + formatter.hide_display_js)
+        head_html += self.eval_javascript()
+        repost_button = make_repost_button(self.environ)
+        page = error_template % {
+            'repost_button': repost_button or '',
+            'head_html': head_html,
+            'body': html}
+        return [page]
+
+    def eval_javascript(self):
+        base_path = self.base_path + '/_debug'
+        return (
+            '<script type="text/javascript" src="%s/mochikit/MochiKit.js">'
+            '</script>\n'
+            '<script type="text/javascript" src="%s/media/debug.js">'
+            '</script>\n'
+            '<script type="text/javascript">\n'
+            'debug_base = %r;\n'
+            'debug_count = %r;\n'
+            '</script>\n'
+            % (base_path, base_path, base_path, self.counter))
+
+class EvalHTMLFormatter(formatter.HTMLFormatter):
+
+    def __init__(self, base_path, counter, **kw):
+        super(EvalHTMLFormatter, self).__init__(**kw)
+        self.base_path = base_path
+        self.counter = counter
+    
+    def format_source_line(self, filename, frame):
+        line = formatter.HTMLFormatter.format_source_line(
+            self, filename, frame)
+        return (line +
+                '  <a href="#" class="switch_source" '
+                'tbid="%s" onClick="return showFrame(this)">&nbsp; &nbsp; '
+                '<img src="%s/_debug/media/plus.jpg" border=0 width=9 '
+                'height=9> &nbsp; &nbsp;</a>'
+                % (frame.tbid, self.base_path))
+
+def make_table(items):
+    if isinstance(items, dict):
+        items = items.items()
+        items.sort()
+    rows = []
+    i = 0
+    for name, value in items:
+        i += 1
+        out = StringIO()
+        try:
+            pprint.pprint(value, out)
+        except Exception, e:
+            print >> out, 'Error: %s' % e
+        value = html_quote(out.getvalue())
+        if len(value) > 100:
+            # @@: This can actually break the HTML :(
+            # should I truncate before quoting?
+            orig_value = value
+            value = value[:100]
+            value += '<a class="switch_source" style="background-color: #999" href="#" onclick="return expandLong(this)">...</a>'
+            value += '<span style="display: none">%s</span>' % orig_value[100:]
+        value = formatter.make_wrappable(value)
+        if i % 2:
+            attr = ' class="even"'
+        else:
+            attr = ' class="odd"'
+        rows.append('<tr%s style="vertical-align: top;"><td>'
+                    '<b>%s</b></td><td style="overflow: auto">%s<td></tr>'
+                    % (attr, html_quote(name),
+                       preserve_whitespace(value, quote=False)))
+    return '<table>%s</table>' % (
+        '\n'.join(rows))
+
+def format_eval_html(exc_data, base_path, counter):
+    short_formatter = EvalHTMLFormatter(
+        base_path=base_path,
+        counter=counter,
+        include_reusable=False)
+    short_er = short_formatter.format_collected_data(exc_data)
+    long_formatter = EvalHTMLFormatter(
+        base_path=base_path,
+        counter=counter,
+        show_hidden_frames=True,
+        show_extra_data=False,
+        include_reusable=False)
+    long_er = long_formatter.format_collected_data(exc_data)
+    text_er = formatter.format_text(exc_data, show_hidden_frames=True)
+    if short_formatter.filter_frames(exc_data.frames) != \
+        long_formatter.filter_frames(exc_data.frames):
+        # Only display the full traceback when it differs from the
+        # short version
+        full_traceback_html = """
+    <br>
+    <script type="text/javascript">
+    show_button('full_traceback', 'full traceback')
+    </script>
+    <div id="full_traceback" class="hidden-data">
+    %s
+    </div>
+        """ % long_er
+    else:
+        full_traceback_html = ''
+    
+    return """
+    %s
+    %s
+    <br>
+    <script type="text/javascript">
+    show_button('text_version', 'text version')
+    </script>
+    <div id="text_version" class="hidden-data">
+    <textarea style="width: 100%%" rows=10 cols=60>%s</textarea>
+    </div>
+    """ % (short_er, full_traceback_html, cgi.escape(text_er))
+
+def make_repost_button(environ):
+    url = request.construct_url(environ)
+    if environ['REQUEST_METHOD'] == 'GET':
+        return ('<button onclick="window.location.href=%r">'
+                'Re-GET Page</button><br>' % url)
+    else:
+        # @@: I'd like to reconstruct this, but I can't because
+        # the POST body is probably lost at this point, and
+        # I can't get it back :(
+        return None
+    # @@: Use or lose the following code block
+    """
+    fields = []
+    for name, value in wsgilib.parse_formvars(
+        environ, include_get_vars=False).items():
+        if hasattr(value, 'filename'):
+            # @@: Arg, we'll just submit the body, and leave out
+            # the filename :(
+            value = value.value
+        fields.append(
+            '<input type="hidden" name="%s" value="%s">'
+            % (html_quote(name), html_quote(value)))
+    return '''
+<form action="%s" method="POST">
+%s
+<input type="submit" value="Re-POST Page">
+</form>''' % (url, '\n'.join(fields))
+"""
+    
+
+def input_form(tbid, debug_info):
+    return '''
+<form action="#" method="POST"
+ onsubmit="return submitInput($(\'submit_%(tbid)s\'), %(tbid)s)">
+<div id="exec-output-%(tbid)s" style="width: 95%%;
+ padding: 5px; margin: 5px; border: 2px solid #000;
+ display: none"></div>
+<input type="text" name="input" id="debug_input_%(tbid)s"
+ style="width: 100%%"
+ autocomplete="off" onkeypress="upArrow(this, event)"><br>
+<input type="submit" value="Execute" name="submitbutton"
+ onclick="return submitInput(this, %(tbid)s)"
+ id="submit_%(tbid)s"
+ input-from="debug_input_%(tbid)s"
+ output-to="exec-output-%(tbid)s">
+<input type="submit" value="Expand"
+ onclick="return expandInput(this)">
+</form>
+ ''' % {'tbid': tbid}
+
+error_template = '''
+<html>
+<head>
+ <title>Server Error</title>
+ %(head_html)s
+</head>
+<body>
+
+<div id="error-area" style="display: none; background-color: #600; color: #fff; border: 2px solid black">
+<div id="error-container"></div>
+<button onclick="return clearError()">clear this</button>
+</div>
+
+%(repost_button)s
+
+%(body)s
+
+</body>
+</html>
+'''
+
+def make_eval_exception(app, global_conf, xmlhttp_key=None):
+    """
+    Wraps the application in an interactive debugger.
+
+    This debugger is a major security hole, and should only be
+    used during development.
+
+    xmlhttp_key is a string that, if present in QUERY_STRING,
+    indicates that the request is an XMLHttp request, and the
+    Javascript/interactive debugger should not be returned.  (If you
+    try to put the debugger somewhere with innerHTML, you will often
+    crash the browser)
+    """
+    if xmlhttp_key is None:
+        xmlhttp_key = global_conf.get('xmlhttp_key', '_')
+    return EvalException(app, xmlhttp_key=xmlhttp_key)
+
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/evalexception/__init__.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/evalexception/__init__.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/evalexception/__init__.py (revision 3)
@@ -0,0 +1,7 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+"""
+An exception handler for interactive debugging
+"""
+from paste.evalexception.middleware import EvalException
+
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/evalexception/mochikit/MochiKit.js
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/evalexception/mochikit/MochiKit.js (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/evalexception/mochikit/MochiKit.js (revision 3)
@@ -0,0 +1,4802 @@
+/***
+
+    MochiKit.MochiKit 1.3.1 : PACKED VERSION
+
+    THIS FILE IS AUTOMATICALLY GENERATED.  If creating patches, please
+    diff against the source tree, not this file.
+
+    See <http://mochikit.com/> for documentation, downloads, license, etc.
+
+    (c) 2005 Bob Ippolito.  All rights Reserved.
+
+***/
+
+if(typeof (dojo)!="undefined"){
+dojo.provide("MochiKit.Base");
+}
+if(typeof (MochiKit)=="undefined"){
+MochiKit={};
+}
+if(typeof (MochiKit.Base)=="undefined"){
+MochiKit.Base={};
+}
+MochiKit.Base.VERSION="1.3.1";
+MochiKit.Base.NAME="MochiKit.Base";
+MochiKit.Base.update=function(_1,_2){
+if(_1===null){
+_1={};
+}
+for(var i=1;i<arguments.length;i++){
+var o=arguments[i];
+if(typeof (o)!="undefined"&&o!==null){
+for(var k in o){
+_1[k]=o[k];
+}
+}
+}
+return _1;
+};
+MochiKit.Base.update(MochiKit.Base,{__repr__:function(){
+return "["+this.NAME+" "+this.VERSION+"]";
+},toString:function(){
+return this.__repr__();
+},counter:function(n){
+if(arguments.length===0){
+n=1;
+}
+return function(){
+return n++;
+};
+},clone:function(_7){
+var me=arguments.callee;
+if(arguments.length==1){
+me.prototype=_7;
+return new me();
+}
+},flattenArguments:function(_9){
+var res=[];
+var m=MochiKit.Base;
+var _12=m.extend(null,arguments);
+while(_12.length){
+var o=_12.shift();
+if(o&&typeof (o)=="object"&&typeof (o.length)=="number"){
+for(var i=o.length-1;i>=0;i--){
+_12.unshift(o[i]);
+}
+}else{
+res.push(o);
+}
+}
+return res;
+},extend:function(_13,obj,_15){
+if(!_15){
+_15=0;
+}
+if(obj){
+var l=obj.length;
+if(typeof (l)!="number"){
+if(typeof (MochiKit.Iter)!="undefined"){
+obj=MochiKit.Iter.list(obj);
+l=obj.length;
+}else{
+throw new TypeError("Argument not an array-like and MochiKit.Iter not present");
+}
+}
+if(!_13){
+_13=[];
+}
+for(var i=_15;i<l;i++){
+_13.push(obj[i]);
+}
+}
+return _13;
+},updatetree:function(_17,obj){
+if(_17===null){
+_17={};
+}
+for(var i=1;i<arguments.length;i++){
+var o=arguments[i];
+if(typeof (o)!="undefined"&&o!==null){
+for(var k in o){
+var v=o[k];
+if(typeof (_17[k])=="object"&&typeof (v)=="object"){
+arguments.callee(_17[k],v);
+}else{
+_17[k]=v;
+}
+}
+}
+}
+return _17;
+},setdefault:function(_19,obj){
+if(_19===null){
+_19={};
+}
+for(var i=1;i<arguments.length;i++){
+var o=arguments[i];
+for(var k in o){
+if(!(k in _19)){
+_19[k]=o[k];
+}
+}
+}
+return _19;
+},keys:function(obj){
+var _20=[];
+for(var _21 in obj){
+_20.push(_21);
+}
+return _20;
+},items:function(obj){
+var _22=[];
+var e;
+for(var _24 in obj){
+var v;
+try{
+v=obj[_24];
+}
+catch(e){
+continue;
+}
+_22.push([_24,v]);
+}
+return _22;
+},_newNamedError:function(_25,_26,_27){
+_27.prototype=new MochiKit.Base.NamedError(_25.NAME+"."+_26);
+_25[_26]=_27;
+},operator:{truth:function(a){
+return !!a;
+},lognot:function(a){
+return !a;
+},identity:function(a){
+return a;
+},not:function(a){
+return ~a;
+},neg:function(a){
+return -a;
+},add:function(a,b){
+return a+b;
+},sub:function(a,b){
+return a-b;
+},div:function(a,b){
+return a/b;
+},mod:function(a,b){
+return a%b;
+},mul:function(a,b){
+return a*b;
+},and:function(a,b){
+return a&b;
+},or:function(a,b){
+return a|b;
+},xor:function(a,b){
+return a^b;
+},lshift:function(a,b){
+return a<<b;
+},rshift:function(a,b){
+return a>>b;
+},zrshift:function(a,b){
+return a>>>b;
+},eq:function(a,b){
+return a==b;
+},ne:function(a,b){
+return a!=b;
+},gt:function(a,b){
+return a>b;
+},ge:function(a,b){
+return a>=b;
+},lt:function(a,b){
+return a<b;
+},le:function(a,b){
+return a<=b;
+},ceq:function(a,b){
+return MochiKit.Base.compare(a,b)===0;
+},cne:function(a,b){
+return MochiKit.Base.compare(a,b)!==0;
+},cgt:function(a,b){
+return MochiKit.Base.compare(a,b)==1;
+},cge:function(a,b){
+return MochiKit.Base.compare(a,b)!=-1;
+},clt:function(a,b){
+return MochiKit.Base.compare(a,b)==-1;
+},cle:function(a,b){
+return MochiKit.Base.compare(a,b)!=1;
+},logand:function(a,b){
+return a&&b;
+},logor:function(a,b){
+return a||b;
+},contains:function(a,b){
+return b in a;
+}},forwardCall:function(_30){
+return function(){
+return this[_30].apply(this,arguments);
+};
+},itemgetter:function(_31){
+return function(arg){
+return arg[_31];
+};
+},typeMatcher:function(){
+var _33={};
+for(var i=0;i<arguments.length;i++){
+var typ=arguments[i];
+_33[typ]=typ;
+}
+return function(){
+for(var i=0;i<arguments.length;i++){
+if(!(typeof (arguments[i]) in _33)){
+return false;
+}
+}
+return true;
+};
+},isNull:function(){
+for(var i=0;i<arguments.length;i++){
+if(arguments[i]!==null){
+return false;
+}
+}
+return true;
+},isUndefinedOrNull:function(){
+for(var i=0;i<arguments.length;i++){
+var o=arguments[i];
+if(!(typeof (o)=="undefined"||o===null)){
+return false;
+}
+}
+return true;
+},isEmpty:function(obj){
+return !MochiKit.Base.isNotEmpty.apply(this,arguments);
+},isNotEmpty:function(obj){
+for(var i=0;i<arguments.length;i++){
+var o=arguments[i];
+if(!(o&&o.length)){
+return false;
+}
+}
+return true;
+},isArrayLike:function(){
+for(var i=0;i<arguments.length;i++){
+var o=arguments[i];
+var typ=typeof (o);
+if((typ!="object"&&!(typ=="function"&&typeof (o.item)=="function"))||o===null||typeof (o.length)!="number"){
+return false;
+}
+}
+return true;
+},isDateLike:function(){
+for(var i=0;i<arguments.length;i++){
+var o=arguments[i];
+if(typeof (o)!="object"||o===null||typeof (o.getTime)!="function"){
+return false;
+}
+}
+return true;
+},xmap:function(fn){
+if(fn===null){
+return MochiKit.Base.extend(null,arguments,1);
+}
+var _36=[];
+for(var i=1;i<arguments.length;i++){
+_36.push(fn(arguments[i]));
+}
+return _36;
+},map:function(fn,lst){
+var m=MochiKit.Base;
+var itr=MochiKit.Iter;
+var _39=m.isArrayLike;
+if(arguments.length<=2){
+if(!_39(lst)){
+if(itr){
+lst=itr.list(lst);
+if(fn===null){
+return lst;
+}
+}else{
+throw new TypeError("Argument not an array-like and MochiKit.Iter not present");
+}
+}
+if(fn===null){
+return m.extend(null,lst);
+}
+var _40=[];
+for(var i=0;i<lst.length;i++){
+_40.push(fn(lst[i]));
+}
+return _40;
+}else{
+if(fn===null){
+fn=Array;
+}
+var _41=null;
+for(i=1;i<arguments.length;i++){
+if(!_39(arguments[i])){
+if(itr){
+return itr.list(itr.imap.apply(null,arguments));
+}else{
+throw new TypeError("Argument not an array-like and MochiKit.Iter not present");
+}
+}
+var l=arguments[i].length;
+if(_41===null||_41>l){
+_41=l;
+}
+}
+_40=[];
+for(i=0;i<_41;i++){
+var _42=[];
+for(var j=1;j<arguments.length;j++){
+_42.push(arguments[j][i]);
+}
+_40.push(fn.apply(this,_42));
+}
+return _40;
+}
+},xfilter:function(fn){
+var _44=[];
+if(fn===null){
+fn=MochiKit.Base.operator.truth;
+}
+for(var i=1;i<arguments.length;i++){
+var o=arguments[i];
+if(fn(o)){
+_44.push(o);
+}
+}
+return _44;
+},filter:function(fn,lst,_45){
+var _46=[];
+var m=MochiKit.Base;
+if(!m.isArrayLike(lst)){
+if(MochiKit.Iter){
+lst=MochiKit.Iter.list(lst);
+}else{
+throw new TypeError("Argument not an array-like and MochiKit.Iter not present");
+}
+}
+if(fn===null){
+fn=m.operator.truth;
+}
+if(typeof (Array.prototype.filter)=="function"){
+return Array.prototype.filter.call(lst,fn,_45);
+}else{
+if(typeof (_45)=="undefined"||_45===null){
+for(var i=0;i<lst.length;i++){
+var o=lst[i];
+if(fn(o)){
+_46.push(o);
+}
+}
+}else{
+for(i=0;i<lst.length;i++){
+o=lst[i];
+if(fn.call(_45,o)){
+_46.push(o);
+}
+}
+}
+}
+return _46;
+},_wrapDumbFunction:function(_47){
+return function(){
+switch(arguments.length){
+case 0:
+return _47();
+case 1:
+return _47(arguments[0]);
+case 2:
+return _47(arguments[0],arguments[1]);
+case 3:
+return _47(arguments[0],arguments[1],arguments[2]);
+}
+var _48=[];
+for(var i=0;i<arguments.length;i++){
+_48.push("arguments["+i+"]");
+}
+return eval("(func("+_48.join(",")+"))");
+};
+},method:function(_49,_50){
+var m=MochiKit.Base;
+return m.bind.apply(this,m.extend([_50,_49],arguments,2));
+},bind:function(_51,_52){
+if(typeof (_51)=="string"){
+_51=_52[_51];
+}
+var _53=_51.im_func;
+var _54=_51.im_preargs;
+var _55=_51.im_self;
+var m=MochiKit.Base;
+if(typeof (_51)=="function"&&typeof (_51.apply)=="undefined"){
+_51=m._wrapDumbFunction(_51);
+}
+if(typeof (_53)!="function"){
+_53=_51;
+}
+if(typeof (_52)!="undefined"){
+_55=_52;
+}
+if(typeof (_54)=="undefined"){
+_54=[];
+}else{
+_54=_54.slice();
+}
+m.extend(_54,arguments,2);
+var _56=function(){
+var _57=arguments;
+var me=arguments.callee;
+if(me.im_preargs.length>0){
+_57=m.concat(me.im_preargs,_57);
+}
+var _52=me.im_self;
+if(!_52){
+_52=this;
+}
+return me.im_func.apply(_52,_57);
+};
+_56.im_self=_55;
+_56.im_func=_53;
+_56.im_preargs=_54;
+return _56;
+},bindMethods:function(_58){
+var _59=MochiKit.Base.bind;
+for(var k in _58){
+var _60=_58[k];
+if(typeof (_60)=="function"){
+_58[k]=_59(_60,_58);
+}
+}
+},registerComparator:function(_61,_62,_63,_64){
+MochiKit.Base.comparatorRegistry.register(_61,_62,_63,_64);
+},_primitives:{"boolean":true,"string":true,"number":true},compare:function(a,b){
+if(a==b){
+return 0;
+}
+var _65=(typeof (a)=="undefined"||a===null);
+var _66=(typeof (b)=="undefined"||b===null);
+if(_65&&_66){
+return 0;
+}else{
+if(_65){
+return -1;
+}else{
+if(_66){
+return 1;
+}
+}
+}
+var m=MochiKit.Base;
+var _67=m._primitives;
+if(!(typeof (a) in _67&&typeof (b) in _67)){
+try{
+return m.comparatorRegistry.match(a,b);
+}
+catch(e){
+if(e!=m.NotFound){
+throw e;
+}
+}
+}
+if(a<b){
+return -1;
+}else{
+if(a>b){
+return 1;
+}
+}
+var _68=m.repr;
+throw new TypeError(_68(a)+" and "+_68(b)+" can not be compared");
+},compareDateLike:function(a,b){
+return MochiKit.Base.compare(a.getTime(),b.getTime());
+},compareArrayLike:function(a,b){
+var _69=MochiKit.Base.compare;
+var _70=a.length;
+var _71=0;
+if(_70>b.length){
+_71=1;
+_70=b.length;
+}else{
+if(_70<b.length){
+_71=-1;
+}
+}
+for(var i=0;i<_70;i++){
+var cmp=_69(a[i],b[i]);
+if(cmp){
+return cmp;
+}
+}
+return _71;
+},registerRepr:function(_73,_74,_75,_76){
+MochiKit.Base.reprRegistry.register(_73,_74,_75,_76);
+},repr:function(o){
+if(typeof (o)=="undefined"){
+return "undefined";
+}else{
+if(o===null){
+return "null";
+}
+}
+try{
+if(typeof (o.__repr__)=="function"){
+return o.__repr__();
+}else{
+if(typeof (o.repr)=="function"&&o.repr!=arguments.callee){
+return o.repr();
+}
+}
+return MochiKit.Base.reprRegistry.match(o);
+}
+catch(e){
+if(typeof (o.NAME)=="string"&&(o.toString==Function.prototype.toString||o.toString==Object.prototype.toString)){
+return o.NAME;
+}
+}
+try{
+var _77=(o+"");
+}
+catch(e){
+return "["+typeof (o)+"]";
+}
+if(typeof (o)=="function"){
+o=_77.replace(/^\s+/,"");
+var idx=o.indexOf("{");
+if(idx!=-1){
+o=o.substr(0,idx)+"{...}";
+}
+}
+return _77;
+},reprArrayLike:function(o){
+var m=MochiKit.Base;
+return "["+m.map(m.repr,o).join(", ")+"]";
+},reprString:function(o){
+return ("\""+o.replace(/(["\\])/g,"\\$1")+"\"").replace(/[\f]/g,"\\f").replace(/[\b]/g,"\\b").replace(/[\n]/g,"\\n").replace(/[\t]/g,"\\t").replace(/[\r]/g,"\\r");
+},reprNumber:function(o){
+return o+"";
+},registerJSON:function(_79,_80,_81,_82){
+MochiKit.Base.jsonRegistry.register(_79,_80,_81,_82);
+},evalJSON:function(){
+return eval("("+arguments[0]+")");
+},serializeJSON:function(o){
+var _83=typeof (o);
+if(_83=="undefined"){
+return "undefined";
+}else{
+if(_83=="number"||_83=="boolean"){
+return o+"";
+}else{
+if(o===null){
+return "null";
+}
+}
+}
+var m=MochiKit.Base;
+var _84=m.reprString;
+if(_83=="string"){
+return _84(o);
+}
+var me=arguments.callee;
+var _85;
+if(typeof (o.__json__)=="function"){
+_85=o.__json__();
+if(o!==_85){
+return me(_85);
+}
+}
+if(typeof (o.json)=="function"){
+_85=o.json();
+if(o!==_85){
+return me(_85);
+}
+}
+if(_83!="function"&&typeof (o.length)=="number"){
+var res=[];
+for(var i=0;i<o.length;i++){
+var val=me(o[i]);
+if(typeof (val)!="string"){
+val="undefined";
+}
+res.push(val);
+}
+return "["+res.join(", ")+"]";
+}
+try{
+_85=m.jsonRegistry.match(o);
+return me(_85);
+}
+catch(e){
+if(e!=m.NotFound){
+throw e;
+}
+}
+if(_83=="function"){
+return null;
+}
+res=[];
+for(var k in o){
+var _87;
+if(typeof (k)=="number"){
+_87="\""+k+"\"";
+}else{
+if(typeof (k)=="string"){
+_87=_84(k);
+}else{
+continue;
+}
+}
+val=me(o[k]);
+if(typeof (val)!="string"){
+continue;
+}
+res.push(_87+":"+val);
+}
+return "{"+res.join(", ")+"}";
+},objEqual:function(a,b){
+return (MochiKit.Base.compare(a,b)===0);
+},arrayEqual:function(_88,arr){
+if(_88.length!=arr.length){
+return false;
+}
+return (MochiKit.Base.compare(_88,arr)===0);
+},concat:function(){
+var _90=[];
+var _91=MochiKit.Base.extend;
+for(var i=0;i<arguments.length;i++){
+_91(_90,arguments[i]);
+}
+return _90;
+},keyComparator:function(key){
+var m=MochiKit.Base;
+var _93=m.compare;
+if(arguments.length==1){
+return function(a,b){
+return _93(a[key],b[key]);
+};
+}
+var _94=m.extend(null,arguments);
+return function(a,b){
+var _95=0;
+for(var i=0;(_95===0)&&(i<_94.length);i++){
+var key=_94[i];
+_95=_93(a[key],b[key]);
+}
+return _95;
+};
+},reverseKeyComparator:function(key){
+var _96=MochiKit.Base.keyComparator.apply(this,arguments);
+return function(a,b){
+return _96(b,a);
+};
+},partial:function(_97){
+var m=MochiKit.Base;
+return m.bind.apply(this,m.extend([_97,undefined],arguments,1));
+},listMinMax:function(_98,lst){
+if(lst.length===0){
+return null;
+}
+var cur=lst[0];
+var _100=MochiKit.Base.compare;
+for(var i=1;i<lst.length;i++){
+var o=lst[i];
+if(_100(o,cur)==_98){
+cur=o;
+}
+}
+return cur;
+},objMax:function(){
+return MochiKit.Base.listMinMax(1,arguments);
+},objMin:function(){
+return MochiKit.Base.listMinMax(-1,arguments);
+},findIdentical:function(lst,_101,_102,end){
+if(typeof (end)=="undefined"||end===null){
+end=lst.length;
+}
+for(var i=(_102||0);i<end;i++){
+if(lst[i]===_101){
+return i;
+}
+}
+return -1;
+},findValue:function(lst,_104,_105,end){
+if(typeof (end)=="undefined"||end===null){
+end=lst.length;
+}
+var cmp=MochiKit.Base.compare;
+for(var i=(_105||0);i<end;i++){
+if(cmp(lst[i],_104)===0){
+return i;
+}
+}
+return -1;
+},nodeWalk:function(node,_107){
+var _108=[node];
+var _109=MochiKit.Base.extend;
+while(_108.length){
+var res=_107(_108.shift());
+if(res){
+_109(_108,res);
+}
+}
+},nameFunctions:function(_110){
+var base=_110.NAME;
+if(typeof (base)=="undefined"){
+base="";
+}else{
+base=base+".";
+}
+for(var name in _110){
+var o=_110[name];
+if(typeof (o)=="function"&&typeof (o.NAME)=="undefined"){
+try{
+o.NAME=base+name;
+}
+catch(e){
+}
+}
+}
+},queryString:function(_113,_114){
+if(typeof (MochiKit.DOM)!="undefined"&&arguments.length==1&&(typeof (_113)=="string"||(typeof (_113.nodeType)!="undefined"&&_113.nodeType>0))){
+var kv=MochiKit.DOM.formContents(_113);
+_113=kv[0];
+_114=kv[1];
+}else{
+if(arguments.length==1){
+var o=_113;
+_113=[];
+_114=[];
+for(var k in o){
+var v=o[k];
+if(typeof (v)!="function"){
+_113.push(k);
+_114.push(v);
+}
+}
+}
+}
+var rval=[];
+var len=Math.min(_113.length,_114.length);
+var _118=MochiKit.Base.urlEncode;
+for(var i=0;i<len;i++){
+v=_114[i];
+if(typeof (v)!="undefined"&&v!==null){
+rval.push(_118(_113[i])+"="+_118(v));
+}
+}
+return rval.join("&");
+},parseQueryString:function(_119,_120){
+var _121=_119.replace(/\+/g,"%20").split("&");
+var o={};
+var _122;
+if(typeof (decodeURIComponent)!="undefined"){
+_122=decodeURIComponent;
+}else{
+_122=unescape;
+}
+if(_120){
+for(var i=0;i<_121.length;i++){
+var pair=_121[i].split("=");
+var name=_122(pair[0]);
+var arr=o[name];
+if(!(arr instanceof Array)){
+arr=[];
+o[name]=arr;
+}
+arr.push(_122(pair[1]));
+}
+}else{
+for(i=0;i<_121.length;i++){
+pair=_121[i].split("=");
+o[_122(pair[0])]=_122(pair[1]);
+}
+}
+return o;
+}});
+MochiKit.Base.AdapterRegistry=function(){
+this.pairs=[];
+};
+MochiKit.Base.AdapterRegistry.prototype={register:function(name,_124,wrap,_126){
+if(_126){
+this.pairs.unshift([name,_124,wrap]);
+}else{
+this.pairs.push([name,_124,wrap]);
+}
+},match:function(){
+for(var i=0;i<this.pairs.length;i++){
+var pair=this.pairs[i];
+if(pair[1].apply(this,arguments)){
+return pair[2].apply(this,arguments);
+}
+}
+throw MochiKit.Base.NotFound;
+},unregister:function(name){
+for(var i=0;i<this.pairs.length;i++){
+var pair=this.pairs[i];
+if(pair[0]==name){
+this.pairs.splice(i,1);
+return true;
+}
+}
+return false;
+}};
+MochiKit.Base.EXPORT=["counter","clone","extend","update","updatetree","setdefault","keys","items","NamedError","operator","forwardCall","itemgetter","typeMatcher","isCallable","isUndefined","isUndefinedOrNull","isNull","isEmpty","isNotEmpty","isArrayLike","isDateLike","xmap","map","xfilter","filter","bind","bindMethods","NotFound","AdapterRegistry","registerComparator","compare","registerRepr","repr","objEqual","arrayEqual","concat","keyComparator","reverseKeyComparator","partial","merge","listMinMax","listMax","listMin","objMax","objMin","nodeWalk","zip","urlEncode","queryString","serializeJSON","registerJSON","evalJSON","parseQueryString","findValue","findIdentical","flattenArguments","method"];
+MochiKit.Base.EXPORT_OK=["nameFunctions","comparatorRegistry","reprRegistry","jsonRegistry","compareDateLike","compareArrayLike","reprArrayLike","reprString","reprNumber"];
+MochiKit.Base._exportSymbols=function(_127,_128){
+if(typeof (MochiKit.__export__)=="undefined"){
+MochiKit.__export__=(MochiKit.__compat__||(typeof (JSAN)=="undefined"&&typeof (dojo)=="undefined"));
+}
+if(!MochiKit.__export__){
+return;
+}
+var all=_128.EXPORT_TAGS[":all"];
+for(var i=0;i<all.length;i++){
+_127[all[i]]=_128[all[i]];
+}
+};
+MochiKit.Base.__new__=function(){
+var m=this;
+m.forward=m.forwardCall;
+m.find=m.findValue;
+if(typeof (encodeURIComponent)!="undefined"){
+m.urlEncode=function(_130){
+return encodeURIComponent(_130).replace(/\'/g,"%27");
+};
+}else{
+m.urlEncode=function(_131){
+return escape(_131).replace(/\+/g,"%2B").replace(/\"/g,"%22").rval.replace(/\'/g,"%27");
+};
+}
+m.NamedError=function(name){
+this.message=name;
+this.name=name;
+};
+m.NamedError.prototype=new Error();
+m.update(m.NamedError.prototype,{repr:function(){
+if(this.message&&this.message!=this.name){
+return this.name+"("+m.repr(this.message)+")";
+}else{
+return this.name+"()";
+}
+},toString:m.forwardCall("repr")});
+m.NotFound=new m.NamedError("MochiKit.Base.NotFound");
+m.listMax=m.partial(m.listMinMax,1);
+m.listMin=m.partial(m.listMinMax,-1);
+m.isCallable=m.typeMatcher("function");
+m.isUndefined=m.typeMatcher("undefined");
+m.merge=m.partial(m.update,null);
+m.zip=m.partial(m.map,null);
+m.comparatorRegistry=new m.AdapterRegistry();
+m.registerComparator("dateLike",m.isDateLike,m.compareDateLike);
+m.registerComparator("arrayLike",m.isArrayLike,m.compareArrayLike);
+m.reprRegistry=new m.AdapterRegistry();
+m.registerRepr("arrayLike",m.isArrayLike,m.reprArrayLike);
+m.registerRepr("string",m.typeMatcher("string"),m.reprString);
+m.registerRepr("numbers",m.typeMatcher("number","boolean"),m.reprNumber);
+m.jsonRegistry=new m.AdapterRegistry();
+var all=m.concat(m.EXPORT,m.EXPORT_OK);
+m.EXPORT_TAGS={":common":m.concat(m.EXPORT_OK),":all":all};
+m.nameFunctions(this);
+};
+MochiKit.Base.__new__();
+if(!MochiKit.__compat__){
+compare=MochiKit.Base.compare;
+}
+MochiKit.Base._exportSymbols(this,MochiKit.Base);
+if(typeof (dojo)!="undefined"){
+dojo.provide("MochiKit.Iter");
+dojo.require("MochiKit.Base");
+}
+if(typeof (JSAN)!="undefined"){
+JSAN.use("MochiKit.Base",[]);
+}
+try{
+if(typeof (MochiKit.Base)=="undefined"){
+throw "";
+}
+}
+catch(e){
+throw "MochiKit.Iter depends on MochiKit.Base!";
+}
+if(typeof (MochiKit.Iter)=="undefined"){
+MochiKit.Iter={};
+}
+MochiKit.Iter.NAME="MochiKit.Iter";
+MochiKit.Iter.VERSION="1.3.1";
+MochiKit.Base.update(MochiKit.Iter,{__repr__:function(){
+return "["+this.NAME+" "+this.VERSION+"]";
+},toString:function(){
+return this.__repr__();
+},registerIteratorFactory:function(name,_132,_133,_134){
+MochiKit.Iter.iteratorRegistry.register(name,_132,_133,_134);
+},iter:function(_135,_136){
+var self=MochiKit.Iter;
+if(arguments.length==2){
+return self.takewhile(function(a){
+return a!=_136;
+},_135);
+}
+if(typeof (_135.next)=="function"){
+return _135;
+}else{
+if(typeof (_135.iter)=="function"){
+return _135.iter();
+}
+}
+try{
+return self.iteratorRegistry.match(_135);
+}
+catch(e){
+var m=MochiKit.Base;
+if(e==m.NotFound){
+e=new TypeError(typeof (_135)+": "+m.repr(_135)+" is not iterable");
+}
+throw e;
+}
+},count:function(n){
+if(!n){
+n=0;
+}
+var m=MochiKit.Base;
+return {repr:function(){
+return "count("+n+")";
+},toString:m.forwardCall("repr"),next:m.counter(n)};
+},cycle:function(p){
+var self=MochiKit.Iter;
+var m=MochiKit.Base;
+var lst=[];
+var _139=self.iter(p);
+return {repr:function(){
+return "cycle(...)";
+},toString:m.forwardCall("repr"),next:function(){
+try{
+var rval=_139.next();
+lst.push(rval);
+return rval;
+}
+catch(e){
+if(e!=self.StopIteration){
+throw e;
+}
+if(lst.length===0){
+this.next=function(){
+throw self.StopIteration;
+};
+}else{
+var i=-1;
+this.next=function(){
+i=(i+1)%lst.length;
+return lst[i];
+};
+}
+return this.next();
+}
+}};
+},repeat:function(elem,n){
+var m=MochiKit.Base;
+if(typeof (n)=="undefined"){
+return {repr:function(){
+return "repeat("+m.repr(elem)+")";
+},toString:m.forwardCall("repr"),next:function(){
+return elem;
+}};
+}
+return {repr:function(){
+return "repeat("+m.repr(elem)+", "+n+")";
+},toString:m.forwardCall("repr"),next:function(){
+if(n<=0){
+throw MochiKit.Iter.StopIteration;
+}
+n-=1;
+return elem;
+}};
+},next:function(_141){
+return _141.next();
+},izip:function(p,q){
+var m=MochiKit.Base;
+var next=MochiKit.Iter.next;
+var _144=m.map(iter,arguments);
+return {repr:function(){
+return "izip(...)";
+},toString:m.forwardCall("repr"),next:function(){
+return m.map(next,_144);
+}};
+},ifilter:function(pred,seq){
+var m=MochiKit.Base;
+seq=MochiKit.Iter.iter(seq);
+if(pred===null){
+pred=m.operator.truth;
+}
+return {repr:function(){
+return "ifilter(...)";
+},toString:m.forwardCall("repr"),next:function(){
+while(true){
+var rval=seq.next();
+if(pred(rval)){
+return rval;
+}
+}
+return undefined;
+}};
+},ifilterfalse:function(pred,seq){
+var m=MochiKit.Base;
+seq=MochiKit.Iter.iter(seq);
+if(pred===null){
+pred=m.operator.truth;
+}
+return {repr:function(){
+return "ifilterfalse(...)";
+},toString:m.forwardCall("repr"),next:function(){
+while(true){
+var rval=seq.next();
+if(!pred(rval)){
+return rval;
+}
+}
+return undefined;
+}};
+},islice:function(seq){
+var self=MochiKit.Iter;
+var m=MochiKit.Base;
+seq=self.iter(seq);
+var _147=0;
+var stop=0;
+var step=1;
+var i=-1;
+if(arguments.length==2){
+stop=arguments[1];
+}else{
+if(arguments.length==3){
+_147=arguments[1];
+stop=arguments[2];
+}else{
+_147=arguments[1];
+stop=arguments[2];
+step=arguments[3];
+}
+}
+return {repr:function(){
+return "islice("+["...",_147,stop,step].join(", ")+")";
+},toString:m.forwardCall("repr"),next:function(){
+var rval;
+while(i<_147){
+rval=seq.next();
+i++;
+}
+if(_147>=stop){
+throw self.StopIteration;
+}
+_147+=step;
+return rval;
+}};
+},imap:function(fun,p,q){
+var m=MochiKit.Base;
+var self=MochiKit.Iter;
+var _151=m.map(self.iter,m.extend(null,arguments,1));
+var map=m.map;
+var next=self.next;
+return {repr:function(){
+return "imap(...)";
+},toString:m.forwardCall("repr"),next:function(){
+return fun.apply(this,map(next,_151));
+}};
+},applymap:function(fun,seq,self){
+seq=MochiKit.Iter.iter(seq);
+var m=MochiKit.Base;
+return {repr:function(){
+return "applymap(...)";
+},toString:m.forwardCall("repr"),next:function(){
+return fun.apply(self,seq.next());
+}};
+},chain:function(p,q){
+var self=MochiKit.Iter;
+var m=MochiKit.Base;
+if(arguments.length==1){
+return self.iter(arguments[0]);
+}
+var _153=m.map(self.iter,arguments);
+return {repr:function(){
+return "chain(...)";
+},toString:m.forwardCall("repr"),next:function(){
+while(_153.length>1){
+try{
+return _153[0].next();
+}
+catch(e){
+if(e!=self.StopIteration){
+throw e;
+}
+_153.shift();
+}
+}
+if(_153.length==1){
+var arg=_153.shift();
+this.next=m.bind("next",arg);
+return this.next();
+}
+throw self.StopIteration;
+}};
+},takewhile:function(pred,seq){
+var self=MochiKit.Iter;
+seq=self.iter(seq);
+return {repr:function(){
+return "takewhile(...)";
+},toString:MochiKit.Base.forwardCall("repr"),next:function(){
+var rval=seq.next();
+if(!pred(rval)){
+this.next=function(){
+throw self.StopIteration;
+};
+this.next();
+}
+return rval;
+}};
+},dropwhile:function(pred,seq){
+seq=MochiKit.Iter.iter(seq);
+var m=MochiKit.Base;
+var bind=m.bind;
+return {"repr":function(){
+return "dropwhile(...)";
+},"toString":m.forwardCall("repr"),"next":function(){
+while(true){
+var rval=seq.next();
+if(!pred(rval)){
+break;
+}
+}
+this.next=bind("next",seq);
+return rval;
+}};
+},_tee:function(_155,sync,_157){
+sync.pos[_155]=-1;
+var m=MochiKit.Base;
+var _158=m.listMin;
+return {repr:function(){
+return "tee("+_155+", ...)";
+},toString:m.forwardCall("repr"),next:function(){
+var rval;
+var i=sync.pos[_155];
+if(i==sync.max){
+rval=_157.next();
+sync.deque.push(rval);
+sync.max+=1;
+sync.pos[_155]+=1;
+}else{
+rval=sync.deque[i-sync.min];
+sync.pos[_155]+=1;
+if(i==sync.min&&_158(sync.pos)!=sync.min){
+sync.min+=1;
+sync.deque.shift();
+}
+}
+return rval;
+}};
+},tee:function(_159,n){
+var rval=[];
+var sync={"pos":[],"deque":[],"max":-1,"min":-1};
+if(arguments.length==1){
+n=2;
+}
+var self=MochiKit.Iter;
+_159=self.iter(_159);
+var _tee=self._tee;
+for(var i=0;i<n;i++){
+rval.push(_tee(i,sync,_159));
+}
+return rval;
+},list:function(_161){
+var m=MochiKit.Base;
+if(typeof (_161.slice)=="function"){
+return _161.slice();
+}else{
+if(m.isArrayLike(_161)){
+return m.concat(_161);
+}
+}
+var self=MochiKit.Iter;
+_161=self.iter(_161);
+var rval=[];
+try{
+while(true){
+rval.push(_161.next());
+}
+}
+catch(e){
+if(e!=self.StopIteration){
+throw e;
+}
+return rval;
+}
+return undefined;
+},reduce:function(fn,_162,_163){
+var i=0;
+var x=_163;
+var self=MochiKit.Iter;
+_162=self.iter(_162);
+if(arguments.length<3){
+try{
+x=_162.next();
+}
+catch(e){
+if(e==self.StopIteration){
+e=new TypeError("reduce() of empty sequence with no initial value");
+}
+throw e;
+}
+i++;
+}
+try{
+while(true){
+x=fn(x,_162.next());
+}
+}
+catch(e){
+if(e!=self.StopIteration){
+throw e;
+}
+}
+return x;
+},range:function(){
+var _165=0;
+var stop=0;
+var step=1;
+if(arguments.length==1){
+stop=arguments[0];
+}else{
+if(arguments.length==2){
+_165=arguments[0];
+stop=arguments[1];
+}else{
+if(arguments.length==3){
+_165=arguments[0];
+stop=arguments[1];
+step=arguments[2];
+}else{
+throw new TypeError("range() takes 1, 2, or 3 arguments!");
+}
+}
+}
+if(step===0){
+throw new TypeError("range() step must not be 0");
+}
+return {next:function(){
+if((step>0&&_165>=stop)||(step<0&&_165<=stop)){
+throw MochiKit.Iter.StopIteration;
+}
+var rval=_165;
+_165+=step;
+return rval;
+},repr:function(){
+return "range("+[_165,stop,step].join(", ")+")";
+},toString:MochiKit.Base.forwardCall("repr")};
+},sum:function(_166,_167){
+var x=_167||0;
+var self=MochiKit.Iter;
+_166=self.iter(_166);
+try{
+while(true){
+x+=_166.next();
+}
+}
+catch(e){
+if(e!=self.StopIteration){
+throw e;
+}
+}
+return x;
+},exhaust:function(_168){
+var self=MochiKit.Iter;
+_168=self.iter(_168);
+try{
+while(true){
+_168.next();
+}
+}
+catch(e){
+if(e!=self.StopIteration){
+throw e;
+}
+}
+},forEach:function(_169,func,self){
+var m=MochiKit.Base;
+if(arguments.length>2){
+func=m.bind(func,self);
+}
+if(m.isArrayLike(_169)){
+try{
+for(var i=0;i<_169.length;i++){
+func(_169[i]);
+}
+}
+catch(e){
+if(e!=MochiKit.Iter.StopIteration){
+throw e;
+}
+}
+}else{
+self=MochiKit.Iter;
+self.exhaust(self.imap(func,_169));
+}
+},every:function(_171,func){
+var self=MochiKit.Iter;
+try{
+self.ifilterfalse(func,_171).next();
+return false;
+}
+catch(e){
+if(e!=self.StopIteration){
+throw e;
+}
+return true;
+}
+},sorted:function(_172,cmp){
+var rval=MochiKit.Iter.list(_172);
+if(arguments.length==1){
+cmp=MochiKit.Base.compare;
+}
+rval.sort(cmp);
+return rval;
+},reversed:function(_173){
+var rval=MochiKit.Iter.list(_173);
+rval.reverse();
+return rval;
+},some:function(_174,func){
+var self=MochiKit.Iter;
+try{
+self.ifilter(func,_174).next();
+return true;
+}
+catch(e){
+if(e!=self.StopIteration){
+throw e;
+}
+return false;
+}
+},iextend:function(lst,_175){
+if(MochiKit.Base.isArrayLike(_175)){
+for(var i=0;i<_175.length;i++){
+lst.push(_175[i]);
+}
+}else{
+var self=MochiKit.Iter;
+_175=self.iter(_175);
+try{
+while(true){
+lst.push(_175.next());
+}
+}
+catch(e){
+if(e!=self.StopIteration){
+throw e;
+}
+}
+}
+return lst;
+},groupby:function(_176,_177){
+var m=MochiKit.Base;
+var self=MochiKit.Iter;
+if(arguments.length<2){
+_177=m.operator.identity;
+}
+_176=self.iter(_176);
+var pk=undefined;
+var k=undefined;
+var v;
+function fetch(){
+v=_176.next();
+k=_177(v);
+}
+function eat(){
+var ret=v;
+v=undefined;
+return ret;
+}
+var _180=true;
+return {repr:function(){
+return "groupby(...)";
+},next:function(){
+while(k==pk){
+fetch();
+if(_180){
+_180=false;
+break;
+}
+}
+pk=k;
+return [k,{next:function(){
+if(v==undefined){
+fetch();
+}
+if(k!=pk){
+throw self.StopIteration;
+}
+return eat();
+}}];
+}};
+},groupby_as_array:function(_181,_182){
+var m=MochiKit.Base;
+var self=MochiKit.Iter;
+if(arguments.length<2){
+_182=m.operator.identity;
+}
+_181=self.iter(_181);
+var _183=[];
+var _184=true;
+var _185;
+while(true){
+try{
+var _186=_181.next();
+var key=_182(_186);
+}
+catch(e){
+if(e==self.StopIteration){
+break;
+}
+throw e;
+}
+if(_184||key!=_185){
+var _187=[];
+_183.push([key,_187]);
+}
+_187.push(_186);
+_184=false;
+_185=key;
+}
+return _183;
+},arrayLikeIter:function(_188){
+var i=0;
+return {repr:function(){
+return "arrayLikeIter(...)";
+},toString:MochiKit.Base.forwardCall("repr"),next:function(){
+if(i>=_188.length){
+throw MochiKit.Iter.StopIteration;
+}
+return _188[i++];
+}};
+},hasIterateNext:function(_189){
+return (_189&&typeof (_189.iterateNext)=="function");
+},iterateNextIter:function(_190){
+return {repr:function(){
+return "iterateNextIter(...)";
+},toString:MochiKit.Base.forwardCall("repr"),next:function(){
+var rval=_190.iterateNext();
+if(rval===null||rval===undefined){
+throw MochiKit.Iter.StopIteration;
+}
+return rval;
+}};
+}});
+MochiKit.Iter.EXPORT_OK=["iteratorRegistry","arrayLikeIter","hasIterateNext","iterateNextIter",];
+MochiKit.Iter.EXPORT=["StopIteration","registerIteratorFactory","iter","count","cycle","repeat","next","izip","ifilter","ifilterfalse","islice","imap","applymap","chain","takewhile","dropwhile","tee","list","reduce","range","sum","exhaust","forEach","every","sorted","reversed","some","iextend","groupby","groupby_as_array"];
+MochiKit.Iter.__new__=function(){
+var m=MochiKit.Base;
+this.StopIteration=new m.NamedError("StopIteration");
+this.iteratorRegistry=new m.AdapterRegistry();
+this.registerIteratorFactory("arrayLike",m.isArrayLike,this.arrayLikeIter);
+this.registerIteratorFactory("iterateNext",this.hasIterateNext,this.iterateNextIter);
+this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)};
+m.nameFunctions(this);
+};
+MochiKit.Iter.__new__();
+if(!MochiKit.__compat__){
+reduce=MochiKit.Iter.reduce;
+}
+MochiKit.Base._exportSymbols(this,MochiKit.Iter);
+if(typeof (dojo)!="undefined"){
+dojo.provide("MochiKit.Logging");
+dojo.require("MochiKit.Base");
+}
+if(typeof (JSAN)!="undefined"){
+JSAN.use("MochiKit.Base",[]);
+}
+try{
+if(typeof (MochiKit.Base)=="undefined"){
+throw "";
+}
+}
+catch(e){
+throw "MochiKit.Logging depends on MochiKit.Base!";
+}
+if(typeof (MochiKit.Logging)=="undefined"){
+MochiKit.Logging={};
+}
+MochiKit.Logging.NAME="MochiKit.Logging";
+MochiKit.Logging.VERSION="1.3.1";
+MochiKit.Logging.__repr__=function(){
+return "["+this.NAME+" "+this.VERSION+"]";
+};
+MochiKit.Logging.toString=function(){
+return this.__repr__();
+};
+MochiKit.Logging.EXPORT=["LogLevel","LogMessage","Logger","alertListener","logger","log","logError","logDebug","logFatal","logWarning"];
+MochiKit.Logging.EXPORT_OK=["logLevelAtLeast","isLogMessage","compareLogMessage"];
+MochiKit.Logging.LogMessage=function(num,_192,info){
+this.num=num;
+this.level=_192;
+this.info=info;
+this.timestamp=new Date();
+};
+MochiKit.Logging.LogMessage.prototype={repr:function(){
+var m=MochiKit.Base;
+return "LogMessage("+m.map(m.repr,[this.num,this.level,this.info]).join(", ")+")";
+},toString:MochiKit.Base.forwardCall("repr")};
+MochiKit.Base.update(MochiKit.Logging,{logLevelAtLeast:function(_194){
+var self=MochiKit.Logging;
+if(typeof (_194)=="string"){
+_194=self.LogLevel[_194];
+}
+return function(msg){
+var _196=msg.level;
+if(typeof (_196)=="string"){
+_196=self.LogLevel[_196];
+}
+return _196>=_194;
+};
+},isLogMessage:function(){
+var _197=MochiKit.Logging.LogMessage;
+for(var i=0;i<arguments.length;i++){
+if(!(arguments[i] instanceof _197)){
+return false;
+}
+}
+return true;
+},compareLogMessage:function(a,b){
+return MochiKit.Base.compare([a.level,a.info],[b.level,b.info]);
+},alertListener:function(msg){
+alert("num: "+msg.num+"\nlevel: "+msg.level+"\ninfo: "+msg.info.join(" "));
+}});
+MochiKit.Logging.Logger=function(_198){
+this.counter=0;
+if(typeof (_198)=="undefined"||_198===null){
+_198=-1;
+}
+this.maxSize=_198;
+this._messages=[];
+this.listeners={};
+this.useNativeConsole=false;
+};
+MochiKit.Logging.Logger.prototype={clear:function(){
+this._messages.splice(0,this._messages.length);
+},logToConsole:function(msg){
+if(typeof (window)!="undefined"&&window.console&&window.console.log){
+window.console.log(msg);
+}else{
+if(typeof (opera)!="undefined"&&opera.postError){
+opera.postError(msg);
+}else{
+if(typeof (printfire)=="function"){
+printfire(msg);
+}
+}
+}
+},dispatchListeners:function(msg){
+for(var k in this.listeners){
+var pair=this.listeners[k];
+if(pair.ident!=k||(pair[0]&&!pair[0](msg))){
+continue;
+}
+pair[1](msg);
+}
+},addListener:function(_199,_200,_201){
+if(typeof (_200)=="string"){
+_200=MochiKit.Logging.logLevelAtLeast(_200);
+}
+var _202=[_200,_201];
+_202.ident=_199;
+this.listeners[_199]=_202;
+},removeListener:function(_203){
+delete this.listeners[_203];
+},baseLog:function(_204,_205){
+var msg=new MochiKit.Logging.LogMessage(this.counter,_204,MochiKit.Base.extend(null,arguments,1));
+this._messages.push(msg);
+this.dispatchListeners(msg);
+if(this.useNativeConsole){
+this.logToConsole(msg.level+": "+msg.info.join(" "));
+}
+this.counter+=1;
+while(this.maxSize>=0&&this._messages.length>this.maxSize){
+this._messages.shift();
+}
+},getMessages:function(_206){
+var _207=0;
+if(!(typeof (_206)=="undefined"||_206===null)){
+_207=Math.max(0,this._messages.length-_206);
+}
+return this._messages.slice(_207);
+},getMessageText:function(_208){
+if(typeof (_208)=="undefined"||_208===null){
+_208=30;
+}
+var _209=this.getMessages(_208);
+if(_209.length){
+var lst=map(function(m){
+return "\n  ["+m.num+"] "+m.level+": "+m.info.join(" ");
+},_209);
+lst.unshift("LAST "+_209.length+" MESSAGES:");
+return lst.join("");
+}
+return "";
+},debuggingBookmarklet:function(_210){
+if(typeof (MochiKit.LoggingPane)=="undefined"){
+alert(this.getMessageText());
+}else{
+MochiKit.LoggingPane.createLoggingPane(_210||false);
+}
+}};
+MochiKit.Logging.__new__=function(){
+this.LogLevel={ERROR:40,FATAL:50,WARNING:30,INFO:20,DEBUG:10};
+var m=MochiKit.Base;
+m.registerComparator("LogMessage",this.isLogMessage,this.compareLogMessage);
+var _211=m.partial;
+var _212=this.Logger;
+var _213=_212.prototype.baseLog;
+m.update(this.Logger.prototype,{debug:_211(_213,"DEBUG"),log:_211(_213,"INFO"),error:_211(_213,"ERROR"),fatal:_211(_213,"FATAL"),warning:_211(_213,"WARNING")});
+var self=this;
+var _214=function(name){
+return function(){
+self.logger[name].apply(self.logger,arguments);
+};
+};
+this.log=_214("log");
+this.logError=_214("error");
+this.logDebug=_214("debug");
+this.logFatal=_214("fatal");
+this.logWarning=_214("warning");
+this.logger=new _212();
+this.logger.useNativeConsole=true;
+this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)};
+m.nameFunctions(this);
+};
+if(typeof (printfire)=="undefined"&&typeof (document)!="undefined"&&document.createEvent&&typeof (dispatchEvent)!="undefined"){
+printfire=function(){
+printfire.args=arguments;
+var ev=document.createEvent("Events");
+ev.initEvent("printfire",false,true);
+dispatchEvent(ev);
+};
+}
+MochiKit.Logging.__new__();
+MochiKit.Base._exportSymbols(this,MochiKit.Logging);
+if(typeof (dojo)!="undefined"){
+dojo.provide("MochiKit.DateTime");
+}
+if(typeof (MochiKit)=="undefined"){
+MochiKit={};
+}
+if(typeof (MochiKit.DateTime)=="undefined"){
+MochiKit.DateTime={};
+}
+MochiKit.DateTime.NAME="MochiKit.DateTime";
+MochiKit.DateTime.VERSION="1.3.1";
+MochiKit.DateTime.__repr__=function(){
+return "["+this.NAME+" "+this.VERSION+"]";
+};
+MochiKit.DateTime.toString=function(){
+return this.__repr__();
+};
+MochiKit.DateTime.isoDate=function(str){
+str=str+"";
+if(typeof (str)!="string"||str.length===0){
+return null;
+}
+var iso=str.split("-");
+if(iso.length===0){
+return null;
+}
+return new Date(iso[0],iso[1]-1,iso[2]);
+};
+MochiKit.DateTime._isoRegexp=/(\d{4,})(?:-(\d{1,2})(?:-(\d{1,2})(?:[T ](\d{1,2}):(\d{1,2})(?::(\d{1,2})(?:\.(\d+))?)?(?:(Z)|([+-])(\d{1,2})(?::(\d{1,2}))?)?)?)?)?/;
+MochiKit.DateTime.isoTimestamp=function(str){
+str=str+"";
+if(typeof (str)!="string"||str.length===0){
+return null;
+}
+var res=str.match(MochiKit.DateTime._isoRegexp);
+if(typeof (res)=="undefined"||res===null){
+return null;
+}
+var year,month,day,hour,min,sec,msec;
+year=parseInt(res[1],10);
+if(typeof (res[2])=="undefined"||res[2]===""){
+return new Date(year);
+}
+month=parseInt(res[2],10)-1;
+day=parseInt(res[3],10);
+if(typeof (res[4])=="undefined"||res[4]===""){
+return new Date(year,month,day);
+}
+hour=parseInt(res[4],10);
+min=parseInt(res[5],10);
+sec=(typeof (res[6])!="undefined"&&res[6]!=="")?parseInt(res[6],10):0;
+if(typeof (res[7])!="undefined"&&res[7]!==""){
+msec=Math.round(1000*parseFloat("0."+res[7]));
+}else{
+msec=0;
+}
+if((typeof (res[8])=="undefined"||res[8]==="")&&(typeof (res[9])=="undefined"||res[9]==="")){
+return new Date(year,month,day,hour,min,sec,msec);
+}
+var ofs;
+if(typeof (res[9])!="undefined"&&res[9]!==""){
+ofs=parseInt(res[10],10)*3600000;
+if(typeof (res[11])!="undefined"&&res[11]!==""){
+ofs+=parseInt(res[11],10)*60000;
+}
+if(res[9]=="-"){
+ofs=-ofs;
+}
+}else{
+ofs=0;
+}
+return new Date(Date.UTC(year,month,day,hour,min,sec,msec)-ofs);
+};
+MochiKit.DateTime.toISOTime=function(date,_221){
+if(typeof (date)=="undefined"||date===null){
+return null;
+}
+var hh=date.getHours();
+var mm=date.getMinutes();
+var ss=date.getSeconds();
+var lst=[((_221&&(hh<10))?"0"+hh:hh),((mm<10)?"0"+mm:mm),((ss<10)?"0"+ss:ss)];
+return lst.join(":");
+};
+MochiKit.DateTime.toISOTimestamp=function(date,_225){
+if(typeof (date)=="undefined"||date===null){
+return null;
+}
+var sep=_225?"T":" ";
+var foot=_225?"Z":"";
+if(_225){
+date=new Date(date.getTime()+(date.getTimezoneOffset()*60000));
+}
+return MochiKit.DateTime.toISODate(date)+sep+MochiKit.DateTime.toISOTime(date,_225)+foot;
+};
+MochiKit.DateTime.toISODate=function(date){
+if(typeof (date)=="undefined"||date===null){
+return null;
+}
+var _228=MochiKit.DateTime._padTwo;
+return [date.getFullYear(),_228(date.getMonth()+1),_228(date.getDate())].join("-");
+};
+MochiKit.DateTime.americanDate=function(d){
+d=d+"";
+if(typeof (d)!="string"||d.length===0){
+return null;
+}
+var a=d.split("/");
+return new Date(a[2],a[0]-1,a[1]);
+};
+MochiKit.DateTime._padTwo=function(n){
+return (n>9)?n:"0"+n;
+};
+MochiKit.DateTime.toPaddedAmericanDate=function(d){
+if(typeof (d)=="undefined"||d===null){
+return null;
+}
+var _230=MochiKit.DateTime._padTwo;
+return [_230(d.getMonth()+1),_230(d.getDate()),d.getFullYear()].join("/");
+};
+MochiKit.DateTime.toAmericanDate=function(d){
+if(typeof (d)=="undefined"||d===null){
+return null;
+}
+return [d.getMonth()+1,d.getDate(),d.getFullYear()].join("/");
+};
+MochiKit.DateTime.EXPORT=["isoDate","isoTimestamp","toISOTime","toISOTimestamp","toISODate","americanDate","toPaddedAmericanDate","toAmericanDate"];
+MochiKit.DateTime.EXPORT_OK=[];
+MochiKit.DateTime.EXPORT_TAGS={":common":MochiKit.DateTime.EXPORT,":all":MochiKit.DateTime.EXPORT};
+MochiKit.DateTime.__new__=function(){
+var base=this.NAME+".";
+for(var k in this){
+var o=this[k];
+if(typeof (o)=="function"&&typeof (o.NAME)=="undefined"){
+try{
+o.NAME=base+k;
+}
+catch(e){
+}
+}
+}
+};
+MochiKit.DateTime.__new__();
+if(typeof (MochiKit.Base)!="undefined"){
+MochiKit.Base._exportSymbols(this,MochiKit.DateTime);
+}else{
+(function(_231,_232){
+if((typeof (JSAN)=="undefined"&&typeof (dojo)=="undefined")||(typeof (MochiKit.__compat__)=="boolean"&&MochiKit.__compat__)){
+var all=_232.EXPORT_TAGS[":all"];
+for(var i=0;i<all.length;i++){
+_231[all[i]]=_232[all[i]];
+}
+}
+})(this,MochiKit.DateTime);
+}
+if(typeof (dojo)!="undefined"){
+dojo.provide("MochiKit.Format");
+}
+if(typeof (MochiKit)=="undefined"){
+MochiKit={};
+}
+if(typeof (MochiKit.Format)=="undefined"){
+MochiKit.Format={};
+}
+MochiKit.Format.NAME="MochiKit.Format";
+MochiKit.Format.VERSION="1.3.1";
+MochiKit.Format.__repr__=function(){
+return "["+this.NAME+" "+this.VERSION+"]";
+};
+MochiKit.Format.toString=function(){
+return this.__repr__();
+};
+MochiKit.Format._numberFormatter=function(_233,_234,_235,_236,_237,_238,_239,_240,_241){
+return function(num){
+num=parseFloat(num);
+if(typeof (num)=="undefined"||num===null||isNaN(num)){
+return _233;
+}
+var _242=_234;
+var _243=_235;
+if(num<0){
+num=-num;
+}else{
+_242=_242.replace(/-/,"");
+}
+var me=arguments.callee;
+var fmt=MochiKit.Format.formatLocale(_236);
+if(_237){
+num=num*100;
+_243=fmt.percent+_243;
+}
+num=MochiKit.Format.roundToFixed(num,_238);
+var _245=num.split(/\./);
+var _246=_245[0];
+var frac=(_245.length==1)?"":_245[1];
+var res="";
+while(_246.length<_239){
+_246="0"+_246;
+}
+if(_240){
+while(_246.length>_240){
+var i=_246.length-_240;
+res=fmt.separator+_246.substring(i,_246.length)+res;
+_246=_246.substring(0,i);
+}
+}
+res=_246+res;
+if(_238>0){
+while(frac.length<_241){
+frac=frac+"0";
+}
+res=res+fmt.decimal+frac;
+}
+return _242+res+_243;
+};
+};
+MochiKit.Format.numberFormatter=function(_248,_249,_250){
+if(typeof (_249)=="undefined"){
+_249="";
+}
+var _251=_248.match(/((?:[0#]+,)?[0#]+)(?:\.([0#]+))?(%)?/);
+if(!_251){
+throw TypeError("Invalid pattern");
+}
+var _252=_248.substr(0,_251.index);
+var _253=_248.substr(_251.index+_251[0].length);
+if(_252.search(/-/)==-1){
+_252=_252+"-";
+}
+var _254=_251[1];
+var frac=(typeof (_251[2])=="string"&&_251[2]!="")?_251[2]:"";
+var _255=(typeof (_251[3])=="string"&&_251[3]!="");
+var tmp=_254.split(/,/);
+var _257;
+if(typeof (_250)=="undefined"){
+_250="default";
+}
+if(tmp.length==1){
+_257=null;
+}else{
+_257=tmp[1].length;
+}
+var _258=_254.length-_254.replace(/0/g,"").length;
+var _259=frac.length-frac.replace(/0/g,"").length;
+var _260=frac.length;
+var rval=MochiKit.Format._numberFormatter(_249,_252,_253,_250,_255,_260,_258,_257,_259);
+var m=MochiKit.Base;
+if(m){
+var fn=arguments.callee;
+var args=m.concat(arguments);
+rval.repr=function(){
+return [self.NAME,"(",map(m.repr,args).join(", "),")"].join("");
+};
+}
+return rval;
+};
+MochiKit.Format.formatLocale=function(_262){
+if(typeof (_262)=="undefined"||_262===null){
+_262="default";
+}
+if(typeof (_262)=="string"){
+var rval=MochiKit.Format.LOCALE[_262];
+if(typeof (rval)=="string"){
+rval=arguments.callee(rval);
+MochiKit.Format.LOCALE[_262]=rval;
+}
+return rval;
+}else{
+return _262;
+}
+};
+MochiKit.Format.twoDigitAverage=function(_263,_264){
+if(_264){
+var res=_263/_264;
+if(!isNaN(res)){
+return MochiKit.Format.twoDigitFloat(_263/_264);
+}
+}
+return "0";
+};
+MochiKit.Format.twoDigitFloat=function(_265){
+var sign=(_265<0?"-":"");
+var s=Math.floor(Math.abs(_265)*100).toString();
+if(s=="0"){
+return s;
+}
+if(s.length<3){
+while(s.charAt(s.length-1)=="0"){
+s=s.substring(0,s.length-1);
+}
+return sign+"0."+s;
+}
+var head=sign+s.substring(0,s.length-2);
+var tail=s.substring(s.length-2,s.length);
+if(tail=="00"){
+return head;
+}else{
+if(tail.charAt(1)=="0"){
+return head+"."+tail.charAt(0);
+}else{
+return head+"."+tail;
+}
+}
+};
+MochiKit.Format.lstrip=function(str,_270){
+str=str+"";
+if(typeof (str)!="string"){
+return null;
+}
+if(!_270){
+return str.replace(/^\s+/,"");
+}else{
+return str.replace(new RegExp("^["+_270+"]+"),"");
+}
+};
+MochiKit.Format.rstrip=function(str,_271){
+str=str+"";
+if(typeof (str)!="string"){
+return null;
+}
+if(!_271){
+return str.replace(/\s+$/,"");
+}else{
+return str.replace(new RegExp("["+_271+"]+$"),"");
+}
+};
+MochiKit.Format.strip=function(str,_272){
+var self=MochiKit.Format;
+return self.rstrip(self.lstrip(str,_272),_272);
+};
+MochiKit.Format.truncToFixed=function(_273,_274){
+_273=Math.floor(_273*Math.pow(10,_274));
+var res=(_273*Math.pow(10,-_274)).toFixed(_274);
+if(res.charAt(0)=="."){
+res="0"+res;
+}
+return res;
+};
+MochiKit.Format.roundToFixed=function(_275,_276){
+return MochiKit.Format.truncToFixed(_275+0.5*Math.pow(10,-_276),_276);
+};
+MochiKit.Format.percentFormat=function(_277){
+return MochiKit.Format.twoDigitFloat(100*_277)+"%";
+};
+MochiKit.Format.EXPORT=["truncToFixed","roundToFixed","numberFormatter","formatLocale","twoDigitAverage","twoDigitFloat","percentFormat","lstrip","rstrip","strip"];
+MochiKit.Format.LOCALE={en_US:{separator:",",decimal:".",percent:"%"},de_DE:{separator:".",decimal:",",percent:"%"},fr_FR:{separator:" ",decimal:",",percent:"%"},"default":"en_US"};
+MochiKit.Format.EXPORT_OK=[];
+MochiKit.Format.EXPORT_TAGS={":all":MochiKit.Format.EXPORT,":common":MochiKit.Format.EXPORT};
+MochiKit.Format.__new__=function(){
+var base=this.NAME+".";
+var k,v,o;
+for(k in this.LOCALE){
+o=this.LOCALE[k];
+if(typeof (o)=="object"){
+o.repr=function(){
+return this.NAME;
+};
+o.NAME=base+"LOCALE."+k;
+}
+}
+for(k in this){
+o=this[k];
+if(typeof (o)=="function"&&typeof (o.NAME)=="undefined"){
+try{
+o.NAME=base+k;
+}
+catch(e){
+}
+}
+}
+};
+MochiKit.Format.__new__();
+if(typeof (MochiKit.Base)!="undefined"){
+MochiKit.Base._exportSymbols(this,MochiKit.Format);
+}else{
+(function(_278,_279){
+if((typeof (JSAN)=="undefined"&&typeof (dojo)=="undefined")||(typeof (MochiKit.__compat__)=="boolean"&&MochiKit.__compat__)){
+var all=_279.EXPORT_TAGS[":all"];
+for(var i=0;i<all.length;i++){
+_278[all[i]]=_279[all[i]];
+}
+}
+})(this,MochiKit.Format);
+}
+if(typeof (dojo)!="undefined"){
+dojo.provide("MochiKit.Async");
+dojo.require("MochiKit.Base");
+}
+if(typeof (JSAN)!="undefined"){
+JSAN.use("MochiKit.Base",[]);
+}
+try{
+if(typeof (MochiKit.Base)=="undefined"){
+throw "";
+}
+}
+catch(e){
+throw "MochiKit.Async depends on MochiKit.Base!";
+}
+if(typeof (MochiKit.Async)=="undefined"){
+MochiKit.Async={};
+}
+MochiKit.Async.NAME="MochiKit.Async";
+MochiKit.Async.VERSION="1.3.1";
+MochiKit.Async.__repr__=function(){
+return "["+this.NAME+" "+this.VERSION+"]";
+};
+MochiKit.Async.toString=function(){
+return this.__repr__();
+};
+MochiKit.Async.Deferred=function(_280){
+this.chain=[];
+this.id=this._nextId();
+this.fired=-1;
+this.paused=0;
+this.results=[null,null];
+this.canceller=_280;
+this.silentlyCancelled=false;
+this.chained=false;
+};
+MochiKit.Async.Deferred.prototype={repr:function(){
+var _281;
+if(this.fired==-1){
+_281="unfired";
+}else{
+if(this.fired===0){
+_281="success";
+}else{
+_281="error";
+}
+}
+return "Deferred("+this.id+", "+_281+")";
+},toString:MochiKit.Base.forwardCall("repr"),_nextId:MochiKit.Base.counter(),cancel:function(){
+var self=MochiKit.Async;
+if(this.fired==-1){
+if(this.canceller){
+this.canceller(this);
+}else{
+this.silentlyCancelled=true;
+}
+if(this.fired==-1){
+this.errback(new self.CancelledError(this));
+}
+}else{
+if((this.fired===0)&&(this.results[0] instanceof self.Deferred)){
+this.results[0].cancel();
+}
+}
+},_pause:function(){
+this.paused++;
+},_unpause:function(){
+this.paused--;
+if((this.paused===0)&&(this.fired>=0)){
+this._fire();
+}
+},_continue:function(res){
+this._resback(res);
+this._unpause();
+},_resback:function(res){
+this.fired=((res instanceof Error)?1:0);
+this.results[this.fired]=res;
+this._fire();
+},_check:function(){
+if(this.fired!=-1){
+if(!this.silentlyCancelled){
+throw new MochiKit.Async.AlreadyCalledError(this);
+}
+this.silentlyCancelled=false;
+return;
+}
+},callback:function(res){
+this._check();
+if(res instanceof MochiKit.Async.Deferred){
+throw new Error("Deferred instances can only be chained if they are the result of a callback");
+}
+this._resback(res);
+},errback:function(res){
+this._check();
+var self=MochiKit.Async;
+if(res instanceof self.Deferred){
+throw new Error("Deferred instances can only be chained if they are the result of a callback");
+}
+if(!(res instanceof Error)){
+res=new self.GenericError(res);
+}
+this._resback(res);
+},addBoth:function(fn){
+if(arguments.length>1){
+fn=MochiKit.Base.partial.apply(null,arguments);
+}
+return this.addCallbacks(fn,fn);
+},addCallback:function(fn){
+if(arguments.length>1){
+fn=MochiKit.Base.partial.apply(null,arguments);
+}
+return this.addCallbacks(fn,null);
+},addErrback:function(fn){
+if(arguments.length>1){
+fn=MochiKit.Base.partial.apply(null,arguments);
+}
+return this.addCallbacks(null,fn);
+},addCallbacks:function(cb,eb){
+if(this.chained){
+throw new Error("Chained Deferreds can not be re-used");
+}
+this.chain.push([cb,eb]);
+if(this.fired>=0){
+this._fire();
+}
+return this;
+},_fire:function(){
+var _284=this.chain;
+var _285=this.fired;
+var res=this.results[_285];
+var self=this;
+var cb=null;
+while(_284.length>0&&this.paused===0){
+var pair=_284.shift();
+var f=pair[_285];
+if(f===null){
+continue;
+}
+try{
+res=f(res);
+_285=((res instanceof Error)?1:0);
+if(res instanceof MochiKit.Async.Deferred){
+cb=function(res){
+self._continue(res);
+};
+this._pause();
+}
+}
+catch(err){
+_285=1;
+if(!(err instanceof Error)){
+err=new MochiKit.Async.GenericError(err);
+}
+res=err;
+}
+}
+this.fired=_285;
+this.results[_285]=res;
+if(cb&&this.paused){
+res.addBoth(cb);
+res.chained=true;
+}
+}};
+MochiKit.Base.update(MochiKit.Async,{evalJSONRequest:function(){
+return eval("("+arguments[0].responseText+")");
+},succeed:function(_287){
+var d=new MochiKit.Async.Deferred();
+d.callback.apply(d,arguments);
+return d;
+},fail:function(_288){
+var d=new MochiKit.Async.Deferred();
+d.errback.apply(d,arguments);
+return d;
+},getXMLHttpRequest:function(){
+var self=arguments.callee;
+if(!self.XMLHttpRequest){
+var _289=[function(){
+return new XMLHttpRequest();
+},function(){
+return new ActiveXObject("Msxml2.XMLHTTP");
+},function(){
+return new ActiveXObject("Microsoft.XMLHTTP");
+},function(){
+return new ActiveXObject("Msxml2.XMLHTTP.4.0");
+},function(){
+throw new MochiKit.Async.BrowserComplianceError("Browser does not support XMLHttpRequest");
+}];
+for(var i=0;i<_289.length;i++){
+var func=_289[i];
+try{
+self.XMLHttpRequest=func;
+return func();
+}
+catch(e){
+}
+}
+}
+return self.XMLHttpRequest();
+},_nothing:function(){
+},_xhr_onreadystatechange:function(d){
+if(this.readyState==4){
+try{
+this.onreadystatechange=null;
+}
+catch(e){
+try{
+this.onreadystatechange=MochiKit.Async._nothing;
+}
+catch(e){
+}
+}
+var _290=null;
+try{
+_290=this.status;
+if(!_290&&MochiKit.Base.isNotEmpty(this.responseText)){
+_290=304;
+}
+}
+catch(e){
+}
+if(_290==200||_290==304){
+d.callback(this);
+}else{
+var err=new MochiKit.Async.XMLHttpRequestError(this,"Request failed");
+if(err.number){
+d.errback(err);
+}else{
+d.errback(err);
+}
+}
+}
+},_xhr_canceller:function(req){
+try{
+req.onreadystatechange=null;
+}
+catch(e){
+try{
+req.onreadystatechange=MochiKit.Async._nothing;
+}
+catch(e){
+}
+}
+req.abort();
+},sendXMLHttpRequest:function(req,_293){
+if(typeof (_293)=="undefined"||_293===null){
+_293="";
+}
+var m=MochiKit.Base;
+var self=MochiKit.Async;
+var d=new self.Deferred(m.partial(self._xhr_canceller,req));
+try{
+req.onreadystatechange=m.bind(self._xhr_onreadystatechange,req,d);
+req.send(_293);
+}
+catch(e){
+try{
+req.onreadystatechange=null;
+}
+catch(ignore){
+}
+d.errback(e);
+}
+return d;
+},doSimpleXMLHttpRequest:function(url){
+var self=MochiKit.Async;
+var req=self.getXMLHttpRequest();
+if(arguments.length>1){
+var m=MochiKit.Base;
+var qs=m.queryString.apply(null,m.extend(null,arguments,1));
+if(qs){
+url+="?"+qs;
+}
+}
+req.open("GET",url,true);
+return self.sendXMLHttpRequest(req);
+},loadJSONDoc:function(url){
+var self=MochiKit.Async;
+var d=self.doSimpleXMLHttpRequest.apply(self,arguments);
+d=d.addCallback(self.evalJSONRequest);
+return d;
+},wait:function(_296,_297){
+var d=new MochiKit.Async.Deferred();
+var m=MochiKit.Base;
+if(typeof (_297)!="undefined"){
+d.addCallback(function(){
+return _297;
+});
+}
+var _298=setTimeout(m.bind("callback",d),Math.floor(_296*1000));
+d.canceller=function(){
+try{
+clearTimeout(_298);
+}
+catch(e){
+}
+};
+return d;
+},callLater:function(_299,func){
+var m=MochiKit.Base;
+var _300=m.partial.apply(m,m.extend(null,arguments,1));
+return MochiKit.Async.wait(_299).addCallback(function(res){
+return _300();
+});
+}});
+MochiKit.Async.DeferredLock=function(){
+this.waiting=[];
+this.locked=false;
+this.id=this._nextId();
+};
+MochiKit.Async.DeferredLock.prototype={__class__:MochiKit.Async.DeferredLock,acquire:function(){
+d=new MochiKit.Async.Deferred();
+if(this.locked){
+this.waiting.push(d);
+}else{
+this.locked=true;
+d.callback(this);
+}
+return d;
+},release:function(){
+if(!this.locked){
+throw TypeError("Tried to release an unlocked DeferredLock");
+}
+this.locked=false;
+if(this.waiting.length>0){
+this.locked=true;
+this.waiting.shift().callback(this);
+}
+},_nextId:MochiKit.Base.counter(),repr:function(){
+var _301;
+if(this.locked){
+_301="locked, "+this.waiting.length+" waiting";
+}else{
+_301="unlocked";
+}
+return "DeferredLock("+this.id+", "+_301+")";
+},toString:MochiKit.Base.forwardCall("repr")};
+MochiKit.Async.DeferredList=function(list,_303,_304,_305,_306){
+this.list=list;
+this.resultList=new Array(this.list.length);
+this.chain=[];
+this.id=this._nextId();
+this.fired=-1;
+this.paused=0;
+this.results=[null,null];
+this.canceller=_306;
+this.silentlyCancelled=false;
+if(this.list.length===0&&!_303){
+this.callback(this.resultList);
+}
+this.finishedCount=0;
+this.fireOnOneCallback=_303;
+this.fireOnOneErrback=_304;
+this.consumeErrors=_305;
+var _307=0;
+MochiKit.Base.map(MochiKit.Base.bind(function(d){
+d.addCallback(MochiKit.Base.bind(this._cbDeferred,this),_307,true);
+d.addErrback(MochiKit.Base.bind(this._cbDeferred,this),_307,false);
+_307+=1;
+},this),this.list);
+};
+MochiKit.Base.update(MochiKit.Async.DeferredList.prototype,MochiKit.Async.Deferred.prototype);
+MochiKit.Base.update(MochiKit.Async.DeferredList.prototype,{_cbDeferred:function(_308,_309,_310){
+this.resultList[_308]=[_309,_310];
+this.finishedCount+=1;
+if(this.fired!==0){
+if(_309&&this.fireOnOneCallback){
+this.callback([_308,_310]);
+}else{
+if(!_309&&this.fireOnOneErrback){
+this.errback(_310);
+}else{
+if(this.finishedCount==this.list.length){
+this.callback(this.resultList);
+}
+}
+}
+}
+if(!_309&&this.consumeErrors){
+_310=null;
+}
+return _310;
+}});
+MochiKit.Async.gatherResults=function(_311){
+var d=new MochiKit.Async.DeferredList(_311,false,true,false);
+d.addCallback(function(_312){
+var ret=[];
+for(var i=0;i<_312.length;i++){
+ret.push(_312[i][1]);
+}
+return ret;
+});
+return d;
+};
+MochiKit.Async.maybeDeferred=function(func){
+var self=MochiKit.Async;
+var _313;
+try{
+var r=func.apply(null,MochiKit.Base.extend([],arguments,1));
+if(r instanceof self.Deferred){
+_313=r;
+}else{
+if(r instanceof Error){
+_313=self.fail(r);
+}else{
+_313=self.succeed(r);
+}
+}
+}
+catch(e){
+_313=self.fail(e);
+}
+return _313;
+};
+MochiKit.Async.EXPORT=["AlreadyCalledError","CancelledError","BrowserComplianceError","GenericError","XMLHttpRequestError","Deferred","succeed","fail","getXMLHttpRequest","doSimpleXMLHttpRequest","loadJSONDoc","wait","callLater","sendXMLHttpRequest","DeferredLock","DeferredList","gatherResults","maybeDeferred"];
+MochiKit.Async.EXPORT_OK=["evalJSONRequest"];
+MochiKit.Async.__new__=function(){
+var m=MochiKit.Base;
+var ne=m.partial(m._newNamedError,this);
+ne("AlreadyCalledError",function(_316){
+this.deferred=_316;
+});
+ne("CancelledError",function(_317){
+this.deferred=_317;
+});
+ne("BrowserComplianceError",function(msg){
+this.message=msg;
+});
+ne("GenericError",function(msg){
+this.message=msg;
+});
+ne("XMLHttpRequestError",function(req,msg){
+this.req=req;
+this.message=msg;
+try{
+this.number=req.status;
+}
+catch(e){
+}
+});
+this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)};
+m.nameFunctions(this);
+};
+MochiKit.Async.__new__();
+MochiKit.Base._exportSymbols(this,MochiKit.Async);
+if(typeof (dojo)!="undefined"){
+dojo.provide("MochiKit.DOM");
+dojo.require("MochiKit.Iter");
+}
+if(typeof (JSAN)!="undefined"){
+JSAN.use("MochiKit.Iter",[]);
+}
+try{
+if(typeof (MochiKit.Iter)=="undefined"){
+throw "";
+}
+}
+catch(e){
+throw "MochiKit.DOM depends on MochiKit.Iter!";
+}
+if(typeof (MochiKit.DOM)=="undefined"){
+MochiKit.DOM={};
+}
+MochiKit.DOM.NAME="MochiKit.DOM";
+MochiKit.DOM.VERSION="1.3.1";
+MochiKit.DOM.__repr__=function(){
+return "["+this.NAME+" "+this.VERSION+"]";
+};
+MochiKit.DOM.toString=function(){
+return this.__repr__();
+};
+MochiKit.DOM.EXPORT=["formContents","currentWindow","currentDocument","withWindow","withDocument","registerDOMConverter","coerceToDOM","createDOM","createDOMFunc","getNodeAttribute","setNodeAttribute","updateNodeAttributes","appendChildNodes","replaceChildNodes","removeElement","swapDOM","BUTTON","TT","PRE","H1","H2","H3","BR","CANVAS","HR","LABEL","TEXTAREA","FORM","STRONG","SELECT","OPTION","OPTGROUP","LEGEND","FIELDSET","P","UL","OL","LI","TD","TR","THEAD","TBODY","TFOOT","TABLE","TH","INPUT","SPAN","A","DIV","IMG","getElement","$","computedStyle","getElementsByTagAndClassName","addToCallStack","addLoadEvent","focusOnLoad","setElementClass","toggleElementClass","addElementClass","removeElementClass","swapElementClass","hasElementClass","escapeHTML","toHTML","emitHTML","setDisplayForElement","hideElement","showElement","scrapeText","elementDimensions","elementPosition","setElementDimensions","setElementPosition","getViewportDimensions","setOpacity"];
+MochiKit.DOM.EXPORT_OK=["domConverters"];
+MochiKit.DOM.Dimensions=function(w,h){
+this.w=w;
+this.h=h;
+};
+MochiKit.DOM.Dimensions.prototype.repr=function(){
+var repr=MochiKit.Base.repr;
+return "{w: "+repr(this.w)+", h: "+repr(this.h)+"}";
+};
+MochiKit.DOM.Coordinates=function(x,y){
+this.x=x;
+this.y=y;
+};
+MochiKit.DOM.Coordinates.prototype.repr=function(){
+var repr=MochiKit.Base.repr;
+return "{x: "+repr(this.x)+", y: "+repr(this.y)+"}";
+};
+MochiKit.DOM.Coordinates.prototype.toString=function(){
+return this.repr();
+};
+MochiKit.Base.update(MochiKit.DOM,{setOpacity:function(elem,o){
+elem=MochiKit.DOM.getElement(elem);
+MochiKit.DOM.updateNodeAttributes(elem,{"style":{"opacity":o,"-moz-opacity":o,"-khtml-opacity":o,"filter":" alpha(opacity="+(o*100)+")"}});
+},getViewportDimensions:function(){
+var d=new MochiKit.DOM.Dimensions();
+var w=MochiKit.DOM._window;
+var b=MochiKit.DOM._document.body;
+if(w.innerWidth){
+d.w=w.innerWidth;
+d.h=w.innerHeight;
+}else{
+if(b.parentElement.clientWidth){
+d.w=b.parentElement.clientWidth;
+d.h=b.parentElement.clientHeight;
+}else{
+if(b&&b.clientWidth){
+d.w=b.clientWidth;
+d.h=b.clientHeight;
+}
+}
+}
+return d;
+},elementDimensions:function(elem){
+var self=MochiKit.DOM;
+if(typeof (elem.w)=="number"||typeof (elem.h)=="number"){
+return new self.Dimensions(elem.w||0,elem.h||0);
+}
+elem=self.getElement(elem);
+if(!elem){
+return undefined;
+}
+if(self.computedStyle(elem,"display")!="none"){
+return new self.Dimensions(elem.offsetWidth||0,elem.offsetHeight||0);
+}
+var s=elem.style;
+var _322=s.visibility;
+var _323=s.position;
+s.visibility="hidden";
+s.position="absolute";
+s.display="";
+var _324=elem.offsetWidth;
+var _325=elem.offsetHeight;
+s.display="none";
+s.position=_323;
+s.visibility=_322;
+return new self.Dimensions(_324,_325);
+},elementPosition:function(elem,_326){
+var self=MochiKit.DOM;
+elem=self.getElement(elem);
+if(!elem){
+return undefined;
+}
+var c=new self.Coordinates(0,0);
+if(elem.x&&elem.y){
+c.x+=elem.x||0;
+c.y+=elem.y||0;
+return c;
+}else{
+if(elem.parentNode===null||self.computedStyle(elem,"display")=="none"){
+return undefined;
+}
+}
+var box=null;
+var _329=null;
+var d=MochiKit.DOM._document;
+var de=d.documentElement;
+var b=d.body;
+if(elem.getBoundingClientRect){
+box=elem.getBoundingClientRect();
+c.x+=box.left+(de.scrollLeft||b.scrollLeft)-(de.clientLeft||b.clientLeft);
+c.y+=box.top+(de.scrollTop||b.scrollTop)-(de.clientTop||b.clientTop);
+}else{
+if(d.getBoxObjectFor){
+box=d.getBoxObjectFor(elem);
+c.x+=box.x;
+c.y+=box.y;
+}else{
+if(elem.offsetParent){
+c.x+=elem.offsetLeft;
+c.y+=elem.offsetTop;
+_329=elem.offsetParent;
+if(_329!=elem){
+while(_329){
+c.x+=_329.offsetLeft;
+c.y+=_329.offsetTop;
+_329=_329.offsetParent;
+}
+}
+var ua=navigator.userAgent.toLowerCase();
+if((typeof (opera)!="undefined"&&parseFloat(opera.version())<9)||(ua.indexOf("safari")!=-1&&self.computedStyle(elem,"position")=="absolute")){
+c.x-=b.offsetLeft;
+c.y-=b.offsetTop;
+}
+}
+}
+}
+if(typeof (_326)!="undefined"){
+_326=arguments.callee(_326);
+if(_326){
+c.x-=(_326.x||0);
+c.y-=(_326.y||0);
+}
+}
+if(elem.parentNode){
+_329=elem.parentNode;
+}else{
+_329=null;
+}
+while(_329&&_329.tagName!="BODY"&&_329.tagName!="HTML"){
+c.x-=_329.scrollLeft;
+c.y-=_329.scrollTop;
+if(_329.parentNode){
+_329=_329.parentNode;
+}else{
+_329=null;
+}
+}
+return c;
+},setElementDimensions:function(elem,_332,_333){
+elem=MochiKit.DOM.getElement(elem);
+if(typeof (_333)=="undefined"){
+_333="px";
+}
+MochiKit.DOM.updateNodeAttributes(elem,{"style":{"width":_332.w+_333,"height":_332.h+_333}});
+},setElementPosition:function(elem,_334,_335){
+elem=MochiKit.DOM.getElement(elem);
+if(typeof (_335)=="undefined"){
+_335="px";
+}
+MochiKit.DOM.updateNodeAttributes(elem,{"style":{"left":_334.x+_335,"top":_334.y+_335}});
+},currentWindow:function(){
+return MochiKit.DOM._window;
+},currentDocument:function(){
+return MochiKit.DOM._document;
+},withWindow:function(win,func){
+var self=MochiKit.DOM;
+var _337=self._document;
+var _338=self._win;
+var rval;
+try{
+self._window=win;
+self._document=win.document;
+rval=func();
+}
+catch(e){
+self._window=_338;
+self._document=_337;
+throw e;
+}
+self._window=_338;
+self._document=_337;
+return rval;
+},formContents:function(elem){
+var _339=[];
+var _340=[];
+var m=MochiKit.Base;
+var self=MochiKit.DOM;
+if(typeof (elem)=="undefined"||elem===null){
+elem=self._document;
+}else{
+elem=self.getElement(elem);
+}
+m.nodeWalk(elem,function(elem){
+var name=elem.name;
+if(m.isNotEmpty(name)){
+var _341=elem.nodeName;
+if(_341=="INPUT"&&(elem.type=="radio"||elem.type=="checkbox")&&!elem.checked){
+return null;
+}
+if(_341=="SELECT"){
+if(elem.selectedIndex>=0){
+var opt=elem.options[elem.selectedIndex];
+_339.push(name);
+_340.push((opt.value)?opt.value:opt.text);
+return null;
+}
+_339.push(name);
+_340.push("");
+return null;
+}
+if(_341=="FORM"||_341=="P"||_341=="SPAN"||_341=="DIV"){
+return elem.childNodes;
+}
+_339.push(name);
+_340.push(elem.value||"");
+return null;
+}
+return elem.childNodes;
+});
+return [_339,_340];
+},withDocument:function(doc,func){
+var self=MochiKit.DOM;
+var _344=self._document;
+var rval;
+try{
+self._document=doc;
+rval=func();
+}
+catch(e){
+self._document=_344;
+throw e;
+}
+self._document=_344;
+return rval;
+},registerDOMConverter:function(name,_345,wrap,_346){
+MochiKit.DOM.domConverters.register(name,_345,wrap,_346);
+},coerceToDOM:function(node,ctx){
+var im=MochiKit.Iter;
+var self=MochiKit.DOM;
+var iter=im.iter;
+var _350=im.repeat;
+var imap=im.imap;
+var _352=self.domConverters;
+var _353=self.coerceToDOM;
+var _354=MochiKit.Base.NotFound;
+while(true){
+if(typeof (node)=="undefined"||node===null){
+return null;
+}
+if(typeof (node.nodeType)!="undefined"&&node.nodeType>0){
+return node;
+}
+if(typeof (node)=="number"||typeof (node)=="boolean"){
+node=node.toString();
+}
+if(typeof (node)=="string"){
+return self._document.createTextNode(node);
+}
+if(typeof (node.toDOM)=="function"){
+node=node.toDOM(ctx);
+continue;
+}
+if(typeof (node)=="function"){
+node=node(ctx);
+continue;
+}
+var _355=null;
+try{
+_355=iter(node);
+}
+catch(e){
+}
+if(_355){
+return imap(_353,_355,_350(ctx));
+}
+try{
+node=_352.match(node,ctx);
+continue;
+}
+catch(e){
+if(e!=_354){
+throw e;
+}
+}
+return self._document.createTextNode(node.toString());
+}
+return undefined;
+},setNodeAttribute:function(node,attr,_357){
+var o={};
+o[attr]=_357;
+try{
+return MochiKit.DOM.updateNodeAttributes(node,o);
+}
+catch(e){
+}
+return null;
+},getNodeAttribute:function(node,attr){
+var self=MochiKit.DOM;
+var _358=self.attributeArray.renames[attr];
+node=self.getElement(node);
+try{
+if(_358){
+return node[_358];
+}
+return node.getAttribute(attr);
+}
+catch(e){
+}
+return null;
+},updateNodeAttributes:function(node,_359){
+var elem=node;
+var self=MochiKit.DOM;
+if(typeof (node)=="string"){
+elem=self.getElement(node);
+}
+if(_359){
+var _360=MochiKit.Base.updatetree;
+if(self.attributeArray.compliant){
+for(var k in _359){
+var v=_359[k];
+if(typeof (v)=="object"&&typeof (elem[k])=="object"){
+_360(elem[k],v);
+}else{
+if(k.substring(0,2)=="on"){
+if(typeof (v)=="string"){
+v=new Function(v);
+}
+elem[k]=v;
+}else{
+elem.setAttribute(k,v);
+}
+}
+}
+}else{
+var _361=self.attributeArray.renames;
+for(k in _359){
+v=_359[k];
+var _362=_361[k];
+if(k=="style"&&typeof (v)=="string"){
+elem.style.cssText=v;
+}else{
+if(typeof (_362)=="string"){
+elem[_362]=v;
+}else{
+if(typeof (elem[k])=="object"&&typeof (v)=="object"){
+_360(elem[k],v);
+}else{
+if(k.substring(0,2)=="on"){
+if(typeof (v)=="string"){
+v=new Function(v);
+}
+elem[k]=v;
+}else{
+elem.setAttribute(k,v);
+}
+}
+}
+}
+}
+}
+}
+return elem;
+},appendChildNodes:function(node){
+var elem=node;
+var self=MochiKit.DOM;
+if(typeof (node)=="string"){
+elem=self.getElement(node);
+}
+var _363=[self.coerceToDOM(MochiKit.Base.extend(null,arguments,1),elem)];
+var _364=MochiKit.Base.concat;
+while(_363.length){
+var n=_363.shift();
+if(typeof (n)=="undefined"||n===null){
+}else{
+if(typeof (n.nodeType)=="number"){
+elem.appendChild(n);
+}else{
+_363=_364(n,_363);
+}
+}
+}
+return elem;
+},replaceChildNodes:function(node){
+var elem=node;
+var self=MochiKit.DOM;
+if(typeof (node)=="string"){
+elem=self.getElement(node);
+arguments[0]=elem;
+}
+var _365;
+while((_365=elem.firstChild)){
+elem.removeChild(_365);
+}
+if(arguments.length<2){
+return elem;
+}else{
+return self.appendChildNodes.apply(this,arguments);
+}
+},createDOM:function(name,_366){
+var elem;
+var self=MochiKit.DOM;
+var m=MochiKit.Base;
+if(typeof (_366)=="string"||typeof (_366)=="number"){
+var args=m.extend([name,null],arguments,1);
+return arguments.callee.apply(this,args);
+}
+if(typeof (name)=="string"){
+if(_366&&"name" in _366&&!self.attributeArray.compliant){
+name=("<"+name+" name=\""+self.escapeHTML(_366.name)+"\">");
+}
+elem=self._document.createElement(name);
+}else{
+elem=name;
+}
+if(_366){
+self.updateNodeAttributes(elem,_366);
+}
+if(arguments.length<=2){
+return elem;
+}else{
+var args=m.extend([elem],arguments,2);
+return self.appendChildNodes.apply(this,args);
+}
+},createDOMFunc:function(){
+var m=MochiKit.Base;
+return m.partial.apply(this,m.extend([MochiKit.DOM.createDOM],arguments));
+},swapDOM:function(dest,src){
+var self=MochiKit.DOM;
+dest=self.getElement(dest);
+var _369=dest.parentNode;
+if(src){
+src=self.getElement(src);
+_369.replaceChild(src,dest);
+}else{
+_369.removeChild(dest);
+}
+return src;
+},getElement:function(id){
+var self=MochiKit.DOM;
+if(arguments.length==1){
+return ((typeof (id)=="string")?self._document.getElementById(id):id);
+}else{
+return MochiKit.Base.map(self.getElement,arguments);
+}
+},computedStyle:function(_371,_372,_373){
+if(arguments.length==2){
+_373=_372;
+}
+var self=MochiKit.DOM;
+var el=self.getElement(_371);
+var _375=self._document;
+if(!el||el==_375){
+return undefined;
+}
+if(el.currentStyle){
+return el.currentStyle[_372];
+}
+if(typeof (_375.defaultView)=="undefined"){
+return undefined;
+}
+if(_375.defaultView===null){
+return undefined;
+}
+var _376=_375.defaultView.getComputedStyle(el,null);
+if(typeof (_376)=="undefined"||_376===null){
+return undefined;
+}
+return _376.getPropertyValue(_373);
+},getElementsByTagAndClassName:function(_377,_378,_379){
+var self=MochiKit.DOM;
+if(typeof (_377)=="undefined"||_377===null){
+_377="*";
+}
+if(typeof (_379)=="undefined"||_379===null){
+_379=self._document;
+}
+_379=self.getElement(_379);
+var _380=(_379.getElementsByTagName(_377)||self._document.all);
+if(typeof (_378)=="undefined"||_378===null){
+return MochiKit.Base.extend(null,_380);
+}
+var _381=[];
+for(var i=0;i<_380.length;i++){
+var _382=_380[i];
+var _383=_382.className.split(" ");
+for(var j=0;j<_383.length;j++){
+if(_383[j]==_378){
+_381.push(_382);
+break;
+}
+}
+}
+return _381;
+},_newCallStack:function(path,once){
+var rval=function(){
+var _386=arguments.callee.callStack;
+for(var i=0;i<_386.length;i++){
+if(_386[i].apply(this,arguments)===false){
+break;
+}
+}
+if(once){
+try{
+this[path]=null;
+}
+catch(e){
+}
+}
+};
+rval.callStack=[];
+return rval;
+},addToCallStack:function(_387,path,func,once){
+var self=MochiKit.DOM;
+var _388=_387[path];
+var _389=_388;
+if(!(typeof (_388)=="function"&&typeof (_388.callStack)=="object"&&_388.callStack!==null)){
+_389=self._newCallStack(path,once);
+if(typeof (_388)=="function"){
+_389.callStack.push(_388);
+}
+_387[path]=_389;
+}
+_389.callStack.push(func);
+},addLoadEvent:function(func){
+var self=MochiKit.DOM;
+self.addToCallStack(self._window,"onload",func,true);
+},focusOnLoad:function(_390){
+var self=MochiKit.DOM;
+self.addLoadEvent(function(){
+_390=self.getElement(_390);
+if(_390){
+_390.focus();
+}
+});
+},setElementClass:function(_391,_392){
+var self=MochiKit.DOM;
+var obj=self.getElement(_391);
+if(self.attributeArray.compliant){
+obj.setAttribute("class",_392);
+}else{
+obj.setAttribute("className",_392);
+}
+},toggleElementClass:function(_393){
+var self=MochiKit.DOM;
+for(var i=1;i<arguments.length;i++){
+var obj=self.getElement(arguments[i]);
+if(!self.addElementClass(obj,_393)){
+self.removeElementClass(obj,_393);
+}
+}
+},addElementClass:function(_394,_395){
+var self=MochiKit.DOM;
+var obj=self.getElement(_394);
+var cls=obj.className;
+if(cls.length===0){
+self.setElementClass(obj,_395);
+return true;
+}
+if(cls==_395){
+return false;
+}
+var _397=obj.className.split(" ");
+for(var i=0;i<_397.length;i++){
+if(_397[i]==_395){
+return false;
+}
+}
+self.setElementClass(obj,cls+" "+_395);
+return true;
+},removeElementClass:function(_398,_399){
+var self=MochiKit.DOM;
+var obj=self.getElement(_398);
+var cls=obj.className;
+if(cls.length===0){
+return false;
+}
+if(cls==_399){
+self.setElementClass(obj,"");
+return true;
+}
+var _400=obj.className.split(" ");
+for(var i=0;i<_400.length;i++){
+if(_400[i]==_399){
+_400.splice(i,1);
+self.setElementClass(obj,_400.join(" "));
+return true;
+}
+}
+return false;
+},swapElementClass:function(_401,_402,_403){
+var obj=MochiKit.DOM.getElement(_401);
+var res=MochiKit.DOM.removeElementClass(obj,_402);
+if(res){
+MochiKit.DOM.addElementClass(obj,_403);
+}
+return res;
+},hasElementClass:function(_404,_405){
+var obj=MochiKit.DOM.getElement(_404);
+var _406=obj.className.split(" ");
+for(var i=1;i<arguments.length;i++){
+var good=false;
+for(var j=0;j<_406.length;j++){
+if(_406[j]==arguments[i]){
+good=true;
+break;
+}
+}
+if(!good){
+return false;
+}
+}
+return true;
+},escapeHTML:function(s){
+return s.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/</g,"&lt;").replace(/>/g,"&gt;");
+},toHTML:function(dom){
+return MochiKit.DOM.emitHTML(dom).join("");
+},emitHTML:function(dom,lst){
+if(typeof (lst)=="undefined"||lst===null){
+lst=[];
+}
+var _409=[dom];
+var self=MochiKit.DOM;
+var _410=self.escapeHTML;
+var _411=self.attributeArray;
+while(_409.length){
+dom=_409.pop();
+if(typeof (dom)=="string"){
+lst.push(dom);
+}else{
+if(dom.nodeType==1){
+lst.push("<"+dom.nodeName.toLowerCase());
+var _412=[];
+var _413=_411(dom);
+for(var i=0;i<_413.length;i++){
+var a=_413[i];
+_412.push([" ",a.name,"=\"",_410(a.value),"\""]);
+}
+_412.sort();
+for(i=0;i<_412.length;i++){
+var _414=_412[i];
+for(var j=0;j<_414.length;j++){
+lst.push(_414[j]);
+}
+}
+if(dom.hasChildNodes()){
+lst.push(">");
+_409.push("</"+dom.nodeName.toLowerCase()+">");
+var _415=dom.childNodes;
+for(i=_415.length-1;i>=0;i--){
+_409.push(_415[i]);
+}
+}else{
+lst.push("/>");
+}
+}else{
+if(dom.nodeType==3){
+lst.push(_410(dom.nodeValue));
+}
+}
+}
+}
+return lst;
+},setDisplayForElement:function(_416,_417){
+var m=MochiKit.Base;
+var _418=m.extend(null,arguments,1);
+MochiKit.Iter.forEach(m.filter(null,m.map(MochiKit.DOM.getElement,_418)),function(_417){
+_417.style.display=_416;
+});
+},scrapeText:function(node,_419){
+var rval=[];
+(function(node){
+var cn=node.childNodes;
+if(cn){
+for(var i=0;i<cn.length;i++){
+arguments.callee.call(this,cn[i]);
+}
+}
+var _421=node.nodeValue;
+if(typeof (_421)=="string"){
+rval.push(_421);
+}
+})(MochiKit.DOM.getElement(node));
+if(_419){
+return rval;
+}else{
+return rval.join("");
+}
+},__new__:function(win){
+var m=MochiKit.Base;
+this._document=document;
+this._window=win;
+this.domConverters=new m.AdapterRegistry();
+var _422=this._document.createElement("span");
+var _423;
+if(_422&&_422.attributes&&_422.attributes.length>0){
+var _424=m.filter;
+_423=function(node){
+return _424(_423.ignoreAttrFilter,node.attributes);
+};
+_423.ignoreAttr={};
+MochiKit.Iter.forEach(_422.attributes,function(a){
+_423.ignoreAttr[a.name]=a.value;
+});
+_423.ignoreAttrFilter=function(a){
+return (_423.ignoreAttr[a.name]!=a.value);
+};
+_423.compliant=false;
+_423.renames={"class":"className","checked":"defaultChecked","usemap":"useMap","for":"htmlFor"};
+}else{
+_423=function(node){
+return node.attributes;
+};
+_423.compliant=true;
+_423.renames={};
+}
+this.attributeArray=_423;
+var _425=this.createDOMFunc;
+this.UL=_425("ul");
+this.OL=_425("ol");
+this.LI=_425("li");
+this.TD=_425("td");
+this.TR=_425("tr");
+this.TBODY=_425("tbody");
+this.THEAD=_425("thead");
+this.TFOOT=_425("tfoot");
+this.TABLE=_425("table");
+this.TH=_425("th");
+this.INPUT=_425("input");
+this.SPAN=_425("span");
+this.A=_425("a");
+this.DIV=_425("div");
+this.IMG=_425("img");
+this.BUTTON=_425("button");
+this.TT=_425("tt");
+this.PRE=_425("pre");
+this.H1=_425("h1");
+this.H2=_425("h2");
+this.H3=_425("h3");
+this.BR=_425("br");
+this.HR=_425("hr");
+this.LABEL=_425("label");
+this.TEXTAREA=_425("textarea");
+this.FORM=_425("form");
+this.P=_425("p");
+this.SELECT=_425("select");
+this.OPTION=_425("option");
+this.OPTGROUP=_425("optgroup");
+this.LEGEND=_425("legend");
+this.FIELDSET=_425("fieldset");
+this.STRONG=_425("strong");
+this.CANVAS=_425("canvas");
+this.hideElement=m.partial(this.setDisplayForElement,"none");
+this.showElement=m.partial(this.setDisplayForElement,"block");
+this.removeElement=this.swapDOM;
+this.$=this.getElement;
+this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)};
+m.nameFunctions(this);
+}});
+MochiKit.DOM.__new__(((typeof (window)=="undefined")?this:window));
+if(!MochiKit.__compat__){
+withWindow=MochiKit.DOM.withWindow;
+withDocument=MochiKit.DOM.withDocument;
+}
+MochiKit.Base._exportSymbols(this,MochiKit.DOM);
+if(typeof (dojo)!="undefined"){
+dojo.provide("MochiKit.LoggingPane");
+dojo.require("MochiKit.Logging");
+dojo.require("MochiKit.Base");
+}
+if(typeof (JSAN)!="undefined"){
+JSAN.use("MochiKit.Logging",[]);
+JSAN.use("MochiKit.Base",[]);
+}
+try{
+if(typeof (MochiKit.Base)=="undefined"||typeof (MochiKit.Logging)=="undefined"){
+throw "";
+}
+}
+catch(e){
+throw "MochiKit.LoggingPane depends on MochiKit.Base and MochiKit.Logging!";
+}
+if(typeof (MochiKit.LoggingPane)=="undefined"){
+MochiKit.LoggingPane={};
+}
+MochiKit.LoggingPane.NAME="MochiKit.LoggingPane";
+MochiKit.LoggingPane.VERSION="1.3.1";
+MochiKit.LoggingPane.__repr__=function(){
+return "["+this.NAME+" "+this.VERSION+"]";
+};
+MochiKit.LoggingPane.toString=function(){
+return this.__repr__();
+};
+MochiKit.LoggingPane.createLoggingPane=function(_426){
+var m=MochiKit.LoggingPane;
+_426=!(!_426);
+if(m._loggingPane&&m._loggingPane.inline!=_426){
+m._loggingPane.closePane();
+m._loggingPane=null;
+}
+if(!m._loggingPane||m._loggingPane.closed){
+m._loggingPane=new m.LoggingPane(_426,MochiKit.Logging.logger);
+}
+return m._loggingPane;
+};
+MochiKit.LoggingPane.LoggingPane=function(_427,_428){
+if(typeof (_428)=="undefined"||_428===null){
+_428=MochiKit.Logging.logger;
+}
+this.logger=_428;
+var _429=MochiKit.Base.update;
+var _430=MochiKit.Base.updatetree;
+var bind=MochiKit.Base.bind;
+var _431=MochiKit.Base.clone;
+var win=window;
+var uid="_MochiKit_LoggingPane";
+if(typeof (MochiKit.DOM)!="undefined"){
+win=MochiKit.DOM.currentWindow();
+}
+if(!_427){
+var url=win.location.href.split("?")[0].replace(/[:\/.><&]/g,"_");
+var name=uid+"_"+url;
+var nwin=win.open("",name,"dependent,resizable,height=200");
+if(!nwin){
+alert("Not able to open debugging window due to pop-up blocking.");
+return undefined;
+}
+nwin.document.write("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" "+"\"http://www.w3.org/TR/html4/loose.dtd\">"+"<html><head><title>[MochiKit.LoggingPane]</title></head>"+"<body></body></html>");
+nwin.document.close();
+nwin.document.title+=" "+win.document.title;
+win=nwin;
+}
+var doc=win.document;
+this.doc=doc;
+var _434=doc.getElementById(uid);
+var _435=!!_434;
+if(_434&&typeof (_434.loggingPane)!="undefined"){
+_434.loggingPane.logger=this.logger;
+_434.loggingPane.buildAndApplyFilter();
+return _434.loggingPane;
+}
+if(_435){
+var _436;
+while((_436=_434.firstChild)){
+_434.removeChild(_436);
+}
+}else{
+_434=doc.createElement("div");
+_434.id=uid;
+}
+_434.loggingPane=this;
+var _437=doc.createElement("input");
+var _438=doc.createElement("input");
+var _439=doc.createElement("button");
+var _440=doc.createElement("button");
+var _441=doc.createElement("button");
+var _442=doc.createElement("button");
+var _443=doc.createElement("div");
+var _444=doc.createElement("div");
+var _445=uid+"_Listener";
+this.colorTable=_431(this.colorTable);
+var _446=[];
+var _447=null;
+var _448=function(msg){
+var _449=msg.level;
+if(typeof (_449)=="number"){
+_449=MochiKit.Logging.LogLevel[_449];
+}
+return _449;
+};
+var _450=function(msg){
+return msg.info.join(" ");
+};
+var _451=bind(function(msg){
+var _452=_448(msg);
+var text=_450(msg);
+var c=this.colorTable[_452];
+var p=doc.createElement("span");
+p.className="MochiKit-LogMessage MochiKit-LogLevel-"+_452;
+p.style.cssText="margin: 0px; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; white-space: pre-line; word-wrap: break-word; wrap-option: emergency; color: "+c;
+p.appendChild(doc.createTextNode(_452+": "+text));
+_444.appendChild(p);
+_444.appendChild(doc.createElement("br"));
+if(_443.offsetHeight>_443.scrollHeight){
+_443.scrollTop=0;
+}else{
+_443.scrollTop=_443.scrollHeight;
+}
+},this);
+var _454=function(msg){
+_446[_446.length]=msg;
+_451(msg);
+};
+var _455=function(){
+var _456,infore;
+try{
+_456=new RegExp(_437.value);
+infore=new RegExp(_438.value);
+}
+catch(e){
+logDebug("Error in filter regex: "+e.message);
+return null;
+}
+return function(msg){
+return (_456.test(_448(msg))&&infore.test(_450(msg)));
+};
+};
+var _457=function(){
+while(_444.firstChild){
+_444.removeChild(_444.firstChild);
+}
+};
+var _458=function(){
+_446=[];
+_457();
+};
+var _459=bind(function(){
+if(this.closed){
+return;
+}
+this.closed=true;
+if(MochiKit.LoggingPane._loggingPane==this){
+MochiKit.LoggingPane._loggingPane=null;
+}
+this.logger.removeListener(_445);
+_434.loggingPane=null;
+if(_427){
+_434.parentNode.removeChild(_434);
+}else{
+this.win.close();
+}
+},this);
+var _460=function(){
+_457();
+for(var i=0;i<_446.length;i++){
+var msg=_446[i];
+if(_447===null||_447(msg)){
+_451(msg);
+}
+}
+};
+this.buildAndApplyFilter=function(){
+_447=_455();
+_460();
+this.logger.removeListener(_445);
+this.logger.addListener(_445,_447,_454);
+};
+var _461=bind(function(){
+_446=this.logger.getMessages();
+_460();
+},this);
+var _462=bind(function(_463){
+_463=_463||window.event;
+key=_463.which||_463.keyCode;
+if(key==13){
+this.buildAndApplyFilter();
+}
+},this);
+var _464="display: block; z-index: 1000; left: 0px; bottom: 0px; position: fixed; width: 100%; background-color: white; font: "+this.logFont;
+if(_427){
+_464+="; height: 10em; border-top: 2px solid black";
+}else{
+_464+="; height: 100%;";
+}
+_434.style.cssText=_464;
+if(!_435){
+doc.body.appendChild(_434);
+}
+_464={"cssText":"width: 33%; display: inline; font: "+this.logFont};
+_430(_437,{"value":"FATAL|ERROR|WARNING|INFO|DEBUG","onkeypress":_462,"style":_464});
+_434.appendChild(_437);
+_430(_438,{"value":".*","onkeypress":_462,"style":_464});
+_434.appendChild(_438);
+_464="width: 8%; display:inline; font: "+this.logFont;
+_439.appendChild(doc.createTextNode("Filter"));
+_439.onclick=bind("buildAndApplyFilter",this);
+_439.style.cssText=_464;
+_434.appendChild(_439);
+_440.appendChild(doc.createTextNode("Load"));
+_440.onclick=_461;
+_440.style.cssText=_464;
+_434.appendChild(_440);
+_441.appendChild(doc.createTextNode("Clear"));
+_441.onclick=_458;
+_441.style.cssText=_464;
+_434.appendChild(_441);
+_442.appendChild(doc.createTextNode("Close"));
+_442.onclick=_459;
+_442.style.cssText=_464;
+_434.appendChild(_442);
+_443.style.cssText="overflow: auto; width: 100%";
+_444.style.cssText="width: 100%; height: "+(_427?"8em":"100%");
+_443.appendChild(_444);
+_434.appendChild(_443);
+this.buildAndApplyFilter();
+_461();
+if(_427){
+this.win=undefined;
+}else{
+this.win=win;
+}
+this.inline=_427;
+this.closePane=_459;
+this.closed=false;
+return this;
+};
+MochiKit.LoggingPane.LoggingPane.prototype={"logFont":"8pt Verdana,sans-serif","colorTable":{"ERROR":"red","FATAL":"darkred","WARNING":"blue","INFO":"black","DEBUG":"green"}};
+MochiKit.LoggingPane.EXPORT_OK=["LoggingPane"];
+MochiKit.LoggingPane.EXPORT=["createLoggingPane"];
+MochiKit.LoggingPane.__new__=function(){
+this.EXPORT_TAGS={":common":this.EXPORT,":all":MochiKit.Base.concat(this.EXPORT,this.EXPORT_OK)};
+MochiKit.Base.nameFunctions(this);
+MochiKit.LoggingPane._loggingPane=null;
+};
+MochiKit.LoggingPane.__new__();
+MochiKit.Base._exportSymbols(this,MochiKit.LoggingPane);
+if(typeof (dojo)!="undefined"){
+dojo.provide("MochiKit.Color");
+dojo.require("MochiKit.Base");
+}
+if(typeof (JSAN)!="undefined"){
+JSAN.use("MochiKit.Base",[]);
+}
+try{
+if(typeof (MochiKit.Base)=="undefined"){
+throw "";
+}
+}
+catch(e){
+throw "MochiKit.Color depends on MochiKit.Base";
+}
+if(typeof (MochiKit.Color)=="undefined"){
+MochiKit.Color={};
+}
+MochiKit.Color.NAME="MochiKit.Color";
+MochiKit.Color.VERSION="1.3.1";
+MochiKit.Color.__repr__=function(){
+return "["+this.NAME+" "+this.VERSION+"]";
+};
+MochiKit.Color.toString=function(){
+return this.__repr__();
+};
+MochiKit.Color.Color=function(red,_466,blue,_468){
+if(typeof (_468)=="undefined"||_468===null){
+_468=1;
+}
+this.rgb={r:red,g:_466,b:blue,a:_468};
+};
+MochiKit.Color.Color.prototype={__class__:MochiKit.Color.Color,colorWithAlpha:function(_469){
+var rgb=this.rgb;
+var m=MochiKit.Color;
+return m.Color.fromRGB(rgb.r,rgb.g,rgb.b,_469);
+},colorWithHue:function(hue){
+var hsl=this.asHSL();
+hsl.h=hue;
+var m=MochiKit.Color;
+return m.Color.fromHSL(hsl);
+},colorWithSaturation:function(_473){
+var hsl=this.asHSL();
+hsl.s=_473;
+var m=MochiKit.Color;
+return m.Color.fromHSL(hsl);
+},colorWithLightness:function(_474){
+var hsl=this.asHSL();
+hsl.l=_474;
+var m=MochiKit.Color;
+return m.Color.fromHSL(hsl);
+},darkerColorWithLevel:function(_475){
+var hsl=this.asHSL();
+hsl.l=Math.max(hsl.l-_475,0);
+var m=MochiKit.Color;
+return m.Color.fromHSL(hsl);
+},lighterColorWithLevel:function(_476){
+var hsl=this.asHSL();
+hsl.l=Math.min(hsl.l+_476,1);
+var m=MochiKit.Color;
+return m.Color.fromHSL(hsl);
+},blendedColor:function(_477,_478){
+if(typeof (_478)=="undefined"||_478===null){
+_478=0.5;
+}
+var sf=1-_478;
+var s=this.rgb;
+var d=_477.rgb;
+var df=_478;
+return MochiKit.Color.Color.fromRGB((s.r*sf)+(d.r*df),(s.g*sf)+(d.g*df),(s.b*sf)+(d.b*df),(s.a*sf)+(d.a*df));
+},compareRGB:function(_481){
+var a=this.asRGB();
+var b=_481.asRGB();
+return MochiKit.Base.compare([a.r,a.g,a.b,a.a],[b.r,b.g,b.b,b.a]);
+},isLight:function(){
+return this.asHSL().b>0.5;
+},isDark:function(){
+return (!this.isLight());
+},toHSLString:function(){
+var c=this.asHSL();
+var ccc=MochiKit.Color.clampColorComponent;
+var rval=this._hslString;
+if(!rval){
+var mid=(ccc(c.h,360).toFixed(0)+","+ccc(c.s,100).toPrecision(4)+"%"+","+ccc(c.l,100).toPrecision(4)+"%");
+var a=c.a;
+if(a>=1){
+a=1;
+rval="hsl("+mid+")";
+}else{
+if(a<=0){
+a=0;
+}
+rval="hsla("+mid+","+a+")";
+}
+this._hslString=rval;
+}
+return rval;
+},toRGBString:function(){
+var c=this.rgb;
+var ccc=MochiKit.Color.clampColorComponent;
+var rval=this._rgbString;
+if(!rval){
+var mid=(ccc(c.r,255).toFixed(0)+","+ccc(c.g,255).toFixed(0)+","+ccc(c.b,255).toFixed(0));
+if(c.a!=1){
+rval="rgba("+mid+","+c.a+")";
+}else{
+rval="rgb("+mid+")";
+}
+this._rgbString=rval;
+}
+return rval;
+},asRGB:function(){
+return MochiKit.Base.clone(this.rgb);
+},toHexString:function(){
+var m=MochiKit.Color;
+var c=this.rgb;
+var ccc=MochiKit.Color.clampColorComponent;
+var rval=this._hexString;
+if(!rval){
+rval=("#"+m.toColorPart(ccc(c.r,255))+m.toColorPart(ccc(c.g,255))+m.toColorPart(ccc(c.b,255)));
+this._hexString=rval;
+}
+return rval;
+},asHSV:function(){
+var hsv=this.hsv;
+var c=this.rgb;
+if(typeof (hsv)=="undefined"||hsv===null){
+hsv=MochiKit.Color.rgbToHSV(this.rgb);
+this.hsv=hsv;
+}
+return MochiKit.Base.clone(hsv);
+},asHSL:function(){
+var hsl=this.hsl;
+var c=this.rgb;
+if(typeof (hsl)=="undefined"||hsl===null){
+hsl=MochiKit.Color.rgbToHSL(this.rgb);
+this.hsl=hsl;
+}
+return MochiKit.Base.clone(hsl);
+},toString:function(){
+return this.toRGBString();
+},repr:function(){
+var c=this.rgb;
+var col=[c.r,c.g,c.b,c.a];
+return this.__class__.NAME+"("+col.join(", ")+")";
+}};
+MochiKit.Base.update(MochiKit.Color.Color,{fromRGB:function(red,_486,blue,_487){
+var _488=MochiKit.Color.Color;
+if(arguments.length==1){
+var rgb=red;
+red=rgb.r;
+_486=rgb.g;
+blue=rgb.b;
+if(typeof (rgb.a)=="undefined"){
+_487=undefined;
+}else{
+_487=rgb.a;
+}
+}
+return new _488(red,_486,blue,_487);
+},fromHSL:function(hue,_489,_490,_491){
+var m=MochiKit.Color;
+return m.Color.fromRGB(m.hslToRGB.apply(m,arguments));
+},fromHSV:function(hue,_492,_493,_494){
+var m=MochiKit.Color;
+return m.Color.fromRGB(m.hsvToRGB.apply(m,arguments));
+},fromName:function(name){
+var _495=MochiKit.Color.Color;
+if(name.charAt(0)=="\""){
+name=name.substr(1,name.length-2);
+}
+var _496=_495._namedColors[name.toLowerCase()];
+if(typeof (_496)=="string"){
+return _495.fromHexString(_496);
+}else{
+if(name=="transparent"){
+return _495.transparentColor();
+}
+}
+return null;
+},fromString:function(_497){
+var self=MochiKit.Color.Color;
+var _498=_497.substr(0,3);
+if(_498=="rgb"){
+return self.fromRGBString(_497);
+}else{
+if(_498=="hsl"){
+return self.fromHSLString(_497);
+}else{
+if(_497.charAt(0)=="#"){
+return self.fromHexString(_497);
+}
+}
+}
+return self.fromName(_497);
+},fromHexString:function(_499){
+if(_499.charAt(0)=="#"){
+_499=_499.substring(1);
+}
+var _500=[];
+var i,hex;
+if(_499.length==3){
+for(i=0;i<3;i++){
+hex=_499.substr(i,1);
+_500.push(parseInt(hex+hex,16)/255);
+}
+}else{
+for(i=0;i<6;i+=2){
+hex=_499.substr(i,2);
+_500.push(parseInt(hex,16)/255);
+}
+}
+var _501=MochiKit.Color.Color;
+return _501.fromRGB.apply(_501,_500);
+},_fromColorString:function(pre,_503,_504,_505){
+if(_505.indexOf(pre)===0){
+_505=_505.substring(_505.indexOf("(",3)+1,_505.length-1);
+}
+var _506=_505.split(/\s*,\s*/);
+var _507=[];
+for(var i=0;i<_506.length;i++){
+var c=_506[i];
+var val;
+var _508=c.substring(c.length-3);
+if(c.charAt(c.length-1)=="%"){
+val=0.01*parseFloat(c.substring(0,c.length-1));
+}else{
+if(_508=="deg"){
+val=parseFloat(c)/360;
+}else{
+if(_508=="rad"){
+val=parseFloat(c)/(Math.PI*2);
+}else{
+val=_504[i]*parseFloat(c);
+}
+}
+}
+_507.push(val);
+}
+return this[_503].apply(this,_507);
+},fromComputedStyle:function(elem,_509,_510){
+var d=MochiKit.DOM;
+var cls=MochiKit.Color.Color;
+for(elem=d.getElement(elem);elem;elem=elem.parentNode){
+var _511=d.computedStyle.apply(d,arguments);
+if(!_511){
+continue;
+}
+var _512=cls.fromString(_511);
+if(!_512){
+break;
+}
+if(_512.asRGB().a>0){
+return _512;
+}
+}
+return null;
+},fromBackground:function(elem){
+var cls=MochiKit.Color.Color;
+return cls.fromComputedStyle(elem,"backgroundColor","background-color")||cls.whiteColor();
+},fromText:function(elem){
+var cls=MochiKit.Color.Color;
+return cls.fromComputedStyle(elem,"color","color")||cls.blackColor();
+},namedColors:function(){
+return MochiKit.Base.clone(MochiKit.Color.Color._namedColors);
+}});
+MochiKit.Base.update(MochiKit.Color,{clampColorComponent:function(v,_513){
+v*=_513;
+if(v<0){
+return 0;
+}else{
+if(v>_513){
+return _513;
+}else{
+return v;
+}
+}
+},_hslValue:function(n1,n2,hue){
+if(hue>6){
+hue-=6;
+}else{
+if(hue<0){
+hue+=6;
+}
+}
+var val;
+if(hue<1){
+val=n1+(n2-n1)*hue;
+}else{
+if(hue<3){
+val=n2;
+}else{
+if(hue<4){
+val=n1+(n2-n1)*(4-hue);
+}else{
+val=n1;
+}
+}
+}
+return val;
+},hsvToRGB:function(hue,_516,_517,_518){
+if(arguments.length==1){
+var hsv=hue;
+hue=hsv.h;
+_516=hsv.s;
+_517=hsv.v;
+_518=hsv.a;
+}
+var red;
+var _519;
+var blue;
+if(_516===0){
+red=0;
+_519=0;
+blue=0;
+}else{
+var i=Math.floor(hue*6);
+var f=(hue*6)-i;
+var p=_517*(1-_516);
+var q=_517*(1-(_516*f));
+var t=_517*(1-(_516*(1-f)));
+switch(i){
+case 1:
+red=q;
+_519=_517;
+blue=p;
+break;
+case 2:
+red=p;
+_519=_517;
+blue=t;
+break;
+case 3:
+red=p;
+_519=q;
+blue=_517;
+break;
+case 4:
+red=t;
+_519=p;
+blue=_517;
+break;
+case 5:
+red=_517;
+_519=p;
+blue=q;
+break;
+case 6:
+case 0:
+red=_517;
+_519=t;
+blue=p;
+break;
+}
+}
+return {r:red,g:_519,b:blue,a:_518};
+},hslToRGB:function(hue,_521,_522,_523){
+if(arguments.length==1){
+var hsl=hue;
+hue=hsl.h;
+_521=hsl.s;
+_522=hsl.l;
+_523=hsl.a;
+}
+var red;
+var _524;
+var blue;
+if(_521===0){
+red=_522;
+_524=_522;
+blue=_522;
+}else{
+var m2;
+if(_522<=0.5){
+m2=_522*(1+_521);
+}else{
+m2=_522+_521-(_522*_521);
+}
+var m1=(2*_522)-m2;
+var f=MochiKit.Color._hslValue;
+var h6=hue*6;
+red=f(m1,m2,h6+2);
+_524=f(m1,m2,h6);
+blue=f(m1,m2,h6-2);
+}
+return {r:red,g:_524,b:blue,a:_523};
+},rgbToHSV:function(red,_528,blue,_529){
+if(arguments.length==1){
+var rgb=red;
+red=rgb.r;
+_528=rgb.g;
+blue=rgb.b;
+_529=rgb.a;
+}
+var max=Math.max(Math.max(red,_528),blue);
+var min=Math.min(Math.min(red,_528),blue);
+var hue;
+var _532;
+var _533=max;
+if(min==max){
+hue=0;
+_532=0;
+}else{
+var _534=(max-min);
+_532=_534/max;
+if(red==max){
+hue=(_528-blue)/_534;
+}else{
+if(_528==max){
+hue=2+((blue-red)/_534);
+}else{
+hue=4+((red-_528)/_534);
+}
+}
+hue/=6;
+if(hue<0){
+hue+=1;
+}
+if(hue>1){
+hue-=1;
+}
+}
+return {h:hue,s:_532,v:_533,a:_529};
+},rgbToHSL:function(red,_535,blue,_536){
+if(arguments.length==1){
+var rgb=red;
+red=rgb.r;
+_535=rgb.g;
+blue=rgb.b;
+_536=rgb.a;
+}
+var max=Math.max(red,Math.max(_535,blue));
+var min=Math.min(red,Math.min(_535,blue));
+var hue;
+var _537;
+var _538=(max+min)/2;
+var _539=max-min;
+if(_539===0){
+hue=0;
+_537=0;
+}else{
+if(_538<=0.5){
+_537=_539/(max+min);
+}else{
+_537=_539/(2-max-min);
+}
+if(red==max){
+hue=(_535-blue)/_539;
+}else{
+if(_535==max){
+hue=2+((blue-red)/_539);
+}else{
+hue=4+((red-_535)/_539);
+}
+}
+hue/=6;
+if(hue<0){
+hue+=1;
+}
+if(hue>1){
+hue-=1;
+}
+}
+return {h:hue,s:_537,l:_538,a:_536};
+},toColorPart:function(num){
+num=Math.round(num);
+var _540=num.toString(16);
+if(num<16){
+return "0"+_540;
+}
+return _540;
+},__new__:function(){
+var m=MochiKit.Base;
+this.Color.fromRGBString=m.bind(this.Color._fromColorString,this.Color,"rgb","fromRGB",[1/255,1/255,1/255,1]);
+this.Color.fromHSLString=m.bind(this.Color._fromColorString,this.Color,"hsl","fromHSL",[1/360,0.01,0.01,1]);
+var _541=1/3;
+var _542={black:[0,0,0],blue:[0,0,1],brown:[0.6,0.4,0.2],cyan:[0,1,1],darkGray:[_541,_541,_541],gray:[0.5,0.5,0.5],green:[0,1,0],lightGray:[2*_541,2*_541,2*_541],magenta:[1,0,1],orange:[1,0.5,0],purple:[0.5,0,0.5],red:[1,0,0],transparent:[0,0,0,0],white:[1,1,1],yellow:[1,1,0]};
+var _543=function(name,r,g,b,a){
+var rval=this.fromRGB(r,g,b,a);
+this[name]=function(){
+return rval;
+};
+return rval;
+};
+for(var k in _542){
+var name=k+"Color";
+var _545=m.concat([_543,this.Color,name],_542[k]);
+this.Color[name]=m.bind.apply(null,_545);
+}
+var _546=function(){
+for(var i=0;i<arguments.length;i++){
+if(!(arguments[i] instanceof Color)){
+return false;
+}
+}
+return true;
+};
+var _547=function(a,b){
+return a.compareRGB(b);
+};
+m.nameFunctions(this);
+m.registerComparator(this.Color.NAME,_546,_547);
+this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)};
+}});
+MochiKit.Color.EXPORT=["Color"];
+MochiKit.Color.EXPORT_OK=["clampColorComponent","rgbToHSL","hslToRGB","rgbToHSV","hsvToRGB","toColorPart"];
+MochiKit.Color.__new__();
+MochiKit.Base._exportSymbols(this,MochiKit.Color);
+MochiKit.Color.Color._namedColors={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkgrey:"#a9a9a9",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",grey:"#808080",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"};
+if(typeof (dojo)!="undefined"){
+dojo.provide("MochiKit.Signal");
+dojo.require("MochiKit.Base");
+dojo.require("MochiKit.DOM");
+}
+if(typeof (JSAN)!="undefined"){
+JSAN.use("MochiKit.Base",[]);
+JSAN.use("MochiKit.DOM",[]);
+}
+try{
+if(typeof (MochiKit.Base)=="undefined"){
+throw "";
+}
+}
+catch(e){
+throw "MochiKit.Signal depends on MochiKit.Base!";
+}
+try{
+if(typeof (MochiKit.DOM)=="undefined"){
+throw "";
+}
+}
+catch(e){
+throw "MochiKit.Signal depends on MochiKit.DOM!";
+}
+if(typeof (MochiKit.Signal)=="undefined"){
+MochiKit.Signal={};
+}
+MochiKit.Signal.NAME="MochiKit.Signal";
+MochiKit.Signal.VERSION="1.3.1";
+MochiKit.Signal._observers=[];
+MochiKit.Signal.Event=function(src,e){
+this._event=e||window.event;
+this._src=src;
+};
+MochiKit.Base.update(MochiKit.Signal.Event.prototype,{__repr__:function(){
+var repr=MochiKit.Base.repr;
+var str="{event(): "+repr(this.event())+", src(): "+repr(this.src())+", type(): "+repr(this.type())+", target(): "+repr(this.target())+", modifier(): "+"{alt: "+repr(this.modifier().alt)+", ctrl: "+repr(this.modifier().ctrl)+", meta: "+repr(this.modifier().meta)+", shift: "+repr(this.modifier().shift)+", any: "+repr(this.modifier().any)+"}";
+if(this.type()&&this.type().indexOf("key")===0){
+str+=", key(): {code: "+repr(this.key().code)+", string: "+repr(this.key().string)+"}";
+}
+if(this.type()&&(this.type().indexOf("mouse")===0||this.type().indexOf("click")!=-1||this.type()=="contextmenu")){
+str+=", mouse(): {page: "+repr(this.mouse().page)+", client: "+repr(this.mouse().client);
+if(this.type()!="mousemove"){
+str+=", button: {left: "+repr(this.mouse().button.left)+", middle: "+repr(this.mouse().button.middle)+", right: "+repr(this.mouse().button.right)+"}}";
+}else{
+str+="}";
+}
+}
+if(this.type()=="mouseover"||this.type()=="mouseout"){
+str+=", relatedTarget(): "+repr(this.relatedTarget());
+}
+str+="}";
+return str;
+},toString:function(){
+return this.__repr__();
+},src:function(){
+return this._src;
+},event:function(){
+return this._event;
+},type:function(){
+return this._event.type||undefined;
+},target:function(){
+return this._event.target||this._event.srcElement;
+},relatedTarget:function(){
+if(this.type()=="mouseover"){
+return (this._event.relatedTarget||this._event.fromElement);
+}else{
+if(this.type()=="mouseout"){
+return (this._event.relatedTarget||this._event.toElement);
+}
+}
+return undefined;
+},modifier:function(){
+var m={};
+m.alt=this._event.altKey;
+m.ctrl=this._event.ctrlKey;
+m.meta=this._event.metaKey||false;
+m.shift=this._event.shiftKey;
+m.any=m.alt||m.ctrl||m.shift||m.meta;
+return m;
+},key:function(){
+var k={};
+if(this.type()&&this.type().indexOf("key")===0){
+if(this.type()=="keydown"||this.type()=="keyup"){
+k.code=this._event.keyCode;
+k.string=(MochiKit.Signal._specialKeys[k.code]||"KEY_UNKNOWN");
+return k;
+}else{
+if(this.type()=="keypress"){
+k.code=0;
+k.string="";
+if(typeof (this._event.charCode)!="undefined"&&this._event.charCode!==0&&!MochiKit.Signal._specialMacKeys[this._event.charCode]){
+k.code=this._event.charCode;
+k.string=String.fromCharCode(k.code);
+}else{
+if(this._event.keyCode&&typeof (this._event.charCode)=="undefined"){
+k.code=this._event.keyCode;
+k.string=String.fromCharCode(k.code);
+}
+}
+return k;
+}
+}
+}
+return undefined;
+},mouse:function(){
+var m={};
+var e=this._event;
+if(this.type()&&(this.type().indexOf("mouse")===0||this.type().indexOf("click")!=-1||this.type()=="contextmenu")){
+m.client=new MochiKit.DOM.Coordinates(0,0);
+if(e.clientX||e.clientY){
+m.client.x=(!e.clientX||e.clientX<0)?0:e.clientX;
+m.client.y=(!e.clientY||e.clientY<0)?0:e.clientY;
+}
+m.page=new MochiKit.DOM.Coordinates(0,0);
+if(e.pageX||e.pageY){
+m.page.x=(!e.pageX||e.pageX<0)?0:e.pageX;
+m.page.y=(!e.pageY||e.pageY<0)?0:e.pageY;
+}else{
+var de=MochiKit.DOM._document.documentElement;
+var b=MochiKit.DOM._document.body;
+m.page.x=e.clientX+(de.scrollLeft||b.scrollLeft)-(de.clientLeft||b.clientLeft);
+m.page.y=e.clientY+(de.scrollTop||b.scrollTop)-(de.clientTop||b.clientTop);
+}
+if(this.type()!="mousemove"){
+m.button={};
+m.button.left=false;
+m.button.right=false;
+m.button.middle=false;
+if(e.which){
+m.button.left=(e.which==1);
+m.button.middle=(e.which==2);
+m.button.right=(e.which==3);
+}else{
+m.button.left=!!(e.button&1);
+m.button.right=!!(e.button&2);
+m.button.middle=!!(e.button&4);
+}
+}
+return m;
+}
+return undefined;
+},stop:function(){
+this.stopPropagation();
+this.preventDefault();
+},stopPropagation:function(){
+if(this._event.stopPropagation){
+this._event.stopPropagation();
+}else{
+this._event.cancelBubble=true;
+}
+},preventDefault:function(){
+if(this._event.preventDefault){
+this._event.preventDefault();
+}else{
+this._event.returnValue=false;
+}
+}});
+MochiKit.Signal._specialMacKeys={3:"KEY_ENTER",63289:"KEY_NUM_PAD_CLEAR",63276:"KEY_PAGE_UP",63277:"KEY_PAGE_DOWN",63275:"KEY_END",63273:"KEY_HOME",63234:"KEY_ARROW_LEFT",63232:"KEY_ARROW_UP",63235:"KEY_ARROW_RIGHT",63233:"KEY_ARROW_DOWN",63302:"KEY_INSERT",63272:"KEY_DELETE"};
+for(i=63236;i<=63242;i++){
+MochiKit.Signal._specialMacKeys[i]="KEY_F"+(i-63236+1);
+}
+MochiKit.Signal._specialKeys={8:"KEY_BACKSPACE",9:"KEY_TAB",12:"KEY_NUM_PAD_CLEAR",13:"KEY_ENTER",16:"KEY_SHIFT",17:"KEY_CTRL",18:"KEY_ALT",19:"KEY_PAUSE",20:"KEY_CAPS_LOCK",27:"KEY_ESCAPE",32:"KEY_SPACEBAR",33:"KEY_PAGE_UP",34:"KEY_PAGE_DOWN",35:"KEY_END",36:"KEY_HOME",37:"KEY_ARROW_LEFT",38:"KEY_ARROW_UP",39:"KEY_ARROW_RIGHT",40:"KEY_ARROW_DOWN",44:"KEY_PRINT_SCREEN",45:"KEY_INSERT",46:"KEY_DELETE",59:"KEY_SEMICOLON",91:"KEY_WINDOWS_LEFT",92:"KEY_WINDOWS_RIGHT",93:"KEY_SELECT",106:"KEY_NUM_PAD_ASTERISK",107:"KEY_NUM_PAD_PLUS_SIGN",109:"KEY_NUM_PAD_HYPHEN-MINUS",110:"KEY_NUM_PAD_FULL_STOP",111:"KEY_NUM_PAD_SOLIDUS",144:"KEY_NUM_LOCK",145:"KEY_SCROLL_LOCK",186:"KEY_SEMICOLON",187:"KEY_EQUALS_SIGN",188:"KEY_COMMA",189:"KEY_HYPHEN-MINUS",190:"KEY_FULL_STOP",191:"KEY_SOLIDUS",192:"KEY_GRAVE_ACCENT",219:"KEY_LEFT_SQUARE_BRACKET",220:"KEY_REVERSE_SOLIDUS",221:"KEY_RIGHT_SQUARE_BRACKET",222:"KEY_APOSTROPHE"};
+for(var i=48;i<=57;i++){
+MochiKit.Signal._specialKeys[i]="KEY_"+(i-48);
+}
+for(i=65;i<=90;i++){
+MochiKit.Signal._specialKeys[i]="KEY_"+String.fromCharCode(i);
+}
+for(i=96;i<=105;i++){
+MochiKit.Signal._specialKeys[i]="KEY_NUM_PAD_"+(i-96);
+}
+for(i=112;i<=123;i++){
+MochiKit.Signal._specialKeys[i]="KEY_F"+(i-112+1);
+}
+MochiKit.Base.update(MochiKit.Signal,{__repr__:function(){
+return "["+this.NAME+" "+this.VERSION+"]";
+},toString:function(){
+return this.__repr__();
+},_unloadCache:function(){
+var self=MochiKit.Signal;
+var _548=self._observers;
+for(var i=0;i<_548.length;i++){
+self._disconnect(_548[i]);
+}
+delete self._observers;
+try{
+window.onload=undefined;
+}
+catch(e){
+}
+try{
+window.onunload=undefined;
+}
+catch(e){
+}
+},_listener:function(src,func,obj,_549){
+var E=MochiKit.Signal.Event;
+if(!_549){
+return MochiKit.Base.bind(func,obj);
+}
+obj=obj||src;
+if(typeof (func)=="string"){
+return function(_551){
+obj[func].apply(obj,[new E(src,_551)]);
+};
+}else{
+return function(_552){
+func.apply(obj,[new E(src,_552)]);
+};
+}
+},connect:function(src,sig,_554,_555){
+src=MochiKit.DOM.getElement(src);
+var self=MochiKit.Signal;
+if(typeof (sig)!="string"){
+throw new Error("'sig' must be a string");
+}
+var obj=null;
+var func=null;
+if(typeof (_555)!="undefined"){
+obj=_554;
+func=_555;
+if(typeof (_555)=="string"){
+if(typeof (_554[_555])!="function"){
+throw new Error("'funcOrStr' must be a function on 'objOrFunc'");
+}
+}else{
+if(typeof (_555)!="function"){
+throw new Error("'funcOrStr' must be a function or string");
+}
+}
+}else{
+if(typeof (_554)!="function"){
+throw new Error("'objOrFunc' must be a function if 'funcOrStr' is not given");
+}else{
+func=_554;
+}
+}
+if(typeof (obj)=="undefined"||obj===null){
+obj=src;
+}
+var _556=!!(src.addEventListener||src.attachEvent);
+var _557=self._listener(src,func,obj,_556);
+if(src.addEventListener){
+src.addEventListener(sig.substr(2),_557,false);
+}else{
+if(src.attachEvent){
+src.attachEvent(sig,_557);
+}
+}
+var _558=[src,sig,_557,_556,_554,_555];
+self._observers.push(_558);
+return _558;
+},_disconnect:function(_559){
+if(!_559[3]){
+return;
+}
+var src=_559[0];
+var sig=_559[1];
+var _560=_559[2];
+if(src.removeEventListener){
+src.removeEventListener(sig.substr(2),_560,false);
+}else{
+if(src.detachEvent){
+src.detachEvent(sig,_560);
+}else{
+throw new Error("'src' must be a DOM element");
+}
+}
+},disconnect:function(_561){
+var self=MochiKit.Signal;
+var _562=self._observers;
+var m=MochiKit.Base;
+if(arguments.length>1){
+var src=MochiKit.DOM.getElement(arguments[0]);
+var sig=arguments[1];
+var obj=arguments[2];
+var func=arguments[3];
+for(var i=_562.length-1;i>=0;i--){
+var o=_562[i];
+if(o[0]===src&&o[1]===sig&&o[4]===obj&&o[5]===func){
+self._disconnect(o);
+_562.splice(i,1);
+return true;
+}
+}
+}else{
+var idx=m.findIdentical(_562,_561);
+if(idx>=0){
+self._disconnect(_561);
+_562.splice(idx,1);
+return true;
+}
+}
+return false;
+},disconnectAll:function(src,sig){
+src=MochiKit.DOM.getElement(src);
+var m=MochiKit.Base;
+var _563=m.flattenArguments(m.extend(null,arguments,1));
+var self=MochiKit.Signal;
+var _564=self._disconnect;
+var _565=self._observers;
+if(_563.length===0){
+for(var i=_565.length-1;i>=0;i--){
+var _566=_565[i];
+if(_566[0]===src){
+_564(_566);
+_565.splice(i,1);
+}
+}
+}else{
+var sigs={};
+for(var i=0;i<_563.length;i++){
+sigs[_563[i]]=true;
+}
+for(var i=_565.length-1;i>=0;i--){
+var _566=_565[i];
+if(_566[0]===src&&_566[1] in sigs){
+_564(_566);
+_565.splice(i,1);
+}
+}
+}
+},signal:function(src,sig){
+var _568=MochiKit.Signal._observers;
+src=MochiKit.DOM.getElement(src);
+var args=MochiKit.Base.extend(null,arguments,2);
+var _569=[];
+for(var i=0;i<_568.length;i++){
+var _570=_568[i];
+if(_570[0]===src&&_570[1]===sig){
+try{
+_570[2].apply(src,args);
+}
+catch(e){
+_569.push(e);
+}
+}
+}
+if(_569.length==1){
+throw _569[0];
+}else{
+if(_569.length>1){
+var e=new Error("Multiple errors thrown in handling 'sig', see errors property");
+e.errors=_569;
+throw e;
+}
+}
+}});
+MochiKit.Signal.EXPORT_OK=[];
+MochiKit.Signal.EXPORT=["connect","disconnect","signal","disconnectAll"];
+MochiKit.Signal.__new__=function(win){
+var m=MochiKit.Base;
+this._document=document;
+this._window=win;
+try{
+this.connect(window,"onunload",this._unloadCache);
+}
+catch(e){
+}
+this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)};
+m.nameFunctions(this);
+};
+MochiKit.Signal.__new__(this);
+if(!MochiKit.__compat__){
+connect=MochiKit.Signal.connect;
+disconnect=MochiKit.Signal.disconnect;
+disconnectAll=MochiKit.Signal.disconnectAll;
+signal=MochiKit.Signal.signal;
+}
+MochiKit.Base._exportSymbols(this,MochiKit.Signal);
+if(typeof (dojo)!="undefined"){
+dojo.provide("MochiKit.Visual");
+dojo.require("MochiKit.Base");
+dojo.require("MochiKit.DOM");
+dojo.require("MochiKit.Color");
+}
+if(typeof (JSAN)!="undefined"){
+JSAN.use("MochiKit.Base",[]);
+JSAN.use("MochiKit.DOM",[]);
+JSAN.use("MochiKit.Color",[]);
+}
+try{
+if(typeof (MochiKit.Base)=="undefined"||typeof (MochiKit.DOM)=="undefined"||typeof (MochiKit.Color)=="undefined"){
+throw "";
+}
+}
+catch(e){
+throw "MochiKit.Visual depends on MochiKit.Base, MochiKit.DOM and MochiKit.Color!";
+}
+if(typeof (MochiKit.Visual)=="undefined"){
+MochiKit.Visual={};
+}
+MochiKit.Visual.NAME="MochiKit.Visual";
+MochiKit.Visual.VERSION="1.3.1";
+MochiKit.Visual.__repr__=function(){
+return "["+this.NAME+" "+this.VERSION+"]";
+};
+MochiKit.Visual.toString=function(){
+return this.__repr__();
+};
+MochiKit.Visual._RoundCorners=function(e,_571){
+e=MochiKit.DOM.getElement(e);
+this._setOptions(_571);
+if(this.options.__unstable__wrapElement){
+e=this._doWrap(e);
+}
+var _572=this.options.color;
+var C=MochiKit.Color.Color;
+if(this.options.color=="fromElement"){
+_572=C.fromBackground(e);
+}else{
+if(!(_572 instanceof C)){
+_572=C.fromString(_572);
+}
+}
+this.isTransparent=(_572.asRGB().a<=0);
+var _574=this.options.bgColor;
+if(this.options.bgColor=="fromParent"){
+_574=C.fromBackground(e.offsetParent);
+}else{
+if(!(_574 instanceof C)){
+_574=C.fromString(_574);
+}
+}
+this._roundCornersImpl(e,_572,_574);
+};
+MochiKit.Visual._RoundCorners.prototype={_doWrap:function(e){
+var _575=e.parentNode;
+var doc=MochiKit.DOM.currentDocument();
+if(typeof (doc.defaultView)=="undefined"||doc.defaultView===null){
+return e;
+}
+var _576=doc.defaultView.getComputedStyle(e,null);
+if(typeof (_576)=="undefined"||_576===null){
+return e;
+}
+var _577=MochiKit.DOM.DIV({"style":{display:"block",marginTop:_576.getPropertyValue("padding-top"),marginRight:_576.getPropertyValue("padding-right"),marginBottom:_576.getPropertyValue("padding-bottom"),marginLeft:_576.getPropertyValue("padding-left"),padding:"0px"}});
+_577.innerHTML=e.innerHTML;
+e.innerHTML="";
+e.appendChild(_577);
+return e;
+},_roundCornersImpl:function(e,_578,_579){
+if(this.options.border){
+this._renderBorder(e,_579);
+}
+if(this._isTopRounded()){
+this._roundTopCorners(e,_578,_579);
+}
+if(this._isBottomRounded()){
+this._roundBottomCorners(e,_578,_579);
+}
+},_renderBorder:function(el,_580){
+var _581="1px solid "+this._borderColor(_580);
+var _582="border-left: "+_581;
+var _583="border-right: "+_581;
+var _584="style='"+_582+";"+_583+"'";
+el.innerHTML="<div "+_584+">"+el.innerHTML+"</div>";
+},_roundTopCorners:function(el,_585,_586){
+var _587=this._createCorner(_586);
+for(var i=0;i<this.options.numSlices;i++){
+_587.appendChild(this._createCornerSlice(_585,_586,i,"top"));
+}
+el.style.paddingTop=0;
+el.insertBefore(_587,el.firstChild);
+},_roundBottomCorners:function(el,_588,_589){
+var _590=this._createCorner(_589);
+for(var i=(this.options.numSlices-1);i>=0;i--){
+_590.appendChild(this._createCornerSlice(_588,_589,i,"bottom"));
+}
+el.style.paddingBottom=0;
+el.appendChild(_590);
+},_createCorner:function(_591){
+var dom=MochiKit.DOM;
+return dom.DIV({style:{backgroundColor:_591.toString()}});
+},_createCornerSlice:function(_592,_593,n,_594){
+var _595=MochiKit.DOM.SPAN();
+var _596=_595.style;
+_596.backgroundColor=_592.toString();
+_596.display="block";
+_596.height="1px";
+_596.overflow="hidden";
+_596.fontSize="1px";
+var _597=this._borderColor(_592,_593);
+if(this.options.border&&n===0){
+_596.borderTopStyle="solid";
+_596.borderTopWidth="1px";
+_596.borderLeftWidth="0px";
+_596.borderRightWidth="0px";
+_596.borderBottomWidth="0px";
+_596.height="0px";
+_596.borderColor=_597.toString();
+}else{
+if(_597){
+_596.borderColor=_597.toString();
+_596.borderStyle="solid";
+_596.borderWidth="0px 1px";
+}
+}
+if(!this.options.compact&&(n==(this.options.numSlices-1))){
+_596.height="2px";
+}
+this._setMargin(_595,n,_594);
+this._setBorder(_595,n,_594);
+return _595;
+},_setOptions:function(_598){
+this.options={corners:"all",color:"fromElement",bgColor:"fromParent",blend:true,border:false,compact:false,__unstable__wrapElement:false};
+MochiKit.Base.update(this.options,_598);
+this.options.numSlices=(this.options.compact?2:4);
+},_whichSideTop:function(){
+var _599=this.options.corners;
+if(this._hasString(_599,"all","top")){
+return "";
+}
+var _600=(_599.indexOf("tl")!=-1);
+var _601=(_599.indexOf("tr")!=-1);
+if(_600&&_601){
+return "";
+}
+if(_600){
+return "left";
+}
+if(_601){
+return "right";
+}
+return "";
+},_whichSideBottom:function(){
+var _602=this.options.corners;
+if(this._hasString(_602,"all","bottom")){
+return "";
+}
+var _603=(_602.indexOf("bl")!=-1);
+var _604=(_602.indexOf("br")!=-1);
+if(_603&&_604){
+return "";
+}
+if(_603){
+return "left";
+}
+if(_604){
+return "right";
+}
+return "";
+},_borderColor:function(_605,_606){
+if(_605=="transparent"){
+return _606;
+}else{
+if(this.options.border){
+return this.options.border;
+}else{
+if(this.options.blend){
+return _606.blendedColor(_605);
+}
+}
+}
+return "";
+},_setMargin:function(el,n,_607){
+var _608=this._marginSize(n)+"px";
+var _609=(_607=="top"?this._whichSideTop():this._whichSideBottom());
+var _610=el.style;
+if(_609=="left"){
+_610.marginLeft=_608;
+_610.marginRight="0px";
+}else{
+if(_609=="right"){
+_610.marginRight=_608;
+_610.marginLeft="0px";
+}else{
+_610.marginLeft=_608;
+_610.marginRight=_608;
+}
+}
+},_setBorder:function(el,n,_611){
+var _612=this._borderSize(n)+"px";
+var _613=(_611=="top"?this._whichSideTop():this._whichSideBottom());
+var _614=el.style;
+if(_613=="left"){
+_614.borderLeftWidth=_612;
+_614.borderRightWidth="0px";
+}else{
+if(_613=="right"){
+_614.borderRightWidth=_612;
+_614.borderLeftWidth="0px";
+}else{
+_614.borderLeftWidth=_612;
+_614.borderRightWidth=_612;
+}
+}
+},_marginSize:function(n){
+if(this.isTransparent){
+return 0;
+}
+var o=this.options;
+if(o.compact&&o.blend){
+var _615=[1,0];
+return _615[n];
+}else{
+if(o.compact){
+var _616=[2,1];
+return _616[n];
+}else{
+if(o.blend){
+var _617=[3,2,1,0];
+return _617[n];
+}else{
+var _618=[5,3,2,1];
+return _618[n];
+}
+}
+}
+},_borderSize:function(n){
+var o=this.options;
+var _619;
+if(o.compact&&(o.blend||this.isTransparent)){
+return 1;
+}else{
+if(o.compact){
+_619=[1,0];
+}else{
+if(o.blend){
+_619=[2,1,1,1];
+}else{
+if(o.border){
+_619=[0,2,0,0];
+}else{
+if(this.isTransparent){
+_619=[5,3,2,1];
+}else{
+return 0;
+}
+}
+}
+}
+}
+return _619[n];
+},_hasString:function(str){
+for(var i=1;i<arguments.length;i++){
+if(str.indexOf(arguments[i])!=-1){
+return true;
+}
+}
+return false;
+},_isTopRounded:function(){
+return this._hasString(this.options.corners,"all","top","tl","tr");
+},_isBottomRounded:function(){
+return this._hasString(this.options.corners,"all","bottom","bl","br");
+},_hasSingleTextChild:function(el){
+return (el.childNodes.length==1&&el.childNodes[0].nodeType==3);
+}};
+MochiKit.Visual.roundElement=function(e,_620){
+new MochiKit.Visual._RoundCorners(e,_620);
+};
+MochiKit.Visual.roundClass=function(_621,_622,_623){
+var _624=MochiKit.DOM.getElementsByTagAndClassName(_621,_622);
+for(var i=0;i<_624.length;i++){
+MochiKit.Visual.roundElement(_624[i],_623);
+}
+};
+MochiKit.Visual.Color=MochiKit.Color.Color;
+MochiKit.Visual.getElementsComputedStyle=MochiKit.DOM.computedStyle;
+MochiKit.Visual.__new__=function(){
+var m=MochiKit.Base;
+m.nameFunctions(this);
+this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)};
+};
+MochiKit.Visual.EXPORT=["roundElement","roundClass"];
+MochiKit.Visual.EXPORT_OK=[];
+MochiKit.Visual.__new__();
+MochiKit.Base._exportSymbols(this,MochiKit.Visual);
+if(typeof (MochiKit)=="undefined"){
+MochiKit={};
+}
+if(typeof (MochiKit.MochiKit)=="undefined"){
+MochiKit.MochiKit={};
+}
+MochiKit.MochiKit.NAME="MochiKit.MochiKit";
+MochiKit.MochiKit.VERSION="1.3.1";
+MochiKit.MochiKit.__repr__=function(){
+return "["+this.NAME+" "+this.VERSION+"]";
+};
+MochiKit.MochiKit.toString=function(){
+return this.__repr__();
+};
+MochiKit.MochiKit.SUBMODULES=["Base","Iter","Logging","DateTime","Format","Async","DOM","LoggingPane","Color","Signal","Visual"];
+if(typeof (JSAN)!="undefined"||typeof (dojo)!="undefined"){
+if(typeof (dojo)!="undefined"){
+dojo.provide("MochiKit.MochiKit");
+dojo.require("MochiKit.*");
+}
+if(typeof (JSAN)!="undefined"){
+JSAN.use("MochiKit.Base",[]);
+JSAN.use("MochiKit.Iter",[]);
+JSAN.use("MochiKit.Logging",[]);
+JSAN.use("MochiKit.DateTime",[]);
+JSAN.use("MochiKit.Format",[]);
+JSAN.use("MochiKit.Async",[]);
+JSAN.use("MochiKit.DOM",[]);
+JSAN.use("MochiKit.LoggingPane",[]);
+JSAN.use("MochiKit.Color",[]);
+JSAN.use("MochiKit.Signal",[]);
+JSAN.use("MochiKit.Visual",[]);
+}
+(function(){
+var _625=MochiKit.Base.extend;
+var self=MochiKit.MochiKit;
+var _626=self.SUBMODULES;
+var _627=[];
+var _628=[];
+var _629={};
+var i,k,m,all;
+for(i=0;i<_626.length;i++){
+m=MochiKit[_626[i]];
+_625(_627,m.EXPORT);
+_625(_628,m.EXPORT_OK);
+for(k in m.EXPORT_TAGS){
+_629[k]=_625(_629[k],m.EXPORT_TAGS[k]);
+}
+all=m.EXPORT_TAGS[":all"];
+if(!all){
+all=_625(null,m.EXPORT,m.EXPORT_OK);
+}
+var j;
+for(j=0;j<all.length;j++){
+k=all[j];
+self[k]=m[k];
+}
+}
+self.EXPORT=_627;
+self.EXPORT_OK=_628;
+self.EXPORT_TAGS=_629;
+}());
+}else{
+if(typeof (MochiKit.__compat__)=="undefined"){
+MochiKit.__compat__=true;
+}
+(function(){
+var _630=document.getElementsByTagName("script");
+var _631="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
+var base=null;
+var _632=null;
+var _633={};
+var i;
+for(i=0;i<_630.length;i++){
+var src=_630[i].getAttribute("src");
+if(!src){
+continue;
+}
+_633[src]=true;
+if(src.match(/MochiKit.js$/)){
+base=src.substring(0,src.lastIndexOf("MochiKit.js"));
+_632=_630[i];
+}
+}
+if(base===null){
+return;
+}
+var _634=MochiKit.MochiKit.SUBMODULES;
+for(var i=0;i<_634.length;i++){
+if(MochiKit[_634[i]]){
+continue;
+}
+var uri=base+_634[i]+".js";
+if(uri in _633){
+continue;
+}
+if(document.documentElement&&document.documentElement.namespaceURI==_631){
+var s=document.createElementNS(_631,"script");
+s.setAttribute("id","MochiKit_"+base+_634[i]);
+s.setAttribute("src",uri);
+s.setAttribute("type","application/x-javascript");
+_632.parentNode.appendChild(s);
+}else{
+document.write("<script src=\""+uri+"\" type=\"text/javascript\"></script>");
+}
+}
+})();
+}
+
+
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/evalexception/mochikit/__package__.js
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/evalexception/mochikit/__package__.js (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/evalexception/mochikit/__package__.js (revision 3)
@@ -0,0 +1,2 @@
+dojo.hostenv.conditionalLoadModule({"common": ["MochiKit.MochiKit"]});
+dojo.hostenv.moduleLoaded("MochiKit.*");
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/modpython.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/modpython.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/modpython.py (revision 3)
@@ -0,0 +1,252 @@
+"""WSGI Paste wrapper for mod_python. Requires Python 2.2 or greater.
+
+
+Example httpd.conf section for a Paste app with an ini file::
+
+    <Location />
+        SetHandler python-program
+        PythonHandler paste.modpython
+        PythonOption paste.ini /some/location/your/pasteconfig.ini
+    </Location>
+    
+Or if you want to load a WSGI application under /your/homedir in the module
+``startup`` and the WSGI app is ``app``::
+
+    <Location />
+        SetHandler python-program
+        PythonHandler paste.modpython
+        PythonPath "['/virtual/project/directory'] + sys.path"
+        PythonOption wsgi.application startup::app
+    </Location>
+
+
+If you'd like to use a virtual installation, make sure to add it in the path
+like so::
+
+    <Location />
+        SetHandler python-program
+        PythonHandler paste.modpython
+        PythonPath "['/virtual/project/directory', '/virtual/lib/python2.4/'] + sys.path"
+        PythonOption paste.ini /virtual/project/directory/pasteconfig.ini
+    </Location>
+
+Some WSGI implementations assume that the SCRIPT_NAME environ variable will
+always be equal to "the root URL of the app"; Apache probably won't act as
+you expect in that case. You can add another PythonOption directive to tell
+modpython_gateway to force that behavior:
+
+    PythonOption SCRIPT_NAME /mcontrol
+
+Some WSGI applications need to be cleaned up when Apache exits. You can
+register a cleanup handler with yet another PythonOption directive:
+
+    PythonOption wsgi.cleanup module::function
+
+The module.function will be called with no arguments on server shutdown,
+once for each child process or thread.
+
+This module highly based on Robert Brewer's, here:
+http://projects.amor.org/misc/svn/modpython_gateway.py
+"""
+
+import traceback
+
+try:
+    from mod_python import apache
+except:
+    pass
+from paste.deploy import loadapp
+
+class InputWrapper(object):
+    
+    def __init__(self, req):
+        self.req = req
+    
+    def close(self):
+        pass
+    
+    def read(self, size=-1):
+        return self.req.read(size)
+    
+    def readline(self, size=-1):
+        return self.req.readline(size)
+    
+    def readlines(self, hint=-1):
+        return self.req.readlines(hint)
+    
+    def __iter__(self):
+        line = self.readline()
+        while line:
+            yield line
+            # Notice this won't prefetch the next line; it only
+            # gets called if the generator is resumed.
+            line = self.readline()
+
+
+class ErrorWrapper(object):
+    
+    def __init__(self, req):
+        self.req = req
+    
+    def flush(self):
+        pass
+    
+    def write(self, msg):
+        self.req.log_error(msg)
+    
+    def writelines(self, seq):
+        self.write(''.join(seq))
+
+
+bad_value = ("You must provide a PythonOption '%s', either 'on' or 'off', "
+             "when running a version of mod_python < 3.1")
+
+
+class Handler(object):
+    
+    def __init__(self, req):
+        self.started = False
+        
+        options = req.get_options()
+        
+        # Threading and forking
+        try:
+            q = apache.mpm_query
+            threaded = q(apache.AP_MPMQ_IS_THREADED)
+            forked = q(apache.AP_MPMQ_IS_FORKED)
+        except AttributeError:
+            threaded = options.get('multithread', '').lower()
+            if threaded == 'on':
+                threaded = True
+            elif threaded == 'off':
+                threaded = False
+            else:
+                raise ValueError(bad_value % "multithread")
+            
+            forked = options.get('multiprocess', '').lower()
+            if forked == 'on':
+                forked = True
+            elif forked == 'off':
+                forked = False
+            else:
+                raise ValueError(bad_value % "multiprocess")
+        
+        env = self.environ = dict(apache.build_cgi_env(req))
+        
+        if 'SCRIPT_NAME' in options:
+            # Override SCRIPT_NAME and PATH_INFO if requested.
+            env['SCRIPT_NAME'] = options['SCRIPT_NAME']
+            env['PATH_INFO'] = req.uri[len(options['SCRIPT_NAME']):]
+        else:
+            env['SCRIPT_NAME'] = ''
+            env['PATH_INFO'] = req.uri
+        
+        env['wsgi.input'] = InputWrapper(req)
+        env['wsgi.errors'] = ErrorWrapper(req)
+        env['wsgi.version'] = (1, 0)
+        env['wsgi.run_once'] = False
+        if env.get("HTTPS") in ('yes', 'on', '1'):
+            env['wsgi.url_scheme'] = 'https'
+        else:
+            env['wsgi.url_scheme'] = 'http'
+        env['wsgi.multithread']  = threaded
+        env['wsgi.multiprocess'] = forked
+        
+        self.request = req
+    
+    def run(self, application):
+        try:
+            result = application(self.environ, self.start_response)
+            for data in result:
+                self.write(data)
+            if not self.started:
+                self.request.set_content_length(0)
+            if hasattr(result, 'close'):
+                result.close()
+        except:
+            traceback.print_exc(None, self.environ['wsgi.errors'])
+            if not self.started:
+                self.request.status = 500
+                self.request.content_type = 'text/plain'
+                data = "A server error occurred. Please contact the administrator."
+                self.request.set_content_length(len(data))
+                self.request.write(data)
+    
+    def start_response(self, status, headers, exc_info=None):
+        if exc_info:
+            try:
+                if self.started:
+                    raise exc_info[0], exc_info[1], exc_info[2]
+            finally:
+                exc_info = None
+        
+        self.request.status = int(status[:3])
+        
+        for key, val in headers:
+            if key.lower() == 'content-length':
+                self.request.set_content_length(int(val))
+            elif key.lower() == 'content-type':
+                self.request.content_type = val
+            else:
+                self.request.headers_out.add(key, val)
+        
+        return self.write
+    
+    def write(self, data):
+        if not self.started:
+            self.started = True
+        self.request.write(data)
+
+
+startup = None
+cleanup = None
+wsgiapps = {}
+
+def handler(req):
+    options = req.get_options()
+    # Run a startup function if requested.
+    global startup
+    if 'wsgi.startup' in options and not startup:
+        func = options['wsgi.startup']
+        if func:
+            module_name, object_str = func.split('::', 1)
+            module = __import__(module_name, globals(), locals(), [''])
+            startup = apache.resolve_object(module, object_str)
+            startup(req)
+    
+    # Register a cleanup function if requested.
+    global cleanup
+    if 'wsgi.cleanup' in options and not cleanup:
+        func = options['wsgi.cleanup']
+        if func:
+            module_name, object_str = func.split('::', 1)
+            module = __import__(module_name, globals(), locals(), [''])
+            cleanup = apache.resolve_object(module, object_str)
+            def cleaner(data):
+                cleanup()
+            try:
+                # apache.register_cleanup wasn't available until 3.1.4.
+                apache.register_cleanup(cleaner)
+            except AttributeError:
+                req.server.register_cleanup(req, cleaner)
+    
+    # Import the wsgi 'application' callable and pass it to Handler.run
+    global wsgiapps
+    appini = options.get('paste.ini')
+    app = None
+    if appini:
+        if appini not in wsgiapps:
+            wsgiapps[appini] = loadapp("config:%s" % appini)
+        app = wsgiapps[appini]
+    
+    # Import the wsgi 'application' callable and pass it to Handler.run
+    appwsgi = options.get('wsgi.application')
+    if appwsgi and not appini:
+        modname, objname = appwsgi.split('::', 1)
+        module = __import__(modname, globals(), locals(), [''])
+        app = getattr(module, objname)
+    
+    Handler(req).run(app)
+    
+    # status was set in Handler; always return apache.OK
+    return apache.OK
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/cgitb_catcher.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/cgitb_catcher.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/cgitb_catcher.py (revision 3)
@@ -0,0 +1,116 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+
+"""
+WSGI middleware
+
+Captures any exceptions and prints a pretty report.  See the `cgitb
+documentation <http://python.org/doc/current/lib/module-cgitb.html>`_
+for more.
+"""
+
+import cgitb
+from cStringIO import StringIO
+import sys
+
+from paste.util import converters
+
+class NoDefault(object):
+    pass
+
+class CgitbMiddleware(object):
+
+    def __init__(self, app,
+                 global_conf=None,
+                 display=NoDefault,
+                 logdir=None,
+                 context=5,
+                 format="html"):
+        self.app = app
+        if global_conf is None:
+            global_conf = {}
+        if display is NoDefault:
+            display = global_conf.get('debug')
+        if isinstance(display, basestring):
+            display = converters.asbool(display)
+        self.display = display
+        self.logdir = logdir
+        self.context = int(context)
+        self.format = format
+
+    def __call__(self, environ, start_response):
+        try:
+            app_iter = self.app(environ, start_response)
+            return self.catching_iter(app_iter, environ)
+        except:
+            exc_info = sys.exc_info()
+            start_response('500 Internal Server Error',
+                           [('content-type', 'text/html')],
+                           exc_info)
+            response = self.exception_handler(exc_info, environ)
+            return [response]
+
+    def catching_iter(self, app_iter, environ):
+        if not app_iter:
+            raise StopIteration
+        error_on_close = False
+        try:
+            for v in app_iter:
+                yield v
+            if hasattr(app_iter, 'close'):
+                error_on_close = True
+                app_iter.close()
+        except:
+            response = self.exception_handler(sys.exc_info(), environ)
+            if not error_on_close and hasattr(app_iter, 'close'):
+                try:
+                    app_iter.close()
+                except:
+                    close_response = self.exception_handler(
+                        sys.exc_info(), environ)
+                    response += (
+                        '<hr noshade>Error in .close():<br>%s'
+                        % close_response)
+            yield response
+
+    def exception_handler(self, exc_info, environ):
+        dummy_file = StringIO()
+        hook = cgitb.Hook(file=dummy_file,
+                          display=self.display,
+                          logdir=self.logdir,
+                          context=self.context,
+                          format=self.format)
+        hook(*exc_info)
+        return dummy_file.getvalue()
+        
+def make_cgitb_middleware(app, global_conf,
+                          display=NoDefault,
+                          logdir=None,
+                          context=5,
+                          format='html'):
+    """
+    Wraps the application in the ``cgitb`` (standard library)
+    error catcher.
+        
+      display:
+        If true (or debug is set in the global configuration)
+        then the traceback will be displayed in the browser
+
+      logdir:
+        Writes logs of all errors in that directory
+
+      context:
+        Number of lines of context to show around each line of
+        source code
+    """
+    from paste.deploy.converters import asbool
+    if display is not NoDefault:
+        display = asbool(display)
+    if 'debug' in global_conf:
+        global_conf['debug'] = asbool(global_conf['debug'])
+    return CgitbMiddleware(
+        app, global_conf=global_conf,
+        display=display,
+        logdir=logdir,
+        context=context,
+        format=format)
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/httpexceptions.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/httpexceptions.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/httpexceptions.py (revision 3)
@@ -0,0 +1,660 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+# (c) 2005 Ian Bicking, Clark C. Evans and contributors
+# This module is part of the Python Paste Project and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+# Some of this code was funded by http://prometheusresearch.com
+"""
+HTTP Exception Middleware
+
+This module processes Python exceptions that relate to HTTP exceptions
+by defining a set of exceptions, all subclasses of HTTPException, and a
+request handler (`middleware`) that catches these exceptions and turns
+them into proper responses.
+
+This module defines exceptions according to RFC 2068 [1]_ : codes with
+100-300 are not really errors; 400's are client errors, and 500's are
+server errors.  According to the WSGI specification [2]_ , the application
+can call ``start_response`` more then once only under two conditions:
+(a) the response has not yet been sent, or (b) if the second and
+subsequent invocations of ``start_response`` have a valid ``exc_info``
+argument obtained from ``sys.exc_info()``.  The WSGI specification then
+requires the server or gateway to handle the case where content has been
+sent and then an exception was encountered.
+
+Exceptions in the 5xx range and those raised after ``start_response``
+has been called are treated as serious errors and the ``exc_info`` is
+filled-in with information needed for a lower level module to generate a
+stack trace and log information.
+
+Exception
+  HTTPException
+    HTTPRedirection
+      * 300 - HTTPMultipleChoices
+      * 301 - HTTPMovedPermanently
+      * 302 - HTTPFound
+      * 303 - HTTPSeeOther
+      * 304 - HTTPNotModified
+      * 305 - HTTPUseProxy
+      * 306 - Unused (not implemented, obviously)
+      * 307 - HTTPTemporaryRedirect
+    HTTPError
+      HTTPClientError
+        * 400 - HTTPBadRequest
+        * 401 - HTTPUnauthorized
+        * 402 - HTTPPaymentRequired
+        * 403 - HTTPForbidden
+        * 404 - HTTPNotFound
+        * 405 - HTTPMethodNotAllowed
+        * 406 - HTTPNotAcceptable
+        * 407 - HTTPProxyAuthenticationRequired
+        * 408 - HTTPRequestTimeout
+        * 409 - HTTPConfict
+        * 410 - HTTPGone
+        * 411 - HTTPLengthRequired
+        * 412 - HTTPPreconditionFailed
+        * 413 - HTTPRequestEntityTooLarge
+        * 414 - HTTPRequestURITooLong
+        * 415 - HTTPUnsupportedMediaType
+        * 416 - HTTPRequestRangeNotSatisfiable
+        * 417 - HTTPExpectationFailed
+      HTTPServerError
+        * 500 - HTTPInternalServerError
+        * 501 - HTTPNotImplemented
+        * 502 - HTTPBadGateway
+        * 503 - HTTPServiceUnavailable
+        * 504 - HTTPGatewayTimeout
+        * 505 - HTTPVersionNotSupported
+
+References:
+
+.. [1] http://www.python.org/peps/pep-0333.html#error-handling
+.. [2] http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.5
+
+"""
+
+import types
+from paste.wsgilib import catch_errors_app
+from paste.response import has_header, header_value, replace_header
+from paste.request import resolve_relative_url
+from paste.util.quoting import strip_html, html_quote, no_quote
+
+SERVER_NAME = 'WSGI Server'
+TEMPLATE = """\
+<html>\r
+  <head><title>%(title)s</title></head>\r
+  <body>\r
+    <h1>%(title)s</h1>\r
+    <p>%(body)s</p>\r
+    <hr noshade>\r
+    <div align="right">%(server)s</div>\r
+  </body>\r
+</html>\r
+"""
+
+class HTTPException(Exception):
+    """
+    the HTTP exception base class
+
+    This encapsulates an HTTP response that interrupts normal application
+    flow; but one which is not necessarly an error condition. For
+    example, codes in the 300's are exceptions in that they interrupt
+    normal processing; however, they are not considered errors.
+
+    This class is complicated by 4 factors:
+
+      1. The content given to the exception may either be plain-text or
+         as html-text.
+
+      2. The template may want to have string-substitutions taken from
+         the current ``environ`` or values from incoming headers. This
+         is especially troublesome due to case sensitivity.
+
+      3. The final output may either be text/plain or text/html
+         mime-type as requested by the client application.
+
+      4. Each exception has a default explanation, but those who
+         raise exceptions may want to provide additional detail.
+
+    Attributes:
+
+       ``code``
+           the HTTP status code for the exception
+
+       ``title``
+           remainder of the status line (stuff after the code)
+
+       ``explanation``
+           a plain-text explanation of the error message that is
+           not subject to environment or header substitutions;
+           it is accessible in the template via %(explanation)s
+
+       ``detail``
+           a plain-text message customization that is not subject
+           to environment or header substitutions; accessible in
+           the template via %(detail)s
+
+       ``template``
+           a content fragment (in HTML) used for environment and
+           header substitution; the default template includes both
+           the explanation and further detail provided in the
+           message
+
+       ``required_headers``
+           a sequence of headers which are required for proper
+           construction of the exception
+
+    Parameters:
+
+       ``detail``
+         a plain-text override of the default ``detail``
+
+       ``headers``
+         a list of (k,v) header pairs
+
+       ``comment``
+         a plain-text additional information which is
+         usually stripped/hidden for end-users
+
+    To override the template (which is HTML content) or the plain-text
+    explanation, one must subclass the given exception; or customize it
+    after it has been created.  This particular breakdown of a message
+    into explanation, detail and template allows both the creation of
+    plain-text and html messages for various clients as well as
+    error-free substitution of environment variables and headers.
+    """
+
+    code = None
+    title = None
+    explanation = ''
+    detail = ''
+    comment = ''
+    template = "%(explanation)s\r\n<br/>%(detail)s\r\n<!-- %(comment)s -->"
+    required_headers = ()
+
+    def __init__(self, detail=None, headers=None, comment=None):
+        assert self.code, "Do not directly instantiate abstract exceptions."
+        assert isinstance(headers, (type(None), list)), (
+            "headers must be None or a list: %r"
+            % headers)
+        assert isinstance(detail, (type(None), basestring)), (
+            "detail must be None or a string: %r" % detail)
+        assert isinstance(comment, (type(None), basestring)), (
+            "comment must be None or a string: %r" % comment)
+        self.headers = headers or tuple()
+        for req in self.required_headers:
+            assert headers and has_header(headers, req), (
+                "Exception %s must be passed the header %r "
+                "(got headers: %r)"
+                % (self.__class__.__name__, req, headers))
+        if detail is not None:
+            self.detail = detail
+        if comment is not None:
+            self.comment = comment
+        Exception.__init__(self,"%s %s\n%s\n%s\n" % (
+            self.code, self.title, self.explanation, self.detail))
+
+    def make_body(self, environ, template, escfunc, comment_escfunc=None):
+        comment_escfunc = comment_escfunc or escfunc
+        args = {'explanation': escfunc(self.explanation),
+                'detail': escfunc(self.detail),
+                'comment': comment_escfunc(self.comment)}
+        if HTTPException.template == self.template:
+            return template % args
+        for (k, v) in environ.items():
+            args[k] = escfunc(v)
+        if self.headers:
+            for (k, v) in self.headers:
+                args[k.lower()] = escfunc(v)
+        return template % args
+
+    def plain(self, environ):
+        """ text/plain representation of the exception """
+        body = self.make_body(environ, strip_html(self.template), no_quote)
+        return ('%s %s\r\n%s\r\n' % (self.code, self.title, body))
+
+    def html(self, environ):
+        """ text/html representation of the exception """
+        body = self.make_body(environ, self.template, html_quote, no_quote)
+        return TEMPLATE % {
+                   'title': self.title,
+                   'code': self.code,
+                   'server': SERVER_NAME,
+                   'body': body }
+
+    def prepare_content(self, environ):
+        if self.headers:
+            headers = list(self.headers)
+        else:
+            headers = []
+        if 'html' in environ.get('HTTP_ACCEPT','') or \
+            '*/*' in environ.get('HTTP_ACCEPT',''):
+            replace_header(headers, 'content-type', 'text/html')
+            content = self.html(environ)
+        else:
+            replace_header(headers, 'content-type', 'text/plain')
+            content = self.plain(environ)
+        if isinstance(content, unicode):
+            content = content.encode('utf8')
+            cur_content_type = (
+                header_value(headers, 'content-type')
+                or 'text/html')
+            replace_header(
+                headers, 'content-type',
+                cur_content_type + '; charset=utf8')
+        return headers, content
+
+    def response(self, environ):
+        from paste.wsgiwrappers import WSGIResponse
+        headers, content = self.prepare_content(environ)
+        resp = WSGIResponse(code=self.code, content=content)
+        resp.headers = resp.headers.fromlist(headers)
+        return resp
+
+    def wsgi_application(self, environ, start_response, exc_info=None):
+        """
+        This exception as a WSGI application
+        """
+        headers, content = self.prepare_content(environ)
+        start_response('%s %s' % (self.code, self.title),
+                       headers,
+                       exc_info)
+        return [content]
+
+    __call__ = wsgi_application
+
+    def __repr__(self):
+        return '<%s %s; code=%s>' % (self.__class__.__name__,
+                                     self.title, self.code)
+
+class HTTPError(HTTPException):
+    """
+    base class for status codes in the 400's and 500's
+
+    This is an exception which indicates that an error has occurred,
+    and that any work in progress should not be committed.  These are
+    typically results in the 400's and 500's.
+    """
+
+#
+# 3xx Redirection
+#
+#  This class of status code indicates that further action needs to be
+#  taken by the user agent in order to fulfill the request. The action
+#  required MAY be carried out by the user agent without interaction with
+#  the user if and only if the method used in the second request is GET or
+#  HEAD. A client SHOULD detect infinite redirection loops, since such
+#  loops generate network traffic for each redirection.
+#
+
+class HTTPRedirection(HTTPException):
+    """
+    base class for 300's status code (redirections)
+
+    This is an abstract base class for 3xx redirection.  It indicates
+    that further action needs to be taken by the user agent in order
+    to fulfill the request.  It does not necessarly signal an error
+    condition.
+    """
+
+class _HTTPMove(HTTPRedirection):
+    """
+    redirections which require a Location field
+
+    Since a 'Location' header is a required attribute of 301, 302, 303,
+    305 and 307 (but not 304), this base class provides the mechanics to
+    make this easy.  While this has the same parameters as HTTPException,
+    if a location is not provided in the headers; it is assumed that the
+    detail _is_ the location (this for backward compatibility, otherwise
+    we'd add a new attribute).
+    """
+    required_headers = ('location',)
+    explanation = 'The resource has been moved to'
+    template = (
+        '%(explanation)s <a href="%(location)s">%(location)s</a>;\r\n'
+        'you should be redirected automatically.\r\n'
+        '%(detail)s\r\n<!-- %(comment)s -->')
+
+    def __init__(self, detail=None, headers=None, comment=None):
+        assert isinstance(headers, (type(None), list))
+        headers = headers or []
+        location = header_value(headers,'location')
+        if not location:
+            location = detail
+            detail = ''
+            headers.append(('location', location))
+        assert location, ("HTTPRedirection specified neither a "
+                          "location in the headers nor did it "
+                          "provide a detail argument.")
+        HTTPRedirection.__init__(self, location, headers, comment)
+        if detail is not None:
+            self.detail = detail
+
+    def relative_redirect(cls, dest_uri, environ, detail=None, headers=None, comment=None):
+        """
+        Create a redirect object with the dest_uri, which may be relative, 
+        considering it relative to the uri implied by the given environ.
+        """
+        location = resolve_relative_url(dest_uri, environ)
+        headers = headers or []
+        headers.append(('Location', location))
+        return cls(detail=detail, headers=headers, comment=comment)
+    
+    relative_redirect = classmethod(relative_redirect)
+
+    def location(self):
+        for name, value in self.headers:
+            if name.lower() == 'location':
+                return value
+        else:
+            raise KeyError("No location set for %s" % self)
+
+class HTTPMultipleChoices(_HTTPMove):
+    code = 300
+    title = 'Multiple Choices'
+
+class HTTPMovedPermanently(_HTTPMove):
+    code = 301
+    title = 'Moved Permanently'
+
+class HTTPFound(_HTTPMove):
+    code = 302
+    title = 'Found'
+    explanation = 'The resource was found at'
+
+# This one is safe after a POST (the redirected location will be
+# retrieved with GET):
+class HTTPSeeOther(_HTTPMove):
+    code = 303
+    title = 'See Other'
+
+class HTTPNotModified(HTTPRedirection):
+    # @@: but not always (HTTP section 14.18.1)...?
+    # @@: Removed 'date' requirement, as its not required for an ETag
+    # @@: FIXME: This should require either an ETag or a date header
+    code = 304
+    title = 'Not Modified'
+    message = ''
+    # @@: should include date header, optionally other headers
+    # @@: should not return a content body
+    def plain(self, environ):
+        return ''
+    def html(self, environ):
+        """ text/html representation of the exception """
+        return ''
+
+class HTTPUseProxy(_HTTPMove):
+    # @@: OK, not a move, but looks a little like one
+    code = 305
+    title = 'Use Proxy'
+    explanation = (
+        'The resource must be accessed through a proxy '
+        'located at')
+
+class HTTPTemporaryRedirect(_HTTPMove):
+    code = 307
+    title = 'Temporary Redirect'
+
+#
+# 4xx Client Error
+#
+#  The 4xx class of status code is intended for cases in which the client
+#  seems to have erred. Except when responding to a HEAD request, the
+#  server SHOULD include an entity containing an explanation of the error
+#  situation, and whether it is a temporary or permanent condition. These
+#  status codes are applicable to any request method. User agents SHOULD
+#  display any included entity to the user.
+#
+
+class HTTPClientError(HTTPError):
+    """
+    base class for the 400's, where the client is in-error
+
+    This is an error condition in which the client is presumed to be
+    in-error.  This is an expected problem, and thus is not considered
+    a bug.  A server-side traceback is not warranted.  Unless specialized,
+    this is a '400 Bad Request'
+    """
+    code = 400
+    title = 'Bad Request'
+    explanation = ('The server could not comply with the request since\r\n'
+                   'it is either malformed or otherwise incorrect.\r\n')
+
+class HTTPBadRequest(HTTPClientError):
+    pass
+
+class HTTPUnauthorized(HTTPClientError):
+    code = 401
+    title = 'Unauthorized'
+    explanation = (
+        'This server could not verify that you are authorized to\r\n'
+        'access the document you requested.  Either you supplied the\r\n'
+        'wrong credentials (e.g., bad password), or your browser\r\n'
+        'does not understand how to supply the credentials required.\r\n')
+
+class HTTPPaymentRequired(HTTPClientError):
+    code = 402
+    title = 'Payment Required'
+    explanation = ('Access was denied for financial reasons.')
+
+class HTTPForbidden(HTTPClientError):
+    code = 403
+    title = 'Forbidden'
+    explanation = ('Access was denied to this resource.')
+
+class HTTPNotFound(HTTPClientError):
+    code = 404
+    title = 'Not Found'
+    explanation = ('The resource could not be found.')
+
+class HTTPMethodNotAllowed(HTTPClientError):
+    required_headers = ('allow',)
+    code = 405
+    title = 'Method Not Allowed'
+    # override template since we need an environment variable
+    template = ('The method %(REQUEST_METHOD)s is not allowed for '
+                'this resource.\r\n%(detail)s')
+
+class HTTPNotAcceptable(HTTPClientError):
+    code = 406
+    title = 'Not Acceptable'
+    # override template since we need an environment variable
+    template = ('The resource could not be generated that was '
+                'acceptable to your browser (content\r\nof type '
+                '%(HTTP_ACCEPT)s).\r\n%(detail)s')
+
+class HTTPProxyAuthenticationRequired(HTTPClientError):
+    code = 407
+    title = 'Proxy Authentication Required'
+    explanation = ('Authentication /w a local proxy is needed.')
+
+class HTTPRequestTimeout(HTTPClientError):
+    code = 408
+    title = 'Request Timeout'
+    explanation = ('The server has waited too long for the request to '
+                   'be sent by the client.')
+
+class HTTPConflict(HTTPClientError):
+    code = 409
+    title = 'Conflict'
+    explanation = ('There was a conflict when trying to complete '
+                   'your request.')
+
+class HTTPGone(HTTPClientError):
+    code = 410
+    title = 'Gone'
+    explanation = ('This resource is no longer available.  No forwarding '
+                   'address is given.')
+
+class HTTPLengthRequired(HTTPClientError):
+    code = 411
+    title = 'Length Required'
+    explanation = ('Content-Length header required.')
+
+class HTTPPreconditionFailed(HTTPClientError):
+    code = 412
+    title = 'Precondition Failed'
+    explanation = ('Request precondition failed.')
+
+class HTTPRequestEntityTooLarge(HTTPClientError):
+    code = 413
+    title = 'Request Entity Too Large'
+    explanation = ('The body of your request was too large for this server.')
+
+class HTTPRequestURITooLong(HTTPClientError):
+    code = 414
+    title = 'Request-URI Too Long'
+    explanation = ('The request URI was too long for this server.')
+
+class HTTPUnsupportedMediaType(HTTPClientError):
+    code = 415
+    title = 'Unsupported Media Type'
+    # override template since we need an environment variable
+    template = ('The request media type %(CONTENT_TYPE)s is not '
+                'supported by this server.\r\n%(detail)s')
+
+class HTTPRequestRangeNotSatisfiable(HTTPClientError):
+    code = 416
+    title = 'Request Range Not Satisfiable'
+    explanation = ('The Range requested is not available.')
+
+class HTTPExpectationFailed(HTTPClientError):
+    code = 417
+    title = 'Expectation Failed'
+    explanation = ('Expectation failed.')
+
+#
+# 5xx Server Error
+#
+#  Response status codes beginning with the digit "5" indicate cases in
+#  which the server is aware that it has erred or is incapable of
+#  performing the request. Except when responding to a HEAD request, the
+#  server SHOULD include an entity containing an explanation of the error
+#  situation, and whether it is a temporary or permanent condition. User
+#  agents SHOULD display any included entity to the user. These response
+#  codes are applicable to any request method.
+#
+
+class HTTPServerError(HTTPError):
+    """
+    base class for the 500's, where the server is in-error
+
+    This is an error condition in which the server is presumed to be
+    in-error.  This is usually unexpected, and thus requires a traceback;
+    ideally, opening a support ticket for the customer. Unless specialized,
+    this is a '500 Internal Server Error'
+    """
+    code = 500
+    title = 'Internal Server Error'
+    explanation = (
+      'The server has either erred or is incapable of performing\r\n'
+      'the requested operation.\r\n')
+
+class HTTPInternalServerError(HTTPServerError):
+    pass
+
+class HTTPNotImplemented(HTTPServerError):
+    code = 501
+    title = 'Not Implemented'
+    # override template since we need an environment variable
+    template = ('The request method %(REQUEST_METHOD)s is not implemented '
+                'for this server.\r\n%(detail)s')
+
+class HTTPBadGateway(HTTPServerError):
+    code = 502
+    title = 'Bad Gateway'
+    explanation = ('Bad gateway.')
+
+class HTTPServiceUnavailable(HTTPServerError):
+    code = 503
+    title = 'Service Unavailable'
+    explanation = ('The server is currently unavailable. '
+                   'Please try again at a later time.')
+
+class HTTPGatewayTimeout(HTTPServerError):
+    code = 504
+    title = 'Gateway Timeout'
+    explanation = ('The gateway has timed out.')
+
+class HTTPVersionNotSupported(HTTPServerError):
+    code = 505
+    title = 'HTTP Version Not Supported'
+    explanation = ('The HTTP version is not supported.')
+
+# abstract HTTP related exceptions
+__all__ = ['HTTPException', 'HTTPRedirection', 'HTTPError' ]
+
+_exceptions = {}
+for name, value in globals().items():
+    if (isinstance(value, (type, types.ClassType)) and
+        issubclass(value, HTTPException) and
+        value.code):
+        _exceptions[value.code] = value
+        __all__.append(name)
+
+def get_exception(code):
+    return _exceptions[code]
+
+############################################################
+## Middleware implementation:
+############################################################
+
+class HTTPExceptionHandler(object):
+    """
+    catches exceptions and turns them into proper HTTP responses
+
+    Attributes:
+
+       ``warning_level``
+           This attribute determines for what exceptions a stack
+           trace is kept for lower level reporting; by default, it
+           only keeps stack trace for 5xx, HTTPServerError exceptions.
+           To keep a stack trace for 4xx, HTTPClientError exceptions,
+           set this to 400.
+
+    This middleware catches any exceptions (which are subclasses of
+    ``HTTPException``) and turns them into proper HTTP responses.
+    Note if the headers have already been sent, the stack trace is
+    always maintained as this indicates a programming error.
+    """
+
+    def __init__(self, application, warning_level=None):
+        assert not warning_level or ( warning_level > 99 and
+                                      warning_level < 600)
+        self.warning_level = warning_level or 500
+        self.application = application
+
+    def __call__(self, environ, start_response):
+        environ['paste.httpexceptions'] = self
+        environ.setdefault('paste.expected_exceptions',
+                           []).append(HTTPException)
+        try:
+            return self.application(environ, start_response)
+        except HTTPException, exc:
+            return exc(environ, start_response)
+
+def middleware(*args, **kw):
+    import warnings
+    # deprecated 13 dec 2005
+    warnings.warn('httpexceptions.middleware is deprecated; use '
+                  'make_middleware or HTTPExceptionHandler instead',
+                  DeprecationWarning, 2)
+    return make_middleware(*args, **kw)
+
+def make_middleware(app, global_conf=None, warning_level=None):
+    """
+    ``httpexceptions`` middleware; this catches any
+    ``paste.httpexceptions.HTTPException`` exceptions (exceptions like
+    ``HTTPNotFound``, ``HTTPMovedPermanently``, etc) and turns them
+    into proper HTTP responses.
+
+    ``warning_level`` can be an integer corresponding to an HTTP code.
+    Any code over that value will be passed 'up' the chain, potentially
+    reported on by another piece of middleware.
+    """
+    if warning_level:
+        warning_level = int(warning_level)
+    return HTTPExceptionHandler(app, warning_level=warning_level)
+
+__all__.extend(['HTTPExceptionHandler', 'get_exception'])
+
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/session.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/session.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/session.py (revision 3)
@@ -0,0 +1,331 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+
+"""
+Creates a session object in your WSGI environment.
+
+Use like:
+
+..code-block:: Python
+
+    environ['paste.session.factory']()
+
+This will return a dictionary.  The contents of this dictionary will
+be saved to disk when the request is completed.  The session will be
+created when you first fetch the session dictionary, and a cookie will
+be sent in that case.  There's current no way to use sessions without
+cookies, and there's no way to delete a session except to clear its
+data.
+
+@@: This doesn't do any locking, and may cause problems when a single
+session is accessed concurrently.  Also, it loads and saves the
+session for each request, with no caching.  Also, sessions aren't
+expired.
+"""
+
+from Cookie import SimpleCookie
+import time
+import random
+import os
+import md5
+import datetime
+import threading
+
+try:
+    import cPickle
+except ImportError:
+    import pickle as cPickle
+from paste import wsgilib
+from paste import request
+
+class SessionMiddleware(object):
+
+    def __init__(self, application, global_conf=None, **factory_kw):
+        self.application = application
+        self.factory_kw = factory_kw
+
+    def __call__(self, environ, start_response):
+        session_factory = SessionFactory(environ, **self.factory_kw)
+        environ['paste.session.factory'] = session_factory
+        remember_headers = []
+
+        def session_start_response(status, headers, exc_info=None):
+            if not session_factory.created:
+                remember_headers[:] = [status, headers]
+                return start_response(status, headers)
+            headers.append(session_factory.set_cookie_header())
+            return start_response(status, headers, exc_info)
+
+        app_iter = self.application(environ, session_start_response)
+        def start():
+            if session_factory.created and remember_headers:
+                # Tricky bastard used the session after start_response
+                status, headers = remember_headers
+                headers.append(session_factory.set_cookie_header())
+                exc = ValueError(
+                    "You cannot get the session after content from the "
+                    "app_iter has been returned")
+                start_response(status, headers, (exc.__class__, exc, None))
+        def close():
+            if session_factory.used:
+                session_factory.close()
+        return wsgilib.add_start_close(app_iter, start, close)
+
+
+class SessionFactory(object):
+
+
+    def __init__(self, environ, cookie_name='_SID_',
+                 session_class=None,
+                 session_expiration=60*12, # in minutes
+                 **session_class_kw):
+        
+        self.created = False
+        self.used = False
+        self.environ = environ
+        self.cookie_name = cookie_name
+        self.session = None
+        self.session_class = session_class or FileSession
+        self.session_class_kw = session_class_kw
+
+        self.expiration = session_expiration
+
+    def __call__(self):
+        self.used = True
+        if self.session is not None:
+            return self.session.data()
+        cookies = request.get_cookies(self.environ)
+        session = None
+        if cookies.has_key(self.cookie_name):
+            self.sid = cookies[self.cookie_name].value
+            try:
+                session = self.session_class(self.sid, create=False,
+                                             **self.session_class_kw)
+            except KeyError:
+                # Invalid SID
+                pass
+        if session is None:
+            self.created = True
+            self.sid = self.make_sid()
+            session = self.session_class(self.sid, create=True,
+                                         **self.session_class_kw)
+        session.clean_up()
+        self.session = session
+        return session.data()
+
+    def has_session(self):
+        if self.session is not None:
+            return True
+        cookies = request.get_cookies(self.environ)
+        if cookies.has_key(self.cookie_name):
+            return True
+        return False
+
+    def make_sid(self):
+        # @@: need better algorithm
+        return (''.join(['%02d' % x for x in time.localtime(time.time())[:6]])
+                + '-' + self.unique_id())
+
+    def unique_id(self, for_object=None):
+        """
+        Generates an opaque, identifier string that is practically
+        guaranteed to be unique.  If an object is passed, then its
+        id() is incorporated into the generation.  Relies on md5 and
+        returns a 32 character long string.
+        """
+        r = [time.time(), random.random(), os.times()]
+        if for_object is not None:
+            r.append(id(for_object))
+        md5_hash = md5.new(str(r))
+        try:
+            return md5_hash.hexdigest()
+        except AttributeError:
+            # Older versions of Python didn't have hexdigest, so we'll
+            # do it manually
+            hexdigest = []
+            for char in md5_hash.digest():
+                hexdigest.append('%02x' % ord(char))
+            return ''.join(hexdigest)
+
+    def set_cookie_header(self):
+        c = SimpleCookie()
+        c[self.cookie_name] = self.sid
+        c[self.cookie_name]['path'] = '/'
+
+        gmt_expiration_time = time.gmtime(time.time() + (self.expiration * 60))
+        c[self.cookie_name]['expires'] = time.strftime("%a, %d-%b-%Y %H:%M:%S GMT", gmt_expiration_time)
+
+        name, value = str(c).split(': ', 1)
+        return (name, value)
+
+    def close(self):
+        if self.session is not None:
+            self.session.close()
+
+
+last_cleanup = None
+cleaning_up = False
+cleanup_cycle = datetime.timedelta(seconds=15*60) #15 min
+
+class FileSession(object):
+
+    def __init__(self, sid, create=False, session_file_path='/tmp',
+                 chmod=None,
+                 expiration=2880, # in minutes: 48 hours
+                 ):
+        if chmod and isinstance(chmod, basestring):
+            chmod = int(chmod, 8)
+        self.chmod = chmod
+        if not sid:
+            # Invalid...
+            raise KeyError
+        self.session_file_path = session_file_path
+        self.sid = sid
+        if not create:
+            if not os.path.exists(self.filename()):
+                raise KeyError
+        self._data = None
+
+        self.expiration = expiration
+
+
+    def filename(self):
+        return os.path.join(self.session_file_path, self.sid)
+
+    def data(self):
+        if self._data is not None:
+            return self._data
+        if os.path.exists(self.filename()):
+            f = open(self.filename(), 'rb')
+            self._data = cPickle.load(f)
+            f.close()
+        else:
+            self._data = {}
+        return self._data
+
+    def close(self):
+        if self._data is not None:
+            filename = self.filename()
+            exists = os.path.exists(filename)
+            if not self._data:
+                if exists:
+                    os.unlink(filename)
+            else:
+                f = open(filename, 'wb')
+                cPickle.dump(self._data, f)
+                f.close()
+                if not exists and self.chmod:
+                    os.chmod(filename, self.chmod)
+
+    def _clean_up(self):
+        global cleaning_up
+        try:
+            exp_time = datetime.timedelta(seconds=self.expiration*60)
+            now = datetime.datetime.now()
+
+            #Open every session and check that it isn't too old
+            for root, dirs, files in os.walk(self.session_file_path):
+                for f in files:
+                    self._clean_up_file(f, exp_time=exp_time, now=now)
+        finally:
+            cleaning_up = False
+
+    def _clean_up_file(self, f, exp_time, now):
+        t = f.split("-")
+        if len(t) != 2:
+            return
+        t = t[0]
+        try:
+            sess_time = datetime.datetime(
+                    int(t[0:4]),
+                    int(t[4:6]),
+                    int(t[6:8]),
+                    int(t[8:10]),
+                    int(t[10:12]),
+                    int(t[12:14]))
+        except ValueError:
+            # Probably not a session file at all
+            return
+
+        if sess_time + exp_time < now:
+            os.remove(os.path.join(self.session_file_path, f))
+
+    def clean_up(self):
+        global last_cleanup, cleanup_cycle, cleaning_up
+        now = datetime.datetime.now()
+
+        if cleaning_up:
+            return
+
+        if not last_cleanup or last_cleanup + cleanup_cycle < now:
+            if not cleaning_up:
+                cleaning_up = True
+                try:
+                    last_cleanup = now
+                    t = threading.Thread(target=self._clean_up)
+                    t.start()
+                except:
+                    # Normally _clean_up should set cleaning_up
+                    # to false, but if something goes wrong starting
+                    # it...
+                    cleaning_up = False
+                    raise
+
+class _NoDefault(object):
+    def __repr__(self):
+        return '<dynamic default>'
+NoDefault = _NoDefault()
+
+def make_session_middleware(
+    app, global_conf,
+    session_expiration=NoDefault,
+    expiration=NoDefault,
+    cookie_name=NoDefault,
+    session_file_path=NoDefault,
+    chmod=NoDefault):
+    """
+    Adds a middleware that handles sessions for your applications.
+    The session is a peristent dictionary.  To get this dictionary
+    in your application, use ``environ['paste.session.factory']()``
+    which returns this persistent dictionary.
+
+    Configuration:
+
+      session_expiration:
+          The time each session lives, in minutes.  This controls
+          the cookie expiration.  Default 12 hours.  
+
+      expiration:
+          The time each session lives on disk.  Old sessions are
+          culled from disk based on this.  Default 48 hours.
+
+      cookie_name:
+          The cookie name used to track the session.  Use different
+          names to avoid session clashes.
+
+      session_file_path:
+          Sessions are put in this location, default /tmp.
+
+      chmod:
+          The octal chmod you want to apply to new sessions (e.g., 660
+          to make the sessions group readable/writable)
+
+    Each of these also takes from the global configuration.  cookie_name
+    and chmod take from session_cookie_name and session_chmod
+    """
+    if session_expiration is NoDefault:
+        session_expiration = global_conf.get('session_expiration', 60*12)
+    session_expiration = int(session_expiration)
+    if expiration is NoDefault:
+        expiration = global_conf.get('expiration', 60*48)
+    expiration = int(expiration)
+    if cookie_name is NoDefault:
+        cookie_name = global_conf.get('session_cookie_name', '_SID_')
+    if session_file_path is NoDefault:
+        session_file_path = global_conf.get('session_file_path', '/tmp')
+    if chmod is NoDefault:
+        chmod = global_conf.get('session_chmod', None)
+    return SessionMiddleware(
+        app, session_expiration=session_expiration,
+        expiration=expiration, cookie_name=cookie_name,
+        session_file_path=session_file_path, chmod=chmod)
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/transaction.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/transaction.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/transaction.py (revision 3)
@@ -0,0 +1,120 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+# (c) 2005 Clark C. Evans
+# This module is part of the Python Paste Project and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+"""
+Middleware related to transactions and database connections.
+
+At this time it is very basic; but will eventually sprout all that
+two-phase commit goodness that I don't need.
+
+.. note::
+
+   This is experimental, and will change in the future.
+"""
+from paste.httpexceptions import HTTPException
+from wsgilib import catch_errors
+
+class TransactionManagerMiddleware(object):
+
+    def __init__(self, application):
+        self.application = application
+
+    def __call__(self, environ, start_response):
+        environ['paste.transaction_manager'] = manager = Manager()
+        # This makes sure nothing else traps unexpected exceptions:
+        environ['paste.throw_errors'] = True
+        return catch_errors(self.application, environ, start_response,
+                            error_callback=manager.error,
+                            ok_callback=manager.finish)
+
+class Manager(object):
+
+    def __init__(self):
+        self.aborted = False
+        self.transactions = []
+
+    def abort(self):
+        self.aborted = True
+
+    def error(self, exc_info):
+        self.aborted = True
+        self.finish()
+
+    def finish(self):
+        for trans in self.transactions:
+            if self.aborted:
+                trans.rollback()
+            else:
+                trans.commit()
+
+
+class ConnectionFactory(object):
+    """
+    Provides a callable interface for connecting to ADBAPI databases in
+    a WSGI style (using the environment).  More advanced connection
+    factories might use the REMOTE_USER and/or other environment
+    variables to make the connection returned depend upon the request.
+    """
+    def __init__(self, module, *args, **kwargs):
+        #assert getattr(module,'threadsaftey',0) > 0
+        self.module = module
+        self.args = args
+        self.kwargs = kwargs
+
+        # deal with database string quoting issues
+        self.quote = lambda s: "'%s'" % s.replace("'","''")
+        if hasattr(self.module,'PgQuoteString'):
+            self.quote = self.module.PgQuoteString
+
+    def __call__(self, environ=None):
+        conn = self.module.connect(*self.args, **self.kwargs)
+        conn.__dict__['module'] = self.module
+        conn.__dict__['quote'] = self.quote
+        return conn
+
+def BasicTransactionHandler(application, factory):
+    """
+    Provides a simple mechanism for starting a transaction based on the
+    factory; and for either committing or rolling back the transaction
+    depending on the result.  It checks for the response's current
+    status code either through the latest call to start_response; or
+    through a HTTPException's code.  If it is a 100, 200, or 300; the
+    transaction is committed; otherwise it is rolled back.
+    """
+    def basic_transaction(environ, start_response):
+        conn = factory(environ)
+        environ['paste.connection'] = conn
+        should_commit = [500]
+        def finalizer(exc_info=None):
+            if exc_info:
+                if isinstance(exc_info[1], HTTPException):
+                    should_commit.append(exc_info[1].code)
+            if should_commit.pop() < 400:
+                conn.commit()
+            else:
+                try:
+                    conn.rollback()
+                except:
+                    # TODO: check if rollback has already happened
+                    return
+            conn.close()
+        def basictrans_start_response(status, headers, exc_info = None):
+            should_commit.append(int(status.split(" ")[0]))
+            return start_response(status, headers, exc_info)
+        return catch_errors(application, environ, basictrans_start_response,
+                            finalizer, finalizer)
+    return basic_transaction
+
+__all__ = ['ConnectionFactory', 'BasicTransactionHandler']
+
+if '__main__' == __name__ and False:
+    from pyPgSQL import PgSQL
+    factory = ConnectionFactory(PgSQL, database="testing")
+    conn = factory()
+    curr = conn.cursor()
+    curr.execute("SELECT now(), %s" % conn.quote("B'n\\'gles"))
+    (time, bing) = curr.fetchone()
+    print bing, time
+
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/UserDict24.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/UserDict24.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/UserDict24.py (revision 3)
@@ -0,0 +1,167 @@
+"""A more or less complete user-defined wrapper around dictionary objects."""
+
+class UserDict:
+    def __init__(self, dict=None, **kwargs):
+        self.data = {}
+        if dict is not None:
+            if not hasattr(dict,'keys'):
+                dict = type({})(dict)   # make mapping from a sequence
+            self.update(dict)
+        if len(kwargs):
+            self.update(kwargs)
+    def __repr__(self): return repr(self.data)
+    def __cmp__(self, dict):
+        if isinstance(dict, UserDict):
+            return cmp(self.data, dict.data)
+        else:
+            return cmp(self.data, dict)
+    def __len__(self): return len(self.data)
+    def __getitem__(self, key): return self.data[key]
+    def __setitem__(self, key, item): self.data[key] = item
+    def __delitem__(self, key): del self.data[key]
+    def clear(self): self.data.clear()
+    def copy(self):
+        if self.__class__ is UserDict:
+            return UserDict(self.data)
+        import copy
+        data = self.data
+        try:
+            self.data = {}
+            c = copy.copy(self)
+        finally:
+            self.data = data
+        c.update(self)
+        return c
+    def keys(self): return self.data.keys()
+    def items(self): return self.data.items()
+    def iteritems(self): return self.data.iteritems()
+    def iterkeys(self): return self.data.iterkeys()
+    def itervalues(self): return self.data.itervalues()
+    def values(self): return self.data.values()
+    def has_key(self, key): return self.data.has_key(key)
+    def update(self, dict):
+        if isinstance(dict, UserDict):
+            self.data.update(dict.data)
+        elif isinstance(dict, type(self.data)):
+            self.data.update(dict)
+        else:
+            for k, v in dict.items():
+                self[k] = v
+    def get(self, key, failobj=None):
+        if not self.has_key(key):
+            return failobj
+        return self[key]
+    def setdefault(self, key, failobj=None):
+        if not self.has_key(key):
+            self[key] = failobj
+        return self[key]
+    def pop(self, key, *args):
+        return self.data.pop(key, *args)
+    def popitem(self):
+        return self.data.popitem()
+    def __contains__(self, key):
+        return key in self.data
+    def fromkeys(cls, iterable, value=None):
+        d = cls()
+        for key in iterable:
+            d[key] = value
+        return d
+    fromkeys = classmethod(fromkeys)
+
+class IterableUserDict(UserDict):
+    def __iter__(self):
+        return iter(self.data)
+
+class DictMixin:
+    # Mixin defining all dictionary methods for classes that already have
+    # a minimum dictionary interface including getitem, setitem, delitem,
+    # and keys. Without knowledge of the subclass constructor, the mixin
+    # does not define __init__() or copy().  In addition to the four base
+    # methods, progressively more efficiency comes with defining
+    # __contains__(), __iter__(), and iteritems().
+
+    # second level definitions support higher levels
+    def __iter__(self):
+        for k in self.keys():
+            yield k
+    def has_key(self, key):
+        try:
+            value = self[key]
+        except KeyError:
+            return False
+        return True
+    def __contains__(self, key):
+        return self.has_key(key)
+
+    # third level takes advantage of second level definitions
+    def iteritems(self):
+        for k in self:
+            yield (k, self[k])
+    def iterkeys(self):
+        return self.__iter__()
+
+    # fourth level uses definitions from lower levels
+    def itervalues(self):
+        for _, v in self.iteritems():
+            yield v
+    def values(self):
+        return [v for _, v in self.iteritems()]
+    def items(self):
+        return list(self.iteritems())
+    def clear(self):
+        for key in self.keys():
+            del self[key]
+    def setdefault(self, key, default):
+        try:
+            return self[key]
+        except KeyError:
+            self[key] = default
+        return default
+    def pop(self, key, *args):
+        if len(args) > 1:
+            raise TypeError, "pop expected at most 2 arguments, got "\
+                              + repr(1 + len(args))
+        try:
+            value = self[key]
+        except KeyError:
+            if args:
+                return args[0]
+            raise
+        del self[key]
+        return value
+    def popitem(self):
+        try:
+            k, v = self.iteritems().next()
+        except StopIteration:
+            raise KeyError, 'container is empty'
+        del self[k]
+        return (k, v)
+    def update(self, other):
+        # Make progressively weaker assumptions about "other"
+        if hasattr(other, 'iteritems'):  # iteritems saves memory and lookups
+            for k, v in other.iteritems():
+                self[k] = v
+        elif hasattr(other, '__iter__'): # iter saves memory
+            for k in other:
+                self[k] = other[k]
+        else:
+            for k in other.keys():
+                self[k] = other[k]
+    def get(self, key, default=None):
+        try:
+            return self[key]
+        except KeyError:
+            return default
+    def __repr__(self):
+        return repr(dict(self.iteritems()))
+    def __cmp__(self, other):
+        if other is None:
+            return 1
+        if isinstance(other, DictMixin):
+            other = dict(other.iteritems())
+        return cmp(dict(self.iteritems()), other)
+    def __len__(self):
+        return len(self.keys())
+    
+    def __nonzero__(self):
+        return bool(self.iteritems())
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/classinit.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/classinit.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/classinit.py (revision 3)
@@ -0,0 +1,42 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+
+class ClassInitMeta(type):
+
+    def __new__(meta, class_name, bases, new_attrs):
+        cls = type.__new__(meta, class_name, bases, new_attrs)
+        if (new_attrs.has_key('__classinit__')
+            and not isinstance(cls.__classinit__, staticmethod)):
+            setattr(cls, '__classinit__',
+                    staticmethod(cls.__classinit__.im_func))
+        if hasattr(cls, '__classinit__'):
+            cls.__classinit__(cls, new_attrs)
+        return cls
+
+def build_properties(cls, new_attrs):
+    """
+    Given a class and a new set of attributes (as passed in by
+    __classinit__), create or modify properties based on functions
+    with special names ending in __get, __set, and __del.
+    """
+    for name, value in new_attrs.items():
+        if (name.endswith('__get') or name.endswith('__set')
+            or name.endswith('__del')):
+            base = name[:-5]
+            if hasattr(cls, base):
+                old_prop = getattr(cls, base)
+                if not isinstance(old_prop, property):
+                    raise ValueError(
+                        "Attribute %s is a %s, not a property; function %s is named like a property"
+                        % (base, type(old_prop), name))
+                attrs = {'fget': old_prop.fget,
+                         'fset': old_prop.fset,
+                         'fdel': old_prop.fdel,
+                         'doc': old_prop.__doc__}
+            else:
+                attrs = {}
+            attrs['f' + name[-3:]] = value
+            if name.endswith('__get') and value.__doc__:
+                attrs['doc'] = value.__doc__
+            new_prop = property(**attrs)
+            setattr(cls, base, new_prop)
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/datetimeutil.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/datetimeutil.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/datetimeutil.py (revision 3)
@@ -0,0 +1,361 @@
+# (c) 2005 Clark C. Evans and contributors
+# This module is part of the Python Paste Project and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+# Some of this code was funded by: http://prometheusresearch.com
+"""
+Date, Time, and Timespan Parsing Utilities
+
+This module contains parsing support to create "human friendly"
+``datetime`` object parsing.  The explicit goal of these routines is
+to provide a multi-format date/time support not unlike that found in
+Microsoft Excel.  In most approaches, the input is very "strict" to
+prevent errors -- however, this approach is much more liberal since we
+are assuming the user-interface is parroting back the normalized value
+and thus the user has immediate feedback if the data is not typed in
+correctly.
+
+  ``parse_date`` and ``normalize_date``
+
+     These functions take a value like '9 jan 2007' and returns either an
+     ``date`` object, or an ISO 8601 formatted date value such
+     as '2007-01-09'.  There is an option to provide an Oracle database
+     style output as well, ``09 JAN 2007``, but this is not the default.
+
+     This module always treats '/' delimiters as using US date order
+     (since the author's clients are US based), hence '1/9/2007' is
+     January 9th.  Since this module treats the '-' as following
+     European order this supports both modes of data-entry; together
+     with immediate parroting back the result to the screen, the author
+     has found this approach to work well in pratice.
+
+  ``parse_time`` and ``normalize_time``
+
+     These functions take a value like '1 pm' and returns either an
+     ``time`` object, or an ISO 8601 formatted 24h clock time
+     such as '13:00'.  There is an option to provide for US style time
+     values, '1:00 PM', however this is not the default.
+
+  ``parse_datetime`` and ``normalize_datetime``
+
+     These functions take a value like '9 jan 2007 at 1 pm' and returns
+     either an ``datetime`` object, or an ISO 8601 formatted
+     return (without the T) such as '2007-01-09 13:00'. There is an
+     option to provide for Oracle / US style, '09 JAN 2007 @ 1:00 PM',
+     however this is not the default.
+
+  ``parse_delta`` and ``normalize_delta``
+
+     These functions take a value like '1h 15m' and returns either an
+     ``timedelta`` object, or an 2-decimal fixed-point
+     numerical value in hours, such as '1.25'.  The rationale is to
+     support meeting or time-billing lengths, not to be an accurate
+     representation in mili-seconds.  As such not all valid
+     ``timedelta`` values will have a normalized representation.
+
+"""
+from datetime import timedelta, time, date
+from time import localtime
+import string
+
+__all__ = ['parse_timedelta', 'normalize_timedelta',
+           'parse_time', 'normalize_time',
+           'parse_date', 'normalize_date']
+
+def _number(val):
+    try:
+        return string.atoi(val)
+    except:
+        return None
+
+#
+# timedelta
+#
+def parse_timedelta(val):
+    """
+    returns a ``timedelta`` object, or None
+    """
+    if not val:
+        return None
+    val = string.lower(val)
+    if "." in val:
+        val = float(val)
+        return timedelta(hours=int(val), minutes=60*(val % 1.0))
+    fHour = ("h" in val or ":" in val)
+    fMin  = ("m" in val or ":" in val)
+    fFraction = "." in val
+    for noise in "minu:teshour()":
+        val = string.replace(val, noise, ' ')
+    val = string.strip(val)
+    val = string.split(val)
+    hr = 0.0
+    mi = 0
+    val.reverse()
+    if fHour:
+        hr = int(val.pop())
+    if fMin:
+        mi = int(val.pop())
+    if len(val) > 0 and not hr:
+        hr = int(val.pop())
+    return timedelta(hours=hr, minutes=mi)
+
+def normalize_timedelta(val):
+    """
+    produces a normalized string value of the timedelta
+
+    This module returns a normalized time span value consisting of the
+    number of hours in fractional form. For example '1h 15min' is
+    formatted as 01.25.
+    """
+    if type(val) == str:
+        val = parse_timedelta(val)
+    if not val:
+        return ''
+    hr = val.seconds/3600
+    mn = (val.seconds % 3600)/60
+    return "%d.%02d" % (hr, mn * 100/60)
+
+#
+# time
+#
+def parse_time(val):
+    if not val:
+        return None
+    hr = mi = 0
+    val = string.lower(val)
+    amflag = (-1 != string.find(val, 'a'))  # set if AM is found
+    pmflag = (-1 != string.find(val, 'p'))  # set if PM is found
+    for noise in ":amp.":
+        val = string.replace(val, noise, ' ')
+    val = string.split(val)
+    if len(val) > 1:
+        hr = int(val[0])
+        mi = int(val[1])
+    else:
+        val = val[0]
+        if len(val) < 1:
+            pass
+        elif 'now' == val:
+            tm = localtime()
+            hr = tm[3]
+            mi = tm[4]
+        elif 'noon' == val:
+            hr = 12
+        elif len(val) < 3:
+            hr = int(val)
+            if not amflag and not pmflag and hr < 7:
+                hr += 12
+        elif len(val) < 5:
+            hr = int(val[:-2])
+            mi = int(val[-2:])
+        else:
+            hr = int(val[:1])
+    if amflag and hr >= 12:
+        hr = hr - 12
+    if pmflag and hr < 12:
+        hr = hr + 12
+    return time(hr, mi)
+
+def normalize_time(value, ampm):
+    if not value:
+        return ''
+    if type(value) == str:
+        value = parse_time(value)
+    if not ampm:
+        return "%02d:%02d" % (value.hour, value.minute)
+    hr = value.hour
+    am = "AM"
+    if hr < 1 or hr > 23:
+        hr = 12
+    elif hr >= 12:
+        am = "PM"
+        if hr > 12:
+            hr = hr - 12
+    return "%02d:%02d %s" % (hr, value.minute, am)
+
+#
+# Date Processing
+#
+
+_one_day = timedelta(days=1)
+
+_str2num = {'jan':1, 'feb':2, 'mar':3, 'apr':4,  'may':5, 'jun':6,
+            'jul':7, 'aug':8, 'sep':9, 'oct':10, 'nov':11, 'dec':12 }
+
+def _month(val):
+    for (key, mon) in _str2num.items():
+        if key in val:
+            return mon
+    raise TypeError("unknown month '%s'" % val)
+
+_days_in_month = {1: 31, 2: 28, 3: 31, 4: 30, 5: 31, 6: 30,
+                  7: 31, 8: 31, 9: 30, 10: 31, 11: 30, 12: 31,
+                  }
+_num2str = {1: 'Jan', 2: 'Feb', 3: 'Mar', 4: 'Apr', 5: 'May', 6: 'Jun',
+            7: 'Jul', 8: 'Aug', 9: 'Sep', 10: 'Oct', 11: 'Nov', 12: 'Dec',
+            }
+_wkdy = ("mon", "tue", "wed", "thu", "fri", "sat", "sun")
+
+def parse_date(val):
+    if not(val):
+        return None
+    val = string.lower(val)
+    now = None
+
+    # optimized check for YYYY-MM-DD
+    strict = val.split("-")
+    if len(strict) == 3:
+        (y, m, d) = strict
+        if "+" in d:
+            d = d.split("+")[0]
+        if " " in d:
+            d = d.split(" ")[0]
+        try:
+            now = date(int(y), int(m), int(d))
+            val = "xxx" + val[10:]
+        except ValueError:
+            pass
+
+    # allow for 'now', 'mon', 'tue', etc.
+    if not now:
+        chk = val[:3]
+        if chk in ('now','tod'):
+            now = date.today()
+        elif chk in _wkdy:
+            now = date.today()
+            idx = list(_wkdy).index(chk) + 1
+            while now.isoweekday() != idx:
+                now += _one_day
+
+    # allow dates to be modified via + or - /w number of days, so
+    # that now+3 is three days from now
+    if now:
+        tail = val[3:].strip()
+        tail = tail.replace("+"," +").replace("-"," -")
+        for item in tail.split():
+            try:
+                days = int(item)
+            except ValueError:
+                pass
+            else:
+                now += timedelta(days=days)
+        return now
+
+    # ok, standard parsing
+    yr = mo = dy = None
+    for noise in ('/', '-', ',', '*'):
+        val = string.replace(val, noise, ' ')
+    for noise in _wkdy:
+        val = string.replace(val, noise, ' ')
+    out = []
+    last = False
+    ldig = False
+    for ch in val:
+        if ch.isdigit():
+            if last and not ldig:
+               out.append(' ')
+            last = ldig = True
+        else:
+            if ldig:
+                out.append(' ')
+                ldig = False
+            last = True
+        out.append(ch)
+    val = string.split("".join(out))
+    if 3 == len(val):
+        a = _number(val[0])
+        b = _number(val[1])
+        c = _number(val[2])
+        if len(val[0]) == 4:
+            yr = a
+            if b:  # 1999 6 23
+                mo = b
+                dy = c
+            else:  # 1999 Jun 23
+                mo = _month(val[1])
+                dy = c
+        elif a > 0:
+            yr = c
+            if len(val[2]) < 4:
+                raise TypeError("four digit year required")
+            if b: # 6 23 1999
+                dy = b
+                mo = a
+            else: # 23 Jun 1999
+                dy = a
+                mo = _month(val[1])
+        else: # Jun 23, 2000
+            dy = b
+            yr = c
+            if len(val[2]) < 4:
+                raise TypeError("four digit year required")
+            mo = _month(val[0])
+    elif 2 == len(val):
+        a = _number(val[0])
+        b = _number(val[1])
+        if a > 999:
+            yr = a
+            dy = 1
+            if b > 0: # 1999 6
+                mo = b
+            else: # 1999 Jun
+                mo = _month(val[1])
+        elif a > 0:
+            if b > 999: # 6 1999
+                mo = a
+                yr = b
+                dy = 1
+            elif b > 0: # 6 23
+                mo = a
+                dy = b
+            else: # 23 Jun
+                dy = a
+                mo = _month(val[1])
+        else:
+            if b > 999: # Jun 2001
+                yr = b
+                dy = 1
+            else:  # Jun 23
+                dy = b
+            mo = _month(val[0])
+    elif 1 == len(val):
+        val = val[0]
+        if not val.isdigit():
+            mo = _month(val)
+            if mo is not None:
+                dy = 1
+        else:
+            v = _number(val)
+            val = str(v)
+            if 8 == len(val): # 20010623
+                yr = _number(val[:4])
+                mo = _number(val[4:6])
+                dy = _number(val[6:])
+            elif len(val) in (3,4):
+                if v > 1300: # 2004
+                    yr = v
+                    mo = 1
+                    dy = 1
+                else:        # 1202
+                    mo = _number(val[:-2])
+                    dy = _number(val[-2:])
+            elif v < 32:
+                dy = v
+            else:
+                raise TypeError("four digit year required")
+    tm = localtime()
+    if mo is None:
+        mo = tm[1]
+    if dy is None:
+        dy = tm[2]
+    if yr is None:
+        yr = tm[0]
+    return date(yr, mo, dy)
+
+def normalize_date(val, iso8601=True):
+    if not val:
+        return ''
+    if type(val) == str:
+        val = parse_date(val)
+    if iso8601:
+        return "%4d-%02d-%02d" % (val.year, val.month, val.day)
+    return "%02d %s %4d" % (val.day, _num2str[val.month], val.year)
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/converters.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/converters.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/converters.py (revision 3)
@@ -0,0 +1,26 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+def asbool(obj):
+    if isinstance(obj, (str, unicode)):
+        obj = obj.strip().lower()
+        if obj in ['true', 'yes', 'on', 'y', 't', '1']:
+            return True
+        elif obj in ['false', 'no', 'off', 'n', 'f', '0']:
+            return False
+        else:
+            raise ValueError(
+                "String is not true/false: %r" % obj)
+    return bool(obj)
+
+def aslist(obj, sep=None, strip=True):
+    if isinstance(obj, (str, unicode)):
+        lst = obj.split(sep)
+        if strip:
+            lst = [v.strip() for v in lst]
+        return lst
+    elif isinstance(obj, (list, tuple)):
+        return obj
+    elif obj is None:
+        return []
+    else:
+        return [obj]
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/classinstance.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/classinstance.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/classinstance.py (revision 3)
@@ -0,0 +1,38 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+
+class classinstancemethod(object):
+    """
+    Acts like a class method when called from a class, like an
+    instance method when called by an instance.  The method should
+    take two arguments, 'self' and 'cls'; one of these will be None
+    depending on how the method was called.
+    """
+
+    def __init__(self, func):
+        self.func = func
+        self.__doc__ = func.__doc__
+
+    def __get__(self, obj, type=None):
+        return _methodwrapper(self.func, obj=obj, type=type)
+
+class _methodwrapper(object):
+
+    def __init__(self, func, obj, type):
+        self.func = func
+        self.obj = obj
+        self.type = type
+
+    def __call__(self, *args, **kw):
+        assert not kw.has_key('self') and not kw.has_key('cls'), (
+            "You cannot use 'self' or 'cls' arguments to a "
+            "classinstancemethod")
+        return self.func(*((self.obj, self.type) + args), **kw)
+
+    def __repr__(self):
+        if self.obj is None:
+            return ('<bound class method %s.%s>'
+                    % (self.type.__name__, self.func.func_name))
+        else:
+            return ('<bound method %s.%s of %r>'
+                    % (self.type.__name__, self.func.func_name, self.obj))
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/ip4.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/ip4.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/ip4.py (revision 3)
@@ -0,0 +1,273 @@
+# -*- coding: iso-8859-15 -*-
+"""IP4 address range set implementation.
+
+Implements an IPv4-range type.
+
+Copyright (C) 2006, Heiko Wundram.
+Released under the MIT-license.
+"""
+
+# Version information
+# -------------------
+
+__author__ = "Heiko Wundram <me@modelnine.org>"
+__version__ = "0.2"
+__revision__ = "3"
+__date__ = "2006-01-20"
+
+
+# Imports
+# -------
+
+import intset
+import socket
+
+
+# IP4Range class
+# --------------
+
+class IP4Range(intset.IntSet):
+    """IP4 address range class with efficient storage of address ranges.
+    Supports all set operations."""
+
+    _MINIP4 = 0
+    _MAXIP4 = (1<<32) - 1
+    _UNITYTRANS = "".join([chr(n) for n in range(256)])
+    _IPREMOVE = "0123456789."
+
+    def __init__(self,*args):
+        """Initialize an ip4range class. The constructor accepts an unlimited
+        number of arguments that may either be tuples in the form (start,stop),
+        integers, longs or strings, where start and stop in a tuple may
+        also be of the form integer, long or string.
+
+        Passing an integer or long means passing an IPv4-address that's already
+        been converted to integer notation, whereas passing a string specifies
+        an address where this conversion still has to be done. A string
+        address may be in the following formats:
+
+        - 1.2.3.4    - a plain address, interpreted as a single address
+        - 1.2.3      - a set of addresses, interpreted as 1.2.3.0-1.2.3.255
+        - localhost  - hostname to look up, interpreted as single address
+        - 1.2.3<->5  - a set of addresses, interpreted as 1.2.3.0-1.2.5.255
+        - 1.2.0.0/16 - a set of addresses, interpreted as 1.2.0.0-1.2.255.255
+
+        Only the first three notations are valid if you use a string address in
+        a tuple, whereby notation 2 is interpreted as 1.2.3.0 if specified as
+        lower bound and 1.2.3.255 if specified as upper bound, not as a range
+        of addresses.
+
+        Specifying a range is done with the <-> operator. This is necessary
+        because '-' might be present in a hostname. '<->' shouldn't be, ever.
+        """
+
+        # Special case copy constructor.
+        if len(args) == 1 and isinstance(args[0],IP4Range):
+            super(IP4Range,self).__init__(args[0])
+            return
+
+        # Convert arguments to tuple syntax.
+        args = list(args)
+        for i in range(len(args)):
+            argval = args[i]
+            if isinstance(argval,str):
+                if "<->" in argval:
+                    # Type 4 address.
+                    args[i] = self._parseRange(*argval.split("<->",1))
+                    continue
+                elif "/" in argval:
+                    # Type 5 address.
+                    args[i] = self._parseMask(*argval.split("/",1))
+                else:
+                    # Type 1, 2 or 3.
+                    args[i] = self._parseAddrRange(argval)
+            elif isinstance(argval,tuple):
+                if len(tuple) <> 2:
+                    raise ValueError("Tuple is of invalid length.")
+                addr1, addr2 = argval
+                if isinstance(addr1,str):
+                    addr1 = self._parseAddrRange(addr1)[0]
+                elif not isinstance(addr1,(int,long)):
+                    raise TypeError("Invalid argument.")
+                if isinstance(addr2,str):
+                    addr2 = self._parseAddrRange(addr2)[1]
+                elif not isinstance(addr2,(int,long)):
+                    raise TypeError("Invalid argument.")
+                args[i] = (addr1,addr2)
+            elif not isinstance(argval,(int,long)):
+                raise TypeError("Invalid argument.")
+
+        # Initialize the integer set.
+        super(IP4Range,self).__init__(min=self._MINIP4,max=self._MAXIP4,*args)
+
+    # Parsing functions
+    # -----------------
+
+    def _parseRange(self,addr1,addr2):
+        naddr1, naddr1len = _parseAddr(addr1)
+        naddr2, naddr2len = _parseAddr(addr2)
+        if naddr2len < naddr1len:
+            naddr2 += naddr1&(((1<<((naddr1len-naddr2len)*8))-1)<<
+                              (naddr2len*8))
+            naddr2len = naddr1len
+        elif naddr2len > naddr1len:
+            raise ValueError("Range has more dots than address.")
+        naddr1 <<= (4-naddr1len)*8
+        naddr2 <<= (4-naddr2len)*8
+        naddr2 += (1<<((4-naddr2len)*8))-1
+        return (naddr1,naddr2)
+
+    def _parseMask(self,addr,mask):
+        naddr, naddrlen = _parseAddr(addr)
+        naddr <<= (4-naddrlen)*8
+        try:
+            if not mask:
+                masklen = 0
+            else:
+                masklen = int(mask)
+            if not 0 <= masklen <= 32:
+                raise ValueError
+        except ValueError:
+            try:
+                mask = _parseAddr(mask,False)
+            except ValueError:
+                raise ValueError("Mask isn't parseable.")
+            remaining = 0
+            masklen = 0
+            if not mask:
+                masklen = 0
+            else:
+                while not (mask&1):
+                    remaining += 1
+                while (mask&1):
+                    mask >>= 1
+                    masklen += 1
+                if remaining+masklen <> 32:
+                    raise ValueError("Mask isn't a proper host mask.")
+        naddr1 = naddr & (((1<<masklen)-1)<<(32-masklen))
+        naddr2 = naddr1 + (1<<(32-masklen)) - 1
+        return (naddr1,naddr2)
+
+    def _parseAddrRange(self,addr):
+        naddr, naddrlen = _parseAddr(addr)
+        naddr1 = naddr<<((4-naddrlen)*8)
+        naddr2 = ( (naddr<<((4-naddrlen)*8)) +
+                   (1<<((4-naddrlen)*8)) - 1 )
+        return (naddr1,naddr2)
+
+    # Utility functions
+    # -----------------
+
+    def _int2ip(self,num):
+        rv = []
+        for i in range(4):
+            rv.append(str(num&255))
+            num >>= 8
+        return ".".join(reversed(rv))
+
+    # Iterating
+    # ---------
+
+    def iteraddresses(self):
+        """Returns an iterator which iterates over ips in this iprange. An
+        IP is returned in string form (e.g. '1.2.3.4')."""
+
+        for v in super(IP4Range,self).__iter__():
+            yield self._int2ip(v)
+
+    def iterranges(self):
+        """Returns an iterator which iterates over ip-ip ranges which build
+        this iprange if combined. An ip-ip pair is returned in string form
+        (e.g. '1.2.3.4-2.3.4.5')."""
+
+        for r in self._ranges:
+            if r[1]-r[0] == 1:
+                yield self._int2ip(r[0])
+            else:
+                yield '%s-%s' % (self._int2ip(r[0]),self._int2ip(r[1]-1))
+
+    def itermasks(self):
+        """Returns an iterator which iterates over ip/mask pairs which build
+        this iprange if combined. An IP/Mask pair is returned in string form
+        (e.g. '1.2.3.0/24')."""
+
+        for r in self._ranges:
+            for v in self._itermasks(r):
+                yield v
+
+    def _itermasks(self,r):
+        ranges = [r]
+        while ranges:
+            cur = ranges.pop()
+            curmask = 0
+            while True:
+                curmasklen = 1<<(32-curmask)
+                start = (cur[0]+curmasklen-1)&(((1<<curmask)-1)<<(32-curmask))
+                if start >= cur[0] and start+curmasklen <= cur[1]:
+                    break
+                else:
+                    curmask += 1
+            yield "%s/%s" % (self._int2ip(start),curmask)
+            if cur[0] < start:
+                ranges.append((cur[0],start))
+            if cur[1] > start+curmasklen:
+                ranges.append((start+curmasklen,cur[1]))
+
+    __iter__ = iteraddresses
+
+    # Printing
+    # --------
+
+    def __repr__(self):
+        """Returns a string which can be used to reconstruct this iprange."""
+
+        rv = []
+        for start, stop in self._ranges:
+            if stop-start == 1:
+                rv.append("%r" % (self._int2ip(start),))
+            else:
+                rv.append("(%r,%r)" % (self._int2ip(start),
+                                       self._int2ip(stop-1)))
+        return "%s(%s)" % (self.__class__.__name__,",".join(rv))
+
+def _parseAddr(addr,lookup=True):
+    if lookup and addr.translate(IP4Range._UNITYTRANS, IP4Range._IPREMOVE):
+        try:
+            addr = socket.gethostbyname(addr)
+        except socket.error:
+            raise ValueError("Invalid Hostname as argument.")
+    naddr = 0
+    for naddrpos, part in enumerate(addr.split(".")):
+        if naddrpos >= 4:
+            raise ValueError("Address contains more than four parts.")
+        try:
+            if not part:
+                part = 0
+            else:
+                part = int(part)
+            if not 0 <= part < 256:
+                raise ValueError
+        except ValueError:
+            raise ValueError("Address part out of range.")
+        naddr <<= 8
+        naddr += part
+    return naddr, naddrpos+1
+
+def ip2int(addr, lookup=True):
+    return _parseAddr(addr, lookup=lookup)[0]
+
+if __name__ == "__main__":
+    # Little test script.
+    x = IP4Range("172.22.162.250/24")
+    y = IP4Range("172.22.162.250","172.22.163.250","172.22.163.253<->255")
+    print x
+    for val in x.itermasks():
+        print val
+    for val in y.itermasks():
+        print val
+    for val in (x|y).itermasks():
+        print val
+    for val in (x^y).iterranges():
+        print val
+    for val in x:
+        print val
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/findpackage.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/findpackage.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/findpackage.py (revision 3)
@@ -0,0 +1,26 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+
+import sys
+import os
+
+def find_package(dir):
+    """
+    Given a directory, finds the equivalent package name.  If it
+    is directly in sys.path, returns ''.
+    """
+    dir = os.path.abspath(dir)
+    orig_dir = dir
+    path = map(os.path.abspath, sys.path)
+    packages = []
+    last_dir = None
+    while 1:
+        if dir in path:
+            return '.'.join(packages)
+        packages.insert(0, os.path.basename(dir))
+        dir = os.path.dirname(dir)
+        if last_dir == dir:
+            raise ValueError(
+                "%s is not under any path found in sys.path" % orig_dir)
+        last_dir = dir
+    
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/threadedprint.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/threadedprint.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/threadedprint.py (revision 3)
@@ -0,0 +1,232 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+
+"""
+threadedprint.py
+================
+
+:author: Ian Bicking
+:date: 12 Jul 2004
+
+Multi-threaded printing; allows the output produced via print to be
+separated according to the thread.
+
+To use this, you must install the catcher, like::
+
+    threadedprint.install()
+
+The installation optionally takes one of three parameters:
+
+default
+    The default destination for print statements (e.g., ``sys.stdout``).
+factory
+    A function that will produce the stream for a thread, given the
+    thread's name.
+paramwriter
+    Instead of writing to a file-like stream, this function will be
+    called like ``paramwriter(thread_name, text)`` for every write.
+
+The thread name is the value returned by
+``threading.currentThread().getName()``, a string (typically something
+like Thread-N).
+
+You can also submit file-like objects for specific threads, which will
+override any of these parameters.  To do this, call ``register(stream,
+[threadName])``.  ``threadName`` is optional, and if not provided the
+stream will be registered for the current thread.
+
+If no specific stream is registered for a thread, and no default has
+been provided, then an error will occur when anything is written to
+``sys.stdout`` (or printed).
+
+Note: the stream's ``write`` method will be called in the thread the
+text came from, so you should consider thread safety, especially if
+multiple threads share the same writer.
+
+Note: if you want access to the original standard out, use
+``sys.__stdout__``.
+
+You may also uninstall this, via::
+
+    threadedprint.uninstall()
+
+TODO
+----
+
+* Something with ``sys.stderr``.
+* Some default handlers.  Maybe something that hooks into `logging`.
+* Possibly cache the results of ``factory`` calls.  This would be a
+  semantic change.
+
+"""
+
+import threading
+import sys
+from paste.util import filemixin
+
+class PrintCatcher(filemixin.FileMixin):
+
+    def __init__(self, default=None, factory=None, paramwriter=None,
+                 leave_stdout=False):
+        assert len(filter(lambda x: x is not None,
+                          [default, factory, paramwriter])) <= 1, (
+            "You can only provide one of default, factory, or paramwriter")
+        if leave_stdout:
+            assert not default, (
+                "You cannot pass in both default (%r) and "
+                "leave_stdout=True" % default)
+            default = sys.stdout
+        if default:
+            self._defaultfunc = self._writedefault
+        elif factory:
+            self._defaultfunc = self._writefactory
+        elif paramwriter:
+            self._defaultfunc = self._writeparam
+        else:
+            self._defaultfunc = self._writeerror
+        self._default = default
+        self._factory = factory
+        self._paramwriter = paramwriter
+        self._catchers = {}
+
+    def write(self, v, currentThread=threading.currentThread):
+        name = currentThread().getName()
+        catchers = self._catchers
+        if not catchers.has_key(name):
+            self._defaultfunc(name, v)
+        else:
+            catcher = catchers[name]
+            catcher.write(v)
+
+    def _writedefault(self, name, v):
+        self._default.write(v)
+
+    def _writefactory(self, name, v):
+        self._factory(name).write(v)
+
+    def _writeparam(self, name, v):
+        self._paramwriter(name, v)
+
+    def _writeerror(self, name, v):
+        assert False, (
+            "There is no PrintCatcher output stream for the thread %r"
+            % name)
+
+    def register(self, catcher, name=None,
+                 currentThread=threading.currentThread):
+        if name is None:
+            name = currentThread().getName()
+        self._catchers[name] = catcher
+
+    def deregister(self, name=None,
+                   currentThread=threading.currentThread):
+        if name is None:
+            name = currentThread().getName()
+        assert self._catchers.has_key(name), (
+            "There is no PrintCatcher catcher for the thread %r" % name)
+        del self._catchers[name]
+
+_printcatcher = None
+_oldstdout = None
+
+def install(**kw):
+    global _printcatcher, _oldstdout, register, deregister
+    if not _printcatcher:
+        _oldstdout = sys.stdout
+        _printcatcher = sys.stdout = PrintCatcher(**kw)
+        register = _printcatcher.register
+        deregister = _printcatcher.deregister
+
+def uninstall():
+    global _printcatcher, _oldstdout, register, deregister
+    if _printcatcher:
+        sys.stdout = _oldstdout
+        _printcatcher = _oldstdout = None
+        register = not_installed_error
+        deregister = not_installed_error
+
+def not_installed_error(*args, **kw):
+    assert False, (
+        "threadedprint has not yet been installed (call "
+        "threadedprint.install())")
+
+register = deregister = not_installed_error
+
+class StdinCatcher(filemixin.FileMixin):
+
+    def __init__(self, default=None, factory=None, paramwriter=None):
+        assert len(filter(lambda x: x is not None,
+                          [default, factory, paramwriter])) <= 1, (
+            "You can only provide one of default, factory, or paramwriter")
+        if default:
+            self._defaultfunc = self._readdefault
+        elif factory:
+            self._defaultfunc = self._readfactory
+        elif paramwriter:
+            self._defaultfunc = self._readparam
+        else:
+            self._defaultfunc = self._readerror
+        self._default = default
+        self._factory = factory
+        self._paramwriter = paramwriter
+        self._catchers = {}
+
+    def read(self, size=None, currentThread=threading.currentThread):
+        name = currentThread().getName()
+        catchers = self._catchers
+        if not catchers.has_key(name):
+            self._defaultfunc(name, size)
+        else:
+            catcher = catchers[name]
+            catcher.read(size)
+
+    def _readdefault(self, name, size):
+        self._default.read(size)
+
+    def _readfactory(self, name, size):
+        self._factory(name).read(size)
+
+    def _readparam(self, name, size):
+        self._paramreader(name, size)
+
+    def _readerror(self, name, size):
+        assert False, (
+            "There is no StdinCatcher output stream for the thread %r"
+            % name)
+
+    def register(self, catcher, name=None,
+                 currentThread=threading.currentThread):
+        if name is None:
+            name = currentThread.getName()
+        self._catchers[name] = catcher
+
+    def deregister(self, catcher, name=None,
+                   currentThread=threading.currentThread):
+        if name is None:
+            name = currentThread().getName()
+        assert self._catchers.has_key(name), (
+            "There is no StdinCatcher catcher for the thread %r" % name)
+        del self._catchers[name]
+
+_stdincatcher = None
+_oldstdin = None
+
+def install_stdin(**kw):
+    global _stdincatcher, _oldstdin, register_stdin, deregister_stdin
+    if not _stdincatcher:
+        _oldstdin = sys.stdin
+        _stdincatcher = sys.stdin = StdinCatcher(**kw)
+        register_stdin = _stdincatcher.register
+        deregister_stdin = _stdincatcher.deregister
+
+def uninstall():
+    global _stdincatcher, _oldstin, register_stdin, deregister_stdin
+    if _stdincatcher:
+        sys.stdin = _oldstdin
+        _stdincatcher = _oldstdin = None
+        register_stdin = deregister_stdin = not_installed_error_stdin
+
+def not_installed_error_stdin(*args, **kw):
+    assert False, (
+        "threadedprint has not yet been installed for stdin (call "
+        "threadedprint.install_stdin())")
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/multidict.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/multidict.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/multidict.py (revision 3)
@@ -0,0 +1,397 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+import cgi
+import copy
+import sys
+from UserDict import DictMixin
+
+class MultiDict(DictMixin):
+
+    """
+    An ordered dictionary that can have multiple values for each key.
+    Adds the methods getall, getone, mixed, and add to the normal
+    dictionary interface.
+    """
+
+    def __init__(self, *args, **kw):
+        if len(args) > 1:
+            raise TypeError(
+                "MultiDict can only be called with one positional argument")
+        if args:
+            if hasattr(args[0], 'iteritems'):
+                items = list(args[0].iteritems())
+            elif hasattr(args[0], 'items'):
+                items = args[0].items()
+            else:
+                items = list(args[0])
+            self._items = items
+        else:
+            self._items = []
+        self._items.extend(kw.iteritems())
+
+    def __getitem__(self, key):
+        for k, v in self._items:
+            if k == key:
+                return v
+        raise KeyError(repr(key))
+
+    def __setitem__(self, key, value):
+        try:
+            del self[key]
+        except KeyError:
+            pass
+        self._items.append((key, value))
+
+    def add(self, key, value):
+        """
+        Add the key and value, not overwriting any previous value.
+        """
+        self._items.append((key, value))
+
+    def getall(self, key):
+        """
+        Return a list of all values matching the key (may be an empty list)
+        """
+        result = []
+        for k, v in self._items:
+            if key == k:
+                result.append(v)
+        return result
+
+    def getone(self, key):
+        """
+        Get one value matching the key, raising a KeyError if multiple
+        values were found.
+        """
+        v = self.getall(key)
+        if not v:
+            raise KeyError('Key not found: %r' % key)
+        if len(v) > 1:
+            raise KeyError('Multiple values match %r: %r' % (key, v))
+        return v[0]
+
+    def mixed(self):
+        """
+        Returns a dictionary where the values are either single
+        values, or a list of values when a key/value appears more than
+        once in this dictionary.  This is similar to the kind of
+        dictionary often used to represent the variables in a web
+        request.
+        """
+        result = {}
+        multi = {}
+        for key, value in self._items:
+            if key in result:
+                # We do this to not clobber any lists that are
+                # *actual* values in this dictionary:
+                if key in multi:
+                    result[key].append(value)
+                else:
+                    result[key] = [result[key], value]
+                    multi[key] = None
+            else:
+                result[key] = value
+        return result
+
+    def dict_of_lists(self):
+        """
+        Returns a dictionary where each key is associated with a
+        list of values.
+        """
+        result = {}
+        for key, value in self._items:
+            if key in result:
+                result[key].append(value)
+            else:
+                result[key] = [value]
+        return result
+
+    def __delitem__(self, key):
+        items = self._items
+        found = False
+        for i in range(len(items)-1, -1, -1):
+            if items[i][0] == key:
+                del items[i]
+                found = True
+        if not found:
+            raise KeyError(repr(key))
+
+    def __contains__(self, key):
+        for k, v in self._items:
+            if k == key:
+                return True
+        return False
+
+    has_key = __contains__
+
+    def clear(self):
+        self._items = []
+
+    def copy(self):
+        return MultiDict(self)
+
+    def setdefault(self, key, default=None):
+        for k, v in self._items:
+            if key == k:
+                return v
+        self._items.append((key, default))
+        return default
+
+    def pop(self, key, *args):
+        if len(args) > 1:
+            raise TypeError, "pop expected at most 2 arguments, got "\
+                              + repr(1 + len(args))
+        for i in range(len(self._items)):
+            if self._items[i][0] == key:
+                v = self._items[i][1]
+                del self._items[i]
+                return v
+        if args:
+            return args[0]
+        else:
+            raise KeyError(repr(key))
+
+    def popitem(self):
+        return self._items.pop()
+
+    def update(self, other=None, **kwargs):
+        if other is None:
+            pass
+        elif hasattr(other, 'items'):
+            self._items.extend(other.items())
+        elif hasattr(other, 'keys'):
+            for k in other.keys():
+                self._items.append((k, other[k]))
+        else:
+            for k, v in other:
+                self._items.append((k, v))
+        if kwargs:
+            self.update(kwargs)
+
+    def __repr__(self):
+        items = ', '.join(['(%r, %r)' % v for v in self._items])
+        return '%s([%s])' % (self.__class__.__name__, items)
+
+    def __len__(self):
+        return len(self._items)
+
+    ##
+    ## All the iteration:
+    ##
+
+    def keys(self):
+        return [k for k, v in self._items]
+
+    def iterkeys(self):
+        for k, v in self._items:
+            yield k
+
+    __iter__ = iterkeys
+
+    def items(self):
+        return self._items[:]
+
+    def iteritems(self):
+        return iter(self._items)
+
+    def values(self):
+        return [v for k, v in self._items]
+
+    def itervalues(self):
+        for k, v in self._items:
+            yield v
+
+class UnicodeMultiDict(DictMixin):
+    """
+    A MultiDict wrapper that decodes returned values to unicode on the
+    fly. Decoding is not applied to assigned values.
+
+    The key/value contents are assumed to be ``str``/``strs`` or
+    ``str``/``FieldStorages`` (as is returned by the ``paste.request.parse_``
+    functions).
+
+    Can optionally also decode keys when the ``decode_keys`` argument is
+    True.
+
+    ``FieldStorage`` instances are cloned, and the clone's ``filename``
+    variable is decoded. Its ``name`` variable is decoded when ``decode_keys``
+    is enabled.
+
+    """
+    def __init__(self, multi=None, encoding=None, errors='strict',
+                 decode_keys=False):
+        self.multi = multi
+        if encoding is None:
+            encoding = sys.getdefaultencoding()
+        self.encoding = encoding
+        self.errors = errors
+        self.decode_keys = decode_keys
+
+    def _decode_key(self, key):
+        if self.decode_keys:
+            try:
+                key = key.decode(self.encoding, self.errors)
+            except AttributeError:
+                pass
+        return key
+
+    def _decode_value(self, value):
+        """
+        Decode the specified value to unicode. Assumes value is a ``str`` or
+        `FieldStorage`` object.
+
+        ``FieldStorage`` objects are specially handled.
+        """
+        if isinstance(value, cgi.FieldStorage):
+            # decode FieldStorage's field name and filename
+            value = copy.copy(value)
+            if self.decode_keys:
+                value.name = value.name.decode(self.encoding, self.errors)
+            value.filename = value.filename.decode(self.encoding, self.errors)
+        else:
+            try:
+                value = value.decode(self.encoding, self.errors)
+            except AttributeError:
+                pass
+        return value
+
+    def __getitem__(self, key):
+        return self._decode_value(self.multi.__getitem__(key))
+
+    def __setitem__(self, key, value):
+        self.multi.__setitem__(key, value)
+
+    def add(self, key, value):
+        """
+        Add the key and value, not overwriting any previous value.
+        """
+        self.multi.add(key, value)
+
+    def getall(self, key):
+        """
+        Return a list of all values matching the key (may be an empty list)
+        """
+        return [self._decode_value(v) for v in self.multi.getall(key)]
+
+    def getone(self, key):
+        """
+        Get one value matching the key, raising a KeyError if multiple
+        values were found.
+        """
+        return self._decode_value(self.multi.getone(key))
+
+    def mixed(self):
+        """
+        Returns a dictionary where the values are either single
+        values, or a list of values when a key/value appears more than
+        once in this dictionary.  This is similar to the kind of
+        dictionary often used to represent the variables in a web
+        request.
+        """
+        unicode_mixed = {}
+        for key, value in self.multi.mixed().iteritems():
+            if isinstance(value, list):
+                value = [self._decode_value(value) for value in value]
+            else:
+                value = self._decode_value(value)
+            unicode_mixed[self._decode_key(key)] = value
+        return unicode_mixed
+
+    def dict_of_lists(self):
+        """
+        Returns a dictionary where each key is associated with a
+        list of values.
+        """
+        unicode_dict = {}
+        for key, value in self.multi.dict_of_lists().iteritems():
+            value = [self._decode_value(value) for value in value]
+            unicode_dict[self._decode_key(key)] = value
+        return unicode_dict
+
+    def __delitem__(self, key):
+        self.multi.__delitem__(key)
+
+    def __contains__(self, key):
+        return self.multi.__contains__(key)
+
+    has_key = __contains__
+
+    def clear(self):
+        self.multi.clear()
+
+    def copy(self):
+        return UnicodeMultiDict(self.multi.copy(), self.encoding, self.errors)
+
+    def setdefault(self, key, default=None):
+        return self._decode_value(self.multi.setdefault(key, default))
+
+    def pop(self, key, *args):
+        return self._decode_value(self.multi.pop(key, *args))
+
+    def popitem(self):
+        k, v = self.multi.popitem()
+        return (self._decode_key(k), self._decode_value(v))
+
+    def __repr__(self):
+        items = ', '.join(['(%r, %r)' % v for v in self.items()])
+        return '%s([%s])' % (self.__class__.__name__, items)
+
+    def __len__(self):
+        return self.multi.__len__()
+
+    ##
+    ## All the iteration:
+    ##
+
+    def keys(self):
+        return [self._decode_key(k) for k in self.multi.iterkeys()]
+
+    def iterkeys(self):
+        for k in self.multi.iterkeys():
+            yield self._decode_key(k)
+
+    __iter__ = iterkeys
+
+    def items(self):
+        return [(self._decode_key(k), self._decode_value(v)) for \
+                    k, v in self.multi.iteritems()]
+
+    def iteritems(self):
+        for k, v in self.multi.iteritems():
+            yield (self._decode_key(k), self._decode_value(v))
+
+    def values(self):
+        return [self._decode_value(v) for v in self.multi.itervalues()]
+
+    def itervalues(self):
+        for v in self.multi.itervalues():
+            yield self._decode_value(v)
+
+__test__ = {
+    'general': """
+    >>> d = MultiDict(a=1, b=2)
+    >>> d['a']
+    1
+    >>> d.getall('c')
+    []
+    >>> d.add('a', 2)
+    >>> d['a']
+    1
+    >>> d.getall('a')
+    [1, 2]
+    >>> d['b'] = 4
+    >>> d.getall('b')
+    [4]
+    >>> d.keys()
+    ['a', 'a', 'b']
+    >>> d.items()
+    [('a', 1), ('a', 2), ('b', 4)]
+    >>> d.mixed()
+    {'a': [1, 2], 'b': 4}
+    >>> MultiDict([('a', 'b')], c=2)
+    MultiDict([('a', 'b'), ('c', 2)])
+    """}
+
+if __name__ == '__main__':
+    import doctest
+    doctest.testmod()
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/subprocess24.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/subprocess24.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/subprocess24.py (revision 3)
@@ -0,0 +1,1152 @@
+# subprocess - Subprocesses with accessible I/O streams
+#
+# For more information about this module, see PEP 324.
+#
+# This module should remain compatible with Python 2.2, see PEP 291.
+#
+# Copyright (c) 2003-2005 by Peter Astrand <astrand@lysator.liu.se>
+#
+# Licensed to PSF under a Contributor Agreement.
+# See http://www.python.org/2.4/license for licensing details.
+
+r"""subprocess - Subprocesses with accessible I/O streams
+
+This module allows you to spawn processes, connect to their
+input/output/error pipes, and obtain their return codes.  This module
+intends to replace several other, older modules and functions, like:
+
+os.system
+os.spawn*
+os.popen*
+popen2.*
+commands.*
+
+Information about how the subprocess module can be used to replace these
+modules and functions can be found below.
+
+
+
+Using the subprocess module
+===========================
+This module defines one class called Popen:
+
+class Popen(args, bufsize=0, executable=None,
+            stdin=None, stdout=None, stderr=None,
+            preexec_fn=None, close_fds=False, shell=False,
+            cwd=None, env=None, universal_newlines=False,
+            startupinfo=None, creationflags=0):
+
+
+Arguments are:
+
+args should be a string, or a sequence of program arguments.  The
+program to execute is normally the first item in the args sequence or
+string, but can be explicitly set by using the executable argument.
+
+On UNIX, with shell=False (default): In this case, the Popen class
+uses os.execvp() to execute the child program.  args should normally
+be a sequence.  A string will be treated as a sequence with the string
+as the only item (the program to execute).
+
+On UNIX, with shell=True: If args is a string, it specifies the
+command string to execute through the shell.  If args is a sequence,
+the first item specifies the command string, and any additional items
+will be treated as additional shell arguments.
+
+On Windows: the Popen class uses CreateProcess() to execute the child
+program, which operates on strings.  If args is a sequence, it will be
+converted to a string using the list2cmdline method.  Please note that
+not all MS Windows applications interpret the command line the same
+way: The list2cmdline is designed for applications using the same
+rules as the MS C runtime.
+
+bufsize, if given, has the same meaning as the corresponding argument
+to the built-in open() function: 0 means unbuffered, 1 means line
+buffered, any other positive value means use a buffer of
+(approximately) that size.  A negative bufsize means to use the system
+default, which usually means fully buffered.  The default value for
+bufsize is 0 (unbuffered).
+
+stdin, stdout and stderr specify the executed programs' standard
+input, standard output and standard error file handles, respectively.
+Valid values are PIPE, an existing file descriptor (a positive
+integer), an existing file object, and None.  PIPE indicates that a
+new pipe to the child should be created.  With None, no redirection
+will occur; the child's file handles will be inherited from the
+parent.  Additionally, stderr can be STDOUT, which indicates that the
+stderr data from the applications should be captured into the same
+file handle as for stdout.
+
+If preexec_fn is set to a callable object, this object will be called
+in the child process just before the child is executed.
+
+If close_fds is true, all file descriptors except 0, 1 and 2 will be
+closed before the child process is executed.
+
+if shell is true, the specified command will be executed through the
+shell.
+
+If cwd is not None, the current directory will be changed to cwd
+before the child is executed.
+
+If env is not None, it defines the environment variables for the new
+process.
+
+If universal_newlines is true, the file objects stdout and stderr are
+opened as a text files, but lines may be terminated by any of '\n',
+the Unix end-of-line convention, '\r', the Macintosh convention or
+'\r\n', the Windows convention.  All of these external representations
+are seen as '\n' by the Python program.  Note: This feature is only
+available if Python is built with universal newline support (the
+default).  Also, the newlines attribute of the file objects stdout,
+stdin and stderr are not updated by the communicate() method.
+
+The startupinfo and creationflags, if given, will be passed to the
+underlying CreateProcess() function.  They can specify things such as
+appearance of the main window and priority for the new process.
+(Windows only)
+
+
+This module also defines two shortcut functions:
+
+call(*args, **kwargs):
+    Run command with arguments.  Wait for command to complete, then
+    return the returncode attribute. The arguments are the same as for
+    the Popen constructor.  Example:
+
+    retcode = call(["ls", "-l"])
+
+
+Exceptions
+----------
+Exceptions raised in the child process, before the new program has
+started to execute, will be re-raised in the parent.  Additionally,
+the exception object will have one extra attribute called
+'child_traceback', which is a string containing traceback information
+from the childs point of view.
+
+The most common exception raised is OSError.  This occurs, for
+example, when trying to execute a non-existent file.  Applications
+should prepare for OSErrors.
+
+A ValueError will be raised if Popen is called with invalid arguments.
+
+
+Security
+--------
+Unlike some other popen functions, this implementation will never call
+/bin/sh implicitly.  This means that all characters, including shell
+metacharacters, can safely be passed to child processes.
+
+
+Popen objects
+=============
+Instances of the Popen class have the following methods:
+
+poll()
+    Check if child process has terminated.  Returns returncode
+    attribute.
+
+wait()
+    Wait for child process to terminate.  Returns returncode attribute.
+
+communicate(input=None)
+    Interact with process: Send data to stdin.  Read data from stdout
+    and stderr, until end-of-file is reached.  Wait for process to
+    terminate.  The optional stdin argument should be a string to be
+    sent to the child process, or None, if no data should be sent to
+    the child.
+
+    communicate() returns a tuple (stdout, stderr).
+
+    Note: The data read is buffered in memory, so do not use this
+    method if the data size is large or unlimited.
+
+The following attributes are also available:
+
+stdin
+    If the stdin argument is PIPE, this attribute is a file object
+    that provides input to the child process.  Otherwise, it is None.
+
+stdout
+    If the stdout argument is PIPE, this attribute is a file object
+    that provides output from the child process.  Otherwise, it is
+    None.
+
+stderr
+    If the stderr argument is PIPE, this attribute is file object that
+    provides error output from the child process.  Otherwise, it is
+    None.
+
+pid
+    The process ID of the child process.
+
+returncode
+    The child return code.  A None value indicates that the process
+    hasn't terminated yet.  A negative value -N indicates that the
+    child was terminated by signal N (UNIX only).
+
+
+Replacing older functions with the subprocess module
+====================================================
+In this section, "a ==> b" means that b can be used as a replacement
+for a.
+
+Note: All functions in this section fail (more or less) silently if
+the executed program cannot be found; this module raises an OSError
+exception.
+
+In the following examples, we assume that the subprocess module is
+imported with "from subprocess import *".
+
+
+Replacing /bin/sh shell backquote
+---------------------------------
+output=`mycmd myarg`
+==>
+output = Popen(["mycmd", "myarg"], stdout=PIPE).communicate()[0]
+
+
+Replacing shell pipe line
+-------------------------
+output=`dmesg | grep hda`
+==>
+p1 = Popen(["dmesg"], stdout=PIPE)
+p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
+output = p2.communicate()[0]
+
+
+Replacing os.system()
+---------------------
+sts = os.system("mycmd" + " myarg")
+==>
+p = Popen("mycmd" + " myarg", shell=True)
+sts = os.waitpid(p.pid, 0)
+
+Note:
+
+* Calling the program through the shell is usually not required.
+
+* It's easier to look at the returncode attribute than the
+  exitstatus.
+
+A more real-world example would look like this:
+
+try:
+    retcode = call("mycmd" + " myarg", shell=True)
+    if retcode < 0:
+        print >>sys.stderr, "Child was terminated by signal", -retcode
+    else:
+        print >>sys.stderr, "Child returned", retcode
+except OSError, e:
+    print >>sys.stderr, "Execution failed:", e
+
+
+Replacing os.spawn*
+-------------------
+P_NOWAIT example:
+
+pid = os.spawnlp(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg")
+==>
+pid = Popen(["/bin/mycmd", "myarg"]).pid
+
+
+P_WAIT example:
+
+retcode = os.spawnlp(os.P_WAIT, "/bin/mycmd", "mycmd", "myarg")
+==>
+retcode = call(["/bin/mycmd", "myarg"])
+
+
+Vector example:
+
+os.spawnvp(os.P_NOWAIT, path, args)
+==>
+Popen([path] + args[1:])
+
+
+Environment example:
+
+os.spawnlpe(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg", env)
+==>
+Popen(["/bin/mycmd", "myarg"], env={"PATH": "/usr/bin"})
+
+
+Replacing os.popen*
+-------------------
+pipe = os.popen(cmd, mode='r', bufsize)
+==>
+pipe = Popen(cmd, shell=True, bufsize=bufsize, stdout=PIPE).stdout
+
+pipe = os.popen(cmd, mode='w', bufsize)
+==>
+pipe = Popen(cmd, shell=True, bufsize=bufsize, stdin=PIPE).stdin
+
+
+(child_stdin, child_stdout) = os.popen2(cmd, mode, bufsize)
+==>
+p = Popen(cmd, shell=True, bufsize=bufsize,
+          stdin=PIPE, stdout=PIPE, close_fds=True)
+(child_stdin, child_stdout) = (p.stdin, p.stdout)
+
+
+(child_stdin,
+ child_stdout,
+ child_stderr) = os.popen3(cmd, mode, bufsize)
+==>
+p = Popen(cmd, shell=True, bufsize=bufsize,
+          stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True)
+(child_stdin,
+ child_stdout,
+ child_stderr) = (p.stdin, p.stdout, p.stderr)
+
+
+(child_stdin, child_stdout_and_stderr) = os.popen4(cmd, mode, bufsize)
+==>
+p = Popen(cmd, shell=True, bufsize=bufsize,
+          stdin=PIPE, stdout=PIPE, stderr=STDOUT, close_fds=True)
+(child_stdin, child_stdout_and_stderr) = (p.stdin, p.stdout)
+
+
+Replacing popen2.*
+------------------
+Note: If the cmd argument to popen2 functions is a string, the command
+is executed through /bin/sh.  If it is a list, the command is directly
+executed.
+
+(child_stdout, child_stdin) = popen2.popen2("somestring", bufsize, mode)
+==>
+p = Popen(["somestring"], shell=True, bufsize=bufsize
+          stdin=PIPE, stdout=PIPE, close_fds=True)
+(child_stdout, child_stdin) = (p.stdout, p.stdin)
+
+
+(child_stdout, child_stdin) = popen2.popen2(["mycmd", "myarg"], bufsize, mode)
+==>
+p = Popen(["mycmd", "myarg"], bufsize=bufsize,
+          stdin=PIPE, stdout=PIPE, close_fds=True)
+(child_stdout, child_stdin) = (p.stdout, p.stdin)
+
+The popen2.Popen3 and popen3.Popen4 basically works as subprocess.Popen,
+except that:
+
+* subprocess.Popen raises an exception if the execution fails
+* the capturestderr argument is replaced with the stderr argument.
+* stdin=PIPE and stdout=PIPE must be specified.
+* popen2 closes all filedescriptors by default, but you have to specify
+  close_fds=True with subprocess.Popen.
+
+
+"""
+
+import sys
+mswindows = (sys.platform == "win32")
+
+import os
+import types
+import traceback
+
+if mswindows:
+    import threading
+    import msvcrt
+    ## @@: Changed in Paste
+    ## Since this module is only used on pre-python-2.4 systems, they probably
+    ## don't have _subprocess installed, but hopefully have the win32 stuff
+    ## installed.
+    if 1: # <-- change this to use pywin32 instead of the _subprocess driver
+        import pywintypes
+        from win32api import GetStdHandle, STD_INPUT_HANDLE, \
+                             STD_OUTPUT_HANDLE, STD_ERROR_HANDLE
+        from win32api import GetCurrentProcess, DuplicateHandle, \
+                             GetModuleFileName, GetVersion
+        from win32con import DUPLICATE_SAME_ACCESS, SW_HIDE
+        from win32pipe import CreatePipe
+        from win32process import CreateProcess, STARTUPINFO, \
+                                 GetExitCodeProcess, STARTF_USESTDHANDLES, \
+                                 STARTF_USESHOWWINDOW, CREATE_NEW_CONSOLE
+        from win32event import WaitForSingleObject, INFINITE, WAIT_OBJECT_0
+    else:
+        from _subprocess import *
+        class STARTUPINFO:
+            dwFlags = 0
+            hStdInput = None
+            hStdOutput = None
+            hStdError = None
+        class pywintypes:
+            error = IOError
+else:
+    import select
+    import errno
+    import fcntl
+    import pickle
+
+__all__ = ["Popen", "PIPE", "STDOUT", "call"]
+
+try:
+    MAXFD = os.sysconf("SC_OPEN_MAX")
+except:
+    MAXFD = 256
+
+# True/False does not exist on 2.2.0
+try:
+    False
+except NameError:
+    False = 0
+    True = 1
+
+_active = []
+
+def _cleanup():
+    for inst in _active[:]:
+        inst.poll()
+
+PIPE = -1
+STDOUT = -2
+
+
+def call(*args, **kwargs):
+    """Run command with arguments.  Wait for command to complete, then
+    return the returncode attribute.
+
+    The arguments are the same as for the Popen constructor.  Example:
+
+    retcode = call(["ls", "-l"])
+    """
+    return Popen(*args, **kwargs).wait()
+
+
+def list2cmdline(seq):
+    """
+    Translate a sequence of arguments into a command line
+    string, using the same rules as the MS C runtime:
+
+    1) Arguments are delimited by white space, which is either a
+       space or a tab.
+
+    2) A string surrounded by double quotation marks is
+       interpreted as a single argument, regardless of white space
+       contained within.  A quoted string can be embedded in an
+       argument.
+
+    3) A double quotation mark preceded by a backslash is
+       interpreted as a literal double quotation mark.
+
+    4) Backslashes are interpreted literally, unless they
+       immediately precede a double quotation mark.
+
+    5) If backslashes immediately precede a double quotation mark,
+       every pair of backslashes is interpreted as a literal
+       backslash.  If the number of backslashes is odd, the last
+       backslash escapes the next double quotation mark as
+       described in rule 3.
+    """
+
+    # See
+    # http://msdn.microsoft.com/library/en-us/vccelng/htm/progs_12.asp
+    result = []
+    needquote = False
+    for arg in seq:
+        bs_buf = []
+
+        # Add a space to separate this argument from the others
+        if result:
+            result.append(' ')
+
+        needquote = (" " in arg) or ("\t" in arg)
+        if needquote:
+            result.append('"')
+
+        for c in arg:
+            if c == '\\':
+                # Don't know if we need to double yet.
+                bs_buf.append(c)
+            elif c == '"':
+                # Double backspaces.
+                result.append('\\' * len(bs_buf)*2)
+                bs_buf = []
+                result.append('\\"')
+            else:
+                # Normal char
+                if bs_buf:
+                    result.extend(bs_buf)
+                    bs_buf = []
+                result.append(c)
+
+        # Add remaining backspaces, if any.
+        if bs_buf:
+            result.extend(bs_buf)
+
+        if needquote:
+            result.extend(bs_buf)
+            result.append('"')
+
+    return ''.join(result)
+
+
+class Popen(object):
+    def __init__(self, args, bufsize=0, executable=None,
+                 stdin=None, stdout=None, stderr=None,
+                 preexec_fn=None, close_fds=False, shell=False,
+                 cwd=None, env=None, universal_newlines=False,
+                 startupinfo=None, creationflags=0):
+        """Create new Popen instance."""
+        _cleanup()
+
+        if not isinstance(bufsize, (int, long)):
+            raise TypeError("bufsize must be an integer")
+
+        if mswindows:
+            if preexec_fn is not None:
+                raise ValueError("preexec_fn is not supported on Windows "
+                                 "platforms")
+            if close_fds:
+                raise ValueError("close_fds is not supported on Windows "
+                                 "platforms")
+        else:
+            # POSIX
+            if startupinfo is not None:
+                raise ValueError("startupinfo is only supported on Windows "
+                                 "platforms")
+            if creationflags != 0:
+                raise ValueError("creationflags is only supported on Windows "
+                                 "platforms")
+
+        self.stdin = None
+        self.stdout = None
+        self.stderr = None
+        self.pid = None
+        self.returncode = None
+        self.universal_newlines = universal_newlines
+
+        # Input and output objects. The general principle is like
+        # this:
+        #
+        # Parent                   Child
+        # ------                   -----
+        # p2cwrite   ---stdin--->  p2cread
+        # c2pread    <--stdout---  c2pwrite
+        # errread    <--stderr---  errwrite
+        #
+        # On POSIX, the child objects are file descriptors.  On
+        # Windows, these are Windows file handles.  The parent objects
+        # are file descriptors on both platforms.  The parent objects
+        # are None when not using PIPEs. The child objects are None
+        # when not redirecting.
+
+        (p2cread, p2cwrite,
+         c2pread, c2pwrite,
+         errread, errwrite) = self._get_handles(stdin, stdout, stderr)
+
+        self._execute_child(args, executable, preexec_fn, close_fds,
+                            cwd, env, universal_newlines,
+                            startupinfo, creationflags, shell,
+                            p2cread, p2cwrite,
+                            c2pread, c2pwrite,
+                            errread, errwrite)
+
+        if p2cwrite:
+            self.stdin = os.fdopen(p2cwrite, 'wb', bufsize)
+        if c2pread:
+            if universal_newlines:
+                self.stdout = os.fdopen(c2pread, 'rU', bufsize)
+            else:
+                self.stdout = os.fdopen(c2pread, 'rb', bufsize)
+        if errread:
+            if universal_newlines:
+                self.stderr = os.fdopen(errread, 'rU', bufsize)
+            else:
+                self.stderr = os.fdopen(errread, 'rb', bufsize)
+
+        _active.append(self)
+
+
+    def _translate_newlines(self, data):
+        data = data.replace("\r\n", "\n")
+        data = data.replace("\r", "\n")
+        return data
+
+
+    if mswindows:
+        #
+        # Windows methods
+        #
+        def _get_handles(self, stdin, stdout, stderr):
+            """Construct and return tupel with IO objects:
+            p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite
+            """
+            if stdin == None and stdout == None and stderr == None:
+                return (None, None, None, None, None, None)
+
+            p2cread, p2cwrite = None, None
+            c2pread, c2pwrite = None, None
+            errread, errwrite = None, None
+
+            if stdin == None:
+                p2cread = GetStdHandle(STD_INPUT_HANDLE)
+            elif stdin == PIPE:
+                p2cread, p2cwrite = CreatePipe(None, 0)
+                # Detach and turn into fd
+                p2cwrite = p2cwrite.Detach()
+                p2cwrite = msvcrt.open_osfhandle(p2cwrite, 0)
+            elif type(stdin) == types.IntType:
+                p2cread = msvcrt.get_osfhandle(stdin)
+            else:
+                # Assuming file-like object
+                p2cread = msvcrt.get_osfhandle(stdin.fileno())
+            p2cread = self._make_inheritable(p2cread)
+
+            if stdout == None:
+                c2pwrite = GetStdHandle(STD_OUTPUT_HANDLE)
+            elif stdout == PIPE:
+                c2pread, c2pwrite = CreatePipe(None, 0)
+                # Detach and turn into fd
+                c2pread = c2pread.Detach()
+                c2pread = msvcrt.open_osfhandle(c2pread, 0)
+            elif type(stdout) == types.IntType:
+                c2pwrite = msvcrt.get_osfhandle(stdout)
+            else:
+                # Assuming file-like object
+                c2pwrite = msvcrt.get_osfhandle(stdout.fileno())
+            c2pwrite = self._make_inheritable(c2pwrite)
+
+            if stderr == None:
+                errwrite = GetStdHandle(STD_ERROR_HANDLE)
+            elif stderr == PIPE:
+                errread, errwrite = CreatePipe(None, 0)
+                # Detach and turn into fd
+                errread = errread.Detach()
+                errread = msvcrt.open_osfhandle(errread, 0)
+            elif stderr == STDOUT:
+                errwrite = c2pwrite
+            elif type(stderr) == types.IntType:
+                errwrite = msvcrt.get_osfhandle(stderr)
+            else:
+                # Assuming file-like object
+                errwrite = msvcrt.get_osfhandle(stderr.fileno())
+            errwrite = self._make_inheritable(errwrite)
+
+            return (p2cread, p2cwrite,
+                    c2pread, c2pwrite,
+                    errread, errwrite)
+
+
+        def _make_inheritable(self, handle):
+            """Return a duplicate of handle, which is inheritable"""
+            return DuplicateHandle(GetCurrentProcess(), handle,
+                                   GetCurrentProcess(), 0, 1,
+                                   DUPLICATE_SAME_ACCESS)
+
+
+        def _find_w9xpopen(self):
+            """Find and return absolut path to w9xpopen.exe"""
+            w9xpopen = os.path.join(os.path.dirname(GetModuleFileName(0)),
+                                    "w9xpopen.exe")
+            if not os.path.exists(w9xpopen):
+                # Eeek - file-not-found - possibly an embedding
+                # situation - see if we can locate it in sys.exec_prefix
+                w9xpopen = os.path.join(os.path.dirname(sys.exec_prefix),
+                                        "w9xpopen.exe")
+                if not os.path.exists(w9xpopen):
+                    raise RuntimeError("Cannot locate w9xpopen.exe, which is "
+                                       "needed for Popen to work with your "
+                                       "shell or platform.")
+            return w9xpopen
+
+
+        def _execute_child(self, args, executable, preexec_fn, close_fds,
+                           cwd, env, universal_newlines,
+                           startupinfo, creationflags, shell,
+                           p2cread, p2cwrite,
+                           c2pread, c2pwrite,
+                           errread, errwrite):
+            """Execute program (MS Windows version)"""
+
+            if not isinstance(args, types.StringTypes):
+                args = list2cmdline(args)
+
+            # Process startup details
+            default_startupinfo = STARTUPINFO()
+            if startupinfo == None:
+                startupinfo = default_startupinfo
+            if not None in (p2cread, c2pwrite, errwrite):
+                startupinfo.dwFlags |= STARTF_USESTDHANDLES
+                startupinfo.hStdInput = p2cread
+                startupinfo.hStdOutput = c2pwrite
+                startupinfo.hStdError = errwrite
+
+            if shell:
+                default_startupinfo.dwFlags |= STARTF_USESHOWWINDOW
+                default_startupinfo.wShowWindow = SW_HIDE
+                comspec = os.environ.get("COMSPEC", "cmd.exe")
+                args = comspec + " /c " + args
+                if (GetVersion() >= 0x80000000L or
+                        os.path.basename(comspec).lower() == "command.com"):
+                    # Win9x, or using command.com on NT. We need to
+                    # use the w9xpopen intermediate program. For more
+                    # information, see KB Q150956
+                    # (http://web.archive.org/web/20011105084002/http://support.microsoft.com/support/kb/articles/Q150/9/56.asp)
+                    w9xpopen = self._find_w9xpopen()
+                    args = '"%s" %s' % (w9xpopen, args)
+                    # Not passing CREATE_NEW_CONSOLE has been known to
+                    # cause random failures on win9x.  Specifically a
+                    # dialog: "Your program accessed mem currently in
+                    # use at xxx" and a hopeful warning about the
+                    # stability of your system.  Cost is Ctrl+C wont
+                    # kill children.
+                    creationflags |= CREATE_NEW_CONSOLE
+
+            # Start the process
+            try:
+                hp, ht, pid, tid = CreateProcess(executable, args,
+                                         # no special security
+                                         None, None,
+                                         # must inherit handles to pass std
+                                         # handles
+                                         1,
+                                         creationflags,
+                                         env,
+                                         cwd,
+                                         startupinfo)
+            except pywintypes.error, e:
+                # Translate pywintypes.error to WindowsError, which is
+                # a subclass of OSError.  FIXME: We should really
+                # translate errno using _sys_errlist (or simliar), but
+                # how can this be done from Python?
+                raise WindowsError(*e.args)
+
+            # Retain the process handle, but close the thread handle
+            self._handle = hp
+            self.pid = pid
+            ht.Close()
+
+            # Child is launched. Close the parent's copy of those pipe
+            # handles that only the child should have open.  You need
+            # to make sure that no handles to the write end of the
+            # output pipe are maintained in this process or else the
+            # pipe will not close when the child process exits and the
+            # ReadFile will hang.
+            if p2cread != None:
+                p2cread.Close()
+            if c2pwrite != None:
+                c2pwrite.Close()
+            if errwrite != None:
+                errwrite.Close()
+
+
+        def poll(self):
+            """Check if child process has terminated.  Returns returncode
+            attribute."""
+            if self.returncode == None:
+                if WaitForSingleObject(self._handle, 0) == WAIT_OBJECT_0:
+                    self.returncode = GetExitCodeProcess(self._handle)
+                    _active.remove(self)
+            return self.returncode
+
+
+        def wait(self):
+            """Wait for child process to terminate.  Returns returncode
+            attribute."""
+            if self.returncode == None:
+                obj = WaitForSingleObject(self._handle, INFINITE)
+                self.returncode = GetExitCodeProcess(self._handle)
+                _active.remove(self)
+            return self.returncode
+
+
+        def _readerthread(self, fh, buffer):
+            buffer.append(fh.read())
+
+
+        def communicate(self, input=None):
+            """Interact with process: Send data to stdin.  Read data from
+            stdout and stderr, until end-of-file is reached.  Wait for
+            process to terminate.  The optional input argument should be a
+            string to be sent to the child process, or None, if no data
+            should be sent to the child.
+
+            communicate() returns a tuple (stdout, stderr)."""
+            stdout = None # Return
+            stderr = None # Return
+
+            if self.stdout:
+                stdout = []
+                stdout_thread = threading.Thread(target=self._readerthread,
+                                                 args=(self.stdout, stdout))
+                stdout_thread.setDaemon(True)
+                stdout_thread.start()
+            if self.stderr:
+                stderr = []
+                stderr_thread = threading.Thread(target=self._readerthread,
+                                                 args=(self.stderr, stderr))
+                stderr_thread.setDaemon(True)
+                stderr_thread.start()
+
+            if self.stdin:
+                if input != None:
+                    self.stdin.write(input)
+                self.stdin.close()
+
+            if self.stdout:
+                stdout_thread.join()
+            if self.stderr:
+                stderr_thread.join()
+
+            # All data exchanged.  Translate lists into strings.
+            if stdout != None:
+                stdout = stdout[0]
+            if stderr != None:
+                stderr = stderr[0]
+
+            # Translate newlines, if requested.  We cannot let the file
+            # object do the translation: It is based on stdio, which is
+            # impossible to combine with select (unless forcing no
+            # buffering).
+            if self.universal_newlines and hasattr(open, 'newlines'):
+                if stdout:
+                    stdout = self._translate_newlines(stdout)
+                if stderr:
+                    stderr = self._translate_newlines(stderr)
+
+            self.wait()
+            return (stdout, stderr)
+
+    else:
+        #
+        # POSIX methods
+        #
+        def _get_handles(self, stdin, stdout, stderr):
+            """Construct and return tupel with IO objects:
+            p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite
+            """
+            p2cread, p2cwrite = None, None
+            c2pread, c2pwrite = None, None
+            errread, errwrite = None, None
+
+            if stdin == None:
+                pass
+            elif stdin == PIPE:
+                p2cread, p2cwrite = os.pipe()
+            elif type(stdin) == types.IntType:
+                p2cread = stdin
+            else:
+                # Assuming file-like object
+                p2cread = stdin.fileno()
+
+            if stdout == None:
+                pass
+            elif stdout == PIPE:
+                c2pread, c2pwrite = os.pipe()
+            elif type(stdout) == types.IntType:
+                c2pwrite = stdout
+            else:
+                # Assuming file-like object
+                c2pwrite = stdout.fileno()
+
+            if stderr == None:
+                pass
+            elif stderr == PIPE:
+                errread, errwrite = os.pipe()
+            elif stderr == STDOUT:
+                errwrite = c2pwrite
+            elif type(stderr) == types.IntType:
+                errwrite = stderr
+            else:
+                # Assuming file-like object
+                errwrite = stderr.fileno()
+
+            return (p2cread, p2cwrite,
+                    c2pread, c2pwrite,
+                    errread, errwrite)
+
+
+        def _set_cloexec_flag(self, fd):
+            try:
+                cloexec_flag = fcntl.FD_CLOEXEC
+            except AttributeError:
+                cloexec_flag = 1
+
+            old = fcntl.fcntl(fd, fcntl.F_GETFD)
+            fcntl.fcntl(fd, fcntl.F_SETFD, old | cloexec_flag)
+
+
+        def _close_fds(self, but):
+            for i in range(3, MAXFD):
+                if i == but:
+                    continue
+                try:
+                    os.close(i)
+                except:
+                    pass
+
+
+        def _execute_child(self, args, executable, preexec_fn, close_fds,
+                           cwd, env, universal_newlines,
+                           startupinfo, creationflags, shell,
+                           p2cread, p2cwrite,
+                           c2pread, c2pwrite,
+                           errread, errwrite):
+            """Execute program (POSIX version)"""
+
+            if isinstance(args, types.StringTypes):
+                args = [args]
+
+            if shell:
+                args = ["/bin/sh", "-c"] + args
+
+            if executable == None:
+                executable = args[0]
+
+            # For transferring possible exec failure from child to parent
+            # The first char specifies the exception type: 0 means
+            # OSError, 1 means some other error.
+            errpipe_read, errpipe_write = os.pipe()
+            self._set_cloexec_flag(errpipe_write)
+
+            self.pid = os.fork()
+            if self.pid == 0:
+                # Child
+                try:
+                    # Close parent's pipe ends
+                    if p2cwrite:
+                        os.close(p2cwrite)
+                    if c2pread:
+                        os.close(c2pread)
+                    if errread:
+                        os.close(errread)
+                    os.close(errpipe_read)
+
+                    # Dup fds for child
+                    if p2cread:
+                        os.dup2(p2cread, 0)
+                    if c2pwrite:
+                        os.dup2(c2pwrite, 1)
+                    if errwrite:
+                        os.dup2(errwrite, 2)
+
+                    # Close pipe fds.  Make sure we doesn't close the same
+                    # fd more than once.
+                    if p2cread:
+                        os.close(p2cread)
+                    if c2pwrite and c2pwrite not in (p2cread,):
+                        os.close(c2pwrite)
+                    if errwrite and errwrite not in (p2cread, c2pwrite):
+                        os.close(errwrite)
+
+                    # Close all other fds, if asked for
+                    if close_fds:
+                        self._close_fds(but=errpipe_write)
+
+                    if cwd != None:
+                        os.chdir(cwd)
+
+                    if preexec_fn:
+                        apply(preexec_fn)
+
+                    if env == None:
+                        os.execvp(executable, args)
+                    else:
+                        os.execvpe(executable, args, env)
+
+                except:
+                    exc_type, exc_value, tb = sys.exc_info()
+                    # Save the traceback and attach it to the exception object
+                    exc_lines = traceback.format_exception(exc_type,
+                                                           exc_value,
+                                                           tb)
+                    exc_value.child_traceback = ''.join(exc_lines)
+                    os.write(errpipe_write, pickle.dumps(exc_value))
+
+                # This exitcode won't be reported to applications, so it
+                # really doesn't matter what we return.
+                os._exit(255)
+
+            # Parent
+            os.close(errpipe_write)
+            if p2cread and p2cwrite:
+                os.close(p2cread)
+            if c2pwrite and c2pread:
+                os.close(c2pwrite)
+            if errwrite and errread:
+                os.close(errwrite)
+
+            # Wait for exec to fail or succeed; possibly raising exception
+            data = os.read(errpipe_read, 1048576) # Exceptions limited to 1 MB
+            os.close(errpipe_read)
+            if data != "":
+                os.waitpid(self.pid, 0)
+                child_exception = pickle.loads(data)
+                raise child_exception
+
+
+        def _handle_exitstatus(self, sts):
+            if os.WIFSIGNALED(sts):
+                self.returncode = -os.WTERMSIG(sts)
+            elif os.WIFEXITED(sts):
+                self.returncode = os.WEXITSTATUS(sts)
+            else:
+                # Should never happen
+                raise RuntimeError("Unknown child exit status!")
+
+            _active.remove(self)
+
+
+        def poll(self):
+            """Check if child process has terminated.  Returns returncode
+            attribute."""
+            if self.returncode == None:
+                try:
+                    pid, sts = os.waitpid(self.pid, os.WNOHANG)
+                    if pid == self.pid:
+                        self._handle_exitstatus(sts)
+                except os.error:
+                    pass
+            return self.returncode
+
+
+        def wait(self):
+            """Wait for child process to terminate.  Returns returncode
+            attribute."""
+            if self.returncode == None:
+                pid, sts = os.waitpid(self.pid, 0)
+                self._handle_exitstatus(sts)
+            return self.returncode
+
+
+        def communicate(self, input=None):
+            """Interact with process: Send data to stdin.  Read data from
+            stdout and stderr, until end-of-file is reached.  Wait for
+            process to terminate.  The optional input argument should be a
+            string to be sent to the child process, or None, if no data
+            should be sent to the child.
+
+            communicate() returns a tuple (stdout, stderr)."""
+            read_set = []
+            write_set = []
+            stdout = None # Return
+            stderr = None # Return
+
+            if self.stdin:
+                # Flush stdio buffer.  This might block, if the user has
+                # been writing to .stdin in an uncontrolled fashion.
+                self.stdin.flush()
+                if input:
+                    write_set.append(self.stdin)
+                else:
+                    self.stdin.close()
+            if self.stdout:
+                read_set.append(self.stdout)
+                stdout = []
+            if self.stderr:
+                read_set.append(self.stderr)
+                stderr = []
+
+            while read_set or write_set:
+                rlist, wlist, xlist = select.select(read_set, write_set, [])
+
+                if self.stdin in wlist:
+                    # When select has indicated that the file is writable,
+                    # we can write up to PIPE_BUF bytes without risk
+                    # blocking.  POSIX defines PIPE_BUF >= 512
+                    bytes_written = os.write(self.stdin.fileno(), input[:512])
+                    input = input[bytes_written:]
+                    if not input:
+                        self.stdin.close()
+                        write_set.remove(self.stdin)
+
+                if self.stdout in rlist:
+                    data = os.read(self.stdout.fileno(), 1024)
+                    if data == "":
+                        self.stdout.close()
+                        read_set.remove(self.stdout)
+                    stdout.append(data)
+
+                if self.stderr in rlist:
+                    data = os.read(self.stderr.fileno(), 1024)
+                    if data == "":
+                        self.stderr.close()
+                        read_set.remove(self.stderr)
+                    stderr.append(data)
+
+            # All data exchanged.  Translate lists into strings.
+            if stdout != None:
+                stdout = ''.join(stdout)
+            if stderr != None:
+                stderr = ''.join(stderr)
+
+            # Translate newlines, if requested.  We cannot let the file
+            # object do the translation: It is based on stdio, which is
+            # impossible to combine with select (unless forcing no
+            # buffering).
+            if self.universal_newlines and hasattr(open, 'newlines'):
+                if stdout:
+                    stdout = self._translate_newlines(stdout)
+                if stderr:
+                    stderr = self._translate_newlines(stderr)
+
+            self.wait()
+            return (stdout, stderr)
+
+
+def _demo_posix():
+    #
+    # Example 1: Simple redirection: Get process list
+    #
+    plist = Popen(["ps"], stdout=PIPE).communicate()[0]
+    print "Process list:"
+    print plist
+
+    #
+    # Example 2: Change uid before executing child
+    #
+    if os.getuid() == 0:
+        p = Popen(["id"], preexec_fn=lambda: os.setuid(100))
+        p.wait()
+
+    #
+    # Example 3: Connecting several subprocesses
+    #
+    print "Looking for 'hda'..."
+    p1 = Popen(["dmesg"], stdout=PIPE)
+    p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
+    print repr(p2.communicate()[0])
+
+    #
+    # Example 4: Catch execution error
+    #
+    print
+    print "Trying a weird file..."
+    try:
+        print Popen(["/this/path/does/not/exist"]).communicate()
+    except OSError, e:
+        if e.errno == errno.ENOENT:
+            print "The file didn't exist.  I thought so..."
+            print "Child traceback:"
+            print e.child_traceback
+        else:
+            print "Error", e.errno
+    else:
+        print >>sys.stderr, "Gosh.  No error."
+
+
+def _demo_windows():
+    #
+    # Example 1: Connecting several subprocesses
+    #
+    print "Looking for 'PROMPT' in set output..."
+    p1 = Popen("set", stdout=PIPE, shell=True)
+    p2 = Popen('find "PROMPT"', stdin=p1.stdout, stdout=PIPE)
+    print repr(p2.communicate()[0])
+
+    #
+    # Example 2: Simple execution of program
+    #
+    print "Executing calc..."
+    p = Popen("calc")
+    p.wait()
+
+
+if __name__ == "__main__":
+    if mswindows:
+        _demo_windows()
+    else:
+        _demo_posix()
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/__init__.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/__init__.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/__init__.py (revision 3)
@@ -0,0 +1,4 @@
+"""
+Package for miscellaneous routines that do not depend on other parts
+of Paste
+"""
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/import_string.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/import_string.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/import_string.py (revision 3)
@@ -0,0 +1,95 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+
+"""
+'imports' a string -- converts a string to a Python object, importing
+any necessary modules and evaluating the expression.  Everything
+before the : in an import expression is the module path; everything
+after is an expression to be evaluated in the namespace of that
+module.
+
+Alternately, if no : is present, then import the modules and get the
+attributes as necessary.  Arbitrary expressions are not allowed in
+that case.
+"""
+
+def eval_import(s):
+    """
+    Import a module, or import an object from a module.
+
+    A module name like ``foo.bar:baz()`` can be used, where
+    ``foo.bar`` is the module, and ``baz()`` is an expression
+    evaluated in the context of that module.  Note this is not safe on
+    arbitrary strings because of the eval.
+    """
+    if ':' not in s:
+        return simple_import(s)
+    module_name, expr = s.split(':', 1)
+    module = import_module(module_name)
+    obj = eval(expr, module.__dict__)
+    return obj
+
+def simple_import(s):
+    """
+    Import a module, or import an object from a module.
+
+    A name like ``foo.bar.baz`` can be a module ``foo.bar.baz`` or a
+    module ``foo.bar`` with an object ``baz`` in it, or a module
+    ``foo`` with an object ``bar`` with an attribute ``baz``.
+    """
+    parts = s.split('.')
+    module = import_module(parts[0])
+    name = parts[0]
+    parts = parts[1:]
+    last_import_error = None
+    while parts:
+        name += '.' + parts[0]
+        try:
+            module = import_module(name)
+            parts = parts[1:]
+        except ImportError, e:
+            last_import_error = e
+            break
+    obj = module
+    while parts:
+        try:
+            obj = getattr(module, parts[0])
+        except AttributeError:
+            raise ImportError(
+                "Cannot find %s in module %r (stopped importing modules with error %s)" % (parts[0], module, last_import_error))
+        parts = parts[1:]
+    return obj
+
+def import_module(s):
+    """
+    Import a module.
+    """
+    mod = __import__(s)
+    parts = s.split('.')
+    for part in parts[1:]:
+        mod = getattr(mod, part)
+    return mod
+
+def try_import_module(module_name):
+    """
+    Imports a module, but catches import errors.  Only catches errors
+    when that module doesn't exist; if that module itself has an
+    import error it will still get raised.  Returns None if the module
+    doesn't exist.
+    """
+    try:
+        return import_module(module_name)
+    except ImportError, e:
+        if not getattr(e, 'args', None):
+            raise
+        desc = e.args[0]
+        if not desc.startswith('No module named '):
+            raise
+        desc = desc[len('No module named '):]
+        # If you import foo.bar.baz, the bad import could be any
+        # of foo.bar.baz, bar.baz, or baz; we'll test them all:
+        parts = module_name.split('.')
+        for i in range(len(parts)):
+            if desc == '.'.join(parts[i:]):
+                return None
+        raise
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/looper.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/looper.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/looper.py (revision 3)
@@ -0,0 +1,152 @@
+"""
+Helper for looping over sequences, particular in templates.
+
+Often in a loop in a template it's handy to know what's next up,
+previously up, if this is the first or last item in the sequence, etc.
+These can be awkward to manage in a normal Python loop, but using the
+looper you can get a better sense of the context.  Use like::
+
+    >>> for loop, item in looper(['a', 'b', 'c']):
+    ...     print loop.number, item
+    ...     if not loop.last:
+    ...         print '---'
+    1 a
+    ---
+    2 b
+    ---
+    3 c
+
+"""
+
+__all__ = ['looper']
+
+class looper(object):
+    """
+    Helper for looping (particularly in templates)
+    
+    Use this like::
+    
+        for loop, item in looper(seq):
+            if loop.first:
+                ...
+    """
+
+    def __init__(self, seq):
+        self.seq = seq
+
+    def __iter__(self):
+        return looper_iter(self.seq)
+
+    def __repr__(self):
+        return '<%s for %r>' % (
+            self.__class__.__name__, self.seq)
+
+class looper_iter(object):
+
+    def __init__(self, seq):
+        self.seq = list(seq)
+        self.pos = 0
+
+    def __iter__(self):
+        return self
+
+    def next(self):
+        if self.pos >= len(self.seq):
+            raise StopIteration
+        result = loop_pos(self.seq, self.pos), self.seq[self.pos]
+        self.pos += 1
+        return result
+
+class loop_pos(object):
+
+    def __init__(self, seq, pos):
+        self.seq = seq
+        self.pos = pos
+
+    def __repr__(self):
+        return '<loop pos=%r at %r>' % (
+            self.seq[pos], pos)
+
+    def index(self):
+        return self.pos
+    index = property(index)
+
+    def number(self):
+        return self.pos + 1
+    number = property(number)
+
+    def item(self):
+        return self.seq[self.pos]
+    item = property(item)
+
+    def next(self):
+        try:
+            return self.seq[self.pos+1]
+        except IndexError:
+            return None
+    next = property(next)
+
+    def previous(self):
+        if self.pos == 0:
+            return None
+        return self.seq[self.pos-1]
+    previous = property(previous)
+
+    def odd(self):
+        return not self.pos % 2
+    odd = property(odd)
+
+    def even(self):
+        return self.pos % 2
+    even = property(even)
+
+    def first(self):
+        return self.pos == 0
+    first = property(first)
+
+    def last(self):
+        return self.pos == len(self.seq)-1
+    last = property(last)
+
+    def length(self):
+        return len(self.seq)
+    length = property(length)
+
+    def first_group(self, getter=None):
+        """
+        Returns true if this item is the start of a new group,
+        where groups mean that some attribute has changed.  The getter
+        can be None (the item itself changes), an attribute name like
+        ``'.attr'``, a function, or a dict key or list index.
+        """
+        if self.first:
+            return True
+        return self._compare_group(self.item, self.previous, getter)
+
+    def last_group(self, getter=None):
+        """
+        Returns true if this item is the end of a new group,
+        where groups mean that some attribute has changed.  The getter
+        can be None (the item itself changes), an attribute name like
+        ``'.attr'``, a function, or a dict key or list index.
+        """
+        if self.last:
+            return True
+        return self._compare_group(self.item, self.next, getter)
+
+    def _compare_group(self, item, other, getter):
+        if getter is None:
+            return item != other
+        elif (isinstance(getter, basestring)
+              and getter.startswith('.')):
+            getter = getter[1:]
+            if getter.endswith('()'):
+                getter = getter[:-2]
+                return getattr(item, getter)() != getattr(other, getter)()
+            else:
+                return getattr(item, getter) != getattr(other, getter)
+        elif callable(getter):
+            return getter(item) != getter(other)
+        else:
+            return item[getter] != other[getter]
+    
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/intset.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/intset.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/intset.py (revision 3)
@@ -0,0 +1,511 @@
+# -*- coding: iso-8859-15 -*-
+"""Immutable integer set type.
+
+Integer set class.
+
+Copyright (C) 2006, Heiko Wundram.
+Released under the MIT license.
+"""
+
+# Version information
+# -------------------
+
+__author__ = "Heiko Wundram <me@modelnine.org>"
+__version__ = "0.2"
+__revision__ = "6"
+__date__ = "2006-01-20"
+
+
+# Utility classes
+# ---------------
+
+class _Infinity(object):
+    """Internal type used to represent infinity values."""
+
+    __slots__ = ["_neg"]
+
+    def __init__(self,neg):
+        self._neg = neg
+
+    def __lt__(self,value):
+        if not isinstance(value,(int,long,_Infinity)):
+            return NotImplemented
+        return ( self._neg and
+                 not ( isinstance(value,_Infinity) and value._neg ) )
+
+    def __le__(self,value):
+        if not isinstance(value,(int,long,_Infinity)):
+            return NotImplemented
+        return self._neg
+
+    def __gt__(self,value):
+        if not isinstance(value,(int,long,_Infinity)):
+            return NotImplemented
+        return not ( self._neg or
+                     ( isinstance(value,_Infinity) and not value._neg ) )
+
+    def __ge__(self,value):
+        if not isinstance(value,(int,long,_Infinity)):
+            return NotImplemented
+        return not self._neg
+
+    def __eq__(self,value):
+        if not isinstance(value,(int,long,_Infinity)):
+            return NotImplemented
+        return isinstance(value,_Infinity) and self._neg == value._neg
+
+    def __ne__(self,value):
+        if not isinstance(value,(int,long,_Infinity)):
+            return NotImplemented
+        return not isinstance(value,_Infinity) or self._neg <> value._neg
+
+    def __repr__(self):
+        return "None"
+
+
+# Constants
+# ---------
+
+_MININF = _Infinity(True)
+_MAXINF = _Infinity(False)
+
+
+# Integer set class
+# -----------------
+
+class IntSet(object):
+    """Integer set class with efficient storage in a RLE format of ranges.
+    Supports minus and plus infinity in the range."""
+
+    __slots__ = ["_ranges","_min","_max","_hash"]
+
+    def __init__(self,*args,**kwargs):
+        """Initialize an integer set. The constructor accepts an unlimited
+        number of arguments that may either be tuples in the form of
+        (start,stop) where either start or stop may be a number or None to
+        represent maximum/minimum in that direction. The range specified by
+        (start,stop) is always inclusive (differing from the builtin range
+        operator).
+
+        Keyword arguments that can be passed to an integer set are min and
+        max, which specify the minimum and maximum number in the set,
+        respectively. You can also pass None here to represent minus or plus
+        infinity, which is also the default.
+        """
+
+        # Special case copy constructor.
+        if len(args) == 1 and isinstance(args[0],IntSet):
+            if kwargs:
+                raise ValueError("No keyword arguments for copy constructor.")
+            self._min = args[0]._min
+            self._max = args[0]._max
+            self._ranges = args[0]._ranges
+            self._hash = args[0]._hash
+            return
+
+        # Initialize set.
+        self._ranges = []
+
+        # Process keyword arguments.
+        self._min = kwargs.pop("min",_MININF)
+        self._max = kwargs.pop("max",_MAXINF)
+        if self._min is None:
+            self._min = _MININF
+        if self._max is None:
+            self._max = _MAXINF
+
+        # Check keyword arguments.
+        if kwargs:
+            raise ValueError("Invalid keyword argument.")
+        if not ( isinstance(self._min,(int,long)) or self._min is _MININF ):
+            raise TypeError("Invalid type of min argument.")
+        if not ( isinstance(self._max,(int,long)) or self._max is _MAXINF ):
+            raise TypeError("Invalid type of max argument.")
+        if ( self._min is not _MININF and self._max is not _MAXINF and
+             self._min > self._max ):
+            raise ValueError("Minimum is not smaller than maximum.")
+        if isinstance(self._max,(int,long)):
+            self._max += 1
+
+        # Process arguments.
+        for arg in args:
+            if isinstance(arg,(int,long)):
+                start, stop = arg, arg+1
+            elif isinstance(arg,tuple):
+                if len(arg) <> 2:
+                    raise ValueError("Invalid tuple, must be (start,stop).")
+
+                # Process argument.
+                start, stop = arg
+                if start is None:
+                    start = self._min
+                if stop is None:
+                    stop = self._max
+
+                # Check arguments.
+                if not ( isinstance(start,(int,long)) or start is _MININF ):
+                    raise TypeError("Invalid type of tuple start.")
+                if not ( isinstance(stop,(int,long)) or stop is _MAXINF ):
+                    raise TypeError("Invalid type of tuple stop.")
+                if ( start is not _MININF and stop is not _MAXINF and
+                     start > stop ):
+                    continue
+                if isinstance(stop,(int,long)):
+                    stop += 1
+            else:
+                raise TypeError("Invalid argument.")
+
+            if start > self._max:
+                continue
+            elif start < self._min:
+                start = self._min
+            if stop < self._min:
+                continue
+            elif stop > self._max:
+                stop = self._max
+            self._ranges.append((start,stop))
+
+        # Normalize set.
+        self._normalize()
+
+    # Utility functions for set operations
+    # ------------------------------------
+
+    def _iterranges(self,r1,r2,minval=_MININF,maxval=_MAXINF):
+        curval = minval
+        curstates = {"r1":False,"r2":False}
+        imax, jmax = 2*len(r1), 2*len(r2)
+        i, j = 0, 0
+        while i < imax or j < jmax:
+            if i < imax and ( ( j < jmax and
+                                r1[i>>1][i&1] < r2[j>>1][j&1] ) or
+                              j == jmax ):
+                cur_r, newname, newstate = r1[i>>1][i&1], "r1", not (i&1)
+                i += 1
+            else:
+                cur_r, newname, newstate = r2[j>>1][j&1], "r2", not (j&1)
+                j += 1
+            if curval < cur_r:
+                if cur_r > maxval:
+                    break
+                yield curstates, (curval,cur_r)
+                curval = cur_r
+            curstates[newname] = newstate
+        if curval < maxval:
+            yield curstates, (curval,maxval)
+
+    def _normalize(self):
+        self._ranges.sort()
+        i = 1
+        while i < len(self._ranges):
+            if self._ranges[i][0] < self._ranges[i-1][1]:
+                self._ranges[i-1] = (self._ranges[i-1][0],
+                                     max(self._ranges[i-1][1],
+                                         self._ranges[i][1]))
+                del self._ranges[i]
+            else:
+                i += 1
+        self._ranges = tuple(self._ranges)
+        self._hash = hash(self._ranges)
+
+    def __coerce__(self,other):
+        if isinstance(other,IntSet):
+            return self, other
+        elif isinstance(other,(int,long,tuple)):
+            try:
+                return self, self.__class__(other)
+            except TypeError:
+                # Catch a type error, in that case the structure specified by
+                # other is something we can't coerce, return NotImplemented.
+                # ValueErrors are not caught, they signal that the data was
+                # invalid for the constructor. This is appropriate to signal
+                # as a ValueError to the caller.
+                return NotImplemented
+        elif isinstance(other,list):
+            try:
+                return self, self.__class__(*other)
+            except TypeError:
+                # See above.
+                return NotImplemented
+        return NotImplemented
+
+    # Set function definitions
+    # ------------------------
+
+    def _make_function(name,type,doc,pall,pany=None):
+        """Makes a function to match two ranges. Accepts two types: either
+        'set', which defines a function which returns a set with all ranges
+        matching pall (pany is ignored), or 'bool', which returns True if pall
+        matches for all ranges and pany matches for any one range. doc is the
+        dostring to give this function. pany may be none to ignore the any
+        match.
+
+        The predicates get a dict with two keys, 'r1', 'r2', which denote
+        whether the current range is present in range1 (self) and/or range2
+        (other) or none of the two, respectively."""
+
+        if type == "set":
+            def f(self,other):
+                coerced = self.__coerce__(other)
+                if coerced is NotImplemented:
+                    return NotImplemented
+                other = coerced[1]
+                newset = self.__class__.__new__(self.__class__)
+                newset._min = min(self._min,other._min)
+                newset._max = max(self._max,other._max)
+                newset._ranges = []
+                for states, (start,stop) in \
+                        self._iterranges(self._ranges,other._ranges,
+                                         newset._min,newset._max):
+                    if pall(states):
+                        if newset._ranges and newset._ranges[-1][1] == start:
+                            newset._ranges[-1] = (newset._ranges[-1][0],stop)
+                        else:
+                            newset._ranges.append((start,stop))
+                newset._ranges = tuple(newset._ranges)
+                newset._hash = hash(self._ranges)
+                return newset
+        elif type == "bool":
+            def f(self,other):
+                coerced = self.__coerce__(other)
+                if coerced is NotImplemented:
+                    return NotImplemented
+                other = coerced[1]
+                _min = min(self._min,other._min)
+                _max = max(self._max,other._max)
+                found = not pany
+                for states, (start,stop) in \
+                        self._iterranges(self._ranges,other._ranges,_min,_max):
+                    if not pall(states):
+                        return False
+                    found = found or pany(states)
+                return found
+        else:
+            raise ValueError("Invalid type of function to create.")
+        try:
+            f.func_name = name
+        except TypeError:
+            pass
+        f.func_doc = doc
+        return f
+
+    # Intersection.
+    __and__ = _make_function("__and__","set",
+                             "Intersection of two sets as a new set.",
+                             lambda s: s["r1"] and s["r2"])
+    __rand__ = _make_function("__rand__","set",
+                              "Intersection of two sets as a new set.",
+                              lambda s: s["r1"] and s["r2"])
+    intersection = _make_function("intersection","set",
+                                  "Intersection of two sets as a new set.",
+                                  lambda s: s["r1"] and s["r2"])
+
+    # Union.
+    __or__ = _make_function("__or__","set",
+                            "Union of two sets as a new set.",
+                            lambda s: s["r1"] or s["r2"])
+    __ror__ = _make_function("__ror__","set",
+                             "Union of two sets as a new set.",
+                             lambda s: s["r1"] or s["r2"])
+    union = _make_function("union","set",
+                           "Union of two sets as a new set.",
+                           lambda s: s["r1"] or s["r2"])
+
+    # Difference.
+    __sub__ = _make_function("__sub__","set",
+                             "Difference of two sets as a new set.",
+                             lambda s: s["r1"] and not s["r2"])
+    __rsub__ = _make_function("__rsub__","set",
+                              "Difference of two sets as a new set.",
+                              lambda s: s["r2"] and not s["r1"])
+    difference = _make_function("difference","set",
+                                "Difference of two sets as a new set.",
+                                lambda s: s["r1"] and not s["r2"])
+
+    # Symmetric difference.
+    __xor__ = _make_function("__xor__","set",
+                             "Symmetric difference of two sets as a new set.",
+                             lambda s: s["r1"] ^ s["r2"])
+    __rxor__ = _make_function("__rxor__","set",
+                              "Symmetric difference of two sets as a new set.",
+                              lambda s: s["r1"] ^ s["r2"])
+    symmetric_difference = _make_function("symmetric_difference","set",
+                                          "Symmetric difference of two sets as a new set.",
+                                          lambda s: s["r1"] ^ s["r2"])
+
+    # Containership testing.
+    __contains__ = _make_function("__contains__","bool",
+                                  "Returns true if self is superset of other.",
+                                  lambda s: s["r1"] or not s["r2"])
+    issubset = _make_function("issubset","bool",
+                              "Returns true if self is subset of other.",
+                              lambda s: s["r2"] or not s["r1"])
+    istruesubset = _make_function("istruesubset","bool",
+                                  "Returns true if self is true subset of other.",
+                                  lambda s: s["r2"] or not s["r1"],
+                                  lambda s: s["r2"] and not s["r1"])
+    issuperset = _make_function("issuperset","bool",
+                                "Returns true if self is superset of other.",
+                                lambda s: s["r1"] or not s["r2"])
+    istruesuperset = _make_function("istruesuperset","bool",
+                                    "Returns true if self is true superset of other.",
+                                    lambda s: s["r1"] or not s["r2"],
+                                    lambda s: s["r1"] and not s["r2"])
+    overlaps = _make_function("overlaps","bool",
+                              "Returns true if self overlaps with other.",
+                              lambda s: True,
+                              lambda s: s["r1"] and s["r2"])
+
+    # Comparison.
+    __eq__ = _make_function("__eq__","bool",
+                            "Returns true if self is equal to other.",
+                            lambda s: not ( s["r1"] ^ s["r2"] ))
+    __ne__ = _make_function("__ne__","bool",
+                            "Returns true if self is different to other.",
+                            lambda s: True,
+                            lambda s: s["r1"] ^ s["r2"])
+
+    # Clean up namespace.
+    del _make_function
+
+    # Define other functions.
+    def inverse(self):
+        """Inverse of set as a new set."""
+
+        newset = self.__class__.__new__(self.__class__)
+        newset._min = self._min
+        newset._max = self._max
+        newset._ranges = []
+        laststop = self._min
+        for r in self._ranges:
+            if laststop < r[0]:
+                newset._ranges.append((laststop,r[0]))
+                laststop = r[1]
+        if laststop < self._max:
+            newset._ranges.append((laststop,self._max))
+        return newset
+
+    __invert__ = inverse
+
+    # Hashing
+    # -------
+
+    def __hash__(self):
+        """Returns a hash value representing this integer set. As the set is
+        always stored normalized, the hash value is guaranteed to match for
+        matching ranges."""
+
+        return self._hash
+
+    # Iterating
+    # ---------
+
+    def __len__(self):
+        """Get length of this integer set. In case the length is larger than
+        2**31 (including infinitely sized integer sets), it raises an
+        OverflowError. This is due to len() restricting the size to
+        0 <= len < 2**31."""
+
+        if not self._ranges:
+            return 0
+        if self._ranges[0][0] is _MININF or self._ranges[-1][1] is _MAXINF:
+            raise OverflowError("Infinitely sized integer set.")
+        rlen = 0
+        for r in self._ranges:
+            rlen += r[1]-r[0]
+        if rlen >= 2**31:
+            raise OverflowError("Integer set bigger than 2**31.")
+        return rlen
+
+    def len(self):
+        """Returns the length of this integer set as an integer. In case the
+        length is infinite, returns -1. This function exists because of a
+        limitation of the builtin len() function which expects values in
+        the range 0 <= len < 2**31. Use this function in case your integer
+        set might be larger."""
+
+        if not self._ranges:
+            return 0
+        if self._ranges[0][0] is _MININF or self._ranges[-1][1] is _MAXINF:
+            return -1
+        rlen = 0
+        for r in self._ranges:
+            rlen += r[1]-r[0]
+        return rlen
+
+    def __nonzero__(self):
+        """Returns true if this integer set contains at least one item."""
+
+        return bool(self._ranges)
+
+    def __iter__(self):
+        """Iterate over all values in this integer set. Iteration always starts
+        by iterating from lowest to highest over the ranges that are bounded.
+        After processing these, all ranges that are unbounded (maximum 2) are
+        yielded intermixed."""
+
+        ubranges = []
+        for r in self._ranges:
+            if r[0] is _MININF:
+                if r[1] is _MAXINF:
+                    ubranges.extend(([0,1],[-1,-1]))
+                else:
+                    ubranges.append([r[1]-1,-1])
+            elif r[1] is _MAXINF:
+                ubranges.append([r[0],1])
+            else:
+                for val in xrange(r[0],r[1]):
+                    yield val
+        if ubranges:
+            while True:
+                for ubrange in ubranges:
+                    yield ubrange[0]
+                    ubrange[0] += ubrange[1]
+
+    # Printing
+    # --------
+
+    def __repr__(self):
+        """Return a representation of this integer set. The representation is
+        executable to get an equal integer set."""
+
+        rv = []
+        for start, stop in self._ranges:
+            if ( isinstance(start,(int,long)) and isinstance(stop,(int,long))
+                 and stop-start == 1 ):
+                rv.append("%r" % start)
+            elif isinstance(stop,(int,long)):
+                rv.append("(%r,%r)" % (start,stop-1))
+            else:
+                rv.append("(%r,%r)" % (start,stop))
+        if self._min is not _MININF:
+            rv.append("min=%r" % self._min)
+        if self._max is not _MAXINF:
+            rv.append("max=%r" % self._max)
+        return "%s(%s)" % (self.__class__.__name__,",".join(rv))
+
+if __name__ == "__main__":
+    # Little test script demonstrating functionality.
+    x = IntSet((10,20),30)
+    y = IntSet((10,20))
+    z = IntSet((10,20),30,(15,19),min=0,max=40)
+    print x
+    print x&110
+    print x|110
+    print x^(15,25)
+    print x-12
+    print 12 in x
+    print x.issubset(x)
+    print y.issubset(x)
+    print x.istruesubset(x)
+    print y.istruesubset(x)
+    for val in x:
+        print val
+    print x.inverse()
+    print x == z
+    print x == y
+    print x <> y
+    print hash(x)
+    print hash(z)
+    print len(x)
+    print x.len()
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/PySourceColor.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/PySourceColor.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/PySourceColor.py (revision 3)
@@ -0,0 +1,2103 @@
+# -*- coding: Latin-1 -*-
+"""
+PySourceColor: color Python source code
+"""
+
+"""
+ PySourceColor.py
+
+----------------------------------------------------------------------------
+
+ A python source to colorized html/css/xhtml converter.
+ Hacked by M.E.Farmer Jr. 2004, 2005
+ Python license
+
+----------------------------------------------------------------------------
+
+ - HTML markup does not create w3c valid html, but it works on every
+   browser i've tried so far.(I.E.,Mozilla/Firefox,Opera,Konqueror,wxHTML).
+ - CSS markup is w3c validated html 4.01 strict,
+   but will not render correctly on all browsers.
+ - XHTML markup is w3c validated xhtml 1.0 strict,
+   like html 4.01, will not render correctly on all browsers.
+
+----------------------------------------------------------------------------
+
+Features:
+
+ -Three types of markup:
+    html (default) 
+    css/html 4.01 strict
+    xhtml 1.0 strict
+
+ -Can tokenize and colorize:
+    12 types of strings
+    2 comment types
+    numbers
+    operators
+    brackets
+    math operators
+    class / name
+    def / name
+    decorator / name
+    keywords
+    arguments class/def/decorator
+    linenumbers
+    names
+    text
+
+ -Eight colorschemes built-in:
+    null
+    mono
+    lite (default)
+    dark 
+    dark2
+    idle
+    viewcvs
+    pythonwin
+
+ -Header and footer
+    set to '' for builtin header / footer.
+    give path to a file containing the html
+        you want added as header or footer.
+
+ -Arbitrary text and html
+    html markup converts all to raw (TEXT token)
+    #@# for raw -> send raw text.
+    #$# for span -> inline html and text.
+    #%# for div -> block level html and text.
+
+ -Linenumbers
+    Supports all styles. New token is called LINENUMBER.
+    Defaults to NAME if not defined.
+
+ Style options
+ 
+ -ALL markups support these text styles:
+         b = bold
+         i = italic
+         u = underline
+ -CSS and XHTML has limited support  for borders:
+     HTML markup functions will ignore these.
+     Optional: Border color in RGB hex
+     Defaults to the text forecolor.
+         #rrggbb = border color
+     Border size:
+         l = thick
+         m = medium
+         t = thin
+     Border type:
+         - = dashed
+         . = dotted
+         s = solid
+         d = double
+         g = groove
+         r = ridge
+         n = inset
+         o = outset
+     You can specify multiple sides,
+     they will all use the same style.
+     Optional: Default is full border.
+         v = bottom
+         < = left
+         > = right
+         ^ = top
+     NOTE: Specify the styles you want.
+           The markups will ignore unsupported styles
+           Also note not all browsers can show these options
+
+ -All tokens default to NAME if not defined
+     so the only absolutely critical ones to define are:
+     NAME, ERRORTOKEN, PAGEBACKGROUND
+
+----------------------------------------------------------------------------
+
+Example usage::
+
+ # import
+ import PySourceColor as psc
+ psc.convert('c:/Python22/PySourceColor.py', colors=psc.idle, show=1)
+
+ # from module import *
+ from PySourceColor import *
+ convert('c:/Python22/Lib', colors=lite, markup="css",
+          header='#$#<b>This is a simpe heading</b><hr/>')
+
+ # How to use a custom colorscheme, and most of the 'features'
+ from PySourceColor import *
+ new = {
+   ERRORTOKEN:             ('bui','#FF8080',''),
+   DECORATOR_NAME:         ('s','#AACBBC',''),
+   DECORATOR:              ('n','#333333',''),
+   NAME:                   ('t.<v','#1133AA','#DDFF22'),
+   NUMBER:                 ('','#236676','#FF5555'),
+   OPERATOR:               ('b','#454567','#BBBB11'),
+   MATH_OPERATOR:          ('','#935623','#423afb'),
+   BRACKETS:               ('b','#ac34bf','#6457a5'),
+   COMMENT:                ('t-#0022FF','#545366','#AABBFF'),
+   DOUBLECOMMENT:          ('<l#553455','#553455','#FF00FF'),
+   CLASS_NAME:             ('m^v-','#000000','#FFFFFF'),
+   DEF_NAME:               ('l=<v','#897845','#000022'),
+   KEYWORD:                ('.b','#345345','#FFFF22'),
+   SINGLEQUOTE:            ('mn','#223344','#AADDCC'),
+   SINGLEQUOTE_R:          ('','#344522',''),
+   SINGLEQUOTE_U:          ('','#234234',''),
+   DOUBLEQUOTE:            ('m#0022FF','#334421',''),
+   DOUBLEQUOTE_R:          ('','#345345',''),
+   DOUBLEQUOTE_U:          ('','#678673',''),
+   TRIPLESINGLEQUOTE:      ('tv','#FFFFFF','#000000'),
+   TRIPLESINGLEQUOTE_R:    ('tbu','#443256','#DDFFDA'),
+   TRIPLESINGLEQUOTE_U:    ('','#423454','#DDFFDA'),
+   TRIPLEDOUBLEQUOTE:      ('li#236fd3b<>','#000000','#FFFFFF'),
+   TRIPLEDOUBLEQUOTE_R:    ('tub','#000000','#FFFFFF'),
+   TRIPLEDOUBLEQUOTE_U:    ('-', '#CCAABB','#FFFAFF'),
+   LINENUMBER:             ('ib-','#ff66aa','#7733FF'),]
+   TEXT:                   ('','#546634',''), 
+   PAGEBACKGROUND:         '#FFFAAA',
+     }
+ if __name__ == '__main__':
+     import sys
+     convert(sys.argv[1], './xhtml.html', colors=new, markup='xhtml', show=1,
+             linenumbers=1)
+     convert(sys.argv[1], './html.html', colors=new, markup='html', show=1,
+             linenumbers=1)
+
+"""
+
+__all__ = ['ERRORTOKEN','DECORATOR_NAME', 'DECORATOR', 'ARGS', 'EXTRASPACE',
+       'NAME', 'NUMBER', 'OPERATOR', 'COMMENT', 'MATH_OPERATOR',
+       'DOUBLECOMMENT', 'CLASS_NAME', 'DEF_NAME', 'KEYWORD', 'BRACKETS',
+       'SINGLEQUOTE','SINGLEQUOTE_R','SINGLEQUOTE_U','DOUBLEQUOTE',
+       'DOUBLEQUOTE_R', 'DOUBLEQUOTE_U', 'TRIPLESINGLEQUOTE', 'TEXT', 
+       'TRIPLESINGLEQUOTE_R', 'TRIPLESINGLEQUOTE_U', 'TRIPLEDOUBLEQUOTE',
+       'TRIPLEDOUBLEQUOTE_R', 'TRIPLEDOUBLEQUOTE_U', 'PAGEBACKGROUND',
+       'LINENUMBER', 'CODESTART', 'CODEEND', 'PY', 'TOKEN_NAMES', 'CSSHOOK',
+       'null', 'mono', 'lite', 'dark','dark2', 'pythonwin','idle', 
+       'viewcvs', 'Usage', 'cli', 'str2stdout', 'path2stdout', 'Parser',
+       'str2file', 'str2html', 'str2css', 'str2markup', 'path2file',
+       'path2html', 'convert', 'walkdir', 'defaultColors', 'showpage',
+       'pageconvert','tagreplace', 'MARKUPDICT']
+__title__ = 'PySourceColor'
+__version__ = "2.1a"
+__date__ = '25 April 2005'
+__author__ = "M.E.Farmer Jr."
+__credits__ = '''This was originally based on a python recipe
+submitted by J�gen Hermann to ASPN. Now based on the voices in my head.
+M.E.Farmer 2004, 2005
+Python license
+'''
+import os
+import sys
+import time
+import glob
+import getopt
+import keyword
+import token
+import tokenize
+import traceback
+import webbrowser
+try :
+    import cStringIO as StringIO
+except:
+    import StringIO
+# Do not edit
+NAME = token.NAME
+NUMBER = token.NUMBER
+COMMENT = tokenize.COMMENT
+OPERATOR = token.OP
+ERRORTOKEN = token.ERRORTOKEN
+ARGS = token.NT_OFFSET + 1
+DOUBLECOMMENT = token.NT_OFFSET + 2
+CLASS_NAME = token.NT_OFFSET + 3
+DEF_NAME = token.NT_OFFSET + 4
+KEYWORD = token.NT_OFFSET + 5
+SINGLEQUOTE = token.NT_OFFSET + 6
+SINGLEQUOTE_R = token.NT_OFFSET + 7
+SINGLEQUOTE_U = token.NT_OFFSET + 8
+DOUBLEQUOTE = token.NT_OFFSET + 9
+DOUBLEQUOTE_R = token.NT_OFFSET + 10
+DOUBLEQUOTE_U = token.NT_OFFSET + 11
+TRIPLESINGLEQUOTE = token.NT_OFFSET + 12
+TRIPLESINGLEQUOTE_R = token.NT_OFFSET + 13
+TRIPLESINGLEQUOTE_U = token.NT_OFFSET + 14
+TRIPLEDOUBLEQUOTE = token.NT_OFFSET + 15
+TRIPLEDOUBLEQUOTE_R = token.NT_OFFSET + 16
+TRIPLEDOUBLEQUOTE_U = token.NT_OFFSET + 17
+PAGEBACKGROUND = token.NT_OFFSET + 18
+DECORATOR = token.NT_OFFSET + 19
+DECORATOR_NAME = token.NT_OFFSET + 20
+BRACKETS = token.NT_OFFSET + 21
+MATH_OPERATOR = token.NT_OFFSET + 22
+LINENUMBER = token.NT_OFFSET + 23
+TEXT = token.NT_OFFSET + 24
+PY = token.NT_OFFSET + 25
+CODESTART = token.NT_OFFSET + 26
+CODEEND = token.NT_OFFSET + 27
+CSSHOOK = token.NT_OFFSET + 28
+EXTRASPACE = token.NT_OFFSET + 29
+
+# markup classname lookup
+MARKUPDICT = {
+        ERRORTOKEN:             'py_err',
+        DECORATOR_NAME:         'py_decn',
+        DECORATOR:              'py_dec',
+        ARGS:                   'py_args',
+        NAME:                   'py_name',
+        NUMBER:                 'py_num',
+        OPERATOR:               'py_op',
+        COMMENT:                'py_com',
+        DOUBLECOMMENT:          'py_dcom',
+        CLASS_NAME:             'py_clsn',
+        DEF_NAME:               'py_defn',
+        KEYWORD:                'py_key',
+        SINGLEQUOTE:            'py_sq',
+        SINGLEQUOTE_R:          'py_sqr',
+        SINGLEQUOTE_U:          'py_squ',
+        DOUBLEQUOTE:            'py_dq',
+        DOUBLEQUOTE_R:          'py_dqr',
+        DOUBLEQUOTE_U:          'py_dqu',
+        TRIPLESINGLEQUOTE:      'py_tsq',
+        TRIPLESINGLEQUOTE_R:    'py_tsqr',
+        TRIPLESINGLEQUOTE_U:    'py_tsqu',
+        TRIPLEDOUBLEQUOTE:      'py_tdq',
+        TRIPLEDOUBLEQUOTE_R:    'py_tdqr',
+        TRIPLEDOUBLEQUOTE_U:    'py_tdqu',
+        BRACKETS:               'py_bra',
+        MATH_OPERATOR:          'py_mop',
+        LINENUMBER:             'py_lnum',
+        TEXT:                   'py_text',
+        }
+# might help users that want to create custom schemes
+TOKEN_NAMES= {
+       ERRORTOKEN:'ERRORTOKEN',
+       DECORATOR_NAME:'DECORATOR_NAME',
+       DECORATOR:'DECORATOR',
+       ARGS:'ARGS',
+       NAME:'NAME',
+       NUMBER:'NUMBER',
+       OPERATOR:'OPERATOR',
+       COMMENT:'COMMENT',
+       DOUBLECOMMENT:'DOUBLECOMMENT',
+       CLASS_NAME:'CLASS_NAME',
+       DEF_NAME:'DEF_NAME',
+       KEYWORD:'KEYWORD',
+       SINGLEQUOTE:'SINGLEQUOTE',
+       SINGLEQUOTE_R:'SINGLEQUOTE_R',
+       SINGLEQUOTE_U:'SINGLEQUOTE_U',
+       DOUBLEQUOTE:'DOUBLEQUOTE',
+       DOUBLEQUOTE_R:'DOUBLEQUOTE_R',
+       DOUBLEQUOTE_U:'DOUBLEQUOTE_U',
+       TRIPLESINGLEQUOTE:'TRIPLESINGLEQUOTE',
+       TRIPLESINGLEQUOTE_R:'TRIPLESINGLEQUOTE_R',
+       TRIPLESINGLEQUOTE_U:'TRIPLESINGLEQUOTE_U',
+       TRIPLEDOUBLEQUOTE:'TRIPLEDOUBLEQUOTE',
+       TRIPLEDOUBLEQUOTE_R:'TRIPLEDOUBLEQUOTE_R',
+       TRIPLEDOUBLEQUOTE_U:'TRIPLEDOUBLEQUOTE_U',
+       BRACKETS:'BRACKETS',
+       MATH_OPERATOR:'MATH_OPERATOR',
+       LINENUMBER:'LINENUMBER',
+       TEXT:'TEXT',
+       PAGEBACKGROUND:'PAGEBACKGROUND',
+       }
+
+######################################################################
+# Edit colors and styles to taste
+# Create your own scheme, just copy one below , rename and edit.
+# Custom styles must at least define NAME, ERRORTOKEN, PAGEBACKGROUND,
+# all missing elements will default to NAME.
+# See module docstring for details on style attributes.
+######################################################################
+# Copy null and use it as a starter colorscheme.
+null = {# tokentype: ('tags border_color', 'textforecolor', 'textbackcolor')
+        ERRORTOKEN:             ('','#000000',''),# Error token
+        DECORATOR_NAME:         ('','#000000',''),# Decorator name
+        DECORATOR:              ('','#000000',''),# @ symbol
+        ARGS:                   ('','#000000',''),# class,def,deco arguments
+        NAME:                   ('','#000000',''),# All other python text
+        NUMBER:                 ('','#000000',''),# 0->10
+        OPERATOR:               ('','#000000',''),# ':','<=',';',',','.','==', etc
+        MATH_OPERATOR:          ('','#000000',''),# '+','-','=','','**',etc
+        BRACKETS:               ('','#000000',''),# '[',']','(',')','{','}'
+        COMMENT:                ('','#000000',''),# Single comment
+        DOUBLECOMMENT:          ('','#000000',''),## Double comment
+        CLASS_NAME:             ('','#000000',''),# Class name
+        DEF_NAME:               ('','#000000',''),# Def name
+        KEYWORD:                ('','#000000',''),# Python keywords
+        SINGLEQUOTE:            ('','#000000',''),# 'SINGLEQUOTE'
+        SINGLEQUOTE_R:          ('','#000000',''),# r'SINGLEQUOTE'
+        SINGLEQUOTE_U:          ('','#000000',''),# u'SINGLEQUOTE'
+        DOUBLEQUOTE:            ('','#000000',''),# "DOUBLEQUOTE"
+        DOUBLEQUOTE_R:          ('','#000000',''),# r"DOUBLEQUOTE"
+        DOUBLEQUOTE_U:          ('','#000000',''),# u"DOUBLEQUOTE"
+        TRIPLESINGLEQUOTE:      ('','#000000',''),# '''TRIPLESINGLEQUOTE'''
+        TRIPLESINGLEQUOTE_R:    ('','#000000',''),# r'''TRIPLESINGLEQUOTE'''
+        TRIPLESINGLEQUOTE_U:    ('','#000000',''),# u'''TRIPLESINGLEQUOTE'''
+        TRIPLEDOUBLEQUOTE:      ('','#000000',''),# """TRIPLEDOUBLEQUOTE"""
+        TRIPLEDOUBLEQUOTE_R:    ('','#000000',''),# r"""TRIPLEDOUBLEQUOTE"""
+        TRIPLEDOUBLEQUOTE_U:    ('','#000000',''),# u"""TRIPLEDOUBLEQUOTE"""
+        TEXT:                   ('','#000000',''),# non python text 
+        LINENUMBER:             ('>ti#555555','#000000',''),# Linenumbers
+        PAGEBACKGROUND:         '#FFFFFF'# set the page background
+        }
+
+mono = {
+        ERRORTOKEN:             ('s#FF0000','#FF8080',''),
+        DECORATOR_NAME:         ('bu','#000000',''),
+        DECORATOR:              ('b','#000000',''),
+        ARGS:                   ('b','#555555',''),
+        NAME:                   ('','#000000',''),
+        NUMBER:                 ('b','#000000',''),
+        OPERATOR:               ('b','#000000',''),
+        MATH_OPERATOR:          ('b','#000000',''),
+        BRACKETS:               ('b','#000000',''),
+        COMMENT:                ('i','#999999',''),
+        DOUBLECOMMENT:          ('b','#999999',''),
+        CLASS_NAME:             ('bu','#000000',''),
+        DEF_NAME:               ('b','#000000',''),
+        KEYWORD:                ('b','#000000',''),
+        SINGLEQUOTE:            ('','#000000',''),
+        SINGLEQUOTE_R:          ('','#000000',''),
+        SINGLEQUOTE_U:          ('','#000000',''),
+        DOUBLEQUOTE:            ('','#000000',''),
+        DOUBLEQUOTE_R:          ('','#000000',''),
+        DOUBLEQUOTE_U:          ('','#000000',''),
+        TRIPLESINGLEQUOTE:      ('','#000000',''),
+        TRIPLESINGLEQUOTE_R:    ('','#000000',''),
+        TRIPLESINGLEQUOTE_U:    ('','#000000',''),
+        TRIPLEDOUBLEQUOTE:      ('i','#000000',''),
+        TRIPLEDOUBLEQUOTE_R:    ('i','#000000',''),
+        TRIPLEDOUBLEQUOTE_U:    ('i','#000000',''),
+        TEXT:                   ('','#000000',''),
+        LINENUMBER:             ('>ti#555555','#000000',''),
+        PAGEBACKGROUND:         '#FFFFFF'
+        }
+
+dark = {
+        ERRORTOKEN:             ('s#FF0000','#FF8080',''),
+        DECORATOR_NAME:         ('b','#FFBBAA',''),
+        DECORATOR:              ('b','#CC5511',''),
+        ARGS:                   ('b','#DDDDFF',''),
+        NAME:                   ('','#DDDDDD',''),
+        NUMBER:                 ('','#FF0000',''),
+        OPERATOR:               ('b','#FAF785',''),
+        MATH_OPERATOR:          ('b','#FAF785',''),
+        BRACKETS:               ('b','#FAF785',''),
+        COMMENT:                ('','#45FCA0',''),
+        DOUBLECOMMENT:          ('i','#A7C7A9',''),
+        CLASS_NAME:             ('b','#B666FD',''),
+        DEF_NAME:               ('b','#EBAE5C',''),
+        KEYWORD:                ('b','#8680FF',''),
+        SINGLEQUOTE:            ('','#F8BAFE',''),
+        SINGLEQUOTE_R:          ('','#F8BAFE',''),
+        SINGLEQUOTE_U:          ('','#F8BAFE',''),
+        DOUBLEQUOTE:            ('','#FF80C0',''),
+        DOUBLEQUOTE_R:          ('','#FF80C0',''),
+        DOUBLEQUOTE_U:          ('','#FF80C0',''),
+        TRIPLESINGLEQUOTE:      ('','#FF9595',''),
+        TRIPLESINGLEQUOTE_R:    ('','#FF9595',''),
+        TRIPLESINGLEQUOTE_U:    ('','#FF9595',''),
+        TRIPLEDOUBLEQUOTE:      ('','#B3FFFF',''),
+        TRIPLEDOUBLEQUOTE_R:    ('','#B3FFFF',''),
+        TRIPLEDOUBLEQUOTE_U:    ('','#B3FFFF',''),
+        TEXT:                   ('','#FFFFFF',''),
+        LINENUMBER:             ('>mi#555555','#bbccbb','#333333'),
+        PAGEBACKGROUND:         '#000000'
+        }
+
+dark2 = {
+        ERRORTOKEN:             ('','#FF0000',''),
+        DECORATOR_NAME:         ('b','#FFBBAA',''),
+        DECORATOR:              ('b','#CC5511',''),
+        ARGS:                   ('b','#DDDDDD',''),
+        NAME:                   ('','#C0C0C0',''),
+        NUMBER:                 ('b','#00FF00',''),
+        OPERATOR:               ('b','#FF090F',''),
+        MATH_OPERATOR:          ('b','#EE7020',''),
+        BRACKETS:               ('b','#FFB90F',''),
+        COMMENT:                ('i','#D0D000','#522000'),#'#88AA88','#11111F'),
+        DOUBLECOMMENT:          ('i','#D0D000','#522000'),#'#77BB77','#11111F'),
+        CLASS_NAME:             ('b','#DD4080',''),
+        DEF_NAME:               ('b','#FF8040',''),
+        KEYWORD:                ('b','#4726d1',''),
+        SINGLEQUOTE:            ('','#8080C0',''),
+        SINGLEQUOTE_R:          ('','#8080C0',''),
+        SINGLEQUOTE_U:          ('','#8080C0',''),
+        DOUBLEQUOTE:            ('','#ADB9F1',''),
+        DOUBLEQUOTE_R:          ('','#ADB9F1',''),
+        DOUBLEQUOTE_U:          ('','#ADB9F1',''),
+        TRIPLESINGLEQUOTE:      ('','#00C1C1',''),#A050C0
+        TRIPLESINGLEQUOTE_R:    ('','#00C1C1',''),#A050C0
+        TRIPLESINGLEQUOTE_U:    ('','#00C1C1',''),#A050C0
+        TRIPLEDOUBLEQUOTE:      ('','#33E3E3',''),#B090E0
+        TRIPLEDOUBLEQUOTE_R:    ('','#33E3E3',''),#B090E0
+        TRIPLEDOUBLEQUOTE_U:    ('','#33E3E3',''),#B090E0
+        TEXT:                   ('','#C0C0C0',''),
+        LINENUMBER:             ('>mi#555555','#bbccbb','#333333'),
+        PAGEBACKGROUND:         '#000000'
+        }
+
+lite = {
+        ERRORTOKEN:             ('s#FF0000','#FF8080',''),
+        DECORATOR_NAME:         ('b','#BB4422',''),
+        DECORATOR:              ('b','#3333AF',''),
+        ARGS:                   ('b','#000000',''),
+        NAME:                   ('','#333333',''),
+        NUMBER:                 ('b','#DD2200',''),
+        OPERATOR:               ('b','#000000',''),
+        MATH_OPERATOR:          ('b','#000000',''),
+        BRACKETS:               ('b','#000000',''),
+        COMMENT:                ('','#007F00',''),
+        DOUBLECOMMENT:          ('','#608060',''),
+        CLASS_NAME:             ('b','#0000DF',''),
+        DEF_NAME:               ('b','#9C7A00',''),#f09030
+        KEYWORD:                ('b','#0000AF',''),
+        SINGLEQUOTE:            ('','#600080',''),
+        SINGLEQUOTE_R:          ('','#600080',''),
+        SINGLEQUOTE_U:          ('','#600080',''),
+        DOUBLEQUOTE:            ('','#A0008A',''),
+        DOUBLEQUOTE_R:          ('','#A0008A',''),
+        DOUBLEQUOTE_U:          ('','#A0008A',''),
+        TRIPLESINGLEQUOTE:      ('','#337799',''),
+        TRIPLESINGLEQUOTE_R:    ('','#337799',''),
+        TRIPLESINGLEQUOTE_U:    ('','#337799',''),
+        TRIPLEDOUBLEQUOTE:      ('','#1166AA',''),
+        TRIPLEDOUBLEQUOTE_R:    ('','#1166AA',''),
+        TRIPLEDOUBLEQUOTE_U:    ('','#1166AA',''),
+        TEXT:                   ('','#000000',''),
+        LINENUMBER:             ('>ti#555555','#000000',''),
+        PAGEBACKGROUND:         '#FFFFFF'
+        }
+
+idle = {
+        ERRORTOKEN:             ('s#FF0000','#FF8080',''),
+        DECORATOR_NAME:         ('','#900090',''),
+        DECORATOR:              ('','#FF7700',''),
+        NAME:                   ('','#000000',''),
+        NUMBER:                 ('','#000000',''),
+        OPERATOR:               ('','#000000',''),
+        MATH_OPERATOR:          ('','#000000',''),
+        BRACKETS:               ('','#000000',''),
+        COMMENT:                ('','#DD0000',''),
+        DOUBLECOMMENT:          ('','#DD0000',''),
+        CLASS_NAME:             ('','#0000FF',''),
+        DEF_NAME:               ('','#0000FF',''),
+        KEYWORD:                ('','#FF7700',''),
+        SINGLEQUOTE:            ('','#00AA00',''),
+        SINGLEQUOTE_R:          ('','#00AA00',''),
+        SINGLEQUOTE_U:          ('','#00AA00',''),
+        DOUBLEQUOTE:            ('','#00AA00',''),
+        DOUBLEQUOTE_R:          ('','#00AA00',''),
+        DOUBLEQUOTE_U:          ('','#00AA00',''),
+        TRIPLESINGLEQUOTE:      ('','#00AA00',''),
+        TRIPLESINGLEQUOTE_R:    ('','#00AA00',''),
+        TRIPLESINGLEQUOTE_U:    ('','#00AA00',''),
+        TRIPLEDOUBLEQUOTE:      ('','#00AA00',''),
+        TRIPLEDOUBLEQUOTE_R:    ('','#00AA00',''),
+        TRIPLEDOUBLEQUOTE_U:    ('','#00AA00',''),
+        TEXT:                   ('','#000000',''),
+        LINENUMBER:             ('>ti#555555','#000000',''),
+        PAGEBACKGROUND:         '#FFFFFF'
+        }
+
+pythonwin = {
+        ERRORTOKEN:             ('s#FF0000','#FF8080',''),
+        DECORATOR_NAME:         ('b','#DD0080',''),
+        DECORATOR:              ('b','#000080',''),
+        ARGS:                   ('','#000000',''),
+        NAME:                   ('','#303030',''),
+        NUMBER:                 ('','#008080',''),
+        OPERATOR:               ('','#000000',''),
+        MATH_OPERATOR:          ('','#000000',''),
+        BRACKETS:               ('','#000000',''),
+        COMMENT:                ('','#007F00',''),
+        DOUBLECOMMENT:          ('','#7F7F7F',''),
+        CLASS_NAME:             ('b','#0000FF',''),
+        DEF_NAME:               ('b','#007F7F',''),
+        KEYWORD:                ('b','#000080',''),
+        SINGLEQUOTE:            ('','#808000',''),
+        SINGLEQUOTE_R:          ('','#808000',''),
+        SINGLEQUOTE_U:          ('','#808000',''),
+        DOUBLEQUOTE:            ('','#808000',''),
+        DOUBLEQUOTE_R:          ('','#808000',''),
+        DOUBLEQUOTE_U:          ('','#808000',''),
+        TRIPLESINGLEQUOTE:      ('','#808000',''),
+        TRIPLESINGLEQUOTE_R:    ('','#808000',''),
+        TRIPLESINGLEQUOTE_U:    ('','#808000',''),
+        TRIPLEDOUBLEQUOTE:      ('','#808000',''),
+        TRIPLEDOUBLEQUOTE_R:    ('','#808000',''),
+        TRIPLEDOUBLEQUOTE_U:    ('','#808000',''),
+        TEXT:                   ('','#303030',''),
+        LINENUMBER:             ('>ti#555555','#000000',''),
+        PAGEBACKGROUND:         '#FFFFFF'
+        }
+
+viewcvs = {
+        ERRORTOKEN:             ('s#FF0000','#FF8080',''),
+        DECORATOR_NAME:         ('','#000000',''),
+        DECORATOR:              ('','#000000',''),
+        ARGS:                   ('','#000000',''),
+        NAME:                   ('','#000000',''),
+        NUMBER:                 ('','#000000',''),
+        OPERATOR:               ('','#000000',''),
+        MATH_OPERATOR:          ('','#000000',''),
+        BRACKETS:               ('','#000000',''),
+        COMMENT:                ('i','#b22222',''),
+        DOUBLECOMMENT:          ('i','#b22222',''),
+        CLASS_NAME:             ('','#000000',''),
+        DEF_NAME:               ('b','#0000ff',''),
+        KEYWORD:                ('b','#a020f0',''),
+        SINGLEQUOTE:            ('b','#bc8f8f',''),
+        SINGLEQUOTE_R:          ('b','#bc8f8f',''),
+        SINGLEQUOTE_U:          ('b','#bc8f8f',''),
+        DOUBLEQUOTE:            ('b','#bc8f8f',''),
+        DOUBLEQUOTE_R:          ('b','#bc8f8f',''),
+        DOUBLEQUOTE_U:          ('b','#bc8f8f',''),
+        TRIPLESINGLEQUOTE:      ('b','#bc8f8f',''),
+        TRIPLESINGLEQUOTE_R:    ('b','#bc8f8f',''),
+        TRIPLESINGLEQUOTE_U:    ('b','#bc8f8f',''),
+        TRIPLEDOUBLEQUOTE:      ('b','#bc8f8f',''),
+        TRIPLEDOUBLEQUOTE_R:    ('b','#bc8f8f',''),
+        TRIPLEDOUBLEQUOTE_U:    ('b','#bc8f8f',''),
+        TEXT:                   ('','#000000',''),
+        LINENUMBER:             ('>ti#555555','#000000',''),
+        PAGEBACKGROUND:         '#FFFFFF'
+        }
+
+defaultColors = lite
+
+def Usage():
+    doc = """
+ -----------------------------------------------------------------------------
+  PySourceColor.py ver: %s
+ -----------------------------------------------------------------------------
+  Module summary:
+     This module is designed to colorize python source code.
+         Input--->python source
+         Output-->colorized (html, html4.01/css, xhtml1.0)
+     Standalone:
+         This module will work from the command line with options.
+         This module will work with redirected stdio.
+     Imported:
+         This module can be imported and used directly in your code.
+ -----------------------------------------------------------------------------
+  Command line options:
+     -h, --help
+         Optional-> Display this help message.
+     -t, --test
+         Optional-> Will ignore all others flags but  --profile
+             test all schemes and markup combinations
+     -p, --profile
+         Optional-> Works only with --test or -t
+             runs profile.py and makes the test work in quiet mode.
+     -i, --in, --input
+         Optional-> If you give input on stdin.
+         Use any of these for the current dir (.,cwd)
+         Input can be file or dir.
+         Input from stdin use one of the following (-,stdin)
+         If stdin is used as input stdout is output unless specified.
+     -o, --out, --output
+         Optional-> output dir for the colorized source.
+             default: output dir is the input dir.
+         To output html to stdout use one of the following (-,stdout)
+         Stdout can be used without stdin if you give a file as input.
+     -c, --color
+         Optional-> null, mono, dark, dark2, lite, idle, pythonwin, viewcvs
+             default: dark 
+     -s, --show
+         Optional-> Show page after creation.
+             default: no show
+     -m, --markup
+         Optional-> html, css, xhtml
+             css, xhtml also support external stylesheets (-e,--external)
+             default: HTML
+     -e, --external
+         Optional-> use with css, xhtml
+             Writes an style sheet instead of embedding it in the page
+             saves it as pystyle.css in the same directory.
+             html markup will silently ignore this flag.
+     -H, --header
+         Opional-> add a page header to the top of the output
+         -H
+             Builtin header (name,date,hrule)
+         --header
+             You must specify a filename.
+             The header file must be valid html
+             and must handle its own font colors.
+             ex. --header c:/tmp/header.txt
+     -F, --footer
+         Opional-> add a page footer to the bottom of the output
+         -F 
+             Builtin footer (hrule,name,date)
+         --footer
+             You must specify a filename.
+             The footer file must be valid html
+             and must handle its own font colors.
+             ex. --footer c:/tmp/footer.txt  
+     -l, --linenumbers
+         Optional-> default is no linenumbers
+             Adds line numbers to the start of each line in the code.
+    --convertpage
+         Given a webpage that has code embedded in tags it will
+             convert embedded code to colorized html. 
+             (see pageconvert for details)
+ -----------------------------------------------------------------------------
+  Option usage:
+   # Test and show pages
+      python PySourceColor.py -t -s
+   # Test and only show profile results
+      python PySourceColor.py -t -p
+   # Colorize all .py,.pyw files in cwdir you can also use: (.,cwd)
+      python PySourceColor.py -i .
+   # Using long options w/ =
+      python PySourceColor.py --in=c:/myDir/my.py --color=lite --show
+   # Using short options w/out =
+      python PySourceColor.py -i c:/myDir/  -c idle -m css -e
+   # Using any mix
+      python PySourceColor.py --in . -o=c:/myDir --show
+   # Place a custom header on your files
+      python PySourceColor.py -i . -o c:/tmp -m xhtml --header c:/header.txt
+ -----------------------------------------------------------------------------
+  Stdio usage:
+   # Stdio using no options
+      python PySourceColor.py < c:/MyFile.py > c:/tmp/MyFile.html
+   # Using stdin alone automatically uses stdout for output: (stdin,-)
+      python PySourceColor.py -i- < c:/MyFile.py > c:/tmp/myfile.html
+   # Stdout can also be written to directly from a file instead of stdin
+      python PySourceColor.py -i c:/MyFile.py -m css -o- > c:/tmp/myfile.html
+   # Stdin can be used as input , but output can still be specified
+      python PySourceColor.py -i- -o c:/pydoc.py.html -s < c:/Python22/my.py
+ _____________________________________________________________________________
+ """
+    print doc % (__version__)
+    sys.exit(1)
+
+###################################################### Command line interface
+
+def cli():
+    """Handle command line args and redirections"""
+    try:
+        # try to get command line args
+        opts, args = getopt.getopt(sys.argv[1:],
+              "hseqtplHFi:o:c:m:h:f:",["help", "show", "quiet", 
+              "test", "external", "linenumbers", "convertpage", "profile", 
+              "input=", "output=", "color=", "markup=","header=", "footer="])
+    except getopt.GetoptError:
+        # on error print help information and exit:
+        Usage()
+    # init some names
+    input = None
+    output = None
+    colorscheme = None
+    markup = 'html'
+    header = None
+    footer = None
+    linenumbers = 0
+    show = 0
+    quiet = 0
+    test = 0
+    profile = 0
+    convertpage = 0
+    form = None
+    # if we have args then process them
+    for o, a in opts:
+        if o in ["-h", "--help"]:
+            Usage()
+            sys.exit()
+        if o in ["-o", "--output", "--out"]:
+            output = a
+        if o in ["-i", "--input", "--in"]:
+            input = a
+            if input in [".", "cwd"]:
+                input = os.getcwd()
+        if o in ["-s", "--show"]:
+            show = 1
+        if o in ["-q", "--quiet"]:
+            quiet = 1
+        if o in ["-t", "--test"]:
+            test = 1
+        if o in ["--convertpage"]:
+            convertpage = 1
+        if o in ["-p", "--profile"]:
+            profile = 1
+        if o in ["-e", "--external"]:
+            form = 'external'
+        if o in ["-m", "--markup"]:
+            markup = str(a)
+        if o in ["-l", "--linenumbers"]:
+            linenumbers = 1
+        if o in ["--header"]:
+            header = str(a)
+        elif o == "-H":
+            header = ''
+        if o in ["--footer"]:
+            footer = str(a)
+        elif o == "-F":
+            footer = ''
+        if o in ["-c", "--color"]:
+            try:
+                colorscheme = globals().get(a.lower())
+            except:
+                traceback.print_exc()
+                Usage()
+    if test:
+        if profile:
+            import profile
+            profile.run('_test(show=%s, quiet=%s)'%(show,quiet))
+        else:
+            # Parse this script in every possible colorscheme and markup
+            _test(show,quiet)
+    elif input in [None, "-", "stdin"] or output in ["-", "stdout"]:
+        # determine if we are going to use stdio
+        if input not in [None, "-", "stdin"]:
+            if os.path.isfile(input) :
+                path2stdout(input, colors=colorscheme, markup=markup,
+                            linenumbers=linenumbers, header=header, 
+                            footer=footer, form=form)
+            else:
+                raise PathError, 'File does not exists!'
+        else:
+            try:
+                if sys.stdin.isatty():
+                    raise InputError, 'Please check input!'
+                else:
+                    if output in [None,"-","stdout"]:
+                        str2stdout(sys.stdin.read(), colors=colorscheme,
+                                   markup=markup, header=header,
+                                   footer=footer, linenumbers=linenumbers,
+                                   form=form)
+                    else:
+                        str2file(sys.stdin.read(), outfile=output, show=show, 
+                                markup=markup, header=header, footer=footer,
+                                linenumbers=linenumbers, form=form)
+            except:
+                traceback.print_exc()
+                Usage()
+    else:
+        if os.path.exists(input):
+            if convertpage:
+                # if there was at least an input given we can proceed
+                pageconvert(input, out=output, colors=colorscheme, 
+                            show=show, markup=markup,linenumbers=linenumbers)
+            else:
+                # if there was at least an input given we can proceed
+                convert(source=input, outdir=output, colors=colorscheme, 
+                        show=show, markup=markup, quiet=quiet, header=header,
+                        footer=footer, linenumbers=linenumbers, form=form)
+        else:
+            raise PathError, 'File does not exists!'
+            Usage()
+
+######################################################### Simple markup tests
+
+def _test(show=0, quiet=0):
+    """Test the parser and most of the functions.
+
+       There are 19 test total(eight colorschemes in three diffrent markups,
+       and a str2file test. Most functions are tested by this.
+    """
+    fi = sys.argv[0]
+    if not fi.endswith('.exe'):# Do not test if frozen as an archive
+        # this is a collection of test, most things are covered.
+        path2file(fi, '/tmp/null.html', null, show=show, quiet=quiet)
+        path2file(fi, '/tmp/null_css.html', null, show=show,
+                  markup='css', quiet=quiet)
+        path2file(fi, '/tmp/mono.html', mono, show=show, quiet=quiet)
+        path2file(fi, '/tmp/mono_css.html', mono, show=show,
+                  markup='css', quiet=quiet)
+        path2file(fi, '/tmp/lite.html', lite, show=show, quiet=quiet)
+        path2file(fi, '/tmp/lite_css.html', lite, show=show,
+                  markup='css', quiet=quiet, header='', footer='', 
+                  linenumbers=1)
+        path2file(fi, '/tmp/lite_xhtml.html', lite, show=show,
+                  markup='xhtml', quiet=quiet)
+        path2file(fi, '/tmp/dark.html', dark, show=show, quiet=quiet)
+        path2file(fi, '/tmp/dark_css.html', dark, show=show,
+                  markup='css', quiet=quiet, linenumbers=1)
+        path2file(fi, '/tmp/dark2.html', dark2, show=show, quiet=quiet)
+        path2file(fi, '/tmp/dark2_css.html', dark2, show=show,
+                  markup='css', quiet=quiet)
+        path2file(fi, '/tmp/dark2_xhtml.html', dark2, show=show,
+                  markup='xhtml', quiet=quiet, header='', footer='', 
+                  linenumbers=1, form='external')
+        path2file(fi, '/tmp/idle.html', idle, show=show, quiet=quiet)
+        path2file(fi, '/tmp/idle_css.html', idle, show=show,
+                  markup='css', quiet=quiet)
+        path2file(fi, '/tmp/viewcvs.html', viewcvs, show=show, 
+                  quiet=quiet, linenumbers=1)
+        path2file(fi, '/tmp/viewcvs_css.html', viewcvs, show=show,
+                  markup='css', linenumbers=1, quiet=quiet)
+        path2file(fi, '/tmp/pythonwin.html', pythonwin, show=show,
+                  quiet=quiet)
+        path2file(fi, '/tmp/pythonwin_css.html', pythonwin, show=show,
+                  markup='css', quiet=quiet)
+        teststr=r'''"""This is a test of decorators and other things"""
+# This should be line 421...
+@whatever(arg,arg2)
+@A @B(arghh) @C
+def LlamaSaysNi(arg='Ni!',arg2="RALPH"):
+   """This docstring is deeply disturbed by all the llama references"""
+   print '%s The Wonder Llama says %s'% (arg2,arg)
+# So I was like duh!, and he was like ya know?!,
+# and so we were both like huh...wtf!? RTFM!! LOL!!;)
+@staticmethod## Double comments are KewL.
+def LlamasRLumpy():
+   """This docstring is too sexy to be here.
+   """
+   u"""
+=============================
+A Mse once bit my sister...
+=============================
+   """
+   ## Relax, this won't hurt a bit, just a simple, painless procedure,
+   ## hold still while I get the anesthetizing hammer.
+   m = {'three':'1','won':'2','too':'3'}
+   o = r'fishy\fishy\fishy/fish\oh/where/is\my/little\..'
+   python = uR""" 
+ No realli! She was Karving her initials  the mse with the sharpened end  
+ of an interspace tthbrush given her by Svenge - her brother-in-law -an Oslo
+ dentist and star of many Norwegian mies: "The H Hands of an Oslo         
+ Dentist", "Fillings of Passion", "The Huge Mars of Horst Nordfink"..."""
+   RU"""142 MEXICAN WHOOPING LLAMAS"""#<-Can you fit 142 llamas in a red box?
+   n = u' HERMSGERVﾘRDENBRﾘTBﾘRDA ' + """ YUTTE """
+   t = """SAMALLNIATNUOMNAIRODAUCE"""+"DENIARTYLLAICEPS04"
+   ## We apologise for the fault in the
+   ## comments. Those responsible have been
+   ## sacked.
+   y = '14 NORTH CHILEAN GUANACOS \
+(CLOSELY RELATED TO THE LLAMA)'
+   rules = [0,1,2,3,4,5]
+   print y'''
+        htmlPath = os.path.abspath('/tmp/strtest_lines.html')
+        str2file(teststr, htmlPath, colors=dark, markup='xhtml',
+                 linenumbers=420, show=show)
+        _printinfo("  wrote %s" % htmlPath, quiet)
+        htmlPath = os.path.abspath('/tmp/strtest_nolines.html')
+        str2file(teststr, htmlPath, colors=dark, markup='xhtml',
+                 show=show)
+        _printinfo("  wrote %s" % htmlPath, quiet)
+    else:
+        Usage()
+    return
+
+# emacs wants this: '
+
+####################################################### User funtctions
+
+def str2stdout(sourcestring, colors=None, title='', markup='html',
+                 header=None, footer=None,
+                 linenumbers=0, form=None):
+    """Converts a code(string) to colorized HTML. Writes to stdout.
+
+       form='code',or'snip' (for "<pre>yourcode</pre>" only)
+       colors=null,mono,lite,dark,dark2,idle,or pythonwin
+    """
+    Parser(sourcestring, colors=colors, title=title, markup=markup,
+           header=header, footer=footer,
+           linenumbers=linenumbers).format(form)
+
+def path2stdout(sourcepath, title='', colors=None, markup='html',
+                   header=None, footer=None,
+                   linenumbers=0, form=None):
+    """Converts code(file) to colorized HTML. Writes to stdout.
+
+       form='code',or'snip' (for "<pre>yourcode</pre>" only)
+       colors=null,mono,lite,dark,dark2,idle,or pythonwin
+    """
+    sourcestring = open(sourcepath).read()
+    Parser(sourcestring, colors=colors, title=sourcepath, 
+           markup=markup, header=header, footer=footer,
+           linenumbers=linenumbers).format(form)
+
+def str2html(sourcestring, colors=None, title='', 
+               markup='html', header=None, footer=None,
+               linenumbers=0, form=None):
+    """Converts a code(string) to colorized HTML. Returns an HTML string.
+
+       form='code',or'snip' (for "<pre>yourcode</pre>" only)
+       colors=null,mono,lite,dark,dark2,idle,or pythonwin
+    """
+    stringIO = StringIO.StringIO()
+    Parser(sourcestring, colors=colors, title=title, out=stringIO,
+           markup=markup, header=header, footer=footer,
+           linenumbers=linenumbers).format(form)
+    stringIO.seek(0)
+    return stringIO.read()
+  
+def str2css(sourcestring, colors=None, title='',
+              markup='css', header=None, footer=None,  
+              linenumbers=0, form=None):
+    """Converts a code string to colorized CSS/HTML. Returns CSS/HTML string
+       
+       If form != None then this will return (stylesheet_str, code_str)
+       colors=null,mono,lite,dark,dark2,idle,or pythonwin
+    """
+    if markup.lower() not in ['css' ,'xhtml']:
+        markup = 'css'
+    stringIO = StringIO.StringIO()
+    parse = Parser(sourcestring, colors=colors, title=title,
+                   out=stringIO, markup=markup,
+                   header=header, footer=footer,
+                   linenumbers=linenumbers)
+    parse.format(form)
+    stringIO.seek(0)
+    if form != None:
+        return parse._sendCSSStyle(external=1), stringIO.read()
+    else:
+        return None, stringIO.read()
+
+def str2markup(sourcestring, colors=None, title = '',
+               markup='xhtml', header=None, footer=None, 
+              linenumbers=0, form=None):
+    """ Convert code strings into ([stylesheet or None], colorized string) """
+    if markup.lower() == 'html':
+        return None, str2html(sourcestring, colors=colors, title=title,
+                   header=header, footer=footer, markup=markup, 
+                   linenumbers=linenumbers, form=form)
+    else:
+        return str2css(sourcestring, colors=colors, title=title,
+                   header=header, footer=footer, markup=markup, 
+                   linenumbers=linenumbers, form=form)
+
+def str2file(sourcestring, outfile, colors=None, title='', 
+               markup='html', header=None, footer=None, 
+               linenumbers=0, show=0, dosheet=1, form=None):
+    """Converts a code string to a file.
+
+       makes no attempt at correcting bad pathnames
+    """
+    css , html = str2markup(sourcestring, colors=colors, title='',
+                    markup=markup, header=header, footer=footer,
+                    linenumbers=linenumbers, form=form)
+    # write html
+    f = open(outfile,'wt')
+    f.writelines(html)
+    f.close()
+    #write css
+    if css != None and dosheet: 
+        dir = os.path.dirname(outfile)
+        outcss = os.path.join(dir,'pystyle.css')
+        f = open(outcss,'wt')
+        f.writelines(css)
+        f.close()
+    if show:
+        showpage(outfile)
+
+def path2html(sourcepath, colors=None, markup='html',
+                header=None, footer=None,
+                linenumbers=0, form=None):
+    """Converts code(file) to colorized HTML. Returns an HTML string.
+
+       form='code',or'snip' (for "<pre>yourcode</pre>" only)
+       colors=null,mono,lite,dark,dark2,idle,or pythonwin
+    """
+    stringIO = StringIO.StringIO()
+    sourcestring = open(sourcepath).read()
+    Parser(sourcestring, colors, title=sourcepath, out=stringIO,
+           markup=markup, header=header, footer=footer,
+           linenumbers=linenumbers).format(form)
+    stringIO.seek(0)
+    return stringIO.read()
+
+def convert(source, outdir=None, colors=None,
+              show=0, markup='html', quiet=0,
+              header=None, footer=None, linenumbers=0, form=None):
+    """Takes a file or dir as input and places the html in the outdir.
+
+       If outdir is none it defaults to the input dir
+    """
+    count=0
+    # If it is a filename then path2file
+    if not os.path.isdir(source):
+        if os.path.isfile(source):
+            count+=1
+            path2file(source, outdir, colors, show, markup, 
+                     quiet, form, header, footer, linenumbers, count)
+        else:
+            raise PathError, 'File does not exist!'
+    # If we pass in a dir we need to walkdir for files.
+    # Then we need to colorize them with path2file
+    else:
+        fileList = walkdir(source)
+        if fileList != None:
+            # make sure outdir is a dir
+            if outdir != None:
+                if os.path.splitext(outdir)[1] != '':
+                    outdir = os.path.split(outdir)[0]
+            for item in fileList:
+                count+=1
+                path2file(item, outdir, colors, show, markup,
+                          quiet, form, header, footer, linenumbers, count)
+            _printinfo('Completed colorizing %s files.'%str(count), quiet)
+        else:
+            _printinfo("No files to convert in dir.", quiet)
+
+def path2file(sourcePath, out=None, colors=None, show=0,
+                markup='html', quiet=0, form=None,
+                header=None, footer=None, linenumbers=0, count=1):
+    """ Converts python source to html file"""
+    # If no outdir is given we use the sourcePath
+    if out == None:#this is a guess
+        htmlPath = sourcePath + '.html'
+    else:
+        # If we do give an out_dir, and it does
+        # not exist , it will be created.
+        if os.path.splitext(out)[1] == '':
+            if not os.path.isdir(out):
+                os.makedirs(out)
+            sourceName = os.path.basename(sourcePath)
+            htmlPath = os.path.join(out,sourceName)+'.html'
+        # If we do give an out_name, and its dir does
+        # not exist , it will be created.
+        else:
+            outdir = os.path.split(out)[0]
+            if not os.path.isdir(outdir):
+                os.makedirs(outdir)
+            htmlPath = out
+    htmlPath = os.path.abspath(htmlPath)
+    # Open the text and do the parsing.
+    source = open(sourcePath).read()
+    parse = Parser(source, colors, sourcePath, open(htmlPath, 'wt'),
+                   markup, header, footer, linenumbers)
+    parse.format(form)
+    _printinfo("  wrote %s" % htmlPath, quiet)
+    # html markup will ignore the external flag, but
+    # we need to stop the blank file from being written.
+    if form == 'external' and count == 1 and markup != 'html':
+        cssSheet = parse._sendCSSStyle(external=1)
+        cssPath = os.path.join(os.path.dirname(htmlPath),'pystyle.css')
+        css = open(cssPath, 'wt')
+        css.write(cssSheet)
+        css.close()
+        _printinfo("    wrote %s" % cssPath, quiet)
+    if show:
+        # load HTML page into the default web browser.
+        showpage(htmlPath)
+    return htmlPath
+
+def tagreplace(sourcestr, colors=lite, markup='xhtml', 
+               linenumbers=0, dosheet=1, tagstart='<PY>'.lower(),
+               tagend='</PY>'.lower(), stylesheet='pystyle.css'):
+    """This is a helper function for pageconvert. Returns css, page.
+    """
+    if markup.lower() != 'html':
+        link  = '<link rel="stylesheet" href="%s" type="text/css"/></head>'
+        css = link%stylesheet
+        if sourcestr.find(css) == -1:
+            sourcestr = sourcestr.replace('</head>', css, 1)
+    starttags = sourcestr.count(tagstart)
+    endtags = sourcestr.count(tagend)
+    if starttags:
+        if starttags == endtags:
+            for _ in range(starttags):
+               datastart = sourcestr.find(tagstart)
+               dataend = sourcestr.find(tagend)
+               data = sourcestr[datastart+len(tagstart):dataend]
+               data = unescape(data)
+               css , data = str2markup(data, colors=colors, 
+                         linenumbers=linenumbers, markup=markup, form='embed')
+               start = sourcestr[:datastart]
+               end = sourcestr[dataend+len(tagend):]
+               sourcestr =  ''.join([start,data,end])
+        else:
+            raise InputError,'Tag mismatch!\nCheck %s,%s tags'%tagstart,tagend
+    if not dosheet:
+        css = None
+    return css, sourcestr
+    
+def pageconvert(path, out=None, colors=lite, markup='xhtml', linenumbers=0,
+                  dosheet=1, tagstart='<PY>'.lower(), tagend='</PY>'.lower(),
+                  stylesheet='pystyle', show=1, returnstr=0):
+    """This function can colorize Python source
+
+       that is written in a webpage enclosed in tags.
+    """
+    if out == None:
+        out = os.path.dirname(path)
+    infile = open(path, 'r').read()
+    css,page  = tagreplace(sourcestr=infile,colors=colors, 
+                   markup=markup, linenumbers=linenumbers, dosheet=dosheet,
+                   tagstart=tagstart, tagend=tagend, stylesheet=stylesheet)
+    if not returnstr:
+        newpath = os.path.abspath(os.path.join(
+                  out,'tmp', os.path.basename(path)))
+        if not os.path.exists(newpath):
+            try:
+                os.makedirs(os.path.dirname(newpath))
+            except:
+                pass#traceback.print_exc()
+                #Usage()
+        y = open(newpath, 'w')
+        y.write(page)
+        y.close()
+        if css:
+            csspath = os.path.abspath(os.path.join(
+                      out,'tmp','%s.css'%stylesheet))
+            x = open(csspath,'w')
+            x.write(css)
+            x.close()
+        if show:
+            try:
+                os.startfile(newpath)
+            except:
+                traceback.print_exc()
+        return newpath
+    else:
+        return css, page
+
+##################################################################### helpers
+
+def walkdir(dir):
+    """Return a list of .py and .pyw files from a given directory.
+
+       This function can be written as a generator Python 2.3, or a genexp
+       in Python 2.4. But 2.2 and 2.1 would be left out....
+    """
+    # Get a list of files that match *.py*
+    GLOB_PATTERN = os.path.join(dir, "*.[p][y]*")
+    pathlist = glob.glob(GLOB_PATTERN)
+    # Now filter out all but py and pyw
+    filterlist = [x for x in pathlist
+                        if x.endswith('.py')
+                        or x.endswith('.pyw')]
+    if filterlist != []:
+        # if we have a list send it
+        return filterlist
+    else:
+        return None
+
+def showpage(path):
+    """Helper function to open webpages"""
+    try:
+        webbrowser.open_new(os.path.abspath(path))
+    except:
+        traceback.print_exc()
+
+def _printinfo(message, quiet):
+    """Helper to print messages"""
+    if not quiet:
+        print message
+
+def escape(text):
+     """escape text for html. similar to cgi.escape"""
+     text = text.replace("&", "&amp;")
+     text = text.replace("<", "&lt;")
+     text = text.replace(">", "&gt;")
+     return text
+
+def unescape(text):
+     """unsecape escaped text"""
+     text = text.replace("&quot;", '"')
+     text = text.replace("&gt;", ">")
+     text = text.replace("&lt;", "<")
+     text = text.replace("&amp;", "&")
+     return text
+
+########################################################### Custom Exceptions
+
+class PySourceColorError(Exception):
+    # Base for custom errors
+    def __init__(self, msg=''):
+        self._msg = msg
+        Exception.__init__(self, msg)
+    def __repr__(self):
+        return self._msg
+    __str__ = __repr__
+
+class PathError(PySourceColorError):
+    def __init__(self, msg):
+       PySourceColorError.__init__(self,
+         'Path error! : %s'% msg)
+
+class InputError(PySourceColorError):
+   def __init__(self, msg):
+       PySourceColorError.__init__(self,
+         'Input error! : %s'% msg)
+
+########################################################## Python code parser
+
+class Parser(object):
+
+    """MoinMoin python parser heavily chopped :)"""
+
+    def __init__(self, raw, colors=None, title='', out=sys.stdout,
+                   markup='html', header=None, footer=None, linenumbers=0):
+        """Store the source text & set some flags"""
+        if colors == None:
+            colors = defaultColors
+        self.raw = raw.expandtabs().rstrip()
+        self.title = os.path.basename(title)
+        self.out = out
+        self.line = ''
+        self.lasttext = ''
+        self.argFlag = 0
+        self.classFlag = 0
+        self.defFlag = 0
+        self.decoratorFlag = 0
+        self.external = 0
+        self.markup = markup.upper()
+        self.colors = colors
+        self.header = header
+        self.footer = footer
+        self.doArgs = 1 #  overrides the new tokens
+        self.doNames = 1 #  overrides the new tokens
+        self.doMathOps = 1 #  overrides the new tokens
+        self.doBrackets = 1 #  overrides the new tokens
+        self.doURL = 1 # override url conversion
+        self.LINENUMHOLDER = "___line___".upper()
+        self.LINESTART = "___start___".upper()
+        self.skip = 0
+        # add space left side of code for padding.Override in color dict.
+        self.extraspace = self.colors.get(EXTRASPACE, '')
+        # Linenumbers less then zero also have numberlinks
+        self.dolinenums = self.linenum = abs(linenumbers)
+        if linenumbers < 0:
+            self.numberlinks = 1
+        else:
+            self.numberlinks = 0
+
+    def format(self, form=None):
+        """Parse and send the colorized source"""
+        if form in ('snip','code'):
+            self.addEnds = 0
+        elif form == 'embed':
+            self.addEnds = 0
+            self.external = 1
+        else:
+            if form == 'external':
+                self.external = 1
+            self.addEnds = 1
+
+        # Store line offsets in self.lines
+        self.lines = [0, 0]
+        pos = 0
+
+        # Add linenumbers
+        if self.dolinenums:
+            start=self.LINENUMHOLDER+' '+self.extraspace
+        else:
+            start=''+self.extraspace
+        newlines = []
+        lines = self.raw.splitlines(0)
+        for l in lines:
+             # span and div escape for customizing and embedding raw text 
+             if (l.startswith('#$#')
+                  or l.startswith('#%#')
+                  or l.startswith('#@#')):   
+                newlines.append(l)
+             else:
+                # kludge for line spans in css,xhtml
+                if self.markup in ['XHTML','CSS']:
+                    newlines.append(self.LINESTART+' '+start+l)
+                else:
+                    newlines.append(start+l)
+        self.raw = "\n".join(newlines)+'\n'# plus an extra newline at the end
+
+        # Gather lines
+        while 1:
+            pos = self.raw.find('\n', pos) + 1
+            if not pos: break
+            self.lines.append(pos)
+        self.lines.append(len(self.raw))
+
+        # Wrap text in a filelike object
+        self.pos = 0
+        text = StringIO.StringIO(self.raw)
+        
+        # Markup start
+        if self.addEnds:
+            self._doPageStart()
+        else:
+            self._doSnippetStart()
+
+        ## Tokenize calls the __call__
+        ## function for each token till done.
+        # Parse the source and write out the results.
+        try:
+            tokenize.tokenize(text.readline, self)
+        except tokenize.TokenError, ex:
+            msg = ex[0]
+            line = ex[1][0]
+            self.out.write("<h3>ERROR: %s</h3>%s\n"%
+                            (msg, self.raw[self.lines[line]:]))
+            #traceback.print_exc()
+
+        # Markup end
+        if self.addEnds:
+            self._doPageEnd()
+        else:
+            self._doSnippetEnd()
+
+    def __call__(self, toktype, toktext, (srow,scol), (erow,ecol), line):
+        """Token handler. Order is important do not rearrange."""
+        self.line = line
+        # Calculate new positions
+        oldpos = self.pos
+        newpos = self.lines[srow] + scol
+        self.pos = newpos + len(toktext)
+        # Handle newlines
+        if toktype in (token.NEWLINE, tokenize.NL):
+            self.decoratorFlag = self.argFlag = 0
+            # kludge for line spans in css,xhtml
+            if self.markup in ['XHTML','CSS']:
+                self.out.write('</span>')
+            self.out.write('\n')
+            return
+
+        # Send the original whitespace, and tokenize backslashes if present.
+        # Tokenizer.py just sends continued line backslashes with whitespace.
+        # This is a hack to tokenize continued line slashes as operators.
+        # Should continued line backslashes be treated as operators
+        # or some other token?
+
+        if newpos > oldpos:
+            if self.raw[oldpos:newpos].isspace():
+                # consume a single space after linestarts and linenumbers
+                # had to have them so tokenizer could seperate them.
+                # multiline strings are handled by do_Text functions
+                if self.lasttext != self.LINESTART \
+                        and self.lasttext != self.LINENUMHOLDER:
+                    self.out.write(self.raw[oldpos:newpos])
+                else:
+                    self.out.write(self.raw[oldpos+1:newpos])
+            else:
+                slash = self.raw[oldpos:newpos].find('\\')+oldpos
+                self.out.write(self.raw[oldpos:slash])
+                getattr(self, '_send%sText'%(self.markup))(OPERATOR, '\\')
+                self.linenum+=1
+                # kludge for line spans in css,xhtml
+                if self.markup in ['XHTML','CSS']:
+                    self.out.write('</span>')
+                self.out.write(self.raw[slash+1:newpos])
+
+        # Skip indenting tokens
+        if toktype in (token.INDENT, token.DEDENT):
+            self.pos = newpos
+            return
+
+        # Look for operators
+        if token.LPAR <= toktype and toktype <= token.OP:
+            # Trap decorators py2.4 >
+            if toktext == '@':
+                toktype = DECORATOR
+                # Set a flag if this was the decorator start so
+                # the decorator name and arguments can be identified
+                self.decoratorFlag = self.argFlag = 1
+            else:
+                if self.doArgs:
+                    # Find the start for arguments
+                    if toktext == '(' and self.argFlag:
+                        self.argFlag = 2
+                    # Find the end for arguments
+                    elif toktext == ':':
+                        self.argFlag = 0
+                ## Seperate the diffrent operator types
+                # Brackets
+                if self.doBrackets and toktext in ['[',']','(',')','{','}']:
+                    toktype = BRACKETS
+                # Math operators 
+                elif self.doMathOps and toktext in ['*=','**=','-=','+=','|=',
+                                                      '%=','>>=','<<=','=','^=',
+                                                      '/=', '+','-','**','*','/','%']:
+                    toktype = MATH_OPERATOR
+                # Operator 
+                else:
+                    toktype = OPERATOR
+                    # example how flags should work.
+                    # def fun(arg=argvalue,arg2=argvalue2):
+                    # 0   1  2 A 1   N    2 A  1    N     0
+                    if toktext == "=" and self.argFlag == 2:
+                         self.argFlag = 1
+                    elif toktext == "," and self.argFlag == 1:
+                        self.argFlag = 2
+        # Look for keywords
+        elif toktype == NAME and keyword.iskeyword(toktext):
+            toktype = KEYWORD
+            # Set a flag if this was the class / def start so
+            # the class / def name and arguments can be identified
+            if toktext in ['class', 'def']:
+                if toktext =='class' and \
+                         not line[:line.find('class')].endswith('.'): 
+                    self.classFlag = self.argFlag = 1
+                elif toktext == 'def' and \
+                         not line[:line.find('def')].endswith('.'):
+                    self.defFlag = self.argFlag = 1
+                else:
+                    # must have used a keyword as a name i.e. self.class
+                    toktype = ERRORTOKEN 
+
+        # Look for class, def, decorator name
+        elif (self.classFlag or self.defFlag or self.decoratorFlag) \
+                and self.doNames:
+            if self.classFlag:
+                self.classFlag = 0
+                toktype = CLASS_NAME
+            elif self.defFlag:
+                self.defFlag = 0
+                toktype = DEF_NAME
+            elif self.decoratorFlag:
+                self.decoratorFlag = 0
+                toktype = DECORATOR_NAME
+
+        # Look for strings
+        # Order of evaluation is important do not change.
+        elif toktype == token.STRING:
+            text = toktext.lower()
+            # TRIPLE DOUBLE QUOTE's
+            if (text[:3] == '"""'):
+                toktype = TRIPLEDOUBLEQUOTE
+            elif (text[:4] == 'r"""'):
+                toktype = TRIPLEDOUBLEQUOTE_R
+            elif (text[:4] == 'u"""' or
+                   text[:5] == 'ur"""'):
+                toktype = TRIPLEDOUBLEQUOTE_U
+            # DOUBLE QUOTE's
+            elif (text[:1] == '"'):
+                toktype = DOUBLEQUOTE
+            elif (text[:2] == 'r"'):
+                toktype = DOUBLEQUOTE_R
+            elif (text[:2] == 'u"' or
+                   text[:3] == 'ur"'):
+                toktype = DOUBLEQUOTE_U
+            # TRIPLE SINGLE QUOTE's
+            elif (text[:3] == "'''"):
+                 toktype = TRIPLESINGLEQUOTE
+            elif (text[:4] == "r'''"):
+                toktype = TRIPLESINGLEQUOTE_R
+            elif (text[:4] == "u'''" or
+                   text[:5] == "ur'''"):
+                toktype = TRIPLESINGLEQUOTE_U
+            # SINGLE QUOTE's
+            elif (text[:1] == "'"):
+                toktype = SINGLEQUOTE
+            elif (text[:2] == "r'"):
+                toktype = SINGLEQUOTE_R
+            elif (text[:2] == "u'" or
+                   text[:3] == "ur'"):
+                toktype = SINGLEQUOTE_U
+
+            # test for invalid string declaration
+            if self.lasttext.lower() == 'ru':
+                toktype = ERRORTOKEN
+           
+        # Look for comments
+        elif toktype == COMMENT:
+            if toktext[:2] == "##":
+                toktype = DOUBLECOMMENT
+            elif toktext[:3] == '#$#':
+                toktype = TEXT
+                self.textFlag = 'SPAN'
+                toktext = toktext[3:]
+            elif toktext[:3] == '#%#':
+                toktype = TEXT
+                self.textFlag = 'DIV'
+                toktext = toktext[3:]
+            elif toktext[:3] == '#@#':
+                toktype = TEXT
+                self.textFlag = 'RAW'
+                toktext = toktext[3:]
+            if self.doURL:
+                # this is a 'fake helper function'
+                # url(URI,Alias_name) or url(URI)
+                url_pos = toktext.find('url(')
+                if url_pos != -1:
+                    before = toktext[:url_pos]
+                    url = toktext[url_pos+4:]
+                    splitpoint = url.find(',')
+                    endpoint = url.find(')')
+                    after = url[endpoint+1:]
+                    url = url[:endpoint]
+                    if splitpoint != -1:
+                        urlparts = url.split(',',1)
+                        toktext = '%s<a href="%s">%s</a>%s'%(
+                                   before,urlparts[0],urlparts[1].lstrip(),after) 
+                    else:
+                        toktext = '%s<a href="%s">%s</a>%s'%(before,url,url,after) 
+                        
+        # Seperate errors from decorators
+        elif toktype == ERRORTOKEN:
+            # Bug fix for < py2.4
+            # space between decorators
+            if self.argFlag and toktext.isspace():
+                #toktype = NAME
+                self.out.write(toktext)
+                return
+            # Bug fix for py2.2 linenumbers with decorators
+            elif toktext.isspace():
+                # What if we have a decorator after a >>> or ...
+                #p = line.find('@')
+                #if p >= 0 and not line[:p].isspace():
+                    #self.out.write(toktext)
+                    #return
+                if self.skip:
+                    self.skip=0
+                    return
+                else:           
+                    self.out.write(toktext)
+                    return
+            # trap decorators < py2.4
+            elif toktext == '@':
+                toktype = DECORATOR
+                # Set a flag if this was the decorator start so
+                # the decorator name and arguments can be identified
+                self.decoratorFlag = self.argFlag = 1
+
+        # Seperate args from names
+        elif (self.argFlag == 2 and
+              toktype == NAME and
+              toktext != 'None' and
+              self.doArgs):
+            toktype = ARGS
+
+        # Look for line numbers
+        # The conversion code for them is in the send_text functions.
+        if toktext in [self.LINENUMHOLDER,self.LINESTART]:
+            toktype = LINENUMBER
+            # if we don't have linenumbers set flag
+            # to skip the trailing space from linestart
+            if toktext == self.LINESTART and not self.dolinenums \
+                                or toktext == self.LINENUMHOLDER:
+                self.skip=1
+
+
+        # Skip blank token that made it thru
+        ## bugfix for the last empty tag.
+        if toktext == '':
+            return
+
+        # Last token text history
+        self.lasttext = toktext
+        
+        # escape all but the urls in the comments
+        if toktype in (DOUBLECOMMENT, COMMENT):
+            if toktext.find('<a href=') == -1:
+                toktext = escape(toktext)
+            else:
+                pass
+        elif toktype == TEXT:
+            pass
+        else:
+            toktext = escape(toktext)
+
+        # Send text for any markup
+        getattr(self, '_send%sText'%(self.markup))(toktype, toktext)
+        return
+
+    ################################################################# Helpers
+
+    def _doSnippetStart(self):
+        if self.markup == 'HTML':
+            # Start of html snippet
+            self.out.write('<pre>\n')
+        else:
+            # Start of css/xhtml snippet
+            self.out.write(self.colors.get(CODESTART,'<pre class="py">\n'))
+
+    def _doSnippetEnd(self):
+        # End of html snippet
+        self.out.write(self.colors.get(CODEEND,'</pre>\n'))
+
+    ######################################################## markup selectors
+
+    def _getFile(self, filepath): 
+        try:
+            _file = open(filepath,'r')
+            content = _file.read()
+            _file.close()
+        except:
+            traceback.print_exc()
+            content = ''
+        return content
+
+    def _doPageStart(self):
+        getattr(self, '_do%sStart'%(self.markup))()
+
+    def _doPageHeader(self):
+        if self.header != None:
+            if self.header.find('#$#') != -1 or \
+                self.header.find('#$#') != -1 or \
+                self.header.find('#%#') != -1:
+                self.out.write(self.header[3:])
+            else:
+                if self.header != '':
+                    self.header = self._getFile(self.header)
+                getattr(self, '_do%sHeader'%(self.markup))()
+
+    def _doPageFooter(self):
+        if self.footer != None:
+            if self.footer.find('#$#') != -1 or \
+                self.footer.find('#@#') != -1 or \
+                self.footer.find('#%#') != -1:
+                self.out.write(self.footer[3:])
+            else:
+                if self.footer != '':
+                    self.footer = self._getFile(self.footer)
+                getattr(self, '_do%sFooter'%(self.markup))()
+
+    def _doPageEnd(self):
+        getattr(self, '_do%sEnd'%(self.markup))()
+
+    ################################################### color/style retrieval
+    ## Some of these are not used anymore but are kept for documentation
+
+    def _getLineNumber(self):
+        num = self.linenum
+        self.linenum+=1
+        return  str(num).rjust(5)+" "
+
+    def _getTags(self, key):
+        # style tags
+        return self.colors.get(key, self.colors[NAME])[0]
+
+    def _getForeColor(self, key):
+        # get text foreground color, if not set to black
+        color = self.colors.get(key, self.colors[NAME])[1]
+        if color[:1] != '#':
+            color = '#000000'
+        return color
+
+    def _getBackColor(self, key):
+        # get text background color
+        return self.colors.get(key, self.colors[NAME])[2]
+
+    def _getPageColor(self):
+        # get page background color
+        return self.colors.get(PAGEBACKGROUND, '#FFFFFF')
+
+    def _getStyle(self, key):
+        # get the token style from the color dictionary
+        return self.colors.get(key, self.colors[NAME])
+
+    def _getMarkupClass(self, key):
+        # get the markup class name from the markup dictionary
+        return MARKUPDICT.get(key, MARKUPDICT[NAME])
+
+    def _getDocumentCreatedBy(self):
+        return '<!--This document created by %s ver.%s on: %s-->\n'%(
+                  __title__,__version__,time.ctime())
+
+    ################################################### HTML markup functions
+
+    def _doHTMLStart(self):
+        # Start of html page
+        self.out.write('<!DOCTYPE html PUBLIC \
+"-//W3C//DTD HTML 4.01//EN">\n')
+        self.out.write('<html><head><title>%s</title>\n'%(self.title))
+        self.out.write(self._getDocumentCreatedBy())
+        self.out.write('<meta http-equiv="Content-Type" \
+content="text/html;charset=iso-8859-1">\n')
+        # Get background
+        self.out.write('</head><body bgcolor="%s">\n'%self._getPageColor())
+        self._doPageHeader()
+        self.out.write('<pre>')
+
+    def _getHTMLStyles(self, toktype, toktext):
+        # Get styles
+        tags, color = self.colors.get(toktype, self.colors[NAME])[:2]#
+        tagstart=[]
+        tagend=[]
+        # check for styles and set them if needed.
+        if 'b' in tags:#Bold
+            tagstart.append('<b>')
+            tagend.append('</b>')
+        if 'i' in tags:#Italics
+            tagstart.append('<i>')
+            tagend.append('</i>')
+        if 'u' in tags:#Underline
+            tagstart.append('<u>')
+            tagend.append('</u>')
+        # HTML tags should be paired like so : <b><i><u>Doh!</u></i></b>
+        tagend.reverse()
+        starttags="".join(tagstart)
+        endtags="".join(tagend)
+        return starttags,endtags,color
+
+    def _sendHTMLText(self, toktype, toktext):
+        numberlinks = self.numberlinks
+        
+        # If it is an error, set a red box around the bad tokens
+        # older browsers should ignore it
+        if toktype == ERRORTOKEN:
+            style = ' style="border: solid 1.5pt #FF0000;"'
+        else:
+            style = ''
+        # Get styles
+        starttag, endtag, color = self._getHTMLStyles(toktype, toktext)
+        # This is a hack to 'fix' multi-line  strings.
+        # Multi-line strings are treated as only one token 
+        # even though they can be several physical lines.
+        # That makes it hard to spot the start of a line,
+        # because at this level all we know about are tokens.
+        
+        if toktext.count(self.LINENUMHOLDER):
+            # rip apart the string and separate it by line.
+            # count lines and change all linenum token to line numbers.
+            # embedded all the new font tags inside the current one.
+            # Do this by ending the tag first then writing our new tags,
+            # then starting another font tag exactly like the first one.
+            if toktype == LINENUMBER:
+                splittext = toktext.split(self.LINENUMHOLDER)
+            else:    
+                splittext = toktext.split(self.LINENUMHOLDER+' ')
+            store = []
+            store.append(splittext.pop(0))
+            lstarttag, lendtag, lcolor = self._getHTMLStyles(LINENUMBER, toktext)
+            count = len(splittext)
+            for item in splittext:
+                num =  self._getLineNumber()
+                if numberlinks:
+                    numstrip = num.strip()
+                    content = '<a name="%s" href="#%s">%s</a>' \
+                              %(numstrip,numstrip,num)
+                else:
+                    content = num
+                if count <= 1:
+                    endtag,starttag = '',''
+                linenumber = ''.join([endtag,'<font color=', lcolor, '>',
+                            lstarttag, content, lendtag, '</font>' ,starttag])
+                store.append(linenumber+item)
+            toktext = ''.join(store)
+        # send text
+        ## Output optimization
+        # skip font tag if black text, but styles will still be sent. (b,u,i)
+        if color !='#000000':
+            startfont = '<font color="%s"%s>'%(color, style)
+            endfont = '</font>'
+        else:
+            startfont, endfont = ('','')
+        if toktype != LINENUMBER:
+            self.out.write(''.join([startfont,starttag,
+                                     toktext,endtag,endfont]))
+        else:
+            self.out.write(toktext)
+        return
+
+    def _doHTMLHeader(self):
+        # Optional
+        if self.header != '':
+            self.out.write('%s\n'%self.header)
+        else:
+            color = self._getForeColor(NAME)
+            self.out.write('<b><font color="%s"># %s \
+                            <br># %s</font></b><hr>\n'%
+                           (color, self.title, time.ctime()))
+
+    def _doHTMLFooter(self):
+        # Optional
+        if self.footer != '':
+            self.out.write('%s\n'%self.footer)
+        else:
+            color = self._getForeColor(NAME)
+            self.out.write('<b><font color="%s"> \
+                            <hr># %s<br># %s</font></b>\n'%
+                           (color, self.title, time.ctime()))
+
+    def _doHTMLEnd(self):
+        # End of html page
+        self.out.write('</pre>\n')
+        # Write a little info at the bottom
+        self._doPageFooter()
+        self.out.write('</body></html>\n')
+
+    #################################################### CSS markup functions
+
+    def _getCSSStyle(self, key):
+        # Get the tags and colors from the dictionary
+        tags, forecolor, backcolor = self._getStyle(key)
+        style=[]
+        border = None
+        bordercolor = None
+        tags = tags.lower()
+        if tags:
+            # get the border color if specified
+            # the border color will be appended to
+            # the list after we define a border
+            if '#' in tags:# border color 
+                start = tags.find('#')
+                end = start + 7
+                bordercolor = tags[start:end]
+                tags.replace(bordercolor,'',1)
+            # text styles
+            if 'b' in tags:# Bold
+                style.append('font-weight:bold;')
+            else:
+                style.append('font-weight:normal;')    
+            if 'i' in tags:# Italic
+                style.append('font-style:italic;')
+            if 'u' in tags:# Underline
+                style.append('text-decoration:underline;')
+            # border size
+            if 'l' in tags:# thick border
+                size='thick'
+            elif 'm' in tags:# medium border
+                size='medium'
+            elif 't' in tags:# thin border
+                size='thin'
+            else:# default
+                size='medium'
+            # border styles
+            if 'n' in tags:# inset border
+                border='inset'
+            elif 'o' in tags:# outset border
+                border='outset'
+            elif 'r' in tags:# ridge border
+                border='ridge'
+            elif 'g' in tags:# groove border
+                border='groove'
+            elif '=' in tags:# double border
+                border='double'
+            elif '.' in tags:# dotted border
+                border='dotted'
+            elif '-' in tags:# dashed border
+                border='dashed'
+            elif 's' in tags:# solid border 
+                border='solid'
+            # border type check
+            seperate_sides=0
+            for side in ['<','>','^','v']:
+                if side in tags:
+                    seperate_sides+=1
+            # border box or seperate sides
+            if seperate_sides==0 and border:
+                    style.append('border: %s %s;'%(border,size))
+            else:
+                if border == None:
+                   border = 'solid'
+                if 'v' in tags:# bottom border
+                    style.append('border-bottom:%s %s;'%(border,size))
+                if '<' in tags:# left border
+                    style.append('border-left:%s %s;'%(border,size))
+                if '>' in tags:# right border
+                    style.append('border-right:%s %s;'%(border,size))
+                if '^' in tags:# top border
+                    style.append('border-top:%s %s;'%(border,size))
+        else:
+            style.append('font-weight:normal;')# css inherited style fix    
+        # we have to define our borders before we set colors
+        if bordercolor:
+            style.append('border-color:%s;'%bordercolor)
+        # text forecolor  
+        style.append('color:%s;'% forecolor)
+        # text backcolor
+        if backcolor:
+            style.append('background-color:%s;'%backcolor)
+        return (self._getMarkupClass(key),' '.join(style))
+
+    def _sendCSSStyle(self, external=0):
+        """ create external and internal style sheets"""
+        styles = []
+        external += self.external
+        if not external:
+            styles.append('<style type="text/css">\n<!--\n')
+        # Get page background color and write styles ignore any we don't know
+        styles.append('body { background:%s; }\n'%self._getPageColor())
+        # write out the various css styles
+        for key in MARKUPDICT:
+            styles.append('.%s { %s }\n'%self._getCSSStyle(key))
+        # If you want to style the pre tag you must modify the color dict.
+        #  Example: 
+        #  lite[PY] = .py {border: solid thin #000000;background:#555555}\n''' 
+        styles.append(self.colors.get(PY, '.py { }\n'))
+        # Extra css can be added here
+        # add CSSHOOK to the color dict if you need it.
+        # Example: 
+        #lite[CSSHOOK] = """.mytag { border: solid thin #000000; } \n
+        #                   .myothertag { font-weight:bold; )\n"""
+        styles.append(self.colors.get(CSSHOOK,''))
+        if not self.external:
+             styles.append('--></style>\n')
+        return ''.join(styles)
+
+    def _doCSSStart(self):
+        # Start of css/html 4.01 page
+        self.out.write('<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">\n')
+        self.out.write('<html><head><title>%s</title>\n'%(self.title))
+        self.out.write(self._getDocumentCreatedBy())
+        self.out.write('<meta http-equiv="Content-Type" \
+content="text/html;charset=iso-8859-1">\n')
+        self._doCSSStyleSheet()
+        self.out.write('</head>\n<body>\n')
+        # Write a little info at the top.
+        self._doPageHeader()
+        self.out.write(self.colors.get(CODESTART,'<pre class="py">\n'))
+        return
+
+    def _doCSSStyleSheet(self):
+        if not self.external:
+            # write an embedded style sheet
+            self.out.write(self._sendCSSStyle())
+        else:
+            # write a link to an external style sheet
+            self.out.write('<link rel="stylesheet" \
+href="pystyle.css" type="text/css">')
+        return
+
+    def _sendCSSText(self, toktype, toktext):
+        # This is a hack to 'fix' multi-line strings.
+        # Multi-line strings are treated as only one token 
+        # even though they can be several physical lines.
+        # That makes it hard to spot the start of a line,
+        # because at this level all we know about are tokens.
+        markupclass = MARKUPDICT.get(toktype, MARKUPDICT[NAME])
+        # if it is a LINENUMBER type then we can skip the rest
+        if toktext == self.LINESTART and toktype == LINENUMBER:
+            self.out.write('<span class="py_line">')
+            return
+        if toktext.count(self.LINENUMHOLDER):
+            # rip apart the string and separate it by line
+            # count lines and change all linenum token to line numbers
+            # also convert linestart and lineend tokens
+            # <linestart> <lnumstart> lnum <lnumend> text <lineend>
+            #################################################
+            newmarkup = MARKUPDICT.get(LINENUMBER, MARKUPDICT[NAME])
+            lstartspan = '<span class="%s">'%(newmarkup)
+            if toktype == LINENUMBER:
+                splittext = toktext.split(self.LINENUMHOLDER)
+            else:    
+                splittext = toktext.split(self.LINENUMHOLDER+' ')
+            store = []
+            # we have already seen the first linenumber token
+            # so we can skip the first one
+            store.append(splittext.pop(0))
+            for item in splittext:
+                num = self._getLineNumber()
+                if self.numberlinks:
+                    numstrip = num.strip()
+                    content= '<a name="%s" href="#%s">%s</a>' \
+                              %(numstrip,numstrip,num)
+                else:
+                    content = num
+                linenumber= ''.join([lstartspan,content,'</span>'])
+                store.append(linenumber+item)
+            toktext = ''.join(store)
+        if toktext.count(self.LINESTART):
+            # wraps the textline in a line span
+            # this adds a lot of kludges, is it really worth it?
+            store = []
+            parts = toktext.split(self.LINESTART+' ')
+            # handle the first part differently
+            # the whole token gets wraqpped in a span later on
+            first = parts.pop(0)
+            # place spans before the newline
+            pos = first.rfind('\n')
+            if pos != -1:
+                first=first[:pos]+'</span></span>'+first[pos:]
+            store.append(first)
+            #process the rest of the string
+            for item in parts:
+                #handle line numbers if present
+                if self.dolinenums:
+                    item = item.replace('</span>',
+                           '</span><span class="%s">'%(markupclass))
+                else:
+                    item = '<span class="%s">%s'%(markupclass,item)
+                # add endings for line and string tokens
+                pos = item.rfind('\n')
+                if pos != -1:
+                    item=item[:pos]+'</span></span>\n'
+                store.append(item)
+            # add start tags for lines
+            toktext = '<span class="py_line">'.join(store)
+        # Send text
+        if toktype != LINENUMBER:
+            if toktype == TEXT and self.textFlag == 'DIV':
+                startspan = '<div class="%s">'%(markupclass)
+                endspan = '</div>'
+            elif toktype == TEXT and self.textFlag == 'RAW': 
+                startspan,endspan = ('','')
+            else:
+                startspan = '<span class="%s">'%(markupclass)
+                endspan = '</span>'
+            self.out.write(''.join([startspan, toktext, endspan]))
+        else:
+            self.out.write(toktext)
+        return
+
+    def _doCSSHeader(self):
+        if self.header != '':
+            self.out.write('%s\n'%self.header)
+        else:
+            name = MARKUPDICT.get(NAME)
+            self.out.write('<div class="%s"># %s <br> \
+# %s</div><hr>\n'%(name, self.title, time.ctime()))
+
+    def _doCSSFooter(self):
+        # Optional
+        if self.footer != '':
+            self.out.write('%s\n'%self.footer)
+        else:
+            self.out.write('<hr><div class="%s"># %s <br> \
+# %s</div>\n'%(MARKUPDICT.get(NAME),self.title, time.ctime()))
+
+    def _doCSSEnd(self):
+        # End of css/html page
+        self.out.write(self.colors.get(CODEEND,'</pre>\n'))
+        # Write a little info at the bottom
+        self._doPageFooter()
+        self.out.write('</body></html>\n')
+        return
+
+    ################################################## XHTML markup functions
+
+    def _doXHTMLStart(self):
+        # XHTML is really just XML + HTML 4.01.
+        # We only need to change the page headers, 
+        # and a few tags to get valid XHTML.
+        # Start of xhtml page
+        self.out.write('<?xml version="1.0"?>\n \
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"\n \
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\n \
+<html xmlns="http://www.w3.org/1999/xhtml">\n')
+        self.out.write('<head><title>%s</title>\n'%(self.title))
+        self.out.write(self._getDocumentCreatedBy())
+        self.out.write('<meta http-equiv="Content-Type" \
+content="text/html;charset=iso-8859-1"/>\n')
+        self._doXHTMLStyleSheet()
+        self.out.write('</head>\n<body>\n')
+        # Write a little info at the top.
+        self._doPageHeader()
+        self.out.write(self.colors.get(CODESTART,'<pre class="py">\n'))
+        return
+
+    def _doXHTMLStyleSheet(self):
+        if not self.external:
+            # write an embedded style sheet
+            self.out.write(self._sendCSSStyle())
+        else:
+            # write a link to an external style sheet
+            self.out.write('<link rel="stylesheet" \
+href="pystyle.css" type="text/css"/>\n')
+        return
+
+    def _sendXHTMLText(self, toktype, toktext):
+        self._sendCSSText(toktype, toktext)
+
+    def _doXHTMLHeader(self):
+        # Optional
+        if self.header:
+            self.out.write('%s\n'%self.header)
+        else:
+            name = MARKUPDICT.get(NAME)
+            self.out.write('<div class="%s"># %s <br/> \
+# %s</div><hr/>\n '%(
+            name, self.title, time.ctime()))
+
+    def _doXHTMLFooter(self):
+        # Optional
+        if self.footer:
+            self.out.write('%s\n'%self.footer)
+        else:
+            self.out.write('<hr/><div class="%s"># %s <br/> \
+# %s</div>\n'%(MARKUPDICT.get(NAME), self.title, time.ctime()))
+
+    def _doXHTMLEnd(self):
+        self._doCSSEnd()
+
+#############################################################################
+
+if __name__ == '__main__':
+    cli()
+
+#############################################################################
+# PySourceColor.py
+# 2004, 2005 M.E.Farmer Jr.
+# Python license
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/finddata.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/finddata.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/finddata.py (revision 3)
@@ -0,0 +1,99 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+# Note: you may want to copy this into your setup.py file verbatim, as
+# you can't import this from another package, when you don't know if
+# that package is installed yet.
+
+import os
+import sys
+from fnmatch import fnmatchcase
+from distutils.util import convert_path
+
+# Provided as an attribute, so you can append to these instead
+# of replicating them:
+standard_exclude = ('*.py', '*.pyc', '*~', '.*', '*.bak')
+standard_exclude_directories = ('.*', 'CVS', '_darcs', './build',
+                                './dist', 'EGG-INFO', '*.egg-info')
+
+def find_package_data(
+    where='.', package='',
+    exclude=standard_exclude,
+    exclude_directories=standard_exclude_directories,
+    only_in_packages=True,
+    show_ignored=False):
+    """
+    Return a dictionary suitable for use in ``package_data``
+    in a distutils ``setup.py`` file.
+
+    The dictionary looks like::
+
+        {'package': [files]}
+
+    Where ``files`` is a list of all the files in that package that
+    don't match anything in ``exclude``.
+
+    If ``only_in_packages`` is true, then top-level directories that
+    are not packages won't be included (but directories under packages
+    will).
+
+    Directories matching any pattern in ``exclude_directories`` will
+    be ignored; by default directories with leading ``.``, ``CVS``,
+    and ``_darcs`` will be ignored.
+
+    If ``show_ignored`` is true, then all the files that aren't
+    included in package data are shown on stderr (for debugging
+    purposes).
+
+    Note patterns use wildcards, or can be exact paths (including
+    leading ``./``), and all searching is case-insensitive.
+    """
+    
+    out = {}
+    stack = [(convert_path(where), '', package, only_in_packages)]
+    while stack:
+        where, prefix, package, only_in_packages = stack.pop(0)
+        for name in os.listdir(where):
+            fn = os.path.join(where, name)
+            if os.path.isdir(fn):
+                bad_name = False
+                for pattern in exclude_directories:
+                    if (fnmatchcase(name, pattern)
+                        or fn.lower() == pattern.lower()):
+                        bad_name = True
+                        if show_ignored:
+                            print >> sys.stderr, (
+                                "Directory %s ignored by pattern %s"
+                                % (fn, pattern))
+                        break
+                if bad_name:
+                    continue
+                if (os.path.isfile(os.path.join(fn, '__init__.py'))
+                    and not prefix):
+                    if not package:
+                        new_package = name
+                    else:
+                        new_package = package + '.' + name
+                    stack.append((fn, '', new_package, False))
+                else:
+                    stack.append((fn, prefix + name + '/', package, only_in_packages))
+            elif package or not only_in_packages:
+                # is a file
+                bad_name = False
+                for pattern in exclude:
+                    if (fnmatchcase(name, pattern)
+                        or fn.lower() == pattern.lower()):
+                        bad_name = True
+                        if show_ignored:
+                            print >> sys.stderr, (
+                                "File %s ignored by pattern %s"
+                                % (fn, pattern))
+                        break
+                if bad_name:
+                    continue
+                out.setdefault(package, []).append(prefix+name)
+    return out
+
+if __name__ == '__main__':
+    import pprint
+    pprint.pprint(
+        find_package_data(show_ignored=True))
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/doctest24.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/doctest24.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/doctest24.py (revision 3)
@@ -0,0 +1,2665 @@
+# Module doctest.
+# Released to the public domain 16-Jan-2001, by Tim Peters (tim@python.org).
+# Major enhancements and refactoring by:
+#     Jim Fulton
+#     Edward Loper
+
+# Provided as-is; use at your own risk; no warranty; no promises; enjoy!
+
+r"""Module doctest -- a framework for running examples in docstrings.
+
+In simplest use, end each module M to be tested with:
+
+def _test():
+    import doctest
+    doctest.testmod()
+
+if __name__ == "__main__":
+    _test()
+
+Then running the module as a script will cause the examples in the
+docstrings to get executed and verified:
+
+python M.py
+
+This won't display anything unless an example fails, in which case the
+failing example(s) and the cause(s) of the failure(s) are printed to stdout
+(why not stderr? because stderr is a lame hack <0.2 wink>), and the final
+line of output is "Test failed.".
+
+Run it with the -v switch instead:
+
+python M.py -v
+
+and a detailed report of all examples tried is printed to stdout, along
+with assorted summaries at the end.
+
+You can force verbose mode by passing "verbose=True" to testmod, or prohibit
+it by passing "verbose=False".  In either of those cases, sys.argv is not
+examined by testmod.
+
+There are a variety of other ways to run doctests, including integration
+with the unittest framework, and support for running non-Python text
+files containing doctests.  There are also many ways to override parts
+of doctest's default behaviors.  See the Library Reference Manual for
+details.
+"""
+
+__docformat__ = 'reStructuredText en'
+
+__all__ = [
+    # 0, Option Flags
+    'register_optionflag',
+    'DONT_ACCEPT_TRUE_FOR_1',
+    'DONT_ACCEPT_BLANKLINE',
+    'NORMALIZE_WHITESPACE',
+    'ELLIPSIS',
+    'IGNORE_EXCEPTION_DETAIL',
+    'COMPARISON_FLAGS',
+    'REPORT_UDIFF',
+    'REPORT_CDIFF',
+    'REPORT_NDIFF',
+    'REPORT_ONLY_FIRST_FAILURE',
+    'REPORTING_FLAGS',
+    # 1. Utility Functions
+    'is_private',
+    # 2. Example & DocTest
+    'Example',
+    'DocTest',
+    # 3. Doctest Parser
+    'DocTestParser',
+    # 4. Doctest Finder
+    'DocTestFinder',
+    # 5. Doctest Runner
+    'DocTestRunner',
+    'OutputChecker',
+    'DocTestFailure',
+    'UnexpectedException',
+    'DebugRunner',
+    # 6. Test Functions
+    'testmod',
+    'testfile',
+    'run_docstring_examples',
+    # 7. Tester
+    'Tester',
+    # 8. Unittest Support
+    'DocTestSuite',
+    'DocFileSuite',
+    'set_unittest_reportflags',
+    # 9. Debugging Support
+    'script_from_examples',
+    'testsource',
+    'debug_src',
+    'debug',
+]
+
+import __future__
+
+import sys, traceback, inspect, linecache, os, re, types
+import unittest, difflib, pdb, tempfile
+import warnings
+from StringIO import StringIO
+
+# Don't whine about the deprecated is_private function in this
+# module's tests.
+warnings.filterwarnings("ignore", "is_private", DeprecationWarning,
+                        __name__, 0)
+
+# There are 4 basic classes:
+#  - Example: a <source, want> pair, plus an intra-docstring line number.
+#  - DocTest: a collection of examples, parsed from a docstring, plus
+#    info about where the docstring came from (name, filename, lineno).
+#  - DocTestFinder: extracts DocTests from a given object's docstring and
+#    its contained objects' docstrings.
+#  - DocTestRunner: runs DocTest cases, and accumulates statistics.
+#
+# So the basic picture is:
+#
+#                             list of:
+# +------+                   +---------+                   +-------+
+# |object| --DocTestFinder-> | DocTest | --DocTestRunner-> |results|
+# +------+                   +---------+                   +-------+
+#                            | Example |
+#                            |   ...   |
+#                            | Example |
+#                            +---------+
+
+# Option constants.
+
+OPTIONFLAGS_BY_NAME = {}
+def register_optionflag(name):
+    flag = 1 << len(OPTIONFLAGS_BY_NAME)
+    OPTIONFLAGS_BY_NAME[name] = flag
+    return flag
+
+DONT_ACCEPT_TRUE_FOR_1 = register_optionflag('DONT_ACCEPT_TRUE_FOR_1')
+DONT_ACCEPT_BLANKLINE = register_optionflag('DONT_ACCEPT_BLANKLINE')
+NORMALIZE_WHITESPACE = register_optionflag('NORMALIZE_WHITESPACE')
+ELLIPSIS = register_optionflag('ELLIPSIS')
+IGNORE_EXCEPTION_DETAIL = register_optionflag('IGNORE_EXCEPTION_DETAIL')
+
+COMPARISON_FLAGS = (DONT_ACCEPT_TRUE_FOR_1 |
+                    DONT_ACCEPT_BLANKLINE |
+                    NORMALIZE_WHITESPACE |
+                    ELLIPSIS |
+                    IGNORE_EXCEPTION_DETAIL)
+
+REPORT_UDIFF = register_optionflag('REPORT_UDIFF')
+REPORT_CDIFF = register_optionflag('REPORT_CDIFF')
+REPORT_NDIFF = register_optionflag('REPORT_NDIFF')
+REPORT_ONLY_FIRST_FAILURE = register_optionflag('REPORT_ONLY_FIRST_FAILURE')
+
+REPORTING_FLAGS = (REPORT_UDIFF |
+                   REPORT_CDIFF |
+                   REPORT_NDIFF |
+                   REPORT_ONLY_FIRST_FAILURE)
+
+# Special string markers for use in `want` strings:
+BLANKLINE_MARKER = '<BLANKLINE>'
+ELLIPSIS_MARKER = '...'
+
+######################################################################
+## Table of Contents
+######################################################################
+#  1. Utility Functions
+#  2. Example & DocTest -- store test cases
+#  3. DocTest Parser -- extracts examples from strings
+#  4. DocTest Finder -- extracts test cases from objects
+#  5. DocTest Runner -- runs test cases
+#  6. Test Functions -- convenient wrappers for testing
+#  7. Tester Class -- for backwards compatibility
+#  8. Unittest Support
+#  9. Debugging Support
+# 10. Example Usage
+
+######################################################################
+## 1. Utility Functions
+######################################################################
+
+def is_private(prefix, base):
+    """prefix, base -> true iff name prefix + "." + base is "private".
+
+    Prefix may be an empty string, and base does not contain a period.
+    Prefix is ignored (although functions you write conforming to this
+    protocol may make use of it).
+    Return true iff base begins with an (at least one) underscore, but
+    does not both begin and end with (at least) two underscores.
+
+    >>> is_private("a.b", "my_func")
+    False
+    >>> is_private("____", "_my_func")
+    True
+    >>> is_private("someclass", "__init__")
+    False
+    >>> is_private("sometypo", "__init_")
+    True
+    >>> is_private("x.y.z", "_")
+    True
+    >>> is_private("_x.y.z", "__")
+    False
+    >>> is_private("", "")  # senseless but consistent
+    False
+    """
+    warnings.warn("is_private is deprecated; it wasn't useful; "
+                  "examine DocTestFinder.find() lists instead",
+                  DeprecationWarning, stacklevel=2)
+    return base[:1] == "_" and not base[:2] == "__" == base[-2:]
+
+def _extract_future_flags(globs):
+    """
+    Return the compiler-flags associated with the future features that
+    have been imported into the given namespace (globs).
+    """
+    flags = 0
+    for fname in __future__.all_feature_names:
+        feature = globs.get(fname, None)
+        if feature is getattr(__future__, fname):
+            flags |= feature.compiler_flag
+    return flags
+
+def _normalize_module(module, depth=2):
+    """
+    Return the module specified by `module`.  In particular:
+      - If `module` is a module, then return module.
+      - If `module` is a string, then import and return the
+        module with that name.
+      - If `module` is None, then return the calling module.
+        The calling module is assumed to be the module of
+        the stack frame at the given depth in the call stack.
+    """
+    if inspect.ismodule(module):
+        return module
+    elif isinstance(module, (str, unicode)):
+        return __import__(module, globals(), locals(), ["*"])
+    elif module is None:
+        return sys.modules[sys._getframe(depth).f_globals['__name__']]
+    else:
+        raise TypeError("Expected a module, string, or None")
+
+def _indent(s, indent=4):
+    """
+    Add the given number of space characters to the beginning every
+    non-blank line in `s`, and return the result.
+    """
+    # This regexp matches the start of non-blank lines:
+    return re.sub('(?m)^(?!$)', indent*' ', s)
+
+def _exception_traceback(exc_info):
+    """
+    Return a string containing a traceback message for the given
+    exc_info tuple (as returned by sys.exc_info()).
+    """
+    # Get a traceback message.
+    excout = StringIO()
+    exc_type, exc_val, exc_tb = exc_info
+    traceback.print_exception(exc_type, exc_val, exc_tb, file=excout)
+    return excout.getvalue()
+
+# Override some StringIO methods.
+class _SpoofOut(StringIO):
+    def getvalue(self):
+        result = StringIO.getvalue(self)
+        # If anything at all was written, make sure there's a trailing
+        # newline.  There's no way for the expected output to indicate
+        # that a trailing newline is missing.
+        if result and not result.endswith("\n"):
+            result += "\n"
+        # Prevent softspace from screwing up the next test case, in
+        # case they used print with a trailing comma in an example.
+        if hasattr(self, "softspace"):
+            del self.softspace
+        return result
+
+    def truncate(self,   size=None):
+        StringIO.truncate(self, size)
+        if hasattr(self, "softspace"):
+            del self.softspace
+
+# Worst-case linear-time ellipsis matching.
+def _ellipsis_match(want, got):
+    """
+    Essentially the only subtle case:
+    >>> _ellipsis_match('aa...aa', 'aaa')
+    False
+    """
+    if ELLIPSIS_MARKER not in want:
+        return want == got
+
+    # Find "the real" strings.
+    ws = want.split(ELLIPSIS_MARKER)
+    assert len(ws) >= 2
+
+    # Deal with exact matches possibly needed at one or both ends.
+    startpos, endpos = 0, len(got)
+    w = ws[0]
+    if w:   # starts with exact match
+        if got.startswith(w):
+            startpos = len(w)
+            del ws[0]
+        else:
+            return False
+    w = ws[-1]
+    if w:   # ends with exact match
+        if got.endswith(w):
+            endpos -= len(w)
+            del ws[-1]
+        else:
+            return False
+
+    if startpos > endpos:
+        # Exact end matches required more characters than we have, as in
+        # _ellipsis_match('aa...aa', 'aaa')
+        return False
+
+    # For the rest, we only need to find the leftmost non-overlapping
+    # match for each piece.  If there's no overall match that way alone,
+    # there's no overall match period.
+    for w in ws:
+        # w may be '' at times, if there are consecutive ellipses, or
+        # due to an ellipsis at the start or end of `want`.  That's OK.
+        # Search for an empty string succeeds, and doesn't change startpos.
+        startpos = got.find(w, startpos, endpos)
+        if startpos < 0:
+            return False
+        startpos += len(w)
+
+    return True
+
+def _comment_line(line):
+    "Return a commented form of the given line"
+    line = line.rstrip()
+    if line:
+        return '# '+line
+    else:
+        return '#'
+
+class _OutputRedirectingPdb(pdb.Pdb):
+    """
+    A specialized version of the python debugger that redirects stdout
+    to a given stream when interacting with the user.  Stdout is *not*
+    redirected when traced code is executed.
+    """
+    def __init__(self, out):
+        self.__out = out
+        pdb.Pdb.__init__(self)
+
+    def trace_dispatch(self, *args):
+        # Redirect stdout to the given stream.
+        save_stdout = sys.stdout
+        sys.stdout = self.__out
+        # Call Pdb's trace dispatch method.
+        try:
+            return pdb.Pdb.trace_dispatch(self, *args)
+        finally:
+            sys.stdout = save_stdout
+
+# [XX] Normalize with respect to os.path.pardir?
+def _module_relative_path(module, path):
+    if not inspect.ismodule(module):
+        raise TypeError, 'Expected a module: %r' % module
+    if path.startswith('/'):
+        raise ValueError, 'Module-relative files may not have absolute paths'
+
+    # Find the base directory for the path.
+    if hasattr(module, '__file__'):
+        # A normal module/package
+        basedir = os.path.split(module.__file__)[0]
+    elif module.__name__ == '__main__':
+        # An interactive session.
+        if len(sys.argv)>0 and sys.argv[0] != '':
+            basedir = os.path.split(sys.argv[0])[0]
+        else:
+            basedir = os.curdir
+    else:
+        # A module w/o __file__ (this includes builtins)
+        raise ValueError("Can't resolve paths relative to the module " +
+                         module + " (it has no __file__)")
+
+    # Combine the base directory and the path.
+    return os.path.join(basedir, *(path.split('/')))
+
+######################################################################
+## 2. Example & DocTest
+######################################################################
+## - An "example" is a <source, want> pair, where "source" is a
+##   fragment of source code, and "want" is the expected output for
+##   "source."  The Example class also includes information about
+##   where the example was extracted from.
+##
+## - A "doctest" is a collection of examples, typically extracted from
+##   a string (such as an object's docstring).  The DocTest class also
+##   includes information about where the string was extracted from.
+
+class Example:
+    """
+    A single doctest example, consisting of source code and expected
+    output.  `Example` defines the following attributes:
+
+      - source: A single Python statement, always ending with a newline.
+        The constructor adds a newline if needed.
+
+      - want: The expected output from running the source code (either
+        from stdout, or a traceback in case of exception).  `want` ends
+        with a newline unless it's empty, in which case it's an empty
+        string.  The constructor adds a newline if needed.
+
+      - exc_msg: The exception message generated by the example, if
+        the example is expected to generate an exception; or `None` if
+        it is not expected to generate an exception.  This exception
+        message is compared against the return value of
+        `traceback.format_exception_only()`.  `exc_msg` ends with a
+        newline unless it's `None`.  The constructor adds a newline
+        if needed.
+
+      - lineno: The line number within the DocTest string containing
+        this Example where the Example begins.  This line number is
+        zero-based, with respect to the beginning of the DocTest.
+
+      - indent: The example's indentation in the DocTest string.
+        I.e., the number of space characters that preceed the
+        example's first prompt.
+
+      - options: A dictionary mapping from option flags to True or
+        False, which is used to override default options for this
+        example.  Any option flags not contained in this dictionary
+        are left at their default value (as specified by the
+        DocTestRunner's optionflags).  By default, no options are set.
+    """
+    def __init__(self, source, want, exc_msg=None, lineno=0, indent=0,
+                 options=None):
+        # Normalize inputs.
+        if not source.endswith('\n'):
+            source += '\n'
+        if want and not want.endswith('\n'):
+            want += '\n'
+        if exc_msg is not None and not exc_msg.endswith('\n'):
+            exc_msg += '\n'
+        # Store properties.
+        self.source = source
+        self.want = want
+        self.lineno = lineno
+        self.indent = indent
+        if options is None: options = {}
+        self.options = options
+        self.exc_msg = exc_msg
+
+class DocTest:
+    """
+    A collection of doctest examples that should be run in a single
+    namespace.  Each `DocTest` defines the following attributes:
+
+      - examples: the list of examples.
+
+      - globs: The namespace (aka globals) that the examples should
+        be run in.
+
+      - name: A name identifying the DocTest (typically, the name of
+        the object whose docstring this DocTest was extracted from).
+
+      - filename: The name of the file that this DocTest was extracted
+        from, or `None` if the filename is unknown.
+
+      - lineno: The line number within filename where this DocTest
+        begins, or `None` if the line number is unavailable.  This
+        line number is zero-based, with respect to the beginning of
+        the file.
+
+      - docstring: The string that the examples were extracted from,
+        or `None` if the string is unavailable.
+    """
+    def __init__(self, examples, globs, name, filename, lineno, docstring):
+        """
+        Create a new DocTest containing the given examples.  The
+        DocTest's globals are initialized with a copy of `globs`.
+        """
+        assert not isinstance(examples, basestring), \
+               "DocTest no longer accepts str; use DocTestParser instead"
+        self.examples = examples
+        self.docstring = docstring
+        self.globs = globs.copy()
+        self.name = name
+        self.filename = filename
+        self.lineno = lineno
+
+    def __repr__(self):
+        if len(self.examples) == 0:
+            examples = 'no examples'
+        elif len(self.examples) == 1:
+            examples = '1 example'
+        else:
+            examples = '%d examples' % len(self.examples)
+        return ('<DocTest %s from %s:%s (%s)>' %
+                (self.name, self.filename, self.lineno, examples))
+
+
+    # This lets us sort tests by name:
+    def __cmp__(self, other):
+        if not isinstance(other, DocTest):
+            return -1
+        return cmp((self.name, self.filename, self.lineno, id(self)),
+                   (other.name, other.filename, other.lineno, id(other)))
+
+######################################################################
+## 3. DocTestParser
+######################################################################
+
+class DocTestParser:
+    """
+    A class used to parse strings containing doctest examples.
+    """
+    # This regular expression is used to find doctest examples in a
+    # string.  It defines three groups: `source` is the source code
+    # (including leading indentation and prompts); `indent` is the
+    # indentation of the first (PS1) line of the source code; and
+    # `want` is the expected output (including leading indentation).
+    _EXAMPLE_RE = re.compile(r'''
+        # Source consists of a PS1 line followed by zero or more PS2 lines.
+        (?P<source>
+            (?:^(?P<indent> [ ]*) >>>    .*)    # PS1 line
+            (?:\n           [ ]*  \.\.\. .*)*)  # PS2 lines
+        \n?
+        # Want consists of any non-blank lines that do not start with PS1.
+        (?P<want> (?:(?![ ]*$)    # Not a blank line
+                     (?![ ]*>>>)  # Not a line starting with PS1
+                     .*$\n?       # But any other line
+                  )*)
+        ''', re.MULTILINE | re.VERBOSE)
+
+    # A regular expression for handling `want` strings that contain
+    # expected exceptions.  It divides `want` into three pieces:
+    #    - the traceback header line (`hdr`)
+    #    - the traceback stack (`stack`)
+    #    - the exception message (`msg`), as generated by
+    #      traceback.format_exception_only()
+    # `msg` may have multiple lines.  We assume/require that the
+    # exception message is the first non-indented line starting with a word
+    # character following the traceback header line.
+    _EXCEPTION_RE = re.compile(r"""
+        # Grab the traceback header.  Different versions of Python have
+        # said different things on the first traceback line.
+        ^(?P<hdr> Traceback\ \(
+            (?: most\ recent\ call\ last
+            |   innermost\ last
+            ) \) :
+        )
+        \s* $                # toss trailing whitespace on the header.
+        (?P<stack> .*?)      # don't blink: absorb stuff until...
+        ^ (?P<msg> \w+ .*)   #     a line *starts* with alphanum.
+        """, re.VERBOSE | re.MULTILINE | re.DOTALL)
+
+    # A callable returning a true value iff its argument is a blank line
+    # or contains a single comment.
+    _IS_BLANK_OR_COMMENT = re.compile(r'^[ ]*(#.*)?$').match
+
+    def parse(self, string, name='<string>'):
+        """
+        Divide the given string into examples and intervening text,
+        and return them as a list of alternating Examples and strings.
+        Line numbers for the Examples are 0-based.  The optional
+        argument `name` is a name identifying this string, and is only
+        used for error messages.
+        """
+        string = string.expandtabs()
+        # If all lines begin with the same indentation, then strip it.
+        min_indent = self._min_indent(string)
+        if min_indent > 0:
+            string = '\n'.join([l[min_indent:] for l in string.split('\n')])
+
+        output = []
+        charno, lineno = 0, 0
+        # Find all doctest examples in the string:
+        for m in self._EXAMPLE_RE.finditer(string):
+            # Add the pre-example text to `output`.
+            output.append(string[charno:m.start()])
+            # Update lineno (lines before this example)
+            lineno += string.count('\n', charno, m.start())
+            # Extract info from the regexp match.
+            (source, options, want, exc_msg) = \
+                     self._parse_example(m, name, lineno)
+            # Create an Example, and add it to the list.
+            if not self._IS_BLANK_OR_COMMENT(source):
+                output.append( Example(source, want, exc_msg,
+                                    lineno=lineno,
+                                    indent=min_indent+len(m.group('indent')),
+                                    options=options) )
+            # Update lineno (lines inside this example)
+            lineno += string.count('\n', m.start(), m.end())
+            # Update charno.
+            charno = m.end()
+        # Add any remaining post-example text to `output`.
+        output.append(string[charno:])
+        return output
+
+    def get_doctest(self, string, globs, name, filename, lineno):
+        """
+        Extract all doctest examples from the given string, and
+        collect them into a `DocTest` object.
+
+        `globs`, `name`, `filename`, and `lineno` are attributes for
+        the new `DocTest` object.  See the documentation for `DocTest`
+        for more information.
+        """
+        return DocTest(self.get_examples(string, name), globs,
+                       name, filename, lineno, string)
+
+    def get_examples(self, string, name='<string>'):
+        """
+        Extract all doctest examples from the given string, and return
+        them as a list of `Example` objects.  Line numbers are
+        0-based, because it's most common in doctests that nothing
+        interesting appears on the same line as opening triple-quote,
+        and so the first interesting line is called \"line 1\" then.
+
+        The optional argument `name` is a name identifying this
+        string, and is only used for error messages.
+        """
+        return [x for x in self.parse(string, name)
+                if isinstance(x, Example)]
+
+    def _parse_example(self, m, name, lineno):
+        """
+        Given a regular expression match from `_EXAMPLE_RE` (`m`),
+        return a pair `(source, want)`, where `source` is the matched
+        example's source code (with prompts and indentation stripped);
+        and `want` is the example's expected output (with indentation
+        stripped).
+
+        `name` is the string's name, and `lineno` is the line number
+        where the example starts; both are used for error messages.
+        """
+        # Get the example's indentation level.
+        indent = len(m.group('indent'))
+
+        # Divide source into lines; check that they're properly
+        # indented; and then strip their indentation & prompts.
+        source_lines = m.group('source').split('\n')
+        self._check_prompt_blank(source_lines, indent, name, lineno)
+        self._check_prefix(source_lines[1:], ' '*indent + '.', name, lineno)
+        source = '\n'.join([sl[indent+4:] for sl in source_lines])
+
+        # Divide want into lines; check that it's properly indented; and
+        # then strip the indentation.  Spaces before the last newline should
+        # be preserved, so plain rstrip() isn't good enough.
+        want = m.group('want')
+        want_lines = want.split('\n')
+        if len(want_lines) > 1 and re.match(r' *$', want_lines[-1]):
+            del want_lines[-1]  # forget final newline & spaces after it
+        self._check_prefix(want_lines, ' '*indent, name,
+                           lineno + len(source_lines))
+        want = '\n'.join([wl[indent:] for wl in want_lines])
+
+        # If `want` contains a traceback message, then extract it.
+        m = self._EXCEPTION_RE.match(want)
+        if m:
+            exc_msg = m.group('msg')
+        else:
+            exc_msg = None
+
+        # Extract options from the source.
+        options = self._find_options(source, name, lineno)
+
+        return source, options, want, exc_msg
+
+    # This regular expression looks for option directives in the
+    # source code of an example.  Option directives are comments
+    # starting with "doctest:".  Warning: this may give false
+    # positives for string-literals that contain the string
+    # "#doctest:".  Eliminating these false positives would require
+    # actually parsing the string; but we limit them by ignoring any
+    # line containing "#doctest:" that is *followed* by a quote mark.
+    _OPTION_DIRECTIVE_RE = re.compile(r'#\s*doctest:\s*([^\n\'"]*)$',
+                                      re.MULTILINE)
+
+    def _find_options(self, source, name, lineno):
+        """
+        Return a dictionary containing option overrides extracted from
+        option directives in the given source string.
+
+        `name` is the string's name, and `lineno` is the line number
+        where the example starts; both are used for error messages.
+        """
+        options = {}
+        # (note: with the current regexp, this will match at most once:)
+        for m in self._OPTION_DIRECTIVE_RE.finditer(source):
+            option_strings = m.group(1).replace(',', ' ').split()
+            for option in option_strings:
+                if (option[0] not in '+-' or
+                    option[1:] not in OPTIONFLAGS_BY_NAME):
+                    raise ValueError('line %r of the doctest for %s '
+                                     'has an invalid option: %r' %
+                                     (lineno+1, name, option))
+                flag = OPTIONFLAGS_BY_NAME[option[1:]]
+                options[flag] = (option[0] == '+')
+        if options and self._IS_BLANK_OR_COMMENT(source):
+            raise ValueError('line %r of the doctest for %s has an option '
+                             'directive on a line with no example: %r' %
+                             (lineno, name, source))
+        return options
+
+    # This regular expression finds the indentation of every non-blank
+    # line in a string.
+    _INDENT_RE = re.compile('^([ ]*)(?=\S)', re.MULTILINE)
+
+    def _min_indent(self, s):
+        "Return the minimum indentation of any non-blank line in `s`"
+        indents = [len(indent) for indent in self._INDENT_RE.findall(s)]
+        if len(indents) > 0:
+            return min(indents)
+        else:
+            return 0
+
+    def _check_prompt_blank(self, lines, indent, name, lineno):
+        """
+        Given the lines of a source string (including prompts and
+        leading indentation), check to make sure that every prompt is
+        followed by a space character.  If any line is not followed by
+        a space character, then raise ValueError.
+        """
+        for i, line in enumerate(lines):
+            if len(line) >= indent+4 and line[indent+3] != ' ':
+                raise ValueError('line %r of the docstring for %s '
+                                 'lacks blank after %s: %r' %
+                                 (lineno+i+1, name,
+                                  line[indent:indent+3], line))
+
+    def _check_prefix(self, lines, prefix, name, lineno):
+        """
+        Check that every line in the given list starts with the given
+        prefix; if any line does not, then raise a ValueError.
+        """
+        for i, line in enumerate(lines):
+            if line and not line.startswith(prefix):
+                raise ValueError('line %r of the docstring for %s has '
+                                 'inconsistent leading whitespace: %r' %
+                                 (lineno+i+1, name, line))
+
+
+######################################################################
+## 4. DocTest Finder
+######################################################################
+
+class DocTestFinder:
+    """
+    A class used to extract the DocTests that are relevant to a given
+    object, from its docstring and the docstrings of its contained
+    objects.  Doctests can currently be extracted from the following
+    object types: modules, functions, classes, methods, staticmethods,
+    classmethods, and properties.
+    """
+
+    def __init__(self, verbose=False, parser=DocTestParser(),
+                 recurse=True, _namefilter=None, exclude_empty=True):
+        """
+        Create a new doctest finder.
+
+        The optional argument `parser` specifies a class or
+        function that should be used to create new DocTest objects (or
+        objects that implement the same interface as DocTest).  The
+        signature for this factory function should match the signature
+        of the DocTest constructor.
+
+        If the optional argument `recurse` is false, then `find` will
+        only examine the given object, and not any contained objects.
+
+        If the optional argument `exclude_empty` is false, then `find`
+        will include tests for objects with empty docstrings.
+        """
+        self._parser = parser
+        self._verbose = verbose
+        self._recurse = recurse
+        self._exclude_empty = exclude_empty
+        # _namefilter is undocumented, and exists only for temporary backward-
+        # compatibility support of testmod's deprecated isprivate mess.
+        self._namefilter = _namefilter
+
+    def find(self, obj, name=None, module=None, globs=None,
+             extraglobs=None):
+        """
+        Return a list of the DocTests that are defined by the given
+        object's docstring, or by any of its contained objects'
+        docstrings.
+
+        The optional parameter `module` is the module that contains
+        the given object.  If the module is not specified or is None, then
+        the test finder will attempt to automatically determine the
+        correct module.  The object's module is used:
+
+            - As a default namespace, if `globs` is not specified.
+            - To prevent the DocTestFinder from extracting DocTests
+              from objects that are imported from other modules.
+            - To find the name of the file containing the object.
+            - To help find the line number of the object within its
+              file.
+
+        Contained objects whose module does not match `module` are ignored.
+
+        If `module` is False, no attempt to find the module will be made.
+        This is obscure, of use mostly in tests:  if `module` is False, or
+        is None but cannot be found automatically, then all objects are
+        considered to belong to the (non-existent) module, so all contained
+        objects will (recursively) be searched for doctests.
+
+        The globals for each DocTest is formed by combining `globs`
+        and `extraglobs` (bindings in `extraglobs` override bindings
+        in `globs`).  A new copy of the globals dictionary is created
+        for each DocTest.  If `globs` is not specified, then it
+        defaults to the module's `__dict__`, if specified, or {}
+        otherwise.  If `extraglobs` is not specified, then it defaults
+        to {}.
+
+        """
+        # If name was not specified, then extract it from the object.
+        if name is None:
+            name = getattr(obj, '__name__', None)
+            if name is None:
+                raise ValueError("DocTestFinder.find: name must be given "
+                        "when obj.__name__ doesn't exist: %r" %
+                                 (type(obj),))
+
+        # Find the module that contains the given object (if obj is
+        # a module, then module=obj.).  Note: this may fail, in which
+        # case module will be None.
+        if module is False:
+            module = None
+        elif module is None:
+            module = inspect.getmodule(obj)
+
+        # Read the module's source code.  This is used by
+        # DocTestFinder._find_lineno to find the line number for a
+        # given object's docstring.
+        try:
+            file = inspect.getsourcefile(obj) or inspect.getfile(obj)
+            source_lines = linecache.getlines(file)
+            if not source_lines:
+                source_lines = None
+        except TypeError:
+            source_lines = None
+
+        # Initialize globals, and merge in extraglobs.
+        if globs is None:
+            if module is None:
+                globs = {}
+            else:
+                globs = module.__dict__.copy()
+        else:
+            globs = globs.copy()
+        if extraglobs is not None:
+            globs.update(extraglobs)
+
+        # Recursively expore `obj`, extracting DocTests.
+        tests = []
+        self._find(tests, obj, name, module, source_lines, globs, {})
+        return tests
+
+    def _filter(self, obj, prefix, base):
+        """
+        Return true if the given object should not be examined.
+        """
+        return (self._namefilter is not None and
+                self._namefilter(prefix, base))
+
+    def _from_module(self, module, object):
+        """
+        Return true if the given object is defined in the given
+        module.
+        """
+        if module is None:
+            return True
+        elif inspect.isfunction(object):
+            return module.__dict__ is object.func_globals
+        elif inspect.isclass(object):
+            return module.__name__ == object.__module__
+        elif inspect.getmodule(object) is not None:
+            return module is inspect.getmodule(object)
+        elif hasattr(object, '__module__'):
+            return module.__name__ == object.__module__
+        elif isinstance(object, property):
+            return True # [XX] no way not be sure.
+        else:
+            raise ValueError("object must be a class or function")
+
+    def _find(self, tests, obj, name, module, source_lines, globs, seen):
+        """
+        Find tests for the given object and any contained objects, and
+        add them to `tests`.
+        """
+        if self._verbose:
+            print 'Finding tests in %s' % name
+
+        # If we've already processed this object, then ignore it.
+        if id(obj) in seen:
+            return
+        seen[id(obj)] = 1
+
+        # Find a test for this object, and add it to the list of tests.
+        test = self._get_test(obj, name, module, globs, source_lines)
+        if test is not None:
+            tests.append(test)
+
+        # Look for tests in a module's contained objects.
+        if inspect.ismodule(obj) and self._recurse:
+            for valname, val in obj.__dict__.items():
+                # Check if this contained object should be ignored.
+                if self._filter(val, name, valname):
+                    continue
+                valname = '%s.%s' % (name, valname)
+                # Recurse to functions & classes.
+                if ((inspect.isfunction(val) or inspect.isclass(val)) and
+                    self._from_module(module, val)):
+                    self._find(tests, val, valname, module, source_lines,
+                               globs, seen)
+
+        # Look for tests in a module's __test__ dictionary.
+        if inspect.ismodule(obj) and self._recurse:
+            for valname, val in getattr(obj, '__test__', {}).items():
+                if not isinstance(valname, basestring):
+                    raise ValueError("DocTestFinder.find: __test__ keys "
+                                     "must be strings: %r" %
+                                     (type(valname),))
+                if not (inspect.isfunction(val) or inspect.isclass(val) or
+                        inspect.ismethod(val) or inspect.ismodule(val) or
+                        isinstance(val, basestring)):
+                    raise ValueError("DocTestFinder.find: __test__ values "
+                                     "must be strings, functions, methods, "
+                                     "classes, or modules: %r" %
+                                     (type(val),))
+                valname = '%s.__test__.%s' % (name, valname)
+                self._find(tests, val, valname, module, source_lines,
+                           globs, seen)
+
+        # Look for tests in a class's contained objects.
+        if inspect.isclass(obj) and self._recurse:
+            for valname, val in obj.__dict__.items():
+                # Check if this contained object should be ignored.
+                if self._filter(val, name, valname):
+                    continue
+                # Special handling for staticmethod/classmethod.
+                if isinstance(val, staticmethod):
+                    val = getattr(obj, valname)
+                if isinstance(val, classmethod):
+                    val = getattr(obj, valname).im_func
+
+                # Recurse to methods, properties, and nested classes.
+                if ((inspect.isfunction(val) or inspect.isclass(val) or
+                      isinstance(val, property)) and
+                      self._from_module(module, val)):
+                    valname = '%s.%s' % (name, valname)
+                    self._find(tests, val, valname, module, source_lines,
+                               globs, seen)
+
+    def _get_test(self, obj, name, module, globs, source_lines):
+        """
+        Return a DocTest for the given object, if it defines a docstring;
+        otherwise, return None.
+        """
+        # Extract the object's docstring.  If it doesn't have one,
+        # then return None (no test for this object).
+        if isinstance(obj, basestring):
+            docstring = obj
+        else:
+            try:
+                if obj.__doc__ is None:
+                    docstring = ''
+                else:
+                    docstring = obj.__doc__
+                    if not isinstance(docstring, basestring):
+                        docstring = str(docstring)
+            except (TypeError, AttributeError):
+                docstring = ''
+
+        # Find the docstring's location in the file.
+        lineno = self._find_lineno(obj, source_lines)
+
+        # Don't bother if the docstring is empty.
+        if self._exclude_empty and not docstring:
+            return None
+
+        # Return a DocTest for this object.
+        if module is None:
+            filename = None
+        else:
+            filename = getattr(module, '__file__', module.__name__)
+            if filename[-4:] in (".pyc", ".pyo"):
+                filename = filename[:-1]
+        return self._parser.get_doctest(docstring, globs, name,
+                                        filename, lineno)
+
+    def _find_lineno(self, obj, source_lines):
+        """
+        Return a line number of the given object's docstring.  Note:
+        this method assumes that the object has a docstring.
+        """
+        lineno = None
+
+        # Find the line number for modules.
+        if inspect.ismodule(obj):
+            lineno = 0
+
+        # Find the line number for classes.
+        # Note: this could be fooled if a class is defined multiple
+        # times in a single file.
+        if inspect.isclass(obj):
+            if source_lines is None:
+                return None
+            pat = re.compile(r'^\s*class\s*%s\b' %
+                             getattr(obj, '__name__', '-'))
+            for i, line in enumerate(source_lines):
+                if pat.match(line):
+                    lineno = i
+                    break
+
+        # Find the line number for functions & methods.
+        if inspect.ismethod(obj): obj = obj.im_func
+        if inspect.isfunction(obj): obj = obj.func_code
+        if inspect.istraceback(obj): obj = obj.tb_frame
+        if inspect.isframe(obj): obj = obj.f_code
+        if inspect.iscode(obj):
+            lineno = getattr(obj, 'co_firstlineno', None)-1
+
+        # Find the line number where the docstring starts.  Assume
+        # that it's the first line that begins with a quote mark.
+        # Note: this could be fooled by a multiline function
+        # signature, where a continuation line begins with a quote
+        # mark.
+        if lineno is not None:
+            if source_lines is None:
+                return lineno+1
+            pat = re.compile('(^|.*:)\s*\w*("|\')')
+            for lineno in range(lineno, len(source_lines)):
+                if pat.match(source_lines[lineno]):
+                    return lineno
+
+        # We couldn't find the line number.
+        return None
+
+######################################################################
+## 5. DocTest Runner
+######################################################################
+
+class DocTestRunner:
+    """
+    A class used to run DocTest test cases, and accumulate statistics.
+    The `run` method is used to process a single DocTest case.  It
+    returns a tuple `(f, t)`, where `t` is the number of test cases
+    tried, and `f` is the number of test cases that failed.
+
+        >>> tests = DocTestFinder().find(_TestClass)
+        >>> runner = DocTestRunner(verbose=False)
+        >>> for test in tests:
+        ...     print runner.run(test)
+        (0, 2)
+        (0, 1)
+        (0, 2)
+        (0, 2)
+
+    The `summarize` method prints a summary of all the test cases that
+    have been run by the runner, and returns an aggregated `(f, t)`
+    tuple:
+
+        >>> runner.summarize(verbose=1)
+        4 items passed all tests:
+           2 tests in _TestClass
+           2 tests in _TestClass.__init__
+           2 tests in _TestClass.get
+           1 tests in _TestClass.square
+        7 tests in 4 items.
+        7 passed and 0 failed.
+        Test passed.
+        (0, 7)
+
+    The aggregated number of tried examples and failed examples is
+    also available via the `tries` and `failures` attributes:
+
+        >>> runner.tries
+        7
+        >>> runner.failures
+        0
+
+    The comparison between expected outputs and actual outputs is done
+    by an `OutputChecker`.  This comparison may be customized with a
+    number of option flags; see the documentation for `testmod` for
+    more information.  If the option flags are insufficient, then the
+    comparison may also be customized by passing a subclass of
+    `OutputChecker` to the constructor.
+
+    The test runner's display output can be controlled in two ways.
+    First, an output function (`out) can be passed to
+    `TestRunner.run`; this function will be called with strings that
+    should be displayed.  It defaults to `sys.stdout.write`.  If
+    capturing the output is not sufficient, then the display output
+    can be also customized by subclassing DocTestRunner, and
+    overriding the methods `report_start`, `report_success`,
+    `report_unexpected_exception`, and `report_failure`.
+    """
+    # This divider string is used to separate failure messages, and to
+    # separate sections of the summary.
+    DIVIDER = "*" * 70
+
+    def __init__(self, checker=None, verbose=None, optionflags=0):
+        """
+        Create a new test runner.
+
+        Optional keyword arg `checker` is the `OutputChecker` that
+        should be used to compare the expected outputs and actual
+        outputs of doctest examples.
+
+        Optional keyword arg 'verbose' prints lots of stuff if true,
+        only failures if false; by default, it's true iff '-v' is in
+        sys.argv.
+
+        Optional argument `optionflags` can be used to control how the
+        test runner compares expected output to actual output, and how
+        it displays failures.  See the documentation for `testmod` for
+        more information.
+        """
+        self._checker = checker or OutputChecker()
+        if verbose is None:
+            verbose = '-v' in sys.argv
+        self._verbose = verbose
+        self.optionflags = optionflags
+        self.original_optionflags = optionflags
+
+        # Keep track of the examples we've run.
+        self.tries = 0
+        self.failures = 0
+        self._name2ft = {}
+
+        # Create a fake output target for capturing doctest output.
+        self._fakeout = _SpoofOut()
+
+    #/////////////////////////////////////////////////////////////////
+    # Reporting methods
+    #/////////////////////////////////////////////////////////////////
+
+    def report_start(self, out, test, example):
+        """
+        Report that the test runner is about to process the given
+        example.  (Only displays a message if verbose=True)
+        """
+        if self._verbose:
+            if example.want:
+                out('Trying:\n' + _indent(example.source) +
+                    'Expecting:\n' + _indent(example.want))
+            else:
+                out('Trying:\n' + _indent(example.source) +
+                    'Expecting nothing\n')
+
+    def report_success(self, out, test, example, got):
+        """
+        Report that the given example ran successfully.  (Only
+        displays a message if verbose=True)
+        """
+        if self._verbose:
+            out("ok\n")
+
+    def report_failure(self, out, test, example, got):
+        """
+        Report that the given example failed.
+        """
+        out(self._failure_header(test, example) +
+            self._checker.output_difference(example, got, self.optionflags))
+
+    def report_unexpected_exception(self, out, test, example, exc_info):
+        """
+        Report that the given example raised an unexpected exception.
+        """
+        out(self._failure_header(test, example) +
+            'Exception raised:\n' + _indent(_exception_traceback(exc_info)))
+
+    def _failure_header(self, test, example):
+        out = [self.DIVIDER]
+        if test.filename:
+            if test.lineno is not None and example.lineno is not None:
+                lineno = test.lineno + example.lineno + 1
+            else:
+                lineno = '?'
+            out.append('File "%s", line %s, in %s' %
+                       (test.filename, lineno, test.name))
+        else:
+            out.append('Line %s, in %s' % (example.lineno+1, test.name))
+        out.append('Failed example:')
+        source = example.source
+        out.append(_indent(source))
+        return '\n'.join(out)
+
+    #/////////////////////////////////////////////////////////////////
+    # DocTest Running
+    #/////////////////////////////////////////////////////////////////
+
+    def __run(self, test, compileflags, out):
+        """
+        Run the examples in `test`.  Write the outcome of each example
+        with one of the `DocTestRunner.report_*` methods, using the
+        writer function `out`.  `compileflags` is the set of compiler
+        flags that should be used to execute examples.  Return a tuple
+        `(f, t)`, where `t` is the number of examples tried, and `f`
+        is the number of examples that failed.  The examples are run
+        in the namespace `test.globs`.
+        """
+        # Keep track of the number of failures and tries.
+        failures = tries = 0
+
+        # Save the option flags (since option directives can be used
+        # to modify them).
+        original_optionflags = self.optionflags
+
+        SUCCESS, FAILURE, BOOM = range(3) # `outcome` state
+
+        check = self._checker.check_output
+
+        # Process each example.
+        for examplenum, example in enumerate(test.examples):
+
+            # If REPORT_ONLY_FIRST_FAILURE is set, then supress
+            # reporting after the first failure.
+            quiet = (self.optionflags & REPORT_ONLY_FIRST_FAILURE and
+                     failures > 0)
+
+            # Merge in the example's options.
+            self.optionflags = original_optionflags
+            if example.options:
+                for (optionflag, val) in example.options.items():
+                    if val:
+                        self.optionflags |= optionflag
+                    else:
+                        self.optionflags &= ~optionflag
+
+            # Record that we started this example.
+            tries += 1
+            if not quiet:
+                self.report_start(out, test, example)
+
+            # Use a special filename for compile(), so we can retrieve
+            # the source code during interactive debugging (see
+            # __patched_linecache_getlines).
+            filename = '<doctest %s[%d]>' % (test.name, examplenum)
+
+            # Run the example in the given context (globs), and record
+            # any exception that gets raised.  (But don't intercept
+            # keyboard interrupts.)
+            try:
+                # Don't blink!  This is where the user's code gets run.
+                exec compile(example.source, filename, "single",
+                             compileflags, 1) in test.globs
+                self.debugger.set_continue() # ==== Example Finished ====
+                exception = None
+            except KeyboardInterrupt:
+                raise
+            except:
+                exception = sys.exc_info()
+                self.debugger.set_continue() # ==== Example Finished ====
+
+            got = self._fakeout.getvalue()  # the actual output
+            self._fakeout.truncate(0)
+            outcome = FAILURE   # guilty until proved innocent or insane
+
+            # If the example executed without raising any exceptions,
+            # verify its output.
+            if exception is None:
+                if check(example.want, got, self.optionflags):
+                    outcome = SUCCESS
+
+            # The example raised an exception:  check if it was expected.
+            else:
+                exc_info = sys.exc_info()
+                exc_msg = traceback.format_exception_only(*exc_info[:2])[-1]
+                if not quiet:
+                    got += _exception_traceback(exc_info)
+
+                # If `example.exc_msg` is None, then we weren't expecting
+                # an exception.
+                if example.exc_msg is None:
+                    outcome = BOOM
+
+                # We expected an exception:  see whether it matches.
+                elif check(example.exc_msg, exc_msg, self.optionflags):
+                    outcome = SUCCESS
+
+                # Another chance if they didn't care about the detail.
+                elif self.optionflags & IGNORE_EXCEPTION_DETAIL:
+                    m1 = re.match(r'[^:]*:', example.exc_msg)
+                    m2 = re.match(r'[^:]*:', exc_msg)
+                    if m1 and m2 and check(m1.group(0), m2.group(0),
+                                           self.optionflags):
+                        outcome = SUCCESS
+
+            # Report the outcome.
+            if outcome is SUCCESS:
+                if not quiet:
+                    self.report_success(out, test, example, got)
+            elif outcome is FAILURE:
+                if not quiet:
+                    self.report_failure(out, test, example, got)
+                failures += 1
+            elif outcome is BOOM:
+                if not quiet:
+                    self.report_unexpected_exception(out, test, example,
+                                                     exc_info)
+                failures += 1
+            else:
+                assert False, ("unknown outcome", outcome)
+
+        # Restore the option flags (in case they were modified)
+        self.optionflags = original_optionflags
+
+        # Record and return the number of failures and tries.
+        self.__record_outcome(test, failures, tries)
+        return failures, tries
+
+    def __record_outcome(self, test, f, t):
+        """
+        Record the fact that the given DocTest (`test`) generated `f`
+        failures out of `t` tried examples.
+        """
+        f2, t2 = self._name2ft.get(test.name, (0,0))
+        self._name2ft[test.name] = (f+f2, t+t2)
+        self.failures += f
+        self.tries += t
+
+    __LINECACHE_FILENAME_RE = re.compile(r'<doctest '
+                                         r'(?P<name>[\w\.]+)'
+                                         r'\[(?P<examplenum>\d+)\]>$')
+    def __patched_linecache_getlines(self, filename):
+        m = self.__LINECACHE_FILENAME_RE.match(filename)
+        if m and m.group('name') == self.test.name:
+            example = self.test.examples[int(m.group('examplenum'))]
+            return example.source.splitlines(True)
+        else:
+            return self.save_linecache_getlines(filename)
+
+    def run(self, test, compileflags=None, out=None, clear_globs=True):
+        """
+        Run the examples in `test`, and display the results using the
+        writer function `out`.
+
+        The examples are run in the namespace `test.globs`.  If
+        `clear_globs` is true (the default), then this namespace will
+        be cleared after the test runs, to help with garbage
+        collection.  If you would like to examine the namespace after
+        the test completes, then use `clear_globs=False`.
+
+        `compileflags` gives the set of flags that should be used by
+        the Python compiler when running the examples.  If not
+        specified, then it will default to the set of future-import
+        flags that apply to `globs`.
+
+        The output of each example is checked using
+        `DocTestRunner.check_output`, and the results are formatted by
+        the `DocTestRunner.report_*` methods.
+        """
+        self.test = test
+
+        if compileflags is None:
+            compileflags = _extract_future_flags(test.globs)
+
+        save_stdout = sys.stdout
+        if out is None:
+            out = save_stdout.write
+        sys.stdout = self._fakeout
+
+        # Patch pdb.set_trace to restore sys.stdout during interactive
+        # debugging (so it's not still redirected to self._fakeout).
+        # Note that the interactive output will go to *our*
+        # save_stdout, even if that's not the real sys.stdout; this
+        # allows us to write test cases for the set_trace behavior.
+        save_set_trace = pdb.set_trace
+        self.debugger = _OutputRedirectingPdb(save_stdout)
+        self.debugger.reset()
+        pdb.set_trace = self.debugger.set_trace
+
+        # Patch linecache.getlines, so we can see the example's source
+        # when we're inside the debugger.
+        self.save_linecache_getlines = linecache.getlines
+        linecache.getlines = self.__patched_linecache_getlines
+
+        try:
+            return self.__run(test, compileflags, out)
+        finally:
+            sys.stdout = save_stdout
+            pdb.set_trace = save_set_trace
+            linecache.getlines = self.save_linecache_getlines
+            if clear_globs:
+                test.globs.clear()
+
+    #/////////////////////////////////////////////////////////////////
+    # Summarization
+    #/////////////////////////////////////////////////////////////////
+    def summarize(self, verbose=None):
+        """
+        Print a summary of all the test cases that have been run by
+        this DocTestRunner, and return a tuple `(f, t)`, where `f` is
+        the total number of failed examples, and `t` is the total
+        number of tried examples.
+
+        The optional `verbose` argument controls how detailed the
+        summary is.  If the verbosity is not specified, then the
+        DocTestRunner's verbosity is used.
+        """
+        if verbose is None:
+            verbose = self._verbose
+        notests = []
+        passed = []
+        failed = []
+        totalt = totalf = 0
+        for x in self._name2ft.items():
+            name, (f, t) = x
+            assert f <= t
+            totalt += t
+            totalf += f
+            if t == 0:
+                notests.append(name)
+            elif f == 0:
+                passed.append( (name, t) )
+            else:
+                failed.append(x)
+        if verbose:
+            if notests:
+                print len(notests), "items had no tests:"
+                notests.sort()
+                for thing in notests:
+                    print "   ", thing
+            if passed:
+                print len(passed), "items passed all tests:"
+                passed.sort()
+                for thing, count in passed:
+                    print " %3d tests in %s" % (count, thing)
+        if failed:
+            print self.DIVIDER
+            print len(failed), "items had failures:"
+            failed.sort()
+            for thing, (f, t) in failed:
+                print " %3d of %3d in %s" % (f, t, thing)
+        if verbose:
+            print totalt, "tests in", len(self._name2ft), "items."
+            print totalt - totalf, "passed and", totalf, "failed."
+        if totalf:
+            print "***Test Failed***", totalf, "failures."
+        elif verbose:
+            print "Test passed."
+        return totalf, totalt
+
+    #/////////////////////////////////////////////////////////////////
+    # Backward compatibility cruft to maintain doctest.master.
+    #/////////////////////////////////////////////////////////////////
+    def merge(self, other):
+        d = self._name2ft
+        for name, (f, t) in other._name2ft.items():
+            if name in d:
+                print "*** DocTestRunner.merge: '" + name + "' in both" \
+                    " testers; summing outcomes."
+                f2, t2 = d[name]
+                f = f + f2
+                t = t + t2
+            d[name] = f, t
+
+class OutputChecker:
+    """
+    A class used to check the whether the actual output from a doctest
+    example matches the expected output.  `OutputChecker` defines two
+    methods: `check_output`, which compares a given pair of outputs,
+    and returns true if they match; and `output_difference`, which
+    returns a string describing the differences between two outputs.
+    """
+    def check_output(self, want, got, optionflags):
+        """
+        Return True iff the actual output from an example (`got`)
+        matches the expected output (`want`).  These strings are
+        always considered to match if they are identical; but
+        depending on what option flags the test runner is using,
+        several non-exact match types are also possible.  See the
+        documentation for `TestRunner` for more information about
+        option flags.
+        """
+        # Handle the common case first, for efficiency:
+        # if they're string-identical, always return true.
+        if got == want:
+            return True
+
+        # The values True and False replaced 1 and 0 as the return
+        # value for boolean comparisons in Python 2.3.
+        if not (optionflags & DONT_ACCEPT_TRUE_FOR_1):
+            if (got,want) == ("True\n", "1\n"):
+                return True
+            if (got,want) == ("False\n", "0\n"):
+                return True
+
+        # <BLANKLINE> can be used as a special sequence to signify a
+        # blank line, unless the DONT_ACCEPT_BLANKLINE flag is used.
+        if not (optionflags & DONT_ACCEPT_BLANKLINE):
+            # Replace <BLANKLINE> in want with a blank line.
+            want = re.sub('(?m)^%s\s*?$' % re.escape(BLANKLINE_MARKER),
+                          '', want)
+            # If a line in got contains only spaces, then remove the
+            # spaces.
+            got = re.sub('(?m)^\s*?$', '', got)
+            if got == want:
+                return True
+
+        # This flag causes doctest to ignore any differences in the
+        # contents of whitespace strings.  Note that this can be used
+        # in conjunction with the ELLIPSIS flag.
+        if optionflags & NORMALIZE_WHITESPACE:
+            got = ' '.join(got.split())
+            want = ' '.join(want.split())
+            if got == want:
+                return True
+
+        # The ELLIPSIS flag says to let the sequence "..." in `want`
+        # match any substring in `got`.
+        if optionflags & ELLIPSIS:
+            if _ellipsis_match(want, got):
+                return True
+
+        # We didn't find any match; return false.
+        return False
+
+    # Should we do a fancy diff?
+    def _do_a_fancy_diff(self, want, got, optionflags):
+        # Not unless they asked for a fancy diff.
+        if not optionflags & (REPORT_UDIFF |
+                              REPORT_CDIFF |
+                              REPORT_NDIFF):
+            return False
+
+        # If expected output uses ellipsis, a meaningful fancy diff is
+        # too hard ... or maybe not.  In two real-life failures Tim saw,
+        # a diff was a major help anyway, so this is commented out.
+        # [todo] _ellipsis_match() knows which pieces do and don't match,
+        # and could be the basis for a kick-ass diff in this case.
+        ##if optionflags & ELLIPSIS and ELLIPSIS_MARKER in want:
+        ##    return False
+
+        # ndiff does intraline difference marking, so can be useful even
+        # for 1-line differences.
+        if optionflags & REPORT_NDIFF:
+            return True
+
+        # The other diff types need at least a few lines to be helpful.
+        return want.count('\n') > 2 and got.count('\n') > 2
+
+    def output_difference(self, example, got, optionflags):
+        """
+        Return a string describing the differences between the
+        expected output for a given example (`example`) and the actual
+        output (`got`).  `optionflags` is the set of option flags used
+        to compare `want` and `got`.
+        """
+        want = example.want
+        # If <BLANKLINE>s are being used, then replace blank lines
+        # with <BLANKLINE> in the actual output string.
+        if not (optionflags & DONT_ACCEPT_BLANKLINE):
+            got = re.sub('(?m)^[ ]*(?=\n)', BLANKLINE_MARKER, got)
+
+        # Check if we should use diff.
+        if self._do_a_fancy_diff(want, got, optionflags):
+            # Split want & got into lines.
+            want_lines = want.splitlines(True)  # True == keep line ends
+            got_lines = got.splitlines(True)
+            # Use difflib to find their differences.
+            if optionflags & REPORT_UDIFF:
+                diff = difflib.unified_diff(want_lines, got_lines, n=2)
+                diff = list(diff)[2:] # strip the diff header
+                kind = 'unified diff with -expected +actual'
+            elif optionflags & REPORT_CDIFF:
+                diff = difflib.context_diff(want_lines, got_lines, n=2)
+                diff = list(diff)[2:] # strip the diff header
+                kind = 'context diff with expected followed by actual'
+            elif optionflags & REPORT_NDIFF:
+                engine = difflib.Differ(charjunk=difflib.IS_CHARACTER_JUNK)
+                diff = list(engine.compare(want_lines, got_lines))
+                kind = 'ndiff with -expected +actual'
+            else:
+                assert 0, 'Bad diff option'
+            # Remove trailing whitespace on diff output.
+            diff = [line.rstrip() + '\n' for line in diff]
+            return 'Differences (%s):\n' % kind + _indent(''.join(diff))
+
+        # If we're not using diff, then simply list the expected
+        # output followed by the actual output.
+        if want and got:
+            return 'Expected:\n%sGot:\n%s' % (_indent(want), _indent(got))
+        elif want:
+            return 'Expected:\n%sGot nothing\n' % _indent(want)
+        elif got:
+            return 'Expected nothing\nGot:\n%s' % _indent(got)
+        else:
+            return 'Expected nothing\nGot nothing\n'
+
+class DocTestFailure(Exception):
+    """A DocTest example has failed in debugging mode.
+
+    The exception instance has variables:
+
+    - test: the DocTest object being run
+
+    - excample: the Example object that failed
+
+    - got: the actual output
+    """
+    def __init__(self, test, example, got):
+        self.test = test
+        self.example = example
+        self.got = got
+
+    def __str__(self):
+        return str(self.test)
+
+class UnexpectedException(Exception):
+    """A DocTest example has encountered an unexpected exception
+
+    The exception instance has variables:
+
+    - test: the DocTest object being run
+
+    - excample: the Example object that failed
+
+    - exc_info: the exception info
+    """
+    def __init__(self, test, example, exc_info):
+        self.test = test
+        self.example = example
+        self.exc_info = exc_info
+
+    def __str__(self):
+        return str(self.test)
+
+class DebugRunner(DocTestRunner):
+    r"""Run doc tests but raise an exception as soon as there is a failure.
+
+       If an unexpected exception occurs, an UnexpectedException is raised.
+       It contains the test, the example, and the original exception:
+
+         >>> runner = DebugRunner(verbose=False)
+         >>> test = DocTestParser().get_doctest('>>> raise KeyError\n42',
+         ...                                    {}, 'foo', 'foo.py', 0)
+         >>> try:
+         ...     runner.run(test)
+         ... except UnexpectedException, failure:
+         ...     pass
+
+         >>> failure.test is test
+         True
+
+         >>> failure.example.want
+         '42\n'
+
+         >>> exc_info = failure.exc_info
+         >>> raise exc_info[0], exc_info[1], exc_info[2]
+         Traceback (most recent call last):
+         ...
+         KeyError
+
+       We wrap the original exception to give the calling application
+       access to the test and example information.
+
+       If the output doesn't match, then a DocTestFailure is raised:
+
+         >>> test = DocTestParser().get_doctest('''
+         ...      >>> x = 1
+         ...      >>> x
+         ...      2
+         ...      ''', {}, 'foo', 'foo.py', 0)
+
+         >>> try:
+         ...    runner.run(test)
+         ... except DocTestFailure, failure:
+         ...    pass
+
+       DocTestFailure objects provide access to the test:
+
+         >>> failure.test is test
+         True
+
+       As well as to the example:
+
+         >>> failure.example.want
+         '2\n'
+
+       and the actual output:
+
+         >>> failure.got
+         '1\n'
+
+       If a failure or error occurs, the globals are left intact:
+
+         >>> del test.globs['__builtins__']
+         >>> test.globs
+         {'x': 1}
+
+         >>> test = DocTestParser().get_doctest('''
+         ...      >>> x = 2
+         ...      >>> raise KeyError
+         ...      ''', {}, 'foo', 'foo.py', 0)
+
+         >>> runner.run(test)
+         Traceback (most recent call last):
+         ...
+         UnexpectedException: <DocTest foo from foo.py:0 (2 examples)>
+
+         >>> del test.globs['__builtins__']
+         >>> test.globs
+         {'x': 2}
+
+       But the globals are cleared if there is no error:
+
+         >>> test = DocTestParser().get_doctest('''
+         ...      >>> x = 2
+         ...      ''', {}, 'foo', 'foo.py', 0)
+
+         >>> runner.run(test)
+         (0, 1)
+
+         >>> test.globs
+         {}
+
+       """
+
+    def run(self, test, compileflags=None, out=None, clear_globs=True):
+        r = DocTestRunner.run(self, test, compileflags, out, False)
+        if clear_globs:
+            test.globs.clear()
+        return r
+
+    def report_unexpected_exception(self, out, test, example, exc_info):
+        raise UnexpectedException(test, example, exc_info)
+
+    def report_failure(self, out, test, example, got):
+        raise DocTestFailure(test, example, got)
+
+######################################################################
+## 6. Test Functions
+######################################################################
+# These should be backwards compatible.
+
+# For backward compatibility, a global instance of a DocTestRunner
+# class, updated by testmod.
+master = None
+
+def testmod(m=None, name=None, globs=None, verbose=None, isprivate=None,
+            report=True, optionflags=0, extraglobs=None,
+            raise_on_error=False, exclude_empty=False):
+    """m=None, name=None, globs=None, verbose=None, isprivate=None,
+       report=True, optionflags=0, extraglobs=None, raise_on_error=False,
+       exclude_empty=False
+
+    Test examples in docstrings in functions and classes reachable
+    from module m (or the current module if m is not supplied), starting
+    with m.__doc__.  Unless isprivate is specified, private names
+    are not skipped.
+
+    Also test examples reachable from dict m.__test__ if it exists and is
+    not None.  m.__test__ maps names to functions, classes and strings;
+    function and class docstrings are tested even if the name is private;
+    strings are tested directly, as if they were docstrings.
+
+    Return (#failures, #tests).
+
+    See doctest.__doc__ for an overview.
+
+    Optional keyword arg "name" gives the name of the module; by default
+    use m.__name__.
+
+    Optional keyword arg "globs" gives a dict to be used as the globals
+    when executing examples; by default, use m.__dict__.  A copy of this
+    dict is actually used for each docstring, so that each docstring's
+    examples start with a clean slate.
+
+    Optional keyword arg "extraglobs" gives a dictionary that should be
+    merged into the globals that are used to execute examples.  By
+    default, no extra globals are used.  This is new in 2.4.
+
+    Optional keyword arg "verbose" prints lots of stuff if true, prints
+    only failures if false; by default, it's true iff "-v" is in sys.argv.
+
+    Optional keyword arg "report" prints a summary at the end when true,
+    else prints nothing at the end.  In verbose mode, the summary is
+    detailed, else very brief (in fact, empty if all tests passed).
+
+    Optional keyword arg "optionflags" or's together module constants,
+    and defaults to 0.  This is new in 2.3.  Possible values (see the
+    docs for details):
+
+        DONT_ACCEPT_TRUE_FOR_1
+        DONT_ACCEPT_BLANKLINE
+        NORMALIZE_WHITESPACE
+        ELLIPSIS
+        IGNORE_EXCEPTION_DETAIL
+        REPORT_UDIFF
+        REPORT_CDIFF
+        REPORT_NDIFF
+        REPORT_ONLY_FIRST_FAILURE
+
+    Optional keyword arg "raise_on_error" raises an exception on the
+    first unexpected exception or failure. This allows failures to be
+    post-mortem debugged.
+
+    Deprecated in Python 2.4:
+    Optional keyword arg "isprivate" specifies a function used to
+    determine whether a name is private.  The default function is
+    treat all functions as public.  Optionally, "isprivate" can be
+    set to doctest.is_private to skip over functions marked as private
+    using the underscore naming convention; see its docs for details.
+
+    Advanced tomfoolery:  testmod runs methods of a local instance of
+    class doctest.Tester, then merges the results into (or creates)
+    global Tester instance doctest.master.  Methods of doctest.master
+    can be called directly too, if you want to do something unusual.
+    Passing report=0 to testmod is especially useful then, to delay
+    displaying a summary.  Invoke doctest.master.summarize(verbose)
+    when you're done fiddling.
+    """
+    global master
+
+    if isprivate is not None:
+        warnings.warn("the isprivate argument is deprecated; "
+                      "examine DocTestFinder.find() lists instead",
+                      DeprecationWarning)
+
+    # If no module was given, then use __main__.
+    if m is None:
+        # DWA - m will still be None if this wasn't invoked from the command
+        # line, in which case the following TypeError is about as good an error
+        # as we should expect
+        m = sys.modules.get('__main__')
+
+    # Check that we were actually given a module.
+    if not inspect.ismodule(m):
+        raise TypeError("testmod: module required; %r" % (m,))
+
+    # If no name was given, then use the module's name.
+    if name is None:
+        name = m.__name__
+
+    # Find, parse, and run all tests in the given module.
+    finder = DocTestFinder(_namefilter=isprivate, exclude_empty=exclude_empty)
+
+    if raise_on_error:
+        runner = DebugRunner(verbose=verbose, optionflags=optionflags)
+    else:
+        runner = DocTestRunner(verbose=verbose, optionflags=optionflags)
+
+    for test in finder.find(m, name, globs=globs, extraglobs=extraglobs):
+        runner.run(test)
+
+    if report:
+        runner.summarize()
+
+    if master is None:
+        master = runner
+    else:
+        master.merge(runner)
+
+    return runner.failures, runner.tries
+
+def testfile(filename, module_relative=True, name=None, package=None,
+             globs=None, verbose=None, report=True, optionflags=0,
+             extraglobs=None, raise_on_error=False, parser=DocTestParser()):
+    """
+    Test examples in the given file.  Return (#failures, #tests).
+
+    Optional keyword arg "module_relative" specifies how filenames
+    should be interpreted:
+
+      - If "module_relative" is True (the default), then "filename"
+         specifies a module-relative path.  By default, this path is
+         relative to the calling module's directory; but if the
+         "package" argument is specified, then it is relative to that
+         package.  To ensure os-independence, "filename" should use
+         "/" characters to separate path segments, and should not
+         be an absolute path (i.e., it may not begin with "/").
+
+      - If "module_relative" is False, then "filename" specifies an
+        os-specific path.  The path may be absolute or relative (to
+        the current working directory).
+
+    Optional keyword arg "name" gives the name of the test; by default
+    use the file's basename.
+
+    Optional keyword argument "package" is a Python package or the
+    name of a Python package whose directory should be used as the
+    base directory for a module relative filename.  If no package is
+    specified, then the calling module's directory is used as the base
+    directory for module relative filenames.  It is an error to
+    specify "package" if "module_relative" is False.
+
+    Optional keyword arg "globs" gives a dict to be used as the globals
+    when executing examples; by default, use {}.  A copy of this dict
+    is actually used for each docstring, so that each docstring's
+    examples start with a clean slate.
+
+    Optional keyword arg "extraglobs" gives a dictionary that should be
+    merged into the globals that are used to execute examples.  By
+    default, no extra globals are used.
+
+    Optional keyword arg "verbose" prints lots of stuff if true, prints
+    only failures if false; by default, it's true iff "-v" is in sys.argv.
+
+    Optional keyword arg "report" prints a summary at the end when true,
+    else prints nothing at the end.  In verbose mode, the summary is
+    detailed, else very brief (in fact, empty if all tests passed).
+
+    Optional keyword arg "optionflags" or's together module constants,
+    and defaults to 0.  Possible values (see the docs for details):
+
+        DONT_ACCEPT_TRUE_FOR_1
+        DONT_ACCEPT_BLANKLINE
+        NORMALIZE_WHITESPACE
+        ELLIPSIS
+        IGNORE_EXCEPTION_DETAIL
+        REPORT_UDIFF
+        REPORT_CDIFF
+        REPORT_NDIFF
+        REPORT_ONLY_FIRST_FAILURE
+
+    Optional keyword arg "raise_on_error" raises an exception on the
+    first unexpected exception or failure. This allows failures to be
+    post-mortem debugged.
+
+    Optional keyword arg "parser" specifies a DocTestParser (or
+    subclass) that should be used to extract tests from the files.
+
+    Advanced tomfoolery:  testmod runs methods of a local instance of
+    class doctest.Tester, then merges the results into (or creates)
+    global Tester instance doctest.master.  Methods of doctest.master
+    can be called directly too, if you want to do something unusual.
+    Passing report=0 to testmod is especially useful then, to delay
+    displaying a summary.  Invoke doctest.master.summarize(verbose)
+    when you're done fiddling.
+    """
+    global master
+
+    if package and not module_relative:
+        raise ValueError("Package may only be specified for module-"
+                         "relative paths.")
+
+    # Relativize the path
+    if module_relative:
+        package = _normalize_module(package)
+        filename = _module_relative_path(package, filename)
+
+    # If no name was given, then use the file's name.
+    if name is None:
+        name = os.path.basename(filename)
+
+    # Assemble the globals.
+    if globs is None:
+        globs = {}
+    else:
+        globs = globs.copy()
+    if extraglobs is not None:
+        globs.update(extraglobs)
+
+    if raise_on_error:
+        runner = DebugRunner(verbose=verbose, optionflags=optionflags)
+    else:
+        runner = DocTestRunner(verbose=verbose, optionflags=optionflags)
+
+    # Read the file, convert it to a test, and run it.
+    s = open(filename).read()
+    test = parser.get_doctest(s, globs, name, filename, 0)
+    runner.run(test)
+
+    if report:
+        runner.summarize()
+
+    if master is None:
+        master = runner
+    else:
+        master.merge(runner)
+
+    return runner.failures, runner.tries
+
+def run_docstring_examples(f, globs, verbose=False, name="NoName",
+                           compileflags=None, optionflags=0):
+    """
+    Test examples in the given object's docstring (`f`), using `globs`
+    as globals.  Optional argument `name` is used in failure messages.
+    If the optional argument `verbose` is true, then generate output
+    even if there are no failures.
+
+    `compileflags` gives the set of flags that should be used by the
+    Python compiler when running the examples.  If not specified, then
+    it will default to the set of future-import flags that apply to
+    `globs`.
+
+    Optional keyword arg `optionflags` specifies options for the
+    testing and output.  See the documentation for `testmod` for more
+    information.
+    """
+    # Find, parse, and run all tests in the given module.
+    finder = DocTestFinder(verbose=verbose, recurse=False)
+    runner = DocTestRunner(verbose=verbose, optionflags=optionflags)
+    for test in finder.find(f, name, globs=globs):
+        runner.run(test, compileflags=compileflags)
+
+######################################################################
+## 7. Tester
+######################################################################
+# This is provided only for backwards compatibility.  It's not
+# actually used in any way.
+
+class Tester:
+    def __init__(self, mod=None, globs=None, verbose=None,
+                 isprivate=None, optionflags=0):
+
+        warnings.warn("class Tester is deprecated; "
+                      "use class doctest.DocTestRunner instead",
+                      DeprecationWarning, stacklevel=2)
+        if mod is None and globs is None:
+            raise TypeError("Tester.__init__: must specify mod or globs")
+        if mod is not None and not inspect.ismodule(mod):
+            raise TypeError("Tester.__init__: mod must be a module; %r" %
+                            (mod,))
+        if globs is None:
+            globs = mod.__dict__
+        self.globs = globs
+
+        self.verbose = verbose
+        self.isprivate = isprivate
+        self.optionflags = optionflags
+        self.testfinder = DocTestFinder(_namefilter=isprivate)
+        self.testrunner = DocTestRunner(verbose=verbose,
+                                        optionflags=optionflags)
+
+    def runstring(self, s, name):
+        test = DocTestParser().get_doctest(s, self.globs, name, None, None)
+        if self.verbose:
+            print "Running string", name
+        (f,t) = self.testrunner.run(test)
+        if self.verbose:
+            print f, "of", t, "examples failed in string", name
+        return (f,t)
+
+    def rundoc(self, object, name=None, module=None):
+        f = t = 0
+        tests = self.testfinder.find(object, name, module=module,
+                                     globs=self.globs)
+        for test in tests:
+            (f2, t2) = self.testrunner.run(test)
+            (f,t) = (f+f2, t+t2)
+        return (f,t)
+
+    def rundict(self, d, name, module=None):
+        import new
+        m = new.module(name)
+        m.__dict__.update(d)
+        if module is None:
+            module = False
+        return self.rundoc(m, name, module)
+
+    def run__test__(self, d, name):
+        import new
+        m = new.module(name)
+        m.__test__ = d
+        return self.rundoc(m, name)
+
+    def summarize(self, verbose=None):
+        return self.testrunner.summarize(verbose)
+
+    def merge(self, other):
+        self.testrunner.merge(other.testrunner)
+
+######################################################################
+## 8. Unittest Support
+######################################################################
+
+_unittest_reportflags = 0
+
+def set_unittest_reportflags(flags):
+    """Sets the unittest option flags.
+
+    The old flag is returned so that a runner could restore the old
+    value if it wished to:
+
+      >>> old = _unittest_reportflags
+      >>> set_unittest_reportflags(REPORT_NDIFF |
+      ...                          REPORT_ONLY_FIRST_FAILURE) == old
+      True
+
+      >>> import doctest
+      >>> doctest._unittest_reportflags == (REPORT_NDIFF |
+      ...                                   REPORT_ONLY_FIRST_FAILURE)
+      True
+
+    Only reporting flags can be set:
+
+      >>> set_unittest_reportflags(ELLIPSIS)
+      Traceback (most recent call last):
+      ...
+      ValueError: ('Only reporting flags allowed', 8)
+
+      >>> set_unittest_reportflags(old) == (REPORT_NDIFF |
+      ...                                   REPORT_ONLY_FIRST_FAILURE)
+      True
+    """
+    global _unittest_reportflags
+
+    if (flags & REPORTING_FLAGS) != flags:
+        raise ValueError("Only reporting flags allowed", flags)
+    old = _unittest_reportflags
+    _unittest_reportflags = flags
+    return old
+
+
+class DocTestCase(unittest.TestCase):
+
+    def __init__(self, test, optionflags=0, setUp=None, tearDown=None,
+                 checker=None):
+
+        unittest.TestCase.__init__(self)
+        self._dt_optionflags = optionflags
+        self._dt_checker = checker
+        self._dt_test = test
+        self._dt_setUp = setUp
+        self._dt_tearDown = tearDown
+
+    def setUp(self):
+        test = self._dt_test
+
+        if self._dt_setUp is not None:
+            self._dt_setUp(test)
+
+    def tearDown(self):
+        test = self._dt_test
+
+        if self._dt_tearDown is not None:
+            self._dt_tearDown(test)
+
+        test.globs.clear()
+
+    def runTest(self):
+        test = self._dt_test
+        old = sys.stdout
+        new = StringIO()
+        optionflags = self._dt_optionflags
+
+        if not (optionflags & REPORTING_FLAGS):
+            # The option flags don't include any reporting flags,
+            # so add the default reporting flags
+            optionflags |= _unittest_reportflags
+
+        runner = DocTestRunner(optionflags=optionflags,
+                               checker=self._dt_checker, verbose=False)
+
+        try:
+            runner.DIVIDER = "-"*70
+            failures, tries = runner.run(
+                test, out=new.write, clear_globs=False)
+        finally:
+            sys.stdout = old
+
+        if failures:
+            raise self.failureException(self.format_failure(new.getvalue()))
+
+    def format_failure(self, err):
+        test = self._dt_test
+        if test.lineno is None:
+            lineno = 'unknown line number'
+        else:
+            lineno = '%s' % test.lineno
+        lname = '.'.join(test.name.split('.')[-1:])
+        return ('Failed doctest test for %s\n'
+                '  File "%s", line %s, in %s\n\n%s'
+                % (test.name, test.filename, lineno, lname, err)
+                )
+
+    def debug(self):
+        r"""Run the test case without results and without catching exceptions
+
+           The unit test framework includes a debug method on test cases
+           and test suites to support post-mortem debugging.  The test code
+           is run in such a way that errors are not caught.  This way a
+           caller can catch the errors and initiate post-mortem debugging.
+
+           The DocTestCase provides a debug method that raises
+           UnexpectedException errors if there is an unexepcted
+           exception:
+
+             >>> test = DocTestParser().get_doctest('>>> raise KeyError\n42',
+             ...                {}, 'foo', 'foo.py', 0)
+             >>> case = DocTestCase(test)
+             >>> try:
+             ...     case.debug()
+             ... except UnexpectedException, failure:
+             ...     pass
+
+           The UnexpectedException contains the test, the example, and
+           the original exception:
+
+             >>> failure.test is test
+             True
+
+             >>> failure.example.want
+             '42\n'
+
+             >>> exc_info = failure.exc_info
+             >>> raise exc_info[0], exc_info[1], exc_info[2]
+             Traceback (most recent call last):
+             ...
+             KeyError
+
+           If the output doesn't match, then a DocTestFailure is raised:
+
+             >>> test = DocTestParser().get_doctest('''
+             ...      >>> x = 1
+             ...      >>> x
+             ...      2
+             ...      ''', {}, 'foo', 'foo.py', 0)
+             >>> case = DocTestCase(test)
+
+             >>> try:
+             ...    case.debug()
+             ... except DocTestFailure, failure:
+             ...    pass
+
+           DocTestFailure objects provide access to the test:
+
+             >>> failure.test is test
+             True
+
+           As well as to the example:
+
+             >>> failure.example.want
+             '2\n'
+
+           and the actual output:
+
+             >>> failure.got
+             '1\n'
+
+           """
+
+        self.setUp()
+        runner = DebugRunner(optionflags=self._dt_optionflags,
+                             checker=self._dt_checker, verbose=False)
+        runner.run(self._dt_test)
+        self.tearDown()
+
+    def id(self):
+        return self._dt_test.name
+
+    def __repr__(self):
+        name = self._dt_test.name.split('.')
+        return "%s (%s)" % (name[-1], '.'.join(name[:-1]))
+
+    __str__ = __repr__
+
+    def shortDescription(self):
+        return "Doctest: " + self._dt_test.name
+
+def DocTestSuite(module=None, globs=None, extraglobs=None, test_finder=None,
+                 **options):
+    """
+    Convert doctest tests for a module to a unittest test suite.
+
+    This converts each documentation string in a module that
+    contains doctest tests to a unittest test case.  If any of the
+    tests in a doc string fail, then the test case fails.  An exception
+    is raised showing the name of the file containing the test and a
+    (sometimes approximate) line number.
+
+    The `module` argument provides the module to be tested.  The argument
+    can be either a module or a module name.
+
+    If no argument is given, the calling module is used.
+
+    A number of options may be provided as keyword arguments:
+
+    setUp
+      A set-up function.  This is called before running the
+      tests in each file. The setUp function will be passed a DocTest
+      object.  The setUp function can access the test globals as the
+      globs attribute of the test passed.
+
+    tearDown
+      A tear-down function.  This is called after running the
+      tests in each file.  The tearDown function will be passed a DocTest
+      object.  The tearDown function can access the test globals as the
+      globs attribute of the test passed.
+
+    globs
+      A dictionary containing initial global variables for the tests.
+
+    optionflags
+       A set of doctest option flags expressed as an integer.
+    """
+
+    if test_finder is None:
+        test_finder = DocTestFinder()
+
+    module = _normalize_module(module)
+    tests = test_finder.find(module, globs=globs, extraglobs=extraglobs)
+    if globs is None:
+        globs = module.__dict__
+    if not tests:
+        # Why do we want to do this? Because it reveals a bug that might
+        # otherwise be hidden.
+        raise ValueError(module, "has no tests")
+
+    tests.sort()
+    suite = unittest.TestSuite()
+    for test in tests:
+        if len(test.examples) == 0:
+            continue
+        if not test.filename:
+            filename = module.__file__
+            if filename[-4:] in (".pyc", ".pyo"):
+                filename = filename[:-1]
+            test.filename = filename
+        suite.addTest(DocTestCase(test, **options))
+
+    return suite
+
+class DocFileCase(DocTestCase):
+
+    def id(self):
+        return '_'.join(self._dt_test.name.split('.'))
+
+    def __repr__(self):
+        return self._dt_test.filename
+    __str__ = __repr__
+
+    def format_failure(self, err):
+        return ('Failed doctest test for %s\n  File "%s", line 0\n\n%s'
+                % (self._dt_test.name, self._dt_test.filename, err)
+                )
+
+def DocFileTest(path, module_relative=True, package=None,
+                globs=None, parser=DocTestParser(), **options):
+    if globs is None:
+        globs = {}
+
+    if package and not module_relative:
+        raise ValueError("Package may only be specified for module-"
+                         "relative paths.")
+
+    # Relativize the path.
+    if module_relative:
+        package = _normalize_module(package)
+        path = _module_relative_path(package, path)
+
+    # Find the file and read it.
+    name = os.path.basename(path)
+    doc = open(path).read()
+
+    # Convert it to a test, and wrap it in a DocFileCase.
+    test = parser.get_doctest(doc, globs, name, path, 0)
+    return DocFileCase(test, **options)
+
+def DocFileSuite(*paths, **kw):
+    """A unittest suite for one or more doctest files.
+
+    The path to each doctest file is given as a string; the
+    interpretation of that string depends on the keyword argument
+    "module_relative".
+
+    A number of options may be provided as keyword arguments:
+
+    module_relative
+      If "module_relative" is True, then the given file paths are
+      interpreted as os-independent module-relative paths.  By
+      default, these paths are relative to the calling module's
+      directory; but if the "package" argument is specified, then
+      they are relative to that package.  To ensure os-independence,
+      "filename" should use "/" characters to separate path
+      segments, and may not be an absolute path (i.e., it may not
+      begin with "/").
+
+      If "module_relative" is False, then the given file paths are
+      interpreted as os-specific paths.  These paths may be absolute
+      or relative (to the current working directory).
+
+    package
+      A Python package or the name of a Python package whose directory
+      should be used as the base directory for module relative paths.
+      If "package" is not specified, then the calling module's
+      directory is used as the base directory for module relative
+      filenames.  It is an error to specify "package" if
+      "module_relative" is False.
+
+    setUp
+      A set-up function.  This is called before running the
+      tests in each file. The setUp function will be passed a DocTest
+      object.  The setUp function can access the test globals as the
+      globs attribute of the test passed.
+
+    tearDown
+      A tear-down function.  This is called after running the
+      tests in each file.  The tearDown function will be passed a DocTest
+      object.  The tearDown function can access the test globals as the
+      globs attribute of the test passed.
+
+    globs
+      A dictionary containing initial global variables for the tests.
+
+    optionflags
+      A set of doctest option flags expressed as an integer.
+
+    parser
+      A DocTestParser (or subclass) that should be used to extract
+      tests from the files.
+    """
+    suite = unittest.TestSuite()
+
+    # We do this here so that _normalize_module is called at the right
+    # level.  If it were called in DocFileTest, then this function
+    # would be the caller and we might guess the package incorrectly.
+    if kw.get('module_relative', True):
+        kw['package'] = _normalize_module(kw.get('package'))
+
+    for path in paths:
+        suite.addTest(DocFileTest(path, **kw))
+
+    return suite
+
+######################################################################
+## 9. Debugging Support
+######################################################################
+
+def script_from_examples(s):
+    r"""Extract script from text with examples.
+
+       Converts text with examples to a Python script.  Example input is
+       converted to regular code.  Example output and all other words
+       are converted to comments:
+
+       >>> text = '''
+       ...       Here are examples of simple math.
+       ...
+       ...           Python has super accurate integer addition
+       ...
+       ...           >>> 2 + 2
+       ...           5
+       ...
+       ...           And very friendly error messages:
+       ...
+       ...           >>> 1/0
+       ...           To Infinity
+       ...           And
+       ...           Beyond
+       ...
+       ...           You can use logic if you want:
+       ...
+       ...           >>> if 0:
+       ...           ...    blah
+       ...           ...    blah
+       ...           ...
+       ...
+       ...           Ho hum
+       ...           '''
+
+       >>> print script_from_examples(text)
+       # Here are examples of simple math.
+       #
+       #     Python has super accurate integer addition
+       #
+       2 + 2
+       # Expected:
+       ## 5
+       #
+       #     And very friendly error messages:
+       #
+       1/0
+       # Expected:
+       ## To Infinity
+       ## And
+       ## Beyond
+       #
+       #     You can use logic if you want:
+       #
+       if 0:
+          blah
+          blah
+       #
+       #     Ho hum
+       """
+    output = []
+    for piece in DocTestParser().parse(s):
+        if isinstance(piece, Example):
+            # Add the example's source code (strip trailing NL)
+            output.append(piece.source[:-1])
+            # Add the expected output:
+            want = piece.want
+            if want:
+                output.append('# Expected:')
+                output += ['## '+l for l in want.split('\n')[:-1]]
+        else:
+            # Add non-example text.
+            output += [_comment_line(l)
+                       for l in piece.split('\n')[:-1]]
+
+    # Trim junk on both ends.
+    while output and output[-1] == '#':
+        output.pop()
+    while output and output[0] == '#':
+        output.pop(0)
+    # Combine the output, and return it.
+    return '\n'.join(output)
+
+def testsource(module, name):
+    """Extract the test sources from a doctest docstring as a script.
+
+    Provide the module (or dotted name of the module) containing the
+    test to be debugged and the name (within the module) of the object
+    with the doc string with tests to be debugged.
+    """
+    module = _normalize_module(module)
+    tests = DocTestFinder().find(module)
+    test = [t for t in tests if t.name == name]
+    if not test:
+        raise ValueError(name, "not found in tests")
+    test = test[0]
+    testsrc = script_from_examples(test.docstring)
+    return testsrc
+
+def debug_src(src, pm=False, globs=None):
+    """Debug a single doctest docstring, in argument `src`'"""
+    testsrc = script_from_examples(src)
+    debug_script(testsrc, pm, globs)
+
+def debug_script(src, pm=False, globs=None):
+    "Debug a test script.  `src` is the script, as a string."
+    import pdb
+
+    # Note that tempfile.NameTemporaryFile() cannot be used.  As the
+    # docs say, a file so created cannot be opened by name a second time
+    # on modern Windows boxes, and execfile() needs to open it.
+    srcfilename = tempfile.mktemp(".py", "doctestdebug")
+    f = open(srcfilename, 'w')
+    f.write(src)
+    f.close()
+
+    try:
+        if globs:
+            globs = globs.copy()
+        else:
+            globs = {}
+
+        if pm:
+            try:
+                execfile(srcfilename, globs, globs)
+            except:
+                print sys.exc_info()[1]
+                pdb.post_mortem(sys.exc_info()[2])
+        else:
+            # Note that %r is vital here.  '%s' instead can, e.g., cause
+            # backslashes to get treated as metacharacters on Windows.
+            pdb.run("execfile(%r)" % srcfilename, globs, globs)
+
+    finally:
+        os.remove(srcfilename)
+
+def debug(module, name, pm=False):
+    """Debug a single doctest docstring.
+
+    Provide the module (or dotted name of the module) containing the
+    test to be debugged and the name (within the module) of the object
+    with the docstring with tests to be debugged.
+    """
+    module = _normalize_module(module)
+    testsrc = testsource(module, name)
+    debug_script(testsrc, pm, module.__dict__)
+
+######################################################################
+## 10. Example Usage
+######################################################################
+class _TestClass:
+    """
+    A pointless class, for sanity-checking of docstring testing.
+
+    Methods:
+        square()
+        get()
+
+    >>> _TestClass(13).get() + _TestClass(-12).get()
+    1
+    >>> hex(_TestClass(13).square().get())
+    '0xa9'
+    """
+
+    def __init__(self, val):
+        """val -> _TestClass object with associated value val.
+
+        >>> t = _TestClass(123)
+        >>> print t.get()
+        123
+        """
+
+        self.val = val
+
+    def square(self):
+        """square() -> square TestClass's associated value
+
+        >>> _TestClass(13).square().get()
+        169
+        """
+
+        self.val = self.val ** 2
+        return self
+
+    def get(self):
+        """get() -> return TestClass's associated value.
+
+        >>> x = _TestClass(-42)
+        >>> print x.get()
+        -42
+        """
+
+        return self.val
+
+__test__ = {"_TestClass": _TestClass,
+            "string": r"""
+                      Example of a string object, searched as-is.
+                      >>> x = 1; y = 2
+                      >>> x + y, x * y
+                      (3, 2)
+                      """,
+
+            "bool-int equivalence": r"""
+                                    In 2.2, boolean expressions displayed
+                                    0 or 1.  By default, we still accept
+                                    them.  This can be disabled by passing
+                                    DONT_ACCEPT_TRUE_FOR_1 to the new
+                                    optionflags argument.
+                                    >>> 4 == 4
+                                    1
+                                    >>> 4 == 4
+                                    True
+                                    >>> 4 > 4
+                                    0
+                                    >>> 4 > 4
+                                    False
+                                    """,
+
+            "blank lines": r"""
+                Blank lines can be marked with <BLANKLINE>:
+                    >>> print 'foo\n\nbar\n'
+                    foo
+                    <BLANKLINE>
+                    bar
+                    <BLANKLINE>
+            """,
+
+            "ellipsis": r"""
+                If the ellipsis flag is used, then '...' can be used to
+                elide substrings in the desired output:
+                    >>> print range(1000) #doctest: +ELLIPSIS
+                    [0, 1, 2, ..., 999]
+            """,
+
+            "whitespace normalization": r"""
+                If the whitespace normalization flag is used, then
+                differences in whitespace are ignored.
+                    >>> print range(30) #doctest: +NORMALIZE_WHITESPACE
+                    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
+                     15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
+                     27, 28, 29]
+            """,
+           }
+
+def _test():
+    r = unittest.TextTestRunner()
+    r.run(DocTestSuite())
+
+if __name__ == "__main__":
+    _test()
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/template.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/template.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/template.py (revision 3)
@@ -0,0 +1,758 @@
+"""
+A small templating language
+
+This implements a small templating language for use internally in
+Paste and Paste Script.  This language implements if/elif/else,
+for/continue/break, expressions, and blocks of Python code.  The
+syntax is::
+
+  {{any expression (function calls etc)}}
+  {{any expression | filter}}
+  {{for x in y}}...{{endfor}}
+  {{if x}}x{{elif y}}y{{else}}z{{endif}}
+  {{py:x=1}}
+  {{py:
+  def foo(bar):
+      return 'baz'
+  }}
+  {{default var = default_value}}
+  {{# comment}}
+
+You use this with the ``Template`` class or the ``sub`` shortcut.
+The ``Template`` class takes the template string and the name of
+the template (for errors) and a default namespace.  Then (like
+``string.Template``) you can call the ``tmpl.substitute(**kw)``
+method to make a substitution (or ``tmpl.substitute(a_dict)``).
+
+``sub(content, **kw)`` substitutes the template immediately.  You
+can use ``__name='tmpl.html'`` to set the name of the template.
+
+If there are syntax errors ``TemplateError`` will be raised.
+"""
+
+import re
+import sys
+import cgi
+import urllib
+from paste.util.looper import looper
+
+__all__ = ['TemplateError', 'Template', 'sub', 'HTMLTemplate',
+           'sub_html', 'html', 'bunch']
+
+token_re = re.compile(r'\{\{|\}\}')
+in_re = re.compile(r'\s+in\s+')
+var_re = re.compile(r'^[a-z_][a-z0-9_]*$', re.I)
+
+class TemplateError(Exception):
+    """Exception raised while parsing a template
+    """
+
+    def __init__(self, message, position, name=None):
+        self.message = message
+        self.position = position
+        self.name = name
+
+    def __str__(self):
+        msg = '%s at line %s column %s' % (
+            self.message, self.position[0], self.position[1])
+        if self.name:
+            msg += ' in %s' % self.name
+        return msg
+
+class _TemplateContinue(Exception):
+    pass
+
+class _TemplateBreak(Exception):
+    pass
+
+class Template(object):
+
+    default_namespace = {
+        'start_braces': '{{',
+        'end_braces': '}}',
+        'looper': looper,
+        }
+
+    default_encoding = 'utf8'
+
+    def __init__(self, content, name=None, namespace=None):
+        self.content = content
+        self._unicode = isinstance(content, unicode)
+        self.name = name
+        self._parsed = parse(content, name=name)
+        if namespace is None:
+            namespace = {}
+        self.namespace = namespace
+
+    def from_filename(cls, filename, namespace=None, encoding=None):
+        f = open(filename, 'rb')
+        c = f.read()
+        f.close()
+        if encoding:
+            c = c.decode(encoding)
+        return cls(content=c, name=filename, namespace=namespace)
+
+    from_filename = classmethod(from_filename)
+
+    def __repr__(self):
+        return '<%s %s name=%r>' % (
+            self.__class__.__name__,
+            hex(id(self))[2:], self.name)
+
+    def substitute(self, *args, **kw):
+        if args:
+            if kw:
+                raise TypeError(
+                    "You can only give positional *or* keyword arguments")
+            if len(args) > 1:
+                raise TypeError(
+                    "You can only give on positional argument")
+            kw = args[0]
+        ns = self.default_namespace.copy()
+        ns.update(self.namespace)
+        ns.update(kw)
+        result = self._interpret(ns)
+        return result
+
+    def _interpret(self, ns):
+        __traceback_hide__ = True
+        parts = []
+        self._interpret_codes(self._parsed, ns, out=parts)
+        return ''.join(parts)
+
+    def _interpret_codes(self, codes, ns, out):
+        __traceback_hide__ = True
+        for item in codes:
+            if isinstance(item, basestring):
+                out.append(item)
+            else:
+                self._interpret_code(item, ns, out)
+
+    def _interpret_code(self, code, ns, out):
+        __traceback_hide__ = True
+        name, pos = code[0], code[1]
+        if name == 'py':
+            self._exec(code[2], ns, pos)
+        elif name == 'continue':
+            raise _TemplateContinue()
+        elif name == 'break':
+            raise _TemplateBreak()
+        elif name == 'for':
+            vars, expr, content = code[2], code[3], code[4]
+            expr = self._eval(expr, ns, pos)
+            self._interpret_for(vars, expr, content, ns, out)
+        elif name == 'cond':
+            parts = code[2:]
+            self._interpret_if(parts, ns, out)
+        elif name == 'expr':
+            parts = code[2].split('|')
+            base = self._eval(parts[0], ns, pos)
+            for part in parts[1:]:
+                func = self._eval(part, ns, pos)
+                base = func(base)
+            out.append(self._repr(base, pos))
+        elif name == 'default':
+            var, expr = code[2], code[3]
+            if var not in ns:
+                result = self._eval(expr, ns, pos)
+                ns[var] = result
+        elif name == 'comment':
+            return
+        else:
+            assert 0, "Unknown code: %r" % name
+
+    def _interpret_for(self, vars, expr, content, ns, out):
+        __traceback_hide__ = True
+        for item in expr:
+            if len(vars) == 1:
+                ns[vars[0]] = item
+            else:
+                if len(vars) != len(item):
+                    raise ValueError(
+                        'Need %i items to unpack (got %i items)'
+                        % (len(vars), len(item)))
+                for name, value in zip(vars, item):
+                    ns[name] = value
+            try:
+                self._interpret_codes(content, ns, out)
+            except _TemplateContinue:
+                continue
+            except _TemplateBreak:
+                break
+
+    def _interpret_if(self, parts, ns, out):
+        __traceback_hide__ = True
+        # @@: if/else/else gets through
+        for part in parts:
+            assert not isinstance(part, basestring)
+            name, pos = part[0], part[1]
+            if name == 'else':
+                result = True
+            else:
+                result = self._eval(part[2], ns, pos)
+            if result:
+                self._interpret_codes(part[3], ns, out)
+                break
+
+    def _eval(self, code, ns, pos):
+        __traceback_hide__ = True
+        try:
+            value = eval(code, ns)
+            return value
+        except:
+            exc_info = sys.exc_info()
+            e = exc_info[1]
+            if getattr(e, 'args'):
+                arg0 = e.args[0]
+            else:
+                arg0 = str(e)
+            e.args = (self._add_line_info(arg0, pos),)
+            raise exc_info[0], e, exc_info[2]
+
+    def _exec(self, code, ns, pos):
+        __traceback_hide__ = True
+        try:
+            exec code in ns
+        except:
+            exc_info = sys.exc_info()
+            e = exc_info[1]
+            e.args = (self._add_line_info(e.args[0], pos),)
+            raise exc_info[0], e, exc_info[2]
+
+    def _repr(self, value, pos):
+        __traceback_hide__ = True
+        try:
+            if value is None:
+                return ''
+            if self._unicode:
+                try:
+                    value = unicode(value)
+                except UnicodeDecodeError:
+                    value = str(value)
+            else:
+                value = str(value)
+        except:
+            exc_info = sys.exc_info()
+            e = exc_info[1]
+            e.args = (self._add_line_info(e.args[0], pos),)
+            raise exc_info[0], e, exc_info[2]
+        else:
+            if self._unicode and isinstance(value, str):
+                if not self.decode_encoding:
+                    raise UnicodeDecodeError(
+                        'Cannot decode str value %r into unicode '
+                        '(no default_encoding provided)' % value)
+                value = value.decode(self.default_encoding)
+            elif not self._unicode and isinstance(value, unicode):
+                if not self.decode_encoding:
+                    raise UnicodeEncodeError(
+                        'Cannot encode unicode value %r into str '
+                        '(no default_encoding provided)' % value)
+                value = value.encode(self.default_encoding)
+            return value
+        
+
+    def _add_line_info(self, msg, pos):
+        msg = "%s at line %s column %s" % (
+            msg, pos[0], pos[1])
+        if self.name:
+            msg += " in file %s" % self.name
+        return msg
+
+def sub(content, **kw):
+    name = kw.get('__name')
+    tmpl = Template(content, name=name)
+    return tmpl.substitute(kw)
+    return result
+
+def paste_script_template_renderer(content, vars, filename=None):
+    tmpl = Template(content, name=filename)
+    return tmpl.substitute(vars)
+
+class bunch(dict):
+
+    def __init__(self, **kw):
+        for name, value in kw.items():
+            setattr(self, name, value)
+
+    def __setattr__(self, name, value):
+        self[name] = value
+
+    def __getattr__(self, name):
+        try:
+            return self[name]
+        except KeyError:
+            raise AttributeError(name)
+
+    def __getitem__(self, key):
+        if 'default' in self:
+            try:
+                return dict.__getitem__(self, key)
+            except KeyError:
+                return dict.__getitem__(self, 'default')
+        else:
+            return dict.__getitem__(self, key)
+
+    def __repr__(self):
+        items = [
+            (k, v) for k, v in self.items()]
+        items.sort()
+        return '<%s %s>' % (
+            self.__class__.__name__,
+            ' '.join(['%s=%r' % (k, v) for k, v in items]))
+
+############################################################
+## HTML Templating
+############################################################
+
+class html(object):
+    def __init__(self, value):
+        self.value = value
+    def __str__(self):
+        return self.value
+    def __repr__(self):
+        return '<%s %r>' % (
+            self.__class__.__name__, self.value)
+
+def html_quote(value):
+    if value is None:
+        return ''
+    if not isinstance(value, basestring):
+        if hasattr(value, '__unicode__'):
+            value = unicode(value)
+        else:
+            value = str(value)
+    value = cgi.escape(value, 1)
+    if isinstance(value, unicode):
+        value = value.encode('ascii', 'xmlcharrefreplace')
+    return value
+
+def url(v):
+    if not isinstance(v, basestring):
+        if hasattr(v, '__unicode__'):
+            v = unicode(v)
+        else:
+            v = str(v)
+    if isinstance(v, unicode):
+        v = v.encode('utf8')
+    return urllib.quote(v)
+
+def attr(**kw):
+    kw = kw.items()
+    kw.sort()
+    parts = []
+    for name, value in kw:
+        if value is None:
+            continue
+        if name.endswith('_'):
+            name = name[:-1]
+        parts.append('%s="%s"' % (html_quote(name), html_quote(value)))
+    return html(' '.join(parts))
+
+class HTMLTemplate(Template):
+
+    default_namespace = Template.default_namespace.copy()
+    default_namespace.update(dict(
+        html=html,
+        attr=attr,
+        url=url,
+        ))
+
+    def _repr(self, value, pos):
+        plain = Template._repr(self, value, pos)
+        if isinstance(value, html):
+            return plain
+        else:
+            return html_quote(plain)
+
+def sub_html(content, **kw):
+    name = kw.get('__name')
+    tmpl = HTMLTemplate(content, name=name)
+    return tmpl.substitute(kw)
+    return result
+
+
+############################################################
+## Lexing and Parsing
+############################################################
+
+def lex(s, name=None, trim_whitespace=True):
+    """
+    Lex a string into chunks:
+
+        >>> lex('hey')
+        ['hey']
+        >>> lex('hey {{you}}')
+        ['hey ', ('you', (1, 7))]
+        >>> lex('hey {{')
+        Traceback (most recent call last):
+            ...
+        TemplateError: No }} to finish last expression at line 1 column 7
+        >>> lex('hey }}')
+        Traceback (most recent call last):
+            ...
+        TemplateError: }} outside expression at line 1 column 7
+        >>> lex('hey {{ {{')
+        Traceback (most recent call last):
+            ...
+        TemplateError: {{ inside expression at line 1 column 10
+
+    """
+    in_expr = False
+    chunks = []
+    last = 0
+    last_pos = (1, 1)
+    for match in token_re.finditer(s):
+        expr = match.group(0)
+        pos = find_position(s, match.end())
+        if expr == '{{' and in_expr:
+            raise TemplateError('{{ inside expression', position=pos,
+                                name=name)
+        elif expr == '}}' and not in_expr:
+            raise TemplateError('}} outside expression', position=pos,
+                                name=name)
+        if expr == '{{':
+            part = s[last:match.start()]
+            if part:
+                chunks.append(part)
+            in_expr = True
+        else:
+            chunks.append((s[last:match.start()], last_pos))
+            in_expr = False
+        last = match.end()
+        last_pos = pos
+    if in_expr:
+        raise TemplateError('No }} to finish last expression',
+                            name=name, position=last_pos)
+    part = s[last:]
+    if part:
+        chunks.append(part)
+    if trim_whitespace:
+        chunks = trim_lex(chunks)
+    return chunks
+
+statement_re = re.compile(r'^(?:if |elif |else |for |py:)')
+single_statements = ['endif', 'endfor', 'continue', 'break']
+trail_whitespace_re = re.compile(r'\n[\t ]*$')
+lead_whitespace_re = re.compile(r'^[\t ]*\n')
+
+def trim_lex(tokens):
+    r"""
+    Takes a lexed set of tokens, and removes whitespace when there is
+    a directive on a line by itself:
+
+       >>> tokens = lex('{{if x}}\nx\n{{endif}}\ny', trim_whitespace=False)
+       >>> tokens
+       [('if x', (1, 3)), '\nx\n', ('endif', (3, 3)), '\ny']
+       >>> trim_lex(tokens)
+       [('if x', (1, 3)), 'x\n', ('endif', (3, 3)), 'y']
+    """
+    for i in range(len(tokens)):
+        current = tokens[i]
+        if isinstance(tokens[i], basestring):
+            # we don't trim this
+            continue
+        item = current[0]
+        if not statement_re.search(item) and item not in single_statements:
+            continue
+        if not i:
+            prev = ''
+        else:
+            prev = tokens[i-1]
+        if i+1 >= len(tokens):
+            next = ''
+        else:
+            next = tokens[i+1]
+        if (not isinstance(next, basestring)
+            or not isinstance(prev, basestring)):
+            continue
+        if ((not prev or trail_whitespace_re.search(prev))
+            and (not next or lead_whitespace_re.search(next))):
+            if prev:
+                m = trail_whitespace_re.search(prev)
+                # +1 to leave the leading \n on:
+                prev = prev[:m.start()+1]
+                tokens[i-1] = prev
+            if next:
+                m = lead_whitespace_re.search(next)
+                next = next[m.end():]
+                tokens[i+1] = next
+    return tokens
+        
+
+def find_position(string, index):
+    """Given a string and index, return (line, column)"""
+    leading = string[:index].splitlines()
+    return (len(leading), len(leading[-1])+1)
+
+def parse(s, name=None):
+    r"""
+    Parses a string into a kind of AST
+
+        >>> parse('{{x}}')
+        [('expr', (1, 3), 'x')]
+        >>> parse('foo')
+        ['foo']
+        >>> parse('{{if x}}test{{endif}}')
+        [('cond', (1, 3), ('if', (1, 3), 'x', ['test']))]
+        >>> parse('series->{{for x in y}}x={{x}}{{endfor}}')
+        ['series->', ('for', (1, 11), ('x',), 'y', ['x=', ('expr', (1, 27), 'x')])]
+        >>> parse('{{for x, y in z:}}{{continue}}{{endfor}}')
+        [('for', (1, 3), ('x', 'y'), 'z', [('continue', (1, 21))])]
+        >>> parse('{{py:x=1}}')
+        [('py', (1, 3), 'x=1')]
+        >>> parse('{{if x}}a{{elif y}}b{{else}}c{{endif}}')
+        [('cond', (1, 3), ('if', (1, 3), 'x', ['a']), ('elif', (1, 12), 'y', ['b']), ('else', (1, 23), None, ['c']))]
+
+    Some exceptions::
+        
+        >>> parse('{{continue}}')
+        Traceback (most recent call last):
+            ...
+        TemplateError: continue outside of for loop at line 1 column 3
+        >>> parse('{{if x}}foo')
+        Traceback (most recent call last):
+            ...
+        TemplateError: No {{endif}} at line 1 column 3
+        >>> parse('{{else}}')
+        Traceback (most recent call last):
+            ...
+        TemplateError: else outside of an if block at line 1 column 3
+        >>> parse('{{if x}}{{for x in y}}{{endif}}{{endfor}}')
+        Traceback (most recent call last):
+            ...
+        TemplateError: Unexpected endif at line 1 column 25
+        >>> parse('{{if}}{{endif}}')
+        Traceback (most recent call last):
+            ...
+        TemplateError: if with no expression at line 1 column 3
+        >>> parse('{{for x y}}{{endfor}}')
+        Traceback (most recent call last):
+            ...
+        TemplateError: Bad for (no "in") in 'x y' at line 1 column 3
+        >>> parse('{{py:x=1\ny=2}}')
+        Traceback (most recent call last):
+            ...
+        TemplateError: Multi-line py blocks must start with a newline at line 1 column 3
+    """
+    tokens = lex(s, name=name)
+    result = []
+    while tokens:
+        next, tokens = parse_expr(tokens, name)
+        result.append(next)
+    return result
+
+def parse_expr(tokens, name, context=()):
+    if isinstance(tokens[0], basestring):
+        return tokens[0], tokens[1:]
+    expr, pos = tokens[0]
+    expr = expr.strip()
+    if expr.startswith('py:'):
+        expr = expr[3:].lstrip(' \t')
+        if expr.startswith('\n'):
+            expr = expr[1:]
+        else:
+            if '\n' in expr:
+                raise TemplateError(
+                    'Multi-line py blocks must start with a newline',
+                    position=pos, name=name)
+        return ('py', pos, expr), tokens[1:]
+    elif expr in ('continue', 'break'):
+        if 'for' not in context:
+            raise TemplateError(
+                'continue outside of for loop',
+                position=pos, name=name)
+        return (expr, pos), tokens[1:]
+    elif expr.startswith('if '):
+        return parse_cond(tokens, name, context)
+    elif (expr.startswith('elif ')
+          or expr == 'else'):
+        raise TemplateError(
+            '%s outside of an if block' % expr.split()[0],
+            position=pos, name=name)
+    elif expr in ('if', 'elif', 'for'):
+        raise TemplateError(
+            '%s with no expression' % expr,
+            position=pos, name=name)
+    elif expr in ('endif', 'endfor'):
+        raise TemplateError(
+            'Unexpected %s' % expr,
+            position=pos, name=name)
+    elif expr.startswith('for '):
+        return parse_for(tokens, name, context)
+    elif expr.startswith('default '):
+        return parse_default(tokens, name, context)
+    elif expr.startswith('#'):
+        return ('comment', pos, tokens[0][0]), tokens[1:]
+    return ('expr', pos, tokens[0][0]), tokens[1:]
+
+def parse_cond(tokens, name, context):
+    start = tokens[0][1]
+    pieces = []
+    context = context + ('if',)
+    while 1:
+        if not tokens:
+            raise TemplateError(
+                'Missing {{endif}}',
+                position=start, name=name)
+        if (isinstance(tokens[0], tuple)
+            and tokens[0][0] == 'endif'):
+            return ('cond', start) + tuple(pieces), tokens[1:]
+        next, tokens = parse_one_cond(tokens, name, context)
+        pieces.append(next)
+
+def parse_one_cond(tokens, name, context):
+    (first, pos), tokens = tokens[0], tokens[1:]
+    content = []
+    if first.endswith(':'):
+        first = first[:-1]
+    if first.startswith('if '):
+        part = ('if', pos, first[3:].lstrip(), content)
+    elif first.startswith('elif '):
+        part = ('elif', pos, first[5:].lstrip(), content)
+    elif first == 'else':
+        part = ('else', pos, None, content)
+    else:
+        assert 0, "Unexpected token %r at %s" % (first, pos)
+    while 1:
+        if not tokens:
+            raise TemplateError(
+                'No {{endif}}',
+                position=pos, name=name)
+        if (isinstance(tokens[0], tuple)
+            and (tokens[0][0] == 'endif'
+                 or tokens[0][0].startswith('elif ')
+                 or tokens[0][0] == 'else')):
+            return part, tokens
+        next, tokens = parse_expr(tokens, name, context)
+        content.append(next)
+        
+def parse_for(tokens, name, context):
+    first, pos = tokens[0]
+    tokens = tokens[1:]
+    context = ('for',) + context
+    content = []
+    assert first.startswith('for ')
+    if first.endswith(':'):
+        first = first[:-1]
+    first = first[3:].strip()
+    match = in_re.search(first)
+    if not match:
+        raise TemplateError(
+            'Bad for (no "in") in %r' % first,
+            position=pos, name=name)
+    vars = first[:match.start()]
+    if '(' in vars:
+        raise TemplateError(
+            'You cannot have () in the variable section of a for loop (%r)'
+            % vars, position=pos, name=name)
+    vars = tuple([
+        v.strip() for v in first[:match.start()].split(',')
+        if v.strip()])
+    expr = first[match.end():]
+    while 1:
+        if not tokens:
+            raise TemplateError(
+                'No {{endfor}}',
+                position=pos, name=name)
+        if (isinstance(tokens[0], tuple)
+            and tokens[0][0] == 'endfor'):
+            return ('for', pos, vars, expr, content), tokens[1:]
+        next, tokens = parse_expr(tokens, name, context)
+        content.append(next)
+
+def parse_default(tokens, name, context):
+    first, pos = tokens[0]
+    assert first.startswith('default ')
+    first = first.split(None, 1)[1]
+    parts = first.split('=', 1)
+    if len(parts) == 1:
+        raise TemplateError(
+            "Expression must be {{default var=value}}; no = found in %r" % first,
+            position=pos, name=name)
+    var = parts[0].strip()
+    if ',' in var:
+        raise TemplateError(
+            "{{default x, y = ...}} is not supported",
+            position=pos, name=name)
+    if not var_re.search(var):
+        raise TemplateError(
+            "Not a valid variable name for {{default}}: %r"
+            % var, position=pos, name=name)
+    expr = parts[1].strip()
+    return ('default', pos, var, expr), tokens[1:]
+
+_fill_command_usage = """\
+%prog [OPTIONS] TEMPLATE arg=value
+
+Use py:arg=value to set a Python value; otherwise all values are
+strings.
+"""
+
+def fill_command(args=None):
+    import sys, optparse, pkg_resources, os
+    if args is None:
+        args = sys.argv[1:]
+    dist = pkg_resources.get_distribution('Paste')
+    parser = optparse.OptionParser(
+        version=str(dist),
+        usage=_fill_command_usage)
+    parser.add_option(
+        '-o', '--output',
+        dest='output',
+        metavar="FILENAME",
+        help="File to write output to (default stdout)")
+    parser.add_option(
+        '--html',
+        dest='use_html',
+        action='store_true',
+        help="Use HTML style filling (including automatic HTML quoting)")
+    parser.add_option(
+        '--env',
+        dest='use_env',
+        action='store_true',
+        help="Put the environment in as top-level variables")
+    options, args = parser.parse_args(args)
+    if len(args) < 1:
+        print 'You must give a template filename'
+        print dir(parser)
+        assert 0
+    template_name = args[0]
+    args = args[1:]
+    vars = {}
+    if options.use_env:
+        vars.update(os.environ)
+    for value in args:
+        if '=' not in value:
+            print 'Bad argument: %r' % value
+            sys.exit(2)
+        name, value = value.split('=', 1)
+        if name.startswith('py:'):
+            name = name[:3]
+            value = eval(value)
+        vars[name] = value
+    if template_name == '-':
+        template_content = sys.stdin.read()
+        template_name = '<stdin>'
+    else:
+        f = open(template_name, 'rb')
+        template_content = f.read()
+        f.close()
+    if options.use_html:
+        TemplateClass = HTMLTemplate
+    else:
+        TemplateClass = Template
+    template = TemplateClass(template_content, name=template_name)
+    result = template.substitute(vars)
+    if options.output:
+        f = open(options.output, 'wb')
+        f.write(result)
+        f.close()
+    else:
+        sys.stdout.write(result)
+
+if __name__ == '__main__':
+    from paste.util.template import fill_command
+    fill_command()
+        
+    
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/scgiserver.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/scgiserver.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/scgiserver.py (revision 3)
@@ -0,0 +1,172 @@
+#! /usr/bin/env python
+"""
+SCGI-->WSGI application proxy, "SWAP".
+
+(Originally written by Titus Brown.)
+
+This lets an SCGI front-end like mod_scgi be used to execute WSGI
+application objects.  To use it, subclass the SWAP class like so::
+
+   class TestAppHandler(swap.SWAP):
+       def __init__(self, *args, **kwargs):
+           self.prefix = '/canal'
+           self.app_obj = TestAppClass
+           swap.SWAP.__init__(self, *args, **kwargs)
+
+where 'TestAppClass' is the application object from WSGI and '/canal'
+is the prefix for what is served by the SCGI Web-server-side process.
+
+Then execute the SCGI handler "as usual" by doing something like this::
+
+   scgi_server.SCGIServer(TestAppHandler, port=4000).serve()
+
+and point mod_scgi (or whatever your SCGI front end is) at port 4000.
+
+Kudos to the WSGI folk for writing a nice PEP & the Quixote folk for
+writing a nice extensible SCGI server for Python!
+"""
+
+import sys
+import time
+from scgi import scgi_server
+
+def debug(msg):
+    timestamp = time.strftime("%Y-%m-%d %H:%M:%S",
+                              time.localtime(time.time()))
+    sys.stderr.write("[%s] %s\n" % (timestamp, msg))
+
+class SWAP(scgi_server.SCGIHandler):
+    """
+    SCGI->WSGI application proxy: let an SCGI server execute WSGI
+    application objects.
+    """
+    app_obj = None
+    prefix = None
+    
+    def __init__(self, *args, **kwargs):
+        assert self.app_obj, "must set app_obj"
+        assert self.prefix is not None, "must set prefix"
+        args = (self,) + args
+        scgi_server.SCGIHandler.__init__(*args, **kwargs)
+
+    def handle_connection(self, conn):
+        """
+        Handle an individual connection.
+        """
+        input = conn.makefile("r")
+        output = conn.makefile("w")
+
+        environ = self.read_env(input)
+        environ['wsgi.input']        = input
+        environ['wsgi.errors']       = sys.stderr
+        environ['wsgi.version']      = (1, 0)
+        environ['wsgi.multithread']  = False
+        environ['wsgi.multiprocess'] = True
+        environ['wsgi.run_once']     = False
+
+        # dunno how SCGI does HTTPS signalling; can't test it myself... @CTB
+        if environ.get('HTTPS','off') in ('on','1'):
+            environ['wsgi.url_scheme'] = 'https'
+        else:
+            environ['wsgi.url_scheme'] = 'http'
+
+        ## SCGI does some weird environ manglement.  We need to set
+        ## SCRIPT_NAME from 'prefix' and then set PATH_INFO from
+        ## REQUEST_URI.
+
+        prefix = self.prefix
+        path = environ['REQUEST_URI'][len(prefix):].split('?', 1)[0]
+
+        environ['SCRIPT_NAME'] = prefix
+        environ['PATH_INFO'] = path
+
+        headers_set = []
+        headers_sent = []
+        chunks = []
+        def write(data):
+            chunks.append(data)
+        
+        def start_response(status, response_headers, exc_info=None):
+            if exc_info:
+                try:
+                    if headers_sent:
+                        # Re-raise original exception if headers sent
+                        raise exc_info[0], exc_info[1], exc_info[2]
+                finally:
+                    exc_info = None     # avoid dangling circular ref
+            elif headers_set:
+                raise AssertionError("Headers already set!")
+
+            headers_set[:] = [status, response_headers]
+            return write
+
+        ###
+
+        result = self.app_obj(environ, start_response)
+        try:
+            for data in result:
+                chunks.append(data)
+                
+            # Before the first output, send the stored headers
+            if not headers_set:
+                # Error -- the app never called start_response
+                status = '500 Server Error'
+                response_headers = [('Content-type', 'text/html')]
+                chunks = ["XXX start_response never called"]
+            else:
+                status, response_headers = headers_sent[:] = headers_set
+                
+            output.write('Status: %s\r\n' % status)
+            for header in response_headers:
+                output.write('%s: %s\r\n' % header)
+            output.write('\r\n')
+
+            for data in chunks:
+                output.write(data)
+        finally:
+            if hasattr(result,'close'):
+                result.close()
+
+        # SCGI backends use connection closing to signal 'fini'.
+        try:
+            input.close()
+            output.close()
+            conn.close()
+        except IOError, err:
+            debug("IOError while closing connection ignored: %s" % err)
+
+
+def serve_application(application, prefix, port=None, host=None, max_children=None):
+    """
+    Serve the specified WSGI application via SCGI proxy.
+
+    ``application``
+        The WSGI application to serve.
+
+    ``prefix``
+        The prefix for what is served by the SCGI Web-server-side process.
+
+    ``port``
+        Optional port to bind the SCGI proxy to. Defaults to SCGIServer's
+        default port value.
+
+    ``host``
+        Optional host to bind the SCGI proxy to. Defaults to SCGIServer's
+        default host value.
+
+    ``host``
+        Optional maximum number of child processes the SCGIServer will
+        spawn. Defaults to SCGIServer's default max_children value.
+    """
+    class SCGIAppHandler(SWAP):
+        def __init__ (self, *args, **kwargs):
+            self.prefix = prefix
+            self.app_obj = application
+            SWAP.__init__(self, *args, **kwargs)
+
+    kwargs = dict(handler_class=SCGIAppHandler)
+    for kwarg in ('host', 'port', 'max_children'):
+        if locals()[kwarg] is not None:
+            kwargs[kwarg] = locals()[kwarg]
+
+    scgi_server.SCGIServer(**kwargs).serve()
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/string24.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/string24.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/string24.py (revision 3)
@@ -0,0 +1,531 @@
+"""A collection of string operations (most are no longer used).
+
+Warning: most of the code you see here isn't normally used nowadays.
+Beginning with Python 1.6, many of these functions are implemented as
+methods on the standard string object. They used to be implemented by
+a built-in module called strop, but strop is now obsolete itself.
+
+Public module variables:
+
+whitespace -- a string containing all characters considered whitespace
+lowercase -- a string containing all characters considered lowercase letters
+uppercase -- a string containing all characters considered uppercase letters
+letters -- a string containing all characters considered letters
+digits -- a string containing all characters considered decimal digits
+hexdigits -- a string containing all characters considered hexadecimal digits
+octdigits -- a string containing all characters considered octal digits
+punctuation -- a string containing all characters considered punctuation
+printable -- a string containing all characters considered printable
+
+"""
+
+# Some strings for ctype-style character classification
+whitespace = ' \t\n\r\v\f'
+lowercase = 'abcdefghijklmnopqrstuvwxyz'
+uppercase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+letters = lowercase + uppercase
+ascii_lowercase = lowercase
+ascii_uppercase = uppercase
+ascii_letters = ascii_lowercase + ascii_uppercase
+digits = '0123456789'
+hexdigits = digits + 'abcdef' + 'ABCDEF'
+octdigits = '01234567'
+punctuation = """!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~"""
+printable = digits + letters + punctuation + whitespace
+
+# Case conversion helpers
+# Use str to convert Unicode literal in case of -U
+# Note that Cookie.py bogusly uses _idmap :(
+l = map(chr, xrange(256))
+_idmap = str('').join(l)
+del l
+
+# Functions which aren't available as string methods.
+
+# Capitalize the words in a string, e.g. " aBc  dEf " -> "Abc Def".
+# See also regsub.capwords().
+def capwords(s, sep=None):
+    """capwords(s, [sep]) -> string
+
+    Split the argument into words using split, capitalize each
+    word using capitalize, and join the capitalized words using
+    join. Note that this replaces runs of whitespace characters by
+    a single space.
+
+    """
+    return (sep or ' ').join([x.capitalize() for x in s.split(sep)])
+
+
+# Construct a translation string
+_idmapL = None
+def maketrans(fromstr, tostr):
+    """maketrans(frm, to) -> string
+
+    Return a translation table (a string of 256 bytes long)
+    suitable for use in string.translate.  The strings frm and to
+    must be of the same length.
+
+    """
+    if len(fromstr) != len(tostr):
+        raise ValueError, "maketrans arguments must have same length"
+    global _idmapL
+    if not _idmapL:
+        _idmapL = map(None, _idmap)
+    L = _idmapL[:]
+    fromstr = map(ord, fromstr)
+    for i in range(len(fromstr)):
+        L[fromstr[i]] = tostr[i]
+    return ''.join(L)
+
+
+
+####################################################################
+import re as _re
+
+class _multimap:
+    """Helper class for combining multiple mappings.
+
+    Used by .{safe_,}substitute() to combine the mapping and keyword
+    arguments.
+    """
+    def __init__(self, primary, secondary):
+        self._primary = primary
+        self._secondary = secondary
+
+    def __getitem__(self, key):
+        try:
+            return self._primary[key]
+        except KeyError:
+            return self._secondary[key]
+
+
+class _TemplateMetaclass(type):
+    pattern = r"""
+    %(delim)s(?:
+      (?P<escaped>%(delim)s) |   # Escape sequence of two delimiters
+      (?P<named>%(id)s)      |   # delimiter and a Python identifier
+      {(?P<braced>%(id)s)}   |   # delimiter and a braced identifier
+      (?P<invalid>)              # Other ill-formed delimiter exprs
+    )
+    """
+
+    def __init__(cls, name, bases, dct):
+        super(_TemplateMetaclass, cls).__init__(name, bases, dct)
+        if 'pattern' in dct:
+            pattern = cls.pattern
+        else:
+            pattern = _TemplateMetaclass.pattern % {
+                'delim' : _re.escape(cls.delimiter),
+                'id'    : cls.idpattern,
+                }
+        cls.pattern = _re.compile(pattern, _re.IGNORECASE | _re.VERBOSE)
+
+
+class Template:
+    """A string class for supporting $-substitutions."""
+    __metaclass__ = _TemplateMetaclass
+
+    delimiter = '$'
+    idpattern = r'[_a-z][_a-z0-9]*'
+
+    def __init__(self, template):
+        self.template = template
+
+    # Search for $$, $identifier, ${identifier}, and any bare $'s
+
+    def _invalid(self, mo):
+        i = mo.start('invalid')
+        lines = self.template[:i].splitlines(True)
+        if not lines:
+            colno = 1
+            lineno = 1
+        else:
+            colno = i - len(''.join(lines[:-1]))
+            lineno = len(lines)
+        raise ValueError('Invalid placeholder in string: line %d, col %d' %
+                         (lineno, colno))
+
+    def substitute(self, *args, **kws):
+        if len(args) > 1:
+            raise TypeError('Too many positional arguments')
+        if not args:
+            mapping = kws
+        elif kws:
+            mapping = _multimap(kws, args[0])
+        else:
+            mapping = args[0]
+        # Helper function for .sub()
+        def convert(mo):
+            # Check the most common path first.
+            named = mo.group('named') or mo.group('braced')
+            if named is not None:
+                val = mapping[named]
+                # We use this idiom instead of str() because the latter will
+                # fail if val is a Unicode containing non-ASCII characters.
+                return '%s' % val
+            if mo.group('escaped') is not None:
+                return self.delimiter
+            if mo.group('invalid') is not None:
+                self._invalid(mo)
+            raise ValueError('Unrecognized named group in pattern',
+                             self.pattern)
+        return self.pattern.sub(convert, self.template)
+
+    def safe_substitute(self, *args, **kws):
+        if len(args) > 1:
+            raise TypeError('Too many positional arguments')
+        if not args:
+            mapping = kws
+        elif kws:
+            mapping = _multimap(kws, args[0])
+        else:
+            mapping = args[0]
+        # Helper function for .sub()
+        def convert(mo):
+            named = mo.group('named')
+            if named is not None:
+                try:
+                    # We use this idiom instead of str() because the latter
+                    # will fail if val is a Unicode containing non-ASCII
+                    return '%s' % mapping[named]
+                except KeyError:
+                    return self.delimiter + named
+            braced = mo.group('braced')
+            if braced is not None:
+                try:
+                    return '%s' % mapping[braced]
+                except KeyError:
+                    return self.delimiter + '{' + braced + '}'
+            if mo.group('escaped') is not None:
+                return self.delimiter
+            if mo.group('invalid') is not None:
+                return self.delimiter
+            raise ValueError('Unrecognized named group in pattern',
+                             self.pattern)
+        return self.pattern.sub(convert, self.template)
+
+
+
+####################################################################
+# NOTE: Everything below here is deprecated.  Use string methods instead.
+# This stuff will go away in Python 3.0.
+
+# Backward compatible names for exceptions
+index_error = ValueError
+atoi_error = ValueError
+atof_error = ValueError
+atol_error = ValueError
+
+# convert UPPER CASE letters to lower case
+def lower(s):
+    """lower(s) -> string
+
+    Return a copy of the string s converted to lowercase.
+
+    """
+    return s.lower()
+
+# Convert lower case letters to UPPER CASE
+def upper(s):
+    """upper(s) -> string
+
+    Return a copy of the string s converted to uppercase.
+
+    """
+    return s.upper()
+
+# Swap lower case letters and UPPER CASE
+def swapcase(s):
+    """swapcase(s) -> string
+
+    Return a copy of the string s with upper case characters
+    converted to lowercase and vice versa.
+
+    """
+    return s.swapcase()
+
+# Strip leading and trailing tabs and spaces
+def strip(s, chars=None):
+    """strip(s [,chars]) -> string
+
+    Return a copy of the string s with leading and trailing
+    whitespace removed.
+    If chars is given and not None, remove characters in chars instead.
+    If chars is unicode, S will be converted to unicode before stripping.
+
+    """
+    return s.strip(chars)
+
+# Strip leading tabs and spaces
+def lstrip(s, chars=None):
+    """lstrip(s [,chars]) -> string
+
+    Return a copy of the string s with leading whitespace removed.
+    If chars is given and not None, remove characters in chars instead.
+
+    """
+    return s.lstrip(chars)
+
+# Strip trailing tabs and spaces
+def rstrip(s, chars=None):
+    """rstrip(s [,chars]) -> string
+
+    Return a copy of the string s with trailing whitespace removed.
+    If chars is given and not None, remove characters in chars instead.
+
+    """
+    return s.rstrip(chars)
+
+
+# Split a string into a list of space/tab-separated words
+def split(s, sep=None, maxsplit=-1):
+    """split(s [,sep [,maxsplit]]) -> list of strings
+
+    Return a list of the words in the string s, using sep as the
+    delimiter string.  If maxsplit is given, splits at no more than
+    maxsplit places (resulting in at most maxsplit+1 words).  If sep
+    is not specified or is None, any whitespace string is a separator.
+
+    (split and splitfields are synonymous)
+
+    """
+    return s.split(sep, maxsplit)
+splitfields = split
+
+# Split a string into a list of space/tab-separated words
+def rsplit(s, sep=None, maxsplit=-1):
+    """rsplit(s [,sep [,maxsplit]]) -> list of strings
+
+    Return a list of the words in the string s, using sep as the
+    delimiter string, starting at the end of the string and working
+    to the front.  If maxsplit is given, at most maxsplit splits are
+    done. If sep is not specified or is None, any whitespace string
+    is a separator.
+    """
+    return s.rsplit(sep, maxsplit)
+
+# Join fields with optional separator
+def join(words, sep = ' '):
+    """join(list [,sep]) -> string
+
+    Return a string composed of the words in list, with
+    intervening occurrences of sep.  The default separator is a
+    single space.
+
+    (joinfields and join are synonymous)
+
+    """
+    return sep.join(words)
+joinfields = join
+
+# Find substring, raise exception if not found
+def index(s, *args):
+    """index(s, sub [,start [,end]]) -> int
+
+    Like find but raises ValueError when the substring is not found.
+
+    """
+    return s.index(*args)
+
+# Find last substring, raise exception if not found
+def rindex(s, *args):
+    """rindex(s, sub [,start [,end]]) -> int
+
+    Like rfind but raises ValueError when the substring is not found.
+
+    """
+    return s.rindex(*args)
+
+# Count non-overlapping occurrences of substring
+def count(s, *args):
+    """count(s, sub[, start[,end]]) -> int
+
+    Return the number of occurrences of substring sub in string
+    s[start:end].  Optional arguments start and end are
+    interpreted as in slice notation.
+
+    """
+    return s.count(*args)
+
+# Find substring, return -1 if not found
+def find(s, *args):
+    """find(s, sub [,start [,end]]) -> in
+
+    Return the lowest index in s where substring sub is found,
+    such that sub is contained within s[start,end].  Optional
+    arguments start and end are interpreted as in slice notation.
+
+    Return -1 on failure.
+
+    """
+    return s.find(*args)
+
+# Find last substring, return -1 if not found
+def rfind(s, *args):
+    """rfind(s, sub [,start [,end]]) -> int
+
+    Return the highest index in s where substring sub is found,
+    such that sub is contained within s[start,end].  Optional
+    arguments start and end are interpreted as in slice notation.
+
+    Return -1 on failure.
+
+    """
+    return s.rfind(*args)
+
+# for a bit of speed
+_float = float
+_int = int
+_long = long
+
+# Convert string to float
+def atof(s):
+    """atof(s) -> float
+
+    Return the floating point number represented by the string s.
+
+    """
+    return _float(s)
+
+
+# Convert string to integer
+def atoi(s , base=10):
+    """atoi(s [,base]) -> int
+
+    Return the integer represented by the string s in the given
+    base, which defaults to 10.  The string s must consist of one
+    or more digits, possibly preceded by a sign.  If base is 0, it
+    is chosen from the leading characters of s, 0 for octal, 0x or
+    0X for hexadecimal.  If base is 16, a preceding 0x or 0X is
+    accepted.
+
+    """
+    return _int(s, base)
+
+
+# Convert string to long integer
+def atol(s, base=10):
+    """atol(s [,base]) -> long
+
+    Return the long integer represented by the string s in the
+    given base, which defaults to 10.  The string s must consist
+    of one or more digits, possibly preceded by a sign.  If base
+    is 0, it is chosen from the leading characters of s, 0 for
+    octal, 0x or 0X for hexadecimal.  If base is 16, a preceding
+    0x or 0X is accepted.  A trailing L or l is not accepted,
+    unless base is 0.
+
+    """
+    return _long(s, base)
+
+
+# Left-justify a string
+def ljust(s, width, *args):
+    """ljust(s, width[, fillchar]) -> string
+
+    Return a left-justified version of s, in a field of the
+    specified width, padded with spaces as needed.  The string is
+    never truncated.  If specified the fillchar is used instead of spaces.
+
+    """
+    return s.ljust(width, *args)
+
+# Right-justify a string
+def rjust(s, width, *args):
+    """rjust(s, width[, fillchar]) -> string
+
+    Return a right-justified version of s, in a field of the
+    specified width, padded with spaces as needed.  The string is
+    never truncated.  If specified the fillchar is used instead of spaces.
+
+    """
+    return s.rjust(width, *args)
+
+# Center a string
+def center(s, width, *args):
+    """center(s, width[, fillchar]) -> string
+
+    Return a center version of s, in a field of the specified
+    width. padded with spaces as needed.  The string is never
+    truncated.  If specified the fillchar is used instead of spaces.
+
+    """
+    return s.center(width, *args)
+
+# Zero-fill a number, e.g., (12, 3) --> '012' and (-3, 3) --> '-03'
+# Decadent feature: the argument may be a string or a number
+# (Use of this is deprecated; it should be a string as with ljust c.s.)
+def zfill(x, width):
+    """zfill(x, width) -> string
+
+    Pad a numeric string x with zeros on the left, to fill a field
+    of the specified width.  The string x is never truncated.
+
+    """
+    if not isinstance(x, basestring):
+        x = repr(x)
+    return x.zfill(width)
+
+# Expand tabs in a string.
+# Doesn't take non-printing chars into account, but does understand \n.
+def expandtabs(s, tabsize=8):
+    """expandtabs(s [,tabsize]) -> string
+
+    Return a copy of the string s with all tab characters replaced
+    by the appropriate number of spaces, depending on the current
+    column, and the tabsize (default 8).
+
+    """
+    return s.expandtabs(tabsize)
+
+# Character translation through look-up table.
+def translate(s, table, deletions=""):
+    """translate(s,table [,deletions]) -> string
+
+    Return a copy of the string s, where all characters occurring
+    in the optional argument deletions are removed, and the
+    remaining characters have been mapped through the given
+    translation table, which must be a string of length 256.  The
+    deletions argument is not allowed for Unicode strings.
+
+    """
+    if deletions:
+        return s.translate(table, deletions)
+    else:
+        # Add s[:0] so that if s is Unicode and table is an 8-bit string,
+        # table is converted to Unicode.  This means that table *cannot*
+        # be a dictionary -- for that feature, use u.translate() directly.
+        return s.translate(table + s[:0])
+
+# Capitalize a string, e.g. "aBc  dEf" -> "Abc  def".
+def capitalize(s):
+    """capitalize(s) -> string
+
+    Return a copy of the string s with only its first character
+    capitalized.
+
+    """
+    return s.capitalize()
+
+# Substring replacement (global)
+def replace(s, old, new, maxsplit=-1):
+    """replace (str, old, new[, maxsplit]) -> string
+
+    Return a copy of string str with all occurrences of substring
+    old replaced by new. If the optional argument maxsplit is
+    given, only the first maxsplit occurrences are replaced.
+
+    """
+    return s.replace(old, new, maxsplit)
+
+
+# Try importing optional built-in module "strop" -- if it exists,
+# it redefines some string operations that are 100-1000 times faster.
+# It also defines values for whitespace, lowercase and uppercase
+# that match <ctype.h>'s definitions.
+
+try:
+    from strop import maketrans, lowercase, uppercase, whitespace
+    letters = lowercase + uppercase
+except ImportError:
+    pass                                          # Use the original versions
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/threadinglocal.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/threadinglocal.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/threadinglocal.py (revision 3)
@@ -0,0 +1,43 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+"""
+Implementation of thread-local storage, for Python versions that don't
+have thread local storage natively.
+"""
+
+try:
+    import threading
+except ImportError:
+    # No threads, so "thread local" means process-global
+    class local(object):
+        pass
+else:
+    try:
+        local = threading.local
+    except AttributeError:
+        # Added in 2.4, but now we'll have to define it ourselves
+        import thread
+        class local(object):
+
+            def __init__(self):
+                self.__dict__['__objs'] = {}
+
+            def __getattr__(self, attr, g=thread.get_ident):
+                try:
+                    return self.__dict__['__objs'][g()][attr]
+                except KeyError:
+                    raise AttributeError(
+                        "No variable %s defined for the thread %s"
+                        % (attr, g()))
+
+            def __setattr__(self, attr, value, g=thread.get_ident):
+                self.__dict__['__objs'].setdefault(g(), {})[attr] = value
+
+            def __delattr__(self, attr, g=thread.get_ident):
+                try:
+                    del self.__dict__['__objs'][g()][attr]
+                except KeyError:
+                    raise AttributeError(
+                        "No variable %s defined for thread %s"
+                        % (attr, g()))
+
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/dateinterval.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/dateinterval.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/dateinterval.py (revision 3)
@@ -0,0 +1,103 @@
+"""
+DateInterval.py
+
+Convert interval strings (in the form of 1w2d, etc) to
+seconds, and back again.  Is not exactly about months or
+years (leap years in particular).
+
+Accepts (y)ear, (b)month, (w)eek, (d)ay, (h)our, (m)inute, (s)econd.
+
+Exports only timeEncode and timeDecode functions.  
+"""
+
+import re
+
+__all__ = ['interval_decode', 'interval_encode']
+
+second = 1
+minute = second*60
+hour = minute*60
+day = hour*24
+week = day*7
+month = day*30
+year = day*365
+timeValues = {
+    'y': year,
+    'b': month,
+    'w': week,
+    'd': day,
+    'h': hour,
+    'm': minute,
+    's': second,
+    }
+timeOrdered = timeValues.items()
+timeOrdered.sort(lambda a, b: -cmp(a[1], b[1]))
+    
+def interval_encode(seconds, include_sign=False):
+    """Encodes a number of seconds (representing a time interval)
+    into a form like 1h2d3s.
+
+    >>> interval_encode(10)
+    '10s'
+    >>> interval_encode(493939)
+    '5d17h12m19s'
+    """
+    s = ''
+    orig = seconds
+    seconds = abs(seconds)
+    for char, amount in timeOrdered:
+        if seconds >= amount:
+            i, seconds = divmod(seconds, amount)
+            s += '%i%s' % (i, char)
+    if orig < 0:
+        s = '-' + s
+    elif not orig:
+        return '0'
+    elif include_sign:
+        s = '+' + s
+    return s
+
+_timeRE = re.compile(r'[0-9]+[a-zA-Z]')
+def interval_decode(s):
+    """Decodes a number in the format 1h4d3m (1 hour, 3 days, 3 minutes)
+    into a number of seconds
+
+    >>> interval_decode('40s')
+    40
+    >>> interval_decode('10000s')
+    10000
+    >>> interval_decode('3d1w45s')
+    864045
+    """
+    time = 0
+    sign = 1
+    s = s.strip()
+    if s.startswith('-'):
+        s = s[1:]
+        sign = -1
+    elif s.startswith('+'):
+        s = s[1:]
+    for match in allMatches(s, _timeRE):
+        char = match.group(0)[-1].lower()
+        if not timeValues.has_key(char):
+            # @@: should signal error
+            continue
+        time += int(match.group(0)[:-1]) * timeValues[char]
+    return time
+
+# @@-sgd 2002-12-23 - this function does not belong in this module, find a better place.
+def allMatches(source, regex):
+    """Return a list of matches for regex in source
+    """
+    pos = 0
+    end = len(source)
+    rv = []
+    match = regex.search(source, pos)
+    while match:
+        rv.append(match)
+        match = regex.search(source, match.end() )
+    return rv
+
+if __name__ == '__main__':
+    import doctest
+    doctest.testmod()
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/mimeparse.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/mimeparse.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/mimeparse.py (revision 3)
@@ -0,0 +1,178 @@
+"""MIME-Type Parser
+
+This module provides basic functions for handling mime-types. It can handle
+matching mime-types against a list of media-ranges. See section 14.1 of 
+the HTTP specification [RFC 2616] for a complete explaination.
+
+   http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.1
+
+Contents:
+    - parse_mime_type():   Parses a mime-type into it's component parts.
+    - parse_media_range(): Media-ranges are mime-types with wild-cards and a 'q' quality parameter.
+    - quality():           Determines the quality ('q') of a mime-type when compared against a list of media-ranges.
+    - quality_parsed():    Just like quality() except the second parameter must be pre-parsed.
+    - best_match():        Choose the mime-type with the highest quality ('q') from a list of candidates. 
+    - desired_matches():   Provide a list in order of server-desired priorities from a list of candidates.
+"""
+
+__version__ = "0.1.1"
+__author__ = 'Joe Gregorio'
+__email__ = "joe@bitworking.org"
+__credits__ = ""
+
+def parse_mime_type(mime_type):
+    """Carves up a mime_type and returns a tuple of the
+       (type, subtype, params) where 'params' is a dictionary
+       of all the parameters for the media range.
+       For example, the media range 'application/xhtml;q=0.5' would
+       get parsed into:
+
+       ('application', 'xhtml', {'q', '0.5'})
+       """
+    parts = mime_type.split(";")
+    params = dict([tuple([s.strip() for s in param.split("=")])\
+            for param in parts[1:] ])
+    (type, subtype) = parts[0].split("/")
+    return (type.strip(), subtype.strip(), params)
+
+def parse_media_range(range):
+    """Carves up a media range and returns a tuple of the
+       (type, subtype, params) where 'params' is a dictionary
+       of all the parameters for the media range.
+       
+       For example, the media range ``application/*;q=0.5`` would
+       get parsed into::
+
+         ('application', '*', {'q', '0.5'})
+
+       In addition this function also guarantees that there 
+       is a value for 'q' in the params dictionary, filling it
+       in with a proper default if necessary.
+       """
+    (type, subtype, params) = parse_mime_type(range)
+    if not params.has_key('q') or not params['q'] or \
+            not float(params['q']) or float(params['q']) > 1\
+            or float(params['q']) < 0:
+        params['q'] = '1'
+    return (type, subtype, params)
+
+def quality_parsed(mime_type, parsed_ranges):
+    """Find the best match for a given mime_type against 
+       a list of media_ranges that have already been 
+       parsed by parse_media_range(). Returns the 
+       'q' quality parameter of the best match, 0 if no
+       match was found. This function bahaves the same as quality()
+       except that 'parsed_ranges' must be a list of
+       parsed media ranges. """
+    best_fitness = -1 
+    best_match = ""
+    best_fit_q = 0
+    (target_type, target_subtype, target_params) =\
+            parse_media_range(mime_type)
+    for (type, subtype, params) in parsed_ranges:
+        param_matches = sum([1 for (key, value) in \
+                target_params.iteritems() if key != 'q' and \
+                params.has_key(key) and value == params[key]])
+        if (type == target_type or type == '*') and \
+                (subtype == target_subtype or subtype == "*"):
+            fitness = (type == target_type) and 100 or 0
+            fitness += (subtype == target_subtype) and 10 or 0
+            fitness += param_matches
+            if fitness > best_fitness:
+                best_fitness = fitness
+                best_fit_q = params['q']
+            
+    return float(best_fit_q)
+    
+def quality(mime_type, ranges):
+    """Returns the quality 'q' of a mime_type when compared
+    against the media-ranges in ranges. For example:
+
+    >>> quality('text/html','text/*;q=0.3, text/html;q=0.7, text/html;level=1, text/html;level=2;q=0.4, */*;q=0.5')
+    0.7
+    
+    """ 
+    parsed_ranges = [parse_media_range(r) for r in ranges.split(",")]
+    return quality_parsed(mime_type, parsed_ranges)
+
+def best_match(supported, header):
+    """Takes a list of supported mime-types and finds the best
+    match for all the media-ranges listed in header. The value of
+    header must be a string that conforms to the format of the 
+    HTTP Accept: header. The value of 'supported' is a list of
+    mime-types.
+    
+    >>> best_match(['application/xbel+xml', 'text/xml'], 'text/*;q=0.5,*/*; q=0.1')
+    'text/xml'
+    """
+    parsed_header = [parse_media_range(r) for r in header.split(",")]
+    weighted_matches = [(quality_parsed(mime_type, parsed_header), mime_type)\
+            for mime_type in supported]
+    weighted_matches.sort()
+    return weighted_matches[-1][0] and weighted_matches[-1][1] or ''
+
+def desired_matches(desired, header):
+    """Takes a list of desired mime-types in the order the server prefers to
+    send them regardless of the browsers preference.
+    
+    Browsers (such as Firefox) technically want XML over HTML depending on how
+    one reads the specification. This function is provided for a server to 
+    declare a set of desired mime-types it supports, and returns a subset of 
+    the desired list in the same order should each one be Accepted by the
+    browser.
+    
+    >>> sorted_match(['text/html', 'application/xml'], \
+    ...     'text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png')
+    ['text/html', 'application/xml']
+    >>> sorted_match(['text/html', 'application/xml'], 'application/xml,application/json')
+    ['application/xml']
+    """
+    matches = []
+    parsed_ranges = [parse_media_range(r) for r in header.split(",")]
+    for mimetype in desired:
+        if quality_parsed(mimetype, parsed_ranges):
+            matches.append(mimetype)
+    return matches
+
+if __name__ == "__main__":
+    import unittest
+
+    class TestMimeParsing(unittest.TestCase):
+
+        def test_parse_media_range(self):
+            self.assert_(('application', 'xml', {'q': '1'}) == parse_media_range('application/xml;q=1'))
+            self.assertEqual(('application', 'xml', {'q': '1'}), parse_media_range('application/xml'))
+            self.assertEqual(('application', 'xml', {'q': '1'}), parse_media_range('application/xml;q='))
+            self.assertEqual(('application', 'xml', {'q': '1'}), parse_media_range('application/xml ; q='))
+            self.assertEqual(('application', 'xml', {'q': '1', 'b': 'other'}), parse_media_range('application/xml ; q=1;b=other'))
+            self.assertEqual(('application', 'xml', {'q': '1', 'b': 'other'}), parse_media_range('application/xml ; q=2;b=other'))
+
+        def test_rfc_2616_example(self):
+            accept = "text/*;q=0.3, text/html;q=0.7, text/html;level=1, text/html;level=2;q=0.4, */*;q=0.5"
+            self.assertEqual(1, quality("text/html;level=1", accept))
+            self.assertEqual(0.7, quality("text/html", accept))
+            self.assertEqual(0.3, quality("text/plain", accept))
+            self.assertEqual(0.5, quality("image/jpeg", accept))
+            self.assertEqual(0.4, quality("text/html;level=2", accept))
+            self.assertEqual(0.7, quality("text/html;level=3", accept))
+
+        def test_best_match(self):
+            mime_types_supported = ['application/xbel+xml', 'application/xml']
+            # direct match
+            self.assertEqual(best_match(mime_types_supported, 'application/xbel+xml'), 'application/xbel+xml')
+            # direct match with a q parameter
+            self.assertEqual(best_match(mime_types_supported, 'application/xbel+xml; q=1'), 'application/xbel+xml')
+            # direct match of our second choice with a q parameter
+            self.assertEqual(best_match(mime_types_supported, 'application/xml; q=1'), 'application/xml')
+            # match using a subtype wildcard
+            self.assertEqual(best_match(mime_types_supported, 'application/*; q=1'), 'application/xml')
+            # match using a type wildcard
+            self.assertEqual(best_match(mime_types_supported, '*/*'), 'application/xml')
+
+            mime_types_supported = ['application/xbel+xml', 'text/xml']
+            # match using a type versus a lower weighted subtype
+            self.assertEqual(best_match(mime_types_supported, 'text/*;q=0.5,*/*; q=0.1'), 'text/xml')
+            # fail to match anything
+            self.assertEqual(best_match(mime_types_supported, 'text/html,application/atom+xml; q=0.9'), '')
+
+    unittest.main() 
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/killthread.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/killthread.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/killthread.py (revision 3)
@@ -0,0 +1,27 @@
+"""
+Kill a thread, from http://sebulba.wikispaces.com/recipe+thread2
+"""
+import types
+try:
+    import ctypes
+except ImportError:
+    raise ImportError(
+        "You cannot use paste.util.killthread without ctypes installed")
+
+def async_raise(tid, exctype):
+    """raises the exception, performs cleanup if needed.
+
+    tid is the value given by thread.get_ident() (an integer).
+    Raise SystemExit to kill a thread."""
+    if not isinstance(exctype, (types.ClassType, type)):
+        raise TypeError("Only types can be raised (not instances)")
+    if not isinstance(tid, int):
+        raise TypeError("tid must be an integer")
+    res = ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, ctypes.py_object(exctype))
+    if res == 0:
+        raise ValueError("invalid thread id")
+    elif res != 1:
+        # """if it returns a number greater than one, you're in trouble, 
+        # and you should call it again with exc=NULL to revert the effect"""
+        ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, 0)
+        raise SystemError("PyThreadState_SetAsyncExc failed")
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/filemixin.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/filemixin.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/filemixin.py (revision 3)
@@ -0,0 +1,53 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+
+class FileMixin(object):
+
+    """
+    Used to provide auxiliary methods to objects simulating files.
+    Objects must implement write, and read if they are input files.
+    Also they should implement close.
+
+    Other methods you may wish to override:
+    * flush()
+    * seek(offset[, whence])
+    * tell()
+    * truncate([size])
+
+    Attributes you may wish to provide:
+    * closed
+    * encoding (you should also respect that in write())
+    * mode
+    * newlines (hard to support)
+    * softspace
+    """
+
+    def flush(self):
+        pass
+
+    def next(self):
+        return self.readline()
+
+    def readline(self, size=None):
+        # @@: This is a lame implementation; but a buffer would probably
+        # be necessary for a better implementation
+        output = []
+        while 1:
+            next = self.read(1)
+            if not next:
+                return ''.join(output)
+            output.append(next)
+            if size and size > 0 and len(output) >= size:
+                return ''.join(output)
+            if next == '\n':
+                # @@: also \r?
+                return ''.join(output)
+
+    def xreadlines(self):
+        return self
+
+    def writelines(self, lines):
+        for line in lines:
+            self.write(line)
+
+    
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/quoting.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/quoting.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/util/quoting.py (revision 3)
@@ -0,0 +1,81 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+
+import cgi
+import htmlentitydefs
+import urllib
+import re
+
+__all__ = ['html_quote', 'html_unquote', 'url_quote', 'url_unquote',
+           'strip_html']
+
+default_encoding = 'UTF-8'
+
+def html_quote(v, encoding=None):
+    r"""
+    Quote the value (turned to a string) as HTML.  This quotes <, >,
+    and quotes:
+
+    >>> html_quote(1)
+    '1'
+    >>> html_quote(None)
+    ''
+    >>> html_quote('<hey!>')
+    '&lt;hey!&gt;'
+    >>> html_quote(u'\u1029')
+    '\xe1\x80\xa9'
+    """
+    encoding = encoding or default_encoding
+    if v is None:
+        return ''
+    elif isinstance(v, str):
+        return cgi.escape(v, 1)
+    elif isinstance(v, unicode):
+        return cgi.escape(v.encode(encoding), 1)
+    else:
+        return cgi.escape(unicode(v).encode(encoding), 1)
+
+_unquote_re = re.compile(r'&([a-zA-Z]+);')
+def _entity_subber(match, name2c=htmlentitydefs.name2codepoint):
+    code = name2c.get(match.group(1))
+    if code:
+        return unichr(code)
+    else:
+        return match.group(0)
+
+def html_unquote(s, encoding=None):
+    r"""
+    Decode the value.
+
+    >>> html_unquote('&lt;hey&nbsp;you&gt;')
+    u'<hey\xa0you>'
+    >>> html_unquote('')
+    ''
+    >>> html_unquote('&blahblah;')
+    u'&blahblah;'
+    >>> html_unquote('\xe1\x80\xa9')
+    u'\u1029'
+    """
+    if isinstance(s, str):
+        s = s.decode(encoding or default_encoding)
+    return _unquote_re.sub(_entity_subber, s)
+
+def strip_html(s):
+    # should this use html_unquote?
+    s = re.sub('<.*?>', '', s)
+    s = s.replace('&nbsp;', ' ').replace('&lt;', '<')
+    s = s.replace('&gt;', '>').replace('&amp;','&')
+    return s
+
+def no_quote(s):
+    """
+    Quoting that doesn't do anything
+    """
+    return s
+
+url_quote = urllib.quote
+url_unquote = urllib.unquote
+
+if __name__ == '__main__':
+    import doctest
+    doctest.testmod()
Index: /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/translogger.py
===================================================================
--- /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/translogger.py (revision 3)
+++ /galaxy-central/eggs/Paste-1.6-py2.6.egg/paste/translogger.py (revision 3)
@@ -0,0 +1,115 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+"""
+Middleware for logging requests, using Apache combined log format
+"""
+
+import logging
+import time
+import urllib
+
+class TransLogger(object):
+    """
+    This logging middleware will log all requests as they go through.
+    They are, by default, sent to a logger named ``'wsgi'`` at the
+    INFO level.
+
+    If ``setup_console_handler`` is true, then messages for the named
+    logger will be sent to the console.
+    """
+
+    format = ('%(REMOTE_ADDR)s - %(REMOTE_USER)s [%(time)s] '
+              '"%(REQUEST_METHOD)s %(REQUEST_URI)s %(HTTP_VERSION)s" '
+              '%(status)s %(bytes)s "%(HTTP_REFERER)s" "%(HTTP_USER_AGENT)s"')
+
+    def __init__(self, application,
+                 logger=None,
+                 format=None,
+                 logging_level=logging.INFO,
+                 logger_name='wsgi',
+                 setup_console_handler=True,
+                 set_logger_level=logging.DEBUG):
+        if format is not None:
+            self.format = format
+        self.application = application
+        self.logging_level = logging_level
+        self.logger_name = logger_name
+        if logger is None:
+            self.logger = logging.getLogger(self.logger_name)
+            if setup_console_handler:
+                console = logging.StreamHandler()
+                console.setLevel(logging.DEBUG)
+                # We need to control the exact format:
+                console.setFormatter(logging.Formatter('%(message)s'))
+                self.logger.addHandler(console)
+                self.logger.propagate = False
+            if set_logger_level is not None:
+                self.logger.setLevel(set_logger_level)
+        else:
+            self.logger = logger
+
+    def __call__(self, environ, start_response):
+        start = time.localtime()
+        req_uri = urllib.quote(environ.get('SCRIPT_NAME', '')
+                               + environ.get('PATH_INFO', ''))
+        if environ.get('QUERY_STRING'):
+            req_uri += '?'+environ['QUERY_STRING']
+        def replacement_start_response(status, headers, exc_info=None):
+            # @@: Ideally we would count the bytes going by if no
+            # content-length header was provided; but that does add
+            # some overhead, so at least for now we'll be lazy.
+            bytes = None
+            for name, value in headers:
+                if name.lower() == 'content-length':
+                    bytes = value
+            self.write_log(environ, req_uri, start, status, bytes)
+            return start_response(status, headers)
+        return self.application(environ, replacement_start_response)
+
+    def write_log(self, environ, req_uri, start, status, bytes):
+        if bytes is None:
+            bytes = '-'
+        if time.daylight:
+                offset = time.altzone / 60 / 60 * -100
+        else:
+                offset = time.timezone / 60 / 60 * -100
+        if offset >= 0:
+                offset = "+%0.4d" % (offset)
+        elif offset < 0:
+                offset = "%0.4d" % (offset)
+        d = {
+            'REMOTE_ADDR': environ.get('REMOTE_ADDR') or '-',
+            'REMOTE_USER': environ.get('REMOTE_USER') or '-',
+            'REQUEST_METHOD': environ['REQUEST_METHOD'],
+            'REQUEST_URI': req_uri,
+            'HTTP_VERSION': environ.get('SERVER_PROTOCOL'),
+            'time': time.strftime('%d/%b/%Y:%H:%M:%S ', start) + offset,
+            'status': status.split(None, 1)[0],
+            'bytes': bytes,
+            'HTTP_REFERER': environ.get('HTTP_REFERER', '-'),
+            'HTTP_USER_AGENT': environ.get('HTTP_USER_AGENT', '-'),
+            }
+        message = self.format % d
+        self.logger.log(self.logging_level, message)
+
+def make_filter(
+    app, global_conf,
+    logger_name='wsgi',
+    format=None,
+    logging_level=logging.INFO,
+    setup_console_handler=True,
+    set_logger_level=logging.DEBUG):
+    from paste.util.converters import asbool
+    if isinstance(logging_level, basestring):
+        logging_level = logging._levelNames[logging_level]
+    if isinstance(set_logger_level, basestring):
+        set_logger_level = logging._levelNames[set_logger_level]
+    return TransLogger(
+        app,
+        format=format or None,
+        logging_level=logging_level,
+        logger_name=logger_name,
+        setup_console_handler=asbool(setup_console_handler),
+        set_logger_level=set_logger_level)
+
+make_filter.__doc__ = TransLogger.__doc__
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/test/engines.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/test/engines.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/test/engines.py (revision 3)
@@ -0,0 +1,245 @@
+import sys, types, weakref
+from collections import deque
+import config
+from sqlalchemy.util import function_named, callable
+
+class ConnectionKiller(object):
+    def __init__(self):
+        self.proxy_refs = weakref.WeakKeyDictionary()
+
+    def checkout(self, dbapi_con, con_record, con_proxy):
+        self.proxy_refs[con_proxy] = True
+
+    def _apply_all(self, methods):
+        for rec in self.proxy_refs:
+            if rec is not None and rec.is_valid:
+                try:
+                    for name in methods:
+                        if callable(name):
+                            name(rec)
+                        else:
+                            getattr(rec, name)()
+                except (SystemExit, KeyboardInterrupt):
+                    raise
+                except Exception, e:
+                    # fixme
+                    sys.stderr.write("\n" + str(e) + "\n")
+
+    def rollback_all(self):
+        self._apply_all(('rollback',))
+
+    def close_all(self):
+        self._apply_all(('rollback', 'close'))
+
+    def assert_all_closed(self):
+        for rec in self.proxy_refs:
+            if rec.is_valid:
+                assert False
+
+testing_reaper = ConnectionKiller()
+
+def assert_conns_closed(fn):
+    def decorated(*args, **kw):
+        try:
+            fn(*args, **kw)
+        finally:
+            testing_reaper.assert_all_closed()
+    return function_named(decorated, fn.__name__)
+
+def rollback_open_connections(fn):
+    """Decorator that rolls back all open connections after fn execution."""
+
+    def decorated(*args, **kw):
+        try:
+            fn(*args, **kw)
+        finally:
+            testing_reaper.rollback_all()
+    return function_named(decorated, fn.__name__)
+
+def close_open_connections(fn):
+    """Decorator that closes all connections after fn execution."""
+
+    def decorated(*args, **kw):
+        try:
+            fn(*args, **kw)
+        finally:
+            testing_reaper.close_all()
+    return function_named(decorated, fn.__name__)
+
+def all_dialects():
+    import sqlalchemy.databases as d
+    for name in d.__all__:
+        mod = getattr(__import__('sqlalchemy.databases.%s' % name).databases, name)
+        yield mod.dialect()
+        
+class ReconnectFixture(object):
+    def __init__(self, dbapi):
+        self.dbapi = dbapi
+        self.connections = []
+
+    def __getattr__(self, key):
+        return getattr(self.dbapi, key)
+
+    def connect(self, *args, **kwargs):
+        conn = self.dbapi.connect(*args, **kwargs)
+        self.connections.append(conn)
+        return conn
+
+    def shutdown(self):
+        for c in list(self.connections):
+            c.close()
+        self.connections = []
+
+def reconnecting_engine(url=None, options=None):
+    url = url or config.db_url
+    dbapi = config.db.dialect.dbapi
+    if not options:
+        options = {}
+    options['module'] = ReconnectFixture(dbapi)
+    engine = testing_engine(url, options)
+    engine.test_shutdown = engine.dialect.dbapi.shutdown
+    return engine
+
+def testing_engine(url=None, options=None):
+    """Produce an engine configured by --options with optional overrides."""
+
+    from sqlalchemy import create_engine
+    from sqlalchemy.test.assertsql import asserter
+
+    url = url or config.db_url
+    options = options or config.db_opts
+
+    options.setdefault('proxy', asserter)
+    
+    listeners = options.setdefault('listeners', [])
+    listeners.append(testing_reaper)
+
+    engine = create_engine(url, **options)
+
+    return engine
+
+def utf8_engine(url=None, options=None):
+    """Hook for dialects or drivers that don't handle utf8 by default."""
+
+    from sqlalchemy.engine import url as engine_url
+
+    if config.db.name == 'mysql':
+        dbapi_ver = config.db.dialect.dbapi.version_info
+        if (dbapi_ver < (1, 2, 1) or
+            dbapi_ver in ((1, 2, 1, 'gamma', 1), (1, 2, 1, 'gamma', 2),
+                          (1, 2, 1, 'gamma', 3), (1, 2, 1, 'gamma', 5))):
+            raise RuntimeError('Character set support unavailable with this '
+                               'driver version: %s' % repr(dbapi_ver))
+        else:
+            url = url or config.db_url
+            url = engine_url.make_url(url)
+            url.query['charset'] = 'utf8'
+            url.query['use_unicode'] = '0'
+            url = str(url)
+
+    return testing_engine(url, options)
+
+def mock_engine(db=None):
+    """Provides a mocking engine based on the current testing.db."""
+    
+    from sqlalchemy import create_engine
+    
+    dbi = db or config.db
+    buffer = []
+    def executor(sql, *a, **kw):
+        buffer.append(sql)
+    engine = create_engine(dbi.name + '://',
+                           strategy='mock', executor=executor)
+    assert not hasattr(engine, 'mock')
+    engine.mock = buffer
+    return engine
+
+class ReplayableSession(object):
+    """A simple record/playback tool.
+
+    This is *not* a mock testing class.  It only records a session for later
+    playback and makes no assertions on call consistency whatsoever.  It's
+    unlikely to be suitable for anything other than DB-API recording.
+
+    """
+
+    Callable = object()
+    NoAttribute = object()
+    Natives = set([getattr(types, t)
+                   for t in dir(types) if not t.startswith('_')]). \
+                   difference([getattr(types, t)
+                               for t in ('FunctionType', 'BuiltinFunctionType',
+                                         'MethodType', 'BuiltinMethodType',
+                                         'LambdaType', 'UnboundMethodType',)])
+    def __init__(self):
+        self.buffer = deque()
+
+    def recorder(self, base):
+        return self.Recorder(self.buffer, base)
+
+    def player(self):
+        return self.Player(self.buffer)
+
+    class Recorder(object):
+        def __init__(self, buffer, subject):
+            self._buffer = buffer
+            self._subject = subject
+
+        def __call__(self, *args, **kw):
+            subject, buffer = [object.__getattribute__(self, x)
+                               for x in ('_subject', '_buffer')]
+
+            result = subject(*args, **kw)
+            if type(result) not in ReplayableSession.Natives:
+                buffer.append(ReplayableSession.Callable)
+                return type(self)(buffer, result)
+            else:
+                buffer.append(result)
+                return result
+
+        def __getattribute__(self, key):
+            try:
+                return object.__getattribute__(self, key)
+            except AttributeError:
+                pass
+
+            subject, buffer = [object.__getattribute__(self, x)
+                               for x in ('_subject', '_buffer')]
+            try:
+                result = type(subject).__getattribute__(subject, key)
+            except AttributeError:
+                buffer.append(ReplayableSession.NoAttribute)
+                raise
+            else:
+                if type(result) not in ReplayableSession.Natives:
+                    buffer.append(ReplayableSession.Callable)
+                    return type(self)(buffer, result)
+                else:
+                    buffer.append(result)
+                    return result
+
+    class Player(object):
+        def __init__(self, buffer):
+            self._buffer = buffer
+
+        def __call__(self, *args, **kw):
+            buffer = object.__getattribute__(self, '_buffer')
+            result = buffer.popleft()
+            if result is ReplayableSession.Callable:
+                return self
+            else:
+                return result
+
+        def __getattribute__(self, key):
+            try:
+                return object.__getattribute__(self, key)
+            except AttributeError:
+                pass
+            buffer = object.__getattribute__(self, '_buffer')
+            result = buffer.popleft()
+            if result is ReplayableSession.Callable:
+                return self
+            elif result is ReplayableSession.NoAttribute:
+                raise AttributeError(key)
+            else:
+                return result
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/test/profiling.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/test/profiling.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/test/profiling.py (revision 3)
@@ -0,0 +1,207 @@
+"""Profiling support for unit and performance tests.
+
+These are special purpose profiling methods which operate
+in a more fine-grained way than nose's profiling plugin.
+
+"""
+
+import os, sys
+from sqlalchemy.util import function_named
+import config
+
+__all__ = 'profiled', 'function_call_count', 'conditional_call_count'
+
+all_targets = set()
+profile_config = { 'targets': set(),
+                   'report': True,
+                   'sort': ('time', 'calls'),
+                   'limit': None }
+profiler = None
+
+def profiled(target=None, **target_opts):
+    """Optional function profiling.
+
+    @profiled('label')
+    or
+    @profiled('label', report=True, sort=('calls',), limit=20)
+
+    Enables profiling for a function when 'label' is targetted for
+    profiling.  Report options can be supplied, and override the global
+    configuration and command-line options.
+    """
+
+    # manual or automatic namespacing by module would remove conflict issues
+    if target is None:
+        target = 'anonymous_target'
+    elif target in all_targets:
+        print "Warning: redefining profile target '%s'" % target
+    all_targets.add(target)
+
+    filename = "%s.prof" % target
+
+    def decorator(fn):
+        def profiled(*args, **kw):
+            if (target not in profile_config['targets'] and
+                not target_opts.get('always', None)):
+                return fn(*args, **kw)
+
+            elapsed, load_stats, result = _profile(
+                filename, fn, *args, **kw)
+
+            report = target_opts.get('report', profile_config['report'])
+            if report:
+                sort_ = target_opts.get('sort', profile_config['sort'])
+                limit = target_opts.get('limit', profile_config['limit'])
+                print "Profile report for target '%s' (%s)" % (
+                    target, filename)
+
+                stats = load_stats()
+                stats.sort_stats(*sort_)
+                if limit:
+                    stats.print_stats(limit)
+                else:
+                    stats.print_stats()
+                #stats.print_callers()
+            os.unlink(filename)
+            return result
+        return function_named(profiled, fn.__name__)
+    return decorator
+
+def function_call_count(count=None, versions={}, variance=0.05):
+    """Assert a target for a test case's function call count.
+
+    count
+      Optional, general target function call count.
+
+    versions
+      Optional, a dictionary of Python version strings to counts,
+      for example::
+
+        { '2.5.1': 110,
+          '2.5': 100,
+          '2.4': 150 }
+
+      The best match for the current running python will be used.
+      If none match, 'count' will be used as the fallback.
+
+    variance
+      An +/- deviation percentage, defaults to 5%.
+    """
+
+    # this could easily dump the profile report if --verbose is in effect
+
+    version_info = list(sys.version_info)
+    py_version = '.'.join([str(v) for v in sys.version_info])
+
+    while version_info:
+        version = '.'.join([str(v) for v in version_info])
+        if version in versions:
+            count = versions[version]
+            break
+        version_info.pop()
+
+    if count is None:
+        return lambda fn: fn
+
+    def decorator(fn):
+        def counted(*args, **kw):
+            try:
+                filename = "%s.prof" % fn.__name__
+
+                elapsed, stat_loader, result = _profile(
+                    filename, fn, *args, **kw)
+
+                stats = stat_loader()
+                calls = stats.total_calls
+
+                stats.sort_stats('calls', 'cumulative')
+                stats.print_stats()
+                #stats.print_callers()
+                deviance = int(count * variance)
+                if (calls < (count - deviance) or
+                    calls > (count + deviance)):
+                    raise AssertionError(
+                        "Function call count %s not within %s%% "
+                        "of expected %s. (Python version %s)" % (
+                        calls, (variance * 100), count, py_version))
+
+                return result
+            finally:
+                if os.path.exists(filename):
+                    os.unlink(filename)
+        return function_named(counted, fn.__name__)
+    return decorator
+
+def conditional_call_count(discriminator, categories):
+    """Apply a function call count conditionally at runtime.
+
+    Takes two arguments, a callable that returns a key value, and a dict
+    mapping key values to a tuple of arguments to function_call_count.
+
+    The callable is not evaluated until the decorated function is actually
+    invoked.  If the `discriminator` returns a key not present in the
+    `categories` dictionary, no call count assertion is applied.
+
+    Useful for integration tests, where running a named test in isolation may
+    have a function count penalty not seen in the full suite, due to lazy
+    initialization in the DB-API, SA, etc.
+    """
+
+    def decorator(fn):
+        def at_runtime(*args, **kw):
+            criteria = categories.get(discriminator(), None)
+            if criteria is None:
+                return fn(*args, **kw)
+
+            rewrapped = function_call_count(*criteria)(fn)
+            return rewrapped(*args, **kw)
+        return function_named(at_runtime, fn.__name__)
+    return decorator
+
+
+def _profile(filename, fn, *args, **kw):
+    global profiler
+    if not profiler:
+        profiler = 'hotshot'
+        if sys.version_info > (2, 5):
+            try:
+                import cProfile
+                profiler = 'cProfile'
+            except ImportError:
+                pass
+
+    if profiler == 'cProfile':
+        return _profile_cProfile(filename, fn, *args, **kw)
+    else:
+        return _profile_hotshot(filename, fn, *args, **kw)
+
+def _profile_cProfile(filename, fn, *args, **kw):
+    import cProfile, gc, pstats, time
+
+    load_stats = lambda: pstats.Stats(filename)
+    gc.collect()
+
+    began = time.time()
+    cProfile.runctx('result = fn(*args, **kw)', globals(), locals(),
+                    filename=filename)
+    ended = time.time()
+
+    return ended - began, load_stats, locals()['result']
+
+def _profile_hotshot(filename, fn, *args, **kw):
+    import gc, hotshot, hotshot.stats, time
+    load_stats = lambda: hotshot.stats.load(filename)
+
+    gc.collect()
+    prof = hotshot.Profile(filename)
+    began = time.time()
+    prof.start()
+    try:
+        result = fn(*args, **kw)
+    finally:
+        prof.stop()
+        ended = time.time()
+        prof.close()
+
+    return ended - began, load_stats, result
+
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/test/pickleable.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/test/pickleable.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/test/pickleable.py (revision 3)
@@ -0,0 +1,75 @@
+"""
+
+some objects used for pickle tests, declared in their own module so that they
+are easily pickleable.
+
+"""
+
+
+class Foo(object):
+    def __init__(self, moredata):
+        self.data = 'im data'
+        self.stuff = 'im stuff'
+        self.moredata = moredata
+    __hash__ = object.__hash__
+    def __eq__(self, other):
+        return other.data == self.data and other.stuff == self.stuff and other.moredata==self.moredata
+
+
+class Bar(object):
+    def __init__(self, x, y):
+        self.x = x
+        self.y = y
+    __hash__ = object.__hash__
+    def __eq__(self, other):
+        return other.__class__ is self.__class__ and other.x==self.x and other.y==self.y
+    def __str__(self):
+        return "Bar(%d, %d)" % (self.x, self.y)
+
+class OldSchool:
+    def __init__(self, x, y):
+        self.x = x
+        self.y = y
+    def __eq__(self, other):
+        return other.__class__ is self.__class__ and other.x==self.x and other.y==self.y
+
+class OldSchoolWithoutCompare:    
+    def __init__(self, x, y):
+        self.x = x
+        self.y = y
+    
+class BarWithoutCompare(object):
+    def __init__(self, x, y):
+        self.x = x
+        self.y = y
+    def __str__(self):
+        return "Bar(%d, %d)" % (self.x, self.y)
+
+
+class NotComparable(object):
+    def __init__(self, data):
+        self.data = data
+
+    def __hash__(self):
+        return id(self)
+
+    def __eq__(self, other):
+        return NotImplemented
+
+    def __ne__(self, other):
+        return NotImplemented
+
+
+class BrokenComparable(object):
+    def __init__(self, data):
+        self.data = data
+
+    def __hash__(self):
+        return id(self)
+
+    def __eq__(self, other):
+        raise NotImplementedError
+
+    def __ne__(self, other):
+        raise NotImplementedError
+
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/test/orm.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/test/orm.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/test/orm.py (revision 3)
@@ -0,0 +1,111 @@
+import inspect, re
+import config, testing
+from sqlalchemy import orm
+
+__all__ = 'mapper',
+
+
+_whitespace = re.compile(r'^(\s+)')
+
+def _find_pragma(lines, current):
+    m = _whitespace.match(lines[current])
+    basis = m and m.group() or ''
+
+    for line in reversed(lines[0:current]):
+        if 'testlib.pragma' in line:
+            return line
+        m = _whitespace.match(line)
+        indent = m and m.group() or ''
+
+        # simplistic detection:
+
+        # >> # testlib.pragma foo
+        # >> center_line()
+        if indent == basis:
+            break
+        # >> # testlib.pragma foo
+        # >> if fleem:
+        # >>     center_line()
+        if line.endswith(':'):
+            break
+    return None
+
+def _make_blocker(method_name, fallback):
+    """Creates tripwired variant of a method, raising when called.
+
+    To excempt an invocation from blockage, there are two options.
+
+    1) add a pragma in a comment::
+
+        # testlib.pragma exempt:methodname
+        offending_line()
+
+    2) add a magic cookie to the function's namespace::
+        __sa_baremethodname_exempt__ = True
+        ...
+        offending_line()
+        another_offending_lines()
+
+    The second is useful for testing and development.
+    """
+
+    if method_name.startswith('__') and method_name.endswith('__'):
+        frame_marker = '__sa_%s_exempt__' % method_name[2:-2]
+    else:
+        frame_marker = '__sa_%s_exempt__' % method_name
+    pragma_marker = 'exempt:' + method_name
+
+    def method(self, *args, **kw):
+        frame_r = None
+        try:
+            frame = inspect.stack()[1][0]
+            frame_r = inspect.getframeinfo(frame, 9)
+
+            module = frame.f_globals.get('__name__', '')
+
+            type_ = type(self)
+
+            pragma = _find_pragma(*frame_r[3:5])
+
+            exempt = (
+                (not module.startswith('sqlalchemy')) or
+                (pragma and pragma_marker in pragma) or
+                (frame_marker in frame.f_locals) or
+                ('self' in frame.f_locals and
+                 getattr(frame.f_locals['self'], frame_marker, False)))
+
+            if exempt:
+                supermeth = getattr(super(type_, self), method_name, None)
+                if (supermeth is None or
+                    getattr(supermeth, 'im_func', None) is method):
+                    return fallback(self, *args, **kw)
+                else:
+                    return supermeth(*args, **kw)
+            else:
+                raise AssertionError(
+                    "%s.%s called in %s, line %s in %s" % (
+                    type_.__name__, method_name, module, frame_r[1], frame_r[2]))
+        finally:
+            del frame
+    method.__name__ = method_name
+    return method
+
+def mapper(type_, *args, **kw):
+    forbidden = [
+        ('__hash__', 'unhashable', lambda s: id(s)),
+        ('__eq__', 'noncomparable', lambda s, o: s is o),
+        ('__ne__', 'noncomparable', lambda s, o: s is not o),
+        ('__cmp__', 'noncomparable', lambda s, o: object.__cmp__(s, o)),
+        ('__le__', 'noncomparable', lambda s, o: object.__le__(s, o)),
+        ('__lt__', 'noncomparable', lambda s, o: object.__lt__(s, o)),
+        ('__ge__', 'noncomparable', lambda s, o: object.__ge__(s, o)),
+        ('__gt__', 'noncomparable', lambda s, o: object.__gt__(s, o)),
+        ('__nonzero__', 'truthless', lambda s: 1), ]
+
+    if isinstance(type_, type) and type_.__bases__ == (object,):
+        for method_name, option, fallback in forbidden:
+            if (getattr(config.options, option, False) and
+                method_name not in type_.__dict__):
+                setattr(type_, method_name, _make_blocker(method_name, fallback))
+
+    return orm.mapper(type_, *args, **kw)
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/test/testing.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/test/testing.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/test/testing.py (revision 3)
@@ -0,0 +1,699 @@
+"""TestCase and TestSuite artifacts and testing decorators."""
+
+import itertools
+import operator
+import re
+import sys
+import types
+import warnings
+from cStringIO import StringIO
+
+from sqlalchemy.test import config, assertsql
+from sqlalchemy.util import function_named
+
+from sqlalchemy import exc as sa_exc, util, types as sqltypes, schema
+
+_ops = { '<': operator.lt,
+         '>': operator.gt,
+         '==': operator.eq,
+         '!=': operator.ne,
+         '<=': operator.le,
+         '>=': operator.ge,
+         'in': operator.contains,
+         'between': lambda val, pair: val >= pair[0] and val <= pair[1],
+         }
+
+# sugar ('testing.db'); set here by config() at runtime
+db = None
+
+# more sugar, installed by __init__
+requires = None
+
+def fails_if(callable_):
+    """Mark a test as expected to fail if callable_ returns True.
+
+    If the callable returns false, the test is run and reported as normal.
+    However if the callable returns true, the test is expected to fail and the
+    unit test logic is inverted: if the test fails, a success is reported.  If
+    the test succeeds, a failure is reported.
+    """
+
+    docstring = getattr(callable_, '__doc__', None) or callable_.__name__
+    description = docstring.split('\n')[0]
+
+    def decorate(fn):
+        fn_name = fn.__name__
+        def maybe(*args, **kw):
+            if not callable_():
+                return fn(*args, **kw)
+            else:
+                try:
+                    fn(*args, **kw)
+                except Exception, ex:
+                    print ("'%s' failed as expected (condition: %s): %s " % (
+                        fn_name, description, str(ex)))
+                    return True
+                else:
+                    raise AssertionError(
+                        "Unexpected success for '%s' (condition: %s)" %
+                        (fn_name, description))
+        return function_named(maybe, fn_name)
+    return decorate
+
+
+def future(fn):
+    """Mark a test as expected to unconditionally fail.
+
+    Takes no arguments, omit parens when using as a decorator.
+    """
+
+    fn_name = fn.__name__
+    def decorated(*args, **kw):
+        try:
+            fn(*args, **kw)
+        except Exception, ex:
+            print ("Future test '%s' failed as expected: %s " % (
+                fn_name, str(ex)))
+            return True
+        else:
+            raise AssertionError(
+                "Unexpected success for future test '%s'" % fn_name)
+    return function_named(decorated, fn_name)
+
+def fails_on(dbs, reason):
+    """Mark a test as expected to fail on the specified database 
+    implementation.
+
+    Unlike ``crashes``, tests marked as ``fails_on`` will be run
+    for the named databases.  The test is expected to fail and the unit test
+    logic is inverted: if the test fails, a success is reported.  If the test
+    succeeds, a failure is reported.
+    """
+
+    def decorate(fn):
+        fn_name = fn.__name__
+        def maybe(*args, **kw):
+            if config.db.name != dbs:
+                return fn(*args, **kw)
+            else:
+                try:
+                    fn(*args, **kw)
+                except Exception, ex:
+                    print ("'%s' failed as expected on DB implementation "
+                           "'%s': %s" % (
+                        fn_name, config.db.name, reason))
+                    return True
+                else:
+                    raise AssertionError(
+                        "Unexpected success for '%s' on DB implementation '%s'" %
+                        (fn_name, config.db.name))
+        return function_named(maybe, fn_name)
+    return decorate
+
+def fails_on_everything_except(*dbs):
+    """Mark a test as expected to fail on most database implementations.
+
+    Like ``fails_on``, except failure is the expected outcome on all
+    databases except those listed.
+    """
+
+    def decorate(fn):
+        fn_name = fn.__name__
+        def maybe(*args, **kw):
+            if config.db.name in dbs:
+                return fn(*args, **kw)
+            else:
+                try:
+                    fn(*args, **kw)
+                except Exception, ex:
+                    print ("'%s' failed as expected on DB implementation "
+                           "'%s': %s" % (
+                        fn_name, config.db.name, str(ex)))
+                    return True
+                else:
+                    raise AssertionError(
+                        "Unexpected success for '%s' on DB implementation '%s'" %
+                        (fn_name, config.db.name))
+        return function_named(maybe, fn_name)
+    return decorate
+
+def crashes(db, reason):
+    """Mark a test as unsupported by a database implementation.
+
+    ``crashes`` tests will be skipped unconditionally.  Use for feature tests
+    that cause deadlocks or other fatal problems.
+
+    """
+    carp = _should_carp_about_exclusion(reason)
+    def decorate(fn):
+        fn_name = fn.__name__
+        def maybe(*args, **kw):
+            if config.db.name == db:
+                msg = "'%s' unsupported on DB implementation '%s': %s" % (
+                    fn_name, config.db.name, reason)
+                print msg
+                if carp:
+                    print >> sys.stderr, msg
+                return True
+            else:
+                return fn(*args, **kw)
+        return function_named(maybe, fn_name)
+    return decorate
+
+def _block_unconditionally(db, reason):
+    """Mark a test as unsupported by a database implementation.
+
+    Will never run the test against any version of the given database, ever,
+    no matter what.  Use when your assumptions are infallible; past, present
+    and future.
+
+    """
+    carp = _should_carp_about_exclusion(reason)
+    def decorate(fn):
+        fn_name = fn.__name__
+        def maybe(*args, **kw):
+            if config.db.name == db:
+                msg = "'%s' unsupported on DB implementation '%s': %s" % (
+                    fn_name, config.db.name, reason)
+                print msg
+                if carp:
+                    print >> sys.stderr, msg
+                return True
+            else:
+                return fn(*args, **kw)
+        return function_named(maybe, fn_name)
+    return decorate
+
+
+def exclude(db, op, spec, reason):
+    """Mark a test as unsupported by specific database server versions.
+
+    Stackable, both with other excludes and other decorators. Examples::
+
+      # Not supported by mydb versions less than 1, 0
+      @exclude('mydb', '<', (1,0))
+      # Other operators work too
+      @exclude('bigdb', '==', (9,0,9))
+      @exclude('yikesdb', 'in', ((0, 3, 'alpha2'), (0, 3, 'alpha3')))
+
+    """
+    carp = _should_carp_about_exclusion(reason)
+    def decorate(fn):
+        fn_name = fn.__name__
+        def maybe(*args, **kw):
+            if _is_excluded(db, op, spec):
+                msg = "'%s' unsupported on DB %s version '%s': %s" % (
+                    fn_name, config.db.name, _server_version(), reason)
+                print msg
+                if carp:
+                    print >> sys.stderr, msg
+                return True
+            else:
+                return fn(*args, **kw)
+        return function_named(maybe, fn_name)
+    return decorate
+
+def _should_carp_about_exclusion(reason):
+    """Guard against forgotten exclusions."""
+    assert reason
+    for _ in ('todo', 'fixme', 'xxx'):
+        if _ in reason.lower():
+            return True
+    else:
+        if len(reason) < 4:
+            return True
+
+def _is_excluded(db, op, spec):
+    """Return True if the configured db matches an exclusion specification.
+
+    db:
+      A dialect name
+    op:
+      An operator or stringified operator, such as '=='
+    spec:
+      A value that will be compared to the dialect's server_version_info
+      using the supplied operator.
+
+    Examples::
+      # Not supported by mydb versions less than 1, 0
+      _is_excluded('mydb', '<', (1,0))
+      # Other operators work too
+      _is_excluded('bigdb', '==', (9,0,9))
+      _is_excluded('yikesdb', 'in', ((0, 3, 'alpha2'), (0, 3, 'alpha3')))
+    """
+
+    if config.db.name != db:
+        return False
+
+    version = _server_version()
+
+    oper = hasattr(op, '__call__') and op or _ops[op]
+    return oper(version, spec)
+
+def _server_version(bind=None):
+    """Return a server_version_info tuple."""
+
+    if bind is None:
+        bind = config.db
+    return bind.dialect.server_version_info(bind.contextual_connect())
+
+def skip_if(predicate, reason=None):
+    """Skip a test if predicate is true."""
+    reason = reason or predicate.__name__
+    def decorate(fn):
+        fn_name = fn.__name__
+        def maybe(*args, **kw):
+            if predicate():
+                msg = "'%s' skipped on DB %s version '%s': %s" % (
+                    fn_name, config.db.name, _server_version(), reason)
+                print msg
+                return True
+            else:
+                return fn(*args, **kw)
+        return function_named(maybe, fn_name)
+    return decorate
+
+def emits_warning(*messages):
+    """Mark a test as emitting a warning.
+
+    With no arguments, squelches all SAWarning failures.  Or pass one or more
+    strings; these will be matched to the root of the warning description by
+    warnings.filterwarnings().
+    """
+
+    # TODO: it would be nice to assert that a named warning was
+    # emitted. should work with some monkeypatching of warnings,
+    # and may work on non-CPython if they keep to the spirit of
+    # warnings.showwarning's docstring.
+    # - update: jython looks ok, it uses cpython's module
+    def decorate(fn):
+        def safe(*args, **kw):
+            # todo: should probably be strict about this, too
+            filters = [dict(action='ignore',
+                            category=sa_exc.SAPendingDeprecationWarning)]
+            if not messages:
+                filters.append(dict(action='ignore',
+                                     category=sa_exc.SAWarning))
+            else:
+                filters.extend(dict(action='ignore',
+                                     message=message,
+                                     category=sa_exc.SAWarning)
+                                for message in messages)
+            for f in filters:
+                warnings.filterwarnings(**f)
+            try:
+                return fn(*args, **kw)
+            finally:
+                resetwarnings()
+        return function_named(safe, fn.__name__)
+    return decorate
+
+def emits_warning_on(db, *warnings):
+    """Mark a test as emitting a warning on a specific dialect.
+
+    With no arguments, squelches all SAWarning failures.  Or pass one or more
+    strings; these will be matched to the root of the warning description by
+    warnings.filterwarnings().
+    """
+    def decorate(fn):
+        def maybe(*args, **kw):
+            if isinstance(db, basestring):
+                if config.db.name != db:
+                    return fn(*args, **kw)
+                else:
+                    wrapped = emits_warning(*warnings)(fn)
+                    return wrapped(*args, **kw)
+            else:
+                if not _is_excluded(*db):
+                    return fn(*args, **kw)
+                else:
+                    wrapped = emits_warning(*warnings)(fn)
+                    return wrapped(*args, **kw)
+        return function_named(maybe, fn.__name__)
+    return decorate
+
+def uses_deprecated(*messages):
+    """Mark a test as immune from fatal deprecation warnings.
+
+    With no arguments, squelches all SADeprecationWarning failures.
+    Or pass one or more strings; these will be matched to the root
+    of the warning description by warnings.filterwarnings().
+
+    As a special case, you may pass a function name prefixed with //
+    and it will be re-written as needed to match the standard warning
+    verbiage emitted by the sqlalchemy.util.deprecated decorator.
+    """
+
+    def decorate(fn):
+        def safe(*args, **kw):
+            # todo: should probably be strict about this, too
+            filters = [dict(action='ignore',
+                            category=sa_exc.SAPendingDeprecationWarning)]
+            if not messages:
+                filters.append(dict(action='ignore',
+                                    category=sa_exc.SADeprecationWarning))
+            else:
+                filters.extend(
+                    [dict(action='ignore',
+                          message=message,
+                          category=sa_exc.SADeprecationWarning)
+                     for message in
+                     [ (m.startswith('//') and
+                        ('Call to deprecated function ' + m[2:]) or m)
+                       for m in messages] ])
+
+            for f in filters:
+                warnings.filterwarnings(**f)
+            try:
+                return fn(*args, **kw)
+            finally:
+                resetwarnings()
+        return function_named(safe, fn.__name__)
+    return decorate
+
+def resetwarnings():
+    """Reset warning behavior to testing defaults."""
+
+    warnings.filterwarnings('ignore',
+                            category=sa_exc.SAPendingDeprecationWarning) 
+    warnings.filterwarnings('error', category=sa_exc.SADeprecationWarning)
+    warnings.filterwarnings('error', category=sa_exc.SAWarning)
+
+#    warnings.simplefilter('error')
+
+    if sys.version_info < (2, 4):
+        warnings.filterwarnings('ignore', category=FutureWarning)
+
+
+def against(*queries):
+    """Boolean predicate, compares to testing database configuration.
+
+    Given one or more dialect names, returns True if one is the configured
+    database engine.
+
+    Also supports comparison to database version when provided with one or
+    more 3-tuples of dialect name, operator, and version specification::
+
+      testing.against('mysql', 'postgres')
+      testing.against(('mysql', '>=', (5, 0, 0))
+    """
+
+    for query in queries:
+        if isinstance(query, basestring):
+            if config.db.name == query:
+                return True
+        else:
+            name, op, spec = query
+            if config.db.name != name:
+                continue
+
+            have = config.db.dialect.server_version_info(
+                config.db.contextual_connect())
+
+            oper = hasattr(op, '__call__') and op or _ops[op]
+            if oper(have, spec):
+                return True
+    return False
+
+def _chain_decorators_on(fn, *decorators):
+    """Apply a series of decorators to fn, returning a decorated function."""
+    for decorator in reversed(decorators):
+        fn = decorator(fn)
+    return fn
+
+def rowset(results):
+    """Converts the results of sql execution into a plain set of column tuples.
+
+    Useful for asserting the results of an unordered query.
+    """
+
+    return set([tuple(row) for row in results])
+
+
+def eq_(a, b, msg=None):
+    """Assert a == b, with repr messaging on failure."""
+    assert a == b, msg or "%r != %r" % (a, b)
+
+def ne_(a, b, msg=None):
+    """Assert a != b, with repr messaging on failure."""
+    assert a != b, msg or "%r == %r" % (a, b)
+
+def is_(a, b, msg=None):
+    """Assert a is b, with repr messaging on failure."""
+    assert a is b, msg or "%r is not %r" % (a, b)
+
+def is_not_(a, b, msg=None):
+    """Assert a is not b, with repr messaging on failure."""
+    assert a is not b, msg or "%r is %r" % (a, b)
+
+def startswith_(a, fragment, msg=None):
+    """Assert a.startswith(fragment), with repr messaging on failure."""
+    assert a.startswith(fragment), msg or "%r does not start with %r" % (
+        a, fragment)
+
+def assert_raises(except_cls, callable_, *args, **kw):
+    try:
+        callable_(*args, **kw)
+        success = False
+    except except_cls, e:
+        success = True
+    
+    # assert outside the block so it works for AssertionError too !
+    assert success, "Callable did not raise an exception"
+
+def assert_raises_message(except_cls, msg, callable_, *args, **kwargs):
+    try:
+        callable_(*args, **kwargs)
+        assert False, "Callable did not raise an exception"
+    except except_cls, e:
+        assert re.search(msg, str(e)), "%r !~ %s" % (msg, e)
+
+def fail(msg):
+    assert False, msg
+    
+def fixture(table, columns, *rows):
+    """Insert data into table after creation."""
+    def onload(event, schema_item, connection):
+        insert = table.insert()
+        column_names = [col.key for col in columns]
+        connection.execute(insert, [dict(zip(column_names, column_values))
+                                    for column_values in rows])
+    table.append_ddl_listener('after-create', onload)
+
+def resolve_artifact_names(fn):
+    """Decorator, augment function globals with tables and classes.
+
+    Swaps out the function's globals at execution time. The 'global' statement
+    will not work as expected inside a decorated function.
+
+    """
+    # This could be automatically applied to framework and test_ methods in
+    # the MappedTest-derived test suites but... *some* explicitness for this
+    # magic is probably good.  Especially as 'global' won't work- these
+    # rebound functions aren't regular Python..
+    #
+    # Also: it's lame that CPython accepts a dict-subclass for globals, but
+    # only calls dict methods.  That would allow 'global' to pass through to
+    # the func_globals.
+    def resolved(*args, **kwargs):
+        self = args[0]
+        context = dict(fn.func_globals)
+        for source in self._artifact_registries:
+            context.update(getattr(self, source))
+        # jython bug #1034
+        rebound = types.FunctionType(
+            fn.func_code, context, fn.func_name, fn.func_defaults,
+            fn.func_closure)
+        return rebound(*args, **kwargs)
+    return function_named(resolved, fn.func_name)
+
+class adict(dict):
+    """Dict keys available as attributes.  Shadows."""
+    def __getattribute__(self, key):
+        try:
+            return self[key]
+        except KeyError:
+            return dict.__getattribute__(self, key)
+
+    def get_all(self, *keys):
+        return tuple([self[key] for key in keys])
+
+
+class TestBase(object):
+    # A sequence of database names to always run, regardless of the
+    # constraints below.
+    __whitelist__ = ()
+
+    # A sequence of requirement names matching testing.requires decorators
+    __requires__ = ()
+
+    # A sequence of dialect names to exclude from the test class.
+    __unsupported_on__ = ()
+
+    # If present, test class is only runnable for the *single* specified
+    # dialect.  If you need multiple, use __unsupported_on__ and invert.
+    __only_on__ = None
+
+    # A sequence of no-arg callables. If any are True, the entire testcase is
+    # skipped.
+    __skip_if__ = None
+
+    _artifact_registries = ()
+
+    def assert_(self, val, msg=None):
+        assert val, msg
+        
+class AssertsCompiledSQL(object):
+    def assert_compile(self, clause, result, params=None, checkparams=None, dialect=None):
+        if dialect is None:
+            dialect = getattr(self, '__dialect__', None)
+
+        if params is None:
+            keys = None
+        else:
+            keys = params.keys()
+
+        c = clause.compile(column_keys=keys, dialect=dialect)
+
+        print "\nSQL String:\n" + str(c) + repr(c.params)
+
+        cc = re.sub(r'\n', '', str(c))
+
+        eq_(cc, result, "%r != %r on dialect %r" % (cc, result, dialect))
+
+        if checkparams is not None:
+            eq_(c.construct_params(params), checkparams)
+
+class ComparesTables(object):
+    def assert_tables_equal(self, table, reflected_table, strict_types=False):
+        base_mro = sqltypes.TypeEngine.__mro__
+        assert len(table.c) == len(reflected_table.c)
+        for c, reflected_c in zip(table.c, reflected_table.c):
+            eq_(c.name, reflected_c.name)
+            assert reflected_c is reflected_table.c[c.name]
+            eq_(c.primary_key, reflected_c.primary_key)
+            eq_(c.nullable, reflected_c.nullable)
+            if strict_types:
+                assert type(reflected_c.type) is type(c.type), \
+                    "Type '%s' doesn't correspond to type '%s'" % (reflected_c.type, c.type)
+            else:
+                assert len(
+                    set(type(reflected_c.type).__mro__).difference(base_mro).intersection(
+                    set(type(c.type).__mro__).difference(base_mro)
+                    )
+                ) > 0, "Type '%s' doesn't correspond to type '%s'" % (reflected_c.type, c.type)
+
+            if isinstance(c.type, sqltypes.String):
+                eq_(c.type.length, reflected_c.type.length)
+
+            eq_(set([f.column.name for f in c.foreign_keys]), set([f.column.name for f in reflected_c.foreign_keys]))
+
+        assert len(table.primary_key) == len(reflected_table.primary_key)
+        for c in table.primary_key:
+            assert reflected_table.primary_key.columns[c.name]
+
+
+class AssertsExecutionResults(object):
+    def assert_result(self, result, class_, *objects):
+        result = list(result)
+        print repr(result)
+        self.assert_list(result, class_, objects)
+
+    def assert_list(self, result, class_, list):
+        self.assert_(len(result) == len(list),
+                     "result list is not the same size as test list, " +
+                     "for class " + class_.__name__)
+        for i in range(0, len(list)):
+            self.assert_row(class_, result[i], list[i])
+
+    def assert_row(self, class_, rowobj, desc):
+        self.assert_(rowobj.__class__ is class_,
+                     "item class is not " + repr(class_))
+        for key, value in desc.iteritems():
+            if isinstance(value, tuple):
+                if isinstance(value[1], list):
+                    self.assert_list(getattr(rowobj, key), value[0], value[1])
+                else:
+                    self.assert_row(value[0], getattr(rowobj, key), value[1])
+            else:
+                self.assert_(getattr(rowobj, key) == value,
+                             "attribute %s value %s does not match %s" % (
+                             key, getattr(rowobj, key), value))
+
+    def assert_unordered_result(self, result, cls, *expected):
+        """As assert_result, but the order of objects is not considered.
+
+        The algorithm is very expensive but not a big deal for the small
+        numbers of rows that the test suite manipulates.
+        """
+
+        class frozendict(dict):
+            def __hash__(self):
+                return id(self)
+
+        found = util.IdentitySet(result)
+        expected = set([frozendict(e) for e in expected])
+
+        for wrong in itertools.ifilterfalse(lambda o: type(o) == cls, found):
+            fail('Unexpected type "%s", expected "%s"' % (
+                type(wrong).__name__, cls.__name__))
+
+        if len(found) != len(expected):
+            fail('Unexpected object count "%s", expected "%s"' % (
+                len(found), len(expected)))
+
+        NOVALUE = object()
+        def _compare_item(obj, spec):
+            for key, value in spec.iteritems():
+                if isinstance(value, tuple):
+                    try:
+                        self.assert_unordered_result(
+                            getattr(obj, key), value[0], *value[1])
+                    except AssertionError:
+                        return False
+                else:
+                    if getattr(obj, key, NOVALUE) != value:
+                        return False
+            return True
+
+        for expected_item in expected:
+            for found_item in found:
+                if _compare_item(found_item, expected_item):
+                    found.remove(found_item)
+                    break
+            else:
+                fail(
+                    "Expected %s instance with attributes %s not found." % (
+                    cls.__name__, repr(expected_item)))
+        return True
+
+    def assert_sql_execution(self, db, callable_, *rules):
+        assertsql.asserter.add_rules(rules)
+        try:
+            callable_()
+            assertsql.asserter.statement_complete()
+        finally:
+            assertsql.asserter.clear_rules()
+            
+    def assert_sql(self, db, callable_, list_, with_sequences=None):
+        if with_sequences is not None and config.db.name in ('firebird', 'oracle', 'postgres'):
+            rules = with_sequences
+        else:
+            rules = list_
+        
+        newrules = []
+        for rule in rules:
+            if isinstance(rule, dict):
+                newrule = assertsql.AllOf(*[
+                    assertsql.ExactSQL(k, v) for k, v in rule.iteritems()
+                ])
+            else:
+                newrule = assertsql.ExactSQL(*rule)
+            newrules.append(newrule)
+            
+        self.assert_sql_execution(db, callable_, *newrules)
+
+    def assert_sql_count(self, db, callable_, count):
+        self.assert_sql_execution(db, callable_, assertsql.CountStatements(count))
+
+
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/test/__init__.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/test/__init__.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/test/__init__.py (revision 3)
@@ -0,0 +1,26 @@
+"""Testing environment and utilities.
+
+This package contains base classes and routines used by 
+the unit tests.   Tests are based on Nose and bootstrapped
+by noseplugin.NoseSQLAlchemy.
+
+"""
+
+from sqlalchemy.test import testing, engines, requires, profiling, pickleable, config
+from sqlalchemy.test.schema import Column, Table
+from sqlalchemy.test.testing import \
+     AssertsCompiledSQL, \
+     AssertsExecutionResults, \
+     ComparesTables, \
+     TestBase, \
+     rowset
+
+
+__all__ = ('testing',
+            'Column', 'Table',
+           'rowset',
+           'TestBase', 'AssertsExecutionResults',
+           'AssertsCompiledSQL', 'ComparesTables',
+           'engines', 'profiling', 'pickleable')
+
+
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/test/requires.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/test/requires.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/test/requires.py (revision 3)
@@ -0,0 +1,127 @@
+"""Global database feature support policy.
+
+Provides decorators to mark tests requiring specific feature support from the
+target database.
+
+"""
+
+from testing import \
+     _block_unconditionally as no_support, \
+     _chain_decorators_on, \
+     exclude, \
+     emits_warning_on
+
+
+def deferrable_constraints(fn):
+    """Target database must support derferable constraints."""
+    return _chain_decorators_on(
+        fn,
+        no_support('firebird', 'not supported by database'),
+        no_support('mysql', 'not supported by database'),
+        no_support('mssql', 'not supported by database'),
+        )
+
+def foreign_keys(fn):
+    """Target database must support foreign keys."""
+    return _chain_decorators_on(
+        fn,
+        no_support('sqlite', 'not supported by database'),
+        )
+
+def identity(fn):
+    """Target database must support GENERATED AS IDENTITY or a facsimile.
+
+    Includes GENERATED AS IDENTITY, AUTOINCREMENT, AUTO_INCREMENT, or other
+    column DDL feature that fills in a DB-generated identifier at INSERT-time
+    without requiring pre-execution of a SEQUENCE or other artifact.
+
+    """
+    return _chain_decorators_on(
+        fn,
+        no_support('firebird', 'not supported by database'),
+        no_support('oracle', 'not supported by database'),
+        no_support('postgres', 'not supported by database'),
+        no_support('sybase', 'not supported by database'),
+        )
+
+def independent_connections(fn):
+    """Target must support simultaneous, independent database connections."""
+
+    # This is also true of some configurations of UnixODBC and probably win32
+    # ODBC as well.
+    return _chain_decorators_on(
+        fn,
+        no_support('sqlite', 'no driver support')
+        )
+
+def row_triggers(fn):
+    """Target must support standard statement-running EACH ROW triggers."""
+    return _chain_decorators_on(
+        fn,
+        # no access to same table
+        no_support('mysql', 'requires SUPER priv'),
+        exclude('mysql', '<', (5, 0, 10), 'not supported by database'),
+        no_support('postgres', 'not supported by database: no statements'),
+        )
+
+def savepoints(fn):
+    """Target database must support savepoints."""
+    return _chain_decorators_on(
+        fn,
+        emits_warning_on('mssql', 'Savepoint support in mssql is experimental and may lead to data loss.'),
+        no_support('access', 'not supported by database'),
+        no_support('sqlite', 'not supported by database'),
+        no_support('sybase', 'FIXME: guessing, needs confirmation'),
+        exclude('mysql', '<', (5, 0, 3), 'not supported by database'),
+        )
+
+def sequences(fn):
+    """Target database must support SEQUENCEs."""
+    return _chain_decorators_on(
+        fn,
+        no_support('access', 'no SEQUENCE support'),
+        no_support('mssql', 'no SEQUENCE support'),
+        no_support('mysql', 'no SEQUENCE support'),
+        no_support('sqlite', 'no SEQUENCE support'),
+        no_support('sybase', 'no SEQUENCE support'),
+        )
+
+def subqueries(fn):
+    """Target database must support subqueries."""
+    return _chain_decorators_on(
+        fn,
+        exclude('mysql', '<', (4, 1, 1), 'no subquery support'),
+        )
+
+def two_phase_transactions(fn):
+    """Target database must support two-phase transactions."""
+    return _chain_decorators_on(
+        fn,
+        no_support('access', 'not supported by database'),
+        no_support('firebird', 'no SA implementation'),
+        no_support('maxdb', 'not supported by database'),
+        no_support('mssql', 'FIXME: guessing, needs confirmation'),
+        no_support('oracle', 'no SA implementation'),
+        no_support('sqlite', 'not supported by database'),
+        no_support('sybase', 'FIXME: guessing, needs confirmation'),
+        exclude('mysql', '<', (5, 0, 3), 'not supported by database'),
+        )
+
+def unicode_connections(fn):
+    """Target driver must support some encoding of Unicode across the wire."""
+    # TODO: expand to exclude MySQLdb versions w/ broken unicode
+    return _chain_decorators_on(
+        fn,
+        exclude('mysql', '<', (4, 1, 1), 'no unicode connection support'),
+        )
+
+def unicode_ddl(fn):
+    """Target driver must support some encoding of Unicode across the wire."""
+    # TODO: expand to exclude MySQLdb versions w/ broken unicode
+    return _chain_decorators_on(
+        fn,
+        no_support('maxdb', 'database support flakey'),
+        no_support('oracle', 'FIXME: no support in database?'),
+        no_support('sybase', 'FIXME: guessing, needs confirmation'),
+        exclude('mysql', '<', (4, 1, 1), 'no unicode connection support'),
+        )
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/test/schema.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/test/schema.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/test/schema.py (revision 3)
@@ -0,0 +1,74 @@
+"""Enhanced versions of schema.Table and schema.Column which establish
+desired state for different backends.
+"""
+
+from sqlalchemy.test import testing
+from sqlalchemy import schema
+
+__all__ = 'Table', 'Column',
+
+table_options = {}
+
+def Table(*args, **kw):
+    """A schema.Table wrapper/hook for dialect-specific tweaks."""
+
+    test_opts = dict([(k,kw.pop(k)) for k in kw.keys()
+                      if k.startswith('test_')])
+
+    kw.update(table_options)
+
+    if testing.against('mysql'):
+        if 'mysql_engine' not in kw and 'mysql_type' not in kw:
+            if 'test_needs_fk' in test_opts or 'test_needs_acid' in test_opts:
+                kw['mysql_engine'] = 'InnoDB'
+
+    # Apply some default cascading rules for self-referential foreign keys.
+    # MySQL InnoDB has some issues around seleting self-refs too.
+    if testing.against('firebird'):
+        table_name = args[0]
+        unpack = (testing.config.db.dialect.
+                  identifier_preparer.unformat_identifiers)
+
+        # Only going after ForeignKeys in Columns.  May need to
+        # expand to ForeignKeyConstraint too.
+        fks = [fk
+               for col in args if isinstance(col, schema.Column)
+               for fk in col.args if isinstance(fk, schema.ForeignKey)]
+
+        for fk in fks:
+            # root around in raw spec
+            ref = fk._colspec
+            if isinstance(ref, schema.Column):
+                name = ref.table.name
+            else:
+                # take just the table name: on FB there cannot be
+                # a schema, so the first element is always the
+                # table name, possibly followed by the field name
+                name = unpack(ref)[0]
+            if name == table_name:
+                if fk.ondelete is None:
+                    fk.ondelete = 'CASCADE'
+                if fk.onupdate is None:
+                    fk.onupdate = 'CASCADE'
+
+    if testing.against('firebird', 'oracle'):
+        pk_seqs = [col for col in args
+                   if (isinstance(col, schema.Column)
+                       and col.primary_key
+                       and getattr(col, '_needs_autoincrement', False))]
+        for c in pk_seqs:
+            c.args.append(schema.Sequence(args[0] + '_' + c.name + '_seq', optional=True))
+    return schema.Table(*args, **kw)
+
+
+def Column(*args, **kw):
+    """A schema.Column wrapper/hook for dialect-specific tweaks."""
+
+    test_opts = dict([(k,kw.pop(k)) for k in kw.keys()
+                      if k.startswith('test_')])
+
+    c = schema.Column(*args, **kw)
+    if testing.against('firebird', 'oracle'):
+        if 'test_needs_autoincrement' in test_opts:
+            c._needs_autoincrement = True
+    return c
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/test/assertsql.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/test/assertsql.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/test/assertsql.py (revision 3)
@@ -0,0 +1,283 @@
+
+from sqlalchemy.interfaces import ConnectionProxy
+from sqlalchemy.engine.default import DefaultDialect
+from sqlalchemy.engine.base import Connection
+from sqlalchemy import util
+import testing
+import re
+
+class AssertRule(object):
+    def process_execute(self, clauseelement, *multiparams, **params):
+        pass
+
+    def process_cursor_execute(self, statement, parameters, context, executemany):
+        pass
+        
+    def is_consumed(self):
+        """Return True if this rule has been consumed, False if not.
+        
+        Should raise an AssertionError if this rule's condition has definitely failed.
+        
+        """
+        raise NotImplementedError()
+    
+    def rule_passed(self):
+        """Return True if the last test of this rule passed, False if failed, None if no test was applied."""
+        
+        raise NotImplementedError()
+        
+    def consume_final(self):
+        """Return True if this rule has been consumed.
+        
+        Should raise an AssertionError if this rule's condition has not been consumed or has failed.
+        
+        """
+        
+        if self._result is None:
+            assert False, "Rule has not been consumed"
+            
+        return self.is_consumed()
+
+class SQLMatchRule(AssertRule):
+    def __init__(self):
+        self._result = None
+        self._errmsg = ""
+    
+    def rule_passed(self):
+        return self._result
+        
+    def is_consumed(self):
+        if self._result is None:
+            return False
+            
+        assert self._result, self._errmsg
+        
+        return True
+    
+class ExactSQL(SQLMatchRule):
+    def __init__(self, sql, params=None):
+        SQLMatchRule.__init__(self)
+        self.sql = sql
+        self.params = params
+    
+    def process_cursor_execute(self, statement, parameters, context, executemany):
+        if not context:
+            return
+            
+        _received_statement = _process_engine_statement(statement, context)
+        _received_parameters = context.compiled_parameters
+        
+        # TODO: remove this step once all unit tests
+        # are migrated, as ExactSQL should really be *exact* SQL 
+        sql = _process_assertion_statement(self.sql, context)
+        
+        equivalent = _received_statement == sql
+        if self.params:
+            if util.callable(self.params):
+                params = self.params(context)
+            else:
+                params = self.params
+
+            if not isinstance(params, list):
+                params = [params]
+            equivalent = equivalent and params == context.compiled_parameters
+        else:
+            params = {}
+        
+        
+        self._result = equivalent
+        if not self._result:
+            self._errmsg = "Testing for exact statement %r exact params %r, " \
+                "received %r with params %r" % (sql, params, _received_statement, _received_parameters)
+    
+
+class RegexSQL(SQLMatchRule):
+    def __init__(self, regex, params=None):
+        SQLMatchRule.__init__(self)
+        self.regex = re.compile(regex)
+        self.orig_regex = regex
+        self.params = params
+
+    def process_cursor_execute(self, statement, parameters, context, executemany):
+        if not context:
+            return
+
+        _received_statement = _process_engine_statement(statement, context)
+        _received_parameters = context.compiled_parameters
+
+        equivalent = bool(self.regex.match(_received_statement))
+        if self.params:
+            if util.callable(self.params):
+                params = self.params(context)
+            else:
+                params = self.params
+
+            if not isinstance(params, list):
+                params = [params]
+            
+            # do a positive compare only
+            for param, received in zip(params, _received_parameters):
+                for k, v in param.iteritems():
+                    if k not in received or received[k] != v:
+                        equivalent = False
+                        break
+        else:
+            params = {}
+
+        self._result = equivalent
+        if not self._result:
+            self._errmsg = "Testing for regex %r partial params %r, "\
+                "received %r with params %r" % (self.orig_regex, params, _received_statement, _received_parameters)
+
+class CompiledSQL(SQLMatchRule):
+    def __init__(self, statement, params):
+        SQLMatchRule.__init__(self)
+        self.statement = statement
+        self.params = params
+
+    def process_cursor_execute(self, statement, parameters, context, executemany):
+        if not context:
+            return
+
+        _received_parameters = context.compiled_parameters
+        
+        # recompile from the context, using the default dialect
+        compiled = context.compiled.statement.\
+                compile(dialect=DefaultDialect(), column_keys=context.compiled.column_keys)
+                
+        _received_statement = re.sub(r'\n', '', str(compiled))
+        
+        equivalent = self.statement == _received_statement
+        if self.params:
+            if util.callable(self.params):
+                params = self.params(context)
+            else:
+                params = self.params
+
+            if not isinstance(params, list):
+                params = [params]
+            
+            # do a positive compare only
+            for param, received in zip(params, _received_parameters):
+                for k, v in param.iteritems():
+                    if k not in received or received[k] != v:
+                        equivalent = False
+                        break
+        else:
+            params = {}
+
+        self._result = equivalent
+        if not self._result:
+            self._errmsg = "Testing for compiled statement %r partial params %r, " \
+                    "received %r with params %r" % (self.statement, params, _received_statement, _received_parameters)
+    
+        
+class CountStatements(AssertRule):
+    def __init__(self, count):
+        self.count = count
+        self._statement_count = 0
+        
+    def process_execute(self, clauseelement, *multiparams, **params):
+        self._statement_count += 1
+
+    def process_cursor_execute(self, statement, parameters, context, executemany):
+        pass
+
+    def is_consumed(self):
+        return False
+    
+    def consume_final(self):
+        assert self.count == self._statement_count, "desired statement count %d does not match %d" % (self.count, self._statement_count)
+        return True
+        
+class AllOf(AssertRule):
+    def __init__(self, *rules):
+        self.rules = set(rules)
+        
+    def process_execute(self, clauseelement, *multiparams, **params):
+        for rule in self.rules:
+            rule.process_execute(clauseelement, *multiparams, **params)
+
+    def process_cursor_execute(self, statement, parameters, context, executemany):
+        for rule in self.rules:
+            rule.process_cursor_execute(statement, parameters, context, executemany)
+
+    def is_consumed(self):
+        if not self.rules:
+            return True
+        
+        for rule in list(self.rules):
+            if rule.rule_passed(): # a rule passed, move on
+                self.rules.remove(rule)
+                return len(self.rules) == 0
+
+        assert False, "No assertion rules were satisfied for statement"
+    
+    def consume_final(self):
+        return len(self.rules) == 0
+        
+def _process_engine_statement(query, context):
+    if context.engine.name == 'mssql' and query.endswith('; select scope_identity()'):
+        query = query[:-25]
+    
+    query = re.sub(r'\n', '', query)
+    
+    return query
+    
+def _process_assertion_statement(query, context):
+    paramstyle = context.dialect.paramstyle
+    if paramstyle == 'named':
+        pass
+    elif paramstyle =='pyformat':
+        query = re.sub(r':([\w_]+)', r"%(\1)s", query)
+    else:
+        # positional params
+        repl = None
+        if paramstyle=='qmark':
+            repl = "?"
+        elif paramstyle=='format':
+            repl = r"%s"
+        elif paramstyle=='numeric':
+            repl = None
+        query = re.sub(r':([\w_]+)', repl, query)
+
+    return query
+
+class SQLAssert(ConnectionProxy):
+    rules = None
+    
+    def add_rules(self, rules):
+        self.rules = list(rules)
+    
+    def statement_complete(self):
+        for rule in self.rules:
+            if not rule.consume_final():
+                assert False, "All statements are complete, but pending assertion rules remain"
+
+    def clear_rules(self):
+        del self.rules
+        
+    def execute(self, conn, execute, clauseelement, *multiparams, **params):
+        result = execute(clauseelement, *multiparams, **params)
+
+        if self.rules is not None:
+            if not self.rules:
+                assert False, "All rules have been exhausted, but further statements remain"
+            rule = self.rules[0]
+            rule.process_execute(clauseelement, *multiparams, **params)
+            if rule.is_consumed():
+                self.rules.pop(0)
+            
+        return result
+        
+    def cursor_execute(self, execute, cursor, statement, parameters, context, executemany):
+        result = execute(cursor, statement, parameters, context)
+        
+        if self.rules:
+            rule = self.rules[0]
+            rule.process_cursor_execute(statement, parameters, context, executemany)
+
+        return result
+
+asserter = SQLAssert()
+    
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/test/noseplugin.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/test/noseplugin.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/test/noseplugin.py (revision 3)
@@ -0,0 +1,156 @@
+import logging
+import os
+import re
+import sys
+import time
+import warnings
+import ConfigParser
+import StringIO
+from config import db, db_label, db_url, file_config, base_config, \
+                           post_configure, \
+                           _list_dbs, _server_side_cursors, _engine_strategy, \
+                           _engine_uri, _require, _engine_pool, \
+                           _create_testing_engine, _prep_testing_database, \
+                           _set_table_options, _reverse_topological, _log
+from sqlalchemy.test import testing, config, requires
+from nose.plugins import Plugin
+from nose.util import tolist
+import nose.case
+
+log = logging.getLogger('nose.plugins.sqlalchemy')
+
+class NoseSQLAlchemy(Plugin):
+    """
+    Handles the setup and extra properties required for testing SQLAlchemy
+    """
+    enabled = True
+    name = 'sqlalchemy'
+    score = 100
+
+    def options(self, parser, env=os.environ):
+        Plugin.options(self, parser, env)
+        opt = parser.add_option
+        #opt("--verbose", action="store_true", dest="verbose",
+            #help="enable stdout echoing/printing")
+        #opt("--quiet", action="store_true", dest="quiet", help="suppress output")
+        opt("--log-info", action="callback", type="string", callback=_log,
+            help="turn on info logging for <LOG> (multiple OK)")
+        opt("--log-debug", action="callback", type="string", callback=_log,
+            help="turn on debug logging for <LOG> (multiple OK)")
+        opt("--require", action="append", dest="require", default=[],
+            help="require a particular driver or module version (multiple OK)")
+        opt("--db", action="store", dest="db", default="sqlite",
+            help="Use prefab database uri")
+        opt('--dbs', action='callback', callback=_list_dbs,
+            help="List available prefab dbs")
+        opt("--dburi", action="store", dest="dburi",
+            help="Database uri (overrides --db)")
+        opt("--dropfirst", action="store_true", dest="dropfirst",
+            help="Drop all tables in the target database first (use with caution on Oracle, MS-SQL)")
+        opt("--mockpool", action="store_true", dest="mockpool",
+            help="Use mock pool (asserts only one connection used)")
+        opt("--enginestrategy", action="callback", type="string",
+            callback=_engine_strategy,
+            help="Engine strategy (plain or threadlocal, defaults to plain)")
+        opt("--reversetop", action="store_true", dest="reversetop", default=False,
+            help="Reverse the collection ordering for topological sorts (helps "
+                  "reveal dependency issues)")
+        opt("--unhashable", action="store_true", dest="unhashable", default=False,
+            help="Disallow SQLAlchemy from performing a hash() on mapped test objects.")
+        opt("--noncomparable", action="store_true", dest="noncomparable", default=False,
+            help="Disallow SQLAlchemy from performing == on mapped test objects.")
+        opt("--truthless", action="store_true", dest="truthless", default=False,
+            help="Disallow SQLAlchemy from truth-evaluating mapped test objects.")
+        opt("--serverside", action="callback", callback=_server_side_cursors,
+            help="Turn on server side cursors for PG")
+        opt("--mysql-engine", action="store", dest="mysql_engine", default=None,
+            help="Use the specified MySQL storage engine for all tables, default is "
+                 "a db-default/InnoDB combo.")
+        opt("--table-option", action="append", dest="tableopts", default=[],
+            help="Add a dialect-specific table option, key=value")
+
+        global file_config
+        file_config = ConfigParser.ConfigParser()
+        file_config.readfp(StringIO.StringIO(base_config))
+        file_config.read(['test.cfg', os.path.expanduser('~/.satest.cfg')])
+        config.file_config = file_config
+        
+    def configure(self, options, conf):
+        Plugin.configure(self, options, conf)
+
+        import testing, requires
+        testing.db = db
+        testing.requires = requires
+
+        # Lazy setup of other options (post coverage)
+        for fn in post_configure:
+            fn(options, file_config)
+        
+    def describeTest(self, test):
+        return ""
+        
+    def wantClass(self, cls):
+        """Return true if you want the main test selector to collect
+        tests from this class, false if you don't, and None if you don't
+        care.
+
+        :Parameters:
+           cls : class
+             The class being examined by the selector
+
+        """
+
+        if not issubclass(cls, testing.TestBase):
+            return False
+        else:
+            if (hasattr(cls, '__whitelist__') and
+                testing.db.name in cls.__whitelist__):
+                return True
+            else:
+                return not self.__should_skip_for(cls)
+    
+    def __should_skip_for(self, cls):
+        if hasattr(cls, '__requires__'):
+            def test_suite(): return 'ok'
+            for requirement in cls.__requires__:
+                check = getattr(requires, requirement)
+                if check(test_suite)() != 'ok':
+                    # The requirement will perform messaging.
+                    return True
+        if (hasattr(cls, '__unsupported_on__') and
+            testing.db.name in cls.__unsupported_on__):
+            print "'%s' unsupported on DB implementation '%s'" % (
+                cls.__class__.__name__, testing.db.name)
+            return True
+        if (getattr(cls, '__only_on__', None) not in (None, testing.db.name)):
+            print "'%s' unsupported on DB implementation '%s'" % (
+                cls.__class__.__name__, testing.db.name)
+            return True
+        if (getattr(cls, '__skip_if__', False)):
+            for c in getattr(cls, '__skip_if__'):
+                if c():
+                    print "'%s' skipped by %s" % (
+                        cls.__class__.__name__, c.__name__)
+                    return True
+        for rule in getattr(cls, '__excluded_on__', ()):
+            if testing._is_excluded(*rule):
+                print "'%s' unsupported on DB %s version %s" % (
+                    cls.__class__.__name__, testing.db.name,
+                    _server_version())
+                return True
+        return False
+
+    #def begin(self):
+        #pass
+
+    def beforeTest(self, test):
+        testing.resetwarnings()
+
+    def afterTest(self, test):
+        testing.resetwarnings()
+        
+    #def handleError(self, test, err):
+        #pass
+
+    #def finalize(self, result=None):
+        #pass
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/test/config.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/test/config.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/test/config.py (revision 3)
@@ -0,0 +1,178 @@
+import optparse, os, sys, re, ConfigParser, StringIO, time, warnings
+logging = None
+
+__all__ = 'parser', 'configure', 'options',
+
+db = None
+db_label, db_url, db_opts = None, None, {}
+
+options = None
+file_config = None
+
+base_config = """
+[db]
+sqlite=sqlite:///:memory:
+sqlite_file=sqlite:///querytest.db
+postgres=postgres://scott:tiger@127.0.0.1:5432/test
+postgresql=postgres://scott:tiger@127.0.0.1:5432/test
+mysql=mysql://scott:tiger@127.0.0.1:3306/test
+oracle=oracle://scott:tiger@127.0.0.1:1521
+oracle8=oracle://scott:tiger@127.0.0.1:1521/?use_ansi=0
+mssql=mssql://scott:tiger@SQUAWK\\SQLEXPRESS/test
+firebird=firebird://sysdba:masterkey@localhost//tmp/test.fdb
+maxdb=maxdb://MONA:RED@/maxdb1
+"""
+
+def _log(option, opt_str, value, parser):
+    global logging
+    if not logging:
+        import logging
+        logging.basicConfig()
+
+    if opt_str.endswith('-info'):
+        logging.getLogger(value).setLevel(logging.INFO)
+    elif opt_str.endswith('-debug'):
+        logging.getLogger(value).setLevel(logging.DEBUG)
+
+
+def _list_dbs(*args):
+    print "Available --db options (use --dburi to override)"
+    for macro in sorted(file_config.options('db')):
+        print "%20s\t%s" % (macro, file_config.get('db', macro))
+    sys.exit(0)
+
+def _server_side_cursors(options, opt_str, value, parser):
+    db_opts['server_side_cursors'] = True
+
+def _engine_strategy(options, opt_str, value, parser):
+    if value:
+        db_opts['strategy'] = value
+
+class _ordered_map(object):
+    def __init__(self):
+        self._keys = list()
+        self._data = dict()
+
+    def __setitem__(self, key, value):
+        if key not in self._keys:
+            self._keys.append(key)
+        self._data[key] = value
+
+    def __iter__(self):
+        for key in self._keys:
+            yield self._data[key]
+
+# at one point in refactoring, modules were injecting into the config
+# process.  this could probably just become a list now.
+post_configure = _ordered_map()
+
+def _engine_uri(options, file_config):
+    global db_label, db_url
+    db_label = 'sqlite'
+    if options.dburi:
+        db_url = options.dburi
+        db_label = db_url[:db_url.index(':')]
+    elif options.db:
+        db_label = options.db
+        db_url = None
+
+    if db_url is None:
+        if db_label not in file_config.options('db'):
+            raise RuntimeError(
+                "Unknown engine.  Specify --dbs for known engines.")
+        db_url = file_config.get('db', db_label)
+post_configure['engine_uri'] = _engine_uri
+
+def _require(options, file_config):
+    if not(options.require or
+           (file_config.has_section('require') and
+            file_config.items('require'))):
+        return
+
+    try:
+        import pkg_resources
+    except ImportError:
+        raise RuntimeError("setuptools is required for version requirements")
+
+    cmdline = []
+    for requirement in options.require:
+        pkg_resources.require(requirement)
+        cmdline.append(re.split('\s*(<!>=)', requirement, 1)[0])
+
+    if file_config.has_section('require'):
+        for label, requirement in file_config.items('require'):
+            if not label == db_label or label.startswith('%s.' % db_label):
+                continue
+            seen = [c for c in cmdline if requirement.startswith(c)]
+            if seen:
+                continue
+            pkg_resources.require(requirement)
+post_configure['require'] = _require
+
+def _engine_pool(options, file_config):
+    if options.mockpool:
+        from sqlalchemy import pool
+        db_opts['poolclass'] = pool.AssertionPool
+post_configure['engine_pool'] = _engine_pool
+
+def _create_testing_engine(options, file_config):
+    from sqlalchemy.test import engines, testing
+    global db
+    db = engines.testing_engine(db_url, db_opts)
+    testing.db = db
+post_configure['create_engine'] = _create_testing_engine
+
+def _prep_testing_database(options, file_config):
+    from sqlalchemy.test import engines
+    from sqlalchemy import schema
+
+    try:
+        # also create alt schemas etc. here?
+        if options.dropfirst:
+            e = engines.utf8_engine()
+            existing = e.table_names()
+            if existing:
+                print "Dropping existing tables in database: " + db_url
+                try:
+                    print "Tables: %s" % ', '.join(existing)
+                except:
+                    pass
+                print "Abort within 5 seconds..."
+                time.sleep(5)
+                md = schema.MetaData(e, reflect=True)
+                md.drop_all()
+            e.dispose()
+    except (KeyboardInterrupt, SystemExit):
+        raise
+    except Exception, e:
+        warnings.warn(RuntimeWarning(
+            "Error checking for existing tables in testing "
+            "database: %s" % e))
+post_configure['prep_db'] = _prep_testing_database
+
+def _set_table_options(options, file_config):
+    from sqlalchemy.test import schema
+
+    table_options = schema.table_options
+    for spec in options.tableopts:
+        key, value = spec.split('=')
+        table_options[key] = value
+
+    if options.mysql_engine:
+        table_options['mysql_engine'] = options.mysql_engine
+post_configure['table_options'] = _set_table_options
+
+def _reverse_topological(options, file_config):
+    if options.reversetop:
+        from sqlalchemy.orm import unitofwork
+        from sqlalchemy import topological
+        class RevQueueDepSort(topological.QueueDependencySorter):
+            def __init__(self, tuples, allitems):
+                self.tuples = list(tuples)
+                self.allitems = list(allitems)
+                self.tuples.reverse()
+                self.allitems.reverse()
+        topological.QueueDependencySorter = RevQueueDepSort
+        unitofwork.DependencySorter = RevQueueDepSort
+post_configure['topological'] = _reverse_topological
+
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/__init__.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/__init__.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/__init__.py (revision 3)
@@ -0,0 +1,112 @@
+# __init__.py
+# Copyright (C) 2005, 2006, 2007, 2008, 2009 Michael Bayer mike_mp@zzzcomputing.com
+#
+# This module is part of SQLAlchemy and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+import inspect
+import sys
+
+import sqlalchemy.exc as exceptions
+sys.modules['sqlalchemy.exceptions'] = exceptions
+
+from sqlalchemy.types import (
+    BLOB,
+    BOOLEAN,
+    Binary,
+    Boolean,
+    CHAR,
+    CLOB,
+    DATE,
+    DATETIME,
+    DECIMAL,
+    Date,
+    DateTime,
+    FLOAT,
+    Float,
+    INT,
+    Integer,
+    Interval,
+    NCHAR,
+    NUMERIC,
+    Numeric,
+    PickleType,
+    SMALLINT,
+    SmallInteger,
+    String,
+    TEXT,
+    TIME,
+    TIMESTAMP,
+    Text,
+    Time,
+    Unicode,
+    UnicodeText,
+    VARCHAR,
+    )
+
+from sqlalchemy.sql import (
+    alias,
+    and_,
+    asc,
+    between,
+    bindparam,
+    case,
+    cast,
+    collate,
+    delete,
+    desc,
+    distinct,
+    except_,
+    except_all,
+    exists,
+    extract,
+    func,
+    insert,
+    intersect,
+    intersect_all,
+    join,
+    literal,
+    literal_column,
+    modifier,
+    not_,
+    null,
+    or_,
+    outerjoin,
+    outparam,
+    select,
+    subquery,
+    text,
+    union,
+    union_all,
+    update,
+    )
+
+from sqlalchemy.schema import (
+    CheckConstraint,
+    Column,
+    ColumnDefault,
+    Constraint,
+    DDL,
+    DefaultClause,
+    FetchedValue,
+    ForeignKey,
+    ForeignKeyConstraint,
+    Index,
+    MetaData,
+    PassiveDefault,
+    PrimaryKeyConstraint,
+    Sequence,
+    Table,
+    ThreadLocalMetaData,
+    UniqueConstraint,
+    )
+
+from sqlalchemy.engine import create_engine, engine_from_config
+
+
+__all__ = sorted(name for name, obj in locals().items()
+                 if not (name.startswith('_') or inspect.ismodule(obj)))
+                 
+__version__ = '0.5.6'
+
+del inspect, sys
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/schema.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/schema.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/schema.py (revision 3)
@@ -0,0 +1,2179 @@
+# schema.py
+# Copyright (C) 2005, 2006, 2007, 2008, 2009 Michael Bayer mike_mp@zzzcomputing.com
+#
+# This module is part of SQLAlchemy and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+"""The schema module provides the building blocks for database metadata.
+
+Each element within this module describes a database entity which can be
+created and dropped, or is otherwise part of such an entity.  Examples include
+tables, columns, sequences, and indexes.
+
+All entities are subclasses of :class:`~sqlalchemy.schema.SchemaItem`, and as defined
+in this module they are intended to be agnostic of any vendor-specific
+constructs.
+
+A collection of entities are grouped into a unit called
+:class:`~sqlalchemy.schema.MetaData`.  MetaData serves as a logical grouping of schema
+elements, and can also be associated with an actual database connection such
+that operations involving the contained elements can contact the database as
+needed.
+
+Two of the elements here also build upon their "syntactic" counterparts, which
+are defined in :class:`~sqlalchemy.sql.expression.`, specifically
+:class:`~sqlalchemy.schema.Table` and :class:`~sqlalchemy.schema.Column`.  Since these objects
+are part of the SQL expression language, they are usable as components in SQL
+expressions.
+
+"""
+import re, inspect
+from sqlalchemy import types, exc, util, databases
+from sqlalchemy.sql import expression, visitors
+
+URL = None
+
+__all__ = ['SchemaItem', 'Table', 'Column', 'ForeignKey', 'Sequence', 'Index',
+           'ForeignKeyConstraint', 'PrimaryKeyConstraint', 'CheckConstraint',
+           'UniqueConstraint', 'DefaultGenerator', 'Constraint', 'MetaData',
+           'ThreadLocalMetaData', 'SchemaVisitor', 'PassiveDefault',
+           'DefaultClause', 'FetchedValue', 'ColumnDefault', 'DDL']
+__all__.sort()
+
+class SchemaItem(visitors.Visitable):
+    """Base class for items that define a database schema."""
+
+    __visit_name__ = 'schema_item'
+    quote = None
+
+    def _init_items(self, *args):
+        """Initialize the list of child items for this SchemaItem."""
+
+        for item in args:
+            if item is not None:
+                item._set_parent(self)
+
+    def _set_parent(self, parent):
+        """Associate with this SchemaItem's parent object."""
+
+        raise NotImplementedError()
+
+    def get_children(self, **kwargs):
+        """used to allow SchemaVisitor access"""
+        return []
+
+    def __repr__(self):
+        return "%s()" % self.__class__.__name__
+
+    @property
+    def bind(self):
+        """Return the connectable associated with this SchemaItem."""
+
+        m = self.metadata
+        return m and m.bind or None
+
+    @util.memoized_property
+    def info(self):
+        return {}
+
+def _get_table_key(name, schema):
+    if schema is None:
+        return name
+    else:
+        return schema + "." + name
+
+class _TableSingleton(visitors.VisitableType):
+    """A metaclass used by the ``Table`` object to provide singleton behavior."""
+
+    def __call__(self, name, metadata, *args, **kwargs):
+        schema = kwargs.get('schema', kwargs.get('owner', None))
+        useexisting = kwargs.pop('useexisting', False)
+        mustexist = kwargs.pop('mustexist', False)
+        key = _get_table_key(name, schema)
+        try:
+            table = metadata.tables[key]
+            if not useexisting and table._cant_override(*args, **kwargs):
+                raise exc.InvalidRequestError(
+                    "Table '%s' is already defined for this MetaData instance.  "
+                    "Specify 'useexisting=True' to redefine options and "
+                    "columns on an existing Table object." % key)
+            else:
+                table._init_existing(*args, **kwargs)
+            return table
+        except KeyError:
+            if mustexist:
+                raise exc.InvalidRequestError(
+                    "Table '%s' not defined" % (key))
+            try:
+                return type.__call__(self, name, metadata, *args, **kwargs)
+            except:
+                if key in metadata.tables:
+                    del metadata.tables[key]
+                raise
+
+
+class Table(SchemaItem, expression.TableClause):
+    """Represent a table in a database."""
+
+    __metaclass__ = _TableSingleton
+
+    __visit_name__ = 'table'
+
+    ddl_events = ('before-create', 'after-create', 'before-drop', 'after-drop')
+
+    def __init__(self, name, metadata, *args, **kwargs):
+        """
+        Construct a Table.
+
+        :param name: The name of this table as represented in the database. 
+
+            This property, along with the *schema*, indicates the *singleton
+            identity* of this table in relation to its parent :class:`MetaData`.
+            Additional calls to :class:`Table` with the same name, metadata,
+            and schema name will return the same :class:`Table` object.
+
+            Names which contain no upper case characters
+            will be treated as case insensitive names, and will not be quoted
+            unless they are a reserved word.  Names with any number of upper
+            case characters will be quoted and sent exactly.  Note that this
+            behavior applies even for databases which standardize upper 
+            case names as case insensitive such as Oracle.
+
+        :param metadata: a :class:`MetaData` object which will contain this 
+            table.  The metadata is used as a point of association of this table
+            with other tables which are referenced via foreign key.  It also
+            may be used to associate this table with a particular 
+            :class:`~sqlalchemy.engine.base.Connectable`.
+
+        :param \*args: Additional positional arguments are used primarily
+            to add the list of :class:`Column` objects contained within this table.
+            Similar to the style of a CREATE TABLE statement, other :class:`SchemaItem`
+            constructs may be added here, including :class:`PrimaryKeyConstraint`,
+            and :class:`ForeignKeyConstraint`.
+            
+        :param autoload: Defaults to False: the Columns for this table should be reflected
+            from the database.  Usually there will be no Column objects in the
+            constructor if this property is set.
+
+        :param autoload_with: If autoload==True, this is an optional Engine or Connection
+            instance to be used for the table reflection.  If ``None``, the
+            underlying MetaData's bound connectable will be used.
+
+        :param include_columns: A list of strings indicating a subset of columns to be loaded via
+            the ``autoload`` operation; table columns who aren't present in
+            this list will not be represented on the resulting ``Table``
+            object.  Defaults to ``None`` which indicates all columns should
+            be reflected.
+
+        :param info: A dictionary which defaults to ``{}``.  A space to store application 
+            specific data. This must be a dictionary.
+
+        :param mustexist: When ``True``, indicates that this Table must already 
+            be present in the given :class:`MetaData`` collection.
+
+        :param prefixes:
+            A list of strings to insert after CREATE in the CREATE TABLE
+            statement.  They will be separated by spaces.
+
+        :param quote: Force quoting of this table's name on or off, corresponding
+            to ``True`` or ``False``.  When left at its default of ``None``,
+            the column identifier will be quoted according to whether the name is
+            case sensitive (identifiers with at least one upper case character are 
+            treated as case sensitive), or if it's a reserved word.  This flag 
+            is only needed to force quoting of a reserved word which is not known
+            by the SQLAlchemy dialect.
+
+        :param quote_schema: same as 'quote' but applies to the schema identifier.
+
+        :param schema: The *schema name* for this table, which is required if the table
+            resides in a schema other than the default selected schema for the
+            engine's database connection.  Defaults to ``None``.
+
+        :param useexisting: When ``True``, indicates that if this Table is already
+            present in the given :class:`MetaData`, apply further arguments within
+            the constructor to the existing :class:`Table`.  If this flag is not 
+            set, an error is raised when the parameters of an existing :class:`Table`
+            are overwritten.
+
+        """
+        super(Table, self).__init__(name)
+        self.metadata = metadata
+        self.schema = kwargs.pop('schema', kwargs.pop('owner', None))
+        self.indexes = set()
+        self.constraints = set()
+        self._columns = expression.ColumnCollection()
+        self.primary_key = PrimaryKeyConstraint()
+        self._foreign_keys = util.OrderedSet()
+        self.ddl_listeners = util.defaultdict(list)
+        self.kwargs = {}
+        if self.schema is not None:
+            self.fullname = "%s.%s" % (self.schema, self.name)
+        else:
+            self.fullname = self.name
+
+        autoload = kwargs.pop('autoload', False)
+        autoload_with = kwargs.pop('autoload_with', None)
+        include_columns = kwargs.pop('include_columns', None)
+
+        self._set_parent(metadata)
+
+        self.quote = kwargs.pop('quote', None)
+        self.quote_schema = kwargs.pop('quote_schema', None)
+        if 'info' in kwargs:
+            self.info = kwargs.pop('info')
+
+        self._prefixes = kwargs.pop('prefixes', [])
+
+        self.__extra_kwargs(**kwargs)
+
+        # load column definitions from the database if 'autoload' is defined
+        # we do it after the table is in the singleton dictionary to support
+        # circular foreign keys
+        if autoload:
+            if autoload_with:
+                autoload_with.reflecttable(self, include_columns=include_columns)
+            else:
+                _bind_or_error(metadata).reflecttable(self, include_columns=include_columns)
+
+        # initialize all the column, etc. objects.  done after reflection to
+        # allow user-overrides
+        self.__post_init(*args, **kwargs)
+
+    def _init_existing(self, *args, **kwargs):
+        autoload = kwargs.pop('autoload', False)
+        autoload_with = kwargs.pop('autoload_with', None)
+        schema = kwargs.pop('schema', None)
+        if schema and schema != self.schema:
+            raise exc.ArgumentError(
+                "Can't change schema of existing table from '%s' to '%s'",
+                (self.schema, schema))
+
+        include_columns = kwargs.pop('include_columns', None)
+        if include_columns:
+            for c in self.c:
+                if c.name not in include_columns:
+                    self.c.remove(c)
+
+        for key in ('quote', 'quote_schema'):
+            if key in kwargs:
+                setattr(self, key, kwargs.pop(key))
+
+        if 'info' in kwargs:
+            self.info = kwargs.pop('info')
+
+        self.__extra_kwargs(**kwargs)
+        self.__post_init(*args, **kwargs)
+
+    def _cant_override(self, *args, **kwargs):
+        """Return True if any argument is not supported as an override.
+
+        Takes arguments that would be sent to Table.__init__, and returns
+        True if any of them would be disallowed if sent to an existing
+        Table singleton.
+        """
+        return bool(args) or bool(set(kwargs).difference(
+            ['autoload', 'autoload_with', 'schema', 'owner']))
+
+    def __extra_kwargs(self, **kwargs):
+        # validate remaining kwargs that they all specify DB prefixes
+        if len([k for k in kwargs
+                if not re.match(r'^(?:%s)_' % '|'.join(databases.__all__), k)]):
+            raise TypeError(
+                "Invalid argument(s) for Table: %s" % repr(kwargs.keys()))
+        self.kwargs.update(kwargs)
+
+    def __post_init(self, *args, **kwargs):
+        self._init_items(*args)
+
+    @property
+    def key(self):
+        return _get_table_key(self.name, self.schema)
+
+    def _set_primary_key(self, pk):
+        if getattr(self, '_primary_key', None) in self.constraints:
+            self.constraints.remove(self._primary_key)
+        self._primary_key = pk
+        self.constraints.add(pk)
+
+    def primary_key(self):
+        return self._primary_key
+    primary_key = property(primary_key, _set_primary_key)
+
+    def __repr__(self):
+        return "Table(%s)" % ', '.join(
+            [repr(self.name)] + [repr(self.metadata)] +
+            [repr(x) for x in self.columns] +
+            ["%s=%s" % (k, repr(getattr(self, k))) for k in ['schema']])
+
+    def __str__(self):
+        return _get_table_key(self.description, self.schema)
+
+    def append_column(self, column):
+        """Append a ``Column`` to this ``Table``."""
+
+        column._set_parent(self)
+
+    def append_constraint(self, constraint):
+        """Append a ``Constraint`` to this ``Table``."""
+
+        constraint._set_parent(self)
+
+    def append_ddl_listener(self, event, listener):
+        """Append a DDL event listener to this ``Table``.
+
+        The ``listener`` callable will be triggered when this ``Table`` is
+        created or dropped, either directly before or after the DDL is issued
+        to the database.  The listener may modify the Table, but may not abort
+        the event itself.
+
+        Arguments are:
+
+        event
+          One of ``Table.ddl_events``; e.g. 'before-create', 'after-create',
+          'before-drop' or 'after-drop'.
+
+        listener
+          A callable, invoked with three positional arguments:
+
+          event
+            The event currently being handled
+          schema_item
+            The ``Table`` object being created or dropped
+          bind
+            The ``Connection`` bueing used for DDL execution.
+
+        Listeners are added to the Table's ``ddl_listeners`` attribute.
+        """
+
+        if event not in self.ddl_events:
+            raise LookupError(event)
+        self.ddl_listeners[event].append(listener)
+
+    def _set_parent(self, metadata):
+        metadata.tables[_get_table_key(self.name, self.schema)] = self
+        self.metadata = metadata
+
+    def get_children(self, column_collections=True, schema_visitor=False, **kwargs):
+        if not schema_visitor:
+            return expression.TableClause.get_children(
+                self, column_collections=column_collections, **kwargs)
+        else:
+            if column_collections:
+                return [c for c in self.columns]
+            else:
+                return []
+
+    def exists(self, bind=None):
+        """Return True if this table exists."""
+
+        if bind is None:
+            bind = _bind_or_error(self)
+
+        def do(conn):
+            return conn.dialect.has_table(conn, self.name, schema=self.schema)
+        return bind.run_callable(do)
+
+    def create(self, bind=None, checkfirst=False):
+        """Issue a ``CREATE`` statement for this table.
+
+        See also ``metadata.create_all()``.
+        """
+        self.metadata.create_all(bind=bind, checkfirst=checkfirst, tables=[self])
+
+    def drop(self, bind=None, checkfirst=False):
+        """Issue a ``DROP`` statement for this table.
+
+        See also ``metadata.drop_all()``.
+        """
+        self.metadata.drop_all(bind=bind, checkfirst=checkfirst, tables=[self])
+
+    def tometadata(self, metadata, schema=None):
+        """Return a copy of this ``Table`` associated with a different ``MetaData``."""
+
+        try:
+            if not schema:
+                schema = self.schema
+            key = _get_table_key(self.name, schema)
+            return metadata.tables[key]
+        except KeyError:
+            args = []
+            for c in self.columns:
+                args.append(c.copy(schema=schema))
+            for c in self.constraints:
+                args.append(c.copy(schema=schema))
+            return Table(self.name, metadata, schema=schema, *args)
+
+class Column(SchemaItem, expression.ColumnClause):
+    """Represents a column in a database table."""
+
+    __visit_name__ = 'column'
+
+    def __init__(self, *args, **kwargs):
+        """
+        Construct a new ``Column`` object.
+        
+        :param name: The name of this column as represented in the database. 
+          This argument may be the first positional argument, or specified
+          via keyword.
+          
+          Names which contain no upper case characters
+          will be treated as case insensitive names, and will not be quoted
+          unless they are a reserved word.  Names with any number of upper
+          case characters will be quoted and sent exactly.  Note that this
+          behavior applies even for databases which standardize upper 
+          case names as case insensitive such as Oracle.
+          
+          The name field may be omitted at construction time and applied
+          later, at any time before the Column is associated with a 
+          :class:`Table`.  This is to support convenient
+          usage within the :mod:`~sqlalchemy.ext.declarative` extension.
+          
+        :param type\_: The column's type, indicated using an instance which 
+          subclasses :class:`~sqlalchemy.types.AbstractType`.  If no arguments
+          are required for the type, the class of the type can be sent
+          as well, e.g.::
+          
+            # use a type with arguments
+            Column('data', String(50))
+            
+            # use no arguments
+            Column('level', Integer)
+            
+          The ``type`` argument may be the second positional argument
+          or specified by keyword.
+
+          If this column also contains a :class:`ForeignKey`,
+          the type argument may be left as ``None`` in which case the
+          type assigned will be that of the referenced column.
+
+        :param \*args: Additional positional arguments include various 
+          :class:`SchemaItem` derived constructs which will be applied 
+          as options to the column.  These include instances of 
+          :class:`Constraint`, :class:`ForeignKey`, :class:`ColumnDefault`, 
+          and :class:`Sequence`.  In some cases an equivalent keyword 
+          argument is available such as ``server_default``, ``default``
+          and ``unique``.
+
+        :param autoincrement: This flag may be set to ``False`` to disable
+          SQLAlchemy indicating at the DDL level that an integer primary 
+          key column should have autoincrementing behavior.  This 
+          is an oft misunderstood flag and has no effect whatsoever unless
+          all of the following conditions are met:
+            
+          * The column is of the :class:`~sqlalchemy.types.Integer` datatype.
+          * The column has the ``primary_key`` flag set, or is otherwise
+            a member of a :class:`PrimaryKeyConstraint` on this table.
+          * a CREATE TABLE statement is being issued via :meth:`create()`
+            or :meth:`create_all()`.  The flag has no relevance at any
+            other time.
+          * The database supports autoincrementing behavior, such as 
+            PostgreSQL or MySQL, and this behavior can be disabled (which does
+            not include SQLite).
+
+        :param default: A scalar, Python callable, or :class:`~sqlalchemy.sql.expression.ClauseElement`
+          representing the *default value* for this column, which will be
+          invoked upon insert if this column is otherwise not specified
+          in the VALUES clause of the insert.  This is a shortcut
+          to using :class:`ColumnDefault` as a positional argument.
+          
+          Contrast this argument to ``server_default`` which creates a 
+          default generator on the database side.
+
+        :param key: An optional string identifier which will identify this ``Column`` 
+            object on the :class:`Table`.  When a key is provided, this is the
+            only identifier referencing the ``Column`` within the application,
+            including ORM attribute mapping; the ``name`` field is used only
+            when rendering SQL.
+
+        :param index: When ``True``, indicates that the column is indexed.
+          This is a shortcut for using a :class:`Index` construct on the table.
+          To specify indexes with explicit names or indexes that contain multiple 
+          columns, use the :class:`Index` construct instead.
+
+        :param info: A dictionary which defaults to ``{}``.  A space to store application 
+          specific data. This must be a dictionary.
+
+        :param nullable: If set to the default of ``True``, indicates the column
+            will be rendered as allowing NULL, else it's rendered as NOT NULL.
+            This parameter is only used when issuing CREATE TABLE statements.
+
+        :param onupdate: A scalar, Python callable, or :class:`~sqlalchemy.sql.expression.ClauseElement`
+            representing a default value to be applied to the column within UPDATE
+            statements, which wil be invoked upon update if this column is not present
+            in the SET clause of the update.  This is a shortcut to using 
+            :class:`ColumnDefault` as a positional argument with ``for_update=True``.
+            
+        :param primary_key: If ``True``, marks this column as a primary key
+            column.  Multiple columns can have this flag set to specify composite
+            primary keys.  As an alternative, the primary key of a :class:`Table` can
+            be specified via an explicit :class:`PrimaryKeyConstraint` object.
+
+        :param server_default: A :class:`FetchedValue` instance, str, Unicode or
+          :func:`~sqlalchemy.sql.expression.text` construct representing 
+          the DDL DEFAULT value for the column.
+
+          String types will be emitted as-is, surrounded by single quotes::
+
+              Column('x', Text, server_default="val")
+
+              x TEXT DEFAULT 'val'
+
+          A :func:`~sqlalchemy.sql.expression.text` expression will be 
+          rendered as-is, without quotes::
+
+              Column('y', DateTime, server_default=text('NOW()'))0
+
+              y DATETIME DEFAULT NOW()
+
+          Strings and text() will be converted into a :class:`DefaultClause`
+          object upon initialization.
+          
+          Use :class:`FetchedValue` to indicate that an already-existing column will generate
+          a default value on the database side which will be available to SQLAlchemy 
+          for post-fetch after inserts.  
+          This construct does not specify any DDL and the implementation is 
+          left to the database, such as via a trigger.
+
+        :param server_onupdate:   A :class:`FetchedValue` instance representing 
+            a database-side default generation function.  This indicates to 
+            SQLAlchemy that a newly generated value will be available after updates.
+            This construct does not specify any DDL and the implementation is 
+            left to the database, such as via a trigger.
+
+        :param quote: Force quoting of this column's name on or off, corresponding
+           to ``True`` or ``False``.  When left at its default of ``None``,
+           the column identifier will be quoted according to whether the name is
+           case sensitive (identifiers with at least one upper case character are 
+           treated as case sensitive), or if it's a reserved word.  This flag 
+           is only needed to force quoting of a reserved word which is not known
+           by the SQLAlchemy dialect.
+
+        :param unique: When ``True``, indicates that this column contains a unique
+            constraint, or if ``index`` is ``True`` as well, indicates that the
+            :class:`Index` should be created with the unique flag.  To specify multiple
+            columns in the constraint/index or to specify an explicit name,
+            use the :class:`UniqueConstraint` or :class:`Index` constructs explicitly.
+
+        """
+
+        name = kwargs.pop('name', None)
+        type_ = kwargs.pop('type_', None)
+        if args:
+            args = list(args)
+            if isinstance(args[0], basestring):
+                if name is not None:
+                    raise exc.ArgumentError(
+                        "May not pass name positionally and as a keyword.")
+                name = args.pop(0)
+        if args:
+            coltype = args[0]
+            
+            # adjust for partials
+            if util.callable(coltype):
+                coltype = args[0]()
+
+            if (isinstance(coltype, types.AbstractType) or
+                (isinstance(coltype, type) and
+                 issubclass(coltype, types.AbstractType))):
+                if type_ is not None:
+                    raise exc.ArgumentError(
+                        "May not pass type_ positionally and as a keyword.")
+                type_ = args.pop(0)
+
+        super(Column, self).__init__(name, None, type_)
+        self.args = args
+        self.key = kwargs.pop('key', name)
+        self.primary_key = kwargs.pop('primary_key', False)
+        self.nullable = kwargs.pop('nullable', not self.primary_key)
+        self.default = kwargs.pop('default', None)
+        self.server_default = kwargs.pop('server_default', None)
+        self.server_onupdate = kwargs.pop('server_onupdate', None)
+        self.index = kwargs.pop('index', None)
+        self.unique = kwargs.pop('unique', None)
+        self.quote = kwargs.pop('quote', None)
+        self.onupdate = kwargs.pop('onupdate', None)
+        self.autoincrement = kwargs.pop('autoincrement', True)
+        self.constraints = set()
+        self.foreign_keys = util.OrderedSet()
+        util.set_creation_order(self)
+
+        if 'info' in kwargs:
+            self.info = kwargs.pop('info')
+            
+        if kwargs:
+            raise exc.ArgumentError(
+                "Unknown arguments passed to Column: " + repr(kwargs.keys()))
+
+    def __str__(self):
+        if self.name is None:
+            return "(no name)"
+        elif self.table is not None:
+            if self.table.named_with_column:
+                return (self.table.description + "." + self.description)
+            else:
+                return self.description
+        else:
+            return self.description
+
+    @property
+    def bind(self):
+        return self.table.bind
+
+    def references(self, column):
+        """Return True if this Column references the given column via foreign key."""
+        for fk in self.foreign_keys:
+            if fk.references(column.table):
+                return True
+        else:
+            return False
+
+    def append_foreign_key(self, fk):
+        fk._set_parent(self)
+
+    def __repr__(self):
+        kwarg = []
+        if self.key != self.name:
+            kwarg.append('key')
+        if self.primary_key:
+            kwarg.append('primary_key')
+        if not self.nullable:
+            kwarg.append('nullable')
+        if self.onupdate:
+            kwarg.append('onupdate')
+        if self.default:
+            kwarg.append('default')
+        if self.server_default:
+            kwarg.append('server_default')
+        return "Column(%s)" % ', '.join(
+            [repr(self.name)] + [repr(self.type)] +
+            [repr(x) for x in self.foreign_keys if x is not None] +
+            [repr(x) for x in self.constraints] +
+            [(self.table and "table=<%s>" % self.table.description or "")] +
+            ["%s=%s" % (k, repr(getattr(self, k))) for k in kwarg])
+
+    def _set_parent(self, table):
+        if self.name is None:
+            raise exc.ArgumentError(
+                "Column must be constructed with a name or assign .name "
+                "before adding to a Table.")
+        if self.key is None:
+            self.key = self.name
+        self.metadata = table.metadata
+        if getattr(self, 'table', None) is not None:
+            raise exc.ArgumentError("this Column already has a table!")
+
+        if self.key in table._columns:
+            # note the column being replaced, if any
+            self._pre_existing_column = table._columns.get(self.key)
+        table._columns.replace(self)
+
+        if self.primary_key:
+            table.primary_key.replace(self)
+        elif self.key in table.primary_key:
+            raise exc.ArgumentError(
+                "Trying to redefine primary-key column '%s' as a "
+                "non-primary-key column on table '%s'" % (
+                self.key, table.fullname))
+            # if we think this should not raise an error, we'd instead do this:
+            #table.primary_key.remove(self)
+        self.table = table
+
+        if self.index:
+            if isinstance(self.index, basestring):
+                raise exc.ArgumentError(
+                    "The 'index' keyword argument on Column is boolean only. "
+                    "To create indexes with a specific name, create an "
+                    "explicit Index object external to the Table.")
+            Index('ix_%s' % self._label, self, unique=self.unique)
+        elif self.unique:
+            if isinstance(self.unique, basestring):
+                raise exc.ArgumentError(
+                    "The 'unique' keyword argument on Column is boolean only. "
+                    "To create unique constraints or indexes with a specific "
+                    "name, append an explicit UniqueConstraint to the Table's "
+                    "list of elements, or create an explicit Index object "
+                    "external to the Table.")
+            table.append_constraint(UniqueConstraint(self.key))
+
+        toinit = list(self.args)
+        if self.default is not None:
+            if isinstance(self.default, ColumnDefault):
+                toinit.append(self.default)
+            else:
+                toinit.append(ColumnDefault(self.default))
+        if self.server_default is not None:
+            if isinstance(self.server_default, FetchedValue):
+                toinit.append(self.server_default)
+            else:
+                toinit.append(DefaultClause(self.server_default))
+        if self.onupdate is not None:
+            toinit.append(ColumnDefault(self.onupdate, for_update=True))
+        if self.server_onupdate is not None:
+            if isinstance(self.server_onupdate, FetchedValue):
+                toinit.append(self.server_default)
+            else:
+                toinit.append(DefaultClause(self.server_onupdate,
+                                            for_update=True))
+        self._init_items(*toinit)
+        self.args = None
+
+    def copy(self, **kw):
+        """Create a copy of this ``Column``, unitialized.
+
+        This is used in ``Table.tometadata``.
+
+        """
+        return Column(
+                self.name, 
+                self.type, 
+                self.default, 
+                key = self.key, 
+                primary_key = self.primary_key, 
+                nullable = self.nullable, 
+                quote=self.quote, 
+                index=self.index, 
+                autoincrement=self.autoincrement, 
+                default=self.default,
+                server_default=self.server_default,
+                onupdate=self.onupdate,
+                server_onupdate=self.server_onupdate,
+                *[c.copy(**kw) for c in self.constraints])
+
+    def _make_proxy(self, selectable, name=None):
+        """Create a *proxy* for this column.
+
+        This is a copy of this ``Column`` referenced by a different parent
+        (such as an alias or select statement).
+
+        """
+        fk = [ForeignKey(f.column) for f in self.foreign_keys]
+        c = Column(
+            name or self.name, 
+            self.type, 
+            self.default, 
+            key = name or self.key, 
+            primary_key = self.primary_key, 
+            nullable = self.nullable, 
+            quote=self.quote, *fk)
+        c.table = selectable
+        c.proxies = [self]
+        selectable.columns.add(c)
+        if self.primary_key:
+            selectable.primary_key.add(c)
+        [c._init_items(f) for f in fk]
+        return c
+
+    def get_children(self, schema_visitor=False, **kwargs):
+        if schema_visitor:
+            return [x for x in (self.default, self.onupdate) if x is not None] + \
+                list(self.foreign_keys) + list(self.constraints)
+        else:
+            return expression.ColumnClause.get_children(self, **kwargs)
+
+
+class ForeignKey(SchemaItem):
+    """Defines a column-level FOREIGN KEY constraint between two columns.
+
+    ``ForeignKey`` is specified as an argument to a :class:`Column` object, e.g.::
+    
+        t = Table("remote_table", metadata, 
+            Column("remote_id", ForeignKey("main_table.id"))
+        )
+
+    For a composite (multiple column) FOREIGN KEY, use a :class:`ForeignKeyConstraint`
+    object specified at the level of the :class:`Table`.
+    
+    Further examples of foreign key configuration are in :ref:`metadata_foreignkeys`.
+
+    """
+
+    __visit_name__ = 'foreign_key'
+
+    def __init__(self, column, constraint=None, use_alter=False, name=None, onupdate=None, ondelete=None, deferrable=None, initially=None, link_to_name=False):
+        """
+        Construct a column-level FOREIGN KEY.
+
+        :param column: A single target column for the key relationship.  A :class:`Column`
+          object or a column name as a string: ``tablename.columnkey`` or
+          ``schema.tablename.columnkey``.  ``columnkey`` is the ``key`` which has been assigned
+          to the column (defaults to the column name itself), unless ``link_to_name`` is ``True``
+          in which case the rendered name of the column is used.
+
+        :param constraint: Optional.  A parent :class:`ForeignKeyConstraint` object.  If not
+          supplied, a :class:`ForeignKeyConstraint` will be automatically created
+          and added to the parent table.
+
+        :param name: Optional string.  An in-database name for the key if `constraint` is
+          not provided.
+
+        :param onupdate: Optional string.  If set, emit ON UPDATE <value> when issuing DDL
+          for this constraint.  Typical values include CASCADE, DELETE and
+          RESTRICT.
+
+        :param ondelete: Optional string.  If set, emit ON DELETE <value> when issuing DDL
+          for this constraint.  Typical values include CASCADE, DELETE and
+          RESTRICT.
+
+        :param deferrable: Optional bool.  If set, emit DEFERRABLE or NOT DEFERRABLE when
+          issuing DDL for this constraint.
+
+        :param initially: Optional string.  If set, emit INITIALLY <value> when issuing DDL
+          for this constraint.
+        
+        :param link_to_name: if True, the string name given in ``column`` is the rendered
+          name of the referenced column, not its locally assigned ``key``.
+          
+        :param use_alter: If True, do not emit this key as part of the CREATE TABLE
+          definition.  Instead, use ALTER TABLE after table creation to add
+          the key.  Useful for circular dependencies.
+          
+        """
+
+        self._colspec = column
+        self.constraint = constraint
+        self.use_alter = use_alter
+        self.name = name
+        self.onupdate = onupdate
+        self.ondelete = ondelete
+        self.deferrable = deferrable
+        self.initially = initially
+        self.link_to_name = link_to_name
+
+    def __repr__(self):
+        return "ForeignKey(%r)" % self._get_colspec()
+
+    def copy(self, schema=None):
+        """Produce a copy of this ForeignKey object."""
+
+        return ForeignKey(self._get_colspec(schema=schema))
+
+    def _get_colspec(self, schema=None):
+        if schema:
+            return schema + "." + self.column.table.name + "." + self.column.key
+        elif isinstance(self._colspec, basestring):
+            return self._colspec
+        elif hasattr(self._colspec, '__clause_element__'):
+            _column = self._colspec.__clause_element__()
+        else:
+            _column = self._colspec
+            
+        return "%s.%s" % (_column.table.fullname, _column.key)
+
+    target_fullname = property(_get_colspec)
+
+    def references(self, table):
+        """Return True if the given table is referenced by this ForeignKey."""
+        return table.corresponding_column(self.column) is not None
+
+    def get_referent(self, table):
+        """Return the column in the given table referenced by this ForeignKey.
+
+        Returns None if this ``ForeignKey`` does not reference the given table.
+
+        """
+
+        return table.corresponding_column(self.column)
+
+    @util.memoized_property
+    def column(self):
+        # ForeignKey inits its remote column as late as possible, so tables
+        # can be defined without dependencies
+        if isinstance(self._colspec, basestring):
+            # locate the parent table this foreign key is attached to.  we
+            # use the "original" column which our parent column represents
+            # (its a list of columns/other ColumnElements if the parent
+            # table is a UNION)
+            for c in self.parent.base_columns:
+                if isinstance(c, Column):
+                    parenttable = c.table
+                    break
+            else:
+                raise exc.ArgumentError(
+                    "Parent column '%s' does not descend from a "
+                    "table-attached Column" % str(self.parent))
+
+            m = self._colspec.split('.')
+
+            if m is None:
+                raise exc.ArgumentError(
+                    "Invalid foreign key column specification: %s" %
+                    self._colspec)
+
+            # A FK between column 'bar' and table 'foo' can be
+            # specified as 'foo', 'foo.bar', 'dbo.foo.bar',
+            # 'otherdb.dbo.foo.bar'. Once we have the column name and
+            # the table name, treat everything else as the schema
+            # name. Some databases (e.g. Sybase) support
+            # inter-database foreign keys. See tickets#1341 and --
+            # indirectly related -- Ticket #594. This assumes that '.'
+            # will never appear *within* any component of the FK.
+
+            (schema, tname, colname) = (None, None, None)
+            if (len(m) == 1):
+                tname   = m.pop()
+            else:
+                colname = m.pop()
+                tname   = m.pop()
+
+            if (len(m) > 0):
+                schema = '.'.join(m)
+
+            if _get_table_key(tname, schema) not in parenttable.metadata:
+                raise exc.NoReferencedTableError(
+                    "Could not find table '%s' with which to generate a "
+                    "foreign key" % tname)
+            table = Table(tname, parenttable.metadata,
+                          mustexist=True, schema=schema)
+                          
+            _column = None
+            if colname is None:
+                # colname is None in the case that ForeignKey argument
+                # was specified as table name only, in which case we
+                # match the column name to the same column on the
+                # parent.
+                key = self.parent
+                _column = table.c.get(self.parent.key, None)
+            elif self.link_to_name:
+                key = colname
+                for c in table.c:
+                    if c.name == colname:
+                        _column = c
+            else:
+                key = colname
+                _column = table.c.get(colname, None)
+
+            if not _column:
+                raise exc.NoReferencedColumnError(
+                    "Could not create ForeignKey '%s' on table '%s': "
+                    "table '%s' has no column named '%s'" % (
+                    self._colspec, parenttable.name, table.name, key))
+
+        elif hasattr(self._colspec, '__clause_element__'):
+            _column = self._colspec.__clause_element__()
+        else:
+            _column = self._colspec
+
+        # propagate TypeEngine to parent if it didn't have one
+        if isinstance(self.parent.type, types.NullType):
+            self.parent.type = _column.type
+        return _column
+
+    def _set_parent(self, column):
+        if hasattr(self, 'parent'):
+            raise exc.InvalidRequestError("This ForeignKey already has a parent !")
+        self.parent = column
+
+        if hasattr(self.parent, '_pre_existing_column'):
+            # remove existing FK which matches us
+            for fk in self.parent._pre_existing_column.foreign_keys:
+                if fk.target_fullname == self.target_fullname:
+                    self.parent.table.foreign_keys.remove(fk)
+                    self.parent.table.constraints.remove(fk.constraint)
+
+        if self.constraint is None and isinstance(self.parent.table, Table):
+            self.constraint = ForeignKeyConstraint(
+                [], [], use_alter=self.use_alter, name=self.name,
+                onupdate=self.onupdate, ondelete=self.ondelete,
+                deferrable=self.deferrable, initially=self.initially)
+            self.parent.table.append_constraint(self.constraint)
+            self.constraint._append_fk(self)
+
+        self.parent.foreign_keys.add(self)
+        self.parent.table.foreign_keys.add(self)
+
+class DefaultGenerator(SchemaItem):
+    """Base class for column *default* values."""
+
+    __visit_name__ = 'default_generator'
+
+    def __init__(self, for_update=False, metadata=None):
+        self.for_update = for_update
+        self.metadata = util.assert_arg_type(metadata, (MetaData, type(None)), 'metadata')
+
+    def _set_parent(self, column):
+        self.column = column
+        self.metadata = self.column.table.metadata
+        if self.for_update:
+            self.column.onupdate = self
+        else:
+            self.column.default = self
+
+    def execute(self, bind=None, **kwargs):
+        if bind is None:
+            bind = _bind_or_error(self)
+        return bind._execute_default(self, **kwargs)
+
+    def __repr__(self):
+        return "DefaultGenerator()"
+
+
+class ColumnDefault(DefaultGenerator):
+    """A plain default value on a column.
+
+    This could correspond to a constant, a callable function, or a SQL clause.
+    """
+
+    def __init__(self, arg, **kwargs):
+        super(ColumnDefault, self).__init__(**kwargs)
+        if isinstance(arg, FetchedValue):
+            raise exc.ArgumentError(
+                "ColumnDefault may not be a server-side default type.")
+        if util.callable(arg):
+            arg = self._maybe_wrap_callable(arg)
+        self.arg = arg
+
+    def _maybe_wrap_callable(self, fn):
+        """Backward compat: Wrap callables that don't accept a context."""
+
+        if inspect.isfunction(fn):
+            inspectable = fn
+        elif inspect.isclass(fn):
+            inspectable = fn.__init__
+        elif hasattr(fn, '__call__'):
+            inspectable = fn.__call__
+        else:
+            # probably not inspectable, try anyways.
+            inspectable = fn
+        try:
+            argspec = inspect.getargspec(inspectable)
+        except TypeError:
+            return lambda ctx: fn()
+
+        positionals = len(argspec[0])
+        if inspect.ismethod(inspectable):
+            positionals -= 1
+
+        if positionals == 0:
+            return lambda ctx: fn()
+
+        defaulted = argspec[3] is not None and len(argspec[3]) or 0
+        if positionals - defaulted > 1:
+            raise exc.ArgumentError(
+                "ColumnDefault Python function takes zero or one "
+                "positional arguments")
+        return fn
+
+    def _visit_name(self):
+        if self.for_update:
+            return "column_onupdate"
+        else:
+            return "column_default"
+    __visit_name__ = property(_visit_name)
+
+    def __repr__(self):
+        return "ColumnDefault(%s)" % repr(self.arg)
+
+class Sequence(DefaultGenerator):
+    """Represents a named database sequence."""
+
+    __visit_name__ = 'sequence'
+
+    def __init__(self, name, start=None, increment=None, schema=None,
+                 optional=False, quote=None, **kwargs):
+        super(Sequence, self).__init__(**kwargs)
+        self.name = name
+        self.start = start
+        self.increment = increment
+        self.optional = optional
+        self.quote = quote
+        self.schema = schema
+        self.kwargs = kwargs
+
+    def __repr__(self):
+        return "Sequence(%s)" % ', '.join(
+            [repr(self.name)] +
+            ["%s=%s" % (k, repr(getattr(self, k)))
+             for k in ['start', 'increment', 'optional']])
+
+    def _set_parent(self, column):
+        super(Sequence, self)._set_parent(column)
+        column.sequence = self
+
+    def create(self, bind=None, checkfirst=True):
+        """Creates this sequence in the database."""
+
+        if bind is None:
+            bind = _bind_or_error(self)
+        bind.create(self, checkfirst=checkfirst)
+
+    def drop(self, bind=None, checkfirst=True):
+        """Drops this sequence from the database."""
+
+        if bind is None:
+            bind = _bind_or_error(self)
+        bind.drop(self, checkfirst=checkfirst)
+
+
+class FetchedValue(object):
+    """A default that takes effect on the database side."""
+
+    def __init__(self, for_update=False):
+        self.for_update = for_update
+
+    def _set_parent(self, column):
+        self.column = column
+        if self.for_update:
+            self.column.server_onupdate = self
+        else:
+            self.column.server_default = self
+
+    def __repr__(self):
+        return 'FetchedValue(for_update=%r)' % self.for_update
+
+
+class DefaultClause(FetchedValue):
+    """A DDL-specified DEFAULT column value."""
+
+    def __init__(self, arg, for_update=False):
+        util.assert_arg_type(arg, (basestring,
+                                   expression.ClauseElement,
+                                   expression._TextClause), 'arg')
+        super(DefaultClause, self).__init__(for_update)
+        self.arg = arg
+
+    def __repr__(self):
+        return "DefaultClause(%r, for_update=%r)" % (self.arg, self.for_update)
+
+# alias; deprecated starting 0.5.0
+PassiveDefault = DefaultClause
+
+
+class Constraint(SchemaItem):
+    """A table-level SQL constraint, such as a KEY.
+
+    Implements a hybrid of dict/setlike behavior with regards to the list of
+    underying columns.
+    """
+
+    __visit_name__ = 'constraint'
+
+    def __init__(self, name=None, deferrable=None, initially=None):
+        """Create a SQL constraint.
+
+        name
+          Optional, the in-database name of this ``Constraint``.
+
+        deferrable
+          Optional bool.  If set, emit DEFERRABLE or NOT DEFERRABLE when
+          issuing DDL for this constraint.
+
+        initially
+          Optional string.  If set, emit INITIALLY <value> when issuing DDL
+          for this constraint.
+        """
+
+        self.name = name
+        self.columns = expression.ColumnCollection()
+        self.deferrable = deferrable
+        self.initially = initially
+
+    def __contains__(self, x):
+        return x in self.columns
+
+    def contains_column(self, col):
+        return self.columns.contains_column(col)
+
+    def keys(self):
+        return self.columns.keys()
+
+    def __add__(self, other):
+        return self.columns + other
+
+    def __iter__(self):
+        return iter(self.columns)
+
+    def __len__(self):
+        return len(self.columns)
+
+    def copy(self, **kw):
+        raise NotImplementedError()
+
+class CheckConstraint(Constraint):
+    """A table- or column-level CHECK constraint.
+
+    Can be included in the definition of a Table or Column.
+    """
+
+    def __init__(self, sqltext, name=None, deferrable=None, initially=None):
+        """Construct a CHECK constraint.
+
+        sqltext
+          A string containing the constraint definition.  Will be used
+          verbatim.
+
+        name
+          Optional, the in-database name of the constraint.
+
+        deferrable
+          Optional bool.  If set, emit DEFERRABLE or NOT DEFERRABLE when
+          issuing DDL for this constraint.
+
+        initially
+          Optional string.  If set, emit INITIALLY <value> when issuing DDL
+          for this constraint.
+        """
+
+        super(CheckConstraint, self).__init__(name, deferrable, initially)
+        if not isinstance(sqltext, basestring):
+            raise exc.ArgumentError(
+                "sqltext must be a string and will be used verbatim.")
+        self.sqltext = sqltext
+
+    def __visit_name__(self):
+        if isinstance(self.parent, Table):
+            return "check_constraint"
+        else:
+            return "column_check_constraint"
+    __visit_name__ = property(__visit_name__)
+
+    def _set_parent(self, parent):
+        self.parent = parent
+        parent.constraints.add(self)
+
+    def copy(self, **kw):
+        return CheckConstraint(self.sqltext, name=self.name)
+
+class ForeignKeyConstraint(Constraint):
+    """A table-level FOREIGN KEY constraint.
+
+    Defines a single column or composite FOREIGN KEY ... REFERENCES
+    constraint. For a no-frills, single column foreign key, adding a
+    :class:`ForeignKey` to the definition of a :class:`Column` is a shorthand equivalent
+    for an unnamed, single column :class:`ForeignKeyConstraint`.
+    
+    Examples of foreign key configuration are in :ref:`metadata_foreignkeys`.
+    
+    """
+    __visit_name__ = 'foreign_key_constraint'
+
+    def __init__(self, columns, refcolumns, name=None, onupdate=None, ondelete=None, use_alter=False, deferrable=None, initially=None, link_to_name=False):
+        """Construct a composite-capable FOREIGN KEY.
+
+        :param columns: A sequence of local column names.  The named columns must be defined
+          and present in the parent Table.  The names should match the ``key`` given 
+          to each column (defaults to the name) unless ``link_to_name`` is True.
+
+        :param refcolumns: A sequence of foreign column names or Column objects.  The columns
+          must all be located within the same Table.
+
+        :param name: Optional, the in-database name of the key.
+
+        :param onupdate: Optional string.  If set, emit ON UPDATE <value> when issuing DDL
+          for this constraint.  Typical values include CASCADE, DELETE and
+          RESTRICT.
+
+        :param ondelete: Optional string.  If set, emit ON DELETE <value> when issuing DDL
+          for this constraint.  Typical values include CASCADE, DELETE and
+          RESTRICT.
+
+        :param deferrable: Optional bool.  If set, emit DEFERRABLE or NOT DEFERRABLE when
+          issuing DDL for this constraint.
+
+        :param initially: Optional string.  If set, emit INITIALLY <value> when issuing DDL
+          for this constraint.
+
+        :param link_to_name: if True, the string name given in ``column`` is the rendered
+          name of the referenced column, not its locally assigned ``key``.
+
+        :param use_alter: If True, do not emit this key as part of the CREATE TABLE
+          definition.  Instead, use ALTER TABLE after table creation to add
+          the key.  Useful for circular dependencies.
+          
+        """
+        super(ForeignKeyConstraint, self).__init__(name, deferrable, initially)
+        self.__colnames = columns
+        self.__refcolnames = refcolumns
+        self.elements = util.OrderedSet()
+        self.onupdate = onupdate
+        self.ondelete = ondelete
+        self.link_to_name = link_to_name
+        if self.name is None and use_alter:
+            raise exc.ArgumentError("Alterable ForeignKey/ForeignKeyConstraint requires a name")
+        self.use_alter = use_alter
+
+    def _set_parent(self, table):
+        self.table = table
+        if self not in table.constraints:
+            table.constraints.add(self)
+            for (c, r) in zip(self.__colnames, self.__refcolnames):
+                self.append_element(c, r)
+
+    def append_element(self, col, refcol):
+        fk = ForeignKey(refcol, constraint=self, name=self.name, onupdate=self.onupdate, ondelete=self.ondelete, use_alter=self.use_alter, link_to_name=self.link_to_name)
+        fk._set_parent(self.table.c[col])
+        self._append_fk(fk)
+
+    def _append_fk(self, fk):
+        self.columns.add(self.table.c[fk.parent.key])
+        self.elements.add(fk)
+
+    def copy(self, **kw):
+        return ForeignKeyConstraint([x.parent.name for x in self.elements], [x._get_colspec(**kw) for x in self.elements], name=self.name, onupdate=self.onupdate, ondelete=self.ondelete, use_alter=self.use_alter)
+
+class PrimaryKeyConstraint(Constraint):
+    """A table-level PRIMARY KEY constraint.
+
+    Defines a single column or composite PRIMARY KEY constraint. For a
+    no-frills primary key, adding ``primary_key=True`` to one or more
+    ``Column`` definitions is a shorthand equivalent for an unnamed single- or
+    multiple-column PrimaryKeyConstraint.
+    """
+
+    __visit_name__ = 'primary_key_constraint'
+
+    def __init__(self, *columns, **kwargs):
+        """Construct a composite-capable PRIMARY KEY.
+
+        \*columns
+          A sequence of column names.  All columns named must be defined and
+          present within the parent Table.
+
+        name
+          Optional, the in-database name of the key.
+
+        deferrable
+          Optional bool.  If set, emit DEFERRABLE or NOT DEFERRABLE when
+          issuing DDL for this constraint.
+
+        initially
+          Optional string.  If set, emit INITIALLY <value> when issuing DDL
+          for this constraint.
+        """
+
+        constraint_args = dict(name=kwargs.pop('name', None),
+                               deferrable=kwargs.pop('deferrable', None),
+                               initially=kwargs.pop('initially', None))
+        if kwargs:
+            raise exc.ArgumentError(
+                'Unknown PrimaryKeyConstraint argument(s): %s' %
+                ', '.join(repr(x) for x in kwargs.keys()))
+
+        super(PrimaryKeyConstraint, self).__init__(**constraint_args)
+        self.__colnames = list(columns)
+
+    def _set_parent(self, table):
+        self.table = table
+        table.primary_key = self
+        for name in self.__colnames:
+            self.add(table.c[name])
+
+    def add(self, col):
+        self.columns.add(col)
+        col.primary_key = True
+    append_column = add
+
+    def replace(self, col):
+        self.columns.replace(col)
+
+    def remove(self, col):
+        col.primary_key = False
+        del self.columns[col.key]
+
+    def copy(self, **kw):
+        return PrimaryKeyConstraint(name=self.name, *[c.key for c in self])
+
+    __hash__ = Constraint.__hash__
+    
+    def __eq__(self, other):
+        return self.columns == other
+
+class UniqueConstraint(Constraint):
+    """A table-level UNIQUE constraint.
+
+    Defines a single column or composite UNIQUE constraint. For a no-frills,
+    single column constraint, adding ``unique=True`` to the ``Column``
+    definition is a shorthand equivalent for an unnamed, single column
+    UniqueConstraint.
+    """
+
+    __visit_name__ = 'unique_constraint'
+
+    def __init__(self, *columns, **kwargs):
+        """Construct a UNIQUE constraint.
+
+        \*columns
+          A sequence of column names.  All columns named must be defined and
+          present within the parent Table.
+
+        name
+          Optional, the in-database name of the key.
+
+        deferrable
+          Optional bool.  If set, emit DEFERRABLE or NOT DEFERRABLE when
+          issuing DDL for this constraint.
+
+        initially
+          Optional string.  If set, emit INITIALLY <value> when issuing DDL
+          for this constraint.
+        """
+
+        constraint_args = dict(name=kwargs.pop('name', None),
+                               deferrable=kwargs.pop('deferrable', None),
+                               initially=kwargs.pop('initially', None))
+        if kwargs:
+            raise exc.ArgumentError(
+                'Unknown UniqueConstraint argument(s): %s' %
+                ', '.join(repr(x) for x in kwargs.keys()))
+
+        super(UniqueConstraint, self).__init__(**constraint_args)
+        self.__colnames = list(columns)
+
+    def _set_parent(self, table):
+        self.table = table
+        table.constraints.add(self)
+        for c in self.__colnames:
+            self.append_column(table.c[c])
+
+    def append_column(self, col):
+        self.columns.add(col)
+
+    def copy(self, **kw):
+        return UniqueConstraint(name=self.name, *self.__colnames)
+
+class Index(SchemaItem):
+    """A table-level INDEX.
+
+    Defines a composite (one or more column) INDEX. For a no-frills, single
+    column index, adding ``index=True`` to the ``Column`` definition is
+    a shorthand equivalent for an unnamed, single column Index.
+    """
+
+    __visit_name__ = 'index'
+
+    def __init__(self, name, *columns, **kwargs):
+        """Construct an index object.
+
+        Arguments are:
+
+        name
+          The name of the index
+
+        \*columns
+          Columns to include in the index. All columns must belong to the same
+          table, and no column may appear more than once.
+
+        \**kwargs
+          Keyword arguments include:
+
+          unique
+            Defaults to False: create a unique index.
+
+          postgres_where
+            Defaults to None: create a partial index when using PostgreSQL
+        """
+
+        self.name = name
+        self.columns = []
+        self.table = None
+        self.unique = kwargs.pop('unique', False)
+        self.kwargs = kwargs
+
+        self._init_items(*columns)
+
+    def _init_items(self, *args):
+        for column in args:
+            self.append_column(_to_schema_column(column))
+
+    def _set_parent(self, table):
+        self.table = table
+        self.metadata = table.metadata
+        table.indexes.add(self)
+
+    def append_column(self, column):
+        # make sure all columns are from the same table
+        # and no column is repeated
+        if self.table is None:
+            self._set_parent(column.table)
+        elif column.table != self.table:
+            # all columns muse be from same table
+            raise exc.ArgumentError(
+                "All index columns must be from same table. "
+                "%s is from %s not %s" % (column, column.table, self.table))
+        elif column.name in [ c.name for c in self.columns ]:
+            raise exc.ArgumentError(
+                "A column may not appear twice in the "
+                "same index (%s already has column %s)" % (self.name, column))
+        self.columns.append(column)
+
+    def create(self, bind=None):
+        if bind is None:
+            bind = _bind_or_error(self)
+        bind.create(self)
+        return self
+
+    def drop(self, bind=None):
+        if bind is None:
+            bind = _bind_or_error(self)
+        bind.drop(self)
+
+    def __str__(self):
+        return repr(self)
+
+    def __repr__(self):
+        return 'Index("%s", %s%s)' % (self.name,
+                                      ', '.join(repr(c) for c in self.columns),
+                                      (self.unique and ', unique=True') or '')
+
+class MetaData(SchemaItem):
+    """A collection of Tables and their associated schema constructs.
+
+    Holds a collection of Tables and an optional binding to an ``Engine`` or
+    ``Connection``.  If bound, the :class:`~sqlalchemy.schema.Table` objects
+    in the collection and their columns may participate in implicit SQL
+    execution.
+
+    The `Table` objects themselves are stored in the `metadata.tables`
+    dictionary.
+
+    The ``bind`` property may be assigned to dynamically.  A common pattern is
+    to start unbound and then bind later when an engine is available::
+
+      metadata = MetaData()
+      # define tables
+      Table('mytable', metadata, ...)
+      # connect to an engine later, perhaps after loading a URL from a
+      # configuration file
+      metadata.bind = an_engine
+
+    MetaData is a thread-safe object after tables have been explicitly defined
+    or loaded via reflection.
+
+    .. index::
+      single: thread safety; MetaData
+
+    """
+
+    __visit_name__ = 'metadata'
+
+    ddl_events = ('before-create', 'after-create', 'before-drop', 'after-drop')
+
+    def __init__(self, bind=None, reflect=False):
+        """Create a new MetaData object.
+
+        bind
+          An Engine or Connection to bind to.  May also be a string or URL
+          instance, these are passed to create_engine() and this MetaData will
+          be bound to the resulting engine.
+
+        reflect
+          Optional, automatically load all tables from the bound database.
+          Defaults to False. ``bind`` is required when this option is set.
+          For finer control over loaded tables, use the ``reflect`` method of
+          ``MetaData``.
+
+        """
+        self.tables = {}
+        self.bind = bind
+        self.metadata = self
+        self.ddl_listeners = util.defaultdict(list)
+        if reflect:
+            if not bind:
+                raise exc.ArgumentError(
+                    "A bind must be supplied in conjunction with reflect=True")
+            self.reflect()
+
+    def __repr__(self):
+        return 'MetaData(%r)' % self.bind
+
+    def __contains__(self, key):
+        return key in self.tables
+
+    def __getstate__(self):
+        return {'tables': self.tables}
+
+    def __setstate__(self, state):
+        self.tables = state['tables']
+        self._bind = None
+
+    def is_bound(self):
+        """True if this MetaData is bound to an Engine or Connection."""
+
+        return self._bind is not None
+
+    @util.deprecated('Deprecated. Use ``metadata.bind = <engine>`` or '
+                     '``metadata.bind = <url>``.')
+    def connect(self, bind, **kwargs):
+        """Bind this MetaData to an Engine.
+
+        bind
+          A string, ``URL``, ``Engine`` or ``Connection`` instance.  If a
+          string or ``URL``, will be passed to ``create_engine()`` along with
+          ``\**kwargs`` to produce the engine which to connect to.  Otherwise
+          connects directly to the given ``Engine``.
+          
+        """
+        global URL
+        if URL is None:
+            from sqlalchemy.engine.url import URL
+        if isinstance(bind, (basestring, URL)):
+            from sqlalchemy import create_engine
+            self._bind = create_engine(bind, **kwargs)
+        else:
+            self._bind = bind
+
+    def bind(self):
+        """An Engine or Connection to which this MetaData is bound.
+
+        This property may be assigned an ``Engine`` or ``Connection``, or
+        assigned a string or URL to automatically create a basic ``Engine``
+        for this bind with ``create_engine()``.
+        
+        """
+        return self._bind
+
+    def _bind_to(self, bind):
+        """Bind this MetaData to an Engine, Connection, string or URL."""
+
+        global URL
+        if URL is None:
+            from sqlalchemy.engine.url import URL
+
+        if isinstance(bind, (basestring, URL)):
+            from sqlalchemy import create_engine
+            self._bind = create_engine(bind)
+        else:
+            self._bind = bind
+    bind = property(bind, _bind_to)
+
+    def clear(self):
+        """Clear all Table objects from this MetaData."""
+        # TODO: why have clear()/remove() but not all
+        # other accesors/mutators for the tables dict ?
+        self.tables.clear()
+
+    def remove(self, table):
+        """Remove the given Table object from this MetaData."""
+        
+        # TODO: scan all other tables and remove FK _column
+        del self.tables[table.key]
+
+    @util.deprecated('Deprecated. Use ``metadata.sorted_tables``')
+    def table_iterator(self, reverse=True, tables=None):
+        """Deprecated - use metadata.sorted_tables()."""
+        
+        from sqlalchemy.sql.util import sort_tables
+        if tables is None:
+            tables = self.tables.values()
+        else:
+            tables = set(tables).intersection(self.tables.values())
+        ret = sort_tables(tables)
+        if reverse:
+            ret = reversed(ret)
+        return iter(ret)
+    
+    @property
+    def sorted_tables(self):
+        """Returns a list of ``Table`` objects sorted in order of
+        dependency.
+        """
+        from sqlalchemy.sql.util import sort_tables
+        return sort_tables(self.tables.values())
+        
+    def reflect(self, bind=None, schema=None, only=None):
+        """Load all available table definitions from the database.
+
+        Automatically creates ``Table`` entries in this ``MetaData`` for any
+        table available in the database but not yet present in the
+        ``MetaData``.  May be called multiple times to pick up tables recently
+        added to the database, however no special action is taken if a table
+        in this ``MetaData`` no longer exists in the database.
+
+        bind
+          A :class:`~sqlalchemy.engine.base.Connectable` used to access the database; if None, uses the
+          existing bind on this ``MetaData``, if any.
+
+        schema
+          Optional, query and reflect tables from an alterate schema.
+
+        only
+          Optional.  Load only a sub-set of available named tables.  May be
+          specified as a sequence of names or a callable.
+
+          If a sequence of names is provided, only those tables will be
+          reflected.  An error is raised if a table is requested but not
+          available.  Named tables already present in this ``MetaData`` are
+          ignored.
+
+          If a callable is provided, it will be used as a boolean predicate to
+          filter the list of potential table names.  The callable is called
+          with a table name and this ``MetaData`` instance as positional
+          arguments and should return a true value for any table to reflect.
+
+        """
+        reflect_opts = {'autoload': True}
+        if bind is None:
+            bind = _bind_or_error(self)
+            conn = None
+        else:
+            reflect_opts['autoload_with'] = bind
+            conn = bind.contextual_connect()
+
+        if schema is not None:
+            reflect_opts['schema'] = schema
+
+        available = util.OrderedSet(bind.engine.table_names(schema,
+                                                            connection=conn))
+        current = set(self.tables.keys())
+
+        if only is None:
+            load = [name for name in available if name not in current]
+        elif util.callable(only):
+            load = [name for name in available
+                    if name not in current and only(name, self)]
+        else:
+            missing = [name for name in only if name not in available]
+            if missing:
+                s = schema and (" schema '%s'" % schema) or ''
+                raise exc.InvalidRequestError(
+                    'Could not reflect: requested table(s) not available '
+                    'in %s%s: (%s)' % (bind.engine.url, s, ', '.join(missing)))
+            load = [name for name in only if name not in current]
+
+        for name in load:
+            Table(name, self, **reflect_opts)
+
+    def append_ddl_listener(self, event, listener):
+        """Append a DDL event listener to this ``MetaData``.
+
+        The ``listener`` callable will be triggered when this ``MetaData`` is
+        involved in DDL creates or drops, and will be invoked either before
+        all Table-related actions or after.
+
+        Arguments are:
+
+        event
+          One of ``MetaData.ddl_events``; 'before-create', 'after-create',
+          'before-drop' or 'after-drop'.
+        listener
+          A callable, invoked with three positional arguments:
+
+          event
+            The event currently being handled
+          schema_item
+            The ``MetaData`` object being operated upon
+          bind
+            The ``Connection`` bueing used for DDL execution.
+
+        Listeners are added to the MetaData's ``ddl_listeners`` attribute.
+
+        Note: MetaData listeners are invoked even when ``Tables`` are created
+        in isolation.  This may change in a future release. I.e.::
+
+          # triggers all MetaData and Table listeners:
+          metadata.create_all()
+
+          # triggers MetaData listeners too:
+          some.table.create()
+
+        """
+        if event not in self.ddl_events:
+            raise LookupError(event)
+        self.ddl_listeners[event].append(listener)
+
+    def create_all(self, bind=None, tables=None, checkfirst=True):
+        """Create all tables stored in this metadata.
+
+        Conditional by default, will not attempt to recreate tables already
+        present in the target database.
+
+        bind
+          A :class:`~sqlalchemy.engine.base.Connectable` used to access the database; if None, uses the
+          existing bind on this ``MetaData``, if any.
+
+        tables
+          Optional list of ``Table`` objects, which is a subset of the total
+          tables in the ``MetaData`` (others are ignored).
+
+        checkfirst
+          Defaults to True, don't issue CREATEs for tables already present
+          in the target database.
+          
+        """
+        if bind is None:
+            bind = _bind_or_error(self)
+        for listener in self.ddl_listeners['before-create']:
+            listener('before-create', self, bind)
+        bind.create(self, checkfirst=checkfirst, tables=tables)
+        for listener in self.ddl_listeners['after-create']:
+            listener('after-create', self, bind)
+
+    def drop_all(self, bind=None, tables=None, checkfirst=True):
+        """Drop all tables stored in this metadata.
+
+        Conditional by default, will not attempt to drop tables not present in
+        the target database.
+
+        bind
+          A :class:`~sqlalchemy.engine.base.Connectable` used to access the database; if None, uses
+          the existing bind on this ``MetaData``, if any.
+
+        tables
+          Optional list of ``Table`` objects, which is a subset of the
+          total tables in the ``MetaData`` (others are ignored).
+
+        checkfirst
+          Defaults to True, only issue DROPs for tables confirmed to be present
+          in the target database.
+
+        """
+        if bind is None:
+            bind = _bind_or_error(self)
+        for listener in self.ddl_listeners['before-drop']:
+            listener('before-drop', self, bind)
+        bind.drop(self, checkfirst=checkfirst, tables=tables)
+        for listener in self.ddl_listeners['after-drop']:
+            listener('after-drop', self, bind)
+
+class ThreadLocalMetaData(MetaData):
+    """A MetaData variant that presents a different ``bind`` in every thread.
+
+    Makes the ``bind`` property of the MetaData a thread-local value, allowing
+    this collection of tables to be bound to different ``Engine``
+    implementations or connections in each thread.
+
+    The ThreadLocalMetaData starts off bound to None in each thread.  Binds
+    must be made explicitly by assigning to the ``bind`` property or using
+    ``connect()``.  You can also re-bind dynamically multiple times per
+    thread, just like a regular ``MetaData``.
+
+    """
+
+    __visit_name__ = 'metadata'
+
+    def __init__(self):
+        """Construct a ThreadLocalMetaData."""
+
+        self.context = util.threading.local()
+        self.__engines = {}
+        super(ThreadLocalMetaData, self).__init__()
+
+    @util.deprecated('Deprecated. Use ``metadata.bind = <engine>`` or '
+                     '``metadata.bind = <url>``.')
+    def connect(self, bind, **kwargs):
+        """Bind to an Engine in the caller's thread.
+
+        bind
+          A string, ``URL``, ``Engine`` or ``Connection`` instance.  If a
+          string or ``URL``, will be passed to ``create_engine()`` along with
+          ``\**kwargs`` to produce the engine which to connect to.  Otherwise
+          connects directly to the given ``Engine``.
+        """
+
+        global URL
+        if URL is None:
+            from sqlalchemy.engine.url import URL
+
+        if isinstance(bind, (basestring, URL)):
+            try:
+                engine = self.__engines[bind]
+            except KeyError:
+                from sqlalchemy import create_engine
+                engine = create_engine(bind, **kwargs)
+            bind = engine
+        self._bind_to(bind)
+
+    def bind(self):
+        """The bound Engine or Connection for this thread.
+
+        This property may be assigned an Engine or Connection, or assigned a
+        string or URL to automatically create a basic Engine for this bind
+        with ``create_engine()``."""
+
+        return getattr(self.context, '_engine', None)
+
+    def _bind_to(self, bind):
+        """Bind to a Connectable in the caller's thread."""
+
+        global URL
+        if URL is None:
+            from sqlalchemy.engine.url import URL
+
+        if isinstance(bind, (basestring, URL)):
+            try:
+                self.context._engine = self.__engines[bind]
+            except KeyError:
+                from sqlalchemy import create_engine
+                e = create_engine(bind)
+                self.__engines[bind] = e
+                self.context._engine = e
+        else:
+            # TODO: this is squirrely.  we shouldnt have to hold onto engines
+            # in a case like this
+            if bind not in self.__engines:
+                self.__engines[bind] = bind
+            self.context._engine = bind
+
+    bind = property(bind, _bind_to)
+
+    def is_bound(self):
+        """True if there is a bind for this thread."""
+        return (hasattr(self.context, '_engine') and
+                self.context._engine is not None)
+
+    def dispose(self):
+        """Dispose all bound engines, in all thread contexts."""
+
+        for e in self.__engines.values():
+            if hasattr(e, 'dispose'):
+                e.dispose()
+
+class SchemaVisitor(visitors.ClauseVisitor):
+    """Define the visiting for ``SchemaItem`` objects."""
+
+    __traverse_options__ = {'schema_visitor':True}
+
+
+class DDL(object):
+    """A literal DDL statement.
+
+    Specifies literal SQL DDL to be executed by the database.  DDL objects can
+    be attached to ``Tables`` or ``MetaData`` instances, conditionally
+    executing SQL as part of the DDL lifecycle of those schema items.  Basic
+    templating support allows a single DDL instance to handle repetitive tasks
+    for multiple tables.
+
+    Examples::
+
+      tbl = Table('users', metadata, Column('uid', Integer)) # ...
+      DDL('DROP TRIGGER users_trigger').execute_at('before-create', tbl)
+
+      spow = DDL('ALTER TABLE %(table)s SET secretpowers TRUE', on='somedb')
+      spow.execute_at('after-create', tbl)
+
+      drop_spow = DDL('ALTER TABLE users SET secretpowers FALSE')
+      connection.execute(drop_spow)
+    """
+
+    def __init__(self, statement, on=None, context=None, bind=None):
+        """Create a DDL statement.
+
+        statement
+          A string or unicode string to be executed.  Statements will be
+          processed with Python's string formatting operator.  See the
+          ``context`` argument and the ``execute_at`` method.
+
+          A literal '%' in a statement must be escaped as '%%'.
+
+          SQL bind parameters are not available in DDL statements.
+
+        on
+          Optional filtering criteria.  May be a string or a callable
+          predicate.  If a string, it will be compared to the name of the
+          executing database dialect::
+
+            DDL('something', on='postgres')
+
+          If a callable, it will be invoked with three positional arguments:
+
+            event
+              The name of the event that has triggered this DDL, such as
+              'after-create' Will be None if the DDL is executed explicitly.
+
+            schema_item
+              A SchemaItem instance, such as ``Table`` or ``MetaData``. May be
+              None if the DDL is executed explicitly.
+
+            connection
+              The ``Connection`` being used for DDL execution
+
+          If the callable returns a true value, the DDL statement will be
+          executed.
+
+        context
+          Optional dictionary, defaults to None.  These values will be
+          available for use in string substitutions on the DDL statement.
+
+        bind
+          Optional. A :class:`~sqlalchemy.engine.base.Connectable`, used by default when ``execute()``
+          is invoked without a bind argument.
+          
+        """
+
+        if not isinstance(statement, basestring):
+            raise exc.ArgumentError(
+                "Expected a string or unicode SQL statement, got '%r'" %
+                statement)
+        if (on is not None and
+            (not isinstance(on, basestring) and not util.callable(on))):
+            raise exc.ArgumentError(
+                "Expected the name of a database dialect or a callable for "
+                "'on' criteria, got type '%s'." % type(on).__name__)
+
+        self.statement = statement
+        self.on = on
+        self.context = context or {}
+        self._bind = bind
+
+    def execute(self, bind=None, schema_item=None):
+        """Execute this DDL immediately.
+
+        Executes the DDL statement in isolation using the supplied
+        :class:`~sqlalchemy.engine.base.Connectable` or :class:`~sqlalchemy.engine.base.Connectable` assigned to the ``.bind`` property,
+        if not supplied.  If the DDL has a conditional ``on`` criteria, it
+        will be invoked with None as the event.
+
+        bind
+          Optional, an ``Engine`` or ``Connection``.  If not supplied, a
+          valid :class:`~sqlalchemy.engine.base.Connectable` must be present in the ``.bind`` property.
+
+        schema_item
+          Optional, defaults to None.  Will be passed to the ``on`` callable
+          criteria, if any, and may provide string expansion data for the
+          statement. See ``execute_at`` for more information.
+        """
+
+        if bind is None:
+            bind = _bind_or_error(self)
+        # no SQL bind params are supported
+        if self._should_execute(None, schema_item, bind):
+            executable = expression.text(self._expand(schema_item, bind))
+            return bind.execute(executable)
+        else:
+            bind.engine.logger.info("DDL execution skipped, criteria not met.")
+
+    def execute_at(self, event, schema_item):
+        """Link execution of this DDL to the DDL lifecycle of a SchemaItem.
+
+        Links this ``DDL`` to a ``Table`` or ``MetaData`` instance, executing
+        it when that schema item is created or dropped.  The DDL statement
+        will be executed using the same Connection and transactional context
+        as the Table create/drop itself.  The ``.bind`` property of this
+        statement is ignored.
+
+        event
+          One of the events defined in the schema item's ``.ddl_events``;
+          e.g. 'before-create', 'after-create', 'before-drop' or 'after-drop'
+
+        schema_item
+          A Table or MetaData instance
+
+        When operating on Table events, the following additional ``statement``
+        string substitions are available::
+
+            %(table)s  - the Table name, with any required quoting applied
+            %(schema)s - the schema name, with any required quoting applied
+            %(fullname)s - the Table name including schema, quoted if needed
+
+        The DDL's ``context``, if any, will be combined with the standard
+        substutions noted above.  Keys present in the context will override
+        the standard substitutions.
+
+        A DDL instance can be linked to any number of schema items. The
+        statement subsitution support allows for DDL instances to be used in a
+        template fashion.
+
+        ``execute_at`` builds on the ``append_ddl_listener`` interface of
+        MetaDta and Table objects.
+
+        Caveat: Creating or dropping a Table in isolation will also trigger
+        any DDL set to ``execute_at`` that Table's MetaData.  This may change
+        in a future release.
+        """
+
+        if not hasattr(schema_item, 'ddl_listeners'):
+            raise exc.ArgumentError(
+                "%s does not support DDL events" % type(schema_item).__name__)
+        if event not in schema_item.ddl_events:
+            raise exc.ArgumentError(
+                "Unknown event, expected one of (%s), got '%r'" %
+                (', '.join(schema_item.ddl_events), event))
+        schema_item.ddl_listeners[event].append(self)
+        return self
+
+    def bind(self):
+        """An Engine or Connection to which this DDL is bound.
+
+        This property may be assigned an ``Engine`` or ``Connection``, or
+        assigned a string or URL to automatically create a basic ``Engine``
+        for this bind with ``create_engine()``.
+        """
+        return self._bind
+
+    def _bind_to(self, bind):
+        """Bind this MetaData to an Engine, Connection, string or URL."""
+
+        global URL
+        if URL is None:
+            from sqlalchemy.engine.url import URL
+
+        if isinstance(bind, (basestring, URL)):
+            from sqlalchemy import create_engine
+            self._bind = create_engine(bind)
+        else:
+            self._bind = bind
+    bind = property(bind, _bind_to)
+
+    def __call__(self, event, schema_item, bind):
+        """Execute the DDL as a ddl_listener."""
+
+        if self._should_execute(event, schema_item, bind):
+            statement = expression.text(self._expand(schema_item, bind))
+            return bind.execute(statement)
+
+    def _expand(self, schema_item, bind):
+        return self.statement % self._prepare_context(schema_item, bind)
+
+    def _should_execute(self, event, schema_item, bind):
+        if self.on is None:
+            return True
+        elif isinstance(self.on, basestring):
+            return self.on == bind.engine.name
+        else:
+            return self.on(event, schema_item, bind)
+
+    def _prepare_context(self, schema_item, bind):
+        # table events can substitute table and schema name
+        if isinstance(schema_item, Table):
+            context = self.context.copy()
+
+            preparer = bind.dialect.identifier_preparer
+            path = preparer.format_table_seq(schema_item)
+            if len(path) == 1:
+                table, schema = path[0], ''
+            else:
+                table, schema = path[-1], path[0]
+
+            context.setdefault('table', table)
+            context.setdefault('schema', schema)
+            context.setdefault('fullname', preparer.format_table(schema_item))
+            return context
+        else:
+            return self.context
+
+    def __repr__(self):
+        return '<%s@%s; %s>' % (
+            type(self).__name__, id(self),
+            ', '.join([repr(self.statement)] +
+                      ['%s=%r' % (key, getattr(self, key))
+                       for key in ('on', 'context')
+                       if getattr(self, key)]))
+
+def _to_schema_column(element):
+    if hasattr(element, '__clause_element__'):
+        element = element.__clause_element__()
+    if not isinstance(element, Column):
+        raise exc.ArgumentError("schema.Column object expected")
+    return element
+    
+def _bind_or_error(schemaitem):
+    bind = schemaitem.bind
+    if not bind:
+        name = schemaitem.__class__.__name__
+        label = getattr(schemaitem, 'fullname',
+                        getattr(schemaitem, 'name', None))
+        if label:
+            item = '%s %r' % (name, label)
+        else:
+            item = name
+        if isinstance(schemaitem, (MetaData, DDL)):
+            bindable = "the %s's .bind" % name
+        else:
+            bindable = "this %s's .metadata.bind" % name
+
+        msg = ('The %s is not bound to an Engine or Connection.  '
+               'Execution can not proceed without a database to execute '
+               'against.  Either execute with an explicit connection or '
+               'assign %s to enable implicit execution.') % (item, bindable)
+        raise exc.UnboundExecutionError(msg)
+    return bind
+
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/databases/informix.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/databases/informix.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/databases/informix.py (revision 3)
@@ -0,0 +1,493 @@
+# informix.py
+# Copyright (C) 2005,2006, 2007, 2008, 2009 Michael Bayer mike_mp@zzzcomputing.com
+#
+# coding: gbk
+#
+# This module is part of SQLAlchemy and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+import datetime
+
+from sqlalchemy import sql, schema, exc, pool, util
+from sqlalchemy.sql import compiler
+from sqlalchemy.engine import default
+from sqlalchemy import types as sqltypes
+
+
+# for offset
+
+class informix_cursor(object):
+    def __init__( self , con ):
+        self.__cursor = con.cursor()
+        self.rowcount = 0
+
+    def offset( self , n ):
+        if n > 0:
+            self.fetchmany( n )
+            self.rowcount = self.__cursor.rowcount - n
+            if self.rowcount < 0:
+                self.rowcount = 0
+        else:
+            self.rowcount = self.__cursor.rowcount
+
+    def execute( self , sql , params ):
+        if params is None or len( params ) == 0:
+            params = []
+
+        return self.__cursor.execute( sql , params )
+
+    def __getattr__( self , name ):
+        if name not in ( 'offset' , '__cursor' , 'rowcount' , '__del__' , 'execute' ):
+            return getattr( self.__cursor , name )
+
+class InfoNumeric(sqltypes.Numeric):
+    def get_col_spec(self):
+        if not self.precision:
+            return 'NUMERIC'
+        else:
+            return "NUMERIC(%(precision)s, %(scale)s)" % {'precision': self.precision, 'scale' : self.scale}
+
+class InfoInteger(sqltypes.Integer):
+    def get_col_spec(self):
+        return "INTEGER"
+
+class InfoSmallInteger(sqltypes.Smallinteger):
+    def get_col_spec(self):
+        return "SMALLINT"
+
+class InfoDate(sqltypes.Date):
+    def get_col_spec( self ):
+        return "DATE"
+
+class InfoDateTime(sqltypes.DateTime ):
+    def get_col_spec(self):
+        return "DATETIME YEAR TO SECOND"
+
+    def bind_processor(self, dialect):
+        def process(value):
+            if value is not None:
+                if value.microsecond:
+                    value = value.replace( microsecond = 0 )
+            return value
+        return process
+
+class InfoTime(sqltypes.Time ):
+    def get_col_spec(self):
+        return "DATETIME HOUR TO SECOND"
+
+    def bind_processor(self, dialect):
+        def process(value):
+            if value is not None:
+                if value.microsecond:
+                    value = value.replace( microsecond = 0 )
+            return value
+        return process
+
+    def result_processor(self, dialect):
+        def process(value):
+            if isinstance( value , datetime.datetime ):
+                return value.time()
+            else:
+                return value
+        return process
+
+class InfoText(sqltypes.String):
+    def get_col_spec(self):
+        return "VARCHAR(255)"
+
+class InfoString(sqltypes.String):
+    def get_col_spec(self):
+        return "VARCHAR(%(length)s)" % {'length' : self.length}
+
+    def bind_processor(self, dialect):
+        def process(value):
+            if value == '':
+                return None
+            else:
+                return value
+        return process
+
+class InfoChar(sqltypes.CHAR):
+    def get_col_spec(self):
+        return "CHAR(%(length)s)" % {'length' : self.length}
+
+class InfoBinary(sqltypes.Binary):
+    def get_col_spec(self):
+        return "BYTE"
+
+class InfoBoolean(sqltypes.Boolean):
+    default_type = 'NUM'
+    def get_col_spec(self):
+        return "SMALLINT"
+
+    def result_processor(self, dialect):
+        def process(value):
+            if value is None:
+                return None
+            return value and True or False
+        return process
+
+    def bind_processor(self, dialect):
+        def process(value):
+            if value is True:
+                return 1
+            elif value is False:
+                return 0
+            elif value is None:
+                return None
+            else:
+                return value and True or False
+        return process
+
+colspecs = {
+    sqltypes.Integer : InfoInteger,
+    sqltypes.Smallinteger : InfoSmallInteger,
+    sqltypes.Numeric : InfoNumeric,
+    sqltypes.Float : InfoNumeric,
+    sqltypes.DateTime : InfoDateTime,
+    sqltypes.Date : InfoDate,
+    sqltypes.Time: InfoTime,
+    sqltypes.String : InfoString,
+    sqltypes.Binary : InfoBinary,
+    sqltypes.Boolean : InfoBoolean,
+    sqltypes.Text : InfoText,
+    sqltypes.CHAR: InfoChar,
+}
+
+
+ischema_names = {
+    0   : InfoString,       # CHAR
+    1   : InfoSmallInteger, # SMALLINT
+    2   : InfoInteger,      # INT
+    3   : InfoNumeric,      # Float
+    3   : InfoNumeric,      # SmallFloat
+    5   : InfoNumeric,      # DECIMAL
+    6   : InfoInteger,      # Serial
+    7   : InfoDate,         # DATE
+    8   : InfoNumeric,      # MONEY
+    10  : InfoDateTime,     # DATETIME
+    11  : InfoBinary,       # BYTE
+    12  : InfoText,         # TEXT
+    13  : InfoString,       # VARCHAR
+    15  : InfoString,       # NCHAR
+    16  : InfoString,       # NVARCHAR
+    17  : InfoInteger,      # INT8
+    18  : InfoInteger,      # Serial8
+    43  : InfoString,       # LVARCHAR
+    -1  : InfoBinary,       # BLOB
+    -1  : InfoText,         # CLOB
+}
+
+
+class InfoExecutionContext(default.DefaultExecutionContext):
+    # cursor.sqlerrd
+    # 0 - estimated number of rows returned
+    # 1 - serial value after insert or ISAM error code
+    # 2 - number of rows processed
+    # 3 - estimated cost
+    # 4 - offset of the error into the SQL statement
+    # 5 - rowid after insert
+    def post_exec(self):
+        if getattr(self.compiled, "isinsert", False) and self.last_inserted_ids() is None:
+            self._last_inserted_ids = [self.cursor.sqlerrd[1]]
+        elif hasattr( self.compiled , 'offset' ):
+            self.cursor.offset( self.compiled.offset )
+        super(InfoExecutionContext, self).post_exec()
+
+    def create_cursor( self ):
+        return informix_cursor( self.connection.connection )
+
+class InfoDialect(default.DefaultDialect):
+    name = 'informix'
+    default_paramstyle = 'qmark'
+    # for informix 7.31
+    max_identifier_length = 18
+
+    def __init__(self, use_ansi=True, **kwargs):
+        self.use_ansi = use_ansi
+        default.DefaultDialect.__init__(self, **kwargs)
+
+    def dbapi(cls):
+        import informixdb
+        return informixdb
+    dbapi = classmethod(dbapi)
+
+    def is_disconnect(self, e):
+        if isinstance(e, self.dbapi.OperationalError):
+            return 'closed the connection' in str(e) or 'connection not open' in str(e)
+        else:
+            return False
+
+    def do_begin(self , connect ):
+        cu = connect.cursor()
+        cu.execute( 'SET LOCK MODE TO WAIT' )
+        #cu.execute( 'SET ISOLATION TO REPEATABLE READ' )
+
+    def type_descriptor(self, typeobj):
+        return sqltypes.adapt_type(typeobj, colspecs)
+
+    def create_connect_args(self, url):
+        if url.host:
+            dsn = '%s@%s' % ( url.database , url.host )
+        else:
+            dsn = url.database
+
+        if url.username:
+            opt = { 'user':url.username , 'password': url.password }
+        else:
+            opt = {}
+
+        return ([dsn], opt)
+
+    def table_names(self, connection, schema):
+        s = "select tabname from systables"
+        return [row[0] for row in connection.execute(s)]
+
+    def has_table(self, connection, table_name, schema=None):
+        cursor = connection.execute("""select tabname from systables where tabname=?""", table_name.lower() )
+        return bool( cursor.fetchone() is not None )
+
+    def reflecttable(self, connection, table, include_columns):
+        c = connection.execute ("select distinct OWNER from systables where tabname=?", table.name.lower() )
+        rows = c.fetchall()
+        if not rows :
+            raise exc.NoSuchTableError(table.name)
+        else:
+            if table.owner is not None:
+                if table.owner.lower() in [r[0] for r in rows]:
+                    owner = table.owner.lower()
+                else:
+                    raise AssertionError("Specified owner %s does not own table %s"%(table.owner, table.name))
+            else:
+                if len(rows)==1:
+                    owner = rows[0][0]
+                else:
+                    raise AssertionError("There are multiple tables with name %s in the schema, you must specifie owner"%table.name)
+
+        c = connection.execute ("""select colname , coltype , collength , t3.default , t1.colno from syscolumns as t1 , systables as t2 , OUTER sysdefaults as t3
+                                    where t1.tabid = t2.tabid and t2.tabname=? and t2.owner=?
+                                      and t3.tabid = t2.tabid and t3.colno = t1.colno
+                                    order by t1.colno""", table.name.lower(), owner )
+        rows = c.fetchall()
+
+        if not rows:
+            raise exc.NoSuchTableError(table.name)
+
+        for name , colattr , collength , default , colno in rows:
+            name = name.lower()
+            if include_columns and name not in include_columns:
+                continue
+
+            # in 7.31, coltype = 0x000
+            #                       ^^-- column type
+            #                      ^-- 1 not null , 0 null
+            nullable , coltype = divmod( colattr , 256 )
+            if coltype not in ( 0 , 13 ) and default:
+                default = default.split()[-1]
+
+            if coltype == 0 or coltype == 13: # char , varchar
+                coltype = ischema_names.get(coltype, InfoString)(collength)
+                if default:
+                    default = "'%s'" % default
+            elif coltype == 5: # decimal
+                precision , scale = ( collength & 0xFF00 ) >> 8 , collength & 0xFF
+                if scale == 255:
+                    scale = 0
+                coltype = InfoNumeric(precision, scale)
+            else:
+                try:
+                    coltype = ischema_names[coltype]
+                except KeyError:
+                    util.warn("Did not recognize type '%s' of column '%s'" %
+                              (coltype, name))
+                    coltype = sqltypes.NULLTYPE
+
+            colargs = []
+            if default is not None:
+                colargs.append(schema.DefaultClause(sql.text(default)))
+
+            table.append_column(schema.Column(name, coltype, nullable = (nullable == 0), *colargs))
+
+        # FK
+        c = connection.execute("""select t1.constrname as cons_name , t1.constrtype as cons_type ,
+                                         t4.colname as local_column , t7.tabname as remote_table ,
+                                         t6.colname as remote_column
+                                    from sysconstraints as t1 , systables as t2 ,
+                                         sysindexes as t3 , syscolumns as t4 ,
+                                         sysreferences as t5 , syscolumns as t6 , systables as t7 ,
+                                         sysconstraints as t8 , sysindexes as t9
+                                   where t1.tabid = t2.tabid and t2.tabname=? and t2.owner=? and t1.constrtype = 'R'
+                                     and t3.tabid = t2.tabid and t3.idxname = t1.idxname
+                                     and t4.tabid = t2.tabid and t4.colno = t3.part1
+                                     and t5.constrid = t1.constrid and t8.constrid = t5.primary
+                                     and t6.tabid = t5.ptabid and t6.colno = t9.part1 and t9.idxname = t8.idxname
+                                     and t7.tabid = t5.ptabid""", table.name.lower(), owner )
+        rows = c.fetchall()
+        fks = {}
+        for cons_name, cons_type, local_column, remote_table, remote_column in rows:
+            try:
+                fk = fks[cons_name]
+            except KeyError:
+                fk = ([], [])
+                fks[cons_name] = fk
+            refspec = ".".join([remote_table, remote_column])
+            schema.Table(remote_table, table.metadata, autoload=True, autoload_with=connection)
+            if local_column not in fk[0]:
+                fk[0].append(local_column)
+            if refspec not in fk[1]:
+                fk[1].append(refspec)
+
+        for name, value in fks.iteritems():
+            table.append_constraint(schema.ForeignKeyConstraint(value[0], value[1] , None, link_to_name=True ))
+
+        # PK
+        c = connection.execute("""select t1.constrname as cons_name , t1.constrtype as cons_type ,
+                                         t4.colname as local_column
+                                    from sysconstraints as t1 , systables as t2 ,
+                                         sysindexes as t3 , syscolumns as t4
+                                   where t1.tabid = t2.tabid and t2.tabname=? and t2.owner=? and t1.constrtype = 'P'
+                                     and t3.tabid = t2.tabid and t3.idxname = t1.idxname
+                                     and t4.tabid = t2.tabid and t4.colno = t3.part1""", table.name.lower(), owner )
+        rows = c.fetchall()
+        for cons_name, cons_type, local_column in rows:
+            table.primary_key.add( table.c[local_column] )
+
+class InfoCompiler(compiler.DefaultCompiler):
+    """Info compiler modifies the lexical structure of Select statements to work under
+    non-ANSI configured Oracle databases, if the use_ansi flag is False."""
+
+    def __init__(self, *args, **kwargs):
+        self.limit = 0
+        self.offset = 0
+
+        compiler.DefaultCompiler.__init__( self , *args, **kwargs )
+
+    def default_from(self):
+        return " from systables where tabname = 'systables' "
+
+    def get_select_precolumns( self , select ):
+        s = select._distinct and "DISTINCT " or ""
+        # only has limit
+        if select._limit:
+            off = select._offset or 0
+            s += " FIRST %s " % ( select._limit + off )
+        else:
+            s += ""
+        return s
+
+    def visit_select(self, select):
+        if select._offset:
+            self.offset = select._offset
+            self.limit  = select._limit or 0
+        # the column in order by clause must in select too
+
+        def __label( c ):
+            try:
+                return c._label.lower()
+            except:
+                return ''
+
+        # TODO: dont modify the original select, generate a new one
+        a = [ __label(c) for c in select._raw_columns ]
+        for c in select._order_by_clause.clauses:
+            if ( __label(c) not in a ):
+                select.append_column( c )
+
+        return compiler.DefaultCompiler.visit_select(self, select)
+
+    def limit_clause(self, select):
+        return ""
+
+    def visit_function( self , func ):
+        if func.name.lower() == 'current_date':
+            return "today"
+        elif func.name.lower() == 'current_time':
+            return "CURRENT HOUR TO SECOND"
+        elif func.name.lower() in ( 'current_timestamp' , 'now' ):
+            return "CURRENT YEAR TO SECOND"
+        else:
+            return compiler.DefaultCompiler.visit_function( self , func )
+
+    def visit_clauselist(self, list, **kwargs):
+        return ', '.join([s for s in [self.process(c) for c in list.clauses] if s is not None])
+
+class InfoSchemaGenerator(compiler.SchemaGenerator):
+    def get_column_specification(self, column, first_pk=False):
+        colspec = self.preparer.format_column(column)
+        if column.primary_key and len(column.foreign_keys)==0 and column.autoincrement and \
+           isinstance(column.type, sqltypes.Integer) and not getattr( self , 'has_serial' , False ) and first_pk:
+            colspec += " SERIAL"
+            self.has_serial = True
+        else:
+            colspec += " " + column.type.dialect_impl(self.dialect).get_col_spec()
+            default = self.get_column_default_string(column)
+            if default is not None:
+                colspec += " DEFAULT " + default
+
+        if not column.nullable:
+            colspec += " NOT NULL"
+
+        return colspec
+
+    def post_create_table(self, table):
+        if hasattr( self , 'has_serial' ):
+            del self.has_serial
+        return ''
+
+    def visit_primary_key_constraint(self, constraint):
+        # for informix 7.31 not support constraint name
+        name = constraint.name
+        constraint.name = None
+        super(InfoSchemaGenerator, self).visit_primary_key_constraint(constraint)
+        constraint.name = name
+
+    def visit_unique_constraint(self, constraint):
+        # for informix 7.31 not support constraint name
+        name = constraint.name
+        constraint.name = None
+        super(InfoSchemaGenerator, self).visit_unique_constraint(constraint)
+        constraint.name = name
+
+    def visit_foreign_key_constraint( self , constraint ):
+        if constraint.name is not None:
+            constraint.use_alter = True
+        else:
+            super( InfoSchemaGenerator , self ).visit_foreign_key_constraint( constraint )
+
+    def define_foreign_key(self, constraint):
+        # for informix 7.31 not support constraint name
+        if constraint.use_alter:
+            name = constraint.name
+            constraint.name = None
+            self.append( "CONSTRAINT " )
+            super(InfoSchemaGenerator, self).define_foreign_key(constraint)
+            constraint.name = name
+            if name is not None:
+                self.append( " CONSTRAINT " + name )
+        else:
+            super(InfoSchemaGenerator, self).define_foreign_key(constraint)
+
+    def visit_index(self, index):
+        if len( index.columns ) == 1 and index.columns[0].foreign_key:
+            return
+        super(InfoSchemaGenerator, self).visit_index(index)
+
+class InfoIdentifierPreparer(compiler.IdentifierPreparer):
+    def __init__(self, dialect):
+        super(InfoIdentifierPreparer, self).__init__(dialect, initial_quote="'")
+
+    def _requires_quotes(self, value):
+        return False
+
+class InfoSchemaDropper(compiler.SchemaDropper):
+    def drop_foreignkey(self, constraint):
+        if constraint.name is not None:
+            super( InfoSchemaDropper , self ).drop_foreignkey( constraint )
+
+dialect = InfoDialect
+poolclass = pool.SingletonThreadPool
+dialect.statement_compiler = InfoCompiler
+dialect.schemagenerator = InfoSchemaGenerator
+dialect.schemadropper = InfoSchemaDropper
+dialect.preparer = InfoIdentifierPreparer
+dialect.execution_ctx_cls = InfoExecutionContext
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/databases/maxdb.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/databases/maxdb.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/databases/maxdb.py (revision 3)
@@ -0,0 +1,1099 @@
+# maxdb.py
+#
+# This module is part of SQLAlchemy and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+"""Support for the MaxDB database.
+
+TODO: More module docs!  MaxDB support is currently experimental.
+
+Overview
+--------
+
+The ``maxdb`` dialect is **experimental** and has only been tested on 7.6.03.007
+and 7.6.00.037.  Of these, **only 7.6.03.007 will work** with SQLAlchemy's ORM.
+The earlier version has severe ``LEFT JOIN`` limitations and will return
+incorrect results from even very simple ORM queries.
+
+Only the native Python DB-API is currently supported.  ODBC driver support
+is a future enhancement.
+
+Connecting
+----------
+
+The username is case-sensitive.  If you usually connect to the
+database with sqlcli and other tools in lower case, you likely need to
+use upper case for DB-API.
+
+Implementation Notes
+--------------------
+
+Also check the DatabaseNotes page on the wiki for detailed information.
+
+With the 7.6.00.37 driver and Python 2.5, it seems that all DB-API
+generated exceptions are broken and can cause Python to crash.
+
+For 'somecol.in_([])' to work, the IN operator's generation must be changed
+to cast 'NULL' to a numeric, i.e. NUM(NULL).  The DB-API doesn't accept a
+bind parameter there, so that particular generation must inline the NULL value,
+which depends on [ticket:807].
+
+The DB-API is very picky about where bind params may be used in queries.
+
+Bind params for some functions (e.g. MOD) need type information supplied.
+The dialect does not yet do this automatically.
+
+Max will occasionally throw up 'bad sql, compile again' exceptions for
+perfectly valid SQL.  The dialect does not currently handle these, more
+research is needed.
+
+MaxDB 7.5 and Sap DB <= 7.4 reportedly do not support schemas.  A very
+slightly different version of this dialect would be required to support
+those versions, and can easily be added if there is demand.  Some other
+required components such as an Max-aware 'old oracle style' join compiler
+(thetas with (+) outer indicators) are already done and available for
+integration- email the devel list if you're interested in working on
+this.
+
+"""
+import datetime, itertools, re
+
+from sqlalchemy import exc, schema, sql, util
+from sqlalchemy.sql import operators as sql_operators, expression as sql_expr
+from sqlalchemy.sql import compiler, visitors
+from sqlalchemy.engine import base as engine_base, default
+from sqlalchemy import types as sqltypes
+
+
+__all__ = [
+    'MaxString', 'MaxUnicode', 'MaxChar', 'MaxText', 'MaxInteger',
+    'MaxSmallInteger', 'MaxNumeric', 'MaxFloat', 'MaxTimestamp',
+    'MaxDate', 'MaxTime', 'MaxBoolean', 'MaxBlob',
+    ]
+
+
+class _StringType(sqltypes.String):
+    _type = None
+
+    def __init__(self, length=None, encoding=None, **kw):
+        super(_StringType, self).__init__(length=length, **kw)
+        self.encoding = encoding
+
+    def get_col_spec(self):
+        if self.length is None:
+            spec = 'LONG'
+        else:
+            spec = '%s(%s)' % (self._type, self.length)
+
+        if self.encoding is not None:
+            spec = ' '.join([spec, self.encoding.upper()])
+        return spec
+
+    def bind_processor(self, dialect):
+        if self.encoding == 'unicode':
+            return None
+        else:
+            def process(value):
+                if isinstance(value, unicode):
+                    return value.encode(dialect.encoding)
+                else:
+                    return value
+            return process
+
+    def result_processor(self, dialect):
+        def process(value):
+            while True:
+                if value is None:
+                    return None
+                elif isinstance(value, unicode):
+                    return value
+                elif isinstance(value, str):
+                    if self.convert_unicode or dialect.convert_unicode:
+                        return value.decode(dialect.encoding)
+                    else:
+                        return value
+                elif hasattr(value, 'read'):
+                    # some sort of LONG, snarf and retry
+                    value = value.read(value.remainingLength())
+                    continue
+                else:
+                    # unexpected type, return as-is
+                    return value
+        return process
+
+
+class MaxString(_StringType):
+    _type = 'VARCHAR'
+
+    def __init__(self, *a, **kw):
+        super(MaxString, self).__init__(*a, **kw)
+
+
+class MaxUnicode(_StringType):
+    _type = 'VARCHAR'
+
+    def __init__(self, length=None, **kw):
+        super(MaxUnicode, self).__init__(length=length, encoding='unicode')
+
+
+class MaxChar(_StringType):
+    _type = 'CHAR'
+
+
+class MaxText(_StringType):
+    _type = 'LONG'
+
+    def __init__(self, *a, **kw):
+        super(MaxText, self).__init__(*a, **kw)
+
+    def get_col_spec(self):
+        spec = 'LONG'
+        if self.encoding is not None:
+            spec = ' '.join((spec, self.encoding))
+        elif self.convert_unicode:
+            spec = ' '.join((spec, 'UNICODE'))
+
+        return spec
+
+
+class MaxInteger(sqltypes.Integer):
+    def get_col_spec(self):
+        return 'INTEGER'
+
+
+class MaxSmallInteger(MaxInteger):
+    def get_col_spec(self):
+        return 'SMALLINT'
+
+
+class MaxNumeric(sqltypes.Numeric):
+    """The FIXED (also NUMERIC, DECIMAL) data type."""
+
+    def __init__(self, precision=None, scale=None, **kw):
+        kw.setdefault('asdecimal', True)
+        super(MaxNumeric, self).__init__(scale=scale, precision=precision,
+                                         **kw)
+
+    def bind_processor(self, dialect):
+        return None
+
+    def get_col_spec(self):
+        if self.scale and self.precision:
+            return 'FIXED(%s, %s)' % (self.precision, self.scale)
+        elif self.precision:
+            return 'FIXED(%s)' % self.precision
+        else:
+            return 'INTEGER'
+
+
+class MaxFloat(sqltypes.Float):
+    """The FLOAT data type."""
+
+    def get_col_spec(self):
+        if self.precision is None:
+            return 'FLOAT'
+        else:
+            return 'FLOAT(%s)' % (self.precision,)
+
+
+class MaxTimestamp(sqltypes.DateTime):
+    def get_col_spec(self):
+        return 'TIMESTAMP'
+
+    def bind_processor(self, dialect):
+        def process(value):
+            if value is None:
+                return None
+            elif isinstance(value, basestring):
+                return value
+            elif dialect.datetimeformat == 'internal':
+                ms = getattr(value, 'microsecond', 0)
+                return value.strftime("%Y%m%d%H%M%S" + ("%06u" % ms))
+            elif dialect.datetimeformat == 'iso':
+                ms = getattr(value, 'microsecond', 0)
+                return value.strftime("%Y-%m-%d %H:%M:%S." + ("%06u" % ms))
+            else:
+                raise exc.InvalidRequestError(
+                    "datetimeformat '%s' is not supported." % (
+                    dialect.datetimeformat,))
+        return process
+
+    def result_processor(self, dialect):
+        def process(value):
+            if value is None:
+                return None
+            elif dialect.datetimeformat == 'internal':
+                return datetime.datetime(
+                    *[int(v)
+                      for v in (value[0:4], value[4:6], value[6:8],
+                                value[8:10], value[10:12], value[12:14],
+                                value[14:])])
+            elif dialect.datetimeformat == 'iso':
+                return datetime.datetime(
+                    *[int(v)
+                      for v in (value[0:4], value[5:7], value[8:10],
+                                value[11:13], value[14:16], value[17:19],
+                                value[20:])])
+            else:
+                raise exc.InvalidRequestError(
+                    "datetimeformat '%s' is not supported." % (
+                    dialect.datetimeformat,))
+        return process
+
+
+class MaxDate(sqltypes.Date):
+    def get_col_spec(self):
+        return 'DATE'
+
+    def bind_processor(self, dialect):
+        def process(value):
+            if value is None:
+                return None
+            elif isinstance(value, basestring):
+                return value
+            elif dialect.datetimeformat == 'internal':
+                return value.strftime("%Y%m%d")
+            elif dialect.datetimeformat == 'iso':
+                return value.strftime("%Y-%m-%d")
+            else:
+                raise exc.InvalidRequestError(
+                    "datetimeformat '%s' is not supported." % (
+                    dialect.datetimeformat,))
+        return process
+
+    def result_processor(self, dialect):
+        def process(value):
+            if value is None:
+                return None
+            elif dialect.datetimeformat == 'internal':
+                return datetime.date(
+                    *[int(v) for v in (value[0:4], value[4:6], value[6:8])])
+            elif dialect.datetimeformat == 'iso':
+                return datetime.date(
+                    *[int(v) for v in (value[0:4], value[5:7], value[8:10])])
+            else:
+                raise exc.InvalidRequestError(
+                    "datetimeformat '%s' is not supported." % (
+                    dialect.datetimeformat,))
+        return process
+
+
+class MaxTime(sqltypes.Time):
+    def get_col_spec(self):
+        return 'TIME'
+
+    def bind_processor(self, dialect):
+        def process(value):
+            if value is None:
+                return None
+            elif isinstance(value, basestring):
+                return value
+            elif dialect.datetimeformat == 'internal':
+                return value.strftime("%H%M%S")
+            elif dialect.datetimeformat == 'iso':
+                return value.strftime("%H-%M-%S")
+            else:
+                raise exc.InvalidRequestError(
+                    "datetimeformat '%s' is not supported." % (
+                    dialect.datetimeformat,))
+        return process
+
+    def result_processor(self, dialect):
+        def process(value):
+            if value is None:
+                return None
+            elif dialect.datetimeformat == 'internal':
+                t = datetime.time(
+                    *[int(v) for v in (value[0:4], value[4:6], value[6:8])])
+                return t
+            elif dialect.datetimeformat == 'iso':
+                return datetime.time(
+                    *[int(v) for v in (value[0:4], value[5:7], value[8:10])])
+            else:
+                raise exc.InvalidRequestError(
+                    "datetimeformat '%s' is not supported." % (
+                    dialect.datetimeformat,))
+        return process
+
+
+class MaxBoolean(sqltypes.Boolean):
+    def get_col_spec(self):
+        return 'BOOLEAN'
+
+
+class MaxBlob(sqltypes.Binary):
+    def get_col_spec(self):
+        return 'LONG BYTE'
+
+    def bind_processor(self, dialect):
+        def process(value):
+            if value is None:
+                return None
+            else:
+                return str(value)
+        return process
+
+    def result_processor(self, dialect):
+        def process(value):
+            if value is None:
+                return None
+            else:
+                return value.read(value.remainingLength())
+        return process
+
+
+colspecs = {
+    sqltypes.Integer: MaxInteger,
+    sqltypes.Smallinteger: MaxSmallInteger,
+    sqltypes.Numeric: MaxNumeric,
+    sqltypes.Float: MaxFloat,
+    sqltypes.DateTime: MaxTimestamp,
+    sqltypes.Date: MaxDate,
+    sqltypes.Time: MaxTime,
+    sqltypes.String: MaxString,
+    sqltypes.Binary: MaxBlob,
+    sqltypes.Boolean: MaxBoolean,
+    sqltypes.Text: MaxText,
+    sqltypes.CHAR: MaxChar,
+    sqltypes.TIMESTAMP: MaxTimestamp,
+    sqltypes.BLOB: MaxBlob,
+    sqltypes.Unicode: MaxUnicode,
+    }
+
+ischema_names = {
+    'boolean': MaxBoolean,
+    'char': MaxChar,
+    'character': MaxChar,
+    'date': MaxDate,
+    'fixed': MaxNumeric,
+    'float': MaxFloat,
+    'int': MaxInteger,
+    'integer': MaxInteger,
+    'long binary': MaxBlob,
+    'long unicode': MaxText,
+    'long': MaxText,
+    'long': MaxText,
+    'smallint': MaxSmallInteger,
+    'time': MaxTime,
+    'timestamp': MaxTimestamp,
+    'varchar': MaxString,
+    }
+
+
+class MaxDBExecutionContext(default.DefaultExecutionContext):
+    def post_exec(self):
+        # DB-API bug: if there were any functions as values,
+        # then do another select and pull CURRVAL from the
+        # autoincrement column's implicit sequence... ugh
+        if self.compiled.isinsert and not self.executemany:
+            table = self.compiled.statement.table
+            index, serial_col = _autoserial_column(table)
+
+            if serial_col and (not self.compiled._safeserial or
+                               not(self._last_inserted_ids) or
+                               self._last_inserted_ids[index] in (None, 0)):
+                if table.schema:
+                    sql = "SELECT %s.CURRVAL FROM DUAL" % (
+                        self.compiled.preparer.format_table(table))
+                else:
+                    sql = "SELECT CURRENT_SCHEMA.%s.CURRVAL FROM DUAL" % (
+                        self.compiled.preparer.format_table(table))
+
+                if self.connection.engine._should_log_info:
+                    self.connection.engine.logger.info(sql)
+                rs = self.cursor.execute(sql)
+                id = rs.fetchone()[0]
+
+                if self.connection.engine._should_log_debug:
+                    self.connection.engine.logger.debug([id])
+                if not self._last_inserted_ids:
+                    # This shouldn't ever be > 1?  Right?
+                    self._last_inserted_ids = \
+                      [None] * len(table.primary_key.columns)
+                self._last_inserted_ids[index] = id
+
+        super(MaxDBExecutionContext, self).post_exec()
+
+    def get_result_proxy(self):
+        if self.cursor.description is not None:
+            for column in self.cursor.description:
+                if column[1] in ('Long Binary', 'Long', 'Long Unicode'):
+                    return MaxDBResultProxy(self)
+        return engine_base.ResultProxy(self)
+
+
+class MaxDBCachedColumnRow(engine_base.RowProxy):
+    """A RowProxy that only runs result_processors once per column."""
+
+    def __init__(self, parent, row):
+        super(MaxDBCachedColumnRow, self).__init__(parent, row)
+        self.columns = {}
+        self._row = row
+        self._parent = parent
+
+    def _get_col(self, key):
+        if key not in self.columns:
+            self.columns[key] = self._parent._get_col(self._row, key)
+        return self.columns[key]
+
+    def __iter__(self):
+        for i in xrange(len(self._row)):
+            yield self._get_col(i)
+
+    def __repr__(self):
+        return repr(list(self))
+
+    def __eq__(self, other):
+        return ((other is self) or
+                (other == tuple([self._get_col(key)
+                                 for key in xrange(len(self._row))])))
+    def __getitem__(self, key):
+        if isinstance(key, slice):
+            indices = key.indices(len(self._row))
+            return tuple([self._get_col(i) for i in xrange(*indices)])
+        else:
+            return self._get_col(key)
+
+    def __getattr__(self, name):
+        try:
+            return self._get_col(name)
+        except KeyError:
+            raise AttributeError(name)
+
+
+class MaxDBResultProxy(engine_base.ResultProxy):
+    _process_row = MaxDBCachedColumnRow
+
+
+class MaxDBDialect(default.DefaultDialect):
+    name = 'maxdb'
+    supports_alter = True
+    supports_unicode_statements = True
+    max_identifier_length = 32
+    supports_sane_rowcount = True
+    supports_sane_multi_rowcount = False
+    preexecute_pk_sequences = True
+
+    # MaxDB-specific
+    datetimeformat = 'internal'
+
+    def __init__(self, _raise_known_sql_errors=False, **kw):
+        super(MaxDBDialect, self).__init__(**kw)
+        self._raise_known = _raise_known_sql_errors
+
+        if self.dbapi is None:
+            self.dbapi_type_map = {}
+        else:
+            self.dbapi_type_map = {
+                'Long Binary': MaxBlob(),
+                'Long byte_t': MaxBlob(),
+                'Long Unicode': MaxText(),
+                'Timestamp': MaxTimestamp(),
+                'Date': MaxDate(),
+                'Time': MaxTime(),
+                datetime.datetime: MaxTimestamp(),
+                datetime.date: MaxDate(),
+                datetime.time: MaxTime(),
+            }
+
+    def dbapi(cls):
+        from sapdb import dbapi as _dbapi
+        return _dbapi
+    dbapi = classmethod(dbapi)
+
+    def create_connect_args(self, url):
+        opts = url.translate_connect_args(username='user')
+        opts.update(url.query)
+        return [], opts
+
+    def type_descriptor(self, typeobj):
+        if isinstance(typeobj, type):
+            typeobj = typeobj()
+        if isinstance(typeobj, sqltypes.Unicode):
+            return typeobj.adapt(MaxUnicode)
+        else:
+            return sqltypes.adapt_type(typeobj, colspecs)
+
+    def do_execute(self, cursor, statement, parameters, context=None):
+        res = cursor.execute(statement, parameters)
+        if isinstance(res, int) and context is not None:
+            context._rowcount = res
+
+    def do_release_savepoint(self, connection, name):
+        # Does MaxDB truly support RELEASE SAVEPOINT <id>?  All my attempts
+        # produce "SUBTRANS COMMIT/ROLLBACK not allowed without SUBTRANS
+        # BEGIN SQLSTATE: I7065"
+        # Note that ROLLBACK TO works fine.  In theory, a RELEASE should
+        # just free up some transactional resources early, before the overall
+        # COMMIT/ROLLBACK so omitting it should be relatively ok.
+        pass
+
+    def get_default_schema_name(self, connection):
+        try:
+            return self._default_schema_name
+        except AttributeError:
+            name = self.identifier_preparer._normalize_name(
+                connection.execute('SELECT CURRENT_SCHEMA FROM DUAL').scalar())
+            self._default_schema_name = name
+            return name
+
+    def has_table(self, connection, table_name, schema=None):
+        denormalize = self.identifier_preparer._denormalize_name
+        bind = [denormalize(table_name)]
+        if schema is None:
+            sql = ("SELECT tablename FROM TABLES "
+                   "WHERE TABLES.TABLENAME=? AND"
+                   "  TABLES.SCHEMANAME=CURRENT_SCHEMA ")
+        else:
+            sql = ("SELECT tablename FROM TABLES "
+                   "WHERE TABLES.TABLENAME = ? AND"
+                   "  TABLES.SCHEMANAME=? ")
+            bind.append(denormalize(schema))
+
+        rp = connection.execute(sql, bind)
+        found = bool(rp.fetchone())
+        rp.close()
+        return found
+
+    def table_names(self, connection, schema):
+        if schema is None:
+            sql = (" SELECT TABLENAME FROM TABLES WHERE "
+                   " SCHEMANAME=CURRENT_SCHEMA ")
+            rs = connection.execute(sql)
+        else:
+            sql = (" SELECT TABLENAME FROM TABLES WHERE "
+                   " SCHEMANAME=? ")
+            matchname = self.identifier_preparer._denormalize_name(schema)
+            rs = connection.execute(sql, matchname)
+        normalize = self.identifier_preparer._normalize_name
+        return [normalize(row[0]) for row in rs]
+
+    def reflecttable(self, connection, table, include_columns):
+        denormalize = self.identifier_preparer._denormalize_name
+        normalize = self.identifier_preparer._normalize_name
+
+        st = ('SELECT COLUMNNAME, MODE, DATATYPE, CODETYPE, LEN, DEC, '
+              '  NULLABLE, "DEFAULT", DEFAULTFUNCTION '
+              'FROM COLUMNS '
+              'WHERE TABLENAME=? AND SCHEMANAME=%s '
+              'ORDER BY POS')
+
+        fk = ('SELECT COLUMNNAME, FKEYNAME, '
+              '  REFSCHEMANAME, REFTABLENAME, REFCOLUMNNAME, RULE, '
+              '  (CASE WHEN REFSCHEMANAME = CURRENT_SCHEMA '
+              '   THEN 1 ELSE 0 END) AS in_schema '
+              'FROM FOREIGNKEYCOLUMNS '
+              'WHERE TABLENAME=? AND SCHEMANAME=%s '
+              'ORDER BY FKEYNAME ')
+
+        params = [denormalize(table.name)]
+        if not table.schema:
+            st = st % 'CURRENT_SCHEMA'
+            fk = fk % 'CURRENT_SCHEMA'
+        else:
+            st = st % '?'
+            fk = fk % '?'
+            params.append(denormalize(table.schema))
+
+        rows = connection.execute(st, params).fetchall()
+        if not rows:
+            raise exc.NoSuchTableError(table.fullname)
+
+        include_columns = set(include_columns or [])
+
+        for row in rows:
+            (name, mode, col_type, encoding, length, scale,
+             nullable, constant_def, func_def) = row
+
+            name = normalize(name)
+
+            if include_columns and name not in include_columns:
+                continue
+
+            type_args, type_kw = [], {}
+            if col_type == 'FIXED':
+                type_args = length, scale
+                # Convert FIXED(10) DEFAULT SERIAL to our Integer
+                if (scale == 0 and
+                    func_def is not None and func_def.startswith('SERIAL')):
+                    col_type = 'INTEGER'
+                    type_args = length,
+            elif col_type in 'FLOAT':
+                type_args = length,
+            elif col_type in ('CHAR', 'VARCHAR'):
+                type_args = length,
+                type_kw['encoding'] = encoding
+            elif col_type == 'LONG':
+                type_kw['encoding'] = encoding
+
+            try:
+                type_cls = ischema_names[col_type.lower()]
+                type_instance = type_cls(*type_args, **type_kw)
+            except KeyError:
+                util.warn("Did not recognize type '%s' of column '%s'" %
+                          (col_type, name))
+                type_instance = sqltypes.NullType
+
+            col_kw = {'autoincrement': False}
+            col_kw['nullable'] = (nullable == 'YES')
+            col_kw['primary_key'] = (mode == 'KEY')
+
+            if func_def is not None:
+                if func_def.startswith('SERIAL'):
+                    if col_kw['primary_key']:
+                        # No special default- let the standard autoincrement
+                        # support handle SERIAL pk columns.
+                        col_kw['autoincrement'] = True
+                    else:
+                        # strip current numbering
+                        col_kw['server_default'] = schema.DefaultClause(
+                            sql.text('SERIAL'))
+                        col_kw['autoincrement'] = True
+                else:
+                    col_kw['server_default'] = schema.DefaultClause(
+                        sql.text(func_def))
+            elif constant_def is not None:
+                col_kw['server_default'] = schema.DefaultClause(sql.text(
+                    "'%s'" % constant_def.replace("'", "''")))
+
+            table.append_column(schema.Column(name, type_instance, **col_kw))
+
+        fk_sets = itertools.groupby(connection.execute(fk, params),
+                                    lambda row: row.FKEYNAME)
+        for fkeyname, fkey in fk_sets:
+            fkey = list(fkey)
+            if include_columns:
+                key_cols = set([r.COLUMNNAME for r in fkey])
+                if key_cols != include_columns:
+                    continue
+
+            columns, referants = [], []
+            quote = self.identifier_preparer._maybe_quote_identifier
+
+            for row in fkey:
+                columns.append(normalize(row.COLUMNNAME))
+                if table.schema or not row.in_schema:
+                    referants.append('.'.join(
+                        [quote(normalize(row[c]))
+                         for c in ('REFSCHEMANAME', 'REFTABLENAME',
+                                   'REFCOLUMNNAME')]))
+                else:
+                    referants.append('.'.join(
+                        [quote(normalize(row[c]))
+                         for c in ('REFTABLENAME', 'REFCOLUMNNAME')]))
+
+            constraint_kw = {'name': fkeyname.lower()}
+            if fkey[0].RULE is not None:
+                rule = fkey[0].RULE
+                if rule.startswith('DELETE '):
+                    rule = rule[7:]
+                constraint_kw['ondelete'] = rule
+
+            table_kw = {}
+            if table.schema or not row.in_schema:
+                table_kw['schema'] = normalize(fkey[0].REFSCHEMANAME)
+
+            ref_key = schema._get_table_key(normalize(fkey[0].REFTABLENAME),
+                                            table_kw.get('schema'))
+            if ref_key not in table.metadata.tables:
+                schema.Table(normalize(fkey[0].REFTABLENAME),
+                             table.metadata,
+                             autoload=True, autoload_with=connection,
+                             **table_kw)
+
+            constraint = schema.ForeignKeyConstraint(columns, referants, link_to_name=True,
+                                                     **constraint_kw)
+            table.append_constraint(constraint)
+
+    def has_sequence(self, connection, name):
+        # [ticket:726] makes this schema-aware.
+        denormalize = self.identifier_preparer._denormalize_name
+        sql = ("SELECT sequence_name FROM SEQUENCES "
+               "WHERE SEQUENCE_NAME=? ")
+
+        rp = connection.execute(sql, denormalize(name))
+        found = bool(rp.fetchone())
+        rp.close()
+        return found
+
+
+class MaxDBCompiler(compiler.DefaultCompiler):
+    operators = compiler.DefaultCompiler.operators.copy()
+    operators[sql_operators.mod] = lambda x, y: 'mod(%s, %s)' % (x, y)
+
+    function_conversion = {
+        'CURRENT_DATE': 'DATE',
+        'CURRENT_TIME': 'TIME',
+        'CURRENT_TIMESTAMP': 'TIMESTAMP',
+        }
+
+    # These functions must be written without parens when called with no
+    # parameters.  e.g. 'SELECT DATE FROM DUAL' not 'SELECT DATE() FROM DUAL'
+    bare_functions = set([
+        'CURRENT_SCHEMA', 'DATE', 'FALSE', 'SYSDBA', 'TIME', 'TIMESTAMP',
+        'TIMEZONE', 'TRANSACTION', 'TRUE', 'USER', 'UID', 'USERGROUP',
+        'UTCDATE', 'UTCDIFF'])
+
+    def default_from(self):
+        return ' FROM DUAL'
+
+    def for_update_clause(self, select):
+        clause = select.for_update
+        if clause is True:
+            return " WITH LOCK EXCLUSIVE"
+        elif clause is None:
+            return ""
+        elif clause == "read":
+            return " WITH LOCK"
+        elif clause == "ignore":
+            return " WITH LOCK (IGNORE) EXCLUSIVE"
+        elif clause == "nowait":
+            return " WITH LOCK (NOWAIT) EXCLUSIVE"
+        elif isinstance(clause, basestring):
+            return " WITH LOCK %s" % clause.upper()
+        elif not clause:
+            return ""
+        else:
+            return " WITH LOCK EXCLUSIVE"
+
+    def apply_function_parens(self, func):
+        if func.name.upper() in self.bare_functions:
+            return len(func.clauses) > 0
+        else:
+            return True
+
+    def visit_function(self, fn, **kw):
+        transform = self.function_conversion.get(fn.name.upper(), None)
+        if transform:
+            fn = fn._clone()
+            fn.name = transform
+        return super(MaxDBCompiler, self).visit_function(fn, **kw)
+
+    def visit_cast(self, cast, **kwargs):
+        # MaxDB only supports casts * to NUMERIC, * to VARCHAR or
+        # date/time to VARCHAR.  Casts of LONGs will fail.
+        if isinstance(cast.type, (sqltypes.Integer, sqltypes.Numeric)):
+            return "NUM(%s)" % self.process(cast.clause)
+        elif isinstance(cast.type, sqltypes.String):
+            return "CHR(%s)" % self.process(cast.clause)
+        else:
+            return self.process(cast.clause)
+
+    def visit_sequence(self, sequence):
+        if sequence.optional:
+            return None
+        else:
+            return (self.dialect.identifier_preparer.format_sequence(sequence) +
+                    ".NEXTVAL")
+
+    class ColumnSnagger(visitors.ClauseVisitor):
+        def __init__(self):
+            self.count = 0
+            self.column = None
+        def visit_column(self, column):
+            self.column = column
+            self.count += 1
+
+    def _find_labeled_columns(self, columns, use_labels=False):
+        labels = {}
+        for column in columns:
+            if isinstance(column, basestring):
+                continue
+            snagger = self.ColumnSnagger()
+            snagger.traverse(column)
+            if snagger.count == 1:
+                if isinstance(column, sql_expr._Label):
+                    labels[unicode(snagger.column)] = column.name
+                elif use_labels:
+                    labels[unicode(snagger.column)] = column._label
+
+        return labels
+
+    def order_by_clause(self, select):
+        order_by = self.process(select._order_by_clause)
+
+        # ORDER BY clauses in DISTINCT queries must reference aliased
+        # inner columns by alias name, not true column name.
+        if order_by and getattr(select, '_distinct', False):
+            labels = self._find_labeled_columns(select.inner_columns,
+                                                select.use_labels)
+            if labels:
+                for needs_alias in labels.keys():
+                    r = re.compile(r'(^| )(%s)(,| |$)' %
+                                   re.escape(needs_alias))
+                    order_by = r.sub((r'\1%s\3' % labels[needs_alias]),
+                                     order_by)
+
+        # No ORDER BY in subqueries.
+        if order_by:
+            if self.is_subquery():
+                # It's safe to simply drop the ORDER BY if there is no
+                # LIMIT.  Right?  Other dialects seem to get away with
+                # dropping order.
+                if select._limit:
+                    raise exc.InvalidRequestError(
+                        "MaxDB does not support ORDER BY in subqueries")
+                else:
+                    return ""
+            return " ORDER BY " + order_by
+        else:
+            return ""
+
+    def get_select_precolumns(self, select):
+        # Convert a subquery's LIMIT to TOP
+        sql = select._distinct and 'DISTINCT ' or ''
+        if self.is_subquery() and select._limit:
+            if select._offset:
+                raise exc.InvalidRequestError(
+                    'MaxDB does not support LIMIT with an offset.')
+            sql += 'TOP %s ' % select._limit
+        return sql
+
+    def limit_clause(self, select):
+        # The docs say offsets are supported with LIMIT.  But they're not.
+        # TODO: maybe emulate by adding a ROWNO/ROWNUM predicate?
+        if self.is_subquery():
+            # sub queries need TOP
+            return ''
+        elif select._offset:
+            raise exc.InvalidRequestError(
+                'MaxDB does not support LIMIT with an offset.')
+        else:
+            return ' \n LIMIT %s' % (select._limit,)
+
+    def visit_insert(self, insert):
+        self.isinsert = True
+        self._safeserial = True
+
+        colparams = self._get_colparams(insert)
+        for value in (insert.parameters or {}).itervalues():
+            if isinstance(value, sql_expr.Function):
+                self._safeserial = False
+                break
+
+        return ''.join(('INSERT INTO ',
+                         self.preparer.format_table(insert.table),
+                         ' (',
+                         ', '.join([self.preparer.format_column(c[0])
+                                    for c in colparams]),
+                         ') VALUES (',
+                         ', '.join([c[1] for c in colparams]),
+                         ')'))
+
+
+class MaxDBDefaultRunner(engine_base.DefaultRunner):
+    def visit_sequence(self, seq):
+        if seq.optional:
+            return None
+        return self.execute_string("SELECT %s.NEXTVAL FROM DUAL" % (
+            self.dialect.identifier_preparer.format_sequence(seq)))
+
+
+class MaxDBIdentifierPreparer(compiler.IdentifierPreparer):
+    reserved_words = set([
+        'abs', 'absolute', 'acos', 'adddate', 'addtime', 'all', 'alpha',
+        'alter', 'any', 'ascii', 'asin', 'atan', 'atan2', 'avg', 'binary',
+        'bit', 'boolean', 'byte', 'case', 'ceil', 'ceiling', 'char',
+        'character', 'check', 'chr', 'column', 'concat', 'constraint', 'cos',
+        'cosh', 'cot', 'count', 'cross', 'curdate', 'current', 'curtime',
+        'database', 'date', 'datediff', 'day', 'dayname', 'dayofmonth',
+        'dayofweek', 'dayofyear', 'dec', 'decimal', 'decode', 'default',
+        'degrees', 'delete', 'digits', 'distinct', 'double', 'except',
+        'exists', 'exp', 'expand', 'first', 'fixed', 'float', 'floor', 'for',
+        'from', 'full', 'get_objectname', 'get_schema', 'graphic', 'greatest',
+        'group', 'having', 'hex', 'hextoraw', 'hour', 'ifnull', 'ignore',
+        'index', 'initcap', 'inner', 'insert', 'int', 'integer', 'internal',
+        'intersect', 'into', 'join', 'key', 'last', 'lcase', 'least', 'left',
+        'length', 'lfill', 'list', 'ln', 'locate', 'log', 'log10', 'long',
+        'longfile', 'lower', 'lpad', 'ltrim', 'makedate', 'maketime',
+        'mapchar', 'max', 'mbcs', 'microsecond', 'min', 'minute', 'mod',
+        'month', 'monthname', 'natural', 'nchar', 'next', 'no', 'noround',
+        'not', 'now', 'null', 'num', 'numeric', 'object', 'of', 'on',
+        'order', 'packed', 'pi', 'power', 'prev', 'primary', 'radians',
+        'real', 'reject', 'relative', 'replace', 'rfill', 'right', 'round',
+        'rowid', 'rowno', 'rpad', 'rtrim', 'second', 'select', 'selupd',
+        'serial', 'set', 'show', 'sign', 'sin', 'sinh', 'smallint', 'some',
+        'soundex', 'space', 'sqrt', 'stamp', 'statistics', 'stddev',
+        'subdate', 'substr', 'substring', 'subtime', 'sum', 'sysdba',
+        'table', 'tan', 'tanh', 'time', 'timediff', 'timestamp', 'timezone',
+        'to', 'toidentifier', 'transaction', 'translate', 'trim', 'trunc',
+        'truncate', 'ucase', 'uid', 'unicode', 'union', 'update', 'upper',
+        'user', 'usergroup', 'using', 'utcdate', 'utcdiff', 'value', 'values',
+        'varchar', 'vargraphic', 'variance', 'week', 'weekofyear', 'when',
+        'where', 'with', 'year', 'zoned' ])
+
+    def _normalize_name(self, name):
+        if name is None:
+            return None
+        if name.isupper():
+            lc_name = name.lower()
+            if not self._requires_quotes(lc_name):
+                return lc_name
+        return name
+
+    def _denormalize_name(self, name):
+        if name is None:
+            return None
+        elif (name.islower() and
+              not self._requires_quotes(name)):
+            return name.upper()
+        else:
+            return name
+
+    def _maybe_quote_identifier(self, name):
+        if self._requires_quotes(name):
+            return self.quote_identifier(name)
+        else:
+            return name
+
+
+class MaxDBSchemaGenerator(compiler.SchemaGenerator):
+    def get_column_specification(self, column, **kw):
+        colspec = [self.preparer.format_column(column),
+                   column.type.dialect_impl(self.dialect).get_col_spec()]
+
+        if not column.nullable:
+            colspec.append('NOT NULL')
+
+        default = column.default
+        default_str = self.get_column_default_string(column)
+
+        # No DDL default for columns specified with non-optional sequence-
+        # this defaulting behavior is entirely client-side. (And as a
+        # consequence, non-reflectable.)
+        if (default and isinstance(default, schema.Sequence) and
+            not default.optional):
+            pass
+        # Regular default
+        elif default_str is not None:
+            colspec.append('DEFAULT %s' % default_str)
+        # Assign DEFAULT SERIAL heuristically
+        elif column.primary_key and column.autoincrement:
+            # For SERIAL on a non-primary key member, use
+            # DefaultClause(text('SERIAL'))
+            try:
+                first = [c for c in column.table.primary_key.columns
+                         if (c.autoincrement and
+                             (isinstance(c.type, sqltypes.Integer) or
+                              (isinstance(c.type, MaxNumeric) and
+                               c.type.precision)) and
+                             not c.foreign_keys)].pop(0)
+                if column is first:
+                    colspec.append('DEFAULT SERIAL')
+            except IndexError:
+                pass
+        return ' '.join(colspec)
+
+    def get_column_default_string(self, column):
+        if isinstance(column.server_default, schema.DefaultClause):
+            if isinstance(column.default.arg, basestring):
+                if isinstance(column.type, sqltypes.Integer):
+                    return str(column.default.arg)
+                else:
+                    return "'%s'" % column.default.arg
+            else:
+                return unicode(self._compile(column.default.arg, None))
+        else:
+            return None
+
+    def visit_sequence(self, sequence):
+        """Creates a SEQUENCE.
+
+        TODO: move to module doc?
+
+        start
+          With an integer value, set the START WITH option.
+
+        increment
+          An integer value to increment by.  Default is the database default.
+
+        maxdb_minvalue
+        maxdb_maxvalue
+          With an integer value, sets the corresponding sequence option.
+
+        maxdb_no_minvalue
+        maxdb_no_maxvalue
+          Defaults to False.  If true, sets the corresponding sequence option.
+
+        maxdb_cycle
+          Defaults to False.  If true, sets the CYCLE option.
+
+        maxdb_cache
+          With an integer value, sets the CACHE option.
+
+        maxdb_no_cache
+          Defaults to False.  If true, sets NOCACHE.
+        """
+
+        if (not sequence.optional and
+            (not self.checkfirst or
+             not self.dialect.has_sequence(self.connection, sequence.name))):
+
+            ddl = ['CREATE SEQUENCE',
+                   self.preparer.format_sequence(sequence)]
+
+            sequence.increment = 1
+
+            if sequence.increment is not None:
+                ddl.extend(('INCREMENT BY', str(sequence.increment)))
+
+            if sequence.start is not None:
+                ddl.extend(('START WITH', str(sequence.start)))
+
+            opts = dict([(pair[0][6:].lower(), pair[1])
+                         for pair in sequence.kwargs.items()
+                         if pair[0].startswith('maxdb_')])
+
+            if 'maxvalue' in opts:
+                ddl.extend(('MAXVALUE', str(opts['maxvalue'])))
+            elif opts.get('no_maxvalue', False):
+                ddl.append('NOMAXVALUE')
+            if 'minvalue' in opts:
+                ddl.extend(('MINVALUE', str(opts['minvalue'])))
+            elif opts.get('no_minvalue', False):
+                ddl.append('NOMINVALUE')
+
+            if opts.get('cycle', False):
+                ddl.append('CYCLE')
+
+            if 'cache' in opts:
+                ddl.extend(('CACHE', str(opts['cache'])))
+            elif opts.get('no_cache', False):
+                ddl.append('NOCACHE')
+
+            self.append(' '.join(ddl))
+            self.execute()
+
+
+class MaxDBSchemaDropper(compiler.SchemaDropper):
+    def visit_sequence(self, sequence):
+        if (not sequence.optional and
+            (not self.checkfirst or
+             self.dialect.has_sequence(self.connection, sequence.name))):
+            self.append("DROP SEQUENCE %s" %
+                        self.preparer.format_sequence(sequence))
+            self.execute()
+
+
+def _autoserial_column(table):
+    """Finds the effective DEFAULT SERIAL column of a Table, if any."""
+
+    for index, col in enumerate(table.primary_key.columns):
+        if (isinstance(col.type, (sqltypes.Integer, sqltypes.Numeric)) and
+            col.autoincrement):
+            if isinstance(col.default, schema.Sequence):
+                if col.default.optional:
+                    return index, col
+            elif (col.default is None or
+                  (not isinstance(col.server_default, schema.DefaultClause))):
+                return index, col
+
+    return None, None
+
+dialect = MaxDBDialect
+dialect.preparer = MaxDBIdentifierPreparer
+dialect.statement_compiler = MaxDBCompiler
+dialect.schemagenerator = MaxDBSchemaGenerator
+dialect.schemadropper = MaxDBSchemaDropper
+dialect.defaultrunner = MaxDBDefaultRunner
+dialect.execution_ctx_cls = MaxDBExecutionContext
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/databases/mxODBC.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/databases/mxODBC.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/databases/mxODBC.py (revision 3)
@@ -0,0 +1,60 @@
+# mxODBC.py
+# Copyright (C) 2007 Fisch Asset Management AG http://www.fam.ch
+# Coding: Alexander Houben alexander.houben@thor-solutions.ch
+#
+# This module is part of SQLAlchemy and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+"""
+A wrapper for a mx.ODBC.Windows DB-API connection.
+
+Makes sure the mx module is configured to return datetime objects instead
+of mx.DateTime.DateTime objects.
+"""
+
+from mx.ODBC.Windows import *
+
+
+class Cursor:
+    def __init__(self, cursor):
+        self.cursor = cursor
+
+    def __getattr__(self, attr):
+        res = getattr(self.cursor, attr)
+        return res
+
+    def execute(self, *args, **kwargs):
+        res = self.cursor.execute(*args, **kwargs)
+        return res
+
+
+class Connection:
+    def myErrorHandler(self, connection, cursor, errorclass, errorvalue):
+        err0, err1, err2, err3 = errorvalue
+        #print ", ".join(["Err%d: %s"%(x, errorvalue[x]) for x in range(4)])
+        if int(err1) == 109:
+            # Ignore "Null value eliminated in aggregate function", this is not an error
+            return
+        raise errorclass, errorvalue
+
+    def __init__(self, conn):
+        self.conn = conn
+        # install a mx ODBC error handler
+        self.conn.errorhandler = self.myErrorHandler
+
+    def __getattr__(self, attr):
+        res = getattr(self.conn, attr)
+        return res
+
+    def cursor(self, *args, **kwargs):
+        res = Cursor(self.conn.cursor(*args, **kwargs))
+        return res
+
+
+# override 'connect' call
+def connect(*args, **kwargs):
+    import mx.ODBC.Windows
+    conn = mx.ODBC.Windows.Connect(*args, **kwargs)
+    conn.datetimeformat = mx.ODBC.Windows.PYDATETIME_DATETIMEFORMAT
+    return Connection(conn)
+Connect = connect
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/databases/__init__.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/databases/__init__.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/databases/__init__.py (revision 3)
@@ -0,0 +1,19 @@
+# __init__.py
+# Copyright (C) 2005, 2006, 2007, 2008, 2009 Michael Bayer mike_mp@zzzcomputing.com
+#
+# This module is part of SQLAlchemy and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+
+__all__ = (
+    'access',
+    'firebird',
+    'informix',
+    'maxdb',
+    'mssql',
+    'mysql',
+    'oracle',
+    'postgres',
+    'sqlite',
+    'sybase',
+    )
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/databases/mssql.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/databases/mssql.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/databases/mssql.py (revision 3)
@@ -0,0 +1,1771 @@
+# mssql.py
+
+"""Support for the Microsoft SQL Server database.
+
+Driver
+------
+
+The MSSQL dialect will work with three different available drivers:
+
+* *pyodbc* - http://pyodbc.sourceforge.net/. This is the recommeded
+  driver.
+
+* *pymssql* - http://pymssql.sourceforge.net/
+
+* *adodbapi* - http://adodbapi.sourceforge.net/
+
+Drivers are loaded in the order listed above based on availability.
+
+If you need to load a specific driver pass ``module_name`` when
+creating the engine::
+
+    engine = create_engine('mssql://dsn', module_name='pymssql')
+
+``module_name`` currently accepts: ``pyodbc``, ``pymssql``, and
+``adodbapi``.
+
+Currently the pyodbc driver offers the greatest level of
+compatibility.
+
+Connecting
+----------
+
+Connecting with create_engine() uses the standard URL approach of
+``mssql://user:pass@host/dbname[?key=value&key=value...]``.
+
+If the database name is present, the tokens are converted to a
+connection string with the specified values. If the database is not
+present, then the host token is taken directly as the DSN name.
+
+Examples of pyodbc connection string URLs:
+
+* *mssql://mydsn* - connects using the specified DSN named ``mydsn``.
+  The connection string that is created will appear like::
+
+    dsn=mydsn;Trusted_Connection=Yes
+
+* *mssql://user:pass@mydsn* - connects using the DSN named
+  ``mydsn`` passing in the ``UID`` and ``PWD`` information. The
+  connection string that is created will appear like::
+
+    dsn=mydsn;UID=user;PWD=pass
+
+* *mssql://user:pass@mydsn/?LANGUAGE=us_english* - connects
+  using the DSN named ``mydsn`` passing in the ``UID`` and ``PWD``
+  information, plus the additional connection configuration option
+  ``LANGUAGE``. The connection string that is created will appear
+  like::
+
+    dsn=mydsn;UID=user;PWD=pass;LANGUAGE=us_english
+
+* *mssql://user:pass@host/db* - connects using a connection string
+  dynamically created that would appear like::
+
+    DRIVER={SQL Server};Server=host;Database=db;UID=user;PWD=pass
+
+* *mssql://user:pass@host:123/db* - connects using a connection
+  string that is dynamically created, which also includes the port
+  information using the comma syntax. If your connection string
+  requires the port information to be passed as a ``port`` keyword
+  see the next example. This will create the following connection
+  string::
+
+    DRIVER={SQL Server};Server=host,123;Database=db;UID=user;PWD=pass
+
+* *mssql://user:pass@host/db?port=123* - connects using a connection
+  string that is dynamically created that includes the port
+  information as a separate ``port`` keyword. This will create the
+  following connection string::
+
+    DRIVER={SQL Server};Server=host;Database=db;UID=user;PWD=pass;port=123
+
+If you require a connection string that is outside the options
+presented above, use the ``odbc_connect`` keyword to pass in a
+urlencoded connection string. What gets passed in will be urldecoded
+and passed directly.
+
+For example::
+
+    mssql:///?odbc_connect=dsn%3Dmydsn%3BDatabase%3Ddb
+
+would create the following connection string::
+
+    dsn=mydsn;Database=db
+
+Encoding your connection string can be easily accomplished through
+the python shell. For example::
+
+    >>> import urllib
+    >>> urllib.quote_plus('dsn=mydsn;Database=db')
+    'dsn%3Dmydsn%3BDatabase%3Ddb'
+
+Additional arguments which may be specified either as query string
+arguments on the URL, or as keyword argument to
+:func:`~sqlalchemy.create_engine()` are:
+
+* *auto_identity_insert* - enables support for IDENTITY inserts by
+  automatically turning IDENTITY INSERT ON and OFF as required.
+  Defaults to ``True``.
+
+* *query_timeout* - allows you to override the default query timeout.
+  Defaults to ``None``. This is only supported on pymssql.
+
+* *text_as_varchar* - if enabled this will treat all TEXT column
+  types as their equivalent VARCHAR(max) type. This is often used if
+  you need to compare a VARCHAR to a TEXT field, which is not
+  supported directly on MSSQL. Defaults to ``False``.
+
+* *use_scope_identity* - allows you to specify that SCOPE_IDENTITY
+  should be used in place of the non-scoped version @@IDENTITY.
+  Defaults to ``False``. On pymssql this defaults to ``True``, and on
+  pyodbc this defaults to ``True`` if the version of pyodbc being
+  used supports it.
+
+* *has_window_funcs* - indicates whether or not window functions
+  (LIMIT and OFFSET) are supported on the version of MSSQL being
+  used. If you're running MSSQL 2005 or later turn this on to get
+  OFFSET support. Defaults to ``False``.
+
+* *max_identifier_length* - allows you to se the maximum length of
+  identfiers supported by the database. Defaults to 128. For pymssql
+  the default is 30.
+
+* *schema_name* - use to set the schema name. Defaults to ``dbo``.
+
+Auto Increment Behavior
+-----------------------
+
+``IDENTITY`` columns are supported by using SQLAlchemy
+``schema.Sequence()`` objects. In other words::
+
+    Table('test', mss_engine,
+           Column('id', Integer,
+                  Sequence('blah',100,10), primary_key=True),
+           Column('name', String(20))
+         ).create()
+
+would yield::
+
+   CREATE TABLE test (
+     id INTEGER NOT NULL IDENTITY(100,10) PRIMARY KEY,
+     name VARCHAR(20) NULL,
+     )
+
+Note that the ``start`` and ``increment`` values for sequences are
+optional and will default to 1,1.
+
+* Support for ``SET IDENTITY_INSERT ON`` mode (automagic on / off for
+  ``INSERT`` s)
+
+* Support for auto-fetching of ``@@IDENTITY/@@SCOPE_IDENTITY()`` on
+  ``INSERT``
+
+Collation Support
+-----------------
+
+MSSQL specific string types support a collation parameter that
+creates a column-level specific collation for the column. The
+collation parameter accepts a Windows Collation Name or a SQL
+Collation Name. Supported types are MSChar, MSNChar, MSString,
+MSNVarchar, MSText, and MSNText. For example::
+
+    Column('login', String(32, collation='Latin1_General_CI_AS'))
+
+will yield::
+
+    login VARCHAR(32) COLLATE Latin1_General_CI_AS NULL
+
+LIMIT/OFFSET Support
+--------------------
+
+MSSQL has no support for the LIMIT or OFFSET keysowrds. LIMIT is
+supported directly through the ``TOP`` Transact SQL keyword::
+
+    select.limit
+
+will yield::
+
+    SELECT TOP n
+
+If the ``has_window_funcs`` flag is set then LIMIT with OFFSET
+support is available through the ``ROW_NUMBER OVER`` construct. This
+construct requires an ``ORDER BY`` to be specified as well and is
+only available on MSSQL 2005 and later.
+
+Nullability
+-----------
+MSSQL has support for three levels of column nullability. The default
+nullability allows nulls and is explicit in the CREATE TABLE
+construct::
+
+    name VARCHAR(20) NULL
+
+If ``nullable=None`` is specified then no specification is made. In
+other words the database's configured default is used. This will
+render::
+
+    name VARCHAR(20)
+
+If ``nullable`` is ``True`` or ``False`` then the column will be
+``NULL` or ``NOT NULL`` respectively.
+
+Date / Time Handling
+--------------------
+For MSSQL versions that support the ``DATE`` and ``TIME`` types
+(MSSQL 2008+) the data type is used. For versions that do not
+support the ``DATE`` and ``TIME`` types a ``DATETIME`` type is used
+instead and the MSSQL dialect handles converting the results
+properly. This means ``Date()`` and ``Time()`` are fully supported
+on all versions of MSSQL. If you do not desire this behavior then
+do not use the ``Date()`` or ``Time()`` types.
+
+Compatibility Levels
+--------------------
+MSSQL supports the notion of setting compatibility levels at the
+database level. This allows, for instance, to run a database that
+is compatibile with SQL2000 while running on a SQL2005 database
+server. ``server_version_info`` will always retrun the database
+server version information (in this case SQL2005) and not the
+compatibiility level information. Because of this, if running under
+a backwards compatibility mode SQAlchemy may attempt to use T-SQL
+statements that are unable to be parsed by the database server.
+
+Known Issues
+------------
+
+* No support for more than one ``IDENTITY`` column per table
+
+* pymssql has problems with binary and unicode data that this module
+  does **not** work around
+
+"""
+import datetime, decimal, inspect, operator, re, sys, urllib
+
+from sqlalchemy import sql, schema, exc, util
+from sqlalchemy import Table, MetaData, Column, ForeignKey, String, Integer
+from sqlalchemy.sql import select, compiler, expression, operators as sql_operators, functions as sql_functions
+from sqlalchemy.engine import default, base
+from sqlalchemy import types as sqltypes
+from decimal import Decimal as _python_Decimal
+
+
+RESERVED_WORDS = set(
+    ['add', 'all', 'alter', 'and', 'any', 'as', 'asc', 'authorization',
+     'backup', 'begin', 'between', 'break', 'browse', 'bulk', 'by', 'cascade',
+     'case', 'check', 'checkpoint', 'close', 'clustered', 'coalesce',
+     'collate', 'column', 'commit', 'compute', 'constraint', 'contains',
+     'containstable', 'continue', 'convert', 'create', 'cross', 'current',
+     'current_date', 'current_time', 'current_timestamp', 'current_user',
+     'cursor', 'database', 'dbcc', 'deallocate', 'declare', 'default',
+     'delete', 'deny', 'desc', 'disk', 'distinct', 'distributed', 'double',
+     'drop', 'dump', 'else', 'end', 'errlvl', 'escape', 'except', 'exec',
+     'execute', 'exists', 'exit', 'external', 'fetch', 'file', 'fillfactor',
+     'for', 'foreign', 'freetext', 'freetexttable', 'from', 'full',
+     'function', 'goto', 'grant', 'group', 'having', 'holdlock', 'identity',
+     'identity_insert', 'identitycol', 'if', 'in', 'index', 'inner', 'insert',
+     'intersect', 'into', 'is', 'join', 'key', 'kill', 'left', 'like',
+     'lineno', 'load', 'merge', 'national', 'nocheck', 'nonclustered', 'not',
+     'null', 'nullif', 'of', 'off', 'offsets', 'on', 'open', 'opendatasource',
+     'openquery', 'openrowset', 'openxml', 'option', 'or', 'order', 'outer',
+     'over', 'percent', 'pivot', 'plan', 'precision', 'primary', 'print',
+     'proc', 'procedure', 'public', 'raiserror', 'read', 'readtext',
+     'reconfigure', 'references', 'replication', 'restore', 'restrict',
+     'return', 'revert', 'revoke', 'right', 'rollback', 'rowcount',
+     'rowguidcol', 'rule', 'save', 'schema', 'securityaudit', 'select',
+     'session_user', 'set', 'setuser', 'shutdown', 'some', 'statistics',
+     'system_user', 'table', 'tablesample', 'textsize', 'then', 'to', 'top',
+     'tran', 'transaction', 'trigger', 'truncate', 'tsequal', 'union',
+     'unique', 'unpivot', 'update', 'updatetext', 'use', 'user', 'values',
+     'varying', 'view', 'waitfor', 'when', 'where', 'while', 'with',
+     'writetext',
+    ])
+
+
+class _StringType(object):
+    """Base for MSSQL string types."""
+
+    def __init__(self, collation=None, **kwargs):
+        self.collation = kwargs.get('collate', collation)
+
+    def _extend(self, spec):
+        """Extend a string-type declaration with standard SQL
+        COLLATE annotations.
+        """
+
+        if self.collation:
+            collation = 'COLLATE %s' % self.collation
+        else:
+            collation = None
+
+        return ' '.join([c for c in (spec, collation)
+                         if c is not None])
+
+    def __repr__(self):
+        attributes = inspect.getargspec(self.__init__)[0][1:]
+        attributes.extend(inspect.getargspec(_StringType.__init__)[0][1:])
+
+        params = {}
+        for attr in attributes:
+            val = getattr(self, attr)
+            if val is not None and val is not False:
+                params[attr] = val
+
+        return "%s(%s)" % (self.__class__.__name__,
+                           ', '.join(['%s=%r' % (k, params[k]) for k in params]))
+
+    def bind_processor(self, dialect):
+        if self.convert_unicode or dialect.convert_unicode:
+            if self.assert_unicode is None:
+                assert_unicode = dialect.assert_unicode
+            else:
+                assert_unicode = self.assert_unicode
+
+            if not assert_unicode:
+                return None
+
+            def process(value):
+                if not isinstance(value, (unicode, sqltypes.NoneType)):
+                    if assert_unicode == 'warn':
+                        util.warn("Unicode type received non-unicode bind "
+                                  "param value %r" % value)
+                        return value
+                    else:
+                        raise exc.InvalidRequestError("Unicode type received non-unicode bind param value %r" % value)
+                else:
+                    return value
+            return process
+        else:
+            return None
+
+
+class MSNumeric(sqltypes.Numeric):
+    def result_processor(self, dialect):
+        if self.asdecimal:
+            def process(value):
+                if value is not None:
+                    return _python_Decimal(str(value))
+                else:
+                    return value
+            return process
+        else:
+            def process(value):
+                return float(value)
+            return process
+
+    def bind_processor(self, dialect):
+        def process(value):
+            if value is None:
+                # Not sure that this exception is needed
+                return value
+
+            elif isinstance(value, decimal.Decimal):
+                if value.adjusted() < 0:
+                    result = "%s0.%s%s" % (
+                            (value < 0 and '-' or ''),
+                            '0' * (abs(value.adjusted()) - 1),
+                            "".join([str(nint) for nint in value._int]))
+
+                else:
+                    if 'E' in str(value):
+                        result = "%s%s%s" % (
+                                (value < 0 and '-' or ''),
+                                "".join([str(s) for s in value._int]),
+                                "0" * (value.adjusted() - (len(value._int)-1)))
+                    else:
+                        if (len(value._int) - 1) > value.adjusted():
+                            result = "%s%s.%s" % (
+                                    (value < 0 and '-' or ''),
+                                    "".join([str(s) for s in value._int][0:value.adjusted() + 1]),
+                                    "".join([str(s) for s in value._int][value.adjusted() + 1:]))
+                        else:
+                            result = "%s%s" % (
+                                    (value < 0 and '-' or ''),
+                                    "".join([str(s) for s in value._int][0:value.adjusted() + 1]))
+
+                return result
+
+            else:
+                return value
+
+        return process
+
+    def get_col_spec(self):
+        if self.precision is None:
+            return "NUMERIC"
+        else:
+            return "NUMERIC(%(precision)s, %(scale)s)" % {'precision': self.precision, 'scale' : self.scale}
+
+
+class MSFloat(sqltypes.Float):
+    def get_col_spec(self):
+        if self.precision is None:
+            return "FLOAT"
+        else:
+            return "FLOAT(%(precision)s)" % {'precision': self.precision}
+
+
+class MSReal(MSFloat):
+    """A type for ``real`` numbers."""
+
+    def __init__(self):
+        """
+        Construct a Real.
+
+        """
+        super(MSReal, self).__init__(precision=24)
+
+    def adapt(self, impltype):
+        return impltype()
+
+    def get_col_spec(self):
+        return "REAL"
+
+
+class MSInteger(sqltypes.Integer):
+    def get_col_spec(self):
+        return "INTEGER"
+
+
+class MSBigInteger(MSInteger):
+    def get_col_spec(self):
+        return "BIGINT"
+
+
+class MSTinyInteger(MSInteger):
+    def get_col_spec(self):
+        return "TINYINT"
+
+
+class MSSmallInteger(MSInteger):
+    def get_col_spec(self):
+        return "SMALLINT"
+
+
+class _DateTimeType(object):
+    """Base for MSSQL datetime types."""
+
+    def bind_processor(self, dialect):
+        # if we receive just a date we can manipulate it
+        # into a datetime since the db-api may not do this.
+        def process(value):
+            if type(value) is datetime.date:
+                return datetime.datetime(value.year, value.month, value.day)
+            return value
+        return process
+
+
+class MSDateTime(_DateTimeType, sqltypes.DateTime):
+    def get_col_spec(self):
+        return "DATETIME"
+
+
+class MSDate(sqltypes.Date):
+    def get_col_spec(self):
+        return "DATE"
+
+
+class MSTime(sqltypes.Time):
+    def __init__(self, precision=None, **kwargs):
+        self.precision = precision
+        super(MSTime, self).__init__()
+
+    def get_col_spec(self):
+        if self.precision:
+            return "TIME(%s)" % self.precision
+        else:
+            return "TIME"
+
+
+class MSSmallDateTime(_DateTimeType, sqltypes.TypeEngine):
+    def get_col_spec(self):
+        return "SMALLDATETIME"
+
+
+class MSDateTime2(_DateTimeType, sqltypes.TypeEngine):
+    def __init__(self, precision=None, **kwargs):
+        self.precision = precision
+
+    def get_col_spec(self):
+        if self.precision:
+            return "DATETIME2(%s)" % self.precision
+        else:
+            return "DATETIME2"
+
+
+class MSDateTimeOffset(_DateTimeType, sqltypes.TypeEngine):
+    def __init__(self, precision=None, **kwargs):
+        self.precision = precision
+
+    def get_col_spec(self):
+        if self.precision:
+            return "DATETIMEOFFSET(%s)" % self.precision
+        else:
+            return "DATETIMEOFFSET"
+
+
+class MSDateTimeAsDate(_DateTimeType, MSDate):
+    """ This is an implementation of the Date type for versions of MSSQL that
+    do not support that specific type. In order to make it work a ``DATETIME``
+    column specification is used and the results get converted back to just
+    the date portion.
+
+    """
+
+    def get_col_spec(self):
+        return "DATETIME"
+
+    def result_processor(self, dialect):
+        def process(value):
+            # If the DBAPI returns the value as datetime.datetime(), truncate
+            # it back to datetime.date()
+            if type(value) is datetime.datetime:
+                return value.date()
+            return value
+        return process
+
+
+class MSDateTimeAsTime(MSTime):
+    """ This is an implementation of the Time type for versions of MSSQL that
+    do not support that specific type. In order to make it work a ``DATETIME``
+    column specification is used and the results get converted back to just
+    the time portion.
+
+    """
+
+    __zero_date = datetime.date(1900, 1, 1)
+
+    def get_col_spec(self):
+        return "DATETIME"
+
+    def bind_processor(self, dialect):
+        def process(value):
+            if type(value) is datetime.datetime:
+                value = datetime.datetime.combine(self.__zero_date, value.time())
+            elif type(value) is datetime.time:
+                value = datetime.datetime.combine(self.__zero_date, value)
+            return value
+        return process
+
+    def result_processor(self, dialect):
+        def process(value):
+            if type(value) is datetime.datetime:
+                return value.time()
+            elif type(value) is datetime.date:
+                return datetime.time(0, 0, 0)
+            return value
+        return process
+
+
+class MSDateTime_adodbapi(MSDateTime):
+    def result_processor(self, dialect):
+        def process(value):
+            # adodbapi will return datetimes with empty time values as datetime.date() objects.
+            # Promote them back to full datetime.datetime()
+            if type(value) is datetime.date:
+                return datetime.datetime(value.year, value.month, value.day)
+            return value
+        return process
+
+
+class MSText(_StringType, sqltypes.Text):
+    """MSSQL TEXT type, for variable-length text up to 2^31 characters."""
+
+    def __init__(self, *args, **kwargs):
+        """Construct a TEXT.
+
+        :param collation: Optional, a column-level collation for this string
+          value. Accepts a Windows Collation Name or a SQL Collation Name.
+
+        """
+        _StringType.__init__(self, **kwargs)
+        sqltypes.Text.__init__(self, None,
+                convert_unicode=kwargs.get('convert_unicode', False),
+                assert_unicode=kwargs.get('assert_unicode', None))
+
+    def get_col_spec(self):
+        if self.dialect.text_as_varchar:
+            return self._extend("VARCHAR(max)")
+        else:
+            return self._extend("TEXT")
+
+
+class MSNText(_StringType, sqltypes.UnicodeText):
+    """MSSQL NTEXT type, for variable-length unicode text up to 2^30
+    characters."""
+
+    def __init__(self, *args, **kwargs):
+        """Construct a NTEXT.
+
+        :param collation: Optional, a column-level collation for this string
+          value. Accepts a Windows Collation Name or a SQL Collation Name.
+
+        """
+        _StringType.__init__(self, **kwargs)
+        sqltypes.UnicodeText.__init__(self, None,
+                convert_unicode=kwargs.get('convert_unicode', True),
+                assert_unicode=kwargs.get('assert_unicode', 'warn'))
+
+    def get_col_spec(self):
+        if self.dialect.text_as_varchar:
+            return self._extend("NVARCHAR(max)")
+        else:
+            return self._extend("NTEXT")
+
+
+class MSString(_StringType, sqltypes.String):
+    """MSSQL VARCHAR type, for variable-length non-Unicode data with a maximum
+    of 8,000 characters."""
+
+    def __init__(self, length=None, convert_unicode=False, assert_unicode=None, **kwargs):
+        """Construct a VARCHAR.
+
+        :param length: Optinal, maximum data length, in characters.
+
+        :param convert_unicode: defaults to False.  If True, convert
+          ``unicode`` data sent to the database to a ``str``
+          bytestring, and convert bytestrings coming back from the
+          database into ``unicode``.
+
+          Bytestrings are encoded using the dialect's
+          :attr:`~sqlalchemy.engine.base.Dialect.encoding`, which
+          defaults to `utf-8`.
+
+          If False, may be overridden by
+          :attr:`sqlalchemy.engine.base.Dialect.convert_unicode`.
+
+        :param assert_unicode:
+
+          If None (the default), no assertion will take place unless
+          overridden by :attr:`sqlalchemy.engine.base.Dialect.assert_unicode`.
+
+          If 'warn', will issue a runtime warning if a ``str``
+          instance is used as a bind value.
+
+          If true, will raise an :exc:`sqlalchemy.exc.InvalidRequestError`.
+
+        :param collation: Optional, a column-level collation for this string
+          value. Accepts a Windows Collation Name or a SQL Collation Name.
+
+        """
+        _StringType.__init__(self, **kwargs)
+        sqltypes.String.__init__(self, length=length,
+                convert_unicode=convert_unicode,
+                assert_unicode=assert_unicode)
+
+    def get_col_spec(self):
+        if self.length:
+            return self._extend("VARCHAR(%s)" % self.length)
+        else:
+            return self._extend("VARCHAR")
+
+
+class MSNVarchar(_StringType, sqltypes.Unicode):
+    """MSSQL NVARCHAR type.
+
+    For variable-length unicode character data up to 4,000 characters."""
+
+    def __init__(self, length=None, **kwargs):
+        """Construct a NVARCHAR.
+
+        :param length: Optional, Maximum data length, in characters.
+
+        :param collation: Optional, a column-level collation for this string
+          value. Accepts a Windows Collation Name or a SQL Collation Name.
+
+        """
+        _StringType.__init__(self, **kwargs)
+        sqltypes.Unicode.__init__(self, length=length,
+                convert_unicode=kwargs.get('convert_unicode', True),
+                assert_unicode=kwargs.get('assert_unicode', 'warn'))
+
+    def adapt(self, impltype):
+        return impltype(length=self.length,
+                        convert_unicode=self.convert_unicode,
+                        assert_unicode=self.assert_unicode,
+                        collation=self.collation)
+
+    def get_col_spec(self):
+        if self.length:
+            return self._extend("NVARCHAR(%(length)s)" % {'length' : self.length})
+        else:
+            return self._extend("NVARCHAR")
+
+
+class MSChar(_StringType, sqltypes.CHAR):
+    """MSSQL CHAR type, for fixed-length non-Unicode data with a maximum
+    of 8,000 characters."""
+
+    def __init__(self, length=None, convert_unicode=False, assert_unicode=None, **kwargs):
+        """Construct a CHAR.
+
+        :param length: Optinal, maximum data length, in characters.
+
+        :param convert_unicode: defaults to False.  If True, convert
+          ``unicode`` data sent to the database to a ``str``
+          bytestring, and convert bytestrings coming back from the
+          database into ``unicode``.
+
+          Bytestrings are encoded using the dialect's
+          :attr:`~sqlalchemy.engine.base.Dialect.encoding`, which
+          defaults to `utf-8`.
+
+          If False, may be overridden by
+          :attr:`sqlalchemy.engine.base.Dialect.convert_unicode`.
+
+        :param assert_unicode:
+
+          If None (the default), no assertion will take place unless
+          overridden by :attr:`sqlalchemy.engine.base.Dialect.assert_unicode`.
+
+          If 'warn', will issue a runtime warning if a ``str``
+          instance is used as a bind value.
+
+          If true, will raise an :exc:`sqlalchemy.exc.InvalidRequestError`.
+
+        :param collation: Optional, a column-level collation for this string
+          value. Accepts a Windows Collation Name or a SQL Collation Name.
+
+        """
+        _StringType.__init__(self, **kwargs)
+        sqltypes.CHAR.__init__(self, length=length,
+                convert_unicode=convert_unicode,
+                assert_unicode=assert_unicode)
+
+    def get_col_spec(self):
+        if self.length:
+            return self._extend("CHAR(%s)" % self.length)
+        else:
+            return self._extend("CHAR")
+
+
+class MSNChar(_StringType, sqltypes.NCHAR):
+    """MSSQL NCHAR type.
+
+    For fixed-length unicode character data up to 4,000 characters."""
+
+    def __init__(self, length=None, **kwargs):
+        """Construct an NCHAR.
+
+        :param length: Optional, Maximum data length, in characters.
+
+        :param collation: Optional, a column-level collation for this string
+          value. Accepts a Windows Collation Name or a SQL Collation Name.
+
+        """
+        _StringType.__init__(self, **kwargs)
+        sqltypes.NCHAR.__init__(self, length=length,
+                convert_unicode=kwargs.get('convert_unicode', True),
+                assert_unicode=kwargs.get('assert_unicode', 'warn'))
+
+    def get_col_spec(self):
+        if self.length:
+            return self._extend("NCHAR(%(length)s)" % {'length' : self.length})
+        else:
+            return self._extend("NCHAR")
+
+
+class MSGenericBinary(sqltypes.Binary):
+    """The Binary type assumes that a Binary specification without a length
+    is an unbound Binary type whereas one with a length specification results
+    in a fixed length Binary type.
+
+    If you want standard MSSQL ``BINARY`` behavior use the ``MSBinary`` type.
+
+    """
+
+    def get_col_spec(self):
+        if self.length:
+            return "BINARY(%s)" % self.length
+        else:
+            return "IMAGE"
+
+
+class MSBinary(MSGenericBinary):
+    def get_col_spec(self):
+        if self.length:
+            return "BINARY(%s)" % self.length
+        else:
+            return "BINARY"
+
+
+class MSVarBinary(MSGenericBinary):
+    def get_col_spec(self):
+        if self.length:
+            return "VARBINARY(%s)" % self.length
+        else:
+            return "VARBINARY"
+
+
+class MSImage(MSGenericBinary):
+    def get_col_spec(self):
+        return "IMAGE"
+
+
+class MSBoolean(sqltypes.Boolean):
+    def get_col_spec(self):
+        return "BIT"
+
+    def result_processor(self, dialect):
+        def process(value):
+            if value is None:
+                return None
+            return value and True or False
+        return process
+
+    def bind_processor(self, dialect):
+        def process(value):
+            if value is True:
+                return 1
+            elif value is False:
+                return 0
+            elif value is None:
+                return None
+            else:
+                return value and True or False
+        return process
+
+
+class MSTimeStamp(sqltypes.TIMESTAMP):
+    def get_col_spec(self):
+        return "TIMESTAMP"
+
+
+class MSMoney(sqltypes.TypeEngine):
+    def get_col_spec(self):
+        return "MONEY"
+
+
+class MSSmallMoney(MSMoney):
+    def get_col_spec(self):
+        return "SMALLMONEY"
+
+
+class MSUniqueIdentifier(sqltypes.TypeEngine):
+    def get_col_spec(self):
+        return "UNIQUEIDENTIFIER"
+
+
+class MSVariant(sqltypes.TypeEngine):
+    def get_col_spec(self):
+        return "SQL_VARIANT"
+
+ischema = MetaData()
+
+schemata = Table("SCHEMATA", ischema,
+    Column("CATALOG_NAME", String, key="catalog_name"),
+    Column("SCHEMA_NAME", String, key="schema_name"),
+    Column("SCHEMA_OWNER", String, key="schema_owner"),
+    schema="INFORMATION_SCHEMA")
+
+tables = Table("TABLES", ischema,
+    Column("TABLE_CATALOG", String, key="table_catalog"),
+    Column("TABLE_SCHEMA", String, key="table_schema"),
+    Column("TABLE_NAME", String, key="table_name"),
+    Column("TABLE_TYPE", String, key="table_type"),
+    schema="INFORMATION_SCHEMA")
+
+columns = Table("COLUMNS", ischema,
+    Column("TABLE_SCHEMA", String, key="table_schema"),
+    Column("TABLE_NAME", String, key="table_name"),
+    Column("COLUMN_NAME", String, key="column_name"),
+    Column("IS_NULLABLE", Integer, key="is_nullable"),
+    Column("DATA_TYPE", String, key="data_type"),
+    Column("ORDINAL_POSITION", Integer, key="ordinal_position"),
+    Column("CHARACTER_MAXIMUM_LENGTH", Integer, key="character_maximum_length"),
+    Column("NUMERIC_PRECISION", Integer, key="numeric_precision"),
+    Column("NUMERIC_SCALE", Integer, key="numeric_scale"),
+    Column("COLUMN_DEFAULT", Integer, key="column_default"),
+    Column("COLLATION_NAME", String, key="collation_name"),
+    schema="INFORMATION_SCHEMA")
+
+constraints = Table("TABLE_CONSTRAINTS", ischema,
+    Column("TABLE_SCHEMA", String, key="table_schema"),
+    Column("TABLE_NAME", String, key="table_name"),
+    Column("CONSTRAINT_NAME", String, key="constraint_name"),
+    Column("CONSTRAINT_TYPE", String, key="constraint_type"),
+    schema="INFORMATION_SCHEMA")
+
+column_constraints = Table("CONSTRAINT_COLUMN_USAGE", ischema,
+    Column("TABLE_SCHEMA", String, key="table_schema"),
+    Column("TABLE_NAME", String, key="table_name"),
+    Column("COLUMN_NAME", String, key="column_name"),
+    Column("CONSTRAINT_NAME", String, key="constraint_name"),
+    schema="INFORMATION_SCHEMA")
+
+key_constraints = Table("KEY_COLUMN_USAGE", ischema,
+    Column("TABLE_SCHEMA", String, key="table_schema"),
+    Column("TABLE_NAME", String, key="table_name"),
+    Column("COLUMN_NAME", String, key="column_name"),
+    Column("CONSTRAINT_NAME", String, key="constraint_name"),
+    Column("ORDINAL_POSITION", Integer, key="ordinal_position"),
+    schema="INFORMATION_SCHEMA")
+
+ref_constraints = Table("REFERENTIAL_CONSTRAINTS", ischema,
+    Column("CONSTRAINT_CATALOG", String, key="constraint_catalog"),
+    Column("CONSTRAINT_SCHEMA", String, key="constraint_schema"),
+    Column("CONSTRAINT_NAME", String, key="constraint_name"),
+    Column("UNIQUE_CONSTRAINT_CATLOG", String, key="unique_constraint_catalog"),
+    Column("UNIQUE_CONSTRAINT_SCHEMA", String, key="unique_constraint_schema"),
+    Column("UNIQUE_CONSTRAINT_NAME", String, key="unique_constraint_name"),
+    Column("MATCH_OPTION", String, key="match_option"),
+    Column("UPDATE_RULE", String, key="update_rule"),
+    Column("DELETE_RULE", String, key="delete_rule"),
+    schema="INFORMATION_SCHEMA")
+
+def _has_implicit_sequence(column):
+    return column.primary_key and  \
+        column.autoincrement and \
+        isinstance(column.type, sqltypes.Integer) and \
+        not column.foreign_keys and \
+        (
+            column.default is None or
+            (
+                isinstance(column.default, schema.Sequence) and
+                column.default.optional)
+            )
+
+def _table_sequence_column(tbl):
+    if not hasattr(tbl, '_ms_has_sequence'):
+        tbl._ms_has_sequence = None
+        for column in tbl.c:
+            if getattr(column, 'sequence', False) or _has_implicit_sequence(column):
+                tbl._ms_has_sequence = column
+                break
+    return tbl._ms_has_sequence
+
+class MSSQLExecutionContext(default.DefaultExecutionContext):
+    IINSERT = False
+    HASIDENT = False
+
+    def pre_exec(self):
+        """Activate IDENTITY_INSERT if needed."""
+
+        if self.compiled.isinsert:
+            tbl = self.compiled.statement.table
+            seq_column = _table_sequence_column(tbl)
+            self.HASIDENT = bool(seq_column)
+            if self.dialect.auto_identity_insert and self.HASIDENT:
+                self.IINSERT = tbl._ms_has_sequence.key in self.compiled_parameters[0]
+            else:
+                self.IINSERT = False
+
+            if self.IINSERT:
+                self.cursor.execute("SET IDENTITY_INSERT %s ON" %
+                    self.dialect.identifier_preparer.format_table(self.compiled.statement.table))
+
+    def handle_dbapi_exception(self, e):
+        if self.IINSERT:
+            try:
+                self.cursor.execute("SET IDENTITY_INSERT %s OFF" % self.dialect.identifier_preparer.format_table(self.compiled.statement.table))
+            except:
+                pass
+
+    def post_exec(self):
+        """Disable IDENTITY_INSERT if enabled."""
+
+        if self.compiled.isinsert and not self.executemany and self.HASIDENT and not self.IINSERT:
+            if not self._last_inserted_ids or self._last_inserted_ids[0] is None:
+                if self.dialect.use_scope_identity:
+                    self.cursor.execute("SELECT scope_identity() AS lastrowid")
+                else:
+                    self.cursor.execute("SELECT @@identity AS lastrowid")
+                row = self.cursor.fetchone()
+                self._last_inserted_ids = [int(row[0])] + self._last_inserted_ids[1:]
+
+        if self.IINSERT:
+            self.cursor.execute("SET IDENTITY_INSERT %s OFF" % self.dialect.identifier_preparer.format_table(self.compiled.statement.table))
+
+
+class MSSQLExecutionContext_pyodbc (MSSQLExecutionContext):
+    def pre_exec(self):
+        """where appropriate, issue "select scope_identity()" in the same statement"""
+        super(MSSQLExecutionContext_pyodbc, self).pre_exec()
+        if self.compiled.isinsert and self.HASIDENT and not self.IINSERT \
+                and len(self.parameters) == 1 and self.dialect.use_scope_identity:
+            self.statement += "; select scope_identity()"
+
+    def post_exec(self):
+        if self.HASIDENT and not self.IINSERT and self.dialect.use_scope_identity and not self.executemany:
+            import pyodbc
+            # Fetch the last inserted id from the manipulated statement
+            # We may have to skip over a number of result sets with no data (due to triggers, etc.)
+            while True:
+                try:
+                    row = self.cursor.fetchone()
+                    break
+                except pyodbc.Error, e:
+                    self.cursor.nextset()
+            self._last_inserted_ids = [int(row[0])]
+        else:
+            super(MSSQLExecutionContext_pyodbc, self).post_exec()
+
+class MSSQLDialect(default.DefaultDialect):
+    name = 'mssql'
+    supports_default_values = True
+    supports_empty_insert = False
+    auto_identity_insert = True
+    execution_ctx_cls = MSSQLExecutionContext
+    text_as_varchar = False
+    use_scope_identity = False
+    has_window_funcs = False
+    max_identifier_length = 128
+    schema_name = "dbo"
+
+    colspecs = {
+        sqltypes.Unicode : MSNVarchar,
+        sqltypes.Integer : MSInteger,
+        sqltypes.Smallinteger: MSSmallInteger,
+        sqltypes.Numeric : MSNumeric,
+        sqltypes.Float : MSFloat,
+        sqltypes.DateTime : MSDateTime,
+        sqltypes.Date : MSDate,
+        sqltypes.Time : MSTime,
+        sqltypes.String : MSString,
+        sqltypes.Binary : MSGenericBinary,
+        sqltypes.Boolean : MSBoolean,
+        sqltypes.Text : MSText,
+        sqltypes.UnicodeText : MSNText,
+        sqltypes.CHAR: MSChar,
+        sqltypes.NCHAR: MSNChar,
+        sqltypes.TIMESTAMP: MSTimeStamp,
+    }
+
+    ischema_names = {
+        'int' : MSInteger,
+        'bigint': MSBigInteger,
+        'smallint' : MSSmallInteger,
+        'tinyint' : MSTinyInteger,
+        'varchar' : MSString,
+        'nvarchar' : MSNVarchar,
+        'char' : MSChar,
+        'nchar' : MSNChar,
+        'text' : MSText,
+        'ntext' : MSNText,
+        'decimal' : MSNumeric,
+        'numeric' : MSNumeric,
+        'float' : MSFloat,
+        'datetime' : MSDateTime,
+        'datetime2' : MSDateTime2,
+        'datetimeoffset' : MSDateTimeOffset,
+        'date': MSDate,
+        'time': MSTime,
+        'smalldatetime' : MSSmallDateTime,
+        'binary' : MSBinary,
+        'varbinary' : MSVarBinary,
+        'bit': MSBoolean,
+        'real' : MSFloat,
+        'image' : MSImage,
+        'timestamp': MSTimeStamp,
+        'money': MSMoney,
+        'smallmoney': MSSmallMoney,
+        'uniqueidentifier': MSUniqueIdentifier,
+        'sql_variant': MSVariant,
+    }
+
+    def __new__(cls, *args, **kwargs):
+        if cls is not MSSQLDialect:
+            # this gets called with the dialect specific class
+            return super(MSSQLDialect, cls).__new__(cls)
+        dbapi = kwargs.get('dbapi', None)
+        if dbapi:
+            dialect = dialect_mapping.get(dbapi.__name__)
+            return dialect(**kwargs)
+        else:
+            return object.__new__(cls)
+
+    def __init__(self,
+                 auto_identity_insert=True, query_timeout=None,
+                 text_as_varchar=False, use_scope_identity=False,
+                 has_window_funcs=False, max_identifier_length=None,
+                 schema_name="dbo", **opts):
+        self.auto_identity_insert = bool(auto_identity_insert)
+        self.query_timeout = int(query_timeout or 0)
+        self.schema_name = schema_name
+
+        # to-do: the options below should use server version introspection to set themselves on connection
+        self.text_as_varchar = bool(text_as_varchar)
+        self.use_scope_identity = bool(use_scope_identity)
+        self.has_window_funcs =  bool(has_window_funcs)
+        self.max_identifier_length = int(max_identifier_length or 0) or \
+                self.max_identifier_length
+        super(MSSQLDialect, self).__init__(**opts)
+
+    @classmethod
+    def dbapi(cls, module_name=None):
+        if module_name:
+            try:
+                dialect_cls = dialect_mapping[module_name]
+                return dialect_cls.import_dbapi()
+            except KeyError:
+                raise exc.InvalidRequestError("Unsupported MSSQL module '%s' requested (must be adodbpi, pymssql or pyodbc)" % module_name)
+        else:
+            for dialect_cls in [MSSQLDialect_pyodbc, MSSQLDialect_pymssql, MSSQLDialect_adodbapi]:
+                try:
+                    return dialect_cls.import_dbapi()
+                except ImportError, e:
+                    pass
+            else:
+                raise ImportError('No DBAPI module detected for MSSQL - please install pyodbc, pymssql, or adodbapi')
+
+    @base.connection_memoize(('mssql', 'server_version_info'))
+    def server_version_info(self, connection):
+        """A tuple of the database server version.
+
+        Formats the remote server version as a tuple of version values,
+        e.g. ``(9, 0, 1399)``.  If there are strings in the version number
+        they will be in the tuple too, so don't count on these all being
+        ``int`` values.
+
+        This is a fast check that does not require a round trip.  It is also
+        cached per-Connection.
+        """
+        return connection.dialect._server_version_info(connection.connection)
+
+    def _server_version_info(self, dbapi_con):
+        """Return a tuple of the database's version number."""
+        raise NotImplementedError()
+
+    def create_connect_args(self, url):
+        opts = url.translate_connect_args(username='user')
+        opts.update(url.query)
+        if 'auto_identity_insert' in opts:
+            self.auto_identity_insert = bool(int(opts.pop('auto_identity_insert')))
+        if 'query_timeout' in opts:
+            self.query_timeout = int(opts.pop('query_timeout'))
+        if 'text_as_varchar' in opts:
+            self.text_as_varchar = bool(int(opts.pop('text_as_varchar')))
+        if 'use_scope_identity' in opts:
+            self.use_scope_identity = bool(int(opts.pop('use_scope_identity')))
+        if 'has_window_funcs' in opts:
+            self.has_window_funcs =  bool(int(opts.pop('has_window_funcs')))
+        return self.make_connect_string(opts, url.query)
+
+    def type_descriptor(self, typeobj):
+        newobj = sqltypes.adapt_type(typeobj, self.colspecs)
+        # Some types need to know about the dialect
+        if isinstance(newobj, (MSText, MSNText)):
+            newobj.dialect = self
+        return newobj
+
+    def do_savepoint(self, connection, name):
+        util.warn("Savepoint support in mssql is experimental and may lead to data loss.")
+        connection.execute("IF @@TRANCOUNT = 0 BEGIN TRANSACTION")
+        connection.execute("SAVE TRANSACTION %s" % name)
+
+    def do_release_savepoint(self, connection, name):
+        pass
+
+    @base.connection_memoize(('dialect', 'default_schema_name'))
+    def get_default_schema_name(self, connection):
+        query = "SELECT user_name() as user_name;"
+        user_name = connection.scalar(sql.text(query))
+        if user_name is not None:
+            # now, get the default schema
+            query = """
+            SELECT default_schema_name FROM
+            sys.database_principals
+            WHERE name = :user_name
+            AND type = 'S'
+            """
+            try:
+                default_schema_name = connection.scalar(sql.text(query),
+                                                    user_name=user_name)
+                if default_schema_name is not None:
+                    return default_schema_name
+            except:
+                pass
+        return self.schema_name
+
+    def table_names(self, connection, schema):
+        s = select([tables.c.table_name], tables.c.table_schema==schema)
+        return [row[0] for row in connection.execute(s)]
+
+
+    def has_table(self, connection, tablename, schema=None):
+
+        current_schema = schema or self.get_default_schema_name(connection)
+        s = sql.select([columns],
+                   current_schema
+                       and sql.and_(columns.c.table_name==tablename, columns.c.table_schema==current_schema)
+                       or columns.c.table_name==tablename,
+                   )
+
+        c = connection.execute(s)
+        row  = c.fetchone()
+        return row is not None
+
+    def reflecttable(self, connection, table, include_columns):
+        # Get base columns
+        if table.schema is not None:
+            current_schema = table.schema
+        else:
+            current_schema = self.get_default_schema_name(connection)
+
+        s = sql.select([columns],
+                   current_schema
+                       and sql.and_(columns.c.table_name==table.name, columns.c.table_schema==current_schema)
+                       or columns.c.table_name==table.name,
+                   order_by=[columns.c.ordinal_position])
+
+        c = connection.execute(s)
+        found_table = False
+        while True:
+            row = c.fetchone()
+            if row is None:
+                break
+            found_table = True
+            (name, type, nullable, charlen, numericprec, numericscale, default, collation) = (
+                row[columns.c.column_name],
+                row[columns.c.data_type],
+                row[columns.c.is_nullable] == 'YES',
+                row[columns.c.character_maximum_length],
+                row[columns.c.numeric_precision],
+                row[columns.c.numeric_scale],
+                row[columns.c.column_default],
+                row[columns.c.collation_name]
+            )
+            if include_columns and name not in include_columns:
+                continue
+
+            coltype = self.ischema_names.get(type, None)
+
+            kwargs = {}
+            if coltype in (MSString, MSChar, MSNVarchar, MSNChar, MSText, MSNText, MSBinary, MSVarBinary, sqltypes.Binary):
+                kwargs['length'] = charlen
+                if collation:
+                    kwargs['collation'] = collation
+                if coltype == MSText or (coltype in (MSString, MSNVarchar) and charlen == -1):
+                    kwargs.pop('length')
+
+            if issubclass(coltype, sqltypes.Numeric):
+                kwargs['scale'] = numericscale
+                kwargs['precision'] = numericprec
+
+            if coltype is None:
+                util.warn("Did not recognize type '%s' of column '%s'" % (type, name))
+                coltype = sqltypes.NULLTYPE
+
+            coltype = coltype(**kwargs)
+            colargs = []
+            if default is not None:
+                colargs.append(schema.DefaultClause(sql.text(default)))
+            table.append_column(schema.Column(name, coltype, nullable=nullable, autoincrement=False, *colargs))
+
+        if not found_table:
+            raise exc.NoSuchTableError(table.name)
+
+        # We also run an sp_columns to check for identity columns:
+        cursor = connection.execute("sp_columns @table_name = '%s', @table_owner = '%s'" % (table.name, current_schema))
+        ic = None
+        while True:
+            row = cursor.fetchone()
+            if row is None:
+                break
+            col_name, type_name = row[3], row[5]
+            if type_name.endswith("identity") and col_name in table.c:
+                ic = table.c[col_name]
+                ic.autoincrement = True
+                # setup a psuedo-sequence to represent the identity attribute - we interpret this at table.create() time as the identity attribute
+                ic.sequence = schema.Sequence(ic.name + '_identity', 1, 1)
+                # MSSQL: only one identity per table allowed
+                cursor.close()
+                break
+        if not ic is None:
+            try:
+                cursor = connection.execute("select ident_seed(?), ident_incr(?)", table.fullname, table.fullname)
+                row = cursor.fetchone()
+                cursor.close()
+                if not row is None:
+                    ic.sequence.start = int(row[0])
+                    ic.sequence.increment = int(row[1])
+            except:
+                # ignoring it, works just like before
+                pass
+
+        # Add constraints
+        RR = ref_constraints
+        TC = constraints
+        C  = key_constraints.alias('C') #information_schema.constraint_column_usage: the constrained column
+        R  = key_constraints.alias('R') #information_schema.constraint_column_usage: the referenced column
+
+        # Primary key constraints
+        s = sql.select([C.c.column_name, TC.c.constraint_type], sql.and_(TC.c.constraint_name == C.c.constraint_name,
+                                                                         C.c.table_name == table.name,
+                                                                         C.c.table_schema == (table.schema or current_schema)))
+        c = connection.execute(s)
+        for row in c:
+            if 'PRIMARY' in row[TC.c.constraint_type.name] and row[0] in table.c:
+                table.primary_key.add(table.c[row[0]])
+
+        # Foreign key constraints
+        s = sql.select([C.c.column_name,
+                        R.c.table_schema, R.c.table_name, R.c.column_name,
+                        RR.c.constraint_name, RR.c.match_option, RR.c.update_rule, RR.c.delete_rule],
+                       sql.and_(C.c.table_name == table.name,
+                                C.c.table_schema == (table.schema or current_schema),
+                                C.c.constraint_name == RR.c.constraint_name,
+                                R.c.constraint_name == RR.c.unique_constraint_name,
+                                C.c.ordinal_position == R.c.ordinal_position
+                                ),
+                       order_by = [RR.c.constraint_name, R.c.ordinal_position])
+        rows = connection.execute(s).fetchall()
+
+        def _gen_fkref(table, rschema, rtbl, rcol):
+            if rschema == current_schema and not table.schema:
+                return '.'.join([rtbl, rcol])
+            else:
+                return '.'.join([rschema, rtbl, rcol])
+
+        # group rows by constraint ID, to handle multi-column FKs
+        fknm, scols, rcols = (None, [], [])
+        for r in rows:
+            scol, rschema, rtbl, rcol, rfknm, fkmatch, fkuprule, fkdelrule = r
+            # if the reflected schema is the default schema then don't set it because this will
+            # play into the metadata key causing duplicates.
+            if rschema == current_schema and not table.schema:
+                schema.Table(rtbl, table.metadata, autoload=True, autoload_with=connection)
+            else:
+                schema.Table(rtbl, table.metadata, schema=rschema, autoload=True, autoload_with=connection)
+            if rfknm != fknm:
+                if fknm:
+                    table.append_constraint(schema.ForeignKeyConstraint(scols, [_gen_fkref(table, s, t, c) for s, t, c in rcols], fknm, link_to_name=True))
+                fknm, scols, rcols = (rfknm, [], [])
+            if not scol in scols:
+                scols.append(scol)
+            if not (rschema, rtbl, rcol) in rcols:
+                rcols.append((rschema, rtbl, rcol))
+
+        if fknm and scols:
+            table.append_constraint(schema.ForeignKeyConstraint(scols, [_gen_fkref(table, s, t, c) for s, t, c in rcols], fknm, link_to_name=True))
+
+
+class MSSQLDialect_pymssql(MSSQLDialect):
+    supports_sane_rowcount = False
+    max_identifier_length = 30
+
+    @classmethod
+    def import_dbapi(cls):
+        import pymssql as module
+        # pymmsql doesn't have a Binary method.  we use string
+        # TODO: monkeypatching here is less than ideal
+        module.Binary = lambda st: str(st)
+        try:
+            module.version_info = tuple(map(int, module.__version__.split('.')))
+        except:
+            module.version_info = (0, 0, 0)
+        return module
+
+    def __init__(self, **params):
+        super(MSSQLDialect_pymssql, self).__init__(**params)
+        self.use_scope_identity = True
+
+        # pymssql understands only ascii
+        if self.convert_unicode:
+            util.warn("pymssql does not support unicode")
+            self.encoding = params.get('encoding', 'ascii')
+
+        self.colspecs = MSSQLDialect.colspecs.copy()
+        self.ischema_names = MSSQLDialect.ischema_names.copy()
+        self.ischema_names['date'] = MSDateTimeAsDate
+        self.colspecs[sqltypes.Date] = MSDateTimeAsDate
+        self.ischema_names['time'] = MSDateTimeAsTime
+        self.colspecs[sqltypes.Time] = MSDateTimeAsTime
+
+    def create_connect_args(self, url):
+        r = super(MSSQLDialect_pymssql, self).create_connect_args(url)
+        if hasattr(self, 'query_timeout'):
+            if self.dbapi.version_info > (0, 8, 0):
+                r[1]['timeout'] = self.query_timeout
+            else:
+                self.dbapi._mssql.set_query_timeout(self.query_timeout)
+        return r
+
+    def make_connect_string(self, keys, query):
+        if keys.get('port'):
+            # pymssql expects port as host:port, not a separate arg
+            keys['host'] = ''.join([keys.get('host', ''), ':', str(keys['port'])])
+            del keys['port']
+        return [[], keys]
+
+    def is_disconnect(self, e):
+        return isinstance(e, self.dbapi.DatabaseError) and "Error 10054" in str(e)
+
+    def do_begin(self, connection):
+        pass
+
+
+class MSSQLDialect_pyodbc(MSSQLDialect):
+    supports_sane_rowcount = False
+    supports_sane_multi_rowcount = False
+    # PyODBC unicode is broken on UCS-4 builds
+    supports_unicode = sys.maxunicode == 65535
+    supports_unicode_statements = supports_unicode
+    execution_ctx_cls = MSSQLExecutionContext_pyodbc
+
+    def __init__(self, description_encoding='latin-1', **params):
+        super(MSSQLDialect_pyodbc, self).__init__(**params)
+        self.description_encoding = description_encoding
+
+        if self.server_version_info < (10,):
+            self.colspecs = MSSQLDialect.colspecs.copy()
+            self.ischema_names = MSSQLDialect.ischema_names.copy()
+            self.ischema_names['date'] = MSDateTimeAsDate
+            self.colspecs[sqltypes.Date] = MSDateTimeAsDate
+            self.ischema_names['time'] = MSDateTimeAsTime
+            self.colspecs[sqltypes.Time] = MSDateTimeAsTime
+
+        # FIXME: scope_identity sniff should look at server version, not the ODBC driver
+        # whether use_scope_identity will work depends on the version of pyodbc
+        try:
+            import pyodbc
+            self.use_scope_identity = hasattr(pyodbc.Cursor, 'nextset')
+        except:
+            pass
+
+    @classmethod
+    def import_dbapi(cls):
+        import pyodbc as module
+        return module
+
+    def make_connect_string(self, keys, query):
+        if 'max_identifier_length' in keys:
+            self.max_identifier_length = int(keys.pop('max_identifier_length'))
+
+        if 'odbc_connect' in keys:
+            connectors = [urllib.unquote_plus(keys.pop('odbc_connect'))]
+        else:
+            dsn_connection = 'dsn' in keys or ('host' in keys and 'database' not in keys)
+            if dsn_connection:
+                connectors= ['dsn=%s' % (keys.pop('host', '') or keys.pop('dsn', ''))]
+            else:
+                port = ''
+                if 'port' in keys and not 'port' in query:
+                    port = ',%d' % int(keys.pop('port'))
+
+                connectors = ["DRIVER={%s}" % keys.pop('driver', 'SQL Server'),
+                              'Server=%s%s' % (keys.pop('host', ''), port),
+                              'Database=%s' % keys.pop('database', '') ]
+
+            user = keys.pop("user", None)
+            if user:
+                connectors.append("UID=%s" % user)
+                connectors.append("PWD=%s" % keys.pop('password', ''))
+            else:
+                connectors.append("Trusted_Connection=Yes")
+
+            # if set to 'Yes', the ODBC layer will try to automagically convert
+            # textual data from your database encoding to your client encoding
+            # This should obviously be set to 'No' if you query a cp1253 encoded
+            # database from a latin1 client...
+            if 'odbc_autotranslate' in keys:
+                connectors.append("AutoTranslate=%s" % keys.pop("odbc_autotranslate"))
+
+            connectors.extend(['%s=%s' % (k,v) for k,v in keys.iteritems()])
+
+        return [[";".join (connectors)], {}]
+
+    def is_disconnect(self, e):
+        if isinstance(e, self.dbapi.ProgrammingError):
+            return "The cursor's connection has been closed." in str(e) or 'Attempt to use a closed connection.' in str(e)
+        elif isinstance(e, self.dbapi.Error):
+            return '[08S01]' in str(e)
+        else:
+            return False
+
+
+    def _server_version_info(self, dbapi_con):
+        """Convert a pyodbc SQL_DBMS_VER string into a tuple."""
+        version = []
+        r = re.compile('[.\-]')
+        for n in r.split(dbapi_con.getinfo(self.dbapi.SQL_DBMS_VER)):
+            try:
+                version.append(int(n))
+            except ValueError:
+                version.append(n)
+        return tuple(version)
+
+class MSSQLDialect_adodbapi(MSSQLDialect):
+    supports_sane_rowcount = True
+    supports_sane_multi_rowcount = True
+    supports_unicode = sys.maxunicode == 65535
+    supports_unicode_statements = True
+
+    @classmethod
+    def import_dbapi(cls):
+        import adodbapi as module
+        return module
+
+    colspecs = MSSQLDialect.colspecs.copy()
+    colspecs[sqltypes.DateTime] = MSDateTime_adodbapi
+
+    ischema_names = MSSQLDialect.ischema_names.copy()
+    ischema_names['datetime'] = MSDateTime_adodbapi
+
+    def make_connect_string(self, keys, query):
+        connectors = ["Provider=SQLOLEDB"]
+        if 'port' in keys:
+            connectors.append ("Data Source=%s, %s" % (keys.get("host"), keys.get("port")))
+        else:
+            connectors.append ("Data Source=%s" % keys.get("host"))
+        connectors.append ("Initial Catalog=%s" % keys.get("database"))
+        user = keys.get("user")
+        if user:
+            connectors.append("User Id=%s" % user)
+            connectors.append("Password=%s" % keys.get("password", ""))
+        else:
+            connectors.append("Integrated Security=SSPI")
+        return [[";".join (connectors)], {}]
+
+    def is_disconnect(self, e):
+        return isinstance(e, self.dbapi.adodbapi.DatabaseError) and "'connection failure'" in str(e)
+
+
+dialect_mapping = {
+    'pymssql':  MSSQLDialect_pymssql,
+    'pyodbc':   MSSQLDialect_pyodbc,
+    'adodbapi': MSSQLDialect_adodbapi
+    }
+
+
+class MSSQLCompiler(compiler.DefaultCompiler):
+    operators = compiler.OPERATORS.copy()
+    operators.update({
+        sql_operators.concat_op: '+',
+        sql_operators.match_op: lambda x, y: "CONTAINS (%s, %s)" % (x, y)
+    })
+
+    functions = compiler.DefaultCompiler.functions.copy()
+    functions.update (
+        {
+            sql_functions.now: 'CURRENT_TIMESTAMP',
+            sql_functions.current_date: 'GETDATE()',
+            'length': lambda x: "LEN(%s)" % x,
+            sql_functions.char_length: lambda x: "LEN(%s)" % x
+        }
+    )
+
+    extract_map = compiler.DefaultCompiler.extract_map.copy()
+    extract_map.update ({
+        'doy': 'dayofyear',
+        'dow': 'weekday',
+        'milliseconds': 'millisecond',
+        'microseconds': 'microsecond'
+    })
+
+    def __init__(self, *args, **kwargs):
+        super(MSSQLCompiler, self).__init__(*args, **kwargs)
+        self.tablealiases = {}
+
+    def get_select_precolumns(self, select):
+        """ MS-SQL puts TOP, it's version of LIMIT here """
+        if select._distinct or select._limit:
+            s = select._distinct and "DISTINCT " or ""
+
+            if select._limit:
+                if not select._offset:
+                    s += "TOP %s " % (select._limit,)
+                else:
+                    if not self.dialect.has_window_funcs:
+                        raise exc.InvalidRequestError('MSSQL does not support LIMIT with an offset')
+            return s
+        return compiler.DefaultCompiler.get_select_precolumns(self, select)
+
+    def limit_clause(self, select):
+        # Limit in mssql is after the select keyword
+        return ""
+
+    def visit_select(self, select, **kwargs):
+        """Look for ``LIMIT`` and OFFSET in a select statement, and if
+        so tries to wrap it in a subquery with ``row_number()`` criterion.
+
+        """
+        if self.dialect.has_window_funcs and not getattr(select, '_mssql_visit', None) and select._offset:
+            # to use ROW_NUMBER(), an ORDER BY is required.
+            orderby = self.process(select._order_by_clause)
+            if not orderby:
+                raise exc.InvalidRequestError('MSSQL requires an order_by when using an offset.')
+
+            _offset = select._offset
+            _limit = select._limit
+            select._mssql_visit = True
+            select = select.column(sql.literal_column("ROW_NUMBER() OVER (ORDER BY %s)" % orderby).label("mssql_rn")).order_by(None).alias()
+
+            limitselect = sql.select([c for c in select.c if c.key!='mssql_rn'])
+            limitselect.append_whereclause("mssql_rn>%d" % _offset)
+            if _limit is not None:
+                limitselect.append_whereclause("mssql_rn<=%d" % (_limit + _offset))
+            return self.process(limitselect, iswrapper=True, **kwargs)
+        else:
+            return compiler.DefaultCompiler.visit_select(self, select, **kwargs)
+
+    def _schema_aliased_table(self, table):
+        if getattr(table, 'schema', None) is not None:
+            if table not in self.tablealiases:
+                self.tablealiases[table] = table.alias()
+            return self.tablealiases[table]
+        else:
+            return None
+
+    def visit_table(self, table, mssql_aliased=False, **kwargs):
+        if mssql_aliased:
+            return super(MSSQLCompiler, self).visit_table(table, **kwargs)
+
+        # alias schema-qualified tables
+        alias = self._schema_aliased_table(table)
+        if alias is not None:
+            return self.process(alias, mssql_aliased=True, **kwargs)
+        else:
+            return super(MSSQLCompiler, self).visit_table(table, **kwargs)
+
+    def visit_alias(self, alias, **kwargs):
+        # translate for schema-qualified table aliases
+        self.tablealiases[alias.original] = alias
+        kwargs['mssql_aliased'] = True
+        return super(MSSQLCompiler, self).visit_alias(alias, **kwargs)
+
+    def visit_extract(self, extract):
+        field = self.extract_map.get(extract.field, extract.field)
+        return 'DATEPART("%s", %s)' % (field, self.process(extract.expr))
+
+    def visit_rollback_to_savepoint(self, savepoint_stmt):
+        return "ROLLBACK TRANSACTION %s" % self.preparer.format_savepoint(savepoint_stmt)
+
+    def visit_column(self, column, result_map=None, **kwargs):
+        if column.table is not None and \
+            (not self.isupdate and not self.isdelete) or self.is_subquery():
+            # translate for schema-qualified table aliases
+            t = self._schema_aliased_table(column.table)
+            if t is not None:
+                converted = expression._corresponding_column_or_error(t, column)
+
+                if result_map is not None:
+                    result_map[column.name.lower()] = (column.name, (column, ), column.type)
+
+                return super(MSSQLCompiler, self).visit_column(converted, result_map=None, **kwargs)
+
+        return super(MSSQLCompiler, self).visit_column(column, result_map=result_map, **kwargs)
+
+    def visit_binary(self, binary, **kwargs):
+        """Move bind parameters to the right-hand side of an operator, where
+        possible.
+
+        """
+        if isinstance(binary.left, expression._BindParamClause) and binary.operator == operator.eq \
+            and not isinstance(binary.right, expression._BindParamClause):
+            return self.process(expression._BinaryExpression(binary.right, binary.left, binary.operator), **kwargs)
+        else:
+            if (binary.operator is operator.eq or binary.operator is operator.ne) and (
+                (isinstance(binary.left, expression._FromGrouping) and isinstance(binary.left.element, expression._ScalarSelect)) or \
+                (isinstance(binary.right, expression._FromGrouping) and isinstance(binary.right.element, expression._ScalarSelect)) or \
+                 isinstance(binary.left, expression._ScalarSelect) or isinstance(binary.right, expression._ScalarSelect)):
+                op = binary.operator == operator.eq and "IN" or "NOT IN"
+                return self.process(expression._BinaryExpression(binary.left, binary.right, op), **kwargs)
+            return super(MSSQLCompiler, self).visit_binary(binary, **kwargs)
+
+    def visit_insert(self, insert_stmt):
+        insert_select = False
+        if insert_stmt.parameters:
+            insert_select = [p for p in insert_stmt.parameters.values() if isinstance(p, sql.Select)]
+        if insert_select:
+            self.isinsert = True
+            colparams = self._get_colparams(insert_stmt)
+            preparer = self.preparer
+
+            insert = ' '.join(["INSERT"] +
+                              [self.process(x) for x in insert_stmt._prefixes])
+
+            if not colparams and not self.dialect.supports_default_values and not self.dialect.supports_empty_insert:
+                raise exc.CompileError(
+                    "The version of %s you are using does not support empty inserts." % self.dialect.name)
+            elif not colparams and self.dialect.supports_default_values:
+                return (insert + " INTO %s DEFAULT VALUES" % (
+                    (preparer.format_table(insert_stmt.table),)))
+            else:
+                return (insert + " INTO %s (%s) SELECT %s" %
+                    (preparer.format_table(insert_stmt.table),
+                     ', '.join([preparer.format_column(c[0])
+                               for c in colparams]),
+                     ', '.join([c[1] for c in colparams])))
+        else:
+            return super(MSSQLCompiler, self).visit_insert(insert_stmt)
+
+    def label_select_column(self, select, column, asfrom):
+        if isinstance(column, expression.Function):
+            return column.label(None)
+        else:
+            return super(MSSQLCompiler, self).label_select_column(select, column, asfrom)
+
+    def for_update_clause(self, select):
+        # "FOR UPDATE" is only allowed on "DECLARE CURSOR" which SQLAlchemy doesn't use
+        return ''
+
+    def order_by_clause(self, select):
+        order_by = self.process(select._order_by_clause)
+
+        # MSSQL only allows ORDER BY in subqueries if there is a LIMIT
+        if order_by and (not self.is_subquery() or select._limit):
+            return " ORDER BY " + order_by
+        else:
+            return ""
+
+
+class MSSQLSchemaGenerator(compiler.SchemaGenerator):
+    def get_column_specification(self, column, **kwargs):
+        colspec = self.preparer.format_column(column) + " " + column.type.dialect_impl(self.dialect).get_col_spec()
+
+        if column.nullable is not None:
+            if not column.nullable or column.primary_key:
+                colspec += " NOT NULL"
+            else:
+                colspec += " NULL"
+
+        if not column.table:
+            raise exc.InvalidRequestError("mssql requires Table-bound columns in order to generate DDL")
+
+        seq_col = _table_sequence_column(column.table)
+
+        # install a IDENTITY Sequence if we have an implicit IDENTITY column
+        if seq_col is column:
+            sequence = getattr(column, 'sequence', None)
+            if sequence:
+                start, increment = sequence.start or 1, sequence.increment or 1
+            else:
+                start, increment = 1, 1
+            colspec += " IDENTITY(%s,%s)" % (start, increment)
+        else:
+            default = self.get_column_default_string(column)
+            if default is not None:
+                colspec += " DEFAULT " + default
+
+        return colspec
+
+class MSSQLSchemaDropper(compiler.SchemaDropper):
+    def visit_index(self, index):
+        self.append("\nDROP INDEX %s.%s" % (
+            self.preparer.quote_identifier(index.table.name),
+            self.preparer.quote(self._validate_identifier(index.name, False), index.quote)
+            ))
+        self.execute()
+
+
+class MSSQLIdentifierPreparer(compiler.IdentifierPreparer):
+    reserved_words = RESERVED_WORDS
+
+    def __init__(self, dialect):
+        super(MSSQLIdentifierPreparer, self).__init__(dialect, initial_quote='[', final_quote=']')
+
+    def _escape_identifier(self, value):
+        #TODO: determine MSSQL's escaping rules
+        return value
+
+    def quote_schema(self, schema, force=True):
+        """Prepare a quoted table and schema name."""
+        result = '.'.join([self.quote(x, force) for x in schema.split('.')])
+        return result
+
+dialect = MSSQLDialect
+dialect.statement_compiler = MSSQLCompiler
+dialect.schemagenerator = MSSQLSchemaGenerator
+dialect.schemadropper = MSSQLSchemaDropper
+dialect.preparer = MSSQLIdentifierPreparer
+
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/databases/access.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/databases/access.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/databases/access.py (revision 3)
@@ -0,0 +1,443 @@
+# access.py
+# Copyright (C) 2007 Paul Johnston, paj@pajhome.org.uk
+# Portions derived from jet2sql.py by Matt Keranen, mksql@yahoo.com
+#
+# This module is part of SQLAlchemy and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+from sqlalchemy import sql, schema, types, exc, pool
+from sqlalchemy.sql import compiler, expression
+from sqlalchemy.engine import default, base
+
+
+class AcNumeric(types.Numeric):
+    def result_processor(self, dialect):
+        return None
+
+    def bind_processor(self, dialect):
+        def process(value):
+            if value is None:
+                # Not sure that this exception is needed
+                return value
+            else:
+                return str(value)
+        return process
+
+    def get_col_spec(self):
+        return "NUMERIC"
+
+class AcFloat(types.Float):
+    def get_col_spec(self):
+        return "FLOAT"
+
+    def bind_processor(self, dialect):
+        """By converting to string, we can use Decimal types round-trip."""
+        def process(value):
+            if not value is None:
+                return str(value)
+            return None
+        return process
+
+class AcInteger(types.Integer):
+    def get_col_spec(self):
+        return "INTEGER"
+
+class AcTinyInteger(types.Integer):
+    def get_col_spec(self):
+        return "TINYINT"
+
+class AcSmallInteger(types.Smallinteger):
+    def get_col_spec(self):
+        return "SMALLINT"
+
+class AcDateTime(types.DateTime):
+    def __init__(self, *a, **kw):
+        super(AcDateTime, self).__init__(False)
+
+    def get_col_spec(self):
+        return "DATETIME"
+
+class AcDate(types.Date):
+    def __init__(self, *a, **kw):
+        super(AcDate, self).__init__(False)
+
+    def get_col_spec(self):
+        return "DATETIME"
+
+class AcText(types.Text):
+    def get_col_spec(self):
+        return "MEMO"
+
+class AcString(types.String):
+    def get_col_spec(self):
+        return "TEXT" + (self.length and ("(%d)" % self.length) or "")
+
+class AcUnicode(types.Unicode):
+    def get_col_spec(self):
+        return "TEXT" + (self.length and ("(%d)" % self.length) or "")
+
+    def bind_processor(self, dialect):
+        return None
+
+    def result_processor(self, dialect):
+        return None
+
+class AcChar(types.CHAR):
+    def get_col_spec(self):
+        return "TEXT" + (self.length and ("(%d)" % self.length) or "")
+
+class AcBinary(types.Binary):
+    def get_col_spec(self):
+        return "BINARY"
+
+class AcBoolean(types.Boolean):
+    def get_col_spec(self):
+        return "YESNO"
+
+    def result_processor(self, dialect):
+        def process(value):
+            if value is None:
+                return None
+            return value and True or False
+        return process
+
+    def bind_processor(self, dialect):
+        def process(value):
+            if value is True:
+                return 1
+            elif value is False:
+                return 0
+            elif value is None:
+                return None
+            else:
+                return value and True or False
+        return process
+
+class AcTimeStamp(types.TIMESTAMP):
+    def get_col_spec(self):
+        return "TIMESTAMP"
+
+class AccessExecutionContext(default.DefaultExecutionContext):
+    def _has_implicit_sequence(self, column):
+        if column.primary_key and column.autoincrement:
+            if isinstance(column.type, types.Integer) and not column.foreign_keys:
+                if column.default is None or (isinstance(column.default, schema.Sequence) and \
+                                              column.default.optional):
+                    return True
+        return False
+
+    def post_exec(self):
+        """If we inserted into a row with a COUNTER column, fetch the ID"""
+
+        if self.compiled.isinsert:
+            tbl = self.compiled.statement.table
+            if not hasattr(tbl, 'has_sequence'):
+                tbl.has_sequence = None
+                for column in tbl.c:
+                    if getattr(column, 'sequence', False) or self._has_implicit_sequence(column):
+                        tbl.has_sequence = column
+                        break
+
+            if bool(tbl.has_sequence):
+                # TBD: for some reason _last_inserted_ids doesn't exist here
+                # (but it does at corresponding point in mssql???)
+                #if not len(self._last_inserted_ids) or self._last_inserted_ids[0] is None:
+                self.cursor.execute("SELECT @@identity AS lastrowid")
+                row = self.cursor.fetchone()
+                self._last_inserted_ids = [int(row[0])] #+ self._last_inserted_ids[1:]
+                # print "LAST ROW ID", self._last_inserted_ids
+
+        super(AccessExecutionContext, self).post_exec()
+
+
+const, daoEngine = None, None
+class AccessDialect(default.DefaultDialect):
+    colspecs = {
+        types.Unicode : AcUnicode,
+        types.Integer : AcInteger,
+        types.Smallinteger: AcSmallInteger,
+        types.Numeric : AcNumeric,
+        types.Float : AcFloat,
+        types.DateTime : AcDateTime,
+        types.Date : AcDate,
+        types.String : AcString,
+        types.Binary : AcBinary,
+        types.Boolean : AcBoolean,
+        types.Text : AcText,
+        types.CHAR: AcChar,
+        types.TIMESTAMP: AcTimeStamp,
+    }
+    name = 'access'
+    supports_sane_rowcount = False
+    supports_sane_multi_rowcount = False
+
+    def type_descriptor(self, typeobj):
+        newobj = types.adapt_type(typeobj, self.colspecs)
+        return newobj
+
+    def __init__(self, **params):
+        super(AccessDialect, self).__init__(**params)
+        self.text_as_varchar = False
+        self._dtbs = None
+
+    def dbapi(cls):
+        import win32com.client, pythoncom
+
+        global const, daoEngine
+        if const is None:
+            const = win32com.client.constants
+            for suffix in (".36", ".35", ".30"):
+                try:
+                    daoEngine = win32com.client.gencache.EnsureDispatch("DAO.DBEngine" + suffix)
+                    break
+                except pythoncom.com_error:
+                    pass
+            else:
+                raise exc.InvalidRequestError("Can't find a DB engine. Check http://support.microsoft.com/kb/239114 for details.")
+
+        import pyodbc as module
+        return module
+    dbapi = classmethod(dbapi)
+
+    def create_connect_args(self, url):
+        opts = url.translate_connect_args()
+        connectors = ["Driver={Microsoft Access Driver (*.mdb)}"]
+        connectors.append("Dbq=%s" % opts["database"])
+        user = opts.get("username", None)
+        if user:
+            connectors.append("UID=%s" % user)
+            connectors.append("PWD=%s" % opts.get("password", ""))
+        return [[";".join(connectors)], {}]
+
+    def last_inserted_ids(self):
+        return self.context.last_inserted_ids
+
+    def do_execute(self, cursor, statement, params, **kwargs):
+        if params == {}:
+            params = ()
+        super(AccessDialect, self).do_execute(cursor, statement, params, **kwargs)
+
+    def _execute(self, c, statement, parameters):
+        try:
+            if parameters == {}:
+                parameters = ()
+            c.execute(statement, parameters)
+            self.context.rowcount = c.rowcount
+        except Exception, e:
+            raise exc.DBAPIError.instance(statement, parameters, e)
+
+    def has_table(self, connection, tablename, schema=None):
+        # This approach seems to be more reliable that using DAO
+        try:
+            connection.execute('select top 1 * from [%s]' % tablename)
+            return True
+        except Exception, e:
+            return False
+
+    def reflecttable(self, connection, table, include_columns):
+        # This is defined in the function, as it relies on win32com constants,
+        # that aren't imported until dbapi method is called
+        if not hasattr(self, 'ischema_names'):
+            self.ischema_names = {
+                const.dbByte:       AcBinary,
+                const.dbInteger:    AcInteger,
+                const.dbLong:       AcInteger,
+                const.dbSingle:     AcFloat,
+                const.dbDouble:     AcFloat,
+                const.dbDate:       AcDateTime,
+                const.dbLongBinary: AcBinary,
+                const.dbMemo:       AcText,
+                const.dbBoolean:    AcBoolean,
+                const.dbText:       AcUnicode, # All Access strings are unicode
+                const.dbCurrency:   AcNumeric,
+            }
+
+        # A fresh DAO connection is opened for each reflection
+        # This is necessary, so we get the latest updates
+        dtbs = daoEngine.OpenDatabase(connection.engine.url.database)
+
+        try:
+            for tbl in dtbs.TableDefs:
+                if tbl.Name.lower() == table.name.lower():
+                    break
+            else:
+                raise exc.NoSuchTableError(table.name)
+
+            for col in tbl.Fields:
+                coltype = self.ischema_names[col.Type]
+                if col.Type == const.dbText:
+                    coltype = coltype(col.Size)
+
+                colargs = \
+                {
+                    'nullable': not(col.Required or col.Attributes & const.dbAutoIncrField),
+                }
+                default = col.DefaultValue
+
+                if col.Attributes & const.dbAutoIncrField:
+                    colargs['default'] = schema.Sequence(col.Name + '_seq')
+                elif default:
+                    if col.Type == const.dbBoolean:
+                        default = default == 'Yes' and '1' or '0'
+                    colargs['server_default'] = schema.DefaultClause(sql.text(default))
+
+                table.append_column(schema.Column(col.Name, coltype, **colargs))
+
+                # TBD: check constraints
+
+            # Find primary key columns first
+            for idx in tbl.Indexes:
+                if idx.Primary:
+                    for col in idx.Fields:
+                        thecol = table.c[col.Name]
+                        table.primary_key.add(thecol)
+                        if isinstance(thecol.type, AcInteger) and \
+                                not (thecol.default and isinstance(thecol.default.arg, schema.Sequence)):
+                            thecol.autoincrement = False
+
+            # Then add other indexes
+            for idx in tbl.Indexes:
+                if not idx.Primary:
+                    if len(idx.Fields) == 1:
+                        col = table.c[idx.Fields[0].Name]
+                        if not col.primary_key:
+                            col.index = True
+                            col.unique = idx.Unique
+                    else:
+                        pass # TBD: multi-column indexes
+
+
+            for fk in dtbs.Relations:
+                if fk.ForeignTable != table.name:
+                    continue
+                scols = [c.ForeignName for c in fk.Fields]
+                rcols = ['%s.%s' % (fk.Table, c.Name) for c in fk.Fields]
+                table.append_constraint(schema.ForeignKeyConstraint(scols, rcols, link_to_name=True))
+
+        finally:
+            dtbs.Close()
+
+    def table_names(self, connection, schema):
+        # A fresh DAO connection is opened for each reflection
+        # This is necessary, so we get the latest updates
+        dtbs = daoEngine.OpenDatabase(connection.engine.url.database)
+
+        names = [t.Name for t in dtbs.TableDefs if t.Name[:4] != "MSys" and t.Name[:4] != "~TMP"]
+        dtbs.Close()
+        return names
+
+
+class AccessCompiler(compiler.DefaultCompiler):
+    extract_map = compiler.DefaultCompiler.extract_map.copy()
+    extract_map.update ({
+            'month': 'm',
+            'day': 'd',
+            'year': 'yyyy',
+            'second': 's',
+            'hour': 'h',
+            'doy': 'y',
+            'minute': 'n',
+            'quarter': 'q',
+            'dow': 'w',
+            'week': 'ww'
+    })
+
+    def visit_select_precolumns(self, select):
+        """Access puts TOP, it's version of LIMIT here """
+        s = select.distinct and "DISTINCT " or ""
+        if select.limit:
+            s += "TOP %s " % (select.limit)
+        if select.offset:
+            raise exc.InvalidRequestError('Access does not support LIMIT with an offset')
+        return s
+
+    def limit_clause(self, select):
+        """Limit in access is after the select keyword"""
+        return ""
+
+    def binary_operator_string(self, binary):
+        """Access uses "mod" instead of "%" """
+        return binary.operator == '%' and 'mod' or binary.operator
+
+    def label_select_column(self, select, column, asfrom):
+        if isinstance(column, expression.Function):
+            return column.label()
+        else:
+            return super(AccessCompiler, self).label_select_column(select, column, asfrom)
+
+    function_rewrites =  {'current_date':       'now',
+                          'current_timestamp':  'now',
+                          'length':             'len',
+                          }
+    def visit_function(self, func):
+        """Access function names differ from the ANSI SQL names; rewrite common ones"""
+        func.name = self.function_rewrites.get(func.name, func.name)
+        return super(AccessCompiler, self).visit_function(func)
+
+    def for_update_clause(self, select):
+        """FOR UPDATE is not supported by Access; silently ignore"""
+        return ''
+
+    # Strip schema
+    def visit_table(self, table, asfrom=False, **kwargs):
+        if asfrom:
+            return self.preparer.quote(table.name, table.quote)
+        else:
+            return ""
+
+    def visit_join(self, join, asfrom=False, **kwargs):
+        return (self.process(join.left, asfrom=True) + (join.isouter and " LEFT OUTER JOIN " or " INNER JOIN ") + \
+            self.process(join.right, asfrom=True) + " ON " + self.process(join.onclause))
+
+    def visit_extract(self, extract):
+        field = self.extract_map.get(extract.field, extract.field)
+        return 'DATEPART("%s", %s)' % (field, self.process(extract.expr))
+
+
+class AccessSchemaGenerator(compiler.SchemaGenerator):
+    def get_column_specification(self, column, **kwargs):
+        colspec = self.preparer.format_column(column) + " " + column.type.dialect_impl(self.dialect).get_col_spec()
+
+        # install a sequence if we have an implicit IDENTITY column
+        if (not getattr(column.table, 'has_sequence', False)) and column.primary_key and \
+                column.autoincrement and isinstance(column.type, types.Integer) and not column.foreign_keys:
+            if column.default is None or (isinstance(column.default, schema.Sequence) and column.default.optional):
+                column.sequence = schema.Sequence(column.name + '_seq')
+
+        if not column.nullable:
+            colspec += " NOT NULL"
+
+        if hasattr(column, 'sequence'):
+            column.table.has_sequence = column
+            colspec = self.preparer.format_column(column) + " counter"
+        else:
+            default = self.get_column_default_string(column)
+            if default is not None:
+                colspec += " DEFAULT " + default
+
+        return colspec
+
+class AccessSchemaDropper(compiler.SchemaDropper):
+    def visit_index(self, index):
+        
+        self.append("\nDROP INDEX [%s].[%s]" % (index.table.name, self._validate_identifier(index.name, False)))
+        self.execute()
+
+class AccessDefaultRunner(base.DefaultRunner):
+    pass
+
+class AccessIdentifierPreparer(compiler.IdentifierPreparer):
+    reserved_words = compiler.RESERVED_WORDS.copy()
+    reserved_words.update(['value', 'text'])
+    def __init__(self, dialect):
+        super(AccessIdentifierPreparer, self).__init__(dialect, initial_quote='[', final_quote=']')
+
+
+dialect = AccessDialect
+dialect.poolclass = pool.SingletonThreadPool
+dialect.statement_compiler = AccessCompiler
+dialect.schemagenerator = AccessSchemaGenerator
+dialect.schemadropper = AccessSchemaDropper
+dialect.preparer = AccessIdentifierPreparer
+dialect.defaultrunner = AccessDefaultRunner
+dialect.execution_ctx_cls = AccessExecutionContext
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/databases/sqlite.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/databases/sqlite.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/databases/sqlite.py (revision 3)
@@ -0,0 +1,646 @@
+# sqlite.py
+# Copyright (C) 2005, 2006, 2007, 2008, 2009 Michael Bayer mike_mp@zzzcomputing.com
+#
+# This module is part of SQLAlchemy and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+"""Support for the SQLite database.
+
+Driver
+------
+
+When using Python 2.5 and above, the built in ``sqlite3`` driver is 
+already installed and no additional installation is needed.  Otherwise,
+the ``pysqlite2`` driver needs to be present.  This is the same driver as
+``sqlite3``, just with a different name.
+
+The ``pysqlite2`` driver will be loaded first, and if not found, ``sqlite3``
+is loaded.  This allows an explicitly installed pysqlite driver to take
+precedence over the built in one.   As with all dialects, a specific 
+DBAPI module may be provided to :func:`~sqlalchemy.create_engine()` to control 
+this explicitly::
+
+    from sqlite3 import dbapi2 as sqlite
+    e = create_engine('sqlite:///file.db', module=sqlite)
+
+Full documentation on pysqlite is available at:
+`<http://www.initd.org/pub/software/pysqlite/doc/usage-guide.html>`_
+
+Connect Strings
+---------------
+
+The file specification for the SQLite database is taken as the "database" portion of
+the URL.  Note that the format of a url is::
+
+    driver://user:pass@host/database
+    
+This means that the actual filename to be used starts with the characters to the
+**right** of the third slash.   So connecting to a relative filepath looks like::
+
+    # relative path
+    e = create_engine('sqlite:///path/to/database.db')
+    
+An absolute path, which is denoted by starting with a slash, means you need **four**
+slashes::
+
+    # absolute path
+    e = create_engine('sqlite:////path/to/database.db')
+
+To use a Windows path, regular drive specifications and backslashes can be used.  
+Double backslashes are probably needed::
+
+    # absolute path on Windows
+    e = create_engine('sqlite:///C:\\\\path\\\\to\\\\database.db')
+
+The sqlite ``:memory:`` identifier is the default if no filepath is present.  Specify
+``sqlite://`` and nothing else::
+
+    # in-memory database
+    e = create_engine('sqlite://')
+
+Threading Behavior
+------------------
+
+Pysqlite connections do not support being moved between threads, unless
+the ``check_same_thread`` Pysqlite flag is set to ``False``.  In addition,
+when using an in-memory SQLite database, the full database exists only within 
+the scope of a single connection.  It is reported that an in-memory
+database does not support being shared between threads regardless of the 
+``check_same_thread`` flag - which means that a multithreaded
+application **cannot** share data from a ``:memory:`` database across threads
+unless access to the connection is limited to a single worker thread which communicates
+through a queueing mechanism to concurrent threads.
+
+To provide a default which accomodates SQLite's default threading capabilities
+somewhat reasonably, the SQLite dialect will specify that the :class:`~sqlalchemy.pool.SingletonThreadPool`
+be used by default.  This pool maintains a single SQLite connection per thread
+that is held open up to a count of five concurrent threads.  When more than five threads
+are used, a cleanup mechanism will dispose of excess unused connections.   
+
+Two optional pool implementations that may be appropriate for particular SQLite usage scenarios:
+
+ * the :class:`sqlalchemy.pool.StaticPool` might be appropriate for a multithreaded
+   application using an in-memory database, assuming the threading issues inherent in 
+   pysqlite are somehow accomodated for.  This pool holds persistently onto a single connection
+   which is never closed, and is returned for all requests.
+   
+ * the :class:`sqlalchemy.pool.NullPool` might be appropriate for an application that
+   makes use of a file-based sqlite database.  This pool disables any actual "pooling"
+   behavior, and simply opens and closes real connections corresonding to the :func:`connect()`
+   and :func:`close()` methods.  SQLite can "connect" to a particular file with very high 
+   efficiency, so this option may actually perform better without the extra overhead
+   of :class:`SingletonThreadPool`.  NullPool will of course render a ``:memory:`` connection
+   useless since the database would be lost as soon as the connection is "returned" to the pool.
+
+Date and Time Types
+-------------------
+
+SQLite does not have built-in DATE, TIME, or DATETIME types, and pysqlite does not provide 
+out of the box functionality for translating values between Python `datetime` objects
+and a SQLite-supported format.  SQLAlchemy's own :class:`~sqlalchemy.types.DateTime`
+and related types provide date formatting and parsing functionality when SQlite is used.
+The implementation classes are :class:`SLDateTime`, :class:`SLDate` and :class:`SLTime`.
+These types represent dates and times as ISO formatted strings, which also nicely
+support ordering.   There's no reliance on typical "libc" internals for these functions
+so historical dates are fully supported.
+
+Unicode
+-------
+
+In contrast to SQLAlchemy's active handling of date and time types for pysqlite, pysqlite's 
+default behavior regarding Unicode is that all strings are returned as Python unicode objects
+in all cases.  So even if the :class:`~sqlalchemy.types.Unicode` type is 
+*not* used, you will still always receive unicode data back from a result set.  It is 
+**strongly** recommended that you do use the :class:`~sqlalchemy.types.Unicode` type
+to represent strings, since it will raise a warning if a non-unicode Python string is 
+passed from the user application.  Mixing the usage of non-unicode objects with returned unicode objects can
+quickly create confusion, particularly when using the ORM as internal data is not 
+always represented by an actual database result string.
+
+"""
+
+
+import datetime, re, time
+
+from sqlalchemy import sql, schema, exc, pool, DefaultClause
+from sqlalchemy.engine import default
+import sqlalchemy.types as sqltypes
+import sqlalchemy.util as util
+from sqlalchemy.sql import compiler, functions as sql_functions
+from types import NoneType
+
+class SLNumeric(sqltypes.Numeric):
+    def bind_processor(self, dialect):
+        type_ = self.asdecimal and str or float
+        def process(value):
+            if value is not None:
+                return type_(value)
+            else:
+                return value
+        return process
+
+    def get_col_spec(self):
+        if self.precision is None:
+            return "NUMERIC"
+        else:
+            return "NUMERIC(%(precision)s, %(scale)s)" % {'precision': self.precision, 'scale' : self.scale}
+
+class SLFloat(sqltypes.Float):
+    def bind_processor(self, dialect):
+        type_ = self.asdecimal and str or float
+        def process(value):
+            if value is not None:
+                return type_(value)
+            else:
+                return value
+        return process
+
+    def get_col_spec(self):
+        return "FLOAT"
+    
+class SLInteger(sqltypes.Integer):
+    def get_col_spec(self):
+        return "INTEGER"
+
+class SLSmallInteger(sqltypes.Smallinteger):
+    def get_col_spec(self):
+        return "SMALLINT"
+
+class DateTimeMixin(object):
+    def _bind_processor(self, format, elements):
+        def process(value):
+            if not isinstance(value, (NoneType, datetime.date, datetime.datetime, datetime.time)):
+                raise TypeError("SQLite Date, Time, and DateTime types only accept Python datetime objects as input.")
+            elif value is not None:
+                return format % tuple([getattr(value, attr, 0) for attr in elements])
+            else:
+                return None
+        return process
+
+    def _result_processor(self, fn, regexp):
+        def process(value):
+            if value is not None:
+                return fn(*[int(x or 0) for x in regexp.match(value).groups()])
+            else:
+                return None
+        return process
+
+class SLDateTime(DateTimeMixin, sqltypes.DateTime):
+    __legacy_microseconds__ = False
+
+    def get_col_spec(self):
+        return "TIMESTAMP"
+
+    def bind_processor(self, dialect):
+        if self.__legacy_microseconds__:
+            return self._bind_processor(
+                        "%4.4d-%2.2d-%2.2d %2.2d:%2.2d:%2.2d.%s", 
+                        ("year", "month", "day", "hour", "minute", "second", "microsecond")
+                        )
+        else:
+            return self._bind_processor(
+                        "%4.4d-%2.2d-%2.2d %2.2d:%2.2d:%2.2d.%06d", 
+                        ("year", "month", "day", "hour", "minute", "second", "microsecond")
+                        )
+
+    _reg = re.compile(r"(\d+)-(\d+)-(\d+)(?: (\d+):(\d+):(\d+)(?:\.(\d+))?)?")
+    def result_processor(self, dialect):
+        return self._result_processor(datetime.datetime, self._reg)
+
+class SLDate(DateTimeMixin, sqltypes.Date):
+    def get_col_spec(self):
+        return "DATE"
+
+    def bind_processor(self, dialect):
+        return self._bind_processor(
+                        "%4.4d-%2.2d-%2.2d", 
+                        ("year", "month", "day")
+                )
+
+    _reg = re.compile(r"(\d+)-(\d+)-(\d+)")
+    def result_processor(self, dialect):
+        return self._result_processor(datetime.date, self._reg)
+
+class SLTime(DateTimeMixin, sqltypes.Time):
+    __legacy_microseconds__ = False
+
+    def get_col_spec(self):
+        return "TIME"
+
+    def bind_processor(self, dialect):
+        if self.__legacy_microseconds__:
+            return self._bind_processor(
+                            "%2.2d:%2.2d:%2.2d.%s", 
+                            ("hour", "minute", "second", "microsecond")
+                    )
+        else:
+            return self._bind_processor(
+                            "%2.2d:%2.2d:%2.2d.%06d", 
+                            ("hour", "minute", "second", "microsecond")
+                    )
+
+    _reg = re.compile(r"(\d+):(\d+):(\d+)(?:\.(\d+))?")
+    def result_processor(self, dialect):
+        return self._result_processor(datetime.time, self._reg)
+
+class SLUnicodeMixin(object):
+    def bind_processor(self, dialect):
+        if self.convert_unicode or dialect.convert_unicode:
+            if self.assert_unicode is None:
+                assert_unicode = dialect.assert_unicode
+            else:
+                assert_unicode = self.assert_unicode
+                
+            if not assert_unicode:
+                return None
+                
+            def process(value):
+                if not isinstance(value, (unicode, NoneType)):
+                    if assert_unicode == 'warn':
+                        util.warn("Unicode type received non-unicode bind "
+                                  "param value %r" % value)
+                        return value
+                    else:
+                        raise exc.InvalidRequestError("Unicode type received non-unicode bind param value %r" % value)
+                else:
+                    return value
+            return process
+        else:
+            return None
+
+    def result_processor(self, dialect):
+        return None
+    
+class SLText(SLUnicodeMixin, sqltypes.Text):
+    def get_col_spec(self):
+        return "TEXT"
+
+class SLString(SLUnicodeMixin, sqltypes.String):
+    def get_col_spec(self):
+        return "VARCHAR" + (self.length and "(%d)" % self.length or "")
+
+class SLChar(SLUnicodeMixin, sqltypes.CHAR):
+    def get_col_spec(self):
+        return "CHAR" + (self.length and "(%d)" % self.length or "")
+
+class SLBinary(sqltypes.Binary):
+    def get_col_spec(self):
+        return "BLOB"
+
+class SLBoolean(sqltypes.Boolean):
+    def get_col_spec(self):
+        return "BOOLEAN"
+
+    def bind_processor(self, dialect):
+        def process(value):
+            if value is None:
+                return None
+            return value and 1 or 0
+        return process
+
+    def result_processor(self, dialect):
+        def process(value):
+            if value is None:
+                return None
+            return value == 1
+        return process
+
+colspecs = {
+    sqltypes.Binary: SLBinary,
+    sqltypes.Boolean: SLBoolean,
+    sqltypes.CHAR: SLChar,
+    sqltypes.Date: SLDate,
+    sqltypes.DateTime: SLDateTime,
+    sqltypes.Float: SLFloat,
+    sqltypes.Integer: SLInteger,
+    sqltypes.NCHAR: SLChar,
+    sqltypes.Numeric: SLNumeric,
+    sqltypes.Smallinteger: SLSmallInteger,
+    sqltypes.String: SLString,
+    sqltypes.Text: SLText,
+    sqltypes.Time: SLTime,
+}
+
+ischema_names = {
+    'BLOB': SLBinary,
+    'BOOL': SLBoolean,
+    'BOOLEAN': SLBoolean,
+    'CHAR': SLChar,
+    'DATE': SLDate,
+    'DATETIME': SLDateTime,
+    'DECIMAL': SLNumeric,
+    'FLOAT': SLFloat,
+    'INT': SLInteger,
+    'INTEGER': SLInteger,
+    'NUMERIC': SLNumeric,
+    'REAL': SLNumeric,
+    'SMALLINT': SLSmallInteger,
+    'TEXT': SLText,
+    'TIME': SLTime,
+    'TIMESTAMP': SLDateTime,
+    'VARCHAR': SLString,
+}
+
+class SQLiteExecutionContext(default.DefaultExecutionContext):
+    def post_exec(self):
+        if self.compiled.isinsert and not self.executemany:
+            if not len(self._last_inserted_ids) or self._last_inserted_ids[0] is None:
+                self._last_inserted_ids = [self.cursor.lastrowid] + self._last_inserted_ids[1:]
+
+class SQLiteDialect(default.DefaultDialect):
+    name = 'sqlite'
+    supports_alter = False
+    supports_unicode_statements = True
+    default_paramstyle = 'qmark'
+    supports_default_values = True
+    supports_empty_insert = False
+
+    def __init__(self, **kwargs):
+        default.DefaultDialect.__init__(self, **kwargs)
+        def vers(num):
+            return tuple([int(x) for x in num.split('.')])
+        if self.dbapi is not None:
+            sqlite_ver = self.dbapi.version_info
+            if sqlite_ver < (2, 1, '3'):
+                util.warn(
+                    ("The installed version of pysqlite2 (%s) is out-dated "
+                     "and will cause errors in some cases.  Version 2.1.3 "
+                     "or greater is recommended.") %
+                    '.'.join([str(subver) for subver in sqlite_ver]))
+            if self.dbapi.sqlite_version_info < (3, 3, 8):
+                self.supports_default_values = False
+        self.supports_cast = (self.dbapi is None or vers(self.dbapi.sqlite_version) >= vers("3.2.3"))
+
+    def dbapi(cls):
+        try:
+            from pysqlite2 import dbapi2 as sqlite
+        except ImportError, e:
+            try:
+                from sqlite3 import dbapi2 as sqlite #try the 2.5+ stdlib name.
+            except ImportError:
+                raise e
+        return sqlite
+    dbapi = classmethod(dbapi)
+
+    def server_version_info(self, connection):
+        return self.dbapi.sqlite_version_info
+
+    def create_connect_args(self, url):
+        if url.username or url.password or url.host or url.port:
+            raise exc.ArgumentError(
+                "Invalid SQLite URL: %s\n"
+                "Valid SQLite URL forms are:\n"
+                " sqlite:///:memory: (or, sqlite://)\n"
+                " sqlite:///relative/path/to/file.db\n"
+                " sqlite:////absolute/path/to/file.db" % (url,))
+        filename = url.database or ':memory:'
+
+        opts = url.query.copy()
+        util.coerce_kw_type(opts, 'timeout', float)
+        util.coerce_kw_type(opts, 'isolation_level', str)
+        util.coerce_kw_type(opts, 'detect_types', int)
+        util.coerce_kw_type(opts, 'check_same_thread', bool)
+        util.coerce_kw_type(opts, 'cached_statements', int)
+
+        return ([filename], opts)
+
+    def type_descriptor(self, typeobj):
+        return sqltypes.adapt_type(typeobj, colspecs)
+
+    def is_disconnect(self, e):
+        return isinstance(e, self.dbapi.ProgrammingError) and "Cannot operate on a closed database." in str(e)
+
+    def table_names(self, connection, schema):
+        if schema is not None:
+            qschema = self.identifier_preparer.quote_identifier(schema)
+            master = '%s.sqlite_master' % qschema
+            s = ("SELECT name FROM %s "
+                 "WHERE type='table' ORDER BY name") % (master,)
+            rs = connection.execute(s)
+        else:
+            try:
+                s = ("SELECT name FROM "
+                     " (SELECT * FROM sqlite_master UNION ALL "
+                     "  SELECT * FROM sqlite_temp_master) "
+                     "WHERE type='table' ORDER BY name")
+                rs = connection.execute(s)
+            except exc.DBAPIError:
+                raise
+                s = ("SELECT name FROM sqlite_master "
+                     "WHERE type='table' ORDER BY name")
+                rs = connection.execute(s)
+
+        return [row[0] for row in rs]
+
+    def has_table(self, connection, table_name, schema=None):
+        quote = self.identifier_preparer.quote_identifier
+        if schema is not None:
+            pragma = "PRAGMA %s." % quote(schema)
+        else:
+            pragma = "PRAGMA "
+        qtable = quote(table_name)
+        cursor = _pragma_cursor(connection.execute("%stable_info(%s)" % (pragma, qtable)))
+            
+        row = cursor.fetchone()
+
+        # consume remaining rows, to work around
+        # http://www.sqlite.org/cvstrac/tktview?tn=1884
+        while cursor.fetchone() is not None:
+            pass
+
+        return (row is not None)
+
+    def reflecttable(self, connection, table, include_columns):
+        preparer = self.identifier_preparer
+        if table.schema is None:
+            pragma = "PRAGMA "
+        else:
+            pragma = "PRAGMA %s." % preparer.quote_identifier(table.schema)
+        qtable = preparer.format_table(table, False)
+
+        c = _pragma_cursor(connection.execute("%stable_info(%s)" % (pragma, qtable)))
+        found_table = False
+        while True:
+            row = c.fetchone()
+            if row is None:
+                break
+
+            found_table = True
+            (name, type_, nullable, default, has_default, primary_key) = (row[1], row[2].upper(), not row[3], row[4], row[4] is not None, row[5])
+            name = re.sub(r'^\"|\"$', '', name)
+            if include_columns and name not in include_columns:
+                continue
+            match = re.match(r'(\w+)(\(.*?\))?', type_)
+            if match:
+                coltype = match.group(1)
+                args = match.group(2)
+            else:
+                coltype = "VARCHAR"
+                args = ''
+
+            try:
+                coltype = ischema_names[coltype]
+            except KeyError:
+                util.warn("Did not recognize type '%s' of column '%s'" %
+                          (coltype, name))
+                coltype = sqltypes.NullType
+
+            if args is not None:
+                args = re.findall(r'(\d+)', args)
+                coltype = coltype(*[int(a) for a in args])
+
+            colargs = []
+            if has_default:
+                colargs.append(DefaultClause(sql.text(default)))
+            table.append_column(schema.Column(name, coltype, primary_key = primary_key, nullable = nullable, *colargs))
+
+        if not found_table:
+            raise exc.NoSuchTableError(table.name)
+
+        c = _pragma_cursor(connection.execute("%sforeign_key_list(%s)" % (pragma, qtable)))
+        fks = {}
+        while True:
+            row = c.fetchone()
+            if row is None:
+                break
+            (constraint_name, tablename, localcol, remotecol) = (row[0], row[2], row[3], row[4])
+            tablename = re.sub(r'^\"|\"$', '', tablename)
+            localcol = re.sub(r'^\"|\"$', '', localcol)
+            remotecol = re.sub(r'^\"|\"$', '', remotecol)
+            try:
+                fk = fks[constraint_name]
+            except KeyError:
+                fk = ([], [])
+                fks[constraint_name] = fk
+
+            # look up the table based on the given table's engine, not 'self',
+            # since it could be a ProxyEngine
+            remotetable = schema.Table(tablename, table.metadata, autoload=True, autoload_with=connection)
+            constrained_column = table.c[localcol].name
+            refspec = ".".join([tablename, remotecol])
+            if constrained_column not in fk[0]:
+                fk[0].append(constrained_column)
+            if refspec not in fk[1]:
+                fk[1].append(refspec)
+        for name, value in fks.iteritems():
+            table.append_constraint(schema.ForeignKeyConstraint(value[0], value[1], link_to_name=True))
+        # check for UNIQUE indexes
+        c = _pragma_cursor(connection.execute("%sindex_list(%s)" % (pragma, qtable)))
+        unique_indexes = []
+        while True:
+            row = c.fetchone()
+            if row is None:
+                break
+            if (row[2] == 1):
+                unique_indexes.append(row[1])
+        # loop thru unique indexes for one that includes the primary key
+        for idx in unique_indexes:
+            c = connection.execute("%sindex_info(%s)" % (pragma, idx))
+            cols = []
+            while True:
+                row = c.fetchone()
+                if row is None:
+                    break
+                cols.append(row[2])
+
+def _pragma_cursor(cursor):
+    if cursor.closed:
+        cursor._fetchone_impl = lambda: None
+    return cursor
+        
+class SQLiteCompiler(compiler.DefaultCompiler):
+    functions = compiler.DefaultCompiler.functions.copy()
+    functions.update (
+        {
+            sql_functions.now: 'CURRENT_TIMESTAMP',
+            sql_functions.char_length: 'length%(expr)s'
+        }
+    )
+
+    extract_map = compiler.DefaultCompiler.extract_map.copy()
+    extract_map.update({
+        'month': '%m',
+        'day': '%d',
+        'year': '%Y',
+        'second': '%S',
+        'hour': '%H',
+        'doy': '%j',
+        'minute': '%M',
+        'epoch': '%s',
+        'dow': '%w',
+        'week': '%W'
+    })
+
+    def visit_cast(self, cast, **kwargs):
+        if self.dialect.supports_cast:
+            return super(SQLiteCompiler, self).visit_cast(cast)
+        else:
+            return self.process(cast.clause)
+
+    def visit_extract(self, extract):
+        try:
+            return "CAST(STRFTIME('%s', %s) AS INTEGER)" % (
+                self.extract_map[extract.field], self.process(extract.expr))
+        except KeyError:
+            raise exc.ArgumentError(
+                "%s is not a valid extract argument." % extract.field)
+
+    def limit_clause(self, select):
+        text = ""
+        if select._limit is not None:
+            text +=  " \n LIMIT " + str(select._limit)
+        if select._offset is not None:
+            if select._limit is None:
+                text += " \n LIMIT -1"
+            text += " OFFSET " + str(select._offset)
+        else:
+            text += " OFFSET 0"
+        return text
+
+    def for_update_clause(self, select):
+        # sqlite has no "FOR UPDATE" AFAICT
+        return ''
+
+
+class SQLiteSchemaGenerator(compiler.SchemaGenerator):
+
+    def get_column_specification(self, column, **kwargs):
+        colspec = self.preparer.format_column(column) + " " + column.type.dialect_impl(self.dialect).get_col_spec()
+        default = self.get_column_default_string(column)
+        if default is not None:
+            colspec += " DEFAULT " + default
+
+        if not column.nullable:
+            colspec += " NOT NULL"
+        return colspec
+
+class SQLiteIdentifierPreparer(compiler.IdentifierPreparer):
+    reserved_words = set([
+        'add', 'after', 'all', 'alter', 'analyze', 'and', 'as', 'asc',
+        'attach', 'autoincrement', 'before', 'begin', 'between', 'by',
+        'cascade', 'case', 'cast', 'check', 'collate', 'column', 'commit',
+        'conflict', 'constraint', 'create', 'cross', 'current_date',
+        'current_time', 'current_timestamp', 'database', 'default',
+        'deferrable', 'deferred', 'delete', 'desc', 'detach', 'distinct',
+        'drop', 'each', 'else', 'end', 'escape', 'except', 'exclusive',
+        'explain', 'false', 'fail', 'for', 'foreign', 'from', 'full', 'glob',
+        'group', 'having', 'if', 'ignore', 'immediate', 'in', 'index',
+        'initially', 'inner', 'insert', 'instead', 'intersect', 'into', 'is',
+        'isnull', 'join', 'key', 'left', 'like', 'limit', 'match', 'natural',
+        'not', 'notnull', 'null', 'of', 'offset', 'on', 'or', 'order', 'outer',
+        'plan', 'pragma', 'primary', 'query', 'raise', 'references',
+        'reindex', 'rename', 'replace', 'restrict', 'right', 'rollback',
+        'row', 'select', 'set', 'table', 'temp', 'temporary', 'then', 'to',
+        'transaction', 'trigger', 'true', 'union', 'unique', 'update', 'using',
+        'vacuum', 'values', 'view', 'virtual', 'when', 'where', 'indexed',
+        ])
+
+    def __init__(self, dialect):
+        super(SQLiteIdentifierPreparer, self).__init__(dialect)
+
+dialect = SQLiteDialect
+dialect.poolclass = pool.SingletonThreadPool
+dialect.statement_compiler = SQLiteCompiler
+dialect.schemagenerator = SQLiteSchemaGenerator
+dialect.preparer = SQLiteIdentifierPreparer
+dialect.execution_ctx_cls = SQLiteExecutionContext
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/databases/postgresql.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/databases/postgresql.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/databases/postgresql.py (revision 3)
@@ -0,0 +1,5 @@
+"""Provide forwards compatibility with SQLAlchemy 0.6 which 
+uses the name "postgresql" for the Postgresql dialect.
+
+"""
+from sqlalchemy.databases.postgres import dialect
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/databases/information_schema.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/databases/information_schema.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/databases/information_schema.py (revision 3)
@@ -0,0 +1,193 @@
+"""
+information schema implementation.
+
+This module is deprecated and will not be present in this form in SQLAlchemy 0.6.
+
+"""
+from sqlalchemy import util
+
+util.warn_deprecated("the information_schema module is deprecated.")
+
+import sqlalchemy.sql as sql
+import sqlalchemy.exc as exc
+from sqlalchemy import select, MetaData, Table, Column, String, Integer
+from sqlalchemy.schema import DefaultClause, ForeignKeyConstraint
+
+ischema = MetaData()
+
+schemata = Table("schemata", ischema,
+    Column("catalog_name", String),
+    Column("schema_name", String),
+    Column("schema_owner", String),
+    schema="information_schema")
+
+tables = Table("tables", ischema,
+    Column("table_catalog", String),
+    Column("table_schema", String),
+    Column("table_name", String),
+    Column("table_type", String),
+    schema="information_schema")
+
+columns = Table("columns", ischema,
+    Column("table_schema", String),
+    Column("table_name", String),
+    Column("column_name", String),
+    Column("is_nullable", Integer),
+    Column("data_type", String),
+    Column("ordinal_position", Integer),
+    Column("character_maximum_length", Integer),
+    Column("numeric_precision", Integer),
+    Column("numeric_scale", Integer),
+    Column("column_default", Integer),
+    Column("collation_name", String),
+    schema="information_schema")
+
+constraints = Table("table_constraints", ischema,
+    Column("table_schema", String),
+    Column("table_name", String),
+    Column("constraint_name", String),
+    Column("constraint_type", String),
+    schema="information_schema")
+
+column_constraints = Table("constraint_column_usage", ischema,
+    Column("table_schema", String),
+    Column("table_name", String),
+    Column("column_name", String),
+    Column("constraint_name", String),
+    schema="information_schema")
+
+pg_key_constraints = Table("key_column_usage", ischema,
+    Column("table_schema", String),
+    Column("table_name", String),
+    Column("column_name", String),
+    Column("constraint_name", String),
+    Column("ordinal_position", Integer),
+    schema="information_schema")
+
+#mysql_key_constraints = Table("key_column_usage", ischema,
+#    Column("table_schema", String),
+#    Column("table_name", String),
+#    Column("column_name", String),
+#    Column("constraint_name", String),
+#    Column("referenced_table_schema", String),
+#    Column("referenced_table_name", String),
+#    Column("referenced_column_name", String),
+#    schema="information_schema")
+
+key_constraints = pg_key_constraints
+
+ref_constraints = Table("referential_constraints", ischema,
+    Column("constraint_catalog", String),
+    Column("constraint_schema", String),
+    Column("constraint_name", String),
+    Column("unique_constraint_catlog", String),
+    Column("unique_constraint_schema", String),
+    Column("unique_constraint_name", String),
+    Column("match_option", String),
+    Column("update_rule", String),
+    Column("delete_rule", String),
+    schema="information_schema")
+
+
+def table_names(connection, schema):
+    s = select([tables.c.table_name], tables.c.table_schema==schema)
+    return [row[0] for row in connection.execute(s)]
+
+
+def reflecttable(connection, table, include_columns, ischema_names):
+    key_constraints = pg_key_constraints
+
+    if table.schema is not None:
+        current_schema = table.schema
+    else:
+        current_schema = connection.default_schema_name()
+
+    s = select([columns],
+        sql.and_(columns.c.table_name==table.name,
+        columns.c.table_schema==current_schema),
+        order_by=[columns.c.ordinal_position])
+
+    c = connection.execute(s)
+    found_table = False
+    while True:
+        row = c.fetchone()
+        if row is None:
+            break
+        #print "row! " + repr(row)
+ #       continue
+        found_table = True
+        (name, type, nullable, charlen, numericprec, numericscale, default) = (
+            row[columns.c.column_name],
+            row[columns.c.data_type],
+            row[columns.c.is_nullable] == 'YES',
+            row[columns.c.character_maximum_length],
+            row[columns.c.numeric_precision],
+            row[columns.c.numeric_scale],
+            row[columns.c.column_default]
+            )
+        if include_columns and name not in include_columns:
+            continue
+
+        args = []
+        for a in (charlen, numericprec, numericscale):
+            if a is not None:
+                args.append(a)
+        coltype = ischema_names[type]
+        #print "coltype " + repr(coltype) + " args " +  repr(args)
+        coltype = coltype(*args)
+        colargs = []
+        if default is not None:
+            colargs.append(DefaultClause(sql.text(default)))
+        table.append_column(Column(name, coltype, nullable=nullable, *colargs))
+
+    if not found_table:
+        raise exc.NoSuchTableError(table.name)
+
+    # we are relying on the natural ordering of the constraint_column_usage table to return the referenced columns
+    # in an order that corresponds to the ordinal_position in the key_constraints table, otherwise composite foreign keys
+    # wont reflect properly.  dont see a way around this based on whats available from information_schema
+    s = select([constraints.c.constraint_name, constraints.c.constraint_type, constraints.c.table_name, key_constraints], use_labels=True, from_obj=[constraints.join(column_constraints, column_constraints.c.constraint_name==constraints.c.constraint_name).join(key_constraints, key_constraints.c.constraint_name==column_constraints.c.constraint_name)], order_by=[key_constraints.c.ordinal_position])
+    s.append_column(column_constraints)
+    s.append_whereclause(constraints.c.table_name==table.name)
+    s.append_whereclause(constraints.c.table_schema==current_schema)
+    colmap = [constraints.c.constraint_type, key_constraints.c.column_name, column_constraints.c.table_schema, column_constraints.c.table_name, column_constraints.c.column_name, constraints.c.constraint_name, key_constraints.c.ordinal_position]
+    c = connection.execute(s)
+
+    fks = {}
+    while True:
+        row = c.fetchone()
+        if row is None:
+            break
+        (type, constrained_column, referred_schema, referred_table, referred_column, constraint_name, ordinal_position) = (
+            row[colmap[0]],
+            row[colmap[1]],
+            row[colmap[2]],
+            row[colmap[3]],
+            row[colmap[4]],
+            row[colmap[5]],
+            row[colmap[6]]
+        )
+        #print "type %s on column %s to remote %s.%s.%s" % (type, constrained_column, referred_schema, referred_table, referred_column)
+        if type == 'PRIMARY KEY':
+            table.primary_key.add(table.c[constrained_column])
+        elif type == 'FOREIGN KEY':
+            try:
+                fk = fks[constraint_name]
+            except KeyError:
+                fk = ([], [])
+                fks[constraint_name] = fk
+            if current_schema == referred_schema:
+                referred_schema = table.schema
+            if referred_schema is not None:
+                Table(referred_table, table.metadata, autoload=True, schema=referred_schema, autoload_with=connection)
+                refspec = ".".join([referred_schema, referred_table, referred_column])
+            else:
+                Table(referred_table, table.metadata, autoload=True, autoload_with=connection)
+                refspec = ".".join([referred_table, referred_column])
+            if constrained_column not in fk[0]:
+                fk[0].append(constrained_column)
+            if refspec not in fk[1]:
+                fk[1].append(refspec)
+
+    for name, value in fks.iteritems():
+        table.append_constraint(ForeignKeyConstraint(value[0], value[1], name=name))
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/databases/mysql.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/databases/mysql.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/databases/mysql.py (revision 3)
@@ -0,0 +1,2732 @@
+# -*- fill-column: 78 -*-
+# mysql.py
+# Copyright (C) 2005, 2006, 2007, 2008, 2009 Michael Bayer mike_mp@zzzcomputing.com
+#
+# This module is part of SQLAlchemy and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+"""Support for the MySQL database.
+
+Overview
+--------
+
+For normal SQLAlchemy usage, importing this module is unnecessary.  It will be
+loaded on-demand when a MySQL connection is needed.  The generic column types
+like :class:`~sqlalchemy.String` and :class:`~sqlalchemy.Integer` will
+automatically be adapted to the optimal matching MySQL column type.
+
+But if you would like to use one of the MySQL-specific or enhanced column
+types when creating tables with your :class:`~sqlalchemy.Table` definitions,
+then you will need to import them from this module::
+
+  from sqlalchemy.databases import mysql
+
+  Table('mytable', metadata,
+        Column('id', Integer, primary_key=True),
+        Column('ittybittyblob', mysql.MSTinyBlob),
+        Column('biggy', mysql.MSBigInteger(unsigned=True)))
+
+All standard MySQL column types are supported.  The OpenGIS types are
+available for use via table reflection but have no special support or mapping
+to Python classes.  If you're using these types and have opinions about how
+OpenGIS can be smartly integrated into SQLAlchemy please join the mailing
+list!
+
+Supported Versions and Features
+-------------------------------
+
+SQLAlchemy supports 6 major MySQL versions: 3.23, 4.0, 4.1, 5.0, 5.1 and 6.0,
+with capabilities increasing with more modern servers.
+
+Versions 4.1 and higher support the basic SQL functionality that SQLAlchemy
+uses in the ORM and SQL expressions.  These versions pass the applicable tests
+in the suite 100%.  No heroic measures are taken to work around major missing
+SQL features- if your server version does not support sub-selects, for
+example, they won't work in SQLAlchemy either.
+
+Currently, the only DB-API driver supported is `MySQL-Python` (also referred to
+as `MySQLdb`).  Either 1.2.1 or 1.2.2 are recommended.  The alpha, beta and
+gamma releases of 1.2.1 and 1.2.2 should be avoided.  Support for Jython and
+IronPython is planned.
+
+=====================================  ===============
+Feature                                Minimum Version
+=====================================  ===============
+sqlalchemy.orm                         4.1.1
+Table Reflection                       3.23.x
+DDL Generation                         4.1.1
+utf8/Full Unicode Connections          4.1.1
+Transactions                           3.23.15
+Two-Phase Transactions                 5.0.3
+Nested Transactions                    5.0.3
+=====================================  ===============
+
+See the official MySQL documentation for detailed information about features
+supported in any given server release.
+
+Character Sets
+--------------
+
+Many MySQL server installations default to a ``latin1`` encoding for client
+connections.  All data sent through the connection will be converted into
+``latin1``, even if you have ``utf8`` or another character set on your tables
+and columns.  With versions 4.1 and higher, you can change the connection
+character set either through server configuration or by including the
+``charset`` parameter in the URL used for ``create_engine``.  The ``charset``
+option is passed through to MySQL-Python and has the side-effect of also
+enabling ``use_unicode`` in the driver by default.  For regular encoded
+strings, also pass ``use_unicode=0`` in the connection arguments::
+
+  # set client encoding to utf8; all strings come back as unicode
+  create_engine('mysql:///mydb?charset=utf8')
+
+  # set client encoding to utf8; all strings come back as utf8 str
+  create_engine('mysql:///mydb?charset=utf8&use_unicode=0')
+
+Storage Engines
+---------------
+
+Most MySQL server installations have a default table type of ``MyISAM``, a
+non-transactional table type.  During a transaction, non-transactional storage
+engines do not participate and continue to store table changes in autocommit
+mode.  For fully atomic transactions, all participating tables must use a
+transactional engine such as ``InnoDB``, ``Falcon``, ``SolidDB``, `PBXT`, etc.
+
+Storage engines can be elected when creating tables in SQLAlchemy by supplying
+a ``mysql_engine='whatever'`` to the ``Table`` constructor.  Any MySQL table
+creation option can be specified in this syntax::
+
+  Table('mytable', metadata,
+        Column('data', String(32)),
+        mysql_engine='InnoDB',
+        mysql_charset='utf8'
+       )
+
+Keys
+----
+
+Not all MySQL storage engines support foreign keys.  For ``MyISAM`` and
+similar engines, the information loaded by table reflection will not include
+foreign keys.  For these tables, you may supply a
+:class:`~sqlalchemy.ForeignKeyConstraint` at reflection time::
+
+  Table('mytable', metadata,
+        ForeignKeyConstraint(['other_id'], ['othertable.other_id']),
+        autoload=True
+       )
+
+When creating tables, SQLAlchemy will automatically set ``AUTO_INCREMENT``` on
+an integer primary key column::
+
+  >>> t = Table('mytable', metadata,
+  ...   Column('mytable_id', Integer, primary_key=True)
+  ... )
+  >>> t.create()
+  CREATE TABLE mytable (
+          id INTEGER NOT NULL AUTO_INCREMENT,
+          PRIMARY KEY (id)
+  )
+
+You can disable this behavior by supplying ``autoincrement=False`` to the
+:class:`~sqlalchemy.Column`.  This flag can also be used to enable
+auto-increment on a secondary column in a multi-column key for some storage
+engines::
+
+  Table('mytable', metadata,
+        Column('gid', Integer, primary_key=True, autoincrement=False),
+        Column('id', Integer, primary_key=True)
+       )
+
+SQL Mode
+--------
+
+MySQL SQL modes are supported.  Modes that enable ``ANSI_QUOTES`` (such as
+``ANSI``) require an engine option to modify SQLAlchemy's quoting style.
+When using an ANSI-quoting mode, supply ``use_ansiquotes=True`` when
+creating your ``Engine``::
+
+  create_engine('mysql://localhost/test', use_ansiquotes=True)
+
+This is an engine-wide option and is not toggleable on a per-connection basis.
+SQLAlchemy does not presume to ``SET sql_mode`` for you with this option.  For
+the best performance, set the quoting style server-wide in ``my.cnf`` or by
+supplying ``--sql-mode`` to ``mysqld``.  You can also use a
+:class:`sqlalchemy.pool.Pool` listener hook to issue a ``SET SESSION
+sql_mode='...'`` on connect to configure each connection.
+
+If you do not specify ``use_ansiquotes``, the regular MySQL quoting style is
+used by default.
+
+If you do issue a ``SET sql_mode`` through SQLAlchemy, the dialect must be
+updated if the quoting style is changed.  Again, this change will affect all
+connections::
+
+  connection.execute('SET sql_mode="ansi"')
+  connection.dialect.use_ansiquotes = True
+
+MySQL SQL Extensions
+--------------------
+
+Many of the MySQL SQL extensions are handled through SQLAlchemy's generic
+function and operator support::
+
+  table.select(table.c.password==func.md5('plaintext'))
+  table.select(table.c.username.op('regexp')('^[a-d]'))
+
+And of course any valid MySQL statement can be executed as a string as well.
+
+Some limited direct support for MySQL extensions to SQL is currently
+available.
+
+  * SELECT pragma::
+
+      select(..., prefixes=['HIGH_PRIORITY', 'SQL_SMALL_RESULT'])
+
+  * UPDATE with LIMIT::
+
+      update(..., mysql_limit=10)
+
+Troubleshooting
+---------------
+
+If you have problems that seem server related, first check that you are
+using the most recent stable MySQL-Python package available.  The Database
+Notes page on the wiki at http://www.sqlalchemy.org is a good resource for
+timely information affecting MySQL in SQLAlchemy.
+
+"""
+
+import datetime, decimal, inspect, re, sys
+from array import array as _array
+
+from sqlalchemy import exc, log, schema, sql, util
+from sqlalchemy.sql import operators as sql_operators
+from sqlalchemy.sql import functions as sql_functions
+from sqlalchemy.sql import compiler
+
+from sqlalchemy.engine import base as engine_base, default
+from sqlalchemy import types as sqltypes
+
+
+__all__ = (
+    'MSBigInteger', 'MSMediumInteger', 'MSBinary', 'MSBit', 'MSBlob', 'MSBoolean',
+    'MSChar', 'MSDate', 'MSDateTime', 'MSDecimal', 'MSDouble',
+    'MSEnum', 'MSFloat', 'MSInteger', 'MSLongBlob', 'MSLongText',
+    'MSMediumBlob', 'MSMediumText', 'MSNChar', 'MSNVarChar',
+    'MSNumeric', 'MSSet', 'MSSmallInteger', 'MSString', 'MSText',
+    'MSTime', 'MSTimeStamp', 'MSTinyBlob', 'MSTinyInteger',
+    'MSTinyText', 'MSVarBinary', 'MSYear' )
+
+
+RESERVED_WORDS = set(
+    ['accessible', 'add', 'all', 'alter', 'analyze','and', 'as', 'asc',
+     'asensitive', 'before', 'between', 'bigint', 'binary', 'blob', 'both',
+     'by', 'call', 'cascade', 'case', 'change', 'char', 'character', 'check',
+     'collate', 'column', 'condition', 'constraint', 'continue', 'convert',
+     'create', 'cross', 'current_date', 'current_time', 'current_timestamp',
+     'current_user', 'cursor', 'database', 'databases', 'day_hour',
+     'day_microsecond', 'day_minute', 'day_second', 'dec', 'decimal',
+     'declare', 'default', 'delayed', 'delete', 'desc', 'describe',
+     'deterministic', 'distinct', 'distinctrow', 'div', 'double', 'drop',
+     'dual', 'each', 'else', 'elseif', 'enclosed', 'escaped', 'exists',
+     'exit', 'explain', 'false', 'fetch', 'float', 'float4', 'float8',
+     'for', 'force', 'foreign', 'from', 'fulltext', 'grant', 'group', 'having',
+     'high_priority', 'hour_microsecond', 'hour_minute', 'hour_second', 'if',
+     'ignore', 'in', 'index', 'infile', 'inner', 'inout', 'insensitive',
+     'insert', 'int', 'int1', 'int2', 'int3', 'int4', 'int8', 'integer',
+     'interval', 'into', 'is', 'iterate', 'join', 'key', 'keys', 'kill',
+     'leading', 'leave', 'left', 'like', 'limit', 'linear', 'lines', 'load',
+     'localtime', 'localtimestamp', 'lock', 'long', 'longblob', 'longtext',
+     'loop', 'low_priority', 'master_ssl_verify_server_cert', 'match',
+     'mediumblob', 'mediumint', 'mediumtext', 'middleint',
+     'minute_microsecond', 'minute_second', 'mod', 'modifies', 'natural',
+     'not', 'no_write_to_binlog', 'null', 'numeric', 'on', 'optimize',
+     'option', 'optionally', 'or', 'order', 'out', 'outer', 'outfile',
+     'precision', 'primary', 'procedure', 'purge', 'range', 'read', 'reads',
+     'read_only', 'read_write', 'real', 'references', 'regexp', 'release',
+     'rename', 'repeat', 'replace', 'require', 'restrict', 'return',
+     'revoke', 'right', 'rlike', 'schema', 'schemas', 'second_microsecond',
+     'select', 'sensitive', 'separator', 'set', 'show', 'smallint', 'spatial',
+     'specific', 'sql', 'sqlexception', 'sqlstate', 'sqlwarning',
+     'sql_big_result', 'sql_calc_found_rows', 'sql_small_result', 'ssl',
+     'starting', 'straight_join', 'table', 'terminated', 'then', 'tinyblob',
+     'tinyint', 'tinytext', 'to', 'trailing', 'trigger', 'true', 'undo',
+     'union', 'unique', 'unlock', 'unsigned', 'update', 'usage', 'use',
+     'using', 'utc_date', 'utc_time', 'utc_timestamp', 'values', 'varbinary',
+     'varchar', 'varcharacter', 'varying', 'when', 'where', 'while', 'with',
+     'write', 'x509', 'xor', 'year_month', 'zerofill', # 5.0
+     'columns', 'fields', 'privileges', 'soname', 'tables', # 4.1
+     'accessible', 'linear', 'master_ssl_verify_server_cert', 'range',
+     'read_only', 'read_write', # 5.1
+     ])
+
+AUTOCOMMIT_RE = re.compile(
+    r'\s*(?:UPDATE|INSERT|CREATE|DELETE|DROP|ALTER|LOAD +DATA|REPLACE)',
+    re.I | re.UNICODE)
+SET_RE = re.compile(
+    r'\s*SET\s+(?:(?:GLOBAL|SESSION)\s+)?\w',
+    re.I | re.UNICODE)
+
+
+class _NumericType(object):
+    """Base for MySQL numeric types."""
+
+    def __init__(self, kw):
+        self.unsigned = kw.pop('unsigned', False)
+        self.zerofill = kw.pop('zerofill', False)
+
+    def _extend(self, spec):
+        "Extend a numeric-type declaration with MySQL specific extensions."
+
+        if self.unsigned:
+            spec += ' UNSIGNED'
+        if self.zerofill:
+            spec += ' ZEROFILL'
+        return spec
+
+
+class _StringType(object):
+    """Base for MySQL string types."""
+
+    def __init__(self, charset=None, collation=None,
+                 ascii=False, unicode=False, binary=False,
+                 national=False, **kwargs):
+        self.charset = charset
+        # allow collate= or collation=
+        self.collation = kwargs.get('collate', collation)
+        self.ascii = ascii
+        self.unicode = unicode
+        self.binary = binary
+        self.national = national
+
+    def _extend(self, spec):
+        """Extend a string-type declaration with standard SQL CHARACTER SET /
+        COLLATE annotations and MySQL specific extensions.
+        """
+
+        if self.charset:
+            charset = 'CHARACTER SET %s' % self.charset
+        elif self.ascii:
+            charset = 'ASCII'
+        elif self.unicode:
+            charset = 'UNICODE'
+        else:
+            charset = None
+
+        if self.collation:
+            collation = 'COLLATE %s' % self.collation
+        elif self.binary:
+            collation = 'BINARY'
+        else:
+            collation = None
+
+        if self.national:
+            # NATIONAL (aka NCHAR/NVARCHAR) trumps charsets.
+            return ' '.join([c for c in ('NATIONAL', spec, collation)
+                             if c is not None])
+        return ' '.join([c for c in (spec, charset, collation)
+                         if c is not None])
+
+    def __repr__(self):
+        attributes = inspect.getargspec(self.__init__)[0][1:]
+        attributes.extend(inspect.getargspec(_StringType.__init__)[0][1:])
+
+        params = {}
+        for attr in attributes:
+            val = getattr(self, attr)
+            if val is not None and val is not False:
+                params[attr] = val
+
+        return "%s(%s)" % (self.__class__.__name__,
+                           ', '.join(['%s=%r' % (k, params[k]) for k in params]))
+
+
+class MSNumeric(sqltypes.Numeric, _NumericType):
+    """MySQL NUMERIC type."""
+
+    def __init__(self, precision=10, scale=2, asdecimal=True, **kw):
+        """Construct a NUMERIC.
+
+        :param precision: Total digits in this number.  If scale and precision
+          are both None, values are stored to limits allowed by the server.
+
+        :param scale: The number of digits after the decimal point.
+
+        :param unsigned: a boolean, optional.
+
+        :param zerofill: Optional. If true, values will be stored as strings
+          left-padded with zeros. Note that this does not effect the values
+          returned by the underlying database API, which continue to be
+          numeric.
+
+        """
+        _NumericType.__init__(self, kw)
+        sqltypes.Numeric.__init__(self, precision, scale, asdecimal=asdecimal, **kw)
+
+    def get_col_spec(self):
+        if self.precision is None:
+            return self._extend("NUMERIC")
+        else:
+            return self._extend("NUMERIC(%(precision)s, %(scale)s)" % {'precision': self.precision, 'scale' : self.scale})
+
+    def bind_processor(self, dialect):
+        return None
+
+    def result_processor(self, dialect):
+        if not self.asdecimal:
+            def process(value):
+                if isinstance(value, decimal.Decimal):
+                    return float(value)
+                else:
+                    return value
+            return process
+        else:
+            return None
+
+
+class MSDecimal(MSNumeric):
+    """MySQL DECIMAL type."""
+
+    def __init__(self, precision=10, scale=2, asdecimal=True, **kw):
+        """Construct a DECIMAL.
+
+        :param precision: Total digits in this number.  If scale and precision
+          are both None, values are stored to limits allowed by the server.
+
+        :param scale: The number of digits after the decimal point.
+
+        :param unsigned: a boolean, optional.
+
+        :param zerofill: Optional. If true, values will be stored as strings
+          left-padded with zeros. Note that this does not effect the values
+          returned by the underlying database API, which continue to be
+          numeric.
+
+        """
+        super(MSDecimal, self).__init__(precision, scale, asdecimal=asdecimal, **kw)
+
+    def get_col_spec(self):
+        if self.precision is None:
+            return self._extend("DECIMAL")
+        elif self.scale is None:
+            return self._extend("DECIMAL(%(precision)s)" % {'precision': self.precision})
+        else:
+            return self._extend("DECIMAL(%(precision)s, %(scale)s)" % {'precision': self.precision, 'scale' : self.scale})
+
+
+class MSDouble(sqltypes.Float, _NumericType):
+    """MySQL DOUBLE type."""
+
+    def __init__(self, precision=None, scale=None, asdecimal=True, **kw):
+        """Construct a DOUBLE.
+
+        :param precision: Total digits in this number.  If scale and precision
+          are both None, values are stored to limits allowed by the server.
+
+        :param scale: The number of digits after the decimal point.
+
+        :param unsigned: a boolean, optional.
+
+        :param zerofill: Optional. If true, values will be stored as strings
+          left-padded with zeros. Note that this does not effect the values
+          returned by the underlying database API, which continue to be
+          numeric.
+
+        """
+        if ((precision is None and scale is not None) or
+            (precision is not None and scale is None)):
+            raise exc.ArgumentError(
+                "You must specify both precision and scale or omit "
+                "both altogether.")
+
+        _NumericType.__init__(self, kw)
+        sqltypes.Float.__init__(self, asdecimal=asdecimal, **kw)
+        self.scale = scale
+        self.precision = precision
+
+    def get_col_spec(self):
+        if self.precision is not None and self.scale is not None:
+            return self._extend("DOUBLE(%(precision)s, %(scale)s)" %
+                                {'precision': self.precision,
+                                 'scale' : self.scale})
+        else:
+            return self._extend('DOUBLE')
+
+
+class MSReal(MSDouble):
+    """MySQL REAL type."""
+
+    def __init__(self, precision=None, scale=None, asdecimal=True, **kw):
+        """Construct a REAL.
+
+        :param precision: Total digits in this number.  If scale and precision
+          are both None, values are stored to limits allowed by the server.
+
+        :param scale: The number of digits after the decimal point.
+
+        :param unsigned: a boolean, optional.
+
+        :param zerofill: Optional. If true, values will be stored as strings
+          left-padded with zeros. Note that this does not effect the values
+          returned by the underlying database API, which continue to be
+          numeric.
+
+        """
+        MSDouble.__init__(self, precision, scale, asdecimal, **kw)
+
+    def get_col_spec(self):
+        if self.precision is not None and self.scale is not None:
+            return self._extend("REAL(%(precision)s, %(scale)s)" %
+                                {'precision': self.precision,
+                                 'scale' : self.scale})
+        else:
+            return self._extend('REAL')
+
+
+class MSFloat(sqltypes.Float, _NumericType):
+    """MySQL FLOAT type."""
+
+    def __init__(self, precision=None, scale=None, asdecimal=False, **kw):
+        """Construct a FLOAT.
+
+        :param precision: Total digits in this number.  If scale and precision
+          are both None, values are stored to limits allowed by the server.
+
+        :param scale: The number of digits after the decimal point.
+
+        :param unsigned: a boolean, optional.
+
+        :param zerofill: Optional. If true, values will be stored as strings
+          left-padded with zeros. Note that this does not effect the values
+          returned by the underlying database API, which continue to be
+          numeric.
+
+        """
+        _NumericType.__init__(self, kw)
+        sqltypes.Float.__init__(self, asdecimal=asdecimal, **kw)
+        self.scale = scale
+        self.precision = precision
+
+    def get_col_spec(self):
+        if self.scale is not None and self.precision is not None:
+            return self._extend("FLOAT(%s, %s)" % (self.precision, self.scale))
+        elif self.precision is not None:
+            return self._extend("FLOAT(%s)" % (self.precision,))
+        else:
+            return self._extend("FLOAT")
+
+    def bind_processor(self, dialect):
+        return None
+
+
+class MSInteger(sqltypes.Integer, _NumericType):
+    """MySQL INTEGER type."""
+
+    def __init__(self, display_width=None, **kw):
+        """Construct an INTEGER.
+
+        :param display_width: Optional, maximum display width for this number.
+
+        :param unsigned: a boolean, optional.
+
+        :param zerofill: Optional. If true, values will be stored as strings
+          left-padded with zeros. Note that this does not effect the values
+          returned by the underlying database API, which continue to be
+          numeric.
+
+        """
+        if 'length' in kw:
+            util.warn_deprecated("'length' is deprecated for MSInteger and subclasses.  Use 'display_width'.")
+            self.display_width = kw.pop('length')
+        else:
+            self.display_width = display_width
+        _NumericType.__init__(self, kw)
+        sqltypes.Integer.__init__(self, **kw)
+
+    def get_col_spec(self):
+        if self.display_width is not None:
+            return self._extend("INTEGER(%(display_width)s)" % {'display_width': self.display_width})
+        else:
+            return self._extend("INTEGER")
+
+
+class MSBigInteger(MSInteger):
+    """MySQL BIGINTEGER type."""
+
+    def __init__(self, display_width=None, **kw):
+        """Construct a BIGINTEGER.
+
+        :param display_width: Optional, maximum display width for this number.
+
+        :param unsigned: a boolean, optional.
+
+        :param zerofill: Optional. If true, values will be stored as strings
+          left-padded with zeros. Note that this does not effect the values
+          returned by the underlying database API, which continue to be
+          numeric.
+
+        """
+        super(MSBigInteger, self).__init__(display_width, **kw)
+
+    def get_col_spec(self):
+        if self.display_width is not None:
+            return self._extend("BIGINT(%(display_width)s)" % {'display_width': self.display_width})
+        else:
+            return self._extend("BIGINT")
+
+
+class MSMediumInteger(MSInteger):
+    """MySQL MEDIUMINTEGER type."""
+
+    def __init__(self, display_width=None, **kw):
+        """Construct a MEDIUMINTEGER
+
+        :param display_width: Optional, maximum display width for this number.
+
+        :param unsigned: a boolean, optional.
+
+        :param zerofill: Optional. If true, values will be stored as strings
+          left-padded with zeros. Note that this does not effect the values
+          returned by the underlying database API, which continue to be
+          numeric.
+
+        """
+        super(MSMediumInteger, self).__init__(display_width, **kw)
+
+    def get_col_spec(self):
+        if self.display_width is not None:
+            return self._extend("MEDIUMINT(%(display_width)s)" % {'display_width': self.display_width})
+        else:
+            return self._extend("MEDIUMINT")
+
+
+
+class MSTinyInteger(MSInteger):
+    """MySQL TINYINT type."""
+
+    def __init__(self, display_width=None, **kw):
+        """Construct a TINYINT.
+
+        Note: following the usual MySQL conventions, TINYINT(1) columns
+        reflected during Table(..., autoload=True) are treated as
+        Boolean columns.
+
+        :param display_width: Optional, maximum display width for this number.
+
+        :param unsigned: a boolean, optional.
+
+        :param zerofill: Optional. If true, values will be stored as strings
+          left-padded with zeros. Note that this does not effect the values
+          returned by the underlying database API, which continue to be
+          numeric.
+
+        """
+        super(MSTinyInteger, self).__init__(display_width, **kw)
+
+    def get_col_spec(self):
+        if self.display_width is not None:
+            return self._extend("TINYINT(%s)" % self.display_width)
+        else:
+            return self._extend("TINYINT")
+
+
+class MSSmallInteger(sqltypes.Smallinteger, MSInteger):
+    """MySQL SMALLINTEGER type."""
+
+    def __init__(self, display_width=None, **kw):
+        """Construct a SMALLINTEGER.
+
+        :param display_width: Optional, maximum display width for this number.
+
+        :param unsigned: a boolean, optional.
+
+        :param zerofill: Optional. If true, values will be stored as strings
+          left-padded with zeros. Note that this does not effect the values
+          returned by the underlying database API, which continue to be
+          numeric.
+
+        """
+        self.display_width = display_width
+        _NumericType.__init__(self, kw)
+        sqltypes.SmallInteger.__init__(self, **kw)
+
+    def get_col_spec(self):
+        if self.display_width is not None:
+            return self._extend("SMALLINT(%(display_width)s)" % {'display_width': self.display_width})
+        else:
+            return self._extend("SMALLINT")
+
+
+class MSBit(sqltypes.TypeEngine):
+    """MySQL BIT type.
+
+    This type is for MySQL 5.0.3 or greater for MyISAM, and 5.0.5 or greater for
+    MyISAM, MEMORY, InnoDB and BDB.  For older versions, use a MSTinyInteger()
+    type.
+
+    """
+
+    def __init__(self, length=None):
+        """Construct a BIT.
+
+        :param length: Optional, number of bits.
+
+        """
+        self.length = length
+
+    def result_processor(self, dialect):
+        """Convert a MySQL's 64 bit, variable length binary string to a long."""
+        def process(value):
+            if value is not None:
+                v = 0L
+                for i in map(ord, value):
+                    v = v << 8 | i
+                value = v
+            return value
+        return process
+
+    def get_col_spec(self):
+        if self.length is not None:
+            return "BIT(%s)" % self.length
+        else:
+            return "BIT"
+
+
+class MSDateTime(sqltypes.DateTime):
+    """MySQL DATETIME type."""
+
+    def get_col_spec(self):
+        return "DATETIME"
+
+
+class MSDate(sqltypes.Date):
+    """MySQL DATE type."""
+
+    def get_col_spec(self):
+        return "DATE"
+
+
+class MSTime(sqltypes.Time):
+    """MySQL TIME type."""
+
+    def get_col_spec(self):
+        return "TIME"
+
+    def result_processor(self, dialect):
+        def process(value):
+            # convert from a timedelta value
+            if value is not None:
+                return datetime.time(value.seconds/60/60, value.seconds/60%60, value.seconds - (value.seconds/60*60))
+            else:
+                return None
+        return process
+
+class MSTimeStamp(sqltypes.TIMESTAMP):
+    """MySQL TIMESTAMP type.
+
+    To signal the orm to automatically re-select modified rows to retrieve the
+    updated timestamp, add a ``server_default`` to your
+    :class:`~sqlalchemy.Column` specification::
+
+        from sqlalchemy.databases import mysql
+        Column('updated', mysql.MSTimeStamp,
+               server_default=sql.text('CURRENT_TIMESTAMP')
+              )
+
+    The full range of MySQL 4.1+ TIMESTAMP defaults can be specified in
+    the the default::
+
+        server_default=sql.text('CURRENT TIMESTAMP ON UPDATE CURRENT_TIMESTAMP')
+
+    """
+
+    def get_col_spec(self):
+        return "TIMESTAMP"
+
+
+class MSYear(sqltypes.TypeEngine):
+    """MySQL YEAR type, for single byte storage of years 1901-2155."""
+
+    def __init__(self, display_width=None):
+        self.display_width = display_width
+
+    def get_col_spec(self):
+        if self.display_width is None:
+            return "YEAR"
+        else:
+            return "YEAR(%s)" % self.display_width
+
+class MSText(_StringType, sqltypes.Text):
+    """MySQL TEXT type, for text up to 2^16 characters."""
+
+    def __init__(self, length=None, **kwargs):
+        """Construct a TEXT.
+
+        :param length: Optional, if provided the server may optimize storage
+          by substituting the smallest TEXT type sufficient to store
+          ``length`` characters.
+
+        :param charset: Optional, a column-level character set for this string
+          value.  Takes precedence to 'ascii' or 'unicode' short-hand.
+
+        :param collation: Optional, a column-level collation for this string
+          value.  Takes precedence to 'binary' short-hand.
+
+        :param ascii: Defaults to False: short-hand for the ``latin1``
+          character set, generates ASCII in schema.
+
+        :param unicode: Defaults to False: short-hand for the ``ucs2``
+          character set, generates UNICODE in schema.
+
+        :param national: Optional. If true, use the server's configured
+          national character set.
+
+        :param binary: Defaults to False: short-hand, pick the binary
+          collation type that matches the column's character set.  Generates
+          BINARY in schema.  This does not affect the type of data stored,
+          only the collation of character data.
+
+        """
+        _StringType.__init__(self, **kwargs)
+        sqltypes.Text.__init__(self, length,
+                               kwargs.get('convert_unicode', False), kwargs.get('assert_unicode', None))
+
+    def get_col_spec(self):
+        if self.length:
+            return self._extend("TEXT(%d)" % self.length)
+        else:
+            return self._extend("TEXT")
+
+
+class MSTinyText(MSText):
+    """MySQL TINYTEXT type, for text up to 2^8 characters."""
+
+    def __init__(self, **kwargs):
+        """Construct a TINYTEXT.
+
+        :param charset: Optional, a column-level character set for this string
+          value.  Takes precedence to 'ascii' or 'unicode' short-hand.
+
+        :param collation: Optional, a column-level collation for this string
+          value.  Takes precedence to 'binary' short-hand.
+
+        :param ascii: Defaults to False: short-hand for the ``latin1``
+          character set, generates ASCII in schema.
+
+        :param unicode: Defaults to False: short-hand for the ``ucs2``
+          character set, generates UNICODE in schema.
+
+        :param national: Optional. If true, use the server's configured
+          national character set.
+
+        :param binary: Defaults to False: short-hand, pick the binary
+          collation type that matches the column's character set.  Generates
+          BINARY in schema.  This does not affect the type of data stored,
+          only the collation of character data.
+
+        """
+
+        super(MSTinyText, self).__init__(**kwargs)
+
+    def get_col_spec(self):
+        return self._extend("TINYTEXT")
+
+
+class MSMediumText(MSText):
+    """MySQL MEDIUMTEXT type, for text up to 2^24 characters."""
+
+    def __init__(self, **kwargs):
+        """Construct a MEDIUMTEXT.
+
+        :param charset: Optional, a column-level character set for this string
+          value.  Takes precedence to 'ascii' or 'unicode' short-hand.
+
+        :param collation: Optional, a column-level collation for this string
+          value.  Takes precedence to 'binary' short-hand.
+
+        :param ascii: Defaults to False: short-hand for the ``latin1``
+          character set, generates ASCII in schema.
+
+        :param unicode: Defaults to False: short-hand for the ``ucs2``
+          character set, generates UNICODE in schema.
+
+        :param national: Optional. If true, use the server's configured
+          national character set.
+
+        :param binary: Defaults to False: short-hand, pick the binary
+          collation type that matches the column's character set.  Generates
+          BINARY in schema.  This does not affect the type of data stored,
+          only the collation of character data.
+
+        """
+        super(MSMediumText, self).__init__(**kwargs)
+
+    def get_col_spec(self):
+        return self._extend("MEDIUMTEXT")
+
+
+class MSLongText(MSText):
+    """MySQL LONGTEXT type, for text up to 2^32 characters."""
+
+    def __init__(self, **kwargs):
+        """Construct a LONGTEXT.
+
+        :param charset: Optional, a column-level character set for this string
+          value.  Takes precedence to 'ascii' or 'unicode' short-hand.
+
+        :param collation: Optional, a column-level collation for this string
+          value.  Takes precedence to 'binary' short-hand.
+
+        :param ascii: Defaults to False: short-hand for the ``latin1``
+          character set, generates ASCII in schema.
+
+        :param unicode: Defaults to False: short-hand for the ``ucs2``
+          character set, generates UNICODE in schema.
+
+        :param national: Optional. If true, use the server's configured
+          national character set.
+
+        :param binary: Defaults to False: short-hand, pick the binary
+          collation type that matches the column's character set.  Generates
+          BINARY in schema.  This does not affect the type of data stored,
+          only the collation of character data.
+
+        """
+        super(MSLongText, self).__init__(**kwargs)
+
+    def get_col_spec(self):
+        return self._extend("LONGTEXT")
+
+
+class MSString(_StringType, sqltypes.String):
+    """MySQL VARCHAR type, for variable-length character data."""
+
+    def __init__(self, length=None, **kwargs):
+        """Construct a VARCHAR.
+
+        :param charset: Optional, a column-level character set for this string
+          value.  Takes precedence to 'ascii' or 'unicode' short-hand.
+
+        :param collation: Optional, a column-level collation for this string
+          value.  Takes precedence to 'binary' short-hand.
+
+        :param ascii: Defaults to False: short-hand for the ``latin1``
+          character set, generates ASCII in schema.
+
+        :param unicode: Defaults to False: short-hand for the ``ucs2``
+          character set, generates UNICODE in schema.
+
+        :param national: Optional. If true, use the server's configured
+          national character set.
+
+        :param binary: Defaults to False: short-hand, pick the binary
+          collation type that matches the column's character set.  Generates
+          BINARY in schema.  This does not affect the type of data stored,
+          only the collation of character data.
+
+        """
+        _StringType.__init__(self, **kwargs)
+        sqltypes.String.__init__(self, length,
+                                 kwargs.get('convert_unicode', False), kwargs.get('assert_unicode', None))
+
+    def get_col_spec(self):
+        if self.length:
+            return self._extend("VARCHAR(%d)" % self.length)
+        else:
+            return self._extend("VARCHAR")
+
+
+class MSChar(_StringType, sqltypes.CHAR):
+    """MySQL CHAR type, for fixed-length character data."""
+
+    def __init__(self, length, **kwargs):
+        """Construct an NCHAR.
+
+        :param length: Maximum data length, in characters.
+
+        :param binary: Optional, use the default binary collation for the
+          national character set.  This does not affect the type of data
+          stored, use a BINARY type for binary data.
+
+        :param collation: Optional, request a particular collation.  Must be
+          compatible with the national character set.
+
+        """
+        _StringType.__init__(self, **kwargs)
+        sqltypes.CHAR.__init__(self, length,
+                               kwargs.get('convert_unicode', False))
+
+    def get_col_spec(self):
+        return self._extend("CHAR(%(length)s)" % {'length' : self.length})
+
+
+class MSNVarChar(_StringType, sqltypes.String):
+    """MySQL NVARCHAR type.
+
+    For variable-length character data in the server's configured national
+    character set.
+    """
+
+    def __init__(self, length=None, **kwargs):
+        """Construct an NVARCHAR.
+
+        :param length: Maximum data length, in characters.
+
+        :param binary: Optional, use the default binary collation for the
+          national character set.  This does not affect the type of data
+          stored, use a BINARY type for binary data.
+
+        :param collation: Optional, request a particular collation.  Must be
+          compatible with the national character set.
+
+        """
+        kwargs['national'] = True
+        _StringType.__init__(self, **kwargs)
+        sqltypes.String.__init__(self, length,
+                                 kwargs.get('convert_unicode', False))
+
+    def get_col_spec(self):
+        # We'll actually generate the equiv. "NATIONAL VARCHAR" instead
+        # of "NVARCHAR".
+        return self._extend("VARCHAR(%(length)s)" % {'length': self.length})
+
+
+class MSNChar(_StringType, sqltypes.CHAR):
+    """MySQL NCHAR type.
+
+    For fixed-length character data in the server's configured national
+    character set.
+    """
+
+    def __init__(self, length=None, **kwargs):
+        """Construct an NCHAR.  Arguments are:
+
+        :param length: Maximum data length, in characters.
+
+        :param binary: Optional, use the default binary collation for the
+          national character set.  This does not affect the type of data
+          stored, use a BINARY type for binary data.
+
+        :param collation: Optional, request a particular collation.  Must be
+          compatible with the national character set.
+
+        """
+        kwargs['national'] = True
+        _StringType.__init__(self, **kwargs)
+        sqltypes.CHAR.__init__(self, length,
+                               kwargs.get('convert_unicode', False))
+    def get_col_spec(self):
+        # We'll actually generate the equiv. "NATIONAL CHAR" instead of "NCHAR".
+        return self._extend("CHAR(%(length)s)" % {'length': self.length})
+
+
+class _BinaryType(sqltypes.Binary):
+    """Base for MySQL binary types."""
+
+    def get_col_spec(self):
+        if self.length:
+            return "BLOB(%d)" % self.length
+        else:
+            return "BLOB"
+
+    def result_processor(self, dialect):
+        def process(value):
+            if value is None:
+                return None
+            else:
+                return util.buffer(value)
+        return process
+
+class MSVarBinary(_BinaryType):
+    """MySQL VARBINARY type, for variable length binary data."""
+
+    def __init__(self, length=None, **kw):
+        """Construct a VARBINARY.  Arguments are:
+
+        :param length: Maximum data length, in characters.
+
+        """
+        super(MSVarBinary, self).__init__(length, **kw)
+
+    def get_col_spec(self):
+        if self.length:
+            return "VARBINARY(%d)" % self.length
+        else:
+            return "BLOB"
+
+
+class MSBinary(_BinaryType):
+    """MySQL BINARY type, for fixed length binary data"""
+
+    def __init__(self, length=None, **kw):
+        """Construct a BINARY.
+
+        This is a fixed length type, and short values will be right-padded
+        with a server-version-specific pad value.
+
+        :param length: Maximum data length, in bytes.  If length is not
+          specified, this will generate a BLOB.  This usage is deprecated.
+
+        """
+        super(MSBinary, self).__init__(length, **kw)
+
+    def get_col_spec(self):
+        if self.length:
+            return "BINARY(%d)" % self.length
+        else:
+            return "BLOB"
+
+    def result_processor(self, dialect):
+        def process(value):
+            if value is None:
+                return None
+            else:
+                return util.buffer(value)
+        return process
+
+class MSBlob(_BinaryType):
+    """MySQL BLOB type, for binary data up to 2^16 bytes"""
+
+    def __init__(self, length=None, **kw):
+        """Construct a BLOB.  Arguments are:
+
+        :param length: Optional, if provided the server may optimize storage
+          by substituting the smallest TEXT type sufficient to store
+          ``length`` characters.
+
+        """
+        super(MSBlob, self).__init__(length, **kw)
+
+    def get_col_spec(self):
+        if self.length:
+            return "BLOB(%d)" % self.length
+        else:
+            return "BLOB"
+
+    def result_processor(self, dialect):
+        def process(value):
+            if value is None:
+                return None
+            else:
+                return util.buffer(value)
+        return process
+
+    def __repr__(self):
+        return "%s()" % self.__class__.__name__
+
+
+class MSTinyBlob(MSBlob):
+    """MySQL TINYBLOB type, for binary data up to 2^8 bytes."""
+
+    def get_col_spec(self):
+        return "TINYBLOB"
+
+
+class MSMediumBlob(MSBlob):
+    """MySQL MEDIUMBLOB type, for binary data up to 2^24 bytes."""
+
+    def get_col_spec(self):
+        return "MEDIUMBLOB"
+
+
+class MSLongBlob(MSBlob):
+    """MySQL LONGBLOB type, for binary data up to 2^32 bytes."""
+
+    def get_col_spec(self):
+        return "LONGBLOB"
+
+
+class MSEnum(MSString):
+    """MySQL ENUM type."""
+
+    def __init__(self, *enums, **kw):
+        """Construct an ENUM.
+
+        Example:
+
+          Column('myenum', MSEnum("foo", "bar", "baz"))
+
+        Arguments are:
+
+        :param enums: The range of valid values for this ENUM.  Values will be
+          quoted when generating the schema according to the quoting flag (see
+          below).
+
+        :param strict: Defaults to False: ensure that a given value is in this
+          ENUM's range of permissible values when inserting or updating rows.
+          Note that MySQL will not raise a fatal error if you attempt to store
+          an out of range value- an alternate value will be stored instead.
+          (See MySQL ENUM documentation.)
+
+        :param charset: Optional, a column-level character set for this string
+          value.  Takes precedence to 'ascii' or 'unicode' short-hand.
+
+        :param collation: Optional, a column-level collation for this string
+          value.  Takes precedence to 'binary' short-hand.
+
+        :param ascii: Defaults to False: short-hand for the ``latin1``
+          character set, generates ASCII in schema.
+
+        :param unicode: Defaults to False: short-hand for the ``ucs2``
+          character set, generates UNICODE in schema.
+
+        :param binary: Defaults to False: short-hand, pick the binary
+          collation type that matches the column's character set.  Generates
+          BINARY in schema.  This does not affect the type of data stored,
+          only the collation of character data.
+
+        :param quoting: Defaults to 'auto': automatically determine enum value
+          quoting.  If all enum values are surrounded by the same quoting
+          character, then use 'quoted' mode.  Otherwise, use 'unquoted' mode.
+
+          'quoted': values in enums are already quoted, they will be used
+          directly when generating the schema.
+
+          'unquoted': values in enums are not quoted, they will be escaped and
+          surrounded by single quotes when generating the schema.
+
+          Previous versions of this type always required manually quoted
+          values to be supplied; future versions will always quote the string
+          literals for you.  This is a transitional option.
+
+        """
+        self.quoting = kw.pop('quoting', 'auto')
+
+        if self.quoting == 'auto':
+            # What quoting character are we using?
+            q = None
+            for e in enums:
+                if len(e) == 0:
+                    self.quoting = 'unquoted'
+                    break
+                elif q is None:
+                    q = e[0]
+
+                if e[0] != q or e[-1] != q:
+                    self.quoting = 'unquoted'
+                    break
+            else:
+                self.quoting = 'quoted'
+
+        if self.quoting == 'quoted':
+            util.warn_pending_deprecation(
+                'Manually quoting ENUM value literals is deprecated.  Supply '
+                'unquoted values and use the quoting= option in cases of '
+                'ambiguity.')
+            strip_enums = []
+            for a in enums:
+                if a[0:1] == '"' or a[0:1] == "'":
+                    # strip enclosing quotes and unquote interior
+                    a = a[1:-1].replace(a[0] * 2, a[0])
+                strip_enums.append(a)
+            self.enums = strip_enums
+        else:
+            self.enums = list(enums)
+
+        self.strict = kw.pop('strict', False)
+        length = max([len(v) for v in self.enums] + [0])
+        super(MSEnum, self).__init__(length, **kw)
+
+    def bind_processor(self, dialect):
+        super_convert = super(MSEnum, self).bind_processor(dialect)
+        def process(value):
+            if self.strict and value is not None and value not in self.enums:
+                raise exc.InvalidRequestError('"%s" not a valid value for '
+                                                     'this enum' % value)
+            if super_convert:
+                return super_convert(value)
+            else:
+                return value
+        return process
+
+    def get_col_spec(self):
+        quoted_enums = []
+        for e in self.enums:
+            quoted_enums.append("'%s'" % e.replace("'", "''"))
+        return self._extend("ENUM(%s)" % ",".join(quoted_enums))
+
+class MSSet(MSString):
+    """MySQL SET type."""
+
+    def __init__(self, *values, **kw):
+        """Construct a SET.
+
+        Example::
+
+          Column('myset', MSSet("'foo'", "'bar'", "'baz'"))
+
+        Arguments are:
+
+        :param values: The range of valid values for this SET.  Values will be
+          used exactly as they appear when generating schemas.  Strings must
+          be quoted, as in the example above.  Single-quotes are suggested for
+          ANSI compatibility and are required for portability to servers with
+          ANSI_QUOTES enabled.
+
+        :param charset: Optional, a column-level character set for this string
+          value.  Takes precedence to 'ascii' or 'unicode' short-hand.
+
+        :param collation: Optional, a column-level collation for this string
+          value.  Takes precedence to 'binary' short-hand.
+
+        :param ascii: Defaults to False: short-hand for the ``latin1``
+          character set, generates ASCII in schema.
+
+        :param unicode: Defaults to False: short-hand for the ``ucs2``
+          character set, generates UNICODE in schema.
+
+        :param binary: Defaults to False: short-hand, pick the binary
+          collation type that matches the column's character set.  Generates
+          BINARY in schema.  This does not affect the type of data stored,
+          only the collation of character data.
+
+        """
+        self.__ddl_values = values
+
+        strip_values = []
+        for a in values:
+            if a[0:1] == '"' or a[0:1] == "'":
+                # strip enclosing quotes and unquote interior
+                a = a[1:-1].replace(a[0] * 2, a[0])
+            strip_values.append(a)
+
+        self.values = strip_values
+        length = max([len(v) for v in strip_values] + [0])
+        super(MSSet, self).__init__(length, **kw)
+
+    def result_processor(self, dialect):
+        def process(value):
+            # The good news:
+            #   No ',' quoting issues- commas aren't allowed in SET values
+            # The bad news:
+            #   Plenty of driver inconsistencies here.
+            if isinstance(value, util.set_types):
+                # ..some versions convert '' to an empty set
+                if not value:
+                    value.add('')
+                # ..some return sets.Set, even for pythons that have __builtin__.set
+                if not isinstance(value, set):
+                    value = set(value)
+                return value
+            # ...and some versions return strings
+            if value is not None:
+                return set(value.split(','))
+            else:
+                return value
+        return process
+
+    def bind_processor(self, dialect):
+        super_convert = super(MSSet, self).bind_processor(dialect)
+        def process(value):
+            if value is None or isinstance(value, (int, long, basestring)):
+                pass
+            else:
+                if None in value:
+                    value = set(value)
+                    value.remove(None)
+                    value.add('')
+                value = ','.join(value)
+            if super_convert:
+                return super_convert(value)
+            else:
+                return value
+        return process
+
+    def get_col_spec(self):
+        return self._extend("SET(%s)" % ",".join(self.__ddl_values))
+
+
+class MSBoolean(sqltypes.Boolean):
+    """MySQL BOOLEAN type."""
+
+    def get_col_spec(self):
+        return "BOOL"
+
+    def result_processor(self, dialect):
+        def process(value):
+            if value is None:
+                return None
+            return value and True or False
+        return process
+
+    def bind_processor(self, dialect):
+        def process(value):
+            if value is True:
+                return 1
+            elif value is False:
+                return 0
+            elif value is None:
+                return None
+            else:
+                return value and True or False
+        return process
+
+colspecs = {
+    sqltypes.Integer: MSInteger,
+    sqltypes.Smallinteger: MSSmallInteger,
+    sqltypes.Numeric: MSNumeric,
+    sqltypes.Float: MSFloat,
+    sqltypes.DateTime: MSDateTime,
+    sqltypes.Date: MSDate,
+    sqltypes.Time: MSTime,
+    sqltypes.String: MSString,
+    sqltypes.Binary: MSBlob,
+    sqltypes.Boolean: MSBoolean,
+    sqltypes.Text: MSText,
+    sqltypes.CHAR: MSChar,
+    sqltypes.NCHAR: MSNChar,
+    sqltypes.TIMESTAMP: MSTimeStamp,
+    sqltypes.BLOB: MSBlob,
+    MSDouble: MSDouble,
+    MSReal: MSReal,
+    _BinaryType: _BinaryType,
+}
+
+# Everything 3.23 through 5.1 excepting OpenGIS types.
+ischema_names = {
+    'bigint': MSBigInteger,
+    'binary': MSBinary,
+    'bit': MSBit,
+    'blob': MSBlob,
+    'boolean':MSBoolean,
+    'char': MSChar,
+    'date': MSDate,
+    'datetime': MSDateTime,
+    'decimal': MSDecimal,
+    'double': MSDouble,
+    'enum': MSEnum,
+    'fixed': MSDecimal,
+    'float': MSFloat,
+    'int': MSInteger,
+    'integer': MSInteger,
+    'longblob': MSLongBlob,
+    'longtext': MSLongText,
+    'mediumblob': MSMediumBlob,
+    'mediumint': MSMediumInteger,
+    'mediumtext': MSMediumText,
+    'nchar': MSNChar,
+    'nvarchar': MSNVarChar,
+    'numeric': MSNumeric,
+    'set': MSSet,
+    'smallint': MSSmallInteger,
+    'text': MSText,
+    'time': MSTime,
+    'timestamp': MSTimeStamp,
+    'tinyblob': MSTinyBlob,
+    'tinyint': MSTinyInteger,
+    'tinytext': MSTinyText,
+    'varbinary': MSVarBinary,
+    'varchar': MSString,
+    'year': MSYear,
+}
+
+
+class MySQLExecutionContext(default.DefaultExecutionContext):
+    def post_exec(self):
+        if self.compiled.isinsert and not self.executemany:
+            if (not len(self._last_inserted_ids) or
+                self._last_inserted_ids[0] is None):
+                self._last_inserted_ids = ([self.cursor.lastrowid] +
+                                           self._last_inserted_ids[1:])
+        elif (not self.isupdate and not self.should_autocommit and
+              self.statement and SET_RE.match(self.statement)):
+            # This misses if a user forces autocommit on text('SET NAMES'),
+            # which is probably a programming error anyhow.
+            self.connection.info.pop(('mysql', 'charset'), None)
+
+    def should_autocommit_text(self, statement):
+        return AUTOCOMMIT_RE.match(statement)
+
+
+class MySQLDialect(default.DefaultDialect):
+    """Details of the MySQL dialect.  Not used directly in application code."""
+    name = 'mysql'
+    supports_alter = True
+    supports_unicode_statements = False
+    # identifiers are 64, however aliases can be 255...
+    max_identifier_length = 255
+    supports_sane_rowcount = True
+    default_paramstyle = 'format'
+
+    def __init__(self, use_ansiquotes=None, **kwargs):
+        self.use_ansiquotes = use_ansiquotes
+        default.DefaultDialect.__init__(self, **kwargs)
+
+    def dbapi(cls):
+        import MySQLdb as mysql
+        return mysql
+    dbapi = classmethod(dbapi)
+
+    def create_connect_args(self, url):
+        opts = url.translate_connect_args(database='db', username='user',
+                                          password='passwd')
+        opts.update(url.query)
+
+        util.coerce_kw_type(opts, 'compress', bool)
+        util.coerce_kw_type(opts, 'connect_timeout', int)
+        util.coerce_kw_type(opts, 'client_flag', int)
+        util.coerce_kw_type(opts, 'local_infile', int)
+        # Note: using either of the below will cause all strings to be returned
+        # as Unicode, both in raw SQL operations and with column types like
+        # String and MSString.
+        util.coerce_kw_type(opts, 'use_unicode', bool)
+        util.coerce_kw_type(opts, 'charset', str)
+
+        # Rich values 'cursorclass' and 'conv' are not supported via
+        # query string.
+
+        ssl = {}
+        for key in ['ssl_ca', 'ssl_key', 'ssl_cert', 'ssl_capath', 'ssl_cipher']:
+            if key in opts:
+                ssl[key[4:]] = opts[key]
+                util.coerce_kw_type(ssl, key[4:], str)
+                del opts[key]
+        if ssl:
+            opts['ssl'] = ssl
+
+        # FOUND_ROWS must be set in CLIENT_FLAGS to enable
+        # supports_sane_rowcount.
+        client_flag = opts.get('client_flag', 0)
+        if self.dbapi is not None:
+            try:
+                import MySQLdb.constants.CLIENT as CLIENT_FLAGS
+                client_flag |= CLIENT_FLAGS.FOUND_ROWS
+            except:
+                pass
+            opts['client_flag'] = client_flag
+        return [[], opts]
+
+    def type_descriptor(self, typeobj):
+        return sqltypes.adapt_type(typeobj, colspecs)
+
+    def do_executemany(self, cursor, statement, parameters, context=None):
+        rowcount = cursor.executemany(statement, parameters)
+        if context is not None:
+            context._rowcount = rowcount
+
+    def supports_unicode_statements(self):
+        return True
+
+    def do_commit(self, connection):
+        """Execute a COMMIT."""
+
+        # COMMIT/ROLLBACK were introduced in 3.23.15.
+        # Yes, we have at least one user who has to talk to these old versions!
+        #
+        # Ignore commit/rollback if support isn't present, otherwise even basic
+        # operations via autocommit fail.
+        try:
+            connection.commit()
+        except:
+            if self._server_version_info(connection) < (3, 23, 15):
+                args = sys.exc_info()[1].args
+                if args and args[0] == 1064:
+                    return
+            raise
+
+    def do_rollback(self, connection):
+        """Execute a ROLLBACK."""
+
+        try:
+            connection.rollback()
+        except:
+            if self._server_version_info(connection) < (3, 23, 15):
+                args = sys.exc_info()[1].args
+                if args and args[0] == 1064:
+                    return
+            raise
+
+    def do_begin_twophase(self, connection, xid):
+        connection.execute("XA BEGIN %s", xid)
+
+    def do_prepare_twophase(self, connection, xid):
+        connection.execute("XA END %s", xid)
+        connection.execute("XA PREPARE %s", xid)
+
+    def do_rollback_twophase(self, connection, xid, is_prepared=True,
+                             recover=False):
+        if not is_prepared:
+            connection.execute("XA END %s", xid)
+        connection.execute("XA ROLLBACK %s", xid)
+
+    def do_commit_twophase(self, connection, xid, is_prepared=True,
+                           recover=False):
+        if not is_prepared:
+            self.do_prepare_twophase(connection, xid)
+        connection.execute("XA COMMIT %s", xid)
+
+    def do_recover_twophase(self, connection):
+        resultset = connection.execute("XA RECOVER")
+        return [row['data'][0:row['gtrid_length']] for row in resultset]
+
+    def do_ping(self, connection):
+        connection.ping()
+
+    def is_disconnect(self, e):
+        if isinstance(e, self.dbapi.OperationalError):
+            return e.args[0] in (2006, 2013, 2014, 2045, 2055)
+        elif isinstance(e, self.dbapi.InterfaceError):  # if underlying connection is closed, this is the error you get
+            return "(0, '')" in str(e)
+        else:
+            return False
+
+    def get_default_schema_name(self, connection):
+        return connection.execute('SELECT DATABASE()').scalar()
+    get_default_schema_name = engine_base.connection_memoize(
+        ('dialect', 'default_schema_name'))(get_default_schema_name)
+
+    def table_names(self, connection, schema):
+        """Return a Unicode SHOW TABLES from a given schema."""
+
+        charset = self._detect_charset(connection)
+        self._autoset_identifier_style(connection)
+        rp = connection.execute("SHOW TABLES FROM %s" %
+            self.identifier_preparer.quote_identifier(schema))
+        return [row[0] for row in _compat_fetchall(rp, charset=charset)]
+
+    def has_table(self, connection, table_name, schema=None):
+        # SHOW TABLE STATUS LIKE and SHOW TABLES LIKE do not function properly
+        # on macosx (and maybe win?) with multibyte table names.
+        #
+        # TODO: if this is not a problem on win, make the strategy swappable
+        # based on platform.  DESCRIBE is slower.
+
+        # [ticket:726]
+        # full_name = self.identifier_preparer.format_table(table,
+        #                                                   use_schema=True)
+
+        self._autoset_identifier_style(connection)
+
+        full_name = '.'.join(self.identifier_preparer._quote_free_identifiers(
+            schema, table_name))
+
+        st = "DESCRIBE %s" % full_name
+        rs = None
+        try:
+            try:
+                rs = connection.execute(st)
+                have = rs.rowcount > 0
+                rs.close()
+                return have
+            except exc.SQLError, e:
+                if e.orig.args[0] == 1146:
+                    return False
+                raise
+        finally:
+            if rs:
+                rs.close()
+
+    def server_version_info(self, connection):
+        """A tuple of the database server version.
+
+        Formats the remote server version as a tuple of version values,
+        e.g. ``(5, 0, 44)``.  If there are strings in the version number
+        they will be in the tuple too, so don't count on these all being
+        ``int`` values.
+
+        This is a fast check that does not require a round trip.  It is also
+        cached per-Connection.
+        """
+
+        return self._server_version_info(connection.connection.connection)
+    server_version_info = engine_base.connection_memoize(
+        ('mysql', 'server_version_info'))(server_version_info)
+
+    def _server_version_info(self, dbapi_con):
+        """Convert a MySQL-python server_info string into a tuple."""
+
+        version = []
+        r = re.compile('[.\-]')
+        for n in r.split(dbapi_con.get_server_info()):
+            try:
+                version.append(int(n))
+            except ValueError:
+                version.append(n)
+        return tuple(version)
+
+    def reflecttable(self, connection, table, include_columns):
+        """Load column definitions from the server."""
+
+        charset = self._detect_charset(connection)
+        self._autoset_identifier_style(connection)
+
+        try:
+            reflector = self.reflector
+        except AttributeError:
+            preparer = self.identifier_preparer
+            if (self.server_version_info(connection) < (4, 1) and
+                self.use_ansiquotes):
+                # ANSI_QUOTES doesn't affect SHOW CREATE TABLE on < 4.1
+                preparer = MySQLIdentifierPreparer(self)
+
+            self.reflector = reflector = MySQLSchemaReflector(preparer)
+
+        sql = self._show_create_table(connection, table, charset)
+        if sql.startswith('CREATE ALGORITHM'):
+            # Adapt views to something table-like.
+            columns = self._describe_table(connection, table, charset)
+            sql = reflector._describe_to_create(table, columns)
+
+        self._adjust_casing(connection, table)
+
+        return reflector.reflect(connection, table, sql, charset,
+                                 only=include_columns)
+
+    def _adjust_casing(self, connection, table, charset=None):
+        """Adjust Table name to the server case sensitivity, if needed."""
+
+        casing = self._detect_casing(connection)
+
+        # For winxx database hosts.  TODO: is this really needed?
+        if casing == 1 and table.name != table.name.lower():
+            table.name = table.name.lower()
+            lc_alias = schema._get_table_key(table.name, table.schema)
+            table.metadata.tables[lc_alias] = table
+
+
+    def _detect_charset(self, connection):
+        """Sniff out the character set in use for connection results."""
+
+        # Allow user override, won't sniff if force_charset is set.
+        if ('mysql', 'force_charset') in connection.info:
+            return connection.info[('mysql', 'force_charset')]
+
+        # Note: MySQL-python 1.2.1c7 seems to ignore changes made
+        # on a connection via set_character_set()
+        if self.server_version_info(connection) < (4, 1, 0):
+            try:
+                return connection.connection.character_set_name()
+            except AttributeError:
+                # < 1.2.1 final MySQL-python drivers have no charset support.
+                # a query is needed.
+                pass
+
+        # Prefer 'character_set_results' for the current connection over the
+        # value in the driver.  SET NAMES or individual variable SETs will
+        # change the charset without updating the driver's view of the world.
+        #
+        # If it's decided that issuing that sort of SQL leaves you SOL, then
+        # this can prefer the driver value.
+        rs = connection.execute("SHOW VARIABLES LIKE 'character_set%%'")
+        opts = dict([(row[0], row[1]) for row in _compat_fetchall(rs)])
+
+        if 'character_set_results' in opts:
+            return opts['character_set_results']
+        try:
+            return connection.connection.character_set_name()
+        except AttributeError:
+            # Still no charset on < 1.2.1 final...
+            if 'character_set' in opts:
+                return opts['character_set']
+            else:
+                util.warn(
+                    "Could not detect the connection character set with this "
+                    "combination of MySQL server and MySQL-python. "
+                    "MySQL-python >= 1.2.2 is recommended.  Assuming latin1.")
+                return 'latin1'
+    _detect_charset = engine_base.connection_memoize(
+        ('mysql', 'charset'))(_detect_charset)
+
+
+    def _detect_casing(self, connection):
+        """Sniff out identifier case sensitivity.
+
+        Cached per-connection. This value can not change without a server
+        restart.
+
+        """
+        # http://dev.mysql.com/doc/refman/5.0/en/name-case-sensitivity.html
+
+        charset = self._detect_charset(connection)
+        row = _compat_fetchone(connection.execute(
+            "SHOW VARIABLES LIKE 'lower_case_table_names'"),
+                               charset=charset)
+        if not row:
+            cs = 0
+        else:
+            # 4.0.15 returns OFF or ON according to [ticket:489]
+            # 3.23 doesn't, 4.0.27 doesn't..
+            if row[1] == 'OFF':
+                cs = 0
+            elif row[1] == 'ON':
+                cs = 1
+            else:
+                cs = int(row[1])
+            row.close()
+        return cs
+    _detect_casing = engine_base.connection_memoize(
+        ('mysql', 'lower_case_table_names'))(_detect_casing)
+
+    def _detect_collations(self, connection):
+        """Pull the active COLLATIONS list from the server.
+
+        Cached per-connection.
+        """
+
+        collations = {}
+        if self.server_version_info(connection) < (4, 1, 0):
+            pass
+        else:
+            charset = self._detect_charset(connection)
+            rs = connection.execute('SHOW COLLATION')
+            for row in _compat_fetchall(rs, charset):
+                collations[row[0]] = row[1]
+        return collations
+    _detect_collations = engine_base.connection_memoize(
+        ('mysql', 'collations'))(_detect_collations)
+
+    def use_ansiquotes(self, useansi):
+        self._use_ansiquotes = useansi
+        if useansi:
+            self.preparer = MySQLANSIIdentifierPreparer
+        else:
+            self.preparer = MySQLIdentifierPreparer
+        # icky
+        if hasattr(self, 'identifier_preparer'):
+            self.identifier_preparer = self.preparer(self)
+        if hasattr(self, 'reflector'):
+            del self.reflector
+
+    use_ansiquotes = property(lambda s: s._use_ansiquotes, use_ansiquotes,
+                              doc="True if ANSI_QUOTES is in effect.")
+
+    def _autoset_identifier_style(self, connection, charset=None):
+        """Detect and adjust for the ANSI_QUOTES sql mode.
+
+        If the dialect's use_ansiquotes is unset, query the server's sql mode
+        and reset the identifier style.
+
+        Note that this currently *only* runs during reflection.  Ideally this
+        would run the first time a connection pool connects to the database,
+        but the infrastructure for that is not yet in place.
+        """
+
+        if self.use_ansiquotes is not None:
+            return
+
+        row = _compat_fetchone(
+            connection.execute("SHOW VARIABLES LIKE 'sql_mode'"),
+                               charset=charset)
+        if not row:
+            mode = ''
+        else:
+            mode = row[1] or ''
+            # 4.0
+            if mode.isdigit():
+                mode_no = int(mode)
+                mode = (mode_no | 4 == mode_no) and 'ANSI_QUOTES' or ''
+
+        self.use_ansiquotes = 'ANSI_QUOTES' in mode
+
+    def _show_create_table(self, connection, table, charset=None,
+                           full_name=None):
+        """Run SHOW CREATE TABLE for a ``Table``."""
+
+        if full_name is None:
+            full_name = self.identifier_preparer.format_table(table)
+        st = "SHOW CREATE TABLE %s" % full_name
+
+        rp = None
+        try:
+            try:
+                rp = connection.execute(st)
+            except exc.SQLError, e:
+                if e.orig.args[0] == 1146:
+                    raise exc.NoSuchTableError(full_name)
+                else:
+                    raise
+            row = _compat_fetchone(rp, charset=charset)
+            if not row:
+                raise exc.NoSuchTableError(full_name)
+            return row[1].strip()
+        finally:
+            if rp:
+                rp.close()
+
+        return sql
+
+    def _describe_table(self, connection, table, charset=None,
+                             full_name=None):
+        """Run DESCRIBE for a ``Table`` and return processed rows."""
+
+        if full_name is None:
+            full_name = self.identifier_preparer.format_table(table)
+        st = "DESCRIBE %s" % full_name
+
+        rp, rows = None, None
+        try:
+            try:
+                rp = connection.execute(st)
+            except exc.SQLError, e:
+                if e.orig.args[0] == 1146:
+                    raise exc.NoSuchTableError(full_name)
+                else:
+                    raise
+            rows = _compat_fetchall(rp, charset=charset)
+        finally:
+            if rp:
+                rp.close()
+        return rows
+
+class _MySQLPythonRowProxy(object):
+    """Return consistent column values for all versions of MySQL-python.
+
+    Smooth over data type issues (esp. with alpha driver versions) and
+    normalize strings as Unicode regardless of user-configured driver
+    encoding settings.
+    """
+
+    # Some MySQL-python versions can return some columns as
+    # sets.Set(['value']) (seriously) but thankfully that doesn't
+    # seem to come up in DDL queries.
+
+    def __init__(self, rowproxy, charset):
+        self.rowproxy = rowproxy
+        self.charset = charset
+    def __getitem__(self, index):
+        item = self.rowproxy[index]
+        if isinstance(item, _array):
+            item = item.tostring()
+        if self.charset and isinstance(item, str):
+            return item.decode(self.charset)
+        else:
+            return item
+    def __getattr__(self, attr):
+        item = getattr(self.rowproxy, attr)
+        if isinstance(item, _array):
+            item = item.tostring()
+        if self.charset and isinstance(item, str):
+            return item.decode(self.charset)
+        else:
+            return item
+
+
+class MySQLCompiler(compiler.DefaultCompiler):
+    operators = compiler.DefaultCompiler.operators.copy()
+    operators.update({
+        sql_operators.concat_op: lambda x, y: "concat(%s, %s)" % (x, y),
+        sql_operators.mod: '%%',
+        sql_operators.match_op: lambda x, y: "MATCH (%s) AGAINST (%s IN BOOLEAN MODE)" % (x, y)
+    })
+    functions = compiler.DefaultCompiler.functions.copy()
+    functions.update ({
+        sql_functions.random: 'rand%(expr)s',
+        "utc_timestamp":"UTC_TIMESTAMP"
+        })
+
+    extract_map = compiler.DefaultCompiler.extract_map.copy()
+    extract_map.update ({
+        'milliseconds': 'millisecond',
+    })
+
+    def visit_typeclause(self, typeclause):
+        type_ = typeclause.type.dialect_impl(self.dialect)
+        if isinstance(type_, MSInteger):
+            if getattr(type_, 'unsigned', False):
+                return 'UNSIGNED INTEGER'
+            else:
+                return 'SIGNED INTEGER'
+        elif isinstance(type_, (MSDecimal, MSDateTime, MSDate, MSTime)):
+            return type_.get_col_spec()
+        elif isinstance(type_, MSText):
+            return 'CHAR'
+        elif (isinstance(type_, _StringType) and not
+              isinstance(type_, (MSEnum, MSSet))):
+            if getattr(type_, 'length'):
+                return 'CHAR(%s)' % type_.length
+            else:
+                return 'CHAR'
+        elif isinstance(type_, _BinaryType):
+            return 'BINARY'
+        elif isinstance(type_, MSNumeric):
+            return type_.get_col_spec().replace('NUMERIC', 'DECIMAL')
+        elif isinstance(type_, MSTimeStamp):
+            return 'DATETIME'
+        elif isinstance(type_, (MSDateTime, MSDate, MSTime)):
+            return type_.get_col_spec()
+        else:
+            return None
+
+    def visit_cast(self, cast, **kwargs):
+        # No cast until 4, no decimals until 5.
+        type_ = self.process(cast.typeclause)
+        if type_ is None:
+            return self.process(cast.clause)
+
+        return 'CAST(%s AS %s)' % (self.process(cast.clause), type_)
+
+
+    def post_process_text(self, text):
+        if '%%' in text:
+            util.warn("The SQLAlchemy MySQLDB dialect now automatically escapes '%' in text() expressions to '%%'.")
+        return text.replace('%', '%%')
+
+    def get_select_precolumns(self, select):
+        if isinstance(select._distinct, basestring):
+            return select._distinct.upper() + " "
+        elif select._distinct:
+            return "DISTINCT "
+        else:
+            return ""
+
+    def visit_join(self, join, asfrom=False, **kwargs):
+        # 'JOIN ... ON ...' for inner joins isn't available until 4.0.
+        # Apparently < 3.23.17 requires theta joins for inner joins
+        # (but not outer).  Not generating these currently, but
+        # support can be added, preferably after dialects are
+        # refactored to be version-sensitive.
+        return ''.join(
+            (self.process(join.left, asfrom=True),
+             (join.isouter and " LEFT OUTER JOIN " or " INNER JOIN "),
+             self.process(join.right, asfrom=True),
+             " ON ",
+             self.process(join.onclause)))
+
+    def for_update_clause(self, select):
+        if select.for_update == 'read':
+            return ' LOCK IN SHARE MODE'
+        else:
+            return super(MySQLCompiler, self).for_update_clause(select)
+
+    def limit_clause(self, select):
+        # MySQL supports:
+        #   LIMIT <limit>
+        #   LIMIT <offset>, <limit>
+        # and in server versions > 3.3:
+        #   LIMIT <limit> OFFSET <offset>
+        # The latter is more readable for offsets but we're stuck with the
+        # former until we can refine dialects by server revision.
+
+        limit, offset = select._limit, select._offset
+
+        if (limit, offset) == (None, None):
+            return ''
+        elif offset is not None:
+            # As suggested by the MySQL docs, need to apply an
+            # artificial limit if one wasn't provided
+            if limit is None:
+                limit = 18446744073709551615
+            return ' \n LIMIT %s, %s' % (offset, limit)
+        else:
+            # No offset provided, so just use the limit
+            return ' \n LIMIT %s' % (limit,)
+
+    def visit_update(self, update_stmt):
+        self.stack.append({'from': set([update_stmt.table])})
+
+        self.isupdate = True
+        colparams = self._get_colparams(update_stmt)
+
+        text = "UPDATE " + self.preparer.format_table(update_stmt.table) + " SET " + ', '.join(["%s=%s" % (self.preparer.format_column(c[0]), c[1]) for c in colparams])
+
+        if update_stmt._whereclause:
+            text += " WHERE " + self.process(update_stmt._whereclause)
+
+        limit = update_stmt.kwargs.get('mysql_limit', None)
+        if limit:
+            text += " LIMIT %s" % limit
+
+        self.stack.pop(-1)
+
+        return text
+
+# ug.  "InnoDB needs indexes on foreign keys and referenced keys [...].
+#       Starting with MySQL 4.1.2, these indexes are created automatically.
+#       In older versions, the indexes must be created explicitly or the
+#       creation of foreign key constraints fails."
+
+class MySQLSchemaGenerator(compiler.SchemaGenerator):
+    def get_column_specification(self, column, first_pk=False):
+        """Builds column DDL."""
+
+        colspec = [self.preparer.format_column(column),
+                   column.type.dialect_impl(self.dialect).get_col_spec()]
+
+        default = self.get_column_default_string(column)
+        if default is not None:
+            colspec.append('DEFAULT ' + default)
+
+        if not column.nullable:
+            colspec.append('NOT NULL')
+
+        if column.primary_key and column.autoincrement:
+            try:
+                first = [c for c in column.table.primary_key.columns
+                         if (c.autoincrement and
+                             isinstance(c.type, sqltypes.Integer) and
+                             not c.foreign_keys)].pop(0)
+                if column is first:
+                    colspec.append('AUTO_INCREMENT')
+            except IndexError:
+                pass
+
+        return ' '.join(colspec)
+
+    def post_create_table(self, table):
+        """Build table-level CREATE options like ENGINE and COLLATE."""
+
+        table_opts = []
+        for k in table.kwargs:
+            if k.startswith('mysql_'):
+                opt = k[6:].upper()
+                joiner = '='
+                if opt in ('TABLESPACE', 'DEFAULT CHARACTER SET',
+                           'CHARACTER SET', 'COLLATE'):
+                    joiner = ' '
+
+                table_opts.append(joiner.join((opt, table.kwargs[k])))
+        return ' '.join(table_opts)
+
+
+class MySQLSchemaDropper(compiler.SchemaDropper):
+    def visit_index(self, index):
+        self.append("\nDROP INDEX %s ON %s" %
+                    (self.preparer.quote(self._validate_identifier(index.name, False), index.quote),
+                     self.preparer.format_table(index.table)))
+        self.execute()
+
+    def drop_foreignkey(self, constraint):
+        self.append("ALTER TABLE %s DROP FOREIGN KEY %s" %
+                    (self.preparer.format_table(constraint.table),
+                     self.preparer.format_constraint(constraint)))
+        self.execute()
+
+
+class MySQLSchemaReflector(object):
+    """Parses SHOW CREATE TABLE output."""
+
+    def __init__(self, identifier_preparer):
+        """Construct a MySQLSchemaReflector.
+
+        identifier_preparer
+          An ANSIIdentifierPreparer type, used to determine the identifier
+          quoting style in effect.
+        """
+
+        self.preparer = identifier_preparer
+        self._prep_regexes()
+
+    def reflect(self, connection, table, show_create, charset, only=None):
+        """Parse MySQL SHOW CREATE TABLE and fill in a ''Table''.
+
+        show_create
+          Unicode output of SHOW CREATE TABLE
+
+        table
+          A ''Table'', to be loaded with Columns, Indexes, etc.
+          table.name will be set if not already
+
+        charset
+          FIXME, some constructed values (like column defaults)
+          currently can't be Unicode.  ''charset'' will convert them
+          into the connection character set.
+
+        only
+           An optional sequence of column names.  If provided, only
+           these columns will be reflected, and any keys or constraints
+           that include columns outside this set will also be omitted.
+           That means that if ``only`` includes only one column in a
+           2 part primary key, the entire primary key will be omitted.
+        """
+
+        keys, constraints = [], []
+
+        if only:
+            only = set(only)
+
+        for line in re.split(r'\r?\n', show_create):
+            if line.startswith('  ' + self.preparer.initial_quote):
+                self._add_column(table, line, charset, only)
+            # a regular table options line
+            elif line.startswith(') '):
+                self._set_options(table, line)
+            # an ANSI-mode table options line
+            elif line == ')':
+                pass
+            elif line.startswith('CREATE '):
+                self._set_name(table, line)
+            # Not present in real reflection, but may be if loading from a file.
+            elif not line:
+                pass
+            else:
+                type_, spec = self.parse_constraints(line)
+                if type_ is None:
+                    util.warn("Unknown schema content: %r" % line)
+                elif type_ == 'key':
+                    keys.append(spec)
+                elif type_ == 'constraint':
+                    constraints.append(spec)
+                else:
+                    pass
+
+        self._set_keys(table, keys, only)
+        self._set_constraints(table, constraints, connection, only)
+
+    def _set_name(self, table, line):
+        """Override a Table name with the reflected name.
+
+        table
+          A ``Table``
+
+        line
+          The first line of SHOW CREATE TABLE output.
+        """
+
+        # Don't override by default.
+        if table.name is None:
+            table.name = self.parse_name(line)
+
+    def _add_column(self, table, line, charset, only=None):
+        spec = self.parse_column(line)
+        if not spec:
+            util.warn("Unknown column definition %r" % line)
+            return
+        if not spec['full']:
+            util.warn("Incomplete reflection of column definition %r" % line)
+
+        name, type_, args, notnull = \
+              spec['name'], spec['coltype'], spec['arg'], spec['notnull']
+
+        if only and name not in only:
+            self.logger.info("Omitting reflected column %s.%s" %
+                             (table.name, name))
+            return
+
+        # Convention says that TINYINT(1) columns == BOOLEAN
+        if type_ == 'tinyint' and args == '1':
+            type_ = 'boolean'
+            args = None
+
+        try:
+            col_type = ischema_names[type_]
+        except KeyError:
+            util.warn("Did not recognize type '%s' of column '%s'" %
+                      (type_, name))
+            col_type = sqltypes.NullType
+
+        # Column type positional arguments eg. varchar(32)
+        if args is None or args == '':
+            type_args = []
+        elif args[0] == "'" and args[-1] == "'":
+            type_args = self._re_csv_str.findall(args)
+        else:
+            type_args = [int(v) for v in self._re_csv_int.findall(args)]
+
+        # Column type keyword options
+        type_kw = {}
+        for kw in ('unsigned', 'zerofill'):
+            if spec.get(kw, False):
+                type_kw[kw] = True
+        for kw in ('charset', 'collate'):
+            if spec.get(kw, False):
+                type_kw[kw] = spec[kw]
+
+        if type_ == 'enum':
+            type_kw['quoting'] = 'quoted'
+
+        type_instance = col_type(*type_args, **type_kw)
+
+        col_args, col_kw = [], {}
+
+        # NOT NULL
+        if spec.get('notnull', False):
+            col_kw['nullable'] = False
+
+        # AUTO_INCREMENT
+        if spec.get('autoincr', False):
+            col_kw['autoincrement'] = True
+        elif issubclass(col_type, sqltypes.Integer):
+            col_kw['autoincrement'] = False
+
+        # DEFAULT
+        default = spec.get('default', None)
+        if default is not None and default != 'NULL':
+            # Defaults should be in the native charset for the moment
+            default = default.encode(charset)
+            if type_ == 'timestamp':
+                # can't be NULL for TIMESTAMPs
+                if (default[0], default[-1]) != ("'", "'"):
+                    default = sql.text(default)
+            else:
+                default = default[1:-1]
+            col_args.append(schema.DefaultClause(default))
+
+        table.append_column(schema.Column(name, type_instance,
+                                          *col_args, **col_kw))
+
+    def _set_keys(self, table, keys, only):
+        """Add ``Index`` and ``PrimaryKeyConstraint`` items to a ``Table``.
+
+        Most of the information gets dropped here- more is reflected than
+        the schema objects can currently represent.
+
+        table
+          A ``Table``
+
+        keys
+          A sequence of key specifications produced by `constraints`
+
+        only
+          Optional `set` of column names.  If provided, keys covering
+          columns not in this set will be omitted.
+        """
+
+        for spec in keys:
+            flavor = spec['type']
+            col_names = [s[0] for s in spec['columns']]
+
+            if only and not set(col_names).issubset(only):
+                if flavor is None:
+                    flavor = 'index'
+                self.logger.info(
+                    "Omitting %s KEY for (%s), key covers ommitted columns." %
+                    (flavor, ', '.join(col_names)))
+                continue
+
+            constraint = False
+            if flavor == 'PRIMARY':
+                key = schema.PrimaryKeyConstraint()
+                constraint = True
+            elif flavor == 'UNIQUE':
+                key = schema.Index(spec['name'], unique=True)
+            elif flavor in (None, 'FULLTEXT', 'SPATIAL'):
+                key = schema.Index(spec['name'])
+            else:
+                self.logger.info(
+                    "Converting unknown KEY type %s to a plain KEY" % flavor)
+                key = schema.Index(spec['name'])
+
+            for col in [table.c[name] for name in col_names]:
+                key.append_column(col)
+
+            if constraint:
+                table.append_constraint(key)
+
+    def _set_constraints(self, table, constraints, connection, only):
+        """Apply constraints to a ``Table``."""
+
+        default_schema = None
+
+        for spec in constraints:
+            # only FOREIGN KEYs
+            ref_name = spec['table'][-1]
+            ref_schema = len(spec['table']) > 1 and spec['table'][-2] or table.schema
+
+            if not ref_schema:
+                if default_schema is None:
+                    default_schema = connection.dialect.get_default_schema_name(
+                        connection)
+                if table.schema == default_schema:
+                    ref_schema = table.schema
+
+            loc_names = spec['local']
+            if only and not set(loc_names).issubset(only):
+                self.logger.info(
+                    "Omitting FOREIGN KEY for (%s), key covers ommitted "
+                    "columns." % (', '.join(loc_names)))
+                continue
+
+            ref_key = schema._get_table_key(ref_name, ref_schema)
+            if ref_key in table.metadata.tables:
+                ref_table = table.metadata.tables[ref_key]
+            else:
+                ref_table = schema.Table(
+                    ref_name, table.metadata, schema=ref_schema,
+                    autoload=True, autoload_with=connection)
+
+            ref_names = spec['foreign']
+
+            if ref_schema:
+                refspec = [".".join([ref_schema, ref_name, column]) for column in ref_names]
+            else:
+                refspec = [".".join([ref_name, column]) for column in ref_names]
+
+            con_kw = {}
+            for opt in ('name', 'onupdate', 'ondelete'):
+                if spec.get(opt, False):
+                    con_kw[opt] = spec[opt]
+
+            key = schema.ForeignKeyConstraint(loc_names, refspec, link_to_name=True, **con_kw)
+            table.append_constraint(key)
+
+    def _set_options(self, table, line):
+        """Apply safe reflected table options to a ``Table``.
+
+        table
+          A ``Table``
+
+        line
+          The final line of SHOW CREATE TABLE output.
+        """
+
+        options = self.parse_table_options(line)
+        for nope in ('auto_increment', 'data_directory', 'index_directory'):
+            options.pop(nope, None)
+
+        for opt, val in options.items():
+            table.kwargs['mysql_%s' % opt] = val
+
+    def _prep_regexes(self):
+        """Pre-compile regular expressions."""
+
+        self._re_columns = []
+        self._pr_options = []
+        self._re_options_util = {}
+
+        _final = self.preparer.final_quote
+
+        quotes = dict(zip(('iq', 'fq', 'esc_fq'),
+                          [re.escape(s) for s in
+                           (self.preparer.initial_quote,
+                            _final,
+                            self.preparer._escape_identifier(_final))]))
+
+        self._pr_name = _pr_compile(
+            r'^CREATE (?:\w+ +)?TABLE +'
+            r'%(iq)s(?P<name>(?:%(esc_fq)s|[^%(fq)s])+)%(fq)s +\($' % quotes,
+            self.preparer._unescape_identifier)
+
+        # `col`,`col2`(32),`col3`(15) DESC
+        #
+        # Note: ASC and DESC aren't reflected, so we'll punt...
+        self._re_keyexprs = _re_compile(
+            r'(?:'
+            r'(?:%(iq)s((?:%(esc_fq)s|[^%(fq)s])+)%(fq)s)'
+            r'(?:\((\d+)\))?(?=\,|$))+' % quotes)
+
+        # 'foo' or 'foo','bar' or 'fo,o','ba''a''r'
+        self._re_csv_str = _re_compile(r'\x27(?:\x27\x27|[^\x27])*\x27')
+
+        # 123 or 123,456
+        self._re_csv_int = _re_compile(r'\d+')
+
+
+        # `colname` <type> [type opts]
+        #  (NOT NULL | NULL)
+        #   DEFAULT ('value' | CURRENT_TIMESTAMP...)
+        #   COMMENT 'comment'
+        #  COLUMN_FORMAT (FIXED|DYNAMIC|DEFAULT)
+        #  STORAGE (DISK|MEMORY)
+        self._re_column = _re_compile(
+            r'  '
+            r'%(iq)s(?P<name>(?:%(esc_fq)s|[^%(fq)s])+)%(fq)s +'
+            r'(?P<coltype>\w+)'
+            r'(?:\((?P<arg>(?:\d+|\d+,\d+|'
+              r'(?:\x27(?:\x27\x27|[^\x27])*\x27,?)+))\))?'
+            r'(?: +(?P<unsigned>UNSIGNED))?'
+            r'(?: +(?P<zerofill>ZEROFILL))?'
+            r'(?: +CHARACTER SET +(?P<charset>\w+))?'
+            r'(?: +COLLATE +(P<collate>\w+))?'
+            r'(?: +(?P<notnull>NOT NULL))?'
+            r'(?: +DEFAULT +(?P<default>'
+              r'(?:NULL|\x27(?:\x27\x27|[^\x27])*\x27|\w+)'
+              r'(?:ON UPDATE \w+)?'
+            r'))?'
+            r'(?: +(?P<autoincr>AUTO_INCREMENT))?'
+            r'(?: +COMMENT +(P<comment>(?:\x27\x27|[^\x27])+))?'
+            r'(?: +COLUMN_FORMAT +(?P<colfmt>\w+))?'
+            r'(?: +STORAGE +(?P<storage>\w+))?'
+            r'(?: +(?P<extra>.*))?'
+            r',?$'
+            % quotes
+            )
+
+        # Fallback, try to parse as little as possible
+        self._re_column_loose = _re_compile(
+            r'  '
+            r'%(iq)s(?P<name>(?:%(esc_fq)s|[^%(fq)s])+)%(fq)s +'
+            r'(?P<coltype>\w+)'
+            r'(?:\((?P<arg>(?:\d+|\d+,\d+|\x27(?:\x27\x27|[^\x27])+\x27))\))?'
+            r'.*?(?P<notnull>NOT NULL)?'
+            % quotes
+            )
+
+        # (PRIMARY|UNIQUE|FULLTEXT|SPATIAL) INDEX `name` (USING (BTREE|HASH))?
+        # (`col` (ASC|DESC)?, `col` (ASC|DESC)?)
+        # KEY_BLOCK_SIZE size | WITH PARSER name
+        self._re_key = _re_compile(
+            r'  '
+            r'(?:(?P<type>\S+) )?KEY'
+            r'(?: +%(iq)s(?P<name>(?:%(esc_fq)s|[^%(fq)s])+)%(fq)s)?'
+            r'(?: +USING +(?P<using_pre>\S+))?'
+            r' +\((?P<columns>.+?)\)'
+            r'(?: +USING +(?P<using_post>\S+))?'
+            r'(?: +KEY_BLOCK_SIZE +(?P<keyblock>\S+))?'
+            r'(?: +WITH PARSER +(?P<parser>\S+))?'
+            r',?$'
+            % quotes
+            )
+
+        # CONSTRAINT `name` FOREIGN KEY (`local_col`)
+        # REFERENCES `remote` (`remote_col`)
+        # MATCH FULL | MATCH PARTIAL | MATCH SIMPLE
+        # ON DELETE CASCADE ON UPDATE RESTRICT
+        #
+        # unique constraints come back as KEYs
+        kw = quotes.copy()
+        kw['on'] = 'RESTRICT|CASCASDE|SET NULL|NOACTION'
+        self._re_constraint = _re_compile(
+            r'  '
+            r'CONSTRAINT +'
+            r'%(iq)s(?P<name>(?:%(esc_fq)s|[^%(fq)s])+)%(fq)s +'
+            r'FOREIGN KEY +'
+            r'\((?P<local>[^\)]+?)\) REFERENCES +'
+            r'(?P<table>%(iq)s[^%(fq)s]+%(fq)s(?:\.%(iq)s[^%(fq)s]+%(fq)s)?) +'
+            r'\((?P<foreign>[^\)]+?)\)'
+            r'(?: +(?P<match>MATCH \w+))?'
+            r'(?: +ON DELETE (?P<ondelete>%(on)s))?'
+            r'(?: +ON UPDATE (?P<onupdate>%(on)s))?'
+            % kw
+            )
+
+        # PARTITION
+        #
+        # punt!
+        self._re_partition = _re_compile(
+            r'  '
+            r'(?:SUB)?PARTITION')
+
+        # Table-level options (COLLATE, ENGINE, etc.)
+        for option in ('ENGINE', 'TYPE', 'AUTO_INCREMENT',
+                       'AVG_ROW_LENGTH', 'CHARACTER SET',
+                       'DEFAULT CHARSET', 'CHECKSUM',
+                       'COLLATE', 'DELAY_KEY_WRITE', 'INSERT_METHOD',
+                       'MAX_ROWS', 'MIN_ROWS', 'PACK_KEYS', 'ROW_FORMAT',
+                       'KEY_BLOCK_SIZE'):
+            self._add_option_word(option)
+
+        for option in (('COMMENT', 'DATA_DIRECTORY', 'INDEX_DIRECTORY',
+                        'PASSWORD', 'CONNECTION')):
+            self._add_option_string(option)
+
+        self._add_option_regex('UNION', r'\([^\)]+\)')
+        self._add_option_regex('TABLESPACE', r'.*? STORAGE DISK')
+        self._add_option_regex('RAID_TYPE',
+          r'\w+\s+RAID_CHUNKS\s*\=\s*\w+RAID_CHUNKSIZE\s*=\s*\w+')
+        self._re_options_util['='] = _re_compile(r'\s*=\s*$')
+
+    def _add_option_string(self, directive):
+        regex = (r'(?P<directive>%s\s*(?:=\s*)?)'
+                 r'(?:\x27.(?P<val>.*?)\x27(?!\x27)\x27)' %
+                 re.escape(directive))
+        self._pr_options.append(
+            _pr_compile(regex, lambda v: v.replace("''", "'")))
+
+    def _add_option_word(self, directive):
+        regex = (r'(?P<directive>%s\s*(?:=\s*)?)'
+                 r'(?P<val>\w+)' % re.escape(directive))
+        self._pr_options.append(_pr_compile(regex))
+
+    def _add_option_regex(self, directive, regex):
+        regex = (r'(?P<directive>%s\s*(?:=\s*)?)'
+                 r'(?P<val>%s)' % (re.escape(directive), regex))
+        self._pr_options.append(_pr_compile(regex))
+
+
+    def parse_name(self, line):
+        """Extract the table name.
+
+        line
+          The first line of SHOW CREATE TABLE
+        """
+
+        regex, cleanup = self._pr_name
+        m = regex.match(line)
+        if not m:
+            return None
+        return cleanup(m.group('name'))
+
+    def parse_column(self, line):
+        """Extract column details.
+
+        Falls back to a 'minimal support' variant if full parse fails.
+
+        line
+          Any column-bearing line from SHOW CREATE TABLE
+        """
+
+        m = self._re_column.match(line)
+        if m:
+            spec = m.groupdict()
+            spec['full'] = True
+            return spec
+        m = self._re_column_loose.match(line)
+        if m:
+            spec = m.groupdict()
+            spec['full'] = False
+            return spec
+        return None
+
+    def parse_constraints(self, line):
+        """Parse a KEY or CONSTRAINT line.
+
+        line
+          A line of SHOW CREATE TABLE output
+        """
+
+        # KEY
+        m = self._re_key.match(line)
+        if m:
+            spec = m.groupdict()
+            # convert columns into name, length pairs
+            spec['columns'] = self._parse_keyexprs(spec['columns'])
+            return 'key', spec
+
+        # CONSTRAINT
+        m = self._re_constraint.match(line)
+        if m:
+            spec = m.groupdict()
+            spec['table'] = \
+              self.preparer.unformat_identifiers(spec['table'])
+            spec['local'] = [c[0]
+                             for c in self._parse_keyexprs(spec['local'])]
+            spec['foreign'] = [c[0]
+                               for c in self._parse_keyexprs(spec['foreign'])]
+            return 'constraint', spec
+
+        # PARTITION and SUBPARTITION
+        m = self._re_partition.match(line)
+        if m:
+            # Punt!
+            return 'partition', line
+
+        # No match.
+        return (None, line)
+
+    def parse_table_options(self, line):
+        """Build a dictionary of all reflected table-level options.
+
+        line
+          The final line of SHOW CREATE TABLE output.
+        """
+
+        options = {}
+
+        if not line or line == ')':
+            return options
+
+        r_eq_trim = self._re_options_util['=']
+
+        for regex, cleanup in self._pr_options:
+            m = regex.search(line)
+            if not m:
+                continue
+            directive, value = m.group('directive'), m.group('val')
+            directive = r_eq_trim.sub('', directive).lower()
+            if cleanup:
+                value = cleanup(value)
+            options[directive] = value
+
+        return options
+
+    def _describe_to_create(self, table, columns):
+        """Re-format DESCRIBE output as a SHOW CREATE TABLE string.
+
+        DESCRIBE is a much simpler reflection and is sufficient for
+        reflecting views for runtime use.  This method formats DDL
+        for columns only- keys are omitted.
+
+        `columns` is a sequence of DESCRIBE or SHOW COLUMNS 6-tuples.
+        SHOW FULL COLUMNS FROM rows must be rearranged for use with
+        this function.
+        """
+
+        buffer = []
+        for row in columns:
+            (name, col_type, nullable, default, extra) = \
+                   [row[i] for i in (0, 1, 2, 4, 5)]
+
+            line = [' ']
+            line.append(self.preparer.quote_identifier(name))
+            line.append(col_type)
+            if not nullable:
+                line.append('NOT NULL')
+            if default:
+                if 'auto_increment' in default:
+                    pass
+                elif (col_type.startswith('timestamp') and
+                      default.startswith('C')):
+                    line.append('DEFAULT')
+                    line.append(default)
+                elif default == 'NULL':
+                    line.append('DEFAULT')
+                    line.append(default)
+                else:
+                    line.append('DEFAULT')
+                    line.append("'%s'" % default.replace("'", "''"))
+            if extra:
+                line.append(extra)
+
+            buffer.append(' '.join(line))
+
+        return ''.join([('CREATE TABLE %s (\n' %
+                         self.preparer.quote_identifier(table.name)),
+                        ',\n'.join(buffer),
+                        '\n) '])
+
+    def _parse_keyexprs(self, identifiers):
+        """Unpack '"col"(2),"col" ASC'-ish strings into components."""
+
+        return self._re_keyexprs.findall(identifiers)
+
+log.class_logger(MySQLSchemaReflector)
+
+
+class _MySQLIdentifierPreparer(compiler.IdentifierPreparer):
+    """MySQL-specific schema identifier configuration."""
+
+    reserved_words = RESERVED_WORDS
+
+    def __init__(self, dialect, **kw):
+        super(_MySQLIdentifierPreparer, self).__init__(dialect, **kw)
+
+    def _quote_free_identifiers(self, *ids):
+        """Unilaterally identifier-quote any number of strings."""
+
+        return tuple([self.quote_identifier(i) for i in ids if i is not None])
+
+
+class MySQLIdentifierPreparer(_MySQLIdentifierPreparer):
+    """Traditional MySQL-specific schema identifier configuration."""
+
+    def __init__(self, dialect):
+        super(MySQLIdentifierPreparer, self).__init__(dialect, initial_quote="`")
+
+    def _escape_identifier(self, value):
+        return value.replace('`', '``')
+
+    def _unescape_identifier(self, value):
+        return value.replace('``', '`')
+
+
+class MySQLANSIIdentifierPreparer(_MySQLIdentifierPreparer):
+    """ANSI_QUOTES MySQL schema identifier configuration."""
+
+    pass
+
+
+def _compat_fetchall(rp, charset=None):
+    """Proxy result rows to smooth over MySQL-Python driver inconsistencies."""
+
+    return [_MySQLPythonRowProxy(row, charset) for row in rp.fetchall()]
+
+def _compat_fetchone(rp, charset=None):
+    """Proxy a result row to smooth over MySQL-Python driver inconsistencies."""
+
+    return _MySQLPythonRowProxy(rp.fetchone(), charset)
+
+def _pr_compile(regex, cleanup=None):
+    """Prepare a 2-tuple of compiled regex and callable."""
+
+    return (_re_compile(regex), cleanup)
+
+def _re_compile(regex):
+    """Compile a string to regex, I and UNICODE."""
+
+    return re.compile(regex, re.I | re.UNICODE)
+
+dialect = MySQLDialect
+dialect.statement_compiler = MySQLCompiler
+dialect.schemagenerator = MySQLSchemaGenerator
+dialect.schemadropper = MySQLSchemaDropper
+dialect.execution_ctx_cls = MySQLExecutionContext
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/databases/oracle.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/databases/oracle.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/databases/oracle.py (revision 3)
@@ -0,0 +1,904 @@
+# oracle.py
+# Copyright (C) 2005, 2006, 2007, 2008, 2009 Michael Bayer mike_mp@zzzcomputing.com
+#
+# This module is part of SQLAlchemy and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+"""Support for the Oracle database.
+
+Oracle version 8 through current (11g at the time of this writing) are supported.
+
+Driver
+------
+
+The Oracle dialect uses the cx_oracle driver, available at 
+http://cx-oracle.sourceforge.net/ .   The dialect has several behaviors 
+which are specifically tailored towards compatibility with this module.
+
+Connecting
+----------
+
+Connecting with create_engine() uses the standard URL approach of 
+``oracle://user:pass@host:port/dbname[?key=value&key=value...]``.  If dbname is present, the 
+host, port, and dbname tokens are converted to a TNS name using the cx_oracle 
+:func:`makedsn()` function.  Otherwise, the host token is taken directly as a TNS name.
+
+Additional arguments which may be specified either as query string arguments on the
+URL, or as keyword arguments to :func:`~sqlalchemy.create_engine()` are:
+
+* *allow_twophase* - enable two-phase transactions.  Defaults to ``True``.
+
+* *auto_convert_lobs* - defaults to True, see the section on LOB objects.
+
+* *auto_setinputsizes* - the cx_oracle.setinputsizes() call is issued for all bind parameters.
+  This is required for LOB datatypes but can be disabled to reduce overhead.  Defaults
+  to ``True``.
+
+* *mode* - This is given the string value of SYSDBA or SYSOPER, or alternatively an
+  integer value.  This value is only available as a URL query string argument.
+
+* *threaded* - enable multithreaded access to cx_oracle connections.  Defaults
+  to ``True``.  Note that this is the opposite default of cx_oracle itself.
+
+* *use_ansi* - Use ANSI JOIN constructs (see the section on Oracle 8).  Defaults
+  to ``True``.  If ``False``, Oracle-8 compatible constructs are used for joins.
+
+* *optimize_limits* - defaults to ``False``. see the section on LIMIT/OFFSET.
+
+Auto Increment Behavior
+-----------------------
+
+SQLAlchemy Table objects which include integer primary keys are usually assumed to have
+"autoincrementing" behavior, meaning they can generate their own primary key values upon
+INSERT.  Since Oracle has no "autoincrement" feature, SQLAlchemy relies upon sequences 
+to produce these values.   With the Oracle dialect, *a sequence must always be explicitly
+specified to enable autoincrement*.  This is divergent with the majority of documentation 
+examples which assume the usage of an autoincrement-capable database.   To specify sequences,
+use the sqlalchemy.schema.Sequence object which is passed to a Column construct::
+
+  t = Table('mytable', metadata, 
+        Column('id', Integer, Sequence('id_seq'), primary_key=True),
+        Column(...), ...
+  )
+
+This step is also required when using table reflection, i.e. autoload=True::
+
+  t = Table('mytable', metadata, 
+        Column('id', Integer, Sequence('id_seq'), primary_key=True),
+        autoload=True
+  ) 
+
+LOB Objects
+-----------
+
+cx_oracle presents some challenges when fetching LOB objects.  A LOB object in a result set
+is presented by cx_oracle as a cx_oracle.LOB object which has a read() method.  By default, 
+SQLAlchemy converts these LOB objects into Python strings.  This is for two reasons.  First,
+the LOB object requires an active cursor association, meaning if you were to fetch many rows
+at once such that cx_oracle had to go back to the database and fetch a new batch of rows,
+the LOB objects in the already-fetched rows are now unreadable and will raise an error. 
+SQLA "pre-reads" all LOBs so that their data is fetched before further rows are read.  
+The size of a "batch of rows" is controlled by the cursor.arraysize value, which SQLAlchemy
+defaults to 50 (cx_oracle normally defaults this to one).  
+
+Secondly, the LOB object is not a standard DBAPI return value so SQLAlchemy seeks to 
+"normalize" the results to look more like other DBAPIs.
+
+The conversion of LOB objects by this dialect is unique in SQLAlchemy in that it takes place
+for all statement executions, even plain string-based statements for which SQLA has no awareness
+of result typing.  This is so that calls like fetchmany() and fetchall() can work in all cases
+without raising cursor errors.  The conversion of LOB in all cases, as well as the "prefetch"
+of LOB objects, can be disabled using auto_convert_lobs=False.  
+
+LIMIT/OFFSET Support
+--------------------
+
+Oracle has no support for the LIMIT or OFFSET keywords.  Whereas previous versions of SQLAlchemy
+used the "ROW NUMBER OVER..." construct to simulate LIMIT/OFFSET, SQLAlchemy 0.5 now uses 
+a wrapped subquery approach in conjunction with ROWNUM.  The exact methodology is taken from
+http://www.oracle.com/technology/oramag/oracle/06-sep/o56asktom.html .  Note that the 
+"FIRST ROWS()" optimization keyword mentioned is not used by default, as the user community felt
+this was stepping into the bounds of optimization that is better left on the DBA side, but this
+prefix can be added by enabling the optimize_limits=True flag on create_engine().
+
+Two Phase Transaction Support
+-----------------------------
+
+Two Phase transactions are implemented using XA transactions.  Success has been reported of them
+working successfully but this should be regarded as an experimental feature.
+
+Oracle 8 Compatibility
+----------------------
+
+When using Oracle 8, a "use_ansi=False" flag is available which converts all
+JOIN phrases into the WHERE clause, and in the case of LEFT OUTER JOIN
+makes use of Oracle's (+) operator.
+
+Synonym/DBLINK Reflection
+-------------------------
+
+When using reflection with Table objects, the dialect can optionally search for tables
+indicated by synonyms that reference DBLINK-ed tables by passing the flag 
+oracle_resolve_synonyms=True as a keyword argument to the Table construct.  If DBLINK 
+is not in use this flag should be left off.
+
+"""
+
+import datetime, random, re
+
+from sqlalchemy import util, sql, schema, log
+from sqlalchemy.engine import default, base
+from sqlalchemy.sql import compiler, visitors, expression
+from sqlalchemy.sql import operators as sql_operators, functions as sql_functions
+from sqlalchemy import types as sqltypes
+
+
+class OracleNumeric(sqltypes.Numeric):
+    def get_col_spec(self):
+        if self.precision is None:
+            return "NUMERIC"
+        else:
+            return "NUMERIC(%(precision)s, %(scale)s)" % {'precision': self.precision, 'scale' : self.scale}
+
+class OracleInteger(sqltypes.Integer):
+    def get_col_spec(self):
+        return "INTEGER"
+
+class OracleSmallInteger(sqltypes.Smallinteger):
+    def get_col_spec(self):
+        return "SMALLINT"
+
+class OracleDate(sqltypes.Date):
+    def get_col_spec(self):
+        return "DATE"
+    def bind_processor(self, dialect):
+        return None
+
+    def result_processor(self, dialect):
+        def process(value):
+            if not isinstance(value, datetime.datetime):
+                return value
+            else:
+                return value.date()
+        return process
+
+class OracleDateTime(sqltypes.DateTime):
+    def get_col_spec(self):
+        return "DATE"
+
+    def result_processor(self, dialect):
+        def process(value):
+            if value is None or isinstance(value, datetime.datetime):
+                return value
+            else:
+                # convert cx_oracle datetime object returned pre-python 2.4
+                return datetime.datetime(value.year, value.month,
+                    value.day,value.hour, value.minute, value.second)
+        return process
+
+# Note:
+# Oracle DATE == DATETIME
+# Oracle does not allow milliseconds in DATE
+# Oracle does not support TIME columns
+
+# only if cx_oracle contains TIMESTAMP
+class OracleTimestamp(sqltypes.TIMESTAMP):
+    def get_col_spec(self):
+        return "TIMESTAMP"
+
+    def get_dbapi_type(self, dialect):
+        return dialect.TIMESTAMP
+
+    def result_processor(self, dialect):
+        def process(value):
+            if value is None or isinstance(value, datetime.datetime):
+                return value
+            else:
+                # convert cx_oracle datetime object returned pre-python 2.4
+                return datetime.datetime(value.year, value.month,
+                    value.day,value.hour, value.minute, value.second)
+        return process
+
+class OracleString(sqltypes.String):
+    def get_col_spec(self):
+        return "VARCHAR(%(length)s)" % {'length' : self.length}
+
+class OracleNVarchar(sqltypes.Unicode, OracleString):
+    def get_col_spec(self):
+        return "NVARCHAR2(%(length)s)" % {'length' : self.length}
+
+class OracleText(sqltypes.Text):
+    def get_dbapi_type(self, dbapi):
+        return dbapi.CLOB
+
+    def get_col_spec(self):
+        return "CLOB"
+
+    def result_processor(self, dialect):
+        super_process = super(OracleText, self).result_processor(dialect)
+        if not dialect.auto_convert_lobs:
+            return super_process
+        lob = dialect.dbapi.LOB
+        def process(value):
+            if isinstance(value, lob):
+                if super_process:
+                    return super_process(value.read())
+                else:
+                    return value.read()
+            else:
+                if super_process:
+                    return super_process(value)
+                else:
+                    return value
+        return process
+
+
+class OracleChar(sqltypes.CHAR):
+    def get_col_spec(self):
+        return "CHAR(%(length)s)" % {'length' : self.length}
+
+class OracleBinary(sqltypes.Binary):
+    def get_dbapi_type(self, dbapi):
+        return dbapi.BLOB
+
+    def get_col_spec(self):
+        return "BLOB"
+
+    def bind_processor(self, dialect):
+        return None
+
+    def result_processor(self, dialect):
+        if not dialect.auto_convert_lobs:
+            return None
+        lob = dialect.dbapi.LOB
+        def process(value):
+            if isinstance(value, lob):
+                return value.read()
+            else:
+                return value
+        return process
+
+class OracleRaw(OracleBinary):
+    def get_col_spec(self):
+        return "RAW(%(length)s)" % {'length' : self.length}
+
+class OracleBoolean(sqltypes.Boolean):
+    def get_col_spec(self):
+        return "SMALLINT"
+
+    def result_processor(self, dialect):
+        def process(value):
+            if value is None:
+                return None
+            return value and True or False
+        return process
+
+    def bind_processor(self, dialect):
+        def process(value):
+            if value is True:
+                return 1
+            elif value is False:
+                return 0
+            elif value is None:
+                return None
+            else:
+                return value and True or False
+        return process
+
+colspecs = {
+    sqltypes.Integer : OracleInteger,
+    sqltypes.Smallinteger : OracleSmallInteger,
+    sqltypes.Numeric : OracleNumeric,
+    sqltypes.Float : OracleNumeric,
+    sqltypes.DateTime : OracleDateTime,
+    sqltypes.Date : OracleDate,
+    sqltypes.String : OracleString,
+    sqltypes.Binary : OracleBinary,
+    sqltypes.Boolean : OracleBoolean,
+    sqltypes.Text : OracleText,
+    sqltypes.TIMESTAMP : OracleTimestamp,
+    sqltypes.CHAR: OracleChar,
+}
+
+ischema_names = {
+    'VARCHAR2' : OracleString,
+    'NVARCHAR2' : OracleNVarchar,
+    'CHAR' : OracleString,
+    'DATE' : OracleDateTime,
+    'DATETIME' : OracleDateTime,
+    'NUMBER' : OracleNumeric,
+    'BLOB' : OracleBinary,
+    'BFILE' : OracleBinary,
+    'CLOB' : OracleText,
+    'TIMESTAMP' : OracleTimestamp,
+    'RAW' : OracleRaw,
+    'FLOAT' : OracleNumeric,
+    'DOUBLE PRECISION' : OracleNumeric,
+    'LONG' : OracleText,
+}
+
+class OracleExecutionContext(default.DefaultExecutionContext):
+    def pre_exec(self):
+        super(OracleExecutionContext, self).pre_exec()
+        if self.dialect.auto_setinputsizes:
+            self.set_input_sizes()
+        if self.compiled_parameters is not None and len(self.compiled_parameters) == 1:
+            for key in self.compiled.binds:
+                bindparam = self.compiled.binds[key]
+                name = self.compiled.bind_names[bindparam]
+                value = self.compiled_parameters[0][name]
+                if bindparam.isoutparam:
+                    dbtype = bindparam.type.dialect_impl(self.dialect).get_dbapi_type(self.dialect.dbapi)
+                    if not hasattr(self, 'out_parameters'):
+                        self.out_parameters = {}
+                    self.out_parameters[name] = self.cursor.var(dbtype)
+                    self.parameters[0][name] = self.out_parameters[name]
+
+    def create_cursor(self):
+        c = self._connection.connection.cursor()
+        if self.dialect.arraysize:
+            c.cursor.arraysize = self.dialect.arraysize
+        return c
+
+    def get_result_proxy(self):
+        if hasattr(self, 'out_parameters'):
+            if self.compiled_parameters is not None and len(self.compiled_parameters) == 1:
+                for bind, name in self.compiled.bind_names.iteritems():
+                    if name in self.out_parameters:
+                        type = bind.type
+                        result_processor = type.dialect_impl(self.dialect).result_processor(self.dialect)
+                        if result_processor is not None:
+                            self.out_parameters[name] = result_processor(self.out_parameters[name].getvalue())
+                        else:
+                            self.out_parameters[name] = self.out_parameters[name].getvalue()
+            else:
+                for k in self.out_parameters:
+                    self.out_parameters[k] = self.out_parameters[k].getvalue()
+
+        if self.cursor.description is not None:
+            for column in self.cursor.description:
+                type_code = column[1]
+                if type_code in self.dialect.ORACLE_BINARY_TYPES:
+                    return base.BufferedColumnResultProxy(self)
+
+        return base.ResultProxy(self)
+
+class OracleDialect(default.DefaultDialect):
+    name = 'oracle'
+    supports_alter = True
+    supports_unicode_statements = False
+    max_identifier_length = 30
+    supports_sane_rowcount = True
+    supports_sane_multi_rowcount = False
+    preexecute_pk_sequences = True
+    supports_pk_autoincrement = False
+    default_paramstyle = 'named'
+
+    def __init__(self, use_ansi=True, auto_setinputsizes=True, auto_convert_lobs=True, threaded=True, allow_twophase=True, optimize_limits=False, arraysize=50, **kwargs):
+        default.DefaultDialect.__init__(self, **kwargs)
+        self.use_ansi = use_ansi
+        self.threaded = threaded
+        self.arraysize = arraysize
+        self.allow_twophase = allow_twophase
+        self.optimize_limits = optimize_limits
+        self.supports_timestamp = self.dbapi is None or hasattr(self.dbapi, 'TIMESTAMP' )
+        self.auto_setinputsizes = auto_setinputsizes
+        self.auto_convert_lobs = auto_convert_lobs
+        if self.dbapi is None or not self.auto_convert_lobs or not 'CLOB' in self.dbapi.__dict__:
+            self.dbapi_type_map = {}
+            self.ORACLE_BINARY_TYPES = []
+        else:
+            # only use this for LOB objects.  using it for strings, dates
+            # etc. leads to a little too much magic, reflection doesn't know if it should
+            # expect encoded strings or unicodes, etc.
+            self.dbapi_type_map = {
+                self.dbapi.CLOB: OracleText(),
+                self.dbapi.BLOB: OracleBinary(),
+                self.dbapi.BINARY: OracleRaw(),
+            }
+            self.ORACLE_BINARY_TYPES = [getattr(self.dbapi, k) for k in ["BFILE", "CLOB", "NCLOB", "BLOB"] if hasattr(self.dbapi, k)]
+
+    def dbapi(cls):
+        import cx_Oracle
+        return cx_Oracle
+    dbapi = classmethod(dbapi)
+
+    def create_connect_args(self, url):
+        dialect_opts = dict(url.query)
+        for opt in ('use_ansi', 'auto_setinputsizes', 'auto_convert_lobs',
+                    'threaded', 'allow_twophase'):
+            if opt in dialect_opts:
+                util.coerce_kw_type(dialect_opts, opt, bool)
+                setattr(self, opt, dialect_opts[opt])
+
+        if url.database:
+            # if we have a database, then we have a remote host
+            port = url.port
+            if port:
+                port = int(port)
+            else:
+                port = 1521
+            dsn = self.dbapi.makedsn(url.host, port, url.database)
+        else:
+            # we have a local tnsname
+            dsn = url.host
+
+        opts = dict(
+            user=url.username,
+            password=url.password,
+            dsn=dsn,
+            threaded=self.threaded,
+            twophase=self.allow_twophase,
+            )
+        if 'mode' in url.query:
+            opts['mode'] = url.query['mode']
+            if isinstance(opts['mode'], basestring):
+                mode = opts['mode'].upper()
+                if mode == 'SYSDBA':
+                    opts['mode'] = self.dbapi.SYSDBA
+                elif mode == 'SYSOPER':
+                    opts['mode'] = self.dbapi.SYSOPER
+                else:
+                    util.coerce_kw_type(opts, 'mode', int)
+        # Can't set 'handle' or 'pool' via URL query args, use connect_args
+
+        return ([], opts)
+
+    def is_disconnect(self, e):
+        if isinstance(e, self.dbapi.InterfaceError):
+            return "not connected" in str(e)
+        else:
+            return "ORA-03114" in str(e) or "ORA-03113" in str(e)
+
+    def type_descriptor(self, typeobj):
+        return sqltypes.adapt_type(typeobj, colspecs)
+
+    def create_xid(self):
+        """create a two-phase transaction ID.
+
+        this id will be passed to do_begin_twophase(), do_rollback_twophase(),
+        do_commit_twophase().  its format is unspecified."""
+
+        id = random.randint(0, 2 ** 128)
+        return (0x1234, "%032x" % id, "%032x" % 9)
+        
+    def do_release_savepoint(self, connection, name):
+        # Oracle does not support RELEASE SAVEPOINT
+        pass
+
+    def do_begin_twophase(self, connection, xid):
+        connection.connection.begin(*xid)
+
+    def do_prepare_twophase(self, connection, xid):
+        connection.connection.prepare()
+
+    def do_rollback_twophase(self, connection, xid, is_prepared=True, recover=False):
+        self.do_rollback(connection.connection)
+
+    def do_commit_twophase(self, connection, xid, is_prepared=True, recover=False):
+        self.do_commit(connection.connection)
+
+    def do_recover_twophase(self, connection):
+        pass
+
+    def has_table(self, connection, table_name, schema=None):
+        if not schema:
+            schema = self.get_default_schema_name(connection)
+        cursor = connection.execute("""select table_name from all_tables where table_name=:name and owner=:schema_name""", {'name':self._denormalize_name(table_name), 'schema_name':self._denormalize_name(schema)})
+        return cursor.fetchone() is not None
+
+    def has_sequence(self, connection, sequence_name, schema=None):
+        if not schema:
+            schema = self.get_default_schema_name(connection)
+        cursor = connection.execute("""select sequence_name from all_sequences where sequence_name=:name and sequence_owner=:schema_name""", {'name':self._denormalize_name(sequence_name), 'schema_name':self._denormalize_name(schema)})
+        return cursor.fetchone() is not None
+
+    def _normalize_name(self, name):
+        if name is None:
+            return None
+        elif name.upper() == name and not self.identifier_preparer._requires_quotes(name.lower().decode(self.encoding)):
+            return name.lower().decode(self.encoding)
+        else:
+            return name.decode(self.encoding)
+
+    def _denormalize_name(self, name):
+        if name is None:
+            return None
+        elif name.lower() == name and not self.identifier_preparer._requires_quotes(name.lower()):
+            return name.upper().encode(self.encoding)
+        else:
+            return name.encode(self.encoding)
+
+    def get_default_schema_name(self, connection):
+        return self._normalize_name(connection.execute('SELECT USER FROM DUAL').scalar())
+    get_default_schema_name = base.connection_memoize(
+        ('dialect', 'default_schema_name'))(get_default_schema_name)
+
+    def table_names(self, connection, schema):
+        # note that table_names() isnt loading DBLINKed or synonym'ed tables
+        if schema is None:
+            s = "select table_name from all_tables where nvl(tablespace_name, 'no tablespace') NOT IN ('SYSTEM', 'SYSAUX')"
+            cursor = connection.execute(s)
+        else:
+            s = "select table_name from all_tables where nvl(tablespace_name, 'no tablespace') NOT IN ('SYSTEM','SYSAUX') AND OWNER = :owner"
+            cursor = connection.execute(s, {'owner': self._denormalize_name(schema)})
+        return [self._normalize_name(row[0]) for row in cursor]
+
+    def _resolve_synonym(self, connection, desired_owner=None, desired_synonym=None, desired_table=None):
+        """search for a local synonym matching the given desired owner/name.
+
+        if desired_owner is None, attempts to locate a distinct owner.
+
+        returns the actual name, owner, dblink name, and synonym name if found.
+        """
+
+        sql = """select OWNER, TABLE_OWNER, TABLE_NAME, DB_LINK, SYNONYM_NAME
+                   from   ALL_SYNONYMS WHERE """
+
+        clauses = []
+        params = {}
+        if desired_synonym:
+            clauses.append("SYNONYM_NAME=:synonym_name")
+            params['synonym_name'] = desired_synonym
+        if desired_owner:
+            clauses.append("TABLE_OWNER=:desired_owner")
+            params['desired_owner'] = desired_owner
+        if desired_table:
+            clauses.append("TABLE_NAME=:tname")
+            params['tname'] = desired_table
+
+        sql += " AND ".join(clauses)
+
+        result = connection.execute(sql, **params)
+        if desired_owner:
+            row = result.fetchone()
+            if row:
+                return row['TABLE_NAME'], row['TABLE_OWNER'], row['DB_LINK'], row['SYNONYM_NAME']
+            else:
+                return None, None, None, None
+        else:
+            rows = result.fetchall()
+            if len(rows) > 1:
+                raise AssertionError("There are multiple tables visible to the schema, you must specify owner")
+            elif len(rows) == 1:
+                row = rows[0]
+                return row['TABLE_NAME'], row['TABLE_OWNER'], row['DB_LINK'], row['SYNONYM_NAME']
+            else:
+                return None, None, None, None
+
+    def reflecttable(self, connection, table, include_columns):
+        preparer = self.identifier_preparer
+
+        resolve_synonyms = table.kwargs.get('oracle_resolve_synonyms', False)
+
+        if resolve_synonyms:
+            actual_name, owner, dblink, synonym = self._resolve_synonym(connection, desired_owner=self._denormalize_name(table.schema), desired_synonym=self._denormalize_name(table.name))
+        else:
+            actual_name, owner, dblink, synonym = None, None, None, None
+
+        if not actual_name:
+            actual_name = self._denormalize_name(table.name)
+        if not dblink:
+            dblink = ''
+        if not owner:
+            owner = self._denormalize_name(table.schema or self.get_default_schema_name(connection))
+
+        c = connection.execute ("select COLUMN_NAME, DATA_TYPE, DATA_LENGTH, DATA_PRECISION, DATA_SCALE, NULLABLE, DATA_DEFAULT from ALL_TAB_COLUMNS%(dblink)s where TABLE_NAME = :table_name and OWNER = :owner" % {'dblink':dblink}, {'table_name':actual_name, 'owner':owner})
+
+        while True:
+            row = c.fetchone()
+            if row is None:
+                break
+
+            (colname, coltype, length, precision, scale, nullable, default) = (self._normalize_name(row[0]), row[1], row[2], row[3], row[4], row[5]=='Y', row[6])
+
+            if include_columns and colname not in include_columns:
+                continue
+
+            # INTEGER if the scale is 0 and precision is null
+            # NUMBER if the scale and precision are both null
+            # NUMBER(9,2) if the precision is 9 and the scale is 2
+            # NUMBER(3) if the precision is 3 and scale is 0
+            #length is ignored except for CHAR and VARCHAR2
+            if coltype == 'NUMBER' :
+                if precision is None and scale is None:
+                    coltype = OracleNumeric
+                elif precision is None and scale == 0  :
+                    coltype = OracleInteger
+                else :
+                    coltype = OracleNumeric(precision, scale)
+            elif coltype=='CHAR' or coltype=='VARCHAR2':
+                coltype = ischema_names.get(coltype, OracleString)(length)
+            else:
+                coltype = re.sub(r'\(\d+\)', '', coltype)
+                try:
+                    coltype = ischema_names[coltype]
+                except KeyError:
+                    util.warn("Did not recognize type '%s' of column '%s'" %
+                              (coltype, colname))
+                    coltype = sqltypes.NULLTYPE
+
+            colargs = []
+            if default is not None:
+                colargs.append(schema.DefaultClause(sql.text(default)))
+
+            table.append_column(schema.Column(colname, coltype, nullable=nullable, *colargs))
+
+        if not table.columns:
+            raise AssertionError("Couldn't find any column information for table %s" % actual_name)
+
+        c = connection.execute("""SELECT
+             ac.constraint_name,
+             ac.constraint_type,
+             loc.column_name AS local_column,
+             rem.table_name AS remote_table,
+             rem.column_name AS remote_column,
+             rem.owner AS remote_owner
+           FROM all_constraints%(dblink)s ac,
+             all_cons_columns%(dblink)s loc,
+             all_cons_columns%(dblink)s rem
+           WHERE ac.table_name = :table_name
+           AND ac.constraint_type IN ('R','P')
+           AND ac.owner = :owner
+           AND ac.owner = loc.owner
+           AND ac.constraint_name = loc.constraint_name
+           AND ac.r_owner = rem.owner(+)
+           AND ac.r_constraint_name = rem.constraint_name(+)
+           -- order multiple primary keys correctly
+           ORDER BY ac.constraint_name, loc.position, rem.position"""
+         % {'dblink':dblink}, {'table_name' : actual_name, 'owner' : owner})
+
+        fks = {}
+        while True:
+            row = c.fetchone()
+            if row is None:
+                break
+            #print "ROW:" , row
+            (cons_name, cons_type, local_column, remote_table, remote_column, remote_owner) = row[0:2] + tuple([self._normalize_name(x) for x in row[2:]])
+            if cons_type == 'P':
+                table.primary_key.add(table.c[local_column])
+            elif cons_type == 'R':
+                try:
+                    fk = fks[cons_name]
+                except KeyError:
+                    fk = ([], [])
+                    fks[cons_name] = fk
+                if remote_table is None:
+                    # ticket 363
+                    util.warn(
+                        ("Got 'None' querying 'table_name' from "
+                         "all_cons_columns%(dblink)s - does the user have "
+                         "proper rights to the table?") % {'dblink':dblink})
+                    continue
+
+                if resolve_synonyms:
+                    ref_remote_name, ref_remote_owner, ref_dblink, ref_synonym = self._resolve_synonym(connection, desired_owner=self._denormalize_name(remote_owner), desired_table=self._denormalize_name(remote_table))
+                    if ref_synonym:
+                        remote_table = self._normalize_name(ref_synonym)
+                        remote_owner = self._normalize_name(ref_remote_owner)
+
+                if not table.schema and self._denormalize_name(remote_owner) == owner:
+                    refspec =  ".".join([remote_table, remote_column])
+                    t = schema.Table(remote_table, table.metadata, autoload=True, autoload_with=connection, oracle_resolve_synonyms=resolve_synonyms, useexisting=True)
+                else:
+                    refspec =  ".".join([x for x in [remote_owner, remote_table, remote_column] if x])
+                    t = schema.Table(remote_table, table.metadata, autoload=True, autoload_with=connection, schema=remote_owner, oracle_resolve_synonyms=resolve_synonyms, useexisting=True)
+
+                if local_column not in fk[0]:
+                    fk[0].append(local_column)
+                if refspec not in fk[1]:
+                    fk[1].append(refspec)
+
+        for name, value in fks.iteritems():
+            table.append_constraint(schema.ForeignKeyConstraint(value[0], value[1], name=name, link_to_name=True))
+
+
+class _OuterJoinColumn(sql.ClauseElement):
+    __visit_name__ = 'outer_join_column'
+    
+    def __init__(self, column):
+        self.column = column
+
+class OracleCompiler(compiler.DefaultCompiler):
+    """Oracle compiler modifies the lexical structure of Select
+    statements to work under non-ANSI configured Oracle databases, if
+    the use_ansi flag is False.
+    """
+
+    operators = compiler.DefaultCompiler.operators.copy()
+    operators.update(
+        {
+            sql_operators.mod : lambda x, y:"mod(%s, %s)" % (x, y),
+            sql_operators.match_op: lambda x, y: "CONTAINS (%s, %s)" % (x, y)
+        }
+    )
+
+    functions = compiler.DefaultCompiler.functions.copy()
+    functions.update (
+        {
+            sql_functions.now : 'CURRENT_TIMESTAMP'
+        }
+    )
+
+    def __init__(self, *args, **kwargs):
+        super(OracleCompiler, self).__init__(*args, **kwargs)
+        self.__wheres = {}
+
+    def default_from(self):
+        """Called when a ``SELECT`` statement has no froms, and no ``FROM`` clause is to be appended.
+
+        The Oracle compiler tacks a "FROM DUAL" to the statement.
+        """
+
+        return " FROM DUAL"
+
+    def apply_function_parens(self, func):
+        return len(func.clauses) > 0
+
+    def visit_join(self, join, **kwargs):
+        if self.dialect.use_ansi:
+            return compiler.DefaultCompiler.visit_join(self, join, **kwargs)
+        else:
+            return self.process(join.left, asfrom=True) + ", " + self.process(join.right, asfrom=True)
+
+    def _get_nonansi_join_whereclause(self, froms):
+        clauses = []
+
+        def visit_join(join):
+            if join.isouter:
+                def visit_binary(binary):
+                    if binary.operator == sql_operators.eq:
+                        if binary.left.table is join.right:
+                            binary.left = _OuterJoinColumn(binary.left)
+                        elif binary.right.table is join.right:
+                            binary.right = _OuterJoinColumn(binary.right)
+                clauses.append(visitors.cloned_traverse(join.onclause, {}, {'binary':visit_binary}))
+            else:
+                clauses.append(join.onclause)
+
+        for f in froms:
+            visitors.traverse(f, {}, {'join':visit_join})
+        return sql.and_(*clauses)
+
+    def visit_outer_join_column(self, vc):
+        return self.process(vc.column) + "(+)"
+
+    def visit_sequence(self, seq):
+        return self.dialect.identifier_preparer.format_sequence(seq) + ".nextval"
+
+    def visit_alias(self, alias, asfrom=False, **kwargs):
+        """Oracle doesn't like ``FROM table AS alias``.  Is the AS standard SQL??"""
+
+        if asfrom:
+            alias_name = isinstance(alias.name, expression._generated_label) and \
+                            self._truncated_identifier("alias", alias.name) or alias.name
+            
+            return self.process(alias.original, asfrom=True, **kwargs) + " " +\
+                    self.preparer.format_alias(alias, alias_name)
+        else:
+            return self.process(alias.original, **kwargs)
+
+    def _TODO_visit_compound_select(self, select):
+        """Need to determine how to get ``LIMIT``/``OFFSET`` into a ``UNION`` for Oracle."""
+        pass
+
+    def visit_select(self, select, **kwargs):
+        """Look for ``LIMIT`` and OFFSET in a select statement, and if
+        so tries to wrap it in a subquery with ``rownum`` criterion.
+        """
+
+        if not getattr(select, '_oracle_visit', None):
+            if not self.dialect.use_ansi:
+                if self.stack and 'from' in self.stack[-1]:
+                    existingfroms = self.stack[-1]['from']
+                else:
+                    existingfroms = None
+
+                froms = select._get_display_froms(existingfroms)
+                whereclause = self._get_nonansi_join_whereclause(froms)
+                if whereclause:
+                    select = select.where(whereclause)
+                    select._oracle_visit = True
+
+            if select._limit is not None or select._offset is not None:
+                # See http://www.oracle.com/technology/oramag/oracle/06-sep/o56asktom.html
+                #
+                # Generalized form of an Oracle pagination query:
+                #   select ... from (
+                #     select /*+ FIRST_ROWS(N) */ ...., rownum as ora_rn from (
+                #         select distinct ... where ... order by ...
+                #     ) where ROWNUM <= :limit+:offset
+                #   ) where ora_rn > :offset
+                # Outer select and "ROWNUM as ora_rn" can be dropped if limit=0
+
+                # TODO: use annotations instead of clone + attr set ?
+                select = select._generate()
+                select._oracle_visit = True
+
+                # Wrap the middle select and add the hint
+                limitselect = sql.select([c for c in select.c])
+                if select._limit and self.dialect.optimize_limits:
+                    limitselect = limitselect.prefix_with("/*+ FIRST_ROWS(%d) */" % select._limit)
+
+                limitselect._oracle_visit = True
+                limitselect._is_wrapper = True
+
+                # If needed, add the limiting clause
+                if select._limit is not None:
+                    max_row = select._limit
+                    if select._offset is not None:
+                        max_row += select._offset
+                    limitselect.append_whereclause(
+                            sql.literal_column("ROWNUM")<=max_row)
+ 
+                # If needed, add the ora_rn, and wrap again with offset.
+                if select._offset is None:
+                    select = limitselect
+                else:
+                     limitselect = limitselect.column(
+                             sql.literal_column("ROWNUM").label("ora_rn"))
+                     limitselect._oracle_visit = True
+                     limitselect._is_wrapper = True
+ 
+                     offsetselect = sql.select(
+                             [c for c in limitselect.c if c.key!='ora_rn'])
+                     offsetselect._oracle_visit = True
+                     offsetselect._is_wrapper = True
+ 
+                     offsetselect.append_whereclause(
+                             sql.literal_column("ora_rn")>select._offset)
+ 
+                     select = offsetselect
+
+        kwargs['iswrapper'] = getattr(select, '_is_wrapper', False)
+        return compiler.DefaultCompiler.visit_select(self, select, **kwargs)
+
+    def limit_clause(self, select):
+        return ""
+
+    def for_update_clause(self, select):
+        if select.for_update == "nowait":
+            return " FOR UPDATE NOWAIT"
+        else:
+            return super(OracleCompiler, self).for_update_clause(select)
+
+
+class OracleSchemaGenerator(compiler.SchemaGenerator):
+    def get_column_specification(self, column, **kwargs):
+        colspec = self.preparer.format_column(column)
+        colspec += " " + column.type.dialect_impl(self.dialect).get_col_spec()
+        default = self.get_column_default_string(column)
+        if default is not None:
+            colspec += " DEFAULT " + default
+
+        if not column.nullable:
+            colspec += " NOT NULL"
+        return colspec
+
+    def visit_sequence(self, sequence):
+        if not self.checkfirst  or not self.dialect.has_sequence(self.connection, sequence.name, sequence.schema):
+            self.append("CREATE SEQUENCE %s" % self.preparer.format_sequence(sequence))
+            self.execute()
+
+class OracleSchemaDropper(compiler.SchemaDropper):
+    def visit_sequence(self, sequence):
+        if not self.checkfirst or self.dialect.has_sequence(self.connection, sequence.name, sequence.schema):
+            self.append("DROP SEQUENCE %s" % self.preparer.format_sequence(sequence))
+            self.execute()
+
+class OracleDefaultRunner(base.DefaultRunner):
+    def visit_sequence(self, seq):
+        return self.execute_string("SELECT " + self.dialect.identifier_preparer.format_sequence(seq) + ".nextval FROM DUAL", {})
+
+class OracleIdentifierPreparer(compiler.IdentifierPreparer):
+    def format_savepoint(self, savepoint):
+        name = re.sub(r'^_+', '', savepoint.ident)
+        return super(OracleIdentifierPreparer, self).format_savepoint(savepoint, name)
+
+
+dialect = OracleDialect
+dialect.statement_compiler = OracleCompiler
+dialect.schemagenerator = OracleSchemaGenerator
+dialect.schemadropper = OracleSchemaDropper
+dialect.preparer = OracleIdentifierPreparer
+dialect.defaultrunner = OracleDefaultRunner
+dialect.execution_ctx_cls = OracleExecutionContext
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/databases/firebird.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/databases/firebird.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/databases/firebird.py (revision 3)
@@ -0,0 +1,768 @@
+# firebird.py
+# Copyright (C) 2005, 2006, 2007, 2008, 2009 Michael Bayer mike_mp@zzzcomputing.com
+#
+# This module is part of SQLAlchemy and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+"""
+Firebird backend
+================
+
+This module implements the Firebird backend, thru the kinterbasdb_
+DBAPI module.
+
+Firebird dialects
+-----------------
+
+Firebird offers two distinct dialects_ (not to be confused with the
+SA ``Dialect`` thing):
+
+dialect 1
+  This is the old syntax and behaviour, inherited from Interbase pre-6.0.
+
+dialect 3
+  This is the newer and supported syntax, introduced in Interbase 6.0.
+
+From the user point of view, the biggest change is in date/time
+handling: under dialect 1, there's a single kind of field, ``DATE``
+with a synonim ``DATETIME``, that holds a `timestamp` value, that is a
+date with hour, minute, second. Under dialect 3 there are three kinds,
+a ``DATE`` that holds a date, a ``TIME`` that holds a *time of the
+day* value and a ``TIMESTAMP``, equivalent to the old ``DATE``.
+
+The problem is that the dialect of a Firebird database is a property
+of the database itself [#]_ (that is, any single database has been
+created with one dialect or the other: there is no way to change the
+after creation). SQLAlchemy has a single instance of the class that
+controls all the connections to a particular kind of database, so it
+cannot easily differentiate between the two modes, and in particular
+it **cannot** simultaneously talk with two distinct Firebird databases
+with different dialects.
+
+By default this module is biased toward dialect 3, but you can easily
+tweak it to handle dialect 1 if needed::
+
+  from sqlalchemy import types as sqltypes
+  from sqlalchemy.databases.firebird import FBDate, colspecs, ischema_names
+
+  # Adjust the mapping of the timestamp kind
+  ischema_names['TIMESTAMP'] = FBDate
+  colspecs[sqltypes.DateTime] = FBDate,
+
+Other aspects may be version-specific. You can use the ``server_version_info()`` method
+on the ``FBDialect`` class to do whatever is needed::
+
+  from sqlalchemy.databases.firebird import FBCompiler
+
+  if engine.dialect.server_version_info(connection) < (2,0):
+      # Change the name of the function ``length`` to use the UDF version
+      # instead of ``char_length``
+      FBCompiler.LENGTH_FUNCTION_NAME = 'strlen'
+
+Pooling connections
+-------------------
+
+The default strategy used by SQLAlchemy to pool the database connections
+in particular cases may raise an ``OperationalError`` with a message
+`"object XYZ is in use"`. This happens on Firebird when there are two
+connections to the database, one is using, or has used, a particular table
+and the other tries to drop or alter the same table. To garantee DDL
+operations success Firebird recommend doing them as the single connected user.
+
+In case your SA application effectively needs to do DDL operations while other
+connections are active, the following setting may alleviate the problem::
+
+  from sqlalchemy import pool
+  from sqlalchemy.databases.firebird import dialect
+
+  # Force SA to use a single connection per thread
+  dialect.poolclass = pool.SingletonThreadPool
+
+RETURNING support
+-----------------
+
+Firebird 2.0 supports returning a result set from inserts, and 2.1 extends
+that to deletes and updates.
+
+To use this pass the column/expression list to the ``firebird_returning``
+parameter when creating the queries::
+
+  raises = tbl.update(empl.c.sales > 100, values=dict(salary=empl.c.salary * 1.1),
+                      firebird_returning=[empl.c.id, empl.c.salary]).execute().fetchall()
+
+
+.. [#] Well, that is not the whole story, as the client may still ask
+       a different (lower) dialect...
+
+.. _dialects: http://mc-computing.com/Databases/Firebird/SQL_Dialect.html
+.. _kinterbasdb: http://sourceforge.net/projects/kinterbasdb
+"""
+
+
+import datetime, decimal, re
+
+from sqlalchemy import exc, schema, types as sqltypes, sql, util
+from sqlalchemy.engine import base, default
+
+
+_initialized_kb = False
+
+
+class FBNumeric(sqltypes.Numeric):
+    """Handle ``NUMERIC(precision,scale)`` datatype."""
+
+    def get_col_spec(self):
+        if self.precision is None:
+            return "NUMERIC"
+        else:
+            return "NUMERIC(%(precision)s, %(scale)s)" % { 'precision': self.precision,
+                                                            'scale' : self.scale }
+
+    def bind_processor(self, dialect):
+        return None
+
+    def result_processor(self, dialect):
+        if self.asdecimal:
+            return None
+        else:
+            def process(value):
+                if isinstance(value, decimal.Decimal):
+                    return float(value)
+                else:
+                    return value
+            return process
+
+
+class FBFloat(sqltypes.Float):
+    """Handle ``FLOAT(precision)`` datatype."""
+
+    def get_col_spec(self):
+        if not self.precision:
+            return "FLOAT"
+        else:
+            return "FLOAT(%(precision)s)" % {'precision': self.precision}
+
+
+class FBInteger(sqltypes.Integer):
+    """Handle ``INTEGER`` datatype."""
+
+    def get_col_spec(self):
+        return "INTEGER"
+
+
+class FBSmallInteger(sqltypes.Smallinteger):
+    """Handle ``SMALLINT`` datatype."""
+
+    def get_col_spec(self):
+        return "SMALLINT"
+
+
+class FBDateTime(sqltypes.DateTime):
+    """Handle ``TIMESTAMP`` datatype."""
+
+    def get_col_spec(self):
+        return "TIMESTAMP"
+
+    def bind_processor(self, dialect):
+        def process(value):
+            if value is None or isinstance(value, datetime.datetime):
+                return value
+            else:
+                return datetime.datetime(year=value.year,
+                                         month=value.month,
+                                         day=value.day)
+        return process
+
+
+class FBDate(sqltypes.DateTime):
+    """Handle ``DATE`` datatype."""
+
+    def get_col_spec(self):
+        return "DATE"
+
+
+class FBTime(sqltypes.Time):
+    """Handle ``TIME`` datatype."""
+
+    def get_col_spec(self):
+        return "TIME"
+
+
+class FBText(sqltypes.Text):
+    """Handle ``BLOB SUB_TYPE 1`` datatype (aka *textual* blob)."""
+
+    def get_col_spec(self):
+        return "BLOB SUB_TYPE 1"
+
+
+class FBString(sqltypes.String):
+    """Handle ``VARCHAR(length)`` datatype."""
+
+    def get_col_spec(self):
+        if self.length:
+            return "VARCHAR(%(length)s)" % {'length' : self.length}
+        else:
+            return "BLOB SUB_TYPE 1"
+
+
+class FBChar(sqltypes.CHAR):
+    """Handle ``CHAR(length)`` datatype."""
+
+    def get_col_spec(self):
+        if self.length:
+            return "CHAR(%(length)s)" % {'length' : self.length}
+        else:
+            return "BLOB SUB_TYPE 1"
+
+
+class FBBinary(sqltypes.Binary):
+    """Handle ``BLOB SUB_TYPE 0`` datatype (aka *binary* blob)."""
+
+    def get_col_spec(self):
+        return "BLOB SUB_TYPE 0"
+
+
+class FBBoolean(sqltypes.Boolean):
+    """Handle boolean values as a ``SMALLINT`` datatype."""
+
+    def get_col_spec(self):
+        return "SMALLINT"
+
+
+colspecs = {
+    sqltypes.Integer : FBInteger,
+    sqltypes.Smallinteger : FBSmallInteger,
+    sqltypes.Numeric : FBNumeric,
+    sqltypes.Float : FBFloat,
+    sqltypes.DateTime : FBDateTime,
+    sqltypes.Date : FBDate,
+    sqltypes.Time : FBTime,
+    sqltypes.String : FBString,
+    sqltypes.Binary : FBBinary,
+    sqltypes.Boolean : FBBoolean,
+    sqltypes.Text : FBText,
+    sqltypes.CHAR: FBChar,
+}
+
+
+ischema_names = {
+      'SHORT': lambda r: FBSmallInteger(),
+       'LONG': lambda r: FBInteger(),
+       'QUAD': lambda r: FBFloat(),
+      'FLOAT': lambda r: FBFloat(),
+       'DATE': lambda r: FBDate(),
+       'TIME': lambda r: FBTime(),
+       'TEXT': lambda r: FBString(r['flen']),
+      'INT64': lambda r: FBNumeric(precision=r['fprec'], scale=r['fscale'] * -1), # This generically handles NUMERIC()
+     'DOUBLE': lambda r: FBFloat(),
+  'TIMESTAMP': lambda r: FBDateTime(),
+    'VARYING': lambda r: FBString(r['flen']),
+    'CSTRING': lambda r: FBChar(r['flen']),
+       'BLOB': lambda r: r['stype']==1 and FBText() or FBBinary()
+      }
+
+RETURNING_KW_NAME = 'firebird_returning'
+
+class FBExecutionContext(default.DefaultExecutionContext):
+    pass
+
+
+class FBDialect(default.DefaultDialect):
+    """Firebird dialect"""
+    name = 'firebird'
+    supports_sane_rowcount = False
+    supports_sane_multi_rowcount = False
+    max_identifier_length = 31
+    preexecute_pk_sequences = True
+    supports_pk_autoincrement = False
+
+    def __init__(self, type_conv=200, concurrency_level=1, **kwargs):
+        default.DefaultDialect.__init__(self, **kwargs)
+
+        self.type_conv = type_conv
+        self.concurrency_level = concurrency_level
+
+    def dbapi(cls):
+        import kinterbasdb
+        return kinterbasdb
+    dbapi = classmethod(dbapi)
+
+    def create_connect_args(self, url):
+        opts = url.translate_connect_args(username='user')
+        if opts.get('port'):
+            opts['host'] = "%s/%s" % (opts['host'], opts['port'])
+            del opts['port']
+        opts.update(url.query)
+
+        type_conv = opts.pop('type_conv', self.type_conv)
+        concurrency_level = opts.pop('concurrency_level', self.concurrency_level)
+        global _initialized_kb
+        if not _initialized_kb and self.dbapi is not None:
+            _initialized_kb = True
+            self.dbapi.init(type_conv=type_conv, concurrency_level=concurrency_level)
+        return ([], opts)
+
+    def type_descriptor(self, typeobj):
+        return sqltypes.adapt_type(typeobj, colspecs)
+
+    def server_version_info(self, connection):
+        """Get the version of the Firebird server used by a connection.
+
+        Returns a tuple of (`major`, `minor`, `build`), three integers
+        representing the version of the attached server.
+        """
+
+        # This is the simpler approach (the other uses the services api),
+        # that for backward compatibility reasons returns a string like
+        #   LI-V6.3.3.12981 Firebird 2.0
+        # where the first version is a fake one resembling the old
+        # Interbase signature. This is more than enough for our purposes,
+        # as this is mainly (only?) used by the testsuite.
+
+        from re import match
+
+        fbconn = connection.connection.connection
+        version = fbconn.server_version
+        m = match('\w+-V(\d+)\.(\d+)\.(\d+)\.(\d+) \w+ (\d+)\.(\d+)', version)
+        if not m:
+            raise AssertionError("Could not determine version from string '%s'" % version)
+        return tuple([int(x) for x in m.group(5, 6, 4)])
+
+    def _normalize_name(self, name):
+        """Convert the name to lowercase if it is possible"""
+
+        # Remove trailing spaces: FB uses a CHAR() type,
+        # that is padded with spaces
+        name = name and name.rstrip()
+        if name is None:
+            return None
+        elif name.upper() == name and not self.identifier_preparer._requires_quotes(name.lower()):
+            return name.lower()
+        else:
+            return name
+
+    def _denormalize_name(self, name):
+        """Revert a *normalized* name to its uppercase equivalent"""
+
+        if name is None:
+            return None
+        elif name.lower() == name and not self.identifier_preparer._requires_quotes(name.lower()):
+            return name.upper()
+        else:
+            return name
+
+    def table_names(self, connection, schema):
+        """Return a list of *normalized* table names omitting system relations."""
+
+        s = """
+        SELECT r.rdb$relation_name
+        FROM rdb$relations r
+        WHERE r.rdb$system_flag=0
+        """
+        return [self._normalize_name(row[0]) for row in connection.execute(s)]
+
+    def has_table(self, connection, table_name, schema=None):
+        """Return ``True`` if the given table exists, ignoring the `schema`."""
+
+        tblqry = """
+        SELECT 1 FROM rdb$database
+        WHERE EXISTS (SELECT rdb$relation_name
+                      FROM rdb$relations
+                      WHERE rdb$relation_name=?)
+        """
+        c = connection.execute(tblqry, [self._denormalize_name(table_name)])
+        row = c.fetchone()
+        if row is not None:
+            return True
+        else:
+            return False
+
+    def has_sequence(self, connection, sequence_name):
+        """Return ``True`` if the given sequence (generator) exists."""
+
+        genqry = """
+        SELECT 1 FROM rdb$database
+        WHERE EXISTS (SELECT rdb$generator_name
+                      FROM rdb$generators
+                      WHERE rdb$generator_name=?)
+        """
+        c = connection.execute(genqry, [self._denormalize_name(sequence_name)])
+        row = c.fetchone()
+        if row is not None:
+            return True
+        else:
+            return False
+
+    def is_disconnect(self, e):
+        if isinstance(e, self.dbapi.OperationalError):
+            return 'Unable to complete network request to host' in str(e)
+        elif isinstance(e, self.dbapi.ProgrammingError):
+            msg = str(e)
+            return ('Invalid connection state' in msg or
+                    'Invalid cursor state' in msg)
+        else:
+            return False
+
+    def reflecttable(self, connection, table, include_columns):
+        # Query to extract the details of all the fields of the given table
+        tblqry = """
+        SELECT DISTINCT r.rdb$field_name AS fname,
+                        r.rdb$null_flag AS null_flag,
+                        t.rdb$type_name AS ftype,
+                        f.rdb$field_sub_type AS stype,
+                        f.rdb$field_length AS flen,
+                        f.rdb$field_precision AS fprec,
+                        f.rdb$field_scale AS fscale,
+                        COALESCE(r.rdb$default_source, f.rdb$default_source) AS fdefault
+        FROM rdb$relation_fields r
+             JOIN rdb$fields f ON r.rdb$field_source=f.rdb$field_name
+             JOIN rdb$types t ON t.rdb$type=f.rdb$field_type AND t.rdb$field_name='RDB$FIELD_TYPE'
+        WHERE f.rdb$system_flag=0 AND r.rdb$relation_name=?
+        ORDER BY r.rdb$field_position
+        """
+        # Query to extract the PK/FK constrained fields of the given table
+        keyqry = """
+        SELECT se.rdb$field_name AS fname
+        FROM rdb$relation_constraints rc
+             JOIN rdb$index_segments se ON rc.rdb$index_name=se.rdb$index_name
+        WHERE rc.rdb$constraint_type=? AND rc.rdb$relation_name=?
+        """
+        # Query to extract the details of each UK/FK of the given table
+        fkqry = """
+        SELECT rc.rdb$constraint_name AS cname,
+               cse.rdb$field_name AS fname,
+               ix2.rdb$relation_name AS targetrname,
+               se.rdb$field_name AS targetfname
+        FROM rdb$relation_constraints rc
+             JOIN rdb$indices ix1 ON ix1.rdb$index_name=rc.rdb$index_name
+             JOIN rdb$indices ix2 ON ix2.rdb$index_name=ix1.rdb$foreign_key
+             JOIN rdb$index_segments cse ON cse.rdb$index_name=ix1.rdb$index_name
+             JOIN rdb$index_segments se ON se.rdb$index_name=ix2.rdb$index_name AND se.rdb$field_position=cse.rdb$field_position
+        WHERE rc.rdb$constraint_type=? AND rc.rdb$relation_name=?
+        ORDER BY se.rdb$index_name, se.rdb$field_position
+        """
+        # Heuristic-query to determine the generator associated to a PK field
+        genqry = """
+        SELECT trigdep.rdb$depended_on_name AS fgenerator
+        FROM rdb$dependencies tabdep
+             JOIN rdb$dependencies trigdep ON (tabdep.rdb$dependent_name=trigdep.rdb$dependent_name
+                                               AND trigdep.rdb$depended_on_type=14
+                                               AND trigdep.rdb$dependent_type=2)
+             JOIN rdb$triggers trig ON (trig.rdb$trigger_name=tabdep.rdb$dependent_name)
+        WHERE tabdep.rdb$depended_on_name=?
+          AND tabdep.rdb$depended_on_type=0
+          AND trig.rdb$trigger_type=1
+          AND tabdep.rdb$field_name=?
+          AND (SELECT count(*)
+               FROM rdb$dependencies trigdep2
+               WHERE trigdep2.rdb$dependent_name = trigdep.rdb$dependent_name) = 2
+        """
+
+        tablename = self._denormalize_name(table.name)
+
+        # get primary key fields
+        c = connection.execute(keyqry, ["PRIMARY KEY", tablename])
+        pkfields = [self._normalize_name(r['fname']) for r in c.fetchall()]
+
+        # get all of the fields for this table
+        c = connection.execute(tblqry, [tablename])
+
+        found_table = False
+        while True:
+            row = c.fetchone()
+            if row is None:
+                break
+            found_table = True
+
+            name = self._normalize_name(row['fname'])
+            if include_columns and name not in include_columns:
+                continue
+            args = [name]
+
+            kw = {}
+            # get the data type
+            coltype = ischema_names.get(row['ftype'].rstrip())
+            if coltype is None:
+                util.warn("Did not recognize type '%s' of column '%s'" %
+                          (str(row['ftype']), name))
+                coltype = sqltypes.NULLTYPE
+            else:
+                coltype = coltype(row)
+            args.append(coltype)
+
+            # is it a primary key?
+            kw['primary_key'] = name in pkfields
+
+            # is it nullable?
+            kw['nullable'] = not bool(row['null_flag'])
+
+            # does it have a default value?
+            if row['fdefault'] is not None:
+                # the value comes down as "DEFAULT 'value'"
+                assert row['fdefault'].upper().startswith('DEFAULT '), row
+                defvalue = row['fdefault'][8:]
+                args.append(schema.DefaultClause(sql.text(defvalue)))
+
+            col = schema.Column(*args, **kw)
+            if kw['primary_key']:
+                # if the PK is a single field, try to see if its linked to
+                # a sequence thru a trigger
+                if len(pkfields)==1:
+                    genc = connection.execute(genqry, [tablename, row['fname']])
+                    genr = genc.fetchone()
+                    if genr is not None:
+                        col.sequence = schema.Sequence(self._normalize_name(genr['fgenerator']))
+
+            table.append_column(col)
+
+        if not found_table:
+            raise exc.NoSuchTableError(table.name)
+
+        # get the foreign keys
+        c = connection.execute(fkqry, ["FOREIGN KEY", tablename])
+        fks = {}
+        while True:
+            row = c.fetchone()
+            if not row:
+                break
+
+            cname = self._normalize_name(row['cname'])
+            try:
+                fk = fks[cname]
+            except KeyError:
+                fks[cname] = fk = ([], [])
+            rname = self._normalize_name(row['targetrname'])
+            schema.Table(rname, table.metadata, autoload=True, autoload_with=connection)
+            fname = self._normalize_name(row['fname'])
+            refspec = rname + '.' + self._normalize_name(row['targetfname'])
+            fk[0].append(fname)
+            fk[1].append(refspec)
+
+        for name, value in fks.iteritems():
+            table.append_constraint(schema.ForeignKeyConstraint(value[0], value[1], name=name, link_to_name=True))
+
+    def do_execute(self, cursor, statement, parameters, **kwargs):
+        # kinterbase does not accept a None, but wants an empty list
+        # when there are no arguments.
+        cursor.execute(statement, parameters or [])
+
+    def do_rollback(self, connection):
+        # Use the retaining feature, that keeps the transaction going
+        connection.rollback(True)
+
+    def do_commit(self, connection):
+        # Use the retaining feature, that keeps the transaction going
+        connection.commit(True)
+
+
+def _substring(s, start, length=None):
+    "Helper function to handle Firebird 2 SUBSTRING builtin"
+
+    if length is None:
+        return "SUBSTRING(%s FROM %s)" % (s, start)
+    else:
+        return "SUBSTRING(%s FROM %s FOR %s)" % (s, start, length)
+
+
+class FBCompiler(sql.compiler.DefaultCompiler):
+    """Firebird specific idiosincrasies"""
+
+    # Firebird lacks a builtin modulo operator, but there is
+    # an equivalent function in the ib_udf library.
+    operators = sql.compiler.DefaultCompiler.operators.copy()
+    operators.update({
+        sql.operators.mod : lambda x, y:"mod(%s, %s)" % (x, y)
+        })
+
+    def visit_alias(self, alias, asfrom=False, **kwargs):
+        # Override to not use the AS keyword which FB 1.5 does not like
+        if asfrom:
+            return self.process(alias.original, asfrom=True, **kwargs) + " " + self.preparer.format_alias(alias, self._anonymize(alias.name))
+        else:
+            return self.process(alias.original, **kwargs)
+
+    functions = sql.compiler.DefaultCompiler.functions.copy()
+    functions['substring'] = _substring
+
+    def function_argspec(self, func):
+        if func.clauses:
+            return self.process(func.clause_expr)
+        else:
+            return ""
+
+    def default_from(self):
+        return " FROM rdb$database"
+
+    def visit_sequence(self, seq):
+        return "gen_id(%s, 1)" % self.preparer.format_sequence(seq)
+
+    def get_select_precolumns(self, select):
+        """Called when building a ``SELECT`` statement, position is just
+        before column list Firebird puts the limit and offset right
+        after the ``SELECT``...
+        """
+
+        result = ""
+        if select._limit:
+            result += "FIRST %d "  % select._limit
+        if select._offset:
+            result +="SKIP %d "  %  select._offset
+        if select._distinct:
+            result += "DISTINCT "
+        return result
+
+    def limit_clause(self, select):
+        """Already taken care of in the `get_select_precolumns` method."""
+
+        return ""
+
+    LENGTH_FUNCTION_NAME = 'char_length'
+    def function_string(self, func):
+        """Substitute the ``length`` function.
+
+        On newer FB there is a ``char_length`` function, while older
+        ones need the ``strlen`` UDF.
+        """
+
+        if func.name == 'length':
+            return self.LENGTH_FUNCTION_NAME + '%(expr)s'
+        return super(FBCompiler, self).function_string(func)
+
+    def _append_returning(self, text, stmt):
+        returning_cols = stmt.kwargs[RETURNING_KW_NAME]
+        def flatten_columnlist(collist):
+            for c in collist:
+                if isinstance(c, sql.expression.Selectable):
+                    for co in c.columns:
+                        yield co
+                else:
+                    yield c
+        columns = [self.process(c, within_columns_clause=True)
+                   for c in flatten_columnlist(returning_cols)]
+        text += ' RETURNING ' + ', '.join(columns)
+        return text
+
+    def visit_update(self, update_stmt):
+        text = super(FBCompiler, self).visit_update(update_stmt)
+        if RETURNING_KW_NAME in update_stmt.kwargs:
+            return self._append_returning(text, update_stmt)
+        else:
+            return text
+
+    def visit_insert(self, insert_stmt):
+        text = super(FBCompiler, self).visit_insert(insert_stmt)
+        if RETURNING_KW_NAME in insert_stmt.kwargs:
+            return self._append_returning(text, insert_stmt)
+        else:
+            return text
+
+    def visit_delete(self, delete_stmt):
+        text = super(FBCompiler, self).visit_delete(delete_stmt)
+        if RETURNING_KW_NAME in delete_stmt.kwargs:
+            return self._append_returning(text, delete_stmt)
+        else:
+            return text
+
+
+class FBSchemaGenerator(sql.compiler.SchemaGenerator):
+    """Firebird syntactic idiosincrasies"""
+
+    def get_column_specification(self, column, **kwargs):
+        colspec = self.preparer.format_column(column)
+        colspec += " " + column.type.dialect_impl(self.dialect).get_col_spec()
+
+        default = self.get_column_default_string(column)
+        if default is not None:
+            colspec += " DEFAULT " + default
+
+        if not column.nullable or column.primary_key:
+            colspec += " NOT NULL"
+
+        return colspec
+
+    def visit_sequence(self, sequence):
+        """Generate a ``CREATE GENERATOR`` statement for the sequence."""
+
+        if not self.checkfirst or not self.dialect.has_sequence(self.connection, sequence.name):
+            self.append("CREATE GENERATOR %s" % self.preparer.format_sequence(sequence))
+            self.execute()
+
+
+class FBSchemaDropper(sql.compiler.SchemaDropper):
+    """Firebird syntactic idiosincrasies"""
+
+    def visit_sequence(self, sequence):
+        """Generate a ``DROP GENERATOR`` statement for the sequence."""
+
+        if not self.checkfirst or self.dialect.has_sequence(self.connection, sequence.name):
+            self.append("DROP GENERATOR %s" % self.preparer.format_sequence(sequence))
+            self.execute()
+
+
+class FBDefaultRunner(base.DefaultRunner):
+    """Firebird specific idiosincrasies"""
+
+    def visit_sequence(self, seq):
+        """Get the next value from the sequence using ``gen_id()``."""
+
+        return self.execute_string("SELECT gen_id(%s, 1) FROM rdb$database" % \
+            self.dialect.identifier_preparer.format_sequence(seq))
+
+
+RESERVED_WORDS = set(
+    ["action", "active", "add", "admin", "after", "all", "alter", "and", "any",
+     "as", "asc", "ascending", "at", "auto", "autoddl", "avg", "based", "basename",
+     "base_name", "before", "begin", "between", "bigint", "blob", "blobedit", "buffer",
+     "by", "cache", "cascade", "case", "cast", "char", "character", "character_length",
+     "char_length", "check", "check_point_len", "check_point_length", "close", "collate",
+     "collation", "column", "commit", "committed", "compiletime", "computed", "conditional",
+     "connect", "constraint", "containing", "continue", "count", "create", "cstring",
+     "current", "current_connection", "current_date", "current_role", "current_time",
+     "current_timestamp", "current_transaction", "current_user", "cursor", "database",
+     "date", "day", "db_key", "debug", "dec", "decimal", "declare", "default", "delete",
+     "desc", "descending", "describe", "descriptor", "disconnect", "display", "distinct",
+     "do", "domain", "double", "drop", "echo", "edit", "else", "end", "entry_point",
+     "escape", "event", "exception", "execute", "exists", "exit", "extern", "external",
+     "extract", "fetch", "file", "filter", "float", "for", "foreign", "found", "free_it",
+     "from", "full", "function", "gdscode", "generator", "gen_id", "global", "goto",
+     "grant", "group", "group_commit_", "group_commit_wait", "having", "help", "hour",
+     "if", "immediate", "in", "inactive", "index", "indicator", "init", "inner", "input",
+     "input_type", "insert", "int", "integer", "into", "is", "isolation", "isql", "join",
+     "key", "lc_messages", "lc_type", "left", "length", "lev", "level", "like", "logfile",
+     "log_buffer_size", "log_buf_size", "long", "manual", "max", "maximum", "maximum_segment",
+     "max_segment", "merge", "message", "min", "minimum", "minute", "module_name", "month",
+     "names", "national", "natural", "nchar", "no", "noauto", "not", "null", "numeric",
+     "num_log_buffers", "num_log_bufs", "octet_length", "of", "on", "only", "open", "option",
+     "or", "order", "outer", "output", "output_type", "overflow", "page", "pagelength",
+     "pages", "page_size", "parameter", "password", "plan", "position", "post_event",
+     "precision", "prepare", "primary", "privileges", "procedure", "protected", "public",
+     "quit", "raw_partitions", "rdb$db_key", "read", "real", "record_version", "recreate",
+     "references", "release", "release", "reserv", "reserving", "restrict", "retain",
+     "return", "returning_values", "returns", "revoke", "right", "role", "rollback",
+     "row_count", "runtime", "savepoint", "schema", "second", "segment", "select",
+     "set", "shadow", "shared", "shell", "show", "singular", "size", "smallint",
+     "snapshot", "some", "sort", "sqlcode", "sqlerror", "sqlwarning", "stability",
+     "starting", "starts", "statement", "static", "statistics", "sub_type", "sum",
+     "suspend", "table", "terminator", "then", "time", "timestamp", "to", "transaction",
+     "translate", "translation", "trigger", "trim", "type", "uncommitted", "union",
+     "unique", "update", "upper", "user", "using", "value", "values", "varchar",
+     "variable", "varying", "version", "view", "wait", "wait_time", "weekday", "when",
+     "whenever", "where", "while", "with", "work", "write", "year", "yearday" ])
+
+
+class FBIdentifierPreparer(sql.compiler.IdentifierPreparer):
+    """Install Firebird specific reserved words."""
+
+    reserved_words = RESERVED_WORDS
+
+    def __init__(self, dialect):
+        super(FBIdentifierPreparer, self).__init__(dialect, omit_schema=True)
+
+
+dialect = FBDialect
+dialect.statement_compiler = FBCompiler
+dialect.schemagenerator = FBSchemaGenerator
+dialect.schemadropper = FBSchemaDropper
+dialect.defaultrunner = FBDefaultRunner
+dialect.preparer = FBIdentifierPreparer
+dialect.execution_ctx_cls = FBExecutionContext
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/databases/postgres.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/databases/postgres.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/databases/postgres.py (revision 3)
@@ -0,0 +1,917 @@
+# postgres.py
+# Copyright (C) 2005, 2006, 2007, 2008, 2009 Michael Bayer mike_mp@zzzcomputing.com
+#
+# This module is part of SQLAlchemy and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+"""Support for the PostgreSQL database.
+
+Driver
+------
+
+The psycopg2 driver is supported, available at http://pypi.python.org/pypi/psycopg2/ .
+The dialect has several behaviors  which are specifically tailored towards compatibility 
+with this module.
+
+Note that psycopg1 is **not** supported.
+
+Connecting
+----------
+
+URLs are of the form `postgres://user:password@host:port/dbname[?key=value&key=value...]`.
+
+PostgreSQL-specific keyword arguments which are accepted by :func:`~sqlalchemy.create_engine()` are:
+
+* *server_side_cursors* - Enable the usage of "server side cursors" for SQL statements which support
+  this feature.  What this essentially means from a psycopg2 point of view is that the cursor is 
+  created using a name, e.g. `connection.cursor('some name')`, which has the effect that result rows
+  are not immediately pre-fetched and buffered after statement execution, but are instead left 
+  on the server and only retrieved as needed.    SQLAlchemy's :class:`~sqlalchemy.engine.base.ResultProxy`
+  uses special row-buffering behavior when this feature is enabled, such that groups of 100 rows 
+  at a time are fetched over the wire to reduce conversational overhead.
+
+Sequences/SERIAL
+----------------
+
+PostgreSQL supports sequences, and SQLAlchemy uses these as the default means of creating
+new primary key values for integer-based primary key columns.   When creating tables, 
+SQLAlchemy will issue the ``SERIAL`` datatype for integer-based primary key columns, 
+which generates a sequence corresponding to the column and associated with it based on
+a naming convention.
+
+To specify a specific named sequence to be used for primary key generation, use the
+:func:`~sqlalchemy.schema.Sequence` construct::
+
+    Table('sometable', metadata, 
+            Column('id', Integer, Sequence('some_id_seq'), primary_key=True)
+        )
+
+Currently, when SQLAlchemy issues a single insert statement, to fulfill the contract of
+having the "last insert identifier" available, the sequence is executed independently
+beforehand and the new value is retrieved, to be used in the subsequent insert.  Note
+that when an :func:`~sqlalchemy.sql.expression.insert()` construct is executed using 
+"executemany" semantics, the sequence is not pre-executed and normal PG SERIAL behavior
+is used.
+
+PostgreSQL 8.3 supports an ``INSERT...RETURNING`` syntax which SQLAlchemy supports 
+as well.  A future release of SQLA will use this feature by default in lieu of 
+sequence pre-execution in order to retrieve new primary key values, when available.
+
+INSERT/UPDATE...RETURNING
+-------------------------
+
+The dialect supports PG 8.3's ``INSERT..RETURNING`` and ``UPDATE..RETURNING`` syntaxes, 
+but must be explicitly enabled on a per-statement basis::
+
+    # INSERT..RETURNING
+    result = table.insert(postgres_returning=[table.c.col1, table.c.col2]).\\
+        values(name='foo')
+    print result.fetchall()
+    
+    # UPDATE..RETURNING
+    result = table.update(postgres_returning=[table.c.col1, table.c.col2]).\\
+        where(table.c.name=='foo').values(name='bar')
+    print result.fetchall()
+
+Indexes
+-------
+
+PostgreSQL supports partial indexes. To create them pass a postgres_where
+option to the Index constructor::
+
+  Index('my_index', my_table.c.id, postgres_where=tbl.c.value > 10)
+
+Transactions
+------------
+
+The PostgreSQL dialect fully supports SAVEPOINT and two-phase commit operations.
+
+
+"""
+
+import decimal, random, re, string
+
+from sqlalchemy import sql, schema, exc, util
+from sqlalchemy.engine import base, default
+from sqlalchemy.sql import compiler, expression
+from sqlalchemy.sql import operators as sql_operators
+from sqlalchemy import types as sqltypes
+
+
+class PGInet(sqltypes.TypeEngine):
+    def get_col_spec(self):
+        return "INET"
+
+class PGCidr(sqltypes.TypeEngine):
+    def get_col_spec(self):
+        return "CIDR"
+
+class PGMacAddr(sqltypes.TypeEngine):
+    def get_col_spec(self):
+        return "MACADDR"
+
+class PGNumeric(sqltypes.Numeric):
+    def get_col_spec(self):
+        if not self.precision:
+            return "NUMERIC"
+        else:
+            return "NUMERIC(%(precision)s, %(scale)s)" % {'precision': self.precision, 'scale' : self.scale}
+
+    def bind_processor(self, dialect):
+        return None
+
+    def result_processor(self, dialect):
+        if self.asdecimal:
+            return None
+        else:
+            def process(value):
+                if isinstance(value, decimal.Decimal):
+                    return float(value)
+                else:
+                    return value
+            return process
+
+class PGFloat(sqltypes.Float):
+    def get_col_spec(self):
+        if not self.precision:
+            return "FLOAT"
+        else:
+            return "FLOAT(%(precision)s)" % {'precision': self.precision}
+
+
+class PGInteger(sqltypes.Integer):
+    def get_col_spec(self):
+        return "INTEGER"
+
+class PGSmallInteger(sqltypes.Smallinteger):
+    def get_col_spec(self):
+        return "SMALLINT"
+
+class PGBigInteger(PGInteger):
+    def get_col_spec(self):
+        return "BIGINT"
+
+class PGDateTime(sqltypes.DateTime):
+    def get_col_spec(self):
+        return "TIMESTAMP " + (self.timezone and "WITH" or "WITHOUT") + " TIME ZONE"
+
+class PGDate(sqltypes.Date):
+    def get_col_spec(self):
+        return "DATE"
+
+class PGTime(sqltypes.Time):
+    def get_col_spec(self):
+        return "TIME " + (self.timezone and "WITH" or "WITHOUT") + " TIME ZONE"
+
+class PGInterval(sqltypes.TypeEngine):
+    def get_col_spec(self):
+        return "INTERVAL"
+
+class PGText(sqltypes.Text):
+    def get_col_spec(self):
+        return "TEXT"
+
+class PGString(sqltypes.String):
+    def get_col_spec(self):
+        if self.length:
+            return "VARCHAR(%(length)d)" % {'length' : self.length}
+        else:
+            return "VARCHAR"
+
+class PGChar(sqltypes.CHAR):
+    def get_col_spec(self):
+        if self.length:
+            return "CHAR(%(length)d)" % {'length' : self.length}
+        else:
+            return "CHAR"
+
+class PGBinary(sqltypes.Binary):
+    def get_col_spec(self):
+        return "BYTEA"
+
+class PGBoolean(sqltypes.Boolean):
+    def get_col_spec(self):
+        return "BOOLEAN"
+
+class PGBit(sqltypes.TypeEngine):
+    def get_col_spec(self):
+        return "BIT"
+        
+class PGUuid(sqltypes.TypeEngine):
+    def get_col_spec(self):
+        return "UUID"
+
+class PGDoublePrecision(sqltypes.Float):
+    def get_col_spec(self):
+        return "DOUBLE PRECISION"
+    
+class PGArray(sqltypes.MutableType, sqltypes.Concatenable, sqltypes.TypeEngine):
+    def __init__(self, item_type, mutable=True):
+        if isinstance(item_type, type):
+            item_type = item_type()
+        self.item_type = item_type
+        self.mutable = mutable
+
+    def copy_value(self, value):
+        if value is None:
+            return None
+        elif self.mutable:
+            return list(value)
+        else:
+            return value
+
+    def compare_values(self, x, y):
+        return x == y
+
+    def is_mutable(self):
+        return self.mutable
+
+    def dialect_impl(self, dialect, **kwargs):
+        impl = self.__class__.__new__(self.__class__)
+        impl.__dict__.update(self.__dict__)
+        impl.item_type = self.item_type.dialect_impl(dialect)
+        return impl
+
+    def bind_processor(self, dialect):
+        item_proc = self.item_type.bind_processor(dialect)
+        def process(value):
+            if value is None:
+                return value
+            def convert_item(item):
+                if isinstance(item, (list, tuple)):
+                    return [convert_item(child) for child in item]
+                else:
+                    if item_proc:
+                        return item_proc(item)
+                    else:
+                        return item
+            return [convert_item(item) for item in value]
+        return process
+
+    def result_processor(self, dialect):
+        item_proc = self.item_type.result_processor(dialect)
+        def process(value):
+            if value is None:
+                return value
+            def convert_item(item):
+                if isinstance(item, list):
+                    return [convert_item(child) for child in item]
+                else:
+                    if item_proc:
+                        return item_proc(item)
+                    else:
+                        return item
+            return [convert_item(item) for item in value]
+        return process
+    def get_col_spec(self):
+        return self.item_type.get_col_spec() + '[]'
+
+colspecs = {
+    sqltypes.Integer : PGInteger,
+    sqltypes.Smallinteger : PGSmallInteger,
+    sqltypes.Numeric : PGNumeric,
+    sqltypes.Float : PGFloat,
+    PGDoublePrecision : PGDoublePrecision,
+    sqltypes.DateTime : PGDateTime,
+    sqltypes.Date : PGDate,
+    sqltypes.Time : PGTime,
+    sqltypes.String : PGString,
+    sqltypes.Binary : PGBinary,
+    sqltypes.Boolean : PGBoolean,
+    sqltypes.Text : PGText,
+    sqltypes.CHAR: PGChar,
+}
+
+ischema_names = {
+    'integer' : PGInteger,
+    'bigint' : PGBigInteger,
+    'smallint' : PGSmallInteger,
+    'character varying' : PGString,
+    'character' : PGChar,
+    '"char"' : PGChar,
+    'name': PGChar,
+    'text' : PGText,
+    'numeric' : PGNumeric,
+    'float' : PGFloat,
+    'real' : PGFloat,
+    'inet': PGInet,
+    'cidr': PGCidr,
+    'uuid':PGUuid,
+    'bit':PGBit,
+    'macaddr': PGMacAddr,
+    'double precision' : PGDoublePrecision,
+    'timestamp' : PGDateTime,
+    'timestamp with time zone' : PGDateTime,
+    'timestamp without time zone' : PGDateTime,
+    'time with time zone' : PGTime,
+    'time without time zone' : PGTime,
+    'date' : PGDate,
+    'time': PGTime,
+    'bytea' : PGBinary,
+    'boolean' : PGBoolean,
+    'interval':PGInterval,
+    'interval year to month':PGInterval,
+    'interval day to second':PGInterval,
+}
+
+# TODO: filter out 'FOR UPDATE' statements
+SERVER_SIDE_CURSOR_RE = re.compile(
+    r'\s*SELECT',
+    re.I | re.UNICODE)
+
+class PGExecutionContext(default.DefaultExecutionContext):
+    def create_cursor(self):
+        # TODO: coverage for server side cursors + select.for_update()
+        is_server_side = \
+            self.dialect.server_side_cursors and \
+            ((self.compiled and isinstance(self.compiled.statement, expression.Selectable) 
+                and not getattr(self.compiled.statement, 'for_update', False)) \
+            or \
+            (
+                (not self.compiled or isinstance(self.compiled.statement, expression._TextClause)) 
+                and self.statement and SERVER_SIDE_CURSOR_RE.match(self.statement))
+            )
+
+        self.__is_server_side = is_server_side
+        if is_server_side:
+            # use server-side cursors:
+            # http://lists.initd.org/pipermail/psycopg/2007-January/005251.html
+            ident = "c_%s_%s" % (hex(id(self))[2:], hex(random.randint(0, 65535))[2:])
+            return self._connection.connection.cursor(ident)
+        else:
+            return self._connection.connection.cursor()
+    
+    def get_result_proxy(self):
+        if self.__is_server_side:
+            return base.BufferedRowResultProxy(self)
+        else:
+            return base.ResultProxy(self)
+
+class PGDialect(default.DefaultDialect):
+    name = 'postgres'
+    supports_alter = True
+    supports_unicode_statements = False
+    max_identifier_length = 63
+    supports_sane_rowcount = True
+    supports_sane_multi_rowcount = False
+    preexecute_pk_sequences = True
+    supports_pk_autoincrement = False
+    default_paramstyle = 'pyformat'
+    supports_default_values = True
+    supports_empty_insert = False
+    
+    def __init__(self, server_side_cursors=False, **kwargs):
+        default.DefaultDialect.__init__(self, **kwargs)
+        self.server_side_cursors = server_side_cursors
+
+    def dbapi(cls):
+        import psycopg2 as psycopg
+        return psycopg
+    dbapi = classmethod(dbapi)
+
+    def create_connect_args(self, url):
+        opts = url.translate_connect_args(username='user')
+        if 'port' in opts:
+            opts['port'] = int(opts['port'])
+        opts.update(url.query)
+        return ([], opts)
+
+    def type_descriptor(self, typeobj):
+        return sqltypes.adapt_type(typeobj, colspecs)
+
+    def do_begin_twophase(self, connection, xid):
+        self.do_begin(connection.connection)
+
+    def do_prepare_twophase(self, connection, xid):
+        connection.execute(sql.text("PREPARE TRANSACTION :tid", bindparams=[sql.bindparam('tid', xid)]))
+
+    def do_rollback_twophase(self, connection, xid, is_prepared=True, recover=False):
+        if is_prepared:
+            if recover:
+                #FIXME: ugly hack to get out of transaction context when commiting recoverable transactions
+                # Must find out a way how to make the dbapi not open a transaction.
+                connection.execute(sql.text("ROLLBACK"))
+            connection.execute(sql.text("ROLLBACK PREPARED :tid", bindparams=[sql.bindparam('tid', xid)]))
+            connection.execute(sql.text("BEGIN"))
+            self.do_rollback(connection.connection)
+        else:
+            self.do_rollback(connection.connection)
+
+    def do_commit_twophase(self, connection, xid, is_prepared=True, recover=False):
+        if is_prepared:
+            if recover:
+                connection.execute(sql.text("ROLLBACK"))
+            connection.execute(sql.text("COMMIT PREPARED :tid", bindparams=[sql.bindparam('tid', xid)]))
+            connection.execute(sql.text("BEGIN"))
+            self.do_rollback(connection.connection)
+        else:
+            self.do_commit(connection.connection)
+
+    def do_recover_twophase(self, connection):
+        resultset = connection.execute(sql.text("SELECT gid FROM pg_prepared_xacts"))
+        return [row[0] for row in resultset]
+
+    def get_default_schema_name(self, connection):
+        return connection.scalar("select current_schema()", None)
+    get_default_schema_name = base.connection_memoize(
+        ('dialect', 'default_schema_name'))(get_default_schema_name)
+
+    def last_inserted_ids(self):
+        if self.context.last_inserted_ids is None:
+            raise exc.InvalidRequestError("no INSERT executed, or can't use cursor.lastrowid without PostgreSQL OIDs enabled")
+        else:
+            return self.context.last_inserted_ids
+
+    def has_table(self, connection, table_name, schema=None):
+        # seems like case gets folded in pg_class...
+        if schema is None:
+            cursor = connection.execute("""select relname from pg_class c join pg_namespace n on n.oid=c.relnamespace where n.nspname=current_schema() and lower(relname)=%(name)s""", {'name':table_name.lower().encode(self.encoding)});
+        else:
+            cursor = connection.execute("""select relname from pg_class c join pg_namespace n on n.oid=c.relnamespace where n.nspname=%(schema)s and lower(relname)=%(name)s""", {'name':table_name.lower().encode(self.encoding), 'schema':schema});
+        try:
+            return bool(cursor.fetchone())
+        finally:
+            cursor.close()
+
+    def has_sequence(self, connection, sequence_name, schema=None):
+        if schema is None:
+            cursor = connection.execute(
+                        sql.text("SELECT relname FROM pg_class c join pg_namespace n on "
+                            "n.oid=c.relnamespace where relkind='S' and n.nspname=current_schema() and lower(relname)=:name",
+                            bindparams=[sql.bindparam('name', unicode(sequence_name.lower()), type_=sqltypes.Unicode)] 
+                        )
+                    )
+        else:
+            cursor = connection.execute(
+                        sql.text("SELECT relname FROM pg_class c join pg_namespace n on "
+                            "n.oid=c.relnamespace where relkind='S' and n.nspname=:schema and lower(relname)=:name",
+                            bindparams=[sql.bindparam('name', unicode(sequence_name.lower()), type_=sqltypes.Unicode),
+                                sql.bindparam('schema', unicode(schema), type_=sqltypes.Unicode)] 
+                        )
+                    )
+        
+        try:
+            return bool(cursor.fetchone())
+        finally:
+            cursor.close()
+
+    def is_disconnect(self, e):
+        if isinstance(e, self.dbapi.OperationalError):
+            return 'closed the connection' in str(e) or 'connection not open' in str(e)
+        elif isinstance(e, self.dbapi.InterfaceError):
+            return 'connection already closed' in str(e) or 'cursor already closed' in str(e)
+        elif isinstance(e, self.dbapi.ProgrammingError):
+            # yes, it really says "losed", not "closed"
+            return "losed the connection unexpectedly" in str(e)
+        else:
+            return False
+
+    def table_names(self, connection, schema):
+        s = """
+        SELECT relname
+        FROM pg_class c
+        WHERE relkind = 'r'
+          AND '%(schema)s' = (select nspname from pg_namespace n where n.oid = c.relnamespace)
+        """ % locals()
+        return [row[0].decode(self.encoding) for row in connection.execute(s)]
+
+    def server_version_info(self, connection):
+        v = connection.execute("select version()").scalar()
+        m = re.match('PostgreSQL (\d+)\.(\d+)\.(\d+)', v)
+        if not m:
+            raise AssertionError("Could not determine version from string '%s'" % v)
+        return tuple([int(x) for x in m.group(1, 2, 3)])
+
+    def reflecttable(self, connection, table, include_columns):
+        preparer = self.identifier_preparer
+        if table.schema is not None:
+            schema_where_clause = "n.nspname = :schema"
+            schemaname = table.schema
+            if isinstance(schemaname, str):
+                schemaname = schemaname.decode(self.encoding)
+        else:
+            schema_where_clause = "pg_catalog.pg_table_is_visible(c.oid)"
+            schemaname = None
+
+        SQL_COLS = """
+            SELECT a.attname,
+              pg_catalog.format_type(a.atttypid, a.atttypmod),
+              (SELECT substring(d.adsrc for 128) FROM pg_catalog.pg_attrdef d
+               WHERE d.adrelid = a.attrelid AND d.adnum = a.attnum AND a.atthasdef)
+              AS DEFAULT,
+              a.attnotnull, a.attnum, a.attrelid as table_oid
+            FROM pg_catalog.pg_attribute a
+            WHERE a.attrelid = (
+                SELECT c.oid
+                FROM pg_catalog.pg_class c
+                     LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
+                     WHERE (%s)
+                     AND c.relname = :table_name AND c.relkind in ('r','v')
+            ) AND a.attnum > 0 AND NOT a.attisdropped
+            ORDER BY a.attnum
+        """ % schema_where_clause
+
+        s = sql.text(SQL_COLS, bindparams=[sql.bindparam('table_name', type_=sqltypes.Unicode), sql.bindparam('schema', type_=sqltypes.Unicode)], typemap={'attname':sqltypes.Unicode, 'default':sqltypes.Unicode})
+        tablename = table.name
+        if isinstance(tablename, str):
+            tablename = tablename.decode(self.encoding)
+        c = connection.execute(s, table_name=tablename, schema=schemaname)
+        rows = c.fetchall()
+
+        if not rows:
+            raise exc.NoSuchTableError(table.name)
+
+        domains = self._load_domains(connection)
+
+        for name, format_type, default, notnull, attnum, table_oid in rows:
+            if include_columns and name not in include_columns:
+                continue
+
+            ## strip (30) from character varying(30)
+            attype = re.search('([^\([]+)', format_type).group(1)
+            nullable = not notnull
+            is_array = format_type.endswith('[]')
+
+            try:
+                charlen = re.search('\(([\d,]+)\)', format_type).group(1)
+            except:
+                charlen = False
+
+            numericprec = False
+            numericscale = False
+            if attype == 'numeric':
+                if charlen is False:
+                    numericprec, numericscale = (None, None)
+                else:
+                    numericprec, numericscale = charlen.split(',')
+                charlen = False
+            elif attype == 'double precision':
+                numericprec, numericscale = (True, False)
+                charlen = False
+            elif attype == 'integer':
+                numericprec, numericscale = (32, 0)
+                charlen = False
+
+            args = []
+            for a in (charlen, numericprec, numericscale):
+                if a is None:
+                    args.append(None)
+                elif a is not False:
+                    args.append(int(a))
+
+            kwargs = {}
+            if attype == 'timestamp with time zone':
+                kwargs['timezone'] = True
+            elif attype == 'timestamp without time zone':
+                kwargs['timezone'] = False
+
+            coltype = None
+            if attype in ischema_names:
+                coltype = ischema_names[attype]
+            else:
+                if attype in domains:
+                    domain = domains[attype]
+                    if domain['attype'] in ischema_names:
+                        # A table can't override whether the domain is nullable.
+                        nullable = domain['nullable']
+
+                        if domain['default'] and not default:
+                            # It can, however, override the default value, but can't set it to null.
+                            default = domain['default']
+                        coltype = ischema_names[domain['attype']]
+
+            if coltype:
+                coltype = coltype(*args, **kwargs)
+                if is_array:
+                    coltype = PGArray(coltype)
+            else:
+                util.warn("Did not recognize type '%s' of column '%s'" %
+                          (attype, name))
+                coltype = sqltypes.NULLTYPE
+
+            colargs = []
+            if default is not None:
+                match = re.search(r"""(nextval\(')([^']+)('.*$)""", default)
+                if match is not None:
+                    # the default is related to a Sequence
+                    sch = table.schema
+                    if '.' not in match.group(2) and sch is not None:
+                        # unconditionally quote the schema name.  this could
+                        # later be enhanced to obey quoting rules / "quote schema"
+                        default = match.group(1) + ('"%s"' % sch) + '.' + match.group(2) + match.group(3)
+                colargs.append(schema.DefaultClause(sql.text(default)))
+            table.append_column(schema.Column(name, coltype, nullable=nullable, *colargs))
+
+
+        # Primary keys
+        PK_SQL = """
+          SELECT attname FROM pg_attribute
+          WHERE attrelid = (
+             SELECT indexrelid FROM pg_index i
+             WHERE i.indrelid = :table
+             AND i.indisprimary = 't')
+          ORDER BY attnum
+        """
+        t = sql.text(PK_SQL, typemap={'attname':sqltypes.Unicode})
+        c = connection.execute(t, table=table_oid)
+        for row in c.fetchall():
+            pk = row[0]
+            if pk in table.c:
+                col = table.c[pk]
+                table.primary_key.add(col)
+                if col.default is None:
+                    col.autoincrement = False
+
+        # Foreign keys
+        FK_SQL = """
+          SELECT conname, pg_catalog.pg_get_constraintdef(oid, true) as condef
+          FROM  pg_catalog.pg_constraint r
+          WHERE r.conrelid = :table AND r.contype = 'f'
+          ORDER BY 1
+        """
+
+        t = sql.text(FK_SQL, typemap={'conname':sqltypes.Unicode, 'condef':sqltypes.Unicode})
+        c = connection.execute(t, table=table_oid)
+        for conname, condef in c.fetchall():
+            m = re.search('FOREIGN KEY \((.*?)\) REFERENCES (?:(.*?)\.)?(.*?)\((.*?)\)', condef).groups()
+            (constrained_columns, referred_schema, referred_table, referred_columns) = m
+            constrained_columns = [preparer._unquote_identifier(x) for x in re.split(r'\s*,\s*', constrained_columns)]
+            if referred_schema:
+                referred_schema = preparer._unquote_identifier(referred_schema)
+            elif table.schema is not None and table.schema == self.get_default_schema_name(connection):
+                # no schema (i.e. its the default schema), and the table we're
+                # reflecting has the default schema explicit, then use that.
+                # i.e. try to use the user's conventions
+                referred_schema = table.schema
+            referred_table = preparer._unquote_identifier(referred_table)
+            referred_columns = [preparer._unquote_identifier(x) for x in re.split(r'\s*,\s', referred_columns)]
+
+            refspec = []
+            if referred_schema is not None:
+                schema.Table(referred_table, table.metadata, autoload=True, schema=referred_schema,
+                            autoload_with=connection)
+                for column in referred_columns:
+                    refspec.append(".".join([referred_schema, referred_table, column]))
+            else:
+                schema.Table(referred_table, table.metadata, autoload=True, autoload_with=connection)
+                for column in referred_columns:
+                    refspec.append(".".join([referred_table, column]))
+
+            table.append_constraint(schema.ForeignKeyConstraint(constrained_columns, refspec, conname, link_to_name=True))
+
+        # Indexes 
+        IDX_SQL = """
+          SELECT c.relname, i.indisunique, i.indexprs, i.indpred,
+            a.attname
+          FROM pg_index i, pg_class c, pg_attribute a
+          WHERE i.indrelid = :table AND i.indexrelid = c.oid
+            AND a.attrelid = i.indexrelid AND i.indisprimary = 'f'
+          ORDER BY c.relname, a.attnum
+        """
+        t = sql.text(IDX_SQL, typemap={'attname':sqltypes.Unicode})
+        c = connection.execute(t, table=table_oid)
+        indexes = {}
+        sv_idx_name = None
+        for row in c.fetchall():
+            idx_name, unique, expr, prd, col = row
+
+            if expr:
+                if not idx_name == sv_idx_name:
+                    util.warn(
+                      "Skipped unsupported reflection of expression-based index %s"
+                      % idx_name)
+                sv_idx_name = idx_name
+                continue
+            if prd and not idx_name == sv_idx_name:
+                util.warn(
+                   "Predicate of partial index %s ignored during reflection"
+                   % idx_name)
+                sv_idx_name = idx_name
+
+            if not indexes.has_key(idx_name):
+                indexes[idx_name] = [unique, []]
+            indexes[idx_name][1].append(col)
+
+        for name, (unique, columns) in indexes.items():
+            schema.Index(name, *[table.columns[c] for c in columns], 
+                         **dict(unique=unique))
+ 
+
+
+    def _load_domains(self, connection):
+        ## Load data types for domains:
+        SQL_DOMAINS = """
+            SELECT t.typname as "name",
+                   pg_catalog.format_type(t.typbasetype, t.typtypmod) as "attype",
+                   not t.typnotnull as "nullable",
+                   t.typdefault as "default",
+                   pg_catalog.pg_type_is_visible(t.oid) as "visible",
+                   n.nspname as "schema"
+            FROM pg_catalog.pg_type t
+                 LEFT JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace
+                 LEFT JOIN pg_catalog.pg_constraint r ON t.oid = r.contypid
+            WHERE t.typtype = 'd'
+        """
+
+        s = sql.text(SQL_DOMAINS, typemap={'attname':sqltypes.Unicode})
+        c = connection.execute(s)
+
+        domains = {}
+        for domain in c.fetchall():
+            ## strip (30) from character varying(30)
+            attype = re.search('([^\(]+)', domain['attype']).group(1)
+            if domain['visible']:
+                # 'visible' just means whether or not the domain is in a
+                # schema that's on the search path -- or not overriden by
+                # a schema with higher presedence. If it's not visible,
+                # it will be prefixed with the schema-name when it's used.
+                name = domain['name']
+            else:
+                name = "%s.%s" % (domain['schema'], domain['name'])
+
+            domains[name] = {'attype':attype, 'nullable': domain['nullable'], 'default': domain['default']}
+
+        return domains
+
+
+class PGCompiler(compiler.DefaultCompiler):
+    operators = compiler.DefaultCompiler.operators.copy()
+    operators.update(
+        {
+            sql_operators.mod : '%%',
+            sql_operators.ilike_op: lambda x, y, escape=None: '%s ILIKE %s' % (x, y) + (escape and ' ESCAPE \'%s\'' % escape or ''),
+            sql_operators.notilike_op: lambda x, y, escape=None: '%s NOT ILIKE %s' % (x, y) + (escape and ' ESCAPE \'%s\'' % escape or ''),
+            sql_operators.match_op: lambda x, y: '%s @@ to_tsquery(%s)' % (x, y),
+        }
+    )
+
+    functions = compiler.DefaultCompiler.functions.copy()
+    functions.update (
+        {
+            'TIMESTAMP':util.deprecated(message="Use a literal string 'timestamp <value>' instead")(lambda x:'TIMESTAMP %s' % x),
+        }
+    )
+
+    def visit_sequence(self, seq):
+        if seq.optional:
+            return None
+        else:
+            return "nextval('%s')" % self.preparer.format_sequence(seq)
+
+    def post_process_text(self, text):
+        if '%%' in text:
+            util.warn("The SQLAlchemy psycopg2 dialect now automatically escapes '%' in text() expressions to '%%'.")
+        return text.replace('%', '%%')
+
+    def limit_clause(self, select):
+        text = ""
+        if select._limit is not None:
+            text +=  " \n LIMIT " + str(select._limit)
+        if select._offset is not None:
+            if select._limit is None:
+                text += " \n LIMIT ALL"
+            text += " OFFSET " + str(select._offset)
+        return text
+
+    def get_select_precolumns(self, select):
+        if select._distinct:
+            if isinstance(select._distinct, bool):
+                return "DISTINCT "
+            elif isinstance(select._distinct, (list, tuple)):
+                return "DISTINCT ON (" + ', '.join(
+                    [(isinstance(col, basestring) and col or self.process(col)) for col in select._distinct]
+                )+ ") "
+            else:
+                return "DISTINCT ON (" + unicode(select._distinct) + ") "
+        else:
+            return ""
+
+    def for_update_clause(self, select):
+        if select.for_update == 'nowait':
+            return " FOR UPDATE NOWAIT"
+        else:
+            return super(PGCompiler, self).for_update_clause(select)
+
+    def _append_returning(self, text, stmt):
+        returning_cols = stmt.kwargs['postgres_returning']
+        def flatten_columnlist(collist):
+            for c in collist:
+                if isinstance(c, expression.Selectable):
+                    for co in c.columns:
+                        yield co
+                else:
+                    yield c
+        columns = [self.process(c, within_columns_clause=True) for c in flatten_columnlist(returning_cols)]
+        text += ' RETURNING ' + string.join(columns, ', ')
+        return text
+
+    def visit_update(self, update_stmt):
+        text = super(PGCompiler, self).visit_update(update_stmt)
+        if 'postgres_returning' in update_stmt.kwargs:
+            return self._append_returning(text, update_stmt)
+        else:
+            return text
+
+    def visit_insert(self, insert_stmt):
+        text = super(PGCompiler, self).visit_insert(insert_stmt)
+        if 'postgres_returning' in insert_stmt.kwargs:
+            return self._append_returning(text, insert_stmt)
+        else:
+            return text
+
+    def visit_extract(self, extract, **kwargs):
+        field = self.extract_map.get(extract.field, extract.field)
+        return "EXTRACT(%s FROM %s::timestamp)" % (
+            field, self.process(extract.expr))
+
+
+class PGSchemaGenerator(compiler.SchemaGenerator):
+    def get_column_specification(self, column, **kwargs):
+        colspec = self.preparer.format_column(column)
+        if column.primary_key and len(column.foreign_keys)==0 and column.autoincrement and isinstance(column.type, sqltypes.Integer) and not isinstance(column.type, sqltypes.SmallInteger) and (column.default is None or (isinstance(column.default, schema.Sequence) and column.default.optional)):
+            if isinstance(column.type, PGBigInteger):
+                colspec += " BIGSERIAL"
+            else:
+                colspec += " SERIAL"
+        else:
+            colspec += " " + column.type.dialect_impl(self.dialect).get_col_spec()
+            default = self.get_column_default_string(column)
+            if default is not None:
+                colspec += " DEFAULT " + default
+
+        if not column.nullable:
+            colspec += " NOT NULL"
+        return colspec
+
+    def visit_sequence(self, sequence):
+        if not sequence.optional and (not self.checkfirst or not self.dialect.has_sequence(self.connection, sequence.name, schema=sequence.schema)):
+            self.append("CREATE SEQUENCE %s" % self.preparer.format_sequence(sequence))
+            self.execute()
+
+    def visit_index(self, index):
+        preparer = self.preparer
+        self.append("CREATE ")
+        if index.unique:
+            self.append("UNIQUE ")
+        self.append("INDEX %s ON %s (%s)" \
+                    % (preparer.quote(self._validate_identifier(index.name, True), index.quote),
+                       preparer.format_table(index.table),
+                       string.join([preparer.format_column(c) for c in index.columns], ', ')))
+        whereclause = index.kwargs.get('postgres_where', None)
+        if whereclause is not None:
+            compiler = self._compile(whereclause, None)
+            # this might belong to the compiler class
+            inlined_clause = str(compiler) % dict(
+                [(key,bind.value) for key,bind in compiler.binds.iteritems()])
+            self.append(" WHERE " + inlined_clause)
+        self.execute()
+
+class PGSchemaDropper(compiler.SchemaDropper):
+    def visit_sequence(self, sequence):
+        if not sequence.optional and (not self.checkfirst or self.dialect.has_sequence(self.connection, sequence.name, schema=sequence.schema)):
+            self.append("DROP SEQUENCE %s" % self.preparer.format_sequence(sequence))
+            self.execute()
+
+class PGDefaultRunner(base.DefaultRunner):
+    def __init__(self, context):
+        base.DefaultRunner.__init__(self, context)
+        # craete cursor which won't conflict with a server-side cursor
+        self.cursor = context._connection.connection.cursor()
+    
+    def get_column_default(self, column, isinsert=True):
+        if column.primary_key:
+            # pre-execute passive defaults on primary keys
+            if (isinstance(column.server_default, schema.DefaultClause) and
+                column.server_default.arg is not None):
+                return self.execute_string("select %s" % column.server_default.arg)
+            elif (isinstance(column.type, sqltypes.Integer) and column.autoincrement) and (column.default is None or (isinstance(column.default, schema.Sequence) and column.default.optional)):
+                sch = column.table.schema
+                # TODO: this has to build into the Sequence object so we can get the quoting
+                # logic from it
+                if sch is not None:
+                    exc = "select nextval('\"%s\".\"%s_%s_seq\"')" % (sch, column.table.name, column.name)
+                else:
+                    exc = "select nextval('\"%s_%s_seq\"')" % (column.table.name, column.name)
+                return self.execute_string(exc.encode(self.dialect.encoding))
+
+        return super(PGDefaultRunner, self).get_column_default(column)
+
+    def visit_sequence(self, seq):
+        if not seq.optional:
+            return self.execute_string(("select nextval('%s')" % self.dialect.identifier_preparer.format_sequence(seq)))
+        else:
+            return None
+
+class PGIdentifierPreparer(compiler.IdentifierPreparer):
+    def _unquote_identifier(self, value):
+        if value[0] == self.initial_quote:
+            value = value[1:-1].replace('""','"')
+        return value
+
+dialect = PGDialect
+dialect.statement_compiler = PGCompiler
+dialect.schemagenerator = PGSchemaGenerator
+dialect.schemadropper = PGSchemaDropper
+dialect.preparer = PGIdentifierPreparer
+dialect.defaultrunner = PGDefaultRunner
+dialect.execution_ctx_cls = PGExecutionContext
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/databases/sybase.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/databases/sybase.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/databases/sybase.py (revision 3)
@@ -0,0 +1,875 @@
+# sybase.py
+# Copyright (C) 2007 Fisch Asset Management AG http://www.fam.ch
+# Coding: Alexander Houben alexander.houben@thor-solutions.ch
+#
+# This module is part of SQLAlchemy and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+"""
+Sybase database backend.
+
+Known issues / TODO:
+
+ * Uses the mx.ODBC driver from egenix (version 2.1.0)
+ * The current version of sqlalchemy.databases.sybase only supports
+   mx.ODBC.Windows (other platforms such as mx.ODBC.unixODBC still need
+   some development)
+ * Support for pyodbc has been built in but is not yet complete (needs
+   further development)
+ * Results of running tests/alltests.py:
+     Ran 934 tests in 287.032s
+     FAILED (failures=3, errors=1)
+ * Tested on 'Adaptive Server Anywhere 9' (version 9.0.1.1751)
+"""
+
+import datetime, operator
+
+from sqlalchemy import util, sql, schema, exc
+from sqlalchemy.sql import compiler, expression
+from sqlalchemy.engine import default, base
+from sqlalchemy import types as sqltypes
+from sqlalchemy.sql import operators as sql_operators
+from sqlalchemy import MetaData, Table, Column
+from sqlalchemy import String, Integer, SMALLINT, CHAR, ForeignKey
+
+
+__all__ = [
+    'SybaseTypeError'
+    'SybaseNumeric', 'SybaseFloat', 'SybaseInteger', 'SybaseBigInteger',
+    'SybaseTinyInteger', 'SybaseSmallInteger',
+    'SybaseDateTime_mxodbc', 'SybaseDateTime_pyodbc',
+    'SybaseDate_mxodbc', 'SybaseDate_pyodbc',
+    'SybaseTime_mxodbc', 'SybaseTime_pyodbc',
+    'SybaseText', 'SybaseString', 'SybaseChar', 'SybaseBinary',
+    'SybaseBoolean', 'SybaseTimeStamp', 'SybaseMoney', 'SybaseSmallMoney',
+    'SybaseUniqueIdentifier',
+    ]
+
+
+RESERVED_WORDS = set([
+    "add", "all", "alter", "and",
+    "any", "as", "asc", "backup",
+    "begin", "between", "bigint", "binary",
+    "bit", "bottom", "break", "by",
+    "call", "capability", "cascade", "case",
+    "cast", "char", "char_convert", "character",
+    "check", "checkpoint", "close", "comment",
+    "commit", "connect", "constraint", "contains",
+    "continue", "convert", "create", "cross",
+    "cube", "current", "current_timestamp", "current_user",
+    "cursor", "date", "dbspace", "deallocate",
+    "dec", "decimal", "declare", "default",
+    "delete", "deleting", "desc", "distinct",
+    "do", "double", "drop", "dynamic",
+    "else", "elseif", "encrypted", "end",
+    "endif", "escape", "except", "exception",
+    "exec", "execute", "existing", "exists",
+    "externlogin", "fetch", "first", "float",
+    "for", "force", "foreign", "forward",
+    "from", "full", "goto", "grant",
+    "group", "having", "holdlock", "identified",
+    "if", "in", "index", "index_lparen",
+    "inner", "inout", "insensitive", "insert",
+    "inserting", "install", "instead", "int",
+    "integer", "integrated", "intersect", "into",
+    "iq", "is", "isolation", "join",
+    "key", "lateral", "left", "like",
+    "lock", "login", "long", "match",
+    "membership", "message", "mode", "modify",
+    "natural", "new", "no", "noholdlock",
+    "not", "notify", "null", "numeric",
+    "of", "off", "on", "open",
+    "option", "options", "or", "order",
+    "others", "out", "outer", "over",
+    "passthrough", "precision", "prepare", "primary",
+    "print", "privileges", "proc", "procedure",
+    "publication", "raiserror", "readtext", "real",
+    "reference", "references", "release", "remote",
+    "remove", "rename", "reorganize", "resource",
+    "restore", "restrict", "return", "revoke",
+    "right", "rollback", "rollup", "save",
+    "savepoint", "scroll", "select", "sensitive",
+    "session", "set", "setuser", "share",
+    "smallint", "some", "sqlcode", "sqlstate",
+    "start", "stop", "subtrans", "subtransaction",
+    "synchronize", "syntax_error", "table", "temporary",
+    "then", "time", "timestamp", "tinyint",
+    "to", "top", "tran", "trigger",
+    "truncate", "tsequal", "unbounded", "union",
+    "unique", "unknown", "unsigned", "update",
+    "updating", "user", "using", "validate",
+    "values", "varbinary", "varchar", "variable",
+    "varying", "view", "wait", "waitfor",
+    "when", "where", "while", "window",
+    "with", "with_cube", "with_lparen", "with_rollup",
+    "within", "work", "writetext",
+    ])
+
+ischema = MetaData()
+
+tables = Table("SYSTABLE", ischema,
+    Column("table_id", Integer, primary_key=True),
+    Column("file_id", SMALLINT),
+    Column("table_name", CHAR(128)),
+    Column("table_type", CHAR(10)),
+    Column("creator", Integer),
+    #schema="information_schema"
+    )
+
+domains = Table("SYSDOMAIN", ischema,
+    Column("domain_id", Integer, primary_key=True),
+    Column("domain_name", CHAR(128)),
+    Column("type_id", SMALLINT),
+    Column("precision", SMALLINT, quote=True),
+    #schema="information_schema"
+    )
+
+columns = Table("SYSCOLUMN", ischema,
+    Column("column_id", Integer, primary_key=True),
+    Column("table_id", Integer, ForeignKey(tables.c.table_id)),
+    Column("pkey", CHAR(1)),
+    Column("column_name", CHAR(128)),
+    Column("nulls", CHAR(1)),
+    Column("width", SMALLINT),
+    Column("domain_id", SMALLINT, ForeignKey(domains.c.domain_id)),
+    # FIXME: should be mx.BIGINT
+    Column("max_identity", Integer),
+    # FIXME: should be mx.ODBC.Windows.LONGVARCHAR
+    Column("default", String),
+    Column("scale", Integer),
+    #schema="information_schema"
+    )
+
+foreignkeys = Table("SYSFOREIGNKEY", ischema,
+    Column("foreign_table_id", Integer, ForeignKey(tables.c.table_id), primary_key=True),
+    Column("foreign_key_id", SMALLINT, primary_key=True),
+    Column("primary_table_id", Integer, ForeignKey(tables.c.table_id)),
+    #schema="information_schema"
+    )
+fkcols = Table("SYSFKCOL", ischema,
+    Column("foreign_table_id", Integer, ForeignKey(columns.c.table_id), primary_key=True),
+    Column("foreign_key_id", SMALLINT, ForeignKey(foreignkeys.c.foreign_key_id), primary_key=True),
+    Column("foreign_column_id", Integer, ForeignKey(columns.c.column_id), primary_key=True),
+    Column("primary_column_id", Integer),
+    #schema="information_schema"
+    )
+
+class SybaseTypeError(sqltypes.TypeEngine):
+    def result_processor(self, dialect):
+        return None
+
+    def bind_processor(self, dialect):
+        def process(value):
+            raise exc.InvalidRequestError("Data type not supported", [value])
+        return process
+
+    def get_col_spec(self):
+        raise exc.CompileError("Data type not supported")
+
+class SybaseNumeric(sqltypes.Numeric):
+    def get_col_spec(self):
+        if self.scale is None:
+            if self.precision is None:
+                return "NUMERIC"
+            else:
+                return "NUMERIC(%(precision)s)" % {'precision' : self.precision}
+        else:
+            return "NUMERIC(%(precision)s, %(scale)s)" % {'precision': self.precision, 'scale' : self.scale}
+
+class SybaseFloat(sqltypes.FLOAT, SybaseNumeric):
+    def __init__(self, precision = 10, asdecimal = False, scale = 2, **kwargs):
+        super(sqltypes.FLOAT, self).__init__(precision, asdecimal, **kwargs)
+        self.scale = scale
+
+    def get_col_spec(self):
+        # if asdecimal is True, handle same way as SybaseNumeric
+        if self.asdecimal:
+            return SybaseNumeric.get_col_spec(self)
+        if self.precision is None:
+            return "FLOAT"
+        else:
+            return "FLOAT(%(precision)s)" % {'precision': self.precision}
+
+    def result_processor(self, dialect):
+        def process(value):
+            if value is None:
+                return None
+            return float(value)
+        if self.asdecimal:
+            return SybaseNumeric.result_processor(self, dialect)
+        return process
+
+class SybaseInteger(sqltypes.Integer):
+    def get_col_spec(self):
+        return "INTEGER"
+
+class SybaseBigInteger(SybaseInteger):
+    def get_col_spec(self):
+        return "BIGINT"
+
+class SybaseTinyInteger(SybaseInteger):
+    def get_col_spec(self):
+        return "TINYINT"
+
+class SybaseSmallInteger(SybaseInteger):
+    def get_col_spec(self):
+        return "SMALLINT"
+
+class SybaseDateTime_mxodbc(sqltypes.DateTime):
+    def __init__(self, *a, **kw):
+        super(SybaseDateTime_mxodbc, self).__init__(False)
+
+    def get_col_spec(self):
+        return "DATETIME"
+
+class SybaseDateTime_pyodbc(sqltypes.DateTime):
+    def __init__(self, *a, **kw):
+        super(SybaseDateTime_pyodbc, self).__init__(False)
+
+    def get_col_spec(self):
+        return "DATETIME"
+
+    def result_processor(self, dialect):
+        def process(value):
+            if value is None:
+                return None
+            # Convert the datetime.datetime back to datetime.time
+            return value
+        return process
+
+    def bind_processor(self, dialect):
+        def process(value):
+            if value is None:
+                return None
+            return value
+        return process
+
+class SybaseDate_mxodbc(sqltypes.Date):
+    def __init__(self, *a, **kw):
+        super(SybaseDate_mxodbc, self).__init__(False)
+
+    def get_col_spec(self):
+        return "DATE"
+
+class SybaseDate_pyodbc(sqltypes.Date):
+    def __init__(self, *a, **kw):
+        super(SybaseDate_pyodbc, self).__init__(False)
+
+    def get_col_spec(self):
+        return "DATE"
+
+class SybaseTime_mxodbc(sqltypes.Time):
+    def __init__(self, *a, **kw):
+        super(SybaseTime_mxodbc, self).__init__(False)
+
+    def get_col_spec(self):
+        return "DATETIME"
+
+    def result_processor(self, dialect):
+        def process(value):
+            if value is None:
+                return None
+            # Convert the datetime.datetime back to datetime.time
+            return datetime.time(value.hour, value.minute, value.second, value.microsecond)
+        return process
+
+class SybaseTime_pyodbc(sqltypes.Time):
+    def __init__(self, *a, **kw):
+        super(SybaseTime_pyodbc, self).__init__(False)
+
+    def get_col_spec(self):
+        return "DATETIME"
+
+    def result_processor(self, dialect):
+        def process(value):
+            if value is None:
+                return None
+            # Convert the datetime.datetime back to datetime.time
+            return datetime.time(value.hour, value.minute, value.second, value.microsecond)
+        return process
+
+    def bind_processor(self, dialect):
+        def process(value):
+            if value is None:
+                return None
+            return datetime.datetime(1970, 1, 1, value.hour, value.minute, value.second, value.microsecond)
+        return process
+
+class SybaseText(sqltypes.Text):
+    def get_col_spec(self):
+        return "TEXT"
+
+class SybaseString(sqltypes.String):
+    def get_col_spec(self):
+        return "VARCHAR(%(length)s)" % {'length' : self.length}
+
+class SybaseChar(sqltypes.CHAR):
+    def get_col_spec(self):
+        return "CHAR(%(length)s)" % {'length' : self.length}
+
+class SybaseBinary(sqltypes.Binary):
+    def get_col_spec(self):
+        return "IMAGE"
+
+class SybaseBoolean(sqltypes.Boolean):
+    def get_col_spec(self):
+        return "BIT"
+
+    def result_processor(self, dialect):
+        def process(value):
+            if value is None:
+                return None
+            return value and True or False
+        return process
+
+    def bind_processor(self, dialect):
+        def process(value):
+            if value is True:
+                return 1
+            elif value is False:
+                return 0
+            elif value is None:
+                return None
+            else:
+                return value and True or False
+        return process
+
+class SybaseTimeStamp(sqltypes.TIMESTAMP):
+    def get_col_spec(self):
+        return "TIMESTAMP"
+
+class SybaseMoney(sqltypes.TypeEngine):
+    def get_col_spec(self):
+        return "MONEY"
+
+class SybaseSmallMoney(SybaseMoney):
+    def get_col_spec(self):
+        return "SMALLMONEY"
+
+class SybaseUniqueIdentifier(sqltypes.TypeEngine):
+    def get_col_spec(self):
+        return "UNIQUEIDENTIFIER"
+
+class SybaseSQLExecutionContext(default.DefaultExecutionContext):
+    pass
+
+class SybaseSQLExecutionContext_mxodbc(SybaseSQLExecutionContext):
+
+    def __init__(self, dialect, connection, compiled=None, statement=None, parameters=None):
+        super(SybaseSQLExecutionContext_mxodbc, self).__init__(dialect, connection, compiled, statement, parameters)
+
+    def pre_exec(self):
+        super(SybaseSQLExecutionContext_mxodbc, self).pre_exec()
+
+    def post_exec(self):
+        if self.compiled.isinsert:
+            table = self.compiled.statement.table
+            # get the inserted values of the primary key
+
+            # get any sequence IDs first (using @@identity)
+            self.cursor.execute("SELECT @@identity AS lastrowid")
+            row = self.cursor.fetchone()
+            lastrowid = int(row[0])
+            if lastrowid > 0:
+                # an IDENTITY was inserted, fetch it
+                # FIXME: always insert in front ? This only works if the IDENTITY is the first column, no ?!
+                if not hasattr(self, '_last_inserted_ids') or self._last_inserted_ids is None:
+                    self._last_inserted_ids = [lastrowid]
+                else:
+                    self._last_inserted_ids = [lastrowid] + self._last_inserted_ids[1:]
+        super(SybaseSQLExecutionContext_mxodbc, self).post_exec()
+
+class SybaseSQLExecutionContext_pyodbc(SybaseSQLExecutionContext):
+    def __init__(self, dialect, connection, compiled=None, statement=None, parameters=None):
+        super(SybaseSQLExecutionContext_pyodbc, self).__init__(dialect, connection, compiled, statement, parameters)
+
+    def pre_exec(self):
+        super(SybaseSQLExecutionContext_pyodbc, self).pre_exec()
+
+    def post_exec(self):
+        if self.compiled.isinsert:
+            table = self.compiled.statement.table
+            # get the inserted values of the primary key
+
+            # get any sequence IDs first (using @@identity)
+            self.cursor.execute("SELECT @@identity AS lastrowid")
+            row = self.cursor.fetchone()
+            lastrowid = int(row[0])
+            if lastrowid > 0:
+                # an IDENTITY was inserted, fetch it
+                # FIXME: always insert in front ? This only works if the IDENTITY is the first column, no ?!
+                if not hasattr(self, '_last_inserted_ids') or self._last_inserted_ids is None:
+                    self._last_inserted_ids = [lastrowid]
+                else:
+                    self._last_inserted_ids = [lastrowid] + self._last_inserted_ids[1:]
+        super(SybaseSQLExecutionContext_pyodbc, self).post_exec()
+
+class SybaseSQLDialect(default.DefaultDialect):
+    colspecs = {
+        # FIXME: unicode support
+        #sqltypes.Unicode : SybaseUnicode,
+        sqltypes.Integer : SybaseInteger,
+        sqltypes.SmallInteger : SybaseSmallInteger,
+        sqltypes.Numeric : SybaseNumeric,
+        sqltypes.Float : SybaseFloat,
+        sqltypes.String : SybaseString,
+        sqltypes.Binary : SybaseBinary,
+        sqltypes.Boolean : SybaseBoolean,
+        sqltypes.Text : SybaseText,
+        sqltypes.CHAR : SybaseChar,
+        sqltypes.TIMESTAMP : SybaseTimeStamp,
+        sqltypes.FLOAT : SybaseFloat,
+    }
+
+    ischema_names = {
+        'integer' : SybaseInteger,
+        'unsigned int' : SybaseInteger,
+        'unsigned smallint' : SybaseInteger,
+        'unsigned bigint' : SybaseInteger,
+        'bigint': SybaseBigInteger,
+        'smallint' : SybaseSmallInteger,
+        'tinyint' : SybaseTinyInteger,
+        'varchar' : SybaseString,
+        'long varchar' : SybaseText,
+        'char' : SybaseChar,
+        'decimal' : SybaseNumeric,
+        'numeric' : SybaseNumeric,
+        'float' : SybaseFloat,
+        'double' : SybaseFloat,
+        'binary' : SybaseBinary,
+        'long binary' : SybaseBinary,
+        'varbinary' : SybaseBinary,
+        'bit': SybaseBoolean,
+        'image' : SybaseBinary,
+        'timestamp': SybaseTimeStamp,
+        'money': SybaseMoney,
+        'smallmoney': SybaseSmallMoney,
+        'uniqueidentifier': SybaseUniqueIdentifier,
+
+        'java.lang.Object' : SybaseTypeError,
+        'java serialization' : SybaseTypeError,
+    }
+
+    name = 'sybase'
+    # Sybase backend peculiarities
+    supports_unicode_statements = False
+    supports_sane_rowcount = False
+    supports_sane_multi_rowcount = False
+    execution_ctx_cls = SybaseSQLExecutionContext
+    
+    def __new__(cls, dbapi=None, *args, **kwargs):
+        if cls != SybaseSQLDialect:
+            return super(SybaseSQLDialect, cls).__new__(cls, *args, **kwargs)
+        if dbapi:
+            print dbapi.__name__
+            dialect = dialect_mapping.get(dbapi.__name__)
+            return dialect(*args, **kwargs)
+        else:
+            return object.__new__(cls, *args, **kwargs)
+
+    def __init__(self, **params):
+        super(SybaseSQLDialect, self).__init__(**params)
+        self.text_as_varchar = False
+        # FIXME: what is the default schema for sybase connections (DBA?) ?
+        self.set_default_schema_name("dba")
+
+    def dbapi(cls, module_name=None):
+        if module_name:
+            try:
+                dialect_cls = dialect_mapping[module_name]
+                return dialect_cls.import_dbapi()
+            except KeyError:
+                raise exc.InvalidRequestError("Unsupported SybaseSQL module '%s' requested (must be " + " or ".join([x for x in dialect_mapping.keys()]) + ")" % module_name)
+        else:
+            for dialect_cls in dialect_mapping.values():
+                try:
+                    return dialect_cls.import_dbapi()
+                except ImportError, e:
+                    pass
+            else:
+                raise ImportError('No DBAPI module detected for SybaseSQL - please install mxodbc')
+    dbapi = classmethod(dbapi)
+
+    def type_descriptor(self, typeobj):
+        newobj = sqltypes.adapt_type(typeobj, self.colspecs)
+        return newobj
+
+    def last_inserted_ids(self):
+        return self.context.last_inserted_ids
+
+    def get_default_schema_name(self, connection):
+        return self.schema_name
+
+    def set_default_schema_name(self, schema_name):
+        self.schema_name = schema_name
+
+    def do_execute(self, cursor, statement, params, **kwargs):
+        params = tuple(params)
+        super(SybaseSQLDialect, self).do_execute(cursor, statement, params, **kwargs)
+
+    # FIXME: remove ?
+    def _execute(self, c, statement, parameters):
+        try:
+            if parameters == {}:
+                parameters = ()
+            c.execute(statement, parameters)
+            self.context.rowcount = c.rowcount
+            c.DBPROP_COMMITPRESERVE = "Y"
+        except Exception, e:
+            raise exc.DBAPIError.instance(statement, parameters, e)
+
+    def table_names(self, connection, schema):
+        """Ignore the schema and the charset for now."""
+        s = sql.select([tables.c.table_name],
+                       sql.not_(tables.c.table_name.like("SYS%")) and
+                       tables.c.creator >= 100
+                       )
+        rp = connection.execute(s)
+        return [row[0] for row in rp.fetchall()]
+
+    def has_table(self, connection, tablename, schema=None):
+        # FIXME: ignore schemas for sybase
+        s = sql.select([tables.c.table_name], tables.c.table_name == tablename)
+
+        c = connection.execute(s)
+        row = c.fetchone()
+        print "has_table: " + tablename + ": " + str(bool(row is not None))
+        return row is not None
+
+    def reflecttable(self, connection, table, include_columns):
+        # Get base columns
+        if table.schema is not None:
+            current_schema = table.schema
+        else:
+            current_schema = self.get_default_schema_name(connection)
+
+        s = sql.select([columns, domains], tables.c.table_name==table.name, from_obj=[columns.join(tables).join(domains)], order_by=[columns.c.column_id])
+
+        c = connection.execute(s)
+        found_table = False
+        # makes sure we append the columns in the correct order
+        while True:
+            row = c.fetchone()
+            if row is None:
+                break
+            found_table = True
+            (name, type, nullable, charlen, numericprec, numericscale, default, primary_key, max_identity, table_id, column_id) = (
+                row[columns.c.column_name],
+                row[domains.c.domain_name],
+                row[columns.c.nulls] == 'Y',
+                row[columns.c.width],
+                row[domains.c.precision],
+                row[columns.c.scale],
+                row[columns.c.default],
+                row[columns.c.pkey] == 'Y',
+                row[columns.c.max_identity],
+                row[tables.c.table_id],
+                row[columns.c.column_id],
+            )
+            if include_columns and name not in include_columns:
+                continue
+
+            # FIXME: else problems with SybaseBinary(size)
+            if numericscale == 0:
+                numericscale = None
+
+            args = []
+            for a in (charlen, numericprec, numericscale):
+                if a is not None:
+                    args.append(a)
+            coltype = self.ischema_names.get(type, None)
+            if coltype == SybaseString and charlen == -1:
+                coltype = SybaseText()
+            else:
+                if coltype is None:
+                    util.warn("Did not recognize type '%s' of column '%s'" %
+                              (type, name))
+                    coltype = sqltypes.NULLTYPE
+                coltype = coltype(*args)
+            colargs = []
+            if default is not None:
+                colargs.append(schema.DefaultClause(sql.text(default)))
+
+            # any sequences ?
+            col = schema.Column(name, coltype, nullable=nullable, primary_key=primary_key, *colargs)
+            if int(max_identity) > 0:
+                col.sequence = schema.Sequence(name + '_identity')
+                col.sequence.start = int(max_identity)
+                col.sequence.increment = 1
+
+            # append the column
+            table.append_column(col)
+
+        # any foreign key constraint for this table ?
+        # note: no multi-column foreign keys are considered
+        s = "select st1.table_name, sc1.column_name, st2.table_name, sc2.column_name from systable as st1 join sysfkcol on st1.table_id=sysfkcol.foreign_table_id join sysforeignkey join systable as st2 on sysforeignkey.primary_table_id = st2.table_id join syscolumn as sc1 on sysfkcol.foreign_column_id=sc1.column_id and sc1.table_id=st1.table_id join syscolumn as sc2 on sysfkcol.primary_column_id=sc2.column_id and sc2.table_id=st2.table_id where st1.table_name='%(table_name)s';" % { 'table_name' : table.name }
+        c = connection.execute(s)
+        foreignKeys = {}
+        while True:
+            row = c.fetchone()
+            if row is None:
+                break
+            (foreign_table, foreign_column, primary_table, primary_column) = (
+                row[0], row[1], row[2], row[3],
+            )
+            if not primary_table in foreignKeys.keys():
+                foreignKeys[primary_table] = [['%s' % (foreign_column)], ['%s.%s'%(primary_table, primary_column)]]
+            else:
+                foreignKeys[primary_table][0].append('%s'%(foreign_column))
+                foreignKeys[primary_table][1].append('%s.%s'%(primary_table, primary_column))
+        for primary_table in foreignKeys.keys():
+            #table.append_constraint(schema.ForeignKeyConstraint(['%s.%s'%(foreign_table, foreign_column)], ['%s.%s'%(primary_table,primary_column)]))
+            table.append_constraint(schema.ForeignKeyConstraint(foreignKeys[primary_table][0], foreignKeys[primary_table][1], link_to_name=True))
+
+        if not found_table:
+            raise exc.NoSuchTableError(table.name)
+
+
+class SybaseSQLDialect_mxodbc(SybaseSQLDialect):
+    execution_ctx_cls = SybaseSQLExecutionContext_mxodbc
+    
+    def __init__(self, **params):
+        super(SybaseSQLDialect_mxodbc, self).__init__(**params)
+
+        self.dbapi_type_map = {'getdate' : SybaseDate_mxodbc()}
+
+    def import_dbapi(cls):
+        #import mx.ODBC.Windows as module
+        import mxODBC as module
+        return module
+    import_dbapi = classmethod(import_dbapi)
+
+    colspecs = SybaseSQLDialect.colspecs.copy()
+    colspecs[sqltypes.Time] = SybaseTime_mxodbc
+    colspecs[sqltypes.Date] = SybaseDate_mxodbc
+    colspecs[sqltypes.DateTime] = SybaseDateTime_mxodbc
+
+    ischema_names = SybaseSQLDialect.ischema_names.copy()
+    ischema_names['time'] = SybaseTime_mxodbc
+    ischema_names['date'] = SybaseDate_mxodbc
+    ischema_names['datetime'] = SybaseDateTime_mxodbc
+    ischema_names['smalldatetime'] = SybaseDateTime_mxodbc
+
+    def is_disconnect(self, e):
+        # FIXME: optimize
+        #return isinstance(e, self.dbapi.Error) and '[08S01]' in str(e)
+        #return True
+        return False
+
+    def do_execute(self, cursor, statement, parameters, context=None, **kwargs):
+        super(SybaseSQLDialect_mxodbc, self).do_execute(cursor, statement, parameters, context=context, **kwargs)
+
+    def create_connect_args(self, url):
+        '''Return a tuple of *args,**kwargs'''
+        # FIXME: handle mx.odbc.Windows proprietary args
+        opts = url.translate_connect_args(username='user')
+        opts.update(url.query)
+        argsDict = {}
+        argsDict['user'] = opts['user']
+        argsDict['password'] = opts['password']
+        connArgs = [[opts['dsn']], argsDict]
+        return connArgs
+
+
+class SybaseSQLDialect_pyodbc(SybaseSQLDialect):
+    execution_ctx_cls = SybaseSQLExecutionContext_pyodbc
+    
+    def __init__(self, **params):
+        super(SybaseSQLDialect_pyodbc, self).__init__(**params)
+        self.dbapi_type_map = {'getdate' : SybaseDate_pyodbc()}
+
+    def import_dbapi(cls):
+        import mypyodbc as module
+        return module
+    import_dbapi = classmethod(import_dbapi)
+
+    colspecs = SybaseSQLDialect.colspecs.copy()
+    colspecs[sqltypes.Time] = SybaseTime_pyodbc
+    colspecs[sqltypes.Date] = SybaseDate_pyodbc
+    colspecs[sqltypes.DateTime] = SybaseDateTime_pyodbc
+
+    ischema_names = SybaseSQLDialect.ischema_names.copy()
+    ischema_names['time'] = SybaseTime_pyodbc
+    ischema_names['date'] = SybaseDate_pyodbc
+    ischema_names['datetime'] = SybaseDateTime_pyodbc
+    ischema_names['smalldatetime'] = SybaseDateTime_pyodbc
+
+    def is_disconnect(self, e):
+        # FIXME: optimize
+        #return isinstance(e, self.dbapi.Error) and '[08S01]' in str(e)
+        #return True
+        return False
+
+    def do_execute(self, cursor, statement, parameters, context=None, **kwargs):
+        super(SybaseSQLDialect_pyodbc, self).do_execute(cursor, statement, parameters, context=context, **kwargs)
+
+    def create_connect_args(self, url):
+        '''Return a tuple of *args,**kwargs'''
+        # FIXME: handle pyodbc proprietary args
+        opts = url.translate_connect_args(username='user')
+        opts.update(url.query)
+
+        self.autocommit = False
+        if 'autocommit' in opts:
+            self.autocommit = bool(int(opts.pop('autocommit')))
+
+        argsDict = {}
+        argsDict['UID'] = opts['user']
+        argsDict['PWD'] = opts['password']
+        argsDict['DSN'] = opts['dsn']
+        connArgs = [[';'.join(["%s=%s"%(key, argsDict[key]) for key in argsDict])], {'autocommit' : self.autocommit}]
+        return connArgs
+
+
+dialect_mapping = {
+    'sqlalchemy.databases.mxODBC' : SybaseSQLDialect_mxodbc,
+#    'pyodbc' : SybaseSQLDialect_pyodbc,
+    }
+
+
+class SybaseSQLCompiler(compiler.DefaultCompiler):
+    operators = compiler.DefaultCompiler.operators.copy()
+    operators.update({
+        sql_operators.mod: lambda x, y: "MOD(%s, %s)" % (x, y),
+    })
+
+    extract_map = compiler.DefaultCompiler.extract_map.copy()
+    extract_map.update ({
+        'doy': 'dayofyear',
+        'dow': 'weekday',
+        'milliseconds': 'millisecond'
+    })
+
+
+    def bindparam_string(self, name):
+        res = super(SybaseSQLCompiler, self).bindparam_string(name)
+        if name.lower().startswith('literal'):
+            res = 'STRING(%s)' % res
+        return res
+
+    def get_select_precolumns(self, select):
+        s = select._distinct and "DISTINCT " or ""
+        if select._limit:
+            #if select._limit == 1:
+                #s += "FIRST "
+            #else:
+                #s += "TOP %s " % (select._limit,)
+            s += "TOP %s " % (select._limit,)
+        if select._offset:
+            if not select._limit:
+                # FIXME: sybase doesn't allow an offset without a limit
+                # so use a huge value for TOP here
+                s += "TOP 1000000 "
+            s += "START AT %s " % (select._offset+1,)
+        return s
+
+    def limit_clause(self, select):
+        # Limit in sybase is after the select keyword
+        return ""
+
+    def visit_binary(self, binary):
+        """Move bind parameters to the right-hand side of an operator, where possible."""
+        if isinstance(binary.left, expression._BindParamClause) and binary.operator == operator.eq:
+            return self.process(expression._BinaryExpression(binary.right, binary.left, binary.operator))
+        else:
+            return super(SybaseSQLCompiler, self).visit_binary(binary)
+
+    def label_select_column(self, select, column, asfrom):
+        if isinstance(column, expression.Function):
+            return column.label(None)
+        else:
+            return super(SybaseSQLCompiler, self).label_select_column(select, column, asfrom)
+
+    function_rewrites =  {'current_date': 'getdate',
+                         }
+    def visit_function(self, func):
+        func.name = self.function_rewrites.get(func.name, func.name)
+        res = super(SybaseSQLCompiler, self).visit_function(func)
+        if func.name.lower() == 'getdate':
+            # apply CAST operator
+            # FIXME: what about _pyodbc ?
+            cast = expression._Cast(func, SybaseDate_mxodbc)
+            # infinite recursion
+            # res = self.visit_cast(cast)
+            res = "CAST(%s AS %s)" % (res, self.process(cast.typeclause))
+        return res
+
+    def visit_extract(self, extract):
+        field = self.extract_map.get(extract.field, extract.field)
+        return 'DATEPART("%s", %s)' % (field, self.process(extract.expr))
+
+    def for_update_clause(self, select):
+        # "FOR UPDATE" is only allowed on "DECLARE CURSOR" which SQLAlchemy doesn't use
+        return ''
+
+    def order_by_clause(self, select):
+        order_by = self.process(select._order_by_clause)
+
+        # SybaseSQL only allows ORDER BY in subqueries if there is a LIMIT
+        if order_by and (not self.is_subquery() or select._limit):
+            return " ORDER BY " + order_by
+        else:
+            return ""
+
+
+class SybaseSQLSchemaGenerator(compiler.SchemaGenerator):
+    def get_column_specification(self, column, **kwargs):
+
+        colspec = self.preparer.format_column(column)
+
+        if (not getattr(column.table, 'has_sequence', False)) and column.primary_key and \
+                column.autoincrement and isinstance(column.type, sqltypes.Integer):
+            if column.default is None or (isinstance(column.default, schema.Sequence) and column.default.optional):
+                column.sequence = schema.Sequence(column.name + '_seq')
+
+        if hasattr(column, 'sequence'):
+            column.table.has_sequence = column
+            #colspec += " numeric(30,0) IDENTITY"
+            colspec += " Integer IDENTITY"
+        else:
+            colspec += " " + column.type.dialect_impl(self.dialect).get_col_spec()
+
+        if not column.nullable:
+            colspec += " NOT NULL"
+
+        default = self.get_column_default_string(column)
+        if default is not None:
+            colspec += " DEFAULT " + default
+
+        return colspec
+
+
+class SybaseSQLSchemaDropper(compiler.SchemaDropper):
+    def visit_index(self, index):
+        self.append("\nDROP INDEX %s.%s" % (
+            self.preparer.quote_identifier(index.table.name),
+            self.preparer.quote(self._validate_identifier(index.name, False), index.quote)
+            ))
+        self.execute()
+
+
+class SybaseSQLDefaultRunner(base.DefaultRunner):
+    pass
+
+
+class SybaseSQLIdentifierPreparer(compiler.IdentifierPreparer):
+    reserved_words = RESERVED_WORDS
+
+    def __init__(self, dialect):
+        super(SybaseSQLIdentifierPreparer, self).__init__(dialect)
+
+    def _escape_identifier(self, value):
+        #TODO: determin SybaseSQL's escapeing rules
+        return value
+
+    def _fold_identifier_case(self, value):
+        #TODO: determin SybaseSQL's case folding rules
+        return value
+
+
+dialect = SybaseSQLDialect
+dialect.statement_compiler = SybaseSQLCompiler
+dialect.schemagenerator = SybaseSQLSchemaGenerator
+dialect.schemadropper = SybaseSQLSchemaDropper
+dialect.preparer = SybaseSQLIdentifierPreparer
+dialect.defaultrunner = SybaseSQLDefaultRunner
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/types.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/types.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/types.py (revision 3)
@@ -0,0 +1,927 @@
+# types.py
+# Copyright (C) 2005, 2006, 2007, 2008, 2009 Michael Bayer mike_mp@zzzcomputing.com
+#
+# This module is part of SQLAlchemy and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+"""defines genericized SQL types, each represented by a subclass of
+:class:`~sqlalchemy.types.AbstractType`.  Dialects define further subclasses of these
+types.
+
+For more information see the SQLAlchemy documentation on types.
+
+"""
+__all__ = [ 'TypeEngine', 'TypeDecorator', 'AbstractType',
+            'INT', 'CHAR', 'VARCHAR', 'NCHAR', 'TEXT', 'Text', 'FLOAT',
+            'NUMERIC', 'DECIMAL', 'TIMESTAMP', 'DATETIME', 'CLOB', 'BLOB',
+            'BOOLEAN', 'SMALLINT', 'DATE', 'TIME',
+            'String', 'Integer', 'SmallInteger','Smallinteger',
+            'Numeric', 'Float', 'DateTime', 'Date', 'Time', 'Binary',
+            'Boolean', 'Unicode', 'MutableType', 'Concatenable', 'UnicodeText', 'PickleType', 'Interval',
+            'type_map'
+            ]
+
+import inspect
+import datetime as dt
+from decimal import Decimal as _python_Decimal
+import weakref
+from sqlalchemy import exc
+from sqlalchemy.util import pickle
+import sqlalchemy.util as util
+NoneType = type(None)
+    
+class AbstractType(object):
+
+    def __init__(self, *args, **kwargs):
+        pass
+
+    def copy_value(self, value):
+        return value
+
+    def bind_processor(self, dialect):
+        """Defines a bind parameter processing function."""
+
+        return None
+
+    def result_processor(self, dialect):
+        """Defines a result-column processing function."""
+
+        return None
+
+    def compare_values(self, x, y):
+        """Compare two values for equality."""
+
+        return x == y
+
+    def is_mutable(self):
+        """Return True if the target Python type is 'mutable'.
+
+        This allows systems like the ORM to know if a column value can
+        be considered 'not changed' by comparing the identity of
+        objects alone.
+
+        Use the :class:`MutableType` mixin or override this method to
+        return True in custom types that hold mutable values such as
+        ``dict``, ``list`` and custom objects.
+
+        """
+        return False
+
+    def get_dbapi_type(self, dbapi):
+        """Return the corresponding type object from the underlying DB-API, if any.
+
+        This can be useful for calling ``setinputsizes()``, for example.
+        """
+        return None
+
+    def adapt_operator(self, op):
+        """Given an operator from the sqlalchemy.sql.operators package,
+        translate it to a new operator based on the semantics of this type.
+
+        By default, returns the operator unchanged.
+        """
+        return op
+
+    def __repr__(self):
+        return "%s(%s)" % (
+            self.__class__.__name__,
+            ", ".join("%s=%r" % (k, getattr(self, k, None))
+                      for k in inspect.getargspec(self.__init__)[0][1:]))
+
+class TypeEngine(AbstractType):
+    """Base for built-in types.
+
+    May be sub-classed to create entirely new types.  Example::
+
+      import sqlalchemy.types as types
+
+      class MyType(types.TypeEngine):
+          def __init__(self, precision = 8):
+              self.precision = precision
+
+          def get_col_spec(self):
+              return "MYTYPE(%s)" % self.precision
+
+          def bind_processor(self, dialect):
+              def process(value):
+                  return value
+              return process
+
+          def result_processor(self, dialect):
+              def process(value):
+                  return value
+              return process
+
+    Once the type is made, it's immediately usable::
+
+      table = Table('foo', meta,
+          Column('id', Integer, primary_key=True),
+          Column('data', MyType(16))
+          )
+
+    """
+
+    def dialect_impl(self, dialect, **kwargs):
+        try:
+            return self._impl_dict[dialect]
+        except AttributeError:
+            self._impl_dict = weakref.WeakKeyDictionary()   # will be optimized in 0.6
+            return self._impl_dict.setdefault(dialect, dialect.type_descriptor(self))
+        except KeyError:
+            return self._impl_dict.setdefault(dialect, dialect.type_descriptor(self))
+
+    def __getstate__(self):
+        d = self.__dict__.copy()
+        d.pop('_impl_dict', None)
+        return d
+
+    def get_col_spec(self):
+        """Return the DDL representation for this type."""
+        raise NotImplementedError()
+
+    def bind_processor(self, dialect):
+        """Return a conversion function for processing bind values.
+
+        Returns a callable which will receive a bind parameter value
+        as the sole positional argument and will return a value to
+        send to the DB-API.
+
+        If processing is not necessary, the method should return ``None``.
+
+        """
+        return None
+
+    def result_processor(self, dialect):
+        """Return a conversion function for processing result row values.
+
+        Returns a callable which will receive a result row column
+        value as the sole positional argument and will return a value
+        to return to the user.
+
+        If processing is not necessary, the method should return ``None``.
+
+        """
+        return None
+
+    def adapt(self, cls):
+        return cls()
+
+    def get_search_list(self):
+        """return a list of classes to test for a match
+        when adapting this type to a dialect-specific type.
+
+        """
+
+        return self.__class__.__mro__[0:-1]
+
+class TypeDecorator(AbstractType):
+    """Allows the creation of types which add additional functionality
+    to an existing type.
+
+    Typical usage::
+
+      import sqlalchemy.types as types
+
+      class MyType(types.TypeDecorator):
+          # Prefixes Unicode values with "PREFIX:" on the way in and
+          # strips it off on the way out.
+
+          impl = types.Unicode
+
+          def process_bind_param(self, value, dialect):
+              return "PREFIX:" + value
+
+          def process_result_value(self, value, dialect):
+              return value[7:]
+
+          def copy(self):
+              return MyType(self.impl.length)
+
+    The class-level "impl" variable is required, and can reference any
+    TypeEngine class.  Alternatively, the load_dialect_impl() method
+    can be used to provide different type classes based on the dialect
+    given; in this case, the "impl" variable can reference
+    ``TypeEngine`` as a placeholder.
+
+    The reason that type behavior is modified using class decoration
+    instead of subclassing is due to the way dialect specific types
+    are used.  Such as with the example above, when using the mysql
+    dialect, the actual type in use will be a
+    ``sqlalchemy.databases.mysql.MSString`` instance.
+    ``TypeDecorator`` handles the mechanics of passing the values
+    between user-defined ``process_`` methods and the current
+    dialect-specific type in use.
+
+    """
+
+    def __init__(self, *args, **kwargs):
+        if not hasattr(self.__class__, 'impl'):
+            raise AssertionError("TypeDecorator implementations require a class-level variable 'impl' which refers to the class of type being decorated")
+        self.impl = self.__class__.impl(*args, **kwargs)
+
+    def dialect_impl(self, dialect, **kwargs):
+        try:
+            return self._impl_dict[dialect]
+        except AttributeError:
+            self._impl_dict = weakref.WeakKeyDictionary()   # will be optimized in 0.6
+        except KeyError:
+            pass
+
+        typedesc = self.load_dialect_impl(dialect)
+        tt = self.copy()
+        if not isinstance(tt, self.__class__):
+            raise AssertionError("Type object %s does not properly implement the copy() "
+                    "method, it must return an object of type %s" % (self, self.__class__))
+        tt.impl = typedesc
+        self._impl_dict[dialect] = tt
+        return tt
+
+    def load_dialect_impl(self, dialect):
+        """Loads the dialect-specific implementation of this type.
+
+        by default calls dialect.type_descriptor(self.impl), but
+        can be overridden to provide different behavior.
+        """
+
+        if isinstance(self.impl, TypeDecorator):
+            return self.impl.dialect_impl(dialect)
+        else:
+            return dialect.type_descriptor(self.impl)
+
+    def __getattr__(self, key):
+        """Proxy all other undefined accessors to the underlying implementation."""
+
+        return getattr(self.impl, key)
+
+    def get_col_spec(self):
+        return self.impl.get_col_spec()
+
+    def process_bind_param(self, value, dialect):
+        raise NotImplementedError()
+
+    def process_result_value(self, value, dialect):
+        raise NotImplementedError()
+
+    def bind_processor(self, dialect):
+        if self.__class__.process_bind_param.func_code is not TypeDecorator.process_bind_param.func_code:
+            impl_processor = self.impl.bind_processor(dialect)
+            if impl_processor:
+                def process(value):
+                    return impl_processor(self.process_bind_param(value, dialect))
+                return process
+            else:
+                def process(value):
+                    return self.process_bind_param(value, dialect)
+                return process
+        else:
+            return self.impl.bind_processor(dialect)
+
+    def result_processor(self, dialect):
+        if self.__class__.process_result_value.func_code is not TypeDecorator.process_result_value.func_code:
+            impl_processor = self.impl.result_processor(dialect)
+            if impl_processor:
+                def process(value):
+                    return self.process_result_value(impl_processor(value), dialect)
+                return process
+            else:
+                def process(value):
+                    return self.process_result_value(value, dialect)
+                return process
+        else:
+            return self.impl.result_processor(dialect)
+
+    def copy(self):
+        instance = self.__class__.__new__(self.__class__)
+        instance.__dict__.update(self.__dict__)
+        return instance
+
+    def get_dbapi_type(self, dbapi):
+        return self.impl.get_dbapi_type(dbapi)
+
+    def copy_value(self, value):
+        return self.impl.copy_value(value)
+
+    def compare_values(self, x, y):
+        return self.impl.compare_values(x, y)
+
+    def is_mutable(self):
+        return self.impl.is_mutable()
+
+class MutableType(object):
+    """A mixin that marks a Type as holding a mutable object.
+
+    :meth:`copy_value` and :meth:`compare_values` should be customized
+    as needed to match the needs of the object.
+
+    """
+
+    def is_mutable(self):
+        """Return True, mutable."""
+        return True
+
+    def copy_value(self, value):
+        """Unimplemented."""
+        raise NotImplementedError()
+
+    def compare_values(self, x, y):
+        """Compare *x* == *y*."""
+        return x == y
+
+def to_instance(typeobj):
+    if typeobj is None:
+        return NULLTYPE
+
+    try: 
+        return typeobj()
+    except TypeError:
+        return typeobj
+
+def adapt_type(typeobj, colspecs):
+    if isinstance(typeobj, type):
+        typeobj = typeobj()
+    for t in typeobj.get_search_list():
+        try:
+            impltype = colspecs[t]
+            break
+        except KeyError:
+            pass
+    else:
+        # couldnt adapt - so just return the type itself
+        # (it may be a user-defined type)
+        return typeobj
+    # if we adapted the given generic type to a database-specific type,
+    # but it turns out the originally given "generic" type
+    # is actually a subclass of our resulting type, then we were already
+    # given a more specific type than that required; so use that.
+    if (issubclass(typeobj.__class__, impltype)):
+        return typeobj
+    return typeobj.adapt(impltype)
+
+class NullType(TypeEngine):
+    """An unknown type.
+
+    NullTypes will stand in if :class:`~sqlalchemy.Table` reflection
+    encounters a column data type unknown to SQLAlchemy.  The
+    resulting columns are nearly fully usable: the DB-API adapter will
+    handle all translation to and from the database data type.
+
+    NullType does not have sufficient information to particpate in a
+    ``CREATE TABLE`` statement and will raise an exception if
+    encountered during a :meth:`~sqlalchemy.Table.create` operation.
+
+    """
+
+    def get_col_spec(self):
+        raise NotImplementedError()
+
+NullTypeEngine = NullType
+
+class Concatenable(object):
+    """A mixin that marks a type as supporting 'concatenation', typically strings."""
+
+    def adapt_operator(self, op):
+        """Converts an add operator to concat."""
+        from sqlalchemy.sql import operators
+        if op is operators.add:
+            return operators.concat_op
+        else:
+            return op
+
+class String(Concatenable, TypeEngine):
+    """The base for all string and character types.
+
+    In SQL, corresponds to VARCHAR.  Can also take Python unicode objects
+    and encode to the database's encoding in bind params (and the reverse for
+    result sets.)
+
+    The `length` field is usually required when the `String` type is
+    used within a CREATE TABLE statement, as VARCHAR requires a length
+    on most databases.
+
+    """
+
+    def __init__(self, length=None, convert_unicode=False, assert_unicode=None):
+        """
+        Create a string-holding type.
+
+        :param length: optional, a length for the column for use in
+          DDL statements.  May be safely omitted if no ``CREATE
+          TABLE`` will be issued.  Certain databases may require a
+          *length* for use in DDL, and will raise an exception when
+          the ``CREATE TABLE`` DDL is issued.  Whether the value is
+          interpreted as bytes or characters is database specific.
+
+        :param convert_unicode: defaults to False.  If True, convert
+          ``unicode`` data sent to the database to a ``str``
+          bytestring, and convert bytestrings coming back from the
+          database into ``unicode``.
+
+          Bytestrings are encoded using the dialect's
+          :attr:`~sqlalchemy.engine.base.Dialect.encoding`, which
+          defaults to `utf-8`.
+
+          If False, may be overridden by
+          :attr:`sqlalchemy.engine.base.Dialect.convert_unicode`.
+
+        :param assert_unicode:
+
+          If None (the default), no assertion will take place unless
+          overridden by :attr:`sqlalchemy.engine.base.Dialect.assert_unicode`.
+
+          If 'warn', will issue a runtime warning if a ``str``
+          instance is used as a bind value.
+
+          If true, will raise an :exc:`sqlalchemy.exc.InvalidRequestError`.
+
+        """
+        self.length = length
+        self.convert_unicode = convert_unicode
+        self.assert_unicode = assert_unicode
+
+    def adapt(self, impltype):
+        return impltype(length=self.length, convert_unicode=self.convert_unicode, assert_unicode=self.assert_unicode)
+
+    def bind_processor(self, dialect):
+        if self.convert_unicode or dialect.convert_unicode:
+            if self.assert_unicode is None:
+                assert_unicode = dialect.assert_unicode
+            else:
+                assert_unicode = self.assert_unicode
+            def process(value):
+                if isinstance(value, unicode):
+                    return value.encode(dialect.encoding)
+                elif assert_unicode and not isinstance(value, (unicode, NoneType)):
+                    if assert_unicode == 'warn':
+                        util.warn("Unicode type received non-unicode bind "
+                                  "param value %r" % value)
+                        return value
+                    else:
+                        raise exc.InvalidRequestError("Unicode type received non-unicode bind param value %r" % value)
+                else:
+                    return value
+            return process
+        else:
+            return None
+
+    def result_processor(self, dialect):
+        if self.convert_unicode or dialect.convert_unicode:
+            def process(value):
+                if value is not None and not isinstance(value, unicode):
+                    return value.decode(dialect.encoding)
+                else:
+                    return value
+            return process
+        else:
+            return None
+
+    def get_dbapi_type(self, dbapi):
+        return dbapi.STRING
+
+class Text(String):
+    """A variably sized string type.
+
+    In SQL, usually corresponds to CLOB or TEXT. Can also take Python
+    unicode objects and encode to the database's encoding in bind
+    params (and the reverse for result sets.)
+
+    """
+
+class Unicode(String):
+    """A variable length Unicode string.
+
+    The ``Unicode`` type is a :class:`String` which converts Python
+    ``unicode`` objects (i.e., strings that are defined as
+    ``u'somevalue'``) into encoded bytestrings when passing the value
+    to the database driver, and similarly decodes values from the
+    database back into Python ``unicode`` objects.
+
+    When using the ``Unicode`` type, it is only appropriate to pass
+    Python ``unicode`` objects, and not plain ``str``.  If a
+    bytestring (``str``) is passed, a runtime warning is issued.  If
+    you notice your application raising these warnings but you're not
+    sure where, the Python ``warnings`` filter can be used to turn
+    these warnings into exceptions which will illustrate a stack
+    trace::
+
+      import warnings
+      warnings.simplefilter('error')
+
+    Bytestrings sent to and received from the database are encoded
+    using the dialect's
+    :attr:`~sqlalchemy.engine.base.Dialect.encoding`, which defaults
+    to `utf-8`.
+
+    A synonym for String(length, convert_unicode=True, assert_unicode='warn').
+
+    """
+
+    def __init__(self, length=None, **kwargs):
+        """
+        Create a Unicode-converting String type.
+
+        :param length: optional, a length for the column for use in
+          DDL statements.  May be safely omitted if no ``CREATE
+          TABLE`` will be issued.  Certain databases may require a
+          *length* for use in DDL, and will raise an exception when
+          the ``CREATE TABLE`` DDL is issued.  Whether the value is
+          interpreted as bytes or characters is database specific.
+
+        """
+        kwargs.setdefault('convert_unicode', True)
+        kwargs.setdefault('assert_unicode', 'warn')
+        super(Unicode, self).__init__(length=length, **kwargs)
+
+class UnicodeText(Text):
+    """A synonym for Text(convert_unicode=True, assert_unicode='warn')."""
+
+    def __init__(self, length=None, **kwargs):
+        """
+        Create a Unicode-converting Text type.
+
+        :param length: optional, a length for the column for use in
+          DDL statements.  May be safely omitted if no ``CREATE
+          TABLE`` will be issued.  Certain databases may require a
+          *length* for use in DDL, and will raise an exception when
+          the ``CREATE TABLE`` DDL is issued.  Whether the value is
+          interpreted as bytes or characters is database specific.
+
+        """
+        kwargs.setdefault('convert_unicode', True)
+        kwargs.setdefault('assert_unicode', 'warn')
+        super(UnicodeText, self).__init__(length=length, **kwargs)
+
+
+class Integer(TypeEngine):
+    """A type for ``int`` integers."""
+
+    def get_dbapi_type(self, dbapi):
+        return dbapi.NUMBER
+
+
+class SmallInteger(Integer):
+    """A type for smaller ``int`` integers.
+
+    Typically generates a ``SMALLINT`` in DDL, and otherwise acts like
+    a normal :class:`Integer` on the Python side.
+
+    """
+
+Smallinteger = SmallInteger
+
+class Numeric(TypeEngine):
+    """A type for fixed precision numbers.
+
+    Typically generates DECIMAL or NUMERIC.  Returns
+    ``decimal.Decimal`` objects by default.
+
+    """
+
+    def __init__(self, precision=10, scale=2, asdecimal=True, length=None):
+        """
+        Construct a Numeric.
+
+        :param precision: the numeric precision for use in DDL ``CREATE TABLE``.
+
+        :param scale: the numeric scale for use in DDL ``CREATE TABLE``.
+
+        :param asdecimal: default True.  If False, values will be
+          returned as-is from the DB-API, and may be either
+          ``Decimal`` or ``float`` types depending on the DB-API in
+          use.
+
+        """
+        if length:
+            util.warn_deprecated("'length' is deprecated for Numeric.  Use 'scale'.")
+            scale = length
+        self.precision = precision
+        self.scale = scale
+        self.asdecimal = asdecimal
+
+    def adapt(self, impltype):
+        return impltype(precision=self.precision, scale=self.scale, asdecimal=self.asdecimal)
+
+    def get_dbapi_type(self, dbapi):
+        return dbapi.NUMBER
+
+    def bind_processor(self, dialect):
+        def process(value):
+            if value is not None:
+                return float(value)
+            else:
+                return value
+        return process
+
+    def result_processor(self, dialect):
+        if self.asdecimal:
+            def process(value):
+                if value is not None:
+                    return _python_Decimal(str(value))
+                else:
+                    return value
+            return process
+        else:
+            return None
+
+
+class Float(Numeric):
+    """A type for ``float`` numbers."""
+
+    def __init__(self, precision=10, asdecimal=False, **kwargs):
+        """
+        Construct a Float.
+
+        :param precision: the numeric precision for use in DDL ``CREATE TABLE``.
+
+        """
+        self.precision = precision
+        self.asdecimal = asdecimal
+
+    def adapt(self, impltype):
+        return impltype(precision=self.precision, asdecimal=self.asdecimal)
+
+
+class DateTime(TypeEngine):
+    """A type for ``datetime.datetime()`` objects.
+
+    Date and time types return objects from the Python ``datetime``
+    module.  Most DBAPIs have built in support for the datetime
+    module, with the noted exception of SQLite.  In the case of
+    SQLite, date and time types are stored as strings which are then
+    converted back to datetime objects when rows are returned.
+
+    """
+
+    def __init__(self, timezone=False):
+        self.timezone = timezone
+
+    def adapt(self, impltype):
+        return impltype(timezone=self.timezone)
+
+    def get_dbapi_type(self, dbapi):
+        return dbapi.DATETIME
+
+
+class Date(TypeEngine):
+    """A type for ``datetime.date()`` objects."""
+
+    def get_dbapi_type(self, dbapi):
+        return dbapi.DATETIME
+
+
+class Time(TypeEngine):
+    """A type for ``datetime.time()`` objects."""
+
+    def __init__(self, timezone=False):
+        self.timezone = timezone
+
+    def adapt(self, impltype):
+        return impltype(timezone=self.timezone)
+
+    def get_dbapi_type(self, dbapi):
+        return dbapi.DATETIME
+
+
+class Binary(TypeEngine):
+    """A type for binary byte data.
+
+    The Binary type generates BLOB or BYTEA when tables are created,
+    and also converts incoming values using the ``Binary`` callable
+    provided by each DB-API.
+
+    """
+
+    def __init__(self, length=None):
+        """
+        Construct a Binary type.
+
+        :param length: optional, a length for the column for use in
+          DDL statements.  May be safely omitted if no ``CREATE
+          TABLE`` will be issued.  Certain databases may require a
+          *length* for use in DDL, and will raise an exception when
+          the ``CREATE TABLE`` DDL is issued.
+
+        """
+        self.length = length
+
+    def bind_processor(self, dialect):
+        DBAPIBinary = dialect.dbapi.Binary
+        def process(value):
+            if value is not None:
+                return DBAPIBinary(value)
+            else:
+                return None
+        return process
+
+    def adapt(self, impltype):
+        return impltype(length=self.length)
+
+    def get_dbapi_type(self, dbapi):
+        return dbapi.BINARY
+
+
+class PickleType(MutableType, TypeDecorator):
+    """Holds Python objects.
+
+    PickleType builds upon the Binary type to apply Python's
+    ``pickle.dumps()`` to incoming objects, and ``pickle.loads()`` on
+    the way out, allowing any pickleable Python object to be stored as
+    a serialized binary field.
+
+    """
+
+    impl = Binary
+
+    def __init__(self, protocol=pickle.HIGHEST_PROTOCOL, pickler=None, mutable=True, comparator=None):
+        """
+        Construct a PickleType.
+
+        :param protocol: defaults to ``pickle.HIGHEST_PROTOCOL``.
+
+        :param pickler: defaults to cPickle.pickle or pickle.pickle if
+          cPickle is not available.  May be any object with
+          pickle-compatible ``dumps` and ``loads`` methods.
+
+        :param mutable: defaults to True; implements
+          :meth:`AbstractType.is_mutable`.   When ``True``, incoming
+          objects *must* provide an ``__eq__()`` method which 
+          performs the desired deep comparison of members, or the 
+          ``comparator`` argument must be present.  Otherwise,
+          comparisons are done by comparing pickle strings.
+          The pickle form of comparison is a deprecated usage and will
+          raise a warning.
+
+        :param comparator: optional. a 2-arg callable predicate used
+          to compare values of this type.  Otherwise, either
+          the == operator is used to compare values, or if mutable==True
+          and the incoming object does not implement __eq__(), the value
+          of pickle.dumps(obj) is compared.  The last option is a deprecated
+          usage and will raise a warning.
+
+        """
+        self.protocol = protocol
+        self.pickler = pickler or pickle
+        self.mutable = mutable
+        self.comparator = comparator
+        super(PickleType, self).__init__()
+
+    def process_bind_param(self, value, dialect):
+        dumps = self.pickler.dumps
+        protocol = self.protocol
+        if value is None:
+            return None
+        return dumps(value, protocol)
+
+    def process_result_value(self, value, dialect):
+        loads = self.pickler.loads
+        if value is None:
+            return None
+        return loads(str(value))
+
+    def copy_value(self, value):
+        if self.mutable:
+            return self.pickler.loads(self.pickler.dumps(value, self.protocol))
+        else:
+            return value
+
+    def compare_values(self, x, y):
+        if self.comparator:
+            return self.comparator(x, y)
+        elif self.mutable and not hasattr(x, '__eq__') and x is not None:
+            util.warn_deprecated("Objects stored with PickleType when mutable=True must implement __eq__() for reliable comparison.")
+            return self.pickler.dumps(x, self.protocol) == self.pickler.dumps(y, self.protocol)
+        else:
+            return x == y
+
+    def is_mutable(self):
+        return self.mutable
+
+
+class Boolean(TypeEngine):
+    """A bool datatype.
+
+    Boolean typically uses BOOLEAN or SMALLINT on the DDL side, and on
+    the Python side deals in ``True`` or ``False``.
+
+    """
+
+
+class Interval(TypeDecorator):
+    """A type for ``datetime.timedelta()`` objects.
+
+    The Interval type deals with ``datetime.timedelta`` objects.  In
+    PostgreSQL, the native ``INTERVAL`` type is used; for others, the
+    value is stored as a date which is relative to the "epoch"
+    (Jan. 1, 1970).
+
+    """
+
+    impl = TypeEngine
+
+    def __init__(self):
+        super(Interval, self).__init__()
+        import sqlalchemy.databases.postgres as pg
+        self.__supported = {pg.PGDialect:pg.PGInterval}
+        del pg
+
+    def load_dialect_impl(self, dialect):
+        if dialect.__class__ in self.__supported:
+            return self.__supported[dialect.__class__]()
+        else:
+            return dialect.type_descriptor(DateTime)
+
+    def process_bind_param(self, value, dialect):
+        if dialect.__class__ in self.__supported:
+            return value
+        else:
+            if value is None:
+                return None
+            return dt.datetime.utcfromtimestamp(0) + value
+
+    def process_result_value(self, value, dialect):
+        if dialect.__class__ in self.__supported:
+            return value
+        else:
+            if value is None:
+                return None
+            return value - dt.datetime.utcfromtimestamp(0)
+
+class FLOAT(Float):
+    """The SQL FLOAT type."""
+
+
+class NUMERIC(Numeric):
+    """The SQL NUMERIC type."""
+
+
+class DECIMAL(Numeric):
+    """The SQL DECIMAL type."""
+
+
+class INT(Integer):
+    """The SQL INT or INTEGER type."""
+
+
+INTEGER = INT
+
+class SMALLINT(Smallinteger):
+    """The SQL SMALLINT type."""
+
+
+class TIMESTAMP(DateTime):
+    """The SQL TIMESTAMP type."""
+
+
+class DATETIME(DateTime):
+    """The SQL DATETIME type."""
+
+
+class DATE(Date):
+    """The SQL DATE type."""
+
+
+class TIME(Time):
+    """The SQL TIME type."""
+
+
+TEXT = Text
+
+class CLOB(Text):
+    """The SQL CLOB type."""
+
+
+class VARCHAR(String):
+    """The SQL VARCHAR type."""
+
+
+class CHAR(String):
+    """The SQL CHAR type."""
+
+
+class NCHAR(Unicode):
+    """The SQL NCHAR type."""
+
+
+class BLOB(Binary):
+    """The SQL BLOB type."""
+
+
+class BOOLEAN(Boolean):
+    """The SQL BOOLEAN type."""
+
+NULLTYPE = NullType()
+
+# using VARCHAR/NCHAR so that we dont get the genericized "String"
+# type which usually resolves to TEXT/CLOB
+type_map = {
+    str : VARCHAR,
+    unicode : NCHAR,
+    int : Integer,
+    float : Numeric,
+    bool: Boolean,
+    _python_Decimal : Numeric,
+    dt.date : Date,
+    dt.datetime : DateTime,
+    dt.time : Time,
+    dt.timedelta : Interval,
+    type(None): NullType
+}
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/orm/identity.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/orm/identity.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/orm/identity.py (revision 3)
@@ -0,0 +1,224 @@
+# identity.py
+# Copyright (C) the SQLAlchemy authors and contributors
+#
+# This module is part of SQLAlchemy and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+import weakref
+
+from sqlalchemy import util as base_util
+from sqlalchemy.orm import attributes
+
+
+class IdentityMap(dict):
+    def __init__(self):
+        self._mutable_attrs = set()
+        self._modified = set()
+        self._wr = weakref.ref(self)
+
+    def replace(self, state):
+        raise NotImplementedError()
+        
+    def add(self, state):
+        raise NotImplementedError()
+    
+    def remove(self, state):
+        raise NotImplementedError()
+    
+    def update(self, dict):
+        raise NotImplementedError("IdentityMap uses add() to insert data")
+    
+    def clear(self):
+        raise NotImplementedError("IdentityMap uses remove() to remove data")
+        
+    def _manage_incoming_state(self, state):
+        state._instance_dict = self._wr
+        
+        if state.modified:
+            self._modified.add(state)  
+        if state.manager.mutable_attributes:
+            self._mutable_attrs.add(state)
+    
+    def _manage_removed_state(self, state):
+        del state._instance_dict
+        self._mutable_attrs.discard(state)
+        self._modified.discard(state)
+
+    def _dirty_states(self):
+        return self._modified.union(s for s in list(self._mutable_attrs)
+                                    if s.modified)
+
+    def check_modified(self):
+        """return True if any InstanceStates present have been marked as 'modified'."""
+        
+        if self._modified:
+            return True
+        else:
+            for state in list(self._mutable_attrs):
+                if state.modified:
+                    return True
+        return False
+            
+    def has_key(self, key):
+        return key in self
+        
+    def popitem(self):
+        raise NotImplementedError("IdentityMap uses remove() to remove data")
+
+    def pop(self, key, *args):
+        raise NotImplementedError("IdentityMap uses remove() to remove data")
+
+    def setdefault(self, key, default=None):
+        raise NotImplementedError("IdentityMap uses add() to insert data")
+
+    def copy(self):
+        raise NotImplementedError()
+
+    def __setitem__(self, key, value):
+        raise NotImplementedError("IdentityMap uses add() to insert data")
+
+    def __delitem__(self, key):
+        raise NotImplementedError("IdentityMap uses remove() to remove data")
+        
+class WeakInstanceDict(IdentityMap):
+
+    def __getitem__(self, key):
+        state = dict.__getitem__(self, key)
+        o = state.obj()
+        if o is None:
+            o = state._is_really_none()
+        if o is None:
+            raise KeyError, key
+        return o
+
+    def __contains__(self, key):
+        try:
+            if dict.__contains__(self, key):
+                state = dict.__getitem__(self, key)
+                o = state.obj()
+                if o is None:
+                    o = state._is_really_none()
+            else:
+                return False
+        except KeyError:
+            return False
+        return o is not None
+    
+    def contains_state(self, state):
+        return dict.get(self, state.key) is state
+        
+    def replace(self, state):
+        if dict.__contains__(self, state.key):
+            existing = dict.__getitem__(self, state.key)
+            if existing is not state:
+                self._manage_removed_state(existing)
+            else:
+                return
+                
+        dict.__setitem__(self, state.key, state)
+        self._manage_incoming_state(state)
+                 
+    def add(self, state):
+        if state.key in self:
+            if dict.__getitem__(self, state.key) is not state:
+                raise AssertionError("A conflicting state is already present in the identity map for key %r" % (state.key, ))
+        else:
+            dict.__setitem__(self, state.key, state)
+            self._manage_incoming_state(state)
+    
+    def remove_key(self, key):
+        state = dict.__getitem__(self, key)
+        self.remove(state)
+        
+    def remove(self, state):
+        if dict.pop(self, state.key) is not state:
+            raise AssertionError("State %s is not present in this identity map" % state)
+        self._manage_removed_state(state)
+    
+    def discard(self, state):
+        if self.contains_state(state):
+            dict.__delitem__(self, state.key)
+            self._manage_removed_state(state)
+        
+    def get(self, key, default=None):
+        try:
+            return self[key]
+        except KeyError:
+            return default
+            
+    def items(self):
+        return list(self.iteritems())
+
+    def iteritems(self):
+        for state in dict.itervalues(self):
+            value = state.obj()
+            if value is not None:
+                yield state.key, value
+
+    def itervalues(self):
+        for state in dict.itervalues(self):
+            instance = state.obj()
+            if instance is not None:
+                yield instance
+
+    def values(self):
+        return list(self.itervalues())
+
+    def all_states(self):
+        return dict.values(self)
+    
+    def prune(self):
+        return 0
+        
+class StrongInstanceDict(IdentityMap):
+    def all_states(self):
+        return [attributes.instance_state(o) for o in self.values()]
+    
+    def contains_state(self, state):
+        return state.key in self and attributes.instance_state(self[state.key]) is state
+    
+    def replace(self, state):
+        if dict.__contains__(self, state.key):
+            existing = dict.__getitem__(self, state.key)
+            existing = attributes.instance_state(existing)
+            if existing is not state:
+                self._manage_removed_state(existing)
+            else:
+                return
+
+        dict.__setitem__(self, state.key, state.obj())
+        self._manage_incoming_state(state)
+
+    def add(self, state):
+        if state.key in self:
+            if attributes.instance_state(dict.__getitem__(self, state.key)) is not state:
+                raise AssertionError("A conflicting state is already present in the identity map for key %r" % (state.key, ))
+        else:
+            dict.__setitem__(self, state.key, state.obj())
+            self._manage_incoming_state(state)
+        
+    def remove(self, state):
+        if attributes.instance_state(dict.pop(self, state.key)) is not state:
+            raise AssertionError("State %s is not present in this identity map" % state)
+        self._manage_removed_state(state)
+    
+    def discard(self, state):
+        if self.contains_state(state):
+            dict.__delitem__(self, state.key)
+            self._manage_removed_state(state)
+            
+    def remove_key(self, key):
+        state = attributes.instance_state(dict.__getitem__(self, key))
+        self.remove(state)
+
+    def prune(self):
+        """prune unreferenced, non-dirty states."""
+        
+        ref_count = len(self)
+        dirty = [s.obj() for s in self.all_states() if s.check_modified()]
+        keepers = weakref.WeakValueDictionary(self)
+        dict.clear(self)
+        dict.update(self, keepers)
+        self.modified = bool(dirty)
+        return ref_count - len(self)
+        
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/orm/properties.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/orm/properties.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/orm/properties.py (revision 3)
@@ -0,0 +1,1199 @@
+# properties.py
+# Copyright (C) 2005, 2006, 2007, 2008, 2009 Michael Bayer mike_mp@zzzcomputing.com
+#
+# This module is part of SQLAlchemy and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+"""MapperProperty implementations.
+
+This is a private module which defines the behavior of invidual ORM-mapped
+attributes.
+
+"""
+
+from sqlalchemy import sql, util, log
+import sqlalchemy.exceptions as sa_exc
+from sqlalchemy.sql.util import ClauseAdapter, criterion_as_pairs, join_condition
+from sqlalchemy.sql import operators, expression
+from sqlalchemy.orm import (
+    attributes, dependency, mapper, object_mapper, strategies,
+    )
+from sqlalchemy.orm.util import CascadeOptions, _class_to_mapper, _orm_annotate, _orm_deannotate
+from sqlalchemy.orm.interfaces import (
+    MANYTOMANY, MANYTOONE, MapperProperty, ONETOMANY, PropComparator,
+    StrategizedProperty,
+    )
+
+__all__ = ('ColumnProperty', 'CompositeProperty', 'SynonymProperty',
+           'ComparableProperty', 'RelationProperty', 'BackRef')
+
+
+class ColumnProperty(StrategizedProperty):
+    """Describes an object attribute that corresponds to a table column."""
+
+    def __init__(self, *columns, **kwargs):
+        """Construct a ColumnProperty.
+
+        :param \*columns: The list of `columns` describes a single
+          object property. If there are multiple tables joined
+          together for the mapper, this list represents the equivalent
+          column as it appears across each table.
+
+        :param group:
+
+        :param deferred:
+
+        :param comparator_factory:
+
+        :param descriptor:
+
+        :param extension:
+
+        """
+        self.columns = [expression._labeled(c) for c in columns]
+        self.group = kwargs.pop('group', None)
+        self.deferred = kwargs.pop('deferred', False)
+        self.no_instrument = kwargs.pop('_no_instrument', False)
+        self.comparator_factory = kwargs.pop('comparator_factory', self.__class__.Comparator)
+        self.descriptor = kwargs.pop('descriptor', None)
+        self.extension = kwargs.pop('extension', None)
+        if kwargs:
+            raise TypeError(
+                "%s received unexpected keyword argument(s): %s" % (
+                    self.__class__.__name__, ', '.join(sorted(kwargs.keys()))))
+
+        util.set_creation_order(self)
+        if self.no_instrument:
+            self.strategy_class = strategies.UninstrumentedColumnLoader
+        elif self.deferred:
+            self.strategy_class = strategies.DeferredColumnLoader
+        else:
+            self.strategy_class = strategies.ColumnLoader
+    
+    def instrument_class(self, mapper):
+        if self.no_instrument:
+            return
+        
+        attributes.register_descriptor(
+            mapper.class_, 
+            self.key, 
+            comparator=self.comparator_factory(self, mapper), 
+            parententity=mapper,
+            property_=self
+            )
+        
+    def do_init(self):
+        super(ColumnProperty, self).do_init()
+        if len(self.columns) > 1 and self.parent.primary_key.issuperset(self.columns):
+            util.warn(
+                ("On mapper %s, primary key column '%s' is being combined "
+                 "with distinct primary key column '%s' in attribute '%s'.  "
+                 "Use explicit properties to give each column its own mapped "
+                 "attribute name.") % (self.parent, self.columns[1],
+                                       self.columns[0], self.key))
+
+    def copy(self):
+        return ColumnProperty(deferred=self.deferred, group=self.group, *self.columns)
+
+    def getattr(self, state, column):
+        return state.get_impl(self.key).get(state, state.dict)
+
+    def getcommitted(self, state, column, passive=False):
+        return state.get_impl(self.key).get_committed_value(state, state.dict, passive=passive)
+
+    def setattr(self, state, value, column):
+        state.get_impl(self.key).set(state, state.dict, value, None)
+
+    def merge(self, session, source, dest, dont_load, _recursive):
+        value = attributes.instance_state(source).value_as_iterable(
+            self.key, passive=True)
+        if value:
+            setattr(dest, self.key, value[0])
+        else:
+            attributes.instance_state(dest).expire_attributes([self.key])
+
+    def get_col_value(self, column, value):
+        return value
+
+    class Comparator(PropComparator):
+        @util.memoized_instancemethod
+        def __clause_element__(self):
+            if self.adapter:
+                return self.adapter(self.prop.columns[0])
+            else:
+                return self.prop.columns[0]._annotate({"parententity": self.mapper, "parentmapper":self.mapper})
+                
+        def operate(self, op, *other, **kwargs):
+            return op(self.__clause_element__(), *other, **kwargs)
+
+        def reverse_operate(self, op, other, **kwargs):
+            col = self.__clause_element__()
+            return op(col._bind_param(other), col, **kwargs)
+    
+    # TODO: legacy..do we need this ? (0.5)
+    ColumnComparator = Comparator
+    
+    def __str__(self):
+        return str(self.parent.class_.__name__) + "." + self.key
+
+log.class_logger(ColumnProperty)
+
+class CompositeProperty(ColumnProperty):
+    """subclasses ColumnProperty to provide composite type support."""
+    
+    def __init__(self, class_, *columns, **kwargs):
+        if 'comparator' in kwargs:
+            util.warn_deprecated("The 'comparator' argument to CompositeProperty is deprecated.  Use comparator_factory.")
+            kwargs['comparator_factory'] = kwargs['comparator']
+        super(CompositeProperty, self).__init__(*columns, **kwargs)
+        self._col_position_map = util.column_dict((c, i) for i, c in enumerate(columns))
+        self.composite_class = class_
+        self.strategy_class = strategies.CompositeColumnLoader
+
+    def copy(self):
+        return CompositeProperty(deferred=self.deferred, group=self.group, composite_class=self.composite_class, *self.columns)
+
+    def do_init(self):
+        # skip over ColumnProperty's do_init(),
+        # which issues assertions that do not apply to CompositeColumnProperty
+        super(ColumnProperty, self).do_init()
+
+    def getattr(self, state, column):
+        obj = state.get_impl(self.key).get(state, state.dict)
+        return self.get_col_value(column, obj)
+
+    def getcommitted(self, state, column, passive=False):
+        # TODO: no coverage here
+        obj = state.get_impl(self.key).get_committed_value(state, state.dict, passive=passive)
+        return self.get_col_value(column, obj)
+
+    def setattr(self, state, value, column):
+
+        obj = state.get_impl(self.key).get(state, state.dict)
+        if obj is None:
+            obj = self.composite_class(*[None for c in self.columns])
+            state.get_impl(self.key).set(state, state.dict, obj, None)
+
+        if hasattr(obj, '__set_composite_values__'):
+            values = list(obj.__composite_values__())
+            values[self._col_position_map[column]] = value
+            obj.__set_composite_values__(*values)
+        else:
+            setattr(obj, column.key, value)
+            
+    def get_col_value(self, column, value):
+        if value is None:
+            return None
+        for a, b in zip(self.columns, value.__composite_values__()):
+            if a is column:
+                return b
+
+    class Comparator(PropComparator):
+        def __clause_element__(self):
+            if self.adapter:
+                # TODO: test coverage for adapted composite comparison
+                return expression.ClauseList(*[self.adapter(x) for x in self.prop.columns])
+            else:
+                return expression.ClauseList(*self.prop.columns)
+        
+        __hash__ = None
+        
+        def __eq__(self, other):
+            if other is None:
+                values = [None] * len(self.prop.columns)
+            else:
+                values = other.__composite_values__()
+            return sql.and_(*[a==b for a, b in zip(self.prop.columns, values)])
+            
+        def __ne__(self, other):
+            return sql.not_(self.__eq__(other))
+
+    def __str__(self):
+        return str(self.parent.class_.__name__) + "." + self.key
+
+class ConcreteInheritedProperty(MapperProperty):
+    extension = None
+
+    def setup(self, context, entity, path, adapter, **kwargs):
+        pass
+
+    def create_row_processor(self, selectcontext, path, mapper, row, adapter):
+        return (None, None)
+
+    def instrument_class(self, mapper):
+        def warn():
+            raise AttributeError("Concrete %s does not implement attribute %r at "
+                "the instance level.  Add this property explicitly to %s." % 
+                (self.parent, self.key, self.parent))
+
+        class NoninheritedConcreteProp(object):
+            def __set__(s, obj, value):
+                warn()
+            def __delete__(s, obj):
+                warn()
+            def __get__(s, obj, owner):
+                warn()
+
+        comparator_callable = None
+        # TODO: put this process into a deferred callable?
+        for m in self.parent.iterate_to_root():
+            p = m._get_property(self.key)
+            if not isinstance(p, ConcreteInheritedProperty):
+                comparator_callable = p.comparator_factory
+                break
+
+        attributes.register_descriptor(
+            mapper.class_, 
+            self.key, 
+            comparator=comparator_callable(self, mapper), 
+            parententity=mapper,
+            property_=self,
+            proxy_property=NoninheritedConcreteProp()
+            )
+
+
+class SynonymProperty(MapperProperty):
+
+    extension = None
+
+    def __init__(self, name, map_column=None, descriptor=None, comparator_factory=None):
+        self.name = name
+        self.map_column = map_column
+        self.descriptor = descriptor
+        self.comparator_factory = comparator_factory
+        util.set_creation_order(self)
+
+    def setup(self, context, entity, path, adapter, **kwargs):
+        pass
+
+    def create_row_processor(self, selectcontext, path, mapper, row, adapter):
+        return (None, None)
+
+    def instrument_class(self, mapper):
+        class_ = self.parent.class_
+
+        if self.descriptor is None:
+            class SynonymProp(object):
+                def __set__(s, obj, value):
+                    setattr(obj, self.name, value)
+                def __delete__(s, obj):
+                    delattr(obj, self.name)
+                def __get__(s, obj, owner):
+                    if obj is None:
+                        return s
+                    return getattr(obj, self.name)
+
+            self.descriptor = SynonymProp()
+
+        def comparator_callable(prop, mapper):
+            def comparator():
+                prop = self.parent._get_property(self.key, resolve_synonyms=True)
+                if self.comparator_factory:
+                    return self.comparator_factory(prop, mapper)
+                else:
+                    return prop.comparator_factory(prop, mapper)
+            return comparator
+
+        attributes.register_descriptor(
+            mapper.class_, 
+            self.key, 
+            comparator=comparator_callable(self, mapper), 
+            parententity=mapper,
+            property_=self,
+            proxy_property=self.descriptor
+            )
+
+    def merge(self, session, source, dest, dont_load, _recursive):
+        pass
+        
+log.class_logger(SynonymProperty)
+
+class ComparableProperty(MapperProperty):
+    """Instruments a Python property for use in query expressions."""
+
+    extension = None
+    
+    def __init__(self, comparator_factory, descriptor=None):
+        self.descriptor = descriptor
+        self.comparator_factory = comparator_factory
+        util.set_creation_order(self)
+
+    def instrument_class(self, mapper):
+        """Set up a proxy to the unmanaged descriptor."""
+
+        attributes.register_descriptor(
+            mapper.class_, 
+            self.key, 
+            comparator=self.comparator_factory(self, mapper), 
+            parententity=mapper,
+            property_=self,
+            proxy_property=self.descriptor
+            )
+
+    def setup(self, context, entity, path, adapter, **kwargs):
+        pass
+
+    def create_row_processor(self, selectcontext, path, mapper, row, adapter):
+        return (None, None)
+
+    def merge(self, session, source, dest, dont_load, _recursive):
+        pass
+
+
+class RelationProperty(StrategizedProperty):
+    """Describes an object property that holds a single item or list
+    of items that correspond to a related database table.
+    """
+
+    def __init__(self, argument,
+        secondary=None, primaryjoin=None,
+        secondaryjoin=None, 
+        foreign_keys=None,
+        uselist=None,
+        order_by=False,
+        backref=None,
+        back_populates=None,
+        post_update=False,
+        cascade=False, extension=None,
+        viewonly=False, lazy=True,
+        collection_class=None, passive_deletes=False,
+        passive_updates=True, remote_side=None,
+        enable_typechecks=True, join_depth=None,
+        comparator_factory=None,
+        single_parent=False,
+        strategy_class=None, _local_remote_pairs=None, query_class=None):
+
+        self.uselist = uselist
+        self.argument = argument
+        self.secondary = secondary
+        self.primaryjoin = primaryjoin
+        self.secondaryjoin = secondaryjoin
+        self.post_update = post_update
+        self.direction = None
+        self.viewonly = viewonly
+        self.lazy = lazy
+        self.single_parent = single_parent
+        self._foreign_keys = foreign_keys
+        self.collection_class = collection_class
+        self.passive_deletes = passive_deletes
+        self.passive_updates = passive_updates
+        self.remote_side = remote_side
+        self.enable_typechecks = enable_typechecks
+        self.query_class = query_class
+
+        self.join_depth = join_depth
+        self.local_remote_pairs = _local_remote_pairs
+        self.extension = extension
+        self.comparator_factory = comparator_factory or RelationProperty.Comparator
+        self.comparator = self.comparator_factory(self, None)
+        util.set_creation_order(self)
+
+        if strategy_class:
+            self.strategy_class = strategy_class
+        elif self.lazy == 'dynamic':
+            from sqlalchemy.orm import dynamic
+            self.strategy_class = dynamic.DynaLoader
+        elif self.lazy is False:
+            self.strategy_class = strategies.EagerLoader
+        elif self.lazy is None:
+            self.strategy_class = strategies.NoLoader
+        else:
+            self.strategy_class = strategies.LazyLoader
+
+        self._reverse_property = set()
+
+        if cascade is not False:
+            self.cascade = CascadeOptions(cascade)
+        else:
+            self.cascade = CascadeOptions("save-update, merge")
+
+        if self.passive_deletes == 'all' and ("delete" in self.cascade or "delete-orphan" in self.cascade):
+            raise sa_exc.ArgumentError("Can't set passive_deletes='all' in conjunction with 'delete' or 'delete-orphan' cascade")
+
+        self.order_by = order_by
+
+        self.back_populates = back_populates
+
+        if self.back_populates:
+            if backref:
+                raise sa_exc.ArgumentError("backref and back_populates keyword arguments are mutually exclusive")
+            self.backref = None
+        elif isinstance(backref, basestring):
+            # propagate explicitly sent primary/secondary join conditions to the BackRef object if
+            # just a string was sent
+            if secondary is not None:
+                # reverse primary/secondary in case of a many-to-many
+                self.backref = BackRef(backref, primaryjoin=secondaryjoin, 
+                                    secondaryjoin=primaryjoin, passive_updates=self.passive_updates)
+            else:
+                self.backref = BackRef(backref, primaryjoin=primaryjoin, 
+                                    secondaryjoin=secondaryjoin, passive_updates=self.passive_updates)
+        else:
+            self.backref = backref
+
+    def instrument_class(self, mapper):
+        attributes.register_descriptor(
+            mapper.class_, 
+            self.key, 
+            comparator=self.comparator_factory(self, mapper), 
+            parententity=mapper,
+            property_=self
+            )
+
+    class Comparator(PropComparator):
+        def __init__(self, prop, mapper, of_type=None, adapter=None):
+            self.prop = prop
+            self.mapper = mapper
+            self.adapter = adapter
+            if of_type:
+                self._of_type = _class_to_mapper(of_type)
+
+        def adapted(self, adapter):
+            """Return a copy of this PropComparator which will use the given adaption function
+            on the local side of generated expressions.
+
+            """
+            return self.__class__(self.property, self.mapper, getattr(self, '_of_type', None), adapter)
+        
+        @property
+        def parententity(self):
+            return self.property.parent
+
+        def __clause_element__(self):
+            elem = self.property.parent._with_polymorphic_selectable
+            if self.adapter:
+                return self.adapter(elem)
+            else:
+                return elem
+
+        def operate(self, op, *other, **kwargs):
+            return op(self, *other, **kwargs)
+
+        def reverse_operate(self, op, other, **kwargs):
+            return op(self, *other, **kwargs)
+
+        def of_type(self, cls):
+            return RelationProperty.Comparator(self.property, self.mapper, cls, adapter=self.adapter)
+
+        def in_(self, other):
+            raise NotImplementedError("in_() not yet supported for relations.  For a "
+                    "simple many-to-one, use in_() against the set of foreign key values.")
+            
+        __hash__ = None
+        
+        def __eq__(self, other):
+            if other is None:
+                if self.property.direction in [ONETOMANY, MANYTOMANY]:
+                    return ~self._criterion_exists()
+                else:
+                    return _orm_annotate(self.property._optimized_compare(None, adapt_source=self.adapter))
+            elif self.property.uselist:
+                raise sa_exc.InvalidRequestError("Can't compare a collection to an object or collection; use contains() to test for membership.")
+            else:
+                return _orm_annotate(self.property._optimized_compare(other, adapt_source=self.adapter))
+
+        def _criterion_exists(self, criterion=None, **kwargs):
+            if getattr(self, '_of_type', None):
+                target_mapper = self._of_type
+                to_selectable = target_mapper._with_polymorphic_selectable
+                if self.property._is_self_referential():
+                    to_selectable = to_selectable.alias()
+
+                single_crit = target_mapper._single_table_criterion
+                if single_crit:
+                    if criterion is not None:
+                        criterion = single_crit & criterion
+                    else:
+                        criterion = single_crit
+            else:
+                to_selectable = None
+
+            if self.adapter:
+                source_selectable = self.__clause_element__()
+            else:
+                source_selectable = None
+            
+            pj, sj, source, dest, secondary, target_adapter = \
+                self.property._create_joins(dest_polymorphic=True, dest_selectable=to_selectable, source_selectable=source_selectable)
+
+            for k in kwargs:
+                crit = self.property.mapper.class_manager[k] == kwargs[k]
+                if criterion is None:
+                    criterion = crit
+                else:
+                    criterion = criterion & crit
+            
+            # annotate the *local* side of the join condition, in the case of pj + sj this
+            # is the full primaryjoin, in the case of just pj its the local side of
+            # the primaryjoin.  
+            if sj:
+                j = _orm_annotate(pj) & sj
+            else:
+                j = _orm_annotate(pj, exclude=self.property.remote_side)
+            
+            if criterion and target_adapter:
+                # limit this adapter to annotated only?
+                criterion = target_adapter.traverse(criterion)
+
+            # only have the "joined left side" of what we return be subject to Query adaption.  The right
+            # side of it is used for an exists() subquery and should not correlate or otherwise reach out
+            # to anything in the enclosing query.
+            if criterion:
+                criterion = criterion._annotate({'_halt_adapt': True})
+            
+            crit = j & criterion
+            
+            return sql.exists([1], crit, from_obj=dest).correlate(source)
+
+        def any(self, criterion=None, **kwargs):
+            if not self.property.uselist:
+                raise sa_exc.InvalidRequestError("'any()' not implemented for scalar attributes. Use has().")
+
+            return self._criterion_exists(criterion, **kwargs)
+
+        def has(self, criterion=None, **kwargs):
+            if self.property.uselist:
+                raise sa_exc.InvalidRequestError("'has()' not implemented for collections.  Use any().")
+            return self._criterion_exists(criterion, **kwargs)
+
+        def contains(self, other, **kwargs):
+            if not self.property.uselist:
+                raise sa_exc.InvalidRequestError("'contains' not implemented for scalar attributes.  Use ==")
+            clause = self.property._optimized_compare(other, adapt_source=self.adapter)
+
+            if self.property.secondaryjoin:
+                clause.negation_clause = self.__negated_contains_or_equals(other)
+
+            return clause
+
+        def __negated_contains_or_equals(self, other):
+            if self.property.direction == MANYTOONE:
+                state = attributes.instance_state(other)
+                strategy = self.property._get_strategy(strategies.LazyLoader)
+                
+                def state_bindparam(state, col):
+                    o = state.obj() # strong ref
+                    return lambda: self.property.mapper._get_committed_attr_by_column(o, col)
+                
+                def adapt(col):
+                    if self.adapter:
+                        return self.adapter(col)
+                    else:
+                        return col
+                        
+                if strategy.use_get:
+                    return sql.and_(*[
+                        sql.or_(
+                        adapt(x) != state_bindparam(state, y),
+                        adapt(x) == None)
+                        for (x, y) in self.property.local_remote_pairs])
+                    
+            criterion = sql.and_(*[x==y for (x, y) in zip(self.property.mapper.primary_key, self.property.mapper.primary_key_from_instance(other))])
+            return ~self._criterion_exists(criterion)
+
+        def __ne__(self, other):
+            if other is None:
+                if self.property.direction == MANYTOONE:
+                    return sql.or_(*[x!=None for x in self.property._foreign_keys])
+                else:
+                    return self._criterion_exists()
+            elif self.property.uselist:
+                raise sa_exc.InvalidRequestError("Can't compare a collection to an object or collection; use contains() to test for membership.")
+            else:
+                return self.__negated_contains_or_equals(other)
+
+        @util.memoized_property
+        def property(self):
+            self.prop.parent.compile()
+            return self.prop
+
+    def compare(self, op, value, value_is_parent=False):
+        if op == operators.eq:
+            if value is None:
+                if self.uselist:
+                    return ~sql.exists([1], self.primaryjoin)
+                else:
+                    return self._optimized_compare(None, value_is_parent=value_is_parent)
+            else:
+                return self._optimized_compare(value, value_is_parent=value_is_parent)
+        else:
+            return op(self.comparator, value)
+
+    def _optimized_compare(self, value, value_is_parent=False, adapt_source=None):
+        if value is not None:
+            value = attributes.instance_state(value)
+        return self._get_strategy(strategies.LazyLoader).\
+                lazy_clause(value, reverse_direction=not value_is_parent, alias_secondary=True, adapt_source=adapt_source)
+
+    def __str__(self):
+        return str(self.parent.class_.__name__) + "." + self.key
+
+    def merge(self, session, source, dest, dont_load, _recursive):
+        if not dont_load:
+            # TODO: no test coverage for recursive check
+            for r in self._reverse_property:
+                if (source, r) in _recursive:
+                    return
+
+        source_state = attributes.instance_state(source)
+        dest_state, dest_dict = attributes.instance_state(dest), attributes.instance_dict(dest)
+
+        if not "merge" in self.cascade:
+            dest_state.expire_attributes([self.key])
+            return
+
+        instances = source_state.value_as_iterable(self.key, passive=True)
+
+        if not instances:
+            return
+
+        if self.uselist:
+            dest_list = []
+            for current in instances:
+                _recursive[(current, self)] = True
+                obj = session._merge(current, dont_load=dont_load, _recursive=_recursive)
+                if obj is not None:
+                    dest_list.append(obj)
+            if dont_load:
+                coll = attributes.init_collection(dest_state, self.key)
+                for c in dest_list:
+                    coll.append_without_event(c)
+            else:
+                getattr(dest.__class__, self.key).impl._set_iterable(dest_state, dest_dict, dest_list)
+        else:
+            current = instances[0]
+            if current is not None:
+                _recursive[(current, self)] = True
+                obj = session._merge(current, dont_load=dont_load, _recursive=_recursive)
+                if obj is not None:
+                    if dont_load:
+                        dest_state.dict[self.key] = obj
+                    else:
+                        setattr(dest, self.key, obj)
+
+    def cascade_iterator(self, type_, state, visited_instances, halt_on=None):
+        if not type_ in self.cascade:
+            return
+
+        # only actively lazy load on the 'delete' cascade
+        if type_ != 'delete' or self.passive_deletes:
+            passive = attributes.PASSIVE_NO_INITIALIZE
+        else:
+            passive = attributes.PASSIVE_OFF
+
+        mapper = self.mapper.primary_mapper()
+        instances = state.value_as_iterable(self.key, passive=passive)
+        if instances:
+            for c in instances:
+                if c is not None and c not in visited_instances and (halt_on is None or not halt_on(c)):
+                    if not isinstance(c, self.mapper.class_):
+                        raise AssertionError("Attribute '%s' on class '%s' doesn't handle objects "
+                                    "of type '%s'" % (self.key, str(self.parent.class_), str(c.__class__)))
+                    visited_instances.add(c)
+
+                    # cascade using the mapper local to this object, so that its individual properties are located
+                    instance_mapper = object_mapper(c)
+                    yield (c, instance_mapper, attributes.instance_state(c))
+
+    def _add_reverse_property(self, key):
+        other = self.mapper._get_property(key)
+        self._reverse_property.add(other)
+        other._reverse_property.add(self)
+        
+        if not other._get_target().common_parent(self.parent):
+            raise sa_exc.ArgumentError("reverse_property %r on relation %s references "
+                    "relation %s, which does not reference mapper %s" % (key, self, other, self.parent))
+        
+        if self.direction in (ONETOMANY, MANYTOONE) and self.direction == other.direction:
+            raise sa_exc.ArgumentError("%s and back-reference %s are both of the same direction %r."
+                "  Did you mean to set remote_side on the many-to-one side ?" % (self, other, self.direction))
+        
+    def do_init(self):
+        self._get_target()
+        self._process_dependent_arguments()
+        self._determine_joins()
+        self._determine_synchronize_pairs()
+        self._determine_direction()
+        self._determine_local_remote_pairs()
+        self._post_init()
+        super(RelationProperty, self).do_init()
+
+    def _get_target(self):
+        if not hasattr(self, 'mapper'):
+            if isinstance(self.argument, type):
+                self.mapper = mapper.class_mapper(self.argument, compile=False)
+            elif isinstance(self.argument, mapper.Mapper):
+                self.mapper = self.argument
+            elif util.callable(self.argument):
+                # accept a callable to suit various deferred-configurational schemes
+                self.mapper = mapper.class_mapper(self.argument(), compile=False)
+            else:
+                raise sa_exc.ArgumentError("relation '%s' expects a class or a mapper argument (received: %s)" % (self.key, type(self.argument)))
+            assert isinstance(self.mapper, mapper.Mapper), self.mapper
+        return self.mapper
+        
+    def _process_dependent_arguments(self):
+
+        # accept callables for other attributes which may require deferred initialization
+        for attr in ('order_by', 'primaryjoin', 'secondaryjoin', 'secondary', '_foreign_keys', 'remote_side'):
+            if util.callable(getattr(self, attr)):
+                setattr(self, attr, getattr(self, attr)())
+
+        # in the case that InstrumentedAttributes were used to construct
+        # primaryjoin or secondaryjoin, remove the "_orm_adapt" annotation so these
+        # interact with Query in the same way as the original Table-bound Column objects
+        for attr in ('primaryjoin', 'secondaryjoin'):
+            val = getattr(self, attr)
+            if val is not None:
+                util.assert_arg_type(val, sql.ClauseElement, attr)
+                setattr(self, attr, _orm_deannotate(val))
+        
+        if self.order_by:
+            self.order_by = [expression._literal_as_column(x) for x in util.to_list(self.order_by)]
+        
+        self._foreign_keys = util.column_set(expression._literal_as_column(x) for x in util.to_column_set(self._foreign_keys))
+        self.remote_side = util.column_set(expression._literal_as_column(x) for x in util.to_column_set(self.remote_side))
+
+        if not self.parent.concrete:
+            for inheriting in self.parent.iterate_to_root():
+                if inheriting is not self.parent and inheriting._get_property(self.key, raiseerr=False):
+                    util.warn(
+                        ("Warning: relation '%s' on mapper '%s' supercedes "
+                         "the same relation on inherited mapper '%s'; this "
+                         "can cause dependency issues during flush") %
+                        (self.key, self.parent, inheriting))
+
+        # TODO: remove 'self.table'
+        self.target = self.table = self.mapper.mapped_table
+
+        if self.cascade.delete_orphan:
+            if self.parent.class_ is self.mapper.class_:
+                raise sa_exc.ArgumentError("In relationship '%s', can't establish 'delete-orphan' cascade "
+                            "rule on a self-referential relationship.  "
+                            "You probably want cascade='all', which includes delete cascading but not orphan detection." %(str(self)))
+            self.mapper.primary_mapper().delete_orphans.append((self.key, self.parent.class_))
+
+    def _determine_joins(self):
+        if self.secondaryjoin is not None and self.secondary is None:
+            raise sa_exc.ArgumentError("Property '" + self.key + "' specified with secondary join condition but no secondary argument")
+        # if join conditions were not specified, figure them out based on foreign keys
+
+        def _search_for_join(mapper, table):
+            # find a join between the given mapper's mapped table and the given table.
+            # will try the mapper's local table first for more specificity, then if not
+            # found will try the more general mapped table, which in the case of inheritance
+            # is a join.
+            try:
+                return join_condition(mapper.local_table, table)
+            except sa_exc.ArgumentError, e:
+                return join_condition(mapper.mapped_table, table)
+
+        try:
+            if self.secondary is not None:
+                if self.secondaryjoin is None:
+                    self.secondaryjoin = _search_for_join(self.mapper, self.secondary)
+                if self.primaryjoin is None:
+                    self.primaryjoin = _search_for_join(self.parent, self.secondary)
+            else:
+                if self.primaryjoin is None:
+                    self.primaryjoin = _search_for_join(self.parent, self.target)
+        except sa_exc.ArgumentError, e:
+            raise sa_exc.ArgumentError("Could not determine join condition between "
+                        "parent/child tables on relation %s.  "
+                        "Specify a 'primaryjoin' expression.  If this is a "
+                        "many-to-many relation, 'secondaryjoin' is needed as well." % (self))
+
+    def _col_is_part_of_mappings(self, column):
+        if self.secondary is None:
+            return self.parent.mapped_table.c.contains_column(column) or \
+                self.target.c.contains_column(column)
+        else:
+            return self.parent.mapped_table.c.contains_column(column) or \
+                self.target.c.contains_column(column) or \
+                self.secondary.c.contains_column(column) is not None
+
+    def _determine_synchronize_pairs(self):
+
+        if self.local_remote_pairs:
+            if not self._foreign_keys:
+                raise sa_exc.ArgumentError("foreign_keys argument is required with _local_remote_pairs argument")
+
+            self.synchronize_pairs = []
+
+            for l, r in self.local_remote_pairs:
+                if r in self._foreign_keys:
+                    self.synchronize_pairs.append((l, r))
+                elif l in self._foreign_keys:
+                    self.synchronize_pairs.append((r, l))
+        else:
+            eq_pairs = criterion_as_pairs(
+                            self.primaryjoin, 
+                            consider_as_foreign_keys=self._foreign_keys, 
+                            any_operator=self.viewonly
+                        )
+            eq_pairs = [
+                            (l, r) for l, r in eq_pairs if 
+                            (self._col_is_part_of_mappings(l) and 
+                                self._col_is_part_of_mappings(r)) 
+                                or self.viewonly and r in self._foreign_keys
+                        ]
+
+            if not eq_pairs:
+                if not self.viewonly and criterion_as_pairs(self.primaryjoin, consider_as_foreign_keys=self._foreign_keys, any_operator=True):
+                    raise sa_exc.ArgumentError("Could not locate any equated, locally "
+                        "mapped column pairs for primaryjoin condition '%s' on relation %s. "
+                        "For more relaxed rules on join conditions, the relation may be "
+                        "marked as viewonly=True." % (self.primaryjoin, self)
+                    )
+                else:
+                    if self._foreign_keys:
+                        raise sa_exc.ArgumentError("Could not determine relation direction for "
+                            "primaryjoin condition '%s', on relation %s. "
+                            "Do the columns in 'foreign_keys' represent only the 'foreign' columns "
+                            "in this join condition ?" % (self.primaryjoin, self))
+                    else:
+                        raise sa_exc.ArgumentError("Could not determine relation direction for "
+                            "primaryjoin condition '%s', on relation %s. "
+                            "Specify the 'foreign_keys' argument to indicate which columns "
+                            "on the relation are foreign." % (self.primaryjoin, self))
+
+            self.synchronize_pairs = eq_pairs
+
+        if self.secondaryjoin:
+            sq_pairs = criterion_as_pairs(self.secondaryjoin, consider_as_foreign_keys=self._foreign_keys, any_operator=self.viewonly)
+            sq_pairs = [(l, r) for l, r in sq_pairs if (self._col_is_part_of_mappings(l) and self._col_is_part_of_mappings(r)) or r in self._foreign_keys]
+
+            if not sq_pairs:
+                if not self.viewonly and criterion_as_pairs(self.secondaryjoin, consider_as_foreign_keys=self._foreign_keys, any_operator=True):
+                    raise sa_exc.ArgumentError("Could not locate any equated, locally mapped "
+                        "column pairs for secondaryjoin condition '%s' on relation %s. "
+                        "For more relaxed rules on join conditions, the "
+                        "relation may be marked as viewonly=True." % (self.secondaryjoin, self)
+                    )
+                else:
+                    raise sa_exc.ArgumentError("Could not determine relation direction "
+                    "for secondaryjoin condition '%s', on relation %s. "
+                    "Specify the foreign_keys argument to indicate which "
+                    "columns on the relation are foreign." % (self.secondaryjoin, self))
+
+            self.secondary_synchronize_pairs = sq_pairs
+        else:
+            self.secondary_synchronize_pairs = None
+
+        self._foreign_keys = util.column_set(r for l, r in self.synchronize_pairs)
+        if self.secondary_synchronize_pairs:
+            self._foreign_keys.update(r for l, r in self.secondary_synchronize_pairs)
+
+    def _determine_direction(self):
+        if self.secondaryjoin is not None:
+            self.direction = MANYTOMANY
+        elif self._refers_to_parent_table():
+            # self referential defaults to ONETOMANY unless the "remote" side is present
+            # and does not reference any foreign key columns
+
+            if self.local_remote_pairs:
+                remote = [r for l, r in self.local_remote_pairs]
+            elif self.remote_side:
+                remote = self.remote_side
+            else:
+                remote = None
+
+            if not remote or self._foreign_keys.\
+                                    difference(l for l, r in self.synchronize_pairs).\
+                                    intersection(remote):
+                self.direction = ONETOMANY
+            else:
+                self.direction = MANYTOONE
+
+        else:
+            foreign_keys = [f for c, f in self.synchronize_pairs]
+
+            parentcols = util.column_set(self.parent.mapped_table.c)
+            targetcols = util.column_set(self.mapper.mapped_table.c)
+
+            # fk collection which suggests ONETOMANY.
+            onetomany_fk = targetcols.intersection(foreign_keys)
+
+            # fk collection which suggests MANYTOONE.
+            manytoone_fk = parentcols.intersection(foreign_keys)
+            
+            if not onetomany_fk and not manytoone_fk:
+                raise sa_exc.ArgumentError(
+                    "Can't determine relation direction for relationship '%s' "
+                    "- foreign key columns are present in neither the "
+                    "parent nor the child's mapped tables" % self )
+
+            elif onetomany_fk and manytoone_fk: 
+                # fks on both sides.  do the same
+                # test only based on the local side.
+                referents = [c for c, f in self.synchronize_pairs]
+                onetomany_local = parentcols.intersection(referents)
+                manytoone_local = targetcols.intersection(referents)
+
+                if onetomany_local and not manytoone_local:
+                    self.direction = ONETOMANY
+                elif manytoone_local and not onetomany_local:
+                    self.direction = MANYTOONE
+            elif onetomany_fk:
+                self.direction = ONETOMANY
+            elif manytoone_fk:
+                self.direction = MANYTOONE
+                
+            if not self.direction:
+                raise sa_exc.ArgumentError(
+                    "Can't determine relation direction for relationship '%s' "
+                    "- foreign key columns are present in both the parent and "
+                    "the child's mapped tables.  Specify 'foreign_keys' "
+                    "argument." % self)
+        
+        if self.cascade.delete_orphan and not self.single_parent and \
+            (self.direction is MANYTOMANY or self.direction is MANYTOONE):
+            util.warn("On %s, delete-orphan cascade is not supported on a "
+                    "many-to-many or many-to-one relationship when single_parent is not set.  "
+                    " Set single_parent=True on the relation()." % self)
+        
+    def _determine_local_remote_pairs(self):
+        if not self.local_remote_pairs:
+            if self.remote_side:
+                if self.direction is MANYTOONE:
+                    self.local_remote_pairs = [
+                        (r, l) for l, r in
+                        criterion_as_pairs(self.primaryjoin, consider_as_referenced_keys=self.remote_side, any_operator=True)
+                    ]
+                else:
+                    self.local_remote_pairs = criterion_as_pairs(self.primaryjoin, consider_as_foreign_keys=self.remote_side, any_operator=True)
+
+                if not self.local_remote_pairs:
+                    raise sa_exc.ArgumentError("Relation %s could not determine any local/remote column pairs from remote side argument %r" % (self, self.remote_side))
+
+            else:
+                if self.viewonly:
+                    eq_pairs = self.synchronize_pairs
+                    if self.secondaryjoin:
+                        eq_pairs += self.secondary_synchronize_pairs
+                else:
+                    eq_pairs = criterion_as_pairs(self.primaryjoin, consider_as_foreign_keys=self._foreign_keys, any_operator=True)
+                    if self.secondaryjoin:
+                        eq_pairs += criterion_as_pairs(self.secondaryjoin, consider_as_foreign_keys=self._foreign_keys, any_operator=True)
+                    eq_pairs = [(l, r) for l, r in eq_pairs if self._col_is_part_of_mappings(l) and self._col_is_part_of_mappings(r)]
+
+                if self.direction is MANYTOONE:
+                    self.local_remote_pairs = [(r, l) for l, r in eq_pairs]
+                else:
+                    self.local_remote_pairs = eq_pairs
+        elif self.remote_side:
+            raise sa_exc.ArgumentError("remote_side argument is redundant against more detailed _local_remote_side argument.")
+        
+        for l, r in self.local_remote_pairs:
+
+            if self.direction is ONETOMANY and not self._col_is_part_of_mappings(l):
+                raise sa_exc.ArgumentError("Local column '%s' is not part of mapping %s.  "
+                        "Specify remote_side argument to indicate which column "
+                        "lazy join condition should compare against." % (l, self.parent))
+
+            elif self.direction is MANYTOONE and not self._col_is_part_of_mappings(r):
+                raise sa_exc.ArgumentError("Remote column '%s' is not part of mapping %s. "
+                        "Specify remote_side argument to indicate which column lazy "
+                        "join condition should bind." % (r, self.mapper))
+
+        self.local_side, self.remote_side = [util.ordered_column_set(x) for x in zip(*list(self.local_remote_pairs))]
+
+
+    def _post_init(self):
+        if self._should_log_info:
+            self.logger.info(str(self) + " setup primary join %s" % self.primaryjoin)
+            self.logger.info(str(self) + " setup secondary join %s" % self.secondaryjoin)
+            self.logger.info(str(self) + " synchronize pairs [%s]" % ",".join("(%s => %s)" % (l, r) for l, r in self.synchronize_pairs))
+            self.logger.info(str(self) + " secondary synchronize pairs [%s]" % ",".join(("(%s => %s)" % (l, r) for l, r in self.secondary_synchronize_pairs or [])))
+            self.logger.info(str(self) + " local/remote pairs [%s]" % ",".join("(%s / %s)" % (l, r) for l, r in self.local_remote_pairs))
+            self.logger.info(str(self) + " relation direction %s" % self.direction)
+
+        if self.uselist is None and self.direction is MANYTOONE:
+            self.uselist = False
+
+        if self.uselist is None:
+            self.uselist = True
+
+        if not self.viewonly:
+            self._dependency_processor = dependency.create_dependency_processor(self)
+
+        # primary property handler, set up class attributes
+        if self.is_primary():
+            if self.back_populates:
+                self.extension = list(util.to_list(self.extension, default=[]))
+                self.extension.append(attributes.GenericBackrefExtension(self.back_populates))
+                self._add_reverse_property(self.back_populates)
+            
+            if self.backref is not None:
+                self.backref.compile(self)
+        elif not mapper.class_mapper(self.parent.class_, compile=False)._get_property(self.key, raiseerr=False):
+            raise sa_exc.ArgumentError("Attempting to assign a new relation '%s' to "
+                "a non-primary mapper on class '%s'.  New relations can only be "
+                "added to the primary mapper, i.e. the very first "
+                "mapper created for class '%s' " % (self.key, self.parent.class_.__name__, self.parent.class_.__name__))
+        
+
+    def _refers_to_parent_table(self):
+        for c, f in self.synchronize_pairs:
+            if c.table is f.table:
+                return True
+        else:
+            return False
+
+    def _is_self_referential(self):
+        return self.mapper.common_parent(self.parent)
+
+    def _create_joins(self, source_polymorphic=False, source_selectable=None, dest_polymorphic=False, dest_selectable=None, of_type=None):
+        if source_selectable is None:
+            if source_polymorphic and self.parent.with_polymorphic:
+                source_selectable = self.parent._with_polymorphic_selectable
+
+        aliased = False
+        if dest_selectable is None:
+            if dest_polymorphic and self.mapper.with_polymorphic:
+                dest_selectable = self.mapper._with_polymorphic_selectable
+                aliased = True
+            else:
+                dest_selectable = self.mapper.mapped_table
+
+            if self._is_self_referential() and source_selectable is None:
+                dest_selectable = dest_selectable.alias()
+                aliased = True
+        else:
+            aliased = True
+
+        aliased = aliased or bool(source_selectable)
+
+        primaryjoin, secondaryjoin, secondary = self.primaryjoin, self.secondaryjoin, self.secondary
+        
+        # adjust the join condition for single table inheritance,
+        # in the case that the join is to a subclass
+        # this is analgous to the "_adjust_for_single_table_inheritance()"
+        # method in Query.
+
+        dest_mapper = of_type or self.mapper
+        
+        single_crit = dest_mapper._single_table_criterion
+        if single_crit:
+            if secondaryjoin:
+                secondaryjoin = secondaryjoin & single_crit
+            else:
+                primaryjoin = primaryjoin & single_crit
+            
+
+        if aliased:
+            if secondary:
+                secondary = secondary.alias()
+                primary_aliasizer = ClauseAdapter(secondary)
+                if dest_selectable:
+                    secondary_aliasizer = ClauseAdapter(dest_selectable, equivalents=self.mapper._equivalent_columns).chain(primary_aliasizer)
+                else:
+                    secondary_aliasizer = primary_aliasizer
+
+                if source_selectable:
+                    primary_aliasizer = ClauseAdapter(secondary).chain(ClauseAdapter(source_selectable, equivalents=self.parent._equivalent_columns))
+
+                secondaryjoin = secondary_aliasizer.traverse(secondaryjoin)
+            else:
+                if dest_selectable:
+                    primary_aliasizer = ClauseAdapter(dest_selectable, exclude=self.local_side, equivalents=self.mapper._equivalent_columns)
+                    if source_selectable:
+                        primary_aliasizer.chain(ClauseAdapter(source_selectable, exclude=self.remote_side, equivalents=self.parent._equivalent_columns))
+                elif source_selectable:
+                    primary_aliasizer = ClauseAdapter(source_selectable, exclude=self.remote_side, equivalents=self.parent._equivalent_columns)
+
+                secondary_aliasizer = None
+
+            primaryjoin = primary_aliasizer.traverse(primaryjoin)
+            target_adapter = secondary_aliasizer or primary_aliasizer
+            target_adapter.include = target_adapter.exclude = None
+        else:
+            target_adapter = None
+
+        return (primaryjoin, secondaryjoin, 
+                (source_selectable or self.parent.local_table), 
+                (dest_selectable or self.mapper.local_table), secondary, target_adapter)
+
+    def _get_join(self, parent, primary=True, secondary=True, polymorphic_parent=True):
+        """deprecated.  use primary_join_against(), secondary_join_against(), full_join_against()"""
+
+        pj, sj, source, dest, secondarytable, adapter = self._create_joins(source_polymorphic=polymorphic_parent)
+
+        if primary and secondary:
+            return pj & sj
+        elif primary:
+            return pj
+        elif secondary:
+            return sj
+        else:
+            raise AssertionError("illegal condition")
+
+    def register_dependencies(self, uowcommit):
+        if not self.viewonly:
+            self._dependency_processor.register_dependencies(uowcommit)
+
+    def register_processors(self, uowcommit):
+        if not self.viewonly:
+            self._dependency_processor.register_processors(uowcommit)
+
+PropertyLoader = RelationProperty
+log.class_logger(RelationProperty)
+
+class BackRef(object):
+    """Attached to a RelationProperty to indicate a complementary reverse relationship.
+
+    Handles the job of creating the opposite RelationProperty according to configuration.
+    
+    Alternatively, two explicit RelationProperty objects can be associated bidirectionally
+    using the back_populates keyword argument on each.
+    
+    """
+
+    def __init__(self, key, _prop=None, **kwargs):
+        self.key = key
+        self.kwargs = kwargs
+        self.prop = _prop
+        self.extension = attributes.GenericBackrefExtension(self.key)
+
+    def compile(self, prop):
+        if self.prop:
+            return
+
+        self.prop = prop
+
+        mapper = prop.mapper.primary_mapper()
+        if mapper._get_property(self.key, raiseerr=False) is None:
+            if prop.secondary:
+                pj = self.kwargs.pop('primaryjoin', prop.secondaryjoin)
+                sj = self.kwargs.pop('secondaryjoin', prop.primaryjoin)
+            else:
+                pj = self.kwargs.pop('primaryjoin', prop.primaryjoin)
+                sj = self.kwargs.pop('secondaryjoin', None)
+                if sj:
+                    raise sa_exc.InvalidRequestError(
+                        "Can't assign 'secondaryjoin' on a backref against "
+                        "a non-secondary relation.")
+            
+            foreign_keys = self.kwargs.pop('foreign_keys', prop._foreign_keys)
+            
+            parent = prop.parent.primary_mapper()
+            self.kwargs.setdefault('viewonly', prop.viewonly)
+            self.kwargs.setdefault('post_update', prop.post_update)
+
+            relation = RelationProperty(parent, prop.secondary, pj, sj, foreign_keys=foreign_keys,
+                                      backref=BackRef(prop.key, _prop=prop),
+                                      **self.kwargs)
+
+            mapper._configure_property(self.key, relation);
+
+            prop._add_reverse_property(self.key)
+
+        else:
+            raise sa_exc.ArgumentError("Error creating backref '%s' on relation '%s': "
+                "property of that name exists on mapper '%s'" % (self.key, prop, mapper))
+
+mapper.ColumnProperty = ColumnProperty
+mapper.SynonymProperty = SynonymProperty
+mapper.ComparableProperty = ComparableProperty
+mapper.RelationProperty = RelationProperty
+mapper.ConcreteInheritedProperty = ConcreteInheritedProperty
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/orm/__init__.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/orm/__init__.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/orm/__init__.py (revision 3)
@@ -0,0 +1,969 @@
+# sqlalchemy/orm/__init__.py
+# Copyright (C) 2005, 2006, 2007, 2008, 2009 Michael Bayer mike_mp@zzzcomputing.com
+#
+# This module is part of SQLAlchemy and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+"""
+Functional constructs for ORM configuration.
+
+See the SQLAlchemy object relational tutorial and mapper configuration
+documentation for an overview of how this module is used.
+
+"""
+
+from sqlalchemy.orm import exc
+from sqlalchemy.orm.mapper import (
+     Mapper,
+     _mapper_registry,
+     class_mapper,
+     )
+from sqlalchemy.orm.interfaces import (
+     EXT_CONTINUE,
+     EXT_STOP,
+     ExtensionOption,
+     InstrumentationManager,
+     MapperExtension,
+     PropComparator,
+     SessionExtension,
+     AttributeExtension,
+     )
+from sqlalchemy.orm.util import (
+     AliasedClass as aliased,
+     Validator,
+     join,
+     object_mapper,
+     outerjoin,
+     polymorphic_union,
+     with_parent,
+     )
+from sqlalchemy.orm.properties import (
+     BackRef,
+     ColumnProperty,
+     ComparableProperty,
+     CompositeProperty,
+     RelationProperty,
+     PropertyLoader,
+     SynonymProperty,
+     )
+from sqlalchemy.orm import mapper as mapperlib
+from sqlalchemy.orm.mapper import reconstructor, validates
+from sqlalchemy.orm import strategies
+from sqlalchemy.orm.query import AliasOption, Query
+from sqlalchemy.sql import util as sql_util
+from sqlalchemy.orm.session import Session as _Session
+from sqlalchemy.orm.session import object_session, sessionmaker
+from sqlalchemy.orm.scoping import ScopedSession
+from sqlalchemy import util as sa_util
+
+
+__all__ = (
+    'EXT_CONTINUE',
+    'EXT_STOP',
+    'InstrumentationManager',
+    'MapperExtension',
+    'AttributeExtension',
+    'Validator',
+    'PropComparator',
+    'Query',
+    'aliased',
+    'backref',
+    'class_mapper',
+    'clear_mappers',
+    'column_property',
+    'comparable_property',
+    'compile_mappers',
+    'composite',
+    'contains_alias',
+    'contains_eager',
+    'create_session',
+    'defer',
+    'deferred',
+    'dynamic_loader',
+    'eagerload',
+    'eagerload_all',
+    'extension',
+    'join',
+    'lazyload',
+    'mapper',
+    'noload',
+    'object_mapper',
+    'object_session',
+    'outerjoin',
+    'polymorphic_union',
+    'reconstructor',
+    'relation',
+    'scoped_session',
+    'sessionmaker',
+    'synonym',
+    'undefer',
+    'undefer_group',
+    'validates'
+    )
+
+
+def scoped_session(session_factory, scopefunc=None):
+    """Provides thread-local management of Sessions.
+
+    This is a front-end function to
+    :class:`~sqlalchemy.orm.scoping.ScopedSession`.
+
+    :param session_factory: a callable function that produces
+      :class:`Session` instances, such as :func:`sessionmaker` or
+      :func:`create_session`.
+
+    :param scopefunc: optional, TODO
+
+    :returns: an :class:`~sqlalchemy.orm.scoping.ScopedSession` instance
+
+    Usage::
+
+      Session = scoped_session(sessionmaker(autoflush=True))
+
+    To instantiate a Session object which is part of the scoped context,
+    instantiate normally::
+
+      session = Session()
+
+    Most session methods are available as classmethods from the scoped
+    session::
+
+      Session.commit()
+      Session.close()
+
+    To map classes so that new instances are saved in the current Session
+    automatically, as well as to provide session-aware class attributes such
+    as "query", use the `mapper` classmethod from the scoped session::
+
+      mapper = Session.mapper
+      mapper(Class, table, ...)
+
+    """
+    return ScopedSession(session_factory, scopefunc=scopefunc)
+
+def create_session(bind=None, **kwargs):
+    """Create a new :class:`~sqlalchemy.orm.session.Session`.
+
+    :param bind: optional, a single Connectable to use for all
+      database access in the created
+      :class:`~sqlalchemy.orm.session.Session`.
+
+    :param \*\*kwargs: optional, passed through to the
+      :class:`Session` constructor.
+
+    :returns: an :class:`~sqlalchemy.orm.session.Session` instance
+
+    The defaults of create_session() are the opposite of that of
+    :func:`sessionmaker`; ``autoflush`` and ``expire_on_commit`` are
+    False, ``autocommit`` is True.  In this sense the session acts
+    more like the "classic" SQLAlchemy 0.3 session with these.
+
+    Usage::
+
+      >>> from sqlalchemy.orm import create_session
+      >>> session = create_session()
+
+    It is recommended to use :func:`sessionmaker` instead of
+    create_session().
+
+    """
+    if 'transactional' in kwargs:
+        sa_util.warn_deprecated(
+            "The 'transactional' argument to sessionmaker() is deprecated; "
+            "use autocommit=True|False instead.")
+        if 'autocommit' in kwargs:
+            raise TypeError('Specify autocommit *or* transactional, not both.')
+        kwargs['autocommit'] = not kwargs.pop('transactional')
+
+    kwargs.setdefault('autoflush', False)
+    kwargs.setdefault('autocommit', True)
+    kwargs.setdefault('expire_on_commit', False)
+    return _Session(bind=bind, **kwargs)
+
+def relation(argument, secondary=None, **kwargs):
+    """Provide a relationship of a primary Mapper to a secondary Mapper.
+
+    This corresponds to a parent-child or associative table relationship.  The
+    constructed class is an instance of :class:`RelationProperty`.
+
+    A typical :func:`relation`::
+
+       mapper(Parent, properties={
+         'children': relation(Children)
+       })
+
+    :param argument:
+      a class or :class:`Mapper` instance, representing the target of
+      the relation.
+
+    :param secondary:
+      for a many-to-many relationship, specifies the intermediary
+      table. The *secondary* keyword argument should generally only
+      be used for a table that is not otherwise expressed in any class
+      mapping. In particular, using the Association Object Pattern is
+      generally mutually exclusive with the use of the *secondary*
+      keyword argument.
+
+    :param backref:
+      indicates the string name of a property to be placed on the related
+      mapper's class that will handle this relationship in the other
+      direction. The other property will be created automatically 
+      when the mappers are configured.  Can also be passed as a
+      :func:`backref` object to control the configuration of the
+      new relation.
+      
+    :param back_populates:
+      Takes a string name and has the same meaning as ``backref``, 
+      except the complementing property is **not** created automatically, 
+      and instead must be configured explicitly on the other mapper.  The 
+      complementing property should also indicate ``back_populates`` 
+      to this relation to ensure proper functioning.
+
+    :param cascade:
+      a comma-separated list of cascade rules which determines how
+      Session operations should be "cascaded" from parent to child.
+      This defaults to ``False``, which means the default cascade
+      should be used.  The default value is ``"save-update, merge"``.
+
+      Available cascades are:
+
+        ``save-update`` - cascade the "add()" operation (formerly
+        known as save() and update())
+
+        ``merge`` - cascade the "merge()" operation
+
+        ``expunge`` - cascade the "expunge()" operation
+
+        ``delete`` - cascade the "delete()" operation
+
+        ``delete-orphan`` - if an item of the child's type with no
+        parent is detected, mark it for deletion.  Note that this
+        option prevents a pending item of the child's class from being
+        persisted without a parent present.
+
+        ``refresh-expire`` - cascade the expire() and refresh()
+        operations
+
+        ``all`` - shorthand for "save-update,merge, refresh-expire,
+        expunge, delete"
+
+    :param collection_class:
+      a class or callable that returns a new list-holding object. will
+      be used in place of a plain list for storing elements.
+
+    :param comparator_factory:
+      a class which extends :class:`RelationProperty.Comparator` which
+      provides custom SQL clause generation for comparison operations.
+
+    :param extension:
+      an :class:`AttributeExtension` instance, or list of extensions,
+      which will be prepended to the list of attribute listeners for
+      the resulting descriptor placed on the class.  These listeners
+      will receive append and set events before the operation
+      proceeds, and may be used to halt (via exception throw) or
+      change the value used in the operation.
+
+    :param foreign_keys:
+
+      a list of columns which are to be used as "foreign key" columns.
+      this parameter should be used in conjunction with explicit
+      ``primaryjoin`` and ``secondaryjoin`` (if needed) arguments, and
+      the columns within the ``foreign_keys`` list should be present
+      within those join conditions. Normally, ``relation()`` will
+      inspect the columns within the join conditions to determine
+      which columns are the "foreign key" columns, based on
+      information in the ``Table`` metadata. Use this argument when no
+      ForeignKey's are present in the join condition, or to override
+      the table-defined foreign keys.
+
+    :param join_depth:
+      when non-``None``, an integer value indicating how many levels
+      deep eagerload joins should be constructed on a self-referring
+      or cyclical relationship.  The number counts how many times the
+      same Mapper shall be present in the loading condition along a
+      particular join branch.  When left at its default of ``None``,
+      eager loads will automatically stop chaining joins when they
+      encounter a mapper which is already higher up in the chain.
+
+    :param lazy=(True|False|None|'dynamic'):
+      specifies how the related items should be loaded. Values include:
+
+      True - items should be loaded lazily when the property is first
+             accessed.
+
+      False - items should be loaded "eagerly" in the same query as
+              that of the parent, using a JOIN or LEFT OUTER JOIN.
+
+      None - no loading should occur at any time.  This is to support
+             "write-only" attributes, or attributes which are
+             populated in some manner specific to the application.
+
+      'dynamic' - a ``DynaLoader`` will be attached, which returns a
+                  ``Query`` object for all read operations.  The
+                  dynamic- collection supports only ``append()`` and
+                  ``remove()`` for write operations; changes to the
+                  dynamic property will not be visible until the data
+                  is flushed to the database.
+
+    :param order_by:
+      indicates the ordering that should be applied when loading these
+      items.
+
+    :param passive_deletes=False:
+       Indicates loading behavior during delete operations.
+
+       A value of True indicates that unloaded child items should not
+       be loaded during a delete operation on the parent.  Normally,
+       when a parent item is deleted, all child items are loaded so
+       that they can either be marked as deleted, or have their
+       foreign key to the parent set to NULL.  Marking this flag as
+       True usually implies an ON DELETE <CASCADE|SET NULL> rule is in
+       place which will handle updating/deleting child rows on the
+       database side.
+
+       Additionally, setting the flag to the string value 'all' will
+       disable the "nulling out" of the child foreign keys, when there
+       is no delete or delete-orphan cascade enabled.  This is
+       typically used when a triggering or error raise scenario is in
+       place on the database side.  Note that the foreign key
+       attributes on in-session child objects will not be changed
+       after a flush occurs so this is a very special use-case
+       setting.
+
+    :param passive_updates=True:
+      Indicates loading and INSERT/UPDATE/DELETE behavior when the
+      source of a foreign key value changes (i.e. an "on update"
+      cascade), which are typically the primary key columns of the
+      source row.
+
+      When True, it is assumed that ON UPDATE CASCADE is configured on
+      the foreign key in the database, and that the database will
+      handle propagation of an UPDATE from a source column to
+      dependent rows.  Note that with databases which enforce
+      referential integrity (i.e. PostgreSQL, MySQL with InnoDB tables),
+      ON UPDATE CASCADE is required for this operation.  The
+      relation() will update the value of the attribute on related
+      items which are locally present in the session during a flush.
+
+      When False, it is assumed that the database does not enforce
+      referential integrity and will not be issuing its own CASCADE
+      operation for an update.  The relation() will issue the
+      appropriate UPDATE statements to the database in response to the
+      change of a referenced key, and items locally present in the
+      session during a flush will also be refreshed.
+
+      This flag should probably be set to False if primary key changes
+      are expected and the database in use doesn't support CASCADE
+      (i.e. SQLite, MySQL MyISAM tables).
+
+    :param post_update:
+      this indicates that the relationship should be handled by a
+      second UPDATE statement after an INSERT or before a
+      DELETE. Currently, it also will issue an UPDATE after the
+      instance was UPDATEd as well, although this technically should
+      be improved. This flag is used to handle saving bi-directional
+      dependencies between two individual rows (i.e. each row
+      references the other), where it would otherwise be impossible to
+      INSERT or DELETE both rows fully since one row exists before the
+      other. Use this flag when a particular mapping arrangement will
+      incur two rows that are dependent on each other, such as a table
+      that has a one-to-many relationship to a set of child rows, and
+      also has a column that references a single child row within that
+      list (i.e. both tables contain a foreign key to each other). If
+      a ``flush()`` operation returns an error that a "cyclical
+      dependency" was detected, this is a cue that you might want to
+      use ``post_update`` to "break" the cycle.
+
+    :param primaryjoin:
+      a ClauseElement that will be used as the primary join of this
+      child object against the parent object, or in a many-to-many
+      relationship the join of the primary object to the association
+      table. By default, this value is computed based on the foreign
+      key relationships of the parent and child tables (or association
+      table).
+
+    :param remote_side:
+      used for self-referential relationships, indicates the column or
+      list of columns that form the "remote side" of the relationship.
+
+    :param secondaryjoin:
+      a ClauseElement that will be used as the join of an association
+      table to the child object. By default, this value is computed
+      based on the foreign key relationships of the association and
+      child tables.
+
+    :param single_parent=(True|False):
+      when True, installs a validator which will prevent objects
+      from being associated with more than one parent at a time.
+      This is used for many-to-one or many-to-many relationships that
+      should be treated either as one-to-one or one-to-many.  Its
+      usage is optional unless delete-orphan cascade is also 
+      set on this relation(), in which case its required (new in 0.5.2).
+      
+    :param uselist=(True|False):
+      a boolean that indicates if this property should be loaded as a
+      list or a scalar. In most cases, this value is determined
+      automatically by ``relation()``, based on the type and direction
+      of the relationship - one to many forms a list, many to one
+      forms a scalar, many to many is a list. If a scalar is desired
+      where normally a list would be present, such as a bi-directional
+      one-to-one relationship, set uselist to False.
+
+    :param viewonly=False:
+      when set to True, the relation is used only for loading objects
+      within the relationship, and has no effect on the unit-of-work
+      flush process.  Relationships with viewonly can specify any kind of
+      join conditions to provide additional views of related objects
+      onto a parent object. Note that the functionality of a viewonly
+      relationship has its limits - complicated join conditions may
+      not compile into eager or lazy loaders properly. If this is the
+      case, use an alternative method.
+
+    """
+    return RelationProperty(argument, secondary=secondary, **kwargs)
+
+def dynamic_loader(argument, secondary=None, primaryjoin=None,
+                   secondaryjoin=None, foreign_keys=None, backref=None,
+                   post_update=False, cascade=False, remote_side=None,
+                   enable_typechecks=True, passive_deletes=False,
+                   order_by=None, comparator_factory=None, query_class=None):
+    """Construct a dynamically-loading mapper property.
+
+    This property is similar to :func:`relation`, except read
+    operations return an active :class:`Query` object which reads from
+    the database when accessed.  Items may be appended to the
+    attribute via ``append()``, or removed via ``remove()``; changes
+    will be persisted to the database during a :meth:`Sesion.flush`.
+    However, no other Python list or collection mutation operations
+    are available.
+
+    A subset of arguments available to :func:`relation` are available
+    here.
+
+    :param argument:
+      a class or :class:`Mapper` instance, representing the target of
+      the relation.
+
+    :param secondary:
+      for a many-to-many relationship, specifies the intermediary
+      table. The *secondary* keyword argument should generally only
+      be used for a table that is not otherwise expressed in any class
+      mapping. In particular, using the Association Object Pattern is
+      generally mutually exclusive with the use of the *secondary*
+      keyword argument.
+
+    :param query_class:
+      Optional, a custom Query subclass to be used as the basis for
+      dynamic collection.
+
+    """
+    from sqlalchemy.orm.dynamic import DynaLoader
+
+    return RelationProperty(
+        argument, secondary=secondary, primaryjoin=primaryjoin,
+        secondaryjoin=secondaryjoin, foreign_keys=foreign_keys, backref=backref,
+        post_update=post_update, cascade=cascade, remote_side=remote_side,
+        enable_typechecks=enable_typechecks, passive_deletes=passive_deletes,
+        order_by=order_by, comparator_factory=comparator_factory,
+        strategy_class=DynaLoader, query_class=query_class)
+
+def column_property(*args, **kwargs):
+    """Provide a column-level property for use with a Mapper.
+
+    Column-based properties can normally be applied to the mapper's
+    ``properties`` dictionary using the ``schema.Column`` element directly.
+    Use this function when the given column is not directly present within the
+    mapper's selectable; examples include SQL expressions, functions, and
+    scalar SELECT queries.
+
+    Columns that aren't present in the mapper's selectable won't be persisted
+    by the mapper and are effectively "read-only" attributes.
+
+      \*cols
+          list of Column objects to be mapped.
+
+      comparator_factory
+        a class which extends ``sqlalchemy.orm.properties.ColumnProperty.Comparator``
+        which provides custom SQL clause generation for comparison operations.
+
+      group
+          a group name for this property when marked as deferred.
+
+      deferred
+          when True, the column property is "deferred", meaning that
+          it does not load immediately, and is instead loaded when the
+          attribute is first accessed on an instance.  See also
+          :func:`~sqlalchemy.orm.deferred`.
+
+      extension
+        an :class:`~sqlalchemy.orm.interfaces.AttributeExtension` instance,
+        or list of extensions, which will be prepended to the list of
+        attribute listeners for the resulting descriptor placed on the class.
+        These listeners will receive append and set events before the
+        operation proceeds, and may be used to halt (via exception throw)
+        or change the value used in the operation.
+
+    """
+
+    return ColumnProperty(*args, **kwargs)
+
+def composite(class_, *cols, **kwargs):
+    """Return a composite column-based property for use with a Mapper.
+
+    This is very much like a column-based property except the given class is
+    used to represent "composite" values composed of one or more columns.
+
+    The class must implement a constructor with positional arguments matching
+    the order of columns supplied here, as well as a __composite_values__()
+    method which returns values in the same order.
+
+    A simple example is representing separate two columns in a table as a
+    single, first-class "Point" object::
+
+      class Point(object):
+          def __init__(self, x, y):
+              self.x = x
+              self.y = y
+          def __composite_values__(self):
+              return self.x, self.y
+          def __eq__(self, other):
+              return other is not None and self.x == other.x and self.y == other.y
+
+      # and then in the mapping:
+      ... composite(Point, mytable.c.x, mytable.c.y) ...
+
+    The composite object may have its attributes populated based on the names
+    of the mapped columns.  To override the way internal state is set,
+    additionally implement ``__set_composite_values__``::
+
+        class Point(object):
+            def __init__(self, x, y):
+                self.some_x = x
+                self.some_y = y
+            def __composite_values__(self):
+                return self.some_x, self.some_y
+            def __set_composite_values__(self, x, y):
+                self.some_x = x
+                self.some_y = y
+            def __eq__(self, other):
+                return other is not None and self.some_x == other.x and self.some_y == other.y
+
+    Arguments are:
+
+    class\_
+      The "composite type" class.
+
+    \*cols
+      List of Column objects to be mapped.
+
+    group
+      A group name for this property when marked as deferred.
+
+    deferred
+      When True, the column property is "deferred", meaning that it does not
+      load immediately, and is instead loaded when the attribute is first
+      accessed on an instance.  See also :func:`~sqlalchemy.orm.deferred`.
+
+    comparator_factory
+      a class which extends ``sqlalchemy.orm.properties.CompositeProperty.Comparator``
+      which provides custom SQL clause generation for comparison operations.
+
+    extension
+      an :class:`~sqlalchemy.orm.interfaces.AttributeExtension` instance,
+      or list of extensions, which will be prepended to the list of
+      attribute listeners for the resulting descriptor placed on the class.
+      These listeners will receive append and set events before the
+      operation proceeds, and may be used to halt (via exception throw)
+      or change the value used in the operation.
+
+    """
+    return CompositeProperty(class_, *cols, **kwargs)
+
+
+def backref(name, **kwargs):
+    """Create a BackRef object with explicit arguments, which are the same
+    arguments one can send to ``relation()``.
+
+    Used with the `backref` keyword argument to ``relation()`` in
+    place of a string argument.
+
+    """
+    return BackRef(name, **kwargs)
+
+def deferred(*columns, **kwargs):
+    """Return a ``DeferredColumnProperty``, which indicates this
+    object attributes should only be loaded from its corresponding
+    table column when first accessed.
+
+    Used with the `properties` dictionary sent to ``mapper()``.
+
+    """
+    return ColumnProperty(deferred=True, *columns, **kwargs)
+
+def mapper(class_, local_table=None, *args, **params):
+    """Return a new :class:`~sqlalchemy.orm.Mapper` object.
+
+      class\_
+        The class to be mapped.
+
+      local_table
+        The table to which the class is mapped, or None if this mapper
+        inherits from another mapper using concrete table inheritance.
+
+      always_refresh
+        If True, all query operations for this mapped class will overwrite all
+        data within object instances that already exist within the session,
+        erasing any in-memory changes with whatever information was loaded
+        from the database.  Usage of this flag is highly discouraged; as an
+        alternative, see the method `populate_existing()` on
+        :class:`~sqlalchemy.orm.query.Query`.
+
+      allow_null_pks
+        Indicates that composite primary keys where one or more (but not all)
+        columns contain NULL is a valid primary key.  Primary keys which
+        contain NULL values usually indicate that a result row does not
+        contain an entity and should be skipped.
+
+      batch
+        Indicates that save operations of multiple entities can be batched
+        together for efficiency.  setting to False indicates that an instance
+        will be fully saved before saving the next instance, which includes
+        inserting/updating all table rows corresponding to the entity as well
+        as calling all ``MapperExtension`` methods corresponding to the save
+        operation.
+
+      column_prefix
+        A string which will be prepended to the `key` name of all Columns when
+        creating column-based properties from the given Table.  Does not
+        affect explicitly specified column-based properties
+
+      concrete
+        If True, indicates this mapper should use concrete table inheritance
+        with its parent mapper.
+
+      extension
+        A :class:`~sqlalchemy.orm.MapperExtension` instance or list of
+        ``MapperExtension`` instances which will be applied to all
+        operations by this ``Mapper``.
+
+      inherits
+        Another ``Mapper`` for which this ``Mapper`` will have an inheritance
+        relationship with.
+
+      inherit_condition
+        For joined table inheritance, a SQL expression (constructed
+        ``ClauseElement``) which will define how the two tables are joined;
+        defaults to a natural join between the two tables.
+
+      inherit_foreign_keys
+        when inherit_condition is used and the condition contains no
+        ForeignKey columns, specify the "foreign" columns of the join
+        condition in this list.  else leave as None.
+
+      order_by
+        A single ``Column`` or list of ``Columns`` for which
+        selection operations should use as the default ordering for entities.
+        Defaults to the OID/ROWID of the table if any, or the first primary
+        key column of the table.
+
+      non_primary
+        Construct a ``Mapper`` that will define only the selection of
+        instances, not their persistence.  Any number of non_primary mappers
+        may be created for a particular class.
+
+      polymorphic_on
+        Used with mappers in an inheritance relationship, a ``Column`` which
+        will identify the class/mapper combination to be used with a
+        particular row.  Requires the ``polymorphic_identity`` value to be set
+        for all mappers in the inheritance hierarchy.  The column specified by
+        ``polymorphic_on`` is usually a column that resides directly within
+        the base mapper's mapped table; alternatively, it may be a column that
+        is only present within the <selectable> portion of the
+        ``with_polymorphic`` argument.
+
+      _polymorphic_map
+        Used internally to propagate the full map of polymorphic identifiers
+        to surrogate mappers.
+
+      polymorphic_identity
+        A value which will be stored in the Column denoted by polymorphic_on,
+        corresponding to the *class identity* of this mapper.
+
+      polymorphic_fetch
+        Deprecated. Unloaded columns load as deferred in all cases; loading
+        can be controlled using the "with_polymorphic" option.
+
+      properties
+        A dictionary mapping the string names of object attributes to
+        ``MapperProperty`` instances, which define the persistence behavior of
+        that attribute.  Note that the columns in the mapped table are
+        automatically converted into ``ColumnProperty`` instances based on the
+        `key` property of each ``Column`` (although they can be overridden
+        using this dictionary).
+
+      include_properties
+        An inclusive list of properties to map.  Columns present in the mapped
+        table but not present in this list will not be automatically converted
+        into properties.
+
+      exclude_properties
+        A list of properties not to map.  Columns present in the mapped table
+        and present in this list will not be automatically converted into
+        properties.  Note that neither this option nor include_properties will
+        allow an end-run around Python inheritance.  If mapped class ``B``
+        inherits from mapped class ``A``, no combination of includes or
+        excludes will allow ``B`` to have fewer properties than its
+        superclass, ``A``.
+
+      primary_key
+        A list of ``Column`` objects which define the *primary key* to be used
+        against this mapper's selectable unit.  This is normally simply the
+        primary key of the `local_table`, but can be overridden here.
+
+      with_polymorphic
+        A tuple in the form ``(<classes>, <selectable>)`` indicating the
+        default style of "polymorphic" loading, that is, which tables are
+        queried at once. <classes> is any single or list of mappers and/or
+        classes indicating the inherited classes that should be loaded at
+        once. The special value ``'*'`` may be used to indicate all descending
+        classes should be loaded immediately. The second tuple argument
+        <selectable> indicates a selectable that will be used to query for
+        multiple classes. Normally, it is left as None, in which case this
+        mapper will form an outer join from the base mapper's table to that of
+        all desired sub-mappers.  When specified, it provides the selectable
+        to be used for polymorphic loading. When with_polymorphic includes
+        mappers which load from a "concrete" inheriting table, the
+        <selectable> argument is required, since it usually requires more
+        complex UNION queries.
+
+      select_table
+        Deprecated.  Synonymous with
+        ``with_polymorphic=('*', <selectable>)``.
+
+      version_id_col
+        A ``Column`` which must have an integer type that will be used to keep
+        a running *version id* of mapped entities in the database.  this is
+        used during save operations to ensure that no other thread or process
+        has updated the instance during the lifetime of the entity, else a
+        ``ConcurrentModificationError`` exception is thrown.
+
+    """
+    return Mapper(class_, local_table, *args, **params)
+
+def synonym(name, map_column=False, descriptor=None, comparator_factory=None, proxy=False):
+    """Set up `name` as a synonym to another mapped property.
+
+    Used with the ``properties`` dictionary sent to  :func:`~sqlalchemy.orm.mapper`.
+
+    Any existing attributes on the class which map the key name sent
+    to the ``properties`` dictionary will be used by the synonym to provide
+    instance-attribute behavior (that is, any Python property object, provided
+    by the ``property`` builtin or providing a ``__get__()``, ``__set__()``
+    and ``__del__()`` method).  If no name exists for the key, the
+    ``synonym()`` creates a default getter/setter object automatically and
+    applies it to the class.
+
+    `name` refers to the name of the existing mapped property, which can be
+    any other ``MapperProperty`` including column-based properties and
+    relations.
+
+    If `map_column` is ``True``, an additional ``ColumnProperty`` is created
+    on the mapper automatically, using the synonym's name as the keyname of
+    the property, and the keyname of this ``synonym()`` as the name of the
+    column to map.  For example, if a table has a column named ``status``::
+
+        class MyClass(object):
+            def _get_status(self):
+                return self._status
+            def _set_status(self, value):
+                self._status = value
+            status = property(_get_status, _set_status)
+
+        mapper(MyClass, sometable, properties={
+            "status":synonym("_status", map_column=True)
+        })
+
+    The column named ``status`` will be mapped to the attribute named
+    ``_status``, and the ``status`` attribute on ``MyClass`` will be used to
+    proxy access to the column-based attribute.
+
+    The `proxy` keyword argument is deprecated and currently does nothing;
+    synonyms now always establish an attribute getter/setter function if one
+    is not already available.
+
+    """
+    return SynonymProperty(name, map_column=map_column, descriptor=descriptor, comparator_factory=comparator_factory)
+
+def comparable_property(comparator_factory, descriptor=None):
+    """Provide query semantics for an unmanaged attribute.
+
+    Allows a regular Python @property (descriptor) to be used in Queries and
+    SQL constructs like a managed attribute.  comparable_property wraps a
+    descriptor with a proxy that directs operator overrides such as ==
+    (__eq__) to the supplied comparator but proxies everything else through to
+    the original descriptor::
+
+      class MyClass(object):
+          @property
+          def myprop(self):
+              return 'foo'
+
+      class MyComparator(sqlalchemy.orm.interfaces.PropComparator):
+          def __eq__(self, other):
+              ....
+
+      mapper(MyClass, mytable, properties=dict(
+               'myprop': comparable_property(MyComparator)))
+
+    Used with the ``properties`` dictionary sent to  :func:`~sqlalchemy.orm.mapper`.
+
+    comparator_factory
+      A PropComparator subclass or factory that defines operator behavior
+      for this property.
+
+    descriptor
+      Optional when used in a ``properties={}`` declaration.  The Python
+      descriptor or property to layer comparison behavior on top of.
+
+      The like-named descriptor will be automatically retreived from the
+      mapped class if left blank in a ``properties`` declaration.
+
+    """
+    return ComparableProperty(comparator_factory, descriptor)
+
+def compile_mappers():
+    """Compile all mappers that have been defined.
+
+    This is equivalent to calling ``compile()`` on any individual mapper.
+
+    """
+    for m in list(_mapper_registry):
+        m.compile()
+
+def clear_mappers():
+    """Remove all mappers that have been created thus far.
+
+    The mapped classes will return to their initial "unmapped" state and can
+    be re-mapped with new mappers.
+
+    """
+    mapperlib._COMPILE_MUTEX.acquire()
+    try:
+        for mapper in list(_mapper_registry):
+            mapper.dispose()
+    finally:
+        mapperlib._COMPILE_MUTEX.release()
+
+def extension(ext):
+    """Return a ``MapperOption`` that will insert the given
+    ``MapperExtension`` to the beginning of the list of extensions
+    that will be called in the context of the ``Query``.
+
+    Used with ``query.options()``.
+
+    """
+    return ExtensionOption(ext)
+
+@sa_util.accepts_a_list_as_starargs(list_deprecation='pending')
+def eagerload(*keys):
+    """Return a ``MapperOption`` that will convert the property of the given
+    name into an eager load.
+
+    Used with ``query.options()``.
+
+    """
+    return strategies.EagerLazyOption(keys, lazy=False)
+
+@sa_util.accepts_a_list_as_starargs(list_deprecation='pending')
+def eagerload_all(*keys):
+    """Return a ``MapperOption`` that will convert all properties along the
+    given dot-separated path into an eager load.
+
+    For example, this::
+
+        query.options(eagerload_all('orders.items.keywords'))...
+
+    will set all of 'orders', 'orders.items', and 'orders.items.keywords' to
+    load in one eager load.
+
+    Used with ``query.options()``.
+
+    """
+    return strategies.EagerLazyOption(keys, lazy=False, chained=True)
+
+@sa_util.accepts_a_list_as_starargs(list_deprecation='pending')
+def lazyload(*keys):
+    """Return a ``MapperOption`` that will convert the property of the given
+    name into a lazy load.
+
+    Used with ``query.options()``.
+
+    """
+    return strategies.EagerLazyOption(keys, lazy=True)
+
+def noload(*keys):
+    """Return a ``MapperOption`` that will convert the property of the
+    given name into a non-load.
+
+    Used with ``query.options()``.
+
+    """
+    return strategies.EagerLazyOption(keys, lazy=None)
+
+def contains_alias(alias):
+    """Return a ``MapperOption`` that will indicate to the query that
+    the main table has been aliased.
+
+    `alias` is the string name or ``Alias`` object representing the
+    alias.
+
+    """
+    return AliasOption(alias)
+
+@sa_util.accepts_a_list_as_starargs(list_deprecation='pending')
+def contains_eager(*keys, **kwargs):
+    """Return a ``MapperOption`` that will indicate to the query that
+    the given attribute will be eagerly loaded.
+
+    Used when feeding SQL result sets directly into ``query.instances()``.
+    Also bundles an ``EagerLazyOption`` to turn on eager loading in case it
+    isn't already.
+
+    `alias` is the string name of an alias, **or** an ``sql.Alias`` object,
+    which represents the aliased columns in the query.  This argument is
+    optional.
+
+    """
+    alias = kwargs.pop('alias', None)
+    if kwargs:
+        raise exceptions.ArgumentError("Invalid kwargs for contains_eager: %r" % kwargs.keys())
+
+    return (strategies.EagerLazyOption(keys, lazy=False, propagate_to_loaders=False), strategies.LoadEagerFromAliasOption(keys, alias=alias))
+
+@sa_util.accepts_a_list_as_starargs(list_deprecation='pending')
+def defer(*keys):
+    """Return a ``MapperOption`` that will convert the column property of the
+    given name into a deferred load.
+
+    Used with ``query.options()``
+    """
+    return strategies.DeferredOption(keys, defer=True)
+
+@sa_util.accepts_a_list_as_starargs(list_deprecation='pending')
+def undefer(*keys):
+    """Return a ``MapperOption`` that will convert the column property of the
+    given name into a non-deferred (regular column) load.
+
+    Used with ``query.options()``.
+
+    """
+    return strategies.DeferredOption(keys, defer=False)
+
+def undefer_group(name):
+    """Return a ``MapperOption`` that will convert the given group of deferred
+    column properties into a non-deferred (regular column) load.
+
+    Used with ``query.options()``.
+
+    """
+    return strategies.UndeferGroupOption(name)
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/orm/shard.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/orm/shard.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/orm/shard.py (revision 3)
@@ -0,0 +1,127 @@
+# shard.py
+# Copyright (C) the SQLAlchemy authors and contributors
+#
+# This module is part of SQLAlchemy and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+"""Horizontal sharding support.
+
+Defines a rudimental 'horizontal sharding' system which allows a Session to
+distribute queries and persistence operations across multiple databases.
+
+For a usage example, see the file ``examples/sharding/attribute_shard.py``
+included in the source distrbution.
+
+"""
+
+import sqlalchemy.exceptions as sa_exc
+from sqlalchemy import util
+from sqlalchemy.orm.session import Session
+from sqlalchemy.orm.query import Query
+
+__all__ = ['ShardedSession', 'ShardedQuery']
+
+
+class ShardedSession(Session):
+    def __init__(self, shard_chooser, id_chooser, query_chooser, shards=None, **kwargs):
+        """Construct a ShardedSession.
+
+        shard_chooser
+          A callable which, passed a Mapper, a mapped instance, and possibly a
+          SQL clause, returns a shard ID.  This id may be based off of the
+          attributes present within the object, or on some round-robin
+          scheme. If the scheme is based on a selection, it should set
+          whatever state on the instance to mark it in the future as
+          participating in that shard.
+
+        id_chooser
+          A callable, passed a query and a tuple of identity values, which
+          should return a list of shard ids where the ID might reside.  The
+          databases will be queried in the order of this listing.
+
+        query_chooser
+          For a given Query, returns the list of shard_ids where the query
+          should be issued.  Results from all shards returned will be combined
+          together into a single listing.
+
+        """
+        super(ShardedSession, self).__init__(**kwargs)
+        self.shard_chooser = shard_chooser
+        self.id_chooser = id_chooser
+        self.query_chooser = query_chooser
+        self.__binds = {}
+        self._mapper_flush_opts = {'connection_callable':self.connection}
+        self._query_cls = ShardedQuery
+        if shards is not None:
+            for k in shards:
+                self.bind_shard(k, shards[k])
+        
+    def connection(self, mapper=None, instance=None, shard_id=None, **kwargs):
+        if shard_id is None:
+            shard_id = self.shard_chooser(mapper, instance)
+
+        if self.transaction is not None:
+            return self.transaction.connection(mapper, shard_id=shard_id)
+        else:
+            return self.get_bind(mapper, shard_id=shard_id, instance=instance).contextual_connect(**kwargs)
+    
+    def get_bind(self, mapper, shard_id=None, instance=None, clause=None, **kw):
+        if shard_id is None:
+            shard_id = self.shard_chooser(mapper, instance, clause=clause)
+        return self.__binds[shard_id]
+
+    def bind_shard(self, shard_id, bind):
+        self.__binds[shard_id] = bind
+
+class ShardedQuery(Query):
+    def __init__(self, *args, **kwargs):
+        super(ShardedQuery, self).__init__(*args, **kwargs)
+        self.id_chooser = self.session.id_chooser
+        self.query_chooser = self.session.query_chooser
+        self._shard_id = None
+        
+    def set_shard(self, shard_id):
+        """return a new query, limited to a single shard ID.
+        
+        all subsequent operations with the returned query will 
+        be against the single shard regardless of other state.
+        """
+        
+        q = self._clone()
+        q._shard_id = shard_id
+        return q
+        
+    def _execute_and_instances(self, context):
+        if self._shard_id is not None:
+            result = self.session.connection(mapper=self._mapper_zero(), shard_id=self._shard_id).execute(context.statement, self._params)
+            return self.instances(result, context)
+        else:
+            partial = []
+            for shard_id in self.query_chooser(self):
+                result = self.session.connection(mapper=self._mapper_zero(), shard_id=shard_id).execute(context.statement, self._params)
+                partial = partial + list(self.instances(result, context))
+            # if some kind of in memory 'sorting' were done, this is where it would happen
+            return iter(partial)
+
+    def get(self, ident, **kwargs):
+        if self._shard_id is not None:
+            return super(ShardedQuery, self).get(ident)
+        else:
+            ident = util.to_list(ident)
+            for shard_id in self.id_chooser(self, ident):
+                o = self.set_shard(shard_id).get(ident, **kwargs)
+                if o is not None:
+                    return o
+            else:
+                return None
+    
+    def load(self, ident, **kwargs):
+        if self._shard_id is not None:
+            return super(ShardedQuery, self).load(ident)
+        else:
+            for shard_id in self.id_chooser(self, ident):
+                o = self.set_shard(shard_id).load(ident, raiseerr=False, **kwargs)
+                if o is not None:
+                    return o
+            else:
+                raise sa_exc.InvalidRequestError("No instance found for identity %s" % repr(ident))
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/orm/scoping.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/orm/scoping.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/orm/scoping.py (revision 3)
@@ -0,0 +1,208 @@
+# scoping.py
+# Copyright (C) the SQLAlchemy authors and contributors
+#
+# This module is part of SQLAlchemy and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+import sqlalchemy.exceptions as sa_exc
+from sqlalchemy.util import ScopedRegistry, ThreadLocalRegistry, \
+                            to_list, get_cls_kwargs, deprecated
+from sqlalchemy.orm import (
+    EXT_CONTINUE, MapperExtension, class_mapper, object_session
+    )
+from sqlalchemy.orm import exc as orm_exc
+from sqlalchemy.orm.session import Session
+
+
+__all__ = ['ScopedSession']
+
+
+class ScopedSession(object):
+    """Provides thread-local management of Sessions.
+
+    Usage::
+
+      Session = scoped_session(sessionmaker(autoflush=True))
+
+      ... use session normally.
+
+    """
+
+    def __init__(self, session_factory, scopefunc=None):
+        self.session_factory = session_factory
+        if scopefunc:
+            self.registry = ScopedRegistry(session_factory, scopefunc)
+        else:
+            self.registry = ThreadLocalRegistry(session_factory)
+        self.extension = _ScopedExt(self)
+
+    def __call__(self, **kwargs):
+        if kwargs:
+            scope = kwargs.pop('scope', False)
+            if scope is not None:
+                if self.registry.has():
+                    raise sa_exc.InvalidRequestError("Scoped session is already present; no new arguments may be specified.")
+                else:
+                    sess = self.session_factory(**kwargs)
+                    self.registry.set(sess)
+                    return sess
+            else:
+                return self.session_factory(**kwargs)
+        else:
+            return self.registry()
+
+    def remove(self):
+        if self.registry.has():
+            self.registry().close()
+        self.registry.clear()
+
+    @deprecated("Session.mapper is deprecated.  "
+        "Please see http://www.sqlalchemy.org/trac/wiki/UsageRecipes/SessionAwareMapper "
+        "for information on how to replicate its behavior.")
+    def mapper(self, *args, **kwargs):
+        """return a mapper() function which associates this ScopedSession with the Mapper.
+        
+        DEPRECATED.
+        
+        """
+
+        from sqlalchemy.orm import mapper
+
+        extension_args = dict((arg, kwargs.pop(arg))
+                              for arg in get_cls_kwargs(_ScopedExt)
+                              if arg in kwargs)
+
+        kwargs['extension'] = extension = to_list(kwargs.get('extension', []))
+        if extension_args:
+            extension.append(self.extension.configure(**extension_args))
+        else:
+            extension.append(self.extension)
+        return mapper(*args, **kwargs)
+
+    def configure(self, **kwargs):
+        """reconfigure the sessionmaker used by this ScopedSession."""
+
+        self.session_factory.configure(**kwargs)
+
+    def query_property(self, query_cls=None):
+        """return a class property which produces a `Query` object against the
+        class when called.
+
+        e.g.::
+            Session = scoped_session(sessionmaker())
+
+            class MyClass(object):
+                query = Session.query_property()
+
+            # after mappers are defined
+            result = MyClass.query.filter(MyClass.name=='foo').all()
+
+        Produces instances of the session's configured query class by
+        default.  To override and use a custom implementation, provide
+        a ``query_cls`` callable.  The callable will be invoked with
+        the class's mapper as a positional argument and a session
+        keyword argument.
+
+        There is no limit to the number of query properties placed on
+        a class.
+
+        """
+        class query(object):
+            def __get__(s, instance, owner):
+                try:
+                    mapper = class_mapper(owner)
+                    if mapper:
+                        if query_cls:
+                            # custom query class
+                            return query_cls(mapper, session=self.registry())
+                        else:
+                            # session's configured query class
+                            return self.registry().query(mapper)
+                except orm_exc.UnmappedClassError:
+                    return None
+        return query()
+
+def instrument(name):
+    def do(self, *args, **kwargs):
+        return getattr(self.registry(), name)(*args, **kwargs)
+    return do
+for meth in Session.public_methods:
+    setattr(ScopedSession, meth, instrument(meth))
+
+def makeprop(name):
+    def set(self, attr):
+        setattr(self.registry(), name, attr)
+    def get(self):
+        return getattr(self.registry(), name)
+    return property(get, set)
+for prop in ('bind', 'dirty', 'deleted', 'new', 'identity_map', 'is_active'):
+    setattr(ScopedSession, prop, makeprop(prop))
+
+def clslevel(name):
+    def do(cls, *args, **kwargs):
+        return getattr(Session, name)(*args, **kwargs)
+    return classmethod(do)
+for prop in ('close_all', 'object_session', 'identity_key'):
+    setattr(ScopedSession, prop, clslevel(prop))
+
+class _ScopedExt(MapperExtension):
+    def __init__(self, context, validate=False, save_on_init=True):
+        self.context = context
+        self.validate = validate
+        self.save_on_init = save_on_init
+        self.set_kwargs_on_init = True
+
+    def validating(self):
+        return _ScopedExt(self.context, validate=True)
+
+    def configure(self, **kwargs):
+        return _ScopedExt(self.context, **kwargs)
+
+    def instrument_class(self, mapper, class_):
+        class query(object):
+            def __getattr__(s, key):
+                return getattr(self.context.registry().query(class_), key)
+            def __call__(s):
+                return self.context.registry().query(class_)
+            def __get__(self, instance, cls):
+                return self
+
+        if not 'query' in class_.__dict__:
+            class_.query = query()
+
+        if self.set_kwargs_on_init and class_.__init__ is object.__init__:
+            class_.__init__ = self._default__init__(mapper)
+
+    def _default__init__(ext, mapper):
+        def __init__(self, **kwargs):
+            for key, value in kwargs.items():
+                if ext.validate:
+                    if not mapper.get_property(key, resolve_synonyms=False,
+                                               raiseerr=False):
+                        raise sa_exc.ArgumentError(
+                            "Invalid __init__ argument: '%s'" % key)
+                setattr(self, key, value)
+        return __init__
+
+    def init_instance(self, mapper, class_, oldinit, instance, args, kwargs):
+        if self.save_on_init:
+            session = kwargs.pop('_sa_session', None)
+            if session is None:
+                session = self.context.registry()
+            session._save_without_cascade(instance)
+        return EXT_CONTINUE
+
+    def init_failed(self, mapper, class_, oldinit, instance, args, kwargs):
+        sess = object_session(instance)
+        if sess:
+            sess.expunge(instance)
+        return EXT_CONTINUE
+
+    def dispose_class(self, mapper, class_):
+        if hasattr(class_, '__init__') and hasattr(class_.__init__, '_oldinit'):
+            if class_.__init__._oldinit is not None:
+                class_.__init__ = class_.__init__._oldinit
+            else:
+                delattr(class_, '__init__')
+        if hasattr(class_, 'query'):
+            delattr(class_, 'query')
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/orm/evaluator.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/orm/evaluator.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/orm/evaluator.py (revision 3)
@@ -0,0 +1,98 @@
+import operator
+from sqlalchemy.sql import operators, functions
+from sqlalchemy.sql import expression as sql
+
+
+class UnevaluatableError(Exception):
+    pass
+
+_straight_ops = set(getattr(operators, op)
+                    for op in ('add', 'mul', 'sub', 'div', 'mod', 'truediv',
+                               'lt', 'le', 'ne', 'gt', 'ge', 'eq'))
+
+
+_notimplemented_ops = set(getattr(operators, op)
+                          for op in ('like_op', 'notlike_op', 'ilike_op',
+                                     'notilike_op', 'between_op', 'in_op',
+                                     'notin_op', 'endswith_op', 'concat_op'))
+
+class EvaluatorCompiler(object):
+    def process(self, clause):
+        meth = getattr(self, "visit_%s" % clause.__visit_name__, None)
+        if not meth:
+            raise UnevaluatableError("Cannot evaluate %s" % type(clause).__name__)
+        return meth(clause)
+
+    def visit_grouping(self, clause):
+        return self.process(clause.element)
+
+    def visit_null(self, clause):
+        return lambda obj: None
+
+    def visit_column(self, clause):
+        if 'parentmapper' in clause._annotations:
+            key = clause._annotations['parentmapper']._get_col_to_prop(clause).key
+        else:
+            key = clause.key
+        get_corresponding_attr = operator.attrgetter(key)
+        return lambda obj: get_corresponding_attr(obj)
+
+    def visit_clauselist(self, clause):
+        evaluators = map(self.process, clause.clauses)
+        if clause.operator is operators.or_:
+            def evaluate(obj):
+                has_null = False
+                for sub_evaluate in evaluators:
+                    value = sub_evaluate(obj)
+                    if value:
+                        return True
+                    has_null = has_null or value is None
+                if has_null:
+                    return None
+                return False
+        if clause.operator is operators.and_:
+            def evaluate(obj):
+                for sub_evaluate in evaluators:
+                    value = sub_evaluate(obj)
+                    if not value:
+                        if value is None:
+                            return None
+                        return False
+                return True
+
+        return evaluate
+
+    def visit_binary(self, clause):
+        eval_left,eval_right = map(self.process, [clause.left, clause.right])
+        operator = clause.operator
+        if operator is operators.is_:
+            def evaluate(obj):
+                return eval_left(obj) == eval_right(obj)
+        elif operator is operators.isnot:
+            def evaluate(obj):
+                return eval_left(obj) != eval_right(obj)
+        elif operator in _straight_ops:
+            def evaluate(obj):
+                left_val = eval_left(obj)
+                right_val = eval_right(obj)
+                if left_val is None or right_val is None:
+                    return None
+                return operator(eval_left(obj), eval_right(obj))
+        else:
+            raise UnevaluatableError("Cannot evaluate %s with operator %s" % (type(clause).__name__, clause.operator))
+        return evaluate
+
+    def visit_unary(self, clause):
+        eval_inner = self.process(clause.element)
+        if clause.operator is operators.inv:
+            def evaluate(obj):
+                value = eval_inner(obj)
+                if value is None:
+                    return None
+                return not value
+            return evaluate
+        raise UnevaluatableError("Cannot evaluate %s with operator %s" % (type(clause).__name__, clause.operator))
+
+    def visit_bindparam(self, clause):
+        val = clause.value
+        return lambda obj: val
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/orm/query.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/orm/query.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/orm/query.py (revision 3)
@@ -0,0 +1,2229 @@
+# orm/query.py
+# Copyright (C) 2005, 2006, 2007, 2008, 2009 Michael Bayer mike_mp@zzzcomputing.com
+#
+# This module is part of SQLAlchemy and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+"""The Query class and support.
+
+Defines the :class:`~sqlalchemy.orm.query.Query` class, the central construct used by
+the ORM to construct database queries.
+
+The ``Query`` class should not be confused with the
+:class:`~sqlalchemy.sql.expression.Select` class, which defines database SELECT
+operations at the SQL (non-ORM) level.  ``Query`` differs from ``Select`` in
+that it returns ORM-mapped objects and interacts with an ORM session, whereas
+the ``Select`` construct interacts directly with the database to return
+iterable result sets.
+
+"""
+
+from itertools import chain
+from operator import itemgetter
+
+from sqlalchemy import sql, util, log, schema
+from sqlalchemy import exc as sa_exc
+from sqlalchemy.orm import exc as orm_exc
+from sqlalchemy.sql import util as sql_util
+from sqlalchemy.sql import expression, visitors, operators
+from sqlalchemy.orm import (
+    attributes, interfaces, mapper, object_mapper, evaluator,
+    )
+from sqlalchemy.orm.util import (
+    AliasedClass, ORMAdapter, _entity_descriptor, _entity_info,
+    _is_aliased_class, _is_mapped_class, _orm_columns, _orm_selectable,
+    join as orm_join,
+    )
+
+
+__all__ = ['Query', 'QueryContext', 'aliased']
+
+
+aliased = AliasedClass
+
+def _generative(*assertions):
+    """Mark a method as generative."""
+
+    @util.decorator
+    def generate(fn, *args, **kw):
+        self = args[0]._clone()
+        for assertion in assertions:
+            assertion(self, fn.func_name)
+        fn(self, *args[1:], **kw)
+        return self
+    return generate
+
+class Query(object):
+    """ORM-level SQL construction object."""
+    
+    _enable_eagerloads = True
+    _enable_assertions = True
+    _with_labels = False
+    _criterion = None
+    _yield_per = None
+    _lockmode = None
+    _order_by = False
+    _group_by = False
+    _having = None
+    _distinct = False
+    _offset = None
+    _limit = None
+    _statement = None
+    _joinpoint = None
+    _correlate = frozenset()
+    _populate_existing = False
+    _version_check = False
+    _autoflush = True
+    _current_path = ()
+    _only_load_props = None
+    _refresh_state = None
+    _from_obj = ()
+    _filter_aliases = None
+    _from_obj_alias = None
+    _currenttables = frozenset()
+    
+    def __init__(self, entities, session=None):
+        self.session = session
+
+        self._with_options = []
+        self._params = {}
+        self._attributes = {}
+        self._polymorphic_adapters = {}
+        self._set_entities(entities)
+
+    def _set_entities(self, entities, entity_wrapper=None):
+        if entity_wrapper is None:
+            entity_wrapper = _QueryEntity
+        self._entities = []
+        for ent in util.to_list(entities):
+            entity_wrapper(self, ent)
+
+        self._setup_aliasizers(self._entities)
+
+    def _setup_aliasizers(self, entities):
+        if hasattr(self, '_mapper_adapter_map'):
+            # usually safe to share a single map, but copying to prevent
+            # subtle leaks if end-user is reusing base query with arbitrary
+            # number of aliased() objects
+            self._mapper_adapter_map = d = self._mapper_adapter_map.copy()
+        else:
+            self._mapper_adapter_map = d = {}
+
+        for ent in entities:
+            for entity in ent.entities:
+                if entity not in d:
+                    mapper, selectable, is_aliased_class = _entity_info(entity)
+                    if not is_aliased_class and mapper.with_polymorphic:
+                        with_polymorphic = mapper._with_polymorphic_mappers
+                        self.__mapper_loads_polymorphically_with(mapper, 
+                                sql_util.ColumnAdapter(selectable, mapper._equivalent_columns))
+                        adapter = None
+                    elif is_aliased_class:
+                        adapter = sql_util.ColumnAdapter(selectable, mapper._equivalent_columns)
+                        with_polymorphic = None
+                    else:
+                        with_polymorphic = adapter = None
+
+                    d[entity] = (mapper, adapter, selectable, is_aliased_class, with_polymorphic)
+                ent.setup_entity(entity, *d[entity])
+
+    def __mapper_loads_polymorphically_with(self, mapper, adapter):
+        for m2 in mapper._with_polymorphic_mappers:
+            self._polymorphic_adapters[m2] = adapter
+            for m in m2.iterate_to_root():
+                self._polymorphic_adapters[m.mapped_table] = self._polymorphic_adapters[m.local_table] = adapter
+
+    def _set_select_from(self, from_obj):
+        if isinstance(from_obj, expression._SelectBaseMixin):
+            from_obj = from_obj.alias()
+
+        self._from_obj = (from_obj,)
+        equivs = self.__all_equivs()
+
+        if isinstance(from_obj, expression.Alias):
+            self._from_obj_alias = sql_util.ColumnAdapter(from_obj, equivs)
+
+    def _get_polymorphic_adapter(self, entity, selectable):
+        self.__mapper_loads_polymorphically_with(entity.mapper, 
+                                sql_util.ColumnAdapter(selectable, entity.mapper._equivalent_columns))
+
+    def _reset_polymorphic_adapter(self, mapper):
+        for m2 in mapper._with_polymorphic_mappers:
+            self._polymorphic_adapters.pop(m2, None)
+            for m in m2.iterate_to_root():
+                self._polymorphic_adapters.pop(m.mapped_table, None)
+                self._polymorphic_adapters.pop(m.local_table, None)
+
+    def _reset_joinpoint(self):
+        self._joinpoint = None
+        self._filter_aliases = None
+
+    def __adapt_polymorphic_element(self, element):
+        if isinstance(element, expression.FromClause):
+            search = element
+        elif hasattr(element, 'table'):
+            search = element.table
+        else:
+            search = None
+
+        if search:
+            alias = self._polymorphic_adapters.get(search, None)
+            if alias:
+                return alias.adapt_clause(element)
+
+    def __replace_element(self, adapters):
+        def replace(elem):
+            if '_halt_adapt' in elem._annotations:
+                return elem
+
+            for adapter in adapters:
+                e = adapter(elem)
+                if e:
+                    return e
+        return replace
+
+    def __replace_orm_element(self, adapters):
+        def replace(elem):
+            if '_halt_adapt' in elem._annotations:
+                return elem
+
+            if "_orm_adapt" in elem._annotations or "parententity" in elem._annotations:
+                for adapter in adapters:
+                    e = adapter(elem)
+                    if e:
+                        return e
+        return replace
+
+    @_generative()
+    def _adapt_all_clauses(self):
+        self._disable_orm_filtering = True
+
+    def _adapt_clause(self, clause, as_filter, orm_only):
+        adapters = []
+        if as_filter and self._filter_aliases:
+            adapters.append(self._filter_aliases.replace)
+
+        if self._from_obj_alias:
+            adapters.append(self._from_obj_alias.replace)
+
+        if self._polymorphic_adapters:
+            adapters.append(self.__adapt_polymorphic_element)
+
+        if not adapters:
+            return clause
+
+        if getattr(self, '_disable_orm_filtering', not orm_only):
+            return visitors.replacement_traverse(
+                                clause, 
+                                {'column_collections':False}, 
+                                self.__replace_element(adapters)
+                            )
+        else:
+            return visitors.replacement_traverse(
+                                clause, 
+                                {'column_collections':False}, 
+                                self.__replace_orm_element(adapters)
+                            )
+
+    def _entity_zero(self):
+        return self._entities[0]
+
+    def _mapper_zero(self):
+        return self._entity_zero().entity_zero
+
+    def _extension_zero(self):
+        ent = self._entity_zero()
+        return getattr(ent, 'extension', ent.mapper.extension)
+
+    @property
+    def _mapper_entities(self):
+        # TODO: this is wrong, its hardcoded to "priamry entity" when
+        # for the case of __all_equivs() it should not be
+        # the name of this accessor is wrong too
+        for ent in self._entities:
+            if hasattr(ent, 'primary_entity'):
+                yield ent
+
+    def _joinpoint_zero(self):
+        return self._joinpoint or self._entity_zero().entity_zero
+
+    def _mapper_zero_or_none(self):
+        if not getattr(self._entities[0], 'primary_entity', False):
+            return None
+        return self._entities[0].mapper
+
+    def _only_mapper_zero(self, rationale=None):
+        if len(self._entities) > 1:
+            raise sa_exc.InvalidRequestError(
+                    rationale or "This operation requires a Query against a single mapper."
+                )
+        return self._mapper_zero()
+
+    def _only_entity_zero(self, rationale=None):
+        if len(self._entities) > 1:
+            raise sa_exc.InvalidRequestError(
+                    rationale or "This operation requires a Query against a single mapper."
+                )
+        return self._entity_zero()
+
+    def _generate_mapper_zero(self):
+        if not getattr(self._entities[0], 'primary_entity', False):
+            raise sa_exc.InvalidRequestError("No primary mapper set up for this Query.")
+        entity = self._entities[0]._clone()
+        self._entities = [entity] + self._entities[1:]
+        return entity
+
+    def __all_equivs(self):
+        equivs = {}
+        for ent in self._mapper_entities:
+            equivs.update(ent.mapper._equivalent_columns)
+        return equivs
+
+    def _no_criterion_condition(self, meth):
+        if not self._enable_assertions:
+            return
+        if self._criterion or self._statement or self._from_obj or \
+                self._limit is not None or self._offset is not None or \
+                self._group_by:
+            raise sa_exc.InvalidRequestError("Query.%s() being called on a Query with existing criterion. " % meth)
+
+        self._from_obj = ()
+        self._statement = self._criterion = None
+        self._order_by = self._group_by = self._distinct = False
+
+    def _no_clauseelement_condition(self, meth):
+        if not self._enable_assertions:
+            return
+        if self._order_by:
+            raise sa_exc.InvalidRequestError("Query.%s() being called on a Query with existing criterion. " % meth)
+        self._no_criterion_condition(meth)
+
+    def _no_statement_condition(self, meth):
+        if not self._enable_assertions:
+            return
+        if self._statement:
+            raise sa_exc.InvalidRequestError(
+                ("Query.%s() being called on a Query with an existing full "
+                 "statement - can't apply criterion.") % meth)
+
+    def _no_limit_offset(self, meth):
+        if not self._enable_assertions:
+            return
+        if self._limit is not None or self._offset is not None:
+            raise sa_exc.InvalidRequestError(
+                "Query.%s() being called on a Query which already has LIMIT or OFFSET applied. "
+                "To modify the row-limited results of a Query, call from_self() first.  "
+                "Otherwise, call %s() before limit() or offset() are applied." % (meth, meth)
+            )
+
+    def _no_select_modifiers(self, meth):
+        if not self._enable_assertions:
+            return
+        for attr, methname, notset in (
+            ('_limit', 'limit()', None),
+            ('_offset', 'offset()', None),
+            ('_order_by', 'order_by()', False),
+            ('_group_by', 'group_by()', False),
+            ('_distinct', 'distinct()', False),
+        ):
+            if getattr(self, attr) is not notset:
+                raise sa_exc.InvalidRequestError(
+                    "Can't call Query.%s() when %s has been called" % (meth, methname)
+                )
+
+    def _get_options(self, populate_existing=None, 
+                            version_check=None, 
+                            only_load_props=None, 
+                            refresh_state=None):
+        if populate_existing:
+            self._populate_existing = populate_existing
+        if version_check:
+            self._version_check = version_check
+        if refresh_state:
+            self._refresh_state = refresh_state
+        if only_load_props:
+            self._only_load_props = set(only_load_props)
+        return self
+
+    def _clone(self):
+        cls = self.__class__
+        q = cls.__new__(cls)
+        q.__dict__ = self.__dict__.copy()
+        return q
+
+    @property
+    def statement(self):
+        """The full SELECT statement represented by this Query."""
+
+        return self._compile_context(labels=self._with_labels).\
+                        statement._annotate({'_halt_adapt': True})
+
+    def subquery(self):
+        """return the full SELECT statement represented by this Query, embedded within an Alias.
+
+        Eager JOIN generation within the query is disabled.
+
+        """
+        return self.enable_eagerloads(False).statement.alias()
+
+    def __clause_element__(self):
+        return self.enable_eagerloads(False).statement
+
+    @_generative()
+    def enable_eagerloads(self, value):
+        """Control whether or not eager joins are rendered.
+
+        When set to False, the returned Query will not render
+        eager joins regardless of eagerload() options
+        or mapper-level lazy=False configurations.
+
+        This is used primarily when nesting the Query's
+        statement into a subquery or other
+        selectable.
+
+        """
+        self._enable_eagerloads = value
+
+    @_generative()
+    def with_labels(self):
+        """Apply column labels to the return value of Query.statement.
+
+        Indicates that this Query's `statement` accessor should return
+        a SELECT statement that applies labels to all columns in the
+        form <tablename>_<columnname>; this is commonly used to
+        disambiguate columns from multiple tables which have the same
+        name.
+
+        When the `Query` actually issues SQL to load rows, it always
+        uses column labeling.
+
+        """
+        self._with_labels = True
+    
+    @_generative()
+    def enable_assertions(self, value):
+        """Control whether assertions are generated.
+        
+        When set to False, the returned Query will 
+        not assert its state before certain operations, 
+        including that LIMIT/OFFSET has not been applied
+        when filter() is called, no criterion exists
+        when get() is called, and no "from_statement()"
+        exists when filter()/order_by()/group_by() etc.
+        is called.  This more permissive mode is used by 
+        custom Query subclasses to specify criterion or 
+        other modifiers outside of the usual usage patterns.
+        
+        Care should be taken to ensure that the usage 
+        pattern is even possible.  A statement applied
+        by from_statement() will override any criterion
+        set by filter() or order_by(), for example.
+        
+        """
+        self._enable_assertions = value
+        
+    @property
+    def whereclause(self):
+        """The WHERE criterion for this Query."""
+        return self._criterion
+
+    @_generative()
+    def _with_current_path(self, path):
+        """indicate that this query applies to objects loaded within a certain path.
+
+        Used by deferred loaders (see strategies.py) which transfer query
+        options from an originating query to a newly generated query intended
+        for the deferred load.
+
+        """
+        self._current_path = path
+
+    @_generative(_no_clauseelement_condition)
+    def with_polymorphic(self, cls_or_mappers, selectable=None, discriminator=None):
+        """Load columns for descendant mappers of this Query's mapper.
+
+        Using this method will ensure that each descendant mapper's
+        tables are included in the FROM clause, and will allow filter()
+        criterion to be used against those tables.  The resulting
+        instances will also have those columns already loaded so that
+        no "post fetch" of those columns will be required.
+
+        :param cls_or_mappers: a single class or mapper, or list of class/mappers,
+            which inherit from this Query's mapper.  Alternatively, it
+            may also be the string ``'*'``, in which case all descending
+            mappers will be added to the FROM clause.
+
+        :param selectable: a table or select() statement that will
+            be used in place of the generated FROM clause.  This argument
+            is required if any of the desired mappers use concrete table
+            inheritance, since SQLAlchemy currently cannot generate UNIONs
+            among tables automatically.  If used, the ``selectable``
+            argument must represent the full set of tables and columns mapped
+            by every desired mapper.  Otherwise, the unaccounted mapped columns
+            will result in their table being appended directly to the FROM
+            clause which will usually lead to incorrect results.
+
+        :param discriminator: a column to be used as the "discriminator"
+            column for the given selectable.  If not given, the polymorphic_on
+            attribute of the mapper will be used, if any.   This is useful
+            for mappers that don't have polymorphic loading behavior by default,
+            such as concrete table mappers.
+
+        """
+        entity = self._generate_mapper_zero()
+        entity.set_with_polymorphic(self, cls_or_mappers, selectable=selectable, discriminator=discriminator)
+
+    @_generative()
+    def yield_per(self, count):
+        """Yield only ``count`` rows at a time.
+
+        WARNING: use this method with caution; if the same instance is present
+        in more than one batch of rows, end-user changes to attributes will be
+        overwritten.
+
+        In particular, it's usually impossible to use this setting with
+        eagerly loaded collections (i.e. any lazy=False) since those
+        collections will be cleared for a new load when encountered in a
+        subsequent result batch.
+
+        """
+        self._yield_per = count
+
+    def get(self, ident):
+        """Return an instance of the object based on the given identifier, or None if not found.
+
+        The `ident` argument is a scalar or tuple of primary key column values
+        in the order of the table def's primary key columns.
+
+        """
+
+        # convert composite types to individual args
+        if hasattr(ident, '__composite_values__'):
+            ident = ident.__composite_values__()
+
+        key = self._only_mapper_zero(
+                    "get() can only be used against a single mapped class."
+                ).identity_key_from_primary_key(ident)
+        return self._get(key, ident)
+
+    @classmethod
+    @util.deprecated('Deprecated.  Use sqlalchemy.orm.with_parent '
+                     'in conjunction with filter().')
+    def query_from_parent(cls, instance, property, **kwargs):
+        """Return a new Query with criterion corresponding to a parent instance.
+
+        Return a newly constructed Query object, with criterion corresponding
+        to a relationship to the given parent instance.
+
+        instance
+          a persistent or detached instance which is related to class
+          represented by this query.
+
+         property
+           string name of the property which relates this query's class to the
+           instance.
+
+         \**kwargs
+           all extra keyword arguments are propagated to the constructor of
+           Query.
+
+        """
+        mapper = object_mapper(instance)
+        prop = mapper.get_property(property, resolve_synonyms=True)
+        target = prop.mapper
+        criterion = prop.compare(operators.eq, instance, value_is_parent=True)
+        return Query(target, **kwargs).filter(criterion)
+
+    @_generative()
+    def correlate(self, *args):
+        self._correlate = self._correlate.union(_orm_selectable(s) for s in args)
+
+    @_generative()
+    def autoflush(self, setting):
+        """Return a Query with a specific 'autoflush' setting.
+
+        Note that a Session with autoflush=False will
+        not autoflush, even if this flag is set to True at the
+        Query level.  Therefore this flag is usually used only
+        to disable autoflush for a specific Query.
+
+        """
+        self._autoflush = setting
+
+    @_generative()
+    def populate_existing(self):
+        """Return a Query that will refresh all instances loaded.
+
+        This includes all entities accessed from the database, including
+        secondary entities, eagerly-loaded collection items.
+
+        All changes present on entities which are already present in the
+        session will be reset and the entities will all be marked "clean".
+
+        An alternative to populate_existing() is to expire the Session
+        fully using session.expire_all().
+
+        """
+        self._populate_existing = True
+
+    def with_parent(self, instance, property=None):
+        """Add a join criterion corresponding to a relationship to the given
+        parent instance.
+
+        instance
+          a persistent or detached instance which is related to class
+          represented by this query.
+
+        property
+          string name of the property which relates this query's class to the
+          instance.  if None, the method will attempt to find a suitable
+          property.
+
+        Currently, this method only works with immediate parent relationships,
+        but in the future may be enhanced to work across a chain of parent
+        mappers.
+
+        """
+        from sqlalchemy.orm import properties
+        mapper = object_mapper(instance)
+        if property is None:
+            for prop in mapper.iterate_properties:
+                if isinstance(prop, properties.PropertyLoader) and prop.mapper is self._mapper_zero():
+                    break
+            else:
+                raise sa_exc.InvalidRequestError(
+                            "Could not locate a property which relates instances "
+                            "of class '%s' to instances of class '%s'" % 
+                            (self._mapper_zero().class_.__name__, instance.__class__.__name__)
+                        )
+        else:
+            prop = mapper.get_property(property, resolve_synonyms=True)
+        return self.filter(prop.compare(operators.eq, instance, value_is_parent=True))
+
+    @_generative()
+    def add_entity(self, entity, alias=None):
+        """add a mapped entity to the list of result columns to be returned."""
+
+        if alias:
+            entity = aliased(entity, alias)
+
+        self._entities = list(self._entities)
+        m = _MapperEntity(self, entity)
+        self._setup_aliasizers([m])
+
+    def from_self(self, *entities):
+        """return a Query that selects from this Query's SELECT statement.
+
+        \*entities - optional list of entities which will replace
+        those being selected.
+
+        """
+        fromclause = self.with_labels().enable_eagerloads(False).statement.correlate(None)
+        q = self._from_selectable(fromclause)
+        if entities:
+            q._set_entities(entities)
+        return q
+
+    _from_self = from_self
+
+    @_generative()
+    def _from_selectable(self, fromclause):
+        self._statement = self._criterion = None
+        self._order_by = self._group_by = self._distinct = False
+        self._limit = self._offset = None
+        self._set_select_from(fromclause)
+
+    def values(self, *columns):
+        """Return an iterator yielding result tuples corresponding to the given list of columns"""
+
+        if not columns:
+            return iter(())
+        q = self._clone()
+        q._set_entities(columns, entity_wrapper=_ColumnEntity)
+        if not q._yield_per:
+            q._yield_per = 10
+        return iter(q)
+    _values = values
+
+    def value(self, column):
+        """Return a scalar result corresponding to the given column expression."""
+        try:
+            return self.values(column).next()[0]
+        except StopIteration:
+            return None
+
+    @_generative()
+    def add_column(self, column):
+        """Add a SQL ColumnElement to the list of result columns to be returned."""
+
+        self._entities = list(self._entities)
+        l = len(self._entities)
+        _ColumnEntity(self, column)
+        # _ColumnEntity may add many entities if the
+        # given arg is a FROM clause
+        self._setup_aliasizers(self._entities[l:])
+
+    def options(self, *args):
+        """Return a new Query object, applying the given list of
+        MapperOptions.
+
+        """
+        return self._options(False, *args)
+
+    def _conditional_options(self, *args):
+        return self._options(True, *args)
+
+    @_generative()
+    def _options(self, conditional, *args):
+        # most MapperOptions write to the '_attributes' dictionary,
+        # so copy that as well
+        self._attributes = self._attributes.copy()
+        opts = [o for o in util.flatten_iterator(args)]
+        self._with_options = self._with_options + opts
+        if conditional:
+            for opt in opts:
+                opt.process_query_conditionally(self)
+        else:
+            for opt in opts:
+                opt.process_query(self)
+
+    @_generative()
+    def with_lockmode(self, mode):
+        """Return a new Query object with the specified locking mode."""
+
+        self._lockmode = mode
+
+    @_generative()
+    def params(self, *args, **kwargs):
+        """add values for bind parameters which may have been specified in filter().
+
+        parameters may be specified using \**kwargs, or optionally a single dictionary
+        as the first positional argument.  The reason for both is that \**kwargs is
+        convenient, however some parameter dictionaries contain unicode keys in which case
+        \**kwargs cannot be used.
+
+        """
+        if len(args) == 1:
+            kwargs.update(args[0])
+        elif len(args) > 0:
+            raise sa_exc.ArgumentError("params() takes zero or one positional argument, which is a dictionary.")
+        self._params = self._params.copy()
+        self._params.update(kwargs)
+
+    @_generative(_no_statement_condition, _no_limit_offset)
+    def filter(self, criterion):
+        """apply the given filtering criterion to the query and return the newly resulting ``Query``
+
+        the criterion is any sql.ClauseElement applicable to the WHERE clause of a select.
+
+        """
+        if isinstance(criterion, basestring):
+            criterion = sql.text(criterion)
+
+        if criterion is not None and not isinstance(criterion, sql.ClauseElement):
+            raise sa_exc.ArgumentError("filter() argument must be of type sqlalchemy.sql.ClauseElement or string")
+
+        criterion = self._adapt_clause(criterion, True, True)
+
+        if self._criterion is not None:
+            self._criterion = self._criterion & criterion
+        else:
+            self._criterion = criterion
+
+    def filter_by(self, **kwargs):
+        """apply the given filtering criterion to the query and return the newly resulting ``Query``."""
+
+        clauses = [_entity_descriptor(self._joinpoint_zero(), key)[0] == value
+            for key, value in kwargs.iteritems()]
+
+        return self.filter(sql.and_(*clauses))
+
+
+    @_generative(_no_statement_condition, _no_limit_offset)
+    @util.accepts_a_list_as_starargs(list_deprecation='pending')
+    def order_by(self, *criterion):
+        """apply one or more ORDER BY criterion to the query and return the newly resulting ``Query``"""
+
+        if len(criterion) == 1 and criterion[0] is None:
+            self._order_by = None
+        else:
+            criterion = [self._adapt_clause(expression._literal_as_text(o), True, True) for o in criterion]
+
+            if self._order_by is False or self._order_by is None:
+                self._order_by = criterion
+            else:
+                self._order_by = self._order_by + criterion
+
+    @_generative(_no_statement_condition, _no_limit_offset)
+    @util.accepts_a_list_as_starargs(list_deprecation='pending')
+    def group_by(self, *criterion):
+        """apply one or more GROUP BY criterion to the query and return the newly resulting ``Query``"""
+
+        criterion = list(chain(*[_orm_columns(c) for c in criterion]))
+
+        criterion = [self._adapt_clause(expression._literal_as_text(o), True, True) for o in criterion]
+
+        if self._group_by is False:
+            self._group_by = criterion
+        else:
+            self._group_by = self._group_by + criterion
+
+    @_generative(_no_statement_condition, _no_limit_offset)
+    def having(self, criterion):
+        """apply a HAVING criterion to the query and return the newly resulting ``Query``."""
+
+        if isinstance(criterion, basestring):
+            criterion = sql.text(criterion)
+
+        if criterion is not None and not isinstance(criterion, sql.ClauseElement):
+            raise sa_exc.ArgumentError("having() argument must be of type sqlalchemy.sql.ClauseElement or string")
+
+        criterion = self._adapt_clause(criterion, True, True)
+
+        if self._having is not None:
+            self._having = self._having & criterion
+        else:
+            self._having = criterion
+
+    def union(self, *q):
+        """Produce a UNION of this Query against one or more queries.
+
+        e.g.::
+
+            q1 = sess.query(SomeClass).filter(SomeClass.foo=='bar')
+            q2 = sess.query(SomeClass).filter(SomeClass.bar=='foo')
+
+            q3 = q1.union(q2)
+
+        The method accepts multiple Query objects so as to control
+        the level of nesting.  A series of ``union()`` calls such as::
+
+            x.union(y).union(z).all()
+
+        will nest on each ``union()``, and produces::
+
+            SELECT * FROM (SELECT * FROM (SELECT * FROM X UNION SELECT * FROM y) UNION SELECT * FROM Z)
+
+        Whereas::
+
+            x.union(y, z).all()
+
+        produces::
+
+            SELECT * FROM (SELECT * FROM X UNION SELECT * FROM y UNION SELECT * FROM Z)
+
+        """
+        return self._from_selectable(
+                    expression.union(*([self]+ list(q))))
+
+    def union_all(self, *q):
+        """Produce a UNION ALL of this Query against one or more queries.
+
+        Works the same way as :meth:`~sqlalchemy.orm.query.Query.union`.  See that
+        method for usage examples.
+
+        """
+        return self._from_selectable(
+                    expression.union_all(*([self]+ list(q)))
+                )
+
+    def intersect(self, *q):
+        """Produce an INTERSECT of this Query against one or more queries.
+
+        Works the same way as :meth:`~sqlalchemy.orm.query.Query.union`.  See that
+        method for usage examples.
+
+        """
+        return self._from_selectable(
+                    expression.intersect(*([self]+ list(q)))
+                )
+
+    def intersect_all(self, *q):
+        """Produce an INTERSECT ALL of this Query against one or more queries.
+
+        Works the same way as :meth:`~sqlalchemy.orm.query.Query.union`.  See that
+        method for usage examples.
+
+        """
+        return self._from_selectable(
+                    expression.intersect_all(*([self]+ list(q)))
+                )
+
+    def except_(self, *q):
+        """Produce an EXCEPT of this Query against one or more queries.
+
+        Works the same way as :meth:`~sqlalchemy.orm.query.Query.union`.  See that
+        method for usage examples.
+
+        """
+        return self._from_selectable(
+                    expression.except_(*([self]+ list(q)))
+                )
+
+    def except_all(self, *q):
+        """Produce an EXCEPT ALL of this Query against one or more queries.
+
+        Works the same way as :meth:`~sqlalchemy.orm.query.Query.union`.  See that
+        method for usage examples.
+
+        """
+        return self._from_selectable(
+                    expression.except_all(*([self]+ list(q)))
+                )
+
+    @util.accepts_a_list_as_starargs(list_deprecation='pending')
+    def join(self, *props, **kwargs):
+        """Create a join against this ``Query`` object's criterion
+        and apply generatively, returning the newly resulting ``Query``.
+
+        Each element in \*props may be:
+
+          * a string property name, i.e. "rooms".  This will join along the
+            relation of the same name from this Query's "primary" mapper, if
+            one is present.
+
+          * a class-mapped attribute, i.e. Houses.rooms.  This will create a
+            join from "Houses" table to that of the "rooms" relation.
+
+          * a 2-tuple containing a target class or selectable, and an "ON"
+            clause.  The ON clause can be the property name/ attribute like
+            above, or a SQL expression.
+
+        e.g.::
+
+            # join along string attribute names
+            session.query(Company).join('employees')
+            session.query(Company).join('employees', 'tasks')
+
+            # join the Person entity to an alias of itself,
+            # along the "friends" relation
+            PAlias = aliased(Person)
+            session.query(Person).join((Palias, Person.friends))
+
+            # join from Houses to the "rooms" attribute on the
+            # "Colonials" subclass of Houses, then join to the
+            # "closets" relation on Room
+            session.query(Houses).join(Colonials.rooms, Room.closets)
+
+            # join from Company entities to the "employees" collection,
+            # using "people JOIN engineers" as the target.  Then join
+            # to the "computers" collection on the Engineer entity.
+            session.query(Company).join((people.join(engineers), 'employees'), Engineer.computers)
+
+            # join from Articles to Keywords, using the "keywords" attribute.
+            # assume this is a many-to-many relation.
+            session.query(Article).join(Article.keywords)
+
+            # same thing, but spelled out entirely explicitly
+            # including the association table.
+            session.query(Article).join(
+                (article_keywords, Articles.id==article_keywords.c.article_id),
+                (Keyword, Keyword.id==article_keywords.c.keyword_id)
+                )
+
+        \**kwargs include:
+
+            aliased - when joining, create anonymous aliases of each table.  This is
+            used for self-referential joins or multiple joins to the same table.
+            Consider usage of the aliased(SomeClass) construct as a more explicit
+            approach to this.
+
+            from_joinpoint - when joins are specified using string property names,
+            locate the property from the mapper found in the most recent previous
+            join() call, instead of from the root entity.
+
+        """
+        aliased, from_joinpoint = kwargs.pop('aliased', False), kwargs.pop('from_joinpoint', False)
+        if kwargs:
+            raise TypeError("unknown arguments: %s" % ','.join(kwargs.iterkeys()))
+        return self._join(props, outerjoin=False, create_aliases=aliased, from_joinpoint=from_joinpoint)
+
+    @util.accepts_a_list_as_starargs(list_deprecation='pending')
+    def outerjoin(self, *props, **kwargs):
+        """Create a left outer join against this ``Query`` object's criterion
+        and apply generatively, retunring the newly resulting ``Query``.
+
+        Usage is the same as the ``join()`` method.
+
+        """
+        aliased, from_joinpoint = kwargs.pop('aliased', False), kwargs.pop('from_joinpoint', False)
+        if kwargs:
+            raise TypeError("unknown arguments: %s" % ','.join(kwargs.iterkeys()))
+        return self._join(props, outerjoin=True, create_aliases=aliased, from_joinpoint=from_joinpoint)
+
+    @_generative(_no_statement_condition, _no_limit_offset)
+    def _join(self, keys, outerjoin, create_aliases, from_joinpoint):
+
+        # copy collections that may mutate so they do not affect
+        # the copied-from query.
+        self._currenttables = set(self._currenttables)
+        self._polymorphic_adapters = self._polymorphic_adapters.copy()
+
+        # start from the beginning unless from_joinpoint is set.
+        if not from_joinpoint:
+            self._reset_joinpoint()
+
+        clause = replace_clause_index = None
+        
+        # after the method completes,
+        # the query's joinpoint will be set to this.
+        right_entity = None
+        
+        for arg1 in util.to_list(keys):
+            aliased_entity = False
+            alias_criterion = False
+            left_entity = right_entity
+            prop = of_type = right_entity = right_mapper = None
+
+            # distinguish between tuples, scalar args
+            if isinstance(arg1, tuple):
+                arg1, arg2 = arg1
+            else:
+                arg2 = None
+
+            # determine onclause/right_entity.  there
+            # is a little bit of legacy behavior still at work here
+            # which means they might be in either order.  may possibly
+            # lock this down to (right_entity, onclause) in 0.6.
+            if isinstance(arg2, (interfaces.PropComparator, basestring)):
+                onclause = arg2
+                right_entity = arg1
+            elif isinstance(arg1, (interfaces.PropComparator, basestring)):
+                onclause = arg1
+                right_entity = arg2
+            else:
+                onclause = arg2
+                right_entity = arg1
+
+            # extract info from the onclause argument, determine
+            # left_entity and right_entity.
+            if isinstance(onclause, interfaces.PropComparator):
+                of_type = getattr(onclause, '_of_type', None)
+                prop = onclause.property
+                descriptor = onclause
+
+                if not left_entity:
+                    left_entity = onclause.parententity
+
+                if of_type:
+                    right_mapper = of_type
+                else:
+                    right_mapper = prop.mapper
+
+                if not right_entity:
+                    right_entity = right_mapper
+
+            elif isinstance(onclause, basestring):
+                if not left_entity:
+                    left_entity = self._joinpoint_zero()
+
+                descriptor, prop = _entity_descriptor(left_entity, onclause)
+                right_mapper = prop.mapper
+
+                if not right_entity:
+                    right_entity = right_mapper
+            elif not left_entity:
+                left_entity = self._joinpoint_zero()
+
+            if not clause and self._from_obj:
+                mp, left_selectable, is_aliased_class = _entity_info(left_entity)
+
+                replace_clause_index, clause = sql_util.find_join_source(self._from_obj, left_selectable)
+                if not clause:
+                    clause = left_selectable
+                    
+            if not clause and left_entity:
+                for ent in self._entities:
+                    if ent.corresponds_to(left_entity):
+                        clause = ent.selectable
+                        break
+
+            # TODO:
+            # this provides one kind of "backwards join"
+            # tested in test/orm/query.py.
+            # removal of this has been considered, but maybe not
+            # see [ticket:1445]
+            if not clause:
+                if isinstance(onclause, interfaces.PropComparator):
+                    clause = onclause.__clause_element__()
+
+            if not clause:
+                raise sa_exc.InvalidRequestError("Could not find a FROM clause to join from")
+
+            # if we have a MapperProperty and the onclause is not already
+            # an instrumented descriptor.  this catches of_type()
+            # PropComparators and string-based on clauses.
+            if prop and not isinstance(onclause, attributes.QueryableAttribute):
+                onclause = prop
+
+            # start looking at the right side of the join
+
+            mp, right_selectable, is_aliased_class = _entity_info(right_entity)
+
+            if mp is not None and right_mapper is not None and not mp.common_parent(right_mapper):
+                raise sa_exc.InvalidRequestError(
+                    "Join target %s does not correspond to the right side of join condition %s" % (right_entity, onclause)
+                )
+
+            if not right_mapper and mp:
+                right_mapper = mp
+
+            # determine if we need to wrap the right hand side in an alias.
+            # this occurs based on the create_aliases flag, or if the target
+            # is a selectable, Join, or polymorphically-loading mapper
+            if right_mapper and not is_aliased_class:
+                if right_entity is right_selectable:
+
+                    if not right_selectable.is_derived_from(right_mapper.mapped_table):
+                        raise sa_exc.InvalidRequestError(
+                            "Selectable '%s' is not derived from '%s'" %
+                            (right_selectable.description, right_mapper.mapped_table.description))
+
+                    if not isinstance(right_selectable, expression.Alias):
+                        right_selectable = right_selectable.alias()
+
+                    right_entity = aliased(right_mapper, right_selectable)
+                    alias_criterion = True
+
+                elif create_aliases:
+                    right_entity = aliased(right_mapper)
+                    alias_criterion = True
+
+                elif right_mapper.with_polymorphic or isinstance(right_mapper.mapped_table, expression.Join):
+                    right_entity = aliased(right_mapper)
+                    alias_criterion = True
+                    aliased_entity = True
+
+                elif prop:
+                    # for joins across plain relation()s, try not to specify the
+                    # same joins twice.  the _currenttables collection tracks
+                    # what plain mapped tables we've joined to already.
+
+                    if prop.table in self._currenttables:
+                        if prop.secondary is not None and prop.secondary not in self._currenttables:
+                            # TODO: this check is not strong enough for different paths to the same endpoint which
+                            # does not use secondary tables
+                            raise sa_exc.InvalidRequestError("Can't join to property '%s'; a path to this "
+                                "table along a different secondary table already "
+                                "exists.  Use the `alias=True` argument to `join()`." % descriptor)
+                        continue
+
+                    if prop.secondary:
+                        self._currenttables.add(prop.secondary)
+                    self._currenttables.add(prop.table)
+
+                    if of_type:
+                        right_entity = of_type
+                    else:
+                        right_entity = prop.mapper
+
+            # create adapters to the right side, if we've created aliases
+            if alias_criterion:
+                right_adapter = ORMAdapter(right_entity,
+                    equivalents=right_mapper._equivalent_columns, chain_to=self._filter_aliases)
+
+            # if the onclause is a ClauseElement, adapt it with our right
+            # adapter, then with our query-wide adaptation if any.
+            if isinstance(onclause, expression.ClauseElement):
+                if alias_criterion:
+                    onclause = right_adapter.traverse(onclause)
+                onclause = self._adapt_clause(onclause, False, True)
+
+            # determine if we want _ORMJoin to alias the onclause
+            # to the given left side.  This is used if we're joining against a
+            # select_from() selectable, from_self() call, or the onclause
+            # has been resolved into a MapperProperty.  Otherwise we assume
+            # the onclause itself contains more specific information on how to
+            # construct the onclause.
+            join_to_left = not is_aliased_class or \
+                            onclause is prop or \
+                            self._from_obj_alias and clause is self._from_obj[0]
+
+            # create the join
+            clause = orm_join(clause, right_entity, onclause, isouter=outerjoin, join_to_left=join_to_left)
+
+            # set up state for the query as a whole
+            if alias_criterion:
+                # adapt filter() calls based on our right side adaptation
+                self._filter_aliases = right_adapter
+
+                # if a polymorphic entity was aliased, establish that
+                # so that MapperEntity/ColumnEntity can pick up on it
+                # and adapt when it renders columns and fetches them from results
+                if aliased_entity:
+                    self.__mapper_loads_polymorphically_with(
+                                        right_mapper,
+                                        ORMAdapter(right_entity, equivalents=right_mapper._equivalent_columns)
+                                    )
+
+        if replace_clause_index is not None:
+            l = list(self._from_obj)
+            l[replace_clause_index] = clause
+            self._from_obj = tuple(l)
+        else:
+            self._from_obj = self._from_obj + (clause,)
+
+        # future joins with from_joinpoint=True join from our established right_entity.
+        self._joinpoint = right_entity
+
+    @_generative(_no_statement_condition)
+    def reset_joinpoint(self):
+        """return a new Query reset the 'joinpoint' of this Query reset
+        back to the starting mapper.  Subsequent generative calls will
+        be constructed from the new joinpoint.
+
+        Note that each call to join() or outerjoin() also starts from
+        the root.
+
+        """
+        self._reset_joinpoint()
+
+    @_generative(_no_clauseelement_condition)
+    def select_from(self, from_obj):
+        """Set the `from_obj` parameter of the query and return the newly
+        resulting ``Query``.  This replaces the table which this Query selects
+        from with the given table.
+
+
+        `from_obj` is a single table or selectable.
+
+        """
+        
+        if isinstance(from_obj, (tuple, list)):
+            # from_obj is actually a list again as of 0.5.3.   so this restriction here
+            # is somewhat artificial, but is still in place since select_from() implies aliasing all further
+            # criterion against what's placed here, and its less complex to only
+            # keep track of a single aliased FROM element being selected against.  This could in theory be opened
+            # up again to more complexity.
+            util.warn_deprecated("select_from() now accepts a single Selectable as its argument, which replaces any existing FROM criterion.")
+            from_obj = from_obj[-1]
+        if not isinstance(from_obj, expression.FromClause):
+            raise sa_exc.ArgumentError("select_from() accepts FromClause objects only.")
+        self._set_select_from(from_obj)
+
+    def __getitem__(self, item):
+        if isinstance(item, slice):
+            start, stop, step = util.decode_slice(item)
+
+            if isinstance(stop, int) and isinstance(start, int) and stop - start <= 0:
+                return []
+
+            # perhaps we should execute a count() here so that we
+            # can still use LIMIT/OFFSET ?
+            elif (isinstance(start, int) and start < 0) \
+                or (isinstance(stop, int) and stop < 0):
+                return list(self)[item]
+
+            res = self.slice(start, stop)
+            if step is not None:
+                return list(res)[None:None:item.step]
+            else:
+                return list(res)
+        else:
+            return list(self[item:item+1])[0]
+
+    @_generative(_no_statement_condition)
+    def slice(self, start, stop):
+        """apply LIMIT/OFFSET to the ``Query`` based on a range and return the newly resulting ``Query``."""
+        if start is not None and stop is not None:
+            self._offset = (self._offset or 0) + start
+            self._limit = stop - start
+        elif start is None and stop is not None:
+            self._limit = stop
+        elif start is not None and stop is None:
+            self._offset = (self._offset or 0) + start
+
+    @_generative(_no_statement_condition)
+    def limit(self, limit):
+        """Apply a ``LIMIT`` to the query and return the newly resulting
+
+        ``Query``.
+
+        """
+        self._limit = limit
+
+    @_generative(_no_statement_condition)
+    def offset(self, offset):
+        """Apply an ``OFFSET`` to the query and return the newly resulting
+        ``Query``.
+
+        """
+        self._offset = offset
+
+    @_generative(_no_statement_condition)
+    def distinct(self):
+        """Apply a ``DISTINCT`` to the query and return the newly resulting
+        ``Query``.
+
+        """
+        self._distinct = True
+
+    def all(self):
+        """Return the results represented by this ``Query`` as a list.
+
+        This results in an execution of the underlying query.
+
+        """
+        return list(self)
+
+    @_generative(_no_clauseelement_condition)
+    def from_statement(self, statement):
+        """Execute the given SELECT statement and return results.
+
+        This method bypasses all internal statement compilation, and the
+        statement is executed without modification.
+
+        The statement argument is either a string, a ``select()`` construct,
+        or a ``text()`` construct, and should return the set of columns
+        appropriate to the entity class represented by this ``Query``.
+
+        Also see the ``instances()`` method.
+
+        """
+        if isinstance(statement, basestring):
+            statement = sql.text(statement)
+
+        if not isinstance(statement, (expression._TextClause, expression._SelectBaseMixin)):
+            raise sa_exc.ArgumentError("from_statement accepts text(), select(), and union() objects only.")
+
+        self._statement = statement
+
+    def first(self):
+        """Return the first result of this ``Query`` or None if the result doesn't contain any row.
+
+        This results in an execution of the underlying query.
+
+        """
+        if self._statement:
+            ret = list(self)[0:1]
+        else:
+            ret = list(self[0:1])
+        if len(ret) > 0:
+            return ret[0]
+        else:
+            return None
+
+    def one(self):
+        """Return exactly one result or raise an exception.
+
+        Raises ``sqlalchemy.orm.exc.NoResultFound`` if the query selects no rows.
+        Raises ``sqlalchemy.orm.exc.MultipleResultsFound`` if multiple rows are
+        selected.
+
+        This results in an execution of the underlying query.
+
+        """
+        if self._statement:
+            raise sa_exc.InvalidRequestError(
+                "one() not available when from_statement() is used; "
+                "use `first()` instead.")
+
+        ret = list(self[0:2])
+
+        if len(ret) == 1:
+            return ret[0]
+        elif len(ret) == 0:
+            raise orm_exc.NoResultFound("No row was found for one()")
+        else:
+            raise orm_exc.MultipleResultsFound(
+                "Multiple rows were found for one()")
+
+    def scalar(self):
+        """Return the first element of the first result or None.
+
+          >>> session.query(Item).scalar()
+          <Item>
+          >>> session.query(Item.id).scalar()
+          1
+          >>> session.query(Item.id).filter(Item.id < 0).scalar()
+          None
+          >>> session.query(Item.id, Item.name).scalar()
+          1
+          >>> session.query(func.count(Parent.id)).scalar()
+          20
+
+        This results in an execution of the underlying query.
+
+        """
+        try:
+            ret = list(self)[0]
+            if not isinstance(ret, tuple):
+                return ret
+            return ret[0]
+        except IndexError:
+            return None
+
+    def __iter__(self):
+        context = self._compile_context()
+        context.statement.use_labels = True
+        if self._autoflush and not self._populate_existing:
+            self.session._autoflush()
+        return self._execute_and_instances(context)
+
+    def _execute_and_instances(self, querycontext):
+        result = self.session.execute(querycontext.statement, params=self._params, mapper=self._mapper_zero_or_none())
+        return self.instances(result, querycontext)
+
+    def instances(self, cursor, __context=None):
+        """Given a ResultProxy cursor as returned by connection.execute(), return an ORM result as an iterator.
+
+        e.g.::
+
+            result = engine.execute("select * from users")
+            for u in session.query(User).instances(result):
+                print u
+        """
+        session = self.session
+
+        context = __context
+        if context is None:
+            context = QueryContext(self)
+
+        context.runid = _new_runid()
+
+        filtered = bool(list(self._mapper_entities))
+        single_entity = filtered and len(self._entities) == 1
+
+        if filtered:
+            if single_entity:
+                filter = lambda x: util.unique_list(x, util.IdentitySet)
+            else:
+                filter = util.unique_list
+        else:
+            filter = None
+
+        custom_rows = single_entity and 'append_result' in self._entities[0].extension
+
+        (process, labels) = zip(*[query_entity.row_processor(self, context, custom_rows) for query_entity in self._entities])
+
+        if not single_entity:
+            labels = dict((label, property(itemgetter(i)))
+                          for i, label in enumerate(labels)
+                          if label)
+            rowtuple = type.__new__(type, "RowTuple", (tuple,), labels)
+            rowtuple.keys = labels.keys
+
+        while True:
+            context.progress = {}
+            context.partials = {}
+
+            if self._yield_per:
+                fetch = cursor.fetchmany(self._yield_per)
+                if not fetch:
+                    break
+            else:
+                fetch = cursor.fetchall()
+
+            if custom_rows:
+                rows = []
+                for row in fetch:
+                    process[0](context, row, rows)
+            elif single_entity:
+                rows = [process[0](context, row) for row in fetch]
+            else:
+                rows = [rowtuple(proc(context, row) for proc in process)
+                        for row in fetch]
+
+            if filter:
+                rows = filter(rows)
+
+            if context.refresh_state and self._only_load_props and context.refresh_state in context.progress:
+                context.refresh_state.commit(context.refresh_state.dict, self._only_load_props)
+                context.progress.pop(context.refresh_state)
+
+            session._finalize_loaded(context.progress)
+
+            for ii, (dict_, attrs) in context.partials.items():
+                ii.commit(dict_, attrs)
+
+            for row in rows:
+                yield row
+
+            if not self._yield_per:
+                break
+    iterate_instances = util.deprecated()(instances)
+
+    def _get(self, key=None, ident=None, refresh_state=None, lockmode=None, only_load_props=None):
+        lockmode = lockmode or self._lockmode
+        if not self._populate_existing and not refresh_state and not self._mapper_zero().always_refresh and lockmode is None:
+            try:
+                instance = self.session.identity_map[key]
+                state = attributes.instance_state(instance)
+                if state.expired:
+                    try:
+                        state()
+                    except orm_exc.ObjectDeletedError:
+                        self.session._remove_newly_deleted(state)
+                        return None
+                return instance
+            except KeyError:
+                pass
+
+        if ident is None:
+            if key is not None:
+                ident = key[1]
+        else:
+            ident = util.to_list(ident)
+
+        if refresh_state is None:
+            q = self._clone()
+            q._no_criterion_condition("get")
+        else:
+            q = self._clone()
+
+        if ident is not None:
+            mapper = q._mapper_zero()
+            params = {}
+            (_get_clause, _get_params) = mapper._get_clause
+
+            _get_clause = q._adapt_clause(_get_clause, True, False)
+            q._criterion = _get_clause
+
+            for i, primary_key in enumerate(mapper.primary_key):
+                try:
+                    params[_get_params[primary_key].key] = ident[i]
+                except IndexError:
+                    raise sa_exc.InvalidRequestError("Could not find enough values to formulate primary key for "
+                        "query.get(); primary key columns are %s" % ', '.join("'%s'" % c for c in mapper.primary_key))
+            q._params = params
+
+        if lockmode is not None:
+            q._lockmode = lockmode
+        q._get_options(
+            populate_existing=bool(refresh_state),
+            version_check=(lockmode is not None),
+            only_load_props=only_load_props,
+            refresh_state=refresh_state)
+        q._order_by = None
+        try:
+            # call using all() to avoid LIMIT compilation complexity
+            return q.all()[0]
+        except IndexError:
+            return None
+
+    @property
+    def _select_args(self):
+        return {
+            'limit':self._limit,
+            'offset':self._offset,
+            'distinct':self._distinct,
+            'group_by':self._group_by or None,
+            'having':self._having or None
+        }
+
+    @property
+    def _should_nest_selectable(self):
+        kwargs = self._select_args
+        return (kwargs.get('limit') is not None or
+                kwargs.get('offset') is not None or
+                kwargs.get('distinct', False))
+
+    def count(self):
+        """Return a count of rows this Query would return.
+        
+        For simple entity queries, count() issues
+        a SELECT COUNT, and will specifically count the primary
+        key column of the first entity only.  If the query uses 
+        LIMIT, OFFSET, or DISTINCT, count() will wrap the statement 
+        generated by this Query in a subquery, from which a SELECT COUNT
+        is issued, so that the contract of "how many rows
+        would be returned?" is honored.
+        
+        For queries that request specific columns or expressions, 
+        count() again makes no assumptions about those expressions
+        and will wrap everything in a subquery.  Therefore,
+        ``Query.count()`` is usually not what you want in this case.   
+        To count specific columns, often in conjunction with 
+        GROUP BY, use ``func.count()`` as an individual column expression
+        instead of ``Query.count()``.  See the ORM tutorial
+        for an example.
+
+        """
+        should_nest = [self._should_nest_selectable]
+        def ent_cols(ent):
+            if isinstance(ent, _MapperEntity):
+                return ent.mapper.primary_key
+            else:
+                should_nest[0] = True
+                return [ent.column]
+
+        return self._col_aggregate(sql.literal_column('1'), sql.func.count,
+            nested_cols=chain(*[ent_cols(ent) for ent in self._entities]),
+            should_nest = should_nest[0]
+        )
+
+    def _col_aggregate(self, col, func, nested_cols=None, should_nest=False):
+        context = QueryContext(self)
+
+        for entity in self._entities:
+            entity.setup_context(self, context)
+
+        if context.from_clause:
+            from_obj = list(context.from_clause)
+        else:
+            from_obj = context.froms
+
+        self._adjust_for_single_inheritance(context)
+
+        whereclause  = context.whereclause
+
+        if should_nest:
+            if not nested_cols:
+                nested_cols = [col]
+            else:
+                nested_cols = list(nested_cols)
+            s = sql.select(nested_cols, whereclause, from_obj=from_obj, use_labels=True, **self._select_args)
+            s = s.alias()
+            s = sql.select([func(s.corresponding_column(col) or col)]).select_from(s)
+        else:
+            s = sql.select([func(col)], whereclause, from_obj=from_obj, **self._select_args)
+
+        if self._autoflush and not self._populate_existing:
+            self.session._autoflush()
+        return self.session.scalar(s, params=self._params, mapper=self._mapper_zero())
+
+    def delete(self, synchronize_session='fetch'):
+        """Perform a bulk delete query.
+
+        Deletes rows matched by this query from the database.
+
+        :param synchronize_session: chooses the strategy for the removal of matched
+            objects from the session. Valid values are:
+
+            False
+              don't synchronize the session. This option is the most efficient and is reliable
+              once the session is expired, which typically occurs after a commit().   Before
+              the expiration, objects may still remain in the session which were in fact deleted
+              which can lead to confusing results if they are accessed via get() or already
+              loaded collections.
+
+            'fetch'
+              performs a select query before the delete to find objects that are matched
+              by the delete query and need to be removed from the session. Matched objects
+              are removed from the session. 'fetch' is the default strategy.
+
+            'evaluate'
+              experimental feature. Tries to evaluate the querys criteria in Python
+              straight on the objects in the session. If evaluation of the criteria isn't
+              implemented, the 'fetch' strategy will be used as a fallback.
+
+              The expression evaluator currently doesn't account for differing string
+              collations between the database and Python.
+
+        Returns the number of rows deleted, excluding any cascades.
+
+        The method does *not* offer in-Python cascading of relations - it is assumed that
+        ON DELETE CASCADE is configured for any foreign key references which require it.
+        The Session needs to be expired (occurs automatically after commit(), or call expire_all())
+        in order for the state of dependent objects subject to delete or delete-orphan cascade to be
+        correctly represented.
+
+        Also, the ``before_delete()`` and ``after_delete()`` :class:`~sqlalchemy.orm.interfaces.MapperExtension`
+        methods are not called from this method.  For a delete hook here, use the
+        ``after_bulk_delete()`` :class:`~sqlalchemy.orm.interfaces.MapperExtension` method.
+
+        """
+        #TODO: lots of duplication and ifs - probably needs to be refactored to strategies
+        #TODO: cascades need handling.
+
+        if synchronize_session not in [False, 'evaluate', 'fetch']:
+            raise sa_exc.ArgumentError("Valid strategies for session synchronization are False, 'evaluate' and 'fetch'")
+        self._no_select_modifiers("delete")
+
+        self = self.enable_eagerloads(False)
+
+        context = self._compile_context()
+        if len(context.statement.froms) != 1 or not isinstance(context.statement.froms[0], schema.Table):
+            raise sa_exc.ArgumentError("Only deletion via a single table query is currently supported")
+        primary_table = context.statement.froms[0]
+
+        session = self.session
+
+        if synchronize_session == 'evaluate':
+            try:
+                evaluator_compiler = evaluator.EvaluatorCompiler()
+                eval_condition = evaluator_compiler.process(self.whereclause)
+            except evaluator.UnevaluatableError:
+                synchronize_session = 'fetch'
+
+        delete_stmt = sql.delete(primary_table, context.whereclause)
+
+        if synchronize_session == 'fetch':
+            #TODO: use RETURNING when available
+            select_stmt = context.statement.with_only_columns(primary_table.primary_key)
+            matched_rows = session.execute(select_stmt, params=self._params).fetchall()
+
+        if self._autoflush:
+            session._autoflush()
+        result = session.execute(delete_stmt, params=self._params)
+
+        if synchronize_session == 'evaluate':
+            target_cls = self._mapper_zero().class_
+
+            #TODO: detect when the where clause is a trivial primary key match
+            objs_to_expunge = [obj for (cls, pk),obj in session.identity_map.iteritems()
+                if issubclass(cls, target_cls) and eval_condition(obj)]
+            for obj in objs_to_expunge:
+                session._remove_newly_deleted(attributes.instance_state(obj))
+        elif synchronize_session == 'fetch':
+            target_mapper = self._mapper_zero()
+            for primary_key in matched_rows:
+                identity_key = target_mapper.identity_key_from_primary_key(list(primary_key))
+                if identity_key in session.identity_map:
+                    session._remove_newly_deleted(attributes.instance_state(session.identity_map[identity_key]))
+
+        for ext in session.extensions:
+            ext.after_bulk_delete(session, self, context, result)
+
+        return result.rowcount
+
+    def update(self, values, synchronize_session='expire'):
+        """Perform a bulk update query.
+
+        Updates rows matched by this query in the database.
+
+        :param values: a dictionary with attributes names as keys and literal values or sql expressions
+            as values.
+
+        :param synchronize_session: chooses the strategy to update the
+            attributes on objects in the session. Valid values are:
+
+            False
+              don't synchronize the session. Use this when you don't need to use the
+              session after the update or you can be sure that none of the matched objects
+              are in the session.
+
+            'expire'
+              performs a select query before the update to find objects that are matched
+              by the update query. The updated attributes are expired on matched objects.
+
+            'evaluate'
+              experimental feature. Tries to evaluate the querys criteria in Python
+              straight on the objects in the session. If evaluation of the criteria isn't
+              implemented, the 'expire' strategy will be used as a fallback.
+
+              The expression evaluator currently doesn't account for differing string
+              collations between the database and Python.
+
+        Returns the number of rows matched by the update.
+
+        The method does *not* offer in-Python cascading of relations - it is assumed that
+        ON UPDATE CASCADE is configured for any foreign key references which require it.
+        The Session needs to be expired (occurs automatically after commit(), or call expire_all())
+        in order for the state of dependent objects subject foreign key cascade to be
+        correctly represented.
+
+        Also, the ``before_update()`` and ``after_update()`` :class:`~sqlalchemy.orm.interfaces.MapperExtension`
+        methods are not called from this method.  For an update hook here, use the
+        ``after_bulk_update()`` :class:`~sqlalchemy.orm.interfaces.SessionExtension`  method.
+
+        """
+
+        #TODO: value keys need to be mapped to corresponding sql cols and instr.attr.s to string keys
+        #TODO: updates of manytoone relations need to be converted to fk assignments
+        #TODO: cascades need handling.
+
+        self._no_select_modifiers("update")
+        if synchronize_session not in [False, 'evaluate', 'expire']:
+            raise sa_exc.ArgumentError("Valid strategies for session synchronization are False, 'evaluate' and 'expire'")
+
+        self = self.enable_eagerloads(False)
+
+        context = self._compile_context()
+        if len(context.statement.froms) != 1 or not isinstance(context.statement.froms[0], schema.Table):
+            raise sa_exc.ArgumentError("Only update via a single table query is currently supported")
+        primary_table = context.statement.froms[0]
+
+        session = self.session
+
+        if synchronize_session == 'evaluate':
+            try:
+                evaluator_compiler = evaluator.EvaluatorCompiler()
+                eval_condition = evaluator_compiler.process(self.whereclause)
+
+                value_evaluators = {}
+                for key,value in values.items():
+                    key = expression._column_as_key(key)
+                    value_evaluators[key] = evaluator_compiler.process(expression._literal_as_binds(value))
+            except evaluator.UnevaluatableError:
+                synchronize_session = 'expire'
+
+        update_stmt = sql.update(primary_table, context.whereclause, values)
+
+        if synchronize_session == 'expire':
+            select_stmt = context.statement.with_only_columns(primary_table.primary_key)
+            matched_rows = session.execute(select_stmt, params=self._params).fetchall()
+
+        if self._autoflush:
+            session._autoflush()
+        result = session.execute(update_stmt, params=self._params)
+
+        if synchronize_session == 'evaluate':
+            target_cls = self._mapper_zero().class_
+
+            for (cls, pk),obj in session.identity_map.iteritems():
+                evaluated_keys = value_evaluators.keys()
+
+                if issubclass(cls, target_cls) and eval_condition(obj):
+                    state, dict_ = attributes.instance_state(obj), attributes.instance_dict(obj)
+
+                    # only evaluate unmodified attributes
+                    to_evaluate = state.unmodified.intersection(evaluated_keys)
+                    for key in to_evaluate:
+                        dict_[key] = value_evaluators[key](obj)
+
+                    state.commit(dict_, list(to_evaluate))
+
+                    # expire attributes with pending changes (there was no autoflush, so they are overwritten)
+                    state.expire_attributes(set(evaluated_keys).difference(to_evaluate))
+
+        elif synchronize_session == 'expire':
+            target_mapper = self._mapper_zero()
+
+            for primary_key in matched_rows:
+                identity_key = target_mapper.identity_key_from_primary_key(list(primary_key))
+                if identity_key in session.identity_map:
+                    session.expire(session.identity_map[identity_key], values.keys())
+
+        for ext in session.extensions:
+            ext.after_bulk_update(session, self, context, result)
+
+        return result.rowcount
+
+    def _compile_context(self, labels=True):
+        context = QueryContext(self)
+
+        if context.statement:
+            return context
+
+        if self._lockmode:
+            try:
+                for_update = {'read': 'read',
+                              'update': True,
+                              'update_nowait': 'nowait',
+                              None: False}[self._lockmode]
+            except KeyError:
+                raise sa_exc.ArgumentError("Unknown lockmode '%s'" % self._lockmode)
+        else:
+            for_update = False
+
+        for entity in self._entities:
+            entity.setup_context(self, context)
+
+        eager_joins = context.eager_joins.values()
+
+        if context.from_clause:
+            froms = list(context.from_clause)  # "load from explicit FROMs" mode, i.e. when select_from() or join() is used
+        else:
+            froms = context.froms   # "load from discrete FROMs" mode, i.e. when each _MappedEntity has its own FROM
+
+        self._adjust_for_single_inheritance(context)
+
+        if not context.primary_columns:
+            if self._only_load_props:
+                raise sa_exc.InvalidRequestError("No column-based properties specified for refresh operation."
+                " Use session.expire() to reload collections and related items.")
+            else:
+                raise sa_exc.InvalidRequestError("Query contains no columns with which to SELECT from.")
+
+        if eager_joins and self._should_nest_selectable:
+            # for eager joins present and LIMIT/OFFSET/DISTINCT, wrap the query inside a select,
+            # then append eager joins onto that
+
+            if context.order_by:
+                order_by_col_expr = list(chain(*[sql_util.find_columns(o) for o in context.order_by]))
+            else:
+                context.order_by = None
+                order_by_col_expr = []
+
+            inner = sql.select(
+                        context.primary_columns + order_by_col_expr,
+                        context.whereclause,
+                        from_obj=froms,
+                        use_labels=labels,
+                        correlate=False,
+                        order_by=context.order_by,
+                        **self._select_args
+                    )
+
+            if self._correlate:
+                inner = inner.correlate(*self._correlate)
+
+            inner = inner.alias()
+
+            equivs = self.__all_equivs()
+
+            context.adapter = sql_util.ColumnAdapter(inner, equivs)
+
+            statement = sql.select([inner] + context.secondary_columns, for_update=for_update, use_labels=labels)
+
+            from_clause = inner
+            for eager_join in eager_joins:
+                # EagerLoader places a 'stop_on' attribute on the join,
+                # giving us a marker as to where the "splice point" of the join should be
+                from_clause = sql_util.splice_joins(from_clause, eager_join, eager_join.stop_on)
+
+            statement.append_from(from_clause)
+
+            if context.order_by:
+                statement.append_order_by(*context.adapter.copy_and_process(context.order_by))
+
+            statement.append_order_by(*context.eager_order_by)
+        else:
+            if not context.order_by:
+                context.order_by = None
+
+            if self._distinct and context.order_by:
+                order_by_col_expr = list(chain(*[sql_util.find_columns(o) for o in context.order_by]))
+                context.primary_columns += order_by_col_expr
+
+            froms += context.eager_joins.values()
+
+            statement = sql.select(
+                            context.primary_columns + context.secondary_columns,
+                            context.whereclause,
+                            from_obj=froms,
+                            use_labels=labels,
+                            for_update=for_update,
+                            correlate=False,
+                            order_by=context.order_by,
+                            **self._select_args
+                        )
+
+            if self._correlate:
+                statement = statement.correlate(*self._correlate)
+
+            if context.eager_order_by:
+                statement.append_order_by(*context.eager_order_by)
+
+        context.statement = statement
+
+        return context
+
+    def _adjust_for_single_inheritance(self, context):
+        """Apply single-table-inheritance filtering.
+
+        For all distinct single-table-inheritance mappers represented in the
+        columns clause of this query, add criterion to the WHERE clause of the
+        given QueryContext such that only the appropriate subtypes are
+        selected from the total results.
+
+        """
+        for entity, (mapper, adapter, s, i, w) in self._mapper_adapter_map.iteritems():
+            single_crit = mapper._single_table_criterion
+            if single_crit:
+                if adapter:
+                    single_crit = adapter.traverse(single_crit)
+                single_crit = self._adapt_clause(single_crit, False, False)
+                context.whereclause = sql.and_(context.whereclause, single_crit)
+
+    def __str__(self):
+        return str(self._compile_context().statement)
+
+
+class _QueryEntity(object):
+    """represent an entity column returned within a Query result."""
+
+    def __new__(cls, *args, **kwargs):
+        if cls is _QueryEntity:
+            entity = args[1]
+            if not isinstance(entity, basestring) and _is_mapped_class(entity):
+                cls = _MapperEntity
+            else:
+                cls = _ColumnEntity
+        return object.__new__(cls)
+
+    def _clone(self):
+        q = self.__class__.__new__(self.__class__)
+        q.__dict__ = self.__dict__.copy()
+        return q
+
+class _MapperEntity(_QueryEntity):
+    """mapper/class/AliasedClass entity"""
+
+    def __init__(self, query, entity):
+        self.primary_entity = not query._entities
+        query._entities.append(self)
+
+        self.entities = [entity]
+        self.entity_zero = entity
+
+    def setup_entity(self, entity, mapper, adapter, from_obj, is_aliased_class, with_polymorphic):
+        self.mapper = mapper
+        self.extension = self.mapper.extension
+        self.adapter = adapter
+        self.selectable  = from_obj
+        self._with_polymorphic = with_polymorphic
+        self._polymorphic_discriminator = None
+        self.is_aliased_class = is_aliased_class
+        if is_aliased_class:
+            self.path_entity = self.entity = self.entity_zero = entity
+        else:
+            self.path_entity = mapper.base_mapper
+            self.entity = self.entity_zero = mapper
+
+    def set_with_polymorphic(self, query, cls_or_mappers, selectable, discriminator):
+        if cls_or_mappers is None:
+            query._reset_polymorphic_adapter(self.mapper)
+            return
+
+        mappers, from_obj = self.mapper._with_polymorphic_args(cls_or_mappers, selectable)
+        self._with_polymorphic = mappers
+        self._polymorphic_discriminator = discriminator
+
+        # TODO: do the wrapped thing here too so that with_polymorphic() can be
+        # applied to aliases
+        if not self.is_aliased_class:
+            self.selectable = from_obj
+            self.adapter = query._get_polymorphic_adapter(self, from_obj)
+
+    def corresponds_to(self, entity):
+        if _is_aliased_class(entity):
+            return entity is self.path_entity
+        else:
+            return entity.base_mapper is self.path_entity
+
+    def _get_entity_clauses(self, query, context):
+
+        adapter = None
+        if not self.is_aliased_class and query._polymorphic_adapters:
+            adapter = query._polymorphic_adapters.get(self.mapper, None)
+
+        if not adapter and self.adapter:
+            adapter = self.adapter
+
+        if adapter:
+            if query._from_obj_alias:
+                ret = adapter.wrap(query._from_obj_alias)
+            else:
+                ret = adapter
+        else:
+            ret = query._from_obj_alias
+
+        return ret
+
+    def row_processor(self, query, context, custom_rows):
+        adapter = self._get_entity_clauses(query, context)
+
+        if context.adapter and adapter:
+            adapter = adapter.wrap(context.adapter)
+        elif not adapter:
+            adapter = context.adapter
+
+        # polymorphic mappers which have concrete tables in their hierarchy usually
+        # require row aliasing unconditionally.
+        if not adapter and self.mapper._requires_row_aliasing:
+            adapter = sql_util.ColumnAdapter(self.selectable, self.mapper._equivalent_columns)
+
+        if self.primary_entity:
+            _instance = self.mapper._instance_processor(context, (self.path_entity,), adapter,
+                extension=self.extension, only_load_props=query._only_load_props, refresh_state=context.refresh_state,
+                polymorphic_discriminator=self._polymorphic_discriminator
+            )
+        else:
+            _instance = self.mapper._instance_processor(context, (self.path_entity,), adapter,
+                             polymorphic_discriminator=self._polymorphic_discriminator)
+
+        if custom_rows:
+            def main(context, row, result):
+                _instance(row, result)
+        else:
+            def main(context, row):
+                return _instance(row, None)
+
+        if self.is_aliased_class:
+            entname = self.entity._sa_label_name
+        else:
+            entname = self.mapper.class_.__name__
+
+        return main, entname
+
+    def setup_context(self, query, context):
+        adapter = self._get_entity_clauses(query, context)
+
+        context.froms.append(self.selectable)
+
+        if context.order_by is False and self.mapper.order_by:
+            context.order_by = self.mapper.order_by
+
+            # apply adaptation to the mapper's order_by if needed.
+            if adapter:
+                context.order_by = adapter.adapt_list(util.to_list(context.order_by))
+
+        for value in self.mapper._iterate_polymorphic_properties(self._with_polymorphic):
+            if query._only_load_props and value.key not in query._only_load_props:
+                continue
+            value.setup(
+                context,
+                self,
+                (self.path_entity,),
+                adapter,
+                only_load_props=query._only_load_props,
+                column_collection=context.primary_columns
+            )
+
+        if self._polymorphic_discriminator:
+            if adapter:
+                pd = adapter.columns[self._polymorphic_discriminator]
+            else:
+                pd = self._polymorphic_discriminator
+            context.primary_columns.append(pd)
+
+    def __str__(self):
+        return str(self.mapper)
+
+
+class _ColumnEntity(_QueryEntity):
+    """Column/expression based entity."""
+
+    def __init__(self, query, column):
+        if isinstance(column, basestring):
+            column = sql.literal_column(column)
+            self._result_label = column.name
+        elif isinstance(column, attributes.QueryableAttribute):
+            self._result_label = column.key
+            column = column.__clause_element__()
+        else:
+            self._result_label = getattr(column, 'key', None)
+
+        if not isinstance(column, expression.ColumnElement) and hasattr(column, '_select_iterable'):
+            for c in column._select_iterable:
+                if c is column:
+                    break
+                _ColumnEntity(query, c)
+
+            if c is not column:
+                return
+
+        if not isinstance(column, sql.ColumnElement):
+            raise sa_exc.InvalidRequestError(
+                "SQL expression, column, or mapped entity expected - got '%r'" % column
+            )
+
+        # if the Column is unnamed, give it a
+        # label() so that mutable column expressions
+        # can be located in the result even
+        # if the expression's identity has been changed
+        # due to adaption
+        if not column._label:
+            column = column.label(None)
+
+        query._entities.append(self)
+
+        self.column = column
+        self.froms = set()
+
+        # look for ORM entities represented within the
+        # given expression.  Try to count only entities
+        # for columns whos FROM object is in the actual list
+        # of FROMs for the overall expression - this helps
+        # subqueries which were built from ORM constructs from
+        # leaking out their entities into the main select construct
+        actual_froms = set(column._from_objects)
+
+        self.entities = util.OrderedSet(
+            elem._annotations['parententity']
+            for elem in visitors.iterate(column, {})
+            if 'parententity' in elem._annotations
+            and actual_froms.intersection(elem._from_objects)
+            )
+
+        if self.entities:
+            self.entity_zero = list(self.entities)[0]
+        else:
+            self.entity_zero = None
+
+    def setup_entity(self, entity, mapper, adapter, from_obj, is_aliased_class, with_polymorphic):
+        self.selectable = from_obj
+        self.froms.add(from_obj)
+
+    def corresponds_to(self, entity):
+        if self.entity_zero is None:
+            return False
+        elif _is_aliased_class(entity):
+            return entity is self.entity_zero
+        else:
+            return not _is_aliased_class(self.entity_zero) and \
+                entity.base_mapper.common_parent(self.entity_zero)
+            
+    def _resolve_expr_against_query_aliases(self, query, expr, context):
+        return query._adapt_clause(expr, False, True)
+
+    def row_processor(self, query, context, custom_rows):
+        column = self._resolve_expr_against_query_aliases(query, self.column, context)
+
+        if context.adapter:
+            column = context.adapter.columns[column]
+
+        def proc(context, row):
+            return row[column]
+
+        return (proc, self._result_label)
+
+    def setup_context(self, query, context):
+        column = self._resolve_expr_against_query_aliases(query, self.column, context)
+        context.froms += list(self.froms)
+        context.primary_columns.append(column)
+
+    def __str__(self):
+        return str(self.column)
+
+log.class_logger(Query)
+
+class QueryContext(object):
+    def __init__(self, query):
+
+        if query._statement:
+            if isinstance(query._statement, expression._SelectBaseMixin) and not query._statement.use_labels:
+                self.statement = query._statement.apply_labels()
+            else:
+                self.statement = query._statement
+        else:
+            self.statement = None
+            self.from_clause = query._from_obj
+            self.whereclause = query._criterion
+            self.order_by = query._order_by
+            if self.order_by:
+                self.order_by = [expression._literal_as_text(o) for o in util.to_list(self.order_by)]
+
+        self.query = query
+        self.session = query.session
+        self.populate_existing = query._populate_existing
+        self.version_check = query._version_check
+        self.refresh_state = query._refresh_state
+        self.primary_columns = []
+        self.secondary_columns = []
+        self.eager_order_by = []
+        self.enable_eagerloads = query._enable_eagerloads
+        self.eager_joins = {}
+        self.froms = []
+        self.adapter = None
+
+        self.options = set(query._with_options)
+        self.propagate_options = self.options.difference(o for o in self.options if not o.propagate_to_loaders)
+        self.attributes = query._attributes.copy()
+
+class AliasOption(interfaces.MapperOption):
+
+    def __init__(self, alias):
+        self.alias = alias
+
+    def process_query(self, query):
+        if isinstance(self.alias, basestring):
+            alias = query._mapper_zero().mapped_table.alias(self.alias)
+        else:
+            alias = self.alias
+        query._from_obj_alias = sql_util.ColumnAdapter(alias)
+
+
+_runid = 1L
+_id_lock = util.threading.Lock()
+
+def _new_runid():
+    global _runid
+    _id_lock.acquire()
+    try:
+        _runid += 1
+        return _runid
+    finally:
+        _id_lock.release()
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/orm/unitofwork.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/orm/unitofwork.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/orm/unitofwork.py (revision 3)
@@ -0,0 +1,789 @@
+# orm/unitofwork.py
+# Copyright (C) 2005, 2006, 2007, 2008, 2009 Michael Bayer mike_mp@zzzcomputing.com
+#
+# This module is part of SQLAlchemy and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+"""The internals for the Unit Of Work system.
+
+Includes hooks into the attributes package enabling the routing of
+change events to Unit Of Work objects, as well as the flush()
+mechanism which creates a dependency structure that executes change
+operations.
+
+A Unit of Work is essentially a system of maintaining a graph of
+in-memory objects and their modified state.  Objects are maintained as
+unique against their primary key identity using an *identity map*
+pattern.  The Unit of Work then maintains lists of objects that are
+new, dirty, or deleted and provides the capability to flush all those
+changes at once.
+
+"""
+
+from sqlalchemy import util, log, topological
+from sqlalchemy.orm import attributes, interfaces
+from sqlalchemy.orm import util as mapperutil
+from sqlalchemy.orm.mapper import _state_mapper
+
+# Load lazily
+object_session = None
+_state_session = None
+
+class UOWEventHandler(interfaces.AttributeExtension):
+    """An event handler added to all relation attributes which handles
+    session cascade operations.
+    """
+    
+    active_history = False
+    
+    def __init__(self, key):
+        self.key = key
+
+    def append(self, state, item, initiator):
+        # process "save_update" cascade rules for when an instance is appended to the list of another instance
+        sess = _state_session(state)
+        if sess:
+            prop = _state_mapper(state).get_property(self.key)
+            if prop.cascade.save_update and item not in sess:
+                sess.add(item)
+        return item
+        
+    def remove(self, state, item, initiator):
+        sess = _state_session(state)
+        if sess:
+            prop = _state_mapper(state).get_property(self.key)
+            # expunge pending orphans
+            if prop.cascade.delete_orphan and \
+                item in sess.new and \
+                prop.mapper._is_orphan(attributes.instance_state(item)):
+                    sess.expunge(item)
+
+    def set(self, state, newvalue, oldvalue, initiator):
+        # process "save_update" cascade rules for when an instance is attached to another instance
+        if oldvalue is newvalue:
+            return newvalue
+        sess = _state_session(state)
+        if sess:
+            prop = _state_mapper(state).get_property(self.key)
+            if newvalue is not None and prop.cascade.save_update and newvalue not in sess:
+                sess.add(newvalue)
+            if prop.cascade.delete_orphan and oldvalue in sess.new and \
+                prop.mapper._is_orphan(attributes.instance_state(oldvalue)):
+                sess.expunge(oldvalue)
+        return newvalue
+
+
+class UOWTransaction(object):
+    """Handles the details of organizing and executing transaction
+    tasks during a UnitOfWork object's flush() operation.
+
+    The central operation is to form a graph of nodes represented by the
+    ``UOWTask`` class, which is then traversed by a ``UOWExecutor`` object
+    that issues SQL and instance-synchronizing operations via the related
+    packages.
+    """
+
+    def __init__(self, session):
+        self.session = session
+        self.mapper_flush_opts = session._mapper_flush_opts
+
+        # stores tuples of mapper/dependent mapper pairs,
+        # representing a partial ordering fed into topological sort
+        self.dependencies = set()
+
+        # dictionary of mappers to UOWTasks
+        self.tasks = {}
+
+        # dictionary used by external actors to store arbitrary state
+        # information.
+        self.attributes = {}
+        
+        self.processors = set()
+        
+    def get_attribute_history(self, state, key, passive=True):
+        hashkey = ("history", state, key)
+
+        # cache the objects, not the states; the strong reference here
+        # prevents newly loaded objects from being dereferenced during the
+        # flush process
+        if hashkey in self.attributes:
+            (history, cached_passive) = self.attributes[hashkey]
+            # if the cached lookup was "passive" and now we want non-passive, do a non-passive
+            # lookup and re-cache
+            if cached_passive and not passive:
+                history = attributes.get_state_history(state, key, passive=False)
+                self.attributes[hashkey] = (history, passive)
+        else:
+            history = attributes.get_state_history(state, key, passive=passive)
+            self.attributes[hashkey] = (history, passive)
+
+        if not history or not state.get_impl(key).uses_objects:
+            return history
+        else:
+            return history.as_state()
+
+    def register_object(self, state, isdelete=False, listonly=False, postupdate=False, post_update_cols=None):
+        
+        # if object is not in the overall session, do nothing
+        if not self.session._contains_state(state):
+            if self._should_log_debug:
+                self.logger.debug("object %s not part of session, not registering for flush" % 
+                                        (mapperutil.state_str(state)))
+            return
+
+        if self._should_log_debug:
+            self.logger.debug("register object for flush: %s isdelete=%s listonly=%s postupdate=%s"
+                                    % (mapperutil.state_str(state), isdelete, listonly, postupdate))
+
+        mapper = _state_mapper(state)
+
+        task = self.get_task_by_mapper(mapper)
+        if postupdate:
+            task.append_postupdate(state, post_update_cols)
+        else:
+            task.append(state, listonly=listonly, isdelete=isdelete)
+
+        # ensure the mapper for this object has had its 
+        # DependencyProcessors added.
+        if mapper not in self.processors:
+            mapper._register_processors(self)
+            self.processors.add(mapper)
+
+            if mapper.base_mapper not in self.processors:
+                mapper.base_mapper._register_processors(self)
+                self.processors.add(mapper.base_mapper)
+            
+    def set_row_switch(self, state):
+        """mark a deleted object as a 'row switch'.
+
+        this indicates that an INSERT statement elsewhere corresponds to this DELETE;
+        the INSERT is converted to an UPDATE and the DELETE does not occur.
+        
+        """
+        mapper = _state_mapper(state)
+        task = self.get_task_by_mapper(mapper)
+        taskelement = task._objects[state]
+        taskelement.isdelete = "rowswitch"
+    
+    def is_deleted(self, state):
+        """return true if the given state is marked as deleted within this UOWTransaction."""
+
+        mapper = _state_mapper(state)
+        task = self.get_task_by_mapper(mapper)
+        return task.is_deleted(state)
+
+    def get_task_by_mapper(self, mapper, dontcreate=False):
+        """return UOWTask element corresponding to the given mapper.
+
+        Will create a new UOWTask, including a UOWTask corresponding to the
+        "base" inherited mapper, if needed, unless the dontcreate flag is True.
+        
+        """
+        try:
+            return self.tasks[mapper]
+        except KeyError:
+            if dontcreate:
+                return None
+
+            base_mapper = mapper.base_mapper
+            if base_mapper in self.tasks:
+                base_task = self.tasks[base_mapper]
+            else:
+                self.tasks[base_mapper] = base_task = UOWTask(self, base_mapper)
+                base_mapper._register_dependencies(self)
+
+            if mapper not in self.tasks:
+                self.tasks[mapper] = task = UOWTask(self, mapper, base_task=base_task)
+                mapper._register_dependencies(self)
+            else:
+                task = self.tasks[mapper]
+
+            return task
+
+    def register_dependency(self, mapper, dependency):
+        """register a dependency between two mappers.
+
+        Called by ``mapper.PropertyLoader`` to register the objects
+        handled by one mapper being dependent on the objects handled
+        by another.
+
+        """
+        # correct for primary mapper
+        # also convert to the "base mapper", the parentmost task at the top of an inheritance chain
+        # dependency sorting is done via non-inheriting mappers only, dependencies between mappers
+        # in the same inheritance chain is done at the per-object level
+        mapper = mapper.primary_mapper().base_mapper
+        dependency = dependency.primary_mapper().base_mapper
+
+        self.dependencies.add((mapper, dependency))
+
+    def register_processor(self, mapper, processor, mapperfrom):
+        """register a dependency processor, corresponding to 
+        operations which occur between two mappers.
+        
+        """
+        # correct for primary mapper
+        mapper = mapper.primary_mapper()
+        mapperfrom = mapperfrom.primary_mapper()
+
+        task = self.get_task_by_mapper(mapper)
+        targettask = self.get_task_by_mapper(mapperfrom)
+        up = UOWDependencyProcessor(processor, targettask)
+        task.dependencies.add(up)
+
+    def execute(self):
+        """Execute this UOWTransaction.
+
+        This will organize all collected UOWTasks into a dependency-sorted
+        list which is then traversed using the traversal scheme
+        encoded in the UOWExecutor class.  Operations to mappers and dependency
+        processors are fired off in order to issue SQL to the database and
+        synchronize instance attributes with database values and related
+        foreign key values."""
+
+        # pre-execute dependency processors.  this process may
+        # result in new tasks, objects and/or dependency processors being added,
+        # particularly with 'delete-orphan' cascade rules.
+        # keep running through the full list of tasks until all
+        # objects have been processed.
+        while True:
+            ret = False
+            for task in self.tasks.values():
+                for up in list(task.dependencies):
+                    if up.preexecute(self):
+                        ret = True
+            if not ret:
+                break
+
+        tasks = self._sort_dependencies()
+        if self._should_log_info:
+            self.logger.info("Task dump:\n" + self._dump(tasks))
+        UOWExecutor().execute(self, tasks)
+        if self._should_log_info:
+            self.logger.info("Execute Complete")
+
+    def _dump(self, tasks):
+        from uowdumper import UOWDumper
+        return UOWDumper.dump(tasks)
+
+    @property
+    def elements(self):
+        """Iterate UOWTaskElements."""
+        
+        for task in self.tasks.itervalues():
+            for elem in task.elements:
+                yield elem
+
+    def finalize_flush_changes(self):
+        """mark processed objects as clean / deleted after a successful flush().
+
+        this method is called within the flush() method after the
+        execute() method has succeeded and the transaction has been committed.
+        """
+
+        for elem in self.elements:
+            if elem.isdelete:
+                self.session._remove_newly_deleted(elem.state)
+            elif not elem.listonly:
+                self.session._register_newly_persistent(elem.state)
+
+    def _sort_dependencies(self):
+        nodes = topological.sort_with_cycles(self.dependencies,
+            [t.mapper for t in self.tasks.itervalues() if t.base_task is t]
+        )
+
+        ret = []
+        for item, cycles in nodes:
+            task = self.get_task_by_mapper(item)
+            if cycles:
+                for t in task._sort_circular_dependencies(self, [self.get_task_by_mapper(i) for i in cycles]):
+                    ret.append(t)
+            else:
+                ret.append(task)
+
+        if self._should_log_debug:
+            self.logger.debug("Dependent tuples:\n" + "\n".join(
+                    "(%s->%s)" % (d[0].class_.__name__, d[1].class_.__name__)
+                    for d in self.dependencies))
+            self.logger.debug("Dependency sort:\n"+ str(ret))
+        return ret
+
+log.class_logger(UOWTransaction)
+
+class UOWTask(object):
+    """A collection of mapped states corresponding to a particular mapper."""
+    
+    def __init__(self, uowtransaction, mapper, base_task=None):
+        self.uowtransaction = uowtransaction
+
+        # base_task is the UOWTask which represents the "base mapper"
+        # in our mapper's inheritance chain.  if the mapper does not
+        # inherit from any other mapper, the base_task is self.
+        # the _inheriting_tasks dictionary is a dictionary present only
+        # on the "base_task"-holding UOWTask, which maps all mappers within
+        # an inheritance hierarchy to their corresponding UOWTask instances.
+        if base_task is None:
+            self.base_task = self
+            self._inheriting_tasks = {mapper:self}
+        else:
+            self.base_task = base_task
+            base_task._inheriting_tasks[mapper] = self
+
+        # the Mapper which this UOWTask corresponds to
+        self.mapper = mapper
+
+        # mapping of InstanceState -> UOWTaskElement
+        self._objects = {}
+
+        self.dependent_tasks = []
+        self.dependencies = set()
+        self.cyclical_dependencies = set()
+
+    @util.memoized_property
+    def inheriting_mappers(self):
+        return list(self.mapper.polymorphic_iterator())
+
+    @property
+    def polymorphic_tasks(self):
+        """Return an iterator of UOWTask objects corresponding to the
+        inheritance sequence of this UOWTask's mapper.
+
+        e.g. if mapper B and mapper C inherit from mapper A, and
+        mapper D inherits from B:
+
+            mapperA -> mapperB -> mapperD
+                    -> mapperC
+
+        the inheritance sequence starting at mapper A is a depth-first
+        traversal:
+
+            [mapperA, mapperB, mapperD, mapperC]
+
+        this method will therefore return
+
+            [UOWTask(mapperA), UOWTask(mapperB), UOWTask(mapperD),
+             UOWTask(mapperC)]
+
+        The concept of "polymporphic iteration" is adapted into
+        several property-based iterators which return object
+        instances, UOWTaskElements and UOWDependencyProcessors in an
+        order corresponding to this sequence of parent UOWTasks.  This
+        is used to issue operations related to inheritance-chains of
+        mappers in the proper order based on dependencies between
+        those mappers.
+
+        """
+        for mapper in self.inheriting_mappers:
+            t = self.base_task._inheriting_tasks.get(mapper, None)
+            if t is not None:
+                yield t
+
+    def is_empty(self):
+        """return True if this UOWTask is 'empty', meaning it has no child items.
+
+        used only for debugging output.
+        """
+
+        return not self._objects and not self.dependencies
+
+    def append(self, state, listonly=False, isdelete=False):
+        if state not in self._objects:
+            self._objects[state] = rec = UOWTaskElement(state)
+        else:
+            rec = self._objects[state]
+
+        rec.update(listonly, isdelete)
+
+    def append_postupdate(self, state, post_update_cols):
+        """issue a 'post update' UPDATE statement via this object's mapper immediately.
+
+        this operation is used only with relations that specify the `post_update=True`
+        flag.
+        """
+
+        # postupdates are UPDATED immeditely (for now)
+        # convert post_update_cols list to a Set so that __hash__() is used to compare columns
+        # instead of __eq__()
+        self.mapper._save_obj([state], self.uowtransaction, postupdate=True, post_update_cols=set(post_update_cols))
+
+    def __contains__(self, state):
+        """return True if the given object is contained within this UOWTask or inheriting tasks."""
+
+        for task in self.polymorphic_tasks:
+            if state in task._objects:
+                return True
+        else:
+            return False
+
+    def is_deleted(self, state):
+        """return True if the given object is marked as to be deleted within this UOWTask."""
+
+        try:
+            return self._objects[state].isdelete
+        except KeyError:
+            return False
+
+    def _polymorphic_collection(fn):
+        """return a property that will adapt the collection returned by the
+        given callable into a polymorphic traversal."""
+
+        @property
+        def collection(self):
+            for task in self.polymorphic_tasks:
+                for rec in fn(task):
+                    yield rec
+        return collection
+
+    def _polymorphic_collection_filtered(fn):
+
+        def collection(self, mappers):
+            for task in self.polymorphic_tasks:
+                if task.mapper in mappers:
+                    for rec in fn(task):
+                        yield rec
+        return collection
+
+    @property
+    def elements(self):
+        return self._objects.values()
+
+    @_polymorphic_collection
+    def polymorphic_elements(self):
+        return self.elements
+
+    @_polymorphic_collection_filtered
+    def filter_polymorphic_elements(self):
+        return self.elements
+
+    @property
+    def polymorphic_tosave_elements(self):
+        return [rec for rec in self.polymorphic_elements if not rec.isdelete]
+
+    @property
+    def polymorphic_todelete_elements(self):
+        return [rec for rec in self.polymorphic_elements if rec.isdelete]
+
+    @property
+    def polymorphic_tosave_objects(self):
+        return [
+            rec.state for rec in self.polymorphic_elements
+            if rec.state is not None and not rec.listonly and rec.isdelete is False
+        ]
+
+    @property
+    def polymorphic_todelete_objects(self):
+        return [
+            rec.state for rec in self.polymorphic_elements
+            if rec.state is not None and not rec.listonly and rec.isdelete is True
+        ]
+
+    @_polymorphic_collection
+    def polymorphic_dependencies(self):
+        return self.dependencies
+
+    @_polymorphic_collection
+    def polymorphic_cyclical_dependencies(self):
+        return self.cyclical_dependencies
+
+    def _sort_circular_dependencies(self, trans, cycles):
+        """Topologically sort individual entities with row-level dependencies.
+        
+        Builds a modified UOWTask structure, and is invoked when the
+        per-mapper topological structure is found to have cycles.
+        
+        """
+        dependencies = {}
+        def set_processor_for_state(state, depprocessor, target_state, isdelete):
+            if state not in dependencies:
+                dependencies[state] = {}
+            tasks = dependencies[state]
+            if depprocessor not in tasks:
+                tasks[depprocessor] = UOWDependencyProcessor(
+                                            depprocessor.processor, 
+                                            UOWTask(self.uowtransaction, depprocessor.targettask.mapper)
+                                      )
+            tasks[depprocessor].targettask.append(target_state, isdelete=isdelete)
+            
+        cycles = set(cycles)
+        def dependency_in_cycles(dep):
+            proctask = trans.get_task_by_mapper(dep.processor.mapper.base_mapper, True)
+            targettask = trans.get_task_by_mapper(dep.targettask.mapper.base_mapper, True)
+            return targettask in cycles and (proctask is not None and proctask in cycles)
+
+        deps_by_targettask = {}
+        extradeplist = []
+        for task in cycles:
+            for dep in task.polymorphic_dependencies:
+                if not dependency_in_cycles(dep):
+                    extradeplist.append(dep)
+                for t in dep.targettask.polymorphic_tasks:
+                    l = deps_by_targettask.setdefault(t, [])
+                    l.append(dep)
+
+        object_to_original_task = {}
+        tuples = []
+
+        for task in cycles:
+            for subtask in task.polymorphic_tasks:
+                for taskelement in subtask.elements:
+                    state = taskelement.state
+                    object_to_original_task[state] = subtask
+                    if subtask not in deps_by_targettask:
+                        continue
+                    for dep in deps_by_targettask[subtask]:
+                        if dep.processor.no_dependencies or not dependency_in_cycles(dep):
+                            continue
+                        (processor, targettask) = (dep.processor, dep.targettask)
+                        isdelete = taskelement.isdelete
+
+                        # list of dependent objects from this object
+                        (added, unchanged, deleted) = dep.get_object_dependencies(state, trans, passive=True)
+                        if not added and not unchanged and not deleted:
+                            continue
+
+                        # the task corresponding to saving/deleting of those dependent objects
+                        childtask = trans.get_task_by_mapper(processor.mapper)
+
+                        childlist = added + unchanged + deleted
+
+                        for o in childlist:
+                            if o is None:
+                                continue
+
+                            if o not in childtask:
+                                childtask.append(o, listonly=True)
+                                object_to_original_task[o] = childtask
+
+                            whosdep = dep.whose_dependent_on_who(state, o)
+                            if whosdep is not None:
+                                tuples.append(whosdep)
+
+                                if whosdep[0] is state:
+                                    set_processor_for_state(whosdep[0], dep, whosdep[0], isdelete=isdelete)
+                                else:
+                                    set_processor_for_state(whosdep[0], dep, whosdep[1], isdelete=isdelete)
+                            else:
+                                # TODO: no test coverage here
+                                set_processor_for_state(state, dep, state, isdelete=isdelete)
+
+        t = UOWTask(self.uowtransaction, self.mapper)
+        t.dependencies.update(extradeplist)
+
+        used_tasks = set()
+
+        # rationale for "tree" sort as opposed to a straight
+        # dependency - keep non-dependent objects
+        # grouped together, so that insert ordering as determined
+        # by session.add() is maintained.
+        # An alternative might be to represent the "insert order"
+        # as part of the topological sort itself, which would
+        # eliminate the need for this step (but may make the original
+        # topological sort more expensive)
+        head = topological.sort_as_tree(tuples, object_to_original_task.iterkeys())
+        if head is not None:
+            original_to_tasks = {}
+            stack = [(head, t)]
+            while stack:
+                ((state, cycles, children), parenttask) = stack.pop()
+
+                originating_task = object_to_original_task[state]
+                used_tasks.add(originating_task)
+
+                if (parenttask, originating_task) not in original_to_tasks:
+                    task = UOWTask(self.uowtransaction, originating_task.mapper)
+                    original_to_tasks[(parenttask, originating_task)] = task
+                    parenttask.dependent_tasks.append(task)
+                else:
+                    task = original_to_tasks[(parenttask, originating_task)]
+
+                task.append(state, originating_task._objects[state].listonly, isdelete=originating_task._objects[state].isdelete)
+
+                if state in dependencies:
+                    task.cyclical_dependencies.update(dependencies[state].itervalues())
+
+                stack += [(n, task) for n in children]
+
+        ret = [t]
+
+        # add tasks that were in the cycle, but didnt get assembled
+        # into the cyclical tree, to the start of the list
+        for t2 in cycles:
+            if t2 not in used_tasks and t2 is not self:
+                localtask = UOWTask(self.uowtransaction, t2.mapper)
+                for state in t2.elements:
+                    localtask.append(state, t2.listonly, isdelete=t2._objects[state].isdelete)
+                for dep in t2.dependencies:
+                    localtask.dependencies.add(dep)
+                ret.insert(0, localtask)
+
+        return ret
+
+    def __repr__(self):
+        return ("UOWTask(%s) Mapper: '%r'" % (hex(id(self)), self.mapper))
+
+class UOWTaskElement(object):
+    """Corresponds to a single InstanceState to be saved, deleted,
+    or otherwise marked as having dependencies.  A collection of
+    UOWTaskElements are held by a UOWTask.
+
+    """
+    def __init__(self, state):
+        self.state = state
+        self.listonly = True
+        self.isdelete = False
+        self.preprocessed = set()
+
+    def update(self, listonly, isdelete):
+        if not listonly and self.listonly:
+            self.listonly = False
+            self.preprocessed.clear()
+        if isdelete and not self.isdelete:
+            self.isdelete = True
+            self.preprocessed.clear()
+
+    def __repr__(self):
+        return "UOWTaskElement/%d: %s/%d %s" % (
+            id(self), 
+            self.state.class_.__name__, 
+            id(self.state.obj()), 
+            (self.listonly and 'listonly' or (self.isdelete and 'delete' or 'save')) 
+        )
+
+class UOWDependencyProcessor(object):
+    """In between the saving and deleting of objects, process
+    dependent data, such as filling in a foreign key on a child item
+    from a new primary key, or deleting association rows before a
+    delete.  This object acts as a proxy to a DependencyProcessor.
+
+    """
+    def __init__(self, processor, targettask):
+        self.processor = processor
+        self.targettask = targettask
+        prop = processor.prop
+        
+        # define a set of mappers which
+        # will filter the lists of entities
+        # this UOWDP processes.  this allows
+        # MapperProperties to be overridden
+        # at least for concrete mappers.
+        self._mappers = set([
+            m
+            for m in self.processor.parent.polymorphic_iterator()
+            if m._props[prop.key] is prop
+        ]).union(self.processor.mapper.polymorphic_iterator())
+            
+    def __repr__(self):
+        return "UOWDependencyProcessor(%s, %s)" % (str(self.processor), str(self.targettask))
+
+    def __eq__(self, other):
+        return other.processor is self.processor and other.targettask is self.targettask
+
+    def __hash__(self):
+        return hash((self.processor, self.targettask))
+
+    def preexecute(self, trans):
+        """preprocess all objects contained within this ``UOWDependencyProcessor``s target task.
+
+        This may locate additional objects which should be part of the
+        transaction, such as those affected deletes, orphans to be
+        deleted, etc.
+
+        Once an object is preprocessed, its ``UOWTaskElement`` is marked as processed.  If subsequent
+        changes occur to the ``UOWTaskElement``, its processed flag is reset, and will require processing
+        again.
+
+        Return True if any objects were preprocessed, or False if no
+        objects were preprocessed.  If True is returned, the parent ``UOWTransaction`` will
+        ultimately call ``preexecute()`` again on all processors until no new objects are processed.
+        """
+
+        def getobj(elem):
+            elem.preprocessed.add(self)
+            return elem.state
+
+        ret = False
+        elements = [getobj(elem) for elem in 
+                        self.targettask.filter_polymorphic_elements(self._mappers)
+                        if self not in elem.preprocessed and not elem.isdelete]
+        if elements:
+            ret = True
+            self.processor.preprocess_dependencies(self.targettask, elements, trans, delete=False)
+
+        elements = [getobj(elem) for elem in 
+                        self.targettask.filter_polymorphic_elements(self._mappers)
+                        if self not in elem.preprocessed and elem.isdelete]
+        if elements:
+            ret = True
+            self.processor.preprocess_dependencies(self.targettask, elements, trans, delete=True)
+        return ret
+
+    def execute(self, trans, delete):
+        """process all objects contained within this ``UOWDependencyProcessor``s target task."""
+
+
+        elements = [e for e in 
+                    self.targettask.filter_polymorphic_elements(self._mappers) 
+                    if bool(e.isdelete)==delete]
+
+        self.processor.process_dependencies(
+            self.targettask, 
+            [elem.state for elem in elements], 
+            trans, 
+            delete=delete)
+
+    def get_object_dependencies(self, state, trans, passive):
+        return trans.get_attribute_history(state, self.processor.key, passive=passive)
+
+    def whose_dependent_on_who(self, state1, state2):
+        """establish which object is operationally dependent amongst a parent/child
+        using the semantics stated by the dependency processor.
+
+        This method is used to establish a partial ordering (set of dependency tuples)
+        when toplogically sorting on a per-instance basis.
+
+        """
+        return self.processor.whose_dependent_on_who(state1, state2)
+
+class UOWExecutor(object):
+    """Encapsulates the execution traversal of a UOWTransaction structure."""
+
+    def execute(self, trans, tasks, isdelete=None):
+        if isdelete is not True:
+            for task in tasks:
+                self.execute_save_steps(trans, task)
+        if isdelete is not False:
+            for task in reversed(tasks):
+                self.execute_delete_steps(trans, task)
+
+    def save_objects(self, trans, task):
+        task.mapper._save_obj(task.polymorphic_tosave_objects, trans)
+
+    def delete_objects(self, trans, task):
+        task.mapper._delete_obj(task.polymorphic_todelete_objects, trans)
+
+    def execute_dependency(self, trans, dep, isdelete):
+        dep.execute(trans, isdelete)
+
+    def execute_save_steps(self, trans, task):
+        self.save_objects(trans, task)
+        for dep in task.polymorphic_cyclical_dependencies:
+            self.execute_dependency(trans, dep, False)
+        for dep in task.polymorphic_cyclical_dependencies:
+            self.execute_dependency(trans, dep, True)
+        self.execute_cyclical_dependencies(trans, task, False)
+        self.execute_dependencies(trans, task)
+
+    def execute_delete_steps(self, trans, task):
+        self.execute_cyclical_dependencies(trans, task, True)
+        self.delete_objects(trans, task)
+
+    def execute_dependencies(self, trans, task):
+        polymorphic_dependencies = list(task.polymorphic_dependencies)
+        for dep in polymorphic_dependencies:
+            self.execute_dependency(trans, dep, False)
+        for dep in reversed(polymorphic_dependencies):
+            self.execute_dependency(trans, dep, True)
+
+    def execute_cyclical_dependencies(self, trans, task, isdelete):
+        for t in task.dependent_tasks:
+            self.execute(trans, [t], isdelete)
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/orm/strategies.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/orm/strategies.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/orm/strategies.py (revision 3)
@@ -0,0 +1,863 @@
+# strategies.py
+# Copyright (C) 2005, 2006, 2007, 2008, 2009 Michael Bayer mike_mp@zzzcomputing.com
+#
+# This module is part of SQLAlchemy and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+"""sqlalchemy.orm.interfaces.LoaderStrategy implementations, and related MapperOptions."""
+
+import sqlalchemy.exceptions as sa_exc
+from sqlalchemy import sql, util, log
+from sqlalchemy.sql import util as sql_util
+from sqlalchemy.sql import visitors, expression, operators
+from sqlalchemy.orm import mapper, attributes, interfaces
+from sqlalchemy.orm.interfaces import (
+    LoaderStrategy, StrategizedOption, MapperOption, PropertyOption,
+    serialize_path, deserialize_path, StrategizedProperty
+    )
+from sqlalchemy.orm import session as sessionlib
+from sqlalchemy.orm import util as mapperutil
+
+def _register_attribute(strategy, mapper, useobject,
+        compare_function=None, 
+        typecallable=None,
+        copy_function=None, 
+        mutable_scalars=False, 
+        uselist=False,
+        callable_=None, 
+        proxy_property=None, 
+        active_history=False,
+        impl_class=None, 
+        **kw        
+):
+
+    prop = strategy.parent_property
+    attribute_ext = list(util.to_list(prop.extension, default=[]))
+        
+    if useobject and prop.single_parent:
+        attribute_ext.append(_SingleParentValidator(prop))
+
+    if getattr(prop, 'backref', None):
+        attribute_ext.append(prop.backref.extension)
+    
+    if prop.key in prop.parent._validators:
+        attribute_ext.append(mapperutil.Validator(prop.key, prop.parent._validators[prop.key]))
+    
+    if useobject:
+        attribute_ext.append(sessionlib.UOWEventHandler(prop.key))
+    
+    for m in mapper.polymorphic_iterator():
+        if prop is m._props.get(prop.key):
+            
+            attributes.register_attribute_impl(
+                m.class_, 
+                prop.key, 
+                parent_token=prop,
+                mutable_scalars=mutable_scalars,
+                uselist=uselist, 
+                copy_function=copy_function, 
+                compare_function=compare_function, 
+                useobject=useobject, 
+                extension=attribute_ext, 
+                trackparent=useobject, 
+                typecallable=typecallable,
+                callable_=callable_, 
+                active_history=active_history,
+                impl_class=impl_class,
+                **kw
+                )
+
+class UninstrumentedColumnLoader(LoaderStrategy):
+    """Represent the strategy for a MapperProperty that doesn't instrument the class.
+    
+    The polymorphic_on argument of mapper() often results in this,
+    if the argument is against the with_polymorphic selectable.
+    
+    """
+    def init(self):
+        self.columns = self.parent_property.columns
+
+    def setup_query(self, context, entity, path, adapter, column_collection=None, **kwargs):
+        for c in self.columns:
+            if adapter:
+                c = adapter.columns[c]
+            column_collection.append(c)
+
+    def create_row_processor(self, selectcontext, path, mapper, row, adapter):
+        return (None, None)
+
+class ColumnLoader(LoaderStrategy):
+    """Strategize the loading of a plain column-based MapperProperty."""
+    
+    def init(self):
+        self.columns = self.parent_property.columns
+        self.is_composite = hasattr(self.parent_property, 'composite_class')
+        
+    def setup_query(self, context, entity, path, adapter, column_collection=None, **kwargs):
+        for c in self.columns:
+            if adapter:
+                c = adapter.columns[c]
+            column_collection.append(c)
+        
+    def init_class_attribute(self, mapper):
+        self.is_class_level = True
+        coltype = self.columns[0].type
+        active_history = self.columns[0].primary_key  # TODO: check all columns ?  check for foreign Key as well?
+
+        _register_attribute(self, mapper, useobject=False,
+            compare_function=coltype.compare_values,
+            copy_function=coltype.copy_value,
+            mutable_scalars=self.columns[0].type.is_mutable(),
+            active_history = active_history
+       )
+        
+    def create_row_processor(self, selectcontext, path, mapper, row, adapter):
+        key, col = self.key, self.columns[0]
+        if adapter:
+            col = adapter.columns[col]
+        if col is not None and col in row:
+            def new_execute(state, dict_, row, **flags):
+                dict_[key] = row[col]
+                
+            if self._should_log_debug:
+                new_execute = self.debug_callable(new_execute, self.logger,
+                    "%s returning active column fetcher" % self,
+                    lambda state, dict_, row, **flags: "%s populating %s" % \
+                                                      (self,
+                                                       mapperutil.state_attribute_str(state, key))
+                )
+            return (new_execute, None)
+        else:
+            def new_execute(state, dict_, row, isnew, **flags):
+                if isnew:
+                    state.expire_attributes([key])
+            if self._should_log_debug:
+                self.logger.debug("%s deferring load" % self)
+            return (new_execute, None)
+
+log.class_logger(ColumnLoader)
+
+class CompositeColumnLoader(ColumnLoader):
+    """Strategize the loading of a composite column-based MapperProperty."""
+
+    def init_class_attribute(self, mapper):
+        self.is_class_level = True
+        self.logger.info("%s register managed composite attribute" % self)
+
+        def copy(obj):
+            if obj is None:
+                return None
+            return self.parent_property.composite_class(*obj.__composite_values__())
+            
+        def compare(a, b):
+            if a is None or b is None:
+                return a is b
+                
+            for col, aprop, bprop in zip(self.columns,
+                                         a.__composite_values__(),
+                                         b.__composite_values__()):
+                if not col.type.compare_values(aprop, bprop):
+                    return False
+            else:
+                return True
+
+        _register_attribute(self, mapper, useobject=False,
+            compare_function=compare,
+            copy_function=copy,
+            mutable_scalars=True
+            #active_history ?
+        )
+
+    def create_row_processor(self, selectcontext, path, mapper, row, adapter):
+        key, columns, composite_class = self.key, self.columns, self.parent_property.composite_class
+        if adapter:
+            columns = [adapter.columns[c] for c in columns]
+        for c in columns:
+            if c not in row:
+                def new_execute(state, dict_, row, isnew, **flags):
+                    if isnew:
+                        state.expire_attributes([key])
+                if self._should_log_debug:
+                    self.logger.debug("%s deferring load" % self)
+                return (new_execute, None)
+        else:
+            def new_execute(state, dict_, row, **flags):
+                dict_[key] = composite_class(*[row[c] for c in columns])
+
+            if self._should_log_debug:
+                new_execute = self.debug_callable(new_execute, self.logger,
+                    "%s returning active composite column fetcher" % self,
+                    lambda state, dict_, row, **flags: "populating %s" % \
+                                                      (mapperutil.state_attribute_str(state, key))
+                )
+
+            return (new_execute, None)
+
+log.class_logger(CompositeColumnLoader)
+    
+class DeferredColumnLoader(LoaderStrategy):
+    """Strategize the loading of a deferred column-based MapperProperty."""
+    
+    def create_row_processor(self, selectcontext, path, mapper, row, adapter):
+        col = self.columns[0]
+        if adapter:
+            col = adapter.columns[col]
+        if col in row:
+            return self.parent_property._get_strategy(ColumnLoader).create_row_processor(selectcontext, path, mapper, row, adapter)
+
+        elif not self.is_class_level:
+            def new_execute(state, dict_, row, **flags):
+                state.set_callable(self.key, LoadDeferredColumns(state, self.key))
+        else:
+            def new_execute(state, dict_, row, **flags):
+                # reset state on the key so that deferred callables
+                # fire off on next access.
+                state.reset(self.key, dict_)
+
+        if self._should_log_debug:
+            new_execute = self.debug_callable(new_execute, self.logger, None,
+                lambda state, dict_, row, **flags: "set deferred callable on %s" % \
+                                                  mapperutil.state_attribute_str(state, self.key)
+            )
+        return (new_execute, None)
+
+    def init(self):
+        if hasattr(self.parent_property, 'composite_class'):
+            raise NotImplementedError("Deferred loading for composite types not implemented yet")
+        self.columns = self.parent_property.columns
+        self.group = self.parent_property.group
+
+    def init_class_attribute(self, mapper):
+        self.is_class_level = True
+    
+        _register_attribute(self, mapper, useobject=False,
+             compare_function=self.columns[0].type.compare_values,
+             copy_function=self.columns[0].type.copy_value,
+             mutable_scalars=self.columns[0].type.is_mutable(),
+             callable_=self._class_level_loader,
+             dont_expire_missing=True
+        )
+
+    def setup_query(self, context, entity, path, adapter, only_load_props=None, **kwargs):
+        if \
+            (self.group is not None and context.attributes.get(('undefer', self.group), False)) or \
+            (only_load_props and self.key in only_load_props):
+            
+            self.parent_property._get_strategy(ColumnLoader).setup_query(context, entity, path, adapter, **kwargs)
+    
+    def _class_level_loader(self, state):
+        if not mapperutil._state_has_identity(state):
+            return None
+            
+        return LoadDeferredColumns(state, self.key)
+        
+                
+log.class_logger(DeferredColumnLoader)
+
+class LoadDeferredColumns(object):
+    """serializable loader object used by DeferredColumnLoader"""
+    
+    def __init__(self, state, key):
+        self.state, self.key = state, key
+
+    def __call__(self):
+        state = self.state
+        
+        
+        localparent = mapper._state_mapper(state)
+        
+        prop = localparent.get_property(self.key)
+        strategy = prop._get_strategy(DeferredColumnLoader)
+
+        if strategy.group:
+            toload = [
+                    p.key for p in 
+                    localparent.iterate_properties 
+                    if isinstance(p, StrategizedProperty) and 
+                      isinstance(p.strategy, DeferredColumnLoader) and 
+                      p.group==strategy.group
+                    ]
+        else:
+            toload = [self.key]
+
+        # narrow the keys down to just those which have no history
+        group = [k for k in toload if k in state.unmodified]
+
+        if strategy._should_log_debug:
+            strategy.logger.debug(
+                    "deferred load %s group %s" % 
+                    (mapperutil.state_attribute_str(state, self.key), group and ','.join(group) or 'None')
+                )
+
+        session = sessionlib._state_session(state)
+        if session is None:
+            raise sa_exc.UnboundExecutionError(
+                        "Parent instance %s is not bound to a Session; "
+                        "deferred load operation of attribute '%s' cannot proceed" % 
+                        (mapperutil.state_str(state), self.key)
+                    )
+
+        query = session.query(localparent)
+        ident = state.key[1]
+        query._get(None, ident=ident, only_load_props=group, refresh_state=state)
+        return attributes.ATTR_WAS_SET
+
+class DeferredOption(StrategizedOption):
+    propagate_to_loaders = True
+    
+    def __init__(self, key, defer=False):
+        super(DeferredOption, self).__init__(key)
+        self.defer = defer
+
+    def get_strategy_class(self):
+        if self.defer:
+            return DeferredColumnLoader
+        else:
+            return ColumnLoader
+
+class UndeferGroupOption(MapperOption):
+    propagate_to_loaders = True
+
+    def __init__(self, group):
+        self.group = group
+    def process_query(self, query):
+        query._attributes[('undefer', self.group)] = True
+
+class AbstractRelationLoader(LoaderStrategy):
+    """LoaderStratgies which deal with related objects as opposed to scalars."""
+
+    def init(self):
+        for attr in ['mapper', 'target', 'table', 'uselist']:
+            setattr(self, attr, getattr(self.parent_property, attr))
+        
+    def _init_instance_attribute(self, state, callable_=None):
+        if callable_:
+            state.set_callable(self.key, callable_)
+        else:
+            state.initialize(self.key)
+
+class NoLoader(AbstractRelationLoader):
+    """Strategize a relation() that doesn't load data automatically."""
+
+    def init_class_attribute(self, mapper):
+        self.is_class_level = True
+
+        _register_attribute(self, mapper,
+            useobject=True, 
+            uselist=self.parent_property.uselist,
+            typecallable = self.parent_property.collection_class,
+        )
+
+    def create_row_processor(self, selectcontext, path, mapper, row, adapter):
+        def new_execute(state, dict_, row, **flags):
+            self._init_instance_attribute(state)
+
+        if self._should_log_debug:
+            new_execute = self.debug_callable(new_execute, self.logger, None,
+                lambda state, dict_, row, **flags: "initializing blank scalar/collection on %s" % \
+                                                  mapperutil.state_attribute_str(state, self.key)
+            )
+        return (new_execute, None)
+
+log.class_logger(NoLoader)
+        
+class LazyLoader(AbstractRelationLoader):
+    """Strategize a relation() that loads when first accessed."""
+
+    def init(self):
+        super(LazyLoader, self).init()
+        (self.__lazywhere, self.__bind_to_col, self._equated_columns) = self._create_lazy_clause(self.parent_property)
+        
+        self.logger.info("%s lazy loading clause %s" % (self, self.__lazywhere))
+
+        # determine if our "lazywhere" clause is the same as the mapper's
+        # get() clause.  then we can just use mapper.get()
+        #from sqlalchemy.orm import query
+        self.use_get = not self.uselist and self.mapper._get_clause[0].compare(self.__lazywhere)
+        if self.use_get:
+            self.logger.info("%s will use query.get() to optimize instance loads" % self)
+
+    def init_class_attribute(self, mapper):
+        self.is_class_level = True
+        
+        # MANYTOONE currently only needs the "old" value for delete-orphan
+        # cascades.  the required _SingleParentValidator will enable active_history
+        # in that case.  otherwise we don't need the "old" value during backref operations.
+        _register_attribute(self, 
+                mapper,
+                useobject=True,
+                callable_=self._class_level_loader,
+                uselist = self.parent_property.uselist,
+                typecallable = self.parent_property.collection_class,
+                active_history = self.parent_property.direction is not interfaces.MANYTOONE, 
+                )
+
+    def lazy_clause(self, state, reverse_direction=False, alias_secondary=False, adapt_source=None):
+        if state is None:
+            return self._lazy_none_clause(reverse_direction, adapt_source=adapt_source)
+            
+        if not reverse_direction:
+            (criterion, bind_to_col, rev) = (self.__lazywhere, self.__bind_to_col, self._equated_columns)
+        else:
+            (criterion, bind_to_col, rev) = LazyLoader._create_lazy_clause(self.parent_property, reverse_direction=reverse_direction)
+
+        def visit_bindparam(bindparam):
+            mapper = reverse_direction and self.parent_property.mapper or self.parent_property.parent
+            if bindparam.key in bind_to_col:
+                # use the "committed" (database) version to get query column values
+                # also its a deferred value; so that when used by Query, the committed value is used
+                # after an autoflush occurs
+                o = state.obj() # strong ref
+                bindparam.value = lambda: mapper._get_committed_attr_by_column(o, bind_to_col[bindparam.key])
+
+        if self.parent_property.secondary and alias_secondary:
+            criterion = sql_util.ClauseAdapter(self.parent_property.secondary.alias()).traverse(criterion)
+
+        criterion = visitors.cloned_traverse(criterion, {}, {'bindparam':visit_bindparam})
+        if adapt_source:
+            criterion = adapt_source(criterion)
+        return criterion
+        
+    def _lazy_none_clause(self, reverse_direction=False, adapt_source=None):
+        if not reverse_direction:
+            (criterion, bind_to_col, rev) = (self.__lazywhere, self.__bind_to_col, self._equated_columns)
+        else:
+            (criterion, bind_to_col, rev) = LazyLoader._create_lazy_clause(self.parent_property, reverse_direction=reverse_direction)
+
+        def visit_binary(binary):
+            mapper = reverse_direction and self.parent_property.mapper or self.parent_property.parent
+            if isinstance(binary.left, expression._BindParamClause) and binary.left.key in bind_to_col:
+                # reverse order if the NULL is on the left side
+                binary.left = binary.right
+                binary.right = expression.null()
+                binary.operator = operators.is_
+                binary.negate = operators.isnot
+            elif isinstance(binary.right, expression._BindParamClause) and binary.right.key in bind_to_col:
+                binary.right = expression.null()
+                binary.operator = operators.is_
+                binary.negate = operators.isnot
+
+        criterion = visitors.cloned_traverse(criterion, {}, {'binary':visit_binary})
+        if adapt_source:
+            criterion = adapt_source(criterion)
+        return criterion
+        
+    def _class_level_loader(self, state):
+        if not mapperutil._state_has_identity(state):
+            return None
+
+        return LoadLazyAttribute(state, self.key)
+
+    def create_row_processor(self, selectcontext, path, mapper, row, adapter):
+        if not self.is_class_level:
+            def new_execute(state, dict_, row, **flags):
+                # we are not the primary manager for this attribute on this class - set up a
+                # per-instance lazyloader, which will override the class-level behavior.
+                # this currently only happens when using a "lazyload" option on a "no load"
+                # attribute - "eager" attributes always have a class-level lazyloader
+                # installed.
+                self._init_instance_attribute(state, callable_=LoadLazyAttribute(state, self.key))
+
+            if self._should_log_debug:
+                new_execute = self.debug_callable(new_execute, self.logger, None,
+                    lambda state, dict_, row, **flags: "set instance-level lazy loader on %s" % \
+                                                      mapperutil.state_attribute_str(state,
+                                                                                     self.key)
+                )
+
+            return (new_execute, None)
+        else:
+            def new_execute(state, dict_, row, **flags):
+                # we are the primary manager for this attribute on this class - reset its
+                # per-instance attribute state, so that the class-level lazy loader is
+                # executed when next referenced on this instance.  this is needed in
+                # populate_existing() types of scenarios to reset any existing state.
+                state.reset(self.key, dict_)
+
+            if self._should_log_debug:
+                new_execute = self.debug_callable(new_execute, self.logger, None,
+                    lambda state, dict_, row, **flags: "set class-level lazy loader on %s" % \
+                                                      mapperutil.state_attribute_str(state,
+                                                                                     self.key)
+                )
+
+            return (new_execute, None)
+            
+    def _create_lazy_clause(cls, prop, reverse_direction=False):
+        binds = util.column_dict()
+        lookup = util.column_dict()
+        equated_columns = util.column_dict()
+
+        if reverse_direction and not prop.secondaryjoin:
+            for l, r in prop.local_remote_pairs:
+                _list = lookup.setdefault(r, [])
+                _list.append((r, l))
+                equated_columns[l] = r
+        else:
+            for l, r in prop.local_remote_pairs:
+                _list = lookup.setdefault(l, [])
+                _list.append((l, r))
+                equated_columns[r] = l
+                
+        def col_to_bind(col):
+            if col in lookup:
+                for tobind, equated in lookup[col]:
+                    if equated in binds:
+                        return None
+                if col not in binds:
+                    binds[col] = sql.bindparam(None, None, type_=col.type)
+                return binds[col]
+            return None
+        
+        lazywhere = prop.primaryjoin
+
+        if not prop.secondaryjoin or not reverse_direction:
+            lazywhere = visitors.replacement_traverse(lazywhere, {}, col_to_bind) 
+        
+        if prop.secondaryjoin is not None:
+            secondaryjoin = prop.secondaryjoin
+            if reverse_direction:
+                secondaryjoin = visitors.replacement_traverse(secondaryjoin, {}, col_to_bind)
+            lazywhere = sql.and_(lazywhere, secondaryjoin)
+    
+        bind_to_col = dict((binds[col].key, col) for col in binds)
+        
+        return (lazywhere, bind_to_col, equated_columns)
+    _create_lazy_clause = classmethod(_create_lazy_clause)
+    
+log.class_logger(LazyLoader)
+
+class LoadLazyAttribute(object):
+    """serializable loader object used by LazyLoader"""
+
+    def __init__(self, state, key):
+        self.state, self.key = state, key
+        
+    def __getstate__(self):
+        return (self.state, self.key)
+
+    def __setstate__(self, state):
+        self.state, self.key = state
+        
+    def __call__(self):
+        state = self.state
+
+        instance_mapper = mapper._state_mapper(state)
+        prop = instance_mapper.get_property(self.key)
+        strategy = prop._get_strategy(LazyLoader)
+        
+        if strategy._should_log_debug:
+            strategy.logger.debug("loading %s" % mapperutil.state_attribute_str(state, self.key))
+
+        session = sessionlib._state_session(state)
+        if session is None:
+            raise sa_exc.UnboundExecutionError(
+                "Parent instance %s is not bound to a Session; "
+                "lazy load operation of attribute '%s' cannot proceed" % 
+                (mapperutil.state_str(state), self.key)
+            )
+        
+        q = session.query(prop.mapper)._adapt_all_clauses()
+        
+        if state.load_path:
+            q = q._with_current_path(state.load_path + (self.key,))
+            
+        # if we have a simple primary key load, use mapper.get()
+        # to possibly save a DB round trip
+        if strategy.use_get:
+            ident = []
+            allnulls = True
+            for primary_key in prop.mapper.primary_key: 
+                val = instance_mapper._get_committed_state_attr_by_column(state, strategy._equated_columns[primary_key])
+                allnulls = allnulls and val is None
+                ident.append(val)
+            if allnulls:
+                return None
+            if state.load_options:
+                q = q._conditional_options(*state.load_options)
+            return q.get(ident)
+
+        if prop.order_by:
+            q = q.order_by(*util.to_list(prop.order_by))
+
+        if state.load_options:
+            q = q._conditional_options(*state.load_options)
+        q = q.filter(strategy.lazy_clause(state))
+
+        result = q.all()
+        if strategy.uselist:
+            return result
+        else:
+            if result:
+                return result[0]
+            else:
+                return None
+
+class EagerLoader(AbstractRelationLoader):
+    """Strategize a relation() that loads within the process of the parent object being selected."""
+    
+    def init(self):
+        super(EagerLoader, self).init()
+        self.join_depth = self.parent_property.join_depth
+
+    def init_class_attribute(self, mapper):
+        self.parent_property._get_strategy(LazyLoader).init_class_attribute(mapper)
+        
+    def setup_query(self, context, entity, path, adapter, column_collection=None, parentmapper=None, **kwargs):
+        """Add a left outer join to the statement thats being constructed."""
+
+        if not context.enable_eagerloads:
+            return
+            
+        path = path + (self.key,)
+
+        # check for user-defined eager alias
+        if ("user_defined_eager_row_processor", path) in context.attributes:
+            clauses = context.attributes[("user_defined_eager_row_processor", path)]
+            
+            adapter = entity._get_entity_clauses(context.query, context)
+            if adapter and clauses:
+                context.attributes[("user_defined_eager_row_processor", path)] = clauses = clauses.wrap(adapter)
+            elif adapter:
+                context.attributes[("user_defined_eager_row_processor", path)] = clauses = adapter
+            
+            add_to_collection = context.primary_columns
+            
+        else:
+            clauses = self._create_eager_join(context, entity, path, adapter, parentmapper)
+            if not clauses:
+                return
+
+            context.attributes[("eager_row_processor", path)] = clauses
+
+            add_to_collection = context.secondary_columns
+            
+        for value in self.mapper._iterate_polymorphic_properties():
+            value.setup(context, entity, path + (self.mapper.base_mapper,), clauses, parentmapper=self.mapper, column_collection=add_to_collection)
+    
+    def _create_eager_join(self, context, entity, path, adapter, parentmapper):
+        # check for join_depth or basic recursion,
+        # if the current path was not explicitly stated as 
+        # a desired "loaderstrategy" (i.e. via query.options())
+        if ("loaderstrategy", path) not in context.attributes:
+            if self.join_depth:
+                if len(path) / 2 > self.join_depth:
+                    return
+            else:
+                if self.mapper.base_mapper in path:
+                    return
+
+        if parentmapper is None:
+            localparent = entity.mapper
+        else:
+            localparent = parentmapper
+    
+        # whether or not the Query will wrap the selectable in a subquery,
+        # and then attach eager load joins to that (i.e., in the case of LIMIT/OFFSET etc.)
+        should_nest_selectable = context.query._should_nest_selectable
+
+        if entity in context.eager_joins:
+            entity_key, default_towrap = entity, entity.selectable
+
+        elif should_nest_selectable or not context.from_clause:
+            # if no from_clause, or a subquery is going to be generated, 
+            # store eager joins per _MappedEntity; Query._compile_context will 
+            # add them as separate selectables to the select(), or splice them together
+            # after the subquery is generated
+            entity_key, default_towrap = entity, entity.selectable
+        else:
+            index, clause = sql_util.find_join_source(context.from_clause, entity.selectable)
+            if clause:
+                # join to an existing FROM clause on the query.
+                # key it to its list index in the eager_joins dict.
+                # Query._compile_context will adapt as needed and append to the
+                # FROM clause of the select().
+                entity_key, default_towrap = index, clause
+            else:
+                # if no from_clause to join to,
+                # store eager joins per _MappedEntity
+                entity_key, default_towrap = entity, entity.selectable
+                
+        towrap = context.eager_joins.setdefault(entity_key, default_towrap)
+
+        # create AliasedClauses object to build up the eager query.  
+        clauses = mapperutil.ORMAdapter(mapperutil.AliasedClass(self.mapper), 
+                    equivalents=self.mapper._equivalent_columns, adapt_required=True)
+
+        join_to_left = False
+        if adapter:
+            if getattr(adapter, 'aliased_class', None):
+                onclause = getattr(adapter.aliased_class, self.key, self.parent_property)
+            else:
+                onclause = getattr(mapperutil.AliasedClass(self.parent, adapter.selectable), self.key, self.parent_property)
+                
+            if onclause is self.parent_property:
+                # TODO: this is a temporary hack to account for polymorphic eager loads where
+                # the eagerload is referencing via of_type().
+                join_to_left = True
+        else:
+            onclause = self.parent_property
+            
+        context.eager_joins[entity_key] = eagerjoin = mapperutil.outerjoin(towrap, clauses.aliased_class, onclause, join_to_left=join_to_left)
+        
+        # send a hint to the Query as to where it may "splice" this join
+        eagerjoin.stop_on = entity.selectable
+        
+        if not self.parent_property.secondary and context.query._should_nest_selectable and not parentmapper:
+            # for parentclause that is the non-eager end of the join,
+            # ensure all the parent cols in the primaryjoin are actually in the
+            # columns clause (i.e. are not deferred), so that aliasing applied by the Query propagates 
+            # those columns outward.  This has the effect of "undefering" those columns.
+            for col in sql_util.find_columns(self.parent_property.primaryjoin):
+                if localparent.mapped_table.c.contains_column(col):
+                    if adapter:
+                        col = adapter.columns[col]
+                    context.primary_columns.append(col)
+        
+        if self.parent_property.order_by:
+            context.eager_order_by += eagerjoin._target_adapter.copy_and_process(util.to_list(self.parent_property.order_by))
+            
+        return clauses
+        
+    def _create_eager_adapter(self, context, row, adapter, path):
+        if ("user_defined_eager_row_processor", path) in context.attributes:
+            decorator = context.attributes[("user_defined_eager_row_processor", path)]
+            # user defined eagerloads are part of the "primary" portion of the load.
+            # the adapters applied to the Query should be honored.
+            if context.adapter and decorator:
+                decorator = decorator.wrap(context.adapter)
+            elif context.adapter:
+                decorator = context.adapter
+        elif ("eager_row_processor", path) in context.attributes:
+            decorator = context.attributes[("eager_row_processor", path)]
+        else:
+            if self._should_log_debug:
+                self.logger.debug("Could not locate aliased clauses for key: " + str(path))
+            return False
+
+        try:
+            identity_key = self.mapper.identity_key_from_row(row, decorator)
+            return decorator
+        except KeyError, k:
+            # no identity key - dont return a row processor, will cause a degrade to lazy
+            if self._should_log_debug:
+                self.logger.debug("could not locate identity key from row; missing column '%s'" % k)
+            return False
+
+    def create_row_processor(self, context, path, mapper, row, adapter):
+        path = path + (self.key,)
+            
+        eager_adapter = self._create_eager_adapter(context, row, adapter, path)
+        
+        if eager_adapter is not False:
+            key = self.key
+            _instance = self.mapper._instance_processor(context, path + (self.mapper.base_mapper,), eager_adapter)
+            
+            if not self.uselist:
+                def execute(state, dict_, row, isnew, **flags):
+                    if isnew:
+                        # set a scalar object instance directly on the
+                        # parent object, bypassing InstrumentedAttribute
+                        # event handlers.
+                        dict_[key] = _instance(row, None)
+                    else:
+                        # call _instance on the row, even though the object has been created,
+                        # so that we further descend into properties
+                        _instance(row, None)
+            else:
+                def execute(state, dict_, row, isnew, **flags):
+                    if isnew or (state, key) not in context.attributes:
+                        # appender_key can be absent from context.attributes with isnew=False
+                        # when self-referential eager loading is used; the same instance may be present
+                        # in two distinct sets of result columns
+
+                        collection = attributes.init_state_collection(state, dict_, key)
+                        appender = util.UniqueAppender(collection, 'append_without_event')
+
+                        context.attributes[(state, key)] = appender
+
+                    result_list = context.attributes[(state, key)]
+                    
+                    _instance(row, result_list)
+
+            if self._should_log_debug:
+                execute = self.debug_callable(execute, self.logger, 
+                    "%s returning eager instance loader" % self,
+                    lambda state, dict_, row, isnew, **flags: "%s eagerload %s" % \
+                                                  (self,
+                                                   self.uselist and "scalar attribute"
+                                                   or "collection")
+                )
+
+            return (execute, execute)
+        else:
+            if self._should_log_debug:
+                self.logger.debug("%s degrading to lazy loader" % self)
+            return self.parent_property._get_strategy(LazyLoader).create_row_processor(context, path, mapper, row, adapter)
+
+log.class_logger(EagerLoader)
+
+class EagerLazyOption(StrategizedOption):
+
+    def __init__(self, key, lazy=True, chained=False, mapper=None, propagate_to_loaders=True):
+        super(EagerLazyOption, self).__init__(key, mapper)
+        self.lazy = lazy
+        self.chained = chained
+        self.propagate_to_loaders = propagate_to_loaders
+        
+    def is_chained(self):
+        return not self.lazy and self.chained
+        
+    def get_strategy_class(self):
+        if self.lazy:
+            return LazyLoader
+        elif self.lazy is False:
+            return EagerLoader
+        elif self.lazy is None:
+            return NoLoader
+
+class LoadEagerFromAliasOption(PropertyOption):
+    
+    def __init__(self, key, alias=None):
+        super(LoadEagerFromAliasOption, self).__init__(key)
+        if alias:
+            if not isinstance(alias, basestring):
+                m, alias, is_aliased_class = mapperutil._entity_info(alias)
+        self.alias = alias
+
+    def process_query_property(self, query, paths, mappers):
+        if self.alias:
+            if isinstance(self.alias, basestring):
+                mapper = mappers[-1]
+                (root_mapper, propname) = paths[-1][-2:]
+                prop = mapper.get_property(propname, resolve_synonyms=True)
+                self.alias = prop.target.alias(self.alias)
+            query._attributes[("user_defined_eager_row_processor", paths[-1])] = sql_util.ColumnAdapter(self.alias)
+        else:
+            (root_mapper, propname) = paths[-1][-2:]
+            mapper = mappers[-1]
+            prop = mapper.get_property(propname, resolve_synonyms=True)
+            adapter = query._polymorphic_adapters.get(prop.mapper, None)
+            query._attributes[("user_defined_eager_row_processor", paths[-1])] = adapter
+
+class _SingleParentValidator(interfaces.AttributeExtension):
+    def __init__(self, prop):
+        self.prop = prop
+
+    def _do_check(self, state, value, oldvalue, initiator):
+        if value is not None:
+            hasparent = initiator.hasparent(attributes.instance_state(value))
+            if hasparent and oldvalue is not value: 
+                raise sa_exc.InvalidRequestError("Instance %s is already associated with an instance "
+                    "of %s via its %s attribute, and is only allowed a single parent." % 
+                    (mapperutil.instance_str(value), state.class_, self.prop)
+                )
+        return value
+        
+    def append(self, state, value, initiator):
+        return self._do_check(state, value, None, initiator)
+
+    def set(self, state, value, oldvalue, initiator):
+        return self._do_check(state, value, oldvalue, initiator)
+
+
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/orm/sync.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/orm/sync.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/orm/sync.py (revision 3)
@@ -0,0 +1,73 @@
+# mapper/sync.py
+# Copyright (C) 2005, 2006, 2007, 2008, 2009 Michael Bayer mike_mp@zzzcomputing.com
+#
+# This module is part of SQLAlchemy and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+"""private module containing functions used for copying data between instances
+based on join conditions.
+"""
+
+from sqlalchemy.orm import exc, util as mapperutil
+
+def populate(source, source_mapper, dest, dest_mapper, synchronize_pairs):
+    for l, r in synchronize_pairs:
+        try:
+            value = source_mapper._get_state_attr_by_column(source, l)
+        except exc.UnmappedColumnError:
+            _raise_col_to_prop(False, source_mapper, l, dest_mapper, r)
+
+        try:
+            dest_mapper._set_state_attr_by_column(dest, r, value)
+        except exc.UnmappedColumnError:
+            _raise_col_to_prop(True, source_mapper, l, dest_mapper, r)
+
+def clear(dest, dest_mapper, synchronize_pairs):
+    for l, r in synchronize_pairs:
+        if r.primary_key:
+            raise AssertionError("Dependency rule tried to blank-out primary key column '%s' on instance '%s'" % (r, mapperutil.state_str(dest)))
+        try:
+            dest_mapper._set_state_attr_by_column(dest, r, None)
+        except exc.UnmappedColumnError:
+            _raise_col_to_prop(True, None, l, dest_mapper, r)
+
+def update(source, source_mapper, dest, old_prefix, synchronize_pairs):
+    for l, r in synchronize_pairs:
+        try:
+            oldvalue = source_mapper._get_committed_attr_by_column(source.obj(), l)
+            value = source_mapper._get_state_attr_by_column(source, l)
+        except exc.UnmappedColumnError:
+            _raise_col_to_prop(False, source_mapper, l, None, r)
+        dest[r.key] = value
+        dest[old_prefix + r.key] = oldvalue
+
+def populate_dict(source, source_mapper, dict_, synchronize_pairs):
+    for l, r in synchronize_pairs:
+        try:
+            value = source_mapper._get_state_attr_by_column(source, l)
+        except exc.UnmappedColumnError:
+            _raise_col_to_prop(False, source_mapper, l, None, r)
+
+        dict_[r.key] = value
+
+def source_modified(uowcommit, source, source_mapper, synchronize_pairs):
+    """return true if the source object has changes from an old to a new value on the given
+    synchronize pairs
+    
+    """
+    for l, r in synchronize_pairs:
+        try:
+            prop = source_mapper._get_col_to_prop(l)
+        except exc.UnmappedColumnError:
+            _raise_col_to_prop(False, source_mapper, l, None, r)
+        history = uowcommit.get_attribute_history(source, prop.key, passive=True)
+        if len(history.deleted):
+            return True
+    else:
+        return False
+
+def _raise_col_to_prop(isdest, source_mapper, source_column, dest_mapper, dest_column):
+    if isdest:
+        raise exc.UnmappedColumnError("Can't execute sync rule for destination column '%s'; mapper '%s' does not map this column.  Try using an explicit `foreign_keys` collection which does not include this column (or use a viewonly=True relation)." % (dest_column, source_mapper))
+    else:
+        raise exc.UnmappedColumnError("Can't execute sync rule for source column '%s'; mapper '%s' does not map this column.  Try using an explicit `foreign_keys` collection which does not include destination column '%s' (or use a viewonly=True relation)." % (source_column, source_mapper, dest_column))
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/orm/util.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/orm/util.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/orm/util.py (revision 3)
@@ -0,0 +1,638 @@
+# mapper/util.py
+# Copyright (C) 2005, 2006, 2007, 2008, 2009 Michael Bayer mike_mp@zzzcomputing.com
+#
+# This module is part of SQLAlchemy and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+import sqlalchemy.exceptions as sa_exc
+from sqlalchemy import sql, util
+from sqlalchemy.sql import expression, util as sql_util, operators
+from sqlalchemy.orm.interfaces import MapperExtension, EXT_CONTINUE, PropComparator, MapperProperty, AttributeExtension
+from sqlalchemy.orm import attributes, exc
+
+
+all_cascades = frozenset(("delete", "delete-orphan", "all", "merge",
+                          "expunge", "save-update", "refresh-expire",
+                          "none"))
+
+_INSTRUMENTOR = ('mapper', 'instrumentor')
+
+class CascadeOptions(object):
+    """Keeps track of the options sent to relation().cascade"""
+
+    def __init__(self, arg=""):
+        if not arg:
+            values = set()
+        else:
+            values = set(c.strip() for c in arg.split(','))
+        self.delete_orphan = "delete-orphan" in values
+        self.delete = "delete" in values or "all" in values
+        self.save_update = "save-update" in values or "all" in values
+        self.merge = "merge" in values or "all" in values
+        self.expunge = "expunge" in values or "all" in values
+        self.refresh_expire = "refresh-expire" in values or "all" in values
+
+        if self.delete_orphan and not self.delete:
+            util.warn("The 'delete-orphan' cascade option requires "
+                        "'delete'.  This will raise an error in 0.6.")
+
+        for x in values:
+            if x not in all_cascades:
+                raise sa_exc.ArgumentError("Invalid cascade option '%s'" % x)
+
+    def __contains__(self, item):
+        return getattr(self, item.replace("-", "_"), False)
+
+    def __repr__(self):
+        return "CascadeOptions(%s)" % repr(",".join(
+            [x for x in ['delete', 'save_update', 'merge', 'expunge',
+                         'delete_orphan', 'refresh-expire']
+             if getattr(self, x, False) is True]))
+
+
+class Validator(AttributeExtension):
+    """Runs a validation method on an attribute value to be set or appended.
+
+    The Validator class is used by the :func:`~sqlalchemy.orm.validates`
+    decorator, and direct access is usually not needed.
+
+    """
+
+    def __init__(self, key, validator):
+        """Construct a new Validator.
+
+            key - name of the attribute to be validated;
+            will be passed as the second argument to
+            the validation method (the first is the object instance itself).
+
+            validator - an function or instance method which accepts
+            three arguments; an instance (usually just 'self' for a method),
+            the key name of the attribute, and the value.  The function should
+            return the same value given, unless it wishes to modify it.
+
+        """
+        self.key = key
+        self.validator = validator
+
+    def append(self, state, value, initiator):
+        return self.validator(state.obj(), self.key, value)
+
+    def set(self, state, value, oldvalue, initiator):
+        return self.validator(state.obj(), self.key, value)
+
+def polymorphic_union(table_map, typecolname, aliasname='p_union'):
+    """Create a ``UNION`` statement used by a polymorphic mapper.
+
+    See  :ref:`concrete_inheritance` for an example of how
+    this is used.
+    """
+
+    colnames = set()
+    colnamemaps = {}
+    types = {}
+    for key in table_map.keys():
+        table = table_map[key]
+
+        # mysql doesnt like selecting from a select; make it an alias of the select
+        if isinstance(table, sql.Select):
+            table = table.alias()
+            table_map[key] = table
+
+        m = {}
+        for c in table.c:
+            colnames.add(c.key)
+            m[c.key] = c
+            types[c.key] = c.type
+        colnamemaps[table] = m
+
+    def col(name, table):
+        try:
+            return colnamemaps[table][name]
+        except KeyError:
+            return sql.cast(sql.null(), types[name]).label(name)
+
+    result = []
+    for type, table in table_map.iteritems():
+        if typecolname is not None:
+            result.append(sql.select([col(name, table) for name in colnames] +
+                                     [sql.literal_column("'%s'" % type).label(typecolname)],
+                                     from_obj=[table]))
+        else:
+            result.append(sql.select([col(name, table) for name in colnames],
+                                     from_obj=[table]))
+    return sql.union_all(*result).alias(aliasname)
+
+def identity_key(*args, **kwargs):
+    """Get an identity key.
+
+    Valid call signatures:
+
+    * ``identity_key(class, ident)``
+
+      class
+          mapped class (must be a positional argument)
+
+      ident
+          primary key, if the key is composite this is a tuple
+
+
+    * ``identity_key(instance=instance)``
+
+      instance
+          object instance (must be given as a keyword arg)
+
+    * ``identity_key(class, row=row)``
+
+      class
+          mapped class (must be a positional argument)
+
+      row
+          result proxy row (must be given as a keyword arg)
+
+    """
+    if args:
+        if len(args) == 1:
+            class_ = args[0]
+            try:
+                row = kwargs.pop("row")
+            except KeyError:
+                ident = kwargs.pop("ident")
+        elif len(args) == 2:
+            class_, ident = args
+        elif len(args) == 3:
+            class_, ident = args
+        else:
+            raise sa_exc.ArgumentError("expected up to three "
+                "positional arguments, got %s" % len(args))
+        if kwargs:
+            raise sa_exc.ArgumentError("unknown keyword arguments: %s"
+                % ", ".join(kwargs.keys()))
+        mapper = class_mapper(class_)
+        if "ident" in locals():
+            return mapper.identity_key_from_primary_key(ident)
+        return mapper.identity_key_from_row(row)
+    instance = kwargs.pop("instance")
+    if kwargs:
+        raise sa_exc.ArgumentError("unknown keyword arguments: %s"
+            % ", ".join(kwargs.keys()))
+    mapper = object_mapper(instance)
+    return mapper.identity_key_from_instance(instance)
+
+class ExtensionCarrier(dict):
+    """Fronts an ordered collection of MapperExtension objects.
+
+    Bundles multiple MapperExtensions into a unified callable unit,
+    encapsulating ordering, looping and EXT_CONTINUE logic.  The
+    ExtensionCarrier implements the MapperExtension interface, e.g.::
+
+      carrier.after_insert(...args...)
+
+    The dictionary interface provides containment for implemented
+    method names mapped to a callable which executes that method
+    for participating extensions.
+
+    """
+
+    interface = set(method for method in dir(MapperExtension)
+                    if not method.startswith('_'))
+
+    def __init__(self, extensions=None):
+        self._extensions = []
+        for ext in extensions or ():
+            self.append(ext)
+
+    def copy(self):
+        return ExtensionCarrier(self._extensions)
+
+    def push(self, extension):
+        """Insert a MapperExtension at the beginning of the collection."""
+        self._register(extension)
+        self._extensions.insert(0, extension)
+
+    def append(self, extension):
+        """Append a MapperExtension at the end of the collection."""
+        self._register(extension)
+        self._extensions.append(extension)
+
+    def __iter__(self):
+        """Iterate over MapperExtensions in the collection."""
+        return iter(self._extensions)
+
+    def _register(self, extension):
+        """Register callable fronts for overridden interface methods."""
+
+        for method in self.interface.difference(self):
+            impl = getattr(extension, method, None)
+            if impl and impl is not getattr(MapperExtension, method):
+                self[method] = self._create_do(method)
+
+    def _create_do(self, method):
+        """Return a closure that loops over impls of the named method."""
+
+        def _do(*args, **kwargs):
+            for ext in self._extensions:
+                ret = getattr(ext, method)(*args, **kwargs)
+                if ret is not EXT_CONTINUE:
+                    return ret
+            else:
+                return EXT_CONTINUE
+        _do.__name__ = method
+        return _do
+
+    @staticmethod
+    def _pass(*args, **kwargs):
+        return EXT_CONTINUE
+
+    def __getattr__(self, key):
+        """Delegate MapperExtension methods to bundled fronts."""
+
+        if key not in self.interface:
+            raise AttributeError(key)
+        return self.get(key, self._pass)
+
+class ORMAdapter(sql_util.ColumnAdapter):
+    """Extends ColumnAdapter to accept ORM entities.
+
+    The selectable is extracted from the given entity,
+    and the AliasedClass if any is referenced.
+
+    """
+    def __init__(self, entity, equivalents=None, chain_to=None, adapt_required=False):
+        self.mapper, selectable, is_aliased_class = _entity_info(entity)
+        if is_aliased_class:
+            self.aliased_class = entity
+        else:
+            self.aliased_class = None
+        sql_util.ColumnAdapter.__init__(self, selectable, equivalents, chain_to, adapt_required=adapt_required)
+
+    def replace(self, elem):
+        entity = elem._annotations.get('parentmapper', None)
+        if not entity or entity.isa(self.mapper):
+            return sql_util.ColumnAdapter.replace(self, elem)
+        else:
+            return None
+
+class AliasedClass(object):
+    """Represents an 'alias'ed form of a mapped class for usage with Query.
+
+    The ORM equivalent of a :class:`~sqlalchemy.sql.expression.Alias`
+    object, this object mimics the mapped class using a
+    __getattr__ scheme and maintains a reference to a
+    real Alias object.   It indicates to Query that the
+    selectable produced for this class should be aliased,
+    and also adapts PropComparators produced by the class'
+    InstrumentedAttributes so that they adapt the
+    "local" side of SQL expressions against the alias.
+
+    """
+    def __init__(self, cls, alias=None, name=None):
+        self.__mapper = _class_to_mapper(cls)
+        self.__target = self.__mapper.class_
+        alias = alias or self.__mapper._with_polymorphic_selectable.alias()
+        self.__adapter = sql_util.ClauseAdapter(alias, equivalents=self.__mapper._equivalent_columns)
+        self.__alias = alias
+        # used to assign a name to the RowTuple object
+        # returned by Query.
+        self._sa_label_name = name
+        self.__name__ = 'AliasedClass_' + str(self.__target)
+
+    def __getstate__(self):
+        return {'mapper':self.__mapper, 'alias':self.__alias, 'name':self._sa_label_name}
+
+    def __setstate__(self, state):
+        self.__mapper = state['mapper']
+        self.__target = self.__mapper.class_
+        alias = state['alias']
+        self.__adapter = sql_util.ClauseAdapter(alias, equivalents=self.__mapper._equivalent_columns)
+        self.__alias = alias
+        name = state['name']
+        self._sa_label_name = name
+        self.__name__ = 'AliasedClass_' + str(self.__target)
+
+    def __adapt_element(self, elem):
+        return self.__adapter.traverse(elem)._annotate({'parententity': self, 'parentmapper':self.__mapper})
+
+    def __adapt_prop(self, prop):
+        existing = getattr(self.__target, prop.key)
+        comparator = existing.comparator.adapted(self.__adapt_element)
+
+        queryattr = attributes.QueryableAttribute(prop.key,
+            impl=existing.impl, parententity=self, comparator=comparator)
+        setattr(self, prop.key, queryattr)
+        return queryattr
+
+    def __getattr__(self, key):
+        prop = self.__mapper._get_property(key, raiseerr=False)
+        if prop:
+            return self.__adapt_prop(prop)
+
+        for base in self.__target.__mro__:
+            try:
+                attr = object.__getattribute__(base, key)
+            except AttributeError:
+                continue
+            else:
+                break
+        else:
+            raise AttributeError(key)
+
+        if hasattr(attr, 'func_code'):
+            is_method = getattr(self.__target, key, None)
+            if is_method and is_method.im_self is not None:
+                return util.types.MethodType(attr.im_func, self, self)
+            else:
+                return None
+        elif hasattr(attr, '__get__'):
+            return attr.__get__(None, self)
+        else:
+            return attr
+
+    def __repr__(self):
+        return '<AliasedClass at 0x%x; %s>' % (
+            id(self), self.__target.__name__)
+
+def _orm_annotate(element, exclude=None):
+    """Deep copy the given ClauseElement, annotating each element with the "_orm_adapt" flag.
+
+    Elements within the exclude collection will be cloned but not annotated.
+
+    """
+    return sql_util._deep_annotate(element, {'_orm_adapt':True}, exclude)
+
+_orm_deannotate = sql_util._deep_deannotate
+
+class _ORMJoin(expression.Join):
+    """Extend Join to support ORM constructs as input."""
+
+    __visit_name__ = expression.Join.__visit_name__
+
+    def __init__(self, left, right, onclause=None, isouter=False, join_to_left=True):
+        adapt_from = None
+
+        if hasattr(left, '_orm_mappers'):
+            left_mapper = left._orm_mappers[1]
+            if join_to_left:
+                adapt_from = left.right
+        else:
+            left_mapper, left, left_is_aliased = _entity_info(left)
+            if join_to_left and (left_is_aliased or not left_mapper):
+                adapt_from = left
+
+        right_mapper, right, right_is_aliased = _entity_info(right)
+        if right_is_aliased:
+            adapt_to = right
+        else:
+            adapt_to = None
+
+        if left_mapper or right_mapper:
+            self._orm_mappers = (left_mapper, right_mapper)
+
+            if isinstance(onclause, basestring):
+                prop = left_mapper.get_property(onclause)
+            elif isinstance(onclause, attributes.QueryableAttribute):
+                if not adapt_from:
+                    adapt_from = onclause.__clause_element__()
+                prop = onclause.property
+            elif isinstance(onclause, MapperProperty):
+                prop = onclause
+            else:
+                prop = None
+
+            if prop:
+                pj, sj, source, dest, secondary, target_adapter = prop._create_joins(
+                                source_selectable=adapt_from,
+                                dest_selectable=adapt_to,
+                                source_polymorphic=True,
+                                dest_polymorphic=True,
+                                of_type=right_mapper)
+
+                if sj:
+                    left = sql.join(left, secondary, pj, isouter)
+                    onclause = sj
+                else:
+                    onclause = pj
+                self._target_adapter = target_adapter
+
+        expression.Join.__init__(self, left, right, onclause, isouter)
+
+    def join(self, right, onclause=None, isouter=False, join_to_left=True):
+        return _ORMJoin(self, right, onclause, isouter, join_to_left)
+
+    def outerjoin(self, right, onclause=None, join_to_left=True):
+        return _ORMJoin(self, right, onclause, True, join_to_left)
+
+def join(left, right, onclause=None, isouter=False, join_to_left=True):
+    """Produce an inner join between left and right clauses.
+
+    In addition to the interface provided by
+    :func:`~sqlalchemy.sql.expression.join()`, left and right may be mapped
+    classes or AliasedClass instances. The onclause may be a
+    string name of a relation(), or a class-bound descriptor
+    representing a relation.
+
+    join_to_left indicates to attempt aliasing the ON clause,
+    in whatever form it is passed, to the selectable
+    passed as the left side.  If False, the onclause
+    is used as is.
+
+    """
+    return _ORMJoin(left, right, onclause, isouter, join_to_left)
+
+def outerjoin(left, right, onclause=None, join_to_left=True):
+    """Produce a left outer join between left and right clauses.
+
+    In addition to the interface provided by
+    :func:`~sqlalchemy.sql.expression.outerjoin()`, left and right may be mapped
+    classes or AliasedClass instances. The onclause may be a
+    string name of a relation(), or a class-bound descriptor
+    representing a relation.
+
+    """
+    return _ORMJoin(left, right, onclause, True, join_to_left)
+
+def with_parent(instance, prop):
+    """Return criterion which selects instances with a given parent.
+
+    instance
+      a parent instance, which should be persistent or detached.
+
+    property
+      a class-attached descriptor, MapperProperty or string property name
+      attached to the parent instance.
+
+    \**kwargs
+      all extra keyword arguments are propagated to the constructor of
+      Query.
+
+    """
+    if isinstance(prop, basestring):
+        mapper = object_mapper(instance)
+        prop = mapper.get_property(prop, resolve_synonyms=True)
+    elif isinstance(prop, attributes.QueryableAttribute):
+        prop = prop.property
+
+    return prop.compare(operators.eq, instance, value_is_parent=True)
+
+
+def _entity_info(entity, compile=True):
+    """Return mapping information given a class, mapper, or AliasedClass.
+
+    Returns 3-tuple of: mapper, mapped selectable, boolean indicating if this
+    is an aliased() construct.
+
+    If the given entity is not a mapper, mapped class, or aliased construct,
+    returns None, the entity, False.  This is typically used to allow
+    unmapped selectables through.
+
+    """
+    if isinstance(entity, AliasedClass):
+        return entity._AliasedClass__mapper, entity._AliasedClass__alias, True
+    elif _is_mapped_class(entity):
+        if isinstance(entity, type):
+            mapper = class_mapper(entity, compile)
+        else:
+            if compile:
+                mapper = entity.compile()
+            else:
+                mapper = entity
+        return mapper, mapper._with_polymorphic_selectable, False
+    else:
+        return None, entity, False
+
+def _entity_descriptor(entity, key):
+    """Return attribute/property information given an entity and string name.
+
+    Returns a 2-tuple representing InstrumentedAttribute/MapperProperty.
+
+    """
+    if isinstance(entity, AliasedClass):
+        desc = getattr(entity, key)
+        return desc, desc.property
+    elif isinstance(entity, type):
+        desc = attributes.manager_of_class(entity)[key]
+        return desc, desc.property
+    else:
+        desc = entity.class_manager[key]
+        return desc, desc.property
+
+def _orm_columns(entity):
+    mapper, selectable, is_aliased_class = _entity_info(entity)
+    if isinstance(selectable, expression.Selectable):
+        return [c for c in selectable.c]
+    else:
+        return [selectable]
+
+def _orm_selectable(entity):
+    mapper, selectable, is_aliased_class = _entity_info(entity)
+    return selectable
+
+def _is_aliased_class(entity):
+    return isinstance(entity, AliasedClass)
+
+def _state_mapper(state):
+    return state.manager.mapper
+
+def object_mapper(instance):
+    """Given an object, return the primary Mapper associated with the object instance.
+
+    Raises UnmappedInstanceError if no mapping is configured.
+
+    """
+    try:
+        state = attributes.instance_state(instance)
+        if not state.manager.mapper:
+            raise exc.UnmappedInstanceError(instance)
+        return state.manager.mapper
+    except exc.NO_STATE:
+        raise exc.UnmappedInstanceError(instance)
+
+def class_mapper(class_, compile=True):
+    """Given a class, return the primary Mapper associated with the key.
+
+    Raises UnmappedClassError if no mapping is configured.
+
+    """
+    try:
+        class_manager = attributes.manager_of_class(class_)
+        mapper = class_manager.mapper
+
+        # HACK until [ticket:1142] is complete
+        if mapper is None:
+            raise AttributeError
+
+    except exc.NO_STATE:
+        raise exc.UnmappedClassError(class_)
+
+    if compile:
+        mapper = mapper.compile()
+    return mapper
+
+def _class_to_mapper(class_or_mapper, compile=True):
+    if _is_aliased_class(class_or_mapper):
+        return class_or_mapper._AliasedClass__mapper
+    elif isinstance(class_or_mapper, type):
+        return class_mapper(class_or_mapper, compile=compile)
+    elif hasattr(class_or_mapper, 'compile'):
+        if compile:
+            return class_or_mapper.compile()
+        else:
+            return class_or_mapper
+    else:
+        raise exc.UnmappedClassError(class_or_mapper)
+
+def has_identity(object):
+    state = attributes.instance_state(object)
+    return _state_has_identity(state)
+
+def _state_has_identity(state):
+    return bool(state.key)
+
+def _is_mapped_class(cls):
+    from sqlalchemy.orm import mapperlib as mapper
+    if isinstance(cls, (AliasedClass, mapper.Mapper)):
+        return True
+    if isinstance(cls, expression.ClauseElement):
+        return False
+    if isinstance(cls, type):
+        manager = attributes.manager_of_class(cls)
+        return manager and _INSTRUMENTOR in manager.info
+    return False
+
+def instance_str(instance):
+    """Return a string describing an instance."""
+
+    return state_str(attributes.instance_state(instance))
+
+def state_str(state):
+    """Return a string describing an instance via its InstanceState."""
+
+    if state is None:
+        return "None"
+    else:
+        return '<%s at 0x%x>' % (state.class_.__name__, id(state.obj()))
+
+def attribute_str(instance, attribute):
+    return instance_str(instance) + "." + attribute
+
+def state_attribute_str(state, attribute):
+    return state_str(state) + "." + attribute
+
+def identity_equal(a, b):
+    if a is b:
+        return True
+    if a is None or b is None:
+        return False
+    try:
+        state_a = attributes.instance_state(a)
+        state_b = attributes.instance_state(b)
+    except exc.NO_STATE:
+        return False
+    if state_a.key is None or state_b.key is None:
+        return False
+    return state_a.key == state_b.key
+
+
+# TODO: Avoid circular import.
+attributes.identity_equal = identity_equal
+attributes._is_aliased_class = _is_aliased_class
+attributes._entity_info = _entity_info
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/orm/dependency.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/orm/dependency.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/orm/dependency.py (revision 3)
@@ -0,0 +1,557 @@
+# orm/dependency.py
+# Copyright (C) 2005, 2006, 2007, 2008, 2009 Michael Bayer mike_mp@zzzcomputing.com
+#
+# This module is part of SQLAlchemy and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+"""Relationship dependencies.
+
+Bridges the ``PropertyLoader`` (i.e. a ``relation()``) and the
+``UOWTransaction`` together to allow processing of relation()-based
+dependencies at flush time.
+
+"""
+
+from sqlalchemy import sql, util
+import sqlalchemy.exceptions as sa_exc
+from sqlalchemy.orm import attributes, exc, sync
+from sqlalchemy.orm.interfaces import ONETOMANY, MANYTOONE, MANYTOMANY
+
+
+def create_dependency_processor(prop):
+    types = {
+        ONETOMANY : OneToManyDP,
+        MANYTOONE: ManyToOneDP,
+        MANYTOMANY : ManyToManyDP,
+    }
+    return types[prop.direction](prop)
+
+class DependencyProcessor(object):
+    no_dependencies = False
+
+    def __init__(self, prop):
+        self.prop = prop
+        self.cascade = prop.cascade
+        self.mapper = prop.mapper
+        self.parent = prop.parent
+        self.secondary = prop.secondary
+        self.direction = prop.direction
+        self.post_update = prop.post_update
+        self.passive_deletes = prop.passive_deletes
+        self.passive_updates = prop.passive_updates
+        self.enable_typechecks = prop.enable_typechecks
+        self.key = prop.key
+        self.dependency_marker = MapperStub(self.parent, self.mapper, self.key)
+        if not self.prop.synchronize_pairs:
+            raise sa_exc.ArgumentError("Can't build a DependencyProcessor for relation %s.  "
+                    "No target attributes to populate between parent and child are present" % self.prop)
+
+    def _get_instrumented_attribute(self):
+        """Return the ``InstrumentedAttribute`` handled by this
+        ``DependencyProecssor``.
+        
+        """
+        return self.parent.class_manager.get_impl(self.key)
+
+    def hasparent(self, state):
+        """return True if the given object instance has a parent,
+        according to the ``InstrumentedAttribute`` handled by this ``DependencyProcessor``.
+        
+        """
+        # TODO: use correct API for this
+        return self._get_instrumented_attribute().hasparent(state)
+
+    def register_dependencies(self, uowcommit):
+        """Tell a ``UOWTransaction`` what mappers are dependent on
+        which, with regards to the two or three mappers handled by
+        this ``DependencyProcessor``.
+
+        """
+
+        raise NotImplementedError()
+
+    def register_processors(self, uowcommit):
+        """Tell a ``UOWTransaction`` about this object as a processor,
+        which will be executed after that mapper's objects have been
+        saved or before they've been deleted.  The process operation
+        manages attributes and dependent operations between two mappers.
+        
+        """
+        raise NotImplementedError()
+        
+    def whose_dependent_on_who(self, state1, state2):
+        """Given an object pair assuming `obj2` is a child of `obj1`,
+        return a tuple with the dependent object second, or None if
+        there is no dependency.
+
+        """
+        if state1 is state2:
+            return None
+        elif self.direction == ONETOMANY:
+            return (state1, state2)
+        else:
+            return (state2, state1)
+
+    def process_dependencies(self, task, deplist, uowcommit, delete = False):
+        """This method is called during a flush operation to
+        synchronize data between a parent and child object.
+
+        It is called within the context of the various mappers and
+        sometimes individual objects sorted according to their
+        insert/update/delete order (topological sort).
+
+        """
+        raise NotImplementedError()
+
+    def preprocess_dependencies(self, task, deplist, uowcommit, delete = False):
+        """Used before the flushes' topological sort to traverse
+        through related objects and ensure every instance which will
+        require save/update/delete is properly added to the
+        UOWTransaction.
+
+        """
+        raise NotImplementedError()
+
+    def _verify_canload(self, state):
+        if state is not None and not self.mapper._canload(state, allow_subtypes=not self.enable_typechecks):
+            if self.mapper._canload(state, allow_subtypes=True):
+                raise exc.FlushError("Attempting to flush an item of type %s on collection '%s', "
+                                "which is not the expected type %s.  Configure mapper '%s' to load this "
+                                "subtype polymorphically, or set enable_typechecks=False to allow subtypes.  "
+                                "Mismatched typeloading may cause bi-directional relationships (backrefs) "
+                                "to not function properly." % (state.class_, self.prop, self.mapper.class_, self.mapper))
+            else:
+                raise exc.FlushError("Attempting to flush an item of type %s on collection '%s', "
+                                "whose mapper does not inherit from that of %s." % (state.class_, self.prop, self.mapper.class_))
+            
+    def _synchronize(self, state, child, associationrow, clearkeys, uowcommit):
+        """Called during a flush to synchronize primary key identifier
+        values between a parent/child object, as well as to an
+        associationrow in the case of many-to-many.
+        
+        """
+        raise NotImplementedError()
+
+    def _check_reverse_action(self, uowcommit, parent, child, action):
+        """Determine if an action has been performed by the 'reverse' property of this property.
+        
+        this is used to ensure that only one side of a bidirectional relation
+        issues a certain operation for a parent/child pair.
+        
+        """
+        for r in self.prop._reverse_property:
+            if not r.viewonly and (r._dependency_processor, action, parent, child) in uowcommit.attributes:
+                return True
+        return False
+    
+    def _performed_action(self, uowcommit, parent, child, action):
+        """Establish that an action has been performed for a certain parent/child pair.
+        
+        Used only for actions that are sensitive to bidirectional double-action,
+        i.e. manytomany, post_update.
+        
+        """
+        uowcommit.attributes[(self, action, parent, child)] = True
+        
+    def _conditional_post_update(self, state, uowcommit, related):
+        """Execute a post_update call.
+
+        For relations that contain the post_update flag, an additional
+        ``UPDATE`` statement may be associated after an ``INSERT`` or
+        before a ``DELETE`` in order to resolve circular row
+        dependencies.
+
+        This method will check for the post_update flag being set on a
+        particular relationship, and given a target object and list of
+        one or more related objects, and execute the ``UPDATE`` if the
+        given related object list contains ``INSERT``s or ``DELETE``s.
+        
+        """
+        if state is not None and self.post_update:
+            for x in related:
+                if x is not None and not self._check_reverse_action(uowcommit, x, state, "postupdate"):
+                    uowcommit.register_object(state, postupdate=True, post_update_cols=[r for l, r in self.prop.synchronize_pairs])
+                    self._performed_action(uowcommit, x, state, "postupdate")
+                    break
+
+    def _pks_changed(self, uowcommit, state):
+        raise NotImplementedError()
+
+    def __repr__(self):
+        return "%s(%s)" % (self.__class__.__name__, self.prop)
+
+class OneToManyDP(DependencyProcessor):
+    def register_dependencies(self, uowcommit):
+        if self.post_update:
+            uowcommit.register_dependency(self.mapper, self.dependency_marker)
+            uowcommit.register_dependency(self.parent, self.dependency_marker)
+        else:
+            uowcommit.register_dependency(self.parent, self.mapper)
+
+    def register_processors(self, uowcommit):
+        if self.post_update:
+            uowcommit.register_processor(self.dependency_marker, self, self.parent)
+        else:
+            uowcommit.register_processor(self.parent, self, self.parent)
+
+    def process_dependencies(self, task, deplist, uowcommit, delete = False):
+        if delete:
+            # head object is being deleted, and we manage its list of child objects
+            # the child objects have to have their foreign key to the parent set to NULL
+            # this phase can be called safely for any cascade but is unnecessary if delete cascade
+            # is on.
+            if self.post_update or not self.passive_deletes == 'all':
+                for state in deplist:
+                    history = uowcommit.get_attribute_history(state, self.key, passive=self.passive_deletes)
+                    if history:
+                        for child in history.deleted:
+                            if child is not None and self.hasparent(child) is False:
+                                self._synchronize(state, child, None, True, uowcommit)
+                                self._conditional_post_update(child, uowcommit, [state])
+                        if self.post_update or not self.cascade.delete:
+                            for child in history.unchanged:
+                                if child is not None:
+                                    self._synchronize(state, child, None, True, uowcommit)
+                                    self._conditional_post_update(child, uowcommit, [state])
+        else:
+            for state in deplist:
+                history = uowcommit.get_attribute_history(state, self.key, passive=True)
+                if history:
+                    for child in history.added:
+                        self._synchronize(state, child, None, False, uowcommit)
+                        if child is not None:
+                            self._conditional_post_update(child, uowcommit, [state])
+
+                    for child in history.deleted:
+                        if not self.cascade.delete_orphan and not self.hasparent(child):
+                            self._synchronize(state, child, None, True, uowcommit)
+
+                    if self._pks_changed(uowcommit, state):
+                        for child in history.unchanged:
+                            self._synchronize(state, child, None, False, uowcommit)
+
+    def preprocess_dependencies(self, task, deplist, uowcommit, delete = False):
+        if delete:
+            # head object is being deleted, and we manage its list of child objects
+            # the child objects have to have their foreign key to the parent set to NULL
+            if not self.post_update:
+                should_null_fks = not self.cascade.delete and not self.passive_deletes == 'all'
+                for state in deplist:
+                    history = uowcommit.get_attribute_history(state, self.key, passive=self.passive_deletes)
+                    if history:
+                        for child in history.deleted:
+                            if child is not None and self.hasparent(child) is False:
+                                if self.cascade.delete_orphan:
+                                    uowcommit.register_object(child, isdelete=True)
+                                else:
+                                    uowcommit.register_object(child)
+                        if should_null_fks:
+                            for child in history.unchanged:
+                                if child is not None:
+                                    uowcommit.register_object(child)
+        else:
+            for state in deplist:
+                history = uowcommit.get_attribute_history(state, self.key, passive=True)
+                if history:
+                    for child in history.added:
+                        if child is not None:
+                            uowcommit.register_object(child)
+                    for child in history.deleted:
+                        if not self.cascade.delete_orphan:
+                            uowcommit.register_object(child, isdelete=False)
+                        elif self.hasparent(child) is False:
+                            uowcommit.register_object(child, isdelete=True)
+                            for c, m in self.mapper.cascade_iterator('delete', child):
+                                uowcommit.register_object(
+                                    attributes.instance_state(c),
+                                    isdelete=True)
+                if self._pks_changed(uowcommit, state):
+                    if not history:
+                        history = uowcommit.get_attribute_history(state, self.key, passive=self.passive_updates)
+                    if history:
+                        for child in history.unchanged:
+                            if child is not None:
+                                uowcommit.register_object(child)
+
+    def _synchronize(self, state, child, associationrow, clearkeys, uowcommit):
+        source = state
+        dest = child
+        if dest is None or (not self.post_update and uowcommit.is_deleted(dest)):
+            return
+        self._verify_canload(child)
+        if clearkeys:
+            sync.clear(dest, self.mapper, self.prop.synchronize_pairs)
+        else:
+            sync.populate(source, self.parent, dest, self.mapper, self.prop.synchronize_pairs)
+
+    def _pks_changed(self, uowcommit, state):
+        return sync.source_modified(uowcommit, state, self.parent, self.prop.synchronize_pairs)
+
+class DetectKeySwitch(DependencyProcessor):
+    """a special DP that works for many-to-one relations, fires off for
+    child items who have changed their referenced key."""
+
+    no_dependencies = True
+
+    def register_dependencies(self, uowcommit):
+        pass
+
+    def register_processors(self, uowcommit):
+        uowcommit.register_processor(self.parent, self, self.mapper)
+
+    def preprocess_dependencies(self, task, deplist, uowcommit, delete=False):
+        # for non-passive updates, register in the preprocess stage
+        # so that mapper save_obj() gets a hold of changes
+        if not delete and not self.passive_updates:
+            self._process_key_switches(deplist, uowcommit)
+
+    def process_dependencies(self, task, deplist, uowcommit, delete=False):
+        # for passive updates, register objects in the process stage
+        # so that we avoid ManyToOneDP's registering the object without
+        # the listonly flag in its own preprocess stage (results in UPDATE)
+        # statements being emitted
+        if not delete and self.passive_updates:
+            self._process_key_switches(deplist, uowcommit)
+
+    def _process_key_switches(self, deplist, uowcommit):
+        switchers = set(s for s in deplist if self._pks_changed(uowcommit, s))
+        if switchers:
+            # yes, we're doing a linear search right now through the UOW.  only
+            # takes effect when primary key values have actually changed.
+            # a possible optimization might be to enhance the "hasparents" capability of
+            # attributes to actually store all parent references, but this introduces
+            # more complicated attribute accounting.
+            for s in [elem for elem in uowcommit.session.identity_map.all_states()
+                if issubclass(elem.class_, self.parent.class_) and
+                    self.key in elem.dict and
+                    elem.dict[self.key] is not None and 
+                    attributes.instance_state(elem.dict[self.key]) in switchers
+                ]:
+                uowcommit.register_object(s)
+                sync.populate(attributes.instance_state(s.dict[self.key]), self.mapper, s, self.parent, self.prop.synchronize_pairs)
+
+    def _pks_changed(self, uowcommit, state):
+        return sync.source_modified(uowcommit, state, self.mapper, self.prop.synchronize_pairs)
+
+class ManyToOneDP(DependencyProcessor):
+    def __init__(self, prop):
+        DependencyProcessor.__init__(self, prop)
+        self.mapper._dependency_processors.append(DetectKeySwitch(prop))
+
+    def register_dependencies(self, uowcommit):
+        if self.post_update:
+            uowcommit.register_dependency(self.mapper, self.dependency_marker)
+            uowcommit.register_dependency(self.parent, self.dependency_marker)
+        else:
+            uowcommit.register_dependency(self.mapper, self.parent)
+    
+    def register_processors(self, uowcommit):
+        if self.post_update:
+            uowcommit.register_processor(self.dependency_marker, self, self.parent)
+        else:
+            uowcommit.register_processor(self.mapper, self, self.parent)
+
+    def process_dependencies(self, task, deplist, uowcommit, delete=False):
+        if delete:
+            if self.post_update and not self.cascade.delete_orphan and not self.passive_deletes == 'all':
+                # post_update means we have to update our row to not reference the child object
+                # before we can DELETE the row
+                for state in deplist:
+                    self._synchronize(state, None, None, True, uowcommit)
+                    history = uowcommit.get_attribute_history(state, self.key, passive=self.passive_deletes)
+                    if history:
+                        self._conditional_post_update(state, uowcommit, history.sum())
+        else:
+            for state in deplist:
+                history = uowcommit.get_attribute_history(state, self.key, passive=True)
+                if history:
+                    for child in history.added:
+                        self._synchronize(state, child, None, False, uowcommit)
+                    self._conditional_post_update(state, uowcommit, history.sum())
+
+    def preprocess_dependencies(self, task, deplist, uowcommit, delete=False):
+        if self.post_update:
+            return
+        if delete:
+            if self.cascade.delete or self.cascade.delete_orphan:
+                for state in deplist:
+                    history = uowcommit.get_attribute_history(state, self.key, passive=self.passive_deletes)
+                    if history:
+                        if self.cascade.delete_orphan:
+                            todelete = history.sum()
+                        else:
+                            todelete = history.non_deleted()
+                        for child in todelete:
+                            if child is None:
+                                continue
+                            uowcommit.register_object(child, isdelete=True)
+                            for c, m in self.mapper.cascade_iterator('delete', child):
+                                uowcommit.register_object(
+                                    attributes.instance_state(c), isdelete=True)
+        else:
+            for state in deplist:
+                uowcommit.register_object(state)
+                if self.cascade.delete_orphan:
+                    history = uowcommit.get_attribute_history(state, self.key, passive=self.passive_deletes)
+                    if history:
+                        for child in history.deleted:
+                            if self.hasparent(child) is False:
+                                uowcommit.register_object(child, isdelete=True)
+                                for c, m in self.mapper.cascade_iterator('delete', child):
+                                    uowcommit.register_object(
+                                        attributes.instance_state(c),
+                                        isdelete=True)
+
+
+    def _synchronize(self, state, child, associationrow, clearkeys, uowcommit):
+        if state is None or (not self.post_update and uowcommit.is_deleted(state)):
+            return
+
+        if clearkeys or child is None:
+            sync.clear(state, self.parent, self.prop.synchronize_pairs)
+        else:
+            self._verify_canload(child)
+            sync.populate(child, self.mapper, state, self.parent, self.prop.synchronize_pairs)
+
+class ManyToManyDP(DependencyProcessor):
+    def register_dependencies(self, uowcommit):
+        # many-to-many.  create a "Stub" mapper to represent the
+        # "middle table" in the relationship.  This stub mapper doesnt save
+        # or delete any objects, but just marks a dependency on the two
+        # related mappers.  its dependency processor then populates the
+        # association table.
+
+        uowcommit.register_dependency(self.parent, self.dependency_marker)
+        uowcommit.register_dependency(self.mapper, self.dependency_marker)
+
+    def register_processors(self, uowcommit):
+        uowcommit.register_processor(self.dependency_marker, self, self.parent)
+        
+    def process_dependencies(self, task, deplist, uowcommit, delete = False):
+        connection = uowcommit.transaction.connection(self.mapper)
+        secondary_delete = []
+        secondary_insert = []
+        secondary_update = []
+
+        if delete:
+            for state in deplist:
+                history = uowcommit.get_attribute_history(state, self.key, passive=self.passive_deletes)
+                if history:
+                    for child in history.non_added():
+                        if child is None or self._check_reverse_action(uowcommit, child, state, "manytomany"):
+                            continue
+                        associationrow = {}
+                        self._synchronize(state, child, associationrow, False, uowcommit)
+                        secondary_delete.append(associationrow)
+                        self._performed_action(uowcommit, state, child, "manytomany")
+        else:
+            for state in deplist:
+                history = uowcommit.get_attribute_history(state, self.key)
+                if history:
+                    for child in history.added:
+                        if child is None or self._check_reverse_action(uowcommit, child, state, "manytomany"):
+                            continue
+                        associationrow = {}
+                        self._synchronize(state, child, associationrow, False, uowcommit)
+                        self._performed_action(uowcommit, state, child, "manytomany")
+                        secondary_insert.append(associationrow)
+                    for child in history.deleted:
+                        if child is None or self._check_reverse_action(uowcommit, child, state, "manytomany"):
+                            continue
+                        associationrow = {}
+                        self._synchronize(state, child, associationrow, False, uowcommit)
+                        self._performed_action(uowcommit, state, child, "manytomany")
+                        secondary_delete.append(associationrow)
+
+                if not self.passive_updates and self._pks_changed(uowcommit, state):
+                    if not history:
+                        history = uowcommit.get_attribute_history(state, self.key, passive=False)
+                    
+                    for child in history.unchanged:
+                        associationrow = {}
+                        sync.update(state, self.parent, associationrow, "old_", self.prop.synchronize_pairs)
+                        sync.update(child, self.mapper, associationrow, "old_", self.prop.secondary_synchronize_pairs)
+
+                        #self.syncrules.update(associationrow, state, child, "old_")
+                        secondary_update.append(associationrow)
+
+        if secondary_delete:
+            statement = self.secondary.delete(sql.and_(*[
+                                c == sql.bindparam(c.key, type_=c.type) for c in self.secondary.c if c.key in associationrow
+                            ]))
+            result = connection.execute(statement, secondary_delete)
+            if result.supports_sane_multi_rowcount() and result.rowcount != len(secondary_delete):
+                raise exc.ConcurrentModificationError("Deleted rowcount %d does not match number of "
+                            "secondary table rows deleted from table '%s': %d" % 
+                            (result.rowcount, self.secondary.description, len(secondary_delete)))
+
+        if secondary_update:
+            statement = self.secondary.update(sql.and_(*[
+                                c == sql.bindparam("old_" + c.key, type_=c.type) for c in self.secondary.c if c.key in associationrow
+                            ]))
+            result = connection.execute(statement, secondary_update)
+            if result.supports_sane_multi_rowcount() and result.rowcount != len(secondary_update):
+                raise exc.ConcurrentModificationError("Updated rowcount %d does not match number of "
+                            "secondary table rows updated from table '%s': %d" % 
+                            (result.rowcount, self.secondary.description, len(secondary_update)))
+
+        if secondary_insert:
+            statement = self.secondary.insert()
+            connection.execute(statement, secondary_insert)
+
+    def preprocess_dependencies(self, task, deplist, uowcommit, delete = False):
+        if not delete:
+            for state in deplist:
+                history = uowcommit.get_attribute_history(state, self.key, passive=True)
+                if history:
+                    for child in history.deleted:
+                        if self.cascade.delete_orphan and self.hasparent(child) is False:
+                            uowcommit.register_object(child, isdelete=True)
+                            for c, m in self.mapper.cascade_iterator('delete', child):
+                                uowcommit.register_object(
+                                    attributes.instance_state(c), isdelete=True)
+
+    def _synchronize(self, state, child, associationrow, clearkeys, uowcommit):
+        if associationrow is None:
+            return
+        self._verify_canload(child)
+        
+        sync.populate_dict(state, self.parent, associationrow, self.prop.synchronize_pairs)
+        sync.populate_dict(child, self.mapper, associationrow, self.prop.secondary_synchronize_pairs)
+
+    def _pks_changed(self, uowcommit, state):
+        return sync.source_modified(uowcommit, state, self.parent, self.prop.synchronize_pairs)
+
+class MapperStub(object):
+    """Represent a many-to-many dependency within a flush 
+    context. 
+     
+    The UOWTransaction corresponds dependencies to mappers.   
+    MapperStub takes the place of the "association table" 
+    so that a depedendency can be corresponded to it.
+
+    """
+    
+    def __init__(self, parent, mapper, key):
+        self.mapper = mapper
+        self.base_mapper = self
+        self.class_ = mapper.class_
+        self._inheriting_mappers = []
+
+    def polymorphic_iterator(self):
+        return iter((self,))
+
+    def _register_dependencies(self, uowcommit):
+        pass
+
+    def _register_procesors(self, uowcommit):
+        pass
+
+    def _save_obj(self, *args, **kwargs):
+        pass
+
+    def _delete_obj(self, *args, **kwargs):
+        pass
+
+    def primary_mapper(self):
+        return self
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/orm/collections.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/orm/collections.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/orm/collections.py (revision 3)
@@ -0,0 +1,1419 @@
+"""Support for collections of mapped entities.
+
+The collections package supplies the machinery used to inform the ORM of
+collection membership changes.  An instrumentation via decoration approach is
+used, allowing arbitrary types (including built-ins) to be used as entity
+collections without requiring inheritance from a base class.
+
+Instrumentation decoration relays membership change events to the
+``InstrumentedCollectionAttribute`` that is currently managing the collection.
+The decorators observe function call arguments and return values, tracking
+entities entering or leaving the collection.  Two decorator approaches are
+provided.  One is a bundle of generic decorators that map function arguments
+and return values to events::
+
+  from sqlalchemy.orm.collections import collection
+  class MyClass(object):
+      # ...
+
+      @collection.adds(1)
+      def store(self, item):
+          self.data.append(item)
+
+      @collection.removes_return()
+      def pop(self):
+          return self.data.pop()
+
+
+The second approach is a bundle of targeted decorators that wrap appropriate
+append and remove notifiers around the mutation methods present in the
+standard Python ``list``, ``set`` and ``dict`` interfaces.  These could be
+specified in terms of generic decorator recipes, but are instead hand-tooled
+for increased efficiency.  The targeted decorators occasionally implement
+adapter-like behavior, such as mapping bulk-set methods (``extend``,
+``update``, ``__setslice__``, etc.) into the series of atomic mutation events
+that the ORM requires.
+
+The targeted decorators are used internally for automatic instrumentation of
+entity collection classes.  Every collection class goes through a
+transformation process roughly like so:
+
+1. If the class is a built-in, substitute a trivial sub-class
+2. Is this class already instrumented?
+3. Add in generic decorators
+4. Sniff out the collection interface through duck-typing
+5. Add targeted decoration to any undecorated interface method
+
+This process modifies the class at runtime, decorating methods and adding some
+bookkeeping properties.  This isn't possible (or desirable) for built-in
+classes like ``list``, so trivial sub-classes are substituted to hold
+decoration::
+
+  class InstrumentedList(list):
+      pass
+
+Collection classes can be specified in ``relation(collection_class=)`` as
+types or a function that returns an instance.  Collection classes are
+inspected and instrumented during the mapper compilation phase.  The
+collection_class callable will be executed once to produce a specimen
+instance, and the type of that specimen will be instrumented.  Functions that
+return built-in types like ``lists`` will be adapted to produce instrumented
+instances.
+
+When extending a known type like ``list``, additional decorations are not
+generally not needed.  Odds are, the extension method will delegate to a
+method that's already instrumented.  For example::
+
+  class QueueIsh(list):
+     def push(self, item):
+         self.append(item)
+     def shift(self):
+         return self.pop(0)
+
+There's no need to decorate these methods.  ``append`` and ``pop`` are already
+instrumented as part of the ``list`` interface.  Decorating them would fire
+duplicate events, which should be avoided.
+
+The targeted decoration tries not to rely on other methods in the underlying
+collection class, but some are unavoidable.  Many depend on 'read' methods
+being present to properly instrument a 'write', for example, ``__setitem__``
+needs ``__getitem__``.  "Bulk" methods like ``update`` and ``extend`` may also
+reimplemented in terms of atomic appends and removes, so the ``extend``
+decoration will actually perform many ``append`` operations and not call the
+underlying method at all.
+
+Tight control over bulk operation and the firing of events is also possible by
+implementing the instrumentation internally in your methods.  The basic
+instrumentation package works under the general assumption that collection
+mutation will not raise unusual exceptions.  If you want to closely
+orchestrate append and remove events with exception management, internal
+instrumentation may be the answer.  Within your method,
+``collection_adapter(self)`` will retrieve an object that you can use for
+explicit control over triggering append and remove events.
+
+The owning object and InstrumentedCollectionAttribute are also reachable
+through the adapter, allowing for some very sophisticated behavior.
+
+"""
+
+import copy
+import inspect
+import operator
+import sys
+import weakref
+
+import sqlalchemy.exceptions as sa_exc
+from sqlalchemy.sql import expression
+from sqlalchemy import schema, util
+
+
+__all__ = ['collection', 'collection_adapter',
+           'mapped_collection', 'column_mapped_collection',
+           'attribute_mapped_collection']
+
+__instrumentation_mutex = util.threading.Lock()
+
+
+def column_mapped_collection(mapping_spec):
+    """A dictionary-based collection type with column-based keying.
+
+    Returns a MappedCollection factory with a keying function generated
+    from mapping_spec, which may be a Column or a sequence of Columns.
+
+    The key value must be immutable for the lifetime of the object.  You
+    can not, for example, map on foreign key values if those key values will
+    change during the session, i.e. from None to a database-assigned integer
+    after a session flush.
+
+    """
+    from sqlalchemy.orm.util import _state_mapper
+    from sqlalchemy.orm.attributes import instance_state
+
+    cols = [expression._no_literals(q) for q in util.to_list(mapping_spec)]
+    if len(cols) == 1:
+        def keyfunc(value):
+            state = instance_state(value)
+            m = _state_mapper(state)
+            return m._get_state_attr_by_column(state, cols[0])
+    else:
+        mapping_spec = tuple(cols)
+        def keyfunc(value):
+            state = instance_state(value)
+            m = _state_mapper(state)
+            return tuple(m._get_state_attr_by_column(state, c)
+                         for c in mapping_spec)
+    return lambda: MappedCollection(keyfunc)
+
+def attribute_mapped_collection(attr_name):
+    """A dictionary-based collection type with attribute-based keying.
+
+    Returns a MappedCollection factory with a keying based on the
+    'attr_name' attribute of entities in the collection.
+
+    The key value must be immutable for the lifetime of the object.  You
+    can not, for example, map on foreign key values if those key values will
+    change during the session, i.e. from None to a database-assigned integer
+    after a session flush.
+
+    """
+    return lambda: MappedCollection(operator.attrgetter(attr_name))
+
+
+def mapped_collection(keyfunc):
+    """A dictionary-based collection type with arbitrary keying.
+
+    Returns a MappedCollection factory with a keying function generated
+    from keyfunc, a callable that takes an entity and returns a key value.
+
+    The key value must be immutable for the lifetime of the object.  You
+    can not, for example, map on foreign key values if those key values will
+    change during the session, i.e. from None to a database-assigned integer
+    after a session flush.
+
+    """
+    return lambda: MappedCollection(keyfunc)
+
+class collection(object):
+    """Decorators for entity collection classes.
+
+    The decorators fall into two groups: annotations and interception recipes.
+
+    The annotating decorators (appender, remover, iterator,
+    internally_instrumented, on_link) indicate the method's purpose and take no
+    arguments.  They are not written with parens::
+
+        @collection.appender
+        def append(self, append): ...
+
+    The recipe decorators all require parens, even those that take no
+    arguments::
+
+        @collection.adds('entity'):
+        def insert(self, position, entity): ...
+
+        @collection.removes_return()
+        def popitem(self): ...
+
+    Decorators can be specified in long-hand for Python 2.3, or with
+    the class-level dict attribute '__instrumentation__'- see the source
+    for details.
+
+    """
+    # Bundled as a class solely for ease of use: packaging, doc strings,
+    # importability.
+
+    @staticmethod
+    def appender(fn):
+        """Tag the method as the collection appender.
+
+        The appender method is called with one positional argument: the value
+        to append. The method will be automatically decorated with 'adds(1)'
+        if not already decorated::
+
+            @collection.appender
+            def add(self, append): ...
+
+            # or, equivalently
+            @collection.appender
+            @collection.adds(1)
+            def add(self, append): ...
+
+            # for mapping type, an 'append' may kick out a previous value
+            # that occupies that slot.  consider d['a'] = 'foo'- any previous
+            # value in d['a'] is discarded.
+            @collection.appender
+            @collection.replaces(1)
+            def add(self, entity):
+                key = some_key_func(entity)
+                previous = None
+                if key in self:
+                    previous = self[key]
+                self[key] = entity
+                return previous
+
+        If the value to append is not allowed in the collection, you may
+        raise an exception.  Something to remember is that the appender
+        will be called for each object mapped by a database query.  If the
+        database contains rows that violate your collection semantics, you
+        will need to get creative to fix the problem, as access via the
+        collection will not work.
+
+        If the appender method is internally instrumented, you must also
+        receive the keyword argument '_sa_initiator' and ensure its
+        promulgation to collection events.
+
+        """
+        setattr(fn, '_sa_instrument_role', 'appender')
+        return fn
+
+    @staticmethod
+    def remover(fn):
+        """Tag the method as the collection remover.
+
+        The remover method is called with one positional argument: the value
+        to remove. The method will be automatically decorated with
+        'removes_return()' if not already decorated::
+
+            @collection.remover
+            def zap(self, entity): ...
+
+            # or, equivalently
+            @collection.remover
+            @collection.removes_return()
+            def zap(self, ): ...
+
+        If the value to remove is not present in the collection, you may
+        raise an exception or return None to ignore the error.
+
+        If the remove method is internally instrumented, you must also
+        receive the keyword argument '_sa_initiator' and ensure its
+        promulgation to collection events.
+
+        """
+        setattr(fn, '_sa_instrument_role', 'remover')
+        return fn
+
+    @staticmethod
+    def iterator(fn):
+        """Tag the method as the collection remover.
+
+        The iterator method is called with no arguments.  It is expected to
+        return an iterator over all collection members::
+
+            @collection.iterator
+            def __iter__(self): ...
+
+        """
+        setattr(fn, '_sa_instrument_role', 'iterator')
+        return fn
+
+    @staticmethod
+    def internally_instrumented(fn):
+        """Tag the method as instrumented.
+
+        This tag will prevent any decoration from being applied to the method.
+        Use this if you are orchestrating your own calls to collection_adapter
+        in one of the basic SQLAlchemy interface methods, or to prevent
+        an automatic ABC method decoration from wrapping your implementation::
+
+            # normally an 'extend' method on a list-like class would be
+            # automatically intercepted and re-implemented in terms of
+            # SQLAlchemy events and append().  your implementation will
+            # never be called, unless:
+            @collection.internally_instrumented
+            def extend(self, items): ...
+
+        """
+        setattr(fn, '_sa_instrumented', True)
+        return fn
+
+    @staticmethod
+    def on_link(fn):
+        """Tag the method as a the "linked to attribute" event handler.
+
+        This optional event handler will be called when the collection class
+        is linked to or unlinked from the InstrumentedAttribute.  It is
+        invoked immediately after the '_sa_adapter' property is set on
+        the instance.  A single argument is passed: the collection adapter
+        that has been linked, or None if unlinking.
+
+        """
+        setattr(fn, '_sa_instrument_role', 'on_link')
+        return fn
+
+    @staticmethod
+    def converter(fn):
+        """Tag the method as the collection converter.
+
+        This optional method will be called when a collection is being
+        replaced entirely, as in::
+
+            myobj.acollection = [newvalue1, newvalue2]
+
+        The converter method will receive the object being assigned and should
+        return an iterable of values suitable for use by the ``appender``
+        method.  A converter must not assign values or mutate the collection,
+        it's sole job is to adapt the value the user provides into an iterable
+        of values for the ORM's use.
+
+        The default converter implementation will use duck-typing to do the
+        conversion.  A dict-like collection will be convert into an iterable
+        of dictionary values, and other types will simply be iterated.
+
+            @collection.converter
+            def convert(self, other): ...
+
+        If the duck-typing of the object does not match the type of this
+        collection, a TypeError is raised.
+
+        Supply an implementation of this method if you want to expand the
+        range of possible types that can be assigned in bulk or perform
+        validation on the values about to be assigned.
+
+        """
+        setattr(fn, '_sa_instrument_role', 'converter')
+        return fn
+
+    @staticmethod
+    def adds(arg):
+        """Mark the method as adding an entity to the collection.
+
+        Adds "add to collection" handling to the method.  The decorator
+        argument indicates which method argument holds the SQLAlchemy-relevant
+        value.  Arguments can be specified positionally (i.e. integer) or by
+        name::
+
+            @collection.adds(1)
+            def push(self, item): ...
+
+            @collection.adds('entity')
+            def do_stuff(self, thing, entity=None): ...
+
+        """
+        def decorator(fn):
+            setattr(fn, '_sa_instrument_before', ('fire_append_event', arg))
+            return fn
+        return decorator
+
+    @staticmethod
+    def replaces(arg):
+        """Mark the method as replacing an entity in the collection.
+
+        Adds "add to collection" and "remove from collection" handling to
+        the method.  The decorator argument indicates which method argument
+        holds the SQLAlchemy-relevant value to be added, and return value, if
+        any will be considered the value to remove.
+
+        Arguments can be specified positionally (i.e. integer) or by name::
+
+            @collection.replaces(2)
+            def __setitem__(self, index, item): ...
+
+        """
+        def decorator(fn):
+            setattr(fn, '_sa_instrument_before', ('fire_append_event', arg))
+            setattr(fn, '_sa_instrument_after', 'fire_remove_event')
+            return fn
+        return decorator
+
+    @staticmethod
+    def removes(arg):
+        """Mark the method as removing an entity in the collection.
+
+        Adds "remove from collection" handling to the method.  The decorator
+        argument indicates which method argument holds the SQLAlchemy-relevant
+        value to be removed. Arguments can be specified positionally (i.e.
+        integer) or by name::
+
+            @collection.removes(1)
+            def zap(self, item): ...
+
+        For methods where the value to remove is not known at call-time, use
+        collection.removes_return.
+
+        """
+        def decorator(fn):
+            setattr(fn, '_sa_instrument_before', ('fire_remove_event', arg))
+            return fn
+        return decorator
+
+    @staticmethod
+    def removes_return():
+        """Mark the method as removing an entity in the collection.
+
+        Adds "remove from collection" handling to the method.  The return value
+        of the method, if any, is considered the value to remove.  The method
+        arguments are not inspected::
+
+            @collection.removes_return()
+            def pop(self): ...
+
+        For methods where the value to remove is known at call-time, use
+        collection.remove.
+
+        """
+        def decorator(fn):
+            setattr(fn, '_sa_instrument_after', 'fire_remove_event')
+            return fn
+        return decorator
+
+
+# public instrumentation interface for 'internally instrumented'
+# implementations
+def collection_adapter(collection):
+    """Fetch the CollectionAdapter for a collection."""
+    return getattr(collection, '_sa_adapter', None)
+
+def collection_iter(collection):
+    """Iterate over an object supporting the @iterator or __iter__ protocols.
+
+    If the collection is an ORM collection, it need not be attached to an
+    object to be iterable.
+
+    """
+    try:
+        return getattr(collection, '_sa_iterator',
+                       getattr(collection, '__iter__'))()
+    except AttributeError:
+        raise TypeError("'%s' object is not iterable" %
+                        type(collection).__name__)
+
+
+class CollectionAdapter(object):
+    """Bridges between the ORM and arbitrary Python collections.
+
+    Proxies base-level collection operations (append, remove, iterate)
+    to the underlying Python collection, and emits add/remove events for
+    entities entering or leaving the collection.
+
+    The ORM uses an CollectionAdapter exclusively for interaction with
+    entity collections.
+
+    """
+    def __init__(self, attr, owner_state, data):
+        self.attr = attr
+        # TODO: figure out what this being a weakref buys us
+        self._data = weakref.ref(data)
+        self.owner_state = owner_state
+        self.link_to_self(data)
+
+    data = property(lambda s: s._data(),
+                    doc="The entity collection being adapted.")
+
+    def link_to_self(self, data):
+        """Link a collection to this adapter, and fire a link event."""
+        setattr(data, '_sa_adapter', self)
+        if hasattr(data, '_sa_on_link'):
+            getattr(data, '_sa_on_link')(self)
+
+    def unlink(self, data):
+        """Unlink a collection from any adapter, and fire a link event."""
+        setattr(data, '_sa_adapter', None)
+        if hasattr(data, '_sa_on_link'):
+            getattr(data, '_sa_on_link')(None)
+
+    def adapt_like_to_iterable(self, obj):
+        """Converts collection-compatible objects to an iterable of values.
+
+        Can be passed any type of object, and if the underlying collection
+        determines that it can be adapted into a stream of values it can
+        use, returns an iterable of values suitable for append()ing.
+
+        This method may raise TypeError or any other suitable exception
+        if adaptation fails.
+
+        If a converter implementation is not supplied on the collection,
+        a default duck-typing-based implementation is used.
+
+        """
+        converter = getattr(self._data(), '_sa_converter', None)
+        if converter is not None:
+            return converter(obj)
+
+        setting_type = util.duck_type_collection(obj)
+        receiving_type = util.duck_type_collection(self._data())
+
+        if obj is None or setting_type != receiving_type:
+            given = obj is None and 'None' or obj.__class__.__name__
+            if receiving_type is None:
+                wanted = self._data().__class__.__name__
+            else:
+                wanted = receiving_type.__name__
+
+            raise TypeError(
+                "Incompatible collection type: %s is not %s-like" % (
+                given, wanted))
+
+        # If the object is an adapted collection, return the (iterable)
+        # adapter.
+        if getattr(obj, '_sa_adapter', None) is not None:
+            return getattr(obj, '_sa_adapter')
+        elif setting_type == dict:
+            return getattr(obj, 'itervalues', getattr(obj, 'values'))()
+        else:
+            return iter(obj)
+
+    def append_with_event(self, item, initiator=None):
+        """Add an entity to the collection, firing mutation events."""
+        getattr(self._data(), '_sa_appender')(item, _sa_initiator=initiator)
+
+    def append_without_event(self, item):
+        """Add or restore an entity to the collection, firing no events."""
+        getattr(self._data(), '_sa_appender')(item, _sa_initiator=False)
+
+    def remove_with_event(self, item, initiator=None):
+        """Remove an entity from the collection, firing mutation events."""
+        getattr(self._data(), '_sa_remover')(item, _sa_initiator=initiator)
+
+    def remove_without_event(self, item):
+        """Remove an entity from the collection, firing no events."""
+        getattr(self._data(), '_sa_remover')(item, _sa_initiator=False)
+
+    def clear_with_event(self, initiator=None):
+        """Empty the collection, firing a mutation event for each entity."""
+        for item in list(self):
+            self.remove_with_event(item, initiator)
+
+    def clear_without_event(self):
+        """Empty the collection, firing no events."""
+        for item in list(self):
+            self.remove_without_event(item)
+
+    def __iter__(self):
+        """Iterate over entities in the collection."""
+        return getattr(self._data(), '_sa_iterator')()
+
+    def __len__(self):
+        """Count entities in the collection."""
+        return len(list(getattr(self._data(), '_sa_iterator')()))
+
+    def __nonzero__(self):
+        return True
+
+    def fire_append_event(self, item, initiator=None):
+        """Notify that a entity has entered the collection.
+
+        Initiator is the InstrumentedAttribute that initiated the membership
+        mutation, and should be left as None unless you are passing along
+        an initiator value from a chained operation.
+
+        """
+        if initiator is not False and item is not None:
+            return self.attr.fire_append_event(self.owner_state, self.owner_state.dict, item, initiator)
+        else:
+            return item
+
+    def fire_remove_event(self, item, initiator=None):
+        """Notify that a entity has been removed from the collection.
+
+        Initiator is the InstrumentedAttribute that initiated the membership
+        mutation, and should be left as None unless you are passing along
+        an initiator value from a chained operation.
+
+        """
+        if initiator is not False and item is not None:
+            self.attr.fire_remove_event(self.owner_state, self.owner_state.dict, item, initiator)
+
+    def fire_pre_remove_event(self, initiator=None):
+        """Notify that an entity is about to be removed from the collection.
+
+        Only called if the entity cannot be removed after calling
+        fire_remove_event().
+
+        """
+        self.attr.fire_pre_remove_event(self.owner_state, self.owner_state.dict, initiator=initiator)
+
+    def __getstate__(self):
+        return {'key': self.attr.key,
+                'owner_state': self.owner_state,
+                'data': self.data}
+
+    def __setstate__(self, d):
+        self.attr = getattr(d['owner_state'].obj().__class__, d['key']).impl
+        self.owner_state = d['owner_state']
+        self._data = weakref.ref(d['data'])
+
+
+def bulk_replace(values, existing_adapter, new_adapter):
+    """Load a new collection, firing events based on prior like membership.
+
+    Appends instances in ``values`` onto the ``new_adapter``. Events will be
+    fired for any instance not present in the ``existing_adapter``.  Any
+    instances in ``existing_adapter`` not present in ``values`` will have
+    remove events fired upon them.
+
+    values
+      An iterable of collection member instances
+
+    existing_adapter
+      A CollectionAdapter of instances to be replaced
+
+    new_adapter
+      An empty CollectionAdapter to load with ``values``
+
+
+    """
+    if not isinstance(values, list):
+        values = list(values)
+
+    idset = util.IdentitySet
+    constants = idset(existing_adapter or ()).intersection(values or ())
+    additions = idset(values or ()).difference(constants)
+    removals = idset(existing_adapter or ()).difference(constants)
+
+    for member in values or ():
+        if member in additions:
+            new_adapter.append_with_event(member)
+        elif member in constants:
+            new_adapter.append_without_event(member)
+
+    if existing_adapter:
+        for member in removals:
+            existing_adapter.remove_with_event(member)
+
+def prepare_instrumentation(factory):
+    """Prepare a callable for future use as a collection class factory.
+
+    Given a collection class factory (either a type or no-arg callable),
+    return another factory that will produce compatible instances when
+    called.
+
+    This function is responsible for converting collection_class=list
+    into the run-time behavior of collection_class=InstrumentedList.
+
+    """
+    # Convert a builtin to 'Instrumented*'
+    if factory in __canned_instrumentation:
+        factory = __canned_instrumentation[factory]
+
+    # Create a specimen
+    cls = type(factory())
+
+    # Did factory callable return a builtin?
+    if cls in __canned_instrumentation:
+        # Wrap it so that it returns our 'Instrumented*'
+        factory = __converting_factory(factory)
+        cls = factory()
+
+    # Instrument the class if needed.
+    if __instrumentation_mutex.acquire():
+        try:
+            if getattr(cls, '_sa_instrumented', None) != id(cls):
+                _instrument_class(cls)
+        finally:
+            __instrumentation_mutex.release()
+
+    return factory
+
+def __converting_factory(original_factory):
+    """Convert the type returned by collection factories on the fly.
+
+    Given a collection factory that returns a builtin type (e.g. a list),
+    return a wrapped function that converts that type to one of our
+    instrumented types.
+
+    """
+    def wrapper():
+        collection = original_factory()
+        type_ = type(collection)
+        if type_ in __canned_instrumentation:
+            # return an instrumented type initialized from the factory's
+            # collection
+            return __canned_instrumentation[type_](collection)
+        else:
+            raise sa_exc.InvalidRequestError(
+                "Collection class factories must produce instances of a "
+                "single class.")
+    try:
+        # often flawed but better than nothing
+        wrapper.__name__ = "%sWrapper" % original_factory.__name__
+        wrapper.__doc__ = original_factory.__doc__
+    except:
+        pass
+    return wrapper
+
+def _instrument_class(cls):
+    """Modify methods in a class and install instrumentation."""
+
+    # TODO: more formally document this as a decoratorless/Python 2.3
+    # option for specifying instrumentation.  (likely doc'd here in code only,
+    # not in online docs.)  Useful for C types too.
+    #
+    # __instrumentation__ = {
+    #   'rolename': 'methodname', # ...
+    #   'methods': {
+    #     'methodname': ('fire_{append,remove}_event', argspec,
+    #                    'fire_{append,remove}_event'),
+    #     'append': ('fire_append_event', 1, None),
+    #     '__setitem__': ('fire_append_event', 1, 'fire_remove_event'),
+    #     'pop': (None, None, 'fire_remove_event'),
+    #     }
+    #  }
+
+    # In the normal call flow, a request for any of the 3 basic collection
+    # types is transformed into one of our trivial subclasses
+    # (e.g. InstrumentedList).  Catch anything else that sneaks in here...
+    if cls.__module__ == '__builtin__':
+        raise sa_exc.ArgumentError(
+            "Can not instrument a built-in type. Use a "
+            "subclass, even a trivial one.")
+
+    collection_type = util.duck_type_collection(cls)
+    if collection_type in __interfaces:
+        roles = __interfaces[collection_type].copy()
+        decorators = roles.pop('_decorators', {})
+    else:
+        roles, decorators = {}, {}
+
+    if hasattr(cls, '__instrumentation__'):
+        roles.update(copy.deepcopy(getattr(cls, '__instrumentation__')))
+
+    methods = roles.pop('methods', {})
+
+    for name in dir(cls):
+        method = getattr(cls, name, None)
+        if not util.callable(method):
+            continue
+
+        # note role declarations
+        if hasattr(method, '_sa_instrument_role'):
+            role = method._sa_instrument_role
+            assert role in ('appender', 'remover', 'iterator',
+                            'on_link', 'converter')
+            roles[role] = name
+
+        # transfer instrumentation requests from decorated function
+        # to the combined queue
+        before, after = None, None
+        if hasattr(method, '_sa_instrument_before'):
+            op, argument = method._sa_instrument_before
+            assert op in ('fire_append_event', 'fire_remove_event')
+            before = op, argument
+        if hasattr(method, '_sa_instrument_after'):
+            op = method._sa_instrument_after
+            assert op in ('fire_append_event', 'fire_remove_event')
+            after = op
+        if before:
+            methods[name] = before[0], before[1], after
+        elif after:
+            methods[name] = None, None, after
+
+    # apply ABC auto-decoration to methods that need it
+    for method, decorator in decorators.items():
+        fn = getattr(cls, method, None)
+        if (fn and method not in methods and
+            not hasattr(fn, '_sa_instrumented')):
+            setattr(cls, method, decorator(fn))
+
+    # ensure all roles are present, and apply implicit instrumentation if
+    # needed
+    if 'appender' not in roles or not hasattr(cls, roles['appender']):
+        raise sa_exc.ArgumentError(
+            "Type %s must elect an appender method to be "
+            "a collection class" % cls.__name__)
+    elif (roles['appender'] not in methods and
+          not hasattr(getattr(cls, roles['appender']), '_sa_instrumented')):
+        methods[roles['appender']] = ('fire_append_event', 1, None)
+
+    if 'remover' not in roles or not hasattr(cls, roles['remover']):
+        raise sa_exc.ArgumentError(
+            "Type %s must elect a remover method to be "
+            "a collection class" % cls.__name__)
+    elif (roles['remover'] not in methods and
+          not hasattr(getattr(cls, roles['remover']), '_sa_instrumented')):
+        methods[roles['remover']] = ('fire_remove_event', 1, None)
+
+    if 'iterator' not in roles or not hasattr(cls, roles['iterator']):
+        raise sa_exc.ArgumentError(
+            "Type %s must elect an iterator method to be "
+            "a collection class" % cls.__name__)
+
+    # apply ad-hoc instrumentation from decorators, class-level defaults
+    # and implicit role declarations
+    for method, (before, argument, after) in methods.items():
+        setattr(cls, method,
+                _instrument_membership_mutator(getattr(cls, method),
+                                               before, argument, after))
+    # intern the role map
+    for role, method in roles.items():
+        setattr(cls, '_sa_%s' % role, getattr(cls, method))
+
+    setattr(cls, '_sa_instrumented', id(cls))
+
+def _instrument_membership_mutator(method, before, argument, after):
+    """Route method args and/or return value through the collection adapter."""
+    # This isn't smart enough to handle @adds(1) for 'def fn(self, (a, b))'
+    if before:
+        fn_args = list(util.flatten_iterator(inspect.getargspec(method)[0]))
+        if type(argument) is int:
+            pos_arg = argument
+            named_arg = len(fn_args) > argument and fn_args[argument] or None
+        else:
+            if argument in fn_args:
+                pos_arg = fn_args.index(argument)
+            else:
+                pos_arg = None
+            named_arg = argument
+        del fn_args
+
+    def wrapper(*args, **kw):
+        if before:
+            if pos_arg is None:
+                if named_arg not in kw:
+                    raise sa_exc.ArgumentError(
+                        "Missing argument %s" % argument)
+                value = kw[named_arg]
+            else:
+                if len(args) > pos_arg:
+                    value = args[pos_arg]
+                elif named_arg in kw:
+                    value = kw[named_arg]
+                else:
+                    raise sa_exc.ArgumentError(
+                        "Missing argument %s" % argument)
+
+        initiator = kw.pop('_sa_initiator', None)
+        if initiator is False:
+            executor = None
+        else:
+            executor = getattr(args[0], '_sa_adapter', None)
+
+        if before and executor:
+            getattr(executor, before)(value, initiator)
+
+        if not after or not executor:
+            return method(*args, **kw)
+        else:
+            res = method(*args, **kw)
+            if res is not None:
+                getattr(executor, after)(res, initiator)
+            return res
+    try:
+        wrapper._sa_instrumented = True
+        wrapper.__name__ = method.__name__
+        wrapper.__doc__ = method.__doc__
+    except:
+        pass
+    return wrapper
+
+def __set(collection, item, _sa_initiator=None):
+    """Run set events, may eventually be inlined into decorators."""
+
+    if _sa_initiator is not False and item is not None:
+        executor = getattr(collection, '_sa_adapter', None)
+        if executor:
+            item = getattr(executor, 'fire_append_event')(item, _sa_initiator)
+    return item
+    
+def __del(collection, item, _sa_initiator=None):
+    """Run del events, may eventually be inlined into decorators."""
+    if _sa_initiator is not False and item is not None:
+        executor = getattr(collection, '_sa_adapter', None)
+        if executor:
+            getattr(executor, 'fire_remove_event')(item, _sa_initiator)
+
+def __before_delete(collection, _sa_initiator=None):
+    """Special method to run 'commit existing value' methods"""
+    executor = getattr(collection, '_sa_adapter', None)
+    if executor:
+        getattr(executor, 'fire_pre_remove_event')(_sa_initiator)
+
+def _list_decorators():
+    """Tailored instrumentation wrappers for any list-like class."""
+
+    def _tidy(fn):
+        setattr(fn, '_sa_instrumented', True)
+        fn.__doc__ = getattr(getattr(list, fn.__name__), '__doc__')
+
+    def append(fn):
+        def append(self, item, _sa_initiator=None):
+            item = __set(self, item, _sa_initiator)
+            fn(self, item)
+        _tidy(append)
+        return append
+
+    def remove(fn):
+        def remove(self, value, _sa_initiator=None):
+            __before_delete(self, _sa_initiator)
+            # testlib.pragma exempt:__eq__
+            fn(self, value)
+            __del(self, value, _sa_initiator)
+        _tidy(remove)
+        return remove
+
+    def insert(fn):
+        def insert(self, index, value):
+            value = __set(self, value)
+            fn(self, index, value)
+        _tidy(insert)
+        return insert
+
+    def __setitem__(fn):
+        def __setitem__(self, index, value):
+            if not isinstance(index, slice):
+                existing = self[index]
+                if existing is not None:
+                    __del(self, existing)
+                value = __set(self, value)
+                fn(self, index, value)
+            else:
+                # slice assignment requires __delitem__, insert, __len__
+                if index.stop is None:
+                    stop = 0
+                elif index.stop < 0:
+                    stop = len(self) + index.stop
+                else:
+                    stop = index.stop
+                step = index.step or 1
+                rng = range(index.start or 0, stop, step)
+                if step == 1:
+                    for i in rng:
+                        del self[index.start]
+                    i = index.start
+                    for item in value:
+                        self.insert(i, item)
+                        i += 1
+                else:
+                    if len(value) != len(rng):
+                        raise ValueError(
+                            "attempt to assign sequence of size %s to "
+                            "extended slice of size %s" % (len(value),
+                                                           len(rng)))
+                    for i, item in zip(rng, value):
+                        self.__setitem__(i, item)
+        _tidy(__setitem__)
+        return __setitem__
+
+    def __delitem__(fn):
+        def __delitem__(self, index):
+            if not isinstance(index, slice):
+                item = self[index]
+                __del(self, item)
+                fn(self, index)
+            else:
+                # slice deletion requires __getslice__ and a slice-groking
+                # __getitem__ for stepped deletion
+                # note: not breaking this into atomic dels
+                for item in self[index]:
+                    __del(self, item)
+                fn(self, index)
+        _tidy(__delitem__)
+        return __delitem__
+
+    def __setslice__(fn):
+        def __setslice__(self, start, end, values):
+            for value in self[start:end]:
+                __del(self, value)
+            values = [__set(self, value) for value in values]
+            fn(self, start, end, values)
+        _tidy(__setslice__)
+        return __setslice__
+
+    def __delslice__(fn):
+        def __delslice__(self, start, end):
+            for value in self[start:end]:
+                __del(self, value)
+            fn(self, start, end)
+        _tidy(__delslice__)
+        return __delslice__
+
+    def extend(fn):
+        def extend(self, iterable):
+            for value in iterable:
+                self.append(value)
+        _tidy(extend)
+        return extend
+
+    def __iadd__(fn):
+        def __iadd__(self, iterable):
+            # list.__iadd__ takes any iterable and seems to let TypeError raise
+            # as-is instead of returning NotImplemented
+            for value in iterable:
+                self.append(value)
+            return self
+        _tidy(__iadd__)
+        return __iadd__
+
+    def pop(fn):
+        def pop(self, index=-1):
+            __before_delete(self)
+            item = fn(self, index)
+            __del(self, item)
+            return item
+        _tidy(pop)
+        return pop
+
+    # __imul__ : not wrapping this.  all members of the collection are already
+    # present, so no need to fire appends... wrapping it with an explicit
+    # decorator is still possible, so events on *= can be had if they're
+    # desired.  hard to imagine a use case for __imul__, though.
+
+    l = locals().copy()
+    l.pop('_tidy')
+    return l
+
+def _dict_decorators():
+    """Tailored instrumentation wrappers for any dict-like mapping class."""
+
+    def _tidy(fn):
+        setattr(fn, '_sa_instrumented', True)
+        fn.__doc__ = getattr(getattr(dict, fn.__name__), '__doc__')
+
+    Unspecified = util.symbol('Unspecified')
+
+    def __setitem__(fn):
+        def __setitem__(self, key, value, _sa_initiator=None):
+            if key in self:
+                __del(self, self[key], _sa_initiator)
+            value = __set(self, value, _sa_initiator)
+            fn(self, key, value)
+        _tidy(__setitem__)
+        return __setitem__
+
+    def __delitem__(fn):
+        def __delitem__(self, key, _sa_initiator=None):
+            if key in self:
+                __del(self, self[key], _sa_initiator)
+            fn(self, key)
+        _tidy(__delitem__)
+        return __delitem__
+
+    def clear(fn):
+        def clear(self):
+            for key in self:
+                __del(self, self[key])
+            fn(self)
+        _tidy(clear)
+        return clear
+
+    def pop(fn):
+        def pop(self, key, default=Unspecified):
+            if key in self:
+                __del(self, self[key])
+            if default is Unspecified:
+                return fn(self, key)
+            else:
+                return fn(self, key, default)
+        _tidy(pop)
+        return pop
+
+    def popitem(fn):
+        def popitem(self):
+            __before_delete(self)
+            item = fn(self)
+            __del(self, item[1])
+            return item
+        _tidy(popitem)
+        return popitem
+
+    def setdefault(fn):
+        def setdefault(self, key, default=None):
+            if key not in self:
+                self.__setitem__(key, default)
+                return default
+            else:
+                return self.__getitem__(key)
+        _tidy(setdefault)
+        return setdefault
+
+    if sys.version_info < (2, 4):
+        def update(fn):
+            def update(self, other):
+                for key in other.keys():
+                    if key not in self or self[key] is not other[key]:
+                        self[key] = other[key]
+            _tidy(update)
+            return update
+    else:
+        def update(fn):
+            def update(self, __other=Unspecified, **kw):
+                if __other is not Unspecified:
+                    if hasattr(__other, 'keys'):
+                        for key in __other.keys():
+                            if (key not in self or
+                                self[key] is not __other[key]):
+                                self[key] = __other[key]
+                    else:
+                        for key, value in __other:
+                            if key not in self or self[key] is not value:
+                                self[key] = value
+                for key in kw:
+                    if key not in self or self[key] is not kw[key]:
+                        self[key] = kw[key]
+            _tidy(update)
+            return update
+
+    l = locals().copy()
+    l.pop('_tidy')
+    l.pop('Unspecified')
+    return l
+
+if util.py3k:
+    _set_binop_bases = (set, frozenset)
+else:
+    import sets
+    _set_binop_bases = (set, frozenset, sets.BaseSet)
+
+def _set_binops_check_strict(self, obj):
+    """Allow only set, frozenset and self.__class__-derived objects in binops."""
+    return isinstance(obj, _set_binop_bases + (self.__class__,))
+
+def _set_binops_check_loose(self, obj):
+    """Allow anything set-like to participate in set binops."""
+    return (isinstance(obj, _set_binop_bases + (self.__class__,)) or
+            util.duck_type_collection(obj) == set)
+
+
+def _set_decorators():
+    """Tailored instrumentation wrappers for any set-like class."""
+
+    def _tidy(fn):
+        setattr(fn, '_sa_instrumented', True)
+        fn.__doc__ = getattr(getattr(set, fn.__name__), '__doc__')
+
+    Unspecified = util.symbol('Unspecified')
+
+    def add(fn):
+        def add(self, value, _sa_initiator=None):
+            if value not in self:
+                value = __set(self, value, _sa_initiator)
+            # testlib.pragma exempt:__hash__
+            fn(self, value)
+        _tidy(add)
+        return add
+
+    if sys.version_info < (2, 4):
+        def discard(fn):
+            def discard(self, value, _sa_initiator=None):
+                if value in self:
+                    self.remove(value, _sa_initiator)
+            _tidy(discard)
+            return discard
+    else:
+        def discard(fn):
+            def discard(self, value, _sa_initiator=None):
+                # testlib.pragma exempt:__hash__
+                if value in self:
+                    __del(self, value, _sa_initiator)
+                    # testlib.pragma exempt:__hash__
+                fn(self, value)
+            _tidy(discard)
+            return discard
+
+    def remove(fn):
+        def remove(self, value, _sa_initiator=None):
+            # testlib.pragma exempt:__hash__
+            if value in self:
+                __del(self, value, _sa_initiator)
+            # testlib.pragma exempt:__hash__
+            fn(self, value)
+        _tidy(remove)
+        return remove
+
+    def pop(fn):
+        def pop(self):
+            __before_delete(self)
+            item = fn(self)
+            __del(self, item)
+            return item
+        _tidy(pop)
+        return pop
+
+    def clear(fn):
+        def clear(self):
+            for item in list(self):
+                self.remove(item)
+        _tidy(clear)
+        return clear
+
+    def update(fn):
+        def update(self, value):
+            for item in value:
+                self.add(item)
+        _tidy(update)
+        return update
+
+    def __ior__(fn):
+        def __ior__(self, value):
+            if not _set_binops_check_strict(self, value):
+                return NotImplemented
+            for item in value:
+                self.add(item)
+            return self
+        _tidy(__ior__)
+        return __ior__
+
+    def difference_update(fn):
+        def difference_update(self, value):
+            for item in value:
+                self.discard(item)
+        _tidy(difference_update)
+        return difference_update
+
+    def __isub__(fn):
+        def __isub__(self, value):
+            if not _set_binops_check_strict(self, value):
+                return NotImplemented
+            for item in value:
+                self.discard(item)
+            return self
+        _tidy(__isub__)
+        return __isub__
+
+    def intersection_update(fn):
+        def intersection_update(self, other):
+            want, have = self.intersection(other), set(self)
+            remove, add = have - want, want - have
+
+            for item in remove:
+                self.remove(item)
+            for item in add:
+                self.add(item)
+        _tidy(intersection_update)
+        return intersection_update
+
+    def __iand__(fn):
+        def __iand__(self, other):
+            if not _set_binops_check_strict(self, other):
+                return NotImplemented
+            want, have = self.intersection(other), set(self)
+            remove, add = have - want, want - have
+
+            for item in remove:
+                self.remove(item)
+            for item in add:
+                self.add(item)
+            return self
+        _tidy(__iand__)
+        return __iand__
+
+    def symmetric_difference_update(fn):
+        def symmetric_difference_update(self, other):
+            want, have = self.symmetric_difference(other), set(self)
+            remove, add = have - want, want - have
+
+            for item in remove:
+                self.remove(item)
+            for item in add:
+                self.add(item)
+        _tidy(symmetric_difference_update)
+        return symmetric_difference_update
+
+    def __ixor__(fn):
+        def __ixor__(self, other):
+            if not _set_binops_check_strict(self, other):
+                return NotImplemented
+            want, have = self.symmetric_difference(other), set(self)
+            remove, add = have - want, want - have
+
+            for item in remove:
+                self.remove(item)
+            for item in add:
+                self.add(item)
+            return self
+        _tidy(__ixor__)
+        return __ixor__
+
+    l = locals().copy()
+    l.pop('_tidy')
+    l.pop('Unspecified')
+    return l
+
+
+class InstrumentedList(list):
+    """An instrumented version of the built-in list."""
+
+    __instrumentation__ = {
+       'appender': 'append',
+       'remover': 'remove',
+       'iterator': '__iter__', }
+
+class InstrumentedSet(set):
+    """An instrumented version of the built-in set."""
+
+    __instrumentation__ = {
+       'appender': 'add',
+       'remover': 'remove',
+       'iterator': '__iter__', }
+
+class InstrumentedDict(dict):
+    """An instrumented version of the built-in dict."""
+
+    __instrumentation__ = {
+        'iterator': 'itervalues', }
+
+__canned_instrumentation = {
+    list: InstrumentedList,
+    set: InstrumentedSet,
+    dict: InstrumentedDict,
+    }
+
+__interfaces = {
+    list: {'appender': 'append',
+           'remover': 'remove',
+           'iterator': '__iter__',
+           '_decorators': _list_decorators(), },
+    set: {'appender': 'add',
+          'remover': 'remove',
+          'iterator': '__iter__',
+          '_decorators': _set_decorators(), },
+    # decorators are required for dicts and object collections.
+    dict: {'iterator': 'itervalues',
+           '_decorators': _dict_decorators(), },
+    # < 0.4 compatible naming, deprecated- use decorators instead.
+    None: {}
+    }
+
+class MappedCollection(dict):
+    """A basic dictionary-based collection class.
+
+    Extends dict with the minimal bag semantics that collection classes require.
+    ``set`` and ``remove`` are implemented in terms of a keying function: any
+    callable that takes an object and returns an object for use as a dictionary
+    key.
+
+    """
+
+    def __init__(self, keyfunc):
+        """Create a new collection with keying provided by keyfunc.
+
+        keyfunc may be any callable any callable that takes an object and
+        returns an object for use as a dictionary key.
+
+        The keyfunc will be called every time the ORM needs to add a member by
+        value-only (such as when loading instances from the database) or
+        remove a member.  The usual cautions about dictionary keying apply-
+        ``keyfunc(object)`` should return the same output for the life of the
+        collection.  Keying based on mutable properties can result in
+        unreachable instances "lost" in the collection.
+
+        """
+        self.keyfunc = keyfunc
+
+    def set(self, value, _sa_initiator=None):
+        """Add an item by value, consulting the keyfunc for the key."""
+
+        key = self.keyfunc(value)
+        self.__setitem__(key, value, _sa_initiator)
+    set = collection.internally_instrumented(set)
+    set = collection.appender(set)
+
+    def remove(self, value, _sa_initiator=None):
+        """Remove an item by value, consulting the keyfunc for the key."""
+
+        key = self.keyfunc(value)
+        # Let self[key] raise if key is not in this collection
+        # testlib.pragma exempt:__ne__
+        if self[key] != value:
+            raise sa_exc.InvalidRequestError(
+                "Can not remove '%s': collection holds '%s' for key '%s'. "
+                "Possible cause: is the MappedCollection key function "
+                "based on mutable properties or properties that only obtain "
+                "values after flush?" %
+                (value, self[key], key))
+        self.__delitem__(key, _sa_initiator)
+    remove = collection.internally_instrumented(remove)
+    remove = collection.remover(remove)
+
+    def _convert(self, dictlike):
+        """Validate and convert a dict-like object into values for set()ing.
+
+        This is called behind the scenes when a MappedCollection is replaced
+        entirely by another collection, as in::
+
+          myobj.mappedcollection = {'a':obj1, 'b': obj2} # ...
+
+        Raises a TypeError if the key in any (key, value) pair in the dictlike
+        object does not match the key that this collection's keyfunc would
+        have assigned for that value.
+
+        """
+        for incoming_key, value in util.dictlike_iteritems(dictlike):
+            new_key = self.keyfunc(value)
+            if incoming_key != new_key:
+                raise TypeError(
+                    "Found incompatible key %r for value %r; this collection's "
+                    "keying function requires a key of %r for this value." % (
+                    incoming_key, value, new_key))
+            yield value
+    _convert = collection.converter(_convert)
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/orm/exc.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/orm/exc.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/orm/exc.py (revision 3)
@@ -0,0 +1,98 @@
+# exc.py - ORM exceptions
+# Copyright (C) the SQLAlchemy authors and contributors
+#
+# This module is part of SQLAlchemy and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+"""SQLAlchemy ORM exceptions."""
+
+import sqlalchemy as sa
+
+
+NO_STATE = (AttributeError, KeyError)
+"""Exception types that may be raised by instrumentation implementations."""
+
+class ConcurrentModificationError(sa.exc.SQLAlchemyError):
+    """Rows have been modified outside of the unit of work."""
+
+
+class FlushError(sa.exc.SQLAlchemyError):
+    """A invalid condition was detected during flush()."""
+
+
+class UnmappedError(sa.exc.InvalidRequestError):
+    """TODO"""
+
+
+class UnmappedInstanceError(UnmappedError):
+    """An mapping operation was requested for an unknown instance."""
+
+    def __init__(self, obj, msg=None):
+        if not msg:
+            try:
+                mapper = sa.orm.class_mapper(type(obj))
+                name = _safe_cls_name(type(obj))
+                msg = ("Class %r is mapped, but this instance lacks "
+                       "instrumentation.  Possible causes: instance created "
+                       "before sqlalchemy.orm.mapper(%s) was called, or "
+                       "instance was pickled/depickled without instrumentation"
+                       "information." % (name, name))
+            except UnmappedClassError:
+                msg = _default_unmapped(type(obj))
+                if isinstance(obj, type):
+                    msg += (
+                        '; was a class (%s) supplied where an instance was '
+                        'required?' % _safe_cls_name(obj))
+        UnmappedError.__init__(self, msg)
+
+
+class UnmappedClassError(UnmappedError):
+    """An mapping operation was requested for an unknown class."""
+
+    def __init__(self, cls, msg=None):
+        if not msg:
+            msg = _default_unmapped(cls)
+        UnmappedError.__init__(self, msg)
+
+
+class ObjectDeletedError(sa.exc.InvalidRequestError):
+    """An refresh() operation failed to re-retrieve an object's row."""
+
+
+class UnmappedColumnError(sa.exc.InvalidRequestError):
+    """Mapping operation was requested on an unknown column."""
+
+
+class NoResultFound(sa.exc.InvalidRequestError):
+    """A database result was required but none was found."""
+
+
+class MultipleResultsFound(sa.exc.InvalidRequestError):
+    """A single database result was required but more than one were found."""
+
+
+# Legacy compat until 0.6.
+sa.exc.ConcurrentModificationError = ConcurrentModificationError
+sa.exc.FlushError = FlushError
+sa.exc.UnmappedColumnError
+
+def _safe_cls_name(cls):
+    try:
+        cls_name = '.'.join((cls.__module__, cls.__name__))
+    except AttributeError:
+        cls_name = getattr(cls, '__name__', None)
+        if cls_name is None:
+            cls_name = repr(cls)
+    return cls_name
+
+def _default_unmapped(cls):
+    try:
+        mappers = sa.orm.attributes.manager_of_class(cls).mappers
+    except NO_STATE:
+        mappers = {}
+    except TypeError:
+        mappers = {}
+    name = _safe_cls_name(cls)
+
+    if not mappers:
+        return "Class '%s' is not mapped" % name
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/orm/state.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/orm/state.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/orm/state.py (revision 3)
@@ -0,0 +1,456 @@
+from sqlalchemy.util import EMPTY_SET
+import weakref
+from sqlalchemy import util
+from sqlalchemy.orm.attributes import PASSIVE_NORESULT, PASSIVE_OFF, NEVER_SET, NO_VALUE, manager_of_class, ATTR_WAS_SET
+from sqlalchemy.orm import attributes
+from sqlalchemy.orm import interfaces
+
+class InstanceState(object):
+    """tracks state information at the instance level."""
+
+    session_id = None
+    key = None
+    runid = None
+    expired_attributes = EMPTY_SET
+    load_options = EMPTY_SET
+    load_path = ()
+    insert_order = None
+    mutable_dict = None
+    _strong_obj = None
+    
+    def __init__(self, obj, manager):
+        self.class_ = obj.__class__
+        self.manager = manager
+        self.obj = weakref.ref(obj, self._cleanup)
+        self.modified = False
+        self.callables = {}
+        self.expired = False
+        self.committed_state = {}
+        self.pending = {}
+        self.parents = {}
+        
+    def detach(self):
+        if self.session_id:
+            del self.session_id
+
+    def dispose(self):
+        if self.session_id:
+            del self.session_id
+        del self.obj
+    
+    def _cleanup(self, ref):
+        instance_dict = self._instance_dict()
+        if instance_dict:
+            instance_dict.remove(self)
+        self.dispose()
+    
+    def obj(self):
+        return None
+    
+    @property
+    def dict(self):
+        o = self.obj()
+        if o is not None:
+            return attributes.instance_dict(o)
+        else:
+            return {}
+        
+    @property
+    def sort_key(self):
+        return self.key and self.key[1] or (self.insert_order, )
+
+    def check_modified(self):
+        # TODO: deprecate
+        return self.modified
+
+    def initialize_instance(*mixed, **kwargs):
+        self, instance, args = mixed[0], mixed[1], mixed[2:]
+        manager = self.manager
+
+        for fn in manager.events.on_init:
+            fn(self, instance, args, kwargs)
+            
+        # LESSTHANIDEAL:
+        # adjust for the case where the InstanceState was created before
+        # mapper compilation, and this actually needs to be a MutableAttrInstanceState
+        if manager.mutable_attributes and self.__class__ is not MutableAttrInstanceState:
+            self.__class__ = MutableAttrInstanceState
+            self.obj = weakref.ref(self.obj(), self._cleanup)
+            self.mutable_dict = {}
+            
+        try:
+            return manager.events.original_init(*mixed[1:], **kwargs)
+        except:
+            for fn in manager.events.on_init_failure:
+                fn(self, instance, args, kwargs)
+            raise
+
+    def get_history(self, key, **kwargs):
+        return self.manager.get_impl(key).get_history(self, self.dict, **kwargs)
+
+    def get_impl(self, key):
+        return self.manager.get_impl(key)
+
+    def get_pending(self, key):
+        if key not in self.pending:
+            self.pending[key] = PendingCollection()
+        return self.pending[key]
+
+    def value_as_iterable(self, key, passive=PASSIVE_OFF):
+        """return an InstanceState attribute as a list,
+        regardless of it being a scalar or collection-based
+        attribute.
+
+        returns None if passive is not PASSIVE_OFF and the getter returns
+        PASSIVE_NORESULT.
+        """
+
+        impl = self.get_impl(key)
+        dict_ = self.dict
+        x = impl.get(self, dict_, passive=passive)
+        if x is PASSIVE_NORESULT:
+            return None
+        elif hasattr(impl, 'get_collection'):
+            return impl.get_collection(self, dict_, x, passive=passive)
+        else:
+            return [x]
+
+    def _run_on_load(self, instance):
+        self.manager.events.run('on_load', instance)
+
+    def __getstate__(self):
+        d = {
+            'instance':self.obj(),
+        }
+
+        d.update(
+            (k, self.__dict__[k]) for k in (
+                'committed_state', 'pending', 'parents', 'modified', 'expired', 
+                'callables'
+            ) if self.__dict__[k]
+        )
+        
+        d.update(
+            (k, self.__dict__[k]) for k in (
+                'key', 'load_options', 'expired_attributes', 'mutable_dict'
+            ) if k in self.__dict__ 
+        )
+        if self.load_path:
+            d['load_path'] = interfaces.serialize_path(self.load_path)
+        return d
+        
+    def __setstate__(self, state):
+        self.obj = weakref.ref(state['instance'], self._cleanup)
+        self.class_ = state['instance'].__class__
+        self.manager = manager_of_class(self.class_)
+
+        self.committed_state = state.get('committed_state', {})
+        self.pending = state.get('pending', {})
+        self.parents = state.get('parents', {})
+        self.modified = state.get('modified', False)
+        self.expired = state.get('expired', False)
+        self.callables = state.get('callables', {})
+        
+        if self.modified:
+            self._strong_obj = state['instance']
+            
+        self.__dict__.update(
+            (k, state[k]) for k in (
+                'key', 'load_options', 'expired_attributes', 'mutable_dict'
+            ) if k in state 
+        )
+
+        if 'load_path' in state:
+            self.load_path = interfaces.deserialize_path(state['load_path'])
+
+    def initialize(self, key):
+        self.manager.get_impl(key).initialize(self, self.dict)
+
+    def set_callable(self, key, callable_):
+        self.dict.pop(key, None)
+        self.callables[key] = callable_
+
+    def __call__(self):
+        """__call__ allows the InstanceState to act as a deferred
+        callable for loading expired attributes, which is also
+        serializable (picklable).
+
+        """
+        unmodified = self.unmodified
+        class_manager = self.manager
+        class_manager.deferred_scalar_loader(self, [
+            attr.impl.key for attr in class_manager.attributes if
+                attr.impl.accepts_scalar_loader and
+                attr.impl.key in self.expired_attributes and
+                attr.impl.key in unmodified
+            ])
+        for k in self.expired_attributes:
+            self.callables.pop(k, None)
+        del self.expired_attributes
+        return ATTR_WAS_SET
+
+    @property
+    def unmodified(self):
+        """a set of keys which have no uncommitted changes"""
+        
+        return set(self.manager).difference(self.committed_state)
+
+    @property
+    def unloaded(self):
+        """a set of keys which do not have a loaded value.
+
+        This includes expired attributes and any other attribute that
+        was never populated or modified.
+
+        """
+        return set(
+            key for key in self.manager.iterkeys()
+            if key not in self.committed_state and key not in self.dict)
+
+    def expire_attributes(self, attribute_names, instance_dict=None):
+        self.expired_attributes = set(self.expired_attributes)
+
+        if attribute_names is None:
+            attribute_names = self.manager.keys()
+            self.expired = True
+            if self.modified:
+                if not instance_dict:
+                    instance_dict = self._instance_dict()
+                    if instance_dict:
+                        instance_dict._modified.discard(self)
+                else:
+                    instance_dict._modified.discard(self)
+                    
+            self.modified = False
+            filter_deferred = True
+        else:
+            filter_deferred = False
+        dict_ = self.dict
+        
+        for key in attribute_names:
+            impl = self.manager[key].impl
+            if not filter_deferred or \
+                not impl.dont_expire_missing or \
+                key in dict_:
+                self.expired_attributes.add(key)
+                if impl.accepts_scalar_loader:
+                    self.callables[key] = self
+            dict_.pop(key, None)
+            self.pending.pop(key, None)
+            self.committed_state.pop(key, None)
+            if self.mutable_dict:
+                self.mutable_dict.pop(key, None)
+                
+    def reset(self, key, dict_):
+        """remove the given attribute and any callables associated with it."""
+
+        dict_.pop(key, None)
+        self.callables.pop(key, None)
+
+    def _instance_dict(self):
+        return None
+
+    def _is_really_none(self):
+        return self.obj()
+        
+    def modified_event(self, dict_, attr, should_copy, previous, passive=PASSIVE_OFF):
+        needs_committed = attr.key not in self.committed_state
+
+        if needs_committed:
+            if previous is NEVER_SET:
+                if passive:
+                    if attr.key in dict_:
+                        previous = dict_[attr.key]
+                else:
+                    previous = attr.get(self, dict_)
+
+            if should_copy and previous not in (None, NO_VALUE, NEVER_SET):
+                previous = attr.copy(previous)
+
+            if needs_committed:
+                self.committed_state[attr.key] = previous
+
+        if not self.modified:
+            instance_dict = self._instance_dict()
+            if instance_dict:
+                instance_dict._modified.add(self)
+
+        self.modified = True
+        if self._strong_obj is None:
+            self._strong_obj = self.obj()
+
+    def commit(self, dict_, keys):
+        """Commit attributes.
+
+        This is used by a partial-attribute load operation to mark committed
+        those attributes which were refreshed from the database.
+
+        Attributes marked as "expired" can potentially remain "expired" after
+        this step if a value was not populated in state.dict.
+
+        """
+        class_manager = self.manager
+        for key in keys:
+            if key in dict_ and key in class_manager.mutable_attributes:
+                class_manager[key].impl.commit_to_state(self, dict_, self.committed_state)
+            else:
+                self.committed_state.pop(key, None)
+
+        self.expired = False
+        # unexpire attributes which have loaded
+        for key in self.expired_attributes.intersection(keys):
+            if key in dict_:
+                self.expired_attributes.remove(key)
+                self.callables.pop(key, None)
+
+    def commit_all(self, dict_, instance_dict=None):
+        """commit all attributes unconditionally.
+
+        This is used after a flush() or a full load/refresh
+        to remove all pending state from the instance.
+
+         - all attributes are marked as "committed"
+         - the "strong dirty reference" is removed
+         - the "modified" flag is set to False
+         - any "expired" markers/callables are removed.
+
+        Attributes marked as "expired" can potentially remain "expired" after this step
+        if a value was not populated in state.dict.
+
+        """
+        
+        self.committed_state = {}
+        self.pending = {}
+        
+        # unexpire attributes which have loaded
+        if self.expired_attributes:
+            for key in self.expired_attributes.intersection(dict_):
+                self.callables.pop(key, None)
+            self.expired_attributes.difference_update(dict_)
+
+        for key in self.manager.mutable_attributes:
+            if key in dict_:
+                self.manager[key].impl.commit_to_state(self, dict_, self.committed_state)
+
+        if instance_dict and self.modified:
+            instance_dict._modified.discard(self)
+
+        self.modified = self.expired = False
+        self._strong_obj = None
+
+class MutableAttrInstanceState(InstanceState):
+    def __init__(self, obj, manager):
+        self.mutable_dict = {}
+        InstanceState.__init__(self, obj, manager)
+        
+    def _get_modified(self, dict_=None):
+        if self.__dict__.get('modified', False):
+            return True
+        else:
+            if dict_ is None:
+                dict_ = self.dict
+            for key in self.manager.mutable_attributes:
+                if self.manager[key].impl.check_mutable_modified(self, dict_):
+                    return True
+            else:
+                return False
+    
+    def _set_modified(self, value):
+        self.__dict__['modified'] = value
+        
+    modified = property(_get_modified, _set_modified)
+    
+    @property
+    def unmodified(self):
+        """a set of keys which have no uncommitted changes"""
+
+        dict_ = self.dict
+        return set(
+            key for key in self.manager.iterkeys()
+            if (key not in self.committed_state or
+                (key in self.manager.mutable_attributes and
+                 not self.manager[key].impl.check_mutable_modified(self, dict_))))
+
+    def _is_really_none(self):
+        """do a check modified/resurrect.
+        
+        This would be called in the extremely rare
+        race condition that the weakref returned None but
+        the cleanup handler had not yet established the 
+        __resurrect callable as its replacement.
+        
+        """
+        if self.modified:
+            self.obj = self.__resurrect
+            return self.obj()
+        else:
+            return None
+
+    def reset(self, key, dict_):
+        self.mutable_dict.pop(key, None)
+        InstanceState.reset(self, key, dict_)
+    
+    def _cleanup(self, ref):
+        """weakref callback.
+        
+        This method may be called by an asynchronous
+        gc.
+        
+        If the state shows pending changes, the weakref
+        is replaced by the __resurrect callable which will
+        re-establish an object reference on next access,
+        else removes this InstanceState from the owning
+        identity map, if any.
+        
+        """
+        if self._get_modified(self.mutable_dict):
+            self.obj = self.__resurrect
+        else:
+            instance_dict = self._instance_dict()
+            if instance_dict:
+                instance_dict.remove(self)
+            self.dispose()
+            
+    def __resurrect(self):
+        """A substitute for the obj() weakref function which resurrects."""
+        
+        # store strong ref'ed version of the object; will revert
+        # to weakref when changes are persisted
+        
+        obj = self.manager.new_instance(state=self)
+        self.obj = weakref.ref(obj, self._cleanup)
+        self._strong_obj = obj
+        obj.__dict__.update(self.mutable_dict)
+
+        # re-establishes identity attributes from the key
+        self.manager.events.run('on_resurrect', self, obj)
+        
+        # TODO: don't really think we should run this here.
+        # resurrect is only meant to preserve the minimal state needed to
+        # do an UPDATE, not to produce a fully usable object
+        self._run_on_load(obj)
+        
+        return obj
+
+class PendingCollection(object):
+    """A writable placeholder for an unloaded collection.
+
+    Stores items appended to and removed from a collection that has not yet
+    been loaded. When the collection is loaded, the changes stored in
+    PendingCollection are applied to it to produce the final result.
+
+    """
+    def __init__(self):
+        self.deleted_items = util.IdentitySet()
+        self.added_items = util.OrderedIdentitySet()
+
+    def append(self, value):
+        if value in self.deleted_items:
+            self.deleted_items.remove(value)
+        self.added_items.add(value)
+
+    def remove(self, value):
+        if value in self.added_items:
+            self.added_items.remove(value)
+        self.deleted_items.add(value)
+
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/orm/session.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/orm/session.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/orm/session.py (revision 3)
@@ -0,0 +1,1612 @@
+# session.py
+# Copyright (C) 2005, 2006, 2007, 2008, 2009 Michael Bayer mike_mp@zzzcomputing.com
+#
+# This module is part of SQLAlchemy and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+"""Provides the Session class and related utilities."""
+
+import weakref
+from itertools import chain
+import sqlalchemy.exceptions as sa_exc
+from sqlalchemy import util, sql, engine, log
+from sqlalchemy.sql import util as sql_util, expression
+from sqlalchemy.orm import (
+    SessionExtension, attributes, exc, query, unitofwork, util as mapperutil, state
+    )
+from sqlalchemy.orm.util import object_mapper as _object_mapper
+from sqlalchemy.orm.util import class_mapper as _class_mapper
+from sqlalchemy.orm.util import (
+    _class_to_mapper, _state_has_identity, _state_mapper,
+    )
+from sqlalchemy.orm.mapper import Mapper
+from sqlalchemy.orm.unitofwork import UOWTransaction
+from sqlalchemy.orm import identity
+
+__all__ = ['Session', 'SessionTransaction', 'SessionExtension']
+
+
+def sessionmaker(bind=None, class_=None, autoflush=True, autocommit=False,
+                 expire_on_commit=True, **kwargs):
+    """Generate a custom-configured :class:`~sqlalchemy.orm.session.Session` class.
+
+    The returned object is a subclass of ``Session``, which, when instantiated
+    with no arguments, uses the keyword arguments configured here as its
+    constructor arguments.
+
+    It is intended that the `sessionmaker()` function be called within the
+    global scope of an application, and the returned class be made available
+    to the rest of the application as the single class used to instantiate
+    sessions.
+
+    e.g.::
+
+        # global scope
+        Session = sessionmaker(autoflush=False)
+
+        # later, in a local scope, create and use a session:
+        sess = Session()
+
+    Any keyword arguments sent to the constructor itself will override the
+    "configured" keywords::
+
+        Session = sessionmaker()
+
+        # bind an individual session to a connection
+        sess = Session(bind=connection)
+
+    The class also includes a special classmethod ``configure()``, which
+    allows additional configurational options to take place after the custom
+    ``Session`` class has been generated.  This is useful particularly for
+    defining the specific ``Engine`` (or engines) to which new instances of
+    ``Session`` should be bound::
+
+        Session = sessionmaker()
+        Session.configure(bind=create_engine('sqlite:///foo.db'))
+
+        sess = Session()
+
+    Options:
+
+    autocommit
+      Defaults to ``False``. When ``True``, the ``Session`` does not keep a
+      persistent transaction running, and will acquire connections from the
+      engine on an as-needed basis, returning them immediately after their
+      use. Flushes will begin and commit (or possibly rollback) their own
+      transaction if no transaction is present. When using this mode, the
+      `session.begin()` method may be used to begin a transaction explicitly.
+
+      Leaving it on its default value of ``False`` means that the ``Session``
+      will acquire a connection and begin a transaction the first time it is
+      used, which it will maintain persistently until ``rollback()``,
+      ``commit()``, or ``close()`` is called. When the transaction is released
+      by any of these methods, the ``Session`` is ready for the next usage,
+      which will again acquire and maintain a new connection/transaction.
+
+    autoflush
+      When ``True``, all query operations will issue a ``flush()`` call to
+      this ``Session`` before proceeding. This is a convenience feature so
+      that ``flush()`` need not be called repeatedly in order for database
+      queries to retrieve results. It's typical that ``autoflush`` is used in
+      conjunction with ``autocommit=False``.  In this scenario, explicit calls
+      to ``flush()`` are rarely needed; you usually only need to call
+      ``commit()`` (which flushes) to finalize changes.
+
+    bind
+      An optional ``Engine`` or ``Connection`` to which this ``Session``
+      should be bound. When specified, all SQL operations performed by this
+      session will execute via this connectable.
+
+    binds
+      An optional dictionary, which contains more granular "bind" information
+      than the ``bind`` parameter provides. This dictionary can map individual
+      ``Table`` instances as well as ``Mapper`` instances to individual
+      ``Engine`` or ``Connection`` objects. Operations which proceed relative
+      to a particular ``Mapper`` will consult this dictionary for the direct
+      ``Mapper`` instance as well as the mapper's ``mapped_table`` attribute
+      in order to locate an connectable to use. The full resolution is
+      described in the ``get_bind()`` method of ``Session``. Usage looks
+      like::
+
+        sess = Session(binds={
+            SomeMappedClass: create_engine('postgres://engine1'),
+            somemapper: create_engine('postgres://engine2'),
+            some_table: create_engine('postgres://engine3'),
+            })
+
+      Also see the ``bind_mapper()`` and ``bind_table()`` methods.
+
+    \class_
+      Specify an alternate class other than ``sqlalchemy.orm.session.Session``
+      which should be used by the returned class.  This is the only argument
+      that is local to the ``sessionmaker()`` function, and is not sent
+      directly to the constructor for ``Session``.
+
+    echo_uow
+      Deprecated.  Use
+      ``logging.getLogger('sqlalchemy.orm.unitofwork').setLevel(logging.DEBUG)``.
+
+    _enable_transaction_accounting
+      Defaults to ``True``.  A legacy-only flag which when ``False``
+      disables *all* 0.5-style object accounting on transaction boundaries,
+      including auto-expiry of instances on rollback and commit, maintenance of
+      the "new" and "deleted" lists upon rollback, and autoflush
+      of pending changes upon begin(), all of which are interdependent.
+
+    expire_on_commit
+      Defaults to ``True``. When ``True``, all instances will be fully expired after
+      each ``commit()``, so that all attribute/object access subsequent to a completed
+      transaction will load from the most recent database state.
+
+    extension
+      An optional :class:`~sqlalchemy.orm.session.SessionExtension` instance, or
+      a list of such instances, which
+      will receive pre- and post- commit and flush events, as well as a
+      post-rollback event.  User- defined code may be placed within these
+      hooks using a user-defined subclass of ``SessionExtension``.
+
+    query_cls
+      Class which should be used to create new Query objects, as returned
+      by the ``query()`` method.  Defaults to :class:`~sqlalchemy.orm.query.Query`.
+
+    twophase
+      When ``True``, all transactions will be started using
+      :mod:~sqlalchemy.engine_TwoPhaseTransaction. During a ``commit()``, after
+      ``flush()`` has been issued for all attached databases, the
+      ``prepare()`` method on each database's ``TwoPhaseTransaction`` will be
+      called. This allows each database to roll back the entire transaction,
+      before each transaction is committed.
+
+    weak_identity_map
+      When set to the default value of ``True``, a weak-referencing map is
+      used; instances which are not externally referenced will be garbage
+      collected immediately. For dereferenced instances which have pending
+      changes present, the attribute management system will create a temporary
+      strong-reference to the object which lasts until the changes are flushed
+      to the database, at which point it's again dereferenced. Alternatively,
+      when using the value ``False``, the identity map uses a regular Python
+      dictionary to store instances. The session will maintain all instances
+      present until they are removed using expunge(), clear(), or purge().
+
+    """
+    if 'transactional' in kwargs:
+        util.warn_deprecated(
+            "The 'transactional' argument to sessionmaker() is deprecated; "
+            "use autocommit=True|False instead.")
+        autocommit = not kwargs.pop('transactional')
+
+    kwargs['bind'] = bind
+    kwargs['autoflush'] = autoflush
+    kwargs['autocommit'] = autocommit
+    kwargs['expire_on_commit'] = expire_on_commit
+
+    if class_ is None:
+        class_ = Session
+
+    class Sess(object):
+        def __init__(self, **local_kwargs):
+            for k in kwargs:
+                local_kwargs.setdefault(k, kwargs[k])
+            super(Sess, self).__init__(**local_kwargs)
+
+        def configure(self, **new_kwargs):
+            """(Re)configure the arguments for this sessionmaker.
+
+            e.g.::
+
+                Session = sessionmaker()
+
+                Session.configure(bind=create_engine('sqlite://'))
+            """
+            kwargs.update(new_kwargs)
+        configure = classmethod(configure)
+    s = type.__new__(type, "Session", (Sess, class_), {})
+    return s
+
+
+class SessionTransaction(object):
+    """A Session-level transaction.
+
+    This corresponds to one or more :class:`~sqlalchemy.engine.Transaction`
+    instances behind the scenes, with one ``Transaction`` per ``Engine`` in
+    use.
+
+    Direct usage of ``SessionTransaction`` is not necessary as of SQLAlchemy
+    0.4; use the ``begin()`` and ``commit()`` methods on ``Session`` itself.
+
+    The ``SessionTransaction`` object is **not** thread-safe.
+
+    .. index::
+      single: thread safety; SessionTransaction
+
+    """
+
+    def __init__(self, session, parent=None, nested=False):
+        self.session = session
+        self._connections = {}
+        self._parent = parent
+        self.nested = nested
+        self._active = True
+        self._prepared = False
+        if not parent and nested:
+            raise sa_exc.InvalidRequestError(
+                "Can't start a SAVEPOINT transaction when no existing "
+                "transaction is in progress")
+
+        if self.session._enable_transaction_accounting:
+            self._take_snapshot()
+
+    @property
+    def is_active(self):
+        return self.session is not None and self._active
+
+    def _assert_is_active(self):
+        self._assert_is_open()
+        if not self._active:
+            raise sa_exc.InvalidRequestError(
+                "The transaction is inactive due to a rollback in a "
+                "subtransaction.  Issue rollback() to cancel the transaction.")
+
+    def _assert_is_open(self, error_msg="The transaction is closed"):
+        if self.session is None:
+            raise sa_exc.InvalidRequestError(error_msg)
+
+    @property
+    def _is_transaction_boundary(self):
+        return self.nested or not self._parent
+
+    def connection(self, bindkey, **kwargs):
+        self._assert_is_active()
+        engine = self.session.get_bind(bindkey, **kwargs)
+        return self._connection_for_bind(engine)
+
+    def _begin(self, nested=False):
+        self._assert_is_active()
+        return SessionTransaction(
+            self.session, self, nested=nested)
+
+    def _iterate_parents(self, upto=None):
+        if self._parent is upto:
+            return (self,)
+        else:
+            if self._parent is None:
+                raise sa_exc.InvalidRequestError(
+                    "Transaction %s is not on the active transaction list" % (
+                    upto))
+            return (self,) + self._parent._iterate_parents(upto)
+
+    def _take_snapshot(self):
+        if not self._is_transaction_boundary:
+            self._new = self._parent._new
+            self._deleted = self._parent._deleted
+            return
+
+        if not self.session._flushing:
+            self.session.flush()
+
+        self._new = weakref.WeakKeyDictionary()
+        self._deleted = weakref.WeakKeyDictionary()
+
+    def _restore_snapshot(self):
+        assert self._is_transaction_boundary
+
+        for s in set(self._deleted).union(self.session._deleted):
+            self.session._update_impl(s)
+
+        assert not self.session._deleted
+
+        for s in set(self._new).union(self.session._new):
+            self.session._expunge_state(s)
+
+        for s in self.session.identity_map.all_states():
+            _expire_state(s, None, instance_dict=self.session.identity_map)
+
+    def _remove_snapshot(self):
+        assert self._is_transaction_boundary
+
+        if not self.nested and self.session.expire_on_commit:
+            for s in self.session.identity_map.all_states():
+                _expire_state(s, None, instance_dict=self.session.identity_map)
+
+    def _connection_for_bind(self, bind):
+        self._assert_is_active()
+
+        if bind in self._connections:
+            return self._connections[bind][0]
+
+        if self._parent:
+            conn = self._parent._connection_for_bind(bind)
+            if not self.nested:
+                return conn
+        else:
+            if isinstance(bind, engine.Connection):
+                conn = bind
+                if conn.engine in self._connections:
+                    raise sa_exc.InvalidRequestError(
+                        "Session already has a Connection associated for the "
+                        "given Connection's Engine")
+            else:
+                conn = bind.contextual_connect()
+
+        if self.session.twophase and self._parent is None:
+            transaction = conn.begin_twophase()
+        elif self.nested:
+            transaction = conn.begin_nested()
+        else:
+            transaction = conn.begin()
+
+        self._connections[conn] = self._connections[conn.engine] = \
+          (conn, transaction, conn is not bind)
+        for ext in self.session.extensions:
+            ext.after_begin(self.session, self, conn)
+        return conn
+
+    def prepare(self):
+        if self._parent is not None or not self.session.twophase:
+            raise sa_exc.InvalidRequestError(
+                "Only root two phase transactions of can be prepared")
+        self._prepare_impl()
+
+    def _prepare_impl(self):
+        self._assert_is_active()
+        if self._parent is None or self.nested:
+            for ext in self.session.extensions:
+                ext.before_commit(self.session)
+
+        stx = self.session.transaction
+        if stx is not self:
+            for subtransaction in stx._iterate_parents(upto=self):
+                subtransaction.commit()
+
+        if not self.session._flushing:
+            self.session.flush()
+
+        if self._parent is None and self.session.twophase:
+            try:
+                for t in set(self._connections.values()):
+                    t[1].prepare()
+            except:
+                self.rollback()
+                raise
+
+        self._deactivate()
+        self._prepared = True
+
+    def commit(self):
+        self._assert_is_open()
+        if not self._prepared:
+            self._prepare_impl()
+
+        if self._parent is None or self.nested:
+            for t in set(self._connections.values()):
+                t[1].commit()
+
+            for ext in self.session.extensions:
+                ext.after_commit(self.session)
+
+            if self.session._enable_transaction_accounting:
+                self._remove_snapshot()
+
+        self.close()
+        return self._parent
+
+    def rollback(self):
+        self._assert_is_open()
+
+        stx = self.session.transaction
+        if stx is not self:
+            for subtransaction in stx._iterate_parents(upto=self):
+                subtransaction.close()
+
+        if self.is_active or self._prepared:
+            for transaction in self._iterate_parents():
+                if transaction._parent is None or transaction.nested:
+                    transaction._rollback_impl()
+                    transaction._deactivate()
+                    break
+                else:
+                    transaction._deactivate()
+
+        self.close()
+        return self._parent
+
+    def _rollback_impl(self):
+        for t in set(self._connections.values()):
+            t[1].rollback()
+
+        if self.session._enable_transaction_accounting:
+            self._restore_snapshot()
+
+        for ext in self.session.extensions:
+            ext.after_rollback(self.session)
+
+    def _deactivate(self):
+        self._active = False
+
+    def close(self):
+        self.session.transaction = self._parent
+        if self._parent is None:
+            for connection, transaction, autoclose in set(self._connections.values()):
+                if autoclose:
+                    connection.close()
+                else:
+                    transaction.close()
+            if not self.session.autocommit:
+                self.session.begin()
+        self._deactivate()
+        self.session = None
+        self._connections = None
+
+    def __enter__(self):
+        return self
+
+    def __exit__(self, type, value, traceback):
+        self._assert_is_open("Cannot end transaction context. The transaction was closed from within the context")
+        if self.session.transaction is None:
+            return
+        if type is None:
+            try:
+                self.commit()
+            except:
+                self.rollback()
+                raise
+        else:
+            self.rollback()
+
+class Session(object):
+    """Manages persistence operations for ORM-mapped objects.
+
+    The Session is the front end to SQLAlchemy's **Unit of Work**
+    implementation.  The concept behind Unit of Work is to track modifications
+    to a field of objects, and then be able to flush those changes to the
+    database in a single operation.
+
+    SQLAlchemy's unit of work includes these functions:
+
+    * The ability to track in-memory changes on scalar- and collection-based
+      object attributes, such that database persistence operations can be
+      assembled based on those changes.
+
+    * The ability to organize individual SQL queries and population of newly
+      generated primary and foreign key-holding attributes during a persist
+      operation such that referential integrity is maintained at all times.
+
+    * The ability to maintain insert ordering against the order in which new
+      instances were added to the session.
+
+    * An Identity Map, which is a dictionary keying instances to their unique
+      primary key identity. This ensures that only one copy of a particular
+      entity is ever present within the session, even if repeated load
+      operations for the same entity occur. This allows many parts of an
+      application to get a handle to a particular object without any chance of
+      modifications going to two different places.
+
+    When dealing with instances of mapped classes, an instance may be
+    *attached* to a particular Session, else it is *unattached* . An instance
+    also may or may not correspond to an actual row in the database. These
+    conditions break up into four distinct states:
+
+    * *Transient* - an instance that's not in a session, and is not saved to
+      the database; i.e. it has no database identity. The only relationship
+      such an object has to the ORM is that its class has a ``mapper()``
+      associated with it.
+
+    * *Pending* - when you ``add()`` a transient instance, it becomes
+      pending. It still wasn't actually flushed to the database yet, but it
+      will be when the next flush occurs.
+
+    * *Persistent* - An instance which is present in the session and has a
+      record in the database. You get persistent instances by either flushing
+      so that the pending instances become persistent, or by querying the
+      database for existing instances (or moving persistent instances from
+      other sessions into your local session).
+
+    * *Detached* - an instance which has a record in the database, but is not
+      in any session. Theres nothing wrong with this, and you can use objects
+      normally when they're detached, **except** they will not be able to
+      issue any SQL in order to load collections or attributes which are not
+      yet loaded, or were marked as "expired".
+
+    The session methods which control instance state include ``add()``,
+    ``delete()``, ``merge()``, and ``expunge()``.
+
+    The Session object is generally **not** threadsafe.  A session which is
+    set to ``autocommit`` and is only read from may be used by concurrent
+    threads if it's acceptable that some object instances may be loaded twice.
+
+    The typical pattern to managing Sessions in a multi-threaded environment
+    is either to use mutexes to limit concurrent access to one thread at a
+    time, or more commonly to establish a unique session for every thread,
+    using a threadlocal variable.  SQLAlchemy provides a thread-managed
+    Session adapter, provided by the :func:`~sqlalchemy.orm.scoped_session`
+    function.
+
+    """
+
+    public_methods = (
+        '__contains__', '__iter__', 'add', 'add_all', 'begin', 'begin_nested',
+        'clear', 'close', 'commit', 'connection', 'delete', 'execute', 'expire',
+        'expire_all', 'expunge', 'expunge_all', 'flush', 'get_bind', 'is_modified', 
+        'merge', 'query', 'refresh', 'rollback', 'save',
+        'save_or_update', 'scalar', 'update')
+
+    def __init__(self, bind=None, autoflush=True, expire_on_commit=True,
+                _enable_transaction_accounting=True,
+                 autocommit=False, twophase=False, echo_uow=None,
+                 weak_identity_map=True, binds=None, extension=None, query_cls=query.Query):
+        """Construct a new Session.
+
+        Arguments to ``Session`` are described using the
+        :func:`~sqlalchemy.orm.sessionmaker` function.
+
+        """
+        
+        if echo_uow is not None:
+            util.warn_deprecated(
+                "echo_uow is deprecated. "
+                "Use logging.getLogger('sqlalchemy.orm.unitofwork').setLevel(logging.DEBUG).")
+            log.class_logger(UOWTransaction, echo_uow)
+
+        if weak_identity_map:
+            self._identity_cls = identity.WeakInstanceDict
+        else:
+            self._identity_cls = identity.StrongInstanceDict
+        self.identity_map = self._identity_cls()
+
+        self._new = {}   # InstanceState->object, strong refs object
+        self._deleted = {}  # same
+        self.bind = bind
+        self.__binds = {}
+        self._flushing = False
+        self.transaction = None
+        self.hash_key = id(self)
+        self.autoflush = autoflush
+        self.autocommit = autocommit
+        self.expire_on_commit = expire_on_commit
+        self._enable_transaction_accounting = _enable_transaction_accounting
+        self.twophase = twophase
+        self.extensions = util.to_list(extension) or []
+        self._query_cls = query_cls
+        self._mapper_flush_opts = {}
+
+        if binds is not None:
+            for mapperortable, value in binds.iteritems():
+                if isinstance(mapperortable, type):
+                    mapperortable = _class_mapper(mapperortable).base_mapper
+                self.__binds[mapperortable] = value
+                if isinstance(mapperortable, Mapper):
+                    for t in mapperortable._all_tables:
+                        self.__binds[t] = value
+
+        if not self.autocommit:
+            self.begin()
+        _sessions[self.hash_key] = self
+
+    def begin(self, subtransactions=False, nested=False):
+        """Begin a transaction on this Session.
+
+        If this Session is already within a transaction, either a plain
+        transaction or nested transaction, an error is raised, unless
+        ``subtransactions=True`` or ``nested=True`` is specified.
+
+        The ``subtransactions=True`` flag indicates that this ``begin()`` can
+        create a subtransaction if a transaction is already in progress.  A
+        subtransaction is a non-transactional, delimiting construct that
+        allows matching begin()/commit() pairs to be nested together, with
+        only the outermost begin/commit pair actually affecting transactional
+        state.  When a rollback is issued, the subtransaction will directly
+        roll back the innermost real transaction, however each subtransaction
+        still must be explicitly rolled back to maintain proper stacking of
+        subtransactions.
+
+        If no transaction is in progress, then a real transaction is begun.
+
+        The ``nested`` flag begins a SAVEPOINT transaction and is equivalent
+        to calling ``begin_nested()``.
+
+        """
+        if self.transaction is not None:
+            if subtransactions or nested:
+                self.transaction = self.transaction._begin(
+                    nested=nested)
+            else:
+                raise sa_exc.InvalidRequestError(
+                    "A transaction is already begun.  Use subtransactions=True "
+                    "to allow subtransactions.")
+        else:
+            self.transaction = SessionTransaction(
+                self, nested=nested)
+        return self.transaction  # needed for __enter__/__exit__ hook
+
+    def begin_nested(self):
+        """Begin a `nested` transaction on this Session.
+
+        The target database(s) must support SQL SAVEPOINTs or a
+        SQLAlchemy-supported vendor implementation of the idea.
+
+        The nested transaction is a real transation, unlike a "subtransaction"
+        which corresponds to multiple ``begin()`` calls.  The next
+        ``rollback()`` or ``commit()`` call will operate upon this nested
+        transaction.
+
+        """
+        return self.begin(nested=True)
+
+    def rollback(self):
+        """Rollback the current transaction in progress.
+
+        If no transaction is in progress, this method is a pass-through.
+
+        This method rolls back the current transaction or nested transaction
+        regardless of subtransactions being in effect.  All subtransactions up
+        to the first real transaction are closed.  Subtransactions occur when
+        begin() is called multiple times.
+
+        """
+        if self.transaction is None:
+            pass
+        else:
+            self.transaction.rollback()
+
+    def commit(self):
+        """Flush pending changes and commit the current transaction.
+
+        If no transaction is in progress, this method raises an
+        InvalidRequestError.
+
+        If a subtransaction is in effect (which occurs when begin() is called
+        multiple times), the subtransaction will be closed, and the next call
+        to ``commit()`` will operate on the enclosing transaction.
+
+        For a session configured with autocommit=False, a new transaction will
+        be begun immediately after the commit, but note that the newly begun
+        transaction does *not* use any connection resources until the first
+        SQL is actually emitted.
+
+        """
+        if self.transaction is None:
+            if not self.autocommit:
+                self.begin()
+            else:
+                raise sa_exc.InvalidRequestError("No transaction is begun.")
+
+        self.transaction.commit()
+
+    def prepare(self):
+        """Prepare the current transaction in progress for two phase commit.
+
+        If no transaction is in progress, this method raises an
+        InvalidRequestError.
+
+        Only root transactions of two phase sessions can be prepared. If the
+        current transaction is not such, an InvalidRequestError is raised.
+
+        """
+        if self.transaction is None:
+            if not self.autocommit:
+                self.begin()
+            else:
+                raise sa_exc.InvalidRequestError("No transaction is begun.")
+
+        self.transaction.prepare()
+
+    def connection(self, mapper=None, clause=None):
+        """Return the active Connection.
+
+        Retrieves the ``Connection`` managing the current transaction.  Any
+        operations executed on the Connection will take place in the same
+        transactional context as ``Session`` operations.
+
+        For ``autocommit`` Sessions with no active manual transaction,
+        ``connection()`` is a passthrough to ``contextual_connect()`` on the
+        underlying engine.
+
+        Ambiguity in multi-bind or unbound Sessions can be resolved through
+        any of the optional keyword arguments.  See ``get_bind()`` for more
+        information.
+
+        mapper
+          Optional, a ``mapper`` or mapped class
+
+        clause
+          Optional, any ``ClauseElement``
+
+        """
+        return self.__connection(self.get_bind(mapper, clause))
+
+    def __connection(self, engine, **kwargs):
+        if self.transaction is not None:
+            return self.transaction._connection_for_bind(engine)
+        else:
+            return engine.contextual_connect(**kwargs)
+
+    def execute(self, clause, params=None, mapper=None, **kw):
+        """Execute a clause within the current transaction.
+
+        Returns a ``ResultProxy`` of execution results.  `autocommit` Sessions
+        will create a transaction on the fly.
+
+        Connection ambiguity in multi-bind or unbound Sessions will be
+        resolved by inspecting the clause for binds.  The 'mapper' and
+        'instance' keyword arguments may be used if this is insufficient, See
+        ``get_bind()`` for more information.
+
+        clause
+            A ClauseElement (i.e. select(), text(), etc.) or
+            string SQL statement to be executed
+
+        params
+            Optional, a dictionary of bind parameters.
+
+        mapper
+          Optional, a ``mapper`` or mapped class
+
+        \**kw
+          Additional keyword arguments are sent to :meth:`get_bind()`
+          which locates a connectable to use for the execution.
+          Subclasses of :class:`Session` may override this.
+          
+        """
+        clause = expression._literal_as_text(clause)
+
+        engine = self.get_bind(mapper, clause=clause, **kw)
+
+        return self.__connection(engine, close_with_result=True).execute(
+            clause, params or {})
+
+    def scalar(self, clause, params=None, mapper=None, **kw):
+        """Like execute() but return a scalar result."""
+        
+        return self.execute(clause, params=params, mapper=mapper, **kw).scalar()
+
+    def close(self):
+        """Close this Session.
+
+        This clears all items and ends any transaction in progress.
+
+        If this session were created with ``autocommit=False``, a new
+        transaction is immediately begun.  Note that this new transaction does
+        not use any connection resources until they are first needed.
+
+        """
+        self.expunge_all()
+        if self.transaction is not None:
+            for transaction in self.transaction._iterate_parents():
+                transaction.close()
+
+    @classmethod
+    def close_all(cls):
+        """Close *all* sessions in memory."""
+
+        for sess in _sessions.values():
+            sess.close()
+
+    def expunge_all(self):
+        """Remove all object instances from this ``Session``.
+
+        This is equivalent to calling ``expunge(obj)`` on all objects in this
+        ``Session``.
+
+        """
+        for state in self.identity_map.all_states() + list(self._new):
+            state.detach()
+
+        self.identity_map = self._identity_cls()
+        self._new = {}
+        self._deleted = {}
+
+    clear = util.deprecated("Use session.expunge_all()")(expunge_all)
+
+    # TODO: need much more test coverage for bind_mapper() and similar !
+    # TODO: + crystalize + document resolution order vis. bind_mapper/bind_table
+
+    def bind_mapper(self, mapper, bind):
+        """Bind operations for a mapper to a Connectable.
+
+        mapper
+          A mapper instance or mapped class
+
+        bind
+          Any Connectable: a ``Engine`` or ``Connection``.
+
+        All subsequent operations involving this mapper will use the given
+        `bind`.
+
+        """
+        if isinstance(mapper, type):
+            mapper = _class_mapper(mapper)
+
+        self.__binds[mapper.base_mapper] = bind
+        for t in mapper._all_tables:
+            self.__binds[t] = bind
+
+    def bind_table(self, table, bind):
+        """Bind operations on a Table to a Connectable.
+
+        table
+          A ``Table`` instance
+
+        bind
+          Any Connectable: a ``Engine`` or ``Connection``.
+
+        All subsequent operations involving this ``Table`` will use the
+        given `bind`.
+
+        """
+        self.__binds[table] = bind
+
+    def get_bind(self, mapper, clause=None):
+        """Return an engine corresponding to the given arguments.
+
+        All arguments are optional.
+
+        mapper
+          Optional, a ``Mapper`` or mapped class
+
+        clause
+          Optional, A ClauseElement (i.e. select(), text(), etc.)
+
+        """
+        if mapper is clause is None:
+            if self.bind:
+                return self.bind
+            else:
+                raise sa_exc.UnboundExecutionError(
+                    "This session is not bound to a single Engine or "
+                    "Connection, and no context was provided to locate "
+                    "a binding.")
+
+        c_mapper = mapper is not None and _class_to_mapper(mapper) or None
+
+        # manually bound?
+        if self.__binds:
+            if c_mapper:
+                if c_mapper.base_mapper in self.__binds:
+                    return self.__binds[c_mapper.base_mapper]
+                elif c_mapper.mapped_table in self.__binds:
+                    return self.__binds[c_mapper.mapped_table]
+            if clause:
+                for t in sql_util.find_tables(clause):
+                    if t in self.__binds:
+                        return self.__binds[t]
+
+        if self.bind:
+            return self.bind
+
+        if isinstance(clause, sql.expression.ClauseElement) and clause.bind:
+            return clause.bind
+
+        if c_mapper and c_mapper.mapped_table.bind:
+            return c_mapper.mapped_table.bind
+
+        context = []
+        if mapper is not None:
+            context.append('mapper %s' % c_mapper)
+        if clause is not None:
+            context.append('SQL expression')
+
+        raise sa_exc.UnboundExecutionError(
+            "Could not locate a bind configured on %s or this Session" % (
+            ', '.join(context)))
+
+    def query(self, *entities, **kwargs):
+        """Return a new ``Query`` object corresponding to this ``Session``."""
+
+        return self._query_cls(entities, self, **kwargs)
+
+    def _autoflush(self):
+        if self.autoflush and not self._flushing:
+            self.flush()
+
+    def _finalize_loaded(self, states):
+        for state, dict_ in states.items():
+            state.commit_all(dict_, self.identity_map)
+
+    def refresh(self, instance, attribute_names=None):
+        """Refresh the attributes on the given instance.
+
+        A query will be issued to the database and all attributes will be
+        refreshed with their current database value.
+
+        Lazy-loaded relational attributes will remain lazily loaded, so that
+        the instance-wide refresh operation will be followed immediately by
+        the lazy load of that attribute.
+
+        Eagerly-loaded relational attributes will eagerly load within the
+        single refresh operation.
+
+        The ``attribute_names`` argument is an iterable collection of
+        attribute names indicating a subset of attributes to be refreshed.
+
+        """
+        try:
+            state = attributes.instance_state(instance)
+        except exc.NO_STATE:
+            raise exc.UnmappedInstanceError(instance)
+        self._validate_persistent(state)
+        if self.query(_object_mapper(instance))._get(
+                state.key, refresh_state=state,
+                only_load_props=attribute_names) is None:
+            raise sa_exc.InvalidRequestError(
+                "Could not refresh instance '%s'" %
+                mapperutil.instance_str(instance))
+
+    def expire_all(self):
+        """Expires all persistent instances within this Session."""
+
+        for state in self.identity_map.all_states():
+            _expire_state(state, None, instance_dict=self.identity_map)
+
+    def expire(self, instance, attribute_names=None):
+        """Expire the attributes on an instance.
+
+        Marks the attributes of an instance as out of date.  When an expired
+        attribute is next accessed, query will be issued to the database and
+        the attributes will be refreshed with their current database value.
+        ``expire()`` is a lazy variant of ``refresh()``.
+
+        The ``attribute_names`` argument is an iterable collection
+        of attribute names indicating a subset of attributes to be
+        expired.
+
+        """
+        try:
+            state = attributes.instance_state(instance)
+        except exc.NO_STATE:
+            raise exc.UnmappedInstanceError(instance)
+        self._validate_persistent(state)
+        if attribute_names:
+            _expire_state(state, attribute_names=attribute_names, instance_dict=self.identity_map)
+        else:
+            # pre-fetch the full cascade since the expire is going to
+            # remove associations
+            cascaded = list(_cascade_state_iterator('refresh-expire', state))
+            _expire_state(state, None, instance_dict=self.identity_map)
+            for (state, m, o) in cascaded:
+                _expire_state(state, None, instance_dict=self.identity_map)
+
+    def prune(self):
+        """Remove unreferenced instances cached in the identity map.
+
+        Note that this method is only meaningful if "weak_identity_map" is set
+        to False.  The default weak identity map is self-pruning.
+
+        Removes any object in this Session's identity map that is not
+        referenced in user code, modified, new or scheduled for deletion.
+        Returns the number of objects pruned.
+
+        """
+        return self.identity_map.prune()
+
+    def expunge(self, instance):
+        """Remove the `instance` from this ``Session``.
+
+        This will free all internal references to the instance.  Cascading
+        will be applied according to the *expunge* cascade rule.
+
+        """
+        try:
+            state = attributes.instance_state(instance)
+        except exc.NO_STATE:
+            raise exc.UnmappedInstanceError(instance)
+        if state.session_id is not self.hash_key:
+            raise sa_exc.InvalidRequestError(
+                "Instance %s is not present in this Session" %
+                mapperutil.state_str(state))
+        for s, m, o in [(state, None, None)] + list(_cascade_state_iterator('expunge', state)):
+            self._expunge_state(s)
+
+    def _expunge_state(self, state):
+        if state in self._new:
+            self._new.pop(state)
+            state.detach()
+        elif self.identity_map.contains_state(state):
+            self.identity_map.discard(state)
+            self._deleted.pop(state, None)
+            state.detach()
+
+    def _register_newly_persistent(self, state):
+        mapper = _state_mapper(state)
+
+        # prevent against last minute dereferences of the object
+        obj = state.obj()
+        if obj is not None:
+
+            instance_key = mapper._identity_key_from_state(state)
+
+            if state.key is None:
+                state.key = instance_key
+            elif state.key != instance_key:
+                # primary key switch.
+                # use discard() in case another state has already replaced this
+                # one in the identity map (see test/orm/test_naturalpks.py ReversePKsTest)
+                self.identity_map.discard(state)
+                state.key = instance_key
+            
+            self.identity_map.replace(state)
+            state.commit_all(state.dict, self.identity_map)
+            
+        # remove from new last, might be the last strong ref
+        if state in self._new:
+            if self._enable_transaction_accounting and self.transaction:
+                self.transaction._new[state] = True
+            self._new.pop(state)
+
+    def _remove_newly_deleted(self, state):
+        if self._enable_transaction_accounting and self.transaction:
+            self.transaction._deleted[state] = True
+
+        self.identity_map.discard(state)
+        self._deleted.pop(state, None)
+
+    @util.deprecated("Use session.add()")
+    def save(self, instance):
+        """Add a transient (unsaved) instance to this ``Session``.
+
+        This operation cascades the `save_or_update` method to associated
+        instances if the relation is mapped with ``cascade="save-update"``.
+
+
+        """
+        state = _state_for_unsaved_instance(instance)
+        self._save_impl(state)
+        self._cascade_save_or_update(state)
+
+    def _save_without_cascade(self, instance):
+        """Used by scoping.py to save on init without cascade."""
+
+        state = _state_for_unsaved_instance(instance, create=True)
+        self._save_impl(state)
+
+    @util.deprecated("Use session.add()")
+    def update(self, instance):
+        """Bring a detached (saved) instance into this ``Session``.
+
+        If there is a persistent instance with the same instance key, but
+        different identity already associated with this ``Session``, an
+        InvalidRequestError exception is thrown.
+
+        This operation cascades the `save_or_update` method to associated
+        instances if the relation is mapped with ``cascade="save-update"``.
+
+        """
+        try:
+            state = attributes.instance_state(instance)
+        except exc.NO_STATE:
+            raise exc.UnmappedInstanceError(instance)
+        self._update_impl(state)
+        self._cascade_save_or_update(state)
+
+    def add(self, instance):
+        """Place an object in the ``Session``.
+
+        Its state will be persisted to the database on the next flush
+        operation.
+
+        Repeated calls to ``add()`` will be ignored. The opposite of ``add()``
+        is ``expunge()``.
+
+        """
+        state = _state_for_unknown_persistence_instance(instance)
+        self._save_or_update_state(state)
+
+    def add_all(self, instances):
+        """Add the given collection of instances to this ``Session``."""
+
+        for instance in instances:
+            self.add(instance)
+
+    def _save_or_update_state(self, state):
+        self._save_or_update_impl(state)
+        self._cascade_save_or_update(state)
+
+    save_or_update = (
+        util.deprecated("Use session.add()")(add))
+
+    def _cascade_save_or_update(self, state):
+        for state, mapper in _cascade_unknown_state_iterator('save-update', state, halt_on=lambda c:c in self):
+            self._save_or_update_impl(state)
+
+    def delete(self, instance):
+        """Mark an instance as deleted.
+
+        The database delete operation occurs upon ``flush()``.
+
+        """
+        try:
+            state = attributes.instance_state(instance)
+        except exc.NO_STATE:
+            raise exc.UnmappedInstanceError(instance)
+
+        if state.key is None:
+            raise sa_exc.InvalidRequestError(
+                "Instance '%s' is not persisted" %
+                mapperutil.state_str(state))
+
+        if state in self._deleted:
+            return
+            
+        # ensure object is attached to allow the 
+        # cascade operation to load deferred attributes
+        # and collections
+        self._attach(state)
+
+        # grab the cascades before adding the item to the deleted list
+        # so that autoflush does not delete the item
+        cascade_states = list(_cascade_state_iterator('delete', state))
+
+        self._deleted[state] = state.obj()
+        self.identity_map.add(state)
+
+        for state, m, o in cascade_states:
+            self._delete_impl(state)
+
+    def merge(self, instance, dont_load=False):
+        """Copy the state an instance onto the persistent instance with the same identifier.
+
+        If there is no persistent instance currently associated with the
+        session, it will be loaded.  Return the persistent instance. If the
+        given instance is unsaved, save a copy of and return it as a newly
+        persistent instance. The given instance does not become associated
+        with the session.
+
+        This operation cascades to associated instances if the association is
+        mapped with ``cascade="merge"``.
+
+        """
+        # TODO: this should be an IdentityDict for instances, but will
+        # need a separate dict for PropertyLoader tuples
+        _recursive = {}
+        self._autoflush()
+        autoflush = self.autoflush
+        try:
+            self.autoflush = False
+            return self._merge(instance, dont_load=dont_load, _recursive=_recursive)
+        finally:
+            self.autoflush = autoflush
+        
+    def _merge(self, instance, dont_load=False, _recursive=None):
+        mapper = _object_mapper(instance)
+        if instance in _recursive:
+            return _recursive[instance]
+
+        new_instance = False
+        state = attributes.instance_state(instance)
+        key = state.key
+
+        if key is None:
+            if dont_load:
+                raise sa_exc.InvalidRequestError(
+                    "merge() with dont_load=True option does not support "
+                    "objects transient (i.e. unpersisted) objects.  flush() "
+                    "all changes on mapped instances before merging with "
+                    "dont_load=True.")
+            key = mapper._identity_key_from_state(state)
+
+        merged = None
+        if key:
+            if key in self.identity_map:
+                merged = self.identity_map[key]
+            elif dont_load:
+                if state.modified:
+                    raise sa_exc.InvalidRequestError(
+                        "merge() with dont_load=True option does not support "
+                        "objects marked as 'dirty'.  flush() all changes on "
+                        "mapped instances before merging with dont_load=True.")
+                merged = mapper.class_manager.new_instance()
+                merged_state = attributes.instance_state(merged)
+                merged_state.key = key
+                self._update_impl(merged_state)
+                new_instance = True
+            else:
+                merged = self.query(mapper.class_).get(key[1])
+
+        if merged is None:
+            merged = mapper.class_manager.new_instance()
+            merged_state = attributes.instance_state(merged)
+            new_instance = True
+            self.add(merged)
+
+        _recursive[instance] = merged
+
+        for prop in mapper.iterate_properties:
+            prop.merge(self, instance, merged, dont_load, _recursive)
+
+        if dont_load:
+            attributes.instance_state(merged).commit_all(attributes.instance_dict(merged), self.identity_map)  # remove any history
+
+        if new_instance:
+            merged_state._run_on_load(merged)
+        return merged
+
+    @classmethod
+    def identity_key(cls, *args, **kwargs):
+        return mapperutil.identity_key(*args, **kwargs)
+
+    @classmethod
+    def object_session(cls, instance):
+        """Return the ``Session`` to which an object belongs."""
+
+        return object_session(instance)
+
+    def _validate_persistent(self, state):
+        if not self.identity_map.contains_state(state):
+            raise sa_exc.InvalidRequestError(
+                "Instance '%s' is not persistent within this Session" %
+                mapperutil.state_str(state))
+
+    def _save_impl(self, state):
+        if state.key is not None:
+            raise sa_exc.InvalidRequestError(
+                "Object '%s' already has an identity - it can't be registered "
+                "as pending" % mapperutil.state_str(state))
+                
+        self._attach(state)
+        if state not in self._new:
+            self._new[state] = state.obj()
+            state.insert_order = len(self._new)
+
+    def _update_impl(self, state):
+        if (self.identity_map.contains_state(state) and
+            state not in self._deleted):
+            return
+            
+        if state.key is None:
+            raise sa_exc.InvalidRequestError(
+                "Instance '%s' is not persisted" %
+                mapperutil.state_str(state))
+
+        self._attach(state)
+        self._deleted.pop(state, None)
+        self.identity_map.add(state)
+
+    def _save_or_update_impl(self, state):
+        if state.key is None:
+            self._save_impl(state)
+        else:
+            self._update_impl(state)
+
+    def _delete_impl(self, state):
+        if state in self._deleted:
+            return
+
+        if state.key is None:
+            return
+                    
+        self._attach(state)
+        self._deleted[state] = state.obj()
+        self.identity_map.add(state)
+    
+    def _attach(self, state):
+        if state.key and \
+            state.key in self.identity_map and \
+            not self.identity_map.contains_state(state):
+            raise sa_exc.InvalidRequestError(
+                "Can't attach instance %s; another instance with key %s is already present in this session." % 
+                    (mapperutil.state_str(state), state.key)
+                )
+                
+        if state.session_id and state.session_id is not self.hash_key:
+            raise sa_exc.InvalidRequestError(
+                "Object '%s' is already attached to session '%s' "
+                "(this is '%s')" % (mapperutil.state_str(state),
+                                    state.session_id, self.hash_key))
+                                    
+        if state.session_id != self.hash_key:
+            state.session_id = self.hash_key
+            for ext in self.extensions:
+                ext.after_attach(self, state.obj())
+
+    def __contains__(self, instance):
+        """Return True if the instance is associated with this session.
+
+        The instance may be pending or persistent within the Session for a
+        result of True.
+
+        """
+        try:
+            state = attributes.instance_state(instance)
+        except exc.NO_STATE:
+            raise exc.UnmappedInstanceError(instance)
+        return self._contains_state(state)
+
+    def __iter__(self):
+        """Iterate over all pending or persistent instances within this Session."""
+
+        return iter(list(self._new.values()) + self.identity_map.values())
+
+    def _contains_state(self, state):
+        return state in self._new or self.identity_map.contains_state(state)
+
+    def flush(self, objects=None):
+        """Flush all the object changes to the database.
+
+        Writes out all pending object creations, deletions and modifications
+        to the database as INSERTs, DELETEs, UPDATEs, etc.  Operations are
+        automatically ordered by the Session's unit of work dependency
+        solver..
+
+        Database operations will be issued in the current transactional
+        context and do not affect the state of the transaction.  You may
+        flush() as often as you like within a transaction to move changes from
+        Python to the database's transaction buffer.
+
+        For ``autocommit`` Sessions with no active manual transaction, flush()
+        will create a transaction on the fly that surrounds the entire set of
+        operations int the flush.
+
+        objects
+          Optional; a list or tuple collection.  Restricts the flush operation
+          to only these objects, rather than all pending changes.
+          Deprecated - this flag prevents the session from properly maintaining
+          accounting among inter-object relations and can cause invalid results.
+
+        """
+
+        if objects:
+            util.warn_deprecated(
+                "The 'objects' argument to session.flush() is deprecated; "
+                "Please do not add objects to the session which should not yet be persisted.")
+        
+        if self._flushing:
+            raise sa_exc.InvalidRequestError("Session is already flushing")
+            
+        try:
+            self._flushing = True
+            self._flush(objects)
+        finally:
+            self._flushing = False
+            
+    def _flush(self, objects=None):
+        if (not self.identity_map.check_modified() and
+            not self._deleted and not self._new):
+            return
+
+        dirty = self._dirty_states
+        if not dirty and not self._deleted and not self._new:
+            self.identity_map._modified.clear()
+            return
+
+        flush_context = UOWTransaction(self)
+
+        if self.extensions:
+            for ext in self.extensions:
+                ext.before_flush(self, flush_context, objects)
+            dirty = self._dirty_states
+            
+        deleted = set(self._deleted)
+        new = set(self._new)
+
+        dirty = set(dirty).difference(deleted)
+
+        # create the set of all objects we want to operate upon
+        if objects:
+            # specific list passed in
+            objset = set()
+            for o in objects:
+                try:
+                    state = attributes.instance_state(o)
+                except exc.NO_STATE:
+                    raise exc.UnmappedInstanceError(o)
+                objset.add(state)
+        else:
+            objset = None
+
+        # store objects whose fate has been decided
+        processed = set()
+
+        # put all saves/updates into the flush context.  detect top-level
+        # orphans and throw them into deleted.
+        if objset:
+            proc = new.union(dirty).intersection(objset).difference(deleted)
+        else:
+            proc = new.union(dirty).difference(deleted)
+            
+        for state in proc:
+            is_orphan = _state_mapper(state)._is_orphan(state)
+            if is_orphan and not _state_has_identity(state):
+                path = ", nor ".join(
+                    ["any parent '%s' instance "
+                     "via that classes' '%s' attribute" %
+                     (cls.__name__, key)
+                     for (key, cls) in chain(*(m.delete_orphans for m in _state_mapper(state).iterate_to_root()))])
+                raise exc.FlushError(
+                    "Instance %s is an unsaved, pending instance and is an "
+                    "orphan (is not attached to %s)" % (
+                    mapperutil.state_str(state), path))
+            flush_context.register_object(state, isdelete=is_orphan)
+            processed.add(state)
+
+        # put all remaining deletes into the flush context.
+        if objset:
+            proc = deleted.intersection(objset).difference(processed)
+        else:
+            proc = deleted.difference(processed)
+        for state in proc:
+            flush_context.register_object(state, isdelete=True)
+
+        if len(flush_context.tasks) == 0:
+            return
+
+        flush_context.transaction = transaction = self.begin(
+            subtransactions=True)
+        try:
+            flush_context.execute()
+
+            for ext in self.extensions:
+                ext.after_flush(self, flush_context)
+            transaction.commit()
+        except:
+            transaction.rollback()
+            raise
+        
+        flush_context.finalize_flush_changes()
+
+        # useful assertions:
+        #if not objects:
+        #    assert not self.identity_map._modified
+        #else:
+        #    assert self.identity_map._modified == self.identity_map._modified.difference(objects)
+        #self.identity_map._modified.clear()
+        
+        for ext in self.extensions:
+            ext.after_flush_postexec(self, flush_context)
+
+    def is_modified(self, instance, include_collections=True, passive=False):
+        """Return True if instance has modified attributes.
+
+        This method retrieves a history instance for each instrumented
+        attribute on the instance and performs a comparison of the current
+        value to its previously committed value.  Note that instances present
+        in the 'dirty' collection may result in a value of ``False`` when
+        tested with this method.
+
+        `include_collections` indicates if multivalued collections should be
+        included in the operation.  Setting this to False is a way to detect
+        only local-column based properties (i.e. scalar columns or many-to-one
+        foreign keys) that would result in an UPDATE for this instance upon
+        flush.
+
+        The `passive` flag indicates if unloaded attributes and collections
+        should not be loaded in the course of performing this test.
+
+        """
+        try:
+            state = attributes.instance_state(instance)
+        except exc.NO_STATE:
+            raise exc.UnmappedInstanceError(instance)
+        dict_ = state.dict
+        for attr in state.manager.attributes:
+            if \
+                (
+                    not include_collections and 
+                    hasattr(attr.impl, 'get_collection')
+                ) or not hasattr(attr.impl, 'get_history'):
+                continue
+                
+            (added, unchanged, deleted) = \
+                    attr.impl.get_history(state, dict_, passive=passive)
+                                            
+            if added or deleted:
+                return True
+        return False
+
+    @property
+    def is_active(self):
+        """True if this Session has an active transaction."""
+
+        return self.transaction and self.transaction.is_active
+
+    @property
+    def _dirty_states(self):
+        """The set of all persistent states considered dirty.
+
+        This method returns all states that were modified including
+        those that were possibly deleted.
+
+        """
+        return self.identity_map._dirty_states()
+
+    @property
+    def dirty(self):
+        """The set of all persistent instances considered dirty.
+
+        Instances are considered dirty when they were modified but not
+        deleted.
+
+        Note that this 'dirty' calculation is 'optimistic'; most
+        attribute-setting or collection modification operations will
+        mark an instance as 'dirty' and place it in this set, even if
+        there is no net change to the attribute's value.  At flush
+        time, the value of each attribute is compared to its
+        previously saved value, and if there's no net change, no SQL
+        operation will occur (this is a more expensive operation so
+        it's only done at flush time).
+
+        To check if an instance has actionable net changes to its
+        attributes, use the is_modified() method.
+
+        """
+        return util.IdentitySet(
+            [state.obj()
+             for state in self._dirty_states
+             if state not in self._deleted])
+
+    @property
+    def deleted(self):
+        "The set of all instances marked as 'deleted' within this ``Session``"
+
+        return util.IdentitySet(self._deleted.values())
+
+    @property
+    def new(self):
+        "The set of all instances marked as 'new' within this ``Session``."
+
+        return util.IdentitySet(self._new.values())
+
+_expire_state = state.InstanceState.expire_attributes
+    
+UOWEventHandler = unitofwork.UOWEventHandler
+
+_sessions = weakref.WeakValueDictionary()
+
+def _cascade_state_iterator(cascade, state, **kwargs):
+    mapper = _state_mapper(state)
+    # yield the state, object, mapper.  yielding the object
+    # allows the iterator's results to be held in a list without
+    # states being garbage collected
+    for (o, m) in mapper.cascade_iterator(cascade, state, **kwargs):
+        yield attributes.instance_state(o), o, m
+
+def _cascade_unknown_state_iterator(cascade, state, **kwargs):
+    mapper = _state_mapper(state)
+    for (o, m) in mapper.cascade_iterator(cascade, state, **kwargs):
+        yield _state_for_unknown_persistence_instance(o), m
+
+def _state_for_unsaved_instance(instance, create=False):
+    try:
+        state = attributes.instance_state(instance)
+    except AttributeError:
+        raise exc.UnmappedInstanceError(instance)
+    if state:
+        if state.key is not None:
+            raise sa_exc.InvalidRequestError(
+                "Instance '%s' is already persistent" %
+                mapperutil.state_str(state))
+    elif create:
+        manager = attributes.manager_of_class(instance.__class__)
+        if manager is None:
+            raise exc.UnmappedInstanceError(instance)
+        state = manager.setup_instance(instance)
+    else:
+        raise exc.UnmappedInstanceError(instance)
+
+    return state
+
+def _state_for_unknown_persistence_instance(instance):
+    try:
+        state = attributes.instance_state(instance)
+    except exc.NO_STATE:
+        raise exc.UnmappedInstanceError(instance)
+
+    return state
+
+def object_session(instance):
+    """Return the ``Session`` to which instance belongs, or None."""
+
+    return _state_session(attributes.instance_state(instance))
+
+def _state_session(state):
+    if state.session_id:
+        try:
+            return _sessions[state.session_id]
+        except KeyError:
+            pass
+    return None
+
+# Lazy initialization to avoid circular imports
+unitofwork.object_session = object_session
+unitofwork._state_session = _state_session
+from sqlalchemy.orm import mapper
+mapper._expire_state = _expire_state
+mapper._state_session = _state_session
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/orm/interfaces.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/orm/interfaces.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/orm/interfaces.py (revision 3)
@@ -0,0 +1,978 @@
+# interfaces.py
+# Copyright (C) 2005, 2006, 2007, 2008, 2009 Michael Bayer mike_mp@zzzcomputing.com
+#
+# This module is part of SQLAlchemy and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+"""
+
+Semi-private module containing various base classes used throughout the ORM.
+
+Defines the extension classes :class:`MapperExtension`,
+:class:`SessionExtension`, and :class:`AttributeExtension` as
+well as other user-subclassable extension objects.
+
+"""
+
+from itertools import chain
+
+import sqlalchemy.exceptions as sa_exc
+from sqlalchemy import log, util
+from sqlalchemy.sql import expression
+
+class_mapper = None
+collections = None
+
+__all__ = (
+    'AttributeExtension',
+    'EXT_CONTINUE',
+    'EXT_STOP',
+    'ExtensionOption',
+    'InstrumentationManager',
+    'LoaderStrategy',
+    'MapperExtension',
+    'MapperOption',
+    'MapperProperty',
+    'PropComparator',
+    'PropertyOption',
+    'SessionExtension',
+    'StrategizedOption',
+    'StrategizedProperty',
+    'build_path',
+    )
+
+EXT_CONTINUE = util.symbol('EXT_CONTINUE')
+EXT_STOP = util.symbol('EXT_STOP')
+
+ONETOMANY = util.symbol('ONETOMANY')
+MANYTOONE = util.symbol('MANYTOONE')
+MANYTOMANY = util.symbol('MANYTOMANY')
+
+class MapperExtension(object):
+    """Base implementation for customizing Mapper behavior.
+
+    For each method in MapperExtension, returning a result of EXT_CONTINUE
+    will allow processing to continue to the next MapperExtension in line or
+    use the default functionality if there are no other extensions.
+
+    Returning EXT_STOP will halt processing of further extensions handling
+    that method.  Some methods such as ``load`` have other return
+    requirements, see the individual documentation for details.  Other than
+    these exception cases, any return value other than EXT_CONTINUE or
+    EXT_STOP will be interpreted as equivalent to EXT_STOP.
+
+    """
+    def instrument_class(self, mapper, class_):
+        return EXT_CONTINUE
+
+    def init_instance(self, mapper, class_, oldinit, instance, args, kwargs):
+        return EXT_CONTINUE
+
+    def init_failed(self, mapper, class_, oldinit, instance, args, kwargs):
+        return EXT_CONTINUE
+
+    def translate_row(self, mapper, context, row):
+        """Perform pre-processing on the given result row and return a
+        new row instance.
+
+        This is called when the mapper first receives a row, before
+        the object identity or the instance itself has been derived
+        from that row.
+
+        """
+        return EXT_CONTINUE
+
+    def create_instance(self, mapper, selectcontext, row, class_):
+        """Receive a row when a new object instance is about to be
+        created from that row.
+
+        The method can choose to create the instance itself, or it can return
+        EXT_CONTINUE to indicate normal object creation should take place.
+
+        mapper
+          The mapper doing the operation
+
+        selectcontext
+          SelectionContext corresponding to the instances() call
+
+        row
+          The result row from the database
+
+        class\_
+          The class we are mapping.
+
+        return value
+          A new object instance, or EXT_CONTINUE
+
+        """
+        return EXT_CONTINUE
+
+    def append_result(self, mapper, selectcontext, row, instance, result, **flags):
+        """Receive an object instance before that instance is appended
+        to a result list.
+
+        If this method returns EXT_CONTINUE, result appending will proceed
+        normally.  if this method returns any other value or None,
+        result appending will not proceed for this instance, giving
+        this extension an opportunity to do the appending itself, if
+        desired.
+
+        mapper
+          The mapper doing the operation.
+
+        selectcontext
+          SelectionContext corresponding to the instances() call.
+
+        row
+          The result row from the database.
+
+        instance
+          The object instance to be appended to the result.
+
+        result
+          List to which results are being appended.
+
+        \**flags
+          extra information about the row, same as criterion in
+          ``create_row_processor()`` method of :class:`~sqlalchemy.orm.interfaces.MapperProperty`
+        """
+
+        return EXT_CONTINUE
+
+    def populate_instance(self, mapper, selectcontext, row, instance, **flags):
+        """Receive an instance before that instance has
+        its attributes populated.
+
+        This usually corresponds to a newly loaded instance but may
+        also correspond to an already-loaded instance which has
+        unloaded attributes to be populated.  The method may be called
+        many times for a single instance, as multiple result rows are
+        used to populate eagerly loaded collections.
+
+        If this method returns EXT_CONTINUE, instance population will
+        proceed normally.  If any other value or None is returned,
+        instance population will not proceed, giving this extension an
+        opportunity to populate the instance itself, if desired.
+
+        As of 0.5, most usages of this hook are obsolete.  For a
+        generic "object has been newly created from a row" hook, use
+        ``reconstruct_instance()``, or the ``@orm.reconstructor``
+        decorator.
+
+        """
+        return EXT_CONTINUE
+
+    def reconstruct_instance(self, mapper, instance):
+        """Receive an object instance after it has been created via
+        ``__new__``, and after initial attribute population has
+        occurred.
+
+        This typically occurs when the instance is created based on
+        incoming result rows, and is only called once for that
+        instance's lifetime.
+
+        Note that during a result-row load, this method is called upon
+        the first row received for this instance. If eager loaders are
+        set to further populate collections on the instance, those
+        will *not* yet be completely loaded.
+
+        """
+        return EXT_CONTINUE
+
+    def before_insert(self, mapper, connection, instance):
+        """Receive an object instance before that instance is INSERTed
+        into its table.
+
+        This is a good place to set up primary key values and such
+        that aren't handled otherwise.
+
+        Column-based attributes can be modified within this method
+        which will result in the new value being inserted.  However
+        *no* changes to the overall flush plan can be made; this means
+        any collection modification or save() operations which occur
+        within this method will not take effect until the next flush
+        call.
+
+        """
+
+        return EXT_CONTINUE
+
+    def after_insert(self, mapper, connection, instance):
+        """Receive an object instance after that instance is INSERTed."""
+
+        return EXT_CONTINUE
+
+    def before_update(self, mapper, connection, instance):
+        """Receive an object instance before that instance is UPDATEed.
+
+        Note that this method is called for all instances that are marked as
+        "dirty", even those which have no net changes to their column-based
+        attributes.  An object is marked as dirty when any of its column-based
+        attributes have a "set attribute" operation called or when any of its
+        collections are modified.  If, at update time, no column-based attributes
+        have any net changes, no UPDATE statement will be issued.  This means
+        that an instance being sent to before_update is *not* a guarantee that
+        an UPDATE statement will be issued (although you can affect the outcome
+        here).
+
+        To detect if the column-based attributes on the object have net changes,
+        and will therefore generate an UPDATE statement, use
+        ``object_session(instance).is_modified(instance, include_collections=False)``.
+
+        Column-based attributes can be modified within this method which will
+        result in their being updated.  However *no* changes to the overall
+        flush plan can be made; this means any collection modification or
+        save() operations which occur within this method will not take effect
+        until the next flush call.
+
+        """
+
+        return EXT_CONTINUE
+
+    def after_update(self, mapper, connection, instance):
+        """Receive an object instance after that instance is UPDATEed."""
+
+        return EXT_CONTINUE
+
+    def before_delete(self, mapper, connection, instance):
+        """Receive an object instance before that instance is DELETEed.
+
+        Note that *no* changes to the overall
+        flush plan can be made here; this means any collection modification,
+        save() or delete() operations which occur within this method will
+        not take effect until the next flush call.
+
+        """
+
+        return EXT_CONTINUE
+
+    def after_delete(self, mapper, connection, instance):
+        """Receive an object instance after that instance is DELETEed."""
+
+        return EXT_CONTINUE
+
+class SessionExtension(object):
+    """An extension hook object for Sessions.  Subclasses may be installed into a Session
+    (or sessionmaker) using the ``extension`` keyword argument.
+    """
+
+    def before_commit(self, session):
+        """Execute right before commit is called.
+
+        Note that this may not be per-flush if a longer running transaction is ongoing."""
+
+    def after_commit(self, session):
+        """Execute after a commit has occured.
+
+        Note that this may not be per-flush if a longer running transaction is ongoing."""
+
+    def after_rollback(self, session):
+        """Execute after a rollback has occured.
+
+        Note that this may not be per-flush if a longer running transaction is ongoing."""
+
+    def before_flush(self, session, flush_context, instances):
+        """Execute before flush process has started.
+
+        `instances` is an optional list of objects which were passed to the ``flush()``
+        method.
+        """
+
+    def after_flush(self, session, flush_context):
+        """Execute after flush has completed, but before commit has been called.
+
+        Note that the session's state is still in pre-flush, i.e. 'new', 'dirty',
+        and 'deleted' lists still show pre-flush state as well as the history
+        settings on instance attributes."""
+
+    def after_flush_postexec(self, session, flush_context):
+        """Execute after flush has completed, and after the post-exec state occurs.
+
+        This will be when the 'new', 'dirty', and 'deleted' lists are in their final
+        state.  An actual commit() may or may not have occured, depending on whether or not
+        the flush started its own transaction or participated in a larger transaction.
+        """
+
+    def after_begin(self, session, transaction, connection):
+        """Execute after a transaction is begun on a connection
+
+        `transaction` is the SessionTransaction. This method is called after an
+        engine level transaction is begun on a connection.
+        """
+
+    def after_attach(self, session, instance):
+        """Execute after an instance is attached to a session.
+
+        This is called after an add, delete or merge.
+        """
+
+    def after_bulk_update(self, session, query, query_context, result):
+        """Execute after a bulk update operation to the session.
+
+        This is called after a session.query(...).update()
+
+        `query` is the query object that this update operation was called on.
+        `query_context` was the query context object.
+        `result` is the result object returned from the bulk operation.
+        """
+
+    def after_bulk_delete(self, session, query, query_context, result):
+        """Execute after a bulk delete operation to the session.
+
+        This is called after a session.query(...).delete()
+
+        `query` is the query object that this delete operation was called on.
+        `query_context` was the query context object.
+        `result` is the result object returned from the bulk operation.
+        """
+
+class MapperProperty(object):
+    """Manage the relationship of a ``Mapper`` to a single class
+    attribute, as well as that attribute as it appears on individual
+    instances of the class, including attribute instrumentation,
+    attribute access, loading behavior, and dependency calculations.
+    """
+
+    def setup(self, context, entity, path, adapter, **kwargs):
+        """Called by Query for the purposes of constructing a SQL statement.
+
+        Each MapperProperty associated with the target mapper processes the
+        statement referenced by the query context, adding columns and/or
+        criterion as appropriate.
+        """
+
+        pass
+
+    def create_row_processor(self, selectcontext, path, mapper, row, adapter):
+        """Return a 2-tuple consiting of two row processing functions and an instance post-processing function.
+
+        Input arguments are the query.SelectionContext and the *first*
+        applicable row of a result set obtained within
+        query.Query.instances(), called only the first time a particular
+        mapper's populate_instance() method is invoked for the overall result.
+
+        The settings contained within the SelectionContext as well as the
+        columns present in the row (which will be the same columns present in
+        all rows) are used to determine the presence and behavior of the
+        returned callables.  The callables will then be used to process all
+        rows and instances.
+
+        Callables are of the following form::
+
+            def new_execute(state, dict_, row, **flags):
+                # process incoming instance state and given row.  the instance is
+                # "new" and was just created upon receipt of this row.
+                # flags is a dictionary containing at least the following
+                # attributes:
+                #   isnew - indicates if the instance was newly created as a
+                #           result of reading this row
+                #   instancekey - identity key of the instance
+
+            def existing_execute(state, dict_, row, **flags):
+                # process incoming instance state and given row.  the instance is
+                # "existing" and was created based on a previous row.
+
+            return (new_execute, existing_execute)
+
+        Either of the three tuples can be ``None`` in which case no function
+        is called.
+        """
+
+        raise NotImplementedError()
+
+    def cascade_iterator(self, type_, state, visited_instances=None, halt_on=None):
+        """Iterate through instances related to the given instance for
+        a particular 'cascade', starting with this MapperProperty.
+
+        See PropertyLoader for the related instance implementation.
+        """
+
+        return iter(())
+
+    def set_parent(self, parent):
+        self.parent = parent
+
+    def instrument_class(self, mapper):
+        raise NotImplementedError()
+
+    _compile_started = False
+    _compile_finished = False
+
+    def init(self):
+        """Called after all mappers are created to assemble
+        relationships between mappers and perform other post-mapper-creation
+        initialization steps.
+
+        """
+        self._compile_started = True
+        self.do_init()
+        self._compile_finished = True
+
+    def do_init(self):
+        """Perform subclass-specific initialization post-mapper-creation steps.
+
+        This is a *template* method called by the
+        ``MapperProperty`` object's init() method.
+
+        """
+        pass
+
+    def post_instrument_class(self, mapper):
+        """Perform instrumentation adjustments that need to occur
+        after init() has completed.
+
+        """
+        pass
+
+    def register_dependencies(self, *args, **kwargs):
+        """Called by the ``Mapper`` in response to the UnitOfWork
+        calling the ``Mapper``'s register_dependencies operation.
+        Establishes a topological dependency between two mappers
+        which will affect the order in which mappers persist data.
+        
+        """
+
+        pass
+
+    def register_processors(self, *args, **kwargs):
+        """Called by the ``Mapper`` in response to the UnitOfWork
+        calling the ``Mapper``'s register_processors operation.
+        Establishes a processor object between two mappers which
+        will link data and state between parent/child objects.
+        
+        """
+
+        pass
+        
+    def is_primary(self):
+        """Return True if this ``MapperProperty``'s mapper is the
+        primary mapper for its class.
+
+        This flag is used to indicate that the ``MapperProperty`` can
+        define attribute instrumentation for the class at the class
+        level (as opposed to the individual instance level).
+        """
+
+        return not self.parent.non_primary
+
+    def merge(self, session, source, dest, dont_load, _recursive):
+        """Merge the attribute represented by this ``MapperProperty``
+        from source to destination object"""
+
+        raise NotImplementedError()
+
+    def compare(self, operator, value):
+        """Return a compare operation for the columns represented by
+        this ``MapperProperty`` to the given value, which may be a
+        column value or an instance.  'operator' is an operator from
+        the operators module, or from sql.Comparator.
+
+        By default uses the PropComparator attached to this MapperProperty
+        under the attribute name "comparator".
+        """
+
+        return operator(self.comparator, value)
+
+class PropComparator(expression.ColumnOperators):
+    """defines comparison operations for MapperProperty objects.
+
+    PropComparator instances should also define an accessor 'property'
+    which returns the MapperProperty associated with this
+    PropComparator.
+    """
+
+    def __init__(self, prop, mapper, adapter=None):
+        self.prop = self.property = prop
+        self.mapper = mapper
+        self.adapter = adapter
+
+    def __clause_element__(self):
+        raise NotImplementedError("%r" % self)
+
+    def adapted(self, adapter):
+        """Return a copy of this PropComparator which will use the given adaption function
+        on the local side of generated expressions.
+
+        """
+        return self.__class__(self.prop, self.mapper, adapter)
+
+    @staticmethod
+    def any_op(a, b, **kwargs):
+        return a.any(b, **kwargs)
+
+    @staticmethod
+    def has_op(a, b, **kwargs):
+        return a.has(b, **kwargs)
+
+    @staticmethod
+    def of_type_op(a, class_):
+        return a.of_type(class_)
+
+    def of_type(self, class_):
+        """Redefine this object in terms of a polymorphic subclass.
+
+        Returns a new PropComparator from which further criterion can be evaluated.
+
+        e.g.::
+
+            query.join(Company.employees.of_type(Engineer)).\\
+               filter(Engineer.name=='foo')
+
+        \class_
+            a class or mapper indicating that criterion will be against
+            this specific subclass.
+
+
+        """
+
+        return self.operate(PropComparator.of_type_op, class_)
+
+    def any(self, criterion=None, **kwargs):
+        """Return true if this collection contains any member that meets the given criterion.
+
+        criterion
+          an optional ClauseElement formulated against the member class' table
+          or attributes.
+
+        \**kwargs
+          key/value pairs corresponding to member class attribute names which
+          will be compared via equality to the corresponding values.
+        """
+
+        return self.operate(PropComparator.any_op, criterion, **kwargs)
+
+    def has(self, criterion=None, **kwargs):
+        """Return true if this element references a member which meets the given criterion.
+
+        criterion
+          an optional ClauseElement formulated against the member class' table
+          or attributes.
+
+        \**kwargs
+          key/value pairs corresponding to member class attribute names which
+          will be compared via equality to the corresponding values.
+        """
+
+        return self.operate(PropComparator.has_op, criterion, **kwargs)
+
+
+class StrategizedProperty(MapperProperty):
+    """A MapperProperty which uses selectable strategies to affect
+    loading behavior.
+
+    There is a single default strategy selected by default.  Alternate
+    strategies can be selected at Query time through the usage of
+    ``StrategizedOption`` objects via the Query.options() method.
+    """
+
+    def __get_context_strategy(self, context, path):
+        cls = context.attributes.get(("loaderstrategy", path), None)
+        if cls:
+            try:
+                return self.__all_strategies[cls]
+            except KeyError:
+                return self.__init_strategy(cls)
+        else:
+            return self.strategy
+
+    def _get_strategy(self, cls):
+        try:
+            return self.__all_strategies[cls]
+        except KeyError:
+            return self.__init_strategy(cls)
+
+    def __init_strategy(self, cls):
+        self.__all_strategies[cls] = strategy = cls(self)
+        strategy.init()
+        return strategy
+
+    def setup(self, context, entity, path, adapter, **kwargs):
+        self.__get_context_strategy(context, path + (self.key,)).setup_query(context, entity, path, adapter, **kwargs)
+
+    def create_row_processor(self, context, path, mapper, row, adapter):
+        return self.__get_context_strategy(context, path + (self.key,)).create_row_processor(context, path, mapper, row, adapter)
+
+    def do_init(self):
+        self.__all_strategies = {}
+        self.strategy = self.__init_strategy(self.strategy_class)
+
+    def post_instrument_class(self, mapper):
+        if self.is_primary():
+            self.strategy.init_class_attribute(mapper)
+
+def build_path(entity, key, prev=None):
+    if prev:
+        return prev + (entity, key)
+    else:
+        return (entity, key)
+
+def serialize_path(path):
+    if path is None:
+        return None
+
+    return [
+        (mapper.class_, key)
+        for mapper, key in [(path[i], path[i+1]) for i in range(0, len(path)-1, 2)]
+    ]
+
+def deserialize_path(path):
+    if path is None:
+        return None
+
+    global class_mapper
+    if class_mapper is None:
+        from sqlalchemy.orm import class_mapper
+
+    return tuple(
+        chain(*[(class_mapper(cls), key) for cls, key in path])
+    )
+
+class MapperOption(object):
+    """Describe a modification to a Query."""
+
+    propagate_to_loaders = False
+    """if True, indicate this option should be carried along 
+    Query object generated by scalar or object lazy loaders.
+    """
+    
+    def process_query(self, query):
+        pass
+
+    def process_query_conditionally(self, query):
+        """same as process_query(), except that this option may not apply
+        to the given query.
+
+        Used when secondary loaders resend existing options to a new
+        Query."""
+        self.process_query(query)
+
+class ExtensionOption(MapperOption):
+    """a MapperOption that applies a MapperExtension to a query operation."""
+    
+    def __init__(self, ext):
+        self.ext = ext
+
+    def process_query(self, query):
+        entity = query._generate_mapper_zero()
+        entity.extension = entity.extension.copy()
+        entity.extension.push(self.ext)
+
+class PropertyOption(MapperOption):
+    """A MapperOption that is applied to a property off the mapper or
+    one of its child mappers, identified by a dot-separated key.
+    """
+
+    def __init__(self, key, mapper=None):
+        self.key = key
+        self.mapper = mapper
+
+    def process_query(self, query):
+        self._process(query, True)
+
+    def process_query_conditionally(self, query):
+        self._process(query, False)
+
+    def _process(self, query, raiseerr):
+        paths, mappers = self.__get_paths(query, raiseerr)
+        if paths:
+            self.process_query_property(query, paths, mappers)
+
+    def process_query_property(self, query, paths, mappers):
+        pass
+
+    def __find_entity(self, query, mapper, raiseerr):
+        from sqlalchemy.orm.util import _class_to_mapper, _is_aliased_class
+
+        if _is_aliased_class(mapper):
+            searchfor = mapper
+        else:
+            searchfor = _class_to_mapper(mapper).base_mapper
+        
+        for ent in query._mapper_entities:
+            if ent.path_entity is searchfor:
+                return ent
+        else:
+            if raiseerr:
+                raise sa_exc.ArgumentError("Can't find entity %s in Query.  Current list: %r" 
+                    % (searchfor, [str(m.path_entity) for m in query._entities]))
+            else:
+                return None
+
+    def __getstate__(self):
+        d = self.__dict__.copy()
+        d['key'] = ret = []
+        for token in util.to_list(self.key):
+            if isinstance(token, PropComparator):
+                ret.append((token.mapper.class_, token.key))
+            else:
+                ret.append(token)
+        return d
+
+    def __setstate__(self, state):
+        ret = []
+        for key in state['key']:
+            if isinstance(key, tuple):
+                cls, propkey = key
+                ret.append(getattr(cls, propkey))
+            else:
+                ret.append(key)
+        state['key'] = tuple(ret)
+        self.__dict__ = state
+
+    def __get_paths(self, query, raiseerr):
+        path = None
+        entity = None
+        l = []
+        mappers = []
+        
+        # _current_path implies we're in a secondary load
+        # with an existing path
+        current_path = list(query._current_path)
+            
+        if self.mapper:
+            entity = self.__find_entity(query, self.mapper, raiseerr)
+            mapper = entity.mapper
+            path_element = entity.path_entity
+
+        for key in util.to_list(self.key):
+            if isinstance(key, basestring):
+                tokens = key.split('.')
+            else:
+                tokens = [key]
+            for token in tokens:
+                if isinstance(token, basestring):
+                    if not entity:
+                        entity = query._entity_zero()
+                        path_element = entity.path_entity
+                        mapper = entity.mapper
+                    mappers.append(mapper)
+                    prop = mapper.get_property(token, resolve_synonyms=True, raiseerr=raiseerr)
+                    key = token
+                elif isinstance(token, PropComparator):
+                    prop = token.property
+                    if not entity:
+                        entity = self.__find_entity(query, token.parententity, raiseerr)
+                        if not entity:
+                            return [], []
+                        path_element = entity.path_entity
+                    mappers.append(prop.parent)
+                    key = prop.key
+                else:
+                    raise sa_exc.ArgumentError("mapper option expects string key or list of attributes")
+
+                if current_path and key == current_path[1]:
+                    current_path = current_path[2:]
+                    continue
+                    
+                if prop is None:
+                    return [], []
+
+                path = build_path(path_element, prop.key, path)
+                l.append(path)
+                if getattr(token, '_of_type', None):
+                    path_element = mapper = token._of_type
+                else:
+                    path_element = mapper = getattr(prop, 'mapper', None)
+
+                if path_element:
+                    path_element = path_element.base_mapper
+                    
+                
+        # if current_path tokens remain, then
+        # we didn't have an exact path match.
+        if current_path:
+            return [], []
+            
+        return l, mappers
+
+class AttributeExtension(object):
+    """An event handler for individual attribute change events.
+
+    AttributeExtension is assembled within the descriptors associated
+    with a mapped class.
+
+    """
+
+    active_history = True
+    """indicates that the set() method would like to receive the 'old' value,
+    even if it means firing lazy callables.
+    """
+    
+    def append(self, state, value, initiator):
+        """Receive a collection append event.
+
+        The returned value will be used as the actual value to be
+        appended.
+
+        """
+        return value
+
+    def remove(self, state, value, initiator):
+        """Receive a remove event.
+
+        No return value is defined.
+
+        """
+        pass
+
+    def set(self, state, value, oldvalue, initiator):
+        """Receive a set event.
+
+        The returned value will be used as the actual value to be
+        set.
+
+        """
+        return value
+
+
+class StrategizedOption(PropertyOption):
+    """A MapperOption that affects which LoaderStrategy will be used
+    for an operation by a StrategizedProperty.
+    """
+
+    def is_chained(self):
+        return False
+
+    def process_query_property(self, query, paths, mappers):
+        if self.is_chained():
+            for path in paths:
+                query._attributes[("loaderstrategy", path)] = self.get_strategy_class()
+        else:
+            query._attributes[("loaderstrategy", paths[-1])] = self.get_strategy_class()
+
+    def get_strategy_class(self):
+        raise NotImplementedError()
+
+
+class LoaderStrategy(object):
+    """Describe the loading behavior of a StrategizedProperty object.
+
+    The ``LoaderStrategy`` interacts with the querying process in three
+    ways:
+
+    * it controls the configuration of the ``InstrumentedAttribute``
+      placed on a class to handle the behavior of the attribute.  this
+      may involve setting up class-level callable functions to fire
+      off a select operation when the attribute is first accessed
+      (i.e. a lazy load)
+
+    * it processes the ``QueryContext`` at statement construction time,
+      where it can modify the SQL statement that is being produced.
+      simple column attributes may add their represented column to the
+      list of selected columns, *eager loading* properties may add
+      ``LEFT OUTER JOIN`` clauses to the statement.
+
+    * it processes the ``SelectionContext`` at row-processing time.  This
+      includes straight population of attributes corresponding to rows,
+      setting instance-level lazyloader callables on newly
+      constructed instances, and appending child items to scalar/collection
+      attributes in response to eagerly-loaded relations.
+    """
+
+    def __init__(self, parent):
+        self.parent_property = parent
+        self.is_class_level = False
+        self.parent = self.parent_property.parent
+        self.key = self.parent_property.key
+
+    def init(self):
+        raise NotImplementedError("LoaderStrategy")
+
+    def init_class_attribute(self, mapper):
+        pass
+
+    def setup_query(self, context, entity, path, adapter, **kwargs):
+        pass
+
+    def create_row_processor(self, selectcontext, path, mapper, row, adapter):
+        """Return row processing functions which fulfill the contract specified
+        by MapperProperty.create_row_processor.
+
+        StrategizedProperty delegates its create_row_processor method directly
+        to this method.
+        """
+
+        raise NotImplementedError()
+
+    def __str__(self):
+        return str(self.parent_property)
+
+    def debug_callable(self, fn, logger, announcement, logfn):
+        if announcement:
+            logger.debug(announcement)
+        if logfn:
+            def call(*args, **kwargs):
+                logger.debug(logfn(*args, **kwargs))
+                return fn(*args, **kwargs)
+            return call
+        else:
+            return fn
+
+class InstrumentationManager(object):
+    """User-defined class instrumentation extension.
+    
+    The API for this class should be considered as semi-stable,
+    and may change slightly with new releases.
+    
+    """
+
+    # r4361 added a mandatory (cls) constructor to this interface.
+    # given that, perhaps class_ should be dropped from all of these
+    # signatures.
+
+    def __init__(self, class_):
+        pass
+
+    def manage(self, class_, manager):
+        setattr(class_, '_default_class_manager', manager)
+
+    def dispose(self, class_, manager):
+        delattr(class_, '_default_class_manager')
+
+    def manager_getter(self, class_):
+        def get(cls):
+            return cls._default_class_manager
+        return get
+
+    def instrument_attribute(self, class_, key, inst):
+        pass
+
+    def post_configure_attribute(self, class_, key, inst):
+        pass
+
+    def install_descriptor(self, class_, key, inst):
+        setattr(class_, key, inst)
+
+    def uninstall_descriptor(self, class_, key):
+        delattr(class_, key)
+
+    def install_member(self, class_, key, implementation):
+        setattr(class_, key, implementation)
+
+    def uninstall_member(self, class_, key):
+        delattr(class_, key)
+
+    def instrument_collection_class(self, class_, key, collection_class):
+        global collections
+        if collections is None:
+            from sqlalchemy.orm import collections
+        return collections.prepare_instrumentation(collection_class)
+
+    def get_instance_dict(self, class_, instance):
+        return instance.__dict__
+
+    def initialize_instance_dict(self, class_, instance):
+        pass
+
+    def install_state(self, class_, instance, state):
+        setattr(instance, '_default_state', state)
+
+    def remove_state(self, class_, instance):
+        delattr(instance, '_default_state', state)
+
+    def state_getter(self, class_):
+        return lambda instance: getattr(instance, '_default_state')
+
+    def dict_getter(self, class_):
+        return lambda inst: self.get_instance_dict(class_, inst)
+        
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/orm/mapper.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/orm/mapper.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/orm/mapper.py (revision 3)
@@ -0,0 +1,1882 @@
+# mapper.py
+# Copyright (C) 2005, 2006, 2007, 2008, 2009 Michael Bayer mike_mp@zzzcomputing.com
+#
+# This module is part of SQLAlchemy and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+"""Logic to map Python classes to and from selectables.
+
+Defines the :class:`~sqlalchemy.orm.mapper.Mapper` class, the central configurational
+unit which associates a class with a database table.
+
+This is a semi-private module; the main configurational API of the ORM is
+available in :class:`~sqlalchemy.orm.`.
+
+"""
+
+import types
+import weakref
+import operator
+from itertools import chain
+deque = __import__('collections').deque
+
+from sqlalchemy import sql, util, log, exc as sa_exc
+from sqlalchemy.sql import expression, visitors, operators, util as sqlutil
+from sqlalchemy.orm import attributes, exc, sync
+from sqlalchemy.orm.interfaces import (
+    MapperProperty, EXT_CONTINUE, PropComparator
+    )
+from sqlalchemy.orm.util import (
+     ExtensionCarrier, _INSTRUMENTOR, _class_to_mapper, _state_has_identity,
+     _state_mapper, class_mapper, instance_str, state_str,
+     )
+
+__all__ = (
+    'Mapper',
+    '_mapper_registry',
+    'class_mapper',
+    'object_mapper',
+    )
+
+_mapper_registry = weakref.WeakKeyDictionary()
+_new_mappers = False
+_already_compiling = False
+
+# a list of MapperExtensions that will be installed in all mappers by default
+global_extensions = []
+
+# a constant returned by _get_attr_by_column to indicate
+# this mapper is not handling an attribute for a particular
+# column
+NO_ATTRIBUTE = util.symbol('NO_ATTRIBUTE')
+
+# lock used to synchronize the "mapper compile" step
+_COMPILE_MUTEX = util.threading.RLock()
+
+# initialize these lazily
+ColumnProperty = None
+SynonymProperty = None
+ComparableProperty = None
+RelationProperty = None
+ConcreteInheritedProperty = None
+_expire_state = None
+_state_session = None
+
+class Mapper(object):
+    """Define the correlation of class attributes to database table
+    columns.
+
+    Instances of this class should be constructed via the
+    :func:`~sqlalchemy.orm.mapper` function.
+
+    """
+    def __init__(self,
+                 class_,
+                 local_table,
+                 properties = None,
+                 primary_key = None,
+                 non_primary = False,
+                 inherits = None,
+                 inherit_condition = None,
+                 inherit_foreign_keys = None,
+                 extension = None,
+                 order_by = False,
+                 always_refresh = False,
+                 version_id_col = None,
+                 polymorphic_on=None,
+                 _polymorphic_map=None,
+                 polymorphic_identity=None,
+                 polymorphic_fetch=None,
+                 concrete=False,
+                 select_table=None,
+                 with_polymorphic=None,
+                 allow_null_pks=False,
+                 batch=True,
+                 column_prefix=None,
+                 include_properties=None,
+                 exclude_properties=None,
+                 eager_defaults=False):
+        """Construct a new mapper.
+
+        Mappers are normally constructed via the :func:`~sqlalchemy.orm.mapper`
+        function.  See for details.
+
+        """
+
+        self.class_ = util.assert_arg_type(class_, type, 'class_')
+
+        self.class_manager = None
+
+        self.primary_key_argument = primary_key
+        self.non_primary = non_primary
+
+        if order_by:
+            self.order_by = util.to_list(order_by)
+        else:
+            self.order_by = order_by
+        
+        self.always_refresh = always_refresh
+        self.version_id_col = version_id_col
+        self.concrete = concrete
+        self.single = False
+        self.inherits = inherits
+        self.local_table = local_table
+        self.inherit_condition = inherit_condition
+        self.inherit_foreign_keys = inherit_foreign_keys
+        self.extension = extension
+        self._init_properties = properties or {}
+        self.allow_null_pks = allow_null_pks
+        self.delete_orphans = []
+        self.batch = batch
+        self.eager_defaults = eager_defaults
+        self.column_prefix = column_prefix
+        self.polymorphic_on = polymorphic_on
+        self._dependency_processors = []
+        self._validators = {}
+        self._clause_adapter = None
+        self._requires_row_aliasing = False
+        self._inherits_equated_pairs = None
+
+
+        self.select_table = select_table
+        if select_table:
+            util.warn_deprecated('select_table option is deprecated.  Use with_polymorphic=("*", selectable) '
+                            'instead.')
+
+            if with_polymorphic:
+                raise sa_exc.ArgumentError("select_table can't be used with "
+                            "with_polymorphic (they define conflicting settings)")
+            self.with_polymorphic = ('*', select_table)
+        else:
+            if with_polymorphic == '*':
+                self.with_polymorphic = ('*', None)
+            elif isinstance(with_polymorphic, (tuple, list)):
+                if isinstance(with_polymorphic[0], (basestring, tuple, list)):
+                    self.with_polymorphic = with_polymorphic
+                else:
+                    self.with_polymorphic = (with_polymorphic, None)
+            elif with_polymorphic is not None:
+                raise sa_exc.ArgumentError("Invalid setting for with_polymorphic")
+            else:
+                self.with_polymorphic = None
+
+        if isinstance(self.local_table, expression._SelectBaseMixin):
+            util.warn("mapper %s creating an alias for the given "
+                        "selectable.  References to the original selectable "
+                        "may be misinterpreted by queries, polymorphic_on, etc. "
+                        " Consider passing an explicit selectable.alias() construct instead." % self)
+            self.local_table = self.local_table.alias()
+
+        if self.with_polymorphic and isinstance(self.with_polymorphic[1], expression._SelectBaseMixin):
+            self.with_polymorphic = (self.with_polymorphic[0], self.with_polymorphic[1].alias())
+
+        # our 'polymorphic identity', a string name that when located in a result set row
+        # indicates this Mapper should be used to construct the object instance for that row.
+        self.polymorphic_identity = polymorphic_identity
+
+        if polymorphic_fetch:
+            util.warn_deprecated('polymorphic_fetch option is deprecated.  Unloaded columns '
+                            'load as deferred in all cases; loading can be controlled '
+                            'using the "with_polymorphic" option.')
+
+        # a dictionary of 'polymorphic identity' names, associating those names with
+        # Mappers that will be used to construct object instances upon a select operation.
+        if _polymorphic_map is None:
+            self.polymorphic_map = {}
+        else:
+            self.polymorphic_map = _polymorphic_map
+
+        self.include_properties = include_properties
+        self.exclude_properties = exclude_properties
+
+        self.compiled = False
+
+        self._configure_inheritance()
+        self._configure_extensions()
+        self._configure_class_instrumentation()
+        self._configure_properties()
+        self._configure_pks()
+        global _new_mappers
+        _new_mappers = True
+        self._log("constructed")
+
+    # configurational / mutating methods.  not threadsafe
+    # except for compile().
+    
+    def _configure_inheritance(self):
+        """Configure settings related to inherting and/or inherited mappers being present."""
+
+        # a set of all mappers which inherit from this one.
+        self._inheriting_mappers = set()
+
+        if self.inherits:
+            if isinstance(self.inherits, type):
+                self.inherits = class_mapper(self.inherits, compile=False)
+            if not issubclass(self.class_, self.inherits.class_):
+                raise sa_exc.ArgumentError(
+                        "Class '%s' does not inherit from '%s'" % 
+                        (self.class_.__name__, self.inherits.class_.__name__))
+            if self.non_primary != self.inherits.non_primary:
+                np = not self.non_primary and "primary" or "non-primary"
+                raise sa_exc.ArgumentError("Inheritance of %s mapper for class '%s' is "
+                        "only allowed from a %s mapper" % (np, self.class_.__name__, np))
+            # inherit_condition is optional.
+            if self.local_table is None:
+                self.local_table = self.inherits.local_table
+                self.mapped_table = self.inherits.mapped_table
+                self.single = True
+            elif not self.local_table is self.inherits.local_table:
+                if self.concrete:
+                    self.mapped_table = self.local_table
+                    for mapper in self.iterate_to_root():
+                        if mapper.polymorphic_on:
+                            mapper._requires_row_aliasing = True
+                else:
+                    if not self.inherit_condition:
+                        # figure out inherit condition from our table to the immediate table
+                        # of the inherited mapper, not its full table which could pull in other
+                        # stuff we dont want (allows test/inheritance.InheritTest4 to pass)
+                        self.inherit_condition = sqlutil.join_condition(self.inherits.local_table, self.local_table)
+                    self.mapped_table = sql.join(self.inherits.mapped_table, self.local_table, self.inherit_condition)
+
+                    fks = util.to_set(self.inherit_foreign_keys)
+                    self._inherits_equated_pairs = sqlutil.criterion_as_pairs(self.mapped_table.onclause, consider_as_foreign_keys=fks)
+            else:
+                self.mapped_table = self.local_table
+
+            if self.polymorphic_identity is not None and not self.concrete:
+                self._identity_class = self.inherits._identity_class
+            else:
+                self._identity_class = self.class_
+
+            if self.version_id_col is None:
+                self.version_id_col = self.inherits.version_id_col
+
+            for mapper in self.iterate_to_root():
+                util.reset_memoized(mapper, '_equivalent_columns')
+                util.reset_memoized(mapper, '_sorted_tables')
+                
+            if self.order_by is False and not self.concrete and self.inherits.order_by is not False:
+                self.order_by = self.inherits.order_by
+
+            self.polymorphic_map = self.inherits.polymorphic_map
+            self.batch = self.inherits.batch
+            self.inherits._inheriting_mappers.add(self)
+            self.base_mapper = self.inherits.base_mapper
+            self._all_tables = self.inherits._all_tables
+
+            if self.polymorphic_identity is not None:
+                self.polymorphic_map[self.polymorphic_identity] = self
+                if not self.polymorphic_on:
+                    for mapper in self.iterate_to_root():
+                        # try to set up polymorphic on using correesponding_column(); else leave
+                        # as None
+                        if mapper.polymorphic_on:
+                            self.polymorphic_on = self.mapped_table.corresponding_column(mapper.polymorphic_on)
+                            break
+        else:
+            self._all_tables = set()
+            self.base_mapper = self
+            self.mapped_table = self.local_table
+            if self.polymorphic_identity is not None:
+                self.polymorphic_map[self.polymorphic_identity] = self
+            self._identity_class = self.class_
+
+        if self.mapped_table is None:
+            raise sa_exc.ArgumentError("Mapper '%s' does not have a mapped_table specified." % self)
+
+    def _configure_extensions(self):
+        """Go through the global_extensions list as well as the list
+        of ``MapperExtensions`` specified for this ``Mapper`` and
+        creates a linked list of those extensions.
+        
+        """
+        extlist = util.OrderedSet()
+
+        extension = self.extension
+        if extension:
+            for ext_obj in util.to_list(extension):
+                # local MapperExtensions have already instrumented the class
+                extlist.add(ext_obj)
+
+        if self.inherits:
+            for ext in self.inherits.extension:
+                if ext not in extlist:
+                    extlist.add(ext)
+        else:
+            for ext in global_extensions:
+                if isinstance(ext, type):
+                    ext = ext()
+                if ext not in extlist:
+                    extlist.add(ext)
+
+        self.extension = ExtensionCarrier()
+        for ext in extlist:
+            self.extension.append(ext)
+
+    def _configure_class_instrumentation(self):
+        """If this mapper is to be a primary mapper (i.e. the
+        non_primary flag is not set), associate this Mapper with the
+        given class_ and entity name.
+
+        Subsequent calls to ``class_mapper()`` for the class_/entity
+        name combination will return this mapper.  Also decorate the
+        `__init__` method on the mapped class to include optional
+        auto-session attachment logic.
+
+        """
+        manager = attributes.manager_of_class(self.class_)
+
+        if self.non_primary:
+            if not manager or manager.mapper is None:
+                raise sa_exc.InvalidRequestError(
+                    "Class %s has no primary mapper configured.  Configure "
+                    "a primary mapper first before setting up a non primary "
+                    "Mapper.")
+            self.class_manager = manager
+            _mapper_registry[self] = True
+            return
+
+        if manager is not None:
+            assert manager.class_ is self.class_
+            if manager.mapper:
+                raise sa_exc.ArgumentError(
+                    "Class '%s' already has a primary mapper defined. "
+                    "Use non_primary=True to "
+                    "create a non primary Mapper.  clear_mappers() will "
+                    "remove *all* current mappers from all classes." %
+                    self.class_)
+            #else:
+                # a ClassManager may already exist as 
+                # ClassManager.instrument_attribute() creates 
+                # new managers for each subclass if they don't yet exist.
+                
+        _mapper_registry[self] = True
+
+        self.extension.instrument_class(self, self.class_)
+
+        if manager is None:
+            manager = attributes.register_class(self.class_, 
+                deferred_scalar_loader = _load_scalar_attributes
+            )
+
+        self.class_manager = manager
+
+        manager.mapper = self
+
+        # The remaining members can be added by any mapper, e_name None or not.
+        if manager.info.get(_INSTRUMENTOR, False):
+            return
+
+        event_registry = manager.events
+        event_registry.add_listener('on_init', _event_on_init)
+        event_registry.add_listener('on_init_failure', _event_on_init_failure)
+        event_registry.add_listener('on_resurrect', _event_on_resurrect)
+        
+        for key, method in util.iterate_attributes(self.class_):
+            if isinstance(method, types.FunctionType):
+                if hasattr(method, '__sa_reconstructor__'):
+                    event_registry.add_listener('on_load', method)
+                elif hasattr(method, '__sa_validators__'):
+                    for name in method.__sa_validators__:
+                        self._validators[name] = method
+
+        if 'reconstruct_instance' in self.extension:
+            def reconstruct(instance):
+                self.extension.reconstruct_instance(self, instance)
+            event_registry.add_listener('on_load', reconstruct)
+
+        manager.info[_INSTRUMENTOR] = self
+
+    def dispose(self):
+        # Disable any attribute-based compilation.
+        self.compiled = True
+        
+        if hasattr(self, '_compile_failed'):
+            del self._compile_failed
+            
+        if not self.non_primary and self.class_manager.mapper is self:
+            attributes.unregister_class(self.class_)
+
+    def _configure_pks(self):
+
+        self.tables = sqlutil.find_tables(self.mapped_table)
+
+        if not self.tables:
+            raise sa_exc.InvalidRequestError("Could not find any Table objects in mapped table '%s'" % str(self.mapped_table))
+
+        self._pks_by_table = {}
+        self._cols_by_table = {}
+
+        all_cols = util.column_set(chain(*[col.proxy_set for col in self._columntoproperty]))
+        pk_cols = util.column_set(c for c in all_cols if c.primary_key)
+
+        # identify primary key columns which are also mapped by this mapper.
+        tables = set(self.tables + [self.mapped_table])
+        self._all_tables.update(tables)
+        for t in tables:
+            if t.primary_key and pk_cols.issuperset(t.primary_key):
+                # ordering is important since it determines the ordering of mapper.primary_key (and therefore query.get())
+                self._pks_by_table[t] = util.ordered_column_set(t.primary_key).intersection(pk_cols)
+            self._cols_by_table[t] = util.ordered_column_set(t.c).intersection(all_cols)
+
+        # determine cols that aren't expressed within our tables; mark these
+        # as "read only" properties which are refreshed upon INSERT/UPDATE
+        self._readonly_props = set(
+            self._columntoproperty[col]
+            for col in self._columntoproperty
+            if not hasattr(col, 'table') or col.table not in self._cols_by_table)
+
+        # if explicit PK argument sent, add those columns to the primary key mappings
+        if self.primary_key_argument:
+            for k in self.primary_key_argument:
+                if k.table not in self._pks_by_table:
+                    self._pks_by_table[k.table] = util.OrderedSet()
+                self._pks_by_table[k.table].add(k)
+
+        if self.mapped_table not in self._pks_by_table or len(self._pks_by_table[self.mapped_table]) == 0:
+            raise sa_exc.ArgumentError("Mapper %s could not assemble any primary "
+                    "key columns for mapped table '%s'" % (self, self.mapped_table.description))
+
+        if self.inherits and not self.concrete and not self.primary_key_argument:
+            # if inheriting, the "primary key" for this mapper is that of the inheriting (unless concrete or explicit)
+            self.primary_key = self.inherits.primary_key
+        else:
+            # determine primary key from argument or mapped_table pks - reduce to the minimal set of columns
+            if self.primary_key_argument:
+                primary_key = sqlutil.reduce_columns(
+                    [self.mapped_table.corresponding_column(c) for c in self.primary_key_argument],
+                    ignore_nonexistent_tables=True)
+            else:
+                primary_key = sqlutil.reduce_columns(
+                    self._pks_by_table[self.mapped_table], ignore_nonexistent_tables=True)
+
+            if len(primary_key) == 0:
+                raise sa_exc.ArgumentError("Mapper %s could not assemble any primary "
+                    "key columns for mapped table '%s'" % (self, self.mapped_table.description))
+
+            self.primary_key = primary_key
+            self._log("Identified primary key columns: " + str(primary_key))
+
+    def _configure_properties(self):
+        
+        # Column and other ClauseElement objects which are mapped
+        self.columns = self.c = util.OrderedProperties()
+
+        # object attribute names mapped to MapperProperty objects
+        self._props = util.OrderedDict()
+
+        # table columns mapped to lists of MapperProperty objects
+        # using a list allows a single column to be defined as
+        # populating multiple object attributes
+        self._columntoproperty = util.column_dict()
+
+        # load custom properties
+        if self._init_properties:
+            for key, prop in self._init_properties.iteritems():
+                self._configure_property(key, prop, False)
+
+        # pull properties from the inherited mapper if any.
+        if self.inherits:
+            for key, prop in self.inherits._props.iteritems():
+                if key not in self._props and not self._should_exclude(key, key, local=False):
+                    self._adapt_inherited_property(key, prop, False)
+
+        # create properties for each column in the mapped table,
+        # for those columns which don't already map to a property
+        for column in self.mapped_table.columns:
+            if column in self._columntoproperty:
+                continue
+
+            column_key = (self.column_prefix or '') + column.key
+
+            if self._should_exclude(column.key, column_key, local=self.local_table.c.contains_column(column)):
+                continue
+
+            # adjust the "key" used for this column to that
+            # of the inheriting mapper
+            for mapper in self.iterate_to_root():
+                if column in mapper._columntoproperty:
+                    column_key = mapper._columntoproperty[column].key
+
+            self._configure_property(column_key, column, init=False, setparent=True)
+
+        # do a special check for the "discriminiator" column, as it may only be present
+        # in the 'with_polymorphic' selectable but we need it for the base mapper
+        if self.polymorphic_on and self.polymorphic_on not in self._columntoproperty:
+            col = self.mapped_table.corresponding_column(self.polymorphic_on)
+            if not col:
+                dont_instrument = True
+                col = self.polymorphic_on
+            else:
+                dont_instrument = False
+            if self._should_exclude(col.key, col.key, local=False):
+                raise sa_exc.InvalidRequestError("Cannot exclude or override the discriminator column %r" % col.key)
+            self._configure_property(col.key, ColumnProperty(col, _no_instrument=dont_instrument), init=False, setparent=True)
+
+    def _adapt_inherited_property(self, key, prop, init):
+        if not self.concrete:
+            self._configure_property(key, prop, init=False, setparent=False)
+        elif key not in self._props:
+            self._configure_property(key, ConcreteInheritedProperty(), init=init, setparent=True)
+            
+    def _configure_property(self, key, prop, init=True, setparent=True):
+        self._log("_configure_property(%s, %s)" % (key, prop.__class__.__name__))
+
+        if not isinstance(prop, MapperProperty):
+            # we were passed a Column or a list of Columns; generate a ColumnProperty
+            columns = util.to_list(prop)
+            column = columns[0]
+            if not expression.is_column(column):
+                raise sa_exc.ArgumentError("%s=%r is not an instance of MapperProperty or Column" % (key, prop))
+
+            prop = self._props.get(key, None)
+
+            if isinstance(prop, ColumnProperty):
+                # TODO: the "property already exists" case is still not well defined here.
+                # assuming single-column, etc.
+
+                if prop.parent is not self:
+                    # existing ColumnProperty from an inheriting mapper.
+                    # make a copy and append our column to it
+                    prop = prop.copy()
+                prop.columns.append(column)
+                self._log("appending to existing ColumnProperty %s" % (key))
+            elif prop is None or isinstance(prop, ConcreteInheritedProperty):
+                mapped_column = []
+                for c in columns:
+                    mc = self.mapped_table.corresponding_column(c)
+                    if not mc:
+                        mc = self.local_table.corresponding_column(c)
+                        if mc:
+                            # if the column is in the local table but not the mapped table,
+                            # this corresponds to adding a column after the fact to the local table.
+                            # [ticket:1523]
+                            self.mapped_table._reset_exported()
+                        mc = self.mapped_table.corresponding_column(c)
+                        if not mc:
+                            raise sa_exc.ArgumentError("Column '%s' is not represented in mapper's table.  "
+                                "Use the `column_property()` function to force this column "
+                                "to be mapped as a read-only attribute." % c)
+                    mapped_column.append(mc)
+                prop = ColumnProperty(*mapped_column)
+            else:
+                raise sa_exc.ArgumentError("WARNING: column '%s' conflicts with property '%r'.  "
+                    "To resolve this, map the column to the class under a different "
+                    "name in the 'properties' dictionary.  Or, to remove all awareness "
+                    "of the column entirely (including its availability as a foreign key), "
+                    "use the 'include_properties' or 'exclude_properties' mapper arguments "
+                    "to control specifically which table columns get mapped." % (column.key, prop))
+
+        if isinstance(prop, ColumnProperty):
+            col = self.mapped_table.corresponding_column(prop.columns[0])
+            
+            # if the column is not present in the mapped table, 
+            # test if a column has been added after the fact to the parent table
+            # (or their parent, etc.)
+            # [ticket:1570]
+            if col is None and self.inherits:
+                path = [self]
+                for m in self.inherits.iterate_to_root():
+                    col = m.local_table.corresponding_column(prop.columns[0])
+                    if col is not None:
+                        for m2 in path:
+                            m2.mapped_table._reset_exported()
+                        col = self.mapped_table.corresponding_column(prop.columns[0])
+                        break
+                    path.append(m)
+                
+            # otherwise, col might not be present! the selectable given 
+            # to the mapper need not include "deferred"
+            # columns (included in zblog tests)
+            if col is None:
+                col = prop.columns[0]
+
+                # column is coming in after _readonly_props was initialized; check
+                # for 'readonly'
+                if hasattr(self, '_readonly_props') and \
+                    (not hasattr(col, 'table') or col.table not in self._cols_by_table):
+                        self._readonly_props.add(prop)
+
+            else:
+                # if column is coming in after _cols_by_table was initialized, ensure the col is in the
+                # right set
+                if hasattr(self, '_cols_by_table') and col.table in self._cols_by_table and col not in self._cols_by_table[col.table]:
+                    self._cols_by_table[col.table].add(col)
+            
+            # if this ColumnProperty represents the "polymorphic discriminator"
+            # column, mark it.  We'll need this when rendering columns
+            # in SELECT statements.
+            if not hasattr(prop, '_is_polymorphic_discriminator'):
+                prop._is_polymorphic_discriminator = (col is self.polymorphic_on or prop.columns[0] is self.polymorphic_on)
+                
+            self.columns[key] = col
+            for col in prop.columns:
+                for col in col.proxy_set:
+                    self._columntoproperty[col] = prop
+
+        elif isinstance(prop, (ComparableProperty, SynonymProperty)) and setparent:
+            if prop.descriptor is None:
+                desc = getattr(self.class_, key, None)
+                if self._is_userland_descriptor(desc):
+                    prop.descriptor = desc
+            if getattr(prop, 'map_column', False):
+                if key not in self.mapped_table.c:
+                    raise sa_exc.ArgumentError(
+                        "Can't compile synonym '%s': no column on table '%s' named '%s'" 
+                         % (prop.name, self.mapped_table.description, key))
+                self._configure_property(prop.name, ColumnProperty(self.mapped_table.c[key]), init=init, setparent=setparent)
+
+        self._props[key] = prop
+        prop.key = key
+
+        if setparent:
+            prop.set_parent(self)
+
+        if not self.non_primary:
+            prop.instrument_class(self)
+
+        for mapper in self._inheriting_mappers:
+            mapper._adapt_inherited_property(key, prop, init)
+
+        if init:
+            prop.init()
+            prop.post_instrument_class(self)
+
+
+    def compile(self):
+        """Compile this mapper and all other non-compiled mappers.
+
+        This method checks the local compiled status as well as for
+        any new mappers that have been defined, and is safe to call
+        repeatedly.
+
+        """
+        global _new_mappers
+        if self.compiled and not _new_mappers:
+            return self
+
+        _COMPILE_MUTEX.acquire()
+        try:
+            try:
+                global _already_compiling
+                if _already_compiling:
+                    # re-entrance to compile() occurs rarely, when a class-mapped construct is
+                    # used within a ForeignKey, something that is possible
+                    # when using the declarative layer
+                    self._post_configure_properties()
+                    return
+                _already_compiling = True
+                try:
+
+                    # double-check inside mutex
+                    if self.compiled and not _new_mappers:
+                        return self
+
+                    # initialize properties on all mappers
+                    # note that _mapper_registry is unordered, which 
+                    # may randomly conceal/reveal issues related to 
+                    # the order of mapper compilation
+                    for mapper in list(_mapper_registry):
+                        if getattr(mapper, '_compile_failed', False):
+                            raise sa_exc.InvalidRequestError("One or more mappers failed to compile.  Exception was probably "
+                                    "suppressed within a hasattr() call. "
+                                    "Message was: %s" % mapper._compile_failed)
+                        if not mapper.compiled:
+                            mapper._post_configure_properties()
+
+                    _new_mappers = False
+                    return self
+                finally:
+                    _already_compiling = False
+            except:
+                import sys
+                exc = sys.exc_info()[1]
+                self._compile_failed = exc
+                raise
+        finally:
+            _COMPILE_MUTEX.release()
+
+    def _post_configure_properties(self):
+        """Call the ``init()`` method on all ``MapperProperties``
+        attached to this mapper.
+
+        This is a deferred configuration step which is intended
+        to execute once all mappers have been constructed.
+        
+        """
+
+        self._log("_post_configure_properties() started")
+        l = [(key, prop) for key, prop in self._props.iteritems()]
+        for key, prop in l:
+            self._log("initialize prop " + key)
+            
+            if prop.parent is self and not prop._compile_started:
+                prop.init()
+            
+            if prop._compile_finished:
+                prop.post_instrument_class(self)
+            
+        self._log("_post_configure_properties() complete")
+        self.compiled = True
+            
+    def add_properties(self, dict_of_properties):
+        """Add the given dictionary of properties to this mapper,
+        using `add_property`.
+
+        """
+        for key, value in dict_of_properties.iteritems():
+            self.add_property(key, value)
+
+    def add_property(self, key, prop):
+        """Add an individual MapperProperty to this mapper.
+
+        If the mapper has not been compiled yet, just adds the
+        property to the initial properties dictionary sent to the
+        constructor.  If this Mapper has already been compiled, then
+        the given MapperProperty is compiled immediately.
+
+        """
+        self._init_properties[key] = prop
+        self._configure_property(key, prop, init=self.compiled)
+
+
+    # class formatting / logging.
+    
+    def _log(self, msg):
+        if self._should_log_info:
+            self.logger.info(
+                "(" + self.class_.__name__ + 
+                "|" + 
+                (self.local_table and self.local_table.description or str(self.local_table)) +
+                (self.non_primary and "|non-primary" or "") + ") " + 
+                msg)
+
+    def _log_debug(self, msg):
+        if self._should_log_debug:
+            self.logger.debug(
+                "(" + self.class_.__name__ + 
+                "|" + 
+                (self.local_table and self.local_table.description or str(self.local_table)) + 
+                (self.non_primary and "|non-primary" or "") + ") " + 
+                msg)
+
+    def __repr__(self):
+        return '<Mapper at 0x%x; %s>' % (
+            id(self), self.class_.__name__)
+
+    def __str__(self):
+        return "Mapper|" + self.class_.__name__ + "|" + \
+                (self.local_table and self.local_table.description or str(self.local_table)) + \
+                (self.non_primary and "|non-primary" or "")
+
+    # informational / status
+    
+    def _is_orphan(self, state):
+        o = False
+        for mapper in self.iterate_to_root():
+            for (key, cls) in mapper.delete_orphans:
+                if attributes.manager_of_class(cls).has_parent(
+                    state, key, optimistic=_state_has_identity(state)):
+                    return False
+            o = o or bool(mapper.delete_orphans)
+        return o
+
+    def has_property(self, key):
+        return key in self._props
+
+    def get_property(self, key, resolve_synonyms=False, raiseerr=True):
+        """return a MapperProperty associated with the given key."""
+
+        self.compile()
+        return self._get_property(key, resolve_synonyms=resolve_synonyms, raiseerr=raiseerr)
+
+    def _get_property(self, key, resolve_synonyms=False, raiseerr=True):
+        prop = self._props.get(key, None)
+        if resolve_synonyms:
+            while isinstance(prop, SynonymProperty):
+                prop = self._props.get(prop.name, None)
+        if prop is None and raiseerr:
+            raise sa_exc.InvalidRequestError("Mapper '%s' has no property '%s'" % (str(self), key))
+        return prop
+    
+    @property
+    def iterate_properties(self):
+        """return an iterator of all MapperProperty objects."""
+        self.compile()
+        return self._props.itervalues()
+
+    def _mappers_from_spec(self, spec, selectable):
+        """given a with_polymorphic() argument, return the set of mappers it represents.
+
+        Trims the list of mappers to just those represented within the given selectable, if present.
+        This helps some more legacy-ish mappings.
+
+        """
+        if spec == '*':
+            mappers = list(self.polymorphic_iterator())
+        elif spec:
+            mappers = [_class_to_mapper(m) for m in util.to_list(spec)]
+            for m in mappers:
+                if not m.isa(self):
+                    raise sa_exc.InvalidRequestError("%r does not inherit from %r"  % (m, self))
+        else:
+            mappers = []
+
+        if selectable:
+            tables = set(sqlutil.find_tables(selectable, include_aliases=True))
+            mappers = [m for m in mappers if m.local_table in tables]
+
+        return mappers
+
+    def _selectable_from_mappers(self, mappers):
+        """given a list of mappers (assumed to be within this mapper's inheritance hierarchy),
+        construct an outerjoin amongst those mapper's mapped tables.
+
+        """
+        
+        from_obj = self.mapped_table
+        for m in mappers:
+            if m is self:
+                continue
+            if m.concrete:
+                raise sa_exc.InvalidRequestError("'with_polymorphic()' requires 'selectable' argument when concrete-inheriting mappers are used.")
+            elif not m.single:
+                from_obj = from_obj.outerjoin(m.local_table, m.inherit_condition)
+
+        return from_obj
+
+    @property
+    def _single_table_criterion(self):
+        if self.single and \
+            self.inherits and \
+            self.polymorphic_on and \
+            self.polymorphic_identity is not None:
+            return self.polymorphic_on.in_(
+                m.polymorphic_identity
+                for m in self.polymorphic_iterator())
+        else:
+            return None
+        
+    
+    @util.memoized_property
+    def _with_polymorphic_mappers(self):
+        if not self.with_polymorphic:
+            return [self]
+        return self._mappers_from_spec(*self.with_polymorphic)
+
+    @util.memoized_property
+    def _with_polymorphic_selectable(self):
+        if not self.with_polymorphic:
+            return self.mapped_table
+
+        spec, selectable = self.with_polymorphic
+        if selectable:
+            return selectable
+        else:
+            return self._selectable_from_mappers(self._mappers_from_spec(spec, selectable))
+
+    def _with_polymorphic_args(self, spec=None, selectable=False):
+        if self.with_polymorphic:
+            if not spec:
+                spec = self.with_polymorphic[0]
+            if selectable is False:
+                selectable = self.with_polymorphic[1]
+
+        mappers = self._mappers_from_spec(spec, selectable)
+        if selectable:
+            return mappers, selectable
+        else:
+            return mappers, self._selectable_from_mappers(mappers)
+
+    def _iterate_polymorphic_properties(self, mappers=None):
+        """Return an iterator of MapperProperty objects which will render into a SELECT."""
+        
+        if mappers is None:
+            mappers = self._with_polymorphic_mappers
+
+        if not mappers:
+            for c in self.iterate_properties:
+                yield c
+        else:
+            # in the polymorphic case, filter out discriminator columns
+            # from other mappers, as these are sometimes dependent on that
+            # mapper's polymorphic selectable (which we don't want rendered)
+            for c in util.unique_list(
+                chain(*[list(mapper.iterate_properties) for mapper in [self] + mappers])
+            ):
+                if getattr(c, '_is_polymorphic_discriminator', False) and \
+                    (not self.polymorphic_on or c.columns[0] is not self.polymorphic_on):
+                        continue
+                yield c
+    
+    @property
+    def properties(self):
+        raise NotImplementedError("Public collection of MapperProperty objects is "
+                    "provided by the get_property() and iterate_properties accessors.")
+
+    @util.memoized_property
+    def _get_clause(self):
+        """create a "get clause" based on the primary key.  this is used
+        by query.get() and many-to-one lazyloads to load this item
+        by primary key.
+
+        """
+        params = [(primary_key, sql.bindparam(None, type_=primary_key.type)) for primary_key in self.primary_key]
+        return sql.and_(*[k==v for (k, v) in params]), util.column_dict(params)
+
+    @util.memoized_property
+    def _equivalent_columns(self):
+        """Create a map of all *equivalent* columns, based on
+        the determination of column pairs that are equated to
+        one another based on inherit condition.  This is designed
+        to work with the queries that util.polymorphic_union
+        comes up with, which often don't include the columns from
+        the base table directly (including the subclass table columns
+        only).
+
+        The resulting structure is a dictionary of columns mapped
+        to lists of equivalent columns, i.e.
+
+        {
+            tablea.col1:
+                set([tableb.col1, tablec.col1]),
+            tablea.col2:
+                set([tabled.col2])
+        }
+
+        """
+        result = util.column_dict()
+        def visit_binary(binary):
+            if binary.operator == operators.eq:
+                if binary.left in result:
+                    result[binary.left].add(binary.right)
+                else:
+                    result[binary.left] = util.column_set((binary.right,))
+                if binary.right in result:
+                    result[binary.right].add(binary.left)
+                else:
+                    result[binary.right] = util.column_set((binary.left,))
+        for mapper in self.base_mapper.polymorphic_iterator():
+            if mapper.inherit_condition:
+                visitors.traverse(mapper.inherit_condition, {}, {'binary':visit_binary})
+
+        return result
+
+    def _is_userland_descriptor(self, obj):
+        return not isinstance(obj, (MapperProperty, attributes.InstrumentedAttribute)) and hasattr(obj, '__get__')
+
+    def _should_exclude(self, name, assigned_name, local):
+        """determine whether a particular property should be implicitly present on the class.
+
+        This occurs when properties are propagated from an inherited class, or are
+        applied from the columns present in the mapped table.
+
+        """
+
+        # check for descriptors, either local or from
+        # an inherited class
+        if local:
+            if self.class_.__dict__.get(assigned_name, None)\
+                and self._is_userland_descriptor(self.class_.__dict__[assigned_name]):
+                return True
+        else:
+            if getattr(self.class_, assigned_name, None)\
+                and self._is_userland_descriptor(getattr(self.class_, assigned_name)):
+                return True
+
+        if (self.include_properties is not None and
+            name not in self.include_properties):
+            self._log("not including property %s" % (name))
+            return True
+
+        if (self.exclude_properties is not None and
+            name in self.exclude_properties):
+            self._log("excluding property %s" % (name))
+            return True
+
+        return False
+
+    def common_parent(self, other):
+        """Return true if the given mapper shares a common inherited parent as this mapper."""
+
+        return self.base_mapper is other.base_mapper
+
+    def _canload(self, state, allow_subtypes):
+        s = self.primary_mapper()
+        if self.polymorphic_on or allow_subtypes:
+            return _state_mapper(state).isa(s)
+        else:
+            return _state_mapper(state) is s
+
+    def isa(self, other):
+        """Return True if the this mapper inherits from the given mapper."""
+
+        m = self
+        while m and m is not other:
+            m = m.inherits
+        return bool(m)
+
+    def iterate_to_root(self):
+        m = self
+        while m:
+            yield m
+            m = m.inherits
+
+    def polymorphic_iterator(self):
+        """Iterate through the collection including this mapper and
+        all descendant mappers.
+
+        This includes not just the immediately inheriting mappers but
+        all their inheriting mappers as well.
+
+        To iterate through an entire hierarchy, use
+        ``mapper.base_mapper.polymorphic_iterator()``.
+        
+        """
+        stack = deque([self])
+        while stack:
+            item = stack.popleft()
+            yield item
+            stack.extend(item._inheriting_mappers)
+
+    def primary_mapper(self):
+        """Return the primary mapper corresponding to this mapper's class key (class)."""
+        
+        return self.class_manager.mapper
+
+    def identity_key_from_row(self, row, adapter=None):
+        """Return an identity-map key for use in storing/retrieving an
+        item from the identity map.
+
+        row
+          A ``sqlalchemy.engine.base.RowProxy`` instance or a
+          dictionary corresponding result-set ``ColumnElement``
+          instances to their values within a row.
+
+        """
+        pk_cols = self.primary_key
+        if adapter:
+            pk_cols = [adapter.columns[c] for c in pk_cols]
+
+        return (self._identity_class, tuple(row[column] for column in pk_cols))
+
+    def identity_key_from_primary_key(self, primary_key):
+        """Return an identity-map key for use in storing/retrieving an
+        item from an identity map.
+
+        primary_key
+          A list of values indicating the identifier.
+
+        """
+        return (self._identity_class, tuple(util.to_list(primary_key)))
+
+    def identity_key_from_instance(self, instance):
+        """Return the identity key for the given instance, based on
+        its primary key attributes.
+
+        This value is typically also found on the instance state under the
+        attribute name `key`.
+
+        """
+        return self.identity_key_from_primary_key(self.primary_key_from_instance(instance))
+
+    def _identity_key_from_state(self, state):
+        return self.identity_key_from_primary_key(self._primary_key_from_state(state))
+
+    def primary_key_from_instance(self, instance):
+        """Return the list of primary key values for the given
+        instance.
+
+        """
+        state = attributes.instance_state(instance)
+        return self._primary_key_from_state(state)
+
+    def _primary_key_from_state(self, state):
+        return [self._get_state_attr_by_column(state, column) for column in self.primary_key]
+
+    def _get_col_to_prop(self, column):
+        try:
+            return self._columntoproperty[column]
+        except KeyError:
+            prop = self._props.get(column.key, None)
+            if prop:
+                raise exc.UnmappedColumnError("Column '%s.%s' is not available, due to conflicting property '%s':%s" % (column.table.name, column.name, column.key, repr(prop)))
+            else:
+                raise exc.UnmappedColumnError("No column %s is configured on mapper %s..." % (column, self))
+
+    # TODO: improve names?
+    def _get_state_attr_by_column(self, state, column):
+        return self._get_col_to_prop(column).getattr(state, column)
+
+    def _set_state_attr_by_column(self, state, column, value):
+        return self._get_col_to_prop(column).setattr(state, value, column)
+
+    def _get_committed_attr_by_column(self, obj, column):
+        state = attributes.instance_state(obj)
+        return self._get_committed_state_attr_by_column(state, column)
+
+    def _get_committed_state_attr_by_column(self, state, column, passive=False):
+        return self._get_col_to_prop(column).getcommitted(state, column, passive=passive)
+
+    def _optimized_get_statement(self, state, attribute_names):
+        """assemble a WHERE clause which retrieves a given state by primary key, using a minimized set of tables.
+        
+        Applies to a joined-table inheritance mapper where the 
+        requested attribute names are only present on joined tables,
+        not the base table.  The WHERE clause attempts to include 
+        only those tables to minimize joins.
+        
+        """
+        props = self._props
+        
+        tables = set(chain(*
+                        (sqlutil.find_tables(props[key].columns[0], check_columns=True) 
+                        for key in attribute_names)
+                    ))
+        
+        if self.base_mapper.local_table in tables:
+            return None
+
+        class ColumnsNotAvailable(Exception):
+            pass
+
+        def visit_binary(binary):
+            leftcol = binary.left
+            rightcol = binary.right
+            if leftcol is None or rightcol is None:
+                return
+
+            if leftcol.table not in tables:
+                leftval = self._get_committed_state_attr_by_column(state, leftcol, passive=True)
+                if leftval is attributes.PASSIVE_NORESULT:
+                    raise ColumnsNotAvailable()
+                binary.left = sql.bindparam(None, leftval, type_=binary.right.type)
+            elif rightcol.table not in tables:
+                rightval = self._get_committed_state_attr_by_column(state, rightcol, passive=True)
+                if rightval is attributes.PASSIVE_NORESULT:
+                    raise ColumnsNotAvailable()
+                binary.right = sql.bindparam(None, rightval, type_=binary.right.type)
+
+        allconds = []
+
+        try:
+            start = False
+            for mapper in reversed(list(self.iterate_to_root())):
+                if mapper.local_table in tables:
+                    start = True
+                if start and not mapper.single:
+                    allconds.append(visitors.cloned_traverse(mapper.inherit_condition, {}, {'binary':visit_binary}))
+        except ColumnsNotAvailable:
+            return None
+
+        cond = sql.and_(*allconds)
+
+        return sql.select([props[key].columns[0] for key in attribute_names], cond, use_labels=True)
+
+    def cascade_iterator(self, type_, state, halt_on=None):
+        """Iterate each element and its mapper in an object graph,
+        for all relations that meet the given cascade rule.
+
+        ``type\_``:
+          The name of the cascade rule (i.e. save-update, delete,
+          etc.)
+
+        ``state``:
+          The lead InstanceState.  child items will be processed per
+          the relations defined for this object's mapper.
+
+        the return value are object instances; this provides a strong
+        reference so that they don't fall out of scope immediately.
+
+        """
+        visited_instances = util.IdentitySet()
+        visitables = [(self._props.itervalues(), 'property', state)]
+
+        while visitables:
+            iterator, item_type, parent_state = visitables[-1]
+            try:
+                if item_type == 'property':
+                    prop = iterator.next()
+                    visitables.append((prop.cascade_iterator(type_, parent_state, visited_instances, halt_on), 'mapper', None))
+                elif item_type == 'mapper':
+                    instance, instance_mapper, corresponding_state  = iterator.next()
+                    yield (instance, instance_mapper)
+                    visitables.append((instance_mapper._props.itervalues(), 'property', corresponding_state))
+            except StopIteration:
+                visitables.pop()
+
+    # persistence
+
+    @util.memoized_property
+    def _sorted_tables(self):
+        table_to_mapper = {}
+        for mapper in self.base_mapper.polymorphic_iterator():
+            for t in mapper.tables:
+                table_to_mapper[t] = mapper
+        
+        sorted_ = sqlutil.sort_tables(table_to_mapper.iterkeys())
+        ret = util.OrderedDict()
+        for t in sorted_:
+            ret[t] = table_to_mapper[t]
+        return ret
+
+    def _save_obj(self, states, uowtransaction, postupdate=False, post_update_cols=None, single=False):
+        """Issue ``INSERT`` and/or ``UPDATE`` statements for a list of objects.
+
+        This is called within the context of a UOWTransaction during a
+        flush operation.
+
+        `_save_obj` issues SQL statements not just for instances mapped
+        directly by this mapper, but for instances mapped by all
+        inheriting mappers as well.  This is to maintain proper insert
+        ordering among a polymorphic chain of instances. Therefore
+        _save_obj is typically called only on a *base mapper*, or a
+        mapper which does not inherit from any other mapper.
+        
+        """
+        if self._should_log_debug:
+            self._log_debug("_save_obj() start, " + (single and "non-batched" or "batched"))
+
+        # if batch=false, call _save_obj separately for each object
+        if not single and not self.batch:
+            for state in _sort_states(states):
+                self._save_obj([state], uowtransaction, postupdate=postupdate, post_update_cols=post_update_cols, single=True)
+            return
+
+        # if session has a connection callable,
+        # organize individual states with the connection to use for insert/update
+        tups = []
+        if 'connection_callable' in uowtransaction.mapper_flush_opts:
+            connection_callable = uowtransaction.mapper_flush_opts['connection_callable']
+            for state in _sort_states(states):
+                m = _state_mapper(state)
+                tups.append(
+                    (
+                        state, 
+                        m, 
+                        connection_callable(self, state.obj()), 
+                        _state_has_identity(state), 
+                        state.key or m._identity_key_from_state(state)
+                    )
+                )
+        else:
+            connection = uowtransaction.transaction.connection(self)
+            for state in _sort_states(states):
+                m = _state_mapper(state)
+                tups.append(
+                    (
+                        state, 
+                        m, 
+                        connection,
+                        _state_has_identity(state), 
+                        state.key or m._identity_key_from_state(state)
+                    )
+                )
+
+        if not postupdate:
+            # call before_XXX extensions
+            for state, mapper, connection, has_identity, instance_key in tups:
+                if not has_identity:
+                    if 'before_insert' in mapper.extension:
+                        mapper.extension.before_insert(mapper, connection, state.obj())
+                else:
+                    if 'before_update' in mapper.extension:
+                        mapper.extension.before_update(mapper, connection, state.obj())
+
+        row_switches = set()
+        if not postupdate:
+            for state, mapper, connection, has_identity, instance_key in tups:
+                # detect if we have a "pending" instance (i.e. has no instance_key attached to it),
+                # and another instance with the same identity key already exists as persistent.  convert to an
+                # UPDATE if so.
+                if not has_identity and instance_key in uowtransaction.session.identity_map:
+                    instance = uowtransaction.session.identity_map[instance_key]
+                    existing = attributes.instance_state(instance)
+                    if not uowtransaction.is_deleted(existing):
+                        raise exc.FlushError(
+                            "New instance %s with identity key %s conflicts with persistent instance %s" % 
+                            (state_str(state), instance_key, state_str(existing)))
+                    if self._should_log_debug:
+                        self._log_debug(
+                            "detected row switch for identity %s.  will update %s, remove %s from "
+                            "transaction" % (instance_key, state_str(state), state_str(existing)))
+                            
+                    # remove the "delete" flag from the existing element
+                    uowtransaction.set_row_switch(existing)
+                    row_switches.add(state)
+        
+        table_to_mapper = self._sorted_tables
+
+        for table in table_to_mapper.iterkeys():
+            insert = []
+            update = []
+
+            for state, mapper, connection, has_identity, instance_key in tups:
+                if table not in mapper._pks_by_table:
+                    continue
+                    
+                pks = mapper._pks_by_table[table]
+                
+                if self._should_log_debug:
+                    self._log_debug("_save_obj() table '%s' instance %s identity %s" %
+                                    (table.name, state_str(state), str(instance_key)))
+
+                isinsert = not has_identity and not postupdate and state not in row_switches
+                
+                params = {}
+                value_params = {}
+                hasdata = False
+
+                if isinsert:
+                    for col in mapper._cols_by_table[table]:
+                        if col is mapper.version_id_col:
+                            params[col.key] = 1
+                        elif mapper.polymorphic_on and mapper.polymorphic_on.shares_lineage(col):
+                            if self._should_log_debug:
+                                self._log_debug(
+                                    "Using polymorphic identity '%s' for insert column '%s'" %
+                                    (mapper.polymorphic_identity, col.key))
+                            value = mapper.polymorphic_identity
+                            if ((col.default is None and
+                                 col.server_default is None) or
+                                value is not None):
+                                params[col.key] = value
+                        elif col in pks:
+                            value = mapper._get_state_attr_by_column(state, col)
+                            if value is not None:
+                                params[col.key] = value
+                        else:
+                            value = mapper._get_state_attr_by_column(state, col)
+                            if ((col.default is None and
+                                 col.server_default is None) or
+                                value is not None):
+                                if isinstance(value, sql.ClauseElement):
+                                    value_params[col] = value
+                                else:
+                                    params[col.key] = value
+                    insert.append((state, params, mapper, connection, value_params))
+                else:
+                    for col in mapper._cols_by_table[table]:
+                        if col is mapper.version_id_col:
+                            params[col._label] = mapper._get_state_attr_by_column(state, col)
+                            params[col.key] = params[col._label] + 1
+                            for prop in mapper._columntoproperty.itervalues():
+                                history = attributes.get_state_history(state, prop.key, passive=True)
+                                if history.added:
+                                    hasdata = True
+                        elif mapper.polymorphic_on and mapper.polymorphic_on.shares_lineage(col) and col not in pks:
+                            pass
+                        else:
+                            if post_update_cols is not None and col not in post_update_cols:
+                                if col in pks:
+                                    params[col._label] = mapper._get_state_attr_by_column(state, col)
+                                continue
+
+                            prop = mapper._columntoproperty[col]
+                            history = attributes.get_state_history(state, prop.key, passive=True)
+                            if history.added:
+                                if isinstance(history.added[0], sql.ClauseElement):
+                                    value_params[col] = history.added[0]
+                                else:
+                                    params[col.key] = prop.get_col_value(col, history.added[0])
+                                if col in pks:
+                                    if history.deleted:
+                                        params[col._label] = prop.get_col_value(col, history.deleted[0])
+                                        hasdata = True
+                                    else:
+                                        # row switch logic can reach us here
+                                        # remove the pk from the update params so the update doesn't
+                                        # attempt to include the pk in the update statement
+                                        del params[col.key]
+                                        params[col._label] = prop.get_col_value(col, history.added[0])
+                                else:
+                                    hasdata = True
+                            elif col in pks:
+                                params[col._label] = mapper._get_state_attr_by_column(state, col)
+                    if hasdata:
+                        update.append((state, params, mapper, connection, value_params))
+
+            if update:
+                mapper = table_to_mapper[table]
+                clause = sql.and_()
+
+                for col in mapper._pks_by_table[table]:
+                    clause.clauses.append(col == sql.bindparam(col._label, type_=col.type))
+
+                if mapper.version_id_col and table.c.contains_column(mapper.version_id_col):
+                    clause.clauses.append(mapper.version_id_col == sql.bindparam(mapper.version_id_col._label, type_=col.type))
+
+                statement = table.update(clause)
+                rows = 0
+                for state, params, mapper, connection, value_params in update:
+                    c = connection.execute(statement.values(value_params), params)
+                    mapper._postfetch(uowtransaction, connection, table, state, c, c.last_updated_params(), value_params)
+
+                    rows += c.rowcount
+
+                if c.supports_sane_rowcount() and rows != len(update):
+                    raise exc.ConcurrentModificationError("Updated rowcount %d does not match number of objects updated %d" % (rows, len(update)))
+
+            if insert:
+                statement = table.insert()
+                for state, params, mapper, connection, value_params in insert:
+                    c = connection.execute(statement.values(value_params), params)
+                    primary_key = c.last_inserted_ids()
+
+                    if primary_key is not None:
+                        # set primary key attributes
+                        for i, col in enumerate(mapper._pks_by_table[table]):
+                            if mapper._get_state_attr_by_column(state, col) is None and len(primary_key) > i:
+                                mapper._set_state_attr_by_column(state, col, primary_key[i])
+                    mapper._postfetch(uowtransaction, connection, table, state, c, c.last_inserted_params(), value_params)
+
+                    # synchronize newly inserted ids from one table to the next
+                    # TODO: this performs some unnecessary attribute transfers
+                    # from an attribute to itself, since the attribute is often mapped
+                    # to multiple, equivalent columns.  it also may fire off more
+                    # than needed overall.
+                    for m in mapper.iterate_to_root():
+                        if m._inherits_equated_pairs:
+                            sync.populate(state, m, state, m, m._inherits_equated_pairs)
+
+        if not postupdate:
+            for state, mapper, connection, has_identity, instance_key in tups:
+
+                # expire readonly attributes
+                readonly = state.unmodified.intersection(
+                    p.key for p in mapper._readonly_props
+                )
+
+                if readonly:
+                    _expire_state(state, readonly)
+
+                # if specified, eagerly refresh whatever has
+                # been expired.
+                if self.eager_defaults and state.unloaded:
+                    state.key = self._identity_key_from_state(state)
+                    uowtransaction.session.query(self)._get(
+                        state.key, refresh_state=state,
+                        only_load_props=state.unloaded)
+
+                # call after_XXX extensions
+                if not has_identity:
+                    if 'after_insert' in mapper.extension:
+                        mapper.extension.after_insert(mapper, connection, state.obj())
+                else:
+                    if 'after_update' in mapper.extension:
+                        mapper.extension.after_update(mapper, connection, state.obj())
+
+    def _postfetch(self, uowtransaction, connection, table, state, resultproxy, params, value_params):
+        """Expire attributes in need of newly persisted database state."""
+
+        postfetch_cols = resultproxy.postfetch_cols()
+        generated_cols = list(resultproxy.prefetch_cols())
+
+        if self.polymorphic_on:
+            po = table.corresponding_column(self.polymorphic_on)
+            if po:
+                generated_cols.append(po)
+
+        if self.version_id_col:
+            generated_cols.append(self.version_id_col)
+
+        for c in generated_cols:
+            if c.key in params and c in self._columntoproperty:
+                self._set_state_attr_by_column(state, c, params[c.key])
+
+        deferred_props = [prop.key for prop in [self._columntoproperty[c] for c in postfetch_cols]]
+
+        if deferred_props:
+            _expire_state(state, deferred_props)
+
+    def _delete_obj(self, states, uowtransaction):
+        """Issue ``DELETE`` statements for a list of objects.
+
+        This is called within the context of a UOWTransaction during a
+        flush operation.
+
+        """
+        if self._should_log_debug:
+            self._log_debug("_delete_obj() start")
+
+        if 'connection_callable' in uowtransaction.mapper_flush_opts:
+            connection_callable = uowtransaction.mapper_flush_opts['connection_callable']
+            tups = [(state, _state_mapper(state), connection_callable(self, state.obj())) for state in _sort_states(states)]
+        else:
+            connection = uowtransaction.transaction.connection(self)
+            tups = [(state, _state_mapper(state), connection) for state in _sort_states(states)]
+
+        for state, mapper, connection in tups:
+            if 'before_delete' in mapper.extension:
+                mapper.extension.before_delete(mapper, connection, state.obj())
+
+        table_to_mapper = self._sorted_tables
+
+        for table in reversed(table_to_mapper.keys()):
+            delete = {}
+            for state, mapper, connection in tups:
+                if table not in mapper._pks_by_table:
+                    continue
+
+                params = {}
+                if not _state_has_identity(state):
+                    continue
+                else:
+                    delete.setdefault(connection, []).append(params)
+                for col in mapper._pks_by_table[table]:
+                    params[col.key] = mapper._get_state_attr_by_column(state, col)
+                if mapper.version_id_col and table.c.contains_column(mapper.version_id_col):
+                    params[mapper.version_id_col.key] = mapper._get_state_attr_by_column(state, mapper.version_id_col)
+
+            for connection, del_objects in delete.iteritems():
+                mapper = table_to_mapper[table]
+                clause = sql.and_()
+                for col in mapper._pks_by_table[table]:
+                    clause.clauses.append(col == sql.bindparam(col.key, type_=col.type))
+                if mapper.version_id_col and table.c.contains_column(mapper.version_id_col):
+                    clause.clauses.append(
+                        mapper.version_id_col == 
+                        sql.bindparam(mapper.version_id_col.key, type_=mapper.version_id_col.type))
+                statement = table.delete(clause)
+                c = connection.execute(statement, del_objects)
+                if c.supports_sane_multi_rowcount() and c.rowcount != len(del_objects):
+                    raise exc.ConcurrentModificationError("Deleted rowcount %d does not match "
+                            "number of objects deleted %d" % (c.rowcount, len(del_objects)))
+
+        for state, mapper, connection in tups:
+            if 'after_delete' in mapper.extension:
+                mapper.extension.after_delete(mapper, connection, state.obj())
+
+    def _register_dependencies(self, uowcommit):
+        """Register ``DependencyProcessor`` instances with a
+        ``unitofwork.UOWTransaction``.
+
+        This call `register_dependencies` on all attached
+        ``MapperProperty`` instances.
+        
+        """
+        for dep in self._props.values() + self._dependency_processors:
+            dep.register_dependencies(uowcommit)
+
+    def _register_processors(self, uowcommit):
+        for dep in self._props.values() + self._dependency_processors:
+            dep.register_processors(uowcommit)
+
+    # result set conversion
+
+    def _instance_processor(self, context, path, adapter, polymorphic_from=None, extension=None, only_load_props=None, refresh_state=None, polymorphic_discriminator=None):
+        """Produce a mapper level row processor callable which processes rows into mapped instances."""
+        
+        pk_cols = self.primary_key
+
+        if polymorphic_from or refresh_state:
+            polymorphic_on = None
+        else:
+            polymorphic_on = polymorphic_discriminator or self.polymorphic_on
+            polymorphic_instances = util.PopulateDict(self._configure_subclass_mapper(context, path, adapter))
+
+        version_id_col = self.version_id_col
+
+        if adapter:
+            pk_cols = [adapter.columns[c] for c in pk_cols]
+            if polymorphic_on:
+                polymorphic_on = adapter.columns[polymorphic_on]
+            if version_id_col:
+                version_id_col = adapter.columns[version_id_col]
+
+        identity_class = self._identity_class
+        def identity_key(row):
+            return (identity_class, tuple(row[column] for column in pk_cols))
+
+        new_populators = []
+        existing_populators = []
+
+        def populate_state(state, dict_, row, isnew, only_load_props, **flags):
+            if isnew:
+                if context.propagate_options:
+                    state.load_options = context.propagate_options
+                if state.load_options:
+                    state.load_path = context.query._current_path + path
+
+            if not new_populators:
+                new_populators[:], existing_populators[:] = self._populators(context, path, row, adapter)
+
+            if isnew:
+                populators = new_populators
+            else:
+                populators = existing_populators
+
+            if only_load_props:
+                populators = [p for p in populators if p[0] in only_load_props]
+
+            for key, populator in populators:
+                populator(state, dict_, row, isnew=isnew, **flags)
+
+        session_identity_map = context.session.identity_map
+
+        if not extension:
+            extension = self.extension
+
+        translate_row = extension.get('translate_row', None)
+        create_instance = extension.get('create_instance', None)
+        populate_instance = extension.get('populate_instance', None)
+        append_result = extension.get('append_result', None)
+        populate_existing = context.populate_existing or self.always_refresh
+
+        def _instance(row, result):
+            if translate_row:
+                ret = translate_row(self, context, row)
+                if ret is not EXT_CONTINUE:
+                    row = ret
+
+            if polymorphic_on:
+                discriminator = row[polymorphic_on]
+                if discriminator is not None:
+                    _instance = polymorphic_instances[discriminator]
+                    if _instance:
+                        return _instance(row, result)
+
+            # determine identity key
+            if refresh_state:
+                identitykey = refresh_state.key
+                if identitykey is None:
+                    # super-rare condition; a refresh is being called
+                    # on a non-instance-key instance; this is meant to only
+                    # occur within a flush()
+                    identitykey = self._identity_key_from_state(refresh_state)
+            else:
+                identitykey = identity_key(row)
+
+            if identitykey in session_identity_map:
+                instance = session_identity_map[identitykey]
+                state = attributes.instance_state(instance)
+                dict_ = attributes.instance_dict(instance)
+
+                if self._should_log_debug:
+                    self._log_debug("_instance(): using existing instance %s identity %s" %
+                                    (instance_str(instance), identitykey))
+
+                isnew = state.runid != context.runid
+                currentload = not isnew
+                loaded_instance = False
+
+                if not currentload and version_id_col and context.version_check and \
+                        self._get_state_attr_by_column(state, self.version_id_col) != row[version_id_col]:
+                    raise exc.ConcurrentModificationError(
+                            "Instance '%s' version of %s does not match %s" 
+                            % (state_str(state), self._get_state_attr_by_column(state, self.version_id_col), row[version_id_col]))
+            elif refresh_state:
+                # out of band refresh_state detected (i.e. its not in the session.identity_map)
+                # honor it anyway.  this can happen if a _get() occurs within save_obj(), such as
+                # when eager_defaults is True.
+                state = refresh_state
+                instance = state.obj()
+                dict_ = attributes.instance_dict(instance)
+                isnew = state.runid != context.runid
+                currentload = True
+                loaded_instance = False
+            else:
+                if self._should_log_debug:
+                    self._log_debug("_instance(): identity key %s not in session" % (identitykey,))
+
+                if self.allow_null_pks:
+                    for x in identitykey[1]:
+                        if x is not None:
+                            break
+                    else:
+                        return None
+                else:
+                    if None in identitykey[1]:
+                        return None
+                isnew = True
+                currentload = True
+                loaded_instance = True
+
+                if create_instance:
+                    instance = create_instance(self, context, row, self.class_)
+                    if instance is EXT_CONTINUE:
+                        instance = self.class_manager.new_instance()
+                    else:
+                        manager = attributes.manager_of_class(instance.__class__)
+                        # TODO: if manager is None, raise a friendly error about
+                        # returning instances of unmapped types
+                        manager.setup_instance(instance)
+                else:
+                    instance = self.class_manager.new_instance()
+
+                if self._should_log_debug:
+                    self._log_debug("_instance(): created new instance %s identity %s" %
+                                    (instance_str(instance), identitykey))
+
+                dict_ = attributes.instance_dict(instance)
+                state = attributes.instance_state(instance)
+                state.key = identitykey
+
+                # manually adding instance to session.  for a complete add,
+                # session._finalize_loaded() must be called.
+                state.session_id = context.session.hash_key
+                session_identity_map.add(state)
+
+            if currentload or populate_existing:
+                if isnew:
+                    state.runid = context.runid
+                    context.progress[state] = dict_
+
+                if not populate_instance or \
+                        populate_instance(self, context, row, instance, 
+                            only_load_props=only_load_props, instancekey=identitykey, isnew=isnew) is EXT_CONTINUE:
+                    populate_state(state, dict_, row, isnew, only_load_props)
+
+            else:
+                # populate attributes on non-loading instances which have been expired
+                # TODO: apply eager loads to un-lazy loaded collections ?
+                if state in context.partials or state.unloaded:
+
+                    if state in context.partials:
+                        isnew = False
+                        (d_, attrs) = context.partials[state]
+                    else:
+                        isnew = True
+                        attrs = state.unloaded
+                        context.partials[state] = (dict_, attrs)  #<-- allow query.instances to commit the subset of attrs
+
+                    if not populate_instance or \
+                            populate_instance(self, context, row, instance, 
+                                only_load_props=attrs, instancekey=identitykey, isnew=isnew) is EXT_CONTINUE:
+                        populate_state(state, dict_, row, isnew, attrs, instancekey=identitykey)
+
+            if loaded_instance:
+                state._run_on_load(instance)
+
+            if result is not None and \
+                        (not append_result or 
+                            append_result(self, context, row, instance, result, instancekey=identitykey, isnew=isnew) is EXT_CONTINUE):
+                result.append(instance)
+
+            return instance
+        return _instance
+
+    def _populators(self, context, path, row, adapter):
+        """Produce a collection of attribute level row processor callables."""
+        
+        new_populators, existing_populators = [], []
+        for prop in self._props.itervalues():
+            newpop, existingpop = prop.create_row_processor(context, path, self, row, adapter)
+            if newpop:
+                new_populators.append((prop.key, newpop))
+            if existingpop:
+                existing_populators.append((prop.key, existingpop))
+        return new_populators, existing_populators
+
+    def _configure_subclass_mapper(self, context, path, adapter):
+        """Produce a mapper level row processor callable factory for mappers inheriting this one."""
+        
+        def configure_subclass_mapper(discriminator):
+            try:
+                mapper = self.polymorphic_map[discriminator]
+            except KeyError:
+                raise AssertionError("No such polymorphic_identity %r is defined" % discriminator)
+            if mapper is self:
+                return None
+            return mapper._instance_processor(context, path, adapter, polymorphic_from=self)
+        return configure_subclass_mapper
+
+log.class_logger(Mapper)
+
+
+def reconstructor(fn):
+    """Decorate a method as the 'reconstructor' hook.
+
+    Designates a method as the "reconstructor", an ``__init__``-like
+    method that will be called by the ORM after the instance has been
+    loaded from the database or otherwise reconstituted.
+
+    The reconstructor will be invoked with no arguments.  Scalar
+    (non-collection) database-mapped attributes of the instance will
+    be available for use within the function.  Eagerly-loaded
+    collections are generally not yet available and will usually only
+    contain the first element.  ORM state changes made to objects at
+    this stage will not be recorded for the next flush() operation, so
+    the activity within a reconstructor should be conservative.
+
+    """
+    fn.__sa_reconstructor__ = True
+    return fn
+
+def validates(*names):
+    """Decorate a method as a 'validator' for one or more named properties.
+
+    Designates a method as a validator, a method which receives the
+    name of the attribute as well as a value to be assigned, or in the
+    case of a collection to be added to the collection.  The function
+    can then raise validation exceptions to halt the process from continuing,
+    or can modify or replace the value before proceeding.   The function
+    should otherwise return the given value.
+
+    """
+    def wrap(fn):
+        fn.__sa_validators__ = names
+        return fn
+    return wrap
+
+def _event_on_init(state, instance, args, kwargs):
+    """Trigger mapper compilation and run init_instance hooks."""
+
+    instrumenting_mapper = state.manager.info[_INSTRUMENTOR]
+    # compile() always compiles all mappers
+    instrumenting_mapper.compile()
+    if 'init_instance' in instrumenting_mapper.extension:
+        instrumenting_mapper.extension.init_instance(
+            instrumenting_mapper, instrumenting_mapper.class_,
+            state.manager.events.original_init,
+            instance, args, kwargs)
+
+def _event_on_init_failure(state, instance, args, kwargs):
+    """Run init_failed hooks."""
+
+    instrumenting_mapper = state.manager.info[_INSTRUMENTOR]
+    if 'init_failed' in instrumenting_mapper.extension:
+        util.warn_exception(
+            instrumenting_mapper.extension.init_failed,
+            instrumenting_mapper, instrumenting_mapper.class_,
+            state.manager.events.original_init, instance, args, kwargs)
+
+def _event_on_resurrect(state, instance):
+    # re-populate the primary key elements
+    # of the dict based on the mapping.
+    instrumenting_mapper = state.manager.info[_INSTRUMENTOR]
+    for col, val in zip(instrumenting_mapper.primary_key, state.key[1]):
+        instrumenting_mapper._set_state_attr_by_column(state, col, val)
+    
+    
+def _sort_states(states):
+    return sorted(states, key=operator.attrgetter('sort_key'))
+
+def _load_scalar_attributes(state, attribute_names):
+    """initiate a column-based attribute refresh operation."""
+    
+    mapper = _state_mapper(state)
+    session = _state_session(state)
+    if not session:
+        raise sa_exc.UnboundExecutionError("Instance %s is not bound to a Session; "
+                    "attribute refresh operation cannot proceed" % (state_str(state)))
+
+    has_key = _state_has_identity(state)
+
+    result = False
+    if mapper.inherits and not mapper.concrete:
+        statement = mapper._optimized_get_statement(state, attribute_names)
+        if statement:
+            result = session.query(mapper).from_statement(statement)._get(None, only_load_props=attribute_names, refresh_state=state)
+
+    if result is False:
+        if has_key:
+            identity_key = state.key
+        else:
+            identity_key = mapper._identity_key_from_state(state)
+        result = session.query(mapper)._get(identity_key, refresh_state=state, only_load_props=attribute_names)
+
+    # if instance is pending, a refresh operation may not complete (even if PK attributes are assigned)
+    if has_key and result is None:
+        raise exc.ObjectDeletedError("Instance '%s' has been deleted." % state_str(state))
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/orm/dynamic.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/orm/dynamic.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/orm/dynamic.py (revision 3)
@@ -0,0 +1,273 @@
+# dynamic.py
+# Copyright (C) the SQLAlchemy authors and contributors
+#
+# This module is part of SQLAlchemy and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+"""Dynamic collection API.
+
+Dynamic collections act like Query() objects for read operations and support
+basic add/delete mutation.
+
+"""
+
+from sqlalchemy import log, util
+import sqlalchemy.exceptions as sa_exc
+
+from sqlalchemy.orm import (
+    attributes, object_session, util as mapperutil, strategies,
+    )
+from sqlalchemy.orm.query import Query
+from sqlalchemy.orm.util import _state_has_identity, has_identity
+from sqlalchemy.orm import attributes, collections
+
+class DynaLoader(strategies.AbstractRelationLoader):
+    def init_class_attribute(self, mapper):
+        self.is_class_level = True
+
+        strategies._register_attribute(self,
+            mapper,
+            useobject=True,
+            impl_class=DynamicAttributeImpl,
+            target_mapper=self.parent_property.mapper,
+            order_by=self.parent_property.order_by,
+            query_class=self.parent_property.query_class
+        )
+
+    def create_row_processor(self, selectcontext, path, mapper, row, adapter):
+        return (None, None)
+
+log.class_logger(DynaLoader)
+
+class DynamicAttributeImpl(attributes.AttributeImpl):
+    uses_objects = True
+    accepts_scalar_loader = False
+
+    def __init__(self, class_, key, typecallable,
+                     target_mapper, order_by, query_class=None, **kwargs):
+        super(DynamicAttributeImpl, self).__init__(class_, key, typecallable, **kwargs)
+        self.target_mapper = target_mapper
+        self.order_by = order_by
+        if not query_class:
+            self.query_class = AppenderQuery
+        elif AppenderMixin in query_class.mro():
+            self.query_class = query_class
+        else:
+            self.query_class = mixin_user_query(query_class)
+
+    def get(self, state, dict_, passive=False):
+        if passive:
+            return self._get_collection_history(state, passive=True).added_items
+        else:
+            return self.query_class(self, state)
+
+    def get_collection(self, state, dict_, user_data=None, passive=True):
+        if passive:
+            return self._get_collection_history(state, passive=passive).added_items
+        else:
+            history = self._get_collection_history(state, passive=passive)
+            return history.added_items + history.unchanged_items
+
+    def fire_append_event(self, state, dict_, value, initiator):
+        collection_history = self._modified_event(state, dict_)
+        collection_history.added_items.append(value)
+
+        for ext in self.extensions:
+            ext.append(state, value, initiator or self)
+
+        if self.trackparent and value is not None:
+            self.sethasparent(attributes.instance_state(value), True)
+
+    def fire_remove_event(self, state, dict_, value, initiator):
+        collection_history = self._modified_event(state, dict_)
+        collection_history.deleted_items.append(value)
+
+        if self.trackparent and value is not None:
+            self.sethasparent(attributes.instance_state(value), False)
+
+        for ext in self.extensions:
+            ext.remove(state, value, initiator or self)
+
+    def _modified_event(self, state, dict_):
+
+        if self.key not in state.committed_state:
+            state.committed_state[self.key] = CollectionHistory(self, state)
+
+        state.modified_event(dict_, self, False, attributes.NEVER_SET, passive=attributes.PASSIVE_NO_INITIALIZE)
+
+        # this is a hack to allow the _base.ComparableEntity fixture
+        # to work
+        dict_[self.key] = True
+        return state.committed_state[self.key]
+
+    def set(self, state, dict_, value, initiator, passive=attributes.PASSIVE_OFF):
+        if initiator is self:
+            return
+
+        self._set_iterable(state, dict_, value)
+
+    def _set_iterable(self, state, dict_, iterable, adapter=None):
+
+        collection_history = self._modified_event(state, dict_)
+        new_values = list(iterable)
+
+        if _state_has_identity(state):
+            old_collection = list(self.get(state, dict_))
+        else:
+            old_collection = []
+
+        collections.bulk_replace(new_values, DynCollectionAdapter(self, state, old_collection), DynCollectionAdapter(self, state, new_values))
+
+    def delete(self, *args, **kwargs):
+        raise NotImplementedError()
+
+    def get_history(self, state, dict_, passive=False):
+        c = self._get_collection_history(state, passive)
+        return attributes.History(c.added_items, c.unchanged_items, c.deleted_items)
+
+    def _get_collection_history(self, state, passive=False):
+        if self.key in state.committed_state:
+            c = state.committed_state[self.key]
+        else:
+            c = CollectionHistory(self, state)
+
+        if not passive:
+            return CollectionHistory(self, state, apply_to=c)
+        else:
+            return c
+
+    def append(self, state, dict_, value, initiator, passive=False):
+        if initiator is not self:
+            self.fire_append_event(state, dict_, value, initiator)
+
+    def remove(self, state, dict_, value, initiator, passive=False):
+        if initiator is not self:
+            self.fire_remove_event(state, dict_, value, initiator)
+
+class DynCollectionAdapter(object):
+    """the dynamic analogue to orm.collections.CollectionAdapter"""
+
+    def __init__(self, attr, owner_state, data):
+        self.attr = attr
+        self.state = owner_state
+        self.data = data
+
+    def __iter__(self):
+        return iter(self.data)
+
+    def append_with_event(self, item, initiator=None):
+        self.attr.append(self.state, self.state.dict, item, initiator)
+
+    def remove_with_event(self, item, initiator=None):
+        self.attr.remove(self.state, self.state.dict, item, initiator)
+
+    def append_without_event(self, item):
+        pass
+
+    def remove_without_event(self, item):
+        pass
+
+class AppenderMixin(object):
+    query_class = None
+
+    def __init__(self, attr, state):
+        Query.__init__(self, attr.target_mapper, None)
+        self.instance = state.obj()
+        self.attr = attr
+
+    def __session(self):
+        sess = object_session(self.instance)
+        if sess is not None and self.autoflush and sess.autoflush and self.instance in sess:
+            sess.flush()
+        if not has_identity(self.instance):
+            return None
+        else:
+            return sess
+
+    def session(self):
+        return self.__session()
+    session = property(session, lambda s, x:None)
+
+    def __iter__(self):
+        sess = self.__session()
+        if sess is None:
+            return iter(self.attr._get_collection_history(
+                attributes.instance_state(self.instance),
+                passive=True).added_items)
+        else:
+            return iter(self._clone(sess))
+
+    def __getitem__(self, index):
+        sess = self.__session()
+        if sess is None:
+            return self.attr._get_collection_history(
+                attributes.instance_state(self.instance),
+                passive=True).added_items.__getitem__(index)
+        else:
+            return self._clone(sess).__getitem__(index)
+
+    def count(self):
+        sess = self.__session()
+        if sess is None:
+            return len(self.attr._get_collection_history(
+                attributes.instance_state(self.instance),
+                passive=True).added_items)
+        else:
+            return self._clone(sess).count()
+
+    def _clone(self, sess=None):
+        # note we're returning an entirely new Query class instance
+        # here without any assignment capabilities; the class of this
+        # query is determined by the session.
+        instance = self.instance
+        if sess is None:
+            sess = object_session(instance)
+            if sess is None:
+                raise sa_exc.UnboundExecutionError(
+                    "Parent instance %s is not bound to a Session, and no "
+                    "contextual session is established; lazy load operation "
+                    "of attribute '%s' cannot proceed" % (
+                        mapperutil.instance_str(instance), self.attr.key))
+
+        if self.query_class:
+            query = self.query_class(self.attr.target_mapper, session=sess)
+        else:
+            query = sess.query(self.attr.target_mapper)
+        query = query.with_parent(instance, self.attr.key)
+
+        if self.attr.order_by:
+            query = query.order_by(self.attr.order_by)
+        return query
+
+    def append(self, item):
+        self.attr.append(attributes.instance_state(self.instance), attributes.instance_dict(self.instance), item, None)
+
+    def remove(self, item):
+        self.attr.remove(attributes.instance_state(self.instance), attributes.instance_dict(self.instance), item, None)
+
+
+class AppenderQuery(AppenderMixin, Query):
+    """A dynamic query that supports basic collection storage operations."""
+
+
+def mixin_user_query(cls):
+    """Return a new class with AppenderQuery functionality layered over."""
+    name = 'Appender' + cls.__name__
+    return type(name, (AppenderMixin, cls), {'query_class': cls})
+
+class CollectionHistory(object):
+    """Overrides AttributeHistory to receive append/remove events directly."""
+
+    def __init__(self, attr, state, apply_to=None):
+        if apply_to:
+            deleted = util.IdentitySet(apply_to.deleted_items)
+            added = apply_to.added_items
+            coll = AppenderQuery(attr, state).autoflush(False)
+            self.unchanged_items = [o for o in util.IdentitySet(coll) if o not in deleted]
+            self.added_items = apply_to.added_items
+            self.deleted_items = apply_to.deleted_items
+        else:
+            self.deleted_items = []
+            self.added_items = []
+            self.unchanged_items = []
+
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/orm/attributes.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/orm/attributes.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/orm/attributes.py (revision 3)
@@ -0,0 +1,1660 @@
+# attributes.py - manages object attributes
+# Copyright (C) 2005, 2006, 2007, 2008, 2009 Michael Bayer mike_mp@zzzcomputing.com
+#
+# This module is part of SQLAlchemy and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+"""Defines SQLAlchemy's system of class instrumentation..
+
+This module is usually not directly visible to user applications, but
+defines a large part of the ORM's interactivity.
+
+SQLA's instrumentation system is completely customizable, in which
+case an understanding of the general mechanics of this module is helpful.
+An example of full customization is in /examples/custom_attributes.
+
+"""
+
+import operator
+from operator import attrgetter, itemgetter
+import types
+import weakref
+
+from sqlalchemy import util
+from sqlalchemy.orm import interfaces, collections, exc
+import sqlalchemy.exceptions as sa_exc
+
+# lazy imports
+_entity_info = None
+identity_equal = None
+state = None
+
+PASSIVE_NORESULT = util.symbol('PASSIVE_NORESULT')
+ATTR_WAS_SET = util.symbol('ATTR_WAS_SET')
+NO_VALUE = util.symbol('NO_VALUE')
+NEVER_SET = util.symbol('NEVER_SET')
+
+# "passive" get settings
+# TODO: the True/False values need to be factored out
+# of the rest of ORM code
+# don't fire off any callables, and don't initialize the attribute to
+# an empty value
+PASSIVE_NO_INITIALIZE = True #util.symbol('PASSIVE_NO_INITIALIZE')
+
+# don't fire off any callables, but if no callables present
+# then initialize to an empty value/collection
+# this is used by backrefs.
+PASSIVE_NO_CALLABLES = util.symbol('PASSIVE_NO_CALLABLES')
+
+# fire callables/initialize as needed
+PASSIVE_OFF = False #util.symbol('PASSIVE_OFF')
+
+INSTRUMENTATION_MANAGER = '__sa_instrumentation_manager__'
+"""Attribute, elects custom instrumentation when present on a mapped class.
+
+Allows a class to specify a slightly or wildly different technique for
+tracking changes made to mapped attributes and collections.
+
+Only one instrumentation implementation is allowed in a given object
+inheritance hierarchy.
+
+The value of this attribute must be a callable and will be passed a class
+object.  The callable must return one of:
+
+  - An instance of an interfaces.InstrumentationManager or subclass
+  - An object implementing all or some of InstrumentationManager (TODO)
+  - A dictionary of callables, implementing all or some of the above (TODO)
+  - An instance of a ClassManager or subclass
+
+interfaces.InstrumentationManager is public API and will remain stable
+between releases.  ClassManager is not public and no guarantees are made
+about stability.  Caveat emptor.
+
+This attribute is consulted by the default SQLAlchemy instrumentation
+resolution code.  If custom finders are installed in the global
+instrumentation_finders list, they may or may not choose to honor this
+attribute.
+
+"""
+
+instrumentation_finders = []
+"""An extensible sequence of instrumentation implementation finding callables.
+
+Finders callables will be passed a class object.  If None is returned, the
+next finder in the sequence is consulted.  Otherwise the return must be an
+instrumentation factory that follows the same guidelines as
+INSTRUMENTATION_MANAGER.
+
+By default, the only finder is find_native_user_instrumentation_hook, which
+searches for INSTRUMENTATION_MANAGER.  If all finders return None, standard
+ClassManager instrumentation is used.
+
+"""
+
+class QueryableAttribute(interfaces.PropComparator):
+
+    def __init__(self, key, impl=None, comparator=None, parententity=None):
+        """Construct an InstrumentedAttribute.
+
+          comparator
+            a sql.Comparator to which class-level compare/math events will be sent
+        """
+        self.key = key
+        self.impl = impl
+        self.comparator = comparator
+        self.parententity = parententity
+
+    def get_history(self, instance, **kwargs):
+        return self.impl.get_history(instance_state(instance), instance_dict(instance), **kwargs)
+
+    def __selectable__(self):
+        # TODO: conditionally attach this method based on clause_element ?
+        return self
+
+    def __clause_element__(self):
+        return self.comparator.__clause_element__()
+
+    def label(self, name):
+        return self.__clause_element__().label(name)
+
+    def operate(self, op, *other, **kwargs):
+        return op(self.comparator, *other, **kwargs)
+
+    def reverse_operate(self, op, other, **kwargs):
+        return op(other, self.comparator, **kwargs)
+
+    def hasparent(self, state, optimistic=False):
+        return self.impl.hasparent(state, optimistic=optimistic)
+    
+    def __getattr__(self, key):
+        try:
+            return getattr(self.comparator, key)
+        except AttributeError:
+            raise AttributeError('Neither %r object nor %r object has an attribute %r' % (
+                    type(self).__name__, 
+                    type(self.comparator).__name__, 
+                    key)
+            )
+        
+    def __str__(self):
+        return repr(self.parententity) + "." + self.property.key
+
+    @property
+    def property(self):
+        return self.comparator.property
+
+
+class InstrumentedAttribute(QueryableAttribute):
+    """Public-facing descriptor, placed in the mapped class dictionary."""
+
+    def __set__(self, instance, value):
+        self.impl.set(instance_state(instance), instance_dict(instance), value, None)
+
+    def __delete__(self, instance):
+        self.impl.delete(instance_state(instance), instance_dict(instance))
+
+    def __get__(self, instance, owner):
+        if instance is None:
+            return self
+        return self.impl.get(instance_state(instance), instance_dict(instance))
+
+class _ProxyImpl(object):
+    accepts_scalar_loader = False
+    dont_expire_missing = False
+    
+    def __init__(self, key):
+        self.key = key
+
+def proxied_attribute_factory(descriptor):
+    """Create an InstrumentedAttribute / user descriptor hybrid.
+
+    Returns a new InstrumentedAttribute type that delegates descriptor
+    behavior and getattr() to the given descriptor.
+    """
+
+    class Proxy(InstrumentedAttribute):
+        """A combination of InsturmentedAttribute and a regular descriptor."""
+
+        def __init__(self, key, descriptor, comparator, parententity):
+            self.key = key
+            # maintain ProxiedAttribute.user_prop compatability.
+            self.descriptor = self.user_prop = descriptor
+            self._comparator = comparator
+            self._parententity = parententity
+            self.impl = _ProxyImpl(key)
+
+        @util.memoized_property
+        def comparator(self):
+            if util.callable(self._comparator):
+                self._comparator = self._comparator()
+            return self._comparator
+
+        def __get__(self, instance, owner):
+            """Delegate __get__ to the original descriptor."""
+            if instance is None:
+                descriptor.__get__(instance, owner)
+                return self
+            return descriptor.__get__(instance, owner)
+
+        def __set__(self, instance, value):
+            """Delegate __set__ to the original descriptor."""
+            return descriptor.__set__(instance, value)
+
+        def __delete__(self, instance):
+            """Delegate __delete__ to the original descriptor."""
+            return descriptor.__delete__(instance)
+
+        def __getattr__(self, attribute):
+            """Delegate __getattr__ to the original descriptor and/or comparator."""
+            
+            try:
+                return getattr(descriptor, attribute)
+            except AttributeError:
+                try:
+                    return getattr(self._comparator, attribute)
+                except AttributeError:
+                    raise AttributeError('Neither %r object nor %r object has an attribute %r' % (
+                            type(descriptor).__name__, 
+                            type(self._comparator).__name__, 
+                            attribute)
+                    )
+
+    Proxy.__name__ = type(descriptor).__name__ + 'Proxy'
+
+    util.monkeypatch_proxied_specials(Proxy, type(descriptor),
+                                      name='descriptor',
+                                      from_instance=descriptor)
+    return Proxy
+
+class AttributeImpl(object):
+    """internal implementation for instrumented attributes."""
+
+    def __init__(self, class_, key,
+                    callable_, trackparent=False, extension=None,
+                    compare_function=None, active_history=False, parent_token=None, 
+                    dont_expire_missing=False,
+                    **kwargs):
+        """Construct an AttributeImpl.
+
+        \class_
+          associated class
+          
+        key
+          string name of the attribute
+
+        \callable_
+          optional function which generates a callable based on a parent
+          instance, which produces the "default" values for a scalar or
+          collection attribute when it's first accessed, if not present
+          already.
+
+        trackparent
+          if True, attempt to track if an instance has a parent attached
+          to it via this attribute.
+
+        extension
+          a single or list of AttributeExtension object(s) which will
+          receive set/delete/append/remove/etc. events.
+
+        compare_function
+          a function that compares two values which are normally
+          assignable to this attribute.
+
+        active_history
+          indicates that get_history() should always return the "old" value,
+          even if it means executing a lazy callable upon attribute change.
+
+        parent_token
+          Usually references the MapperProperty, used as a key for
+          the hasparent() function to identify an "owning" attribute.
+          Allows multiple AttributeImpls to all match a single 
+          owner attribute.
+          
+        dont_expire_missing
+          if True, don't add an "expiry" callable to this attribute
+          during state.expire_attributes(None), if no value is present 
+          for this key.
+          
+        """
+        self.class_ = class_
+        self.key = key
+        self.callable_ = callable_
+        self.trackparent = trackparent
+        self.parent_token = parent_token or self
+        if compare_function is None:
+            self.is_equal = operator.eq
+        else:
+            self.is_equal = compare_function
+        self.extensions = util.to_list(extension or [])
+        for e in self.extensions:
+            if e.active_history:
+                active_history = True
+                break
+        self.active_history = active_history
+        self.dont_expire_missing = dont_expire_missing
+        
+    def hasparent(self, state, optimistic=False):
+        """Return the boolean value of a `hasparent` flag attached to the given item.
+
+        The `optimistic` flag determines what the default return value
+        should be if no `hasparent` flag can be located.
+
+        As this function is used to determine if an instance is an
+        *orphan*, instances that were loaded from storage should be
+        assumed to not be orphans, until a True/False value for this
+        flag is set.
+
+        An instance attribute that is loaded by a callable function
+        will also not have a `hasparent` flag.
+
+        """
+        return state.parents.get(id(self.parent_token), optimistic)
+
+    def sethasparent(self, state, value):
+        """Set a boolean flag on the given item corresponding to
+        whether or not it is attached to a parent object via the
+        attribute represented by this ``InstrumentedAttribute``.
+
+        """
+        state.parents[id(self.parent_token)] = value
+
+    def set_callable(self, state, callable_):
+        """Set a callable function for this attribute on the given object.
+
+        This callable will be executed when the attribute is next
+        accessed, and is assumed to construct part of the instances
+        previously stored state. When its value or values are loaded,
+        they will be established as part of the instance's *committed
+        state*.  While *trackparent* information will be assembled for
+        these instances, attribute-level event handlers will not be
+        fired.
+
+        The callable overrides the class level callable set in the
+        ``InstrumentedAttribute`` constructor.
+
+        """
+        if callable_ is None:
+            self.initialize(state)
+        else:
+            state.callables[self.key] = callable_
+
+    def get_history(self, state, dict_, passive=PASSIVE_OFF):
+        raise NotImplementedError()
+
+    def _get_callable(self, state):
+        if self.key in state.callables:
+            return state.callables[self.key]
+        elif self.callable_ is not None:
+            return self.callable_(state)
+        else:
+            return None
+
+    def initialize(self, state, dict_):
+        """Initialize this attribute on the given object instance with an empty value."""
+
+        dict_[self.key] = None
+        return None
+
+    def get(self, state, dict_, passive=PASSIVE_OFF):
+        """Retrieve a value from the given object.
+
+        If a callable is assembled on this object's attribute, and
+        passive is False, the callable will be executed and the
+        resulting value will be set as the new value for this attribute.
+        """
+
+        try:
+            return dict_[self.key]
+        except KeyError:
+            # if no history, check for lazy callables, etc.
+            if state.committed_state.get(self.key, NEVER_SET) is NEVER_SET:
+                if passive is PASSIVE_NO_INITIALIZE:
+                    return PASSIVE_NORESULT
+                    
+                callable_ = self._get_callable(state)
+                if callable_ is not None:
+                    if passive is not PASSIVE_OFF:
+                        return PASSIVE_NORESULT
+                    value = callable_()
+                    if value is not ATTR_WAS_SET:
+                        return self.set_committed_value(state, dict_, value)
+                    else:
+                        if self.key not in dict_:
+                            return self.get(state, dict_, passive=passive)
+                        return dict_[self.key]
+
+            # Return a new, empty value
+            return self.initialize(state, dict_)
+
+    def append(self, state, dict_, value, initiator, passive=PASSIVE_OFF):
+        self.set(state, dict_, value, initiator, passive=passive)
+
+    def remove(self, state, dict_, value, initiator, passive=PASSIVE_OFF):
+        self.set(state, dict_, None, initiator, passive=passive)
+
+    def set(self, state, dict_, value, initiator, passive=PASSIVE_OFF):
+        raise NotImplementedError()
+
+    def get_committed_value(self, state, dict_, passive=PASSIVE_OFF):
+        """return the unchanged value of this attribute"""
+
+        if self.key in state.committed_state:
+            if state.committed_state[self.key] is NO_VALUE:
+                return None
+            else:
+                return state.committed_state.get(self.key)
+        else:
+            return self.get(state, dict_, passive=passive)
+
+    def set_committed_value(self, state, dict_, value):
+        """set an attribute value on the given instance and 'commit' it."""
+
+        state.commit(dict_, [self.key])
+
+        state.callables.pop(self.key, None)
+        state.dict[self.key] = value
+
+        return value
+
+class ScalarAttributeImpl(AttributeImpl):
+    """represents a scalar value-holding InstrumentedAttribute."""
+
+    accepts_scalar_loader = True
+    uses_objects = False
+
+    def delete(self, state, dict_):
+
+        # TODO: catch key errors, convert to attributeerror?
+        if self.active_history:
+            old = self.get(state, dict_)
+        else:
+            old = dict_.get(self.key, NO_VALUE)
+
+        state.modified_event(dict_, self, False, old)
+
+        if self.extensions:
+            self.fire_remove_event(state, dict_, old, None)
+        del dict_[self.key]
+
+    def get_history(self, state, dict_, passive=PASSIVE_OFF):
+        return History.from_attribute(
+            self, state, dict_.get(self.key, NO_VALUE))
+
+    def set(self, state, dict_, value, initiator, passive=PASSIVE_OFF):
+        if initiator is self:
+            return
+
+        if self.active_history:
+            old = self.get(state, dict_)
+        else:
+            old = dict_.get(self.key, NO_VALUE)
+
+        state.modified_event(dict_, self, False, old)
+
+        if self.extensions:
+            value = self.fire_replace_event(state, dict_, value, old, initiator)
+        dict_[self.key] = value
+
+    def fire_replace_event(self, state, dict_, value, previous, initiator):
+        for ext in self.extensions:
+            value = ext.set(state, value, previous, initiator or self)
+        return value
+
+    def fire_remove_event(self, state, dict_, value, initiator):
+        for ext in self.extensions:
+            ext.remove(state, value, initiator or self)
+
+    @property
+    def type(self):
+        self.property.columns[0].type
+
+
+class MutableScalarAttributeImpl(ScalarAttributeImpl):
+    """represents a scalar value-holding InstrumentedAttribute, which can detect
+    changes within the value itself.
+    """
+
+    uses_objects = False
+
+    def __init__(self, class_, key, callable_,
+                    class_manager, copy_function=None,
+                    compare_function=None, **kwargs):
+        super(ScalarAttributeImpl, self).__init__(class_, key, callable_,
+                                compare_function=compare_function, **kwargs)
+        class_manager.mutable_attributes.add(key)
+        if copy_function is None:
+            raise sa_exc.ArgumentError("MutableScalarAttributeImpl requires a copy function")
+        self.copy = copy_function
+
+    def get_history(self, state, dict_, passive=PASSIVE_OFF):
+        if not dict_:
+            v = state.committed_state.get(self.key, NO_VALUE)
+        else:
+            v = dict_.get(self.key, NO_VALUE)
+            
+        return History.from_attribute(
+            self, state, v)
+
+    def commit_to_state(self, state, dict_, dest):
+        dest[self.key] = self.copy(dict_[self.key])
+
+    def check_mutable_modified(self, state, dict_):
+        (added, unchanged, deleted) = self.get_history(state, dict_, passive=PASSIVE_NO_INITIALIZE)
+        return bool(added or deleted)
+
+    def get(self, state, dict_, passive=PASSIVE_OFF):
+        if self.key not in state.mutable_dict:
+            ret = ScalarAttributeImpl.get(self, state, dict_, passive=passive)
+            if ret is not PASSIVE_NORESULT:
+                state.mutable_dict[self.key] = ret
+            return ret
+        else:
+            return state.mutable_dict[self.key]
+
+    def delete(self, state, dict_):
+        ScalarAttributeImpl.delete(self, state, dict_)
+        state.mutable_dict.pop(self.key)
+
+    def set(self, state, dict_, value, initiator, passive=PASSIVE_OFF):
+        if initiator is self:
+            return
+
+        state.modified_event(dict_, self, True, NEVER_SET)
+        
+        if self.extensions:
+            old = self.get(state, dict_)
+            value = self.fire_replace_event(state, dict_, value, old, initiator)
+            dict_[self.key] = value
+        else:
+            dict_[self.key] = value
+        state.mutable_dict[self.key] = value
+
+
+class ScalarObjectAttributeImpl(ScalarAttributeImpl):
+    """represents a scalar-holding InstrumentedAttribute, where the target object is also instrumented.
+
+    Adds events to delete/set operations.
+    """
+
+    accepts_scalar_loader = False
+    uses_objects = True
+
+    def __init__(self, class_, key, callable_, 
+                    trackparent=False, extension=None, copy_function=None,
+                    compare_function=None, **kwargs):
+        super(ScalarObjectAttributeImpl, self).__init__(class_, key,
+          callable_, trackparent=trackparent, extension=extension,
+          compare_function=compare_function, **kwargs)
+        if compare_function is None:
+            self.is_equal = identity_equal
+
+    def delete(self, state, dict_):
+        old = self.get(state, dict_)
+        self.fire_remove_event(state, dict_, old, self)
+        del dict_[self.key]
+
+    def get_history(self, state, dict_, passive=PASSIVE_OFF):
+        if self.key in dict_:
+            return History.from_attribute(self, state, dict_[self.key])
+        else:
+            current = self.get(state, dict_, passive=passive)
+            if current is PASSIVE_NORESULT:
+                return HISTORY_BLANK
+            else:
+                return History.from_attribute(self, state, current)
+
+    def set(self, state, dict_, value, initiator, passive=PASSIVE_OFF):
+        """Set a value on the given InstanceState.
+
+        `initiator` is the ``InstrumentedAttribute`` that initiated the
+        ``set()`` operation and is used to control the depth of a circular
+        setter operation.
+
+        """
+        if initiator is self:
+            return
+        
+        if self.active_history:
+            old = self.get(state, dict_)
+        else:
+            # this would be the "laziest" approach,
+            # however it breaks currently expected backref
+            # behavior
+            #old = dict_.get(self.key, None)
+            # instead, use the "passive" setting, which
+            # is only going to be PASSIVE_NOCALLABLES if it
+            # came from a backref
+            old = self.get(state, dict_, passive=passive)
+            if old is PASSIVE_NORESULT:
+                old = None
+             
+        value = self.fire_replace_event(state, dict_, value, old, initiator)
+        dict_[self.key] = value
+
+    def fire_remove_event(self, state, dict_, value, initiator):
+        state.modified_event(dict_, self, False, value)
+
+        if self.trackparent and value is not None:
+            self.sethasparent(instance_state(value), False)
+
+        for ext in self.extensions:
+            ext.remove(state, value, initiator or self)
+
+    def fire_replace_event(self, state, dict_, value, previous, initiator):
+        state.modified_event(dict_, self, False, previous)
+
+        if self.trackparent:
+            if previous is not value and previous is not None:
+                self.sethasparent(instance_state(previous), False)
+
+        for ext in self.extensions:
+            value = ext.set(state, value, previous, initiator or self)
+
+        if self.trackparent:
+            if value is not None:
+                self.sethasparent(instance_state(value), True)
+
+        return value
+
+
+class CollectionAttributeImpl(AttributeImpl):
+    """A collection-holding attribute that instruments changes in membership.
+
+    Only handles collections of instrumented objects.
+
+    InstrumentedCollectionAttribute holds an arbitrary, user-specified
+    container object (defaulting to a list) and brokers access to the
+    CollectionAdapter, a "view" onto that object that presents consistent
+    bag semantics to the orm layer independent of the user data implementation.
+
+    """
+    accepts_scalar_loader = False
+    uses_objects = True
+
+    def __init__(self, class_, key, callable_, 
+                    typecallable=None, trackparent=False, extension=None,
+                    copy_function=None, compare_function=None, **kwargs):
+        super(CollectionAttributeImpl, self).__init__(class_, key, callable_, trackparent=trackparent,
+          extension=extension, compare_function=compare_function, **kwargs)
+
+        if copy_function is None:
+            copy_function = self.__copy
+        self.copy = copy_function
+
+        self.collection_factory = typecallable
+        # may be removed in 0.5:
+        self.collection_interface = \
+          util.duck_type_collection(self.collection_factory())
+
+    def __copy(self, item):
+        return [y for y in list(collections.collection_adapter(item))]
+
+    def get_history(self, state, dict_, passive=PASSIVE_OFF):
+        current = self.get(state, dict_, passive=passive)
+        if current is PASSIVE_NORESULT:
+            return HISTORY_BLANK
+        else:
+            return History.from_attribute(self, state, current)
+
+    def fire_append_event(self, state, dict_, value, initiator):
+        state.modified_event(dict_, self, True, NEVER_SET, passive=PASSIVE_NO_INITIALIZE)
+
+        for ext in self.extensions:
+            value = ext.append(state, value, initiator or self)
+
+        if self.trackparent and value is not None:
+            self.sethasparent(instance_state(value), True)
+
+        return value
+
+    def fire_pre_remove_event(self, state, dict_, initiator):
+        state.modified_event(dict_, self, True, NEVER_SET, passive=PASSIVE_NO_INITIALIZE)
+
+    def fire_remove_event(self, state, dict_, value, initiator):
+        state.modified_event(dict_, self, True, NEVER_SET, passive=PASSIVE_NO_INITIALIZE)
+
+        if self.trackparent and value is not None:
+            self.sethasparent(instance_state(value), False)
+
+        for ext in self.extensions:
+            ext.remove(state, value, initiator or self)
+
+    def delete(self, state, dict_):
+        if self.key not in dict_:
+            return
+
+        state.modified_event(dict_, self, True, NEVER_SET)
+
+        collection = self.get_collection(state, state.dict)
+        collection.clear_with_event()
+        # TODO: catch key errors, convert to attributeerror?
+        del dict_[self.key]
+
+    def initialize(self, state, dict_):
+        """Initialize this attribute with an empty collection."""
+
+        _, user_data = self._initialize_collection(state)
+        dict_[self.key] = user_data
+        return user_data
+
+    def _initialize_collection(self, state):
+        return state.manager.initialize_collection(
+            self.key, state, self.collection_factory)
+
+    def append(self, state, dict_, value, initiator, passive=PASSIVE_OFF):
+        if initiator is self:
+            return
+
+        collection = self.get_collection(state, dict_, passive=passive)
+        if collection is PASSIVE_NORESULT:
+            value = self.fire_append_event(state, dict_, value, initiator)
+            assert self.key not in dict_, "Collection was loaded during event handling."
+            state.get_pending(self.key).append(value)
+        else:
+            collection.append_with_event(value, initiator)
+
+    def remove(self, state, dict_, value, initiator, passive=PASSIVE_OFF):
+        if initiator is self:
+            return
+
+        collection = self.get_collection(state, state.dict, passive=passive)
+        if collection is PASSIVE_NORESULT:
+            self.fire_remove_event(state, dict_, value, initiator)
+            assert self.key not in dict_, "Collection was loaded during event handling."
+            state.get_pending(self.key).remove(value)
+        else:
+            collection.remove_with_event(value, initiator)
+
+    def set(self, state, dict_, value, initiator, passive=PASSIVE_OFF):
+        """Set a value on the given object.
+
+        `initiator` is the ``InstrumentedAttribute`` that initiated the
+        ``set()`` operation and is used to control the depth of a circular
+        setter operation.
+        """
+
+        if initiator is self:
+            return
+
+        self._set_iterable(
+            state, dict_, value,
+            lambda adapter, i: adapter.adapt_like_to_iterable(i))
+
+    def _set_iterable(self, state, dict_, iterable, adapter=None):
+        """Set a collection value from an iterable of state-bearers.
+
+        ``adapter`` is an optional callable invoked with a CollectionAdapter
+        and the iterable.  Should return an iterable of state-bearing
+        instances suitable for appending via a CollectionAdapter.  Can be used
+        for, e.g., adapting an incoming dictionary into an iterator of values
+        rather than keys.
+
+        """
+        # pulling a new collection first so that an adaptation exception does
+        # not trigger a lazy load of the old collection.
+        new_collection, user_data = self._initialize_collection(state)
+        if adapter:
+            new_values = list(adapter(new_collection, iterable))
+        else:
+            new_values = list(iterable)
+
+        old = self.get(state, dict_)
+
+        # ignore re-assignment of the current collection, as happens
+        # implicitly with in-place operators (foo.collection |= other)
+        if old is iterable:
+            return
+
+        state.modified_event(dict_, self, True, old)
+
+        old_collection = self.get_collection(state, dict_, old)
+
+        dict_[self.key] = user_data
+
+        collections.bulk_replace(new_values, old_collection, new_collection)
+        old_collection.unlink(old)
+
+
+    def set_committed_value(self, state, dict_, value):
+        """Set an attribute value on the given instance and 'commit' it."""
+
+        collection, user_data = self._initialize_collection(state)
+
+        if value:
+            for item in value:
+                collection.append_without_event(item)
+
+        state.callables.pop(self.key, None)
+        state.dict[self.key] = user_data
+
+        state.commit(dict_, [self.key])
+
+        if self.key in state.pending:
+            
+            # pending items exist.  issue a modified event,
+            # add/remove new items.
+            state.modified_event(dict_, self, True, user_data)
+
+            pending = state.pending.pop(self.key)
+            added = pending.added_items
+            removed = pending.deleted_items
+            for item in added:
+                collection.append_without_event(item)
+            for item in removed:
+                collection.remove_without_event(item)
+
+        return user_data
+
+    def get_collection(self, state, dict_, user_data=None, passive=PASSIVE_OFF):
+        """Retrieve the CollectionAdapter associated with the given state.
+
+        Creates a new CollectionAdapter if one does not exist.
+
+        """
+        if user_data is None:
+            user_data = self.get(state, dict_, passive=passive)
+            if user_data is PASSIVE_NORESULT:
+                return user_data
+
+        return getattr(user_data, '_sa_adapter')
+
+class GenericBackrefExtension(interfaces.AttributeExtension):
+    """An extension which synchronizes a two-way relationship.
+
+    A typical two-way relationship is a parent object containing a list of
+    child objects, where each child object references the parent.  The other
+    are two objects which contain scalar references to each other.
+
+    """
+    
+    active_history = False
+    
+    def __init__(self, key):
+        self.key = key
+
+    def set(self, state, child, oldchild, initiator):
+        if oldchild is child:
+            return child
+        if oldchild is not None:
+            # With lazy=None, there's no guarantee that the full collection is
+            # present when updating via a backref.
+            old_state, old_dict = instance_state(oldchild), instance_dict(oldchild)
+            impl = old_state.get_impl(self.key)
+            try:
+                impl.remove(old_state, old_dict, state.obj(), initiator, passive=PASSIVE_NO_CALLABLES)
+            except (ValueError, KeyError, IndexError):
+                pass
+        if child is not None:
+            new_state,  new_dict = instance_state(child), instance_dict(child)
+            new_state.get_impl(self.key).append(new_state, new_dict, state.obj(), initiator, passive=PASSIVE_NO_CALLABLES)
+        return child
+
+    def append(self, state, child, initiator):
+        child_state, child_dict = instance_state(child), instance_dict(child)
+        child_state.get_impl(self.key).append(child_state, child_dict, state.obj(), initiator, passive=PASSIVE_NO_CALLABLES)
+        return child
+
+    def remove(self, state, child, initiator):
+        if child is not None:
+            child_state, child_dict = instance_state(child), instance_dict(child)
+            child_state.get_impl(self.key).remove(child_state, child_dict, state.obj(), initiator, passive=PASSIVE_NO_CALLABLES)
+
+
+class Events(object):
+    def __init__(self):
+        self.original_init = object.__init__
+        self.on_init = ()
+        self.on_init_failure = ()
+        self.on_load = ()
+        self.on_resurrect = ()
+
+    def run(self, event, *args, **kwargs):
+        for fn in getattr(self, event):
+            fn(*args, **kwargs)
+
+    def add_listener(self, event, listener):
+        # not thread safe... problem?  mb: nope
+        bucket = getattr(self, event)
+        if bucket == ():
+            setattr(self, event, [listener])
+        else:
+            bucket.append(listener)
+
+    def remove_listener(self, event, listener):
+        bucket = getattr(self, event)
+        bucket.remove(listener)
+
+
+class ClassManager(dict):
+    """tracks state information at the class level."""
+
+    MANAGER_ATTR = '_sa_class_manager'
+    STATE_ATTR = '_sa_instance_state'
+
+    event_registry_factory = Events
+    deferred_scalar_loader = None
+    
+    def __init__(self, class_):
+        self.class_ = class_
+        self.factory = None  # where we came from, for inheritance bookkeeping
+        self.info = {}
+        self.mapper = None
+        self.new_init = None
+        self.mutable_attributes = set()
+        self.local_attrs = {}
+        self.originals = {}
+        for base in class_.__mro__[-2:0:-1]:   # reverse, skipping 1st and last
+            if not isinstance(base, type):
+                continue
+            cls_state = manager_of_class(base)
+            if cls_state:
+                self.update(cls_state)
+        self.events = self.event_registry_factory()
+        self.manage()
+        self._instrument_init()
+    
+    def _configure_create_arguments(self, 
+                            _source=None, 
+                            deferred_scalar_loader=None):
+        """Accept extra **kw arguments passed to create_manager_for_cls.
+        
+        The current contract of ClassManager and other managers is that they
+        take a single "cls" argument in their constructor (as per 
+        test/orm/instrumentation.py InstrumentationCollisionTest).  This
+        is to provide consistency with the current API of "class manager"
+        callables and such which may return various ClassManager and 
+        ClassManager-like instances.   So create_manager_for_cls sends
+        in ClassManager-specific arguments via this method once the 
+        non-proxied ClassManager is available.
+        
+        """
+        if _source:
+            deferred_scalar_loader = _source.deferred_scalar_loader
+
+        if deferred_scalar_loader:
+            self.deferred_scalar_loader = deferred_scalar_loader
+    
+    def _subclass_manager(self, cls):
+        """Create a new ClassManager for a subclass of this ClassManager's class.
+        
+        This is called automatically when attributes are instrumented so that
+        the attributes can be propagated to subclasses against their own
+        class-local manager, without the need for mappers etc. to have already
+        pre-configured managers for the full class hierarchy.   Mappers
+        can post-configure the auto-generated ClassManager when needed.
+        
+        """
+        manager = manager_of_class(cls)
+        if manager is None:
+            manager = _create_manager_for_cls(cls, _source=self)
+        return manager
+        
+    def _instrument_init(self):
+        # TODO: self.class_.__init__ is often the already-instrumented
+        # __init__ from an instrumented superclass.  We still need to make 
+        # our own wrapper, but it would
+        # be nice to wrap the original __init__ and not our existing wrapper
+        # of such, since this adds method overhead.
+        self.events.original_init = self.class_.__init__
+        self.new_init = _generate_init(self.class_, self)
+        self.install_member('__init__', self.new_init)
+        
+    def _uninstrument_init(self):
+        if self.new_init:
+            self.uninstall_member('__init__')
+            self.new_init = None
+    
+    def _create_instance_state(self, instance):
+        global state
+        if state is None:
+            from sqlalchemy.orm import state
+        if self.mutable_attributes:
+            return state.MutableAttrInstanceState(instance, self)
+        else:
+            return state.InstanceState(instance, self)
+        
+    def manage(self):
+        """Mark this instance as the manager for its class."""
+        
+        setattr(self.class_, self.MANAGER_ATTR, self)
+
+    def dispose(self):
+        """Dissasociate this manager from its class."""
+        
+        delattr(self.class_, self.MANAGER_ATTR)
+
+    def manager_getter(self):
+        return attrgetter(self.MANAGER_ATTR)
+
+    def instrument_attribute(self, key, inst, propagated=False):
+        if propagated:
+            if key in self.local_attrs:
+                return  # don't override local attr with inherited attr
+        else:
+            self.local_attrs[key] = inst
+            self.install_descriptor(key, inst)
+        self[key] = inst
+        for cls in self.class_.__subclasses__():
+            if isinstance(cls, types.ClassType):
+                continue
+            manager = self._subclass_manager(cls)
+            manager.instrument_attribute(key, inst, True)
+
+    def post_configure_attribute(self, key):
+        pass
+        
+    def uninstrument_attribute(self, key, propagated=False):
+        if key not in self:
+            return
+        if propagated:
+            if key in self.local_attrs:
+                return  # don't get rid of local attr
+        else:
+            del self.local_attrs[key]
+            self.uninstall_descriptor(key)
+        del self[key]
+        if key in self.mutable_attributes:
+            self.mutable_attributes.remove(key)
+        for cls in self.class_.__subclasses__():
+            if isinstance(cls, types.ClassType):
+                continue
+            manager = self._subclass_manager(cls)
+            manager.uninstrument_attribute(key, True)
+
+    def unregister(self):
+        """remove all instrumentation established by this ClassManager."""
+        
+        self._uninstrument_init()
+
+        self.mapper = self.events = None
+        self.info.clear()
+        
+        for key in list(self):
+            if key in self.local_attrs:
+                self.uninstrument_attribute(key)
+
+    def install_descriptor(self, key, inst):
+        if key in (self.STATE_ATTR, self.MANAGER_ATTR):
+            raise KeyError("%r: requested attribute name conflicts with "
+                           "instrumentation attribute of the same name." % key)
+        setattr(self.class_, key, inst)
+
+    def uninstall_descriptor(self, key):
+        delattr(self.class_, key)
+
+    def install_member(self, key, implementation):
+        if key in (self.STATE_ATTR, self.MANAGER_ATTR):
+            raise KeyError("%r: requested attribute name conflicts with "
+                           "instrumentation attribute of the same name." % key)
+        self.originals.setdefault(key, getattr(self.class_, key, None))
+        setattr(self.class_, key, implementation)
+
+    def uninstall_member(self, key):
+        original = self.originals.pop(key, None)
+        if original is not None:
+            setattr(self.class_, key, original)
+
+    def instrument_collection_class(self, key, collection_class):
+        return collections.prepare_instrumentation(collection_class)
+
+    def initialize_collection(self, key, state, factory):
+        user_data = factory()
+        adapter = collections.CollectionAdapter(
+            self.get_impl(key), state, user_data)
+        return adapter, user_data
+
+    def is_instrumented(self, key, search=False):
+        if search:
+            return key in self
+        else:
+            return key in self.local_attrs
+
+    def get_impl(self, key):
+        return self[key].impl
+
+    @property
+    def attributes(self):
+        return self.itervalues()
+
+    ## InstanceState management
+
+    def new_instance(self, state=None):
+        instance = self.class_.__new__(self.class_)
+        setattr(instance, self.STATE_ATTR, state or self._create_instance_state(instance))
+        return instance
+
+    def setup_instance(self, instance, state=None):
+        setattr(instance, self.STATE_ATTR, state or self._create_instance_state(instance))
+    
+    def teardown_instance(self, instance):
+        delattr(instance, self.STATE_ATTR)
+        
+    def _new_state_if_none(self, instance):
+        """Install a default InstanceState if none is present.
+
+        A private convenience method used by the __init__ decorator.
+        
+        """
+        if hasattr(instance, self.STATE_ATTR):
+            return False
+        else:
+            state = self._create_instance_state(instance)
+            setattr(instance, self.STATE_ATTR, state)
+            return state
+    
+    def state_getter(self):
+        """Return a (instance) -> InstanceState callable.
+
+        "state getter" callables should raise either KeyError or
+        AttributeError if no InstanceState could be found for the
+        instance.
+        """
+
+        return attrgetter(self.STATE_ATTR)
+    
+    def dict_getter(self):
+        return attrgetter('__dict__')
+        
+    def has_state(self, instance):
+        return hasattr(instance, self.STATE_ATTR)
+        
+    def has_parent(self, state, key, optimistic=False):
+        """TODO"""
+        return self.get_impl(key).hasparent(state, optimistic=optimistic)
+
+    def __nonzero__(self):
+        """All ClassManagers are non-zero regardless of attribute state."""
+        return True
+
+    def __repr__(self):
+        return '<%s of %r at %x>' % (
+            self.__class__.__name__, self.class_, id(self))
+
+class _ClassInstrumentationAdapter(ClassManager):
+    """Adapts a user-defined InstrumentationManager to a ClassManager."""
+
+    def __init__(self, class_, override, **kw):
+        self._adapted = override
+        self._get_state = self._adapted.state_getter(class_)
+        self._get_dict = self._adapted.dict_getter(class_)
+        
+        ClassManager.__init__(self, class_, **kw)
+
+    def manage(self):
+        self._adapted.manage(self.class_, self)
+
+    def dispose(self):
+        self._adapted.dispose(self.class_)
+
+    def manager_getter(self):
+        return self._adapted.manager_getter(self.class_)
+
+    def instrument_attribute(self, key, inst, propagated=False):
+        ClassManager.instrument_attribute(self, key, inst, propagated)
+        if not propagated:
+            self._adapted.instrument_attribute(self.class_, key, inst)
+
+    def post_configure_attribute(self, key):
+        self._adapted.post_configure_attribute(self.class_, key, self[key])
+
+    def install_descriptor(self, key, inst):
+        self._adapted.install_descriptor(self.class_, key, inst)
+
+    def uninstall_descriptor(self, key):
+        self._adapted.uninstall_descriptor(self.class_, key)
+
+    def install_member(self, key, implementation):
+        self._adapted.install_member(self.class_, key, implementation)
+
+    def uninstall_member(self, key):
+        self._adapted.uninstall_member(self.class_, key)
+
+    def instrument_collection_class(self, key, collection_class):
+        return self._adapted.instrument_collection_class(
+            self.class_, key, collection_class)
+
+    def initialize_collection(self, key, state, factory):
+        delegate = getattr(self._adapted, 'initialize_collection', None)
+        if delegate:
+            return delegate(key, state, factory)
+        else:
+            return ClassManager.initialize_collection(self, key, state, factory)
+
+    def new_instance(self, state=None):
+        instance = self.class_.__new__(self.class_)
+        self.setup_instance(instance, state)
+        return instance
+
+    def _new_state_if_none(self, instance):
+        """Install a default InstanceState if none is present.
+
+        A private convenience method used by the __init__ decorator.
+        """
+        if self.has_state(instance):
+            return False
+        else:
+            return self.setup_instance(instance)
+
+    def setup_instance(self, instance, state=None):
+        self._adapted.initialize_instance_dict(self.class_, instance)
+        
+        if state is None:
+            state = self._create_instance_state(instance)
+            
+        # the given instance is assumed to have no state
+        self._adapted.install_state(self.class_, instance, state)
+        return state
+
+    def teardown_instance(self, instance):
+        self._adapted.remove_state(self.class_, instance)
+
+    def has_state(self, instance):
+        try:
+            state = self._get_state(instance)
+            return True
+        except exc.NO_STATE:
+            return False
+
+    def state_getter(self):
+        return self._get_state
+
+    def dict_getter(self):
+        return self._get_dict
+
+class History(tuple):
+    """A 3-tuple of added, unchanged and deleted values.
+
+    Each tuple member is an iterable sequence.
+
+    """
+
+    __slots__ = ()
+
+    added = property(itemgetter(0))
+    unchanged = property(itemgetter(1))
+    deleted = property(itemgetter(2))
+
+    def __new__(cls, added, unchanged, deleted):
+        return tuple.__new__(cls, (added, unchanged, deleted))
+    
+    def __nonzero__(self):
+        return self != HISTORY_BLANK
+    
+    def sum(self):
+        return self.added + self.unchanged + self.deleted
+    
+    def non_deleted(self):
+        return self.added + self.unchanged
+    
+    def non_added(self):
+        return self.unchanged + self.deleted
+    
+    def has_changes(self):
+        return bool(self.added or self.deleted)
+        
+    def as_state(self):
+        return History(
+            [c is not None and instance_state(c) or None for c in self.added],
+            [c is not None and instance_state(c) or None for c in self.unchanged],
+            [c is not None and instance_state(c) or None for c in self.deleted],
+        )
+    
+    @classmethod
+    def from_attribute(cls, attribute, state, current):
+        original = state.committed_state.get(attribute.key, NEVER_SET)
+
+        if hasattr(attribute, 'get_collection'):
+            current = attribute.get_collection(state, state.dict, current)
+            if original is NO_VALUE:
+                return cls(list(current), (), ())
+            elif original is NEVER_SET:
+                return cls((), list(current), ())
+            else:
+                current_set = util.IdentitySet(current)
+                original_set = util.IdentitySet(original)
+
+                # ensure duplicates are maintained
+                return cls(
+                    [x for x in current if x not in original_set],
+                    [x for x in current if x in original_set],
+                    [x for x in original if x not in current_set]
+                )
+        else:
+            if current is NO_VALUE:
+                if original not in [None, NEVER_SET, NO_VALUE]:
+                    deleted = [original]
+                else:
+                    deleted = ()
+                return cls((), (), deleted)
+            elif original is NO_VALUE:
+                return cls([current], (), ())
+            elif (original is NEVER_SET or
+                  attribute.is_equal(current, original) is True):
+                # dont let ClauseElement expressions here trip things up
+                return cls((), [current], ())
+            else:
+                if original is not None:
+                    deleted = [original]
+                else:
+                    deleted = ()
+                return cls([current], (), deleted)
+
+HISTORY_BLANK = History(None, None, None)
+
+def _conditional_instance_state(obj):
+    if not isinstance(obj, state.InstanceState):
+        obj = instance_state(obj)
+    return obj
+        
+def get_history(obj, key, **kwargs):
+    """Return a History record for the given object and attribute key.
+    
+    obj is an instrumented object instance.  An InstanceState
+    is accepted directly for backwards compatibility but 
+    this usage is deprecated.
+    
+    """
+    return get_state_history(_conditional_instance_state(obj), key, **kwargs)
+
+def get_state_history(state, key, **kwargs):
+    return state.get_history(key, **kwargs)
+
+def has_parent(cls, obj, key, optimistic=False):
+    """TODO"""
+    manager = manager_of_class(cls)
+    state = instance_state(obj)
+    return manager.has_parent(state, key, optimistic)
+
+def register_class(class_, **kw):
+    """Register class instrumentation.
+    
+    Returns the existing or newly created class manager.
+    """
+
+    manager = manager_of_class(class_)
+    if manager is None:
+        manager = _create_manager_for_cls(class_, **kw)
+    return manager
+    
+def unregister_class(class_):
+    """Unregister class instrumentation."""
+    
+    instrumentation_registry.unregister(class_)
+
+def register_attribute(class_, key, **kw):
+
+    proxy_property = kw.pop('proxy_property', None)
+    
+    comparator = kw.pop('comparator', None)
+    parententity = kw.pop('parententity', None)
+    register_descriptor(class_, key, proxy_property, comparator, parententity)
+    if not proxy_property:
+        register_attribute_impl(class_, key, **kw)
+    
+def register_attribute_impl(class_, key,         
+        uselist=False, callable_=None, 
+        useobject=False, mutable_scalars=False, 
+        impl_class=None, **kw):
+    
+    manager = manager_of_class(class_)
+    if uselist:
+        factory = kw.pop('typecallable', None)
+        typecallable = manager.instrument_collection_class(
+            key, factory or list)
+    else:
+        typecallable = kw.pop('typecallable', None)
+
+    if impl_class:
+        impl = impl_class(class_, key, typecallable, **kw)
+    elif uselist:
+        impl = CollectionAttributeImpl(class_, key, callable_,
+                                       typecallable=typecallable, **kw)
+    elif useobject:
+        impl = ScalarObjectAttributeImpl(class_, key, callable_, **kw)
+    elif mutable_scalars:
+        impl = MutableScalarAttributeImpl(class_, key, callable_,
+                                          class_manager=manager, **kw)
+    else:
+        impl = ScalarAttributeImpl(class_, key, callable_, **kw)
+
+    manager[key].impl = impl
+    
+    manager.post_configure_attribute(key)
+    
+def register_descriptor(class_, key, proxy_property=None, comparator=None, parententity=None, property_=None):
+    manager = manager_of_class(class_)
+
+    if proxy_property:
+        proxy_type = proxied_attribute_factory(proxy_property)
+        descriptor = proxy_type(key, proxy_property, comparator, parententity)
+    else:
+        descriptor = InstrumentedAttribute(key, comparator=comparator, parententity=parententity)
+
+    manager.instrument_attribute(key, descriptor)
+
+def unregister_attribute(class_, key):
+    manager_of_class(class_).uninstrument_attribute(key)
+
+def init_collection(obj, key):
+    """Initialize a collection attribute and return the collection adapter.
+    
+    This function is used to provide direct access to collection internals
+    for a previously unloaded attribute.  e.g.::
+        
+        collection_adapter = init_collection(someobject, 'elements')
+        for elem in values:
+            collection_adapter.append_without_event(elem)
+    
+    For an easier way to do the above, see :func:`~sqlalchemy.orm.attributes.set_committed_value`.
+    
+    obj is an instrumented object instance.  An InstanceState
+    is accepted directly for backwards compatibility but 
+    this usage is deprecated.
+    
+    """
+    state = _conditional_instance_state(obj)
+    dict_ = state.dict
+    return init_state_collection(state, dict_, key)
+    
+def init_state_collection(state, dict_, key):
+    """Initialize a collection attribute and return the collection adapter."""
+    
+    attr = state.get_impl(key)
+    user_data = attr.initialize(state, dict_)
+    return attr.get_collection(state, dict_, user_data)
+
+def set_committed_value(instance, key, value):
+    """Set the value of an attribute with no history events.
+    
+    Cancels any previous history present.  The value should be 
+    a scalar value for scalar-holding attributes, or
+    an iterable for any collection-holding attribute.
+
+    This is the same underlying method used when a lazy loader
+    fires off and loads additional data from the database.
+    In particular, this method can be used by application code
+    which has loaded additional attributes or collections through
+    separate queries, which can then be attached to an instance
+    as though it were part of its original loaded state.
+    
+    """
+    state, dict_ = instance_state(instance), instance_dict(instance)
+    state.get_impl(key).set_committed_value(state, dict_, value)
+    
+def set_attribute(instance, key, value):
+    """Set the value of an attribute, firing history events.
+    
+    This function may be used regardless of instrumentation
+    applied directly to the class, i.e. no descriptors are required.
+    Custom attribute management schemes will need to make usage
+    of this method to establish attribute state as understood
+    by SQLAlchemy.
+    
+    """
+    state, dict_ = instance_state(instance), instance_dict(instance)
+    state.get_impl(key).set(state, dict_, value, None)
+
+def get_attribute(instance, key):
+    """Get the value of an attribute, firing any callables required.
+
+    This function may be used regardless of instrumentation
+    applied directly to the class, i.e. no descriptors are required.
+    Custom attribute management schemes will need to make usage
+    of this method to make usage of attribute state as understood
+    by SQLAlchemy.
+    
+    """
+    state, dict_ = instance_state(instance), instance_dict(instance)
+    return state.get_impl(key).get(state, dict_)
+
+def del_attribute(instance, key):
+    """Delete the value of an attribute, firing history events.
+
+    This function may be used regardless of instrumentation
+    applied directly to the class, i.e. no descriptors are required.
+    Custom attribute management schemes will need to make usage
+    of this method to establish attribute state as understood
+    by SQLAlchemy.
+    
+    """
+    state, dict_ = instance_state(instance), instance_dict(instance)
+    state.get_impl(key).delete(state, dict_)
+
+def is_instrumented(instance, key):
+    """Return True if the given attribute on the given instance is instrumented
+    by the attributes package.
+    
+    This function may be used regardless of instrumentation
+    applied directly to the class, i.e. no descriptors are required.
+    
+    """
+    return manager_of_class(instance.__class__).is_instrumented(key, search=True)
+
+class InstrumentationRegistry(object):
+    """Private instrumentation registration singleton."""
+
+    _manager_finders = weakref.WeakKeyDictionary()
+    _state_finders = util.WeakIdentityMapping()
+    _dict_finders = util.WeakIdentityMapping()
+    _extended = False
+
+    def create_manager_for_cls(self, class_, **kw):
+        assert class_ is not None
+        assert manager_of_class(class_) is None
+
+        for finder in instrumentation_finders:
+            factory = finder(class_)
+            if factory is not None:
+                break
+        else:
+            factory = ClassManager
+
+        existing_factories = self._collect_management_factories_for(class_).\
+                                difference([factory])
+        if existing_factories:
+            raise TypeError(
+                "multiple instrumentation implementations specified "
+                "in %s inheritance hierarchy: %r" % (
+                    class_.__name__, list(existing_factories)))
+
+        manager = factory(class_)
+        if not isinstance(manager, ClassManager):
+            manager = _ClassInstrumentationAdapter(class_, manager)
+            
+        if factory != ClassManager and not self._extended:
+            self._extended = True
+            _install_lookup_strategy(self)
+        
+        manager._configure_create_arguments(**kw)
+
+        manager.factory = factory
+        self._manager_finders[class_] = manager.manager_getter()
+        self._state_finders[class_] = manager.state_getter()
+        self._dict_finders[class_] = manager.dict_getter()
+        return manager
+
+    def _collect_management_factories_for(self, cls):
+        """Return a collection of factories in play or specified for a hierarchy.
+
+        Traverses the entire inheritance graph of a cls and returns a collection
+        of instrumentation factories for those classes.  Factories are extracted
+        from active ClassManagers, if available, otherwise
+        instrumentation_finders is consulted.
+
+        """
+        hierarchy = util.class_hierarchy(cls)
+        factories = set()
+        for member in hierarchy:
+            manager = manager_of_class(member)
+            if manager is not None:
+                factories.add(manager.factory)
+            else:
+                for finder in instrumentation_finders:
+                    factory = finder(member)
+                    if factory is not None:
+                        break
+                else:
+                    factory = None
+                factories.add(factory)
+        factories.discard(None)
+        return factories
+
+    def manager_of_class(self, cls):
+        if cls is None:
+            return None
+        try:
+            finder = self._manager_finders[cls]
+        except KeyError:
+            return None
+        else:
+            return finder(cls)
+
+    def state_of(self, instance):
+        # this is only called when alternate instrumentation has been established
+        if instance is None:
+            raise AttributeError("None has no persistent state.")
+        try:
+            return self._state_finders[instance.__class__](instance)
+        except KeyError:
+            raise AttributeError("%r is not instrumented" % instance.__class__)
+
+    def dict_of(self, instance):
+        # this is only called when alternate instrumentation has been established
+        if instance is None:
+            raise AttributeError("None has no persistent state.")
+        try:
+            return self._dict_finders[instance.__class__](instance)
+        except KeyError:
+            raise AttributeError("%r is not instrumented" % instance.__class__)
+        
+    def unregister(self, class_):
+        if class_ in self._manager_finders:
+            manager = self.manager_of_class(class_)
+            manager.unregister()
+            manager.dispose()
+            del self._manager_finders[class_]
+            del self._state_finders[class_]
+            del self._dict_finders[class_]
+
+instrumentation_registry = InstrumentationRegistry()
+
+def _install_lookup_strategy(implementation):
+    """Replace global class/object management functions
+    with either faster or more comprehensive implementations,
+    based on whether or not extended class instrumentation
+    has been detected.
+    
+    This function is called only by InstrumentationRegistry()
+    and unit tests specific to this behavior.
+    
+    """
+    global instance_state, instance_dict
+    if implementation is util.symbol('native'):
+        instance_state = attrgetter(ClassManager.STATE_ATTR)
+        instance_dict = attrgetter("__dict__")
+    else:
+        instance_state = instrumentation_registry.state_of
+        instance_dict = instrumentation_registry.dict_of
+        
+manager_of_class = instrumentation_registry.manager_of_class
+_create_manager_for_cls = instrumentation_registry.create_manager_for_cls
+_install_lookup_strategy(util.symbol('native'))
+
+def find_native_user_instrumentation_hook(cls):
+    """Find user-specified instrumentation management for a class."""
+    return getattr(cls, INSTRUMENTATION_MANAGER, None)
+instrumentation_finders.append(find_native_user_instrumentation_hook)
+
+def _generate_init(class_, class_manager):
+    """Build an __init__ decorator that triggers ClassManager events."""
+
+    # TODO: we should use the ClassManager's notion of the 
+    # original '__init__' method, once ClassManager is fixed
+    # to always reference that.
+    original__init__ = class_.__init__
+    assert original__init__
+
+    # Go through some effort here and don't change the user's __init__
+    # calling signature.
+    # FIXME: need to juggle local names to avoid constructor argument
+    # clashes.
+    func_body = """\
+def __init__(%(apply_pos)s):
+    new_state = class_manager._new_state_if_none(%(self_arg)s)
+    if new_state:
+        return new_state.initialize_instance(%(apply_kw)s)
+    else:
+        return original__init__(%(apply_kw)s)
+"""
+    func_vars = util.format_argspec_init(original__init__, grouped=False)
+    func_text = func_body % func_vars
+
+    func = getattr(original__init__, 'im_func', original__init__)
+    func_defaults = getattr(func, 'func_defaults', None)
+
+    env = locals().copy()
+    exec func_text in env
+    __init__ = env['__init__']
+    __init__.__doc__ = original__init__.__doc__
+    if func_defaults:
+        __init__.func_defaults = func_defaults
+    return __init__
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/orm/uowdumper.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/orm/uowdumper.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/orm/uowdumper.py (revision 3)
@@ -0,0 +1,101 @@
+# orm/uowdumper.py
+# Copyright (C) 2005, 2006, 2007, 2008, 2009 Michael Bayer mike_mp@zzzcomputing.com
+#
+# This module is part of SQLAlchemy and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+"""Dumps out a string representation of a UOWTask structure"""
+
+from sqlalchemy.orm import unitofwork
+from sqlalchemy.orm import util as mapperutil
+import StringIO
+
+class UOWDumper(unitofwork.UOWExecutor):
+    def __init__(self, tasks, buf):
+        self.indent = 0
+        self.tasks = tasks
+        self.buf = buf
+        self.execute(None, tasks)
+
+    @classmethod
+    def dump(cls, tasks):
+        buf = StringIO.StringIO()
+        UOWDumper(tasks, buf)
+        return buf.getvalue()
+
+    def execute(self, trans, tasks, isdelete=None):
+        if isdelete is not True:
+            for task in tasks:
+                self._execute(trans, task, False)
+        if isdelete is not False:
+            for task in reversed(tasks):
+                self._execute(trans, task, True)
+
+    def _execute(self, trans, task, isdelete):
+        try:
+            i = self._indent()
+            if i:
+                i = i[:-1] + "+-"
+            self.buf.write(i + " " + self._repr_task(task))
+            self.buf.write(" (" + (isdelete and "delete " or "save/update ") + "phase) \n")
+            self.indent += 1
+            super(UOWDumper, self).execute(trans, [task], isdelete)
+        finally:
+            self.indent -= 1
+
+
+    def save_objects(self, trans, task):
+        for rec in sorted(task.polymorphic_tosave_elements, key=lambda a: a.state.sort_key):
+            if rec.listonly:
+                continue
+            self.buf.write(self._indent()[:-1] + "+-" + self._repr_task_element(rec)  + "\n")
+
+    def delete_objects(self, trans, task):
+        for rec in task.polymorphic_todelete_elements:
+            if rec.listonly:
+                continue
+            self.buf.write(self._indent() + "- " + self._repr_task_element(rec)  + "\n")
+
+    def execute_dependency(self, transaction, dep, isdelete):
+        self._dump_processor(dep, isdelete)
+
+    def _dump_processor(self, proc, deletes):
+        if deletes:
+            val = proc.targettask.polymorphic_todelete_elements
+        else:
+            val = proc.targettask.polymorphic_tosave_elements
+
+        for v in val:
+            self.buf.write(self._indent() + "   +- " + self._repr_task_element(v, proc.processor.key, process=True) + "\n")
+
+    def _repr_task_element(self, te, attribute=None, process=False):
+        if getattr(te, 'state', None) is None:
+            objid = "(placeholder)"
+        else:
+            if attribute is not None:
+                objid = "%s.%s" % (mapperutil.state_str(te.state), attribute)
+            else:
+                objid = mapperutil.state_str(te.state)
+        if process:
+            return "Process %s" % (objid)
+        else:
+            return "%s %s" % ((te.isdelete and "Delete" or "Save"), objid)
+
+    def _repr_task(self, task):
+        if task.mapper is not None:
+            if task.mapper.__class__.__name__ == 'Mapper':
+                name = task.mapper.class_.__name__ + "/" + task.mapper.local_table.description
+            else:
+                name = repr(task.mapper)
+        else:
+            name = '(none)'
+        return ("UOWTask(%s, %s)" % (hex(id(task)), name))
+
+    def _repr_task_class(self, task):
+        if task.mapper is not None and task.mapper.__class__.__name__ == 'Mapper':
+            return task.mapper.class_.__name__
+        else:
+            return '(none)'
+
+    def _indent(self):
+        return "   |" * self.indent
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/sql/functions.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/sql/functions.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/sql/functions.py (revision 3)
@@ -0,0 +1,110 @@
+from sqlalchemy import types as sqltypes
+from sqlalchemy.sql.expression import (
+    ClauseList, Function, _literal_as_binds, text
+    )
+from sqlalchemy.sql import operators
+from sqlalchemy.sql.visitors import VisitableType
+
+class _GenericMeta(VisitableType):
+    def __call__(self, *args, **kwargs):
+        args = [_literal_as_binds(c) for c in args]
+        return type.__call__(self, *args, **kwargs)
+
+class GenericFunction(Function):
+    __metaclass__ = _GenericMeta
+
+    def __init__(self, type_=None, args=(), **kwargs):
+        self.packagenames = []
+        self.name = self.__class__.__name__
+        self._bind = kwargs.get('bind', None)
+        self.clause_expr = ClauseList(
+                operator=operators.comma_op,
+                group_contents=True, *args).self_group()
+        self.type = sqltypes.to_instance(
+            type_ or getattr(self, '__return_type__', None))
+
+class AnsiFunction(GenericFunction):
+    def __init__(self, **kwargs):
+        GenericFunction.__init__(self, **kwargs)
+
+class ReturnTypeFromArgs(GenericFunction):
+    """Define a function whose return type is the same as its arguments."""
+    
+    def __init__(self, *args, **kwargs):
+        kwargs.setdefault('type_', _type_from_args(args))
+        GenericFunction.__init__(self, args=args, **kwargs)
+
+class coalesce(ReturnTypeFromArgs):
+    pass
+
+class max(ReturnTypeFromArgs):
+    pass
+
+class min(ReturnTypeFromArgs):
+    pass
+
+class sum(ReturnTypeFromArgs):
+    pass
+
+class now(GenericFunction):
+    __return_type__ = sqltypes.DateTime
+
+class concat(GenericFunction):
+    __return_type__ = sqltypes.String
+    def __init__(self, *args, **kwargs):
+        GenericFunction.__init__(self, args=args, **kwargs)
+
+class char_length(GenericFunction):
+    __return_type__ = sqltypes.Integer
+
+    def __init__(self, arg, **kwargs):
+        GenericFunction.__init__(self, args=[arg], **kwargs)
+
+class random(GenericFunction):
+    def __init__(self, *args, **kwargs):
+        kwargs.setdefault('type_', None)
+        GenericFunction.__init__(self, args=args, **kwargs)
+
+class count(GenericFunction):
+    """The ANSI COUNT aggregate function.  With no arguments, emits COUNT \*."""
+
+    __return_type__ = sqltypes.Integer
+
+    def __init__(self, expression=None, **kwargs):
+        if expression is None:
+            expression = text('*')
+        GenericFunction.__init__(self, args=(expression,), **kwargs)
+
+class current_date(AnsiFunction):
+    __return_type__ = sqltypes.Date
+
+class current_time(AnsiFunction):
+    __return_type__ = sqltypes.Time
+
+class current_timestamp(AnsiFunction):
+    __return_type__ = sqltypes.DateTime
+
+class current_user(AnsiFunction):
+    __return_type__ = sqltypes.String
+
+class localtime(AnsiFunction):
+    __return_type__ = sqltypes.DateTime
+
+class localtimestamp(AnsiFunction):
+    __return_type__ = sqltypes.DateTime
+
+class session_user(AnsiFunction):
+    __return_type__ = sqltypes.String
+
+class sysdate(AnsiFunction):
+    __return_type__ = sqltypes.DateTime
+
+class user(AnsiFunction):
+    __return_type__ = sqltypes.String
+
+def _type_from_args(args):
+    for a in args:
+        if not isinstance(a.type, sqltypes.NullType):
+            return a.type
+    else:
+        return sqltypes.NullType
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/sql/compiler.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/sql/compiler.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/sql/compiler.py (revision 3)
@@ -0,0 +1,1199 @@
+# compiler.py
+# Copyright (C) 2005, 2006, 2007, 2008, 2009 Michael Bayer mike_mp@zzzcomputing.com
+#
+# This module is part of SQLAlchemy and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+"""Base SQL and DDL compiler implementations.
+
+Provides the :class:`~sqlalchemy.sql.compiler.DefaultCompiler` class, which is
+responsible for generating all SQL query strings, as well as
+:class:`~sqlalchemy.sql.compiler.SchemaGenerator` and :class:`~sqlalchemy.sql.compiler.SchemaDropper`
+which issue CREATE and DROP DDL for tables, sequences, and indexes.
+
+The elements in this module are used by public-facing constructs like
+:class:`~sqlalchemy.sql.expression.ClauseElement` and :class:`~sqlalchemy.engine.Engine`.
+While dialect authors will want to be familiar with this module for the purpose of
+creating database-specific compilers and schema generators, the module
+is otherwise internal to SQLAlchemy.
+"""
+
+import string, re
+from sqlalchemy import schema, engine, util, exc
+from sqlalchemy.sql import operators, functions, util as sql_util, visitors
+from sqlalchemy.sql import expression as sql
+
+RESERVED_WORDS = set([
+    'all', 'analyse', 'analyze', 'and', 'any', 'array',
+    'as', 'asc', 'asymmetric', 'authorization', 'between',
+    'binary', 'both', 'case', 'cast', 'check', 'collate',
+    'column', 'constraint', 'create', 'cross', 'current_date',
+    'current_role', 'current_time', 'current_timestamp',
+    'current_user', 'default', 'deferrable', 'desc',
+    'distinct', 'do', 'else', 'end', 'except', 'false',
+    'for', 'foreign', 'freeze', 'from', 'full', 'grant',
+    'group', 'having', 'ilike', 'in', 'initially', 'inner',
+    'intersect', 'into', 'is', 'isnull', 'join', 'leading',
+    'left', 'like', 'limit', 'localtime', 'localtimestamp',
+    'natural', 'new', 'not', 'notnull', 'null', 'off', 'offset',
+    'old', 'on', 'only', 'or', 'order', 'outer', 'overlaps',
+    'placing', 'primary', 'references', 'right', 'select',
+    'session_user', 'set', 'similar', 'some', 'symmetric', 'table',
+    'then', 'to', 'trailing', 'true', 'union', 'unique', 'user',
+    'using', 'verbose', 'when', 'where'])
+
+LEGAL_CHARACTERS = re.compile(r'^[A-Z0-9_$]+$', re.I)
+ILLEGAL_INITIAL_CHARACTERS = re.compile(r'[0-9$]')
+
+BIND_PARAMS = re.compile(r'(?<![:\w\$\x5c]):([\w\$]+)(?![:\w\$])', re.UNICODE)
+BIND_PARAMS_ESC = re.compile(r'\x5c(:[\w\$]+)(?![:\w\$])', re.UNICODE)
+
+BIND_TEMPLATES = {
+    'pyformat':"%%(%(name)s)s",
+    'qmark':"?",
+    'format':"%%s",
+    'numeric':":%(position)s",
+    'named':":%(name)s"
+}
+
+
+OPERATORS =  {
+    operators.and_ : 'AND',
+    operators.or_ : 'OR',
+    operators.inv : 'NOT',
+    operators.add : '+',
+    operators.mul : '*',
+    operators.sub : '-',
+    operators.div : '/',
+    operators.mod : '%',
+    operators.truediv : '/',
+    operators.lt : '<',
+    operators.le : '<=',
+    operators.ne : '!=',
+    operators.gt : '>',
+    operators.ge : '>=',
+    operators.eq : '=',
+    operators.distinct_op : 'DISTINCT',
+    operators.concat_op : '||',
+    operators.like_op : lambda x, y, escape=None: '%s LIKE %s' % (x, y) + (escape and ' ESCAPE \'%s\'' % escape or ''),
+    operators.notlike_op : lambda x, y, escape=None: '%s NOT LIKE %s' % (x, y) + (escape and ' ESCAPE \'%s\'' % escape or ''),
+    operators.ilike_op : lambda x, y, escape=None: "lower(%s) LIKE lower(%s)" % (x, y) + (escape and ' ESCAPE \'%s\'' % escape or ''),
+    operators.notilike_op : lambda x, y, escape=None: "lower(%s) NOT LIKE lower(%s)" % (x, y) + (escape and ' ESCAPE \'%s\'' % escape or ''),
+    operators.between_op : 'BETWEEN',
+    operators.match_op : 'MATCH',
+    operators.in_op : 'IN',
+    operators.notin_op : 'NOT IN',
+    operators.comma_op : ', ',
+    operators.desc_op : 'DESC',
+    operators.asc_op : 'ASC',
+    operators.from_ : 'FROM',
+    operators.as_ : 'AS',
+    operators.exists : 'EXISTS',
+    operators.is_ : 'IS',
+    operators.isnot : 'IS NOT',
+    operators.collate : 'COLLATE',
+}
+
+FUNCTIONS = {
+    functions.coalesce : 'coalesce%(expr)s',
+    functions.current_date: 'CURRENT_DATE',
+    functions.current_time: 'CURRENT_TIME',
+    functions.current_timestamp: 'CURRENT_TIMESTAMP',
+    functions.current_user: 'CURRENT_USER',
+    functions.localtime: 'LOCALTIME',
+    functions.localtimestamp: 'LOCALTIMESTAMP',
+    functions.random: 'random%(expr)s',
+    functions.sysdate: 'sysdate',
+    functions.session_user :'SESSION_USER',
+    functions.user: 'USER'
+}
+
+EXTRACT_MAP = {
+    'month': 'month',
+    'day': 'day',
+    'year': 'year',
+    'second': 'second',
+    'hour': 'hour',
+    'doy': 'doy',
+    'minute': 'minute',
+    'quarter': 'quarter',
+    'dow': 'dow',
+    'week': 'week',
+    'epoch': 'epoch',
+    'milliseconds': 'milliseconds',
+    'microseconds': 'microseconds',
+    'timezone_hour': 'timezone_hour',
+    'timezone_minute': 'timezone_minute'
+}
+
+class _CompileLabel(visitors.Visitable):
+    """lightweight label object which acts as an expression._Label."""
+
+    __visit_name__ = 'label'
+    __slots__ = 'element', 'name'
+    
+    def __init__(self, col, name):
+        self.element = col
+        self.name = name
+        
+    @property
+    def quote(self):
+        return self.element.quote
+
+class DefaultCompiler(engine.Compiled):
+    """Default implementation of Compiled.
+
+    Compiles ClauseElements into SQL strings.   Uses a similar visit
+    paradigm as visitors.ClauseVisitor but implements its own traversal.
+
+    """
+
+    operators = OPERATORS
+    functions = FUNCTIONS
+    extract_map = EXTRACT_MAP
+
+    # if we are insert/update/delete. 
+    # set to true when we visit an INSERT, UPDATE or DELETE
+    isdelete = isinsert = isupdate = False
+
+    def __init__(self, dialect, statement, column_keys=None, inline=False, **kwargs):
+        """Construct a new ``DefaultCompiler`` object.
+
+        dialect
+          Dialect to be used
+
+        statement
+          ClauseElement to be compiled
+
+        column_keys
+          a list of column names to be compiled into an INSERT or UPDATE
+          statement.
+
+        """
+        engine.Compiled.__init__(self, dialect, statement, column_keys, **kwargs)
+
+        # compile INSERT/UPDATE defaults/sequences inlined (no pre-execute)
+        self.inline = inline or getattr(statement, 'inline', False)
+
+        # a dictionary of bind parameter keys to _BindParamClause instances.
+        self.binds = {}
+
+        # a dictionary of _BindParamClause instances to "compiled" names that are
+        # actually present in the generated SQL
+        self.bind_names = util.column_dict()
+
+        # stack which keeps track of nested SELECT statements
+        self.stack = []
+
+        # relates label names in the final SQL to
+        # a tuple of local column/label name, ColumnElement object (if any) and TypeEngine.
+        # ResultProxy uses this for type processing and column targeting
+        self.result_map = {}
+
+        # true if the paramstyle is positional
+        self.positional = self.dialect.positional
+        if self.positional:
+            self.positiontup = []
+
+        self.bindtemplate = BIND_TEMPLATES[self.dialect.paramstyle]
+
+        # an IdentifierPreparer that formats the quoting of identifiers
+        self.preparer = self.dialect.identifier_preparer
+
+        self.label_length = self.dialect.label_length or self.dialect.max_identifier_length
+        
+        # a map which tracks "anonymous" identifiers that are
+        # created on the fly here
+        self.anon_map = util.PopulateDict(self._process_anon)
+
+        # a map which tracks "truncated" names based on dialect.label_length
+        # or dialect.max_identifier_length
+        self.truncated_names = {}
+
+    def compile(self):
+        self.string = self.process(self.statement)
+
+    def process(self, obj, **kwargs):
+        return obj._compiler_dispatch(self, **kwargs)
+
+    def is_subquery(self):
+        return len(self.stack) > 1
+
+    def construct_params(self, params=None):
+        """return a dictionary of bind parameter keys and values"""
+
+        if params:
+            params = util.column_dict(params)
+            pd = {}
+            for bindparam, name in self.bind_names.iteritems():
+                for paramname in (bindparam.key, bindparam.shortname, name):
+                    if paramname in params:
+                        pd[name] = params[paramname]
+                        break
+                else:
+                    if util.callable(bindparam.value):
+                        pd[name] = bindparam.value()
+                    else:
+                        pd[name] = bindparam.value
+            return pd
+        else:
+            pd = {}
+            for bindparam in self.bind_names:
+                if util.callable(bindparam.value):
+                    pd[self.bind_names[bindparam]] = bindparam.value()
+                else:
+                    pd[self.bind_names[bindparam]] = bindparam.value
+            return pd
+
+    params = property(construct_params)
+
+    def default_from(self):
+        """Called when a SELECT statement has no froms, and no FROM clause is to be appended.
+
+        Gives Oracle a chance to tack on a ``FROM DUAL`` to the string output.
+
+        """
+        return ""
+
+    def visit_grouping(self, grouping, **kwargs):
+        return "(" + self.process(grouping.element) + ")"
+
+    def visit_label(self, label, result_map=None, within_columns_clause=False):
+        # only render labels within the columns clause
+        # or ORDER BY clause of a select.  dialect-specific compilers
+        # can modify this behavior.
+        if within_columns_clause:
+            labelname = isinstance(label.name, sql._generated_label) and \
+                    self._truncated_identifier("colident", label.name) or label.name
+
+            if result_map is not None:
+                result_map[labelname.lower()] = (label.name, (label, label.element, labelname), label.element.type)
+
+            return self.process(label.element) + " " + \
+                        self.operator_string(operators.as_) + " " + \
+                        self.preparer.format_label(label, labelname)
+        else:
+            return self.process(label.element)
+            
+    def visit_column(self, column, result_map=None, **kwargs):
+        name = column.name
+        if not column.is_literal and isinstance(name, sql._generated_label):
+            name = self._truncated_identifier("colident", name)
+
+        if result_map is not None:
+            result_map[name.lower()] = (name, (column, ), column.type)
+        
+        if column.is_literal:
+            name = self.escape_literal_column(name)
+        else:
+            name = self.preparer.quote(name, column.quote)
+
+        if column.table is None or not column.table.named_with_column:
+            return name
+        else:
+            if column.table.schema:
+                schema_prefix = self.preparer.quote_schema(column.table.schema, column.table.quote_schema) + '.'
+            else:
+                schema_prefix = ''
+            tablename = column.table.name
+            tablename = isinstance(tablename, sql._generated_label) and \
+                            self._truncated_identifier("alias", tablename) or tablename
+            
+            return schema_prefix + self.preparer.quote(tablename, column.table.quote) + "." + name
+
+    def escape_literal_column(self, text):
+        """provide escaping for the literal_column() construct."""
+
+        # TODO: some dialects might need different behavior here
+        return text.replace('%', '%%')
+
+    def visit_fromclause(self, fromclause, **kwargs):
+        return fromclause.name
+
+    def visit_index(self, index, **kwargs):
+        return index.name
+
+    def visit_typeclause(self, typeclause, **kwargs):
+        return typeclause.type.dialect_impl(self.dialect).get_col_spec()
+
+    def post_process_text(self, text):
+        return text
+        
+    def visit_textclause(self, textclause, **kwargs):
+        if textclause.typemap is not None:
+            for colname, type_ in textclause.typemap.iteritems():
+                self.result_map[colname.lower()] = (colname, None, type_)
+
+        def do_bindparam(m):
+            name = m.group(1)
+            if name in textclause.bindparams:
+                return self.process(textclause.bindparams[name])
+            else:
+                return self.bindparam_string(name)
+
+        # un-escape any \:params
+        return BIND_PARAMS_ESC.sub(lambda m: m.group(1),
+            BIND_PARAMS.sub(do_bindparam, self.post_process_text(textclause.text))
+        )
+
+    def visit_null(self, null, **kwargs):
+        return 'NULL'
+
+    def visit_clauselist(self, clauselist, **kwargs):
+        sep = clauselist.operator
+        if sep is None:
+            sep = " "
+        elif sep is operators.comma_op:
+            sep = ', '
+        else:
+            sep = " " + self.operator_string(clauselist.operator) + " "
+        return sep.join(s for s in (self.process(c) for c in clauselist.clauses)
+                        if s is not None)
+
+    def visit_case(self, clause, **kwargs):
+        x = "CASE "
+        if clause.value:
+            x += self.process(clause.value) + " "
+        for cond, result in clause.whens:
+            x += "WHEN " + self.process(cond) + " THEN " + self.process(result) + " "
+        if clause.else_:
+            x += "ELSE " + self.process(clause.else_) + " "
+        x += "END"
+        return x
+
+    def visit_cast(self, cast, **kwargs):
+        return "CAST(%s AS %s)" % (self.process(cast.clause), self.process(cast.typeclause))
+
+    def visit_extract(self, extract, **kwargs):
+        field = self.extract_map.get(extract.field, extract.field)
+        return "EXTRACT(%s FROM %s)" % (field, self.process(extract.expr))
+
+    def visit_function(self, func, result_map=None, **kwargs):
+        if result_map is not None:
+            result_map[func.name.lower()] = (func.name, None, func.type)
+
+        name = self.function_string(func)
+
+        if util.callable(name):
+            return name(*[self.process(x) for x in func.clauses])
+        else:
+            return ".".join(func.packagenames + [name]) % {'expr':self.function_argspec(func)}
+
+    def function_argspec(self, func, **kwargs):
+        return self.process(func.clause_expr, **kwargs)
+
+    def function_string(self, func):
+        return self.functions.get(func.__class__, self.functions.get(func.name, func.name + "%(expr)s"))
+
+    def visit_compound_select(self, cs, asfrom=False, parens=True, **kwargs):
+        entry = self.stack and self.stack[-1] or {}
+        self.stack.append({'from':entry.get('from', None), 'iswrapper':True})
+
+        text = string.join((self.process(c, asfrom=asfrom, parens=False, compound_index=i)
+                            for i, c in enumerate(cs.selects)),
+                           " " + cs.keyword + " ")
+        group_by = self.process(cs._group_by_clause, asfrom=asfrom)
+        if group_by:
+            text += " GROUP BY " + group_by
+
+        text += self.order_by_clause(cs)
+        text += (cs._limit is not None or cs._offset is not None) and self.limit_clause(cs) or ""
+
+        self.stack.pop(-1)
+        if asfrom and parens:
+            return "(" + text + ")"
+        else:
+            return text
+
+    def visit_unary(self, unary, **kw):
+        s = self.process(unary.element, **kw)
+        if unary.operator:
+            s = self.operator_string(unary.operator) + " " + s
+        if unary.modifier:
+            s = s + " " + self.operator_string(unary.modifier)
+        return s
+
+    def visit_binary(self, binary, **kwargs):
+        op = self.operator_string(binary.operator)
+        if util.callable(op):
+            return op(self.process(binary.left), self.process(binary.right), **binary.modifiers)
+        else:
+            return self.process(binary.left) + " " + op + " " + self.process(binary.right)
+
+    def operator_string(self, operator):
+        return self.operators.get(operator, str(operator))
+
+    def visit_bindparam(self, bindparam, **kwargs):
+        name = self._truncate_bindparam(bindparam)
+        if name in self.binds:
+            existing = self.binds[name]
+            if existing is not bindparam and (existing.unique or bindparam.unique):
+                raise exc.CompileError("Bind parameter '%s' conflicts with unique bind parameter of the same name" % bindparam.key)
+        self.binds[bindparam.key] = self.binds[name] = bindparam
+        return self.bindparam_string(name)
+
+    def _truncate_bindparam(self, bindparam):
+        if bindparam in self.bind_names:
+            return self.bind_names[bindparam]
+
+        bind_name = bindparam.key
+        bind_name = isinstance(bind_name, sql._generated_label) and \
+                        self._truncated_identifier("bindparam", bind_name) or bind_name
+        # add to bind_names for translation
+        self.bind_names[bindparam] = bind_name
+
+        return bind_name
+
+    def _truncated_identifier(self, ident_class, name):
+        if (ident_class, name) in self.truncated_names:
+            return self.truncated_names[(ident_class, name)]
+
+        anonname = name % self.anon_map 
+
+        if len(anonname) > self.label_length:
+            counter = self.truncated_names.get(ident_class, 1)
+            truncname = anonname[0:max(self.label_length - 6, 0)] + "_" + hex(counter)[2:]
+            self.truncated_names[ident_class] = counter + 1
+        else:
+            truncname = anonname
+        self.truncated_names[(ident_class, name)] = truncname
+        return truncname
+    
+    def _anonymize(self, name):
+        return name % self.anon_map
+        
+    def _process_anon(self, key):
+        (ident, derived) = key.split(' ', 1)
+        anonymous_counter = self.anon_map.get(derived, 1)
+        self.anon_map[derived] = anonymous_counter + 1
+        return derived + "_" + str(anonymous_counter)
+
+    def bindparam_string(self, name):
+        if self.positional:
+            self.positiontup.append(name)
+            return self.bindtemplate % {'name':name, 'position':len(self.positiontup)}
+        else:
+            return self.bindtemplate % {'name':name}
+
+    def visit_alias(self, alias, asfrom=False, **kwargs):
+        if asfrom:
+            alias_name = isinstance(alias.name, sql._generated_label) and \
+                            self._truncated_identifier("alias", alias.name) or alias.name
+            
+            return self.process(alias.original, asfrom=True, **kwargs) + " AS " + \
+                    self.preparer.format_alias(alias, alias_name)
+        else:
+            return self.process(alias.original, **kwargs)
+
+    def label_select_column(self, select, column, asfrom):
+        """label columns present in a select()."""
+
+        if isinstance(column, sql._Label):
+            return column
+
+        if select.use_labels and column._label:
+            return _CompileLabel(column, column._label)
+
+        if \
+            asfrom and \
+            isinstance(column, sql.ColumnClause) and \
+            not column.is_literal and \
+            column.table is not None and \
+            not isinstance(column.table, sql.Select):
+            return _CompileLabel(column, sql._generated_label(column.name))
+        elif not isinstance(column, (sql._UnaryExpression, sql._TextClause, sql._BindParamClause)) \
+                and (not hasattr(column, 'name') or isinstance(column, sql.Function)):
+            return _CompileLabel(column, column.anon_label)
+        else:
+            return column
+
+    def visit_select(self, select, asfrom=False, parens=True, iswrapper=False, compound_index=1, **kwargs):
+
+        entry = self.stack and self.stack[-1] or {}
+        
+        existingfroms = entry.get('from', None)
+
+        froms = select._get_display_froms(existingfroms)
+
+        correlate_froms = set(sql._from_objects(*froms))
+
+        # TODO: might want to propagate existing froms for select(select(select))
+        # where innermost select should correlate to outermost
+        # if existingfroms:
+        #     correlate_froms = correlate_froms.union(existingfroms)
+
+        self.stack.append({'from':correlate_froms, 'iswrapper':iswrapper})
+
+        if compound_index==1 and not entry or entry.get('iswrapper', False):
+            column_clause_args = {'result_map':self.result_map}
+        else:
+            column_clause_args = {}
+
+        # the actual list of columns to print in the SELECT column list.
+        inner_columns = [
+            c for c in [
+                self.process(
+                    self.label_select_column(select, co, asfrom=asfrom), 
+                    within_columns_clause=True,
+                    **column_clause_args) 
+                for co in util.unique_list(select.inner_columns)
+            ]
+            if c is not None
+        ]
+        
+        text = "SELECT "  # we're off to a good start !
+        if select._prefixes:
+            text += " ".join(self.process(x) for x in select._prefixes) + " "
+        text += self.get_select_precolumns(select)
+        text += ', '.join(inner_columns)
+
+        if froms:
+            text += " \nFROM "
+            text += ', '.join(self.process(f, asfrom=True) for f in froms)
+        else:
+            text += self.default_from()
+
+        if select._whereclause is not None:
+            t = self.process(select._whereclause)
+            if t:
+                text += " \nWHERE " + t
+
+        if select._group_by_clause.clauses:
+            group_by = self.process(select._group_by_clause)
+            if group_by:
+                text += " GROUP BY " + group_by
+
+        if select._having is not None:
+            t = self.process(select._having)
+            if t:
+                text += " \nHAVING " + t
+
+        if select._order_by_clause.clauses:
+            text += self.order_by_clause(select)
+        if select._limit is not None or select._offset is not None:
+            text += self.limit_clause(select)
+        if select.for_update:
+            text += self.for_update_clause(select)
+
+        self.stack.pop(-1)
+
+        if asfrom and parens:
+            return "(" + text + ")"
+        else:
+            return text
+
+    def get_select_precolumns(self, select):
+        """Called when building a ``SELECT`` statement, position is just before column list."""
+
+        return select._distinct and "DISTINCT " or ""
+
+    def order_by_clause(self, select):
+        order_by = self.process(select._order_by_clause)
+        if order_by:
+            return " ORDER BY " + order_by
+        else:
+            return ""
+
+    def for_update_clause(self, select):
+        if select.for_update:
+            return " FOR UPDATE"
+        else:
+            return ""
+
+    def limit_clause(self, select):
+        text = ""
+        if select._limit is not None:
+            text +=  " \n LIMIT " + str(select._limit)
+        if select._offset is not None:
+            if select._limit is None:
+                text += " \n LIMIT -1"
+            text += " OFFSET " + str(select._offset)
+        return text
+
+    def visit_table(self, table, asfrom=False, **kwargs):
+        if asfrom:
+            if getattr(table, "schema", None):
+                return self.preparer.quote_schema(table.schema, table.quote_schema) + "." + self.preparer.quote(table.name, table.quote)
+            else:
+                return self.preparer.quote(table.name, table.quote)
+        else:
+            return ""
+
+    def visit_join(self, join, asfrom=False, **kwargs):
+        return (self.process(join.left, asfrom=True) + (join.isouter and " LEFT OUTER JOIN " or " JOIN ") + \
+            self.process(join.right, asfrom=True) + " ON " + self.process(join.onclause))
+
+    def visit_sequence(self, seq):
+        return None
+
+    def visit_insert(self, insert_stmt):
+        self.isinsert = True
+        colparams = self._get_colparams(insert_stmt)
+        preparer = self.preparer
+
+        insert = ' '.join(["INSERT"] +
+                          [self.process(x) for x in insert_stmt._prefixes])
+
+        if not colparams and not self.dialect.supports_default_values and not self.dialect.supports_empty_insert:
+            raise exc.CompileError(
+                "The version of %s you are using does not support empty inserts." % self.dialect.name)
+        elif not colparams and self.dialect.supports_default_values:
+            return (insert + " INTO %s DEFAULT VALUES" % (
+                (preparer.format_table(insert_stmt.table),)))
+        else: 
+            return (insert + " INTO %s (%s) VALUES (%s)" %
+                (preparer.format_table(insert_stmt.table),
+                 ', '.join([preparer.format_column(c[0])
+                           for c in colparams]),
+                 ', '.join([c[1] for c in colparams])))
+
+    def visit_update(self, update_stmt):
+        self.stack.append({'from': set([update_stmt.table])})
+
+        self.isupdate = True
+        colparams = self._get_colparams(update_stmt)
+
+        text = ' '.join((
+            "UPDATE",
+            self.preparer.format_table(update_stmt.table),
+            'SET',
+            ', '.join(self.preparer.quote(c[0].name, c[0].quote) + '=' + c[1]
+                      for c in colparams)
+            ))
+
+        if update_stmt._whereclause:
+            text += " WHERE " + self.process(update_stmt._whereclause)
+
+        self.stack.pop(-1)
+
+        return text
+
+    def _get_colparams(self, stmt):
+        """create a set of tuples representing column/string pairs for use
+        in an INSERT or UPDATE statement.
+
+        """
+
+        def create_bind_param(col, value):
+            bindparam = sql.bindparam(col.key, value, type_=col.type)
+            self.binds[col.key] = bindparam
+            return self.bindparam_string(self._truncate_bindparam(bindparam))
+
+        self.postfetch = []
+        self.prefetch = []
+
+        # no parameters in the statement, no parameters in the
+        # compiled params - return binds for all columns
+        if self.column_keys is None and stmt.parameters is None:
+            return [(c, create_bind_param(c, None)) for c in stmt.table.columns]
+
+        # if we have statement parameters - set defaults in the
+        # compiled params
+        if self.column_keys is None:
+            parameters = {}
+        else:
+            parameters = dict((sql._column_as_key(key), None)
+                              for key in self.column_keys)
+
+        if stmt.parameters is not None:
+            for k, v in stmt.parameters.iteritems():
+                parameters.setdefault(sql._column_as_key(k), v)
+
+        # create a list of column assignment clauses as tuples
+        values = []
+        for c in stmt.table.columns:
+            if c.key in parameters:
+                value = parameters[c.key]
+                if sql._is_literal(value):
+                    value = create_bind_param(c, value)
+                else:
+                    self.postfetch.append(c)
+                    value = self.process(value.self_group())
+                values.append((c, value))
+            elif isinstance(c, schema.Column):
+                if self.isinsert:
+                    if (c.primary_key and self.dialect.preexecute_pk_sequences and not self.inline):
+                        if (((isinstance(c.default, schema.Sequence) and
+                              not c.default.optional) or
+                             not self.dialect.supports_pk_autoincrement) or
+                            (c.default is not None and
+                             not isinstance(c.default, schema.Sequence))):
+                            values.append((c, create_bind_param(c, None)))
+                            self.prefetch.append(c)
+                    elif isinstance(c.default, schema.ColumnDefault):
+                        if isinstance(c.default.arg, sql.ClauseElement):
+                            values.append((c, self.process(c.default.arg.self_group())))
+                            if not c.primary_key:
+                                # dont add primary key column to postfetch
+                                self.postfetch.append(c)
+                        else:
+                            values.append((c, create_bind_param(c, None)))
+                            self.prefetch.append(c)
+                    elif c.server_default is not None:
+                        if not c.primary_key:
+                            self.postfetch.append(c)
+                    elif isinstance(c.default, schema.Sequence):
+                        proc = self.process(c.default)
+                        if proc is not None:
+                            values.append((c, proc))
+                            if not c.primary_key:
+                                self.postfetch.append(c)
+                elif self.isupdate:
+                    if isinstance(c.onupdate, schema.ColumnDefault):
+                        if isinstance(c.onupdate.arg, sql.ClauseElement):
+                            values.append((c, self.process(c.onupdate.arg.self_group())))
+                            self.postfetch.append(c)
+                        else:
+                            values.append((c, create_bind_param(c, None)))
+                            self.prefetch.append(c)
+                    elif c.server_onupdate is not None:
+                        self.postfetch.append(c)
+                    # deprecated? or remove?
+                    elif isinstance(c.onupdate, schema.FetchedValue):
+                        self.postfetch.append(c)
+        return values
+
+    def visit_delete(self, delete_stmt):
+        self.stack.append({'from': set([delete_stmt.table])})
+        self.isdelete = True
+
+        text = "DELETE FROM " + self.preparer.format_table(delete_stmt.table)
+
+        if delete_stmt._whereclause:
+            text += " WHERE " + self.process(delete_stmt._whereclause)
+
+        self.stack.pop(-1)
+
+        return text
+
+    def visit_savepoint(self, savepoint_stmt):
+        return "SAVEPOINT %s" % self.preparer.format_savepoint(savepoint_stmt)
+
+    def visit_rollback_to_savepoint(self, savepoint_stmt):
+        return "ROLLBACK TO SAVEPOINT %s" % self.preparer.format_savepoint(savepoint_stmt)
+
+    def visit_release_savepoint(self, savepoint_stmt):
+        return "RELEASE SAVEPOINT %s" % self.preparer.format_savepoint(savepoint_stmt)
+
+    def __str__(self):
+        return self.string or ''
+
+class DDLBase(engine.SchemaIterator):
+    def find_alterables(self, tables):
+        alterables = []
+        class FindAlterables(schema.SchemaVisitor):
+            def visit_foreign_key_constraint(self, constraint):
+                if constraint.use_alter and constraint.table in tables:
+                    alterables.append(constraint)
+        findalterables = FindAlterables()
+        for table in tables:
+            for c in table.constraints:
+                findalterables.traverse(c)
+        return alterables
+
+    def _validate_identifier(self, ident, truncate):
+        if truncate:
+            if len(ident) > self.dialect.max_identifier_length:
+                counter = getattr(self, 'counter', 0)
+                self.counter = counter + 1
+                return ident[0:self.dialect.max_identifier_length - 6] + "_" + hex(self.counter)[2:]
+            else:
+                return ident
+        else:
+            self.dialect.validate_identifier(ident)
+            return ident
+
+
+class SchemaGenerator(DDLBase):
+    def __init__(self, dialect, connection, checkfirst=False, tables=None, **kwargs):
+        super(SchemaGenerator, self).__init__(connection, **kwargs)
+        self.checkfirst = checkfirst
+        self.tables = tables and set(tables) or None
+        self.preparer = dialect.identifier_preparer
+        self.dialect = dialect
+
+    def get_column_specification(self, column, first_pk=False):
+        raise NotImplementedError()
+
+    def _can_create(self, table):
+        self.dialect.validate_identifier(table.name)
+        if table.schema:
+            self.dialect.validate_identifier(table.schema)
+        return not self.checkfirst or not self.dialect.has_table(self.connection, table.name, schema=table.schema)
+
+    def visit_metadata(self, metadata):
+        if self.tables:
+            tables = self.tables
+        else:
+            tables = metadata.tables.values()
+        collection = [t for t in sql_util.sort_tables(tables) if self._can_create(t)]
+        for table in collection:
+            self.traverse_single(table)
+        if self.dialect.supports_alter:
+            for alterable in self.find_alterables(collection):
+                self.add_foreignkey(alterable)
+
+    def visit_table(self, table):
+        for listener in table.ddl_listeners['before-create']:
+            listener('before-create', table, self.connection)
+
+        for column in table.columns:
+            if column.default is not None:
+                self.traverse_single(column.default)
+
+        self.append("\n" + " ".join(['CREATE'] +
+                                    table._prefixes +
+                                    ['TABLE',
+                                     self.preparer.format_table(table),
+                                     "("]))
+        separator = "\n"
+
+        # if only one primary key, specify it along with the column
+        first_pk = False
+        for column in table.columns:
+            self.append(separator)
+            separator = ", \n"
+            self.append("\t" + self.get_column_specification(column, first_pk=column.primary_key and not first_pk))
+            if column.primary_key:
+                first_pk = True
+            for constraint in column.constraints:
+                self.traverse_single(constraint)
+
+        # On some DB order is significant: visit PK first, then the
+        # other constraints (engine.ReflectionTest.testbasic failed on FB2)
+        if table.primary_key:
+            self.traverse_single(table.primary_key)
+        for constraint in [c for c in table.constraints if c is not table.primary_key]:
+            self.traverse_single(constraint)
+
+        self.append("\n)%s\n\n" % self.post_create_table(table))
+        self.execute()
+
+        if hasattr(table, 'indexes'):
+            for index in table.indexes:
+                self.traverse_single(index)
+
+        for listener in table.ddl_listeners['after-create']:
+            listener('after-create', table, self.connection)
+
+    def post_create_table(self, table):
+        return ''
+
+    def get_column_default_string(self, column):
+        if isinstance(column.server_default, schema.DefaultClause):
+            if isinstance(column.server_default.arg, basestring):
+                return "'%s'" % column.server_default.arg
+            else:
+                return unicode(self._compile(column.server_default.arg, None))
+        else:
+            return None
+
+    def _compile(self, tocompile, parameters):
+        """compile the given string/parameters using this SchemaGenerator's dialect."""
+        compiler = self.dialect.statement_compiler(self.dialect, tocompile, parameters)
+        compiler.compile()
+        return compiler
+
+    def visit_check_constraint(self, constraint):
+        self.append(", \n\t")
+        if constraint.name is not None:
+            self.append("CONSTRAINT %s " %
+                        self.preparer.format_constraint(constraint))
+        self.append(" CHECK (%s)" % constraint.sqltext)
+        self.define_constraint_deferrability(constraint)
+
+    def visit_column_check_constraint(self, constraint):
+        self.append(" CHECK (%s)" % constraint.sqltext)
+        self.define_constraint_deferrability(constraint)
+
+    def visit_primary_key_constraint(self, constraint):
+        if len(constraint) == 0:
+            return
+        self.append(", \n\t")
+        if constraint.name is not None:
+            self.append("CONSTRAINT %s " % self.preparer.format_constraint(constraint))
+        self.append("PRIMARY KEY ")
+        self.append("(%s)" % ', '.join(self.preparer.quote(c.name, c.quote)
+                                       for c in constraint))
+        self.define_constraint_deferrability(constraint)
+
+    def visit_foreign_key_constraint(self, constraint):
+        if constraint.use_alter and self.dialect.supports_alter:
+            return
+        self.append(", \n\t ")
+        self.define_foreign_key(constraint)
+
+    def add_foreignkey(self, constraint):
+        self.append("ALTER TABLE %s ADD " % self.preparer.format_table(constraint.table))
+        self.define_foreign_key(constraint)
+        self.execute()
+
+    def define_foreign_key(self, constraint):
+        preparer = self.preparer
+        if constraint.name is not None:
+            self.append("CONSTRAINT %s " %
+                        preparer.format_constraint(constraint))
+        table = list(constraint.elements)[0].column.table
+        self.append("FOREIGN KEY(%s) REFERENCES %s (%s)" % (
+            ', '.join(preparer.quote(f.parent.name, f.parent.quote)
+                      for f in constraint.elements),
+            preparer.format_table(table),
+            ', '.join(preparer.quote(f.column.name, f.column.quote)
+                      for f in constraint.elements)
+        ))
+        if constraint.ondelete is not None:
+            self.append(" ON DELETE %s" % constraint.ondelete)
+        if constraint.onupdate is not None:
+            self.append(" ON UPDATE %s" % constraint.onupdate)
+        self.define_constraint_deferrability(constraint)
+
+    def visit_unique_constraint(self, constraint):
+        self.append(", \n\t")
+        if constraint.name is not None:
+            self.append("CONSTRAINT %s " %
+                        self.preparer.format_constraint(constraint))
+        self.append(" UNIQUE (%s)" % (', '.join(self.preparer.quote(c.name, c.quote) for c in constraint)))
+        self.define_constraint_deferrability(constraint)
+
+    def define_constraint_deferrability(self, constraint):
+        if constraint.deferrable is not None:
+            if constraint.deferrable:
+                self.append(" DEFERRABLE")
+            else:
+                self.append(" NOT DEFERRABLE")
+        if constraint.initially is not None:
+            self.append(" INITIALLY %s" % constraint.initially)
+
+    def visit_column(self, column):
+        pass
+
+    def visit_index(self, index):
+        preparer = self.preparer
+        self.append("CREATE ")
+        if index.unique:
+            self.append("UNIQUE ")
+        self.append("INDEX %s ON %s (%s)" \
+                    % (preparer.quote(self._validate_identifier(index.name, True), index.quote),
+                       preparer.format_table(index.table),
+                       ', '.join(preparer.quote(c.name, c.quote)
+                                 for c in index.columns)))
+        self.execute()
+
+
+class SchemaDropper(DDLBase):
+    def __init__(self, dialect, connection, checkfirst=False, tables=None, **kwargs):
+        super(SchemaDropper, self).__init__(connection, **kwargs)
+        self.checkfirst = checkfirst
+        self.tables = tables
+        self.preparer = dialect.identifier_preparer
+        self.dialect = dialect
+
+    def visit_metadata(self, metadata):
+        if self.tables:
+            tables = self.tables
+        else:
+            tables = metadata.tables.values()
+        collection = [t for t in reversed(sql_util.sort_tables(tables)) if self._can_drop(t)]
+        if self.dialect.supports_alter:
+            for alterable in self.find_alterables(collection):
+                self.drop_foreignkey(alterable)
+        for table in collection:
+            self.traverse_single(table)
+
+    def _can_drop(self, table):
+        self.dialect.validate_identifier(table.name)
+        if table.schema:
+            self.dialect.validate_identifier(table.schema)
+        return not self.checkfirst or self.dialect.has_table(self.connection, table.name, schema=table.schema)
+
+    def visit_index(self, index):
+        self.append("\nDROP INDEX " + self.preparer.quote(self._validate_identifier(index.name, False), index.quote))
+        self.execute()
+
+    def drop_foreignkey(self, constraint):
+        self.append("ALTER TABLE %s DROP CONSTRAINT %s" % (
+            self.preparer.format_table(constraint.table),
+            self.preparer.format_constraint(constraint)))
+        self.execute()
+
+    def visit_table(self, table):
+        for listener in table.ddl_listeners['before-drop']:
+            listener('before-drop', table, self.connection)
+
+        for column in table.columns:
+            if column.default is not None:
+                self.traverse_single(column.default)
+
+        self.append("\nDROP TABLE " + self.preparer.format_table(table))
+        self.execute()
+
+        for listener in table.ddl_listeners['after-drop']:
+            listener('after-drop', table, self.connection)
+
+
+class IdentifierPreparer(object):
+    """Handle quoting and case-folding of identifiers based on options."""
+
+    reserved_words = RESERVED_WORDS
+
+    legal_characters = LEGAL_CHARACTERS
+
+    illegal_initial_characters = ILLEGAL_INITIAL_CHARACTERS
+
+    def __init__(self, dialect, initial_quote='"', final_quote=None, omit_schema=False):
+        """Construct a new ``IdentifierPreparer`` object.
+
+        initial_quote
+          Character that begins a delimited identifier.
+
+        final_quote
+          Character that ends a delimited identifier. Defaults to `initial_quote`.
+
+        omit_schema
+          Prevent prepending schema name. Useful for databases that do
+          not support schemae.
+        """
+
+        self.dialect = dialect
+        self.initial_quote = initial_quote
+        self.final_quote = final_quote or self.initial_quote
+        self.omit_schema = omit_schema
+        self._strings = {}
+        
+    def _escape_identifier(self, value):
+        """Escape an identifier.
+
+        Subclasses should override this to provide database-dependent
+        escaping behavior.
+        """
+
+        return value.replace('"', '""')
+
+    def _unescape_identifier(self, value):
+        """Canonicalize an escaped identifier.
+
+        Subclasses should override this to provide database-dependent
+        unescaping behavior that reverses _escape_identifier.
+        """
+
+        return value.replace('""', '"')
+
+    def quote_identifier(self, value):
+        """Quote an identifier.
+
+        Subclasses should override this to provide database-dependent
+        quoting behavior.
+        """
+
+        return self.initial_quote + self._escape_identifier(value) + self.final_quote
+
+    def _requires_quotes(self, value):
+        """Return True if the given identifier requires quoting."""
+        lc_value = value.lower()
+        return (lc_value in self.reserved_words
+                or self.illegal_initial_characters.match(value[0])
+                or not self.legal_characters.match(unicode(value))
+                or (lc_value != value))
+
+    def quote_schema(self, schema, force):
+        """Quote a schema.
+
+        Subclasses should override this to provide database-dependent 
+        quoting behavior.
+        """
+        return self.quote(schema, force)
+
+    def quote(self, ident, force):
+        if force is None:
+            if ident in self._strings:
+                return self._strings[ident]
+            else:
+                if self._requires_quotes(ident):
+                    self._strings[ident] = self.quote_identifier(ident)
+                else:
+                    self._strings[ident] = ident
+                return self._strings[ident]
+        elif force:
+            return self.quote_identifier(ident)
+        else:
+            return ident
+
+    def format_sequence(self, sequence, use_schema=True):
+        name = self.quote(sequence.name, sequence.quote)
+        if not self.omit_schema and use_schema and sequence.schema is not None:
+            name = self.quote_schema(sequence.schema, sequence.quote) + "." + name
+        return name
+
+    def format_label(self, label, name=None):
+        return self.quote(name or label.name, label.quote)
+
+    def format_alias(self, alias, name=None):
+        return self.quote(name or alias.name, alias.quote)
+
+    def format_savepoint(self, savepoint, name=None):
+        return self.quote(name or savepoint.ident, savepoint.quote)
+
+    def format_constraint(self, constraint):
+        return self.quote(constraint.name, constraint.quote)
+    
+    def format_table(self, table, use_schema=True, name=None):
+        """Prepare a quoted table and schema name."""
+
+        if name is None:
+            name = table.name
+        result = self.quote(name, table.quote)
+        if not self.omit_schema and use_schema and getattr(table, "schema", None):
+            result = self.quote_schema(table.schema, table.quote_schema) + "." + result
+        return result
+
+    def format_column(self, column, use_table=False, name=None, table_name=None):
+        """Prepare a quoted column name."""
+
+        if name is None:
+            name = column.name
+        if not getattr(column, 'is_literal', False):
+            if use_table:
+                return self.format_table(column.table, use_schema=False, name=table_name) + "." + self.quote(name, column.quote)
+            else:
+                return self.quote(name, column.quote)
+        else:
+            # literal textual elements get stuck into ColumnClause alot, which shouldnt get quoted
+            if use_table:
+                return self.format_table(column.table, use_schema=False, name=table_name) + "." + name
+            else:
+                return name
+
+    def format_table_seq(self, table, use_schema=True):
+        """Format table name and schema as a tuple."""
+
+        # Dialects with more levels in their fully qualified references
+        # ('database', 'owner', etc.) could override this and return
+        # a longer sequence.
+
+        if not self.omit_schema and use_schema and getattr(table, 'schema', None):
+            return (self.quote_schema(table.schema, table.quote_schema),
+                    self.format_table(table, use_schema=False))
+        else:
+            return (self.format_table(table, use_schema=False), )
+
+    def unformat_identifiers(self, identifiers):
+        """Unpack 'schema.table.column'-like strings into components."""
+
+        try:
+            r = self._r_identifiers
+        except AttributeError:
+            initial, final, escaped_final = \
+                     [re.escape(s) for s in
+                      (self.initial_quote, self.final_quote,
+                       self._escape_identifier(self.final_quote))]
+            r = re.compile(
+                r'(?:'
+                r'(?:%(initial)s((?:%(escaped)s|[^%(final)s])+)%(final)s'
+                r'|([^\.]+))(?=\.|$))+' %
+                { 'initial': initial,
+                  'final': final,
+                  'escaped': escaped_final })
+            self._r_identifiers = r
+
+        return [self._unescape_identifier(i)
+                for i in [a or b for a, b in r.findall(identifiers)]]
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/sql/util.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/sql/util.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/sql/util.py (revision 3)
@@ -0,0 +1,556 @@
+from sqlalchemy import exc, schema, topological, util, sql
+from sqlalchemy.sql import expression, operators, visitors
+from itertools import chain
+
+"""Utility functions that build upon SQL and Schema constructs."""
+
+def sort_tables(tables):
+    """sort a collection of Table objects in order of their foreign-key dependency."""
+    
+    tables = list(tables)
+    tuples = []
+    def visit_foreign_key(fkey):
+        if fkey.use_alter:
+            return
+        parent_table = fkey.column.table
+        if parent_table in tables:
+            child_table = fkey.parent.table
+            tuples.append( ( parent_table, child_table ) )
+
+    for table in tables:
+        visitors.traverse(table, {'schema_visitor':True}, {'foreign_key':visit_foreign_key})    
+    return topological.sort(tuples, tables)
+
+def find_join_source(clauses, join_to):
+    """Given a list of FROM clauses and a selectable, 
+    return the first index and element from the list of 
+    clauses which can be joined against the selectable.  returns 
+    None, None if no match is found.
+    
+    e.g.::
+    
+        clause1 = table1.join(table2)
+        clause2 = table4.join(table5)
+        
+        join_to = table2.join(table3)
+        
+        find_join_source([clause1, clause2], join_to) == clause1
+    
+    """
+    
+    selectables = list(expression._from_objects(join_to))
+    for i, f in enumerate(clauses):
+        for s in selectables:
+            if f.is_derived_from(s):
+                return i, f
+    else:
+        return None, None
+
+    
+def find_tables(clause, check_columns=False, include_aliases=False, include_joins=False, include_selects=False):
+    """locate Table objects within the given expression."""
+    
+    tables = []
+    _visitors = {}
+    
+    if include_selects:
+        _visitors['select'] = _visitors['compound_select'] = tables.append
+    
+    if include_joins:
+        _visitors['join'] = tables.append
+        
+    if include_aliases:
+        _visitors['alias']  = tables.append
+
+    if check_columns:
+        def visit_column(column):
+            tables.append(column.table)
+        _visitors['column'] = visit_column
+
+    _visitors['table'] = tables.append
+
+    visitors.traverse(clause, {'column_collections':False}, _visitors)
+    return tables
+
+def find_columns(clause):
+    """locate Column objects within the given expression."""
+    
+    cols = util.column_set()
+    def visit_column(col):
+        cols.add(col)
+    visitors.traverse(clause, {}, {'column':visit_column})
+    return cols
+
+def join_condition(a, b, ignore_nonexistent_tables=False):
+    """create a join condition between two tables.
+    
+    ignore_nonexistent_tables=True allows a join condition to be
+    determined between two tables which may contain references to
+    other not-yet-defined tables.  In general the NoSuchTableError
+    raised is only required if the user is trying to join selectables
+    across multiple MetaData objects (which is an extremely rare use 
+    case).
+    
+    """
+    crit = []
+    constraints = set()
+    for fk in b.foreign_keys:
+        try:
+            col = fk.get_referent(a)
+        except exc.NoReferencedTableError:
+            if ignore_nonexistent_tables:
+                continue
+            else:
+                raise
+                
+        if col:
+            crit.append(col == fk.parent)
+            constraints.add(fk.constraint)
+    if a is not b:
+        for fk in a.foreign_keys:
+            try:
+                col = fk.get_referent(b)
+            except exc.NoReferencedTableError:
+                if ignore_nonexistent_tables:
+                    continue
+                else:
+                    raise
+
+            if col:
+                crit.append(col == fk.parent)
+                constraints.add(fk.constraint)
+
+    if len(crit) == 0:
+        raise exc.ArgumentError(
+            "Can't find any foreign key relationships "
+            "between '%s' and '%s'" % (a.description, b.description))
+    elif len(constraints) > 1:
+        raise exc.ArgumentError(
+            "Can't determine join between '%s' and '%s'; "
+            "tables have more than one foreign key "
+            "constraint relationship between them. "
+            "Please specify the 'onclause' of this "
+            "join explicitly." % (a.description, b.description))
+    elif len(crit) == 1:
+        return (crit[0])
+    else:
+        return sql.and_(*crit)
+
+
+class Annotated(object):
+    """clones a ClauseElement and applies an 'annotations' dictionary.
+    
+    Unlike regular clones, this clone also mimics __hash__() and 
+    __cmp__() of the original element so that it takes its place
+    in hashed collections.
+    
+    A reference to the original element is maintained, for the important
+    reason of keeping its hash value current.  When GC'ed, the 
+    hash value may be reused, causing conflicts.
+
+    """
+    
+    def __new__(cls, *args):
+        if not args:
+            # clone constructor
+            return object.__new__(cls)
+        else:
+            element, values = args
+            # pull appropriate subclass from registry of annotated
+            # classes
+            try:
+                cls = annotated_classes[element.__class__]
+            except KeyError:
+                cls = annotated_classes[element.__class__] = type.__new__(type, 
+                        "Annotated%s" % element.__class__.__name__, 
+                        (Annotated, element.__class__), {})
+            return object.__new__(cls)
+
+    def __init__(self, element, values):
+        # force FromClause to generate their internal 
+        # collections into __dict__
+        if isinstance(element, expression.FromClause):
+            element.c
+        
+        self.__dict__ = element.__dict__.copy()
+        self.__element = element
+        self._annotations = values
+
+    def _annotate(self, values):
+        _values = self._annotations.copy()
+        _values.update(values)
+        clone = self.__class__.__new__(self.__class__)
+        clone.__dict__ = self.__dict__.copy()
+        clone._annotations = _values
+        return clone
+    
+    def _deannotate(self):
+        return self.__element
+        
+    def _clone(self):
+        clone = self.__element._clone()
+        if clone is self.__element:
+            # detect immutable, don't change anything
+            return self
+        else:
+            # update the clone with any changes that have occured
+            # to this object's __dict__.
+            clone.__dict__.update(self.__dict__)
+            return Annotated(clone, self._annotations)
+    
+    def __hash__(self):
+        return hash(self.__element)
+
+    def __cmp__(self, other):
+        return cmp(hash(self.__element), hash(other))
+
+# hard-generate Annotated subclasses.  this technique
+# is used instead of on-the-fly types (i.e. type.__new__())
+# so that the resulting objects are pickleable.
+annotated_classes = {}
+
+from sqlalchemy.sql import expression
+for cls in expression.__dict__.values() + [schema.Column, schema.Table]:
+    if isinstance(cls, type) and issubclass(cls, expression.ClauseElement):
+        exec "class Annotated%s(Annotated, cls):\n" \
+             "    __visit_name__ = cls.__visit_name__\n"\
+             "    pass" % (cls.__name__, ) in locals()
+        exec "annotated_classes[cls] = Annotated%s" % (cls.__name__)
+
+def _deep_annotate(element, annotations, exclude=None):
+    """Deep copy the given ClauseElement, annotating each element with the given annotations dictionary.
+
+    Elements within the exclude collection will be cloned but not annotated.
+
+    """
+    def clone(elem):
+        # check if element is present in the exclude list.
+        # take into account proxying relationships.
+        if exclude and elem.proxy_set.intersection(exclude):
+            elem = elem._clone()
+        elif annotations != elem._annotations:
+            elem = elem._annotate(annotations.copy())
+        elem._copy_internals(clone=clone)
+        return elem
+
+    if element is not None:
+        element = clone(element)
+    return element
+
+def _deep_deannotate(element):
+    """Deep copy the given element, removing all annotations."""
+
+    def clone(elem):
+        elem = elem._deannotate()
+        elem._copy_internals(clone=clone)
+        return elem
+
+    if element is not None:
+        element = clone(element)
+    return element
+
+
+def splice_joins(left, right, stop_on=None):
+    if left is None:
+        return right
+        
+    stack = [(right, None)]
+
+    adapter = ClauseAdapter(left)
+    ret = None
+    while stack:
+        (right, prevright) = stack.pop()
+        if isinstance(right, expression.Join) and right is not stop_on:
+            right = right._clone()
+            right._reset_exported()
+            right.onclause = adapter.traverse(right.onclause)
+            stack.append((right.left, right))
+        else:
+            right = adapter.traverse(right)
+        if prevright:
+            prevright.left = right
+        if not ret:
+            ret = right
+
+    return ret
+    
+def reduce_columns(columns, *clauses, **kw):
+    """given a list of columns, return a 'reduced' set based on natural equivalents.
+
+    the set is reduced to the smallest list of columns which have no natural
+    equivalent present in the list.  A "natural equivalent" means that two columns
+    will ultimately represent the same value because they are related by a foreign key.
+
+    \*clauses is an optional list of join clauses which will be traversed
+    to further identify columns that are "equivalent".
+
+    \**kw may specify 'ignore_nonexistent_tables' to ignore foreign keys
+    whose tables are not yet configured.
+    
+    This function is primarily used to determine the most minimal "primary key"
+    from a selectable, by reducing the set of primary key columns present
+    in the the selectable to just those that are not repeated.
+
+    """
+    ignore_nonexistent_tables = kw.pop('ignore_nonexistent_tables', False)
+    
+    columns = util.ordered_column_set(columns)
+
+    omit = util.column_set()
+    for col in columns:
+        for fk in chain(*[c.foreign_keys for c in col.proxy_set]):
+            for c in columns:
+                if c is col:
+                    continue
+                try:
+                    fk_col = fk.column
+                except exc.NoReferencedTableError:
+                    if ignore_nonexistent_tables:
+                        continue
+                    else:
+                        raise
+                if fk_col.shares_lineage(c):
+                    omit.add(col)
+                    break
+
+    if clauses:
+        def visit_binary(binary):
+            if binary.operator == operators.eq:
+                cols = util.column_set(chain(*[c.proxy_set for c in columns.difference(omit)]))
+                if binary.left in cols and binary.right in cols:
+                    for c in columns:
+                        if c.shares_lineage(binary.right):
+                            omit.add(c)
+                            break
+        for clause in clauses:
+            visitors.traverse(clause, {}, {'binary':visit_binary})
+
+    return expression.ColumnSet(columns.difference(omit))
+
+def criterion_as_pairs(expression, consider_as_foreign_keys=None, consider_as_referenced_keys=None, any_operator=False):
+    """traverse an expression and locate binary criterion pairs."""
+    
+    if consider_as_foreign_keys and consider_as_referenced_keys:
+        raise exc.ArgumentError("Can only specify one of 'consider_as_foreign_keys' or 'consider_as_referenced_keys'")
+        
+    def visit_binary(binary):
+        if not any_operator and binary.operator is not operators.eq:
+            return
+        if not isinstance(binary.left, sql.ColumnElement) or not isinstance(binary.right, sql.ColumnElement):
+            return
+
+        if consider_as_foreign_keys:
+            if binary.left in consider_as_foreign_keys and (binary.right is binary.left or binary.right not in consider_as_foreign_keys):
+                pairs.append((binary.right, binary.left))
+            elif binary.right in consider_as_foreign_keys and (binary.left is binary.right or binary.left not in consider_as_foreign_keys):
+                pairs.append((binary.left, binary.right))
+        elif consider_as_referenced_keys:
+            if binary.left in consider_as_referenced_keys and (binary.right is binary.left or binary.right not in consider_as_referenced_keys):
+                pairs.append((binary.left, binary.right))
+            elif binary.right in consider_as_referenced_keys and (binary.left is binary.right or binary.left not in consider_as_referenced_keys):
+                pairs.append((binary.right, binary.left))
+        else:
+            if isinstance(binary.left, schema.Column) and isinstance(binary.right, schema.Column):
+                if binary.left.references(binary.right):
+                    pairs.append((binary.right, binary.left))
+                elif binary.right.references(binary.left):
+                    pairs.append((binary.left, binary.right))
+    pairs = []
+    visitors.traverse(expression, {}, {'binary':visit_binary})
+    return pairs
+
+def folded_equivalents(join, equivs=None):
+    """Return a list of uniquely named columns.
+    
+    The column list of the given Join will be narrowed 
+    down to a list of all equivalently-named,
+    equated columns folded into one column, where 'equated' means they are
+    equated to each other in the ON clause of this join.
+
+    This function is used by Join.select(fold_equivalents=True).
+    
+    Deprecated.   This function is used for a certain kind of 
+    "polymorphic_union" which is designed to achieve joined
+    table inheritance where the base table has no "discriminator"
+    column; [ticket:1131] will provide a better way to 
+    achieve this.
+
+    """
+    if equivs is None:
+        equivs = set()
+    def visit_binary(binary):
+        if binary.operator == operators.eq and binary.left.name == binary.right.name:
+            equivs.add(binary.right)
+            equivs.add(binary.left)
+    visitors.traverse(join.onclause, {}, {'binary':visit_binary})
+    collist = []
+    if isinstance(join.left, expression.Join):
+        left = folded_equivalents(join.left, equivs)
+    else:
+        left = list(join.left.columns)
+    if isinstance(join.right, expression.Join):
+        right = folded_equivalents(join.right, equivs)
+    else:
+        right = list(join.right.columns)
+    used = set()
+    for c in left + right:
+        if c in equivs:
+            if c.name not in used:
+                collist.append(c)
+                used.add(c.name)
+        else:
+            collist.append(c)
+    return collist
+
+class AliasedRow(object):
+    """Wrap a RowProxy with a translation map.
+    
+    This object allows a set of keys to be translated
+    to those present in a RowProxy.
+    
+    """
+    def __init__(self, row, map):
+        # AliasedRow objects don't nest, so un-nest
+        # if another AliasedRow was passed
+        if isinstance(row, AliasedRow):
+            self.row = row.row
+        else:
+            self.row = row
+        self.map = map
+        
+    def __contains__(self, key):
+        return self.map[key] in self.row
+
+    def has_key(self, key):
+        return key in self
+
+    def __getitem__(self, key):
+        return self.row[self.map[key]]
+
+    def keys(self):
+        return self.row.keys()
+
+
+class ClauseAdapter(visitors.ReplacingCloningVisitor):
+    """Clones and modifies clauses based on column correspondence.
+    
+    E.g.::
+
+      table1 = Table('sometable', metadata,
+          Column('col1', Integer),
+          Column('col2', Integer)
+          )
+      table2 = Table('someothertable', metadata,
+          Column('col1', Integer),
+          Column('col2', Integer)
+          )
+
+      condition = table1.c.col1 == table2.c.col1
+
+    make an alias of table1::
+
+      s = table1.alias('foo')
+
+    calling ``ClauseAdapter(s).traverse(condition)`` converts
+    condition to read::
+
+      s.c.col1 == table2.c.col1
+
+    """
+    def __init__(self, selectable, equivalents=None, include=None, exclude=None):
+        self.__traverse_options__ = {'column_collections':False, 'stop_on':[selectable]}
+        self.selectable = selectable
+        self.include = include
+        self.exclude = exclude
+        self.equivalents = util.column_dict(equivalents or {})
+        
+    def _corresponding_column(self, col, require_embedded, _seen=util.EMPTY_SET):
+        newcol = self.selectable.corresponding_column(col, require_embedded=require_embedded)
+
+        if not newcol and col in self.equivalents and col not in _seen:
+            for equiv in self.equivalents[col]:
+                newcol = self._corresponding_column(equiv, require_embedded=require_embedded, _seen=_seen.union([col]))
+                if newcol:
+                    return newcol
+        return newcol
+
+    def replace(self, col):
+        if isinstance(col, expression.FromClause):
+            if self.selectable.is_derived_from(col):
+                return self.selectable
+
+        if not isinstance(col, expression.ColumnElement):
+            return None
+
+        if self.include and col not in self.include:
+            return None
+        elif self.exclude and col in self.exclude:
+            return None
+
+        return self._corresponding_column(col, True)
+
+class ColumnAdapter(ClauseAdapter):
+    """Extends ClauseAdapter with extra utility functions.
+    
+    Provides the ability to "wrap" this ClauseAdapter 
+    around another, a columns dictionary which returns
+    cached, adapted elements given an original, and an 
+    adapted_row() factory.
+    
+    """
+    def __init__(self, selectable, equivalents=None, chain_to=None, include=None, exclude=None, adapt_required=False):
+        ClauseAdapter.__init__(self, selectable, equivalents, include, exclude)
+        if chain_to:
+            self.chain(chain_to)
+        self.columns = util.populate_column_dict(self._locate_col)
+        self.adapt_required = adapt_required
+
+    def wrap(self, adapter):
+        ac = self.__class__.__new__(self.__class__)
+        ac.__dict__ = self.__dict__.copy()
+        ac._locate_col = ac._wrap(ac._locate_col, adapter._locate_col)
+        ac.adapt_clause = ac._wrap(ac.adapt_clause, adapter.adapt_clause)
+        ac.adapt_list = ac._wrap(ac.adapt_list, adapter.adapt_list)
+        ac.columns = util.populate_column_dict(ac._locate_col)
+        return ac
+
+    adapt_clause = ClauseAdapter.traverse
+    adapt_list = ClauseAdapter.copy_and_process
+
+    def _wrap(self, local, wrapped):
+        def locate(col):
+            col = local(col)
+            return wrapped(col)
+        return locate
+
+    def _locate_col(self, col):
+        c = self._corresponding_column(col, False)
+        if not c:
+            c = self.adapt_clause(col)
+            
+            # anonymize labels in case they have a hardcoded name
+            if isinstance(c, expression._Label):
+                c = c.label(None)
+                
+        # adapt_required indicates that if we got the same column
+        # back which we put in (i.e. it passed through), 
+        # it's not correct.  this is used by eagerloading which
+        # knows that all columns and expressions need to be adapted
+        # to a result row, and a "passthrough" is definitely targeting
+        # the wrong column.
+        if self.adapt_required and c is col:
+            return None
+            
+        return c    
+
+    def adapted_row(self, row):
+        return AliasedRow(row, self.columns)
+    
+    def __getstate__(self):
+        d = self.__dict__.copy()
+        del d['columns']
+        return d
+        
+    def __setstate__(self, state):
+        self.__dict__.update(state)
+        self.columns = util.PopulateDict(self._locate_col)
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/sql/operators.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/sql/operators.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/sql/operators.py (revision 3)
@@ -0,0 +1,126 @@
+# This module is part of SQLAlchemy and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+"""Defines operators used in SQL expressions."""
+
+from operator import (
+    and_, or_, inv, add, mul, sub, div, mod, truediv, lt, le, ne, gt, ge, eq
+    )
+from sqlalchemy.util import symbol
+
+
+def from_():
+    raise NotImplementedError()
+
+def as_():
+    raise NotImplementedError()
+
+def exists():
+    raise NotImplementedError()
+
+def is_():
+    raise NotImplementedError()
+
+def isnot():
+    raise NotImplementedError()
+
+def collate():
+    raise NotImplementedError()
+
+def op(a, opstring, b):
+    return a.op(opstring)(b)
+
+def like_op(a, b, escape=None):
+    return a.like(b, escape=escape)
+
+def notlike_op(a, b, escape=None):
+    raise NotImplementedError()
+
+def ilike_op(a, b, escape=None):
+    return a.ilike(b, escape=escape)
+
+def notilike_op(a, b, escape=None):
+    raise NotImplementedError()
+
+def between_op(a, b, c):
+    return a.between(b, c)
+
+def in_op(a, b):
+    return a.in_(b)
+
+def notin_op(a, b):
+    raise NotImplementedError()
+
+def distinct_op(a):
+    return a.distinct()
+
+def startswith_op(a, b, escape=None):
+    return a.startswith(b, escape=escape)
+
+def endswith_op(a, b, escape=None):
+    return a.endswith(b, escape=escape)
+
+def contains_op(a, b, escape=None):
+    return a.contains(b, escape=escape)
+
+def match_op(a, b):
+    return a.match(b)
+
+def comma_op(a, b):
+    raise NotImplementedError()
+
+def concat_op(a, b):
+    return a.concat(b)
+
+def desc_op(a):
+    return a.desc()
+
+def asc_op(a):
+    return a.asc()
+
+_commutative = set([eq, ne, add, mul])
+def is_commutative(op):
+    return op in _commutative
+
+_smallest = symbol('_smallest')
+_largest = symbol('_largest')
+
+_PRECEDENCE = {
+    from_: 15,
+    mul: 7,
+    div: 7,
+    mod: 7,
+    add: 6,
+    sub: 6,
+    concat_op: 6,
+    match_op: 6,
+    ilike_op: 5,
+    notilike_op: 5,
+    like_op: 5,
+    notlike_op: 5,
+    in_op: 5,
+    notin_op: 5,
+    is_: 5,
+    isnot: 5,
+    eq: 5,
+    ne: 5,
+    gt: 5,
+    lt: 5,
+    ge: 5,
+    le: 5,
+    between_op: 5,
+    distinct_op: 5,
+    inv: 5,
+    and_: 3,
+    or_: 2,
+    comma_op: -1,
+    collate: 7,
+    as_: -1,
+    exists: 0,
+    _smallest: -1000,
+    _largest: 1000
+}
+
+def is_precedent(operator, against):
+    return (_PRECEDENCE.get(operator, _PRECEDENCE[_smallest]) <=
+            _PRECEDENCE.get(against, _PRECEDENCE[_largest]))
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/sql/__init__.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/sql/__init__.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/sql/__init__.py (revision 3)
@@ -0,0 +1,57 @@
+from sqlalchemy.sql.expression import (
+    Alias,
+    ClauseElement,
+    ColumnCollection,
+    ColumnElement,
+    CompoundSelect,
+    Delete,
+    FromClause,
+    Insert,
+    Join,
+    Select,
+    Selectable,
+    TableClause,
+    Update,
+    alias,
+    and_,
+    asc,
+    between,
+    bindparam,
+    case,
+    cast,
+    collate,
+    column,
+    delete,
+    desc,
+    distinct,
+    except_,
+    except_all,
+    exists,
+    extract,
+    func,
+    insert,
+    intersect,
+    intersect_all,
+    join,
+    label,
+    literal,
+    literal_column,
+    modifier,
+    not_,
+    null,
+    or_,
+    outerjoin,
+    outparam,
+    select,
+    subquery,
+    table,
+    text,
+    union,
+    union_all,
+    update,
+    )
+
+from sqlalchemy.sql.visitors import ClauseVisitor
+
+__tmp = locals().keys()
+__all__ = sorted([i for i in __tmp if not i.startswith('__')])
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/sql/expression.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/sql/expression.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/sql/expression.py (revision 3)
@@ -0,0 +1,3777 @@
+# expression.py
+# Copyright (C) 2005, 2006, 2007, 2008, 2009 Michael Bayer mike_mp@zzzcomputing.com
+#
+# This module is part of SQLAlchemy and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+"""Defines the base components of SQL expression trees.
+
+All components are derived from a common base class
+:class:`~sqlalchemy.sql.expression.ClauseElement`.  Common behaviors are organized
+based on class hierarchies, in some cases via mixins.
+
+All object construction from this package occurs via functions which
+in some cases will construct composite ``ClauseElement`` structures
+together, and in other cases simply return a single ``ClauseElement``
+constructed directly.  The function interface affords a more "DSL-ish"
+feel to constructing SQL expressions and also allows future class
+reorganizations.
+
+Even though classes are not constructed directly from the outside,
+most classes which have additional public methods are considered to be
+public (i.e. have no leading underscore).  Other classes which are
+"semi-public" are marked with a single leading underscore; these
+classes usually have few or no public methods and are less guaranteed
+to stay the same in future releases.
+
+"""
+
+import itertools, re
+from operator import attrgetter
+
+from sqlalchemy import util, exc
+from sqlalchemy.sql import operators
+from sqlalchemy.sql.visitors import Visitable, cloned_traverse
+from sqlalchemy import types as sqltypes
+import operator
+
+functions, schema, sql_util = None, None, None
+DefaultDialect, ClauseAdapter, Annotated = None, None, None
+
+__all__ = [
+    'Alias', 'ClauseElement',
+    'ColumnCollection', 'ColumnElement',
+    'CompoundSelect', 'Delete', 'FromClause', 'Insert', 'Join',
+    'Select', 'Selectable', 'TableClause', 'Update', 'alias', 'and_', 'asc',
+    'between', 'bindparam', 'case', 'cast', 'column', 'delete',
+    'desc', 'distinct', 'except_', 'except_all', 'exists', 'extract', 'func',
+    'modifier', 'collate',
+    'insert', 'intersect', 'intersect_all', 'join', 'label', 'literal',
+    'literal_column', 'not_', 'null', 'or_', 'outparam', 'outerjoin', 'select',
+    'subquery', 'table', 'text', 'union', 'union_all', 'update', ]
+
+
+
+def desc(column):
+    """Return a descending ``ORDER BY`` clause element.
+
+    e.g.::
+
+      order_by = [desc(table1.mycol)]
+
+    """
+    return _UnaryExpression(column, modifier=operators.desc_op)
+
+def asc(column):
+    """Return an ascending ``ORDER BY`` clause element.
+
+    e.g.::
+
+      order_by = [asc(table1.mycol)]
+
+    """
+    return _UnaryExpression(column, modifier=operators.asc_op)
+
+def outerjoin(left, right, onclause=None):
+    """Return an ``OUTER JOIN`` clause element.
+
+    The returned object is an instance of :class:`~sqlalchemy.sql.expression.Join`.
+
+    Similar functionality is also available via the ``outerjoin()``
+    method on any :class:`~sqlalchemy.sql.expression.FromClause`.
+
+    left
+      The left side of the join.
+
+    right
+      The right side of the join.
+
+    onclause
+      Optional criterion for the ``ON`` clause, is derived from
+      foreign key relationships established between left and right
+      otherwise.
+
+    To chain joins together, use the ``join()`` or ``outerjoin()``
+    methods on the resulting ``Join`` object.
+
+    """
+    return Join(left, right, onclause, isouter=True)
+
+def join(left, right, onclause=None, isouter=False):
+    """Return a ``JOIN`` clause element (regular inner join).
+
+    The returned object is an instance of :class:`~sqlalchemy.sql.expression.Join`.
+
+    Similar functionality is also available via the ``join()`` method
+    on any :class:`~sqlalchemy.sql.expression.FromClause`.
+
+    left
+      The left side of the join.
+
+    right
+      The right side of the join.
+
+    onclause
+      Optional criterion for the ``ON`` clause, is derived from
+      foreign key relationships established between left and right
+      otherwise.
+
+    To chain joins together, use the ``join()`` or ``outerjoin()``
+    methods on the resulting ``Join`` object.
+
+    """
+    return Join(left, right, onclause, isouter)
+
+def select(columns=None, whereclause=None, from_obj=[], **kwargs):
+    """Returns a ``SELECT`` clause element.
+
+    Similar functionality is also available via the ``select()``
+    method on any :class:`~sqlalchemy.sql.expression.FromClause`.
+
+    The returned object is an instance of :class:`~sqlalchemy.sql.expression.Select`.
+
+    All arguments which accept ``ClauseElement`` arguments also accept
+    string arguments, which will be converted as appropriate into
+    either ``text()`` or ``literal_column()`` constructs.
+
+    columns
+      A list of ``ClauseElement`` objects, typically ``ColumnElement``
+      objects or subclasses, which will form the columns clause of the
+      resulting statement.  For all members which are instances of
+      ``Selectable``, the individual ``ColumnElement`` members of the
+      ``Selectable`` will be added individually to the columns clause.
+      For example, specifying a ``Table`` instance will result in all
+      the contained ``Column`` objects within to be added to the
+      columns clause.
+
+      This argument is not present on the form of ``select()``
+      available on ``Table``.
+
+    whereclause
+      A ``ClauseElement`` expression which will be used to form the
+      ``WHERE`` clause.
+
+    from_obj
+      A list of ``ClauseElement`` objects which will be added to the
+      ``FROM`` clause of the resulting statement.  Note that "from"
+      objects are automatically located within the columns and
+      whereclause ClauseElements.  Use this parameter to explicitly
+      specify "from" objects which are not automatically locatable.
+      This could include ``Table`` objects that aren't otherwise
+      present, or ``Join`` objects whose presence will supercede that
+      of the ``Table`` objects already located in the other clauses.
+
+    \**kwargs
+      Additional parameters include:
+
+      autocommit
+        indicates this SELECT statement modifies the database, and
+        should be subject to autocommit behavior if no transaction
+        has been started.
+
+      prefixes
+        a list of strings or ``ClauseElement`` objects to include
+        directly after the SELECT keyword in the generated statement,
+        for dialect-specific query features.
+
+      distinct=False
+        when ``True``, applies a ``DISTINCT`` qualifier to the columns
+        clause of the resulting statement.
+
+      use_labels=False
+        when ``True``, the statement will be generated using labels
+        for each column in the columns clause, which qualify each
+        column with its parent table's (or aliases) name so that name
+        conflicts between columns in different tables don't occur.
+        The format of the label is <tablename>_<column>.  The "c"
+        collection of the resulting ``Select`` object will use these
+        names as well for targeting column members.
+
+      for_update=False
+        when ``True``, applies ``FOR UPDATE`` to the end of the
+        resulting statement.  Certain database dialects also support
+        alternate values for this parameter, for example mysql
+        supports "read" which translates to ``LOCK IN SHARE MODE``,
+        and oracle supports "nowait" which translates to ``FOR UPDATE
+        NOWAIT``.
+
+      correlate=True
+        indicates that this ``Select`` object should have its
+        contained ``FromClause`` elements "correlated" to an enclosing
+        ``Select`` object.  This means that any ``ClauseElement``
+        instance within the "froms" collection of this ``Select``
+        which is also present in the "froms" collection of an
+        enclosing select will not be rendered in the ``FROM`` clause
+        of this select statement.
+
+      group_by
+        a list of ``ClauseElement`` objects which will comprise the
+        ``GROUP BY`` clause of the resulting select.
+
+      having
+        a ``ClauseElement`` that will comprise the ``HAVING`` clause
+        of the resulting select when ``GROUP BY`` is used.
+
+      order_by
+        a scalar or list of ``ClauseElement`` objects which will
+        comprise the ``ORDER BY`` clause of the resulting select.
+
+      limit=None
+        a numerical value which usually compiles to a ``LIMIT``
+        expression in the resulting select.  Databases that don't
+        support ``LIMIT`` will attempt to provide similar
+        functionality.
+
+      offset=None
+        a numeric value which usually compiles to an ``OFFSET``
+        expression in the resulting select.  Databases that don't
+        support ``OFFSET`` will attempt to provide similar
+        functionality.
+
+      bind=None
+        an ``Engine`` or ``Connection`` instance to which the
+        resulting ``Select ` object will be bound.  The ``Select``
+        object will otherwise automatically bind to whatever
+        ``Connectable`` instances can be located within its contained
+        ``ClauseElement`` members.
+
+      scalar=False
+        deprecated.  Use select(...).as_scalar() to create a "scalar
+        column" proxy for an existing Select object.
+
+    """
+    if 'scalar' in kwargs:
+        util.warn_deprecated('scalar option is deprecated; see docs for details')
+    scalar = kwargs.pop('scalar', False)
+    s = Select(columns, whereclause=whereclause, from_obj=from_obj, **kwargs)
+    if scalar:
+        return s.as_scalar()
+    else:
+        return s
+
+def subquery(alias, *args, **kwargs):
+    """Return an :class:`~sqlalchemy.sql.expression.Alias` object derived from a :class:`~sqlalchemy.sql.expression.Select`.
+
+    name
+      alias name
+
+    \*args, \**kwargs
+
+      all other arguments are delivered to the :func:`~sqlalchemy.sql.expression.select`
+      function.
+
+    """
+    return Select(*args, **kwargs).alias(alias)
+
+def insert(table, values=None, inline=False, **kwargs):
+    """Return an :class:`~sqlalchemy.sql.expression.Insert` clause element.
+
+    Similar functionality is available via the ``insert()`` method on
+    :class:`~sqlalchemy.schema.Table`.
+
+    :param table: The table to be inserted into.
+
+    :param values: A dictionary which specifies the column specifications of the
+      ``INSERT``, and is optional.  If left as None, the column
+      specifications are determined from the bind parameters used
+      during the compile phase of the ``INSERT`` statement.  If the
+      bind parameters also are None during the compile phase, then the
+      column specifications will be generated from the full list of
+      table columns.  Note that the :meth:`~Insert.values()` generative method
+      may also be used for this.
+
+    :param prefixes: A list of modifier keywords to be inserted between INSERT and INTO.
+      Alternatively, the :meth:`~Insert.prefix_with` generative method may be used.
+
+    :param inline:
+      if True, SQL defaults will be compiled 'inline' into the statement
+      and not pre-executed.
+
+    If both `values` and compile-time bind parameters are present, the
+    compile-time bind parameters override the information specified
+    within `values` on a per-key basis.
+
+    The keys within `values` can be either ``Column`` objects or their
+    string identifiers.  Each key may reference one of:
+
+    * a literal data value (i.e. string, number, etc.);
+    * a Column object;
+    * a SELECT statement.
+
+    If a ``SELECT`` statement is specified which references this
+    ``INSERT`` statement's table, the statement will be correlated
+    against the ``INSERT`` statement.
+
+    """
+    return Insert(table, values, inline=inline, **kwargs)
+
+def update(table, whereclause=None, values=None, inline=False, **kwargs):
+    """Return an :class:`~sqlalchemy.sql.expression.Update` clause element.
+
+    Similar functionality is available via the ``update()`` method on
+    :class:`~sqlalchemy.schema.Table`.
+
+    :param table: The table to be updated.
+
+    :param whereclause: A ``ClauseElement`` describing the ``WHERE`` condition of the
+      ``UPDATE`` statement.  Note that the :meth:`~Update.where()` generative
+      method may also be used for this.
+
+    :param values:
+      A dictionary which specifies the ``SET`` conditions of the
+      ``UPDATE``, and is optional. If left as None, the ``SET``
+      conditions are determined from the bind parameters used during
+      the compile phase of the ``UPDATE`` statement.  If the bind
+      parameters also are None during the compile phase, then the
+      ``SET`` conditions will be generated from the full list of table
+      columns.  Note that the :meth:`~Update.values()` generative method may
+      also be used for this.
+
+    :param inline:
+      if True, SQL defaults will be compiled 'inline' into the statement
+      and not pre-executed.
+
+    If both `values` and compile-time bind parameters are present, the
+    compile-time bind parameters override the information specified
+    within `values` on a per-key basis.
+
+    The keys within `values` can be either ``Column`` objects or their
+    string identifiers. Each key may reference one of:
+
+    * a literal data value (i.e. string, number, etc.);
+    * a Column object;
+    * a SELECT statement.
+
+    If a ``SELECT`` statement is specified which references this
+    ``UPDATE`` statement's table, the statement will be correlated
+    against the ``UPDATE`` statement.
+
+    """
+    return Update(table, whereclause=whereclause, values=values, inline=inline, **kwargs)
+
+def delete(table, whereclause = None, **kwargs):
+    """Return a :class:`~sqlalchemy.sql.expression.Delete` clause element.
+
+    Similar functionality is available via the ``delete()`` method on
+    :class:`~sqlalchemy.schema.Table`.
+
+    :param table: The table to be updated.
+
+    :param whereclause: A :class:`ClauseElement` describing the ``WHERE`` condition of the
+      ``UPDATE`` statement.  Note that the :meth:`~Delete.where()` generative method
+      may be used instead.
+
+    """
+    return Delete(table, whereclause, **kwargs)
+
+def and_(*clauses):
+    """Join a list of clauses together using the ``AND`` operator.
+
+    The ``&`` operator is also overloaded on all
+    :class:`~sqlalchemy.sql.expression._CompareMixin` subclasses to produce the same
+    result.
+
+    """
+    if len(clauses) == 1:
+        return clauses[0]
+    return BooleanClauseList(operator=operators.and_, *clauses)
+
+def or_(*clauses):
+    """Join a list of clauses together using the ``OR`` operator.
+
+    The ``|`` operator is also overloaded on all
+    :class:`~sqlalchemy.sql.expression._CompareMixin` subclasses to produce the same
+    result.
+
+    """
+    if len(clauses) == 1:
+        return clauses[0]
+    return BooleanClauseList(operator=operators.or_, *clauses)
+
+def not_(clause):
+    """Return a negation of the given clause, i.e. ``NOT(clause)``.
+
+    The ``~`` operator is also overloaded on all
+    :class:`~sqlalchemy.sql.expression._CompareMixin` subclasses to produce the same
+    result.
+
+    """
+    return operators.inv(_literal_as_binds(clause))
+
+def distinct(expr):
+    """Return a ``DISTINCT`` clause."""
+    expr = _literal_as_binds(expr)
+    return _UnaryExpression(expr, operator=operators.distinct_op, type_=expr.type)
+
+def between(ctest, cleft, cright):
+    """Return a ``BETWEEN`` predicate clause.
+
+    Equivalent of SQL ``clausetest BETWEEN clauseleft AND clauseright``.
+
+    The ``between()`` method on all :class:`~sqlalchemy.sql.expression._CompareMixin` subclasses
+    provides similar functionality.
+
+    """
+    ctest = _literal_as_binds(ctest)
+    return _BinaryExpression(
+        ctest,
+        ClauseList(
+            _literal_as_binds(cleft, type_=ctest.type),
+            _literal_as_binds(cright, type_=ctest.type),
+            operator=operators.and_,
+            group=False),
+        operators.between_op)
+
+
+def case(whens, value=None, else_=None):
+    """Produce a ``CASE`` statement.
+
+    whens
+      A sequence of pairs, or alternatively a dict,
+      to be translated into "WHEN / THEN" clauses.
+
+    value
+      Optional for simple case statements, produces
+      a column expression as in "CASE <expr> WHEN ..."
+
+    else\_
+      Optional as well, for case defaults produces
+      the "ELSE" portion of the "CASE" statement.
+
+    The expressions used for THEN and ELSE,
+    when specified as strings, will be interpreted
+    as bound values. To specify textual SQL expressions
+    for these, use the text(<string>) construct.
+
+    The expressions used for the WHEN criterion
+    may only be literal strings when "value" is
+    present, i.e. CASE table.somecol WHEN "x" THEN "y".
+    Otherwise, literal strings are not accepted
+    in this position, and either the text(<string>)
+    or literal(<string>) constructs must be used to
+    interpret raw string values.
+
+    Usage examples::
+
+      case([(orderline.c.qty > 100, item.c.specialprice),
+            (orderline.c.qty > 10, item.c.bulkprice)
+          ], else_=item.c.regularprice)
+      case(value=emp.c.type, whens={
+              'engineer': emp.c.salary * 1.1,
+              'manager':  emp.c.salary * 3,
+          })
+
+    """
+    
+    return _Case(whens, value=value, else_=else_)
+
+def cast(clause, totype, **kwargs):
+    """Return a ``CAST`` function.
+
+    Equivalent of SQL ``CAST(clause AS totype)``.
+
+    Use with a :class:`~sqlalchemy.types.TypeEngine` subclass, i.e::
+
+      cast(table.c.unit_price * table.c.qty, Numeric(10,4))
+
+    or::
+
+      cast(table.c.timestamp, DATE)
+
+    """
+    return _Cast(clause, totype, **kwargs)
+
+def extract(field, expr):
+    """Return the clause ``extract(field FROM expr)``."""
+
+    return _Extract(field, expr)
+
+def collate(expression, collation):
+    """Return the clause ``expression COLLATE collation``."""
+
+    expr = _literal_as_binds(expression)
+    return _BinaryExpression(
+        expr, 
+        _literal_as_text(collation), 
+        operators.collate, type_=expr.type)
+
+def exists(*args, **kwargs):
+    """Return an ``EXISTS`` clause as applied to a :class:`~sqlalchemy.sql.expression.Select` object.
+
+    Calling styles are of the following forms::
+
+        # use on an existing select()
+        s = select([table.c.col1]).where(table.c.col2==5)
+        s = exists(s)
+
+        # construct a select() at once
+        exists(['*'], **select_arguments).where(criterion)
+
+        # columns argument is optional, generates "EXISTS (SELECT *)"
+        # by default.
+        exists().where(table.c.col2==5)
+
+    """
+    return _Exists(*args, **kwargs)
+
+def union(*selects, **kwargs):
+    """Return a ``UNION`` of multiple selectables.
+
+    The returned object is an instance of :class:`~sqlalchemy.sql.expression.CompoundSelect`.
+
+    A similar ``union()`` method is available on all
+    :class:`~sqlalchemy.sql.expression.FromClause` subclasses.
+
+    \*selects
+      a list of :class:`~sqlalchemy.sql.expression.Select` instances.
+
+    \**kwargs
+       available keyword arguments are the same as those of
+       :func:`~sqlalchemy.sql.expression.select`.
+
+    """
+    return _compound_select('UNION', *selects, **kwargs)
+
+def union_all(*selects, **kwargs):
+    """Return a ``UNION ALL`` of multiple selectables.
+
+    The returned object is an instance of :class:`~sqlalchemy.sql.expression.CompoundSelect`.
+
+    A similar ``union_all()`` method is available on all
+    :class:`~sqlalchemy.sql.expression.FromClause` subclasses.
+
+    \*selects
+      a list of :class:`~sqlalchemy.sql.expression.Select` instances.
+
+    \**kwargs
+      available keyword arguments are the same as those of
+      :func:`~sqlalchemy.sql.expression.select`.
+
+    """
+    return _compound_select('UNION ALL', *selects, **kwargs)
+
+def except_(*selects, **kwargs):
+    """Return an ``EXCEPT`` of multiple selectables.
+
+    The returned object is an instance of :class:`~sqlalchemy.sql.expression.CompoundSelect`.
+
+    \*selects
+      a list of :class:`~sqlalchemy.sql.expression.Select` instances.
+
+    \**kwargs
+      available keyword arguments are the same as those of
+      :func:`~sqlalchemy.sql.expression.select`.
+
+    """
+    return _compound_select('EXCEPT', *selects, **kwargs)
+
+def except_all(*selects, **kwargs):
+    """Return an ``EXCEPT ALL`` of multiple selectables.
+
+    The returned object is an instance of :class:`~sqlalchemy.sql.expression.CompoundSelect`.
+
+    \*selects
+      a list of :class:`~sqlalchemy.sql.expression.Select` instances.
+
+    \**kwargs
+      available keyword arguments are the same as those of
+      :func:`~sqlalchemy.sql.expression.select`.
+
+    """
+    return _compound_select('EXCEPT ALL', *selects, **kwargs)
+
+def intersect(*selects, **kwargs):
+    """Return an ``INTERSECT`` of multiple selectables.
+
+    The returned object is an instance of :class:`~sqlalchemy.sql.expression.CompoundSelect`.
+
+    \*selects
+      a list of :class:`~sqlalchemy.sql.expression.Select` instances.
+
+    \**kwargs
+      available keyword arguments are the same as those of
+      :func:`~sqlalchemy.sql.expression.select`.
+
+    """
+    return _compound_select('INTERSECT', *selects, **kwargs)
+
+def intersect_all(*selects, **kwargs):
+    """Return an ``INTERSECT ALL`` of multiple selectables.
+
+    The returned object is an instance of :class:`~sqlalchemy.sql.expression.CompoundSelect`.
+
+    \*selects
+      a list of :class:`~sqlalchemy.sql.expression.Select` instances.
+
+    \**kwargs
+      available keyword arguments are the same as those of
+      :func:`~sqlalchemy.sql.expression.select`.
+
+    """
+    return _compound_select('INTERSECT ALL', *selects, **kwargs)
+
+def alias(selectable, alias=None):
+    """Return an :class:`~sqlalchemy.sql.expression.Alias` object.
+
+    An ``Alias`` represents any :class:`~sqlalchemy.sql.expression.FromClause` with
+    an alternate name assigned within SQL, typically using the ``AS``
+    clause when generated, e.g. ``SELECT * FROM table AS aliasname``.
+
+    Similar functionality is available via the ``alias()`` method
+    available on all ``FromClause`` subclasses.
+
+      selectable
+        any ``FromClause`` subclass, such as a table, select
+        statement, etc..
+
+      alias
+        string name to be assigned as the alias.  If ``None``, a
+        random name will be generated.
+
+    """
+    return Alias(selectable, alias=alias)
+
+
+def literal(value, type_=None):
+    """Return a literal clause, bound to a bind parameter.
+
+    Literal clauses are created automatically when non-
+    ``ClauseElement`` objects (such as strings, ints, dates, etc.) are
+    used in a comparison operation with a
+    :class:`~sqlalchemy.sql.expression._CompareMixin` subclass, such as a ``Column``
+    object.  Use this function to force the generation of a literal
+    clause, which will be created as a
+    :class:`~sqlalchemy.sql.expression._BindParamClause` with a bound value.
+
+    value
+      the value to be bound.  Can be any Python object supported by
+      the underlying DB-API, or is translatable via the given type
+      argument.
+
+    type\_
+      an optional :class:`~sqlalchemy.types.TypeEngine` which will provide
+      bind-parameter translation for this literal.
+
+    """
+    return _BindParamClause(None, value, type_=type_, unique=True)
+
+def label(name, obj):
+    """Return a :class:`~sqlalchemy.sql.expression._Label` object for the given :class:`~sqlalchemy.sql.expression.ColumnElement`.
+
+    A label changes the name of an element in the columns clause of a
+    ``SELECT`` statement, typically via the ``AS`` SQL keyword.
+
+    This functionality is more conveniently available via the
+    ``label()`` method on ``ColumnElement``.
+
+    name
+      label name
+
+    obj
+      a ``ColumnElement``.
+
+    """
+    return _Label(name, obj)
+
+def column(text, type_=None):
+    """Return a textual column clause, as would be in the columns clause of a ``SELECT`` statement.
+
+    The object returned is an instance of :class:`~sqlalchemy.sql.expression.ColumnClause`,
+    which represents the "syntactical" portion of the schema-level
+    :class:`~sqlalchemy.schema.Column` object.
+
+    text
+      the name of the column.  Quoting rules will be applied to the
+      clause like any other column name.  For textual column
+      constructs that are not to be quoted, use the
+      :func:`~sqlalchemy.sql.expression.literal_column` function.
+
+    type\_
+      an optional :class:`~sqlalchemy.types.TypeEngine` object which will
+      provide result-set translation for this column.
+
+    """
+    return ColumnClause(text, type_=type_)
+
+def literal_column(text, type_=None):
+    """Return a textual column expression, as would be in the columns
+    clause of a ``SELECT`` statement.
+
+    The object returned supports further expressions in the same way as any
+    other column object, including comparison, math and string operations.
+    The type\_ parameter is important to determine proper expression behavior
+    (such as, '+' means string concatenation or numerical addition based on
+    the type).
+
+    text
+      the text of the expression; can be any SQL expression.  Quoting rules
+      will not be applied.  To specify a column-name expression which should
+      be subject to quoting rules, use the
+      :func:`~sqlalchemy.sql.expression.column` function.
+
+    type\_
+      an optional :class:`~sqlalchemy.types.TypeEngine` object which will provide
+      result-set translation and additional expression semantics for this
+      column.  If left as None the type will be NullType.
+
+    """
+    return ColumnClause(text, type_=type_, is_literal=True)
+
+def table(name, *columns):
+    """Return a :class:`~sqlalchemy.sql.expression.TableClause` object.
+
+    This is a primitive version of the :class:`~sqlalchemy.schema.Table` object,
+    which is a subclass of this object.
+
+    """
+    return TableClause(name, *columns)
+
+def bindparam(key, value=None, shortname=None, type_=None, unique=False):
+    """Create a bind parameter clause with the given key.
+
+    value
+      a default value for this bind parameter.  a bindparam with a
+      value is called a ``value-based bindparam``.
+
+    type\_
+      a sqlalchemy.types.TypeEngine object indicating the type of this
+      bind param, will invoke type-specific bind parameter processing
+
+    shortname
+      deprecated.
+
+    unique
+      if True, bind params sharing the same name will have their
+      underlying ``key`` modified to a uniquely generated name.
+      mostly useful with value-based bind params.
+
+    """
+    if isinstance(key, ColumnClause):
+        return _BindParamClause(key.name, value, type_=key.type, unique=unique, shortname=shortname)
+    else:
+        return _BindParamClause(key, value, type_=type_, unique=unique, shortname=shortname)
+
+def outparam(key, type_=None):
+    """Create an 'OUT' parameter for usage in functions (stored procedures), for databases which support them.
+
+    The ``outparam`` can be used like a regular function parameter.
+    The "output" value will be available from the
+    :class:`~sqlalchemy.engine.ResultProxy` object via its ``out_parameters``
+    attribute, which returns a dictionary containing the values.
+
+    """
+    return _BindParamClause(key, None, type_=type_, unique=False, isoutparam=True)
+
+def text(text, bind=None, *args, **kwargs):
+    """Create literal text to be inserted into a query.
+
+    When constructing a query from a ``select()``, ``update()``,
+    ``insert()`` or ``delete()``, using plain strings for argument
+    values will usually result in text objects being created
+    automatically.  Use this function when creating textual clauses
+    outside of other ``ClauseElement`` objects, or optionally wherever
+    plain text is to be used.
+
+    text
+      the text of the SQL statement to be created.  use ``:<param>``
+      to specify bind parameters; they will be compiled to their
+      engine-specific format.
+
+    bind
+      an optional connection or engine to be used for this text query.
+
+    autocommit=True
+      indicates this SELECT statement modifies the database, and
+      should be subject to autocommit behavior if no transaction
+      has been started.
+
+    bindparams
+      a list of ``bindparam()`` instances which can be used to define
+      the types and/or initial values for the bind parameters within
+      the textual statement; the keynames of the bindparams must match
+      those within the text of the statement.  The types will be used
+      for pre-processing on bind values.
+
+    typemap
+      a dictionary mapping the names of columns represented in the
+      ``SELECT`` clause of the textual statement to type objects,
+      which will be used to perform post-processing on columns within
+      the result set (for textual statements that produce result
+      sets).
+
+    """
+    return _TextClause(text, bind=bind, *args, **kwargs)
+
+def null():
+    """Return a :class:`_Null` object, which compiles to ``NULL`` in a sql statement."""
+
+    return _Null()
+
+class _FunctionGenerator(object):
+    """Generate :class:`Function` objects based on getattr calls."""
+
+    def __init__(self, **opts):
+        self.__names = []
+        self.opts = opts
+
+    def __getattr__(self, name):
+        # passthru __ attributes; fixes pydoc
+        if name.startswith('__'):
+            try:
+                return self.__dict__[name]
+            except KeyError:
+                raise AttributeError(name)
+
+        elif name.endswith('_'):
+            name = name[0:-1]
+        f = _FunctionGenerator(**self.opts)
+        f.__names = list(self.__names) + [name]
+        return f
+
+    def __call__(self, *c, **kwargs):
+        o = self.opts.copy()
+        o.update(kwargs)
+        if len(self.__names) == 1:
+            global functions
+            if functions is None:
+                from sqlalchemy.sql import functions
+            func = getattr(functions, self.__names[-1].lower(), None)
+            if func is not None:
+                return func(*c, **o)
+
+        return Function(self.__names[-1], packagenames=self.__names[0:-1], *c, **o)
+
+# "func" global - i.e. func.count()
+func = _FunctionGenerator()
+
+# "modifier" global - i.e. modifier.distinct
+# TODO: use UnaryExpression for this instead ?
+modifier = _FunctionGenerator(group=False)
+
+class _generated_label(unicode):
+    """A unicode subclass used to identify dynamically generated names."""
+
+def _escape_for_generated(x):
+    if isinstance(x, _generated_label):
+        return x
+    else:
+        return x.replace('%', '%%')
+        
+def _clone(element):
+    return element._clone()
+
+def _expand_cloned(elements):
+    """expand the given set of ClauseElements to be the set of all 'cloned' predecessors."""
+
+    return itertools.chain(*[x._cloned_set for x in elements])
+
+def _cloned_intersection(a, b):
+    """return the intersection of sets a and b, counting
+    any overlap between 'cloned' predecessors.
+
+    The returned set is in terms of the enties present within 'a'.
+
+    """
+    all_overlap = set(_expand_cloned(a)).intersection(_expand_cloned(b))
+    return set(elem for elem in a if all_overlap.intersection(elem._cloned_set))
+
+def _compound_select(keyword, *selects, **kwargs):
+    return CompoundSelect(keyword, *selects, **kwargs)
+
+def _is_literal(element):
+    return not isinstance(element, Visitable) and not hasattr(element, '__clause_element__')
+
+def _from_objects(*elements):
+    return itertools.chain(*[element._from_objects for element in elements])
+
+def _labeled(element):
+    if not hasattr(element, 'name'):
+        return element.label(None)
+    else:
+        return element
+
+def _column_as_key(element):
+    if isinstance(element, basestring):
+        return element
+    if hasattr(element, '__clause_element__'):
+        element = element.__clause_element__()
+    return element.key
+    
+def _literal_as_text(element):
+    if hasattr(element, '__clause_element__'):
+        return element.__clause_element__()
+    elif not isinstance(element, Visitable):
+        return _TextClause(unicode(element))
+    else:
+        return element
+
+def _clause_element_as_expr(element):
+    if hasattr(element, '__clause_element__'):
+        return element.__clause_element__()
+    else:
+        return element
+        
+def _literal_as_column(element):
+    if hasattr(element, '__clause_element__'):
+        return element.__clause_element__()
+    elif not isinstance(element, Visitable):
+        return literal_column(str(element))
+    else:
+        return element
+
+def _literal_as_binds(element, name=None, type_=None):
+    if hasattr(element, '__clause_element__'):
+        return element.__clause_element__()
+    elif not isinstance(element, Visitable):
+        if element is None:
+            return null()
+        else:
+            return _BindParamClause(name, element, type_=type_, unique=True)
+    else:
+        return element
+
+def _no_literals(element):
+    if hasattr(element, '__clause_element__'):
+        return element.__clause_element__()
+    elif not isinstance(element, Visitable):
+        raise exc.ArgumentError("Ambiguous literal: %r.  Use the 'text()' function "
+                "to indicate a SQL expression literal, or 'literal()' to indicate a bound value." % element)
+    else:
+        return element
+
+def _corresponding_column_or_error(fromclause, column, require_embedded=False):
+    c = fromclause.corresponding_column(column, require_embedded=require_embedded)
+    if not c:
+        raise exc.InvalidRequestError("Given column '%s', attached to table '%s', "
+                "failed to locate a corresponding column from table '%s'"
+                % (column, getattr(column, 'table', None), fromclause.description))
+    return c
+
+def is_column(col):
+    """True if ``col`` is an instance of ``ColumnElement``."""
+    return isinstance(col, ColumnElement)
+
+
+class ClauseElement(Visitable):
+    """Base class for elements of a programmatically constructed SQL expression."""
+
+    __visit_name__ = 'clause'
+
+    _annotations = {}
+    supports_execution = False
+    _from_objects = []
+
+    def _clone(self):
+        """Create a shallow copy of this ClauseElement.
+
+        This method may be used by a generative API.  Its also used as
+        part of the "deep" copy afforded by a traversal that combines
+        the _copy_internals() method.
+
+        """
+        c = self.__class__.__new__(self.__class__)
+        c.__dict__ = self.__dict__.copy()
+        c.__dict__.pop('_cloned_set', None)
+
+        # this is a marker that helps to "equate" clauses to each other
+        # when a Select returns its list of FROM clauses.  the cloning
+        # process leaves around a lot of remnants of the previous clause
+        # typically in the form of column expressions still attached to the
+        # old table.
+        c._is_clone_of = self
+
+        return c
+
+    @util.memoized_property
+    def _cloned_set(self):
+        """Return the set consisting all cloned anscestors of this ClauseElement.
+
+        Includes this ClauseElement.  This accessor tends to be used for
+        FromClause objects to identify 'equivalent' FROM clauses, regardless
+        of transformative operations.
+
+        """
+        s = util.column_set()
+        f = self
+        while f is not None:
+            s.add(f)
+            f = getattr(f, '_is_clone_of', None)
+        return s
+
+    def __getstate__(self):
+        d = self.__dict__.copy()
+        d.pop('_is_clone_of', None)
+        return d
+
+    def _annotate(self, values):
+        """return a copy of this ClauseElement with the given annotations dictionary."""
+
+        global Annotated
+        if Annotated is None:
+            from sqlalchemy.sql.util import Annotated
+        return Annotated(self, values)
+
+    def _deannotate(self):
+        """return a copy of this ClauseElement with an empty annotations dictionary."""
+        return self._clone()
+
+    def unique_params(self, *optionaldict, **kwargs):
+        """Return a copy with ``bindparam()`` elments replaced.
+
+        Same functionality as ``params()``, except adds `unique=True`
+        to affected bind parameters so that multiple statements can be
+        used.
+
+        """
+        return self._params(True, optionaldict, kwargs)
+
+    def params(self, *optionaldict, **kwargs):
+        """Return a copy with ``bindparam()`` elments replaced.
+
+        Returns a copy of this ClauseElement with ``bindparam()``
+        elements replaced with values taken from the given dictionary::
+
+          >>> clause = column('x') + bindparam('foo')
+          >>> print clause.compile().params
+          {'foo':None}
+          >>> print clause.params({'foo':7}).compile().params
+          {'foo':7}
+
+        """
+        return self._params(False, optionaldict, kwargs)
+
+    def _params(self, unique, optionaldict, kwargs):
+        if len(optionaldict) == 1:
+            kwargs.update(optionaldict[0])
+        elif len(optionaldict) > 1:
+            raise exc.ArgumentError("params() takes zero or one positional dictionary argument")
+
+        def visit_bindparam(bind):
+            if bind.key in kwargs:
+                bind.value = kwargs[bind.key]
+            if unique:
+                bind._convert_to_unique()
+        return cloned_traverse(self, {}, {'bindparam':visit_bindparam})
+
+    def compare(self, other):
+        """Compare this ClauseElement to the given ClauseElement.
+
+        Subclasses should override the default behavior, which is a
+        straight identity comparison.
+
+        """
+        return self is other
+
+    def _copy_internals(self, clone=_clone):
+        """Reassign internal elements to be clones of themselves.
+
+        Called during a copy-and-traverse operation on newly
+        shallow-copied elements to create a deep copy.
+
+        """
+        pass
+
+    def get_children(self, **kwargs):
+        """Return immediate child elements of this ``ClauseElement``.
+
+        This is used for visit traversal.
+
+        \**kwargs may contain flags that change the collection that is
+        returned, for example to return a subset of items in order to
+        cut down on larger traversals, or to return child items from a
+        different context (such as schema-level collections instead of
+        clause-level).
+
+        """
+        return []
+
+    def self_group(self, against=None):
+        return self
+
+    @property
+    def bind(self):
+        """Returns the Engine or Connection to which this ClauseElement is bound, or None if none found."""
+
+        try:
+            if self._bind is not None:
+                return self._bind
+        except AttributeError:
+            pass
+        for f in _from_objects(self):
+            if f is self:
+                continue
+            engine = f.bind
+            if engine is not None:
+                return engine
+        else:
+            return None
+
+    def execute(self, *multiparams, **params):
+        """Compile and execute this ``ClauseElement``."""
+
+        e = self.bind
+        if e is None:
+            label = getattr(self, 'description', self.__class__.__name__)
+            msg = ('This %s is not bound and does not support direct '
+                   'execution. Supply this statement to a Connection or '
+                   'Engine for execution. Or, assign a bind to the statement '
+                   'or the Metadata of its underlying tables to enable '
+                   'implicit execution via this method.' % label)
+            raise exc.UnboundExecutionError(msg)
+        return e._execute_clauseelement(self, multiparams, params)
+
+    def scalar(self, *multiparams, **params):
+        """Compile and execute this ``ClauseElement``, returning the result's scalar representation."""
+
+        return self.execute(*multiparams, **params).scalar()
+
+    def compile(self, bind=None, column_keys=None, compiler=None, dialect=None, inline=False):
+        """Compile this SQL expression.
+
+        The return value is a :class:`~sqlalchemy.engine.Compiled` object.
+        Calling `str()` or `unicode()` on the returned value will yield
+        a string representation of the result.   The :class:`~sqlalchemy.engine.Compiled`
+        object also can return a dictionary of bind parameter names and
+        values using the `params` accessor.
+
+        :param bind: An ``Engine`` or ``Connection`` from which a
+          ``Compiled`` will be acquired.  This argument
+          takes precedence over this ``ClauseElement``'s
+          bound engine, if any.
+
+        :param column_keys: Used for INSERT and UPDATE statements, a list of
+          column names which should be present in the VALUES clause
+          of the compiled statement.  If ``None``, all columns
+          from the target table object are rendered.
+
+        :param compiler: A ``Compiled`` instance which will be used to compile
+          this expression.  This argument takes precedence
+          over the `bind` and `dialect` arguments as well as
+          this ``ClauseElement``'s bound engine, if
+          any.
+
+        :param dialect: A ``Dialect`` instance frmo which a ``Compiled``
+          will be acquired.  This argument takes precedence
+          over the `bind` argument as well as this
+          ``ClauseElement``'s bound engine, if any.
+
+        :param inline: Used for INSERT statements, for a dialect which does
+          not support inline retrieval of newly generated
+          primary key columns, will force the expression used
+          to create the new primary key value to be rendered
+          inline within the INSERT statement's VALUES clause.
+          This typically refers to Sequence execution but
+          may also refer to any server-side default generation
+          function associated with a primary key `Column`.
+
+        """
+        if compiler is None:
+            if dialect is not None:
+                compiler = dialect.statement_compiler(dialect, self, column_keys=column_keys, inline=inline)
+            elif bind is not None:
+                compiler = bind.statement_compiler(self, column_keys=column_keys, inline=inline)
+            elif self.bind is not None:
+                compiler = self.bind.statement_compiler(self, column_keys=column_keys, inline=inline)
+            else:
+                global DefaultDialect
+                if DefaultDialect is None:
+                    from sqlalchemy.engine.default import DefaultDialect
+                dialect = DefaultDialect()
+                compiler = dialect.statement_compiler(dialect, self, column_keys=column_keys, inline=inline)
+        compiler.compile()
+        return compiler
+
+    def __str__(self):
+        return unicode(self.compile()).encode('ascii', 'backslashreplace')
+
+    def __and__(self, other):
+        return and_(self, other)
+
+    def __or__(self, other):
+        return or_(self, other)
+
+    def __invert__(self):
+        return self._negate()
+
+    def _negate(self):
+        if hasattr(self, 'negation_clause'):
+            return self.negation_clause
+        else:
+            return _UnaryExpression(self.self_group(against=operators.inv), operator=operators.inv, negate=None)
+
+    def __repr__(self):
+        friendly = getattr(self, 'description', None)
+        if friendly is None:
+            return object.__repr__(self)
+        else:
+            return '<%s.%s at 0x%x; %s>' % (
+                self.__module__, self.__class__.__name__, id(self), friendly)
+
+
+class _Immutable(object):
+    """mark a ClauseElement as 'immutable' when expressions are cloned."""
+
+    def _clone(self):
+        return self
+
+class Operators(object):
+    def __and__(self, other):
+        return self.operate(operators.and_, other)
+
+    def __or__(self, other):
+        return self.operate(operators.or_, other)
+
+    def __invert__(self):
+        return self.operate(operators.inv)
+
+    def op(self, opstring):
+        def op(b):
+            return self.operate(operators.op, opstring, b)
+        return op
+
+    def operate(self, op, *other, **kwargs):
+        raise NotImplementedError(str(op))
+
+    def reverse_operate(self, op, other, **kwargs):
+        raise NotImplementedError(str(op))
+
+class ColumnOperators(Operators):
+    """Defines comparison and math operations."""
+
+    timetuple = None
+    """Hack, allows datetime objects to be compared on the LHS."""
+
+    def __lt__(self, other):
+        return self.operate(operators.lt, other)
+
+    def __le__(self, other):
+        return self.operate(operators.le, other)
+
+    __hash__ = Operators.__hash__
+    
+    def __eq__(self, other):
+        return self.operate(operators.eq, other)
+
+    def __ne__(self, other):
+        return self.operate(operators.ne, other)
+
+    def __gt__(self, other):
+        return self.operate(operators.gt, other)
+
+    def __ge__(self, other):
+        return self.operate(operators.ge, other)
+
+    def concat(self, other):
+        return self.operate(operators.concat_op, other)
+
+    def like(self, other, escape=None):
+        return self.operate(operators.like_op, other, escape=escape)
+
+    def ilike(self, other, escape=None):
+        return self.operate(operators.ilike_op, other, escape=escape)
+
+    def in_(self, other):
+        return self.operate(operators.in_op, other)
+
+    def startswith(self, other, **kwargs):
+        return self.operate(operators.startswith_op, other, **kwargs)
+
+    def endswith(self, other, **kwargs):
+        return self.operate(operators.endswith_op, other, **kwargs)
+
+    def contains(self, other, **kwargs):
+        return self.operate(operators.contains_op, other, **kwargs)
+
+    def match(self, other, **kwargs):
+        return self.operate(operators.match_op, other, **kwargs)
+
+    def desc(self):
+        return self.operate(operators.desc_op)
+
+    def asc(self):
+        return self.operate(operators.asc_op)
+
+    def collate(self, collation):
+        return self.operate(operators.collate, collation)
+
+    def __radd__(self, other):
+        return self.reverse_operate(operators.add, other)
+
+    def __rsub__(self, other):
+        return self.reverse_operate(operators.sub, other)
+
+    def __rmul__(self, other):
+        return self.reverse_operate(operators.mul, other)
+
+    def __rdiv__(self, other):
+        return self.reverse_operate(operators.div, other)
+
+    def between(self, cleft, cright):
+        return self.operate(operators.between_op, cleft, cright)
+
+    def distinct(self):
+        return self.operate(operators.distinct_op)
+
+    def __add__(self, other):
+        return self.operate(operators.add, other)
+
+    def __sub__(self, other):
+        return self.operate(operators.sub, other)
+
+    def __mul__(self, other):
+        return self.operate(operators.mul, other)
+
+    def __div__(self, other):
+        return self.operate(operators.div, other)
+
+    def __mod__(self, other):
+        return self.operate(operators.mod, other)
+
+    def __truediv__(self, other):
+        return self.operate(operators.truediv, other)
+
+class _CompareMixin(ColumnOperators):
+    """Defines comparison and math operations for ``ClauseElement`` instances."""
+
+    def __compare(self, op, obj, negate=None, reverse=False, **kwargs):
+        if obj is None or isinstance(obj, _Null):
+            if op == operators.eq:
+                return _BinaryExpression(self, null(), operators.is_, negate=operators.isnot)
+            elif op == operators.ne:
+                return _BinaryExpression(self, null(), operators.isnot, negate=operators.is_)
+            else:
+                raise exc.ArgumentError("Only '='/'!=' operators can be used with NULL")
+        else:
+            obj = self._check_literal(obj)
+
+        if reverse:
+            return _BinaryExpression(obj, self, op, type_=sqltypes.Boolean, negate=negate, modifiers=kwargs)
+        else:
+            return _BinaryExpression(self, obj, op, type_=sqltypes.Boolean, negate=negate, modifiers=kwargs)
+
+    def __operate(self, op, obj, reverse=False):
+        obj = self._check_literal(obj)
+
+        type_ = self._compare_type(obj)
+
+        if reverse:
+            return _BinaryExpression(obj, self, type_.adapt_operator(op), type_=type_)
+        else:
+            return _BinaryExpression(self, obj, type_.adapt_operator(op), type_=type_)
+
+    # a mapping of operators with the method they use, along with their negated
+    # operator for comparison operators
+    operators = {
+        operators.add : (__operate,),
+        operators.mul : (__operate,),
+        operators.sub : (__operate,),
+        operators.div : (__operate,),
+        operators.mod : (__operate,),
+        operators.truediv : (__operate,),
+        operators.lt : (__compare, operators.ge),
+        operators.le : (__compare, operators.gt),
+        operators.ne : (__compare, operators.eq),
+        operators.gt : (__compare, operators.le),
+        operators.ge : (__compare, operators.lt),
+        operators.eq : (__compare, operators.ne),
+        operators.like_op : (__compare, operators.notlike_op),
+        operators.ilike_op : (__compare, operators.notilike_op),
+    }
+
+    def operate(self, op, *other, **kwargs):
+        o = _CompareMixin.operators[op]
+        return o[0](self, op, other[0], *o[1:], **kwargs)
+
+    def reverse_operate(self, op, other, **kwargs):
+        o = _CompareMixin.operators[op]
+        return o[0](self, op, other, reverse=True, *o[1:], **kwargs)
+
+    def in_(self, other):
+        return self._in_impl(operators.in_op, operators.notin_op, other)
+
+    def _in_impl(self, op, negate_op, seq_or_selectable):
+        seq_or_selectable = _clause_element_as_expr(seq_or_selectable)
+            
+        if isinstance(seq_or_selectable, _ScalarSelect):
+            return self.__compare( op, seq_or_selectable, negate=negate_op)
+
+        elif isinstance(seq_or_selectable, _SelectBaseMixin):
+            # TODO: if we ever want to support (x, y, z) IN (select x, y, z from table),
+            # we would need a multi-column version of as_scalar() to produce a multi-
+            # column selectable that does not export itself as a FROM clause
+            return self.__compare( op, seq_or_selectable.as_scalar(), negate=negate_op)
+
+        elif isinstance(seq_or_selectable, Selectable):
+            return self.__compare( op, seq_or_selectable, negate=negate_op)
+
+        # Handle non selectable arguments as sequences
+        args = []
+        for o in seq_or_selectable:
+            if not _is_literal(o):
+                if not isinstance( o, _CompareMixin):
+                    raise exc.InvalidRequestError( 
+                        "in() function accepts either a list of non-selectable values, or a selectable: %r" % o)
+            else:
+                o = self._bind_param(o)
+            args.append(o)
+
+        if len(args) == 0:
+            # Special case handling for empty IN's, behave like comparison against zero row selectable
+            return self != self
+
+        return self.__compare(op, ClauseList(*args).self_group(against=op), negate=negate_op)
+
+    def startswith(self, other, escape=None):
+        """Produce the clause ``LIKE '<other>%'``"""
+
+        # use __radd__ to force string concat behavior
+        return self.__compare(
+            operators.like_op,
+            literal_column("'%'", type_=sqltypes.String).__radd__(self._check_literal(other)),
+            escape=escape)
+
+    def endswith(self, other, escape=None):
+        """Produce the clause ``LIKE '%<other>'``"""
+
+        return self.__compare(
+            operators.like_op,
+            literal_column("'%'", type_=sqltypes.String) + self._check_literal(other),
+            escape=escape)
+
+    def contains(self, other, escape=None):
+        """Produce the clause ``LIKE '%<other>%'``"""
+
+        return self.__compare(
+            operators.like_op,
+            literal_column("'%'", type_=sqltypes.String) +
+                self._check_literal(other) +
+                literal_column("'%'", type_=sqltypes.String),
+            escape=escape)
+
+    def match(self, other):
+        """Produce a MATCH clause, i.e. ``MATCH '<other>'``
+
+        The allowed contents of ``other`` are database backend specific.
+
+        """
+        return self.__compare(operators.match_op, self._check_literal(other))
+
+    def label(self, name):
+        """Produce a column label, i.e. ``<columnname> AS <name>``.
+
+        if 'name' is None, an anonymous label name will be generated.
+
+        """
+        return _Label(name, self, self.type)
+
+    def desc(self):
+        """Produce a DESC clause, i.e. ``<columnname> DESC``"""
+
+        return desc(self)
+
+    def asc(self):
+        """Produce a ASC clause, i.e. ``<columnname> ASC``"""
+
+        return asc(self)
+
+    def distinct(self):
+        """Produce a DISTINCT clause, i.e. ``DISTINCT <columnname>``"""
+        return _UnaryExpression(self, operator=operators.distinct_op, type_=self.type)
+
+    def between(self, cleft, cright):
+        """Produce a BETWEEN clause, i.e. ``<column> BETWEEN <cleft> AND <cright>``"""
+
+        return _BinaryExpression(
+                self,
+                ClauseList(
+                    self._check_literal(cleft),
+                    self._check_literal(cright),
+                    operator=operators.and_,
+                    group=False),
+                operators.between_op)
+
+    def collate(self, collation):
+        """Produce a COLLATE clause, i.e. ``<column> COLLATE utf8_bin``"""
+
+        return collate(self, collation)
+
+    def op(self, operator):
+        """produce a generic operator function.
+
+        e.g.::
+
+          somecolumn.op("*")(5)
+
+        produces::
+
+          somecolumn * 5
+
+        operator
+          a string which will be output as the infix operator between
+          this ``ClauseElement`` and the expression passed to the
+          generated function.
+
+        """
+        return lambda other: self.__operate(operator, other)
+
+    def _bind_param(self, obj):
+        return _BindParamClause(None, obj, type_=self.type, unique=True)
+
+    def _check_literal(self, other):
+        if isinstance(other, _BindParamClause) and isinstance(other.type, sqltypes.NullType):
+            other.type = self.type
+            return other
+        elif hasattr(other, '__clause_element__'):
+            return other.__clause_element__()
+        elif not isinstance(other, ClauseElement):
+            return self._bind_param(other)
+        elif isinstance(other, (_SelectBaseMixin, Alias)):
+            return other.as_scalar()
+        else:
+            return other
+
+    def _compare_type(self, obj):
+        """Allow subclasses to override the type used in constructing
+        ``_BinaryExpression`` objects.
+
+        Default return value is the type of the given object.
+
+        """
+        return obj.type
+
+class ColumnElement(ClauseElement, _CompareMixin):
+    """Represent an element that is usable within the "column clause" portion of a ``SELECT`` statement.
+
+    This includes columns associated with tables, aliases, and
+    subqueries, expressions, function calls, SQL keywords such as
+    ``NULL``, literals, etc.  ``ColumnElement`` is the ultimate base
+    class for all such elements.
+
+    ``ColumnElement`` supports the ability to be a *proxy* element,
+    which indicates that the ``ColumnElement`` may be associated with
+    a ``Selectable`` which was derived from another ``Selectable``.
+    An example of a "derived" ``Selectable`` is an ``Alias`` of a
+    ``Table``.
+
+    A ``ColumnElement``, by subclassing the ``_CompareMixin`` mixin
+    class, provides the ability to generate new ``ClauseElement``
+    objects using Python expressions.  See the ``_CompareMixin``
+    docstring for more details.
+
+    """
+
+    __visit_name__ = 'column'
+    primary_key = False
+    foreign_keys = []
+    quote = None
+    _label = None
+    
+    @property
+    def _select_iterable(self):
+        return (self, )
+
+    @util.memoized_property
+    def base_columns(self):
+        return util.column_set(c for c in self.proxy_set
+                                     if not hasattr(c, 'proxies'))
+
+    @util.memoized_property
+    def proxy_set(self):
+        s = util.column_set([self])
+        if hasattr(self, 'proxies'):
+            for c in self.proxies:
+                s.update(c.proxy_set)
+        return s
+
+    def shares_lineage(self, othercolumn):
+        """Return True if the given ``ColumnElement`` has a common ancestor to this ``ColumnElement``."""
+
+        return bool(self.proxy_set.intersection(othercolumn.proxy_set))
+
+    def _make_proxy(self, selectable, name=None):
+        """Create a new ``ColumnElement`` representing this
+        ``ColumnElement`` as it appears in the select list of a
+        descending selectable.
+
+        """
+
+        if name:
+            co = ColumnClause(name, selectable, type_=getattr(self, 'type', None))
+        else:
+            name = str(self)
+            co = ColumnClause(self.anon_label, selectable, type_=getattr(self, 'type', None))
+
+        co.proxies = [self]
+        selectable.columns[name] = co
+        return co
+
+    @util.memoized_property
+    def anon_label(self):
+        """provides a constant 'anonymous label' for this ColumnElement.
+
+        This is a label() expression which will be named at compile time.
+        The same label() is returned each time anon_label is called so
+        that expressions can reference anon_label multiple times, producing
+        the same label name at compile time.
+
+        the compiler uses this function automatically at compile time
+        for expressions that are known to be 'unnamed' like binary
+        expressions and function calls.
+
+        """
+        return _generated_label("%%(%d %s)s" % (id(self), getattr(self, 'name', 'anon')))
+
+class ColumnCollection(util.OrderedProperties):
+    """An ordered dictionary that stores a list of ColumnElement
+    instances.
+
+    Overrides the ``__eq__()`` method to produce SQL clauses between
+    sets of correlated columns.
+
+    """
+
+    def __init__(self, *cols):
+        super(ColumnCollection, self).__init__()
+        [self.add(c) for c in cols]
+
+    def __str__(self):
+        return repr([str(c) for c in self])
+
+    def replace(self, column):
+        """add the given column to this collection, removing unaliased versions of this column
+           as well as existing columns with the same key.
+
+            e.g.::
+
+                t = Table('sometable', metadata, Column('col1', Integer))
+                t.columns.replace(Column('col1', Integer, key='columnone'))
+
+            will remove the original 'col1' from the collection, and add
+            the new column under the name 'columnname'.
+
+           Used by schema.Column to override columns during table reflection.
+
+        """
+        if column.name in self and column.key != column.name:
+            other = self[column.name]
+            if other.name == other.key:
+                del self[other.name]
+        util.OrderedProperties.__setitem__(self, column.key, column)
+
+    def add(self, column):
+        """Add a column to this collection.
+
+        The key attribute of the column will be used as the hash key
+        for this dictionary.
+
+        """
+        self[column.key] = column
+
+    def __setitem__(self, key, value):
+        if key in self:
+            # this warning is primarily to catch select() statements which have conflicting
+            # column names in their exported columns collection
+            existing = self[key]
+            if not existing.shares_lineage(value):
+                table = getattr(existing, 'table', None) and existing.table.description
+                util.warn(("Column %r on table %r being replaced by another "
+                           "column with the same key.  Consider use_labels "
+                           "for select() statements.")  % (key, table))
+        util.OrderedProperties.__setitem__(self, key, value)
+
+    def remove(self, column):
+        del self[column.key]
+
+    def extend(self, iter):
+        for c in iter:
+            self.add(c)
+
+    __hash__ = None
+    
+    def __eq__(self, other):
+        l = []
+        for c in other:
+            for local in self:
+                if c.shares_lineage(local):
+                    l.append(c==local)
+        return and_(*l)
+
+    def __contains__(self, other):
+        if not isinstance(other, basestring):
+            raise exc.ArgumentError("__contains__ requires a string argument")
+        return util.OrderedProperties.__contains__(self, other)
+
+    def contains_column(self, col):
+        # have to use a Set here, because it will compare the identity
+        # of the column, not just using "==" for comparison which will always return a
+        # "True" value (i.e. a BinaryClause...)
+        return col in util.column_set(self)
+
+class ColumnSet(util.ordered_column_set):
+    def contains_column(self, col):
+        return col in self
+
+    def extend(self, cols):
+        for col in cols:
+            self.add(col)
+
+    def __add__(self, other):
+        return list(self) + list(other)
+
+    def __eq__(self, other):
+        l = []
+        for c in other:
+            for local in self:
+                if c.shares_lineage(local):
+                    l.append(c==local)
+        return and_(*l)
+
+    def __hash__(self):
+        return hash(tuple(x for x in self))
+
+class Selectable(ClauseElement):
+    """mark a class as being selectable"""
+    __visit_name__ = 'selectable'
+
+class FromClause(Selectable):
+    """Represent an element that can be used within the ``FROM`` clause of a ``SELECT`` statement."""
+
+    __visit_name__ = 'fromclause'
+    named_with_column = False
+    _hide_froms = []
+    quote = None
+    schema = None
+
+    def count(self, whereclause=None, **params):
+        """return a SELECT COUNT generated against this ``FromClause``."""
+
+        if self.primary_key:
+            col = list(self.primary_key)[0]
+        else:
+            col = list(self.columns)[0]
+        return select([func.count(col).label('tbl_row_count')], whereclause, from_obj=[self], **params)
+
+    def select(self, whereclause=None, **params):
+        """return a SELECT of this ``FromClause``."""
+
+        return select([self], whereclause, **params)
+
+    def join(self, right, onclause=None, isouter=False):
+        """return a join of this ``FromClause`` against another ``FromClause``."""
+
+        return Join(self, right, onclause, isouter)
+
+    def outerjoin(self, right, onclause=None):
+        """return an outer join of this ``FromClause`` against another ``FromClause``."""
+
+        return Join(self, right, onclause, True)
+
+    def alias(self, name=None):
+        """return an alias of this ``FromClause``.
+        
+        For table objects, this has the effect of the table being rendered
+        as ``tablename AS aliasname`` in a SELECT statement.  
+        For select objects, the effect is that of creating a named
+        subquery, i.e. ``(select ...) AS aliasname``.
+        The ``alias()`` method is the general way to create
+        a "subquery" out of an existing SELECT.
+        
+        The ``name`` parameter is optional, and if left blank an 
+        "anonymous" name will be generated at compile time, guaranteed
+        to be unique against other anonymous constructs used in the
+        same statement.
+        
+        """
+
+        return Alias(self, name)
+
+    def is_derived_from(self, fromclause):
+        """Return True if this FromClause is 'derived' from the given FromClause.
+
+        An example would be an Alias of a Table is derived from that Table.
+
+        """
+        return fromclause in self._cloned_set
+
+    def replace_selectable(self, old, alias):
+        """replace all occurences of FromClause 'old' with the given Alias object, returning a copy of this ``FromClause``."""
+
+        global ClauseAdapter
+        if ClauseAdapter is None:
+            from sqlalchemy.sql.util import ClauseAdapter
+        return ClauseAdapter(alias).traverse(self)
+
+    def correspond_on_equivalents(self, column, equivalents):
+        """Return corresponding_column for the given column, or if None
+        search for a match in the given dictionary.
+        
+        """
+        col = self.corresponding_column(column, require_embedded=True)
+        if col is None and col in equivalents:
+            for equiv in equivalents[col]:
+                nc = self.corresponding_column(equiv, require_embedded=True)
+                if nc:
+                    return nc
+        return col
+
+    def corresponding_column(self, column, require_embedded=False):
+        """Given a ``ColumnElement``, return the exported ``ColumnElement``
+        object from this ``Selectable`` which corresponds to that
+        original ``Column`` via a common anscestor column.
+
+        :param column: the target ``ColumnElement`` to be matched
+
+        :param require_embedded: only return corresponding columns for the given
+          ``ColumnElement``, if the given ``ColumnElement`` is
+          actually present within a sub-element of this
+          ``FromClause``.  Normally the column will match if it merely
+          shares a common anscestor with one of the exported columns
+          of this ``FromClause``.
+
+        """
+        # dont dig around if the column is locally present
+        if self.c.contains_column(column):
+            return column
+
+        col, intersect = None, None
+        target_set = column.proxy_set
+        cols = self.c
+        for c in cols:
+            i = c.proxy_set.intersection(target_set)
+            if i and \
+                (not require_embedded or c.proxy_set.issuperset(target_set)):
+                
+                if col is None:
+                    # no corresponding column yet, pick this one.
+                    col, intersect = c, i
+                elif len(i) > len(intersect):
+                    # 'c' has a larger field of correspondence than 'col'.
+                    # i.e. selectable.c.a1_x->a1.c.x->table.c.x matches a1.c.x->table.c.x better than 
+                    # selectable.c.x->table.c.x does.
+                    col, intersect = c, i
+                elif i == intersect:
+                    # they have the same field of correspondence.
+                    # see which proxy_set has fewer columns in it, which indicates a
+                    # closer relationship with the root column.  Also take into account the 
+                    # "weight" attribute which CompoundSelect() uses to give higher precedence to
+                    # columns based on vertical position in the compound statement, and discard columns
+                    # that have no reference to the target column (also occurs with CompoundSelect)
+                    col_distance = util.reduce(operator.add, 
+                                        [sc._annotations.get('weight', 1) for sc in col.proxy_set if sc.shares_lineage(column)]
+                                    )
+                    c_distance = util.reduce(operator.add, 
+                                        [sc._annotations.get('weight', 1) for sc in c.proxy_set if sc.shares_lineage(column)]
+                                    )
+                    if \
+                        c_distance < col_distance:
+                        col, intersect = c, i
+        return col
+
+    @property
+    def description(self):
+        """a brief description of this FromClause.
+
+        Used primarily for error message formatting.
+
+        """
+        return getattr(self, 'name', self.__class__.__name__ + " object")
+
+    def _reset_exported(self):
+        """delete memoized collections when a FromClause is cloned."""
+
+        for attr in ('_columns', '_primary_key' '_foreign_keys', 'locate_all_froms'):
+            self.__dict__.pop(attr, None)
+
+    @util.memoized_property
+    def _columns(self):
+        """Return the collection of Column objects contained by this FromClause."""
+
+        self._export_columns()
+        return self._columns
+
+    @util.memoized_property
+    def _primary_key(self):
+        """Return the collection of Column objects which comprise the primary key of this FromClause."""
+
+        self._export_columns()
+        return self._primary_key
+
+    @util.memoized_property
+    def _foreign_keys(self):
+        """Return the collection of ForeignKey objects which this FromClause references."""
+
+        self._export_columns()
+        return self._foreign_keys
+
+    columns = property(attrgetter('_columns'), doc=_columns.__doc__)
+    primary_key = property(attrgetter('_primary_key'), doc=_primary_key.__doc__)
+    foreign_keys = property(attrgetter('_foreign_keys'), doc=_foreign_keys.__doc__)
+
+    # synonyms for 'columns'
+    c = _select_iterable = property(attrgetter('columns'), doc=_columns.__doc__)
+
+    def _export_columns(self):
+        """Initialize column collections."""
+
+        self._columns = ColumnCollection()
+        self._primary_key = ColumnSet()
+        self._foreign_keys = set()
+        self._populate_column_collection()
+
+    def _populate_column_collection(self):
+        pass
+
+class _BindParamClause(ColumnElement):
+    """Represent a bind parameter.
+
+    Public constructor is the ``bindparam()`` function.
+
+    """
+
+    __visit_name__ = 'bindparam'
+    quote = None
+
+    def __init__(self, key, value, type_=None, unique=False, isoutparam=False, shortname=None):
+        """Construct a _BindParamClause.
+
+        key
+          the key for this bind param.  Will be used in the generated
+          SQL statement for dialects that use named parameters.  This
+          value may be modified when part of a compilation operation,
+          if other ``_BindParamClause`` objects exist with the same
+          key, or if its length is too long and truncation is
+          required.
+
+        value
+          Initial value for this bind param.  This value may be
+          overridden by the dictionary of parameters sent to statement
+          compilation/execution.
+
+        shortname
+          deprecated.
+
+        type\_
+          A ``TypeEngine`` object that will be used to pre-process the
+          value corresponding to this ``_BindParamClause`` at
+          execution time.
+
+        unique
+          if True, the key name of this BindParamClause will be
+          modified if another ``_BindParamClause`` of the same name
+          already has been located within the containing
+          ``ClauseElement``.
+
+        isoutparam
+          if True, the parameter should be treated like a stored procedure "OUT"
+          parameter.
+
+        """
+        if unique:
+            self.key = _generated_label("%%(%d %s)s" % (id(self), key or 'param'))
+        else:
+            self.key = key or _generated_label("%%(%d param)s" % id(self))
+        self._orig_key = key or 'param'
+        self.unique = unique
+        self.value = value
+        self.isoutparam = isoutparam
+        self.shortname = shortname
+
+        if type_ is None:
+            self.type = sqltypes.type_map.get(type(value), sqltypes.NullType)()
+        elif isinstance(type_, type):
+            self.type = type_()
+        else:
+            self.type = type_
+
+    def _clone(self):
+        c = ClauseElement._clone(self)
+        if self.unique:
+            c.key = _generated_label("%%(%d %s)s" % (id(c), c._orig_key or 'param'))
+        return c
+
+    def _convert_to_unique(self):
+        if not self.unique:
+            self.unique = True
+            self.key = _generated_label("%%(%d %s)s" % (id(self), self._orig_key or 'param'))
+
+    def bind_processor(self, dialect):
+        return self.type.dialect_impl(dialect).bind_processor(dialect)
+
+    def _compare_type(self, obj):
+        if not isinstance(self.type, sqltypes.NullType):
+            return self.type
+        else:
+            return obj.type
+
+    def compare(self, other):
+        """Compare this ``_BindParamClause`` to the given clause.
+
+        Since ``compare()`` is meant to compare statement syntax, this
+        method returns True if the two ``_BindParamClauses`` have just
+        the same type.
+
+        """
+        return isinstance(other, _BindParamClause) and other.type.__class__ == self.type.__class__ and self.value == other.value
+
+    def __getstate__(self):
+        """execute a deferred value for serialization purposes."""
+
+        d = self.__dict__.copy()
+        v = self.value
+        if util.callable(v):
+            v = v()
+        d['value'] = v
+        return d
+
+    def __repr__(self):
+        return "_BindParamClause(%s, %s, type_=%s)" % (repr(self.key), repr(self.value), repr(self.type))
+
+class _TypeClause(ClauseElement):
+    """Handle a type keyword in a SQL statement.
+
+    Used by the ``Case`` statement.
+
+    """
+
+    __visit_name__ = 'typeclause'
+
+    def __init__(self, type):
+        self.type = type
+
+
+class _TextClause(ClauseElement):
+    """Represent a literal SQL text fragment.
+
+    Public constructor is the ``text()`` function.
+
+    """
+
+    __visit_name__ = 'textclause'
+
+    _bind_params_regex = re.compile(r'(?<![:\w\x5c]):(\w+)(?!:)', re.UNICODE)
+    supports_execution = True
+
+    @property
+    def _select_iterable(self):
+        return (self,)
+
+    _hide_froms = []
+
+    def __init__(self, text = "", bind=None, bindparams=None, typemap=None, autocommit=False):
+        self._bind = bind
+        self.bindparams = {}
+        self.typemap = typemap
+        self._autocommit = autocommit
+        if typemap is not None:
+            for key in typemap.keys():
+                typemap[key] = sqltypes.to_instance(typemap[key])
+
+        def repl(m):
+            self.bindparams[m.group(1)] = bindparam(m.group(1))
+            return ":%s" % m.group(1)
+
+        # scan the string and search for bind parameter names, add them
+        # to the list of bindparams
+        self.text = self._bind_params_regex.sub(repl, text)
+        if bindparams is not None:
+            for b in bindparams:
+                self.bindparams[b.key] = b
+                
+    @property
+    def type(self):
+        if self.typemap is not None and len(self.typemap) == 1:
+            return list(self.typemap)[0]
+        else:
+            return None
+
+    def _copy_internals(self, clone=_clone):
+        self.bindparams = dict((b.key, clone(b))
+                               for b in self.bindparams.values())
+
+    def get_children(self, **kwargs):
+        return self.bindparams.values()
+
+
+class _Null(ColumnElement):
+    """Represent the NULL keyword in a SQL statement.
+
+    Public constructor is the ``null()`` function.
+
+    """
+
+    __visit_name__ = 'null'
+
+    def __init__(self):
+        self.type = sqltypes.NULLTYPE
+
+
+class ClauseList(ClauseElement):
+    """Describe a list of clauses, separated by an operator.
+
+    By default, is comma-separated, such as a column listing.
+
+    """
+    __visit_name__ = 'clauselist'
+
+    def __init__(self, *clauses, **kwargs):
+        self.operator = kwargs.pop('operator', operators.comma_op)
+        self.group = kwargs.pop('group', True)
+        self.group_contents = kwargs.pop('group_contents', True)
+        if self.group_contents:
+            self.clauses = [
+                _literal_as_text(clause).self_group(against=self.operator)
+                for clause in clauses if clause is not None]
+        else:
+            self.clauses = [
+                _literal_as_text(clause)
+                for clause in clauses if clause is not None]
+
+    def __iter__(self):
+        return iter(self.clauses)
+
+    def __len__(self):
+        return len(self.clauses)
+
+    @property
+    def _select_iterable(self):
+        return iter(self)
+
+    def append(self, clause):
+        # TODO: not sure if i like the 'group_contents' flag.  need to
+        # define the difference between a ClauseList of ClauseLists,
+        # and a "flattened" ClauseList of ClauseLists.  flatten()
+        # method ?
+        if self.group_contents:
+            self.clauses.append(_literal_as_text(clause).self_group(against=self.operator))
+        else:
+            self.clauses.append(_literal_as_text(clause))
+
+    def _copy_internals(self, clone=_clone):
+        self.clauses = [clone(clause) for clause in self.clauses]
+
+    def get_children(self, **kwargs):
+        return self.clauses
+
+    @property
+    def _from_objects(self):
+        return list(itertools.chain(*[c._from_objects for c in self.clauses]))
+
+    def self_group(self, against=None):
+        if self.group and self.operator is not against and operators.is_precedent(self.operator, against):
+            return _Grouping(self)
+        else:
+            return self
+
+    def compare(self, other):
+        """Compare this ``ClauseList`` to the given ``ClauseList``,
+        including a comparison of all the clause items.
+
+        """
+        if not isinstance(other, ClauseList) and len(self.clauses) == 1:
+            return self.clauses[0].compare(other)
+        elif isinstance(other, ClauseList) and len(self.clauses) == len(other.clauses):
+            for i in range(0, len(self.clauses)):
+                if not self.clauses[i].compare(other.clauses[i]):
+                    return False
+            else:
+                return self.operator == other.operator
+        else:
+            return False
+
+class BooleanClauseList(ClauseList, ColumnElement):
+    __visit_name__ = 'clauselist'
+
+    def __init__(self, *clauses, **kwargs):
+        super(BooleanClauseList, self).__init__(*clauses, **kwargs)
+        self.type = sqltypes.to_instance(kwargs.get('type_', sqltypes.Boolean))
+
+    @property
+    def _select_iterable(self):
+        return (self, )
+
+
+class _Case(ColumnElement):
+    __visit_name__ = 'case'
+
+    def __init__(self, whens, value=None, else_=None):
+        try:
+            whens = util.dictlike_iteritems(whens)
+        except TypeError:
+            pass
+
+        if value:
+            whenlist = [(_literal_as_binds(c).self_group(), _literal_as_binds(r)) for (c, r) in whens]
+        else:
+            whenlist = [(_no_literals(c).self_group(), _literal_as_binds(r)) for (c, r) in whens]
+
+        if whenlist:
+            type_ = list(whenlist[-1])[-1].type
+        else:
+            type_ = None
+
+        if value is None:
+            self.value = None
+        else:
+            self.value = _literal_as_binds(value)
+
+        self.type = type_
+        self.whens = whenlist
+        if else_ is not None:
+            self.else_ = _literal_as_binds(else_)
+        else:
+            self.else_ = None
+
+    def _copy_internals(self, clone=_clone):
+        if self.value:
+            self.value = clone(self.value)
+        self.whens = [(clone(x), clone(y)) for x, y in self.whens]
+        if self.else_:
+            self.else_ = clone(self.else_)
+
+    def get_children(self, **kwargs):
+        if self.value:
+            yield self.value
+        for x, y in self.whens:
+            yield x
+            yield y
+        if self.else_:
+            yield self.else_ 
+
+    @property
+    def _from_objects(self):
+        return list(itertools.chain(*[x._from_objects for x in self.get_children()]))
+
+class Function(ColumnElement, FromClause):
+    """Describe a SQL function."""
+
+    __visit_name__ = 'function'
+
+    def __init__(self, name, *clauses, **kwargs):
+        self.packagenames = kwargs.get('packagenames', None) or []
+        self.name = name
+        self._bind = kwargs.get('bind', None)
+        args = [_literal_as_binds(c, self.name) for c in clauses]
+        self.clause_expr = ClauseList(operator=operators.comma_op, group_contents=True, *args).self_group()
+        self.type = sqltypes.to_instance(kwargs.get('type_', None))
+
+    @property
+    def key(self):
+        return self.name
+
+    @property
+    def columns(self):
+        return [self]
+
+    @util.memoized_property
+    def clauses(self):
+        return self.clause_expr.element
+        
+    @property
+    def _from_objects(self):
+        return self.clauses._from_objects
+
+    def get_children(self, **kwargs):
+        return self.clause_expr, 
+
+    def _copy_internals(self, clone=_clone):
+        self.clause_expr = clone(self.clause_expr)
+        self._reset_exported()
+        util.reset_memoized(self, 'clauses')
+        
+    def _bind_param(self, obj):
+        return _BindParamClause(self.name, obj, type_=self.type, unique=True)
+
+    def select(self):
+        return select([self])
+
+    def scalar(self):
+        return select([self]).execute().scalar()
+
+    def execute(self):
+        return select([self]).execute()
+
+    def _compare_type(self, obj):
+        return self.type
+
+
+class _Cast(ColumnElement):
+
+    __visit_name__ = 'cast'
+
+    def __init__(self, clause, totype, **kwargs):
+        self.type = sqltypes.to_instance(totype)
+        self.clause = _literal_as_binds(clause, None)
+        self.typeclause = _TypeClause(self.type)
+
+    def _copy_internals(self, clone=_clone):
+        self.clause = clone(self.clause)
+        self.typeclause = clone(self.typeclause)
+
+    def get_children(self, **kwargs):
+        return self.clause, self.typeclause
+
+    @property
+    def _from_objects(self):
+        return self.clause._from_objects
+
+
+class _Extract(ColumnElement):
+
+    __visit_name__ = 'extract'
+
+    def __init__(self, field, expr, **kwargs):
+        self.type = sqltypes.Integer()
+        self.field = field
+        self.expr = _literal_as_binds(expr, None)
+
+    def _copy_internals(self, clone=_clone):
+        self.expr = clone(self.expr)
+
+    def get_children(self, **kwargs):
+        return self.expr,
+
+    @property
+    def _from_objects(self):
+        return self.expr._from_objects
+
+
+class _UnaryExpression(ColumnElement):
+
+    __visit_name__ = 'unary'
+
+    def __init__(self, element, operator=None, modifier=None, type_=None, negate=None):
+        self.operator = operator
+        self.modifier = modifier
+
+        self.element = _literal_as_text(element).self_group(against=self.operator or self.modifier)
+        self.type = sqltypes.to_instance(type_)
+        self.negate = negate
+
+    @property
+    def _from_objects(self):
+        return self.element._from_objects
+
+    def _copy_internals(self, clone=_clone):
+        self.element = clone(self.element)
+
+    def get_children(self, **kwargs):
+        return self.element,
+
+    def compare(self, other):
+        """Compare this ``_UnaryExpression`` against the given ``ClauseElement``."""
+
+        return (
+            isinstance(other, _UnaryExpression) and
+            self.operator == other.operator and
+            self.modifier == other.modifier and
+            self.element.compare(other.element)
+        )
+
+    def _negate(self):
+        if self.negate is not None:
+            return _UnaryExpression(
+                self.element,
+                operator=self.negate,
+                negate=self.operator,
+                modifier=self.modifier,
+                type_=self.type)
+        else:
+            return super(_UnaryExpression, self)._negate()
+
+    def self_group(self, against):
+        if self.operator and operators.is_precedent(self.operator, against):
+            return _Grouping(self)
+        else:
+            return self
+
+
+class _BinaryExpression(ColumnElement):
+    """Represent an expression that is ``LEFT <operator> RIGHT``."""
+
+    __visit_name__ = 'binary'
+
+    def __init__(self, left, right, operator, type_=None, negate=None, modifiers=None):
+        self.left = _literal_as_text(left).self_group(against=operator)
+        self.right = _literal_as_text(right).self_group(against=operator)
+        self.operator = operator
+        self.type = sqltypes.to_instance(type_)
+        self.negate = negate
+        if modifiers is None:
+            self.modifiers = {}
+        else:
+            self.modifiers = modifiers
+
+    @property
+    def _from_objects(self):
+        return self.left._from_objects + self.right._from_objects
+
+    def _copy_internals(self, clone=_clone):
+        self.left = clone(self.left)
+        self.right = clone(self.right)
+
+    def get_children(self, **kwargs):
+        return self.left, self.right
+
+    def compare(self, other):
+        """Compare this ``_BinaryExpression`` against the given ``_BinaryExpression``."""
+
+        return (
+            isinstance(other, _BinaryExpression) and
+            self.operator == other.operator and
+            (
+                self.left.compare(other.left) and
+                self.right.compare(other.right) or
+                (
+                    operators.is_commutative(self.operator) and
+                    self.left.compare(other.right) and
+                    self.right.compare(other.left)
+                )
+            )
+        )
+
+    def self_group(self, against=None):
+        # use small/large defaults for comparison so that unknown
+        # operators are always parenthesized
+        if self.operator is not against and operators.is_precedent(self.operator, against):
+            return _Grouping(self)
+        else:
+            return self
+
+    def _negate(self):
+        if self.negate is not None:
+            return _BinaryExpression(
+                self.left,
+                self.right,
+                self.negate,
+                negate=self.operator,
+                type_=self.type,
+                modifiers=self.modifiers)
+        else:
+            return super(_BinaryExpression, self)._negate()
+
+class _Exists(_UnaryExpression):
+    __visit_name__ = _UnaryExpression.__visit_name__
+    _from_objects = []
+
+    def __init__(self, *args, **kwargs):
+        if args and isinstance(args[0], _SelectBaseMixin):
+            s = args[0]
+        else:
+            if not args:
+                args = ([literal_column('*')],)
+            s = select(*args, **kwargs).as_scalar().self_group()
+
+        _UnaryExpression.__init__(self, s, operator=operators.exists, type_=sqltypes.Boolean)
+
+    def select(self, whereclause=None, **params):
+        return select([self], whereclause, **params)
+
+    def correlate(self, fromclause):
+        e = self._clone()
+        e.element = self.element.correlate(fromclause).self_group()
+        return e
+
+    def select_from(self, clause):
+        """return a new exists() construct with the given expression set as its FROM clause."""
+
+        e = self._clone()
+        e.element = self.element.select_from(clause).self_group()
+        return e
+
+    def where(self, clause):
+        """return a new exists() construct with the given expression added to its WHERE clause, joined
+        to the existing clause via AND, if any."""
+
+        e = self._clone()
+        e.element = self.element.where(clause).self_group()
+        return e
+
+class Join(FromClause):
+    """represent a ``JOIN`` construct between two ``FromClause`` elements.
+
+    The public constructor function for ``Join`` is the module-level
+    ``join()`` function, as well as the ``join()`` method available
+    off all ``FromClause`` subclasses.
+
+    """
+    __visit_name__ = 'join'
+
+    def __init__(self, left, right, onclause=None, isouter=False):
+        self.left = _literal_as_text(left)
+        self.right = _literal_as_text(right).self_group()
+
+        if onclause is None:
+            self.onclause = self._match_primaries(self.left, self.right)
+        else:
+            self.onclause = onclause
+
+        self.isouter = isouter
+        self.__folded_equivalents = None
+
+    @property
+    def description(self):
+        return "Join object on %s(%d) and %s(%d)" % (
+            self.left.description,
+            id(self.left),
+            self.right.description,
+            id(self.right))
+
+    def is_derived_from(self, fromclause):
+        return fromclause is self or self.left.is_derived_from(fromclause) or self.right.is_derived_from(fromclause)
+
+    def self_group(self, against=None):
+        return _FromGrouping(self)
+
+    def _populate_column_collection(self):
+        columns = [c for c in self.left.columns] + [c for c in self.right.columns]
+
+        global sql_util
+        if not sql_util:
+            from sqlalchemy.sql import util as sql_util
+        self._primary_key.extend(sql_util.reduce_columns(
+                (c for c in columns if c.primary_key), self.onclause))
+        self._columns.update((col._label, col) for col in columns)
+        self._foreign_keys.update(itertools.chain(*[col.foreign_keys for col in columns]))
+
+    def _copy_internals(self, clone=_clone):
+        self._reset_exported()
+        self.left = clone(self.left)
+        self.right = clone(self.right)
+        self.onclause = clone(self.onclause)
+        self.__folded_equivalents = None
+
+    def get_children(self, **kwargs):
+        return self.left, self.right, self.onclause
+
+    def _match_primaries(self, primary, secondary):
+        global sql_util
+        if not sql_util:
+            from sqlalchemy.sql import util as sql_util
+        return sql_util.join_condition(primary, secondary)
+
+    def select(self, whereclause=None, fold_equivalents=False, **kwargs):
+        """Create a :class:`Select` from this :class:`Join`.
+
+        :param whereclause: the WHERE criterion that will be sent to 
+          the :func:`select()` function
+
+        :param fold_equivalents: based on the join criterion of this 
+          :class:`Join`, do not include
+          repeat column names in the column list of the resulting
+          select, for columns that are calculated to be "equivalent"
+          based on the join criterion of this :class:`Join`. This will
+          recursively apply to any joins directly nested by this one
+          as well.  This flag is specific to a particular use case
+          by the ORM and will be deprecated in 0.6.
+
+        :param \**kwargs: all other kwargs are sent to the 
+          underlying :func:`select()` function.
+
+        """
+        if fold_equivalents:
+            global sql_util
+            if not sql_util:
+                from sqlalchemy.sql import util as sql_util
+            collist = sql_util.folded_equivalents(self)
+        else:
+            collist = [self.left, self.right]
+
+        return select(collist, whereclause, from_obj=[self], **kwargs)
+
+    @property
+    def bind(self):
+        return self.left.bind or self.right.bind
+
+    def alias(self, name=None):
+        """Create a ``Select`` out of this ``Join`` clause and return an ``Alias`` of it.
+
+        The ``Select`` is not correlating.
+
+        """
+        return self.select(use_labels=True, correlate=False).alias(name)
+
+    @property
+    def _hide_froms(self):
+        return itertools.chain(*[_from_objects(x.left, x.right) for x in self._cloned_set])
+
+    @property
+    def _from_objects(self):
+        return [self] + \
+                self.onclause._from_objects + \
+                self.left._from_objects + \
+                self.right._from_objects
+
+class Alias(FromClause):
+    """Represents an table or selectable alias (AS).
+
+    Represents an alias, as typically applied to any table or
+    sub-select within a SQL statement using the ``AS`` keyword (or
+    without the keyword on certain databases such as Oracle).
+
+    This object is constructed from the ``alias()`` module level
+    function as well as the ``alias()`` method available on all
+    ``FromClause`` subclasses.
+
+    """
+
+    __visit_name__ = 'alias'
+    named_with_column = True
+
+    def __init__(self, selectable, alias=None):
+        baseselectable = selectable
+        while isinstance(baseselectable, Alias):
+            baseselectable = baseselectable.element
+        self.original = baseselectable
+        self.supports_execution = baseselectable.supports_execution
+        if self.supports_execution:
+            self._autocommit = baseselectable._autocommit
+        self.element = selectable
+        if alias is None:
+            if self.original.named_with_column:
+                alias = getattr(self.original, 'name', None)
+            alias = _generated_label('%%(%d %s)s' % (id(self), alias or 'anon'))
+        self.name = alias
+
+    @property
+    def description(self):
+        return self.name.encode('ascii', 'backslashreplace')
+
+    def as_scalar(self):
+        try:
+            return self.element.as_scalar()
+        except AttributeError:
+            raise AttributeError("Element %s does not support 'as_scalar()'" % self.element)
+        
+    def is_derived_from(self, fromclause):
+        if fromclause in self._cloned_set:
+            return True
+        return self.element.is_derived_from(fromclause)
+
+    def _populate_column_collection(self):
+        for col in self.element.columns:
+            col._make_proxy(self)
+
+    def _copy_internals(self, clone=_clone):
+        self._reset_exported()
+        self.element = _clone(self.element)
+        baseselectable = self.element
+        while isinstance(baseselectable, Alias):
+            baseselectable = baseselectable.selectable
+        self.original = baseselectable
+
+    def get_children(self, column_collections=True, aliased_selectables=True, **kwargs):
+        if column_collections:
+            for c in self.c:
+                yield c
+        if aliased_selectables:
+            yield self.element
+
+    @property
+    def _from_objects(self):
+        return [self]
+
+    @property
+    def bind(self):
+        return self.element.bind
+
+class _Grouping(ColumnElement):
+    """Represent a grouping within a column expression"""
+
+    __visit_name__ = 'grouping'
+
+    def __init__(self, element):
+        self.element = element
+        self.type = getattr(element, 'type', None)
+
+    @property
+    def key(self):
+        return self.element.key
+
+    @property
+    def _label(self):
+        return getattr(self.element, '_label', None) or self.anon_label
+
+    def _copy_internals(self, clone=_clone):
+        self.element = clone(self.element)
+
+    def get_children(self, **kwargs):
+        return self.element,
+
+    @property
+    def _from_objects(self):
+        return self.element._from_objects
+
+    def __getattr__(self, attr):
+        return getattr(self.element, attr)
+
+    def __getstate__(self):
+        return {'element':self.element, 'type':self.type}
+
+    def __setstate__(self, state):
+        self.element = state['element']
+        self.type = state['type']
+
+class _FromGrouping(FromClause):
+    """Represent a grouping of a FROM clause"""
+    __visit_name__ = 'grouping'
+
+    def __init__(self, element):
+        self.element = element
+
+    @property
+    def columns(self):
+        return self.element.columns
+
+    @property
+    def _hide_froms(self):
+        return self.element._hide_froms
+
+    def get_children(self, **kwargs):
+        return self.element,
+
+    def _copy_internals(self, clone=_clone):
+        self.element = clone(self.element)
+
+    @property
+    def _from_objects(self):
+        return self.element._from_objects
+
+    def __getattr__(self, attr):
+        return getattr(self.element, attr)
+
+    def __getstate__(self):
+        return {'element':self.element}
+
+    def __setstate__(self, state):
+        self.element = state['element']
+
+class _Label(ColumnElement):
+    """Represents a column label (AS).
+
+    Represent a label, as typically applied to any column-level
+    element using the ``AS`` sql keyword.
+
+    This object is constructed from the ``label()`` module level
+    function as well as the ``label()`` method available on all
+    ``ColumnElement`` subclasses.
+
+    """
+
+    __visit_name__ = 'label'
+
+    def __init__(self, name, element, type_=None):
+        while isinstance(element, _Label):
+            element = element.element
+        self.name = self.key = self._label = name or _generated_label("%%(%d %s)s" % (id(self), getattr(element, 'name', 'anon')))
+        self._element = element
+        self._type = type_
+        self.quote = element.quote
+
+    @util.memoized_property
+    def type(self):
+        return sqltypes.to_instance(self._type or getattr(self._element, 'type', None))
+
+    @util.memoized_property
+    def element(self):
+        return self._element.self_group(against=operators.as_)
+
+    def _proxy_attr(name):
+        get = attrgetter(name)
+        def attr(self):
+            return get(self.element)
+        return property(attr)
+
+    proxies = _proxy_attr('proxies')
+    base_columns = _proxy_attr('base_columns')
+    proxy_set = _proxy_attr('proxy_set')
+    primary_key = _proxy_attr('primary_key')
+    foreign_keys = _proxy_attr('foreign_keys')
+
+    def get_children(self, **kwargs):
+        return self.element,
+
+    def _copy_internals(self, clone=_clone):
+        self.element = clone(self.element)
+
+    @property
+    def _from_objects(self):
+        return self.element._from_objects
+
+    def _make_proxy(self, selectable, name = None):
+        if isinstance(self.element, (Selectable, ColumnElement)):
+            e = self.element._make_proxy(selectable, name=self.name)
+        else:
+            e = column(self.name)._make_proxy(selectable=selectable)
+        e.proxies.append(self)
+        return e
+
+class ColumnClause(_Immutable, ColumnElement):
+    """Represents a generic column expression from any textual string.
+
+    This includes columns associated with tables, aliases and select
+    statements, but also any arbitrary text.  May or may not be bound
+    to an underlying ``Selectable``.  ``ColumnClause`` is usually
+    created publically via the ``column()`` function or the
+    ``literal_column()`` function.
+
+    text
+      the text of the element.
+
+    selectable
+      parent selectable.
+
+    type
+      ``TypeEngine`` object which can associate this ``ColumnClause``
+      with a type.
+
+    is_literal
+      if True, the ``ColumnClause`` is assumed to be an exact
+      expression that will be delivered to the output with no quoting
+      rules applied regardless of case sensitive settings.  the
+      ``literal_column()`` function is usually used to create such a
+      ``ColumnClause``.
+
+    """
+    __visit_name__ = 'column'
+
+    def __init__(self, text, selectable=None, type_=None, is_literal=False):
+        self.key = self.name = text
+        self.table = selectable
+        self.type = sqltypes.to_instance(type_)
+        self.is_literal = is_literal
+
+    @util.memoized_property
+    def description(self):
+        return self.name.encode('ascii', 'backslashreplace')
+
+    @util.memoized_property
+    def _label(self):
+        if self.is_literal:
+            return None
+
+        elif self.table and self.table.named_with_column:
+            if getattr(self.table, 'schema', None):
+                label = self.table.schema + "_" + \
+                            _escape_for_generated(self.table.name) + "_" + \
+                            _escape_for_generated(self.name)
+            else:
+                label = _escape_for_generated(self.table.name) + "_" + \
+                            _escape_for_generated(self.name)
+
+            if label in self.table.c:
+                # TODO: coverage does not seem to be present for this
+                _label = label
+                counter = 1
+                while _label in self.table.c:
+                    _label = label + "_" + str(counter)
+                    counter += 1
+                label = _label
+            return _generated_label(label)
+
+        else:
+            return self.name
+
+    def label(self, name):
+        if name is None:
+            return self
+        else:
+            return super(ColumnClause, self).label(name)
+
+    @property
+    def _from_objects(self):
+        if self.table:
+            return [self.table]
+        else:
+            return []
+
+    def _bind_param(self, obj):
+        return _BindParamClause(self.name, obj, type_=self.type, unique=True)
+
+    def _make_proxy(self, selectable, name=None, attach=True):
+        # propagate the "is_literal" flag only if we are keeping our name,
+        # otherwise its considered to be a label
+        is_literal = self.is_literal and (name is None or name == self.name)
+        c = ColumnClause(name or self.name, selectable=selectable, type_=self.type, is_literal=is_literal)
+        c.proxies = [self]
+        if attach:
+            selectable.columns[c.name] = c
+        return c
+
+    def _compare_type(self, obj):
+        return self.type
+
+class TableClause(_Immutable, FromClause):
+    """Represents a "table" construct.
+
+    Note that this represents tables only as another syntactical
+    construct within SQL expressions; it does not provide schema-level
+    functionality.
+
+    """
+
+    __visit_name__ = 'table'
+
+    named_with_column = True
+
+    def __init__(self, name, *columns):
+        super(TableClause, self).__init__()
+        self.name = self.fullname = name
+        self._columns = ColumnCollection()
+        self._primary_key = ColumnSet()
+        self._foreign_keys = set()
+        for c in columns:
+            self.append_column(c)
+
+    def _export_columns(self):
+        raise NotImplementedError()
+
+    @util.memoized_property
+    def description(self):
+        return self.name.encode('ascii', 'backslashreplace')
+
+    def append_column(self, c):
+        self._columns[c.name] = c
+        c.table = self
+
+    def get_children(self, column_collections=True, **kwargs):
+        if column_collections:
+            return [c for c in self.c]
+        else:
+            return []
+
+    def count(self, whereclause=None, **params):
+        if self.primary_key:
+            col = list(self.primary_key)[0]
+        else:
+            col = list(self.columns)[0]
+        return select([func.count(col).label('tbl_row_count')], whereclause, from_obj=[self], **params)
+
+    def insert(self, values=None, inline=False, **kwargs):
+        """Generate an :func:`~sqlalchemy.sql.expression.insert()` construct."""
+
+        return insert(self, values=values, inline=inline, **kwargs)
+
+    def update(self, whereclause=None, values=None, inline=False, **kwargs):
+        """Generate an :func:`~sqlalchemy.sql.expression.update()` construct."""
+
+        return update(self, whereclause=whereclause, values=values, inline=inline, **kwargs)
+
+    def delete(self, whereclause=None, **kwargs):
+        """Generate a :func:`~sqlalchemy.sql.expression.delete()` construct."""
+
+        return delete(self, whereclause, **kwargs)
+
+    @property
+    def _from_objects(self):
+        return [self]
+
+@util.decorator
+def _generative(fn, *args, **kw):
+    """Mark a method as generative."""
+
+    self = args[0]._generate()
+    fn(self, *args[1:], **kw)
+    return self
+
+class _SelectBaseMixin(object):
+    """Base class for ``Select`` and ``CompoundSelects``."""
+
+    supports_execution = True
+
+    def __init__(self,
+            use_labels=False,
+            for_update=False,
+            limit=None,
+            offset=None,
+            order_by=None,
+            group_by=None,
+            bind=None,
+            autocommit=False):
+        self.use_labels = use_labels
+        self.for_update = for_update
+        self._autocommit = autocommit
+        self._limit = limit
+        self._offset = offset
+        self._bind = bind
+
+        self._order_by_clause = ClauseList(*util.to_list(order_by) or [])
+        self._group_by_clause = ClauseList(*util.to_list(group_by) or [])
+
+    def as_scalar(self):
+        """return a 'scalar' representation of this selectable, which can be used
+        as a column expression.
+
+        Typically, a select statement which has only one column in its columns clause
+        is eligible to be used as a scalar expression.
+
+        The returned object is an instance of :class:`~sqlalchemy.sql.expression._ScalarSelect`.
+
+        """
+        return _ScalarSelect(self)
+
+    @_generative
+    def apply_labels(self):
+        """return a new selectable with the 'use_labels' flag set to True.
+
+        This will result in column expressions being generated using labels against their table
+        name, such as "SELECT somecolumn AS tablename_somecolumn".  This allows selectables which
+        contain multiple FROM clauses to produce a unique set of column names regardless of name conflicts
+        among the individual FROM clauses.
+
+        """
+        self.use_labels = True
+
+    def label(self, name):
+        """return a 'scalar' representation of this selectable, embedded as a subquery
+        with a label.
+
+        See also ``as_scalar()``.
+
+        """
+        return self.as_scalar().label(name)
+
+    @_generative
+    def autocommit(self):
+        """return a new selectable with the 'autocommit' flag set to True."""
+
+        self._autocommit = True
+
+    def _generate(self):
+        s = self.__class__.__new__(self.__class__)
+        s.__dict__ = self.__dict__.copy()
+        s._reset_exported()
+        return s
+
+    @_generative
+    def limit(self, limit):
+        """return a new selectable with the given LIMIT criterion applied."""
+
+        self._limit = limit
+
+    @_generative
+    def offset(self, offset):
+        """return a new selectable with the given OFFSET criterion applied."""
+
+        self._offset = offset
+
+    @_generative
+    def order_by(self, *clauses):
+        """return a new selectable with the given list of ORDER BY criterion applied.
+
+        The criterion will be appended to any pre-existing ORDER BY criterion.
+
+        """
+        self.append_order_by(*clauses)
+
+    @_generative
+    def group_by(self, *clauses):
+        """return a new selectable with the given list of GROUP BY criterion applied.
+
+        The criterion will be appended to any pre-existing GROUP BY criterion.
+
+        """
+        self.append_group_by(*clauses)
+
+    def append_order_by(self, *clauses):
+        """Append the given ORDER BY criterion applied to this selectable.
+
+        The criterion will be appended to any pre-existing ORDER BY criterion.
+
+        """
+        if len(clauses) == 1 and clauses[0] is None:
+            self._order_by_clause = ClauseList()
+        else:
+            if getattr(self, '_order_by_clause', None):
+                clauses = list(self._order_by_clause) + list(clauses)
+            self._order_by_clause = ClauseList(*clauses)
+
+    def append_group_by(self, *clauses):
+        """Append the given GROUP BY criterion applied to this selectable.
+
+        The criterion will be appended to any pre-existing GROUP BY criterion.
+
+        """
+        if len(clauses) == 1 and clauses[0] is None:
+            self._group_by_clause = ClauseList()
+        else:
+            if getattr(self, '_group_by_clause', None):
+                clauses = list(self._group_by_clause) + list(clauses)
+            self._group_by_clause = ClauseList(*clauses)
+
+    @property
+    def _from_objects(self):
+        return [self]
+
+
+class _ScalarSelect(_Grouping):
+    _from_objects = []
+
+    def __init__(self, element):
+        self.element = element
+        cols = list(element.c)
+        if len(cols) != 1:
+            raise exc.InvalidRequestError("Scalar select can only be created "
+                    "from a Select object that has exactly one column expression.")
+        self.type = cols[0].type
+
+    @property
+    def columns(self):
+        raise exc.InvalidRequestError("Scalar Select expression has no columns; "
+                    "use this object directly within a column-level expression.")
+    c  = columns
+
+    def self_group(self, **kwargs):
+        return self
+
+    def _make_proxy(self, selectable, name):
+        return list(self.inner_columns)[0]._make_proxy(selectable, name)
+
+class CompoundSelect(_SelectBaseMixin, FromClause):
+    """Forms the basis of ``UNION``, ``UNION ALL``, and other SELECT-based set operations."""
+
+    __visit_name__ = 'compound_select'
+
+    def __init__(self, keyword, *selects, **kwargs):
+        self._should_correlate = kwargs.pop('correlate', False)
+        self.keyword = keyword
+        self.selects = []
+
+        numcols = None
+
+        # some DBs do not like ORDER BY in the inner queries of a UNION, etc.
+        for n, s in enumerate(selects):
+            s = _clause_element_as_expr(s)
+            
+            if not numcols:
+                numcols = len(s.c)
+            elif len(s.c) != numcols:
+                raise exc.ArgumentError(
+                        "All selectables passed to CompoundSelect must "
+                        "have identical numbers of columns; select #%d has %d columns, select #%d has %d" %
+                        (1, len(self.selects[0].c), n+1, len(s.c))
+                )
+
+            # unions group from left to right, so don't group first select
+            if n:
+                self.selects.append(s.self_group(self))
+            else:
+                self.selects.append(s)
+
+        _SelectBaseMixin.__init__(self, **kwargs)
+
+    def self_group(self, against=None):
+        return _FromGrouping(self)
+
+    def is_derived_from(self, fromclause):
+        for s in self.selects:
+            if s.is_derived_from(fromclause):
+                return True
+        return False
+
+    def _populate_column_collection(self):
+        for cols in zip(*[s.c for s in self.selects]):
+            # this is a slightly hacky thing - the union exports a column that
+            # resembles just that of the *first* selectable.  to get at a "composite" column,
+            # particularly foreign keys, you have to dig through the proxies collection 
+            # which we generate below.  We may want to improve upon this,
+            # such as perhaps _make_proxy can accept a list of other columns that
+            # are "shared" - schema.column can then copy all the ForeignKeys in.
+            # this would allow the union() to have all those fks too.
+            proxy = cols[0]._make_proxy(
+                            self, name=self.use_labels and cols[0]._label or None)
+            
+            # hand-construct the "proxies" collection to include all derived columns
+            # place a 'weight' annotation corresponding to how low in the list of
+            # select()s the column occurs, so that the corresponding_column() operation
+            # can resolve conflicts
+            proxy.proxies = [c._annotate({'weight':i + 1}) for i, c in enumerate(cols)]
+            
+    def _copy_internals(self, clone=_clone):
+        self._reset_exported()
+        self.selects = [clone(s) for s in self.selects]
+        if hasattr(self, '_col_map'):
+            del self._col_map
+        for attr in ('_order_by_clause', '_group_by_clause'):
+            if getattr(self, attr) is not None:
+                setattr(self, attr, clone(getattr(self, attr)))
+
+    def get_children(self, column_collections=True, **kwargs):
+        return (column_collections and list(self.c) or []) + \
+            [self._order_by_clause, self._group_by_clause] + list(self.selects)
+
+    def bind(self):
+        if self._bind:
+            return self._bind
+        for s in self.selects:
+            e = s.bind
+            if e:
+                return e
+        else:
+            return None
+    def _set_bind(self, bind):
+        self._bind = bind
+    bind = property(bind, _set_bind)
+
+class Select(_SelectBaseMixin, FromClause):
+    """Represents a ``SELECT`` statement.
+
+    Select statements support appendable clauses, as well as the
+    ability to execute themselves and return a result set.
+
+    """
+
+    __visit_name__ = 'select'
+
+    def __init__(self, columns, whereclause=None, from_obj=None, distinct=False, having=None, correlate=True, prefixes=None, **kwargs):
+        """Construct a Select object.
+
+        The public constructor for Select is the
+        :func:`~sqlalchemy.sql.expression.select` function; see that function for
+        argument descriptions.
+
+        Additional generative and mutator methods are available on the
+        :class:`~sqlalchemy.sql.expression._SelectBaseMixin` superclass.
+
+        """
+        self._should_correlate = correlate
+        self._distinct = distinct
+
+        self._correlate = set()
+        self._froms = util.OrderedSet()
+
+        if columns:
+            self._raw_columns = [
+                isinstance(c, _ScalarSelect) and c.self_group(against=operators.comma_op) or c
+                for c in
+                [_literal_as_column(c) for c in columns]
+            ]
+
+            self._froms.update(_from_objects(*self._raw_columns))
+        else:
+            self._raw_columns = []
+
+        if whereclause:
+            self._whereclause = _literal_as_text(whereclause)
+            self._froms.update(_from_objects(self._whereclause))
+        else:
+            self._whereclause = None
+
+        if from_obj:
+            self._froms.update(
+                _is_literal(f) and _TextClause(f) or f
+                for f in util.to_list(from_obj))
+
+        if having:
+            self._having = _literal_as_text(having)
+        else:
+            self._having = None
+
+        if prefixes:
+            self._prefixes = [_literal_as_text(p) for p in prefixes]
+        else:
+            self._prefixes = []
+
+        _SelectBaseMixin.__init__(self, **kwargs)
+
+    def _get_display_froms(self, existing_froms=None):
+        """Return the full list of 'from' clauses to be displayed.
+
+        Takes into account a set of existing froms which may be
+        rendered in the FROM clause of enclosing selects; this Select
+        may want to leave those absent if it is automatically
+        correlating.
+
+        """
+        froms = self._froms
+
+        toremove = itertools.chain(*[f._hide_froms for f in froms])
+        if toremove:
+            froms = froms.difference(toremove)
+
+        if len(froms) > 1 or self._correlate:
+            if self._correlate:
+                froms = froms.difference(_cloned_intersection(froms, self._correlate))
+
+            if self._should_correlate and existing_froms:
+                froms = froms.difference(_cloned_intersection(froms, existing_froms))
+
+                if not len(froms):
+                    raise exc.InvalidRequestError(
+                            "Select statement '%s' returned no FROM clauses "
+                            "due to auto-correlation; specify correlate(<tables>) "
+                            "to control correlation manually." % self)
+
+        return froms
+
+    @property
+    def froms(self):
+        """Return the displayed list of FromClause elements."""
+
+        return self._get_display_froms()
+
+    @property
+    def type(self):
+        raise exc.InvalidRequestError("Select objects don't have a type.  "
+                    "Call as_scalar() on this Select object "
+                    "to return a 'scalar' version of this Select.")
+
+    @util.memoized_instancemethod
+    def locate_all_froms(self):
+        """return a Set of all FromClause elements referenced by this Select.
+
+        This set is a superset of that returned by the ``froms`` property, which
+        is specifically for those FromClause elements that would actually be rendered.
+
+        """
+        return self._froms.union(_from_objects(*list(self._froms)))
+
+    @property
+    def inner_columns(self):
+        """an iterator of all ColumnElement expressions which would
+        be rendered into the columns clause of the resulting SELECT statement.
+
+        """
+
+        return itertools.chain(*[c._select_iterable for c in self._raw_columns])
+
+    def is_derived_from(self, fromclause):
+        if self in fromclause._cloned_set:
+            return True
+
+        for f in self.locate_all_froms():
+            if f.is_derived_from(fromclause):
+                return True
+        return False
+
+    def _copy_internals(self, clone=_clone):
+        self._reset_exported()
+        from_cloned = dict((f, clone(f))
+                           for f in self._froms.union(self._correlate))
+        self._froms = set(from_cloned[f] for f in self._froms)
+        self._correlate = set(from_cloned[f] for f in self._correlate)
+        self._raw_columns = [clone(c) for c in self._raw_columns]
+        for attr in ('_whereclause', '_having', '_order_by_clause', '_group_by_clause'):
+            if getattr(self, attr) is not None:
+                setattr(self, attr, clone(getattr(self, attr)))
+
+    def get_children(self, column_collections=True, **kwargs):
+        """return child elements as per the ClauseElement specification."""
+
+        return (column_collections and list(self.columns) or []) + \
+            self._raw_columns + list(self._froms) + \
+            [x for x in (self._whereclause, self._having, self._order_by_clause, self._group_by_clause) if x is not None]
+
+    @_generative
+    def column(self, column):
+        """return a new select() construct with the given column expression added to its columns clause."""
+
+        column = _literal_as_column(column)
+
+        if isinstance(column, _ScalarSelect):
+            column = column.self_group(against=operators.comma_op)
+
+        self._raw_columns = self._raw_columns + [column]
+        self._froms = self._froms.union(_from_objects(column))
+
+    @_generative
+    def with_only_columns(self, columns):
+        """return a new select() construct with its columns clause replaced with the given columns."""
+
+        self._raw_columns = [
+                isinstance(c, _ScalarSelect) and c.self_group(against=operators.comma_op) or c
+                for c in
+                [_literal_as_column(c) for c in columns]
+            ]
+
+    @_generative
+    def where(self, whereclause):
+        """return a new select() construct with the given expression added to its WHERE clause, joined
+        to the existing clause via AND, if any."""
+
+        self.append_whereclause(whereclause)
+
+    @_generative
+    def having(self, having):
+        """return a new select() construct with the given expression added to its HAVING clause, joined
+        to the existing clause via AND, if any."""
+
+        self.append_having(having)
+
+    @_generative
+    def distinct(self):
+        """return a new select() construct which will apply DISTINCT to its columns clause."""
+
+        self._distinct = True
+
+    @_generative
+    def prefix_with(self, clause):
+        """return a new select() construct which will apply the given expression to the start of its
+        columns clause, not using any commas."""
+
+        clause = _literal_as_text(clause)
+        self._prefixes = self._prefixes + [clause]
+
+    @_generative
+    def select_from(self, fromclause):
+        """return a new select() construct with the given FROM expression applied to its list of
+        FROM objects."""
+
+        fromclause = _literal_as_text(fromclause)
+        self._froms = self._froms.union([fromclause])
+
+    @_generative
+    def correlate(self, *fromclauses):
+        """return a new select() construct which will correlate the given FROM clauses to that
+        of an enclosing select(), if a match is found.
+
+        By "match", the given fromclause must be present in this select's list of FROM objects
+        and also present in an enclosing select's list of FROM objects.
+
+        Calling this method turns off the select's default behavior of "auto-correlation".  Normally,
+        select() auto-correlates all of its FROM clauses to those of an embedded select when
+        compiled.
+
+        If the fromclause is None, correlation is disabled for the returned select().
+
+        """
+        self._should_correlate = False
+        if fromclauses == (None,):
+            self._correlate = set()
+        else:
+            self._correlate = self._correlate.union(fromclauses)
+
+    def append_correlation(self, fromclause):
+        """append the given correlation expression to this select() construct."""
+
+        self._should_correlate = False
+        self._correlate = self._correlate.union([fromclause])
+
+    def append_column(self, column):
+        """append the given column expression to the columns clause of this select() construct."""
+
+        column = _literal_as_column(column)
+
+        if isinstance(column, _ScalarSelect):
+            column = column.self_group(against=operators.comma_op)
+
+        self._raw_columns = self._raw_columns + [column]
+        self._froms = self._froms.union(_from_objects(column))
+        self._reset_exported()
+
+    def append_prefix(self, clause):
+        """append the given columns clause prefix expression to this select() construct."""
+
+        clause = _literal_as_text(clause)
+        self._prefixes = self._prefixes.union([clause])
+
+    def append_whereclause(self, whereclause):
+        """append the given expression to this select() construct's WHERE criterion.
+
+        The expression will be joined to existing WHERE criterion via AND.
+
+        """
+        whereclause = _literal_as_text(whereclause)
+        self._froms = self._froms.union(_from_objects(whereclause))
+
+        if self._whereclause is not None:
+            self._whereclause = and_(self._whereclause, whereclause)
+        else:
+            self._whereclause = whereclause
+
+    def append_having(self, having):
+        """append the given expression to this select() construct's HAVING criterion.
+
+        The expression will be joined to existing HAVING criterion via AND.
+
+        """
+        if self._having is not None:
+            self._having = and_(self._having, _literal_as_text(having))
+        else:
+            self._having = _literal_as_text(having)
+
+    def append_from(self, fromclause):
+        """append the given FromClause expression to this select() construct's FROM clause.
+
+        """
+        if _is_literal(fromclause):
+            fromclause = _TextClause(fromclause)
+
+        self._froms = self._froms.union([fromclause])
+
+    def __exportable_columns(self):
+        for column in self._raw_columns:
+            if isinstance(column, Selectable):
+                for co in column.columns:
+                    yield co
+            elif isinstance(column, ColumnElement):
+                yield column
+            else:
+                continue
+
+    def _populate_column_collection(self):
+        for c in self.__exportable_columns():
+            c._make_proxy(self, name=self.use_labels and c._label or None)
+
+    def self_group(self, against=None):
+        """return a 'grouping' construct as per the ClauseElement specification.
+
+        This produces an element that can be embedded in an expression.  Note that
+        this method is called automatically as needed when constructing expressions.
+
+        """
+        if isinstance(against, CompoundSelect):
+            return self
+        return _FromGrouping(self)
+
+    def union(self, other, **kwargs):
+        """return a SQL UNION of this select() construct against the given selectable."""
+
+        return union(self, other, **kwargs)
+
+    def union_all(self, other, **kwargs):
+        """return a SQL UNION ALL of this select() construct against the given selectable."""
+
+        return union_all(self, other, **kwargs)
+
+    def except_(self, other, **kwargs):
+        """return a SQL EXCEPT of this select() construct against the given selectable."""
+
+        return except_(self, other, **kwargs)
+
+    def except_all(self, other, **kwargs):
+        """return a SQL EXCEPT ALL of this select() construct against the given selectable."""
+
+        return except_all(self, other, **kwargs)
+
+    def intersect(self, other, **kwargs):
+        """return a SQL INTERSECT of this select() construct against the given selectable."""
+
+        return intersect(self, other, **kwargs)
+
+    def intersect_all(self, other, **kwargs):
+        """return a SQL INTERSECT ALL of this select() construct against the given selectable."""
+
+        return intersect_all(self, other, **kwargs)
+
+    def bind(self):
+        if self._bind:
+            return self._bind
+        if not self._froms:
+            for c in self._raw_columns:
+                e = c.bind
+                if e:
+                    self._bind = e
+                    return e
+        else:
+            e = list(self._froms)[0].bind
+            if e:
+                self._bind = e
+                return e
+
+        return None
+
+    def _set_bind(self, bind):
+        self._bind = bind
+    bind = property(bind, _set_bind)
+
+class _UpdateBase(ClauseElement):
+    """Form the base for ``INSERT``, ``UPDATE``, and ``DELETE`` statements."""
+
+    __visit_name__ = 'update_base'
+
+    supports_execution = True
+    _autocommit = True
+
+    def _generate(self):
+        s = self.__class__.__new__(self.__class__)
+        s.__dict__ = self.__dict__.copy()
+        return s
+
+    def _process_colparams(self, parameters):
+        if isinstance(parameters, (list, tuple)):
+            pp = {}
+            for i, c in enumerate(self.table.c):
+                pp[c.key] = parameters[i]
+            return pp
+        else:
+            return parameters
+
+    def params(self, *arg, **kw):
+        raise NotImplementedError("params() is not supported for INSERT/UPDATE/DELETE statements."
+            "  To set the values for an INSERT or UPDATE statement, use stmt.values(**parameters).")
+
+    def bind(self):
+        return self._bind or self.table.bind
+
+    def _set_bind(self, bind):
+        self._bind = bind
+    bind = property(bind, _set_bind)
+
+class _ValuesBase(_UpdateBase):
+
+    __visit_name__ = 'values_base'
+
+    def __init__(self, table, values):
+        self.table = table
+        self.parameters = self._process_colparams(values)
+
+    @_generative
+    def values(self, *args, **kwargs):
+        """specify the VALUES clause for an INSERT statement, or the SET clause for an UPDATE.
+
+            \**kwargs
+                key=<somevalue> arguments
+
+            \*args
+                A single dictionary can be sent as the first positional argument.  This allows
+                non-string based keys, such as Column objects, to be used.
+
+        """
+        if args:
+            v = args[0]
+        else:
+            v = {}
+
+        if self.parameters is None:
+            self.parameters = self._process_colparams(v)
+            self.parameters.update(kwargs)
+        else:
+            self.parameters = self.parameters.copy()
+            self.parameters.update(self._process_colparams(v))
+            self.parameters.update(kwargs)
+
+class Insert(_ValuesBase):
+    """Represent an INSERT construct.
+
+    The ``Insert`` object is created using the :func:`insert()` function.
+
+    """
+    __visit_name__ = 'insert'
+
+    def __init__(self, table, values=None, inline=False, bind=None, prefixes=None, **kwargs):
+        _ValuesBase.__init__(self, table, values)
+        self._bind = bind
+        self.select = None
+        self.inline = inline
+        if prefixes:
+            self._prefixes = [_literal_as_text(p) for p in prefixes]
+        else:
+            self._prefixes = []
+        self.kwargs = kwargs
+
+    def get_children(self, **kwargs):
+        if self.select is not None:
+            return self.select,
+        else:
+            return ()
+
+    def _copy_internals(self, clone=_clone):
+        # TODO: coverage
+        self.parameters = self.parameters.copy()
+
+    @_generative
+    def prefix_with(self, clause):
+        """Add a word or expression between INSERT and INTO. Generative.
+
+        If multiple prefixes are supplied, they will be separated with
+        spaces.
+
+        """
+        clause = _literal_as_text(clause)
+        self._prefixes = self._prefixes + [clause]
+
+class Update(_ValuesBase):
+    """Represent an Update construct.
+
+    The ``Update`` object is created using the :func:`update()` function.
+
+    """
+    __visit_name__ = 'update'
+
+    def __init__(self, table, whereclause, values=None, inline=False, bind=None, **kwargs):
+        _ValuesBase.__init__(self, table, values)
+        self._bind = bind
+        if whereclause:
+            self._whereclause = _literal_as_text(whereclause)
+        else:
+            self._whereclause = None
+        self.inline = inline
+        self.kwargs = kwargs
+
+    def get_children(self, **kwargs):
+        if self._whereclause is not None:
+            return self._whereclause,
+        else:
+            return ()
+
+    def _copy_internals(self, clone=_clone):
+        # TODO: coverage
+        self._whereclause = clone(self._whereclause)
+        self.parameters = self.parameters.copy()
+
+    @_generative
+    def where(self, whereclause):
+        """return a new update() construct with the given expression added to its WHERE clause, joined
+        to the existing clause via AND, if any."""
+
+        if self._whereclause is not None:
+            self._whereclause = and_(self._whereclause, _literal_as_text(whereclause))
+        else:
+            self._whereclause = _literal_as_text(whereclause)
+
+
+class Delete(_UpdateBase):
+    """Represent a DELETE construct.
+
+    The ``Delete`` object is created using the :func:`delete()` function.
+
+    """
+
+    __visit_name__ = 'delete'
+
+    def __init__(self, table, whereclause, bind=None, **kwargs):
+        self._bind = bind
+        self.table = table
+        if whereclause:
+            self._whereclause = _literal_as_text(whereclause)
+        else:
+            self._whereclause = None
+
+        self.kwargs = kwargs
+
+    def get_children(self, **kwargs):
+        if self._whereclause is not None:
+            return self._whereclause,
+        else:
+            return ()
+
+    @_generative
+    def where(self, whereclause):
+        """Add the given WHERE clause to a newly returned delete construct."""
+
+        if self._whereclause is not None:
+            self._whereclause = and_(self._whereclause, _literal_as_text(whereclause))
+        else:
+            self._whereclause = _literal_as_text(whereclause)
+
+    def _copy_internals(self, clone=_clone):
+        # TODO: coverage
+        self._whereclause = clone(self._whereclause)
+
+class _IdentifiedClause(ClauseElement):
+    __visit_name__ = 'identified'
+    supports_execution = True
+    _autocommit = False
+    quote = None
+
+    def __init__(self, ident):
+        self.ident = ident
+
+class SavepointClause(_IdentifiedClause):
+    __visit_name__ = 'savepoint'
+
+class RollbackToSavepointClause(_IdentifiedClause):
+    __visit_name__ = 'rollback_to_savepoint'
+
+class ReleaseSavepointClause(_IdentifiedClause):
+    __visit_name__ = 'release_savepoint'
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/sql/visitors.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/sql/visitors.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/sql/visitors.py (revision 3)
@@ -0,0 +1,259 @@
+"""Visitor/traversal interface and library functions.
+
+SQLAlchemy schema and expression constructs rely on a Python-centric
+version of the classic "visitor" pattern as the primary way in which
+they apply functionality.  The most common use of this pattern 
+is statement compilation, where individual expression classes match 
+up to rendering methods that produce a string result.   Beyond this, 
+the visitor system is also used to inspect expressions for various 
+information and patterns, as well as for usage in 
+some kinds of expression transformation.  Other kinds of transformation
+use a non-visitor traversal system.
+
+For many examples of how the visit system is used, see the 
+sqlalchemy.sql.util and the sqlalchemy.sql.compiler modules.
+For an introduction to clause adaption, see
+http://techspot.zzzeek.org/?p=19 .
+
+"""
+
+from collections import deque
+import re
+from sqlalchemy import util
+import operator
+
+__all__ = ['VisitableType', 'Visitable', 'ClauseVisitor', 
+    'CloningVisitor', 'ReplacingCloningVisitor', 'iterate', 
+    'iterate_depthfirst', 'traverse_using', 'traverse',
+    'cloned_traverse', 'replacement_traverse']
+    
+class VisitableType(type):
+    """Metaclass which checks for a `__visit_name__` attribute and
+    applies `_compiler_dispatch` method to classes.
+    
+    """
+    
+    def __init__(cls, clsname, bases, clsdict):
+        if cls.__name__ == 'Visitable':
+            super(VisitableType, cls).__init__(clsname, bases, clsdict)
+            return
+        
+        assert hasattr(cls, '__visit_name__'), "`Visitable` descendants " \
+                                               "should define `__visit_name__`"
+        
+        # set up an optimized visit dispatch function
+        # for use by the compiler
+        visit_name = cls.__visit_name__
+        if isinstance(visit_name, str):
+            getter = operator.attrgetter("visit_%s" % visit_name)
+            def _compiler_dispatch(self, visitor, **kw):
+                return getter(visitor)(self, **kw)
+        else:
+            def _compiler_dispatch(self, visitor, **kw):
+                return getattr(visitor, 'visit_%s' % self.__visit_name__)(self, **kw)
+    
+        cls._compiler_dispatch = _compiler_dispatch
+        
+        super(VisitableType, cls).__init__(clsname, bases, clsdict)
+
+class Visitable(object):
+    """Base class for visitable objects, applies the
+    ``VisitableType`` metaclass.
+    
+    """
+
+    __metaclass__ = VisitableType
+
+class ClauseVisitor(object):
+    """Base class for visitor objects which can traverse using 
+    the traverse() function.
+    
+    """
+    
+    __traverse_options__ = {}
+    
+    def traverse_single(self, obj):
+        for v in self._visitor_iterator:
+            meth = getattr(v, "visit_%s" % obj.__visit_name__, None)
+            if meth:
+                return meth(obj)
+    
+    def iterate(self, obj):
+        """traverse the given expression structure, returning an iterator of all elements."""
+
+        return iterate(obj, self.__traverse_options__)
+        
+    def traverse(self, obj):
+        """traverse and visit the given expression structure."""
+
+        return traverse(obj, self.__traverse_options__, self._visitor_dict)
+    
+    @util.memoized_property
+    def _visitor_dict(self):
+        visitors = {}
+
+        for name in dir(self):
+            if name.startswith('visit_'):
+                visitors[name[6:]] = getattr(self, name)
+        return visitors
+        
+    @property
+    def _visitor_iterator(self):
+        """iterate through this visitor and each 'chained' visitor."""
+        
+        v = self
+        while v:
+            yield v
+            v = getattr(v, '_next', None)
+
+    def chain(self, visitor):
+        """'chain' an additional ClauseVisitor onto this ClauseVisitor.
+        
+        the chained visitor will receive all visit events after this one.
+        
+        """
+        tail = list(self._visitor_iterator)[-1]
+        tail._next = visitor
+        return self
+
+class CloningVisitor(ClauseVisitor):
+    """Base class for visitor objects which can traverse using 
+    the cloned_traverse() function.
+    
+    """
+
+    def copy_and_process(self, list_):
+        """Apply cloned traversal to the given list of elements, and return the new list."""
+
+        return [self.traverse(x) for x in list_]
+
+    def traverse(self, obj):
+        """traverse and visit the given expression structure."""
+
+        return cloned_traverse(obj, self.__traverse_options__, self._visitor_dict)
+
+class ReplacingCloningVisitor(CloningVisitor):
+    """Base class for visitor objects which can traverse using 
+    the replacement_traverse() function.
+    
+    """
+
+    def replace(self, elem):
+        """receive pre-copied elements during a cloning traversal.
+        
+        If the method returns a new element, the element is used 
+        instead of creating a simple copy of the element.  Traversal 
+        will halt on the newly returned element if it is re-encountered.
+        """
+        return None
+
+    def traverse(self, obj):
+        """traverse and visit the given expression structure."""
+
+        def replace(elem):
+            for v in self._visitor_iterator:
+                e = v.replace(elem)
+                if e:
+                    return e
+        return replacement_traverse(obj, self.__traverse_options__, replace)
+
+def iterate(obj, opts):
+    """traverse the given expression structure, returning an iterator.
+    
+    traversal is configured to be breadth-first.
+    
+    """
+    stack = deque([obj])
+    while stack:
+        t = stack.popleft()
+        yield t
+        for c in t.get_children(**opts):
+            stack.append(c)
+
+def iterate_depthfirst(obj, opts):
+    """traverse the given expression structure, returning an iterator.
+    
+    traversal is configured to be depth-first.
+    
+    """
+    stack = deque([obj])
+    traversal = deque()
+    while stack:
+        t = stack.pop()
+        traversal.appendleft(t)
+        for c in t.get_children(**opts):
+            stack.append(c)
+    return iter(traversal)
+
+def traverse_using(iterator, obj, visitors):
+    """visit the given expression structure using the given iterator of objects."""
+
+    for target in iterator:
+        meth = visitors.get(target.__visit_name__, None)
+        if meth:
+            meth(target)
+    return obj
+    
+def traverse(obj, opts, visitors):
+    """traverse and visit the given expression structure using the default iterator."""
+
+    return traverse_using(iterate(obj, opts), obj, visitors)
+
+def traverse_depthfirst(obj, opts, visitors):
+    """traverse and visit the given expression structure using the depth-first iterator."""
+
+    return traverse_using(iterate_depthfirst(obj, opts), obj, visitors)
+
+def cloned_traverse(obj, opts, visitors):
+    """clone the given expression structure, allowing modifications by visitors."""
+    
+    cloned = util.column_dict()
+
+    def clone(element):
+        if element not in cloned:
+            cloned[element] = element._clone()
+        return cloned[element]
+
+    obj = clone(obj)
+    stack = [obj]
+
+    while stack:
+        t = stack.pop()
+        if t in cloned:
+            continue
+        t._copy_internals(clone=clone)
+
+        meth = visitors.get(t.__visit_name__, None)
+        if meth:
+            meth(t)
+
+        for c in t.get_children(**opts):
+            stack.append(c)
+    return obj
+
+def replacement_traverse(obj, opts, replace):
+    """clone the given expression structure, allowing element replacement by a given replacement function."""
+    
+    cloned = util.column_dict()
+    stop_on = util.column_set(opts.get('stop_on', []))
+
+    def clone(element):
+        newelem = replace(element)
+        if newelem:
+            stop_on.add(newelem)
+            return newelem
+
+        if element not in cloned:
+            cloned[element] = element._clone()
+        return cloned[element]
+
+    obj = clone(obj)
+    stack = [obj]
+    while stack:
+        t = stack.pop()
+        if t in stop_on:
+            continue
+        t._copy_internals(clone=clone)
+        for c in t.get_children(**opts):
+            stack.append(c)
+    return obj
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/pool.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/pool.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/pool.py (revision 3)
@@ -0,0 +1,931 @@
+# pool.py - Connection pooling for SQLAlchemy
+# Copyright (C) 2005, 2006, 2007, 2008, 2009 Michael Bayer mike_mp@zzzcomputing.com
+#
+# This module is part of SQLAlchemy and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+
+"""Connection pooling for DB-API connections.
+
+Provides a number of connection pool implementations for a variety of
+usage scenarios and thread behavior requirements imposed by the
+application, DB-API or database itself.
+
+Also provides a DB-API 2.0 connection proxying mechanism allowing
+regular DB-API connect() methods to be transparently managed by a
+SQLAlchemy connection pool.
+"""
+
+import weakref, time, threading
+
+from sqlalchemy import exc, log
+from sqlalchemy import queue as Queue
+from sqlalchemy.util import threading, pickle, as_interface
+
+proxies = {}
+
+def manage(module, **params):
+    """Return a proxy for a DB-API module that automatically pools connections.
+
+    Given a DB-API 2.0 module and pool management parameters, returns
+    a proxy for the module that will automatically pool connections,
+    creating new connection pools for each distinct set of connection
+    arguments sent to the decorated module's connect() function.
+
+    :param module: a DB-API 2.0 database module
+
+    :param poolclass: the class used by the pool module to provide
+      pooling.  Defaults to :class:`QueuePool`.
+
+    :param \*\*params: will be passed through to *poolclass*
+
+    """
+    try:
+        return proxies[module]
+    except KeyError:
+        return proxies.setdefault(module, _DBProxy(module, **params))
+
+def clear_managers():
+    """Remove all current DB-API 2.0 managers.
+
+    All pools and connections are disposed.
+    """
+
+    for manager in proxies.values():
+        manager.close()
+    proxies.clear()
+
+class Pool(object):
+    """Abstract base class for connection pools."""
+
+    def __init__(self, creator, recycle=-1, echo=None, use_threadlocal=False,
+                 reset_on_return=True, listeners=None):
+        """
+        Construct a Pool.
+
+        :param creator: a callable function that returns a DB-API
+          connection object.  The function will be called with
+          parameters.
+
+        :param recycle: If set to non -1, number of seconds between
+          connection recycling, which means upon checkout, if this
+          timeout is surpassed the connection will be closed and
+          replaced with a newly opened connection. Defaults to -1.
+
+        :param echo: If True, connections being pulled and retrieved
+          from the pool will be logged to the standard output, as well
+          as pool sizing information.  Echoing can also be achieved by
+          enabling logging for the "sqlalchemy.pool"
+          namespace. Defaults to False.
+
+        :param use_threadlocal: If set to True, repeated calls to
+          :meth:`connect` within the same application thread will be
+          guaranteed to return the same connection object, if one has
+          already been retrieved from the pool and has not been
+          returned yet.  Offers a slight performance advantage at the
+          cost of individual transactions by default.  The
+          :meth:`unique_connection` method is provided to bypass the
+          threadlocal behavior installed into :meth:`connect`.
+
+        :param reset_on_return: If true, reset the database state of
+          connections returned to the pool.  This is typically a
+          ROLLBACK to release locks and transaction resources.
+          Disable at your own peril.  Defaults to True.
+
+        :param listeners: A list of
+          :class:`~sqlalchemy.interfaces.PoolListener`-like objects or
+          dictionaries of callables that receive events when DB-API
+          connections are created, checked out and checked in to the
+          pool.
+
+        """
+        self.logger = log.instance_logger(self, echoflag=echo)
+        self._threadconns = threading.local()
+        self._creator = creator
+        self._recycle = recycle
+        self._use_threadlocal = use_threadlocal
+        self._reset_on_return = reset_on_return
+        self.echo = echo
+        self.listeners = []
+        self._on_connect = []
+        self._on_checkout = []
+        self._on_checkin = []
+
+        if listeners:
+            for l in listeners:
+                self.add_listener(l)
+
+    def unique_connection(self):
+        return _ConnectionFairy(self).checkout()
+
+    def create_connection(self):
+        return _ConnectionRecord(self)
+
+    def recreate(self):
+        """Return a new instance with identical creation arguments."""
+
+        raise NotImplementedError()
+
+    def dispose(self):
+        """Dispose of this pool.
+
+        This method leaves the possibility of checked-out connections
+        remaining open, It is advised to not reuse the pool once dispose()
+        is called, and to instead use a new pool constructed by the
+        recreate() method.
+        """
+
+        raise NotImplementedError()
+
+    def connect(self):
+        if not self._use_threadlocal:
+            return _ConnectionFairy(self).checkout()
+
+        try:
+            rec = self._threadconns.current()
+            if rec:
+                return rec.checkout()
+        except AttributeError:
+            pass
+
+        agent = _ConnectionFairy(self)
+        self._threadconns.current = weakref.ref(agent)
+        return agent.checkout()
+
+    def return_conn(self, record):
+        if self._use_threadlocal and hasattr(self._threadconns, "current"):
+            del self._threadconns.current
+        self.do_return_conn(record)
+
+    def get(self):
+        return self.do_get()
+
+    def do_get(self):
+        raise NotImplementedError()
+
+    def do_return_conn(self, conn):
+        raise NotImplementedError()
+
+    def status(self):
+        raise NotImplementedError()
+
+    def add_listener(self, listener):
+        """Add a ``PoolListener``-like object to this pool.
+
+        ``listener`` may be an object that implements some or all of
+        PoolListener, or a dictionary of callables containing implementations
+        of some or all of the named methods in PoolListener.
+
+        """
+
+        listener = as_interface(
+            listener, methods=('connect', 'checkout', 'checkin'))
+
+        self.listeners.append(listener)
+        if hasattr(listener, 'connect'):
+            self._on_connect.append(listener)
+        if hasattr(listener, 'checkout'):
+            self._on_checkout.append(listener)
+        if hasattr(listener, 'checkin'):
+            self._on_checkin.append(listener)
+
+    def log(self, msg):
+        self.logger.info(msg)
+
+class _ConnectionRecord(object):
+    def __init__(self, pool):
+        self.__pool = pool
+        self.connection = self.__connect()
+        self.info = {}
+        if pool._on_connect:
+            for l in pool._on_connect:
+                l.connect(self.connection, self)
+
+    def close(self):
+        if self.connection is not None:
+            if self.__pool._should_log_info:
+                self.__pool.log("Closing connection %r" % self.connection)
+            try:
+                self.connection.close()
+            except (SystemExit, KeyboardInterrupt):
+                raise
+            except:
+                if self.__pool._should_log_info:
+                    self.__pool.log("Exception closing connection %r" %
+                                    self.connection)
+
+    def invalidate(self, e=None):
+        if self.__pool._should_log_info:
+            if e is not None:
+                self.__pool.log("Invalidate connection %r (reason: %s:%s)" %
+                                (self.connection, e.__class__.__name__, e))
+            else:
+                self.__pool.log("Invalidate connection %r" % self.connection)
+        self.__close()
+        self.connection = None
+
+    def get_connection(self):
+        if self.connection is None:
+            self.connection = self.__connect()
+            self.info.clear()
+            if self.__pool._on_connect:
+                for l in self.__pool._on_connect:
+                    l.connect(self.connection, self)
+        elif (self.__pool._recycle > -1 and time.time() - self.starttime > self.__pool._recycle):
+            if self.__pool._should_log_info:
+                self.__pool.log("Connection %r exceeded timeout; recycling" %
+                                self.connection)
+            self.__close()
+            self.connection = self.__connect()
+            self.info.clear()
+            if self.__pool._on_connect:
+                for l in self.__pool._on_connect:
+                    l.connect(self.connection, self)
+        return self.connection
+
+    def __close(self):
+        try:
+            if self.__pool._should_log_info:
+                self.__pool.log("Closing connection %r" % self.connection)
+            self.connection.close()
+        except Exception, e:
+            if self.__pool._should_log_info:
+                self.__pool.log("Connection %r threw an error on close: %s" %
+                                (self.connection, e))
+            if isinstance(e, (SystemExit, KeyboardInterrupt)):
+                raise
+
+    def __connect(self):
+        try:
+            self.starttime = time.time()
+            connection = self.__pool._creator()
+            if self.__pool._should_log_info:
+                self.__pool.log("Created new connection %r" % connection)
+            return connection
+        except Exception, e:
+            if self.__pool._should_log_info:
+                self.__pool.log("Error on connect(): %s" % e)
+            raise
+
+
+def _finalize_fairy(connection, connection_record, pool, ref=None):
+    if ref is not None and connection_record.backref is not ref:
+        return
+    if connection is not None:
+        try:
+            if pool._reset_on_return:
+                connection.rollback()
+            # Immediately close detached instances
+            if connection_record is None:
+                connection.close()
+        except Exception, e:
+            if connection_record is not None:
+                connection_record.invalidate(e=e)
+            if isinstance(e, (SystemExit, KeyboardInterrupt)):
+                raise
+    if connection_record is not None:
+        connection_record.backref = None
+        if pool._should_log_info:
+            pool.log("Connection %r being returned to pool" % connection)
+        if pool._on_checkin:
+            for l in pool._on_checkin:
+                l.checkin(connection, connection_record)
+        pool.return_conn(connection_record)
+
+class _ConnectionFairy(object):
+    """Proxies a DB-API connection and provides return-on-dereference support."""
+
+    __slots__ = '_pool', '__counter', 'connection', '_connection_record', '__weakref__', '_detached_info'
+    
+    def __init__(self, pool):
+        self._pool = pool
+        self.__counter = 0
+        try:
+            rec = self._connection_record = pool.get()
+            conn = self.connection = self._connection_record.get_connection()
+            self._connection_record.backref = weakref.ref(self, lambda ref:_finalize_fairy(conn, rec, pool, ref))
+        except:
+            self.connection = None # helps with endless __getattr__ loops later on
+            self._connection_record = None
+            raise
+        if self._pool._should_log_info:
+            self._pool.log("Connection %r checked out from pool" %
+                           self.connection)
+
+    @property
+    def _logger(self):
+        return self._pool.logger
+
+    @property
+    def is_valid(self):
+        return self.connection is not None
+
+    @property
+    def info(self):
+        """An info collection unique to this DB-API connection."""
+
+        try:
+            return self._connection_record.info
+        except AttributeError:
+            if self.connection is None:
+                raise exc.InvalidRequestError("This connection is closed")
+            try:
+                return self._detached_info
+            except AttributeError:
+                self._detached_info = value = {}
+                return value
+
+    def invalidate(self, e=None):
+        """Mark this connection as invalidated.
+
+        The connection will be immediately closed.  The containing
+        ConnectionRecord will create a new connection when next used.
+        """
+
+        if self.connection is None:
+            raise exc.InvalidRequestError("This connection is closed")
+        if self._connection_record is not None:
+            self._connection_record.invalidate(e=e)
+        self.connection = None
+        self._close()
+
+    def cursor(self, *args, **kwargs):
+        try:
+            c = self.connection.cursor(*args, **kwargs)
+            return _CursorFairy(self, c)
+        except Exception, e:
+            self.invalidate(e=e)
+            raise
+
+    def __getattr__(self, key):
+        return getattr(self.connection, key)
+
+    def checkout(self):
+        if self.connection is None:
+            raise exc.InvalidRequestError("This connection is closed")
+        self.__counter += 1
+
+        if not self._pool._on_checkout or self.__counter != 1:
+            return self
+
+        # Pool listeners can trigger a reconnection on checkout
+        attempts = 2
+        while attempts > 0:
+            try:
+                for l in self._pool._on_checkout:
+                    l.checkout(self.connection, self._connection_record, self)
+                return self
+            except exc.DisconnectionError, e:
+                if self._pool._should_log_info:
+                    self._pool.log(
+                    "Disconnection detected on checkout: %s" % e)
+                self._connection_record.invalidate(e)
+                self.connection = self._connection_record.get_connection()
+                attempts -= 1
+
+        if self._pool._should_log_info:
+            self._pool.log("Reconnection attempts exhausted on checkout")
+        self.invalidate()
+        raise exc.InvalidRequestError("This connection is closed")
+
+    def detach(self):
+        """Separate this connection from its Pool.
+
+        This means that the connection will no longer be returned to the
+        pool when closed, and will instead be literally closed.  The
+        containing ConnectionRecord is separated from the DB-API connection,
+        and will create a new connection when next used.
+
+        Note that any overall connection limiting constraints imposed by a
+        Pool implementation may be violated after a detach, as the detached
+        connection is removed from the pool's knowledge and control.
+        """
+
+        if self._connection_record is not None:
+            self._connection_record.connection = None
+            self._connection_record.backref = None
+            self._pool.do_return_conn(self._connection_record)
+            self._detached_info = \
+              self._connection_record.info.copy()
+            self._connection_record = None
+
+    def close(self):
+        self.__counter -= 1
+        if self.__counter == 0:
+            self._close()
+
+    def _close(self):
+        _finalize_fairy(self.connection, self._connection_record, self._pool)
+        self.connection = None
+        self._connection_record = None
+
+class _CursorFairy(object):
+    __slots__ = '__parent', 'cursor', 'execute'
+
+    def __init__(self, parent, cursor):
+        self.__parent = parent
+        self.cursor = cursor
+        self.execute = cursor.execute
+        
+    def invalidate(self, e=None):
+        self.__parent.invalidate(e=e)
+
+    def close(self):
+        try:
+            self.cursor.close()
+        except Exception, e:
+            try:
+                ex_text = str(e)
+            except TypeError:
+                ex_text = repr(e)
+            self.__parent._logger.warn("Error closing cursor: " + ex_text)
+
+            if isinstance(e, (SystemExit, KeyboardInterrupt)):
+                raise
+
+    def __getattr__(self, key):
+        return getattr(self.cursor, key)
+
+class SingletonThreadPool(Pool):
+    """A Pool that maintains one connection per thread.
+
+    Maintains one connection per each thread, never moving a connection to a
+    thread other than the one which it was created in.
+
+    This is used for SQLite, which both does not handle multithreading by
+    default, and also requires a singleton connection if a :memory: database
+    is being used.
+
+    Options are the same as those of :class:`Pool`, as well as:
+
+    :param pool_size: The number of threads in which to maintain connections 
+        at once.  Defaults to five.
+      
+    """
+
+    def __init__(self, creator, pool_size=5, **params):
+        params['use_threadlocal'] = True
+        Pool.__init__(self, creator, **params)
+        self._conn = threading.local()
+        self._all_conns = set()
+        self.size = pool_size
+
+    def recreate(self):
+        self.log("Pool recreating")
+        return SingletonThreadPool(self._creator, 
+            pool_size=self.size, 
+            recycle=self._recycle, 
+            echo=self._should_log_info, 
+            use_threadlocal=self._use_threadlocal, 
+            listeners=self.listeners)
+
+    def dispose(self):
+        """Dispose of this pool."""
+
+        for conn in self._all_conns:
+            try:
+                conn.close()
+            except (SystemExit, KeyboardInterrupt):
+                raise
+            except:
+                # pysqlite won't even let you close a conn from a thread
+                # that didn't create it
+                pass
+        
+        self._all_conns.clear()
+            
+    def dispose_local(self):
+        if hasattr(self._conn, 'current'):
+            conn = self._conn.current()
+            self._all_conns.discard(conn)
+            del self._conn.current
+
+    def cleanup(self):
+        for conn in list(self._all_conns):
+            self._all_conns.discard(conn)
+            if len(self._all_conns) <= self.size:
+                return
+
+    def status(self):
+        return "SingletonThreadPool id:%d size: %d" % (id(self), len(self._all_conns))
+
+    def do_return_conn(self, conn):
+        pass
+
+    def do_get(self):
+        try:
+            c = self._conn.current()
+            if c:
+                return c
+        except AttributeError:
+            pass
+        c = self.create_connection()
+        self._conn.current = weakref.ref(c)
+        self._all_conns.add(c)
+        if len(self._all_conns) > self.size:
+            self.cleanup()
+        return c
+
+class QueuePool(Pool):
+    """A Pool that imposes a limit on the number of open connections."""
+
+    def __init__(self, creator, pool_size=5, max_overflow=10, timeout=30,
+                 **params):
+        """
+        Construct a QueuePool.
+
+        :param creator: a callable function that returns a DB-API
+          connection object.  The function will be called with
+          parameters.
+
+        :param pool_size: The size of the pool to be maintained. This
+          is the largest number of connections that will be kept
+          persistently in the pool. Note that the pool begins with no
+          connections; once this number of connections is requested,
+          that number of connections will remain. Defaults to 5.
+
+        :param max_overflow: The maximum overflow size of the
+          pool. When the number of checked-out connections reaches the
+          size set in pool_size, additional connections will be
+          returned up to this limit. When those additional connections
+          are returned to the pool, they are disconnected and
+          discarded. It follows then that the total number of
+          simultaneous connections the pool will allow is pool_size +
+          `max_overflow`, and the total number of "sleeping"
+          connections the pool will allow is pool_size. `max_overflow`
+          can be set to -1 to indicate no overflow limit; no limit
+          will be placed on the total number of concurrent
+          connections. Defaults to 10.
+
+        :param timeout: The number of seconds to wait before giving up
+          on returning a connection. Defaults to 30.
+
+        :param recycle: If set to non -1, number of seconds between
+          connection recycling, which means upon checkout, if this
+          timeout is surpassed the connection will be closed and
+          replaced with a newly opened connection. Defaults to -1.
+
+        :param echo: If True, connections being pulled and retrieved
+          from the pool will be logged to the standard output, as well
+          as pool sizing information.  Echoing can also be achieved by
+          enabling logging for the "sqlalchemy.pool"
+          namespace. Defaults to False.
+
+        :param use_threadlocal: If set to True, repeated calls to
+          :meth:`connect` within the same application thread will be
+          guaranteed to return the same connection object, if one has
+          already been retrieved from the pool and has not been
+          returned yet.  Offers a slight performance advantage at the
+          cost of individual transactions by default.  The
+          :meth:`unique_connection` method is provided to bypass the
+          threadlocal behavior installed into :meth:`connect`.
+
+        :param reset_on_return: If true, reset the database state of
+          connections returned to the pool.  This is typically a
+          ROLLBACK to release locks and transaction resources.
+          Disable at your own peril.  Defaults to True.
+
+        :param listeners: A list of
+          :class:`~sqlalchemy.interfaces.PoolListener`-like objects or
+          dictionaries of callables that receive events when DB-API
+          connections are created, checked out and checked in to the
+          pool.
+
+        """
+        Pool.__init__(self, creator, **params)
+        self._pool = Queue.Queue(pool_size)
+        self._overflow = 0 - pool_size
+        self._max_overflow = max_overflow
+        self._timeout = timeout
+        self._overflow_lock = self._max_overflow > -1 and threading.Lock() or None
+
+    def recreate(self):
+        self.log("Pool recreating")
+        return QueuePool(self._creator, pool_size=self._pool.maxsize, max_overflow=self._max_overflow, timeout=self._timeout, recycle=self._recycle, echo=self._should_log_info, use_threadlocal=self._use_threadlocal, listeners=self.listeners)
+
+    def do_return_conn(self, conn):
+        try:
+            self._pool.put(conn, False)
+        except Queue.Full:
+            if self._overflow_lock is None:
+                self._overflow -= 1
+            else:
+                self._overflow_lock.acquire()
+                try:
+                    self._overflow -= 1
+                finally:
+                    self._overflow_lock.release()
+
+    def do_get(self):
+        try:
+            wait = self._max_overflow > -1 and self._overflow >= self._max_overflow
+            return self._pool.get(wait, self._timeout)
+        except Queue.Empty:
+            if self._max_overflow > -1 and self._overflow >= self._max_overflow:
+                if not wait:
+                    return self.do_get()
+                else:
+                    raise exc.TimeoutError("QueuePool limit of size %d overflow %d reached, connection timed out, timeout %d" % (self.size(), self.overflow(), self._timeout))
+
+            if self._overflow_lock is not None:
+                self._overflow_lock.acquire()
+
+            if self._max_overflow > -1 and self._overflow >= self._max_overflow:
+                if self._overflow_lock is not None:
+                    self._overflow_lock.release()
+                return self.do_get()
+
+            try:
+                con = self.create_connection()
+                self._overflow += 1
+            finally:
+                if self._overflow_lock is not None:
+                    self._overflow_lock.release()
+            return con
+
+    def dispose(self):
+        while True:
+            try:
+                conn = self._pool.get(False)
+                conn.close()
+            except Queue.Empty:
+                break
+
+        self._overflow = 0 - self.size()
+        if self._should_log_info:
+            self.log("Pool disposed. " + self.status())
+
+    def status(self):
+        tup = (self.size(), self.checkedin(), self.overflow(), self.checkedout())
+        return "Pool size: %d  Connections in pool: %d Current Overflow: %d Current Checked out connections: %d" % tup
+
+    def size(self):
+        return self._pool.maxsize
+
+    def checkedin(self):
+        return self._pool.qsize()
+
+    def overflow(self):
+        return self._overflow
+
+    def checkedout(self):
+        return self._pool.maxsize - self._pool.qsize() + self._overflow
+
+class NullPool(Pool):
+    """A Pool which does not pool connections.
+
+    Instead it literally opens and closes the underlying DB-API connection
+    per each connection open/close.
+
+    Reconnect-related functions such as ``recycle`` and connection
+    invalidation are not supported by this Pool implementation, since
+    no connections are held persistently.
+
+    """
+
+    def status(self):
+        return "NullPool"
+
+    def do_return_conn(self, conn):
+        conn.close()
+
+    def do_return_invalid(self, conn):
+        pass
+
+    def do_get(self):
+        return self.create_connection()
+
+    def recreate(self):
+        self.log("Pool recreating")
+
+        return NullPool(self._creator, 
+            recycle=self._recycle, 
+            echo=self._should_log_info, 
+            use_threadlocal=self._use_threadlocal, 
+            listeners=self.listeners)
+
+    def dispose(self):
+        pass
+
+
+class StaticPool(Pool):
+    """A Pool of exactly one connection, used for all requests.
+
+    Reconnect-related functions such as ``recycle`` and connection
+    invalidation (which is also used to support auto-reconnect) are not
+    currently supported by this Pool implementation but may be implemented
+    in a future release.
+
+    """
+
+    def __init__(self, creator, **params):
+        """
+        Construct a StaticPool.
+
+        :param creator: a callable function that returns a DB-API
+          connection object.  The function will be called with
+          parameters.
+
+        :param echo: If True, connections being pulled and retrieved
+          from the pool will be logged to the standard output, as well
+          as pool sizing information.  Echoing can also be achieved by
+          enabling logging for the "sqlalchemy.pool"
+          namespace. Defaults to False.
+
+        :param reset_on_return: If true, reset the database state of
+          connections returned to the pool.  This is typically a
+          ROLLBACK to release locks and transaction resources.
+          Disable at your own peril.  Defaults to True.
+
+        :param listeners: A list of
+          :class:`~sqlalchemy.interfaces.PoolListener`-like objects or
+          dictionaries of callables that receive events when DB-API
+          connections are created, checked out and checked in to the
+          pool.
+
+        """
+        Pool.__init__(self, creator, **params)
+        self._conn = creator()
+        self.connection = _ConnectionRecord(self)
+
+    def status(self):
+        return "StaticPool"
+
+    def dispose(self):
+        self._conn.close()
+        self._conn = None
+
+    def recreate(self):
+        self.log("Pool recreating")
+        return self.__class__(creator=self._creator,
+                              recycle=self._recycle,
+                              use_threadlocal=self._use_threadlocal,
+                              reset_on_return=self._reset_on_return,
+                              echo=self.echo,
+                              listeners=self.listeners)
+
+    def create_connection(self):
+        return self._conn
+
+    def do_return_conn(self, conn):
+        pass
+
+    def do_return_invalid(self, conn):
+        pass
+
+    def do_get(self):
+        return self.connection
+
+
+class AssertionPool(Pool):
+    """A Pool that allows at most one checked out connection at any given time.
+
+    This will raise an exception if more than one connection is checked out
+    at a time.  Useful for debugging code that is using more connections
+    than desired.
+
+    """
+
+    ## TODO: modify this to handle an arbitrary connection count.
+
+    def __init__(self, creator, **params):
+        """
+        Construct an AssertionPool.
+
+        :param creator: a callable function that returns a DB-API
+          connection object.  The function will be called with
+          parameters.
+
+        :param recycle: If set to non -1, number of seconds between
+          connection recycling, which means upon checkout, if this
+          timeout is surpassed the connection will be closed and
+          replaced with a newly opened connection. Defaults to -1.
+
+        :param echo: If True, connections being pulled and retrieved
+          from the pool will be logged to the standard output, as well
+          as pool sizing information.  Echoing can also be achieved by
+          enabling logging for the "sqlalchemy.pool"
+          namespace. Defaults to False.
+
+        :param use_threadlocal: If set to True, repeated calls to
+          :meth:`connect` within the same application thread will be
+          guaranteed to return the same connection object, if one has
+          already been retrieved from the pool and has not been
+          returned yet.  Offers a slight performance advantage at the
+          cost of individual transactions by default.  The
+          :meth:`unique_connection` method is provided to bypass the
+          threadlocal behavior installed into :meth:`connect`.
+
+        :param reset_on_return: If true, reset the database state of
+          connections returned to the pool.  This is typically a
+          ROLLBACK to release locks and transaction resources.
+          Disable at your own peril.  Defaults to True.
+
+        :param listeners: A list of
+          :class:`~sqlalchemy.interfaces.PoolListener`-like objects or
+          dictionaries of callables that receive events when DB-API
+          connections are created, checked out and checked in to the
+          pool.
+
+        """
+        Pool.__init__(self, creator, **params)
+        self.connection = _ConnectionRecord(self)
+        self._conn = self.connection
+
+    def status(self):
+        return "AssertionPool"
+
+    def create_connection(self):
+        raise AssertionError("Invalid")
+
+    def do_return_conn(self, conn):
+        assert conn is self._conn and self.connection is None
+        self.connection = conn
+
+    def do_return_invalid(self, conn):
+        raise AssertionError("Invalid")
+
+    def do_get(self):
+        assert self.connection is not None
+        c = self.connection
+        self.connection = None
+        return c
+
+class _DBProxy(object):
+    """Layers connection pooling behavior on top of a standard DB-API module.
+
+    Proxies a DB-API 2.0 connect() call to a connection pool keyed to the
+    specific connect parameters. Other functions and attributes are delegated
+    to the underlying DB-API module.
+    """
+
+    def __init__(self, module, poolclass=QueuePool, **params):
+        """Initializes a new proxy.
+
+        module
+          a DB-API 2.0 module
+
+        poolclass
+          a Pool class, defaulting to QueuePool
+
+        Other parameters are sent to the Pool object's constructor.
+        """
+
+        self.module = module
+        self.params = params
+        self.poolclass = poolclass
+        self.pools = {}
+        self._create_pool_mutex = threading.Lock()
+        
+    def close(self):
+        for key in self.pools.keys():
+            del self.pools[key]
+
+    def __del__(self):
+        self.close()
+
+    def __getattr__(self, key):
+        return getattr(self.module, key)
+
+    def get_pool(self, *args, **params):
+        key = self._serialize(*args, **params)
+        try:
+            return self.pools[key]
+        except KeyError:
+            self._create_pool_mutex.acquire()
+            try:
+                if key not in self.pools:
+                    pool = self.poolclass(lambda: self.module.connect(*args, **params), **self.params)
+                    self.pools[key] = pool
+                    return pool
+                else:
+                    return self.pools[key]
+            finally:
+                self._create_pool_mutex.release()
+                
+    def connect(self, *args, **params):
+        """Activate a connection to the database.
+
+        Connect to the database using this DBProxy's module and the given
+        connect arguments.  If the arguments match an existing pool, the
+        connection will be returned from the pool's current thread-local
+        connection instance, or if there is no thread-local connection
+        instance it will be checked out from the set of pooled connections.
+
+        If the pool has no available connections and allows new connections
+        to be created, a new database connection will be made.
+        """
+
+        return self.get_pool(*args, **params).connect()
+
+    def dispose(self, *args, **params):
+        """Dispose the connection pool referenced by the given connect arguments."""
+
+        key = self._serialize(*args, **params)
+        try:
+            del self.pools[key]
+        except KeyError:
+            pass
+
+    def _serialize(self, *args, **params):
+        return pickle.dumps([args, params])
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/ext/serializer.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/ext/serializer.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/ext/serializer.py (revision 3)
@@ -0,0 +1,129 @@
+"""Serializer/Deserializer objects for usage with SQLAlchemy structures.
+
+Any SQLAlchemy structure, including Tables, Columns, expressions, mappers,
+Query objects etc. can be serialized in a minimally-sized format,
+and deserialized when given a Metadata and optional ScopedSession object
+to use as context on the way out.
+
+Usage is nearly the same as that of the standard Python pickle module::
+
+    from sqlalchemy.ext.serializer import loads, dumps
+    metadata = MetaData(bind=some_engine)
+    Session = scoped_session(sessionmaker())
+    
+    # ... define mappers
+    
+    query = Session.query(MyClass).filter(MyClass.somedata=='foo').order_by(MyClass.sortkey)
+    
+    # pickle the query
+    serialized = dumps(query)
+    
+    # unpickle.  Pass in metadata + scoped_session
+    query2 = loads(serialized, metadata, Session)
+    
+    print query2.all()
+
+Similar restrictions as when using raw pickle apply; mapped classes must be 
+themselves be pickleable, meaning they are importable from a module-level
+namespace.
+
+Note that instances of user-defined classes do not require this extension
+in order to be pickled; these contain no references to engines, sessions
+or expression constructs in the typical case and can be serialized directly.
+This module is specifically for ORM and expression constructs.
+
+"""
+
+from sqlalchemy.orm import class_mapper, Query
+from sqlalchemy.orm.session import Session
+from sqlalchemy.orm.mapper import Mapper
+from sqlalchemy.orm.attributes import QueryableAttribute
+from sqlalchemy import Table, Column
+from sqlalchemy.engine import Engine
+from sqlalchemy.util import pickle
+import re
+import base64
+from cStringIO import StringIO
+
+__all__ = ['Serializer', 'Deserializer', 'dumps', 'loads']
+
+def Serializer(*args, **kw):
+    pickler = pickle.Pickler(*args, **kw)
+        
+    def persistent_id(obj):
+        #print "serializing:", repr(obj)
+        if isinstance(obj, QueryableAttribute):
+            cls = obj.impl.class_
+            key = obj.impl.key
+            id = "attribute:" + key + ":" + base64.b64encode(pickle.dumps(cls))
+        elif isinstance(obj, Mapper) and not obj.non_primary:
+            id = "mapper:" + base64.b64encode(pickle.dumps(obj.class_))
+        elif isinstance(obj, Table):
+            id = "table:" + str(obj)
+        elif isinstance(obj, Column) and isinstance(obj.table, Table):
+            id = "column:" + str(obj.table) + ":" + obj.key
+        elif isinstance(obj, Session):
+            id = "session:"
+        elif isinstance(obj, Engine):
+            id = "engine:"
+        else:
+            return None
+        return id
+        
+    pickler.persistent_id = persistent_id
+    return pickler
+    
+our_ids = re.compile(r'(mapper|table|column|session|attribute|engine):(.*)')
+
+def Deserializer(file, metadata=None, scoped_session=None, engine=None):
+    unpickler = pickle.Unpickler(file)
+    
+    def get_engine():
+        if engine:
+            return engine
+        elif scoped_session and scoped_session().bind:
+            return scoped_session().bind
+        elif metadata and metadata.bind:
+            return metadata.bind
+        else:
+            return None
+            
+    def persistent_load(id):
+        m = our_ids.match(id)
+        if not m:
+            return None
+        else:
+            type_, args = m.group(1, 2)
+            if type_ == 'attribute':
+                key, clsarg = args.split(":")
+                cls = pickle.loads(base64.b64decode(clsarg))
+                return getattr(cls, key)
+            elif type_ == "mapper":
+                cls = pickle.loads(base64.b64decode(args))
+                return class_mapper(cls)
+            elif type_ == "table":
+                return metadata.tables[args]
+            elif type_ == "column":
+                table, colname = args.split(':')
+                return metadata.tables[table].c[colname]
+            elif type_ == "session":
+                return scoped_session()
+            elif type_ == "engine":
+                return get_engine()
+            else:
+                raise Exception("Unknown token: %s" % type_)
+    unpickler.persistent_load = persistent_load
+    return unpickler
+
+def dumps(obj):
+    buf = StringIO()
+    pickler = Serializer(buf)
+    pickler.dump(obj)
+    return buf.getvalue()
+    
+def loads(data, metadata=None, scoped_session=None, engine=None):
+    buf = StringIO(data)
+    unpickler = Deserializer(buf, metadata, scoped_session, engine)
+    return unpickler.load()
+    
+    
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/ext/compiler.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/ext/compiler.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/ext/compiler.py (revision 3)
@@ -0,0 +1,110 @@
+"""Provides an API for creation of custom ClauseElements and compilers.
+
+Synopsis
+========
+
+Usage involves the creation of one or more :class:`~sqlalchemy.sql.expression.ClauseElement`
+subclasses and one or more callables defining its compilation::
+
+    from sqlalchemy.ext.compiler import compiles
+    from sqlalchemy.sql.expression import ColumnClause
+    
+    class MyColumn(ColumnClause):
+        pass
+            
+    @compiles(MyColumn)
+    def compile_mycolumn(element, compiler, **kw):
+        return "[%s]" % element.name
+        
+Above, ``MyColumn`` extends :class:`~sqlalchemy.sql.expression.ColumnClause`, the
+base expression element for column objects.  The ``compiles`` decorator registers
+itself with the ``MyColumn`` class so that it is invoked when the object 
+is compiled to a string::
+
+    from sqlalchemy import select
+    
+    s = select([MyColumn('x'), MyColumn('y')])
+    print str(s)
+    
+Produces::
+
+    SELECT [x], [y]
+
+Compilers can also be made dialect-specific.  The appropriate compiler will be invoked
+for the dialect in use::
+
+    from sqlalchemy.schema import DDLElement  # this is a SQLA 0.6 construct
+
+    class AlterColumn(DDLElement):
+
+        def __init__(self, column, cmd):
+            self.column = column
+            self.cmd = cmd
+
+    @compiles(AlterColumn)
+    def visit_alter_column(element, compiler, **kw):
+        return "ALTER COLUMN %s ..." % element.column.name
+
+    @compiles(AlterColumn, 'postgres')
+    def visit_alter_column(element, compiler, **kw):
+        return "ALTER TABLE %s ALTER COLUMN %s ..." % (element.table.name, element.column.name)
+
+The second ``visit_alter_table`` will be invoked when any ``postgres`` dialect is used.
+
+The ``compiler`` argument is the :class:`~sqlalchemy.engine.base.Compiled` object
+in use.  This object can be inspected for any information about the in-progress 
+compilation, including ``compiler.dialect``, ``compiler.statement`` etc.
+The :class:`~sqlalchemy.sql.compiler.SQLCompiler` and :class:`~sqlalchemy.sql.compiler.DDLCompiler` (DDLCompiler is 0.6. only)
+both include a ``process()`` method which can be used for compilation of embedded attributes::
+
+    class InsertFromSelect(ClauseElement):
+        def __init__(self, table, select):
+            self.table = table
+            self.select = select
+
+    @compiles(InsertFromSelect)
+    def visit_insert_from_select(element, compiler, **kw):
+        return "INSERT INTO %s (%s)" % (
+            compiler.process(element.table, asfrom=True),
+            compiler.process(element.select)
+        )
+
+    insert = InsertFromSelect(t1, select([t1]).where(t1.c.x>5))
+    print insert
+    
+Produces::
+
+    "INSERT INTO mytable (SELECT mytable.x, mytable.y, mytable.z FROM mytable WHERE mytable.x > :x_1)"
+
+
+"""
+
+def compiles(class_, *specs):
+    def decorate(fn):
+        existing = getattr(class_, '_compiler_dispatcher', None)
+        if not existing:
+            existing = _dispatcher()
+
+            # TODO: why is the lambda needed ?
+            setattr(class_, '_compiler_dispatch', lambda *arg, **kw: existing(*arg, **kw))
+            setattr(class_, '_compiler_dispatcher', existing)
+        
+        if specs:
+            for s in specs:
+                existing.specs[s] = fn
+        else:
+            existing.specs['default'] = fn
+        return fn
+    return decorate
+    
+class _dispatcher(object):
+    def __init__(self):
+        self.specs = {}
+    
+    def __call__(self, element, compiler, **kw):
+        # TODO: yes, this could also switch off of DBAPI in use.
+        fn = self.specs.get(compiler.dialect.name, None)
+        if not fn:
+            fn = self.specs['default']
+        return fn(element, compiler, **kw)
+        
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/ext/associationproxy.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/ext/associationproxy.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/ext/associationproxy.py (revision 3)
@@ -0,0 +1,857 @@
+"""Contain the ``AssociationProxy`` class.
+
+The ``AssociationProxy`` is a Python property object which provides
+transparent proxied access to the endpoint of an association object.
+
+See the example ``examples/association/proxied_association.py``.
+
+"""
+import itertools
+import operator
+import weakref
+from sqlalchemy import exceptions
+from sqlalchemy import orm
+from sqlalchemy import util
+from sqlalchemy.orm import collections
+
+
+def association_proxy(target_collection, attr, **kw):
+    """Return a Python property implementing a view of *attr* over a collection.
+
+    Implements a read/write view over an instance's *target_collection*,
+    extracting *attr* from each member of the collection.  The property acts
+    somewhat like this list comprehension::
+
+      [getattr(member, *attr*)
+       for member in getattr(instance, *target_collection*)]
+
+    Unlike the list comprehension, the collection returned by the property is
+    always in sync with *target_collection*, and mutations made to either
+    collection will be reflected in both.
+
+    Implements a Python property representing a relation as a collection of
+    simpler values.  The proxied property will mimic the collection type of
+    the target (list, dict or set), or, in the case of a one to one relation,
+    a simple scalar value.
+
+    :param target_collection: Name of the relation attribute we'll proxy to,
+      usually created with :func:`~sqlalchemy.orm.relation`.
+
+    :param attr: Attribute on the associated instances we'll proxy for.
+
+      For example, given a target collection of [obj1, obj2], a list created
+      by this proxy property would look like [getattr(obj1, *attr*),
+      getattr(obj2, *attr*)]
+
+      If the relation is one-to-one or otherwise uselist=False, then simply:
+      getattr(obj, *attr*)
+
+    :param creator: optional.
+
+      When new items are added to this proxied collection, new instances of
+      the class collected by the target collection will be created.  For list
+      and set collections, the target class constructor will be called with
+      the 'value' for the new instance.  For dict types, two arguments are
+      passed: key and value.
+
+      If you want to construct instances differently, supply a *creator*
+      function that takes arguments as above and returns instances.
+
+      For scalar relations, creator() will be called if the target is None.
+      If the target is present, set operations are proxied to setattr() on the
+      associated object.
+
+      If you have an associated object with multiple attributes, you may set
+      up multiple association proxies mapping to different attributes.  See
+      the unit tests for examples, and for examples of how creator() functions
+      can be used to construct the scalar relation on-demand in this
+      situation.
+
+    :param \*\*kw: Passes along any other keyword arguments to
+      :class:`AssociationProxy`.
+
+    """
+    return AssociationProxy(target_collection, attr, **kw)
+
+
+class AssociationProxy(object):
+    """A descriptor that presents a read/write view of an object attribute."""
+
+    def __init__(self, target_collection, attr, creator=None,
+                 getset_factory=None, proxy_factory=None, proxy_bulk_set=None):
+        """Arguments are:
+
+        target_collection
+          Name of the collection we'll proxy to, usually created with
+          'relation()' in a mapper setup.
+
+        attr
+          Attribute on the collected instances we'll proxy for.  For example,
+          given a target collection of [obj1, obj2], a list created by this
+          proxy property would look like [getattr(obj1, attr), getattr(obj2,
+          attr)]
+
+        creator
+          Optional. When new items are added to this proxied collection, new
+          instances of the class collected by the target collection will be
+          created.  For list and set collections, the target class constructor
+          will be called with the 'value' for the new instance.  For dict
+          types, two arguments are passed: key and value.
+
+          If you want to construct instances differently, supply a 'creator'
+          function that takes arguments as above and returns instances.
+
+        getset_factory
+          Optional.  Proxied attribute access is automatically handled by
+          routines that get and set values based on the `attr` argument for
+          this proxy.
+
+          If you would like to customize this behavior, you may supply a
+          `getset_factory` callable that produces a tuple of `getter` and
+          `setter` functions.  The factory is called with two arguments, the
+          abstract type of the underlying collection and this proxy instance.
+
+        proxy_factory
+          Optional.  The type of collection to emulate is determined by
+          sniffing the target collection.  If your collection type can't be
+          determined by duck typing or you'd like to use a different
+          collection implementation, you may supply a factory function to
+          produce those collections.  Only applicable to non-scalar relations.
+
+        proxy_bulk_set
+          Optional, use with proxy_factory.  See the _set() method for
+          details.
+
+        """
+        self.target_collection = target_collection
+        self.value_attr = attr
+        self.creator = creator
+        self.getset_factory = getset_factory
+        self.proxy_factory = proxy_factory
+        self.proxy_bulk_set = proxy_bulk_set
+
+        self.scalar = None
+        self.owning_class = None
+        self.key = '_%s_%s_%s' % (
+            type(self).__name__, target_collection, id(self))
+        self.collection_class = None
+
+    def _get_property(self):
+        return (orm.class_mapper(self.owning_class).
+                get_property(self.target_collection))
+
+    @property
+    def target_class(self):
+        """The class the proxy is attached to."""
+        return self._get_property().mapper.class_
+
+    def _target_is_scalar(self):
+        return not self._get_property().uselist
+
+    def __get__(self, obj, class_):
+        if self.owning_class is None:
+            self.owning_class = class_ and class_ or type(obj)
+        if obj is None:
+            return self
+        elif self.scalar is None:
+            self.scalar = self._target_is_scalar()
+            if self.scalar:
+                self._initialize_scalar_accessors()
+
+        if self.scalar:
+            return self._scalar_get(getattr(obj, self.target_collection))
+        else:
+            try:
+                # If the owning instance is reborn (orm session resurrect,
+                # etc.), refresh the proxy cache.
+                creator_id, proxy = getattr(obj, self.key)
+                if id(obj) == creator_id:
+                    return proxy
+            except AttributeError:
+                pass
+            proxy = self._new(_lazy_collection(obj, self.target_collection))
+            setattr(obj, self.key, (id(obj), proxy))
+            return proxy
+    
+    def __set__(self, obj, values):
+        if self.owning_class is None:
+            self.owning_class = type(obj)
+        if self.scalar is None:
+            self.scalar = self._target_is_scalar()
+            if self.scalar:
+                self._initialize_scalar_accessors()
+
+        if self.scalar:
+            creator = self.creator and self.creator or self.target_class
+            target = getattr(obj, self.target_collection)
+            if target is None:
+                setattr(obj, self.target_collection, creator(values))
+            else:
+                self._scalar_set(target, values)
+        else:
+            proxy = self.__get__(obj, None)
+            if proxy is not values:
+                proxy.clear()
+                self._set(proxy, values)
+
+    def __delete__(self, obj):
+        if self.owning_class is None:
+            self.owning_class = type(obj)
+        delattr(obj, self.key)
+
+    def _initialize_scalar_accessors(self):
+        if self.getset_factory:
+            get, set = self.getset_factory(None, self)
+        else:
+            get, set = self._default_getset(None)
+        self._scalar_get, self._scalar_set = get, set
+
+    def _default_getset(self, collection_class):
+        attr = self.value_attr
+        getter = operator.attrgetter(attr)
+        if collection_class is dict:
+            setter = lambda o, k, v: setattr(o, attr, v)
+        else:
+            setter = lambda o, v: setattr(o, attr, v)
+        return getter, setter
+
+    def _new(self, lazy_collection):
+        creator = self.creator and self.creator or self.target_class
+        self.collection_class = util.duck_type_collection(lazy_collection())
+
+        if self.proxy_factory:
+            return self.proxy_factory(lazy_collection, creator, self.value_attr)
+
+        if self.getset_factory:
+            getter, setter = self.getset_factory(self.collection_class, self)
+        else:
+            getter, setter = self._default_getset(self.collection_class)
+        
+        if self.collection_class is list:
+            return _AssociationList(lazy_collection, creator, getter, setter, self)
+        elif self.collection_class is dict:
+            return _AssociationDict(lazy_collection, creator, getter, setter, self)
+        elif self.collection_class is set:
+            return _AssociationSet(lazy_collection, creator, getter, setter, self)
+        else:
+            raise exceptions.ArgumentError(
+                'could not guess which interface to use for '
+                'collection_class "%s" backing "%s"; specify a '
+                'proxy_factory and proxy_bulk_set manually' %
+                (self.collection_class.__name__, self.target_collection))
+
+    def _inflate(self, proxy):
+        creator = self.creator and self.creator or self.target_class
+
+        if self.getset_factory:
+            getter, setter = self.getset_factory(self.collection_class, self)
+        else:
+            getter, setter = self._default_getset(self.collection_class)
+        
+        proxy.creator = creator
+        proxy.getter = getter
+        proxy.setter = setter
+
+    def _set(self, proxy, values):
+        if self.proxy_bulk_set:
+            self.proxy_bulk_set(proxy, values)
+        elif self.collection_class is list:
+            proxy.extend(values)
+        elif self.collection_class is dict:
+            proxy.update(values)
+        elif self.collection_class is set:
+            proxy.update(values)
+        else:
+            raise exceptions.ArgumentError(
+               'no proxy_bulk_set supplied for custom '
+               'collection_class implementation')
+
+class _lazy_collection(object):
+    def __init__(self, obj, target):
+        self.ref = weakref.ref(obj)
+        self.target = target
+
+    def __call__(self):
+        obj = self.ref()
+        if obj is None:
+            raise exceptions.InvalidRequestError(
+               "stale association proxy, parent object has gone out of "
+               "scope")
+        return getattr(obj, self.target)
+
+    def __getstate__(self):
+        return {'obj':self.ref(), 'target':self.target}
+    
+    def __setstate__(self, state):
+        self.ref = weakref.ref(state['obj'])
+        self.target = state['target']
+
+class _AssociationCollection(object):
+    def __init__(self, lazy_collection, creator, getter, setter, parent):
+        """Constructs an _AssociationCollection.  
+        
+        This will always be a subclass of either _AssociationList,
+        _AssociationSet, or _AssociationDict.
+
+        lazy_collection
+          A callable returning a list-based collection of entities (usually an
+          object attribute managed by a SQLAlchemy relation())
+
+        creator
+          A function that creates new target entities.  Given one parameter:
+          value.  This assertion is assumed::
+
+            obj = creator(somevalue)
+            assert getter(obj) == somevalue
+
+        getter
+          A function.  Given an associated object, return the 'value'.
+
+        setter
+          A function.  Given an associated object and a value, store that
+          value on the object.
+
+        """
+        self.lazy_collection = lazy_collection
+        self.creator = creator
+        self.getter = getter
+        self.setter = setter
+        self.parent = parent
+
+    col = property(lambda self: self.lazy_collection())
+
+    def __len__(self):
+        return len(self.col)
+
+    def __nonzero__(self):
+        return bool(self.col)
+
+    def __getstate__(self):
+        return {'parent':self.parent, 'lazy_collection':self.lazy_collection}
+
+    def __setstate__(self, state):
+        self.parent = state['parent']
+        self.lazy_collection = state['lazy_collection']
+        self.parent._inflate(self)
+    
+class _AssociationList(_AssociationCollection):
+    """Generic, converting, list-to-list proxy."""
+
+    def _create(self, value):
+        return self.creator(value)
+
+    def _get(self, object):
+        return self.getter(object)
+
+    def _set(self, object, value):
+        return self.setter(object, value)
+
+    def __getitem__(self, index):
+        return self._get(self.col[index])
+
+    def __setitem__(self, index, value):
+        if not isinstance(index, slice):
+            self._set(self.col[index], value)
+        else:
+            if index.stop is None:
+                stop = len(self)
+            elif index.stop < 0:
+                stop = len(self) + index.stop
+            else:
+                stop = index.stop
+            step = index.step or 1
+
+            rng = range(index.start or 0, stop, step)
+            if step == 1:
+                for i in rng:
+                    del self[index.start]
+                i = index.start
+                for item in value:
+                    self.insert(i, item)
+                    i += 1
+            else:
+                if len(value) != len(rng):
+                    raise ValueError(
+                        "attempt to assign sequence of size %s to "
+                        "extended slice of size %s" % (len(value),
+                                                       len(rng)))
+                for i, item in zip(rng, value):
+                    self._set(self.col[i], item)
+
+    def __delitem__(self, index):
+        del self.col[index]
+
+    def __contains__(self, value):
+        for member in self.col:
+            # testlib.pragma exempt:__eq__
+            if self._get(member) == value:
+                return True
+        return False
+
+    def __getslice__(self, start, end):
+        return [self._get(member) for member in self.col[start:end]]
+
+    def __setslice__(self, start, end, values):
+        members = [self._create(v) for v in values]
+        self.col[start:end] = members
+
+    def __delslice__(self, start, end):
+        del self.col[start:end]
+
+    def __iter__(self):
+        """Iterate over proxied values.
+
+        For the actual domain objects, iterate over .col instead or
+        just use the underlying collection directly from its property
+        on the parent.
+        """
+
+        for member in self.col:
+            yield self._get(member)
+        raise StopIteration
+
+    def append(self, value):
+        item = self._create(value)
+        self.col.append(item)
+
+    def count(self, value):
+        return sum([1 for _ in
+                    itertools.ifilter(lambda v: v == value, iter(self))])
+
+    def extend(self, values):
+        for v in values:
+            self.append(v)
+
+    def insert(self, index, value):
+        self.col[index:index] = [self._create(value)]
+
+    def pop(self, index=-1):
+        return self.getter(self.col.pop(index))
+
+    def remove(self, value):
+        for i, val in enumerate(self):
+            if val == value:
+                del self.col[i]
+                return
+        raise ValueError("value not in list")
+
+    def reverse(self):
+        """Not supported, use reversed(mylist)"""
+
+        raise NotImplementedError
+
+    def sort(self):
+        """Not supported, use sorted(mylist)"""
+
+        raise NotImplementedError
+
+    def clear(self):
+        del self.col[0:len(self.col)]
+
+    def __eq__(self, other):
+        return list(self) == other
+
+    def __ne__(self, other):
+        return list(self) != other
+
+    def __lt__(self, other):
+        return list(self) < other
+
+    def __le__(self, other):
+        return list(self) <= other
+
+    def __gt__(self, other):
+        return list(self) > other
+
+    def __ge__(self, other):
+        return list(self) >= other
+
+    def __cmp__(self, other):
+        return cmp(list(self), other)
+
+    def __add__(self, iterable):
+        try:
+            other = list(iterable)
+        except TypeError:
+            return NotImplemented
+        return list(self) + other
+
+    def __radd__(self, iterable):
+        try:
+            other = list(iterable)
+        except TypeError:
+            return NotImplemented
+        return other + list(self)
+
+    def __mul__(self, n):
+        if not isinstance(n, int):
+            return NotImplemented
+        return list(self) * n
+    __rmul__ = __mul__
+
+    def __iadd__(self, iterable):
+        self.extend(iterable)
+        return self
+
+    def __imul__(self, n):
+        # unlike a regular list *=, proxied __imul__ will generate unique
+        # backing objects for each copy.  *= on proxied lists is a bit of
+        # a stretch anyhow, and this interpretation of the __imul__ contract
+        # is more plausibly useful than copying the backing objects.
+        if not isinstance(n, int):
+            return NotImplemented
+        if n == 0:
+            self.clear()
+        elif n > 1:
+            self.extend(list(self) * (n - 1))
+        return self
+
+    def copy(self):
+        return list(self)
+
+    def __repr__(self):
+        return repr(list(self))
+
+    def __hash__(self):
+        raise TypeError("%s objects are unhashable" % type(self).__name__)
+
+    for func_name, func in locals().items():
+        if (util.callable(func) and func.func_name == func_name and
+            not func.__doc__ and hasattr(list, func_name)):
+            func.__doc__ = getattr(list, func_name).__doc__
+    del func_name, func
+
+
+_NotProvided = util.symbol('_NotProvided')
+class _AssociationDict(_AssociationCollection):
+    """Generic, converting, dict-to-dict proxy."""
+
+    def _create(self, key, value):
+        return self.creator(key, value)
+
+    def _get(self, object):
+        return self.getter(object)
+
+    def _set(self, object, key, value):
+        return self.setter(object, key, value)
+
+    def __getitem__(self, key):
+        return self._get(self.col[key])
+
+    def __setitem__(self, key, value):
+        if key in self.col:
+            self._set(self.col[key], key, value)
+        else:
+            self.col[key] = self._create(key, value)
+
+    def __delitem__(self, key):
+        del self.col[key]
+
+    def __contains__(self, key):
+        # testlib.pragma exempt:__hash__
+        return key in self.col
+
+    def has_key(self, key):
+        # testlib.pragma exempt:__hash__
+        return key in self.col
+
+    def __iter__(self):
+        return self.col.iterkeys()
+
+    def clear(self):
+        self.col.clear()
+
+    def __eq__(self, other):
+        return dict(self) == other
+
+    def __ne__(self, other):
+        return dict(self) != other
+
+    def __lt__(self, other):
+        return dict(self) < other
+
+    def __le__(self, other):
+        return dict(self) <= other
+
+    def __gt__(self, other):
+        return dict(self) > other
+
+    def __ge__(self, other):
+        return dict(self) >= other
+
+    def __cmp__(self, other):
+        return cmp(dict(self), other)
+
+    def __repr__(self):
+        return repr(dict(self.items()))
+
+    def get(self, key, default=None):
+        try:
+            return self[key]
+        except KeyError:
+            return default
+
+    def setdefault(self, key, default=None):
+        if key not in self.col:
+            self.col[key] = self._create(key, default)
+            return default
+        else:
+            return self[key]
+
+    def keys(self):
+        return self.col.keys()
+
+    def iterkeys(self):
+        return self.col.iterkeys()
+
+    def values(self):
+        return [ self._get(member) for member in self.col.values() ]
+
+    def itervalues(self):
+        for key in self.col:
+            yield self._get(self.col[key])
+        raise StopIteration
+
+    def items(self):
+        return [(k, self._get(self.col[k])) for k in self]
+
+    def iteritems(self):
+        for key in self.col:
+            yield (key, self._get(self.col[key]))
+        raise StopIteration
+
+    def pop(self, key, default=_NotProvided):
+        if default is _NotProvided:
+            member = self.col.pop(key)
+        else:
+            member = self.col.pop(key, default)
+        return self._get(member)
+
+    def popitem(self):
+        item = self.col.popitem()
+        return (item[0], self._get(item[1]))
+
+    def update(self, *a, **kw):
+        if len(a) > 1:
+            raise TypeError('update expected at most 1 arguments, got %i' %
+                            len(a))
+        elif len(a) == 1:
+            seq_or_map = a[0]
+            for item in seq_or_map:
+                if isinstance(item, tuple):
+                    self[item[0]] = item[1]
+                else:
+                    self[item] = seq_or_map[item]
+
+        for key, value in kw:
+            self[key] = value
+
+    def copy(self):
+        return dict(self.items())
+
+    def __hash__(self):
+        raise TypeError("%s objects are unhashable" % type(self).__name__)
+
+    for func_name, func in locals().items():
+        if (util.callable(func) and func.func_name == func_name and
+            not func.__doc__ and hasattr(dict, func_name)):
+            func.__doc__ = getattr(dict, func_name).__doc__
+    del func_name, func
+
+
+class _AssociationSet(_AssociationCollection):
+    """Generic, converting, set-to-set proxy."""
+
+    def _create(self, value):
+        return self.creator(value)
+
+    def _get(self, object):
+        return self.getter(object)
+
+    def _set(self, object, value):
+        return self.setter(object, value)
+
+    def __len__(self):
+        return len(self.col)
+
+    def __nonzero__(self):
+        if self.col:
+            return True
+        else:
+            return False
+
+    def __contains__(self, value):
+        for member in self.col:
+            # testlib.pragma exempt:__eq__
+            if self._get(member) == value:
+                return True
+        return False
+
+    def __iter__(self):
+        """Iterate over proxied values.
+
+        For the actual domain objects, iterate over .col instead or just use
+        the underlying collection directly from its property on the parent.
+
+        """
+        for member in self.col:
+            yield self._get(member)
+        raise StopIteration
+
+    def add(self, value):
+        if value not in self:
+            self.col.add(self._create(value))
+
+    # for discard and remove, choosing a more expensive check strategy rather
+    # than call self.creator()
+    def discard(self, value):
+        for member in self.col:
+            if self._get(member) == value:
+                self.col.discard(member)
+                break
+
+    def remove(self, value):
+        for member in self.col:
+            if self._get(member) == value:
+                self.col.discard(member)
+                return
+        raise KeyError(value)
+
+    def pop(self):
+        if not self.col:
+            raise KeyError('pop from an empty set')
+        member = self.col.pop()
+        return self._get(member)
+
+    def update(self, other):
+        for value in other:
+            self.add(value)
+
+    def __ior__(self, other):
+        if not collections._set_binops_check_strict(self, other):
+            return NotImplemented
+        for value in other:
+            self.add(value)
+        return self
+
+    def _set(self):
+        return set(iter(self))
+
+    def union(self, other):
+        return set(self).union(other)
+
+    __or__ = union
+
+    def difference(self, other):
+        return set(self).difference(other)
+
+    __sub__ = difference
+
+    def difference_update(self, other):
+        for value in other:
+            self.discard(value)
+
+    def __isub__(self, other):
+        if not collections._set_binops_check_strict(self, other):
+            return NotImplemented
+        for value in other:
+            self.discard(value)
+        return self
+
+    def intersection(self, other):
+        return set(self).intersection(other)
+
+    __and__ = intersection
+
+    def intersection_update(self, other):
+        want, have = self.intersection(other), set(self)
+
+        remove, add = have - want, want - have
+
+        for value in remove:
+            self.remove(value)
+        for value in add:
+            self.add(value)
+
+    def __iand__(self, other):
+        if not collections._set_binops_check_strict(self, other):
+            return NotImplemented
+        want, have = self.intersection(other), set(self)
+
+        remove, add = have - want, want - have
+
+        for value in remove:
+            self.remove(value)
+        for value in add:
+            self.add(value)
+        return self
+
+    def symmetric_difference(self, other):
+        return set(self).symmetric_difference(other)
+
+    __xor__ = symmetric_difference
+
+    def symmetric_difference_update(self, other):
+        want, have = self.symmetric_difference(other), set(self)
+
+        remove, add = have - want, want - have
+
+        for value in remove:
+            self.remove(value)
+        for value in add:
+            self.add(value)
+
+    def __ixor__(self, other):
+        if not collections._set_binops_check_strict(self, other):
+            return NotImplemented
+        want, have = self.symmetric_difference(other), set(self)
+
+        remove, add = have - want, want - have
+
+        for value in remove:
+            self.remove(value)
+        for value in add:
+            self.add(value)
+        return self
+
+    def issubset(self, other):
+        return set(self).issubset(other)
+
+    def issuperset(self, other):
+        return set(self).issuperset(other)
+
+    def clear(self):
+        self.col.clear()
+
+    def copy(self):
+        return set(self)
+
+    def __eq__(self, other):
+        return set(self) == other
+
+    def __ne__(self, other):
+        return set(self) != other
+
+    def __lt__(self, other):
+        return set(self) < other
+
+    def __le__(self, other):
+        return set(self) <= other
+
+    def __gt__(self, other):
+        return set(self) > other
+
+    def __ge__(self, other):
+        return set(self) >= other
+
+    def __repr__(self):
+        return repr(set(self))
+
+    def __hash__(self):
+        raise TypeError("%s objects are unhashable" % type(self).__name__)
+
+    for func_name, func in locals().items():
+        if (util.callable(func) and func.func_name == func_name and
+            not func.__doc__ and hasattr(set, func_name)):
+            func.__doc__ = getattr(set, func_name).__doc__
+    del func_name, func
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/ext/__init__.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/ext/__init__.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/ext/__init__.py (revision 3)
@@ -0,0 +1,1 @@
+
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/ext/declarative.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/ext/declarative.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/ext/declarative.py (revision 3)
@@ -0,0 +1,767 @@
+"""A simple declarative layer for SQLAlchemy ORM.
+
+Synopsis
+========
+
+SQLAlchemy object-relational configuration involves the usage of :class:`~sqlalchemy.schema.Table`,
+:func:`~sqlalchemy.orm.mapper`, and class objects to define the three areas of configuration.
+``declarative`` moves these three types of configuration underneath the individual
+mapped class.  Regular SQLAlchemy schema and ORM constructs are used in most
+cases::
+
+    from sqlalchemy.ext.declarative import declarative_base
+
+    Base = declarative_base()
+
+    class SomeClass(Base):
+        __tablename__ = 'some_table'
+        id = Column(Integer, primary_key=True)
+        name =  Column(String(50))
+
+Above, the :func:`declarative_base` callable produces a new base class from which
+all mapped classes inherit from.  When the class definition is completed, a
+new :class:`~sqlalchemy.schema.Table` and :class:`~sqlalchemy.orm.mapper` have been generated, accessible via the
+``__table__`` and ``__mapper__`` attributes on the ``SomeClass`` class.
+
+Defining Attributes
+===================
+
+:class:`~sqlalchemy.schema.Column` objects may be explicitly named, 
+including using a different name than the attribute in which they are associated.
+The column will be assigned to the :class:`~sqlalchemy.schema.Table` using the
+given name, and mapped to the class using the attribute name::
+
+    class SomeClass(Base):
+        __tablename__ = 'some_table'
+        id = Column("some_table_id", Integer, primary_key=True)
+        name = Column("name", String(50))
+    
+Otherwise, you may omit the names from the Column definitions.  
+Declarative will set the ``name`` attribute on the column when the class
+is initialized::
+
+    class SomeClass(Base):
+        __tablename__ = 'some_table'
+        id = Column(Integer, primary_key=True)
+        name = Column(String(50))
+
+Attributes may be added to the class after its construction, and they will be
+added to the underlying :class:`~sqlalchemy.schema.Table` and :func:`~sqlalchemy.orm.mapper()` definitions as
+appropriate::
+
+    SomeClass.data = Column('data', Unicode)
+    SomeClass.related = relation(RelatedInfo)
+
+Classes which are mapped explicitly using :func:`~sqlalchemy.orm.mapper()` can interact freely
+with declarative classes.   It is recommended, though not required, that all tables 
+share the same underlying :class:`~sqlalchemy.schema.MetaData` object, so that 
+string-configured :class:`~sqlalchemy.schema.ForeignKey` references can be resolved without issue.
+
+Association of Metadata and Engine
+==================================
+
+The :func:`declarative_base` base class contains a :class:`~sqlalchemy.schema.MetaData` object where newly
+defined :class:`~sqlalchemy.schema.Table` objects are collected.  This is accessed via the
+:class:`~sqlalchemy.schema.MetaData` class level accessor, so to create tables we can say::
+
+    engine = create_engine('sqlite://')
+    Base.metadata.create_all(engine)
+
+The :class:`~sqlalchemy.engine.base.Engine` created above may also be directly associated with the
+declarative base class using the ``bind`` keyword argument, where it will be
+associated with the underlying :class:`~sqlalchemy.schema.MetaData` object and allow SQL operations
+involving that metadata and its tables to make use of that engine
+automatically::
+
+    Base = declarative_base(bind=create_engine('sqlite://'))
+
+Or, as :class:`~sqlalchemy.schema.MetaData` allows, at any time using the ``bind`` attribute::
+
+    Base.metadata.bind = create_engine('sqlite://')
+
+The :func:`declarative_base` can also receive a pre-created :class:`~sqlalchemy.schema.MetaData` object,
+which allows a declarative setup to be associated with an already existing
+traditional collection of :class:`~sqlalchemy.schema.Table` objects::
+
+    mymetadata = MetaData()
+    Base = declarative_base(metadata=mymetadata)
+
+Configuring Relations
+=====================
+
+Relations to other classes are done in the usual way, with the added feature
+that the class specified to :func:`~sqlalchemy.orm.relation()` may be a string name.  The "class
+registry" associated with ``Base`` is used at mapper compilation time to
+resolve the name into the actual class object, which is expected to have been
+defined once the mapper configuration is used::
+
+    class User(Base):
+        __tablename__ = 'users'
+
+        id = Column(Integer, primary_key=True)
+        name = Column(String(50))
+        addresses = relation("Address", backref="user")
+
+    class Address(Base):
+        __tablename__ = 'addresses'
+
+        id = Column(Integer, primary_key=True)
+        email = Column(String(50))
+        user_id = Column(Integer, ForeignKey('users.id'))
+
+Column constructs, since they are just that, are immediately usable, as below
+where we define a primary join condition on the ``Address`` class using them::
+
+    class Address(Base):
+        __tablename__ = 'addresses'
+
+        id = Column(Integer, primary_key=True)
+        email = Column(String(50))
+        user_id = Column(Integer, ForeignKey('users.id'))
+        user = relation(User, primaryjoin=user_id == User.id)
+
+In addition to the main argument for :func:`~sqlalchemy.orm.relation`, other arguments
+which depend upon the columns present on an as-yet undefined class
+may also be specified as strings.  These strings are evaluated as
+Python expressions.  The full namespace available within this 
+evaluation includes all classes mapped for this declarative base,
+as well as the contents of the ``sqlalchemy`` package, including 
+expression functions like :func:`~sqlalchemy.sql.expression.desc` and :attr:`~sqlalchemy.sql.expression.func`::
+
+    class User(Base):
+        # ....
+        addresses = relation("Address", order_by="desc(Address.email)", 
+            primaryjoin="Address.user_id==User.id")
+
+As an alternative to string-based attributes, attributes may also be 
+defined after all classes have been created.  Just add them to the target
+class after the fact::
+
+    User.addresses = relation(Address, primaryjoin=Address.user_id == User.id)
+
+Configuring Many-to-Many Relations
+==================================
+
+There's nothing special about many-to-many with declarative.  The ``secondary``
+argument to :func:`~sqlalchemy.orm.relation` still requires a :class:`~sqlalchemy.schema.Table` object, not a declarative class.
+The :class:`~sqlalchemy.schema.Table` should share the same :class:`~sqlalchemy.schema.MetaData` object used by the declarative base::
+
+    keywords = Table('keywords', Base.metadata,
+                        Column('author_id', Integer, ForeignKey('authors.id')),
+                        Column('keyword_id', Integer, ForeignKey('keywords.id'))
+                )
+                
+    class Author(Base):
+        __tablename__ = 'authors'
+        id = Column(Integer, primary_key=True)
+        keywords = relation("Keyword", secondary=keywords)
+
+You should generally **not** map a class and also specify its table in a many-to-many
+relation, since the ORM may issue duplicate INSERT and DELETE statements.
+
+
+Defining Synonyms
+=================
+
+Synonyms are introduced in :ref:`synonyms`. To define a getter/setter which 
+proxies to an underlying attribute, use :func:`~sqlalchemy.orm.synonym` with the 
+``descriptor`` argument::
+
+    class MyClass(Base):
+        __tablename__ = 'sometable'
+
+        _attr = Column('attr', String)
+
+        def _get_attr(self):
+            return self._some_attr
+        def _set_attr(self, attr):
+            self._some_attr = attr
+        attr = synonym('_attr', descriptor=property(_get_attr, _set_attr))
+
+The above synonym is then usable as an instance attribute as well as a
+class-level expression construct::
+
+    x = MyClass()
+    x.attr = "some value"
+    session.query(MyClass).filter(MyClass.attr == 'some other value').all()
+
+For simple getters, the :func:`synonym_for` decorator can be used in conjunction
+with ``@property``::
+
+    class MyClass(Base):
+        __tablename__ = 'sometable'
+        
+        _attr = Column('attr', String)
+
+        @synonym_for('_attr')
+        @property
+        def attr(self):
+            return self._some_attr
+
+Similarly, :func:`comparable_using` is a front end for the :func:`~sqlalchemy.orm.comparable_property` 
+ORM function::
+
+    class MyClass(Base):
+        __tablename__ = 'sometable'
+
+        name = Column('name', String)
+
+        @comparable_using(MyUpperCaseComparator)
+        @property
+        def uc_name(self):
+            return self.name.upper()
+
+Table Configuration
+===================
+
+Table arguments other than the name, metadata, and mapped Column arguments 
+are specified using the ``__table_args__`` class attribute.   This attribute
+accommodates both positional as well as keyword arguments that are normally 
+sent to the :class:`~sqlalchemy.schema.Table` constructor.   The attribute can be specified
+in one of two forms.  One is as a dictionary::
+
+    class MyClass(Base):
+        __tablename__ = 'sometable'
+        __table_args__ = {'mysql_engine':'InnoDB'}
+
+The other, a tuple of the form ``(arg1, arg2, ..., {kwarg1:value, ...})``, which 
+allows positional arguments to be specified as well (usually constraints)::
+
+    class MyClass(Base):
+        __tablename__ = 'sometable'
+        __table_args__ = (
+                ForeignKeyConstraint(['id'], ['remote_table.id']),
+                UniqueConstraint('foo'),
+                {'autoload':True}
+                )
+
+Note that the dictionary is required in the tuple form even if empty.
+
+As an alternative to ``__tablename__``, a direct :class:`~sqlalchemy.schema.Table` 
+construct may be used.  The :class:`~sqlalchemy.schema.Column` objects, which 
+in this case require their names, will be
+added to the mapping just like a regular mapping to a table::
+
+    class MyClass(Base):
+        __table__ = Table('my_table', Base.metadata,
+            Column('id', Integer, primary_key=True),
+            Column('name', String(50))
+        )
+
+Mapper Configuration
+====================
+
+Mapper arguments are specified using the ``__mapper_args__`` class variable,
+which is a dictionary that accepts the same names as the :class:`~sqlalchemy.orm.mapper`
+function accepts as keywords::
+
+    class Widget(Base):
+        __tablename__ = 'widgets'
+        id = Column(Integer, primary_key=True)
+        
+        __mapper_args__ = {'extension': MyWidgetExtension()}
+
+Inheritance Configuration
+=========================
+
+Declarative supports all three forms of inheritance as intuitively
+as possible.  The ``inherits`` mapper keyword argument is not needed,
+as declarative will determine this from the class itself.   The various
+"polymorphic" keyword arguments are specified using ``__mapper_args__``.
+
+Joined Table Inheritance
+~~~~~~~~~~~~~~~~~~~~~~~~
+
+Joined table inheritance is defined as a subclass that defines its own 
+table::
+
+    class Person(Base):
+        __tablename__ = 'people'
+        id = Column(Integer, primary_key=True)
+        discriminator = Column('type', String(50))
+        __mapper_args__ = {'polymorphic_on': discriminator}
+
+    class Engineer(Person):
+        __tablename__ = 'engineers'
+        __mapper_args__ = {'polymorphic_identity': 'engineer'}
+        id = Column(Integer, ForeignKey('people.id'), primary_key=True)
+        primary_language = Column(String(50))
+
+Note that above, the ``Engineer.id`` attribute, since it shares the same
+attribute name as the ``Person.id`` attribute, will in fact represent the ``people.id``
+and ``engineers.id`` columns together, and will render inside a query as ``"people.id"``.
+To provide the ``Engineer`` class with an attribute that represents only the
+``engineers.id`` column, give it a different attribute name::
+
+    class Engineer(Person):
+        __tablename__ = 'engineers'
+        __mapper_args__ = {'polymorphic_identity': 'engineer'}
+        engineer_id = Column('id', Integer, ForeignKey('people.id'), primary_key=True)
+        primary_language = Column(String(50))
+
+Single Table Inheritance
+~~~~~~~~~~~~~~~~~~~~~~~~
+
+Single table inheritance is defined as a subclass that does not have its 
+own table; you just leave out the ``__table__`` and ``__tablename__`` attributes::
+
+    class Person(Base):
+        __tablename__ = 'people'
+        id = Column(Integer, primary_key=True)
+        discriminator = Column('type', String(50))
+        __mapper_args__ = {'polymorphic_on': discriminator}
+
+    class Engineer(Person):
+        __mapper_args__ = {'polymorphic_identity': 'engineer'}
+        primary_language = Column(String(50))
+
+When the above mappers are configured, the ``Person`` class is mapped to the ``people``
+table *before* the ``primary_language`` column is defined, and this column will not be included
+in its own mapping.   When ``Engineer`` then defines the ``primary_language`` 
+column, the column is added to the ``people`` table so that it is included in the mapping 
+for ``Engineer`` and is also part of the table's full set of columns.   
+Columns which are not mapped to ``Person`` are also excluded from any other 
+single or joined inheriting classes using the ``exclude_properties`` mapper argument.
+Below, ``Manager`` will have all the attributes of ``Person`` and ``Manager`` but *not*
+the ``primary_language`` attribute of ``Engineer``::
+
+    class Manager(Person):
+        __mapper_args__ = {'polymorphic_identity': 'manager'}
+        golf_swing = Column(String(50))
+
+The attribute exclusion logic is provided by the ``exclude_properties`` mapper argument,
+and declarative's default behavior can be disabled by passing an explicit 
+``exclude_properties`` collection (empty or otherwise) to the ``__mapper_args__``.
+
+Concrete Table Inheritance
+~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Concrete is defined as a subclass which has its own table and sets the 
+``concrete`` keyword argument to ``True``::
+
+    class Person(Base):
+        __tablename__ = 'people'
+        id = Column(Integer, primary_key=True)
+        name = Column(String(50))
+        
+    class Engineer(Person):
+        __tablename__ = 'engineers'
+        __mapper_args__ = {'concrete':True}
+        id = Column(Integer, primary_key=True)
+        primary_language = Column(String(50))
+        name = Column(String(50))
+
+Usage of an abstract base class is a little less straightforward as it requires 
+usage of :func:`~sqlalchemy.orm.util.polymorphic_union`::
+
+    engineers = Table('engineers', Base.metadata,
+                    Column('id', Integer, primary_key=True),
+                    Column('name', String(50)),
+                    Column('primary_language', String(50))
+                )
+    managers = Table('managers', Base.metadata,
+                    Column('id', Integer, primary_key=True),
+                    Column('name', String(50)),
+                    Column('golf_swing', String(50))
+                )
+    
+    punion = polymorphic_union({
+        'engineer':engineers,
+        'manager':managers
+    }, 'type', 'punion')
+    
+    class Person(Base):
+        __table__ = punion
+        __mapper_args__ = {'polymorphic_on':punion.c.type}
+        
+    class Engineer(Person):
+        __table__ = engineers
+        __mapper_args__ = {'polymorphic_identity':'engineer', 'concrete':True}
+
+    class Manager(Person):
+        __table__ = managers
+        __mapper_args__ = {'polymorphic_identity':'manager', 'concrete':True}
+    
+Class Usage
+===========
+
+As a convenience feature, the :func:`declarative_base` sets a default
+constructor on classes which takes keyword arguments, and assigns them to the
+named attributes::
+
+    e = Engineer(primary_language='python')
+
+Note that ``declarative`` has no integration built in with sessions, and is
+only intended as an optional syntax for the regular usage of mappers and Table
+objects.  A typical application setup using :func:`~sqlalchemy.orm.scoped_session` might look
+like::
+
+    engine = create_engine('postgres://scott:tiger@localhost/test')
+    Session = scoped_session(sessionmaker(autocommit=False,
+                                          autoflush=False,
+                                          bind=engine))
+    Base = declarative_base()
+
+Mapped instances then make usage of :class:`~sqlalchemy.orm.session.Session` in the usual way.
+
+"""
+
+from sqlalchemy.schema import Table, Column, MetaData
+from sqlalchemy.orm import synonym as _orm_synonym, mapper, comparable_property, class_mapper
+from sqlalchemy.orm.interfaces import MapperProperty
+from sqlalchemy.orm.properties import PropertyLoader, ColumnProperty
+from sqlalchemy.orm.util import _is_mapped_class
+from sqlalchemy import util, exceptions
+from sqlalchemy.sql import util as sql_util
+
+
+__all__ = 'declarative_base', 'synonym_for', 'comparable_using', 'instrument_declarative'
+
+def instrument_declarative(cls, registry, metadata):
+    """Given a class, configure the class declaratively,
+    using the given registry (any dictionary) and MetaData object.
+    This operation does not assume any kind of class hierarchy.
+    
+    """
+    if '_decl_class_registry' in cls.__dict__:
+        raise exceptions.InvalidRequestError("Class %r already has been instrumented declaratively" % cls)
+    cls._decl_class_registry = registry
+    cls.metadata = metadata
+    _as_declarative(cls, cls.__name__, cls.__dict__)
+    
+def _as_declarative(cls, classname, dict_):
+    cls._decl_class_registry[classname] = cls
+    our_stuff = util.OrderedDict()
+    for k in dict_:
+        value = dict_[k]
+        if (isinstance(value, tuple) and len(value) == 1 and
+            isinstance(value[0], (Column, MapperProperty))):
+            util.warn("Ignoring declarative-like tuple value of attribute "
+                      "%s: possibly a copy-and-paste error with a comma "
+                      "left at the end of the line?" % k)
+            continue
+        if not isinstance(value, (Column, MapperProperty)):
+            continue
+        prop = _deferred_relation(cls, value)
+        our_stuff[k] = prop
+
+    # set up attributes in the order they were created
+    our_stuff.sort(key=lambda key: our_stuff[key]._creation_order)
+
+    # extract columns from the class dict
+    cols = []
+    for key, c in our_stuff.iteritems():
+        if isinstance(c, ColumnProperty):
+            for col in c.columns:
+                if isinstance(col, Column) and col.table is None:
+                    _undefer_column_name(key, col)
+                    cols.append(col)
+        elif isinstance(c, Column):
+            _undefer_column_name(key, c)
+            cols.append(c)
+            # if the column is the same name as the key, 
+            # remove it from the explicit properties dict.
+            # the normal rules for assigning column-based properties
+            # will take over, including precedence of columns
+            # in multi-column ColumnProperties.
+            if key == c.key:
+                del our_stuff[key]
+
+    table = None
+    if '__table__' not in cls.__dict__:
+        if '__tablename__' in cls.__dict__:
+            tablename = cls.__tablename__
+            
+            table_args = cls.__dict__.get('__table_args__')
+            if isinstance(table_args, dict):
+                args, table_kw = (), table_args
+            elif isinstance(table_args, tuple):
+                args = table_args[0:-1]
+                table_kw = table_args[-1]
+                if len(table_args) < 2 or not isinstance(table_kw, dict):
+                    raise exceptions.ArgumentError(
+                                "Tuple form of __table_args__ is "
+                                "(arg1, arg2, arg3, ..., {'kw1':val1, 'kw2':val2, ...})"
+                            )
+            else:
+                args, table_kw = (), {}
+
+            autoload = cls.__dict__.get('__autoload__')
+            if autoload:
+                table_kw['autoload'] = True
+
+            cls.__table__ = table = Table(tablename, cls.metadata,
+                                          *(tuple(cols) + tuple(args)), **table_kw)
+    else:
+        table = cls.__table__
+        if cols:
+            for c in cols:
+                if not table.c.contains_column(c):
+                    raise exceptions.ArgumentError("Can't add additional column %r when specifying __table__" % key)
+            
+    mapper_args = getattr(cls, '__mapper_args__', {})
+    if 'inherits' not in mapper_args:
+        for c in cls.__bases__:
+            if _is_mapped_class(c):
+                mapper_args['inherits'] = cls._decl_class_registry.get(c.__name__, None)
+                break
+
+    if hasattr(cls, '__mapper_cls__'):
+        mapper_cls = util.unbound_method_to_callable(cls.__mapper_cls__)
+    else:
+        mapper_cls = mapper
+
+    if not table and 'inherits' not in mapper_args:
+        raise exceptions.InvalidRequestError("Class %r does not have a __table__ or __tablename__ "
+                    "specified and does not inherit from an existing table-mapped class." % cls)
+
+    elif 'inherits' in mapper_args and not mapper_args.get('concrete', False):
+        inherited_mapper = class_mapper(mapper_args['inherits'], compile=False)
+        inherited_table = inherited_mapper.local_table
+        if 'inherit_condition' not in mapper_args and table:
+            # figure out the inherit condition with relaxed rules
+            # about nonexistent tables, to allow for ForeignKeys to
+            # not-yet-defined tables (since we know for sure that our
+            # parent table is defined within the same MetaData)
+            mapper_args['inherit_condition'] = sql_util.join_condition(
+                mapper_args['inherits'].__table__, table,
+                ignore_nonexistent_tables=True)
+
+        if not table:
+            # single table inheritance.
+            # ensure no table args
+            table_args = cls.__dict__.get('__table_args__')
+            if table_args is not None:
+                raise exceptions.ArgumentError("Can't place __table_args__ on an inherited class with no table.")
+        
+            # add any columns declared here to the inherited table.
+            for c in cols:
+                if c.primary_key:
+                    raise exceptions.ArgumentError("Can't place primary key columns on an inherited class with no table.")
+                inherited_table.append_column(c)
+    
+        # single or joined inheritance
+        # exclude any cols on the inherited table which are not mapped on the parent class, to avoid
+        # mapping columns specific to sibling/nephew classes
+        inherited_mapper = class_mapper(mapper_args['inherits'], compile=False)
+        inherited_table = inherited_mapper.local_table
+        
+        if 'exclude_properties' not in mapper_args:
+            mapper_args['exclude_properties'] = exclude_properties = \
+                set([c.key for c in inherited_table.c if c not in inherited_mapper._columntoproperty])
+            exclude_properties.difference_update([c.key for c in cols])
+    
+    cls.__mapper__ = mapper_cls(cls, table, properties=our_stuff, **mapper_args)
+
+class DeclarativeMeta(type):
+    def __init__(cls, classname, bases, dict_):
+        if '_decl_class_registry' in cls.__dict__:
+            return type.__init__(cls, classname, bases, dict_)
+        
+        _as_declarative(cls, classname, dict_)
+        return type.__init__(cls, classname, bases, dict_)
+
+    def __setattr__(cls, key, value):
+        if '__mapper__' in cls.__dict__:
+            if isinstance(value, Column):
+                _undefer_column_name(key, value)
+                cls.__table__.append_column(value)
+                cls.__mapper__.add_property(key, value)
+            elif isinstance(value, ColumnProperty):
+                for col in value.columns:
+                    if isinstance(col, Column) and col.table is None:
+                        _undefer_column_name(key, col)
+                        cls.__table__.append_column(col)
+                cls.__mapper__.add_property(key, value)
+            elif isinstance(value, MapperProperty):
+                cls.__mapper__.add_property(key, _deferred_relation(cls, value))
+            else:
+                type.__setattr__(cls, key, value)
+        else:
+            type.__setattr__(cls, key, value)
+
+
+class _GetColumns(object):
+    def __init__(self, cls):
+        self.cls = cls
+    def __getattr__(self, key):
+        mapper = class_mapper(self.cls, compile=False)
+        if not mapper:
+            return getattr(self.cls, key)
+        else:
+            prop = mapper.get_property(key)
+            if not isinstance(prop, ColumnProperty):
+                raise exceptions.InvalidRequestError("Property %r is not an instance of ColumnProperty (i.e. does not correspnd directly to a Column)." % key)
+            return prop.columns[0]
+
+
+def _deferred_relation(cls, prop):
+    def resolve_arg(arg):
+        import sqlalchemy
+        
+        def access_cls(key):
+            if key in cls._decl_class_registry:
+                return _GetColumns(cls._decl_class_registry[key])
+            elif key in cls.metadata.tables:
+                return cls.metadata.tables[key]
+            else:
+                return sqlalchemy.__dict__[key]
+
+        d = util.PopulateDict(access_cls)
+        def return_cls():
+            try:
+                x = eval(arg, globals(), d)
+                
+                if isinstance(x, _GetColumns):
+                    return x.cls
+                else:
+                    return x
+            except NameError, n:
+                raise exceptions.InvalidRequestError(
+                    "When compiling mapper %s, expression %r failed to locate a name (%r). "
+                    "If this is a class name, consider adding this relation() to the %r "
+                    "class after both dependent classes have been defined." % (
+                    prop.parent, arg, n.args[0], cls))
+        return return_cls
+
+    if isinstance(prop, PropertyLoader):
+        for attr in ('argument', 'order_by', 'primaryjoin', 'secondaryjoin', 'secondary', '_foreign_keys', 'remote_side'):
+            v = getattr(prop, attr)
+            if isinstance(v, basestring):
+                setattr(prop, attr, resolve_arg(v))
+
+        if prop.backref:
+            for attr in ('primaryjoin', 'secondaryjoin', 'secondary', 'foreign_keys', 'remote_side', 'order_by'):
+               if attr in prop.backref.kwargs and isinstance(prop.backref.kwargs[attr], basestring):
+                   prop.backref.kwargs[attr] = resolve_arg(prop.backref.kwargs[attr])
+
+
+    return prop
+
+def synonym_for(name, map_column=False):
+    """Decorator, make a Python @property a query synonym for a column.
+
+    A decorator version of :func:`~sqlalchemy.orm.synonym`.  The function being
+    decorated is the 'descriptor', otherwise passes its arguments through
+    to synonym()::
+
+      @synonym_for('col')
+      @property
+      def prop(self):
+          return 'special sauce'
+
+    The regular ``synonym()`` is also usable directly in a declarative setting
+    and may be convenient for read/write properties::
+
+      prop = synonym('col', descriptor=property(_read_prop, _write_prop))
+
+    """
+    def decorate(fn):
+        return _orm_synonym(name, map_column=map_column, descriptor=fn)
+    return decorate
+
+def comparable_using(comparator_factory):
+    """Decorator, allow a Python @property to be used in query criteria.
+
+    A decorator front end to :func:`~sqlalchemy.orm.comparable_property`, passes
+    through the comparator_factory and the function being decorated::
+
+      @comparable_using(MyComparatorType)
+      @property
+      def prop(self):
+          return 'special sauce'
+
+    The regular ``comparable_property()`` is also usable directly in a
+    declarative setting and may be convenient for read/write properties::
+
+      prop = comparable_property(MyComparatorType)
+
+    """
+    def decorate(fn):
+        return comparable_property(comparator_factory, fn)
+    return decorate
+
+def _declarative_constructor(self, **kwargs):
+    """A simple constructor that allows initialization from kwargs.
+
+    Sets kwargs on the constructed instance.  Only keys that are present as
+    attributes of type(self) are allowed (for example, any mapped column or
+    relation).
+    
+    """
+    for k in kwargs:
+        if not hasattr(type(self), k):
+            raise TypeError(
+                "%r is an invalid keyword argument for %s" %
+                (k, type(self).__name__))
+        setattr(self, k, kwargs[k])
+_declarative_constructor.__name__ = '__init__'
+
+def declarative_base(bind=None, metadata=None, mapper=None, cls=object,
+                     name='Base', constructor=_declarative_constructor,
+                     metaclass=DeclarativeMeta, engine=None):
+    """Construct a base class for declarative class definitions.
+
+    The new base class will be given a metaclass that invokes
+    :func:`instrument_declarative()` upon each subclass definition, and routes
+    later Column- and Mapper-related attribute assignments made on the class
+    into Table and Mapper assignments.  
+
+    :param bind: An optional :class:`~sqlalchemy.engine.base.Connectable`, will be assigned 
+      the ``bind`` attribute on the :class:`~sqlalchemy.MetaData` instance.
+      The `engine` keyword argument is a deprecated synonym for `bind`.
+
+    :param metadata:
+      An optional :class:`~sqlalchemy.MetaData` instance.  All :class:`~sqlalchemy.schema.Table` 
+      objects implicitly declared by
+      subclasses of the base will share this MetaData.  A MetaData instance
+      will be create if none is provided.  The MetaData instance will be
+      available via the `metadata` attribute of the generated declarative
+      base class.
+
+    :param mapper:
+      An optional callable, defaults to :func:`~sqlalchemy.orm.mapper`.  Will be
+      used to map subclasses to their Tables.
+
+    :param cls:
+      Defaults to :class:`object`.  A type to use as the base for the generated
+      declarative base class.  May be a type or tuple of types.
+
+    :param name:
+      Defaults to ``Base``.  The display name for the generated
+      class.  Customizing this is not required, but can improve clarity in
+      tracebacks and debugging.
+
+    :param constructor:
+      Defaults to declarative._declarative_constructor, an __init__
+      implementation that assigns \**kwargs for declared fields and relations
+      to an instance.  If ``None`` is supplied, no __init__ will be installed
+      and construction will fall back to cls.__init__ with normal Python
+      semantics.
+
+    :param metaclass:
+      Defaults to :class:`DeclarativeMeta`.  A metaclass or __metaclass__
+      compatible callable to use as the meta type of the generated
+      declarative base class.
+
+    """
+    lcl_metadata = metadata or MetaData()
+    if bind or engine:
+        lcl_metadata.bind = bind or engine
+
+    bases = not isinstance(cls, tuple) and (cls,) or cls
+    class_dict = dict(_decl_class_registry=dict(),
+                      metadata=lcl_metadata)
+
+    if constructor:
+        class_dict['__init__'] = constructor
+    if mapper:
+        class_dict['__mapper_cls__'] = mapper
+
+    return metaclass(name, bases, class_dict)
+
+def _undefer_column_name(key, column):
+    if column.key is None:
+        column.key = key
+    if column.name is None:
+        column.name = key
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/ext/orderinglist.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/ext/orderinglist.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/ext/orderinglist.py (revision 3)
@@ -0,0 +1,283 @@
+"""A custom list that manages index/position information for its children.
+
+``orderinglist`` is a custom list collection implementation for mapped
+relations that keeps an arbitrary "position" attribute on contained objects in
+sync with each object's position in the Python list.
+
+The collection acts just like a normal Python ``list``, with the added
+behavior that as you manipulate the list (via ``insert``, ``pop``, assignment,
+deletion, what have you), each of the objects it contains is updated as needed
+to reflect its position.  This is very useful for managing ordered relations
+which have a user-defined, serialized order::
+
+  >>> from sqlalchemy import MetaData, Table, Column, Integer, String, ForeignKey
+  >>> from sqlalchemy.orm import mapper, relation
+  >>> from sqlalchemy.ext.orderinglist import ordering_list
+
+A simple model of users their "top 10" things::
+
+  >>> metadata = MetaData()
+  >>> users = Table('users', metadata,
+  ...               Column('id', Integer, primary_key=True))
+  >>> blurbs = Table('user_top_ten_list', metadata,
+  ...               Column('id', Integer, primary_key=True),
+  ...               Column('user_id', Integer, ForeignKey('users.id')),
+  ...               Column('position', Integer),
+  ...               Column('blurb', String(80)))
+  >>> class User(object):
+  ...   pass
+  ...
+  >>> class Blurb(object):
+  ...    def __init__(self, blurb):
+  ...        self.blurb = blurb
+  ...
+  >>> mapper(User, users, properties={
+  ...  'topten': relation(Blurb, collection_class=ordering_list('position'),
+  ...                     order_by=[blurbs.c.position])})
+  <Mapper ...>
+  >>> mapper(Blurb, blurbs)
+  <Mapper ...>
+
+Acts just like a regular list::
+
+  >>> u = User()
+  >>> u.topten.append(Blurb('Number one!'))
+  >>> u.topten.append(Blurb('Number two!'))
+
+But the ``.position`` attibute is set automatically behind the scenes::
+
+  >>> assert [blurb.position for blurb in u.topten] == [0, 1]
+
+The objects will be renumbered automaticaly after any list-changing operation,
+for example an ``insert()``::
+
+  >>> u.topten.insert(1, Blurb('I am the new Number Two.'))
+  >>> assert [blurb.position for blurb in u.topten] == [0, 1, 2]
+  >>> assert u.topten[1].blurb == 'I am the new Number Two.'
+  >>> assert u.topten[1].position == 1
+
+Numbering and serialization are both highly configurable.  See the docstrings
+in this module and the main SQLAlchemy documentation for more information and
+examples.
+
+The :class:`~sqlalchemy.ext.orderinglist.ordering_list` factory function is the
+ORM-compatible constructor for `OrderingList` instances.
+
+"""
+from sqlalchemy.orm.collections import collection
+from sqlalchemy import util
+
+__all__ = [ 'ordering_list' ]
+
+
+def ordering_list(attr, count_from=None, **kw):
+    """Prepares an OrderingList factory for use in mapper definitions.
+
+    Returns an object suitable for use as an argument to a Mapper relation's
+    ``collection_class`` option.  Arguments are:
+
+    attr
+      Name of the mapped attribute to use for storage and retrieval of
+      ordering information
+
+    count_from (optional)
+      Set up an integer-based ordering, starting at ``count_from``.  For
+      example, ``ordering_list('pos', count_from=1)`` would create a 1-based
+      list in SQL, storing the value in the 'pos' column.  Ignored if
+      ``ordering_func`` is supplied.
+
+    Passes along any keyword arguments to ``OrderingList`` constructor.
+    """
+
+    kw = _unsugar_count_from(count_from=count_from, **kw)
+    return lambda: OrderingList(attr, **kw)
+
+# Ordering utility functions
+def count_from_0(index, collection):
+    """Numbering function: consecutive integers starting at 0."""
+
+    return index
+
+def count_from_1(index, collection):
+    """Numbering function: consecutive integers starting at 1."""
+
+    return index + 1
+
+def count_from_n_factory(start):
+    """Numbering function: consecutive integers starting at arbitrary start."""
+
+    def f(index, collection):
+        return index + start
+    try:
+        f.__name__ = 'count_from_%i' % start
+    except TypeError:
+        pass
+    return f
+
+def _unsugar_count_from(**kw):
+    """Builds counting functions from keywrod arguments.
+
+    Keyword argument filter, prepares a simple ``ordering_func`` from a
+    ``count_from`` argument, otherwise passes ``ordering_func`` on unchanged.
+    """
+
+    count_from = kw.pop('count_from', None)
+    if kw.get('ordering_func', None) is None and count_from is not None:
+        if count_from == 0:
+            kw['ordering_func'] = count_from_0
+        elif count_from == 1:
+            kw['ordering_func'] = count_from_1
+        else:
+            kw['ordering_func'] = count_from_n_factory(count_from)
+    return kw
+
+class OrderingList(list):
+    """A custom list that manages position information for its children.
+
+    See the module and __init__ documentation for more details.  The
+    ``ordering_list`` factory function is used to configure ``OrderingList``
+    collections in ``mapper`` relation definitions.
+
+    """
+
+    def __init__(self, ordering_attr=None, ordering_func=None,
+                 reorder_on_append=False):
+        """A custom list that manages position information for its children.
+
+        ``OrderingList`` is a ``collection_class`` list implementation that
+        syncs position in a Python list with a position attribute on the
+        mapped objects.
+
+        This implementation relies on the list starting in the proper order,
+        so be **sure** to put an ``order_by`` on your relation.
+
+        ordering_attr
+          Name of the attribute that stores the object's order in the
+          relation.
+
+        ordering_func
+          Optional.  A function that maps the position in the Python list to a
+          value to store in the ``ordering_attr``.  Values returned are
+          usually (but need not be!) integers.
+
+          An ``ordering_func`` is called with two positional parameters: the
+          index of the element in the list, and the list itself.
+
+          If omitted, Python list indexes are used for the attribute values.
+          Two basic pre-built numbering functions are provided in this module:
+          ``count_from_0`` and ``count_from_1``.  For more exotic examples
+          like stepped numbering, alphabetical and Fibonacci numbering, see
+          the unit tests.
+
+        reorder_on_append
+          Default False.  When appending an object with an existing (non-None)
+          ordering value, that value will be left untouched unless
+          ``reorder_on_append`` is true.  This is an optimization to avoid a
+          variety of dangerous unexpected database writes.
+
+          SQLAlchemy will add instances to the list via append() when your
+          object loads.  If for some reason the result set from the database
+          skips a step in the ordering (say, row '1' is missing but you get
+          '2', '3', and '4'), reorder_on_append=True would immediately
+          renumber the items to '1', '2', '3'.  If you have multiple sessions
+          making changes, any of whom happen to load this collection even in
+          passing, all of the sessions would try to "clean up" the numbering
+          in their commits, possibly causing all but one to fail with a
+          concurrent modification error.  Spooky action at a distance.
+
+          Recommend leaving this with the default of False, and just call
+          ``reorder()`` if you're doing ``append()`` operations with
+          previously ordered instances or when doing some housekeeping after
+          manual sql operations.
+
+        """
+        self.ordering_attr = ordering_attr
+        if ordering_func is None:
+            ordering_func = count_from_0
+        self.ordering_func = ordering_func
+        self.reorder_on_append = reorder_on_append
+
+    # More complex serialization schemes (multi column, e.g.) are possible by
+    # subclassing and reimplementing these two methods.
+    def _get_order_value(self, entity):
+        return getattr(entity, self.ordering_attr)
+
+    def _set_order_value(self, entity, value):
+        setattr(entity, self.ordering_attr, value)
+
+    def reorder(self):
+        """Synchronize ordering for the entire collection.
+
+        Sweeps through the list and ensures that each object has accurate
+        ordering information set.
+
+        """
+        for index, entity in enumerate(self):
+            self._order_entity(index, entity, True)
+
+    # As of 0.5, _reorder is no longer semi-private
+    _reorder = reorder
+
+    def _order_entity(self, index, entity, reorder=True):
+        have = self._get_order_value(entity)
+
+        # Don't disturb existing ordering if reorder is False
+        if have is not None and not reorder:
+            return
+
+        should_be = self.ordering_func(index, self)
+        if have != should_be:
+            self._set_order_value(entity, should_be)
+
+    def append(self, entity):
+        super(OrderingList, self).append(entity)
+        self._order_entity(len(self) - 1, entity, self.reorder_on_append)
+
+    def _raw_append(self, entity):
+        """Append without any ordering behavior."""
+
+        super(OrderingList, self).append(entity)
+    _raw_append = collection.adds(1)(_raw_append)
+
+    def insert(self, index, entity):
+        self[index:index] = [entity]
+
+    def remove(self, entity):
+        super(OrderingList, self).remove(entity)
+        self._reorder()
+
+    def pop(self, index=-1):
+        entity = super(OrderingList, self).pop(index)
+        self._reorder()
+        return entity
+
+    def __setitem__(self, index, entity):
+        if isinstance(index, slice):
+            for i in range(index.start or 0, index.stop or 0, index.step or 1):
+                self.__setitem__(i, entity[i])
+        else:
+            self._order_entity(index, entity, True)
+            super(OrderingList, self).__setitem__(index, entity)
+
+    def __delitem__(self, index):
+        super(OrderingList, self).__delitem__(index)
+        self._reorder()
+
+    def __setslice__(self, start, end, values):
+        super(OrderingList, self).__setslice__(start, end, values)
+        self._reorder()
+
+    def __delslice__(self, start, end):
+        super(OrderingList, self).__delslice__(start, end)
+        self._reorder()
+
+    for func_name, func in locals().items():
+        if (util.callable(func) and func.func_name == func_name and
+            not func.__doc__ and hasattr(list, func_name)):
+            func.__doc__ = getattr(list, func_name).__doc__
+    del func_name, func
+
+if __name__ == '__main__':
+    import doctest
+    doctest.testmod(optionflags=doctest.ELLIPSIS)
+
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/ext/sqlsoup.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/ext/sqlsoup.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/ext/sqlsoup.py (revision 3)
@@ -0,0 +1,567 @@
+"""
+Introduction
+============
+
+SqlSoup provides a convenient way to access database tables without
+having to declare table or mapper classes ahead of time.
+
+Suppose we have a database with users, books, and loans tables
+(corresponding to the PyWebOff dataset, if you're curious).  For
+testing purposes, we'll create this db as follows::
+
+    >>> from sqlalchemy import create_engine
+    >>> e = create_engine('sqlite:///:memory:')
+    >>> for sql in _testsql: e.execute(sql) #doctest: +ELLIPSIS
+    <...
+
+Creating a SqlSoup gateway is just like creating an SQLAlchemy
+engine::
+
+    >>> from sqlalchemy.ext.sqlsoup import SqlSoup
+    >>> db = SqlSoup('sqlite:///:memory:')
+
+or, you can re-use an existing metadata or engine::
+
+    >>> db = SqlSoup(MetaData(e))
+
+You can optionally specify a schema within the database for your
+SqlSoup::
+
+    # >>> db.schema = myschemaname
+
+
+Loading objects
+===============
+
+Loading objects is as easy as this::
+
+    >>> users = db.users.all()
+    >>> users.sort()
+    >>> users
+    [MappedUsers(name=u'Joe Student',email=u'student@example.edu',password=u'student',classname=None,admin=0), MappedUsers(name=u'Bhargan Basepair',email=u'basepair@example.edu',password=u'basepair',classname=None,admin=1)]
+
+Of course, letting the database do the sort is better::
+
+    >>> db.users.order_by(db.users.name).all()
+    [MappedUsers(name=u'Bhargan Basepair',email=u'basepair@example.edu',password=u'basepair',classname=None,admin=1), MappedUsers(name=u'Joe Student',email=u'student@example.edu',password=u'student',classname=None,admin=0)]
+
+Field access is intuitive::
+
+    >>> users[0].email
+    u'student@example.edu'
+
+Of course, you don't want to load all users very often.  Let's add a
+WHERE clause.  Let's also switch the order_by to DESC while we're at
+it::
+
+    >>> from sqlalchemy import or_, and_, desc
+    >>> where = or_(db.users.name=='Bhargan Basepair', db.users.email=='student@example.edu')
+    >>> db.users.filter(where).order_by(desc(db.users.name)).all()
+    [MappedUsers(name=u'Joe Student',email=u'student@example.edu',password=u'student',classname=None,admin=0), MappedUsers(name=u'Bhargan Basepair',email=u'basepair@example.edu',password=u'basepair',classname=None,admin=1)]
+
+You can also use .first() (to retrieve only the first object from a query) or
+.one() (like .first when you expect exactly one user -- it will raise an
+exception if more were returned)::
+
+    >>> db.users.filter(db.users.name=='Bhargan Basepair').one()
+    MappedUsers(name=u'Bhargan Basepair',email=u'basepair@example.edu',password=u'basepair',classname=None,admin=1)
+
+Since name is the primary key, this is equivalent to
+
+    >>> db.users.get('Bhargan Basepair')
+    MappedUsers(name=u'Bhargan Basepair',email=u'basepair@example.edu',password=u'basepair',classname=None,admin=1)
+
+This is also equivalent to
+
+    >>> db.users.filter_by(name='Bhargan Basepair').one()
+    MappedUsers(name=u'Bhargan Basepair',email=u'basepair@example.edu',password=u'basepair',classname=None,admin=1)
+
+filter_by is like filter, but takes kwargs instead of full clause expressions.
+This makes it more concise for simple queries like this, but you can't do
+complex queries like the or\_ above or non-equality based comparisons this way.
+
+Full query documentation
+------------------------
+
+Get, filter, filter_by, order_by, limit, and the rest of the
+query methods are explained in detail in the `SQLAlchemy documentation`__.
+
+__ http://www.sqlalchemy.org/docs/04/ormtutorial.html#datamapping_querying
+
+
+Modifying objects
+=================
+
+Modifying objects is intuitive::
+
+    >>> user = _
+    >>> user.email = 'basepair+nospam@example.edu'
+    >>> db.flush()
+
+(SqlSoup leverages the sophisticated SQLAlchemy unit-of-work code, so
+multiple updates to a single object will be turned into a single
+``UPDATE`` statement when you flush.)
+
+To finish covering the basics, let's insert a new loan, then delete
+it::
+
+    >>> book_id = db.books.filter_by(title='Regional Variation in Moss').first().id
+    >>> db.loans.insert(book_id=book_id, user_name=user.name)
+    MappedLoans(book_id=2,user_name=u'Bhargan Basepair',loan_date=None)
+    >>> db.flush()
+
+    >>> loan = db.loans.filter_by(book_id=2, user_name='Bhargan Basepair').one()
+    >>> db.delete(loan)
+    >>> db.flush()
+
+You can also delete rows that have not been loaded as objects. Let's
+do our insert/delete cycle once more, this time using the loans
+table's delete method. (For SQLAlchemy experts: note that no flush()
+call is required since this delete acts at the SQL level, not at the
+Mapper level.) The same where-clause construction rules apply here as
+to the select methods.
+
+::
+
+    >>> db.loans.insert(book_id=book_id, user_name=user.name)
+    MappedLoans(book_id=2,user_name=u'Bhargan Basepair',loan_date=None)
+    >>> db.flush()
+    >>> db.loans.delete(db.loans.book_id==2)
+
+You can similarly update multiple rows at once. This will change the
+book_id to 1 in all loans whose book_id is 2::
+
+    >>> db.loans.update(db.loans.book_id==2, book_id=1)
+    >>> db.loans.filter_by(book_id=1).all()
+    [MappedLoans(book_id=1,user_name=u'Joe Student',loan_date=datetime.datetime(2006, 7, 12, 0, 0))]
+
+
+Joins
+=====
+
+Occasionally, you will want to pull out a lot of data from related
+tables all at once.  In this situation, it is far more efficient to
+have the database perform the necessary join.  (Here we do not have *a
+lot of data* but hopefully the concept is still clear.)  SQLAlchemy is
+smart enough to recognize that loans has a foreign key to users, and
+uses that as the join condition automatically.
+
+::
+
+    >>> join1 = db.join(db.users, db.loans, isouter=True)
+    >>> join1.filter_by(name='Joe Student').all()
+    [MappedJoin(name=u'Joe Student',email=u'student@example.edu',password=u'student',classname=None,admin=0,book_id=1,user_name=u'Joe Student',loan_date=datetime.datetime(2006, 7, 12, 0, 0))]
+
+If you're unfortunate enough to be using MySQL with the default MyISAM
+storage engine, you'll have to specify the join condition manually,
+since MyISAM does not store foreign keys.  Here's the same join again,
+with the join condition explicitly specified::
+
+    >>> db.join(db.users, db.loans, db.users.name==db.loans.user_name, isouter=True)
+    <class 'sqlalchemy.ext.sqlsoup.MappedJoin'>
+
+You can compose arbitrarily complex joins by combining Join objects
+with tables or other joins.  Here we combine our first join with the
+books table::
+
+    >>> join2 = db.join(join1, db.books)
+    >>> join2.all()
+    [MappedJoin(name=u'Joe Student',email=u'student@example.edu',password=u'student',classname=None,admin=0,book_id=1,user_name=u'Joe Student',loan_date=datetime.datetime(2006, 7, 12, 0, 0),id=1,title=u'Mustards I Have Known',published_year=u'1989',authors=u'Jones')]
+
+If you join tables that have an identical column name, wrap your join
+with `with_labels`, to disambiguate columns with their table name
+(.c is short for .columns)::
+
+    >>> db.with_labels(join1).c.keys()
+    [u'users_name', u'users_email', u'users_password', u'users_classname', u'users_admin', u'loans_book_id', u'loans_user_name', u'loans_loan_date']
+
+You can also join directly to a labeled object::
+
+    >>> labeled_loans = db.with_labels(db.loans)
+    >>> db.join(db.users, labeled_loans, isouter=True).c.keys()
+    [u'name', u'email', u'password', u'classname', u'admin', u'loans_book_id', u'loans_user_name', u'loans_loan_date']
+
+
+Relations
+=========
+
+You can define relations on SqlSoup classes:
+
+    >>> db.users.relate('loans', db.loans)
+
+These can then be used like a normal SA property:
+
+    >>> db.users.get('Joe Student').loans
+    [MappedLoans(book_id=1,user_name=u'Joe Student',loan_date=datetime.datetime(2006, 7, 12, 0, 0))]
+
+    >>> db.users.filter(~db.users.loans.any()).all()
+    [MappedUsers(name=u'Bhargan Basepair',email='basepair+nospam@example.edu',password=u'basepair',classname=None,admin=1)]
+
+
+relate can take any options that the relation function accepts in normal mapper definition:
+
+    >>> del db._cache['users']
+    >>> db.users.relate('loans', db.loans, order_by=db.loans.loan_date, cascade='all, delete-orphan')
+
+
+Advanced Use
+============
+
+Accessing the Session
+---------------------
+
+SqlSoup uses a ScopedSession to provide thread-local sessions.  You
+can get a reference to the current one like this::
+
+    >>> from sqlalchemy.ext.sqlsoup import Session
+    >>> session = Session()
+
+Now you have access to all the standard session-based SA features,
+such as transactions.  (SqlSoup's ``flush()`` is normally
+transactionalized, but you can perform manual transaction management
+if you need a transaction to span multiple flushes.)
+
+
+Mapping arbitrary Selectables
+-----------------------------
+
+SqlSoup can map any SQLAlchemy ``Selectable`` with the map
+method. Let's map a ``Select`` object that uses an aggregate function;
+we'll use the SQLAlchemy ``Table`` that SqlSoup introspected as the
+basis. (Since we're not mapping to a simple table or join, we need to
+tell SQLAlchemy how to find the *primary key* which just needs to be
+unique within the select, and not necessarily correspond to a *real*
+PK in the database.)
+
+::
+
+    >>> from sqlalchemy import select, func
+    >>> b = db.books._table
+    >>> s = select([b.c.published_year, func.count('*').label('n')], from_obj=[b], group_by=[b.c.published_year])
+    >>> s = s.alias('years_with_count')
+    >>> years_with_count = db.map(s, primary_key=[s.c.published_year])
+    >>> years_with_count.filter_by(published_year='1989').all()
+    [MappedBooks(published_year=u'1989',n=1)]
+
+Obviously if we just wanted to get a list of counts associated with
+book years once, raw SQL is going to be less work. The advantage of
+mapping a Select is reusability, both standalone and in Joins. (And if
+you go to full SQLAlchemy, you can perform mappings like this directly
+to your object models.)
+
+An easy way to save mapped selectables like this is to just hang them on
+your db object::
+
+    >>> db.years_with_count = years_with_count
+
+Python is flexible like that!
+
+
+Raw SQL
+-------
+
+SqlSoup works fine with SQLAlchemy's `text block support`__.
+
+__ http://www.sqlalchemy.org/docs/04/sqlexpression.html#sql_text
+
+You can also access the SqlSoup's `engine` attribute to compose SQL
+directly.  The engine's ``execute`` method corresponds to the one of a
+DBAPI cursor, and returns a ``ResultProxy`` that has ``fetch`` methods
+you would also see on a cursor::
+
+    >>> rp = db.bind.execute('select name, email from users order by name')
+    >>> for name, email in rp.fetchall(): print name, email
+    Bhargan Basepair basepair+nospam@example.edu
+    Joe Student student@example.edu
+
+You can also pass this engine object to other SQLAlchemy constructs.
+
+
+Dynamic table names
+-------------------
+
+You can load a table whose name is specified at runtime with the entity() method:
+
+    >>> tablename = 'loans'
+    >>> db.entity(tablename) == db.loans
+    True
+
+entity() also takes an optional schema argument.  If none is specified, the
+default schema is used.
+
+
+Extra tests
+===========
+
+Boring tests here.  Nothing of real expository value.
+
+::
+
+    >>> db.users.filter_by(classname=None).order_by(db.users.name).all()
+    [MappedUsers(name=u'Bhargan Basepair',email=u'basepair+nospam@example.edu',password=u'basepair',classname=None,admin=1), MappedUsers(name=u'Joe Student',email=u'student@example.edu',password=u'student',classname=None,admin=0)]
+
+    >>> db.nopk
+    Traceback (most recent call last):
+    ...
+    PKNotFoundError: table 'nopk' does not have a primary key defined [columns: i]
+
+    >>> db.nosuchtable
+    Traceback (most recent call last):
+    ...
+    NoSuchTableError: nosuchtable
+
+    >>> years_with_count.insert(published_year='2007', n=1)
+    Traceback (most recent call last):
+    ...
+    InvalidRequestError: SQLSoup can only modify mapped Tables (found: Alias)
+
+    [tests clear()]
+    >>> db.loans.count()
+    1
+    >>> _ = db.loans.insert(book_id=1, user_name='Bhargan Basepair')
+    >>> db.expunge_all()
+    >>> db.flush()
+    >>> db.loans.count()
+    1
+"""
+
+from sqlalchemy import Table, MetaData, join
+from sqlalchemy import schema, sql
+from sqlalchemy.orm import scoped_session, sessionmaker, mapper, class_mapper, relation
+from sqlalchemy.exceptions import SQLAlchemyError, InvalidRequestError
+from sqlalchemy.sql import expression
+
+_testsql = """
+CREATE TABLE books (
+    id                   integer PRIMARY KEY, -- auto-increments in sqlite
+    title                text NOT NULL,
+    published_year       char(4) NOT NULL,
+    authors              text NOT NULL
+);
+
+CREATE TABLE users (
+    name                 varchar(32) PRIMARY KEY,
+    email                varchar(128) NOT NULL,
+    password             varchar(128) NOT NULL,
+    classname            text,
+    admin                int NOT NULL -- 0 = false
+);
+
+CREATE TABLE loans (
+    book_id              int PRIMARY KEY REFERENCES books(id),
+    user_name            varchar(32) references users(name)
+        ON DELETE SET NULL ON UPDATE CASCADE,
+    loan_date            datetime DEFAULT current_timestamp
+);
+
+insert into users(name, email, password, admin)
+values('Bhargan Basepair', 'basepair@example.edu', 'basepair', 1);
+insert into users(name, email, password, admin)
+values('Joe Student', 'student@example.edu', 'student', 0);
+
+insert into books(title, published_year, authors)
+values('Mustards I Have Known', '1989', 'Jones');
+insert into books(title, published_year, authors)
+values('Regional Variation in Moss', '1971', 'Flim and Flam');
+
+insert into loans(book_id, user_name, loan_date)
+values (
+    (select min(id) from books),
+    (select name from users where name like 'Joe%'),
+    '2006-07-12 0:0:0')
+;
+
+CREATE TABLE nopk (
+    i                    int
+);
+""".split(';')
+
+__all__ = ['PKNotFoundError', 'SqlSoup']
+
+Session = scoped_session(sessionmaker(autoflush=True))
+
+class PKNotFoundError(SQLAlchemyError):
+    pass
+
+def _ddl_error(cls):
+    msg = 'SQLSoup can only modify mapped Tables (found: %s)' \
+          % cls._table.__class__.__name__
+    raise InvalidRequestError(msg)
+
+# metaclass is necessary to expose class methods with getattr, e.g.
+# we want to pass db.users.select through to users._mapper.select
+class SelectableClassType(type):
+    def insert(cls, **kwargs):
+        _ddl_error(cls)
+
+    def delete(cls, *args, **kwargs):
+        _ddl_error(cls)
+
+    def update(cls, whereclause=None, values=None, **kwargs):
+        _ddl_error(cls)
+
+    def __clause_element__(cls):
+        return cls._table
+
+    def __getattr__(cls, attr):
+        if attr == '_query':
+            # called during mapper init
+            raise AttributeError()
+        return getattr(cls._query, attr)
+
+class TableClassType(SelectableClassType):
+    def insert(cls, **kwargs):
+        o = cls()
+        o.__dict__.update(kwargs)
+        return o
+
+    def delete(cls, *args, **kwargs):
+        cls._table.delete(*args, **kwargs).execute()
+
+    def update(cls, whereclause=None, values=None, **kwargs):
+        cls._table.update(whereclause, values).execute(**kwargs)
+
+    def relate(cls, propname, *args, **kwargs):
+        class_mapper(cls)._configure_property(propname, relation(*args, **kwargs))
+
+def _is_outer_join(selectable):
+    if not isinstance(selectable, sql.Join):
+        return False
+    if selectable.isouter:
+        return True
+    return _is_outer_join(selectable.left) or _is_outer_join(selectable.right)
+
+def _selectable_name(selectable):
+    if isinstance(selectable, sql.Alias):
+        return _selectable_name(selectable.element)
+    elif isinstance(selectable, sql.Select):
+        return ''.join(_selectable_name(s) for s in selectable.froms)
+    elif isinstance(selectable, schema.Table):
+        return selectable.name.capitalize()
+    else:
+        x = selectable.__class__.__name__
+        if x[0] == '_':
+            x = x[1:]
+        return x
+
+def class_for_table(selectable, **mapper_kwargs):
+    selectable = expression._clause_element_as_expr(selectable)
+    mapname = 'Mapped' + _selectable_name(selectable)
+    if isinstance(mapname, unicode): 
+        engine_encoding = selectable.metadata.bind.dialect.encoding 
+        mapname = mapname.encode(engine_encoding)
+    if isinstance(selectable, Table):
+        klass = TableClassType(mapname, (object,), {})
+    else:
+        klass = SelectableClassType(mapname, (object,), {})
+    
+    def __cmp__(self, o):
+        L = self.__class__.c.keys()
+        L.sort()
+        t1 = [getattr(self, k) for k in L]
+        try:
+            t2 = [getattr(o, k) for k in L]
+        except AttributeError:
+            raise TypeError('unable to compare with %s' % o.__class__)
+        return cmp(t1, t2)
+
+    def __repr__(self):
+        L = ["%s=%r" % (key, getattr(self, key, ''))
+             for key in self.__class__.c.keys()]
+        return '%s(%s)' % (self.__class__.__name__, ','.join(L))
+
+    for m in ['__cmp__', '__repr__']:
+        setattr(klass, m, eval(m))
+    klass._table = selectable
+    klass.c = expression.ColumnCollection()
+    mappr = mapper(klass,
+                   selectable,
+                   extension=Session.extension,
+                   allow_null_pks=_is_outer_join(selectable),
+                   **mapper_kwargs)
+                   
+    for k in mappr.iterate_properties:
+        klass.c[k.key] = k.columns[0]
+
+    klass._query = Session.query_property()
+    return klass
+
+class SqlSoup:
+    def __init__(self, *args, **kwargs):
+        """Initialize a new ``SqlSoup``.
+
+        `args` may either be an ``SQLEngine`` or a set of arguments
+        suitable for passing to ``create_engine``.
+        """
+
+        # meh, sometimes having method overloading instead of kwargs would be easier
+        if isinstance(args[0], MetaData):
+            args = list(args)
+            metadata = args.pop(0)
+            if args or kwargs:
+                raise ArgumentError('Extra arguments not allowed when metadata is given')
+        else:
+            metadata = MetaData(*args, **kwargs)
+        self._metadata = metadata
+        self._cache = {}
+        self.schema = None
+
+    def engine(self):
+        return self._metadata.bind
+
+    engine = property(engine)
+    bind = engine
+
+    def delete(self, *args, **kwargs):
+        Session.delete(*args, **kwargs)
+
+    def flush(self):
+        Session.flush()
+
+    def clear(self):
+        Session.expunge_all()
+
+    def expunge_all(self):
+        Session.expunge_all()
+
+    def map(self, selectable, **kwargs):
+        try:
+            t = self._cache[selectable]
+        except KeyError:
+            t = class_for_table(selectable, **kwargs)
+            self._cache[selectable] = t
+        return t
+
+    def with_labels(self, item):
+        # TODO give meaningful aliases
+        return self.map(expression._clause_element_as_expr(item).select(use_labels=True).alias('foo'))
+
+    def join(self, *args, **kwargs):
+        j = join(*args, **kwargs)
+        return self.map(j)
+
+    def entity(self, attr, schema=None):
+        try:
+            t = self._cache[attr]
+        except KeyError:
+            table = Table(attr, self._metadata, autoload=True, schema=schema or self.schema)
+            if not table.primary_key.columns:
+                raise PKNotFoundError('table %r does not have a primary key defined [columns: %s]' % (attr, ','.join(table.c.keys())))
+            if table.columns:
+                t = class_for_table(table)
+            else:
+                t = None
+            self._cache[attr] = t
+        return t
+    
+    def __getattr__(self, attr):
+        return self.entity(attr)
+
+    def __repr__(self):
+        return 'SqlSoup(%r)' % self._metadata
+
+if __name__ == '__main__':
+    import logging
+    logging.basicConfig()
+    import doctest
+    doctest.testmod()
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/topological.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/topological.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/topological.py (revision 3)
@@ -0,0 +1,301 @@
+# topological.py
+# Copyright (C) 2005, 2006, 2007, 2008, 2009 Michael Bayer mike_mp@zzzcomputing.com
+#
+# This module is part of SQLAlchemy and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+"""Topological sorting algorithms.
+
+The topological sort is an algorithm that receives this list of
+dependencies as a *partial ordering*, that is a list of pairs which
+might say, *X is dependent on Y*, *Q is dependent on Z*, but does not
+necessarily tell you anything about Q being dependent on X. Therefore,
+its not a straight sort where every element can be compared to
+another... only some of the elements have any sorting preference, and
+then only towards just some of the other elements.  For a particular
+partial ordering, there can be many possible sorts that satisfy the
+conditions.
+
+"""
+
+from sqlalchemy.exc import CircularDependencyError
+from sqlalchemy import util
+
+__all__ = ['sort', 'sort_with_cycles', 'sort_as_tree']
+
+def sort(tuples, allitems):
+    """sort the given list of items by dependency.
+    
+    'tuples' is a list of tuples representing a partial ordering.
+    """
+    
+    return [n.item for n in _sort(tuples, allitems, allow_cycles=False, ignore_self_cycles=True)]
+
+def sort_with_cycles(tuples, allitems):
+    """sort the given list of items by dependency, cutting out cycles.
+    
+    returns results as an iterable of 2-tuples, containing the item,
+    and a list containing items involved in a cycle with this item, if any.
+    
+    'tuples' is a list of tuples representing a partial ordering.
+    """
+    
+    return [(n.item, [n.item for n in n.cycles or []]) for n in _sort(tuples, allitems, allow_cycles=True)]
+    
+def sort_as_tree(tuples, allitems, with_cycles=False):
+    """sort the given list of items by dependency, and return results
+    as a hierarchical tree structure.
+    
+    returns results as an iterable of 3-tuples, containing the item,
+    a list containing items involved in a cycle with this item, if any,
+    and a list of child tuples.  
+    
+    if with_cycles is False, the returned structure is of the same form
+    but the second element of each tuple, i.e. the 'cycles', is an empty list.
+    
+    'tuples' is a list of tuples representing a partial ordering.
+    """
+
+    return _organize_as_tree(_sort(tuples, allitems, allow_cycles=with_cycles))
+
+
+class _Node(object):
+    """Represent each item in the sort."""
+
+    def __init__(self, item):
+        self.item = item
+        self.dependencies = set()
+        self.children = []
+        self.cycles = None
+
+    def __str__(self):
+        return self.safestr()
+    
+    def safestr(self, indent=0):
+        return (' ' * indent * 2) + \
+            str(self.item) + \
+            (self.cycles is not None and (" (cycles: " + repr([x for x in self.cycles]) + ")") or "") + \
+            "\n" + \
+            ''.join(str(n) for n in self.children)
+
+    def __repr__(self):
+        return "%s" % (str(self.item))
+
+    def all_deps(self):
+        """Return a set of dependencies for this node and all its cycles."""
+
+        deps = set(self.dependencies)
+        if self.cycles is not None:
+            for c in self.cycles:
+                deps.update(c.dependencies)
+        return deps
+
+class _EdgeCollection(object):
+    """A collection of directed edges."""
+
+    def __init__(self):
+        self.parent_to_children = util.defaultdict(set)
+        self.child_to_parents = util.defaultdict(set)
+
+    def add(self, edge):
+        """Add an edge to this collection."""
+
+        parentnode, childnode = edge
+        self.parent_to_children[parentnode].add(childnode)
+        self.child_to_parents[childnode].add(parentnode)
+        parentnode.dependencies.add(childnode)
+
+    def remove(self, edge):
+        """Remove an edge from this collection.
+
+        Return the childnode if it has no other parents.
+        """
+
+        (parentnode, childnode) = edge
+        self.parent_to_children[parentnode].remove(childnode)
+        self.child_to_parents[childnode].remove(parentnode)
+        if not self.child_to_parents[childnode]:
+            return childnode
+        else:
+            return None
+
+    def has_parents(self, node):
+        return node in self.child_to_parents and bool(self.child_to_parents[node])
+
+    def edges_by_parent(self, node):
+        if node in self.parent_to_children:
+            return [(node, child) for child in self.parent_to_children[node]]
+        else:
+            return []
+
+    def get_parents(self):
+        return self.parent_to_children.keys()
+
+    def pop_node(self, node):
+        """Remove all edges where the given node is a parent.
+
+        Return the collection of all nodes which were children of the
+        given node, and have no further parents.
+        """
+
+        children = self.parent_to_children.pop(node, None)
+        if children is not None:
+            for child in children:
+                self.child_to_parents[child].remove(node)
+                if not self.child_to_parents[child]:
+                    yield child
+
+    def __len__(self):
+        return sum(len(x) for x in self.parent_to_children.values())
+
+    def __iter__(self):
+        for parent, children in self.parent_to_children.iteritems():
+            for child in children:
+                yield (parent, child)
+
+    def __repr__(self):
+        return repr(list(self))
+
+def _sort(tuples, allitems, allow_cycles=False, ignore_self_cycles=False):
+    nodes = {}
+    edges = _EdgeCollection()
+
+    for item in list(allitems) + [t[0] for t in tuples] + [t[1] for t in tuples]:
+        if id(item) not in nodes:
+            node = _Node(item)
+            nodes[item] = node
+
+    for t in tuples:
+        if t[0] is t[1]:
+            if allow_cycles:
+                n = nodes[t[0]]
+                n.cycles = set([n])
+            elif not ignore_self_cycles:
+                raise CircularDependencyError("Self-referential dependency detected " + repr(t))
+            continue
+        childnode = nodes[t[1]]
+        parentnode = nodes[t[0]]
+        edges.add((parentnode, childnode))
+
+    queue = []
+    for n in nodes.values():
+        if not edges.has_parents(n):
+            queue.append(n)
+
+    output = []
+    while nodes:
+        if not queue:
+            # edges remain but no edgeless nodes to remove; this indicates
+            # a cycle
+            if allow_cycles:
+                for cycle in _find_cycles(edges):
+                    lead = cycle[0][0]
+                    lead.cycles = set()
+                    for edge in cycle:
+                        n = edges.remove(edge)
+                        lead.cycles.add(edge[0])
+                        lead.cycles.add(edge[1])
+                        if n is not None:
+                            queue.append(n)
+                    for n in lead.cycles:
+                        if n is not lead:
+                            n._cyclical = True
+                            for (n, k) in list(edges.edges_by_parent(n)):
+                                edges.add((lead, k))
+                                edges.remove((n, k))
+                continue
+            else:
+                # long cycles not allowed
+                raise CircularDependencyError("Circular dependency detected " + repr(edges) + repr(queue))
+        node = queue.pop()
+        if not hasattr(node, '_cyclical'):
+            output.append(node)
+        del nodes[node.item]
+        for childnode in edges.pop_node(node):
+            queue.append(childnode)
+    return output
+
+def _organize_as_tree(nodes):
+    """Given a list of nodes from a topological sort, organize the
+    nodes into a tree structure, with as many non-dependent nodes
+    set as siblings to each other as possible.
+    
+    returns nodes as 3-tuples (item, cycles, children).
+    """
+
+    if not nodes:
+        return None
+    # a list of all currently independent subtrees as a tuple of
+    # (root_node, set_of_all_tree_nodes, set_of_all_cycle_nodes_in_tree)
+    # order of the list has no semantics for the algorithmic
+    independents = []
+    # in reverse topological order
+    for node in reversed(nodes):
+        # nodes subtree and cycles contain the node itself
+        subtree = set([node])
+        if node.cycles is not None:
+            cycles = set(node.cycles)
+        else:
+            cycles = set()
+        # get a set of dependent nodes of node and its cycles
+        nodealldeps = node.all_deps()
+        if nodealldeps:
+            # iterate over independent node indexes in reverse order so we can efficiently remove them
+            for index in xrange(len(independents) - 1, -1, -1):
+                child, childsubtree, childcycles = independents[index]
+                # if there is a dependency between this node and an independent node
+                if (childsubtree.intersection(nodealldeps) or childcycles.intersection(node.dependencies)):
+                    # prepend child to nodes children
+                    # (append should be fine, but previous implemetation used prepend)
+                    node.children[0:0] = [(child.item, [n.item for n in child.cycles or []], child.children)]
+                    # merge childs subtree and cycles
+                    subtree.update(childsubtree)
+                    cycles.update(childcycles)
+                    # remove the child from list of independent subtrees
+                    independents[index:index+1] = []
+        # add node as a new independent subtree
+        independents.append((node, subtree, cycles))
+    # choose an arbitrary node from list of all independent subtrees
+    head = independents.pop()[0]
+    # add all other independent subtrees as a child of the chosen root
+    # used prepend [0:0] instead of extend to maintain exact behaviour of previous implementation
+    head.children[0:0] = [(i[0].item, [n.item for n in i[0].cycles or []], i[0].children) for i in independents]
+    return (head.item, [n.item for n in head.cycles or []], head.children)
+
+def _find_cycles(edges):
+    involved_in_cycles = set()
+    cycles = {}
+    def traverse(node, goal=None, cycle=None):
+        if goal is None:
+            goal = node
+            cycle = []
+        elif node is goal:
+            return True
+
+        for (n, key) in edges.edges_by_parent(node):
+            if key in cycle:
+                continue
+            cycle.append(key)
+            if traverse(key, goal, cycle):
+                cycset = set(cycle)
+                for x in cycle:
+                    involved_in_cycles.add(x)
+                    if x in cycles:
+                        existing_set = cycles[x]
+                        [existing_set.add(y) for y in cycset]
+                        for y in existing_set:
+                            cycles[y] = existing_set
+                        cycset = existing_set
+                    else:
+                        cycles[x] = cycset
+            cycle.pop()
+
+    for parent in edges.get_parents():
+        traverse(parent)
+
+    # sets are not hashable, so uniquify with id
+    unique_cycles = dict((id(s), s) for s in cycles.values()).values()
+    for cycle in unique_cycles:
+        edgecollection = [edge for edge in edges
+                          if edge[0] in cycle and edge[1] in cycle]
+        yield edgecollection
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/util.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/util.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/util.py (revision 3)
@@ -0,0 +1,1535 @@
+# util.py
+# Copyright (C) 2005, 2006, 2007, 2008, 2009 Michael Bayer mike_mp@zzzcomputing.com
+#
+# This module is part of SQLAlchemy and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+import inspect, itertools, operator, sys, warnings, weakref
+import __builtin__
+types = __import__('types')
+
+from sqlalchemy import exc
+
+try:
+    import threading
+except ImportError:
+    import dummy_threading as threading
+
+py3k = getattr(sys, 'py3kwarning', False) or sys.version_info >= (3, 0)
+
+if py3k:
+    set_types = set
+elif sys.version_info < (2, 6):
+    import sets
+    set_types = set, sets.Set
+else:
+    # 2.6 deprecates sets.Set, but we still need to be able to detect them
+    # in user code and as return values from DB-APIs
+    ignore = ('ignore', None, DeprecationWarning, None, 0)
+    try:
+        warnings.filters.insert(0, ignore)
+    except Exception:
+        import sets
+    else:
+        import sets
+        warnings.filters.remove(ignore)
+
+    set_types = set, sets.Set
+
+EMPTY_SET = frozenset()
+
+if py3k:
+    import pickle
+else:
+    try:
+        import cPickle as pickle
+    except ImportError:
+        import pickle
+
+# a controversial feature, required by MySQLdb currently
+def buffer(x):
+    return x 
+    
+buffer = getattr(__builtin__, 'buffer', buffer)
+        
+if sys.version_info >= (2, 5):
+    class PopulateDict(dict):
+        """A dict which populates missing values via a creation function.
+
+        Note the creation function takes a key, unlike
+        collections.defaultdict.
+
+        """
+
+        def __init__(self, creator):
+            self.creator = creator
+            
+        def __missing__(self, key):
+            self[key] = val = self.creator(key)
+            return val
+else:
+    class PopulateDict(dict):
+        """A dict which populates missing values via a creation function."""
+
+        def __init__(self, creator):
+            self.creator = creator
+            
+        def __getitem__(self, key):
+            try:
+                return dict.__getitem__(self, key)
+            except KeyError:
+                self[key] = value = self.creator(key)
+                return value
+
+if py3k:
+    def callable(fn):
+        return hasattr(fn, '__call__')
+else:
+    callable = __builtin__.callable
+
+if py3k:
+    from functools import reduce
+else:
+    reduce = __builtin__.reduce
+
+try:
+    from collections import defaultdict
+except ImportError:
+    class defaultdict(dict):
+        def __init__(self, default_factory=None, *a, **kw):
+            if (default_factory is not None and
+                not hasattr(default_factory, '__call__')):
+                raise TypeError('first argument must be callable')
+            dict.__init__(self, *a, **kw)
+            self.default_factory = default_factory
+        def __getitem__(self, key):
+            try:
+                return dict.__getitem__(self, key)
+            except KeyError:
+                return self.__missing__(key)
+        def __missing__(self, key):
+            if self.default_factory is None:
+                raise KeyError(key)
+            self[key] = value = self.default_factory()
+            return value
+        def __reduce__(self):
+            if self.default_factory is None:
+                args = tuple()
+            else:
+                args = self.default_factory,
+            return type(self), args, None, None, self.iteritems()
+        def copy(self):
+            return self.__copy__()
+        def __copy__(self):
+            return type(self)(self.default_factory, self)
+        def __deepcopy__(self, memo):
+            import copy
+            return type(self)(self.default_factory,
+                              copy.deepcopy(self.items()))
+        def __repr__(self):
+            return 'defaultdict(%s, %s)' % (self.default_factory,
+                                            dict.__repr__(self))
+
+        
+def to_list(x, default=None):
+    if x is None:
+        return default
+    if not isinstance(x, (list, tuple)):
+        return [x]
+    else:
+        return x
+
+def to_set(x):
+    if x is None:
+        return set()
+    if not isinstance(x, set):
+        return set(to_list(x))
+    else:
+        return x
+
+def to_column_set(x):
+    if x is None:
+        return column_set()
+    if not isinstance(x, column_set):
+        return column_set(to_list(x))
+    else:
+        return x
+
+
+try:
+    from functools import update_wrapper
+except ImportError:
+    def update_wrapper(wrapper, wrapped,
+                       assigned=('__doc__', '__module__', '__name__'),
+                       updated=('__dict__',)):
+        for attr in assigned:
+            setattr(wrapper, attr, getattr(wrapped, attr))
+        for attr in updated:
+            getattr(wrapper, attr).update(getattr(wrapped, attr, ()))
+        return wrapper
+
+try:
+    from functools import partial
+except:
+    def partial(func, *args, **keywords):
+        def newfunc(*fargs, **fkeywords):
+            newkeywords = keywords.copy()
+            newkeywords.update(fkeywords)
+            return func(*(args + fargs), **newkeywords)
+        return newfunc
+
+
+def accepts_a_list_as_starargs(list_deprecation=None):
+    def decorate(fn):
+
+        spec = inspect.getargspec(fn)
+        assert spec[1], 'Decorated function does not accept *args'
+
+        def _deprecate():
+            if list_deprecation:
+                if list_deprecation == 'pending':
+                    warning_type = exc.SAPendingDeprecationWarning
+                else:
+                    warning_type = exc.SADeprecationWarning
+                msg = (
+                    "%s%s now accepts multiple %s arguments as a "
+                    "variable argument list.  Supplying %s as a single "
+                    "list is deprecated and support will be removed "
+                    "in a future release." % (
+                        fn.func_name,
+                        inspect.formatargspec(*spec),
+                        spec[1], spec[1]))
+                warnings.warn(msg, warning_type, stacklevel=3)
+
+        def go(fn, *args, **kw): 
+            if isinstance(args[-1], list): 
+                _deprecate() 
+                return fn(*(list(args[0:-1]) + args[-1]), **kw)
+            else: 
+                return fn(*args, **kw) 
+         
+        return decorator(go)(fn)
+
+    return decorate
+
+def unique_symbols(used, *bases):
+    used = set(used)
+    for base in bases:
+        pool = itertools.chain((base,),
+                               itertools.imap(lambda i: base + str(i),
+                                              xrange(1000)))
+        for sym in pool:
+            if sym not in used:
+                used.add(sym)
+                yield sym
+                break
+        else:
+            raise NameError("exhausted namespace for symbol base %s" % base)
+
+def decorator(target):
+    """A signature-matching decorator factory."""
+
+    def decorate(fn):
+        spec = inspect.getargspec(fn)
+        names = tuple(spec[0]) + spec[1:3] + (fn.func_name,)
+        targ_name, fn_name = unique_symbols(names, 'target', 'fn')
+
+        metadata = dict(target=targ_name, fn=fn_name)
+        metadata.update(format_argspec_plus(spec, grouped=False))
+
+        code = 'lambda %(args)s: %(target)s(%(fn)s, %(apply_kw)s)' % (
+                metadata)
+        decorated = eval(code, {targ_name:target, fn_name:fn})
+        decorated.func_defaults = getattr(fn, 'im_func', fn).func_defaults
+        return update_wrapper(decorated, fn)
+    return update_wrapper(decorate, target)
+
+
+if sys.version_info >= (2, 5):
+    def decode_slice(slc):
+        """decode a slice object as sent to __getitem__.
+
+        takes into account the 2.5 __index__() method, basically.
+
+        """
+        ret = []
+        for x in slc.start, slc.stop, slc.step:
+            if hasattr(x, '__index__'):
+                x = x.__index__()
+            ret.append(x)
+        return tuple(ret)
+else:
+    def decode_slice(slc):
+        return (slc.start, slc.stop, slc.step)
+
+def flatten_iterator(x):
+    """Given an iterator of which further sub-elements may also be
+    iterators, flatten the sub-elements into a single iterator.
+
+    """
+    for elem in x:
+        if not isinstance(elem, basestring) and hasattr(elem, '__iter__'):
+            for y in flatten_iterator(elem):
+                yield y
+        else:
+            yield elem
+
+def get_cls_kwargs(cls):
+    """Return the full set of inherited kwargs for the given `cls`.
+
+    Probes a class's __init__ method, collecting all named arguments.  If the
+    __init__ defines a \**kwargs catch-all, then the constructor is presumed to
+    pass along unrecognized keywords to it's base classes, and the collection
+    process is repeated recursively on each of the bases.
+    
+    """
+
+    for c in cls.__mro__:
+        if '__init__' in c.__dict__:
+            stack = set([c])
+            break
+    else:
+        return []
+
+    args = set()
+    while stack:
+        class_ = stack.pop()
+        ctr = class_.__dict__.get('__init__', False)
+        if not ctr or not isinstance(ctr, types.FunctionType):
+            continue
+        names, _, has_kw, _ = inspect.getargspec(ctr)
+        args.update(names)
+        if has_kw:
+            stack.update(class_.__bases__)
+    args.discard('self')
+    return list(args)
+
+def get_func_kwargs(func):
+    """Return the full set of legal kwargs for the given `func`."""
+    return inspect.getargspec(func)[0]
+
+def format_argspec_plus(fn, grouped=True):
+    """Returns a dictionary of formatted, introspected function arguments.
+
+    A enhanced variant of inspect.formatargspec to support code generation.
+
+    fn
+       An inspectable callable or tuple of inspect getargspec() results.
+    grouped
+      Defaults to True; include (parens, around, argument) lists
+
+    Returns:
+
+    args
+      Full inspect.formatargspec for fn
+    self_arg
+      The name of the first positional argument, varargs[0], or None
+      if the function defines no positional arguments.
+    apply_pos
+      args, re-written in calling rather than receiving syntax.  Arguments are
+      passed positionally.
+    apply_kw
+      Like apply_pos, except keyword-ish args are passed as keywords.
+
+    Example::
+
+      >>> format_argspec_plus(lambda self, a, b, c=3, **d: 123)
+      {'args': '(self, a, b, c=3, **d)',
+       'self_arg': 'self',
+       'apply_kw': '(self, a, b, c=c, **d)',
+       'apply_pos': '(self, a, b, c, **d)'}
+
+    """
+    spec = callable(fn) and inspect.getargspec(fn) or fn
+    args = inspect.formatargspec(*spec)
+    if spec[0]:
+        self_arg = spec[0][0]
+    elif spec[1]:
+        self_arg = '%s[0]' % spec[1]
+    else:
+        self_arg = None
+    apply_pos = inspect.formatargspec(spec[0], spec[1], spec[2])
+    defaulted_vals = spec[3] is not None and spec[0][0-len(spec[3]):] or ()
+    apply_kw = inspect.formatargspec(spec[0], spec[1], spec[2], defaulted_vals,
+                                     formatvalue=lambda x: '=' + x)
+    if grouped:
+        return dict(args=args, self_arg=self_arg,
+                    apply_pos=apply_pos, apply_kw=apply_kw)
+    else:
+        return dict(args=args[1:-1], self_arg=self_arg,
+                    apply_pos=apply_pos[1:-1], apply_kw=apply_kw[1:-1])
+
+def format_argspec_init(method, grouped=True):
+    """format_argspec_plus with considerations for typical __init__ methods
+
+    Wraps format_argspec_plus with error handling strategies for typical
+    __init__ cases::
+
+      object.__init__ -> (self)
+      other unreflectable (usually C) -> (self, *args, **kwargs)
+
+    """
+    try:
+        return format_argspec_plus(method, grouped=grouped)
+    except TypeError:
+        self_arg = 'self'
+        if method is object.__init__:
+            args = grouped and '(self)' or 'self'
+        else:
+            args = (grouped and '(self, *args, **kwargs)'
+                            or 'self, *args, **kwargs')
+        return dict(self_arg='self', args=args, apply_pos=args, apply_kw=args)
+
+def getargspec_init(method):
+    """inspect.getargspec with considerations for typical __init__ methods
+
+    Wraps inspect.getargspec with error handling for typical __init__ cases::
+
+      object.__init__ -> (self)
+      other unreflectable (usually C) -> (self, *args, **kwargs)
+
+    """
+    try:
+        return inspect.getargspec(method)
+    except TypeError:
+        if method is object.__init__:
+            return (['self'], None, None, None)
+        else:
+            return (['self'], 'args', 'kwargs', None)
+
+    
+def unbound_method_to_callable(func_or_cls):
+    """Adjust the incoming callable such that a 'self' argument is not required."""
+
+    if isinstance(func_or_cls, types.MethodType) and not func_or_cls.im_self:
+        return func_or_cls.im_func
+    else:
+        return func_or_cls
+
+def class_hierarchy(cls):
+    """Return an unordered sequence of all classes related to cls.
+
+    Traverses diamond hierarchies.
+
+    Fibs slightly: subclasses of builtin types are not returned.  Thus
+    class_hierarchy(class A(object)) returns (A, object), not A plus every
+    class systemwide that derives from object.
+
+    Old-style classes are discarded and hierarchies rooted on them
+    will not be descended.
+
+    """
+    if isinstance(cls, types.ClassType):
+        return list()
+    hier = set([cls])
+    process = list(cls.__mro__)
+    while process:
+        c = process.pop()
+        if isinstance(c, types.ClassType):
+            continue
+        for b in (_ for _ in c.__bases__
+                  if _ not in hier and not isinstance(_, types.ClassType)):
+            process.append(b)
+            hier.add(b)
+        if c.__module__ == '__builtin__' or not hasattr(c, '__subclasses__'):
+            continue
+        for s in [_ for _ in c.__subclasses__() if _ not in hier]:
+            process.append(s)
+            hier.add(s)
+    return list(hier)
+
+def iterate_attributes(cls):
+    """iterate all the keys and attributes associated with a class, without using getattr().
+
+    Does not use getattr() so that class-sensitive descriptors (i.e. property.__get__())
+    are not called.
+
+    """
+    keys = dir(cls)
+    for key in keys:
+        for c in cls.__mro__:
+            if key in c.__dict__:
+                yield (key, c.__dict__[key])
+                break
+
+# from paste.deploy.converters
+def asbool(obj):
+    if isinstance(obj, (str, unicode)):
+        obj = obj.strip().lower()
+        if obj in ['true', 'yes', 'on', 'y', 't', '1']:
+            return True
+        elif obj in ['false', 'no', 'off', 'n', 'f', '0']:
+            return False
+        else:
+            raise ValueError("String is not true/false: %r" % obj)
+    return bool(obj)
+
+def coerce_kw_type(kw, key, type_, flexi_bool=True):
+    """If 'key' is present in dict 'kw', coerce its value to type 'type\_' if
+    necessary.  If 'flexi_bool' is True, the string '0' is considered false
+    when coercing to boolean.
+    """
+
+    if key in kw and type(kw[key]) is not type_ and kw[key] is not None:
+        if type_ is bool and flexi_bool:
+            kw[key] = asbool(kw[key])
+        else:
+            kw[key] = type_(kw[key])
+
+def duck_type_collection(specimen, default=None):
+    """Given an instance or class, guess if it is or is acting as one of
+    the basic collection types: list, set and dict.  If the __emulates__
+    property is present, return that preferentially.
+    """
+
+    if hasattr(specimen, '__emulates__'):
+        # canonicalize set vs sets.Set to a standard: the builtin set
+        if (specimen.__emulates__ is not None and
+            issubclass(specimen.__emulates__, set_types)):
+            return set
+        else:
+            return specimen.__emulates__
+
+    isa = isinstance(specimen, type) and issubclass or isinstance
+    if isa(specimen, list):
+        return list
+    elif isa(specimen, set_types):
+        return set
+    elif isa(specimen, dict):
+        return dict
+
+    if hasattr(specimen, 'append'):
+        return list
+    elif hasattr(specimen, 'add'):
+        return set
+    elif hasattr(specimen, 'set'):
+        return dict
+    else:
+        return default
+
+def dictlike_iteritems(dictlike):
+    """Return a (key, value) iterator for almost any dict-like object."""
+
+    if hasattr(dictlike, 'iteritems'):
+        return dictlike.iteritems()
+    elif hasattr(dictlike, 'items'):
+        return iter(dictlike.items())
+
+    getter = getattr(dictlike, '__getitem__', getattr(dictlike, 'get', None))
+    if getter is None:
+        raise TypeError(
+            "Object '%r' is not dict-like" % dictlike)
+
+    if hasattr(dictlike, 'iterkeys'):
+        def iterator():
+            for key in dictlike.iterkeys():
+                yield key, getter(key)
+        return iterator()
+    elif hasattr(dictlike, 'keys'):
+        return iter((key, getter(key)) for key in dictlike.keys())
+    else:
+        raise TypeError(
+            "Object '%r' is not dict-like" % dictlike)
+
+def assert_arg_type(arg, argtype, name):
+    if isinstance(arg, argtype):
+        return arg
+    else:
+        if isinstance(argtype, tuple):
+            raise exc.ArgumentError("Argument '%s' is expected to be one of type %s, got '%s'" % (name, ' or '.join("'%s'" % str(a) for a in argtype), str(type(arg))))
+        else:
+            raise exc.ArgumentError("Argument '%s' is expected to be of type '%s', got '%s'" % (name, str(argtype), str(type(arg))))
+
+_creation_order = 1
+def set_creation_order(instance):
+    """Assign a '_creation_order' sequence to the given instance.
+
+    This allows multiple instances to be sorted in order of creation
+    (typically within a single thread; the counter is not particularly
+    threadsafe).
+
+    """
+    global _creation_order
+    instance._creation_order = _creation_order
+    _creation_order +=1
+
+def warn_exception(func, *args, **kwargs):
+    """executes the given function, catches all exceptions and converts to a warning."""
+    try:
+        return func(*args, **kwargs)
+    except:
+        warn("%s('%s') ignored" % sys.exc_info()[0:2])
+
+def monkeypatch_proxied_specials(into_cls, from_cls, skip=None, only=None,
+                                 name='self.proxy', from_instance=None):
+    """Automates delegation of __specials__ for a proxying type."""
+
+    if only:
+        dunders = only
+    else:
+        if skip is None:
+            skip = ('__slots__', '__del__', '__getattribute__',
+                    '__metaclass__', '__getstate__', '__setstate__')
+        dunders = [m for m in dir(from_cls)
+                   if (m.startswith('__') and m.endswith('__') and
+                       not hasattr(into_cls, m) and m not in skip)]
+    for method in dunders:
+        try:
+            fn = getattr(from_cls, method)
+            if not hasattr(fn, '__call__'):
+                continue
+            fn = getattr(fn, 'im_func', fn)
+        except AttributeError:
+            continue
+        try:
+            spec = inspect.getargspec(fn)
+            fn_args = inspect.formatargspec(spec[0])
+            d_args = inspect.formatargspec(spec[0][1:])
+        except TypeError:
+            fn_args = '(self, *args, **kw)'
+            d_args = '(*args, **kw)'
+
+        py = ("def %(method)s%(fn_args)s: "
+              "return %(name)s.%(method)s%(d_args)s" % locals())
+
+        env = from_instance is not None and {name: from_instance} or {}
+        exec py in env
+        try:
+            env[method].func_defaults = fn.func_defaults
+        except AttributeError:
+            pass
+        setattr(into_cls, method, env[method])
+
+
+class OrderedProperties(object):
+    """An object that maintains the order in which attributes are set upon it.
+
+    Also provides an iterator and a very basic getitem/setitem
+    interface to those attributes.
+
+    (Not really a dict, since it iterates over values, not keys.  Not really
+    a list, either, since each value must have a key associated; hence there is
+    no append or extend.)
+    """
+
+    def __init__(self):
+        self.__dict__['_data'] = OrderedDict()
+
+    def __len__(self):
+        return len(self._data)
+
+    def __iter__(self):
+        return self._data.itervalues()
+
+    def __add__(self, other):
+        return list(self) + list(other)
+
+    def __setitem__(self, key, object):
+        self._data[key] = object
+
+    def __getitem__(self, key):
+        return self._data[key]
+
+    def __delitem__(self, key):
+        del self._data[key]
+
+    def __setattr__(self, key, object):
+        self._data[key] = object
+
+    def __getstate__(self):
+        return {'_data': self.__dict__['_data']}
+
+    def __setstate__(self, state):
+        self.__dict__['_data'] = state['_data']
+
+    def __getattr__(self, key):
+        try:
+            return self._data[key]
+        except KeyError:
+            raise AttributeError(key)
+
+    def __contains__(self, key):
+        return key in self._data
+
+    def update(self, value):
+        self._data.update(value)
+
+    def get(self, key, default=None):
+        if key in self:
+            return self[key]
+        else:
+            return default
+
+    def keys(self):
+        return self._data.keys()
+
+    def has_key(self, key):
+        return self._data.has_key(key)
+
+    def clear(self):
+        self._data.clear()
+
+
+class OrderedDict(dict):
+    """A dict that returns keys/values/items in the order they were added."""
+
+    def __init__(self, ____sequence=None, **kwargs):
+        self._list = []
+        if ____sequence is None:
+            if kwargs:
+                self.update(**kwargs)
+        else:
+            self.update(____sequence, **kwargs)
+
+    def clear(self):
+        self._list = []
+        dict.clear(self)
+
+    def copy(self):
+        return self.__copy__()
+
+    def __copy__(self):
+        return OrderedDict(self)
+
+    def sort(self, *arg, **kw):
+        self._list.sort(*arg, **kw)
+
+    def update(self, ____sequence=None, **kwargs):
+        if ____sequence is not None:
+            if hasattr(____sequence, 'keys'):
+                for key in ____sequence.keys():
+                    self.__setitem__(key, ____sequence[key])
+            else:
+                for key, value in ____sequence:
+                    self[key] = value
+        if kwargs:
+            self.update(kwargs)
+
+    def setdefault(self, key, value):
+        if key not in self:
+            self.__setitem__(key, value)
+            return value
+        else:
+            return self.__getitem__(key)
+
+    def __iter__(self):
+        return iter(self._list)
+
+    def values(self):
+        return [self[key] for key in self._list]
+
+    def itervalues(self):
+        return iter(self.values())
+
+    def keys(self):
+        return list(self._list)
+
+    def iterkeys(self):
+        return iter(self.keys())
+
+    def items(self):
+        return [(key, self[key]) for key in self.keys()]
+
+    def iteritems(self):
+        return iter(self.items())
+
+    def __setitem__(self, key, object):
+        if key not in self:
+            self._list.append(key)
+        dict.__setitem__(self, key, object)
+
+    def __delitem__(self, key):
+        dict.__delitem__(self, key)
+        self._list.remove(key)
+
+    def pop(self, key, *default):
+        present = key in self
+        value = dict.pop(self, key, *default)
+        if present:
+            self._list.remove(key)
+        return value
+
+    def popitem(self):
+        item = dict.popitem(self)
+        self._list.remove(item[0])
+        return item
+
+class OrderedSet(set):
+    def __init__(self, d=None):
+        set.__init__(self)
+        self._list = []
+        if d is not None:
+            self.update(d)
+
+    def add(self, element):
+        if element not in self:
+            self._list.append(element)
+        set.add(self, element)
+
+    def remove(self, element):
+        set.remove(self, element)
+        self._list.remove(element)
+
+    def insert(self, pos, element):
+        if element not in self:
+            self._list.insert(pos, element)
+        set.add(self, element)
+
+    def discard(self, element):
+        if element in self:
+            self._list.remove(element)
+            set.remove(self, element)
+
+    def clear(self):
+        set.clear(self)
+        self._list = []
+
+    def __getitem__(self, key):
+        return self._list[key]
+
+    def __iter__(self):
+        return iter(self._list)
+
+    def __repr__(self):
+        return '%s(%r)' % (self.__class__.__name__, self._list)
+
+    __str__ = __repr__
+
+    def update(self, iterable):
+        add = self.add
+        for i in iterable:
+            add(i)
+        return self
+
+    __ior__ = update
+
+    def union(self, other):
+        result = self.__class__(self)
+        result.update(other)
+        return result
+
+    __or__ = union
+
+    def intersection(self, other):
+        other = set(other)
+        return self.__class__(a for a in self if a in other)
+
+    __and__ = intersection
+
+    def symmetric_difference(self, other):
+        other = set(other)
+        result = self.__class__(a for a in self if a not in other)
+        result.update(a for a in other if a not in self)
+        return result
+
+    __xor__ = symmetric_difference
+
+    def difference(self, other):
+        other = set(other)
+        return self.__class__(a for a in self if a not in other)
+
+    __sub__ = difference
+
+    def intersection_update(self, other):
+        other = set(other)
+        set.intersection_update(self, other)
+        self._list = [ a for a in self._list if a in other]
+        return self
+
+    __iand__ = intersection_update
+
+    def symmetric_difference_update(self, other):
+        set.symmetric_difference_update(self, other)
+        self._list =  [ a for a in self._list if a in self]
+        self._list += [ a for a in other._list if a in self]
+        return self
+
+    __ixor__ = symmetric_difference_update
+
+    def difference_update(self, other):
+        set.difference_update(self, other)
+        self._list = [ a for a in self._list if a in self]
+        return self
+
+    __isub__ = difference_update
+
+
+class IdentitySet(object):
+    """A set that considers only object id() for uniqueness.
+
+    This strategy has edge cases for builtin types- it's possible to have
+    two 'foo' strings in one of these sets, for example.  Use sparingly.
+    
+    """
+
+    _working_set = set
+    
+    def __init__(self, iterable=None):
+        self._members = dict()
+        if iterable:
+            for o in iterable:
+                self.add(o)
+
+    def add(self, value):
+        self._members[id(value)] = value
+
+    def __contains__(self, value):
+        return id(value) in self._members
+
+    def remove(self, value):
+        del self._members[id(value)]
+
+    def discard(self, value):
+        try:
+            self.remove(value)
+        except KeyError:
+            pass
+
+    def pop(self):
+        try:
+            pair = self._members.popitem()
+            return pair[1]
+        except KeyError:
+            raise KeyError('pop from an empty set')
+
+    def clear(self):
+        self._members.clear()
+
+    def __cmp__(self, other):
+        raise TypeError('cannot compare sets using cmp()')
+
+    def __eq__(self, other):
+        if isinstance(other, IdentitySet):
+            return self._members == other._members
+        else:
+            return False
+
+    def __ne__(self, other):
+        if isinstance(other, IdentitySet):
+            return self._members != other._members
+        else:
+            return True
+
+    def issubset(self, iterable):
+        other = type(self)(iterable)
+
+        if len(self) > len(other):
+            return False
+        for m in itertools.ifilterfalse(other._members.has_key,
+                                        self._members.iterkeys()):
+            return False
+        return True
+
+    def __le__(self, other):
+        if not isinstance(other, IdentitySet):
+            return NotImplemented
+        return self.issubset(other)
+
+    def __lt__(self, other):
+        if not isinstance(other, IdentitySet):
+            return NotImplemented
+        return len(self) < len(other) and self.issubset(other)
+
+    def issuperset(self, iterable):
+        other = type(self)(iterable)
+
+        if len(self) < len(other):
+            return False
+
+        for m in itertools.ifilterfalse(self._members.has_key,
+                                        other._members.iterkeys()):
+            return False
+        return True
+
+    def __ge__(self, other):
+        if not isinstance(other, IdentitySet):
+            return NotImplemented
+        return self.issuperset(other)
+
+    def __gt__(self, other):
+        if not isinstance(other, IdentitySet):
+            return NotImplemented
+        return len(self) > len(other) and self.issuperset(other)
+
+    def union(self, iterable):
+        result = type(self)()
+        # testlib.pragma exempt:__hash__
+        result._members.update(
+            self._working_set(self._member_id_tuples()).union(_iter_id(iterable)))
+        return result
+
+    def __or__(self, other):
+        if not isinstance(other, IdentitySet):
+            return NotImplemented
+        return self.union(other)
+
+    def update(self, iterable):
+        self._members = self.union(iterable)._members
+
+    def __ior__(self, other):
+        if not isinstance(other, IdentitySet):
+            return NotImplemented
+        self.update(other)
+        return self
+
+    def difference(self, iterable):
+        result = type(self)()
+        # testlib.pragma exempt:__hash__
+        result._members.update(
+            self._working_set(self._member_id_tuples()).difference(_iter_id(iterable)))
+        return result
+
+    def __sub__(self, other):
+        if not isinstance(other, IdentitySet):
+            return NotImplemented
+        return self.difference(other)
+
+    def difference_update(self, iterable):
+        self._members = self.difference(iterable)._members
+
+    def __isub__(self, other):
+        if not isinstance(other, IdentitySet):
+            return NotImplemented
+        self.difference_update(other)
+        return self
+
+    def intersection(self, iterable):
+        result = type(self)()
+        # testlib.pragma exempt:__hash__
+        result._members.update(
+            self._working_set(self._member_id_tuples()).intersection(_iter_id(iterable)))
+        return result
+
+    def __and__(self, other):
+        if not isinstance(other, IdentitySet):
+            return NotImplemented
+        return self.intersection(other)
+
+    def intersection_update(self, iterable):
+        self._members = self.intersection(iterable)._members
+
+    def __iand__(self, other):
+        if not isinstance(other, IdentitySet):
+            return NotImplemented
+        self.intersection_update(other)
+        return self
+
+    def symmetric_difference(self, iterable):
+        result = type(self)()
+        # testlib.pragma exempt:__hash__
+        result._members.update(
+            self._working_set(self._member_id_tuples()).symmetric_difference(_iter_id(iterable)))
+        return result
+    
+    def _member_id_tuples(self):
+        return ((id(v), v) for v in self._members.itervalues())
+        
+    def __xor__(self, other):
+        if not isinstance(other, IdentitySet):
+            return NotImplemented
+        return self.symmetric_difference(other)
+
+    def symmetric_difference_update(self, iterable):
+        self._members = self.symmetric_difference(iterable)._members
+
+    def __ixor__(self, other):
+        if not isinstance(other, IdentitySet):
+            return NotImplemented
+        self.symmetric_difference(other)
+        return self
+
+    def copy(self):
+        return type(self)(self._members.itervalues())
+
+    __copy__ = copy
+
+    def __len__(self):
+        return len(self._members)
+
+    def __iter__(self):
+        return self._members.itervalues()
+
+    def __hash__(self):
+        raise TypeError('set objects are unhashable')
+
+    def __repr__(self):
+        return '%s(%r)' % (type(self).__name__, self._members.values())
+
+
+class OrderedIdentitySet(IdentitySet):
+    class _working_set(OrderedSet):
+        # a testing pragma: exempt the OIDS working set from the test suite's
+        # "never call the user's __hash__" assertions.  this is a big hammer,
+        # but it's safe here: IDS operates on (id, instance) tuples in the
+        # working set.
+        __sa_hash_exempt__ = True
+    
+    def __init__(self, iterable=None):
+        IdentitySet.__init__(self)
+        self._members = OrderedDict()
+        if iterable:
+            for o in iterable:
+                self.add(o)
+
+def _iter_id(iterable):
+    """Generator: ((id(o), o) for o in iterable)."""
+
+    for item in iterable:
+        yield id(item), item
+
+# define collections that are capable of storing 
+# ColumnElement objects as hashable keys/elements.
+column_set = set
+column_dict = dict
+ordered_column_set = OrderedSet
+populate_column_dict = PopulateDict
+
+def unique_list(seq, compare_with=set):
+    seen = compare_with()
+    return [x for x in seq if x not in seen and not seen.add(x)]    
+
+class UniqueAppender(object):
+    """Appends items to a collection ensuring uniqueness.
+
+    Additional appends() of the same object are ignored.  Membership is
+    determined by identity (``is a``) not equality (``==``).
+    """
+
+    def __init__(self, data, via=None):
+        self.data = data
+        self._unique = IdentitySet()
+        if via:
+            self._data_appender = getattr(data, via)
+        elif hasattr(data, 'append'):
+            self._data_appender = data.append
+        elif hasattr(data, 'add'):
+            # TODO: we think its a set here.  bypass unneeded uniquing logic ?
+            self._data_appender = data.add
+
+    def append(self, item):
+        if item not in self._unique:
+            self._data_appender(item)
+            self._unique.add(item)
+
+    def __iter__(self):
+        return iter(self.data)
+
+
+class ScopedRegistry(object):
+    """A Registry that can store one or multiple instances of a single
+    class on a per-thread scoped basis, or on a customized scope.
+
+    createfunc
+      a callable that returns a new object to be placed in the registry
+
+    scopefunc
+      a callable that will return a key to store/retrieve an object.
+    """
+
+    def __init__(self, createfunc, scopefunc):
+        self.createfunc = createfunc
+        self.scopefunc = scopefunc
+        self.registry = {}
+
+    def __call__(self):
+        key = self.scopefunc()
+        try:
+            return self.registry[key]
+        except KeyError:
+            return self.registry.setdefault(key, self.createfunc())
+
+    def has(self):
+        return self.scopefunc() in self.registry
+
+    def set(self, obj):
+        self.registry[self.scopefunc()] = obj
+
+    def clear(self):
+        try:
+            del self.registry[self.scopefunc()]
+        except KeyError:
+            pass
+
+class ThreadLocalRegistry(ScopedRegistry):
+    def __init__(self, createfunc):
+        self.createfunc = createfunc
+        self.registry = threading.local()
+
+    def __call__(self):
+        try:
+            return self.registry.value
+        except AttributeError:
+            val = self.registry.value = self.createfunc()
+            return val
+
+    def has(self):
+        return hasattr(self.registry, "value")
+
+    def set(self, obj):
+        self.registry.value = obj
+
+    def clear(self):
+        try:
+            del self.registry.value
+        except AttributeError:
+            pass
+
+class _symbol(object):
+    def __init__(self, name):
+        """Construct a new named symbol."""
+        assert isinstance(name, str)
+        self.name = name
+    def __reduce__(self):
+        return symbol, (self.name,)
+    def __repr__(self):
+        return "<symbol '%s>" % self.name
+_symbol.__name__ = 'symbol'
+
+
+class symbol(object):
+    """A constant symbol.
+
+    >>> symbol('foo') is symbol('foo')
+    True
+    >>> symbol('foo')
+    <symbol 'foo>
+
+    A slight refinement of the MAGICCOOKIE=object() pattern.  The primary
+    advantage of symbol() is its repr().  They are also singletons.
+
+    Repeated calls of symbol('name') will all return the same instance.
+
+    """
+    symbols = {}
+    _lock = threading.Lock()
+
+    def __new__(cls, name):
+        cls._lock.acquire()
+        try:
+            sym = cls.symbols.get(name)
+            if sym is None:
+                cls.symbols[name] = sym = _symbol(name)
+            return sym
+        finally:
+            symbol._lock.release()
+
+
+def as_interface(obj, cls=None, methods=None, required=None):
+    """Ensure basic interface compliance for an instance or dict of callables.
+
+    Checks that ``obj`` implements public methods of ``cls`` or has members
+    listed in ``methods``.  If ``required`` is not supplied, implementing at
+    least one interface method is sufficient.  Methods present on ``obj`` that
+    are not in the interface are ignored.
+
+    If ``obj`` is a dict and ``dict`` does not meet the interface
+    requirements, the keys of the dictionary are inspected. Keys present in
+    ``obj`` that are not in the interface will raise TypeErrors.
+
+    Raises TypeError if ``obj`` does not meet the interface criteria.
+
+    In all passing cases, an object with callable members is returned.  In the
+    simple case, ``obj`` is returned as-is; if dict processing kicks in then
+    an anonymous class is returned.
+
+    obj
+      A type, instance, or dictionary of callables.
+    cls
+      Optional, a type.  All public methods of cls are considered the
+      interface.  An ``obj`` instance of cls will always pass, ignoring
+      ``required``..
+    methods
+      Optional, a sequence of method names to consider as the interface.
+    required
+      Optional, a sequence of mandatory implementations. If omitted, an
+      ``obj`` that provides at least one interface method is considered
+      sufficient.  As a convenience, required may be a type, in which case
+      all public methods of the type are required.
+
+    """
+    if not cls and not methods:
+        raise TypeError('a class or collection of method names are required')
+
+    if isinstance(cls, type) and isinstance(obj, cls):
+        return obj
+
+    interface = set(methods or [m for m in dir(cls) if not m.startswith('_')])
+    implemented = set(dir(obj))
+
+    complies = operator.ge
+    if isinstance(required, type):
+        required = interface
+    elif not required:
+        required = set()
+        complies = operator.gt
+    else:
+        required = set(required)
+
+    if complies(implemented.intersection(interface), required):
+        return obj
+
+    # No dict duck typing here.
+    if not type(obj) is dict:
+        qualifier = complies is operator.gt and 'any of' or 'all of'
+        raise TypeError("%r does not implement %s: %s" % (
+            obj, qualifier, ', '.join(interface)))
+
+    class AnonymousInterface(object):
+        """A callable-holding shell."""
+
+    if cls:
+        AnonymousInterface.__name__ = 'Anonymous' + cls.__name__
+    found = set()
+
+    for method, impl in dictlike_iteritems(obj):
+        if method not in interface:
+            raise TypeError("%r: unknown in this interface" % method)
+        if not callable(impl):
+            raise TypeError("%r=%r is not callable" % (method, impl))
+        setattr(AnonymousInterface, method, staticmethod(impl))
+        found.add(method)
+
+    if complies(found, required):
+        return AnonymousInterface
+
+    raise TypeError("dictionary does not contain required keys %s" %
+                    ', '.join(required - found))
+
+def function_named(fn, name):
+    """Return a function with a given __name__.
+
+    Will assign to __name__ and return the original function if possible on
+    the Python implementation, otherwise a new function will be constructed.
+
+    """
+    try:
+        fn.__name__ = name
+    except TypeError:
+        fn = types.FunctionType(fn.func_code, fn.func_globals, name,
+                          fn.func_defaults, fn.func_closure)
+    return fn
+
+class memoized_property(object):
+    """A read-only @property that is only evaluated once."""
+    def __init__(self, fget, doc=None):
+        self.fget = fget
+        self.__doc__ = doc or fget.__doc__
+        self.__name__ = fget.__name__
+
+    def __get__(self, obj, cls):
+        if obj is None:
+            return None
+        obj.__dict__[self.__name__] = result = self.fget(obj)
+        return result
+
+
+class memoized_instancemethod(object):
+    """Decorate a method memoize its return value.
+
+    Best applied to no-arg methods: memoization is not sensitive to
+    argument values, and will always return the same value even when
+    called with different arguments.
+
+    """
+    def __init__(self, fget, doc=None):
+        self.fget = fget
+        self.__doc__ = doc or fget.__doc__
+        self.__name__ = fget.__name__
+
+    def __get__(self, obj, cls):
+        if obj is None:
+            return None
+        def oneshot(*args, **kw):
+            result = self.fget(obj, *args, **kw)
+            memo = lambda *a, **kw: result
+            memo.__name__ = self.__name__
+            memo.__doc__ = self.__doc__
+            obj.__dict__[self.__name__] = memo
+            return result
+        oneshot.__name__ = self.__name__
+        oneshot.__doc__ = self.__doc__
+        return oneshot
+
+def reset_memoized(instance, name):
+    instance.__dict__.pop(name, None)
+
+class WeakIdentityMapping(weakref.WeakKeyDictionary):
+    """A WeakKeyDictionary with an object identity index.
+
+    Adds a .by_id dictionary to a regular WeakKeyDictionary.  Trades
+    performance during mutation operations for accelerated lookups by id().
+
+    The usual cautions about weak dictionaries and iteration also apply to
+    this subclass.
+
+    """
+    _none = symbol('none')
+
+    def __init__(self):
+        weakref.WeakKeyDictionary.__init__(self)
+        self.by_id = {}
+        self._weakrefs = {}
+
+    def __setitem__(self, object, value):
+        oid = id(object)
+        self.by_id[oid] = value
+        if oid not in self._weakrefs:
+            self._weakrefs[oid] = self._ref(object)
+        weakref.WeakKeyDictionary.__setitem__(self, object, value)
+
+    def __delitem__(self, object):
+        del self._weakrefs[id(object)]
+        del self.by_id[id(object)]
+        weakref.WeakKeyDictionary.__delitem__(self, object)
+
+    def setdefault(self, object, default=None):
+        value = weakref.WeakKeyDictionary.setdefault(self, object, default)
+        oid = id(object)
+        if value is default:
+            self.by_id[oid] = default
+        if oid not in self._weakrefs:
+            self._weakrefs[oid] = self._ref(object)
+        return value
+
+    def pop(self, object, default=_none):
+        if default is self._none:
+            value = weakref.WeakKeyDictionary.pop(self, object)
+        else:
+            value = weakref.WeakKeyDictionary.pop(self, object, default)
+        if id(object) in self.by_id:
+            del self._weakrefs[id(object)]
+            del self.by_id[id(object)]
+        return value
+
+    def popitem(self):
+        item = weakref.WeakKeyDictionary.popitem(self)
+        oid = id(item[0])
+        del self._weakrefs[oid]
+        del self.by_id[oid]
+        return item
+
+    def clear(self):
+        self._weakrefs.clear()
+        self.by_id.clear()
+        weakref.WeakKeyDictionary.clear(self)
+
+    def update(self, *a, **kw):
+        raise NotImplementedError
+
+    def _cleanup(self, wr, key=None):
+        if key is None:
+            key = wr.key
+        try:
+            del self._weakrefs[key]
+        except (KeyError, AttributeError):  # pragma: no cover
+            pass                            # pragma: no cover
+        try:
+            del self.by_id[key]
+        except (KeyError, AttributeError):  # pragma: no cover
+            pass                            # pragma: no cover
+            
+    class _keyed_weakref(weakref.ref):
+        def __init__(self, object, callback):
+            weakref.ref.__init__(self, object, callback)
+            self.key = id(object)
+
+    def _ref(self, object):
+        return self._keyed_weakref(object, self._cleanup)
+
+
+def warn(msg):
+    if isinstance(msg, basestring):
+        warnings.warn(msg, exc.SAWarning, stacklevel=3)
+    else:
+        warnings.warn(msg, stacklevel=3)
+
+def warn_deprecated(msg):
+    warnings.warn(msg, exc.SADeprecationWarning, stacklevel=3)
+
+def warn_pending_deprecation(msg):
+    warnings.warn(msg, exc.SAPendingDeprecationWarning, stacklevel=3)
+
+def deprecated(message=None, add_deprecation_to_docstring=True):
+    """Decorates a function and issues a deprecation warning on use.
+
+    message
+      If provided, issue message in the warning.  A sensible default
+      is used if not provided.
+
+    add_deprecation_to_docstring
+      Default True.  If False, the wrapped function's __doc__ is left
+      as-is.  If True, the 'message' is prepended to the docs if
+      provided, or sensible default if message is omitted.
+    """
+
+    if add_deprecation_to_docstring:
+        header = message is not None and message or 'Deprecated.'
+    else:
+        header = None
+
+    if message is None:
+        message = "Call to deprecated function %(func)s"
+
+    def decorate(fn):
+        return _decorate_with_warning(
+            fn, exc.SADeprecationWarning,
+            message % dict(func=fn.__name__), header)
+    return decorate
+
+def pending_deprecation(version, message=None,
+                        add_deprecation_to_docstring=True):
+    """Decorates a function and issues a pending deprecation warning on use.
+
+    version
+      An approximate future version at which point the pending deprecation
+      will become deprecated.  Not used in messaging.
+
+    message
+      If provided, issue message in the warning.  A sensible default
+      is used if not provided.
+
+    add_deprecation_to_docstring
+      Default True.  If False, the wrapped function's __doc__ is left
+      as-is.  If True, the 'message' is prepended to the docs if
+      provided, or sensible default if message is omitted.
+    """
+
+    if add_deprecation_to_docstring:
+        header = message is not None and message or 'Deprecated.'
+    else:
+        header = None
+
+    if message is None:
+        message = "Call to deprecated function %(func)s"
+
+    def decorate(fn):
+        return _decorate_with_warning(
+            fn, exc.SAPendingDeprecationWarning,
+            message % dict(func=fn.__name__), header)
+    return decorate
+
+def _decorate_with_warning(func, wtype, message, docstring_header=None):
+    """Wrap a function with a warnings.warn and augmented docstring."""
+
+    @decorator
+    def warned(fn, *args, **kwargs):
+        warnings.warn(wtype(message), stacklevel=3)
+        return fn(*args, **kwargs)
+
+    doc = func.__doc__ is not None and func.__doc__ or ''
+    if docstring_header is not None:
+        docstring_header %= dict(func=func.__name__)
+        docs = doc and doc.expandtabs().split('\n') or []
+        indent = ''
+        for line in docs[1:]:
+            text = line.lstrip()
+            if text:
+                indent = line[0:len(line) - len(text)]
+                break
+        point = min(len(docs), 1)
+        docs.insert(point, '\n' + indent + docstring_header.rstrip())
+        doc = '\n'.join(docs)
+
+    decorated = warned(func)
+    decorated.__doc__ = doc
+    return decorated
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/engine/base.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/engine/base.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/engine/base.py (revision 3)
@@ -0,0 +1,1897 @@
+# engine/base.py
+# Copyright (C) 2005, 2006, 2007, 2008, 2009 Michael Bayer mike_mp@zzzcomputing.com
+#
+# This module is part of SQLAlchemy and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+
+"""Basic components for SQL execution and interfacing with DB-API.
+
+Defines the basic components used to interface DB-API modules with
+higher-level statement-construction, connection-management, execution
+and result contexts.
+
+"""
+
+__all__ = ['BufferedColumnResultProxy', 'BufferedColumnRow', 'BufferedRowResultProxy', 'Compiled', 'Connectable', 
+        'Connection', 'DefaultRunner', 'Dialect', 'Engine', 'ExecutionContext', 'NestedTransaction', 'ResultProxy', 
+        'RootTransaction', 'RowProxy', 'SchemaIterator', 'StringIO', 'Transaction', 'TwoPhaseTransaction', 'connection_memoize']
+
+import inspect, StringIO
+from sqlalchemy import exc, schema, util, types, log
+from sqlalchemy.sql import expression
+
+class Dialect(object):
+    """Define the behavior of a specific database and DB-API combination.
+
+    Any aspect of metadata definition, SQL query generation,
+    execution, result-set handling, or anything else which varies
+    between databases is defined under the general category of the
+    Dialect.  The Dialect acts as a factory for other
+    database-specific object implementations including
+    ExecutionContext, Compiled, DefaultGenerator, and TypeEngine.
+
+    All Dialects implement the following attributes:
+    
+    name
+      identifying name for the dialect (i.e. 'sqlite')
+      
+    positional
+      True if the paramstyle for this Dialect is positional.
+
+    paramstyle
+      the paramstyle to be used (some DB-APIs support multiple
+      paramstyles).
+
+    convert_unicode
+      True if Unicode conversion should be applied to all ``str``
+      types.
+
+    encoding
+      type of encoding to use for unicode, usually defaults to
+      'utf-8'.
+
+    schemagenerator
+      a :class:`~sqlalchemy.schema.SchemaVisitor` class which generates
+      schemas.
+
+    schemadropper
+      a :class:`~sqlalchemy.schema.SchemaVisitor` class which drops schemas.
+
+    defaultrunner
+      a :class:`~sqlalchemy.schema.SchemaVisitor` class which executes
+      defaults.
+
+    statement_compiler
+      a :class:`~sqlalchemy.engine.base.Compiled` class used to compile SQL
+      statements
+
+    preparer
+      a :class:`~sqlalchemy.sql.compiler.IdentifierPreparer` class used to
+      quote identifiers.
+
+    supports_alter
+      ``True`` if the database supports ``ALTER TABLE``.
+
+    max_identifier_length
+      The maximum length of identifier names.
+
+    supports_unicode_statements
+      Indicate whether the DB-API can receive SQL statements as Python unicode strings
+
+    supports_sane_rowcount
+      Indicate whether the dialect properly implements rowcount for ``UPDATE`` and ``DELETE`` statements.
+
+    supports_sane_multi_rowcount
+      Indicate whether the dialect properly implements rowcount for ``UPDATE`` and ``DELETE`` statements
+      when executed via executemany.
+
+    preexecute_pk_sequences
+      Indicate if the dialect should pre-execute sequences on primary key
+      columns during an INSERT, if it's desired that the new row's primary key
+      be available after execution.
+
+    supports_pk_autoincrement
+      Indicates if the dialect should allow the database to passively assign
+      a primary key column value.
+
+    dbapi_type_map
+      A mapping of DB-API type objects present in this Dialect's
+      DB-API implmentation mapped to TypeEngine implementations used
+      by the dialect.
+
+      This is used to apply types to result sets based on the DB-API
+      types present in cursor.description; it only takes effect for
+      result sets against textual statements where no explicit
+      typemap was present.
+
+    supports_default_values
+      Indicates if the construct ``INSERT INTO tablename DEFAULT VALUES`` is supported
+
+    description_encoding
+      type of encoding to use for unicode when working with metadata
+      descriptions. If set to ``None`` no encoding will be done.
+      This usually defaults to 'utf-8'.
+    """
+
+    def create_connect_args(self, url):
+        """Build DB-API compatible connection arguments.
+
+        Given a :class:`~sqlalchemy.engine.url.URL` object, returns a tuple
+        consisting of a `*args`/`**kwargs` suitable to send directly
+        to the dbapi's connect function.
+        """
+
+        raise NotImplementedError()
+
+
+    def type_descriptor(self, typeobj):
+        """Transform a generic type to a database-specific type.
+
+        Transforms the given :class:`~sqlalchemy.types.TypeEngine` instance
+        from generic to database-specific.
+
+        Subclasses will usually use the
+        :func:`~sqlalchemy.types.adapt_type` method in the types module to
+        make this job easy.
+        """
+
+        raise NotImplementedError()
+
+
+    def server_version_info(self, connection):
+        """Return a tuple of the database's version number."""
+
+        raise NotImplementedError()
+
+    def reflecttable(self, connection, table, include_columns=None):
+        """Load table description from the database.
+
+        Given a :class:`~sqlalchemy.engine.Connection` and a
+        :class:`~sqlalchemy.schema.Table` object, reflect its columns and
+        properties from the database.  If include_columns (a list or
+        set) is specified, limit the autoload to the given column
+        names.
+        """
+
+        raise NotImplementedError()
+
+    def has_table(self, connection, table_name, schema=None):
+        """Check the existence of a particular table in the database.
+
+        Given a :class:`~sqlalchemy.engine.Connection` object and a string
+        `table_name`, return True if the given table (possibly within
+        the specified `schema`) exists in the database, False
+        otherwise.
+        """
+
+        raise NotImplementedError()
+
+    def has_sequence(self, connection, sequence_name, schema=None):
+        """Check the existence of a particular sequence in the database.
+
+        Given a :class:`~sqlalchemy.engine.Connection` object and a string
+        `sequence_name`, return True if the given sequence exists in
+        the database, False otherwise.
+        """
+
+        raise NotImplementedError()
+
+    def get_default_schema_name(self, connection):
+        """Return the string name of the currently selected schema given a :class:`~sqlalchemy.engine.Connection`."""
+
+        raise NotImplementedError()
+
+    def do_begin(self, connection):
+        """Provide an implementation of *connection.begin()*, given a DB-API connection."""
+
+        raise NotImplementedError()
+
+    def do_rollback(self, connection):
+        """Provide an implementation of *connection.rollback()*, given a DB-API connection."""
+
+        raise NotImplementedError()
+
+    def create_xid(self):
+        """Create a two-phase transaction ID.
+
+        This id will be passed to do_begin_twophase(),
+        do_rollback_twophase(), do_commit_twophase().  Its format is
+        unspecified.
+        """
+
+        raise NotImplementedError()
+
+    def do_commit(self, connection):
+        """Provide an implementation of *connection.commit()*, given a DB-API connection."""
+
+        raise NotImplementedError()
+
+    def do_savepoint(self, connection, name):
+        """Create a savepoint with the given name on a SQLAlchemy connection."""
+
+        raise NotImplementedError()
+
+    def do_rollback_to_savepoint(self, connection, name):
+        """Rollback a SQL Alchemy connection to the named savepoint."""
+
+        raise NotImplementedError()
+
+    def do_release_savepoint(self, connection, name):
+        """Release the named savepoint on a SQL Alchemy connection."""
+
+        raise NotImplementedError()
+
+    def do_begin_twophase(self, connection, xid):
+        """Begin a two phase transaction on the given connection."""
+
+        raise NotImplementedError()
+
+    def do_prepare_twophase(self, connection, xid):
+        """Prepare a two phase transaction on the given connection."""
+
+        raise NotImplementedError()
+
+    def do_rollback_twophase(self, connection, xid, is_prepared=True, recover=False):
+        """Rollback a two phase transaction on the given connection."""
+
+        raise NotImplementedError()
+
+    def do_commit_twophase(self, connection, xid, is_prepared=True, recover=False):
+        """Commit a two phase transaction on the given connection."""
+
+        raise NotImplementedError()
+
+    def do_recover_twophase(self, connection):
+        """Recover list of uncommited prepared two phase transaction identifiers on the given connection."""
+
+        raise NotImplementedError()
+
+    def do_executemany(self, cursor, statement, parameters, context=None):
+        """Provide an implementation of *cursor.executemany(statement, parameters)*."""
+
+        raise NotImplementedError()
+
+    def do_execute(self, cursor, statement, parameters, context=None):
+        """Provide an implementation of *cursor.execute(statement, parameters)*."""
+
+        raise NotImplementedError()
+
+    def is_disconnect(self, e):
+        """Return True if the given DB-API error indicates an invalid connection"""
+
+        raise NotImplementedError()
+
+
+class ExecutionContext(object):
+    """A messenger object for a Dialect that corresponds to a single execution.
+
+    ExecutionContext should have these datamembers:
+
+    connection
+      Connection object which can be freely used by default value
+      generators to execute SQL.  This Connection should reference the
+      same underlying connection/transactional resources of
+      root_connection.
+
+    root_connection
+      Connection object which is the source of this ExecutionContext.  This
+      Connection may have close_with_result=True set, in which case it can
+      only be used once.
+
+    dialect
+      dialect which created this ExecutionContext.
+
+    cursor
+      DB-API cursor procured from the connection,
+
+    compiled
+      if passed to constructor, sqlalchemy.engine.base.Compiled object
+      being executed,
+
+    statement
+      string version of the statement to be executed.  Is either
+      passed to the constructor, or must be created from the
+      sql.Compiled object by the time pre_exec() has completed.
+
+    parameters
+      bind parameters passed to the execute() method.  For compiled
+      statements, this is a dictionary or list of dictionaries.  For
+      textual statements, it should be in a format suitable for the
+      dialect's paramstyle (i.e. dict or list of dicts for non
+      positional, list or list of lists/tuples for positional).
+
+    isinsert
+      True if the statement is an INSERT.
+
+    isupdate
+      True if the statement is an UPDATE.
+
+    should_autocommit
+      True if the statement is a "committable" statement
+
+    postfetch_cols
+     a list of Column objects for which a server-side default
+     or inline SQL expression value was fired off.  applies to inserts and updates.
+
+
+    """
+
+    def create_cursor(self):
+        """Return a new cursor generated from this ExecutionContext's connection.
+
+        Some dialects may wish to change the behavior of
+        connection.cursor(), such as postgres which may return a PG
+        "server side" cursor.
+        """
+
+        raise NotImplementedError()
+
+    def pre_exec(self):
+        """Called before an execution of a compiled statement.
+
+        If a compiled statement was passed to this ExecutionContext,
+        the `statement` and `parameters` datamembers must be
+        initialized after this statement is complete.
+        """
+
+        raise NotImplementedError()
+
+    def post_exec(self):
+        """Called after the execution of a compiled statement.
+
+        If a compiled statement was passed to this ExecutionContext,
+        the `last_insert_ids`, `last_inserted_params`, etc.
+        datamembers should be available after this method completes.
+        """
+
+        raise NotImplementedError()
+
+    def result(self):
+        """Return a result object corresponding to this ExecutionContext.
+
+        Returns a ResultProxy.
+        """
+
+        raise NotImplementedError()
+
+    def handle_dbapi_exception(self, e):
+        """Receive a DBAPI exception which occured upon execute, result fetch, etc."""
+        
+        raise NotImplementedError()
+        
+    def should_autocommit_text(self, statement):
+        """Parse the given textual statement and return True if it refers to a "committable" statement"""
+
+        raise NotImplementedError()
+
+    def last_inserted_ids(self):
+        """Return the list of the primary key values for the last insert statement executed.
+
+        This does not apply to straight textual clauses; only to
+        ``sql.Insert`` objects compiled against a ``schema.Table``
+        object.  The order of items in the list is the same as that of
+        the Table's 'primary_key' attribute.
+        """
+
+        raise NotImplementedError()
+
+    def last_inserted_params(self):
+        """Return a dictionary of the full parameter dictionary for the last compiled INSERT statement.
+
+        Includes any ColumnDefaults or Sequences that were pre-executed.
+        """
+
+        raise NotImplementedError()
+
+    def last_updated_params(self):
+        """Return a dictionary of the full parameter dictionary for the last compiled UPDATE statement.
+
+        Includes any ColumnDefaults that were pre-executed.
+        """
+
+        raise NotImplementedError()
+
+    def lastrow_has_defaults(self):
+        """Return True if the last INSERT or UPDATE row contained
+        inlined or database-side defaults.
+        """
+
+        raise NotImplementedError()
+
+
+class Compiled(object):
+    """Represent a compiled SQL expression.
+
+    The ``__str__`` method of the ``Compiled`` object should produce
+    the actual text of the statement.  ``Compiled`` objects are
+    specific to their underlying database dialect, and also may
+    or may not be specific to the columns referenced within a
+    particular set of bind parameters.  In no case should the
+    ``Compiled`` object be dependent on the actual values of those
+    bind parameters, even though it may reference those values as
+    defaults.
+    """
+
+    def __init__(self, dialect, statement, column_keys=None, bind=None):
+        """Construct a new ``Compiled`` object.
+
+        dialect
+          ``Dialect`` to compile against.
+
+        statement
+          ``ClauseElement`` to be compiled.
+
+        column_keys
+          a list of column names to be compiled into an INSERT or UPDATE
+          statement.
+
+        bind
+          Optional Engine or Connection to compile this statement against.
+          
+        """
+        self.dialect = dialect
+        self.statement = statement
+        self.column_keys = column_keys
+        self.bind = bind
+        self.can_execute = statement.supports_execution
+
+    def compile(self):
+        """Produce the internal string representation of this element."""
+
+        raise NotImplementedError()
+
+    def __str__(self):
+        """Return the string text of the generated SQL statement."""
+
+        raise NotImplementedError()
+
+    @util.deprecated('Deprecated. Use construct_params(). '
+                     '(supports Unicode key names.)')
+    def get_params(self, **params):
+        return self.construct_params(params)
+
+    def construct_params(self, params):
+        """Return the bind params for this compiled object.
+
+        `params` is a dict of string/object pairs whos
+        values will override bind values compiled in
+        to the statement.
+        """
+        raise NotImplementedError()
+
+    def execute(self, *multiparams, **params):
+        """Execute this compiled object."""
+
+        e = self.bind
+        if e is None:
+            raise exc.UnboundExecutionError("This Compiled object is not bound to any Engine or Connection.")
+        return e._execute_compiled(self, multiparams, params)
+
+    def scalar(self, *multiparams, **params):
+        """Execute this compiled object and return the result's scalar value."""
+
+        return self.execute(*multiparams, **params).scalar()
+
+
+class Connectable(object):
+    """Interface for an object which supports execution of SQL constructs.
+    
+    The two implementations of ``Connectable`` are :class:`Connection` and
+    :class:`Engine`.
+    
+    """
+
+    def contextual_connect(self):
+        """Return a Connection object which may be part of an ongoing context."""
+
+        raise NotImplementedError()
+
+    def create(self, entity, **kwargs):
+        """Create a table or index given an appropriate schema object."""
+
+        raise NotImplementedError()
+
+    def drop(self, entity, **kwargs):
+        """Drop a table or index given an appropriate schema object."""
+
+        raise NotImplementedError()
+
+    def execute(self, object, *multiparams, **params):
+        raise NotImplementedError()
+
+    def _execute_clauseelement(self, elem, multiparams=None, params=None):
+        raise NotImplementedError()
+
+class Connection(Connectable):
+    """Provides high-level functionality for a wrapped DB-API connection.
+
+    Provides execution support for string-based SQL statements as well
+    as ClauseElement, Compiled and DefaultGenerator objects.  Provides
+    a begin method to return Transaction objects.
+
+    The Connection object is **not** thread-safe.
+
+    .. index::
+      single: thread safety; Connection
+
+    """
+
+    def __init__(self, engine, connection=None, close_with_result=False,
+                 _branch=False):
+        """Construct a new Connection.
+
+        Connection objects are typically constructed by an
+        :class:`~sqlalchemy.engine.Engine`, see the ``connect()`` and
+        ``contextual_connect()`` methods of Engine.
+        
+        """
+
+        self.engine = engine
+        self.__connection = connection or engine.raw_connection()
+        self.__transaction = None
+        self.__close_with_result = close_with_result
+        self.__savepoint_seq = 0
+        self.__branch = _branch
+        self.__invalid = False
+        
+    def _branch(self):
+        """Return a new Connection which references this Connection's
+        engine and connection; but does not have close_with_result enabled,
+        and also whose close() method does nothing.
+
+        This is used to execute "sub" statements within a single execution,
+        usually an INSERT statement.
+        
+        """
+        return self.engine.Connection(self.engine, self.__connection, _branch=True)
+
+    @property
+    def dialect(self):
+        "Dialect used by this Connection."
+
+        return self.engine.dialect
+
+    @property
+    def closed(self):
+        """return True if this connection is closed."""
+
+        return not self.__invalid and '_Connection__connection' not in self.__dict__
+
+    @property
+    def invalidated(self):
+        """return True if this connection was invalidated."""
+
+        return self.__invalid
+
+    @property
+    def connection(self):
+        "The underlying DB-API connection managed by this Connection."
+
+        try:
+            return self.__connection
+        except AttributeError:
+            if self.__invalid:
+                if self.__transaction is not None:
+                    raise exc.InvalidRequestError("Can't reconnect until invalid transaction is rolled back")
+                self.__connection = self.engine.raw_connection()
+                self.__invalid = False
+                return self.__connection
+            raise exc.InvalidRequestError("This Connection is closed")
+
+    @property
+    def should_close_with_result(self):
+        """Indicates if this Connection should be closed when a corresponding
+        ResultProxy is closed; this is essentially an auto-release mode.
+        
+        """
+        return self.__close_with_result
+
+    @property
+    def info(self):
+        """A collection of per-DB-API connection instance properties."""
+        return self.connection.info
+
+    def connect(self):
+        """Returns self.
+
+        This ``Connectable`` interface method returns self, allowing
+        Connections to be used interchangably with Engines in most
+        situations that require a bind.
+
+        """
+        return self
+
+    def contextual_connect(self, **kwargs):
+        """Returns self.
+
+        This ``Connectable`` interface method returns self, allowing
+        Connections to be used interchangably with Engines in most
+        situations that require a bind.
+
+        """
+        return self
+
+    def invalidate(self, exception=None):
+        """Invalidate the underlying DBAPI connection associated with this Connection.
+
+        The underlying DB-API connection is literally closed (if
+        possible), and is discarded.  Its source connection pool will
+        typically lazily create a new connection to replace it.
+
+        Upon the next usage, this Connection will attempt to reconnect
+        to the pool with a new connection.
+
+        Transactions in progress remain in an "opened" state (even though
+        the actual transaction is gone); these must be explicitly
+        rolled back before a reconnect on this Connection can proceed.  This
+        is to prevent applications from accidentally continuing their transactional
+        operations in a non-transactional state.
+
+        """
+        if self.closed:
+            raise exc.InvalidRequestError("This Connection is closed")
+
+        if self.__connection.is_valid:
+            self.__connection.invalidate(exception)
+        del self.__connection
+        self.__invalid = True
+
+    def detach(self):
+        """Detach the underlying DB-API connection from its connection pool.
+
+        This Connection instance will remain useable.  When closed,
+        the DB-API connection will be literally closed and not
+        returned to its pool.  The pool will typically lazily create a
+        new connection to replace the detached connection.
+
+        This method can be used to insulate the rest of an application
+        from a modified state on a connection (such as a transaction
+        isolation level or similar).  Also see
+        :class:`~sqlalchemy.interfaces.PoolListener` for a mechanism to modify
+        connection state when connections leave and return to their
+        connection pool.
+
+        """
+        self.__connection.detach()
+
+    def begin(self):
+        """Begin a transaction and return a Transaction handle.
+
+        Repeated calls to ``begin`` on the same Connection will create
+        a lightweight, emulated nested transaction.  Only the
+        outermost transaction may ``commit``.  Calls to ``commit`` on
+        inner transactions are ignored.  Any transaction in the
+        hierarchy may ``rollback``, however.
+
+        """
+        if self.__transaction is None:
+            self.__transaction = RootTransaction(self)
+        else:
+            return Transaction(self, self.__transaction)
+        return self.__transaction
+
+    def begin_nested(self):
+        """Begin a nested transaction and return a Transaction handle.
+
+        Nested transactions require SAVEPOINT support in the
+        underlying database.  Any transaction in the hierarchy may
+        ``commit`` and ``rollback``, however the outermost transaction
+        still controls the overall ``commit`` or ``rollback`` of the
+        transaction of a whole.
+        """
+
+        if self.__transaction is None:
+            self.__transaction = RootTransaction(self)
+        else:
+            self.__transaction = NestedTransaction(self, self.__transaction)
+        return self.__transaction
+
+    def begin_twophase(self, xid=None):
+        """Begin a two-phase or XA transaction and return a Transaction handle.
+
+        xid
+          the two phase transaction id.  If not supplied, a random id
+          will be generated.
+        """
+
+        if self.__transaction is not None:
+            raise exc.InvalidRequestError(
+                "Cannot start a two phase transaction when a transaction "
+                "is already in progress.")
+        if xid is None:
+            xid = self.engine.dialect.create_xid();
+        self.__transaction = TwoPhaseTransaction(self, xid)
+        return self.__transaction
+
+    def recover_twophase(self):
+        return self.engine.dialect.do_recover_twophase(self)
+
+    def rollback_prepared(self, xid, recover=False):
+        self.engine.dialect.do_rollback_twophase(self, xid, recover=recover)
+
+    def commit_prepared(self, xid, recover=False):
+        self.engine.dialect.do_commit_twophase(self, xid, recover=recover)
+
+    def in_transaction(self):
+        """Return True if a transaction is in progress."""
+
+        return self.__transaction is not None
+
+    def _begin_impl(self):
+        if self.engine._should_log_info:
+            self.engine.logger.info("BEGIN")
+        try:
+            self.engine.dialect.do_begin(self.connection)
+        except Exception, e:
+            self._handle_dbapi_exception(e, None, None, None, None)
+            raise
+
+    def _rollback_impl(self):
+        if not self.closed and not self.invalidated and self.__connection.is_valid:
+            if self.engine._should_log_info:
+                self.engine.logger.info("ROLLBACK")
+            try:
+                self.engine.dialect.do_rollback(self.connection)
+                self.__transaction = None
+            except Exception, e:
+                self._handle_dbapi_exception(e, None, None, None, None)
+                raise
+        else:
+            self.__transaction = None
+
+    def _commit_impl(self):
+        if self.engine._should_log_info:
+            self.engine.logger.info("COMMIT")
+        try:
+            self.engine.dialect.do_commit(self.connection)
+            self.__transaction = None
+        except Exception, e:
+            self._handle_dbapi_exception(e, None, None, None, None)
+            raise
+
+    def _savepoint_impl(self, name=None):
+        if name is None:
+            self.__savepoint_seq += 1
+            name = 'sa_savepoint_%s' % self.__savepoint_seq
+        if self.__connection.is_valid:
+            self.engine.dialect.do_savepoint(self, name)
+            return name
+
+    def _rollback_to_savepoint_impl(self, name, context):
+        if self.__connection.is_valid:
+            self.engine.dialect.do_rollback_to_savepoint(self, name)
+        self.__transaction = context
+
+    def _release_savepoint_impl(self, name, context):
+        if self.__connection.is_valid:
+            self.engine.dialect.do_release_savepoint(self, name)
+        self.__transaction = context
+
+    def _begin_twophase_impl(self, xid):
+        if self.__connection.is_valid:
+            self.engine.dialect.do_begin_twophase(self, xid)
+
+    def _prepare_twophase_impl(self, xid):
+        if self.__connection.is_valid:
+            assert isinstance(self.__transaction, TwoPhaseTransaction)
+            self.engine.dialect.do_prepare_twophase(self, xid)
+
+    def _rollback_twophase_impl(self, xid, is_prepared):
+        if self.__connection.is_valid:
+            assert isinstance(self.__transaction, TwoPhaseTransaction)
+            self.engine.dialect.do_rollback_twophase(self, xid, is_prepared)
+        self.__transaction = None
+
+    def _commit_twophase_impl(self, xid, is_prepared):
+        if self.__connection.is_valid:
+            assert isinstance(self.__transaction, TwoPhaseTransaction)
+            self.engine.dialect.do_commit_twophase(self, xid, is_prepared)
+        self.__transaction = None
+
+    def _autorollback(self):
+        if not self.in_transaction():
+            self._rollback_impl()
+
+    def close(self):
+        """Close this Connection."""
+
+        try:
+            conn = self.__connection
+        except AttributeError:
+            return
+        if not self.__branch:
+            conn.close()
+        self.__invalid = False
+        del self.__connection
+
+    def scalar(self, object, *multiparams, **params):
+        """Executes and returns the first column of the first row.
+
+        The underlying result/cursor is closed after execution.
+        """
+
+        return self.execute(object, *multiparams, **params).scalar()
+
+    def statement_compiler(self, statement, **kwargs):
+        return self.dialect.statement_compiler(self.dialect, statement, bind=self, **kwargs)
+
+    def execute(self, object, *multiparams, **params):
+        """Executes and returns a ResultProxy."""
+
+        for c in type(object).__mro__:
+            if c in Connection.executors:
+                return Connection.executors[c](self, object, multiparams, params)
+        else:
+            raise exc.InvalidRequestError("Unexecutable object type: " + str(type(object)))
+
+    def __distill_params(self, multiparams, params):
+        """given arguments from the calling form *multiparams, **params, return a list
+        of bind parameter structures, usually a list of dictionaries.
+
+        in the case of 'raw' execution which accepts positional parameters,
+        it may be a list of tuples or lists."""
+
+        if not multiparams:
+            if params:
+                return [params]
+            else:
+                return []
+        elif len(multiparams) == 1:
+            zero = multiparams[0]
+            if isinstance(zero, (list, tuple)):
+                if not zero or hasattr(zero[0], '__iter__'):
+                    return zero
+                else:
+                    return [zero]
+            elif hasattr(zero, 'keys'):
+                return [zero]
+            else:
+                return [[zero]]
+        else:
+            if hasattr(multiparams[0], '__iter__'):
+                return multiparams
+            else:
+                return [multiparams]
+
+    def _execute_function(self, func, multiparams, params):
+        return self._execute_clauseelement(func.select(), multiparams, params)
+
+    def _execute_default(self, default, multiparams, params):
+        return self.engine.dialect.defaultrunner(self.__create_execution_context()).traverse_single(default)
+
+    def _execute_clauseelement(self, elem, multiparams, params):
+        params = self.__distill_params(multiparams, params)
+        if params:
+            keys = params[0].keys()
+        else:
+            keys = []
+
+        context = self.__create_execution_context(
+                        compiled=elem.compile(dialect=self.dialect, column_keys=keys, inline=len(params) > 1), 
+                        parameters=params
+                    )
+        return self.__execute_context(context)
+
+    def _execute_compiled(self, compiled, multiparams, params):
+        """Execute a sql.Compiled object."""
+
+        context = self.__create_execution_context(
+                    compiled=compiled, 
+                    parameters=self.__distill_params(multiparams, params)
+                )
+        return self.__execute_context(context)
+
+    def _execute_text(self, statement, multiparams, params):
+        parameters = self.__distill_params(multiparams, params)
+        context = self.__create_execution_context(statement=statement, parameters=parameters)
+        return self.__execute_context(context)
+    
+    def __execute_context(self, context):
+        if context.compiled:
+            context.pre_exec()
+        if context.executemany:
+            self._cursor_executemany(context.cursor, context.statement, context.parameters, context=context)
+        else:
+            self._cursor_execute(context.cursor, context.statement, context.parameters[0], context=context)
+        if context.compiled:
+            context.post_exec()
+        if context.should_autocommit and not self.in_transaction():
+            self._commit_impl()
+        return context.get_result_proxy()
+        
+    def _execute_ddl(self, ddl, params, multiparams):
+        if params:
+            schema_item, params = params[0], params[1:]
+        else:
+            schema_item = None
+        return ddl(None, schema_item, self, *params, **multiparams)
+
+    def _handle_dbapi_exception(self, e, statement, parameters, cursor, context):
+        if getattr(self, '_reentrant_error', False):
+            raise exc.DBAPIError.instance(None, None, e)
+        self._reentrant_error = True
+        try:
+            if not isinstance(e, self.dialect.dbapi.Error):
+                return
+                
+            if context:
+                context.handle_dbapi_exception(e)
+                
+            is_disconnect = self.dialect.is_disconnect(e)
+            if is_disconnect:
+                self.invalidate(e)
+                self.engine.dispose()
+            else:
+                if cursor:
+                    cursor.close()
+                self._autorollback()
+                if self.__close_with_result:
+                    self.close()
+            raise exc.DBAPIError.instance(statement, parameters, e, connection_invalidated=is_disconnect)
+        finally:
+            del self._reentrant_error
+
+    def __create_execution_context(self, **kwargs):
+        try:
+            dialect = self.engine.dialect
+            return dialect.execution_ctx_cls(dialect, connection=self, **kwargs)
+        except Exception, e:
+            self._handle_dbapi_exception(e, kwargs.get('statement', None), kwargs.get('parameters', None), None, None)
+            raise
+
+    def _cursor_execute(self, cursor, statement, parameters, context=None):
+        if self.engine._should_log_info:
+            self.engine.logger.info(statement)
+            self.engine.logger.info(repr(parameters))
+        try:
+            self.dialect.do_execute(cursor, statement, parameters, context=context)
+        except Exception, e:
+            self._handle_dbapi_exception(e, statement, parameters, cursor, context)
+            raise
+
+    def _cursor_executemany(self, cursor, statement, parameters, context=None):
+        if self.engine._should_log_info:
+            self.engine.logger.info(statement)
+            self.engine.logger.info(repr(parameters))
+        try:
+            self.dialect.do_executemany(cursor, statement, parameters, context=context)
+        except Exception, e:
+            self._handle_dbapi_exception(e, statement, parameters, cursor, context)
+            raise
+
+    # poor man's multimethod/generic function thingy
+    executors = {
+        expression.Function: _execute_function,
+        expression.ClauseElement: _execute_clauseelement,
+        Compiled: _execute_compiled,
+        schema.SchemaItem: _execute_default,
+        schema.DDL: _execute_ddl,
+        basestring: _execute_text
+    }
+
+    def create(self, entity, **kwargs):
+        """Create a Table or Index given an appropriate Schema object."""
+
+        return self.engine.create(entity, connection=self, **kwargs)
+
+    def drop(self, entity, **kwargs):
+        """Drop a Table or Index given an appropriate Schema object."""
+
+        return self.engine.drop(entity, connection=self, **kwargs)
+
+    def reflecttable(self, table, include_columns=None):
+        """Reflect the columns in the given string table name from the database."""
+
+        return self.engine.reflecttable(table, self, include_columns)
+
+    def default_schema_name(self):
+        return self.engine.dialect.get_default_schema_name(self)
+
+    def run_callable(self, callable_):
+        return callable_(self)
+
+class Transaction(object):
+    """Represent a Transaction in progress.
+
+    The Transaction object is **not** threadsafe.
+
+    .. index::
+      single: thread safety; Transaction
+
+    """
+
+    def __init__(self, connection, parent):
+        self.connection = connection
+        self._parent = parent or self
+        self.is_active = True
+    
+    def close(self):
+        """Close this transaction.
+
+        If this transaction is the base transaction in a begin/commit
+        nesting, the transaction will rollback().  Otherwise, the
+        method returns.
+
+        This is used to cancel a Transaction without affecting the scope of
+        an enclosing transaction.
+        """
+        if not self._parent.is_active:
+            return
+        if self._parent is self:
+            self.rollback()
+
+    def rollback(self):
+        if not self._parent.is_active:
+            return
+        self.is_active = False
+        self._do_rollback()
+
+    def _do_rollback(self):
+        self._parent.rollback()
+
+    def commit(self):
+        if not self._parent.is_active:
+            raise exc.InvalidRequestError("This transaction is inactive")
+        self._do_commit()
+        self.is_active = False
+
+    def _do_commit(self):
+        pass
+
+    def __enter__(self):
+        return self
+
+    def __exit__(self, type, value, traceback):
+        if type is None and self.is_active:
+            self.commit()
+        else:
+            self.rollback()
+
+class RootTransaction(Transaction):
+    def __init__(self, connection):
+        super(RootTransaction, self).__init__(connection, None)
+        self.connection._begin_impl()
+
+    def _do_rollback(self):
+        self.connection._rollback_impl()
+
+    def _do_commit(self):
+        self.connection._commit_impl()
+
+class NestedTransaction(Transaction):
+    def __init__(self, connection, parent):
+        super(NestedTransaction, self).__init__(connection, parent)
+        self._savepoint = self.connection._savepoint_impl()
+
+    def _do_rollback(self):
+        self.connection._rollback_to_savepoint_impl(self._savepoint, self._parent)
+
+    def _do_commit(self):
+        self.connection._release_savepoint_impl(self._savepoint, self._parent)
+
+class TwoPhaseTransaction(Transaction):
+    def __init__(self, connection, xid):
+        super(TwoPhaseTransaction, self).__init__(connection, None)
+        self._is_prepared = False
+        self.xid = xid
+        self.connection._begin_twophase_impl(self.xid)
+
+    def prepare(self):
+        if not self._parent.is_active:
+            raise exc.InvalidRequestError("This transaction is inactive")
+        self.connection._prepare_twophase_impl(self.xid)
+        self._is_prepared = True
+
+    def _do_rollback(self):
+        self.connection._rollback_twophase_impl(self.xid, self._is_prepared)
+
+    def _do_commit(self):
+        self.connection._commit_twophase_impl(self.xid, self._is_prepared)
+
+class Engine(Connectable):
+    """
+    Connects a :class:`~sqlalchemy.pool.Pool` and :class:`~sqlalchemy.engine.base.Dialect` 
+    together to provide a source of database connectivity and behavior.
+
+    """
+
+    def __init__(self, pool, dialect, url, echo=None, proxy=None):
+        self.pool = pool
+        self.url = url
+        self.dialect = dialect
+        self.echo = echo
+        self.engine = self
+        self.logger = log.instance_logger(self, echoflag=echo)
+        if proxy:
+            self.Connection = _proxy_connection_cls(Connection, proxy)
+        else:
+            self.Connection = Connection
+
+    @property
+    def name(self):
+        "String name of the :class:`~sqlalchemy.engine.Dialect` in use by this ``Engine``."
+        
+        return self.dialect.name
+
+    echo = log.echo_property()
+
+    def __repr__(self):
+        return 'Engine(%s)' % str(self.url)
+
+    def dispose(self):
+        self.pool.dispose()
+        self.pool = self.pool.recreate()
+
+    def create(self, entity, connection=None, **kwargs):
+        """Create a table or index within this engine's database connection given a schema.Table object."""
+
+        self._run_visitor(self.dialect.schemagenerator, entity, connection=connection, **kwargs)
+
+    def drop(self, entity, connection=None, **kwargs):
+        """Drop a table or index within this engine's database connection given a schema.Table object."""
+
+        self._run_visitor(self.dialect.schemadropper, entity, connection=connection, **kwargs)
+
+    def _execute_default(self, default):
+        connection = self.contextual_connect()
+        try:
+            return connection._execute_default(default, (), {})
+        finally:
+            connection.close()
+
+    @property
+    def func(self):
+        return expression._FunctionGenerator(bind=self)
+
+    def text(self, text, *args, **kwargs):
+        """Return a sql.text() object for performing literal queries."""
+
+        return expression.text(text, bind=self, *args, **kwargs)
+
+    def _run_visitor(self, visitorcallable, element, connection=None, **kwargs):
+        if connection is None:
+            conn = self.contextual_connect(close_with_result=False)
+        else:
+            conn = connection
+        try:
+            visitorcallable(self.dialect, conn, **kwargs).traverse(element)
+        finally:
+            if connection is None:
+                conn.close()
+
+    def transaction(self, callable_, connection=None, *args, **kwargs):
+        """Execute the given function within a transaction boundary.
+
+        This is a shortcut for explicitly calling `begin()` and `commit()`
+        and optionally `rollback()` when exceptions are raised.  The
+        given `*args` and `**kwargs` will be passed to the function, as
+        well as the Connection used in the transaction.
+        """
+
+        if connection is None:
+            conn = self.contextual_connect()
+        else:
+            conn = connection
+        try:
+            trans = conn.begin()
+            try:
+                ret = callable_(conn, *args, **kwargs)
+                trans.commit()
+                return ret
+            except:
+                trans.rollback()
+                raise
+        finally:
+            if connection is None:
+                conn.close()
+
+    def run_callable(self, callable_, connection=None, *args, **kwargs):
+        if connection is None:
+            conn = self.contextual_connect()
+        else:
+            conn = connection
+        try:
+            return callable_(conn, *args, **kwargs)
+        finally:
+            if connection is None:
+                conn.close()
+
+    def execute(self, statement, *multiparams, **params):
+        connection = self.contextual_connect(close_with_result=True)
+        return connection.execute(statement, *multiparams, **params)
+
+    def scalar(self, statement, *multiparams, **params):
+        return self.execute(statement, *multiparams, **params).scalar()
+
+    def _execute_clauseelement(self, elem, multiparams=None, params=None):
+        connection = self.contextual_connect(close_with_result=True)
+        return connection._execute_clauseelement(elem, multiparams, params)
+
+    def _execute_compiled(self, compiled, multiparams, params):
+        connection = self.contextual_connect(close_with_result=True)
+        return connection._execute_compiled(compiled, multiparams, params)
+
+    def statement_compiler(self, statement, **kwargs):
+        return self.dialect.statement_compiler(self.dialect, statement, bind=self, **kwargs)
+
+    def connect(self, **kwargs):
+        """Return a newly allocated Connection object."""
+
+        return self.Connection(self, **kwargs)
+
+    def contextual_connect(self, close_with_result=False, **kwargs):
+        """Return a Connection object which may be newly allocated, or may be part of some ongoing context.
+
+        This Connection is meant to be used by the various "auto-connecting" operations.
+        """
+
+        return self.Connection(self, self.pool.connect(), close_with_result=close_with_result, **kwargs)
+
+    def table_names(self, schema=None, connection=None):
+        """Return a list of all table names available in the database.
+
+        schema:
+          Optional, retrieve names from a non-default schema.
+
+        connection:
+          Optional, use a specified connection.  Default is the
+          ``contextual_connect`` for this ``Engine``.
+        """
+
+        if connection is None:
+            conn = self.contextual_connect()
+        else:
+            conn = connection
+        if not schema:
+            try:
+                schema =  self.dialect.get_default_schema_name(conn)
+            except NotImplementedError:
+                pass
+        try:
+            return self.dialect.table_names(conn, schema)
+        finally:
+            if connection is None:
+                conn.close()
+
+    def reflecttable(self, table, connection=None, include_columns=None):
+        """Given a Table object, reflects its columns and properties from the database."""
+
+        if connection is None:
+            conn = self.contextual_connect()
+        else:
+            conn = connection
+        try:
+            self.dialect.reflecttable(conn, table, include_columns)
+        finally:
+            if connection is None:
+                conn.close()
+
+    def has_table(self, table_name, schema=None):
+        return self.run_callable(lambda c: self.dialect.has_table(c, table_name, schema=schema))
+
+    def raw_connection(self):
+        """Return a DB-API connection."""
+
+        return self.pool.unique_connection()
+
+def _proxy_connection_cls(cls, proxy):
+    class ProxyConnection(cls):
+        def execute(self, object, *multiparams, **params):
+            return proxy.execute(self, super(ProxyConnection, self).execute, object, *multiparams, **params)
+ 
+        def _execute_clauseelement(self, elem, multiparams=None, params=None):
+            return proxy.execute(self, super(ProxyConnection, self).execute, elem, *(multiparams or []), **(params or {}))
+            
+        def _cursor_execute(self, cursor, statement, parameters, context=None):
+            return proxy.cursor_execute(super(ProxyConnection, self)._cursor_execute, cursor, statement, parameters, context, False)
+ 
+        def _cursor_executemany(self, cursor, statement, parameters, context=None):
+            return proxy.cursor_execute(super(ProxyConnection, self)._cursor_executemany, cursor, statement, parameters, context, True)
+
+    return ProxyConnection
+
+class RowProxy(object):
+    """Proxy a single cursor row for a parent ResultProxy.
+
+    Mostly follows "ordered dictionary" behavior, mapping result
+    values to the string-based column name, the integer position of
+    the result in the row, as well as Column instances which can be
+    mapped to the original Columns that produced this result set (for
+    results that correspond to constructed SQL expressions).
+    """
+
+    __slots__ = ['__parent', '__row']
+    
+    def __init__(self, parent, row):
+        """RowProxy objects are constructed by ResultProxy objects."""
+
+        self.__parent = parent
+        self.__row = row
+        if self.__parent._echo:
+            self.__parent.context.engine.logger.debug("Row " + repr(row))
+
+    def close(self):
+        """Close the parent ResultProxy."""
+
+        self.__parent.close()
+
+    def __contains__(self, key):
+        return self.__parent._has_key(self.__row, key)
+
+    def __len__(self):
+        return len(self.__row)
+
+    def __iter__(self):
+        for i in xrange(len(self.__row)):
+            yield self.__parent._get_col(self.__row, i)
+
+    __hash__ = None
+    
+    def __eq__(self, other):
+        return ((other is self) or
+                (other == tuple(self.__parent._get_col(self.__row, key)
+                                for key in xrange(len(self.__row)))))
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __repr__(self):
+        return repr(tuple(self))
+
+    def has_key(self, key):
+        """Return True if this RowProxy contains the given key."""
+
+        return self.__parent._has_key(self.__row, key)
+
+    def __getitem__(self, key):
+        return self.__parent._get_col(self.__row, key)
+
+    def __getattr__(self, name):
+        try:
+            return self.__parent._get_col(self.__row, name)
+        except KeyError, e:
+            raise AttributeError(e.args[0])
+
+    def items(self):
+        """Return a list of tuples, each tuple containing a key/value pair."""
+
+        return [(key, getattr(self, key)) for key in self.iterkeys()]
+
+    def keys(self):
+        """Return the list of keys as strings represented by this RowProxy."""
+
+        return self.__parent.keys
+    
+    def iterkeys(self):
+        return iter(self.__parent.keys)
+        
+    def values(self):
+        """Return the values represented by this RowProxy as a list."""
+
+        return list(self)
+    
+    def itervalues(self):
+        return iter(self)
+
+class BufferedColumnRow(RowProxy):
+    def __init__(self, parent, row):
+        row = [ResultProxy._get_col(parent, row, i) for i in xrange(len(row))]
+        super(BufferedColumnRow, self).__init__(parent, row)
+
+
+class ResultProxy(object):
+    """Wraps a DB-API cursor object to provide easier access to row columns.
+
+    Individual columns may be accessed by their integer position,
+    case-insensitive column name, or by ``schema.Column``
+    object. e.g.::
+
+      row = fetchone()
+
+      col1 = row[0]    # access via integer position
+
+      col2 = row['col2']   # access via name
+
+      col3 = row[mytable.c.mycol] # access via Column object.
+
+    ResultProxy also contains a map of TypeEngine objects and will
+    invoke the appropriate ``result_processor()`` method before
+    returning columns, as well as the ExecutionContext corresponding
+    to the statement execution.  It provides several methods for which
+    to obtain information from the underlying ExecutionContext.
+    """
+
+    _process_row = RowProxy
+
+    def __init__(self, context):
+        """ResultProxy objects are constructed via the execute() method on SQLEngine."""
+        self.context = context
+        self.dialect = context.dialect
+        self.closed = False
+        self.cursor = context.cursor
+        self.connection = context.root_connection
+        self._echo = context.engine._should_log_info
+        self._init_metadata()
+    
+    @property
+    def rowcount(self):
+        if self._rowcount is None:
+            return self.context.get_rowcount()
+        else:
+            return self._rowcount
+
+    @property
+    def lastrowid(self):
+        return self.cursor.lastrowid
+
+    @property
+    def out_parameters(self):
+        return self.context.out_parameters
+
+    def _init_metadata(self):
+        metadata = self.cursor.description
+        if metadata is None:
+            # no results, get rowcount (which requires open cursor on some DB's such as firebird),
+            # then close
+            self._rowcount = self.context.get_rowcount()
+            self.close()
+            return
+            
+        self._rowcount = None
+        self._props = util.populate_column_dict(None)
+        self._props.creator = self.__key_fallback()
+        self.keys = []
+
+        typemap = self.dialect.dbapi_type_map
+
+        for i, item in enumerate(metadata):
+            colname = item[0]
+            if self.dialect.description_encoding:
+                colname = colname.decode(self.dialect.description_encoding)
+
+            if '.' in colname:
+                # sqlite will in some circumstances prepend table name to colnames, so strip
+                origname = colname
+                colname = colname.split('.')[-1]
+            else:
+                origname = None
+
+            if self.context.result_map:
+                try:
+                    (name, obj, type_) = self.context.result_map[colname.lower()]
+                except KeyError:
+                    (name, obj, type_) = (colname, None, typemap.get(item[1], types.NULLTYPE))
+            else:
+                (name, obj, type_) = (colname, None, typemap.get(item[1], types.NULLTYPE))
+
+            rec = (type_, type_.dialect_impl(self.dialect).result_processor(self.dialect), i)
+
+            if self._props.setdefault(name.lower(), rec) is not rec:
+                self._props[name.lower()] = (type_, self.__ambiguous_processor(name), 0)
+
+            # store the "origname" if we truncated (sqlite only)
+            if origname:
+                if self._props.setdefault(origname.lower(), rec) is not rec:
+                    self._props[origname.lower()] = (type_, self.__ambiguous_processor(origname), 0)
+
+            self.keys.append(colname)
+            self._props[i] = rec
+            if obj:
+                for o in obj:
+                    self._props[o] = rec
+
+        if self._echo:
+            self.context.engine.logger.debug(
+                "Col " + repr(tuple(x[0] for x in metadata)))
+    
+    def __key_fallback(self):
+        # create a closure without 'self' to avoid circular references
+        props = self._props
+        
+        def fallback(key):
+            if isinstance(key, basestring):
+                key = key.lower()
+                if key in props:
+                    return props[key]
+
+            # fallback for targeting a ColumnElement to a textual expression
+            # this is a rare use case which only occurs when matching text()
+            # constructs to ColumnElements
+            if isinstance(key, expression.ColumnElement):
+                if key._label and key._label.lower() in props:
+                    return props[key._label.lower()]
+                elif hasattr(key, 'name') and key.name.lower() in props:
+                    return props[key.name.lower()]
+
+            raise exc.NoSuchColumnError("Could not locate column in row for column '%s'" % (str(key)))
+        return fallback
+
+    def __ambiguous_processor(self, colname):
+        def process(value):
+            raise exc.InvalidRequestError("Ambiguous column name '%s' in result set! "
+                        "try 'use_labels' option on select statement." % colname)
+        return process
+
+    def close(self):
+        """Close this ResultProxy.
+        
+        Closes the underlying DBAPI cursor corresponding to the execution.
+
+        If this ResultProxy was generated from an implicit execution,
+        the underlying Connection will also be closed (returns the
+        underlying DBAPI connection to the connection pool.)
+
+        This method is called automatically when:
+        
+            * all result rows are exhausted using the fetchXXX() methods.
+            * cursor.description is None.
+        
+        """
+        if not self.closed:
+            self.closed = True
+            self.cursor.close()
+            if self.connection.should_close_with_result:
+                self.connection.close()
+
+    def _has_key(self, row, key):
+        try:
+            # _key_cache uses __missing__ in 2.5, so not much alternative
+            # to catching KeyError
+            self._props[key]
+            return True
+        except KeyError:
+            return False
+
+    def __iter__(self):
+        while True:
+            row = self.fetchone()
+            if row is None:
+                raise StopIteration
+            else:
+                yield row
+
+    def last_inserted_ids(self):
+        """Return ``last_inserted_ids()`` from the underlying ExecutionContext.
+
+        See ExecutionContext for details.
+
+        """
+        return self.context.last_inserted_ids()
+
+    def last_updated_params(self):
+        """Return ``last_updated_params()`` from the underlying ExecutionContext.
+
+        See ExecutionContext for details.
+
+        """
+        return self.context.last_updated_params()
+
+    def last_inserted_params(self):
+        """Return ``last_inserted_params()`` from the underlying ExecutionContext.
+
+        See ExecutionContext for details.
+
+        """
+        return self.context.last_inserted_params()
+
+    def lastrow_has_defaults(self):
+        """Return ``lastrow_has_defaults()`` from the underlying ExecutionContext.
+
+        See ExecutionContext for details.
+        
+        """
+        return self.context.lastrow_has_defaults()
+
+    def postfetch_cols(self):
+        """Return ``postfetch_cols()`` from the underlying ExecutionContext.
+
+        See ExecutionContext for details.
+        
+        """
+        return self.context.postfetch_cols
+    
+    def prefetch_cols(self):
+        return self.context.prefetch_cols
+        
+    def supports_sane_rowcount(self):
+        """Return ``supports_sane_rowcount`` from the dialect."""
+        
+        return self.dialect.supports_sane_rowcount
+
+    def supports_sane_multi_rowcount(self):
+        """Return ``supports_sane_multi_rowcount`` from the dialect."""
+
+        return self.dialect.supports_sane_multi_rowcount
+
+    def _get_col(self, row, key):
+        try:
+            type_, processor, index = self._props[key]
+        except TypeError:
+            # the 'slice' use case is very infrequent,
+            # so we use an exception catch to reduce conditionals in _get_col
+            if isinstance(key, slice):
+                indices = key.indices(len(row))
+                return tuple(self._get_col(row, i) for i in xrange(*indices))
+            else:
+                raise
+
+        if processor:
+            return processor(row[index])
+        else:
+            return row[index]
+
+    def _fetchone_impl(self):
+        return self.cursor.fetchone()
+
+    def _fetchmany_impl(self, size=None):
+        return self.cursor.fetchmany(size)
+
+    def _fetchall_impl(self):
+        return self.cursor.fetchall()
+
+    def fetchall(self):
+        """Fetch all rows, just like DB-API ``cursor.fetchall()``."""
+
+        try:
+            process_row = self._process_row
+            l = [process_row(self, row) for row in self._fetchall_impl()]
+            self.close()
+            return l
+        except Exception, e:
+            self.connection._handle_dbapi_exception(e, None, None, self.cursor, self.context)
+            raise
+
+    def fetchmany(self, size=None):
+        """Fetch many rows, just like DB-API ``cursor.fetchmany(size=cursor.arraysize)``."""
+
+        try:
+            process_row = self._process_row
+            l = [process_row(self, row) for row in self._fetchmany_impl(size)]
+            if len(l) == 0:
+                self.close()
+            return l
+        except Exception, e:
+            self.connection._handle_dbapi_exception(e, None, None, self.cursor, self.context)
+            raise
+
+    def fetchone(self):
+        """Fetch one row, just like DB-API ``cursor.fetchone()``."""
+        try:
+            row = self._fetchone_impl()
+            if row is not None:
+                return self._process_row(self, row)
+            else:
+                self.close()
+                return None
+        except Exception, e:
+            self.connection._handle_dbapi_exception(e, None, None, self.cursor, self.context)
+            raise
+
+    def scalar(self):
+        """Fetch the first column of the first row, and close the result set."""
+        try:
+            row = self._fetchone_impl()
+        except Exception, e:
+            self.connection._handle_dbapi_exception(e, None, None, self.cursor, self.context)
+            raise
+            
+        try:
+            if row is not None:
+                return self._process_row(self, row)[0]
+            else:
+                return None
+        finally:
+            self.close()
+
+class BufferedRowResultProxy(ResultProxy):
+    """A ResultProxy with row buffering behavior.
+
+    ``ResultProxy`` that buffers the contents of a selection of rows
+    before ``fetchone()`` is called.  This is to allow the results of
+    ``cursor.description`` to be available immediately, when
+    interfacing with a DB-API that requires rows to be consumed before
+    this information is available (currently psycopg2, when used with
+    server-side cursors).
+
+    The pre-fetching behavior fetches only one row initially, and then
+    grows its buffer size by a fixed amount with each successive need
+    for additional rows up to a size of 100.
+    
+    """
+
+    def _init_metadata(self):
+        self.__buffer_rows()
+        super(BufferedRowResultProxy, self)._init_metadata()
+
+    # this is a "growth chart" for the buffering of rows.
+    # each successive __buffer_rows call will use the next
+    # value in the list for the buffer size until the max
+    # is reached
+    size_growth = {
+        1 : 5,
+        5 : 10,
+        10 : 20,
+        20 : 50,
+        50 : 100
+    }
+
+    def __buffer_rows(self):
+        size = getattr(self, '_bufsize', 1)
+        self.__rowbuffer = self.cursor.fetchmany(size)
+        self._bufsize = self.size_growth.get(size, size)
+
+    def _fetchone_impl(self):
+        if self.closed:
+            return None
+        if len(self.__rowbuffer) == 0:
+            self.__buffer_rows()
+            if len(self.__rowbuffer) == 0:
+                return None
+        return self.__rowbuffer.pop(0)
+
+    def _fetchmany_impl(self, size=None):
+        result = []
+        for x in range(0, size):
+            row = self._fetchone_impl()
+            if row is None:
+                break
+            result.append(row)
+        return result
+
+    def _fetchall_impl(self):
+        return self.__rowbuffer + list(self.cursor.fetchall())
+
+class BufferedColumnResultProxy(ResultProxy):
+    """A ResultProxy with column buffering behavior.
+
+    ``ResultProxy`` that loads all columns into memory each time
+    fetchone() is called.  If fetchmany() or fetchall() are called,
+    the full grid of results is fetched.  This is to operate with
+    databases where result rows contain "live" results that fall out
+    of scope unless explicitly fetched.  Currently this includes just
+    cx_Oracle LOB objects, but this behavior is known to exist in
+    other DB-APIs as well (Pygresql, currently unsupported).
+    
+    """
+
+    _process_row = BufferedColumnRow
+
+    def _get_col(self, row, key):
+        try:
+            rec = self._props[key]
+            return row[rec[2]]
+        except TypeError:
+            # the 'slice' use case is very infrequent,
+            # so we use an exception catch to reduce conditionals in _get_col
+            if isinstance(key, slice):
+                indices = key.indices(len(row))
+                return tuple(self._get_col(row, i) for i in xrange(*indices))
+            else:
+                raise
+
+    def fetchall(self):
+        l = []
+        while True:
+            row = self.fetchone()
+            if row is None:
+                break
+            l.append(row)
+        return l
+
+    def fetchmany(self, size=None):
+        if size is None:
+            return self.fetchall()
+        l = []
+        for i in xrange(size):
+            row = self.fetchone()
+            if row is None:
+                break
+            l.append(row)
+        return l
+
+
+class SchemaIterator(schema.SchemaVisitor):
+    """A visitor that can gather text into a buffer and execute the contents of the buffer."""
+
+    def __init__(self, connection):
+        """Construct a new SchemaIterator."""
+        
+        self.connection = connection
+        self.buffer = StringIO.StringIO()
+
+    def append(self, s):
+        """Append content to the SchemaIterator's query buffer."""
+
+        self.buffer.write(s)
+
+    def execute(self):
+        """Execute the contents of the SchemaIterator's buffer."""
+
+        try:
+            return self.connection.execute(self.buffer.getvalue())
+        finally:
+            self.buffer.truncate(0)
+
+class DefaultRunner(schema.SchemaVisitor):
+    """A visitor which accepts ColumnDefault objects, produces the
+    dialect-specific SQL corresponding to their execution, and
+    executes the SQL, returning the result value.
+
+    DefaultRunners are used internally by Engines and Dialects.
+    Specific database modules should provide their own subclasses of
+    DefaultRunner to allow database-specific behavior.
+
+    """
+
+    def __init__(self, context):
+        self.context = context
+        self.dialect = context.dialect
+        self.cursor = context.cursor
+
+    def get_column_default(self, column):
+        if column.default is not None:
+            return self.traverse_single(column.default)
+        else:
+            return None
+
+    def get_column_onupdate(self, column):
+        if column.onupdate is not None:
+            return self.traverse_single(column.onupdate)
+        else:
+            return None
+
+    def visit_passive_default(self, default):
+        return None
+
+    def visit_sequence(self, seq):
+        return None
+
+    def exec_default_sql(self, default):
+        conn = self.context.connection
+        c = expression.select([default.arg]).compile(bind=conn)
+        return conn._execute_compiled(c, (), {}).scalar()
+
+    def execute_string(self, stmt, params=None):
+        """execute a string statement, using the raw cursor, and return a scalar result."""
+        
+        conn = self.context._connection
+        if isinstance(stmt, unicode) and not self.dialect.supports_unicode_statements:
+            stmt = stmt.encode(self.dialect.encoding)
+        conn._cursor_execute(self.cursor, stmt, params)
+        return self.cursor.fetchone()[0]
+
+    def visit_column_onupdate(self, onupdate):
+        if isinstance(onupdate.arg, expression.ClauseElement):
+            return self.exec_default_sql(onupdate)
+        elif util.callable(onupdate.arg):
+            return onupdate.arg(self.context)
+        else:
+            return onupdate.arg
+
+    def visit_column_default(self, default):
+        if isinstance(default.arg, expression.ClauseElement):
+            return self.exec_default_sql(default)
+        elif util.callable(default.arg):
+            return default.arg(self.context)
+        else:
+            return default.arg
+
+
+def connection_memoize(key):
+    """Decorator, memoize a function in a connection.info stash.
+
+    Only applicable to functions which take no arguments other than a
+    connection.  The memo will be stored in ``connection.info[key]``.
+
+    """
+    @util.decorator
+    def decorated(fn, self, connection):
+        connection = connection.connect()
+        try:
+            return connection.info[key]
+        except KeyError:
+            connection.info[key] = val = fn(self, connection)
+            return val
+
+    return decorated
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/engine/strategies.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/engine/strategies.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/engine/strategies.py (revision 3)
@@ -0,0 +1,213 @@
+"""Strategies for creating new instances of Engine types.
+
+These are semi-private implementation classes which provide the
+underlying behavior for the "strategy" keyword argument available on
+:func:`~sqlalchemy.engine.create_engine`.  Current available options are
+``plain``, ``threadlocal``, and ``mock``.
+
+New strategies can be added via new ``EngineStrategy`` classes.
+
+"""
+from operator import attrgetter
+
+from sqlalchemy.engine import base, threadlocal, url
+from sqlalchemy import util, exc
+from sqlalchemy import pool as poollib
+
+
+strategies = {}
+
+class EngineStrategy(object):
+    """An adaptor that processes input arguements and produces an Engine.
+
+    Provides a ``create`` method that receives input arguments and
+    produces an instance of base.Engine or a subclass.
+    """
+
+    def __init__(self, name):
+        """Construct a new EngineStrategy object.
+
+        Sets it in the list of available strategies under this name.
+        """
+
+        self.name = name
+        strategies[self.name] = self
+
+    def create(self, *args, **kwargs):
+        """Given arguments, returns a new Engine instance."""
+
+        raise NotImplementedError()
+
+class DefaultEngineStrategy(EngineStrategy):
+    """Base class for built-in stratgies."""
+
+    def create(self, name_or_url, **kwargs):
+        # create url.URL object
+        u = url.make_url(name_or_url)
+
+        dialect_cls = u.get_dialect()
+
+        dialect_args = {}
+        # consume dialect arguments from kwargs
+        for k in util.get_cls_kwargs(dialect_cls):
+            if k in kwargs:
+                dialect_args[k] = kwargs.pop(k)
+
+        dbapi = kwargs.pop('module', None)
+        if dbapi is None:
+            dbapi_args = {}
+            for k in util.get_func_kwargs(dialect_cls.dbapi):
+                if k in kwargs:
+                    dbapi_args[k] = kwargs.pop(k)
+            dbapi = dialect_cls.dbapi(**dbapi_args)
+
+        dialect_args['dbapi'] = dbapi
+
+        # create dialect
+        dialect = dialect_cls(**dialect_args)
+
+        # assemble connection arguments
+        (cargs, cparams) = dialect.create_connect_args(u)
+        cparams.update(kwargs.pop('connect_args', {}))
+
+        # look for existing pool or create
+        pool = kwargs.pop('pool', None)
+        if pool is None:
+            def connect():
+                try:
+                    return dbapi.connect(*cargs, **cparams)
+                except Exception, e:
+                    raise exc.DBAPIError.instance(None, None, e)
+            creator = kwargs.pop('creator', connect)
+
+            poolclass = (kwargs.pop('poolclass', None) or
+                         getattr(dialect_cls, 'poolclass', poollib.QueuePool))
+            pool_args = {}
+
+            # consume pool arguments from kwargs, translating a few of
+            # the arguments
+            translate = {'echo': 'echo_pool',
+                         'timeout': 'pool_timeout',
+                         'recycle': 'pool_recycle',
+                         'use_threadlocal':'pool_threadlocal'}
+            for k in util.get_cls_kwargs(poolclass):
+                tk = translate.get(k, k)
+                if tk in kwargs:
+                    pool_args[k] = kwargs.pop(tk)
+            pool_args.setdefault('use_threadlocal', self.pool_threadlocal())
+            pool = poolclass(creator, **pool_args)
+        else:
+            if isinstance(pool, poollib._DBProxy):
+                pool = pool.get_pool(*cargs, **cparams)
+            else:
+                pool = pool
+
+        # create engine.
+        engineclass = self.get_engine_cls()
+        engine_args = {}
+        for k in util.get_cls_kwargs(engineclass):
+            if k in kwargs:
+                engine_args[k] = kwargs.pop(k)
+
+        # all kwargs should be consumed
+        if kwargs:
+            raise TypeError(
+                "Invalid argument(s) %s sent to create_engine(), "
+                "using configuration %s/%s/%s.  Please check that the "
+                "keyword arguments are appropriate for this combination "
+                "of components." % (','.join("'%s'" % k for k in kwargs),
+                                    dialect.__class__.__name__,
+                                    pool.__class__.__name__,
+                                    engineclass.__name__))
+        return engineclass(pool, dialect, u, **engine_args)
+
+    def pool_threadlocal(self):
+        raise NotImplementedError()
+
+    def get_engine_cls(self):
+        raise NotImplementedError()
+
+class PlainEngineStrategy(DefaultEngineStrategy):
+    """Strategy for configuring a regular Engine."""
+
+    def __init__(self):
+        DefaultEngineStrategy.__init__(self, 'plain')
+
+    def pool_threadlocal(self):
+        return False
+
+    def get_engine_cls(self):
+        return base.Engine
+
+PlainEngineStrategy()
+
+class ThreadLocalEngineStrategy(DefaultEngineStrategy):
+    """Strategy for configuring an Engine with thredlocal behavior."""
+
+    def __init__(self):
+        DefaultEngineStrategy.__init__(self, 'threadlocal')
+
+    def pool_threadlocal(self):
+        return True
+
+    def get_engine_cls(self):
+        return threadlocal.TLEngine
+
+ThreadLocalEngineStrategy()
+
+
+class MockEngineStrategy(EngineStrategy):
+    """Strategy for configuring an Engine-like object with mocked execution.
+
+    Produces a single mock Connectable object which dispatches
+    statement execution to a passed-in function.
+    """
+
+    def __init__(self):
+        EngineStrategy.__init__(self, 'mock')
+
+    def create(self, name_or_url, executor, **kwargs):
+        # create url.URL object
+        u = url.make_url(name_or_url)
+
+        dialect_cls = u.get_dialect()
+
+        dialect_args = {}
+        # consume dialect arguments from kwargs
+        for k in util.get_cls_kwargs(dialect_cls):
+            if k in kwargs:
+                dialect_args[k] = kwargs.pop(k)
+
+        # create dialect
+        dialect = dialect_cls(**dialect_args)
+
+        return MockEngineStrategy.MockConnection(dialect, executor)
+
+    class MockConnection(base.Connectable):
+        def __init__(self, dialect, execute):
+            self._dialect = dialect
+            self.execute = execute
+
+        engine = property(lambda s: s)
+        dialect = property(attrgetter('_dialect'))
+        name = property(lambda s: s._dialect.name)
+
+        def contextual_connect(self, **kwargs):
+            return self
+
+        def compiler(self, statement, parameters, **kwargs):
+            return self._dialect.compiler(
+                statement, parameters, engine=self, **kwargs)
+
+        def create(self, entity, **kwargs):
+            kwargs['checkfirst'] = False
+            self.dialect.schemagenerator(self.dialect, self, **kwargs).traverse(entity)
+
+        def drop(self, entity, **kwargs):
+            kwargs['checkfirst'] = False
+            self.dialect.schemadropper(self.dialect, self, **kwargs).traverse(entity)
+
+        def execute(self, object, *multiparams, **params):
+            raise NotImplementedError()
+
+MockEngineStrategy()
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/engine/__init__.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/engine/__init__.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/engine/__init__.py (revision 3)
@@ -0,0 +1,260 @@
+# engine/__init__.py
+# Copyright (C) 2005, 2006, 2007, 2008, 2009 Michael Bayer mike_mp@zzzcomputing.com
+#
+# This module is part of SQLAlchemy and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+"""SQL connections, SQL execution and high-level DB-API interface.
+
+The engine package defines the basic components used to interface
+DB-API modules with higher-level statement construction,
+connection-management, execution and result contexts.  The primary
+"entry point" class into this package is the Engine and it's public
+constructor ``create_engine()``.
+
+This package includes:
+
+base.py
+    Defines interface classes and some implementation classes which
+    comprise the basic components used to interface between a DB-API,
+    constructed and plain-text statements, connections, transactions,
+    and results.
+
+default.py
+    Contains default implementations of some of the components defined
+    in base.py.  All current database dialects use the classes in
+    default.py as base classes for their own database-specific
+    implementations.
+
+strategies.py
+    The mechanics of constructing ``Engine`` objects are represented
+    here.  Defines the ``EngineStrategy`` class which represents how
+    to go from arguments specified to the ``create_engine()``
+    function, to a fully constructed ``Engine``, including
+    initialization of connection pooling, dialects, and specific
+    subclasses of ``Engine``.
+
+threadlocal.py
+    The ``TLEngine`` class is defined here, which is a subclass of
+    the generic ``Engine`` and tracks ``Connection`` and
+    ``Transaction`` objects against the identity of the current
+    thread.  This allows certain programming patterns based around
+    the concept of a "thread-local connection" to be possible.
+    The ``TLEngine`` is created by using the "threadlocal" engine
+    strategy in conjunction with the ``create_engine()`` function.
+
+url.py
+    Defines the ``URL`` class which represents the individual
+    components of a string URL passed to ``create_engine()``.  Also
+    defines a basic module-loading strategy for the dialect specifier
+    within a URL.
+"""
+
+import sqlalchemy.databases
+from sqlalchemy.engine.base import (
+    BufferedColumnResultProxy,
+    BufferedColumnRow,
+    BufferedRowResultProxy,
+    Compiled,
+    Connectable,
+    Connection,
+    DefaultRunner,
+    Dialect,
+    Engine,
+    ExecutionContext,
+    NestedTransaction,
+    ResultProxy,
+    RootTransaction,
+    RowProxy,
+    SchemaIterator,
+    Transaction,
+    TwoPhaseTransaction
+    )
+from sqlalchemy.engine import strategies
+from sqlalchemy import util
+
+
+__all__ = (
+    'BufferedColumnResultProxy',
+    'BufferedColumnRow',
+    'BufferedRowResultProxy',
+    'Compiled',
+    'Connectable',
+    'Connection',
+    'DefaultRunner',
+    'Dialect',
+    'Engine',
+    'ExecutionContext',
+    'NestedTransaction',
+    'ResultProxy',
+    'RootTransaction',
+    'RowProxy',
+    'SchemaIterator',
+    'Transaction',
+    'TwoPhaseTransaction',
+    'create_engine',
+    'engine_from_config',
+    )
+
+
+default_strategy = 'plain'
+def create_engine(*args, **kwargs):
+    """Create a new Engine instance.
+
+    The standard method of specifying the engine is via URL as the
+    first positional argument, to indicate the appropriate database
+    dialect and connection arguments, with additional keyword
+    arguments sent as options to the dialect and resulting Engine.
+
+    The URL is a string in the form
+    ``dialect://user:password@host/dbname[?key=value..]``, where
+    ``dialect`` is a name such as ``mysql``, ``oracle``, ``postgres``,
+    etc.  Alternatively, the URL can be an instance of
+    :class:`~sqlalchemy.engine.url.URL`.
+
+    `**kwargs` takes a wide variety of options which are routed 
+    towards their appropriate components.  Arguments may be 
+    specific to the Engine, the underlying Dialect, as well as the 
+    Pool.  Specific dialects also accept keyword arguments that
+    are unique to that dialect.   Here, we describe the parameters
+    that are common to most ``create_engine()`` usage.
+    
+    :param assert_unicode=False: When set to ``True`` alongside
+        convert_unicode=``True``, asserts that incoming string bind
+        parameters are instances of ``unicode``, otherwise raises an
+        error. Only takes effect when ``convert_unicode==True``. This
+        flag is also available on the ``String`` type and its
+        descendants. New in 0.4.2.
+
+    :param connect_args: a dictionary of options which will be
+        passed directly to the DBAPI's ``connect()`` method as
+        additional keyword arguments.
+
+    :param convert_unicode=False: if set to True, all
+        String/character based types will convert Unicode values to raw
+        byte values going into the database, and all raw byte values to
+        Python Unicode coming out in result sets. This is an
+        engine-wide method to provide unicode conversion across the
+        board. For unicode conversion on a column-by-column level, use
+        the ``Unicode`` column type instead, described in `types`.
+
+    :param creator: a callable which returns a DBAPI connection.
+        This creation function will be passed to the underlying
+        connection pool and will be used to create all new database
+        connections. Usage of this function causes connection
+        parameters specified in the URL argument to be bypassed.
+
+    :param echo=False: if True, the Engine will log all statements
+        as well as a repr() of their parameter lists to the engines
+        logger, which defaults to sys.stdout. The ``echo`` attribute of
+        ``Engine`` can be modified at any time to turn logging on and
+        off. If set to the string ``"debug"``, result rows will be
+        printed to the standard output as well. This flag ultimately
+        controls a Python logger; see `dbengine_logging` at the end of
+        this chapter for information on how to configure logging
+        directly.
+
+    :param echo_pool=False: if True, the connection pool will log
+        all checkouts/checkins to the logging stream, which defaults to
+        sys.stdout. This flag ultimately controls a Python logger; see
+        `dbengine_logging` for information on how to configure logging
+        directly.
+
+    :param encoding='utf-8': the encoding to use for all Unicode
+        translations, both by engine-wide unicode conversion as well as
+        the ``Unicode`` type object.
+
+    :param label_length=None: optional integer value which limits
+        the size of dynamically generated column labels to that many
+        characters. If less than 6, labels are generated as
+        "_(counter)". If ``None``, the value of
+        ``dialect.max_identifier_length`` is used instead.
+
+    :param module=None: used by database implementations which
+        support multiple DBAPI modules, this is a reference to a DBAPI2
+        module to be used instead of the engine's default module. For
+        PostgreSQL, the default is psycopg2. For Oracle, it's cx_Oracle.
+
+    :param pool=None: an already-constructed instance of
+        :class:`~sqlalchemy.pool.Pool`, such as a
+        :class:`~sqlalchemy.pool.QueuePool` instance. If non-None, this
+        pool will be used directly as the underlying connection pool
+        for the engine, bypassing whatever connection parameters are
+        present in the URL argument. For information on constructing
+        connection pools manually, see `pooling`.
+
+    :param poolclass=None: a :class:`~sqlalchemy.pool.Pool`
+        subclass, which will be used to create a connection pool
+        instance using the connection parameters given in the URL. Note
+        this differs from ``pool`` in that you don't actually
+        instantiate the pool in this case, you just indicate what type
+        of pool to be used.
+
+    :param max_overflow=10: the number of connections to allow in
+        connection pool "overflow", that is connections that can be
+        opened above and beyond the pool_size setting, which defaults
+        to five. this is only used with :class:`~sqlalchemy.pool.QueuePool`.
+
+    :param pool_size=5: the number of connections to keep open
+        inside the connection pool. This used with :class:`~sqlalchemy.pool.QueuePool` as
+        well as :class:`~sqlalchemy.pool.SingletonThreadPool`.
+
+    :param pool_recycle=-1: this setting causes the pool to recycle
+        connections after the given number of seconds has passed. It
+        defaults to -1, or no timeout. For example, setting to 3600
+        means connections will be recycled after one hour. Note that
+        MySQL in particular will ``disconnect automatically`` if no
+        activity is detected on a connection for eight hours (although
+        this is configurable with the MySQLDB connection itself and the
+        server configuration as well).
+
+    :param pool_timeout=30: number of seconds to wait before giving
+        up on getting a connection from the pool. This is only used
+        with :class:`~sqlalchemy.pool.QueuePool`.
+
+    :param strategy='plain': used to invoke alternate :class:`~sqlalchemy.engine.base.Engine.`
+        implementations. Currently available is the ``threadlocal``
+        strategy, which is described in :ref:`threadlocal_strategy`.
+    
+    """
+
+    strategy = kwargs.pop('strategy', default_strategy)
+    strategy = strategies.strategies[strategy]
+    return strategy.create(*args, **kwargs)
+
+def engine_from_config(configuration, prefix='sqlalchemy.', **kwargs):
+    """Create a new Engine instance using a configuration dictionary.
+
+    The dictionary is typically produced from a config file where keys
+    are prefixed, such as sqlalchemy.url, sqlalchemy.echo, etc.  The
+    'prefix' argument indicates the prefix to be searched for.
+
+    A select set of keyword arguments will be "coerced" to their
+    expected type based on string values.  In a future release, this
+    functionality will be expanded and include dialect-specific
+    arguments.
+    """
+
+    opts = _coerce_config(configuration, prefix)
+    opts.update(kwargs)
+    url = opts.pop('url')
+    return create_engine(url, **opts)
+
+def _coerce_config(configuration, prefix):
+    """Convert configuration values to expected types."""
+
+    options = dict((key[len(prefix):], configuration[key])
+                   for key in configuration
+                   if key.startswith(prefix))
+    for option, type_ in (
+        ('convert_unicode', bool),
+        ('pool_timeout', int),
+        ('echo', bool),
+        ('echo_pool', bool),
+        ('pool_recycle', int),
+        ('pool_size', int),
+        ('max_overflow', int),
+        ('pool_threadlocal', bool),
+    ):
+        util.coerce_kw_type(options, option, type_)
+    return options
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/engine/threadlocal.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/engine/threadlocal.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/engine/threadlocal.py (revision 3)
@@ -0,0 +1,215 @@
+"""Provides a thread-local transactional wrapper around the root Engine class.
+
+The ``threadlocal`` module is invoked when using the ``strategy="threadlocal"`` flag
+with :func:`~sqlalchemy.engine.create_engine`.  This module is semi-private and is 
+invoked automatically when the threadlocal engine strategy is used.
+"""
+
+from sqlalchemy import util
+from sqlalchemy.engine import base
+
+class TLSession(object):
+    def __init__(self, engine):
+        self.engine = engine
+        self.__tcount = 0
+
+    def get_connection(self, close_with_result=False):
+        try:
+            return self.__transaction._increment_connect()
+        except AttributeError:
+            return self.engine.TLConnection(self, self.engine.pool.connect(), close_with_result=close_with_result)
+
+    def reset(self):
+        try:
+            self.__transaction._force_close()
+            del self.__transaction
+            del self.__trans
+        except AttributeError:
+            pass
+        self.__tcount = 0
+
+    def _conn_closed(self):
+        if self.__tcount == 1:
+            self.__trans._trans.rollback()
+            self.reset()
+
+    def in_transaction(self):
+        return self.__tcount > 0
+
+    def prepare(self):
+        if self.__tcount == 1:
+            self.__trans._trans.prepare()
+
+    def begin_twophase(self, xid=None):
+        if self.__tcount == 0:
+            self.__transaction = self.get_connection()
+            self.__trans = self.__transaction._begin_twophase(xid=xid)
+        self.__tcount += 1
+        return self.__trans
+
+    def begin(self, **kwargs):
+        if self.__tcount == 0:
+            self.__transaction = self.get_connection()
+            self.__trans = self.__transaction._begin(**kwargs)
+        self.__tcount += 1
+        return self.__trans
+
+    def rollback(self):
+        if self.__tcount > 0:
+            try:
+                self.__trans._trans.rollback()
+            finally:
+                self.reset()
+
+    def commit(self):
+        if self.__tcount == 1:
+            try:
+                self.__trans._trans.commit()
+            finally:
+                self.reset()
+        elif self.__tcount > 1:
+            self.__tcount -= 1
+            
+    def close(self):
+        if self.__tcount == 1:
+            self.rollback()
+        elif self.__tcount > 1:
+            self.__tcount -= 1
+        
+    def is_begun(self):
+        return self.__tcount > 0
+
+
+class TLConnection(base.Connection):
+    def __init__(self, session, connection, **kwargs):
+        base.Connection.__init__(self, session.engine, connection, **kwargs)
+        self.__session = session
+        self.__opencount = 1
+
+    def _branch(self):
+        return self.engine.Connection(self.engine, self.connection, _branch=True)
+
+    def session(self):
+        return self.__session
+    session = property(session)
+
+    def _increment_connect(self):
+        self.__opencount += 1
+        return self
+
+    def _begin(self, **kwargs):
+        return TLTransaction(
+            super(TLConnection, self).begin(**kwargs), self.__session)
+
+    def _begin_twophase(self, xid=None):
+        return TLTransaction(
+            super(TLConnection, self).begin_twophase(xid=xid), self.__session)
+
+    def in_transaction(self):
+        return self.session.in_transaction()
+
+    def begin(self, **kwargs):
+        return self.session.begin(**kwargs)
+
+    def begin_twophase(self, xid=None):
+        return self.session.begin_twophase(xid=xid)
+    
+    def begin_nested(self):
+        raise NotImplementedError("SAVEPOINT transactions with the 'threadlocal' strategy")
+        
+    def close(self):
+        if self.__opencount == 1:
+            base.Connection.close(self)
+            self.__session._conn_closed()
+        self.__opencount -= 1
+
+    def _force_close(self):
+        self.__opencount = 0
+        base.Connection.close(self)
+
+
+class TLTransaction(base.Transaction):
+    def __init__(self, trans, session):
+        self._trans = trans
+        self._session = session
+
+    def connection(self):
+        return self._trans.connection
+    connection = property(connection)
+    
+    def is_active(self):
+        return self._trans.is_active
+    is_active = property(is_active)
+
+    def rollback(self):
+        self._session.rollback()
+
+    def prepare(self):
+        self._session.prepare()
+
+    def commit(self):
+        self._session.commit()
+
+    def close(self):
+        self._session.close()
+
+    def __enter__(self):
+        return self
+
+    def __exit__(self, type, value, traceback):
+        self._trans.__exit__(type, value, traceback)
+
+
+class TLEngine(base.Engine):
+    """An Engine that includes support for thread-local managed transactions.
+
+    The TLEngine relies upon its Pool having "threadlocal" behavior,
+    so that once a connection is checked out for the current thread,
+    you get that same connection repeatedly.
+    """
+
+    def __init__(self, *args, **kwargs):
+        """Construct a new TLEngine."""
+
+        super(TLEngine, self).__init__(*args, **kwargs)
+        self.context = util.threading.local()
+
+        proxy = kwargs.get('proxy')
+        if proxy:
+            self.TLConnection = base._proxy_connection_cls(TLConnection, proxy)
+        else:
+            self.TLConnection = TLConnection
+
+    def session(self):
+        "Returns the current thread's TLSession"
+        if not hasattr(self.context, 'session'):
+            self.context.session = TLSession(self)
+        return self.context.session
+
+    session = property(session)
+
+    def contextual_connect(self, **kwargs):
+        """Return a TLConnection which is thread-locally scoped."""
+
+        return self.session.get_connection(**kwargs)
+
+    def begin_twophase(self, **kwargs):
+        return self.session.begin_twophase(**kwargs)
+
+    def begin_nested(self):
+        raise NotImplementedError("SAVEPOINT transactions with the 'threadlocal' strategy")
+        
+    def begin(self, **kwargs):
+        return self.session.begin(**kwargs)
+
+    def prepare(self):
+        self.session.prepare()
+        
+    def commit(self):
+        self.session.commit()
+
+    def rollback(self):
+        self.session.rollback()
+
+    def __repr__(self):
+        return 'TLEngine(%s)' % str(self.url)
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/engine/url.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/engine/url.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/engine/url.py (revision 3)
@@ -0,0 +1,185 @@
+"""Provides the :class:`~sqlalchemy.engine.url.URL` class which encapsulates
+information about a database connection specification.
+
+The URL object is created automatically when :func:`~sqlalchemy.engine.create_engine` is called
+with a string argument; alternatively, the URL is a public-facing construct which can
+be used directly and is also accepted directly by ``create_engine()``.
+"""
+
+import re, cgi, sys, urllib
+from sqlalchemy import exc
+
+
+class URL(object):
+    """
+    Represent the components of a URL used to connect to a database.
+
+    This object is suitable to be passed directly to a
+    ``create_engine()`` call.  The fields of the URL are parsed from a
+    string by the ``module-level make_url()`` function.  the string
+    format of the URL is an RFC-1738-style string.
+
+    All initialization parameters are available as public attributes.
+    
+    :param drivername: the name of the database backend.  
+      This name will correspond to a module in sqlalchemy/databases 
+      or a third party plug-in.
+
+    :param username: The user name.
+
+    :param password: database password.
+
+    :param host: The name of the host.
+
+    :param port: The port number.
+
+    :param database: The database name.
+
+    :param query: A dictionary of options to be passed to the 
+      dialect and/or the DBAPI upon connect.
+        
+    """
+
+    def __init__(self, drivername, username=None, password=None, host=None, port=None, database=None, query=None):
+        self.drivername = drivername
+        self.username = username
+        self.password = password
+        self.host = host
+        if port is not None:
+            self.port = int(port)
+        else:
+            self.port = None
+        self.database = database
+        self.query = query or {}
+
+    def __str__(self):
+        s = self.drivername + "://"
+        if self.username is not None:
+            s += self.username
+            if self.password is not None:
+                s += ':' + urllib.quote_plus(self.password)
+            s += "@"
+        if self.host is not None:
+            s += self.host
+        if self.port is not None:
+            s += ':' + str(self.port)
+        if self.database is not None:
+            s += '/' + self.database
+        if self.query:
+            keys = self.query.keys()
+            keys.sort()
+            s += '?' + "&".join("%s=%s" % (k, self.query[k]) for k in keys)
+        return s
+    
+    def __hash__(self):
+        return hash(str(self))
+    
+    def __eq__(self, other):
+        return \
+            isinstance(other, URL) and \
+            self.drivername == other.drivername and \
+            self.username == other.username and \
+            self.password == other.password and \
+            self.host == other.host and \
+            self.database == other.database and \
+            self.query == other.query
+            
+    def get_dialect(self):
+        """Return the SQLAlchemy database dialect class corresponding to this URL's driver name."""
+        
+        try:
+            module = getattr(__import__('sqlalchemy.databases.%s' % self.drivername).databases, self.drivername)
+            return module.dialect
+        except ImportError:
+            if sys.exc_info()[2].tb_next is None:
+                import pkg_resources
+                for res in pkg_resources.iter_entry_points('sqlalchemy.databases'):
+                    if res.name == self.drivername:
+                        return res.load()
+            raise
+  
+    def translate_connect_args(self, names=[], **kw):
+        """Translate url attributes into a dictionary of connection arguments.
+
+        Returns attributes of this url (`host`, `database`, `username`,
+        `password`, `port`) as a plain dictionary.  The attribute names are
+        used as the keys by default.  Unset or false attributes are omitted
+        from the final dictionary.
+
+        :param \**kw: Optional, alternate key names for url attributes.
+        
+        :param names: Deprecated.  Same purpose as the keyword-based alternate names,
+            but correlates the name to the original positionally.
+        
+        """
+
+        translated = {}
+        attribute_names = ['host', 'database', 'username', 'password', 'port']
+        for sname in attribute_names:
+            if names:
+                name = names.pop(0)
+            elif sname in kw:
+                name = kw[sname]
+            else:
+                name = sname
+            if name is not None and getattr(self, sname, False):
+                translated[name] = getattr(self, sname)
+        return translated
+
+def make_url(name_or_url):
+    """Given a string or unicode instance, produce a new URL instance.
+
+    The given string is parsed according to the RFC 1738 spec.  If an
+    existing URL object is passed, just returns the object.
+    
+    """
+    if isinstance(name_or_url, basestring):
+        return _parse_rfc1738_args(name_or_url)
+    else:
+        return name_or_url
+
+def _parse_rfc1738_args(name):
+    pattern = re.compile(r'''
+            (?P<name>\w+)://
+            (?:
+                (?P<username>[^:/]*)
+                (?::(?P<password>[^/]*))?
+            @)?
+            (?:
+                (?P<host>[^/:]*)
+                (?::(?P<port>[^/]*))?
+            )?
+            (?:/(?P<database>.*))?
+            '''
+            , re.X)
+
+    m = pattern.match(name)
+    if m is not None:
+        components = m.groupdict()
+        if components['database'] is not None:
+            tokens = components['database'].split('?', 2)
+            components['database'] = tokens[0]
+            query = (len(tokens) > 1 and dict(cgi.parse_qsl(tokens[1]))) or None
+            if query is not None:
+                query = dict((k.encode('ascii'), query[k]) for k in query)
+        else:
+            query = None
+        components['query'] = query
+
+        if components['password'] is not None:
+            components['password'] = urllib.unquote_plus(components['password'])
+
+        name = components.pop('name')
+        return URL(name, **components)
+    else:
+        raise exc.ArgumentError(
+            "Could not parse rfc1738 URL from string '%s'" % name)
+
+def _parse_keyvalue_args(name):
+    m = re.match( r'(\w+)://(.*)', name)
+    if m is not None:
+        (name, args) = m.group(1, 2)
+        opts = dict( cgi.parse_qsl( args ) )
+        return URL(name, *opts)
+    else:
+        return None
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/engine/default.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/engine/default.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/engine/default.py (revision 3)
@@ -0,0 +1,375 @@
+# engine/default.py
+# Copyright (C) 2005, 2006, 2007, 2008, 2009 Michael Bayer mike_mp@zzzcomputing.com
+#
+# This module is part of SQLAlchemy and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+"""Default implementations of per-dialect sqlalchemy.engine classes.
+
+These are semi-private implementation classes which are only of importance
+to database dialect authors; dialects will usually use the classes here
+as the base class for their own corresponding classes.
+
+"""
+
+import re, random
+from sqlalchemy.engine import base
+from sqlalchemy.sql import compiler, expression
+from sqlalchemy import exc
+
+AUTOCOMMIT_REGEXP = re.compile(r'\s*(?:UPDATE|INSERT|CREATE|DELETE|DROP|ALTER)',
+                               re.I | re.UNICODE)
+
+class DefaultDialect(base.Dialect):
+    """Default implementation of Dialect"""
+
+    name = 'default'
+    schemagenerator = compiler.SchemaGenerator
+    schemadropper = compiler.SchemaDropper
+    statement_compiler = compiler.DefaultCompiler
+    preparer = compiler.IdentifierPreparer
+    defaultrunner = base.DefaultRunner
+    supports_alter = True
+    supports_unicode_statements = False
+    max_identifier_length = 9999
+    supports_sane_rowcount = True
+    supports_sane_multi_rowcount = True
+    preexecute_pk_sequences = False
+    supports_pk_autoincrement = True
+    dbapi_type_map = {}
+    default_paramstyle = 'named'
+    supports_default_values = False 
+    supports_empty_insert = True
+
+    def __init__(self, convert_unicode=False, assert_unicode=False,
+                 encoding='utf-8', paramstyle=None, dbapi=None, 
+                 label_length=None, **kwargs):
+        self.convert_unicode = convert_unicode
+        self.assert_unicode = assert_unicode
+        self.encoding = encoding
+        self.positional = False
+        self._ischema = None
+        self.dbapi = dbapi
+        if paramstyle is not None:
+            self.paramstyle = paramstyle
+        elif self.dbapi is not None:
+            self.paramstyle = self.dbapi.paramstyle
+        else:
+            self.paramstyle = self.default_paramstyle
+        self.positional = self.paramstyle in ('qmark', 'format', 'numeric')
+        self.identifier_preparer = self.preparer(self)
+        if label_length and label_length > self.max_identifier_length:
+            raise exc.ArgumentError("Label length of %d is greater than this dialect's maximum identifier length of %d" % (label_length, self.max_identifier_length))
+        self.label_length = label_length
+        self.description_encoding = getattr(self, 'description_encoding', encoding)
+
+    def type_descriptor(self, typeobj):
+        """Provide a database-specific ``TypeEngine`` object, given
+        the generic object which comes from the types module.
+
+        Subclasses will usually use the ``adapt_type()`` method in the
+        types module to make this job easy."""
+
+        if type(typeobj) is type:
+            typeobj = typeobj()
+        return typeobj
+
+    def validate_identifier(self, ident):
+        if len(ident) > self.max_identifier_length:
+            raise exc.IdentifierError("Identifier '%s' exceeds maximum length of %d characters" % (ident, self.max_identifier_length))
+        
+    def do_begin(self, connection):
+        """Implementations might want to put logic here for turning
+        autocommit on/off, etc.
+        """
+
+        pass
+
+    def do_rollback(self, connection):
+        """Implementations might want to put logic here for turning
+        autocommit on/off, etc.
+        """
+
+        connection.rollback()
+
+    def do_commit(self, connection):
+        """Implementations might want to put logic here for turning
+        autocommit on/off, etc.
+        """
+
+        connection.commit()
+
+    def create_xid(self):
+        """Create a random two-phase transaction ID.
+
+        This id will be passed to do_begin_twophase(), do_rollback_twophase(),
+        do_commit_twophase().  Its format is unspecified."""
+
+        return "_sa_%032x" % random.randint(0, 2 ** 128)
+
+    def do_savepoint(self, connection, name):
+        connection.execute(expression.SavepointClause(name))
+
+    def do_rollback_to_savepoint(self, connection, name):
+        connection.execute(expression.RollbackToSavepointClause(name))
+
+    def do_release_savepoint(self, connection, name):
+        connection.execute(expression.ReleaseSavepointClause(name))
+
+    def do_executemany(self, cursor, statement, parameters, context=None):
+        cursor.executemany(statement, parameters)
+
+    def do_execute(self, cursor, statement, parameters, context=None):
+        cursor.execute(statement, parameters)
+
+    def is_disconnect(self, e):
+        return False
+
+
+class DefaultExecutionContext(base.ExecutionContext):
+    def __init__(self, dialect, connection, compiled=None, statement=None, parameters=None):
+        self.dialect = dialect
+        self._connection = self.root_connection = connection
+        self.compiled = compiled
+        self.engine = connection.engine
+
+        if compiled is not None:
+            # compiled clauseelement.  process bind params, process table defaults,
+            # track collections used by ResultProxy to target and process results
+
+            if not compiled.can_execute:
+                raise exc.ArgumentError("Not an executable clause: %s" % compiled)
+
+            self.processors = dict(
+                (key, value) for key, value in
+                ( (compiled.bind_names[bindparam],
+                   bindparam.bind_processor(self.dialect))
+                  for bindparam in compiled.bind_names )
+                if value is not None)
+
+            self.result_map = compiled.result_map
+
+            if not dialect.supports_unicode_statements:
+                self.statement = unicode(compiled).encode(self.dialect.encoding)
+            else:
+                self.statement = unicode(compiled)
+
+            self.isinsert = compiled.isinsert
+            self.isupdate = compiled.isupdate
+            self.should_autocommit = compiled.statement._autocommit
+            if isinstance(compiled.statement, expression._TextClause):
+                self.should_autocommit = self.should_autocommit or self.should_autocommit_text(self.statement)
+
+            if not parameters:
+                self.compiled_parameters = [compiled.construct_params()]
+                self.executemany = False
+            else:
+                self.compiled_parameters = [compiled.construct_params(m) for m in parameters]
+                self.executemany = len(parameters) > 1
+
+            self.cursor = self.create_cursor()
+            if self.isinsert or self.isupdate:
+                self.__process_defaults()
+            self.parameters = self.__convert_compiled_params(self.compiled_parameters)
+
+        elif statement is not None:
+            # plain text statement.
+            self.result_map = None
+            self.parameters = self.__encode_param_keys(parameters)
+            self.executemany = len(parameters) > 1
+            if isinstance(statement, unicode) and not dialect.supports_unicode_statements:
+                self.statement = statement.encode(self.dialect.encoding)
+            else:
+                self.statement = statement
+            self.isinsert = self.isupdate = False
+            self.cursor = self.create_cursor()
+            self.should_autocommit = self.should_autocommit_text(statement)
+        else:
+            # no statement. used for standalone ColumnDefault execution.
+            self.statement = None
+            self.isinsert = self.isupdate = self.executemany = self.should_autocommit = False
+            self.cursor = self.create_cursor()
+
+    @property
+    def connection(self):
+        return self._connection._branch()
+
+    def __encode_param_keys(self, params):
+        """apply string encoding to the keys of dictionary-based bind parameters.
+
+        This is only used executing textual, non-compiled SQL expressions."""
+
+        if self.dialect.positional or self.dialect.supports_unicode_statements:
+            if params:
+                return params
+            elif self.dialect.positional:
+                return [()]
+            else:
+                return [{}]
+        else:
+            def proc(d):
+                # sigh, sometimes we get positional arguments with a dialect
+                # that doesnt specify positional (because of execute_text())
+                if not isinstance(d, dict):
+                    return d
+                return dict((k.encode(self.dialect.encoding), d[k]) for k in d)
+            return [proc(d) for d in params] or [{}]
+
+    def __convert_compiled_params(self, compiled_parameters):
+        """convert the dictionary of bind parameter values into a dict or list
+        to be sent to the DBAPI's execute() or executemany() method.
+        """
+
+        processors = self.processors
+        parameters = []
+        if self.dialect.positional:
+            for compiled_params in compiled_parameters:
+                param = []
+                for key in self.compiled.positiontup:
+                    if key in processors:
+                        param.append(processors[key](compiled_params[key]))
+                    else:
+                        param.append(compiled_params[key])
+                parameters.append(param)
+        else:
+            encode = not self.dialect.supports_unicode_statements
+            for compiled_params in compiled_parameters:
+                param = {}
+                if encode:
+                    encoding = self.dialect.encoding
+                    for key in compiled_params:
+                        if key in processors:
+                            param[key.encode(encoding)] = processors[key](compiled_params[key])
+                        else:
+                            param[key.encode(encoding)] = compiled_params[key]
+                else:
+                    for key in compiled_params:
+                        if key in processors:
+                            param[key] = processors[key](compiled_params[key])
+                        else:
+                            param[key] = compiled_params[key]
+                parameters.append(param)
+        return parameters
+
+    def should_autocommit_text(self, statement):
+        return AUTOCOMMIT_REGEXP.match(statement)
+
+    def create_cursor(self):
+        return self._connection.connection.cursor()
+
+    def pre_exec(self):
+        pass
+
+    def post_exec(self):
+        pass
+    
+    def handle_dbapi_exception(self, e):
+        pass
+
+    def get_result_proxy(self):
+        return base.ResultProxy(self)
+
+    def get_rowcount(self):
+        if hasattr(self, '_rowcount'):
+            return self._rowcount
+        else:
+            return self.cursor.rowcount
+        
+    def supports_sane_rowcount(self):
+        return self.dialect.supports_sane_rowcount
+
+    def supports_sane_multi_rowcount(self):
+        return self.dialect.supports_sane_multi_rowcount
+
+    def last_inserted_ids(self):
+        return self._last_inserted_ids
+
+    def last_inserted_params(self):
+        return self._last_inserted_params
+
+    def last_updated_params(self):
+        return self._last_updated_params
+
+    def lastrow_has_defaults(self):
+        return hasattr(self, 'postfetch_cols') and len(self.postfetch_cols)
+
+    def set_input_sizes(self):
+        """Given a cursor and ClauseParameters, call the appropriate
+        style of ``setinputsizes()`` on the cursor, using DB-API types
+        from the bind parameter's ``TypeEngine`` objects.
+        """
+
+        types = dict(
+                (self.compiled.bind_names[bindparam], bindparam.type)
+                 for bindparam in self.compiled.bind_names)
+
+        if self.dialect.positional:
+            inputsizes = []
+            for key in self.compiled.positiontup:
+                typeengine = types[key]
+                dbtype = typeengine.dialect_impl(self.dialect).get_dbapi_type(self.dialect.dbapi)
+                if dbtype is not None:
+                    inputsizes.append(dbtype)
+            try:
+                self.cursor.setinputsizes(*inputsizes)
+            except Exception, e:
+                self._connection._handle_dbapi_exception(e, None, None, None, self)
+                raise
+        else:
+            inputsizes = {}
+            for key in self.compiled.bind_names.values():
+                typeengine = types[key]
+                dbtype = typeengine.dialect_impl(self.dialect).get_dbapi_type(self.dialect.dbapi)
+                if dbtype is not None:
+                    inputsizes[key.encode(self.dialect.encoding)] = dbtype
+            try:
+                self.cursor.setinputsizes(**inputsizes)
+            except Exception, e:
+                self._connection._handle_dbapi_exception(e, None, None, None, self)
+                raise
+
+    def __process_defaults(self):
+        """generate default values for compiled insert/update statements,
+        and generate last_inserted_ids() collection."""
+
+        if self.executemany:
+            if len(self.compiled.prefetch):
+                drunner = self.dialect.defaultrunner(self)
+                params = self.compiled_parameters
+                for param in params:
+                    # assign each dict of params to self.compiled_parameters;
+                    # this allows user-defined default generators to access the full
+                    # set of bind params for the row
+                    self.compiled_parameters = param
+                    for c in self.compiled.prefetch:
+                        if self.isinsert:
+                            val = drunner.get_column_default(c)
+                        else:
+                            val = drunner.get_column_onupdate(c)
+                        if val is not None:
+                            param[c.key] = val
+                self.compiled_parameters = params
+
+        else:
+            compiled_parameters = self.compiled_parameters[0]
+            drunner = self.dialect.defaultrunner(self)
+
+            for c in self.compiled.prefetch:
+                if self.isinsert:
+                    val = drunner.get_column_default(c)
+                else:
+                    val = drunner.get_column_onupdate(c)
+
+                if val is not None:
+                    compiled_parameters[c.key] = val
+
+            if self.isinsert:
+                self._last_inserted_ids = [compiled_parameters.get(c.key, None) for c in self.compiled.statement.table.primary_key]
+                self._last_inserted_params = compiled_parameters
+            else:
+                self._last_updated_params = compiled_parameters
+
+            self.postfetch_cols = self.compiled.postfetch
+            self.prefetch_cols = self.compiled.prefetch
+
+DefaultDialect.execution_ctx_cls = DefaultExecutionContext
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/exc.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/exc.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/exc.py (revision 3)
@@ -0,0 +1,191 @@
+# Copyright (C) 2005, 2006, 2007, 2008, 2009 Michael Bayer mike_mp@zzzcomputing.com
+#
+# This module is part of SQLAlchemy and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+"""Exceptions used with SQLAlchemy.
+
+The base exception class is SQLAlchemyError.  Exceptions which are raised as a
+result of DBAPI exceptions are all subclasses of
+:class:`~sqlalchemy.exc.DBAPIError`.
+
+"""
+
+
+class SQLAlchemyError(Exception):
+    """Generic error class."""
+
+
+class ArgumentError(SQLAlchemyError):
+    """Raised when an invalid or conflicting function argument is supplied.
+
+    This error generally corresponds to construction time state errors.
+
+    """
+
+
+class CircularDependencyError(SQLAlchemyError):
+    """Raised by topological sorts when a circular dependency is detected"""
+
+
+class CompileError(SQLAlchemyError):
+    """Raised when an error occurs during SQL compilation"""
+
+class IdentifierError(SQLAlchemyError):
+    """Raised when a schema name is beyond the max character limit"""
+
+# Moved to orm.exc; compatability definition installed by orm import until 0.6
+ConcurrentModificationError = None
+
+class DisconnectionError(SQLAlchemyError):
+    """A disconnect is detected on a raw DB-API connection.
+
+    This error is raised and consumed internally by a connection pool.  It can
+    be raised by a ``PoolListener`` so that the host pool forces a disconnect.
+
+    """
+
+
+# Moved to orm.exc; compatability definition installed by orm import until 0.6
+FlushError = None
+
+class TimeoutError(SQLAlchemyError):
+    """Raised when a connection pool times out on getting a connection."""
+
+
+class InvalidRequestError(SQLAlchemyError):
+    """SQLAlchemy was asked to do something it can't do.
+
+    This error generally corresponds to runtime state errors.
+
+    """
+
+class NoSuchColumnError(KeyError, InvalidRequestError):
+    """A nonexistent column is requested from a ``RowProxy``."""
+
+class NoReferenceError(InvalidRequestError):
+    """Raised by ``ForeignKey`` to indicate a reference cannot be resolved."""
+    
+class NoReferencedTableError(NoReferenceError):
+    """Raised by ``ForeignKey`` when the referred ``Table`` cannot be located."""
+
+class NoReferencedColumnError(NoReferenceError):
+    """Raised by ``ForeignKey`` when the referred ``Column`` cannot be located."""
+
+class NoSuchTableError(InvalidRequestError):
+    """Table does not exist or is not visible to a connection."""
+
+
+class UnboundExecutionError(InvalidRequestError):
+    """SQL was attempted without a database connection to execute it on."""
+
+
+# Moved to orm.exc; compatability definition installed by orm import until 0.6
+UnmappedColumnError = None
+
+class DBAPIError(SQLAlchemyError):
+    """Raised when the execution of a database operation fails.
+
+    ``DBAPIError`` wraps exceptions raised by the DB-API underlying the
+    database operation.  Driver-specific implementations of the standard
+    DB-API exception types are wrapped by matching sub-types of SQLAlchemy's
+    ``DBAPIError`` when possible.  DB-API's ``Error`` type maps to
+    ``DBAPIError`` in SQLAlchemy, otherwise the names are identical.  Note
+    that there is no guarantee that different DB-API implementations will
+    raise the same exception type for any given error condition.
+
+    If the error-raising operation occured in the execution of a SQL
+    statement, that statement and its parameters will be available on
+    the exception object in the ``statement`` and ``params`` attributes.
+
+    The wrapped exception object is available in the ``orig`` attribute.
+    Its type and properties are DB-API implementation specific.
+
+    """
+
+    def instance(cls, statement, params, orig, connection_invalidated=False):
+        # Don't ever wrap these, just return them directly as if
+        # DBAPIError didn't exist.
+        if isinstance(orig, (KeyboardInterrupt, SystemExit)):
+            return orig
+
+        if orig is not None:
+            name, glob = orig.__class__.__name__, globals()
+            if name in glob and issubclass(glob[name], DBAPIError):
+                cls = glob[name]
+
+        return cls(statement, params, orig, connection_invalidated)
+    instance = classmethod(instance)
+
+    def __init__(self, statement, params, orig, connection_invalidated=False):
+        try:
+            text = str(orig)
+        except (KeyboardInterrupt, SystemExit):
+            raise
+        except Exception, e:
+            text = 'Error in str() of DB-API-generated exception: ' + str(e)
+        SQLAlchemyError.__init__(
+            self, '(%s) %s' % (orig.__class__.__name__, text))
+        self.statement = statement
+        self.params = params
+        self.orig = orig
+        self.connection_invalidated = connection_invalidated
+
+    def __str__(self):
+        if isinstance(self.params, (list, tuple)) and len(self.params) > 10 and isinstance(self.params[0], (list, dict, tuple)):
+            return ' '.join((SQLAlchemyError.__str__(self),
+                             repr(self.statement),
+                             repr(self.params[:2]),
+                             '... and a total of %i bound parameter sets' % len(self.params)))
+        return ' '.join((SQLAlchemyError.__str__(self),
+                         repr(self.statement), repr(self.params)))
+
+
+# As of 0.4, SQLError is now DBAPIError.
+# SQLError alias will be removed in 0.6.
+SQLError = DBAPIError
+
+class InterfaceError(DBAPIError):
+    """Wraps a DB-API InterfaceError."""
+
+
+class DatabaseError(DBAPIError):
+    """Wraps a DB-API DatabaseError."""
+
+
+class DataError(DatabaseError):
+    """Wraps a DB-API DataError."""
+
+
+class OperationalError(DatabaseError):
+    """Wraps a DB-API OperationalError."""
+
+
+class IntegrityError(DatabaseError):
+    """Wraps a DB-API IntegrityError."""
+
+
+class InternalError(DatabaseError):
+    """Wraps a DB-API InternalError."""
+
+
+class ProgrammingError(DatabaseError):
+    """Wraps a DB-API ProgrammingError."""
+
+
+class NotSupportedError(DatabaseError):
+    """Wraps a DB-API NotSupportedError."""
+
+
+# Warnings
+
+class SADeprecationWarning(DeprecationWarning):
+    """Issued once per usage of a deprecated API."""
+
+
+class SAPendingDeprecationWarning(PendingDeprecationWarning):
+    """Issued once per usage of a deprecated API."""
+
+
+class SAWarning(RuntimeWarning):
+    """Issued at runtime."""
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/log.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/log.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/log.py (revision 3)
@@ -0,0 +1,110 @@
+# log.py - adapt python logging module to SQLAlchemy
+# Copyright (C) 2006, 2007, 2008, 2009 Michael Bayer mike_mp@zzzcomputing.com
+#
+# This module is part of SQLAlchemy and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+"""Logging control and utilities.
+
+Control of logging for SA can be performed from the regular python logging
+module.  The regular dotted module namespace is used, starting at
+'sqlalchemy'.  For class-level logging, the class name is appended.
+
+The "echo" keyword parameter which is available on SQLA ``Engine``
+and ``Pool`` objects corresponds to a logger specific to that 
+instance only.
+
+E.g.::
+
+    engine.echo = True
+
+is equivalent to::
+
+    import logging
+    logger = logging.getLogger('sqlalchemy.engine.Engine.%s' % hex(id(engine)))
+    logger.setLevel(logging.DEBUG)
+    
+"""
+
+import logging
+import sys
+
+
+rootlogger = logging.getLogger('sqlalchemy')
+if rootlogger.level == logging.NOTSET:
+    rootlogger.setLevel(logging.WARN)
+
+default_enabled = False
+def default_logging(name):
+    global default_enabled
+    if logging.getLogger(name).getEffectiveLevel() < logging.WARN:
+        default_enabled = True
+    if not default_enabled:
+        default_enabled = True
+        handler = logging.StreamHandler(sys.stdout)
+        handler.setFormatter(logging.Formatter(
+            '%(asctime)s %(levelname)s %(name)s %(message)s'))
+        rootlogger.addHandler(handler)
+
+def class_logger(cls, enable=False):
+    logger = logging.getLogger(cls.__module__ + "." + cls.__name__)
+    if enable == 'debug':
+        logger.setLevel(logging.DEBUG)
+    elif enable == 'info':
+        logger.setLevel(logging.INFO)
+    cls._should_log_debug = logger.isEnabledFor(logging.DEBUG)
+    cls._should_log_info = logger.isEnabledFor(logging.INFO)
+    cls.logger = logger
+
+def instance_logger(instance, echoflag=None):
+    """create a logger for an instance.
+    
+    Warning: this is an expensive call which also results in a permanent
+    increase in memory overhead for each call.  Use only for 
+    low-volume, long-time-spanning objects.
+    
+    """
+    
+    # limit the number of loggers by chopping off the hex(id).
+    # many novice users unfortunately create an unlimited number 
+    # of Engines in their applications which would otherwise
+    # cause the app to run out of memory.
+    name = "%s.%s.0x...%s" % (instance.__class__.__module__,
+                             instance.__class__.__name__,
+                             hex(id(instance))[-4:])
+    
+    if echoflag is not None:
+        l = logging.getLogger(name)
+        if echoflag == 'debug':
+            default_logging(name)
+            l.setLevel(logging.DEBUG)
+        elif echoflag is True:
+            default_logging(name)
+            l.setLevel(logging.INFO)
+        elif echoflag is False:
+            l.setLevel(logging.NOTSET)
+    else:
+        l = logging.getLogger(name)
+    instance._should_log_debug = l.isEnabledFor(logging.DEBUG)
+    instance._should_log_info = l.isEnabledFor(logging.INFO)
+    return l
+
+class echo_property(object):
+    __doc__ = """\
+    When ``True``, enable log output for this element.
+
+    This has the effect of setting the Python logging level for the namespace
+    of this element's class and object reference.  A value of boolean ``True``
+    indicates that the loglevel ``logging.INFO`` will be set for the logger,
+    whereas the string value ``debug`` will set the loglevel to
+    ``logging.DEBUG``.
+    """
+
+    def __get__(self, instance, owner):
+        if instance is None:
+            return self
+        else:
+            return instance._should_log_debug and 'debug' or (instance._should_log_info and True or False)
+
+    def __set__(self, instance, value):
+        instance_logger(instance, echoflag=value)
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/interfaces.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/interfaces.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/interfaces.py (revision 3)
@@ -0,0 +1,144 @@
+# interfaces.py
+# Copyright (C) 2007 Jason Kirtland jek@discorporate.us
+#
+# This module is part of SQLAlchemy and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+"""Interfaces and abstract types."""
+
+
+class PoolListener(object):
+    """Hooks into the lifecycle of connections in a ``Pool``.
+
+    Usage::
+    
+        class MyListener(PoolListener):
+            def connect(self, dbapi_con, con_record):
+                '''perform connect operations'''
+            # etc. 
+            
+        # create a new pool with a listener
+        p = QueuePool(..., listeners=[MyListener()])
+        
+        # add a listener after the fact
+        p.add_listener(MyListener())
+        
+        # usage with create_engine()
+        e = create_engine("url://", listeners=[MyListener()])
+        
+    All of the standard connection :class:`~sqlalchemy.pool.Pool` types can
+    accept event listeners for key connection lifecycle events:
+    creation, pool check-out and check-in.  There are no events fired
+    when a connection closes.
+
+    For any given DB-API connection, there will be one ``connect``
+    event, `n` number of ``checkout`` events, and either `n` or `n - 1`
+    ``checkin`` events.  (If a ``Connection`` is detached from its
+    pool via the ``detach()`` method, it won't be checked back in.)
+
+    These are low-level events for low-level objects: raw Python
+    DB-API connections, without the conveniences of the SQLAlchemy
+    ``Connection`` wrapper, ``Dialect`` services or ``ClauseElement``
+    execution.  If you execute SQL through the connection, explicitly
+    closing all cursors and other resources is recommended.
+
+    Events also receive a ``_ConnectionRecord``, a long-lived internal
+    ``Pool`` object that basically represents a "slot" in the
+    connection pool.  ``_ConnectionRecord`` objects have one public
+    attribute of note: ``info``, a dictionary whose contents are
+    scoped to the lifetime of the DB-API connection managed by the
+    record.  You can use this shared storage area however you like.
+
+    There is no need to subclass ``PoolListener`` to handle events.
+    Any class that implements one or more of these methods can be used
+    as a pool listener.  The ``Pool`` will inspect the methods
+    provided by a listener object and add the listener to one or more
+    internal event queues based on its capabilities.  In terms of
+    efficiency and function call overhead, you're much better off only
+    providing implementations for the hooks you'll be using.
+    
+    """
+
+    def connect(self, dbapi_con, con_record):
+        """Called once for each new DB-API connection or Pool's ``creator()``.
+
+        dbapi_con
+          A newly connected raw DB-API connection (not a SQLAlchemy
+          ``Connection`` wrapper).
+
+        con_record
+          The ``_ConnectionRecord`` that persistently manages the connection
+
+        """
+
+    def checkout(self, dbapi_con, con_record, con_proxy):
+        """Called when a connection is retrieved from the Pool.
+
+        dbapi_con
+          A raw DB-API connection
+
+        con_record
+          The ``_ConnectionRecord`` that persistently manages the connection
+
+        con_proxy
+          The ``_ConnectionFairy`` which manages the connection for the span of
+          the current checkout.
+
+        If you raise an ``exc.DisconnectionError``, the current
+        connection will be disposed and a fresh connection retrieved.
+        Processing of all checkout listeners will abort and restart
+        using the new connection.
+        """
+
+    def checkin(self, dbapi_con, con_record):
+        """Called when a connection returns to the pool.
+
+        Note that the connection may be closed, and may be None if the
+        connection has been invalidated.  ``checkin`` will not be called
+        for detached connections.  (They do not return to the pool.)
+
+        dbapi_con
+          A raw DB-API connection
+
+        con_record
+          The ``_ConnectionRecord`` that persistently manages the connection
+
+        """
+
+class ConnectionProxy(object):
+    """Allows interception of statement execution by Connections.
+    
+    Either or both of the ``execute()`` and ``cursor_execute()``
+    may be implemented to intercept compiled statement and
+    cursor level executions, e.g.::
+    
+        class MyProxy(ConnectionProxy):
+            def execute(self, conn, execute, clauseelement, *multiparams, **params):
+                print "compiled statement:", clauseelement
+                return execute(clauseelement, *multiparams, **params)
+                
+            def cursor_execute(self, execute, cursor, statement, parameters, context, executemany):
+                print "raw statement:", statement
+                return execute(cursor, statement, parameters, context)
+
+    The ``execute`` argument is a function that will fulfill the default
+    execution behavior for the operation.  The signature illustrated
+    in the example should be used.
+    
+    The proxy is installed into an :class:`~sqlalchemy.engine.Engine` via
+    the ``proxy`` argument::
+    
+        e = create_engine('someurl://', proxy=MyProxy())
+    
+    """
+    def execute(self, conn, execute, clauseelement, *multiparams, **params):
+        """Intercept high level execute() events."""
+        
+        return execute(clauseelement, *multiparams, **params)
+
+    def cursor_execute(self, execute, cursor, statement, parameters, context, executemany):
+        """Intercept low-level cursor execute() events."""
+        
+        return execute(cursor, statement, parameters, context)
+
+        
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/queue.py
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/queue.py (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/sqlalchemy/queue.py (revision 3)
@@ -0,0 +1,183 @@
+"""An adaptation of Py2.3/2.4's Queue module which supports reentrant
+behavior, using RLock instead of Lock for its mutex object.
+
+This is to support the connection pool's usage of weakref callbacks to return
+connections to the underlying Queue, which can apparently in extremely
+rare cases be invoked within the ``get()`` method of the Queue itself,
+producing a ``put()`` inside the ``get()`` and therefore a reentrant
+condition."""
+
+from collections import deque
+from time import time as _time
+from sqlalchemy.util import threading
+
+__all__ = ['Empty', 'Full', 'Queue']
+
+class Empty(Exception):
+    "Exception raised by Queue.get(block=0)/get_nowait()."
+
+    pass
+
+class Full(Exception):
+    "Exception raised by Queue.put(block=0)/put_nowait()."
+
+    pass
+
+class Queue:
+    def __init__(self, maxsize=0):
+        """Initialize a queue object with a given maximum size.
+
+        If `maxsize` is <= 0, the queue size is infinite.
+        """
+
+        self._init(maxsize)
+        # mutex must be held whenever the queue is mutating.  All methods
+        # that acquire mutex must release it before returning.  mutex
+        # is shared between the two conditions, so acquiring and
+        # releasing the conditions also acquires and releases mutex.
+        self.mutex = threading.RLock()
+        # Notify not_empty whenever an item is added to the queue; a
+        # thread waiting to get is notified then.
+        self.not_empty = threading.Condition(self.mutex)
+        # Notify not_full whenever an item is removed from the queue;
+        # a thread waiting to put is notified then.
+        self.not_full = threading.Condition(self.mutex)
+
+    def qsize(self):
+        """Return the approximate size of the queue (not reliable!)."""
+
+        self.mutex.acquire()
+        n = self._qsize()
+        self.mutex.release()
+        return n
+
+    def empty(self):
+        """Return True if the queue is empty, False otherwise (not reliable!)."""
+
+        self.mutex.acquire()
+        n = self._empty()
+        self.mutex.release()
+        return n
+
+    def full(self):
+        """Return True if the queue is full, False otherwise (not reliable!)."""
+
+        self.mutex.acquire()
+        n = self._full()
+        self.mutex.release()
+        return n
+
+    def put(self, item, block=True, timeout=None):
+        """Put an item into the queue.
+
+        If optional args `block` is True and `timeout` is None (the
+        default), block if necessary until a free slot is
+        available. If `timeout` is a positive number, it blocks at
+        most `timeout` seconds and raises the ``Full`` exception if no
+        free slot was available within that time.  Otherwise (`block`
+        is false), put an item on the queue if a free slot is
+        immediately available, else raise the ``Full`` exception
+        (`timeout` is ignored in that case).
+        """
+
+        self.not_full.acquire()
+        try:
+            if not block:
+                if self._full():
+                    raise Full
+            elif timeout is None:
+                while self._full():
+                    self.not_full.wait()
+            else:
+                if timeout < 0:
+                    raise ValueError("'timeout' must be a positive number")
+                endtime = _time() + timeout
+                while self._full():
+                    remaining = endtime - _time()
+                    if remaining <= 0.0:
+                        raise Full
+                    self.not_full.wait(remaining)
+            self._put(item)
+            self.not_empty.notify()
+        finally:
+            self.not_full.release()
+
+    def put_nowait(self, item):
+        """Put an item into the queue without blocking.
+
+        Only enqueue the item if a free slot is immediately available.
+        Otherwise raise the ``Full`` exception.
+        """
+        return self.put(item, False)
+
+    def get(self, block=True, timeout=None):
+        """Remove and return an item from the queue.
+
+        If optional args `block` is True and `timeout` is None (the
+        default), block if necessary until an item is available. If
+        `timeout` is a positive number, it blocks at most `timeout`
+        seconds and raises the ``Empty`` exception if no item was
+        available within that time.  Otherwise (`block` is false),
+        return an item if one is immediately available, else raise the
+        ``Empty`` exception (`timeout` is ignored in that case).
+        """
+
+        self.not_empty.acquire()
+        try:
+            if not block:
+                if self._empty():
+                    raise Empty
+            elif timeout is None:
+                while self._empty():
+                    self.not_empty.wait()
+            else:
+                if timeout < 0:
+                    raise ValueError("'timeout' must be a positive number")
+                endtime = _time() + timeout
+                while self._empty():
+                    remaining = endtime - _time()
+                    if remaining <= 0.0:
+                        raise Empty
+                    self.not_empty.wait(remaining)
+            item = self._get()
+            self.not_full.notify()
+            return item
+        finally:
+            self.not_empty.release()
+
+    def get_nowait(self):
+        """Remove and return an item from the queue without blocking.
+
+        Only get an item if one is immediately available. Otherwise
+        raise the ``Empty`` exception.
+        """
+
+        return self.get(False)
+
+    # Override these methods to implement other queue organizations
+    # (e.g. stack or priority queue).
+    # These will only be called with appropriate locks held
+
+    # Initialize the queue representation
+    def _init(self, maxsize):
+        self.maxsize = maxsize
+        self.queue = deque()
+
+    def _qsize(self):
+        return len(self.queue)
+
+    # Check whether the queue is empty
+    def _empty(self):
+        return not self.queue
+
+    # Check whether the queue is full
+    def _full(self):
+        return self.maxsize > 0 and len(self.queue) == self.maxsize
+
+    # Put a new item in the queue
+    def _put(self, item):
+        self.queue.append(item)
+
+    # Get an item from the queue
+    def _get(self):
+        return self.queue.popleft()
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/EGG-INFO/SOURCES.txt
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/EGG-INFO/SOURCES.txt (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/EGG-INFO/SOURCES.txt (revision 3)
@@ -0,0 +1,330 @@
+CHANGES
+CHANGES_PRE_05
+LICENSE
+MANIFEST.in
+README
+README.unittests
+convert.py
+scramble.py
+setup.cfg
+setup.py
+doc/build/Makefile
+doc/build/conf.py
+doc/build/copyright.rst
+doc/build/dbengine.rst
+doc/build/index.rst
+doc/build/intro.rst
+doc/build/mappers.rst
+doc/build/metadata.rst
+doc/build/ormtutorial.rst
+doc/build/session.rst
+doc/build/sqlexpression.rst
+doc/build/testdocs.py
+doc/build/builder/__init__.py
+doc/build/builder/builders.py
+doc/build/builder/util.py
+doc/build/reference/index.rst
+doc/build/reference/dialects/access.rst
+doc/build/reference/dialects/firebird.rst
+doc/build/reference/dialects/index.rst
+doc/build/reference/dialects/informix.rst
+doc/build/reference/dialects/maxdb.rst
+doc/build/reference/dialects/mssql.rst
+doc/build/reference/dialects/mysql.rst
+doc/build/reference/dialects/oracle.rst
+doc/build/reference/dialects/postgres.rst
+doc/build/reference/dialects/sqlite.rst
+doc/build/reference/dialects/sybase.rst
+doc/build/reference/ext/associationproxy.rst
+doc/build/reference/ext/compiler.rst
+doc/build/reference/ext/declarative.rst
+doc/build/reference/ext/index.rst
+doc/build/reference/ext/orderinglist.rst
+doc/build/reference/ext/serializer.rst
+doc/build/reference/ext/sqlsoup.rst
+doc/build/reference/orm/collections.rst
+doc/build/reference/orm/index.rst
+doc/build/reference/orm/interfaces.rst
+doc/build/reference/orm/mapping.rst
+doc/build/reference/orm/query.rst
+doc/build/reference/orm/sessions.rst
+doc/build/reference/orm/utilities.rst
+doc/build/reference/sqlalchemy/connections.rst
+doc/build/reference/sqlalchemy/expressions.rst
+doc/build/reference/sqlalchemy/index.rst
+doc/build/reference/sqlalchemy/interfaces.rst
+doc/build/reference/sqlalchemy/pooling.rst
+doc/build/reference/sqlalchemy/schema.rst
+doc/build/reference/sqlalchemy/types.rst
+doc/build/static/docs.css
+doc/build/static/init.js
+doc/build/templates/genindex.mako
+doc/build/templates/layout.mako
+doc/build/templates/page.mako
+doc/build/templates/search.mako
+doc/build/templates/site_base.mako
+doc/build/templates/static_base.mako
+doc/build/texinputs/sphinx.sty
+examples/README
+examples/__init__.py
+examples/adjacencytree/__init__.py
+examples/adjacencytree/basic_tree.py
+examples/association/__init__.py
+examples/association/basic_association.py
+examples/association/proxied_association.py
+examples/collections/__init__.py
+examples/collections/large_collection.py
+examples/custom_attributes/__init__.py
+examples/custom_attributes/custom_management.py
+examples/custom_attributes/listen_for_events.py
+examples/derived_attributes/__init__.py
+examples/derived_attributes/attributes.py
+examples/dynamic_dict/__init__.py
+examples/dynamic_dict/dynamic_dict.py
+examples/elementtree/__init__.py
+examples/elementtree/adjacency_list.py
+examples/elementtree/optimized_al.py
+examples/elementtree/pickle.py
+examples/elementtree/test.xml
+examples/elementtree/test2.xml
+examples/elementtree/test3.xml
+examples/graphs/__init__.py
+examples/graphs/graph1.py
+examples/nested_sets/__init__.py
+examples/nested_sets/nested_sets.py
+examples/pickle/__init__.py
+examples/pickle/custom_pickler.py
+examples/poly_assoc/__init__.py
+examples/poly_assoc/poly_assoc.py
+examples/poly_assoc/poly_assoc_fk.py
+examples/poly_assoc/poly_assoc_generic.py
+examples/polymorph/__init__.py
+examples/polymorph/concrete.py
+examples/polymorph/polymorph.py
+examples/polymorph/single.py
+examples/postgis/__init__.py
+examples/postgis/postgis.py
+examples/query_caching/__init__.py
+examples/query_caching/implicit.py
+examples/query_caching/per_session.py
+examples/query_caching/query_caching.py
+examples/sharding/__init__.py
+examples/sharding/attribute_shard.py
+examples/vertical/__init__.py
+examples/vertical/dictlike-polymorphic.py
+examples/vertical/dictlike.py
+examples/vertical/vertical.py
+lib/SQLAlchemy.egg-info/PKG-INFO
+lib/SQLAlchemy.egg-info/SOURCES.txt
+lib/SQLAlchemy.egg-info/dependency_links.txt
+lib/SQLAlchemy.egg-info/entry_points.txt
+lib/SQLAlchemy.egg-info/top_level.txt
+lib/sqlalchemy/__init__.py
+lib/sqlalchemy/exc.py
+lib/sqlalchemy/interfaces.py
+lib/sqlalchemy/log.py
+lib/sqlalchemy/pool.py
+lib/sqlalchemy/queue.py
+lib/sqlalchemy/schema.py
+lib/sqlalchemy/topological.py
+lib/sqlalchemy/types.py
+lib/sqlalchemy/util.py
+lib/sqlalchemy/databases/__init__.py
+lib/sqlalchemy/databases/access.py
+lib/sqlalchemy/databases/firebird.py
+lib/sqlalchemy/databases/information_schema.py
+lib/sqlalchemy/databases/informix.py
+lib/sqlalchemy/databases/maxdb.py
+lib/sqlalchemy/databases/mssql.py
+lib/sqlalchemy/databases/mxODBC.py
+lib/sqlalchemy/databases/mysql.py
+lib/sqlalchemy/databases/oracle.py
+lib/sqlalchemy/databases/postgres.py
+lib/sqlalchemy/databases/postgresql.py
+lib/sqlalchemy/databases/sqlite.py
+lib/sqlalchemy/databases/sybase.py
+lib/sqlalchemy/engine/__init__.py
+lib/sqlalchemy/engine/base.py
+lib/sqlalchemy/engine/default.py
+lib/sqlalchemy/engine/strategies.py
+lib/sqlalchemy/engine/threadlocal.py
+lib/sqlalchemy/engine/url.py
+lib/sqlalchemy/ext/__init__.py
+lib/sqlalchemy/ext/associationproxy.py
+lib/sqlalchemy/ext/compiler.py
+lib/sqlalchemy/ext/declarative.py
+lib/sqlalchemy/ext/orderinglist.py
+lib/sqlalchemy/ext/serializer.py
+lib/sqlalchemy/ext/sqlsoup.py
+lib/sqlalchemy/orm/__init__.py
+lib/sqlalchemy/orm/attributes.py
+lib/sqlalchemy/orm/collections.py
+lib/sqlalchemy/orm/dependency.py
+lib/sqlalchemy/orm/dynamic.py
+lib/sqlalchemy/orm/evaluator.py
+lib/sqlalchemy/orm/exc.py
+lib/sqlalchemy/orm/identity.py
+lib/sqlalchemy/orm/interfaces.py
+lib/sqlalchemy/orm/mapper.py
+lib/sqlalchemy/orm/properties.py
+lib/sqlalchemy/orm/query.py
+lib/sqlalchemy/orm/scoping.py
+lib/sqlalchemy/orm/session.py
+lib/sqlalchemy/orm/shard.py
+lib/sqlalchemy/orm/state.py
+lib/sqlalchemy/orm/strategies.py
+lib/sqlalchemy/orm/sync.py
+lib/sqlalchemy/orm/unitofwork.py
+lib/sqlalchemy/orm/uowdumper.py
+lib/sqlalchemy/orm/util.py
+lib/sqlalchemy/sql/__init__.py
+lib/sqlalchemy/sql/compiler.py
+lib/sqlalchemy/sql/expression.py
+lib/sqlalchemy/sql/functions.py
+lib/sqlalchemy/sql/operators.py
+lib/sqlalchemy/sql/util.py
+lib/sqlalchemy/sql/visitors.py
+lib/sqlalchemy/test/__init__.py
+lib/sqlalchemy/test/assertsql.py
+lib/sqlalchemy/test/config.py
+lib/sqlalchemy/test/engines.py
+lib/sqlalchemy/test/noseplugin.py
+lib/sqlalchemy/test/orm.py
+lib/sqlalchemy/test/pickleable.py
+lib/sqlalchemy/test/profiling.py
+lib/sqlalchemy/test/requires.py
+lib/sqlalchemy/test/schema.py
+lib/sqlalchemy/test/testing.py
+test/__init__.py
+test/binary_data_one.dat
+test/binary_data_two.dat
+test/aaa_profiling/__init__.py
+test/aaa_profiling/test_compiler.py
+test/aaa_profiling/test_memusage.py
+test/aaa_profiling/test_pool.py
+test/aaa_profiling/test_zoomark.py
+test/aaa_profiling/test_zoomark_orm.py
+test/base/__init__.py
+test/base/test_dependency.py
+test/base/test_except.py
+test/base/test_utils.py
+test/dialect/__init__.py
+test/dialect/test_access.py
+test/dialect/test_firebird.py
+test/dialect/test_informix.py
+test/dialect/test_maxdb.py
+test/dialect/test_mssql.py
+test/dialect/test_mysql.py
+test/dialect/test_oracle.py
+test/dialect/test_postgres.py
+test/dialect/test_sqlite.py
+test/dialect/test_sybase.py
+test/engine/__init__.py
+test/engine/_base.py
+test/engine/test_bind.py
+test/engine/test_ddlevents.py
+test/engine/test_execute.py
+test/engine/test_metadata.py
+test/engine/test_parseconnect.py
+test/engine/test_pool.py
+test/engine/test_reconnect.py
+test/engine/test_reflection.py
+test/engine/test_transaction.py
+test/ex/__init__.py
+test/ex/test_examples.py
+test/ext/__init__.py
+test/ext/test_associationproxy.py
+test/ext/test_compiler.py
+test/ext/test_declarative.py
+test/ext/test_orderinglist.py
+test/ext/test_serializer.py
+test/orm/__init__.py
+test/orm/_base.py
+test/orm/_fixtures.py
+test/orm/test_association.py
+test/orm/test_assorted_eager.py
+test/orm/test_attributes.py
+test/orm/test_backref_mutations.py
+test/orm/test_bind.py
+test/orm/test_cascade.py
+test/orm/test_collection.py
+test/orm/test_compile.py
+test/orm/test_cycles.py
+test/orm/test_defaults.py
+test/orm/test_deprecations.py
+test/orm/test_dynamic.py
+test/orm/test_eager_relations.py
+test/orm/test_evaluator.py
+test/orm/test_expire.py
+test/orm/test_extendedattr.py
+test/orm/test_generative.py
+test/orm/test_instrumentation.py
+test/orm/test_lazy_relations.py
+test/orm/test_lazytest1.py
+test/orm/test_manytomany.py
+test/orm/test_mapper.py
+test/orm/test_merge.py
+test/orm/test_naturalpks.py
+test/orm/test_onetoone.py
+test/orm/test_pickled.py
+test/orm/test_query.py
+test/orm/test_relationships.py
+test/orm/test_scoping.py
+test/orm/test_selectable.py
+test/orm/test_session.py
+test/orm/test_transaction.py
+test/orm/test_unitofwork.py
+test/orm/test_utils.py
+test/orm/inheritance/__init__.py
+test/orm/inheritance/test_abc_inheritance.py
+test/orm/inheritance/test_abc_polymorphic.py
+test/orm/inheritance/test_basic.py
+test/orm/inheritance/test_concrete.py
+test/orm/inheritance/test_magazine.py
+test/orm/inheritance/test_manytomany.py
+test/orm/inheritance/test_poly_linked_list.py
+test/orm/inheritance/test_polymorph.py
+test/orm/inheritance/test_polymorph2.py
+test/orm/inheritance/test_productspec.py
+test/orm/inheritance/test_query.py
+test/orm/inheritance/test_selects.py
+test/orm/inheritance/test_single.py
+test/orm/sharding/__init__.py
+test/orm/sharding/test_shard.py
+test/perf/cascade_speed.py
+test/perf/insertspeed.py
+test/perf/masscreate.py
+test/perf/masscreate2.py
+test/perf/masseagerload.py
+test/perf/massload.py
+test/perf/massload2.py
+test/perf/masssave.py
+test/perf/objselectspeed.py
+test/perf/objupdatespeed.py
+test/perf/ormsession.py
+test/perf/poolload.py
+test/perf/sessions.py
+test/perf/threaded_compile.py
+test/perf/wsgi.py
+test/sql/__init__.py
+test/sql/_base.py
+test/sql/test_case_statement.py
+test/sql/test_columns.py
+test/sql/test_constraints.py
+test/sql/test_defaults.py
+test/sql/test_functions.py
+test/sql/test_generative.py
+test/sql/test_labels.py
+test/sql/test_query.py
+test/sql/test_quote.py
+test/sql/test_rowcount.py
+test/sql/test_select.py
+test/sql/test_selectable.py
+test/sql/test_types.py
+test/sql/test_unicode.py
+test/zblog/__init__.py
+test/zblog/blog.py
+test/zblog/mappers.py
+test/zblog/tables.py
+test/zblog/test_zblog.py
+test/zblog/user.py
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/EGG-INFO/top_level.txt
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/EGG-INFO/top_level.txt (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/EGG-INFO/top_level.txt (revision 3)
@@ -0,0 +1,1 @@
+sqlalchemy
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/EGG-INFO/PKG-INFO
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/EGG-INFO/PKG-INFO (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/EGG-INFO/PKG-INFO (revision 3)
@@ -0,0 +1,43 @@
+Metadata-Version: 1.0
+Name: SQLAlchemy
+Version: 0.5.6-dev-r6498
+Summary: Database Abstraction Library
+Home-page: http://www.sqlalchemy.org
+Author: Mike Bayer
+Author-email: mike_mp@zzzcomputing.com
+License: MIT License
+Description: SQLAlchemy is:
+        
+        * The Python SQL toolkit and Object Relational Mapper that gives application developers the full power and flexibility of SQL. SQLAlchemy provides a full suite of well known enterprise-level persistence patterns, designed for efficient and high-performing database access, adapted into a simple and Pythonic domain language.
+        * extremely easy to use for all the basic tasks, such as: accessing pooled connections, constructing SQL from Python expressions, finding object instances, and commiting object modifications back to the database.
+        * powerful enough for complicated tasks, such as: eager load a graph of objects and their dependencies via joins; map recursive adjacency structures automatically; map objects to not just tables but to any arbitrary join or select statement; combine multiple tables together to load whole sets of otherwise unrelated objects from a single result set; commit entire graphs of object changes in one step.
+        * built to conform to what DBAs demand, including the ability to swap out generated SQL with hand-optimized statements, full usage of bind parameters for all literal values, fully transactionalized and consistent updates using Unit of Work.
+        * modular. Different parts of SQLAlchemy can be used independently of the rest, including the connection pool, SQL construction, and ORM. SQLAlchemy is constructed in an open style that allows plenty of customization, with an architecture that supports custom datatypes, custom SQL extensions, and ORM plugins which can augment or extend mapping functionality.
+        
+        SQLAlchemy's Philosophy:
+        
+        * SQL databases behave less and less like object collections the more size and performance start to matter; object collections behave less and less like tables and rows the more abstraction starts to matter. SQLAlchemy aims to accomodate both of these principles.
+        * Your classes aren't tables, and your objects aren't rows. Databases aren't just collections of tables; they're relational algebra engines. You don't have to select from just tables, you can select from joins, subqueries, and unions. Database and domain concepts should be visibly decoupled from the beginning, allowing both sides to develop to their full potential.
+        * For example, table metadata (objects that describe tables) are declared distinctly from the classes theyre designed to store. That way database relationship concepts don't interfere with your object design concepts, and vice-versa; the transition from table-mapping to selectable-mapping is seamless; a class can be mapped against the database in more than one way. SQLAlchemy provides a powerful mapping layer that can work as automatically or as manually as you choose, determining relationships based on foreign keys or letting you define the join conditions explicitly, to bridge the gap between database and domain.
+        
+        SQLAlchemy's Advantages:
+        
+        * The Unit Of Work system organizes pending CRUD operations into queues and commits them all in one batch. It then performs a topological "dependency sort" of all items to be committed and deleted and groups redundant statements together. This produces the maxiumum efficiency and transaction safety, and minimizes chances of deadlocks. Modeled after Fowler's "Unit of Work" pattern as well as Java Hibernate.
+        * Function-based query construction allows boolean expressions, operators, functions, table aliases, selectable subqueries, create/update/insert/delete queries, correlated updates, correlated EXISTS clauses, UNION clauses, inner and outer joins, bind parameters, free mixing of literal text within expressions, as little or as much as desired. Query-compilation is vendor-specific; the same query object can be compiled into any number of resulting SQL strings depending on its compilation algorithm.
+        * Database mapping and class design are totally separate. Persisted objects have no subclassing requirement (other than 'object') and are POPO's : plain old Python objects. They retain serializability (pickling) for usage in various caching systems and session objects. SQLAlchemy "decorates" classes with non-intrusive property accessors to automatically log object creates and modifications with the UnitOfWork engine, to lazyload related data, as well as to track attribute change histories.
+        * Custom list classes can be used with eagerly or lazily loaded child object lists, allowing rich relationships to be created on the fly as SQLAlchemy appends child objects to an object attribute.
+        * Composite (multiple-column) primary keys are supported, as are "association" objects that represent the middle of a "many-to-many" relationship.
+        * Self-referential tables and mappers are supported. Adjacency list structures can be created, saved, and deleted with proper cascading, with no extra programming.
+        * Data mapping can be used in a row-based manner. Any bizarre hyper-optimized query that you or your DBA can cook up, you can run in SQLAlchemy, and as long as it returns the expected columns within a rowset, you can get your objects from it. For a rowset that contains more than one kind of object per row, multiple mappers can be chained together to return multiple object instance lists from a single database round trip.
+        * The type system allows pre- and post- processing of data, both at the bind parameter and the result set level. User-defined types can be freely mixed with built-in types. Generic types as well as SQL-specific types are available.
+        
+        SVN version:
+        <http://svn.sqlalchemy.org/sqlalchemy/trunk#egg=SQLAlchemy-dev>
+        
+        
+Platform: UNKNOWN
+Classifier: Development Status :: 4 - Beta
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: MIT License
+Classifier: Programming Language :: Python
+Classifier: Topic :: Database :: Front-Ends
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/EGG-INFO/entry_points.txt
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/EGG-INFO/entry_points.txt (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/EGG-INFO/entry_points.txt (revision 3)
@@ -0,0 +1,3 @@
+[nose.plugins.0.10]
+sqlalchemy = sqlalchemy.test.noseplugin:NoseSQLAlchemy
+
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/EGG-INFO/dependency_links.txt
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/EGG-INFO/dependency_links.txt (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/EGG-INFO/dependency_links.txt (revision 3)
@@ -0,0 +1,1 @@
+
Index: /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/EGG-INFO/not-zip-safe
===================================================================
--- /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/EGG-INFO/not-zip-safe (revision 3)
+++ /galaxy-central/eggs/SQLAlchemy-0.5.6_dev_r6498-py2.6.egg/EGG-INFO/not-zip-safe (revision 3)
@@ -0,0 +1,1 @@
+
Index: /galaxy-central/eggs/decorator-3.1.2-py2.6.egg/decorator.py
===================================================================
--- /galaxy-central/eggs/decorator-3.1.2-py2.6.egg/decorator.py (revision 3)
+++ /galaxy-central/eggs/decorator-3.1.2-py2.6.egg/decorator.py (revision 3)
@@ -0,0 +1,253 @@
+##########################     LICENCE     ###############################
+##
+##   Copyright (c) 2005, Michele Simionato
+##   All rights reserved.
+##
+##   Redistributions of source code must retain the above copyright 
+##   notice, this list of conditions and the following disclaimer.
+##   Redistributions in bytecode form must reproduce the above copyright
+##   notice, this list of conditions and the following disclaimer in
+##   the documentation and/or other materials provided with the
+##   distribution. 
+
+##   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+##   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+##   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+##   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+##   HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+##   INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+##   BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+##   OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+##   ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
+##   TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+##   USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+##   DAMAGE.
+
+"""
+Decorator module, see http://pypi.python.org/pypi/decorator
+for the documentation.
+"""
+
+__all__ = ["decorator", "FunctionMaker", "partial",
+           "deprecated", "getinfo", "new_wrapper"]
+
+import os, sys, re, inspect, string, warnings
+try:
+    from functools import partial
+except ImportError: # for Python version < 2.5
+    class partial(object):
+        "A simple replacement of functools.partial"
+        def __init__(self, func, *args, **kw):
+            self.func = func
+            self.args = args                
+            self.keywords = kw
+        def __call__(self, *otherargs, **otherkw):
+            kw = self.keywords.copy()
+            kw.update(otherkw)
+            return self.func(*(self.args + otherargs), **kw)
+
+DEF = re.compile('\s*def\s*([_\w][_\w\d]*)\s*\(')
+
+# basic functionality
+class FunctionMaker(object):
+    """
+    An object with the ability to create functions with a given signature.
+    It has attributes name, doc, module, signature, defaults, dict and
+    methods update and make.
+    """
+    def __init__(self, func=None, name=None, signature=None,
+                 defaults=None, doc=None, module=None, funcdict=None):
+        if func:
+            # func can be a class or a callable, but not an instance method
+            self.name = func.__name__
+            if self.name == '<lambda>': # small hack for lambda functions
+                self.name = '_lambda_' 
+            self.doc = func.__doc__
+            self.module = func.__module__
+            if inspect.isfunction(func):
+                argspec = inspect.getargspec(func)
+                self.args, self.varargs, self.keywords, self.defaults = argspec
+                for i, arg in enumerate(self.args):
+                    setattr(self, 'arg%d' % i, arg)
+                self.signature = inspect.formatargspec(
+                    formatvalue=lambda val: "", *argspec)[1:-1]
+                self.dict = func.__dict__.copy()
+        if name:
+            self.name = name
+        if signature is not None:
+            self.signature = signature
+        if defaults:
+            self.defaults = defaults
+        if doc:
+            self.doc = doc
+        if module:
+            self.module = module
+        if funcdict:
+            self.dict = funcdict
+        # check existence required attributes
+        assert hasattr(self, 'name')
+        if not hasattr(self, 'signature'):
+            raise TypeError('You are decorating a non function: %s' % func)
+
+    def update(self, func, **kw):
+        "Update the signature of func with the data in self"
+        func.__name__ = self.name
+        func.__doc__ = getattr(self, 'doc', None)
+        func.__dict__ = getattr(self, 'dict', {})
+        func.func_defaults = getattr(self, 'defaults', ())
+        callermodule = sys._getframe(3).f_globals.get('__name__', '?')
+        func.__module__ = getattr(self, 'module', callermodule)
+        func.__dict__.update(kw)
+
+    def make(self, src_templ, evaldict=None, addsource=False, **attrs):
+        "Make a new function from a given template and update the signature"
+        src = src_templ % vars(self) # expand name and signature
+        evaldict = evaldict or {}
+        mo = DEF.match(src)
+        if mo is None:
+            raise SyntaxError('not a valid function template\n%s' % src)
+        name = mo.group(1) # extract the function name
+        reserved_names = set([name] + [
+            arg.strip(' *') for arg in self.signature.split(',')])
+        for n, v in evaldict.iteritems():
+            if n in reserved_names:
+                raise NameError('%s is overridden in\n%s' % (n, src))
+        if not src.endswith('\n'): # add a newline just for safety
+            src += '\n'
+        try:
+            code = compile(src, '<string>', 'single')
+            exec code in evaldict
+        except:
+            print >> sys.stderr, 'Error in generated code:'
+            print >> sys.stderr, src
+            raise
+        func = evaldict[name]
+        if addsource:
+            attrs['__source__'] = src
+        self.update(func, **attrs)
+        return func
+
+    @classmethod
+    def create(cls, obj, body, evaldict, defaults=None,
+               doc=None, module=None, addsource=True,**attrs):
+        """
+        Create a function from the strings name, signature and body.
+        evaldict is the evaluation dictionary. If addsource is true an attribute
+        __source__ is added to the result. The attributes attrs are added,
+        if any.
+        """
+        if isinstance(obj, str): # "name(signature)"
+            name, rest = obj.strip().split('(', 1)
+            signature = rest[:-1] #strip a right parens            
+            func = None
+        else: # a function
+            name = None
+            signature = None
+            func = obj
+        fun = cls(func, name, signature, defaults, doc, module)
+        ibody = '\n'.join('    ' + line for line in body.splitlines())
+        return fun.make('def %(name)s(%(signature)s):\n' + ibody, 
+                        evaldict, addsource, **attrs)
+  
+def decorator(caller, func=None):
+    """
+    decorator(caller) converts a caller function into a decorator;
+    decorator(caller, func) decorates a function using a caller.
+    """
+    if func is not None: # returns a decorated function
+        return FunctionMaker.create(
+            func, "return _call_(_func_, %(signature)s)",
+            dict(_call_=caller, _func_=func), undecorated=func)
+    else: # returns a decorator
+        if isinstance(caller, partial):
+            return partial(decorator, caller)
+        # otherwise assume caller is a function
+        f = inspect.getargspec(caller)[0][0] # first arg
+        return FunctionMaker.create(
+            '%s(%s)' % (caller.__name__, f), 
+            'return decorator(_call_, %s)' % f,
+            dict(_call_=caller, decorator=decorator), undecorated=caller,
+            doc=caller.__doc__, module=caller.__module__)
+
+###################### deprecated functionality #########################
+
+@decorator
+def deprecated(func, *args, **kw):
+    "A decorator for deprecated functions"
+    warnings.warn(
+        ('Calling the deprecated function %r\n'
+         'Downgrade to decorator 2.3 if you want to use this functionality')
+        % func.__name__, DeprecationWarning, stacklevel=3)
+    return func(*args, **kw)
+
+@deprecated
+def getinfo(func):
+    """
+    Returns an info dictionary containing:
+    - name (the name of the function : str)
+    - argnames (the names of the arguments : list)
+    - defaults (the values of the default arguments : tuple)
+    - signature (the signature : str)
+    - doc (the docstring : str)
+    - module (the module name : str)
+    - dict (the function __dict__ : str)
+    
+    >>> def f(self, x=1, y=2, *args, **kw): pass
+
+    >>> info = getinfo(f)
+
+    >>> info["name"]
+    'f'
+    >>> info["argnames"]
+    ['self', 'x', 'y', 'args', 'kw']
+    
+    >>> info["defaults"]
+    (1, 2)
+
+    >>> info["signature"]
+    'self, x, y, *args, **kw'
+    """
+    assert inspect.ismethod(func) or inspect.isfunction(func)
+    regargs, varargs, varkwargs, defaults = inspect.getargspec(func)
+    argnames = list(regargs)
+    if varargs:
+        argnames.append(varargs)
+    if varkwargs:
+        argnames.append(varkwargs)
+    signature = inspect.formatargspec(regargs, varargs, varkwargs, defaults,
+                                      formatvalue=lambda value: "")[1:-1]
+    return dict(name=func.__name__, argnames=argnames, signature=signature,
+                defaults = func.func_defaults, doc=func.__doc__,
+                module=func.__module__, dict=func.__dict__,
+                globals=func.func_globals, closure=func.func_closure)
+
+@deprecated
+def update_wrapper(wrapper, model, infodict=None):
+    "A replacement for functools.update_wrapper"
+    infodict = infodict or getinfo(model)
+    wrapper.__name__ = infodict['name']
+    wrapper.__doc__ = infodict['doc']
+    wrapper.__module__ = infodict['module']
+    wrapper.__dict__.update(infodict['dict'])
+    wrapper.func_defaults = infodict['defaults']
+    wrapper.undecorated = model
+    return wrapper
+
+@deprecated
+def new_wrapper(wrapper, model):
+    """
+    An improvement over functools.update_wrapper. The wrapper is a generic
+    callable object. It works by generating a copy of the wrapper with the 
+    right signature and by updating the copy, not the original.
+    Moreovoer, 'model' can be a dictionary with keys 'name', 'doc', 'module',
+    'dict', 'defaults'.
+    """
+    if isinstance(model, dict):
+        infodict = model
+    else: # assume model is a function
+        infodict = getinfo(model)
+    assert not '_wrapper_' in infodict["argnames"], (
+        '"_wrapper_" is a reserved argument name!')
+    src = "lambda %(signature)s: _wrapper_(%(signature)s)" % infodict
+    funcopy = eval(src, dict(_wrapper_=wrapper))
+    return update_wrapper(funcopy, model, infodict)
Index: /galaxy-central/eggs/decorator-3.1.2-py2.6.egg/EGG-INFO/SOURCES.txt
===================================================================
--- /galaxy-central/eggs/decorator-3.1.2-py2.6.egg/EGG-INFO/SOURCES.txt (revision 3)
+++ /galaxy-central/eggs/decorator-3.1.2-py2.6.egg/EGG-INFO/SOURCES.txt (revision 3)
@@ -0,0 +1,16 @@
+CHANGES.txt
+MANIFEST.in
+README.txt
+decorator.py
+documentation.html
+documentation.pdf
+documentation.py
+performance.sh
+scramble.py
+setup.cfg
+setup.py
+decorator.egg-info/PKG-INFO
+decorator.egg-info/SOURCES.txt
+decorator.egg-info/dependency_links.txt
+decorator.egg-info/not-zip-safe
+decorator.egg-info/top_level.txt
Index: /galaxy-central/eggs/decorator-3.1.2-py2.6.egg/EGG-INFO/top_level.txt
===================================================================
--- /galaxy-central/eggs/decorator-3.1.2-py2.6.egg/EGG-INFO/top_level.txt (revision 3)
+++ /galaxy-central/eggs/decorator-3.1.2-py2.6.egg/EGG-INFO/top_level.txt (revision 3)
@@ -0,0 +1,1 @@
+decorator
Index: /galaxy-central/eggs/decorator-3.1.2-py2.6.egg/EGG-INFO/PKG-INFO
===================================================================
--- /galaxy-central/eggs/decorator-3.1.2-py2.6.egg/EGG-INFO/PKG-INFO (revision 3)
+++ /galaxy-central/eggs/decorator-3.1.2-py2.6.egg/EGG-INFO/PKG-INFO (revision 3)
@@ -0,0 +1,19 @@
+Metadata-Version: 1.0
+Name: decorator
+Version: 3.1.2
+Summary: Better living through Python with decorators
+Home-page: http://pypi.python.org/pypi/decorator
+Author: Michele Simionato
+Author-email: michele.simionato@gmail.com
+License: BSD License
+Description: </pre><pre>
+Keywords: decorators generic utility
+Platform: All
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: BSD License
+Classifier: Natural Language :: English
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python
+Classifier: Topic :: Software Development :: Libraries
+Classifier: Topic :: Utilities
Index: /galaxy-central/eggs/decorator-3.1.2-py2.6.egg/EGG-INFO/dependency_links.txt
===================================================================
--- /galaxy-central/eggs/decorator-3.1.2-py2.6.egg/EGG-INFO/dependency_links.txt (revision 3)
+++ /galaxy-central/eggs/decorator-3.1.2-py2.6.egg/EGG-INFO/dependency_links.txt (revision 3)
@@ -0,0 +1,1 @@
+
Index: /galaxy-central/eggs/decorator-3.1.2-py2.6.egg/EGG-INFO/not-zip-safe
===================================================================
--- /galaxy-central/eggs/decorator-3.1.2-py2.6.egg/EGG-INFO/not-zip-safe (revision 3)
+++ /galaxy-central/eggs/decorator-3.1.2-py2.6.egg/EGG-INFO/not-zip-safe (revision 3)
@@ -0,0 +1,1 @@
+
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx_extras/pstat.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx_extras/pstat.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx_extras/pstat.py (revision 3)
@@ -0,0 +1,1066 @@
+# Copyright (c) 1999-2000 Gary Strangman; All Rights Reserved.
+#
+# This software is distributable under the terms of the GNU
+# General Public License (GPL) v2, the text of which can be found at
+# http://www.gnu.org/copyleft/gpl.html. Installing, importing or otherwise
+# using this module constitutes acceptance of the terms of this License.
+#
+# Disclaimer
+# 
+# This software is provided "as-is".  There are no expressed or implied
+# warranties of any kind, including, but not limited to, the warranties
+# of merchantability and fittness for a given application.  In no event
+# shall Gary Strangman be liable for any direct, indirect, incidental,
+# special, exemplary or consequential damages (including, but not limited
+# to, loss of use, data or profits, or business interruption) however
+# caused and on any theory of liability, whether in contract, strict
+# liability or tort (including negligence or otherwise) arising in any way
+# out of the use of this software, even if advised of the possibility of
+# such damage.
+#
+# Comments and/or additions are welcome (send e-mail to:
+# strang@nmr.mgh.harvard.edu).
+# 
+"""
+pstat.py module
+
+#################################################
+#######  Written by:  Gary Strangman  ###########
+#######  Last modified:  Jun 29, 2001 ###########
+#################################################
+
+This module provides some useful list and array manipulation routines
+modeled after those found in the |Stat package by Gary Perlman, plus a
+number of other useful list/file manipulation functions.  The list-based
+functions include:
+
+      abut (source,*args)
+      simpleabut (source, addon)
+      colex (listoflists,cnums)
+      collapse (listoflists,keepcols,collapsecols,fcn1=None,fcn2=None,cfcn=None)
+      dm (listoflists,criterion)
+      flat (l)
+      linexand (listoflists,columnlist,valuelist)
+      linexor (listoflists,columnlist,valuelist)
+      linedelimited (inlist,delimiter)
+      lineincols (inlist,colsize) 
+      lineincustcols (inlist,colsizes)
+      list2string (inlist)
+      makelol(inlist)
+      makestr(x)
+      printcc (lst,extra=2)
+      printincols (listoflists,colsize)
+      pl (listoflists)
+      printl(listoflists)
+      replace (lst,oldval,newval)
+      recode (inlist,listmap,cols='all')
+      remap (listoflists,criterion)
+      roundlist (inlist,num_digits_to_round_floats_to)
+      sortby(listoflists,sortcols)
+      unique (inlist)
+      duplicates(inlist)
+      writedelimited (listoflists, delimiter, file, writetype='w')
+
+Some of these functions have alternate versions which are defined only if
+Numeric (NumPy) can be imported.  These functions are generally named as
+above, with an 'a' prefix.
+
+      aabut (source, *args)
+      acolex (a,indices,axis=1)
+      acollapse (a,keepcols,collapsecols,sterr=0,ns=0)
+      adm (a,criterion)
+      alinexand (a,columnlist,valuelist)
+      alinexor (a,columnlist,valuelist)
+      areplace (a,oldval,newval)
+      arecode (a,listmap,col='all')
+      arowcompare (row1, row2)
+      arowsame (row1, row2)
+      asortrows(a,axis=0)
+      aunique(inarray)
+      aduplicates(inarray)
+
+Currently, the code is all but completely un-optimized.  In many cases, the
+array versions of functions amount simply to aliases to built-in array
+functions/methods.  Their inclusion here is for function name consistency.
+"""
+
+## CHANGE LOG:
+## ==========
+## 01-11-15 ... changed list2string() to accept a delimiter
+## 01-06-29 ... converted exec()'s to eval()'s to make compatible with Py2.1
+## 01-05-31 ... added duplicates() and aduplicates() functions
+## 00-12-28 ... license made GPL, docstring and import requirements
+## 99-11-01 ... changed version to 0.3
+## 99-08-30 ... removed get, getstrings, put, aget, aput (into io.py)
+## 03/27/99 ... added areplace function, made replace fcn recursive
+## 12/31/98 ... added writefc function for ouput to fixed column sizes
+## 12/07/98 ... fixed import problem (failed on collapse() fcn)
+##              added __version__ variable (now 0.2)
+## 12/05/98 ... updated doc-strings
+##              added features to collapse() function
+##              added flat() function for lists
+##              fixed a broken asortrows() 
+## 11/16/98 ... fixed minor bug in aput for 1D arrays
+##
+## 11/08/98 ... fixed aput to output large arrays correctly
+
+import stats  # required 3rd party module
+import string, copy
+from types import *
+
+__version__ = 0.4
+
+###===========================  LIST FUNCTIONS  ==========================
+###
+### Here are the list functions, DEFINED FOR ALL SYSTEMS.
+### Array functions (for NumPy-enabled computers) appear below.
+###
+
+def abut (source,*args):
+    """
+Like the |Stat abut command.  It concatenates two lists side-by-side
+and returns the result.  '2D' lists are also accomodated for either argument
+(source or addon).  CAUTION:  If one list is shorter, it will be repeated
+until it is as long as the longest list.  If this behavior is not desired,
+use pstat.simpleabut().
+
+Usage:   abut(source, args)   where args=any # of lists
+Returns: a list of lists as long as the LONGEST list past, source on the
+         'left', lists in <args> attached consecutively on the 'right'
+"""
+
+    if type(source) not in [ListType,TupleType]:
+        source = [source]
+    for addon in args:
+        if type(addon) not in [ListType,TupleType]:
+            addon = [addon]
+        if len(addon) < len(source):                # is source list longer?
+            if len(source) % len(addon) == 0:        # are they integer multiples?
+                repeats = len(source)/len(addon)    # repeat addon n times
+                origadd = copy.deepcopy(addon)
+                for i in range(repeats-1):
+                    addon = addon + origadd
+            else:
+                repeats = len(source)/len(addon)+1  # repeat addon x times,
+                origadd = copy.deepcopy(addon)      #    x is NOT an integer
+                for i in range(repeats-1):
+                    addon = addon + origadd
+                    addon = addon[0:len(source)]
+        elif len(source) < len(addon):                # is addon list longer?
+            if len(addon) % len(source) == 0:        # are they integer multiples?
+                repeats = len(addon)/len(source)    # repeat source n times
+                origsour = copy.deepcopy(source)
+                for i in range(repeats-1):
+                    source = source + origsour
+            else:
+                repeats = len(addon)/len(source)+1  # repeat source x times,
+                origsour = copy.deepcopy(source)    #   x is NOT an integer
+                for i in range(repeats-1):
+                    source = source + origsour
+                source = source[0:len(addon)]
+
+        source = simpleabut(source,addon)
+    return source
+
+
+def simpleabut (source, addon):
+    """
+Concatenates two lists as columns and returns the result.  '2D' lists
+are also accomodated for either argument (source or addon).  This DOES NOT
+repeat either list to make the 2 lists of equal length.  Beware of list pairs
+with different lengths ... the resulting list will be the length of the
+FIRST list passed.
+
+Usage:   simpleabut(source,addon)  where source, addon=list (or list-of-lists)
+Returns: a list of lists as long as source, with source on the 'left' and
+                 addon on the 'right'
+"""
+    if type(source) not in [ListType,TupleType]:
+        source = [source]
+    if type(addon) not in [ListType,TupleType]:
+        addon = [addon]
+    minlen = min(len(source),len(addon))
+    list = copy.deepcopy(source)                # start abut process
+    if type(source[0]) not in [ListType,TupleType]:
+        if type(addon[0]) not in [ListType,TupleType]:
+            for i in range(minlen):
+                list[i] = [source[i]] + [addon[i]]        # source/addon = column
+        else:
+            for i in range(minlen):
+                list[i] = [source[i]] + addon[i]        # addon=list-of-lists
+    else:
+        if type(addon[0]) not in [ListType,TupleType]:
+            for i in range(minlen):
+                list[i] = source[i] + [addon[i]]        # source=list-of-lists
+        else:
+            for i in range(minlen):
+                list[i] = source[i] + addon[i]        # source/addon = list-of-lists
+    source = list
+    return source
+
+
+def colex (listoflists,cnums):
+    """
+Extracts from listoflists the columns specified in the list 'cnums'
+(cnums can be an integer, a sequence of integers, or a string-expression that
+corresponds to a slice operation on the variable x ... e.g., 'x[3:]' will colex
+columns 3 onward from the listoflists).
+
+Usage:   colex (listoflists,cnums)
+Returns: a list-of-lists corresponding to the columns from listoflists
+         specified by cnums, in the order the column numbers appear in cnums
+"""
+    global index
+    column = 0
+    if type(cnums) in [ListType,TupleType]:   # if multiple columns to get
+        index = cnums[0]
+        column = map(lambda x: x[index], listoflists)
+        for col in cnums[1:]:
+            index = col
+            column = abut(column,map(lambda x: x[index], listoflists))
+    elif type(cnums) == StringType:              # if an 'x[3:]' type expr.
+        evalstring = 'map(lambda x: x'+cnums+', listoflists)'
+        column = eval(evalstring)
+    else:                                     # else it's just 1 col to get
+        index = cnums
+        column = map(lambda x: x[index], listoflists)
+    return column
+
+
+def collapse (listoflists,keepcols,collapsecols,fcn1=None,fcn2=None,cfcn=None):
+     """
+Averages data in collapsecol, keeping all unique items in keepcols
+(using unique, which keeps unique LISTS of column numbers), retaining the
+unique sets of values in keepcols, the mean for each.  Setting fcn1
+and/or fcn2 to point to a function rather than None (e.g., stats.sterr, len)
+will append those results (e.g., the sterr, N) after each calculated mean.
+cfcn is the collapse function to apply (defaults to mean, defined here in the
+pstat module to avoid circular imports with stats.py, but harmonicmean or
+others could be passed).
+
+Usage:    collapse (listoflists,keepcols,collapsecols,fcn1=None,fcn2=None,cfcn=None)
+Returns: a list of lists with all unique permutations of entries appearing in
+     columns ("conditions") specified by keepcols, abutted with the result of
+     cfcn (if cfcn=None, defaults to the mean) of each column specified by
+     collapsecols.
+"""
+     def collmean (inlist):
+         s = 0
+         for item in inlist:
+             s = s + item
+         return s/float(len(inlist))
+
+     if type(keepcols) not in [ListType,TupleType]:
+         keepcols = [keepcols]
+     if type(collapsecols) not in [ListType,TupleType]:
+         collapsecols = [collapsecols]
+     if cfcn == None:
+         cfcn = collmean
+     if keepcols == []:
+         means = [0]*len(collapsecols)
+         for i in range(len(collapsecols)):
+             avgcol = colex(listoflists,collapsecols[i])
+             means[i] = cfcn(avgcol)
+             if fcn1:
+                 try:
+                     test = fcn1(avgcol)
+                 except:
+                     test = 'N/A'
+                     means[i] = [means[i], test]
+             if fcn2:
+                 try:
+                     test = fcn2(avgcol)
+                 except:
+                     test = 'N/A'
+                 try:
+                     means[i] = means[i] + [len(avgcol)]
+                 except TypeError:
+                     means[i] = [means[i],len(avgcol)]
+         return means
+     else:
+         values = colex(listoflists,keepcols)
+         uniques = unique(values)
+         uniques.sort()
+         newlist = []
+         if type(keepcols) not in [ListType,TupleType]:  keepcols = [keepcols]
+         for item in uniques:
+             if type(item) not in [ListType,TupleType]:  item =[item]
+             tmprows = linexand(listoflists,keepcols,item)
+             for col in collapsecols:
+                 avgcol = colex(tmprows,col)
+                 item.append(cfcn(avgcol))
+                 if fcn1 <> None:
+                     try:
+                         test = fcn1(avgcol)
+                     except:
+                         test = 'N/A'
+                     item.append(test)
+                 if fcn2 <> None:
+                     try:
+                         test = fcn2(avgcol)
+                     except:
+                         test = 'N/A'
+                     item.append(test)
+                 newlist.append(item)
+         return newlist
+
+
+def dm (listoflists,criterion):
+    """
+Returns rows from the passed list of lists that meet the criteria in
+the passed criterion expression (a string as a function of x; e.g., 'x[3]>=9'
+will return all rows where the 4th column>=9 and "x[2]=='N'" will return rows
+with column 2 equal to the string 'N').
+
+Usage:   dm (listoflists, criterion)
+Returns: rows from listoflists that meet the specified criterion.
+"""
+    function = 'filter(lambda x: '+criterion+',listoflists)'
+    lines = eval(function)
+    return lines
+
+
+def flat(l):
+    """
+Returns the flattened version of a '2D' list.  List-correlate to the a.flat()
+method of NumPy arrays.
+
+Usage:    flat(l)
+"""
+    newl = []
+    for i in range(len(l)):
+        for j in range(len(l[i])):
+            newl.append(l[i][j])
+    return newl
+
+
+def linexand (listoflists,columnlist,valuelist):
+    """
+Returns the rows of a list of lists where col (from columnlist) = val
+(from valuelist) for EVERY pair of values (columnlist[i],valuelists[i]).
+len(columnlist) must equal len(valuelist).
+
+Usage:   linexand (listoflists,columnlist,valuelist)
+Returns: the rows of listoflists where columnlist[i]=valuelist[i] for ALL i
+"""
+    if type(columnlist) not in [ListType,TupleType]:
+        columnlist = [columnlist]
+    if type(valuelist) not in [ListType,TupleType]:
+        valuelist = [valuelist]
+    criterion = ''
+    for i in range(len(columnlist)):
+        if type(valuelist[i])==StringType:
+            critval = '\'' + valuelist[i] + '\''
+        else:
+            critval = str(valuelist[i])
+        criterion = criterion + ' x['+str(columnlist[i])+']=='+critval+' and'
+    criterion = criterion[0:-3]         # remove the "and" after the last crit
+    function = 'filter(lambda x: '+criterion+',listoflists)'
+    lines = eval(function)
+    return lines
+
+
+def linexor (listoflists,columnlist,valuelist):
+    """
+Returns the rows of a list of lists where col (from columnlist) = val
+(from valuelist) for ANY pair of values (colunmlist[i],valuelist[i[).
+One value is required for each column in columnlist.  If only one value
+exists for columnlist but multiple values appear in valuelist, the
+valuelist values are all assumed to pertain to the same column.
+
+Usage:   linexor (listoflists,columnlist,valuelist)
+Returns: the rows of listoflists where columnlist[i]=valuelist[i] for ANY i
+"""
+    if type(columnlist) not in [ListType,TupleType]:
+        columnlist = [columnlist]
+    if type(valuelist) not in [ListType,TupleType]:
+        valuelist = [valuelist]
+    criterion = ''
+    if len(columnlist) == 1 and len(valuelist) > 1:
+        columnlist = columnlist*len(valuelist)
+    for i in range(len(columnlist)):          # build an exec string
+        if type(valuelist[i])==StringType:
+            critval = '\'' + valuelist[i] + '\''
+        else:
+            critval = str(valuelist[i])
+        criterion = criterion + ' x['+str(columnlist[i])+']=='+critval+' or'
+    criterion = criterion[0:-2]         # remove the "or" after the last crit
+    function = 'filter(lambda x: '+criterion+',listoflists)'
+    lines = eval(function)
+    return lines
+
+
+def linedelimited (inlist,delimiter):
+    """
+Returns a string composed of elements in inlist, with each element
+separated by 'delimiter.'  Used by function writedelimited.  Use '\t'
+for tab-delimiting.
+
+Usage:   linedelimited (inlist,delimiter)
+"""
+    outstr = ''
+    for item in inlist:
+        if type(item) <> StringType:
+            item = str(item)
+        outstr = outstr + item + delimiter
+    outstr = outstr[0:-1]
+    return outstr
+
+
+def lineincols (inlist,colsize):
+    """
+Returns a string composed of elements in inlist, with each element
+right-aligned in columns of (fixed) colsize.
+
+Usage:   lineincols (inlist,colsize)   where colsize is an integer
+"""
+    outstr = ''
+    for item in inlist:
+        if type(item) <> StringType:
+            item = str(item)
+        size = len(item)
+        if size <= colsize:
+            for i in range(colsize-size):
+                outstr = outstr + ' '
+            outstr = outstr + item
+        else:
+            outstr = outstr + item[0:colsize+1]
+    return outstr
+
+
+def lineincustcols (inlist,colsizes):
+    """
+Returns a string composed of elements in inlist, with each element
+right-aligned in a column of width specified by a sequence colsizes.  The
+length of colsizes must be greater than or equal to the number of columns
+in inlist.
+
+Usage:   lineincustcols (inlist,colsizes)
+Returns: formatted string created from inlist
+"""
+    outstr = ''
+    for i in range(len(inlist)):
+        if type(inlist[i]) <> StringType:
+            item = str(inlist[i])
+        else:
+            item = inlist[i]
+        size = len(item)
+        if size <= colsizes[i]:
+            for j in range(colsizes[i]-size):
+                outstr = outstr + ' '
+            outstr = outstr + item
+        else:
+            outstr = outstr + item[0:colsizes[i]+1]
+    return outstr
+
+
+def list2string (inlist,delimit=' '):
+    """
+Converts a 1D list to a single long string for file output, using
+the string.join function.
+
+Usage:   list2string (inlist,delimit=' ')
+Returns: the string created from inlist
+"""
+    stringlist = map(makestr,inlist)
+    return string.join(stringlist,delimit)
+
+
+def makelol(inlist):
+    """
+Converts a 1D list to a 2D list (i.e., a list-of-lists).  Useful when you
+want to use put() to write a 1D list one item per line in the file.
+
+Usage:   makelol(inlist)
+Returns: if l = [1,2,'hi'] then returns [[1],[2],['hi']] etc.
+"""
+    x = []
+    for item in inlist:
+        x.append([item])
+    return x
+
+
+def makestr (x):
+    if type(x) <> StringType:
+        x = str(x)
+    return x
+
+
+def printcc (lst,extra=2):
+    """
+Prints a list of lists in columns, customized by the max size of items
+within the columns (max size of items in col, plus 'extra' number of spaces).
+Use 'dashes' or '\\n' in the list-of-lists to print dashes or blank lines,
+respectively.
+
+Usage:   printcc (lst,extra=2)
+Returns: None
+"""
+    if type(lst[0]) not in [ListType,TupleType]:
+        lst = [lst]
+    rowstokill = []
+    list2print = copy.deepcopy(lst)
+    for i in range(len(lst)):
+        if lst[i] == ['\n'] or lst[i]=='\n' or lst[i]=='dashes' or lst[i]=='' or lst[i]==['']:
+            rowstokill = rowstokill + [i]
+    rowstokill.reverse()   # delete blank rows from the end
+    for row in rowstokill:
+        del list2print[row]
+    maxsize = [0]*len(list2print[0])
+    for col in range(len(list2print[0])):
+        items = colex(list2print,col)
+        items = map(makestr,items)
+        maxsize[col] = max(map(len,items)) + extra
+    for row in lst:
+        if row == ['\n'] or row == '\n' or row == '' or row == ['']:
+            print
+        elif row == ['dashes'] or row == 'dashes':
+            dashes = [0]*len(maxsize)
+            for j in range(len(maxsize)):
+                dashes[j] = '-'*(maxsize[j]-2)
+            print lineincustcols(dashes,maxsize)
+        else:
+            print lineincustcols(row,maxsize)
+    return None
+
+
+def printincols (listoflists,colsize):
+    """
+Prints a list of lists in columns of (fixed) colsize width, where
+colsize is an integer.
+
+Usage:   printincols (listoflists,colsize)
+Returns: None
+"""
+    for row in listoflists:
+        print lineincols(row,colsize)
+    return None
+
+
+def pl (listoflists):
+    """
+Prints a list of lists, 1 list (row) at a time.
+
+Usage:   pl(listoflists)
+Returns: None
+"""
+    for row in listoflists:
+        if row[-1] == '\n':
+            print row,
+        else:
+            print row
+    return None
+
+
+def printl(listoflists):
+    """Alias for pl."""
+    pl(listoflists)
+    return
+
+
+def replace (inlst,oldval,newval):
+    """
+Replaces all occurrences of 'oldval' with 'newval', recursively.
+
+Usage:   replace (inlst,oldval,newval)
+"""
+    lst = inlst*1
+    for i in range(len(lst)):
+        if type(lst[i]) not in [ListType,TupleType]:
+            if lst[i]==oldval: lst[i]=newval
+        else:
+            lst[i] = replace(lst[i],oldval,newval)
+    return lst
+
+
+def recode (inlist,listmap,cols=None):
+    """
+Changes the values in a list to a new set of values (useful when
+you need to recode data from (e.g.) strings to numbers.  cols defaults
+to None (meaning all columns are recoded).
+
+Usage:   recode (inlist,listmap,cols=None)  cols=recode cols, listmap=2D list
+Returns: inlist with the appropriate values replaced with new ones
+"""
+    lst = copy.deepcopy(inlist)
+    if cols != None:
+        if type(cols) not in [ListType,TupleType]:
+            cols = [cols]
+        for col in cols:
+            for row in range(len(lst)):
+                try:
+                    idx = colex(listmap,0).index(lst[row][col])
+                    lst[row][col] = listmap[idx][1]
+                except ValueError:
+                    pass
+    else:
+        for row in range(len(lst)):
+            for col in range(len(lst)):
+                try:
+                    idx = colex(listmap,0).index(lst[row][col])
+                    lst[row][col] = listmap[idx][1]
+                except ValueError:
+                    pass
+    return lst
+
+
+def remap (listoflists,criterion):
+    """
+Remaps values in a given column of a 2D list (listoflists).  This requires
+a criterion as a function of 'x' so that the result of the following is
+returned ... map(lambda x: 'criterion',listoflists).  
+
+Usage:   remap(listoflists,criterion)    criterion=string
+Returns: remapped version of listoflists
+"""
+    function = 'map(lambda x: '+criterion+',listoflists)'
+    lines = eval(function)
+    return lines
+
+
+def roundlist (inlist,digits):
+    """
+Goes through each element in a 1D or 2D inlist, and applies the following
+function to all elements of FloatType ... round(element,digits).
+
+Usage:   roundlist(inlist,digits)
+Returns: list with rounded floats
+"""
+    if type(inlist[0]) in [IntType, FloatType]:
+        inlist = [inlist]
+    l = inlist*1
+    for i in range(len(l)):
+        for j in range(len(l[i])):
+            if type(l[i][j])==FloatType:
+                l[i][j] = round(l[i][j],digits)
+    return l
+
+
+def sortby(listoflists,sortcols):
+    """
+Sorts a list of lists on the column(s) specified in the sequence
+sortcols.
+
+Usage:   sortby(listoflists,sortcols)
+Returns: sorted list, unchanged column ordering
+"""
+    newlist = abut(colex(listoflists,sortcols),listoflists)
+    newlist.sort()
+    try:
+        numcols = len(sortcols)
+    except TypeError:
+        numcols = 1
+    crit = '[' + str(numcols) + ':]'
+    newlist = colex(newlist,crit)
+    return newlist
+
+
+def unique (inlist):
+    """
+Returns all unique items in the passed list.  If the a list-of-lists
+is passed, unique LISTS are found (i.e., items in the first dimension are
+compared).
+
+Usage:   unique (inlist)
+Returns: the unique elements (or rows) in inlist
+"""
+    uniques = []
+    for item in inlist:
+        if item not in uniques:
+            uniques.append(item)
+    return uniques
+
+def duplicates(inlist):
+    """
+Returns duplicate items in the FIRST dimension of the passed list.
+
+Usage:   duplicates (inlist)
+"""
+    dups = []
+    for i in range(len(inlist)):
+        if inlist[i] in inlist[i+1:]:
+            dups.append(inlist[i])
+    return dups
+
+
+def nonrepeats(inlist):
+    """
+Returns items that are NOT duplicated in the first dim of the passed list.
+
+Usage:   nonrepeats (inlist)
+"""
+    nonrepeats = []
+    for i in range(len(inlist)):
+        if inlist.count(inlist[i]) == 1:
+            nonrepeats.append(inlist[i])
+    return nonrepeats
+
+
+#===================   PSTAT ARRAY FUNCTIONS  =====================
+#===================   PSTAT ARRAY FUNCTIONS  =====================
+#===================   PSTAT ARRAY FUNCTIONS  =====================
+#===================   PSTAT ARRAY FUNCTIONS  =====================
+#===================   PSTAT ARRAY FUNCTIONS  =====================
+#===================   PSTAT ARRAY FUNCTIONS  =====================
+#===================   PSTAT ARRAY FUNCTIONS  =====================
+#===================   PSTAT ARRAY FUNCTIONS  =====================
+#===================   PSTAT ARRAY FUNCTIONS  =====================
+#===================   PSTAT ARRAY FUNCTIONS  =====================
+#===================   PSTAT ARRAY FUNCTIONS  =====================
+#===================   PSTAT ARRAY FUNCTIONS  =====================
+#===================   PSTAT ARRAY FUNCTIONS  =====================
+#===================   PSTAT ARRAY FUNCTIONS  =====================
+#===================   PSTAT ARRAY FUNCTIONS  =====================
+#===================   PSTAT ARRAY FUNCTIONS  =====================
+
+try:                         # DEFINE THESE *ONLY* IF NUMERIC IS AVAILABLE
+ import Numeric
+ N = Numeric
+
+ def aabut (source, *args):
+    """
+Like the |Stat abut command.  It concatenates two arrays column-wise
+and returns the result.  CAUTION:  If one array is shorter, it will be
+repeated until it is as long as the other.
+
+Usage:   aabut (source, args)    where args=any # of arrays
+Returns: an array as long as the LONGEST array past, source appearing on the
+         'left', arrays in <args> attached on the 'right'.
+"""
+    if len(source.shape)==1:
+        width = 1
+        source = N.resize(source,[source.shape[0],width])
+    else:
+        width = source.shape[1]
+    for addon in args:
+        if len(addon.shape)==1:
+            width = 1
+            addon = N.resize(addon,[source.shape[0],width])
+        else:
+            width = source.shape[1]
+        if len(addon) < len(source):
+            addon = N.resize(addon,[source.shape[0],addon.shape[1]])
+        elif len(source) < len(addon):
+            source = N.resize(source,[addon.shape[0],source.shape[1]])
+        source = N.concatenate((source,addon),1)
+    return source
+
+
+ def acolex (a,indices,axis=1):
+    """
+Extracts specified indices (a list) from passed array, along passed
+axis (column extraction is default).  BEWARE: A 1D array is presumed to be a
+column-array (and that the whole array will be returned as a column).
+
+Usage:   acolex (a,indices,axis=1)
+Returns: the columns of a specified by indices
+"""
+    if type(indices) not in [ListType,TupleType,N.ArrayType]:
+        indices = [indices]
+    if len(N.shape(a)) == 1:
+        cols = N.resize(a,[a.shape[0],1])
+    else:
+        cols = N.take(a,indices,axis)
+    return cols
+
+
+ def acollapse (a,keepcols,collapsecols,fcn1=None,fcn2=None,cfcn=None):
+    """
+Averages data in collapsecol, keeping all unique items in keepcols
+(using unique, which keeps unique LISTS of column numbers), retaining
+the unique sets of values in keepcols, the mean for each.  If stderror or
+N of the mean are desired, set either or both parameters to 1.
+
+Usage:   acollapse (a,keepcols,collapsecols,fcn1=None,fcn2=None,cfcn=None)
+Returns: unique 'conditions' specified by the contents of columns specified
+         by keepcols, abutted with the mean(s) of column(s) specified by
+         collapsecols
+"""
+    def acollmean (inarray):
+        return N.sum(N.ravel(inarray))
+
+    if cfcn == None:
+        cfcn = acollmean
+    if keepcols == []:
+        avgcol = acolex(a,collapsecols)
+        means = N.sum(avgcol)/float(len(avgcol))
+        if fcn1<>None:
+            try:
+                test = fcn1(avgcol)
+            except:
+                test = N.array(['N/A']*len(means))
+            means = aabut(means,test)
+        if fcn2<>None:
+            try:
+                test = fcn2(avgcol)
+            except:
+                test = N.array(['N/A']*len(means))
+            means = aabut(means,test)
+        return means
+    else:
+        if type(keepcols) not in [ListType,TupleType,N.ArrayType]:
+            keepcols = [keepcols]
+        values = colex(a,keepcols)   # so that "item" can be appended (below)
+        uniques = unique(values)  # get a LIST, so .sort keeps rows intact
+        uniques.sort()
+        newlist = []
+        for item in uniques:
+            if type(item) not in [ListType,TupleType,N.ArrayType]:
+                item =[item]
+            tmprows = alinexand(a,keepcols,item)
+            for col in collapsecols:
+                avgcol = acolex(tmprows,col)
+                item.append(acollmean(avgcol))
+                if fcn1<>None:
+                    try:
+                        test = fcn1(avgcol)
+                    except:
+                        test = 'N/A'
+                    item.append(test)
+                if fcn2<>None:
+                    try:
+                        test = fcn2(avgcol)
+                    except:
+                        test = 'N/A'
+                    item.append(test)
+                newlist.append(item)
+        try:
+            new_a = N.array(newlist)
+        except TypeError:
+            new_a = N.array(newlist,'O')
+        return new_a
+
+
+ def adm (a,criterion):
+    """
+Returns rows from the passed list of lists that meet the criteria in
+the passed criterion expression (a string as a function of x).
+
+Usage:   adm (a,criterion)   where criterion is like 'x[2]==37'
+"""
+    function = 'filter(lambda x: '+criterion+',a)'
+    lines = eval(function)
+    try:
+        lines = N.array(lines)
+    except:
+        lines = N.array(lines,'O')
+    return lines
+
+
+ def isstring(x):
+    if type(x)==StringType:
+        return 1
+    else:
+        return 0
+
+
+ def alinexand (a,columnlist,valuelist):
+    """
+Returns the rows of an array where col (from columnlist) = val
+(from valuelist).  One value is required for each column in columnlist.
+
+Usage:   alinexand (a,columnlist,valuelist)
+Returns: the rows of a where columnlist[i]=valuelist[i] for ALL i
+"""
+    if type(columnlist) not in [ListType,TupleType,N.ArrayType]:
+        columnlist = [columnlist]
+    if type(valuelist) not in [ListType,TupleType,N.ArrayType]:
+        valuelist = [valuelist]
+    criterion = ''
+    for i in range(len(columnlist)):
+        if type(valuelist[i])==StringType:
+            critval = '\'' + valuelist[i] + '\''
+        else:
+            critval = str(valuelist[i])
+        criterion = criterion + ' x['+str(columnlist[i])+']=='+critval+' and'
+    criterion = criterion[0:-3]         # remove the "and" after the last crit
+    return adm(a,criterion)
+
+
+ def alinexor (a,columnlist,valuelist):
+    """
+Returns the rows of an array where col (from columnlist) = val (from
+valuelist).  One value is required for each column in columnlist.
+The exception is if either columnlist or valuelist has only 1 value,
+in which case that item will be expanded to match the length of the
+other list.
+
+Usage:   alinexor (a,columnlist,valuelist)
+Returns: the rows of a where columnlist[i]=valuelist[i] for ANY i
+"""
+    if type(columnlist) not in [ListType,TupleType,N.ArrayType]:
+        columnlist = [columnlist]
+    if type(valuelist) not in [ListType,TupleType,N.ArrayType]:
+        valuelist = [valuelist]
+    criterion = ''
+    if len(columnlist) == 1 and len(valuelist) > 1:
+        columnlist = columnlist*len(valuelist)
+    elif len(valuelist) == 1 and len(columnlist) > 1:
+        valuelist = valuelist*len(columnlist)
+    for i in range(len(columnlist)):
+        if type(valuelist[i])==StringType:
+            critval = '\'' + valuelist[i] + '\''
+        else:
+            critval = str(valuelist[i])
+        criterion = criterion + ' x['+str(columnlist[i])+']=='+critval+' or'
+    criterion = criterion[0:-2]         # remove the "or" after the last crit
+    return adm(a,criterion)
+
+
+ def areplace (a,oldval,newval):
+    """
+Replaces all occurrences of oldval with newval in array a.
+
+Usage:   areplace(a,oldval,newval)
+"""
+    newa = N.not_equal(a,oldval)*a
+    return newa+N.equal(a,oldval)*newval
+
+
+ def arecode (a,listmap,col='all'):
+    """
+Remaps the values in an array to a new set of values (useful when
+you need to recode data from (e.g.) strings to numbers as most stats
+packages require.  Can work on SINGLE columns, or 'all' columns at once.
+
+Usage:   arecode (a,listmap,col='all')
+Returns: a version of array a where listmap[i][0] = (instead) listmap[i][1]
+"""
+    ashape = a.shape
+    if col == 'all':
+        work = a.flat
+    else:
+        work = acolex(a,col)
+        work = work.flat
+    for pair in listmap:
+        if type(pair[1]) == StringType or work.typecode()=='O' or a.typecode()=='O':
+            work = N.array(work,'O')
+            a = N.array(a,'O')
+            for i in range(len(work)):
+                if work[i]==pair[0]:
+                    work[i] = pair[1]
+            if col == 'all':
+                return N.reshape(work,ashape)
+            else:
+                return N.concatenate([a[:,0:col],work[:,N.NewAxis],a[:,col+1:]],1)
+        else:   # must be a non-Object type array and replacement
+            work = N.where(N.equal(work,pair[0]),pair[1],work)
+            return N.concatenate([a[:,0:col],work[:,N.NewAxis],a[:,col+1:]],1)
+
+
+ def arowcompare(row1, row2):
+    """
+Compares two rows from an array, regardless of whether it is an
+array of numbers or of python objects (which requires the cmp function).
+
+Usage:   arowcompare(row1,row2)
+Returns: an array of equal length containing 1s where the two rows had
+         identical elements and 0 otherwise
+"""
+    if row1.typecode()=='O' or row2.typecode=='O':
+        cmpvect = N.logical_not(abs(N.array(map(cmp,row1,row2)))) # cmp fcn gives -1,0,1
+    else:
+        cmpvect = N.equal(row1,row2)
+    return cmpvect
+
+
+ def arowsame(row1, row2):
+    """
+Compares two rows from an array, regardless of whether it is an
+array of numbers or of python objects (which requires the cmp function).
+
+Usage:   arowsame(row1,row2)
+Returns: 1 if the two rows are identical, 0 otherwise.
+"""
+    cmpval = N.alltrue(arowcompare(row1,row2))
+    return cmpval
+
+
+ def asortrows(a,axis=0):
+    """
+Sorts an array "by rows".  This differs from the Numeric.sort() function,
+which sorts elements WITHIN the given axis.  Instead, this function keeps
+the elements along the given axis intact, but shifts them 'up or down'
+relative to one another.
+
+Usage:   asortrows(a,axis=0)
+Returns: sorted version of a
+"""
+    if axis != 0:
+        a = N.swapaxes(a, axis, 0)
+    l = a.tolist()
+    l.sort()           # or l.sort(_sort)
+    y = N.array(l)
+    if axis != 0:
+        y = N.swapaxes(y, axis, 0)
+    return y
+
+
+ def aunique(inarray):
+    """
+Returns unique items in the FIRST dimension of the passed array. Only
+works on arrays NOT including string items.
+
+Usage:   aunique (inarray)
+"""
+    uniques = N.array([inarray[0]])
+    if len(uniques.shape) == 1:            # IF IT'S A 1D ARRAY
+        for item in inarray[1:]:
+            if N.add.reduce(N.equal(uniques,item).flat) == 0:
+                try:
+                    uniques = N.concatenate([uniques,N.array[N.NewAxis,:]])
+                except TypeError:
+                    uniques = N.concatenate([uniques,N.array([item])])
+    else:                                  # IT MUST BE A 2+D ARRAY
+        if inarray.typecode() != 'O':  # not an Object array
+            for item in inarray[1:]:
+                if not N.sum(N.alltrue(N.equal(uniques,item),1)):
+                    try:
+                        uniques = N.concatenate( [uniques,item[N.NewAxis,:]] )
+                    except TypeError:    # the item to add isn't a list
+                        uniques = N.concatenate([uniques,N.array([item])])
+                else:
+                    pass  # this item is already in the uniques array
+        else:   # must be an Object array, alltrue/equal functions don't work
+            for item in inarray[1:]:
+                newflag = 1
+                for unq in uniques:  # NOTE: cmp --> 0=same, -1=<, 1=>
+                    test = N.sum(abs(N.array(map(cmp,item,unq))))
+                    if test == 0:   # if item identical to any 1 row in uniques
+                        newflag = 0 # then not a novel item to add
+                        break
+                if newflag == 1:
+                    try:
+                        uniques = N.concatenate( [uniques,item[N.NewAxis,:]] )
+                    except TypeError:    # the item to add isn't a list
+                        uniques = N.concatenate([uniques,N.array([item])])
+    return uniques
+
+
+ def aduplicates(inarray):
+    """
+Returns duplicate items in the FIRST dimension of the passed array. Only
+works on arrays NOT including string items.
+
+Usage:   aunique (inarray)
+"""
+    inarray = N.array(inarray)
+    if len(inarray.shape) == 1:            # IF IT'S A 1D ARRAY
+        dups = []
+        inarray = inarray.tolist()
+        for i in range(len(inarray)):
+            if inarray[i] in inarray[i+1:]:
+                dups.append(inarray[i])
+        dups = aunique(dups)
+    else:                                  # IT MUST BE A 2+D ARRAY
+        dups = []
+        aslist = inarray.tolist()
+        for i in range(len(aslist)):
+            if aslist[i] in aslist[i+1:]:
+                dups.append(aslist[i])
+        dups = unique(dups)
+        dups = N.array(dups)
+    return dups
+
+except ImportError:    # IF NUMERIC ISN'T AVAILABLE, SKIP ALL arrayfuncs
+ pass
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx_extras/fpconst.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx_extras/fpconst.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx_extras/fpconst.py (revision 3)
@@ -0,0 +1,163 @@
+"""Utilities for handling IEEE 754 floating point special values
+
+This python module implements constants and functions for working with
+IEEE754 double-precision special values.  It provides constants for
+Not-a-Number (NaN), Positive Infinity (PosInf), and Negative Infinity
+(NegInf), as well as functions to test for these values.
+
+The code is implemented in pure python by taking advantage of the
+'struct' standard module. Care has been taken to generate proper
+results on both big-endian and little-endian machines. Some efficiency
+could be gained by translating the core routines into C.
+
+See <http://babbage.cs.qc.edu/courses/cs341/IEEE-754references.html>
+for reference material on the IEEE 754 floating point standard.
+
+Further information on this package is available at
+<http://www.analytics.washington.edu/statcomp/projects/rzope/fpconst/>.
+
+Author:    Gregory R. Warnes <gregory_r_warnes@groton.pfizer.com>
+Date::     2003-04-08
+Copyright: (c) 2003, Pfizer, Inc.
+"""
+
+__version__ = "0.7.0"
+ident = "$Id: fpconst.py,v 1.12 2004/05/22 04:38:17 warnes Exp $"
+
+import struct, operator
+
+# check endianess
+_big_endian = struct.pack('i',1)[0] != '\x01'
+
+# and define appropriate constants
+if(_big_endian): 
+    NaN    = struct.unpack('d', '\x7F\xF8\x00\x00\x00\x00\x00\x00')[0]
+    PosInf = struct.unpack('d', '\x7F\xF0\x00\x00\x00\x00\x00\x00')[0]
+    NegInf = -PosInf
+else:
+    NaN    = struct.unpack('d', '\x00\x00\x00\x00\x00\x00\xf8\xff')[0]
+    PosInf = struct.unpack('d', '\x00\x00\x00\x00\x00\x00\xf0\x7f')[0]
+    NegInf = -PosInf
+
+def _double_as_bytes(dval):
+    "Use struct.unpack to decode a double precision float into eight bytes"
+    tmp = list(struct.unpack('8B',struct.pack('d', dval)))
+    if not _big_endian:
+        tmp.reverse()
+    return tmp
+
+##
+## Functions to extract components of the IEEE 754 floating point format
+##
+
+def _sign(dval):
+    "Extract the sign bit from a double-precision floating point value"
+    bb = _double_as_bytes(dval)
+    return bb[0] >> 7 & 0x01
+
+def _exponent(dval):
+    """Extract the exponentent bits from a double-precision floating
+    point value.
+
+    Note that for normalized values, the exponent bits have an offset
+    of 1023. As a consequence, the actual exponentent is obtained
+    by subtracting 1023 from the value returned by this function
+    """
+    bb = _double_as_bytes(dval)
+    return (bb[0] << 4 | bb[1] >> 4) & 0x7ff
+
+def _mantissa(dval):
+    """Extract the _mantissa bits from a double-precision floating
+    point value."""
+
+    bb = _double_as_bytes(dval)
+    mantissa =  bb[1] & 0x0f << 48
+    mantissa += bb[2] << 40
+    mantissa += bb[3] << 32
+    mantissa += bb[4]
+    return mantissa 
+
+def _zero_mantissa(dval):
+    """Determine whether the mantissa bits of the given double are all
+    zero."""
+    bb = _double_as_bytes(dval)
+    return ((bb[1] & 0x0f) | reduce(operator.or_, bb[2:])) == 0
+
+##
+## Functions to test for IEEE 754 special values
+##
+
+def isNaN(value):
+    "Determine if the argument is a IEEE 754 NaN (Not a Number) value."
+    return (_exponent(value)==0x7ff and not _zero_mantissa(value))
+
+def isInf(value):
+    """Determine if the argument is an infinite IEEE 754 value (positive
+    or negative inifinity)"""
+    return (_exponent(value)==0x7ff and _zero_mantissa(value))
+
+def isFinite(value):
+    """Determine if the argument is an finite IEEE 754 value (i.e., is
+    not NaN, positive or negative inifinity)"""
+    return (_exponent(value)!=0x7ff)
+
+def isPosInf(value):
+    "Determine if the argument is a IEEE 754 positive infinity value"
+    return (_sign(value)==0 and _exponent(value)==0x7ff and \
+            _zero_mantissa(value))
+
+def isNegInf(value):
+    "Determine if the argument is a IEEE 754 negative infinity value"
+    return (_sign(value)==1 and _exponent(value)==0x7ff and \
+            _zero_mantissa(value))
+
+##
+## Functions to test public functions.
+## 
+
+def test_isNaN():
+    assert( not isNaN(PosInf) )
+    assert( not isNaN(NegInf) )
+    assert(     isNaN(NaN   ) )
+    assert( not isNaN(   1.0) )
+    assert( not isNaN(  -1.0) )
+
+def test_isInf():
+    assert(     isInf(PosInf) )
+    assert(     isInf(NegInf) )
+    assert( not isInf(NaN   ) )
+    assert( not isInf(   1.0) )
+    assert( not isInf(  -1.0) )
+
+def test_isFinite():
+    assert( not isFinite(PosInf) )
+    assert( not isFinite(NegInf) )
+    assert( not isFinite(NaN   ) )
+    assert(     isFinite(   1.0) )
+    assert(     isFinite(  -1.0) )
+
+def test_isPosInf():
+    assert(     isPosInf(PosInf) )
+    assert( not isPosInf(NegInf) )
+    assert( not isPosInf(NaN   ) )
+    assert( not isPosInf(   1.0) )
+    assert( not isPosInf(  -1.0) )
+
+def test_isNegInf():
+    assert( not isNegInf(PosInf) )
+    assert(     isNegInf(NegInf) )
+    assert( not isNegInf(NaN   ) )
+    assert( not isNegInf(   1.0) )
+    assert( not isNegInf(  -1.0) )
+
+# overall test
+def test():
+    test_isNaN()
+    test_isInf()
+    test_isFinite()
+    test_isPosInf()
+    test_isNegInf()
+    
+if __name__ == "__main__":
+    test()
+
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx_extras/pyparsing.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx_extras/pyparsing.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx_extras/pyparsing.py (revision 3)
@@ -0,0 +1,3601 @@
+# module pyparsing.py
+#
+# Copyright (c) 2003-2008  Paul T. McGuire
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+#from __future__ import generators
+
+__doc__ = \
+"""
+pyparsing module - Classes and methods to define and execute parsing grammars
+
+The pyparsing module is an alternative approach to creating and executing simple grammars,
+vs. the traditional lex/yacc approach, or the use of regular expressions.  With pyparsing, you
+don't need to learn a new syntax for defining grammars or matching expressions - the parsing module
+provides a library of classes that you use to construct the grammar directly in Python.
+
+Here is a program to parse "Hello, World!" (or any greeting of the form "<salutation>, <addressee>!")::
+
+    from pyparsing import Word, alphas
+
+    # define grammar of a greeting
+    greet = Word( alphas ) + "," + Word( alphas ) + "!"
+
+    hello = "Hello, World!"
+    print hello, "->", greet.parseString( hello )
+
+The program outputs the following::
+
+    Hello, World! -> ['Hello', ',', 'World', '!']
+
+The Python representation of the grammar is quite readable, owing to the self-explanatory
+class names, and the use of '+', '|' and '^' operators.
+
+The parsed results returned from parseString() can be accessed as a nested list, a dictionary, or an
+object with named attributes.
+
+The pyparsing module handles some of the problems that are typically vexing when writing text parsers:
+ - extra or missing whitespace (the above program will also handle "Hello,World!", "Hello  ,  World  !", etc.)
+ - quoted strings
+ - embedded comments
+"""
+
+__version__ = "1.5.0"
+__versionTime__ = "28 May 2008 10:05"
+__author__ = "Paul McGuire <ptmcg@users.sourceforge.net>"
+
+import string
+from weakref import ref as wkref
+import copy,sys
+import warnings
+import re
+import sre_constants
+import xml.sax.saxutils
+#~ sys.stderr.write( "testing pyparsing module, version %s, %s\n" % (__version__,__versionTime__ ) )
+
+__all__ = [
+'And', 'CaselessKeyword', 'CaselessLiteral', 'CharsNotIn', 'Combine', 'Dict', 'Each', 'Empty',
+'FollowedBy', 'Forward', 'GoToColumn', 'Group', 'Keyword', 'LineEnd', 'LineStart', 'Literal',
+'MatchFirst', 'NoMatch', 'NotAny', 'OneOrMore', 'OnlyOnce', 'Optional', 'Or',
+'ParseBaseException', 'ParseElementEnhance', 'ParseException', 'ParseExpression', 'ParseFatalException',
+'ParseResults', 'ParseSyntaxException', 'ParserElement', 'QuotedString', 'RecursiveGrammarException',
+'Regex', 'SkipTo', 'StringEnd', 'StringStart', 'Suppress', 'Token', 'TokenConverter', 'Upcase',
+'White', 'Word', 'WordEnd', 'WordStart', 'ZeroOrMore',
+'alphanums', 'alphas', 'alphas8bit', 'anyCloseTag', 'anyOpenTag', 'cStyleComment', 'col',
+'commaSeparatedList', 'commonHTMLEntity', 'countedArray', 'cppStyleComment', 'dblQuotedString',
+'dblSlashComment', 'delimitedList', 'dictOf', 'downcaseTokens', 'empty', 'getTokensEndLoc', 'hexnums',
+'htmlComment', 'javaStyleComment', 'keepOriginalText', 'line', 'lineEnd', 'lineStart', 'lineno',
+'makeHTMLTags', 'makeXMLTags', 'matchOnlyAtCol', 'matchPreviousExpr', 'matchPreviousLiteral',
+'nestedExpr', 'nullDebugAction', 'nums', 'oneOf', 'opAssoc', 'operatorPrecedence', 'printables',
+'punc8bit', 'pythonStyleComment', 'quotedString', 'removeQuotes', 'replaceHTMLEntity',
+'replaceWith', 'restOfLine', 'sglQuotedString', 'srange', 'stringEnd',
+'stringStart', 'traceParseAction', 'unicodeString', 'upcaseTokens', 'withAttribute',
+'indentedBlock',
+]
+
+
+"""
+Detect if we are running version 3.X and make appropriate changes
+Robert A. Clark
+"""
+if sys.version_info[0] > 2:
+    _PY3K = True
+    _MAX_INT = sys.maxsize
+    basestring = str
+else:
+    _PY3K = False
+    _MAX_INT = sys.maxint
+
+if not _PY3K:
+    def _ustr(obj):
+        """Drop-in replacement for str(obj) that tries to be Unicode friendly. It first tries
+           str(obj). If that fails with a UnicodeEncodeError, then it tries unicode(obj). It
+           then < returns the unicode object | encodes it with the default encoding | ... >.
+        """
+        try:
+            # If this works, then _ustr(obj) has the same behaviour as str(obj), so
+            # it won't break any existing code.
+            return str(obj)
+
+        except UnicodeEncodeError:
+            # The Python docs (http://docs.python.org/ref/customization.html#l2h-182)
+            # state that "The return value must be a string object". However, does a
+            # unicode object (being a subclass of basestring) count as a "string
+            # object"?
+            # If so, then return a unicode object:
+            return unicode(obj)
+            # Else encode it... but how? There are many choices... :)
+            # Replace unprintables with escape codes?
+            #return unicode(obj).encode(sys.getdefaultencoding(), 'backslashreplace_errors')
+            # Replace unprintables with question marks?
+            #return unicode(obj).encode(sys.getdefaultencoding(), 'replace')
+            # ...
+else:
+    _ustr = str
+
+def _str2dict(strg):
+    return dict( [(c,0) for c in strg] )
+    #~ return set( [c for c in strg] )
+
+class _Constants(object):
+    pass
+
+if not _PY3K:
+    alphas     = string.lowercase + string.uppercase
+else:
+    alphas     = string.ascii_lowercase + string.ascii_uppercase
+nums       = string.digits
+hexnums    = nums + "ABCDEFabcdef"
+alphanums  = alphas + nums
+_bslash = "\\"
+printables = "".join( [ c for c in string.printable if c not in string.whitespace ] )
+
+class ParseBaseException(Exception):
+    """base exception class for all parsing runtime exceptions"""
+    __slots__ = ( "loc","msg","pstr","parserElement" )
+    # Performance tuning: we construct a *lot* of these, so keep this
+    # constructor as small and fast as possible
+    def __init__( self, pstr, loc=0, msg=None, elem=None ):
+        self.loc = loc
+        if msg is None:
+            self.msg = pstr
+            self.pstr = ""
+        else:
+            self.msg = msg
+            self.pstr = pstr
+        self.parserElement = elem
+
+    def __getattr__( self, aname ):
+        """supported attributes by name are:
+            - lineno - returns the line number of the exception text
+            - col - returns the column number of the exception text
+            - line - returns the line containing the exception text
+        """
+        if( aname == "lineno" ):
+            return lineno( self.loc, self.pstr )
+        elif( aname in ("col", "column") ):
+            return col( self.loc, self.pstr )
+        elif( aname == "line" ):
+            return line( self.loc, self.pstr )
+        else:
+            raise AttributeError(aname)
+
+    def __str__( self ):
+        return "%s (at char %d), (line:%d, col:%d)" % \
+                ( self.msg, self.loc, self.lineno, self.column )
+    def __repr__( self ):
+        return _ustr(self)
+    def markInputline( self, markerString = ">!<" ):
+        """Extracts the exception line from the input string, and marks
+           the location of the exception with a special symbol.
+        """
+        line_str = self.line
+        line_column = self.column - 1
+        if markerString:
+            line_str = "".join( [line_str[:line_column],
+                                markerString, line_str[line_column:]])
+        return line_str.strip()
+
+class ParseException(ParseBaseException):
+    """exception thrown when parse expressions don't match class;
+       supported attributes by name are:
+        - lineno - returns the line number of the exception text
+        - col - returns the column number of the exception text
+        - line - returns the line containing the exception text
+    """
+    pass
+
+class ParseFatalException(ParseBaseException):
+    """user-throwable exception thrown when inconsistent parse content
+       is found; stops all parsing immediately"""
+    pass
+
+class ParseSyntaxException(ParseFatalException):
+    """just like ParseFatalException, but thrown internally when an
+       ErrorStop indicates that parsing is to stop immediately because
+       an unbacktrackable syntax error has been found"""
+    def __init__(self, pe):
+        super(ParseSyntaxException, self).__init__(
+                                    pe.pstr, pe.loc, pe.msg, pe.parserElement)
+
+#~ class ReparseException(ParseBaseException):
+    #~ """Experimental class - parse actions can raise this exception to cause
+       #~ pyparsing to reparse the input string:
+        #~ - with a modified input string, and/or
+        #~ - with a modified start location
+       #~ Set the values of the ReparseException in the constructor, and raise the
+       #~ exception in a parse action to cause pyparsing to use the new string/location.
+       #~ Setting the values as None causes no change to be made.
+       #~ """
+    #~ def __init_( self, newstring, restartLoc ):
+        #~ self.newParseText = newstring
+        #~ self.reparseLoc = restartLoc
+
+class RecursiveGrammarException(Exception):
+    """exception thrown by validate() if the grammar could be improperly recursive"""
+    def __init__( self, parseElementList ):
+        self.parseElementTrace = parseElementList
+
+    def __str__( self ):
+        return "RecursiveGrammarException: %s" % self.parseElementTrace
+
+class _ParseResultsWithOffset(object):
+    def __init__(self,p1,p2):
+        self.tup = (p1,p2)
+    def __getitem__(self,i):
+        return self.tup[i]
+    def __repr__(self):
+        return repr(self.tup)
+
+class ParseResults(object):
+    """Structured parse results, to provide multiple means of access to the parsed data:
+       - as a list (len(results))
+       - by list index (results[0], results[1], etc.)
+       - by attribute (results.<resultsName>)
+       """
+    __slots__ = ( "__toklist", "__tokdict", "__doinit", "__name", "__parent", "__accumNames", "__weakref__" )
+    def __new__(cls, toklist, name=None, asList=True, modal=True ):
+        if isinstance(toklist, cls):
+            return toklist
+        retobj = object.__new__(cls)
+        retobj.__doinit = True
+        return retobj
+
+    # Performance tuning: we construct a *lot* of these, so keep this
+    # constructor as small and fast as possible
+    def __init__( self, toklist, name=None, asList=True, modal=True ):
+        if self.__doinit:
+            self.__doinit = False
+            self.__name = None
+            self.__parent = None
+            self.__accumNames = {}
+            if isinstance(toklist, list):
+                self.__toklist = toklist[:]
+            else:
+                self.__toklist = [toklist]
+            self.__tokdict = dict()
+
+        # this line is related to debugging the asXML bug
+        #~ asList = False
+
+        if name:
+            if not modal:
+                self.__accumNames[name] = 0
+            if isinstance(name,int):
+                name = _ustr(name) # will always return a str, but use _ustr for consistency
+            self.__name = name
+            if not toklist in (None,'',[]):
+                if isinstance(toklist,basestring):
+                    toklist = [ toklist ]
+                if asList:
+                    if isinstance(toklist,ParseResults):
+                        self[name] = _ParseResultsWithOffset(toklist.copy(),-1)
+                    else:
+                        self[name] = _ParseResultsWithOffset(ParseResults(toklist[0]),-1)
+                    self[name].__name = name
+                else:
+                    try:
+                        self[name] = toklist[0]
+                    except (KeyError,TypeError):
+                        self[name] = toklist
+
+    def __getitem__( self, i ):
+        if isinstance( i, (int,slice) ):
+            return self.__toklist[i]
+        else:
+            if i not in self.__accumNames:
+                return self.__tokdict[i][-1][0]
+            else:
+                return ParseResults([ v[0] for v in self.__tokdict[i] ])
+
+    def __setitem__( self, k, v ):
+        if isinstance(v,_ParseResultsWithOffset):
+            self.__tokdict[k] = self.__tokdict.get(k,list()) + [v]
+            sub = v[0]
+        elif isinstance(k,int):
+            self.__toklist[k] = v
+            sub = v
+        else:
+            self.__tokdict[k] = self.__tokdict.get(k,list()) + [_ParseResultsWithOffset(v,0)]
+            sub = v
+        if isinstance(sub,ParseResults):
+            sub.__parent = wkref(self)
+
+    def __delitem__( self, i ):
+        if isinstance(i,(int,slice)):
+            mylen = len( self.__toklist )
+            del self.__toklist[i]
+
+            # convert int to slice
+            if isinstance(i, int):
+                if i < 0:
+                    i += mylen
+                i = slice(i, i+1)
+            # get removed indices
+            removed = list(range(*i.indices(mylen)))
+            removed.reverse()
+            # fixup indices in token dictionary
+            for name in self.__tokdict:
+                occurrences = self.__tokdict[name]
+                for j in removed:
+                    for k, (value, position) in enumerate(occurrences):
+                        occurrences[k] = _ParseResultsWithOffset(value, position - (position > j))
+        else:
+            del self.__tokdict[i]
+
+    def __contains__( self, k ):
+        return k in self.__tokdict
+
+    def __len__( self ): return len( self.__toklist )
+    def __bool__(self): return len( self.__toklist ) > 0
+    __nonzero__ = __bool__
+    def __iter__( self ): return iter( self.__toklist )
+    def __reversed__( self ): return iter( reversed(self.__toklist) )
+    def keys( self ):
+        """Returns all named result keys."""
+        return self.__tokdict.keys()
+
+    def pop( self, index=-1 ):
+        """Removes and returns item at specified index (default=last).
+           Will work with either numeric indices or dict-key indicies."""
+        ret = self[index]
+        del self[index]
+        return ret
+
+    def get(self, key, defaultValue=None):
+        """Returns named result matching the given key, or if there is no
+           such name, then returns the given defaultValue or None if no
+           defaultValue is specified."""
+        if key in self:
+            return self[key]
+        else:
+            return defaultValue
+
+    def insert( self, index, insStr ):
+        self.__toklist.insert(index, insStr)
+        # fixup indices in token dictionary
+        for name in self.__tokdict:
+            occurrences = self.__tokdict[name]
+            for k, (value, position) in enumerate(occurrences):
+                occurrences[k] = _ParseResultsWithOffset(value, position + (position > j))
+
+    def items( self ):
+        """Returns all named result keys and values as a list of tuples."""
+        return [(k,self[k]) for k in self.__tokdict]
+
+    def values( self ):
+        """Returns all named result values."""
+        return [ v[-1][0] for v in self.__tokdict.values() ]
+
+    def __getattr__( self, name ):
+        if name not in self.__slots__:
+            if name in self.__tokdict:
+                if name not in self.__accumNames:
+                    return self.__tokdict[name][-1][0]
+                else:
+                    return ParseResults([ v[0] for v in self.__tokdict[name] ])
+            else:
+                return ""
+        return None
+
+    def __add__( self, other ):
+        ret = self.copy()
+        ret += other
+        return ret
+
+    def __iadd__( self, other ):
+        if other.__tokdict:
+            offset = len(self.__toklist)
+            addoffset = ( lambda a: (a<0 and offset) or (a+offset) )
+            otheritems = other.__tokdict.items()
+            otherdictitems = [(k, _ParseResultsWithOffset(v[0],addoffset(v[1])) )
+                                for (k,vlist) in otheritems for v in vlist]
+            for k,v in otherdictitems:
+                self[k] = v
+                if isinstance(v[0],ParseResults):
+                    v[0].__parent = wkref(self)
+        self.__toklist += other.__toklist
+        self.__accumNames.update( other.__accumNames )
+        del other
+        return self
+
+    def __repr__( self ):
+        return "(%s, %s)" % ( repr( self.__toklist ), repr( self.__tokdict ) )
+
+    def __str__( self ):
+        out = "["
+        sep = ""
+        for i in self.__toklist:
+            if isinstance(i, ParseResults):
+                out += sep + _ustr(i)
+            else:
+                out += sep + repr(i)
+            sep = ", "
+        out += "]"
+        return out
+
+    def _asStringList( self, sep='' ):
+        out = []
+        for item in self.__toklist:
+            if out and sep:
+                out.append(sep)
+            if isinstance( item, ParseResults ):
+                out += item._asStringList()
+            else:
+                out.append( _ustr(item) )
+        return out
+
+    def asList( self ):
+        """Returns the parse results as a nested list of matching tokens, all converted to strings."""
+        out = []
+        for res in self.__toklist:
+            if isinstance(res,ParseResults):
+                out.append( res.asList() )
+            else:
+                out.append( res )
+        return out
+
+    def asDict( self ):
+        """Returns the named parse results as dictionary."""
+        return dict( self.items() )
+
+    def copy( self ):
+        """Returns a new copy of a ParseResults object."""
+        ret = ParseResults( self.__toklist )
+        ret.__tokdict = self.__tokdict.copy()
+        ret.__parent = self.__parent
+        ret.__accumNames.update( self.__accumNames )
+        ret.__name = self.__name
+        return ret
+
+    def asXML( self, doctag=None, namedItemsOnly=False, indent="", formatted=True ):
+        """Returns the parse results as XML. Tags are created for tokens and lists that have defined results names."""
+        nl = "\n"
+        out = []
+        namedItems = dict( [ (v[1],k) for (k,vlist) in self.__tokdict.items()
+                                                            for v in vlist ] )
+        nextLevelIndent = indent + "  "
+
+        # collapse out indents if formatting is not desired
+        if not formatted:
+            indent = ""
+            nextLevelIndent = ""
+            nl = ""
+
+        selfTag = None
+        if doctag is not None:
+            selfTag = doctag
+        else:
+            if self.__name:
+                selfTag = self.__name
+
+        if not selfTag:
+            if namedItemsOnly:
+                return ""
+            else:
+                selfTag = "ITEM"
+
+        out += [ nl, indent, "<", selfTag, ">" ]
+
+        worklist = self.__toklist
+        for i,res in enumerate(worklist):
+            if isinstance(res,ParseResults):
+                if i in namedItems:
+                    out += [ res.asXML(namedItems[i],
+                                        namedItemsOnly and doctag is None,
+                                        nextLevelIndent,
+                                        formatted)]
+                else:
+                    out += [ res.asXML(None,
+                                        namedItemsOnly and doctag is None,
+                                        nextLevelIndent,
+                                        formatted)]
+            else:
+                # individual token, see if there is a name for it
+                resTag = None
+                if i in namedItems:
+                    resTag = namedItems[i]
+                if not resTag:
+                    if namedItemsOnly:
+                        continue
+                    else:
+                        resTag = "ITEM"
+                xmlBodyText = xml.sax.saxutils.escape(_ustr(res))
+                out += [ nl, nextLevelIndent, "<", resTag, ">",
+                                                xmlBodyText,
+                                                "</", resTag, ">" ]
+
+        out += [ nl, indent, "</", selfTag, ">" ]
+        return "".join(out)
+
+    def __lookup(self,sub):
+        for k,vlist in self.__tokdict.items():
+            for v,loc in vlist:
+                if sub is v:
+                    return k
+        return None
+
+    def getName(self):
+        """Returns the results name for this token expression."""
+        if self.__name:
+            return self.__name
+        elif self.__parent:
+            par = self.__parent()
+            if par:
+                return par.__lookup(self)
+            else:
+                return None
+        elif (len(self) == 1 and
+               len(self.__tokdict) == 1 and
+               self.__tokdict.values()[0][0][1] in (0,-1)):
+            return self.__tokdict.keys()[0]
+        else:
+            return None
+
+    def dump(self,indent='',depth=0):
+        """Diagnostic method for listing out the contents of a ParseResults.
+           Accepts an optional indent argument so that this string can be embedded
+           in a nested display of other data."""
+        out = []
+        out.append( indent+_ustr(self.asList()) )
+        keys = self.items()
+        keys.sort()
+        for k,v in keys:
+            if out:
+                out.append('\n')
+            out.append( "%s%s- %s: " % (indent,('  '*depth), k) )
+            if isinstance(v,ParseResults):
+                if v.keys():
+                    #~ out.append('\n')
+                    out.append( v.dump(indent,depth+1) )
+                    #~ out.append('\n')
+                else:
+                    out.append(_ustr(v))
+            else:
+                out.append(_ustr(v))
+        #~ out.append('\n')
+        return "".join(out)
+
+    # add support for pickle protocol
+    def __getstate__(self):
+        return ( self.__toklist,
+                 ( self.__tokdict.copy(),
+                   self.__parent is not None and self.__parent() or None,
+                   self.__accumNames,
+                   self.__name ) )
+
+    def __setstate__(self,state):
+        self.__toklist = state[0]
+        self.__tokdict, \
+        par, \
+        inAccumNames, \
+        self.__name = state[1]
+        self.__accumNames = {}
+        self.__accumNames.update(inAccumNames)
+        if par is not None:
+            self.__parent = wkref(par)
+        else:
+            self.__parent = None
+
+
+def col (loc,strg):
+    """Returns current column within a string, counting newlines as line separators.
+   The first column is number 1.
+
+   Note: the default parsing behavior is to expand tabs in the input string
+   before starting the parsing process.  See L{I{ParserElement.parseString}<ParserElement.parseString>} for more information
+   on parsing strings containing <TAB>s, and suggested methods to maintain a
+   consistent view of the parsed string, the parse location, and line and column
+   positions within the parsed string.
+   """
+    return (loc<len(strg) and strg[loc] == '\n') and 1 or loc - strg.rfind("\n", 0, loc)
+
+def lineno(loc,strg):
+    """Returns current line number within a string, counting newlines as line separators.
+   The first line is number 1.
+
+   Note: the default parsing behavior is to expand tabs in the input string
+   before starting the parsing process.  See L{I{ParserElement.parseString}<ParserElement.parseString>} for more information
+   on parsing strings containing <TAB>s, and suggested methods to maintain a
+   consistent view of the parsed string, the parse location, and line and column
+   positions within the parsed string.
+   """
+    return strg.count("\n",0,loc) + 1
+
+def line( loc, strg ):
+    """Returns the line of text containing loc within a string, counting newlines as line separators.
+       """
+    lastCR = strg.rfind("\n", 0, loc)
+    nextCR = strg.find("\n", loc)
+    if nextCR > 0:
+        return strg[lastCR+1:nextCR]
+    else:
+        return strg[lastCR+1:]
+
+def _defaultStartDebugAction( instring, loc, expr ):
+    print ("Match " + _ustr(expr) + " at loc " + _ustr(loc) + "(%d,%d)" % ( lineno(loc,instring), col(loc,instring) ))
+
+def _defaultSuccessDebugAction( instring, startloc, endloc, expr, toks ):
+    print ("Matched " + _ustr(expr) + " -> " + str(toks.asList()))
+
+def _defaultExceptionDebugAction( instring, loc, expr, exc ):
+    print ("Exception raised:" + _ustr(exc))
+
+def nullDebugAction(*args):
+    """'Do-nothing' debug action, to suppress debugging output during parsing."""
+    pass
+
+class ParserElement(object):
+    """Abstract base level parser element class."""
+    DEFAULT_WHITE_CHARS = " \n\t\r"
+
+    def setDefaultWhitespaceChars( chars ):
+        """Overrides the default whitespace chars
+        """
+        ParserElement.DEFAULT_WHITE_CHARS = chars
+    setDefaultWhitespaceChars = staticmethod(setDefaultWhitespaceChars)
+
+    def __init__( self, savelist=False ):
+        self.parseAction = list()
+        self.failAction = None
+        #~ self.name = "<unknown>"  # don't define self.name, let subclasses try/except upcall
+        self.strRepr = None
+        self.resultsName = None
+        self.saveAsList = savelist
+        self.skipWhitespace = True
+        self.whiteChars = ParserElement.DEFAULT_WHITE_CHARS
+        self.copyDefaultWhiteChars = True
+        self.mayReturnEmpty = False # used when checking for left-recursion
+        self.keepTabs = False
+        self.ignoreExprs = list()
+        self.debug = False
+        self.streamlined = False
+        self.mayIndexError = True # used to optimize exception handling for subclasses that don't advance parse index
+        self.errmsg = ""
+        self.modalResults = True # used to mark results names as modal (report only last) or cumulative (list all)
+        self.debugActions = ( None, None, None ) #custom debug actions
+        self.re = None
+        self.callPreparse = True # used to avoid redundant calls to preParse
+        self.callDuringTry = False
+
+    def copy( self ):
+        """Make a copy of this ParserElement.  Useful for defining different parse actions
+           for the same parsing pattern, using copies of the original parse element."""
+        cpy = copy.copy( self )
+        cpy.parseAction = self.parseAction[:]
+        cpy.ignoreExprs = self.ignoreExprs[:]
+        if self.copyDefaultWhiteChars:
+            cpy.whiteChars = ParserElement.DEFAULT_WHITE_CHARS
+        return cpy
+
+    def setName( self, name ):
+        """Define name for this expression, for use in debugging."""
+        self.name = name
+        self.errmsg = "Expected " + self.name
+        if hasattr(self,"exception"):
+            self.exception.msg = self.errmsg
+        return self
+
+    def setResultsName( self, name, listAllMatches=False ):
+        """Define name for referencing matching tokens as a nested attribute
+           of the returned parse results.
+           NOTE: this returns a *copy* of the original ParserElement object;
+           this is so that the client can define a basic element, such as an
+           integer, and reference it in multiple places with different names.
+        """
+        newself = self.copy()
+        newself.resultsName = name
+        newself.modalResults = not listAllMatches
+        return newself
+
+    def setBreak(self,breakFlag = True):
+        """Method to invoke the Python pdb debugger when this element is
+           about to be parsed. Set breakFlag to True to enable, False to
+           disable.
+        """
+        if breakFlag:
+            _parseMethod = self._parse
+            def breaker(instring, loc, doActions=True, callPreParse=True):
+                import pdb
+                pdb.set_trace()
+                _parseMethod( instring, loc, doActions, callPreParse )
+            breaker._originalParseMethod = _parseMethod
+            self._parse = breaker
+        else:
+            if hasattr(self._parse,"_originalParseMethod"):
+                self._parse = self._parse._originalParseMethod
+        return self
+
+    def _normalizeParseActionArgs( f ):
+        """Internal method used to decorate parse actions that take fewer than 3 arguments,
+           so that all parse actions can be called as f(s,l,t)."""
+        STAR_ARGS = 4
+
+        try:
+            restore = None
+            if isinstance(f,type):
+                restore = f
+                f = f.__init__
+            if not _PY3K:
+                codeObj = f.func_code
+            else:
+                codeObj = f.code
+            if codeObj.co_flags & STAR_ARGS:
+                return f
+            numargs = codeObj.co_argcount
+            if not _PY3K:
+                if hasattr(f,"im_self"):
+                    numargs -= 1
+            else:
+                if hasattr(f,"__self__"):
+                    numargs -= 1
+            if restore:
+                f = restore
+        except AttributeError:
+            try:
+                if not _PY3K:
+                    call_im_func_code = f.__call__.im_func.func_code
+                else:
+                    call_im_func_code = f.__code__
+
+                # not a function, must be a callable object, get info from the
+                # im_func binding of its bound __call__ method
+                if call_im_func_code.co_flags & STAR_ARGS:
+                    return f
+                numargs = call_im_func_code.co_argcount
+                if not _PY3K:
+                    if hasattr(f.__call__,"im_self"):
+                        numargs -= 1
+                else:
+                    if hasattr(f.__call__,"__self__"):
+                        numargs -= 0
+            except AttributeError:
+                if not _PY3K:
+                    call_func_code = f.__call__.func_code
+                else:
+                    call_func_code = f.__call__.__code__
+                # not a bound method, get info directly from __call__ method
+                if call_func_code.co_flags & STAR_ARGS:
+                    return f
+                numargs = call_func_code.co_argcount
+                if not _PY3K:
+                    if hasattr(f.__call__,"im_self"):
+                        numargs -= 1
+                else:
+                    if hasattr(f.__call__,"__self__"):
+                        numargs -= 1
+
+
+        #~ print ("adding function %s with %d args" % (f.func_name,numargs))
+        if numargs == 3:
+            return f
+        else:
+            if numargs > 3:
+                def tmp(s,l,t):
+                    return f(f.__call__.__self__, s,l,t)
+            if numargs == 2:
+                def tmp(s,l,t):
+                    return f(l,t)
+            elif numargs == 1:
+                def tmp(s,l,t):
+                    return f(t)
+            else: #~ numargs == 0:
+                def tmp(s,l,t):
+                    return f()
+            try:
+                tmp.__name__ = f.__name__
+            except (AttributeError,TypeError):
+                # no need for special handling if attribute doesnt exist
+                pass
+            try:
+                tmp.__doc__ = f.__doc__
+            except (AttributeError,TypeError):
+                # no need for special handling if attribute doesnt exist
+                pass
+            try:
+                tmp.__dict__.update(f.__dict__)
+            except (AttributeError,TypeError):
+                # no need for special handling if attribute doesnt exist
+                pass
+            return tmp
+    _normalizeParseActionArgs = staticmethod(_normalizeParseActionArgs)
+
+    def setParseAction( self, *fns, **kwargs ):
+        """Define action to perform when successfully matching parse element definition.
+           Parse action fn is a callable method with 0-3 arguments, called as fn(s,loc,toks),
+           fn(loc,toks), fn(toks), or just fn(), where:
+            - s   = the original string being parsed (see note below)
+            - loc = the location of the matching substring
+            - toks = a list of the matched tokens, packaged as a ParseResults object
+           If the functions in fns modify the tokens, they can return them as the return
+           value from fn, and the modified list of tokens will replace the original.
+           Otherwise, fn does not need to return any value.
+
+           Note: the default parsing behavior is to expand tabs in the input string
+           before starting the parsing process.  See L{I{parseString}<parseString>} for more information
+           on parsing strings containing <TAB>s, and suggested methods to maintain a
+           consistent view of the parsed string, the parse location, and line and column
+           positions within the parsed string.
+           """
+        self.parseAction = list(map(self._normalizeParseActionArgs, list(fns)))
+        self.callDuringTry = ("callDuringTry" in kwargs and kwargs["callDuringTry"])
+        return self
+
+    def addParseAction( self, *fns, **kwargs ):
+        """Add parse action to expression's list of parse actions. See L{I{setParseAction}<setParseAction>}."""
+        self.parseAction += list(map(self._normalizeParseActionArgs, list(fns)))
+        self.callDuringTry = self.callDuringTry or ("callDuringTry" in kwargs and kwargs["callDuringTry"])
+        return self
+
+    def setFailAction( self, fn ):
+        """Define action to perform if parsing fails at this expression.
+           Fail acton fn is a callable function that takes the arguments
+           fn(s,loc,expr,err) where:
+            - s = string being parsed
+            - loc = location where expression match was attempted and failed
+            - expr = the parse expression that failed
+            - err = the exception thrown
+           The function returns no value.  It may throw ParseFatalException
+           if it is desired to stop parsing immediately."""
+        self.failAction = fn
+        return self
+
+    def _skipIgnorables( self, instring, loc ):
+        exprsFound = True
+        while exprsFound:
+            exprsFound = False
+            for e in self.ignoreExprs:
+                try:
+                    while 1:
+                        loc,dummy = e._parse( instring, loc )
+                        exprsFound = True
+                except ParseException:
+                    pass
+        return loc
+
+    def preParse( self, instring, loc ):
+        if self.ignoreExprs:
+            loc = self._skipIgnorables( instring, loc )
+
+        if self.skipWhitespace:
+            wt = self.whiteChars
+            instrlen = len(instring)
+            while loc < instrlen and instring[loc] in wt:
+                loc += 1
+
+        return loc
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        return loc, []
+
+    def postParse( self, instring, loc, tokenlist ):
+        return tokenlist
+
+    #~ @profile
+    def _parseNoCache( self, instring, loc, doActions=True, callPreParse=True ):
+        debugging = ( self.debug ) #and doActions )
+
+        if debugging or self.failAction:
+            #~ print ("Match",self,"at loc",loc,"(%d,%d)" % ( lineno(loc,instring), col(loc,instring) ))
+            if (self.debugActions[0] ):
+                self.debugActions[0]( instring, loc, self )
+            if callPreParse and self.callPreparse:
+                preloc = self.preParse( instring, loc )
+            else:
+                preloc = loc
+            tokensStart = loc
+            try:
+                try:
+                    loc,tokens = self.parseImpl( instring, preloc, doActions )
+                except IndexError:
+                    raise ParseException( instring, len(instring), self.errmsg, self )
+            except ParseBaseException, err:
+                #~ print ("Exception raised:", err)
+                if self.debugActions[2]:
+                    self.debugActions[2]( instring, tokensStart, self, err )
+                if self.failAction:
+                    self.failAction( instring, tokensStart, self, err )
+                raise
+        else:
+            if callPreParse and self.callPreparse:
+                preloc = self.preParse( instring, loc )
+            else:
+                preloc = loc
+            tokensStart = loc
+            if self.mayIndexError or loc >= len(instring):
+                try:
+                    loc,tokens = self.parseImpl( instring, preloc, doActions )
+                except IndexError:
+                    raise ParseException( instring, len(instring), self.errmsg, self )
+            else:
+                loc,tokens = self.parseImpl( instring, preloc, doActions )
+
+        tokens = self.postParse( instring, loc, tokens )
+
+        retTokens = ParseResults( tokens, self.resultsName, asList=self.saveAsList, modal=self.modalResults )
+        if self.parseAction and (doActions or self.callDuringTry):
+            if debugging:
+                try:
+                    for fn in self.parseAction:
+                        tokens = fn( instring, tokensStart, retTokens )
+                        if tokens is not None:
+                            retTokens = ParseResults( tokens,
+                                                      self.resultsName,
+                                                      asList=self.saveAsList and isinstance(tokens,(ParseResults,list)),
+                                                      modal=self.modalResults )
+                except ParseBaseException, err:
+                    #~ print "Exception raised in user parse action:", err
+                    if (self.debugActions[2] ):
+                        self.debugActions[2]( instring, tokensStart, self, err )
+                    raise
+            else:
+                for fn in self.parseAction:
+                    tokens = fn( instring, tokensStart, retTokens )
+                    if tokens is not None:
+                        retTokens = ParseResults( tokens,
+                                                  self.resultsName,
+                                                  asList=self.saveAsList and isinstance(tokens,(ParseResults,list)),
+                                                  modal=self.modalResults )
+
+        if debugging:
+            #~ print ("Matched",self,"->",retTokens.asList())
+            if (self.debugActions[1] ):
+                self.debugActions[1]( instring, tokensStart, loc, self, retTokens )
+
+        return loc, retTokens
+
+    def tryParse( self, instring, loc ):
+        try:
+            return self._parse( instring, loc, doActions=False )[0]
+        except ParseFatalException:
+            raise ParseException( instring, loc, self.errmsg, self)
+
+    # this method gets repeatedly called during backtracking with the same arguments -
+    # we can cache these arguments and save ourselves the trouble of re-parsing the contained expression
+    def _parseCache( self, instring, loc, doActions=True, callPreParse=True ):
+        lookup = (self,instring,loc,callPreParse,doActions)
+        if lookup in ParserElement._exprArgCache:
+            value = ParserElement._exprArgCache[ lookup ]
+            if isinstance(value,Exception):
+                raise value
+            return value
+        else:
+            try:
+                value = self._parseNoCache( instring, loc, doActions, callPreParse )
+                ParserElement._exprArgCache[ lookup ] = (value[0],value[1].copy())
+                return value
+            except ParseBaseException, pe:
+                ParserElement._exprArgCache[ lookup ] = pe
+                raise
+
+    _parse = _parseNoCache
+
+    # argument cache for optimizing repeated calls when backtracking through recursive expressions
+    _exprArgCache = {}
+    def resetCache():
+        ParserElement._exprArgCache.clear()
+    resetCache = staticmethod(resetCache)
+
+    _packratEnabled = False
+    def enablePackrat():
+        """Enables "packrat" parsing, which adds memoizing to the parsing logic.
+           Repeated parse attempts at the same string location (which happens
+           often in many complex grammars) can immediately return a cached value,
+           instead of re-executing parsing/validating code.  Memoizing is done of
+           both valid results and parsing exceptions.
+
+           This speedup may break existing programs that use parse actions that
+           have side-effects.  For this reason, packrat parsing is disabled when
+           you first import pyparsing.  To activate the packrat feature, your
+           program must call the class method ParserElement.enablePackrat().  If
+           your program uses psyco to "compile as you go", you must call
+           enablePackrat before calling psyco.full().  If you do not do this,
+           Python will crash.  For best results, call enablePackrat() immediately
+           after importing pyparsing.
+        """
+        if not ParserElement._packratEnabled:
+            ParserElement._packratEnabled = True
+            ParserElement._parse = ParserElement._parseCache
+    enablePackrat = staticmethod(enablePackrat)
+
+    def parseString( self, instring, parseAll=False ):
+        """Execute the parse expression with the given string.
+           This is the main interface to the client code, once the complete
+           expression has been built.
+
+           If you want the grammar to require that the entire input string be
+           successfully parsed, then set parseAll to True (equivalent to ending
+           the grammar with StringEnd()).
+
+           Note: parseString implicitly calls expandtabs() on the input string,
+           in order to report proper column numbers in parse actions.
+           If the input string contains tabs and
+           the grammar uses parse actions that use the loc argument to index into the
+           string being parsed, you can ensure you have a consistent view of the input
+           string by:
+            - calling parseWithTabs on your grammar before calling parseString
+              (see L{I{parseWithTabs}<parseWithTabs>})
+            - define your parse action using the full (s,loc,toks) signature, and
+              reference the input string using the parse action's s argument
+            - explictly expand the tabs in your input string before calling
+              parseString
+        """
+        ParserElement.resetCache()
+        if not self.streamlined:
+            self.streamline()
+            #~ self.saveAsList = True
+        for e in self.ignoreExprs:
+            e.streamline()
+        if not self.keepTabs:
+            instring = instring.expandtabs()
+        loc, tokens = self._parse( instring, 0 )
+        if parseAll:
+            StringEnd()._parse( instring, loc )
+        return tokens
+
+    def scanString( self, instring, maxMatches=_MAX_INT ):
+        """Scan the input string for expression matches.  Each match will return the
+           matching tokens, start location, and end location.  May be called with optional
+           maxMatches argument, to clip scanning after 'n' matches are found.
+
+           Note that the start and end locations are reported relative to the string
+           being parsed.  See L{I{parseString}<parseString>} for more information on parsing
+           strings with embedded tabs."""
+        if not self.streamlined:
+            self.streamline()
+        for e in self.ignoreExprs:
+            e.streamline()
+
+        if not self.keepTabs:
+            instring = _ustr(instring).expandtabs()
+        instrlen = len(instring)
+        loc = 0
+        preparseFn = self.preParse
+        parseFn = self._parse
+        ParserElement.resetCache()
+        matches = 0
+        while loc <= instrlen and matches < maxMatches:
+            try:
+                preloc = preparseFn( instring, loc )
+                nextLoc,tokens = parseFn( instring, preloc, callPreParse=False )
+            except ParseException:
+                loc = preloc+1
+            else:
+                matches += 1
+                yield tokens, preloc, nextLoc
+                loc = nextLoc
+
+    def transformString( self, instring ):
+        """Extension to scanString, to modify matching text with modified tokens that may
+           be returned from a parse action.  To use transformString, define a grammar and
+           attach a parse action to it that modifies the returned token list.
+           Invoking transformString() on a target string will then scan for matches,
+           and replace the matched text patterns according to the logic in the parse
+           action.  transformString() returns the resulting transformed string."""
+        out = []
+        lastE = 0
+        # force preservation of <TAB>s, to minimize unwanted transformation of string, and to
+        # keep string locs straight between transformString and scanString
+        self.keepTabs = True
+        for t,s,e in self.scanString( instring ):
+            out.append( instring[lastE:s] )
+            if t:
+                if isinstance(t,ParseResults):
+                    out += t.asList()
+                elif isinstance(t,list):
+                    out += t
+                else:
+                    out.append(t)
+            lastE = e
+        out.append(instring[lastE:])
+        return "".join(map(_ustr,out))
+
+    def searchString( self, instring, maxMatches=_MAX_INT ):
+        """Another extension to scanString, simplifying the access to the tokens found
+           to match the given parse expression.  May be called with optional
+           maxMatches argument, to clip searching after 'n' matches are found.
+        """
+        return ParseResults([ t for t,s,e in self.scanString( instring, maxMatches ) ])
+
+    def __add__(self, other ):
+        """Implementation of + operator - returns And"""
+        if isinstance( other, basestring ):
+            other = Literal( other )
+        if not isinstance( other, ParserElement ):
+            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
+                    SyntaxWarning, stacklevel=2)
+            return None
+        return And( [ self, other ] )
+
+    def __radd__(self, other ):
+        """Implementation of + operator when left operand is not a ParserElement"""
+        if isinstance( other, basestring ):
+            other = Literal( other )
+        if not isinstance( other, ParserElement ):
+            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
+                    SyntaxWarning, stacklevel=2)
+            return None
+        return other + self
+
+    def __sub__(self, other):
+        """Implementation of - operator, returns And with error stop"""
+        if isinstance( other, basestring ):
+            other = Literal( other )
+        if not isinstance( other, ParserElement ):
+            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
+                    SyntaxWarning, stacklevel=2)
+            return None
+        return And( [ self, And._ErrorStop(), other ] )
+
+    def __rsub__(self, other ):
+        """Implementation of - operator when left operand is not a ParserElement"""
+        if isinstance( other, basestring ):
+            other = Literal( other )
+        if not isinstance( other, ParserElement ):
+            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
+                    SyntaxWarning, stacklevel=2)
+            return None
+        return other - self
+
+    def __mul__(self,other):
+        if isinstance(other,int):
+            minElements, optElements = other,0
+        elif isinstance(other,tuple):
+            if len(other)==0:
+                other = (None,None)
+            elif len(other)==1:
+                other = (other[0],None)
+            if len(other)==2:
+                if other[0] is None:
+                    other = (0, other[1])
+                if isinstance(other[0],int) and other[1] is None:
+                    if other[0] == 0:
+                        return ZeroOrMore(self)
+                    if other[0] == 1:
+                        return OneOrMore(self)
+                    else:
+                        return self*other[0] + ZeroOrMore(self)
+                elif isinstance(other[0],int) and isinstance(other[1],int):
+                    minElements, optElements = other
+                    optElements -= minElements
+                else:
+                    raise TypeError("cannot multiply 'ParserElement' and ('%s','%s') objects", type(other[0]),type(other[1]))
+            else:
+                raise TypeError("can only multiply 'ParserElement' and int or (int,int) objects")
+        else:
+            raise TypeError("cannot multiply 'ParserElement' and '%s' objects", type(other))
+
+        if minElements < 0:
+            raise ValueError("cannot multiply ParserElement by negative value")
+        if optElements < 0:
+            raise ValueError("second tuple value must be greater or equal to first tuple value")
+        if minElements == optElements == 0:
+            raise ValueError("cannot multiply ParserElement by 0 or (0,0)")
+
+        if (optElements):
+            def makeOptionalList(n):
+                if n>1:
+                    return Optional(self + makeOptionalList(n-1))
+                else:
+                    return Optional(self)
+            if minElements:
+                if minElements == 1:
+                    ret = self + makeOptionalList(optElements)
+                else:
+                    ret = And([self]*minElements) + makeOptionalList(optElements)
+            else:
+                ret = makeOptionalList(optElements)
+        else:
+            if minElements == 1:
+                ret = self
+            else:
+                ret = And([self]*minElements)
+        return ret
+
+    def __rmul__(self, other):
+        return self.__mul__(other)
+
+    def __or__(self, other ):
+        """Implementation of | operator - returns MatchFirst"""
+        if isinstance( other, basestring ):
+            other = Literal( other )
+        if not isinstance( other, ParserElement ):
+            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
+                    SyntaxWarning, stacklevel=2)
+            return None
+        return MatchFirst( [ self, other ] )
+
+    def __ror__(self, other ):
+        """Implementation of | operator when left operand is not a ParserElement"""
+        if isinstance( other, basestring ):
+            other = Literal( other )
+        if not isinstance( other, ParserElement ):
+            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
+                    SyntaxWarning, stacklevel=2)
+            return None
+        return other | self
+
+    def __xor__(self, other ):
+        """Implementation of ^ operator - returns Or"""
+        if isinstance( other, basestring ):
+            other = Literal( other )
+        if not isinstance( other, ParserElement ):
+            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
+                    SyntaxWarning, stacklevel=2)
+            return None
+        return Or( [ self, other ] )
+
+    def __rxor__(self, other ):
+        """Implementation of ^ operator when left operand is not a ParserElement"""
+        if isinstance( other, basestring ):
+            other = Literal( other )
+        if not isinstance( other, ParserElement ):
+            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
+                    SyntaxWarning, stacklevel=2)
+            return None
+        return other ^ self
+
+    def __and__(self, other ):
+        """Implementation of & operator - returns Each"""
+        if isinstance( other, basestring ):
+            other = Literal( other )
+        if not isinstance( other, ParserElement ):
+            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
+                    SyntaxWarning, stacklevel=2)
+            return None
+        return Each( [ self, other ] )
+
+    def __rand__(self, other ):
+        """Implementation of & operator when left operand is not a ParserElement"""
+        if isinstance( other, basestring ):
+            other = Literal( other )
+        if not isinstance( other, ParserElement ):
+            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
+                    SyntaxWarning, stacklevel=2)
+            return None
+        return other & self
+
+    def __invert__( self ):
+        """Implementation of ~ operator - returns NotAny"""
+        return NotAny( self )
+
+    def __call__(self, name):
+        """Shortcut for setResultsName, with listAllMatches=default::
+             userdata = Word(alphas).setResultsName("name") + Word(nums+"-").setResultsName("socsecno")
+           could be written as::
+             userdata = Word(alphas)("name") + Word(nums+"-")("socsecno")
+           """
+        return self.setResultsName(name)
+
+    def suppress( self ):
+        """Suppresses the output of this ParserElement; useful to keep punctuation from
+           cluttering up returned output.
+        """
+        return Suppress( self )
+
+    def leaveWhitespace( self ):
+        """Disables the skipping of whitespace before matching the characters in the
+           ParserElement's defined pattern.  This is normally only used internally by
+           the pyparsing module, but may be needed in some whitespace-sensitive grammars.
+        """
+        self.skipWhitespace = False
+        return self
+
+    def setWhitespaceChars( self, chars ):
+        """Overrides the default whitespace chars
+        """
+        self.skipWhitespace = True
+        self.whiteChars = chars
+        self.copyDefaultWhiteChars = False
+        return self
+
+    def parseWithTabs( self ):
+        """Overrides default behavior to expand <TAB>s to spaces before parsing the input string.
+           Must be called before parseString when the input grammar contains elements that
+           match <TAB> characters."""
+        self.keepTabs = True
+        return self
+
+    def ignore( self, other ):
+        """Define expression to be ignored (e.g., comments) while doing pattern
+           matching; may be called repeatedly, to define multiple comment or other
+           ignorable patterns.
+        """
+        if isinstance( other, Suppress ):
+            if other not in self.ignoreExprs:
+                self.ignoreExprs.append( other )
+        else:
+            self.ignoreExprs.append( Suppress( other ) )
+        return self
+
+    def setDebugActions( self, startAction, successAction, exceptionAction ):
+        """Enable display of debugging messages while doing pattern matching."""
+        self.debugActions = (startAction or _defaultStartDebugAction,
+                             successAction or _defaultSuccessDebugAction,
+                             exceptionAction or _defaultExceptionDebugAction)
+        self.debug = True
+        return self
+
+    def setDebug( self, flag=True ):
+        """Enable display of debugging messages while doing pattern matching.
+           Set flag to True to enable, False to disable."""
+        if flag:
+            self.setDebugActions( _defaultStartDebugAction, _defaultSuccessDebugAction, _defaultExceptionDebugAction )
+        else:
+            self.debug = False
+        return self
+
+    def __str__( self ):
+        return self.name
+
+    def __repr__( self ):
+        return _ustr(self)
+
+    def streamline( self ):
+        self.streamlined = True
+        self.strRepr = None
+        return self
+
+    def checkRecursion( self, parseElementList ):
+        pass
+
+    def validate( self, validateTrace=[] ):
+        """Check defined expressions for valid structure, check for infinite recursive definitions."""
+        self.checkRecursion( [] )
+
+    def parseFile( self, file_or_filename ):
+        """Execute the parse expression on the given file or filename.
+           If a filename is specified (instead of a file object),
+           the entire file is opened, read, and closed before parsing.
+        """
+        try:
+            file_contents = file_or_filename.read()
+        except AttributeError:
+            f = open(file_or_filename, "rb")
+            file_contents = f.read()
+            f.close()
+        return self.parseString(file_contents)
+
+    def getException(self):
+        return ParseException("",0,self.errmsg,self)
+
+    def __getattr__(self,aname):
+        if aname == "myException":
+            self.myException = ret = self.getException();
+            return ret;
+        else:
+            raise AttributeError("no such attribute " + aname)
+
+    def __eq__(self,other):
+        if isinstance(other, basestring):
+            try:
+                (self + StringEnd()).parseString(_ustr(other))
+                return True
+            except ParseBaseException:
+                return False
+        else:
+            return super(ParserElement,self)==other
+
+    def __hash__(self):
+        return hash(id(self))
+
+    def __req__(self,other):
+        return self == other
+
+
+class Token(ParserElement):
+    """Abstract ParserElement subclass, for defining atomic matching patterns."""
+    def __init__( self ):
+        super(Token,self).__init__( savelist=False )
+        #self.myException = ParseException("",0,"",self)
+
+    def setName(self, name):
+        s = super(Token,self).setName(name)
+        self.errmsg = "Expected " + self.name
+        #s.myException.msg = self.errmsg
+        return s
+
+
+class Empty(Token):
+    """An empty token, will always match."""
+    def __init__( self ):
+        super(Empty,self).__init__()
+        self.name = "Empty"
+        self.mayReturnEmpty = True
+        self.mayIndexError = False
+
+
+class NoMatch(Token):
+    """A token that will never match."""
+    def __init__( self ):
+        super(NoMatch,self).__init__()
+        self.name = "NoMatch"
+        self.mayReturnEmpty = True
+        self.mayIndexError = False
+        self.errmsg = "Unmatchable token"
+        #self.myException.msg = self.errmsg
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        exc = self.myException
+        exc.loc = loc
+        exc.pstr = instring
+        raise exc
+
+
+class Literal(Token):
+    """Token to exactly match a specified string."""
+    def __init__( self, matchString ):
+        super(Literal,self).__init__()
+        self.match = matchString
+        self.matchLen = len(matchString)
+        try:
+            self.firstMatchChar = matchString[0]
+        except IndexError:
+            warnings.warn("null string passed to Literal; use Empty() instead",
+                            SyntaxWarning, stacklevel=2)
+            self.__class__ = Empty
+        self.name = '"%s"' % _ustr(self.match)
+        self.errmsg = "Expected " + self.name
+        self.mayReturnEmpty = False
+        #self.myException.msg = self.errmsg
+        self.mayIndexError = False
+
+    # Performance tuning: this routine gets called a *lot*
+    # if this is a single character match string  and the first character matches,
+    # short-circuit as quickly as possible, and avoid calling startswith
+    #~ @profile
+    def parseImpl( self, instring, loc, doActions=True ):
+        if (instring[loc] == self.firstMatchChar and
+            (self.matchLen==1 or instring.startswith(self.match,loc)) ):
+            return loc+self.matchLen, self.match
+        #~ raise ParseException( instring, loc, self.errmsg )
+        exc = self.myException
+        exc.loc = loc
+        exc.pstr = instring
+        raise exc
+_L = Literal
+
+class Keyword(Token):
+    """Token to exactly match a specified string as a keyword, that is, it must be
+       immediately followed by a non-keyword character.  Compare with Literal::
+         Literal("if") will match the leading 'if' in 'ifAndOnlyIf'.
+         Keyword("if") will not; it will only match the leading 'if in 'if x=1', or 'if(y==2)'
+       Accepts two optional constructor arguments in addition to the keyword string:
+       identChars is a string of characters that would be valid identifier characters,
+       defaulting to all alphanumerics + "_" and "$"; caseless allows case-insensitive
+       matching, default is False.
+    """
+    DEFAULT_KEYWORD_CHARS = alphanums+"_$"
+
+    def __init__( self, matchString, identChars=DEFAULT_KEYWORD_CHARS, caseless=False ):
+        super(Keyword,self).__init__()
+        self.match = matchString
+        self.matchLen = len(matchString)
+        try:
+            self.firstMatchChar = matchString[0]
+        except IndexError:
+            warnings.warn("null string passed to Keyword; use Empty() instead",
+                            SyntaxWarning, stacklevel=2)
+        self.name = '"%s"' % self.match
+        self.errmsg = "Expected " + self.name
+        self.mayReturnEmpty = False
+        #self.myException.msg = self.errmsg
+        self.mayIndexError = False
+        self.caseless = caseless
+        if caseless:
+            self.caselessmatch = matchString.upper()
+            identChars = identChars.upper()
+        self.identChars = _str2dict(identChars)
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if self.caseless:
+            if ( (instring[ loc:loc+self.matchLen ].upper() == self.caselessmatch) and
+                 (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen].upper() not in self.identChars) and
+                 (loc == 0 or instring[loc-1].upper() not in self.identChars) ):
+                return loc+self.matchLen, self.match
+        else:
+            if (instring[loc] == self.firstMatchChar and
+                (self.matchLen==1 or instring.startswith(self.match,loc)) and
+                (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen] not in self.identChars) and
+                (loc == 0 or instring[loc-1] not in self.identChars) ):
+                return loc+self.matchLen, self.match
+        #~ raise ParseException( instring, loc, self.errmsg )
+        exc = self.myException
+        exc.loc = loc
+        exc.pstr = instring
+        raise exc
+
+    def copy(self):
+        c = super(Keyword,self).copy()
+        c.identChars = Keyword.DEFAULT_KEYWORD_CHARS
+        return c
+
+    def setDefaultKeywordChars( chars ):
+        """Overrides the default Keyword chars
+        """
+        Keyword.DEFAULT_KEYWORD_CHARS = chars
+    setDefaultKeywordChars = staticmethod(setDefaultKeywordChars)
+
+
+class CaselessLiteral(Literal):
+    """Token to match a specified string, ignoring case of letters.
+       Note: the matched results will always be in the case of the given
+       match string, NOT the case of the input text.
+    """
+    def __init__( self, matchString ):
+        super(CaselessLiteral,self).__init__( matchString.upper() )
+        # Preserve the defining literal.
+        self.returnString = matchString
+        self.name = "'%s'" % self.returnString
+        self.errmsg = "Expected " + self.name
+        #self.myException.msg = self.errmsg
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if instring[ loc:loc+self.matchLen ].upper() == self.match:
+            return loc+self.matchLen, self.returnString
+        #~ raise ParseException( instring, loc, self.errmsg )
+        exc = self.myException
+        exc.loc = loc
+        exc.pstr = instring
+        raise exc
+
+class CaselessKeyword(Keyword):
+    def __init__( self, matchString, identChars=Keyword.DEFAULT_KEYWORD_CHARS ):
+        super(CaselessKeyword,self).__init__( matchString, identChars, caseless=True )
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if ( (instring[ loc:loc+self.matchLen ].upper() == self.caselessmatch) and
+             (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen].upper() not in self.identChars) ):
+            return loc+self.matchLen, self.match
+        #~ raise ParseException( instring, loc, self.errmsg )
+        exc = self.myException
+        exc.loc = loc
+        exc.pstr = instring
+        raise exc
+
+class Word(Token):
+    """Token for matching words composed of allowed character sets.
+       Defined with string containing all allowed initial characters,
+       an optional string containing allowed body characters (if omitted,
+       defaults to the initial character set), and an optional minimum,
+       maximum, and/or exact length.  The default value for min is 1 (a
+       minimum value < 1 is not valid); the default values for max and exact
+       are 0, meaning no maximum or exact length restriction.
+    """
+    def __init__( self, initChars, bodyChars=None, min=1, max=0, exact=0, asKeyword=False ):
+        super(Word,self).__init__()
+        self.initCharsOrig = initChars
+        self.initChars = _str2dict(initChars)
+        if bodyChars :
+            self.bodyCharsOrig = bodyChars
+            self.bodyChars = _str2dict(bodyChars)
+        else:
+            self.bodyCharsOrig = initChars
+            self.bodyChars = _str2dict(initChars)
+
+        self.maxSpecified = max > 0
+
+        if min < 1:
+            raise ValueError("cannot specify a minimum length < 1; use Optional(Word()) if zero-length word is permitted")
+
+        self.minLen = min
+
+        if max > 0:
+            self.maxLen = max
+        else:
+            self.maxLen = _MAX_INT
+
+        if exact > 0:
+            self.maxLen = exact
+            self.minLen = exact
+
+        self.name = _ustr(self)
+        self.errmsg = "Expected " + self.name
+        #self.myException.msg = self.errmsg
+        self.mayIndexError = False
+        self.asKeyword = asKeyword
+
+        if ' ' not in self.initCharsOrig+self.bodyCharsOrig and (min==1 and max==0 and exact==0):
+            if self.bodyCharsOrig == self.initCharsOrig:
+                self.reString = "[%s]+" % _escapeRegexRangeChars(self.initCharsOrig)
+            elif len(self.bodyCharsOrig) == 1:
+                self.reString = "%s[%s]*" % \
+                                      (re.escape(self.initCharsOrig),
+                                      _escapeRegexRangeChars(self.bodyCharsOrig),)
+            else:
+                self.reString = "[%s][%s]*" % \
+                                      (_escapeRegexRangeChars(self.initCharsOrig),
+                                      _escapeRegexRangeChars(self.bodyCharsOrig),)
+            if self.asKeyword:
+                self.reString = r"\b"+self.reString+r"\b"
+            try:
+                self.re = re.compile( self.reString )
+            except:
+                self.re = None
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if self.re:
+            result = self.re.match(instring,loc)
+            if not result:
+                exc = self.myException
+                exc.loc = loc
+                exc.pstr = instring
+                raise exc
+
+            loc = result.end()
+            return loc,result.group()
+
+        if not(instring[ loc ] in self.initChars):
+            #~ raise ParseException( instring, loc, self.errmsg )
+            exc = self.myException
+            exc.loc = loc
+            exc.pstr = instring
+            raise exc
+        start = loc
+        loc += 1
+        instrlen = len(instring)
+        bodychars = self.bodyChars
+        maxloc = start + self.maxLen
+        maxloc = min( maxloc, instrlen )
+        while loc < maxloc and instring[loc] in bodychars:
+            loc += 1
+
+        throwException = False
+        if loc - start < self.minLen:
+            throwException = True
+        if self.maxSpecified and loc < instrlen and instring[loc] in bodychars:
+            throwException = True
+        if self.asKeyword:
+            if (start>0 and instring[start-1] in bodychars) or (loc<instrlen and instring[loc] in bodychars):
+                throwException = True
+
+        if throwException:
+            #~ raise ParseException( instring, loc, self.errmsg )
+            exc = self.myException
+            exc.loc = loc
+            exc.pstr = instring
+            raise exc
+
+        return loc, instring[start:loc]
+
+    def __str__( self ):
+        try:
+            return super(Word,self).__str__()
+        except:
+            pass
+
+
+        if self.strRepr is None:
+
+            def charsAsStr(s):
+                if len(s)>4:
+                    return s[:4]+"..."
+                else:
+                    return s
+
+            if ( self.initCharsOrig != self.bodyCharsOrig ):
+                self.strRepr = "W:(%s,%s)" % ( charsAsStr(self.initCharsOrig), charsAsStr(self.bodyCharsOrig) )
+            else:
+                self.strRepr = "W:(%s)" % charsAsStr(self.initCharsOrig)
+
+        return self.strRepr
+
+
+class Regex(Token):
+    """Token for matching strings that match a given regular expression.
+       Defined with string specifying the regular expression in a form recognized by the inbuilt Python re module.
+    """
+    def __init__( self, pattern, flags=0):
+        """The parameters pattern and flags are passed to the re.compile() function as-is. See the Python re module for an explanation of the acceptable patterns and flags."""
+        super(Regex,self).__init__()
+
+        if len(pattern) == 0:
+            warnings.warn("null string passed to Regex; use Empty() instead",
+                    SyntaxWarning, stacklevel=2)
+
+        self.pattern = pattern
+        self.flags = flags
+
+        try:
+            self.re = re.compile(self.pattern, self.flags)
+            self.reString = self.pattern
+        except sre_constants.error:
+            warnings.warn("invalid pattern (%s) passed to Regex" % pattern,
+                SyntaxWarning, stacklevel=2)
+            raise
+
+        self.name = _ustr(self)
+        self.errmsg = "Expected " + self.name
+        #self.myException.msg = self.errmsg
+        self.mayIndexError = False
+        self.mayReturnEmpty = True
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        result = self.re.match(instring,loc)
+        if not result:
+            exc = self.myException
+            exc.loc = loc
+            exc.pstr = instring
+            raise exc
+
+        loc = result.end()
+        d = result.groupdict()
+        ret = ParseResults(result.group())
+        if d:
+            for k in d:
+                ret[k] = d[k]
+        return loc,ret
+
+    def __str__( self ):
+        try:
+            return super(Regex,self).__str__()
+        except:
+            pass
+
+        if self.strRepr is None:
+            self.strRepr = "Re:(%s)" % repr(self.pattern)
+
+        return self.strRepr
+
+
+class QuotedString(Token):
+    """Token for matching strings that are delimited by quoting characters.
+    """
+    def __init__( self, quoteChar, escChar=None, escQuote=None, multiline=False, unquoteResults=True, endQuoteChar=None):
+        """
+           Defined with the following parameters:
+            - quoteChar - string of one or more characters defining the quote delimiting string
+            - escChar - character to escape quotes, typically backslash (default=None)
+            - escQuote - special quote sequence to escape an embedded quote string (such as SQL's "" to escape an embedded ") (default=None)
+            - multiline - boolean indicating whether quotes can span multiple lines (default=False)
+            - unquoteResults - boolean indicating whether the matched text should be unquoted (default=True)
+            - endQuoteChar - string of one or more characters defining the end of the quote delimited string (default=None => same as quoteChar)
+        """
+        super(QuotedString,self).__init__()
+
+        # remove white space from quote chars - wont work anyway
+        quoteChar = quoteChar.strip()
+        if len(quoteChar) == 0:
+            warnings.warn("quoteChar cannot be the empty string",SyntaxWarning,stacklevel=2)
+            raise SyntaxError()
+
+        if endQuoteChar is None:
+            endQuoteChar = quoteChar
+        else:
+            endQuoteChar = endQuoteChar.strip()
+            if len(endQuoteChar) == 0:
+                warnings.warn("endQuoteChar cannot be the empty string",SyntaxWarning,stacklevel=2)
+                raise SyntaxError()
+
+        self.quoteChar = quoteChar
+        self.quoteCharLen = len(quoteChar)
+        self.firstQuoteChar = quoteChar[0]
+        self.endQuoteChar = endQuoteChar
+        self.endQuoteCharLen = len(endQuoteChar)
+        self.escChar = escChar
+        self.escQuote = escQuote
+        self.unquoteResults = unquoteResults
+
+        if multiline:
+            self.flags = re.MULTILINE | re.DOTALL
+            self.pattern = r'%s(?:[^%s%s]' % \
+                ( re.escape(self.quoteChar),
+                  _escapeRegexRangeChars(self.endQuoteChar[0]),
+                  (escChar is not None and _escapeRegexRangeChars(escChar) or '') )
+        else:
+            self.flags = 0
+            self.pattern = r'%s(?:[^%s\n\r%s]' % \
+                ( re.escape(self.quoteChar),
+                  _escapeRegexRangeChars(self.endQuoteChar[0]),
+                  (escChar is not None and _escapeRegexRangeChars(escChar) or '') )
+        if len(self.endQuoteChar) > 1:
+            self.pattern += (
+                '|(?:' + ')|(?:'.join(["%s[^%s]" % (re.escape(self.endQuoteChar[:i]),
+                                               _escapeRegexRangeChars(self.endQuoteChar[i]))
+                                    for i in range(len(self.endQuoteChar)-1,0,-1)]) + ')'
+                )
+        if escQuote:
+            self.pattern += (r'|(?:%s)' % re.escape(escQuote))
+        if escChar:
+            self.pattern += (r'|(?:%s.)' % re.escape(escChar))
+            self.escCharReplacePattern = re.escape(self.escChar)+"(.)"
+        self.pattern += (r')*%s' % re.escape(self.endQuoteChar))
+
+        try:
+            self.re = re.compile(self.pattern, self.flags)
+            self.reString = self.pattern
+        except sre_constants.error:
+            warnings.warn("invalid pattern (%s) passed to Regex" % self.pattern,
+                SyntaxWarning, stacklevel=2)
+            raise
+
+        self.name = _ustr(self)
+        self.errmsg = "Expected " + self.name
+        #self.myException.msg = self.errmsg
+        self.mayIndexError = False
+        self.mayReturnEmpty = True
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        result = instring[loc] == self.firstQuoteChar and self.re.match(instring,loc) or None
+        if not result:
+            exc = self.myException
+            exc.loc = loc
+            exc.pstr = instring
+            raise exc
+
+        loc = result.end()
+        ret = result.group()
+
+        if self.unquoteResults:
+
+            # strip off quotes
+            ret = ret[self.quoteCharLen:-self.endQuoteCharLen]
+
+            if isinstance(ret,basestring):
+                # replace escaped characters
+                if self.escChar:
+                    ret = re.sub(self.escCharReplacePattern,"\g<1>",ret)
+
+                # replace escaped quotes
+                if self.escQuote:
+                    ret = ret.replace(self.escQuote, self.endQuoteChar)
+
+        return loc, ret
+
+    def __str__( self ):
+        try:
+            return super(QuotedString,self).__str__()
+        except:
+            pass
+
+        if self.strRepr is None:
+            self.strRepr = "quoted string, starting with %s ending with %s" % (self.quoteChar, self.endQuoteChar)
+
+        return self.strRepr
+
+
+class CharsNotIn(Token):
+    """Token for matching words composed of characters *not* in a given set.
+       Defined with string containing all disallowed characters, and an optional
+       minimum, maximum, and/or exact length.  The default value for min is 1 (a
+       minimum value < 1 is not valid); the default values for max and exact
+       are 0, meaning no maximum or exact length restriction.
+    """
+    def __init__( self, notChars, min=1, max=0, exact=0 ):
+        super(CharsNotIn,self).__init__()
+        self.skipWhitespace = False
+        self.notChars = notChars
+
+        if min < 1:
+            raise ValueError("cannot specify a minimum length < 1; use Optional(CharsNotIn()) if zero-length char group is permitted")
+
+        self.minLen = min
+
+        if max > 0:
+            self.maxLen = max
+        else:
+            self.maxLen = _MAX_INT
+
+        if exact > 0:
+            self.maxLen = exact
+            self.minLen = exact
+
+        self.name = _ustr(self)
+        self.errmsg = "Expected " + self.name
+        self.mayReturnEmpty = ( self.minLen == 0 )
+        #self.myException.msg = self.errmsg
+        self.mayIndexError = False
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if instring[loc] in self.notChars:
+            #~ raise ParseException( instring, loc, self.errmsg )
+            exc = self.myException
+            exc.loc = loc
+            exc.pstr = instring
+            raise exc
+
+        start = loc
+        loc += 1
+        notchars = self.notChars
+        maxlen = min( start+self.maxLen, len(instring) )
+        while loc < maxlen and \
+              (instring[loc] not in notchars):
+            loc += 1
+
+        if loc - start < self.minLen:
+            #~ raise ParseException( instring, loc, self.errmsg )
+            exc = self.myException
+            exc.loc = loc
+            exc.pstr = instring
+            raise exc
+
+        return loc, instring[start:loc]
+
+    def __str__( self ):
+        try:
+            return super(CharsNotIn, self).__str__()
+        except:
+            pass
+
+        if self.strRepr is None:
+            if len(self.notChars) > 4:
+                self.strRepr = "!W:(%s...)" % self.notChars[:4]
+            else:
+                self.strRepr = "!W:(%s)" % self.notChars
+
+        return self.strRepr
+
+class White(Token):
+    """Special matching class for matching whitespace.  Normally, whitespace is ignored
+       by pyparsing grammars.  This class is included when some whitespace structures
+       are significant.  Define with a string containing the whitespace characters to be
+       matched; default is " \\t\\n".  Also takes optional min, max, and exact arguments,
+       as defined for the Word class."""
+    whiteStrs = {
+        " " : "<SPC>",
+        "\t": "<TAB>",
+        "\n": "<LF>",
+        "\r": "<CR>",
+        "\f": "<FF>",
+        }
+    def __init__(self, ws=" \t\r\n", min=1, max=0, exact=0):
+        super(White,self).__init__()
+        self.matchWhite = ws
+        self.setWhitespaceChars( "".join([c for c in self.whiteChars if c not in self.matchWhite]) )
+        #~ self.leaveWhitespace()
+        self.name = ("".join([White.whiteStrs[c] for c in self.matchWhite]))
+        self.mayReturnEmpty = True
+        self.errmsg = "Expected " + self.name
+        #self.myException.msg = self.errmsg
+
+        self.minLen = min
+
+        if max > 0:
+            self.maxLen = max
+        else:
+            self.maxLen = _MAX_INT
+
+        if exact > 0:
+            self.maxLen = exact
+            self.minLen = exact
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if not(instring[ loc ] in self.matchWhite):
+            #~ raise ParseException( instring, loc, self.errmsg )
+            exc = self.myException
+            exc.loc = loc
+            exc.pstr = instring
+            raise exc
+        start = loc
+        loc += 1
+        maxloc = start + self.maxLen
+        maxloc = min( maxloc, len(instring) )
+        while loc < maxloc and instring[loc] in self.matchWhite:
+            loc += 1
+
+        if loc - start < self.minLen:
+            #~ raise ParseException( instring, loc, self.errmsg )
+            exc = self.myException
+            exc.loc = loc
+            exc.pstr = instring
+            raise exc
+
+        return loc, instring[start:loc]
+
+
+class _PositionToken(Token):
+    def __init__( self ):
+        super(_PositionToken,self).__init__()
+        self.name=self.__class__.__name__
+        self.mayReturnEmpty = True
+        self.mayIndexError = False
+
+class GoToColumn(_PositionToken):
+    """Token to advance to a specific column of input text; useful for tabular report scraping."""
+    def __init__( self, colno ):
+        super(GoToColumn,self).__init__()
+        self.col = colno
+
+    def preParse( self, instring, loc ):
+        if col(loc,instring) != self.col:
+            instrlen = len(instring)
+            if self.ignoreExprs:
+                loc = self._skipIgnorables( instring, loc )
+            while loc < instrlen and instring[loc].isspace() and col( loc, instring ) != self.col :
+                loc += 1
+        return loc
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        thiscol = col( loc, instring )
+        if thiscol > self.col:
+            raise ParseException( instring, loc, "Text not in expected column", self )
+        newloc = loc + self.col - thiscol
+        ret = instring[ loc: newloc ]
+        return newloc, ret
+
+class LineStart(_PositionToken):
+    """Matches if current position is at the beginning of a line within the parse string"""
+    def __init__( self ):
+        super(LineStart,self).__init__()
+        self.setWhitespaceChars( " \t" )
+        self.errmsg = "Expected start of line"
+        #self.myException.msg = self.errmsg
+
+    def preParse( self, instring, loc ):
+        preloc = super(LineStart,self).preParse(instring,loc)
+        if instring[preloc] == "\n":
+            loc += 1
+        return loc
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if not( loc==0 or
+            (loc == self.preParse( instring, 0 )) or
+            (instring[loc-1] == "\n") ): #col(loc, instring) != 1:
+            #~ raise ParseException( instring, loc, "Expected start of line" )
+            exc = self.myException
+            exc.loc = loc
+            exc.pstr = instring
+            raise exc
+        return loc, []
+
+class LineEnd(_PositionToken):
+    """Matches if current position is at the end of a line within the parse string"""
+    def __init__( self ):
+        super(LineEnd,self).__init__()
+        self.setWhitespaceChars( " \t" )
+        self.errmsg = "Expected end of line"
+        #self.myException.msg = self.errmsg
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if loc<len(instring):
+            if instring[loc] == "\n":
+                return loc+1, "\n"
+            else:
+                #~ raise ParseException( instring, loc, "Expected end of line" )
+                exc = self.myException
+                exc.loc = loc
+                exc.pstr = instring
+                raise exc
+        elif loc == len(instring):
+            return loc+1, []
+        else:
+            exc = self.myException
+            exc.loc = loc
+            exc.pstr = instring
+            raise exc
+
+class StringStart(_PositionToken):
+    """Matches if current position is at the beginning of the parse string"""
+    def __init__( self ):
+        super(StringStart,self).__init__()
+        self.errmsg = "Expected start of text"
+        #self.myException.msg = self.errmsg
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if loc != 0:
+            # see if entire string up to here is just whitespace and ignoreables
+            if loc != self.preParse( instring, 0 ):
+                #~ raise ParseException( instring, loc, "Expected start of text" )
+                exc = self.myException
+                exc.loc = loc
+                exc.pstr = instring
+                raise exc
+        return loc, []
+
+class StringEnd(_PositionToken):
+    """Matches if current position is at the end of the parse string"""
+    def __init__( self ):
+        super(StringEnd,self).__init__()
+        self.errmsg = "Expected end of text"
+        #self.myException.msg = self.errmsg
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if loc < len(instring):
+            #~ raise ParseException( instring, loc, "Expected end of text" )
+            exc = self.myException
+            exc.loc = loc
+            exc.pstr = instring
+            raise exc
+        elif loc == len(instring):
+            return loc+1, []
+        elif loc > len(instring):
+            return loc, []
+        else:
+            exc = self.myException
+            exc.loc = loc
+            exc.pstr = instring
+            raise exc
+
+class WordStart(_PositionToken):
+    """Matches if the current position is at the beginning of a Word, and
+       is not preceded by any character in a given set of wordChars
+       (default=printables). To emulate the \b behavior of regular expressions,
+       use WordStart(alphanums). WordStart will also match at the beginning of
+       the string being parsed, or at the beginning of a line.
+    """
+    def __init__(self, wordChars = printables):
+        super(WordStart,self).__init__()
+        self.wordChars = _str2dict(wordChars)
+        self.errmsg = "Not at the start of a word"
+
+    def parseImpl(self, instring, loc, doActions=True ):
+        if loc != 0:
+            if (instring[loc-1] in self.wordChars or
+                instring[loc] not in self.wordChars):
+                exc = self.myException
+                exc.loc = loc
+                exc.pstr = instring
+                raise exc
+        return loc, []
+
+class WordEnd(_PositionToken):
+    """Matches if the current position is at the end of a Word, and
+       is not followed by any character in a given set of wordChars
+       (default=printables). To emulate the \b behavior of regular expressions,
+       use WordEnd(alphanums). WordEnd will also match at the end of
+       the string being parsed, or at the end of a line.
+    """
+    def __init__(self, wordChars = printables):
+        super(WordEnd,self).__init__()
+        self.wordChars = _str2dict(wordChars)
+        self.skipWhitespace = False
+        self.errmsg = "Not at the end of a word"
+
+    def parseImpl(self, instring, loc, doActions=True ):
+        instrlen = len(instring)
+        if instrlen>0 and loc<instrlen:
+            if (instring[loc] in self.wordChars or
+                instring[loc-1] not in self.wordChars):
+                #~ raise ParseException( instring, loc, "Expected end of word" )
+                exc = self.myException
+                exc.loc = loc
+                exc.pstr = instring
+                raise exc
+        return loc, []
+
+
+class ParseExpression(ParserElement):
+    """Abstract subclass of ParserElement, for combining and post-processing parsed tokens."""
+    def __init__( self, exprs, savelist = False ):
+        super(ParseExpression,self).__init__(savelist)
+        if isinstance( exprs, list ):
+            self.exprs = exprs
+        elif isinstance( exprs, basestring ):
+            self.exprs = [ Literal( exprs ) ]
+        else:
+            self.exprs = [ exprs ]
+        self.callPreparse = False
+
+    def __getitem__( self, i ):
+        return self.exprs[i]
+
+    def append( self, other ):
+        self.exprs.append( other )
+        self.strRepr = None
+        return self
+
+    def leaveWhitespace( self ):
+        """Extends leaveWhitespace defined in base class, and also invokes leaveWhitespace on
+           all contained expressions."""
+        self.skipWhitespace = False
+        self.exprs = [ e.copy() for e in self.exprs ]
+        for e in self.exprs:
+            e.leaveWhitespace()
+        return self
+
+    def ignore( self, other ):
+        if isinstance( other, Suppress ):
+            if other not in self.ignoreExprs:
+                super( ParseExpression, self).ignore( other )
+                for e in self.exprs:
+                    e.ignore( self.ignoreExprs[-1] )
+        else:
+            super( ParseExpression, self).ignore( other )
+            for e in self.exprs:
+                e.ignore( self.ignoreExprs[-1] )
+        return self
+
+    def __str__( self ):
+        try:
+            return super(ParseExpression,self).__str__()
+        except:
+            pass
+
+        if self.strRepr is None:
+            self.strRepr = "%s:(%s)" % ( self.__class__.__name__, _ustr(self.exprs) )
+        return self.strRepr
+
+    def streamline( self ):
+        super(ParseExpression,self).streamline()
+
+        for e in self.exprs:
+            e.streamline()
+
+        # collapse nested And's of the form And( And( And( a,b), c), d) to And( a,b,c,d )
+        # but only if there are no parse actions or resultsNames on the nested And's
+        # (likewise for Or's and MatchFirst's)
+        if ( len(self.exprs) == 2 ):
+            other = self.exprs[0]
+            if ( isinstance( other, self.__class__ ) and
+                  not(other.parseAction) and
+                  other.resultsName is None and
+                  not other.debug ):
+                self.exprs = other.exprs[:] + [ self.exprs[1] ]
+                self.strRepr = None
+                self.mayReturnEmpty |= other.mayReturnEmpty
+                self.mayIndexError  |= other.mayIndexError
+
+            other = self.exprs[-1]
+            if ( isinstance( other, self.__class__ ) and
+                  not(other.parseAction) and
+                  other.resultsName is None and
+                  not other.debug ):
+                self.exprs = self.exprs[:-1] + other.exprs[:]
+                self.strRepr = None
+                self.mayReturnEmpty |= other.mayReturnEmpty
+                self.mayIndexError  |= other.mayIndexError
+
+        return self
+
+    def setResultsName( self, name, listAllMatches=False ):
+        ret = super(ParseExpression,self).setResultsName(name,listAllMatches)
+        return ret
+
+    def validate( self, validateTrace=[] ):
+        tmp = validateTrace[:]+[self]
+        for e in self.exprs:
+            e.validate(tmp)
+        self.checkRecursion( [] )
+
+class And(ParseExpression):
+    """Requires all given ParseExpressions to be found in the given order.
+       Expressions may be separated by whitespace.
+       May be constructed using the '+' operator.
+    """
+
+    class _ErrorStop(Empty):
+        def __new__(cls,*args,**kwargs):
+            return And._ErrorStop.instance
+    _ErrorStop.instance = Empty()
+    _ErrorStop.instance.leaveWhitespace()
+
+    def __init__( self, exprs, savelist = True ):
+        super(And,self).__init__(exprs, savelist)
+        self.mayReturnEmpty = True
+        for e in self.exprs:
+            if not e.mayReturnEmpty:
+                self.mayReturnEmpty = False
+                break
+        self.setWhitespaceChars( exprs[0].whiteChars )
+        self.skipWhitespace = exprs[0].skipWhitespace
+        self.callPreparse = True
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        # pass False as last arg to _parse for first element, since we already
+        # pre-parsed the string as part of our And pre-parsing
+        loc, resultlist = self.exprs[0]._parse( instring, loc, doActions, callPreParse=False )
+        errorStop = False
+        for e in self.exprs[1:]:
+            if e is And._ErrorStop.instance:
+                errorStop = True
+                continue
+            if errorStop:
+                try:
+                    loc, exprtokens = e._parse( instring, loc, doActions )
+                except ParseBaseException, pe:
+                    raise ParseSyntaxException(pe)
+                except IndexError, ie:
+                    raise ParseSyntaxException( ParseException(instring, len(instring), self.errmsg, self) )
+            else:
+                loc, exprtokens = e._parse( instring, loc, doActions )
+            if exprtokens or exprtokens.keys():
+                resultlist += exprtokens
+        return loc, resultlist
+
+    def __iadd__(self, other ):
+        if isinstance( other, basestring ):
+            other = Literal( other )
+        return self.append( other ) #And( [ self, other ] )
+
+    def checkRecursion( self, parseElementList ):
+        subRecCheckList = parseElementList[:] + [ self ]
+        for e in self.exprs:
+            e.checkRecursion( subRecCheckList )
+            if not e.mayReturnEmpty:
+                break
+
+    def __str__( self ):
+        if hasattr(self,"name"):
+            return self.name
+
+        if self.strRepr is None:
+            self.strRepr = "{" + " ".join( [ _ustr(e) for e in self.exprs ] ) + "}"
+
+        return self.strRepr
+
+
+class Or(ParseExpression):
+    """Requires that at least one ParseExpression is found.
+       If two expressions match, the expression that matches the longest string will be used.
+       May be constructed using the '^' operator.
+    """
+    def __init__( self, exprs, savelist = False ):
+        super(Or,self).__init__(exprs, savelist)
+        self.mayReturnEmpty = False
+        for e in self.exprs:
+            if e.mayReturnEmpty:
+                self.mayReturnEmpty = True
+                break
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        maxExcLoc = -1
+        maxMatchLoc = -1
+        maxException = None
+        for e in self.exprs:
+            try:
+                loc2 = e.tryParse( instring, loc )
+            except ParseException, err:
+                if err.loc > maxExcLoc:
+                    maxException = err
+                    maxExcLoc = err.loc
+            except IndexError:
+                if len(instring) > maxExcLoc:
+                    maxException = ParseException(instring,len(instring),e.errmsg,self)
+                    maxExcLoc = len(instring)
+            else:
+                if loc2 > maxMatchLoc:
+                    maxMatchLoc = loc2
+                    maxMatchExp = e
+
+        if maxMatchLoc < 0:
+            if maxException is not None:
+                raise maxException
+            else:
+                raise ParseException(instring, loc, "no defined alternatives to match", self)
+
+        return maxMatchExp._parse( instring, loc, doActions )
+
+    def __ixor__(self, other ):
+        if isinstance( other, basestring ):
+            other = Literal( other )
+        return self.append( other ) #Or( [ self, other ] )
+
+    def __str__( self ):
+        if hasattr(self,"name"):
+            return self.name
+
+        if self.strRepr is None:
+            self.strRepr = "{" + " ^ ".join( [ _ustr(e) for e in self.exprs ] ) + "}"
+
+        return self.strRepr
+
+    def checkRecursion( self, parseElementList ):
+        subRecCheckList = parseElementList[:] + [ self ]
+        for e in self.exprs:
+            e.checkRecursion( subRecCheckList )
+
+
+class MatchFirst(ParseExpression):
+    """Requires that at least one ParseExpression is found.
+       If two expressions match, the first one listed is the one that will match.
+       May be constructed using the '|' operator.
+    """
+    def __init__( self, exprs, savelist = False ):
+        super(MatchFirst,self).__init__(exprs, savelist)
+        if exprs:
+            self.mayReturnEmpty = False
+            for e in self.exprs:
+                if e.mayReturnEmpty:
+                    self.mayReturnEmpty = True
+                    break
+        else:
+            self.mayReturnEmpty = True
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        maxExcLoc = -1
+        maxException = None
+        for e in self.exprs:
+            try:
+                ret = e._parse( instring, loc, doActions )
+                return ret
+            except ParseException, err:
+                if err.loc > maxExcLoc:
+                    maxException = err
+                    maxExcLoc = err.loc
+            except IndexError:
+                if len(instring) > maxExcLoc:
+                    maxException = ParseException(instring,len(instring),e.errmsg,self)
+                    maxExcLoc = len(instring)
+
+        # only got here if no expression matched, raise exception for match that made it the furthest
+        else:
+            if maxException is not None:
+                raise maxException
+            else:
+                raise ParseException(instring, loc, "no defined alternatives to match", self)
+
+    def __ior__(self, other ):
+        if isinstance( other, basestring ):
+            other = Literal( other )
+        return self.append( other ) #MatchFirst( [ self, other ] )
+
+    def __str__( self ):
+        if hasattr(self,"name"):
+            return self.name
+
+        if self.strRepr is None:
+            self.strRepr = "{" + " | ".join( [ _ustr(e) for e in self.exprs ] ) + "}"
+
+        return self.strRepr
+
+    def checkRecursion( self, parseElementList ):
+        subRecCheckList = parseElementList[:] + [ self ]
+        for e in self.exprs:
+            e.checkRecursion( subRecCheckList )
+
+
+class Each(ParseExpression):
+    """Requires all given ParseExpressions to be found, but in any order.
+       Expressions may be separated by whitespace.
+       May be constructed using the '&' operator.
+    """
+    def __init__( self, exprs, savelist = True ):
+        super(Each,self).__init__(exprs, savelist)
+        self.mayReturnEmpty = True
+        for e in self.exprs:
+            if not e.mayReturnEmpty:
+                self.mayReturnEmpty = False
+                break
+        self.skipWhitespace = True
+        self.initExprGroups = True
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if self.initExprGroups:
+            self.optionals = [ e.expr for e in self.exprs if isinstance(e,Optional) ]
+            self.multioptionals = [ e.expr for e in self.exprs if isinstance(e,ZeroOrMore) ]
+            self.multirequired = [ e.expr for e in self.exprs if isinstance(e,OneOrMore) ]
+            self.required = [ e for e in self.exprs if not isinstance(e,(Optional,ZeroOrMore,OneOrMore)) ]
+            self.required += self.multirequired
+            self.initExprGroups = False
+        tmpLoc = loc
+        tmpReqd = self.required[:]
+        tmpOpt  = self.optionals[:]
+        matchOrder = []
+
+        keepMatching = True
+        while keepMatching:
+            tmpExprs = tmpReqd + tmpOpt + self.multioptionals + self.multirequired
+            failed = []
+            for e in tmpExprs:
+                try:
+                    tmpLoc = e.tryParse( instring, tmpLoc )
+                except ParseException:
+                    failed.append(e)
+                else:
+                    matchOrder.append(e)
+                    if e in tmpReqd:
+                        tmpReqd.remove(e)
+                    elif e in tmpOpt:
+                        tmpOpt.remove(e)
+            if len(failed) == len(tmpExprs):
+                keepMatching = False
+
+        if tmpReqd:
+            missing = ", ".join( [ _ustr(e) for e in tmpReqd ] )
+            raise ParseException(instring,loc,"Missing one or more required elements (%s)" % missing )
+
+        # add any unmatched Optionals, in case they have default values defined
+        matchOrder += list(e for e in self.exprs if isinstance(e,Optional) and e.expr in tmpOpt)
+
+        resultlist = []
+        for e in matchOrder:
+            loc,results = e._parse(instring,loc,doActions)
+            resultlist.append(results)
+
+        finalResults = ParseResults([])
+        for r in resultlist:
+            dups = {}
+            for k in r.keys():
+                if k in finalResults.keys():
+                    tmp = ParseResults(finalResults[k])
+                    tmp += ParseResults(r[k])
+                    dups[k] = tmp
+            finalResults += ParseResults(r)
+            for k,v in dups.items():
+                finalResults[k] = v
+        return loc, finalResults
+
+    def __str__( self ):
+        if hasattr(self,"name"):
+            return self.name
+
+        if self.strRepr is None:
+            self.strRepr = "{" + " & ".join( [ _ustr(e) for e in self.exprs ] ) + "}"
+
+        return self.strRepr
+
+    def checkRecursion( self, parseElementList ):
+        subRecCheckList = parseElementList[:] + [ self ]
+        for e in self.exprs:
+            e.checkRecursion( subRecCheckList )
+
+
+class ParseElementEnhance(ParserElement):
+    """Abstract subclass of ParserElement, for combining and post-processing parsed tokens."""
+    def __init__( self, expr, savelist=False ):
+        super(ParseElementEnhance,self).__init__(savelist)
+        if isinstance( expr, basestring ):
+            expr = Literal(expr)
+        self.expr = expr
+        self.strRepr = None
+        if expr is not None:
+            self.mayIndexError = expr.mayIndexError
+            self.mayReturnEmpty = expr.mayReturnEmpty
+            self.setWhitespaceChars( expr.whiteChars )
+            self.skipWhitespace = expr.skipWhitespace
+            self.saveAsList = expr.saveAsList
+            self.callPreparse = expr.callPreparse
+            self.ignoreExprs.extend(expr.ignoreExprs)
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        if self.expr is not None:
+            return self.expr._parse( instring, loc, doActions, callPreParse=False )
+        else:
+            raise ParseException("",loc,self.errmsg,self)
+
+    def leaveWhitespace( self ):
+        self.skipWhitespace = False
+        self.expr = self.expr.copy()
+        if self.expr is not None:
+            self.expr.leaveWhitespace()
+        return self
+
+    def ignore( self, other ):
+        if isinstance( other, Suppress ):
+            if other not in self.ignoreExprs:
+                super( ParseElementEnhance, self).ignore( other )
+                if self.expr is not None:
+                    self.expr.ignore( self.ignoreExprs[-1] )
+        else:
+            super( ParseElementEnhance, self).ignore( other )
+            if self.expr is not None:
+                self.expr.ignore( self.ignoreExprs[-1] )
+        return self
+
+    def streamline( self ):
+        super(ParseElementEnhance,self).streamline()
+        if self.expr is not None:
+            self.expr.streamline()
+        return self
+
+    def checkRecursion( self, parseElementList ):
+        if self in parseElementList:
+            raise RecursiveGrammarException( parseElementList+[self] )
+        subRecCheckList = parseElementList[:] + [ self ]
+        if self.expr is not None:
+            self.expr.checkRecursion( subRecCheckList )
+
+    def validate( self, validateTrace=[] ):
+        tmp = validateTrace[:]+[self]
+        if self.expr is not None:
+            self.expr.validate(tmp)
+        self.checkRecursion( [] )
+
+    def __str__( self ):
+        try:
+            return super(ParseElementEnhance,self).__str__()
+        except:
+            pass
+
+        if self.strRepr is None and self.expr is not None:
+            self.strRepr = "%s:(%s)" % ( self.__class__.__name__, _ustr(self.expr) )
+        return self.strRepr
+
+
+class FollowedBy(ParseElementEnhance):
+    """Lookahead matching of the given parse expression.  FollowedBy
+    does *not* advance the parsing position within the input string, it only
+    verifies that the specified parse expression matches at the current
+    position.  FollowedBy always returns a null token list."""
+    def __init__( self, expr ):
+        super(FollowedBy,self).__init__(expr)
+        self.mayReturnEmpty = True
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        self.expr.tryParse( instring, loc )
+        return loc, []
+
+
+class NotAny(ParseElementEnhance):
+    """Lookahead to disallow matching with the given parse expression.  NotAny
+    does *not* advance the parsing position within the input string, it only
+    verifies that the specified parse expression does *not* match at the current
+    position.  Also, NotAny does *not* skip over leading whitespace. NotAny
+    always returns a null token list.  May be constructed using the '~' operator."""
+    def __init__( self, expr ):
+        super(NotAny,self).__init__(expr)
+        #~ self.leaveWhitespace()
+        self.skipWhitespace = False  # do NOT use self.leaveWhitespace(), don't want to propagate to exprs
+        self.mayReturnEmpty = True
+        self.errmsg = "Found unwanted token, "+_ustr(self.expr)
+        #self.myException = ParseException("",0,self.errmsg,self)
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        try:
+            self.expr.tryParse( instring, loc )
+        except (ParseException,IndexError):
+            pass
+        else:
+            #~ raise ParseException(instring, loc, self.errmsg )
+            exc = self.myException
+            exc.loc = loc
+            exc.pstr = instring
+            raise exc
+        return loc, []
+
+    def __str__( self ):
+        if hasattr(self,"name"):
+            return self.name
+
+        if self.strRepr is None:
+            self.strRepr = "~{" + _ustr(self.expr) + "}"
+
+        return self.strRepr
+
+
+class ZeroOrMore(ParseElementEnhance):
+    """Optional repetition of zero or more of the given expression."""
+    def __init__( self, expr ):
+        super(ZeroOrMore,self).__init__(expr)
+        self.mayReturnEmpty = True
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        tokens = []
+        try:
+            loc, tokens = self.expr._parse( instring, loc, doActions, callPreParse=False )
+            hasIgnoreExprs = ( len(self.ignoreExprs) > 0 )
+            while 1:
+                if hasIgnoreExprs:
+                    preloc = self._skipIgnorables( instring, loc )
+                else:
+                    preloc = loc
+                loc, tmptokens = self.expr._parse( instring, preloc, doActions )
+                if tmptokens or tmptokens.keys():
+                    tokens += tmptokens
+        except (ParseException,IndexError):
+            pass
+
+        return loc, tokens
+
+    def __str__( self ):
+        if hasattr(self,"name"):
+            return self.name
+
+        if self.strRepr is None:
+            self.strRepr = "[" + _ustr(self.expr) + "]..."
+
+        return self.strRepr
+
+    def setResultsName( self, name, listAllMatches=False ):
+        ret = super(ZeroOrMore,self).setResultsName(name,listAllMatches)
+        ret.saveAsList = True
+        return ret
+
+
+class OneOrMore(ParseElementEnhance):
+    """Repetition of one or more of the given expression."""
+    def parseImpl( self, instring, loc, doActions=True ):
+        # must be at least one
+        loc, tokens = self.expr._parse( instring, loc, doActions, callPreParse=False )
+        try:
+            hasIgnoreExprs = ( len(self.ignoreExprs) > 0 )
+            while 1:
+                if hasIgnoreExprs:
+                    preloc = self._skipIgnorables( instring, loc )
+                else:
+                    preloc = loc
+                loc, tmptokens = self.expr._parse( instring, preloc, doActions )
+                if tmptokens or tmptokens.keys():
+                    tokens += tmptokens
+        except (ParseException,IndexError):
+            pass
+
+        return loc, tokens
+
+    def __str__( self ):
+        if hasattr(self,"name"):
+            return self.name
+
+        if self.strRepr is None:
+            self.strRepr = "{" + _ustr(self.expr) + "}..."
+
+        return self.strRepr
+
+    def setResultsName( self, name, listAllMatches=False ):
+        ret = super(OneOrMore,self).setResultsName(name,listAllMatches)
+        ret.saveAsList = True
+        return ret
+
+class _NullToken(object):
+    def __bool__(self):
+        return False
+    __nonzero__ = __bool__
+    def __str__(self):
+        return ""
+
+_optionalNotMatched = _NullToken()
+class Optional(ParseElementEnhance):
+    """Optional matching of the given expression.
+       A default return string can also be specified, if the optional expression
+       is not found.
+    """
+    def __init__( self, exprs, default=_optionalNotMatched ):
+        super(Optional,self).__init__( exprs, savelist=False )
+        self.defaultValue = default
+        self.mayReturnEmpty = True
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        try:
+            loc, tokens = self.expr._parse( instring, loc, doActions, callPreParse=False )
+        except (ParseException,IndexError):
+            if self.defaultValue is not _optionalNotMatched:
+                if self.expr.resultsName:
+                    tokens = ParseResults([ self.defaultValue ])
+                    tokens[self.expr.resultsName] = self.defaultValue
+                else:
+                    tokens = [ self.defaultValue ]
+            else:
+                tokens = []
+        return loc, tokens
+
+    def __str__( self ):
+        if hasattr(self,"name"):
+            return self.name
+
+        if self.strRepr is None:
+            self.strRepr = "[" + _ustr(self.expr) + "]"
+
+        return self.strRepr
+
+
+class SkipTo(ParseElementEnhance):
+    """Token for skipping over all undefined text until the matched expression is found.
+       If include is set to true, the matched expression is also consumed.  The ignore
+       argument is used to define grammars (typically quoted strings and comments) that
+       might contain false matches.
+    """
+    def __init__( self, other, include=False, ignore=None ):
+        super( SkipTo, self ).__init__( other )
+        if ignore is not None:
+            self.expr = self.expr.copy()
+            self.expr.ignore(ignore)
+        self.mayReturnEmpty = True
+        self.mayIndexError = False
+        self.includeMatch = include
+        self.asList = False
+        self.errmsg = "No match found for "+_ustr(self.expr)
+        #self.myException = ParseException("",0,self.errmsg,self)
+
+    def parseImpl( self, instring, loc, doActions=True ):
+        startLoc = loc
+        instrlen = len(instring)
+        expr = self.expr
+        while loc <= instrlen:
+            try:
+                loc = expr._skipIgnorables( instring, loc )
+                expr._parse( instring, loc, doActions=False, callPreParse=False )
+                if self.includeMatch:
+                    skipText = instring[startLoc:loc]
+                    loc,mat = expr._parse(instring,loc,doActions,callPreParse=False)
+                    if mat:
+                        skipRes = ParseResults( skipText )
+                        skipRes += mat
+                        return loc, [ skipRes ]
+                    else:
+                        return loc, [ skipText ]
+                else:
+                    return loc, [ instring[startLoc:loc] ]
+            except (ParseException,IndexError):
+                loc += 1
+        exc = self.myException
+        exc.loc = loc
+        exc.pstr = instring
+        raise exc
+
+class Forward(ParseElementEnhance):
+    """Forward declaration of an expression to be defined later -
+       used for recursive grammars, such as algebraic infix notation.
+       When the expression is known, it is assigned to the Forward variable using the '<<' operator.
+
+       Note: take care when assigning to Forward not to overlook precedence of operators.
+       Specifically, '|' has a lower precedence than '<<', so that::
+          fwdExpr << a | b | c
+       will actually be evaluated as::
+          (fwdExpr << a) | b | c
+       thereby leaving b and c out as parseable alternatives.  It is recommended that you
+       explicitly group the values inserted into the Forward::
+          fwdExpr << (a | b | c)
+    """
+    def __init__( self, other=None ):
+        super(Forward,self).__init__( other, savelist=False )
+
+    def __lshift__( self, other ):
+        if isinstance( other, basestring ):
+            other = Literal(other)
+        self.expr = other
+        self.mayReturnEmpty = other.mayReturnEmpty
+        self.strRepr = None
+        self.mayIndexError = self.expr.mayIndexError
+        self.mayReturnEmpty = self.expr.mayReturnEmpty
+        self.setWhitespaceChars( self.expr.whiteChars )
+        self.skipWhitespace = self.expr.skipWhitespace
+        self.saveAsList = self.expr.saveAsList
+        self.ignoreExprs.extend(self.expr.ignoreExprs)
+        return None
+
+    def leaveWhitespace( self ):
+        self.skipWhitespace = False
+        return self
+
+    def streamline( self ):
+        if not self.streamlined:
+            self.streamlined = True
+            if self.expr is not None:
+                self.expr.streamline()
+        return self
+
+    def validate( self, validateTrace=[] ):
+        if self not in validateTrace:
+            tmp = validateTrace[:]+[self]
+            if self.expr is not None:
+                self.expr.validate(tmp)
+        self.checkRecursion([])
+
+    def __str__( self ):
+        if hasattr(self,"name"):
+            return self.name
+
+        self.__class__ = _ForwardNoRecurse
+        try:
+            if self.expr is not None:
+                retString = _ustr(self.expr)
+            else:
+                retString = "None"
+        finally:
+            self.__class__ = Forward
+        return "Forward: "+retString
+
+    def copy(self):
+        if self.expr is not None:
+            return super(Forward,self).copy()
+        else:
+            ret = Forward()
+            ret << self
+            return ret
+
+class _ForwardNoRecurse(Forward):
+    def __str__( self ):
+        return "..."
+
+class TokenConverter(ParseElementEnhance):
+    """Abstract subclass of ParseExpression, for converting parsed results."""
+    def __init__( self, expr, savelist=False ):
+        super(TokenConverter,self).__init__( expr )#, savelist )
+        self.saveAsList = False
+
+class Upcase(TokenConverter):
+    """Converter to upper case all matching tokens."""
+    def __init__(self, *args):
+        super(Upcase,self).__init__(*args)
+        warnings.warn("Upcase class is deprecated, use upcaseTokens parse action instead",
+                       DeprecationWarning,stacklevel=2)
+
+    def postParse( self, instring, loc, tokenlist ):
+        return list(map( string.upper, tokenlist ))
+
+
+class Combine(TokenConverter):
+    """Converter to concatenate all matching tokens to a single string.
+       By default, the matching patterns must also be contiguous in the input string;
+       this can be disabled by specifying 'adjacent=False' in the constructor.
+    """
+    def __init__( self, expr, joinString="", adjacent=True ):
+        super(Combine,self).__init__( expr )
+        # suppress whitespace-stripping in contained parse expressions, but re-enable it on the Combine itself
+        if adjacent:
+            self.leaveWhitespace()
+        self.adjacent = adjacent
+        self.skipWhitespace = True
+        self.joinString = joinString
+
+    def ignore( self, other ):
+        if self.adjacent:
+            ParserElement.ignore(self, other)
+        else:
+            super( Combine, self).ignore( other )
+        return self
+
+    def postParse( self, instring, loc, tokenlist ):
+        retToks = tokenlist.copy()
+        del retToks[:]
+        retToks += ParseResults([ "".join(tokenlist._asStringList(self.joinString)) ], modal=self.modalResults)
+
+        if self.resultsName and len(retToks.keys())>0:
+            return [ retToks ]
+        else:
+            return retToks
+
+class Group(TokenConverter):
+    """Converter to return the matched tokens as a list - useful for returning tokens of ZeroOrMore and OneOrMore expressions."""
+    def __init__( self, expr ):
+        super(Group,self).__init__( expr )
+        self.saveAsList = True
+
+    def postParse( self, instring, loc, tokenlist ):
+        return [ tokenlist ]
+
+class Dict(TokenConverter):
+    """Converter to return a repetitive expression as a list, but also as a dictionary.
+       Each element can also be referenced using the first token in the expression as its key.
+       Useful for tabular report scraping when the first column can be used as a item key.
+    """
+    def __init__( self, exprs ):
+        super(Dict,self).__init__( exprs )
+        self.saveAsList = True
+
+    def postParse( self, instring, loc, tokenlist ):
+        for i,tok in enumerate(tokenlist):
+            if len(tok) == 0:
+                continue
+            ikey = tok[0]
+            if isinstance(ikey,int):
+                ikey = _ustr(tok[0]).strip()
+            if len(tok)==1:
+                tokenlist[ikey] = _ParseResultsWithOffset("",i)
+            elif len(tok)==2 and not isinstance(tok[1],ParseResults):
+                tokenlist[ikey] = _ParseResultsWithOffset(tok[1],i)
+            else:
+                dictvalue = tok.copy() #ParseResults(i)
+                del dictvalue[0]
+                if len(dictvalue)!= 1 or (isinstance(dictvalue,ParseResults) and dictvalue.keys()):
+                    tokenlist[ikey] = _ParseResultsWithOffset(dictvalue,i)
+                else:
+                    tokenlist[ikey] = _ParseResultsWithOffset(dictvalue[0],i)
+
+        if self.resultsName:
+            return [ tokenlist ]
+        else:
+            return tokenlist
+
+
+class Suppress(TokenConverter):
+    """Converter for ignoring the results of a parsed expression."""
+    def postParse( self, instring, loc, tokenlist ):
+        return []
+
+    def suppress( self ):
+        return self
+
+
+class OnlyOnce(object):
+    """Wrapper for parse actions, to ensure they are only called once."""
+    def __init__(self, methodCall):
+        self.callable = ParserElement._normalizeParseActionArgs(methodCall)
+        self.called = False
+    def __call__(self,s,l,t):
+        if not self.called:
+            results = self.callable(s,l,t)
+            self.called = True
+            return results
+        raise ParseException(s,l,"")
+    def reset(self):
+        self.called = False
+
+def traceParseAction(f):
+    """Decorator for debugging parse actions."""
+    f = ParserElement._normalizeParseActionArgs(f)
+    def z(*paArgs):
+        thisFunc = f.func_name
+        s,l,t = paArgs[-3:]
+        if len(paArgs)>3:
+            thisFunc = paArgs[0].__class__.__name__ + '.' + thisFunc
+        sys.stderr.write( ">>entering %s(line: '%s', %d, %s)\n" % (thisFunc,line(l,s),l,t) )
+        try:
+            ret = f(*paArgs)
+        except Exception, exc:
+            sys.stderr.write( "<<leaving %s (exception: %s)\n" % (thisFunc,exc) )
+            raise
+        sys.stderr.write( "<<leaving %s (ret: %s)\n" % (thisFunc,ret) )
+        return ret
+    try:
+        z.__name__ = f.__name__
+    except AttributeError:
+        pass
+    return z
+
+#
+# global helpers
+#
+def delimitedList( expr, delim=",", combine=False ):
+    """Helper to define a delimited list of expressions - the delimiter defaults to ','.
+       By default, the list elements and delimiters can have intervening whitespace, and
+       comments, but this can be overridden by passing 'combine=True' in the constructor.
+       If combine is set to True, the matching tokens are returned as a single token
+       string, with the delimiters included; otherwise, the matching tokens are returned
+       as a list of tokens, with the delimiters suppressed.
+    """
+    dlName = _ustr(expr)+" ["+_ustr(delim)+" "+_ustr(expr)+"]..."
+    if combine:
+        return Combine( expr + ZeroOrMore( delim + expr ) ).setName(dlName)
+    else:
+        return ( expr + ZeroOrMore( Suppress( delim ) + expr ) ).setName(dlName)
+
+def countedArray( expr ):
+    """Helper to define a counted list of expressions.
+       This helper defines a pattern of the form::
+           integer expr expr expr...
+       where the leading integer tells how many expr expressions follow.
+       The matched tokens returns the array of expr tokens as a list - the leading count token is suppressed.
+    """
+    arrayExpr = Forward()
+    def countFieldParseAction(s,l,t):
+        n = int(t[0])
+        arrayExpr << (n and Group(And([expr]*n)) or Group(empty))
+        return []
+    return ( Word(nums).setName("arrayLen").setParseAction(countFieldParseAction, callDuringTry=True) + arrayExpr )
+
+def _flatten(L):
+    if type(L) is not list: return [L]
+    if L == []: return L
+    return _flatten(L[0]) + _flatten(L[1:])
+
+def matchPreviousLiteral(expr):
+    """Helper to define an expression that is indirectly defined from
+       the tokens matched in a previous expression, that is, it looks
+       for a 'repeat' of a previous expression.  For example::
+           first = Word(nums)
+           second = matchPreviousLiteral(first)
+           matchExpr = first + ":" + second
+       will match "1:1", but not "1:2".  Because this matches a
+       previous literal, will also match the leading "1:1" in "1:10".
+       If this is not desired, use matchPreviousExpr.
+       Do *not* use with packrat parsing enabled.
+    """
+    rep = Forward()
+    def copyTokenToRepeater(s,l,t):
+        if t:
+            if len(t) == 1:
+                rep << t[0]
+            else:
+                # flatten t tokens
+                tflat = _flatten(t.asList())
+                rep << And( [ Literal(tt) for tt in tflat ] )
+        else:
+            rep << Empty()
+    expr.addParseAction(copyTokenToRepeater, callDuringTry=True)
+    return rep
+
+def matchPreviousExpr(expr):
+    """Helper to define an expression that is indirectly defined from
+       the tokens matched in a previous expression, that is, it looks
+       for a 'repeat' of a previous expression.  For example::
+           first = Word(nums)
+           second = matchPreviousExpr(first)
+           matchExpr = first + ":" + second
+       will match "1:1", but not "1:2".  Because this matches by
+       expressions, will *not* match the leading "1:1" in "1:10";
+       the expressions are evaluated first, and then compared, so
+       "1" is compared with "10".
+       Do *not* use with packrat parsing enabled.
+    """
+    rep = Forward()
+    e2 = expr.copy()
+    rep << e2
+    def copyTokenToRepeater(s,l,t):
+        matchTokens = _flatten(t.asList())
+        def mustMatchTheseTokens(s,l,t):
+            theseTokens = _flatten(t.asList())
+            if  theseTokens != matchTokens:
+                raise ParseException("",0,"")
+        rep.setParseAction( mustMatchTheseTokens, callDuringTry=True )
+    expr.addParseAction(copyTokenToRepeater, callDuringTry=True)
+    return rep
+
+def _escapeRegexRangeChars(s):
+    #~  escape these chars: ^-]
+    for c in r"\^-]":
+        s = s.replace(c,"\\"+c)
+    s = s.replace("\n",r"\n")
+    s = s.replace("\t",r"\t")
+    return _ustr(s)
+
+def oneOf( strs, caseless=False, useRegex=True ):
+    """Helper to quickly define a set of alternative Literals, and makes sure to do
+       longest-first testing when there is a conflict, regardless of the input order,
+       but returns a MatchFirst for best performance.
+
+       Parameters:
+        - strs - a string of space-delimited literals, or a list of string literals
+        - caseless - (default=False) - treat all literals as caseless
+        - useRegex - (default=True) - as an optimization, will generate a Regex
+          object; otherwise, will generate a MatchFirst object (if caseless=True, or
+          if creating a Regex raises an exception)
+    """
+    if caseless:
+        isequal = ( lambda a,b: a.upper() == b.upper() )
+        masks = ( lambda a,b: b.upper().startswith(a.upper()) )
+        parseElementClass = CaselessLiteral
+    else:
+        isequal = ( lambda a,b: a == b )
+        masks = ( lambda a,b: b.startswith(a) )
+        parseElementClass = Literal
+
+    if isinstance(strs,(list,tuple)):
+        symbols = strs[:]
+    elif isinstance(strs,basestring):
+        symbols = strs.split()
+    else:
+        warnings.warn("Invalid argument to oneOf, expected string or list",
+                SyntaxWarning, stacklevel=2)
+
+    i = 0
+    while i < len(symbols)-1:
+        cur = symbols[i]
+        for j,other in enumerate(symbols[i+1:]):
+            if ( isequal(other, cur) ):
+                del symbols[i+j+1]
+                break
+            elif ( masks(cur, other) ):
+                del symbols[i+j+1]
+                symbols.insert(i,other)
+                cur = other
+                break
+        else:
+            i += 1
+
+    if not caseless and useRegex:
+        #~ print (strs,"->", "|".join( [ _escapeRegexChars(sym) for sym in symbols] ))
+        try:
+            if len(symbols)==len("".join(symbols)):
+                return Regex( "[%s]" % "".join( [ _escapeRegexRangeChars(sym) for sym in symbols] ) )
+            else:
+                return Regex( "|".join( [ re.escape(sym) for sym in symbols] ) )
+        except:
+            warnings.warn("Exception creating Regex for oneOf, building MatchFirst",
+                    SyntaxWarning, stacklevel=2)
+
+
+    # last resort, just use MatchFirst
+    return MatchFirst( [ parseElementClass(sym) for sym in symbols ] )
+
+def dictOf( key, value ):
+    """Helper to easily and clearly define a dictionary by specifying the respective patterns
+       for the key and value.  Takes care of defining the Dict, ZeroOrMore, and Group tokens
+       in the proper order.  The key pattern can include delimiting markers or punctuation,
+       as long as they are suppressed, thereby leaving the significant key text.  The value
+       pattern can include named results, so that the Dict results can include named token
+       fields.
+    """
+    return Dict( ZeroOrMore( Group ( key + value ) ) )
+
+# convenience constants for positional expressions
+empty       = Empty().setName("empty")
+lineStart   = LineStart().setName("lineStart")
+lineEnd     = LineEnd().setName("lineEnd")
+stringStart = StringStart().setName("stringStart")
+stringEnd   = StringEnd().setName("stringEnd")
+
+_escapedPunc = Word( _bslash, r"\[]-*.$+^?()~ ", exact=2 ).setParseAction(lambda s,l,t:t[0][1])
+_printables_less_backslash = "".join([ c for c in printables if c not in  r"\]" ])
+_escapedHexChar = Combine( Suppress(_bslash + "0x") + Word(hexnums) ).setParseAction(lambda s,l,t:unichr(int(t[0],16)))
+_escapedOctChar = Combine( Suppress(_bslash) + Word("0","01234567") ).setParseAction(lambda s,l,t:unichr(int(t[0],8)))
+_singleChar = _escapedPunc | _escapedHexChar | _escapedOctChar | Word(_printables_less_backslash,exact=1)
+_charRange = Group(_singleChar + Suppress("-") + _singleChar)
+_reBracketExpr = Literal("[") + Optional("^").setResultsName("negate") + Group( OneOrMore( _charRange | _singleChar ) ).setResultsName("body") + "]"
+
+_expanded = lambda p: (isinstance(p,ParseResults) and ''.join([ unichr(c) for c in range(ord(p[0]),ord(p[1])+1) ]) or p)
+
+def srange(s):
+    r"""Helper to easily define string ranges for use in Word construction.  Borrows
+       syntax from regexp '[]' string range definitions::
+          srange("[0-9]")   -> "0123456789"
+          srange("[a-z]")   -> "abcdefghijklmnopqrstuvwxyz"
+          srange("[a-z$_]") -> "abcdefghijklmnopqrstuvwxyz$_"
+       The input string must be enclosed in []'s, and the returned string is the expanded
+       character set joined into a single string.
+       The values enclosed in the []'s may be::
+          a single character
+          an escaped character with a leading backslash (such as \- or \])
+          an escaped hex character with a leading '\0x' (\0x21, which is a '!' character)
+          an escaped octal character with a leading '\0' (\041, which is a '!' character)
+          a range of any of the above, separated by a dash ('a-z', etc.)
+          any combination of the above ('aeiouy', 'a-zA-Z0-9_$', etc.)
+    """
+    try:
+        return "".join([_expanded(part) for part in _reBracketExpr.parseString(s).body])
+    except:
+        return ""
+
+def matchOnlyAtCol(n):
+    """Helper method for defining parse actions that require matching at a specific
+       column in the input text.
+    """
+    def verifyCol(strg,locn,toks):
+        if col(locn,strg) != n:
+            raise ParseException(strg,locn,"matched token not at column %d" % n)
+    return verifyCol
+
+def replaceWith(replStr):
+    """Helper method for common parse actions that simply return a literal value.  Especially
+       useful when used with transformString().
+    """
+    def _replFunc(*args):
+        return [replStr]
+    return _replFunc
+
+def removeQuotes(s,l,t):
+    """Helper parse action for removing quotation marks from parsed quoted strings.
+       To use, add this parse action to quoted string using::
+         quotedString.setParseAction( removeQuotes )
+    """
+    return t[0][1:-1]
+
+def upcaseTokens(s,l,t):
+    """Helper parse action to convert tokens to upper case."""
+    return [ tt.upper() for tt in map(_ustr,t) ]
+
+def downcaseTokens(s,l,t):
+    """Helper parse action to convert tokens to lower case."""
+    return [ tt.lower() for tt in map(_ustr,t) ]
+
+def keepOriginalText(s,startLoc,t):
+    """Helper parse action to preserve original parsed text,
+       overriding any nested parse actions."""
+    try:
+        endloc = getTokensEndLoc()
+    except ParseException:
+        raise ParseFatalException("incorrect usage of keepOriginalText - may only be called as a parse action")
+    del t[:]
+    t += ParseResults(s[startLoc:endloc])
+    return t
+
+def getTokensEndLoc():
+    """Method to be called from within a parse action to determine the end
+       location of the parsed tokens."""
+    import inspect
+    fstack = inspect.stack()
+    try:
+        # search up the stack (through intervening argument normalizers) for correct calling routine
+        for f in fstack[2:]:
+            if f[3] == "_parseNoCache":
+                endloc = f[0].f_locals["loc"]
+                return endloc
+        else:
+            raise ParseFatalException("incorrect usage of getTokensEndLoc - may only be called from within a parse action")
+    finally:
+        del fstack
+
+def _makeTags(tagStr, xml):
+    """Internal helper to construct opening and closing tag expressions, given a tag name"""
+    if isinstance(tagStr,basestring):
+        resname = tagStr
+        tagStr = Keyword(tagStr, caseless=not xml)
+    else:
+        resname = tagStr.name
+
+    tagAttrName = Word(alphas,alphanums+"_-:")
+    if (xml):
+        tagAttrValue = dblQuotedString.copy().setParseAction( removeQuotes )
+        openTag = Suppress("<") + tagStr + \
+                Dict(ZeroOrMore(Group( tagAttrName + Suppress("=") + tagAttrValue ))) + \
+                Optional("/",default=[False]).setResultsName("empty").setParseAction(lambda s,l,t:t[0]=='/') + Suppress(">")
+    else:
+        printablesLessRAbrack = "".join( [ c for c in printables if c not in ">" ] )
+        tagAttrValue = quotedString.copy().setParseAction( removeQuotes ) | Word(printablesLessRAbrack)
+        openTag = Suppress("<") + tagStr + \
+                Dict(ZeroOrMore(Group( tagAttrName.setParseAction(downcaseTokens) + \
+                Optional( Suppress("=") + tagAttrValue ) ))) + \
+                Optional("/",default=[False]).setResultsName("empty").setParseAction(lambda s,l,t:t[0]=='/') + Suppress(">")
+    closeTag = Combine(_L("</") + tagStr + ">")
+
+    openTag = openTag.setResultsName("start"+"".join(resname.replace(":"," ").title().split())).setName("<%s>" % tagStr)
+    closeTag = closeTag.setResultsName("end"+"".join(resname.replace(":"," ").title().split())).setName("</%s>" % tagStr)
+
+    return openTag, closeTag
+
+def makeHTMLTags(tagStr):
+    """Helper to construct opening and closing tag expressions for HTML, given a tag name"""
+    return _makeTags( tagStr, False )
+
+def makeXMLTags(tagStr):
+    """Helper to construct opening and closing tag expressions for XML, given a tag name"""
+    return _makeTags( tagStr, True )
+
+def withAttribute(*args,**attrDict):
+    """Helper to create a validating parse action to be used with start tags created
+       with makeXMLTags or makeHTMLTags. Use withAttribute to qualify a starting tag
+       with a required attribute value, to avoid false matches on common tags such as
+       <TD> or <DIV>.
+
+       Call withAttribute with a series of attribute names and values. Specify the list
+       of filter attributes names and values as:
+        - keyword arguments, as in (class="Customer",align="right"), or
+        - a list of name-value tuples, as in ( ("ns1:class", "Customer"), ("ns2:align","right") )
+       For attribute names with a namespace prefix, you must use the second form.  Attribute
+       names are matched insensitive to upper/lower case.
+
+       To verify that the attribute exists, but without specifying a value, pass
+       withAttribute.ANY_VALUE as the value.
+       """
+    if args:
+        attrs = args[:]
+    else:
+        attrs = attrDict.items()
+    attrs = [(k,v) for k,v in attrs]
+    def pa(s,l,tokens):
+        for attrName,attrValue in attrs:
+            if attrName not in tokens:
+                raise ParseException(s,l,"no matching attribute " + attrName)
+            if attrValue != withAttribute.ANY_VALUE and tokens[attrName] != attrValue:
+                raise ParseException(s,l,"attribute '%s' has value '%s', must be '%s'" %
+                                            (attrName, tokens[attrName], attrValue))
+    return pa
+withAttribute.ANY_VALUE = object()
+
+opAssoc = _Constants()
+opAssoc.LEFT = object()
+opAssoc.RIGHT = object()
+
+def operatorPrecedence( baseExpr, opList ):
+    """Helper method for constructing grammars of expressions made up of
+       operators working in a precedence hierarchy.  Operators may be unary or
+       binary, left- or right-associative.  Parse actions can also be attached
+       to operator expressions.
+
+       Parameters:
+        - baseExpr - expression representing the most basic element for the nested
+        - opList - list of tuples, one for each operator precedence level in the
+          expression grammar; each tuple is of the form
+          (opExpr, numTerms, rightLeftAssoc, parseAction), where:
+           - opExpr is the pyparsing expression for the operator;
+              may also be a string, which will be converted to a Literal;
+              if numTerms is 3, opExpr is a tuple of two expressions, for the
+              two operators separating the 3 terms
+           - numTerms is the number of terms for this operator (must
+              be 1, 2, or 3)
+           - rightLeftAssoc is the indicator whether the operator is
+              right or left associative, using the pyparsing-defined
+              constants opAssoc.RIGHT and opAssoc.LEFT.
+           - parseAction is the parse action to be associated with
+              expressions matching this operator expression (the
+              parse action tuple member may be omitted)
+    """
+    ret = Forward()
+    lastExpr = baseExpr | ( Suppress('(') + ret + Suppress(')') )
+    for i,operDef in enumerate(opList):
+        opExpr,arity,rightLeftAssoc,pa = (operDef + (None,))[:4]
+        if arity == 3:
+            if opExpr is None or len(opExpr) != 2:
+                raise ValueError("if numterms=3, opExpr must be a tuple or list of two expressions")
+            opExpr1, opExpr2 = opExpr
+        thisExpr = Forward()#.setName("expr%d" % i)
+        if rightLeftAssoc == opAssoc.LEFT:
+            if arity == 1:
+                matchExpr = FollowedBy(lastExpr + opExpr) + Group( lastExpr + OneOrMore( opExpr ) )
+            elif arity == 2:
+                if opExpr is not None:
+                    matchExpr = FollowedBy(lastExpr + opExpr + lastExpr) + Group( lastExpr + OneOrMore( opExpr + lastExpr ) )
+                else:
+                    matchExpr = FollowedBy(lastExpr+lastExpr) + Group( lastExpr + OneOrMore(lastExpr) )
+            elif arity == 3:
+                matchExpr = FollowedBy(lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr) + \
+                            Group( lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr )
+            else:
+                raise ValueError("operator must be unary (1), binary (2), or ternary (3)")
+        elif rightLeftAssoc == opAssoc.RIGHT:
+            if arity == 1:
+                # try to avoid LR with this extra test
+                if not isinstance(opExpr, Optional):
+                    opExpr = Optional(opExpr)
+                matchExpr = FollowedBy(opExpr.expr + thisExpr) + Group( opExpr + thisExpr )
+            elif arity == 2:
+                if opExpr is not None:
+                    matchExpr = FollowedBy(lastExpr + opExpr + thisExpr) + Group( lastExpr + OneOrMore( opExpr + thisExpr ) )
+                else:
+                    matchExpr = FollowedBy(lastExpr + thisExpr) + Group( lastExpr + OneOrMore( thisExpr ) )
+            elif arity == 3:
+                matchExpr = FollowedBy(lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr) + \
+                            Group( lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr )
+            else:
+                raise ValueError("operator must be unary (1), binary (2), or ternary (3)")
+        else:
+            raise ValueError("operator must indicate right or left associativity")
+        if pa:
+            matchExpr.setParseAction( pa )
+        thisExpr << ( matchExpr | lastExpr )
+        lastExpr = thisExpr
+    ret << lastExpr
+    return ret
+
+dblQuotedString = Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\x[0-9a-fA-F]+)|(?:\\.))*"').setName("string enclosed in double quotes")
+sglQuotedString = Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\x[0-9a-fA-F]+)|(?:\\.))*'").setName("string enclosed in single quotes")
+quotedString = Regex(r'''(?:"(?:[^"\n\r\\]|(?:"")|(?:\\x[0-9a-fA-F]+)|(?:\\.))*")|(?:'(?:[^'\n\r\\]|(?:'')|(?:\\x[0-9a-fA-F]+)|(?:\\.))*')''').setName("quotedString using single or double quotes")
+unicodeString = Combine(_L('u') + quotedString.copy())
+
+def nestedExpr(opener="(", closer=")", content=None, ignoreExpr=quotedString):
+    """Helper method for defining nested lists enclosed in opening and closing
+       delimiters ("(" and ")" are the default).
+
+       Parameters:
+        - opener - opening character for a nested list (default="("); can also be a pyparsing expression
+        - closer - closing character for a nested list (default=")"); can also be a pyparsing expression
+        - content - expression for items within the nested lists (default=None)
+        - ignoreExpr - expression for ignoring opening and closing delimiters (default=quotedString)
+
+       If an expression is not provided for the content argument, the nested
+       expression will capture all whitespace-delimited content between delimiters
+       as a list of separate values.
+
+       Use the ignoreExpr argument to define expressions that may contain
+       opening or closing characters that should not be treated as opening
+       or closing characters for nesting, such as quotedString or a comment
+       expression.  Specify multiple expressions using an Or or MatchFirst.
+       The default is quotedString, but if no expressions are to be ignored,
+       then pass None for this argument.
+    """
+    if opener == closer:
+        raise ValueError("opening and closing strings cannot be the same")
+    if content is None:
+        if isinstance(opener,basestring) and isinstance(closer,basestring):
+            if ignoreExpr is not None:
+                content = (Combine(OneOrMore(~ignoreExpr +
+                                CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS,exact=1))
+                            ).setParseAction(lambda t:t[0].strip()))
+            else:
+                content = (empty+CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS).setParseAction(lambda t:t[0].strip()))
+        else:
+            raise ValueError("opening and closing arguments must be strings if no content expression is given")
+    ret = Forward()
+    if ignoreExpr is not None:
+        ret << Group( Suppress(opener) + ZeroOrMore( ignoreExpr | ret | content ) + Suppress(closer) )
+    else:
+        ret << Group( Suppress(opener) + ZeroOrMore( ret | content )  + Suppress(closer) )
+    return ret
+
+def indentedBlock(blockStatementExpr, indentStack, indent=True):
+    """Helper method for defining space-delimited indentation blocks, such as 
+       those used to define block statements in Python source code.
+       
+       Parameters:
+        - blockStatementExpr - expression defining syntax of statement that 
+            is repeated within the indented block
+        - indentStack - list created by caller to manage indentation stack
+            (multiple statementWithIndentedBlock expressions within a single grammar
+            should share a common indentStack)
+        - indent - boolean indicating whether block must be indented beyond the 
+            the current level; set to False for block of left-most statements
+            (default=True)
+
+       A valid block must contain at least one blockStatement.
+    """
+    def checkPeerIndent(s,l,t):
+        if l >= len(s): return
+        curCol = col(l,s)
+        if curCol != indentStack[-1]:
+            if curCol > indentStack[-1]:
+                raise ParseFatalException(s,l,"illegal nesting")
+            raise ParseException(s,l,"not a peer entry")
+
+    def checkSubIndent(s,l,t):
+        curCol = col(l,s)
+        if curCol > indentStack[-1]:
+            indentStack.append( curCol )
+        else:
+            raise ParseException(s,l,"not a subentry")
+
+    def checkUnindent(s,l,t):
+        if l >= len(s): return
+        curCol = col(l,s)
+        if not(indentStack and curCol < indentStack[-1] and curCol <= indentStack[-2]):
+            raise ParseException(s,l,"not an unindent")
+        indentStack.pop()
+
+    NL = OneOrMore(LineEnd().setWhitespaceChars("\t ").suppress())
+    INDENT = Empty() + Empty().setParseAction(checkSubIndent)
+    PEER   = Empty().setParseAction(checkPeerIndent)
+    UNDENT = Empty().setParseAction(checkUnindent)
+    if indent:
+        smExpr = Group( Optional(NL) +
+            FollowedBy(blockStatementExpr) +
+            INDENT + (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) + UNDENT)
+    else:
+        smExpr = Group( Optional(NL) +
+            (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) )
+    blockStatementExpr.ignore("\\" + LineEnd())
+    return smExpr
+
+alphas8bit = srange(r"[\0xc0-\0xd6\0xd8-\0xf6\0xf8-\0xff]")
+punc8bit = srange(r"[\0xa1-\0xbf\0xd7\0xf7]")
+
+anyOpenTag,anyCloseTag = makeHTMLTags(Word(alphas,alphanums+"_:"))
+commonHTMLEntity = Combine(_L("&") + oneOf("gt lt amp nbsp quot").setResultsName("entity") +";")
+_htmlEntityMap = dict(zip("gt lt amp nbsp quot".split(),"><& '"))
+replaceHTMLEntity = lambda t : t.entity in _htmlEntityMap and _htmlEntityMap[t.entity] or None
+
+# it's easy to get these comment structures wrong - they're very common, so may as well make them available
+cStyleComment = Regex(r"/\*(?:[^*]*\*+)+?/").setName("C style comment")
+
+htmlComment = Regex(r"<!--[\s\S]*?-->")
+restOfLine = Regex(r".*").leaveWhitespace()
+dblSlashComment = Regex(r"\/\/(\\\n|.)*").setName("// comment")
+cppStyleComment = Regex(r"/(?:\*(?:[^*]*\*+)+?/|/[^\n]*(?:\n[^\n]*)*?(?:(?<!\\)|\Z))").setName("C++ style comment")
+
+javaStyleComment = cppStyleComment
+pythonStyleComment = Regex(r"#.*").setName("Python style comment")
+_noncomma = "".join( [ c for c in printables if c != "," ] )
+_commasepitem = Combine(OneOrMore(Word(_noncomma) +
+                                  Optional( Word(" \t") +
+                                            ~Literal(",") + ~LineEnd() ) ) ).streamline().setName("commaItem")
+commaSeparatedList = delimitedList( Optional( quotedString | _commasepitem, default="") ).setName("commaSeparatedList")
+
+
+if __name__ == "__main__":
+
+    def test( teststring ):
+        try:
+            tokens = simpleSQL.parseString( teststring )
+            tokenlist = tokens.asList()
+            print (teststring + "->"   + str(tokenlist))
+            print ("tokens = "         + str(tokens))
+            print ("tokens.columns = " + str(tokens.columns))
+            print ("tokens.tables = "  + str(tokens.tables))
+            print (tokens.asXML("SQL",True))
+        except ParseBaseException,err:
+            print (teststring + "->")
+            print (err.line)
+            print (" "*(err.column-1) + "^")
+            print (err)
+        print()
+
+    selectToken    = CaselessLiteral( "select" )
+    fromToken      = CaselessLiteral( "from" )
+
+    ident          = Word( alphas, alphanums + "_$" )
+    columnName     = delimitedList( ident, ".", combine=True ).setParseAction( upcaseTokens )
+    columnNameList = Group( delimitedList( columnName ) )#.setName("columns")
+    tableName      = delimitedList( ident, ".", combine=True ).setParseAction( upcaseTokens )
+    tableNameList  = Group( delimitedList( tableName ) )#.setName("tables")
+    simpleSQL      = ( selectToken + \
+                     ( '*' | columnNameList ).setResultsName( "columns" ) + \
+                     fromToken + \
+                     tableNameList.setResultsName( "tables" ) )
+
+    test( "SELECT * from XYZZY, ABC" )
+    test( "select * from SYS.XYZZY" )
+    test( "Select A from Sys.dual" )
+    test( "Select AA,BB,CC from Sys.dual" )
+    test( "Select A, B, C from Sys.dual" )
+    test( "Select A, B, C from Sys.dual" )
+    test( "Xelect A, B, C from Sys.dual" )
+    test( "Select A, B, C frox Sys.dual" )
+    test( "Select" )
+    test( "Select ^^^ frox Sys.dual" )
+    test( "Select A, B, C from Sys.dual, Table2   " )
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx_extras/stats.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx_extras/stats.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx_extras/stats.py (revision 3)
@@ -0,0 +1,4344 @@
+# Copyright (c) 1999-2002 Gary Strangman; All Rights Reserved.
+#
+# This software is distributable under the terms of the GNU
+# General Public License (GPL) v2, the text of which can be found at
+# http://www.gnu.org/copyleft/gpl.html. Installing, importing or otherwise
+# using this module constitutes acceptance of the terms of this License.
+#
+# Disclaimer
+# 
+# This software is provided "as-is".  There are no expressed or implied
+# warranties of any kind, including, but not limited to, the warranties
+# of merchantability and fittness for a given application.  In no event
+# shall Gary Strangman be liable for any direct, indirect, incidental,
+# special, exemplary or consequential damages (including, but not limited
+# to, loss of use, data or profits, or business interruption) however
+# caused and on any theory of liability, whether in contract, strict
+# liability or tort (including negligence or otherwise) arising in any way
+# out of the use of this software, even if advised of the possibility of
+# such damage.
+#
+# Comments and/or additions are welcome (send e-mail to:
+# strang@nmr.mgh.harvard.edu).
+# 
+"""
+stats.py module
+
+(Requires pstat.py module.)
+
+#################################################
+#######  Written by:  Gary Strangman  ###########
+#######  Last modified:  May 10, 2002 ###########
+#################################################
+
+A collection of basic statistical functions for python.  The function
+names appear below.
+
+IMPORTANT:  There are really *3* sets of functions.  The first set has an 'l'
+prefix, which can be used with list or tuple arguments.  The second set has
+an 'a' prefix, which can accept NumPy array arguments.  These latter
+functions are defined only when NumPy is available on the system.  The third
+type has NO prefix (i.e., has the name that appears below).  Functions of
+this set are members of a "Dispatch" class, c/o David Ascher.  This class
+allows different functions to be called depending on the type of the passed
+arguments.  Thus, stats.mean is a member of the Dispatch class and
+stats.mean(range(20)) will call stats.lmean(range(20)) while
+stats.mean(Numeric.arange(20)) will call stats.amean(Numeric.arange(20)).
+This is a handy way to keep consistent function names when different
+argument types require different functions to be called.  Having
+implementated the Dispatch class, however, means that to get info on
+a given function, you must use the REAL function name ... that is
+"print stats.lmean.__doc__" or "print stats.amean.__doc__" work fine,
+while "print stats.mean.__doc__" will print the doc for the Dispatch
+class.  NUMPY FUNCTIONS ('a' prefix) generally have more argument options
+but should otherwise be consistent with the corresponding list functions.
+
+Disclaimers:  The function list is obviously incomplete and, worse, the
+functions are not optimized.  All functions have been tested (some more
+so than others), but they are far from bulletproof.  Thus, as with any
+free software, no warranty or guarantee is expressed or implied. :-)  A
+few extra functions that don't appear in the list below can be found by
+interested treasure-hunters.  These functions don't necessarily have
+both list and array versions but were deemed useful
+
+CENTRAL TENDENCY:  geometricmean
+                   harmonicmean
+                   mean
+                   median
+                   medianscore
+                   mode
+
+MOMENTS:  moment
+          variation
+          skew
+          kurtosis
+          skewtest   (for Numpy arrays only)
+          kurtosistest (for Numpy arrays only)
+          normaltest (for Numpy arrays only)
+
+ALTERED VERSIONS:  tmean  (for Numpy arrays only)
+                   tvar   (for Numpy arrays only)
+                   tmin   (for Numpy arrays only)
+                   tmax   (for Numpy arrays only)
+                   tstdev (for Numpy arrays only)
+                   tsem   (for Numpy arrays only)
+                   describe
+
+FREQUENCY STATS:  itemfreq
+                  scoreatpercentile
+                  percentileofscore
+                  histogram
+                  cumfreq
+                  relfreq
+
+VARIABILITY:  obrientransform
+              samplevar
+              samplestdev
+              signaltonoise (for Numpy arrays only)
+              var
+              stdev
+              sterr
+              sem
+              z
+              zs
+              zmap (for Numpy arrays only)
+
+TRIMMING FCNS:  threshold (for Numpy arrays only)
+                trimboth
+                trim1
+                round (round all vals to 'n' decimals; Numpy only)
+
+CORRELATION FCNS:  covariance  (for Numpy arrays only)
+                   correlation (for Numpy arrays only)
+                   paired
+                   pearsonr
+                   spearmanr
+                   pointbiserialr
+                   kendalltau
+                   linregress
+
+INFERENTIAL STATS:  ttest_1samp
+                    ttest_ind
+                    ttest_rel
+                    chisquare
+                    ks_2samp
+                    mannwhitneyu
+                    ranksums
+                    wilcoxont
+                    kruskalwallish
+                    friedmanchisquare
+
+PROBABILITY CALCS:  chisqprob
+                    erfcc
+                    zprob
+                    ksprob
+                    fprob
+                    betacf
+                    gammln 
+                    betai
+
+ANOVA FUNCTIONS:  F_oneway
+                  F_value
+
+SUPPORT FUNCTIONS:  writecc
+                    incr
+                    sign  (for Numpy arrays only)
+                    sum
+                    cumsum
+                    ss
+                    summult
+                    sumdiffsquared
+                    square_of_sums
+                    shellsort
+                    rankdata
+                    outputpairedstats
+                    findwithin
+"""
+## CHANGE LOG:
+## ===========
+## 02-11-19 ... fixed attest_ind and attest_rel for div-by-zero Overflows
+## 02-05-10 ... fixed lchisqprob indentation (failed when df=even)
+## 00-12-28 ... removed aanova() to separate module, fixed licensing to
+##                   match Python License, fixed doc string & imports
+## 00-04-13 ... pulled all "global" statements, except from aanova()
+##              added/fixed lots of documentation, removed io.py dependency
+##              changed to version 0.5
+## 99-11-13 ... added asign() function
+## 99-11-01 ... changed version to 0.4 ... enough incremental changes now
+## 99-10-25 ... added acovariance and acorrelation functions
+## 99-10-10 ... fixed askew/akurtosis to avoid divide-by-zero errors
+##              added aglm function (crude, but will be improved)
+## 99-10-04 ... upgraded acumsum, ass, asummult, asamplevar, avar, etc. to
+##                   all handle lists of 'dimension's and keepdims
+##              REMOVED ar0, ar2, ar3, ar4 and replaced them with around
+##              reinserted fixes for abetai to avoid math overflows
+## 99-09-05 ... rewrote achisqprob/aerfcc/aksprob/afprob/abetacf/abetai to
+##                   handle multi-dimensional arrays (whew!)
+## 99-08-30 ... fixed l/amoment, l/askew, l/akurtosis per D'Agostino (1990)
+##              added anormaltest per same reference
+##              re-wrote azprob to calc arrays of probs all at once
+## 99-08-22 ... edited attest_ind printing section so arrays could be rounded
+## 99-08-19 ... fixed amean and aharmonicmean for non-error(!) overflow on
+##                   short/byte arrays (mean of #s btw 100-300 = -150??)
+## 99-08-09 ... fixed asum so that the None case works for Byte arrays
+## 99-08-08 ... fixed 7/3 'improvement' to handle t-calcs on N-D arrays
+## 99-07-03 ... improved attest_ind, attest_rel (zero-division errortrap)
+## 99-06-24 ... fixed bug(?) in attest_ind (n1=a.shape[0])
+## 04/11/99 ... added asignaltonoise, athreshold functions, changed all
+##                   max/min in array section to N.maximum/N.minimum,
+##                   fixed square_of_sums to prevent integer overflow
+## 04/10/99 ... !!! Changed function name ... sumsquared ==> square_of_sums
+## 03/18/99 ... Added ar0, ar2, ar3 and ar4 rounding functions
+## 02/28/99 ... Fixed aobrientransform to return an array rather than a list
+## 01/15/99 ... Essentially ceased updating list-versions of functions (!!!)
+## 01/13/99 ... CHANGED TO VERSION 0.3
+##              fixed bug in a/lmannwhitneyu p-value calculation
+## 12/31/98 ... fixed variable-name bug in ldescribe
+## 12/19/98 ... fixed bug in findwithin (fcns needed pstat. prefix)
+## 12/16/98 ... changed amedianscore to return float (not array) for 1 score
+## 12/14/98 ... added atmin and atmax functions
+##              removed umath from import line (not needed)
+##              l/ageometricmean modified to reduce chance of overflows (take
+##                   nth root first, then multiply)
+## 12/07/98 ... added __version__variable (now 0.2)
+##              removed all 'stats.' from anova() fcn
+## 12/06/98 ... changed those functions (except shellsort) that altered
+##                   arguments in-place ... cumsum, ranksort, ...
+##              updated (and fixed some) doc-strings
+## 12/01/98 ... added anova() function (requires NumPy)
+##              incorporated Dispatch class
+## 11/12/98 ... added functionality to amean, aharmonicmean, ageometricmean
+##              added 'asum' function (added functionality to N.add.reduce)
+##              fixed both moment and amoment (two errors)
+##              changed name of skewness and askewness to skew and askew
+##              fixed (a)histogram (which sometimes counted points <lowerlimit)
+
+import pstat               # required 3rd party module
+import math, string, copy  # required python modules
+from types import *
+
+__version__ = 0.6
+
+############# DISPATCH CODE ##############
+
+
+class Dispatch:
+    """
+The Dispatch class, care of David Ascher, allows different functions to
+be called depending on the argument types.  This way, there can be one
+function name regardless of the argument type.  To access function doc
+in stats.py module, prefix the function with an 'l' or 'a' for list or
+array arguments, respectively.  That is, print stats.lmean.__doc__ or
+print stats.amean.__doc__ or whatever.
+"""
+
+    def __init__(self, *tuples):
+        self._dispatch = {}
+        for func, types in tuples:
+            for t in types:
+                if t in self._dispatch.keys():
+                    raise ValueError, "can't have two dispatches on "+str(t)
+                self._dispatch[t] = func
+        self._types = self._dispatch.keys()
+
+    def __call__(self, arg1, *args, **kw):
+        if type(arg1) not in self._types:
+            raise TypeError, "don't know how to dispatch %s arguments" %  type(arg1)
+        return apply(self._dispatch[type(arg1)], (arg1,) + args, kw)
+
+
+##########################################################################
+########################   LIST-BASED FUNCTIONS   ########################
+##########################################################################
+
+### Define these regardless
+
+####################################
+#######  CENTRAL TENDENCY  #########
+####################################
+
+def lgeometricmean (inlist):
+    """
+Calculates the geometric mean of the values in the passed list.
+That is:  n-th root of (x1 * x2 * ... * xn).  Assumes a '1D' list.
+
+Usage:   lgeometricmean(inlist)
+"""
+    mult = 1.0
+    one_over_n = 1.0/len(inlist)
+    for item in inlist:
+        mult = mult * pow(item,one_over_n)
+    return mult
+
+
+def lharmonicmean (inlist):
+    """
+Calculates the harmonic mean of the values in the passed list.
+That is:  n / (1/x1 + 1/x2 + ... + 1/xn).  Assumes a '1D' list.
+
+Usage:   lharmonicmean(inlist)
+"""
+    sum = 0
+    for item in inlist:
+        sum = sum + 1.0/item
+    return len(inlist) / sum
+
+
+def lmean (inlist):
+    """
+Returns the arithematic mean of the values in the passed list.
+Assumes a '1D' list, but will function on the 1st dim of an array(!).
+
+Usage:   lmean(inlist)
+"""
+    sum = 0
+    for item in inlist:
+        sum = sum + item
+    return sum/float(len(inlist))
+
+
+def lmedian (inlist,numbins=1000):
+    """
+Returns the computed median value of a list of numbers, given the
+number of bins to use for the histogram (more bins brings the computed value
+closer to the median score, default number of bins = 1000).  See G.W.
+Heiman's Basic Stats (1st Edition), or CRC Probability & Statistics.
+
+Usage:   lmedian (inlist, numbins=1000)
+"""
+    (hist, smallest, binsize, extras) = histogram(inlist,numbins) # make histog
+    cumhist = cumsum(hist)              # make cumulative histogram
+    for i in range(len(cumhist)):        # get 1st(!) index holding 50%ile score
+        if cumhist[i]>=len(inlist)/2.0:
+            cfbin = i
+            break
+    LRL = smallest + binsize*cfbin        # get lower read limit of that bin
+    cfbelow = cumhist[cfbin-1]
+    freq = float(hist[cfbin])                # frequency IN the 50%ile bin
+    median = LRL + ((len(inlist)/2.0 - cfbelow)/float(freq))*binsize  # median formula
+    return median
+
+
+def lmedianscore (inlist):
+    """
+Returns the 'middle' score of the passed list.  If there is an even
+number of scores, the mean of the 2 middle scores is returned.
+
+Usage:   lmedianscore(inlist)
+"""
+
+    newlist = copy.deepcopy(inlist)
+    newlist.sort()
+    if len(newlist) % 2 == 0:   # if even number of scores, average middle 2
+        index = len(newlist)/2  # integer division correct
+        median = float(newlist[index] + newlist[index-1]) /2
+    else:
+        index = len(newlist)/2  # int divsion gives mid value when count from 0
+        median = newlist[index]
+    return median
+
+
+def lmode(inlist):
+    """
+Returns a list of the modal (most common) score(s) in the passed
+list.  If there is more than one such score, all are returned.  The
+bin-count for the mode(s) is also returned.
+
+Usage:   lmode(inlist)
+Returns: bin-count for mode(s), a list of modal value(s)
+"""
+
+    scores = pstat.unique(inlist)
+    scores.sort()
+    freq = []
+    for item in scores:
+        freq.append(inlist.count(item))
+    maxfreq = max(freq)
+    mode = []
+    stillmore = 1
+    while stillmore:
+        try:
+            indx = freq.index(maxfreq)
+            mode.append(scores[indx])
+            del freq[indx]
+            del scores[indx]
+        except ValueError:
+            stillmore=0
+    return maxfreq, mode
+
+
+####################################
+############  MOMENTS  #############
+####################################
+
+def lmoment(inlist,moment=1):
+    """
+Calculates the nth moment about the mean for a sample (defaults to
+the 1st moment).  Used to calculate coefficients of skewness and kurtosis.
+
+Usage:   lmoment(inlist,moment=1)
+Returns: appropriate moment (r) from ... 1/n * SUM((inlist(i)-mean)**r)
+"""
+    if moment == 1:
+        return 0.0
+    else:
+        mn = mean(inlist)
+        n = len(inlist)
+        s = 0
+        for x in inlist:
+            s = s + (x-mn)**moment
+        return s/float(n)
+
+
+def lvariation(inlist):
+    """
+Returns the coefficient of variation, as defined in CRC Standard
+Probability and Statistics, p.6.
+
+Usage:   lvariation(inlist)
+"""
+    return 100.0*samplestdev(inlist)/float(mean(inlist))
+
+
+def lskew(inlist):
+    """
+Returns the skewness of a distribution, as defined in Numerical
+Recipies (alternate defn in CRC Standard Probability and Statistics, p.6.)
+
+Usage:   lskew(inlist)
+"""
+    return moment(inlist,3)/pow(moment(inlist,2),1.5)
+
+
+def lkurtosis(inlist):
+    """
+Returns the kurtosis of a distribution, as defined in Numerical
+Recipies (alternate defn in CRC Standard Probability and Statistics, p.6.)
+
+Usage:   lkurtosis(inlist)
+"""
+    return moment(inlist,4)/pow(moment(inlist,2),2.0)
+
+
+def ldescribe(inlist):
+    """
+Returns some descriptive statistics of the passed list (assumed to be 1D).
+
+Usage:   ldescribe(inlist)
+Returns: n, mean, standard deviation, skew, kurtosis
+"""
+    n = len(inlist)
+    mm = (min(inlist),max(inlist))
+    m = mean(inlist)
+    sd = stdev(inlist)
+    sk = skew(inlist)
+    kurt = kurtosis(inlist)
+    return n, mm, m, sd, sk, kurt
+
+
+####################################
+#######  FREQUENCY STATS  ##########
+####################################
+
+def litemfreq(inlist):
+    """
+Returns a list of pairs.  Each pair consists of one of the scores in inlist
+and it's frequency count.  Assumes a 1D list is passed.
+
+Usage:   litemfreq(inlist)
+Returns: a 2D frequency table (col [0:n-1]=scores, col n=frequencies)
+"""
+    scores = pstat.unique(inlist)
+    scores.sort()
+    freq = []
+    for item in scores:
+        freq.append(inlist.count(item))
+    return pstat.abut(scores, freq)
+
+
+def lscoreatpercentile (inlist, percent):
+    """
+Returns the score at a given percentile relative to the distribution
+given by inlist.
+
+Usage:   lscoreatpercentile(inlist,percent)
+"""
+    if percent > 1:
+        print "\nDividing percent>1 by 100 in lscoreatpercentile().\n"
+        percent = percent / 100.0
+    targetcf = percent*len(inlist)
+    h, lrl, binsize, extras = histogram(inlist)
+    cumhist = cumsum(copy.deepcopy(h))
+    for i in range(len(cumhist)):
+        if cumhist[i] >= targetcf:
+            break
+    score = binsize * ((targetcf - cumhist[i-1]) / float(h[i])) + (lrl+binsize*i)
+    return score
+
+
+def lpercentileofscore (inlist, score,histbins=10,defaultlimits=None):
+    """
+Returns the percentile value of a score relative to the distribution
+given by inlist.  Formula depends on the values used to histogram the data(!).
+
+Usage:   lpercentileofscore(inlist,score,histbins=10,defaultlimits=None)
+"""
+
+    h, lrl, binsize, extras = histogram(inlist,histbins,defaultlimits)
+    cumhist = cumsum(copy.deepcopy(h))
+    i = int((score - lrl)/float(binsize))
+    pct = (cumhist[i-1]+((score-(lrl+binsize*i))/float(binsize))*h[i])/float(len(inlist)) * 100
+    return pct
+
+
+def lhistogram (inlist,numbins=10,defaultreallimits=None,printextras=0):
+    """
+Returns (i) a list of histogram bin counts, (ii) the smallest value
+of the histogram binning, and (iii) the bin width (the last 2 are not
+necessarily integers).  Default number of bins is 10.  If no sequence object
+is given for defaultreallimits, the routine picks (usually non-pretty) bins
+spanning all the numbers in the inlist.
+
+Usage:   lhistogram (inlist, numbins=10, defaultreallimits=None,suppressoutput=0)
+Returns: list of bin values, lowerreallimit, binsize, extrapoints
+"""
+    if (defaultreallimits <> None):
+        if type(defaultreallimits) not in [ListType,TupleType] or len(defaultreallimits)==1: # only one limit given, assumed to be lower one & upper is calc'd
+            lowerreallimit = defaultreallimits
+            upperreallimit = 1.0001 * max(inlist)
+        else: # assume both limits given
+            lowerreallimit = defaultreallimits[0]
+            upperreallimit = defaultreallimits[1]
+        binsize = (upperreallimit-lowerreallimit)/float(numbins)
+    else:     # no limits given for histogram, both must be calc'd
+        estbinwidth=(max(inlist)-min(inlist))/float(numbins) + 1 # 1=>cover all
+        binsize = ((max(inlist)-min(inlist)+estbinwidth))/float(numbins)
+        lowerreallimit = min(inlist) - binsize/2 #lower real limit,1st bin
+    bins = [0]*(numbins)
+    extrapoints = 0
+    for num in inlist:
+        try:
+            if (num-lowerreallimit) < 0:
+                extrapoints = extrapoints + 1
+            else:
+                bintoincrement = int((num-lowerreallimit)/float(binsize))
+                bins[bintoincrement] = bins[bintoincrement] + 1
+        except:
+            extrapoints = extrapoints + 1
+    if (extrapoints > 0 and printextras == 1):
+        print '\nPoints outside given histogram range =',extrapoints
+    return (bins, lowerreallimit, binsize, extrapoints)
+
+
+def lcumfreq(inlist,numbins=10,defaultreallimits=None):
+    """
+Returns a cumulative frequency histogram, using the histogram function.
+
+Usage:   lcumfreq(inlist,numbins=10,defaultreallimits=None)
+Returns: list of cumfreq bin values, lowerreallimit, binsize, extrapoints
+"""
+    h,l,b,e = histogram(inlist,numbins,defaultreallimits)
+    cumhist = cumsum(copy.deepcopy(h))
+    return cumhist,l,b,e
+
+
+def lrelfreq(inlist,numbins=10,defaultreallimits=None):
+    """
+Returns a relative frequency histogram, using the histogram function.
+
+Usage:   lrelfreq(inlist,numbins=10,defaultreallimits=None)
+Returns: list of cumfreq bin values, lowerreallimit, binsize, extrapoints
+"""
+    h,l,b,e = histogram(inlist,numbins,defaultreallimits)
+    for i in range(len(h)):
+        h[i] = h[i]/float(len(inlist))
+    return h,l,b,e
+
+
+####################################
+#####  VARIABILITY FUNCTIONS  ######
+####################################
+
+def lobrientransform(*args):
+    """
+Computes a transform on input data (any number of columns).  Used to
+test for homogeneity of variance prior to running one-way stats.  From
+Maxwell and Delaney, p.112.
+
+Usage:   lobrientransform(*args)
+Returns: transformed data for use in an ANOVA
+"""
+    TINY = 1e-10
+    k = len(args)
+    n = [0.0]*k
+    v = [0.0]*k
+    m = [0.0]*k
+    nargs = []
+    for i in range(k):
+        nargs.append(copy.deepcopy(args[i]))
+        n[i] = float(len(nargs[i]))
+        v[i] = var(nargs[i])
+        m[i] = mean(nargs[i])
+    for j in range(k):
+        for i in range(n[j]):
+            t1 = (n[j]-1.5)*n[j]*(nargs[j][i]-m[j])**2
+            t2 = 0.5*v[j]*(n[j]-1.0)
+            t3 = (n[j]-1.0)*(n[j]-2.0)
+            nargs[j][i] = (t1-t2) / float(t3)
+    check = 1
+    for j in range(k):
+        if v[j] - mean(nargs[j]) > TINY:
+            check = 0
+    if check <> 1:
+        raise ValueError, 'Problem in obrientransform.'
+    else:
+        return nargs
+
+
+def lsamplevar (inlist):
+    """
+Returns the variance of the values in the passed list using
+N for the denominator (i.e., DESCRIBES the sample variance only).
+
+Usage:   lsamplevar(inlist)
+"""
+    n = len(inlist)
+    mn = mean(inlist)
+    deviations = []
+    for item in inlist:
+        deviations.append(item-mn)
+    return ss(deviations)/float(n)
+
+
+def lsamplestdev (inlist):
+    """
+Returns the standard deviation of the values in the passed list using
+N for the denominator (i.e., DESCRIBES the sample stdev only).
+
+Usage:   lsamplestdev(inlist)
+"""
+    return math.sqrt(samplevar(inlist))
+
+
+def lvar (inlist):
+    """
+Returns the variance of the values in the passed list using N-1
+for the denominator (i.e., for estimating population variance).
+
+Usage:   lvar(inlist)
+"""
+    n = len(inlist)
+    mn = mean(inlist)
+    deviations = [0]*len(inlist)
+    for i in range(len(inlist)):
+        deviations[i] = inlist[i] - mn
+    return ss(deviations)/float(n-1)
+
+
+def lstdev (inlist):
+    """
+Returns the standard deviation of the values in the passed list
+using N-1 in the denominator (i.e., to estimate population stdev).
+
+Usage:   lstdev(inlist)
+"""
+    return math.sqrt(var(inlist))
+
+
+def lsterr(inlist):
+    """
+Returns the standard error of the values in the passed list using N-1
+in the denominator (i.e., to estimate population standard error).
+
+Usage:   lsterr(inlist)
+"""
+    return stdev(inlist) / float(math.sqrt(len(inlist)))
+
+
+def lsem (inlist):
+    """
+Returns the estimated standard error of the mean (sx-bar) of the
+values in the passed list.  sem = stdev / sqrt(n)
+
+Usage:   lsem(inlist)
+"""
+    sd = stdev(inlist)
+    n = len(inlist)
+    return sd/math.sqrt(n)
+
+
+def lz (inlist, score):
+    """
+Returns the z-score for a given input score, given that score and the
+list from which that score came.  Not appropriate for population calculations.
+
+Usage:   lz(inlist, score)
+"""
+    z = (score-mean(inlist))/samplestdev(inlist)
+    return z
+
+
+def lzs (inlist):
+    """
+Returns a list of z-scores, one for each score in the passed list.
+
+Usage:   lzs(inlist)
+"""
+    zscores = []
+    for item in inlist:
+        zscores.append(z(inlist,item))
+    return zscores
+
+
+####################################
+#######  TRIMMING FUNCTIONS  #######
+####################################
+
+def ltrimboth (l,proportiontocut):
+    """
+Slices off the passed proportion of items from BOTH ends of the passed
+list (i.e., with proportiontocut=0.1, slices 'leftmost' 10% AND 'rightmost'
+10% of scores.  Assumes list is sorted by magnitude.  Slices off LESS if
+proportion results in a non-integer slice index (i.e., conservatively
+slices off proportiontocut).
+
+Usage:   ltrimboth (l,proportiontocut)
+Returns: trimmed version of list l
+"""
+    lowercut = int(proportiontocut*len(l))
+    uppercut = len(l) - lowercut
+    return l[lowercut:uppercut]
+
+
+def ltrim1 (l,proportiontocut,tail='right'):
+    """
+Slices off the passed proportion of items from ONE end of the passed
+list (i.e., if proportiontocut=0.1, slices off 'leftmost' or 'rightmost'
+10% of scores).  Slices off LESS if proportion results in a non-integer
+slice index (i.e., conservatively slices off proportiontocut).
+
+Usage:   ltrim1 (l,proportiontocut,tail='right')  or set tail='left'
+Returns: trimmed version of list l
+"""
+    if tail == 'right':
+        lowercut = 0
+        uppercut = len(l) - int(proportiontocut*len(l))
+    elif tail == 'left':
+        lowercut = int(proportiontocut*len(l))
+        uppercut = len(l)
+    return l[lowercut:uppercut]
+
+
+####################################
+#####  CORRELATION FUNCTIONS  ######
+####################################
+
+def lpaired(x,y):
+    """
+Interactively determines the type of data and then runs the
+appropriated statistic for paired group data.
+
+Usage:   lpaired(x,y)
+Returns: appropriate statistic name, value, and probability
+"""
+    samples = ''
+    while samples not in ['i','r','I','R','c','C']:
+        print '\nIndependent or related samples, or correlation (i,r,c): ',
+        samples = raw_input()
+
+    if samples in ['i','I','r','R']:
+        print '\nComparing variances ...',
+# USE O'BRIEN'S TEST FOR HOMOGENEITY OF VARIANCE, Maxwell & delaney, p.112
+        r = obrientransform(x,y)
+        f,p = F_oneway(pstat.colex(r,0),pstat.colex(r,1))
+        if p<0.05:
+            vartype='unequal, p='+str(round(p,4))
+        else:
+            vartype='equal'
+        print vartype
+        if samples in ['i','I']:
+            if vartype[0]=='e':
+                t,p = ttest_ind(x,y,0)
+                print '\nIndependent samples t-test:  ', round(t,4),round(p,4)
+            else:
+                if len(x)>20 or len(y)>20:
+                    z,p = ranksums(x,y)
+                    print '\nRank Sums test (NONparametric, n>20):  ', round(z,4),round(p,4)
+                else:
+                    u,p = mannwhitneyu(x,y)
+                    print '\nMann-Whitney U-test (NONparametric, ns<20):  ', round(u,4),round(p,4)
+
+        else:  # RELATED SAMPLES
+            if vartype[0]=='e':
+                t,p = ttest_rel(x,y,0)
+                print '\nRelated samples t-test:  ', round(t,4),round(p,4)
+            else:
+                t,p = ranksums(x,y)
+                print '\nWilcoxon T-test (NONparametric):  ', round(t,4),round(p,4)
+    else:  # CORRELATION ANALYSIS
+        corrtype = ''
+        while corrtype not in ['c','C','r','R','d','D']:
+            print '\nIs the data Continuous, Ranked, or Dichotomous (c,r,d): ',
+            corrtype = raw_input()
+        if corrtype in ['c','C']:
+            m,b,r,p,see = linregress(x,y)
+            print '\nLinear regression for continuous variables ...'
+            lol = [['Slope','Intercept','r','Prob','SEestimate'],[round(m,4),round(b,4),round(r,4),round(p,4),round(see,4)]]
+            pstat.printcc(lol)
+        elif corrtype in ['r','R']:
+            r,p = spearmanr(x,y)
+            print '\nCorrelation for ranked variables ...'
+            print "Spearman's r: ",round(r,4),round(p,4)
+        else: # DICHOTOMOUS
+            r,p = pointbiserialr(x,y)
+            print '\nAssuming x contains a dichotomous variable ...'
+            print 'Point Biserial r: ',round(r,4),round(p,4)
+    print '\n\n'
+    return None
+
+
+def lpearsonr(x,y):
+    """
+Calculates a Pearson correlation coefficient and the associated
+probability value.  Taken from Heiman's Basic Statistics for the Behav.
+Sci (2nd), p.195.
+
+Usage:   lpearsonr(x,y)      where x and y are equal-length lists
+Returns: Pearson's r value, two-tailed p-value
+"""
+    TINY = 1.0e-30
+    if len(x) <> len(y):
+        raise ValueError, 'Input values not paired in pearsonr.  Aborting.'
+    n = len(x)
+    x = map(float,x)
+    y = map(float,y)
+    xmean = mean(x)
+    ymean = mean(y)
+    r_num = n*(summult(x,y)) - sum(x)*sum(y)
+    r_den = math.sqrt((n*ss(x) - square_of_sums(x))*(n*ss(y)-square_of_sums(y)))
+    r = (r_num / r_den)  # denominator already a float
+    df = n-2
+    t = r*math.sqrt(df/((1.0-r+TINY)*(1.0+r+TINY)))
+    prob = betai(0.5*df,0.5,df/float(df+t*t))
+    return r, prob
+
+
+def lspearmanr(x,y):
+    """
+Calculates a Spearman rank-order correlation coefficient.  Taken
+from Heiman's Basic Statistics for the Behav. Sci (1st), p.192.
+
+Usage:   lspearmanr(x,y)      where x and y are equal-length lists
+Returns: Spearman's r, two-tailed p-value
+"""
+    TINY = 1e-30
+    if len(x) <> len(y):
+        raise ValueError, 'Input values not paired in spearmanr.  Aborting.'
+    n = len(x)
+    rankx = rankdata(x)
+    ranky = rankdata(y)
+    dsq = sumdiffsquared(rankx,ranky)
+    rs = 1 - 6*dsq / float(n*(n**2-1))
+    t = rs * math.sqrt((n-2) / ((rs+1.0)*(1.0-rs)))
+    df = n-2
+    probrs = betai(0.5*df,0.5,df/(df+t*t))  # t already a float
+# probability values for rs are from part 2 of the spearman function in
+# Numerical Recipies, p.510.  They are close to tables, but not exact. (?)
+    return rs, probrs
+
+
+def lpointbiserialr(x,y):
+    """
+Calculates a point-biserial correlation coefficient and the associated
+probability value.  Taken from Heiman's Basic Statistics for the Behav.
+Sci (1st), p.194.
+
+Usage:   lpointbiserialr(x,y)      where x,y are equal-length lists
+Returns: Point-biserial r, two-tailed p-value
+"""
+    TINY = 1e-30
+    if len(x) <> len(y):
+        raise ValueError, 'INPUT VALUES NOT PAIRED IN pointbiserialr.  ABORTING.'
+    data = pstat.abut(x,y)
+    categories = pstat.unique(x)
+    if len(categories) <> 2:
+        raise ValueError, "Exactly 2 categories required for pointbiserialr()."
+    else:   # there are 2 categories, continue
+        codemap = pstat.abut(categories,range(2))
+        recoded = pstat.recode(data,codemap,0)
+        x = pstat.linexand(data,0,categories[0])
+        y = pstat.linexand(data,0,categories[1])
+        xmean = mean(pstat.colex(x,1))
+        ymean = mean(pstat.colex(y,1))
+        n = len(data)
+        adjust = math.sqrt((len(x)/float(n))*(len(y)/float(n)))
+        rpb = (ymean - xmean)/samplestdev(pstat.colex(data,1))*adjust
+        df = n-2
+        t = rpb*math.sqrt(df/((1.0-rpb+TINY)*(1.0+rpb+TINY)))
+        prob = betai(0.5*df,0.5,df/(df+t*t))  # t already a float
+        return rpb, prob
+
+
+def lkendalltau(x,y):
+    """
+Calculates Kendall's tau ... correlation of ordinal data.  Adapted
+from function kendl1 in Numerical Recipies.  Needs good test-routine.@@@
+
+Usage:   lkendalltau(x,y)
+Returns: Kendall's tau, two-tailed p-value
+"""
+    n1 = 0
+    n2 = 0
+    iss = 0
+    for j in range(len(x)-1):
+        for k in range(j,len(y)):
+            a1 = x[j] - x[k]
+            a2 = y[j] - y[k]
+            aa = a1 * a2
+            if (aa):             # neither list has a tie
+                n1 = n1 + 1
+                n2 = n2 + 1
+                if aa > 0:
+                    iss = iss + 1
+                else:
+                    iss = iss -1
+            else:
+                if (a1):
+                    n1 = n1 + 1
+                else:
+                    n2 = n2 + 1
+    tau = iss / math.sqrt(n1*n2)
+    svar = (4.0*len(x)+10.0) / (9.0*len(x)*(len(x)-1))
+    z = tau / math.sqrt(svar)
+    prob = erfcc(abs(z)/1.4142136)
+    return tau, prob
+
+
+def llinregress(x,y):
+    """
+Calculates a regression line on x,y pairs.  
+
+Usage:   llinregress(x,y)      x,y are equal-length lists of x-y coordinates
+Returns: slope, intercept, r, two-tailed prob, sterr-of-estimate
+"""
+    TINY = 1.0e-20
+    if len(x) <> len(y):
+        raise ValueError, 'Input values not paired in linregress.  Aborting.'
+    n = len(x)
+    x = map(float,x)
+    y = map(float,y)
+    xmean = mean(x)
+    ymean = mean(y)
+    r_num = float(n*(summult(x,y)) - sum(x)*sum(y))
+    r_den = math.sqrt((n*ss(x) - square_of_sums(x))*(n*ss(y)-square_of_sums(y)))
+    r = r_num / r_den
+    z = 0.5*math.log((1.0+r+TINY)/(1.0-r+TINY))
+    df = n-2
+    t = r*math.sqrt(df/((1.0-r+TINY)*(1.0+r+TINY)))
+    prob = betai(0.5*df,0.5,df/(df+t*t))
+    slope = r_num / float(n*ss(x) - square_of_sums(x))
+    intercept = ymean - slope*xmean
+    sterrest = math.sqrt(1-r*r)*samplestdev(y)
+    return slope, intercept, r, prob, sterrest
+
+
+####################################
+#####  INFERENTIAL STATISTICS  #####
+####################################
+
+def lttest_1samp(a,popmean,printit=0,name='Sample',writemode='a'):
+    """
+Calculates the t-obtained for the independent samples T-test on ONE group
+of scores a, given a population mean.  If printit=1, results are printed
+to the screen.  If printit='filename', the results are output to 'filename'
+using the given writemode (default=append).  Returns t-value, and prob.
+
+Usage:   lttest_1samp(a,popmean,Name='Sample',printit=0,writemode='a')
+Returns: t-value, two-tailed prob
+"""
+    x = mean(a)
+    v = var(a)
+    n = len(a)
+    df = n-1
+    svar = ((n-1)*v)/float(df)
+    t = (x-popmean)/math.sqrt(svar*(1.0/n))
+    prob = betai(0.5*df,0.5,float(df)/(df+t*t))
+
+    if printit <> 0:
+        statname = 'Single-sample T-test.'
+        outputpairedstats(printit,writemode,
+                          'Population','--',popmean,0,0,0,
+                          name,n,x,v,min(a),max(a),
+                          statname,t,prob)
+    return t,prob
+
+
+def lttest_ind (a, b, printit=0, name1='Samp1', name2='Samp2', writemode='a'):
+    """
+Calculates the t-obtained T-test on TWO INDEPENDENT samples of
+scores a, and b.  From Numerical Recipies, p.483.  If printit=1, results
+are printed to the screen.  If printit='filename', the results are output
+to 'filename' using the given writemode (default=append).  Returns t-value,
+and prob.
+
+Usage:   lttest_ind(a,b,printit=0,name1='Samp1',name2='Samp2',writemode='a')
+Returns: t-value, two-tailed prob
+"""
+    x1 = mean(a)
+    x2 = mean(b)
+    v1 = stdev(a)**2
+    v2 = stdev(b)**2
+    n1 = len(a)
+    n2 = len(b)
+    df = n1+n2-2
+    svar = ((n1-1)*v1+(n2-1)*v2)/float(df)
+    t = (x1-x2)/math.sqrt(svar*(1.0/n1 + 1.0/n2))
+    prob = betai(0.5*df,0.5,df/(df+t*t))
+
+    if printit <> 0:
+        statname = 'Independent samples T-test.'
+        outputpairedstats(printit,writemode,
+                          name1,n1,x1,v1,min(a),max(a),
+                          name2,n2,x2,v2,min(b),max(b),
+                          statname,t,prob)
+    return t,prob
+
+
+def lttest_rel (a,b,printit=0,name1='Sample1',name2='Sample2',writemode='a'):
+    """
+Calculates the t-obtained T-test on TWO RELATED samples of scores,
+a and b.  From Numerical Recipies, p.483.  If printit=1, results are
+printed to the screen.  If printit='filename', the results are output to
+'filename' using the given writemode (default=append).  Returns t-value,
+and prob.
+
+Usage:   lttest_rel(a,b,printit=0,name1='Sample1',name2='Sample2',writemode='a')
+Returns: t-value, two-tailed prob
+"""
+    if len(a)<>len(b):
+        raise ValueError, 'Unequal length lists in ttest_rel.'
+    x1 = mean(a)
+    x2 = mean(b)
+    v1 = var(a)
+    v2 = var(b)
+    n = len(a)
+    cov = 0
+    for i in range(len(a)):
+        cov = cov + (a[i]-x1) * (b[i]-x2)
+    df = n-1
+    cov = cov / float(df)
+    sd = math.sqrt((v1+v2 - 2.0*cov)/float(n))
+    t = (x1-x2)/sd
+    prob = betai(0.5*df,0.5,df/(df+t*t))
+
+    if printit <> 0:
+        statname = 'Related samples T-test.'
+        outputpairedstats(printit,writemode,
+                          name1,n,x1,v1,min(a),max(a),
+                          name2,n,x2,v2,min(b),max(b),
+                          statname,t,prob)
+    return t, prob
+
+
+def lchisquare(f_obs,f_exp=None):
+    """
+Calculates a one-way chi square for list of observed frequencies and returns
+the result.  If no expected frequencies are given, the total N is assumed to
+be equally distributed across all groups.
+
+Usage:   lchisquare(f_obs, f_exp=None)   f_obs = list of observed cell freq.
+Returns: chisquare-statistic, associated p-value
+"""
+    k = len(f_obs)                 # number of groups
+    if f_exp == None:
+        f_exp = [sum(f_obs)/float(k)] * len(f_obs) # create k bins with = freq.
+    chisq = 0
+    for i in range(len(f_obs)):
+        chisq = chisq + (f_obs[i]-f_exp[i])**2 / float(f_exp[i])
+    return chisq, chisqprob(chisq, k-1)
+
+
+def lks_2samp (data1,data2):
+    """
+Computes the Kolmogorov-Smirnof statistic on 2 samples.  From
+Numerical Recipies in C, page 493.
+
+Usage:   lks_2samp(data1,data2)   data1&2 are lists of values for 2 conditions
+Returns: KS D-value, associated p-value
+"""
+    j1 = 0
+    j2 = 0
+    fn1 = 0.0
+    fn2 = 0.0
+    n1 = len(data1)
+    n2 = len(data2)
+    en1 = n1
+    en2 = n2
+    d = 0.0
+    data1.sort()
+    data2.sort()
+    while j1 < n1 and j2 < n2:
+        d1=data1[j1]
+        d2=data2[j2]
+        if d1 <= d2:
+            fn1 = (j1)/float(en1)
+            j1 = j1 + 1
+        if d2 <= d1:
+            fn2 = (j2)/float(en2)
+            j2 = j2 + 1
+        dt = (fn2-fn1)
+        if math.fabs(dt) > math.fabs(d):
+            d = dt
+    try:
+        en = math.sqrt(en1*en2/float(en1+en2))
+        prob = ksprob((en+0.12+0.11/en)*abs(d))
+    except:
+        prob = 1.0
+    return d, prob
+
+
+def lmannwhitneyu(x,y):
+    """
+Calculates a Mann-Whitney U statistic on the provided scores and
+returns the result.  Use only when the n in each condition is < 20 and
+you have 2 independent samples of ranks.  NOTE: Mann-Whitney U is
+significant if the u-obtained is LESS THAN or equal to the critical
+value of U found in the tables.  Equivalent to Kruskal-Wallis H with
+just 2 groups.
+
+Usage:   lmannwhitneyu(data)
+Returns: u-statistic, one-tailed p-value (i.e., p(z(U)))
+"""
+    n1 = len(x)
+    n2 = len(y)
+    ranked = rankdata(x+y)
+    rankx = ranked[0:n1]       # get the x-ranks
+    ranky = ranked[n1:]        # the rest are y-ranks
+    u1 = n1*n2 + (n1*(n1+1))/2.0 - sum(rankx)  # calc U for x
+    u2 = n1*n2 - u1                            # remainder is U for y
+    bigu = max(u1,u2)
+    smallu = min(u1,u2)
+    T = math.sqrt(tiecorrect(ranked))  # correction factor for tied scores
+    if T == 0:
+        raise ValueError, 'All numbers are identical in lmannwhitneyu'
+    sd = math.sqrt(T*n1*n2*(n1+n2+1)/12.0)
+    z = abs((bigu-n1*n2/2.0) / sd)  # normal approximation for prob calc
+    return smallu, 1.0 - zprob(z)
+
+
+def ltiecorrect(rankvals):
+    """
+Corrects for ties in Mann Whitney U and Kruskal Wallis H tests.  See
+Siegel, S. (1956) Nonparametric Statistics for the Behavioral Sciences.
+New York: McGraw-Hill.  Code adapted from |Stat rankind.c code.
+
+Usage:   ltiecorrect(rankvals)
+Returns: T correction factor for U or H
+"""
+    sorted,posn = shellsort(rankvals)
+    n = len(sorted)
+    T = 0.0
+    i = 0
+    while (i<n-1):
+        if sorted[i] == sorted[i+1]:
+            nties = 1
+            while (i<n-1) and (sorted[i] == sorted[i+1]):
+                nties = nties +1
+                i = i +1
+            T = T + nties**3 - nties
+        i = i+1
+    T = T / float(n**3-n)
+    return 1.0 - T
+
+
+def lranksums(x,y):
+    """
+Calculates the rank sums statistic on the provided scores and
+returns the result.  Use only when the n in each condition is > 20 and you
+have 2 independent samples of ranks.
+
+Usage:   lranksums(x,y)
+Returns: a z-statistic, two-tailed p-value
+"""
+    n1 = len(x)
+    n2 = len(y)
+    alldata = x+y
+    ranked = rankdata(alldata)
+    x = ranked[:n1]
+    y = ranked[n1:]
+    s = sum(x)
+    expected = n1*(n1+n2+1) / 2.0
+    z = (s - expected) / math.sqrt(n1*n2*(n1+n2+1)/12.0)
+    prob = 2*(1.0 -zprob(abs(z)))
+    return z, prob
+
+
+def lwilcoxont(x,y):
+    """
+Calculates the Wilcoxon T-test for related samples and returns the
+result.  A non-parametric T-test.
+
+Usage:   lwilcoxont(x,y)
+Returns: a t-statistic, two-tail probability estimate
+"""
+    if len(x) <> len(y):
+        raise ValueError, 'Unequal N in wilcoxont.  Aborting.'
+    d=[]
+    for i in range(len(x)):
+        diff = x[i] - y[i]
+        if diff <> 0:
+            d.append(diff)
+    count = len(d)
+    absd = map(abs,d)
+    absranked = rankdata(absd)
+    r_plus = 0.0
+    r_minus = 0.0
+    for i in range(len(absd)):
+        if d[i] < 0:
+            r_minus = r_minus + absranked[i]
+        else:
+            r_plus = r_plus + absranked[i]
+    wt = min(r_plus, r_minus)
+    mn = count * (count+1) * 0.25
+    se =  math.sqrt(count*(count+1)*(2.0*count+1.0)/24.0)
+    z = math.fabs(wt-mn) / se
+    prob = 2*(1.0 -zprob(abs(z)))
+    return wt, prob
+
+
+def lkruskalwallish(*args):
+    """
+The Kruskal-Wallis H-test is a non-parametric ANOVA for 3 or more
+groups, requiring at least 5 subjects in each group.  This function
+calculates the Kruskal-Wallis H-test for 3 or more independent samples
+and returns the result.  
+
+Usage:   lkruskalwallish(*args)
+Returns: H-statistic (corrected for ties), associated p-value
+"""
+    args = list(args)
+    n = [0]*len(args)
+    all = []
+    n = map(len,args)
+    for i in range(len(args)):
+        all = all + args[i]
+    ranked = rankdata(all)
+    T = tiecorrect(ranked)
+    for i in range(len(args)):
+        args[i] = ranked[0:n[i]]
+        del ranked[0:n[i]]
+    rsums = []
+    for i in range(len(args)):
+        rsums.append(sum(args[i])**2)
+        rsums[i] = rsums[i] / float(n[i])
+    ssbn = sum(rsums)
+    totaln = sum(n)
+    h = 12.0 / (totaln*(totaln+1)) * ssbn - 3*(totaln+1)
+    df = len(args) - 1
+    if T == 0:
+        raise ValueError, 'All numbers are identical in lkruskalwallish'
+    h = h / float(T)
+    return h, chisqprob(h,df)
+
+
+def lfriedmanchisquare(*args):
+    """
+Friedman Chi-Square is a non-parametric, one-way within-subjects
+ANOVA.  This function calculates the Friedman Chi-square test for repeated
+measures and returns the result, along with the associated probability
+value.  It assumes 3 or more repeated measures.  Only 3 levels requires a
+minimum of 10 subjects in the study.  Four levels requires 5 subjects per
+level(??).
+
+Usage:   lfriedmanchisquare(*args)
+Returns: chi-square statistic, associated p-value
+"""
+    k = len(args)
+    if k < 3:
+        raise ValueError, 'Less than 3 levels.  Friedman test not appropriate.'
+    n = len(args[0])
+    data = apply(pstat.abut,tuple(args))
+    for i in range(len(data)):
+        data[i] = rankdata(data[i])
+    ssbn = 0
+    for i in range(k):
+        ssbn = ssbn + sum(args[i])**2
+    chisq = 12.0 / (k*n*(k+1)) * ssbn - 3*n*(k+1)
+    return chisq, chisqprob(chisq,k-1)
+
+
+####################################
+####  PROBABILITY CALCULATIONS  ####
+####################################
+
+def lchisqprob(chisq,df):
+    """
+Returns the (1-tailed) probability value associated with the provided
+chi-square value and df.  Adapted from chisq.c in Gary Perlman's |Stat.
+
+Usage:   lchisqprob(chisq,df)
+"""
+    BIG = 20.0
+    def ex(x):
+        BIG = 20.0
+        if x < -BIG:
+            return 0.0
+        else:
+            return math.exp(x)
+
+    if chisq <=0 or df < 1:
+        return 1.0
+    a = 0.5 * chisq
+    if df%2 == 0:
+        even = 1
+    else:
+        even = 0
+    if df > 1:
+        y = ex(-a)
+    if even:
+        s = y
+    else:
+        s = 2.0 * zprob(-math.sqrt(chisq))
+    if (df > 2):
+        chisq = 0.5 * (df - 1.0)
+        if even:
+            z = 1.0
+        else:
+            z = 0.5
+        if a > BIG:
+            if even:
+                e = 0.0
+            else:
+                e = math.log(math.sqrt(math.pi))
+            c = math.log(a)
+            while (z <= chisq):
+                e = math.log(z) + e
+                s = s + ex(c*z-a-e)
+                z = z + 1.0
+            return s
+        else:
+            if even:
+                e = 1.0
+            else:
+                e = 1.0 / math.sqrt(math.pi) / math.sqrt(a)
+            c = 0.0
+            while (z <= chisq):
+                e = e * (a/float(z))
+                c = c + e
+                z = z + 1.0
+            return (c*y+s)
+    else:
+        return s
+
+
+def lerfcc(x):
+    """
+Returns the complementary error function erfc(x) with fractional
+error everywhere less than 1.2e-7.  Adapted from Numerical Recipies.
+
+Usage:   lerfcc(x)
+"""
+    z = abs(x)
+    t = 1.0 / (1.0+0.5*z)
+    ans = t * math.exp(-z*z-1.26551223 + t*(1.00002368+t*(0.37409196+t*(0.09678418+t*(-0.18628806+t*(0.27886807+t*(-1.13520398+t*(1.48851587+t*(-0.82215223+t*0.17087277)))))))))
+    if x >= 0:
+        return ans
+    else:
+        return 2.0 - ans
+
+
+def lzprob(z):
+    """
+Returns the area under the normal curve 'to the left of' the given z value.
+Thus, 
+    for z<0, zprob(z) = 1-tail probability
+    for z>0, 1.0-zprob(z) = 1-tail probability
+    for any z, 2.0*(1.0-zprob(abs(z))) = 2-tail probability
+Adapted from z.c in Gary Perlman's |Stat.
+
+Usage:   lzprob(z)
+"""
+    Z_MAX = 6.0    # maximum meaningful z-value
+    if z == 0.0:
+        x = 0.0
+    else:
+        y = 0.5 * math.fabs(z)
+        if y >= (Z_MAX*0.5):
+            x = 1.0
+        elif (y < 1.0):
+            w = y*y
+            x = ((((((((0.000124818987 * w
+                        -0.001075204047) * w +0.005198775019) * w
+                      -0.019198292004) * w +0.059054035642) * w
+                    -0.151968751364) * w +0.319152932694) * w
+                  -0.531923007300) * w +0.797884560593) * y * 2.0
+        else:
+            y = y - 2.0
+            x = (((((((((((((-0.000045255659 * y
+                             +0.000152529290) * y -0.000019538132) * y
+                           -0.000676904986) * y +0.001390604284) * y
+                         -0.000794620820) * y -0.002034254874) * y
+                       +0.006549791214) * y -0.010557625006) * y
+                     +0.011630447319) * y -0.009279453341) * y
+                   +0.005353579108) * y -0.002141268741) * y
+                 +0.000535310849) * y +0.999936657524
+    if z > 0.0:
+        prob = ((x+1.0)*0.5)
+    else:
+        prob = ((1.0-x)*0.5)
+    return prob
+
+
+def lksprob(alam):
+    """
+Computes a Kolmolgorov-Smirnov t-test significance level.  Adapted from
+Numerical Recipies.
+
+Usage:   lksprob(alam)
+"""
+    fac = 2.0
+    sum = 0.0
+    termbf = 0.0
+    a2 = -2.0*alam*alam
+    for j in range(1,201):
+        term = fac*math.exp(a2*j*j)
+        sum = sum + term
+        if math.fabs(term) <= (0.001*termbf) or math.fabs(term) < (1.0e-8*sum):
+            return sum
+        fac = -fac
+        termbf = math.fabs(term)
+    return 1.0             # Get here only if fails to converge; was 0.0!!
+
+
+def lfprob (dfnum, dfden, F):
+    """
+Returns the (1-tailed) significance level (p-value) of an F
+statistic given the degrees of freedom for the numerator (dfR-dfF) and
+the degrees of freedom for the denominator (dfF).
+
+Usage:   lfprob(dfnum, dfden, F)   where usually dfnum=dfbn, dfden=dfwn
+"""
+    p = betai(0.5*dfden, 0.5*dfnum, dfden/float(dfden+dfnum*F))
+    return p
+
+
+def lbetacf(a,b,x):
+    """
+This function evaluates the continued fraction form of the incomplete
+Beta function, betai.  (Adapted from: Numerical Recipies in C.)
+
+Usage:   lbetacf(a,b,x)
+"""
+    ITMAX = 200
+    EPS = 3.0e-7
+
+    bm = az = am = 1.0
+    qab = a+b
+    qap = a+1.0
+    qam = a-1.0
+    bz = 1.0-qab*x/qap
+    for i in range(ITMAX+1):
+        em = float(i+1)
+        tem = em + em
+        d = em*(b-em)*x/((qam+tem)*(a+tem))
+        ap = az + d*am
+        bp = bz+d*bm
+        d = -(a+em)*(qab+em)*x/((qap+tem)*(a+tem))
+        app = ap+d*az
+        bpp = bp+d*bz
+        aold = az
+        am = ap/bpp
+        bm = bp/bpp
+        az = app/bpp
+        bz = 1.0
+        if (abs(az-aold)<(EPS*abs(az))):
+            return az
+    print 'a or b too big, or ITMAX too small in Betacf.'
+
+
+def lgammln(xx):
+    """
+Returns the gamma function of xx.
+    Gamma(z) = Integral(0,infinity) of t^(z-1)exp(-t) dt.
+(Adapted from: Numerical Recipies in C.)
+
+Usage:   lgammln(xx)
+"""
+
+    coeff = [76.18009173, -86.50532033, 24.01409822, -1.231739516,
+             0.120858003e-2, -0.536382e-5]
+    x = xx - 1.0
+    tmp = x + 5.5
+    tmp = tmp - (x+0.5)*math.log(tmp)
+    ser = 1.0
+    for j in range(len(coeff)):
+        x = x + 1
+        ser = ser + coeff[j]/x
+    return -tmp + math.log(2.50662827465*ser)
+
+
+def lbetai(a,b,x):
+    """
+Returns the incomplete beta function:
+
+    I-sub-x(a,b) = 1/B(a,b)*(Integral(0,x) of t^(a-1)(1-t)^(b-1) dt)
+
+where a,b>0 and B(a,b) = G(a)*G(b)/(G(a+b)) where G(a) is the gamma
+function of a.  The continued fraction formulation is implemented here,
+using the betacf function.  (Adapted from: Numerical Recipies in C.)
+
+Usage:   lbetai(a,b,x)
+"""
+    if (x<0.0 or x>1.0):
+        raise ValueError, 'Bad x in lbetai'
+    if (x==0.0 or x==1.0):
+        bt = 0.0
+    else:
+        bt = math.exp(gammln(a+b)-gammln(a)-gammln(b)+a*math.log(x)+b*
+                      math.log(1.0-x))
+    if (x<(a+1.0)/(a+b+2.0)):
+        return bt*betacf(a,b,x)/float(a)
+    else:
+        return 1.0-bt*betacf(b,a,1.0-x)/float(b)
+
+
+####################################
+#######  ANOVA CALCULATIONS  #######
+####################################
+
+def lF_oneway(*lists):
+    """
+Performs a 1-way ANOVA, returning an F-value and probability given
+any number of groups.  From Heiman, pp.394-7.
+
+Usage:   F_oneway(*lists)    where *lists is any number of lists, one per
+                                  treatment group
+Returns: F value, one-tailed p-value
+"""
+    a = len(lists)           # ANOVA on 'a' groups, each in it's own list
+    means = [0]*a
+    vars = [0]*a
+    ns = [0]*a
+    alldata = []
+    tmp = map(N.array,lists)
+    means = map(amean,tmp)
+    vars = map(avar,tmp)
+    ns = map(len,lists)
+    for i in range(len(lists)):
+        alldata = alldata + lists[i]
+    alldata = N.array(alldata)
+    bign = len(alldata)
+    sstot = ass(alldata)-(asquare_of_sums(alldata)/float(bign))
+    ssbn = 0
+    for list in lists:
+        ssbn = ssbn + asquare_of_sums(N.array(list))/float(len(list))
+    ssbn = ssbn - (asquare_of_sums(alldata)/float(bign))
+    sswn = sstot-ssbn
+    dfbn = a-1
+    dfwn = bign - a
+    msb = ssbn/float(dfbn)
+    msw = sswn/float(dfwn)
+    f = msb/msw
+    prob = fprob(dfbn,dfwn,f)
+    return f, prob
+
+
+def lF_value (ER,EF,dfnum,dfden):
+    """
+Returns an F-statistic given the following:
+        ER  = error associated with the null hypothesis (the Restricted model)
+        EF  = error associated with the alternate hypothesis (the Full model)
+        dfR-dfF = degrees of freedom of the numerator
+        dfF = degrees of freedom associated with the denominator/Full model
+
+Usage:   lF_value(ER,EF,dfnum,dfden)
+"""
+    return ((ER-EF)/float(dfnum) / (EF/float(dfden)))
+
+
+####################################
+########  SUPPORT FUNCTIONS  #######
+####################################
+
+def writecc (listoflists,file,writetype='w',extra=2):
+    """
+Writes a list of lists to a file in columns, customized by the max
+size of items within the columns (max size of items in col, +2 characters)
+to specified file.  File-overwrite is the default.
+
+Usage:   writecc (listoflists,file,writetype='w',extra=2)
+Returns: None
+"""
+    if type(listoflists[0]) not in [ListType,TupleType]:
+        listoflists = [listoflists]
+    outfile = open(file,writetype)
+    rowstokill = []
+    list2print = copy.deepcopy(listoflists)
+    for i in range(len(listoflists)):
+        if listoflists[i] == ['\n'] or listoflists[i]=='\n' or listoflists[i]=='dashes':
+            rowstokill = rowstokill + [i]
+    rowstokill.reverse()
+    for row in rowstokill:
+        del list2print[row]
+    maxsize = [0]*len(list2print[0])
+    for col in range(len(list2print[0])):
+        items = pstat.colex(list2print,col)
+        items = map(pstat.makestr,items)
+        maxsize[col] = max(map(len,items)) + extra
+    for row in listoflists:
+        if row == ['\n'] or row == '\n':
+            outfile.write('\n')
+        elif row == ['dashes'] or row == 'dashes':
+            dashes = [0]*len(maxsize)
+            for j in range(len(maxsize)):
+                dashes[j] = '-'*(maxsize[j]-2)
+            outfile.write(pstat.lineincustcols(dashes,maxsize))
+        else:
+            outfile.write(pstat.lineincustcols(row,maxsize))
+        outfile.write('\n')
+    outfile.close()
+    return None
+
+
+def lincr(l,cap):        # to increment a list up to a max-list of 'cap'
+    """
+Simulate a counting system from an n-dimensional list.
+
+Usage:   lincr(l,cap)   l=list to increment, cap=max values for each list pos'n
+Returns: next set of values for list l, OR -1 (if overflow)
+"""
+    l[0] = l[0] + 1     # e.g., [0,0,0] --> [2,4,3] (=cap)
+    for i in range(len(l)):
+        if l[i] > cap[i] and i < len(l)-1: # if carryover AND not done
+            l[i] = 0
+            l[i+1] = l[i+1] + 1
+        elif l[i] > cap[i] and i == len(l)-1: # overflow past last column, must be finished
+            l = -1
+    return l
+
+
+def lsum (inlist):
+    """
+Returns the sum of the items in the passed list.
+
+Usage:   lsum(inlist)
+"""
+    s = 0
+    for item in inlist:
+        s = s + item
+    return s
+
+
+def lcumsum (inlist):
+    """
+Returns a list consisting of the cumulative sum of the items in the
+passed list.
+
+Usage:   lcumsum(inlist)
+"""
+    newlist = copy.deepcopy(inlist)
+    for i in range(1,len(newlist)):
+        newlist[i] = newlist[i] + newlist[i-1]
+    return newlist
+
+
+def lss(inlist):
+    """
+Squares each value in the passed list, adds up these squares and
+returns the result.
+
+Usage:   lss(inlist)
+"""
+    ss = 0
+    for item in inlist:
+        ss = ss + item*item
+    return ss
+
+
+def lsummult (list1,list2):
+    """
+Multiplies elements in list1 and list2, element by element, and
+returns the sum of all resulting multiplications.  Must provide equal
+length lists.
+
+Usage:   lsummult(list1,list2)
+"""
+    if len(list1) <> len(list2):
+        raise ValueError, "Lists not equal length in summult."
+    s = 0
+    for item1,item2 in pstat.abut(list1,list2):
+        s = s + item1*item2
+    return s
+
+
+def lsumdiffsquared(x,y):
+    """
+Takes pairwise differences of the values in lists x and y, squares
+these differences, and returns the sum of these squares.
+
+Usage:   lsumdiffsquared(x,y)
+Returns: sum[(x[i]-y[i])**2]
+"""
+    sds = 0
+    for i in range(len(x)):
+        sds = sds + (x[i]-y[i])**2
+    return sds
+
+
+def lsquare_of_sums(inlist):
+    """
+Adds the values in the passed list, squares the sum, and returns
+the result.
+
+Usage:   lsquare_of_sums(inlist)
+Returns: sum(inlist[i])**2
+"""
+    s = sum(inlist)
+    return float(s)*s
+
+
+def lshellsort(inlist):
+    """
+Shellsort algorithm.  Sorts a 1D-list.
+
+Usage:   lshellsort(inlist)
+Returns: sorted-inlist, sorting-index-vector (for original list)
+"""
+    n = len(inlist)
+    svec = copy.deepcopy(inlist)
+    ivec = range(n)
+    gap = n/2   # integer division needed
+    while gap >0:
+        for i in range(gap,n):
+            for j in range(i-gap,-1,-gap):
+                while j>=0 and svec[j]>svec[j+gap]:
+                    temp        = svec[j]
+                    svec[j]     = svec[j+gap]
+                    svec[j+gap] = temp
+                    itemp       = ivec[j]
+                    ivec[j]     = ivec[j+gap]
+                    ivec[j+gap] = itemp
+        gap = gap / 2  # integer division needed
+# svec is now sorted inlist, and ivec has the order svec[i] = vec[ivec[i]]
+    return svec, ivec
+
+
+def lrankdata(inlist):
+    """
+Ranks the data in inlist, dealing with ties appropritely.  Assumes
+a 1D inlist.  Adapted from Gary Perlman's |Stat ranksort.
+
+Usage:   lrankdata(inlist)
+Returns: a list of length equal to inlist, containing rank scores
+"""
+    n = len(inlist)
+    svec, ivec = shellsort(inlist)
+    sumranks = 0
+    dupcount = 0
+    newlist = [0]*n
+    for i in range(n):
+        sumranks = sumranks + i
+        dupcount = dupcount + 1
+        if i==n-1 or svec[i] <> svec[i+1]:
+            averank = sumranks / float(dupcount) + 1
+            for j in range(i-dupcount+1,i+1):
+                newlist[ivec[j]] = averank
+            sumranks = 0
+            dupcount = 0
+    return newlist
+
+
+def outputpairedstats(fname,writemode,name1,n1,m1,se1,min1,max1,name2,n2,m2,se2,min2,max2,statname,stat,prob):
+    """
+Prints or write to a file stats for two groups, using the name, n,
+mean, sterr, min and max for each group, as well as the statistic name,
+its value, and the associated p-value.
+
+Usage:   outputpairedstats(fname,writemode,
+                           name1,n1,mean1,stderr1,min1,max1,
+                           name2,n2,mean2,stderr2,min2,max2,
+                           statname,stat,prob)
+Returns: None
+"""
+    suffix = ''                       # for *s after the p-value
+    try:
+        x = prob.shape
+        prob = prob[0]
+    except:
+        pass
+    if  prob < 0.001:  suffix = '  ***'
+    elif prob < 0.01:  suffix = '  **'
+    elif prob < 0.05:  suffix = '  *'
+    title = [['Name','N','Mean','SD','Min','Max']]
+    lofl = title+[[name1,n1,round(m1,3),round(math.sqrt(se1),3),min1,max1],
+                  [name2,n2,round(m2,3),round(math.sqrt(se2),3),min2,max2]]
+    if type(fname)<>StringType or len(fname)==0:
+        print
+        print statname
+        print
+        pstat.printcc(lofl)
+        print
+        try:
+            if stat.shape == ():
+                stat = stat[0]
+            if prob.shape == ():
+                prob = prob[0]
+        except:
+            pass
+        print 'Test statistic = ',round(stat,3),'   p = ',round(prob,3),suffix
+        print
+    else:
+        file = open(fname,writemode)
+        file.write('\n'+statname+'\n\n')
+        file.close()
+        writecc(lofl,fname,'a')
+        file = open(fname,'a')
+        try:
+            if stat.shape == ():
+                stat = stat[0]
+            if prob.shape == ():
+                prob = prob[0]
+        except:
+            pass
+        file.write(pstat.list2string(['\nTest statistic = ',round(stat,4),'   p = ',round(prob,4),suffix,'\n\n']))
+        file.close()
+    return None
+
+
+def lfindwithin (data):
+    """
+Returns an integer representing a binary vector, where 1=within-
+subject factor, 0=between.  Input equals the entire data 2D list (i.e.,
+column 0=random factor, column -1=measured values (those two are skipped).
+Note: input data is in |Stat format ... a list of lists ("2D list") with 
+one row per measured value, first column=subject identifier, last column=
+score, one in-between column per factor (these columns contain level
+designations on each factor).  See also stats.anova.__doc__.
+
+Usage:   lfindwithin(data)     data in |Stat format
+"""
+
+    numfact = len(data[0])-1
+    withinvec = 0
+    for col in range(1,numfact):
+        examplelevel = pstat.unique(pstat.colex(data,col))[0]
+        rows = pstat.linexand(data,col,examplelevel)  # get 1 level of this factor
+        factsubjs = pstat.unique(pstat.colex(rows,0))
+        allsubjs = pstat.unique(pstat.colex(data,0))
+        if len(factsubjs) == len(allsubjs):  # fewer Ss than scores on this factor?
+            withinvec = withinvec + (1 << col)
+    return withinvec
+
+
+#########################################################
+#########################################################
+####### DISPATCH LISTS AND TUPLES TO ABOVE FCNS #########
+#########################################################
+#########################################################
+
+## CENTRAL TENDENCY:
+geometricmean = Dispatch ( (lgeometricmean, (ListType, TupleType)), )
+harmonicmean = Dispatch ( (lharmonicmean, (ListType, TupleType)), )
+mean = Dispatch ( (lmean, (ListType, TupleType)), )
+median = Dispatch ( (lmedian, (ListType, TupleType)), )
+medianscore = Dispatch ( (lmedianscore, (ListType, TupleType)), )
+mode = Dispatch ( (lmode, (ListType, TupleType)), )
+
+## MOMENTS:
+moment = Dispatch ( (lmoment, (ListType, TupleType)), )
+variation = Dispatch ( (lvariation, (ListType, TupleType)), )
+skew = Dispatch ( (lskew, (ListType, TupleType)), )
+kurtosis = Dispatch ( (lkurtosis, (ListType, TupleType)), )
+describe = Dispatch ( (ldescribe, (ListType, TupleType)), )
+
+## FREQUENCY STATISTICS:
+itemfreq = Dispatch ( (litemfreq, (ListType, TupleType)), )
+scoreatpercentile = Dispatch ( (lscoreatpercentile, (ListType, TupleType)), )
+percentileofscore = Dispatch ( (lpercentileofscore, (ListType, TupleType)), )
+histogram = Dispatch ( (lhistogram, (ListType, TupleType)), )
+cumfreq = Dispatch ( (lcumfreq, (ListType, TupleType)), )
+relfreq = Dispatch ( (lrelfreq, (ListType, TupleType)), )
+
+## VARIABILITY:
+obrientransform = Dispatch ( (lobrientransform, (ListType, TupleType)), )
+samplevar = Dispatch ( (lsamplevar, (ListType, TupleType)), )
+samplestdev = Dispatch ( (lsamplestdev, (ListType, TupleType)), )
+var = Dispatch ( (lvar, (ListType, TupleType)), )
+stdev = Dispatch ( (lstdev, (ListType, TupleType)), )
+sterr = Dispatch ( (lsterr, (ListType, TupleType)), )
+sem = Dispatch ( (lsem, (ListType, TupleType)), )
+z = Dispatch ( (lz, (ListType, TupleType)), )
+zs = Dispatch ( (lzs, (ListType, TupleType)), )
+
+## TRIMMING FCNS:
+trimboth = Dispatch ( (ltrimboth, (ListType, TupleType)), )
+trim1 = Dispatch ( (ltrim1, (ListType, TupleType)), )
+
+## CORRELATION FCNS:
+paired = Dispatch ( (lpaired, (ListType, TupleType)), )
+pearsonr = Dispatch ( (lpearsonr, (ListType, TupleType)), )
+spearmanr = Dispatch ( (lspearmanr, (ListType, TupleType)), )
+pointbiserialr = Dispatch ( (lpointbiserialr, (ListType, TupleType)), )
+kendalltau = Dispatch ( (lkendalltau, (ListType, TupleType)), )
+linregress = Dispatch ( (llinregress, (ListType, TupleType)), )
+
+## INFERENTIAL STATS:
+ttest_1samp = Dispatch ( (lttest_1samp, (ListType, TupleType)), )
+ttest_ind = Dispatch ( (lttest_ind, (ListType, TupleType)), )
+ttest_rel = Dispatch ( (lttest_rel, (ListType, TupleType)), )
+chisquare = Dispatch ( (lchisquare, (ListType, TupleType)), )
+ks_2samp = Dispatch ( (lks_2samp, (ListType, TupleType)), )
+mannwhitneyu = Dispatch ( (lmannwhitneyu, (ListType, TupleType)), )
+ranksums = Dispatch ( (lranksums, (ListType, TupleType)), )
+tiecorrect = Dispatch ( (ltiecorrect, (ListType, TupleType)), )
+wilcoxont = Dispatch ( (lwilcoxont, (ListType, TupleType)), )
+kruskalwallish = Dispatch ( (lkruskalwallish, (ListType, TupleType)), )
+friedmanchisquare = Dispatch ( (lfriedmanchisquare, (ListType, TupleType)), )
+
+## PROBABILITY CALCS:
+chisqprob = Dispatch ( (lchisqprob, (IntType, FloatType)), )
+zprob = Dispatch ( (lzprob, (IntType, FloatType)), )
+ksprob = Dispatch ( (lksprob, (IntType, FloatType)), )
+fprob = Dispatch ( (lfprob, (IntType, FloatType)), )
+betacf = Dispatch ( (lbetacf, (IntType, FloatType)), )
+betai = Dispatch ( (lbetai, (IntType, FloatType)), )
+erfcc = Dispatch ( (lerfcc, (IntType, FloatType)), )
+gammln = Dispatch ( (lgammln, (IntType, FloatType)), )
+
+## ANOVA FUNCTIONS:
+F_oneway = Dispatch ( (lF_oneway, (ListType, TupleType)), )
+F_value = Dispatch ( (lF_value, (ListType, TupleType)), )
+
+## SUPPORT FUNCTIONS:
+incr = Dispatch ( (lincr, (ListType, TupleType)), )
+sum = Dispatch ( (lsum, (ListType, TupleType)), )
+cumsum = Dispatch ( (lcumsum, (ListType, TupleType)), )
+ss = Dispatch ( (lss, (ListType, TupleType)), )
+summult = Dispatch ( (lsummult, (ListType, TupleType)), )
+square_of_sums = Dispatch ( (lsquare_of_sums, (ListType, TupleType)), )
+sumdiffsquared = Dispatch ( (lsumdiffsquared, (ListType, TupleType)), )
+shellsort = Dispatch ( (lshellsort, (ListType, TupleType)), )
+rankdata = Dispatch ( (lrankdata, (ListType, TupleType)), )
+findwithin = Dispatch ( (lfindwithin, (ListType, TupleType)), )
+
+
+#=============  THE ARRAY-VERSION OF THE STATS FUNCTIONS  ===============
+#=============  THE ARRAY-VERSION OF THE STATS FUNCTIONS  ===============
+#=============  THE ARRAY-VERSION OF THE STATS FUNCTIONS  ===============
+#=============  THE ARRAY-VERSION OF THE STATS FUNCTIONS  ===============
+#=============  THE ARRAY-VERSION OF THE STATS FUNCTIONS  ===============
+#=============  THE ARRAY-VERSION OF THE STATS FUNCTIONS  ===============
+#=============  THE ARRAY-VERSION OF THE STATS FUNCTIONS  ===============
+#=============  THE ARRAY-VERSION OF THE STATS FUNCTIONS  ===============
+#=============  THE ARRAY-VERSION OF THE STATS FUNCTIONS  ===============
+#=============  THE ARRAY-VERSION OF THE STATS FUNCTIONS  ===============
+#=============  THE ARRAY-VERSION OF THE STATS FUNCTIONS  ===============
+#=============  THE ARRAY-VERSION OF THE STATS FUNCTIONS  ===============
+#=============  THE ARRAY-VERSION OF THE STATS FUNCTIONS  ===============
+#=============  THE ARRAY-VERSION OF THE STATS FUNCTIONS  ===============
+#=============  THE ARRAY-VERSION OF THE STATS FUNCTIONS  ===============
+#=============  THE ARRAY-VERSION OF THE STATS FUNCTIONS  ===============
+#=============  THE ARRAY-VERSION OF THE STATS FUNCTIONS  ===============
+#=============  THE ARRAY-VERSION OF THE STATS FUNCTIONS  ===============
+#=============  THE ARRAY-VERSION OF THE STATS FUNCTIONS  ===============
+
+try:                         # DEFINE THESE *ONLY* IF NUMERIC IS AVAILABLE
+ import Numeric
+ N = Numeric
+ import LinearAlgebra
+ LA = LinearAlgebra
+
+
+#####################################
+########  ACENTRAL TENDENCY  ########
+#####################################
+
+ def ageometricmean (inarray,dimension=None,keepdims=0):
+    """
+Calculates the geometric mean of the values in the passed array.
+That is:  n-th root of (x1 * x2 * ... * xn).  Defaults to ALL values in
+the passed array.  Use dimension=None to flatten array first.  REMEMBER: if
+dimension=0, it collapses over dimension 0 ('rows' in a 2D array) only, and
+if dimension is a sequence, it collapses over all specified dimensions.  If
+keepdims is set to 1, the resulting array will have as many dimensions as
+inarray, with only 1 'level' per dim that was collapsed over.
+
+Usage:   ageometricmean(inarray,dimension=None,keepdims=0)
+Returns: geometric mean computed over dim(s) listed in dimension
+"""
+    inarray = N.array(inarray,N.Float)
+    if dimension == None:
+        inarray = N.ravel(inarray)
+        size = len(inarray)
+        mult = N.power(inarray,1.0/size)
+        mult = N.multiply.reduce(mult)
+    elif type(dimension) in [IntType,FloatType]:
+        size = inarray.shape[dimension]
+        mult = N.power(inarray,1.0/size)
+        mult = N.multiply.reduce(mult,dimension)
+        if keepdims == 1:
+            shp = list(inarray.shape)
+            shp[dimension] = 1
+            sum = N.reshape(sum,shp)
+    else: # must be a SEQUENCE of dims to average over
+        dims = list(dimension)
+        dims.sort()
+        dims.reverse()
+        size = N.array(N.multiply.reduce(N.take(inarray.shape,dims)),N.Float)
+        mult = N.power(inarray,1.0/size)
+        for dim in dims:
+            mult = N.multiply.reduce(mult,dim)
+        if keepdims == 1:
+            shp = list(inarray.shape)
+            for dim in dims:
+                shp[dim] = 1
+            mult = N.reshape(mult,shp)
+    return mult
+
+
+ def aharmonicmean (inarray,dimension=None,keepdims=0):
+    """
+Calculates the harmonic mean of the values in the passed array.
+That is:  n / (1/x1 + 1/x2 + ... + 1/xn).  Defaults to ALL values in
+the passed array.  Use dimension=None to flatten array first.  REMEMBER: if
+dimension=0, it collapses over dimension 0 ('rows' in a 2D array) only, and
+if dimension is a sequence, it collapses over all specified dimensions.  If
+keepdims is set to 1, the resulting array will have as many dimensions as
+inarray, with only 1 'level' per dim that was collapsed over.
+
+Usage:   aharmonicmean(inarray,dimension=None,keepdims=0)
+Returns: harmonic mean computed over dim(s) in dimension
+"""
+    inarray = inarray.astype(N.Float)
+    if dimension == None:
+        inarray = N.ravel(inarray)
+        size = len(inarray)
+        s = N.add.reduce(1.0 / inarray)
+    elif type(dimension) in [IntType,FloatType]:
+        size = float(inarray.shape[dimension])
+        s = N.add.reduce(1.0/inarray, dimension)
+        if keepdims == 1:
+            shp = list(inarray.shape)
+            shp[dimension] = 1
+            s = N.reshape(s,shp)
+    else: # must be a SEQUENCE of dims to average over
+        dims = list(dimension)
+        dims.sort()
+        nondims = []
+        for i in range(len(inarray.shape)):
+            if i not in dims:
+                nondims.append(i)
+        tinarray = N.transpose(inarray,nondims+dims) # put keep-dims first
+        idx = [0] *len(nondims)
+        if idx == []:
+            size = len(N.ravel(inarray))
+            s = asum(1.0 / inarray)
+            if keepdims == 1:
+                s = N.reshape([s],N.ones(len(inarray.shape)))
+        else:
+            idx[0] = -1
+            loopcap = N.array(tinarray.shape[0:len(nondims)]) -1
+            s = N.zeros(loopcap+1,N.Float)
+            while incr(idx,loopcap) <> -1:
+                s[idx] = asum(1.0/tinarray[idx])
+            size = N.multiply.reduce(N.take(inarray.shape,dims))
+            if keepdims == 1:
+                shp = list(inarray.shape)
+                for dim in dims:
+                    shp[dim] = 1
+                s = N.reshape(s,shp)
+    return size / s
+
+
+ def amean (inarray,dimension=None,keepdims=0):
+    """
+Calculates the arithmatic mean of the values in the passed array.
+That is:  1/n * (x1 + x2 + ... + xn).  Defaults to ALL values in the
+passed array.  Use dimension=None to flatten array first.  REMEMBER: if
+dimension=0, it collapses over dimension 0 ('rows' in a 2D array) only, and
+if dimension is a sequence, it collapses over all specified dimensions.  If
+keepdims is set to 1, the resulting array will have as many dimensions as
+inarray, with only 1 'level' per dim that was collapsed over.
+
+Usage:   amean(inarray,dimension=None,keepdims=0)
+Returns: arithematic mean calculated over dim(s) in dimension
+"""
+    if inarray.typecode() in ['l','s','b']:
+        inarray = inarray.astype(N.Float)
+    if dimension == None:
+        inarray = N.ravel(inarray)
+        sum = N.add.reduce(inarray)
+        denom = float(len(inarray))
+    elif type(dimension) in [IntType,FloatType]:
+        sum = asum(inarray,dimension)
+        denom = float(inarray.shape[dimension])
+        if keepdims == 1:
+            shp = list(inarray.shape)
+            shp[dimension] = 1
+            sum = N.reshape(sum,shp)
+    else: # must be a TUPLE of dims to average over
+        dims = list(dimension)
+        dims.sort()
+        dims.reverse()
+        sum = inarray *1.0
+        for dim in dims:
+            sum = N.add.reduce(sum,dim)
+        denom = N.array(N.multiply.reduce(N.take(inarray.shape,dims)),N.Float)
+        if keepdims == 1:
+            shp = list(inarray.shape)
+            for dim in dims:
+                shp[dim] = 1
+            sum = N.reshape(sum,shp)
+    return sum/denom
+
+
+ def amedian (inarray,numbins=1000):
+    """
+Calculates the COMPUTED median value of an array of numbers, given the
+number of bins to use for the histogram (more bins approaches finding the
+precise median value of the array; default number of bins = 1000).  From
+G.W. Heiman's Basic Stats, or CRC Probability & Statistics.
+NOTE:  THIS ROUTINE ALWAYS uses the entire passed array (flattens it first).
+
+Usage:   amedian(inarray,numbins=1000)
+Returns: median calculated over ALL values in inarray
+"""
+    inarray = N.ravel(inarray)
+    (hist, smallest, binsize, extras) = ahistogram(inarray,numbins)
+    cumhist = N.cumsum(hist)            # make cumulative histogram
+    otherbins = N.greater_equal(cumhist,len(inarray)/2.0)
+    otherbins = list(otherbins)         # list of 0/1s, 1s start at median bin
+    cfbin = otherbins.index(1)                # get 1st(!) index holding 50%ile score
+    LRL = smallest + binsize*cfbin        # get lower read limit of that bin
+    cfbelow = N.add.reduce(hist[0:cfbin])        # cum. freq. below bin
+    freq = hist[cfbin]                        # frequency IN the 50%ile bin
+    median = LRL + ((len(inarray)/2.0-cfbelow)/float(freq))*binsize # MEDIAN
+    return median
+
+
+ def amedianscore (inarray,dimension=None):
+    """
+Returns the 'middle' score of the passed array.  If there is an even
+number of scores, the mean of the 2 middle scores is returned.  Can function
+with 1D arrays, or on the FIRST dimension of 2D arrays (i.e., dimension can
+be None, to pre-flatten the array, or else dimension must equal 0).
+
+Usage:   amedianscore(inarray,dimension=None)
+Returns: 'middle' score of the array, or the mean of the 2 middle scores
+"""
+    if dimension == None:
+        inarray = N.ravel(inarray)
+        dimension = 0
+    inarray = N.sort(inarray,dimension)
+    if inarray.shape[dimension] % 2 == 0:   # if even number of elements
+        indx = inarray.shape[dimension]/2   # integer division correct
+        median = N.asarray(inarray[indx]+inarray[indx-1]) / 2.0
+    else:
+        indx = inarray.shape[dimension] / 2 # integer division correct
+        median = N.take(inarray,[indx],dimension)
+        if median.shape == (1,):
+            median = median[0]
+    return median
+
+
+ def amode(a, dimension=None):
+    """
+Returns an array of the modal (most common) score in the passed array.
+If there is more than one such score, ONLY THE FIRST is returned.
+The bin-count for the modal values is also returned.  Operates on whole
+array (dimension=None), or on a given dimension.
+
+Usage:   amode(a, dimension=None)
+Returns: array of bin-counts for mode(s), array of corresponding modal values
+"""
+
+    if dimension == None:
+        a = N.ravel(a)
+        dimension = 0
+    scores = pstat.aunique(N.ravel(a))       # get ALL unique values
+    testshape = list(a.shape)
+    testshape[dimension] = 1
+    oldmostfreq = N.zeros(testshape)
+    oldcounts = N.zeros(testshape)
+    for score in scores:
+        template = N.equal(a,score)
+        counts = asum(template,dimension,1)
+        mostfrequent = N.where(N.greater(counts,oldcounts),score,oldmostfreq)
+        oldcounts = N.where(N.greater(counts,oldcounts),counts,oldcounts)
+        oldmostfreq = mostfrequent
+    return oldcounts, mostfrequent
+
+
+ def atmean(a,limits=None,inclusive=(1,1)):
+     """
+Returns the arithmetic mean of all values in an array, ignoring values
+strictly outside the sequence passed to 'limits'.   Note: either limit
+in the sequence, or the value of limits itself, can be set to None.  The
+inclusive list/tuple determines whether the lower and upper limiting bounds
+(respectively) are open/exclusive (0) or closed/inclusive (1).
+
+Usage:   atmean(a,limits=None,inclusive=(1,1))
+"""
+     if a.typecode() in ['l','s','b']:
+         a = a.astype(N.Float)
+     if limits == None:
+         return mean(a)
+     assert type(limits) in [ListType,TupleType,N.ArrayType], "Wrong type for limits in atmean"
+     if inclusive[0]:         lowerfcn = N.greater_equal
+     else:               lowerfcn = N.greater
+     if inclusive[1]:         upperfcn = N.less_equal
+     else:               upperfcn = N.less
+     if limits[0] > N.maximum.reduce(N.ravel(a)) or limits[1] < N.minimum.reduce(N.ravel(a)):
+         raise ValueError, "No array values within given limits (atmean)."
+     elif limits[0]==None and limits[1]<>None:
+         mask = upperfcn(a,limits[1])
+     elif limits[0]<>None and limits[1]==None:
+         mask = lowerfcn(a,limits[0])
+     elif limits[0]<>None and limits[1]<>None:
+         mask = lowerfcn(a,limits[0])*upperfcn(a,limits[1])
+     s = float(N.add.reduce(N.ravel(a*mask)))
+     n = float(N.add.reduce(N.ravel(mask)))
+     return s/n
+
+
+ def atvar(a,limits=None,inclusive=(1,1)):
+     """
+Returns the sample variance of values in an array, (i.e., using N-1),
+ignoring values strictly outside the sequence passed to 'limits'.  
+Note: either limit in the sequence, or the value of limits itself,
+can be set to None.  The inclusive list/tuple determines whether the lower
+and upper limiting bounds (respectively) are open/exclusive (0) or
+closed/inclusive (1).
+
+Usage:   atvar(a,limits=None,inclusive=(1,1))
+"""
+     a = a.astype(N.Float)
+     if limits == None or limits == [None,None]:
+         term1 = N.add.reduce(N.ravel(a*a))
+         n = float(len(N.ravel(a))) - 1
+         term2 = N.add.reduce(N.ravel(a))**2 / n
+         print term1, term2, n
+         return (term1 - term2) / n
+     assert type(limits) in [ListType,TupleType,N.ArrayType], "Wrong type for limits in atvar"
+     if inclusive[0]:         lowerfcn = N.greater_equal
+     else:               lowerfcn = N.greater
+     if inclusive[1]:         upperfcn = N.less_equal
+     else:               upperfcn = N.less
+     if limits[0] > N.maximum.reduce(N.ravel(a)) or limits[1] < N.minimum.reduce(N.ravel(a)):
+         raise ValueError, "No array values within given limits (atvar)."
+     elif limits[0]==None and limits[1]<>None:
+         mask = upperfcn(a,limits[1])
+     elif limits[0]<>None and limits[1]==None:
+         mask = lowerfcn(a,limits[0])
+     elif limits[0]<>None and limits[1]<>None:
+         mask = lowerfcn(a,limits[0])*upperfcn(a,limits[1])
+     term1 = N.add.reduce(N.ravel(a*a*mask))
+     n = float(N.add.reduce(N.ravel(mask))) - 1
+     term2 = N.add.reduce(N.ravel(a*mask))**2 / n
+     print term1, term2, n
+     return (term1 - term2) / n
+
+
+ def atmin(a,lowerlimit=None,dimension=None,inclusive=1):
+     """
+Returns the minimum value of a, along dimension, including only values less
+than (or equal to, if inclusive=1) lowerlimit.  If the limit is set to None,
+all values in the array are used.
+
+Usage:   atmin(a,lowerlimit=None,dimension=None,inclusive=1)
+"""
+     if inclusive:         lowerfcn = N.greater
+     else:               lowerfcn = N.greater_equal
+     if dimension == None:
+         a = N.ravel(a)
+         dimension = 0
+     if lowerlimit == None:
+         lowerlimit = N.minimum.reduce(N.ravel(a))-11
+     biggest = N.maximum.reduce(N.ravel(a))
+     ta = N.where(lowerfcn(a,lowerlimit),a,biggest)
+     return N.minimum.reduce(ta,dimension)
+
+
+ def atmax(a,upperlimit,dimension=None,inclusive=1):
+     """
+Returns the maximum value of a, along dimension, including only values greater
+than (or equal to, if inclusive=1) upperlimit.  If the limit is set to None,
+a limit larger than the max value in the array is used.
+
+Usage:   atmax(a,upperlimit,dimension=None,inclusive=1)
+"""
+     if inclusive:         upperfcn = N.less
+     else:               upperfcn = N.less_equal
+     if dimension == None:
+         a = N.ravel(a)
+         dimension = 0
+     if upperlimit == None:
+         upperlimit = N.maximum.reduce(N.ravel(a))+1
+     smallest = N.minimum.reduce(N.ravel(a))
+     ta = N.where(upperfcn(a,upperlimit),a,smallest)
+     return N.maximum.reduce(ta,dimension)
+
+
+ def atstdev(a,limits=None,inclusive=(1,1)):
+     """
+Returns the standard deviation of all values in an array, ignoring values
+strictly outside the sequence passed to 'limits'.   Note: either limit
+in the sequence, or the value of limits itself, can be set to None.  The
+inclusive list/tuple determines whether the lower and upper limiting bounds
+(respectively) are open/exclusive (0) or closed/inclusive (1).
+
+Usage:   atstdev(a,limits=None,inclusive=(1,1))
+"""
+     return N.sqrt(tvar(a,limits,inclusive))
+
+
+ def atsem(a,limits=None,inclusive=(1,1)):
+     """
+Returns the standard error of the mean for the values in an array,
+(i.e., using N for the denominator), ignoring values strictly outside
+the sequence passed to 'limits'.   Note: either limit in the sequence,
+or the value of limits itself, can be set to None.  The inclusive list/tuple
+determines whether the lower and upper limiting bounds (respectively) are
+open/exclusive (0) or closed/inclusive (1).
+
+Usage:   atsem(a,limits=None,inclusive=(1,1))
+"""
+     sd = tstdev(a,limits,inclusive)
+     if limits == None or limits == [None,None]:
+         n = float(len(N.ravel(a)))
+     assert type(limits) in [ListType,TupleType,N.ArrayType], "Wrong type for limits in atsem"
+     if inclusive[0]:         lowerfcn = N.greater_equal
+     else:               lowerfcn = N.greater
+     if inclusive[1]:         upperfcn = N.less_equal
+     else:               upperfcn = N.less
+     if limits[0] > N.maximum.reduce(N.ravel(a)) or limits[1] < N.minimum.reduce(N.ravel(a)):
+         raise ValueError, "No array values within given limits (atsem)."
+     elif limits[0]==None and limits[1]<>None:
+         mask = upperfcn(a,limits[1])
+     elif limits[0]<>None and limits[1]==None:
+         mask = lowerfcn(a,limits[0])
+     elif limits[0]<>None and limits[1]<>None:
+         mask = lowerfcn(a,limits[0])*upperfcn(a,limits[1])
+     term1 = N.add.reduce(N.ravel(a*a*mask))
+     n = float(N.add.reduce(N.ravel(mask)))
+     return sd/math.sqrt(n)
+
+
+#####################################
+############  AMOMENTS  #############
+#####################################
+
+ def amoment(a,moment=1,dimension=None):
+    """
+Calculates the nth moment about the mean for a sample (defaults to the
+1st moment).  Generally used to calculate coefficients of skewness and
+kurtosis.  Dimension can equal None (ravel array first), an integer
+(the dimension over which to operate), or a sequence (operate over
+multiple dimensions).
+
+Usage:   amoment(a,moment=1,dimension=None)
+Returns: appropriate moment along given dimension
+"""
+    if dimension == None:
+        a = N.ravel(a)
+        dimension = 0
+    if moment == 1:
+        return 0.0
+    else:
+        mn = amean(a,dimension,1)  # 1=keepdims
+        s = N.power((a-mn),moment)
+        return amean(s,dimension)
+
+
+ def avariation(a,dimension=None):
+    """
+Returns the coefficient of variation, as defined in CRC Standard
+Probability and Statistics, p.6. Dimension can equal None (ravel array
+first), an integer (the dimension over which to operate), or a
+sequence (operate over multiple dimensions).
+
+Usage:   avariation(a,dimension=None)
+"""
+    return 100.0*asamplestdev(a,dimension)/amean(a,dimension)
+
+
+ def askew(a,dimension=None): 
+    """ 
+Returns the skewness of a distribution (normal ==> 0.0; >0 means extra
+weight in left tail).  Use askewtest() to see if it's close enough.
+Dimension can equal None (ravel array first), an integer (the
+dimension over which to operate), or a sequence (operate over multiple
+dimensions).
+
+Usage:   askew(a, dimension=None)
+Returns: skew of vals in a along dimension, returning ZERO where all vals equal
+"""
+    denom = N.power(amoment(a,2,dimension),1.5)
+    zero = N.equal(denom,0)
+    if type(denom) == N.ArrayType and asum(zero) <> 0:
+        print "Number of zeros in askew: ",asum(zero)
+    denom = denom + zero  # prevent divide-by-zero
+    return N.where(zero, 0, amoment(a,3,dimension)/denom)
+
+
+ def akurtosis(a,dimension=None):
+    """
+Returns the kurtosis of a distribution (normal ==> 3.0; >3 means
+heavier in the tails, and usually more peaked).  Use akurtosistest()
+to see if it's close enough.  Dimension can equal None (ravel array
+first), an integer (the dimension over which to operate), or a
+sequence (operate over multiple dimensions).
+
+Usage:   akurtosis(a,dimension=None)
+Returns: kurtosis of values in a along dimension, and ZERO where all vals equal
+"""
+    denom = N.power(amoment(a,2,dimension),2)
+    zero = N.equal(denom,0)
+    if type(denom) == N.ArrayType and asum(zero) <> 0:
+        print "Number of zeros in akurtosis: ",asum(zero)
+    denom = denom + zero  # prevent divide-by-zero
+    return N.where(zero,0,amoment(a,4,dimension)/denom)
+
+
+ def adescribe(inarray,dimension=None):
+     """
+Returns several descriptive statistics of the passed array.  Dimension
+can equal None (ravel array first), an integer (the dimension over
+which to operate), or a sequence (operate over multiple dimensions).
+
+Usage:   adescribe(inarray,dimension=None)
+Returns: n, (min,max), mean, standard deviation, skew, kurtosis
+"""
+     if dimension == None:
+         inarray = N.ravel(inarray)
+         dimension = 0
+     n = inarray.shape[dimension]
+     mm = (N.minimum.reduce(inarray),N.maximum.reduce(inarray))
+     m = amean(inarray,dimension)
+     sd = astdev(inarray,dimension)
+     skew = askew(inarray,dimension)
+     kurt = akurtosis(inarray,dimension)
+     return n, mm, m, sd, skew, kurt
+
+
+#####################################
+########  NORMALITY TESTS  ##########
+#####################################
+
+ def askewtest(a,dimension=None):
+    """
+Tests whether the skew is significantly different from a normal
+distribution.  Dimension can equal None (ravel array first), an
+integer (the dimension over which to operate), or a sequence (operate
+over multiple dimensions).
+
+Usage:   askewtest(a,dimension=None)
+Returns: z-score and 2-tail z-probability
+"""
+    if dimension == None:
+        a = N.ravel(a)
+        dimension = 0
+    b2 = askew(a,dimension)
+    n = float(a.shape[dimension])
+    y = b2 * N.sqrt(((n+1)*(n+3)) / (6.0*(n-2)) )
+    beta2 = ( 3.0*(n*n+27*n-70)*(n+1)*(n+3) ) / ( (n-2.0)*(n+5)*(n+7)*(n+9) )
+    W2 = -1 + N.sqrt(2*(beta2-1))
+    delta = 1/N.sqrt(N.log(N.sqrt(W2)))
+    alpha = N.sqrt(2/(W2-1))
+    y = N.where(N.equal(y,0),1,y)
+    Z = delta*N.log(y/alpha + N.sqrt((y/alpha)**2+1))
+    return Z, (1.0-zprob(Z))*2
+
+
+ def akurtosistest(a,dimension=None):
+    """
+Tests whether a dataset has normal kurtosis (i.e.,
+kurtosis=3(n-1)/(n+1)) Valid only for n>20.  Dimension can equal None
+(ravel array first), an integer (the dimension over which to operate),
+or a sequence (operate over multiple dimensions).
+
+Usage:   akurtosistest(a,dimension=None)
+Returns: z-score and 2-tail z-probability, returns 0 for bad pixels
+"""
+    if dimension == None:
+        a = N.ravel(a)
+        dimension = 0
+    n = float(a.shape[dimension])
+    if n<20:
+        print "akurtosistest only valid for n>=20 ... continuing anyway, n=",n
+    b2 = akurtosis(a,dimension)
+    E = 3.0*(n-1) /(n+1)
+    varb2 = 24.0*n*(n-2)*(n-3) / ((n+1)*(n+1)*(n+3)*(n+5))
+    x = (b2-E)/N.sqrt(varb2)
+    sqrtbeta1 = 6.0*(n*n-5*n+2)/((n+7)*(n+9)) * N.sqrt((6.0*(n+3)*(n+5))/
+                                                       (n*(n-2)*(n-3)))
+    A = 6.0 + 8.0/sqrtbeta1 *(2.0/sqrtbeta1 + N.sqrt(1+4.0/(sqrtbeta1**2)))
+    term1 = 1 -2/(9.0*A)
+    denom = 1 +x*N.sqrt(2/(A-4.0))
+    denom = N.where(N.less(denom,0), 99, denom)
+    term2 = N.where(N.equal(denom,0), term1, N.power((1-2.0/A)/denom,1/3.0))
+    Z = ( term1 - term2 ) / N.sqrt(2/(9.0*A))
+    Z = N.where(N.equal(denom,99), 0, Z)
+    return Z, (1.0-zprob(Z))*2
+
+
+ def anormaltest(a,dimension=None):
+    """
+Tests whether skew and/OR kurtosis of dataset differs from normal
+curve.  Can operate over multiple dimensions.  Dimension can equal
+None (ravel array first), an integer (the dimension over which to
+operate), or a sequence (operate over multiple dimensions).
+
+Usage:   anormaltest(a,dimension=None)
+Returns: z-score and 2-tail probability
+"""
+    if dimension == None:
+        a = N.ravel(a)
+        dimension = 0
+    s,p = askewtest(a,dimension)
+    k,p = akurtosistest(a,dimension)
+    k2 = N.power(s,2) + N.power(k,2)
+    return k2, achisqprob(k2,2)
+
+
+#####################################
+######  AFREQUENCY FUNCTIONS  #######
+#####################################
+
+ def aitemfreq(a):
+    """
+Returns a 2D array of item frequencies.  Column 1 contains item values,
+column 2 contains their respective counts.  Assumes a 1D array is passed.
+
+Usage:   aitemfreq(a)
+Returns: a 2D frequency table (col [0:n-1]=scores, col n=frequencies)
+"""
+    scores = pstat.aunique(a)
+    scores = N.sort(scores)
+    freq = N.zeros(len(scores))
+    for i in range(len(scores)):
+        freq[i] = N.add.reduce(N.equal(a,scores[i]))
+    return N.array(pstat.aabut(scores, freq))
+
+
+ def ascoreatpercentile (inarray, percent):
+    """
+Usage:   ascoreatpercentile(inarray,percent)   0<percent<100
+Returns: score at given percentile, relative to inarray distribution
+"""
+    percent = percent / 100.0
+    targetcf = percent*len(inarray)
+    h, lrl, binsize, extras = histogram(inarray)
+    cumhist = cumsum(h*1)
+    for i in range(len(cumhist)):
+        if cumhist[i] >= targetcf:
+            break
+    score = binsize * ((targetcf - cumhist[i-1]) / float(h[i])) + (lrl+binsize*i)
+    return score
+
+
+ def apercentileofscore (inarray,score,histbins=10,defaultlimits=None):
+    """
+Note: result of this function depends on the values used to histogram
+the data(!).
+
+Usage:   apercentileofscore(inarray,score,histbins=10,defaultlimits=None)
+Returns: percentile-position of score (0-100) relative to inarray
+"""
+    h, lrl, binsize, extras = histogram(inarray,histbins,defaultlimits)
+    cumhist = cumsum(h*1)
+    i = int((score - lrl)/float(binsize))
+    pct = (cumhist[i-1]+((score-(lrl+binsize*i))/float(binsize))*h[i])/float(len(inarray)) * 100
+    return pct
+
+
+ def ahistogram (inarray,numbins=10,defaultlimits=None,printextras=1):
+    """
+Returns (i) an array of histogram bin counts, (ii) the smallest value
+of the histogram binning, and (iii) the bin width (the last 2 are not
+necessarily integers).  Default number of bins is 10.  Defaultlimits
+can be None (the routine picks bins spanning all the numbers in the
+inarray) or a 2-sequence (lowerlimit, upperlimit).  Returns all of the
+following: array of bin values, lowerreallimit, binsize, extrapoints.
+
+Usage:   ahistogram(inarray,numbins=10,defaultlimits=None,printextras=1)
+Returns: (array of bin counts, bin-minimum, min-width, #-points-outside-range)
+"""
+    inarray = N.ravel(inarray)               # flatten any >1D arrays
+    if (defaultlimits <> None):
+        lowerreallimit = defaultlimits[0]
+        upperreallimit = defaultlimits[1]
+        binsize = (upperreallimit-lowerreallimit) / float(numbins)
+    else:
+        Min = N.minimum.reduce(inarray)
+        Max = N.maximum.reduce(inarray)
+        estbinwidth = float(Max - Min)/float(numbins) + 1
+        binsize = (Max-Min+estbinwidth)/float(numbins)
+        lowerreallimit = Min - binsize/2.0  #lower real limit,1st bin
+    bins = N.zeros(numbins)
+    extrapoints = 0
+    for num in inarray:
+        try:
+            if (num-lowerreallimit) < 0:
+                extrapoints = extrapoints + 1
+            else:
+                bintoincrement = int((num-lowerreallimit) / float(binsize))
+                bins[bintoincrement] = bins[bintoincrement] + 1
+        except:                           # point outside lower/upper limits
+            extrapoints = extrapoints + 1
+    if (extrapoints > 0 and printextras == 1):
+        print '\nPoints outside given histogram range =',extrapoints
+    return (bins, lowerreallimit, binsize, extrapoints)
+
+
+ def acumfreq(a,numbins=10,defaultreallimits=None):
+    """
+Returns a cumulative frequency histogram, using the histogram function.
+Defaultreallimits can be None (use all data), or a 2-sequence containing
+lower and upper limits on values to include.
+
+Usage:   acumfreq(a,numbins=10,defaultreallimits=None)
+Returns: array of cumfreq bin values, lowerreallimit, binsize, extrapoints
+"""
+    h,l,b,e = histogram(a,numbins,defaultreallimits)
+    cumhist = cumsum(h*1)
+    return cumhist,l,b,e
+
+
+ def arelfreq(a,numbins=10,defaultreallimits=None):
+    """
+Returns a relative frequency histogram, using the histogram function.
+Defaultreallimits can be None (use all data), or a 2-sequence containing
+lower and upper limits on values to include.
+
+Usage:   arelfreq(a,numbins=10,defaultreallimits=None)
+Returns: array of cumfreq bin values, lowerreallimit, binsize, extrapoints
+"""
+    h,l,b,e = histogram(a,numbins,defaultreallimits)
+    h = N.array(h/float(a.shape[0]))
+    return h,l,b,e
+
+
+#####################################
+######  AVARIABILITY FUNCTIONS  #####
+#####################################
+
+ def aobrientransform(*args):
+    """
+Computes a transform on input data (any number of columns).  Used to
+test for homogeneity of variance prior to running one-way stats.  Each
+array in *args is one level of a factor.  If an F_oneway() run on the
+transformed data and found significant, variances are unequal.   From
+Maxwell and Delaney, p.112.
+
+Usage:   aobrientransform(*args)    *args = 1D arrays, one per level of factor
+Returns: transformed data for use in an ANOVA
+"""
+    TINY = 1e-10
+    k = len(args)
+    n = N.zeros(k,N.Float)
+    v = N.zeros(k,N.Float)
+    m = N.zeros(k,N.Float)
+    nargs = []
+    for i in range(k):
+        nargs.append(args[i].astype(N.Float))
+        n[i] = float(len(nargs[i]))
+        v[i] = var(nargs[i])
+        m[i] = mean(nargs[i])
+    for j in range(k):
+        for i in range(n[j]):
+            t1 = (n[j]-1.5)*n[j]*(nargs[j][i]-m[j])**2
+            t2 = 0.5*v[j]*(n[j]-1.0)
+            t3 = (n[j]-1.0)*(n[j]-2.0)
+            nargs[j][i] = (t1-t2) / float(t3)
+    check = 1
+    for j in range(k):
+        if v[j] - mean(nargs[j]) > TINY:
+            check = 0
+    if check <> 1:
+        raise ValueError, 'Lack of convergence in obrientransform.'
+    else:
+        return N.array(nargs)
+
+
+ def asamplevar (inarray,dimension=None,keepdims=0):
+    """
+Returns the sample standard deviation of the values in the passed
+array (i.e., using N).  Dimension can equal None (ravel array first),
+an integer (the dimension over which to operate), or a sequence
+(operate over multiple dimensions).  Set keepdims=1 to return an array
+with the same number of dimensions as inarray.
+
+Usage:   asamplevar(inarray,dimension=None,keepdims=0)
+"""
+    if dimension == None:
+        inarray = N.ravel(inarray)
+        dimension = 0
+    if dimension == 1:
+        mn = amean(inarray,dimension)[:,N.NewAxis]
+    else:
+        mn = amean(inarray,dimension,keepdims=1)
+    deviations = inarray - mn 
+    if type(dimension) == ListType:
+        n = 1
+        for d in dimension:
+            n = n*inarray.shape[d]
+    else:
+        n = inarray.shape[dimension]
+    svar = ass(deviations,dimension,keepdims) / float(n)
+    return svar
+
+
+ def asamplestdev (inarray, dimension=None, keepdims=0):
+    """
+Returns the sample standard deviation of the values in the passed
+array (i.e., using N).  Dimension can equal None (ravel array first),
+an integer (the dimension over which to operate), or a sequence
+(operate over multiple dimensions).  Set keepdims=1 to return an array
+with the same number of dimensions as inarray.
+
+Usage:   asamplestdev(inarray,dimension=None,keepdims=0)
+"""
+    return N.sqrt(asamplevar(inarray,dimension,keepdims))
+
+
+ def asignaltonoise(instack,dimension=0):
+    """
+Calculates signal-to-noise.  Dimension can equal None (ravel array
+first), an integer (the dimension over which to operate), or a
+sequence (operate over multiple dimensions).
+
+Usage:   asignaltonoise(instack,dimension=0):
+Returns: array containing the value of (mean/stdev) along dimension,
+         or 0 when stdev=0
+"""
+    m = mean(instack,dimension)
+    sd = stdev(instack,dimension)
+    return N.where(N.equal(sd,0),0,m/sd)
+
+
+ def avar (inarray, dimension=None,keepdims=0):
+    """
+Returns the estimated population variance of the values in the passed
+array (i.e., N-1).  Dimension can equal None (ravel array first), an
+integer (the dimension over which to operate), or a sequence (operate
+over multiple dimensions).  Set keepdims=1 to return an array with the
+same number of dimensions as inarray.
+
+Usage:   avar(inarray,dimension=None,keepdims=0)
+"""
+    if dimension == None:
+        inarray = N.ravel(inarray)
+        dimension = 0
+    mn = amean(inarray,dimension,1)
+    deviations = inarray - mn
+    if type(dimension) == ListType:
+        n = 1
+        for d in dimension:
+            n = n*inarray.shape[d]
+    else:
+        n = inarray.shape[dimension]
+    var = ass(deviations,dimension,keepdims)/float(n-1)
+    return var
+
+
+ def astdev (inarray, dimension=None, keepdims=0):
+    """
+Returns the estimated population standard deviation of the values in
+the passed array (i.e., N-1).  Dimension can equal None (ravel array
+first), an integer (the dimension over which to operate), or a
+sequence (operate over multiple dimensions).  Set keepdims=1 to return
+an array with the same number of dimensions as inarray.
+
+Usage:   astdev(inarray,dimension=None,keepdims=0)
+"""
+    return N.sqrt(avar(inarray,dimension,keepdims))
+
+
+ def asterr (inarray, dimension=None, keepdims=0):
+    """
+Returns the estimated population standard error of the values in the
+passed array (i.e., N-1).  Dimension can equal None (ravel array
+first), an integer (the dimension over which to operate), or a
+sequence (operate over multiple dimensions).  Set keepdims=1 to return
+an array with the same number of dimensions as inarray.
+
+Usage:   asterr(inarray,dimension=None,keepdims=0)
+"""
+    if dimension == None:
+        inarray = N.ravel(inarray)
+        dimension = 0
+    return astdev(inarray,dimension,keepdims) / float(N.sqrt(inarray.shape[dimension]))
+
+
+ def asem (inarray, dimension=None, keepdims=0):
+    """
+Returns the standard error of the mean (i.e., using N) of the values
+in the passed array.  Dimension can equal None (ravel array first), an
+integer (the dimension over which to operate), or a sequence (operate
+over multiple dimensions).  Set keepdims=1 to return an array with the
+same number of dimensions as inarray.
+
+Usage:   asem(inarray,dimension=None, keepdims=0)
+"""
+    if dimension == None:
+        inarray = N.ravel(inarray)
+        dimension = 0
+    if type(dimension) == ListType:
+        n = 1
+        for d in dimension:
+            n = n*inarray.shape[d]
+    else:
+        n = inarray.shape[dimension]
+    s = asamplestdev(inarray,dimension,keepdims) / N.sqrt(n-1)
+    return s
+
+
+ def az (a, score):
+    """
+Returns the z-score of a given input score, given thearray from which
+that score came.  Not appropriate for population calculations, nor for
+arrays > 1D.
+
+Usage:   az(a, score)
+"""
+    z = (score-amean(a)) / asamplestdev(a)
+    return z
+
+
+ def azs (a):
+    """
+Returns a 1D array of z-scores, one for each score in the passed array,
+computed relative to the passed array.
+
+Usage:   azs(a)
+"""
+    zscores = []
+    for item in a:
+        zscores.append(z(a,item))
+    return N.array(zscores)
+
+
+ def azmap (scores, compare, dimension=0):
+    """
+Returns an array of z-scores the shape of scores (e.g., [x,y]), compared to
+array passed to compare (e.g., [time,x,y]).  Assumes collapsing over dim 0
+of the compare array.
+
+Usage:   azs(scores, compare, dimension=0)
+"""
+    mns = amean(compare,dimension)
+    sstd = asamplestdev(compare,0)
+    return (scores - mns) / sstd
+
+
+#####################################
+#######  ATRIMMING FUNCTIONS  #######
+#####################################
+
+ def around(a,digits=1):
+     """
+Rounds all values in array a to 'digits' decimal places.
+
+Usage:   around(a,digits)
+Returns: a, where each value is rounded to 'digits' decimals
+"""
+     def ar(x,d=digits):
+         return round(x,d)
+
+     if type(a) <> N.ArrayType:
+         try:
+             a = N.array(a)
+         except:
+             a = N.array(a,'O')
+     shp = a.shape
+     if a.typecode() in ['f','F','d','D']:
+         b = N.ravel(a)
+         b = N.array(map(ar,b))
+         b.shape = shp
+     elif a.typecode() in ['o','O']:
+         b = N.ravel(a)*1
+         for i in range(len(b)):
+             if type(b[i]) == FloatType:
+                 b[i] = round(b[i],digits)
+         b.shape = shp
+     else:  # not a float, double or Object array
+         b = a*1
+     return b
+
+
+ def athreshold(a,threshmin=None,threshmax=None,newval=0):
+    """
+Like Numeric.clip() except that values <threshmid or >threshmax are replaced
+by newval instead of by threshmin/threshmax (respectively).
+
+Usage:   athreshold(a,threshmin=None,threshmax=None,newval=0)
+Returns: a, with values <threshmin or >threshmax replaced with newval
+"""
+    mask = N.zeros(a.shape)
+    if threshmin <> None:
+        mask = mask + N.where(N.less(a,threshmin),1,0)
+    if threshmax <> None:
+        mask = mask + N.where(N.greater(a,threshmax),1,0)
+    mask = N.clip(mask,0,1)
+    return N.where(mask,newval,a)
+
+
+ def atrimboth (a,proportiontocut):
+    """
+Slices off the passed proportion of items from BOTH ends of the passed
+array (i.e., with proportiontocut=0.1, slices 'leftmost' 10% AND
+'rightmost' 10% of scores.  You must pre-sort the array if you want
+"proper" trimming.  Slices off LESS if proportion results in a
+non-integer slice index (i.e., conservatively slices off
+proportiontocut).
+
+Usage:   atrimboth (a,proportiontocut)
+Returns: trimmed version of array a
+"""
+    lowercut = int(proportiontocut*len(a))
+    uppercut = len(a) - lowercut
+    return a[lowercut:uppercut]
+
+
+ def atrim1 (a,proportiontocut,tail='right'):
+    """
+Slices off the passed proportion of items from ONE end of the passed
+array (i.e., if proportiontocut=0.1, slices off 'leftmost' or 'rightmost'
+10% of scores).  Slices off LESS if proportion results in a non-integer
+slice index (i.e., conservatively slices off proportiontocut).
+
+Usage:   atrim1(a,proportiontocut,tail='right')  or set tail='left'
+Returns: trimmed version of array a
+"""
+    if string.lower(tail) == 'right':
+        lowercut = 0
+        uppercut = len(a) - int(proportiontocut*len(a))
+    elif string.lower(tail) == 'left':
+        lowercut = int(proportiontocut*len(a))
+        uppercut = len(a)
+    return a[lowercut:uppercut]
+
+
+#####################################
+#####  ACORRELATION FUNCTIONS  ######
+#####################################
+
+ def acovariance(X):
+    """
+Computes the covariance matrix of a matrix X.  Requires a 2D matrix input.
+
+Usage:   acovariance(X)
+Returns: covariance matrix of X
+"""
+    if len(X.shape) <> 2:
+        raise TypeError, "acovariance requires 2D matrices"
+    n = X.shape[0]
+    mX = amean(X,0)
+    return N.dot(N.transpose(X),X) / float(n) - N.multiply.outer(mX,mX)
+
+
+ def acorrelation(X):
+    """
+Computes the correlation matrix of a matrix X.  Requires a 2D matrix input.
+
+Usage:   acorrelation(X)
+Returns: correlation matrix of X
+"""
+    C = acovariance(X)
+    V = N.diagonal(C)
+    return C / N.sqrt(N.multiply.outer(V,V))
+
+
+ def apaired(x,y):
+    """
+Interactively determines the type of data in x and y, and then runs the
+appropriated statistic for paired group data.
+
+Usage:   apaired(x,y)     x,y = the two arrays of values to be compared
+Returns: appropriate statistic name, value, and probability
+"""
+    samples = ''
+    while samples not in ['i','r','I','R','c','C']:
+        print '\nIndependent or related samples, or correlation (i,r,c): ',
+        samples = raw_input()
+
+    if samples in ['i','I','r','R']:
+        print '\nComparing variances ...',
+# USE O'BRIEN'S TEST FOR HOMOGENEITY OF VARIANCE, Maxwell & delaney, p.112
+        r = obrientransform(x,y)
+        f,p = F_oneway(pstat.colex(r,0),pstat.colex(r,1))
+        if p<0.05:
+            vartype='unequal, p='+str(round(p,4))
+        else:
+            vartype='equal'
+        print vartype
+        if samples in ['i','I']:
+            if vartype[0]=='e':
+                t,p = ttest_ind(x,y,None,0)
+                print '\nIndependent samples t-test:  ', round(t,4),round(p,4)
+            else:
+                if len(x)>20 or len(y)>20:
+                    z,p = ranksums(x,y)
+                    print '\nRank Sums test (NONparametric, n>20):  ', round(z,4),round(p,4)
+                else:
+                    u,p = mannwhitneyu(x,y)
+                    print '\nMann-Whitney U-test (NONparametric, ns<20):  ', round(u,4),round(p,4)
+
+        else:  # RELATED SAMPLES
+            if vartype[0]=='e':
+                t,p = ttest_rel(x,y,0)
+                print '\nRelated samples t-test:  ', round(t,4),round(p,4)
+            else:
+                t,p = ranksums(x,y)
+                print '\nWilcoxon T-test (NONparametric):  ', round(t,4),round(p,4)
+    else:  # CORRELATION ANALYSIS
+        corrtype = ''
+        while corrtype not in ['c','C','r','R','d','D']:
+            print '\nIs the data Continuous, Ranked, or Dichotomous (c,r,d): ',
+            corrtype = raw_input()
+        if corrtype in ['c','C']:
+            m,b,r,p,see = linregress(x,y)
+            print '\nLinear regression for continuous variables ...'
+            lol = [['Slope','Intercept','r','Prob','SEestimate'],[round(m,4),round(b,4),round(r,4),round(p,4),round(see,4)]]
+            pstat.printcc(lol)
+        elif corrtype in ['r','R']:
+            r,p = spearmanr(x,y)
+            print '\nCorrelation for ranked variables ...'
+            print "Spearman's r: ",round(r,4),round(p,4)
+        else: # DICHOTOMOUS
+            r,p = pointbiserialr(x,y)
+            print '\nAssuming x contains a dichotomous variable ...'
+            print 'Point Biserial r: ',round(r,4),round(p,4)
+    print '\n\n'
+    return None
+
+
+ def apearsonr(x,y,verbose=1):
+    """
+Calculates a Pearson correlation coefficient and returns p.  Taken
+from Heiman's Basic Statistics for the Behav. Sci (2nd), p.195.
+
+Usage:   apearsonr(x,y,verbose=1)      where x,y are equal length arrays
+Returns: Pearson's r, two-tailed p-value
+"""
+    TINY = 1.0e-20
+    n = len(x)
+    xmean = amean(x)
+    ymean = amean(y)
+    r_num = n*(N.add.reduce(x*y)) - N.add.reduce(x)*N.add.reduce(y)
+    r_den = math.sqrt((n*ass(x) - asquare_of_sums(x))*(n*ass(y)-asquare_of_sums(y)))
+    r = (r_num / r_den)
+    df = n-2
+    t = r*math.sqrt(df/((1.0-r+TINY)*(1.0+r+TINY)))
+    prob = abetai(0.5*df,0.5,df/(df+t*t),verbose)
+    return r,prob
+
+
+ def aspearmanr(x,y):
+    """
+Calculates a Spearman rank-order correlation coefficient.  Taken
+from Heiman's Basic Statistics for the Behav. Sci (1st), p.192.
+
+Usage:   aspearmanr(x,y)      where x,y are equal-length arrays
+Returns: Spearman's r, two-tailed p-value
+"""
+    TINY = 1e-30
+    n = len(x)
+    rankx = rankdata(x)
+    ranky = rankdata(y)
+    dsq = N.add.reduce((rankx-ranky)**2)
+    rs = 1 - 6*dsq / float(n*(n**2-1))
+    t = rs * math.sqrt((n-2) / ((rs+1.0)*(1.0-rs)))
+    df = n-2
+    probrs = abetai(0.5*df,0.5,df/(df+t*t))
+# probability values for rs are from part 2 of the spearman function in
+# Numerical Recipies, p.510.  They close to tables, but not exact.(?)
+    return rs, probrs
+
+
+ def apointbiserialr(x,y):
+    """
+Calculates a point-biserial correlation coefficient and the associated
+probability value.  Taken from Heiman's Basic Statistics for the Behav.
+Sci (1st), p.194.
+
+Usage:   apointbiserialr(x,y)      where x,y are equal length arrays
+Returns: Point-biserial r, two-tailed p-value
+"""
+    TINY = 1e-30
+    categories = pstat.aunique(x)
+    data = pstat.aabut(x,y)
+    if len(categories) <> 2:
+        raise ValueError, "Exactly 2 categories required (in x) for pointbiserialr()."
+    else:   # there are 2 categories, continue
+        codemap = pstat.aabut(categories,N.arange(2))
+        recoded = pstat.arecode(data,codemap,0)
+        x = pstat.alinexand(data,0,categories[0])
+        y = pstat.alinexand(data,0,categories[1])
+        xmean = amean(pstat.acolex(x,1))
+        ymean = amean(pstat.acolex(y,1))
+        n = len(data)
+        adjust = math.sqrt((len(x)/float(n))*(len(y)/float(n)))
+        rpb = (ymean - xmean)/asamplestdev(pstat.acolex(data,1))*adjust
+        df = n-2
+        t = rpb*math.sqrt(df/((1.0-rpb+TINY)*(1.0+rpb+TINY)))
+        prob = abetai(0.5*df,0.5,df/(df+t*t))
+        return rpb, prob
+
+
+ def akendalltau(x,y):
+    """
+Calculates Kendall's tau ... correlation of ordinal data.  Adapted
+from function kendl1 in Numerical Recipies.  Needs good test-cases.@@@
+
+Usage:   akendalltau(x,y)
+Returns: Kendall's tau, two-tailed p-value
+"""
+    n1 = 0
+    n2 = 0
+    iss = 0
+    for j in range(len(x)-1):
+        for k in range(j,len(y)):
+            a1 = x[j] - x[k]
+            a2 = y[j] - y[k]
+            aa = a1 * a2
+            if (aa):             # neither array has a tie
+                n1 = n1 + 1
+                n2 = n2 + 1
+                if aa > 0:
+                    iss = iss + 1
+                else:
+                    iss = iss -1
+            else:
+                if (a1):
+                    n1 = n1 + 1
+                else:
+                    n2 = n2 + 1
+    tau = iss / math.sqrt(n1*n2)
+    svar = (4.0*len(x)+10.0) / (9.0*len(x)*(len(x)-1))
+    z = tau / math.sqrt(svar)
+    prob = erfcc(abs(z)/1.4142136)
+    return tau, prob
+
+
+ def alinregress(*args):
+    """
+Calculates a regression line on two arrays, x and y, corresponding to x,y
+pairs.  If a single 2D array is passed, alinregress finds dim with 2 levels
+and splits data into x,y pairs along that dim.
+
+Usage:   alinregress(*args)    args=2 equal-length arrays, or one 2D array
+Returns: slope, intercept, r, two-tailed prob, sterr-of-the-estimate
+"""
+    TINY = 1.0e-20
+    if len(args) == 1:  # more than 1D array?
+        args = args[0]
+        if len(args) == 2:
+            x = args[0]
+            y = args[1]
+        else:
+            x = args[:,0]
+            y = args[:,1]
+    else:
+        x = args[0]
+        y = args[1]
+    n = len(x)
+    xmean = amean(x)
+    ymean = amean(y)
+    r_num = n*(N.add.reduce(x*y)) - N.add.reduce(x)*N.add.reduce(y)
+    r_den = math.sqrt((n*ass(x) - asquare_of_sums(x))*(n*ass(y)-asquare_of_sums(y)))
+    r = r_num / r_den
+    z = 0.5*math.log((1.0+r+TINY)/(1.0-r+TINY))
+    df = n-2
+    t = r*math.sqrt(df/((1.0-r+TINY)*(1.0+r+TINY)))
+    prob = abetai(0.5*df,0.5,df/(df+t*t))
+    slope = r_num / (float(n)*ass(x) - asquare_of_sums(x))
+    intercept = ymean - slope*xmean
+    sterrest = math.sqrt(1-r*r)*asamplestdev(y)
+    return slope, intercept, r, prob, sterrest
+
+
+#####################################
+#####  AINFERENTIAL STATISTICS  #####
+#####################################
+
+ def attest_1samp(a,popmean,printit=0,name='Sample',writemode='a'):
+    """
+Calculates the t-obtained for the independent samples T-test on ONE group
+of scores a, given a population mean.  If printit=1, results are printed
+to the screen.  If printit='filename', the results are output to 'filename'
+using the given writemode (default=append).  Returns t-value, and prob.
+
+Usage:   attest_1samp(a,popmean,Name='Sample',printit=0,writemode='a')
+Returns: t-value, two-tailed prob
+"""
+    if type(a) != N.ArrayType:
+        a = N.array(a)
+    x = amean(a)
+    v = avar(a)
+    n = len(a)
+    df = n-1
+    svar = ((n-1)*v) / float(df)
+    t = (x-popmean)/math.sqrt(svar*(1.0/n))
+    prob = abetai(0.5*df,0.5,df/(df+t*t))
+
+    if printit <> 0:
+        statname = 'Single-sample T-test.'
+        outputpairedstats(printit,writemode,
+                          'Population','--',popmean,0,0,0,
+                          name,n,x,v,N.minimum.reduce(N.ravel(a)),
+                          N.maximum.reduce(N.ravel(a)),
+                          statname,t,prob)
+    return t,prob
+
+
+ def attest_ind (a, b, dimension=None, printit=0, name1='Samp1', name2='Samp2',writemode='a'):
+    """
+Calculates the t-obtained T-test on TWO INDEPENDENT samples of scores
+a, and b.  From Numerical Recipies, p.483.  If printit=1, results are
+printed to the screen.  If printit='filename', the results are output
+to 'filename' using the given writemode (default=append).  Dimension
+can equal None (ravel array first), or an integer (the dimension over
+which to operate on a and b).
+
+Usage:   attest_ind (a,b,dimension=None,printit=0,
+                     Name1='Samp1',Name2='Samp2',writemode='a')
+Returns: t-value, two-tailed p-value
+"""
+    if dimension == None:
+        a = N.ravel(a)
+        b = N.ravel(b)
+        dimension = 0
+    x1 = amean(a,dimension)
+    x2 = amean(b,dimension)
+    v1 = avar(a,dimension)
+    v2 = avar(b,dimension)
+    n1 = a.shape[dimension]
+    n2 = b.shape[dimension]
+    df = n1+n2-2
+    svar = ((n1-1)*v1+(n2-1)*v2) / float(df)
+    zerodivproblem = N.equal(svar,0)
+    svar = N.where(zerodivproblem,1,svar)  # avoid zero-division in 1st place
+    t = (x1-x2)/N.sqrt(svar*(1.0/n1 + 1.0/n2))  # N-D COMPUTATION HERE!!!!!!
+    t = N.where(zerodivproblem,1.0,t)     # replace NaN/wrong t-values with 1.0
+    probs = abetai(0.5*df,0.5,float(df)/(df+t*t))
+
+    if type(t) == N.ArrayType:
+        probs = N.reshape(probs,t.shape)
+    if len(probs) == 1:
+        probs = probs[0]
+        
+    if printit <> 0:
+        if type(t) == N.ArrayType:
+            t = t[0]
+        if type(probs) == N.ArrayType:
+            probs = probs[0]
+        statname = 'Independent samples T-test.'
+        outputpairedstats(printit,writemode,
+                          name1,n1,x1,v1,N.minimum.reduce(N.ravel(a)),
+                          N.maximum.reduce(N.ravel(a)),
+                          name2,n2,x2,v2,N.minimum.reduce(N.ravel(b)),
+                          N.maximum.reduce(N.ravel(b)),
+                          statname,t,probs)
+        return
+    return t, probs
+
+
+ def attest_rel (a,b,dimension=None,printit=0,name1='Samp1',name2='Samp2',writemode='a'):
+    """
+Calculates the t-obtained T-test on TWO RELATED samples of scores, a
+and b.  From Numerical Recipies, p.483.  If printit=1, results are
+printed to the screen.  If printit='filename', the results are output
+to 'filename' using the given writemode (default=append).  Dimension
+can equal None (ravel array first), or an integer (the dimension over
+which to operate on a and b).
+
+Usage:   attest_rel(a,b,dimension=None,printit=0,
+                    name1='Samp1',name2='Samp2',writemode='a')
+Returns: t-value, two-tailed p-value
+"""
+    if dimension == None:
+        a = N.ravel(a)
+        b = N.ravel(b)
+        dimension = 0
+    if len(a)<>len(b):
+        raise ValueError, 'Unequal length arrays.'
+    x1 = amean(a,dimension)
+    x2 = amean(b,dimension)
+    v1 = avar(a,dimension)
+    v2 = avar(b,dimension)
+    n = a.shape[dimension]
+    df = float(n-1)
+    d = (a-b).astype('d')
+
+    denom = N.sqrt((n*N.add.reduce(d*d,dimension) - N.add.reduce(d,dimension)**2) /df)
+    zerodivproblem = N.equal(denom,0)
+    denom = N.where(zerodivproblem,1,denom)  # avoid zero-division in 1st place
+    t = N.add.reduce(d,dimension) / denom      # N-D COMPUTATION HERE!!!!!!
+    t = N.where(zerodivproblem,1.0,t)     # replace NaN/wrong t-values with 1.0
+    probs = abetai(0.5*df,0.5,float(df)/(df+t*t))
+    if type(t) == N.ArrayType:
+        probs = N.reshape(probs,t.shape)
+    if len(probs) == 1:
+        probs = probs[0]
+
+    if printit <> 0:
+        statname = 'Related samples T-test.'
+        outputpairedstats(printit,writemode,
+                          name1,n,x1,v1,N.minimum.reduce(N.ravel(a)),
+                          N.maximum.reduce(N.ravel(a)),
+                          name2,n,x2,v2,N.minimum.reduce(N.ravel(b)),
+                          N.maximum.reduce(N.ravel(b)),
+                          statname,t,probs)
+        return
+    return t, probs
+
+
+ def achisquare(f_obs,f_exp=None):
+    """
+Calculates a one-way chi square for array of observed frequencies and returns
+the result.  If no expected frequencies are given, the total N is assumed to
+be equally distributed across all groups.
+
+Usage:   achisquare(f_obs, f_exp=None)   f_obs = array of observed cell freq.
+Returns: chisquare-statistic, associated p-value
+"""
+
+    k = len(f_obs)
+    if f_exp == None:
+        f_exp = N.array([sum(f_obs)/float(k)] * len(f_obs),N.Float)
+    f_exp = f_exp.astype(N.Float)
+    chisq = N.add.reduce((f_obs-f_exp)**2 / f_exp)
+    return chisq, chisqprob(chisq, k-1)
+
+
+ def aks_2samp (data1,data2):
+    """
+Computes the Kolmogorov-Smirnof statistic on 2 samples.  Modified from
+Numerical Recipies in C, page 493.  Returns KS D-value, prob.  Not ufunc-
+like.
+
+Usage:   aks_2samp(data1,data2)  where data1 and data2 are 1D arrays
+Returns: KS D-value, p-value
+"""
+    j1 = 0    # N.zeros(data1.shape[1:]) TRIED TO MAKE THIS UFUNC-LIKE
+    j2 = 0    # N.zeros(data2.shape[1:])
+    fn1 = 0.0 # N.zeros(data1.shape[1:],N.Float)
+    fn2 = 0.0 # N.zeros(data2.shape[1:],N.Float)
+    n1 = data1.shape[0]
+    n2 = data2.shape[0]
+    en1 = n1*1
+    en2 = n2*1
+    d = N.zeros(data1.shape[1:],N.Float)
+    data1 = N.sort(data1,0)
+    data2 = N.sort(data2,0)
+    while j1 < n1 and j2 < n2:
+        d1=data1[j1]
+        d2=data2[j2]
+        if d1 <= d2:
+            fn1 = (j1)/float(en1)
+            j1 = j1 + 1
+        if d2 <= d1:
+            fn2 = (j2)/float(en2)
+            j2 = j2 + 1
+        dt = (fn2-fn1)
+        if abs(dt) > abs(d):
+            d = dt
+    try:
+        en = math.sqrt(en1*en2/float(en1+en2))
+        prob = aksprob((en+0.12+0.11/en)*N.fabs(d))
+    except:
+        prob = 1.0
+    return d, prob
+
+
+ def amannwhitneyu(x,y):
+    """
+Calculates a Mann-Whitney U statistic on the provided scores and
+returns the result.  Use only when the n in each condition is < 20 and
+you have 2 independent samples of ranks.  REMEMBER: Mann-Whitney U is
+significant if the u-obtained is LESS THAN or equal to the critical
+value of U.
+
+Usage:   amannwhitneyu(x,y)     where x,y are arrays of values for 2 conditions
+Returns: u-statistic, one-tailed p-value (i.e., p(z(U)))
+"""
+    n1 = len(x)
+    n2 = len(y)
+    ranked = rankdata(N.concatenate((x,y)))
+    rankx = ranked[0:n1]       # get the x-ranks
+    ranky = ranked[n1:]        # the rest are y-ranks
+    u1 = n1*n2 + (n1*(n1+1))/2.0 - sum(rankx)  # calc U for x
+    u2 = n1*n2 - u1                            # remainder is U for y
+    bigu = max(u1,u2)
+    smallu = min(u1,u2)
+    T = math.sqrt(tiecorrect(ranked))  # correction factor for tied scores
+    if T == 0:
+        raise ValueError, 'All numbers are identical in amannwhitneyu'
+    sd = math.sqrt(T*n1*n2*(n1+n2+1)/12.0)
+    z = abs((bigu-n1*n2/2.0) / sd)  # normal approximation for prob calc
+    return smallu, 1.0 - zprob(z)
+
+
+ def atiecorrect(rankvals):
+    """
+Tie-corrector for ties in Mann Whitney U and Kruskal Wallis H tests.
+See Siegel, S. (1956) Nonparametric Statistics for the Behavioral
+Sciences.  New York: McGraw-Hill.  Code adapted from |Stat rankind.c
+code.
+
+Usage:   atiecorrect(rankvals)
+Returns: T correction factor for U or H
+"""
+    sorted,posn = ashellsort(N.array(rankvals))
+    n = len(sorted)
+    T = 0.0
+    i = 0
+    while (i<n-1):
+        if sorted[i] == sorted[i+1]:
+            nties = 1
+            while (i<n-1) and (sorted[i] == sorted[i+1]):
+                nties = nties +1
+                i = i +1
+            T = T + nties**3 - nties
+        i = i+1
+    T = T / float(n**3-n)
+    return 1.0 - T
+
+
+ def aranksums(x,y):
+    """
+Calculates the rank sums statistic on the provided scores and returns
+the result.
+
+Usage:   aranksums(x,y)     where x,y are arrays of values for 2 conditions
+Returns: z-statistic, two-tailed p-value
+"""
+    n1 = len(x)
+    n2 = len(y)
+    alldata = N.concatenate((x,y))
+    ranked = arankdata(alldata)
+    x = ranked[:n1]
+    y = ranked[n1:]
+    s = sum(x)
+    expected = n1*(n1+n2+1) / 2.0
+    z = (s - expected) / math.sqrt(n1*n2*(n1+n2+1)/12.0)
+    prob = 2*(1.0 -zprob(abs(z)))
+    return z, prob
+
+
+ def awilcoxont(x,y):
+    """
+Calculates the Wilcoxon T-test for related samples and returns the
+result.  A non-parametric T-test.
+
+Usage:   awilcoxont(x,y)     where x,y are equal-length arrays for 2 conditions
+Returns: t-statistic, two-tailed p-value
+"""
+    if len(x) <> len(y):
+        raise ValueError, 'Unequal N in awilcoxont.  Aborting.'
+    d = x-y
+    d = N.compress(N.not_equal(d,0),d) # Keep all non-zero differences
+    count = len(d)
+    absd = abs(d)
+    absranked = arankdata(absd)
+    r_plus = 0.0
+    r_minus = 0.0
+    for i in range(len(absd)):
+        if d[i] < 0:
+            r_minus = r_minus + absranked[i]
+        else:
+            r_plus = r_plus + absranked[i]
+    wt = min(r_plus, r_minus)
+    mn = count * (count+1) * 0.25
+    se =  math.sqrt(count*(count+1)*(2.0*count+1.0)/24.0)
+    z = math.fabs(wt-mn) / se
+    z = math.fabs(wt-mn) / se
+    prob = 2*(1.0 -zprob(abs(z)))
+    return wt, prob
+
+
+ def akruskalwallish(*args):
+    """
+The Kruskal-Wallis H-test is a non-parametric ANOVA for 3 or more
+groups, requiring at least 5 subjects in each group.  This function
+calculates the Kruskal-Wallis H and associated p-value for 3 or more
+independent samples.
+
+Usage:   akruskalwallish(*args)     args are separate arrays for 3+ conditions
+Returns: H-statistic (corrected for ties), associated p-value
+"""
+    assert len(args) == 3, "Need at least 3 groups in stats.akruskalwallish()"
+    args = list(args)
+    n = [0]*len(args)
+    n = map(len,args)
+    all = []
+    for i in range(len(args)):
+        all = all + args[i].tolist()
+    ranked = rankdata(all)
+    T = tiecorrect(ranked)
+    for i in range(len(args)):
+        args[i] = ranked[0:n[i]]
+        del ranked[0:n[i]]
+    rsums = []
+    for i in range(len(args)):
+        rsums.append(sum(args[i])**2)
+        rsums[i] = rsums[i] / float(n[i])
+    ssbn = sum(rsums)
+    totaln = sum(n)
+    h = 12.0 / (totaln*(totaln+1)) * ssbn - 3*(totaln+1)
+    df = len(args) - 1
+    if T == 0:
+        raise ValueError, 'All numbers are identical in akruskalwallish'
+    h = h / float(T)
+    return h, chisqprob(h,df)
+
+
+ def afriedmanchisquare(*args):
+    """
+Friedman Chi-Square is a non-parametric, one-way within-subjects
+ANOVA.  This function calculates the Friedman Chi-square test for
+repeated measures and returns the result, along with the associated
+probability value.  It assumes 3 or more repeated measures.  Only 3
+levels requires a minimum of 10 subjects in the study.  Four levels
+requires 5 subjects per level(??).
+
+Usage:   afriedmanchisquare(*args)   args are separate arrays for 2+ conditions
+Returns: chi-square statistic, associated p-value
+"""
+    k = len(args)
+    if k < 3:
+        raise ValueError, '\nLess than 3 levels.  Friedman test not appropriate.\n'
+    n = len(args[0])
+    data = apply(pstat.aabut,args)
+    data = data.astype(N.Float)
+    for i in range(len(data)):
+        data[i] = arankdata(data[i])
+    ssbn = asum(asum(args,1)**2)
+    chisq = 12.0 / (k*n*(k+1)) * ssbn - 3*n*(k+1)
+    return chisq, chisqprob(chisq,k-1)
+
+
+#####################################
+####  APROBABILITY CALCULATIONS  ####
+#####################################
+
+ def achisqprob(chisq,df):
+    """
+Returns the (1-tail) probability value associated with the provided chi-square
+value and df.  Heavily modified from chisq.c in Gary Perlman's |Stat.  Can
+handle multiple dimensions.
+
+Usage:   achisqprob(chisq,df)    chisq=chisquare stat., df=degrees of freedom
+"""
+    BIG = 200.0
+    def ex(x):
+        BIG = 200.0
+        exponents = N.where(N.less(x,-BIG),-BIG,x)
+        return N.exp(exponents)
+
+    if type(chisq) == N.ArrayType:
+        arrayflag = 1
+    else:
+        arrayflag = 0
+        chisq = N.array([chisq])
+    if df < 1:
+        return N.ones(chisq.shape,N.float)
+    probs = N.zeros(chisq.shape,N.Float)
+    probs = N.where(N.less_equal(chisq,0),1.0,probs)  # set prob=1 for chisq<0
+    a = 0.5 * chisq
+    if df > 1:
+        y = ex(-a)
+    if df%2 == 0:
+        even = 1
+        s = y*1
+        s2 = s*1
+    else:
+        even = 0
+        s = 2.0 * azprob(-N.sqrt(chisq))
+        s2 = s*1
+    if (df > 2):
+        chisq = 0.5 * (df - 1.0)
+        if even:
+            z = N.ones(probs.shape,N.Float)
+        else:
+            z = 0.5 *N.ones(probs.shape,N.Float)
+        if even:
+            e = N.zeros(probs.shape,N.Float)
+        else:
+            e = N.log(N.sqrt(N.pi)) *N.ones(probs.shape,N.Float)
+        c = N.log(a)
+        mask = N.zeros(probs.shape)
+        a_big = N.greater(a,BIG)
+        a_big_frozen = -1 *N.ones(probs.shape,N.Float)
+        totalelements = N.multiply.reduce(N.array(probs.shape))
+        while asum(mask)<>totalelements:
+            e = N.log(z) + e
+            s = s + ex(c*z-a-e)
+            z = z + 1.0
+#            print z, e, s
+            newmask = N.greater(z,chisq)
+            a_big_frozen = N.where(newmask*N.equal(mask,0)*a_big, s, a_big_frozen)
+            mask = N.clip(newmask+mask,0,1)
+        if even:
+            z = N.ones(probs.shape,N.Float)
+            e = N.ones(probs.shape,N.Float)
+        else:
+            z = 0.5 *N.ones(probs.shape,N.Float)
+            e = 1.0 / N.sqrt(N.pi) / N.sqrt(a) * N.ones(probs.shape,N.Float)
+        c = 0.0
+        mask = N.zeros(probs.shape)
+        a_notbig_frozen = -1 *N.ones(probs.shape,N.Float)
+        while asum(mask)<>totalelements:
+            e = e * (a/z.astype(N.Float))
+            c = c + e
+            z = z + 1.0
+#            print '#2', z, e, c, s, c*y+s2
+            newmask = N.greater(z,chisq)
+            a_notbig_frozen = N.where(newmask*N.equal(mask,0)*(1-a_big),
+                                      c*y+s2, a_notbig_frozen)
+            mask = N.clip(newmask+mask,0,1)
+        probs = N.where(N.equal(probs,1),1,
+                        N.where(N.greater(a,BIG),a_big_frozen,a_notbig_frozen))
+        return probs
+    else:
+        return s
+
+
+ def aerfcc(x):
+    """
+Returns the complementary error function erfc(x) with fractional error
+everywhere less than 1.2e-7.  Adapted from Numerical Recipies.  Can
+handle multiple dimensions.
+
+Usage:   aerfcc(x)
+"""
+    z = abs(x)
+    t = 1.0 / (1.0+0.5*z)
+    ans = t * N.exp(-z*z-1.26551223 + t*(1.00002368+t*(0.37409196+t*(0.09678418+t*(-0.18628806+t*(0.27886807+t*(-1.13520398+t*(1.48851587+t*(-0.82215223+t*0.17087277)))))))))
+    return N.where(N.greater_equal(x,0), ans, 2.0-ans)
+
+
+ def azprob(z):
+    """
+Returns the area under the normal curve 'to the left of' the given z value.
+Thus, 
+    for z<0, zprob(z) = 1-tail probability
+    for z>0, 1.0-zprob(z) = 1-tail probability
+    for any z, 2.0*(1.0-zprob(abs(z))) = 2-tail probability
+Adapted from z.c in Gary Perlman's |Stat.  Can handle multiple dimensions.
+
+Usage:   azprob(z)    where z is a z-value
+"""
+    def yfunc(y):
+        x = (((((((((((((-0.000045255659 * y
+                         +0.000152529290) * y -0.000019538132) * y
+                       -0.000676904986) * y +0.001390604284) * y
+                     -0.000794620820) * y -0.002034254874) * y
+                   +0.006549791214) * y -0.010557625006) * y
+                 +0.011630447319) * y -0.009279453341) * y
+               +0.005353579108) * y -0.002141268741) * y
+             +0.000535310849) * y +0.999936657524
+        return x
+
+    def wfunc(w):
+        x = ((((((((0.000124818987 * w
+                    -0.001075204047) * w +0.005198775019) * w
+                  -0.019198292004) * w +0.059054035642) * w
+                -0.151968751364) * w +0.319152932694) * w
+              -0.531923007300) * w +0.797884560593) * N.sqrt(w) * 2.0
+        return x
+
+    Z_MAX = 6.0    # maximum meaningful z-value
+    x = N.zeros(z.shape,N.Float) # initialize
+    y = 0.5 * N.fabs(z)
+    x = N.where(N.less(y,1.0),wfunc(y*y),yfunc(y-2.0)) # get x's
+    x = N.where(N.greater(y,Z_MAX*0.5),1.0,x)          # kill those with big Z
+    prob = N.where(N.greater(z,0),(x+1)*0.5,(1-x)*0.5)
+    return prob
+
+
+ def aksprob(alam):
+     """
+Returns the probability value for a K-S statistic computed via ks_2samp.
+Adapted from Numerical Recipies.  Can handle multiple dimensions.
+
+Usage:   aksprob(alam)
+"""
+     if type(alam) == N.ArrayType:
+         frozen = -1 *N.ones(alam.shape,N.Float64)
+         alam = alam.astype(N.Float64)
+         arrayflag = 1
+     else:
+         frozen = N.array(-1.)
+         alam = N.array(alam,N.Float64)
+     mask = N.zeros(alam.shape)
+     fac = 2.0 *N.ones(alam.shape,N.Float)
+     sum = N.zeros(alam.shape,N.Float)
+     termbf = N.zeros(alam.shape,N.Float)
+     a2 = N.array(-2.0*alam*alam,N.Float64)
+     totalelements = N.multiply.reduce(N.array(mask.shape))
+     for j in range(1,201):
+         if asum(mask) == totalelements:
+             break
+         exponents = (a2*j*j)
+         overflowmask = N.less(exponents,-746)
+         frozen = N.where(overflowmask,0,frozen)
+         mask = mask+overflowmask
+         term = fac*N.exp(exponents)
+         sum = sum + term
+         newmask = N.where(N.less_equal(abs(term),(0.001*termbf)) +
+                           N.less(abs(term),1.0e-8*sum), 1, 0)
+         frozen = N.where(newmask*N.equal(mask,0), sum, frozen)
+         mask = N.clip(mask+newmask,0,1)
+         fac = -fac
+         termbf = abs(term)
+     if arrayflag:
+         return N.where(N.equal(frozen,-1), 1.0, frozen)  # 1.0 if doesn't converge
+     else:
+         return N.where(N.equal(frozen,-1), 1.0, frozen)[0]  # 1.0 if doesn't converge
+
+
+ def afprob (dfnum, dfden, F):
+    """
+Returns the 1-tailed significance level (p-value) of an F statistic
+given the degrees of freedom for the numerator (dfR-dfF) and the degrees
+of freedom for the denominator (dfF).  Can handle multiple dims for F.
+
+Usage:   afprob(dfnum, dfden, F)   where usually dfnum=dfbn, dfden=dfwn
+"""
+    if type(F) == N.ArrayType:
+        return abetai(0.5*dfden, 0.5*dfnum, dfden/(1.0*dfden+dfnum*F))
+    else:
+        return abetai(0.5*dfden, 0.5*dfnum, dfden/float(dfden+dfnum*F))
+
+
+ def abetacf(a,b,x,verbose=1):
+    """
+Evaluates the continued fraction form of the incomplete Beta function,
+betai.  (Adapted from: Numerical Recipies in C.)  Can handle multiple
+dimensions for x.
+
+Usage:   abetacf(a,b,x,verbose=1)
+"""
+    ITMAX = 200
+    EPS = 3.0e-7
+
+    arrayflag = 1
+    if type(x) == N.ArrayType:
+        frozen = N.ones(x.shape,N.Float) *-1  #start out w/ -1s, should replace all
+    else:
+        arrayflag = 0
+        frozen = N.array([-1])
+        x = N.array([x])
+    mask = N.zeros(x.shape)
+    bm = az = am = 1.0
+    qab = a+b
+    qap = a+1.0
+    qam = a-1.0
+    bz = 1.0-qab*x/qap
+    for i in range(ITMAX+1):
+        if N.sum(N.ravel(N.equal(frozen,-1)))==0:
+            break
+        em = float(i+1)
+        tem = em + em
+        d = em*(b-em)*x/((qam+tem)*(a+tem))
+        ap = az + d*am
+        bp = bz+d*bm
+        d = -(a+em)*(qab+em)*x/((qap+tem)*(a+tem))
+        app = ap+d*az
+        bpp = bp+d*bz
+        aold = az*1
+        am = ap/bpp
+        bm = bp/bpp
+        az = app/bpp
+        bz = 1.0
+        newmask = N.less(abs(az-aold),EPS*abs(az))
+        frozen = N.where(newmask*N.equal(mask,0), az, frozen)
+        mask = N.clip(mask+newmask,0,1)
+    noconverge = asum(N.equal(frozen,-1))
+    if noconverge <> 0 and verbose:
+        print 'a or b too big, or ITMAX too small in Betacf for ',noconverge,' elements'
+    if arrayflag:
+        return frozen
+    else:
+        return frozen[0]
+
+
+ def agammln(xx):
+    """
+Returns the gamma function of xx.
+    Gamma(z) = Integral(0,infinity) of t^(z-1)exp(-t) dt.
+Adapted from: Numerical Recipies in C.  Can handle multiple dims ... but
+probably doesn't normally have to.
+
+Usage:   agammln(xx)
+"""
+    coeff = [76.18009173, -86.50532033, 24.01409822, -1.231739516,
+             0.120858003e-2, -0.536382e-5]
+    x = xx - 1.0
+    tmp = x + 5.5
+    tmp = tmp - (x+0.5)*N.log(tmp)
+    ser = 1.0
+    for j in range(len(coeff)):
+        x = x + 1
+        ser = ser + coeff[j]/x
+    return -tmp + N.log(2.50662827465*ser)
+
+
+ def abetai(a,b,x,verbose=1):
+    """
+Returns the incomplete beta function:
+
+    I-sub-x(a,b) = 1/B(a,b)*(Integral(0,x) of t^(a-1)(1-t)^(b-1) dt)
+
+where a,b>0 and B(a,b) = G(a)*G(b)/(G(a+b)) where G(a) is the gamma
+function of a.  The continued fraction formulation is implemented
+here, using the betacf function.  (Adapted from: Numerical Recipies in
+C.)  Can handle multiple dimensions.
+
+Usage:   abetai(a,b,x,verbose=1)
+"""
+    TINY = 1e-15
+    if type(a) == N.ArrayType:
+        if asum(N.less(x,0)+N.greater(x,1)) <> 0:
+            raise ValueError, 'Bad x in abetai'
+    x = N.where(N.equal(x,0),TINY,x)
+    x = N.where(N.equal(x,1.0),1-TINY,x)
+
+    bt = N.where(N.equal(x,0)+N.equal(x,1), 0, -1)
+    exponents = ( gammln(a+b)-gammln(a)-gammln(b)+a*N.log(x)+b*
+                  N.log(1.0-x) )
+    # 746 (below) is the MAX POSSIBLE BEFORE OVERFLOW
+    exponents = N.where(N.less(exponents,-740),-740,exponents)
+    bt = N.exp(exponents)
+    if type(x) == N.ArrayType:
+        ans = N.where(N.less(x,(a+1)/(a+b+2.0)),
+                      bt*abetacf(a,b,x,verbose)/float(a),
+                      1.0-bt*abetacf(b,a,1.0-x,verbose)/float(b))
+    else:
+        if x<(a+1)/(a+b+2.0):
+            ans = bt*abetacf(a,b,x,verbose)/float(a)
+        else:
+            ans = 1.0-bt*abetacf(b,a,1.0-x,verbose)/float(b)
+    return ans
+
+
+#####################################
+#######  AANOVA CALCULATIONS  #######
+#####################################
+
+ import LinearAlgebra, operator
+ LA = LinearAlgebra
+
+ def aglm(data,para):
+    """
+Calculates a linear model fit ... anova/ancova/lin-regress/t-test/etc. Taken
+from:
+    Peterson et al. Statistical limitations in functional neuroimaging
+    I. Non-inferential methods and statistical models.  Phil Trans Royal Soc
+    Lond B 354: 1239-1260.
+
+Usage:   aglm(data,para)
+Returns: statistic, p-value ???
+"""
+    if len(para) <> len(data):
+        print "data and para must be same length in aglm"
+        return
+    n = len(para)
+    p = pstat.aunique(para)
+    x = N.zeros((n,len(p)))  # design matrix
+    for l in range(len(p)):
+        x[:,l] = N.equal(para,p[l])
+    b = N.dot(N.dot(LA.inverse(N.dot(N.transpose(x),x)),  # i.e., b=inv(X'X)X'Y
+                    N.transpose(x)),
+              data)
+    diffs = (data - N.dot(x,b))
+    s_sq = 1./(n-len(p)) * N.dot(N.transpose(diffs), diffs)
+
+    if len(p) == 2:  # ttest_ind
+        c = N.array([1,-1])
+        df = n-2
+        fact = asum(1.0/asum(x,0))  # i.e., 1/n1 + 1/n2 + 1/n3 ...
+        t = N.dot(c,b) / N.sqrt(s_sq*fact)
+        probs = abetai(0.5*df,0.5,float(df)/(df+t*t))
+        return t, probs
+
+
+ def aF_oneway(*args):
+    """
+Performs a 1-way ANOVA, returning an F-value and probability given
+any number of groups.  From Heiman, pp.394-7.
+
+Usage:   aF_oneway (*args)    where *args is 2 or more arrays, one per
+                                  treatment group
+Returns: f-value, probability
+"""
+    na = len(args)            # ANOVA on 'na' groups, each in it's own array
+    means = [0]*na
+    vars = [0]*na
+    ns = [0]*na
+    alldata = []
+    tmp = map(N.array,args)
+    means = map(amean,tmp)
+    vars = map(avar,tmp)
+    ns = map(len,args)
+    alldata = N.concatenate(args)
+    bign = len(alldata)
+    sstot = ass(alldata)-(asquare_of_sums(alldata)/float(bign))
+    ssbn = 0
+    for a in args:
+        ssbn = ssbn + asquare_of_sums(N.array(a))/float(len(a))
+    ssbn = ssbn - (asquare_of_sums(alldata)/float(bign))
+    sswn = sstot-ssbn
+    dfbn = na-1
+    dfwn = bign - na
+    msb = ssbn/float(dfbn)
+    msw = sswn/float(dfwn)
+    f = msb/msw
+    prob = fprob(dfbn,dfwn,f)
+    return f, prob
+
+
+ def aF_value (ER,EF,dfR,dfF):
+    """
+Returns an F-statistic given the following:
+        ER  = error associated with the null hypothesis (the Restricted model)
+        EF  = error associated with the alternate hypothesis (the Full model)
+        dfR = degrees of freedom the Restricted model
+        dfF = degrees of freedom associated with the Restricted model
+"""
+    return ((ER-EF)/float(dfR-dfF) / (EF/float(dfF)))
+
+
+ def outputfstats(Enum, Eden, dfnum, dfden, f, prob):
+     Enum = round(Enum,3)
+     Eden = round(Eden,3)
+     dfnum = round(Enum,3)
+     dfden = round(dfden,3)
+     f = round(f,3)
+     prob = round(prob,3)
+     suffix = ''                       # for *s after the p-value
+     if  prob < 0.001:  suffix = '  ***'
+     elif prob < 0.01:  suffix = '  **'
+     elif prob < 0.05:  suffix = '  *'
+     title = [['EF/ER','DF','Mean Square','F-value','prob','']]
+     lofl = title+[[Enum, dfnum, round(Enum/float(dfnum),3), f, prob, suffix],
+                   [Eden, dfden, round(Eden/float(dfden),3),'','','']]
+     pstat.printcc(lofl)
+     return
+
+
+ def F_value_multivariate(ER, EF, dfnum, dfden):
+     """
+Returns an F-statistic given the following:
+        ER  = error associated with the null hypothesis (the Restricted model)
+        EF  = error associated with the alternate hypothesis (the Full model)
+        dfR = degrees of freedom the Restricted model
+        dfF = degrees of freedom associated with the Restricted model
+where ER and EF are matrices from a multivariate F calculation.
+"""
+     if type(ER) in [IntType, FloatType]:
+         ER = N.array([[ER]])
+     if type(EF) in [IntType, FloatType]:
+         EF = N.array([[EF]])
+     n_um = (LA.determinant(ER) - LA.determinant(EF)) / float(dfnum)
+     d_en = LA.determinant(EF) / float(dfden)
+     return n_um / d_en
+
+
+#####################################
+#######  ASUPPORT FUNCTIONS  ########
+#####################################
+
+ def asign(a):
+    """
+Usage:   asign(a)
+Returns: array shape of a, with -1 where a<0 and +1 where a>=0
+"""
+    a = N.asarray(a)
+    if ((type(a) == type(1.4)) or (type(a) == type(1))):
+        return a-a-N.less(a,0)+N.greater(a,0)
+    else:
+        return N.zeros(N.shape(a))-N.less(a,0)+N.greater(a,0)
+
+
+ def asum (a, dimension=None,keepdims=0):
+     """
+An alternative to the Numeric.add.reduce function, which allows one to
+(1) collapse over multiple dimensions at once, and/or (2) to retain
+all dimensions in the original array (squashing one down to size.
+Dimension can equal None (ravel array first), an integer (the
+dimension over which to operate), or a sequence (operate over multiple
+dimensions).  If keepdims=1, the resulting array will have as many
+dimensions as the input array.
+
+Usage:   asum(a, dimension=None, keepdims=0)
+Returns: array summed along 'dimension'(s), same _number_ of dims if keepdims=1
+"""
+     if type(a) == N.ArrayType and a.typecode() in ['l','s','b']:
+         a = a.astype(N.Float)
+     if dimension == None:
+         s = N.sum(N.ravel(a))
+     elif type(dimension) in [IntType,FloatType]:
+         s = N.add.reduce(a, dimension)
+         if keepdims == 1:
+             shp = list(a.shape)
+             shp[dimension] = 1
+             s = N.reshape(s,shp)
+     else: # must be a SEQUENCE of dims to sum over
+        dims = list(dimension)
+        dims.sort()
+        dims.reverse()
+        s = a *1.0
+        for dim in dims:
+            s = N.add.reduce(s,dim)
+        if keepdims == 1:
+            shp = list(a.shape)
+            for dim in dims:
+                shp[dim] = 1
+            s = N.reshape(s,shp)
+     return s
+
+
+ def acumsum (a,dimension=None):
+    """
+Returns an array consisting of the cumulative sum of the items in the
+passed array.  Dimension can equal None (ravel array first), an
+integer (the dimension over which to operate), or a sequence (operate
+over multiple dimensions, but this last one just barely makes sense).
+
+Usage:   acumsum(a,dimension=None)
+"""
+    if dimension == None:
+        a = N.ravel(a)
+        dimension = 0
+    if type(dimension) in [ListType, TupleType, N.ArrayType]:
+        dimension = list(dimension)
+        dimension.sort()
+        dimension.reverse()
+        for d in dimension:
+            a = N.add.accumulate(a,d)
+        return a
+    else:
+        return N.add.accumulate(a,dimension)
+
+
+ def ass(inarray, dimension=None, keepdims=0):
+    """
+Squares each value in the passed array, adds these squares & returns
+the result.  Unfortunate function name. :-) Defaults to ALL values in
+the array.  Dimension can equal None (ravel array first), an integer
+(the dimension over which to operate), or a sequence (operate over
+multiple dimensions).  Set keepdims=1 to maintain the original number
+of dimensions.
+
+Usage:   ass(inarray, dimension=None, keepdims=0)
+Returns: sum-along-'dimension' for (inarray*inarray)
+"""
+    if dimension == None:
+        inarray = N.ravel(inarray)
+        dimension = 0
+    return asum(inarray*inarray,dimension,keepdims)
+
+
+ def asummult (array1,array2,dimension=None,keepdims=0):
+    """
+Multiplies elements in array1 and array2, element by element, and
+returns the sum (along 'dimension') of all resulting multiplications.
+Dimension can equal None (ravel array first), an integer (the
+dimension over which to operate), or a sequence (operate over multiple
+dimensions).  A trivial function, but included for completeness.
+
+Usage:   asummult(array1,array2,dimension=None,keepdims=0)
+"""
+    if dimension == None:
+        array1 = N.ravel(array1)
+        array2 = N.ravel(array2)
+        dimension = 0
+    return asum(array1*array2,dimension,keepdims)
+
+
+ def asquare_of_sums(inarray, dimension=None, keepdims=0):
+    """
+Adds the values in the passed array, squares that sum, and returns the
+result.  Dimension can equal None (ravel array first), an integer (the
+dimension over which to operate), or a sequence (operate over multiple
+dimensions).  If keepdims=1, the returned array will have the same
+NUMBER of dimensions as the original.
+
+Usage:   asquare_of_sums(inarray, dimension=None, keepdims=0)
+Returns: the square of the sum over dim(s) in dimension
+"""
+    if dimension == None:
+        inarray = N.ravel(inarray)
+        dimension = 0
+    s = asum(inarray,dimension,keepdims)
+    if type(s) == N.ArrayType:
+        return s.astype(N.Float)*s
+    else:
+        return float(s)*s
+
+
+ def asumdiffsquared(a,b, dimension=None, keepdims=0):
+    """
+Takes pairwise differences of the values in arrays a and b, squares
+these differences, and returns the sum of these squares.  Dimension
+can equal None (ravel array first), an integer (the dimension over
+which to operate), or a sequence (operate over multiple dimensions).
+keepdims=1 means the return shape = len(a.shape) = len(b.shape)
+
+Usage:   asumdiffsquared(a,b)
+Returns: sum[ravel(a-b)**2]
+"""
+    if dimension == None:
+        inarray = N.ravel(a)
+        dimension = 0
+    return asum((a-b)**2,dimension,keepdims)
+
+
+ def ashellsort(inarray):
+    """
+Shellsort algorithm.  Sorts a 1D-array.
+
+Usage:   ashellsort(inarray)
+Returns: sorted-inarray, sorting-index-vector (for original array)
+"""
+    n = len(inarray)
+    svec = inarray *1.0
+    ivec = range(n)
+    gap = n/2   # integer division needed
+    while gap >0:
+        for i in range(gap,n):
+            for j in range(i-gap,-1,-gap):
+                while j>=0 and svec[j]>svec[j+gap]:
+                    temp        = svec[j]
+                    svec[j]     = svec[j+gap]
+                    svec[j+gap] = temp
+                    itemp       = ivec[j]
+                    ivec[j]     = ivec[j+gap]
+                    ivec[j+gap] = itemp
+        gap = gap / 2  # integer division needed
+#    svec is now sorted input vector, ivec has the order svec[i] = vec[ivec[i]]
+    return svec, ivec
+
+
+ def arankdata(inarray):
+    """
+Ranks the data in inarray, dealing with ties appropritely.  Assumes
+a 1D inarray.  Adapted from Gary Perlman's |Stat ranksort.
+
+Usage:   arankdata(inarray)
+Returns: array of length equal to inarray, containing rank scores
+"""
+    n = len(inarray)
+    svec, ivec = ashellsort(inarray)
+    sumranks = 0
+    dupcount = 0
+    newarray = N.zeros(n,N.Float)
+    for i in range(n):
+        sumranks = sumranks + i
+        dupcount = dupcount + 1
+        if i==n-1 or svec[i] <> svec[i+1]:
+            averank = sumranks / float(dupcount) + 1
+            for j in range(i-dupcount+1,i+1):
+                newarray[ivec[j]] = averank
+            sumranks = 0
+            dupcount = 0
+    return newarray
+
+
+ def afindwithin(data):
+    """
+Returns a binary vector, 1=within-subject factor, 0=between.  Input
+equals the entire data array (i.e., column 1=random factor, last
+column = measured values.
+
+Usage:   afindwithin(data)     data in |Stat format
+"""
+    numfact = len(data[0])-2
+    withinvec = [0]*numfact
+    for col in range(1,numfact+1):
+        rows = pstat.linexand(data,col,pstat.unique(pstat.colex(data,1))[0])  # get 1 level of this factor
+        if len(pstat.unique(pstat.colex(rows,0))) < len(rows):   # if fewer subjects than scores on this factor
+            withinvec[col-1] = 1
+    return withinvec
+
+
+ #########################################################
+ #########################################################
+ ######  RE-DEFINE DISPATCHES TO INCLUDE ARRAYS  #########
+ #########################################################
+ #########################################################
+
+## CENTRAL TENDENCY:
+ geometricmean = Dispatch ( (lgeometricmean, (ListType, TupleType)),
+                            (ageometricmean, (N.ArrayType,)) )
+ harmonicmean = Dispatch ( (lharmonicmean, (ListType, TupleType)),
+                           (aharmonicmean, (N.ArrayType,)) )
+ mean = Dispatch ( (lmean, (ListType, TupleType)),
+                   (amean, (N.ArrayType,)) )
+ median = Dispatch ( (lmedian, (ListType, TupleType)),
+                     (amedian, (N.ArrayType,)) )
+ medianscore = Dispatch ( (lmedianscore, (ListType, TupleType)),
+                          (amedianscore, (N.ArrayType,)) )
+ mode = Dispatch ( (lmode, (ListType, TupleType)),
+                   (amode, (N.ArrayType,)) )
+ tmean = Dispatch ( (atmean, (N.ArrayType,)) )
+ tvar = Dispatch ( (atvar, (N.ArrayType,)) )
+ tstdev = Dispatch ( (atstdev, (N.ArrayType,)) )
+ tsem = Dispatch ( (atsem, (N.ArrayType,)) )
+
+## VARIATION:
+ moment = Dispatch ( (lmoment, (ListType, TupleType)),
+                     (amoment, (N.ArrayType,)) )
+ variation = Dispatch ( (lvariation, (ListType, TupleType)),
+                        (avariation, (N.ArrayType,)) )
+ skew = Dispatch ( (lskew, (ListType, TupleType)),
+                   (askew, (N.ArrayType,)) )
+ kurtosis = Dispatch ( (lkurtosis, (ListType, TupleType)),
+                       (akurtosis, (N.ArrayType,)) )
+ describe = Dispatch ( (ldescribe, (ListType, TupleType)),
+                       (adescribe, (N.ArrayType,)) )
+
+## DISTRIBUTION TESTS
+
+ skewtest = Dispatch ( (askewtest, (ListType, TupleType)),
+                       (askewtest, (N.ArrayType,)) )
+ kurtosistest = Dispatch ( (akurtosistest, (ListType, TupleType)),
+                           (akurtosistest, (N.ArrayType,)) )
+ normaltest = Dispatch ( (anormaltest, (ListType, TupleType)),
+                         (anormaltest, (N.ArrayType,)) )
+
+## FREQUENCY STATS:
+ itemfreq = Dispatch ( (litemfreq, (ListType, TupleType)),
+                       (aitemfreq, (N.ArrayType,)) )
+ scoreatpercentile = Dispatch ( (lscoreatpercentile, (ListType, TupleType)),
+                                (ascoreatpercentile, (N.ArrayType,)) )
+ percentileofscore = Dispatch ( (lpercentileofscore, (ListType, TupleType)),
+                                 (apercentileofscore, (N.ArrayType,)) )
+ histogram = Dispatch ( (lhistogram, (ListType, TupleType)),
+                        (ahistogram, (N.ArrayType,)) )
+ cumfreq = Dispatch ( (lcumfreq, (ListType, TupleType)),
+                      (acumfreq, (N.ArrayType,)) )
+ relfreq = Dispatch ( (lrelfreq, (ListType, TupleType)),
+                      (arelfreq, (N.ArrayType,)) )
+ 
+## VARIABILITY:
+ obrientransform = Dispatch ( (lobrientransform, (ListType, TupleType)),
+                              (aobrientransform, (N.ArrayType,)) )
+ samplevar = Dispatch ( (lsamplevar, (ListType, TupleType)),
+                        (asamplevar, (N.ArrayType,)) )
+ samplestdev = Dispatch ( (lsamplestdev, (ListType, TupleType)),
+                          (asamplestdev, (N.ArrayType,)) )
+ signaltonoise = Dispatch( (asignaltonoise, (N.ArrayType,)),)
+ var = Dispatch ( (lvar, (ListType, TupleType)),
+                  (avar, (N.ArrayType,)) )
+ stdev = Dispatch ( (lstdev, (ListType, TupleType)),
+                    (astdev, (N.ArrayType,)) )
+ sterr = Dispatch ( (lsterr, (ListType, TupleType)),
+                    (asterr, (N.ArrayType,)) )
+ sem = Dispatch ( (lsem, (ListType, TupleType)),
+                  (asem, (N.ArrayType,)) )
+ z = Dispatch ( (lz, (ListType, TupleType)),
+                (az, (N.ArrayType,)) )
+ zs = Dispatch ( (lzs, (ListType, TupleType)),
+                 (azs, (N.ArrayType,)) )
+ 
+## TRIMMING FCNS:
+ threshold = Dispatch( (athreshold, (N.ArrayType,)),)
+ trimboth = Dispatch ( (ltrimboth, (ListType, TupleType)),
+                       (atrimboth, (N.ArrayType,)) )
+ trim1 = Dispatch ( (ltrim1, (ListType, TupleType)),
+                    (atrim1, (N.ArrayType,)) )
+ 
+## CORRELATION FCNS:
+ paired = Dispatch ( (lpaired, (ListType, TupleType)),
+                     (apaired, (N.ArrayType,)) )
+ pearsonr = Dispatch ( (lpearsonr, (ListType, TupleType)),
+                       (apearsonr, (N.ArrayType,)) )
+ spearmanr = Dispatch ( (lspearmanr, (ListType, TupleType)),
+                        (aspearmanr, (N.ArrayType,)) )
+ pointbiserialr = Dispatch ( (lpointbiserialr, (ListType, TupleType)),
+                             (apointbiserialr, (N.ArrayType,)) )
+ kendalltau = Dispatch ( (lkendalltau, (ListType, TupleType)),
+                         (akendalltau, (N.ArrayType,)) )
+ linregress = Dispatch ( (llinregress, (ListType, TupleType)),
+                         (alinregress, (N.ArrayType,)) )
+ 
+## INFERENTIAL STATS:
+ ttest_1samp = Dispatch ( (lttest_1samp, (ListType, TupleType)),
+                          (attest_1samp, (N.ArrayType,)) )
+ ttest_ind = Dispatch ( (lttest_ind, (ListType, TupleType)),
+                        (attest_ind, (N.ArrayType,)) )
+ ttest_rel = Dispatch ( (lttest_rel, (ListType, TupleType)),
+                        (attest_rel, (N.ArrayType,)) )
+ chisquare = Dispatch ( (lchisquare, (ListType, TupleType)),
+                        (achisquare, (N.ArrayType,)) )
+ ks_2samp = Dispatch ( (lks_2samp, (ListType, TupleType)),
+                       (aks_2samp, (N.ArrayType,)) )
+ mannwhitneyu = Dispatch ( (lmannwhitneyu, (ListType, TupleType)),
+                           (amannwhitneyu, (N.ArrayType,)) )
+ tiecorrect = Dispatch ( (ltiecorrect, (ListType, TupleType)),
+                         (atiecorrect, (N.ArrayType,)) )
+ ranksums = Dispatch ( (lranksums, (ListType, TupleType)),
+                       (aranksums, (N.ArrayType,)) )
+ wilcoxont = Dispatch ( (lwilcoxont, (ListType, TupleType)),
+                        (awilcoxont, (N.ArrayType,)) )
+ kruskalwallish = Dispatch ( (lkruskalwallish, (ListType, TupleType)),
+                             (akruskalwallish, (N.ArrayType,)) )
+ friedmanchisquare = Dispatch ( (lfriedmanchisquare, (ListType, TupleType)),
+                                (afriedmanchisquare, (N.ArrayType,)) )
+ 
+## PROBABILITY CALCS:
+ chisqprob = Dispatch ( (lchisqprob, (IntType, FloatType)),
+                        (achisqprob, (N.ArrayType,)) )
+ zprob = Dispatch ( (lzprob, (IntType, FloatType)),
+                    (azprob, (N.ArrayType,)) )
+ ksprob = Dispatch ( (lksprob, (IntType, FloatType)),
+                     (aksprob, (N.ArrayType,)) )
+ fprob = Dispatch ( (lfprob, (IntType, FloatType)),
+                    (afprob, (N.ArrayType,)) )
+ betacf = Dispatch ( (lbetacf, (IntType, FloatType)),
+                     (abetacf, (N.ArrayType,)) )
+ betai = Dispatch ( (lbetai, (IntType, FloatType)),
+                    (abetai, (N.ArrayType,)) )
+ erfcc = Dispatch ( (lerfcc, (IntType, FloatType)),
+                    (aerfcc, (N.ArrayType,)) )
+ gammln = Dispatch ( (lgammln, (IntType, FloatType)),
+                     (agammln, (N.ArrayType,)) )
+ 
+## ANOVA FUNCTIONS:
+ F_oneway = Dispatch ( (lF_oneway, (ListType, TupleType)),
+                       (aF_oneway, (N.ArrayType,)) )
+ F_value = Dispatch ( (lF_value, (ListType, TupleType)),
+                      (aF_value, (N.ArrayType,)) )
+
+## SUPPORT FUNCTIONS:
+ incr = Dispatch ( (lincr, (ListType, TupleType, N.ArrayType)), )
+ sum = Dispatch ( (lsum, (ListType, TupleType)),
+                  (asum, (N.ArrayType,)) )
+ cumsum = Dispatch ( (lcumsum, (ListType, TupleType)),
+                     (acumsum, (N.ArrayType,)) )
+ ss = Dispatch ( (lss, (ListType, TupleType)),
+                 (ass, (N.ArrayType,)) )
+ summult = Dispatch ( (lsummult, (ListType, TupleType)),
+                      (asummult, (N.ArrayType,)) )
+ square_of_sums = Dispatch ( (lsquare_of_sums, (ListType, TupleType)),
+                             (asquare_of_sums, (N.ArrayType,)) )
+ sumdiffsquared = Dispatch ( (lsumdiffsquared, (ListType, TupleType)),
+                             (asumdiffsquared, (N.ArrayType,)) )
+ shellsort = Dispatch ( (lshellsort, (ListType, TupleType)),
+                        (ashellsort, (N.ArrayType,)) )
+ rankdata = Dispatch ( (lrankdata, (ListType, TupleType)),
+                       (arankdata, (N.ArrayType,)) )
+ findwithin = Dispatch ( (lfindwithin, (ListType, TupleType)),
+                         (afindwithin, (N.ArrayType,)) )
+
+######################  END OF NUMERIC FUNCTION BLOCK  #####################
+
+######################  END OF STATISTICAL FUNCTIONS  ######################
+
+except ImportError:
+ pass
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx_extras/lrucache.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx_extras/lrucache.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx_extras/lrucache.py (revision 3)
@@ -0,0 +1,213 @@
+# lrucache.py -- a simple LRU (Least-Recently-Used) cache class
+
+# Copyright 2004 Evan Prodromou <evan@bad.dynu.ca>
+# Licensed under the Academic Free License 2.1
+
+# arch-tag: LRU cache main module
+
+"""a simple LRU (Least-Recently-Used) cache module
+
+This module provides very simple LRU (Least-Recently-Used) cache
+functionality.
+
+An *in-memory cache* is useful for storing the results of an
+'expensive' process (one that takes a lot of time or resources) for
+later re-use. Typical examples are accessing data from the filesystem,
+a database, or a network location. If you know you'll need to re-read
+the data again, it can help to keep it in a cache.
+
+You *can* use a Python dictionary as a cache for some purposes.
+However, if the results you're caching are large, or you have a lot of
+possible results, this can be impractical memory-wise.
+
+An *LRU cache*, on the other hand, only keeps _some_ of the results in
+memory, which keeps you from overusing resources. The cache is bounded
+by a maximum size; if you try to add more values to the cache, it will
+automatically discard the values that you haven't read or written to
+in the longest time. In other words, the least-recently-used items are
+discarded. [1]_
+
+.. [1]: 'Discarded' here means 'removed from the cache'.
+
+"""
+
+from __future__ import generators
+import time
+from heapq import heappush, heappop, heapify
+
+__version__ = "0.2"
+__all__ = ['CacheKeyError', 'LRUCache', 'DEFAULT_SIZE']
+__docformat__ = 'reStructuredText en'
+
+DEFAULT_SIZE = 16
+"""Default size of a new LRUCache object, if no 'size' argument is given."""
+
+class CacheKeyError(KeyError):
+    """Error raised when cache requests fail
+    
+    When a cache record is accessed which no longer exists (or never did),
+    this error is raised. To avoid it, you may want to check for the existence
+    of a cache record before reading or deleting it."""
+    pass
+
+class LRUCache(object):
+    """Least-Recently-Used (LRU) cache.
+    
+    Instances of this class provide a least-recently-used (LRU) cache. They
+    emulate a Python mapping type. You can use an LRU cache more or less like
+    a Python dictionary, with the exception that objects you put into the
+    cache may be discarded before you take them out.
+    
+    Some example usage::
+	
+    cache = LRUCache(32) # new cache
+    cache['foo'] = get_file_contents('foo') # or whatever
+	
+    if 'foo' in cache: # if it's still in cache...
+	    # use cached version
+        contents = cache['foo']
+    else:
+	    # recalculate
+        contents = get_file_contents('foo')
+	    # store in cache for next time
+        cache['foo'] = contents
+
+    print cache.size # Maximum size
+	
+    print len(cache) # 0 <= len(cache) <= cache.size
+	
+    cache.size = 10 # Auto-shrink on size assignment
+	
+    for i in range(50): # note: larger than cache size
+        cache[i] = i
+	    
+    if 0 not in cache: print 'Zero was discarded.'
+
+    if 42 in cache:
+        del cache[42] # Manual deletion
+
+    for j in cache:   # iterate (in LRU order)
+        print j, cache[j] # iterator produces keys, not values
+    """
+    
+    class __Node(object):
+        """Record of a cached value. Not for public consumption."""
+        
+        def __init__(self, key, obj, timestamp):
+            object.__init__(self)
+            self.key = key
+            self.obj = obj
+            self.atime = timestamp
+            self.mtime = self.atime
+	    
+        def __cmp__(self, other):
+            return cmp(self.atime, other.atime)
+
+        def __repr__(self):
+            return "<%s %s => %s (%s)>" % \
+                   (self.__class__, self.key, self.obj, \
+                    time.asctime(time.localtime(self.atime)))
+
+    def __init__(self, size=DEFAULT_SIZE):
+        # Check arguments
+        if size <= 0:
+            raise ValueError, size
+        elif type(size) is not type(0):
+            raise TypeError, size
+        object.__init__(self)	
+        self.__heap = []
+        self.__dict = {}
+        self.size = size
+        """Maximum size of the cache.
+        If more than 'size' elements are added to the cache,
+        the least-recently-used ones will be discarded."""
+	
+    def __len__(self):
+        return len(self.__heap)
+    
+    def __contains__(self, key):
+        return self.__dict.has_key(key)
+    
+    def __setitem__(self, key, obj):
+        if self.__dict.has_key(key):
+            node = self.__dict[key]
+            node.obj = obj
+            node.atime = time.time()
+            node.mtime = node.atime
+            heapify(self.__heap)
+        else:
+            # size may have been reset, so we loop
+            while len(self.__heap) >= self.size:
+                lru = heappop(self.__heap)
+                del self.__dict[lru.key]
+            node = self.__Node(key, obj, time.time())
+            self.__dict[key] = node
+            heappush(self.__heap, node)
+	
+    def __getitem__(self, key):
+        if not self.__dict.has_key(key):
+            raise CacheKeyError(key)
+        else:
+            node = self.__dict[key]
+            node.atime = time.time()
+            heapify(self.__heap)
+            return node.obj
+	
+    def __delitem__(self, key):
+        if not self.__dict.has_key(key):
+            raise CacheKeyError(key)
+        else:
+            node = self.__dict[key]
+            del self.__dict[key]
+            self.__heap.remove(node)
+            heapify(self.__heap)
+            return node.obj
+
+    def __iter__(self):
+        copy = self.__heap[:]
+        while len(copy) > 0:
+            node = heappop(copy)
+            yield node.key
+        raise StopIteration
+
+    def __setattr__(self, name, value):
+        object.__setattr__(self, name, value)
+        # automagically shrink heap on resize
+        if name == 'size':
+            while len(self.__heap) > value:
+                lru = heappop(self.__heap)
+                del self.__dict[lru.key]
+	    
+    def __repr__(self):
+        return "<%s (%d elements)>" % (str(self.__class__), len(self.__heap))
+
+    def mtime(self, key):
+        """Return the last modification time for the cache record with key.
+        May be useful for cache instances where the stored values can get
+        'stale', such as caching file or network resource contents."""
+        if not self.__dict.has_key(key):
+            raise CacheKeyError(key)
+        else:
+            node = self.__dict[key]
+            return node.mtime
+
+if __name__ == "__main__":
+    cache = LRUCache(25)
+    print cache
+    for i in range(50):
+        cache[i] = str(i)
+    print cache
+    if 46 in cache:
+        del cache[46]
+    print cache
+    cache.size = 10
+    print cache
+    cache[46] = '46'
+    print cache
+    print len(cache)
+    for c in cache:
+        print c
+    print cache
+    print cache.mtime(46)
+    for c in cache:
+        print c
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/psyco_full.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/psyco_full.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/psyco_full.py (revision 3)
@@ -0,0 +1,14 @@
+"""
+Attempt to call psyco.full, but ignore any errors.
+"""
+
+import sys
+
+try:
+    import psyco
+    psyco.full()
+except:
+	pass
+    #print >> sys.stderr, "Psyco not found, continuing without it"
+
+
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/bitset.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/bitset.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/bitset.py (revision 3)
@@ -0,0 +1,7 @@
+def __bootstrap__():
+   global __bootstrap__, __loader__, __file__
+   import sys, pkg_resources, imp
+   __file__ = pkg_resources.resource_filename(__name__,'bitset.so')
+   __loader__ = None; del __bootstrap__, __loader__
+   imp.load_dynamic(__name__,__file__)
+__bootstrap__()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/interval_index_file_tests.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/interval_index_file_tests.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/interval_index_file_tests.py (revision 3)
@@ -0,0 +1,56 @@
+import interval_index_file
+from interval_index_file import Indexes
+from tempfile import mktemp
+import random
+
+def test_offsets():
+    assert interval_index_file.offsets_for_max_size( 512*1024*1024  - 1 ) == [ 512 + 64 + 8 + 1, 64 + 8 + 1, 8 + 1, 1, 0 ]
+
+def test_interval_index_file():
+    ix = Indexes()
+    chrs = []
+    for i in range( 5 ):
+        intervals = []
+        name = "seq%d" % i
+        max = random.randint( 0, interval_index_file.MAX )
+        # print name, "size", max
+        for i in range( 500 ):
+            start = random.randint( 0, max )
+            end = random.randint( 0, max )
+            if end < start:
+                end, start = start, end
+            ix.add( name, start, end, i, max=interval_index_file.MAX )
+            intervals.append( ( start, end, i ) )
+        chrs.append( intervals )
+    fname = mktemp()
+    f = open( fname, "w" )
+    ix.write( f )
+    f.close()
+    del ix
+    
+    ix = Indexes( fname )
+    for i in range( 5 ):
+        intervals = chrs[i]
+        name = "seq%d" % i
+        for i in range( 100 ):
+            start = random.randint( 0, max )
+            end = random.randint( 0, max )
+            if end < start:
+                end, start = start, end
+            query_intervals = set()
+            for ( s, e, i ) in intervals:
+                if e > start and s < end:
+                    query_intervals.add( ( s, e, i ) )
+            result = ix.find( name, start, end )
+            for inter in result:
+                assert inter in query_intervals
+                
+            
+    
+    
+
+
+
+
+
+
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/binned_array.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/binned_array.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/binned_array.py (revision 3)
@@ -0,0 +1,345 @@
+"""
+Numeric arrays stored as individually compressed blocks on disk, allowing
+pseudo-random acccess. 
+
+`BinnedArray` is used to build such an array in memory and save it to disk.
+`BinnedArrayWriter` can instead be used when creating the array sequentially
+(does not require keeping all data in memory). `FileBinnedArray` provides
+read only access to an on disk binned array. 
+"""
+
+from __future__ import division
+
+import math
+
+from numpy import *
+from struct import *
+from bx_extras.lrucache import LRUCache
+
+import sys
+platform_is_little_endian = ( sys.byteorder == 'little' )
+
+MAGIC=0x4AB04612
+
+# Version incremented from version 0 to version 1 by Ian Schenck, June
+# 23, 2006.  Version 1 supports different typecodes, and in doing so
+# breaks the original header format.  The new FileBinnedArray is
+# backwards compatible with version 0.
+
+# Version 1 -> 2 by James Taylor, allow specifying different compression 
+# types.
+
+VERSION=2
+
+# Compression types
+
+comp_types = dict()
+
+comp_types['none'] = ( lambda x: x, lambda x: x )
+
+try:
+    import zlib
+    comp_types['zlib'] = ( zlib.compress, zlib.decompress )
+except:
+    pass
+    
+try:
+    import lzo
+    comp_types['lzo'] = ( lzo.compress, lzo.decompress )
+except:
+    pass
+
+
+MAX=512*1024*1024 
+
+class BinnedArray( object ):
+    def __init__( self, bin_size=512*1024, default=NaN, max_size=MAX, typecode="f" ):
+        self.max_size = max_size
+        self.bin_size = bin_size
+        self.nbins = int( math.ceil( ( max_size / self.bin_size ) ) )
+        self.bins = [ None ] * self.nbins
+        self.default = default
+        self.typecode = typecode
+    def get_bin_offset( self, index ):
+        return index // self.bin_size, index % self.bin_size
+    def init_bin( self, index ):
+        # self.bins[index] = zeros( self.bin_size ) * self.default
+        self.bins[index] = zeros( self.bin_size, self.typecode )
+        self.bins[index][:] = self.default
+    def get( self, key ):
+        bin, offset = self.get_bin_offset( key )
+        if self.bins[bin] is None:
+            return self.default
+        else:
+            return self.bins[bin][offset]
+    def set( self, key, value ):
+        bin, offset = self.get_bin_offset( key )
+        if self.bins[bin] is None: 
+            self.init_bin( bin )
+        self.bins[bin][offset] = value
+    def get_range( self, start, end ):
+        size = end - start
+        assert size >= 0
+        rval = []
+        while size > 0:
+            bin, offset = self.get_bin_offset( start )
+            delta = self.bin_size - offset
+            if self.bins[bin] is None:
+                if delta < size:
+                    rval.append( resize( array(self.default, self.typecode), (delta,) ) )
+                    size -= delta
+                    start += delta
+                else:
+                    rval.append( resize( array(self.default, "f"), (size,) ) )
+                    size = 0
+            else:
+                if delta < size:
+                    rval.append( self.bins[bin][offset:offset+delta] )
+                    size -= delta
+                    start += delta
+                else:
+                    rval.append( self.bins[bin][offset:offset+size] )
+                    size = 0
+        return concatenate( rval )
+    def __getitem__( self, key ):
+        if isinstance( key, slice ):
+            start, stop, stride = key.indices( self.max_size )
+            assert stride == 1, "Slices with strides are not supported"
+            return self.get_range( start, stop )
+        else:
+            return self.get( key )
+    def __setitem__( self, key, value ):
+        return self.set( key, value )
+    def to_file( self, f, comp_type='zlib' ):
+        # Get compress method
+        compress, _ = comp_types[comp_type]
+        # Write header
+        write_packed( f, ">5I", MAGIC, VERSION, self.max_size, self.bin_size, self.nbins )
+        # save type code
+        f.write( pack('c',self.typecode ) )
+        # save compression type
+        f.write( comp_type[0:4].ljust( 4 ) )
+        # write default value
+        a = array( self.default, self.typecode ) 
+        # Struct module can't deal with NaN and endian conversion, we'll hack 
+        # around that by byteswapping the array
+        if platform_is_little_endian: 
+            a = a.byteswap()
+        f.write( a.tostring() )
+        # Save current position (start of bin offsets)
+        index_start_pos = f.tell()
+        # Skip forward to save space for index
+        f.seek( calcsize( ">2I" ) * self.nbins, 1 )
+        bin_pos_and_size = []
+        # Write each bin
+        for bin in self.bins:
+            if bin is None: 
+                bin_pos_and_size.append( ( 0, 0 ) )
+            else:
+                assert bin.dtype.char == self.typecode
+                if platform_is_little_endian:
+                    s = bin.byteswap().tostring()
+                else:
+                    s = bin.tostring()
+                compressed = compress( s )
+                bin_pos_and_size.append( ( f.tell(), len( compressed ) ) )
+                f.write( compressed )
+        # Go back and fill in table
+        f.seek( index_start_pos )
+        for pos, size in bin_pos_and_size:
+            write_packed( f, ">2I", pos, size )
+            
+class FileBinnedArray( object ):
+    def __init__( self, f, cache=32):
+        # If cache=None, then everything is allowed to stay in memory,
+        # this is the default behavior.
+        self.f = f
+        M, V, max_size, bin_size, nbins = read_packed( f, ">5I" )
+        assert M == MAGIC
+        # assert version less than max supported
+        assert V <= VERSION, "File is version %d but I don't know about anything beyond %d" % ( V, VERSION )
+        self.max_size = max_size
+        self.bin_size = bin_size
+        self.nbins = nbins        
+        self.bins = LRUCache(size=cache)
+        # Read typecode
+        if V >= 1:
+            self.typecode = unpack( 'c', f.read(1) )[0]
+        else:
+            self.typecode = 'f'
+        # Read compression type
+        if V >= 2:
+            self.comp_type = f.read( 4 ).strip()
+        else:
+            self.comp_type = 'zlib'
+        self.decompress = comp_types[self.comp_type][1]
+        # Read default value
+        s = f.read( calcsize( self.typecode ) )
+        a = fromstring( s, self.typecode )
+        if platform_is_little_endian: 
+            a = a.byteswap()
+        self.default = a[0]
+        # Read bin sizes and offsets
+        self.bin_pos = []
+        self.bin_sizes = []
+        for i in range( nbins ):
+            pos, size = read_packed( f, ">2I" )
+            self.bin_pos.append( pos )
+            self.bin_sizes.append( size )
+    def get_bin_offset( self, index ):
+        return int( index // self.bin_size ), int( index % self.bin_size )
+    def load_bin( self, index ):
+        assert self.bin_pos[index] != 0
+        self.f.seek( self.bin_pos[index] )
+        raw = self.f.read( self.bin_sizes[index] )
+        a = fromstring( self.decompress( raw ), self.typecode )
+        if platform_is_little_endian:
+            a = a.byteswap()
+        assert len( a ) == self.bin_size
+        self.bins[index] = a
+    def get( self, key ):
+        bin, offset = self.get_bin_offset( key )
+        if bin in self.bins:
+            return self.bins[bin][offset]
+        elif self.bin_pos[bin]:
+            self.load_bin( bin )
+            return self.bins[bin][offset]
+        else:
+            return self.default
+    def get_range( self, start, end ):
+        size = end - start
+        assert size >= 0
+        rval = []
+        while size > 0:
+            bin, offset = self.get_bin_offset( start )
+            delta = self.bin_size - offset
+            if not bin in self.bins and self.bin_pos[bin] != 0:
+                self.load_bin( bin )
+            if self.bins[bin] is None:
+                if delta < size:
+                    rval.append( resize( array(self.default, self.typecode), (delta,) ) )
+                    size -= delta
+                    start += delta
+                else:
+                    rval.append( resize( array(self.default, self.typecode), (size,) ) )
+                    size = 0
+            else:
+                if delta < size:
+                    rval.append( self.bins[bin][offset:offset+delta] )
+                    size -= delta
+                    start += delta
+                else:
+                    rval.append( self.bins[bin][offset:offset+size] )
+                    size = 0
+        return concatenate( rval )
+    def __getitem__( self, key ):
+        if isinstance( key, slice ):
+            start, stop, stride = key.indices( self.max_size )
+            assert stride == 1, "Slices with strides are not supported"
+            return self.get_range( start, stop )
+        else:
+            return self.get( key )
+        
+class BinnedArrayWriter( object ):
+    def __init__( self, f, bin_size=512*1024, default=NaN, max_size=MAX, typecode="f", comp_type='zlib' ):
+        # All parameters in the constructor are immutable after creation
+        self.f = f
+        self.max_size = max_size
+        self.bin_size = bin_size
+        self.nbins = int( math.ceil( ( max_size / self.bin_size ) ) )
+        self.default = default
+        self.typecode = typecode
+        self.bin = 0
+        self.bin_pos = 0
+        self.bin_index = []
+        self.buffer = resize( array(self.default, self.typecode), (self.bin_size,) )
+        self.buffer_contains_values = False
+        self.comp_type = comp_type
+        self.compress = comp_types[comp_type][0]
+        self.write_header()
+        # Start the first bin
+        ## self.bin_index = [ (self.data_offset, 0) ]
+        # Put the fp at the start of the data (we go back and fill in the index at the end)
+        self.f.seek( self.data_offset )
+
+    def write_header( self ):
+        self.f.seek(0)
+        # Write header
+        write_packed( self.f, ">5I", MAGIC, VERSION, self.max_size, self.bin_size, self.nbins )
+        # save type code
+        self.f.write( pack('c',self.typecode ) )
+        # write default value
+        a = array( self.default, self.typecode ) 
+        # write comp type
+        self.f.write( self.comp_type[0:4].ljust(4) )
+        # write default
+        # Struct module can't deal with NaN and endian conversion, we'll hack 
+        # around that by byteswapping the array
+        if platform_is_little_endian: 
+            a = a.byteswap()
+        self.f.write( a.tostring() )
+        # Save current position (start of bin offsets)
+        self.index_pos = self.f.tell()
+        self.data_offset = self.index_pos + (self.nbins * calcsize( ">2I" ))
+        
+    def write_index( self ):
+        self.f.seek(self.index_pos)
+        for pos, size in self.bin_index:
+            write_packed( self.f, ">2I", pos, size )
+
+    def skip( self ):
+        self.bin_pos += 1
+        if self.bin_pos == self.bin_size:
+            self.flush()
+            self.bin_pos = 0
+            self.bin += 1
+            assert self.bin <= self.nbins
+            self.buffer = resize( array(self.default, self.typecode), (self.bin_size,) )
+            self.buffer_contains_values = False
+            ## self.bin_index.append( (self.f.tell(), 0) )
+
+    def write( self, data ):
+        self.buffer[self.bin_pos] = data
+        self.buffer_contains_values = True
+        self.bin_pos += 1
+        if self.bin_pos == self.bin_size:
+            self.flush()
+            self.bin_pos = 0
+            self.bin += 1
+            assert self.bin <= self.nbins
+            self.buffer = resize( array(self.default, self.typecode), (self.bin_size,) )
+            self.buffer_contains_values = False
+            ## self.bin_index.append( (self.f.tell(), 0) )
+
+    def flush( self ):
+        # Flush buffer to file
+        if self.buffer_contains_values:
+            ## pos, size = self.bin_index[self.bin]
+            ## self.f.seek( pos )
+            pos = self.f.tell()
+            if platform_is_little_endian:
+                s = self.buffer.byteswap().tostring()
+            else:
+                s = self.buffer.tostring()
+            compressed = self.compress( s )
+            size = len( compressed )
+            assert len( self.bin_index ) == self.bin
+            self.bin_index.append( ( pos, size ) )
+            self.f.write( compressed )
+        else:
+            assert len( self.bin_index ) == self.bin
+            self.bin_index.append( ( 0, 0 ) )
+
+    def finish( self ):
+        self.flush()
+        self.nbins = self.bin + 1
+        self.write_header()
+        self.write_index()
+
+def write_packed( f, pattern, *vals ):
+    f.write( pack( pattern, *vals ) )
+    
+def read_packed( f, pattern ):
+    rval = unpack( pattern, f.read( calcsize( pattern ) ) )
+    if len( rval ) == 1: return rval[0]
+    return rval
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/__init__.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/__init__.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/__init__.py (revision 3)
@@ -0,0 +1,14 @@
+import sys
+"""
+Shamelessly ripped off of py.std
+"""
+__version__ = '0.5.0'
+
+class Std( object ):
+    def __init__( self ):
+        self.__dict__ = sys.modules
+    def __getattr__( self, name ):
+        m = __import__(name)
+        return m
+
+std = Std()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/gene_reader.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/gene_reader.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/gene_reader.py (revision 3)
@@ -0,0 +1,283 @@
+"""
+Readers extracting gene (exon and intron) information from bed / gtf / gff 
+formats.
+
+ - GeneReader: yields exons
+ - CDSReader: yields cds_exons
+ - FeatureReader: yields cds_exons, introns, exons
+
+For gff/gtf, the start_codon stop_codon line types are merged with CDSs.
+"""
+
+import sys
+from bx.bitset import *
+from bx.bitset_utils import *
+from bx.bitset_builders import *
+
+def GeneReader( fh, format='gff' ):
+    """ yield chrom, strand, gene_exons, name """
+
+    known_formats = ( 'gff', 'gtf', 'bed')
+    if format not in known_formats: 
+        print >>sys.stderr,  '%s format not in %s' % (format, ",".join( known_formats ))
+        raise '?'
+    
+    if format == 'bed':
+        for line in fh:    
+            f = line.strip().split()
+            chrom = f[0]
+            chrom_start = int(f[1])
+            name = f[4]
+            strand = f[5]
+            cdsStart = int(f[6])
+            cdsEnd = int(f[7])
+            blockCount = int(f[9])
+            blockSizes = [ int(i) for i in f[10].strip(',').split(',') ]
+            blockStarts = [ chrom_start + int(i) for i in f[11].strip(',').split(',') ]
+
+            # grab cdsStart - cdsEnd
+            gene_exons = []
+            for base,offset in zip( blockStarts, blockSizes ):
+                exon_start = base
+                exon_end = base+offset
+                gene_exons.append( (exon_start, exon_end) )
+            yield chrom, strand, gene_exons, name
+    genelist = {}
+    grouplist = []
+    if format == 'gff' or format == 'gtf':
+        for line in fh:
+            if line.startswith('#'): continue
+            fields = line.strip().split('\t')
+            if len( fields ) < 9: continue
+
+            # fields
+
+            chrom = fields[0]
+            ex_st = int( fields[3] ) - 1 # make zero-centered
+            ex_end = int( fields[4] ) #+ 1 # make exclusive
+            strand = fields[6]
+
+            if format == 'gtf':
+                group = fields[8].split(';')[0]
+            else:
+                group = fields[8]
+
+            if group not in grouplist: grouplist.append( group )
+            if group not in genelist:
+                genelist[group] = (chrom, strand, [])
+            exons_i = 2
+            genelist[group][exons_i].append( ( ex_st, ex_end ) )
+
+        sp = lambda a,b: cmp( a[0], b[0] )
+
+        #for gene in genelist.values():
+        for gene in grouplist:
+            chrom, strand, gene_exons = genelist[ gene ]
+            gene_exons = bitset_union( gene_exons )
+            yield chrom, strand, gene_exons, gene
+
+def CDSReader( fh, format='gff' ):
+    """ yield chrom, strand, cds_exons, name """
+
+    known_formats = ( 'gff', 'gtf', 'bed')
+    if format not in known_formats: 
+        print >>sys.stderr,  '%s format not in %s' % (format, ",".join( known_formats ))
+        raise '?'
+    
+    if format == 'bed':
+        for line in fh:    
+            f = line.strip().split()
+            chrom = f[0]
+            chrom_start = int(f[1])
+            name = f[4]
+            strand = f[5]
+            cdsStart = int(f[6])
+            cdsEnd = int(f[7])
+            blockCount = int(f[9])
+            blockSizes = [ int(i) for i in f[10].strip(',').split(',') ]
+            blockStarts = [ chrom_start + int(i) for i in f[11].strip(',').split(',') ]
+
+            # grab cdsStart - cdsEnd
+            cds_exons = []
+            cds_seq = ''
+            genome_seq_index = []
+            for base,offset in zip( blockStarts, blockSizes ):
+                if (base + offset) < cdsStart: continue
+                if base > cdsEnd: continue
+                exon_start = max( base, cdsStart )
+                exon_end = min( base+offset, cdsEnd ) 
+                cds_exons.append( (exon_start, exon_end) )
+            yield chrom, strand, cds_exons, name
+
+    genelist = {}
+    grouplist = []
+    if format == 'gff' or format == 'gtf':
+        for line in fh:
+            if line.startswith('#'): continue
+            fields = line.strip().split('\t')
+            if len( fields ) < 9: continue
+            if fields[2] not in ('CDS', 'stop_codon', 'start_codon'): continue
+
+            # fields
+
+            chrom = fields[0]
+            ex_st = int( fields[3] ) - 1 # make zero-centered
+            ex_end = int( fields[4] ) #+ 1 # make exclusive
+            strand = fields[6]
+
+            if format == 'gtf':
+                group = fields[8].split(';')[0]
+            else:
+                group = fields[8]
+
+            if group not in grouplist: grouplist.append( group )
+            if group not in genelist:
+                genelist[group] = (chrom, strand, [])
+            
+            genelist[group][2].append( ( ex_st, ex_end ) )
+
+        sp = lambda a,b: cmp( a[0], b[0] )
+
+        #for gene in genelist.values():
+        for gene in grouplist:
+            chrom, strand, cds_exons = genelist[ gene ]
+            seqlen = sum([ a[1]-a[0] for a in cds_exons ])
+            overhang = seqlen % 3
+            if overhang > 0:
+                #print >>sys.stderr, "adjusting ", gene  
+                if strand == '+': 
+                    cds_exons[-1] = ( cds_exons[-1][0], cds_exons[-1][1] - overhang )
+                else:
+                    cds_exons[0] = ( cds_exons[0][0] + overhang, cds_exons[0][1] )
+            cds_exons = bitset_union( cds_exons )
+            yield chrom, strand, cds_exons, gene
+
+def FeatureReader( fh, format='gff', alt_introns_subtract="exons", gtf_parse=None):
+    """ 
+    yield chrom, strand, cds_exons, introns, exons, name
+
+    gtf_parse Example:
+    # parse gene_id from transcript_id "AC073130.2-001"; gene_id "TES";
+    gene_name = lambda s: s.split(';')[1].split()[1].strip('"')
+
+    for chrom, strand, cds_exons, introns, exons, name in FeatureReader( sys.stdin, format='gtf', gtf_parse=gene_name )
+    """
+
+    known_formats = ( 'gff', 'gtf', 'bed')
+    if format not in known_formats: 
+        print >>sys.stderr,  '%s format not in %s' % (format, ",".join( known_formats ))
+        raise '?'
+    
+    if format == 'bed':
+        for line in fh:    
+            f = line.strip().split()
+            chrom = f[0]
+            chrom_start = int(f[1])
+            name = f[4]
+            strand = f[5]
+            cdsStart = int(f[6])
+            cdsEnd = int(f[7])
+            blockCount = int(f[9])
+            blockSizes = [ int(i) for i in f[10].strip(',').split(',') ]
+            blockStarts = [ chrom_start + int(i) for i in f[11].strip(',').split(',') ]
+
+            # grab cdsStart - cdsEnd
+            cds_exons = []
+            exons = []
+            
+            cds_seq = ''
+            genome_seq_index = []
+            for base,offset in zip( blockStarts, blockSizes ):
+                if (base + offset) < cdsStart: continue
+                if base > cdsEnd: continue
+                # exons
+                exon_start = base
+                exon_end = base+offset
+                exons.append( (exon_start, exon_end) )
+                # cds exons
+                exon_start = max( base, cdsStart )
+                exon_end = min( base+offset, cdsEnd ) 
+                cds_exons.append( (exon_start, exon_end) )
+            cds_exons = bitset_union( cds_exons )
+            exons = bitset_union( exons )
+            introns = bitset_complement( exons )
+            yield chrom, strand, cds_exons, introns, exons, name
+
+    genelist = {}
+    grouplist = []
+    if format == 'gff' or format == 'gtf':
+        for line in fh:
+            if line.startswith('#'): continue
+            fields = line.strip().split('\t')
+            if len( fields ) < 9: continue
+
+            # fields
+
+            chrom = fields[0]
+            ex_st = int( fields[3] ) - 1 # make zero-centered
+            ex_end = int( fields[4] ) #+ 1 # make exclusive
+            strand = fields[6]
+
+            if format == 'gtf':
+                if not gtf_parse:
+                    group = fields[8].split(';')[0]
+                else:
+                    group = gtf_parse( fields[8] )
+            else:
+                group = fields[8]
+
+            # Results are listed in the same order as encountered
+            if group not in grouplist: grouplist.append( group )
+
+            if group not in genelist:
+                # chrom, strand, cds_exons, introns, exons, cds_start, cds_end
+                genelist[group] = [chrom, strand, [], [], [], None, None]
+            
+            if fields[2] == 'exon':
+                genelist[group][4].append( ( ex_st, ex_end ) )
+
+            elif fields[2] in ('CDS', 'stop_codon', 'start_codon'):
+                genelist[group][2].append( ( ex_st, ex_end ) )
+
+                if fields[2] == 'start_codon':
+                    if strand == '+': genelist[group][5] = ex_st
+                    else: genelist[group][5] = ex_end
+                if fields[2] == 'stop_codon':
+                    if strand == '+': genelist[group][5] = ex_end
+                    else: genelist[group][5] = ex_st
+
+            elif fields[2] == 'intron':
+                genelist[group][3].append( ( ex_st, ex_end ) )
+
+        for gene in grouplist:
+            chrom, strand, cds_exons, introns, exons, cds_start, cds_end = genelist[ gene ]
+
+            cds_exons = bitset_union( cds_exons )
+            exons = bitset_union( exons )
+
+            # assure that cds exons were within the cds range
+            if cds_start is not None and cds_end is not None:
+                if strand == '+':
+                    cds_exons = bitset_intersect( cds_exons, [(cds_start,cds_end)] )
+                else:
+                    cds_exons = bitset_intersect( cds_exons, [(cds_end,cds_start)] )
+
+            # assure that introns are non-overlapping with themselves or exons
+            if alt_introns_subtract:
+                if alt_introns_subtract == 'exons':
+                    introns = bitset_subtract( introns, exons )
+                if alt_introns_subtract == 'cds_exons':
+                    introns = bitset_subtract( introns, cds_exons )
+            else: introns = bitset_union( introns )
+
+            # assure CDS is a multiple of 3, trim from last exon if necessary
+            seqlen = sum([ a[1]-a[0] for a in cds_exons ])
+            overhang = seqlen % 3
+            if overhang > 0:
+                if strand == '+': 
+                    cds_exons[-1] = ( cds_exons[-1][0], cds_exons[-1][1] - overhang )
+                else:
+                    cds_exons[0] = ( cds_exons[0][0] + overhang, cds_exons[0][1] )
+
+            yield chrom, strand, cds_exons, introns, exons, gene
+
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/wiggle_tests.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/wiggle_tests.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/wiggle_tests.py (revision 3)
@@ -0,0 +1,90 @@
+"""
+Tests for `bx.wiggle`.
+"""
+
+import unittest
+from bx import wiggle
+from StringIO import StringIO
+
+# A modified version of UCSC's example wiggle, taken from http://genome.ucsc.edu/goldenPath/help/wiggleExample.txt
+test_wig = """browser position chr19:59302001-59311000
+browser hide all
+browser pack refGene encodeRegions
+browser full altGraph
+#	5 base wide bar graph, autoScale is on by default == graphing
+#	limits will dynamically change to always show full range of data
+#	in viewing window, priority = 20 positions this as the second graph
+#	Note, zero-relative, half-open coordinate system in use for bed format
+track type=wiggle_0 name="Bed Format" description="BED format" visibility=full color=200,100,0 altColor=0,100,200 priority=20
+chr19 59302000 59302005 -1.0
+chr19 59302300 59302305 -0.75
+#	4 base wide bar graph at arbitrarily spaced positions,
+#	threshold line drawn at y=11.76
+#	autoScale off viewing range set to [0:25]
+#	priority = 10 positions this as the first graph
+#	Note, one-relative coordinate system in use for this format
+track type=wiggle_0 name="variableStep" description="variableStep format" visibility=full autoScale=off viewLimits=0.0:25.0 color=255,200,0 yLineMark=11.76 yLineOnOff=on priority=10
+variableStep chrom=chr19 span=4
+59304701 10.0
+59304901 12.5
+#	3 base wide points graph at every 300 bases, 50 pixel high graph
+#	autoScale off and viewing range set to [0:1000]
+#	priority = 30 positions this as the third graph
+#	Note, one-relative coordinate system in use for this format
+track type=wiggle_0 name="fixedStep" description="fixed step" visibility=full autoScale=off viewLimits=0:1000 color=0,200,100 maxHeightPixels=100:50:20 graphType=points priority=30
+fixedStep chrom=chr19 start=59307401 step=300 span=3
+1000
+ 900
+ 800
+"""
+
+interval_reader_result = [
+"chr19,59302000,59302005,+,-1.0",
+"chr19,59302300,59302305,+,-0.75",
+"chr19,59304700,59304704,+,10.0",
+"chr19,59304900,59304904,+,12.5",
+"chr19,59307400,59307403,+,1000.0",
+"chr19,59307700,59307703,+,900.0",
+"chr19,59308000,59308003,+,800.0"
+]
+
+position_reader_result = [
+"chr19,59302000,-1.0",
+"chr19,59302001,-1.0",
+"chr19,59302002,-1.0",
+"chr19,59302003,-1.0",
+"chr19,59302004,-1.0",
+"chr19,59302300,-0.75",
+"chr19,59302301,-0.75",
+"chr19,59302302,-0.75",
+"chr19,59302303,-0.75",
+"chr19,59302304,-0.75",
+"chr19,59304700,10.0",
+"chr19,59304701,10.0",
+"chr19,59304702,10.0",
+"chr19,59304703,10.0",
+"chr19,59304900,12.5",
+"chr19,59304901,12.5",
+"chr19,59304902,12.5",
+"chr19,59304903,12.5",
+"chr19,59307400,1000.0",
+"chr19,59307401,1000.0",
+"chr19,59307402,1000.0",
+"chr19,59307700,900.0",
+"chr19,59307701,900.0",
+"chr19,59307702,900.0",
+"chr19,59308000,800.0",
+"chr19,59308001,800.0",
+"chr19,59308002,800.0"
+]
+class TestWiggleReader(unittest.TestCase):
+    def test_reader(self):
+        #Test position reader
+        assert position_reader_result == [ ",".join( map( str, value ) ) for value in wiggle.Reader( StringIO( test_wig ) ) ]
+    
+    def test_interval_reader(self):
+        #Test interval reader reader
+        assert interval_reader_result == [ ",".join( map( str, value ) ) for value in wiggle.IntervalReader( StringIO( test_wig ) ) ]
+    
+if __name__ == '__main__':
+    unittest.main()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/seq/core.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/seq/core.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/seq/core.py (revision 3)
@@ -0,0 +1,64 @@
+"""
+Support for "biological sequence" files.
+
+:Author: Bob Harris (rsharris@bx.psu.edu)
+
+See seq.py for more information
+"""
+
+import struct
+import fasta, nib, qdna
+
+# DNA reverse complement table
+
+DNA_COMP = "                                             -                  " \
+           " TVGH  CD  M KN   YSA BWXR       tvgh  cd  m kn   ysa bwxr      " \
+           "                                                                " \
+           "                                                                "
+
+def reverse_complement( text ):
+    return text.translate(DNA_COMP)[::-1]
+
+
+def seq_file (file, format=None, revcomp=False, name="", gap=None, contig=None):
+    if (format == None): format = infer_format(file)
+    if (contig != None) and (format not in ["fasta",None]):
+        raise "Contigs are not supported for format %s" % format
+    if   (format == "fasta"): return fasta.FastaFile (file, revcomp=revcomp, name=name, gap=gap, contig=contig)
+    elif (format == "nib"):   return nib.NibFile     (file, revcomp=revcomp, name=name, gap=gap)
+    elif (format == "qdna"):  return qdna.QdnaFile   (file, revcomp=revcomp, name=name, gap=gap)
+    else:
+        if (format == None): format = ""
+        else:                format = " " + format
+        raise "Unknown sequence format%s in %s" % (format,file.name)
+
+
+def seq_reader (file, format=None, revcomp=False, name="", gap=None):
+    if   (format == None):    format = infer_format(file)
+    if   (format == "fasta"): return fasta.FastaReader (file, revcomp=revcomp, name=name, gap=gap)
+    elif (format == "nib"):   return nib.NibReader     (file, revcomp=revcomp, name=name, gap=gap)
+    elif (format == "qdna"):  return qdna.QdnaReader   (file, revcomp=revcomp, name=name, gap=gap)
+    else: raise "Unknown sequence format %s" % format
+
+
+def seq_writer (outfile, format=None, name=""):
+    if   (format == "fasta"): return fasta.FastaWriter (outfile)
+    elif (format == "nib"):   return nib.NibWriter     (outfile)
+    elif (format == "qdna"):  return qdna.QdnaWriter   (outfile)
+    else: raise "Unknown sequence format %s" % format
+
+
+def infer_format (file):
+    format = None
+    magic = struct.unpack(">L", file.read(4))[0]
+    if (magic == nib.NIB_MAGIC_NUMBER) or (magic == nib.NIB_MAGIC_NUMBER_SWAP):
+        format = "nib"
+    elif (magic == qdna.qdnaMagic) or (magic == qdna.qdnaMagicSwap):
+        format = "qdna"
+    else:
+        file.seek(0)
+        if (file.read(1) == ">"):
+            format = "fasta"
+    file.seek(0)
+    return format
+
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/seq/nib.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/seq/nib.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/seq/nib.py (revision 3)
@@ -0,0 +1,84 @@
+"""
+Classes to support nib files.
+
+:Author: James Taylor (james@bx.psu.edu), Bob Harris (rsharris@bx.psu.edu)
+
+A nib sequence is a sequence of DNA, using the 10 character alphabet A,C,G,T,N
+(upper and lower case).  The file is packed as 4 bits per character.
+
+nib file format
+---------------
+
+Fields can be in big- or little-endian format;  they must match the endianess
+of the magic number.
+
+============ =========== ======================================================
+offset 0x00: 6B E9 3D 3A big endian magic number (3A 3D E9 6B => little endian)
+offset 0x04: xx xx xx xx length of data sequence (counted in characters)
+offset 0x08:  ...        data sequence;  most significant nybble in each
+                         byte is first in sequence
+============ =========== ======================================================
+"""
+
+from __future__ import division
+
+from bx.seq.seq import SeqFile,SeqReader
+import sys, struct, string, math
+
+import _nib
+
+NIB_MAGIC_NUMBER = 0x6BE93D3A
+NIB_MAGIC_NUMBER_SWAP = 0x3A3DE96B
+NIB_MAGIC_SIZE = 4
+NIB_LENGTH_SIZE = 4
+
+class NibFile(SeqFile):
+
+    def __init__(self, file, revcomp=False, name="", gap=None):
+        SeqFile.__init__(self,file,revcomp,name,gap)
+
+        self.byte_order = ">"
+        magic = struct.unpack(">L", file.read(NIB_MAGIC_SIZE))[0]
+        if (magic != NIB_MAGIC_NUMBER):
+            if magic == NIB_MAGIC_NUMBER_SWAP: self.byte_order = "<"
+            else: raise "Not a NIB file"
+        self.magic = magic
+        self.length = struct.unpack("%sL" % self.byte_order, file.read(NIB_LENGTH_SIZE))[0]
+
+    def raw_fetch(self, start, length):
+        # Check parameters
+        assert start >= 0, "Start must be greater than 0"
+        assert length >= 0, "Length must be greater than 0"
+        assert start + length <= self.length, "Interval beyond end of sequence"
+        # Read block of bytes containing sequence
+        block_start = int(math.floor(start / 2))
+        block_end = int(math.floor((start + length - 1) / 2))
+        block_len = block_end + 1 - block_start
+        self.file.seek(NIB_MAGIC_SIZE + NIB_LENGTH_SIZE + block_start)
+        raw = self.file.read(block_len)
+        # Unpack compressed block into a character string and return
+        return _nib.translate_raw_data( raw, start, length  )
+
+class NibReader(SeqReader):
+    
+    def __init__(self, file, revcomp=False, name="", gap=None):
+        SeqReader.__init__(self,file,revcomp,name,gap)
+
+    def next(self):
+        if (self.seqs_read != 0): return  # nib files have just one sequence
+        seq = NibFile(self.file,self.revcomp,self.name,self.gap)
+        self.seqs_read += 1
+        return seq
+
+
+class NibWriter(object):
+
+    def __init__(self,file):
+        self.file = file
+
+    def write(self,seq):
+        assert (False), "NibWriter.write() is not implemented yet"
+
+    def close(self):
+        self.file.close()
+
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/seq/seq.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/seq/seq.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/seq/seq.py (revision 3)
@@ -0,0 +1,135 @@
+"""
+Classes to support "biological sequence" files.
+
+:Author: Bob Harris (rsharris@bx.psu.edu)
+"""
+
+# DNA reverse complement table
+
+DNA_COMP = "                                             -                  " \
+           " TVGH  CD  M KN   YSA BWXR       tvgh  cd  m kn   ysa bwxr      " \
+           "                                                                " \
+           "                                                                "
+
+class SeqFile(object):
+    """
+    A biological sequence is a sequence of bytes or characters.  Usually these
+    represent DNA (A,C,G,T), proteins, or some variation of those.
+
+    class attributes:
+
+        file:    file object containing the sequence
+        revcomp: whether gets from this sequence should be reverse-complemented
+                 False => no reverse complement
+                 True  => (same as "-5'")
+                 "maf" => (same as "-5'")
+                 "+5'" => minus strand is from plus strand's 5' end (same as "-3'")
+                 "+3'" => minus strand is from plus strand's 3' end (same as "-5'")
+                 "-5'" => minus strand is from its 5' end (as per MAF file format)
+                 "-3'" => minus strand is from its 3' end (as per genome browser,
+                          but with origin-zero)
+        name:    usually a species and/or chromosome name (e.g. "mule.chr5");  if
+                 the file contains a name, that overrides this one
+        gap:     gap character that aligners should use for gaps in this sequence
+    """
+
+    def __init__(self, file=None, revcomp=False, name="", gap=None):
+        
+        
+        self.file = file
+        if   (revcomp == True):  self.revcomp = "-5'"
+        elif (revcomp == "+3'"): self.revcomp = "-5'"
+        elif (revcomp == "+5'"): self.revcomp = "-3'"
+        elif (revcomp == "maf"): self.revcomp = "-5'"
+        else:                    self.revcomp = revcomp
+        self.name = name
+        if (gap == None): self.gap = "-"
+        else:             self.gap = gap
+
+        self.text   = None  # (subclasses fill in text and
+        self.length = 0     #  length or they most override get())
+
+    def close(self):
+        assert (self.file != None)
+        self.file.close()
+        self.file = None
+
+    def extract_name(self,line):
+        try:
+            return line.split()[0]
+        except:
+            return ""
+
+    def set_text(self,text):
+        self.text   = text
+        self.length = len(text)
+
+    def __str__ (self):
+        text = ""
+        if (self.name != None): text += self.name + " "
+        text += self.get(0,self.length)
+        return text
+
+    def get(self, start, length):
+        """
+        Fetch subsequence starting at position `start` with length `length`. 
+        This method is picky about parameters, the requested interval must 
+        have non-negative length and fit entirely inside the NIB sequence,
+        the returned string will contain exactly 'length' characters, or an
+        AssertionError will be generated.
+        """
+        # Check parameters
+        assert length >= 0, "Length must be non-negative (got %d)" % length 
+        assert start >= 0,"Start must be greater than 0 (got %d)" % start
+        assert start + length <= self.length, \
+            "Interval beyond end of sequence (%s..%s > %s)" % ( start, start + length, self.length )
+        # Fetch sequence and reverse complement if necesary
+        if not self.revcomp:
+            return self.raw_fetch( start, length )
+        if self.revcomp == "-3'":
+            return self.reverse_complement(self.raw_fetch(start,length))
+        assert self.revcomp == "-5'", "unrecognized reverse complement scheme"
+        start = self.length - (start+length)
+        return self.reverse_complement(self.raw_fetch(start,length))
+
+    def raw_fetch(self, start, length):
+        return self.text[start:start+length]
+
+    def reverse_complement(self,text):
+        comp = [ch for ch in text.translate(DNA_COMP)]
+        comp.reverse()
+        return "".join(comp)
+
+
+class SeqReader(object):
+    """Iterate over all sequences in a file in order"""
+    
+    def __init__(self, file, revcomp=False, name="", gap=None):
+        self.file      = file
+        self.revcomp   = revcomp
+        self.name      = name
+        self.gap       = gap
+        self.seqs_read = 0
+
+    def close(self):
+        self.file.close()
+
+    def __iter__(self):
+        return SeqReaderIter(self)
+
+    def next(self):  # subclasses should override this method and return the
+        return       # .. next sequence (of type SeqFile or a subclass) read
+                     # .. from self.file
+
+
+class SeqReaderIter(object):
+    def __init__(self,reader):
+        self.reader = reader
+    def __iter__(self): 
+        return self
+    def next(self):
+        v = self.reader.next()
+        if not v: raise StopIteration
+        return v
+
+
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/seq/twobit.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/seq/twobit.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/seq/twobit.py (revision 3)
@@ -0,0 +1,126 @@
+"""
+Access to files containing sequence data in 'twobit' format.
+"""
+
+import sys
+import _twobit
+
+from struct import *
+from UserDict import DictMixin
+
+TWOBIT_MAGIC_NUMBER = 0x1A412743
+TWOBIT_MAGIC_NUMBER_SWAP = 0x4327411A
+TWOBIT_MAGIC_SIZE = 4
+
+TWOBIT_VERSION = 0
+
+class TwoBitSequence( object ):
+    def __init__( self, tbf, header_offset=None ):
+        self.tbf = tbf
+        self.header_offset = header_offset
+        self.sequence_offset = None
+        self.size = None
+        self.n_blocks = None
+        self.masked_blocks = None
+        self.loaded = False
+        
+    def __getitem__( self, slice ):
+        start, stop, stride = slice.indices( self.size )
+        assert stride == 1, "Striding in slices not supported"
+        if stop - start < 1:
+            return ""
+        return _twobit.read( self.tbf.file, self, start, stop, self.tbf.do_mask  )
+        
+    def __len__( self ):
+        return self.size
+        
+    def get( self, start, end ):
+        # Trim start / stop
+        if start < 0:
+            start = 0
+        if end > seq.size:
+            end = seq.size
+        out_size = end - start
+        if out_size < 1:
+            raise Exception( "end before start (%s,%s)" % ( start,end ) )
+        # Find position of packed portion
+        dna = _twobit.read( self.tbf.file, self, start, end, self.tbf.do_mask )
+        # Return
+        return dna
+        
+class TwoBitFile( DictMixin ):
+    def __init__( self, file, do_mask=True ):
+        self.do_mask = do_mask
+        # Read magic and determine byte order
+        self.byte_order = ">"
+        magic = unpack( ">L", file.read( TWOBIT_MAGIC_SIZE ) )[0]
+        if magic != TWOBIT_MAGIC_NUMBER:
+            if magic == TWOBIT_MAGIC_NUMBER_SWAP: 
+                self.byte_order = "<"
+            else: 
+                raise Exception( "Not a NIB file" )
+        self.magic = magic
+        self.file = file
+        # Read version
+        self.version = self.read( "L" )
+        if self.version != TWOBIT_VERSION:
+            raise Exception( "File is version '%d' but I only know about '%d'" % ( self.version, TWOBIT_VERSION ) )
+        # Number of sequences in file
+        self.seq_count = self.read( "L" )
+        # Header contains some reserved space
+        self.reserved = self.read( "L" )
+        # Read index of sequence names to offsets
+        index = dict()
+        for i in range( self.seq_count ):
+            name = self.read_p_string()
+            offset = self.read( "L" )
+            index[name] = TwoBitSequence( self, offset )
+        self.index = index
+
+    def __getitem__( self, name ):
+        seq = self.index[name]
+        if not seq.loaded:
+            self.load_sequence( name )
+        return seq
+        
+    def keys( self ):
+        return self.index.keys()
+        
+    def load_sequence( self, name ):
+        seq = self.index[name]
+        # Seek to start of sequence block
+        self.file.seek( seq.header_offset )
+        # Size of sequence
+        seq.size = self.read( "L" )
+        # Read N and masked block regions
+        seq.n_block_starts, seq.n_block_sizes = self.read_block_coords()
+        seq.masked_block_starts, seq.masked_block_sizes = self.read_block_coords()
+        # Reserved
+        self.read( "L" )
+        # Save start of actualt sequence
+        seq.sequence_offset = self.file.tell()
+        # Mark as loaded
+        seq.loaded = True
+        
+    def read_block_coords( self ):
+        blocks = []
+        block_count = self.read( "L" )
+        if block_count == 0:
+            return [], []
+        starts = self.read( str( block_count ) + "L", untuple=False )
+        sizes = self.read( str( block_count ) + "L", untuple=False  )
+        return list( starts ), list( sizes )
+        
+    def read( self, pattern, untuple=True ):
+        rval = unpack( self.byte_order + pattern, 
+                       self.file.read( calcsize( self.byte_order + pattern ) ) )
+        if untuple and len( rval ) == 1: 
+            return rval[0]
+        return rval
+        
+    def read_p_string( self ):
+        """
+        Read a length-prefixed string 
+        """
+        length = self.read( "B" )
+        return self.file.read( length )
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/seq/nib_tests.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/seq/nib_tests.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/seq/nib_tests.py (revision 3)
@@ -0,0 +1,51 @@
+"""
+Tests for `bx.seq.nib`.
+"""
+
+import unittest
+import sys
+import os.path
+import nib
+
+test_nib = "test_data/seq_tests/test.nib"
+
+# Same sequence data as stored in test.nib
+
+valid_seq = "TGGAGGCATTTGTGATTCAATAGATGCAGAAAGAAACCTTCCTAGAGCTG" \
+          + "GCGTTCTCTAACTAAAAGTGGAAAGTTCTGAGGAATGAGGACTGTTATAA" \
+          + "ATCCCACCCCACACCGCACCTTCTCCAGGGAAGTTTCATGGCCGTGAAGA" \
+          + "GGACAGAAAGTGAGAACCAAGATggaactgaataaacaagcttcacactg" \
+          + "ttagtttccccatatgcttaccttcccacagatgccaaccttggaggcct" \
+          + "aagaggcctagaatattatcctttgtctgatcatttctctacaaatttat" \
+          + "tgttctttgttaagatgctacataagcccaaattctaaccacccctttga" \
+          + "gttacccatcatcaagtttctcccatgtg"
+
+valid_seq_len = len( valid_seq )
+
+class NIBTestCase( unittest.TestCase ):
+
+    def test_get( self ):
+        nibfile = nib.NibFile( file( test_nib ) )
+        # Try all combinations of even / odd boundaries
+        check_get( nibfile, 0, 10 )
+        check_get( nibfile, 1, 10 )
+        check_get( nibfile, 0, 11 )
+        check_get( nibfile, 1, 11 )
+        # Test near end of file also
+        check_get( nibfile, valid_seq_len - 10, 10 )
+        check_get( nibfile, valid_seq_len - 11, 11 )
+        # Test really short gets
+        check_get( nibfile, 0, 0 )
+        check_get( nibfile, 1, 0 )
+        check_get( nibfile, 0, 1 )
+        check_get( nibfile, 1, 1 )
+        # Test negative length
+        self.assertRaises( AssertionError, nibfile.get, 20, -1 )
+
+def check_get( nibfile, start, len ):
+    ## print "expect: |%r|" % valid_seq[start:start+len]
+    ## print "actual: |%r|" % nibfile.get( start, len )
+    assert nibfile.get( start, len ) == valid_seq[start:start+len]
+
+test_classes = [ NIBTestCase ]
+suite = unittest.TestSuite( [ unittest.makeSuite( c ) for c in test_classes ] )
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/seq/seq_tests.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/seq/seq_tests.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/seq/seq_tests.py (revision 3)
@@ -0,0 +1,54 @@
+"""
+Tests for `bx.seq.seq`.
+"""
+
+
+import unittest
+import os.path
+import sys
+import bx.seq, fasta_tests, nib_tests, qdna_tests
+
+test_fa     = "test_data/seq_tests/test.fa"
+test2_fa    = "test_data/seq_tests/test2.fa"
+test_nib    = "test_data/seq_tests/test.nib"
+test_qdna   = "test_data/seq_tests/test.qdna"
+
+valid_fasta = fasta_tests.valid_seq
+valid_nib   = nib_tests.valid_seq
+valid_qdna  = qdna_tests.valid_seq
+
+# Same sequences as stored in test2.fa
+
+valid2_fa = [("apple",      "GGCGCTGCGATAAGGTTGCGACAACACGGACCTTCTTTTGCCTACCTCTGTTCTTGGCACG"),
+             ("orange",     "CGTGCCGAGAACAGAAAATACGCCGGGCGGTGCAGTAGTATCTTGGTATCCGATATGCAGG"),
+             ("grapefruit", "CCTGCATATCGACTAGTACACCCTCCCGAGGTACCCCACCCATCCCTCTTTTCTCGGCGCG")]
+
+class SEQTestCase (unittest.TestCase):
+
+    def test_get_fasta (self):
+        fastafile = bx.seq.seq_file (file (test_fa, "rb"))
+        check_get (fastafile, valid_fasta, 3, 40)
+
+    def test_get_nib (self):
+        nibfile = bx.seq.seq_file (file (test_nib, "rb"))
+        check_get (nibfile, valid_nib, 3, 40)
+
+    def test_get_qdna (self):
+        qdnafile = bx.seq.seq_file (file (test_qdna, "rb"))
+        check_get (qdnafile, valid_qdna, 3, 40)
+
+    def test_get_reader (self):
+        reader = bx.seq.seq_reader (file (test2_fa, "rb"))
+        for (ix,seq) in enumerate(reader):
+            assert (ix < len(valid2_fa)), "FastaReader returns too many sequences"
+            text = "%s" % seq
+            fields = text.split()
+            assert (len(fields) == 2), "SeqReader.__str__ returns incorrect sequence string \"%s\" (%d)" % text
+            assert (fields[0] == valid2_fa[ix][0]), "FastaReader returned the wrong name (%s,%s)" % (fields[0],valid2_fa[ix][0])
+            assert (fields[1] == valid2_fa[ix][1]), "FastaReader returned the wrong text (%s,%s)" % (fields[1],valid2_fa[ix][1])
+
+def check_get (seqfile, valid_seq, start, len):
+    assert seqfile.get (start, len) == valid_seq[start:start+len]
+
+test_classes = [SEQTestCase]
+suite = unittest.TestSuite ([unittest.makeSuite (c) for c in test_classes])
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/seq/twobit_tests.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/seq/twobit_tests.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/seq/twobit_tests.py (revision 3)
@@ -0,0 +1,47 @@
+import sys
+import twobit
+import random
+
+def quick_fasta_iter( f ):
+    current_header = None
+    current_sequence = []
+    for line in f:
+        if line.startswith( "#" ):
+            continue
+        if line.startswith( ">" ):
+            if current_sequence:
+                ## print current_header, "".join( current_sequence )
+                yield current_header, "".join( current_sequence )
+                current_sequence = []
+            current_header = line.strip()[1:]
+        else:
+            current_sequence.append( "".join( line.split() ) )
+    if current_sequence:
+        yield current_header, "".join( current_sequence )
+        current_sequence = []
+
+def test():
+    """
+    Nose test generator
+    """
+    for t in "test", "testN", "testMask":
+        test_fa = "test_data/seq_tests/%s.fa" % t
+        test_twobit = "test_data/seq_tests/%s.2bit" % t
+        yield check_random_subseq_matches, test_fa, test_twobit
+
+def check_random_subseq_matches( test_fa, test_twobit ):
+    # Load Fasta data
+    expected = {}
+    for h, s in quick_fasta_iter( open( test_fa ) ):
+        expected[h] = s
+    # Open 2bit
+    t = twobit.TwoBitFile( open( test_twobit ) )
+    for k, s in expected.iteritems():
+        assert k in t.index
+        # assert t.index[k].size == len(s)
+        length = len(s)
+        for i in range( 100 ):
+            start = random.randint( 0, length-2 )
+            end = random.randint( start+1, length )
+            assert t[k][start:end] == s[start:end], \
+                "seq: %s, start: %d, end: %d\nExpected:\n%s\nActual:\n%s\n" % ( k, start, end, s[start:end], t.get( k, start, end ) )
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/seq/fasta.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/seq/fasta.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/seq/fasta.py (revision 3)
@@ -0,0 +1,105 @@
+"""
+Classes to support FASTA files.
+
+:Author: Bob Harris (rsharris@bx.psu.edu)
+
+A FASTA file contains multiple sequences.  Each sequence is usually DNA.
+
+A typical FASTA file::
+
+   >mule
+   TAATACCCCGGATATATGTCCTCACATAGTTCGAGGTCGAGAAAAATGAC
+   TTCCCACCAAGTGGACTCAGCTCGAGTAAACGCCAACGATACGTCCATTA
+   GGTGTGTGCCgcaactagtcggacccgttgtgacggaaacaggtccccgc
+   caagtcacacgggcatgtcatggacTCTCGATCGTTCATCGCCTTCTTGG
+   GTACCGCAGCCGCAATTAAGCCGTGTCTTCTTCCCCCTTCAAACGGGAAT
+   CGTGTCGACTTCTTAGGAGCAGNNNNNNNNNNCTAACTCCAGAG
+   >donkey
+   TAATACCCCGGATATATGTCTTAACATAGTTCCAGGTCGAGAAGAATGAC
+   TTGCCACCAAGTGGACTCAGATTCAGTCAACGCGAACGATAAGTCCATTA
+   GGTGTGTACCgcaactagtgggacccgttgtgacggaaacaggtcaccgc
+   caagtcacacgtgcatgtcatgtacTCTCGATCGTTTATCGCCTTCTTGG
+   GTACCGCAGCCGAAATTAAGCCGTGTCTTCTTCCCACTTCAAACGGGAAT
+   CGTGTCGACTTTACAGGAACAGNNNNNNNNNNATAACGCCAGAG
+    ... more sequences
+
+Typical use:
+
+	for seq in bx.seq.fasta.FastaReader(sys.stdin):
+		print seq.name
+		print seq.get(0,seq.length)
+
+"""
+
+from bx.seq.seq import SeqFile,SeqReader
+import sys, string
+
+class FastaFile(SeqFile):
+
+    def __init__(self, file, revcomp=False, name="", gap=None, lookahead=None, contig=None):
+        SeqFile.__init__(self,file,revcomp,name,gap)
+        self.lookahead = lookahead
+        if (contig == None): contig = 1
+        assert (contig >= 1), "contig %d is not legal" % contig
+
+        # nota bene: certainly not the most efficient or elegant implementation
+
+        currContig = 1
+        while (True):
+            if (self.lookahead != None):
+                (line,self.lookahead) = (self.lookahead,None)
+            else:
+                line = self.file.readline()
+            if (line == ""): break
+            if not line:
+                break
+            if (line.startswith(">")):
+                if (self.text != None):
+                    if (currContig == contig):
+                        self.lookahead = line # (next sequence header)
+                        break
+                    currContig += 1
+                self.name = self.extract_name(line[1:])
+                self.text = []
+                continue
+            line = line.split() # (remove whitespace)
+            if (self.text == None): self.text = line # (allows headerless fasta)
+            else:                   self.text.extend(line)
+        assert (currContig == contig), \
+            "contig %d is not legal (file contains only %d)" % (contig,currContig)
+        if (self.text != None):
+            self.text   = "".join(self.text)
+            self.length = len(self.text)
+
+class FastaReader(SeqReader):
+    
+    def __init__(self, file, revcomp=False, name="", gap=None):
+        SeqReader.__init__(self,file,revcomp,name,gap)
+        self.lookahead = None
+
+    def next(self):
+        seq = FastaFile(self.file,self.revcomp,self.name,self.gap,self.lookahead)
+        if (seq.text == None): return
+        self.lookahead = seq.lookahead
+        self.seqs_read += 1
+        return seq
+
+
+class FastaWriter(object):
+
+    def __init__(self,file,columns=50):
+        self.file    = file
+        self.columns = columns
+
+    def write(self,seq):
+        print >>self.file,">%s" % seq.name
+        text = seq.text
+        if (self.columns != None) and (self.columns > 0):
+            text = "\n".join([text[ix:ix+self.columns] \
+                              for ix in range(0,len(text),self.columns)])
+        print >>self.file,text
+
+    def close(self):
+        assert (self.file != None)
+        self.file.close()
+        self.file = None
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/seq/__init__.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/seq/__init__.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/seq/__init__.py (revision 3)
@@ -0,0 +1,7 @@
+"""
+Classes for dealing with biological sequences. See `core` for the abstract
+sequence classes and `nib` and `qdna` for specifics of various
+formats.
+"""
+
+from bx.seq.core import *
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/seq/fasta_tests.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/seq/fasta_tests.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/seq/fasta_tests.py (revision 3)
@@ -0,0 +1,37 @@
+"""
+Tests for `bx.seq.fasta`.
+"""
+
+import unittest
+import sys
+import os.path
+import fasta
+
+test_fa = "test_data/seq_tests/test.fa"
+
+# Same sequence data as stored in test.fa
+
+valid_seq = "TGGAGGCATTTGTGATTCAATAGATGCAGAAAGAAACCTTCCTAGAGCTG" \
+          + "GCGTTCTCTAACTAAAAGTGGAAAGTTCTGAGGAATGAGGACTGTTATAA" \
+          + "ATCCCACCCCACACCGCACCTTCTCCAGGGAAGTTTCATGGCCGTGAAGA" \
+          + "GGACAGAAAGTGAGAACCAAGATggaactgaataaacaagcttcacactg" \
+          + "ttagtttccccatatgcttaccttcccacagatgccaaccttggaggcct" \
+          + "aagaggcctagaatattatcctttgtctgatcatttctctacaaatttat" \
+          + "tgttctttgttaagatgctacataagcccaaattctaaccacccctttga" \
+          + "gttacccatcatcaagtttctcccatgtg"
+
+valid_seq_len = len( valid_seq )
+
+class FASTATestCase( unittest.TestCase ):
+
+    def test_get( self ):
+        fastafile = fasta.FastaFile( file(test_fa, "rb" ) )
+        check_get(fastafile, 0, valid_seq_len)
+        check_get(fastafile, 0, 40)
+        check_get(fastafile, valid_seq_len - 40, 40)
+
+def check_get( fastafile, start, len ):
+    assert fastafile.get( start, len ) == valid_seq[start:start+len]
+
+test_classes = [ FASTATestCase ]
+suite = unittest.TestSuite( [ unittest.makeSuite( c ) for c in test_classes ] )
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/seq/qdna.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/seq/qdna.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/seq/qdna.py (revision 3)
@@ -0,0 +1,283 @@
+"""
+Classes to support "quantum-DNA" files.
+
+:Author: Bob Harris (rsharris@bx.psu.edu)
+
+A quantum DNA sequence is a sequence of bytes, each representing a probability
+distribution (vector) over A, C, G, T.  The QdnaFile class encapsulates the
+sequence of bytes, while the mapping from byte value to probability vector is
+encapsulated by the QdnaCodebook class.
+
+qdna file format
+~~~~~~~~~~~~~~~~
+
+Fields can be in big- or little-endian format;  they must match the endianess
+of the magic number.
+
+============ ===========   ======================================================
+offset 0x00: C4 B4 71 97   big endian magic number (97 71 B4 C4 => little endian)
+offset 0x04: 00 00 02 00   version 2.0 (fourth byte is sub version)
+offset 0x08: 00 00 00 14   header length (in bytes, including this field)
+offset 0x0C: xx xx xx xx   S, offset (from file start) to data sequence
+offset 0x10: xx xx xx xx   N, offset to name, 0 indicates no name
+offset 0x14: xx xx xx xx   length of data sequence (counted in 'items')
+offset 0x18: xx xx xx xx   (for version >= 2.0) P, offset to named
+                           .. properties, 0 indicates no properties
+offset    N: ...           name (zero-terminated string)
+offset    S: ...           data sequence
+offset    P: ...           named properties (see below)
+============ ===========   ======================================================
+
+The named properties section consists of a list of pairs of zero-terminated
+strings.  The list itself is terminated by an empty string (i.e. another
+zero).  In each pair, the first is the name of the property and the second
+is its value.  Some names are recognized and handled in some specific manner
+(see list below this paragraph).  Any unrecognized name is simply added as
+an instance variable with that name, as long as it is not already an instance
+variable (in which case it is an error).
+
+Recognized properties (at present only one):
+  - codebook: A string in qdna code file format (see QdnaCodebook class for details).
+"""
+
+from bx.seq.seq import SeqFile,SeqReader
+import sys, struct, string
+from StringIO import StringIO
+
+qdnaMagic     = 0xC4B47197L    # big endian magic number for qdna files
+qdnaMagicSwap = 0x9771B4C4L
+
+class QdnaFile(SeqFile):
+
+    def __init__(self, file, revcomp=False, name="", gap=None, codebook=None):
+        SeqFile.__init__(self,file,revcomp,name,gap)
+        if (gap == None): self.gap = chr(0)
+        assert (revcomp == False), "reverse complement is not supported for qdna files"
+        self.codebook = codebook
+
+        self.byte_order = ">"
+        magic = struct.unpack(">L", file.read(4))[0]
+        if (magic != qdnaMagic):
+            if (magic == qdnaMagicSwap):
+                self.byte_order = "<"
+            else:
+                raise "not a quantum-dna file (magic=%08X)" % magic
+
+        self.magic = magic
+
+        # process header
+
+        self.version = struct.unpack("%sL" % self.byte_order,
+                                     self.file.read(4))[0]
+        if (self.version not in [0x100,0x200]):
+            raise "unsupported quantum-dna (version=%08X)" % self.version
+
+        self.headerLength = struct.unpack("%sL" % self.byte_order,
+                                          self.file.read(4))[0]
+        if (self.headerLength < 0x10):
+            raise "unsupported quantum-dna (header len=%08X)" % self.headerLength
+        if (self.version == 0x100) and (self.headerLength != 0x10):
+            raise "unsupported quantum-dna (version 1.0 header len=%08X)" % self.headerLength
+
+        self.seqOffset  = struct.unpack("%sL" % self.byte_order,
+                                        self.file.read(4))[0]
+        self.nameOffset = struct.unpack("%sL" % self.byte_order,
+                                        self.file.read(4))[0]
+        self.length     = struct.unpack("%sL" % self.byte_order,
+                                        self.file.read(4))[0]
+
+        self.propOffset = 0
+        if (self.headerLength >= 0x14):
+            self.propOffset = struct.unpack("%sL" % self.byte_order,
+                                            self.file.read(4))[0]
+
+        self.name = ""
+        if (self.nameOffset != 0):
+            self.file.seek(self.nameOffset)
+            self.name = self.read_string()
+
+        if (self.propOffset != 0):
+            self.file.seek(self.propOffset)
+            while (True):
+                name  = self.read_string()
+                if (len(name) == 0): break
+                value = self.read_string()
+                self.set_property(name,value)
+
+
+    def set_property(self,name,value):
+        if (name == "codebook"):
+            self.codebook = QdnaCodebook(StringIO(value))
+        else:
+            raise "named properties as instance variables are not implemented yet"
+            # $$$ do this by adding a properties dict and __getitem__/__setitem__
+            # $$$ also need to write properties in QdnaWriter.write()
+
+
+    def read_string(self):
+        s = ""
+        while (True):
+            ch = self.file.read(1)
+            if (ch == chr(0)): break
+            s += ch
+        return s
+
+
+    def raw_fetch(self, start, length):
+        self.file.seek(self.seqOffset + start)
+        return self.file.read(length)
+
+
+    def get_quantum(self, start, length):
+        assert (self.codebook != None), \
+                "qdna sequence %s has no code book" % self.name
+        return [self.codebook[codeNum] for codeNum in self.raw_fetch(start,length)]
+
+
+class QdnaReader(SeqReader):
+
+    def __init__(self, file, revcomp=False, name="", gap=None, codebook=None):
+        SeqReader.__init__(self,file,revcomp,name,gap)
+        self.codebook = codebook
+
+    def next(self):
+        if (self.seqs_read != 0): return  # qdna files have just one sequence
+        seq = QdnaFile(self.file,self.revcomp,self.name,self.gap,self.codebook)
+        self.seqs_read += 1
+        return seq
+
+"""
+A QdnaCodebook maps code numbers to the corresponding probability vector.  The
+latter is a hash from symbols (usually "A", "C", "G", or "T") to the
+corresponsing probability.  Note that code numbers are of type string.
+
+qdna code file format:
+
+   The file is ascii text and looks something like what's shown below.  Lines
+   beginning with # are comments, and columns are assumed to represent A, C, G
+   and T (in that order).  Anything other than five columns is an error.  Note
+   that code number zero is usually reserved for gaps in quantum sequences, and
+   thus usually won't appear in a code file.  Note that code numbers are
+   two-digit hexadecimal (to match the textual displays of quantum sequences).
+
+      01  0.111002  0.072588  0.127196  0.689214
+      02  0.081057  0.023799  0.098657  0.796487
+      03  0.000260  0.003823  0.000336  0.995581
+       ... more lines, usually a total of 255 ...
+      FF  0.465900  0.008602  0.482301  0.043197
+"""
+
+class QdnaCodebook(object):
+
+    def __init__(self,file):
+        (self.alphabet,self.codeToProbs) = self.read_codebook(file)
+
+
+    def __str__(self):
+        codeSet = [codeNum for codeNum in self.codeToProbs]
+        codeSet.sort()
+        return "\n".join([self.vector_text(codeNum) for codeNum in codeSet])
+
+    def vector_text(self,codeNum):
+        if (codeNum in self.codeToProbs): vec = self.codeToProbs[codeNum]
+        else:                             vec = {}
+        for sym in self.alphabet:
+            if (sym not in vec):
+                vec[sym] = 0.0
+        return ("%02X\t" % ord(codeNum)) \
+            + "\t".join(["%.6f" % vec[sym] for sym in self.alphabet])
+
+
+    def __getitem__ (self,codeNum):
+        return self.codeToProbs[codeNum]
+
+
+    def __setitem__ (self,codeNum,value):
+        self.codeToProbs[codeNum] = value # value should be hash from symbol
+                                          # .. to probability
+
+
+    def read_codebook(self,codeF):
+        alphabet = "ACGT"
+        codeToProbs = {}
+
+        for (lineNum,line) in enumerate (codeF):
+            lineNum += 1
+            line = line.rstrip()
+            stripped = line.strip()
+            if (stripped == "") or (stripped.startswith("#")):
+                continue
+
+            fields = line.split(None)
+            if (len(fields) != 5):
+                raise "wrong vector size (line %d)" % lineNum
+
+            try:
+                codeNum = int(fields[0],16)
+            except:
+                raise "bad character code %s (line %d)" \
+                    % (fields[0],lineNum)
+
+            if (not 0 <= codeNum <= 255):
+                raise "character code %s is outside the valid range (line %d)" \
+                     % (fields[0],lineNum)
+
+            if (chr(codeNum) in codeToProbs):
+                raise "character code %s appears more than once (line %d)" \
+                     % (fields[0],lineNum)
+
+            try:
+                vec = {}
+                for ix in range(1,5):
+                    p = float(fields[ix])
+                    if (p < 0) or (p > 1): raise ValueError
+                    vec[alphabet[ix-1]] = p
+            except:
+                raise "%s is a bad probability value (line %d)" \
+                     % (fields[ix],lineNum)
+
+            codeToProbs[chr(codeNum)] = vec
+
+        return (alphabet,codeToProbs)
+
+
+class QdnaWriter(object):
+
+    def __init__(self,file):
+        self.file = file
+
+    def write(self,seq):
+        text = seq.text
+        if (text == None): text = ""
+
+        version   = 0x200
+        headerLen = 0x014
+        offset    = headerLen + 8
+
+        nameOffset = 0
+        if (seq.name != None) and (seq.name != ""):
+            nameOffset =  0x01C
+            offset     += len(seq.name) + 1
+            name       =  seq.name + chr(0)
+
+        dataOffset =  offset
+        offset     += len(text)
+
+        assert (seq.codebook == None), \
+               "QdnaWriter.write() does not support codebooks yet"
+        propOffset = 0
+
+        self.file.write(struct.pack("%sL" % seq.byte_order,qdnaMagic))
+        self.file.write(struct.pack("%sL" % seq.byte_order,version))
+        self.file.write(struct.pack("%sL" % seq.byte_order,headerLen))
+        self.file.write(struct.pack("%sL" % seq.byte_order,dataOffset))
+        self.file.write(struct.pack("%sL" % seq.byte_order,nameOffset))
+        self.file.write(struct.pack("%sL" % seq.byte_order,len(text)))
+        self.file.write(struct.pack("%sL" % seq.byte_order,propOffset))
+        if (nameOffset != 0): self.file.write(name)
+        self.file.write(text)
+
+
+    def close(self):
+        self.file.close()
+
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/seq/qdna_tests.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/seq/qdna_tests.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/seq/qdna_tests.py (revision 3)
@@ -0,0 +1,37 @@
+"""
+Tests for `bx.seq.qdna`.
+"""
+
+import unittest
+import sys
+import os.path
+import qdna
+
+test_qdna = "test_data/seq_tests/test.qdna"
+
+# Same sequence data as stored in test.qdna
+
+valid_seq = "C7wMwHQrMKqEtSREuUv5nsLinpTS8l7jXpbI7IipvCbHnhOdgx" \
+          + "5tzRgzYl4j85d:xSlvKPEKEIvZkfiX1YPkBi1Ibhfn9fTZd8gG" \
+          + "Wy284hJnwf93W4eHOjeRk7LuVYmH{UTYkYM:b4J4MruMq1ihhv" \
+          + "1Yl5W[xXEmi8[JuuLRgooBpy23PllMuUiIiKVIK5vzhjPPYp5Y" \
+          + "1eqPxo[e5I24KeCdTV94MZWNybUb:McC:1n4Jczk8JqnR4q1gY" \
+          + "HjLS4Bes3s5YvvWdKzS4VrFZy2erhd7YoWRoS[UK8JtSp1{Z1o" \
+          + "5:TpvN8mrmWrghiNw{S6nT8DSfF{1ff6kNGpI:FsZE2RgipTVO" \
+          + "mJN6vPm8MUgNYd7MDBEu37YOPzPjO1dr"
+
+valid_seq_len = len(valid_seq)
+
+class QDNATestCase(unittest.TestCase):
+
+    def test_get(self):
+        qdnafile = qdna.QdnaFile(file(test_qdna,"rb"))
+        check_get(qdnafile, 0, valid_seq_len)
+        check_get(qdnafile, 0, 40)
+        check_get(qdnafile, valid_seq_len - 40, 40)
+
+def check_get(qdnafile, start, len):
+    assert qdnafile.get(start, len) == valid_seq[start:start+len]
+
+test_classes = [ QDNATestCase ]
+suite = unittest.TestSuite( [ unittest.makeSuite( c ) for c in test_classes ] )
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/seq/_nib.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/seq/_nib.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/seq/_nib.py (revision 3)
@@ -0,0 +1,7 @@
+def __bootstrap__():
+   global __bootstrap__, __loader__, __file__
+   import sys, pkg_resources, imp
+   __file__ = pkg_resources.resource_filename(__name__,'_nib.so')
+   __loader__ = None; del __bootstrap__, __loader__
+   imp.load_dynamic(__name__,__file__)
+__bootstrap__()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/seq/_twobit.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/seq/_twobit.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/seq/_twobit.py (revision 3)
@@ -0,0 +1,7 @@
+def __bootstrap__():
+   global __bootstrap__, __loader__, __file__
+   import sys, pkg_resources, imp
+   __file__ = pkg_resources.resource_filename(__name__,'_twobit.so')
+   __loader__ = None; del __bootstrap__, __loader__
+   imp.load_dynamic(__name__,__file__)
+__bootstrap__()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/align/core.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/align/core.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/align/core.py (revision 3)
@@ -0,0 +1,421 @@
+"""
+Classes that represent alignments between multiple sequences.
+"""
+
+import random
+import string
+import weakref
+from bx.misc.readlengths import read_lengths_file
+
+# DNA reverse complement table
+## DNA_COMP = "                                             -                  " \
+##            " TVGH  CD  M KN   YSA BWXR       tvgh  cd  m kn   ysa bwxr      " \
+##            "                                                                " \
+##            "                                                                "
+
+DNA_COMP = string.maketrans( "ACGTacgt", "TGCAtgca" )
+
+class Alignment( object ):
+
+    def __init__( self, score=0, attributes={}, species_to_lengths=None ):
+        # species_to_lengths is needed only for file formats that don't provide
+        # chromosome lengths;  it maps each species name to one of these:
+        #   - the name of a file that contains a list of chromosome length pairs
+        #   - a dict mapping chromosome names to their length
+        #   - a single length value (useful when we just have one sequence and no chromosomes)
+        # internally a file name is replaced by a dict, but only on an "as
+        # needed" basis
+        self.score = score
+        self.text_size = 0
+        self.attributes = attributes
+        if species_to_lengths == None: self.species_to_lengths = {}
+        else: self.species_to_lengths = species_to_lengths
+        self.components = []
+
+    def add_component( self, component ):
+        component._alignment = weakref.ref( self )
+        self.components.append( component )
+        if component.text is not None:
+            if self.text_size == 0: 
+                self.text_size = len( component.text )
+            elif self.text_size != len( component.text ): 
+                raise Exception( "Components must have same text length" )
+
+    def get_score( self ):
+        return self.__score
+    def set_score( self,score ):
+        if type( score ) == str:
+            try:
+                score = int(score)
+            except:
+                try:
+                    score = float(score)
+                except:
+                    pass
+        self.__score = score
+    score = property( fget=get_score,fset=set_score )
+
+    def __str__( self ):
+        s = "a score=" + str( self.score )
+        for key in self.attributes: 
+            s += " %s=%s" % ( key, self.attributes[key] )
+        s += "\n"
+        # Components
+        for c in self.components: 
+            s += str( c )
+            s += "\n"
+        return s
+
+    def src_size( self, src ):
+        species,chrom = src_split( src )
+        if species in self.species_to_lengths:
+            chrom_to_length = self.species_to_lengths[species]
+        elif chrom in self.species_to_lengths:
+            chrom_to_length = self.species_to_lengths
+        else:
+            raise "no src_size (no length file for %s)" % species
+        if type( chrom_to_length ) == int:         # (if it's a single length)
+            return chrom_to_length
+        if type( chrom_to_length ) == type( "" ):  # (if it's a file name)
+            chrom_to_length = read_lengths_file( chrom_to_length )
+            self.species_to_lengths[species] = chrom_to_length
+        if chrom not in chrom_to_length: raise "no src_size (%s has no length for %s)" % ( species, chrom )
+        return chrom_to_length[chrom]
+
+    def get_component_by_src( self, src ):
+        for c in self.components:
+            if c.src == src: return c
+        return None
+
+    def get_component_by_src_start( self, src ):
+        for c in self.components:
+            if c.src.startswith( src ): return c
+        return None    
+
+    def slice( self, start, end ):
+        new = Alignment( score=self.score, attributes=self.attributes )
+        for component in self.components:
+            # FIXME: Is this the right solution?
+            if component.empty:
+                continue
+            new.components.append( component.slice( start, end ) )
+        new.text_size = end - start
+        return new
+    
+    def reverse_complement( self ):
+        new = Alignment( score=self.score, attributes=self.attributes )
+        for component in self.components:
+            new.components.append( component.reverse_complement() )
+        new.text_size = self.text_size
+        return new
+    
+    def slice_by_component( self, component_index, start, end ):
+        """
+        Return a slice of the alignment, corresponding to an coordinate interval in a specific component.
+
+        component_index is one of
+            an integer offset into the components list
+            a string indicating the src of the desired component
+            a component
+
+        start and end are relative to the + strand, regardless of the component's strand.
+
+        """
+        if type( component_index ) == type( 0 ):
+            ref = self.components[ component_index ]
+        elif type( component_index ) == type( "" ):
+            ref = self.get_component_by_src( component_index )
+        elif type( component_index ) == Component:
+            ref = component_index
+        else:
+            raise ValueError( "can't figure out what to do" )
+        start_col = ref.coord_to_col( start )  
+        end_col = ref.coord_to_col( end )  
+        if (ref.strand == '-'):
+            (start_col,end_col) = (end_col,start_col)
+        return self.slice( start_col, end_col )
+        
+    def column_iter( self ):
+        for i in range( self.text_size ):
+            yield [ c.text[i] for c in self.components ]
+
+    def limit_to_species( self, species ):
+        new = Alignment( score=self.score, attributes=self.attributes )
+        new.text_size = self.text_size
+        for component in self.components:
+            if component.src.split('.')[0] in species:
+                new.add_component( component )
+        return new
+
+    def remove_all_gap_columns( self ):
+        """
+        Remove any columns containing only gaps from alignment components,
+        text of components is modified IN PLACE.
+        """
+        seqs = []
+        for c in self.components:
+            try:
+                seqs.append( list( c.text ) )
+            except TypeError:
+                seqs.append( None )
+        i = 0
+        text_size = self.text_size
+        while i < text_size:
+            all_gap = True
+            for seq in seqs:
+                if seq is None: continue
+                if seq[i] != '-': all_gap = False
+            if all_gap:
+                for seq in seqs:
+                    if seq is None: continue
+                    del seq[i]
+                text_size -= 1
+            else:
+                i += 1
+        for i in range( len( self.components ) ):
+            if seqs[i] is None: continue
+            self.components[i].text = ''.join( seqs[i] )
+        self.text_size = text_size
+        
+    def __eq__( self, other ):
+        if other is None or type( other ) != type( self ):
+            return False
+        if self.score != other.score:
+            return False
+        if self.attributes != other.attributes:
+            return False
+        if len( self.components ) != len( other.components ):
+            return False
+        for c1, c2 in zip( self.components, other.components ):
+            if c1 != c2:
+                return False
+        return True
+        
+    def __ne__( self, other ):
+        return not( self.__eq__( other ) )
+    
+    def __deepcopy__( self, memo ):
+        from copy import deepcopy
+        new = Alignment( score=self.score, attributes=deepcopy( self.attributes ), species_to_lengths=deepcopy( self.species_to_lengths ) )
+        for component in self.components:
+            new.add_component( deepcopy( component ) )
+        return new
+    
+class Component( object ):
+
+    def __init__( self, src='', start=0, size=0, strand=None, src_size=None, text='' ):
+        self._alignment = None
+        self.src = src
+        self.start = start          # Nota Bene:  start,size,strand are as they
+        self.size = size            # .. appear in a MAF file-- origin-zero, end
+        self.strand = strand        # .. excluded, and minus strand counts from
+        self._src_size = src_size   # .. end of sequence
+        self.text = text
+        self.quality = None
+        # Optional fields to keep track of synteny status (only makes sense
+        # when the alignment is part of an ordered set)
+        self.synteny_left = None
+        self.synteny_right = None
+        self.synteny_empty = None
+        # If true, this component actually represents a non-aligning region,
+        # and has no text.
+        self.empty = False
+        # Index maps a coordinate (distance along + strand from + start) to alignment column
+        self.index = None
+
+    def __str__( self ):
+        if self.empty:
+            rval = "e %s %d %d %s %d %s" % ( self.src, self.start, 
+                                             self.size, self.strand, 
+                                             self.src_size, self.synteny_empty )
+        else:
+            rval = "s %s %d %d %s %d %s" % ( self.src, self.start, 
+                                             self.size, self.strand, 
+                                             self.src_size, self.text )
+            if self.synteny_left and self.synteny_right:
+                rval += "\ni %s %s %d %s %d" % ( self.src, 
+                                                 self.synteny_left[0], self.synteny_left[1],
+                                                 self.synteny_right[0], self.synteny_right[1] )
+        return rval
+
+    def get_end( self ):
+        return self.start + self.size
+    end = property( fget=get_end )
+
+    def get_src_size( self ):
+        if self._src_size == None:
+            if self._alignment == None: raise "component has no src_size"
+            self._src_size = self._alignment().src_size( self.src )
+        return self._src_size
+    def set_src_size( self,src_size ):
+        self._src_size = src_size
+    src_size = property( fget=get_src_size, fset=set_src_size )
+
+    def get_forward_strand_start( self ):
+        if self.strand == '-': return self.src_size - self.end
+        else: return self.start
+    forward_strand_start = property( fget=get_forward_strand_start )
+        
+    def get_forward_strand_end( self ):
+        if self.strand == '-': return self.src_size - self.start
+        else: return self.end
+    forward_strand_end = property( fget=get_forward_strand_end)
+
+    def reverse_complement( self ):
+        start = self.src_size - self.end 
+        if self.strand == "+": strand = "-"
+        else: strand = "+"
+        comp = [ch for ch in self.text.translate(DNA_COMP)]
+        comp.reverse()
+        text = "".join(comp)
+        new = Component( self.src, start, self.size, strand, self._src_size, text )
+        new._alignment = self._alignment
+        return new
+
+    def slice( self, start, end ):
+        new = Component( src=self.src, start=self.start, strand=self.strand, src_size=self._src_size )
+        new._alignment = self._alignment
+        new.text = self.text[start:end]
+
+        #for i in range( 0, start ):
+        #    if self.text[i] != '-': new.start += 1
+        #for c in new.text:
+        #    if c != '-': new.size += 1
+        new.start += start - self.text.count( '-', 0, start )
+        new.size = len( new.text ) - new.text.count( '-' )
+
+        # FIXME: This annotation probably means nothing after slicing if
+        # one of the ends changes. In general the 'i' rows of a MAF only
+        # make sense in context (relative to the previous and next alignments
+        # in a stream, slicing breaks that).
+        new.synteny_left = self.synteny_left
+        new.synteny_right = self.synteny_right
+
+        return new
+
+    def slice_by_coord( self, start, end ):
+        """
+        Return the slice of the component corresponding to a coordinate interval.
+
+        start and end are relative to the + strand, regardless of the component's strand.
+
+        """
+        start_col = self.coord_to_col( start )  
+        end_col = self.coord_to_col( end )  
+        if (self.strand == '-'):
+            (start_col,end_col) = (end_col,start_col)
+        return self.slice( start_col, end_col )
+    
+    def coord_to_col( self, pos ):
+        """
+        Return the alignment column index corresponding to coordinate pos.
+
+        pos is relative to the + strand, regardless of the component's strand.
+
+        """
+        start,end = self.get_forward_strand_start(),self.get_forward_strand_end()
+        if pos < start or pos > end:
+            raise "Range error: %d not in %d-%d" % ( pos, start, end )
+        if not self.index:
+            self.index = list()
+            if (self.strand == '-'):
+                # nota bene: for - strand self.index[x] maps to one column
+                # higher than is actually associated with the position;  thus
+                # when slice_by_component() and slice_by_coord() flip the ends,
+                # the resulting slice is correct
+                for x in range( len(self.text)-1,-1,-1 ):
+                    if not self.text[x] == '-':
+                        self.index.append( x + 1 )
+                self.index.append( 0 )
+            else:
+                for x in range( len(self.text) ):
+                    if not self.text[x] == '-':
+                        self.index.append(x)
+                self.index.append( len(self.text) )
+        x = None
+        try:
+            x = self.index[ pos - start ]
+        except:
+            raise "Error in index."
+        return x
+    
+    
+    def __eq__( self, other ):
+        if other is None or type( other ) != type( self ):
+            return False
+        return ( self.src == other.src
+                 and self.start == other.start
+                 and self.size == other.size            
+                 and self.strand == other.strand        
+                 and self._src_size == other._src_size   
+                 and self.text == other.text
+                 and self.synteny_left == other.synteny_left
+                 and self.synteny_right == other.synteny_right
+                 and self.synteny_empty == other.synteny_empty
+                 and self.empty == other.empty )
+        
+    def __ne__( self, other ):
+        return not( self.__eq__( other ) )
+    
+    def __deepcopy__( self, memo ):
+        new = Component( src=self.src, start=self.start, size=self.size, strand=self.strand, src_size=self._src_size, text=self.text )
+        new._alignment = self._alignment
+        new.quality = self.quality
+        new.synteny_left = self.synteny_left
+        new.synteny_right = self.synteny_right
+        new.synteny_empty = self.synteny_empty
+        new.empty = self.empty
+        new.index = self.index
+        return new
+
+def get_reader( format, infile, species_to_lengths=None ):
+    import bx.align.maf, bx.align.axt, bx.align.lav
+    if format == "maf": return bx.align.maf.Reader( infile, species_to_lengths )
+    elif format == "axt": return bx.align.axt.Reader( infile, species_to_lengths )
+    elif format == "lav": return bx.align.lav.Reader( infile )
+    else: raise "Unknown alignment format %s" % format
+
+def get_writer( format, outfile, attributes={} ):
+    import bx.align.maf, bx.align.axt, bx.align.lav
+    if format == "maf": return bx.align.maf.Writer( outfile, attributes )
+    elif format == "axt": return bx.align.axt.Writer( outfile, attributes )
+    elif format == "lav": return bx.align.lav.Writer( outfile, attributes )
+    else: raise "Unknown alignment format %s" % format
+
+def get_indexed( format, filename, index_filename=None, keep_open=False, species_to_lengths=None ):
+    import bx.align.maf, bx.align.axt, bx.align.lav
+    if format == "maf": return bx.align.maf.Indexed( filename, index_filename, keep_open, species_to_lengths )
+    elif format == "axt": return bx.align.axt.Indexed( filename, index_filename, keep_open, species_to_lengths )
+    elif format == "lav": raise "LAV support for Indexed has not been implemented"
+    else: raise "Unknown alignment format %s" % format
+
+def shuffle_columns( a ):
+    """Randomize the columns of an alignment"""
+    mask = range( a.text_size )
+    random.shuffle( mask )
+    for c in a.components:
+        c.text = ''.join( [ c.text[i] for i in mask ] )
+
+def src_split( src ): # splits src into species,chrom
+    dot = src.rfind( "." )
+    if dot == -1: return None,src
+    else:         return src[:dot],src[dot+1:]
+
+def src_merge( species,chrom,contig=None ): # creates src (inverse of src_split)
+    if species == None: src = chrom
+    else:               src = species + "." + chrom
+    if contig != None: src += "[%s]" % contig
+    return src
+
+# ---- Read C extension if available ---------------------------------------
+
+try:
+    from _core import coord_to_col
+except:
+    def coord_to_col( start, text, pos ):
+        col = 0
+        while start < pos:
+            if text[col] != '-': 
+                start += 1
+            col += 1 
+        return col
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/align/sitemask/_cpg.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/align/sitemask/_cpg.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/align/sitemask/_cpg.py (revision 3)
@@ -0,0 +1,7 @@
+def __bootstrap__():
+   global __bootstrap__, __loader__, __file__
+   import sys, pkg_resources, imp
+   __file__ = pkg_resources.resource_filename(__name__,'_cpg.so')
+   __loader__ = None; del __bootstrap__, __loader__
+   imp.load_dynamic(__name__,__file__)
+__bootstrap__()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/align/sitemask/core.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/align/sitemask/core.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/align/sitemask/core.py (revision 3)
@@ -0,0 +1,35 @@
+"""
+Base classes for site maskers.
+"""
+
+from bx.filter import *
+
+class Masker( Filter ):
+    def __init__( self, **kwargs ):
+        self.masked = 0
+        self.total = 0
+        Exception("Abstract class")
+
+class MaskPipeline( Pipeline ):
+    """
+    MaskPipeline implements a Pipeline through which alignments can be
+    pushed and masked.  Pipelines can be aggregated.
+    """
+    def get_masked( self ):
+        masked = 0
+        for function in self.pipeline:
+            try: masked += masker.masked
+            except AttributeError: pass
+        return masked
+    masked = property( fget=get_masked )
+    
+    def __call__( self, block ):
+        if not block: return
+        # push alignment block through all filters
+        self.total += len( block.components[0].text )
+        for masker in self.filters:
+            if not block: return
+            try: m_filter = masker.__call__
+            except AttributeError:
+                raise Exception("Masker in pipeline does not implement \"filter( self, block )\".")
+            masker( block )
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/align/sitemask/quality.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/align/sitemask/quality.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/align/sitemask/quality.py (revision 3)
@@ -0,0 +1,130 @@
+"""
+Support for masking out sites in alignments based on sequence quality. Both 
+simple masking of regions below some threshold and masking using the 
+neighborhood quality standard (NQS) are supported. Uses sequence quality
+values stored in a `bx.binned_array.FileBinnedArray`.
+"""
+
+from bx.align.sitemask import Masker
+from bx.align import *
+from bx.binned_array import FileBinnedArray
+
+# This class implements simple rules for masking quality, if base <
+# minqual, mask
+class Simple( Masker ):
+    # keys should be:
+    # qualspecies: dictionary of species as key, lengths
+    #              dict by chromosome or chromosome list as value
+    # qualfiles: prefix for quality file for each species in qualspecies
+    # mask: mask character (default is '?')
+    # minqual: minimum quality
+    # cache: optional, but sets the number of megabytes allowed in cache per quality masked species
+    def __init__( self, qualfiles = None, qualspecies = None, minqual = None, mask = "?", cache=100):
+        if not qualfiles:
+            raise Exception("No quality files.")
+        if not qualspecies:
+            raise Exception("No species dictionary.")
+        if not minqual:
+            raise Exception("No minimum quality specified.")
+        self.mask = "?"
+        self.minqual = minqual
+        self.mask = mask
+        self.total = 0
+        self.masked = 0
+        
+        self.qualfiles = qualfiles
+        self.qualspecies = qualspecies
+        self.cache = cache * 2 # typical bin size is 512K
+        # load quality files into FileBinnedArray
+        self.qualities = {}
+        for species, qualfile in self.qualfiles.items():
+            specdict = {}
+            for chrom in self.qualspecies[species]:
+                specdict[chrom] = FileBinnedArray( \
+                    open(qualfile + "." + chrom + ".bqv", "rb"), \
+                    cache = self.cache/len(qualfiles) )
+            self.qualities[species] = specdict
+        
+    def __call__( self, block ):
+        if not block: return
+        for qualspec in self.qualities:
+            comp = block.get_component_by_src_start(qualspec)
+            if not comp: continue
+            chrom = comp.src.split(".")[1]
+            start, end = comp.get_forward_strand_start(), comp.get_forward_strand_end()
+            # get quality slice, for + strand
+            qual = self.qualities[qualspec][chrom][start:end]
+            x = 0
+            while start+x < end:
+                self.total += 1
+                # got the column in the alignment for this particular base
+                if qual[x] < self.minqual:
+                    col = comp.coord_to_col(start+x)
+                    self.masked += 1
+                    for component in block.components:
+                        if component.text[col] != "-":
+                            component.text = component.text[0:col] + \
+                                             self.mask + \
+                                             component.text[col+1:len(component.text)]
+                # iterate through quality
+                x += 1
+        return block
+    
+class NQS( Masker ):
+    # keys should be:
+    # qualspecies: dictionary of species as key, lengths
+    #              dict by chromosome or chromosome list as value
+    # qualfiles: prefix for quality file for each species in qualspecies
+    # mask: mask character (default is '?')
+    # minqual: minimum quality
+    # neighborqual: neighborhood minimum quality (bases within 5 bps are masked)
+    # cache: optional, but sets the number of megabytes allowed in cache per quality masked species
+    def __init__( self, qualfiles = None, qualspecies = None, minqual = None, mask = "?", cache=100):
+        if not qualfiles:
+            raise Exception("No quality files.")
+        if not qualspecies:
+            raise Exception("No species dictionary.")
+        if not minqual:
+            raise Exception("No minimum quality specified.")
+        self.mask = "?"
+        self.minqual = minqual
+        self.mask = mask
+        self.total = 0
+        self.masked = 0
+        
+        self.qualfiles = qualfiles
+        self.qualspecies = qualspecies
+        self.cache = cache * 2 # typical bin size is 512K
+        # load quality files into FileBinnedArray
+        self.qualities = {}
+        for species, qualfile in self.qualfiles.items():
+            specdict = {}
+            for chrom in self.qualspecies[species]:
+                specdict[chrom] = FileBinnedArray( \
+                    open(qualfile + "." + chrom + ".bqv", "rb"), \
+                    cache = self.cache/len(qualfiles) )
+            self.qualities[species] = specdict
+        
+    def __call__( self, block ):
+        if not block: return
+        for qualspec in self.qualities:
+            comp = block.get_component_by_src_start(qualspec)
+            chrom = comp.src.split(".")[1]
+            start, end = comp.get_forward_strand_start(), comp.get_forward_strand_end()
+            # get quality slice, for + strand
+            qual = self.qualities[qualspec][chrom][start:end]
+            x = 0
+            while start+x < end:
+                self.total += 1
+                # got the column in the alignment for this particular base
+                if qual[x] < self.minqual:
+                    col = comp.coord_to_col(start+x)
+                    self.masked += 1
+                    for component in block.components:
+                        if component.text[col] != "-":
+                            component.text = component.text[0:col] + \
+                                             self.mask + \
+                                             component.text[col+1:len(component.text)]
+                # iterate through quality
+                x += 1
+        return block
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/align/sitemask/cpg.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/align/sitemask/cpg.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/align/sitemask/cpg.py (revision 3)
@@ -0,0 +1,91 @@
+"""
+Support for masking potential CpG sites in *pairwise* alignments. 
+"""
+
+from _cpg import *
+from bx.align.sitemask import Masker
+from bx.filter import *
+import string
+
+# Restricted.  Only mask out sites that are defitely CpG
+class Restricted( Masker ):
+    def __init__( self, mask = '?' ):
+        self.mask = mask
+        self.masked = 0
+        self.total = 0
+        
+    def __call__( self, block ):
+        if not block: return block
+        if len(block.components) < 2:
+            return
+        cpglist = list_cpg_restricted( \
+            string.upper(block.components[0].text), \
+            string.upper(block.components[1].text) )
+
+        # now we have a fast list of CpG columns, iterate/mask
+        self.masked += len(cpglist)
+        self.total += len(block.components[0].text)
+        for component in block.components:
+            component.text = mask_columns( cpglist, component.text, self.mask )
+            
+        return block
+    
+# Inclusive. Mask out all sites that are not non-CpG sites.
+class Inclusive( Masker ):
+    def __init__( self, mask = '?' ):
+        self.mask = mask
+        self.masked = 0
+        self.total = 0
+        
+    def __call__( self, block ):
+        if not block: return block
+        if len(block.components) < 2:
+            return
+        cpglist = list_cpg( \
+            string.upper(block.components[0].text), \
+            string.upper(block.components[1].text) )
+        
+        self.masked += len( cpglist )
+        self.total += len( block.components[0].text )
+        for component in block.components:
+            component.text = mask_columns( cpglist, component.text, self.mask)
+            
+        return block
+
+#Mak nonCpG sites
+class nonCpG( Masker ):
+    def __init__( self, mask = '?' ):
+        self.mask = mask
+        self.masked = 0
+        self.total = 0
+        
+    def __call__( self, block ):
+        if not block: return block
+        if len(block.components) < 2:
+            return
+        noncpglist = list_non_cpg( \
+            string.upper(block.components[0].text), \
+            string.upper(block.components[1].text) )
+
+        # now we have a fast list of non-CpG columns, iterate/mask
+        self.masked += len(noncpglist)
+        self.total += len(block.components[0].text)
+        for component in block.components:
+            component.text = mask_columns( noncpglist, component.text, self.mask )
+            
+        return block
+    
+def mask_columns( masklist, text, mask ):
+    templist = list()
+    for position in masklist:
+        if text[position] != "-":
+            templist.append(position)
+    templist.append(len(text)) # Add the end of the text
+    #cut string
+    newtext = list()
+    c = 0
+    for position in templist:
+        newtext.append(text[c:position])
+        c = position + 1 # Gaps have len = 1
+    joinedtext = mask.join(newtext)
+    return joinedtext
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/align/sitemask/__init__.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/align/sitemask/__init__.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/align/sitemask/__init__.py (revision 3)
@@ -0,0 +1,6 @@
+"""
+Tools for masking out specific sites in aligments by various criteria, for
+example masking CpG sites or sites with low sequence quality.
+"""
+
+from bx.align.sitemask.core import *
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/align/sitemask/sitemask_tests.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/align/sitemask/sitemask_tests.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/align/sitemask/sitemask_tests.py (revision 3)
@@ -0,0 +1,82 @@
+"""
+Tests for `bx.align.maf.sitemask`.
+"""
+
+import sys,tempfile
+import unittest
+from StringIO import StringIO
+import cpg
+import bx.align.maf
+
+test_maf_cpg = """##maf version=1 scoring=none
+a score=0
+s apple  34 64 + 110 AGGGA---GTTCGTCACT------GTCGTAAGGGTTCAGA--CTGTCTATGTATACACAAGTTGTGTTGCA--ACCG
+s orange 19 61 - 100 AGGGATGCGTT--TCACTGCTATCGTCGTA----TTCAGACTTCG-CTATCT------GAGTTGT---GCATTACCG
+"""
+
+cpg_inclusive_result = [
+"##maf,version=1",
+"a,score=0",
+"s,apple,34,64,+,110,AGGGA---GTTCGTCACT------GT##TAAGGGTTCAGA--CTGTCTATGTATACACAAGTTGTGTTGCA--ACCG", 
+"s,orange,19,61,-,100,AGGGATG#GTT--TCACTGCTAT#GT##TA----TTCAGACTTCG-CTATCT------GAGTTGT---GCATTACCG" 
+]
+
+cpg_restricted_result = [
+"##maf,version=1",
+"a,score=0",
+"s,apple,34,64,+,110,A##GA---#TT##TC#C#------#T##TA###GTTC#GA--C##TC#A#G#ATAC####GT#G#GT#GC#--AC#G", 
+"s,orange,19,61,-,100,A##GA#G##TT--TC#C#GC#AT##T##TA----TTC#GAC#T##-C#A#C#------##GT#G#---GC#TTAC#G"                          
+]
+
+noncpg_result = [
+"##maf,version=1",
+"a,score=0",
+"s,apple,34,64,+,110,#GG##---G##CG##A#T------G#CG##AGG####A##--#TG##T#T#T####ACAA##T#T##T##A--##CG", 
+"s,orange,19,61,-,100,#GG##T#CG##--##A#T##T##CG#CG##----###A###T#CG-#T#T#T------GA##T#T---##A####CG" 
+]
+
+def test_cpg_inclusive():
+    reader = bx.align.maf.Reader( StringIO( test_maf_cpg ) )
+    out = tempfile.NamedTemporaryFile('w')
+    writer = bx.align.maf.Writer( out )
+    cpgfilter = cpg.Inclusive( mask='#' )
+    cpgfilter.run( reader, writer.write )
+    out.seek(0)
+    j=0
+    for line in file(out.name):
+        line = line.strip()
+        if not(line):
+            continue
+        assert cpg_inclusive_result[j] == ",".join(line.split())
+        j+=1
+    
+def test_cpg_restricted():
+    reader = bx.align.maf.Reader( StringIO( test_maf_cpg ) )
+    out = tempfile.NamedTemporaryFile('w')
+    writer = bx.align.maf.Writer( out )
+    cpgfilter = cpg.Restricted( mask='#' )
+    cpgfilter.run( reader, writer.write )
+    out.seek(0)
+    j=0
+    for line in file(out.name):
+        line = line.strip()
+        if not(line):
+            continue
+        assert cpg_restricted_result[j] == ",".join(line.split())
+        j+=1
+
+def test_non_cpg():
+    reader = bx.align.maf.Reader( StringIO( test_maf_cpg ) )
+    out = tempfile.NamedTemporaryFile('w')
+    writer = bx.align.maf.Writer( out )
+    cpgfilter = cpg.nonCpG( mask='#' )
+    cpgfilter.run( reader, writer.write )
+    out.seek(0)
+    j=0
+    for line in file(out.name):
+        line = line.strip()
+        if not(line):
+            continue
+        assert noncpg_result[j] == ",".join(line.split())
+        j+=1
+
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/align/tools/chop.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/align/tools/chop.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/align/tools/chop.py (revision 3)
@@ -0,0 +1,29 @@
+"""
+Support for chopping a list of alignment blocks to only the portion that
+intersects a particular interval.
+"""
+
+def chop_list( blocks, src, start, end ):
+    """
+    For each alignment block in the sequence `blocks`, chop out the portion
+    of the block that overlaps the interval [`start`,`end`) in the
+    component/species named `src`.
+    """
+    new_blocks = []
+    for block in blocks: 
+        ref = block.get_component_by_src( src )
+        # If the reference component is on the '-' strand we should complement the interval
+        if ref.strand == '-':
+            slice_start = max( ref.src_size - end, ref.start )
+            slice_end = max( ref.src_size - start, ref.end )
+        else:
+            slice_start = max( start, ref.start )
+            slice_end = min( end, ref.end )
+        sliced = block.slice_by_component( ref, slice_start, slice_end ) 
+        good = True
+        for c in sliced.components: 
+            if c.size < 1: 
+                good = False
+        if good:
+            new_blocks.append( sliced )
+    return new_blocks
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/align/tools/tile.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/align/tools/tile.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/align/tools/tile.py (revision 3)
@@ -0,0 +1,81 @@
+"""
+Tools for tiling / projecting alignments onto an interval of a sequence.
+"""
+
+import bx.align as align
+from bx import misc
+import bx.seq.nib
+import os
+import string
+import sys
+
+
+def tile_interval( sources, index, ref_src, start, end, seq_db=None ):
+    """
+    Tile maf blocks onto an interval. The resulting block will span the interval
+    exactly and contain the column from the highest scoring alignment at each
+    position. 
+    
+    `sources`: list of sequence source names to include in final block
+    `index`: an instnace that can return maf blocks overlapping intervals
+    `ref_src`: source name of the interval (ie, hg17.chr7)
+    `start`: start of interval
+    `end`: end of interval
+    `seq_db`: a mapping for source names in the reference species to nib files
+    """
+    # First entry in sources should also be on the reference species
+    assert sources[0].split('.')[0] == ref_src.split('.')[0], \
+        "%s != %s" % ( sources[0].split('.')[0], ref_src.split('.')[0] )
+    base_len = end - start
+    blocks = index.get( ref_src, start, end )
+    # From low to high score
+    blocks.sort( lambda a, b: cmp( a.score, b.score ) )
+    mask = [ -1 ] * base_len
+    ref_src_size = None
+    for i, block in enumerate( blocks ):
+        ref = block.get_component_by_src_start( ref_src )
+        ref_src_size = ref.src_size
+        assert ref.strand == "+"
+        slice_start = max( start, ref.start )
+        slice_end = min( end, ref.end )
+        for j in range( slice_start, slice_end ):
+            mask[j-start] = i
+    tiled = []
+    for i in range( len( sources ) ): 
+        tiled.append( [] )
+    for ss, ee, index in intervals_from_mask( mask ):
+        # Interval with no covering alignments
+        if index < 0:
+            # Get sequence if available, otherwise just use 'N'
+            if seq_db:
+                tiled[0].append( bx.seq.nib.NibFile( open( seq_db[ ref_src ] ) ).get( start+ss, ee-ss ) )
+            else:
+                tiled[0].append( "N" * (ee-ss) )
+            # Gaps in all other species
+            for row in tiled[1:]:
+                row.append( "-" * ( ee - ss ) )
+        else:
+            slice_start = start + ss
+            slice_end = start + ee
+            block = blocks[index]
+            ref = block.get_component_by_src_start( ref_src )
+            sliced = block.slice_by_component( ref, slice_start, slice_end ) 
+            sliced = sliced.limit_to_species( sources )
+            sliced.remove_all_gap_columns()
+            for i, src in enumerate( sources ):
+                comp = sliced.get_component_by_src_start( src )
+                if comp:
+                    tiled[i].append( comp.text )
+                else:
+                    tiled[i].append( "-" * sliced.text_size )        
+    return [ "".join( t ) for t in tiled ]
+
+def intervals_from_mask( mask ):
+    start = 0
+    last = mask[0]
+    for i in range( 1, len( mask ) ):
+        if mask[i] != last:
+            yield start, i, last
+            start = i
+            last = mask[i]
+    yield start, len(mask), last
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/align/tools/__init__.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/align/tools/__init__.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/align/tools/__init__.py (revision 3)
@@ -0,0 +1,8 @@
+"""
+Various utilities for working with `bx.align.Alignment` objects.
+"""
+
+from fuse import *
+from thread import *
+from chop import *
+from tile import *
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/align/tools/fuse.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/align/tools/fuse.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/align/tools/fuse.py (revision 3)
@@ -0,0 +1,88 @@
+"""
+Tools for fusing contiguous alignment blocks together.
+"""
+
+from itertools import *
+from copy import deepcopy
+
+def fuse_list( mafs ):
+    """
+    Try to fuse a list of blocks by progressively fusing each adjacent pair.
+    """
+    last = None
+    for m in mafs:
+        if last is None:
+            last = m
+        else:
+            fused = fuse( last, m )
+            if fused:
+                last = fused
+            else:
+                yield last
+                last = m
+    if last:
+        yield last
+
+def fuse( m1, m2 ):
+    """
+    Attempt to fuse two blocks. If they can be fused returns a new block, 
+    otherwise returns None.
+      
+    Example:
+      
+    >>> import bx.align.maf
+      
+    >>> block1 = bx.align.maf.from_string( '''
+    ... a score=0.0
+    ... s hg18.chr10 52686 44 + 135374737 GTGCTAACTTACTGCTCCACAGAAAACATCAATTCTGCTCATGC
+    ... s panTro1.chrUn_random 208115356 44 - 240967748 GTGCTAACTGACTGCTCCAGAGAAAACATCAATTCTGTTCATGT
+    ... ''' )
+    
+    >>> block2 = bx.align.maf.from_string( '''
+    ... a score=0.0
+    ... s hg18.chr10 52730 69 + 135374737 GCAGGTACAATTCATCAAGAAAGGAATTACAACTTCAGAAATGTGTTCAAAATATATCCATACTTTGAC
+    ... s panTro1.chrUn_random 208115400 69 - 240967748 GCAGCTACTATTCATCAAGAAAGGGATTACAACTTCAGAAATGTGTTCAAAGTGTATCCATACTTTGAT
+    ... ''' )
+    
+    >>> fused = fuse( block1, block2 )
+    
+    >>> print fused
+    a score=0.0
+    s hg18.chr10 52686 113 + 135374737 GTGCTAACTTACTGCTCCACAGAAAACATCAATTCTGCTCATGCGCAGGTACAATTCATCAAGAAAGGAATTACAACTTCAGAAATGTGTTCAAAATATATCCATACTTTGAC
+    s panTro1.chrUn_random 208115356 113 - 240967748 GTGCTAACTGACTGCTCCAGAGAAAACATCAATTCTGTTCATGTGCAGCTACTATTCATCAAGAAAGGGATTACAACTTCAGAAATGTGTTCAAAGTGTATCCATACTTTGAT
+    <BLANKLINE>
+    """
+    # Check if the blocks are adjacent, return none if not.
+    if len( m1.components ) != len( m2.components ): return None
+    for c1, c2 in izip( m1.components, m2.components ):
+        if c1.src != c2.src: return None
+        if c1.strand != c2.strand: return None
+        if c1.end != c2.start: return None
+    # Try to fuse:
+    n = deepcopy( m1 )
+    for c1, c2 in izip( n.components, m2.components ):
+        c1.text += c2.text
+        c1.size += c2.size
+    n.text_size = len( n.components[0].text )
+    return n
+    
+class FusingAlignmentWriter( object ):
+    """
+    Wrapper for an alignment Writer which attempts to fuse adjacent blocks
+    """
+    def __init__( self, maf_writer ):
+        self.maf_writer = maf_writer
+        self.last = None
+    def write( self, m ):
+        if not self.last:
+            self.last = m
+        else:
+            fused = fuse( self.last, m )
+            if fused:
+                self.last = fused
+            else:
+                self.maf_writer.write( self.last )
+                self.last = m
+    def close( self ):
+        if self.last: self.maf_writer.write( self.last )
+        self.maf_writer.close()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/align/tools/thread.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/align/tools/thread.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/align/tools/thread.py (revision 3)
@@ -0,0 +1,98 @@
+"""
+Tools for "threading" out specific species from alignments (removing other
+species and fixing alignment text).
+"""
+
+import sys
+from itertools import *
+from copy import deepcopy
+
+def thread( mafs, species ):
+    """
+    Restrict an list of alignments to a given list of species by:
+    
+        1) Removing components for any other species 
+        2) Remove any columns containing all gaps
+      
+    Example:
+      
+    >>> import bx.align.maf
+      
+    >>> block1 = bx.align.maf.from_string( '''
+    ... a score=4964.0
+    ... s hg18.chr10                  52686 44 + 135374737 GTGCTAACTTACTGCTCCACAGAAAACATCAATTCTGCTCATGC
+    ... s rheMac2.chr20            58163346 43 -  88221753 ATATTATCTTAACATTAAAGA-AGAACAGTAATTCTGGTCATAA
+    ... s panTro1.chrUn_random    208115356 44 - 240967748 GTGCTAACTGACTGCTCCAGAGAAAACATCAATTCTGTTCATGT
+    ... s oryCun1.scaffold_175207     85970 22 +    212797 ----------------------AAAATATTAGTTATCACCATAT
+    ... s bosTau2.chr23            23894492 43 +  41602928 AAACTACCTTAATGTCACAGG-AAACAATGTATgctgctgctgc
+    ... ''' )
+    
+    >>> block2 = bx.align.maf.from_string( '''
+    ... a score=9151.0
+    ... s hg18.chr10                  52730 69 + 135374737 GCAGGTACAATTCATCAAGAAAG-GAATTACAACTTCAGAAATGTGTTCAAAATATATCCATACTT-TGAC
+    ... s oryCun1.scaffold_175207     85992 71 +    212797 TCTAGTGCTCTCCAATAATATAATAGATTATAACTTCATATAATTATGTGAAATATAAGATTATTTATCAG
+    ... s panTro1.chrUn_random    208115400 69 - 240967748 GCAGCTACTATTCATCAAGAAAG-GGATTACAACTTCAGAAATGTGTTCAAAGTGTATCCATACTT-TGAT
+    ... s rheMac2.chr20            58163389 69 -  88221753 ACACATATTATTTCTTAACATGGAGGATTATATCTT-AAACATGTGTGCaaaatataaatatatat-tcaa
+    ... ''' )
+    
+    >>> mafs = [ block1, block2 ]
+    
+    >>> threaded = [ t for t in thread( mafs, [ "hg18", "panTro1" ] ) ]
+    
+    >>> len( threaded )
+    2
+    
+    >>> print threaded[0]
+    a score=0.0
+    s hg18.chr10 52686 44 + 135374737 GTGCTAACTTACTGCTCCACAGAAAACATCAATTCTGCTCATGC
+    s panTro1.chrUn_random 208115356 44 - 240967748 GTGCTAACTGACTGCTCCAGAGAAAACATCAATTCTGTTCATGT
+    <BLANKLINE>
+
+    >>> print threaded[1]
+    a score=0.0
+    s hg18.chr10 52730 69 + 135374737 GCAGGTACAATTCATCAAGAAAGGAATTACAACTTCAGAAATGTGTTCAAAATATATCCATACTTTGAC
+    s panTro1.chrUn_random 208115400 69 - 240967748 GCAGCTACTATTCATCAAGAAAGGGATTACAACTTCAGAAATGTGTTCAAAGTGTATCCATACTTTGAT
+    <BLANKLINE>
+    
+    """
+    for m in mafs:
+        new_maf = deepcopy( m )
+        new_components = get_components_for_species( new_maf, species )	
+        if new_components: 
+            remove_all_gap_columns( new_components )          
+            new_maf.components = new_components
+            new_maf.score = 0.0
+            new_maf.text_size = len(new_components[0].text)
+            yield new_maf
+        
+def get_components_for_species( alignment, species ):
+    """Return the component for each species in the list `species` or None"""
+    # If the number of components in the alignment is less that the requested number
+    # of species we can immediately fail
+    if len( alignment.components ) < len( species ): return None
+    # Otherwise, build an index of components by species, then lookup 
+    index = dict( [ ( c.src.split( '.' )[0], c ) for c in alignment.components ] )
+    try: return [ index[s] for s in species ]
+    except: return None
+
+def remove_all_gap_columns( components ):
+    """
+    Remove any columns containing only gaps from a set of alignment components,
+    text of components is modified IN PLACE.
+    
+    TODO: Optimize this with Pyrex.
+    """        
+    seqs = [ list( c.text ) for c in components ]
+    i = 0
+    text_size = len( seqs[0] )
+    while i < text_size:
+        all_gap = True
+        for seq in seqs:
+            if seq[i] != '-': all_gap = False
+        if all_gap:
+            for seq in seqs: del seq[i]
+            text_size -= 1
+        else:
+            i += 1
+    for i in range( len( components ) ):
+        components[i].text = ''.join( seqs[i] )
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/align/score.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/align/score.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/align/score.py (revision 3)
@@ -0,0 +1,291 @@
+"""
+Support for scoring alignments using arbitrary scoring matrices, arbitrary
+alphabets, and affine gap penalties.
+"""
+
+from numpy import *
+
+class ScoringScheme( object ):
+	# note that gap_open and gap_extend are penalties, which means you should make them positive
+    def __init__( self, gap_open, gap_extend, default=-100, alphabet1="ACGT", alphabet2=None, gap1="-", gap2=None, text1_range=128, text2_range=None, typecode=int32 ):
+        if (text2_range == None): text2_range = text1_range
+        if (alphabet2 == None): alphabet2 = alphabet1
+        if (gap2 == None): gap2 = gap1 # (scheme with gap1=gap2=None is legit)
+        if type(alphabet1) == str: alphabet1 = [ch for ch in alphabet1]
+        if type(alphabet2) == str: alphabet2 = [ch for ch in alphabet2]
+        self.table = ones( (text1_range, text2_range), typecode )
+        self.table *= default
+        self.gap_open = gap_open
+        self.gap_extend = gap_extend
+        self.gap1 = gap1
+        self.gap2 = gap2
+        self.alphabet1 = alphabet1
+        self.alphabet2 = alphabet2
+	# private _set_score and _get_score allow subclasses to override them to
+	# implement a different underlying table object
+    def _set_score(self,(a,b),val):
+        self.table[a,b] = val
+    def _get_score(self,(a,b)):
+        return self.table[a,b]
+    def set_score( self, a, b, val, foldcase1=False, foldcase2=False ):
+        self._set_score((a,b),val)
+        if foldcase1:
+            aCh = chr(a)
+            if   (aCh.isupper()): aa = ord(aCh.lower())
+            elif (aCh.islower()): aa = ord(aCh.upper())
+            else:                 foldcase1 = False
+        if foldcase2:
+            bCh = chr(b)
+            if   (bCh.isupper()): bb = ord(bCh.lower())
+            elif (bCh.islower()): bb = ord(bCh.upper())
+            else:                 foldcase2 = False
+        if foldcase1 and foldcase2:
+            self._set_score((aa,b ),val)
+            self._set_score((a ,bb),val)
+            self._set_score((aa,bb),val)
+        elif foldcase1:
+            self._set_score((aa,b ),val)
+        elif foldcase2:
+            self._set_score((a ,bb),val)
+    def score_alignment( self, a ):
+        return score_alignment(self,a)
+    def score_texts( self, text1, text2 ):
+        return score_texts( self, text1, text2 )
+    def __str__ (self):
+        isDna1 = "".join( self.alphabet1 ) == "ACGT"
+        isDna2 = "".join( self.alphabet2 ) == "ACGT"
+        labelRows = not ( isDna1 and isDna2 )
+        width = 3
+        for a in self.alphabet1:
+            for b in self.alphabet2:
+                score = self._get_score((ord(a),ord(b)))
+                if (type(score) == float): s = "%8.6f" % score
+                else:                      s = "%s"    % score
+                if (len(s)+1 > width):
+                    width = len(s)+1
+        lines = []
+        line = []
+        if labelRows:
+            if isDna1: line.append(" ")
+            else:      line.append("  ")
+        for b in self.alphabet2:
+            if isDna2: s = b
+            else:      s = "%02X" % ord(b)
+            line.append("%*s" % (width,s))
+        lines.append(("".join(line))+"\n")
+        for a in self.alphabet1:
+            line = []
+            if labelRows:
+                if isDna1: line.append(a)
+                else:      line.append("%02X" % ord(a))
+            for b in self.alphabet2:
+                score = self._get_score((ord(a),ord(b)))
+                if (type(score) == float): s = "%8.6f" % score
+                else:                      s = "%s"    % score
+                line.append("%*s" % (width,s))
+            lines.append(("".join(line))+"\n")
+        return "".join(lines)
+
+def read_scoring_scheme( f, gap_open, gap_extend, gap1="-", gap2=None, **kwargs ):
+    """
+    Initialize scoring scheme from a file containint a blastz style text blob.
+    f can be either a file or the name of a file.
+    """
+    close_it = False
+    if (type(f) == str):
+        f = file(f,"rt")
+        close_it = True
+    ss = build_scoring_scheme("".join([line for line in f]),gap_open, gap_extend, gap1=gap1, gap2=gap2, **kwargs)
+    if (close_it):
+        f.close()
+    return ss
+
+def build_scoring_scheme( s, gap_open, gap_extend, gap1="-", gap2=None, **kwargs ):
+    """
+    Initialize scoring scheme from a blastz style text blob, first line
+    specifies the bases for each row/col, subsequent lines contain the
+    corresponding scores.  Slaw extensions allow for unusual and/or
+    asymmetric alphabets.  Symbols can be two digit hex, and each row
+    begins with symbol.  Note that a row corresponds to a symbol in text1
+    and a column to a symbol in text2.
+
+    examples:
+
+       blastz                       slaw
+
+          A    C    G    T               01   02    A    C    G    T
+         91 -114  -31 -123          01  200 -200  -50  100  -50  100
+       -114  100 -125  -31          02 -200  200  100  -50  100  -50
+        -31 -125  100 -114
+       -123  -31 -114   91
+    """
+    # perform initial parse to determine alphabets and locate scores
+    bad_matrix = "invalid scoring matrix"
+    s = s.rstrip( "\n" )
+    lines = s.split( "\n" )
+    rows  = []
+    symbols2 = lines.pop(0).split()
+    symbols1 = None
+    rows_have_syms = False
+    a_la_blastz = True
+    for i, line in enumerate( lines ):
+        row_scores = line.split()
+        if len( row_scores ) == len( symbols2 ):        # blastz-style row
+            if symbols1 == None:
+                if len( lines ) != len( symbols2 ):
+                    raise bad_matrix
+                symbols1 = symbols2
+            elif (rows_have_syms):
+                raise bad_matrix
+        elif len( row_scores ) == len( symbols2 ) + 1:  # row starts with symbol
+            if symbols1 == None:
+                symbols1 = []
+                rows_have_syms = True
+                a_la_blastz = False
+            elif not rows_have_syms:
+                raise bad_matrix
+            symbols1.append( row_scores.pop(0) )
+        else:
+            raise bad_matrix
+        rows.append( row_scores )
+    # convert alphabets from strings to characters
+    try:
+        alphabet1 = [sym_to_char( sym ) for sym in symbols1]
+        alphabet2 = [sym_to_char( sym ) for sym in symbols2]
+    except ValueError:
+        raise bad_matrix
+    if (alphabet1 != symbols1) or (alphabet2 != symbols2):
+        a_la_blastz = False
+    if a_la_blastz:
+        alphabet1 = [ch.upper() for ch in alphabet1]
+        alphabet2 = [ch.upper() for ch in alphabet2]
+    # decide if rows and/or columns should reflect case
+    if a_la_blastz:
+        foldcase1 = foldcase2 = True
+    else:
+        foldcase1 = "".join( alphabet1 ) == "ACGT"
+        foldcase2 = "".join( alphabet2 ) == "ACGT"
+    # create appropriately sized matrix
+    text1_range = text2_range = 128
+    if ord( max( alphabet1 ) ) >= 128: text1_range = 256
+    if ord( max( alphabet2 ) ) >= 128: text2_range = 256
+    typecode = int32
+    for i, row_scores in enumerate( rows ):
+        for j, score in enumerate( map( int_or_float, row_scores ) ):
+            if type( score ) == float: 
+                typecode = float32
+    if type( gap_open ) == float: 
+        typecode = float32
+    if type( gap_extend ) == float: 
+        typecode = float32
+    ss = ScoringScheme( gap_open, gap_extend, alphabet1=alphabet1, alphabet2=alphabet2, gap1=gap1, gap2=gap2, text1_range=text1_range, text2_range=text2_range, typecode=typecode, **kwargs )
+    # fill matrix
+    for i, row_scores in enumerate( rows ):
+        for j, score in enumerate( map( int_or_float, row_scores ) ):
+            ss.set_score( ord( alphabet1[i] ), ord( alphabet2[j] ), score )
+            if foldcase1 and foldcase2:
+                ss.set_score( ord( alphabet1[i].lower() ), ord( alphabet2[j].upper() ), score )
+                ss.set_score( ord( alphabet1[i].upper() ), ord( alphabet2[j].lower() ), score )
+                ss.set_score( ord( alphabet1[i].lower() ), ord( alphabet2[j].lower() ), score )
+            elif foldcase1:
+                ss.set_score( ord( alphabet1[i].lower() ), ord( alphabet2[j]         ), score )
+            elif foldcase2:
+                ss.set_score( ord( alphabet1[i]         ), ord( alphabet2[j].lower() ), score )
+    return ss
+
+def int_or_float( s ):
+    try:    return int( s )
+    except: return float( s )
+
+# convert possible two-char symbol to a single character
+def sym_to_char( sym ):
+    if   len( sym ) == 1: return sym
+    elif len( sym ) != 2: raise ValueError
+    else:                 return chr(int(sym,base=16))
+
+def score_alignment( scoring_scheme, a ):
+    score = 0
+    ncomps = len( a.components )
+    for i in range( ncomps ):
+        for j in range( i+1, ncomps ):
+            score += score_texts( scoring_scheme, a.components[i].text, a.components[j].text )
+    return score
+    
+def score_texts( scoring_scheme, text1, text2 ):
+    rval = 0
+    last_gap_a = last_gap_b = False
+    for i in range( len( text1 ) ):
+        a = text1[i]
+        b = text2[i]
+        # Ignore gap/gap pair
+        if a == scoring_scheme.gap1 and b == scoring_scheme.gap2: 
+            continue
+        # Gap in first species
+        elif a == scoring_scheme.gap1:
+            rval -= scoring_scheme.gap_extend
+            if not last_gap_a:
+               rval -= scoring_scheme.gap_open
+               last_gap_a = True
+               last_gap_b = False
+        # Gap in second species
+        elif b == scoring_scheme.gap2:
+            rval -= scoring_scheme.gap_extend
+            if not last_gap_b:
+               rval -= scoring_scheme.gap_open
+               last_gap_a = False
+               last_gap_b = True
+        # Aligned base
+        else:   
+            rval += scoring_scheme._get_score((ord(a),ord(b)))
+            last_gap_a = last_gap_b = False
+    return rval
+
+def accumulate_scores( scoring_scheme, text1, text2, skip_ref_gaps=False ):
+    """
+    Return cumulative scores for each position in alignment as a 1d array.
+    
+    If `skip_ref_gaps` is False positions in returned array correspond to each
+    column in alignment, if True they correspond to each non-gap position (each
+    base) in text1.
+    """
+    if skip_ref_gaps:
+        rval = zeros( len( text1 ) - text1.count( scoring_scheme.gap1 ) )
+    else:
+        rval = zeros( len( text1 ) )
+    score = 0
+    pos = 0
+    last_gap_a = last_gap_b = False
+    for i in range( len( text1 ) ):
+        a = text1[i]
+        b = text2[i]
+        # Ignore gap/gap pair
+        if a == scoring_scheme.gap1 and b == scoring_scheme.gap2: 
+            continue
+        # Gap in first species
+        elif a == scoring_scheme.gap1:
+            score -= scoring_scheme.gap_extend
+            if not last_gap_a:
+               score -= scoring_scheme.gap_open
+               last_gap_a = True
+               last_gap_b = False
+        # Gap in second species
+        elif b == scoring_scheme.gap2:
+            score -= scoring_scheme.gap_extend
+            if not last_gap_b:
+               score -= scoring_scheme.gap_open
+               last_gap_a = False
+               last_gap_b = True
+        # Aligned base
+        else:   
+            score += scoring_scheme._get_score((ord(a),ord(b)))
+            last_gap_a = last_gap_b = False
+        if not( skip_ref_gaps ) or a != scoring_scheme.gap1:
+            rval[pos] = score
+            pos += 1
+    return rval
+
+hox70 = build_scoring_scheme( """  A    C    G    T
+                                  91 -114  -31 -123
+                                -114  100 -125  -31
+                                 -31 -125  100 -114
+                                -123  -31 -114   91 """, 400, 30 )
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/align/axt.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/align/axt.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/align/axt.py (revision 3)
@@ -0,0 +1,193 @@
+"""
+Support for reading and writing the `AXT`_ format used for pairwise 
+alignments.
+
+.. _AXT: http://genome.ucsc.edu/goldenPath/help/axt.html
+"""
+
+from bx.align import *
+
+import itertools
+from bx import interval_index_file
+
+# Tools for dealing with pairwise alignments in AXT format
+
+class MultiIndexed( object ):
+    """Similar to 'indexed' but wraps more than one axt_file"""
+    def __init__( self, axt_filenames, keep_open=False ):
+        self.indexes = [ Indexed( axt_file, axt_file + ".index" ) for axt_file in axt_filenames ]
+    def get( self, src, start, end ):
+        blocks = []
+        for index in self.indexes: blocks += index.get( src, start, end )
+        return blocks
+
+
+class Indexed( object ):
+    """Indexed access to a axt using overlap queries, requires an index file"""
+
+    def __init__( self, axt_filename, index_filename=None, keep_open=False, species1 = None, species2=None, species_to_lengths=None, support_ids=False ):
+        if index_filename is None: index_filename = axt_filename + ".index"
+        self.indexes = interval_index_file.Indexes( filename=index_filename )
+        self.axt_filename = axt_filename
+        # nota bene: (self.species1 = species1 or "species1") is incorrect if species1=""
+        self.species1 = species1
+        if (self.species1 == None): self.species1 = "species1"
+        self.species2 = species2
+        if (self.species2 == None): self.species2 = "species2"
+        self.species_to_lengths = species_to_lengths
+        self.support_ids        = support_ids            # for extra text at end of axt header lines
+        if keep_open:
+            self.f = open( axt_filename )
+        else:
+            self.f = None
+
+    def get( self, src, start, end ):
+        intersections = self.indexes.find( src, start, end )
+        return itertools.imap( self.get_axt_at_offset, [ val for start, end, val in intersections ] )
+
+    def get_axt_at_offset( self, offset ):
+        if self.f:
+            self.f.seek( offset )
+            return read_next_axt( self.f, self.species1, self.species2, self.species_to_lengths, self.support_ids )
+        else:
+            f = open( self.axt_filename )
+            try:
+                f.seek( offset )
+                return read_next_axt( f, self.species1, self.species2, self.species_to_lengths, self.support_ids )
+            finally:
+                f.close()
+
+class Reader( object ):
+    """Iterate over all axt blocks in a file in order"""
+    
+    def __init__( self, file, species1 = None, species2=None, species_to_lengths=None, support_ids=False ):
+        self.file = file
+        # nota bene: (self.species1 = species1 or "species1") is incorrect if species1=""
+        self.species1 = species1
+        if (self.species1 == None): self.species1 = "species1"
+        self.species2 = species2
+        if (self.species2 == None): self.species2 = "species2"
+        self.species_to_lengths = species_to_lengths
+        self.support_ids        = support_ids            # for extra text at end of axt header lines
+        self.attributes = {}
+
+    def next( self ):
+        return read_next_axt( self.file, self.species1, self.species2, self.species_to_lengths, self.support_ids )
+
+    def __iter__( self ):
+        return ReaderIter( self )
+
+    def close( self ):
+        self.file.close()
+
+class ReaderIter( object ):
+    def __init__( self, reader ):
+        self.reader = reader
+    def __iter__( self ): 
+        return self
+    def next( self ):
+        v = self.reader.next()
+        if not v: raise StopIteration
+        return v
+
+class Writer( object ):
+
+    def __init__( self, file, attributes={} ):
+        self.file = file
+        self.block = 0
+        self.src_split = True
+        if ("src_split" in attributes):
+            self.src_split = attributes["src_split"]
+
+    def write( self, alignment ):
+        if (len(alignment.components) != 2):
+            raise "%d-component alignment is not compatible with axt" % \
+                   len(alignment.components)
+        c1 = alignment.components[0]
+        c2 = alignment.components[1]
+
+        if c1.strand != "+":
+            c1 = c1.reverse_complement()
+            c2 = c2.reverse_complement()
+
+        if (self.src_split):
+            spec1,chr1 = src_split( c1.src )
+            spec2,chr2 = src_split( c2.src )
+        else:
+            chr1,chr2 = c1.src,c2.src
+
+        self.file.write( "%d %s %d %d %s %d %d %s %s\n" % \
+              (self.block,chr1,c1.start+1,c1.start+c1.size,
+               chr2,c2.start+1,c2.start+c2.size,c2.strand,
+               alignment.score))
+        self.file.write( "%s\n" % c1.text )
+        self.file.write( "%s\n" % c2.text )
+        self.file.write( "\n" )
+        self.block += 1
+
+    def close( self ):
+        self.file.close()
+
+# ---- Helper methods ---------------------------------------------------------
+
+# typical axt block:
+#   0 chr19 3001012 3001075 chr11 70568380 70568443 - 3500 [optional text]
+#   TCAGCTCATAAATCACCTCCTGCCACAAGCCTGGCCTGGTCCCAGGAGAGTGTCCAGGCTCAGA
+#   TCTGTTCATAAACCACCTGCCATGACAAGCCTGGCCTGTTCCCAAGACAATGTCCAGGCTCAGA
+# start and stop are origin-1, inclusive
+# first species is always on plus strand
+# when second species is on minus strand, start and stop are counted from sequence end
+
+def read_next_axt( file, species1, species2, species_to_lengths=None, support_ids=False ):
+    line = readline( file, skip_blank=True )
+    if not line: return
+    fields = line.split()
+    if (len(fields) < 9) or ((not support_ids) and (len(fields) > 9)):
+        raise "bad axt-block header: %s" % line
+    attributes = {}
+    if (len(fields) > 9):
+        attributes["id"] = "_".join(fields[9:])
+    seq1 = readline( file )
+    if not line or line.isspace(): raise "incomplete axt-block; header: %s" % line
+    seq2 = readline( file )
+    if not line or line.isspace(): raise "incomplete axt-block; header: %s" % line
+    # Build 2 component alignment
+    alignment = Alignment(attributes=attributes,species_to_lengths=species_to_lengths)
+    # Build component for species 1
+    component = Component()
+    component.src = fields[1]
+    if (species1 != ""): component.src = species1 + "." + component.src
+    component.start = int( fields[2] ) - 1    # (axt intervals are origin-1
+    end = int( fields[3] )                    #  and inclusive on both ends)
+    component.size = end - component.start
+    component.strand = "+"
+    component.text = seq1.strip()
+    alignment.add_component( component )
+    # Build component for species 2
+    component = Component()
+    component.src = fields[4]
+    if (species2 != ""): component.src = species2 + "." + component.src
+    component.start = int( fields[5] ) - 1
+    end = int( fields[6] )
+    component.size = end - component.start
+    component.strand = fields[7]
+    component.text = seq2.strip()
+    alignment.add_component( component )
+    # add score
+    try:
+        alignment.score = int( fields[8] )
+    except:
+        try:
+            alignment.score = float( fields[8] )
+        except:
+            alignment.score = fields[8]
+    return alignment
+
+def readline( file, skip_blank=False ):
+    """Read a line from provided file, skipping any blank or comment lines"""
+    while 1:
+        line = file.readline()
+        if not line: return None
+        if line[0] != '#' and not ( skip_blank and line.isspace() ):
+            return line
+
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/align/score_tests.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/align/score_tests.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/align/score_tests.py (revision 3)
@@ -0,0 +1,94 @@
+"""
+Tests for `bx.align.score`.
+"""
+
+import bx.align.score
+import bx.align.maf
+import StringIO
+import unittest
+import sys
+
+from numpy import array, cumsum, allclose
+
+aligns = [ ( "CCACTAGTTTTTAAATAATCTACTATCAAATAAAAGATTTGTTAATAATAAATTTTAAATCATTAACACTT",
+             "CCATTTGGGTTCAAAAATTGATCTATCA----------TGGTGGATTATTATTTAGCCATTAAGGACAAAT", 
+             -111 ),
+           ( "CCACTAGTTTTTAAATAATCTAC-----AATAAAAGATTTGTTAATAAT---AAATTTTAAATCATTAA-----CACTT",
+             "CCATTTGGGTTCAAAAATTGATCTATCA----------TGGTGGAT---TATTATTT-----AGCCATTAAGGACAAAT", 
+             -3626 ),
+           ( "CCACTAGTTTTTGATTC",
+             "CCATTTGGGTTC-----", 
+             -299 ),
+           ( "CTTAGTTTTTGATCACC",
+             "-----CTTGGGTTTACC", 
+             -299 ),
+           ( "gggaattgaacaatgagaacacatggacacaggaaggggaacatcacacacc----------ggggcctgttgtggggtggggggaag",
+             "ggaactagaacaagggagacacatacaaacaacaacaacaacaacacagcccttcccttcaaagagcttatagtctgatggaggagag",
+             1690 )
+         ]
+
+mafs = """##maf
+a score=2883.0
+s hg17.chr1             6734 30 + 245522847 CTACCTCAGTGTGGAAGGTGGGCAGTTCTG
+s rheMac1.SCAFFOLD71394 9319 30 -     13789 CTACCTCAGTGTGGAAGGTGGGCAGTTCTG
+
+a score=8167.0
+s hg17.chr1             41401 40 + 245522847 TGTGTGATTAATGCCTGAGACTGTGTGAAGTAAGAGATGG
+s panTro1.chr1          49673 40 + 229575298 TGCGTGATTAATGCCTGAGATTGTGTGAAGTAAAAGATGG
+s rheMac1.SCAFFOLD45837 26063 33 -     31516 TGTGTGATTAATGCCTGAGATTGTGTGAAGTAA-------
+"""
+
+nonsymm_scheme = bx.align.score.build_scoring_scheme ( """  A    C    G    T
+                                                           91    0  -31 -123
+                                                         -114  100 -125  -31
+                                                          -31 -125  100 -114
+                                                         -123  -31 -114   91 """, 400, 30 )
+
+aligns_for_nonsymm_scheme = [ ( "AAAACCCCGGGGTTTT",
+                                "ACGTACGTACGTACGT", 
+                                -580 )
+                            ]
+
+
+asymm_scheme = bx.align.score.build_scoring_scheme ( """    01   02    A    C    G    T
+                                                       01  200 -200  -50  100  -50  100
+                                                       02 -200  200  100  -50  100  -50 """,
+                                                       0, 0, gap1='\x00' )
+
+aligns_for_asymm_scheme = [ ( "\x01\x01\x01\x01\x01\x01",
+                              "ACGT\x01\x02", 
+                              100 )
+                          ]
+
+
+class BasicTests( unittest.TestCase ):
+
+    def test_scoring_text( self ):
+        ss = bx.align.score.hox70
+        for t1, t2, score in aligns:
+            self.assertEquals( bx.align.score.score_texts( ss, t1, t2 ), score )
+            
+    def test_align( self ):
+        ss = bx.align.score.hox70
+        for block in bx.align.maf.Reader( StringIO.StringIO( mafs ) ):
+            self.assertEquals( bx.align.score.score_alignment( ss, block ), float( block.score ) )
+            
+    def test_accumulate( self ):
+        ss = bx.align.score.hox70
+        self.assert_( allclose( bx.align.score.accumulate_scores( ss, "-----CTTT", "CTTAGTTTA"  ),
+                           cumsum( array( [ -430, -30, -30, -30, -30, -31, 91, 91, -123 ] ) ) ) )
+        self.assert_( allclose( bx.align.score.accumulate_scores( ss, "-----CTTT", "CTTAGTTTA", skip_ref_gaps=True ),
+                           cumsum( array( [ -581, 91, 91, -123 ] ) ) ) )
+
+    def test_nonsymm_scoring( self ):
+        ss = nonsymm_scheme
+        for t1, t2, score in aligns_for_nonsymm_scheme:
+            self.assertEquals( bx.align.score.score_texts( ss, t1, t2 ), score )
+
+    def test_asymm_scoring( self ):
+        ss = asymm_scheme
+        for t1, t2, score in aligns_for_asymm_scheme:
+            self.assertEquals( bx.align.score.score_texts( ss, t1, t2 ), score )
+   
+test_classes = [ BasicTests ]
+suite = unittest.TestSuite( [ unittest.makeSuite( c ) for c in test_classes ] )
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/align/__init__.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/align/__init__.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/align/__init__.py (revision 3)
@@ -0,0 +1,7 @@
+"""
+Support for dealing with (genome scale) sequence alignments. See `core` for
+the abstract alignment classes and `maf`, `axt`, and `lav` for readers and
+writers in various formats.
+"""
+
+from bx.align.core import *
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/align/lav.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/align/lav.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/align/lav.py (revision 3)
@@ -0,0 +1,571 @@
+"""
+Support for reading and writing the LAV format produced by the `blastz`_
+pairwise aligner. 
+
+.. _blastz: http://www.bx.psu.edu/miller_lab/
+"""
+
+from bx.align import *
+import bx.seq
+
+import sys,math,StringIO
+import itertools
+from bx import interval_index_file
+
+class Reader(object):
+	"""Iterate over all lav blocks in a file in order"""
+
+	def __init__(self,file,path_subs=None,fail_to_ns=False):
+		self.file = file
+		self.lineNumber = 0
+		self.path_subs  = path_subs   # list of (prefix,replacement) to allow
+		if (self.path_subs == None):  # .. redirection of sequence file paths
+			self.path_subs = []       # .. on different machines
+		self.fail_to_ns = fail_to_ns  # True => if sequences fail to open,
+		                              #         create a fake file of all Ns
+
+		self.d_stanza_text = None
+
+		self.seq1_filename = None
+		self.seq1_file     = None
+		self.seq1_header   = None
+		self.seq1_start    = None
+		self.seq1_end      = None
+		self.seq1_strand   = None
+		self.seq1_contig   = None
+		self.seq1_src      = None
+		self.seq1_gap      = None
+
+		self.seq2_filename = None
+		self.seq2_file     = None
+		self.seq2_header   = None
+		self.seq2_start    = None
+		self.seq2_end      = None
+		self.seq2_strand   = None
+		self.seq2_contig   = None
+		self.seq2_src      = None
+		self.seq2_gap      = None
+
+	def next(self):
+		while (True):
+			line = self.fetch_line(strip=None,requireLine=False)
+			assert (line), "unexpected end of file (missing #:eof)"
+			line = line.rstrip()
+			if (line == ""):	# (allow blank lines between stanzas)
+				continue
+			if (line == "#:eof"):
+				line = self.file.readline().rstrip()
+				assert (not line), "extra line after #:eof (line %d, \"%s\")" \
+				                 % (self.lineNumber,line)
+				return None
+			if (line == "#:lav"):
+				continue
+			if (line.startswith("d {")):
+				self.d_stanza_text = self.parse_unknown_stanza()
+				continue
+			if (line.startswith("s {")):
+				self.parse_s_stanza()
+				continue
+			if (line.startswith("h {")):
+				self.parse_h_stanza()
+				continue
+			if (line.startswith("a {")):
+				(score,pieces) = self.parse_a_stanza()
+				break
+			if (line.endswith("{")):
+				self.parse_unknown_stanza()
+				continue
+			assert (False), "incomprehensible line (line %d, \"%s\")" \
+			              % (self.lineNumber,line)
+		return self.build_alignment(score,pieces)
+
+	def __iter__(self):
+		return ReaderIter(self)
+
+	def close(self):
+		self.file.close()
+
+	def open_seqs(self):
+		if (self.seq1_file != None) and (self.seq2_file != None):
+			return
+
+		if (self.seq1_file == None):
+			if (self.seq1_strand == "+"): revcomp = False
+			else:                         revcomp = "-5'"
+			if (self.seq1_contig == 1): contig = None
+			else:                       contig = self.seq1_contig
+			try:
+				f = file(self.seq1_filename,"rb")
+			except:
+				if (self.fail_to_ns):
+					f = StringIO.StringIO(">seq1\n" + ("n" * (self.seq1_end - self.seq1_start)))
+					revcomp = False
+					contig  = 1
+				else:
+					assert (False), "failed to open %s" % self.seq1_filename
+			self.seq1_file = bx.seq.seq_file(f,revcomp=revcomp,contig=contig)
+			self.seq1_gap  = self.seq1_file.gap
+			try:
+				name1 = self.header_to_src_name(self.seq1_header)
+			except ValueError:
+				try:
+					name1 = self.path_to_src_name(self.seq1_filename)
+				except ValueError:
+					name1 = "seq1"
+			(species1,chrom1) = src_split(name1)
+			self.seq1_src = src_merge(species1,chrom1,contig)
+			if (contig != None): chrom1 += "[%s]" % contig
+
+		if (self.seq2_file == None):
+			if (self.seq2_strand == "+"): revcomp = False
+			else:                         revcomp = "-5'"
+			if (self.seq2_contig == 1): contig = None
+			else:                       contig = self.seq2_contig
+			try:
+				f = file(self.seq2_filename,"rb")
+			except:
+				if (self.fail_to_ns):
+					f = StringIO.StringIO(">seq2\n" + ("n" * (self.seq2_end - self.seq2_start)))
+					revcomp = False
+					contig  = 1
+				else:
+					assert (False), "failed to open %s" % self.seq1_filename
+			self.seq2_file = bx.seq.seq_file(f,revcomp=revcomp,contig=contig)
+			self.seq2_gap  = self.seq2_file.gap
+			try:
+				name2 = self.header_to_src_name(self.seq2_header)
+			except ValueError:
+				try:
+					name2 = self.path_to_src_name(self.seq2_filename)
+				except ValueError:
+					name2 = "seq2"
+			(species2,chrom2) = src_split(name2)
+			self.seq2_src = src_merge(species2,chrom2,contig)
+			if (contig != None): chrom2 += "[%s]" % contig
+
+		length1 = self.seq1_file.length
+		length2 = self.seq2_file.length
+		assert (species1 != species2) or (chrom1 != chrom2) or (length1 == length2), \
+		       "conflicting lengths for %s (%d and %d)" % (self.seq1_src,length1,length2)
+
+		self.species_to_lengths = {}
+		self.species_to_lengths[species1] = {}
+		self.species_to_lengths[species2] = {}  # (OK if it clobbers line above)
+		self.species_to_lengths[species1][chrom1] = self.seq1_file.length
+		self.species_to_lengths[species2][chrom2] = self.seq2_file.length
+
+	def close_seqs(self):
+		if (self.seq1_file != None):
+			self.seq1_file.close()
+			self.seq1_file = None
+		if (self.seq2_file != None):
+			self.seq2_file.close()
+			self.seq2_file = None
+
+	def parse_s_stanza(self):
+		self.close_seqs()
+		line = self.fetch_line(report=" in s-stanza")
+		(self.seq1_filename,
+		 self.seq1_start,
+		 self.seq1_end,
+		 self.seq1_strand,
+		 self.seq1_contig) = self.parse_s_seq(line)
+
+		line = self.fetch_line(report=" in s-stanza")
+		(self.seq2_filename,
+		 self.seq2_start,
+		 self.seq2_end,
+		 self.seq2_strand,
+		 self.seq2_contig) = self.parse_s_seq(line)
+
+		line = self.fetch_line(report=" in s-stanza")
+		assert (line == "}"), "improper s-stanza terminator (line %d, \"%s\")" \
+							% (self.lineNumber,line)
+
+	def parse_s_seq(self,line):
+		fields = line.split()
+		filename = fields[0].strip('"')
+		start    = int(fields[1]) - 1
+		end      = int(fields[2])
+		contig   = int(fields[4])
+		if (fields[3] == "1"): strand = "-"
+		else:                  strand = "+"
+		if (filename.endswith("-")):
+			assert (strand == "-"), "strand mismatch in \"%s\"" % line
+			filename = filename[:-1]
+		filename = do_path_subs(filename,self.path_subs)
+		return (filename,start,end,strand,contig)
+
+
+	def parse_h_stanza(self):
+		line = self.fetch_line(strip='"',report=" in h-stanza")
+		self.seq1_header = line
+		self.seq1_header_prefix = ""
+		if (line.startswith(">")):
+			self.seq1_header = line[1:].strip()
+			self.seq1_header_prefix = ">"
+		self.seq1_header = self.seq1_header.split(None,1)
+		if (len(self.seq1_header) > 0): self.seq1_header = self.seq1_header[0]
+		else:                           self.seq1_header = "seq1"
+
+		line = self.fetch_line(strip='"',report=" in h-stanza")
+		self.seq2_header = line
+		self.seq2_header_prefix = ""
+		if (line.startswith(">")):
+			self.seq2_header = line[1:].strip()
+			self.seq2_header_prefix = ">"
+		self.seq2_header = self.seq2_header.split(None,1)
+		if (len(self.seq2_header) > 0): self.seq2_header = self.seq2_header[0]
+		else:                           self.seq2_header = "seq2"
+
+		line = self.fetch_line(report=" in h-stanza")
+		assert (line == "}"), "improper h-stanza terminator (line %d, \"%s\")" \
+							% (self.lineNumber,line)
+
+
+	def parse_a_stanza(self):
+		"""returns the pair (score,pieces)
+		   where pieces is a list of ungapped segments (start1,start2,length,pctId)
+		   with start1,start2 origin-0"""
+		# 's' line -- score, 1 field
+		line = self.fetch_line(report=" in a-stanza")
+		fields = line.split()
+		assert (fields[0] == "s"), "s line expected in a-stanza (line %d, \"%s\")" \
+								 % (self.lineNumber,line)
+		try:    score = int(fields[1])
+		except: score = float(fields[1])
+
+		# 'b' line -- begin positions in seqs, 2 fields
+		line = self.fetch_line(report=" in a-stanza")
+		fields = line.split()
+		assert (fields[0] == "b"), "b line expected in a-stanza (line %d, \"%s\")" \
+								 % (self.lineNumber,line)
+		beg1 = int(fields[1]) - 1
+		beg2 = int(fields[2]) - 1
+
+		# 'e' line -- end positions in seqs, 2 fields
+		line = self.fetch_line(report=" in a-stanza")
+		fields = line.split()
+		assert (fields[0] == "e"), "e line expected in a-stanza (line %d, \"%s\")" \
+								 % (self.lineNumber,line)
+		len1 = int(fields[1]) - beg1
+		len2 = int(fields[2]) - beg2
+
+		# 'l' lines
+		pieces = []
+		while (True):
+			line = self.fetch_line(report=" in a-stanza")
+			fields = line.split()
+			if (fields[0] != "l"):
+				break
+			start1  = int(fields[1]) - 1
+			start2  = int(fields[2]) - 1
+			length  = int(fields[3]) - start1
+			length2 = int(fields[4]) - start2
+			try:    pctId = int(fields[5])
+			except: pctId = float(fields[5])
+			assert (length2 == length), "length mismatch in a-stanza"
+			pieces.append((start1+self.seq1_start,start2+self.seq2_start,length,pctId))
+		assert (line == "}"), "improper a-stanza terminator (line %d, \"%s\")" \
+							% (self.lineNumber,line)
+		return (score,pieces)
+
+	def parse_unknown_stanza(self):
+		lines = []
+		while (True):
+			line = self.fetch_line()
+			assert (line), "unexpected end of file (missing #:eof)"
+			if (line == "}"): break
+			lines.append(line)
+		return "  " + "\n  ".join(lines) + "\n"
+
+	def fetch_line(self,strip=True,requireLine=True,report=""):
+		if   (strip == None): line = self.file.readline()
+		elif (strip == True): line = self.file.readline().strip()
+		else:                 line = self.file.readline().strip().strip(strip)
+		self.lineNumber += 1
+		if (requireLine):
+			assert (line), \
+			       "unexpected blank line or end of file%s (line %d)" \
+			     % (report,self.lineNumber)
+		return line
+
+
+	def d_stanza(self):
+		if (self.d_stanza_text == None): return ""
+		return "d {\n%s}" % self.d_stanza_text
+
+	def s_stanza(self):
+		if (self.seq1_filename == None): return ""
+
+		if (self.seq1_strand == "-"): seq1_strand = "1"
+		else:                         seq1_strand = "0"
+		if (self.seq2_strand == "-"): seq2_strand = "1"
+		else:                         seq2_strand = "0"
+
+		s =  "  \"%s\" %d %d %s %d\n"\
+		   % (self.seq1_filename,self.seq2_start+1,self.seq1_end,
+			  seq1_strand,self.seq1_contig)
+		s += "  \"%s\" %d %d %s %d\n"\
+		   % (self.seq2_filename,self.seq2_start+1,self.seq2_end,
+			  seq2_strand,self.seq2_contig)
+
+		return "s {\n%s}" % s
+
+	def h_stanza(self):
+		if (self.seq1_header == None): return ""
+		s =  "  \"%s%s\"\n" % (self.seq1_header_prefix,self.seq1_header)
+		s += "  \"%s%s\"\n" % (self.seq2_header_prefix,self.seq2_header)
+		return "h {\n%s}" % s
+
+	def build_alignment(self,score,pieces):
+		"""converts a score and pieces to an alignment"""
+	 	# build text
+		self.open_seqs()
+		text1 = text2 = ""
+		end1  = end2  = None
+		for (start1,start2,length,pctId) in pieces:
+			if (end1 != None):
+				if (start1 == end1): # insertion in sequence 2
+					text1 += self.seq1_gap * (start2-end2)
+					text2 += self.seq2_file.get(end2,start2-end2)
+				else: # insertion in sequence 1
+					text1 += self.seq1_file.get(end1,start1-end1)
+					text2 += self.seq2_gap * (start1-end1)
+
+			text1 += self.seq1_file.get(start1,length)
+			text2 += self.seq2_file.get(start2,length)
+			end1 = start1 + length
+			end2 = start2 + length
+		# create alignment
+		start1 = pieces[0][0]
+		start2 = pieces[0][1]
+		end1   = pieces[-1][0] + pieces[-1][2]
+		end2   = pieces[-1][1] + pieces[-1][2]
+		size1  = end1 - start1
+		size2  = end2 - start2
+		a = Alignment(score=score,species_to_lengths=self.species_to_lengths)
+		#if (self.seq1_strand == "-"): start1 = self.seq1_file.length - end1
+		a.add_component(Component(self.seq1_src,start1,size1,self.seq1_strand,text=text1))
+		#if (self.seq2_strand == "-"): start2 = self.seq2_file.length - end2
+		a.add_component(Component(self.seq2_src,start2,size2,self.seq2_strand,text=text2))
+		return a
+
+	def path_to_src_name(self,path_name):
+		# converts, e.g. ".../hg18/seq/chr13.nib" to "hg18.chr13"
+		if (path_name == None) or (path_name == ""): raise ValueError
+		if (path_name.endswith(".nib")):   path_name = path_name[:-4]
+		if (path_name.endswith(".fa")):    path_name = path_name[:-3]
+		if (path_name.endswith(".fasta")): path_name = path_name[:-6]
+		slash = path_name.rfind("/")
+		if (slash == -1): return path_name
+		name      = path_name[slash+1:]
+		path_name = path_name[:slash]
+		if (path_name.endswith("/seq")):   path_name = path_name[:-4]
+		slash = path_name.rfind("/")
+		if (slash != -1): path_name = path_name[slash+1:]
+		return path_name + "." + name
+
+	def header_to_src_name(self,header):
+		# converts, e.g. "hg18.chr13:115404472-117281897" to "hg18.chr13"
+		if (header == None) or (header == ""): raise ValueError
+		colon = header.rfind(":")
+		if (colon != -1): header = header[:colon]
+		if ("/" in header): raise ValueError
+		if (header.count(".") == 0):
+			return header
+		header = header.split(".")
+		if (header[0] == "") or (header[1] == ""): raise ValueError
+		return ".".join(header)
+
+class ReaderIter(object):
+	def __init__(self,reader):
+		self.reader = reader
+	def __iter__(self):
+		return self
+	def next(self):
+		v = self.reader.next()
+		if (not v): raise StopIteration
+		return v
+
+
+class LavAsPiecesReader(Reader):
+	"""Iterate over all lav blocks in a file in order, returning alignments
+	   as score and pieces, as returned by Reader.parse_a_stanza"""
+
+	def build_alignment(self,score,pieces):
+		return (score,pieces)
+
+
+class Writer(object):
+
+	# blockHash is a hash from (src1,strand1,src2,strand2) to a list of blocks;
+	# the blocks are collected on each call to write(), but the actual writing
+	# does not occur until close().
+
+	def __init__(self,file,attributes={}):
+		self.file   = file
+		self.fname1 = None
+		self.fname2 = None
+		self.block  = 0
+		self.blockHash = {}  #  (see note above)
+
+		if ("name_format_1" in attributes):
+			self.fname1 = attributes["name_format_1"]
+		if ("name_format_2" in attributes):
+			self.fname2 = attributes["name_format_2"]
+
+		if ("d_stanza" in attributes):
+			write_lav_marker(self)
+			print >>self.file,"d {"
+			print >>self.file,attributes["d_stanza"]
+			print >>self.file,"}"
+
+	def write(self,alignment):
+		if (len(alignment.components) != 2):
+			raise "%d-component alignment is not compatible with lav" % \
+				   len(alignment.components)
+
+		c1 = alignment.components[0]
+		c2 = alignment.components[1]
+
+		key = (c1.src,c1.strand,c2.src,c2.strand)
+		if (key not in self.blockHash): self.blockHash[key] = []
+		self.blockHash[key].append(alignment)
+		self.block += 1
+
+	def close(self):
+		keys = [key for key in self.blockHash]
+		keys = sort_keys_by_chrom (keys)
+		for key in keys:
+			(src1,strand1,src2,strand2) = key
+			alignment    = self.blockHash[key][0]
+			self.src1    = src1
+			self.strand1 = strand1
+			self.length1 = alignment.src_size(src1)
+			self.src2    = src2
+			self.strand2 = strand2
+			self.length2 = alignment.src_size(src2)
+			self.write_s_stanza()
+			self.write_h_stanza()
+			for alignment in self.blockHash[key]:
+				self.write_a_stanza(alignment)
+		self.write_trailer()
+		if (self.file != sys.stdout): self.file.close()
+
+	def write_s_stanza(self):
+		self.write_lav_marker()
+		(strand1,flag1) = minus_or_nothing(self.strand1)
+		(strand2,flag2) = minus_or_nothing(self.strand2)
+		fname1 = build_filename(self.fname1,self.src1)
+		fname2 = build_filename(self.fname2,self.src2)
+		print >>self.file,"s {"
+		print >>self.file,"  \"%s%s\" 1 %d %d 1" \
+		                % (fname1,strand1,self.length1,flag1)
+		print >>self.file,"  \"%s%s\" 1 %d %d 1" \
+		                % (fname2,strand2,self.length2,flag2)
+		print >>self.file,"}"
+
+	def write_h_stanza(self):
+		strand1 = rc_or_nothing(self.strand1)
+		strand2 = rc_or_nothing(self.strand2)
+		print >>self.file,"h {"
+		print >>self.file,"  \"> %s%s\"" % (self.src1,strand1)
+		print >>self.file,"  \"> %s%s\"" % (self.src2,strand2)
+		print >>self.file,"}"
+
+	def write_a_stanza(self,alignment):
+		c1 = alignment.components[0]
+		pos1  = c1.start
+		text1 = c1.text.upper()
+		c2 = alignment.components[1]
+		pos2  = c2.start
+		text2 = c2.text.upper()
+
+		# collect ungapped pieces
+
+		pieces = []
+		piece1 = None
+
+		for ix in range(len(text1)):
+			ch1 = text1[ix]
+			ch2 = text2[ix]
+
+			nonGap = (ch1 != "-") and (ch2 != "-")
+			if (nonGap):
+				if (piece1 == None): # new piece starts
+					(piece1,piece2,idCount) = (pos1,pos2,0)
+				if (ch1 == ch2): idCount += 1
+			elif (piece1 != None): # new gap starts
+				size  = pos1 - piece1
+				pctId = (200*idCount + size) / (2*size)
+				pieces.append((piece1,piece2,size,pctId))
+				piece1 = None
+
+			if (ch1 != "-"): pos1 += 1
+			if (ch2 != "-"): pos2 += 1
+
+		if (piece1 != None):
+			size  = pos1 - piece1
+			pctId = (200*idCount + size) / (2*size)
+			pieces.append((piece1,piece2,size,pctId))
+
+		# write the block
+
+		(start1,start2,size,pctId) = pieces[-1]  # get end of final piece
+		end1 = start1 + size
+		end2 = start2 + size
+
+		(start1,start2,size,pctId) = pieces[0]   # get start of first piece
+
+		score = int(round(alignment.score))
+
+		print >>self.file,"a {"
+		print >>self.file,"  s %s"    % score
+		print >>self.file,"  b %d %d" % (start1+1,start2+1)
+		print >>self.file,"  e %d %d" % (end1,    end2)
+		for (start1,start2,size,pctId) in pieces:
+			print >>self.file,"  l %d %d %d %d %d" \
+							% (start1+1,start2+1,start1+size,start2+size,pctId)
+		print >>self.file,"}"
+
+	def write_lav_marker(self):
+		print >>self.file,"#:lav"
+
+	def write_trailer(self):
+		print >>self.file,"#:eof"
+
+def	sort_keys_by_chrom (keys):
+	decorated = [(chrom_key(src1),strand1,chrom_key(src2),strand2,(src1,strand1,src2,strand2)) \
+	             for (src1,strand1,src2,strand2) in keys]
+	decorated.sort()
+	return [key for (src1,strand1,src2,strand2,key) in decorated]
+
+def	chrom_key (src):
+	(species,chrom) = src_split(src)
+	if (chrom.startswith("chr")): chrom = chrom[3:]
+	try:                          chrom = int(chrom)
+	except ValueError: pass
+	return chrom
+
+def build_filename(fmt,src):
+	if (fmt == None): return src
+	num = fmt.count("%s")
+	if (num == 0): return fmt
+	(species,chrom) = src_split(src)
+	if (num == 1): return fmt % chrom
+	return fmt % (species,chrom)
+
+def minus_or_nothing(strand):
+	if (strand == "-"): return ("-",1)
+	else:               return ("",0)
+
+def rc_or_nothing(strand):
+	if (strand == "-"): return " (reverse complement)"
+	else:               return ""
+
+def do_path_subs(path,path_subs):
+	for (prefix,replacement) in path_subs:
+		if (path.startswith(prefix)):
+			return replacement + path[len(prefix):]
+	return path
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/align/maf.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/align/maf.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/align/maf.py (revision 3)
@@ -0,0 +1,231 @@
+"""
+Support for the `MAF`_ multiple sequence alignment format used by `multiz`_.
+
+.. _MAF: http://genome.ucsc.edu/FAQ/FAQformat.html#format5
+.. _multiz: http://www.bx.psu.edu/miller_lab/
+"""
+
+from bx.align import *
+
+from StringIO import StringIO
+import os
+
+import itertools
+from bx import interval_index_file
+
+from bx.misc.seekbzip2 import SeekableBzip2File
+
+MAF_INVERSE_STATUS = 'V'
+MAF_INSERT_STATUS = 'I'
+MAF_CONTIG_STATUS = 'C'
+MAF_CONTIG_NESTED_STATUS = 'c'
+MAF_NEW_STATUS = 'N'
+MAF_NEW_NESTED_STATUS = 'n'
+MAF_MAYBE_NEW_STATUS = 'S'
+MAF_MAYBE_NEW_NESTED_STATUS = 's'
+MAF_MISSING_STATUS = 'M'
+
+class MAFIndexedAccess( interval_index_file.AbstractIndexedAccess ):
+    """
+    Indexed access to a MAF file.
+    """
+    def read_at_current_offset( self, file, **kwargs ):
+        """
+        Read the MAF block at the current position in `file` and return an
+        instance of `Alignment`.
+        """
+        return read_next_maf( file, **kwargs )
+
+class MAFMultiIndexedAccess( interval_index_file.AbstractMultiIndexedAccess ):
+    """
+    Indexed access to multiple MAF files.
+    """
+    indexed_access_class = MAFIndexedAccess
+      
+Indexed = MAFIndexedAccess
+"""Deprecated: `MAFIndexedAccess` is also available under the name `Indexed`."""
+
+MultiIndexed = MAFMultiIndexedAccess
+"""Deprecated: `MAFMultiIndexedAccess` is also available under the name `MultiIndexed`."""
+
+class Reader( object ):
+    """
+    Iterate over all maf blocks in a file in order
+    """
+    def __init__( self, file, **kwargs ):
+        self.file = file
+        self.maf_kwargs = kwargs
+        # Read and verify maf header, store any attributes
+        fields = self.file.readline().split()
+        if fields[0] != '##maf': raise "File does not have MAF header"
+        self.attributes = parse_attributes( fields[1:] )
+
+    def next( self ):
+        return read_next_maf( self.file, **self.maf_kwargs )
+
+    def __iter__( self ):
+        return ReaderIter( self )
+
+    def close( self ):
+        self.file.close()
+
+class ReaderIter( object ):
+    """
+    Adapts a `Reader` to the iterator protocol.
+    """
+    def __init__( self, reader ):
+        self.reader = reader
+    def __iter__( self ): 
+        return self
+    def next( self ):
+        v = self.reader.next()
+        if not v: raise StopIteration
+        return v
+
+class Writer( object ):
+
+    def __init__( self, file, attributes={} ):
+        self.file = file
+        # Write header, Webb's maf code wants version first, we accomodate
+        if not attributes.has_key('version'): attributes['version'] = 1
+        self.file.write( "##maf version=%s" % attributes['version'] )
+        for key in attributes: 
+            if key == 'version': continue
+            self.file.writelines( " %s=%s" % ( key, attributes[key] ) )
+        self.file.write( "\n" )
+
+    def write( self, alignment ):
+        self.file.write( "a score=" + str( alignment.score ) )
+        for key in alignment.attributes:
+            self.file.write( " %s=%s" % ( key, alignment.attributes[key] ) )
+        self.file.write( "\n" )
+        # Components
+        rows = []
+        for c in alignment.components:
+            # "Empty component" generates an 'e' row
+            if c.empty:
+                rows.append( ( "e", c.src, str( c.start ), str( c.size ), c.strand, str( c.src_size ), c.synteny_empty ) )
+                continue
+            # Regular component
+            rows.append( ( "s", c.src, str( c.start ), str( c.size ), c.strand, str( c.src_size ), c.text ) )
+            # If component has quality, write a q row
+            if c.quality is not None:
+                rows.append( ( "q", c.src, "", "", "", "", c.quality ) )
+            # If component has synteny follow up with an 'i' row
+            if c.synteny_left and c.synteny_right:
+                rows.append( ( "i", c.src, "", "", "", "", " ".join( map( str, c.synteny_left + c.synteny_right ) ) ) )
+        self.file.write( format_tabular( rows, "llrrrrl" ) )
+        self.file.write( "\n" )
+
+    def close( self ):
+        self.file.close()
+
+# ---- Helper methods -------------------------------------------------------
+
+def from_string( string, **kwargs ):
+    return read_next_maf( StringIO( string ), **kwargs )
+
+def read_next_maf( file, species_to_lengths=None, parse_e_rows=False ):
+    """
+    Read the next MAF block from `file` and return as an `Alignment` 
+    instance. If `parse_i_rows` is true, empty components will be created 
+    when e rows are encountered.
+    """
+    alignment = Alignment(species_to_lengths=species_to_lengths)
+    # Attributes line
+    line = readline( file, skip_blank=True )
+    if not line: return None
+    fields = line.split() 
+    if fields[0] != 'a': raise "Expected 'a ...' line"
+    alignment.attributes = parse_attributes( fields[1:] )
+    if 'score' in alignment.attributes:
+        alignment.score = alignment.attributes['score']
+        del alignment.attributes['score']
+    else:
+        alignment.score = 0
+    # Sequence lines
+    last_component = None
+    while 1:
+        line = readline( file )
+        # EOF or Blank line terminates alignment components
+        if not line or line.isspace(): break
+        if line.isspace(): break 
+        # Parse row
+        fields = line.split()
+        if fields[0] == 's':
+            # An 's' row contains sequence for a component
+            component = Component()
+            component.src = fields[1]
+            component.start = int( fields[2] )
+            component.size = int( fields[3] )
+            component.strand = fields[4]
+            component.src_size = int( fields[5] )
+            if len(fields) > 6: component.text = fields[6].strip()
+            # Add to set
+            alignment.add_component( component )
+            last_component = component
+        elif fields[0] == 'e':
+            # An 'e' row, when no bases align for a given species this tells
+            # us something about the synteny 
+            if parse_e_rows:
+                component = Component()
+                component.empty = True
+                component.src = fields[1]
+                component.start = int( fields[2] )
+                component.size = int( fields[3] )
+                component.strand = fields[4]
+                component.src_size = int( fields[5] )
+                component.text = None
+                synteny = fields[6].strip()
+                assert len( synteny ) == 1, \
+                    "Synteny status in 'e' rows should be denoted with a single character code"
+                component.synteny_empty = synteny
+                alignment.add_component( component )
+                last_component = component
+        elif fields[0] == 'i':
+            # An 'i' row, indicates left and right synteny status for the 
+            # previous component, we hope ;)
+            assert fields[1] == last_component.src, "'i' row does not follow matching 's' row"
+            last_component.synteny_left = ( fields[2], int( fields[3] ) )
+            last_component.synteny_right = ( fields[4], int( fields[5] ) )
+        elif fields[0] == 'q':
+            assert fields[1] == last_component.src, "'q' row does not follow matching 's' row"
+            # TODO: Should convert this to an integer array?
+            last_component.quality = fields[2]
+            
+    return alignment
+
+def readline( file, skip_blank=False ):
+    """Read a line from provided file, skipping any blank or comment lines"""
+    while 1:
+        line = file.readline()
+        #print "every line: %r" % line
+        if not line: return None 
+        if line[0] != '#' and not ( skip_blank and line.isspace() ):
+            return line
+
+def parse_attributes( fields ):
+    """Parse list of key=value strings into a dict"""
+    attributes = {}
+    for field in fields:
+        pair = field.split( '=' )
+        attributes[ pair[0] ] = pair[1]
+    return attributes
+
+def format_tabular( rows, align=None ):
+    if len( rows ) == 0: return ""
+    lengths = [ len( col ) for col in rows[ 0 ] ]
+    for row in rows[1:]:
+        for i in range( 0, len( row ) ):
+            lengths[ i ] = max( lengths[ i ], len( row[ i ] ) )
+    rval = ""
+    for row in rows:
+        for i in range( 0, len( row ) ):
+            if align and align[ i ] == "l":
+                rval += row[ i ].ljust( lengths[ i ] )
+            else:
+                rval += row[ i ].rjust( lengths[ i ] )
+            rval += " "
+        rval += "\n"
+    return rval
+        
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/align/lav_tests.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/align/lav_tests.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/align/lav_tests.py (revision 3)
@@ -0,0 +1,45 @@
+"""
+Tests for `bx.align.lav`.
+"""
+
+import unittest
+import sys
+import bx.align as align
+import bx.align.lav as lav
+
+test_lav = "test_data/lav_tests/apple_orange.lav"
+
+class lavTestCase(unittest.TestCase):
+
+    def testReader(self):
+
+        reader = lav.Reader(file(test_lav))
+
+        a = reader.next()
+        assert a.score == 10286, "a.score is wrong: %s" % a.score
+        assert len(a.components) == 2
+        check_component(a.components[0], "apple",            106, 252, "+", 411, "GTCCGGCCGGCTGAGAGCTACAATACACATGCACGCAGTTTGGCCACTCACATTAAGTATATGAGGAAGGGTTAGCATGAGTTGTACTATAAGGCAGCGGATAGCAGGTTGTGGAAAAATATCCTCCCGATTCAAATCCCCAGGTGCCTAAA----------------GTAGGGCCGGTAGTTGAATGCTTGCCTGTCAGACTGGATGACCAAGTTCAGTATCAACACAATATAGTGCCAGGAGCTAATTGTTCCCCAGCAGCGTGAC")
+        check_component(a.components[1], "lav_tests.orange",  53, 252, "+", 361, "GTCCGGCCGGCTGTGTGCTACAATACACGTTCACGCAGTTTGGCCAATCACTTTAAGTATATACGAAATGGTTACCATGAGTTGTACTGTAAGGCAGCGGAAAGC---TTGTTAA--------CTCCTGGGCGACATT----GGGGCTGCAACATCGTTTATCCTCCTCTACAACCAATAGCTG-TTGCTTCTTGGTTCAAGTATATCCCATGGATTAGTATCAACACGATATAGTGTCAGGAGCTAATTGTTCCCCAGCAGCGTGAC")
+
+        a = reader.next()
+        assert a.score == 3586, "a.score is wrong: %s" % a.score
+        assert len(a.components) == 2
+        check_component(a.components[0], "apple",             52,  72, "+", 411, "TGCATATCGACTATTACAGCCACGCGAGTTACATTCCTCTTTTTTTTTGCTGGCGTCCGGCCGGCTGAGAGC")
+        check_component(a.components[1], "lav_tests.orange",   2,  72, "-", 361, "TGCATATCGACTAGTACAGCCTCTCGAGTTACCCCCCCCATTCCTCTTGCTGACGTCACGCTGCTGGGGAAC")
+
+        a = reader.next()
+        assert a is None
+
+        reader.close()
+
+def check_component( c, src, start, size, strand, src_size, text ):
+    #..print "\"%s\" == \"%s\"" % (c.src,src)
+    assert c.src      == src,      "c.src = %s (expected %s)"          % (c.src,     src)
+    assert c.start    == start,    "c.start = %s (expected %s)"        % (c.start,   start)
+    assert c.size     == size,     "c.size = %s (expected %s)"         % (c.size,    size)
+    assert c.strand   == strand,   "c.strand = %s (expected %s)"       % (c.strand,  strand)
+    assert c.src_size == src_size, "c.src_size = %s (expected %s)"     % (c.src_size,src_size)
+    assert c.text     == text,     "c.text = \"%s\" (expected \"%s\")" % (c.text,    text)
+
+test_classes = [ lavTestCase ]
+suite = unittest.TestSuite([ unittest.makeSuite(c) for c in test_classes ])
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/align/maf_tests.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/align/maf_tests.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/align/maf_tests.py (revision 3)
@@ -0,0 +1,190 @@
+"""
+Tests for `bx.align.maf`.
+"""
+
+import unittest
+import sys
+import bx.align as align
+import bx.align.maf as maf
+
+from StringIO import StringIO
+
+# A simple MAF from the rat paper days
+test_maf = """##maf version=1 scoring=humor.v4
+# humor.v4 R=30 M=10 /cluster/data/hg15/bed/blastz.mm3/axtNet300/chr1.maf
+# /cluster/data/hg15/bed/blastz.rn3/axtNet300/chr1.maf
+
+a score=0.128
+s human_hoxa 100  8 + 100257 ACA-TTACT
+s horse_hoxa 120  9 -  98892 ACAATTGCT
+s fugu_hoxa   88  7  + 90788 ACA--TGCT
+
+
+a score=0.071
+s human_unc 9077 8 + 10998 ACAGTATT
+# Comment
+s horse_unc 4555 6 -  5099 ACA--ATT
+s fugu_unc  4000 4 +  4038 AC----TT
+"""
+
+# A more complicated MAF with synteny annotation and such
+test_maf_2 = """##maf version=1 scoring=autoMZ.v1
+a score=3656.000000
+s hg17.chr1                   2005 34 + 245522847 TGTAACTTAATACCACAACCAGGCATAGGGG--AAA-------------
+s rheMac2.chr11            9625228 31 + 134511895 TGTAACCTCTTACTGCAACAAGGCACAGGGG------------------
+i rheMac2.chr11           C 0 I 1678
+s panTro1.chr1                2014 34 + 229575298 TGTAACTTAATACCACAACCAGGCATGGGGG--AAA-------------
+i panTro1.chr1            C 0 C 0
+s bosTau2.chr5            64972365 47 +  76426644 TCCAGCCATGTGTTGTGATCAG--CCAGGGGCTAAAGCCATGGCGGTAG
+i bosTau2.chr5            C 0 I 1462
+s canFam2.chr27           45129665 31 +  48908698 TTTGACTCTGTGCTCTTATCAGGCCCAAGGG------------------
+i canFam2.chr27           C 0 I 1664
+e danRer3.chr18            2360867 428 +  50308305 I
+e oryCun1.scaffold_139397      643 1271 -      4771 I
+e loxAfr1.scaffold_5603      58454 1915 +     68791 I
+e echTel1.scaffold_212365     4641 1430 +      9822 I
+e echTel1.scaffold_212365     4641 1430 +      9822 I
+e rn3.chr4                29161032 1524 - 187371129 I
+e mm7.chr6                28091695 3290 - 149646834 I
+
+"""
+
+# A MAF to test slicing upon
+test_maf_3 = """##maf version=1 scoring=none
+a score=0
+s apple  34 64 + 110 AGGGA---GTTCGTCACT------GTCGTAAGGGTTCAGA--CTGTCTATGTATACACAAGTTGTGTTGCA--ACCG
+s orange 19 61 - 100 AGGGATGCGTT--TCACTGCTATCGTCGTA----TTCAGACTTCG-CTATCT------GAGTTGT---GCATTACCG
+
+"""
+
+def test_reader():
+
+    reader = maf.Reader( StringIO( test_maf ) )
+    assert reader.attributes["version"] == "1" 
+    assert reader.attributes["scoring"] == "humor.v4" 
+
+    a = reader.next()
+    assert a.score == 0.128
+    assert len( a.components ) == 3
+    check_component( a.components[0], "human_hoxa", 100, 8,  "+", 100257, "ACA-TTACT" )
+    check_component( a.components[1], "horse_hoxa", 120, 9, "-",  98892, "ACAATTGCT" )
+    check_component( a.components[2], "fugu_hoxa",    88, 7,  "+",  90788, "ACA--TGCT" )
+    
+    a = reader.next()
+    assert a.score == 0.071
+    assert len( a.components ) == 3
+    check_component( a.components[0], "human_unc", 9077, 8, "+", 10998, "ACAGTATT" )
+    check_component( a.components[1], "horse_unc", 4555, 6, "-",  5099, "ACA--ATT" )
+    check_component( a.components[2], "fugu_unc",   4000, 4, "+",  4038, "AC----TT" )
+
+    a = reader.next()
+    assert a is None
+
+    reader.close()
+
+def test_writer():
+
+    val = StringIO()
+    writer = maf.Writer( val, { 'scoring':'foobar' } )
+    
+    a = align.Alignment()
+    a.score = 7009
+
+    a.components.append( align.Component( src="human_hoxa", start=100, size=9,  strand="+", src_size=1000257, text="ACA-TTACT" ) )
+    a.components.append( align.Component( src="horse_hoxa", start=120, size=10, strand="-",   src_size=98892, text="ACAATTGCT" ) )
+
+    check_component( a.components[0], "human_hoxa", 100, 9,  "+", 1000257, "ACA-TTACT" )
+    check_component( a.components[1], "horse_hoxa", 120, 10, "-",   98892, "ACAATTGCT" )
+
+    writer.write( a )
+
+    assert val.getvalue() == """##maf version=1 scoring=foobar
+a score=7009
+s human_hoxa 100  9 + 1000257 ACA-TTACT 
+s horse_hoxa 120 10 -   98892 ACAATTGCT 
+
+"""
+
+
+
+def test_slice():
+
+    a = align.Alignment()
+    a.score = "7009"
+    a.components.append( align.Component( src="human_hoxa", start=100, size=9,  strand="+", src_size=100257, text="ACA-TTACT" ) )
+    a.components.append( align.Component( src="horse_hoxa", start=120, size=10, strand="-",   src_size=98892, text="ACAATTGCT" ) )
+
+    b = a.slice_by_component( 0, 101, 105 )
+
+    check_component( b.components[0], src="human_hoxa", start=101, size=4, strand="+", src_size=100257, text="CA-TT" )
+    check_component( b.components[1], src="horse_hoxa", start=121, size=5, strand="-", src_size=98892, text ="CAATT" )
+
+	# test slicing with + strand src
+    reader = maf.Reader( StringIO( test_maf_3 ) )
+    a = reader.next()
+    b = a.slice_by_component( 0, 40, 62 )
+    check_component( b.components[0], src="apple",  start=40, size=22, strand="+", src_size=110, text="TTCGTCACT------GTCGTAAGGGTTC" )
+    check_component( b.components[1], src="orange", start=28, size=22, strand="-", src_size=100, text="TT--TCACTGCTATCGTCGTA----TTC" )
+
+	# test slicing with - strand src
+    b = a.slice_by_component( 1, 30, 68 )
+    check_component( b.components[0], src="apple",  start=46, size=41, strand="+", src_size=110, text="ACT------GTCGTAAGGGTTCAGA--CTGTCTATGTATACACAAGTTG" )
+    check_component( b.components[1], src="orange", start=32, size=38, strand="-", src_size=100, text="ACTGCTATCGTCGTA----TTCAGACTTCG-CTATCT------GAGTTG" )
+
+    a = reader.next()
+    assert a is None
+
+
+def test_with_synteny():
+    reader = maf.Reader( StringIO( test_maf_2 ), parse_e_rows=True )
+    
+    a = reader.next()
+    check_component( a.components[0], "hg17.chr1", 2005, 34, "+", 245522847, "TGTAACTTAATACCACAACCAGGCATAGGGG--AAA-------------")
+    check_component( a.components[1], "rheMac2.chr11", 9625228, 31, "+", 134511895, "TGTAACCTCTTACTGCAACAAGGCACAGGGG------------------")
+    print a.components[1].synteny_left
+    assert a.components[1].synteny_left == ( maf.MAF_CONTIG_STATUS, 0 )
+    assert a.components[1].synteny_right == ( maf.MAF_INSERT_STATUS, 1678 )
+
+    rat = a.get_component_by_src_start( "rn3." )
+    check_component( rat, "rn3.chr4", 29161032, 1524, "-", 187371129, None )
+    assert rat.synteny_empty == maf.MAF_INSERT_STATUS
+    
+def test_write_with_synteny():
+    reader = maf.Reader( StringIO( test_maf_2 ), parse_e_rows=True )
+    a = reader.next()
+    val = StringIO()
+    writer = maf.Writer( val, { 'scoring':'foobar' } )
+    writer.write( a )
+    actual = val.getvalue()
+    expected = """##maf version=1 scoring=foobar
+a score=3656.0
+s hg17.chr1                   2005   34 + 245522847 TGTAACTTAATACCACAACCAGGCATAGGGG--AAA------------- 
+s rheMac2.chr11            9625228   31 + 134511895 TGTAACCTCTTACTGCAACAAGGCACAGGGG------------------ 
+i rheMac2.chr11                                     C 0 I 1678                                        
+s panTro1.chr1                2014   34 + 229575298 TGTAACTTAATACCACAACCAGGCATGGGGG--AAA------------- 
+i panTro1.chr1                                      C 0 C 0                                           
+s bosTau2.chr5            64972365   47 +  76426644 TCCAGCCATGTGTTGTGATCAG--CCAGGGGCTAAAGCCATGGCGGTAG 
+i bosTau2.chr5                                      C 0 I 1462                                        
+s canFam2.chr27           45129665   31 +  48908698 TTTGACTCTGTGCTCTTATCAGGCCCAAGGG------------------ 
+i canFam2.chr27                                     C 0 I 1664                                        
+e danRer3.chr18            2360867  428 +  50308305 I                                                 
+e oryCun1.scaffold_139397      643 1271 -      4771 I                                                 
+e loxAfr1.scaffold_5603      58454 1915 +     68791 I                                                 
+e echTel1.scaffold_212365     4641 1430 +      9822 I                                                 
+e echTel1.scaffold_212365     4641 1430 +      9822 I                                                 
+e rn3.chr4                29161032 1524 - 187371129 I                                                 
+e mm7.chr6                28091695 3290 - 149646834 I                                                 
+
+"""
+    print actual
+    print "---"
+    print expected
+    assert actual == expected
+
+def check_component( c, src, start, size, strand, src_size, text ):
+    assert c.src == src
+    assert c.start == start 
+    assert c.size == size 
+    assert c.strand == strand 
+    assert c.src_size == src_size 
+    assert c.text == text
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/align/_core.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/align/_core.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/align/_core.py (revision 3)
@@ -0,0 +1,7 @@
+def __bootstrap__():
+   global __bootstrap__, __loader__, __file__
+   import sys, pkg_resources, imp
+   __file__ = pkg_resources.resource_filename(__name__,'_core.so')
+   __loader__ = None; del __bootstrap__, __loader__
+   imp.load_dynamic(__name__,__file__)
+__bootstrap__()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/_seqmapping.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/_seqmapping.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/_seqmapping.py (revision 3)
@@ -0,0 +1,7 @@
+def __bootstrap__():
+   global __bootstrap__, __loader__, __file__
+   import sys, pkg_resources, imp
+   __file__ = pkg_resources.resource_filename(__name__,'_seqmapping.so')
+   __loader__ = None; del __bootstrap__, __loader__
+   imp.load_dynamic(__name__,__file__)
+__bootstrap__()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/tabular/__init__.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/tabular/__init__.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/tabular/__init__.py (revision 3)
@@ -0,0 +1,3 @@
+"""
+Support for working with delimited data files.
+"""
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/tabular/io.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/tabular/io.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/tabular/io.py (revision 3)
@@ -0,0 +1,137 @@
+"""
+Reading and writing delimited data files (with headers and comments).
+"""
+
+import sys
+from itertools import *
+from UserDict import DictMixin
+
+class ParseError( Exception ):
+    def __init__( self, *args, **kwargs ):
+        Exception.__init__( self, *args )
+        self.linenum = kwargs.get("linenum",None)
+    def __str__( self ):
+        if self.linenum:
+            return Exception.__str__( self ) + " on line " + str(self.linenum)
+        else:
+            return Exception.__str__( self )
+
+class TableRow( object ):
+    """
+    A row of a table
+    """
+    def __init__( self, reader, fields ):
+        self.reader = reader
+        self.fields = fields
+    def __getitem__( self, key ):
+        if type( key ) == int:
+            return self.fields[key]
+        elif type( key ) == str:
+            if self.reader.header:
+                return self.fields[ self.reader.header.field_to_column[key] ]
+            else:
+                raise TypeError( "column names only supported for files with headers" )
+        else:
+            raise TypeError( "field indices must be integers or strings" )
+    @property
+    def fieldnames( self ):
+        return self.reader.header.fields
+    def __str__( self ):
+        return "\t".join( self.fields )
+
+class Header( object ):
+    """
+    Header of a table -- contains column names and a mapping from them
+    to column indexes
+    """
+    def __init__( self, fields ):
+        self.set_fields( fields )
+    def set_fields( self, fields ):
+        self.fields = fields
+        self.field_to_column = dict( zip( fields, count() ) )
+    def __getitem__( self, key ):
+        if type( key ) == int:
+            return self.fields[key]
+        elif type( key ) == str:
+            if key in self.field_to_column:
+                return key
+        else:
+            raise TypeError( "field indices must be integers or strings" )
+    def __str__( self ):
+        return "#" + "\t".join( self.fields )
+        
+class Comment( object ):
+    def __init__( self, line ):
+        self.line = line
+    def __str__( self ):
+        if self.line.startswith("#"):
+            return self.line
+        return "#" + self.line
+
+class TableReader( object ):
+    """
+    Reader for iterating tabular data
+    """
+    def __init__( self, input, return_header=True, return_comments=True, force_header=None, comment_lines_startswith = ["#"] ):
+        self.input = input
+        self.return_comments = return_comments
+        self.return_header = return_header
+        self.input_iter = iter( input )
+        self.linenum = 0
+        self.header = force_header
+        self.comment_lines_startswith = comment_lines_startswith
+    def __iter__( self ):
+        return self
+    def next( self ):
+        line = self.input_iter.next()
+        self.linenum += 1
+        line = line.rstrip( "\r\n" )
+        # Catch blank lines (throw a warning?)
+        # This will end up adding a '#' at the beginning of blank lines
+        if line == '':
+            if self.return_comments:
+                return Comment( line )
+            else:
+                return self.next()
+        # Is it a comment line?
+        for comment_line_start in self.comment_lines_startswith:
+            if line.startswith( comment_line_start ):
+                # If a comment and the first line we assume it is a header
+                if self.header is None and self.linenum == 1:
+                    self.header = self.parse_header( line )
+                    if self.return_header:
+                        return self.header
+                    else:
+                        return self.next()
+                else:
+                    if self.return_comments:
+                        return self.parse_comment( line )
+                    else:
+                        return self.next()
+        # Not a comment, must be an interval
+        try:
+            return self.parse_row( line )
+        except ParseError, e:
+            e.linenum = self.linenum
+            raise e
+    def parse_header( self, line ):
+        if line.startswith("#"):
+            fields = line[1:].split( "\t" )
+        else:
+            fields = line.split( "\t" )
+        return Header( fields )
+    def parse_comment( self, line ):
+        return Comment( line )
+    def parse_row( self, line ):
+        return TableRow( self, line.split( "\t" ) )
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/misc/cdb.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/misc/cdb.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/misc/cdb.py (revision 3)
@@ -0,0 +1,109 @@
+from UserDict import DictMixin
+
+from bx.misc.binary_file import BinaryFileReader, BinaryFileWriter
+import numpy
+import sys
+
+def cdbhash( s ):
+    return reduce( lambda h, c: (((h << 5) + h) ^ ord(c)) & 0xffffffffL, s, 5381 )
+
+class FileCDBDict( DictMixin ):
+    """
+    For accessing a CDB structure on disk. Read only. Currently only supports
+    access by key (getitem).
+    
+    NOTE: The keys method could be implemented by scanning the main table.
+    """
+    def __init__( self, file, is_little_endian=True ):
+        # TODO: Deal with endianess
+        self.io = BinaryFileReader( file, is_little_endian=is_little_endian )
+        self.header_offset = self.io.tell()
+        # Read the whole header (only 2k)
+        self.header = []
+        for i in range( 256 ):
+            self.header.append( ( self.io.read_uint32(), self.io.read_uint32() ) )
+    def __getitem__( self, key ):
+        hash = cdbhash( key )
+        # Find position of subtable using 8 LSBs of hash
+        subtable_offset = self.header[ hash % 256 ][0]
+        subtable_size = self.header[ hash % 256 ][1]
+        if subtable_size == 0:
+            raise KeyError
+        # Seek into subtable and look for match
+        start = ( hash >> 8 )
+        for i in range( subtable_size ):
+            offset = subtable_offset + ( ( start + i ) % subtable_size ) * 8
+            self.io.seek( offset )
+            h = self.io.read_uint32()
+            p = self.io.read_uint32()
+            # Hit an empty bin, no match for key
+            if p == 0:
+                raise KeyError
+            # Hash matches, need to check full key
+            if h == hash:
+                self.io.seek( p )
+                klen = self.io.read_uint32()
+                vlen = self.io.read_uint32()
+                k = self.io.read( klen )
+                if k == key:
+                    v = self.io.read( vlen )
+                    return v
+        else:
+            # Visited every slot and no match (should never happen since
+            # there are empty slots by contruction)
+            raise KeyError
+        
+    @classmethod
+    def to_file( Class, dict, file, is_little_endian=True ):
+        """
+        For constructing a CDB structure in a file. Able to calculate size on
+        disk and write to a file
+        """
+        io = BinaryFileWriter( file, is_little_endian=is_little_endian )
+        start_offset = io.tell()
+        # Header is of fixed length
+        io.seek( start_offset + ( 8 * 256 ) )
+        # For each item, key and value length (written as length prefixed
+        # strings). We also calculate the subtables on this pass.
+        # NOTE: This requires the key and value be byte strings, support for
+        #       dealing with encoding specific value types should be
+        #       added to this wrapper
+        subtables = [ [] for i in range(256) ]
+        for key, value in dict.iteritems():
+            pair_offset = io.tell()
+            io.write_uint32( len( key ) )
+            io.write_uint32( len( value ) )
+            io.write( key )
+            io.write( value )
+            hash = cdbhash( key )
+            subtables[ hash % 256 ].append( ( hash, pair_offset ) )
+        # Save the offset where the subtables will start
+        subtable_offset = io.tell()
+        # Write subtables
+        for subtable in subtables:
+            if len( subtable ) > 0:
+                # Construct hashtable to be twice the size of the number
+                # of items in the subtable, and built it in memory
+                ncells = len( subtable ) * 2
+                cells = [ (0,0) for i in range( ncells ) ]
+                for hash, pair_offset in subtable:
+                    index = ( hash >> 8 ) % ncells
+                    while cells[index][1] != 0:
+                        index = ( index + 1 ) % ncells
+                    # Guaranteed to find a non-empty cell
+                    cells[index] = ( hash, pair_offset )
+                # Write subtable
+                for hash, pair_offset in cells:
+                    io.write_uint32( hash )
+                    io.write_uint32( pair_offset )
+        # Go back and write the header
+        end_offset = io.tell()
+        io.seek( start_offset )
+        index = subtable_offset
+        for subtable in subtables:
+            io.write_uint32( index )
+            io.write_uint32( len( subtable * 2 ) )
+            # For each cell in the subtable, a hash and a pointer to a value
+            index += ( len( subtable ) * 2 ) * 8
+        # Leave fp at end of cdb
+        io.seek( end_offset )
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/misc/cdb_tests.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/misc/cdb_tests.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/misc/cdb_tests.py (revision 3)
@@ -0,0 +1,34 @@
+from bx.misc.cdb import *
+from tempfile import NamedTemporaryFile
+
+def test():
+
+    d = {}
+    for i in range( 10000 ):
+        d[ 'foo' + str( i ) ] = 'bar' + str( i )
+    
+    # Open temporary file and get name    
+    file = NamedTemporaryFile()
+    file_name = file.name
+        
+    # Write cdb to file
+    FileCDBDict.to_file( d, file )
+    file.flush()
+    
+    # Open on disk
+    file2 = open( file_name )
+    cdb = FileCDBDict( file2 )
+    
+    for key, value in d.iteritems():
+        assert cdb[key] == value
+    
+    try:
+        cdb['notin']
+        assert False, "KeyError was not raised"
+    except KeyError, e:
+        pass
+    
+    # Close everything (deletes the temporary file)
+    file2.close()
+    file.close()
+    
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/misc/seeklzop.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/misc/seeklzop.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/misc/seeklzop.py (revision 3)
@@ -0,0 +1,166 @@
+"""
+Semi-random access to bz2 compressed data.
+"""
+
+import os
+import bisect
+import sys
+try:
+    import pkg_resources
+    pkg_resources.require( 'python_lzo' )
+except:
+    pass
+import lzo
+import struct
+
+from bx_extras import lrucache   
+from cStringIO import StringIO
+    
+class SeekableLzopFile( object ):
+    """
+    Filelike object supporting read-only semi-random access to bz2 compressed
+    files for which an offset table (bz2t) has been generated by `bzip-table`.
+    """
+    
+    def __init__( self, filename, table_filename, block_cache_size=0, **kwargs ):
+        self.filename = filename
+        self.table_filename = table_filename
+        self.init_table()
+        self.file = open( self.filename, "r" )
+        self.dirty = True
+        self.at_eof = False
+        self.file_pos = 0
+        self.current_block_index = -1
+        self.current_block = None
+        if block_cache_size > 0:
+            self.cache = lrucache.LRUCache( block_cache_size )
+        else:
+            self.cache = None
+        
+    def init_table( self ):
+        self.block_size = None
+        self.block_info = []
+        # Position of corresponding block in compressed file (in bytes)
+        for line in open( self.table_filename ):
+            fields = line.split()
+            if fields[0] == "s":
+                self.block_size = int( fields[1] )
+            if fields[0] == "o":
+                offset = int( fields[1] )
+                compressed_size = int( fields[2] )
+                size = int( fields[3] )
+                self.block_info.append( ( offset, compressed_size, size ) )
+        self.nblocks = len( self.block_info )
+        
+    def close( self ):
+        self.file.close()
+        
+    def load_block( self, index ):
+        if self.cache is not None and index in self.cache:
+            return self.cache[index]
+        else:      
+            offset, csize, size = self.block_info[ index ]
+            # Get the block of compressed data
+            self.file.seek( offset )
+            data = self.file.read( csize )
+            # Need to prepend a header for python-lzo module (silly)
+            data = ''.join( ( '\xf0', struct.pack( "!I", size ), data ) )
+            value = lzo.decompress( data )
+            if self.cache is not None:
+                self.cache[index] = value
+            return value
+        
+    def fix_dirty( self ):
+        chunk, offset = self.get_block_and_offset( self.file_pos )
+        if self.current_block_index != chunk:
+            self.current_block = StringIO( self.load_block( chunk ) )
+            self.current_block.read( offset )
+            self.current_block_index = chunk
+        else:
+            self.current_block.seek( offset )
+        self.dirty = False
+        
+    def get_block_and_offset( self, index ):
+        return int( index // self.block_size ), int( index % self.block_size )
+
+    def seek( self, offset, whence=0 ):
+        """
+        Move the file pointer to a particular offset.
+        """
+        # Determine absolute target position
+        if whence == 0:
+            target_pos = offset
+        elif whence == 1:
+            target_pos = self.file_pos + offset
+        elif whence == 2:
+            raise Exception( "seek from end not supported" )
+            ## target_pos = self.size - offset
+        else:
+            raise Exception( "Invalid `whence` argument: %r", whence )
+        # Check if this is a noop
+        if target_pos == self.file_pos:
+            return    
+        # Verify it is valid
+        ## assert 0 <= target_pos < self.size, "Attempt to seek outside file"
+        # Move the position
+        self.file_pos = target_pos
+        # Mark as dirty, the next time a read is done we need to actually
+        # move the position in the bzip2 file
+        self.dirty = True
+        
+    def tell( self ):
+        return self.file_pos
+        
+    def readline( self ):
+        if self.dirty:
+            self.fix_dirty()
+        if self.at_eof:
+            return ""
+        rval = []
+        while 1:
+            line = self.current_block.readline()
+            self.file_pos += len( line )
+            rval.append( line )
+            if len( line ) > 0 and line[-1] == '\n':
+                break
+            elif self.current_block_index == self.nblocks - 1:
+                self.at_eof = True
+                break
+            else:
+                self.current_block_index += 1
+                self.current_block = StringIO( self.load_block( self.current_block_index ) )      
+        return "".join( rval ) 
+            
+    def next( self ):
+        line = self.readline()
+        if line == "":
+            raise StopIteration
+            
+    def __iter__( self ):
+        return self
+
+# --- Factor out ---        
+        
+MAGIC="\x89\x4c\x5a\x4f\x00\x0d\x0a\x1a\x0a"
+
+F_ADLER32_D     = 0x00000001L
+F_ADLER32_C     = 0x00000002L
+F_H_EXTRA_FIELD = 0x00000040L
+F_H_GMTDIFF     = 0x00000080L
+F_CRC32_D       = 0x00000100L
+F_CRC32_C       = 0x00000200L
+F_MULTIPART     = 0x00000400L
+F_H_FILTER      = 0x00000800L
+F_H_CRC32       = 0x00001000L
+
+assert struct.calcsize( "!H" ) == 2
+assert struct.calcsize( "!I" ) == 4
+
+class UnpackWrapper( object ):
+    def __init__( self, file ):
+        self.file = file
+    def read( self, amt ):
+        return self.file.read( amt )
+    def get( self, fmt ):
+        t = struct.unpack( fmt, self.file.read( struct.calcsize( fmt ) ) )
+        return t[0]
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/misc/_seekbzip2.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/misc/_seekbzip2.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/misc/_seekbzip2.py (revision 3)
@@ -0,0 +1,7 @@
+def __bootstrap__():
+   global __bootstrap__, __loader__, __file__
+   import sys, pkg_resources, imp
+   __file__ = pkg_resources.resource_filename(__name__,'_seekbzip2.so')
+   __loader__ = None; del __bootstrap__, __loader__
+   imp.load_dynamic(__name__,__file__)
+__bootstrap__()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/misc/seekbzip2.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/misc/seekbzip2.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/misc/seekbzip2.py (revision 3)
@@ -0,0 +1,148 @@
+"""
+Semi-random access to bz2 compressed data.
+"""
+
+import os
+import bisect
+import sys
+    
+from _seekbzip2 import SeekBzip2
+    
+class SeekableBzip2File( object ):
+    """
+    Filelike object supporting read-only semi-random access to bz2 compressed
+    files for which an offset table (bz2t) has been generated by `bzip-table`.
+    """
+    
+    def __init__( self, filename, table_filename, **kwargs ):
+        self.filename = filename
+        self.table_filename = table_filename
+        self.init_table()
+        self.init_bz2()
+        self.pos = 0
+        self.dirty = True
+        
+    def init_bz2( self ):
+        self.seek_bz2 = SeekBzip2( self.filename )
+        
+    def init_table( self ):
+        # Position in plaintext file
+        self.table_positions = []
+        # Position of corresponding block in bz2 file (bits)
+        self.table_bz2positions = []
+        pos = 0
+        for line in open( self.table_filename ):
+            fields = line.split()
+            # Position of the compressed block in the bz2 file
+            bz2_pos = int( fields[0] )
+            # print >> sys.stderr, fields[0], bz2_pos
+            # Length of the block when uncompressed
+            length = int( fields[1] )
+            self.table_positions.append( pos )
+            self.table_bz2positions.append( bz2_pos )
+            old_pos = pos
+            pos = pos + length
+            assert pos > old_pos
+        self.size = pos
+        #print >> sys.stderr, self.size
+        #print >> sys.stderr, self.table_bz2positions
+        
+    def close( self ):
+        self.seek_bz2.close()
+        
+    def fix_dirty( self ):
+        # Our virtual position in the uncompressed data is out of sync
+        # FIXME: If we're moving to a later position that is still in 
+        # the same block, we could just read and throw out bytes in the
+        # compressed stream, less wasteful then backtracking
+        chunk, offset = self.get_chunk_and_offset( self.pos )
+        # Get the seek position for that chunk and seek to it
+        bz2_seek_pos = self.table_bz2positions[chunk] 
+        # print >>sys.stderr, "bz2 seek pos:", bz2_seek_pos
+        self.seek_bz2.seek( bz2_seek_pos )
+        # Consume bytes to move to the correct position
+        assert len( self.seek_bz2.read( offset ) ) == offset
+        # Update state
+        self.dirty = False
+        
+    def read( self, sizehint=-1 ):
+        if sizehint < 0:
+            chunks = []
+            while 1:
+                self._read( 1024*1024 )
+                if val:
+                    chunks.append( val )
+                else:
+                    break
+            return "".join( chunks )
+        else:
+            return self._read( sizehint )
+        
+    def _read( self, size ):
+        if self.dirty: self.fix_dirty()
+        val = self.seek_bz2.read( size )
+        if val is None:
+            # EOF
+            self.pos = self.size
+            val = ""
+        else:
+            self.pos = self.pos + len( val )
+        return val
+        
+    def readline( self, size=-1 ):
+        if self.dirty: self.fix_dirty()
+        val = self.seek_bz2.readline( size )
+        if val is None:
+            # EOF
+            self.pos = self.size
+            val = ""
+        else:
+            self.pos = self.pos + len( val )
+        return val
+        
+    def tell( self ):
+        return self.pos
+            
+    def get_chunk_and_offset( self, position ):
+        # Find the chunk that position is in using a binary search
+        chunk = bisect.bisect( self.table_positions, position ) - 1
+        offset = position - self.table_positions[chunk]
+        return chunk, offset
+        
+    def seek( self, offset, whence=0 ):
+        # Determine absolute target position
+        if whence == 0:
+            target_pos = offset
+        elif whence == 1:
+            target_pos = self.pos + offset
+        elif whence == 2:
+            target_pos = self.size - offset
+        else:
+            raise Exception( "Invalid `whence` argument: %r", whence )
+        # Check if this is a noop
+        if target_pos == self.pos:
+            return    
+        # Verify it is valid
+        assert 0 <= target_pos < self.size, "Attempt to seek outside file"
+        # Move the position
+        self.pos = target_pos
+        # Mark as dirty, the next time a read is done we need to actually
+        # move the position in the bzip2 file
+        self.dirty = True
+        
+    # ---- File like methods ------------------------------------------------
+    
+    def next(self):
+        ln = self.readline()
+        if ln == "":
+            raise StopIteration()
+        return ln
+    
+    def __iter__(self):
+        return self
+        
+    def readlines(self,sizehint=-1):
+        return [ln for ln in self]
+
+    def xreadlines(self):
+        return iter(self)
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/misc/seeklzop_tests.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/misc/seeklzop_tests.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/misc/seeklzop_tests.py (revision 3)
@@ -0,0 +1,30 @@
+import seeklzop
+import os
+import random
+import sys
+
+"""
+T="/Users/james/cache/hg18/align/multiz28way/chr10.maf"
+C="/Users/james/cache/hg18/align/multiz28way/chr10.maf.lzo"
+
+def test():
+    f = seeklzop.SeekableLzopFile( C, C + "t", block_cache_size=20 )
+    for line in f:
+        pass
+        
+def test_random_seeking():
+    s = os.stat( T ).st_size
+    raw = open( T )
+    f = seeklzop.SeekableLzopFile( C, C + "t", block_cache_size=20 )
+    for i in range( 1000 ):
+        seek_to = random.randrange( s )
+        
+        f.seek( seek_to )
+        raw.seek( seek_to )
+
+        l1 = f.readline()
+        l2 = raw.readline()
+        
+        assert l1 == l2, "%r != %r" % ( l1, l2 )
+        assert raw.tell() == f.tell(), "tells not equal"
+"""
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/misc/__init__.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/misc/__init__.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/misc/__init__.py (revision 3)
@@ -0,0 +1,13 @@
+"""
+Various utilities.
+"""
+
+import bz2, gzip
+
+def open_compressed( filename, mode='r' ):
+    if filename.endswith( ".bz2" ):
+        return bz2.BZ2File( filename, mode )
+    elif filename.endswith( ".gz" ):
+        return gzip.GzipFile( filename, mode )
+    else:
+        return file( filename, mode )
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/misc/readlengths.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/misc/readlengths.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/misc/readlengths.py (revision 3)
@@ -0,0 +1,29 @@
+"""
+Read sequence lengths from a file.  Each line is of the form <name> <length>
+where <name> is typically a chromsome name (e.g. chr12) and length is the
+number of bases the sequence.
+"""
+
+def read_lengths_file( name ):
+    """
+    Returns a hash from sequence name to length.
+    """
+    
+    chrom_to_length = {}
+    f = file ( name, "rt" )
+    for line in f:
+        line = line.strip()
+        if line == '' or line[0] == '#': continue
+        try:
+            fields = line.split()
+            if len(fields) != 2: raise
+            chrom = fields[0]
+            length = int( fields[1] )
+        except:
+            raise "bad length file line: %s" % line
+        if chrom in chrom_to_length and length != chrom_to_length[chrom]:
+            raise "%s has more than one length!" % chrom
+        chrom_to_length[chrom] = length
+    f.close()
+    return chrom_to_length
+
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/misc/seekbzip2_tests.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/misc/seekbzip2_tests.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/misc/seekbzip2_tests.py (revision 3)
@@ -0,0 +1,86 @@
+"""
+Tests for `bx.misc.seekbzip2`.
+"""
+
+import tempfile
+import commands
+import os
+import random
+from itertools import *
+
+import seekbzip2
+import bz2
+
+F=None
+T=None
+
+#F="/Users/james/work/seek-bzip2/test_random.dat.bz2"
+#T="/Users/james/cache/hg18/align/multiz28way/chr10.maf.bz2"
+
+#F=/depot/data1/cache/human/hg18/align/multiz28way/chr1.maf.bz2
+
+import sys
+
+if F and os.path.exists( F ):
+
+    def test_linear_reading():
+        raw_data = bz2.BZ2File( F ).read()
+        f = seekbzip2.SeekableBzip2File( F, F + "t" )
+        chunk = 1221
+        pos = 0
+        for i in range( ( len(raw_data) // chunk ) + 1 ):
+            a = raw_data[pos:pos+chunk]
+            b = f.read( chunk )
+            assert a == b
+            pos += chunk
+            assert f.tell() == min( pos, len(raw_data) )
+        f.close()
+        
+    def test_random_seeking():
+        raw_data = bz2.BZ2File( F ).read()
+        f = seekbzip2.SeekableBzip2File( F, F + "t" )
+        for i in range( 10 ):
+            seek_to = random.randrange( len( raw_data ) - 100 )
+            chunk = random.randrange( 10, 20 )
+
+            f.seek( seek_to )
+            a = f.read( chunk )
+            b = raw_data[ seek_to : seek_to + chunk ]
+        
+            assert a == b, "'%s' != '%s' on %dth attempt" % ( a.encode("hex"), b.encode("hex"), i )
+
+            assert f.tell() == min( seek_to + chunk, len(raw_data) )
+        f.close()
+            
+if T and os.path.exists( T ):
+       
+    def test_text_reading():
+        #raw_data = bz2.BZ2File( T ).read()
+        #raw_lines = raw_data.split( "\n" )
+        raw_file = bz2.BZ2File( T )
+        f = seekbzip2.SeekableBzip2File( T, T + "t" )
+        pos = 0
+        for i, ( line, raw_line ) in enumerate( izip( f, raw_file ) ):
+            assert line == raw_line, "%d: %r != %r" % ( i, line.rstrip( "\n" ), raw_line )
+            pos += len( line )
+            ftell = f.tell()
+            assert ftell == pos, "%d != %d" % ( ftell, pos )
+        f.close()
+        
+  
+    def test_text_reading_2():
+        raw_data = bz2.BZ2File( T ).read()
+        f = seekbzip2.SeekableBzip2File( T, T + "t" )
+        raw_lines = raw_data.split( "\n" )
+        pos = 0
+        i = 0
+        while 1:
+            line = f.readline()
+            if line == "": break
+            assert line.rstrip( "\r\n" ) == raw_lines[i], "%r != %r" % ( line.rstrip( "\r\n" ), raw_lines[i] )
+            pos += len( line )
+            ftell = f.tell()
+            assert ftell == pos, "%d != %d" % ( ftell, pos )  
+            i += 1    
+        f.close()
+        
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/misc/binary_file.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/misc/binary_file.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/misc/binary_file.py (revision 3)
@@ -0,0 +1,165 @@
+"""
+Wrappers for doing binary IO on file-like objects
+"""
+
+import numpy
+import struct
+import sys
+
+## Standard size:
+## short is 8 bits
+## int and long are 32 bits
+## long long is 64 bits
+
+class BadMagicNumber( IOError ):
+    pass
+
+class BinaryFileReader( object ):
+    """
+    Wrapper for doing binary reads on any file like object.
+    
+    Currently this is not heavily optimized (it uses the `struct` module to
+    unpack)
+    """    
+    def __init__( self, file, magic = None, is_little_endian = False ):
+        self.is_little_endian = is_little_endian
+        self.file = file
+        if magic is not None:
+            # Attempt to read magic number and chuck endianess
+            bytes = file.read( 4 )
+            if struct.unpack( ">I", bytes )[0] == magic:
+                pass
+            elif struct.unpack( "<I", bytes )[0] == magic:
+                self.is_little_endian = True
+            else:
+                raise BadMagic( "File does not have expected magic number" )                
+        # Set endian code
+        if self.is_little_endian:
+            self.endian_code = "<"
+            self.byteswap_needed = ( sys.byteorder != "little" )
+        else:
+            self.endian_code = ">"
+            self.byteswap_needed = ( sys.byteorder != "big" )
+        
+    def unpack( self, format, buffer, byte_count=None ):
+        pattern = "%s%s" % ( self.endian_code, format )
+        if byte_count is None:
+            byte_count = struct.calcsize( pattern )
+        return struct.unpack( pattern, buffer )
+        
+    def read_and_unpack( self, format, byte_count=None ):
+        """
+        Read enough bytes to unpack according to `format` and return the
+        tuple of unpacked values.
+        """
+        pattern = "%s%s" % ( self.endian_code, format )
+        if byte_count is None:
+            byte_count = struct.calcsize( pattern )
+        return struct.unpack( pattern, self.file.read( byte_count ) )
+    
+    def read_c_string( self ):
+        """
+        Read a zero terminated (C style) string
+        """
+        rval = []
+        while 1:
+            ch = self.file.read(1)
+            assert len( ch ) == 1, "Unexpected end of file"
+            if ch == '\0':
+                break
+            rval.append( ch )
+        return ''.join( rval )
+        
+    def read_raw_array( self, dtype, size ):
+        a = numpy.fromfile( self.file, dtype=dtype, count=size )
+        if self.byteswap_needed:
+            a.byteswap()
+        return a
+    
+    def read( self, byte_count=1 ):
+        return self.file.read( byte_count )
+        
+    def tell( self ):
+        return self.file.tell()
+        
+    def skip( self, count ):
+        self.file.seek( count, 1 )
+        
+    def seek( self, pos, whence=0 ):
+        return self.file.seek( pos, whence )
+
+    def read_uint8( self ):
+        return self.read_and_unpack( "B", 1 )[0]
+    
+    def read_uint16( self ):
+        return self.read_and_unpack( "H", 2 )[0]
+        
+    def read_uint32( self ):
+        return self.read_and_unpack( "L", 4 )[0]
+        
+    def read_uint64( self ):
+        return self.read_and_unpack( "Q", 8 )[0]
+        
+        
+class BinaryFileWriter( object ):
+    """
+    Wrapper for doing binary writes on any file like object.
+    
+    Currently this is not heavily optimized (it uses the `struct` module to
+    unpack)
+    """    
+    def __init__( self, file, magic = None, is_little_endian = False ):
+        self.is_little_endian = is_little_endian
+        if self.is_little_endian:
+            self.endian_code = "<"
+        else:
+            self.endian_code = ">"
+        self.file = file
+        if magic is not None:
+            self.write_uint32( magic )
+            
+    def pack( self, format, buffer ):
+        pattern = "%s%s" % ( self.endian_code, format )
+        return struct.pack( pattern, buffer )
+        
+    def pack_and_write( self, format, value ):
+        """
+        Read enough bytes to unpack according to `format` and return the
+        tuple of unpacked values.
+        """
+        pattern = "%s%s" % ( self.endian_code, format )
+        return self.file.write( struct.pack( pattern, value ) )
+    
+    def write_c_string( self, value ):
+        """
+        Read a zero terminated (C style) string
+        """
+        self.file.write( value )
+        self.file.write( '\0' )
+        
+    def write_raw_array( self, value ):
+        value.tofile( self.file )
+    
+    def write( self, value ):
+        return self.file.write( value )
+        
+    def skip( self, count ):
+        self.file.seek( count, 1 )
+        
+    def tell( self ):
+        return self.file.tell()
+        
+    def seek( self, pos, whence=0 ):
+        return self.file.seek( pos, whence )
+
+    def write_uint8( self, value ):
+        return self.pack_and_write( "B", value )
+    
+    def write_uint16( self, value ):
+        return self.pack_and_write( "H", value )
+
+    def write_uint32( self, value ):
+        return self.pack_and_write( "L", value )
+
+    def write_uint64( self, value ):
+        return self.pack_and_write( "Q", value )
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/misc/filecache.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/misc/filecache.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/misc/filecache.py (revision 3)
@@ -0,0 +1,105 @@
+from __future__ import division
+
+import sys
+from bx_extras.lrucache import LRUCache
+from cStringIO import StringIO
+
+DEFAULT_CACHE_SIZE=10
+DEFAULT_BLOCK_SIZE=1024*1024*2
+
+class FileCache( object ):
+    """
+    Wrapper for a file that cache blocks of data in memory. 
+    
+    **NOTE:** this is currently an incomplete file-like object, it only
+    supports seek, tell, and readline (plus iteration). Reading bytes is
+    currently not implemented.
+    """
+    def __init__( self, file, size, cache_size=DEFAULT_CACHE_SIZE, 
+                                    block_size=DEFAULT_BLOCK_SIZE ):
+        """
+        Create a new `FileCache` wrapping the file-like object `file` that
+        has total size `size` and caching blocks of size `block_size`.
+        """
+        self.file = file
+        self.size = size
+        self.cache_size = cache_size
+        self.block_size = block_size
+        # Setup the cache
+        self.nblocks = ( self.size // self.block_size ) + 1
+        self.cache = LRUCache( self.cache_size )
+        # Position in file
+        self.dirty = True
+        self.at_eof = False
+        self.file_pos = 0
+        self.current_block_index = -1
+        self.current_block = None
+    def fix_dirty( self ):
+        chunk, offset = self.get_block_and_offset( self.file_pos )
+        if self.current_block_index != chunk:
+            self.current_block = StringIO( self.load_block( chunk ) )
+            self.current_block.read( offset )
+            self.current_block_index = chunk
+        else:
+            self.current_block.seek( offset )
+        self.dirty = False
+    def get_block_and_offset( self, index ):
+        return int( index // self.block_size ), int( index % self.block_size )
+    def load_block( self, index ):
+        if index in self.cache:
+            return self.cache[index]
+        else:
+            real_offset = index * self.block_size
+            self.file.seek( real_offset )
+            block = self.file.read( self.block_size )
+            self.cache[index] = block
+            return block
+    def seek( self, offset, whence=0 ):
+        """
+        Move the file pointer to a particular offset.
+        """
+        # Determine absolute target position
+        if whence == 0:
+            target_pos = offset
+        elif whence == 1:
+            target_pos = self.file_pos + offset
+        elif whence == 2:
+            target_pos = self.size - offset
+        else:
+            raise Exception( "Invalid `whence` argument: %r", whence )
+        # Check if this is a noop
+        if target_pos == self.file_pos:
+            return    
+        # Verify it is valid
+        assert 0 <= target_pos < self.size, "Attempt to seek outside file"
+        # Move the position
+        self.file_pos = target_pos
+        # Mark as dirty, the next time a read is done we need to actually
+        # move the position in the bzip2 file
+        self.dirty = True
+    def readline( self ):
+        if self.dirty:
+            self.fix_dirty()
+        if self.at_eof:
+            return ""
+        rval = []
+        while 1:
+            line = self.current_block.readline()
+            rval.append( line )
+            if len( line ) > 0 and line[-1] == '\n':
+                break
+            elif self.current_block_index == self.nblocks - 1:
+                self.at_eof = True
+                break
+            else:
+                self.current_block_index += 1
+                self.current_block = StringIO( self.load_block( self.current_block_index ) )      
+        return "".join( rval )     
+    def next( self ):
+        line = self.readline()
+        if line == "":
+            raise StopIteration
+    def __iter__( self ):
+        return self
+    def close( self ):
+        self.file.close()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/misc/filecache_tests.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/misc/filecache_tests.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/misc/filecache_tests.py (revision 3)
@@ -0,0 +1,30 @@
+import filecache
+import os
+import random
+import sys
+
+"""
+T="/Users/james/cache/hg18/align/multiz28way/chr10.maf"
+
+def test():
+    s = os.stat( T ).st_size
+    real_f = open( T )
+    f = filecache.FileCache( real_f, s )
+    for i in range( 1000 ):
+        f.readline()
+        
+def test_random_seeking():
+    s = os.stat( T ).st_size
+    raw = open( T )
+    f = filecache.FileCache( open( T ), s )
+    for i in range( 10000 ):
+        seek_to = random.randrange( s )
+        
+        f.seek( seek_to )
+        raw.seek( seek_to )
+
+        l1 = f.readline()
+        l2 = raw.readline()
+        
+        assert l1 == l2
+"""
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/phylo/__init__.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/phylo/__init__.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/phylo/__init__.py (revision 3)
@@ -0,0 +1,3 @@
+"""
+Phylogenetic file format support.
+"""
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/phylo/phast.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/phylo/phast.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/phylo/phast.py (revision 3)
@@ -0,0 +1,42 @@
+"""
+Rudimentary support for PHAST's tree model file format (a simple format for
+storing trees and rate matrices).
+"""
+
+from numpy import *
+
+class TreeModel:
+    def __init__( self ):
+        self.alphabet = None
+        self.radix = 0
+        self.order = 0
+        self.subst_mod = None
+        self.background = None
+        self.tree = None
+        self.matrix = None
+    ## TODO: Need scipy for this method
+    ## def matrix_for_time( self, t ):
+    ##     return expm( self.matrix * t )
+    ## matrix_for_time = cachedmethod( matrix_for_time )
+    @staticmethod
+    def from_file( f ):
+        input = iter( f )
+        tm = TreeModel()
+        for line in input:
+            if line.startswith( "ALPHABET:" ):
+                tm.alphabet = tuple( line.split()[1:] )    
+                tm.radix = len( tm.alphabet )
+            if line.startswith( "ORDER:" ):
+                tm.order = int( line.split()[1] )
+            if line.startswith( "SUBST_MOD:" ):
+                tm.subst_mod = line[11:].rstrip()                   
+            if line.startswith( "BACKGROUND:" ):
+                tm.background = tuple( map( float, line.split()[1:] ) )
+            if line.startswith( "TREE:" ):
+                tm.tree = line[6:].strip() 
+            if line.startswith( "RATE_MAT:" ):
+                matrix = zeros( (tm.radix,tm.radix), float )
+                for i in range( len( tm.alphabet ) ):
+                    matrix[i] = map( float, input.next().split() )
+                tm.matrix = matrix
+        return tm
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/phylo/newick.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/phylo/newick.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/phylo/newick.py (revision 3)
@@ -0,0 +1,97 @@
+"""
+Support for parsing phylogenetic tree's in newick format.
+
+TODO: Tree/Edge should be a generic data structure, not newick specific.
+"""
+
+from bx_extras.pyparsing import *
+
+__all__ = [ "Tree", "Edge", "NewickParser", "newick_parser" ]
+
+def indent( s ):
+    return "\n".join( "    " + line for line in s.split( "\n" ) )
+
+def print_( p, s ):
+    print p, type(s), s
+    return s
+
+class Tree( object ):
+    def __init__( self, label, edges=None ):
+        self.label = label
+        self.edges = edges
+    def pretty( self ):
+        if self.edges:
+            return "Tree( '%s',\n%s\n)" % ( self.label, indent( "\n".join( repr( edge ) for edge in self.edges ) ) )
+        else:
+            return "Tree( '%s' )" % self.label
+    def __cmp__( self, other ):
+        if isinstance( other, Tree ):
+            return cmp( self.__dict__, other.__dict__ )
+        else:
+            return 1
+    def __repr__( self ):
+        return "Tree( %s, %s )" % ( repr( self.label ), repr( self.edges ) )
+
+class Edge( object ):
+    def __init__( self, length, tip ):
+        self.length = length
+        self.tip = tip
+    def pretty( self ):
+        return "Edge( %s, \n%s\n)" % ( repr( self.length ), indent( repr( self.tip ) ) )
+    def __cmp__( self, other ):
+        if isinstance( other, Edge ):
+            return cmp( self.__dict__, other.__dict__ )
+        else:
+            return 1
+    def __repr__( self ):
+        return "Edge( %s, %s )" % ( repr( self.length ), repr( self.tip ) )
+
+def create_parser():
+    """
+    Create a 'pyparsing' parser for newick format trees roughly based on the
+    grammer here:
+        http://evolution.genetics.washington.edu/phylip/newick_doc.html
+        
+    Problems:
+        - Is a single leaf a valid tree?
+        - Branch length on root? Doesn't make sense to me, and forces the root
+          to be an edge.
+    """
+    # Basic tokens
+    real = Combine( Word( "+-" + nums, nums ) + 
+                    Optional( "." + Optional( Word( nums ) ) ) +
+                    Optional( CaselessLiteral( "E" ) + Word( "+-" + nums, nums ) ) )
+    lpar = Suppress( "(" ) 
+    rpar = Suppress( ")" )
+    colon = Suppress( ":" )
+    semi = Suppress( ";" )
+    quot = Suppress( "'" )
+    # Labels are either unquoted or single quoted, if unquoted underscores will be replaced with spaces
+    quoted_label = QuotedString( "'", None, "''" ).setParseAction( lambda s, l, t: t[0] )
+    simple_label = Word( alphas + nums + "_." ).setParseAction( lambda s, l, t: t[0].replace( "_", " " ) )
+    label = quoted_label | simple_label
+    # Branch length is a real number (note though that exponents are not in the spec!)
+    branch_length = real.setParseAction( lambda s, l, t: float( t[0] ) )
+    # Need to forward declare this due to circularity
+    node_list = Forward()
+    # A node might have an list of edges (for a subtree), a label, and/or a branch length
+    node = ( Optional( node_list, None ) + Optional( label, "" ) + Optional( colon + branch_length, None ) ) \
+        .setParseAction( lambda s, l, t: Edge( t[2], Tree( t[1] or None, t[0] ) ) )
+    node_list << ( lpar + delimitedList( node ) + rpar ) \
+        .setParseAction( lambda s, l, t: [ t.asList() ] )
+    # The root cannot have a branch length
+    tree = ( node_list + Optional( label, "" ) + semi )\
+        .setParseAction( lambda s, l, t: Tree( t[1] or None, t[0] ) )
+    # Return the outermost element
+    return tree
+
+class NewickParser( object ):
+    """
+    Class wrapping a parser for building Trees from newick format strings
+    """
+    def __init__( self ):
+        self.parser = create_parser()
+    def parse_string( self, s ):
+        return self.parser.parseString( s )[0]
+
+newick_parser = NewickParser()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/phylo/phast_tests.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/phylo/phast_tests.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/phylo/phast_tests.py (revision 3)
@@ -0,0 +1,36 @@
+"""
+Tests for `bx.phylo.phast`.
+"""
+
+import unittest
+from StringIO import StringIO
+from bx.phylo.phast import TreeModel
+from numpy import *
+
+test_data = """ALPHABET: A C G T - 
+ORDER: 0
+SUBST_MOD: HKY85+Gap
+TRAINING_LNL: -178667772.836697
+BACKGROUND: 0.227006 0.169993 0.169307 0.227262 0.206432 
+RATE_MAT:
+  -0.971735    0.122443    0.465361    0.163692    0.220238 
+   0.163508   -1.130351    0.121949    0.624656    0.220238 
+   0.623952    0.122443   -1.130326    0.163692    0.220238 
+   0.163508    0.467247    0.121949   -0.972942    0.220238 
+   0.242187    0.181362    0.180630    0.242461   -0.846640 
+TREE: ((((((hg16:0.007738,panTro1:0.008356):0.027141,(baboon:0.009853,rheMac1:0.010187):0.035049):0.103138,galago:0.174770):0.019102,((rn3:0.092633,mm6:0.089667):0.273942,rabbit:0.230839):0.021927):0.023762,(canFam1:0.204637,(elephant:0.123777,tenrec:0.278910):0.085977):0.009439):0.306466,monDom1:0.401151)mammals;
+"""
+
+def test_parser():
+    tm = TreeModel.from_file( StringIO( test_data ) )
+    assert tm.alphabet == ( 'A', 'C', 'G', 'T', '-' )
+    assert tm.order == 0
+    assert tm.subst_mod == "HKY85+Gap"
+    assert allclose( tm.background, [ 0.227006, 0.169993, 0.169307, 0.227262, 0.206432 ] )
+    assert allclose( tm.matrix, array( 
+        [ [ -0.971735,  0.122443,   0.465361,   0.163692,   0.220238 ],
+          [ 0.163508,  -1.130351,   0.121949,   0.624656,   0.220238 ],
+          [ 0.623952,   0.122443,  -1.130326,   0.163692,   0.220238 ],
+          [ 0.163508,   0.467247,   0.121949,  -0.972942,   0.220238 ],
+          [ 0.242187,   0.181362,   0.180630,   0.242461,  -0.846640 ] ] ) )
+    assert tm.tree == "((((((hg16:0.007738,panTro1:0.008356):0.027141,(baboon:0.009853,rheMac1:0.010187):0.035049):0.103138,galago:0.174770):0.019102,((rn3:0.092633,mm6:0.089667):0.273942,rabbit:0.230839):0.021927):0.023762,(canFam1:0.204637,(elephant:0.123777,tenrec:0.278910):0.085977):0.009439):0.306466,monDom1:0.401151)mammals;"
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/phylo/newick_tests.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/phylo/newick_tests.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/phylo/newick_tests.py (revision 3)
@@ -0,0 +1,33 @@
+"""
+Tests for `bx.phylo.newick`.
+"""
+
+from bx.phylo.newick import *
+import unittest
+
+trees = [ r"(B:6.0,(A:5.0,C:3.0,'Foo ''bar':4.0)Q_X:5.0,D:11.0)label;",
+          "((raccoon:19.19959,bear:6.80041):0.84600,((sea_lion:11.99700, seal:12.00300):7.52973,(( monkey:100.85930,cat:47.14069):20.59201, weasel:18.87953):2.09460):3.87382,dog:25.46154);",
+          "(Bovine:0.69395,(Gibbon:0.36079,(Orang:0.33636,(Gorilla:0.17147,(Chimp:0.19268, Human:0.11927):0.08386):0.06124):0.15057):0.54939,Mouse:1.21460);",
+          "(Bovine:0.69395,(Hylobates:0.36079,(Pongo:0.33636,(G._Gorilla:0.17147, (P._paniscus:0.19268,H._sapiens:0.11927):0.08386):0.06124):0.15057):0.54939, Rodent:1.21460);",
+          "(B,(A,C,E),D);",
+          "(,(,,),);",
+          "(A,(B,C),D);",
+          "((A,D),(C,B));"
+]
+
+results = [ ( Tree( 'label', [Edge( 6.0, Tree( 'B', None ) ), Edge( 5.0, Tree( 'Q X', [Edge( 5.0, Tree( 'A', None ) ), Edge( 3.0, Tree( 'C', None ) ), Edge( 4.0, Tree( "Foo 'bar", None ) )] ) ), Edge( 11.0, Tree( 'D', None ) )] ) ),
+            ( Tree( None, [Edge( 0.84599999999999997, Tree( None, [Edge( 19.199590000000001, Tree( 'raccoon', None ) ), Edge( 6.8004100000000003, Tree( 'bear', None ) )] ) ), Edge( 3.8738199999999998, Tree( None, [Edge( 7.5297299999999998, Tree( None, [Edge( 11.997, Tree( 'sea lion', None ) ), Edge( 12.003, Tree( 'seal', None ) )] ) ), Edge( 2.0945999999999998, Tree( None, [Edge( 20.592009999999998, Tree( None, [Edge( 100.8593, Tree( 'monkey', None ) ), Edge( 47.140689999999999, Tree( 'cat', None ) )] ) ), Edge( 18.879529999999999, Tree( 'weasel', None ) )] ) )] ) ), Edge( 25.461539999999999, Tree( 'dog', None ) )] ) ),
+            ( Tree( None, [Edge( 0.69394999999999996, Tree( 'Bovine', None ) ), Edge( 0.54939000000000004, Tree( None, [Edge( 0.36079, Tree( 'Gibbon', None ) ), Edge( 0.15057000000000001, Tree( None, [Edge( 0.33635999999999999, Tree( 'Orang', None ) ), Edge( 0.061240000000000003, Tree( None, [Edge( 0.17147000000000001, Tree( 'Gorilla', None ) ), Edge( 0.083860000000000004, Tree( None, [Edge( 0.19267999999999999, Tree( 'Chimp', None ) ), Edge( 0.11927, Tree( 'Human', None ) )] ) )] ) )] ) )] ) ), Edge( 1.2145999999999999, Tree( 'Mouse', None ) )] ) ),
+            ( Tree( None, [Edge( 0.69394999999999996, Tree( 'Bovine', None ) ), Edge( 0.54939000000000004, Tree( None, [Edge( 0.36079, Tree( 'Hylobates', None ) ), Edge( 0.15057000000000001, Tree( None, [Edge( 0.33635999999999999, Tree( 'Pongo', None ) ), Edge( 0.061240000000000003, Tree( None, [Edge( 0.17147000000000001, Tree( 'G. Gorilla', None ) ), Edge( 0.083860000000000004, Tree( None, [Edge( 0.19267999999999999, Tree( 'P. paniscus', None ) ), Edge( 0.11927, Tree( 'H. sapiens', None ) )] ) )] ) )] ) )] ) ), Edge( 1.2145999999999999, Tree( 'Rodent', None ) )] ) ),
+            ( Tree( None, [Edge( None, Tree( 'B', None ) ), Edge( None, Tree( None, [Edge( None, Tree( 'A', None ) ), Edge( None, Tree( 'C', None ) ), Edge( None, Tree( 'E', None ) )] ) ), Edge( None, Tree( 'D', None ) )] ) ),
+            ( Tree( None, [Edge( None, Tree( None, None ) ), Edge( None, Tree( None, [Edge( None, Tree( None, None ) ), Edge( None, Tree( None, None ) ), Edge( None, Tree( None, None ) )] ) ), Edge( None, Tree( None, None ) )] ) ),
+            ( Tree( None, [Edge( None, Tree( 'A', None ) ), Edge( None, Tree( None, [Edge( None, Tree( 'B', None ) ), Edge( None, Tree( 'C', None ) )] ) ), Edge( None, Tree( 'D', None ) )] ) ),
+            ( Tree( None, [Edge( None, Tree( None, [Edge( None, Tree( 'A', None ) ), Edge( None, Tree( 'D', None ) )] ) ), Edge( None, Tree( None, [Edge( None, Tree( 'C', None ) ), Edge( None, Tree( 'B', None ) )] ) )] ) ),
+            ]
+
+def tests(): 
+    for i in range(len(trees)):
+        def _( s, r ):
+            assert newick_parser.parse_string( s ) == r
+        _.description = "check tree parsing " + str(i)
+        yield _, trees[i], results[i] 
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/seqmapping.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/seqmapping.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/seqmapping.py (revision 3)
@@ -0,0 +1,94 @@
+"""
+Classes for char-to-int mapping and int-to-int mapping.
+
+:Author: James Taylor (james@bx.psu.edu)
+
+The char-to-int mapping can be used to translate a list of strings
+over some alphabet to a single int array (example for encoding a multiple
+sequence alignment).
+
+The int-to-int mapping is particularly useful for creating partitions,
+and provides methods to merge/split symbols in the output mapping.
+
+The two forms of mapping can be combined, for example to encode a 
+multiple sequence alignment in a reduced alphabet defined by a partition
+of alignment columns. Many of the helper methods provided are for 
+solving such alignment oriented problems. 
+
+This code was originally written for the `ESPERR`_ project which includes
+software for searcing for alignment encodings that work well for specific
+classification problems using various Markov chain classifiers over the
+reduced encodings.
+
+Most of the core implementation is in the pyrex/C extension 
+"_seqmapping.pyx" for performance reasons (specifically to avoid the
+excessive bounds checking that would make a sequence/array lookup heavy
+problem like this slow in pure python).
+
+.. _ESPERR: http://www.bx.psu.edu/projects/esperr/
+"""
+
+from _seqmapping import *
+
+# Char->Int mapping for DNA characters with missing data
+                
+DNA = CharToIntArrayMapping()
+DNA.set_mapping( "a", 0 )
+DNA.set_mapping( "A", 0 )
+DNA.set_mapping( "c", 1 )
+DNA.set_mapping( "C", 1 )
+DNA.set_mapping( "g", 2 )
+DNA.set_mapping( "G", 2 )
+DNA.set_mapping( "t", 3 )
+DNA.set_mapping( "T", 3 )
+DNA.set_mapping( "-", 4 )
+DNA.set_mapping( "*", 5 )
+
+# Creating mappings
+
+def alignment_mapping_from_file( f, char_mapping=DNA ):
+    """
+    Create a mapping from a file of alignment columns.
+    """    
+    columns, symbols = [], []
+    for line in f:
+        column, symbol = line.split()
+        columns.append( column )
+        symbols.append( int( symbol ) )
+                
+    align_count = len( columns[0] )
+        
+    mapping = IntToIntMapping( char_mapping.get_out_size() ** align_count )
+        
+    for column, symbol in zip( columns, symbols ):
+        index = char_mapping.translate_list( list( column ) )[0]
+        mapping.set_mapping( index, symbol )
+
+    return align_count, mapping
+
+def second_mapping_from_file( f, first_mapping, char_mapping=DNA ):
+        
+    columns, symbols = [], []
+    for line in f:
+        column, symbol = line.split()
+        columns.append( column )
+        symbols.append( int( symbol ) )
+                
+    align_count = len( columns[0] )
+        
+    mapping = IntToIntMapping( first_mapping.get_out_size() )
+        
+    for column, symbol in zip( columns, symbols ):
+        index = char_mapping.translate_list( list( column ) )[0]
+        if first_mapping[index] >= 0:
+            mapping.set_mapping( first_mapping[index], symbol )
+
+    return mapping
+
+
+def identity_mapping( size ):
+    mapping = IntToIntMapping( size )
+    for i in range( size ):
+        mapping.set_mapping( i, i )
+    return mapping    
+    
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/interval_index_file.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/interval_index_file.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/interval_index_file.py (revision 3)
@@ -0,0 +1,503 @@
+"""
+Classes for index files that map genomic intervals to values.
+
+:Authors: James Taylor (james@bx.psu.edu), Bob Harris (rsharris@bx.psu.edu)
+
+An interval index file maps genomic intervals to values.
+
+This implementation writes version 1 file format, and reads versions 0 and 1.
+
+Index File Format
+-----------------
+
+All fields are in big-endian format (most significant byte first).
+
+All intervals are origin-zero, inclusive start, exclusive end.
+
+The file begins with an index file header, then is immediately followed
+by an index table.  The index table points to index headers, and index
+headers point to bins.  Index headers and bins are referenced via pointers
+(file offsets), and can be placed more or less anywhere in the file.
+
+File header
+~~~~~~~~~~~
+
+============ ===========   =================================================
+offset 0x00: 2C FF 80 0A   magic number
+offset 0x04: 00 00 00 01   version (00 00 00 00 is also supported)
+offset 0x08: 00 00 00 2A   (N) number of index sets
+offset 0x0C:  ...          index table
+============ ===========   =================================================
+
+Index table
+~~~~~~~~~~~
+
+The index table is a list of N index headers, packed sequentially and
+sorted by name.  The first begins at offset 0x0C.  Each header describes
+one set of intervals.
+
+============ ===========   =================================================
+offset:      xx xx xx xx   (L) length of index src name
+offset+4:     ...          index src name (e.g. canFam1.chr1)
+offset+4+L:  xx xx xx xx   offset (in this file) to index data
+offset+8+L:  xx xx xx xx   (B) number of bytes in each value;  for version 
+                           0, this field is absent, and B is assumed to be 4
+============ ===========   =================================================
+
+Index data
+~~~~~~~~~~
+
+The index data for (for one index table) consists of the overall range of
+intervals followed by an array of pointers to bins.  The length of the
+array is 1+binForRange(maxEnd-1,maxEnd), where maxEnd is the maximum
+interval end.
+
+============ ===========   =================================================
+offset:      xx xx xx xx   minimum interval start
+offset+4:    xx xx xx xx   maximum interval end
+offset+8:    xx xx xx xx   offset (in this file) to bin 0
+offset+12:   xx xx xx xx   number of intervals in bin 0
+offset+16:   xx xx xx xx   offset (in this file) to bin 1
+offset+20:   xx xx xx xx   number of intervals in bin 1
+...          ...           ...
+============ ===========   =================================================
+
+Bin
+~~~
+
+A bin is an array of (start,end,val), sorted by increasing start (with
+end and val as tiebreakers).  Note that bins may be empty (the number of
+intervals indicated in the index data is zero).  Note that B is determined
+from the appropriate entry in the index table.
+
+============ ===========   =================================================
+offset:      xx xx xx xx   start for interval 1
+offset+4:    xx xx xx xx   end   for interval 1
+offset+8:     ...          (B bytes) value for interval 1
+offset+8+B:  xx xx xx xx   start for interval 2
+offset+12+B: xx xx xx xx   end   for interval 2
+offset+16+B:  ...          (B bytes) value for interval 2
+...          ...           ...
+============ ===========   =================================================
+"""
+
+from bisect import *
+from struct import *
+
+from bx.misc import filecache
+
+try:
+    from bx.misc import seekbzip2
+except:
+    seekbzip2 = None
+    
+try:
+    from bx.misc import seeklzop
+except:
+    seeklzop = None
+
+import os.path
+
+__all__ = [ 'Indexes', 'Index' ]
+
+MAGIC = 0x2cff800a
+VERSION = 2
+
+# These three constants determine the structure of the default binning strategy
+BIN_LEVELS = 6        # Number of levels of bins to build
+BIN_FIRST_SHIFT = 17  # Number of bits for the bottom level bin 
+BIN_NEXT_SHIFT = 3    # Number of bits for each higher level bin
+
+# Build offset and max size arrays for each bin level
+BIN_OFFSETS = [ 1, 0 ]
+BIN_OFFSETS_MAX = [ ( 1 << BIN_FIRST_SHIFT << BIN_NEXT_SHIFT ), ( 1 << BIN_FIRST_SHIFT ) ]
+for i in range( BIN_LEVELS - 2 ):
+    BIN_OFFSETS.insert( 0, ( 2 ** (3*(i+1)) ) + BIN_OFFSETS[0] )
+    BIN_OFFSETS_MAX.insert( 0, ( BIN_OFFSETS_MAX[0] << BIN_NEXT_SHIFT ) )
+# The maximum size for the top bin is actually bigger than the signed integers
+# we use to store positions in the file, so we'll change it to prevent confusion
+BIN_OFFSETS_MAX[ 0 ] = max
+
+# Constants for the minimum and maximum size of the overall interval
+MIN = 0                     
+OLD_MAX = 512*1024*1024     # Maximum size supported by versions < 2 
+DEFAULT_MAX = 512*1024*1024 # Default max size to use when none is passed
+MAX = ( 2 ** 31 )           # Absolute max size (limited by file format)
+
+def offsets_for_max_size( max_size ):
+    """
+    Return the subset of offsets needed to contain intervals over (0,max_size)
+    """
+    for i, max in enumerate( reversed( BIN_OFFSETS_MAX ) ):
+        if max_size < max:
+            break
+    else:
+        raise Exception( "%d is larger than the maximum possible size (%d)" % ( max_size, BIN_OFFSETS_MAX[0] ) )
+    return BIN_OFFSETS[ ( len(BIN_OFFSETS) - i - 1 ) : ]
+
+def bin_for_range( start, end, offsets=None ):
+    """Find the smallest bin that can contain interval (start,end)"""
+    if offsets is None:
+        offsets = BIN_OFFSETS
+    start_bin, end_bin = start, end - 1
+    start_bin >>= BIN_FIRST_SHIFT
+    end_bin >>= BIN_FIRST_SHIFT
+    for offset in offsets:
+        if start_bin == end_bin:
+            return offset + start_bin
+        else:
+            start_bin >>= BIN_NEXT_SHIFT
+            end_bin >>= BIN_NEXT_SHIFT
+    raise "Interval (%d,%d) out of range"
+
+class AbstractMultiIndexedAccess( object ):
+    """
+    Allows accessing multiple indexes / files as if they were one
+    """
+    indexed_access_class = None
+    def __init__( self, filenames, index_filenames=None, keep_open=False, use_cache=False, **kwargs ):
+        # TODO: Handle index_filenames argument
+        self.indexes = [ self.new_indexed_access( fname, keep_open=keep_open, use_cache=use_cache, **kwargs ) \
+            for fname in filenames ]
+    def new_indexed_access( self, data_filename, index_filename=None, keep_open=False, **kwargs ):
+        return self.indexed_access_class( data_filename, index_filename, keep_open, **kwargs )
+    def get( self, src, start, end ):
+        return [block for block in self.get_as_iterator( src, start, end )]
+    def get_as_iterator( self, src, start, end ):
+        for block, index, offset in self.get_as_iterator_with_index_and_offset( src, start, end ):
+            yield block
+    def get_as_iterator_with_index_and_offset( self, src, start, end ):
+        for index in self.indexes:
+            for block, idx, offset in index.get_as_iterator_with_index_and_offset( src, start, end ):
+                yield block, idx, offset
+    def close( self ):
+        for index in self.indexes:
+            index.close()
+
+class AbstractIndexedAccess( object ):
+    """Indexed access to a data using overlap queries, requires an index file"""
+
+    def __init__( self, data_filename, index_filename=None, keep_open=False, use_cache=False, **kwargs ):
+        self.data_kwargs = kwargs
+        self.data_filename = data_filename
+        if data_filename.endswith( ".bz2" ):
+            if seekbzip2 is None:
+                raise Exception( "Trying to open .bz2 file but no seekbzip2 module found")
+            table_filename = data_filename + "t"
+            self.table_filename = table_filename
+            if not os.path.exists( table_filename ):
+                raise Exception( "Cannot find bz2t file for: " + data_filename )
+            self.file_type = "bz2t"
+            # Strip .bz2 from the filename before adding ".index"
+            data_filename_root = data_filename[:-4]
+        elif data_filename.endswith( ".lzo" ):
+            if seeklzop is None:
+                raise Exception( "Trying to open .lzo file but no seeklzop module found")
+            table_filename = data_filename + "t"
+            self.table_filename = table_filename
+            if not os.path.exists( table_filename ):
+                raise Exception( "Cannot find lzot file for: " + data_filename )
+            self.file_type = "lzot"
+            # Strip .lzo from the filename before adding ".index"
+            data_filename_root = data_filename[:-4]
+        else:
+            self.file_type = "plain"
+            data_filename_root = data_filename
+        # Open index
+        if index_filename is None: 
+            index_filename = data_filename_root + ".index"
+        self.indexes = Indexes( filename=index_filename )
+        # Use a file cache?
+        self.use_cache = use_cache
+        # Open now?
+        if keep_open: 
+            self.f = self.open_data()
+        else:
+            self.f = None
+
+    def close( self ):
+        if self.f:
+            self.f.close()
+            self.f = None
+
+    def open_data( self ):
+        if self.file_type == "plain":
+            return open( self.data_filename )
+        elif self.file_type == "bz2t":
+            f = seekbzip2.SeekableBzip2File( self.data_filename, self.table_filename )
+            if self.use_cache:
+                return filecache.FileCache( f, f.size )
+            else:
+                return f
+        elif self.file_type == "lzot":
+            if self.use_cache:
+                block_cache_size = 20
+            else:
+                block_cache_size = 0
+            f = seeklzop.SeekableLzopFile( self.data_filename, 
+                                           self.table_filename,
+                                           block_cache_size = block_cache_size )
+            return f
+
+    def get( self, src, start, end ):
+        return [ val for val in self.get_as_iterator( src, start, end ) ]
+    def get_as_iterator( self, src, start, end ):
+        for val, index, offset in self.get_as_iterator_with_index_and_offset( src, start, end ):
+            yield val
+    def get_as_iterator_with_index_and_offset( self, src, start, end ):
+        for val_start, val_end, val in self.indexes.find( src, start, end ):
+            yield self.get_at_offset( val ), self, val
+
+    def get_at_offset( self, offset ):
+        if self.f:
+            self.f.seek( offset )
+            return self.read_at_current_offset( self.f, **self.data_kwargs )
+        else:
+            f = self.open_data()
+            try:
+                f.seek( offset )
+                return self.read_at_current_offset( f, **self.data_kwargs ) 
+            finally:
+                f.close()
+                
+    def read_at_current_offset( self, file, **kwargs ):
+        raise TypeError( "Abstract Method" )
+
+class Indexes:
+    """A set of indexes, each identified by a unique name"""
+
+    def __init__( self, filename=None ):
+        self.indexes = dict()
+        if filename is not None: self.open( filename )
+
+    def add( self, name, start, end, val, max=DEFAULT_MAX ):
+        if name not in self.indexes:
+            self.indexes[name] = Index( max=max )
+        self.indexes[name].add( start, end, val )
+
+    def get( self, name ):
+        if self.indexes[name] is None:
+            offset, value_size = self.offsets[name]
+            self.indexes[name] = Index( filename=self.filename, offset=offset, value_size=value_size, version=self.version )
+        return self.indexes[name]
+
+    def find( self, name, start, end ):
+        if name in self.indexes:
+            return self.get( name ).find( start, end )
+        else:
+            return []
+
+    def open( self, filename ):
+        self.filename = filename
+        self.offsets = dict()  # (will map key to (offset,value_size))
+        f = open( filename )
+        magic, version, length = read_packed( f, ">3I" )
+        if magic != MAGIC:
+            raise "File does not have expected header"
+        if version > VERSION:
+            warn( "File claims version %d, I don't known anything about versions beyond %d. Attempting to continue", version, VERSION )
+        self.version = version
+        for i in range( length ):
+            key_len = read_packed( f, ">I" )
+            key = f.read( key_len )
+            offset = read_packed( f, ">I" )
+            if version == 0:
+                value_size = 4
+            else:
+                value_size = read_packed( f, ">I" )
+                assert value_size % 4 == 0, "unsupported value size: %s" % value_size
+            self.indexes[ key ] = None
+            self.offsets[ key ] = (offset,value_size)
+        f.close()
+
+    def write( self, f ):
+        keys = self.indexes.keys()
+        keys.sort()
+        # First determine the size of the header
+        base = calcsize( ">3I" )
+        for key in keys:
+            key = str( key )
+            base += calcsize( ">I" )
+            base += len( key )
+            base += calcsize( ">2I" )
+        # Now actually write the header
+        write_packed( f, ">3I", MAGIC, VERSION, len( self.indexes ) )
+        # And write the index table
+        for key in keys:
+            key = str( key )
+            # Write the string prefixed by its length (pascal!)
+            write_packed( f, ">I", len( key ) )
+            f.write( key )
+            # Write offset
+            write_packed( f, ">I", base )
+            base += self.indexes[key].bytes_required()
+            # Write value size
+            write_packed( f, ">I", self.indexes[key].value_size )
+        # And finally write each index in order
+        for key in keys:
+            self.indexes[key].write( f )
+
+class Index:
+
+    def __init__( self, min=MIN, max=DEFAULT_MAX, filename=None, offset=0, value_size=None, version=None ):
+        self._value_size = value_size
+        self.max_val = 1   # (1, rather than 0, to force value_size > 0)
+        if filename is None:
+            self.new( min, max )
+        else:
+            self.open( filename, offset, version )
+
+    def get_value_size ( self ):
+        if self._value_size != None:
+            return self._value_size
+        else:
+            return round_up_to_4( bytes_of( self.max_val ) )
+    value_size = property( fget=get_value_size )
+
+    def new( self, min, max ):
+        """Create an empty index for intervals in the range min, max"""
+        # Ensure the range will fit given the shifting strategy
+        assert MIN <= min <= max <= MAX
+        self.min = min
+        self.max = max
+        # Determine offsets to use
+        self.offsets = offsets_for_max_size( max )
+        # Determine the largest bin we will actually use
+        self.bin_count = bin_for_range( max - 1, max, offsets = self.offsets ) + 1
+        # Create empty bins
+        self.bins = [ [] for i in range( self.bin_count ) ]
+
+    def open( self, filename, offset, version ):
+        self.filename = filename
+        self.offset = offset
+        # Open the file and seek to where we expect our header
+        f = open( filename )
+        f.seek( offset )
+        # Read min/max
+        min, max = read_packed( f, ">2I" )
+        self.new( min, max )
+        # Decide how many levels of bins based on 'max'
+        if version < 2:
+            # Prior to version 2 all files used the bins for 512MB
+            self.offsets = offsets_for_max_size( OLD_MAX - 1 )
+        else:
+            self.offsets = offsets_for_max_size( max )
+        # Read bin indexes
+        self.bin_offsets = []
+        self.bin_sizes = []
+        for i in range( self.bin_count ):
+            o, s = read_packed( f, ">2I" )
+            self.bin_offsets.append( o )
+            self.bin_sizes.append( s )
+        # Initialize bins to None, indicating that they need to be loaded
+        self.bins = [ None for i in range( self.bin_count ) ]
+
+    def add( self, start, end, val ):
+        """Add the interval (start,end) with associated value val to the index"""
+        insort( self.bins[ bin_for_range( start, end, offsets=self.offsets ) ], ( start, end, val ) )
+        assert val >= 0
+        self.max_val = max(self.max_val,val)
+
+    def find( self, start, end ):
+        rval = []
+        start_bin = ( max( start, self.min ) ) >> BIN_FIRST_SHIFT
+        end_bin = ( min( end, self.max ) - 1 ) >> BIN_FIRST_SHIFT
+        for offset in self.offsets:
+            for i in range( start_bin + offset, end_bin + offset + 1 ):
+                if self.bins[i] is None: self.load_bin( i )
+                # Iterate over bin and insert any overlapping elements into return value
+                for el_start, el_end, val in self.bins[i]:
+                    if el_start < end and el_end > start:
+                        insort_right( rval, ( el_start, el_end, val ) )
+            start_bin >>= BIN_NEXT_SHIFT
+            end_bin >>= BIN_NEXT_SHIFT
+        return rval
+
+    def iterate( self ):
+        for i in range( self.bin_count ):
+            if self.bins[i] is None: self.load_bin( i )
+            for entry in self.bins[i]:  yield entry
+
+    def load_bin( self, index ):
+        bin = []
+        if self.bin_sizes[index] == 0:
+            self.bins[index] = bin
+            return
+        f = open( self.filename )
+        f.seek( self.bin_offsets[index] )
+        # One big read for happy NFS
+        item_size = self.value_size + calcsize( ">2I" )
+        buffer = f.read( self.bin_sizes[index] * item_size )
+        for i in range( self.bin_sizes[index] ):
+            start, end = unpack( ">2I", buffer[ i*item_size : i*item_size+8 ] )
+            val = unpack_uints( buffer[ i*item_size+8 : (i+1)*item_size ] )
+            bin.append( (start, end, val) )
+        self.bins[index] = bin
+        f.close()
+
+    def write( self, f ):
+        value_size = self.value_size
+        item_size = value_size + calcsize( ">2I" )
+        # Write min/max
+        write_packed( f, ">2I", self.min, self.max )
+        # Write table of bin sizes and offsets
+        base = f.tell() + self.bin_count * calcsize( ">2I" )
+        for bin in self.bins:
+            write_packed( f, ">2I", base, len( bin ) )
+            base += len( bin ) * item_size
+        # Write contents of each bin
+        for bin in self.bins:
+            for start, end, val in bin:
+                write_packed( f, ">2I", start, end )
+                write_packed_uints( f, val, value_size )
+
+    def bytes_required( self ):
+        item_size = self.value_size + calcsize( ">2I" )
+        rval = calcsize( ">2I" )
+        rval += self.bin_count * calcsize( ">2I" )
+        for bin in self.bins:
+            rval += len( bin ) * item_size
+        return rval
+
+def write_packed( f, pattern, *vals ):
+    f.write( pack( pattern, *vals ) )
+
+def read_packed( f, pattern ):
+    rval = unpack( pattern, f.read( calcsize( pattern ) ) )
+    if len( rval ) == 1: return rval[0]
+    return rval
+
+def write_packed_uints( f, v, num_bytes ):
+    if num_bytes < 4:
+        write_packed( f, ">I", v )
+    else:
+        parts = []
+        while num_bytes > 0:
+            parts.append( v & 0xFFFFFFFFL )
+            v >>= 32
+            num_bytes -= 4
+        parts.reverse() # (write most-significant chunk first)
+        write_packed( f, ">%dI" % len( parts ), *parts )
+
+def unpack_uints( parts ):
+    chunks = len( parts )/4
+    vals = unpack( ">%dI" % chunks, parts )
+    val = vals[0]
+    for v in vals[1:]:
+        val = (val << 32) + v
+    return val
+
+def bytes_of( v ):
+    assert v > 0
+    b = 0
+    while v > 0:
+        v >>= 8
+        b += 1
+    return b
+
+def round_up_to_4( v ):
+    if v % 4 == 0:
+        return v
+    else:
+        return v + 4 - (v % 4)
+
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/bitset_utils.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/bitset_utils.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/bitset_utils.py (revision 3)
@@ -0,0 +1,74 @@
+"""
+Utility functions for working with `Bitset`s and treating lists of (start,end)
+as `Bitset`s.
+"""
+
+from bx.bitset import *
+
+def bitset_intersect( ex1, ex2 ):
+    bits1 = list2bits( ex1 )
+    bits2 = list2bits( ex2 )
+    bits1.iand( bits2 )
+    return bits2list( bits1 )
+
+def bitset_subtract( ex1, ex2 ):
+    bits1 = list2bits( ex1 )
+    bits2 = list2bits( ex2 )
+    bits2.invert()
+    bits1.iand( bits2 )
+    return bits2list( bits1 )
+
+def list2bits( ex ):
+    bits = BinnedBitSet(MAX)
+    for start,end  in ex:
+        bits.set_range( start, end - start )
+    return bits
+
+def bits2list( bits ):
+    ex = []
+    end = 0
+    while 1:
+        start = bits.next_set( end )
+        if start == bits.size: break
+        end = bits.next_clear( start )
+        ex.append( (start, end) )
+    return ex
+
+def bitset_complement( exons ):
+    bits = BinnedBitSet(MAX)
+    introns = []
+    for start, end in exons:
+        bits.set_range( start, end - start )
+    bits.invert()
+
+    # only complement within the range of the list
+    ex_start = min( [a[0] for a in exons] )
+    ex_end = max( [a[1] for a in exons] )
+    end = ex_start
+    len = ex_end
+    while 1:
+            start = bits.next_set( end )
+            if start == bits.size: break
+            end = bits.next_clear( start )
+            if end > len: end = len
+            if start != end:
+                introns.append( (start,end ) )
+            if end == len: break
+    return introns 
+
+def bitset_interval_intersect( bits, istart, iend ):
+    rval = []
+    end = istart
+    len = iend
+    while 1:
+        start = bits.next_set( end )
+        if start >= len: break
+        end = bits.next_clear( start )
+        if start != end:
+            rval.append( (start,end) )
+        if end >= len: break
+    return rval
+
+def bitset_union( exons ):
+    bits = list2bits( exons )
+    return bits2list( bits )
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/arrays/bed.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/arrays/bed.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/arrays/bed.py (revision 3)
@@ -0,0 +1,7 @@
+def __bootstrap__():
+   global __bootstrap__, __loader__, __file__
+   import sys, pkg_resources, imp
+   __file__ = pkg_resources.resource_filename(__name__,'bed.so')
+   __loader__ = None; del __bootstrap__, __loader__
+   imp.load_dynamic(__name__,__file__)
+__bootstrap__()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/arrays/array_tree.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/arrays/array_tree.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/arrays/array_tree.py (revision 3)
@@ -0,0 +1,7 @@
+def __bootstrap__():
+   global __bootstrap__, __loader__, __file__
+   import sys, pkg_resources, imp
+   __file__ = pkg_resources.resource_filename(__name__,'array_tree.so')
+   __loader__ = None; del __bootstrap__, __loader__
+   imp.load_dynamic(__name__,__file__)
+__bootstrap__()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/arrays/wiggle.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/arrays/wiggle.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/arrays/wiggle.py (revision 3)
@@ -0,0 +1,7 @@
+def __bootstrap__():
+   global __bootstrap__, __loader__, __file__
+   import sys, pkg_resources, imp
+   __file__ = pkg_resources.resource_filename(__name__,'wiggle.so')
+   __loader__ = None; del __bootstrap__, __loader__
+   imp.load_dynamic(__name__,__file__)
+__bootstrap__()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/arrays/__init__.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/arrays/__init__.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/arrays/__init__.py (revision 3)
@@ -0,0 +1,3 @@
+"""
+Classes for working with arrays of data.
+"""
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/arrays/array_tree_tests.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/arrays/array_tree_tests.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/arrays/array_tree_tests.py (revision 3)
@@ -0,0 +1,117 @@
+import sys, os
+import unittest
+import tempfile
+try:
+    sys.path.insert(0, os.path.dirname(os.path.dirname(__file__)))
+except:
+    sys.path.insert(0, os.path.dirname(os.path.abspath(".")))
+
+from bx.arrays.array_tree import ArrayTree, FileArrayTree, FileArrayTreeDict, array_tree_dict_from_reader
+from bx.arrays.bed import BedReader
+from bx.arrays.wiggle import WiggleReader
+
+class TestArrayTree(unittest.TestCase):
+    def setUp(self):
+        tree = ArrayTree(10000, 10) # max value of 10000, each block has 10 numbers
+        for i in range(5000):
+            tree[i] = i
+        
+        # Insert extra copies to test frequency
+        for i in range(3000):
+            tree[i] = i
+        
+        tree.set_range(5000, 9001, 100)
+        tree.root.build_summary()
+        
+        d = {'test': tree}
+        f = tempfile.TemporaryFile()
+        FileArrayTreeDict.dict_to_file( d, f )
+        f.seek(0)
+        self.filearraytreedict = FileArrayTreeDict(f)
+        self.filearraytree = self.filearraytreedict['test']
+        
+    def test_get_summary(self):
+        f = self.filearraytree
+        lvl1 = f.get_summary(0, 1)
+        self.assertEqual( map(float, lvl1.sums/lvl1.counts), [4.5, 14.5, 24.5, 34.5, 44.5, 54.5, 64.5, 74.5, 84.5, 94.5])
+        lvl2 = f.get_summary(0, 2)
+        self.assertEqual( map(float, lvl2.sums/lvl2.counts), [49.5, 149.5, 249.5, 349.5, 449.5, 549.5, 649.5, 749.5, 849.5, 949.5])
+        lvl3 = f.get_summary(0, 3)
+        self.assertEqual( map(float, lvl3.sums/lvl3.counts), [499.5, 1499.5, 2499.5, 3499.5, 4499.5, 100.0, 100.0, 100.0, 100.0, 100.0])
+        lvl2_2 = f.get_summary(3000, 2)
+        self.assertEqual( map(float, lvl2_2.sums/lvl2_2.counts), [3049.5, 3149.5, 3249.5, 3349.5, 3449.5, 3549.5, 3649.5, 3749.5, 3849.5, 3949.5])
+        
+    def test_get_leaf(self):
+        f = self.filearraytree
+        from_start = [int(i) for i in f.get_leaf(0)]
+        from_middle = [int(i) for i in f.get_leaf(5)]
+        self.assertEqual(from_start, from_middle)
+        self.assertEqual(from_start, range(10))
+        
+        from_start = [int(i) for i in f.get_leaf(4999)]
+        self.assertEqual(from_start, range(4990, 5000))
+        
+        from_start = [int(i) for i in f.get_leaf(9600)]
+        self.assertEqual(from_start, [])
+        
+    def test_big(self):
+        tree = ArrayTree(2147483647, 1000) # What we use for tracks
+        for i in range(5000):
+            tree[i] = i
+        
+        # Insert extra copies to test frequency
+        for i in range(3000):
+            tree[i] = i
+        
+        tree.set_range(5000, 9001, 100)
+        tree.set_range(14000000, 15000000, 200)
+        tree.root.build_summary()
+        
+        d = {'test': tree}
+        f = tempfile.TemporaryFile()
+        FileArrayTreeDict.dict_to_file( d, f )
+        f.seek(0)
+        at = FileArrayTreeDict(f)['test']
+        
+        lvl1 = at.get_summary(14000000, 1)
+        avgs = map(float, lvl1.sums/lvl1.counts)
+        self.assertEqual( len(avgs), 1000 )
+        self.assertEqual( avgs, [ 200 for i in range(0, 1000)] )
+    
+    
+#    def create_bed(self):
+#        reader = BedReader( open( "22.bed.txt" ) )
+#        temp = tempfile.TemporaryFile()
+#        
+#        d = array_tree_dict_from_reader( reader, {}, block_size = 1000 )
+#
+#        for array_tree in d.itervalues():
+#            array_tree.root.build_summary()
+#
+#        FileArrayTreeDict.dict_to_file( d, open("tree.at", "w"), no_leaves=True ) # just summaries
+#        
+#    def test_bed(self):
+#        # self.create_bed()
+#        print "bed"
+#        at = FileArrayTreeDict( open( "tree.at" ) )['chr22']
+#        print map(, at.get_summary(14000000, 1).frequencies)
+        
+    
+    def test_get_frequencies(self):
+        f = self.filearraytree
+        self.assertEqual( map(float, f.get_summary(0, 1).frequencies), ([20] * 10) )
+        self.assertEqual( map(float, f.get_summary(4000, 1).frequencies), ([10] * 10) )
+        self.assertEqual( map(float, f.get_summary(0, 2).frequencies), ([200] * 10) )
+        self.assertEqual( map(int, f.get_summary(0, 3).frequencies), [2000, 2000, 2000, 1000, 1000, 1000, 1000, 1000, 1000, 1] )
+    
+    def test_wrong_dictkey(self):
+        self.assertRaises(KeyError, self.filearraytreedict.__getitem__, "non-existing")
+        
+    def test_higher_level_than_tree(self):
+        f = self.filearraytree
+        self.assertEqual(3, f.levels)
+        self.assertRaises(ValueError, f.get_summary, 0, 4)
+        
+
+if __name__ == '__main__':
+    unittest.main()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/bitset_tests.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/bitset_tests.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/bitset_tests.py (revision 3)
@@ -0,0 +1,112 @@
+"""
+Tests for `bx.bitset`.
+"""
+
+import bx.bitset
+import unittest
+
+class AbstractTests( object ):
+
+    def assert_bits( self, bits, list ):
+        assert bits.size == len( list ), "Bitset size and verification list size do not match"
+        for i in range( bits.size ):
+            self.assertEquals( bits[i], list[i] )
+
+    def test_overflow_create( self ):
+        self.assertRaises( ValueError, self.new_bits, 4000000000 )
+        
+    def test_overflow_access( self ):
+        bits = self.new_bits( 100 )
+        self.assertRaises( IndexError, bits.set, -5 )
+        self.assertRaises( IndexError, bits.set, 110 )
+
+    def test_access( self ):
+        # Create and assert empty
+        bits = self.new_bits( 100 )
+        l = [ 0 ] * 100
+        self.assert_bits( bits, l )
+        # Set some positions
+        for pos in ( 11, 14, 70, 16 ):
+            bits.set( pos )
+            l[ pos ] = 1
+        # Clear some positions
+        for pos in ( 14, 80, 16 ):
+            bits.clear( pos )
+            l[ pos ] = 0
+        self.assert_bits( bits, l )
+
+    def test_range_access( self ):
+        # Create and assert empty
+        bits = self.new_bits( 100 )
+        l = [ 0 ] * 100
+        self.assert_bits( bits, l )
+        # Set some positions
+        for b, e in ( ( 11, 14 ), (20,75), (90,99) ):
+            bits.set_range( b, e-b)
+            for pos in range( b, e ): l[ pos ] = 1
+        self.assert_bits( bits, l )
+
+    def test_count( self ):
+        # Create and assert empty
+        bits = self.new_bits( 100 )
+        # Set some positions
+        for b, e in ( ( 11, 14 ), (20,75), (90,100) ):
+            bits.set_range( b, e-b)
+        self.assertEquals( bits.count_range( 0, 0 ), 0 )
+        self.assertEquals( bits.count_range( 0, 20 ), 3 )
+        self.assertEquals( bits.count_range( 25, 25 ), 25 )
+        self.assertEquals( bits.count_range( 80, 20 ), 10 )
+        self.assertEquals( bits.count_range( 0, 100 ), 68 )
+
+    def test_find( self ):
+        # Create and assert empty
+        bits = self.new_bits( 100 )
+        # Set some positions
+        for b, e in ( ( 11, 14 ), (20,75), (90,100) ):
+            bits.set_range( b, e-b)
+        # Next set
+        self.assertEquals( bits.next_set( 0 ), 11 )
+        self.assertEquals( bits.next_set( 13 ), 13 )
+        self.assertEquals( bits.next_set( 15 ), 20 )
+        # Next clear
+        self.assertEquals( bits.next_clear( 0 ), 0 )
+        self.assertEquals( bits.next_clear( 11 ), 14 )
+        self.assertEquals( bits.next_clear( 20 ), 75 )
+        self.assertEquals( bits.next_clear( 92 ), 100 )
+
+    def test_and( self ):
+        bits1 = self.new_bits( 100 )
+        bits2 = self.new_bits( 100 )
+        bits1.set_range( 20, 40 )
+        bits2.set_range( 50, 25 )
+        bits1.iand( bits2 )
+        l = [0]*100
+        for i in range( 50, 60 ): l[i] = 1
+        self.assert_bits( bits1, l )
+    
+    def test_or( self ):
+        bits1 = self.new_bits( 100 )
+        bits2 = self.new_bits( 100 )
+        bits1.set_range( 20, 40 )
+        bits2.set_range( 50, 25 )
+        bits1.ior( bits2 )
+        l = [0]*100
+        for i in range( 20, 75 ): l[i] = 1
+        self.assert_bits( bits1, l )
+        
+    def test_not( self ):
+        bits = self.new_bits( 100 )
+        bits.set_range( 20, 40 )
+        bits.invert()
+        l = [1]*100
+        for i in range( 20, 60 ): l[i] = 0
+        self.assert_bits( bits, l )
+        
+class BitSetTests( AbstractTests, unittest.TestCase ):
+    def new_bits( self, size ):
+        return bx.bitset.BitSet( size ) 
+
+class BinnedBitSetTests( AbstractTests, unittest.TestCase ):
+    def new_bits( self, size ):
+        granularity = size % 11 
+        return bx.bitset.BinnedBitSet( size, granularity ) 
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/intseq/ngramcount.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/intseq/ngramcount.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/intseq/ngramcount.py (revision 3)
@@ -0,0 +1,7 @@
+def __bootstrap__():
+   global __bootstrap__, __loader__, __file__
+   import sys, pkg_resources, imp
+   __file__ = pkg_resources.resource_filename(__name__,'ngramcount.so')
+   __loader__ = None; del __bootstrap__, __loader__
+   imp.load_dynamic(__name__,__file__)
+__bootstrap__()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/intseq/__init__.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/intseq/__init__.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/intseq/__init__.py (revision 3)
@@ -0,0 +1,3 @@
+"""
+Tools for working with strings over interger alphabets efficiently. 
+"""
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/pwm/bed_score_aligned_pwm.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/pwm/bed_score_aligned_pwm.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/pwm/bed_score_aligned_pwm.py (revision 3)
@@ -0,0 +1,87 @@
+#!/usr/bin/env python2.4
+"""
+Returns all positions of a maf with any pwm score > threshold
+The positions are projected onto human coordinates
+"""
+
+import psyco_full
+from bx.align import maf as align_maf
+import position_weight_matrix as pwmx
+from bx.pwm.pwm_score_maf import MafBlockScorer
+import sys
+from bx import intervals
+import Numeric
+
+def isnan(x):
+    return not x==x
+
+def main():
+
+    if len(sys.argv) < 5:
+        print >>sys.stderr, "%s bedfile inmaf spec1,spec2,... motif_file " % sys.argv[0]
+        sys.exit(0)
+
+    # read in intervals
+    regions = {}
+    for line in open( sys.argv[1] ):
+        if line.startswith('#'): continue
+        fields = line.strip().split()
+        chrom, start, end = fields[0], int( fields[1] ), int( fields[2] )
+        try:
+            name = fields[3]
+        except:
+            name = None
+        if chrom not in regions: regions[chrom] = intervals.Intersecter()
+        regions[chrom].add( start, end, name )
+
+    pwm = {}
+    for wm in pwmx.Reader(open( sys.argv[4] )):
+        pwm[ wm.id] = wm
+        print >>sys.stderr, wm.id, len(wm)
+
+    inmaf = open(sys.argv[2])
+    threshold = 0.5
+
+    species = []
+
+    for sp in sys.argv[3].split(','):
+        species.append( sp )
+
+    for maf in align_maf.Reader(inmaf):
+        mafchrom = maf.components[0].src.split('.')[1]
+        mafstart = maf.components[0].start
+        mafend = maf.components[0].end
+        reftext = maf.components[0].text
+
+        # maf block scores for each matrix
+        for scoremax,width,headers in MafBlockScorer(pwm,species, maf):
+            #print >>sys.stderr,headers
+            blocklength = width
+            mafsrc,mafstart,mafend = headers[0]
+            mafchrom = mafsrc.split('.')[1]
+
+            # lists of scores for each position in scoremax
+            for mx_name,mx in scoremax.items():
+                #print >>sys.stderr, mx_name, len(pwm[mx_name])
+
+                for offset in range(blocklength):
+    
+                    # scan all species with threshold
+                    for i in range(len(species)):
+                        if mx[i][offset] > threshold:
+                            refstart = mafstart + offset - reftext.count('-',0,offset)
+                            refend = refstart + len(pwm[mx_name])
+
+                            data = " ".join([ "%.2f" % mx[x][offset] for x in range(len(species))])
+                            # quote the motif
+                            r = regions[mafchrom].find( refstart, refend )
+                            if mafchrom in regions and len( r ) > 0:
+                                region_label = r[0].value
+                            else:
+                                #region_label = 0
+                                continue
+                            v_name = mx_name.replace(' ','_')
+                            print mafchrom,refstart,refend,region_label,v_name,data
+                            break
+
+if __name__ == '__main__': main()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/pwm/_position_weight_matrix.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/pwm/_position_weight_matrix.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/pwm/_position_weight_matrix.py (revision 3)
@@ -0,0 +1,7 @@
+def __bootstrap__():
+   global __bootstrap__, __loader__, __file__
+   import sys, pkg_resources, imp
+   __file__ = pkg_resources.resource_filename(__name__,'_position_weight_matrix.so')
+   __loader__ = None; del __bootstrap__, __loader__
+   imp.load_dynamic(__name__,__file__)
+__bootstrap__()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/pwm/bed_score_aligned_string.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/pwm/bed_score_aligned_string.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/pwm/bed_score_aligned_string.py (revision 3)
@@ -0,0 +1,86 @@
+#!/usr/bin/env python2.4
+"""
+Returns all positions of a maf with any pwm score > threshold
+The positions are projected onto human coordinates
+"""
+
+import psyco_full
+from bx.align import maf as align_maf
+import position_weight_matrix as pwmx
+from bx.pwm.pwm_score_maf import MafMotifScorer
+import sys
+from bx import intervals
+import Numeric
+
+def isnan(x):
+    return not x==x
+
+def main():
+
+    if len(sys.argv) < 5:
+        print >>sys.stderr, "%s bedfile inmaf spec1,spec2,... string [string2,...]" % sys.argv[0]
+        sys.exit(0)
+
+    # read in intervals
+    regions = {}
+    for line in open( sys.argv[1] ):
+        if line.startswith('#'): continue
+        fields = line.strip().split()
+        chrom, start, end = fields[0], int( fields[1] ), int( fields[2] )
+        try:
+            name = fields[3]
+        except:
+            name = None
+        if chrom not in regions: regions[chrom] = intervals.Intersecter()
+        regions[chrom].add( start, end, name )
+
+    motif_strings = sys.argv[4:]
+    if not isinstance(motif_strings, list): motif_strings = [motif_strings]
+    inmaf = open(sys.argv[2])
+    threshold = 0.5
+
+    species = []
+
+    for sp in sys.argv[3].split(','):
+        species.append( sp )
+
+    for maf in align_maf.Reader(inmaf):
+        mafchrom = maf.components[0].src.split('.')[1]
+        mafstart = maf.components[0].start
+        mafend = maf.components[0].end
+        reftext = maf.components[0].text
+        r = regions[mafchrom].find( mafstart, mafend )
+        if mafchrom not in regions or len( r ) == 0: continue
+
+        # maf block scores for each matrix
+        for scoremax,width,headers in MafMotifScorer(species, maf, motif_strings):
+            #print >>sys.stderr,headers
+            blocklength = width
+            mafsrc,mafstart,mafend = headers[0]
+            mafchrom = mafsrc.split('.')[1]
+
+            # lists of scores for each position in scoremax
+            for mx_name,mx in scoremax.items():
+                #print >>sys.stderr, mx_name, len(pwm[mx_name])
+
+                for offset in range(blocklength):
+    
+                    # scan all species with threshold
+                    for i in range(len(species)):
+                        if mx[i][offset] > threshold:
+                            refstart = mafstart + offset - reftext.count('-',0,offset)
+                            refend = refstart + len(mx_name)
+
+                            data = " ".join([ "%.2f" % mx[x][offset] for x in range(len(species))])
+                            # quote the motif
+                            r = regions[mafchrom].find( refstart, refend )
+                            if mafchrom in regions and len( r ) > 0:
+                                region_label = r[0].value
+                            else:
+                                #region_label = 0
+                                continue
+                            v_name = mx_name.replace(' ','_')
+                            print mafchrom,refstart,refend,region_label,v_name,data
+                            break
+
+if __name__ == '__main__': main()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/pwm/__init__.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/pwm/__init__.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/pwm/__init__.py (revision 3)
@@ -0,0 +1,7 @@
+"""
+Data structures and tools for working with Position Weight Matrices (PWMs).
+
+TODO: Some of the packages in this directory are actually command line
+programs that provide no library functions and should be moved to the
+scripts directory.
+"""
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/pwm/position_weight_matrix.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/pwm/position_weight_matrix.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/pwm/position_weight_matrix.py (revision 3)
@@ -0,0 +1,849 @@
+#!/usr/bin/env python
+
+import sys
+import math
+import string
+from numpy import *
+from sets import *
+
+# This is the average of all species in the alignment outside of exons
+#        > mean(r)
+#        A         T         C         G
+#        0.2863776 0.2878264 0.2129560 0.2128400
+#        > sd(r)
+#        A          T          C          G
+#        0.01316192 0.01371148 0.01293836 0.01386655
+
+ENCODE_NONCODING_BACKGROUND = { 'A':0.2863776,'T':0.2878264,'G':0.2128400,'C':0.2129560}
+
+class Align(object):
+    def __init__ (self, seqrows, headers=None):
+        self.rows = seqrows
+        self.nrows = len(seqrows)
+        ncol = None
+        for rownum,row in enumerate(self.rows):
+            try:
+                if ncol == None: ncol = len(row)
+                elif ncol != len(row):
+                    raise "Align: __init__:alignment block:row %d does not have %d columns, it has %d" % (rownum,ncol,len(row))
+            except:
+                print row
+                raise ''
+        self.ncols = ncol
+        self.dims = (self.nrows,self.ncols)
+        self.headers = headers
+    def __str__ (self):
+        return "\n".join(self.rows)
+
+class AlignScoreMatrix (object):
+    def __init__(self,align):
+        nan = float('nan')
+
+        matrix = zeros((align.nrows,align.ncols),float32)
+        
+        # set to nans
+        for ir in range( len(matrix) ):
+            for ic in range(len( matrix[ir] )):
+                matrix[ir][ic] = nan
+        self.matrix = matrix
+
+    def __len__(self):
+        return shape(self.matrix)[1]
+
+    def __str__(self):
+        print self.matrix
+
+def score_align_motif (align,motif,gapmask=None,byPosition=True):
+
+    #dbg
+    #print >>sys.stderr, align.headers
+    chr,chr_start,chr_stop = align.headers[0]
+
+    # a blank score matrix
+    nrows,ncols = align.dims
+    ascoremax = AlignScoreMatrix( align )
+    scoremax = ascoremax.matrix
+
+    minSeqLen = len( motif )
+    for ir in range(nrows):
+        pass
+
+        # row is missing data
+        if isnan(align.rows[ir][0]): continue
+
+        for start in range(ncols):
+
+            if align.rows[ir][start] == '-': continue
+            elif align.rows[ir][start] == 'n': continue
+            elif align.rows[ir][start] == 'N': continue
+
+            # get enough sequence for the weight matrix
+            subseq = ""
+            end = 0
+            ic = start
+            while len(subseq) < minSeqLen:
+            #for ic in range(start,ncols):
+
+                if ic >= len(align.rows[ir]): break
+                char = align.rows[ir][ic].upper()
+                ic += 1
+                if char == '-' or char == 'N': continue
+                else: subseq += char
+
+            if len(subseq) == minSeqLen:
+                end = ic+1
+                for_score = int( match_consensus(subseq,motif) )
+                revseq = reverse_complement( subseq )
+                rev_score = int( match_consensus(revseq,motif) )
+
+                score = max(for_score, rev_score)
+                #dbg
+                #if ir == 0: print >>sys.stderr, int(chr_start) + start - align.rows[ir].count('-',0,start), subseq, score
+
+                # replace the alignment positions with the result
+                if byPosition:
+                    scoremax[ir][start] = score
+                else:
+                # replace positions matching the width of the pwm
+                    for i in range(start,end):
+                        if isnan(scoremax[ir][i]): scoremax[ir][i] = score
+                        elif score > scoremax[ir][i]: scoremax[ir][i] = score
+                #break
+    # mask gap characters
+    if gapmask == None:
+        gapmask = score_align_gaps(align)
+    putmask( scoremax, gapmask, float('nan') )
+    return scoremax
+
+#-----------
+#
+# WeightMatrix--
+#    A position weight matrix (PWM) representation of a motif.
+#
+#----------
+# construction arguments:
+#   id:         id (name) of the motif
+#   rows:       the matrix;  each row is a hash from symbol to weight, with
+#               .. the weight in string form
+#   alphabet:   symbols allowed
+#   background: hash from symbol to background probability of that symbol;  if
+#               .. not specified, ENCODE_NONCODING_BACKGROUND is used
+# internal fields:
+#   rows:       the matrix;  each row is a hash from symbol to log-odds score
+#               .. of that symbol for that row of the weight matrix
+#   counts:     the matrix;  count[row][sym] is the weight, as an integer
+#   probs:      the matrix;  probs[row][sym] is the weight, as an probability
+#----------
+
+class PositionWeightMatrix (object):
+
+    complementMap = string.maketrans("ACGTacgt","TGCAtgca")
+
+    # IUPAC-IUB
+    symbols = {
+        'A':Set(['A']),
+        'C':Set(['C']),
+        'G':Set(['G']),
+        'T':Set(['T']),
+        'R':Set(['A','G']),
+        'Y':Set(['C','T']),
+        'M':Set(['A','C']),
+        'K':Set(['G','T']),
+        'S':Set(['G','C']),
+        'W':Set(['A','T']),
+        'H':Set(['A','C','T']),
+        'B':Set(['G','T','C']),
+        'V':Set(['G','C','A']),
+        'D':Set(['G','T','A'])}
+
+    def __init__ (self, id, rows, alphabet, background=None, score_correction=True):
+
+        self.id       = id
+        self.alphabet = alphabet
+        nsymbols = len(self.alphabet)
+        for i in range(len(self.alphabet)):
+            self.alphabet[ i ] = self.alphabet[ i ].upper()
+        if background != None:
+            self.background = background
+        else:
+            self.background = {}
+            sorted_alphabet = []
+            sorted_alphabet[:] = self.alphabet[:]
+            sorted_alphabet.sort()
+            if ['A','C','G','T'] == sorted_alphabet:
+                self.background = ENCODE_NONCODING_BACKGROUND
+            else:
+                for x in self.alphabet: self.background[ x ] = float(1)/len(self.alphabet)
+
+        if (score_correction == True):
+            self.score_correction = self.corrected_probability_score
+        else:
+            self.score_correction = self.simple_probability
+
+        # partition counts from consensus symbol
+        # in order to properly handle scaling in the presense of non-integers,
+        # we prescan the matrix to figure out the largest scale factor, then go
+        # back through and scale 'em all (some rows may be integer counts,
+        # others may be probabilities)
+
+        self.consensus = []
+        scale = 1
+
+        for i in range(len(rows)):
+
+            #try:
+            fields,consensus = rows[i][:nsymbols],rows[i][-1]
+            for x,count in enumerate(fields):
+                try:
+                    (w,s) = self.parse_weight(count)
+                except ValueError:
+                    raise "pwm row %s has bad weight %s" % (" ".join(fields),t)
+
+                # replace row counts with (values,scale)
+                rows[i][x] = (w,s)
+                scale = max(s,scale)
+
+            #except:
+                #print >>sys.stderr,rows
+                #raise ValueError
+                #raise ValueError, "pwm row %s has wrong field count" % " ".join(fields)
+
+            self.consensus.append(consensus)
+
+
+        hashRows = []
+        self.matrix_base_counts = {} # for pseudocounts
+        self.counts = [] # for scaled counts
+        self.probs = [] # for probabilities
+
+        # scale counts to integers
+        for i in range(len(rows)):
+            hashRows.append(dict())
+            for x,sym in enumerate(alphabet):
+                (w,s) = rows[i][x]
+                hashRows[i][sym] = w * scale/s
+                assert hashRows[i][sym] >= 0
+                if sym not in self.matrix_base_counts: self.matrix_base_counts[sym] = 0
+                self.matrix_base_counts[sym] += hashRows[i][sym]
+            self.counts.append( hashRows[i].copy() )
+            self.probs.append( hashRows[i].copy() )
+            totalWeight = float(sum(self.probs[i].values()))
+            for sym in self.probs[i]:
+                self.probs[i][sym] /= totalWeight
+        self.sites = sum ( hashRows[0].values() )
+
+        # scan pwm to pre-compute logs of probabilities and min and max log-odds
+        # scores (over the whole PWM) for scaling;  note that the same min and max
+        # applies for scaling long-odds scores for quantum comparisions
+        self.information_content = []
+        minSum = 0
+        maxSum = 0
+
+        for i in range( len( hashRows )):
+            self.information_content.append( self.information_content_calculation( i, hashRows ) )
+            newHashRow = {}
+            for base in self.alphabet:
+                newHashRow[base] = self.pwm_score(base, i, hashRows)
+            hashRows[i] = newHashRow
+
+            minSum += min(hashRows[i].values())
+            maxSum += max(hashRows[i].values())
+
+        self.minSum = minSum
+        self.maxSum = maxSum
+        self.rows = hashRows
+
+    # Reference 1: Wasserman and Sandelin: Nat Rev Genet. 2004 Apr;5(4):276-87.
+    # Reference 2: Gertz et al.: Genome Res. 2005 Aug;15(8):1145-52.
+    def information_content_calculation(self, i, counts):
+        # Reference 1)
+        return 2 + sum( [ self.information_base_content(base,i,counts) for base in self.alphabet ] )
+
+        # Reference 2)
+        #return sum( [ self.information_base_content(base,i,counts) for base in self.alphabet ] )
+
+    def information_base_content(self, base, i, counts):
+
+        # Reference 1)
+        #return self.score_correction(counts,base,i) * math.log ( self.score_correction(counts,base,i), 2)
+
+        # Reference 2)
+        return self.score_correction(counts,base,i) * self.pwm_score(base, i, counts)
+
+    def __call__ (self,seq):
+        return self.score_seq(seq)
+
+    def __add__ (self,other):
+
+        assert self.alphabet == other.alphabet
+        r,(p,q) = self.max_correlation(other)
+
+        if p == q == 0: width = max( len(self),len(other) )
+        elif p > 0: width = max( len(other)+p, len(self) )
+        elif q > 0: width = max( len(self)+q, len(other) )
+
+        sumx = zeros( (width,len(self.alphabet)),dtype='int')
+        selfx = self.to_count_matrix()
+        otherx = other.to_count_matrix()
+
+        if p == q == 0:
+            sumx[:len(self)] += selfx
+            sumx[:len(other)] += otherx
+        elif p > 0:
+            sumx[p:p+len(other)] += otherx
+            sumx[:len(self)] += selfx
+        else:
+            sumx[:len(other)] += otherx
+            sumx[q:q+len(self)] += selfx
+
+        newRows = []
+        for i,x in enumerate(sumx):
+            y = list(x)
+            y.append( consensus_symbol(y) )
+            y = [ str(yi) for yi in y]
+            newRows.append( y )
+        return PositionWeightMatrix(self.id+other.id,newRows,self.alphabet,self.background)
+
+    def __old_add__ (self,other,maxp=None):
+
+        assert self.alphabet == other.alphabet
+        bigN = max(len(self),len(other))
+        smallN = min(len(self),len(other))
+        if not maxp:
+            prsq = self.correlation(other)
+            maxp = prsq.index( max(prsq) )
+
+        leftpad = ' ' * maxp
+        rightsize = bigN - smallN
+        rightpad = ' ' * rightsize
+        leftStrings = []
+        rightStrings = []
+
+        if len(self) > len(other):
+            larger = self
+            smaller = other
+            leftStrings = self.consensus
+            rightStrings = list(leftpad) + other.consensus + list(rightpad)
+        else:
+            smaller = self
+            larger = other
+            leftStrings = list(leftpad) + self.consensus + list(rightpad)
+            rightStrings = other.consensus
+
+        sumx = zeros([bigN,len(self.alphabet)])
+        sumx += larger.to_count_matrix()
+        sumx[maxp:maxp+smallN] += smaller.to_count_matrix()
+
+        newRows = []
+        for i,x in enumerate(sumx):
+            y = list(x)
+            y.append( leftStrings[i] + rightStrings[i] )
+            y = [ str(yi) for yi in y]
+            newRows.append( y )
+
+        #return PositionWeightMatrix(self.id+other.id,newRows[maxp:maxp+smallN],self.alphabet,self.background)
+        return PositionWeightMatrix(self.id+other.id,newRows,self.alphabet,self.background)
+
+    def to_matrix(self):
+        m = zeros([len(self),len(self.alphabet)])
+        for i in range(len(self)):
+            for j,a in enumerate(self.alphabet):
+                m[i][j] = self[i][a]
+        return m
+
+    def to_count_matrix(self):
+        m = zeros([len(self),len(self.alphabet)],dtype='int')
+        for i in range(len(self)):
+            for j,a in enumerate(self.alphabet):
+                m[i][j] = self.counts[i][a]
+        return m
+
+    def max_correlation(self, otherwmx):
+        rsq,ixtuple = self.slide_correlation(otherwmx)
+        max_rsq = max(rsq)
+        maxp,maxq = ixtuple[rsq.index(max_rsq)]
+        return max_rsq,(maxp,maxq)
+
+    def slide_correlation(self, other):
+        assert self.alphabet == other.alphabet
+        selfx = self.to_count_matrix()
+        otherx = other.to_count_matrix()
+        rsq = []
+        ixtuple = []
+        # self staggered over other, scan self backwards until flush
+        for q in range(len(other)-1,-1,-1):
+            r = 0
+            n = 0
+            for p in range(len(self)):
+                if q+p < len(other):
+                    r += rsquared( list(selfx[p]), list(otherx[q+p]) )
+                    n += 1
+                else:
+                    n += 1
+            rsq.append( r/n )
+            ixtuple.append( (0,q) )
+        # other staggered below self , scan other forward
+        for p in range(1,len(self)):
+            r = 0
+            n = 0
+            for q in range(len(other)):
+                if p+q < len(self):
+                    r += rsquared( list(selfx[p+q]), list(otherx[q]) )
+                    n += 1
+                else:
+                    n += 1
+            rsq.append( r/n )
+            ixtuple.append( (p,0) )
+        return rsq,ixtuple
+
+    def correlation(self, otherwmx):
+        assert self.alphabet == otherwmx.alphabet
+        width = len(self.alphabet)
+        if len(self) > len(otherwmx):
+            larger = self.to_count_matrix()
+            smaller = otherwmx.to_count_matrix()
+        else:
+            smaller = self.to_count_matrix()
+            larger = otherwmx.to_count_matrix()
+        bigN = len(larger)
+        smallN = len(smaller)
+        position_rsq = []
+
+        # slide small over large, for ave rsq
+        for p in range(bigN):
+            if p+smallN <= bigN:
+                r = 0
+                for q in range(smallN):
+                    r += rsquared(list(smaller[q]),list(larger[p+q]))
+                position_rsq.append( r / smallN )
+        return position_rsq
+
+    def score_align (self,align,gapmask=None,byPosition=True):
+
+        # a blank score matrix
+        nrows,ncols = align.dims
+        ascoremax = AlignScoreMatrix( align )
+        scoremax = ascoremax.matrix
+
+        minSeqLen = len( self )
+        for ir in range(nrows):
+
+            # row is missing data
+            if isnan(align.rows[ir][0]): continue
+
+            for start in range(ncols):
+                if align.rows[ir][start] == '-': continue
+                elif align.rows[ir][start] == 'n': continue
+                elif align.rows[ir][start] == 'N': continue
+
+                # get enough sequence for the weight matrix
+                subseq = ""
+                end = 0
+                for ic in range(start,ncols):
+
+                    char = align.rows[ir][ic]
+                    if char == '-' or char == 'N': continue
+                    else: subseq += char
+
+                    if len(subseq) == minSeqLen:
+                        end = ic+1
+
+                        #forward
+                        scores = self.score_seq( subseq )
+                        raw,forward_score = scores[0]
+                        #reverse
+                        scores = self.score_reverse_seq( subseq )
+                        raw,reverse_score = scores[0]
+
+                        score = max(forward_score, reverse_score)
+
+                        # replace the alignment positions with the result
+                        if byPosition:
+                            scoremax[ir][start] = score
+                        else:
+                        # replace positions matching the width of the pwm
+                            for i in range(start,end):
+                                if isnan(scoremax[ir][i]): scoremax[ir][i] = score
+                                elif score > scoremax[ir][i]: scoremax[ir][i] = score
+        # mask gap characters
+        if gapmask == None:
+            gapmask = score_align_gaps(align)
+        putmask( scoremax, gapmask, float('nan') )
+        return scoremax
+
+    # seq can be a string, a list of characters, or a quantum sequence (a list
+    # of hashes from symbols to probability)
+
+    def score_seq(self,seq):
+        if (type(seq[0]) == dict):
+            return self.score_quantum_seq(seq)
+ 
+        scores = []
+        for start in range( len(seq)):
+            if start + len(self) > len(seq): break
+            subseq = seq[ start:start+len(self) ]
+            raw = 0
+            try:
+                for i,nt in enumerate(subseq): raw += self.rows[i][nt.upper()]
+                scaled = self.scaled( raw )
+            except KeyError:
+                raw,scaled = float('nan'),float('nan')
+            scores.append( (raw, scaled) )
+        return scores
+
+    def score_quantum_seq(self,seq):
+        scores = []
+        for start in range(len(seq)):
+            if (start + len(self) > len(seq)): break
+            subseq = seq[start:start+len(self)]
+            raw = 0
+            try:
+                for i,nt in enumerate(subseq):
+                    numer = sum([subseq[i][nt] * self.probs[i][nt]   for nt in subseq[i]])
+                    denom = sum([subseq[i][nt] * self.background[nt] for nt in subseq[i]])
+                    raw += math.log(numer/denom,2)
+                scaled = self.scaled(raw)
+            except KeyError:
+                raw,scaled = float('nan'),float('nan')
+            except OverflowError,e:
+                raw,scaled = float('nan'),float('nan')
+            except ValueError,e:
+                raw,scaled = float('nan'),float('nan')
+            scores.append((raw,scaled))
+        return scores
+
+    def score_reverse_seq(self,seq):
+        revSeq = reverse_complement( seq )
+        scores = self.score_seq( revSeq )
+        scores.reverse()
+        return scores
+
+    def scaled(self,val):
+        return ( val - self.minSum ) / (self.maxSum - self.minSum)
+
+    def pseudocount(self, base=None):
+        f = lambda count: math.sqrt( count + 1 )
+        if base in self.alphabet:
+            return f( self.matrix_base_counts[base] )
+        elif base == None:
+            return f ( self.sites )
+        else:
+            return float("nan")
+
+    def simple_probability (self,freq, base, i):
+        # p(base,i) = f(base,i)
+        #             ----------------------
+        #             sum(f(base,{A,C,G,T}))
+
+        return float( freq[i][base] ) / sum([freq[i][nt] for nt in self.alphabet])
+
+    def corrected_probability_score (self,freq, base, i):
+        # p(base,i) = f(base,i) + s(base)
+        #             --------------------
+        #              N + sum(s(A,C,T,G))
+
+        f = float( freq[i][base] )
+        s = self.pseudocount(base)
+        N = self.sites
+        #print >>sys.stderr, "f:%.3f + s:%.3f = %.3f" % (f,s,f + s)
+        #print >>sys.stderr, "-------------------------"
+        #print >>sys.stderr, "N:%d + %d = %d" % (N,self.pseudocount(), N + self.pseudocount())
+        #print >>sys.stderr, "\t\t %.3f\n" % ((f + s) / (N + self.pseudocount()))
+
+        assert (f + s) > 0
+        return (f + s) / (N + self.pseudocount())
+
+    def pwm_score (self,base,i,freq,background=None):
+        if background == None: background = self.background
+        p = self.score_correction(freq,base,i)
+        #print >>sys.stderr, p
+        #print >>sys.stderr, "k %d %c" % (i,base),freq[i][base]
+        b = background[ base ]
+        try:
+            return math.log( p/b, 2)
+        except OverflowError,e:
+            ## print >>sys.stderr,"base=%c, math.log(%.3f / %.3f)" % (base,p,b)
+            ## print >>sys.stderr,self.id
+            return float('nan')
+        except ValueError,e:
+            ## print >>sys.stderr,"base=%c, math.log(%.3f / %.3f)" % (base,p,b)
+            ## print >>sys.stderr,self.id
+            return float('nan')
+
+    def parse_weight (self, weightString):
+
+        fields = weightString.split(".")
+        if (len(fields) > 2): raise ValueError
+
+        w = int(fields[0])
+        s = 1
+
+        if (len(fields) == 2):
+            for cnt in range(0,len(fields[1])): s *= 10
+            w = s*w + int(fields[1])
+
+        return (w,s)    # w = the weight
+                        # s = the scale used (a power of 10)
+
+    def __str__ (self):
+        lines = [self.id]
+        headers = ["%s" % nt for nt in self.alphabet]
+        lines.append("P0\t" + "\t".join(headers))
+        for ix in range(0,len(self.rows)):
+            weights = ["%d" % self.counts[ix][nt] for nt in self.alphabet]
+            #lines.append(("%02d\t" % ix) + "\t".join(weights) + "\t" + self.consensus[ix])
+            lines.append(("%02d\t" % ix) + "\t".join(weights) + "\t" + str(sum(self.counts[ix].values())) + "\t" + self.consensus[ix])
+
+        return "\n".join(lines)
+
+    def __getitem__ (self,key):
+        return self.rows[key]
+
+    def __setitem__ (self,key,value):
+        self.rows[key] = value
+
+    def __len__ (self):
+        return len( self.rows )
+
+def score_align_gaps (align):
+    # a blank score matrix
+    nrows,ncols = align.dims
+    scoremax = AlignScoreMatrix( align ).matrix
+    for ir in range(nrows):
+        # row is missing data
+        if isnan(align.rows[ir][0]): continue
+        # scan for gaps
+        for pos in range(ncols):
+            if align.rows[ir][pos] == '-': scoremax[ir][pos] = 1
+            else: scoremax[ir][pos] = 0
+    return scoremax
+
+#-----------
+#
+# WeightMatrix Reader--
+#    Read position weight matrices (PWM) from a file.
+#
+#-----------
+
+class Reader (object):
+    """Iterate over all interesting weight matrices in a file"""
+
+    def __init__ (self,file,tfIds=None,name=None,format='basic',background=None,score_correction=True):
+        self.tfIds      = tfIds
+        self.file       = file
+        self.name       = name
+        self.lineNumber = 0
+        self.format     = format
+        self.background = background
+        self.score_correction = score_correction
+
+
+    def close (self):
+        self.file.close()
+
+
+    def where (self):
+        if (self.name == None):
+            return "line %d" % self.lineNumber
+        else:
+            return "line %d in %s" % (self.lineNumber,self.name)
+
+
+    def __iter__ (self):
+        if self.format == 'basic':
+            return self.read_as_basic()
+        elif self.format == 'transfac':
+            return self.read_as_transfac()
+        else:
+            raise "unknown weight matrix file format: '%s'" % self.format
+
+    def read_as_basic(self):
+        tfId    = None
+        pwmRows = None
+    
+        alphabet = ['A','C','G','T']
+        while (True):
+            line = self.file.readline()
+            if (not line): break
+            line = line.strip()
+            self.lineNumber += 1
+            if line.startswith(">"):
+                if pwmRows != None:
+                    yield PositionWeightMatrix(tfId,pwmRows,alphabet,background=self.background)
+                    #try:
+                        #yield PositionWeightMatrix(tfId,pwmRows,alphabet)
+                    #except:
+                        #print >>sys.stderr, "Failed to read", tfId
+                tfId = line.strip()[1:]
+                pwmRows = []
+            elif line[0].isdigit():
+                tokens = line.strip().split()
+                tokens.append( consensus_symbol(line) )
+                vals = [float(v) for v in tokens[:-1]]
+                #print >>sys.stderr,[ "%.2f" % (float(v)/sum(vals)) for v in vals], tokens[-1]
+                pwmRows.append( tokens )
+        if pwmRows != None: # we've finished collecting a desired matrix
+            yield PositionWeightMatrix(tfId,pwmRows,alphabet,background=self.background,score_correction=self.score_correction)
+    
+    def read_as_transfac(self):
+        self.tfToPwm = {}
+        tfId    = None
+        pwmRows = None
+    
+        while (True):
+            line = self.file.readline()
+            if (not line): break
+            line = line.strip()
+            self.lineNumber += 1
+            # handle an ID line
+            if line.startswith("ID"):
+                if pwmRows != None: # we've finished collecting a desired matrix
+                    try:
+                        yield PositionWeightMatrix(tfId,pwmRows,alphabet,background=self.background,score_correction=self.score_correction)
+                    except:
+                        print >>sys.stderr, "Failed to read", tfId
+                    tfId    = None
+                    pwmRows = None
+    
+                tokens = line.split (None, 2)
+                if len(tokens) != 2:
+                    raise ValueError, "bad line, need two fields (%s)" % self.where()
+                tfId = tokens[1]
+                if self.tfIds != None and (not tfId in self.tfIds):
+                    continue          # ignore it, this isn't a desired matrix
+                if tfId in self.tfToPwm:
+                    raise ValueError, "transcription factor %s appears twice (%s)" \
+                        % (tfId,self.where())
+                pwmRows = []          # start collecting a desired matrix
+                continue
+    
+            # if we're not collecting, skip this line
+            if pwmRows == None: continue
+            if len(line) < 1:   continue
+
+            # name, if present, added to ID
+            if line.startswith('NA'):
+                words = line.strip().split()
+                tfId =  tfId + "\t" + " ".join(words[1:])
+    
+            # handle a P0 line
+            if line.startswith("P0"):
+                alphabet = line.split()[1:]
+                if len(alphabet) < 2:
+                    raise ValueError, "bad line, need more dna (%s)" % self.where()
+                continue
+    
+            # handle a 01,02,etc. line
+            if line[0].isdigit():
+                tokens = line.split ()
+                try:
+                    index = int(tokens[0])
+                    if index != len(pwmRows)+1: raise ValueError
+                except:
+                    raise ValueError,"bad line, bad index (%s)" % self.where()
+                pwmRows.append(tokens[1:])
+                continue
+            # skip low quality entries
+            if line.startswith("CC  TRANSFAC Sites of quality"):
+                print >>sys.stderr, line.strip(), tfId
+                pwmRows = None
+                continue
+        if pwmRows != None: # we've finished collecting a desired matrix
+            yield PositionWeightMatrix(tfId,pwmRows,alphabet,background=self.background,score_correction=self.score_correction)
+        # clean up
+        self.tfToPwm = None
+
+def isnan(x):
+    #return ieeespecial.isnan(x)
+    if x==x: return False
+    return True
+
+def reverse_complement (nukes):
+    return nukes[::-1].translate(PositionWeightMatrix.complementMap)
+
+def rsquared( x, y ):
+    try:
+        return sum_of_squares(x,y)**2 / (sum_of_squares(x) * sum_of_squares(y))
+    except ZeroDivisionError:
+        #return float('nan')
+        return 0
+
+def sum_of_squares( x,y=None ):
+    if not y: y = x
+    xmean = float(sum( x )) / len( x )
+    ymean = float(sum( y )) / len( y )
+    assert len(x) == len(y)
+    return sum([ float(xi)*float(yi) for xi,yi in zip(x,y)]) - len(x)*xmean*ymean
+
+def match_consensus(sequence,pattern):
+
+    return c_match_consensus( sequence, pattern, len(sequence))
+
+    #for s,p in zip(sequence,pattern):
+        #if p == 'N': continue
+        #if not s in PositionWeightMatrix.symbols[p]: return False
+
+    #return True
+
+def consensus_symbol( pattern ):
+
+    if type(pattern)==type(""):
+        try:
+            pattern = [int(x) for x in pattern.split()]
+        except ValueError,e:
+            print >>sys.stderr, pattern
+            raise ValueError,e
+
+    # IUPAC-IUB nomenclature for wobblers
+    wobblers = {
+        'R':Set(['A','G']),
+        'Y':Set(['C','T']),
+        'M':Set(['A','C']),
+        'K':Set(['G','T']),
+        'S':Set(['G','C']),
+        'W':Set(['A','T']),
+        'H':Set(['A','C','T']),
+        'B':Set(['G','T','C']),
+        'V':Set(['G','C','A']),
+        'D':Set(['G','T','A'])}
+
+    symbols = ['A','C','G','T']
+
+    if type(pattern)==type({}):
+        pattern = [pattern[u] for u in symbols]
+
+    total = sum(pattern)
+    f = [ (space/1e5)+(float(x)/total) for space,x in enumerate(pattern) ]
+    copy = []
+    copy[:] = f[:]
+    copy.sort()
+
+    # http://www.genomatix.de/online_help/help_matinspector/matrix_help.html --
+    # url says consensus must be greater than 50%, and at least twice the freq
+    # of the second-most frequent.  A double-degenerate symbol can be used
+    # if the top two account for 75% or more of the nt, if each is less than 50%
+    # Otherwise, N is used in the consensus.
+    tops = copy[-2:]
+    if tops[1] > 0.5 and tops[1] >= 2 * tops[0]: return symbols[f.index(tops[1])]
+    elif tops[0] < 0.5 and sum(tops) >= 0.75:
+        degen = Set([ symbols[f.index(v)] for v in tops ])
+        for degenSymbol,wobbles in wobblers.items():
+            #print >>sys.stderr,wobbles
+            if degen == wobbles:
+                return degenSymbol
+    else: return 'N'
+    print >>sys.stderr,pattern
+    raise '?'
+
+# import C extensions
+try:
+    from _position_weight_matrix import c_match_consensus
+    ## print >>sys.stderr, "C match_consensus used"
+except:
+    ## print >>sys.stderr, "python match_consensus used"
+    def match_consensus(sequence, pattern, size):
+        for s,p in zip(sequence,pattern):
+            if p == 'N': continue
+            if not s in PositionWeightMatrix.symbols[p]: return False
+
+        return True
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/pwm/pwm_score_motifs.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/pwm/pwm_score_motifs.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/pwm/pwm_score_motifs.py (revision 3)
@@ -0,0 +1,59 @@
+#!/usr/bin/env python2.4
+"""
+Returns all positions of a maf with any pwm score > threshold
+The positions are projected onto human coordinates
+"""
+
+import psyco_full
+from bx.align import maf as align_maf
+import position_weight_matrix as pwmx
+from bx.pwm.pwm_score_maf import MafMotifScorer
+import sys
+from bx import intervals
+
+def isnan(x):
+    return not x==x
+
+def main():
+
+    if len(sys.argv) < 4:
+        print >>sys.stderr, "%s motif inmaf spec1,spec2,... " % sys.argv[0]
+        sys.exit(0)
+
+    targmotif = sys.argv[1]
+    inmaf = open(sys.argv[2])
+    threshold = 0
+
+    species = []
+
+    for sp in sys.argv[3].split(','):
+        species.append( sp )
+
+    for maf in align_maf.Reader(inmaf):
+        mafchrom = maf.components[0].src.split('.')[1]
+        mafstart = maf.components[0].start
+        mafend = maf.components[0].end
+        reftext = maf.components[0].text
+
+        # maf block scores for each matrix
+        for scoremax,width,headers in MafMotifScorer(species, maf,targmotif):
+            #print >>sys.stderr,headers
+            blocklength = width
+            mafsrc,mafstart,mafend = headers[0]
+            mafchrom = mafsrc.split('.')[1]
+
+            # lists of scores for each position in scoremax
+            mx = scoremax
+            for offset in range(blocklength):
+
+                # scan all species with threshold
+                for i in range(len(species)):
+                    if mx[i][offset] > threshold:
+                        refstart = mafstart + offset - reftext.count('-',0,offset)
+                        refend = refstart + len( targmotif )
+                        data = " ".join([ "%.2f" % mx[x][offset] for x in range(len(species))])
+                        # quote the motif
+                        print mafchrom,refstart,refend,"'"+targmotif+"'",data
+                        break
+
+if __name__ == '__main__': main()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/pwm/pwm_score_maf.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/pwm/pwm_score_maf.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/pwm/pwm_score_maf.py (revision 3)
@@ -0,0 +1,218 @@
+#!/usr/bin/python2.4
+import sys,os
+from bx.align import maf as align_maf
+import bx.pwm.position_weight_matrix as pwmx
+
+def isnan(x):
+    #return ieeespecial.isnan(x)
+    if x==x: return False
+    return True
+
+NaN = float('nan')
+#NaN = ieeespecial.nan
+#Inf = ieeespecial.plus_inf
+#NInf = ieeespecial.minus_inf
+
+def main():
+
+    pwm_file = sys.argv[1]
+    splist = sys.argv[2]
+    if len(sys.argv) ==4: 
+        inmaf = open(sys.argv[3])
+    else:
+        inmaf = sys.stdin
+
+    # read alignment species
+    species = []
+    for sp in splist.split(','):
+        species.append( sp )
+
+    # read weight matrices
+    pwm = {}
+    for wm in pwmx.Reader(open( pwm_file ), format='basic'):
+        pwm[ wm.id ] = wm
+
+    fbunch = {}
+    for scoremax,index,headers in MafScorer(pwm, species, inmaf):
+        #print >>sys.stderr, index
+        for k,matrix in scoremax.items():
+            fname = k + '.mx'
+            if fname not in fbunch:
+                fbunch[fname] = open(fname,'w')
+                print >>sys.stderr,"Writing",fname
+
+            for i in range( len(matrix)):
+                for j in range( len(matrix[i])):
+                    print >>fbunch[fname], "%.2f" % matrix[i][j],
+                print >>fbunch[fname]
+
+    for file in fbunch.values():
+        file.close()
+
+def MafScorer(pwm,species,inmaf):
+
+    index = 0
+    scoremax,width = None,None
+    for maf in align_maf.Reader( inmaf ):
+        #try:
+        if True:
+            val = MafBlockScorer(pwm,species,maf)
+            for scoremax,width,headers in val: yield scoremax,index,headers
+            #scoremax,width,headers = MafBlockScorer(pwm,species,maf)
+        try: pass
+        except:
+            print >>sys.stderr, "Failed on:"
+            syserr = align_maf.Writer( sys.stderr )
+            syserr.write( maf )
+            #print >>sys.stderr,headers
+            if width: print >>sys.stderr,width
+            if scoremax: print >>sys.stderr,len(scoremax)
+            syserr.close()
+            sys.exit(1)
+        index += width
+        yield scoremax,index,headers
+
+def MafMotifSelect(mafblock,pwm,motif=None,threshold=0):
+
+    if motif != None and len(motif) != len(pwm): 
+        raise "pwm and motif must be the same length"
+    # generic alignment
+    alignlist = [ c.text for c in mafblock.components ]
+    align = pwmx.Align( alignlist )
+    nrows,ncols = align.dims
+    #chr,chr_start,chr_stop = align.headers[0]
+    # required sequence length
+    minSeqLen = len( motif )
+    # record the text sizes from the alignment rows
+    align_match_lens = []
+
+    for start in range(ncols - minSeqLen):
+        if align.rows[0][start] == '-': continue
+        subseq = ""
+        pwm_score_vec = []
+        motif_score_vec = []
+        max_cols = 0
+        for ir in range(nrows):
+            expanded = align.rows[ir].count( '-', start, minSeqLen)
+            subtext = align.rows[ir][ start : minSeqLen+expanded ]
+            max_cols = max( len(subtext), max_cols )
+            subseq = subtext.replace('-','')
+            revseq = pwmx.reverse_complement(subseq)
+            # pwm score
+            nill,f_score = pwm.score_seq( subseq )[0]
+            r_score, nill = pwm.score_seq( revseq )[0]
+            pwm_score_vec.append( max(f_score, r_score) )
+            # consensus score
+            if motif is not None:
+                for_score = int( pwmx.match_consensus(subseq,motif) )
+                rev_score = int( pwmx.match_consensus(revseq,motif) )
+                motif_score_vec.append( max(for_score, rev_score) )
+        #check threshold
+        try:
+            assert not isnan(max(pwm_score_vec) )
+            assert not isnan(max(motif_score_vec) )
+        except:
+            print >>sys.stderr, pwm_score_vec, motif_score_vec
+            print >>sys.stderr, len(subseq), len(pwm)
+        if max(pwm_score_vec) < threshold: continue
+        if max(motif_score_vec) < threshold: continue
+        # chop block
+        col_start = start
+        col_end = max_cols + 1
+        motifmaf = mafblock.slice( col_start, col_end )
+        yield motifmaf, pwm_score_vec, motif_score_vec
+                
+    """
+    for ir in range(nrows):
+        # scan alignment row for motif subsequences
+        for start in range(ncols):
+            if align.rows[ir][start] == '-': continue
+            elif align.rows[ir][start] == 'n': continue
+            elif align.rows[ir][start] == 'N': continue
+            # gather enough subseq for motif
+            for ic in range(start,ncols):
+                char = align.rows[ir][ic].upper()
+                if char == '-' or char == 'N': continue
+                else: subseq += char
+                if len(subseq) == minSeqLen: 
+                    revseq = pwmx.reverse_complement( subseq )
+                    align_match_lens.append( ic )
+                    # pwm score
+                    nill,f_score = pwm.score_seq( subseq )[0]
+                    r_score, nill = pwm.score_seq( revseq )[0]
+                    pwm_score_vec.append( max(f_score, r_score) )
+                    # consensus score
+                    if motif is not None:
+                        for_score = int( pwmx.match_consensus(subseq,motif) )
+                        rev_score = int( pwmx.match_consensus(revseq,motif) )
+                        motif_score_vec.append( max(for_score, rev_score) )
+                    #check threshold
+                    try:
+                        assert not isnan(max(pwm_score_vec) )
+                        assert not isnan(max(motif_score_vec) )
+                    except:
+                        print >>sys.stderr, pwm_score_vec, motif_score_vec
+                        print >>sys.stderr, len(subseq), len(pwm)
+                    if max(pwm_score_vec) < threshold: continue
+                    if max(motif_score_vec) < threshold: continue
+                    # chop block
+                    col_start = start
+                    col_end = max( align_match_lens ) + 1
+                    motifmaf = mafblock.slice( col_start, col_end )
+
+                    print subseq,revseq,ic
+                    print align_match_lens
+                    yield motifmaf, pwm_score_vec, motif_score_vec
+        """
+
+def MafBlockScorer(pwm,species,maf):
+    width = len(maf.components[0].text)
+    headers = [ (c.src,c.start,c.end) for c in maf.components]
+
+    # expand block rows to full
+    mafBlockSpecies = [specName.src.split('.')[0] for specName in maf.components]
+    alignlist = []
+    for sp in species:
+        try:
+            i = mafBlockSpecies.index( sp )
+            alignlist.append( maf.components[i].text )
+        except ValueError:
+            alignlist.append( [ NaN for n in range( width ) ] )
+    alignrows = pwmx.Align( alignlist )
+    scoremax = {}
+    # record gap positions
+    filter = pwmx.score_align_gaps( alignrows )
+    # score pwm models
+    for model in pwm.keys():
+        #print >>sys.stderr,"%s_%d_%d" % headers[0],width,model
+        scoremax[model] = pwm[model].score_align( alignrows, filter )
+    yield scoremax,width,headers
+
+def MafMotifScorer(species,maf,motifs):
+    width = len(maf.components[0].text)
+    headers = [ (c.src,c.start,c.end) for c in maf.components]
+
+    # expand block rows to full
+    mafBlockSpecies = [specName.src.split('.')[0] for specName in maf.components]
+    alignlist = []
+    for sp in species:
+        try:
+            i = mafBlockSpecies.index( sp )
+            alignlist.append( maf.components[i].text )
+        except ValueError:
+            alignlist.append( [ NaN for n in range( width ) ] )
+
+    alignrows = pwmx.Align( alignlist, headers )
+    # record gap positions
+    filter = pwmx.score_align_gaps( alignrows )
+    # score motif
+    #print >>sys.stderr, headers
+    if isinstance( motifs, list):
+        scoremax = {}
+        for string in motifs:
+            scoremax[string] = pwmx.score_align_motif( alignrows, string, filter )
+    else:
+        scoremax = pwmx.score_align_motif( alignrows, motif, filter )
+    yield scoremax,width,headers
+
+if __name__ == '__main__': main()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/pwm/maf_select_motifs.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/pwm/maf_select_motifs.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/pwm/maf_select_motifs.py (revision 3)
@@ -0,0 +1,69 @@
+#!/usr/bin/env python2.4
+"""
+Returns all positions of a maf with any pwm score > threshold
+The positions are projected onto human coordinates
+"""
+
+import psyco_full
+from bx.align import maf as align_maf
+import bx.pwm.position_weight_matrix as pwmx
+from bx.pwm.pwm_score_maf import MafMotifSelect
+import sys
+from bx import intervals
+
+def isnan(x):
+    return not x==x
+
+def main():
+
+    if len(sys.argv) < 5:
+        print >>sys.stderr, "%s transfac|basic pwmfile inmaf threshold [motif]" % sys.argv[0]
+        sys.exit(2)
+
+    r = pwmx.Reader(open(sys.argv[2]),format=sys.argv[1])
+    pwm = iter(r).next()
+    inmaf = open(sys.argv[3])
+    threshold = float(sys.argv[4])
+    if len(sys.argv) > 5: motif = sys.argv[5]
+    else: motif = None
+
+    for maf in align_maf.Reader(inmaf):
+        for mafmotif,pwm_score,motif_score in MafMotifSelect(maf, pwm, motif, threshold):
+            #mafwrite( mafmotif,pwm_score,motif_score)
+            print mafmotif, pwm_score, motif_score
+            print 'zzzzzzzzzzzzzzzzzzzzzzzzzzzzz'
+
+def mafwrite(alignment,kvec=None,jvec=None,file=sys.stdout):
+    file.write( "a score=" + str( alignment.score ) )
+    for key in alignment.attributes:
+        file.write( " %s=%s" % ( key, alignment.attributes[key] ) )
+    file.write( "\n" )
+    rows = []
+    if not kvec: kvec = [0 for c in alignment.components]
+    if not jvec: jvec = [0 for c in alignment.components]
+    for c,x,y in zip(alignment.components,kvec,jvec):
+    #for c in alignment.components:
+        rows.append( ( "s", c.src, str( c.start ), str( c.size ), c.strand, str( c.src_size ), c.text, "%.2f" % x, str(y) ) )
+        #rows.append( ( "s", c.src, str( c.start ), str( c.size ), c.strand, str( c.src_size ), c.text ) )
+        file.write( format_tabular( rows, "llrrrrrrr" ) )
+
+def format_tabular( rows, align=None ):
+    if len( rows ) == 0: return ""
+    lengths = [ len( col ) for col in rows[ 0 ] ]
+    for row in rows[1:]:
+        for i in range( 0, len( row ) ):
+            lengths[ i ] = max( lengths[ i ], len( row[ i ] ) )
+    rval = ""
+    for row in rows:
+        for i in range( 0, len( row ) ):
+            if align and align[ i ] == "l":
+                rval += row[ i ].ljust( lengths[ i ] )
+            else:
+                rval += row[ i ].rjust( lengths[ i ] )
+            rval += " "
+        rval += "\n"
+    return rval
+
+    
+
+if __name__ == '__main__': main()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/pwm/pwm_score_positions.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/pwm/pwm_score_positions.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/pwm/pwm_score_positions.py (revision 3)
@@ -0,0 +1,63 @@
+#!/usr/bin/env python2.4
+"""
+Returns all positions of a maf with any pwm score > threshold
+The positions are projected onto human coordinates
+"""
+
+import psyco_full
+from bx.align import maf as align_maf
+import bx.pwm.position_weight_matrix as pwmx
+from bx.pwm.pwm_score_maf import MafBlockScorer
+import sys
+from bx import intervals
+
+def isnan(x):
+    return not x==x
+
+def main():
+
+    if len(sys.argv) < 6:
+        print >>sys.stderr, "%s transfac|basic pwmfile inmaf threshold spec1,spec2,... " % sys.argv[0]
+        sys.exit(0)
+
+    pwm = {}
+    format = sys.argv[1]
+    for wm in pwmx.Reader(open(sys.argv[2]),format=format):
+        pwm[ wm.id ] = wm
+
+    
+    inmaf = open(sys.argv[3])
+    threshold = float(sys.argv[4])
+
+    species = []
+
+    for sp in sys.argv[5].split(','):
+        species.append( sp )
+
+    for maf in align_maf.Reader(inmaf):
+        mafchrom = maf.components[0].src.split('.')[1]
+        mafstart = maf.components[0].start
+        mafend = maf.components[0].end
+        reftext = maf.components[0].text
+
+        # maf block scores for each matrix
+        for scoremax,width,headers in MafBlockScorer(pwm, species, maf):
+            blocklength = width
+            mafsrc,mafstart,mafend = headers[0]
+            mafchrom = mafsrc.split('.')[1]
+
+            # lists of scores for each position in scoremax
+            for id,mx in scoremax.items():
+                for offset in range(blocklength):
+
+                    # scan all species with threshold
+                    for i in range(len(species)):
+                        if mx[i][offset] > threshold:
+                            refstart = mafstart + offset - reftext.count('-',0,offset)
+                            refend = refstart + len(pwm[id])
+                            data = " ".join([ "%.2f" % mx[x][offset] for x in range(len(species))])
+                            # underscore spaces in the name
+                            print mafchrom,refstart,refend,id.replace(' ','_'),data
+                            break
+
+if __name__ == '__main__': main()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/pwm/pwm_tests.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/pwm/pwm_tests.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/pwm/pwm_tests.py (revision 3)
@@ -0,0 +1,97 @@
+import unittest
+import sys
+import bx.pwm.position_weight_matrix as pwm
+from StringIO import StringIO
+
+basicPwm = \
+""">MA0101 c-REL REL
+0   5   8   4
+0   1   15  1
+1   0   15  1
+5   1   9   2
+6   5   3   3
+5   1   1   10
+1   0   0   16
+2   0   0   15
+0   15  0   2
+1   16  0   0
+"""
+
+transfacPwm = \
+"""ID  TATA
+XX
+P0    A    C    G    T
+01   33   73   78   16      S
+02   10   24   11  155      T
+03  176    3    2   19      A
+04    2    7    3  188      T
+05  178    2    3   17      A
+06  133    2    2   63      A
+07  183    3   10    4      A
+08  112    2   24   62      W
+09   78   26   80   16      R
+10   29   72   75   24      N
+11   42   74   68   16      N
+12   42   65   66   27      N
+13   41   60   67   32      N
+14   35   54   72   39      N
+15   40   51   73   36      N
+XX
+"""
+
+background = { 'A':.28,'C':.21, 'G':.24, 'T':.27 }
+
+dSeq = "ACCGAGTTAGCGTAAA"
+dScoresExpected = "-15.3697 0.4240 -16.5309 0.4027"
+
+qSeq = [{'A':0.27,'C':0.34,'G':0.07,'T':0.32},
+        {'A':0.24,'C':0.32,'G':0.09,'T':0.35},
+        {'A':0.80,'C':0.11,'G':0.03,'T':0.06},
+        {'A':0.07,'C':0.22,'G':0.37,'T':0.34},
+        {'A':0.07,'C':0.44,'G':0.03,'T':0.46},
+        {'A':0.43,'C':0.04,'G':0.18,'T':0.35},
+        {'A':0.84,'C':0.14,'G':0.01,'T':0.01},
+        {'A':0.31,'C':0.52,'G':0.13,'T':0.04},
+        {'A':0.22,'C':0.22,'G':0.45,'T':0.11},
+        {'A':0.36,'C':0.15,'G':0.42,'T':0.07},
+        {'A':0.11,'C':0.78,'G':0.07,'T':0.04},
+        {'A':0.07,'C':0.16,'G':0.64,'T':0.13},
+        {'A':0.34,'C':0.59,'G':0.03,'T':0.04},
+        {'A':0.32,'C':0.15,'G':0.07,'T':0.46},
+        {'A':0.07,'C':0.03,'G':0.59,'T':0.31}]
+
+qScoresExpected = "4.1106 0.7810"
+
+class PWMTestCase (unittest.TestCase):
+
+    def testReader(self):
+
+        # test basic format: i.e. for jaspar
+        wms = [wm for wm in pwm.Reader(StringIO(basicPwm),format="basic", \
+                          background=background,score_correction=False)]
+        assert len(wms) == 1
+
+        # test transfac format
+        wms = [wm for wm in pwm.Reader(StringIO(transfacPwm),format="transfac", \
+                          background=background,score_correction=False)]
+        assert len(wms) == 1
+
+        wm = wms[0]
+        dScores = wm.score_seq(dSeq)
+        assert len(dScores) == 2
+        assert "%.4f %.4f %.4f %.4f" % (dScores[0][0],dScores[0][1],dScores[1][0],dScores[1][1]) == dScoresExpected
+
+        qdSeq = []
+        for (ix,nt) in enumerate(dSeq):
+            qdSeq.append(dict())
+            qdSeq[ix][nt] = 1.0
+        qScores = wm.score_seq(qdSeq)
+        assert len(qScores) == 2
+        assert "%.4f %.4f %.4f %.4f" % (qScores[0][0],qScores[0][1],qScores[1][0],qScores[1][1]) == dScoresExpected
+
+        qScores = wm.score_seq(qSeq)
+        assert len(qScores) == 1
+        assert "%.4f %.4f" % (qScores[0][0],qScores[0][1]) == qScoresExpected
+
+test_classes = [PWMTestCase]
+suite = unittest.TestSuite ([unittest.makeSuite (c) for c in test_classes])
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/wiggle.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/wiggle.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/wiggle.py (revision 3)
@@ -0,0 +1,78 @@
+"""
+Support for scores in the `wiggle`_ file format used by the UCSC Genome 
+Browser.
+
+The positions in the wiggle format are 1-relative, however,
+the positions returned match the BED/interval format which is zero-based, half-open.
+
+.. _wiggle: http://genome.ucsc.edu/goldenPath/help/wiggle.html
+"""
+
+def parse_header( line ):
+    return dict( [ field.split( '=' ) for field in line.split()[1:] ] )
+
+def IntervalReader( f ):
+    """
+    Iterator yielding chrom, start, end, strand, value.
+    Values are zero-based, half-open.
+    Regions which lack a score are ignored.
+    """
+    current_chrom = None
+    current_pos = None
+    current_step = None
+
+    # always for wiggle data
+    strand = '+'
+
+    mode = "bed"
+
+    for line in f:
+        if line.isspace() or line.startswith( "track" ) or line.startswith( "#" ) or line.startswith( "browser" ):
+            continue
+        elif line.startswith( "variableStep" ):
+            header = parse_header( line )
+            current_chrom = header['chrom']
+            current_pos = None
+            current_step = None
+            if 'span' in header: current_span = int( header['span'] )
+            else: current_span = 1
+            mode = "variableStep"
+        elif line.startswith( "fixedStep" ):
+            header = parse_header( line )
+            current_chrom = header['chrom']
+            current_pos = int( header['start'] ) - 1
+            current_step = int( header['step'] )
+            if 'span' in header: current_span = int( header['span'] )
+            else: current_span = 1
+            mode = "fixedStep"
+        elif mode == "bed":
+            fields = line.split()
+            if len( fields ) > 3:
+                if len( fields ) > 5:
+                    yield fields[0], int( fields[1] ), int( fields[2] ), fields[5], float( fields[3] )
+                else:
+                    yield fields[0], int( fields[1] ), int( fields[2] ), strand, float( fields[3] )
+        elif mode == "variableStep": 
+            fields = line.split()
+            pos = int( fields[0] ) - 1
+            yield current_chrom, pos, pos + current_span, strand, float( fields[1] )
+        elif mode == "fixedStep":
+            yield current_chrom, current_pos, current_pos + current_span, strand, float( line.split()[0] )
+            current_pos += current_step
+        else:
+            raise "Unexpected input line: %s" % line.strip()
+
+
+class Reader( object ):
+    """
+    Iterator yielding chrom, position, value.
+    Values are zero-based.
+    Regions which lack a score are ignored.
+    """
+    def __init__( self, f ):
+        self.file = f
+        
+    def __iter__( self ):
+        for chrom, start, end, strand, val in IntervalReader( self.file ):
+            for pos in xrange( start, end ):
+                yield chrom, pos, val
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/cookbook/progress_bar.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/cookbook/progress_bar.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/cookbook/progress_bar.py (revision 3)
@@ -0,0 +1,71 @@
+"""
+An ASCII text progress bar. See __main__ for command line use (using \r to 
+move the cursor back to the start of the current line is the key, on
+terminals that do not support this functionality the progress bar will
+not work as well).
+
+http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/168639
+"""
+
+import sys
+
+class ProgressBar:
+    def __init__(self, minValue = 0, maxValue = 10, totalWidth=12):
+        self.progBar = "[]"   # This holds the progress bar string
+        self.min = minValue
+        self.max = maxValue
+        self.span = maxValue - minValue
+        self.width = totalWidth
+        self.amount = 0       # When amount == max, we are 100% done 
+        self.update(0)  # Build progress bar string
+
+    def update(self, newAmount = 0):
+        if newAmount < self.min: newAmount = self.min
+        if newAmount > self.max: newAmount = self.max
+        self.amount = newAmount
+
+        # Figure out the new percent done, round to an integer
+        diffFromMin = float(self.amount - self.min)
+        percentDone = (diffFromMin / float(self.span)) * 100.0
+        percentDone = round(percentDone)
+        percentDone = int(percentDone)
+
+        # Figure out how many hash bars the percentage should be
+        allFull = self.width - 2
+        numHashes = (percentDone / 100.0) * allFull
+        numHashes = int(round(numHashes))
+
+        # build a progress bar with hashes and spaces
+        if allFull == numHashes:
+            self.progBar = "[" + '='*(numHashes) + "]"
+        else:
+            self.progBar = "[" + '='*(numHashes-1) + '>' + ' '*(allFull-numHashes) + "]"
+
+        # figure out where to put the percentage, roughly centered
+        percentPlace = (len(self.progBar) / 2) - len(str(percentDone)) 
+        percentString = str(percentDone) + "%"
+
+        # slice the percentage into the bar
+        self.progBar = self.progBar[0:percentPlace] + percentString + self.progBar[percentPlace+len(percentString):]
+
+    def update_and_print( self, newAmount = 0, f = sys.stdout ):
+        self.update( newAmount )
+        print >> f, "\r", self,
+        f.flush()
+
+
+    def __str__(self):
+        return str(self.progBar)
+
+if __name__ == "__main__":
+    import time
+
+    bar = ProgressBar( 0, 1000, 80 )
+
+    for i in range(1000):
+        bar.update( i )
+        print "\r", bar,
+        sys.stdout.flush()
+        
+
+    print
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/cookbook/__init__.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/cookbook/__init__.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/cookbook/__init__.py (revision 3)
@@ -0,0 +1,98 @@
+"""
+Various useful utilities, mostly taken from the ASPN Python cookbook.
+"""
+
+seq_types = type( () ), type( [] )
+
+def flatten( *args ):
+    for arg in args:
+        if type( arg ) in seq_types:
+            for elem in arg:
+                for f in flatten( elem ): 
+                    yield f
+        else:
+            yield arg
+
+def cross_lists(*sets):
+    """Return the cross product of the arguments"""
+    wheels = map(iter, sets) 
+    digits = [it.next() for it in wheels]
+    while True:
+        yield digits[:]
+        for i in range(len(digits)-1, -1, -1):
+            try:
+                digits[i] = wheels[i].next()
+                break
+            except StopIteration:
+                wheels[i] = iter(sets[i])
+                digits[i] = wheels[i].next()
+        else:
+            break
+
+# Cached / memoized methods
+
+import types
+
+def cachedmethod(function):
+    return types.MethodType(Memoize(function), None)
+
+
+class Memoize:
+    def __init__(self,function):
+        self._cache = {}
+        self._callable = function
+            
+    def __call__(self, *args, **kwds):
+        cache = self._cache
+        key = self._getKey(*args,**kwds)
+        try: return cache[key]
+        except KeyError:
+            cachedValue = cache[key] = self._callable(*args,**kwds)
+            return cachedValue
+    
+    def _getKey(self,*args,**kwds):
+        return kwds and (args, ImmutableDict(kwds)) or args    
+
+
+class memoized(object):
+   """Decorator that caches a function's return value each time it is called.
+   If called later with the same arguments, the cached value is returned, and
+   not re-evaluated.
+   """
+   def __init__(self, func):
+      self.func = func
+      self.cache = {}
+   def __call__(self, *args):
+      try:
+         return self.cache[args]
+      except KeyError:
+         self.cache[args] = value = self.func(*args)
+         return value
+      except TypeError:
+         # uncachable -- for instance, passing a list as an argument.
+         # Better to not cache than to blow up entirely.
+         return self.func(*args)
+   def __repr__(self):
+      """Return the function's docstring."""
+      return self.func.__doc__
+
+
+class ImmutableDict(dict):
+    '''A hashable dict.'''
+
+    def __init__(self,*args,**kwds):
+        dict.__init__(self,*args,**kwds)
+    def __setitem__(self,key,value):
+        raise NotImplementedError, "dict is immutable"
+    def __delitem__(self,key):
+        raise NotImplementedError, "dict is immutable"
+    def clear(self):
+        raise NotImplementedError, "dict is immutable"
+    def setdefault(self,k,default=None):
+        raise NotImplementedError, "dict is immutable"
+    def popitem(self):
+        raise NotImplementedError, "dict is immutable"
+    def update(self,other):
+        raise NotImplementedError, "dict is immutable"
+    def __hash__(self):
+        return hash(tuple(self.iteritems()))
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/cookbook/doc_optparse.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/cookbook/doc_optparse.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/cookbook/doc_optparse.py (revision 3)
@@ -0,0 +1,86 @@
+"""
+:Author: M. Simionato
+:Date: April 2004
+:Title: A much simplified interface to optparse.
+
+You should use optionparse in your scripts as follows.
+First, write a module level docstring containing something like this
+(this is just an example)::
+
+    '''usage: %prog files [options]
+       -d, --delete: delete all files
+       -e, --erase = ERASE: erase the given file'''
+   
+Then write a main program of this kind:
+
+# sketch of a script to delete files::
+
+    if __name__=='__main__':
+        import optionparse
+        option,args=optionparse.parse(__doc__)
+        if not args and not option: optionparse.exit()
+        elif option.delete: print "Delete all files"
+        elif option.erase: print "Delete the given file"
+
+Notice that ``optionparse`` parses the docstring by looking at the
+characters ",", ":", "=", "\\n", so be careful in using them. If
+the docstring is not correctly formatted you will get a SyntaxError
+or worse, the script will not work as expected.
+"""
+
+import optparse, re, sys, traceback
+
+USAGE = re.compile(r'(?s)\s*usage: (.*?)(\n[ \t]*\n|$)')
+
+def nonzero(self): # will become the nonzero method of optparse.Values       
+    "True if options were given"
+    for v in self.__dict__.itervalues():
+        if v is not None: return True
+    return False
+
+optparse.Values.__nonzero__ = nonzero # dynamically fix optparse.Values
+
+class ParsingError(Exception): pass
+
+optionstring=""
+
+def exception(msg=""):
+    print >> sys.stderr, "Exception while parsing command line:"
+    print >>sys.stderr, traceback.format_exc()
+    exit( msg )
+
+def exit(msg=""):
+    raise SystemExit(msg or optionstring.replace("%prog",sys.argv[0]))
+
+def parse(docstring, arglist=None):
+    global optionstring
+    optionstring = docstring
+    match = USAGE.search(optionstring)
+    if not match: raise ParsingError("Cannot find the option string")
+    optlines = match.group(1).splitlines()
+    try:
+        p = optparse.OptionParser(optlines[0],conflict_handler="resolve")
+        for line in optlines[1:]:
+            opt, help=line.split(':')[:2]
+            # Make both short and long optional (but at least one)
+            ## Old: short,long=opt.split(',')[:2]
+            opt_strings = []
+            action = "store_true"
+            for k in opt.split( ', ' ):
+                k = k.strip()
+                if k.startswith( "--" ) and "=" in k:
+                    action = "store"
+                    k = k.split( "=" )[0]
+                opt_strings.append( k )
+            p.add_option( *opt_strings, **dict( action = action, help = help.strip() ) )
+        helpstring = docstring.replace("%prog",sys.argv[0])
+        # p.add_option( "-h", "--help", action="callback", callback=help_callback, callback_args=(helpstring,) )
+    except (IndexError,ValueError):
+        raise ParsingError("Cannot parse the option string correctly")
+    return p.parse_args(arglist)
+
+def help_callback( option, opt, value, parser, help ):
+    print >> sys.stderr, help
+    sys.exit( 1 )
+    
+    
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/cookbook/attribute.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/cookbook/attribute.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/cookbook/attribute.py (revision 3)
@@ -0,0 +1,121 @@
+"""
+Provides functions for creating simple properties.
+
+If, inside a class definition, you write:
+
+    attribute(foo=1, bar=2)
+    
+simple properties named 'foo' and 'bar' are created for this class.
+Also, private instance variables '__foo' and '__bar' will be added 
+to instances of this class.
+
+USEAGE:
+
+# assumes attribute.py is on path 
+from attribute import *
+
+class MyClass(object):
+    readable(foo=1, bar=2) # or, attribute('r', foo=1, bar=2)
+    writable(fro=3, boz=4) # or, attribute('w', fro=3, boz=4)
+    attribute(baz=5)
+
+This is equivalent to the following:
+
+class MyClass(object):
+    def __init__(self): 
+        self.__foo = 1
+        self.__bar = 2
+        self.__fro = 3
+        self.__boz = 4
+        self.__baz = 5
+
+    def get_foo(self): 
+        return self.__foo
+    def get_bar(self): 
+        return self.__bar
+    def set_fro(self, value): 
+        self.__fro = value
+    def set_boz(self, value): 
+        self.__boz = value
+    def get_baz(self):
+        return self.__baz
+    def set_baz(self, value):
+        self.__baz = value
+    def del_baz(self):
+        del self.__baz
+
+    foo = property(fget=get_foo, doc="foo")
+    bar = property(fget=get_bar, doc="bar")
+    fro = property(fset=set_fro, doc="fro")
+    boz = property(fset=set_boz, doc="boz")
+    baz = property(fget=get_baz, fset=set_baz, fdel=del_baz, doc="baz")
+"""
+
+__all__ = ['attribute', 'readable', 'writable']
+__version__ = '3.0'
+__author__ = 'Sean Ross'
+__credits__ = ['Guido van Rossum', 'Garth Kidd']
+__created__ = '10/21/02'
+
+import sys
+
+def mangle(classname, attrname):
+    """mangles name according to python name-mangling 
+       conventions for private variables"""
+    return "_%s__%s" % (classname, attrname)
+
+def class_space(classlevel=3):
+    "returns the calling class' name and dictionary"
+    frame = sys._getframe(classlevel)
+    classname = frame.f_code.co_name
+    classdict = frame.f_locals
+    return classname, classdict
+
+# convenience function
+def readable(**kwds):
+    "returns one read-only property for each (key,value) pair in kwds"
+    return _attribute(permission='r', **kwds)
+
+# convenience function
+def writable(**kwds):
+    "returns one write-only property for each (key,value) pair in kwds"
+    return _attribute(permission='w', **kwds) 
+
+# needed because of the way class_space is resolved in _attribute
+def attribute(permission='rwd', **kwds):
+    """returns one property for each (key,value) pair in kwds;
+       each property provides the specified level of access(permission):
+           'r': readable, 'w':writable, 'd':deletable
+    """
+    return _attribute(permission, **kwds)
+
+# based on code by Guido van Rossum, comp.lang.python 2001-07-31        
+def _attribute(permission='rwd', **kwds):
+    """returns one property for each (key,value) pair in kwds;
+       each property provides the specified level of access(permission):
+           'r': readable, 'w':writable, 'd':deletable
+    """
+    classname, classdict = class_space()
+    def _property(attrname, default):
+        propname, attrname = attrname, mangle(classname, attrname)
+        fget, fset, fdel, doc = None, None, None, propname
+        if 'r' in permission:
+            def fget(self):
+                value = default
+                try: value = getattr(self, attrname)
+                except AttributeError: setattr(self, attrname, default)
+                return value
+        if 'w' in permission:
+            def fset(self, value):
+                setattr(self, attrname, value)
+        if 'd' in permission:
+            def fdel(self): 
+                try: delattr(self, attrname)
+                except AttributeError: pass
+                # calling fget can restore this attribute, so remove property 
+                delattr(self.__class__, propname)
+        return property(fget=fget, fset=fset, fdel=fdel, doc=doc)
+        
+    for attrname, default in kwds.items():
+        classdict[attrname] = _property(attrname, default)
+
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/binned_array_tests.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/binned_array_tests.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/binned_array_tests.py (revision 3)
@@ -0,0 +1,93 @@
+"""
+Tests for `bx.binned_array`.
+"""
+
+from numpy import *
+from binned_array import *
+
+random = random.random
+ 
+# Bigger values take longer, but excercise more bins
+CHUNK_SIZE_RANDOM=945
+CHUNK_SIZE_ZEROS=897
+##CHUNK_SIZE_RANDOM=9456
+##CHUNK_SIZE_ZEROS=8972
+
+source = target = None
+
+def setup():
+    global source
+    global target
+    source = []
+    for i in range( 13 ):
+        if random() < 0.5:
+            source = concatenate( ( source, random( CHUNK_SIZE_RANDOM ) ) )
+        else:
+            source = concatenate( ( source, zeros( CHUNK_SIZE_ZEROS, 'f' ) ) )
+    source = source.astype( 'f' )
+    # Set on target
+    target = BinnedArray( 128, NaN, len( source ) )
+    for i in range( len( source ) ):
+        # if not isNaN( source[i] ):
+            target[i] = source[i]
+    return source, target
+
+def test_simple():
+    # Verify
+    for i in range( len( source ) ):
+        assert source[i] == target[i], "No match, index: %d, source: %f, target: %f, len( source ): %d" % ( i, source[i], target[i], len( source ) )
+    # Verify with slices
+    for i in range( 10 ):
+        a = int( random() * len( source ) )
+        b = int( random() * len( source ) )
+        if b < a: a, b = b, a
+        assert allclose( source[a:b], target[a:b] ), "No match, index: %d:%d, source: %s, target: %s" % \
+            ( a, b, ",".join( map( str, source[a:a+10] ) ), ",".join( map( str, target[a:a+10] ) ) )
+ 
+def test_file():
+    # With a file (zlib)
+    target.to_file( open( "/tmp/foo", "w" ) )
+    target2 = FileBinnedArray( open( "/tmp/foo" ) )
+    for i in range( len( source ) ):
+        assert source[i] == target2[i], "No match, index: %d, source: %d, target: %d" % ( i, source[i], target2[i] )
+    # Verify with slices
+    target2 = FileBinnedArray( open( "/tmp/foo" ) )
+    for i in range( 10 ):
+        a = int( random() * len( source ) )
+        b = int( random() * len( source ) )
+        if b < a: a, b = b, a
+        assert allclose( source[a:b], target[a:b] ), "No match, index: %d:%d, source: %s, target: %s" % \
+            ( a, b, ",".join( map( str, source[a:a+10] ) ), ",".join( map( str, target2[a:a+10] ) ) )
+            
+def test_file_lzo():
+    # With a file (lzo)
+    target.to_file( open( "/tmp/foo3", "w" ), comp_type="lzo" )
+    target3 = FileBinnedArray( open( "/tmp/foo3" ) )
+    # Verify
+    for i in range( len( source ) ):
+        assert source[i] == target3[i], "No match, index: %d, source: %d, target: %d" % ( i, source[i], target3[i] )
+    # Verify with slices
+    target3 = FileBinnedArray( open( "/tmp/foo3" ) )
+    for i in range( 10 ):
+        a = int( random() * len( source ) )
+        b = int( random() * len( source ) )
+        if b < a: a, b = b, a
+        assert allclose( source[a:b], target3[a:b] ), "No match, index: %d:%d, source: %s, target: %s" % \
+            ( a, b, ",".join( map( str, source[a:a+10] ) ), ",".join( map( str, target3[a:a+10] ) ) )
+            
+def test_binned_array_writer():
+    # Test with ba writer
+    o = open( "/tmp/foo4", "w" )
+    w = BinnedArrayWriter( o, 128, comp_type='lzo' )
+    for val in source:
+        w.write( val )
+    w.finish()
+    o.close()
+    # Verify
+    target4 = FileBinnedArray( open( "/tmp/foo4" ) )
+    for i in range( len( source ) ):
+        assert allclose( source[i], target4[i] ), "No match, index: %d, source: %d, target: %d" % ( i, source[i], target4[i] )
+            
+            
+            
+            
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/intervals/intersection_tests.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/intervals/intersection_tests.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/intervals/intersection_tests.py (revision 3)
@@ -0,0 +1,215 @@
+import sys, os
+import unittest
+try:
+    sys.path.insert(0, os.path.dirname(os.path.dirname(__file__)))
+except:
+    sys.path.insert(0, os.path.dirname(os.path.abspath(".")))
+
+from bx.intervals.intersection import Interval
+from bx.intervals.intersection import IntervalNode
+from bx.intervals.intersection import IntervalTree
+
+class NeighborTestCase(unittest.TestCase):
+
+    def setUp(self):
+        iv = IntervalNode( 50, 59, Interval(50, 59))
+        for i in range(0, 110, 10):
+            if i == 50: continue
+            f = Interval(i, i + 9)
+            iv = iv.insert( f.start, f.end, f)
+        self.intervals = iv
+
+    def test_left(self):
+        iv = self.intervals
+        self.assertEqual(str(iv.left(60, n=2)), str([Interval(50, 59), Interval(40, 49)]))
+
+        for i in range(10, 100, 10):
+            r = iv.left(i, max_dist=10, n=1)
+            self.assertEqual(r[0].end,  i - 1)
+
+    def test_toomany(self):
+        iv = self.intervals
+        self.assertEqual(len(iv.left(60, n=200)) , 6)
+
+
+    def test_right(self):
+        iv = self.intervals
+        self.assertEqual(str(iv.left(60, n=2)), str([Interval(50, 59), Interval(40, 49)]))
+
+        def get_right_start(b10):
+            r = iv.right(b10+1, n=1)
+            assert len(r) == 1
+            return r[0].start
+        
+        for i in range(10, 100, 10):
+            self.assertEqual(get_right_start(i), i + 10)
+
+        for i in range(0, 100, 10):
+            r = iv.right(i-1, max_dist=10, n=1)
+            print r
+            self.assertEqual(r[0].start, i)
+
+class UpDownStreamTestCase(unittest.TestCase):
+
+    def setUp(self):
+        iv = IntervalTree()
+        iv.add_interval(Interval(50, 59))
+        for i in range(0, 110, 10):
+            if i == 50: continue
+            f = Interval(i, i + 9)
+            iv.add_interval(f)
+        self.intervals = iv
+
+
+    def test_upstream(self):
+        iv = self.intervals 
+        upstreams = iv.upstream_of_interval(Interval(59, 60), num_intervals=200)
+        for u in upstreams:
+            self.assertTrue(u.end < 59)
+    
+        upstreams = iv.upstream_of_interval(Interval(60, 70, strand=-1),
+                num_intervals=200)
+        for u in upstreams:
+            self.assertTrue(u.start > 70)
+    
+    
+        upstreams = iv.upstream_of_interval(Interval(58, 58, strand=-1),
+                num_intervals=200)
+        for u in upstreams:
+            self.assertTrue(u.start > 59)
+    
+    
+    def test_downstream(self):
+        iv = self.intervals
+        downstreams = iv.downstream_of_interval(Interval(59, 60),
+                num_intervals=200)
+        for d in downstreams:
+            self.assertTrue(d.start > 60)
+    
+        downstreams = iv.downstream_of_interval(Interval(59, 60, strand=-1),
+                num_intervals=200)
+        for d in downstreams:
+            self.assertTrue(d.start < 59)
+        
+
+    def test_n(self):
+        iv = self.intervals
+        for i in range(0, 90, 10):
+            r = iv.after(i, max_dist=20, num_intervals=2)
+            self.assertEqual(r[0].start, i + 10)
+            self.assertEqual(r[1].start, i + 20)
+
+            r = iv.after_interval(Interval(i, i), max_dist=20, num_intervals=2)
+            self.assertEqual(r[0].start, i + 10)
+            self.assertEqual(r[1].start, i + 20)
+
+
+class LotsaTestCase(unittest.TestCase):
+    """ put lotsa data in the tree and make sure it works"""
+    def setUp(self):
+        iv = IntervalNode(1, 2, Interval(1, 2))
+        self.max = 1000000
+        for i in range(0, self.max, 10):
+            f = Interval(i, i)
+            iv = iv.insert(f.start, f.end, f)
+
+        for i in range(600):
+            iv = iv.insert( 0, 1, Interval(0, 1) )
+        self.intervals = iv
+
+
+
+    def test_count(self):
+        iv = self.intervals
+        
+        r = iv.right(1, n=33)
+        self.assertEqual(len(r), 33)
+
+        l = iv.left(1, n=33)
+        self.assertEqual(len(l), 1)
+
+        u = iv.right(1, n=9999)
+        self.assertEqual(len(u), 250)
+
+        # now increase max_dist
+        u = iv.right(1, n=9999, max_dist=99999)
+        self.assertEqual(len(u), 9999)
+
+
+    def test_max_dist(self):
+        iv = self.intervals
+        r = iv.right(1, max_dist=0, n=10)
+        self.assertEqual(len(r), 0)
+
+        for n, d in enumerate(range(10, 1000, 10)):
+            r = iv.right(1, max_dist=d, n=10000)
+            self.assertEqual(len(r), n + 1) 
+
+    def test_find(self):
+        iv = self.intervals
+        random =  __import__("random")
+        for t in range(25):
+            start = random.randint(0, self.max - 10000)
+            end  = start + random.randint(100, 10000)
+
+            results = iv.find(start, end)
+            for feat in results:
+                self.assertTrue(
+                        (feat.end >= start and feat.end <= end) 
+                            or 
+                        (feat.start <= end and feat.start >= start)
+                        )
+
+
+class IntervalTreeTest(unittest.TestCase):
+    def setUp(self):
+
+        iv = IntervalTree()
+        n = 0
+        for i in range(1, 1000, 80):
+            iv.insert(i, i + 10, dict(value=i*i))
+            # add is synonym for insert.
+            iv.add(i + 20, i + 30, dict(astr=str(i*i)))
+
+            # or insert/add an interval object with start, end attrs.
+            iv.insert_interval(Interval(i + 40, i + 50,
+                value=dict(astr=str(i*i))))
+            iv.add_interval(Interval(i + 60, i + 70,
+                value=dict(astr=str(i*i))))
+
+            n += 4 
+        self.intervals = self.iv = iv
+        self.nintervals = n
+
+    
+    def test_find(self):
+
+        r = self.iv.find(100, 200)
+        self.assertEqual(len(r), 5)
+
+    def test_traverse(self):
+        a = []
+        fn = a.append
+
+        self.iv.traverse(fn)
+        self.assertEqual(len(a), self.nintervals)
+    
+    def test_empty(self):
+        iv = IntervalTree()
+        self.assertEqual([], iv.find(100, 300))
+        self.assertEqual([], iv.after(100))
+        self.assertEqual([], iv.before(100))
+        self.assertEqual([], iv.after_interval(100))
+        self.assertEqual([], iv.before_interval(100))
+        self.assertEqual([], iv.upstream_of_interval(100))
+        self.assertEqual([], iv.downstream_of_interval(100))
+        self.assertEqual(None, iv.traverse(lambda x: x.append(1)))
+
+    def test_public_interval(self):
+
+        fn = lambda ival: self.assert_(ival.interval)
+        self.iv.traverse(fn)
+
+if __name__ == "__main__":
+
+    unittest.main()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/intervals/operations/coverage.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/intervals/operations/coverage.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/intervals/operations/coverage.py (revision 3)
@@ -0,0 +1,72 @@
+"""
+Determine amount of each interval in one set covered by the intervals of 
+another set. Adds two columns to the first input, giving number of bases 
+covered and percent coverage on the second input.
+"""
+
+import traceback
+import fileinput
+from warnings import warn
+
+from bx.intervals.io import *
+from bx.intervals.operations import *
+
+def coverage(readers, comments=True):
+    # The incoming lens dictionary is a dictionary of chromosome lengths which are used to initialize the bitsets.
+    primary = readers[0]
+    intersect = readers[1:]
+    # Handle any ValueError, IndexError and OverflowError exceptions that may be thrown when
+    # the bitsets are being created by skipping the problem lines
+    intersect[0] = BitsetSafeReaderWrapper( intersect[0], lens={} )
+    bitsets = intersect[0].binned_bitsets()
+    intersect = intersect[1:]
+    for andset in intersect:
+        bitset2 = andset.binned_bitsets()
+        for chrom in bitsets:
+            if chrom not in bitset2: continue
+            bitsets[chrom].ior(bitset2[chrom])
+        intersect = intersect[1:]
+
+    # Read remaining intervals and give coverage
+    for interval in primary:
+        if type( interval ) is Header:
+            yield interval
+        if type( interval ) is Comment and comments:
+            yield interval
+        elif type( interval ) == GenomicInterval:
+            chrom = interval.chrom
+            start = int(interval.start)
+            end = int(interval.end)
+            if start > end:
+                try:
+                    # This will only work if primary is a NiceReaderWrapper
+                    primary.skipped += 1
+                    # no reason to stuff an entire bad file into memmory
+                    if primary.skipped < 10:
+                        primary.skipped_lines.append( ( primary.linenum, primary.current_line, "Interval start after end!" ) )
+                except:
+                    pass
+                continue
+            if chrom not in bitsets:
+                bases_covered = 0
+                percent = 0.0
+            else:
+                try:
+                    bases_covered = bitsets[ chrom ].count_range( start, end-start )
+                except IndexError, e:
+                    try:
+                        # This will only work if primary is a NiceReaderWrapper
+                        primary.skipped += 1
+                        # no reason to stuff an entire bad file into memmory
+                        if primary.skipped < 10:
+                            primary.skipped_lines.append( ( primary.linenum, primary.current_line, str( e ) ) )
+                    except:
+                        pass
+                    continue
+                if (end - start) == 0:
+                    percent = 0
+                else:
+                    percent = float(bases_covered) / float(end - start)
+            interval.fields.append(str(bases_covered))
+            interval.fields.append(str(percent))
+            yield interval
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/intervals/operations/quicksect.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/intervals/operations/quicksect.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/intervals/operations/quicksect.py (revision 3)
@@ -0,0 +1,155 @@
+"""
+Intersects ... faster.  Suports GenomicInterval datatype and multiple
+chromosomes.
+"""
+import math
+import time
+import sys
+import random
+
+class IntervalTree( object ):
+    def __init__( self ):
+        self.chroms = {}
+    def insert( self, interval, linenum=0, other=None ):
+        chrom = interval.chrom
+        start = interval.start
+        end = interval.end
+        if interval.chrom in self.chroms:
+            self.chroms[chrom] = self.chroms[chrom].insert( start, end, linenum, other )
+        else:
+            self.chroms[chrom] = IntervalNode( start, end, linenum, other )
+    def intersect( self, interval, report_func ):
+        chrom = interval.chrom
+        start = interval.start
+        end = interval.end
+        if chrom in self.chroms:
+            self.chroms[chrom].intersect( start, end, report_func )
+    def traverse( self, func ):
+        for item in self.chroms.itervalues():
+            item.traverse( func )
+
+class IntervalNode( object ):
+    def __init__( self, start, end, linenum=0, other=None ):
+        # Python lacks the binomial distribution, so we convert a
+        # uniform into a binomial because it naturally scales with
+        # tree size.  Also, python's uniform is perfect since the
+        # upper limit is not inclusive, which gives us undefined here.
+        self.priority = math.ceil( (-1.0 / math.log(.5)) * math.log( -1.0 / (random.uniform(0,1) - 1)))
+        self.start = start
+        self.end = end
+        self.maxend = self.end
+        self.minend = self.end
+        self.left = None
+        self.right = None
+        self.linenum = linenum
+        self.other = other
+    def insert( self, start, end, linenum=0, other=None ):
+        root = self
+        if start > self.start:
+            # insert to right tree
+            if self.right:
+                self.right = self.right.insert( start, end, linenum, other )
+            else:
+                self.right = IntervalNode(start, end, linenum, other )
+            # rebalance tree
+            if self.priority < self.right.priority:
+                root = self.rotateleft()
+        else:
+            # insert to left tree
+            if self.left:
+                self.left = self.left.insert( start, end, linenum, other )
+            else:
+                self.left = IntervalNode(start, end, linenum, other )
+            # rebalance tree
+            if self.priority < self.left.priority:
+                root = self.rotateright()
+        if root.right and root.left: 
+            root.maxend = max( root.end, root.right.maxend, root.left.maxend )
+            root.minend = min( root.end, root.right.minend, root.left.minend )
+        elif root.right: 
+            root.maxend = max( root.end, root.right.maxend )
+            root.minend = min( root.end, root.right.minend )
+        elif root.left:
+            root.maxend = max( root.end, root.left.maxend )
+            root.minend = min( root.end, root.left.minend )
+        return root
+
+    def rotateright( self ):
+        root = self.left
+        self.left = self.left.right
+        root.right = self
+        if self.right and self.left: 
+            self.maxend = max(self.end, self.right.maxend, self.left.maxend)
+            self.minend = min(self.end, self.right.minend, self.left.minend )
+        elif self.right:
+            self.maxend = max(self.end, self.right.maxend)
+            self.minend = min(self.end, self.right.minend)
+        elif self.left:
+            self.maxend = max(self.end, self.left.maxend)
+            self.minend = min(self.end, self.left.minend )
+        return root
+        
+    def rotateleft( self ):
+        root = self.right
+        self.right = self.right.left
+        root.left = self
+        if self.right and self.left: 
+            self.maxend = max(self.end, self.right.maxend, self.left.maxend)
+            self.minend = min(self.end, self.right.minend, self.left.minend )
+        elif self.right:
+            self.maxend = max(self.end, self.right.maxend)
+            self.minend = min(self.end, self.right.minend)
+        elif self.left:
+            self.maxend = max(self.end, self.left.maxend)
+            self.minend = min(self.end, self.left.minend )
+        return root
+
+    def intersect( self, start, end, report_func ):
+        if start < self.end and end > self.start: report_func( self )
+        if self.left and start < self.left.maxend:
+            self.left.intersect( start, end, report_func )
+        if self.right and end > self.start:
+            self.right.intersect( start, end, report_func )
+
+    def traverse( self, func ):
+        if self.left: self.left.traverse( func )
+        func( self )
+        if self.right: self.right.traverse( func )
+
+def main():
+    test = None
+    intlist = []
+    for x in range(20000):
+        start = random.randint(0,1000000)
+        end = start + random.randint(1, 1000)
+        if test: test = test.insert( start, end )
+        else: test = IntervalNode( start, end )
+        intlist.append( (start, end) )
+    starttime = time.clock()
+    for x in range(5000):
+        start = random.randint(0, 10000000)
+        end = start + random.randint(1, 1000)
+        result = []
+        test.intersect( start, end, lambda x: result.append(x.linenum) )
+    print "%f for tree method" % (time.clock() - starttime)
+    starttime = time.clock()
+    for x in range(5000):
+        start = random.randint(0, 10000000)
+        end = start + random.randint(1, 1000)
+        bad_sect( intlist, start, end)
+    print "%f for linear (bad) method" % (time.clock() - starttime)
+
+def test_func( node ):
+    print "[%d, %d), %d" % (node.start, node.end, node.maxend)
+
+def bad_sect( lst, int_start, int_end ):
+    intersection = []
+    for start, end in lst:
+        if int_start < end and int_end > start:
+            intersection.append( (start, end) )
+    return intersection
+
+if __name__ == "__main__":
+    main()
+
+
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/intervals/operations/__init__.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/intervals/operations/__init__.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/intervals/operations/__init__.py (revision 3)
@@ -0,0 +1,39 @@
+"""
+High level operations on genomic intervals. Most accept and produce iterables
+of `bx.io.inervals.io.GenomicInterval` objects. 
+"""
+
+from bx.bitset import *
+from bx.filter import *
+
+def warn( msg ):
+    print >> sys.stderr, msg
+
+def fail( msg ):
+    print >> sys.stderr, msg
+    sys.exit(1)
+
+BED_DEFAULT_COLS = 0, 1, 2, 5
+MAX_END = 512*1024*1024
+
+def bits_set_in_range( bits, range_start, range_end ):
+    """
+    Yield start,end tuples for each span of set bits in [range_start,range_end)
+    """
+    end = range_start
+    while 1:
+        start = bits.next_set( end )
+        end = min( bits.next_clear( start ), range_end )
+        if start >= end: break
+        yield start, end
+        
+def bits_clear_in_range( bits, range_start, range_end ):
+    """
+    Yield start,end tuples for each span of clear bits in [range_start,range_end)
+    """
+    end = range_start
+    while 1:
+        start = bits.next_clear( end )
+        if start >= range_end: break
+        end = min( bits.next_set( start ), range_end )
+        yield start, end
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/intervals/operations/join.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/intervals/operations/join.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/intervals/operations/join.py (revision 3)
@@ -0,0 +1,137 @@
+"""
+Join two sets of intervals using their overlap as the key.  The
+intervals MUST be sorted by chrom(lexicographically),
+start(arithmetically) and end(arithmetically).  This works by simply
+walking through the inputs in O(n) time.
+"""
+
+import psyco_full
+
+import math
+import traceback
+import fileinput
+from warnings import warn
+
+from bx.intervals.io import *
+from bx.intervals.operations import *
+from quicksect import IntervalTree
+
+def join(leftSet, rightSet, mincols=1, leftfill=True, rightfill=True):
+    # Read rightSet into memory:
+    rightlen = 0
+    leftlen = 0
+    rightTree = IntervalTree()
+    for item in rightSet:
+        if type( item ) is GenomicInterval:
+            rightTree.insert( item, rightSet.linenum, item.fields )
+            if rightlen == 0: rightlen = item.nfields
+
+    for interval in leftSet:
+        if leftlen == 0 and type( interval ) is GenomicInterval:
+            leftlen = interval.nfields
+        if not (type( interval ) is GenomicInterval):
+            yield interval
+        else:
+            result = []
+            rightTree.intersect( interval, lambda node: result.append( node ) )
+            overlap_not_met = 0
+            for item in result:
+                if item.start in range(interval.start,interval.end+1) and item.end not in range(interval.start,interval.end+1):
+                    overlap = interval.end-item.start
+                elif item.end in range(interval.start,interval.end+1) and item.start not in range(interval.start,interval.end+1):
+                    overlap = item.end-interval.start
+                elif item.start in range(interval.start,interval.end+1) and item.end in range(interval.start,interval.end+1):
+                    overlap = item.end-item.start
+                else:   #the intersecting item's start and end are outside the interval range
+                    overlap = interval.end-interval.start
+                if overlap < mincols:
+                    overlap_not_met += 1
+                    continue
+                outfields = list(interval)
+                map(outfields.append, item.other)
+                setattr( item, "visited", True )
+                yield outfields
+            if (len(result) == 0 or overlap_not_met == len(result)) and rightfill:
+                outfields = list(interval)
+                for x in range(rightlen): outfields.append(".")
+                yield outfields
+
+    if leftfill:
+        def report_unvisited( node, results ):
+            if not hasattr(node, "visited"):
+                results.append( node )
+        results = []
+        rightTree.traverse( lambda x: report_unvisited( x, results ) )
+        for item in results:
+            outfields = list()
+            for x in range(leftlen): outfields.append(".")
+            map(outfields.append, item.other)
+            yield outfields
+
+
+def interval_cmp(a, b):
+    interval1 = a[0]
+    interval2 = b[0]
+    if not (type( interval1 ) is GenomicInterval and type( interval2 ) is GenomicInterval):
+        return 0
+    # Both are intervals
+    if interval1.chrom == interval2.chrom:
+        center1 = interval1.start + ((interval1.end - interval1.start) / 2)
+        center2 = interval2.start + ((interval2.end - interval2.start) / 2)
+        return center1 - center2
+    else:
+        if interval1.chrom > interval2.chrom:
+            return 1
+        else:
+            return -1
+
+    return 0
+
+def findintersect(interval, sortedlist, mincols):
+    # find range of intervals that intersect via a binary search
+    # find lower bound
+    x = len(sortedlist) / 2
+    n = int(math.pow(2,math.ceil(math.log(len(sortedlist),2))))
+
+    not_found = True
+    not_done = True
+    while not_found and not_done:
+        n = n / 2
+        if n == 0:
+            n = 1
+            not_done = False
+        if x >= len(sortedlist):
+            x -= n
+        elif x < 0:
+            x += n
+        else:
+            if findoverlap(sortedlist[x][0], interval) >= mincols:
+                not_found = False
+            else:
+                comp = interval_cmp(sortedlist[x], [interval, 0])
+                if comp > 0:
+                    x -= n
+                else:
+                    x += n
+
+    print "\t".join(sortedlist[x][0].fields)
+    print "not_found = " + str(not_found)
+    if not_found:
+        return 0,-1
+
+    lowerbound = x
+    middlebound = x
+    upperbound = x
+    while (lowerbound > -1) and (findoverlap(sortedlist[lowerbound-1][0],interval) >= mincols):
+        lowerbound -= 1
+    while (upperbound+1 < len(sortedlist)) and (findoverlap(sortedlist[upperbound+1][0],interval) >= mincols):
+        upperbound += 1
+
+    return lowerbound, upperbound
+
+def findoverlap(a, b):
+    # overlapping
+    if a.chrom == b.chrom:
+        return min(a.end, b.end) - max(a.start, b.start)
+    else:
+        return 0
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/intervals/operations/merge.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/intervals/operations/merge.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/intervals/operations/merge.py (revision 3)
@@ -0,0 +1,40 @@
+"""
+Merge overlapping regions in two sets of genomic intervals.
+"""
+
+import psyco_full
+
+import traceback
+import fileinput
+from warnings import warn
+
+from bx.intervals.io import *
+from bx.intervals.operations import *
+
+# sorting could make this a less memory intensive operation(?)
+def merge( interval, mincols=1 ):
+    # Handle any ValueError, IndexError and OverflowError exceptions that may be thrown when
+    # the bitsets are being created by skipping the problem lines
+    interval = BitsetSafeReaderWrapper( interval, lens={} )
+    bitsets = interval.binned_bitsets()
+    if interval.header:
+        yield interval.header
+    for chrom in bitsets:
+        bitset = bitsets[chrom]
+        output = ["."] * (max(interval.chrom_col, interval.start_col, interval.end_col) + 1)
+        output[interval.chrom_col] = chrom
+        try:
+            for start, end in bits_set_in_range(bitset,0, MAX_END):
+                output[interval.start_col] = str(start)
+                output[interval.end_col] = str(end)
+                yield output
+        except IndexError, e:
+            try:
+                # This will work only if interval is a NiceReaderWrapper
+                interval.skipped += 1
+                # no reason to stuff an entire bad file into memmory
+                if interval.skipped < 10:
+                    interval.skipped_lines.append( ( interval.linenum, interval.current_line, str( e ) ) )
+            except:
+                pass
+            continue
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/intervals/operations/intersect.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/intervals/operations/intersect.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/intervals/operations/intersect.py (revision 3)
@@ -0,0 +1,77 @@
+"""
+Compute the intersection of two sets of genomic intervals, either base-by-base
+or at the interval level. The returned GenomicIntervalReader will be in
+the order of the first set of intervals passed in, with the corresponding 
+additional fields.
+"""
+
+import traceback
+import fileinput
+from warnings import warn
+
+from bx.intervals.io import *
+from bx.intervals.operations import *
+
+def intersect(readers, mincols=1, upstream_pad=0, downstream_pad=0, pieces=True, lens={}, comments=True):
+    # The incoming lens dictionary is a dictionary of chromosome lengths which are used to initialize the bitsets.
+    # Read all but first into bitsets and intersect to one
+    primary = readers[0]
+    intersect = readers[1:]
+    # Handle any ValueError, IndexError and OverflowError exceptions that may be thrown when
+    # the bitsets are being created by skipping the problem lines
+    intersect[0] = BitsetSafeReaderWrapper( intersect[0], lens=lens )
+    bitsets = intersect[0].binned_bitsets( upstream_pad=upstream_pad, downstream_pad=downstream_pad, lens=lens )
+    intersect = intersect[1:]
+    for andset in intersect:
+        bitset2 = andset.binned_bitsets(upstream_pad = upstream_pad, downstream_pad = downstream_pad, lens = lens)
+        for chrom in bitsets:
+            if chrom not in bitset2: continue
+            bitsets[chrom].iand(bitset2[chrom])
+        intersect = intersect[1:]
+    
+    # Read remaining intervals and intersect
+    for interval in primary:
+        if type( interval ) is Header:
+            yield interval
+        if type( interval ) is Comment and comments:
+            yield interval
+        elif type( interval ) == GenomicInterval:
+            chrom = interval.chrom
+            start = int( interval.start )
+            end = int( interval.end )
+            if chrom not in bitsets:
+                continue
+            if start > end:
+                try:
+                    # This will only work if primary is a NiceReaderWrapper
+                    primary.skipped += 1
+                    # no reason to stuff an entire bad file into memmory
+                    if primary.skipped < 10:
+                        primary.skipped_lines.append( ( primary.linenum, primary.current_line, "Interval start after end!" ) )
+                except:
+                    pass
+                continue
+            out_intervals = []
+            # Intersect or Overlap
+            try:
+                if bitsets[ chrom ].count_range( start, end-start ) >= mincols:                
+                    if pieces:
+                        out_intervals = bits_set_in_range( bitsets[chrom], start, end )
+                    else:
+                        out_intervals = [ ( start, end ) ]
+                # Write the intervals
+                for start, end in out_intervals:
+                    new_interval = interval.copy()
+                    new_interval.start = start
+                    new_interval.end = end
+                    yield new_interval
+            except IndexError, e:
+                try:
+                    # This will only work if primary is a NiceReaderWrapper
+                    primary.skipped += 1
+                    # no reason to stuff an entire bad file into memmory
+                    if primary.skipped < 10:
+                        primary.skipped_lines.append( ( primary.linenum, primary.current_line, str( e ) ) )
+                except:
+                    pass
+                continue
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/intervals/operations/complement.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/intervals/operations/complement.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/intervals/operations/complement.py (revision 3)
@@ -0,0 +1,55 @@
+"""
+Complement a set of intervals.
+"""
+
+import psyco_full
+
+import traceback
+import fileinput
+from warnings import warn
+
+from bx.intervals.io import *
+from bx.intervals.operations import *
+from bx.bitset import MAX
+
+def complement( reader, lens ):
+    # Handle any ValueError, IndexError and OverflowError exceptions that may be thrown when
+    # the bitsets are being created by skipping the problem lines
+    complement_reader = BitsetSafeReaderWrapper( reader, lens=lens )
+    bitsets = complement_reader.binned_bitsets( upstream_pad=0, downstream_pad=0, lens=lens )
+    # NOT them all
+    for key, value in bitsets.items():
+        value.invert()
+    # Read remaining intervals and subtract
+    for chrom in bitsets:
+        bitset = bitsets[chrom]
+        out_intervals = bits_set_in_range( bitset, 0, lens.get( chrom, MAX ) )
+        try:
+            # Write the intervals
+            for start, end in out_intervals:
+                fields = ["."  for x in range(max(complement_reader.chrom_col, complement_reader.start_col, complement_reader.end_col)+1)]
+                # default the column to a + if it exists
+                if complement_reader.strand_col < len( fields ) and complement_reader.strand_col >= 0:
+                    fields[complement_reader.strand_col] = "+"
+                fields[complement_reader.chrom_col] = chrom
+                fields[complement_reader.start_col] = start
+                fields[complement_reader.end_col] = end
+                new_interval = GenomicInterval(complement_reader, fields, complement_reader.chrom_col, complement_reader.start_col, complement_reader.end_col, complement_reader.strand_col, "+")
+                yield new_interval
+        except IndexError, e:
+            complement_reader.skipped += 1
+            # no reason to stuff an entire bad file into memmory
+            if complement_reader.skipped < 10:
+                complement_reader.skipped_lines.append( ( complement_reader.linenum, complement_reader.current_line, str( e ) ) )
+            continue
+
+
+# def main():
+#     # test it all out
+#     f1 = fileinput.FileInput("dataset_7.dat")
+#     g1 = GenomicIntervalReader(f1)
+#     for interval in complement(g1,{"chr":16000000}):
+#         print "\t".join(interval)
+# 
+# if __name__ == "__main__":
+#     main()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/intervals/operations/find_clusters.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/intervals/operations/find_clusters.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/intervals/operations/find_clusters.py (revision 3)
@@ -0,0 +1,162 @@
+"""
+Find clusters of intervals within a set of intervals.  A cluster is a
+group (of size minregions) of intervals within a specific distance (of
+mincols) of each other.
+
+Returns Cluster objects, which have a chrom, start, end, and lines (a
+list of linenumbers from the original file).  The original can then be
+ran through with the linenumbers to extract clustered regions without
+disturbing original order, or the clusters may themselves be written
+as intervals.
+"""
+
+import random
+import math
+
+import traceback
+import fileinput
+from warnings import warn
+
+from bx.intervals.cluster import *
+from bx.intervals.io import *
+from bx.intervals.operations import *
+
+
+def find_clusters(reader, mincols=1, minregions=2):
+    extra = dict()
+    chroms = dict()
+    linenum = -1
+    for interval in reader:
+        linenum += 1
+        if not type( interval ) is GenomicInterval:
+            extra[linenum] = interval
+        else:
+            if interval.chrom not in chroms:
+                chroms[interval.chrom] = ClusterTree( mincols, minregions )
+            try:
+                chroms[interval.chrom].insert( interval.start, interval.end, linenum )
+            except OverflowError, e:
+                try:
+                    # This will work only if reader is a NiceReaderWrapper
+                    reader.skipped += 1
+                    if reader.skipped < 10:
+                        reader.skipped_lines.append( ( reader.linenum, reader.current_line, str( e ) ) )
+                except:
+                    pass
+                continue
+    return chroms, extra
+
+
+### DEPRECATED: Use the ClusterTree in bx.intervals.cluster for this.
+### It does the same thing, but is a C implementation.
+class ClusterNode( object ):
+    def __init__( self, start, end, linenum, mincols, minregions ):
+        # Python lacks the binomial distribution, so we convert a
+        # uniform into a binomial because it naturally scales with
+        # tree size.  Also, python's uniform is perfect since the
+        # upper limit is not inclusive, which gives us undefined here.
+        self.priority = math.ceil( (-1.0 / math.log(.5)) * math.log( -1.0 / (random.uniform(0,1) - 1)))
+        self.start = start
+        self.end = end
+        self.left = None
+        self.right = None
+        self.lines = [linenum]
+        self.mincols = mincols
+        self.minregions = minregions
+        
+    def insert( self, start, end, linenum ):
+        if start - self.mincols > self.end:
+            # insert to right tree
+            if self.right:
+                self.right = self.right.insert( start, end, linenum )
+            else:
+                self.right = ClusterNode(start, end, linenum, self.mincols, self.minregions)
+            # rebalance tree
+            if self.priority < self.right.priority:
+                return self.rotateleft()
+        elif end + self.mincols < self.start:
+            # insert to left tree
+            if self.left:
+                self.left = self.left.insert( start, end, linenum )
+            else:
+                self.left = ClusterNode(start, end, linenum, self.mincols, self.minregions)
+            # rebalance tree
+            if self.priority < self.left.priority:
+                return self.rotateright()
+        else:
+            # insert here
+            self.start = min(self.start, start)
+            self.end = max(self.end, end)
+            self.lines.append(linenum)
+            # recursive call to push nodes up
+            if self.left:
+                self.left = self.left.push_up(self)
+            if self.right:
+                self.right = self.right.push_up(self)
+        return self
+
+    def rotateright( self ):
+        root = self.left
+        self.left = self.left.right
+        root.right = self
+        return root
+        
+    def rotateleft( self ):
+        root = self.right
+        self.right = self.right.left
+        root.left = self
+        return root
+        
+    def push_up( self, topnode ):
+        # Note: this function does not affect heap property
+        # Distance method removed for inline, faster?
+        distance = max(self.start, topnode.start) - min(self.end, topnode.end)
+        if distance <= self.mincols:
+            topnode.start = min(self.start, topnode.start)
+            topnode.end = max(self.end, topnode.end)
+            for linenum in self.lines:
+                topnode.lines.append(linenum)
+            if self.right:
+                return self.right.push_up( topnode )
+            if self.left:
+                return self.left.push_up( topnode )
+            return None
+        if self.end < topnode.start and self.right:
+            self.right = self.right.push_up( topnode )
+        if self.start > topnode.end and self.left:
+            self.left = self.left.push_up( topnode )
+        return self
+
+    def getintervals( self ):
+        if self.left:
+            for start, end in self.left.getintervals(minregions):
+                yield start, end
+        if len(self.lines) >= minregions:
+            yield self.start, self.end
+        if self.right:
+            for start, end in self.right.getintervals(minregions):
+                yield start, end
+
+    def getlines( self ):
+        if self.left:
+            for line in self.left.getlines():
+                yield line
+        if len(self.lines) >= minregions:
+            for line in self.lines:
+                yield line
+        if self.right:
+            for line in self.right.getlines():
+                yield line
+                
+## def main():
+##     f1 = fileinput.FileInput("big.bed")
+##     g1 = GenomicIntervalReader(f1)
+##     returntree, extra = find_clusters(g1, mincols=50)
+##     print "All found"
+##     for chrom, value in returntree.items():
+##         for start, end in value.getregions():
+##             print chrom+"\t"+str(start)+"\t"+str(end)
+##         for line in value.getlines():
+##             print "Line:\t"+str(line)
+
+## main()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/intervals/operations/base_coverage.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/intervals/operations/base_coverage.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/intervals/operations/base_coverage.py (revision 3)
@@ -0,0 +1,29 @@
+"""
+Determine the number of bases covered by a set of intervals.
+"""
+
+import psyco_full
+
+import traceback
+import fileinput
+from warnings import warn
+
+from bx.intervals.io import *
+from bx.intervals.operations import *
+
+def base_coverage( reader ):
+    # Handle any ValueError, IndexError and OverflowError exceptions that may be thrown when
+    # the bitsets are being created by skipping the problem lines
+    base_reader = BitsetSafeReaderWrapper( reader, lens={} )
+    bitsets = base_reader.binned_bitsets()
+    coverage = 0
+    for chrom in bitsets:
+        try:
+            coverage += bitsets[chrom].count_range(0, MAX_END)
+        except IndexError, e:
+            base_reader.skipped += 1
+            # no reason to stuff an entire bad file into memmory
+            if base_reader.skipped < 10:
+                base_reader.skipped_lines.append( ( base_reader.linenum, base_reader.current_line, str( e ) ) )
+            continue
+    return coverage
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/intervals/operations/concat.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/intervals/operations/concat.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/intervals/operations/concat.py (revision 3)
@@ -0,0 +1,61 @@
+"""
+Concatenate sets of intervals. 
+
+Preserves format of the first input -- it is possible to concat two files that
+have different column orders. Of course, the meta-data of the second will be
+lost (and filled with a "."). If all of the files (GenomicInteralReaders) are
+the same format, sameformat=True will preserve all columns of the first input,
+cuts extra columns on subsequent input, and pads missing columns. If
+sameformat=False then extra columns are filled with ".".
+"""
+
+import psyco_full
+
+import traceback
+import fileinput
+from warnings import warn
+
+from bx.intervals.io import *
+from bx.intervals.operations import *
+
+def concat(readers, comments=True, header=True, sameformat=True):
+    # Save columns from the first input
+    chrom_col = readers[0].chrom_col
+    start_col = readers[0].start_col
+    end_col = readers[0].end_col
+    strand_col = readers[0].strand_col
+    nfields = None
+    firstdataset = True
+    output = False
+    for intervals in readers:
+        for interval in intervals:
+            if type( interval ) is GenomicInterval:
+                if not nfields: nfields = interval.nfields
+                out_interval = interval.copy()
+                if sameformat or firstdataset:
+                    # everything except the first input has to be
+                    # trimmed or padded to match the first input
+                    if len(out_interval.fields) > nfields:
+                        out_interval.fields = out_interval.fields[0:nfields]
+                        while len(out_interval.fields) < nfields:
+                            out_interval.fields.append(".")
+                    output = True
+                    yield out_interval
+                else:
+                    chrom = out_interval.chrom
+                    start = out_interval.start
+                    end = out_interval.end
+                    strand = out_interval.strand
+                    out_interval.fields = ["." for col in range(nfields)]  
+                    out_interval.fields[chrom_col] = chrom
+                    out_interval.fields[start_col] = str(start)
+                    out_interval.fields[end_col] = str(end)
+                    # Strand is optional, might not exist in output
+                    if strand_col < len( out_interval.fields ):
+                        out_interval.fields[strand_col] = strand
+                    yield out_interval
+            elif type( interval ) is Header and header:
+                yield interval
+            elif type( interval ) is Comment and comments:
+                yield interval
+        if output and firstdataset: firstdataset = False
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/intervals/operations/subtract.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/intervals/operations/subtract.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/intervals/operations/subtract.py (revision 3)
@@ -0,0 +1,72 @@
+#!/usr/bin/env python
+"""
+Subtract one set of genomic intervals from another (base-by-base or whole
+intervals). The returned GenomicIntervals will be in the order
+of the first set of intervals passed in, with the corresponding
+meta-data.
+"""
+
+import traceback
+import fileinput
+from warnings import warn
+
+from bx.intervals.io import *
+from bx.intervals.operations import *
+
+def subtract(readers, mincols=1, upstream_pad=0, downstream_pad=0, pieces=True, lens={}, comments=True):
+    # The incoming lens dictionary is a dictionary of chromosome lengths which are used to initialize the bitsets.
+    # Read all but first into bitsets and union to one (if confused, read DeMorgan's...)
+    primary = readers[0]
+    union = readers[1:]
+    # Handle any ValueError, IndexError and OverflowError exceptions that may be thrown when
+    # the bitsets are being created by skipping the problem lines
+    union[0] = BitsetSafeReaderWrapper( union[0], lens=lens )
+    bitsets = union[0].binned_bitsets( upstream_pad=upstream_pad, downstream_pad=downstream_pad, lens=lens )
+    union = union[1:]
+    for andset in union:
+        bitset2 = andset.binned_bitsets(upstream_pad = upstream_pad, downstream_pad = downstream_pad, lens = lens)
+        for chrom in bitset2:
+            if chrom not in bitsets:
+                bitsets[chrom] = bitset2[chrom]
+            else:
+                bitsets[chrom].ior(bitset2[chrom])
+    
+    # Read remaining intervals and subtract
+    for interval in primary:
+        if type( interval ) is Header:
+            yield interval
+        if type( interval ) is Comment and comments:
+            yield interval
+        elif type( interval ) == GenomicInterval:
+            chrom = interval.chrom
+            if chrom not in bitsets:
+                yield interval
+            else:
+                start = int(interval.start)
+                end = int(interval.end)
+                if start > end: warn( "Interval start after end!" )
+                out_intervals = []
+                # Find the intervals that meet the criteria (for the three sensible
+                # permutations of reverse and pieces)
+                try:
+                    if bitsets[ chrom ].count_range( start, end-start ) >= mincols:                
+                        if pieces:
+                            out_intervals = bits_clear_in_range( bitsets[chrom], start, end )
+                    else:
+                        out_intervals = [ ( start, end ) ]
+                    # Write the intervals
+                    for start, end in out_intervals:
+                        new_interval = interval.copy()
+                        new_interval.start = start
+                        new_interval.end = end
+                        yield new_interval
+                except IndexError, e:
+                    try:
+                        # This will work only if primary is a NiceReaderWrapper
+                        primary.skipped += 1
+                        # no reason to stuff an entire bad file into memmory
+                        if primary.skipped < 10:
+                            primary.skipped_lines.append( ( primary.linenum, primary.current_line, str( e ) ) )
+                    except:
+                        pass
+                    continue
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/intervals/__init__.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/intervals/__init__.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/intervals/__init__.py (revision 3)
@@ -0,0 +1,7 @@
+"""
+Tools and data structures for working with genomic intervals (or sets of 
+regions on a line in general) efficiently.
+"""
+
+# For compatiblity with existing stuff
+from bx.intervals.intersection import *
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/intervals/random.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/intervals/random.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/intervals/random.py (revision 3)
@@ -0,0 +1,212 @@
+"""
+Classes for generating random sets of intervals over larger regions.
+"""
+
+from bx.bitset import *
+import bisect
+random = __import__( 'random' )
+
+class MaxtriesException( Exception ):
+    pass
+
+def throw_random_list( lengths, mask, allow_overlap=False ):
+    rval = []
+    throw_random_gap_list( lengths, mask, lambda s, e: rval.append( ( s, e ) ), allow_overlap )
+    assert sum( b - a for a, b in rval ) == sum( lengths )
+    return rval
+
+def throw_random_bits( lengths, mask, allow_overlap=False ):
+    rval = BitSet( mask.size )
+    throw_random_gap_list( lengths, mask, lambda s, e: rval.set_range( s, e - s ), allow_overlap )
+    if not allow_overlap:
+        assert rval.count_range( 0, rval.size ) == sum( lengths )
+    return rval
+
+def throw_random_gap_list( lengths, mask, save_interval_func, allow_overlap=False ):
+    """
+    Generates a set of non-overlapping random intervals from a length 
+    distribution.
+    
+    `lengths`: list containing the length of each interval to be generated.
+               We expect this to be sorted by decreasing length to minimize
+               the chance of failure (MaxtriesException) and for some
+               performance gains when allow_overlap==True and there are
+               duplicate lengths
+    `mask`: a BitSet in which set bits represent regions not to place 
+            intervals. The size of the region is also determined from the
+            mask.
+    """
+    # Use mask to find the gaps;  gaps is a list of (length,start,end)
+    lengths = [length for length in lengths if length > 0]
+    min_length = min( lengths )
+    gaps = []
+    start = end = 0
+    while 1:
+        start = mask.next_clear( end )
+        if start == mask.size: break
+        end = mask.next_set( start )
+        if end-start >= min_length:
+            gaps.append( ( end-start, start, None ) )
+    # Sort (long regions first)    
+    gaps.sort()
+    gaps.reverse()
+    # Throw
+    throw_random_private( lengths, gaps, save_interval_func, allow_overlap, three_args=False )
+
+def throw_random_intervals( lengths, regions, save_interval_func=None, allow_overlap=False ):
+    """
+    Generates a set of non-overlapping random intervals from a length 
+    distribution.
+    
+    `lengths`: list containing the length of each interval to be generated.
+               We expect this to be sorted by decreasing length to minimize
+               the chance of failure (MaxtriesException) and for some
+               performance gains when allow_overlap==True and there are
+               duplicate lengths.
+    `regions`: A list of regions in which intervals can be placed.  Elements
+               are tuples or lists of the form (start, end, ...), where ...
+               indicates any number of items (including zero).
+    `save_interval_func`: A function accepting three arguments which will be 
+                          passed the (start,stop,region) for each generated 
+                          interval, where region is an entry in the regions
+                          list.  If this is None, the generated intervals will
+                          be returned as a list of elements copied from the
+                          region with start and end modified.
+    """
+    # Copy regions
+    regions = [( x[1]-x[0], x[0], x ) for x in regions]
+    # Sort (long regions first)    
+    regions.sort()
+    regions.reverse()
+    # Throw
+    if (save_interval_func != None):
+        throw_random_private( lengths, regions, save_interval_func, allow_overlap )
+        return
+    else:
+        intervals = []
+        save_interval_func = lambda s, e, rgn: intervals.append( overwrite_start_end ( s, e, rgn ) )
+        throw_random_private( lengths, regions, save_interval_func, allow_overlap )
+        return intervals
+
+def overwrite_start_end(s,e,rgn):
+    rgn = list(rgn)
+    rgn[0] = s
+    rgn[1] = e
+    return tuple(rgn)
+
+
+def throw_random_private( lengths, regions, save_interval_func, allow_overlap=False, three_args=True ):
+    """
+    (Internal function;  we expect calls only through the interface functions
+    above)
+    
+    `lengths`: A list containing the length of each interval to be generated.
+    `regions`: A list of regions in which intervals can be placed, sorted by
+               decreasing length.  Elements are triples of the form (length,
+               start, extra), This list CAN BE MODIFIED by this function.
+    `save_interval_func`: A function accepting three arguments which will be 
+                          passed the (start,stop,extra) for each generated 
+                          interval.
+    """
+
+    # Implementation:
+    #   We keep a list of the regions, sorted from largest to smallest.  We then
+    #   place each length by following steps:
+    #     (1) construct a candidate counts array (cc array)
+    #     (2) choose a candidate at random
+    #     (3) find region containing that candidate
+    #     (4) map candidate to position in that region
+    #     (5) split region if not allowing overlaps
+    #     (6) report placed segment
+    #
+    #   The cc array is only constructed if there's a change (different length
+    #   to place, or the region list has changed).  It contains, for each
+    #   region, the total number of number of candidate positions in regions
+    #   *preceding* it in the region list:
+    #     cc[i] = sum over k in 0..(i-1) of length[i] - L + 1
+    #   where N is the number of regions and L is the length being thrown.
+    #   At the same time, we determine the total number of candidates (the total
+    #   number of places the current length can be placed) and the index range
+    #   of regions into which the length will fit.
+    #
+    #   example:
+    #     for L = 20
+    #     i =           0   1   2   3   4   5   6   7   8   9
+    #     length[i] =  96  66  56  50  48  40  29  17  11   8
+    #     cc[i] =       0  77 124 161 192 221 242   X   X   X
+    #     candidates = 252
+    #     lo_rgn = 0
+    #     hi_rgn = 6
+    #
+    #   The candidate is chosen in (0..candidates-1).  The candidate counts
+    #   array allows us to do a binary search to locate the region that holds that
+    #   candidate.  Continuing the example above, we choose a random candidate
+    #   s in (0..251).  If s happens to be in (124..160), it will be mapped to
+    #   region 2 at start position s-124.
+    #
+    #   During the binary search, if we are looking at region 3, if s < cc[3]
+    #   then the desired region is region 2 or lower.  Otherwise it is region 3 or
+    #   higher.
+
+    min_length = min( lengths )
+    prev_length = None # (force initial cc array construction)
+    cc = [0] * (len( regions ) + len(lengths) - 1)
+    num_thrown = 0
+    for length in lengths:
+        # construct cc array (only needed if length has changed or region list has
+        # changed)
+        if length != prev_length:
+            prev_length = length
+            assert len( cc ) >= len( regions )
+            candidates = 0
+            hi_rgn = 0
+            for region in regions:
+                rgn_len = region[0]
+                if rgn_len < length:
+                    break
+                cc[hi_rgn] = candidates
+                candidates += rgn_len - length + 1
+                hi_rgn += 1
+            if candidates == 0:
+                raise MaxtriesException( "No region can fit an interval of length %d (we threw %d of %d)" \
+                                       % ( length, num_thrown,len( lengths ) ) )
+            hi_rgn -= 1
+        # Select a candidate
+        s = random.randrange( candidates )
+        #..
+        #..for ix in range( len( regions ) ):
+        #..    region = regions[ix]
+        #..    if ix <= hi_rgn: print "%2s: %5s %5s %5s" % ( ix, region[1], region[0], cc[ix] )
+        #..    else:            print "%2s: %5s %5s %5s" % ( ix, region[1], region[0], "X" )
+        #..print "s = %s (of %s candidates)" % ( s, candidates )
+        # Locate region containing that candidate, by binary search
+        lo = 0
+        hi = hi_rgn
+        while hi > lo:
+            mid = (lo + hi + 1) / 2     # (we round up to prevent infinite loop)
+            if s < cc[mid]: hi = mid-1  # (s <  num candidates from 0..mid-1)
+            else:           lo = mid    # (s >= num candidates from 0..mid-1)
+        s -= cc[lo]
+        # If we are not allowing overlaps we will remove the placed interval
+        # from the region list
+        if allow_overlap:
+            rgn_length, rgn_start, rgn_extra = regions[lo]
+        else:
+            # Remove the chosen region and split
+            rgn_length, rgn_start, rgn_extra = regions.pop( lo )
+            rgn_end = rgn_start + rgn_length
+            assert s >= 0
+            assert rgn_start + s + length <= rgn_end, "Expected: %d + %d + %d == %d <= %d" % ( rgn_start, s, length, rgn_start + s + length, rgn_end )
+            regions.reverse()
+            if s >= min_length:
+                bisect.insort( regions, ( s, rgn_start, rgn_extra ) )
+            if s + length <= rgn_length - min_length:
+                bisect.insort( regions, ( rgn_length - ( s + length ), rgn_start + s + length, rgn_extra ) )
+            regions.reverse()
+            prev_length = None # (force cc array construction)
+        # Save the new interval
+        if (three_args):
+            save_interval_func( rgn_start + s, rgn_start + s + length, rgn_extra )
+        else:
+            save_interval_func( rgn_start + s, rgn_start + s + length )
+        num_thrown += 1
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/intervals/cluster.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/intervals/cluster.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/intervals/cluster.py (revision 3)
@@ -0,0 +1,7 @@
+def __bootstrap__():
+   global __bootstrap__, __loader__, __file__
+   import sys, pkg_resources, imp
+   __file__ = pkg_resources.resource_filename(__name__,'cluster.so')
+   __loader__ = None; del __bootstrap__, __loader__
+   imp.load_dynamic(__name__,__file__)
+__bootstrap__()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/intervals/cluster_tests.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/intervals/cluster_tests.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/intervals/cluster_tests.py (revision 3)
@@ -0,0 +1,103 @@
+import sys, os
+import unittest
+try:
+    sys.path.insert(0, os.path.dirname(os.path.dirname(__file__)))
+except:
+    sys.path.insert(0, os.path.dirname(os.path.abspath(".")))
+
+# from bx.intervals.cluster import ClusterTree
+from cluster import ClusterTree
+
+class TestCluster(unittest.TestCase):
+    def setUp(self):
+        self.tree = ClusterTree(0, 0)
+    
+    def insertpairs(self, pairs):
+        for i, (s, e) in enumerate(pairs):
+            self.tree.insert(s, e, i)
+    
+    def test_merge_case(self):
+        pairs = [(3, 4), (6, 7), (9, 10), (1, 2), (3, 8)]
+        self.insertpairs(pairs)
+        
+        self.assertEqual( [(1, 2, [3]), (3, 8, [0, 1, 4]), (9, 10, [2])], self.tree.getregions() )
+    
+    def test_trivial(self):
+        pairs = [ (1, 4), (4, 5) ]
+        self.insertpairs(pairs)
+        
+        self.assertEqual( [(1, 5, [0, 1])], self.tree.getregions() )
+        
+    def test_easymerge(self):
+        pairs = [ (1, 2), (4, 5), (2, 4) ]
+        self.insertpairs(pairs)
+
+        self.assertEqual( [(1, 5, [0, 1, 2])], self.tree.getregions() )
+        
+    def test_hardmerge(self):
+        pairs = [ (1, 2), (8, 9), (3, 4), (5, 6), (7, 8), (1, 10) ]
+        self.insertpairs(pairs)
+
+        self.assertEqual( [(1, 10, [0, 1, 2, 3, 4, 5])], self.tree.getregions() )
+    
+    def test_duplicates(self):
+        pairs = [ (1, 1), (1, 2), (3, 4), (3, 4), (1, 4) ]
+        self.insertpairs(pairs)
+
+        self.assertEqual( [(1, 4, [0, 1, 2, 3, 4])], self.tree.getregions() )
+        
+    def test_startbeforeend(self):
+        self.assertRaises(ValueError, self.tree.insert, 4, 2, 0)
+        
+    def test_large_sorted(self):
+        upto = 100000
+        pairs = [ (2*i + 1, 2*i + 2) for i in range(upto) ]
+        self.insertpairs(pairs)
+        self.tree.insert( 0, upto*3, upto )
+        self.assertEqual( [ (0, upto*3, [x for x in range(upto+1)]) ], self.tree.getregions() )
+        
+    def test_minregions(self):
+        self.tree = ClusterTree(0, 2)
+        pairs = [(3, 4), (6, 7), (9, 10), (1, 2), (3, 8)]
+        self.insertpairs(pairs)
+        
+        self.assertEqual( [(3, 8, [0, 1, 4])], self.tree.getregions() )
+        
+    def test_distance(self):
+        self.tree = ClusterTree(1, 0)
+        pairs = [(3, 4), (6, 7), (9, 10), (1, 2), (3, 8)]
+        self.insertpairs(pairs)
+        
+        self.assertEqual( [(1, 10, [0, 1, 2, 3, 4])], self.tree.getregions() )
+        
+    def test_merge_left_right(self):
+        pairs = [(6, 7, 1), (1, 2, 3), (9, 10, 2), (3, 4, 0), (3, 8, 4)]
+        for s, e, i in pairs:
+            self.tree.insert(s, e, i)
+
+        self.assertEqual( [(1, 2, [3]), (3, 8, [0, 1, 4]), (9, 10, [2])], self.tree.getregions() )
+    
+    def test_larger(self):
+        pairs = [(1, 2), (3, 4), (5, 6), (7, 8), (9, 10), (11, 12), (13, 14), (15, 16), (17, 18), (19, 20),
+                (1, 3), (4, 10), (10, 15), (15, 20), (21, 22)]
+        self.insertpairs(pairs)
+        
+        self.assertEqual( [(1, 20, [x for x in range(14)]), (21, 22, [14])], self.tree.getregions() )
+    
+    def test_another(self):
+        pairs = [(3, 4, 1), (13, 14, 6), (21, 22, 14), (5, 6, 2), (4, 10, 11), (1, 2, 0), (11, 12, 5), (1, 3, 10), (7, 8, 3), (15, 16, 7), (15, 20, 13), (19, 20, 9), (10, 15, 12), (17, 18, 8), (9, 10, 4)]
+        # pairs = [(3, 4, 1), (13, 14, 6), (21, 22, 14), (5, 6, 2), (4, 10, 11), (1, 2, 0), (11, 12, 5), (1, 3, 10), (7, 8, 3), (15, 16, 7), (15, 20, 13), (19, 20, 9), (10, 15, 12), (9, 10, 4)]
+        for s, e, i in pairs:
+            self.tree.insert(s, e, i)
+        
+        self.assertEqual( [(1, 20, [x for x in range(14)]), (21, 22, [14])], self.tree.getregions() )
+        
+    def test_none(self):
+        pairs = []
+        self.insertpairs(pairs)
+
+        self.assertEqual( [], self.tree.getregions() )
+        
+
+if __name__ == '__main__':
+    unittest.main()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/intervals/intersection.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/intervals/intersection.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/intervals/intersection.py (revision 3)
@@ -0,0 +1,7 @@
+def __bootstrap__():
+   global __bootstrap__, __loader__, __file__
+   import sys, pkg_resources, imp
+   __file__ = pkg_resources.resource_filename(__name__,'intersection.so')
+   __loader__ = None; del __bootstrap__, __loader__
+   imp.load_dynamic(__name__,__file__)
+__bootstrap__()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/intervals/io.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/intervals/io.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/intervals/io.py (revision 3)
@@ -0,0 +1,205 @@
+"""
+Support for reading and writing genomic intervals from delimited text files.
+"""
+
+import sys
+from itertools import *
+from bx.tabular.io import *
+from bx.bitset import *
+
+class MissingFieldError( ParseError ):
+    pass
+
+class FieldFormatError( ParseError ):
+    def __init__( self, *args, **kwargs):
+        ParseError.__init__( self, *args, **kwargs )
+        self.expected = kwargs.get("expected",None)
+    def __str__( self ):
+        if self.expected:
+            return ParseError.__str__( self ) + ", " + self.expected + " expected"
+        else:
+            return ParseError.__str__( self )
+
+class StrandFormatError( ParseError ):
+    pass
+
+class GenomicInterval( TableRow ):
+    """
+    A genomic interval stored in a set of fields (a row of a table)
+    """
+    def __init__( self, reader, fields, chrom_col, start_col, end_col, strand_col, default_strand, fix_strand=False ):
+        TableRow.__init__( self, reader, fields )
+        self.chrom_col = chrom_col
+        self.start_col = start_col
+        self.end_col = end_col
+        self.strand_col = strand_col
+        self.nfields = nfields = len( fields )
+        # Parse chrom/source column
+        if chrom_col >= nfields:
+            raise MissingFieldError( "No field for chrom_col (%d)" % chrom_col )
+        self.chrom = fields[chrom_col]
+        # Parse start column and ensure it is an integer
+        if start_col >= nfields:
+            raise MissingFieldError( "No field for start_col (%d)" % start_col )
+        try:
+            self.start = int( fields[start_col] )
+        except ValueError, e:
+            raise FieldFormatError( "Could not parse start_col: " + str( e ), expected="integer" )
+        # Parse end column and ensure it is an integer
+        if end_col >= nfields:
+            raise MissingFieldError( "No field for end_col (%d)" % end_col )
+        try:
+            self.end = int( fields[end_col] )
+        except ValueError, e:
+            raise FieldFormatError( "Could not parse end_col: " + str( e ), expected="integer" )
+        # Ensure start <= end
+        if self.end < self.start:
+            raise ParseError( "Start is greater than End. Interval length is < 1." )
+        # Parse strand and ensure it is valid
+        if strand_col >= nfields or strand_col < 0:
+            # This should probable be immutable since the fields are 
+            # not updated when it is set
+            self.strand = default_strand
+        else:
+            strand = fields[strand_col]
+            if strand not in ( "+", "-"):
+                if fix_strand:
+                    strand = "+"
+                else: raise StrandFormatError( "Strand must be either '+' or '-'" )
+            self.strand = strand
+    def __setattr__( self, name, value ):
+        if name == "chrom":
+            self.fields[self.chrom_col] = str( value )
+        elif name == "start":
+            self.fields[self.start_col] = str( value )
+        elif name == "end":
+            self.fields[self.end_col] = str( value )
+        elif name == "strand":
+            if self.strand_col < self.nfields and self.strand_col >= 0:
+                self.fields[self.strand_col] = str( value )
+        object.__setattr__( self, name, value )
+    def __str__( self ):
+        return "\t".join( self.fields )
+    def copy( self ):
+        return GenomicInterval(self.reader, list( self.fields ), self.chrom_col, self.start_col, self.end_col, self.strand_col, self.strand)
+
+class GenomicIntervalReader( TableReader ):
+    """
+    Reader for iterating a set of intervals in a tab separated file. Can
+    also parse header and comment lines if requested.
+    
+    >>> r = GenomicIntervalReader( [ "#chrom\\tname\\tstart\\tend\\textra",
+    ...               "chr1\\tfoo\\t1\\t100\\txxx",
+    ...               "chr2\\tbar\\t20\\t300\\txxx",
+    ...               "#I am a comment",
+    ...               "chr2\\tbar\\t20\\t300\\txxx" ], start_col=2, end_col=3 )
+    >>> elements = list( r )
+    >>> assert type( elements[0] ) is Header
+    >>> str( elements[0] )
+    '#chrom\\tname\\tstart\\tend\\textra'
+    >>> assert type( elements[1] ) is GenomicInterval
+    >>> print elements[1].start, elements[1].end
+    1 100
+    >>> str( elements[1] )
+    'chr1\\tfoo\\t1\\t100\\txxx'
+    >>> elements[1].start = 30
+    >>> print elements[1].start, elements[1].end
+    30 100
+    >>> str( elements[1] )
+    'chr1\\tfoo\\t30\\t100\\txxx'
+    >>> assert type( elements[2] ) is GenomicInterval
+    >>> assert type( elements[3] ) is Comment
+    >>> assert type( elements[4] ) is GenomicInterval
+    """
+    def __init__( self, input, chrom_col=0, start_col=1, end_col=2, strand_col=5, 
+                  default_strand="+", return_header=True, return_comments=True, force_header=None, fix_strand=False, comment_lines_startswith = ["#", "track "] ):
+        TableReader.__init__( self, input, return_header, return_comments, force_header, comment_lines_startswith )
+        self.chrom_col = chrom_col
+        self.start_col = start_col
+        self.end_col = end_col
+        self.strand_col = strand_col
+        self.default_strand = default_strand
+        self.fix_strand = fix_strand
+    def parse_row( self, line ):
+        return GenomicInterval( self, line.split( "\t" ), self.chrom_col, 
+                                self.start_col, self.end_col,
+                                self.strand_col, self.default_strand, fix_strand=self.fix_strand )
+
+    def binned_bitsets( self , upstream_pad=0, downstream_pad=0, lens={} ):
+        # The incoming lens dictionary is a dictionary of chromosome lengths
+        # which are used to initialize the bitsets.
+        last_chrom = None
+        last_bitset = None
+        bitsets = dict()
+        for interval in self:
+            if type( interval ) == GenomicInterval:
+                chrom = interval[self.chrom_col]
+                if chrom != last_chrom:
+                    if chrom not in bitsets:
+                        size = lens.get( chrom, MAX )
+                        try:
+                            bbs = BinnedBitSet( size )
+                        except ValueError, e:
+                            # We will only reach here when constructing this bitset from the lens dict
+                            # since the value of MAX is always safe.
+                            raise Exception( "Invalid chrom length %s in 'lens' dictionary. %s" % ( str( size ), str( e ) ) )
+                        bitsets[chrom] = bbs
+                    last_chrom = chrom
+                    last_bitset = bitsets[chrom]
+                start = max( int( interval[self.start_col] ), 0 )
+                end = min( int( interval[self.end_col] ), last_bitset.size)
+                last_bitset.set_range( start, end-start )
+        return bitsets
+
+class NiceReaderWrapper( GenomicIntervalReader ):
+    def __init__( self, reader, **kwargs ):
+        GenomicIntervalReader.__init__( self, reader, **kwargs )
+        self.outstream = kwargs.get("outstream", None)
+        self.print_delegate = kwargs.get("print_delegate", None)
+        self.input_wrapper = iter( self.input )
+        self.input_iter = self.iterwrapper()
+        self.skipped = 0
+        self.skipped_lines = []
+    def __iter__( self ):
+        return self
+    def next( self ):
+        while 1:
+            try:
+                nextitem = GenomicIntervalReader.next( self )
+                return nextitem
+            except ParseError, e:
+                if self.outstream:
+                    if self.print_delegate and hasattr(self.print_delegate,"__call__"):
+                        self.print_delegate( self.outstream, e, self )
+                self.skipped += 1
+                # no reason to stuff an entire bad file into memmory
+                if self.skipped < 10:
+                    self.skipped_lines.append( ( self.linenum, self.current_line, str( e ) ) )
+    def iterwrapper( self ):
+        while 1:
+            self.current_line = self.input_wrapper.next()
+            yield self.current_line
+
+class BitsetSafeReaderWrapper( NiceReaderWrapper ):
+    def __init__( self, reader, lens={} ):
+        # This class handles any ValueError, IndexError and OverflowError exceptions that may be thrown when
+        # the bitsets are being created by skipping the problem lines.
+        # The incoming lens dictionary is a dictionary of chromosome lengths
+        # which are used to initialize the bitsets.
+        # It is assumed that the reader is an interval reader, i.e. it has chr_col, start_col, end_col and strand_col attributes. 
+        NiceReaderWrapper.__init__( self, reader.input, chrom_col=reader.chrom_col, start_col=reader.start_col, end_col=reader.end_col, strand_col=reader.strand_col)
+        self.lens = lens
+    def next( self ):
+        while True:
+            rval = NiceReaderWrapper.next( self )
+            if type( rval ) == GenomicInterval and rval.end > self.lens.get( rval.chrom, MAX ): # MAX_INT is defined in bx.bitset
+                try:
+                    # This will only work if reader is a NiceReaderWrapper
+                    self.skipped += 1
+                    # no reason to stuff an entire bad file into memmory
+                    if self.skipped < 10:
+                        self.skipped_lines.append( ( self.linenum, self.current_line, str( e ) ) )
+                except:
+                    pass
+            else:
+                return rval
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/bitset_builders.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/bitset_builders.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/bitset_builders.py (revision 3)
@@ -0,0 +1,155 @@
+"""
+Support for creating dictionaries of `Bitset`s / `BinnedBitset`s from text
+files containg sets of "covered" intervals in sequences (e.g. `BED`_ files).
+
+.. BED: http://genome.ucsc.edu/FAQ/FAQformat.html#format1
+"""
+
+from warnings import warn
+from bx.bitset import *
+import re
+
+def binned_bitsets_from_file( f, chrom_col=0, start_col=1, end_col=2, strand_col=5, upstream_pad=0, downstream_pad=0, lens={} ):
+    """
+    Read a file into a dictionary of bitsets. The defaults arguments 
+    
+    - 'f' should be a file like object (or any iterable containing strings)
+    - 'chrom_col', 'start_col', and 'end_col' must exist in each line. 
+    - 'strand_col' is optional, any line without it will be assumed to be '+'
+    - if 'lens' is provided bitset sizes will be looked up from it, otherwise
+      chromosomes will be assumed to be the maximum size
+    """
+    last_chrom = None
+    last_bitset = None
+    bitsets = dict() 
+    for line in f:
+        if line.startswith("#") or line.isspace():
+            continue
+        fields = line.split()
+        strand = "+"
+        if len(fields) > strand_col:
+            if fields[strand_col] == "-": strand = "-"
+        chrom = fields[chrom_col]
+        if chrom != last_chrom:
+            if chrom not in bitsets:
+                if chrom in lens:
+                    size = lens[chrom]
+                else:
+                    size = MAX
+                bitsets[chrom] = BinnedBitSet( size ) 
+            last_chrom = chrom
+            last_bitset = bitsets[chrom]
+        start, end = int( fields[start_col] ), int( fields[end_col] )
+        if upstream_pad: start = max( 0, start - upstream_pad )
+        if downstream_pad: end = min( size, end + downstream_pad )
+        if start > end: warn( "Interval start after end!" )
+        last_bitset.set_range( start, end-start )
+    return bitsets
+
+def binned_bitsets_from_bed_file( f, chrom_col=0, start_col=1, end_col=2, strand_col=5, upstream_pad=0, downstream_pad=0, lens={} ):
+    """
+    Read a file into a dictionary of bitsets. The defaults arguments 
+    
+    - 'f' should be a file like object (or any iterable containing strings)
+    - 'chrom_col', 'start_col', and 'end_col' must exist in each line. 
+    - 'strand_col' is optional, any line without it will be assumed to be '+'
+    - if 'lens' is provided bitset sizes will be looked up from it, otherwise
+      chromosomes will be assumed to be the maximum size
+    """
+    last_chrom = None
+    last_bitset = None
+    bitsets = dict() 
+    offset = 0
+    for line in f:
+        if line.startswith("#") or line.isspace():
+            continue
+        # Ignore browser lines completely
+        if line.startswith( "browser" ):
+            continue
+        # Need to check track lines due to the offset 
+        if line.startswith( "track" ):
+            m = re.search( "offset=(\d+)", line )
+            if m and m.group( 1 ):
+                offset = int( m.group(1) )
+            continue
+        fields = line.split()
+        strand = "+"
+        if len(fields) > strand_col:
+            if fields[strand_col] == "-": strand = "-"
+        chrom = fields[chrom_col]
+        if chrom != last_chrom:
+            if chrom not in bitsets:
+                if chrom in lens:
+                    size = lens[chrom]
+                else:
+                    size = MAX
+                bitsets[chrom] = BinnedBitSet( size ) 
+            last_chrom = chrom
+            last_bitset = bitsets[chrom]
+        start, end = int( fields[start_col] ) + offset, int( fields[end_col] ) + offset
+        ## # Switch to '+' strand coordinates if not already
+        ## if strand == '-':
+        ##     start = size - end
+        ##     end = size - start
+        if upstream_pad: start = max( 0, start - upstream_pad )
+        if downstream_pad: end = min( size, end + downstream_pad )
+        if start > end: warn( "Interval start after end!" )
+        last_bitset.set_range( start, end-start )
+    return bitsets
+
+def binned_bitsets_proximity( f, chrom_col=0, start_col=1, end_col=2, strand_col=5, upstream=0, downstream=0 ):
+    """Read a file into a dictionary of bitsets"""
+    last_chrom = None
+    last_bitset = None
+    bitsets = dict()
+    for line in f:
+        if line.startswith("#"): continue
+#        print "input=%s" % ( line ),
+        fields = line.split()
+        strand = "+"
+        if len(fields) >= strand_col + 1:
+            if fields[strand_col] == "-": strand = "-"
+        chrom = fields[chrom_col]
+        if chrom != last_chrom:
+            if chrom not in bitsets:
+                bitsets[chrom] = BinnedBitSet( MAX )
+            last_chrom = chrom
+            last_bitset = bitsets[chrom]
+        start, end = int( fields[start_col] ), int( fields[end_col] )
+        if strand == "+":
+            if upstream: start = max( 0, start - upstream )
+            if downstream: end = min( MAX, end + downstream )
+        if strand == "-":
+            if upstream: end = min( MAX, end + upstream )
+            if downstream: start = max( 0, start - downstream )
+#        print "set: start=%d\tend=%d" % ( start, end )
+        if end-start > 0:
+            last_bitset.set_range( start, end-start )
+    return bitsets
+
+def binned_bitsets_from_list( list=[] ):
+    """Read a list into a dictionary of bitsets"""
+    last_chrom = None
+    last_bitset = None
+    bitsets = dict()
+    for l in list:
+        chrom = l[0]
+        if chrom != last_chrom:
+            if chrom not in bitsets:
+                bitsets[chrom] = BinnedBitSet(MAX)
+            last_chrom = chrom
+            last_bitset = bitsets[chrom]
+        start, end = int( l[1] ), int( l[2] )
+        last_bitset.set_range( start, end - start )
+    return bitsets
+
+def binned_bitsets_by_chrom( f, chrom, chrom_col=0, start_col=1, end_col=2):
+    """Read a file by chrom name into a bitset"""
+    bitset = BinnedBitSet( MAX )
+    for line in f:
+        if line.startswith("#"): continue
+        fields = line.split()
+        if fields[chrom_col] == chrom:
+            start, end = int( fields[start_col] ), int( fields[end_col] )
+            bitset.set_range( start, end-start )
+    return bitset
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/filter.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/filter.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/filter.py (revision 3)
@@ -0,0 +1,54 @@
+"""
+Classes for implementing `Pipeline`s composed of `Filter`s (intended to be
+subclassed).
+"""
+
+class Filter( object ):
+    def __init__( self, **kwargs ):
+        raise Exception("AbstractClass")
+    
+    def run( self, reader, writer ):
+        for block in reader:
+            block = self( block )
+            if block: writer( block )
+
+    def step( self, reader, writer ):
+        block = reader.next()
+        if not block: raise StopIteration
+        block = self( block )
+        if block: writer( block )
+        
+    def __call__( self, block ):
+        raise Exception("AbstractMethod")
+
+class Pipeline( Filter ):
+    def __init__( self, **kwargs ):
+        self.pipeline = list()
+
+    def __call__( self, block ):
+        for function in pipeline:
+            if not block: return block
+            try: f = function.__call__
+            except: raise TypeError, "'" + function.__class__.__name__ + "' is not callable."
+            block = f( block )
+        return block
+
+    def append( self, function ):
+        try: f = function.__call__
+        except: raise TypeError, "'" + function.__class__.__name__ + "' is not callable."
+        return self.pipeline.append( function )
+    def remove( self, function ):
+        return self.pipeline.remove( function )
+    def extend( self, pipeline ):
+        for item in pipeline:
+            self.append( item )
+    # Container interface
+    def __len__( self ): return len( self.pipeline )
+    def __getitem__( self, key ): return self.pipeline[key]
+    def __setitem__( self, key, value ):
+        try: f = value.__call__
+        except: raise TypeError, "'" + value.__class__.__name__ + "' is not callable."
+        return self.pipeline.__setitem__( key, value )
+    def __delitem__( self, key ): return self.pipeline.__delitem__( key )
+    def __iter__( self ): return self.pipeline.__iter__()
+    def __contains__( self, item ): return self.pipeline.__contains__( item )
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/seqmapping_tests.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/seqmapping_tests.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/seqmapping_tests.py (revision 3)
@@ -0,0 +1,84 @@
+"""
+Tests for `bx.seqmapping`.
+"""
+
+import unittest
+import bx.seqmapping
+
+from numpy import array, allclose
+from StringIO import StringIO
+
+class CharMappingTests( unittest.TestCase ):
+    def test_DNA( self ):
+        assert( allclose( bx.seqmapping.DNA.translate( "ACGTacgt-?X" ),
+                          [ 0, 1, 2, 3, 0, 1, 2, 3, 4, -1, -1 ] ) )
+    def test_DNA_list( self ):
+        assert( allclose( bx.seqmapping.DNA.translate_list( [ "ACGTA", "TGCAX" ] ),
+                          [ 0 + 3*6, 1 + 2*6, 2 + 1*6, 3 + 0*6, -1 ] ) )
+    def test_other( self ):
+        m = bx.seqmapping.CharToIntArrayMapping()
+        m.set_mapping( "A", 0 )
+        m.set_mapping( "B", 7 )
+        assert( allclose( m.translate( "ABCCBA" ), [ 0, 7, -1, -1, 7, 0 ] ) )
+        
+class IntMappingTests( unittest.TestCase ):
+    def test_simple( self ):
+        m = bx.seqmapping.IntToIntMapping( 4 )
+        m.set_mapping( 0, 0 )
+        m.set_mapping( 2, 0 )
+        m.set_mapping( 1, 1 )
+        m.set_mapping( 3, 1 )
+        assert( allclose( m.translate( array( [ 0, 1, 2, 3, 4 ], 'i' ) ), array( [ 0, 1, 0, 1, -1 ] ) ) )
+   
+eight_species_mapping = """TTTTTTTT 0
+CCCCCCCC 4
+AAAAAAAA 1
+GGGGGGGG 5
+AAAAA*AA 2
+TTTTT*TT 0
+GGGGG*GG 5
+CCCCC*CC 4
+GGGG*GGG 5
+TTTT*TTT 2
+GGGAAGGG 5
+AAAA*AAA 2
+TTTTT*T* 2
+CCCCC*C* 4
+CCCTTCCC 4
+CCCC*CCC 4
+TTTT**TT 2
+AAAA**AA 2
+AAAAA*A* 2
+GGGGG*G* 5
+AAAAAGAA 2
+TTTTTCTT 2
+GGGAA*GG 5
+TTTT**T* 2
+TTTCCTTT 0
+AAAAAAA* 1
+CCCTT*CC 3
+TTTTTTT* 2
+CC*CC*CC 3
+AAAGGAAA 2
+------G- 2
+"""
+       
+rows = [ "AAATTGT-----ATGTCCATCCTTTAAAGGTCATTCCTTTAATGGTCTTTTCTGGACACCACTAGGGGTCAGAAGTAGTTCATCAAAC-----------------TTTCTTCCCTCCC-TACTTCAGTG",
+         "AAATTGT-----ATGTCCATCCTTTAAAGGTCATTCCTTTAATGGTCTTTTCTGGACACCACTAGGGGTCAGAAGTAGTTCATCAAAC-----------------TTTCTTCCCTCCC-TACTTCAGTG",
+         "AAATTTT-----ATGTCTATCCTTTAAAGGTCATTCCTCTAATAGTCTTTTCTGGACACCACTAGGGGTCAGAAGTAGTTCATTAAAC-----------------TTTCTTCCCTCCC-TACCTCAGTG",
+         "AAACTGT-----ATCACCACCTTTTTAAGGTCATTTCTCTAATGATCCTGTT-GCATACCAGTAGGGGGCAGAAGTGTTCCGCTGATTTCCGCCCTCCTCCCCACCCCCCCACCCCCC-TTATTCAAAG",
+         "*********************************************************************************************************************************",
+         "-TATTAT-----ATGGCCATGTTCAAAAGGTTGTTTCTCTAATGATTCCTTC-TGATACCAGTAGGGGTCAGAAGTGGTCCATTGATT---------------------CTTTTCCTC-TGATTC-AAG",
+         "AAATTGA--AAGATCTCACTCTTTGCCAGGTAGTCCATCTAAGGGTCACATATGGATACCAGCAGGGCCT-GAAGAAGCCCATTGAAT------------------------TTTCCC-ATCTTCAAGG",
+         "AAATTCATGATAGTGTCACTCTTAAATAGATGATTC--------TTCACAT---GATGCCAGCAGGGGGC-AGAGCAGGCTGTGAAAT------------------------TTTCCCTTTCTTCAAAG" ]
+        
+class AlignmentMappingTests( unittest.TestCase ):
+    def test_largescale( self ):
+       f = StringIO( eight_species_mapping )
+       n, m = bx.seqmapping.alignment_mapping_from_file( f )
+       t = bx.seqmapping.DNA.translate_list( rows )
+       i = m.translate( t )
+        
+        
+test_classes = [ AlignmentMappingTests, CharMappingTests, IntMappingTests ]
+suite = unittest.TestSuite( [ unittest.makeSuite( c ) for c in test_classes ] )
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/motif/logo/__init__.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/motif/logo/__init__.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/motif/logo/__init__.py (revision 3)
@@ -0,0 +1,71 @@
+import pkg_resources
+from StringIO import StringIO
+from string import Template
+from numpy import *
+
+PAD = 2
+
+# Colors from rgb.txt, 
+DNA_DEFAULT_COLORS = {
+    'A': "0.00 1.00 0.00", # green
+    'C': "0.00 0.00 1.00", # blue
+    'G': "1.00 0.65 0.00", # orange red
+    'T': "1.00 0.00 0.00"  # red
+}
+
+# Template is adapted from Jim Kent's lib/dnaMotif.pss to support aritrary
+# alphabets.
+TEMPLATE = "template.ps"
+
+def freqs_to_heights( matrix ):
+    """
+    Calculate logo height using the method of:
+    
+    Schneider TD, Stephens RM. "Sequence logos: a new way to display consensus 
+    sequences." Nucleic Acids Res. 1990 Oct 25;18(20):6097-100.
+    """
+    # Columns are sequence positions, rows are symbol counts/frequencies
+    f = matrix.values.transpose()
+    n, m = f.shape
+    # Ensure normalized
+    f = f / sum( f, axis=0 )
+    # Shannon entropy (the where replaces 0 with 1 so that '0 log 0 == 0')
+    H = - sum( f * log2( where( f, f, 1 ) ), axis=0 )
+    # Height
+    return transpose( f * ( log2( n ) - H ) )
+    
+def eps_logo( matrix, base_width, height, colors=DNA_DEFAULT_COLORS ):
+    """
+    Return an EPS document containing a sequence logo for matrix where each
+    bases is shown as a column of `base_width` points and the total logo
+    height is `height` points. If `colors` is provided it is a mapping from
+    characters to rgb color strings. 
+    """
+    alphabet = matrix.sorted_alphabet
+    rval = StringIO()
+    # Read header ans substitute in width / height
+    header = Template( pkg_resources.resource_string( __name__, "template.ps" ) )
+    rval.write( header.substitute( bounding_box_width = ceil( base_width * matrix.width ) + PAD,
+                                   bounding_box_height = ceil( height ) + PAD ) )
+    # Determine heights
+    heights = freqs_to_heights( matrix )
+    height_scale = height / log2( len( alphabet ) )
+    # Draw each "row" of the matrix
+    for i, row in enumerate( heights ):
+        x = ( i * base_width )
+        y = 0
+        for j, base_height in enumerate( row ):
+            char = alphabet[j]
+            page_height = height_scale * base_height
+            # print matrix.alphabet[j], base_height, height_scale, page_height
+            if page_height > 1:
+                # Draw letter
+                rval.write(  "%s setrgbcolor\n" % colors.get( char, '0 0 0' ) )
+                rval.write( "%3.2f " % x )
+                rval.write( "%3.2f " % y )
+                rval.write( "%3.2f " % ( x + base_width ) )
+                rval.write( "%3.2f " % ( y + page_height ) )
+                rval.write( "(%s) textInBox\n" % char )
+            y += page_height
+    rval.write( "showpage" )
+    return rval.getvalue()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/motif/logo/template.ps
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/motif/logo/template.ps (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/motif/logo/template.ps (revision 3)
@@ -0,0 +1,62 @@
+%!PS-Adobe-3.1 EPSF-3.0
+%%BoundingBox: 0 0 ${bounding_box_width} ${bounding_box_height}
+
+/logoFont {
+/Helvetica-Bold findfont
+10 scalefont
+setfont
+} def
+
+/textBounds {
+% Figure out bounding box of string in current font.  Usage:
+% call: text letterSize 
+% sets: tbX1 tbY1 tbX2 tbY2 tbW tbH
+% The bounds are relative to the current position
+gsave
+newpath
+0 0 moveto
+true charpath
+flattenpath
+pathbbox
+grestore
+/tbY2 exch def
+/tbX2 exch def
+/tbY1 exch def
+/tbX1 exch def
+/tbW tbX2 tbX1 sub def
+/tbH tbY2 tbY1 sub def
+} def
+
+/textInBox {
+% Draw text so that it fits inside of box.  Usage:
+%   x1 y1 x2 y2 text textInBox
+
+% Copy parameters from variables to stack and save context
+/tibText exch def
+/tibY2 exch def
+/tibX2 exch def
+/tibY1 exch def
+/tibX1 exch def
+gsave
+
+% move to x1/y1 adjusted for text offset
+tibText textBounds
+tibX1 tbX1 sub tibY1 tbY1 sub moveto
+
+% Set scaling
+/tibW tibX2 tibX1 sub def
+/tibH tibY2 tibY1 sub def
+tibW tbW div tibH tbH div scale
+
+% draw and return
+tibText show
+grestore
+} def
+
+/aColor { 0 0.7 0 setrgbcolor } def
+/cColor { 0 0.5 0.7 setrgbcolor } def
+/gColor { 0.8 0.5 0 setrgbcolor } def
+/tColor { 0.9 0 0 setrgbcolor } def
+
+logoFont
+
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/motif/io/transfac.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/motif/io/transfac.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/motif/io/transfac.py (revision 3)
@@ -0,0 +1,221 @@
+"""
+Classes for reading and writing motif data.
+"""
+
+from bx.motif.pwm import FrequencyMatrix
+
+class TransfacMotif( object ):
+    
+    def __init__( self ):
+        self.accession = None
+        self.id = None
+        self.dates = None
+        self.name = None
+        self.description = None
+        self.binding_factors = None
+        self.basis = None
+        self.comment = None
+        self.matrix = None
+        self.attributes = None
+        self.sites = None
+        
+transfac_actions = {
+    "AC": ( "store_single", "accession" ),
+    "ID": ( "store_single", "id" ),
+    "DT": ( "store_single_list", "dates" ),
+    "NA": ( "store_single", "name" ),
+    "DE": ( "store_block", "description" ),
+    "BF": ( "store_single_list", "binding_factors" ),
+    "BA": ( "store_block", "basis" ),
+    "CC": ( "store_block", "comment" ),
+    "P0": ( "store_matrix", "matrix" ),
+    # For CREAD format files
+    "TY": ( "store_single", "type" ),
+    "AT": ( "store_single_key_value", "attributes" ),
+    "BS": ( "store_single_list", "sites" )
+}
+        
+class TransfacReader( object ):
+    """
+    Reads motifs in TRANSFAC format.
+    """
+    
+    parse_actions = transfac_actions
+    
+    def __init__( self, input ):
+        self.input = iter( input )
+        self.input_exhausted = False
+    
+    def as_dict( self, key="id" ):
+        """
+        Return a dictionary containing all remaining motifs, using `key`
+        as the dictionary key.
+        """
+        rval = {}
+        for motif in self:
+            rval[ getattr( motif, key ) ] = motif
+        return rval
+    
+    def __iter__( self ):
+        return self
+    
+    def next( self ):
+        rval = self.next_motif()
+        while rval is None:
+            rval = self.next_motif()
+        return rval
+    
+    def next_motif( self ):
+        if self.input_exhausted:
+            raise StopIteration
+        # Accumulate lines until either the end of record indicator "//" is
+        # encounted or the input is exhausted.   
+        lines = []
+        while 1:
+            try:
+                line = self.input.next()
+            except StopIteration, e:
+                self.input_exhausted = True
+                break
+            if line.startswith( "//" ):
+                break
+            if not line.isspace():
+                lines.append( line )
+        if lines:
+            return self.parse_record( lines )
+    
+    def parse_record( self, lines ):
+        """
+        Parse a TRANSFAC record out of `lines` and return a motif.
+        """
+        # Break lines up
+        temp_lines = []
+        for line in lines:
+            fields = line.rstrip( "\r\n" ).split( None, 1 )
+            if len( fields ) == 1:
+                fields.append( "" )
+            temp_lines.append( fields )
+        lines = temp_lines
+        # Fill in motif from lines
+        motif = TransfacMotif()
+        current_line = 0
+        while 1:
+            # Done parsing if no more lines to consume
+            if current_line >= len( lines ):
+                break
+            # Remove prefix and first separator from line
+            prefix, rest = lines[ current_line ]
+            # No action for this prefix, just ignore the line
+            if prefix not in self.parse_actions:
+                current_line += 1
+                continue
+            # Get action for line
+            action = self.parse_actions[ prefix ]
+            # Store a single line value
+            if action[0] == "store_single":
+                key = action[1]
+                setattr( motif, key, rest )
+                current_line += 1
+            # Add a single line value to a list
+            if action[0] == "store_single_list":
+                key = action[1]
+                if not getattr( motif, key ):
+                    setattr( motif, key, [] )
+                getattr( motif, key ).append( rest )
+                current_line += 1
+            # Add a single line value to a dictionary
+            if action[0] == "store_single_key_value":
+                key = action[1]
+                k, v = rest.strip().split( '=', 1 )
+                if not getattr( motif, key ):
+                    setattr( motif, key, {} )
+                getattr( motif, key )[k] = v
+                current_line += 1
+            # Store a block of text
+            if action[0] == "store_block":
+                key = action[1]
+                value = []
+                while current_line < len( lines ) and lines[ current_line ][0] == prefix:
+                    value.append( lines[current_line][1] )
+                    current_line += 1
+                setattr( motif, key, str.join( "\n", value ) )
+            # Store a matrix
+            if action[0] == "store_matrix":
+                # First line is alphabet
+                alphabet = rest.split()
+                alphabet_size = len( alphabet )
+                rows = []
+                pattern = ""
+                current_line += 1
+                # Next lines are the rows of the matrix (we allow 0 rows)
+                while current_line < len( lines ):
+                    prefix, rest = lines[ current_line ]
+                    # Prefix should be a two digit 0 padded row number
+                    if not prefix.isdigit():
+                        break
+                    # The first `alphabet_size` fields are the row values
+                    values = rest.split()
+                    rows.append( map( float, values[:alphabet_size] ) )
+                    # TRANSFAC includes an extra column with the IUPAC code
+                    if len( values ) > alphabet_size:
+                        pattern += values[alphabet_size]
+                    current_line += 1
+                # Only store the pattern if it is the correct length (meaning
+                # that every row had an extra field)
+                if len( pattern ) != len( rows ):
+                    pattern = None
+                matrix = FrequencyMatrix.from_rows( alphabet, rows )
+                setattr( motif, action[1], matrix )
+        # Only return a motif if we saw at least ID or AC or NA
+        if motif.id or motif.accession or motif.name:
+            return motif
+            
+class TransfacWriter( object ):
+    """
+    Writes motifs in TRANSFAC format.
+    """
+
+    actions = transfac_actions
+
+    def __init__( self, output ):
+        self.output = output
+        
+    def write( self, motif ):
+        output = self.output
+        for prefix, actions in self.actions.iteritems():
+            action = actions[0]
+            if action == "store_single":
+                key = actions[1]
+                if getattr( motif, key ) is not None:
+                    print >> output, prefix, "  ", getattr( motif, key )
+                    print >> output, "XX"
+            elif action == "store_single_list":
+                key = actions[1]
+                if getattr( motif, key ) is not None:
+                    value = getattr( motif, key )
+                    for v in value:
+                        print >> output, prefix, "  ", v
+                    print >> output, "XX"
+            elif action == "store_single_key_value":
+                key = actions[1]
+                if getattr( motif, key ) is not None:
+                    value = getattr( motif, key )
+                    for k, v in value.iteritems():
+                        print >> output, prefix, "  ", "%s=%s" % ( k, v )
+                    print >> output, "XX"
+            elif action == "store_block":
+                key = actions[1]
+                if getattr( motif, key ) is not None:
+                    value = getattr( motif, key )
+                    for line in value.split( "\n" ):
+                        print >> output, prefix, "  ", line
+                    print >> output, "XX"
+            elif action == "store_matrix":
+                key = actions[1]
+                if getattr( motif, key ) is not None:
+                    matrix = getattr( motif, key )
+                    print >> output, prefix, "  ", " ".join( [ s.rjust(6) for s in matrix.alphabet ] )
+                    for i in range( matrix.width ):
+                        print >> output, "%02d" % ( i + 1 ), "  ", " ".join( [ str(matrix.values[i,matrix.char_to_index[ord(s)]]).rjust(6) for s in matrix.alphabet ] )
+                    print >> output, "XX"
+        print "//"
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/motif/io/transfac_tests.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/motif/io/transfac_tests.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/motif/io/transfac_tests.py (revision 3)
@@ -0,0 +1,94 @@
+from StringIO import StringIO
+import transfac
+from numpy import allclose
+
+sample = """
+VV  TRANSFAC MATRIX TABLE, Rel.3.2 26-06-1997
+XX
+//
+AC  a
+XX
+ID  V$MYOD_01
+XX
+DT  19.10.92 (created); ewi.
+DT  16.10.95 (updated); ewi.
+XX
+NA  MyoD
+XX
+DE  myoblast determination gene product
+XX
+BF  T00526; MyoD; Species: mouse, Mus musculus.
+XX
+P0      A      C      G      T
+01     100     200     200     0     S
+02     200     100     200     0     R
+03     300     0     100     100     A
+04     0     500     0     0     C
+05     500     0     0     0     A
+06     0     0     400     100     G
+07     0     100     400     0     G
+08     0     0     0     500     T
+09     0     0     500     0     G
+10     0     100     200     200     K
+11     0     200     0     300     Y
+12     100     0     300     100     G
+XX
+BA  5 functional elements in 3 genes
+XX
+//
+AC  M00002
+XX
+ID  V$E47_01
+XX
+DT  19.10.92 (created); ewi.
+DT  16.10.95 (updated); ewi.
+XX
+NA  E47
+XX
+DE  E47
+XX
+BF  T00207; E47; Species: human, Homo sapiens.
+XX
+P0      A      C      G      T
+00     400     400     300     0     N
+02     200     500     400     0     S
+03     300     200     400     200     N
+04     200     0     900     0     G
+05     0     1100     0     0     C
+06     1100     0     0     0     A
+07     0     0     1100     0     G
+08     100     200     800     0     G
+09     0     0     0     1100     T
+10     0     0     1100     0     G
+11     0     0     400     700     K
+12     100     400     300     300     N
+13     100     600     200     200     C
+14     100     400     400     200     N
+15     100     400     200     300     N
+XX
+BA  11 selected strong binding sites for E47, E47-MyoD, E12+MyoD 
+BA  and (weak) for E12
+XX
+CC  Group I in [903]; 5 sites selected in vitro for binding to E12N 
+CC  (=N-terminally truncated E12); matrix corrected according to 
+CC  the published sequences
+XX
+RN  [1]
+RA  Sun X.-H., Baltimore D.
+RT  An inhibitory domain of E12 transcription factor prevents 
+RT  DNA binding in E12 homodimers but not in E12 heterodimers
+RL  Cell 64:459-470 (1991).
+XX
+"""
+
+def test_reader():
+    input = StringIO( sample )
+    motifs = list( transfac.TransfacReader( input ) )
+    assert len( motifs ) == 2
+    # Single value parse
+    assert motifs[1].accession == "M00002"
+    # Value list parse
+    assert motifs[1].dates == [ '19.10.92 (created); ewi.', '16.10.95 (updated); ewi.' ]
+    # Matrix parse
+    assert motifs[1].matrix.sorted_alphabet == ['A','C','G','T']
+    assert allclose( motifs[1].matrix.values[0], [400,400,300,0] )
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/motif/_pwm.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/motif/_pwm.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/motif/_pwm.py (revision 3)
@@ -0,0 +1,7 @@
+def __bootstrap__():
+   global __bootstrap__, __loader__, __file__
+   import sys, pkg_resources, imp
+   __file__ = pkg_resources.resource_filename(__name__,'_pwm.so')
+   __loader__ = None; del __bootstrap__, __loader__
+   imp.load_dynamic(__name__,__file__)
+__bootstrap__()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/motif/pwm.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/motif/pwm.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/motif/pwm.py (revision 3)
@@ -0,0 +1,149 @@
+"""
+Classes for working with position specific matrices.
+"""
+
+from numpy import *
+from copy import copy
+
+import _pwm
+
+class BaseMatrix( object ):
+    """
+    Base class for position specific matrices. 
+    """
+    def __init__( self, alphabet=None, sorted_alphabet=None, 
+                  char_to_index=None, values=None ):
+        self.alphabet = alphabet
+        self.sorted_alphabet = sorted_alphabet
+        self.char_to_index = char_to_index
+        self.values = values
+
+    @classmethod
+    def from_rows( Class, alphabet, rows ):
+        """
+        Create a new matrix for a sequence over alphabet `alphabet` taking 
+        values from `rows` which is a list whose length is the width of the
+        matrix, and whose elements are lists of values associated with each
+        character (in the order those characters appear in alphabet). 
+        """
+        # Sorted alphabet
+        sorted_alphabet = sorted( alphabet )
+        # Character to index mapping (initialized to -1)
+        char_to_index = zeros( (256), int16 ) - 1
+        for i, ch  in enumerate( sorted_alphabet ):
+            char_to_index[ ord(ch) ] = i
+        # Array
+        values = zeros( ( len( rows) , len( alphabet ) ), float32 )
+        for i, row in enumerate( rows ):
+            assert len( row ) == len( alphabet )
+            for ch, val in zip( alphabet, row ):
+                values[i, char_to_index[ord(ch)]] = val
+        # Matrix
+        matrix = Class()
+        matrix.alphabet = alphabet
+        matrix.sorted_alphabet = sorted_alphabet
+        matrix.char_to_index = char_to_index
+        matrix.values = values
+        return matrix
+      
+    @classmethod
+    def create_from_other( Class, other, values=None ):
+        """
+        Create a new Matrix with attributes taken from `other` but with the 
+        values taken from `values` if provided
+        """
+        m = Class()
+        m.alphabet = other.alphabet
+        m.sorted_alphabet = other.sorted_alphabet
+        m.char_to_index = other.char_to_index
+        if values is not None:
+            m.values = values
+        else:
+            m.values = other.values
+        return m
+            
+    @property
+    def width( self ):
+        """
+        Return the width (size along the sequence axis) of this matrix.
+        """
+        return self.values.shape[0]
+
+    def reverse_complement( self ):
+        """
+        Create the reverse complement of this matrix. The result probably
+        only makese sense if the alphabet is that of DNA ('A','C','G','T').
+        """
+        rval = copy( self )
+        # Conveniently enough, reversing rows and columns is exactly what we
+        # want, since this results in A swapping with T and C swapping with G.
+        rval.values = self.values[::-1,::-1].copy()
+        return rval
+
+class FrequencyMatrix( BaseMatrix ):
+    """
+    A position specific count/frequency matrix.
+    """
+        
+    DEFAULT_CORRECTION = 0.0000000001
+    """
+    Default value to use for correcting when dealing with counts of zero,
+    chosen to produce scoring matrices that are the same as produced by CREAD.
+    """
+        
+    def to_logodds_scoring_matrix( self, background=None, correction=DEFAULT_CORRECTION ):
+        """
+        Create a standard logodds scoring matrix.
+        """
+        alphabet_size = len( self.alphabet )
+        if background is None:
+            background = ones( alphabet_size, float32 ) / alphabet_size
+        # Row totals as a one column array
+        totals = sum( self.values, 1 )[:,newaxis]
+        values = log2( maximum( self.values, correction ) ) \
+               - log2( totals ) \
+               - log2( maximum( background, correction ) )
+        return ScoringMatrix.create_from_other( self, values.astype( float32 ) )
+
+    def to_stormo_scoring_matrix( self, background=None ):
+        """
+        Create a scoring matrix from this count matrix using the method from:
+
+        Hertz, G.Z. and G.D. Stormo (1999). Identifying DNA and protein patterns with statistically 
+        significant alignments of multiple sequences. Bioinformatics 15(7): 563-577.
+        """
+        alphabet_size = len( self.alphabet )
+        if background is None:
+            background = ones( alphabet_size, float32 ) / alphabet_size
+        # Row totals as a one column array
+        totals = sum( self.values, 1 )[:,newaxis]
+        values = log2( self.values + background ) \
+               - log2( totals + 1 ) - log2( background )
+        return ScoringMatrix.create_from_other( self, values.astype( float32 ) )
+        
+class ScoringMatrix( BaseMatrix ):
+    """
+    A position specific matrix containing values that are suitable for
+    scoring a sequence.
+    """
+        
+    def score_string( self, string ):
+        """
+        Score each valid position in `string` using this scoring matrix. 
+        Positions which were not scored are set to nan.
+        """
+        rval = zeros( len( string ), float32 )
+        rval[:] = nan
+        _pwm.score_string( self.values, self.char_to_index, string, rval )
+        return rval
+        
+    def score_string_with_gaps( self, string ):
+        """
+        Score each valid position in `string` using this scoring matrix. 
+        Positions which were not scored are set to nan. Gap characters are
+        ignored (matrices score across them).
+        """
+        rval = zeros( len( string ), float32 )
+        rval[:] = nan
+        _pwm.score_string_with_gaps( self.values, self.char_to_index, string, rval )
+        return rval
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/motif/pwm_tests.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/motif/pwm_tests.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/bx/motif/pwm_tests.py (revision 3)
@@ -0,0 +1,81 @@
+import pwm
+from numpy import allclose, isnan
+
+def test_create():
+    m = pwm.FrequencyMatrix.from_rows( ['A','C','G','T'], get_ctcf_rows() )
+    # Alphabet sort
+    assert m.sorted_alphabet == [ 'A', 'C', 'G', 'T' ]
+    # Character to index mapping
+    assert m.char_to_index[ ord('A') ] == 0
+    assert m.char_to_index[ ord('C') ] == 1
+    assert m.char_to_index[ ord('G') ] == 2
+    assert m.char_to_index[ ord('T') ] == 3
+    assert m.char_to_index[ ord('Q') ] == -1
+    # Values
+    assert allclose( m.values[0],  [ 2620, 2052, 3013, 2314 ] )
+    assert allclose( m.values[19],  [ 3144, 3231, 3056, 567 ] )
+    
+def test_scoring():
+    m = pwm.FrequencyMatrix.from_rows( ['A','C','G','T'], get_ctcf_rows() )
+    # Stormo method
+    sm = m.to_stormo_scoring_matrix()
+    # Forward matches
+    assert allclose( sm.score_string( "AATCACCACCTCCTGGCAGG" )[0], -156.8261261 )
+    assert allclose( sm.score_string( "TGCCTGCCTCTGTAGGCTCC" )[0], -128.8106842 )
+    assert allclose( sm.score_string( "GTTGCCAGTTGGGGGAAGCA" )[0], 4.65049839 )
+    assert allclose( sm.score_string( "GCAGACACCAGGTGGTTCAG" )[0], 1.60168743 )
+    # Reverse matches
+    rc = sm.reverse_complement()
+    assert allclose( rc.score_string( "AATCACCACCTCCTGGCAGG" )[0], 0.014178276062 )
+    assert allclose( rc.score_string( "TGCCTGCCTCTGTAGGCTCC" )[0], 0.723828315735 )
+    assert allclose( rc.score_string( "GTTGCCAGTTGGGGGAAGCA" )[0], -126.99407196 )
+    assert allclose( rc.score_string( "GCAGACACCAGGTGGTTCAG" )[0], -86.9560623169 )
+    # Nothing valid
+    assert isnan( sm.score_string_with_gaps( "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" ) ).all()
+    # Too short
+    assert isnan( sm.score_string( "TTTT" ) ).all()
+
+def test_scoring_with_gaps():
+    m = pwm.FrequencyMatrix.from_rows( ['A','C','G','T'], get_ctcf_rows() )
+    # Stormo method
+    sm = m.to_stormo_scoring_matrix()
+    # Forward matches
+    assert allclose( sm.score_string_with_gaps( "GTTGCCAGT----TGGGGGAAGCATTT---AA" )[0], 4.65049839 )
+    assert allclose( sm.score_string_with_gaps( "GCAGA--CACCAGGTGG--TTCAG---" )[0], 1.60168743 )
+    assert allclose( sm.score_string_with_gaps( "----GTTGCCAGTTGGGGGAAGCA" )[4], 4.65049839 )
+    assert allclose( sm.score_string_with_gaps( "TTT--GTT--GCCA--GTTGGGG-G-A-A-G-C-A-" )[5], 4.65049839 )
+    assert isnan( sm.score_string_with_gaps( "TTT--GTT--GCCA--GTTGGGG-G-A-A-G-C-A-" )[4] )
+    # Nothing valid
+    assert isnan( sm.score_string_with_gaps( "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" ) ).all()
+    assert isnan( sm.score_string_with_gaps( "------------------------------------" ) ).all()
+    # Too short
+    assert isnan( sm.score_string_with_gaps( "TTTT" ) ).all()
+    assert isnan( sm.score_string_with_gaps( "TTTT----" ) ).all()
+
+
+def get_ctcf_rows():
+    """
+    The CTCF primary site motif
+    """
+    return [
+         [   2620 ,  2052  ,  3013  ,  2314   ],
+         [      0 ,  3580  ,  1746  ,  4672   ],
+         [   2008 ,  1790  ,  4497  ,  1703   ],
+         [   3362 ,     0  ,  6637  ,     0   ],
+         [      0 , 10000  ,     0  ,     0   ],
+         [      0 , 10000  ,     0  ,     0   ],
+         [   7467 ,     0  ,  1310  ,  1222   ],
+         [    786 ,  4890  ,  4323  ,     0   ],
+         [   1179 ,  6288  ,   829  ,  1703   ],
+         [  10000 ,     0  ,     0  ,     0   ],
+         [      0 ,     0  , 10000  ,     0   ],
+         [   4847 ,     0  ,  5152  ,     0   ],
+         [      0 ,     0  ,  6200  ,  3799   ],
+         [      0 ,     0  , 10000  ,     0   ],
+         [      0 ,     0  , 10000  ,     0   ],
+         [   1572 ,  7467  ,     0  ,   960   ],
+         [   3842 ,     0  ,  5545  ,   611   ],
+         [      0 ,  5895  ,  4104  ,     0   ],
+         [   1615 ,  4192  ,  1397  ,  2794   ],
+         [   3144 ,  3231  ,  3056  ,   567   ]
+    ]
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/SOURCES.txt
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/SOURCES.txt (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/SOURCES.txt (revision 3)
@@ -0,0 +1,226 @@
+scramble.py
+setup.cfg
+lib/psyco_full.py
+lib/bx/__init__.py
+lib/bx/_seqmapping.c
+lib/bx/binned_array.py
+lib/bx/binned_array_tests.py
+lib/bx/bitset.c
+lib/bx/bitset_builders.py
+lib/bx/bitset_tests.py
+lib/bx/bitset_utils.py
+lib/bx/filter.py
+lib/bx/gene_reader.py
+lib/bx/interval_index_file.py
+lib/bx/interval_index_file_tests.py
+lib/bx/seqmapping.py
+lib/bx/seqmapping_tests.py
+lib/bx/wiggle.py
+lib/bx/wiggle_tests.py
+lib/bx/align/__init__.py
+lib/bx/align/_core.c
+lib/bx/align/axt.py
+lib/bx/align/core.py
+lib/bx/align/lav.py
+lib/bx/align/lav_tests.py
+lib/bx/align/maf.py
+lib/bx/align/maf_tests.py
+lib/bx/align/score.py
+lib/bx/align/score_tests.py
+lib/bx/align/sitemask/__init__.py
+lib/bx/align/sitemask/_cpg.c
+lib/bx/align/sitemask/core.py
+lib/bx/align/sitemask/cpg.py
+lib/bx/align/sitemask/find_cpg.c
+lib/bx/align/sitemask/quality.py
+lib/bx/align/sitemask/sitemask_tests.py
+lib/bx/align/tools/__init__.py
+lib/bx/align/tools/chop.py
+lib/bx/align/tools/fuse.py
+lib/bx/align/tools/thread.py
+lib/bx/align/tools/tile.py
+lib/bx/arrays/__init__.py
+lib/bx/arrays/array_tree.c
+lib/bx/arrays/array_tree_tests.py
+lib/bx/arrays/bed.c
+lib/bx/arrays/wiggle.c
+lib/bx/cookbook/__init__.py
+lib/bx/cookbook/attribute.py
+lib/bx/cookbook/doc_optparse.py
+lib/bx/cookbook/progress_bar.py
+lib/bx/intervals/__init__.py
+lib/bx/intervals/cluster.c
+lib/bx/intervals/cluster_tests.py
+lib/bx/intervals/intersection.c
+lib/bx/intervals/intersection_tests.py
+lib/bx/intervals/io.py
+lib/bx/intervals/random.py
+lib/bx/intervals/operations/__init__.py
+lib/bx/intervals/operations/base_coverage.py
+lib/bx/intervals/operations/complement.py
+lib/bx/intervals/operations/concat.py
+lib/bx/intervals/operations/coverage.py
+lib/bx/intervals/operations/find_clusters.py
+lib/bx/intervals/operations/intersect.py
+lib/bx/intervals/operations/join.py
+lib/bx/intervals/operations/merge.py
+lib/bx/intervals/operations/quicksect.py
+lib/bx/intervals/operations/subtract.py
+lib/bx/intseq/__init__.py
+lib/bx/intseq/ngramcount.c
+lib/bx/misc/__init__.py
+lib/bx/misc/_seekbzip2.c
+lib/bx/misc/binary_file.py
+lib/bx/misc/cdb.py
+lib/bx/misc/cdb_tests.py
+lib/bx/misc/filecache.py
+lib/bx/misc/filecache_tests.py
+lib/bx/misc/readlengths.py
+lib/bx/misc/seekbzip2.py
+lib/bx/misc/seekbzip2_tests.py
+lib/bx/misc/seeklzop.py
+lib/bx/misc/seeklzop_tests.py
+lib/bx/motif/__init__.py
+lib/bx/motif/_pwm.c
+lib/bx/motif/pwm.py
+lib/bx/motif/pwm_tests.py
+lib/bx/motif/io/__init__.py
+lib/bx/motif/io/transfac.py
+lib/bx/motif/io/transfac_tests.py
+lib/bx/motif/logo/__init__.py
+lib/bx/phylo/__init__.py
+lib/bx/phylo/newick.py
+lib/bx/phylo/newick_tests.py
+lib/bx/phylo/phast.py
+lib/bx/phylo/phast_tests.py
+lib/bx/pwm/__init__.py
+lib/bx/pwm/_position_weight_matrix.c
+lib/bx/pwm/bed_score_aligned_pwm.py
+lib/bx/pwm/bed_score_aligned_string.py
+lib/bx/pwm/maf_select_motifs.py
+lib/bx/pwm/position_weight_matrix.py
+lib/bx/pwm/pwm_score_maf.py
+lib/bx/pwm/pwm_score_motifs.py
+lib/bx/pwm/pwm_score_positions.py
+lib/bx/pwm/pwm_tests.py
+lib/bx/seq/__init__.py
+lib/bx/seq/_nib.c
+lib/bx/seq/_twobit.c
+lib/bx/seq/core.py
+lib/bx/seq/fasta.py
+lib/bx/seq/fasta_tests.py
+lib/bx/seq/nib.py
+lib/bx/seq/nib_tests.py
+lib/bx/seq/qdna.py
+lib/bx/seq/qdna_tests.py
+lib/bx/seq/seq.py
+lib/bx/seq/seq_tests.py
+lib/bx/seq/twobit.py
+lib/bx/seq/twobit_tests.py
+lib/bx/tabular/__init__.py
+lib/bx/tabular/io.py
+lib/bx_extras/__init__.py
+lib/bx_extras/fpconst.py
+lib/bx_extras/lrucache.py
+lib/bx_extras/pstat.py
+lib/bx_extras/pyparsing.py
+lib/bx_extras/stats.py
+lib/bx_python.egg-info/PKG-INFO
+lib/bx_python.egg-info/SOURCES.txt
+lib/bx_python.egg-info/dependency_links.txt
+lib/bx_python.egg-info/not-zip-safe
+lib/bx_python.egg-info/top_level.txt
+scripts/aggregate_scores_in_intervals.py
+scripts/align_print_template.py
+scripts/axt_extract_ranges.py
+scripts/axt_to_fasta.py
+scripts/axt_to_lav.py
+scripts/axt_to_maf.py
+scripts/bed_build_windows.py
+scripts/bed_complement.py
+scripts/bed_count_by_interval.py
+scripts/bed_count_overlapping.py
+scripts/bed_coverage.py
+scripts/bed_coverage_by_interval.py
+scripts/bed_diff_basewise_summary.py
+scripts/bed_intersect.py
+scripts/bed_intersect_basewise.py
+scripts/bed_merge_overlapping.py
+scripts/bed_rand_intersect.py
+scripts/bed_subtract_basewise.py
+scripts/div_snp_table_chr.py
+scripts/find_in_sorted_file.py
+scripts/gene_fourfold_sites.py
+scripts/get_scores_in_intervals.py
+scripts/int_seqs_to_char_strings.py
+scripts/interval_count_intersections.py
+scripts/interval_join.py
+scripts/lav_to_axt.py
+scripts/lav_to_maf.py
+scripts/line_select.py
+scripts/lzop_build_offset_table.py
+scripts/mMK_bitset.py
+scripts/maf_build_index.py
+scripts/maf_chop.py
+scripts/maf_chunk.py
+scripts/maf_col_counts.py
+scripts/maf_col_counts_all.py
+scripts/maf_count.py
+scripts/maf_covered_regions.py
+scripts/maf_div_sites.py
+scripts/maf_drop_overlapping.py
+scripts/maf_extract_chrom_ranges.py
+scripts/maf_extract_ranges.py
+scripts/maf_extract_ranges_indexed.py
+scripts/maf_filter.py
+scripts/maf_filter_max_wc.py
+scripts/maf_gap_frequency.py
+scripts/maf_gc_content.py
+scripts/maf_interval_alignibility.py
+scripts/maf_limit_to_species.py
+scripts/maf_mapping_word_frequency.py
+scripts/maf_mask_cpg.py
+scripts/maf_mean_length_ungapped_piece.py
+scripts/maf_percent_columns_matching.py
+scripts/maf_percent_identity.py
+scripts/maf_print_chroms.py
+scripts/maf_print_scores.py
+scripts/maf_randomize.py
+scripts/maf_region_coverage_by_src.py
+scripts/maf_select.py
+scripts/maf_shuffle_columns.py
+scripts/maf_species_in_all_files.py
+scripts/maf_split_by_src.py
+scripts/maf_thread_for_species.py
+scripts/maf_tile.py
+scripts/maf_tile_2.py
+scripts/maf_to_axt.py
+scripts/maf_to_concat_fasta.py
+scripts/maf_to_fasta.py
+scripts/maf_to_int_seqs.py
+scripts/maf_translate_chars.py
+scripts/maf_truncate.py
+scripts/maf_word_frequency.py
+scripts/mask_quality.py
+scripts/nib_chrom_intervals_to_fasta.py
+scripts/nib_intervals_to_fasta.py
+scripts/nib_length.py
+scripts/one_field_per_line.py
+scripts/prefix_lines.py
+scripts/pretty_table.py
+scripts/qv_to_bqv.py
+scripts/random_lines.py
+scripts/table_add_column.py
+scripts/table_filter.py
+scripts/tfloc_summary.py
+scripts/ucsc_gene_table_to_intervals.py
+scripts/wiggle_to_array_tree.py
+scripts/wiggle_to_binned_array.py
+scripts/wiggle_to_chr_binned_array.py
+scripts/wiggle_to_simple.py
+src/binBits.c
+src/cluster.c
+src/pwm_utils.c
+src/bunzip/micro-bunzip.c
+src/kent/bits.c
+src/kent/common.c
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/wiggle_to_chr_binned_array.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/wiggle_to_chr_binned_array.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/wiggle_to_chr_binned_array.py (revision 3)
@@ -0,0 +1,42 @@
+#!/usr/bin/python2.6
+
+"""
+Writes compressed data from a wiggle file by chromosome.
+
+usage: %prog score_file < wiggle_data
+"""
+
+from __future__ import division
+
+import sys
+import psyco_full
+import bx.wiggle
+from bx.binned_array import BinnedArray
+from fpconst import isNaN
+from bx.cookbook import doc_optparse
+from bx import misc
+
+
+def main():
+    
+    # Parse command line
+    options, args = doc_optparse.parse( __doc__ )
+    try:
+        score_fname = args[0]
+    except:
+        doc_optparse.exit()
+
+    scores = {}
+    for i, ( chrom, pos, val ) in enumerate( bx.wiggle.Reader( open(sys.argv[1]) ) ):
+        if not chrom in scores: scores[ chrom ] = BinnedArray()
+        scores[chrom][pos] = val
+
+        # Status
+        if i % 10000 == 0: print i, "scores processed"
+
+    for chr in scores.keys():
+        out = open( chr, "w" )
+        scores[chr].to_file( out )
+        out.close()
+
+if __name__ == "__main__": main()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/wiggle_to_simple.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/wiggle_to_simple.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/wiggle_to_simple.py (revision 3)
@@ -0,0 +1,24 @@
+#!/usr/bin/python2.6
+
+"""
+Read a wiggle track and print out a series of lines containing
+"chrom position score". Ignores track lines, handles bed, variableStep
+and fixedStep wiggle lines.
+"""
+
+import psyco_full
+
+import sys
+import bx.wiggle
+
+if len( sys.argv ) > 1: in_file = open( sys.argv[1] )
+else: in_file = sys.stdin
+
+if len( sys.argv ) > 2: out_file = open( sys.argv[2], "w" )
+else: out_file = sys.stdout
+
+for fields in bx.wiggle.Reader( in_file ):
+    print " ".join( map( str, fields ) )
+
+in_file.close()
+out_file.close()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_chunk.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_chunk.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_chunk.py (revision 3)
@@ -0,0 +1,80 @@
+#!/usr/bin/python2.6
+
+"""
+Read a MAF from stdin and break into several new mafs containing no more than
+`chunk_size` columns. The new mafs will be written to `out_dir` along with a
+file "intervals.txt" specifying the range covered by each new maf file. A
+probability for writing each chunk can optionally be specified, resulting in
+a random fraction of chunks from the input MAF being produced.
+
+usage: %prog [options] chunk_size out_dir < maf
+  --prob: probability of writing versus skipping each chunk.
+"""
+
+usage = "usage: %prog chunk_size out_dir"
+
+import sys
+from optparse import OptionParser
+import bx.align.maf
+import psyco_full
+import random
+
+INF="inf"
+
+def __main__():
+
+    # Parse command line arguments
+
+    parser = OptionParser( "usage: %prog chunk_size out_dir" )
+    parser.add_option( "--prob", action="store", default=None, type="float", 
+                       help="Probability of writing a given chunk" )
+    
+    ( options, args ) = parser.parse_args()
+
+    chunk_size = int( args[0] )
+    out_dir = args[1]
+    prob = options.prob
+
+    maf_reader = bx.align.maf.Reader( sys.stdin )
+
+    maf_writer = None
+
+    count = 0
+    current_chunk = -1
+
+    chunk_min = INF
+    chunk_max = 0
+
+    write_current_chunk = True
+
+    interval_file = file( "%s/intervals.txt" % out_dir, "w" )	
+
+    for m in maf_reader:
+        chunk_min = min( chunk_min, m.components[0].start )
+        chunk_max = max( chunk_max, m.components[0].end )
+        if not maf_writer or count + m.text_size > chunk_size:
+            current_chunk += 1
+            # Finish the last chunk            
+            if maf_writer: 
+                maf_writer.close()
+                interval_file.write( "%s %s\n" % ( chunk_min, chunk_max ) )
+                chunk_min = INF
+                chunk_max = 0
+            # Decide if the new chunk will be written     
+            if prob: write_current_chunk = bool( random.random() <= prob )
+            else: write_current_chunk = True
+            if write_current_chunk:
+                maf_writer = bx.align.maf.Writer( file( "%s/%09d.maf" % ( out_dir, current_chunk ), "w" ) )
+            else:
+                maf_writer = None
+            count = 0
+        if maf_writer: maf_writer.write( m )
+        #count += m.text_size
+        count += m.components[0].size
+    
+    if maf_writer:
+        maf_writer.close()
+        interval_file.write( "%s %s\n" % ( chunk_min, chunk_max ) )
+        interval_file.close()
+
+if __name__ == "__main__": __main__()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/wiggle_to_binned_array.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/wiggle_to_binned_array.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/wiggle_to_binned_array.py (revision 3)
@@ -0,0 +1,54 @@
+#!/usr/bin/python2.6
+
+"""
+Convert wiggle data to a binned array. This assumes the input data is on a
+single chromosome and does no sanity checks!
+
+usage: %prog score_file out_file < wiggle_data
+    -c, --comp=type: compression type (none, zlib, lzo)
+"""
+
+from __future__ import division
+
+import sys
+import psyco_full
+import bx.wiggle
+from bx.binned_array import BinnedArray
+from bx_extras.fpconst import isNaN
+from bx.cookbook import doc_optparse
+from bx import misc
+
+def main():
+    
+    # Parse command line
+    options, args = doc_optparse.parse( __doc__ )
+    try:
+        if options.comp:
+            comp_type = options.comp
+        else:
+            comp_type = None
+        score_fname = args[0]
+        out_fname = args[1]
+    except:
+        doc_optparse.exit()
+
+    scores = BinnedArray()
+
+    ## last_chrom = None
+    for i, ( chrom, pos, val ) in enumerate( bx.wiggle.Reader( misc.open_compressed( score_fname ) ) ):
+        #if last_chrom is None: 
+        #    last_chrom = chrom
+        #else: 
+        #    assert chrom == last_chrom, "This script expects a 'wiggle' input on only one chromosome"
+        scores[pos] = val
+        # Status
+        if i % 10000 == 0: print i, "scores processed"
+
+    out = open( out_fname, "w" )
+    if comp_type:
+        scores.to_file( out, comp_type=comp_type )
+    else:    
+        scores.to_file( out )
+    out.close()
+
+if __name__ == "__main__": main()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_covered_regions.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_covered_regions.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_covered_regions.py (revision 3)
@@ -0,0 +1,56 @@
+#!/usr/bin/python2.6
+
+"""
+Read a maf file and print the regions covered to a set of bed files (one for 
+each sequence source referenced in the maf). Only blocks with a positive 
+percent identity are written out. 
+
+TODO: Can this be generalized to be made more useful?
+
+usage: %prog bed_outfile_prefix < maf
+"""
+
+from __future__ import division
+
+import psyco_full
+import bx.align.maf
+import sys
+
+def block_pid( comp1, comp2 ):
+    match = 0
+    total = 0
+    t1 = comp1.text.lower()
+    t2 = comp2.text.lower()
+    for i in range( 0, len(t1) ):
+        a, b = t1[i], t2[i]
+        if a == '-' or b == '-': 
+            continue
+        elif a == b:
+            match += 1
+        total += 1
+    if total == 0: return None
+    return ( match / total )
+
+def main():
+    out_prefix = sys.argv[1]
+    print out_prefix
+    out_files = dict()
+    for block in bx.align.maf.Reader( sys.stdin ):
+        ref_comp = block.components[0]
+        ref_chrom = ref_comp.src.split('.')[1]
+        for comp in block.components[1:]:
+            comp_species, comp_chrom = comp.src.split('.')[:2]
+            if comp_species not in out_files:
+                f = open( "%s%s.bed" % ( out_prefix, comp_species ), "w" )
+                out_files[comp_species] = f
+            pid = block_pid( ref_comp, comp )
+            if pid:
+                out_files[comp_species].write( "%s\t%d\t%d\t%s:%d-%d,%s\t%f\n" %
+                                 ( ref_chrom, ref_comp.forward_strand_start, ref_comp.forward_strand_end, \
+                                   comp_chrom, comp.start, comp.end, comp.strand, pid ) )
+
+    for f in out_files.values():
+        f.close()
+    
+
+if __name__ == "__main__": main()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/bed_count_by_interval.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/bed_count_by_interval.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/bed_count_by_interval.py (revision 3)
@@ -0,0 +1,29 @@
+#!/usr/bin/python2.6
+"""
+For each interval in `bed1` count the number of intersecting regions in `bed2`.
+
+usage: %prog bed1 bed2 
+"""
+
+import sys
+from bx.intervals import *
+
+bed1,bed2 = sys.argv[1:3]
+
+ranges = {}
+for line in open( bed2 ):
+    fields = line.strip().split() 
+    chrom, start, end, = fields[0], int(fields[1]), int(fields[2])
+    if chrom not in ranges: ranges[chrom] = Intersecter()
+    ranges[chrom].add_interval( Interval( start, end ) )
+    
+for line in open( bed1 ):
+    fields = line.strip().split() 
+    chrom, start, end = fields[0], int(fields[1]), int(fields[2]) 
+    other = " ".join(fields[3:])
+    out = " ".join(fields[:3] +[other])
+    if chrom in ranges: 
+        print out, len( ranges[chrom].find( start, end ) )
+    else:
+        print out, 0
+
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/lav_to_axt.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/lav_to_axt.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/lav_to_axt.py (revision 3)
@@ -0,0 +1,55 @@
+#!/usr/bin/python2.6
+"""
+Application to convert LAV file to AXT file. Reads a LAV file from standard 
+input and writes a AXT file to standard out;  some statistics are written 
+to standard error.
+
+usage: lav_to_axt [--silent] [path=replacement] < lav_file > axt_file
+"""
+
+__author__ = "Bob Harris (rsharris@bx.psu.edu)"
+
+import sys
+import copy
+import bx.align.lav
+import bx.align.axt
+
+def usage(s=None):
+	message = __doc__
+	if (s == None): sys.exit (message)
+	else:           sys.exit ("%s\n%s" % (s,message))
+
+
+def main():
+
+	# parse the command line
+
+	silent = False
+	pathSubs = []
+
+	for arg in sys.argv[1:]:
+		if ("=" in arg):
+			ix = arg.find("=")
+			pathSubs.append((arg[:ix],arg[ix+1:]))
+		elif (arg == "--silent"):
+			silent = True
+		else:
+			usage("unrecognized argument: " + arg)
+
+	# read the alignments and other info
+
+	out = bx.align.axt.Writer(sys.stdout)
+
+	lavsRead = axtsWritten = 0
+	for lavBlock in bx.align.lav.Reader(sys.stdin,path_subs=pathSubs):
+		lavsRead += 1
+
+		out.write (lavBlock)
+		axtsWritten += 1
+
+	if (not silent):
+		sys.stderr.write ("%d blocks read, %d written\n" % (lavsRead,axtsWritten))
+
+
+if __name__ == "__main__": main()
+
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/qv_to_bqv.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/qv_to_bqv.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/qv_to_bqv.py (revision 3)
@@ -0,0 +1,69 @@
+#!/usr/bin/python2.6
+
+"""
+Convert a qual (qv) file to several BinnedArray files for fast seek.
+This script takes approximately 4 seconds per 1 million base pairs.
+
+The input format is fasta style quality -- fasta headers followed by 
+whitespace separated integers.
+
+usage: %prog qual_file output_file
+"""
+
+import string
+import psyco_full
+import sys
+from binned_array import *
+from bx.cookbook import *
+import fileinput
+
+def main():
+    args = sys.argv[1:]
+    try:
+        qual_file = args[ 0 ]
+        output_file = args[ 1 ]
+    except:
+        print "usage: qual_file output_file"
+        sys.exit()
+
+    qual = fileinput.FileInput( qual_file )
+    outfile = None
+    outbin = None
+    base_count = 0
+    mega_count = 0
+
+    for line in qual:
+        line = line.rstrip("\r\n")
+        if line.startswith(">"):
+            # close old
+            if outbin and outfile:
+                print "\nFinished region " + region + " at " + str(base_count) + " base pairs."
+                outbin.finish()
+                outfile.close()
+            # start new file
+            region = line.lstrip(">")
+            outfname = output_file + "." + region + ".bqv"
+            print "Writing region " + region + " to file " + outfname
+            outfile = open( outfname , "wb")
+            outbin = BinnedArrayWriter(outfile, typecode='b', default=0)
+            base_count = 0
+            mega_count = 0
+        else:
+            if outfile and outbin:
+                nums = line.split()
+                for val in nums:
+                    outval = int(val)
+                    assert outval <= 255 and outval >= 0
+                    outbin.write(outval)
+                    base_count += 1
+                if (mega_count * 1000000) <= base_count:
+                    sys.stdout.write(str(mega_count)+" ")
+                    sys.stdout.flush()
+                    mega_count = base_count // 1000000 + 1
+    if outbin and outfile:
+        print "\nFinished region " + region + " at " + str(base_count) + " base pairs."
+        outbin.finish()
+        outfile.close()
+
+if __name__ == "__main__":
+    main()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/interval_join.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/interval_join.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/interval_join.py (revision 3)
@@ -0,0 +1,39 @@
+#!/usr/bin/python2.6
+
+"""
+Match up intersecting intervals from two files. This performs a "full join", 
+any pair of intervals with any basewise overlap will be printed side-by-side.
+
+usage: %prog bed1 bed2
+"""
+
+from __future__ import division
+
+import psyco_full
+
+import string
+import sys
+
+import bx.intervals.io
+import bx.intervals.intersection
+
+def main():
+
+    intersecters = {}
+
+    # Read second set into intersecter
+    for interval in bx.intervals.io.GenomicIntervalReader( open( sys.argv[2] ) ):
+        if not intersecters.has_key( interval.chrom ): 
+            intersecters[ interval.chrom ] = bx.intervals.Intersecter()
+        intersecters[ interval.chrom ].add_interval( interval )
+
+    # Join with first set    
+    for interval in bx.intervals.io.GenomicIntervalReader( open( sys.argv[1] ) ):
+        if intersecters.has_key( interval.chrom ):
+            intersection = intersecters[ interval.chrom ].find( interval.start, interval.end )
+            for interval2 in intersection:
+                print "\t".join( [ str( interval ), str( interval2 ) ] )
+
+
+if __name__ == "__main__":
+    main()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_filter_max_wc.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_filter_max_wc.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_filter_max_wc.py (revision 3)
@@ -0,0 +1,40 @@
+#!/usr/bin/python2.6
+
+"""
+Filter maf blocks for presence of wildcard columns. Blocks must meet the 
+criteria of having at least `min_good` columns, each of which has more than
+`min_species` rows that are NOT wildcard bases ('*').
+
+TODO: Allow specifying the character of the wildcard base.
+
+usage: %prog min_good min_species < maf > maf
+"""
+
+from __future__ import division
+
+import psyco_full
+
+import sys
+
+import sys
+from bx.align import maf
+from optparse import OptionParser
+
+def main():
+
+    min_good = int( sys.argv[1] )
+    min_species = int( sys.argv[2] )
+
+    maf_reader = maf.Reader( sys.stdin )
+    maf_writer = maf.Writer( sys.stdout )
+
+    for m in maf_reader:
+        good = 0
+        for col in m.column_iter():
+            if col.count( '*' ) <= min_species:
+                good += 1   
+        if good >= min_good: 
+            maf_writer.write( m )
+
+if __name__ == "__main__": 
+    main()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_interval_alignibility.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_interval_alignibility.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_interval_alignibility.py (revision 3)
@@ -0,0 +1,111 @@
+#!/usr/bin/python2.6
+
+"""
+WARNING: bz2/bz2t support and file cache support are new and not as well
+         tested. 
+
+usage: %prog maf_files [options] < interval_file
+    -s, --species=SPECIES: Comma separated list of species to include
+    -p, --prefix=PREFIX: Prefix to add to each interval chrom (usually reference species)
+   -C, --usecache:   Use a cache that keeps blocks of the MAF files in memory (requires ~20MB per MAF)
+"""
+
+from __future__ import division
+
+import psyco_full
+
+from bx.cookbook import doc_optparse
+
+import bx.align.maf
+from bx import misc
+import os
+import sys
+
+from numpy import *
+
+def main():
+    # Parse Command Line
+    options, args = doc_optparse.parse( __doc__ )
+    try:
+        maf_files = args
+        species = options.species.split( "," )
+        prefix = options.prefix
+        use_cache = bool( options.usecache )
+        if not prefix:
+            prefix = ""
+    except:
+        doc_optparse.exit()
+    # Open indexed access to mafs
+    index = bx.align.maf.MultiIndexed( maf_files, 
+                                      parse_e_rows=True,
+                                      use_cache=use_cache )
+    # Print header
+    print "#chr", "start", "end",
+    for s in species:
+        print s,
+    print
+    # Iterate over input ranges 
+    for line in sys.stdin:
+        fields = line.split()
+        # Input is BED3+
+        chr, start, end = fields[0], int( fields[1] ), int( fields[2] )
+        length = end - start
+        assert length > 0, "Interval has length less than one"
+        # Prepend prefix if specified
+        src = prefix + chr    
+        # Keep a bitset for each species noting covered pieces
+        aligned_bits = []
+        missing_bits = []
+        for s in species:
+            aligned_bits.append( zeros( length, dtype=bool ) )
+            missing_bits.append( zeros( length, dtype=bool ) )
+        # Find overlap with reference component
+        blocks = index.get( src, start, end )
+        # Determine alignability for each position
+        for block in blocks:
+            # Determine the piece of the human interval this block covers, 
+            # relative to the start of the interval of interest
+            ref = block.get_component_by_src( src )
+            assert ref.strand == "+", \
+                "Reference species blocks must be on '+' strand"
+            rel_start = max( start, ref.start ) - start
+            rel_end = min( end, ref.end ) - start
+            # Check alignability for each species
+            for i, s in enumerate( species ):
+                other = block.get_component_by_src_start( s )
+                # Species does not appear at all indicates unaligned (best we
+                # can do here?)
+                if other is None:
+                    continue
+                # An empty component might indicate missing data, all other
+                # cases (even contiguous) we count as not aligned
+                if other.empty:
+                    if other.synteny_empty == bx.align.maf.MAF_MISSING_STATUS:
+                        missing_bits[i][rel_start:rel_end] = True
+                # Otherwise we have a local alignment with some text, call
+                # it aligned
+                else:
+                    aligned_bits[i][rel_start:rel_end] = True
+        # Now determine the total alignment coverage of each interval
+        print chr, start, end,
+        for i, s in enumerate( species ):
+            aligned = sum( aligned_bits[i] )
+            missing = sum( missing_bits[i] )
+            # An interval will be called missing if it is < 100bp and <50% 
+            # present, or more than 100bp and less that 50bp present (yes,
+            # arbitrary)
+            is_missing = False
+            if length < 100 and missing > ( length / 2 ):
+                print "NA",
+            elif length >= 100 and missing > 50:
+                print "NA",
+            else:
+                print aligned / ( length - missing ),
+                
+        print
+         
+    # Close MAF files
+    index.close()
+
+if __name__ == "__main__": 
+    main()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/nib_chrom_intervals_to_fasta.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/nib_chrom_intervals_to_fasta.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/nib_chrom_intervals_to_fasta.py (revision 3)
@@ -0,0 +1,47 @@
+#!/usr/bin/python2.6
+
+"""
+Read a set of ranges and a nib file, print portions of nib overlapping
+those ranges to stdout
+
+TODO: General sequence handling would be nice, as well as merging with
+      'nib_intervals_to_fasta.py'.
+
+usage: %prog nib_dir < range_file
+"""
+
+from bx.cookbook import doc_optparse
+import bx.seq.nib
+import string
+import sys
+
+def __main__():
+
+    options, args = doc_optparse.parse( __doc__ )
+
+    try:
+        nib_dir = args[0] 
+    except:
+        doc_optparse.exit()
+
+    nibs = {}
+
+    for line in sys.stdin: 
+        fields = line.split()
+        chrom, start, end = fields[0], int( fields[1] ), int( fields[2] ) 
+        print ">", chrom, start, end 
+        if chrom in nibs:
+            nib = nibs[chrom]
+        else:
+            nibs[chrom] = nib = bx.seq.nib.NibFile( file( "%s/%s.nib" % ( nib_dir, chrom ) ) )
+        print_wrapped( nib.get( start, end - start ) )
+
+def print_wrapped( s ):
+    l = len( s )        
+    c = 0
+    while c < l:
+        b = min( c + 50, l )
+        print s[c:b]
+        c = b
+
+if __name__ == "__main__": __main__()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_filter.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_filter.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_filter.py (revision 3)
@@ -0,0 +1,52 @@
+#!/usr/bin/python2.6
+
+"""
+Filter each block in a maf file. Can filter blocks for a minimum number of
+components (rows), a minimum length in columns, or an arbitrary python 
+expression (which will be evaluated for each block with the variable 'm'
+containing that block).
+
+usage: %prog [options] < maf > maf
+    --component_count=N: Minimum number of components (rows)
+    --min_cols=N: Minimum number of columns
+    -e, --expr=EXPR: Python expression that must evaulate to true
+"""
+
+import psyco_full
+
+import sys
+
+import sys
+from bx.align import maf
+from optparse import OptionParser
+
+def __main__():
+
+    # Parse command line arguments
+
+    parser = OptionParser()
+    parser.add_option( "--component_count", action="store", default=None, type="int", help="" )
+    parser.add_option( "--min_cols", action="store", default=None, type="int", help="" )
+    parser.add_option( "-e", "--expr", action="store", default=None )
+
+    ( options, args ) = parser.parse_args()
+
+    component_count = options.component_count
+    min_cols = options.min_cols
+    expr = options.expr
+
+    # Compile expression for SPEED
+    if expr: expr = compile( expr, '<expr arg>', 'eval' )
+
+    maf_reader = maf.Reader( sys.stdin )
+    maf_writer = maf.Writer( sys.stdout )
+
+    for m in maf_reader:
+
+        if component_count and len( m.components ) != component_count: continue
+        if min_cols and m.text_size < min_cols: continue
+        if expr and not bool( eval( expr, { "m": m, "maf": m } ) ): continue
+
+        maf_writer.write( m )
+
+if __name__ == "__main__": __main__()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/bed_count_overlapping.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/bed_count_overlapping.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/bed_count_overlapping.py (revision 3)
@@ -0,0 +1,29 @@
+#!/usr/bin/python2.6
+"""
+For each interval in `bed1` count the number of intersecting regions in `bed2`.
+
+usage: %prog bed1 bed2 
+"""
+
+import sys
+from bx.intervals import *
+
+bed1,bed2 = sys.argv[1:3]
+
+ranges = {}
+for line in open( bed2 ):
+    fields = line.strip().split() 
+    chrom, start, end, = fields[0], int(fields[1]), int(fields[2])
+    if chrom not in ranges: ranges[chrom] = Intersecter()
+    ranges[chrom].add_interval( Interval( start, end ) )
+    
+for line in open( bed1 ):
+    fields = line.strip().split() 
+    chrom, start, end = fields[0], int(fields[1]), int(fields[2]) 
+    other = " ".join(fields[3:])
+    out = " ".join(fields[:3] +[other])
+    if chrom in ranges: 
+        print out, len( ranges[chrom].find( start, end ) )
+    else:
+        print out, 0
+
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/axt_to_fasta.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/axt_to_fasta.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/axt_to_fasta.py (revision 3)
@@ -0,0 +1,53 @@
+#!/usr/bin/python2.6
+
+"""
+Application to convert AXT file to FASTA file. Reads an AXT file from standard 
+input and writes a FASTA file to standard out.
+
+usage: %prog < axt_file > fasta_file
+"""
+
+__author__ = "Bob Harris (rsharris@bx.psu.edu)"
+
+import sys
+import bx.align.axt
+
+def usage(s=None):
+	message = """
+axt_to_fasta < axt_file > fasta_file
+"""
+	if (s == None): sys.exit (message)
+	else:           sys.exit ("%s\n%s" % (s,message))
+
+
+def main():
+
+	# check the command line
+
+	if (len(sys.argv) > 1):
+		usage("give me no arguments")
+
+	# convert the alignment blocks
+
+	reader = bx.align.axt.Reader(sys.stdin,support_ids=True,\
+	                             species1="",species2="")
+
+	for a in reader:
+		if ("id" in a.attributes): id = a.attributes["id"]
+		else:                      id = None
+		print_component_as_fasta(a.components[0],id)
+		print_component_as_fasta(a.components[1],id)
+		print
+
+
+# $$$ this should be moved to a bx.align.fasta module
+
+def print_component_as_fasta(c,id=None):
+	header = ">%s_%s_%s" % (c.src,c.start,c.start+c.size)
+	if (id != None): header += " " + id
+	print header
+	print c.text
+
+
+if __name__ == "__main__": main()
+
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_chop.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_chop.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_chop.py (revision 3)
@@ -0,0 +1,55 @@
+#!/usr/bin/python2.6
+
+"""
+Chops alignments in a MAF file to piece of a specified length. A random set of
+non overlapping chunks of exactly the specified chop length will be produced
+
+usage: %prog [options] < maf > maf
+  -l, --length: Chop to exactly this length in columns (default 100)
+"""
+
+import sys
+
+import sys, random
+import bx.align.maf
+from optparse import OptionParser
+
+def main():
+
+    # Parse command line arguments
+
+    parser = OptionParser()
+    parser.add_option( "-l", "--length", action="store", type="int", default=100, help="" )
+
+    ( options, args ) = parser.parse_args()
+
+    length = options.length
+    maf_reader = bx.align.maf.Reader( sys.stdin )
+    maf_writer = bx.align.maf.Writer( sys.stdout )
+
+    for m in maf_reader:
+        for chopped in chop( m, length ):
+            maf_writer.write( chopped )
+
+def chop( m, length ):
+    maf_length = m.text_size
+    chunk_count = maf_length // length
+    lost_bases = maf_length % length
+    skip_amounts = [0] * ( chunk_count + 1 )
+    for i in range( 0, lost_bases ): skip_amounts[ random.randrange( 0, chunk_count + 1 ) ] += 1
+    start = 0
+    rval = []
+    for i in range( 0, chunk_count ):
+        start += skip_amounts[ i ]
+        n = m.slice( start, start + length )
+        if check_len( n ): rval.append( m.slice( start, start + length ) )
+        start += length
+    return rval
+
+def check_len( a ):
+    for c in a.components:
+        if c.size == 0: return False
+    return True 
+    
+
+if __name__ == "__main__": main()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/bed_rand_intersect.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/bed_rand_intersect.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/bed_rand_intersect.py (revision 3)
@@ -0,0 +1,160 @@
+#!/usr/bin/python2.6
+
+"""
+From a set of regions and two sets of intervals inside those regions
+compute (for each region seperately) the overlap between the two sets
+of intervals and the overlap in `nsamples` random coverings of the 
+regions with intervals having the same lengths. Prints the z-score relative
+to the mean and sample stdev of the random coverings.
+
+Currently intervals must be in bed 3+ format.
+
+TODO: There are a few versions of this floating around, including a 
+      better/faster one using gap lists instead of bitsets. Need to track 
+      that down and merge as neccesary.
+
+usage: %prog bounding_region_file intervals1 intervals2 nsamples
+"""
+
+from __future__ import division 
+
+import sys, random
+import bisect
+from bx_extras import stats
+from Numeric import *
+from bx.bitset import *
+from bx.intervals.random import *
+
+maxtries = 10
+
+class MaxtriesException( Exception ):
+    pass
+
+def bit_clone( bits ):
+    """
+    Clone a bitset
+    """
+    new = BitSet( bits.size )
+    new.ior( bits )
+    return new
+
+def throw_random( lengths, mask ):
+    """
+    Try multiple times to run 'throw_random'
+    """
+    saved = None
+    for i in range( maxtries ):
+        try:
+            return throw_random_bits( lengths, mask )
+        except MaxtriesException, e:
+            saved = e
+            continue
+    raise e
+    
+def as_bits( region_start, region_length, intervals ):
+    """
+    Convert a set of intervals overlapping a region of a chromosome into 
+    a bitset for just that region with the bits covered by the intervals 
+    set.
+    """
+    bits = BitSet( region_length )
+    for chr, start, stop in intervals:
+        bits.set_range( start - region_start, stop - start )
+    return bits
+
+def interval_lengths( bits ):
+    """
+    Get the length distribution of all contiguous runs of set bits from
+    """
+    end = 0
+    while 1:
+        start = bits.next_set( end )
+        if start == bits.size: break
+        end = bits.next_clear( start )
+        yield end - start
+
+def count_overlap( bits1, bits2 ):
+    """
+    Count the number of bits that overlap between two sets
+    """
+    b = BitSet( bits1.size )
+    b |= bits1
+    b &= bits2
+    return b.count_range( 0, b.size )
+    
+def overlapping_in_bed( fname, r_chr, r_start, r_stop ):
+    """
+    Get from a bed all intervals that overlap the region defined by
+    r_chr, r_start, r_stop.
+    """
+    rval = []
+    for line in open( fname ):
+        if line.startswith( "#" ) or line.startswith( "track" ):
+            continue
+        fields = line.split()
+        chr, start, stop = fields[0], int( fields[1] ), int( fields[2] )
+        if chr == r_chr and start < r_stop and stop >= r_start:
+            rval.append( ( chr, max( start, r_start ), min( stop, r_stop ) ) )
+    return rval        
+
+def main():
+    region_fname = sys.argv[1]
+    mask_fname = sys.argv[2]       
+    nsamples = int( sys.argv[3] )
+    intervals1_fname = sys.argv[4]       
+    intervals2_fnames = sys.argv[5:]       
+    nfeatures = len( intervals2_fnames )
+    total_actual = zeros( nfeatures )
+    # total_lengths1 = 0
+    total_lengths2 = zeros( nfeatures )
+    total_samples = zeros( ( nsamples, nfeatures ) )
+    for line in open( region_fname ):
+        # Load lengths for all intervals overlapping region
+        fields = line.split()
+        print >>sys.stderr, "Processing region:", fields[3]
+        r_chr, r_start, r_stop = fields[0], int( fields[1] ), int( fields[2] )
+        r_length = r_stop - r_start
+        # Load the mask
+        mask = overlapping_in_bed( mask_fname, r_chr, r_start, r_stop )
+        bits_mask = as_bits( r_start, r_length, mask )
+        bits_not_masked = bit_clone( bits_mask ); bits_not_masked.invert()
+        # Load the first set
+        intervals1 = overlapping_in_bed( intervals1_fname, r_chr, r_start, r_stop )
+        bits1 = as_bits( r_start, r_length, intervals1 )
+        # Intersect it with the mask 
+        bits1.iand( bits_not_masked )
+        # Sanity checks
+        assert count_overlap( bits1, bits_mask ) == 0
+        # For each data set
+        for featnum, intervals2_fname in enumerate( intervals2_fnames ):
+            print >>sys.stderr, intervals2_fname
+            intervals2 = overlapping_in_bed( intervals2_fname, r_chr, r_start, r_stop )
+            bits2 = as_bits( r_start, r_length, intervals2 )
+            bits2.iand( bits_not_masked )
+            assert count_overlap( bits2, bits_mask ) == 0
+            # Observed values
+            actual_overlap = count_overlap( bits1, bits2 )
+            total_actual[featnum] += actual_overlap
+            # Sample 
+            lengths2 = list( interval_lengths( bits2 ) )
+            total_lengths2[ featnum ] += sum( lengths2 )
+            for i in range( nsamples ):
+                # Build randomly covered bitmask for second set
+                random2 = throw_random( lengths2, bits_mask )
+                # Find intersection
+                random2 &= bits1
+                # Print amount intersecting
+                total_samples[ i, featnum ] += random2.count_range( 0, random2.size )
+                print >>sys.stderr, total_samples[ i, featnum ]
+    fraction_overlap = total_samples / total_lengths2
+    print "\t".join( intervals2_fnames )
+    print "\t".join( map( str, total_actual/total_lengths2 ) )
+    for row in fraction_overlap:
+        print "\t".join( map( str, row ) )
+    #print "total covered by first: %d, second: %d, overlap: %d" % ( total_lengths1, total_lengths2, total_actual )
+    print "observed overlap: %d, sample mean: %d, sample stdev: %d" % ( total_actual, stats.amean( total_samples ), stats.asamplestdev( total_samples ) )
+    print "z-score:", ( total_actual - stats.amean( total_samples ) ) / stats.asamplestdev( total_samples )
+    print "percentile:", sum( total_actual > total_samples ) / nsamples
+    
+if __name__ == "__main__": 
+    main()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_shuffle_columns.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_shuffle_columns.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_shuffle_columns.py (revision 3)
@@ -0,0 +1,29 @@
+#!/usr/bin/python2.6
+
+"""
+Randomly shuffle the columns of each block of a maf file. Note that this does
+not change any other features of the maf block, thus the text of each row no
+longer will match the sequence refered to by the other row attributes!
+
+usage: %prog < maf > maf
+"""
+
+import psyco_full
+
+import sys
+
+import sys
+from bx import align
+
+def __main__():
+
+    maf_reader = align.maf.Reader( sys.stdin )
+    maf_writer = align.maf.Writer( sys.stdout )
+
+    for m in maf_reader:
+    
+        align.shuffle_columns( m )
+
+        maf_writer.write( m )
+
+if __name__ == "__main__": __main__()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_word_frequency.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_word_frequency.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_word_frequency.py (revision 3)
@@ -0,0 +1,47 @@
+#!/usr/bin/python2.6
+
+"""
+Read a MAF and print counts and frequencies of all n-mers
+(words composed on n consecutive alignment columns)
+
+TODO: reconcile this and maf_mapping_word_frequency.py
+
+usage: %prog n < maf_file
+"""
+
+from __future__ import division
+
+import psyco; psyco.profile()
+
+from bx.cookbook import doc_optparse
+import string
+import sys
+
+from align import maf
+
+
+def __main__():
+
+    motif_len = int( sys.argv[1] )
+
+    big_map = {}
+    total = 0
+    
+    maf_reader = maf.Reader( sys.stdin )
+
+    for m in maf_reader:
+        texts = [ c.text.upper() for c in m.components ]
+        for i in range( m.text_size - motif_len ):
+            motif = string.join( [ text[ i : i + motif_len ] for text in texts ] )
+            if big_map.has_key( motif ): big_map[ motif ] += 1
+            else: big_map[ motif ] = 1
+            total += 1
+
+    items = zip( big_map.values(), big_map.keys() )
+    items.sort()
+    items.reverse()
+
+    for count, motif in items: 
+        print "%d\t%0.10f\t%s" % ( count, count / total, motif )
+
+if __name__ == "__main__": __main__()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/nib_intervals_to_fasta.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/nib_intervals_to_fasta.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/nib_intervals_to_fasta.py (revision 3)
@@ -0,0 +1,41 @@
+#!/usr/bin/python2.6
+
+"""
+Read a set of ranges and a nib file, print portions of nib overlapping
+those ranges to stdout
+
+usage: %prog range_file nib_file
+"""
+
+from bx.cookbook import doc_optparse
+import bx.seq.nib
+import string
+import sys
+
+def __main__():
+
+    options, args = doc_optparse.parse( __doc__ )
+
+    try:
+        range_file = file( args[0] )
+        nib_file = file( args[1] )
+    except:
+        doc_optparse.exit()
+
+    nib = bx.seq.nib.NibFile( nib_file )
+
+    for line in range_file: 
+        fields = line.split()
+        start, end = int( fields[0] ), int( fields[1] ) 
+        print ">", start, end 
+        print_wrapped( nib.get( start, end - start ) )
+
+def print_wrapped( s ):
+    l = len( s )        
+    c = 0
+    while c < l:
+        b = min( c + 50, l )
+        print s[c:b]
+        c = b
+
+if __name__ == "__main__": __main__()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/lzop_build_offset_table.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/lzop_build_offset_table.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/lzop_build_offset_table.py (revision 3)
@@ -0,0 +1,90 @@
+#!/usr/bin/python2.6
+
+"""
+Read a compressed file as created by 'lzop' from stdin and write a table to 
+stdout containing the blocksize and the start offset (in bytes) of each 
+compressed block. 
+
+usage: %prog < FILENAME.lzo > FILENAME.lzot
+"""
+
+import struct, sys
+
+MAGIC="\x89\x4c\x5a\x4f\x00\x0d\x0a\x1a\x0a"
+
+F_ADLER32_D     = 0x00000001L
+F_ADLER32_C     = 0x00000002L
+F_H_EXTRA_FIELD = 0x00000040L
+F_H_GMTDIFF     = 0x00000080L
+F_CRC32_D       = 0x00000100L
+F_CRC32_C       = 0x00000200L
+F_MULTIPART     = 0x00000400L
+F_H_FILTER      = 0x00000800L
+F_H_CRC32       = 0x00001000L
+
+assert struct.calcsize( "!H" ) == 2
+assert struct.calcsize( "!I" ) == 4
+
+class UnpackWrapper( object ):
+    def __init__( self, file ):
+        self.file = file
+    def read( self, amt ):
+        return self.file.read( amt )
+    def get( self, fmt ):
+        t = struct.unpack( fmt, self.file.read( struct.calcsize( fmt ) ) )
+        return t[0]
+
+def main():
+    f = UnpackWrapper( sys.stdin )
+    # Read header
+    magic = f.read(9)
+    assert magic == MAGIC, "Not LZOP file"
+    version = f.get( "!H" )
+    lib_version = f.get( "!H" )
+    if version >= 0x0940:
+        extract_version = f.get( "!H" )
+    method = f.get( "!B" )
+    assert 1 <= method <= 3, "Only LZO compression is currently supported"
+    level = f.get( "!B" )
+    flags = f.get( "!I" )
+    assert not( flags & F_H_FILTER ), "LZOP filters not supported"
+    has_compressed_crc = ( flags & F_CRC32_C or flags & F_ADLER32_C )
+    has_uncompressed_crc = ( flags & F_CRC32_D or flags & F_ADLER32_D )
+    mode = f.get( "!I" )
+    time = f.get( "!I" )
+    time_offset = f.get( "!I" )
+    fname_len = f.get( "!B" )
+    fname = f.read( fname_len )
+    assert len( fname ) == fname_len, "EOF reading filename"
+    header_crc = f.get( "!I" )
+    if ( flags & F_H_EXTRA_FIELD ):
+        extra_len = f.get( "!I" )
+        extra = f.read( extra_len )
+        assert len( extra ) == extra_len, "EOF reading extra field"
+    # Done with header
+    block_size = None
+    expect_no_more = False
+    # Read blocks
+    while 1:
+        size = f.get( "!I" )
+        if size == 0: break
+        assert not( expect_no_more ), \
+            "Encountered an undersized block that was not the last block"
+        if block_size is None:
+            print "s", size
+            block_size = size
+        else:
+            if size < block_size:
+                expect_no_more = True
+        compressed_size = f.get( "!I" )
+        if has_uncompressed_crc:
+            crc = f.get( "!I" )
+        if has_compressed_crc:
+            compressed_crc = f.get( "!I" )
+        print "o", f.file.tell(), compressed_size, size
+        compressed_data = f.read( compressed_size )
+        assert len( compressed_data ) == compressed_size, \
+            "EOF reading compressed data"
+
+if __name__ == "__main__":
+    main()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/aggregate_scores_in_intervals.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/aggregate_scores_in_intervals.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/aggregate_scores_in_intervals.py (revision 3)
@@ -0,0 +1,126 @@
+#!/usr/bin/python2.6
+
+"""
+Given a list of intervals in BED format (`interval_file`) and a set of scores
+(`score_file`) print each interval plus the average, minimum, and maximum of
+the scores that fall in that interval. Scores can either be wiggle format
+data or a directory containing binned array files (named according to the
+sequence source / chromosome of the intervals).
+
+usage: %prog score_file interval_file [out_file] [options] 
+    -b, --binned: 'score_file' is actually a directory of binned array files
+    -m, --mask=FILE: bed file containing regions not to consider valid
+"""
+
+from __future__ import division
+
+import psyco_full
+import sys
+import os, os.path
+from UserDict import DictMixin
+import bx.wiggle
+from bx.binned_array import BinnedArray, FileBinnedArray
+from bx.bitset import *
+from bx.bitset_builders import *
+from bx_extras.fpconst import isNaN
+from bx.cookbook import doc_optparse
+from bx import misc
+
+class FileBinnedArrayDir( DictMixin ):
+    """
+    Adapter that makes a directory of FileBinnedArray files look like
+    a regular dict of BinnedArray objects. 
+    """
+    def __init__( self, dir ):
+        self.dir = dir
+        self.cache = dict()
+    def __getitem__( self, key ):
+        value = None
+        if key in self.cache:
+            value = self.cache[key]
+        else:
+            fname = os.path.join( self.dir, "%s.ba" % key )
+            if os.path.exists( fname ):
+                value = FileBinnedArray( open( fname ) )
+                self.cache[key] = value
+        if value is None:
+            raise KeyError( "File does not exist: " + fname )
+        return value
+
+def load_scores_wiggle( fname ):
+    """
+    Read a wiggle file and return a dict of BinnedArray objects keyed 
+    by chromosome.
+    """
+    scores_by_chrom = dict()
+    for chrom, pos, val in bx.wiggle.Reader( misc.open_compressed( fname ) ):
+        if chrom not in scores_by_chrom:
+            scores_by_chrom[chrom] = BinnedArray()
+        scores_by_chrom[chrom][pos] = val
+    return scores_by_chrom
+
+def load_scores_ba_dir( dir ):
+    """
+    Return a dict-like object (keyed by chromosome) that returns 
+    FileBinnedArray objects created from "key.ba" files in `dir`
+    """
+    return FileBinnedArrayDir( dir )
+    
+def main():
+
+    # Parse command line
+    options, args = doc_optparse.parse( __doc__ )
+    try:
+        score_fname = args[0]
+        interval_fname = args[1]
+        if len( args ) > 2:
+            out_file = open( args[2], 'w' )
+        else:
+            out_file = sys.stdout
+        binned = bool( options.binned )
+        mask_fname = options.mask
+    except:
+        doc_optparse.exit()
+
+    if binned:
+        scores_by_chrom = load_scores_ba_dir( score_fname )
+    else:
+        scores_by_chrom = load_scores_wiggle( score_fname )
+
+    if mask_fname:
+        masks = binned_bitsets_from_file( open( mask_fname ) )
+    else:
+        masks = None
+
+    for line in open( interval_fname ):
+        fields = line.split()
+        chrom, start, stop = fields[0], int( fields[1] ), int( fields[2] )
+        total = 0
+        count = 0
+        min_score = 100000000
+        max_score = -100000000
+        for i in range( start, stop ):
+            if chrom in scores_by_chrom and scores_by_chrom[chrom][i]:
+                # Skip if base is masked
+                if masks and chrom in masks:
+                    if masks[chrom][i]:
+                        continue
+                # Get the score, only count if not 'nan'
+                score = scores_by_chrom[chrom][i]
+                if not isNaN( score ):
+                    total += score
+                    count += 1
+                    max_score = max( score, max_score )
+                    min_score = min( score, min_score )
+        if count > 0:
+            avg = total/count
+        else:
+            avg = "nan"
+            min_score = "nan"
+            max_score = "nan"
+            
+        print >> out_file, "\t".join( map( str, [ chrom, start, stop, avg, min_score, max_score ] ) )
+
+    out_file.close()
+
+if __name__ == "__main__": main()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/bed_build_windows.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/bed_build_windows.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/bed_build_windows.py (revision 3)
@@ -0,0 +1,54 @@
+#!/usr/bin/python2.6
+
+"""
+Build windows of length `window_size` over the sequences defined by 
+`len_file` excluding regions in `gap_file`.
+
+After removing the gaps, windows of exactly `window_size` units will be
+placed in the remaining regions, with the extra space evenly placed
+between the windows.
+
+`len_file` is LEN format (name length) and `gap_file is BED (name start stop).
+
+usage: %prog len_file gap_file window_size
+"""
+
+import sys
+from bx.bitset_builders import binned_bitsets_from_file
+import random
+
+def main():
+    region_fname, exclude_fname, window_size = sys.argv[1], sys.argv[2], int( sys.argv[3] ) 
+    exclude_bitsets = binned_bitsets_from_file( open( exclude_fname ) )
+    for line in open( region_fname ):
+        fields = line.split()
+        chr, start, end = fields[0], 0, int( fields[1] )
+        if chr not in exclude_bitsets:
+            do_windows( chr, start, end, window_size )
+        else:
+            bits = exclude_bitsets[chr]
+            assert end < bits.size
+            e = 0
+            while 1:
+                s = bits.next_clear( e )
+                if s > end: break
+                e = bits.next_set( s )
+                do_windows( chr, s, min( e, end ), window_size )
+
+def do_windows( chr, start, end, window_size ):
+    length = end - start
+    window_count = length // window_size
+    if window_count == 0:
+        return
+    lost = length % window_size
+    skip_amount = lost // window_count
+    ## skip_amounts = [0] * ( window_count + 1 )
+    ## for i in range( 0, lost ): skip_amounts[ random.randrange( 0, window_count + 1 ) ] += 1
+    s = 0
+    for i in range( 0, window_count ):
+        s += skip_amount
+        print chr, start + s, start + s + window_size        
+        s += window_size
+        
+if __name__ == "__main__":
+    main()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/bed_subtract_basewise.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/bed_subtract_basewise.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/bed_subtract_basewise.py (revision 3)
@@ -0,0 +1,43 @@
+#!/usr/bin/python2.6
+
+"""
+Find continuous regions that are covered by the first bed file (`bed_file_1`)
+but not by the second bed file (`bed_file_2`)
+
+usage: %prog bed_file_1 bed_file_2
+"""
+
+import sys
+from warnings import warn
+from bx.bitset_builders import binned_bitsets_from_file
+from bx.cookbook import doc_optparse
+
+def print_bits_as_bed( bits ):
+    end = 0
+    while 1:
+        start = bits.next_set( end )
+        if start == bits.size: break
+        end = bits.next_clear( start )
+        print "%s\t%d\t%d" % ( chrom, start, end )
+
+options, args = doc_optparse.parse( __doc__ )
+try:
+    in_fname, in2_fname = args
+except:
+    doc_optparse.exit()
+
+# Read first bed into some bitsets
+
+bitsets1 = binned_bitsets_from_file( open( in_fname ) )
+bitsets2 = binned_bitsets_from_file( open( in2_fname ) )
+
+for chrom in bitsets1:  
+    if chrom not in bitsets1:
+        continue
+    bits1 = bitsets1[chrom]
+    if chrom in bitsets2:
+        bits2 = bitsets2[chrom]
+        bits2.invert()
+        bits1.iand( bits2 )
+    print_bits_as_bed( bits1 )
+    
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_to_fasta.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_to_fasta.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_to_fasta.py (revision 3)
@@ -0,0 +1,42 @@
+#!/usr/bin/python2.6
+
+"""
+Read a maf and print the text as a fasta file.
+
+usage: %prog < maf > fasta
+"""
+
+from __future__ import division
+
+import textwrap
+import sys
+from bx.align import maf
+
+def __main__():
+
+    maf_reader = maf.Reader( sys.stdin )
+
+    # Confusing since maf_to_concat_fasta takes names.
+
+    # if len( sys.argv ) > 1:
+    #     comps = map( int, sys.argv[1:] )
+    # else:
+    #     comps = None    
+
+    comps = None
+
+    for i, m in enumerate( maf_reader ):
+        if comps: l = [ m.components[i] for i in comps ]
+        else: l = m.components
+        for c in l:
+            print ">%s:%d-%d" % ( c.src, c.start, c.end )
+            print c.text
+            #print_n( c.text, 50 )
+
+def print_n( s, n, f = sys.stdout ):
+    p = 0
+    while p < len( s ):
+        print >> f, s[p:min(p+n,len(s))]
+        p += n
+
+if __name__ == "__main__": __main__()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_extract_chrom_ranges.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_extract_chrom_ranges.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_extract_chrom_ranges.py (revision 3)
@@ -0,0 +1,91 @@
+#!/usr/bin/python2.6
+
+"""
+Reads a list of intervals and a maf. Produces a new maf containing the
+portions of the original that overlapped the intervals
+
+NOTE: See maf_extract_ranges_indexed.py which works better / faster for many
+      use cases.
+
+TODO: Combine with maf_extract_ranges, and possibly share some code with 
+      maf_extract_ranges_indexed.
+
+usage: %prog interval_file refname|refindex [options] < maf_file
+   -m, --mincols=10: Minimum length (columns) required for alignment to be output
+   -p, --prefix=PREFIX: Prefix
+"""
+
+import psyco_full
+
+from bx.cookbook import doc_optparse
+
+import bx.align.maf
+from bx import intervals
+import sys
+
+
+def __main__():
+
+    # Parse Command Line
+
+    options, args = doc_optparse.parse( __doc__ )
+
+    try:
+        range_filename = args[ 0 ]
+        try: 
+            refindex = int( args[ 1 ] )
+            refname = None
+        except: 
+            refindex = None
+            refname = args[ 1 ]
+        if options.mincols: mincols = int( options.mincols )
+        else: mincols = 10
+        if options.prefix: prefix = options.prefix
+        else: prefix = ""
+    except:
+        doc_optparse.exit()
+
+    # Load Intervals
+
+    intersecters = dict()    
+    for line in file( range_filename ):
+        fields = line.split()
+        src = prefix + fields[0]
+        if not src in intersecters: intersecters[src] = intervals.Intersecter()
+        intersecters[src].add_interval( intervals.Interval( int( fields[1] ), int( fields[2] ) ) )
+
+    # Start MAF on stdout
+
+    out = bx.align.maf.Writer( sys.stdout )
+
+    # Iterate over input MAF
+
+    for maf in bx.align.maf.Reader( sys.stdin ):
+        if refname: 
+            sourcenames = [ cmp.src.split('.')[0] for cmp in maf.components ]
+            try: refindex = sourcenames.index( refname )
+            except:
+                continue
+
+        ref_component = maf.components[ refindex ]
+        # Find overlap with reference component
+        if not ( ref_component.src in intersecters ): continue
+        intersections = intersecters[ ref_component.src ].find( ref_component.start, ref_component.end )
+        # Keep output maf ordered
+        intersections.sort()
+        # Write each intersecting block
+        for interval in intersections: 
+            start = max( interval.start, ref_component.start )
+            end = min( interval.end, ref_component.end )
+            sliced = maf.slice_by_component( refindex, start, end ) 
+            good = True
+            for c in sliced.components: 
+                if c.size < 1: 
+                    good = False
+            if good and sliced.text_size > mincols: out.write( sliced )
+         
+    # Close output MAF
+
+    out.close()
+
+if __name__ == "__main__": __main__()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/axt_extract_ranges.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/axt_extract_ranges.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/axt_extract_ranges.py (revision 3)
@@ -0,0 +1,68 @@
+#!/usr/bin/python2.6
+
+"""
+Reads a list of intervals and an axt. Produces a new axt containing the
+portions of the original that overlapped the intervals
+
+usage: %prog interval_file refindex [options] < axt_file
+   -m, --mincols=10: Minimum length (columns) required for alignment to be output
+"""
+
+import psyco_full
+
+from bx.cookbook import doc_optparse
+
+import bx.align.axt
+from bx import intervals
+import sys
+
+
+def __main__():
+
+	# Parse Command Line
+
+	options, args = doc_optparse.parse( __doc__ )
+
+	try:
+		range_filename = args[ 0 ]
+		refindex = int( args[ 1 ] )
+		if options.mincols: mincols = int( options.mincols )
+		else: mincols = 10
+	except:
+		doc_optparse.exit()
+
+	# Load Intervals
+
+	intersecter = intervals.Intersecter()
+	for line in file( range_filename ):
+		fields = line.split()
+		intersecter.add_interval( intervals.Interval( int( fields[0] ), int( fields[1] ) ) )
+
+	# Start axt on stdout
+
+	out = bx.align.axt.Writer( sys.stdout )
+
+	# Iterate over input axt
+
+	for axt in bx.align.axt.Reader( sys.stdin ):
+		ref_component = axt.components[ refindex ]
+		# Find overlap with reference component
+		intersections = intersecter.find( ref_component.start, ref_component.end )
+		# Keep output axt ordered
+		intersections.sort()
+		# Write each intersecting block
+		for interval in intersections: 
+			start = max( interval.start, ref_component.start )
+			end = min( interval.end, ref_component.end )
+			sliced = axt.slice_by_component( refindex, start, end ) 
+			good = True
+			for c in sliced.components: 
+				if c.size < 1: 
+					good = False
+			if good and sliced.text_size > mincols: out.write( sliced )
+		 
+	# Close output axt
+
+	out.close()
+
+if __name__ == "__main__": __main__()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/find_in_sorted_file.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/find_in_sorted_file.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/find_in_sorted_file.py (revision 3)
@@ -0,0 +1,77 @@
+#!/usr/bin/python2.6
+
+"""
+Extract ranges of scores from a sorted file in which each line contains a
+position followed by a score. 
+
+TODO: The finder class might actually be useful, it strides through a file
+      and builds an index based on the first line. Maybe move it into the
+      library and get rid of this very specific script?
+      
+usage: %prog start_pos stop_pos
+"""
+
+import sys
+
+max_cats = 1000
+
+class Finder:
+    def __init__( self, file, segments ):
+        self.file = file
+        self.segments = segments
+        self.make_index()
+    def make_index( self ):
+        self.values = []
+        self.positions = []
+        
+        file.seek( 0, 2 )
+        end = file.tell()
+
+        step = end / ( self.segments - 1 )
+
+        for i in range( 0, self.segments - 1 ):
+            file.seek( i * step, 0 )
+            file.readline()
+            position = file.tell()
+            fields = file.readline().split()
+            self.values.append( int( fields[ 0 ] ) )
+            self.positions.append( position )
+
+    def scores_in_range( self, start, end ):
+        position = self.positions[ -1 ]
+        for i in range( 1, len( self.values ) ):
+            if self.values[ i ] > start:
+                position = self.positions[ i - 1 ]
+                break
+        self.file.seek( position, 0 )
+        result = []
+        while 1:
+            line = file.readline()
+            if line == "": break
+            fields = line.split()
+
+            pos = int( fields[ 0 ] )
+
+            if pos < start: continue
+            if pos > end: break
+
+            result.append( ( pos, fields[1] ) )
+
+        return result
+
+file = open( sys.argv[ 1 ] )
+
+finder = Finder( file, 100 )
+
+scores = finder.scores_in_range( int( sys.argv[2] ), int( sys.argv[3] ) )
+
+rng = scores[-1][0] - scores[0][0]
+
+if rng > max_cats:
+    stride = rng // max_cats
+else:
+    stride = 1
+
+for score in scores:
+    if score[0] % stride == 0:
+        print score[0], score[1]
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_print_chroms.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_print_chroms.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_print_chroms.py (revision 3)
@@ -0,0 +1,37 @@
+#!/usr/bin/python2.6
+
+"""
+Read a maf from stdin and print the chromosome number for each alignment. It
+searches for 'chr' in each alignment block src, and may not be robust if other
+src formats are used. 
+
+NOTE: See 'align_print_template.py' for a more general variation of this
+      program.
+
+usage: %prog refindex [options]
+"""
+
+from __future__ import division
+
+import sys
+from bx.cookbook import doc_optparse
+from bx.align import maf
+from optparse import OptionParser
+
+def __main__():
+
+    # Parse command line arguments
+    options, args = doc_optparse.parse( __doc__ )
+
+    try:
+        refindex = int( args[0] )
+    except:
+        doc_optparse.exit()
+
+    maf_reader = maf.Reader( sys.stdin )
+
+    for m in maf_reader: 
+		c = m.components[ refindex ].src
+		print c[ c.rfind( "chr" ) + 3 : ]
+
+if __name__ == "__main__": __main__()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_mapping_word_frequency.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_mapping_word_frequency.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_mapping_word_frequency.py (revision 3)
@@ -0,0 +1,58 @@
+#!/usr/bin/python2.6
+
+"""
+
+Reads a maf file from stdin and applies the mapping file specified by
+`mapping_file` to produce a sequence of integers. Then for each possible word
+of length `motif_len` in this integer alphabet print the number of times
+that word occurs in the block. 
+
+usage: %prog motif_len mapping_file < maf_file > counts
+"""
+
+from __future__ import division
+
+import psyco_full
+
+import bx.align.maf
+from bx import seqmapping
+import string
+import sys
+from Numeric import *
+
+def main():
+
+    word_length = int( sys.argv[1] )
+    align_count, alpha_map = seqmapping.alignment_mapping_from_file( file( sys.argv[2] ) )
+
+    for maf in bx.align.maf.Reader( sys.stdin ):
+        assert len( maf.components ) == align_count
+        # Translate alignment to ints
+        ints = seqmapping.DNA.translate_list( [ c.text for c in maf.components ] )
+        # Apply mapping 
+        ints = alpha_map.translate( ints )
+        # Count words
+        radix = alpha_map.get_out_size()
+        counts = zeros( radix ** word_length, Int ) 
+        total = 0
+        for i in range( word_length, len( ints ) ):
+            index = 0
+            factor = 1
+            skip = False
+            for j in range( word_length ):
+                assert 0 < i-j < len( ints )
+                letter = ints[i-j]
+                if letter < 0:
+                    skip = True
+                    break
+                index += letter * factor
+                factor *= radix
+            if skip: 
+                continue        
+            else:
+                counts[ index ] += 1
+                total += 1
+        # Write ints separated by tabs
+        print '\t'.join( [ str( total ) ] + map( str, counts ) )
+
+if __name__ == "__main__": main()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/ucsc_gene_table_to_intervals.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/ucsc_gene_table_to_intervals.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/ucsc_gene_table_to_intervals.py (revision 3)
@@ -0,0 +1,76 @@
+#!/usr/bin/python2.6
+
+"""
+Read a table dump in the UCSC gene table format and print a tab separated
+list of intervals corresponding to requested features of each gene.
+
+usage: ucsc_gene_table_to_intervals.py [options] < gene_table.txt
+
+options:
+  -h, --help            show this help message and exit
+  -rREGION, --region=REGION
+                        Limit to region: one of coding, utr3, utr5, transcribed [default]
+  -e, --exons           Only print intervals overlapping an exon
+"""
+
+import optparse, string, sys
+
+def main():
+    # Parse command line    
+    parser = optparse.OptionParser( usage="%prog [options] < gene_table.txt" )
+    parser.add_option( "-r", "--region", dest="region", default="transcribed",
+                       help="Limit to region: one of coding, utr3, utr5, transcribed [default]" )
+    parser.add_option( "-e", "--exons",  action="store_true", dest="exons",
+                       help="Only print intervals overlapping an exon" )
+    parser.add_option( "-s", "--strand",  action="store_true", dest="strand",
+                       help="Print strand after interval" )
+    parser.add_option( "-b", "--nobin",  action="store_false", dest="discard_first_column", default=True,
+                       help="file doesn't contain a 'bin' column (use this for pre-hg18 files)" )
+    options, args = parser.parse_args()
+    assert options.region in ( 'coding', 'utr3', 'utr5', 'transcribed' ), "Invalid region argument"
+
+    # Read table from stdin and handle each gene
+    for line in sys.stdin:
+
+        # Parse fields from gene tabls
+        fields = line.split( '\t' )
+        if (options.discard_first_column): fields.pop(0)
+        chrom = fields[1]
+        strand = fields[2]
+        tx_start = int( fields[3] )
+        tx_end = int( fields[4] )
+        cds_start = int( fields[5] )
+        cds_end = int( fields[6] )
+
+        # Determine the subset of the transcribed region we are interested in
+        if options.region == 'utr3':
+            if strand == '-': region_start, region_end = tx_start, cds_start
+            else: region_start, region_end = cds_end, tx_end 
+        elif options.region == 'utr5':
+            if strand == '-': region_start, region_end = cds_end, tx_end
+            else: region_start, region_end = tx_start, cds_start
+        elif options.region == 'coding':
+            region_start, region_end = cds_start, cds_end
+        else:
+            region_start, region_end = tx_start, tx_end
+
+        # If only interested in exons, print the portion of each exon overlapping
+        # the region of interest, otherwise print the span of the region
+        if options.exons:
+            exon_starts = map( int, fields[8].rstrip( ',\n' ).split( ',' ) )
+            exon_ends = map( int, fields[9].rstrip( ',\n' ).split( ',' ) )
+            for start, end in zip( exon_starts, exon_ends ):
+                start = max( start, region_start )
+                end = min( end, region_end )
+                if start < end:
+                    if strand: print_tab_sep( chrom, start, end, strand )
+                    else: print_tab_sep( chrom, start, end )
+        else:
+            if strand: print_tab_sep( chrom, region_start, region_end, strand )
+            else: print_tab_sep( chrom, region_start, region_end )
+
+def print_tab_sep( *args ):
+    """Print items in `l` to stdout separated by tabs"""
+    print string.join( [ str( f ) for f in args ], '\t' )
+
+if __name__ == "__main__": main()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/int_seqs_to_char_strings.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/int_seqs_to_char_strings.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/int_seqs_to_char_strings.py (revision 3)
@@ -0,0 +1,24 @@
+#!/usr/bin/python2.6
+
+"""
+Translate lists of space separated integers (magnitude less than 62) and print 
+as strings of alphanumeric characters. This is useful mainly for some machine
+learning algorithms that only take string input.
+
+usage: %prog < int_seqs > strings
+"""
+
+from itertools import *
+
+import sys
+
+table = "012345678ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
+
+def main():
+    for line in sys.stdin:
+        ints = [ int( f ) for f in line.split() ]
+        if max( ints ) > len( table ):
+            raise "Alphabet size too large!"
+        print str.join( '', [ table[i] for i in ints ] )    
+
+if __name__ == "__main__": main()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_translate_chars.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_translate_chars.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_translate_chars.py (revision 3)
@@ -0,0 +1,39 @@
+#!/usr/bin/python2.6
+
+"""
+Translate a maf file containing gap ambiguity characters as produced by 
+'maf_tile_2.py' to a new file in which "#" (contiguous) is replaced by "-" and
+all other types are replaces by "*".
+
+TODO: This could be much more general, should just take the translation table
+      from the command line.
+      
+usage: %prog < maf > maf
+"""
+
+from __future__ import division
+
+import psyco_full
+
+import sys
+
+import sys
+from bx.align import maf
+import string
+
+table = string.maketrans( "#=X@", "-***")
+
+def main():
+
+    maf_reader = maf.Reader( sys.stdin )
+    maf_writer = maf.Writer( sys.stdout )
+
+    for m in maf_reader:
+        for c in m.components:
+            c.text = c.text.translate( table )
+        maf_writer.write( m )    
+    
+    maf_writer.close()
+    
+if __name__ == "__main__": 
+    main()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/align_print_template.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/align_print_template.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/align_print_template.py (revision 3)
@@ -0,0 +1,47 @@
+#!/usr/bin/python2.6
+
+"""
+Read an alignment from stdin and for each block print the result of 
+evaluating `template_string` (in cheetah template format). The alignment
+block will be placed in the template context as `a` and the list of components
+as `c`.
+
+usage: %prog template [options]
+    -f, --format = maf: Input format, maf (default) or axt
+"""
+
+from __future__ import division
+
+import psyco_full
+
+import sys
+from bx.cookbook import doc_optparse
+from bx import align
+
+try:
+    from Cheetah.Template import Template
+except:
+    print >> sys.stderr, "This script requires the Cheetah template modules"
+    sys.exit( -1 )
+
+def main():
+
+    # Parse command line arguments
+    options, args = doc_optparse.parse( __doc__ )
+
+    try:
+        template = Template( args[0] )
+        format = options.format
+        if not format: format = "maf"
+    except:
+        doc_optparse.exception()
+
+    reader = align.get_reader( format, sys.stdin ) 
+
+    for a in reader: 
+        template.a = a
+        template.c = a.components
+        print template
+
+if __name__ == "__main__": 
+	main()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/bed_coverage.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/bed_coverage.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/bed_coverage.py (revision 3)
@@ -0,0 +1,29 @@
+#!/usr/bin/python2.6
+
+"""
+Print number of bases covered by all intervals in a bed file (bases covered by
+more than one interval are counted only once). Multiple bed files can be 
+provided on the command line or to stdin.
+
+usage: %prog bed files ...
+"""
+
+import psyco_full
+import sys
+from bx.bitset import BinnedBitSet
+from bx.bitset_builders import *
+from itertools import *
+
+bed_filenames = sys.argv[1:]
+if bed_filenames:
+    input = chain( * imap( open, bed_filenames ) )
+else:
+    input = sys.stdin
+
+bitsets = binned_bitsets_from_file( input )
+
+total = 0
+for chrom in bitsets:
+    total += bitsets[chrom].count_range( 0, bitsets[chrom].size )
+
+print total    
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_gc_content.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_gc_content.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_gc_content.py (revision 3)
@@ -0,0 +1,32 @@
+#!/usr/bin/python2.6
+
+"""
+Read a MAF from standard input and print average GC content of each alignment
+
+usage: %prog < maf > out
+"""
+
+from __future__ import division
+
+import sys
+
+from bx.align import maf
+
+
+def __main__():
+    
+    maf_reader = maf.Reader( sys.stdin )
+
+    for m in maf_reader:
+        gc = 0
+        bases = 0
+        for c in m.components:
+          gc += c.text.count( 'G' )
+          gc += c.text.count( 'C' )
+          gc += c.text.count( 'g' )
+          gc += c.text.count( 'c' )
+          bases += ( len( c.text ) - c.text.count( '-' ) )
+
+        print gc / bases
+
+if __name__ == "__main__": __main__()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_mask_cpg.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_mask_cpg.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_mask_cpg.py (revision 3)
@@ -0,0 +1,40 @@
+#!/usr/bin/python2.6
+
+"""
+Mask out potential CpG sites from a maf. Restricted or inclusive definition
+of CpG sites can be used. The total fraction masked is printed to stderr.
+
+usage: %prog < input > output
+    -m, --mask=N: Character to use as mask ('?' is default)
+    -r, --restricted: Use restricted definition of CpGs
+"""
+
+import bx.align
+import bx.align.maf
+from bx.cookbook import doc_optparse
+import sys
+import bx.align.sitemask.cpg
+
+def main():
+    options, args = doc_optparse.parse( __doc__ )
+    try:
+        if options.mask:
+            mask = options.mask
+        else:
+            mask = "?"
+    except:
+        doc_optparse.exception()
+
+    reader = bx.align.maf.Reader( sys.stdin )
+    writer = bx.align.maf.Writer( sys.stdout )
+
+    if options.restricted:
+        cpgfilter = bx.align.sitemask.cpg.Restricted( mask=mask )
+    else:
+        cpgfilter = bx.align.sitemask.cpg.Inclusive( mask=mask )
+    cpgfilter.run( reader, writer.write )
+
+    print >> sys.stderr, str( float(cpgfilter.masked)/float(cpgfilter.total) * 100 ) + "% bases masked."
+
+if __name__ == "__main__":
+    main()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/lav_to_maf.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/lav_to_maf.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/lav_to_maf.py (revision 3)
@@ -0,0 +1,53 @@
+#!/usr/bin/python2.6
+"""
+Application to convert LAV file to MAF file. Reads a LAV file from standard 
+input and writes a MAF file to standard out; some statistics are written to 
+standard error.
+
+usage: lav_to_maf [--silent] [path=replacement] < lav_file > maf_file
+"""
+
+import sys
+import copy
+import bx.align.lav
+import bx.align.maf
+
+def usage(s=None):
+	message = __doc__
+	if (s == None): sys.exit (message)
+	else:           sys.exit ("%s\n%s" % (s,message))
+
+
+def main():
+
+	# parse the command line
+
+	silent = False
+	pathSubs = []
+
+	for arg in sys.argv[1:]:
+		if ("=" in arg):
+			ix = arg.find("=")
+			pathSubs.append((arg[:ix],arg[ix+1:]))
+		elif (arg == "--silent"):
+			silent = True
+		else:
+			usage("unrecognized argument: " + arg)
+
+	# read the alignments and other info
+
+	out = bx.align.maf.Writer(sys.stdout)
+
+	lavsRead = mafsWritten = 0
+	for lavBlock in bx.align.lav.Reader(sys.stdin,path_subs=pathSubs):
+		lavsRead += 1
+
+		out.write (lavBlock)
+		mafsWritten += 1
+
+	if (not silent):
+		sys.stderr.write ("%d blocks read, %d written\n" % (lavsRead,mafsWritten))
+
+
+if __name__ == "__main__": main()
+
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/nib_length.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/nib_length.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/nib_length.py (revision 3)
@@ -0,0 +1,13 @@
+#!/usr/bin/python2.6
+
+"""
+Print the number of bases in a nib file.
+
+usage: %prog nib_file
+"""
+
+from bx.seq import nib as seq_nib
+import sys
+
+nib = seq_nib.NibFile( file( sys.argv[1] ) )
+print nib.length
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_to_int_seqs.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_to_int_seqs.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_to_int_seqs.py (revision 3)
@@ -0,0 +1,40 @@
+#!/usr/bin/python2.6
+
+"""
+For each block in a maf file (read from stdin) write a sequence of ints 
+corresponding to the columns of the block after applying the provided sequence
+mapping.
+
+The 'correct' number of species is determined by the mapping file, blocks not having
+this number of species will be ignored.
+
+usage: %prog mapping_file
+"""
+
+from __future__ import division
+
+import psyco_full
+
+import bx.align.maf
+from bx import seqmapping
+import string
+import sys
+
+def main():
+
+    if len( sys.argv ) > 1:
+        _, alpha_map = seqmapping.alignment_mapping_from_file( file( sys.argv[1] ) )
+    else:
+        alpha_map = None
+
+    for maf in bx.align.maf.Reader( sys.stdin ):
+        # Translate alignment to ints
+        int_seq = seqmapping.DNA.translate_list( [ c.text for c in maf.components ] )
+        # Apply mapping 
+        if alpha_map:
+            int_seq = alpha_map.translate( int_seq )
+        # Write ints separated by spaces
+        for i in int_seq: print i,
+        print
+
+if __name__ == "__main__": main()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/random_lines.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/random_lines.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/random_lines.py (revision 3)
@@ -0,0 +1,16 @@
+#!/usr/bin/python2.6
+
+"""
+Script to select random lines from a file. Reads entire file into
+memory!
+
+TODO: Replace this with a more elegant implementation.
+"""
+
+import sys
+import random
+
+ndesired = int( sys.argv[1] )
+
+for line in random.sample( sys.stdin.readlines(), ndesired ):
+    print line,
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_thread_for_species.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_thread_for_species.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_thread_for_species.py (revision 3)
@@ -0,0 +1,55 @@
+#!/usr/bin/python2.6
+
+"""
+Read a maf file from stdin and write out a new maf with only blocks having all of
+the passed in species, after dropping any other species and removing columns 
+containing only gaps. By default this will attempt to fuse together any blocks
+which are adjacent after the unwanted species have been dropped. 
+
+usage: %prog species1 species2 ... < maf 
+    -n, --nofuse: Don't attempt to join blocks, just remove rows.
+"""
+
+import psyco_full
+
+import bx.align.maf
+import copy
+import sys
+
+from bx.align.tools.thread import *
+from bx.align.tools.fuse import *
+
+from itertools import *
+
+from bx.cookbook import doc_optparse
+
+def main():
+
+    options, args = doc_optparse.parse( __doc__ )
+
+    try:
+        species = args
+        # Allow a comma separated list, TODO: allow a newick format tree
+        if len( species ) == 1 and ',' in species[0]: species = species[0].split( ',' )
+        fuse = not( bool( options.nofuse ) ) 
+    except:
+        doc_optparse.exit()
+
+    maf_reader = bx.align.maf.Reader( sys.stdin )
+    maf_writer = bx.align.maf.Writer( sys.stdout )
+
+    if fuse: 
+        maf_writer = FusingAlignmentWriter( maf_writer )
+   
+    for m in maf_reader:            
+        new_components = get_components_for_species( m, species )	
+        if new_components: 
+            remove_all_gap_columns( new_components )          
+            m.components = new_components
+            m.score = 0.0 
+            maf_writer.write( m )
+
+    maf_reader.close()
+    maf_writer.close()
+    
+if __name__ == "__main__": main()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_count.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_count.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_count.py (revision 3)
@@ -0,0 +1,58 @@
+#!/usr/bin/python2.6
+
+"""
+Read a MAF from standard input and print counts of alignments, bases, or 
+columns. 
+
+usage: %prog [options]
+   -c, --cols: count alignment columns rather than number of alignments
+   -b, --bases: count bases in first species rather than number of alignments
+   -s, --skip=N: when counting bases, skip this base
+   -e, --each: print a count for each alignment rather than whole file
+   -r, --ref=N: reference sequence (first by default, 0..n)
+"""
+
+from bx.cookbook import doc_optparse
+import sys
+
+import bx.align.maf
+
+def __main__():
+
+    options, args = doc_optparse.parse( __doc__ )
+
+    try:
+        if options.cols: action = "cols"
+        elif options.bases: action = "bases"
+        else: action = "aligns"
+        print_each = bool( options.each )
+        if options.ref: ref = int( options.ref )
+        else: ref = 0
+        if options.skip: skip = options.skip
+        else: skip = None
+    except:
+        doc_optparse.exit()
+
+    maf_reader = bx.align.maf.Reader( sys.stdin )
+
+    count = 0
+
+    for m in maf_reader:
+        
+        if action == "aligns": 
+            count += 1
+        elif action == "cols": 
+            count += m.text_size
+        elif action == "bases":
+            if skip:
+                count += ( m.components[ref].size - m.components[ref].text.count( skip ) )
+            else:
+                count += m.components[ref].size
+
+        if print_each: 
+            print count
+            count = 0
+
+    if not print_each: print count
+
+if __name__ == "__main__": __main__()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/table_add_column.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/table_add_column.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/table_add_column.py (revision 3)
@@ -0,0 +1,46 @@
+#!/usr/bin/python2.6
+
+"""
+Tool for adding a column to a table. Expressions for the column are similar
+to those supported by table_filter.py
+
+usage: %prog expression colname < table 
+    -H, --header:    keep header in output
+    -C, --comments:  keep comments in output
+"""
+
+import psyco_full
+
+import sys
+
+import sys
+import bx.tabular.io
+from bx.cookbook import doc_optparse
+
+def __main__():
+
+    # Parse command line arguments
+    options, args = doc_optparse.parse( __doc__ )
+    try:
+        keep_header = bool( options.header )
+        keep_comments = bool( options.comments )
+        expr = args[0]
+        colname = args[1]
+    except:
+        doc_optparse.exception()
+
+    # Compile expression for SPEED
+    if expr: expr = compile( expr, '<expr arg>', 'eval' )
+
+    for element in bx.tabular.io.Reader( sys.stdin ):
+        if type( element ) is bx.tabular.io.Header:
+            if keep_header: 
+                print str( element ) + "\t" + colname
+        elif type( element ) is bx.tabular.io.Comment:
+            if keep_comments: 
+                print element
+        else:
+            val = eval( expr, dict( row=element ) )
+            print str( element ) + "\t" + str( val )
+
+if __name__ == "__main__": __main__()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/bed_complement.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/bed_complement.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/bed_complement.py (revision 3)
@@ -0,0 +1,50 @@
+#!/usr/bin/python2.6
+
+"""
+Complement the regions of a bed file. Requires a file that maps source names
+to sizes. This should be in the simple LEN file format (each line contains
+a source name followed by a size, separated by whitespace).
+
+usage: %prog bed_file chrom_length_file
+"""
+
+import sys
+
+from bx.bitset import *
+from bx.bitset_builders import *
+
+from bx.cookbook import doc_optparse
+
+def read_len( f ):
+    """Read a 'LEN' file and return a mapping from chromosome to length"""
+    mapping = dict()
+    for line in f:
+        fields = line.split()
+        mapping[ fields[0] ] = int( fields[1] )
+    return mapping
+
+options, args = doc_optparse.parse( __doc__ )
+try:
+    in_fname, len_fname = args
+except:
+    doc_optparse.exit()
+
+bitsets = binned_bitsets_from_file( open( in_fname ) )
+
+lens = read_len( open( len_fname ) )
+
+for chrom in lens:
+    if chrom in bitsets:
+        bits = bitsets[chrom]
+        bits.invert()
+        len = lens[chrom]
+        end = 0
+        while 1:
+            start = bits.next_set( end )
+            if start == bits.size: break
+            end = bits.next_clear( start )
+            if end > len: end = len
+            print "%s\t%d\t%d" % ( chrom, start, end )
+            if end == len: break
+    else:
+        print "%s\t%d\t%d" % ( chrom, 0, lens[chrom] )
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_species_in_all_files.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_species_in_all_files.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_species_in_all_files.py (revision 3)
@@ -0,0 +1,26 @@
+#!/usr/bin/python2.6
+
+"""
+Takes a list of maf filenames on the command line and prints a comma separated
+list of the species that occur in all of the mafs. 
+
+usage %prog maf1 maf2 ...
+"""
+
+import operator
+import sys
+import bx.align.maf
+
+files = sys.argv[1:]
+sets = []
+
+for file in files:
+    sys.stderr.write( "." )
+    s = set()
+    for block in bx.align.maf.Reader( open( file ) ):
+        for comp in block.components:
+            s.add( comp.src.split( '.' )[0] )
+    sets.append( s )
+
+inter = reduce( operator.and_, sets )
+print ",".join( inter )
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/bed_merge_overlapping.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/bed_merge_overlapping.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/bed_merge_overlapping.py (revision 3)
@@ -0,0 +1,33 @@
+#!/usr/bin/python2.6
+
+"""
+Merge any overlapping regions of bed files. Bed files can be provided on the
+command line or on stdin. Merged regions are always reported on the '+' 
+strand, and any fields beyond chrom/start/stop are lost. 
+
+usage: %prog bed files ...
+"""
+
+import psyco_full
+import sys
+
+from bx.bitset import *
+from bx.bitset_builders import *
+from itertools import *
+
+bed_filenames = sys.argv[1:]
+if bed_filenames:
+    input = chain( * imap( open, bed_filenames ) )
+else:
+    input = sys.stdin
+
+bitsets = binned_bitsets_from_bed_file( input )
+
+for chrom in bitsets:
+    bits = bitsets[chrom]
+    end = 0
+    while 1:
+        start = bits.next_set( end )
+        if start == bits.size: break
+        end = bits.next_clear( start )
+        print "%s\t%d\t%d" % ( chrom, start, end )
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_region_coverage_by_src.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_region_coverage_by_src.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_region_coverage_by_src.py (revision 3)
@@ -0,0 +1,68 @@
+#!/usr/bin/python2.6
+
+"""
+Reads a list of intervals and a set of indexed mafs. For each interval print
+the amount covered by each species other than the reference.
+
+usage: %prog maf_files  [options] < interval_file
+   -s, --src=s:      Use this src for all intervals
+   -p, --prefix=p:   Prepend this to each src before lookup
+"""
+
+from __future__ import division
+
+import psyco_full
+
+from bx.cookbook import doc_optparse
+
+import bx.align.maf
+from bx import intervals
+from bx import misc
+import sys
+
+def __main__():
+
+    # Parse Command Line
+
+    options, args = doc_optparse.parse( __doc__ )
+
+    try:
+        maf_files = args
+        if options.prefix: prefix = options.prefix
+        else: prefix = None
+    except:
+        doc_optparse.exit()
+
+    # Open indexed access to mafs
+    indexes = [ bx.align.maf.Indexed( maf_file, maf_file + ".index" ) for maf_file in maf_files ]
+
+    # Iterate over input ranges 
+
+    for line in sys.stdin:
+        fields = line.split()
+        src, start, end = fields[0], int( fields[1] ), int( fields[2] )
+        if prefix: src = prefix + src
+
+        total_length = end - start
+
+        # Find overlap with reference component
+        blocks = []
+        for index in indexes: blocks += index.get( src, start, end )
+
+        coverage = dict()
+        for block in blocks:
+            overlap_start = max( start, block.components[0].start )
+            overlap_end = min( end, block.components[0].end )
+            length = overlap_end - overlap_start
+            assert length > 0
+            for c in block.components[1:]:
+                species = c.src.split( '.' )[0]
+                try: coverage[ species ] += length
+                except: coverage[ species ] = length
+
+        print line,
+        for key, value in coverage.iteritems():
+            print "   ", key.ljust(10), "%0.2f" % ( value / total_length )
+
+
+if __name__ == "__main__": __main__()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_percent_identity.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_percent_identity.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_percent_identity.py (revision 3)
@@ -0,0 +1,41 @@
+#!/usr/bin/python2.6
+
+"""
+Read a PAIRWISE maf from stdin and print the percent identity of each
+alignment, where percent identity is defined as the number of matching columns
+over the number of aligned (non-gap) columns.
+
+TODO: Generalize for more than two species
+
+usage: %prog < maf > out
+"""
+
+from __future__ import division
+
+import sys
+
+import psyco_full
+
+from bx.align import maf
+
+
+def __main__():
+
+    maf_reader = maf.Reader( sys.stdin )
+
+    for m in maf_reader:
+        match = 0
+        total = 0
+        for i in range( 0, m.text_size ):
+            a = m.components[0].text[i].lower() 
+            b = m.components[1].text[i].lower()            
+            if a == '-' or b == '-': 
+                continue
+            elif a == b:
+                match += 1
+            total += 1
+
+        print match / total
+
+
+if __name__ == "__main__": __main__()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_extract_ranges_indexed.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_extract_ranges_indexed.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_extract_ranges_indexed.py (revision 3)
@@ -0,0 +1,110 @@
+#!/usr/bin/python2.6
+
+"""
+Reads a list of intervals and a maf. Produces a new maf containing the
+blocks or parts of blocks in the original that overlapped the intervals.
+
+It is assumed that each file `maf_fname` has a corresponding `maf_fname`.index 
+file.
+
+NOTE: If two intervals overlap the same block it will be written twice. With
+      non-overlapping intervals and --chop this is never a problem. 
+      
+NOTE: Intervals are relative to the + strand, regardless of the strands in
+      the alignments.
+
+      
+WARNING: bz2/bz2t support and file cache support are new and not as well
+         tested. 
+
+usage: %prog maf_fname1 maf_fname2 ... [options] < interval_file
+   -m, --mincols=0: Minimum length (columns) required for alignment to be output
+   -c, --chop:       Should blocks be chopped to only portion overlapping (no by default)
+   -s, --src=s:      Use this src for all intervals
+   -p, --prefix=p:   Prepend this to each src before lookup
+   -d, --dir=d:      Write each interval as a separate file in this directory
+   -S, --strand:     Strand is included as an additional column, and the blocks are reverse complemented (if necessary) so that they are always on that strand w/r/t the src species.
+   -C, --usecache:   Use a cache that keeps blocks of the MAF files in memory (requires ~20MB per MAF)
+"""
+
+import psyco_full
+
+from bx.cookbook import doc_optparse
+
+import bx.align.maf
+from bx import misc
+import os
+import sys
+
+def main():
+    # Parse Command Line
+    options, args = doc_optparse.parse( __doc__ )
+    try:
+        maf_files = args
+        if options.mincols: mincols = int( options.mincols )
+        else: mincols = 0
+        if options.src: fixed_src = options.src
+        else: fixed_src = None
+        if options.prefix: prefix = options.prefix
+        else: prefix = None
+        if options.dir: dir = options.dir
+        else: dir = None
+        chop = bool( options.chop )
+        do_strand = bool( options.strand )
+        use_cache = bool( options.usecache )
+    except:
+        doc_optparse.exit()
+    # Open indexed access to mafs
+    index = bx.align.maf.MultiIndexed( maf_files, keep_open=True,
+                                                  parse_e_rows=True,
+                                                  use_cache=use_cache )
+    # Start MAF on stdout
+    if dir is None: 
+        out = bx.align.maf.Writer( sys.stdout )
+    # Iterate over input ranges 
+    for line in sys.stdin:
+        strand = None
+        fields = line.split()
+        if fixed_src:
+            src, start, end = fixed_src, int( fields[0] ), int( fields[1] )
+            if do_strand: strand = fields[2]
+        else:
+            src, start, end = fields[0], int( fields[1] ), int( fields[2] )
+            if do_strand: strand = fields[3]
+        if prefix: src = prefix + src
+        # Find overlap with reference component
+        blocks = index.get( src, start, end )
+        # Open file if needed
+        if dir:
+            out = bx.align.maf.Writer( open( os.path.join( dir, "%s:%09d-%09d.maf" % ( src, start, end ) ), 'w' ) )
+        # Write each intersecting block
+        if chop:
+            for block in blocks: 
+                ref = block.get_component_by_src( src )
+                slice_start = max( start, ref.get_forward_strand_start() )
+                slice_end = min( end, ref.get_forward_strand_end() )
+                sliced = block.slice_by_component( ref, slice_start, slice_end ) 
+                # If the block is shorter than the minimum allowed size, stop
+                if mincols and ( sliced.text_size < mincols ):
+                    continue
+                # If the reference component is empty, don't write the block
+                if sliced.get_component_by_src( src ).size < 1:
+                    continue
+                # Keep only components that are not empty
+                sliced.components = [ c for c in sliced.components if c.size > 0 ]
+                # Reverse complement if needed
+                if ( strand != None ) and ( ref.strand != strand ): 
+                    sliced = sliced.reverse_complement()
+                # Write the block
+                out.write( sliced )
+        else:
+            for block in blocks:
+                out.write( block )
+        if dir:
+            out.close()
+    # Close output MAF
+    out.close()
+    index.close()
+
+if __name__ == "__main__": 
+    main()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/wiggle_to_array_tree.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/wiggle_to_array_tree.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/wiggle_to_array_tree.py (revision 3)
@@ -0,0 +1,37 @@
+#!/usr/bin/python2.6
+
+"""
+Read data in UCSC wiggle format and write it to an "array tree" file.
+
+usage: %prog array_length output.array_tree < input.wig
+"""
+
+from __future__ import division
+
+import sys
+
+from bx.arrays.array_tree import *
+from bx.arrays.wiggle import WiggleReader
+
+def main():
+   
+    sizes_fname = sys.argv[1]
+    out_fname = sys.argv[2]
+    
+    sizes = {}
+    for line in open( sizes_fname ):
+        fields = line.split()
+        sizes[ fields[0] ] = int( fields[1] )
+    
+    # Fill array from wiggle
+    d = array_tree_dict_from_reader( WiggleReader( sys.stdin ), sizes )
+    
+    for value in d.itervalues():
+        value.root.build_summary()
+    
+    f = open( out_fname, "w" )
+    FileArrayTreeDict.dict_to_file( d, f )
+    f.close()
+
+if __name__ == "__main__": 
+    main()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/mMK_bitset.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/mMK_bitset.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/mMK_bitset.py (revision 3)
@@ -0,0 +1,150 @@
+#!/usr/bin/python2.6
+
+import sys
+
+import bx.align.maf
+import bx.bitset
+from bx.bitset_builders import *
+from itertools import *
+from optparse import OptionParser
+from rpy import *
+
+def main():
+
+	# Parse the command line
+	parser = OptionParser(usage = "usage: %prog [options] maf_file snp_file neutral_file window_size step_size") 
+	
+	parser.add_option("-o", "--outfile", help = "Specify file for output")
+	
+	parser.add_option("-s", "--species", type = "string", default = "panTro2")
+	
+	parser.add_option("-b", "--build", type = "string", default = "hg18")
+	
+	(options, args) = parser.parse_args()
+
+	if len(args) != 5:
+		parser.error("Incorrect number of arguments")
+	else:
+		maf_filename = args[0]
+		snp_filename = args[1]
+		neutral_filename = args[2]
+		window_size = int(args[3])
+		step_size = int(args[4])
+		
+	if options.outfile != None:
+		out_file = open(options.outfile, 'w')
+		
+	#Generate snp and neutral bitsets
+	AR_snp_bitsets = binned_bitsets_from_file(open(snp_filename))
+	neutral_bitsets = binned_bitsets_from_file(open(neutral_filename))
+
+	# Generate divergence bitset from maf file
+	AR_div_bitsets = dict()
+	chr_lens = dict()
+	reader = bx.align.maf.Reader( open (maf_filename) )
+	
+	for block in reader:
+		comp1 = block.get_component_by_src_start( options.build )
+		comp2 = block.get_component_by_src_start( options.species )
+		
+		if comp1 is None or comp2 is None:
+			continue
+			
+		# Chromosome, start, and stop of reference species alignment
+		chr = comp1.src.split( '.' )[1]
+		start = comp1.start
+		end = comp1.end
+		
+		# Get or create bitset for this chromosome
+		if chr in AR_div_bitsets:
+			bitset = AR_div_bitsets[chr]
+		else:
+			bitset = AR_div_bitsets[chr] = bx.bitset.BinnedBitSet()
+			chr_lens[chr] = comp1.get_src_size()
+			
+		# Iterate over text and set diverged bit
+		pos = start
+		for ch1, ch2 in izip( comp1.text.upper(), comp2.text.upper() ):
+			if ch1 == '-': continue
+			if ch2 == '-':
+				pos += 1
+				continue
+			
+			if ch1 != ch2 and not AR_snp_bitsets[chr][pos]:
+				bitset.set( pos )
+			pos += 1
+			
+	# Debugging Code
+# 	for chr in AR_div_bitsets:
+# 		for pos in range(0, AR_div_bitsets[chr].size):
+# 			if AR_div_bitsets[pos]:
+# 				print >> sys.stderr, chr, pos, pos+1
+	
+	# Copy div and snp bitsets
+	nonAR_snp_bitsets = dict()
+	for chr in AR_snp_bitsets:
+		nonAR_snp_bitsets[chr] = bx.bitset.BinnedBitSet()
+		nonAR_snp_bitsets[chr].ior(AR_snp_bitsets[chr])
+		
+	nonAR_div_bitsets = dict()
+	for chr in AR_div_bitsets:
+		nonAR_div_bitsets[chr] = bx.bitset.BinnedBitSet()
+		nonAR_div_bitsets[chr].ior(AR_div_bitsets[chr])
+	
+	# Generates AR snps by intersecting with neutral intervals
+	for chr in AR_snp_bitsets:
+		AR_snp_bitsets[chr].iand(neutral_bitsets[chr])
+	
+	# Generates AR divs by intersecting with neutral intervals	
+	for chr in AR_div_bitsets:
+		AR_div_bitsets[chr].iand(neutral_bitsets[chr])
+
+	# Inverts the neutral intervals so now represents nonAR
+	for chr in neutral_bitsets:
+		neutral_bitsets[chr].invert()
+	
+	# Generates nonAR snps by intersecting with masked neutral intervals	
+	for chr in nonAR_snp_bitsets:
+		nonAR_snp_bitsets[chr].iand(neutral_bitsets[chr])
+	# Generates nonAR divs by intersecting with masked neutral intervals		
+	for chr in nonAR_div_bitsets:
+		nonAR_div_bitsets[chr].iand(neutral_bitsets[chr])
+
+	for chr in AR_div_bitsets:
+		for window in range(0, chr_lens[chr] - window_size, step_size):
+# 			neutral_size = neutral_bitsets[chr].count_range(window, window_size)
+# 			if neutral_size < 9200: continue
+			AR_snp = AR_snp_bitsets[chr].count_range(window, window_size)
+			AR_div = AR_div_bitsets[chr].count_range(window, window_size)
+			nonAR_snp = nonAR_snp_bitsets[chr].count_range(window, window_size)
+			nonAR_div = nonAR_div_bitsets[chr].count_range(window, window_size)
+			
+			if nonAR_snp >= 6 and nonAR_div >= 6 and AR_snp >= 6 and AR_div >= 6:
+				MK_pval = MK_chi_pvalue(nonAR_snp, nonAR_div, AR_snp, AR_div)
+			else:
+				MK_pval = MK_fisher_pvalue(nonAR_snp, nonAR_div, AR_snp, AR_div)
+				
+			if options.outfile != None:
+				out_file.write("%s\t%d\t%d\t%d\t%d\t%d\t%d\t%1.15f\n" % (chr, window, window+window_size, nonAR_snp, nonAR_div, AR_snp, AR_div, MK_pval))
+			else:
+				print "%s\t%d\t%d\t%d\t%d\t%d\t%d\t%1.15f" % (chr, window, window+window_size, nonAR_snp, nonAR_div, AR_snp, AR_div, MK_pval)
+	
+	if options.outfile != None:
+		out_file.close()
+			
+def MK_fisher_pvalue(win_snp, win_div, AR_snp, AR_div):
+
+	if win_snp == 0 and win_div == 0 and AR_snp == 0 and AR_div == 0:
+		return 1.0
+	
+	fisher_result = r.fisher_test(r.matrix(r.c([win_snp, win_div, AR_snp, AR_div]), nr = 2))
+	
+	return fisher_result['p.value']
+
+def MK_chi_pvalue(win_snp, win_div, AR_snp, AR_div):
+	
+	chi_result = r.chisq_test(r.matrix(r.c([win_snp, win_div, AR_snp, AR_div]), nr = 2))
+	
+	return chi_result['p.value']
+
+main() 
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/axt_to_lav.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/axt_to_lav.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/axt_to_lav.py (revision 3)
@@ -0,0 +1,158 @@
+#!/usr/bin/python2.6
+
+"""
+Application to convert AXT file to LAV file. Reads an AXT file from standard 
+input and writes a LAV file to standard out; some statistics are written to 
+standard error.
+
+usage: %prog primary_spec secondary_spec [--silent] < axt_file > lav_file
+
+Each spec is of the form seq_file[:species_name]:lengths_file.
+
+- seq_file should be a format string for the file names for the individual
+  sequences, with %s to be replaced by the alignment's src field.  For 
+  example, "hg18/%s.nib" would prescribe files named "hg18/chr1.nib", 
+  "hg18/chr2.nib", etc.
+
+- species_name is optional.  If present, it is prepended to the alignment's 
+  src field.
+
+- Lengths files provide the length of each chromosome (lav format needs this
+  information but axt file does not contain it).  The format is a series of
+  lines of the form:
+
+  <chromosome name> <length>
+
+  The chromosome field in each axt block must match some <chromosome name> in
+  the lengths file.
+"""
+
+__author__ = "Bob Harris (rsharris@bx.psu.edu)"
+
+import sys
+import copy
+import bx.align.axt
+import bx.align.lav
+
+
+def usage(s=None):
+	message = __doc__
+	if (s == None): sys.exit (message)
+	else:           sys.exit ("%s\n%s" % (s,message))
+
+
+def main():
+	global debug
+
+	# parse the command line
+
+	primary   = None
+	secondary = None
+	silent    = False
+
+	# pick off options
+
+	args = sys.argv[1:]
+	while (len(args) > 0):
+		arg = args.pop(0)
+		val = None
+		fields = arg.split("=",1)
+		if (len(fields) == 2):
+			arg = fields[0]
+			val = fields[1]
+			if (val == ""):
+				usage("missing a value in %s=" % arg)
+
+		if (arg == "--silent") and (val == None):
+			silent = True
+		elif (primary == None) and (val == None):
+			primary = arg
+		elif (secondary == None) and (val == None):
+			secondary = arg
+		else:
+			usage("unknown argument: %s" % arg)
+
+	if (primary == None):
+		usage("missing primary file name and length")
+
+	if (secondary == None):
+		usage("missing secondary file name and length")
+
+	try:
+		(primaryFile,primary,primaryLengths) = parse_spec(primary)
+	except:
+		usage("bad primary spec (must be seq_file[:species_name]:lengths_file")
+
+	try:
+		(secondaryFile,secondary,secondaryLengths) = parse_spec(secondary)
+	except:
+		usage("bad secondary spec (must be seq_file[:species_name]:lengths_file")
+
+	# read the lengths
+
+	speciesToLengths = {}
+	speciesToLengths[primary]   = read_lengths (primaryLengths)
+	speciesToLengths[secondary] = read_lengths (secondaryLengths)
+
+	# read the alignments
+
+	out = bx.align.lav.Writer(sys.stdout, \
+			attributes = { "name_format_1" : primaryFile,
+			               "name_format_2" : secondaryFile })
+
+	axtsRead = 0
+	axtsWritten = 0
+	for axtBlock in bx.align.axt.Reader(sys.stdin, \
+			species_to_lengths = speciesToLengths,
+			species1           = primary,
+			species2           = secondary,
+			support_ids        = True):
+		axtsRead += 1
+		out.write (axtBlock)
+		axtsWritten += 1
+
+	out.close()
+
+	if (not silent):
+		sys.stderr.write ("%d blocks read, %d written\n" % (axtsRead,axtsWritten))
+
+def parse_spec(spec): # returns (seq_file,species_name,lengths_file)
+	fields = spec.split(":")
+	if   (len(fields) == 2): return (fields[0],"",fields[1])
+	elif (len(fields) == 3): return (fields[0],fields[1],fields[2])
+	else:                    raise ValueError
+
+def read_lengths (fileName):
+
+	chromToLength = {}
+
+	f = file (fileName, "r")
+
+	for lineNumber,line in enumerate(f):
+		line = line.strip()
+		if (line == ""): continue
+		if (line.startswith("#")): continue
+
+		fields = line.split ()
+		if (len(fields) != 2):
+			raise "bad lengths line (%s:%d): %s" % (fileName,lineNumber,line)
+
+		chrom = fields[0]
+		try:
+			length = int(fields[1])
+		except:
+			raise "bad lengths line (%s:%d): %s" % (fileName,lineNumber,line)
+
+		if (chrom in chromToLength):
+			raise "%s appears more than once (%s:%d): %s" \
+			    % (chrom,fileName,lineNumber)
+
+		chromToLength[chrom] = length
+
+	f.close ()
+
+	return chromToLength
+
+
+if __name__ == "__main__": main()
+
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/one_field_per_line.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/one_field_per_line.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/one_field_per_line.py (revision 3)
@@ -0,0 +1,14 @@
+#!/usr/bin/python2.6
+
+"""
+Read a file from stdin, split each line and write fields one per line to 
+stdout.
+
+TODO: is this really that useful?
+"""
+
+import sys
+
+for line in sys.stdin:
+    for field in line.split():
+        print field
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/interval_count_intersections.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/interval_count_intersections.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/interval_count_intersections.py (revision 3)
@@ -0,0 +1,50 @@
+#!/usr/bin/python2.6
+
+"""
+Read two lists of intervals (with chromosomes) and count the number of entries
+in the second set that intersect any entry in the first set.
+
+TODO: This could use bitsets rather than the intervals package, would it be
+      faster?
+
+usage: %prog bed1 bed2 > out
+"""
+
+from __future__ import division
+
+import psyco_full
+
+from bx import intervals
+from bx import misc
+import string
+import sys
+
+def main():
+
+    intersecters = {}
+
+    # Read ranges
+
+    for chr, start, end in read_intervals( misc.open_compressed( sys.argv[1] ) ):
+        if not intersecters.has_key( chr ): intersecters[ chr ] = intervals.Intersecter()
+        intersecters[ chr ].add_interval( intervals.Interval( start, end ) )
+
+    # Count intersection
+
+    total = 0
+
+    for chr, start, end in read_intervals( misc.open_compressed( sys.argv[2] ) ):
+        if intersecters.has_key( chr ):
+            intersection = intersecters[ chr ].find( start, end )
+            if intersection: 
+                #print chr, intersection
+                total += 1
+
+    print total
+
+def read_intervals( input ):
+    for line in input:
+        fields = line.split()
+        yield fields[0], int( fields[1] ), int( fields[2] )
+
+main()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_truncate.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_truncate.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_truncate.py (revision 3)
@@ -0,0 +1,40 @@
+#!/usr/bin/python2.6
+
+"""
+Pass through blocks from a maf file until a certain number of columns
+have been passed.
+
+usage: %prog -c cols < maf > maf
+"""
+
+import sys
+
+from bx.align import maf
+from optparse import OptionParser
+
+def __main__():
+
+    # Parse command line arguments
+
+    parser = OptionParser()
+    parser.add_option( "-c", "--cols",  action="store" )
+
+    ( options, args ) = parser.parse_args()
+
+    maf_reader = maf.Reader( sys.stdin )
+    maf_writer = maf.Writer( sys.stdout )
+
+    if not options.cols: raise "Cols argument is required"
+    cols = int( options.cols )
+
+    count = 0
+
+    for m in maf_reader:
+
+        maf_writer.write( m )
+
+        count += m.text_size
+
+        if count >= cols: return        
+
+if __name__ == "__main__": __main__()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_build_index.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_build_index.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_build_index.py (revision 3)
@@ -0,0 +1,83 @@
+#!/usr/bin/python2.6
+
+"""
+Build an index file for a set of MAF alignment blocks.
+
+If index_file is not provided maf_file.index is used.
+
+usage: %prog maf_file index_file
+    -s, --species=a,b,c: only index the position of the block in the listed species
+"""
+
+import psyco_full
+
+from bx.cookbook import doc_optparse
+
+import sys
+import os.path
+
+from bx import interval_index_file
+import bx.align.maf
+from bx.misc.seekbzip2 import SeekableBzip2File
+
+def main():
+
+    # Parse command line
+
+    options, args = doc_optparse.parse( __doc__ )
+
+    try:
+        maf_file = args[0]
+        # If it appears to be a bz2 file, attempt to open with table
+        if maf_file.endswith( ".bz2" ):
+            table_file = maf_file + "t"
+            if not os.path.exists( table_file ):
+                doc_optparse.exit( "To index bz2 compressed files first "
+                                   "create a bz2t file with bzip-table." )
+            # Open with SeekableBzip2File so we have tell support
+            maf_in = SeekableBzip2File( maf_file, table_file )
+            # Strip .bz2 from the filename before adding ".index"
+            maf_file = maf_file[:-4]
+        elif maf_file.endswith( ".lzo" ):
+            from bx.misc.seeklzop import SeekableLzopFile
+            table_file = maf_file + "t"
+            if not os.path.exists( table_file ):
+                doc_optparse.exit( "To index lzo compressed files first "
+                                   "create a lzot file with lzop_build_offset_table." )
+            # Open with SeekableBzip2File so we have tell support
+            maf_in = SeekableLzopFile( maf_file, table_file )
+            # Strip .lzo from the filename before adding ".index"
+            maf_file = maf_file[:-4]
+        else:
+            maf_in = open( maf_file )
+        # Determine the name of the index file
+        if len( args ) > 1: 
+            index_file = args[1]
+        else: 
+            index_file = maf_file + ".index" 
+        if options.species:
+            species = options.species.split( "," )
+        else:
+            species = None
+    except:
+        doc_optparse.exception()
+
+    maf_reader = bx.align.maf.Reader( maf_in )
+
+    indexes = interval_index_file.Indexes()
+
+    # Need to be a bit tricky in our iteration here to get the 'tells' right
+    while 1:
+        pos = maf_reader.file.tell()
+        block = maf_reader.next()
+        if block is None: break
+        for c in block.components:
+            if species is not None and c.src.split('.')[0] not in species:
+                continue
+            indexes.add( c.src, c.forward_strand_start, c.forward_strand_end, pos, max=c.src_size )
+
+    out = open( index_file, 'w' )
+    indexes.write( out )
+    out.close()
+
+if __name__ == "__main__": main()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_to_concat_fasta.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_to_concat_fasta.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_to_concat_fasta.py (revision 3)
@@ -0,0 +1,61 @@
+#!/usr/bin/python2.6
+
+"""
+Read a maf and print the text as a fasta file, concatenating blocks. A 
+specific subset of species can be chosen. 
+
+usage %prog [options] species1,species2,... < maf_file > fasta_file
+    --fill="expression": Insert this between blocks
+    --wrap=columns: Wrap FASTA to this many columns
+"""
+
+from optparse import OptionParser
+
+import textwrap
+import sys
+from bx.align import maf
+
+def __main__():
+    # Parse command line arguments
+
+    parser = OptionParser()
+    parser.add_option( "--fill", action="store", default=None, type="string", help="" )
+    parser.add_option( "--wrap", action="store", default=None, type="int", help="" )
+    parser.add_option( "--nowrap", action="store_true", default=False, dest="nowrap", help="" )
+
+    ( options, args ) = parser.parse_args()
+
+    species = []
+    for arg in args: species.extend(arg.split(','))
+
+    fill = ""
+    if options.fill: fill = eval( options.fill )
+
+    wrap = 50
+    if   (options.wrap != None): wrap = options.wrap
+    elif (options.nowrap):       wrap = 0
+
+    # create the concatenated sequences
+
+    texts = {}
+    for s in species: texts[s] = []
+    maf_reader = maf.Reader( sys.stdin )
+    for m in maf_reader:
+        for s in species:
+            c = m.get_component_by_src_start( s ) 
+            if c: texts[s].append( c.text )
+            else: texts[s].append( "-" * m.text_size )
+    for s in species:
+        print ">" + s
+        print_n( fill.join( texts[s] ), wrap )
+
+def print_n( s, n, f = sys.stdout ):
+    if (n <= 0):
+        print >> f, s
+    else:
+        p = 0
+        while p < len( s ):
+            print >> f, s[p:min(p+n,len(s))]
+            p += n
+
+if __name__ == "__main__": __main__()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_div_sites.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_div_sites.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_div_sites.py (revision 3)
@@ -0,0 +1,55 @@
+#!/usr/bin/python2.6
+"""
+Create a bed file listing all the divergent sites between two specific species 
+in a maf.
+
+usage: %prog maf_file reference_species_name other_species_name
+"""
+
+import sys
+import bx.align.maf
+import bx.bitset
+from bx.bitset_builders import *
+from itertools import *
+
+def main():
+	bitsets = {}
+	maf = sys.argv[1]
+	reference_sp, other_sp = sys.argv[2], sys.argv[3]
+
+	for block in bx.align.maf.Reader( open(maf) ):
+		ref = block.get_component_by_src_start( reference_sp )
+		other = block.get_component_by_src_start( other_sp )
+
+		if not ref or not other: continue
+		ref_chrom = ref.src.split( '.' )[1]
+		ref_start = ref.start
+		ref_end = ref.end
+		chrom_size = ref.get_src_size()
+
+		if ref_chrom not in bitsets: bitsets[ ref_chrom ] = bx.bitset.BinnedBitSet( chrom_size )
+
+		pos = ref_start
+		for i,j in izip( ref.text.upper(), other.text.upper() ):
+			if i != '-':
+				if i != j: # mismatch
+					if i != 'N' and j != 'N' and j != '-': 
+						# set if all valid chars
+						bitsets[ ref_chrom ].set( pos )
+				pos += 1
+
+	
+	# bits --> bed file
+	for chrom in bitsets:
+		bits = bitsets[chrom]
+		end = 0
+		while 1:
+			start = bits.next_set( end )
+			if start == bits.size: break
+			end = bits.next_clear( start )
+			print "%s\t%d\t%d" % ( chrom, start, end )
+
+
+main()
+
+
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_limit_to_species.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_limit_to_species.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_limit_to_species.py (revision 3)
@@ -0,0 +1,40 @@
+#!/usr/bin/python2.6
+
+"""
+Read a maf file from stdin and write out a new maf with only blocks having all
+of the required in species, after dropping any other species and removing
+columns containing only gaps.
+
+usage: %prog species,species2,... < maf
+"""
+
+import psyco_full
+
+import bx.align.maf
+import copy
+import sys
+
+from itertools import *
+
+def main():
+
+    species = sys.argv[1].split( ',' )
+
+    maf_reader = bx.align.maf.Reader( sys.stdin )
+    maf_writer = bx.align.maf.Writer( sys.stdout )
+
+    for m in maf_reader:        
+        new_components = []    
+        for comp in m.components:
+            if comp.src.split( '.' )[0] in species:
+                new_components.append( comp )
+        m.components = new_components
+        m.remove_all_gap_columns()
+        if len( m.components ) > 1:
+            maf_writer.write( m )
+        
+    maf_reader.close()
+    maf_writer.close()
+
+if __name__ == "__main__": 
+    main()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_split_by_src.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_split_by_src.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_split_by_src.py (revision 3)
@@ -0,0 +1,60 @@
+#!/usr/bin/python2.6
+
+"""
+Read a MAF from stdin and break into several mafs based on the source of 
+each block. If the `component` option is provided then only that component
+will be used to determine the new file for each block, otherwise the src
+for *all* components will be used.
+
+TODO: Should be able to specify component by species/prefix?
+
+usage: %prog [options] < maf
+    -o, --outprefix: prepend this to the name of each generate maf
+    -c, --component: use only this component (by index!) to split
+"""
+
+import sys, string
+import bx.align.maf
+from optparse import OptionParser
+
+import psyco_full
+
+INF="inf"
+
+def __main__():
+
+    # Parse command line arguments
+
+    parser = OptionParser()
+    parser.add_option( "-o", "--outprefix", action="store", default="" )
+    parser.add_option( "-c", "--component", action="store", default=None )
+    ( options, args ) = parser.parse_args()
+
+    out_prefix = options.outprefix
+    comp = options.component
+    if comp is not None:
+       comp = int( comp )
+
+    maf_reader = bx.align.maf.Reader( sys.stdin )
+
+    writers = {}
+
+    for m in maf_reader:
+       
+        if comp is None: 
+            writer_key = string.join( [ c.src for c in m.components ], '_' )
+        else:
+            writer_key = m.components[ comp ].src
+
+        if not writers.has_key( writer_key ):
+            writer = bx.align.maf.Writer( file( "%s%s.maf" % ( out_prefix, writer_key ), "w" ) )
+            writers[ writer_key ] = writer
+        else:
+            writer = writers[ writer_key ] 
+
+        writer.write( m )
+
+    for key in writers:
+        writers[ key ].close()
+
+if __name__ == "__main__": __main__()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_tile.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_tile.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_tile.py (revision 3)
@@ -0,0 +1,138 @@
+#!/usr/bin/python2.6
+
+"""
+'Tile' the blocks of a maf file over each of a set of intervals. The
+highest scoring block that covers any part of a region will be used, and 
+pieces not covered by any block filled with "-" or optionally "*". The list
+of species to tile is specified by `tree` (either a tree or just a comma
+separated list). The `seq_db` is a lookup table mapping chromosome names
+to nib file for filling in the reference species. Maf files must be indexed.
+
+NOTE: See maf_tile_2.py for a more sophisticated version of this program, I
+      think this one will be eliminated in the future. 
+
+usage: %prog tree maf_files...
+    -m, --missingData: Inserts wildcards for missing block rows instead of '-'
+"""
+
+import psyco_full
+
+from bx.cookbook import doc_optparse
+
+import bx.align.maf
+import bx.align as align
+from bx import misc
+import bx.seq.nib
+import os
+import string
+import sys
+
+tree_tx = string.maketrans( "(),", "   " )
+
+def main():
+
+    options, args = doc_optparse.parse( __doc__ )
+    try:
+        sources = args[0].translate( tree_tx ).split()
+        seq_db = load_seq_db( args[1] )
+        index = bx.align.maf.MultiIndexed( args[2:] )
+
+        out = bx.align.maf.Writer( sys.stdout )
+        missing_data = bool(options.missingData)
+    except:
+        doc_optparse.exception()
+
+    for line in sys.stdin:
+        ref_src, start, end = line.split()[0:3]
+        do_interval( sources, index, out, ref_src, int( start ), int( end ), seq_db, missing_data )
+
+    out.close()
+
+def load_seq_db( fname ):
+    db = {}
+    for line in open( fname ):
+        fields = line.split(',')
+        src = fields[1] + "." + fields[2]
+        seq = fields[4]
+        db[src]=seq.strip()
+    return db
+
+def do_interval( sources, index, out, ref_src, start, end, seq_db, missing_data ):
+
+    assert sources[0].split('.')[0] == ref_src.split('.')[0], "%s != %s" % ( sources[0].split('.')[0], ref_src.split('.')[0] )
+
+    base_len = end - start
+        
+    blocks = index.get( ref_src, start, end )
+    # From low to high score
+    blocks.sort( lambda a, b: cmp( a.score, b.score ) )
+
+    mask = [ -1 ] * base_len
+
+    # print len( blocks )
+    # print blocks[0]
+    
+    ref_src_size = None
+    for i, block in enumerate( blocks ):
+        ref = block.get_component_by_src_start( ref_src )
+        ref_src_size = ref.src_size
+        assert ref.strand == "+"
+        slice_start = max( start, ref.start )
+        slice_end = min( end, ref.end )
+        for j in range( slice_start, slice_end ):
+            mask[j-start] = i
+
+    #print >>sys.stderr, mask
+
+    tiled = []
+    for i in range( len( sources ) ): tiled.append( [] )
+
+    for ss, ee, index in intervals_from_mask( mask ):
+        if index < 0:
+            tiled[0].append( bx.seq.nib.NibFile( open( seq_db[ ref_src ] ) ).get( start+ss, ee-ss ) )
+            for row in tiled[1:]:
+                if missing_data: 
+                    row.append( "*" * ( ee - ss ) )
+                else: 
+                    row.append( "-" * ( ee - ss ) )
+        else:
+            slice_start = start + ss
+            slice_end = start + ee
+            block = blocks[index]
+            ref = block.get_component_by_src_start( ref_src )
+            sliced = block.slice_by_component( ref, slice_start, slice_end ) 
+            sliced = sliced.limit_to_species( sources )
+            sliced.remove_all_gap_columns()
+            for i, src in enumerate( sources ):
+                comp = sliced.get_component_by_src_start( src )
+                if comp:
+                    tiled[i].append( comp.text )
+                else:
+                    if missing_data: tiled[i].append( "*" * sliced.text_size )
+                    else: tiled[i].append( "-" * sliced.text_size )
+        
+    a = align.Alignment()
+    for i, name in enumerate( sources ):
+        text = "".join( tiled[i] )
+        size = len( text ) - text.count( "-" )
+        if i == 0:
+            if ref_src_size is None: ref_src_size = bx.seq.nib.NibFile( open( seq_db[ ref_src ] ) ).length
+            c = align.Component( ref_src, start, end-start, "+", ref_src_size, text )
+        else:
+            c = align.Component( name + ".fake", 0, size, "?", size, text )
+        a.add_component( c )
+
+    out.write( a )
+
+
+def intervals_from_mask( mask ):
+    start = 0
+    last = mask[0]
+    for i in range( 1, len( mask ) ):
+        if mask[i] != last:
+            yield start, i, last
+            start = i
+            last = mask[i]
+    yield start, len(mask), last
+
+main()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/axt_to_maf.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/axt_to_maf.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/axt_to_maf.py (revision 3)
@@ -0,0 +1,161 @@
+#!/usr/bin/python2.6
+
+"""
+Application to convert AXT file to MAF file. Reads an AXT file from standard 
+input and writes a MAF file to standard out;  some statistics are written to 
+standard error.
+
+axt_to_maf primary:lengths_file secondary:lengths_file < axt_file > maf_file
+  --silent: prevents stats report
+  
+  Lengths files provide the length of each chromosome (maf format needs this
+  information but axt file does not contain it).  The format is a series of
+  lines of the form:
+  
+    <chromosome name> <length>
+  
+  The chromosome field in each axt block must match some <chromosome name> in
+  the lengths file.
+"""
+
+__author__ = "Bob Harris (rsharris@bx.psu.edu)"
+
+import sys
+import copy
+import bx.align.axt
+import bx.align.maf
+
+def usage(s=None):
+	message = __doc__
+	if (s == None): sys.exit (message)
+	else:           sys.exit ("%s\n%s" % (s,message))
+
+
+def main():
+	global debug
+
+	##########
+	# parse the command line
+	##########
+
+	primary   = None
+	secondary = None
+	silent    = False
+
+	# pick off options
+
+	args = sys.argv[1:]
+	while (len(args) > 0):
+		arg = args.pop(0)
+		val = None
+		fields = arg.split("=",1)
+		if (len(fields) == 2):
+			arg = fields[0]
+			val = fields[1]
+			if (val == ""):
+				usage("missing a value in %s=" % arg)
+
+		if (arg == "--silent") and (val == None):
+			silent = True
+		elif (primary == None) and (val == None):
+			primary = arg
+		elif (secondary == None) and (val == None):
+			secondary = arg
+		else:
+			usage("unknown argument: %s" % arg)
+
+	if (primary == None):
+		usage("missing primary species")
+
+	if (secondary == None):
+		usage("missing secondary species")
+
+	fields = primary.split(":")
+	if (len(fields) != 2):
+		usage("bad primary species (must be species:lengths_file")
+	primary = fields[0]
+	primaryLengths = fields[1]
+
+	fields = secondary.split(":")
+	if (len(fields) != 2):
+		usage("bad secondary species (must be species:lengths_file")
+	secondary = fields[0]
+	secondaryLengths = fields[1]
+
+	##########
+	# read the lengths
+	##########
+
+	speciesToLengths = {}
+	speciesToLengths[primary]   = read_lengths (primaryLengths)
+	speciesToLengths[secondary] = read_lengths (secondaryLengths)
+
+	##########
+	# read the alignments
+	##########
+
+	out = bx.align.maf.Writer(sys.stdout)
+
+	axtsRead = 0
+	axtsWritten = 0
+	for axtBlock in bx.align.axt.Reader(sys.stdin,\
+			species_to_lengths = speciesToLengths,
+			species1           = primary,
+			species2           = secondary):
+		axtsRead += 1
+
+		p = axtBlock.get_component_by_src_start(primary)
+		if (p == None): continue
+		s = axtBlock.get_component_by_src_start(secondary)
+		if (s == None): continue
+
+		mafBlock = bx.align.Alignment (axtBlock.score, axtBlock.attributes)
+		mafBlock.add_component (clone_component(p))
+		mafBlock.add_component (clone_component(s))
+
+		out.write (mafBlock)
+		axtsWritten += 1
+
+	if (not silent):
+		sys.stderr.write ("%d blocks read, %d written\n" % (axtsRead,axtsWritten))
+
+
+def clone_component(c):
+	return bx.align.Component (c.src, c.start, c.size, c.strand, c.src_size, \
+	                           copy.copy(c.text))
+
+
+def read_lengths (fileName):
+
+	chromToLength = {}
+
+	f = file (fileName, "r")
+
+	for lineNumber,line in enumerate(f):
+		line = line.strip()
+		if (line == ""): continue
+		if (line.startswith("#")): continue
+
+		fields = line.split ()
+		if (len(fields) != 2):
+			raise "bad lengths line (%s:%d): %s" % (fileName,lineNumber,line)
+
+		chrom = fields[0]
+		try:
+			length = int(fields[1])
+		except:
+			raise "bad lengths line (%s:%d): %s" % (fileName,lineNumber,line)
+
+		if (chrom in chromToLength):
+			raise "%s appears more than once (%s:%d): %s" \
+			    % (chrom,fileName,lineNumber)
+
+		chromToLength[chrom] = length
+
+	f.close ()
+
+	return chromToLength
+
+
+if __name__ == "__main__": main()
+
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_col_counts_all.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_col_counts_all.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_col_counts_all.py (revision 3)
@@ -0,0 +1,64 @@
+#!/usr/bin/python2.6
+
+"""
+For every column that occurs in a multiple alignment print the column
+and the number of times it occurs (one column/count per line, tab
+separated), sorted by count descending.
+
+This version allows special handling of the 'wildcard' symbol in alignments.
+
+Note: all blocks must have exactly the same number of species.
+
+usage: %prog [options] < maf > column_counts
+    -w, --wildcard: include wildcards
+    -m, --maxwildcards=N: only allow N missing species
+"""
+
+import bx.align.maf
+import sys
+from bx.cookbook import doc_optparse, cross_lists
+
+from itertools import *
+
+counts = {}
+
+nspecies = None
+
+for block in bx.align.maf.Reader( sys.stdin ):
+    # Ensure all blocks have the same number of rows
+    if nspecies: assert len( block.components ) == nspecies
+    else: nspecies = len( block.components )
+    # Increment count for each column
+    for col in izip( * [ iter( comp.text.upper() ) for comp in block.components ] ):
+        col = ''.join( col )
+        try: counts[ col ] += 1
+        except: counts[ col ] = 1
+
+# counts = [ ( value, key ) for key, value in counts.iteritems() ]
+# counts.sort()
+# counts.reverse()
+
+## for count, col in counts:
+##     print "".join(col), count
+
+options, args = doc_optparse.parse( __doc__ )
+
+wildcard = False
+if options.wildcard: 
+    wildcard = True
+    max_wildcard = nspecies - 1
+if options.maxwildcards:
+    wildcard = True
+    max_wildcard = int( options.maxwildcards ) 
+
+nucs = "ACGT-"
+if wildcard:
+    nucs += "*"
+
+for col in cross_lists( *( [ nucs ] * nspecies ) ):
+    col = ''.join( col )
+    if wildcard and col.count( "*" ) > max_wildcard:
+        continue
+    if col.count( "-" ) == nspecies:
+        continue
+    print col, counts.get( col, 0 )
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_col_counts.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_col_counts.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_col_counts.py (revision 3)
@@ -0,0 +1,38 @@
+#!/usr/bin/python2.6
+
+"""
+For every column that occurs in a multiple alignment print the column
+and the number of times it occurs (one column/count per line, tab
+separated), sorted by count descending.
+
+Note: all blocks must have exactly the same number of species.
+
+usage: %prog < maf > column_counts
+"""
+
+import bx.align.maf
+import sys
+
+from itertools import *
+
+counts = {}
+
+nspecies = None
+
+for block in bx.align.maf.Reader( sys.stdin ):
+    # Ensure all blocks have the same number of rows
+    if nspecies: assert len( block.components ) == nspecies
+    else: nspecies = len( block.components )
+    # Increment count for each column
+    for col in izip( * [ iter( comp.text.upper() ) for comp in block.components ] ):
+        try: counts[ col ] += 1
+        except: counts[ col ] = 1
+
+counts = [ ( value, key ) for key, value in counts.iteritems() ]
+counts.sort()
+counts.reverse()
+
+# print len( counts )
+
+for count, col in counts:
+    print "".join(col), count
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_mean_length_ungapped_piece.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_mean_length_ungapped_piece.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_mean_length_ungapped_piece.py (revision 3)
@@ -0,0 +1,34 @@
+#!/usr/bin/python2.6
+
+"""
+Read a MAF from standard input and determine the mean length of ungapped pieces
+in each block.
+
+usage: %prog < maf > out
+"""
+
+from __future__ import division
+
+import sys
+import bx.align.maf
+
+def main():
+    
+    for m in bx.align.maf.Reader( sys.stdin ):  
+    
+        ungapped_columns = 0
+        ungapped_runs = 0
+        in_ungapped = False
+        
+        for col in m.column_iter():
+            is_gap = ( '-' in col )
+            if not is_gap: ungapped_columns += 1
+            if in_ungapped and is_gap:
+                ungapped_runs += 1
+            in_ungapped = not is_gap
+        if in_ungapped: ungapped_runs += 1
+
+        print ungapped_columns / ungapped_runs
+
+
+if __name__ == "__main__": main()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_extract_ranges.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_extract_ranges.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_extract_ranges.py (revision 3)
@@ -0,0 +1,73 @@
+#!/usr/bin/python2.6
+
+"""
+Reads a list of intervals (start, stop) and a maf. Produces a new maf
+containing the blocks from the original that overlapped the intervals.
+
+NOTE: See maf_extract_ranges_indexed.py which works better / faster for many
+      use cases.
+
+NOTE: chromosome/src information in the MAF is ignored by this variant.
+
+usage: %prog interval_file refindex [options] < maf_file
+   -m, --mincols=10: Minimum length (columns) required for alignment to be output
+"""
+
+import psyco_full
+
+from bx.cookbook import doc_optparse
+
+import bx.align.maf
+from bx import intervals
+import sys
+
+
+def __main__():
+
+    # Parse Command Line
+
+    options, args = doc_optparse.parse( __doc__ )
+
+    try:
+        range_filename = args[ 0 ]
+        refindex = int( args[ 1 ] )
+        if options.mincols: mincols = int( options.mincols )
+        else: mincols = 10
+    except:
+        doc_optparse.exit()
+
+    # Load Intervals
+
+    intersecter = intervals.Intersecter()
+    for line in file( range_filename ):
+        fields = line.split()
+        intersecter.add_interval( intervals.Interval( int( fields[0] ), int( fields[1] ) ) )
+
+    # Start MAF on stdout
+
+    out = bx.align.maf.Writer( sys.stdout )
+
+    # Iterate over input MAF
+
+    for maf in bx.align.maf.Reader( sys.stdin ):
+        ref = maf.components[ refindex ]
+        # Find overlap with reference component
+        intersections = intersecter.find( ref.get_forward_strand_start(), ref.get_forward_strand_end() )
+        # Keep output maf ordered
+        intersections.sort()
+        # Write each intersecting block
+        for interval in intersections: 
+            start = max( interval.start, ref.get_forward_strand_start() )
+            end = min( interval.end, ref.get_forward_strand_end() )
+            sliced = maf.slice_by_component( refindex, start, end ) 
+            good = True
+            for c in sliced.components: 
+                if c.size < 1: 
+                    good = False
+            if good and sliced.text_size > mincols: out.write( sliced )
+         
+    # Close output MAF
+
+    out.close()
+
+if __name__ == "__main__": __main__()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/bed_intersect_basewise.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/bed_intersect_basewise.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/bed_intersect_basewise.py (revision 3)
@@ -0,0 +1,40 @@
+#!/usr/bin/python2.6
+
+"""
+Find regions of first bed file that overlap regions in a second bed file. This
+program performs a base-by-base intersection, so only runs of bases that are
+covered in both of the inputs will be output.
+
+usage: %prog bed_file_1 bed_file_2
+"""
+
+import sys
+from warnings import warn
+from bx.bitset import *
+from bx.bitset_builders import *
+from bx.cookbook import doc_optparse
+
+options, args = doc_optparse.parse( __doc__ )
+try:
+    in_fname, in2_fname = args
+except:
+    doc_optparse.exit()
+
+bits1 = binned_bitsets_from_file( open( in_fname ) )
+bits2 = binned_bitsets_from_file( open( in2_fname ) )
+
+bitsets = dict()
+
+for key in bits1:
+    if key in bits2:
+        bits1[key].iand( bits2[key] )
+        bitsets[key] = bits1[key]
+
+for chrom in bitsets:
+    bits = bitsets[chrom]
+    end = 0
+    while 1:
+        start = bits.next_set( end )
+        if start == bits.size: break
+        end = bits.next_clear( start )
+        print "%s\t%d\t%d" % ( chrom, start, end )
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/table_filter.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/table_filter.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/table_filter.py (revision 3)
@@ -0,0 +1,72 @@
+#!/usr/bin/python2.6
+
+"""
+Tool for filtering a tabular data file. Fields are separated by tabs, the 
+header line is denoted by a '#' in the first byte, comments are denoted by
+a '#' at the start of any subsequent line.
+
+Expressions can use column names as well as numbers. The -c options allows
+cutting, again using field name or numbers.
+
+usage: %prog expression < table 
+    -H, --header:       keep header in output
+    -C, --comments:     keep comments in output
+    --force-header:     assume the first line is a header even if it does not start with "#"
+    -c, --cols=1,2:     names or indexes of columns to keep
+"""
+
+import psyco_full
+
+import sys
+
+import sys
+import bx.tabular.io
+from bx.cookbook import doc_optparse
+
+def __main__():
+
+    # Parse command line arguments
+    options, args = doc_optparse.parse( __doc__ )
+    try:
+        keep_header = bool( options.header )
+        keep_comments = bool( options.comments )
+        cols = []
+        if options.cols:
+            for c in options.cols.split( ',' ):
+                try:
+                    v = int( c )
+                except:
+                    v = c
+                cols.append( c )
+        if len( args ) > 0:
+            expr = args[0]
+        else:
+            expr = None
+        if options.force_header:
+            force_header = bx.tabular.io.FIRST_LINE_IS_HEADER
+        else:
+            force_header = None
+    except:
+        doc_optparse.exception()
+
+    # Compile expression for SPEED
+    if expr: expr = compile( expr, '<expr arg>', 'eval' )
+
+    for element in bx.tabular.io.TableReader( sys.stdin, force_header=force_header ):
+        if type( element ) is bx.tabular.io.Header:
+            if keep_header: 
+                if cols:
+                    print "#" + "\t".join( element[c] for c in cols )
+                else:
+                    print element
+        elif type( element ) is bx.tabular.io.Comment:
+            if keep_comments: 
+                print element
+        else:
+            if expr is None or bool( eval( expr, dict( row=element ) ) ):
+                if cols:
+                    print "\t".join( [ element[c] for c in cols ] )
+                else:
+                    print element
+
+if __name__ == "__main__": __main__()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_print_scores.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_print_scores.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_print_scores.py (revision 3)
@@ -0,0 +1,57 @@
+#!/usr/bin/python2.6
+
+"""
+Read a MAF from standard input and print the score of each block. It can 
+optionally recalculate each score using the hox70 matrix, and normalize the 
+score by the number of columns in the alignment.
+
+TODO: Should be able to read an arbitrary scoring matrix.
+
+usage: %prog [options]
+   -r, --recalculate: don't use the score from the maf, recalculate (using hox70 matrix)
+   -l, --lnorm: divide (normalize) score by alignment text length
+"""
+
+from __future__ import division
+
+import sys
+from bx.cookbook import doc_optparse
+from bx.align import maf
+from bx.align import score
+from optparse import OptionParser
+
+def main():
+
+    # Parse command line arguments
+    options, args = doc_optparse.parse( __doc__ )
+
+    try:
+        lnorm = bool( options.lnorm )
+        recalculate = bool( options.recalculate )
+    except:
+        doc_optparse.exit()
+
+    hox70 = score.build_scoring_scheme( """  A    C    G    T
+                                      91 -114  -31 -123
+                                    -114  100 -125  -31
+                                     -31 -125  100 -114
+                                    -123  -31 -114   91 """, 400, 30, default=0 )
+
+    maf_reader = maf.Reader( sys.stdin )
+
+    for m in maf_reader: 
+        if m.text_size == 0:
+            print "NA"
+            continue
+        s = m.score
+        # Recalculate?
+        if recalculate:
+            s = hox70.score_alignment( m )
+        # Normalize?
+        if lnorm:
+            s = s / m.text_size
+        # Print
+        print s
+
+if __name__ == "__main__": 
+    main()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_percent_columns_matching.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_percent_columns_matching.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_percent_columns_matching.py (revision 3)
@@ -0,0 +1,38 @@
+#!/usr/bin/python2.6
+
+"""
+Read a PAIRWISE maf from stdin and print the fraction of columns whose bases 
+match for each alignment.
+
+TODO: generalize for more than two speceis.
+
+usage: %prog < maf > out
+"""
+
+from __future__ import division
+
+import sys
+
+import psyco_full
+
+from bx.align import maf
+
+
+def __main__():
+    
+    maf_reader = maf.Reader( sys.stdin )
+
+    for m in maf_reader:
+        match = 0
+        total = 0
+        for i in range( 0, m.text_size ):
+            a = m.components[0].text[i].lower() 
+            b = m.components[1].text[i].lower()            
+            if a == b:
+                match += 1
+            total += 1
+
+        print match / total
+
+
+if __name__ == "__main__": __main__()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_drop_overlapping.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_drop_overlapping.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_drop_overlapping.py (revision 3)
@@ -0,0 +1,56 @@
+#!/usr/bin/python2.6
+
+"""
+Remove any blocks from a maf that overlap any of a set of intervals.
+
+usage: %prog interval files... < maf
+"""
+
+import psyco_full
+
+from bx.cookbook import doc_optparse
+
+import bx.align.maf
+from bx import intervals
+import sys
+
+
+def __main__():
+
+    # Parse Command Line
+
+    options, args = doc_optparse.parse( __doc__ )
+
+    try:
+        assert len( args ) > 0
+    except:
+        doc_optparse.exit()
+
+    # Load Intervals
+
+    intersector = intervals.Intersecter()
+
+    for f in args:
+        for line in file( f ):
+            if line.startswith( "#" ) or line.isspace(): continue
+            fields = line.split()
+            intersector.add_interval( intervals.Interval( int( fields[0] ), int( fields[1] ) ) )
+
+    # Start MAF on stdout
+
+    out = bx.align.maf.Writer( sys.stdout )
+
+    # Iterate over input MAF
+
+    for maf in bx.align.maf.Reader( sys.stdin ):
+        # Find overlap with reference component
+        intersections = intersector.find( maf.components[0].start, maf.components[0].end )
+        # Write only if no overlap
+        if len( intersections ) == 0:
+            out.write( maf )
+         
+    # Close output MAF
+
+    out.close()
+
+if __name__ == "__main__": __main__()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/pretty_table.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/pretty_table.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/pretty_table.py (revision 3)
@@ -0,0 +1,44 @@
+#!/usr/bin/python2.6
+
+"""
+Read some whitespace separated data from stdin and pretty print it so that
+the columns line up.
+"""
+
+import sys
+
+def main():
+    pad = "\t"
+    align = None
+    if len( sys.argv ) > 1:
+        pad = " " * int( sys.argv[1] )
+    if len( sys.argv ) > 2:
+        align = sys.argv[2]
+    rows = [ line.split() for line in sys.stdin ]
+    print_tabular( rows, pad, align )
+
+def print_tabular( rows, pad, align=None ):
+    if len( rows ) == 0: return ""
+    lengths = [ len( col ) for col in rows[ 0 ] ]
+    for row in rows[1:]:
+        for i in range( 0, len( row ) ):
+            lengths[ i ] = max( lengths[ i ], len( row[ i ] ) )
+    rval = ""
+    #for i in range( len( rows[0] ) ):
+    #    if align and align[ i ] == "l":
+    #        rval += str( i ).ljust( lengths[ i ] )
+    #    else:
+    #        rval += str( i ).rjust( lengths[ i ] )
+    #    rval += pad 
+    #print rval   
+    for row in rows:
+        rval = ""
+        for i in range( 0, len( row ) ):
+            if align and align[ i ] == "l":
+                rval += row[ i ].ljust( lengths[ i ] )
+            else:
+                rval += row[ i ].rjust( lengths[ i ] )
+            rval += pad
+        print rval
+
+main()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_tile_2.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_tile_2.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_tile_2.py (revision 3)
@@ -0,0 +1,274 @@
+#!/usr/bin/python2.6
+
+"""
+'Tile' the blocks of a maf file over each of a set of intervals. The
+highest scoring block that covers any part of a region will be used, and 
+pieces not covered by any block filled with "-" or optionally "*". 
+
+This version uses synteny annotation if found on the alignment blocks, and
+will attempt to fill gaps with special characters depending on the type of
+gap, similar to the projected alignment display of the UCSC genome browser: 
+'*' for new, '=' for inverse/inset, '#' for contig, 'X' for missing. 
+
+- The list of species to tile is specified by the first argument (either a 
+  newick tree or just a comma separated list). 
+  
+- The `seq_db` is a lookup table mapping species and chromosome names
+  to nib file for filling in the reference species sequence. In this file
+  column 1 contains the species, column 2 the chromomsome or contig, and
+  column 4 the directory containing the sequences in nib format.
+  
+- The remaining arguments are a list of maf files which must have 
+  corresponding ".index" files.
+
+TODO: The seq_db format is specific to something old and obsure at PSU, 
+      need to standardize.
+
+usage: %prog list,of,species,to,keep seq_db_file indexed_maf_files ...
+    -m, --missingData: Inserts wildcards for missing block rows instead of '-'
+    -s, --strand:      Use strand information for intervals, reveres complement if '-'
+"""
+
+import psyco_full
+
+from cookbook import doc_optparse
+
+import operator
+
+import bx.align.maf as maf
+import bx.align as align
+from bx import misc
+import bx.seq.nib
+import os
+import string
+import sys
+
+tree_tx = string.maketrans( "(),", "   " )
+
+def main():
+
+    options, args = doc_optparse.parse( __doc__ )
+    try:
+        sources = args[0].translate( tree_tx ).split()
+        seq_db = load_seq_db( args[1] )
+        index = maf.MultiIndexed( args[2:] )
+
+        out = maf.Writer( sys.stdout )
+        missing_data = bool(options.missingData)
+        use_strand = bool(options.strand)
+    except:
+        doc_optparse.exception()
+
+    for line in sys.stdin:
+        fields = line.split()
+        ref_src, start, end = fields[0:3]
+        if use_strand and len( fields ) > 5:
+            strand = fields[5]
+        else:
+            strand = '+'
+        do_interval( sources, index, out, ref_src, int( start ), int( end ), seq_db, missing_data, strand )
+
+    out.close()
+
+def load_seq_db( fname ):
+    db = {}
+    for line in open( fname ):
+        fields = line.split(',')
+        src = fields[1] + "." + fields[2]
+        seq = fields[4]
+        db[src]=seq.strip()
+    return db
+    
+def get_fill_char( maf_status ):
+    """
+    Return the character that should be used to fill between blocks
+    having a given status
+    """
+    ## assert maf_status not in ( maf.MAF_CONTIG_NESTED_STATUS, maf.MAF_NEW_NESTED_STATUS, 
+    ##                            maf.MAF_MAYBE_NEW_NESTED_STATUS ), \
+    ##     "Nested rows do not make sense in a single coverage MAF (or do they?)"
+    if maf_status in ( maf.MAF_NEW_STATUS, maf.MAF_MAYBE_NEW_STATUS, 
+                       maf.MAF_NEW_NESTED_STATUS, maf.MAF_MAYBE_NEW_NESTED_STATUS ):
+        return "*"
+    elif maf_status in ( maf.MAF_INVERSE_STATUS, maf.MAF_INSERT_STATUS ):
+        return "="
+    elif maf_status in ( maf.MAF_CONTIG_STATUS, maf.MAF_CONTIG_NESTED_STATUS ):
+        return "#"
+    elif maf_status == maf.MAF_MISSING_STATUS:
+        return "X"
+    else:
+        raise "Unknwon maf status"
+        
+def guess_fill_char( left_comp, right_comp ):
+    """
+    For the case where there is no annotated synteny we will try to guess it
+    """
+    # No left component, obiously new
+    return "*"
+    # First check that the blocks have the same src (not just species) and 
+    # orientation
+    if ( left_comp.src == right_comp.src and left_comp.strand != right_comp.strand ): 
+        # Are they completely contiguous? Easy to call that a gap
+        if left_comp.end == right_comp.start: 
+            return "-"
+        # TODO: should be able to make some guesses about short insertions
+        # here
+    # All other cases we have no clue about
+    return "*" 
+        
+def remove_all_gap_columns( texts ):
+    """
+    Remove any columns containing only gaps from alignment texts
+    """
+    seqs = [ list( t ) for t in texts ]
+    i = 0
+    text_size = len( texts[0] )
+    while i < text_size:
+        all_gap = True
+        for seq in seqs:
+            if seq[i] not in ( '-', '#', '*', '=', 'X', '@' ): 
+                all_gap = False
+        if all_gap:
+            for seq in seqs: 
+                del seq[i]
+            text_size -= 1
+        else:
+            i += 1
+    return [ ''.join( s ) for s in seqs ]
+
+def do_interval( sources, index, out, ref_src, start, end, seq_db, missing_data, strand ):
+    """
+    Join together alignment blocks to create a semi human projected local 
+    alignment (small reference sequence deletions are kept as supported by 
+    the local alignment).
+    """
+    ref_src_size = None
+    # Make sure the reference component is also the first in the source list
+    assert sources[0].split('.')[0] == ref_src.split('.')[0], "%s != %s" \
+        % ( sources[0].split('.')[0], ref_src.split('.')[0] )
+    # Determine the overall length of the interval
+    base_len = end - start
+    # Counter for the last reference species base we have processed
+    last_stop = start
+    # Rows in maf blocks come in in arbitrary order, we'll convert things
+    # to the destred order of the tiled block
+    source_to_index = dict( ( name, i ) for ( i, name ) in enumerate( sources ) )
+    # This gets all the maf blocks overlapping our interval of interest
+    # NOTE: Unlike maf_tile we're expecting 
+    # things to be single coverage in the reference species, so we won't 
+    # sort by score and lay down.
+    blocks = index.get( ref_src, start, end )
+    # The last component seen for each species onto which we are tiling
+    last_components = [ None ] * len( sources )
+    last_status = [ None ] * len( sources )
+    cols_needing_fill = [ 0 ] * len( sources )
+    # The list of strings in which we build up the tiled alignment
+    tiled_rows = [ "" for i in range( len( sources ) ) ]
+    # Enumerate the (ordered) list of blocks
+    for i, block in enumerate( blocks ):
+        # Check for overlap in reference species
+        ref = block.get_component_by_src_start( ref_src )
+        if ref.start < last_stop:
+            if ref.end < last_stop: 
+                continue
+            block = block.slice_by_component( ref, last_stop, min( end, ref.end ) )
+            ref = block.get_component_by_src_start( ref_src )
+        block = block.slice_by_component( ref, max( start, ref.start ), min( end, ref.end ) )
+        ref = block.get_component_by_src_start( ref_src )
+        # print block
+        assert last_components[0] is None or ref.start >= last_components[0].end, \
+            "MAF must be sorted and single coverage in reference species!"
+        assert ref.strand == "+", \
+            "MAF must have all reference species blocks on the plus strand"
+        # Store the size of the reference sequence for building fake block   
+        if ref_src_size is None:
+            ref_src_size = ref.src_size
+        # Handle the reference component seperately, it has no synteny status
+        # but we will try to fill in missing sequence
+        if ref.start > last_stop:
+            # Need to fill in some reference sequence
+            chunk_len = ref.start - last_stop
+            text = bx.seq.nib.NibFile( open( seq_db[ ref_src ] ) ).get( last_stop, chunk_len ) 
+            tiled_rows[0] += text
+            for source in sources[1:]:
+                cols_needing_fill[ source_to_index[ source ] ] += chunk_len
+        # Do reference component
+        chunk_len = len( ref.text )
+        tiled_rows[0] += ref.text
+        # Do each other component
+        for source in sources[1:]:
+            source_index = source_to_index[ source ]
+            comp = block.get_component_by_src_start( source )
+            if comp:
+                if comp.synteny_left is None:
+                    left_status, left_length = None, -1
+                else:
+                    left_status, left_length = comp.synteny_left
+                if comp.synteny_right is None:
+                    right_status, right_length = None, -1
+                else:
+                    right_status, right_length = comp.synteny_right
+                # We have a component, do we need to do some filling?
+                cols_to_fill = cols_needing_fill[ source_index ]
+                if cols_to_fill > 0:
+                    # Adjacent components should have matching status
+                    ## assert last_status[ source_index ] is None or last_status[ source_index ] == left_status, \
+                    ##     "left status (%s) does not match right status (%s) of last component for %s" \
+                    ##         % ( left_status, last_status[ source_index ], source )
+                    if left_status is None:
+                        fill_char = guess_fill_char( last_components[source_index], comp )
+                    else:
+                        fill_char = get_fill_char( left_status )
+                    tiled_rows[ source_index ] += ( fill_char * cols_to_fill )
+                    cols_needing_fill[ source_index ] = 0
+                # Okay, filled up to current position, now append the text
+                tiled_rows[ source_index ] += comp.text
+                assert len( tiled_rows[ source_index ] ) == len( tiled_rows[ 0 ] ), \
+                    "length of tiled row should match reference row"
+                last_components[ source_index ] = comp
+                last_status[ source_index ] = right_status
+            else:
+                # No component, we'll have to fill this region when we know
+                # the status
+                cols_needing_fill[ source_index ] += chunk_len
+        last_stop = ref.end
+    # No more components, clean up the ends
+    if last_stop < end:
+        # Need to fill in some reference sequence
+        chunk_len = end - last_stop
+        tiled_rows[0] += bx.seq.nib.NibFile( open( seq_db[ ref_src ] ) ).get( last_stop, chunk_len ) 
+        for source in sources[1:]:
+            cols_needing_fill[ source_to_index[ source ] ] += chunk_len
+    # Any final filling that needs to be done?
+    for source in sources[1:]:
+        source_index = source_to_index[ source ]
+        fill_needed = cols_needing_fill[ source_index ]
+        if fill_needed > 0:
+            if last_components[ source_index ] is None:
+                # print >>sys.stderr, "Never saw any components for %s, filling with @" % source
+                fill_char = '@'
+            else:
+                if last_status[ source_index ] is None:
+                    fill_char = '*'
+                else:
+                    fill_char = get_fill_char( last_status[ source_index ] )
+            tiled_rows[ source_index ] += fill_char * fill_needed
+        assert len( tiled_rows[ source_index ] ) == len( tiled_rows[ 0 ] ), \
+            "length of tiled row should match reference row"
+    # Okay, now make up the fake alignment from the tiled rows.
+    tiled_rows = remove_all_gap_columns( tiled_rows )
+    a = align.Alignment()
+    for i, name in enumerate( sources ):
+        text = "".join( tiled_rows[i] )
+        size = len( text ) - text.count( "-" )
+        if i == 0:
+            if ref_src_size is None: ref_src_size = bx.seq.nib.NibFile( open( seq_db[ ref_src ] ) ).length
+            c = align.Component( ref_src, start, end-start, "+", ref_src_size, text )
+        else:
+            c = align.Component( name + ".fake", 0, size, "?", size, text )
+        a.add_component( c )
+    if strand == '-':
+        a = a.reverse_complement()
+    out.write( a )
+    
+main()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_select.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_select.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_select.py (revision 3)
@@ -0,0 +1,35 @@
+#!/usr/bin/python2.6
+
+"""
+Read a feature file containing a 0 or 1 on each line, output 
+all mafs whose index in maf_file corresponds to a row having a 1
+
+usage: %prog feature_file < maf_file
+"""
+
+import psyco_full
+
+import sys
+import bx.align.maf
+
+def __main__():
+
+    feature_file = sys.argv[1]
+
+    if len( sys.argv ) > 2:
+        match = int( sys.argv[2] )
+    else:
+        match = 1
+    
+    feature_vector = [ int( line ) for line in file( feature_file ) ]
+
+    maf_reader = bx.align.maf.Reader( sys.stdin )
+    maf_writer = bx.align.maf.Writer( sys.stdout )
+
+    index = 0
+
+    for m in maf_reader:
+        if feature_vector[ index ] == match: maf_writer.write( m )
+        index += 1
+
+if __name__ == "__main__": __main__()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/bed_coverage_by_interval.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/bed_coverage_by_interval.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/bed_coverage_by_interval.py (revision 3)
@@ -0,0 +1,55 @@
+#!/usr/bin/python2.6
+
+"""
+For each interval in `bed1` print the fraction of bases covered by `bed2`.
+
+usage: %prog bed1 bed2 [mask]
+"""
+
+from __future__ import division
+
+import psyco_full
+import sys
+from bx.bitset import BinnedBitSet
+from bx.bitset_builders import *
+from itertools import *
+
+bed1_fname, bed2_fname = sys.argv[1:3]
+
+bitsets = binned_bitsets_from_file( open( bed2_fname ) )
+
+def clone( bits ):
+    b = BinnedBitSet( bits.size )
+    b.ior( bits )
+    return b
+
+if len( sys.argv ) > 3:
+    mask_fname = sys.argv[3]
+    mask = binned_bitsets_from_file( open( mask_fname ) )
+    new_bitsets = dict()
+    for key in bitsets:
+        if key in mask:
+            b = clone( mask[key] )
+            b.invert()
+            b.iand( bitsets[key] )
+            new_bitsets[key] = b
+    bitsets = new_bitsets
+else:
+    mask = None
+
+for line in open( bed1_fname ):
+    fields = line.split()
+    chr, start, end = fields[0], int( fields[1] ), int( fields[2] )
+    bases_covered = 0
+    if chr in bitsets:
+         bases_covered = bitsets[ chr ].count_range( start, end-start )
+    length = end - start
+    if mask and chr in mask:
+        bases_masked = mask[ chr ].count_range( start, end-start )
+        length -= bases_masked
+    assert bases_covered <= length, "%r, %r, %r" % ( bases_covered, bases_masked, length )
+    if length == 0:
+        print 0.0
+    else:
+        print bases_covered / length
+
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/mask_quality.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/mask_quality.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/mask_quality.py (revision 3)
@@ -0,0 +1,98 @@
+#!/usr/bin/python2.6
+
+"""
+Masks an AXT or MAF file based on quality (from a binned_array) and
+outputs AXT or MAF.
+
+Binned array form of quality scores can be generated with `qv_to_bqv.py`.
+
+usage: %prog input output
+    -i, --input=N: Format of input (axt or maf)
+    -o, --output=N: Format of output (axt or maf)
+    -m, --mask=N: Character to use as mask character
+    -q, --quality=N: Min quality allowed
+    -t, --type=N: base_pair or nqs
+    -l, --list=N: colon seperated list of species,len_file[,qualityfile].
+"""
+
+import sys
+import bx.align.axt
+import bx.align.maf
+import bx.binned_array
+from bx.cookbook import doc_optparse
+import fileinput
+from bx.align.sitemask.quality import *
+
+def main():
+    
+    options, args = doc_optparse.parse( __doc__ )
+    try:
+        inputformat = options.input
+        outputformat = options.output
+        mask = options.mask
+        minqual = int(options.quality)
+        qtype = options.type
+        speciesAndLens = options.list
+        inputfile = args[0]
+        outputfile = args[1]
+    except:
+        doc_optparse.exception()
+
+    outstream = open( outputfile, "w" )
+    instream = open( inputfile, "r" )
+
+    qualfiles = {}
+
+    # read lens
+    specieslist = speciesAndLens.split(":")
+    species_to_lengths = {}
+    
+    for entry in specieslist:
+        fields = entry.split(",")
+        lenstream = fileinput.FileInput( fields[1] )
+        lendict = dict()
+        for line in lenstream:
+            region = line.split()
+            lendict[region[0]] = int(region[1])
+        species_to_lengths[fields[0]] = lendict
+        if len(fields) >= 3:
+            qualfiles[fields[0]] = fields[2]
+
+    specieslist = map( lambda(a): a.split(":")[0], specieslist )
+    
+    # open quality binned_arrays
+    reader = None
+    writer = None
+    
+    if inputformat == "axt":
+        # load axt
+        if len(specieslist) != 2:
+            print "AXT is pairwise only."
+            sys.exit()
+        reader = bx.align.axt.Reader(instream, species1=specieslist[0], \
+                                     species2=specieslist[1], \
+                                     species_to_lengths = species_to_lengths)
+    elif outputformat == "maf":
+        # load maf
+        reader = bx.align.maf.Reader(instream, species_to_lengths=species_to_lengths)
+
+    if outputformat == "axt":
+        # setup axt
+        if len(specieslist) != 2:
+            print "AXT is pairwise only."
+            sys.exit()
+        writer = bx.align.axt.Writer(outstream, attributes=reader.attributes)
+    elif outputformat == "maf":
+        # setup maf
+        writer = bx.align.maf.Writer(outstream, attributes=reader.attributes)
+
+    qualfilter = Simple( mask=mask, qualspecies = species_to_lengths, \
+                         qualfiles = qualfiles, minqual = minqual, cache=50 )
+
+    qualfilter.run( reader, writer.write )
+
+    print "For "+str(qualfilter.total)+" base pairs, "+str(qualfilter.masked)+" base pairs were masked."
+    print str(float(qualfilter.masked)/float(qualfilter.total) * 100)+"%"
+    
+if __name__ == "__main__":
+    main()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/div_snp_table_chr.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/div_snp_table_chr.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/div_snp_table_chr.py (revision 3)
@@ -0,0 +1,146 @@
+#!/usr/bin/python2.6
+
+"""
+FIXME!
+
+usage: %prog feature.bed ar.bed snp.bed div_directory [options]
+    -m, --mask=M: Mask AR and features with this file
+    -s, --suffix=S: append suffix to chromosomes to get filenames from div_directory
+    -l, --lens=l: Set chromosome ends using LEN file
+"""
+
+import sys
+import bx.bitset
+from bx.bitset_builders import *
+from bx.cookbook import doc_optparse
+
+def main():
+
+    options, args = doc_optparse.parse( __doc__ )
+    try:
+        lens = {}
+        if options.lens:
+            for line in open( options.lens ):
+                chrom, length = line.split()
+                lens[chrom] = int( length )
+
+        if options.suffix: suffix = options.suffix
+        else: suffix = ""
+
+        print >>sys.stderr, "\nReading feature",
+        interval_file = open(args[0])
+        feature = binned_bitsets_from_file(interval_file, lens=lens)
+        interval_file.close()
+        # reuse interval file 
+        intervals = {}
+        interval_file = open(args[0])
+        for line in interval_file:
+            fields = line.split()
+            chrom, start, end = fields[0], int(fields[1]), int(fields[2])
+            if chrom not in intervals: intervals[chrom] = []
+            intervals[chrom].append( [start,end] )
+        interval_file.close()
+
+        print >>sys.stderr, "\nReading ar",
+        ar = binned_bitsets_from_file(open( args[1] ), lens=lens)
+
+        print >>sys.stderr, "\nReading snps",
+        snp = binned_bitsets_from_file(open( args[2] ), lens=lens)
+        snp_mask = clone_inverted( snp )
+        snp_copy = clone( snp )
+
+        print >>sys.stderr, "\nMasking AR",
+        ar_mask = clone_inverted( ar )
+        print >>sys.stderr
+
+        dirname = args[3]
+
+
+        if options.mask: mask = binned_bitsets_from_file(open(options.mask), lens=lens)
+        else: mask = None
+    except:
+        doc_optparse.exit()
+    
+    if mask:
+        for chrom in mask.keys():
+            if chrom in feature: feature[chrom].iand( mask[chrom] )
+            if chrom in ar: ar[chrom].iand( mask[chrom] )
+
+
+    # divergence and snp counts for all features
+    feature_div_count = 0
+    feature_snp_count = 0
+    ar_div_count = 0
+    ar_snp_count = 0
+
+    # collect snp and div
+    for chr in feature.keys():
+
+        if chr not in snp: continue
+        if chr not in ar: continue
+
+        print >>sys.stderr, "reading %s ..." % chr,
+        try:
+            div = binned_bitsets_from_file( open( dirname + "/%s.bed" % (chr+suffix) ), lens=lens)
+        except:
+            print >>sys.stderr,"%s.bed not found" % chr
+            continue
+
+        div[chr].iand( snp_mask[chr] ) # div/snp sites count snp-only
+        div_copy = clone( div )
+
+        print >>sys.stderr, "AR:", chr,
+        snp[chr].iand( ar[chr] )
+        div[chr].iand( ar[chr] )
+        snp_count = snp[chr].count_range(0,snp[chr].size)
+        ar_snp_count += snp_count
+        print >>sys.stderr, snp_count,
+        try:
+            div_count = div[chr].count_range(0,div[chr].size)
+            ar_div_count += div_count
+            print >>sys.stderr, div_count
+        except:
+            print >>sys.stderr, chr, "failed"
+    
+        div = div_copy
+        snp[chr] = snp_copy[chr]
+        print >>sys.stderr, "feature:", chr,
+        feature[chr].iand( ar_mask[chr] ) # clip to non-AR only
+        snp[chr].iand( feature[chr] )
+        div[chr].iand( feature[chr] )
+        feature_snp_count += snp[chr].count_range(0,snp[chr].size)
+        print >>sys.stderr, snp[chr].count_range(0,snp[chr].size), div[chr].count_range(0,div[chr].size)
+        feature_div_count += div[chr].count_range(0,div[chr].size)
+        print >>sys.stderr, snp[chr].count_range(0,snp[chr].size), div[chr].count_range(0,div[chr].size)
+
+        # Note: can loop over feature intervals here for individual counts
+        if chr in intervals:
+            for start,end in intervals[chr]:
+                ind_div_count = div[chr].count_range(start,end-start)
+                ind_snp_count = snp[chr].count_range(start,end-start)
+                print chr, start, end, ind_div_count, ind_snp_count
+    
+    print "feature snp\t%d" %feature_snp_count
+    print "feature div\t%d" %feature_div_count
+    print "ar snp\t%d" %ar_snp_count
+    print "ar div\t%d" %ar_div_count
+
+# copies a dictionary of bitsets
+def copybits( binnedbits ):
+    bitset = BinnedBitSet( binnedbits.size )
+    bitset.ior( binnedbits )
+    return bitset
+
+def clone( bitsets ):
+    r = {}
+    for k,b in bitsets.items(): r[ k ] = copybits( b )
+    return r
+
+def clone_inverted( bitsets ):
+    r = {}
+    for k,b in bitsets.items(): 
+        r[ k ] = copybits( b )
+        r[ k ].invert()
+    return r
+
+main()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/bed_intersect.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/bed_intersect.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/bed_intersect.py (revision 3)
@@ -0,0 +1,68 @@
+#!/usr/bin/python2.6
+
+"""
+Find regions of first bed file that overlap regions in a second bed file. The
+output preserves all fields from the input. 
+
+NOTE: -u and -d options are currently not functional!
+
+usage: %prog bed_file_1 bed_file_2
+    -m, --mincols=N: Require this much overlap (default 1bp)
+    -u, --upstream_pad=N: upstream interval padding (default 0bp)
+    -d, --downstream_pad=N: downstream interval padding (default 0bp)
+    -v, --reverse: Print regions that DO NOT overlap
+    -b, --booleans: Just print '1' if interval overlaps or '0' otherwise
+"""
+
+import sys
+from warnings import warn
+
+from bx.bitset import *
+from bx.bitset_builders import *
+
+from bx.cookbook import doc_optparse
+
+mincols = 1
+upstream_pad = 0
+downstream_pad = 0
+
+options, args = doc_optparse.parse( __doc__ )
+try:
+    if options.mincols: mincols = int( options.mincols )
+    if options.upstream_pad: upstream_pad = int( options.upstream_pad )
+    if options.downstream_pad: downstream_pad = int( options.downstream_pad )
+    reverse = bool( options.reverse )
+    booleans = bool( options.booleans )
+    in_fname, in2_fname = args
+except:
+    doc_optparse.exit()
+
+# Read first bed into some bitsets
+
+bitsets = binned_bitsets_from_file( open( in2_fname ) )
+
+# Read second BED and intersect
+
+for line in open( in_fname ):
+    if line.startswith("#") or line.isspace(): 
+        continue
+    fields = line.split()
+    start, end = int( fields[1] ), int( fields[2] )
+    if start > end: 
+        warn( "Bed interval start after end!" )
+    if fields[0] in bitsets and bitsets[fields[0]].count_range( start, end-start ) >= mincols:
+        if booleans:
+            if reverse: 
+                print 0
+            else:
+                print 1
+        elif not reverse:
+            print line,
+    else:
+        if booleans:
+            if reverse:
+                print 1
+            else:
+                print 0
+        elif reverse:
+            print line,
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/get_scores_in_intervals.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/get_scores_in_intervals.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/get_scores_in_intervals.py (revision 3)
@@ -0,0 +1,59 @@
+#!/usr/bin/python2.6
+
+"""
+Read scores in "wiggle" format from `score_file` and intervals in "bed" format
+from `interval_file` and print all scores overlapping intervals.
+
+TODO: Support binned array format scores also.
+
+usage: %prog score_file interval_file [out_file] 
+"""
+
+from __future__ import division
+
+import sys
+import psyco_full
+import bx.wiggle
+from bx.binned_array import BinnedArray
+from fpconst import isNaN
+from bx.cookbook import doc_optparse
+from bx import misc
+
+def read_scores( f ):
+    scores_by_chrom = dict()
+    for chrom, pos, val in bx.wiggle.Reader( f ):
+        if chrom not in scores_by_chrom:
+            scores_by_chrom[chrom] = BinnedArray()
+        scores_by_chrom[chrom][pos] = val
+    return scores_by_chrom
+
+def main():
+
+    # Parse command line
+    options, args = doc_optparse.parse( __doc__ )
+    try:
+        score_file = open( args[0] )
+        interval_file = open( args[1] )
+        if len( args ) > 2:
+            out_file = open( args[2], 'w' )
+        else:
+            out_file = sys.stdout
+    except:
+        doc_optparse.exit()
+
+    scores_by_chrom = read_scores( misc.open_compressed( sys.argv[1] ) )
+    for line in open( sys.argv[2] ):
+        fields = line.split()
+        chrom, start, stop = fields[0], int( fields[1] ), int( fields[2] )
+        if chrom in scores_by_chrom:
+            ba = scores_by_chrom[chrom]
+            scores = [ ba[i] for i in range( start, stop ) ]
+        else:
+            scores = []
+        print >> out_file, " ".join( fields ), " ".join( map( str, scores ) )
+
+    score_file.close()
+    interval_file.close()
+    out_file.close()
+
+if __name__ == "__main__": main()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_randomize.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_randomize.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_randomize.py (revision 3)
@@ -0,0 +1,35 @@
+#!/usr/bin/python2.6
+
+"""
+Randomize the order of blocks in a MAF file. If `sample_size` is specified,
+that many random blocks will be kept from the original maf
+
+usage: %prog [sample_size] < maf > maf
+"""
+
+import sys
+
+import sys, random
+from bx.align import maf
+from math import *
+from optparse import OptionParser
+
+def __main__():
+
+    #if len( sys.argv ) > 1: fraction = float( sys.argv[1] )
+    if len( sys.argv ) > 1: sample_size = int( sys.argv[1] )
+
+    maf_reader = maf.Reader( sys.stdin )
+    maf_writer = maf.Writer( sys.stdout )
+
+    mafs = list( maf_reader )
+
+    # for m in maf_reader: mafs.append( m )
+
+    random.shuffle( mafs )
+
+    if not sample_size: sample_size = len( mafs )
+
+    for i in range( 0, sample_size ): maf_writer.write( mafs[ i ] )
+    
+if __name__ == "__main__": __main__()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_gap_frequency.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_gap_frequency.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_gap_frequency.py (revision 3)
@@ -0,0 +1,23 @@
+#!/usr/bin/python2.6
+
+"""
+Read a MAF from standard input and print the fraction of gap columns in 
+each block.
+
+usage: %prog < maf > out
+"""
+
+from __future__ import division
+
+import sys
+import bx.align.maf
+
+
+def main():    
+    for m in bx.align.maf.Reader( sys.stdin ):  
+        gaps = 0        
+        for col in m.column_iter():
+            if ( '-' in col ): gaps += 1          
+        print gaps / m.text_size
+
+if __name__ == "__main__": main()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/bed_diff_basewise_summary.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/bed_diff_basewise_summary.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/bed_diff_basewise_summary.py (revision 3)
@@ -0,0 +1,44 @@
+#!/usr/bin/python2.6
+
+"""
+Given two bed files print the number of bases covered 1) by both, 2) only by 
+the first, and 3) only by the second.
+
+usage: %prog bed_file_1 bed_file_2
+"""
+import sys
+from warnings import warn
+from bx.bitset import BinnedBitSet
+from bx.bitset_builders import *
+from bx.cookbook import doc_optparse
+
+def coverage( bitsets ):
+    total = 0
+    for chrom in bitsets:
+        total += bitsets[chrom].count_range( 0, bitsets[chrom].size )
+    return total    
+
+options, args = doc_optparse.parse( __doc__ )
+try:
+    in_fname, in2_fname = args
+except:
+    doc_optparse.exit()
+
+bits1 = binned_bitsets_from_file( open( in_fname ) )
+bits2 = binned_bitsets_from_file( open( in2_fname ) )
+
+bits1_covered = coverage( bits1 )
+bits2_covered = coverage( bits2 )
+
+bitsets = dict()
+
+for key in bits1:
+    if key in bits2:
+        bits1[key].iand( bits2[key] )
+        bitsets[key] = bits1[key]
+
+both_covered = coverage( bitsets )
+
+print "in both:  \t%d" % both_covered
+print "only in %s:\t%d" % ( in_fname, bits1_covered - both_covered )
+print "only in %s:\t%d" % ( in2_fname, bits2_covered - both_covered )
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_to_axt.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_to_axt.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/maf_to_axt.py (revision 3)
@@ -0,0 +1,110 @@
+#!/usr/bin/python2.6
+"""
+Application to convert MAF file to AXT file, projecting to any two species. 
+Reads a MAF file from standard input and writes an AXT file to standard out;  
+some statistics are written to standard error.  The user must specify the 
+two species of interest.
+
+usage: %prog primary_species secondary_species < maf_file > axt_file
+"""
+
+__author__ = "Bob Harris (rsharris@bx.psu.edu)"
+
+import sys
+import copy
+import bx.align.maf
+import bx.align.axt
+
+def usage(s=None):
+	message = """
+maf_to_axt primary_species secondary_species < maf_file > axt_file
+"""
+	if (s == None): sys.exit (message)
+	else:           sys.exit ("%s\n%s" % (s,message))
+
+
+def main():
+
+	# parse the command line
+
+	primary   = None
+	secondary = None
+
+	args = sys.argv[1:]
+	while (len(args) > 0):
+		arg = args.pop(0)
+		val = None
+		fields = arg.split("=",1)
+		if (len(fields) == 2):
+			arg = fields[0]
+			val = fields[1]
+			if (val == ""):
+				usage("missing a value in %s=" % arg)
+
+		if (primary == None) and (val == None):
+			primary = arg
+		elif (secondary == None) and (val == None):
+			secondary = arg
+		else:
+			usage("unknown argument: %s" % arg)
+
+	if (primary == None):
+		usage("missing primary species")
+
+	if (secondary == None):
+		usage("missing secondary species")
+
+	# read the alignments and other info
+
+	out = bx.align.axt.Writer(sys.stdout)
+
+	axtsRead = 0
+	mafsWritten = 0
+	for mafBlock in bx.align.maf.Reader(sys.stdin):
+		axtsRead += 1
+
+		p = mafBlock.get_component_by_src_start(primary)
+		if (p == None): continue
+		s = mafBlock.get_component_by_src_start(secondary)
+		if (s == None): continue
+
+		axtBlock = bx.align.Alignment (mafBlock.score, mafBlock.attributes)
+		axtBlock.add_component (clone_component(p))
+		axtBlock.add_component (clone_component(s))
+
+		remove_mutual_gaps (axtBlock)
+		if (axtBlock.text_size == 0):
+			continue
+
+		out.write (axtBlock)
+		mafsWritten += 1
+
+	sys.stderr.write ("%d blocks read, %d written\n" % (axtsRead,mafsWritten))
+
+
+def clone_component(c):
+	return bx.align.Component (c.src, c.start, c.size, c.strand, c.src_size, \
+	                           copy.copy(c.text))
+
+
+def remove_mutual_gaps (block):
+
+	if (len(block.components) == 0): return
+
+	nonGaps = []
+
+	for c in block.components:
+		for ix in range(0,block.text_size):
+			if (ix not in nonGaps) and (c.text[ix] != "-"):
+				nonGaps.append(ix)
+
+	nonGaps.sort()
+
+	for c in block.components:
+		c.text = "".join([c.text[ix] for ix in nonGaps])
+
+	block.text_size = len(nonGaps)
+
+
+if __name__ == "__main__": main()
+
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/tfloc_summary.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/tfloc_summary.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/tfloc_summary.py (revision 3)
@@ -0,0 +1,27 @@
+#!/usr/bin/python2.6
+
+"""
+Read TFLOC output from stdin and write out a summary in which the nth line 
+contains the number of sites found in the nth alignment of the input.
+
+TODO: This is very special case, should it be here?
+"""
+
+import sys
+
+counts = dict()
+
+max_index = -1
+
+for line in sys.stdin:
+    if line[0].isdigit():
+        current_index = int( line )
+        max_index = max( current_index, max_index )        
+    elif line[0] == "'":
+        try: counts[ current_index ] += 1
+        except: counts[ current_index ] = 1
+    else:
+        raise "Invalid input line " + line
+
+for i in range( max_index + 1 ):
+    print counts.get( i, 0 )
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/gene_fourfold_sites.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/gene_fourfold_sites.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/gene_fourfold_sites.py (revision 3)
@@ -0,0 +1,236 @@
+#!/usr/bin/python2.6
+
+"""
+Returns a bed-like translation of a CDS in which each record corresponds to
+a single site in the CDS and includes additional fields for site degenaracy, 
+position ind CDS, and amino acid encoded.
+
+usage: %prog nibdir genefile [options]
+    -o, --outfile=o:      output file
+    -f, --format=f:       format bed (default), or gtf|gff
+    -a, --allpositions: 1st, 2nd and 3rd positions are evaluated for degeneracy given the sequence at the other two positions.  Many 1d sites in 1st codon positions become 2d sites when considered this way.
+    -n, --include_name: include the 'name' or 'id' field from the source file on every line of output
+"""
+
+import re
+import sys
+import os
+import string
+from bx.seq import nib
+from bx.bitset import *
+from bx.bitset_builders import *
+from bx.bitset_utils import *
+from bx.gene_reader import *
+from bx.cookbook import doc_optparse
+
+GENETIC_CODE = """
+TTT (Phe/F)Phenylalanine
+TTC (Phe/F)Phenylalanine
+TTA (Leu/L)Leucine
+TTG (Leu/L)Leucine, Start
+TCT (Ser/S)Serine
+TCC (Ser/S)Serine
+TCA (Ser/S)Serine
+TCG (Ser/S)Serine
+TAT (Tyr/Y)Tyrosine
+TAC (Tyr/Y)Tyrosine
+TAA Ochre (Stop)
+TAG Amber (Stop)
+TGT (Cys/C)Cysteine
+TGC (Cys/C)Cysteine
+TGA Opal (Stop)
+TGG (Trp/W)Tryptophan
+CTT (Leu/L)Leucine
+CTC (Leu/L)Leucine
+CTA (Leu/L)Leucine
+CTG (Leu/L)Leucine, Start
+CCT (Pro/P)Proline
+CCC (Pro/P)Proline
+CCA (Pro/P)Proline
+CCG (Pro/P)Proline
+CAT (His/H)Histidine
+CAC (His/H)Histidine
+CAA (Gln/Q)Glutamine
+CAG (Gln/Q)Glutamine
+CGT (Arg/R)Arginine
+CGC (Arg/R)Arginine
+CGA (Arg/R)Arginine
+CGG (Arg/R)Arginine
+ATT (Ile/I)Isoleucine, Start2
+ATC (Ile/I)Isoleucine
+ATA (Ile/I)Isoleucine
+ATG (Met/M)Methionine, Start1
+ACT (Thr/T)Threonine
+ACC (Thr/T)Threonine
+ACA (Thr/T)Threonine
+ACG (Thr/T)Threonine
+AAT (Asn/N)Asparagine
+AAC (Asn/N)Asparagine
+AAA (Lys/K)Lysine
+AAG (Lys/K)Lysine
+AGT (Ser/S)Serine
+AGC (Ser/S)Serine
+AGA (Arg/R)Arginine
+AGG (Arg/R)Arginine
+GTT (Val/V)Valine
+GTC (Val/V)Valine
+GTA (Val/V)Valine
+GTG (Val/V)Valine, Start2
+GCT (Ala/A)Alanine
+GCC (Ala/A)Alanine
+GCA (Ala/A)Alanine
+GCG (Ala/A)Alanine
+GAT (Asp/D)Aspartic acid
+GAC (Asp/D)Aspartic acid
+GAA (Glu/E)Glutamic acid
+GAG (Glu/E)Glutamic acid
+GGT (Gly/G)Glycine
+GGC (Gly/G)Glycine
+GGA (Gly/G)Glycine
+GGG (Gly/G)Glycine
+"""
+
+def translate( codon, genetic_code):
+    c1,c2,c3 = codon
+    return genetic_code[c1][c2][c3]
+
+""" parse the doc string to hash the genetic code"""
+GEN_CODE = {}
+for line in GENETIC_CODE.split('\n'):
+    if line.strip() == '': continue
+    f = re.split('\s|\(|\)|\/',line)
+    codon = f[0]
+    c1,c2,c3 = codon
+    aminoacid = f[3]
+    if c1 not in GEN_CODE: GEN_CODE[c1] = {}
+    if c2 not in GEN_CODE[c1]: GEN_CODE[c1][c2] = {}
+
+    GEN_CODE[c1][c2][c3] = aminoacid
+
+def getnib( nibdir ):
+    seqs = {}
+    for nibf in os.listdir( nibdir ):
+        if not nibf.endswith('.nib'): continue
+        chr = nibf.replace('.nib','')
+        file = os.path.join( nibdir, nibf )
+        seqs[chr] = nib.NibFile( open(file) )
+
+    return seqs
+
+REVMAP = string.maketrans("ACGTacgt","TGCAtgca")
+def revComp(seq):
+    return seq[::-1].translate(REVMAP)
+
+def Comp(seq):
+    return seq.translate(REVMAP)
+
+def codon_degeneracy( codon, position=3 ):
+    aa = translate( codon, GEN_CODE )
+    if position==1:
+        degeneracy1 = [GEN_CODE[ k ][ codon[1] ][ codon[2] ] for k in all].count(aa) 
+    elif position==2:
+        degeneracy2 = [GEN_CODE[ codon[0] ][ k ][ codon[2] ] for k in all].count(aa)
+    elif position==3:
+        degeneracy = GEN_CODE[ codon[0] ][ codon[1] ].values().count(aa)
+    return degeneracy
+
+def main():
+
+    options, args = doc_optparse.parse( __doc__ )
+    try:
+        if options.outfile: 
+            out = open( options.outfile, "w")
+        else:
+            out = sys.stdout
+        if options.format:
+            format = options.format
+        else:
+            format = 'bed'
+
+        allpositions = bool( options.allpositions )
+        include_name = bool( options.include_name )
+        nibdir = args[0]
+        bedfile = args[1]
+    except:
+        doc_optparse.exit()
+
+    nibs = getnib(nibdir)
+
+    for chrom, strand, cds_exons, name in CDSReader( open(bedfile), format=format):
+
+        cds_seq = ''
+
+        # genome_seq_index maps the position in CDS to position on the genome
+        genome_seq_index = []
+        for (c_start, c_end) in cds_exons:
+            cds_seq += nibs[chrom].get( c_start, c_end-c_start )
+            for i in range(c_start,c_end):
+                genome_seq_index.append(i)
+
+        cds_seq = cds_seq.upper()
+
+        if strand == '+': 
+            frsts = range( 0, len(cds_seq), 3)
+            offsign = 1
+        else: 
+            cds_seq = Comp( cds_seq )
+            frsts = range( 2, len(cds_seq), 3)
+            offsign = -1
+
+        offone = 1 * offsign
+        offtwo = 2 * offsign
+
+        all = ['A','C','G','T']
+
+        for first_pos in frsts:
+            c1 = first_pos
+            c2 = first_pos + offone
+            c3 = first_pos + offtwo
+            try:
+                assert c3 < len(cds_seq)
+            except AssertionError:
+                print >>sys.stderr, "out of sequence at %d for %s, %d" % (c3, chrom, genome_seq_index[ first_pos ])
+                continue
+            codon = cds_seq[c1], cds_seq[c2], cds_seq[c3]
+            aa = translate( codon, GEN_CODE )
+            degeneracy3 = str(GEN_CODE[ codon[0] ][ codon[1] ].values().count(aa)) + "d"
+
+            if not include_name: name_text = ''
+            else: 
+                name_text = name.replace(' ','_')
+
+            if allpositions:
+                try:
+                    degeneracy1 = str([GEN_CODE[ k ][ codon[1] ][ codon[2] ] for k in all].count(aa)) + "d"
+                    degeneracy2 = str([GEN_CODE[ codon[0] ][ k ][ codon[2] ] for k in all].count(aa)) + "d"
+                except TypeError, s:
+                    print >>sys.stderr, GEN_CODE.values()
+                    raise TypeError, s
+
+                if strand == '+':
+                    print >>out, chrom, genome_seq_index[c1], genome_seq_index[c1] + 1, cds_seq[c1], degeneracy1, aa, name_text
+                    print >>out, chrom, genome_seq_index[c2], genome_seq_index[c2] + 1, cds_seq[c2], degeneracy2, aa, name_text
+                    print >>out, chrom, genome_seq_index[c3], genome_seq_index[c3] + 1, cds_seq[c3], degeneracy3, aa, name_text
+                else:
+                    print >>out, chrom, genome_seq_index[c3], genome_seq_index[c3] + 1, cds_seq[c3], degeneracy3, aa, name_text
+                    print >>out, chrom, genome_seq_index[c2], genome_seq_index[c2] + 1, cds_seq[c2], degeneracy2, aa, name_text
+                    print >>out, chrom, genome_seq_index[c1], genome_seq_index[c1] + 1, cds_seq[c1], degeneracy1, aa, name_text
+            else:
+                if strand == '+':
+                    for b in c1,c2:
+                        print >>out, chrom, genome_seq_index[b], genome_seq_index[b] + 1, cds_seq[b], "1d", aa, name_text
+                    print >>out, chrom, genome_seq_index[c3], genome_seq_index[c3] + 1, cds_seq[c3], degeneracy3, aa, name_text
+                else:
+                    print >>out, chrom, genome_seq_index[c3], genome_seq_index[c3] + 1, cds_seq[c3], degeneracy3, aa, name_text
+                    for b in c2,c1:
+                        print >>out, chrom, genome_seq_index[b], genome_seq_index[b] + 1, cds_seq[b], "1d", aa, name_text
+    out.close()
+
+if __name__ == '__main__': 
+    main()
+    #format = sys.argv[1]
+    #file = sys.argv[2]
+    #for chr, strand, cds_exons in CDSReader( open(file), format=format):
+    #    s_points = [ "%d,%d" % (a[0],a[1]) for a in cds_exons ]
+    #    print chr, strand, len(cds_exons), "\t".join(s_points)
+
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/line_select.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/line_select.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/line_select.py (revision 3)
@@ -0,0 +1,31 @@
+#!/usr/bin/python2.6
+
+"""
+Read a file containing a 0 or 1 on each line (`feature_file`), output 
+all lines from stdin for which that value was 1
+
+TODO: no need to read the feature_file into memory here, just iterate in
+      parallel.
+
+usage: %prog feature_file < ...
+"""
+
+import psyco_full
+
+import sys
+
+def __main__():
+
+    feature_file = sys.argv[1]
+
+    if len( sys.argv ) > 2:
+        match = int( sys.argv[2] )
+    else:
+        match = 1
+    
+    feature_vector = [ int( line ) for line in file( feature_file ) ]
+
+    for index, line in enumerate( sys.stdin ):
+        if feature_vector[ index ] == match: print line,
+
+if __name__ == "__main__": __main__()
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/prefix_lines.py
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/prefix_lines.py (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/scripts/prefix_lines.py (revision 3)
@@ -0,0 +1,9 @@
+#!/usr/bin/python2.6
+
+"""
+Simple script to add a prefix to every line in a file.
+"""
+
+import sys
+
+for line in sys.stdin: print sys.argv[1] + line,
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/top_level.txt
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/top_level.txt (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/top_level.txt (revision 3)
@@ -0,0 +1,3 @@
+bx_extras
+bx
+psyco_full
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/PKG-INFO
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/PKG-INFO (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/PKG-INFO (revision 3)
@@ -0,0 +1,10 @@
+Metadata-Version: 1.0
+Name: bx-python
+Version: 0.5.0-dev-f74aec067563
+Summary: Tools for manipulating biological data, particularly multiple sequence alignments
+Home-page: http://bx-python.trac.bx.psu.edu
+Author: James Taylor, Bob Harris, David King, Brent Pedersen, and others
+Author-email: james@jamestaylor.org
+License: UNKNOWN
+Description: UNKNOWN
+Platform: UNKNOWN
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/dependency_links.txt
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/dependency_links.txt (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/dependency_links.txt (revision 3)
@@ -0,0 +1,1 @@
+
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/not-zip-safe
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/not-zip-safe (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/not-zip-safe (revision 3)
@@ -0,0 +1,1 @@
+
Index: /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/native_libs.txt
===================================================================
--- /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/native_libs.txt (revision 3)
+++ /galaxy-central/eggs/bx_python-0.5.0_dev_f74aec067563-py2.6-macosx-10.6-universal-ucs2.egg/EGG-INFO/native_libs.txt (revision 3)
@@ -0,0 +1,15 @@
+bx/bitset.so
+bx/_seqmapping.so
+bx/align/_core.so
+bx/align/sitemask/_cpg.so
+bx/arrays/array_tree.so
+bx/arrays/bed.so
+bx/arrays/wiggle.so
+bx/intervals/intersection.so
+bx/intervals/cluster.so
+bx/intseq/ngramcount.so
+bx/misc/_seekbzip2.so
+bx/motif/_pwm.so
+bx/pwm/_position_weight_matrix.so
+bx/seq/_nib.so
+bx/seq/_twobit.so
Index: /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/mako/parsetree.py
===================================================================
--- /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/mako/parsetree.py (revision 3)
+++ /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/mako/parsetree.py (revision 3)
@@ -0,0 +1,422 @@
+# parsetree.py
+# Copyright (C) 2006, 2007, 2008, 2009 Michael Bayer mike_mp@zzzcomputing.com
+#
+# This module is part of Mako and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+"""defines the parse tree components for Mako templates."""
+
+from mako import exceptions, ast, util, filters
+import re
+
+class Node(object):
+    """base class for a Node in the parse tree."""
+    def __init__(self, source, lineno, pos, filename):
+        self.source = source
+        self.lineno = lineno
+        self.pos = pos
+        self.filename = filename
+    
+    def exception_kwargs(self):
+        return {'source':self.source, 'lineno':self.lineno, 'pos':self.pos, 'filename':self.filename}
+    exception_kwargs = property(exception_kwargs)
+    
+    def get_children(self):
+        return []
+        
+    def accept_visitor(self, visitor):
+        def traverse(node):
+            for n in node.get_children():
+                n.accept_visitor(visitor)
+        method = getattr(visitor, "visit" + self.__class__.__name__, traverse)
+        method(self)
+
+class TemplateNode(Node):
+    """a 'container' node that stores the overall collection of nodes."""
+    
+    def __init__(self, filename):
+        super(TemplateNode, self).__init__('', 0, 0, filename)
+        self.nodes = []
+        self.page_attributes = {}
+        
+    def get_children(self):
+        return self.nodes
+        
+    def __repr__(self):
+        return "TemplateNode(%s, %r)" % (util.sorted_dict_repr(self.page_attributes), self.nodes)
+        
+class ControlLine(Node):
+    """defines a control line, a line-oriented python line or end tag.
+    
+    e.g.::
+
+        % if foo:
+            (markup)
+        % endif
+    
+    """
+
+    def __init__(self, keyword, isend, text, **kwargs):
+        super(ControlLine, self).__init__(**kwargs)
+        self.text = text
+        self.keyword = keyword
+        self.isend = isend
+        self.is_primary = keyword in ['for','if', 'while', 'try']
+        if self.isend:
+            self._declared_identifiers = []
+            self._undeclared_identifiers = []
+        else:
+            code = ast.PythonFragment(text, **self.exception_kwargs)
+            self._declared_identifiers = code.declared_identifiers 
+            self._undeclared_identifiers = code.undeclared_identifiers
+
+    def declared_identifiers(self):
+        return self._declared_identifiers
+
+    def undeclared_identifiers(self):
+        return self._undeclared_identifiers
+        
+    def is_ternary(self, keyword):
+        """return true if the given keyword is a ternary keyword for this ControlLine"""
+        
+        return keyword in {
+            'if':util.Set(['else', 'elif']),
+            'try':util.Set(['except', 'finally']),
+            'for':util.Set(['else'])
+        }.get(self.keyword, [])
+        
+    def __repr__(self):
+        return "ControlLine(%r, %r, %r, %r)" % (
+            self.keyword, 
+            self.text, 
+            self.isend, 
+            (self.lineno, self.pos)
+        )
+
+class Text(Node):
+    """defines plain text in the template."""
+    
+    def __init__(self, content, **kwargs):
+        super(Text, self).__init__(**kwargs)
+        self.content = content
+        
+    def __repr__(self):
+        return "Text(%r, %r)" % (self.content, (self.lineno, self.pos))
+        
+class Code(Node):
+    """defines a Python code block, either inline or module level.
+    
+    e.g.::
+
+        inline:
+        <%
+            x = 12
+        %>
+    
+        module level:
+        <%!
+            import logger
+        %>
+    
+    """
+
+    def __init__(self, text, ismodule, **kwargs):
+        super(Code, self).__init__(**kwargs)
+        self.text = text
+        self.ismodule = ismodule
+        self.code = ast.PythonCode(text, **self.exception_kwargs)
+
+    def declared_identifiers(self):
+        return self.code.declared_identifiers
+
+    def undeclared_identifiers(self):
+        return self.code.undeclared_identifiers
+
+    def __repr__(self):
+        return "Code(%r, %r, %r)" % (
+            self.text, 
+            self.ismodule, 
+            (self.lineno, self.pos)
+        )
+        
+class Comment(Node):
+    """defines a comment line.
+    
+    # this is a comment
+    
+    """
+    
+    def __init__(self, text, **kwargs):
+        super(Comment, self).__init__(**kwargs)
+        self.text = text
+
+    def __repr__(self):
+        return "Comment(%r, %r)" % (self.text, (self.lineno, self.pos))
+        
+class Expression(Node):
+    """defines an inline expression.
+    
+    ${x+y}
+    
+    """
+    
+    def __init__(self, text, escapes, **kwargs):
+        super(Expression, self).__init__(**kwargs)
+        self.text = text
+        self.escapes = escapes
+        self.escapes_code = ast.ArgumentList(escapes, **self.exception_kwargs)
+        self.code = ast.PythonCode(text, **self.exception_kwargs)
+
+    def declared_identifiers(self):
+        return []
+
+    def undeclared_identifiers(self):
+        # TODO: make the "filter" shortcut list configurable at parse/gen time
+        return self.code.undeclared_identifiers.union(
+                self.escapes_code.undeclared_identifiers.difference(
+                    util.Set(filters.DEFAULT_ESCAPES.keys())
+                )
+            )
+
+    def __repr__(self):
+        return "Expression(%r, %r, %r)" % (
+            self.text, 
+            self.escapes_code.args, 
+            (self.lineno, self.pos)
+        )
+        
+class _TagMeta(type):
+    """metaclass to allow Tag to produce a subclass according to its keyword"""
+    
+    _classmap = {}
+    
+    def __init__(cls, clsname, bases, dict):
+        if cls.__keyword__ is not None:
+            cls._classmap[cls.__keyword__] = cls
+            super(_TagMeta, cls).__init__(clsname, bases, dict)
+            
+    def __call__(cls, keyword, attributes, **kwargs):
+        if ":" in keyword:
+            ns, defname = keyword.split(':')
+            return type.__call__(CallNamespaceTag, ns, defname, attributes, **kwargs)
+
+        try:
+            cls = _TagMeta._classmap[keyword]
+        except KeyError:
+            raise exceptions.CompileException(
+                "No such tag: '%s'" % keyword, 
+                source=kwargs['source'], 
+                lineno=kwargs['lineno'], 
+                pos=kwargs['pos'], 
+                filename=kwargs['filename']
+            )
+        return type.__call__(cls, keyword, attributes, **kwargs)
+        
+class Tag(Node):
+    """abstract base class for tags.
+    
+    <%sometag/>
+    
+    <%someothertag>
+        stuff
+    </%someothertag>
+    
+    """
+    
+    __metaclass__ = _TagMeta
+    __keyword__ = None
+    
+    def __init__(self, keyword, attributes, expressions, nonexpressions, required, **kwargs):
+        """construct a new Tag instance.
+        
+        this constructor not called directly, and is only called by subclasses.
+        
+        keyword - the tag keyword
+        
+        attributes - raw dictionary of attribute key/value pairs
+        
+        expressions - a util.Set of identifiers that are legal attributes, which can also contain embedded expressions
+        
+        nonexpressions - a util.Set of identifiers that are legal attributes, which cannot contain embedded expressions
+        
+        **kwargs - other arguments passed to the Node superclass (lineno, pos)
+        
+        """
+        super(Tag, self).__init__(**kwargs)
+        self.keyword = keyword
+        self.attributes = attributes
+        self._parse_attributes(expressions, nonexpressions)
+        missing = [r for r in required if r not in self.parsed_attributes]
+        if len(missing):
+            raise exceptions.CompileException(
+                "Missing attribute(s): %s" % ",".join([repr(m) for m in missing]), 
+                **self.exception_kwargs)
+        self.parent = None
+        self.nodes = []
+        
+    def is_root(self):
+        return self.parent is None
+        
+    def get_children(self):
+        return self.nodes
+        
+    def _parse_attributes(self, expressions, nonexpressions):
+        undeclared_identifiers = util.Set()
+        self.parsed_attributes = {}
+        for key in self.attributes:
+            if key in expressions:
+                expr = []
+                for x in re.split(r'(\${.+?})', self.attributes[key]):
+                    m = re.match(r'^\${(.+?)}$', x)
+                    if m:
+                        code = ast.PythonCode(m.group(1), **self.exception_kwargs)
+                        undeclared_identifiers = undeclared_identifiers.union(code.undeclared_identifiers)
+                        expr.append("(%s)" % m.group(1))
+                    else:
+                        if x:
+                            expr.append(repr(x))
+                self.parsed_attributes[key] = " + ".join(expr) or repr('')
+            elif key in nonexpressions:
+                if re.search(r'${.+?}', self.attributes[key]):
+                    raise exceptions.CompileException(
+                            "Attibute '%s' in tag '%s' does not allow embedded expressions"  % (key, self.keyword), 
+                            **self.exception_kwargs)
+                self.parsed_attributes[key] = repr(self.attributes[key])
+            else:
+                raise exceptions.CompileException("Invalid attribute for tag '%s': '%s'" %(self.keyword, key), **self.exception_kwargs)
+        self.expression_undeclared_identifiers = undeclared_identifiers
+
+    def declared_identifiers(self):
+        return []
+
+    def undeclared_identifiers(self):
+        return self.expression_undeclared_identifiers
+
+    def __repr__(self):
+        return "%s(%r, %s, %r, %r)" % (self.__class__.__name__, 
+                                        self.keyword, 
+                                        util.sorted_dict_repr(self.attributes),
+                                        (self.lineno, self.pos), 
+                                        [repr(x) for x in self.nodes]
+                                    )
+        
+class IncludeTag(Tag):
+    __keyword__ = 'include'
+
+    def __init__(self, keyword, attributes, **kwargs):
+        super(IncludeTag, self).__init__(keyword, attributes, ('file', 'import', 'args'), (), ('file',), **kwargs)
+        self.page_args = ast.PythonCode("__DUMMY(%s)" % attributes.get('args', ''), **self.exception_kwargs)
+
+    def declared_identifiers(self):
+        return []
+
+    def undeclared_identifiers(self):
+        identifiers = self.page_args.undeclared_identifiers.difference(util.Set(["__DUMMY"]))
+        return identifiers.union(super(IncludeTag, self).undeclared_identifiers())
+    
+class NamespaceTag(Tag):
+    __keyword__ = 'namespace'
+
+    def __init__(self, keyword, attributes, **kwargs):
+        super(NamespaceTag, self).__init__(keyword, attributes, (), ('name','inheritable','file','import','module'), (), **kwargs)
+        self.name = attributes.get('name', '__anon_%s' % hex(abs(id(self))))
+        if not 'name' in attributes and not 'import' in attributes:
+            raise exceptions.CompileException("'name' and/or 'import' attributes are required for <%namespace>", **self.exception_kwargs)
+
+    def declared_identifiers(self):
+        return []
+
+class TextTag(Tag):
+    __keyword__ = 'text'
+
+    def __init__(self, keyword, attributes, **kwargs):
+        super(TextTag, self).__init__(keyword, attributes, (), ('filter'), (), **kwargs)
+        self.filter_args = ast.ArgumentList(attributes.get('filter', ''), **self.exception_kwargs)
+        
+class DefTag(Tag):
+    __keyword__ = 'def'
+
+    def __init__(self, keyword, attributes, **kwargs):
+        super(DefTag, self).__init__(
+                keyword, 
+                attributes, 
+                ('buffered', 'cached', 'cache_key', 'cache_timeout', 'cache_type', 'cache_dir', 'cache_url'), 
+                ('name','filter', 'decorator'), 
+                ('name',), 
+                **kwargs)
+        name = attributes['name']
+        if re.match(r'^[\w_]+$',name):
+            raise exceptions.CompileException("Missing parenthesis in %def", **self.exception_kwargs)
+        self.function_decl = ast.FunctionDecl("def " + name + ":pass", **self.exception_kwargs)
+        self.name = self.function_decl.funcname
+        self.decorator = attributes.get('decorator', '')
+        self.filter_args = ast.ArgumentList(attributes.get('filter', ''), **self.exception_kwargs)
+
+    def declared_identifiers(self):
+        return self.function_decl.argnames
+
+    def undeclared_identifiers(self):
+        res = []
+        for c in self.function_decl.defaults:
+            res += list(ast.PythonCode(c, **self.exception_kwargs).undeclared_identifiers)
+        return res + list(self.filter_args.undeclared_identifiers.difference(util.Set(filters.DEFAULT_ESCAPES.keys())))
+
+class CallTag(Tag):
+    __keyword__ = 'call'
+
+    def __init__(self, keyword, attributes, **kwargs):
+        super(CallTag, self).__init__(keyword, attributes, ('args'), ('expr',), ('expr',), **kwargs)
+        self.expression = attributes['expr']
+        self.code = ast.PythonCode(self.expression, **self.exception_kwargs)
+        self.body_decl = ast.FunctionArgs(attributes.get('args', ''), **self.exception_kwargs)
+
+    def declared_identifiers(self):
+        return self.code.declared_identifiers.union(self.body_decl.argnames)
+
+    def undeclared_identifiers(self):
+        return self.code.undeclared_identifiers
+
+class CallNamespaceTag(Tag):
+
+    def __init__(self, namespace, defname, attributes, **kwargs):
+        super(CallNamespaceTag, self).__init__(
+                    namespace + ":" + defname, 
+                    attributes, 
+                    tuple(attributes.keys()) + ('args', ), 
+                    (), 
+                    (), 
+                    **kwargs)
+        self.expression = "%s.%s(%s)" % (namespace, defname, ",".join(["%s=%s" % (k, v) for k, v in self.parsed_attributes.iteritems() if k != 'args']))
+        self.code = ast.PythonCode(self.expression, **self.exception_kwargs)
+        self.body_decl = ast.FunctionArgs(attributes.get('args', ''), **self.exception_kwargs)
+
+    def declared_identifiers(self):
+        return self.code.declared_identifiers.union(self.body_decl.argnames)
+
+    def undeclared_identifiers(self):
+        return self.code.undeclared_identifiers
+
+class InheritTag(Tag):
+    __keyword__ = 'inherit'
+
+    def __init__(self, keyword, attributes, **kwargs):
+        super(InheritTag, self).__init__(keyword, attributes, ('file',), (), ('file',), **kwargs)
+
+class PageTag(Tag):
+    __keyword__ = 'page'
+
+    def __init__(self, keyword, attributes, **kwargs):
+        super(PageTag, self).__init__(
+                keyword, 
+                attributes, 
+                ('cached', 'cache_key', 'cache_timeout', 'cache_type', 'cache_dir', 'cache_url', 'args', 'expression_filter'), 
+                (), 
+                (), 
+                **kwargs)
+        self.body_decl = ast.FunctionArgs(attributes.get('args', ''), **self.exception_kwargs)
+        self.filter_args = ast.ArgumentList(attributes.get('expression_filter', ''), **self.exception_kwargs)
+
+    def declared_identifiers(self):
+        return self.body_decl.argnames
+        
+    
Index: /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/mako/__init__.py
===================================================================
--- /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/mako/__init__.py (revision 3)
+++ /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/mako/__init__.py (revision 3)
@@ -0,0 +1,9 @@
+# __init__.py
+# Copyright (C) 2006, 2007, 2008, 2009 Michael Bayer mike_mp@zzzcomputing.com
+#
+# This module is part of Mako and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+
+__version__ = '0.2.5'
+
Index: /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/mako/cache.py
===================================================================
--- /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/mako/cache.py (revision 3)
+++ /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/mako/cache.py (revision 3)
@@ -0,0 +1,55 @@
+from mako import exceptions
+
+try:
+    from beaker import cache
+    cache = cache.CacheManager()
+except ImportError:
+    cache = None
+
+class Cache(object):
+    def __init__(self, id, starttime):
+        self.id = id
+        self.starttime = starttime
+        self.def_regions = {}
+        
+    def put(self, key, value, **kwargs):
+        defname = kwargs.pop('defname', None)
+        expiretime = kwargs.pop('expiretime', None)
+        createfunc = kwargs.pop('createfunc', None)
+        
+        self._get_cache(defname, **kwargs).put_value(key, starttime=self.starttime, expiretime=expiretime)
+        
+    def get(self, key, **kwargs):
+        defname = kwargs.pop('defname', None)
+        expiretime = kwargs.pop('expiretime', None)
+        createfunc = kwargs.pop('createfunc', None)
+        
+        return self._get_cache(defname, **kwargs).get_value(key, starttime=self.starttime, expiretime=expiretime, createfunc=createfunc)
+        
+    def invalidate(self, key, **kwargs):
+        defname = kwargs.pop('defname', None)
+        expiretime = kwargs.pop('expiretime', None)
+        createfunc = kwargs.pop('createfunc', None)
+        
+        self._get_cache(defname, **kwargs).remove_value(key, starttime=self.starttime, expiretime=expiretime)
+    
+    def invalidate_body(self):
+        self.invalidate('render_body', defname='render_body')
+    
+    def invalidate_def(self, name):
+        self.invalidate('render_%s' % name, defname='render_%s' % name)
+        
+    def invalidate_closure(self, name):
+        self.invalidate(name, defname=name)
+    
+    def _get_cache(self, defname, type=None, **kw):
+        if not cache:
+            raise exceptions.RuntimeException("the Beaker package is required to use cache functionality.")
+        if type == 'memcached':
+            type = 'ext:memcached'
+        if not type:
+            (type, kw) = self.def_regions.get(defname, ('memory', {}))
+        else:
+            self.def_regions[defname] = (type, kw)
+        return cache.get_cache(self.id, type=type, **kw)
+        
Index: /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/mako/codegen.py
===================================================================
--- /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/mako/codegen.py (revision 3)
+++ /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/mako/codegen.py (revision 3)
@@ -0,0 +1,716 @@
+# codegen.py
+# Copyright (C) 2006, 2007, 2008, 2009 Michael Bayer mike_mp@zzzcomputing.com
+#
+# This module is part of Mako and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+"""provides functionality for rendering a parsetree constructing into module source code."""
+
+import time
+import re
+from mako.pygen import PythonPrinter
+from mako import util, ast, parsetree, filters
+
+MAGIC_NUMBER = 5
+
+
+def compile(node, uri, filename=None, default_filters=None, buffer_filters=None, imports=None, source_encoding=None, generate_unicode=True):
+    """generate module source code given a parsetree node, uri, and optional source filename"""
+
+    buf = util.FastEncodingBuffer(unicode=generate_unicode)
+
+    printer = PythonPrinter(buf)
+    _GenerateRenderMethod(printer, _CompileContext(uri, filename, default_filters, buffer_filters, imports, source_encoding, generate_unicode), node)
+    return buf.getvalue()
+
+class _CompileContext(object):
+    def __init__(self, uri, filename, default_filters, buffer_filters, imports, source_encoding, generate_unicode):
+        self.uri = uri
+        self.filename = filename
+        self.default_filters = default_filters
+        self.buffer_filters = buffer_filters
+        self.imports = imports
+        self.source_encoding = source_encoding
+        self.generate_unicode = generate_unicode
+        
+class _GenerateRenderMethod(object):
+    """a template visitor object which generates the full module source for a template."""
+    def __init__(self, printer, compiler, node):
+        self.printer = printer
+        self.last_source_line = -1
+        self.compiler = compiler
+        self.node = node
+        self.identifier_stack = [None]
+        
+        self.in_def = isinstance(node, parsetree.DefTag)
+
+        if self.in_def:
+            name = "render_" + node.name
+            args = node.function_decl.get_argument_expressions()
+            filtered = len(node.filter_args.args) > 0 
+            buffered = eval(node.attributes.get('buffered', 'False'))
+            cached = eval(node.attributes.get('cached', 'False'))
+            defs = None
+            pagetag = None
+        else:
+            defs = self.write_toplevel()
+            pagetag = self.compiler.pagetag
+            name = "render_body"
+            if pagetag is not None:
+                args = pagetag.body_decl.get_argument_expressions()
+                if not pagetag.body_decl.kwargs:
+                    args += ['**pageargs']
+                cached = eval(pagetag.attributes.get('cached', 'False'))
+            else:
+                args = ['**pageargs']
+                cached = False
+            buffered = filtered = False
+        if args is None:
+            args = ['context']
+        else:
+            args = [a for a in ['context'] + args]
+            
+        self.write_render_callable(pagetag or node, name, args, buffered, filtered, cached)
+        
+        if defs is not None:
+            for node in defs:
+                _GenerateRenderMethod(printer, compiler, node)
+    
+    identifiers = property(lambda self:self.identifier_stack[-1])
+    
+    def write_toplevel(self):
+        """traverse a template structure for module-level directives and generate the
+        start of module-level code."""
+        inherit = []
+        namespaces = {}
+        module_code = []
+        encoding =[None]
+
+        self.compiler.pagetag = None
+        
+        class FindTopLevel(object):
+            def visitInheritTag(s, node):
+                inherit.append(node)
+            def visitNamespaceTag(s, node):
+                namespaces[node.name] = node
+            def visitPageTag(s, node):
+                self.compiler.pagetag = node
+            def visitCode(s, node):
+                if node.ismodule:
+                    module_code.append(node)
+            
+        f = FindTopLevel()
+        for n in self.node.nodes:
+            n.accept_visitor(f)
+
+        self.compiler.namespaces = namespaces
+
+        module_ident = util.Set()
+        for n in module_code:
+            module_ident = module_ident.union(n.declared_identifiers())
+
+        module_identifiers = _Identifiers()
+        module_identifiers.declared = module_ident
+        
+        # module-level names, python code
+        if not self.compiler.generate_unicode and self.compiler.source_encoding:
+            self.printer.writeline("# -*- encoding:%s -*-" % self.compiler.source_encoding)
+            
+        self.printer.writeline("from mako import runtime, filters, cache")
+        self.printer.writeline("UNDEFINED = runtime.UNDEFINED")
+        self.printer.writeline("__M_dict_builtin = dict")
+        self.printer.writeline("__M_locals_builtin = locals")
+        self.printer.writeline("_magic_number = %s" % repr(MAGIC_NUMBER))
+        self.printer.writeline("_modified_time = %s" % repr(time.time()))
+        self.printer.writeline("_template_filename=%s" % repr(self.compiler.filename))
+        self.printer.writeline("_template_uri=%s" % repr(self.compiler.uri))
+        self.printer.writeline("_template_cache=cache.Cache(__name__, _modified_time)")
+        self.printer.writeline("_source_encoding=%s" % repr(self.compiler.source_encoding))
+        if self.compiler.imports:
+            buf = ''
+            for imp in self.compiler.imports:
+                buf += imp + "\n"
+                self.printer.writeline(imp)
+            impcode = ast.PythonCode(buf, source='', lineno=0, pos=0, filename='template defined imports')
+        else:
+            impcode = None
+        
+        main_identifiers = module_identifiers.branch(self.node)
+        module_identifiers.topleveldefs = module_identifiers.topleveldefs.union(main_identifiers.topleveldefs)
+        [module_identifiers.declared.add(x) for x in ["UNDEFINED"]]
+        if impcode:
+            [module_identifiers.declared.add(x) for x in impcode.declared_identifiers]
+            
+        self.compiler.identifiers = module_identifiers
+        self.printer.writeline("_exports = %s" % repr([n.name for n in main_identifiers.topleveldefs.values()]))
+        self.printer.write("\n\n")
+
+        if len(module_code):
+            self.write_module_code(module_code)
+
+        if len(inherit):
+            self.write_namespaces(namespaces)
+            self.write_inherit(inherit[-1])
+        elif len(namespaces):
+            self.write_namespaces(namespaces)
+
+        return main_identifiers.topleveldefs.values()
+
+    def write_render_callable(self, node, name, args, buffered, filtered, cached):
+        """write a top-level render callable.
+        
+        this could be the main render() method or that of a top-level def."""
+        
+        if self.in_def:
+            decorator = node.decorator
+            if decorator:
+                self.printer.writeline("@runtime._decorate_toplevel(%s)" % decorator)
+        
+        self.printer.writelines(
+            "def %s(%s):" % (name, ','.join(args)),
+                "context.caller_stack._push_frame()",
+                "try:"
+        )
+        if buffered or filtered or cached:
+            self.printer.writeline("context._push_buffer()")
+        
+        self.identifier_stack.append(self.compiler.identifiers.branch(self.node))
+        if not self.in_def and '**pageargs' in args:
+            self.identifier_stack[-1].argument_declared.add('pageargs')
+
+        if not self.in_def and (len(self.identifiers.locally_assigned) > 0 or len(self.identifiers.argument_declared)>0):
+            self.printer.writeline("__M_locals = __M_dict_builtin(%s)" % ','.join(["%s=%s" % (x, x) for x in self.identifiers.argument_declared]))
+
+        self.write_variable_declares(self.identifiers, toplevel=True)
+
+        for n in self.node.nodes:
+            n.accept_visitor(self)
+
+        self.write_def_finish(self.node, buffered, filtered, cached)
+        self.printer.writeline(None)
+        self.printer.write("\n\n")
+        if cached:
+            self.write_cache_decorator(node, name, args, buffered, self.identifiers, toplevel=True)
+            
+    def write_module_code(self, module_code):
+        """write module-level template code, i.e. that which is enclosed in <%! %> tags
+        in the template."""
+        for n in module_code:
+            self.write_source_comment(n)
+            self.printer.write_indented_block(n.text)
+
+    def write_inherit(self, node):
+        """write the module-level inheritance-determination callable."""
+        self.printer.writelines(
+            "def _mako_inherit(template, context):",
+                "_mako_generate_namespaces(context)",
+                "return runtime._inherit_from(context, %s, _template_uri)" % (node.parsed_attributes['file']),
+                None
+            )
+
+    def write_namespaces(self, namespaces):
+        """write the module-level namespace-generating callable."""
+        self.printer.writelines(
+            "def _mako_get_namespace(context, name):",
+                "try:",
+                    "return context.namespaces[(__name__, name)]",
+                "except KeyError:",
+                    "_mako_generate_namespaces(context)",
+                "return context.namespaces[(__name__, name)]",
+            None,None
+            )
+        self.printer.writeline("def _mako_generate_namespaces(context):")
+        for node in namespaces.values():
+            if node.attributes.has_key('import'):
+                self.compiler.has_ns_imports = True
+            self.write_source_comment(node)
+            if len(node.nodes):
+                self.printer.writeline("def make_namespace():")
+                export = []
+                identifiers = self.compiler.identifiers.branch(node)
+                class NSDefVisitor(object):
+                    def visitDefTag(s, node):
+                        self.write_inline_def(node, identifiers, nested=False)
+                        export.append(node.name)
+                vis = NSDefVisitor()
+                for n in node.nodes:
+                    n.accept_visitor(vis)
+                self.printer.writeline("return [%s]" % (','.join(export)))
+                self.printer.writeline(None)
+                callable_name = "make_namespace()"
+            else:
+                callable_name = "None"
+            self.printer.writeline("ns = runtime.Namespace(%s, context._clean_inheritance_tokens(), templateuri=%s, callables=%s, calling_uri=_template_uri, module=%s)" % (repr(node.name), node.parsed_attributes.get('file', 'None'), callable_name, node.parsed_attributes.get('module', 'None')))
+            if eval(node.attributes.get('inheritable', "False")):
+                self.printer.writeline("context['self'].%s = ns" % (node.name))
+            self.printer.writeline("context.namespaces[(__name__, %s)] = ns" % repr(node.name))
+            self.printer.write("\n")
+        if not len(namespaces):
+            self.printer.writeline("pass")
+        self.printer.writeline(None)
+            
+    def write_variable_declares(self, identifiers, toplevel=False, limit=None):
+        """write variable declarations at the top of a function.
+        
+        the variable declarations are in the form of callable definitions for defs and/or
+        name lookup within the function's context argument.  the names declared are based on the
+        names that are referenced in the function body, which don't otherwise have any explicit
+        assignment operation.  names that are assigned within the body are assumed to be 
+        locally-scoped variables and are not separately declared.
+        
+        for def callable definitions, if the def is a top-level callable then a 
+        'stub' callable is generated which wraps the current Context into a closure.  if the def
+        is not top-level, it is fully rendered as a local closure."""
+        
+        # collection of all defs available to us in this scope
+        comp_idents = dict([(c.name, c) for c in identifiers.defs])
+        to_write = util.Set()
+        
+        # write "context.get()" for all variables we are going to need that arent in the namespace yet
+        to_write = to_write.union(identifiers.undeclared)
+        
+        # write closure functions for closures that we define right here
+        to_write = to_write.union(util.Set([c.name for c in identifiers.closuredefs.values()]))
+
+        # remove identifiers that are declared in the argument signature of the callable
+        to_write = to_write.difference(identifiers.argument_declared)
+
+        # remove identifiers that we are going to assign to.  in this way we mimic Python's behavior,
+        # i.e. assignment to a variable within a block means that variable is now a "locally declared" var,
+        # which cannot be referenced beforehand.  
+        to_write = to_write.difference(identifiers.locally_declared)
+        
+        # if a limiting set was sent, constraint to those items in that list
+        # (this is used for the caching decorator)
+        if limit is not None:
+            to_write = to_write.intersection(limit)
+        
+        if toplevel and getattr(self.compiler, 'has_ns_imports', False):
+            self.printer.writeline("_import_ns = {}")
+            self.compiler.has_imports = True
+            for ident, ns in self.compiler.namespaces.iteritems():
+                if ns.attributes.has_key('import'):
+                    self.printer.writeline("_mako_get_namespace(context, %s)._populate(_import_ns, %s)" % (repr(ident),  repr(re.split(r'\s*,\s*', ns.attributes['import']))))
+                        
+        for ident in to_write:
+            if ident in comp_idents:
+                comp = comp_idents[ident]
+                if comp.is_root():
+                    self.write_def_decl(comp, identifiers)
+                else:
+                    self.write_inline_def(comp, identifiers, nested=True)
+            elif ident in self.compiler.namespaces:
+                self.printer.writeline("%s = _mako_get_namespace(context, %s)" % (ident, repr(ident)))
+            else:
+                if getattr(self.compiler, 'has_ns_imports', False):
+                    self.printer.writeline("%s = _import_ns.get(%s, context.get(%s, UNDEFINED))" % (ident, repr(ident), repr(ident)))
+                else:
+                    self.printer.writeline("%s = context.get(%s, UNDEFINED)" % (ident, repr(ident)))
+        
+        self.printer.writeline("__M_writer = context.writer()")
+        
+    def write_source_comment(self, node):
+        """write a source comment containing the line number of the corresponding template line."""
+        if self.last_source_line != node.lineno:
+            self.printer.writeline("# SOURCE LINE %d" % node.lineno)
+            self.last_source_line = node.lineno
+
+    def write_def_decl(self, node, identifiers):
+        """write a locally-available callable referencing a top-level def"""
+        funcname = node.function_decl.funcname
+        namedecls = node.function_decl.get_argument_expressions()
+        nameargs = node.function_decl.get_argument_expressions(include_defaults=False)
+        if not self.in_def and (len(self.identifiers.locally_assigned) > 0 or len(self.identifiers.argument_declared) > 0):
+            nameargs.insert(0, 'context.locals_(__M_locals)')
+        else:
+            nameargs.insert(0, 'context')
+        self.printer.writeline("def %s(%s):" % (funcname, ",".join(namedecls)))
+        self.printer.writeline("return render_%s(%s)" % (funcname, ",".join(nameargs)))
+        self.printer.writeline(None)
+        
+    def write_inline_def(self, node, identifiers, nested):
+        """write a locally-available def callable inside an enclosing def."""
+        namedecls = node.function_decl.get_argument_expressions()
+        
+        decorator = node.decorator
+        if decorator:
+            self.printer.writeline("@runtime._decorate_inline(context, %s)" % decorator)
+        self.printer.writeline("def %s(%s):" % (node.name, ",".join(namedecls)))
+        filtered = len(node.filter_args.args) > 0 
+        buffered = eval(node.attributes.get('buffered', 'False'))
+        cached = eval(node.attributes.get('cached', 'False'))
+        self.printer.writelines(
+            "context.caller_stack._push_frame()",
+            "try:"
+            )
+        if buffered or filtered or cached:
+            self.printer.writelines(
+                "context._push_buffer()",
+                )
+
+        identifiers = identifiers.branch(node, nested=nested)
+
+        self.write_variable_declares(identifiers)
+        
+        self.identifier_stack.append(identifiers)
+        for n in node.nodes:
+            n.accept_visitor(self)
+        self.identifier_stack.pop()
+        
+        self.write_def_finish(node, buffered, filtered, cached)
+        self.printer.writeline(None)
+        if cached:
+            self.write_cache_decorator(node, node.name, namedecls, False, identifiers, inline=True, toplevel=False)
+            
+    def write_def_finish(self, node, buffered, filtered, cached, callstack=True):
+        """write the end section of a rendering function, either outermost or inline.
+        
+        this takes into account if the rendering function was filtered, buffered, etc.
+        and closes the corresponding try: block if any, and writes code to retrieve captured content, 
+        apply filters, send proper return value."""
+        if not buffered and not cached and not filtered:
+            self.printer.writeline("return ''")
+            if callstack:
+                self.printer.writelines(
+                    "finally:",
+                        "context.caller_stack._pop_frame()",
+                    None
+                )
+                
+        if buffered or filtered or cached:
+            if buffered or cached:
+                # in a caching scenario, don't try to get a writer
+                # from the context after popping; assume the caching
+                # implemenation might be using a context with no
+                # extra buffers
+                self.printer.writelines(
+                    "finally:",
+                        "__M_buf = context._pop_buffer()"
+                )
+            else:
+                self.printer.writelines(
+                    "finally:",
+                        "__M_buf, __M_writer = context._pop_buffer_and_writer()"
+                )
+                
+            if callstack:
+                self.printer.writeline("context.caller_stack._pop_frame()")
+                
+            s = "__M_buf.getvalue()"
+            if filtered:
+                s = self.create_filter_callable(node.filter_args.args, s, False)
+            self.printer.writeline(None)
+            if buffered and not cached:
+                s = self.create_filter_callable(self.compiler.buffer_filters, s, False)
+            if buffered or cached:
+                self.printer.writeline("return %s" % s)
+            else:
+                self.printer.writelines(
+                    "__M_writer(%s)" % s,
+                    "return ''"
+                )
+
+    def write_cache_decorator(self, node_or_pagetag, name, args, buffered, identifiers, inline=False, toplevel=False):
+        """write a post-function decorator to replace a rendering callable with a cached version of itself."""
+        self.printer.writeline("__M_%s = %s" % (name, name))
+        cachekey = node_or_pagetag.parsed_attributes.get('cache_key', repr(name))
+        cacheargs = {}
+        for arg in (('cache_type', 'type'), ('cache_dir', 'data_dir'), ('cache_timeout', 'expiretime'), ('cache_url', 'url')):
+            val = node_or_pagetag.parsed_attributes.get(arg[0], None)
+            if val is not None:
+                if arg[1] == 'expiretime':
+                    cacheargs[arg[1]] = int(eval(val))
+                else:
+                    cacheargs[arg[1]] = val
+            else:
+                if self.compiler.pagetag is not None:
+                    val = self.compiler.pagetag.parsed_attributes.get(arg[0], None)
+                    if val is not None:
+                        if arg[1] == 'expiretime':
+                            cacheargs[arg[1]] == int(eval(val))
+                        else:
+                            cacheargs[arg[1]] = val
+        
+        self.printer.writeline("def %s(%s):" % (name, ','.join(args)))
+        
+        # form "arg1, arg2, arg3=arg3, arg4=arg4", etc.
+        pass_args = [ '=' in a and "%s=%s" % ((a.split('=')[0],)*2) or a for a in args]
+
+        self.write_variable_declares(identifiers, toplevel=toplevel, limit=node_or_pagetag.undeclared_identifiers())
+        if buffered:
+            s = "context.get('local').get_cached(%s, defname=%r, %screatefunc=lambda:__M_%s(%s))" % (cachekey, name, ''.join(["%s=%s, " % (k,v) for k, v in cacheargs.iteritems()]), name, ','.join(pass_args))
+            # apply buffer_filters
+            s = self.create_filter_callable(self.compiler.buffer_filters, s, False)
+            self.printer.writelines("return " + s,None)
+        else:
+            self.printer.writelines(
+                    "__M_writer(context.get('local').get_cached(%s, defname=%r, %screatefunc=lambda:__M_%s(%s)))" % (cachekey, name, ''.join(["%s=%s, " % (k,v) for k, v in cacheargs.iteritems()]), name, ','.join(pass_args)),
+                    "return ''",
+                None
+            )
+
+    def create_filter_callable(self, args, target, is_expression):
+        """write a filter-applying expression based on the filters present in the given 
+        filter names, adjusting for the global 'default' filter aliases as needed."""
+        def locate_encode(name):
+            if re.match(r'decode\..+', name):
+                return "filters." + name
+            else:
+                return filters.DEFAULT_ESCAPES.get(name, name)
+        
+        if 'n' not in args:
+            if is_expression:
+                if self.compiler.pagetag:
+                    args = self.compiler.pagetag.filter_args.args + args
+                if self.compiler.default_filters:
+                    args = self.compiler.default_filters + args
+        for e in args:
+            # if filter given as a function, get just the identifier portion
+            if e == 'n':
+                continue
+            m = re.match(r'(.+?)(\(.*\))', e)
+            if m:
+                (ident, fargs) = m.group(1,2)
+                f = locate_encode(ident)
+                e = f + fargs
+            else:
+                x = e
+                e = locate_encode(e)
+                assert e is not None
+            target = "%s(%s)" % (e, target)
+        return target
+        
+    def visitExpression(self, node):
+        self.write_source_comment(node)
+        if len(node.escapes) or (self.compiler.pagetag is not None and len(self.compiler.pagetag.filter_args.args)) or len(self.compiler.default_filters):
+            s = self.create_filter_callable(node.escapes_code.args, "%s" % node.text, True)
+            self.printer.writeline("__M_writer(%s)" % s)
+        else:
+            self.printer.writeline("__M_writer(%s)" % node.text)
+            
+    def visitControlLine(self, node):
+        if node.isend:
+            self.printer.writeline(None)
+        else:
+            self.write_source_comment(node)
+            self.printer.writeline(node.text)
+    def visitText(self, node):
+        self.write_source_comment(node)
+        self.printer.writeline("__M_writer(%s)" % repr(node.content))
+    def visitTextTag(self, node):
+        filtered = len(node.filter_args.args) > 0
+        if filtered:
+            self.printer.writelines(
+                "__M_writer = context._push_writer()",
+                "try:",
+            )
+        for n in node.nodes:
+            n.accept_visitor(self)
+        if filtered:
+            self.printer.writelines(
+                "finally:",
+                "__M_buf, __M_writer = context._pop_buffer_and_writer()",
+                "__M_writer(%s)" % self.create_filter_callable(node.filter_args.args, "__M_buf.getvalue()", False),
+                None
+                )
+        
+    def visitCode(self, node):
+        if not node.ismodule:
+            self.write_source_comment(node)
+            self.printer.write_indented_block(node.text)
+
+            if not self.in_def and len(self.identifiers.locally_assigned) > 0:
+                # if we are the "template" def, fudge locally declared/modified variables into the "__M_locals" dictionary,
+                # which is used for def calls within the same template, to simulate "enclosing scope"
+                self.printer.writeline('__M_locals.update(__M_dict_builtin([(__M_key, __M_locals_builtin()[__M_key]) for __M_key in [%s] if __M_key in __M_locals_builtin()]))' % ','.join([repr(x) for x in node.declared_identifiers()]))
+                
+    def visitIncludeTag(self, node):
+        self.write_source_comment(node)
+        args = node.attributes.get('args')
+        if args:
+            self.printer.writeline("runtime._include_file(context, %s, _template_uri, %s)" % (node.parsed_attributes['file'], args))
+        else:
+            self.printer.writeline("runtime._include_file(context, %s, _template_uri)" % (node.parsed_attributes['file']))
+            
+    def visitNamespaceTag(self, node):
+        pass
+            
+    def visitDefTag(self, node):
+        pass
+
+    def visitCallNamespaceTag(self, node):
+        # TODO: we can put namespace-specific checks here, such
+        # as ensure the given namespace will be imported,
+        # pre-import the namespace, etc.
+        self.visitCallTag(node)
+        
+    def visitCallTag(self, node):
+        self.printer.writeline("def ccall(caller):")
+        export = ['body']
+        callable_identifiers = self.identifiers.branch(node, nested=True)
+        body_identifiers = callable_identifiers.branch(node, nested=False)
+        # we want the 'caller' passed to ccall to be used for the body() function,
+        # but for other non-body() <%def>s within <%call> we want the current caller off the call stack (if any)
+        body_identifiers.add_declared('caller')
+        
+        self.identifier_stack.append(body_identifiers)
+        class DefVisitor(object):
+            def visitDefTag(s, node):
+                self.write_inline_def(node, callable_identifiers, nested=False)
+                export.append(node.name)
+                # remove defs that are within the <%call> from the "closuredefs" defined
+                # in the body, so they dont render twice
+                if node.name in body_identifiers.closuredefs:
+                    del body_identifiers.closuredefs[node.name]
+
+        vis = DefVisitor()
+        for n in node.nodes:
+            n.accept_visitor(vis)
+        self.identifier_stack.pop()
+        
+        bodyargs = node.body_decl.get_argument_expressions()    
+        self.printer.writeline("def body(%s):" % ','.join(bodyargs))
+        # TODO: figure out best way to specify buffering/nonbuffering (at call time would be better)
+        buffered = False
+        if buffered:
+            self.printer.writelines(
+                "context._push_buffer()",
+                "try:"
+            )
+        self.write_variable_declares(body_identifiers)
+        self.identifier_stack.append(body_identifiers)
+        
+        for n in node.nodes:
+            n.accept_visitor(self)
+        self.identifier_stack.pop()
+        
+        self.write_def_finish(node, buffered, False, False, callstack=False)
+        self.printer.writelines(
+            None,
+            "return [%s]" % (','.join(export)),
+            None
+        )
+
+        self.printer.writelines(
+            # get local reference to current caller, if any
+            "caller = context.caller_stack._get_caller()",
+            # push on caller for nested call
+            "context.caller_stack.nextcaller = runtime.Namespace('caller', context, callables=ccall(caller))",
+            "try:")
+        self.write_source_comment(node)
+        self.printer.writelines(
+                "__M_writer(%s)" % self.create_filter_callable([], node.expression, True),
+            "finally:",
+                "context.caller_stack.nextcaller = None",
+            None
+        )
+
+class _Identifiers(object):
+    """tracks the status of identifier names as template code is rendered."""
+    def __init__(self, node=None, parent=None, nested=False):
+        if parent is not None:
+            # things that have already been declared in an enclosing namespace (i.e. names we can just use)
+            self.declared = util.Set(parent.declared).union([c.name for c in parent.closuredefs.values()]).union(parent.locally_declared).union(parent.argument_declared)
+            
+            # if these identifiers correspond to a "nested" scope, it means whatever the 
+            # parent identifiers had as undeclared will have been declared by that parent, 
+            # and therefore we have them in our scope.
+            if nested:
+                self.declared = self.declared.union(parent.undeclared)
+            
+            # top level defs that are available
+            self.topleveldefs = util.SetLikeDict(**parent.topleveldefs)
+        else:
+            self.declared = util.Set()
+            self.topleveldefs = util.SetLikeDict()
+        
+        # things within this level that are referenced before they are declared (e.g. assigned to)
+        self.undeclared = util.Set()
+        
+        # things that are declared locally.  some of these things could be in the "undeclared"
+        # list as well if they are referenced before declared
+        self.locally_declared = util.Set()
+    
+        # assignments made in explicit python blocks.  these will be propigated to 
+        # the context of local def calls.
+        self.locally_assigned = util.Set()
+        
+        # things that are declared in the argument signature of the def callable
+        self.argument_declared = util.Set()
+        
+        # closure defs that are defined in this level
+        self.closuredefs = util.SetLikeDict()
+        
+        self.node = node
+        
+        if node is not None:
+            node.accept_visitor(self)
+        
+    def branch(self, node, **kwargs):
+        """create a new Identifiers for a new Node, with this Identifiers as the parent."""
+        return _Identifiers(node, self, **kwargs)
+    
+    defs = property(lambda self:util.Set(self.topleveldefs.union(self.closuredefs).values()))
+    
+    def __repr__(self):
+        return "Identifiers(declared=%s, locally_declared=%s, undeclared=%s, topleveldefs=%s, closuredefs=%s, argumenetdeclared=%s)" % (repr(list(self.declared)), repr(list(self.locally_declared)), repr(list(self.undeclared)), repr([c.name for c in self.topleveldefs.values()]), repr([c.name for c in self.closuredefs.values()]), repr(self.argument_declared))
+        
+    def check_declared(self, node):
+        """update the state of this Identifiers with the undeclared and declared identifiers of the given node."""
+        for ident in node.undeclared_identifiers():
+            if ident != 'context' and ident not in self.declared.union(self.locally_declared):
+                self.undeclared.add(ident)
+        for ident in node.declared_identifiers():
+            self.locally_declared.add(ident)
+    
+    def add_declared(self, ident):
+        self.declared.add(ident)
+        if ident in self.undeclared:
+            self.undeclared.remove(ident)
+                        
+    def visitExpression(self, node):
+        self.check_declared(node)
+    def visitControlLine(self, node):
+        self.check_declared(node)
+    def visitCode(self, node):
+        if not node.ismodule:
+            self.check_declared(node)
+            self.locally_assigned = self.locally_assigned.union(node.declared_identifiers())
+    def visitDefTag(self, node):
+        if node.is_root():
+            self.topleveldefs[node.name] = node
+        elif node is not self.node:
+            self.closuredefs[node.name] = node
+        for ident in node.undeclared_identifiers():
+            if ident != 'context' and ident not in self.declared.union(self.locally_declared):
+                self.undeclared.add(ident)
+        # visit defs only one level deep
+        if node is self.node:
+            for ident in node.declared_identifiers():
+                self.argument_declared.add(ident)
+            for n in node.nodes:
+                n.accept_visitor(self)
+    def visitIncludeTag(self, node):
+        self.check_declared(node)
+    def visitPageTag(self, node):
+        for ident in node.declared_identifiers():
+            self.argument_declared.add(ident)
+        self.check_declared(node)
+    
+    def visitCallNamespaceTag(self, node):
+        self.visitCallTag(node)
+        
+    def visitCallTag(self, node):
+        if node is self.node:
+            for ident in node.undeclared_identifiers():
+                if ident != 'context' and ident not in self.declared.union(self.locally_declared):
+                    self.undeclared.add(ident)
+            for ident in node.declared_identifiers():
+                self.argument_declared.add(ident)
+            for n in node.nodes:
+                n.accept_visitor(self)
+        else:
+            for ident in node.undeclared_identifiers():
+                if ident != 'context' and ident not in self.declared.union(self.locally_declared):
+                    self.undeclared.add(ident)
+                
Index: /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/mako/pyparser.py
===================================================================
--- /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/mako/pyparser.py (revision 3)
+++ /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/mako/pyparser.py (revision 3)
@@ -0,0 +1,371 @@
+# ast.py
+# Copyright (C) Mako developers
+#
+# This module is part of Mako and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+"""Handles parsing of Python code.
+
+Parsing to AST is done via _ast on Python > 2.5, otherwise the compiler
+module is used.
+"""
+
+from StringIO import StringIO
+from mako import exceptions, util
+
+# words that cannot be assigned to (notably smaller than the total keys in __builtins__)
+reserved = util.Set(['True', 'False', 'None'])
+
+try:
+    import _ast
+    util.restore__ast(_ast)
+    import _ast_util
+except ImportError:
+    _ast = None
+    from compiler import parse as compiler_parse
+    from compiler import visitor
+
+
+def parse(code, mode='exec', **exception_kwargs):
+    """Parse an expression into AST"""
+    try:
+        if _ast:
+            return _ast_util.parse(code, '<unknown>', mode)
+        else:
+            return compiler_parse(code, mode)
+    except Exception, e:
+        raise exceptions.SyntaxException("(%s) %s (%s)" % (e.__class__.__name__, str(e), repr(code[0:50])), **exception_kwargs)
+
+
+if _ast:
+    class FindIdentifiers(_ast_util.NodeVisitor):
+        def __init__(self, listener, **exception_kwargs):
+            self.in_function = False
+            self.in_assign_targets = False
+            self.local_ident_stack = {}
+            self.listener = listener
+            self.exception_kwargs = exception_kwargs
+        def _add_declared(self, name):
+            if not self.in_function:
+                self.listener.declared_identifiers.add(name)
+        def visit_ClassDef(self, node):
+            self._add_declared(node.name)
+        def visit_Assign(self, node):
+            # flip around the visiting of Assign so the expression gets evaluated first, 
+            # in the case of a clause like "x=x+5" (x is undeclared)
+            self.visit(node.value)
+            in_a = self.in_assign_targets
+            self.in_assign_targets = True
+            for n in node.targets:
+                self.visit(n)
+            self.in_assign_targets = in_a
+        def visit_FunctionDef(self, node):
+            self._add_declared(node.name)
+            # push function state onto stack.  dont log any
+            # more identifiers as "declared" until outside of the function,
+            # but keep logging identifiers as "undeclared".
+            # track argument names in each function header so they arent counted as "undeclared"
+            saved = {}
+            inf = self.in_function
+            self.in_function = True
+            for arg in node.args.args:
+                if arg.id in self.local_ident_stack:
+                    saved[arg.id] = True
+                else:
+                    self.local_ident_stack[arg.id] = True
+            for n in node.body:
+                self.visit(n)
+            self.in_function = inf
+            for arg in node.args.args:
+                if arg.id not in saved:
+                    del self.local_ident_stack[arg.id]
+        def visit_For(self, node):
+            # flip around visit
+            self.visit(node.iter)
+            self.visit(node.target)
+            for statement in node.body:
+                self.visit(statement)
+            for statement in node.orelse:
+                self.visit(statement)
+        def visit_Name(self, node):
+            if isinstance(node.ctx, _ast.Store):
+                self._add_declared(node.id)
+            if node.id not in reserved and node.id not in self.listener.declared_identifiers and node.id not in self.local_ident_stack:
+                self.listener.undeclared_identifiers.add(node.id)
+        def visit_Import(self, node):
+            for name in node.names:
+                if name.asname is not None:
+                    self._add_declared(name.asname)
+                else:
+                    self._add_declared(name.name.split('.')[0])
+        def visit_ImportFrom(self, node):
+            for name in node.names:
+                if name.asname is not None:
+                    self._add_declared(name.asname)
+                else:
+                    if name.name == '*':
+                        raise exceptions.CompileException("'import *' is not supported, since all identifier names must be explicitly declared.  Please use the form 'from <modulename> import <name1>, <name2>, ...' instead.", **self.exception_kwargs)
+                    self._add_declared(name.name)
+
+    class FindTuple(_ast_util.NodeVisitor):
+        def __init__(self, listener, code_factory, **exception_kwargs):
+            self.listener = listener
+            self.exception_kwargs = exception_kwargs
+            self.code_factory = code_factory
+        def visit_Tuple(self, node):
+            for n in node.elts:
+                p = self.code_factory(n, **self.exception_kwargs)
+                self.listener.codeargs.append(p)
+                self.listener.args.append(ExpressionGenerator(n).value())
+                self.listener.declared_identifiers = self.listener.declared_identifiers.union(p.declared_identifiers)
+                self.listener.undeclared_identifiers = self.listener.undeclared_identifiers.union(p.undeclared_identifiers)
+
+    class ParseFunc(_ast_util.NodeVisitor):
+        def __init__(self, listener, **exception_kwargs):
+            self.listener = listener
+            self.exception_kwargs = exception_kwargs
+        def visit_FunctionDef(self, node):
+            self.listener.funcname = node.name
+            argnames = [arg.id for arg in node.args.args]
+            if node.args.vararg:
+                argnames.append(node.args.vararg)
+            if node.args.kwarg:
+                argnames.append(node.args.kwarg)
+            self.listener.argnames = argnames
+            self.listener.defaults = node.args.defaults # ast
+            self.listener.varargs = node.args.vararg
+            self.listener.kwargs = node.args.kwarg
+
+    class ExpressionGenerator(object):
+        def __init__(self, astnode):
+            self.generator = _ast_util.SourceGenerator(' ' * 4)
+            self.generator.visit(astnode)
+        def value(self):
+            return ''.join(self.generator.result)
+else:
+    class FindIdentifiers(object):
+        def __init__(self, listener, **exception_kwargs):
+            self.in_function = False
+            self.local_ident_stack = {}
+            self.listener = listener
+            self.exception_kwargs = exception_kwargs
+        def _add_declared(self, name):
+            if not self.in_function:
+                self.listener.declared_identifiers.add(name)
+        def visitClass(self, node, *args):
+            self._add_declared(node.name)
+        def visitAssName(self, node, *args):
+            self._add_declared(node.name)
+        def visitAssign(self, node, *args):
+            # flip around the visiting of Assign so the expression gets evaluated first, 
+            # in the case of a clause like "x=x+5" (x is undeclared)
+            self.visit(node.expr, *args)
+            for n in node.nodes:
+                self.visit(n, *args)
+        def visitFunction(self,node, *args):
+            self._add_declared(node.name)
+            # push function state onto stack.  dont log any
+            # more identifiers as "declared" until outside of the function,
+            # but keep logging identifiers as "undeclared".
+            # track argument names in each function header so they arent counted as "undeclared"
+            saved = {}
+            inf = self.in_function
+            self.in_function = True
+            for arg in node.argnames:
+                if arg in self.local_ident_stack:
+                    saved[arg] = True
+                else:
+                    self.local_ident_stack[arg] = True
+            for n in node.getChildNodes():
+                self.visit(n, *args)
+            self.in_function = inf
+            for arg in node.argnames:
+                if arg not in saved:
+                    del self.local_ident_stack[arg]
+        def visitFor(self, node, *args):
+            # flip around visit
+            self.visit(node.list, *args)
+            self.visit(node.assign, *args)
+            self.visit(node.body, *args)
+        def visitName(self, node, *args):
+            if node.name not in reserved and node.name not in self.listener.declared_identifiers and node.name not in self.local_ident_stack:
+                self.listener.undeclared_identifiers.add(node.name)
+        def visitImport(self, node, *args):
+            for (mod, alias) in node.names:
+                if alias is not None:
+                    self._add_declared(alias)
+                else:
+                    self._add_declared(mod.split('.')[0])
+        def visitFrom(self, node, *args):
+            for (mod, alias) in node.names:
+                if alias is not None:
+                    self._add_declared(alias)
+                else:
+                    if mod == '*':
+                        raise exceptions.CompileException("'import *' is not supported, since all identifier names must be explicitly declared.  Please use the form 'from <modulename> import <name1>, <name2>, ...' instead.", **self.exception_kwargs)
+                    self._add_declared(mod)
+        def visit(self, expr):
+            visitor.walk(expr, self) #, walker=walker())
+
+    class FindTuple(object):
+        def __init__(self, listener, code_factory, **exception_kwargs):
+            self.listener = listener
+            self.exception_kwargs = exception_kwargs
+            self.code_factory = code_factory
+        def visitTuple(self, node, *args):
+            for n in node.nodes:
+                p = self.code_factory(n, **self.exception_kwargs)
+                self.listener.codeargs.append(p)
+                self.listener.args.append(ExpressionGenerator(n).value())
+                self.listener.declared_identifiers = self.listener.declared_identifiers.union(p.declared_identifiers)
+                self.listener.undeclared_identifiers = self.listener.undeclared_identifiers.union(p.undeclared_identifiers)
+        def visit(self, expr):
+            visitor.walk(expr, self) #, walker=walker())
+
+    class ParseFunc(object):
+        def __init__(self, listener, **exception_kwargs):
+            self.listener = listener
+            self.exception_kwargs = exception_kwargs
+        def visitFunction(self, node, *args):
+            self.listener.funcname = node.name
+            self.listener.argnames = node.argnames
+            self.listener.defaults = node.defaults
+            self.listener.varargs = node.varargs
+            self.listener.kwargs = node.kwargs
+        def visit(self, expr):
+            visitor.walk(expr, self)
+
+    class ExpressionGenerator(object):
+        """given an AST node, generates an equivalent literal Python expression."""
+        def __init__(self, astnode):
+            self.buf = StringIO()
+            visitor.walk(astnode, self) #, walker=walker())
+        def value(self):
+            return self.buf.getvalue()        
+        def operator(self, op, node, *args):
+            self.buf.write("(")
+            self.visit(node.left, *args)
+            self.buf.write(" %s " % op)
+            self.visit(node.right, *args)
+            self.buf.write(")")
+        def booleanop(self, op, node, *args):
+            self.visit(node.nodes[0])
+            for n in node.nodes[1:]:
+                self.buf.write(" " + op + " ")
+                self.visit(n, *args)
+        def visitConst(self, node, *args):
+            self.buf.write(repr(node.value))
+        def visitAssName(self, node, *args):
+            # TODO: figure out OP_ASSIGN, other OP_s
+            self.buf.write(node.name)
+        def visitName(self, node, *args):
+            self.buf.write(node.name)
+        def visitMul(self, node, *args):
+            self.operator("*", node, *args)
+        def visitAnd(self, node, *args):
+            self.booleanop("and", node, *args)
+        def visitOr(self, node, *args):
+            self.booleanop("or", node, *args)
+        def visitBitand(self, node, *args):
+            self.booleanop("&", node, *args)
+        def visitBitor(self, node, *args):
+            self.booleanop("|", node, *args)
+        def visitBitxor(self, node, *args):
+            self.booleanop("^", node, *args)
+        def visitAdd(self, node, *args):
+            self.operator("+", node, *args)
+        def visitGetattr(self, node, *args):
+            self.visit(node.expr, *args)
+            self.buf.write(".%s" % node.attrname)
+        def visitSub(self, node, *args):
+            self.operator("-", node, *args)
+        def visitNot(self, node, *args):
+            self.buf.write("not ")
+            self.visit(node.expr)
+        def visitDiv(self, node, *args):
+            self.operator("/", node, *args)
+        def visitFloorDiv(self, node, *args):
+            self.operator("//", node, *args)
+        def visitSubscript(self, node, *args):
+            self.visit(node.expr)
+            self.buf.write("[")
+            [self.visit(x) for x in node.subs]
+            self.buf.write("]")
+        def visitUnarySub(self, node, *args):
+            self.buf.write("-")
+            self.visit(node.expr)
+        def visitUnaryAdd(self, node, *args):
+            self.buf.write("-")
+            self.visit(node.expr)
+        def visitSlice(self, node, *args):
+            self.visit(node.expr)
+            self.buf.write("[")
+            if node.lower is not None:
+                self.visit(node.lower)
+            self.buf.write(":")
+            if node.upper is not None:
+                self.visit(node.upper)
+            self.buf.write("]")
+        def visitDict(self, node):
+            self.buf.write("{")
+            c = node.getChildren()
+            for i in range(0, len(c), 2):
+                self.visit(c[i])
+                self.buf.write(": ")
+                self.visit(c[i+1])
+                if i<len(c) -2:
+                    self.buf.write(", ")
+            self.buf.write("}")
+        def visitTuple(self, node):
+            self.buf.write("(")
+            c = node.getChildren()
+            for i in range(0, len(c)):
+                self.visit(c[i])
+                if i<len(c) - 1:
+                    self.buf.write(", ")
+            self.buf.write(")")
+        def visitList(self, node):
+            self.buf.write("[")
+            c = node.getChildren()
+            for i in range(0, len(c)):
+                self.visit(c[i])
+                if i<len(c) - 1:
+                    self.buf.write(", ")
+            self.buf.write("]")
+        def visitListComp(self, node):
+            self.buf.write("[")
+            self.visit(node.expr)
+            self.buf.write(" ")
+            for n in node.quals:
+                self.visit(n)
+            self.buf.write("]")
+        def visitListCompFor(self, node):
+            self.buf.write(" for ")
+            self.visit(node.assign)
+            self.buf.write(" in ")
+            self.visit(node.list)
+            for n in node.ifs:
+                self.visit(n)
+        def visitListCompIf(self, node):
+            self.buf.write(" if ")
+            self.visit(node.test)
+        def visitCompare(self, node):
+            self.visit(node.expr)
+            for tup in node.ops:
+                self.buf.write(tup[0])
+                self.visit(tup[1])
+        def visitCallFunc(self, node, *args):
+            self.visit(node.node)
+            self.buf.write("(")
+            if len(node.args):
+                self.visit(node.args[0])
+                for a in node.args[1:]:
+                    self.buf.write(", ")
+                    self.visit(a)
+            self.buf.write(")")
+
+    class walker(visitor.ASTVisitor):
+        def dispatch(self, node, *args):
+            print "Node:", str(node)
+            #print "dir:", dir(node)
+            return visitor.ASTVisitor.dispatch(self, node, *args)
Index: /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/mako/filters.py
===================================================================
--- /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/mako/filters.py (revision 3)
+++ /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/mako/filters.py (revision 3)
@@ -0,0 +1,170 @@
+# filters.py
+# Copyright (C) 2006, 2007, 2008, 2009 Geoffrey T. Dairiki <dairiki@dairiki.org> and Michael Bayer <mike_mp@zzzcomputing.com>
+#
+# This module is part of Mako and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+
+import re, cgi, urllib, htmlentitydefs, codecs
+from StringIO import StringIO
+
+xml_escapes = {
+    '&' : '&amp;',
+    '>' : '&gt;', 
+    '<' : '&lt;', 
+    '"' : '&#34;',   # also &quot; in html-only
+    "'" : '&#39;'    # also &apos; in html-only    
+}
+# XXX: &quot; is valid in HTML and XML
+#      &apos; is not valid HTML, but is valid XML
+
+def html_escape(string):
+    return cgi.escape(string, True)
+
+def xml_escape(string):
+    return re.sub(r'([&<"\'>])', lambda m: xml_escapes[m.group()], string)
+
+def url_escape(string):
+    # convert into a list of octets
+    string = string.encode("utf8")
+    return urllib.quote_plus(string)
+
+def url_unescape(string):
+    text = urllib.unquote_plus(string)
+    if not is_ascii_str(text):
+        text = text.decode("utf8")
+    return text
+
+def trim(string):
+    return string.strip()
+
+
+class Decode(object):
+    def __getattr__(self, key):
+        def decode(x):
+            if isinstance(x, unicode):
+                return x
+            elif not isinstance(x, str):
+                return unicode(str(x), encoding=key)
+            else:
+                return unicode(x, encoding=key)
+        return decode
+decode = Decode()
+        
+            
+_ASCII_re = re.compile(r'\A[\x00-\x7f]*\Z')
+
+def is_ascii_str(text):
+    return isinstance(text, str) and _ASCII_re.match(text)
+
+################################################################    
+
+class XMLEntityEscaper(object):
+    def __init__(self, codepoint2name, name2codepoint):
+        self.codepoint2entity = dict([(c, u'&%s;' % n)
+                                      for c,n in codepoint2name.iteritems()])
+        self.name2codepoint = name2codepoint
+
+    def escape_entities(self, text):
+        """Replace characters with their character entity references.
+
+        Only characters corresponding to a named entity are replaced.
+        """
+        return unicode(text).translate(self.codepoint2entity)
+
+    def __escape(self, m):
+        codepoint = ord(m.group())
+        try:
+            return self.codepoint2entity[codepoint]
+        except (KeyError, IndexError):
+            return '&#x%X;' % codepoint
+
+
+    __escapable = re.compile(r'["&<>]|[^\x00-\x7f]')
+
+    def escape(self, text):
+        """Replace characters with their character references.
+
+        Replace characters by their named entity references.
+        Non-ASCII characters, if they do not have a named entity reference,
+        are replaced by numerical character references.
+
+        The return value is guaranteed to be ASCII.
+        """
+        return self.__escapable.sub(self.__escape, unicode(text)
+                                    ).encode('ascii')
+
+    # XXX: This regexp will not match all valid XML entity names__.
+    # (It punts on details involving involving CombiningChars and Extenders.)
+    #
+    # .. __: http://www.w3.org/TR/2000/REC-xml-20001006#NT-EntityRef
+    __characterrefs = re.compile(r'''& (?:
+                                          \#(\d+)
+                                          | \#x([\da-f]+)
+                                          | ( (?!\d) [:\w] [-.:\w]+ )
+                                          ) ;''',
+                                 re.X | re.UNICODE)
+    
+    def __unescape(self, m):
+        dval, hval, name = m.groups()
+        if dval:
+            codepoint = int(dval)
+        elif hval:
+            codepoint = int(hval, 16)
+        else:
+            codepoint = self.name2codepoint.get(name, 0xfffd)
+            # U+FFFD = "REPLACEMENT CHARACTER"
+        if codepoint < 128:
+            return chr(codepoint)
+        return unichr(codepoint)
+    
+    def unescape(self, text):
+        """Unescape character references.
+
+        All character references (both entity references and numerical
+        character references) are unescaped.
+        """
+        return self.__characterrefs.sub(self.__unescape, text)
+
+
+_html_entities_escaper = XMLEntityEscaper(htmlentitydefs.codepoint2name,
+                                          htmlentitydefs.name2codepoint)
+
+html_entities_escape = _html_entities_escaper.escape_entities
+html_entities_unescape = _html_entities_escaper.unescape
+
+
+def htmlentityreplace_errors(ex):
+    """An encoding error handler.
+
+    This python `codecs`_ error handler replaces unencodable
+    characters with HTML entities, or, if no HTML entity exists for
+    the character, XML character references.
+
+    >>> u'The cost was \u20ac12.'.encode('latin1', 'htmlentityreplace')
+    'The cost was &euro;12.'
+    """
+    if isinstance(ex, UnicodeEncodeError):
+        # Handle encoding errors
+        bad_text = ex.object[ex.start:ex.end]
+        text = _html_entities_escaper.escape(bad_text)
+        return (unicode(text), ex.end)
+    raise ex
+
+codecs.register_error('htmlentityreplace', htmlentityreplace_errors)
+
+
+# TODO: options to make this dynamic per-compilation will be added in a later release
+DEFAULT_ESCAPES = {
+    'x':'filters.xml_escape',
+    'h':'filters.html_escape',
+    'u':'filters.url_escape',
+    'trim':'filters.trim',
+    'entity':'filters.html_entities_escape',
+    'unicode':'unicode',
+    'decode':'decode',
+    'str':'str',
+    'n':'n'
+}
+    
+
Index: /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/mako/lookup.py
===================================================================
--- /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/mako/lookup.py (revision 3)
+++ /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/mako/lookup.py (revision 3)
@@ -0,0 +1,151 @@
+# lookup.py
+# Copyright (C) 2006, 2007, 2008, 2009 Michael Bayer mike_mp@zzzcomputing.com
+#
+# This module is part of Mako and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+import os, stat, posixpath, re
+from mako import exceptions, util
+from mako.template import Template
+
+try:
+    import threading
+except:
+    import dummy_threading as threading
+    
+class TemplateCollection(object):
+    def has_template(self, uri):
+        try:
+            self.get_template(uri)
+            return True
+        except exceptions.TemplateLookupException, e:
+            return False
+    def get_template(self, uri, relativeto=None):
+        raise NotImplementedError()
+    def filename_to_uri(self, uri, filename):
+        """convert the given filename to a uri relative to this TemplateCollection."""
+        return uri
+        
+    def adjust_uri(self, uri, filename):
+        """adjust the given uri based on the calling filename.
+        
+        when this method is called from the runtime, the 'filename' parameter 
+        is taken directly to the 'filename' attribute of the calling 
+        template.  Therefore a custom TemplateCollection subclass can place any string 
+        identifier desired in the "filename" parameter of the Template objects it constructs
+        and have them come back here."""
+        return uri
+        
+class TemplateLookup(TemplateCollection):
+    def __init__(self, directories=None, module_directory=None, filesystem_checks=True, collection_size=-1, format_exceptions=False, 
+    error_handler=None, disable_unicode=False, output_encoding=None, encoding_errors='strict', cache_type=None, cache_dir=None, cache_url=None, 
+    cache_enabled=True, modulename_callable=None, default_filters=None, buffer_filters=[], imports=None, input_encoding=None, preprocessor=None):
+        if isinstance(directories, basestring):
+            directories = [directories]        
+        self.directories = [posixpath.normpath(d) for d in directories or []]
+        self.module_directory = module_directory
+        self.modulename_callable = modulename_callable
+        self.filesystem_checks = filesystem_checks
+        self.collection_size = collection_size
+        self.template_args = {
+            'format_exceptions':format_exceptions, 
+            'error_handler':error_handler, 
+            'disable_unicode':disable_unicode, 
+            'output_encoding':output_encoding, 
+            'encoding_errors':encoding_errors, 
+            'input_encoding':input_encoding, 
+            'module_directory':module_directory, 
+            'cache_type':cache_type, 
+            'cache_dir':cache_dir or module_directory, 
+            'cache_url':cache_url, 
+            'cache_enabled':cache_enabled, 
+            'default_filters':default_filters, 
+            'buffer_filters':buffer_filters,  
+            'imports':imports, 
+            'preprocessor':preprocessor}
+        if collection_size == -1:
+            self.__collection = {}
+            self._uri_cache = {}
+        else:
+            self.__collection = util.LRUCache(collection_size)
+            self._uri_cache = util.LRUCache(collection_size)
+        self._mutex = threading.Lock()
+        
+    def get_template(self, uri):
+        try:
+            if self.filesystem_checks:
+                return self.__check(uri, self.__collection[uri])
+            else:
+                return self.__collection[uri]
+        except KeyError:
+            u = re.sub(r'^\/+', '', uri)
+            for dir in self.directories:
+                srcfile = posixpath.normpath(posixpath.join(dir, u))
+                if os.path.exists(srcfile):
+                    return self.__load(srcfile, uri)
+            else:
+                raise exceptions.TopLevelLookupException("Cant locate template for uri '%s'" % uri)
+
+    def adjust_uri(self, uri, relativeto):
+        """adjust the given uri based on the calling filename."""
+        
+        if uri[0] != '/':
+            if relativeto is not None:
+                return posixpath.join(posixpath.dirname(relativeto), uri)
+            else:
+                return '/' + uri
+        else:
+            return uri
+            
+    
+    def filename_to_uri(self, filename):
+        try:
+            return self._uri_cache[filename]
+        except KeyError:
+            value = self.__relativeize(filename)
+            self._uri_cache[filename] = value
+            return value
+                    
+    def __relativeize(self, filename):
+        """return the portion of a filename that is 'relative' to the directories in this lookup."""
+        filename = posixpath.normpath(filename)
+        for dir in self.directories:
+            if filename[0:len(dir)] == dir:
+                return filename[len(dir):]
+        else:
+            return None
+            
+    def __load(self, filename, uri):
+        self._mutex.acquire()
+        try:
+            try:
+                # try returning from collection one more time in case concurrent thread already loaded
+                return self.__collection[uri]
+            except KeyError:
+                pass
+            try:
+                self.__collection[uri] = Template(uri=uri, filename=posixpath.normpath(filename), lookup=self, module_filename=(self.modulename_callable is not None and self.modulename_callable(filename, uri) or None), **self.template_args)
+                return self.__collection[uri]
+            except:
+                self.__collection.pop(uri, None)
+                raise
+        finally:
+            self._mutex.release()
+            
+    def __check(self, uri, template):
+        if template.filename is None:
+            return template
+        if not os.path.exists(template.filename):
+            self.__collection.pop(uri, None)
+            raise exceptions.TemplateLookupException("Cant locate template for uri '%s'" % uri)
+        elif template.module._modified_time < os.stat(template.filename)[stat.ST_MTIME]:
+            self.__collection.pop(uri, None)
+            return self.__load(template.filename, uri)
+        else:
+            return template
+            
+    def put_string(self, uri, text):
+        self.__collection[uri] = Template(text, lookup=self, uri=uri, **self.template_args)
+    def put_template(self, uri, template):
+        self.__collection[uri] = template
+            
Index: /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/mako/ext/preprocessors.py
===================================================================
--- /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/mako/ext/preprocessors.py (revision 3)
+++ /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/mako/ext/preprocessors.py (revision 3)
@@ -0,0 +1,20 @@
+"""preprocessing functions, used with the 'preprocessor' argument on Template, TemplateLookup"""
+
+import re
+
+def convert_comments(text):
+    """preprocess old style comments.
+    
+    example:
+    
+    from mako.ext.preprocessors import convert_comments
+    t = Template(..., preprocessor=preprocess_comments)"""
+    return re.sub(r'(?<=\n)\s*#[^#]', "##", text)
+
+# TODO
+def create_tag(callable):
+    """given a callable, extract the *args and **kwargs, and produce a preprocessor
+    that will parse for <%<funcname> <args>> and convert to an appropriate <%call> statement.
+    
+    this allows any custom tag to be created which looks like a pure Mako-style tag."""
+    raise NotImplementedError("Future functionality....")
Index: /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/mako/ext/turbogears.py
===================================================================
--- /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/mako/ext/turbogears.py (revision 3)
+++ /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/mako/ext/turbogears.py (revision 3)
@@ -0,0 +1,50 @@
+import re, inspect
+from mako.lookup import TemplateLookup
+from mako.template import Template
+
+class TGPlugin(object):
+    """TurboGears compatible Template Plugin."""
+
+    def __init__(self, extra_vars_func=None, options=None, extension='mak'):
+        self.extra_vars_func = extra_vars_func
+        self.extension = extension
+        if not options:
+            options = {}
+
+        # Pull the options out and initialize the lookup
+        lookup_options = {}
+        for k, v in options.iteritems():
+            if k.startswith('mako.'):
+                lookup_options[k[5:]] = v
+            elif k in ['directories', 'filesystem_checks', 'module_directory']:
+                lookup_options[k] = v
+        self.lookup = TemplateLookup(**lookup_options)
+        
+        self.tmpl_options = {}
+        # transfer lookup args to template args, based on those available
+        # in getargspec
+        for kw in inspect.getargspec(Template.__init__)[0]:
+            if kw in lookup_options:
+                self.tmpl_options[kw] = lookup_options[kw]
+
+    def load_template(self, templatename, template_string=None):
+        """Loads a template from a file or a string"""
+        if template_string is not None:
+            return Template(template_string, **self.tmpl_options)
+        # Translate TG dot notation to normal / template path
+        if '/' not in templatename:
+            templatename = '/' + templatename.replace('.', '/') + '.' + self.extension
+
+        # Lookup template
+        return self.lookup.get_template(templatename)
+
+    def render(self, info, format="html", fragment=False, template=None):
+        if isinstance(template, basestring):
+            template = self.load_template(template)
+
+        # Load extra vars func if provided
+        if self.extra_vars_func:
+            info.update(self.extra_vars_func())
+
+        return template.render(**info)
+
Index: /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/mako/ext/pygmentplugin.py
===================================================================
--- /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/mako/ext/pygmentplugin.py (revision 3)
+++ /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/mako/ext/pygmentplugin.py (revision 3)
@@ -0,0 +1,101 @@
+import re
+try:
+    set
+except NameError:
+    from sets import Set as set
+
+from pygments.lexers.web import \
+     HtmlLexer, XmlLexer, JavascriptLexer, CssLexer
+from pygments.lexers.agile import PythonLexer
+from pygments.lexer import Lexer, DelegatingLexer, RegexLexer, bygroups, \
+     include, using, this
+from pygments.token import Error, Punctuation, \
+     Text, Comment, Operator, Keyword, Name, String, Number, Other, Literal
+from pygments.util import html_doctype_matches, looks_like_xml
+
+class MakoLexer(RegexLexer):
+    name = 'Mako'
+    aliases = ['mako']
+    filenames = ['*.mao']
+
+    tokens = {
+        'root': [
+            (r'(\s*)(\%)(\s*end(?:\w+))(\n|\Z)',
+             bygroups(Text, Comment.Preproc, Keyword, Other)),
+            (r'(\s*)(\%)([^\n]*)(\n|\Z)',
+             bygroups(Text, Comment.Preproc, using(PythonLexer), Other)),
+             (r'(\s*)(##[^\n]*)(\n|\Z)',
+              bygroups(Text, Comment.Preproc, Other)),
+              (r'''(?s)<%doc>.*?</%doc>''', Comment.Preproc),
+            (r'(<%)([\w\.\:]+)', bygroups(Comment.Preproc, Name.Builtin), 'tag'),
+            (r'(</%)([\w\.\:]+)(>)', bygroups(Comment.Preproc, Name.Builtin, Comment.Preproc)),
+            (r'<%(?=([\w\.\:]+))', Comment.Preproc, 'ondeftags'),
+            (r'(<%(?:!?))(.*?)(%>)(?s)', bygroups(Comment.Preproc, using(PythonLexer), Comment.Preproc)),
+            (r'(\$\{)(.*?)(\})',
+             bygroups(Comment.Preproc, using(PythonLexer), Comment.Preproc)),
+            (r'''(?sx)
+                (.+?)               # anything, followed by:
+                (?:
+                 (?<=\n)(?=%|\#\#) |  # an eval or comment line
+                 (?=\#\*) |          # multiline comment
+                 (?=</?%) |         # a python block
+                                    # call start or end
+                 (?=\$\{) |         # a substitution
+                 (?<=\n)(?=\s*%) |
+                                    # - don't consume
+                 (\\\n) |           # an escaped newline
+                 \Z                 # end of string
+                )
+            ''', bygroups(Other, Operator)),
+            (r'\s+', Text),
+        ],
+        'ondeftags': [
+            (r'<%', Comment.Preproc),
+            (r'(?<=<%)(include|inherit|namespace|page)', Name.Builtin),
+            include('tag'),
+        ],
+        'tag': [
+            (r'((?:\w+)\s*=)\s*(".*?")',
+             bygroups(Name.Attribute, String)),
+            (r'/?\s*>', Comment.Preproc, '#pop'),
+            (r'\s+', Text),
+        ],
+        'attr': [
+            ('".*?"', String, '#pop'),
+            ("'.*?'", String, '#pop'),
+            (r'[^\s>]+', String, '#pop'),
+        ],
+    }
+
+
+class MakoHtmlLexer(DelegatingLexer):
+    name = 'HTML+Mako'
+    aliases = ['html+mako']
+
+    def __init__(self, **options):
+        super(MakoHtmlLexer, self).__init__(HtmlLexer, MakoLexer,
+                                              **options)
+
+class MakoXmlLexer(DelegatingLexer):
+    name = 'XML+Mako'
+    aliases = ['xml+mako']
+
+    def __init__(self, **options):
+        super(MakoXmlLexer, self).__init__(XmlLexer, MakoLexer,
+                                             **options)
+
+class MakoJavascriptLexer(DelegatingLexer):
+    name = 'JavaScript+Mako'
+    aliases = ['js+mako', 'javascript+mako']
+
+    def __init__(self, **options):
+        super(MakoJavascriptLexer, self).__init__(JavascriptLexer,
+                                                    MakoLexer, **options)
+
+class MakoCssLexer(DelegatingLexer):
+    name = 'CSS+Mako'
+    aliases = ['css+mako']
+
+    def __init__(self, **options):
+        super(MakoCssLexer, self).__init__(CssLexer, MakoLexer,
+                                             **options)
Index: /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/mako/ext/babelplugin.py
===================================================================
--- /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/mako/ext/babelplugin.py (revision 3)
+++ /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/mako/ext/babelplugin.py (revision 3)
@@ -0,0 +1,118 @@
+"""gettext message extraction via Babel: http://babel.edgewall.org/"""
+from StringIO import StringIO
+
+from babel.messages.extract import extract_python
+
+from mako import lexer, parsetree
+
+def extract(fileobj, keywords, comment_tags, options):
+    """Extract messages from Mako templates.
+
+    :param fileobj: the file-like object the messages should be extracted from
+    :param keywords: a list of keywords (i.e. function names) that should be
+                     recognized as translation functions
+    :param comment_tags: a list of translator tags to search for and include
+                         in the results
+    :param options: a dictionary of additional options (optional)
+    :return: an iterator over ``(lineno, funcname, message, comments)`` tuples
+    :rtype: ``iterator``
+    """
+    encoding = options.get('input_encoding', options.get('encoding', None))
+
+    template_node = lexer.Lexer(fileobj.read(),
+                                input_encoding=encoding).parse()
+    for extracted in extract_nodes(template_node.get_children(),
+                                   keywords, comment_tags, options):
+        yield extracted
+
+def extract_nodes(nodes, keywords, comment_tags, options):
+    """Extract messages from Mako's lexer node objects
+
+    :param nodes: an iterable of Mako parsetree.Node objects to extract from
+    :param keywords: a list of keywords (i.e. function names) that should be
+                     recognized as translation functions
+    :param comment_tags: a list of translator tags to search for and include
+                         in the results
+    :param options: a dictionary of additional options (optional)
+    :return: an iterator over ``(lineno, funcname, message, comments)`` tuples
+    :rtype: ``iterator``
+    """
+    translator_comments = []
+    in_translator_comments = False
+
+    for node in nodes:
+        child_nodes = None
+        if in_translator_comments and isinstance(node, parsetree.Text) and \
+                not node.content.strip():
+            # Ignore whitespace within translator comments
+            continue
+
+        if isinstance(node, parsetree.Comment):
+            value = node.text.strip()
+            if in_translator_comments:
+                translator_comments.extend(_split_comment(node.lineno, value))
+                continue
+            for comment_tag in comment_tags:
+                if value.startswith(comment_tag):
+                    in_translator_comments = True
+                    translator_comments.extend(_split_comment(node.lineno,
+                                                              value))
+            continue
+
+        if isinstance(node, parsetree.DefTag):
+            code = node.function_decl.code
+            child_nodes = node.nodes
+        elif isinstance(node, parsetree.CallTag):
+            code = node.code.code
+            child_nodes = node.nodes
+        elif isinstance(node, parsetree.PageTag):
+            code = node.body_decl.code
+        elif isinstance(node, parsetree.ControlLine):
+            if node.isend:
+                translator_comments = []
+                in_translator_comments = False
+                continue
+            code = node.text
+        elif isinstance(node, parsetree.Code):
+            # <% and <%! blocks would provide their own translator comments
+            translator_comments = []
+            in_translator_comments = False
+
+            code = node.code.code
+        elif isinstance(node, parsetree.Expression):
+            code = node.code.code
+        else:
+            translator_comments = []
+            in_translator_comments = False
+            continue
+
+        # Comments don't apply unless they immediately preceed the message
+        if translator_comments and \
+                translator_comments[-1][0] < node.lineno - 1:
+            translator_comments = []
+        else:
+            translator_comments = \
+                [comment[1] for comment in translator_comments]
+
+        if isinstance(code, unicode):
+            code = code.encode('ascii', 'backslashreplace')
+        code = StringIO(code)
+        for lineno, funcname, messages, python_translator_comments \
+                in extract_python(code, keywords, comment_tags, options):
+            yield (node.lineno + (lineno - 1), funcname, messages,
+                   translator_comments + python_translator_comments)
+
+        translator_comments = []
+        in_translator_comments = False
+
+        if child_nodes:
+            for extracted in extract_nodes(child_nodes, keywords, comment_tags,
+                                           options):
+                yield extracted
+
+
+def _split_comment(lineno, comment):
+    """Return the multiline comment at lineno split into a list of comment line
+    numbers and the accompanying comment line"""
+    return [(lineno + index, line) for index, line in
+            enumerate(comment.splitlines())]
Index: /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/mako/ext/autohandler.py
===================================================================
--- /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/mako/ext/autohandler.py (revision 3)
+++ /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/mako/ext/autohandler.py (revision 3)
@@ -0,0 +1,57 @@
+"""adds autohandler functionality to Mako templates.
+
+requires that the TemplateLookup class is used with templates.
+
+usage:
+
+<%!
+	from mako.ext.autohandler import autohandler
+%>
+<%inherit file="${autohandler(template, context)}"/>
+
+
+or with custom autohandler filename:
+
+<%!
+	from mako.ext.autohandler import autohandler
+%>
+<%inherit file="${autohandler(template, context, name='somefilename')}"/>
+
+"""
+
+import posixpath, os, re
+
+def autohandler(template, context, name='autohandler'):
+    lookup = context.lookup
+    _template_uri = template.module._template_uri
+    if not lookup.filesystem_checks:
+        try:
+            return lookup._uri_cache[(autohandler, _template_uri, name)]
+        except KeyError:
+            pass
+
+    tokens = re.findall(r'([^/]+)', posixpath.dirname(_template_uri)) + [name]
+    while len(tokens):
+        path = '/' + '/'.join(tokens)
+        if path != _template_uri and _file_exists(lookup, path):
+            if not lookup.filesystem_checks:
+                return lookup._uri_cache.setdefault((autohandler, _template_uri, name), path)
+            else:
+                return path
+        if len(tokens) == 1:
+            break
+        tokens[-2:] = [name]
+        
+    if not lookup.filesystem_checks:
+        return lookup._uri_cache.setdefault((autohandler, _template_uri, name), None)
+    else:
+        return None
+
+def _file_exists(lookup, path):
+    psub = re.sub(r'^/', '',path)
+    for d in lookup.directories:
+        if os.path.exists(d + '/' + psub):
+            return True
+    else:
+        return False
+    
Index: /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/mako/template.py
===================================================================
--- /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/mako/template.py (revision 3)
+++ /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/mako/template.py (revision 3)
@@ -0,0 +1,283 @@
+# template.py
+# Copyright (C) 2006, 2007, 2008, 2009 Michael Bayer mike_mp@zzzcomputing.com
+#
+# This module is part of Mako and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+"""provides the Template class, a facade for parsing, generating and executing template strings,
+as well as template runtime operations."""
+
+from mako.lexer import Lexer
+from mako import codegen
+from mako import runtime, util, exceptions
+import imp, os, re, shutil, stat, sys, tempfile, time, types, weakref
+
+    
+class Template(object):
+    """a compiled template"""
+    def __init__(self, text=None, filename=None, uri=None, format_exceptions=False, error_handler=None, 
+        lookup=None, output_encoding=None, encoding_errors='strict', module_directory=None, cache_type=None, 
+        cache_dir=None, cache_url=None, module_filename=None, input_encoding=None, disable_unicode=False, default_filters=None, 
+        buffer_filters=[], imports=None, preprocessor=None, cache_enabled=True):
+        """construct a new Template instance using either literal template text, or a previously loaded template module
+        
+        text - textual template source, or None if a module is to be provided
+        
+        uri - the uri of this template, or some identifying string. defaults to the 
+        full filename given, or "memory:(hex id of this Template)" if no filename
+        
+        filename - filename of the source template, if any
+        
+        format_exceptions - catch exceptions and format them into an error display template
+        """
+        
+        if uri:
+            self.module_id = re.sub(r'\W', "_", uri)
+            self.uri = uri
+        elif filename:
+            self.module_id = re.sub(r'\W', "_", filename)
+            self.uri = filename
+        else:
+            self.module_id = "memory:" + hex(id(self))
+            self.uri = self.module_id
+        
+        self.input_encoding = input_encoding
+        self.output_encoding = output_encoding
+        self.encoding_errors = encoding_errors
+        self.disable_unicode = disable_unicode
+        if default_filters is None:
+            if self.disable_unicode:
+                self.default_filters = ['str']
+            else:
+                self.default_filters = ['unicode']
+        else:
+            self.default_filters = default_filters
+        self.buffer_filters = buffer_filters
+            
+        self.imports = imports
+        self.preprocessor = preprocessor
+        
+        # if plain text, compile code in memory only
+        if text is not None:
+            (code, module) = _compile_text(self, text, filename)
+            self._code = code
+            self._source = text
+            ModuleInfo(module, None, self, filename, code, text)
+        elif filename is not None:
+            # if template filename and a module directory, load
+            # a filesystem-based module file, generating if needed
+            if module_filename is not None:
+                path = module_filename
+            elif module_directory is not None:
+                u = self.uri
+                if u[0] == '/':
+                    u = u[1:]
+                path = os.path.abspath(os.path.join(module_directory.replace('/', os.path.sep), u + ".py"))
+            else:
+                path = None    
+            if path is not None:
+                util.verify_directory(os.path.dirname(path))
+                filemtime = os.stat(filename)[stat.ST_MTIME]
+                if not os.path.exists(path) or os.stat(path)[stat.ST_MTIME] < filemtime:
+                    _compile_module_file(self, file(filename).read(), filename, path)
+                module = imp.load_source(self.module_id, path, file(path))
+                del sys.modules[self.module_id]
+                if module._magic_number != codegen.MAGIC_NUMBER:
+                    _compile_module_file(self, file(filename).read(), filename, path)
+                    module = imp.load_source(self.module_id, path, file(path))
+                    del sys.modules[self.module_id]
+                ModuleInfo(module, path, self, filename, None, None)
+            else:
+                # template filename and no module directory, compile code
+                # in memory
+                (code, module) = _compile_text(self, file(filename).read(), filename)
+                self._source = None
+                self._code = code
+                ModuleInfo(module, None, self, filename, code, None)
+        else:
+            raise exceptions.RuntimeException("Template requires text or filename")
+
+        self.module = module
+        self.filename = filename
+        self.callable_ = self.module.render_body
+        self.format_exceptions = format_exceptions
+        self.error_handler = error_handler
+        self.lookup = lookup
+        self.cache_type = cache_type
+        self.cache_dir = cache_dir
+        self.cache_url = cache_url
+        self.cache_enabled = cache_enabled
+
+    def source(self):
+        """return the template source code for this Template."""
+        return _get_module_info_from_callable(self.callable_).source
+    source = property(source)
+    
+    def code(self):
+        """return the module source code for this Template"""
+        return _get_module_info_from_callable(self.callable_).code
+    code = property(code)
+    
+    def cache(self):
+        return self.module._template_cache
+    cache = property(cache)
+    
+    def render(self, *args, **data):
+        """render the output of this template as a string.
+        
+        if the template specifies an output encoding, the string will be encoded accordingly, else the output
+        is raw (raw output uses cStringIO and can't handle multibyte characters).
+        a Context object is created corresponding to the given data.  Arguments that are explictly
+        declared by this template's internal rendering method are also pulled from the given *args, **data 
+        members."""
+        return runtime._render(self, self.callable_, args, data)
+    
+    def render_unicode(self, *args, **data):
+        """render the output of this template as a unicode object."""
+        
+        return runtime._render(self, self.callable_, args, data, as_unicode=True)
+        
+    def render_context(self, context, *args, **kwargs):
+        """render this Template with the given context.  
+        
+        the data is written to the context's buffer."""
+        if getattr(context, '_with_template', None) is None:
+            context._with_template = self
+        runtime._render_context(self, self.callable_, context, *args, **kwargs)
+    
+    def has_def(self, name):
+        return hasattr(self.module, "render_%s" % name)
+        
+    def get_def(self, name):
+        """return a def of this template as an individual Template of its own."""
+        return DefTemplate(self, getattr(self.module, "render_%s" % name))
+
+    def _get_def_callable(self, name):
+        return getattr(self.module, "render_%s" % name)
+    
+    def last_modified(self): 
+        return self.module._modified_time    
+    last_modified = property(last_modified)
+    
+class ModuleTemplate(Template):
+    """A Template which is constructed given an existing Python module.
+    
+        e.g.::
+        
+        t = Template("this is a template")
+        f = file("mymodule.py", "w")
+        f.write(t.code)
+        f.close()
+        
+        import mymodule
+        
+        t = ModuleTemplate(mymodule)
+        print t.render()
+    
+    """
+    
+    def __init__(self, module, 
+        module_filename=None, 
+        template=None, template_filename=None, 
+        module_source=None, template_source=None,
+        output_encoding=None, encoding_errors='strict', disable_unicode=False, format_exceptions=False,
+        error_handler=None, lookup=None, cache_type=None, cache_dir=None, cache_url=None, cache_enabled=True
+    ):
+        self.module_id = re.sub(r'\W', "_", module._template_uri)
+        self.uri = module._template_uri
+        self.input_encoding = module._source_encoding
+        self.output_encoding = output_encoding
+        self.encoding_errors = encoding_errors
+        self.disable_unicode = disable_unicode
+        self.module = module
+        self.filename = template_filename
+        ModuleInfo(module, module_filename, self, template_filename, module_source, template_source)
+        
+        self.callable_ = self.module.render_body
+        self.format_exceptions = format_exceptions
+        self.error_handler = error_handler
+        self.lookup = lookup
+        self.cache_type = cache_type
+        self.cache_dir = cache_dir
+        self.cache_url = cache_url
+        self.cache_enabled = cache_enabled
+        
+class DefTemplate(Template):
+    """a Template which represents a callable def in a parent template."""
+    def __init__(self, parent, callable_):
+        self.parent = parent
+        self.callable_ = callable_
+        self.output_encoding = parent.output_encoding
+        self.module = parent.module
+        self.encoding_errors = parent.encoding_errors
+        self.format_exceptions = parent.format_exceptions
+        self.error_handler = parent.error_handler
+        self.lookup = parent.lookup
+
+    def get_def(self, name):
+        return self.parent.get_def(name)
+
+class ModuleInfo(object):
+    """stores information about a module currently loaded into memory,
+    provides reverse lookups of template source, module source code based on
+    a module's identifier."""
+    _modules = weakref.WeakValueDictionary()
+
+    def __init__(self, module, module_filename, template, template_filename, module_source, template_source):
+        self.module = module
+        self.module_filename = module_filename
+        self.template_filename = template_filename
+        self.module_source = module_source
+        self.template_source = template_source
+        self._modules[module.__name__] = template._mmarker = self
+        if module_filename:
+            self._modules[module_filename] = self
+    def _get_code(self):
+        if self.module_source is not None:
+            return self.module_source
+        else:
+            return file(self.module_filename).read()
+    code = property(_get_code)
+    def _get_source(self):
+        if self.template_source is not None:
+            if self.module._source_encoding and not isinstance(self.template_source, unicode):
+                return self.template_source.decode(self.module._source_encoding)
+            else:
+                return self.template_source
+        else:
+            if self.module._source_encoding:
+                return file(self.template_filename).read().decode(self.module._source_encoding)
+            else:
+                return file(self.template_filename).read()
+    source = property(_get_source)
+        
+def _compile_text(template, text, filename):
+    identifier = template.module_id
+    lexer = Lexer(text, filename, disable_unicode=template.disable_unicode, input_encoding=template.input_encoding, preprocessor=template.preprocessor)
+    node = lexer.parse()
+    source = codegen.compile(node, template.uri, filename, default_filters=template.default_filters, buffer_filters=template.buffer_filters, imports=template.imports, source_encoding=lexer.encoding, generate_unicode=not template.disable_unicode)
+    #print source
+    cid = identifier
+    if isinstance(cid, unicode):
+        cid = cid.encode()
+    module = types.ModuleType(cid)
+    code = compile(source, cid, 'exec')
+    exec code in module.__dict__, module.__dict__
+    return (source, module)
+
+def _compile_module_file(template, text, filename, outputpath):
+    identifier = template.module_id
+    lexer = Lexer(text, filename, disable_unicode=template.disable_unicode, input_encoding=template.input_encoding, preprocessor=template.preprocessor)
+    node = lexer.parse()
+    source = codegen.compile(node, template.uri, filename, default_filters=template.default_filters, buffer_filters=template.buffer_filters, imports=template.imports, source_encoding=lexer.encoding, generate_unicode=not template.disable_unicode)
+    (dest, name) = tempfile.mkstemp()
+    os.write(dest, source)
+    os.close(dest)
+    shutil.move(name, outputpath)
+
+def _get_module_info_from_callable(callable_):
+    return _get_module_info(callable_.func_globals['__name__'])
+    
+def _get_module_info(filename):
+    return ModuleInfo._modules[filename]
+        
Index: /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/mako/util.py
===================================================================
--- /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/mako/util.py (revision 3)
+++ /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/mako/util.py (revision 3)
@@ -0,0 +1,266 @@
+# util.py
+# Copyright (C) 2006, 2007, 2008, 2009 Michael Bayer mike_mp@zzzcomputing.com
+#
+# This module is part of Mako and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+import sys
+try:
+    Set = set
+except:
+    import sets
+    Set = sets.Set
+
+try:
+    from cStringIO import StringIO
+except:
+    from StringIO import StringIO
+
+import codecs, re, weakref, os, time
+
+try:
+    import threading
+    import thread
+except ImportError:
+    import dummy_threading as threading
+    import dummy_thread as thread
+
+if sys.platform.startswith('win') or sys.platform.startswith('java'):
+    time_func = time.clock
+else:
+    time_func = time.time 
+   
+def verify_directory(dir):
+    """create and/or verify a filesystem directory."""
+    
+    tries = 0
+    
+    while not os.path.exists(dir):
+        try:
+            tries += 1
+            os.makedirs(dir, 0775)
+        except:
+            if tries > 5:
+                raise
+
+class SetLikeDict(dict):
+    """a dictionary that has some setlike methods on it"""
+    def union(self, other):
+        """produce a 'union' of this dict and another (at the key level).
+        
+        values in the second dict take precedence over that of the first"""
+        x = SetLikeDict(**self)
+        x.update(other)
+        return x
+
+class FastEncodingBuffer(object):
+    """a very rudimentary buffer that is faster than StringIO, but doesnt crash on unicode data like cStringIO."""
+    
+    def __init__(self, encoding=None, errors='strict', unicode=False):
+        self.data = []
+        self.encoding = encoding
+        if unicode:
+            self.delim = u''
+        else:
+            self.delim = ''
+        self.unicode = unicode
+        self.errors = errors
+        self.write = self.data.append
+        
+    def getvalue(self):
+        if self.encoding:
+            return self.delim.join(self.data).encode(self.encoding, self.errors)
+        else:
+            return self.delim.join(self.data)
+
+class LRUCache(dict):
+    """A dictionary-like object that stores a limited number of items, discarding
+    lesser used items periodically.
+    
+    this is a rewrite of LRUCache from Myghty to use a periodic timestamp-based
+    paradigm so that synchronization is not really needed.  the size management 
+    is inexact.
+    """
+    
+    class _Item(object):
+        def __init__(self, key, value):
+            self.key = key
+            self.value = value
+            self.timestamp = time_func()
+        def __repr__(self):
+            return repr(self.value)
+    
+    def __init__(self, capacity, threshold=.5):
+        self.capacity = capacity
+        self.threshold = threshold
+    
+    def __getitem__(self, key):
+        item = dict.__getitem__(self, key)
+        item.timestamp = time_func()
+        return item.value
+    
+    def values(self):
+        return [i.value for i in dict.values(self)]
+    
+    def setdefault(self, key, value):
+        if key in self:
+            return self[key]
+        else:
+            self[key] = value
+            return value
+    
+    def __setitem__(self, key, value):
+        item = dict.get(self, key)
+        if item is None:
+            item = self._Item(key, value)
+            dict.__setitem__(self, key, item)
+        else:
+            item.value = value
+        self._manage_size()
+    
+    def _manage_size(self):
+        while len(self) > self.capacity + self.capacity * self.threshold:
+            bytime = dict.values(self)
+            bytime.sort(lambda a, b: cmp(b.timestamp, a.timestamp))
+            for item in bytime[self.capacity:]:
+                try:
+                    del self[item.key]
+                except KeyError:
+                    # if we couldnt find a key, most likely some other thread broke in 
+                    # on us. loop around and try again
+                    break
+
+# Regexp to match python magic encoding line
+_PYTHON_MAGIC_COMMENT_re = re.compile(
+    r'[ \t\f]* \# .* coding[=:][ \t]*([-\w.]+)',
+    re.VERBOSE)
+
+def parse_encoding(fp):
+    """Deduce the encoding of a source file from magic comment.
+
+    It does this in the same way as the `Python interpreter`__
+
+    .. __: http://docs.python.org/ref/encodings.html
+
+    The ``fp`` argument should be a seekable file object.
+    """
+    pos = fp.tell()
+    fp.seek(0)
+    try:
+        line1 = fp.readline()
+        has_bom = line1.startswith(codecs.BOM_UTF8)
+        if has_bom:
+            line1 = line1[len(codecs.BOM_UTF8):]
+
+        m = _PYTHON_MAGIC_COMMENT_re.match(line1)
+        if not m:
+            try:
+                import parser
+                parser.suite(line1)
+            except (ImportError, SyntaxError):
+                # Either it's a real syntax error, in which case the source
+                # is not valid python source, or line2 is a continuation of
+                # line1, in which case we don't want to scan line2 for a magic
+                # comment.
+                pass
+            else:
+                line2 = fp.readline()
+                m = _PYTHON_MAGIC_COMMENT_re.match(line2)
+
+        if has_bom:
+            if m:
+                raise SyntaxError, \
+                      "python refuses to compile code with both a UTF8" \
+                      " byte-order-mark and a magic encoding comment"
+            return 'utf_8'
+        elif m:
+            return m.group(1)
+        else:
+            return None
+    finally:
+        fp.seek(pos)
+
+def sorted_dict_repr(d):
+    """repr() a dictionary with the keys in order.
+    
+    Used by the lexer unit test to compare parse trees based on strings.
+    
+    """
+    keys = d.keys()
+    keys.sort()
+    return "{" + ", ".join(["%r: %r" % (k, d[k]) for k in keys]) + "}"
+    
+def restore__ast(_ast):
+    """Attempt to restore the required classes to the _ast module if it
+    appears to be missing them
+    """
+    if hasattr(_ast, 'AST'):
+        return
+    _ast.PyCF_ONLY_AST = 2 << 9
+    m = compile("""\
+def foo(): pass
+class Bar(object): pass
+if False: pass
+baz = 'mako'
+1 + 2 - 3 * 4 / 5
+6 // 7 % 8 << 9 >> 10
+11 & 12 ^ 13 | 14
+15 and 16 or 17
+-baz + (not +18) - ~17
+baz and 'foo' or 'bar'
+(mako is baz == baz) is not baz != mako
+mako > baz < mako >= baz <= mako
+mako in baz not in mako""", '<unknown>', 'exec', _ast.PyCF_ONLY_AST)
+    _ast.Module = type(m)
+
+    for cls in _ast.Module.__mro__:
+        if cls.__name__ == 'mod':
+            _ast.mod = cls
+        elif cls.__name__ == 'AST':
+            _ast.AST = cls
+
+    _ast.FunctionDef = type(m.body[0])
+    _ast.ClassDef = type(m.body[1])
+    _ast.If = type(m.body[2])
+
+    _ast.Name = type(m.body[3].targets[0])
+    _ast.Store = type(m.body[3].targets[0].ctx)
+    _ast.Str = type(m.body[3].value)
+
+    _ast.Sub = type(m.body[4].value.op)
+    _ast.Add = type(m.body[4].value.left.op)
+    _ast.Div = type(m.body[4].value.right.op)
+    _ast.Mult = type(m.body[4].value.right.left.op)
+
+    _ast.RShift = type(m.body[5].value.op)
+    _ast.LShift = type(m.body[5].value.left.op)
+    _ast.Mod = type(m.body[5].value.left.left.op)
+    _ast.FloorDiv = type(m.body[5].value.left.left.left.op)
+
+    _ast.BitOr = type(m.body[6].value.op)
+    _ast.BitXor = type(m.body[6].value.left.op)
+    _ast.BitAnd = type(m.body[6].value.left.left.op)
+
+    _ast.Or = type(m.body[7].value.op)
+    _ast.And = type(m.body[7].value.values[0].op)
+
+    _ast.Invert = type(m.body[8].value.right.op)
+    _ast.Not = type(m.body[8].value.left.right.op)
+    _ast.UAdd = type(m.body[8].value.left.right.operand.op)
+    _ast.USub = type(m.body[8].value.left.left.op)
+
+    _ast.Or = type(m.body[9].value.op)
+    _ast.And = type(m.body[9].value.values[0].op)
+
+    _ast.IsNot = type(m.body[10].value.ops[0])
+    _ast.NotEq = type(m.body[10].value.ops[1])
+    _ast.Is = type(m.body[10].value.left.ops[0])
+    _ast.Eq = type(m.body[10].value.left.ops[1])
+
+    _ast.Gt = type(m.body[11].value.ops[0])
+    _ast.Lt = type(m.body[11].value.ops[1])
+    _ast.GtE = type(m.body[11].value.ops[2])
+    _ast.LtE = type(m.body[11].value.ops[3])
+
+    _ast.In = type(m.body[12].value.ops[0])
+    _ast.NotIn = type(m.body[12].value.ops[1])
Index: /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/mako/lexer.py
===================================================================
--- /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/mako/lexer.py (revision 3)
+++ /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/mako/lexer.py (revision 3)
@@ -0,0 +1,328 @@
+# lexer.py
+# Copyright (C) 2006, 2007, 2008, 2009 Michael Bayer mike_mp@zzzcomputing.com
+#
+# This module is part of Mako and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+"""provides the Lexer class for parsing template strings into parse trees."""
+
+import re, codecs
+from mako import parsetree, exceptions
+from mako.pygen import adjust_whitespace
+
+_regexp_cache = {}
+
+class Lexer(object):
+    def __init__(self, text, filename=None, disable_unicode=False, input_encoding=None, preprocessor=None):
+        self.text = text
+        self.filename = filename
+        self.template = parsetree.TemplateNode(self.filename)
+        self.matched_lineno = 1
+        self.matched_charpos = 0
+        self.lineno = 1
+        self.match_position = 0
+        self.tag = []
+        self.control_line = []
+        self.disable_unicode = disable_unicode
+        self.encoding = input_encoding
+        if preprocessor is None:
+            self.preprocessor = []
+        elif not hasattr(preprocessor, '__iter__'):
+            self.preprocessor = [preprocessor]
+        else:
+            self.preprocessor = preprocessor
+            
+    exception_kwargs = property(lambda self:{'source':self.text, 'lineno':self.matched_lineno, 'pos':self.matched_charpos, 'filename':self.filename})
+    
+    def match(self, regexp, flags=None):
+        """match the given regular expression string and flags to the current text position.
+        
+        if a match occurs, update the current text and line position."""
+        mp = self.match_position
+        try:
+            reg = _regexp_cache[(regexp, flags)]
+        except KeyError:
+            if flags:
+                reg = re.compile(regexp, flags)
+            else:
+                reg = re.compile(regexp)
+            _regexp_cache[(regexp, flags)] = reg
+
+        match = reg.match(self.text, self.match_position)
+        if match:
+            (start, end) = match.span()
+            if end == start:
+                self.match_position = end + 1
+            else:
+                self.match_position = end
+            self.matched_lineno = self.lineno
+            lines = re.findall(r"\n", self.text[mp:self.match_position])
+            cp = mp - 1
+            while (cp >= 0 and cp<self.textlength and self.text[cp] != '\n'):
+                cp -=1
+            self.matched_charpos = mp - cp
+            self.lineno += len(lines)
+            #print "MATCHED:", match.group(0), "LINE START:", self.matched_lineno, "LINE END:", self.lineno
+        #print "MATCH:", regexp, "\n", self.text[mp : mp + 15], (match and "TRUE" or "FALSE")
+        return match
+    
+    def parse_until_text(self, *text):
+        startpos = self.match_position
+        while True:
+            match = self.match(r'#.*\n')
+            if match:
+                continue
+            match = self.match(r'(\"\"\"|\'\'\'|\"|\')')
+            if match:
+                m = self.match(r'.*?%s' % match.group(1), re.S)
+                if not m:
+                    raise exceptions.SyntaxException("Unmatched '%s'" % match.group(1), **self.exception_kwargs)
+            else:
+                match = self.match(r'(%s)' % r'|'.join(text))
+                if match:
+                    return (self.text[startpos:self.match_position-len(match.group(1))], match.group(1))
+                else:
+                    match = self.match(r".*?(?=\"|\'|#|%s)" % r'|'.join(text), re.S)
+                    if not match:
+                        raise exceptions.SyntaxException("Expected: %s" % ','.join(text), **self.exception_kwargs)
+                
+    def append_node(self, nodecls, *args, **kwargs):
+        kwargs.setdefault('source', self.text)
+        kwargs.setdefault('lineno', self.matched_lineno)
+        kwargs.setdefault('pos', self.matched_charpos)
+        kwargs['filename'] = self.filename
+        node = nodecls(*args, **kwargs)
+        if len(self.tag):
+            self.tag[-1].nodes.append(node)
+        else:
+            self.template.nodes.append(node)
+        if isinstance(node, parsetree.Tag):
+            if len(self.tag):
+                node.parent = self.tag[-1]
+            self.tag.append(node)
+        elif isinstance(node, parsetree.ControlLine):
+            if node.isend:
+                self.control_line.pop()
+            elif node.is_primary:
+                self.control_line.append(node)
+            elif len(self.control_line) and not self.control_line[-1].is_ternary(node.keyword):
+                raise exceptions.SyntaxException("Keyword '%s' not a legal ternary for keyword '%s'" % (node.keyword, self.control_line[-1].keyword), **self.exception_kwargs)
+
+    def escape_code(self, text):
+        if not self.disable_unicode and self.encoding:
+            return text.encode('ascii', 'backslashreplace')
+        else:
+            return text
+            
+    def parse(self):
+        for preproc in self.preprocessor:
+            self.text = preproc(self.text)
+        if not isinstance(self.text, unicode) and self.text.startswith(codecs.BOM_UTF8):
+            self.text = self.text[len(codecs.BOM_UTF8):]
+            parsed_encoding = 'utf-8'
+            me = self.match_encoding()
+            if me is not None and me != 'utf-8':
+                raise exceptions.CompileException("Found utf-8 BOM in file, with conflicting magic encoding comment of '%s'" % me, self.text.decode('utf-8', 'ignore'), 0, 0, self.filename)
+        else:
+            parsed_encoding = self.match_encoding()
+        if parsed_encoding:
+            self.encoding = parsed_encoding
+        if not self.disable_unicode and not isinstance(self.text, unicode):
+            if self.encoding:
+                try:
+                    self.text = self.text.decode(self.encoding)
+                except UnicodeDecodeError, e:
+                    raise exceptions.CompileException("Unicode decode operation of encoding '%s' failed" % self.encoding, self.text.decode('utf-8', 'ignore'), 0, 0, self.filename)
+            else:
+                try:
+                    self.text = self.text.decode()
+                except UnicodeDecodeError, e:
+                    raise exceptions.CompileException("Could not read template using encoding of 'ascii'.  Did you forget a magic encoding comment?", self.text.decode('utf-8', 'ignore'), 0, 0, self.filename)
+
+        self.textlength = len(self.text)
+            
+        while (True):
+            if self.match_position > self.textlength: 
+                break
+        
+            if self.match_end():
+                break
+            if self.match_expression():
+                continue
+            if self.match_control_line():
+                continue
+            if self.match_comment():
+                continue
+            if self.match_tag_start(): 
+                continue
+            if self.match_tag_end():
+                continue
+            if self.match_python_block():
+                continue
+            if self.match_text(): 
+                continue
+            
+            if self.match_position > self.textlength: 
+                break
+            raise exceptions.CompileException("assertion failed")
+            
+        if len(self.tag):
+            raise exceptions.SyntaxException("Unclosed tag: <%%%s>" % self.tag[-1].keyword, **self.exception_kwargs)
+        if len(self.control_line):
+            raise exceptions.SyntaxException("Unterminated control keyword: '%s'" % self.control_line[-1].keyword, self.text, self.control_line[-1].lineno, self.control_line[-1].pos, self.filename)
+        return self.template
+
+    def match_encoding(self):
+        match = self.match(r'#.*coding[:=]\s*([-\w.]+).*\r?\n')
+        if match:
+            return match.group(1)
+        else:
+            return None
+            
+    def match_tag_start(self):
+        match = self.match(r'''
+            \<%     # opening tag
+            
+            ([\w\.\:]+)   # keyword
+            
+            ((?:\s+\w+|\s*=\s*|".*?"|'.*?')*)  # attrname, = sign, string expression
+            
+            \s*     # more whitespace
+            
+            (/)?>   # closing
+            
+            ''', 
+            
+            re.I | re.S | re.X)
+            
+        if match:
+            (keyword, attr, isend) = (match.group(1), match.group(2), match.group(3))
+            self.keyword = keyword
+            attributes = {}
+            if attr:
+                for att in re.findall(r"\s*(\w+)\s*=\s*(?:'([^']*)'|\"([^\"]*)\")", attr):
+                    (key, val1, val2) = att
+                    text = val1 or val2
+                    text = text.replace('\r\n', '\n')
+                    attributes[key] = self.escape_code(text)
+            self.append_node(parsetree.Tag, keyword, attributes)
+            if isend:
+                self.tag.pop()
+            else:
+                if keyword == 'text':
+                    match = self.match(r'(.*?)(?=\</%text>)',  re.S)
+                    if not match:
+                        raise exceptions.SyntaxException("Unclosed tag: <%%%s>" % self.tag[-1].keyword, **self.exception_kwargs)
+                    self.append_node(parsetree.Text, match.group(1))
+                    return self.match_tag_end()
+            return True
+        else: 
+            return False
+        
+    def match_tag_end(self):
+        match = self.match(r'\</%[\t ]*(.+?)[\t ]*>')
+        if match:
+            if not len(self.tag):
+                raise exceptions.SyntaxException("Closing tag without opening tag: </%%%s>" % match.group(1), **self.exception_kwargs)
+            elif self.tag[-1].keyword != match.group(1):
+                raise exceptions.SyntaxException("Closing tag </%%%s> does not match tag: <%%%s>" % (match.group(1), self.tag[-1].keyword), **self.exception_kwargs)
+            self.tag.pop()
+            return True
+        else:
+            return False
+            
+    def match_end(self):
+        match = self.match(r'\Z', re.S)
+        if match:
+            string = match.group()
+            if string:
+                return string
+            else:
+                return True
+        else:
+            return False
+    
+    def match_text(self):
+        match = self.match(r"""
+                (.*?)         # anything, followed by:
+                (
+                 (?<=\n)(?=[ \t]*(?=%|\#\#)) # an eval or line-based comment preceded by a consumed \n and whitespace
+                 |
+                 (?=\${)   # an expression
+                 |
+                 (?=\#\*) # multiline comment
+                 |
+                 (?=</?[%&])  # a substitution or block or call start or end
+                                              # - don't consume
+                 |
+                 (\\\r?\n)         # an escaped newline  - throw away
+                 |
+                 \Z           # end of string
+                )""", re.X | re.S)
+        
+        if match:
+            text = match.group(1)
+            self.append_node(parsetree.Text, text)
+            return True
+        else:
+            return False
+    
+    def match_python_block(self):
+        match = self.match(r"<%(!)?")
+        if match:
+            (line, pos) = (self.matched_lineno, self.matched_charpos)
+            (text, end) = self.parse_until_text(r'%>')
+            text = adjust_whitespace(text) + "\n"   # the trailing newline helps compiler.parse() not complain about indentation
+            self.append_node(parsetree.Code, self.escape_code(text), match.group(1)=='!', lineno=line, pos=pos)
+            return True
+        else:
+            return False
+            
+    def match_expression(self):
+        match = self.match(r"\${")
+        if match:
+            (line, pos) = (self.matched_lineno, self.matched_charpos)
+            (text, end) = self.parse_until_text(r'\|', r'}')
+            if end == '|':
+                (escapes, end) = self.parse_until_text(r'}')
+            else:
+                escapes = ""
+            text = text.replace('\r\n', '\n')
+            self.append_node(parsetree.Expression, self.escape_code(text), escapes.strip(), lineno=line, pos=pos)
+            return True
+        else:
+            return False
+
+    def match_control_line(self):
+        match = self.match(r"(?<=^)[\t ]*(%|##)[\t ]*((?:(?:\\r?\n)|[^\r\n])*)(?:\r?\n|\Z)", re.M)
+        if match:
+            operator = match.group(1)
+            text = match.group(2)
+            if operator == '%':
+                m2 = re.match(r'(end)?(\w+)\s*(.*)', text)
+                if not m2:
+                    raise exceptions.SyntaxException("Invalid control line: '%s'" % text, **self.exception_kwargs)
+                (isend, keyword) = m2.group(1, 2)
+                isend = (isend is not None)
+                
+                if isend:
+                    if not len(self.control_line):
+                        raise exceptions.SyntaxException("No starting keyword '%s' for '%s'" % (keyword, text), **self.exception_kwargs)
+                    elif self.control_line[-1].keyword != keyword:
+                        raise exceptions.SyntaxException("Keyword '%s' doesn't match keyword '%s'" % (text, self.control_line[-1].keyword), **self.exception_kwargs)
+                self.append_node(parsetree.ControlLine, keyword, isend, self.escape_code(text))
+            else:
+                self.append_node(parsetree.Comment, text)
+            return True
+        else:
+            return False
+
+    def match_comment(self):
+        """matches the multiline version of a comment"""
+        match = self.match(r"<%doc>(.*?)</%doc>", re.S)
+        if match:
+            self.append_node(parsetree.Comment, match.group(1))
+            return True
+        else:
+            return False
+             
Index: /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/mako/exceptions.py
===================================================================
--- /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/mako/exceptions.py (revision 3)
+++ /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/mako/exceptions.py (revision 3)
@@ -0,0 +1,255 @@
+# exceptions.py
+# Copyright (C) 2006, 2007, 2008, 2009 Michael Bayer mike_mp@zzzcomputing.com
+#
+# This module is part of Mako and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+"""exception classes"""
+
+import traceback, sys, re
+from mako import util
+
+class MakoException(Exception):
+    pass
+
+class RuntimeException(MakoException):
+    pass
+
+def _format_filepos(lineno, pos, filename):
+    if filename is None:
+        return " at line: %d char: %d" % (lineno, pos)
+    else:
+        return " in file '%s' at line: %d char: %d" % (filename, lineno, pos)     
+class CompileException(MakoException):
+    def __init__(self, message, source, lineno, pos, filename):
+        MakoException.__init__(self, message + _format_filepos(lineno, pos, filename))
+        self.lineno =lineno
+        self.pos = pos
+        self.filename = filename
+        self.source = source
+                    
+class SyntaxException(MakoException):
+    def __init__(self, message, source, lineno, pos, filename):
+        MakoException.__init__(self, message + _format_filepos(lineno, pos, filename))
+        self.lineno =lineno
+        self.pos = pos
+        self.filename = filename
+        self.source = source
+        
+class TemplateLookupException(MakoException):
+    pass
+
+class TopLevelLookupException(TemplateLookupException):
+    pass
+    
+class RichTraceback(object):
+    """pulls the current exception from the sys traceback and extracts Mako-specific 
+    template information.
+    
+    Usage:
+    
+    RichTraceback()
+    
+    Properties:
+    
+    error - the exception instance.  
+    source - source code of the file where the error occured.  if the error occured within a compiled template,
+    this is the template source.
+    lineno - line number where the error occured.  if the error occured within a compiled template, the line number
+    is adjusted to that of the template source
+    records - a list of 8-tuples containing the original python traceback elements, plus the 
+    filename, line number, source line, and full template source for the traceline mapped back to its originating source
+    template, if any for that traceline (else the fields are None).
+    reverse_records - the list of records in reverse
+    traceback - a list of 4-tuples, in the same format as a regular python traceback, with template-corresponding 
+    traceback records replacing the originals
+    reverse_traceback - the traceback list in reverse
+    
+    """
+    def __init__(self, traceback=None):
+        (self.source, self.lineno) = ("", 0)
+        (t, self.error, self.records) = self._init(traceback)
+        if self.error is None:
+            self.error = t
+        if isinstance(self.error, CompileException) or isinstance(self.error, SyntaxException):
+            import mako.template
+            self.source = self.error.source
+            self.lineno = self.error.lineno
+            self._has_source = True
+        self.reverse_records = [r for r in self.records]
+        self.reverse_records.reverse()
+    def _get_reformatted_records(self, records):
+        for rec in records:
+            if rec[6] is not None:
+                yield (rec[4], rec[5], rec[2], rec[6])
+            else:
+                yield tuple(rec[0:4])
+    traceback = property(lambda self:self._get_reformatted_records(self.records), doc="""
+        return a list of 4-tuple traceback records (i.e. normal python format)
+        with template-corresponding lines remapped to the originating template
+    """)
+    reverse_traceback = property(lambda self:self._get_reformatted_records(self.reverse_records), doc="""
+        return the same data as traceback, except in reverse order
+    """)
+    def _init(self, trcback):
+        """format a traceback from sys.exc_info() into 7-item tuples, containing
+        the regular four traceback tuple items, plus the original template 
+        filename, the line number adjusted relative to the template source, and
+        code line from that line number of the template."""
+        import mako.template
+        mods = {}
+        if not trcback:
+            (type, value, trcback) = sys.exc_info()
+        rawrecords = traceback.extract_tb(trcback)
+        new_trcback = []
+        for filename, lineno, function, line in rawrecords:
+            try:
+                (line_map, template_lines) = mods[filename]
+            except KeyError:
+                try:
+                    info = mako.template._get_module_info(filename)
+                    module_source = info.code
+                    template_source = info.source
+                    template_filename = info.template_filename or filename
+                except KeyError:
+                    new_trcback.append((filename, lineno, function, line, None, None, None, None))
+                    continue
+
+                template_ln = module_ln = 1
+                line_map = {}
+                for line in module_source.split("\n"):
+                    match = re.match(r'\s*# SOURCE LINE (\d+)', line)
+                    if match:
+                        template_ln = int(match.group(1))
+                    else:
+                        template_ln += 1
+                    module_ln += 1
+                    line_map[module_ln] = template_ln
+                template_lines = [line for line in template_source.split("\n")]
+                mods[filename] = (line_map, template_lines)
+
+            template_ln = line_map[lineno]
+            if template_ln <= len(template_lines):
+                template_line = template_lines[template_ln - 1]
+            else:
+                template_line = None
+            new_trcback.append((filename, lineno, function, line, template_filename, template_ln, template_line, template_source))
+        if not self.source:
+            for l in range(len(new_trcback)-1, 0, -1):
+                if new_trcback[l][5]:
+                    self.source = new_trcback[l][7]
+                    self.lineno = new_trcback[l][5]
+                    break
+            else:
+                try:
+                    # A normal .py file (not a Template)
+                    fp = open(new_trcback[-1][0])
+                    encoding = util.parse_encoding(fp)
+                    fp.seek(0)
+                    self.source = fp.read()
+                    fp.close()
+                    if encoding:
+                        self.source = self.source.decode(encoding)
+                except IOError:
+                    self.source = ''
+                self.lineno = new_trcback[-1][1]
+        return (type, value, new_trcback)
+
+                
+def text_error_template(lookup=None):
+    """provides a template that renders a stack trace in a similar format to the Python interpreter,
+    substituting source template filenames, line numbers and code for that of the originating
+    source template, as applicable."""
+    import mako.template
+    return mako.template.Template(r"""
+<%page args="traceback=None"/>
+<%!
+    from mako.exceptions import RichTraceback
+%>\
+<%
+    tback = RichTraceback(traceback=traceback)
+%>\
+Traceback (most recent call last):
+% for (filename, lineno, function, line) in tback.traceback:
+  File "${filename}", line ${lineno}, in ${function or '?'}
+    ${line | unicode.strip}
+% endfor
+${str(tback.error.__class__.__name__)}: ${str(tback.error)}
+""")
+
+def html_error_template():
+    """provides a template that renders a stack trace in an HTML format, providing an excerpt of 
+    code as well as substituting source template filenames, line numbers and code 
+    for that of the originating source template, as applicable.
+
+    the template's default encoding_errors value is 'htmlentityreplace'. the template has
+    two options:
+
+    with the full option disabled, only a section of an HTML document is returned.
+    with the css option disabled, the default stylesheet won't be included."""
+    import mako.template
+    return mako.template.Template(r"""
+<%!
+    from mako.exceptions import RichTraceback
+%>
+<%page args="full=True, css=True, traceback=None"/>
+% if full:
+<html>
+<head>
+    <title>Mako Runtime Error</title>
+% endif
+% if css:
+    <style>
+        body { font-family:verdana; margin:10px 30px 10px 30px;}
+        .stacktrace { margin:5px 5px 5px 5px; }
+        .highlight { padding:0px 10px 0px 10px; background-color:#9F9FDF; }
+        .nonhighlight { padding:0px; background-color:#DFDFDF; }
+        .sample { padding:10px; margin:10px 10px 10px 10px; font-family:monospace; }
+        .sampleline { padding:0px 10px 0px 10px; }
+        .sourceline { margin:5px 5px 10px 5px; font-family:monospace;}
+        .location { font-size:80%; }
+    </style>
+% endif
+% if full:
+</head>
+<body>
+% endif
+
+<h2>Error !</h2>
+<%
+    tback = RichTraceback(traceback=traceback)
+    src = tback.source
+    line = tback.lineno
+    if src:
+        lines = src.split('\n')
+    else:
+        lines = None
+%>
+<h3>${str(tback.error.__class__.__name__)}: ${str(tback.error)}</h3>
+
+% if lines:
+    <div class="sample">
+    <div class="nonhighlight">
+% for index in range(max(0, line-4),min(len(lines), line+5)):
+    % if index + 1 == line:
+<div class="highlight">${index + 1} ${lines[index] | h}</div>
+    % else:
+<div class="sampleline">${index + 1} ${lines[index] | h}</div>
+    % endif
+% endfor
+    </div>
+    </div>
+% endif
+
+<div class="stacktrace">
+% for (filename, lineno, function, line) in tback.reverse_traceback:
+    <div class="location">${filename}, line ${lineno}:</div>
+    <div class="sourceline">${line | h}</div>
+% endfor
+</div>
+
+% if full:
+</body>
+</html>
+% endif
+""", output_encoding=sys.getdefaultencoding(), encoding_errors='htmlentityreplace')
Index: /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/mako/pygen.py
===================================================================
--- /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/mako/pygen.py (revision 3)
+++ /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/mako/pygen.py (revision 3)
@@ -0,0 +1,267 @@
+# pygen.py
+# Copyright (C) 2006, 2007, 2008, 2009 Michael Bayer mike_mp@zzzcomputing.com
+#
+# This module is part of Mako and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+"""utilities for generating and formatting literal Python code."""
+
+import re, string
+from StringIO import StringIO
+
+class PythonPrinter(object):
+    def __init__(self, stream):
+        # indentation counter
+        self.indent = 0
+        
+        # a stack storing information about why we incremented 
+        # the indentation counter, to help us determine if we
+        # should decrement it
+        self.indent_detail = []
+        
+        # the string of whitespace multiplied by the indent
+        # counter to produce a line
+        self.indentstring = "    "
+        
+        # the stream we are writing to
+        self.stream = stream
+        
+        # a list of lines that represents a buffered "block" of code,
+        # which can be later printed relative to an indent level 
+        self.line_buffer = []
+        
+        self.in_indent_lines = False
+        
+        self._reset_multi_line_flags()
+
+    def write(self, text):
+        self.stream.write(text)
+        
+    def write_indented_block(self, block):
+        """print a line or lines of python which already contain indentation.
+        
+        The indentation of the total block of lines will be adjusted to that of
+        the current indent level.""" 
+        self.in_indent_lines = False
+        for l in re.split(r'\r?\n', block):
+            self.line_buffer.append(l)
+    
+    def writelines(self, *lines):
+        """print a series of lines of python."""
+        for line in lines:
+            self.writeline(line)
+                
+    def writeline(self, line):
+        """print a line of python, indenting it according to the current indent level.
+        
+        this also adjusts the indentation counter according to the content of the line."""
+
+        if not self.in_indent_lines:
+            self._flush_adjusted_lines()
+            self.in_indent_lines = True
+
+        decreased_indent = False
+    
+        if (line is None or 
+            re.match(r"^\s*#",line) or
+            re.match(r"^\s*$", line)
+            ):
+            hastext = False
+        else:
+            hastext = True
+
+        is_comment = line and len(line) and line[0] == '#'
+        
+        # see if this line should decrease the indentation level
+        if (not decreased_indent and 
+            not is_comment and 
+            (not hastext or self._is_unindentor(line))
+            ):
+            
+            if self.indent > 0: 
+                self.indent -=1
+                # if the indent_detail stack is empty, the user
+                # probably put extra closures - the resulting
+                # module wont compile.  
+                if len(self.indent_detail) == 0:  
+                    raise "Too many whitespace closures"
+                self.indent_detail.pop()
+        
+        if line is None:
+            return
+                
+        # write the line
+        self.stream.write(self._indent_line(line) + "\n")
+        
+        # see if this line should increase the indentation level.
+        # note that a line can both decrase (before printing) and 
+        # then increase (after printing) the indentation level.
+
+        if re.search(r":[ \t]*(?:#.*)?$", line):
+            # increment indentation count, and also
+            # keep track of what the keyword was that indented us,
+            # if it is a python compound statement keyword
+            # where we might have to look for an "unindent" keyword
+            match = re.match(r"^\s*(if|try|elif|while|for)", line)
+            if match:
+                # its a "compound" keyword, so we will check for "unindentors"
+                indentor = match.group(1)
+                self.indent +=1
+                self.indent_detail.append(indentor)
+            else:
+                indentor = None
+                # its not a "compound" keyword.  but lets also
+                # test for valid Python keywords that might be indenting us,
+                # else assume its a non-indenting line
+                m2 = re.match(r"^\s*(def|class|else|elif|except|finally)", line)
+                if m2:
+                    self.indent += 1
+                    self.indent_detail.append(indentor)
+
+    def close(self):
+        """close this printer, flushing any remaining lines."""
+        self._flush_adjusted_lines()
+    
+    def _is_unindentor(self, line):
+        """return true if the given line is an 'unindentor', relative to the last 'indent' event received."""
+                
+        # no indentation detail has been pushed on; return False
+        if len(self.indent_detail) == 0: 
+            return False
+
+        indentor = self.indent_detail[-1]
+        
+        # the last indent keyword we grabbed is not a 
+        # compound statement keyword; return False
+        if indentor is None: 
+            return False
+        
+        # if the current line doesnt have one of the "unindentor" keywords,
+        # return False
+        match = re.match(r"^\s*(else|elif|except|finally).*\:", line)
+        if not match: 
+            return False
+        
+        # whitespace matches up, we have a compound indentor,
+        # and this line has an unindentor, this
+        # is probably good enough
+        return True
+        
+        # should we decide that its not good enough, heres
+        # more stuff to check.
+        #keyword = match.group(1)
+        
+        # match the original indent keyword 
+        #for crit in [
+        #   (r'if|elif', r'else|elif'),
+        #   (r'try', r'except|finally|else'),
+        #   (r'while|for', r'else'),
+        #]:
+        #   if re.match(crit[0], indentor) and re.match(crit[1], keyword): return True
+        
+        #return False
+        
+    def _indent_line(self, line, stripspace = ''):
+        """indent the given line according to the current indent level.
+        
+        stripspace is a string of space that will be truncated from the start of the line
+        before indenting."""
+        return re.sub(r"^%s" % stripspace, self.indentstring * self.indent, line)
+
+    def _reset_multi_line_flags(self):
+        """reset the flags which would indicate we are in a backslashed or triple-quoted section."""
+        (self.backslashed, self.triplequoted) = (False, False) 
+        
+    def _in_multi_line(self, line):
+        """return true if the given line is part of a multi-line block, via backslash or triple-quote."""
+        # we are only looking for explicitly joined lines here,
+        # not implicit ones (i.e. brackets, braces etc.).  this is just
+        # to guard against the possibility of modifying the space inside 
+        # of a literal multiline string with unfortunately placed whitespace
+         
+        current_state = (self.backslashed or self.triplequoted) 
+                        
+        if re.search(r"\\$", line):
+            self.backslashed = True
+        else:
+            self.backslashed = False
+            
+        triples = len(re.findall(r"\"\"\"|\'\'\'", line))
+        if triples == 1 or triples % 2 != 0:
+            self.triplequoted = not self.triplequoted
+            
+        return current_state
+
+    def _flush_adjusted_lines(self):
+        stripspace = None
+        self._reset_multi_line_flags()
+        
+        for entry in self.line_buffer:
+            if self._in_multi_line(entry):
+                self.stream.write(entry + "\n")
+            else:
+                entry = string.expandtabs(entry)
+                if stripspace is None and re.search(r"^[ \t]*[^# \t]", entry):
+                    stripspace = re.match(r"^([ \t]*)", entry).group(1)
+                self.stream.write(self._indent_line(entry, stripspace) + "\n")
+            
+        self.line_buffer = []
+        self._reset_multi_line_flags()
+
+
+def adjust_whitespace(text):
+    """remove the left-whitespace margin of a block of Python code."""
+    state = [False, False]
+    (backslashed, triplequoted) = (0, 1)
+
+    def in_multi_line(line):
+        start_state = (state[backslashed] or state[triplequoted])
+        
+        if re.search(r"\\$", line):
+            state[backslashed] = True
+        else:
+            state[backslashed] = False
+        
+        def match(reg, t):
+            m = re.match(reg, t)
+            if m:
+                return m, t[len(m.group(0)):]
+            else:
+                return None, t
+                
+        while line:
+            if state[triplequoted]:
+                m, line = match(r"%s" % state[triplequoted], line)
+                if m:
+                    state[triplequoted] = False
+                else:
+                    m, line = match(r".*?(?=%s|$)" % state[triplequoted], line)
+            else:
+                m, line = match(r'#', line)
+                if m:
+                    return start_state
+                
+                m, line = match(r"\"\"\"|\'\'\'", line)
+                if m:
+                    state[triplequoted] = m.group(0)
+                    continue
+
+                m, line = match(r".*?(?=\"\"\"|\'\'\'|#|$)", line)
+            
+        return start_state
+
+    def _indent_line(line, stripspace = ''):
+        return re.sub(r"^%s" % stripspace, '', line)
+
+    lines = []
+    stripspace = None
+
+    for line in re.split(r'\r?\n', text):
+        if in_multi_line(line):
+            lines.append(line)
+        else:
+            line = string.expandtabs(line)
+            if stripspace is None and re.search(r"^[ \t]*[^# \t]", line):
+                stripspace = re.match(r"^([ \t]*)", line).group(1)
+            lines.append(_indent_line(line, stripspace))
+    return "\n".join(lines)
Index: /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/mako/runtime.py
===================================================================
--- /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/mako/runtime.py (revision 3)
+++ /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/mako/runtime.py (revision 3)
@@ -0,0 +1,414 @@
+# runtime.py
+# Copyright (C) 2006, 2007, 2008, 2009 Michael Bayer mike_mp@zzzcomputing.com
+#
+# This module is part of Mako and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+"""provides runtime services for templates, including Context, Namespace, and various helper functions."""
+
+from mako import exceptions, util
+import __builtin__, inspect, sys
+
+class Context(object):
+    """provides runtime namespace, output buffer, and various callstacks for templates."""
+    def __init__(self, buffer, **data):
+        self._buffer_stack = [buffer]
+        self._orig = data  # original data, minus the builtins
+        self._data = __builtin__.__dict__.copy() # the context data which includes builtins
+        self._data.update(data)
+        self._kwargs = data.copy()
+        self._with_template = None
+        self.namespaces = {}
+        
+        # "capture" function which proxies to the generic "capture" function
+        self._data['capture'] = lambda x, *args, **kwargs: capture(self, x, *args, **kwargs)
+        
+        # "caller" stack used by def calls with content
+        self.caller_stack = self._data['caller'] = CallerStack()
+        
+    lookup = property(lambda self:self._with_template.lookup)
+    kwargs = property(lambda self:self._kwargs.copy())
+    
+    def push_caller(self, caller):
+        self.caller_stack.append(caller)
+        
+    def pop_caller(self):
+        del self.caller_stack[-1]
+        
+    def keys(self):
+        return self._data.keys()
+        
+    def __getitem__(self, key):
+        return self._data[key]
+
+    def _push_writer(self):
+        """push a capturing buffer onto this Context and return the new Writer function."""
+        
+        buf = util.FastEncodingBuffer()
+        self._buffer_stack.append(buf)
+        return buf.write
+
+    def _pop_buffer_and_writer(self):
+        """pop the most recent capturing buffer from this Context 
+        and return the current writer after the pop.
+        
+        """
+
+        buf = self._buffer_stack.pop()
+        return buf, self._buffer_stack[-1].write
+        
+    def _push_buffer(self):
+        """push a capturing buffer onto this Context."""
+        
+        self._push_writer()
+        
+    def _pop_buffer(self):
+        """pop the most recent capturing buffer from this Context."""
+        
+        return self._buffer_stack.pop()
+        
+    def get(self, key, default=None):
+        return self._data.get(key, default)
+        
+    def write(self, string):
+        """write a string to this Context's underlying output buffer."""
+        
+        self._buffer_stack[-1].write(string)
+        
+    def writer(self):
+        """return the current writer function"""
+
+        return self._buffer_stack[-1].write
+
+    def _copy(self):
+        c = Context.__new__(Context)
+        c._buffer_stack = self._buffer_stack
+        c._data = self._data.copy()
+        c._orig = self._orig
+        c._kwargs = self._kwargs
+        c._with_template = self._with_template
+        c.namespaces = self.namespaces
+        c.caller_stack = self.caller_stack
+        return c
+    def locals_(self, d):
+        """create a new Context with a copy of this Context's current state, updated with the given dictionary."""
+        if len(d) == 0:
+            return self
+        c = self._copy()
+        c._data.update(d)
+        return c
+    def _clean_inheritance_tokens(self):
+        """create a new copy of this Context with tokens related to inheritance state removed."""
+        c = self._copy()
+        x = c._data
+        x.pop('self', None)
+        x.pop('parent', None)
+        x.pop('next', None)
+        return c
+
+class CallerStack(list):
+    def __init__(self):
+        self.nextcaller = None
+    def __nonzero__(self):
+        return self._get_caller() and True or False
+    def _get_caller(self):
+        return self[-1]
+    def __getattr__(self, key):
+        return getattr(self._get_caller(), key)
+    def _push_frame(self):
+        self.append(self.nextcaller or None)
+        self.nextcaller = None
+    def _pop_frame(self):
+        self.nextcaller = self.pop()
+        
+        
+class Undefined(object):
+    """represents an undefined value in a template."""
+    def __str__(self):
+        raise NameError("Undefined")
+    def __nonzero__(self):
+        return False
+
+UNDEFINED = Undefined()
+
+class _NSAttr(object):
+    def __init__(self, parent):
+        self.__parent = parent
+    def __getattr__(self, key):
+        ns = self.__parent
+        while ns:
+            if hasattr(ns.module, key):
+                return getattr(ns.module, key)
+            else:
+                ns = ns.inherits
+        raise AttributeError(key)    
+    
+class Namespace(object):
+    """provides access to collections of rendering methods, which can be local, from other templates, or from imported modules"""
+    def __init__(self, name, context, module=None, template=None, templateuri=None, callables=None, inherits=None, populate_self=True, calling_uri=None):
+        self.name = name
+        if module is not None:
+            mod = __import__(module)
+            for token in module.split('.')[1:]:
+                mod = getattr(mod, token)
+            self._module = mod
+        else:
+            self._module = None
+        if templateuri is not None:
+            self.template = _lookup_template(context, templateuri, calling_uri)
+            self._templateuri = self.template.module._template_uri
+        else:
+            self.template = template
+            if self.template is not None:
+                self._templateuri = self.template.module._template_uri
+        self.context = context
+        self.inherits = inherits
+        if callables is not None:
+            self.callables = dict([(c.func_name, c) for c in callables])
+        else:
+            self.callables = None
+        if populate_self and self.template is not None:
+            (lclcallable, lclcontext) = _populate_self_namespace(context, self.template, self_ns=self)
+        
+    module = property(lambda s:s._module or s.template.module)
+    filename = property(lambda s:s._module and s._module.__file__ or s.template.filename)
+    uri = property(lambda s:s.template.uri)
+    
+    def attr(self):
+        if not hasattr(self, '_attr'):
+            self._attr = _NSAttr(self)
+        return self._attr
+    attr = property(attr)
+
+    def get_namespace(self, uri):
+        """return a namespace corresponding to the given template uri.
+        
+        if a relative uri, it is adjusted to that of the template of this namespace"""
+        key = (self, uri)
+        if self.context.namespaces.has_key(key):
+            return self.context.namespaces[key]
+        else:
+            ns = Namespace(uri, self.context._copy(), templateuri=uri, calling_uri=self._templateuri) 
+            self.context.namespaces[key] = ns
+            return ns
+    
+    def get_template(self, uri):
+        return _lookup_template(self.context, uri, self._templateuri)
+        
+    def get_cached(self, key, **kwargs):
+        if self.template:
+            if not self.template.cache_enabled:
+                createfunc = kwargs.get('createfunc', None)
+                if createfunc:
+                    return createfunc()
+                else:
+                    return None
+                
+            if self.template.cache_dir:
+                kwargs.setdefault('data_dir', self.template.cache_dir)
+            if self.template.cache_type:
+                kwargs.setdefault('type', self.template.cache_type)
+            if self.template.cache_url:
+                kwargs.setdefault('url', self.template.cache_url)
+        return self.cache.get(key, **kwargs)
+    
+    def cache(self):
+        return self.template.cache
+    cache = property(cache)
+    
+    def include_file(self, uri, **kwargs):
+        """include a file at the given uri"""
+        _include_file(self.context, uri, self._templateuri, **kwargs)
+        
+    def _populate(self, d, l):
+        for ident in l:
+            if ident == '*':
+                for (k, v) in self._get_star():
+                    d[k] = v
+            else:
+                d[ident] = getattr(self, ident)
+    
+    def _get_star(self):
+        if self.callables:
+            for key in self.callables:
+                yield (key, self.callables[key])
+        if self.template:
+            def get(key):
+                callable_ = self.template._get_def_callable(key)
+                return lambda *args, **kwargs:callable_(self.context, *args, **kwargs)
+            for k in self.template.module._exports:
+                yield (k, get(k))
+        if self._module:
+            def get(key):
+                callable_ = getattr(self._module, key)
+                return lambda *args, **kwargs:callable_(self.context, *args, **kwargs)
+            for k in dir(self._module):
+                if k[0] != '_':
+                    yield (k, get(k))
+                            
+    def __getattr__(self, key):
+        if self.callables and key in self.callables:
+            return self.callables[key]
+
+        if self.template and self.template.has_def(key):
+            callable_ = self.template._get_def_callable(key)
+            return lambda *args, **kwargs:callable_(self.context, *args, **kwargs)
+
+        if self._module and hasattr(self._module, key):
+            callable_ = getattr(self._module, key)
+            return lambda *args, **kwargs:callable_(self.context, *args, **kwargs)
+
+        if self.inherits is not None:
+            return getattr(self.inherits, key)
+        raise AttributeError("Namespace '%s' has no member '%s'" % (self.name, key))
+
+def supports_caller(func):
+    """apply a caller_stack compatibility decorator to a plain Python function."""
+    def wrap_stackframe(context,  *args, **kwargs):
+        context.caller_stack._push_frame()
+        try:
+            return func(context, *args, **kwargs)
+        finally:
+            context.caller_stack._pop_frame()
+    return wrap_stackframe
+        
+def capture(context, callable_, *args, **kwargs):
+    """execute the given template def, capturing the output into a buffer."""
+    if not callable(callable_):
+        raise exceptions.RuntimeException("capture() function expects a callable as its argument (i.e. capture(func, *args, **kwargs))")
+    context._push_buffer()
+    try:
+        callable_(*args, **kwargs)
+    finally:
+        buf = context._pop_buffer()
+    return buf.getvalue()
+
+def _decorate_toplevel(fn):
+    def decorate_render(render_fn):
+        def go(context, *args, **kw):
+            def y(*args, **kw):
+                return render_fn(context, *args, **kw)
+            return fn(y)(context, *args, **kw)
+        return go
+    return decorate_render
+    
+def _decorate_inline(context, fn):
+    def decorate_render(render_fn):
+        dec = fn(render_fn)
+        def go(*args, **kw):
+            return dec(context, *args, **kw)
+        return go
+    return decorate_render
+            
+def _include_file(context, uri, calling_uri, **kwargs):
+    """locate the template from the given uri and include it in the current output."""
+    template = _lookup_template(context, uri, calling_uri)
+    (callable_, ctx) = _populate_self_namespace(context._clean_inheritance_tokens(), template)
+    callable_(ctx, **_kwargs_for_callable(callable_, context._orig, **kwargs))
+        
+def _inherit_from(context, uri, calling_uri):
+    """called by the _inherit method in template modules to set up the inheritance chain at the start
+    of a template's execution."""
+    if uri is None:
+        return None
+    template = _lookup_template(context, uri, calling_uri)
+    self_ns = context['self']
+    ih = self_ns
+    while ih.inherits is not None:
+        ih = ih.inherits
+    lclcontext = context.locals_({'next':ih})
+    ih.inherits = Namespace("self:%s" % template.uri, lclcontext, template = template, populate_self=False)
+    context._data['parent'] = lclcontext._data['local'] = ih.inherits
+    callable_ = getattr(template.module, '_mako_inherit', None)
+    if callable_ is not None:
+        ret = callable_(template, lclcontext)
+        if ret:
+            return ret
+
+    gen_ns = getattr(template.module, '_mako_generate_namespaces', None)
+    if gen_ns is not None:
+        gen_ns(context)
+    return (template.callable_, lclcontext)
+
+def _lookup_template(context, uri, relativeto):
+    lookup = context._with_template.lookup
+    if lookup is None:
+        raise exceptions.TemplateLookupException("Template '%s' has no TemplateLookup associated" % context._with_template.uri)
+    uri = lookup.adjust_uri(uri, relativeto)
+    try:
+        return lookup.get_template(uri)
+    except exceptions.TopLevelLookupException, e:
+        raise exceptions.TemplateLookupException(str(e))
+
+def _populate_self_namespace(context, template, self_ns=None):
+    if self_ns is None:
+        self_ns = Namespace('self:%s' % template.uri, context, template=template, populate_self=False)
+    context._data['self'] = context._data['local'] = self_ns
+    if hasattr(template.module, '_mako_inherit'):
+        ret = template.module._mako_inherit(template, context)
+        if ret:
+            return ret
+    return (template.callable_, context)
+
+def _render(template, callable_, args, data, as_unicode=False):
+    """create a Context and return the string output of the given template and template callable."""
+
+    if as_unicode:
+        buf = util.FastEncodingBuffer(unicode=True)
+    elif template.output_encoding:
+        buf = util.FastEncodingBuffer(unicode=as_unicode, encoding=template.output_encoding, errors=template.encoding_errors)
+    else:
+        buf = util.StringIO()
+    context = Context(buf, **data)
+    context._with_template = template
+    _render_context(template, callable_, context, *args, **_kwargs_for_callable(callable_, data))
+    return context._pop_buffer().getvalue()
+
+def _kwargs_for_callable(callable_, data, **kwargs):
+    argspec = inspect.getargspec(callable_)
+    namedargs = argspec[0] + [v for v in argspec[1:3] if v is not None]
+    for arg in namedargs:
+        if arg != 'context' and arg in data and arg not in kwargs:
+            kwargs[arg] = data[arg]
+    return kwargs
+    
+def _render_context(tmpl, callable_, context, *args, **kwargs):
+    import mako.template as template
+    # create polymorphic 'self' namespace for this template with possibly updated context
+    if not isinstance(tmpl, template.DefTemplate):
+        # if main render method, call from the base of the inheritance stack
+        (inherit, lclcontext) = _populate_self_namespace(context, tmpl)
+        _exec_template(inherit, lclcontext, args=args, kwargs=kwargs)
+    else:
+        # otherwise, call the actual rendering method specified
+        (inherit, lclcontext) = _populate_self_namespace(context, tmpl.parent)
+        _exec_template(callable_, context, args=args, kwargs=kwargs)
+        
+def _exec_template(callable_, context, args=None, kwargs=None):
+    """execute a rendering callable given the callable, a Context, and optional explicit arguments
+
+    the contextual Template will be located if it exists, and the error handling options specified
+    on that Template will be interpreted here.
+    """
+    template = context._with_template
+    if template is not None and (template.format_exceptions or template.error_handler):
+        error = None
+        try:
+            callable_(context, *args, **kwargs)
+        except Exception, e:
+            error = e
+        except:                
+            e = sys.exc_info()[0]
+            error = e
+        if error:
+            if template.error_handler:
+                result = template.error_handler(context, error)
+                if not result:
+                    raise error
+            else:
+                error_template = exceptions.html_error_template()
+                context._buffer_stack[:] = [util.FastEncodingBuffer(error_template.output_encoding, error_template.encoding_errors)]
+                context._with_template = error_template
+                error_template.render_context(context, error=error)
+    else:
+        callable_(context, *args, **kwargs)
Index: /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/mako/_ast_util.py
===================================================================
--- /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/mako/_ast_util.py (revision 3)
+++ /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/mako/_ast_util.py (revision 3)
@@ -0,0 +1,834 @@
+# -*- coding: utf-8 -*-
+"""
+    ast
+    ~~~
+
+    The `ast` module helps Python applications to process trees of the Python
+    abstract syntax grammar.  The abstract syntax itself might change with
+    each Python release; this module helps to find out programmatically what
+    the current grammar looks like and allows modifications of it.
+
+    An abstract syntax tree can be generated by passing `ast.PyCF_ONLY_AST` as
+    a flag to the `compile()` builtin function or by using the `parse()`
+    function from this module.  The result will be a tree of objects whose
+    classes all inherit from `ast.AST`.
+
+    A modified abstract syntax tree can be compiled into a Python code object
+    using the built-in `compile()` function.
+
+    Additionally various helper functions are provided that make working with
+    the trees simpler.  The main intention of the helper functions and this
+    module in general is to provide an easy to use interface for libraries
+    that work tightly with the python syntax (template engines for example).
+
+
+    :copyright: Copyright 2008 by Armin Ronacher.
+    :license: Python License.
+"""
+from _ast import *
+
+
+BOOLOP_SYMBOLS = {
+    And:        'and',
+    Or:         'or'
+}
+
+BINOP_SYMBOLS = {
+    Add:        '+',
+    Sub:        '-',
+    Mult:       '*',
+    Div:        '/',
+    FloorDiv:   '//',
+    Mod:        '%',
+    LShift:     '<<',
+    RShift:     '>>',
+    BitOr:      '|',
+    BitAnd:     '&',
+    BitXor:     '^'
+}
+
+CMPOP_SYMBOLS = {
+    Eq:         '==',
+    Gt:         '>',
+    GtE:        '>=',
+    In:         'in',
+    Is:         'is',
+    IsNot:      'is not',
+    Lt:         '<',
+    LtE:        '<=',
+    NotEq:      '!=',
+    NotIn:      'not in'
+}
+
+UNARYOP_SYMBOLS = {
+    Invert:     '~',
+    Not:        'not',
+    UAdd:       '+',
+    USub:       '-'
+}
+
+ALL_SYMBOLS = {}
+ALL_SYMBOLS.update(BOOLOP_SYMBOLS)
+ALL_SYMBOLS.update(BINOP_SYMBOLS)
+ALL_SYMBOLS.update(CMPOP_SYMBOLS)
+ALL_SYMBOLS.update(UNARYOP_SYMBOLS)
+
+
+def parse(expr, filename='<unknown>', mode='exec'):
+    """Parse an expression into an AST node."""
+    return compile(expr, filename, mode, PyCF_ONLY_AST)
+
+
+def to_source(node, indent_with=' ' * 4):
+    """
+    This function can convert a node tree back into python sourcecode.  This
+    is useful for debugging purposes, especially if you're dealing with custom
+    asts not generated by python itself.
+
+    It could be that the sourcecode is evaluable when the AST itself is not
+    compilable / evaluable.  The reason for this is that the AST contains some
+    more data than regular sourcecode does, which is dropped during
+    conversion.
+
+    Each level of indentation is replaced with `indent_with`.  Per default this
+    parameter is equal to four spaces as suggested by PEP 8, but it might be
+    adjusted to match the application's styleguide.
+    """
+    generator = SourceGenerator(indent_with)
+    generator.visit(node)
+    return ''.join(generator.result)
+
+
+def dump(node):
+    """
+    A very verbose representation of the node passed.  This is useful for
+    debugging purposes.
+    """
+    def _format(node):
+        if isinstance(node, AST):
+            return '%s(%s)' % (node.__class__.__name__,
+                               ', '.join('%s=%s' % (a, _format(b))
+                                         for a, b in iter_fields(node)))
+        elif isinstance(node, list):
+            return '[%s]' % ', '.join(_format(x) for x in node)
+        return repr(node)
+    if not isinstance(node, AST):
+        raise TypeError('expected AST, got %r' % node.__class__.__name__)
+    return _format(node)
+
+
+def copy_location(new_node, old_node):
+    """
+    Copy the source location hint (`lineno` and `col_offset`) from the
+    old to the new node if possible and return the new one.
+    """
+    for attr in 'lineno', 'col_offset':
+        if attr in old_node._attributes and attr in new_node._attributes \
+           and hasattr(old_node, attr):
+            setattr(new_node, attr, getattr(old_node, attr))
+    return new_node
+
+
+def fix_missing_locations(node):
+    """
+    Some nodes require a line number and the column offset.  Without that
+    information the compiler will abort the compilation.  Because it can be
+    a dull task to add appropriate line numbers and column offsets when
+    adding new nodes this function can help.  It copies the line number and
+    column offset of the parent node to the child nodes without this
+    information.
+
+    Unlike `copy_location` this works recursive and won't touch nodes that
+    already have a location information.
+    """
+    def _fix(node, lineno, col_offset):
+        if 'lineno' in node._attributes:
+            if not hasattr(node, 'lineno'):
+                node.lineno = lineno
+            else:
+                lineno = node.lineno
+        if 'col_offset' in node._attributes:
+            if not hasattr(node, 'col_offset'):
+                node.col_offset = col_offset
+            else:
+                col_offset = node.col_offset
+        for child in iter_child_nodes(node):
+            _fix(child, lineno, col_offset)
+    _fix(node, 1, 0)
+    return node
+
+
+def increment_lineno(node, n=1):
+    """
+    Increment the line numbers of all nodes by `n` if they have line number
+    attributes.  This is useful to "move code" to a different location in a
+    file.
+    """
+    for node in zip((node,), walk(node)):
+        if 'lineno' in node._attributes:
+            node.lineno = getattr(node, 'lineno', 0) + n
+
+
+def iter_fields(node):
+    """Iterate over all fields of a node, only yielding existing fields."""
+    # CPython 2.5 compat
+    if not hasattr(node, '_fields') or not node._fields:
+        return
+    for field in node._fields:
+        try:
+            yield field, getattr(node, field)
+        except AttributeError:
+            pass
+
+
+def get_fields(node):
+    """Like `iter_fiels` but returns a dict."""
+    return dict(iter_fields(node))
+
+
+def iter_child_nodes(node):
+    """Iterate over all child nodes or a node."""
+    for name, field in iter_fields(node):
+        if isinstance(field, AST):
+            yield field
+        elif isinstance(field, list):
+            for item in field:
+                if isinstance(item, AST):
+                    yield item
+
+
+def get_child_nodes(node):
+    """Like `iter_child_nodes` but returns a list."""
+    return list(iter_child_nodes(node))
+
+
+def get_compile_mode(node):
+    """
+    Get the mode for `compile` of a given node.  If the node is not a `mod`
+    node (`Expression`, `Module` etc.) a `TypeError` is thrown.
+    """
+    if not isinstance(node, mod):
+        raise TypeError('expected mod node, got %r' % node.__class__.__name__)
+    return {
+        Expression:     'eval',
+        Interactive:    'single'
+    }.get(node.__class__, 'expr')
+
+
+def get_docstring(node):
+    """
+    Return the docstring for the given node or `None` if no docstring can be
+    found.  If the node provided does not accept docstrings a `TypeError`
+    will be raised.
+    """
+    if not isinstance(node, (FunctionDef, ClassDef, Module)):
+        raise TypeError("%r can't have docstrings" % node.__class__.__name__)
+    if node.body and isinstance(node.body[0], Str):
+        return node.body[0].s
+
+
+def walk(node):
+    """
+    Iterate over all nodes.  This is useful if you only want to modify nodes in
+    place and don't care about the context or the order the nodes are returned.
+    """
+    from collections import deque
+    todo = deque([node])
+    while todo:
+        node = todo.popleft()
+        todo.extend(iter_child_nodes(node))
+        yield node
+
+
+class NodeVisitor(object):
+    """
+    Walks the abstract syntax tree and call visitor functions for every node
+    found.  The visitor functions may return values which will be forwarded
+    by the `visit` method.
+
+    Per default the visitor functions for the nodes are ``'visit_'`` +
+    class name of the node.  So a `TryFinally` node visit function would
+    be `visit_TryFinally`.  This behavior can be changed by overriding
+    the `get_visitor` function.  If no visitor function exists for a node
+    (return value `None`) the `generic_visit` visitor is used instead.
+
+    Don't use the `NodeVisitor` if you want to apply changes to nodes during
+    traversing.  For this a special visitor exists (`NodeTransformer`) that
+    allows modifications.
+    """
+
+    def get_visitor(self, node):
+        """
+        Return the visitor function for this node or `None` if no visitor
+        exists for this node.  In that case the generic visit function is
+        used instead.
+        """
+        method = 'visit_' + node.__class__.__name__
+        return getattr(self, method, None)
+
+    def visit(self, node):
+        """Visit a node."""
+        f = self.get_visitor(node)
+        if f is not None:
+            return f(node)
+        return self.generic_visit(node)
+
+    def generic_visit(self, node):
+        """Called if no explicit visitor function exists for a node."""
+        for field, value in iter_fields(node):
+            if isinstance(value, list):
+                for item in value:
+                    if isinstance(item, AST):
+                        self.visit(item)
+            elif isinstance(value, AST):
+                self.visit(value)
+
+
+class NodeTransformer(NodeVisitor):
+    """
+    Walks the abstract syntax tree and allows modifications of nodes.
+
+    The `NodeTransformer` will walk the AST and use the return value of the
+    visitor functions to replace or remove the old node.  If the return
+    value of the visitor function is `None` the node will be removed
+    from the previous location otherwise it's replaced with the return
+    value.  The return value may be the original node in which case no
+    replacement takes place.
+
+    Here an example transformer that rewrites all `foo` to `data['foo']`::
+
+        class RewriteName(NodeTransformer):
+
+            def visit_Name(self, node):
+                return copy_location(Subscript(
+                    value=Name(id='data', ctx=Load()),
+                    slice=Index(value=Str(s=node.id)),
+                    ctx=node.ctx
+                ), node)
+
+    Keep in mind that if the node you're operating on has child nodes
+    you must either transform the child nodes yourself or call the generic
+    visit function for the node first.
+
+    Nodes that were part of a collection of statements (that applies to
+    all statement nodes) may also return a list of nodes rather than just
+    a single node.
+
+    Usually you use the transformer like this::
+
+        node = YourTransformer().visit(node)
+    """
+
+    def generic_visit(self, node):
+        for field, old_value in iter_fields(node):
+            old_value = getattr(node, field, None)
+            if isinstance(old_value, list):
+                new_values = []
+                for value in old_value:
+                    if isinstance(value, AST):
+                        value = self.visit(value)
+                        if value is None:
+                            continue
+                        elif not isinstance(value, AST):
+                            new_values.extend(value)
+                            continue
+                    new_values.append(value)
+                old_value[:] = new_values
+            elif isinstance(old_value, AST):
+                new_node = self.visit(old_value)
+                if new_node is None:
+                    delattr(node, field)
+                else:
+                    setattr(node, field, new_node)
+        return node
+
+
+class SourceGenerator(NodeVisitor):
+    """
+    This visitor is able to transform a well formed syntax tree into python
+    sourcecode.  For more details have a look at the docstring of the
+    `node_to_source` function.
+    """
+
+    def __init__(self, indent_with):
+        self.result = []
+        self.indent_with = indent_with
+        self.indentation = 0
+        self.new_lines = 0
+
+    def write(self, x):
+        if self.new_lines:
+            if self.result:
+                self.result.append('\n' * self.new_lines)
+            self.result.append(self.indent_with * self.indentation)
+            self.new_lines = 0
+        self.result.append(x)
+
+    def newline(self, n=1):
+        self.new_lines = max(self.new_lines, n)
+
+    def body(self, statements):
+        self.new_line = True
+        self.indentation += 1
+        for stmt in statements:
+            self.visit(stmt)
+        self.indentation -= 1
+
+    def body_or_else(self, node):
+        self.body(node.body)
+        if node.orelse:
+            self.newline()
+            self.write('else:')
+            self.body(node.orelse)
+
+    def signature(self, node):
+        want_comma = []
+        def write_comma():
+            if want_comma:
+                self.write(', ')
+            else:
+                want_comma.append(True)
+
+        padding = [None] * (len(node.args) - len(node.defaults))
+        for arg, default in zip(node.args, padding + node.defaults):
+            write_comma()
+            self.visit(arg)
+            if default is not None:
+                self.write('=')
+                self.visit(default)
+        if node.vararg is not None:
+            write_comma()
+            self.write('*' + node.vararg)
+        if node.kwarg is not None:
+            write_comma()
+            self.write('**' + node.kwarg)
+
+    def decorators(self, node):
+        for decorator in node.decorator_list:
+            self.newline()
+            self.write('@')
+            self.visit(decorator)
+
+    # Statements
+
+    def visit_Assign(self, node):
+        self.newline()
+        for idx, target in enumerate(node.targets):
+            if idx:
+                self.write(', ')
+            self.visit(target)
+        self.write(' = ')
+        self.visit(node.value)
+
+    def visit_AugAssign(self, node):
+        self.newline()
+        self.visit(node.target)
+        self.write(BINOP_SYMBOLS[type(node.op)] + '=')
+        self.visit(node.value)
+
+    def visit_ImportFrom(self, node):
+        self.newline()
+        self.write('from %s%s import ' % ('.' * node.level, node.module))
+        for idx, item in enumerate(node.names):
+            if idx:
+                self.write(', ')
+            self.write(item)
+
+    def visit_Import(self, node):
+        self.newline()
+        for item in node.names:
+            self.write('import ')
+            self.visit(item)
+
+    def visit_Expr(self, node):
+        self.newline()
+        self.generic_visit(node)
+
+    def visit_FunctionDef(self, node):
+        self.newline(n=2)
+        self.decorators(node)
+        self.newline()
+        self.write('def %s(' % node.name)
+        self.signature(node.args)
+        self.write('):')
+        self.body(node.body)
+
+    def visit_ClassDef(self, node):
+        have_args = []
+        def paren_or_comma():
+            if have_args:
+                self.write(', ')
+            else:
+                have_args.append(True)
+                self.write('(')
+
+        self.newline(n=3)
+        self.decorators(node)
+        self.newline()
+        self.write('class %s' % node.name)
+        for base in node.bases:
+            paren_or_comma()
+            self.visit(base)
+        # XXX: the if here is used to keep this module compatible
+        #      with python 2.6.
+        if hasattr(node, 'keywords'):
+            for keyword in node.keywords:
+                paren_or_comma()
+                self.write(keyword.arg + '=')
+                self.visit(keyword.value)
+            if node.starargs is not None:
+                paren_or_comma()
+                self.write('*')
+                self.visit(node.starargs)
+            if node.kwargs is not None:
+                paren_or_comma()
+                self.write('**')
+                self.visit(node.kwargs)
+        self.write(have_args and '):' or ':')
+        self.body(node.body)
+
+    def visit_If(self, node):
+        self.newline()
+        self.write('if ')
+        self.visit(node.test)
+        self.write(':')
+        self.body(node.body)
+        while True:
+            else_ = node.orelse
+            if len(else_) == 1 and isinstance(else_[0], If):
+                node = else_[0]
+                self.newline()
+                self.write('elif ')
+                self.visit(node.test)
+                self.write(':')
+                self.body(node.body)
+            else:
+                self.newline()
+                self.write('else:')
+                self.body(else_)
+                break
+
+    def visit_For(self, node):
+        self.newline()
+        self.write('for ')
+        self.visit(node.target)
+        self.write(' in ')
+        self.visit(node.iter)
+        self.write(':')
+        self.body_or_else(node)
+
+    def visit_While(self, node):
+        self.newline()
+        self.write('while ')
+        self.visit(node.test)
+        self.write(':')
+        self.body_or_else(node)
+
+    def visit_With(self, node):
+        self.newline()
+        self.write('with ')
+        self.visit(node.context_expr)
+        if node.optional_vars is not None:
+            self.write(' as ')
+            self.visit(node.optional_vars)
+        self.write(':')
+        self.body(node.body)
+
+    def visit_Pass(self, node):
+        self.newline()
+        self.write('pass')
+
+    def visit_Print(self, node):
+        # XXX: python 2.6 only
+        self.newline()
+        self.write('print ')
+        want_comma = False
+        if node.dest is not None:
+            self.write(' >> ')
+            self.visit(node.dest)
+            want_comma = True
+        for value in node.values:
+            if want_comma:
+                self.write(', ')
+            self.visit(value)
+            want_comma = True
+        if not node.nl:
+            self.write(',')
+
+    def visit_Delete(self, node):
+        self.newline()
+        self.write('del ')
+        for idx, target in enumerate(node):
+            if idx:
+                self.write(', ')
+            self.visit(target)
+
+    def visit_TryExcept(self, node):
+        self.newline()
+        self.write('try:')
+        self.body(node.body)
+        for handler in node.handlers:
+            self.visit(handler)
+
+    def visit_TryFinally(self, node):
+        self.newline()
+        self.write('try:')
+        self.body(node.body)
+        self.newline()
+        self.write('finally:')
+        self.body(node.finalbody)
+
+    def visit_Global(self, node):
+        self.newline()
+        self.write('global ' + ', '.join(node.names))
+
+    def visit_Nonlocal(self, node):
+        self.newline()
+        self.write('nonlocal ' + ', '.join(node.names))
+
+    def visit_Return(self, node):
+        self.newline()
+        self.write('return ')
+        self.visit(node.value)
+
+    def visit_Break(self, node):
+        self.newline()
+        self.write('break')
+
+    def visit_Continue(self, node):
+        self.newline()
+        self.write('continue')
+
+    def visit_Raise(self, node):
+        # XXX: Python 2.6 / 3.0 compatibility
+        self.newline()
+        self.write('raise')
+        if hasattr(node, 'exc') and node.exc is not None:
+            self.write(' ')
+            self.visit(node.exc)
+            if node.cause is not None:
+                self.write(' from ')
+                self.visit(node.cause)
+        elif hasattr(node, 'type') and node.type is not None:
+            self.visit(node.type)
+            if node.inst is not None:
+                self.write(', ')
+                self.visit(node.inst)
+            if node.tback is not None:
+                self.write(', ')
+                self.visit(node.tback)
+
+    # Expressions
+
+    def visit_Attribute(self, node):
+        self.visit(node.value)
+        self.write('.' + node.attr)
+
+    def visit_Call(self, node):
+        want_comma = []
+        def write_comma():
+            if want_comma:
+                self.write(', ')
+            else:
+                want_comma.append(True)
+
+        self.visit(node.func)
+        self.write('(')
+        for arg in node.args:
+            write_comma()
+            self.visit(arg)
+        for keyword in node.keywords:
+            write_comma()
+            self.write(keyword.arg + '=')
+            self.visit(keyword.value)
+        if node.starargs is not None:
+            write_comma()
+            self.write('*')
+            self.visit(node.starargs)
+        if node.kwargs is not None:
+            write_comma()
+            self.write('**')
+            self.visit(node.kwargs)
+        self.write(')')
+
+    def visit_Name(self, node):
+        self.write(node.id)
+
+    def visit_Str(self, node):
+        self.write(repr(node.s))
+
+    def visit_Bytes(self, node):
+        self.write(repr(node.s))
+
+    def visit_Num(self, node):
+        self.write(repr(node.n))
+
+    def visit_Tuple(self, node):
+        self.write('(')
+        idx = -1
+        for idx, item in enumerate(node.elts):
+            if idx:
+                self.write(', ')
+            self.visit(item)
+        self.write(idx and ')' or ',)')
+
+    def sequence_visit(left, right):
+        def visit(self, node):
+            self.write(left)
+            for idx, item in enumerate(node.elts):
+                if idx:
+                    self.write(', ')
+                self.visit(item)
+            self.write(right)
+        return visit
+
+    visit_List = sequence_visit('[', ']')
+    visit_Set = sequence_visit('{', '}')
+    del sequence_visit
+
+    def visit_Dict(self, node):
+        self.write('{')
+        for idx, (key, value) in enumerate(zip(node.keys, node.values)):
+            if idx:
+                self.write(', ')
+            self.visit(key)
+            self.write(': ')
+            self.visit(value)
+        self.write('}')
+
+    def visit_BinOp(self, node):
+        self.write('(')
+        self.visit(node.left)
+        self.write(' %s ' % BINOP_SYMBOLS[type(node.op)])
+        self.visit(node.right)
+        self.write(')')
+
+    def visit_BoolOp(self, node):
+        self.write('(')
+        for idx, value in enumerate(node.values):
+            if idx:
+                self.write(' %s ' % BOOLOP_SYMBOLS[type(node.op)])
+            self.visit(value)
+        self.write(')')
+
+    def visit_Compare(self, node):
+        self.write('(')
+        self.visit(node.left)
+        for op, right in zip(node.ops, node.comparators):
+            self.write(' %s ' % CMPOP_SYMBOLS[type(op)])
+            self.visit(right)
+        self.write(')')
+
+    def visit_UnaryOp(self, node):
+        self.write('(')
+        op = UNARYOP_SYMBOLS[type(node.op)]
+        self.write(op)
+        if op == 'not':
+            self.write(' ')
+        self.visit(node.operand)
+        self.write(')')
+
+    def visit_Subscript(self, node):
+        self.visit(node.value)
+        self.write('[')
+        self.visit(node.slice)
+        self.write(']')
+
+    def visit_Slice(self, node):
+        if node.lower is not None:
+            self.visit(node.lower)
+        self.write(':')
+        if node.upper is not None:
+            self.visit(node.upper)
+        if node.step is not None:
+            self.write(':')
+            if not (isinstance(node.step, Name) and node.step.id == 'None'):
+                self.visit(node.step)
+
+    def visit_ExtSlice(self, node):
+        for idx, item in node.dims:
+            if idx:
+                self.write(', ')
+            self.visit(item)
+
+    def visit_Yield(self, node):
+        self.write('yield ')
+        self.visit(node.value)
+
+    def visit_Lambda(self, node):
+        self.write('lambda ')
+        self.signature(node.args)
+        self.write(': ')
+        self.visit(node.body)
+
+    def visit_Ellipsis(self, node):
+        self.write('Ellipsis')
+
+    def generator_visit(left, right):
+        def visit(self, node):
+            self.write(left)
+            self.visit(node.elt)
+            for comprehension in node.generators:
+                self.visit(comprehension)
+            self.write(right)
+        return visit
+
+    visit_ListComp = generator_visit('[', ']')
+    visit_GeneratorExp = generator_visit('(', ')')
+    visit_SetComp = generator_visit('{', '}')
+    del generator_visit
+
+    def visit_DictComp(self, node):
+        self.write('{')
+        self.visit(node.key)
+        self.write(': ')
+        self.visit(node.value)
+        for comprehension in node.generators:
+            self.visit(comprehension)
+        self.write('}')
+
+    def visit_IfExp(self, node):
+        self.visit(node.body)
+        self.write(' if ')
+        self.visit(node.test)
+        self.write(' else ')
+        self.visit(node.orelse)
+
+    def visit_Starred(self, node):
+        self.write('*')
+        self.visit(node.value)
+
+    def visit_Repr(self, node):
+        # XXX: python 2.6 only
+        self.write('`')
+        self.visit(node.value)
+        self.write('`')
+
+    # Helper Nodes
+
+    def visit_alias(self, node):
+        self.write(node.name)
+        if node.asname is not None:
+            self.write(' as ' + node.asname)
+
+    def visit_comprehension(self, node):
+        self.write(' for ')
+        self.visit(node.target)
+        self.write(' in ')
+        self.visit(node.iter)
+        if node.ifs:
+            for if_ in node.ifs:
+                self.write(' if ')
+                self.visit(if_)
+
+    def visit_excepthandler(self, node):
+        self.newline()
+        self.write('except')
+        if node.type is not None:
+            self.write(' ')
+            self.visit(node.type)
+            if node.name is not None:
+                self.write(' as ')
+                self.visit(node.name)
+        self.write(':')
+        self.body(node.body)
Index: /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/mako/ast.py
===================================================================
--- /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/mako/ast.py (revision 3)
+++ /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/mako/ast.py (revision 3)
@@ -0,0 +1,125 @@
+# ast.py
+# Copyright (C) 2006, 2007, 2008, 2009 Michael Bayer mike_mp@zzzcomputing.com
+#
+# This module is part of Mako and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+"""utilities for analyzing expressions and blocks of Python code, as well as generating Python from AST nodes"""
+
+from mako import exceptions, pyparser, util
+import re
+
+class PythonCode(object):
+    """represents information about a string containing Python code"""
+    def __init__(self, code, **exception_kwargs):
+        self.code = code
+        
+        # represents all identifiers which are assigned to at some point in the code
+        self.declared_identifiers = util.Set()
+        
+        # represents all identifiers which are referenced before their assignment, if any
+        self.undeclared_identifiers = util.Set()
+        
+        # note that an identifier can be in both the undeclared and declared lists.
+
+        # using AST to parse instead of using code.co_varnames, code.co_names has several advantages:
+        # - we can locate an identifier as "undeclared" even if its declared later in the same block of code
+        # - AST is less likely to break with version changes (for example, the behavior of co_names changed a little bit
+        # in python version 2.5)
+        if isinstance(code, basestring):
+            expr = pyparser.parse(code.lstrip(), "exec", **exception_kwargs)
+        else:
+            expr = code
+
+        f = pyparser.FindIdentifiers(self, **exception_kwargs)
+        f.visit(expr)
+
+class ArgumentList(object):
+    """parses a fragment of code as a comma-separated list of expressions"""
+    def __init__(self, code, **exception_kwargs):
+        self.codeargs = []
+        self.args = []
+        self.declared_identifiers = util.Set()
+        self.undeclared_identifiers = util.Set()
+        if isinstance(code, basestring):
+            if re.match(r"\S", code) and not re.match(r",\s*$", code):
+                # if theres text and no trailing comma, insure its parsed
+                # as a tuple by adding a trailing comma
+                code  += ","
+            expr = pyparser.parse(code, "exec", **exception_kwargs)
+        else:
+            expr = code
+
+        f = pyparser.FindTuple(self, PythonCode, **exception_kwargs)
+        f.visit(expr)
+        
+class PythonFragment(PythonCode):
+    """extends PythonCode to provide identifier lookups in partial control statements
+    
+    e.g. 
+        for x in 5:
+        elif y==9:
+        except (MyException, e):
+    etc.
+    """
+    def __init__(self, code, **exception_kwargs):
+        m = re.match(r'^(\w+)(?:\s+(.*?))?:\s*(#|$)', code.strip(), re.S)
+        if not m:
+            raise exceptions.CompileException("Fragment '%s' is not a partial control statement" % code, **exception_kwargs)
+        if m.group(3):
+            code = code[:m.start(3)]
+        (keyword, expr) = m.group(1,2)
+        if keyword in ['for','if', 'while']:
+            code = code + "pass"
+        elif keyword == 'try':
+            code = code + "pass\nexcept:pass"
+        elif keyword == 'elif' or keyword == 'else':
+            code = "if False:pass\n" + code + "pass"
+        elif keyword == 'except':
+            code = "try:pass\n" + code + "pass"
+        else:
+            raise exceptions.CompileException("Unsupported control keyword: '%s'" % keyword, **exception_kwargs)
+        super(PythonFragment, self).__init__(code, **exception_kwargs)
+        
+        
+class FunctionDecl(object):
+    """function declaration"""
+    def __init__(self, code, allow_kwargs=True, **exception_kwargs):
+        self.code = code
+        expr = pyparser.parse(code, "exec", **exception_kwargs)
+                
+        f = pyparser.ParseFunc(self, **exception_kwargs)
+        f.visit(expr)
+        if not hasattr(self, 'funcname'):
+            raise exceptions.CompileException("Code '%s' is not a function declaration" % code, **exception_kwargs)
+        if not allow_kwargs and self.kwargs:
+            raise exceptions.CompileException("'**%s' keyword argument not allowed here" % self.argnames[-1], **exception_kwargs)
+            
+    def get_argument_expressions(self, include_defaults=True):
+        """return the argument declarations of this FunctionDecl as a printable list."""
+        namedecls = []
+        defaults = [d for d in self.defaults]
+        kwargs = self.kwargs
+        varargs = self.varargs
+        argnames = [f for f in self.argnames]
+        argnames.reverse()
+        for arg in argnames:
+            default = None
+            if kwargs:
+                arg = "**" + arg
+                kwargs = False
+            elif varargs:
+                arg = "*" + arg
+                varargs = False
+            else:
+                default = len(defaults) and defaults.pop() or None
+            if include_defaults and default:
+                namedecls.insert(0, "%s=%s" % (arg, pyparser.ExpressionGenerator(default).value()))
+            else:
+                namedecls.insert(0, arg)
+        return namedecls
+
+class FunctionArgs(FunctionDecl):
+    """the argument portion of a function declaration"""
+    def __init__(self, code, **kwargs):
+        super(FunctionArgs, self).__init__("def ANON(%s):pass" % code, **kwargs)
Index: /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/EGG-INFO/SOURCES.txt
===================================================================
--- /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/EGG-INFO/SOURCES.txt (revision 3)
+++ /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/EGG-INFO/SOURCES.txt (revision 3)
@@ -0,0 +1,121 @@
+CHANGES
+LICENSE
+MANIFEST.in
+README
+scramble.py
+setup.cfg
+setup.py
+doc/caching.html
+doc/defs.html
+doc/docs.css
+doc/documentation.html
+doc/filtering.html
+doc/highlight.css
+doc/index.html
+doc/inheritance.html
+doc/makotemplates.txt
+doc/namespaces.html
+doc/runtime.html
+doc/syntax.html
+doc/unicode.html
+doc/usage.html
+doc/build/genhtml.py
+doc/build/read_markdown.py
+doc/build/content/caching.txt
+doc/build/content/defs.txt
+doc/build/content/documentation.html
+doc/build/content/filtering.txt
+doc/build/content/index.html
+doc/build/content/inheritance.txt
+doc/build/content/namespaces.txt
+doc/build/content/runtime.txt
+doc/build/content/syntax.txt
+doc/build/content/unicode.txt
+doc/build/content/usage.txt
+doc/build/lib/markdown.py
+doc/build/lib/toc.py
+doc/build/templates/autohandler
+doc/build/templates/base.html
+doc/build/templates/content_layout.html
+doc/build/templates/formatting.html
+doc/build/templates/nav.html
+doc/build/templates/toc.html
+examples/bench/basic.py
+examples/bench/cheetah/footer.tmpl
+examples/bench/cheetah/header.tmpl
+examples/bench/cheetah/template.tmpl
+examples/bench/django/templates/base.html
+examples/bench/django/templates/template.html
+examples/bench/django/templatetags/__init__.py
+examples/bench/django/templatetags/bench.py
+examples/bench/genshi/base.html
+examples/bench/genshi/template.html
+examples/bench/kid/base.kid
+examples/bench/kid/template.kid
+examples/bench/mako/footer.html
+examples/bench/mako/header.html
+examples/bench/mako/template.html
+examples/bench/mako_inheritance/base.html
+examples/bench/mako_inheritance/template.html
+examples/bench/myghty/base.myt
+examples/bench/myghty/template.myt
+examples/wsgi/run_wsgi.py
+examples/wsgi/htdocs/index.html
+examples/wsgi/templates/root.html
+lib/Mako.egg-info/PKG-INFO
+lib/Mako.egg-info/SOURCES.txt
+lib/Mako.egg-info/dependency_links.txt
+lib/Mako.egg-info/entry_points.txt
+lib/Mako.egg-info/not-zip-safe
+lib/Mako.egg-info/requires.txt
+lib/Mako.egg-info/top_level.txt
+lib/mako/__init__.py
+lib/mako/_ast_util.py
+lib/mako/ast.py
+lib/mako/cache.py
+lib/mako/codegen.py
+lib/mako/exceptions.py
+lib/mako/filters.py
+lib/mako/lexer.py
+lib/mako/lookup.py
+lib/mako/parsetree.py
+lib/mako/pygen.py
+lib/mako/pyparser.py
+lib/mako/runtime.py
+lib/mako/template.py
+lib/mako/util.py
+lib/mako/ext/__init__.py
+lib/mako/ext/autohandler.py
+lib/mako/ext/babelplugin.py
+lib/mako/ext/preprocessors.py
+lib/mako/ext/pygmentplugin.py
+lib/mako/ext/turbogears.py
+scripts/mako-render
+test/__init__.py
+test/alltests.py
+test/ast.py
+test/babelplugin.py
+test/cache.py
+test/call.py
+test/decorators.py
+test/def.py
+test/exceptions_.py
+test/filters.py
+test/inheritance.py
+test/lexer.py
+test/lookup.py
+test/lru.py
+test/namespace.py
+test/pygen.py
+test/template.py
+test/test_namespace.py
+test/tgplugin.py
+test/util.py
+test/foo/__init__.py
+test/foo/test_ns.py
+test_htdocs/chs_unicode.html
+test_htdocs/chs_utf8.html
+test_htdocs/crlf.html
+test_htdocs/gettext.mako
+test_htdocs/internationalization.html
+test_htdocs/read_unicode.html
Index: /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/EGG-INFO/scripts/mako-render
===================================================================
--- /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/EGG-INFO/scripts/mako-render (revision 3)
+++ /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/EGG-INFO/scripts/mako-render (revision 3)
@@ -0,0 +1,38 @@
+#!/afs/bx.psu.edu/project/pythons/linux-x86_64-ucs4/bin/python2.6
+
+def render(data):
+    from mako.template import Template
+    from mako.lookup import TemplateLookup
+
+    lookup = TemplateLookup(["."])
+    return Template(data, lookup=lookup).render()
+
+def main(argv=None):
+    from os.path import isfile
+    from sys import stdin
+
+    if argv is None:
+        import sys
+        argv = sys.argv
+
+    from optparse import OptionParser
+
+    parser = OptionParser("usage: %prog [FILENAME]")
+
+    opts, args = parser.parse_args(argv[1:])
+    if len(args) not in (0, 1):
+        parser.error("wrong number of arguments") # Will exit
+
+    if (len(args) == 0) or (args[0] == "-"):
+        fo = stdin
+    else:
+        filename = args[0]
+        if not isfile(filename):
+            raise SystemExit("error: can't find %s" % filename)
+        fo = open(filename)
+
+    data = fo.read()
+    print render(data)
+
+if __name__ == "__main__":
+    main()
Index: /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/EGG-INFO/top_level.txt
===================================================================
--- /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/EGG-INFO/top_level.txt (revision 3)
+++ /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/EGG-INFO/top_level.txt (revision 3)
@@ -0,0 +1,1 @@
+mako
Index: /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/EGG-INFO/PKG-INFO
===================================================================
--- /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/EGG-INFO/PKG-INFO (revision 3)
+++ /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/EGG-INFO/PKG-INFO (revision 3)
@@ -0,0 +1,28 @@
+Metadata-Version: 1.0
+Name: Mako
+Version: 0.2.5
+Summary: A super-fast templating language that borrows the  best ideas from the existing templating languages.
+Home-page: http://www.makotemplates.org/
+Author: Mike Bayer
+Author-email: mike@zzzcomputing.com
+License: MIT
+Description: Mako is a template library written in Python. It provides a familiar, non-XML
+        syntax which compiles into Python modules for maximum performance. Mako's
+        syntax and API borrows from the best ideas of many others, including Django
+        templates, Cheetah, Myghty, and Genshi. Conceptually, Mako is an embedded
+        Python (i.e. Python Server Page) language, which refines the familiar ideas
+        of componentized layout and inheritance to produce one of the most
+        straightforward and flexible models available, while also maintaining close
+        ties to Python calling and scoping semantics.
+        
+        SVN version:
+        <http://svn.makotemplates.org/mako/trunk#egg=Mako-dev>
+        
+        
+Keywords: wsgi myghty mako
+Platform: UNKNOWN
+Classifier: Development Status :: 4 - Beta
+Classifier: Environment :: Web Environment
+Classifier: Intended Audience :: Developers
+Classifier: Programming Language :: Python
+Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
Index: /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/EGG-INFO/entry_points.txt
===================================================================
--- /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/EGG-INFO/entry_points.txt (revision 3)
+++ /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/EGG-INFO/entry_points.txt (revision 3)
@@ -0,0 +1,14 @@
+
+      [python.templating.engines]
+      mako = mako.ext.turbogears:TGPlugin
+      
+      [pygments.lexers]
+      mako = mako.ext.pygmentplugin:MakoLexer
+      html+mako = mako.ext.pygmentplugin:MakoHtmlLexer
+      xml+mako = mako.ext.pygmentplugin:MakoXmlLexer
+      js+mako = mako.ext.pygmentplugin:MakoJavascriptLexer
+      css+mako = mako.ext.pygmentplugin:MakoCssLexer
+
+      [babel.extractors]
+      mako = mako.ext.babelplugin:extract
+      
Index: /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/EGG-INFO/dependency_links.txt
===================================================================
--- /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/EGG-INFO/dependency_links.txt (revision 3)
+++ /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/EGG-INFO/dependency_links.txt (revision 3)
@@ -0,0 +1,1 @@
+
Index: /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/EGG-INFO/not-zip-safe
===================================================================
--- /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/EGG-INFO/not-zip-safe (revision 3)
+++ /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/EGG-INFO/not-zip-safe (revision 3)
@@ -0,0 +1,1 @@
+
Index: /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/EGG-INFO/requires.txt
===================================================================
--- /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/EGG-INFO/requires.txt (revision 3)
+++ /galaxy-central/eggs/Mako-0.2.5-py2.6.egg/EGG-INFO/requires.txt (revision 3)
@@ -0,0 +1,1 @@
+Beaker>=1.1
Index: /galaxy-central/eggs/WebError-0.8a-py2.6.egg/weberror/exceptions/serial_number_generator.py
===================================================================
--- /galaxy-central/eggs/WebError-0.8a-py2.6.egg/weberror/exceptions/serial_number_generator.py (revision 3)
+++ /galaxy-central/eggs/WebError-0.8a-py2.6.egg/weberror/exceptions/serial_number_generator.py (revision 3)
@@ -0,0 +1,117 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+
+"""
+Creates a human-readable identifier, using numbers and digits,
+avoiding ambiguous numbers and letters.  hash_identifier can be used
+to create compact representations that are unique for a certain string
+(or concatenation of strings)
+"""
+
+import md5
+
+good_characters = "23456789abcdefghjkmnpqrtuvwxyz"
+
+base = len(good_characters)
+
+def make_identifier(number):
+    """
+    Encodes a number as an identifier.
+    """
+    if not isinstance(number, (int, long)):
+        raise ValueError(
+            "You can only make identifiers out of integers (not %r)"
+            % number)
+    if number < 0:
+        raise ValueError(
+            "You cannot make identifiers out of negative numbers: %r"
+            % number)
+    result = []
+    while number:
+        next = number % base
+        result.append(good_characters[next])
+        # Note, this depends on integer rounding of results:
+        number = number / base
+    return ''.join(result)
+
+def hash_identifier(s, length, pad=True, hasher=md5, prefix='',
+                    group=None, upper=False):
+    """
+    Hashes the string (with the given hashing module), then turns that
+    hash into an identifier of the given length (using modulo to
+    reduce the length of the identifier).  If ``pad`` is False, then
+    the minimum-length identifier will be used; otherwise the
+    identifier will be padded with 0's as necessary.
+
+    ``prefix`` will be added last, and does not count towards the
+    target length.  ``group`` will group the characters with ``-`` in
+    the given lengths, and also does not count towards the target
+    length.  E.g., ``group=4`` will cause a identifier like
+    ``a5f3-hgk3-asdf``.  Grouping occurs before the prefix.
+    """
+    if length > 26 and hasher is md5:
+        raise ValueError, (
+            "md5 cannot create hashes longer than 26 characters in "
+            "length (you gave %s)" % length)
+    if isinstance(s, unicode):
+        s = s.encode('utf-8')
+    h = hasher.new(str(s))
+    bin_hash = h.digest()
+    modulo = base ** length
+    number = 0
+    for c in list(bin_hash):
+        number = (number * 256 + ord(c)) % modulo
+    ident = make_identifier(number)
+    if pad:
+        ident = good_characters[0]*(length-len(ident)) + ident
+    if group:
+        parts = []
+        while ident:
+            parts.insert(0, ident[-group:])
+            ident = ident[:-group]
+        ident = '-'.join(parts)
+    if upper:
+        ident = ident.upper()
+    return prefix + ident
+
+# doctest tests:
+__test__ = {
+    'make_identifier': """
+    >>> make_identifier(0)
+    ''
+    >>> make_identifier(1000)
+    'c53'
+    >>> make_identifier(-100)
+    Traceback (most recent call last):
+        ...
+    ValueError: You cannot make identifiers out of negative numbers: -100
+    >>> make_identifier('test')
+    Traceback (most recent call last):
+        ...
+    ValueError: You can only make identifiers out of integers (not 'test')
+    >>> make_identifier(1000000000000)
+    'c53x9rqh3'
+    """,
+    'hash_identifier': """
+    >>> hash_identifier(0, 5)
+    'cy2dr'
+    >>> hash_identifier(0, 10)
+    'cy2dr6rg46'
+    >>> hash_identifier('this is a test of a long string', 5)
+    'awatu'
+    >>> hash_identifier(0, 26)
+    'cy2dr6rg46cx8t4w2f3nfexzk4'
+    >>> hash_identifier(0, 30)
+    Traceback (most recent call last):
+        ...
+    ValueError: md5 cannot create hashes longer than 26 characters in length (you gave 30)
+    >>> hash_identifier(0, 10, group=4)
+    'cy-2dr6-rg46'
+    >>> hash_identifier(0, 10, group=4, upper=True, prefix='M-')
+    'M-CY-2DR6-RG46'
+    """}
+
+if __name__ == '__main__':
+    import doctest
+    doctest.testmod()
+    
Index: /galaxy-central/eggs/WebError-0.8a-py2.6.egg/weberror/exceptions/__init__.py
===================================================================
--- /galaxy-central/eggs/WebError-0.8a-py2.6.egg/weberror/exceptions/__init__.py (revision 3)
+++ /galaxy-central/eggs/WebError-0.8a-py2.6.egg/weberror/exceptions/__init__.py (revision 3)
@@ -0,0 +1,2 @@
+"""Package for catching exceptions and displaying annotated exception 
+reports"""
Index: /galaxy-central/eggs/WebError-0.8a-py2.6.egg/weberror/exceptions/reporter.py
===================================================================
--- /galaxy-central/eggs/WebError-0.8a-py2.6.egg/weberror/exceptions/reporter.py (revision 3)
+++ /galaxy-central/eggs/WebError-0.8a-py2.6.egg/weberror/exceptions/reporter.py (revision 3)
@@ -0,0 +1,125 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+
+from email.MIMEText import MIMEText
+from email.MIMEMultipart import MIMEMultipart
+import smtplib
+import time
+from weberror.exceptions import formatter
+
+class Reporter(object):
+
+    def __init__(self, **conf):
+        for name, value in conf.items():
+            if not hasattr(self, name):
+                raise TypeError(
+                    "The keyword argument %s was not expected"
+                    % name)
+            setattr(self, name, value)
+        self.check_params()
+
+    def check_params(self):
+        pass
+
+    def format_date(self, exc_data):
+        return time.strftime('%c', exc_data.date)
+
+    def format_html(self, exc_data, **kw):
+        return formatter.format_html(exc_data, **kw)
+
+    def format_text(self, exc_data, **kw):
+        return formatter.format_text(exc_data, **kw)
+
+class EmailReporter(Reporter):
+
+    to_addresses = None
+    from_address = None
+    smtp_server = 'localhost'
+    subject_prefix = ''
+
+    def report(self, exc_data):
+        msg = self.assemble_email(exc_data)
+        server = smtplib.SMTP(self.smtp_server)
+        server.sendmail(self.from_address,
+                        self.to_addresses, msg.as_string())
+        server.quit()
+
+    def check_params(self):
+        if not self.to_addresses:
+            raise ValueError("You must set to_addresses")
+        if not self.from_address:
+            raise ValueError("You must set from_address")
+        if isinstance(self.to_addresses, (str, unicode)):
+            self.to_addresses = [self.to_addresses]
+
+    def assemble_email(self, exc_data):
+        short_html_version = self.format_html(
+            exc_data, show_hidden_frames=False)[0]
+        long_html_version = self.format_html(
+            exc_data, show_hidden_frames=True)[0]
+        text_version = self.format_text(
+            exc_data, show_hidden_frames=False)[0]
+        msg = MIMEMultipart()
+        msg.set_type('multipart/alternative')
+        msg.preamble = msg.epilogue = ''
+        text_msg = MIMEText(text_version)
+        text_msg.set_type('text/plain')
+        text_msg.set_param('charset', 'ASCII')
+        msg.attach(text_msg)
+        html_msg = MIMEText(short_html_version)
+        html_msg.set_type('text/html')
+        # @@: Correct character set?
+        html_msg.set_param('charset', 'UTF-8')
+        html_long = MIMEText(long_html_version)
+        html_long.set_type('text/html')
+        html_long.set_param('charset', 'UTF-8')
+        msg.attach(html_msg)
+        msg.attach(html_long)
+        subject = '%s: %s' % (exc_data.exception_type,
+                           formatter.truncate(str(exc_data.exception_value)))
+        msg['Subject'] = self.subject_prefix + subject
+        msg['From'] = self.from_address
+        msg['To'] = ', '.join(self.to_addresses)
+        return msg
+
+class LogReporter(Reporter):
+
+    filename = None
+    show_hidden_frames = True
+
+    def check_params(self):
+        assert self.filename is not None, (
+            "You must give a filename")
+
+    def report(self, exc_data):
+        text, head_text = self.format_text(
+            exc_data, show_hidden_frames=self.show_hidden_frames)
+        f = open(self.filename, 'a')
+        try:
+            f.write(text + '\n' + '-'*60 + '\n')
+        finally:
+            f.close()
+
+class FileReporter(Reporter):
+
+    file = None
+    show_hidden_frames = True
+
+    def check_params(self):
+        assert self.file is not None, (
+            "You must give a file object")
+
+    def report(self, exc_data):
+        text = self.format_text(
+            exc_data, show_hidden_frames=self.show_hidden_frames)
+        print text
+        self.file.write(text + '\n' + '-'*60 + '\n')
+
+class WSGIAppReporter(Reporter):
+
+    def __init__(self, exc_data):
+        self.exc_data = exc_data
+
+    def __call__(self, environ, start_response):
+        start_response('500 Server Error', [('Content-type', 'text/html')])
+        return [formatter.format_html(self.exc_data)]
Index: /galaxy-central/eggs/WebError-0.8a-py2.6.egg/weberror/exceptions/formatter.py
===================================================================
--- /galaxy-central/eggs/WebError-0.8a-py2.6.egg/weberror/exceptions/formatter.py (revision 3)
+++ /galaxy-central/eggs/WebError-0.8a-py2.6.egg/weberror/exceptions/formatter.py (revision 3)
@@ -0,0 +1,566 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+
+"""
+Formatters for the exception data that comes from ExceptionCollector.
+"""
+# @@: TODO:
+# Use this: http://www.zope.org/Members/tino/VisualTraceback/VisualTracebackNews
+
+import cgi
+import re
+import sys
+from weberror.util import PySourceColor
+from xml.dom.minidom import getDOMImplementation
+
+def html_quote(s):
+    return cgi.escape(str(s), True)
+
+class AbstractFormatter(object):
+
+    general_data_order = ['object', 'source_url']
+
+    def __init__(self, show_hidden_frames=False,
+                 include_reusable=True,
+                 show_extra_data=True,
+                 trim_source_paths=()):
+        self.show_hidden_frames = show_hidden_frames
+        self.trim_source_paths = trim_source_paths
+        self.include_reusable = include_reusable
+        self.show_extra_data = show_extra_data
+
+    def format_collected_data(self, exc_data):
+        general_data = {}
+        if self.show_extra_data:
+            for name, value_list in exc_data.extra_data.items():
+                if isinstance(name, tuple):
+                    importance, title = name
+                else:
+                    importance, title = 'normal', name
+                for value in value_list:
+                    general_data[(importance, name)] = self.format_extra_data(
+                        importance, title, value)
+        lines = []
+        frames = self.filter_frames(exc_data.frames)
+        for frame in frames:
+            res = self.format_frame_start(frame)
+            if res:
+                lines.append(res)
+            sup = frame.supplement
+            if sup:
+                if sup.object:
+                    general_data[('important', 'object')] = self.format_sup_object(
+                        sup.object)
+                if sup.source_url:
+                    general_data[('important', 'source_url')] = self.format_sup_url(
+                        sup.source_url)
+                if sup.line:
+                    lines.append(self.format_sup_line_pos(sup.line, sup.column))
+                if sup.expression:
+                    lines.append(self.format_sup_expression(sup.expression))
+                if sup.warnings:
+                    for warning in sup.warnings:
+                        lines.append(self.format_sup_warning(warning))
+                if sup.info:
+                    lines.extend(self.format_sup_info(sup.info))
+            if frame.supplement_exception:
+                lines.append('Exception in supplement:')
+                lines.append(self.quote_long(frame.supplement_exception))
+            if frame.traceback_info:
+                lines.append(self.format_traceback_info(frame.traceback_info))
+            filename = frame.filename
+            if filename and self.trim_source_paths:
+                for path, repl in self.trim_source_paths:
+                    if filename.startswith(path):
+                        filename = repl + filename[len(path):]
+                        break
+            lines.append(self.format_source_line(filename or '?', frame))
+            source = frame.get_source_line()
+            long_source = frame.get_source_line(2)
+            if source:
+                lines.append(self.format_long_source(
+                    source, long_source))
+            res = self.format_frame_end(frame)
+            if res:
+                lines.append(res)
+        etype = exc_data.exception_type
+        if not isinstance(etype, basestring):
+            etype = etype.__name__
+        exc_info = self.format_exception_info(
+            etype,
+            exc_data.exception_value)
+        data_by_importance = {'important': [], 'normal': [],
+                              'supplemental': [], 'extra': []}
+        for (importance, name), value in general_data.items():
+            data_by_importance[importance].append(
+                (name, value))
+        for value in data_by_importance.values():
+            value.sort()
+        return self.format_combine(data_by_importance, lines, exc_info)
+
+    def filter_frames(self, frames):
+        """
+        Removes any frames that should be hidden, according to the
+        values of traceback_hide, self.show_hidden_frames, and the
+        hidden status of the final frame.
+        """
+        if self.show_hidden_frames:
+            return frames
+        new_frames = []
+        hidden = False
+        for frame in frames:
+            hide = frame.traceback_hide
+            # @@: It would be nice to signal a warning if an unknown
+            # hide string was used, but I'm not sure where to put
+            # that warning.
+            if hide == 'before':
+                new_frames = []
+                hidden = False
+            elif hide == 'before_and_this':
+                new_frames = []
+                hidden = False
+                continue
+            elif hide == 'reset':
+                hidden = False
+            elif hide == 'reset_and_this':
+                hidden = False
+                continue
+            elif hide == 'after':
+                hidden = True
+            elif hide == 'after_and_this':
+                hidden = True
+                continue
+            elif hide:
+                continue
+            elif hidden:
+                continue
+            new_frames.append(frame)
+        if frames[-1] not in new_frames:
+            # We must include the last frame; that we don't indicates
+            # that the error happened where something was "hidden",
+            # so we just have to show everything
+            return frames
+        return new_frames
+
+    def format_frame_start(self, frame):
+        """
+        Called before each frame starts; may return None to output no text.
+        """
+        return None
+
+    def format_frame_end(self, frame):
+        """
+        Called after each frame ends; may return None to output no text.
+        """
+        return None
+
+    def pretty_string_repr(self, s):
+        """
+        Formats the string as a triple-quoted string when it contains
+        newlines.
+        """
+        if '\n' in s:
+            s = repr(s)
+            s = s[0]*3 + s[1:-1] + s[-1]*3
+            s = s.replace('\\n', '\n')
+            return s
+        else:
+            return repr(s)
+
+    def long_item_list(self, lst):
+        """
+        Returns true if the list contains items that are long, and should
+        be more nicely formatted.
+        """
+        how_many = 0
+        for item in lst:
+            if len(repr(item)) > 40:
+                how_many += 1
+                if how_many >= 3:
+                    return True
+        return False
+
+class TextFormatter(AbstractFormatter):
+
+    def quote(self, s):
+        return s
+    def quote_long(self, s):
+        return s
+    def emphasize(self, s):
+        return s
+    def format_sup_object(self, obj):
+        return 'In object: %s' % self.emphasize(self.quote(repr(obj)))
+    def format_sup_url(self, url):
+        return 'URL: %s' % self.quote(url)
+    def format_sup_line_pos(self, line, column):
+        if column:
+            return self.emphasize('Line %i, Column %i' % (line, column))
+        else:
+            return self.emphasize('Line %i' % line)
+    def format_sup_expression(self, expr):
+        return self.emphasize('In expression: %s' % self.quote(expr))
+    def format_sup_warning(self, warning):
+        return 'Warning: %s' % self.quote(warning)
+    def format_sup_info(self, info):
+        return [self.quote_long(info)]
+    def format_source_line(self, filename, frame):
+        return 'File %r, line %s in %s' % (
+            filename, frame.lineno or '?', frame.name or '?')
+    def format_long_source(self, source, long_source):
+        return self.format_source(source)
+    def format_source(self, source_line):
+        return '  ' + self.quote(source_line.strip())
+    def format_exception_info(self, etype, evalue):
+        return self.emphasize(
+            '%s: %s' % (self.quote(etype), self.quote(evalue)))
+    def format_traceback_info(self, info):
+        return info
+        
+    def format_combine(self, data_by_importance, lines, exc_info):
+        lines[:0] = [value for n, value in data_by_importance['important']]
+        lines.append(exc_info)
+        for name in 'normal', 'supplemental', 'extra':
+            lines.extend([value for n, value in data_by_importance[name]])
+        return self.format_combine_lines(lines), ''
+
+    def format_combine_lines(self, lines):
+        return '\n'.join(lines)
+
+    def format_extra_data(self, importance, title, value):
+        if isinstance(value, str):
+            s = self.pretty_string_repr(value)
+            if '\n' in s:
+                return '%s:\n%s' % (title, s)
+            else:
+                return '%s: %s' % (title, s)
+        elif isinstance(value, dict):
+            lines = ['\n', title, '-'*len(title)]
+            items = value.items()
+            items.sort()
+            for n, v in items:
+                try:
+                    v = repr(v)
+                except Exception, e:
+                    v = 'Cannot display: %s' % e
+                v = truncate(v)
+                lines.append('  %s: %s' % (n, v))
+            return '\n'.join(lines)
+        elif (isinstance(value, (list, tuple))
+              and self.long_item_list(value)):
+            parts = [truncate(repr(v)) for v in value]
+            return '%s: [\n    %s]' % (
+                title, ',\n    '.join(parts))
+        else:
+            return '%s: %s' % (title, truncate(repr(value)))
+
+class HTMLFormatter(TextFormatter):
+
+    def quote(self, s):
+        return html_quote(s)
+    def quote_long(self, s):
+        return '<pre>%s</pre>' % self.quote(s)
+    def emphasize(self, s):
+        return '<b>%s</b>' % s
+    def format_sup_url(self, url):
+        return 'URL: <a href="%s">%s</a>' % (url, url)
+    def format_combine_lines(self, lines):
+        ## FIXME: this is horrible:
+        new_lines = []
+        for line in lines:
+            if not line.startswith('<div') and not line.endswith('</div>'):
+                line += '<br>'
+            new_lines.append(line)
+        return '\n'.join(new_lines)
+    def format_source_line(self, filename, frame):
+        name = self.quote(frame.name or '?')
+        return 'Module <span class="module" title="%s">%s</span>:<b>%s</b> in <code>%s</code>' % (
+            filename, frame.modname or '?', frame.lineno or '?',
+            name)
+        return 'File %r, line %s in <tt>%s</tt>' % (
+            filename, frame.lineno, name)
+    def format_long_source(self, source, long_source):
+        q_long_source = str2html(long_source, False, 4, True)
+        q_source = str2html(source, True, 0, False)
+        return ('<code style="display: none" class="source" source-type="long"><a class="switch_source" onclick="return switch_source(this, \'long\')" href="#">&lt;&lt;&nbsp; </a>%s</code>'
+                '<code class="source" source-type="short"><a onclick="return switch_source(this, \'short\')" class="switch_source" href="#">&gt;&gt;&nbsp; </a>%s</code>'
+                % (q_long_source,
+                   q_source))
+    def format_source(self, source_line):
+        return '&nbsp;&nbsp;<code class="source">%s</code>' % self.quote(source_line.strip())
+    def format_traceback_info(self, info):
+        return '<pre>%s</pre>' % self.quote(info)
+    def format_frame_start(self, frame):
+        ## FIXME: make it zebra?
+        return '<div class="frame" style="padding: 0; margin: 0">'
+    def format_frame_end(self, frame):
+        return '</div>'
+
+    def format_extra_data(self, importance, title, value):
+        if isinstance(value, str):
+            s = self.pretty_string_repr(value)
+            if '\n' in s:
+                return '%s:<br><pre>%s</pre>' % (title, self.quote(s))
+            else:
+                return '%s: <tt>%s</tt>' % (title, self.quote(s))
+        elif isinstance(value, dict):
+            return self.zebra_table(title, value)
+        elif (isinstance(value, (list, tuple))
+              and self.long_item_list(value)):
+            return '%s: <tt>[<br>\n&nbsp; &nbsp; %s]</tt>' % (
+                title, ',<br>&nbsp; &nbsp; '.join(map(self.quote, map(repr, value))))
+        else:
+            return '%s: <tt>%s</tt>' % (title, self.quote(repr(value)))
+
+    def format_combine(self, data_by_importance, lines, exc_info):
+        lines[:0] = [value for n, value in data_by_importance['important']]
+        lines.append(exc_info)
+        for name in 'normal', 'supplemental':
+            lines.extend([value for n, value in data_by_importance[name]])
+        
+        extra_data = []
+        if data_by_importance['extra']:
+            extra_data.extend([value for n, value in data_by_importance['extra']])
+        text = self.format_combine_lines(lines)
+        if self.include_reusable:
+            return text, extra_data
+        else:
+            # Usually because another error is already on this page,
+            # and so the js & CSS are unneeded
+            return text, extra_data
+
+    def zebra_table(self, title, rows, table_class="variables"):
+        if isinstance(rows, dict):
+            rows = rows.items()
+            rows.sort()
+        table = ['<table class="%s">' % table_class,
+                 '<tr class="header"><th colspan="2">%s</th></tr>'
+                 % self.quote(title)]
+        odd = False
+        for name, value in rows:
+            try:
+                value = repr(value)
+            except Exception, e:
+                value = 'Cannot print: %s' % e
+            odd = not odd
+            table.append(
+                '<tr class="%s"><td>%s</td>'
+                % (odd and 'odd' or 'even', self.quote(name)))
+            table.append(
+                '<td><tt>%s</tt></td></tr>'
+                % make_wrappable(self.quote(truncate(value))))
+        table.append('</table>')
+        return '\n'.join(table)
+
+def create_text_node(doc, elem, text):
+    if not isinstance(text, basestring):
+        try:
+            text = repr(text)
+        except:
+            text = 'UNABLE TO GET TEXT REPRESENTATION'
+    new_elem = doc.createElement(elem)
+    new_elem.appendChild(doc.createTextNode(text))
+    return new_elem
+
+class XMLFormatter(AbstractFormatter):
+    def format_collected_data(self, exc_data):
+        impl = getDOMImplementation()
+        newdoc = impl.createDocument(None, "traceback", None)
+        top_element = newdoc.documentElement
+        
+        sysinfo = newdoc.createElement('sysinfo')
+        language = create_text_node(newdoc, 'language', 'Python')
+        language.attributes['version'] = sys.version.split(' ')[0]
+        sysinfo.appendChild(language)
+        top_element.appendChild(sysinfo)
+        
+        frames = self.filter_frames(exc_data.frames)
+        stack = newdoc.createElement('stack')
+        top_element.appendChild(stack)
+        for frame in frames:
+            xml_frame = newdoc.createElement('frame')
+            stack.appendChild(xml_frame)
+            
+            filename = frame.filename
+            if filename and self.trim_source_paths:
+                for path, repl in self.trim_source_paths:
+                    if filename.startswith(path):
+                        filename = repl + filename[len(path):]
+                        break
+            self.format_source_line(filename or '?', frame, newdoc, xml_frame)
+            
+            source = frame.get_source_line()
+            long_source = frame.get_source_line(2)
+            if source:
+                self.format_long_source(source, long_source, newdoc, xml_frame)
+            
+            # @@@ TODO: Put in a way to optionally toggle including variables
+            # variables = newdoc.createElement('variables')
+            # xml_frame.appendChild(variables)
+            # for name, value in frame.locals.iteritems():
+            #     if isinstance(value, unicode):
+            #         value = value.encode('ascii', 'xmlcharrefreplace')
+            #     variable = newdoc.createElement('variable')
+            #     variable.appendChild(create_text_node(newdoc, 'name', name))
+            #     variable.appendChild(create_text_node(newdoc, 'value', value))
+            #     variables.appendChild(variable)
+        
+        etype = exc_data.exception_type
+        if not isinstance(etype, basestring):
+            etype = etype.__name__
+        
+        top_element.appendChild(self.format_exception_info(
+            etype, exc_data.exception_value, newdoc))
+        return newdoc.toprettyxml(), ''
+    
+    def format_source_line(self, filename, frame, newdoc, xml_frame):
+        name = frame.name or '?'
+        xml_frame.appendChild(create_text_node(newdoc, 'module', frame.modname or '?'))
+        xml_frame.appendChild(create_text_node(newdoc, 'filename', filename))
+        xml_frame.appendChild(create_text_node(newdoc, 'line', frame.lineno or '?'))
+        xml_frame.appendChild(create_text_node(newdoc, 'function', name))
+    
+    def format_long_source(self, source, long_source, newdoc, xml_frame):
+        source = source.encode('ascii', 'xmlcharrefreplace')
+        long_source = long_source.encode('ascii', 'xmlcharrefreplace')
+        xml_frame.appendChild(create_text_node(newdoc, 'operation', source.strip()))
+        xml_frame.appendChild(create_text_node(newdoc, 'operation_context', long_source))
+
+    def format_exception_info(self, etype, evalue, newdoc):
+        exception = newdoc.createElement('exception')
+        evalue = evalue.encode('ascii', 'xmlcharrefreplace')
+        exception.appendChild(create_text_node(newdoc, 'type', etype))
+        exception.appendChild(create_text_node(newdoc, 'value', evalue))
+        return exception
+
+    
+def format_html(exc_data, include_hidden_frames=False, **ops):
+    if not include_hidden_frames:
+        return HTMLFormatter(**ops).format_collected_data(exc_data)
+    short_er = format_html(exc_data, show_hidden_frames=False, **ops)
+    # @@: This should have a way of seeing if the previous traceback
+    # was actually trimmed at all
+    ops['include_reusable'] = False
+    ops['show_extra_data'] = False
+    long_er, head_html = format_html(exc_data, show_hidden_frames=True, **ops)
+    text_er, head_text = format_text(exc_data, show_hidden_frames=True, **ops)
+    xml_er, head_xml = format_xml(exc_data, show_hidden_frames=True, **ops)
+    return """
+    %s
+    <div id="short_traceback">
+    %s
+    </div>
+    <div id="full_traceback" class="hidden-data">
+    %s
+    </div>
+    <div id="text_version" class="hidden-data">
+    <textarea style="width: 100%%" rows=10 cols=60>%s</textarea>
+    </div>
+    <div id="xml_version" class="hidden-data">
+    <textarea style="width: 100%%" rows=10 cols=60>%s</textarea>
+    </div>
+    """ % (head_html, short_er, long_er, cgi.escape(text_er), cgi.escape(xml_er))
+
+        
+def format_text(exc_data, **ops):
+    return TextFormatter(**ops).format_collected_data(exc_data)
+
+
+def format_xml(exc_data, **ops):
+    return XMLFormatter(**ops).format_collected_data(exc_data)
+
+
+whitespace_re = re.compile(r'  +')
+pre_re = re.compile(r'</?pre.*?>')
+error_re = re.compile(r'<h3>ERROR: .*?</h3>')
+
+def str2html(src, strip=False, indent_subsequent=0,
+             highlight_inner=False):
+    """
+    Convert a string to HTML.  Try to be really safe about it,
+    returning a quoted version of the string if nothing else works.
+    """
+    try:
+        return _str2html(src, strip=strip,
+                         indent_subsequent=indent_subsequent,
+                         highlight_inner=highlight_inner)
+    except:
+        return html_quote(src)
+
+def _str2html(src, strip=False, indent_subsequent=0,
+              highlight_inner=False):
+    if strip:
+        src = src.strip()
+    orig_src = src
+    try:
+        src = PySourceColor.str2html(src, form='snip')
+        src = error_re.sub('', src)
+        src = pre_re.sub('', src)
+        src = re.sub(r'^[\n\r]{0,1}', '', src)
+        src = re.sub(r'[\n\r]{0,1}$', '', src)
+    except:
+        src = html_quote(orig_src)
+    lines = src.splitlines()
+    if len(lines) == 1:
+        return lines[0]
+    indent = ' '*indent_subsequent
+    for i in range(1, len(lines)):
+        lines[i] = indent+lines[i]
+        if highlight_inner and i == len(lines)/2:
+            lines[i] = '<span class="source-highlight">%s</span>' % lines[i]
+    src = '<br>\n'.join(lines)
+    src = whitespace_re.sub(
+        lambda m: '&nbsp;'*(len(m.group(0))-1) + ' ', src)
+    return src
+
+def truncate(string, limit=1000):
+    """
+    Truncate the string to the limit number of
+    characters
+    """
+    if len(string) > limit:
+        return string[:limit-20]+'...'+string[-17:]
+    else:
+        return string
+
+def make_wrappable(html, wrap_limit=60,
+                   split_on=';?&@!$#-/\\"\''):
+    # Currently using <wbr>, maybe should use &#8203;
+    #   http://www.cs.tut.fi/~jkorpela/html/nobr.html
+    if len(html) <= wrap_limit:
+        return html
+    words = html.split()
+    new_words = []
+    for word in words:
+        wrapped_word = ''
+        while len(word) > wrap_limit:
+            for char in split_on:
+                if char in word:
+                    first, rest = word.split(char, 1)
+                    wrapped_word += first+char+'<wbr>'
+                    word = rest
+                    break
+            else:
+                for i in range(0, len(word), wrap_limit):
+                    wrapped_word += word[i:i+wrap_limit]+'<wbr>'
+                word = ''
+        wrapped_word += word
+        new_words.append(wrapped_word)
+    return ' '.join(new_words)
+
+def make_pre_wrappable(html, wrap_limit=60,
+                       split_on=';?&@!$#-/\\"\''):
+    """
+    Like ``make_wrappable()`` but intended for text that will
+    go in a ``<pre>`` block, so wrap on a line-by-line basis.
+    """
+    lines = html.splitlines()
+    new_lines = []
+    for line in lines:
+        if len(line) > wrap_limit:
+            for char in split_on:
+                if char in line:
+                    parts = line.split(char)
+                    line = '<wbr>'.join(parts)
+                    break
+        new_lines.append(line)
+    return '\n'.join(lines)
Index: /galaxy-central/eggs/WebError-0.8a-py2.6.egg/weberror/exceptions/collector.py
===================================================================
--- /galaxy-central/eggs/WebError-0.8a-py2.6.egg/weberror/exceptions/collector.py (revision 3)
+++ /galaxy-central/eggs/WebError-0.8a-py2.6.egg/weberror/exceptions/collector.py (revision 3)
@@ -0,0 +1,512 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+##############################################################################
+#
+# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+## Originally zExceptions.ExceptionFormatter from Zope;
+## Modified by Ian Bicking, Imaginary Landscape, 2005
+"""
+An exception collector that finds traceback information plus
+supplements
+"""
+
+import sys
+import traceback
+import time
+try:
+    from cStringIO import StringIO
+except ImportError:
+    from StringIO import StringIO
+import linecache
+from weberror.exceptions import serial_number_generator
+
+DEBUG_EXCEPTION_FORMATTER = True
+DEBUG_IDENT_PREFIX = 'E-'
+
+__all__ = ['collect_exception', 'ExceptionCollector']
+
+class ExceptionCollector(object):
+
+    """
+    Produces a data structure that can be used by formatters to
+    display exception reports.
+
+    Magic variables:
+
+    If you define one of these variables in your local scope, you can
+    add information to tracebacks that happen in that context.  This
+    allows applications to add all sorts of extra information about
+    the context of the error, including URLs, environmental variables,
+    users, hostnames, etc.  These are the variables we look for:
+
+    ``__traceback_supplement__``:
+        You can define this locally or globally (unlike all the other
+        variables, which must be defined locally).
+
+        ``__traceback_supplement__`` is a tuple of ``(factory, arg1,
+        arg2...)``.  When there is an exception, ``factory(arg1, arg2,
+        ...)`` is called, and the resulting object is inspected for
+        supplemental information.
+
+    ``__traceback_info__``:
+        This information is added to the traceback, usually fairly
+        literally.
+
+    ``__traceback_hide__``:
+        If set and true, this indicates that the frame should be
+        hidden from abbreviated tracebacks.  This way you can hide
+        some of the complexity of the larger framework and let the
+        user focus on their own errors.
+
+        By setting it to ``'before'``, all frames before this one will
+        be thrown away.  By setting it to ``'after'`` then all frames
+        after this will be thrown away until ``'reset'`` is found.  In
+        each case the frame where it is set is included, unless you
+        append ``'_and_this'`` to the value (e.g.,
+        ``'before_and_this'``).
+
+        Note that formatters will ignore this entirely if the frame
+        that contains the error wouldn't normally be shown according
+        to these rules.
+
+    ``__traceback_reporter__``:
+        This should be a reporter object (see the reporter module),
+        or a list/tuple of reporter objects.  All reporters found this
+        way will be given the exception, innermost first.
+
+    ``__traceback_decorator__``:
+        This object (defined in a local or global scope) will get the
+        result of this function (the CollectedException defined
+        below).  It may modify this object in place, or return an
+        entirely new object.  This gives the object the ability to
+        manipulate the traceback arbitrarily.
+
+    The actually interpretation of these values is largely up to the
+    reporters and formatters.
+    
+    ``collect_exception(*sys.exc_info())`` will return an object with
+    several attributes:
+
+    ``frames``:
+        A list of frames
+    ``exception_formatted``:
+        The formatted exception, generally a full traceback
+    ``exception_type``:
+        The type of the exception, like ``ValueError``
+    ``exception_value``:
+        The string value of the exception, like ``'x not in list'``
+    ``identification_code``:
+        A hash of the exception data meant to identify the general
+        exception, so that it shares this code with other exceptions
+        that derive from the same problem.  The code is a hash of
+        all the module names and function names in the traceback,
+        plus exception_type.  This should be shown to users so they
+        can refer to the exception later. (@@: should it include a
+        portion that allows identification of the specific instance
+        of the exception as well?)
+        
+    The list of frames goes innermost first.  Each frame has these
+    attributes; some values may be None if they could not be
+    determined.
+
+    ``modname``:
+        the name of the module
+    ``filename``:
+        the filename of the module
+    ``lineno``:
+        the line of the error
+    ``revision``:
+        the contents of __version__ or __revision__
+    ``name``:
+        the function name
+    ``supplement``:
+        an object created from ``__traceback_supplement__``
+    ``supplement_exception``:
+        a simple traceback of any exception ``__traceback_supplement__``
+        created
+    ``traceback_info``:
+        the str() of any ``__traceback_info__`` variable found in the local
+        scope (@@: should it str()-ify it or not?)
+    ``traceback_hide``:
+        the value of any ``__traceback_hide__`` variable
+    ``traceback_log``:
+        the value of any ``__traceback_log__`` variable
+    
+
+    ``__traceback_supplement__`` is thrown away, but a fixed
+    set of attributes are captured; each of these attributes is
+    optional.
+
+    ``object``:
+        the name of the object being visited
+    ``source_url``:
+        the original URL requested
+    ``line``:
+        the line of source being executed (for interpreters, like ZPT)
+    ``column``:
+        the column of source being executed
+    ``expression``:
+        the expression being evaluated (also for interpreters)
+    ``warnings``:
+        a list of (string) warnings to be displayed
+    ``getInfo``:
+        a function/method that takes no arguments, and returns a string
+        describing any extra information
+    ``extraData``:
+        a function/method that takes no arguments, and returns a
+        dictionary.  The contents of this dictionary will not be
+        displayed in the context of the traceback, but globally for
+        the exception.  Results will be grouped by the keys in the
+        dictionaries (which also serve as titles).  The keys can also
+        be tuples of (importance, title); in this case the importance
+        should be ``important`` (shows up at top), ``normal`` (shows
+        up somewhere; unspecified), ``supplemental`` (shows up at
+        bottom), or ``extra`` (shows up hidden or not at all).
+
+    These are used to create an object with attributes of the same
+    names (``getInfo`` becomes a string attribute, not a method).
+    ``__traceback_supplement__`` implementations should be careful to
+    produce values that are relatively static and unlikely to cause
+    further errors in the reporting system -- any complex
+    introspection should go in ``getInfo()`` and should ultimately
+    return a string.
+
+    Note that all attributes are optional, and under certain
+    circumstances may be None or may not exist at all -- the collector
+    can only do a best effort, but must avoid creating any exceptions
+    itself.
+
+    Formatters may want to use ``__traceback_hide__`` as a hint to
+    hide frames that are part of the 'framework' or underlying system.
+    There are a variety of rules about special values for this
+    variables that formatters should be aware of.
+    
+    TODO:
+
+    More attributes in __traceback_supplement__?  Maybe an attribute
+    that gives a list of local variables that should also be
+    collected?  Also, attributes that would be explicitly meant for
+    the entire request, not just a single frame.  Right now some of
+    the fixed set of attributes (e.g., source_url) are meant for this
+    use, but there's no explicit way for the supplement to indicate
+    new values, e.g., logged-in user, HTTP referrer, environment, etc.
+    Also, the attributes that do exist are Zope/Web oriented.
+
+    More information on frames?  cgitb, for instance, produces
+    extensive information on local variables.  There exists the
+    possibility that getting this information may cause side effects,
+    which can make debugging more difficult; but it also provides
+    fodder for post-mortem debugging.  However, the collector is not
+    meant to be configurable, but to capture everything it can and let
+    the formatters be configurable.  Maybe this would have to be a
+    configuration value, or maybe it could be indicated by another
+    magical variable (which would probably mean 'show all local
+    variables below this frame')
+    """
+
+    show_revisions = 0
+
+    def __init__(self, limit=None):
+        self.limit = limit
+
+    def getLimit(self):
+        limit = self.limit
+        if limit is None:
+            limit = getattr(sys, 'tracebacklimit', None)
+        return limit
+
+    def getRevision(self, globals):
+        if not self.show_revisions:
+            return None
+        revision = globals.get('__revision__', None)
+        if revision is None:
+            # Incorrect but commonly used spelling
+            revision = globals.get('__version__', None)
+
+        if revision is not None:
+            try:
+                revision = str(revision).strip()
+            except:
+                revision = '???'
+        return revision
+
+    def collectSupplement(self, supplement, tb):
+        result = {}
+
+        for name in ('object', 'source_url', 'line', 'column',
+                     'expression', 'warnings'):
+            result[name] = getattr(supplement, name, None)
+
+        func = getattr(supplement, 'getInfo', None)
+        if func:
+            result['info'] = func()
+        else:
+            result['info'] = None
+        func = getattr(supplement, 'extraData', None)
+        if func:
+            result['extra'] = func()
+        else:
+            result['extra'] = None
+        return SupplementaryData(**result)
+
+    def collectLine(self, tb, extra_data):
+        f = tb.tb_frame
+        lineno = tb.tb_lineno
+        co = f.f_code
+        filename = co.co_filename
+        name = co.co_name
+        locals = f.f_locals
+        globals = f.f_globals
+
+        data = {}
+        data['modname'] = globals.get('__name__', None)
+        data['filename'] = filename
+        data['lineno'] = lineno
+        data['revision'] = self.getRevision(globals)
+        data['name'] = name
+        data['tbid'] = id(tb)
+        data['locals'] = locals
+
+        # Output a traceback supplement, if any.
+        if locals.has_key('__traceback_supplement__'):
+            # Use the supplement defined in the function.
+            tbs = locals['__traceback_supplement__']
+        elif globals.has_key('__traceback_supplement__'):
+            # Use the supplement defined in the module.
+            # This is used by Scripts (Python).
+            tbs = globals['__traceback_supplement__']
+        else:
+            tbs = None
+        if tbs is not None:
+            factory = tbs[0]
+            args = tbs[1:]
+            try:
+                supp = factory(*args)
+                data['supplement'] = self.collectSupplement(supp, tb)
+                if data['supplement'].extra:
+                    for key, value in data['supplement'].extra.items():
+                        extra_data.setdefault(key, []).append(value)
+            except:
+                if DEBUG_EXCEPTION_FORMATTER:
+                    out = StringIO()
+                    traceback.print_exc(file=out)
+                    text = out.getvalue()
+                    data['supplement_exception'] = text
+                # else just swallow the exception.
+
+        try:
+            tbi = locals.get('__traceback_info__', None)
+            if tbi is not None:
+                data['traceback_info'] = str(tbi)
+        except:
+            pass
+
+        marker = []
+        for name in ('__traceback_hide__', '__traceback_log__',
+                     '__traceback_decorator__'):
+            try:
+                tbh = locals.get(name, globals.get(name, marker))
+                if tbh is not marker:
+                    data[name[2:-2]] = tbh
+            except:
+                pass
+
+        return data
+
+    def collectExceptionOnly(self, etype, value):
+        return traceback.format_exception_only(etype, value)
+
+    def collectException(self, etype, value, tb, limit=None):
+        # The next line provides a way to detect recursion.
+        __exception_formatter__ = 1
+        frames = []
+        ident_data = []
+        traceback_decorators = []
+        if limit is None:
+            limit = self.getLimit()
+        n = 0
+        extra_data = {}
+        while tb is not None and (limit is None or n < limit):
+            if tb.tb_frame.f_locals.get('__exception_formatter__'):
+                # Stop recursion. @@: should make a fake ExceptionFrame
+                frames.append('(Recursive formatException() stopped)\n')
+                break
+            data = self.collectLine(tb, extra_data)
+            frame = ExceptionFrame(**data)
+            frames.append(frame)
+            if frame.traceback_decorator is not None:
+                traceback_decorators.append(frame.traceback_decorator)
+            ident_data.append(frame.modname or '?')
+            ident_data.append(frame.name or '?')
+            tb = tb.tb_next
+            n = n + 1
+        ident_data.append(str(etype))
+        ident = serial_number_generator.hash_identifier(
+            ' '.join(ident_data), length=5, upper=True,
+            prefix=DEBUG_IDENT_PREFIX)
+
+        result = CollectedException(
+            frames=frames,
+            exception_formatted=self.collectExceptionOnly(etype, value),
+            exception_type=etype,
+            exception_value=str(value),
+            identification_code=ident,
+            date=time.localtime(),
+            extra_data=extra_data)
+        if etype is ImportError:
+            extra_data[('important', 'sys.path')] = [sys.path]
+        for decorator in traceback_decorators:
+            try:
+                new_result = decorator(result)
+                if new_result is not None:
+                    result = new_result
+            except:
+                pass
+        return result
+
+limit = 200
+
+class Bunch(object):
+
+    """
+    A generic container
+    """
+
+    def __init__(self, **attrs):
+        for name, value in attrs.items():
+            setattr(self, name, value)
+
+    def __repr__(self):
+        name = '<%s ' % self.__class__.__name__
+        try:
+            name += ' '.join(['%s=%r' % (name, str(value)[:30])
+                              for name, value in self.__dict__.items()
+                              if not name.startswith('_')])
+        except:
+            name += ' UNABLE TO GET REPRESENTATION'
+        return name + '>'
+
+class CollectedException(Bunch):
+    """
+    This is the result of collection the exception; it contains copies
+    of data of interest.
+    """
+    # A list of frames (ExceptionFrame instances), innermost last:
+    frames = []
+    # The result of traceback.format_exception_only; this looks
+    # like a normal traceback you'd see in the interactive interpreter
+    exception_formatted = None
+    # The *string* representation of the type of the exception
+    # (@@: should we give the # actual class? -- we can't keep the
+    # actual exception around, but the class should be safe)
+    # Something like 'ValueError'
+    exception_type = None
+    # The string representation of the exception, from ``str(e)``.
+    exception_value = None
+    # An identifier which should more-or-less classify this particular
+    # exception, including where in the code it happened.
+    identification_code = None
+    # The date, as time.localtime() returns:
+    date = None
+    # A dictionary of supplemental data:
+    extra_data = {}
+
+class SupplementaryData(Bunch):
+    """
+    The result of __traceback_supplement__.  We don't keep the
+    supplement object around, for fear of GC problems and whatnot.
+    (@@: Maybe I'm being too superstitious about copying only specific
+    information over)
+    """
+
+    # These attributes are copied from the object, or left as None
+    # if the object doesn't have these attributes:
+    object = None
+    source_url = None
+    line = None
+    column = None
+    expression = None
+    warnings = None
+    # This is the *return value* of supplement.getInfo():
+    info = None
+
+class ExceptionFrame(Bunch):
+    """
+    This represents one frame of the exception.  Each frame is a
+    context in the call stack, typically represented by a line
+    number and module name in the traceback.
+    """
+
+    # The name of the module; can be None, especially when the code
+    # isn't associated with a module.
+    modname = None
+    # The filename (@@: when no filename, is it None or '?'?)
+    filename = None
+    # Line number
+    lineno = None
+    # The value of __revision__ or __version__ -- but only if
+    # show_revision = True (by defaut it is false).  (@@: Why not
+    # collect this?)
+    revision = None
+    # The name of the function with the error (@@: None or '?' when
+    # unknown?)
+    name = None
+    # A SupplementaryData object, if __traceback_supplement__ was found
+    # (and produced no errors)
+    supplement = None
+    # If accessing __traceback_supplement__ causes any error, the
+    # plain-text traceback is stored here
+    supplement_exception = None
+    # The str() of any __traceback_info__ value found
+    traceback_info = None
+    # The value of __traceback_hide__
+    traceback_hide = False
+    # The value of __traceback_decorator__
+    traceback_decorator = None
+    # The id() of the traceback scope, can be used to reference the
+    # scope for use elsewhere
+    tbid = None
+
+    def get_source_line(self, context=0):
+        """
+        Return the source of the current line of this frame.  You
+        probably want to .strip() it as well, as it is likely to have
+        leading whitespace.
+
+        If context is given, then that many lines on either side will
+        also be returned.  E.g., context=1 will give 3 lines.
+        """
+        if not self.filename or not self.lineno:
+            return None
+        lines = []
+        for lineno in range(self.lineno-context, self.lineno+context+1):
+            lines.append(linecache.getline(self.filename, lineno))
+        return ''.join(lines)
+        
+if hasattr(sys, 'tracebacklimit'):
+    limit = min(limit, sys.tracebacklimit)
+
+col = ExceptionCollector()
+
+def collect_exception(t, v, tb, limit=None):
+    """
+    Collection an exception from ``sys.exc_info()``.
+    
+    Use like::
+
+      try:
+          blah blah
+      except:
+          exc_data = collect_exception(*sys.exc_info())
+    """
+    return col.collectException(t, v, tb, limit=limit)
Index: /galaxy-central/eggs/WebError-0.8a-py2.6.egg/weberror/exceptions/errormiddleware.py
===================================================================
--- /galaxy-central/eggs/WebError-0.8a-py2.6.egg/weberror/exceptions/errormiddleware.py (revision 3)
+++ /galaxy-central/eggs/WebError-0.8a-py2.6.egg/weberror/exceptions/errormiddleware.py (revision 3)
@@ -0,0 +1,427 @@
+# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
+# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+
+"""
+Error handler middleware
+"""
+import sys
+import traceback
+import cgi
+try:
+    from cStringIO import StringIO
+except ImportError:
+    from StringIO import StringIO
+from weberror.exceptions import formatter, collector, reporter
+from paste import wsgilib
+from paste import request
+
+__all__ = ['ErrorMiddleware', 'handle_exception']
+
+class _NoDefault(object):
+    def __repr__(self):
+        return '<NoDefault>'
+NoDefault = _NoDefault()
+
+class ErrorMiddleware(object):
+
+    """
+    Error handling middleware
+    
+    Usage::
+
+        error_caching_wsgi_app = ErrorMiddleware(wsgi_app)
+
+    Settings:
+
+      ``debug``:
+          If true, then tracebacks will be shown in the browser.
+
+      ``error_email``:
+          an email address (or list of addresses) to send exception 
+          reports to
+
+      ``error_log``:
+          a filename to append tracebacks to
+
+      ``show_exceptions_in_wsgi_errors``:
+          If true, then errors will be printed to ``wsgi.errors`` 
+          (frequently a server error log, or stderr).
+
+      ``from_address``, ``smtp_server``, ``error_subject_prefix``:
+          variables to control the emailed exception reports
+
+      ``error_message``:
+          When debug mode is off, the error message to show to users.
+
+      ``xmlhttp_key``:
+          When this key (default ``_``) is in the request GET variables
+          (not POST!), expect that this is an XMLHttpRequest, and the
+          response should be more minimal; it should not be a complete
+          HTML page.
+
+    Environment Configuration:
+    
+      ``paste.throw_errors``:
+          If this setting in the request environment is true, then this
+          middleware is disabled. This can be useful in a testing situation
+          where you don't want errors to be caught and transformed.
+
+      ``paste.expected_exceptions``:
+          When this middleware encounters an exception listed in this
+          environment variable and when the ``start_response`` has not 
+          yet occurred, the exception will be re-raised instead of being
+          caught.  This should generally be set by middleware that may 
+          (but probably shouldn't be) installed above this middleware, 
+          and wants to get certain exceptions.  Exceptions raised after
+          ``start_response`` have been called are always caught since
+          by definition they are no longer expected.
+
+    """
+
+    def __init__(self, application, global_conf=None,
+                 debug=NoDefault,
+                 error_email=None,
+                 error_log=None,
+                 show_exceptions_in_wsgi_errors=NoDefault,
+                 from_address=None,
+                 smtp_server=None,
+                 error_subject_prefix=None,
+                 error_message=None,
+                 xmlhttp_key=None):
+        from paste.util import converters
+        self.application = application
+        # @@: global_conf should be handled elsewhere in a separate
+        # function for the entry point
+        if global_conf is None:
+            global_conf = {}
+        if debug is NoDefault:
+            debug = converters.asbool(global_conf.get('debug'))
+        if show_exceptions_in_wsgi_errors is NoDefault:
+            show_exceptions_in_wsgi_errors = converters.asbool(global_conf.get('show_exceptions_in_wsgi_errors'))
+        self.debug_mode = converters.asbool(debug)
+        if error_email is None:
+            error_email = (global_conf.get('error_email')
+                           or global_conf.get('admin_email')
+                           or global_conf.get('webmaster_email')
+                           or global_conf.get('sysadmin_email'))
+        self.error_email = converters.aslist(error_email)
+        self.error_log = error_log
+        self.show_exceptions_in_wsgi_errors = show_exceptions_in_wsgi_errors
+        if from_address is None:
+            from_address = global_conf.get('error_from_address', 'errors@localhost')
+        self.from_address = from_address
+        if smtp_server is None:
+            smtp_server = global_conf.get('smtp_server', 'localhost')
+        self.smtp_server = smtp_server
+        self.error_subject_prefix = error_subject_prefix or ''
+        if error_message is None:
+            error_message = global_conf.get('error_message')
+        self.error_message = error_message
+        if xmlhttp_key is None:
+            xmlhttp_key = global_conf.get('xmlhttp_key', '_')
+        self.xmlhttp_key = xmlhttp_key
+            
+    def __call__(self, environ, start_response):
+        """
+        The WSGI application interface.
+        """
+        # We want to be careful about not sending headers twice,
+        # and the content type that the app has committed to (if there
+        # is an exception in the iterator body of the response)
+        if environ.get('paste.throw_errors'):
+            return self.application(environ, start_response)
+        environ['paste.throw_errors'] = True
+
+        try:
+            __traceback_supplement__ = Supplement, self, environ
+            app_iter = self.application(environ, start_response)
+            return self.make_catching_iter(app_iter, environ)
+        except:
+            exc_info = sys.exc_info()
+            try:
+                start_response('500 Internal Server Error',
+                               [('content-type', 'text/html')],
+                               exc_info)
+                # @@: it would be nice to deal with bad content types here
+                response = self.exception_handler(exc_info, environ)
+                return [response]
+            finally:
+                # clean up locals...
+                exc_info = None
+
+    def make_catching_iter(self, app_iter, environ):
+        if isinstance(app_iter, (list, tuple)):
+            # These don't raise
+            return app_iter
+        return CatchingIter(app_iter, environ, self)
+
+    def exception_handler(self, exc_info, environ):
+        simple_html_error = False
+        if self.xmlhttp_key:
+            get_vars = wsgilib.parse_querystring(environ)
+            if dict(get_vars).get(self.xmlhttp_key):
+                simple_html_error = True
+        return handle_exception(
+            exc_info, environ['wsgi.errors'],
+            html=True,
+            debug_mode=self.debug_mode,
+            error_email=self.error_email,
+            error_log=self.error_log,
+            show_exceptions_in_wsgi_errors=self.show_exceptions_in_wsgi_errors,
+            error_email_from=self.from_address,
+            smtp_server=self.smtp_server,
+            error_subject_prefix=self.error_subject_prefix,
+            error_message=self.error_message,
+            simple_html_error=simple_html_error)
+
+class CatchingIter(object):
+
+    """
+    A wrapper around the application iterator that will catch
+    exceptions raised by the a generator, or by the close method, and
+    display or report as necessary.
+    """
+
+    def __init__(self, app_iter, environ, error_middleware):
+        self.app_iterable = app_iter
+        self.app_iterator = iter(app_iter)
+        self.environ = environ
+        self.error_middleware = error_middleware
+        self.closed = False
+
+    def __iter__(self):
+        return self
+
+    def next(self):
+        __traceback_supplement__ = (
+            Supplement, self.error_middleware, self.environ)
+        if self.closed:
+            raise StopIteration
+        try:
+            return self.app_iterator.next()
+        except StopIteration:
+            self.closed = True
+            close_response = self._close()
+            if close_response is not None:
+                return close_response
+            else:
+                raise StopIteration
+        except:
+            self.closed = True
+            close_response = self._close()
+            response = self.error_middleware.exception_handler(
+                sys.exc_info(), self.environ)
+            if close_response is not None:
+                response += (
+                    '<hr noshade>Error in .close():<br>%s'
+                    % close_response)
+            return response
+
+    def close(self):
+        # This should at least print something to stderr if the
+        # close method fails at this point
+        if not self.closed:
+            self._close()
+
+    def _close(self):
+        """Close and return any error message"""
+        if not hasattr(self.app_iterable, 'close'):
+            return None
+        try:
+            self.app_iterable.close()
+            return None
+        except:
+            close_response = self.error_middleware.exception_handler(
+                sys.exc_info(), self.environ)
+            return close_response
+
+
+class Supplement(object):
+    """This is a supplement used to display standard WSGI information 
+    in the traceback.
+    
+    Additional configuration information can be added under a 
+    Configuration section by populating the environ['weberror.config']
+    variable with a dictionary to include.
+    
+    """
+    def __init__(self, middleware, environ):
+        self.middleware = middleware
+        self.environ = environ
+        self.source_url = request.construct_url(environ)
+
+    def extraData(self):
+        data = {}
+        cgi_vars = data[('extra', 'CGI Variables')] = {}
+        wsgi_vars = data[('extra', 'WSGI Variables')] = {}
+        hide_vars = ['paste.config', 'wsgi.errors', 'wsgi.input',
+                     'wsgi.multithread', 'wsgi.multiprocess',
+                     'wsgi.run_once', 'wsgi.version',
+                     'wsgi.url_scheme']
+        for name, value in self.environ.items():
+            if name.upper() == name:
+                if value:
+                    cgi_vars[name] = value
+            elif name not in hide_vars:
+                wsgi_vars[name] = value
+        if self.environ['wsgi.version'] != (1, 0):
+            wsgi_vars['wsgi.version'] = self.environ['wsgi.version']
+        proc_desc = tuple([int(bool(self.environ[key]))
+                           for key in ('wsgi.multiprocess',
+                                       'wsgi.multithread',
+                                       'wsgi.run_once')])
+        wsgi_vars['wsgi process'] = self.process_combos[proc_desc]
+        wsgi_vars['application'] = self.middleware.application
+        if 'weberror.config' in self.environ:
+            data[('extra', 'Configuration')] = dict(self.environ['weberror.config'])
+        return data
+
+    process_combos = {
+        # multiprocess, multithread, run_once
+        (0, 0, 0): 'Non-concurrent server',
+        (0, 1, 0): 'Multithreaded',
+        (1, 0, 0): 'Multiprocess',
+        (1, 1, 0): 'Multi process AND threads (?)',
+        (0, 0, 1): 'Non-concurrent CGI',
+        (0, 1, 1): 'Multithread CGI (?)',
+        (1, 0, 1): 'CGI',
+        (1, 1, 1): 'Multi thread/process CGI (?)',
+        }
+    
+def handle_exception(exc_info, error_stream, html=True,
+                     debug_mode=False,
+                     error_email=None,
+                     error_log=None,
+                     show_exceptions_in_wsgi_errors=False,
+                     error_email_from='errors@localhost',
+                     smtp_server='localhost',
+                     error_subject_prefix='',
+                     error_message=None,
+                     simple_html_error=False,
+                     ):
+    """
+    For exception handling outside of a web context
+
+    Use like::
+
+        import sys
+        import paste
+        import paste.error_middleware
+        try:
+            do stuff
+        except:
+            paste.error_middleware.exception_handler(
+                sys.exc_info(), paste.CONFIG, sys.stderr, html=False)
+
+    If you want to report, but not fully catch the exception, call
+    ``raise`` after ``exception_handler``, which (when given no argument)
+    will reraise the exception.
+    """
+    reported = False
+    exc_data = collector.collect_exception(*exc_info)
+    extra_data = ''
+    if error_email:
+        rep = reporter.EmailReporter(
+            to_addresses=error_email,
+            from_address=error_email_from,
+            smtp_server=smtp_server,
+            subject_prefix=error_subject_prefix)
+        rep_err = send_report(rep, exc_data, html=html)
+        if rep_err:
+            extra_data += rep_err
+        else:
+            reported = True
+    if error_log:
+        rep = reporter.LogReporter(
+            filename=error_log)
+        rep_err = send_report(rep, exc_data, html=html)
+        if rep_err:
+            extra_data += rep_err
+        else:
+            reported = True
+    if show_exceptions_in_wsgi_errors:
+        rep = reporter.FileReporter(
+            file=error_stream)
+        rep_err = send_report(rep, exc_data, html=html)
+        if rep_err:
+            extra_data += rep_err
+        else:
+            reported = True
+    else:
+        error_stream.write('Error - %s: %s\n' % (
+            exc_data.exception_type, exc_data.exception_value))
+    if html:
+        if debug_mode and simple_html_error:
+            return_error = formatter.format_html(
+                exc_data, include_hidden_frames=False,
+                include_reusable=False, show_extra_data=False)
+            reported = True
+        elif debug_mode and not simple_html_error:
+            error_html = formatter.format_html(
+                exc_data,
+                include_hidden_frames=True,
+                include_reusable=False)
+            head_html = ''
+            return_error = error_template(
+                head_html, error_html, extra_data)
+            extra_data = ''
+            reported = True
+        else:
+            msg = error_message or '''
+            An error occurred.  See the error logs for more information.
+            (Turn debug on to display exception reports here)
+            '''
+            return_error = error_template('', msg, '')
+    else:
+        return_error = None
+    if not reported and error_stream:
+        err_report = formatter.format_text(exc_data, show_hidden_frames=True)[0]
+        err_report += '\n' + '-'*60 + '\n'
+        error_stream.write(err_report)
+    if extra_data:
+        error_stream.write(extra_data)
+    return return_error
+
+def send_report(rep, exc_data, html=True):
+    try:
+        rep.report(exc_data)
+    except:
+        output = StringIO()
+        traceback.print_exc(file=output)
+        if html:
+            return """
+            <p>Additionally an error occurred while sending the %s report:
+
+            <pre>%s</pre>
+            </p>""" % (
+                cgi.escape(str(rep)), output.getvalue())
+        else:
+            return (
+                "Additionally an error occurred while sending the "
+                "%s report:\n%s" % (str(rep), output.getvalue()))
+    else:
+        return ''
+
+def error_template(head_html, exception, extra):
+    return '''
+    <html>
+    <head>
+    <title>Server Error</title>
+    %s
+    </head>
+    <body>
+    <h1>Server Error</h1>
+    %s
+    %s
+    </body>
+    </html>''' % (head_html, exception, extra)
+
+def make_error_middleware(app, global_conf, **kw):
+    return ErrorMiddleware(app, global_conf=global_conf, **kw)
+
+doc_lines = ErrorMiddleware.__doc__.splitlines(True)
+for i in range(len(doc_lines)):
+    if doc_lines[i].strip().startswith('Settings'):
+        make_error_middleware.__doc__ = ''.join(doc_lines[i:])
+        break
+del i, doc_lines
Index: /galaxy-central/eggs/WebError-0.8a-py2.6.egg/weberror/__init__.py
===================================================================
--- /galaxy-central/eggs/WebError-0.8a-py2.6.egg/weberror/__init__.py (revision 3)
+++ /galaxy-central/eggs/WebError-0.8a-py2.6.egg/weberror/__init__.py (revision 3)
@@ -0,0 +1,1 @@
+#
Index: /galaxy-central/eggs/WebError-0.8a-py2.6.egg/weberror/evalexception/media/debug.js
===================================================================
--- /galaxy-central/eggs/WebError-0.8a-py2.6.egg/weberror/evalexception/media/debug.js (revision 3)
+++ /galaxy-central/eggs/WebError-0.8a-py2.6.egg/weberror/evalexception/media/debug.js (revision 3)
@@ -0,0 +1,382 @@
+function showFrame(anchor) {
+    var tbid = anchor.getAttribute('tbid');
+    var expanded = anchor.expanded;
+    if (expanded) {
+        hideElement(anchor.expandedElement);
+        anchor.expanded = false;
+        _swapImage(anchor);
+        return false;
+    }
+    anchor.expanded = true;
+    if (anchor.expandedElement) {
+        showElement(anchor.expandedElement);
+        _swapImage(anchor);
+        $('#debug_input_'+tbid).get(0).focus();
+        return false;
+    }
+    var url = debug_base
+        + '/show_frame?tbid=' + tbid
+        + '&debugcount=' + debug_count;
+    callbackXHR(url, null, function (data) {
+                    var el = createElement('div');
+                    anchor.parentNode.insertBefore(el, anchor.nextSibling);
+                    el.innerHTML = data.responseText;
+                    anchor.expandedElement = el;
+                    _swapImage(anchor);
+                    $('#debug_input_'+tbid).get(0).focus();
+                });
+    return false;
+}
+
+function _swapImage(anchor) {
+    var el = anchor.getElementsByTagName('IMG')[0];
+    if (anchor.expanded) {
+        var img = 'minus.jpg';
+    } else {
+        var img = 'plus.jpg';
+    }
+    el.src = debug_base + '/media/' + img;
+}
+
+function showSource(anchor) {
+    var location = anchor.getAttribute('location');
+    showSourceCode(location);
+    return false;
+}
+
+function showSourceCode(location) {
+    var url = debug_base + '/source_code?location=' + escape(location);
+    var source = document.getElementById('source_data');
+    source.innerHTML = 'Loading...';
+    switch_display('source_data');
+    callbackXHR(url, null, function (req) {
+                    source.innerHTML = req.responseText;
+                    if (location.indexOf(':') > 0) {
+                        var lineno = location.substring(location.indexOf(':')+1);
+                        lineno = parseInt(lineno) - 10;
+                        if (lineno > 1) {
+                            document.location.hash = '#'+(lineno-10);
+                        }
+                    }
+                });
+}
+
+function submitInput(button, tbid) {
+    var input = $('#' + button.getAttribute('input-from')).get(0);
+    var output = $('#' + button.getAttribute('output-to')).get(0);
+    var url = debug_base
+        + '/exec_input';
+    var history = input.form.history;
+    input.historyPosition = 0;
+    if (! history) {
+        history = input.form.history = [];
+    }
+    history.push(input.value);
+    var vars = {
+        tbid: tbid,
+        debugcount: debug_count,
+        input: input.value
+    };
+    showElement(output);
+    callbackXHR(url, vars, function (data) {
+        var result = data.responseText;
+        output.innerHTML += result;
+        input.value = '';
+        input.focus();
+    });
+    return false;
+}
+
+function showError(msg) {
+    var el = $('#error-container').get(0);
+    if (el.innerHTML) {
+        el.innerHTML += '<hr noshade>\n' + msg;
+    } else {
+        el.innerHTML = msg;
+    }
+    showElement($('#error-area').get(0));
+}
+
+function clearError() {
+    var el = $('#error-container').get(0);
+    el.innerHTML = '';
+    $('#error-area').hide();
+}
+
+function expandInput(button) {
+    var input = button.form.elements.input;
+    stdops = {
+        name: 'input',
+        style: 'width: 100%',
+        autocomplete: 'off'
+    };
+    if (input.tagName == 'INPUT') {
+        var newEl = createElement('textarea', stdops);
+        var text = 'Contract';
+    } else {
+        stdops['type'] = 'text';
+        stdops['onkeypress'] = 'upArrow(this)';
+        var newEl = createElement('input', stdops);
+        var text = 'Expand';
+    }
+    newEl.value = input.value;
+    newEl.id = input.id;
+    swapDOM(input, newEl);
+    newEl.focus();
+    button.value = text;
+    return false;
+}
+
+function upArrow(input, event) {
+    if (window.event) {
+        event = window.event;
+    }
+    if (event.keyCode != 38 && event.keyCode != 40) {
+        // not an up- or down-arrow
+        return true;
+    }
+    var dir = event.keyCode == 38 ? 1 : -1;
+    var history = input.form.history;
+    if (! history) {
+        history = input.form.history = [];
+    }
+    var pos = input.historyPosition || 0;
+    if (! pos && dir == -1) {
+        return true;
+    }
+    if (! pos && input.value) {
+        history.push(input.value);
+        pos = 1;
+    }
+    pos += dir;
+    if (history.length-pos < 0) {
+        pos = 1;
+    }
+    if (history.length-pos > history.length-1) {
+        input.value = '';
+        return true;
+    }
+    input.historyPosition = pos;
+    var line = history[history.length-pos];
+    input.value = line;
+}
+
+function expandLong(anchor) {
+    var span = anchor;
+    while (span) {
+        if (span.style && span.style.display == 'none') {
+            break;
+        }
+        span = span.nextSibling;
+    }
+    if (! span) {
+        return false;
+    }
+    showElement(span);
+    hideElement(anchor);
+    return false;
+}
+
+function showElement(el) {
+    el.style.display = '';
+}
+
+function hideElement(el) {
+    el.style.display = 'none';
+}
+
+function createElement(tag, attrs /*, sub-elements...*/) {
+    var el = document.createElement(tag);
+    if (attrs) {
+        for (var i in attrs) {
+            el.setAttribute(i, attrs[i]);
+        }
+    }
+    for (var i=2; i<arguments.length; i++) {
+        var item = arguments[i];
+        if (typeof item == 'string') {
+            item = document.createTextNode(item);
+        }
+        el.appendChild(item);
+    }
+    return el;
+}
+
+function swapDOM(dest, src) {
+    var parent = dest.parentNode;
+    parent.replaceChild(src, dest);
+    return src;
+}
+
+
+function getXMLHttpRequest() {
+    /* Taken from MochiKit */
+    var tryThese = [
+        function () { return new XMLHttpRequest(); },
+        function () { return new ActiveXObject('Msxml2.XMLHTTP'); },
+        function () { return new ActiveXObject('Microsoft.XMLHTTP'); },
+        function () { return new ActiveXObject('Msxml2.XMLHTTP.4.0'); }
+        ];
+    for (var i = 0; i < tryThese.length; i++) {
+        var func = tryThese[i];
+        try {
+            return func();
+        } catch (e) {
+            // pass
+        }
+    }
+}
+
+function callbackXHR(url, data, callback) {
+    var xhr = getXMLHttpRequest();
+    xhr.onreadystatechange = function () {
+        if (xhr.readyState == 4) {
+            if (xhr.status == 200) {
+                callback(xhr);
+            } else {
+                showError(xhr.responseText);
+            }
+        }
+    };
+    var method = data ? "POST" : "GET";
+    xhr.open(method, url);
+    if (data) {
+        if (! (typeof data == 'string')) {
+            var newData = '';
+            for (var i in data) {
+                if (newData) {
+                    newData += '&';
+                }
+                newData += i + '=' + escape(data[i]);
+            }
+            data = newData;
+        }
+        xhr.setRequestHeader('content-type', 'application/x-www-form-urlencoded');
+        xhr.send(data);
+    } else {
+        xhr.send(null);
+    }
+}
+
+function switch_display(id) {
+    ids = ['extra_data', 'template_data', 'traceback_data', 'source_data'];
+    for (i in ids){
+        part = ids[i];
+        var el = document.getElementById(part);
+        el.className = "hidden-data";
+        var el = document.getElementById(part+'_tab');
+        el.className = "not-active";
+        var el = document.getElementById(part+'_link');
+        el.className = "not-active";
+    }
+    var el = document.getElementById(id);
+    el.className = "active";
+    var el = document.getElementById(id+'_link');
+    el.className = "active";
+    var el = document.getElementById(id+'_tab');
+    el.className = "active";
+}
+
+function hide_display(id) {
+    var el = document.getElementById(id);
+    if (el.className == "hidden-data") {
+        el.className = "";
+        return true;
+    } else {
+        el.className = "hidden-data";
+        return false;
+    }
+}
+
+function show_button(toggle_id, name) {
+    document.write('<a href="#' + toggle_id
+        + '" onclick="javascript:hide_display(\'' + toggle_id
+        + '\')" class="button">' + name + '</a><br>');
+}
+
+function switch_source(el, hide_type) {
+    while (el) {
+        if (el.getAttribute &&
+            el.getAttribute('source-type') == hide_type) {
+            break;
+        }
+        el = el.parentNode;
+    }
+    if (! el) {
+        return false;
+    }
+    el.style.display = 'none';
+    if (hide_type == 'long') {
+        while (el) {
+            if (el.getAttribute &&
+                el.getAttribute('source-type') == 'short') {
+                break;
+            }
+            el = el.nextSibling;
+        }
+    } else {
+        while (el) {
+            if (el.getAttribute &&
+                el.getAttribute('source-type') == 'long') {
+                break;
+            }
+            el = el.previousSibling;
+        }
+    }
+    if (el) {
+        el.style.display = '';
+    }
+    return false;
+}
+
+$(document).ready(function() {
+    var hide_all = function() {
+        $('#short_text_version, #long_text_version, #short_traceback, #full_traceback, #short_xml_version, #long_xml_version, div.feature-highlight').hide();
+        $('#view_long_text, #view_short_text, #view_long_html, #view_short_html, #view_short_xml, #view_long_xml').removeClass('active');
+    };
+    
+    if ($('#long_text_version').length == 0) {
+        $('#view_long_text').hide();
+    }
+    if ($('#full_traceback').length == 0) {
+        $('#view_long_html').hide();
+    }
+    
+    
+    $('#view_short_text').click(function() {
+        hide_all();
+        $('#short_text_version').show();
+        $(this).addClass('active');
+        return false;
+    });
+    $('#view_long_text').click(function() {
+        hide_all();
+        $('#long_text_version').show();
+        $(this).addClass('active');
+        return false;
+    });
+    $('#view_short_html').click(function() {
+        hide_all();
+        $('#short_traceback, div.feature-highlight').show();
+        $(this).addClass('active');
+        return false;
+    });
+    $('#view_long_html').click(function () {
+        hide_all();
+        $('#full_traceback, div.feature-highlight').show();
+        $(this).addClass('active');
+        return false;
+    });
+    $('#view_short_xml').click(function () {
+        hide_all();
+        $('#short_xml_version').show();
+        $(this).addClass('active');
+        return false;
+    });
+    $('#view_long_xml').click(function () {
+        hide_all();
+        $('#long_xml_version').show();
+        $(this).addClass('active');
+        return false;
+    });
+});
Index: /galaxy-central/eggs/WebError-0.8a-py2.6.egg/weberror/evalexception/media/traceback.css
===================================================================
--- /galaxy-central/eggs/WebError-0.8a-py2.6.egg/weberror/evalexception/media/traceback.css (revision 3)
+++ /galaxy-central/eggs/WebError-0.8a-py2.6.egg/weberror/evalexception/media/traceback.css (revision 3)
@@ -0,0 +1,570 @@
+body{
+    margin: 0px;
+    padding: 0px;/* 4% 0 0;*/
+    font-family: Verdana, Arial, sans-serif;
+    font-size: 75%;
+    line-height: 160%;
+    color: #333;
+    /*min-width:770px;
+    max-width: 1100px;*/
+}
+
+
+/* Layout Styles */
+
+div.main-content-bg{
+    
+}
+div.main-content-bar{
+    
+}
+div#nav-bar{
+    border-top: 1px solid #fff;
+    float: right; 
+    width: 100%;
+    margin-top: 0px;
+}
+div#main-content{
+    float: left; 
+    width: 100%;
+    background: #fff;
+}
+div#side-content{
+    padding-top: 42px;
+    float: left; margin-top: 0px; width: 30%; clear: right;
+    height: 550px;
+}
+div.three, div.two, div.one{
+    width: 746px;
+    padding: 0 12px 0px 12px;
+    clear: both;
+}
+
+div.three div.a, div.two div.a{
+    float: left;
+    clear: left;
+    width: 204px;
+}
+div.a div.padding, div.b div.padding, div.c div.padding, div.one div.padding{
+    padding: 0px 12px 20px 12px;
+}
+
+div.three div.b{
+    float: left;
+    width: 271px;
+}
+div.three div.c{
+    float: left;
+    clear: right;
+    width: 271px;
+}
+
+div.two div.b{
+    float: left;
+    clear: right;
+    width: 542px;
+}
+
+div.frame {
+    border-bottom: 1px solid #ccc;
+}
+
+/* Logo */
+
+
+h1#logo{
+    margin: 20px 5% 0 5%;
+    padding: 0;
+    float: left;
+    width: 155px;
+    height: 52px;
+}
+
+/* Nav Bar */
+
+#nav-global { 
+    margin:0; 
+    white-space:nowrap; 
+    float: right;
+    /*position: absolute; margin:0; left:380px; top: 0px;*/
+    padding-right: 5%;
+    clear: right;
+    padding-bottom: 20px;
+}
+#nav-global li {
+    display:block; 
+    float:left; 
+    list-style-type:none; 
+    margin:0; 
+    padding:0;
+}
+#nav-global a { 
+    display:block; 
+    float:left; 
+    /*font-family:"Trebuchet MS"; 
+    font-size: 110%; */
+    padding:42px 18px 7px 18px; 
+    background:#000000; 
+    color: #ccc; 
+    border: 0px;
+    text-decoration: underline;
+}
+#nav-global a:hover {
+    color:white; 
+    background: url(../img/main-nav-bg-on.png) bottom repeat-x; 
+    border: 0px;
+}
+
+ul#navlist
+{
+    margin: 0;
+    padding:0;
+    padding-left: 5%;
+    padding-top: 8px;
+    color: #eee;
+    line-height: 20px;
+}
+
+ul#navlist  li {
+    display: inline; 
+}
+
+ul#navlist li a
+{
+    /*font-family: Tahoma, sans-serif;
+    font-size: 11px;font-weight: bold;*/
+    border: 1px solid #fff;
+    /*padding: 0em 1em;*/
+    padding: 0 18px 0 18px;
+    color: #000;
+    margin-right: 9px;
+    text-decoration: none;
+    float: right;    
+}
+ul#navlist  li a#highlight , ul#navlist li a#highlight:hover
+{
+    color: #555;
+    padding-right: 33px;
+}
+
+ul#navlist li a:hover
+{
+    color: #b11;
+}
+
+ul#navlist li.active a.active,  ul#main-nav li.active a.active:hover
+{
+    color: #b00;
+    border: 1px solid #888;
+}
+
+
+
+/* Font Styles */
+
+a, a:link, a:visited, a:active {
+    color: #0040BB;
+    text-decoration: none;
+    border-bottom:  1px dotted #ccc;
+}
+a:hover{
+    color: #000;
+    border-bottom: 1px dotted #000;
+}
+
+a.no-underline, a.no-underline:link, a.no-underline:visited, a.no-underline:active {
+    border: 0px;
+}
+
+img.no-border{
+    border: 0px;
+}
+/* Paragraph Styles */
+
+.last{
+    padding-bottom: 0px;
+    margin-bottom: 0px;
+}
+
+.first{
+    margin-top: 0px;
+}
+
+blockquote {
+	padding-left: 10px;
+	padding-right: 10px;
+	margin-left: 5px;
+	margin-right: 0;
+	border-left: #ddd;
+	border-width: 0 0 0 1px;
+	border-style: none none none solid;
+}
+p.first, form{
+    padding: 0px;
+    margin: 0px;
+}
+
+.medium{
+    font-family: Verdana, Geneva, Arial, sans-serif;
+    font-size: 11px;
+    line-height: 19px;
+}
+
+.large{
+    font-size: 110%;
+}
+
+.small{
+    font-size: 90%;
+    line-height: 150%;
+    font-family: Verdana, sans-serif;
+    color: #000;
+}
+
+p.indent{
+    padding-left: 15px;
+    padding-bottom: 15px;
+}
+
+tt, code{
+    font-size: 130%;
+    color: #800000;
+}
+
+pre{
+   /* border-top: 1px dotted #000;
+    border-left: 1px dotted #000;
+    border-right: 1px solid #999;
+    border-bottom: 1px solid #999;
+    background: #eee;*/
+    font-size: 120%;
+    
+    padding: 3px 5px 3px 10px;
+    margin-right: 10px;
+}
+
+.go{
+    /*background: url(../img/go.png) no-repeat right bottom;*/
+    padding-right: 20px;
+}
+
+.help, a.help{
+    cursor: help;
+    font-weight: normal;
+}
+
+div.feature-highlight{
+    width: 550px;
+    background: #eee;
+    padding: 5px 10px 5px 10px;
+}
+
+/* Horizontal Rule */
+
+div.hr {
+    clear: both; line-height: 0px; font-size: 0px;     margin: 0px;
+    padding: 0px;
+    /*height: 4px;
+    url(../img/horizontal-rule.png) no-repeat;background: #000; 
+    margin-bottom: 20px;
+    width: 770px;*/
+}
+hr {
+    height: 1em;
+    visibility: hidden;
+    margin: 0px;
+    padding: 0px;
+}
+
+/* Form Styles */
+
+.form-style input[type=submit]{
+    background: #87CD15;
+    color: #fff;
+    border-top: 1px solid #999;
+    border-left: 1px solid #999;
+    border-bottom: 1px solid #333;
+    border-right: 1px solid #333;
+}
+
+.form-style input[type=text], textarea,  input[type=file]{
+    font-family: Tahoma, sans-serif;
+    font-size: 11px;
+    color: #444;
+    background: #EAFEC2;
+    border: solid 1px #aaa;
+    padding: 3px;
+}
+
+.form-style select{
+    font-family: Tahoma, sans-serif;
+    font-size: 11px;
+    color: #444;
+    background: #EAFEC2;
+    border: solid 1px #aaa;
+}
+
+/* Lists */
+
+ul.large{
+    padding: 0 0 0 15px;
+    margin: 0 0 15px 0px;
+}    
+ul.large li a {
+    font-weight: normal;
+}    
+
+
+/* Header Styles */
+
+h1.first{
+    margin-top: 0px;
+    margin-bottom: 2px;
+    border-bottom: 1px solid #666;
+    background: #fFF;
+    padding: 3px;
+}
+
+h1, h2, h3 {
+	font-size: 170%;
+	line-height: normal;
+	font-weight: normal;
+        font-family: Arial, sans-serif;
+	color: #000000;
+	text-decoration: none;
+	/*margin: 0 0 12px 0;
+	padding: 0;*/
+	text-align: left;
+}
+
+h2{
+    font-size: 140%;
+}
+
+h3 {
+    font-size: 120%;
+}
+
+h4{
+    font-size: 100%;
+}
+
+h4.asterix{
+    /*background: url(../img/box-small.png) no-repeat left center;*/
+    padding: 0px 0px 0px 15px;
+    margin: 0px;
+    /*font-size: 110%; */
+    color: #000000;
+}
+
+.main-exception {
+    font-size: 200%;
+}
+
+/* Boxes */
+
+#formats {
+    margin: 0 0 12px 14px;
+    font-size: 11px;
+    color: #888;
+    float: right;
+}
+
+#formats .title {
+    color: #222;
+}
+
+#formats a {
+    color: #22a;
+}
+
+#formats a:hover {
+    border-bottom: 1px solid #33f;
+}
+
+#formats a.active {
+    color: #0b0;
+    border-bottom: none;
+}
+
+div.faq-box{
+    /*border-style: solid;
+    border-color: #C6F27A;
+    border-width: 1px;*/
+    /*background:url('../img/hatch-green.png');*/
+    padding: 10px; 
+    /*font-family: Verdana, Geneva, Arial, sans-serif;
+    font-size: 11px;
+    line-height: 17px;*/
+    
+}
+div.highlight-box{
+    border-style: solid;
+    border-color: #cccccc;
+    border-width: 1px;
+    background:url('../img/hatch-yellow.png'); 
+    padding: 10px;
+    color: #555;
+    /*font-family: Verdana, Geneva, Arial, sans-serif;
+    font-size: 11px;
+    line-height: 17px;*/
+} 
+
+.box-top{
+    width: 518px;
+    /*background: url(../img/box-top.png) no-repeat left top;*/
+    padding-top: 7px;
+    margin-bottom: 15px;
+}
+.box-middle{
+    /*background: url(../img/box-middle.png) repeat-y left top;*/
+}
+.box-bottom{
+    /*background: url(../img/box-bottom.png) no-repeat left bottom;*/
+    padding: 0 10px 11px 12px;
+}
+
+
+/* Utility Styles */
+
+.content-padding{
+    padding: 0px 6.5% 40px 6.5%;
+}
+.sidebar-padding{
+    padding: 15px 15px 40px 25px;
+}
+.invisible{
+    visibility: hidden;
+    font-size: 1px;
+    padding: 0px;
+    line-height: 0px;
+    margin: 0px;
+}
+
+a.no-underline{
+    border: 0px;
+}
+
+img.no-border{
+    border: 0px;
+}
+
+br.clear{
+    clear: both;
+    width: 100%;
+}
+
+
+/* Quotes */
+.quote-top p{
+    padding: 0px;
+    margin: 0px;
+ 
+}
+.quote-top{
+    font-family: tahoma;
+    
+    /*background: url(../img/quote-top.png) no-repeat left top;*/
+    padding-left: 25px;
+    padding-top: 4px;
+}
+.quote-bottom{
+    /*background: url(../img/quote-bottom.png) no-repeat right bottom;*/
+    padding-right: 17px;
+    padding-bottom: 7px;
+}
+.quote-author{
+    
+    /*background: url(../img/quote-author.png) no-repeat left top;*/
+    padding-left: 20px;
+    padding-bottom: 20px;
+}
+/* Footer Styles */
+
+#footer{padding: 5px 5% 40px 5%;}
+#footer p{
+    color: #333;
+}
+#footer a{
+    font-weight: normal;
+}
+#footer a:visited{
+    color: #666;
+    text-decoration: none;
+    border-bottom: 1px dotted;
+}
+#footer a{
+    color: #888;
+    font-weight: normal;
+}
+#footer a:hover{
+    color: #000;
+    text-decoration: none;
+    border-bottom: 1px dotted;
+}
+
+
+table {
+  width: 100%;
+}
+
+tr.header {
+  background-color: #006;
+  color: #fff;
+}
+
+tr.even {
+  background-color: #ddd;
+}
+
+table.variables td {
+  vertical-align: top;
+  overflow: auto;
+}
+
+a.button {
+  background-color: #ccc;
+  border: 2px outset #aaa;
+  color: #000;
+  text-decoration: none;
+}
+
+a.button:hover {
+  background-color: #ddd;
+}
+
+code.source {
+  color: #006;
+}
+
+a.switch_source {
+  color: #090;
+  text-decoration: none;
+}
+
+a.switch_source:hover {
+  background-color: #ddd;
+}
+
+.source-highlight {
+  background-color: #ff9;
+}
+
+.red { color:#FF0000; }
+.bold { font-weight: bold; }
+
+.hidden-data {display: none}
+
+#util-link a, #util-link a:link, #util-link a:visited,
+#util-link a:active {
+    border-bottom: 2px outset #aaa
+}
+
+/* Mako Styles */
+
+.stacktrace { margin:5px 5px 5px 5px; }
+.highlight { padding:0px 10px 0px 10px; background-color:#9F9FDF; }
+.nonhighlight { padding:0px; background-color:#DFDFDF; }
+.sample { padding:10px; margin:10px 10px 10px 10px; font-family:monospace; font-size: 110%; }
+.sampleline { padding:0px 10px 0px 10px; }
+.sourceline { margin:5px 5px 10px 5px; font-family:monospace; font-size: 110%;}
Index: /galaxy-central/eggs/WebError-0.8a-py2.6.egg/weberror/evalexception/media/jquery-1.2.1.min.js
===================================================================
--- /galaxy-central/eggs/WebError-0.8a-py2.6.egg/weberror/evalexception/media/jquery-1.2.1.min.js (revision 3)
+++ /galaxy-central/eggs/WebError-0.8a-py2.6.egg/weberror/evalexception/media/jquery-1.2.1.min.js (revision 3)
@@ -0,0 +1,31 @@
+/*
+ * jQuery 1.2.1 - New Wave Javascript
+ *
+ * Copyright (c) 2007 John Resig (jquery.com)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * $Date: 2007-09-16 23:42:06 -0400 (Sun, 16 Sep 2007) $
+ * $Rev: 3353 $
+ */
+(function(){if(typeof jQuery!="undefined")var _jQuery=jQuery;var jQuery=window.jQuery=function(selector,context){return this instanceof jQuery?this.init(selector,context):new jQuery(selector,context);};if(typeof $!="undefined")var _$=$;window.$=jQuery;var quickExpr=/^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/;jQuery.fn=jQuery.prototype={init:function(selector,context){selector=selector||document;if(typeof selector=="string"){var m=quickExpr.exec(selector);if(m&&(m[1]||!context)){if(m[1])selector=jQuery.clean([m[1]],context);else{var tmp=document.getElementById(m[3]);if(tmp)if(tmp.id!=m[3])return jQuery().find(selector);else{this[0]=tmp;this.length=1;return this;}else
+selector=[];}}else
+return new jQuery(context).find(selector);}else if(jQuery.isFunction(selector))return new jQuery(document)[jQuery.fn.ready?"ready":"load"](selector);return this.setArray(selector.constructor==Array&&selector||(selector.jquery||selector.length&&selector!=window&&!selector.nodeType&&selector[0]!=undefined&&selector[0].nodeType)&&jQuery.makeArray(selector)||[selector]);},jquery:"1.2.1",size:function(){return this.length;},length:0,get:function(num){return num==undefined?jQuery.makeArray(this):this[num];},pushStack:function(a){var ret=jQuery(a);ret.prevObject=this;return ret;},setArray:function(a){this.length=0;Array.prototype.push.apply(this,a);return this;},each:function(fn,args){return jQuery.each(this,fn,args);},index:function(obj){var pos=-1;this.each(function(i){if(this==obj)pos=i;});return pos;},attr:function(key,value,type){var obj=key;if(key.constructor==String)if(value==undefined)return this.length&&jQuery[type||"attr"](this[0],key)||undefined;else{obj={};obj[key]=value;}return this.each(function(index){for(var prop in obj)jQuery.attr(type?this.style:this,prop,jQuery.prop(this,obj[prop],type,index,prop));});},css:function(key,value){return this.attr(key,value,"curCSS");},text:function(e){if(typeof e!="object"&&e!=null)return this.empty().append(document.createTextNode(e));var t="";jQuery.each(e||this,function(){jQuery.each(this.childNodes,function(){if(this.nodeType!=8)t+=this.nodeType!=1?this.nodeValue:jQuery.fn.text([this]);});});return t;},wrapAll:function(html){if(this[0])jQuery(html,this[0].ownerDocument).clone().insertBefore(this[0]).map(function(){var elem=this;while(elem.firstChild)elem=elem.firstChild;return elem;}).append(this);return this;},wrapInner:function(html){return this.each(function(){jQuery(this).contents().wrapAll(html);});},wrap:function(html){return this.each(function(){jQuery(this).wrapAll(html);});},append:function(){return this.domManip(arguments,true,1,function(a){this.appendChild(a);});},prepend:function(){return this.domManip(arguments,true,-1,function(a){this.insertBefore(a,this.firstChild);});},before:function(){return this.domManip(arguments,false,1,function(a){this.parentNode.insertBefore(a,this);});},after:function(){return this.domManip(arguments,false,-1,function(a){this.parentNode.insertBefore(a,this.nextSibling);});},end:function(){return this.prevObject||jQuery([]);},find:function(t){var data=jQuery.map(this,function(a){return jQuery.find(t,a);});return this.pushStack(/[^+>] [^+>]/.test(t)||t.indexOf("..")>-1?jQuery.unique(data):data);},clone:function(events){var ret=this.map(function(){return this.outerHTML?jQuery(this.outerHTML)[0]:this.cloneNode(true);});var clone=ret.find("*").andSelf().each(function(){if(this[expando]!=undefined)this[expando]=null;});if(events===true)this.find("*").andSelf().each(function(i){var events=jQuery.data(this,"events");for(var type in events)for(var handler in events[type])jQuery.event.add(clone[i],type,events[type][handler],events[type][handler].data);});return ret;},filter:function(t){return this.pushStack(jQuery.isFunction(t)&&jQuery.grep(this,function(el,index){return t.apply(el,[index]);})||jQuery.multiFilter(t,this));},not:function(t){return this.pushStack(t.constructor==String&&jQuery.multiFilter(t,this,true)||jQuery.grep(this,function(a){return(t.constructor==Array||t.jquery)?jQuery.inArray(a,t)<0:a!=t;}));},add:function(t){return this.pushStack(jQuery.merge(this.get(),t.constructor==String?jQuery(t).get():t.length!=undefined&&(!t.nodeName||jQuery.nodeName(t,"form"))?t:[t]));},is:function(expr){return expr?jQuery.multiFilter(expr,this).length>0:false;},hasClass:function(expr){return this.is("."+expr);},val:function(val){if(val==undefined){if(this.length){var elem=this[0];if(jQuery.nodeName(elem,"select")){var index=elem.selectedIndex,a=[],options=elem.options,one=elem.type=="select-one";if(index<0)return null;for(var i=one?index:0,max=one?index+1:options.length;i<max;i++){var option=options[i];if(option.selected){var val=jQuery.browser.msie&&!option.attributes["value"].specified?option.text:option.value;if(one)return val;a.push(val);}}return a;}else
+return this[0].value.replace(/\r/g,"");}}else
+return this.each(function(){if(val.constructor==Array&&/radio|checkbox/.test(this.type))this.checked=(jQuery.inArray(this.value,val)>=0||jQuery.inArray(this.name,val)>=0);else if(jQuery.nodeName(this,"select")){var tmp=val.constructor==Array?val:[val];jQuery("option",this).each(function(){this.selected=(jQuery.inArray(this.value,tmp)>=0||jQuery.inArray(this.text,tmp)>=0);});if(!tmp.length)this.selectedIndex=-1;}else
+this.value=val;});},html:function(val){return val==undefined?(this.length?this[0].innerHTML:null):this.empty().append(val);},replaceWith:function(val){return this.after(val).remove();},eq:function(i){return this.slice(i,i+1);},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments));},map:function(fn){return this.pushStack(jQuery.map(this,function(elem,i){return fn.call(elem,i,elem);}));},andSelf:function(){return this.add(this.prevObject);},domManip:function(args,table,dir,fn){var clone=this.length>1,a;return this.each(function(){if(!a){a=jQuery.clean(args,this.ownerDocument);if(dir<0)a.reverse();}var obj=this;if(table&&jQuery.nodeName(this,"table")&&jQuery.nodeName(a[0],"tr"))obj=this.getElementsByTagName("tbody")[0]||this.appendChild(document.createElement("tbody"));jQuery.each(a,function(){var elem=clone?this.cloneNode(true):this;if(!evalScript(0,elem))fn.call(obj,elem);});});}};function evalScript(i,elem){var script=jQuery.nodeName(elem,"script");if(script){if(elem.src)jQuery.ajax({url:elem.src,async:false,dataType:"script"});else
+jQuery.globalEval(elem.text||elem.textContent||elem.innerHTML||"");if(elem.parentNode)elem.parentNode.removeChild(elem);}else if(elem.nodeType==1)jQuery("script",elem).each(evalScript);return script;}jQuery.extend=jQuery.fn.extend=function(){var target=arguments[0]||{},a=1,al=arguments.length,deep=false;if(target.constructor==Boolean){deep=target;target=arguments[1]||{};}if(al==1){target=this;a=0;}var prop;for(;a<al;a++)if((prop=arguments[a])!=null)for(var i in prop){if(target==prop[i])continue;if(deep&&typeof prop[i]=='object'&&target[i])jQuery.extend(target[i],prop[i]);else if(prop[i]!=undefined)target[i]=prop[i];}return target;};var expando="jQuery"+(new Date()).getTime(),uuid=0,win={};jQuery.extend({noConflict:function(deep){window.$=_$;if(deep)window.jQuery=_jQuery;return jQuery;},isFunction:function(fn){return!!fn&&typeof fn!="string"&&!fn.nodeName&&fn.constructor!=Array&&/function/i.test(fn+"");},isXMLDoc:function(elem){return elem.documentElement&&!elem.body||elem.tagName&&elem.ownerDocument&&!elem.ownerDocument.body;},globalEval:function(data){data=jQuery.trim(data);if(data){if(window.execScript)window.execScript(data);else if(jQuery.browser.safari)window.setTimeout(data,0);else
+eval.call(window,data);}},nodeName:function(elem,name){return elem.nodeName&&elem.nodeName.toUpperCase()==name.toUpperCase();},cache:{},data:function(elem,name,data){elem=elem==window?win:elem;var id=elem[expando];if(!id)id=elem[expando]=++uuid;if(name&&!jQuery.cache[id])jQuery.cache[id]={};if(data!=undefined)jQuery.cache[id][name]=data;return name?jQuery.cache[id][name]:id;},removeData:function(elem,name){elem=elem==window?win:elem;var id=elem[expando];if(name){if(jQuery.cache[id]){delete jQuery.cache[id][name];name="";for(name in jQuery.cache[id])break;if(!name)jQuery.removeData(elem);}}else{try{delete elem[expando];}catch(e){if(elem.removeAttribute)elem.removeAttribute(expando);}delete jQuery.cache[id];}},each:function(obj,fn,args){if(args){if(obj.length==undefined)for(var i in obj)fn.apply(obj[i],args);else
+for(var i=0,ol=obj.length;i<ol;i++)if(fn.apply(obj[i],args)===false)break;}else{if(obj.length==undefined)for(var i in obj)fn.call(obj[i],i,obj[i]);else
+for(var i=0,ol=obj.length,val=obj[0];i<ol&&fn.call(val,i,val)!==false;val=obj[++i]){}}return obj;},prop:function(elem,value,type,index,prop){if(jQuery.isFunction(value))value=value.call(elem,[index]);var exclude=/z-?index|font-?weight|opacity|zoom|line-?height/i;return value&&value.constructor==Number&&type=="curCSS"&&!exclude.test(prop)?value+"px":value;},className:{add:function(elem,c){jQuery.each((c||"").split(/\s+/),function(i,cur){if(!jQuery.className.has(elem.className,cur))elem.className+=(elem.className?" ":"")+cur;});},remove:function(elem,c){elem.className=c!=undefined?jQuery.grep(elem.className.split(/\s+/),function(cur){return!jQuery.className.has(c,cur);}).join(" "):"";},has:function(t,c){return jQuery.inArray(c,(t.className||t).toString().split(/\s+/))>-1;}},swap:function(e,o,f){for(var i in o){e.style["old"+i]=e.style[i];e.style[i]=o[i];}f.apply(e,[]);for(var i in o)e.style[i]=e.style["old"+i];},css:function(e,p){if(p=="height"||p=="width"){var old={},oHeight,oWidth,d=["Top","Bottom","Right","Left"];jQuery.each(d,function(){old["padding"+this]=0;old["border"+this+"Width"]=0;});jQuery.swap(e,old,function(){if(jQuery(e).is(':visible')){oHeight=e.offsetHeight;oWidth=e.offsetWidth;}else{e=jQuery(e.cloneNode(true)).find(":radio").removeAttr("checked").end().css({visibility:"hidden",position:"absolute",display:"block",right:"0",left:"0"}).appendTo(e.parentNode)[0];var parPos=jQuery.css(e.parentNode,"position")||"static";if(parPos=="static")e.parentNode.style.position="relative";oHeight=e.clientHeight;oWidth=e.clientWidth;if(parPos=="static")e.parentNode.style.position="static";e.parentNode.removeChild(e);}});return p=="height"?oHeight:oWidth;}return jQuery.curCSS(e,p);},curCSS:function(elem,prop,force){var ret,stack=[],swap=[];function color(a){if(!jQuery.browser.safari)return false;var ret=document.defaultView.getComputedStyle(a,null);return!ret||ret.getPropertyValue("color")=="";}if(prop=="opacity"&&jQuery.browser.msie){ret=jQuery.attr(elem.style,"opacity");return ret==""?"1":ret;}if(prop.match(/float/i))prop=styleFloat;if(!force&&elem.style[prop])ret=elem.style[prop];else if(document.defaultView&&document.defaultView.getComputedStyle){if(prop.match(/float/i))prop="float";prop=prop.replace(/([A-Z])/g,"-$1").toLowerCase();var cur=document.defaultView.getComputedStyle(elem,null);if(cur&&!color(elem))ret=cur.getPropertyValue(prop);else{for(var a=elem;a&&color(a);a=a.parentNode)stack.unshift(a);for(a=0;a<stack.length;a++)if(color(stack[a])){swap[a]=stack[a].style.display;stack[a].style.display="block";}ret=prop=="display"&&swap[stack.length-1]!=null?"none":document.defaultView.getComputedStyle(elem,null).getPropertyValue(prop)||"";for(a=0;a<swap.length;a++)if(swap[a]!=null)stack[a].style.display=swap[a];}if(prop=="opacity"&&ret=="")ret="1";}else if(elem.currentStyle){var newProp=prop.replace(/\-(\w)/g,function(m,c){return c.toUpperCase();});ret=elem.currentStyle[prop]||elem.currentStyle[newProp];if(!/^\d+(px)?$/i.test(ret)&&/^\d/.test(ret)){var style=elem.style.left;var runtimeStyle=elem.runtimeStyle.left;elem.runtimeStyle.left=elem.currentStyle.left;elem.style.left=ret||0;ret=elem.style.pixelLeft+"px";elem.style.left=style;elem.runtimeStyle.left=runtimeStyle;}}return ret;},clean:function(a,doc){var r=[];doc=doc||document;jQuery.each(a,function(i,arg){if(!arg)return;if(arg.constructor==Number)arg=arg.toString();if(typeof arg=="string"){arg=arg.replace(/(<(\w+)[^>]*?)\/>/g,function(m,all,tag){return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area)$/i)?m:all+"></"+tag+">";});var s=jQuery.trim(arg).toLowerCase(),div=doc.createElement("div"),tb=[];var wrap=!s.indexOf("<opt")&&[1,"<select>","</select>"]||!s.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||s.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!s.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!s.indexOf("<td")||!s.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!s.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||jQuery.browser.msie&&[1,"div<div>","</div>"]||[0,"",""];div.innerHTML=wrap[1]+arg+wrap[2];while(wrap[0]--)div=div.lastChild;if(jQuery.browser.msie){if(!s.indexOf("<table")&&s.indexOf("<tbody")<0)tb=div.firstChild&&div.firstChild.childNodes;else if(wrap[1]=="<table>"&&s.indexOf("<tbody")<0)tb=div.childNodes;for(var n=tb.length-1;n>=0;--n)if(jQuery.nodeName(tb[n],"tbody")&&!tb[n].childNodes.length)tb[n].parentNode.removeChild(tb[n]);if(/^\s/.test(arg))div.insertBefore(doc.createTextNode(arg.match(/^\s*/)[0]),div.firstChild);}arg=jQuery.makeArray(div.childNodes);}if(0===arg.length&&(!jQuery.nodeName(arg,"form")&&!jQuery.nodeName(arg,"select")))return;if(arg[0]==undefined||jQuery.nodeName(arg,"form")||arg.options)r.push(arg);else
+r=jQuery.merge(r,arg);});return r;},attr:function(elem,name,value){var fix=jQuery.isXMLDoc(elem)?{}:jQuery.props;if(name=="selected"&&jQuery.browser.safari)elem.parentNode.selectedIndex;if(fix[name]){if(value!=undefined)elem[fix[name]]=value;return elem[fix[name]];}else if(jQuery.browser.msie&&name=="style")return jQuery.attr(elem.style,"cssText",value);else if(value==undefined&&jQuery.browser.msie&&jQuery.nodeName(elem,"form")&&(name=="action"||name=="method"))return elem.getAttributeNode(name).nodeValue;else if(elem.tagName){if(value!=undefined){if(name=="type"&&jQuery.nodeName(elem,"input")&&elem.parentNode)throw"type property can't be changed";elem.setAttribute(name,value);}if(jQuery.browser.msie&&/href|src/.test(name)&&!jQuery.isXMLDoc(elem))return elem.getAttribute(name,2);return elem.getAttribute(name);}else{if(name=="opacity"&&jQuery.browser.msie){if(value!=undefined){elem.zoom=1;elem.filter=(elem.filter||"").replace(/alpha\([^)]*\)/,"")+(parseFloat(value).toString()=="NaN"?"":"alpha(opacity="+value*100+")");}return elem.filter?(parseFloat(elem.filter.match(/opacity=([^)]*)/)[1])/100).toString():"";}name=name.replace(/-([a-z])/ig,function(z,b){return b.toUpperCase();});if(value!=undefined)elem[name]=value;return elem[name];}},trim:function(t){return(t||"").replace(/^\s+|\s+$/g,"");},makeArray:function(a){var r=[];if(typeof a!="array")for(var i=0,al=a.length;i<al;i++)r.push(a[i]);else
+r=a.slice(0);return r;},inArray:function(b,a){for(var i=0,al=a.length;i<al;i++)if(a[i]==b)return i;return-1;},merge:function(first,second){if(jQuery.browser.msie){for(var i=0;second[i];i++)if(second[i].nodeType!=8)first.push(second[i]);}else
+for(var i=0;second[i];i++)first.push(second[i]);return first;},unique:function(first){var r=[],done={};try{for(var i=0,fl=first.length;i<fl;i++){var id=jQuery.data(first[i]);if(!done[id]){done[id]=true;r.push(first[i]);}}}catch(e){r=first;}return r;},grep:function(elems,fn,inv){if(typeof fn=="string")fn=eval("false||function(a,i){return "+fn+"}");var result=[];for(var i=0,el=elems.length;i<el;i++)if(!inv&&fn(elems[i],i)||inv&&!fn(elems[i],i))result.push(elems[i]);return result;},map:function(elems,fn){if(typeof fn=="string")fn=eval("false||function(a){return "+fn+"}");var result=[];for(var i=0,el=elems.length;i<el;i++){var val=fn(elems[i],i);if(val!==null&&val!=undefined){if(val.constructor!=Array)val=[val];result=result.concat(val);}}return result;}});var userAgent=navigator.userAgent.toLowerCase();jQuery.browser={version:(userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[])[1],safari:/webkit/.test(userAgent),opera:/opera/.test(userAgent),msie:/msie/.test(userAgent)&&!/opera/.test(userAgent),mozilla:/mozilla/.test(userAgent)&&!/(compatible|webkit)/.test(userAgent)};var styleFloat=jQuery.browser.msie?"styleFloat":"cssFloat";jQuery.extend({boxModel:!jQuery.browser.msie||document.compatMode=="CSS1Compat",styleFloat:jQuery.browser.msie?"styleFloat":"cssFloat",props:{"for":"htmlFor","class":"className","float":styleFloat,cssFloat:styleFloat,styleFloat:styleFloat,innerHTML:"innerHTML",className:"className",value:"value",disabled:"disabled",checked:"checked",readonly:"readOnly",selected:"selected",maxlength:"maxLength"}});jQuery.each({parent:"a.parentNode",parents:"jQuery.dir(a,'parentNode')",next:"jQuery.nth(a,2,'nextSibling')",prev:"jQuery.nth(a,2,'previousSibling')",nextAll:"jQuery.dir(a,'nextSibling')",prevAll:"jQuery.dir(a,'previousSibling')",siblings:"jQuery.sibling(a.parentNode.firstChild,a)",children:"jQuery.sibling(a.firstChild)",contents:"jQuery.nodeName(a,'iframe')?a.contentDocument||a.contentWindow.document:jQuery.makeArray(a.childNodes)"},function(i,n){jQuery.fn[i]=function(a){var ret=jQuery.map(this,n);if(a&&typeof a=="string")ret=jQuery.multiFilter(a,ret);return this.pushStack(jQuery.unique(ret));};});jQuery.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(i,n){jQuery.fn[i]=function(){var a=arguments;return this.each(function(){for(var j=0,al=a.length;j<al;j++)jQuery(a[j])[n](this);});};});jQuery.each({removeAttr:function(key){jQuery.attr(this,key,"");this.removeAttribute(key);},addClass:function(c){jQuery.className.add(this,c);},removeClass:function(c){jQuery.className.remove(this,c);},toggleClass:function(c){jQuery.className[jQuery.className.has(this,c)?"remove":"add"](this,c);},remove:function(a){if(!a||jQuery.filter(a,[this]).r.length){jQuery.removeData(this);this.parentNode.removeChild(this);}},empty:function(){jQuery("*",this).each(function(){jQuery.removeData(this);});while(this.firstChild)this.removeChild(this.firstChild);}},function(i,n){jQuery.fn[i]=function(){return this.each(n,arguments);};});jQuery.each(["Height","Width"],function(i,name){var n=name.toLowerCase();jQuery.fn[n]=function(h){return this[0]==window?jQuery.browser.safari&&self["inner"+name]||jQuery.boxModel&&Math.max(document.documentElement["client"+name],document.body["client"+name])||document.body["client"+name]:this[0]==document?Math.max(document.body["scroll"+name],document.body["offset"+name]):h==undefined?(this.length?jQuery.css(this[0],n):null):this.css(n,h.constructor==String?h:h+"px");};});var chars=jQuery.browser.safari&&parseInt(jQuery.browser.version)<417?"(?:[\\w*_-]|\\\\.)":"(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",quickChild=new RegExp("^>\\s*("+chars+"+)"),quickID=new RegExp("^("+chars+"+)(#)("+chars+"+)"),quickClass=new RegExp("^([#.]?)("+chars+"*)");jQuery.extend({expr:{"":"m[2]=='*'||jQuery.nodeName(a,m[2])","#":"a.getAttribute('id')==m[2]",":":{lt:"i<m[3]-0",gt:"i>m[3]-0",nth:"m[3]-0==i",eq:"m[3]-0==i",first:"i==0",last:"i==r.length-1",even:"i%2==0",odd:"i%2","first-child":"a.parentNode.getElementsByTagName('*')[0]==a","last-child":"jQuery.nth(a.parentNode.lastChild,1,'previousSibling')==a","only-child":"!jQuery.nth(a.parentNode.lastChild,2,'previousSibling')",parent:"a.firstChild",empty:"!a.firstChild",contains:"(a.textContent||a.innerText||jQuery(a).text()||'').indexOf(m[3])>=0",visible:'"hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden"',hidden:'"hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden"',enabled:"!a.disabled",disabled:"a.disabled",checked:"a.checked",selected:"a.selected||jQuery.attr(a,'selected')",text:"'text'==a.type",radio:"'radio'==a.type",checkbox:"'checkbox'==a.type",file:"'file'==a.type",password:"'password'==a.type",submit:"'submit'==a.type",image:"'image'==a.type",reset:"'reset'==a.type",button:'"button"==a.type||jQuery.nodeName(a,"button")',input:"/input|select|textarea|button/i.test(a.nodeName)",has:"jQuery.find(m[3],a).length",header:"/h\\d/i.test(a.nodeName)",animated:"jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length"}},parse:[/^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/,/^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,new RegExp("^([:.#]*)("+chars+"+)")],multiFilter:function(expr,elems,not){var old,cur=[];while(expr&&expr!=old){old=expr;var f=jQuery.filter(expr,elems,not);expr=f.t.replace(/^\s*,\s*/,"");cur=not?elems=f.r:jQuery.merge(cur,f.r);}return cur;},find:function(t,context){if(typeof t!="string")return[t];if(context&&!context.nodeType)context=null;context=context||document;var ret=[context],done=[],last;while(t&&last!=t){var r=[];last=t;t=jQuery.trim(t);var foundToken=false;var re=quickChild;var m=re.exec(t);if(m){var nodeName=m[1].toUpperCase();for(var i=0;ret[i];i++)for(var c=ret[i].firstChild;c;c=c.nextSibling)if(c.nodeType==1&&(nodeName=="*"||c.nodeName.toUpperCase()==nodeName.toUpperCase()))r.push(c);ret=r;t=t.replace(re,"");if(t.indexOf(" ")==0)continue;foundToken=true;}else{re=/^([>+~])\s*(\w*)/i;if((m=re.exec(t))!=null){r=[];var nodeName=m[2],merge={};m=m[1];for(var j=0,rl=ret.length;j<rl;j++){var n=m=="~"||m=="+"?ret[j].nextSibling:ret[j].firstChild;for(;n;n=n.nextSibling)if(n.nodeType==1){var id=jQuery.data(n);if(m=="~"&&merge[id])break;if(!nodeName||n.nodeName.toUpperCase()==nodeName.toUpperCase()){if(m=="~")merge[id]=true;r.push(n);}if(m=="+")break;}}ret=r;t=jQuery.trim(t.replace(re,""));foundToken=true;}}if(t&&!foundToken){if(!t.indexOf(",")){if(context==ret[0])ret.shift();done=jQuery.merge(done,ret);r=ret=[context];t=" "+t.substr(1,t.length);}else{var re2=quickID;var m=re2.exec(t);if(m){m=[0,m[2],m[3],m[1]];}else{re2=quickClass;m=re2.exec(t);}m[2]=m[2].replace(/\\/g,"");var elem=ret[ret.length-1];if(m[1]=="#"&&elem&&elem.getElementById&&!jQuery.isXMLDoc(elem)){var oid=elem.getElementById(m[2]);if((jQuery.browser.msie||jQuery.browser.opera)&&oid&&typeof oid.id=="string"&&oid.id!=m[2])oid=jQuery('[@id="'+m[2]+'"]',elem)[0];ret=r=oid&&(!m[3]||jQuery.nodeName(oid,m[3]))?[oid]:[];}else{for(var i=0;ret[i];i++){var tag=m[1]=="#"&&m[3]?m[3]:m[1]!=""||m[0]==""?"*":m[2];if(tag=="*"&&ret[i].nodeName.toLowerCase()=="object")tag="param";r=jQuery.merge(r,ret[i].getElementsByTagName(tag));}if(m[1]==".")r=jQuery.classFilter(r,m[2]);if(m[1]=="#"){var tmp=[];for(var i=0;r[i];i++)if(r[i].getAttribute("id")==m[2]){tmp=[r[i]];break;}r=tmp;}ret=r;}t=t.replace(re2,"");}}if(t){var val=jQuery.filter(t,r);ret=r=val.r;t=jQuery.trim(val.t);}}if(t)ret=[];if(ret&&context==ret[0])ret.shift();done=jQuery.merge(done,ret);return done;},classFilter:function(r,m,not){m=" "+m+" ";var tmp=[];for(var i=0;r[i];i++){var pass=(" "+r[i].className+" ").indexOf(m)>=0;if(!not&&pass||not&&!pass)tmp.push(r[i]);}return tmp;},filter:function(t,r,not){var last;while(t&&t!=last){last=t;var p=jQuery.parse,m;for(var i=0;p[i];i++){m=p[i].exec(t);if(m){t=t.substring(m[0].length);m[2]=m[2].replace(/\\/g,"");break;}}if(!m)break;if(m[1]==":"&&m[2]=="not")r=jQuery.filter(m[3],r,true).r;else if(m[1]==".")r=jQuery.classFilter(r,m[2],not);else if(m[1]=="["){var tmp=[],type=m[3];for(var i=0,rl=r.length;i<rl;i++){var a=r[i],z=a[jQuery.props[m[2]]||m[2]];if(z==null||/href|src|selected/.test(m[2]))z=jQuery.attr(a,m[2])||'';if((type==""&&!!z||type=="="&&z==m[5]||type=="!="&&z!=m[5]||type=="^="&&z&&!z.indexOf(m[5])||type=="$="&&z.substr(z.length-m[5].length)==m[5]||(type=="*="||type=="~=")&&z.indexOf(m[5])>=0)^not)tmp.push(a);}r=tmp;}else if(m[1]==":"&&m[2]=="nth-child"){var merge={},tmp=[],test=/(\d*)n\+?(\d*)/.exec(m[3]=="even"&&"2n"||m[3]=="odd"&&"2n+1"||!/\D/.test(m[3])&&"n+"+m[3]||m[3]),first=(test[1]||1)-0,last=test[2]-0;for(var i=0,rl=r.length;i<rl;i++){var node=r[i],parentNode=node.parentNode,id=jQuery.data(parentNode);if(!merge[id]){var c=1;for(var n=parentNode.firstChild;n;n=n.nextSibling)if(n.nodeType==1)n.nodeIndex=c++;merge[id]=true;}var add=false;if(first==1){if(last==0||node.nodeIndex==last)add=true;}else if((node.nodeIndex+last)%first==0)add=true;if(add^not)tmp.push(node);}r=tmp;}else{var f=jQuery.expr[m[1]];if(typeof f!="string")f=jQuery.expr[m[1]][m[2]];f=eval("false||function(a,i){return "+f+"}");r=jQuery.grep(r,f,not);}}return{r:r,t:t};},dir:function(elem,dir){var matched=[];var cur=elem[dir];while(cur&&cur!=document){if(cur.nodeType==1)matched.push(cur);cur=cur[dir];}return matched;},nth:function(cur,result,dir,elem){result=result||1;var num=0;for(;cur;cur=cur[dir])if(cur.nodeType==1&&++num==result)break;return cur;},sibling:function(n,elem){var r=[];for(;n;n=n.nextSibling){if(n.nodeType==1&&(!elem||n!=elem))r.push(n);}return r;}});jQuery.event={add:function(element,type,handler,data){if(jQuery.browser.msie&&element.setInterval!=undefined)element=window;if(!handler.guid)handler.guid=this.guid++;if(data!=undefined){var fn=handler;handler=function(){return fn.apply(this,arguments);};handler.data=data;handler.guid=fn.guid;}var parts=type.split(".");type=parts[0];handler.type=parts[1];var events=jQuery.data(element,"events")||jQuery.data(element,"events",{});var handle=jQuery.data(element,"handle",function(){var val;if(typeof jQuery=="undefined"||jQuery.event.triggered)return val;val=jQuery.event.handle.apply(element,arguments);return val;});var handlers=events[type];if(!handlers){handlers=events[type]={};if(element.addEventListener)element.addEventListener(type,handle,false);else
+element.attachEvent("on"+type,handle);}handlers[handler.guid]=handler;this.global[type]=true;},guid:1,global:{},remove:function(element,type,handler){var events=jQuery.data(element,"events"),ret,index;if(typeof type=="string"){var parts=type.split(".");type=parts[0];}if(events){if(type&&type.type){handler=type.handler;type=type.type;}if(!type){for(type in events)this.remove(element,type);}else if(events[type]){if(handler)delete events[type][handler.guid];else
+for(handler in events[type])if(!parts[1]||events[type][handler].type==parts[1])delete events[type][handler];for(ret in events[type])break;if(!ret){if(element.removeEventListener)element.removeEventListener(type,jQuery.data(element,"handle"),false);else
+element.detachEvent("on"+type,jQuery.data(element,"handle"));ret=null;delete events[type];}}for(ret in events)break;if(!ret){jQuery.removeData(element,"events");jQuery.removeData(element,"handle");}}},trigger:function(type,data,element,donative,extra){data=jQuery.makeArray(data||[]);if(!element){if(this.global[type])jQuery("*").add([window,document]).trigger(type,data);}else{var val,ret,fn=jQuery.isFunction(element[type]||null),evt=!data[0]||!data[0].preventDefault;if(evt)data.unshift(this.fix({type:type,target:element}));data[0].type=type;if(jQuery.isFunction(jQuery.data(element,"handle")))val=jQuery.data(element,"handle").apply(element,data);if(!fn&&element["on"+type]&&element["on"+type].apply(element,data)===false)val=false;if(evt)data.shift();if(extra&&extra.apply(element,data)===false)val=false;if(fn&&donative!==false&&val!==false&&!(jQuery.nodeName(element,'a')&&type=="click")){this.triggered=true;element[type]();}this.triggered=false;}return val;},handle:function(event){var val;event=jQuery.event.fix(event||window.event||{});var parts=event.type.split(".");event.type=parts[0];var c=jQuery.data(this,"events")&&jQuery.data(this,"events")[event.type],args=Array.prototype.slice.call(arguments,1);args.unshift(event);for(var j in c){args[0].handler=c[j];args[0].data=c[j].data;if(!parts[1]||c[j].type==parts[1]){var tmp=c[j].apply(this,args);if(val!==false)val=tmp;if(tmp===false){event.preventDefault();event.stopPropagation();}}}if(jQuery.browser.msie)event.target=event.preventDefault=event.stopPropagation=event.handler=event.data=null;return val;},fix:function(event){var originalEvent=event;event=jQuery.extend({},originalEvent);event.preventDefault=function(){if(originalEvent.preventDefault)originalEvent.preventDefault();originalEvent.returnValue=false;};event.stopPropagation=function(){if(originalEvent.stopPropagation)originalEvent.stopPropagation();originalEvent.cancelBubble=true;};if(!event.target&&event.srcElement)event.target=event.srcElement;if(jQuery.browser.safari&&event.target.nodeType==3)event.target=originalEvent.target.parentNode;if(!event.relatedTarget&&event.fromElement)event.relatedTarget=event.fromElement==event.target?event.toElement:event.fromElement;if(event.pageX==null&&event.clientX!=null){var e=document.documentElement,b=document.body;event.pageX=event.clientX+(e&&e.scrollLeft||b.scrollLeft||0);event.pageY=event.clientY+(e&&e.scrollTop||b.scrollTop||0);}if(!event.which&&(event.charCode||event.keyCode))event.which=event.charCode||event.keyCode;if(!event.metaKey&&event.ctrlKey)event.metaKey=event.ctrlKey;if(!event.which&&event.button)event.which=(event.button&1?1:(event.button&2?3:(event.button&4?2:0)));return event;}};jQuery.fn.extend({bind:function(type,data,fn){return type=="unload"?this.one(type,data,fn):this.each(function(){jQuery.event.add(this,type,fn||data,fn&&data);});},one:function(type,data,fn){return this.each(function(){jQuery.event.add(this,type,function(event){jQuery(this).unbind(event);return(fn||data).apply(this,arguments);},fn&&data);});},unbind:function(type,fn){return this.each(function(){jQuery.event.remove(this,type,fn);});},trigger:function(type,data,fn){return this.each(function(){jQuery.event.trigger(type,data,this,true,fn);});},triggerHandler:function(type,data,fn){if(this[0])return jQuery.event.trigger(type,data,this[0],false,fn);},toggle:function(){var a=arguments;return this.click(function(e){this.lastToggle=0==this.lastToggle?1:0;e.preventDefault();return a[this.lastToggle].apply(this,[e])||false;});},hover:function(f,g){function handleHover(e){var p=e.relatedTarget;while(p&&p!=this)try{p=p.parentNode;}catch(e){p=this;};if(p==this)return false;return(e.type=="mouseover"?f:g).apply(this,[e]);}return this.mouseover(handleHover).mouseout(handleHover);},ready:function(f){bindReady();if(jQuery.isReady)f.apply(document,[jQuery]);else
+jQuery.readyList.push(function(){return f.apply(this,[jQuery]);});return this;}});jQuery.extend({isReady:false,readyList:[],ready:function(){if(!jQuery.isReady){jQuery.isReady=true;if(jQuery.readyList){jQuery.each(jQuery.readyList,function(){this.apply(document);});jQuery.readyList=null;}if(jQuery.browser.mozilla||jQuery.browser.opera)document.removeEventListener("DOMContentLoaded",jQuery.ready,false);if(!window.frames.length)jQuery(window).load(function(){jQuery("#__ie_init").remove();});}}});jQuery.each(("blur,focus,load,resize,scroll,unload,click,dblclick,"+"mousedown,mouseup,mousemove,mouseover,mouseout,change,select,"+"submit,keydown,keypress,keyup,error").split(","),function(i,o){jQuery.fn[o]=function(f){return f?this.bind(o,f):this.trigger(o);};});var readyBound=false;function bindReady(){if(readyBound)return;readyBound=true;if(jQuery.browser.mozilla||jQuery.browser.opera)document.addEventListener("DOMContentLoaded",jQuery.ready,false);else if(jQuery.browser.msie){document.write("<scr"+"ipt id=__ie_init defer=true "+"src=//:><\/script>");var script=document.getElementById("__ie_init");if(script)script.onreadystatechange=function(){if(this.readyState!="complete")return;jQuery.ready();};script=null;}else if(jQuery.browser.safari)jQuery.safariTimer=setInterval(function(){if(document.readyState=="loaded"||document.readyState=="complete"){clearInterval(jQuery.safariTimer);jQuery.safariTimer=null;jQuery.ready();}},10);jQuery.event.add(window,"load",jQuery.ready);}jQuery.fn.extend({load:function(url,params,callback){if(jQuery.isFunction(url))return this.bind("load",url);var off=url.indexOf(" ");if(off>=0){var selector=url.slice(off,url.length);url=url.slice(0,off);}callback=callback||function(){};var type="GET";if(params)if(jQuery.isFunction(params)){callback=params;params=null;}else{params=jQuery.param(params);type="POST";}var self=this;jQuery.ajax({url:url,type:type,data:params,complete:function(res,status){if(status=="success"||status=="notmodified")self.html(selector?jQuery("<div/>").append(res.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(selector):res.responseText);setTimeout(function(){self.each(callback,[res.responseText,status,res]);},13);}});return this;},serialize:function(){return jQuery.param(this.serializeArray());},serializeArray:function(){return this.map(function(){return jQuery.nodeName(this,"form")?jQuery.makeArray(this.elements):this;}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password/i.test(this.type));}).map(function(i,elem){var val=jQuery(this).val();return val==null?null:val.constructor==Array?jQuery.map(val,function(val,i){return{name:elem.name,value:val};}):{name:elem.name,value:val};}).get();}});jQuery.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(i,o){jQuery.fn[o]=function(f){return this.bind(o,f);};});var jsc=(new Date).getTime();jQuery.extend({get:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data=null;}return jQuery.ajax({type:"GET",url:url,data:data,success:callback,dataType:type});},getScript:function(url,callback){return jQuery.get(url,null,callback,"script");},getJSON:function(url,data,callback){return jQuery.get(url,data,callback,"json");},post:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data={};}return jQuery.ajax({type:"POST",url:url,data:data,success:callback,dataType:type});},ajaxSetup:function(settings){jQuery.extend(jQuery.ajaxSettings,settings);},ajaxSettings:{global:true,type:"GET",timeout:0,contentType:"application/x-www-form-urlencoded",processData:true,async:true,data:null},lastModified:{},ajax:function(s){var jsonp,jsre=/=(\?|%3F)/g,status,data;s=jQuery.extend(true,s,jQuery.extend(true,{},jQuery.ajaxSettings,s));if(s.data&&s.processData&&typeof s.data!="string")s.data=jQuery.param(s.data);if(s.dataType=="jsonp"){if(s.type.toLowerCase()=="get"){if(!s.url.match(jsre))s.url+=(s.url.match(/\?/)?"&":"?")+(s.jsonp||"callback")+"=?";}else if(!s.data||!s.data.match(jsre))s.data=(s.data?s.data+"&":"")+(s.jsonp||"callback")+"=?";s.dataType="json";}if(s.dataType=="json"&&(s.data&&s.data.match(jsre)||s.url.match(jsre))){jsonp="jsonp"+jsc++;if(s.data)s.data=s.data.replace(jsre,"="+jsonp);s.url=s.url.replace(jsre,"="+jsonp);s.dataType="script";window[jsonp]=function(tmp){data=tmp;success();complete();window[jsonp]=undefined;try{delete window[jsonp];}catch(e){}};}if(s.dataType=="script"&&s.cache==null)s.cache=false;if(s.cache===false&&s.type.toLowerCase()=="get")s.url+=(s.url.match(/\?/)?"&":"?")+"_="+(new Date()).getTime();if(s.data&&s.type.toLowerCase()=="get"){s.url+=(s.url.match(/\?/)?"&":"?")+s.data;s.data=null;}if(s.global&&!jQuery.active++)jQuery.event.trigger("ajaxStart");if(!s.url.indexOf("http")&&s.dataType=="script"){var head=document.getElementsByTagName("head")[0];var script=document.createElement("script");script.src=s.url;if(!jsonp&&(s.success||s.complete)){var done=false;script.onload=script.onreadystatechange=function(){if(!done&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){done=true;success();complete();head.removeChild(script);}};}head.appendChild(script);return;}var requestDone=false;var xml=window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest();xml.open(s.type,s.url,s.async);if(s.data)xml.setRequestHeader("Content-Type",s.contentType);if(s.ifModified)xml.setRequestHeader("If-Modified-Since",jQuery.lastModified[s.url]||"Thu, 01 Jan 1970 00:00:00 GMT");xml.setRequestHeader("X-Requested-With","XMLHttpRequest");if(s.beforeSend)s.beforeSend(xml);if(s.global)jQuery.event.trigger("ajaxSend",[xml,s]);var onreadystatechange=function(isTimeout){if(!requestDone&&xml&&(xml.readyState==4||isTimeout=="timeout")){requestDone=true;if(ival){clearInterval(ival);ival=null;}status=isTimeout=="timeout"&&"timeout"||!jQuery.httpSuccess(xml)&&"error"||s.ifModified&&jQuery.httpNotModified(xml,s.url)&&"notmodified"||"success";if(status=="success"){try{data=jQuery.httpData(xml,s.dataType);}catch(e){status="parsererror";}}if(status=="success"){var modRes;try{modRes=xml.getResponseHeader("Last-Modified");}catch(e){}if(s.ifModified&&modRes)jQuery.lastModified[s.url]=modRes;if(!jsonp)success();}else
+jQuery.handleError(s,xml,status);complete();if(s.async)xml=null;}};if(s.async){var ival=setInterval(onreadystatechange,13);if(s.timeout>0)setTimeout(function(){if(xml){xml.abort();if(!requestDone)onreadystatechange("timeout");}},s.timeout);}try{xml.send(s.data);}catch(e){jQuery.handleError(s,xml,null,e);}if(!s.async)onreadystatechange();return xml;function success(){if(s.success)s.success(data,status);if(s.global)jQuery.event.trigger("ajaxSuccess",[xml,s]);}function complete(){if(s.complete)s.complete(xml,status);if(s.global)jQuery.event.trigger("ajaxComplete",[xml,s]);if(s.global&&!--jQuery.active)jQuery.event.trigger("ajaxStop");}},handleError:function(s,xml,status,e){if(s.error)s.error(xml,status,e);if(s.global)jQuery.event.trigger("ajaxError",[xml,s,e]);},active:0,httpSuccess:function(r){try{return!r.status&&location.protocol=="file:"||(r.status>=200&&r.status<300)||r.status==304||jQuery.browser.safari&&r.status==undefined;}catch(e){}return false;},httpNotModified:function(xml,url){try{var xmlRes=xml.getResponseHeader("Last-Modified");return xml.status==304||xmlRes==jQuery.lastModified[url]||jQuery.browser.safari&&xml.status==undefined;}catch(e){}return false;},httpData:function(r,type){var ct=r.getResponseHeader("content-type");var xml=type=="xml"||!type&&ct&&ct.indexOf("xml")>=0;var data=xml?r.responseXML:r.responseText;if(xml&&data.documentElement.tagName=="parsererror")throw"parsererror";if(type=="script")jQuery.globalEval(data);if(type=="json")data=eval("("+data+")");return data;},param:function(a){var s=[];if(a.constructor==Array||a.jquery)jQuery.each(a,function(){s.push(encodeURIComponent(this.name)+"="+encodeURIComponent(this.value));});else
+for(var j in a)if(a[j]&&a[j].constructor==Array)jQuery.each(a[j],function(){s.push(encodeURIComponent(j)+"="+encodeURIComponent(this));});else
+s.push(encodeURIComponent(j)+"="+encodeURIComponent(a[j]));return s.join("&").replace(/%20/g,"+");}});jQuery.fn.extend({show:function(speed,callback){return speed?this.animate({height:"show",width:"show",opacity:"show"},speed,callback):this.filter(":hidden").each(function(){this.style.display=this.oldblock?this.oldblock:"";if(jQuery.css(this,"display")=="none")this.style.display="block";}).end();},hide:function(speed,callback){return speed?this.animate({height:"hide",width:"hide",opacity:"hide"},speed,callback):this.filter(":visible").each(function(){this.oldblock=this.oldblock||jQuery.css(this,"display");if(this.oldblock=="none")this.oldblock="block";this.style.display="none";}).end();},_toggle:jQuery.fn.toggle,toggle:function(fn,fn2){return jQuery.isFunction(fn)&&jQuery.isFunction(fn2)?this._toggle(fn,fn2):fn?this.animate({height:"toggle",width:"toggle",opacity:"toggle"},fn,fn2):this.each(function(){jQuery(this)[jQuery(this).is(":hidden")?"show":"hide"]();});},slideDown:function(speed,callback){return this.animate({height:"show"},speed,callback);},slideUp:function(speed,callback){return this.animate({height:"hide"},speed,callback);},slideToggle:function(speed,callback){return this.animate({height:"toggle"},speed,callback);},fadeIn:function(speed,callback){return this.animate({opacity:"show"},speed,callback);},fadeOut:function(speed,callback){return this.animate({opacity:"hide"},speed,callback);},fadeTo:function(speed,to,callback){return this.animate({opacity:to},speed,callback);},animate:function(prop,speed,easing,callback){var opt=jQuery.speed(speed,easing,callback);return this[opt.queue===false?"each":"queue"](function(){opt=jQuery.extend({},opt);var hidden=jQuery(this).is(":hidden"),self=this;for(var p in prop){if(prop[p]=="hide"&&hidden||prop[p]=="show"&&!hidden)return jQuery.isFunction(opt.complete)&&opt.complete.apply(this);if(p=="height"||p=="width"){opt.display=jQuery.css(this,"display");opt.overflow=this.style.overflow;}}if(opt.overflow!=null)this.style.overflow="hidden";opt.curAnim=jQuery.extend({},prop);jQuery.each(prop,function(name,val){var e=new jQuery.fx(self,opt,name);if(/toggle|show|hide/.test(val))e[val=="toggle"?hidden?"show":"hide":val](prop);else{var parts=val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),start=e.cur(true)||0;if(parts){var end=parseFloat(parts[2]),unit=parts[3]||"px";if(unit!="px"){self.style[name]=(end||1)+unit;start=((end||1)/e.cur(true))*start;self.style[name]=start+unit;}if(parts[1])end=((parts[1]=="-="?-1:1)*end)+start;e.custom(start,end,unit);}else
+e.custom(start,val,"");}});return true;});},queue:function(type,fn){if(jQuery.isFunction(type)){fn=type;type="fx";}if(!type||(typeof type=="string"&&!fn))return queue(this[0],type);return this.each(function(){if(fn.constructor==Array)queue(this,type,fn);else{queue(this,type).push(fn);if(queue(this,type).length==1)fn.apply(this);}});},stop:function(){var timers=jQuery.timers;return this.each(function(){for(var i=0;i<timers.length;i++)if(timers[i].elem==this)timers.splice(i--,1);}).dequeue();}});var queue=function(elem,type,array){if(!elem)return;var q=jQuery.data(elem,type+"queue");if(!q||array)q=jQuery.data(elem,type+"queue",array?jQuery.makeArray(array):[]);return q;};jQuery.fn.dequeue=function(type){type=type||"fx";return this.each(function(){var q=queue(this,type);q.shift();if(q.length)q[0].apply(this);});};jQuery.extend({speed:function(speed,easing,fn){var opt=speed&&speed.constructor==Object?speed:{complete:fn||!fn&&easing||jQuery.isFunction(speed)&&speed,duration:speed,easing:fn&&easing||easing&&easing.constructor!=Function&&easing};opt.duration=(opt.duration&&opt.duration.constructor==Number?opt.duration:{slow:600,fast:200}[opt.duration])||400;opt.old=opt.complete;opt.complete=function(){jQuery(this).dequeue();if(jQuery.isFunction(opt.old))opt.old.apply(this);};return opt;},easing:{linear:function(p,n,firstNum,diff){return firstNum+diff*p;},swing:function(p,n,firstNum,diff){return((-Math.cos(p*Math.PI)/2)+0.5)*diff+firstNum;}},timers:[],fx:function(elem,options,prop){this.options=options;this.elem=elem;this.prop=prop;if(!options.orig)options.orig={};}});jQuery.fx.prototype={update:function(){if(this.options.step)this.options.step.apply(this.elem,[this.now,this]);(jQuery.fx.step[this.prop]||jQuery.fx.step._default)(this);if(this.prop=="height"||this.prop=="width")this.elem.style.display="block";},cur:function(force){if(this.elem[this.prop]!=null&&this.elem.style[this.prop]==null)return this.elem[this.prop];var r=parseFloat(jQuery.curCSS(this.elem,this.prop,force));return r&&r>-10000?r:parseFloat(jQuery.css(this.elem,this.prop))||0;},custom:function(from,to,unit){this.startTime=(new Date()).getTime();this.start=from;this.end=to;this.unit=unit||this.unit||"px";this.now=this.start;this.pos=this.state=0;this.update();var self=this;function t(){return self.step();}t.elem=this.elem;jQuery.timers.push(t);if(jQuery.timers.length==1){var timer=setInterval(function(){var timers=jQuery.timers;for(var i=0;i<timers.length;i++)if(!timers[i]())timers.splice(i--,1);if(!timers.length)clearInterval(timer);},13);}},show:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.show=true;this.custom(0,this.cur());if(this.prop=="width"||this.prop=="height")this.elem.style[this.prop]="1px";jQuery(this.elem).show();},hide:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0);},step:function(){var t=(new Date()).getTime();if(t>this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var done=true;for(var i in this.options.curAnim)if(this.options.curAnim[i]!==true)done=false;if(done){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(jQuery.css(this.elem,"display")=="none")this.elem.style.display="block";}if(this.options.hide)this.elem.style.display="none";if(this.options.hide||this.options.show)for(var p in this.options.curAnim)jQuery.attr(this.elem.style,p,this.options.orig[p]);}if(done&&jQuery.isFunction(this.options.complete))this.options.complete.apply(this.elem);return false;}else{var n=t-this.startTime;this.state=n/this.options.duration;this.pos=jQuery.easing[this.options.easing||(jQuery.easing.swing?"swing":"linear")](this.state,n,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update();}return true;}};jQuery.fx.step={scrollLeft:function(fx){fx.elem.scrollLeft=fx.now;},scrollTop:function(fx){fx.elem.scrollTop=fx.now;},opacity:function(fx){jQuery.attr(fx.elem.style,"opacity",fx.now);},_default:function(fx){fx.elem.style[fx.prop]=fx.now+fx.unit;}};jQuery.fn.offset=function(){var left=0,top=0,elem=this[0],results;if(elem)with(jQuery.browser){var absolute=jQuery.css(elem,"position")=="absolute",parent=elem.parentNode,offsetParent=elem.offsetParent,doc=elem.ownerDocument,safari2=safari&&parseInt(version)<522;if(elem.getBoundingClientRect){box=elem.getBoundingClientRect();add(box.left+Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),box.top+Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));if(msie){var border=jQuery("html").css("borderWidth");border=(border=="medium"||jQuery.boxModel&&parseInt(version)>=7)&&2||border;add(-border,-border);}}else{add(elem.offsetLeft,elem.offsetTop);while(offsetParent){add(offsetParent.offsetLeft,offsetParent.offsetTop);if(mozilla&&/^t[d|h]$/i.test(parent.tagName)||!safari2)border(offsetParent);if(safari2&&!absolute&&jQuery.css(offsetParent,"position")=="absolute")absolute=true;offsetParent=offsetParent.offsetParent;}while(parent.tagName&&!/^body|html$/i.test(parent.tagName)){if(!/^inline|table-row.*$/i.test(jQuery.css(parent,"display")))add(-parent.scrollLeft,-parent.scrollTop);if(mozilla&&jQuery.css(parent,"overflow")!="visible")border(parent);parent=parent.parentNode;}if(safari2&&absolute)add(-doc.body.offsetLeft,-doc.body.offsetTop);}results={top:top,left:left};}return results;function border(elem){add(jQuery.css(elem,"borderLeftWidth"),jQuery.css(elem,"borderTopWidth"));}function add(l,t){left+=parseInt(l)||0;top+=parseInt(t)||0;}};})();
Index: /galaxy-central/eggs/WebError-0.8a-py2.6.egg/weberror/evalexception/error_template.html.tmpl
===================================================================
--- /galaxy-central/eggs/WebError-0.8a-py2.6.egg/weberror/evalexception/error_template.html.tmpl (revision 3)
+++ /galaxy-central/eggs/WebError-0.8a-py2.6.egg/weberror/evalexception/error_template.html.tmpl (revision 3)
@@ -0,0 +1,97 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>Server Error</title>
+
+<script type="text/javascript">
+  debug_base = {{repr(prefix)}};
+  debug_count = {{counter}};
+</script>
+
+<!-- CSS Imports -->
+<link rel="stylesheet" href="{{prefix}}/media/traceback.css" type="text/css" media="screen" />
+{{head_html|html}}
+
+</head>
+
+<body id="documentation" onload="switch_display('{{set_tab}}')">
+<!-- We are only using a table to ensure old browsers see the message correctly -->
+
+<noscript>
+<div style="border-bottom: 1px solid #808080">
+<div style="border-bottom: 1px solid #404040">
+<table width="100%" border="0" cellpadding="0" bgcolor="#FFFFE1"><tr><td>&nbsp;</td><td><span style="padding: 0px; margin: 0px; font-family: Tahoma, sans-serif; font-size: 11px">Warning, your browser does not support JavaScript so you will not be able to use the interactive debugging on this page.</span></td></tr></table>
+</div>
+</div>
+</noscript>
+
+    <!-- Top anchor -->
+    <a name="top"></a>
+
+    <!-- Main Content -->
+    <div id="nav-bar">
+
+        <!-- Section Navigation -->
+        <h4 class="invisible">Section Links</h4>
+
+            <ul id="navlist">
+               <!--  {{#links|html}} -->
+               <li id="source_data_tab"><a href="javascript:switch_display('source_data')" accesskey="4" id="source_data_link">Source</a></li>
+               <li id="template_data_tab"><a href="javascript:switch_display('template_data')" accesskey="3" id="template_data_link">Template</a></li>
+               <li id="extra_data_tab"><a href="javascript:switch_display('extra_data')" id="extra_data_link" accesskey="2" >Extra Data</a></li>
+               <li id="traceback_data_tab" class="active"><a href="javascript:switch_display('traceback_data')" id="traceback_data_link" class="active" accesskey="1">Traceback</a></li>
+            </ul>
+    </div>
+    <div id="main-content">
+        <div class="hr"><hr class="hr" /></div>
+        <div class="content-padding">
+            <div id="source_data" class="hidden-data">
+Hi, I'm source!
+            </div>
+            <div id="extra_data" class="hidden-data">
+              {{for extra_data_item in extra_data:}}
+                <h1 class="first"><a name="content"></a>Extra Data</h1>
+                {{extra_data_item|html}}
+              {{endfor}}
+            </div>
+            <div id="template_data" class="hidden-data">
+                {{template_data|html}}
+            </div>
+            <div id="traceback_data">
+<div style="float: left; width: 100%; padding-bottom: 20px;">
+<h1 class="first"><a name="content"></a>Error Traceback:</h1>
+<div id="formats">
+   <span class="title">View as: &nbsp;</span> <a id="view_short_html" class="active" href="#">Interactive</a> 
+   <a id="view_long_html" href="#">(full)</a> &nbsp;|&nbsp; <a id="view_short_text" href="#">Text</a>  
+   <a id="view_long_text" href="#">(full)</a> &nbsp;|&nbsp; <a id="view_short_xml" href="#">XML</a> 
+   <a id="view_long_xml" href="#">(full)</a>
+</div>
+<div><span class="main-exception" style="color: #f00;">&#8669;</span>
+  <code class="main-exception">{{exc_name}}: {{exc_data.exception_value}}</code></div>
+<div style="clear: both;">
+<div id="error-area" style="display: none; background-color: #600; color: #fff; border: 2px solid black">
+<button onclick="return clearError()">clear this</button>
+<div id="error-container"></div>
+<button onclick="return clearError()">clear this</button>
+</div>
+{{traceback_body|html}}
+<br /><br /><br />
+<div class="feature-highlight">
+<b>Extra Features</b>
+<table border="0">
+<tr><td><a href="#" onclick="return false" class="switch_source" style="cursor: default">&gt;&gt;</a></td><td>Display the lines of code near each part of the traceback</td></tr>
+<tr><td><img src="{{prefix}}/media/plus.jpg" /></td><td>Show a debug prompt to allow you to directly debug the code at the traceback</td></tr>
+</table>
+</div>{{repost_button|html}}
+
+            </div>
+        </div>
+        <br class="clear" />
+        <div class="hr"><hr class="clear" /></div>
+    </div>
+    <!-- Footer -->
+    <div id="footer">{{footer_html|html}}</div>
+    <script type="text/javascript" src="{{prefix}}/media/jquery-1.2.1.min.js"></script>
+    <script type="text/javascript" src="{{prefix}}/media/debug.js"></script>
+</body>
+</html>
Index: /galaxy-central/eggs/WebError-0.8a-py2.6.egg/weberror/evalexception/evalcontext.py
===================================================================
--- /galaxy-central/eggs/WebError-0.8a-py2.6.egg/weberror/evalexception/evalcontext.py (revision 3)
+++ /galaxy-central/eggs/WebError-0.8a-py2.6.egg/weberror/evalexception/evalcontext.py (revision 3)
@@ -0,0 +1,66 @@
+from cStringIO import StringIO
+import traceback
+import threading
+import pdb
+import sys
+
+exec_lock = threading.Lock()
+
+class EvalContext(object):
+
+    """
+    Class that represents a interactive interface.  It has its own
+    namespace.  Use eval_context.exec_expr(expr) to run commands; the
+    output of those commands is returned, as are print statements.
+
+    This is essentially what doctest does, and is taken directly from
+    doctest.
+    """
+
+    def __init__(self, namespace, globs):
+        self.namespace = namespace
+        self.globs = globs
+
+    def exec_expr(self, s):
+        out = StringIO()
+        exec_lock.acquire()
+        save_stdout = sys.stdout
+        try:
+            debugger = _OutputRedirectingPdb(save_stdout)
+            debugger.reset()
+            pdb.set_trace = debugger.set_trace
+            sys.stdout = out
+            try:
+                code = compile(s, '<web>', "single", 0, 1)
+                exec code in self.namespace, self.globs
+                debugger.set_continue()
+            except KeyboardInterrupt:
+                raise
+            except:
+                traceback.print_exc(file=out)
+                debugger.set_continue()
+        finally:
+            sys.stdout = save_stdout
+            exec_lock.release()
+        return out.getvalue()
+
+# From doctest
+class _OutputRedirectingPdb(pdb.Pdb):
+    """
+    A specialized version of the python debugger that redirects stdout
+    to a given stream when interacting with the user.  Stdout is *not*
+    redirected when traced code is executed.
+    """
+    def __init__(self, out):
+        self.__out = out
+        pdb.Pdb.__init__(self)
+
+    def trace_dispatch(self, *args):
+        # Redirect stdout to the given stream.
+        save_stdout = sys.stdout
+        sys.stdout = self.__out
+        # Call Pdb's trace dispatch method.
+        try:
+            return pdb.Pdb.trace_dispatch(self, *args)
+        finally:
+            sys.stdout = save_stdout
Index: /galaxy-central/eggs/WebError-0.8a-py2.6.egg/weberror/evalexception/middleware.py
===================================================================
--- /galaxy-central/eggs/WebError-0.8a-py2.6.egg/weberror/evalexception/middleware.py (revision 3)
+++ /galaxy-central/eggs/WebError-0.8a-py2.6.egg/weberror/evalexception/middleware.py (revision 3)
@@ -0,0 +1,695 @@
+"""Exception-catching middleware that allows interactive debugging.
+
+This middleware catches all unexpected exceptions.  A normal
+traceback, like produced by
+``weberror.exceptions.errormiddleware.ErrorMiddleware`` is given, plus
+controls to see local variables and evaluate expressions in a local
+context.
+
+This can only be used in single-process environments, because
+subsequent requests must go back to the same process that the
+exception originally occurred in.  Threaded or non-concurrent
+environments both work.
+
+This shouldn't be used in production in any way.  That would just be
+silly.
+
+If calling from an XMLHttpRequest call, if the GET variable ``_`` is
+given then it will make the response more compact (and less
+Javascripty), since if you use innerHTML it'll kill your browser.  You
+can look for the header X-Debug-URL in your 500 responses if you want
+to see the full debuggable traceback.  Also, this URL is printed to
+``wsgi.errors``, so you can open it up in another browser window.
+
+"""
+import sys
+import os
+import cgi
+import traceback
+from cStringIO import StringIO
+import pprint
+import itertools
+import time
+import re
+
+from pkg_resources import resource_filename
+
+from paste import urlparser
+from paste import registry
+from paste import request
+
+import evalcontext
+from weberror.exceptions import errormiddleware, formatter, collector
+from tempita import HTMLTemplate
+from webob import Request, Response
+from webob import exc
+from weberror.util import PySourceColor
+
+limit = 200
+
+def html_quote(v):
+    """
+    Escape HTML characters, plus translate None to ''
+    """
+    if v is None:
+        return ''
+    return cgi.escape(str(v), 1)
+
+
+def preserve_whitespace(v, quote=True):
+    """
+    Quote a value for HTML, preserving whitespace (translating
+    newlines to ``<br>`` and multiple spaces to use ``&nbsp;``).
+
+    If ``quote`` is true, then the value will be HTML quoted first.
+    """
+    if quote:
+        v = html_quote(v)
+    v = v.replace('\n', '<br>\n')
+    v = re.sub(r'()(  +)', _repl_nbsp, v)
+    v = re.sub(r'(\n)( +)', _repl_nbsp, v)
+    v = re.sub(r'^()( +)', _repl_nbsp, v)
+    return '<code>%s</code>' % v
+
+
+def _repl_nbsp(match):
+    if len(match.group(2)) == 1:
+        return '&nbsp;'
+    return match.group(1) + '&nbsp;' * (len(match.group(2))-1) + ' '
+
+
+def simplecatcher(application):
+    """
+    A simple middleware that catches errors and turns them into simple
+    tracebacks.
+    """
+    def simplecatcher_app(environ, start_response):
+        try:
+            return application(environ, start_response)
+        except:
+            out = StringIO()
+            traceback.print_exc(file=out)
+            start_response('500 Server Error',
+                           [('content-type', 'text/html')],
+                           sys.exc_info())
+            res = out.getvalue()
+            return ['<h3>Error</h3><pre>%s</pre>'
+                    % html_quote(res)]
+    return simplecatcher_app
+
+
+def wsgiapp():
+    """
+    Turns a function or method into a WSGI application.
+    """
+    def decorator(func):
+        def wsgiapp_wrapper(*args):
+            # we get 3 args when this is a method, two when it is
+            # a function :(
+            if len(args) == 3:
+                environ = args[1]
+                start_response = args[2]
+                args = [args[0]]
+            else:
+                environ, start_response = args
+                args = []
+            def application(environ, start_response):
+                form = request.parse_formvars(environ,
+                                              include_get_vars=True)
+                status = '200 OK'
+                form['environ'] = environ
+                try:
+                    res = func(*args, **form.mixed())
+                except ValueError, ve:
+                    status = '500 Server Error'
+                    res = '<html>There was an error: %s</html>' % \
+                        html_quote(ve)
+                start_response(status, [('content-type', 'text/html')])
+                return [res]
+            app = simplecatcher(application)
+            return app(environ, start_response)
+        wsgiapp_wrapper.exposed = True
+        return wsgiapp_wrapper
+    return decorator
+
+
+def get_debug_info(func):
+    """
+    A decorator (meant to be used under ``wsgiapp()``) that resolves
+    the ``debugcount`` variable to a ``DebugInfo`` object (or gives an
+    error if it can't be found).
+    """
+    def debug_info_replacement(self, req):
+        if 'debugcount' not in req.params:
+            return exc.HTTPBadRequest(
+                "You must provide a debugcount parameter")
+        debugcount = req.params['debugcount']
+        try:
+            debugcount = int(debugcount)
+        except ValueError, e:
+            return exc.HTTPBadRequest(
+                "Invalid value for debugcount (%r): %s"
+                % (debugcount, e))
+        if debugcount not in self.debug_infos:
+            return exc.HTTPServerError(
+                "Debug %s not found (maybe it has expired, or the server was restarted)"
+                % debugcount)
+        req.debug_info = self.debug_infos[debugcount]
+        return func(self, req)
+    debug_info_replacement.exposed = True
+    return debug_info_replacement
+
+debug_counter = itertools.count(int(time.time()))
+
+def get_debug_count(req):
+    """
+    Return the unique debug count for the current request
+    """
+    if hasattr(req, 'environ'):
+        environ = req.environ
+    else:
+        environ = req
+    # XXX: Legacy support for Paste restorer
+    if 'paste.evalexception.debug_count' in environ:
+        return environ['paste.evalexception.debug_count']
+    elif 'weberror.evalexception.debug_count' in environ:
+        return environ['weberror.evalexception.debug_count']
+    else:
+        next = debug_counter.next()
+        environ['weberror.evalexception.debug_count'] = next
+        environ['paste.evalexception.debug_count'] = next
+        return next
+
+
+class InvalidTemplate(Exception):
+    pass
+
+
+class EvalException(object):
+    """Handles capturing an exception and turning it into an interactive
+    exception explorer"""
+    def __init__(self, application, global_conf=None,
+                 error_template_filename=None,
+                 xmlhttp_key=None, media_paths=None, 
+                 templating_formatters=None, head_html='', footer_html='', 
+                 **params):
+        self.application = application
+        self.debug_infos = {}
+        self.templating_formatters = templating_formatters or []
+        self.head_html = HTMLTemplate(head_html)
+        self.footer_html = HTMLTemplate(footer_html)
+        if error_template_filename is None:
+            error_template_filename = resource_filename( "weberror.evalexception", 
+                                                         "error_template.html.tmpl" )
+        if xmlhttp_key is None:
+            if global_conf is None:
+                xmlhttp_key = '_'
+            else:
+                xmlhttp_key = global_conf.get('xmlhttp_key', '_')
+        self.xmlhttp_key = xmlhttp_key
+        self.media_paths = media_paths or {}
+        self.error_template = HTMLTemplate.from_filename(error_template_filename)
+    
+    def __call__(self, environ, start_response):
+        ## FIXME: print better error message (maybe fall back on
+        ## normal middleware, plus an error message)
+        assert not environ['wsgi.multiprocess'], (
+            "The EvalException middleware is not usable in a "
+            "multi-process environment")
+        # XXX: Legacy support for Paste restorer
+        environ['weberror.evalexception'] = environ['paste.evalexception'] = \
+            self
+        req = Request(environ)
+        if req.path_info_peek() == '_debug':
+            return self.debug(req)(environ, start_response)
+        else:
+            return self.respond(environ, start_response)
+
+    def debug(self, req):
+        assert req.path_info_pop() == '_debug'
+        next_part = req.path_info_pop()
+        method = getattr(self, next_part, None)
+        if method is None:
+            return exc.HTTPNotFound('Nothing could be found to match %r' % next_part)
+        if not getattr(method, 'exposed', False):
+            return exc.HTTPForbidden('Access to %r is forbidden' % next_part)
+        return method(req)
+
+    def media(self, req):
+        """Static path where images and other files live"""
+        first_part = req.path_info_peek()
+        if first_part in self.media_paths:
+            req.path_info_pop()
+            path = self.media_paths[first_part]
+        else:
+            path = resource_filename("weberror.evalexception", "media")
+        app = urlparser.StaticURLParser(path)
+        return app
+    media.exposed = True
+
+    def summary(self, req):
+        """
+        Returns a JSON-format summary of all the cached
+        exception reports
+        """
+        res = Response(content_type='text/x-json')
+        data = [];
+        items = self.debug_infos.values()
+        items.sort(lambda a, b: cmp(a.created, b.created))
+        data = [item.json() for item in items]
+        res.body = repr(data)
+        return res
+    summary.exposed = True
+
+    def view(self, req):
+        """
+        View old exception reports
+        """
+        id = int(req.path_info_pop())
+        if id not in self.debug_infos:
+            return exc.HTTPServerError(
+                "Traceback by id %s does not exist (maybe "
+                "the server has been restarted?)" % id)
+        debug_info = self.debug_infos[id]
+        return debug_info.wsgi_application
+    view.exposed = True
+
+    def make_view_url(self, environ, base_path, count):
+        return base_path + '/view/%s' % count
+
+    #@get_debug_info
+    def show_frame(self, req):
+        tbid = int(req.params['tbid'])
+        frame = req.debug_info.frame(tbid)
+        vars = frame.tb_frame.f_locals
+        if vars:
+            registry.restorer.restoration_begin(req.debug_info.counter)
+            try:
+                local_vars = make_table(vars)
+            finally:
+                registry.restorer.restoration_end()
+        else:
+            local_vars = 'No local vars'
+        res = Response(content_type='text/html')
+        res.body = input_form.substitute(tbid=tbid, debug_info=req.debug_info) + local_vars
+        return res
+
+    show_frame = get_debug_info(show_frame)
+
+    #@get_debug_info
+    def exec_input(self, req):
+        input = req.params.get('input')
+        if not input.strip():
+            return ''
+        input = input.rstrip() + '\n'
+        frame = req.debug_info.frame(int(req.params['tbid']))
+        vars = frame.tb_frame.f_locals
+        glob_vars = frame.tb_frame.f_globals
+        context = evalcontext.EvalContext(vars, glob_vars)
+        registry.restorer.restoration_begin(req.debug_info.counter)
+        try:
+            output = context.exec_expr(input)
+        finally:
+            registry.restorer.restoration_end()
+        input_html = formatter.str2html(input)
+        res = Response(content_type='text/html')
+        res.body = (
+            '<code style="color: #060">&gt;&gt;&gt;</code> '
+            '<code>%s</code><br>\n%s'
+            % (preserve_whitespace(input_html, quote=False),
+               preserve_whitespace(output)))
+        return res
+
+    exec_input = get_debug_info(exec_input)
+
+    def source_code(self, req):
+        location = req.params['location']
+        module_name, lineno = location.split(':', 1)
+        module = sys.modules[module_name]
+        filename = module.__file__
+        if filename.endswith('.pyc'):
+            filename = filename[:-1]
+        f = open(filename, 'rb')
+        source = f.read()
+        f.close()
+        html = (
+            ('<div>Module: <b>%s</b> file: %s</div>'
+             % (module_name, filename))
+            + PySourceColor.str2html(source, form='snip', linenumbers=-1))
+        source_lines = len(source.splitlines())
+        if source_lines < 60:
+            html += '\n<br>'*(60-source_lines)
+        res = Response(content_type='text/html', charset='utf8')
+        res.body = html
+        return res
+
+    source_code.exposed = True
+
+    def respond(self, environ, start_response):
+        req = Request(environ)
+        if req.environ.get('paste.throw_errors'):
+            return self.application(environ, start_response)
+        base_path = req.application_url + '/_debug'
+        req.environ['paste.throw_errors'] = True
+        started = []
+        def detect_start_response(status, headers, exc_info=None):
+            try:
+                return start_response(status, headers, exc_info)
+            except:
+                raise
+            else:
+                started.append(True)
+        try:
+            __traceback_supplement__ = errormiddleware.Supplement, self, environ
+            app_iter = self.application(environ, detect_start_response)
+            try:
+                return_iter = list(app_iter)
+                return return_iter
+            finally:
+                if hasattr(app_iter, 'close'):
+                    app_iter.close()
+        except:
+            exc_info = sys.exc_info()
+
+            # Tell the Registry to save its StackedObjectProxies current state
+            # for later restoration
+            ## FIXME: needs to be more abstract (something in the environ)
+            ## to remove the Paste dependency
+            registry.restorer.save_registry_state(environ)
+
+            count = get_debug_count(environ)
+            view_uri = self.make_view_url(environ, base_path, count)
+            if not started:
+                headers = [('content-type', 'text/html')]
+                headers.append(('X-Debug-URL', view_uri))
+                start_response('500 Internal Server Error',
+                               headers,
+                               exc_info)
+            environ['wsgi.errors'].write('Debug at: %s\n' % view_uri)
+
+            exc_data = collector.collect_exception(*exc_info)
+            debug_info = DebugInfo(count, exc_info, exc_data, base_path,
+                                   environ, view_uri, self.error_template,
+                                   self.templating_formatters, self.head_html,
+                                   self.footer_html)
+            assert count not in self.debug_infos
+            self.debug_infos[count] = debug_info
+
+            if self.xmlhttp_key:
+                if self.xmlhttp_key in req.params:
+                    exc_data = collector.collect_exception(*exc_info)
+                    html, extra_html = formatter.format_html(
+                        exc_data, include_hidden_frames=False,
+                        include_reusable=False, show_extra_data=False)
+                    return [html, extra_html]
+
+            # @@: it would be nice to deal with bad content types here
+            return debug_info.content()
+
+
+class DebugInfo(object):
+
+    def __init__(self, counter, exc_info, exc_data, base_path,
+                 environ, view_uri, error_template, templating_formatters, 
+                 head_html, footer_html):
+        self.counter = counter
+        self.exc_data = exc_data
+        self.base_path = base_path
+        self.environ = environ
+        self.view_uri = view_uri
+        self.error_template = error_template
+        self.created = time.time()
+        self.templating_formatters = templating_formatters
+        self.head_html = head_html
+        self.footer_html = footer_html
+        self.exc_type, self.exc_value, self.tb = exc_info
+        __exception_formatter__ = 1
+        self.frames = []
+        n = 0
+        tb = self.tb
+        while tb is not None and (limit is None or n < limit):
+            if tb.tb_frame.f_locals.get('__exception_formatter__'):
+                # Stop recursion. @@: should make a fake ExceptionFrame
+                break
+            self.frames.append(tb)
+            tb = tb.tb_next
+            n += 1
+    
+    def json(self):
+        """Return the JSON-able representation of this object"""
+        return {
+            'uri': self.view_uri,
+            'created': time.strftime('%c', time.gmtime(self.created)),
+            'created_timestamp': self.created,
+            'exception_type': str(self.exc_type),
+            'exception': str(self.exc_value),
+            }
+
+    def frame(self, tbid):
+        for frame in self.frames:
+            if id(frame) == tbid:
+                return frame
+        else:
+            raise ValueError, (
+                "No frame by id %s found from %r" % (tbid, self.frames))
+
+    def wsgi_application(self, environ, start_response):
+        start_response('200 OK', [('content-type', 'text/html')])
+        return self.content()
+
+    def content(self):
+        traceback_body, extra_data = format_eval_html(self.exc_data, self.base_path, self.counter)
+        repost_button = make_repost_button(self.environ)
+        template_data = '<p>No Template information available.</p>'
+        tab = 'traceback_data'
+        
+        for tmpl_formatter in self.templating_formatters:
+            result = tmpl_formatter(self.exc_value)
+            if result:
+                tab = 'template_data'
+                template_data = result
+                break
+
+        template_data = template_data.replace('<h2>', '<h1 class="first">')
+        template_data = template_data.replace('</h2>', '</h1>')
+        if hasattr(self.exc_data.exception_type, '__name__'):
+            exc_name = self.exc_data.exception_type.__name__
+        else:
+            exc_name = str(self.exc_data.exception_type)
+        page = self.error_template.substitute(
+            head_html=self.head_html.substitute(prefix=self.base_path),
+            footer_html=self.footer_html.substitute(prefix=self.base_path),
+            repost_button=repost_button or '',
+            traceback_body=traceback_body,
+            exc_data=self.exc_data,
+            exc_name=exc_name,
+            extra_data=extra_data,
+            template_data=template_data,
+            set_tab=tab,
+            prefix=self.base_path,
+            counter=self.counter,
+            )
+        return [page]
+
+class EvalHTMLFormatter(formatter.HTMLFormatter):
+
+    def __init__(self, base_path, counter, **kw):
+        super(EvalHTMLFormatter, self).__init__(**kw)
+        self.base_path = base_path
+        self.counter = counter
+    
+    def format_source_line(self, filename, frame):
+        line = formatter.HTMLFormatter.format_source_line(
+            self, filename, frame)
+        location = '%s:%s' % (frame.modname, frame.lineno)
+        return (line +
+                '  <a href="#" class="switch_source" '
+                'tbid="%s" onClick="return showFrame(this)">&nbsp; &nbsp; '
+                '<img src="%s/media/plus.jpg" border=0 width=9 '
+                'height=9> &nbsp; &nbsp;</a> '
+                '<a href="#" class="" location="%s" '
+                'onClick="return showSource(this)">view</a>'
+                % (frame.tbid, self.base_path, location))
+
+
+def make_table(items):
+    if isinstance(items, dict):
+        items = items.items()
+        items.sort()
+    return table_template.substitute(
+        html_quote=html_quote,
+        items=items,
+        preserve_whitespace=preserve_whitespace,
+        make_wrappable=formatter.make_wrappable,
+        pprint_format=pprint_format)
+
+table_template = HTMLTemplate('''
+{{py:i = 0}}
+<table>
+{{for name, value in items:}}
+  {{py:i += 1}}
+{{py:
+value_html = html_quote(pprint_format(value, safe=True))
+value_html = make_wrappable(value_html)
+if len(value_html) > 100:
+    ## FIXME: This can break HTML; truncate before quoting?
+    value_html, expand_html = value_html[:100], value_html[100:]
+else:
+    expand_html = ''
+}}
+  <tr class="{{if i%2}}even{{else}}odd{{endif}}"
+      style="vertical-align: top">
+    <td><b>{{name}}</b></td>
+    <td style="overflow: auto">{{preserve_whitespace(value_html, quote=False)|html}}{{if expand_html}}
+      <a class="switch_source" style="background-color: #999" href="#" onclick="return expandLong(this)">...</a>
+      <span style="display: none">{{expand_html|html}}</span>
+    {{endif}}
+    </td>
+  </tr>
+{{endfor}}
+</table>
+''', name='table_template')
+
+def pprint_format(value, safe=False):
+    out = StringIO()
+    try:
+        pprint.pprint(value, out)
+    except Exception, e:
+        if safe:
+            out.write('Error: %s' % e)
+        else:
+            raise
+    return out.getvalue()
+
+def format_eval_html(exc_data, base_path, counter):
+    short_formatter = EvalHTMLFormatter(
+        base_path=base_path,
+        counter=counter,
+        include_reusable=False)
+    short_er, extra_data = short_formatter.format_collected_data(exc_data)
+    short_text_er, text_extra_data = formatter.format_text(exc_data, show_extra_data=False)
+    long_formatter = EvalHTMLFormatter(
+        base_path=base_path,
+        counter=counter,
+        show_hidden_frames=True,
+        show_extra_data=False,
+        include_reusable=False)
+    long_er, extra_data_none = long_formatter.format_collected_data(exc_data)
+    long_text_er = formatter.format_text(exc_data, show_hidden_frames=True,
+                                         show_extra_data=False)[0]
+    long_xml_er = formatter.format_xml(exc_data, show_hidden_frames=True, 
+                                  show_extra_data=False)[0]
+    short_xml_er = formatter.format_xml(exc_data, show_hidden_frames=False, 
+                                  show_extra_data=False)[0]
+    
+    if short_formatter.filter_frames(exc_data.frames) != \
+        long_formatter.filter_frames(exc_data.frames):
+        # Only display the full traceback when it differs from the
+        # short version
+        long_text_er = cgi.escape(long_text_er)
+        full_traceback_html = """
+        <div id="full_traceback" class="hidden-data">
+        %s
+        </div>
+        <div id="long_text_version" class="hidden-data">
+        <textarea style="width: 100%%" rows=%s cols=60>%s</textarea>
+        </div>
+        """ % (long_er, len(long_text_er.splitlines()), long_text_er)
+    else:
+        full_traceback_html = ''
+
+    short_text_er = cgi.escape(short_text_er)
+    
+    long_xml_leng = len(long_xml_er.splitlines())
+    if long_xml_leng > 50:
+        long_xml_leng = 50
+
+    short_xml_leng = len(short_xml_er.splitlines())
+    if short_xml_leng > 50:
+        short_xml_leng = 50
+
+    return """
+    <div id="short_traceback">
+    %s
+    </div>
+    <div id="short_text_version" class="hidden-data">
+    <textarea style="width: 100%%" rows=%s cols=60>%s</textarea>
+    </div>
+    <div id="long_xml_version" class="hidden-data">
+    <textarea style="width: 100%%" rows=%s cols=60>%s</textarea>
+    </div>
+    <div id="short_xml_version" class="hidden-data">
+    <textarea style="width: 100%%" rows=%s cols=60>%s</textarea>
+    </div>
+    %s
+    """ % (short_er, len(short_text_er.splitlines()), short_text_er,
+           long_xml_leng, cgi.escape(long_xml_er), 
+           short_xml_leng, cgi.escape(short_xml_er), 
+           full_traceback_html), extra_data
+
+def make_repost_button(environ):
+    url = request.construct_url(environ)
+    if environ['REQUEST_METHOD'] == 'GET':
+        return ('<button onclick="window.location.href=%r">'
+                'Re-GET Page</button><br>' % url)
+    else:
+        # @@: I'd like to reconstruct this, but I can't because
+        # the POST body is probably lost at this point, and
+        # I can't get it back :(
+        return None
+    # @@: Use or lose the following code block
+    """
+    fields = []
+    for name, value in request.parse_formvars(
+        environ, include_get_vars=False).items():
+        if hasattr(value, 'filename'):
+            # @@: Arg, we'll just submit the body, and leave out
+            # the filename :(
+            value = value.value
+        fields.append(
+            '<input type="hidden" name="%s" value="%s">'
+            % (html_quote(name), html_quote(value)))
+    return '''
+<form action="%s" method="POST">
+%s
+<input type="submit" value="Re-POST Page">
+</form>''' % (url, '\n'.join(fields))
+"""
+
+
+input_form = HTMLTemplate('''
+<form action="#" method="POST"
+ onsubmit="return submitInput($(\'#submit_{{tbid}}\').get(0), {{tbid}})">
+<div id="exec-output-{{tbid}}" style="width: 95%;
+ padding: 5px; margin: 5px; border: 2px solid #000;
+ display: none"></div>
+<input type="text" name="input" id="debug_input_{{tbid}}"
+ style="width: 100%"
+ autocomplete="off" onkeypress="upArrow(this, event)"><br>
+<input type="submit" value="Execute" name="submitbutton"
+ onclick="return submitInput(this, {{tbid}})"
+ id="submit_{{tbid}}"
+ input-from="debug_input_{{tbid}}"
+ output-to="exec-output-{{tbid}}">
+<input type="submit" value="Expand"
+ onclick="return expandInput(this)">
+</form>
+ ''', name='input_form')
+
+
+def make_eval_exception(app, global_conf, xmlhttp_key=None):
+    """
+    Wraps the application in an interactive debugger.
+
+    This debugger is a major security hole, and should only be
+    used during development.
+
+    xmlhttp_key is a string that, if present in QUERY_STRING,
+    indicates that the request is an XMLHttp request, and the
+    Javascript/interactive debugger should not be returned.  (If you
+    try to put the debugger somewhere with innerHTML, you will often
+    crash the browser)
+    """
+    if xmlhttp_key is None:
+        xmlhttp_key = global_conf.get('xmlhttp_key', '_')
+    return EvalException(app, xmlhttp_key=xmlhttp_key)
Index: /galaxy-central/eggs/WebError-0.8a-py2.6.egg/weberror/evalexception/__init__.py
===================================================================
--- /galaxy-central/eggs/WebError-0.8a-py2.6.egg/weberror/evalexception/__init__.py (revision 3)
+++ /galaxy-central/eggs/WebError-0.8a-py2.6.egg/weberror/evalexception/__init__.py (revision 3)
@@ -0,0 +1,2 @@
+"""An exception handler for interactive debugging"""
+from weberror.evalexception.middleware import EvalException
Index: /galaxy-central/eggs/WebError-0.8a-py2.6.egg/weberror/util/PySourceColor.py
===================================================================
--- /galaxy-central/eggs/WebError-0.8a-py2.6.egg/weberror/util/PySourceColor.py (revision 3)
+++ /galaxy-central/eggs/WebError-0.8a-py2.6.egg/weberror/util/PySourceColor.py (revision 3)
@@ -0,0 +1,2103 @@
+# -*- coding: Latin-1 -*-
+"""
+PySourceColor: color Python source code
+"""
+
+"""
+ PySourceColor.py
+
+----------------------------------------------------------------------------
+
+ A python source to colorized html/css/xhtml converter.
+ Hacked by M.E.Farmer Jr. 2004, 2005
+ Python license
+
+----------------------------------------------------------------------------
+
+ - HTML markup does not create w3c valid html, but it works on every
+   browser i've tried so far.(I.E.,Mozilla/Firefox,Opera,Konqueror,wxHTML).
+ - CSS markup is w3c validated html 4.01 strict,
+   but will not render correctly on all browsers.
+ - XHTML markup is w3c validated xhtml 1.0 strict,
+   like html 4.01, will not render correctly on all browsers.
+
+----------------------------------------------------------------------------
+
+Features:
+
+ -Three types of markup:
+    html (default) 
+    css/html 4.01 strict
+    xhtml 1.0 strict
+
+ -Can tokenize and colorize:
+    12 types of strings
+    2 comment types
+    numbers
+    operators
+    brackets
+    math operators
+    class / name
+    def / name
+    decorator / name
+    keywords
+    arguments class/def/decorator
+    linenumbers
+    names
+    text
+
+ -Eight colorschemes built-in:
+    null
+    mono
+    lite (default)
+    dark 
+    dark2
+    idle
+    viewcvs
+    pythonwin
+
+ -Header and footer
+    set to '' for builtin header / footer.
+    give path to a file containing the html
+        you want added as header or footer.
+
+ -Arbitrary text and html
+    html markup converts all to raw (TEXT token)
+    #@# for raw -> send raw text.
+    #$# for span -> inline html and text.
+    #%# for div -> block level html and text.
+
+ -Linenumbers
+    Supports all styles. New token is called LINENUMBER.
+    Defaults to NAME if not defined.
+
+ Style options
+ 
+ -ALL markups support these text styles:
+         b = bold
+         i = italic
+         u = underline
+ -CSS and XHTML has limited support  for borders:
+     HTML markup functions will ignore these.
+     Optional: Border color in RGB hex
+     Defaults to the text forecolor.
+         #rrggbb = border color
+     Border size:
+         l = thick
+         m = medium
+         t = thin
+     Border type:
+         - = dashed
+         . = dotted
+         s = solid
+         d = double
+         g = groove
+         r = ridge
+         n = inset
+         o = outset
+     You can specify multiple sides,
+     they will all use the same style.
+     Optional: Default is full border.
+         v = bottom
+         < = left
+         > = right
+         ^ = top
+     NOTE: Specify the styles you want.
+           The markups will ignore unsupported styles
+           Also note not all browsers can show these options
+
+ -All tokens default to NAME if not defined
+     so the only absolutely critical ones to define are:
+     NAME, ERRORTOKEN, PAGEBACKGROUND
+
+----------------------------------------------------------------------------
+
+Example usage::
+
+ # import
+ import PySourceColor as psc
+ psc.convert('c:/Python22/PySourceColor.py', colors=psc.idle, show=1)
+
+ # from module import *
+ from PySourceColor import *
+ convert('c:/Python22/Lib', colors=lite, markup="css",
+          header='#$#<b>This is a simpe heading</b><hr/>')
+
+ # How to use a custom colorscheme, and most of the 'features'
+ from PySourceColor import *
+ new = {
+   ERRORTOKEN:             ('bui','#FF8080',''),
+   DECORATOR_NAME:         ('s','#AACBBC',''),
+   DECORATOR:              ('n','#333333',''),
+   NAME:                   ('t.<v','#1133AA','#DDFF22'),
+   NUMBER:                 ('','#236676','#FF5555'),
+   OPERATOR:               ('b','#454567','#BBBB11'),
+   MATH_OPERATOR:          ('','#935623','#423afb'),
+   BRACKETS:               ('b','#ac34bf','#6457a5'),
+   COMMENT:                ('t-#0022FF','#545366','#AABBFF'),
+   DOUBLECOMMENT:          ('<l#553455','#553455','#FF00FF'),
+   CLASS_NAME:             ('m^v-','#000000','#FFFFFF'),
+   DEF_NAME:               ('l=<v','#897845','#000022'),
+   KEYWORD:                ('.b','#345345','#FFFF22'),
+   SINGLEQUOTE:            ('mn','#223344','#AADDCC'),
+   SINGLEQUOTE_R:          ('','#344522',''),
+   SINGLEQUOTE_U:          ('','#234234',''),
+   DOUBLEQUOTE:            ('m#0022FF','#334421',''),
+   DOUBLEQUOTE_R:          ('','#345345',''),
+   DOUBLEQUOTE_U:          ('','#678673',''),
+   TRIPLESINGLEQUOTE:      ('tv','#FFFFFF','#000000'),
+   TRIPLESINGLEQUOTE_R:    ('tbu','#443256','#DDFFDA'),
+   TRIPLESINGLEQUOTE_U:    ('','#423454','#DDFFDA'),
+   TRIPLEDOUBLEQUOTE:      ('li#236fd3b<>','#000000','#FFFFFF'),
+   TRIPLEDOUBLEQUOTE_R:    ('tub','#000000','#FFFFFF'),
+   TRIPLEDOUBLEQUOTE_U:    ('-', '#CCAABB','#FFFAFF'),
+   LINENUMBER:             ('ib-','#ff66aa','#7733FF'),]
+   TEXT:                   ('','#546634',''), 
+   PAGEBACKGROUND:         '#FFFAAA',
+     }
+ if __name__ == '__main__':
+     import sys
+     convert(sys.argv[1], './xhtml.html', colors=new, markup='xhtml', show=1,
+             linenumbers=1)
+     convert(sys.argv[1], './html.html', colors=new, markup='html', show=1,
+             linenumbers=1)
+
+"""
+
+__all__ = ['ERRORTOKEN','DECORATOR_NAME', 'DECORATOR', 'ARGS', 'EXTRASPACE',
+       'NAME', 'NUMBER', 'OPERATOR', 'COMMENT', 'MATH_OPERATOR',
+       'DOUBLECOMMENT', 'CLASS_NAME', 'DEF_NAME', 'KEYWORD', 'BRACKETS',
+       'SINGLEQUOTE','SINGLEQUOTE_R','SINGLEQUOTE_U','DOUBLEQUOTE',
+       'DOUBLEQUOTE_R', 'DOUBLEQUOTE_U', 'TRIPLESINGLEQUOTE', 'TEXT', 
+       'TRIPLESINGLEQUOTE_R', 'TRIPLESINGLEQUOTE_U', 'TRIPLEDOUBLEQUOTE',
+       'TRIPLEDOUBLEQUOTE_R', 'TRIPLEDOUBLEQUOTE_U', 'PAGEBACKGROUND',
+       'LINENUMBER', 'CODESTART', 'CODEEND', 'PY', 'TOKEN_NAMES', 'CSSHOOK',
+       'null', 'mono', 'lite', 'dark','dark2', 'pythonwin','idle', 
+       'viewcvs', 'Usage', 'cli', 'str2stdout', 'path2stdout', 'Parser',
+       'str2file', 'str2html', 'str2css', 'str2markup', 'path2file',
+       'path2html', 'convert', 'walkdir', 'defaultColors', 'showpage',
+       'pageconvert','tagreplace', 'MARKUPDICT']
+__title__ = 'PySourceColor'
+__version__ = "2.1a"
+__date__ = '25 April 2005'
+__author__ = "M.E.Farmer Jr."
+__credits__ = '''This was originally based on a python recipe
+submitted by J�gen Hermann to ASPN. Now based on the voices in my head.
+M.E.Farmer 2004, 2005
+Python license
+'''
+import os
+import sys
+import time
+import glob
+import getopt
+import keyword
+import token
+import tokenize
+import traceback
+import webbrowser
+try :
+    import cStringIO as StringIO
+except:
+    import StringIO
+# Do not edit
+NAME = token.NAME
+NUMBER = token.NUMBER
+COMMENT = tokenize.COMMENT
+OPERATOR = token.OP
+ERRORTOKEN = token.ERRORTOKEN
+ARGS = token.NT_OFFSET + 1
+DOUBLECOMMENT = token.NT_OFFSET + 2
+CLASS_NAME = token.NT_OFFSET + 3
+DEF_NAME = token.NT_OFFSET + 4
+KEYWORD = token.NT_OFFSET + 5
+SINGLEQUOTE = token.NT_OFFSET + 6
+SINGLEQUOTE_R = token.NT_OFFSET + 7
+SINGLEQUOTE_U = token.NT_OFFSET + 8
+DOUBLEQUOTE = token.NT_OFFSET + 9
+DOUBLEQUOTE_R = token.NT_OFFSET + 10
+DOUBLEQUOTE_U = token.NT_OFFSET + 11
+TRIPLESINGLEQUOTE = token.NT_OFFSET + 12
+TRIPLESINGLEQUOTE_R = token.NT_OFFSET + 13
+TRIPLESINGLEQUOTE_U = token.NT_OFFSET + 14
+TRIPLEDOUBLEQUOTE = token.NT_OFFSET + 15
+TRIPLEDOUBLEQUOTE_R = token.NT_OFFSET + 16
+TRIPLEDOUBLEQUOTE_U = token.NT_OFFSET + 17
+PAGEBACKGROUND = token.NT_OFFSET + 18
+DECORATOR = token.NT_OFFSET + 19
+DECORATOR_NAME = token.NT_OFFSET + 20
+BRACKETS = token.NT_OFFSET + 21
+MATH_OPERATOR = token.NT_OFFSET + 22
+LINENUMBER = token.NT_OFFSET + 23
+TEXT = token.NT_OFFSET + 24
+PY = token.NT_OFFSET + 25
+CODESTART = token.NT_OFFSET + 26
+CODEEND = token.NT_OFFSET + 27
+CSSHOOK = token.NT_OFFSET + 28
+EXTRASPACE = token.NT_OFFSET + 29
+
+# markup classname lookup
+MARKUPDICT = {
+        ERRORTOKEN:             'py_err',
+        DECORATOR_NAME:         'py_decn',
+        DECORATOR:              'py_dec',
+        ARGS:                   'py_args',
+        NAME:                   'py_name',
+        NUMBER:                 'py_num',
+        OPERATOR:               'py_op',
+        COMMENT:                'py_com',
+        DOUBLECOMMENT:          'py_dcom',
+        CLASS_NAME:             'py_clsn',
+        DEF_NAME:               'py_defn',
+        KEYWORD:                'py_key',
+        SINGLEQUOTE:            'py_sq',
+        SINGLEQUOTE_R:          'py_sqr',
+        SINGLEQUOTE_U:          'py_squ',
+        DOUBLEQUOTE:            'py_dq',
+        DOUBLEQUOTE_R:          'py_dqr',
+        DOUBLEQUOTE_U:          'py_dqu',
+        TRIPLESINGLEQUOTE:      'py_tsq',
+        TRIPLESINGLEQUOTE_R:    'py_tsqr',
+        TRIPLESINGLEQUOTE_U:    'py_tsqu',
+        TRIPLEDOUBLEQUOTE:      'py_tdq',
+        TRIPLEDOUBLEQUOTE_R:    'py_tdqr',
+        TRIPLEDOUBLEQUOTE_U:    'py_tdqu',
+        BRACKETS:               'py_bra',
+        MATH_OPERATOR:          'py_mop',
+        LINENUMBER:             'py_lnum',
+        TEXT:                   'py_text',
+        }
+# might help users that want to create custom schemes
+TOKEN_NAMES= {
+       ERRORTOKEN:'ERRORTOKEN',
+       DECORATOR_NAME:'DECORATOR_NAME',
+       DECORATOR:'DECORATOR',
+       ARGS:'ARGS',
+       NAME:'NAME',
+       NUMBER:'NUMBER',
+       OPERATOR:'OPERATOR',
+       COMMENT:'COMMENT',
+       DOUBLECOMMENT:'DOUBLECOMMENT',
+       CLASS_NAME:'CLASS_NAME',
+       DEF_NAME:'DEF_NAME',
+       KEYWORD:'KEYWORD',
+       SINGLEQUOTE:'SINGLEQUOTE',
+       SINGLEQUOTE_R:'SINGLEQUOTE_R',
+       SINGLEQUOTE_U:'SINGLEQUOTE_U',
+       DOUBLEQUOTE:'DOUBLEQUOTE',
+       DOUBLEQUOTE_R:'DOUBLEQUOTE_R',
+       DOUBLEQUOTE_U:'DOUBLEQUOTE_U',
+       TRIPLESINGLEQUOTE:'TRIPLESINGLEQUOTE',
+       TRIPLESINGLEQUOTE_R:'TRIPLESINGLEQUOTE_R',
+       TRIPLESINGLEQUOTE_U:'TRIPLESINGLEQUOTE_U',
+       TRIPLEDOUBLEQUOTE:'TRIPLEDOUBLEQUOTE',
+       TRIPLEDOUBLEQUOTE_R:'TRIPLEDOUBLEQUOTE_R',
+       TRIPLEDOUBLEQUOTE_U:'TRIPLEDOUBLEQUOTE_U',
+       BRACKETS:'BRACKETS',
+       MATH_OPERATOR:'MATH_OPERATOR',
+       LINENUMBER:'LINENUMBER',
+       TEXT:'TEXT',
+       PAGEBACKGROUND:'PAGEBACKGROUND',
+       }
+
+######################################################################
+# Edit colors and styles to taste
+# Create your own scheme, just copy one below , rename and edit.
+# Custom styles must at least define NAME, ERRORTOKEN, PAGEBACKGROUND,
+# all missing elements will default to NAME.
+# See module docstring for details on style attributes.
+######################################################################
+# Copy null and use it as a starter colorscheme.
+null = {# tokentype: ('tags border_color', 'textforecolor', 'textbackcolor')
+        ERRORTOKEN:             ('','#000000',''),# Error token
+        DECORATOR_NAME:         ('','#000000',''),# Decorator name
+        DECORATOR:              ('','#000000',''),# @ symbol
+        ARGS:                   ('','#000000',''),# class,def,deco arguments
+        NAME:                   ('','#000000',''),# All other python text
+        NUMBER:                 ('','#000000',''),# 0->10
+        OPERATOR:               ('','#000000',''),# ':','<=',';',',','.','==', etc
+        MATH_OPERATOR:          ('','#000000',''),# '+','-','=','','**',etc
+        BRACKETS:               ('','#000000',''),# '[',']','(',')','{','}'
+        COMMENT:                ('','#000000',''),# Single comment
+        DOUBLECOMMENT:          ('','#000000',''),## Double comment
+        CLASS_NAME:             ('','#000000',''),# Class name
+        DEF_NAME:               ('','#000000',''),# Def name
+        KEYWORD:                ('','#000000',''),# Python keywords
+        SINGLEQUOTE:            ('','#000000',''),# 'SINGLEQUOTE'
+        SINGLEQUOTE_R:          ('','#000000',''),# r'SINGLEQUOTE'
+        SINGLEQUOTE_U:          ('','#000000',''),# u'SINGLEQUOTE'
+        DOUBLEQUOTE:            ('','#000000',''),# "DOUBLEQUOTE"
+        DOUBLEQUOTE_R:          ('','#000000',''),# r"DOUBLEQUOTE"
+        DOUBLEQUOTE_U:          ('','#000000',''),# u"DOUBLEQUOTE"
+        TRIPLESINGLEQUOTE:      ('','#000000',''),# '''TRIPLESINGLEQUOTE'''
+        TRIPLESINGLEQUOTE_R:    ('','#000000',''),# r'''TRIPLESINGLEQUOTE'''
+        TRIPLESINGLEQUOTE_U:    ('','#000000',''),# u'''TRIPLESINGLEQUOTE'''
+        TRIPLEDOUBLEQUOTE:      ('','#000000',''),# """TRIPLEDOUBLEQUOTE"""
+        TRIPLEDOUBLEQUOTE_R:    ('','#000000',''),# r"""TRIPLEDOUBLEQUOTE"""
+        TRIPLEDOUBLEQUOTE_U:    ('','#000000',''),# u"""TRIPLEDOUBLEQUOTE"""
+        TEXT:                   ('','#000000',''),# non python text 
+        LINENUMBER:             ('>ti#555555','#000000',''),# Linenumbers
+        PAGEBACKGROUND:         '#FFFFFF'# set the page background
+        }
+
+mono = {
+        ERRORTOKEN:             ('s#FF0000','#FF8080',''),
+        DECORATOR_NAME:         ('bu','#000000',''),
+        DECORATOR:              ('b','#000000',''),
+        ARGS:                   ('b','#555555',''),
+        NAME:                   ('','#000000',''),
+        NUMBER:                 ('b','#000000',''),
+        OPERATOR:               ('b','#000000',''),
+        MATH_OPERATOR:          ('b','#000000',''),
+        BRACKETS:               ('b','#000000',''),
+        COMMENT:                ('i','#999999',''),
+        DOUBLECOMMENT:          ('b','#999999',''),
+        CLASS_NAME:             ('bu','#000000',''),
+        DEF_NAME:               ('b','#000000',''),
+        KEYWORD:                ('b','#000000',''),
+        SINGLEQUOTE:            ('','#000000',''),
+        SINGLEQUOTE_R:          ('','#000000',''),
+        SINGLEQUOTE_U:          ('','#000000',''),
+        DOUBLEQUOTE:            ('','#000000',''),
+        DOUBLEQUOTE_R:          ('','#000000',''),
+        DOUBLEQUOTE_U:          ('','#000000',''),
+        TRIPLESINGLEQUOTE:      ('','#000000',''),
+        TRIPLESINGLEQUOTE_R:    ('','#000000',''),
+        TRIPLESINGLEQUOTE_U:    ('','#000000',''),
+        TRIPLEDOUBLEQUOTE:      ('i','#000000',''),
+        TRIPLEDOUBLEQUOTE_R:    ('i','#000000',''),
+        TRIPLEDOUBLEQUOTE_U:    ('i','#000000',''),
+        TEXT:                   ('','#000000',''),
+        LINENUMBER:             ('>ti#555555','#000000',''),
+        PAGEBACKGROUND:         '#FFFFFF'
+        }
+
+dark = {
+        ERRORTOKEN:             ('s#FF0000','#FF8080',''),
+        DECORATOR_NAME:         ('b','#FFBBAA',''),
+        DECORATOR:              ('b','#CC5511',''),
+        ARGS:                   ('b','#DDDDFF',''),
+        NAME:                   ('','#DDDDDD',''),
+        NUMBER:                 ('','#FF0000',''),
+        OPERATOR:               ('b','#FAF785',''),
+        MATH_OPERATOR:          ('b','#FAF785',''),
+        BRACKETS:               ('b','#FAF785',''),
+        COMMENT:                ('','#45FCA0',''),
+        DOUBLECOMMENT:          ('i','#A7C7A9',''),
+        CLASS_NAME:             ('b','#B666FD',''),
+        DEF_NAME:               ('b','#EBAE5C',''),
+        KEYWORD:                ('b','#8680FF',''),
+        SINGLEQUOTE:            ('','#F8BAFE',''),
+        SINGLEQUOTE_R:          ('','#F8BAFE',''),
+        SINGLEQUOTE_U:          ('','#F8BAFE',''),
+        DOUBLEQUOTE:            ('','#FF80C0',''),
+        DOUBLEQUOTE_R:          ('','#FF80C0',''),
+        DOUBLEQUOTE_U:          ('','#FF80C0',''),
+        TRIPLESINGLEQUOTE:      ('','#FF9595',''),
+        TRIPLESINGLEQUOTE_R:    ('','#FF9595',''),
+        TRIPLESINGLEQUOTE_U:    ('','#FF9595',''),
+        TRIPLEDOUBLEQUOTE:      ('','#B3FFFF',''),
+        TRIPLEDOUBLEQUOTE_R:    ('','#B3FFFF',''),
+        TRIPLEDOUBLEQUOTE_U:    ('','#B3FFFF',''),
+        TEXT:                   ('','#FFFFFF',''),
+        LINENUMBER:             ('>mi#555555','#bbccbb','#333333'),
+        PAGEBACKGROUND:         '#000000'
+        }
+
+dark2 = {
+        ERRORTOKEN:             ('','#FF0000',''),
+        DECORATOR_NAME:         ('b','#FFBBAA',''),
+        DECORATOR:              ('b','#CC5511',''),
+        ARGS:                   ('b','#DDDDDD',''),
+        NAME:                   ('','#C0C0C0',''),
+        NUMBER:                 ('b','#00FF00',''),
+        OPERATOR:               ('b','#FF090F',''),
+        MATH_OPERATOR:          ('b','#EE7020',''),
+        BRACKETS:               ('b','#FFB90F',''),
+        COMMENT:                ('i','#D0D000','#522000'),#'#88AA88','#11111F'),
+        DOUBLECOMMENT:          ('i','#D0D000','#522000'),#'#77BB77','#11111F'),
+        CLASS_NAME:             ('b','#DD4080',''),
+        DEF_NAME:               ('b','#FF8040',''),
+        KEYWORD:                ('b','#4726d1',''),
+        SINGLEQUOTE:            ('','#8080C0',''),
+        SINGLEQUOTE_R:          ('','#8080C0',''),
+        SINGLEQUOTE_U:          ('','#8080C0',''),
+        DOUBLEQUOTE:            ('','#ADB9F1',''),
+        DOUBLEQUOTE_R:          ('','#ADB9F1',''),
+        DOUBLEQUOTE_U:          ('','#ADB9F1',''),
+        TRIPLESINGLEQUOTE:      ('','#00C1C1',''),#A050C0
+        TRIPLESINGLEQUOTE_R:    ('','#00C1C1',''),#A050C0
+        TRIPLESINGLEQUOTE_U:    ('','#00C1C1',''),#A050C0
+        TRIPLEDOUBLEQUOTE:      ('','#33E3E3',''),#B090E0
+        TRIPLEDOUBLEQUOTE_R:    ('','#33E3E3',''),#B090E0
+        TRIPLEDOUBLEQUOTE_U:    ('','#33E3E3',''),#B090E0
+        TEXT:                   ('','#C0C0C0',''),
+        LINENUMBER:             ('>mi#555555','#bbccbb','#333333'),
+        PAGEBACKGROUND:         '#000000'
+        }
+
+lite = {
+        ERRORTOKEN:             ('s#FF0000','#FF8080',''),
+        DECORATOR_NAME:         ('b','#BB4422',''),
+        DECORATOR:              ('b','#3333AF',''),
+        ARGS:                   ('b','#000000',''),
+        NAME:                   ('','#333333',''),
+        NUMBER:                 ('b','#DD2200',''),
+        OPERATOR:               ('b','#000000',''),
+        MATH_OPERATOR:          ('b','#000000',''),
+        BRACKETS:               ('b','#000000',''),
+        COMMENT:                ('','#007F00',''),
+        DOUBLECOMMENT:          ('','#608060',''),
+        CLASS_NAME:             ('b','#0000DF',''),
+        DEF_NAME:               ('b','#9C7A00',''),#f09030
+        KEYWORD:                ('b','#0000AF',''),
+        SINGLEQUOTE:            ('','#600080',''),
+        SINGLEQUOTE_R:          ('','#600080',''),
+        SINGLEQUOTE_U:          ('','#600080',''),
+        DOUBLEQUOTE:            ('','#A0008A',''),
+        DOUBLEQUOTE_R:          ('','#A0008A',''),
+        DOUBLEQUOTE_U:          ('','#A0008A',''),
+        TRIPLESINGLEQUOTE:      ('','#337799',''),
+        TRIPLESINGLEQUOTE_R:    ('','#337799',''),
+        TRIPLESINGLEQUOTE_U:    ('','#337799',''),
+        TRIPLEDOUBLEQUOTE:      ('','#1166AA',''),
+        TRIPLEDOUBLEQUOTE_R:    ('','#1166AA',''),
+        TRIPLEDOUBLEQUOTE_U:    ('','#1166AA',''),
+        TEXT:                   ('','#000000',''),
+        LINENUMBER:             ('>ti#555555','#000000',''),
+        PAGEBACKGROUND:         '#FFFFFF'
+        }
+
+idle = {
+        ERRORTOKEN:             ('s#FF0000','#FF8080',''),
+        DECORATOR_NAME:         ('','#900090',''),
+        DECORATOR:              ('','#FF7700',''),
+        NAME:                   ('','#000000',''),
+        NUMBER:                 ('','#000000',''),
+        OPERATOR:               ('','#000000',''),
+        MATH_OPERATOR:          ('','#000000',''),
+        BRACKETS:               ('','#000000',''),
+        COMMENT:                ('','#DD0000',''),
+        DOUBLECOMMENT:          ('','#DD0000',''),
+        CLASS_NAME:             ('','#0000FF',''),
+        DEF_NAME:               ('','#0000FF',''),
+        KEYWORD:                ('','#FF7700',''),
+        SINGLEQUOTE:            ('','#00AA00',''),
+        SINGLEQUOTE_R:          ('','#00AA00',''),
+        SINGLEQUOTE_U:          ('','#00AA00',''),
+        DOUBLEQUOTE:            ('','#00AA00',''),
+        DOUBLEQUOTE_R:          ('','#00AA00',''),
+        DOUBLEQUOTE_U:          ('','#00AA00',''),
+        TRIPLESINGLEQUOTE:      ('','#00AA00',''),
+        TRIPLESINGLEQUOTE_R:    ('','#00AA00',''),
+        TRIPLESINGLEQUOTE_U:    ('','#00AA00',''),
+        TRIPLEDOUBLEQUOTE:      ('','#00AA00',''),
+        TRIPLEDOUBLEQUOTE_R:    ('','#00AA00',''),
+        TRIPLEDOUBLEQUOTE_U:    ('','#00AA00',''),
+        TEXT:                   ('','#000000',''),
+        LINENUMBER:             ('>ti#555555','#000000',''),
+        PAGEBACKGROUND:         '#FFFFFF'
+        }
+
+pythonwin = {
+        ERRORTOKEN:             ('s#FF0000','#FF8080',''),
+        DECORATOR_NAME:         ('b','#DD0080',''),
+        DECORATOR:              ('b','#000080',''),
+        ARGS:                   ('','#000000',''),
+        NAME:                   ('','#303030',''),
+        NUMBER:                 ('','#008080',''),
+        OPERATOR:               ('','#000000',''),
+        MATH_OPERATOR:          ('','#000000',''),
+        BRACKETS:               ('','#000000',''),
+        COMMENT:                ('','#007F00',''),
+        DOUBLECOMMENT:          ('','#7F7F7F',''),
+        CLASS_NAME:             ('b','#0000FF',''),
+        DEF_NAME:               ('b','#007F7F',''),
+        KEYWORD:                ('b','#000080',''),
+        SINGLEQUOTE:            ('','#808000',''),
+        SINGLEQUOTE_R:          ('','#808000',''),
+        SINGLEQUOTE_U:          ('','#808000',''),
+        DOUBLEQUOTE:            ('','#808000',''),
+        DOUBLEQUOTE_R:          ('','#808000',''),
+        DOUBLEQUOTE_U:          ('','#808000',''),
+        TRIPLESINGLEQUOTE:      ('','#808000',''),
+        TRIPLESINGLEQUOTE_R:    ('','#808000',''),
+        TRIPLESINGLEQUOTE_U:    ('','#808000',''),
+        TRIPLEDOUBLEQUOTE:      ('','#808000',''),
+        TRIPLEDOUBLEQUOTE_R:    ('','#808000',''),
+        TRIPLEDOUBLEQUOTE_U:    ('','#808000',''),
+        TEXT:                   ('','#303030',''),
+        LINENUMBER:             ('>ti#555555','#000000',''),
+        PAGEBACKGROUND:         '#FFFFFF'
+        }
+
+viewcvs = {
+        ERRORTOKEN:             ('s#FF0000','#FF8080',''),
+        DECORATOR_NAME:         ('','#000000',''),
+        DECORATOR:              ('','#000000',''),
+        ARGS:                   ('','#000000',''),
+        NAME:                   ('','#000000',''),
+        NUMBER:                 ('','#000000',''),
+        OPERATOR:               ('','#000000',''),
+        MATH_OPERATOR:          ('','#000000',''),
+        BRACKETS:               ('','#000000',''),
+        COMMENT:                ('i','#b22222',''),
+        DOUBLECOMMENT:          ('i','#b22222',''),
+        CLASS_NAME:             ('','#000000',''),
+        DEF_NAME:               ('b','#0000ff',''),
+        KEYWORD:                ('b','#a020f0',''),
+        SINGLEQUOTE:            ('b','#bc8f8f',''),
+        SINGLEQUOTE_R:          ('b','#bc8f8f',''),
+        SINGLEQUOTE_U:          ('b','#bc8f8f',''),
+        DOUBLEQUOTE:            ('b','#bc8f8f',''),
+        DOUBLEQUOTE_R:          ('b','#bc8f8f',''),
+        DOUBLEQUOTE_U:          ('b','#bc8f8f',''),
+        TRIPLESINGLEQUOTE:      ('b','#bc8f8f',''),
+        TRIPLESINGLEQUOTE_R:    ('b','#bc8f8f',''),
+        TRIPLESINGLEQUOTE_U:    ('b','#bc8f8f',''),
+        TRIPLEDOUBLEQUOTE:      ('b','#bc8f8f',''),
+        TRIPLEDOUBLEQUOTE_R:    ('b','#bc8f8f',''),
+        TRIPLEDOUBLEQUOTE_U:    ('b','#bc8f8f',''),
+        TEXT:                   ('','#000000',''),
+        LINENUMBER:             ('>ti#555555','#000000',''),
+        PAGEBACKGROUND:         '#FFFFFF'
+        }
+
+defaultColors = lite
+
+def Usage():
+    doc = """
+ -----------------------------------------------------------------------------
+  PySourceColor.py ver: %s
+ -----------------------------------------------------------------------------
+  Module summary:
+     This module is designed to colorize python source code.
+         Input--->python source
+         Output-->colorized (html, html4.01/css, xhtml1.0)
+     Standalone:
+         This module will work from the command line with options.
+         This module will work with redirected stdio.
+     Imported:
+         This module can be imported and used directly in your code.
+ -----------------------------------------------------------------------------
+  Command line options:
+     -h, --help
+         Optional-> Display this help message.
+     -t, --test
+         Optional-> Will ignore all others flags but  --profile
+             test all schemes and markup combinations
+     -p, --profile
+         Optional-> Works only with --test or -t
+             runs profile.py and makes the test work in quiet mode.
+     -i, --in, --input
+         Optional-> If you give input on stdin.
+         Use any of these for the current dir (.,cwd)
+         Input can be file or dir.
+         Input from stdin use one of the following (-,stdin)
+         If stdin is used as input stdout is output unless specified.
+     -o, --out, --output
+         Optional-> output dir for the colorized source.
+             default: output dir is the input dir.
+         To output html to stdout use one of the following (-,stdout)
+         Stdout can be used without stdin if you give a file as input.
+     -c, --color
+         Optional-> null, mono, dark, dark2, lite, idle, pythonwin, viewcvs
+             default: dark 
+     -s, --show
+         Optional-> Show page after creation.
+             default: no show
+     -m, --markup
+         Optional-> html, css, xhtml
+             css, xhtml also support external stylesheets (-e,--external)
+             default: HTML
+     -e, --external
+         Optional-> use with css, xhtml
+             Writes an style sheet instead of embedding it in the page
+             saves it as pystyle.css in the same directory.
+             html markup will silently ignore this flag.
+     -H, --header
+         Opional-> add a page header to the top of the output
+         -H
+             Builtin header (name,date,hrule)
+         --header
+             You must specify a filename.
+             The header file must be valid html
+             and must handle its own font colors.
+             ex. --header c:/tmp/header.txt
+     -F, --footer
+         Opional-> add a page footer to the bottom of the output
+         -F 
+             Builtin footer (hrule,name,date)
+         --footer
+             You must specify a filename.
+             The footer file must be valid html
+             and must handle its own font colors.
+             ex. --footer c:/tmp/footer.txt  
+     -l, --linenumbers
+         Optional-> default is no linenumbers
+             Adds line numbers to the start of each line in the code.
+    --convertpage
+         Given a webpage that has code embedded in tags it will
+             convert embedded code to colorized html. 
+             (see pageconvert for details)
+ -----------------------------------------------------------------------------
+  Option usage:
+   # Test and show pages
+      python PySourceColor.py -t -s
+   # Test and only show profile results
+      python PySourceColor.py -t -p
+   # Colorize all .py,.pyw files in cwdir you can also use: (.,cwd)
+      python PySourceColor.py -i .
+   # Using long options w/ =
+      python PySourceColor.py --in=c:/myDir/my.py --color=lite --show
+   # Using short options w/out =
+      python PySourceColor.py -i c:/myDir/  -c idle -m css -e
+   # Using any mix
+      python PySourceColor.py --in . -o=c:/myDir --show
+   # Place a custom header on your files
+      python PySourceColor.py -i . -o c:/tmp -m xhtml --header c:/header.txt
+ -----------------------------------------------------------------------------
+  Stdio usage:
+   # Stdio using no options
+      python PySourceColor.py < c:/MyFile.py > c:/tmp/MyFile.html
+   # Using stdin alone automatically uses stdout for output: (stdin,-)
+      python PySourceColor.py -i- < c:/MyFile.py > c:/tmp/myfile.html
+   # Stdout can also be written to directly from a file instead of stdin
+      python PySourceColor.py -i c:/MyFile.py -m css -o- > c:/tmp/myfile.html
+   # Stdin can be used as input , but output can still be specified
+      python PySourceColor.py -i- -o c:/pydoc.py.html -s < c:/Python22/my.py
+ _____________________________________________________________________________
+ """
+    print doc % (__version__)
+    sys.exit(1)
+
+###################################################### Command line interface
+
+def cli():
+    """Handle command line args and redirections"""
+    try:
+        # try to get command line args
+        opts, args = getopt.getopt(sys.argv[1:],
+              "hseqtplHFi:o:c:m:h:f:",["help", "show", "quiet", 
+              "test", "external", "linenumbers", "convertpage", "profile", 
+              "input=", "output=", "color=", "markup=","header=", "footer="])
+    except getopt.GetoptError:
+        # on error print help information and exit:
+        Usage()
+    # init some names
+    input = None
+    output = None
+    colorscheme = None
+    markup = 'html'
+    header = None
+    footer = None
+    linenumbers = 0
+    show = 0
+    quiet = 0
+    test = 0
+    profile = 0
+    convertpage = 0
+    form = None
+    # if we have args then process them
+    for o, a in opts:
+        if o in ["-h", "--help"]:
+            Usage()
+            sys.exit()
+        if o in ["-o", "--output", "--out"]:
+            output = a
+        if o in ["-i", "--input", "--in"]:
+            input = a
+            if input in [".", "cwd"]:
+                input = os.getcwd()
+        if o in ["-s", "--show"]:
+            show = 1
+        if o in ["-q", "--quiet"]:
+            quiet = 1
+        if o in ["-t", "--test"]:
+            test = 1
+        if o in ["--convertpage"]:
+            convertpage = 1
+        if o in ["-p", "--profile"]:
+            profile = 1
+        if o in ["-e", "--external"]:
+            form = 'external'
+        if o in ["-m", "--markup"]:
+            markup = str(a)
+        if o in ["-l", "--linenumbers"]:
+            linenumbers = 1
+        if o in ["--header"]:
+            header = str(a)
+        elif o == "-H":
+            header = ''
+        if o in ["--footer"]:
+            footer = str(a)
+        elif o == "-F":
+            footer = ''
+        if o in ["-c", "--color"]:
+            try:
+                colorscheme = globals().get(a.lower())
+            except:
+                traceback.print_exc()
+                Usage()
+    if test:
+        if profile:
+            import profile
+            profile.run('_test(show=%s, quiet=%s)'%(show,quiet))
+        else:
+            # Parse this script in every possible colorscheme and markup
+            _test(show,quiet)
+    elif input in [None, "-", "stdin"] or output in ["-", "stdout"]:
+        # determine if we are going to use stdio
+        if input not in [None, "-", "stdin"]:
+            if os.path.isfile(input) :
+                path2stdout(input, colors=colorscheme, markup=markup,
+                            linenumbers=linenumbers, header=header, 
+                            footer=footer, form=form)
+            else:
+                raise PathError, 'File does not exists!'
+        else:
+            try:
+                if sys.stdin.isatty():
+                    raise InputError, 'Please check input!'
+                else:
+                    if output in [None,"-","stdout"]:
+                        str2stdout(sys.stdin.read(), colors=colorscheme,
+                                   markup=markup, header=header,
+                                   footer=footer, linenumbers=linenumbers,
+                                   form=form)
+                    else:
+                        str2file(sys.stdin.read(), outfile=output, show=show, 
+                                markup=markup, header=header, footer=footer,
+                                linenumbers=linenumbers, form=form)
+            except:
+                traceback.print_exc()
+                Usage()
+    else:
+        if os.path.exists(input):
+            if convertpage:
+                # if there was at least an input given we can proceed
+                pageconvert(input, out=output, colors=colorscheme, 
+                            show=show, markup=markup,linenumbers=linenumbers)
+            else:
+                # if there was at least an input given we can proceed
+                convert(source=input, outdir=output, colors=colorscheme, 
+                        show=show, markup=markup, quiet=quiet, header=header,
+                        footer=footer, linenumbers=linenumbers, form=form)
+        else:
+            raise PathError, 'File does not exists!'
+            Usage()
+
+######################################################### Simple markup tests
+
+def _test(show=0, quiet=0):
+    """Test the parser and most of the functions.
+
+       There are 19 test total(eight colorschemes in three diffrent markups,
+       and a str2file test. Most functions are tested by this.
+    """
+    fi = sys.argv[0]
+    if not fi.endswith('.exe'):# Do not test if frozen as an archive
+        # this is a collection of test, most things are covered.
+        path2file(fi, '/tmp/null.html', null, show=show, quiet=quiet)
+        path2file(fi, '/tmp/null_css.html', null, show=show,
+                  markup='css', quiet=quiet)
+        path2file(fi, '/tmp/mono.html', mono, show=show, quiet=quiet)
+        path2file(fi, '/tmp/mono_css.html', mono, show=show,
+                  markup='css', quiet=quiet)
+        path2file(fi, '/tmp/lite.html', lite, show=show, quiet=quiet)
+        path2file(fi, '/tmp/lite_css.html', lite, show=show,
+                  markup='css', quiet=quiet, header='', footer='', 
+                  linenumbers=1)
+        path2file(fi, '/tmp/lite_xhtml.html', lite, show=show,
+                  markup='xhtml', quiet=quiet)
+        path2file(fi, '/tmp/dark.html', dark, show=show, quiet=quiet)
+        path2file(fi, '/tmp/dark_css.html', dark, show=show,
+                  markup='css', quiet=quiet, linenumbers=1)
+        path2file(fi, '/tmp/dark2.html', dark2, show=show, quiet=quiet)
+        path2file(fi, '/tmp/dark2_css.html', dark2, show=show,
+                  markup='css', quiet=quiet)
+        path2file(fi, '/tmp/dark2_xhtml.html', dark2, show=show,
+                  markup='xhtml', quiet=quiet, header='', footer='', 
+                  linenumbers=1, form='external')
+        path2file(fi, '/tmp/idle.html', idle, show=show, quiet=quiet)
+        path2file(fi, '/tmp/idle_css.html', idle, show=show,
+                  markup='css', quiet=quiet)
+        path2file(fi, '/tmp/viewcvs.html', viewcvs, show=show, 
+                  quiet=quiet, linenumbers=1)
+        path2file(fi, '/tmp/viewcvs_css.html', viewcvs, show=show,
+                  markup='css', linenumbers=1, quiet=quiet)
+        path2file(fi, '/tmp/pythonwin.html', pythonwin, show=show,
+                  quiet=quiet)
+        path2file(fi, '/tmp/pythonwin_css.html', pythonwin, show=show,
+                  markup='css', quiet=quiet)
+        teststr=r'''"""This is a test of decorators and other things"""
+# This should be line 421...
+@whatever(arg,arg2)
+@A @B(arghh) @C
+def LlamaSaysNi(arg='Ni!',arg2="RALPH"):
+   """This docstring is deeply disturbed by all the llama references"""
+   print '%s The Wonder Llama says %s'% (arg2,arg)
+# So I was like duh!, and he was like ya know?!,
+# and so we were both like huh...wtf!? RTFM!! LOL!!;)
+@staticmethod## Double comments are KewL.
+def LlamasRLumpy():
+   """This docstring is too sexy to be here.
+   """
+   u"""
+=============================
+A Mse once bit my sister...
+=============================
+   """
+   ## Relax, this won't hurt a bit, just a simple, painless procedure,
+   ## hold still while I get the anesthetizing hammer.
+   m = {'three':'1','won':'2','too':'3'}
+   o = r'fishy\fishy\fishy/fish\oh/where/is\my/little\..'
+   python = uR""" 
+ No realli! She was Karving her initials  the mse with the sharpened end  
+ of an interspace tthbrush given her by Svenge - her brother-in-law -an Oslo
+ dentist and star of many Norwegian mies: "The H Hands of an Oslo         
+ Dentist", "Fillings of Passion", "The Huge Mars of Horst Nordfink"..."""
+   RU"""142 MEXICAN WHOOPING LLAMAS"""#<-Can you fit 142 llamas in a red box?
+   n = u' HERMSGERVﾘRDENBRﾘTBﾘRDA ' + """ YUTTE """
+   t = """SAMALLNIATNUOMNAIRODAUCE"""+"DENIARTYLLAICEPS04"
+   ## We apologise for the fault in the
+   ## comments. Those responsible have been
+   ## sacked.
+   y = '14 NORTH CHILEAN GUANACOS \
+(CLOSELY RELATED TO THE LLAMA)'
+   rules = [0,1,2,3,4,5]
+   print y'''
+        htmlPath = os.path.abspath('/tmp/strtest_lines.html')
+        str2file(teststr, htmlPath, colors=dark, markup='xhtml',
+                 linenumbers=420, show=show)
+        _printinfo("  wrote %s" % htmlPath, quiet)
+        htmlPath = os.path.abspath('/tmp/strtest_nolines.html')
+        str2file(teststr, htmlPath, colors=dark, markup='xhtml',
+                 show=show)
+        _printinfo("  wrote %s" % htmlPath, quiet)
+    else:
+        Usage()
+    return
+
+# emacs wants this: '
+
+####################################################### User funtctions
+
+def str2stdout(sourcestring, colors=None, title='', markup='html',
+                 header=None, footer=None,
+                 linenumbers=0, form=None):
+    """Converts a code(string) to colorized HTML. Writes to stdout.
+
+       form='code',or'snip' (for "<pre>yourcode</pre>" only)
+       colors=null,mono,lite,dark,dark2,idle,or pythonwin
+    """
+    Parser(sourcestring, colors=colors, title=title, markup=markup,
+           header=header, footer=footer,
+           linenumbers=linenumbers).format(form)
+
+def path2stdout(sourcepath, title='', colors=None, markup='html',
+                   header=None, footer=None,
+                   linenumbers=0, form=None):
+    """Converts code(file) to colorized HTML. Writes to stdout.
+
+       form='code',or'snip' (for "<pre>yourcode</pre>" only)
+       colors=null,mono,lite,dark,dark2,idle,or pythonwin
+    """
+    sourcestring = open(sourcepath).read()
+    Parser(sourcestring, colors=colors, title=sourcepath, 
+           markup=markup, header=header, footer=footer,
+           linenumbers=linenumbers).format(form)
+
+def str2html(sourcestring, colors=None, title='', 
+               markup='html', header=None, footer=None,
+               linenumbers=0, form=None):
+    """Converts a code(string) to colorized HTML. Returns an HTML string.
+
+       form='code',or'snip' (for "<pre>yourcode</pre>" only)
+       colors=null,mono,lite,dark,dark2,idle,or pythonwin
+    """
+    stringIO = StringIO.StringIO()
+    Parser(sourcestring, colors=colors, title=title, out=stringIO,
+           markup=markup, header=header, footer=footer,
+           linenumbers=linenumbers).format(form)
+    stringIO.seek(0)
+    return stringIO.read()
+  
+def str2css(sourcestring, colors=None, title='',
+              markup='css', header=None, footer=None,  
+              linenumbers=0, form=None):
+    """Converts a code string to colorized CSS/HTML. Returns CSS/HTML string
+       
+       If form != None then this will return (stylesheet_str, code_str)
+       colors=null,mono,lite,dark,dark2,idle,or pythonwin
+    """
+    if markup.lower() not in ['css' ,'xhtml']:
+        markup = 'css'
+    stringIO = StringIO.StringIO()
+    parse = Parser(sourcestring, colors=colors, title=title,
+                   out=stringIO, markup=markup,
+                   header=header, footer=footer,
+                   linenumbers=linenumbers)
+    parse.format(form)
+    stringIO.seek(0)
+    if form != None:
+        return parse._sendCSSStyle(external=1), stringIO.read()
+    else:
+        return None, stringIO.read()
+
+def str2markup(sourcestring, colors=None, title = '',
+               markup='xhtml', header=None, footer=None, 
+              linenumbers=0, form=None):
+    """ Convert code strings into ([stylesheet or None], colorized string) """
+    if markup.lower() == 'html':
+        return None, str2html(sourcestring, colors=colors, title=title,
+                   header=header, footer=footer, markup=markup, 
+                   linenumbers=linenumbers, form=form)
+    else:
+        return str2css(sourcestring, colors=colors, title=title,
+                   header=header, footer=footer, markup=markup, 
+                   linenumbers=linenumbers, form=form)
+
+def str2file(sourcestring, outfile, colors=None, title='', 
+               markup='html', header=None, footer=None, 
+               linenumbers=0, show=0, dosheet=1, form=None):
+    """Converts a code string to a file.
+
+       makes no attempt at correcting bad pathnames
+    """
+    css , html = str2markup(sourcestring, colors=colors, title='',
+                    markup=markup, header=header, footer=footer,
+                    linenumbers=linenumbers, form=form)
+    # write html
+    f = open(outfile,'wt')
+    f.writelines(html)
+    f.close()
+    #write css
+    if css != None and dosheet: 
+        dir = os.path.dirname(outfile)
+        outcss = os.path.join(dir,'pystyle.css')
+        f = open(outcss,'wt')
+        f.writelines(css)
+        f.close()
+    if show:
+        showpage(outfile)
+
+def path2html(sourcepath, colors=None, markup='html',
+                header=None, footer=None,
+                linenumbers=0, form=None):
+    """Converts code(file) to colorized HTML. Returns an HTML string.
+
+       form='code',or'snip' (for "<pre>yourcode</pre>" only)
+       colors=null,mono,lite,dark,dark2,idle,or pythonwin
+    """
+    stringIO = StringIO.StringIO()
+    sourcestring = open(sourcepath).read()
+    Parser(sourcestring, colors, title=sourcepath, out=stringIO,
+           markup=markup, header=header, footer=footer,
+           linenumbers=linenumbers).format(form)
+    stringIO.seek(0)
+    return stringIO.read()
+
+def convert(source, outdir=None, colors=None,
+              show=0, markup='html', quiet=0,
+              header=None, footer=None, linenumbers=0, form=None):
+    """Takes a file or dir as input and places the html in the outdir.
+
+       If outdir is none it defaults to the input dir
+    """
+    count=0
+    # If it is a filename then path2file
+    if not os.path.isdir(source):
+        if os.path.isfile(source):
+            count+=1
+            path2file(source, outdir, colors, show, markup, 
+                     quiet, form, header, footer, linenumbers, count)
+        else:
+            raise PathError, 'File does not exist!'
+    # If we pass in a dir we need to walkdir for files.
+    # Then we need to colorize them with path2file
+    else:
+        fileList = walkdir(source)
+        if fileList != None:
+            # make sure outdir is a dir
+            if outdir != None:
+                if os.path.splitext(outdir)[1] != '':
+                    outdir = os.path.split(outdir)[0]
+            for item in fileList:
+                count+=1
+                path2file(item, outdir, colors, show, markup,
+                          quiet, form, header, footer, linenumbers, count)
+            _printinfo('Completed colorizing %s files.'%str(count), quiet)
+        else:
+            _printinfo("No files to convert in dir.", quiet)
+
+def path2file(sourcePath, out=None, colors=None, show=0,
+                markup='html', quiet=0, form=None,
+                header=None, footer=None, linenumbers=0, count=1):
+    """ Converts python source to html file"""
+    # If no outdir is given we use the sourcePath
+    if out == None:#this is a guess
+        htmlPath = sourcePath + '.html'
+    else:
+        # If we do give an out_dir, and it does
+        # not exist , it will be created.
+        if os.path.splitext(out)[1] == '':
+            if not os.path.isdir(out):
+                os.makedirs(out)
+            sourceName = os.path.basename(sourcePath)
+            htmlPath = os.path.join(out,sourceName)+'.html'
+        # If we do give an out_name, and its dir does
+        # not exist , it will be created.
+        else:
+            outdir = os.path.split(out)[0]
+            if not os.path.isdir(outdir):
+                os.makedirs(outdir)
+            htmlPath = out
+    htmlPath = os.path.abspath(htmlPath)
+    # Open the text and do the parsing.
+    source = open(sourcePath).read()
+    parse = Parser(source, colors, sourcePath, open(htmlPath, 'wt'),
+                   markup, header, footer, linenumbers)
+    parse.format(form)
+    _printinfo("  wrote %s" % htmlPath, quiet)
+    # html markup will ignore the external flag, but
+    # we need to stop the blank file from being written.
+    if form == 'external' and count == 1 and markup != 'html':
+        cssSheet = parse._sendCSSStyle(external=1)
+        cssPath = os.path.join(os.path.dirname(htmlPath),'pystyle.css')
+        css = open(cssPath, 'wt')
+        css.write(cssSheet)
+        css.close()
+        _printinfo("    wrote %s" % cssPath, quiet)
+    if show:
+        # load HTML page into the default web browser.
+        showpage(htmlPath)
+    return htmlPath
+
+def tagreplace(sourcestr, colors=lite, markup='xhtml', 
+               linenumbers=0, dosheet=1, tagstart='<PY>'.lower(),
+               tagend='</PY>'.lower(), stylesheet='pystyle.css'):
+    """This is a helper function for pageconvert. Returns css, page.
+    """
+    if markup.lower() != 'html':
+        link  = '<link rel="stylesheet" href="%s" type="text/css"/></head>'
+        css = link%stylesheet
+        if sourcestr.find(css) == -1:
+            sourcestr = sourcestr.replace('</head>', css, 1)
+    starttags = sourcestr.count(tagstart)
+    endtags = sourcestr.count(tagend)
+    if starttags:
+        if starttags == endtags:
+            for _ in range(starttags):
+               datastart = sourcestr.find(tagstart)
+               dataend = sourcestr.find(tagend)
+               data = sourcestr[datastart+len(tagstart):dataend]
+               data = unescape(data)
+               css , data = str2markup(data, colors=colors, 
+                         linenumbers=linenumbers, markup=markup, form='embed')
+               start = sourcestr[:datastart]
+               end = sourcestr[dataend+len(tagend):]
+               sourcestr =  ''.join([start,data,end])
+        else:
+            raise InputError,'Tag mismatch!\nCheck %s,%s tags'%tagstart,tagend
+    if not dosheet:
+        css = None
+    return css, sourcestr
+    
+def pageconvert(path, out=None, colors=lite, markup='xhtml', linenumbers=0,
+                  dosheet=1, tagstart='<PY>'.lower(), tagend='</PY>'.lower(),
+                  stylesheet='pystyle', show=1, returnstr=0):
+    """This function can colorize Python source
+
+       that is written in a webpage enclosed in tags.
+    """
+    if out == None:
+        out = os.path.dirname(path)
+    infile = open(path, 'r').read()
+    css,page  = tagreplace(sourcestr=infile,colors=colors, 
+                   markup=markup, linenumbers=linenumbers, dosheet=dosheet,
+                   tagstart=tagstart, tagend=tagend, stylesheet=stylesheet)
+    if not returnstr:
+        newpath = os.path.abspath(os.path.join(
+                  out,'tmp', os.path.basename(path)))
+        if not os.path.exists(newpath):
+            try:
+                os.makedirs(os.path.dirname(newpath))
+            except:
+                pass#traceback.print_exc()
+                #Usage()
+        y = open(newpath, 'w')
+        y.write(page)
+        y.close()
+        if css:
+            csspath = os.path.abspath(os.path.join(
+                      out,'tmp','%s.css'%stylesheet))
+            x = open(csspath,'w')
+            x.write(css)
+            x.close()
+        if show:
+            try:
+                os.startfile(newpath)
+            except:
+                traceback.print_exc()
+        return newpath
+    else:
+        return css, page
+
+##################################################################### helpers
+
+def walkdir(dir):
+    """Return a list of .py and .pyw files from a given directory.
+
+       This function can be written as a generator Python 2.3, or a genexp
+       in Python 2.4. But 2.2 and 2.1 would be left out....
+    """
+    # Get a list of files that match *.py*
+    GLOB_PATTERN = os.path.join(dir, "*.[p][y]*")
+    pathlist = glob.glob(GLOB_PATTERN)
+    # Now filter out all but py and pyw
+    filterlist = [x for x in pathlist
+                        if x.endswith('.py')
+                        or x.endswith('.pyw')]
+    if filterlist != []:
+        # if we have a list send it
+        return filterlist
+    else:
+        return None
+
+def showpage(path):
+    """Helper function to open webpages"""
+    try:
+        webbrowser.open_new(os.path.abspath(path))
+    except:
+        traceback.print_exc()
+
+def _printinfo(message, quiet):
+    """Helper to print messages"""
+    if not quiet:
+        print message
+
+def escape(text):
+     """escape text for html. similar to cgi.escape"""
+     text = text.replace("&", "&amp;")
+     text = text.replace("<", "&lt;")
+     text = text.replace(">", "&gt;")
+     return text
+
+def unescape(text):
+     """unsecape escaped text"""
+     text = text.replace("&quot;", '"')
+     text = text.replace("&gt;", ">")
+     text = text.replace("&lt;", "<")
+     text = text.replace("&amp;", "&")
+     return text
+
+########################################################### Custom Exceptions
+
+class PySourceColorError(Exception):
+    # Base for custom errors
+    def __init__(self, msg=''):
+        self._msg = msg
+        Exception.__init__(self, msg)
+    def __repr__(self):
+        return self._msg
+    __str__ = __repr__
+
+class PathError(PySourceColorError):
+    def __init__(self, msg):
+       PySourceColorError.__init__(self,
+         'Path error! : %s'% msg)
+
+class InputError(PySourceColorError):
+   def __init__(self, msg):
+       PySourceColorError.__init__(self,
+         'Input error! : %s'% msg)
+
+########################################################## Python code parser
+
+class Parser(object):
+
+    """MoinMoin python parser heavily chopped :)"""
+
+    def __init__(self, raw, colors=None, title='', out=sys.stdout,
+                   markup='html', header=None, footer=None, linenumbers=0):
+        """Store the source text & set some flags"""
+        if colors == None:
+            colors = defaultColors
+        self.raw = raw.expandtabs().rstrip()
+        self.title = os.path.basename(title)
+        self.out = out
+        self.line = ''
+        self.lasttext = ''
+        self.argFlag = 0
+        self.classFlag = 0
+        self.defFlag = 0
+        self.decoratorFlag = 0
+        self.external = 0
+        self.markup = markup.upper()
+        self.colors = colors
+        self.header = header
+        self.footer = footer
+        self.doArgs = 1 #  overrides the new tokens
+        self.doNames = 1 #  overrides the new tokens
+        self.doMathOps = 1 #  overrides the new tokens
+        self.doBrackets = 1 #  overrides the new tokens
+        self.doURL = 1 # override url conversion
+        self.LINENUMHOLDER = "___line___".upper()
+        self.LINESTART = "___start___".upper()
+        self.skip = 0
+        # add space left side of code for padding.Override in color dict.
+        self.extraspace = self.colors.get(EXTRASPACE, '')
+        # Linenumbers less then zero also have numberlinks
+        self.dolinenums = self.linenum = abs(linenumbers)
+        if linenumbers < 0:
+            self.numberlinks = 1
+        else:
+            self.numberlinks = 0
+
+    def format(self, form=None):
+        """Parse and send the colorized source"""
+        if form in ('snip','code'):
+            self.addEnds = 0
+        elif form == 'embed':
+            self.addEnds = 0
+            self.external = 1
+        else:
+            if form == 'external':
+                self.external = 1
+            self.addEnds = 1
+
+        # Store line offsets in self.lines
+        self.lines = [0, 0]
+        pos = 0
+
+        # Add linenumbers
+        if self.dolinenums:
+            start=self.LINENUMHOLDER+' '+self.extraspace
+        else:
+            start=''+self.extraspace
+        newlines = []
+        lines = self.raw.splitlines(0)
+        for l in lines:
+             # span and div escape for customizing and embedding raw text 
+             if (l.startswith('#$#')
+                  or l.startswith('#%#')
+                  or l.startswith('#@#')):   
+                newlines.append(l)
+             else:
+                # kludge for line spans in css,xhtml
+                if self.markup in ['XHTML','CSS']:
+                    newlines.append(self.LINESTART+' '+start+l)
+                else:
+                    newlines.append(start+l)
+        self.raw = "\n".join(newlines)+'\n'# plus an extra newline at the end
+
+        # Gather lines
+        while 1:
+            pos = self.raw.find('\n', pos) + 1
+            if not pos: break
+            self.lines.append(pos)
+        self.lines.append(len(self.raw))
+
+        # Wrap text in a filelike object
+        self.pos = 0
+        text = StringIO.StringIO(self.raw)
+        
+        # Markup start
+        if self.addEnds:
+            self._doPageStart()
+        else:
+            self._doSnippetStart()
+
+        ## Tokenize calls the __call__
+        ## function for each token till done.
+        # Parse the source and write out the results.
+        try:
+            tokenize.tokenize(text.readline, self)
+        except tokenize.TokenError, ex:
+            msg = ex[0]
+            line = ex[1][0]
+            self.out.write("<h3>ERROR: %s</h3>%s\n"%
+                            (msg, self.raw[self.lines[line]:]))
+            #traceback.print_exc()
+
+        # Markup end
+        if self.addEnds:
+            self._doPageEnd()
+        else:
+            self._doSnippetEnd()
+
+    def __call__(self, toktype, toktext, (srow,scol), (erow,ecol), line):
+        """Token handler. Order is important do not rearrange."""
+        self.line = line
+        # Calculate new positions
+        oldpos = self.pos
+        newpos = self.lines[srow] + scol
+        self.pos = newpos + len(toktext)
+        # Handle newlines
+        if toktype in (token.NEWLINE, tokenize.NL):
+            self.decoratorFlag = self.argFlag = 0
+            # kludge for line spans in css,xhtml
+            if self.markup in ['XHTML','CSS']:
+                self.out.write('</span>')
+            self.out.write('\n')
+            return
+
+        # Send the original whitespace, and tokenize backslashes if present.
+        # Tokenizer.py just sends continued line backslashes with whitespace.
+        # This is a hack to tokenize continued line slashes as operators.
+        # Should continued line backslashes be treated as operators
+        # or some other token?
+
+        if newpos > oldpos:
+            if self.raw[oldpos:newpos].isspace():
+                # consume a single space after linestarts and linenumbers
+                # had to have them so tokenizer could seperate them.
+                # multiline strings are handled by do_Text functions
+                if self.lasttext != self.LINESTART \
+                        and self.lasttext != self.LINENUMHOLDER:
+                    self.out.write(self.raw[oldpos:newpos])
+                else:
+                    self.out.write(self.raw[oldpos+1:newpos])
+            else:
+                slash = self.raw[oldpos:newpos].find('\\')+oldpos
+                self.out.write(self.raw[oldpos:slash])
+                getattr(self, '_send%sText'%(self.markup))(OPERATOR, '\\')
+                self.linenum+=1
+                # kludge for line spans in css,xhtml
+                if self.markup in ['XHTML','CSS']:
+                    self.out.write('</span>')
+                self.out.write(self.raw[slash+1:newpos])
+
+        # Skip indenting tokens
+        if toktype in (token.INDENT, token.DEDENT):
+            self.pos = newpos
+            return
+
+        # Look for operators
+        if token.LPAR <= toktype and toktype <= token.OP:
+            # Trap decorators py2.4 >
+            if toktext == '@':
+                toktype = DECORATOR
+                # Set a flag if this was the decorator start so
+                # the decorator name and arguments can be identified
+                self.decoratorFlag = self.argFlag = 1
+            else:
+                if self.doArgs:
+                    # Find the start for arguments
+                    if toktext == '(' and self.argFlag:
+                        self.argFlag = 2
+                    # Find the end for arguments
+                    elif toktext == ':':
+                        self.argFlag = 0
+                ## Seperate the diffrent operator types
+                # Brackets
+                if self.doBrackets and toktext in ['[',']','(',')','{','}']:
+                    toktype = BRACKETS
+                # Math operators 
+                elif self.doMathOps and toktext in ['*=','**=','-=','+=','|=',
+                                                      '%=','>>=','<<=','=','^=',
+                                                      '/=', '+','-','**','*','/','%']:
+                    toktype = MATH_OPERATOR
+                # Operator 
+                else:
+                    toktype = OPERATOR
+                    # example how flags should work.
+                    # def fun(arg=argvalue,arg2=argvalue2):
+                    # 0   1  2 A 1   N    2 A  1    N     0
+                    if toktext == "=" and self.argFlag == 2:
+                         self.argFlag = 1
+                    elif toktext == "," and self.argFlag == 1:
+                        self.argFlag = 2
+        # Look for keywords
+        elif toktype == NAME and keyword.iskeyword(toktext):
+            toktype = KEYWORD
+            # Set a flag if this was the class / def start so
+            # the class / def name and arguments can be identified
+            if toktext in ['class', 'def']:
+                if toktext =='class' and \
+                         not line[:line.find('class')].endswith('.'): 
+                    self.classFlag = self.argFlag = 1
+                elif toktext == 'def' and \
+                         not line[:line.find('def')].endswith('.'):
+                    self.defFlag = self.argFlag = 1
+                else:
+                    # must have used a keyword as a name i.e. self.class
+                    toktype = ERRORTOKEN 
+
+        # Look for class, def, decorator name
+        elif (self.classFlag or self.defFlag or self.decoratorFlag) \
+                and self.doNames:
+            if self.classFlag:
+                self.classFlag = 0
+                toktype = CLASS_NAME
+            elif self.defFlag:
+                self.defFlag = 0
+                toktype = DEF_NAME
+            elif self.decoratorFlag:
+                self.decoratorFlag = 0
+                toktype = DECORATOR_NAME
+
+        # Look for strings
+        # Order of evaluation is important do not change.
+        elif toktype == token.STRING:
+            text = toktext.lower()
+            # TRIPLE DOUBLE QUOTE's
+            if (text[:3] == '"""'):
+                toktype = TRIPLEDOUBLEQUOTE
+            elif (text[:4] == 'r"""'):
+                toktype = TRIPLEDOUBLEQUOTE_R
+            elif (text[:4] == 'u"""' or
+                   text[:5] == 'ur"""'):
+                toktype = TRIPLEDOUBLEQUOTE_U
+            # DOUBLE QUOTE's
+            elif (text[:1] == '"'):
+                toktype = DOUBLEQUOTE
+            elif (text[:2] == 'r"'):
+                toktype = DOUBLEQUOTE_R
+            elif (text[:2] == 'u"' or
+                   text[:3] == 'ur"'):
+                toktype = DOUBLEQUOTE_U
+            # TRIPLE SINGLE QUOTE's
+            elif (text[:3] == "'''"):
+                 toktype = TRIPLESINGLEQUOTE
+            elif (text[:4] == "r'''"):
+                toktype = TRIPLESINGLEQUOTE_R
+            elif (text[:4] == "u'''" or
+                   text[:5] == "ur'''"):
+                toktype = TRIPLESINGLEQUOTE_U
+            # SINGLE QUOTE's
+            elif (text[:1] == "'"):
+                toktype = SINGLEQUOTE
+            elif (text[:2] == "r'"):
+                toktype = SINGLEQUOTE_R
+            elif (text[:2] == "u'" or
+                   text[:3] == "ur'"):
+                toktype = SINGLEQUOTE_U
+
+            # test for invalid string declaration
+            if self.lasttext.lower() == 'ru':
+                toktype = ERRORTOKEN
+           
+        # Look for comments
+        elif toktype == COMMENT:
+            if toktext[:2] == "##":
+                toktype = DOUBLECOMMENT
+            elif toktext[:3] == '#$#':
+                toktype = TEXT
+                self.textFlag = 'SPAN'
+                toktext = toktext[3:]
+            elif toktext[:3] == '#%#':
+                toktype = TEXT
+                self.textFlag = 'DIV'
+                toktext = toktext[3:]
+            elif toktext[:3] == '#@#':
+                toktype = TEXT
+                self.textFlag = 'RAW'
+                toktext = toktext[3:]
+            if self.doURL:
+                # this is a 'fake helper function'
+                # url(URI,Alias_name) or url(URI)
+                url_pos = toktext.find('url(')
+                if url_pos != -1:
+                    before = toktext[:url_pos]
+                    url = toktext[url_pos+4:]
+                    splitpoint = url.find(',')
+                    endpoint = url.find(')')
+                    after = url[endpoint+1:]
+                    url = url[:endpoint]
+                    if splitpoint != -1:
+                        urlparts = url.split(',',1)
+                        toktext = '%s<a href="%s">%s</a>%s'%(
+                                   before,urlparts[0],urlparts[1].lstrip(),after) 
+                    else:
+                        toktext = '%s<a href="%s">%s</a>%s'%(before,url,url,after) 
+                        
+        # Seperate errors from decorators
+        elif toktype == ERRORTOKEN:
+            # Bug fix for < py2.4
+            # space between decorators
+            if self.argFlag and toktext.isspace():
+                #toktype = NAME
+                self.out.write(toktext)
+                return
+            # Bug fix for py2.2 linenumbers with decorators
+            elif toktext.isspace():
+                # What if we have a decorator after a >>> or ...
+                #p = line.find('@')
+                #if p >= 0 and not line[:p].isspace():
+                    #self.out.write(toktext)
+                    #return
+                if self.skip:
+                    self.skip=0
+                    return
+                else:           
+                    self.out.write(toktext)
+                    return
+            # trap decorators < py2.4
+            elif toktext == '@':
+                toktype = DECORATOR
+                # Set a flag if this was the decorator start so
+                # the decorator name and arguments can be identified
+                self.decoratorFlag = self.argFlag = 1
+
+        # Seperate args from names
+        elif (self.argFlag == 2 and
+              toktype == NAME and
+              toktext != 'None' and
+              self.doArgs):
+            toktype = ARGS
+
+        # Look for line numbers
+        # The conversion code for them is in the send_text functions.
+        if toktext in [self.LINENUMHOLDER,self.LINESTART]:
+            toktype = LINENUMBER
+            # if we don't have linenumbers set flag
+            # to skip the trailing space from linestart
+            if toktext == self.LINESTART and not self.dolinenums \
+                                or toktext == self.LINENUMHOLDER:
+                self.skip=1
+
+
+        # Skip blank token that made it thru
+        ## bugfix for the last empty tag.
+        if toktext == '':
+            return
+
+        # Last token text history
+        self.lasttext = toktext
+        
+        # escape all but the urls in the comments
+        if toktype in (DOUBLECOMMENT, COMMENT):
+            if toktext.find('<a href=') == -1:
+                toktext = escape(toktext)
+            else:
+                pass
+        elif toktype == TEXT:
+            pass
+        else:
+            toktext = escape(toktext)
+
+        # Send text for any markup
+        getattr(self, '_send%sText'%(self.markup))(toktype, toktext)
+        return
+
+    ################################################################# Helpers
+
+    def _doSnippetStart(self):
+        if self.markup == 'HTML':
+            # Start of html snippet
+            self.out.write('<pre>\n')
+        else:
+            # Start of css/xhtml snippet
+            self.out.write(self.colors.get(CODESTART,'<pre class="py">\n'))
+
+    def _doSnippetEnd(self):
+        # End of html snippet
+        self.out.write(self.colors.get(CODEEND,'</pre>\n'))
+
+    ######################################################## markup selectors
+
+    def _getFile(self, filepath): 
+        try:
+            _file = open(filepath,'r')
+            content = _file.read()
+            _file.close()
+        except:
+            traceback.print_exc()
+            content = ''
+        return content
+
+    def _doPageStart(self):
+        getattr(self, '_do%sStart'%(self.markup))()
+
+    def _doPageHeader(self):
+        if self.header != None:
+            if self.header.find('#$#') != -1 or \
+                self.header.find('#$#') != -1 or \
+                self.header.find('#%#') != -1:
+                self.out.write(self.header[3:])
+            else:
+                if self.header != '':
+                    self.header = self._getFile(self.header)
+                getattr(self, '_do%sHeader'%(self.markup))()
+
+    def _doPageFooter(self):
+        if self.footer != None:
+            if self.footer.find('#$#') != -1 or \
+                self.footer.find('#@#') != -1 or \
+                self.footer.find('#%#') != -1:
+                self.out.write(self.footer[3:])
+            else:
+                if self.footer != '':
+                    self.footer = self._getFile(self.footer)
+                getattr(self, '_do%sFooter'%(self.markup))()
+
+    def _doPageEnd(self):
+        getattr(self, '_do%sEnd'%(self.markup))()
+
+    ################################################### color/style retrieval
+    ## Some of these are not used anymore but are kept for documentation
+
+    def _getLineNumber(self):
+        num = self.linenum
+        self.linenum+=1
+        return  str(num).rjust(5)+" "
+
+    def _getTags(self, key):
+        # style tags
+        return self.colors.get(key, self.colors[NAME])[0]
+
+    def _getForeColor(self, key):
+        # get text foreground color, if not set to black
+        color = self.colors.get(key, self.colors[NAME])[1]
+        if color[:1] != '#':
+            color = '#000000'
+        return color
+
+    def _getBackColor(self, key):
+        # get text background color
+        return self.colors.get(key, self.colors[NAME])[2]
+
+    def _getPageColor(self):
+        # get page background color
+        return self.colors.get(PAGEBACKGROUND, '#FFFFFF')
+
+    def _getStyle(self, key):
+        # get the token style from the color dictionary
+        return self.colors.get(key, self.colors[NAME])
+
+    def _getMarkupClass(self, key):
+        # get the markup class name from the markup dictionary
+        return MARKUPDICT.get(key, MARKUPDICT[NAME])
+
+    def _getDocumentCreatedBy(self):
+        return '<!--This document created by %s ver.%s on: %s-->\n'%(
+                  __title__,__version__,time.ctime())
+
+    ################################################### HTML markup functions
+
+    def _doHTMLStart(self):
+        # Start of html page
+        self.out.write('<!DOCTYPE html PUBLIC \
+"-//W3C//DTD HTML 4.01//EN">\n')
+        self.out.write('<html><head><title>%s</title>\n'%(self.title))
+        self.out.write(self._getDocumentCreatedBy())
+        self.out.write('<meta http-equiv="Content-Type" \
+content="text/html;charset=iso-8859-1">\n')
+        # Get background
+        self.out.write('</head><body bgcolor="%s">\n'%self._getPageColor())
+        self._doPageHeader()
+        self.out.write('<pre>')
+
+    def _getHTMLStyles(self, toktype, toktext):
+        # Get styles
+        tags, color = self.colors.get(toktype, self.colors[NAME])[:2]#
+        tagstart=[]
+        tagend=[]
+        # check for styles and set them if needed.
+        if 'b' in tags:#Bold
+            tagstart.append('<b>')
+            tagend.append('</b>')
+        if 'i' in tags:#Italics
+            tagstart.append('<i>')
+            tagend.append('</i>')
+        if 'u' in tags:#Underline
+            tagstart.append('<u>')
+            tagend.append('</u>')
+        # HTML tags should be paired like so : <b><i><u>Doh!</u></i></b>
+        tagend.reverse()
+        starttags="".join(tagstart)
+        endtags="".join(tagend)
+        return starttags,endtags,color
+
+    def _sendHTMLText(self, toktype, toktext):
+        numberlinks = self.numberlinks
+        
+        # If it is an error, set a red box around the bad tokens
+        # older browsers should ignore it
+        if toktype == ERRORTOKEN:
+            style = ' style="border: solid 1.5pt #FF0000;"'
+        else:
+            style = ''
+        # Get styles
+        starttag, endtag, color = self._getHTMLStyles(toktype, toktext)
+        # This is a hack to 'fix' multi-line  strings.
+        # Multi-line strings are treated as only one token 
+        # even though they can be several physical lines.
+        # That makes it hard to spot the start of a line,
+        # because at this level all we know about are tokens.
+        
+        if toktext.count(self.LINENUMHOLDER):
+            # rip apart the string and separate it by line.
+            # count lines and change all linenum token to line numbers.
+            # embedded all the new font tags inside the current one.
+            # Do this by ending the tag first then writing our new tags,
+            # then starting another font tag exactly like the first one.
+            if toktype == LINENUMBER:
+                splittext = toktext.split(self.LINENUMHOLDER)
+            else:    
+                splittext = toktext.split(self.LINENUMHOLDER+' ')
+            store = []
+            store.append(splittext.pop(0))
+            lstarttag, lendtag, lcolor = self._getHTMLStyles(LINENUMBER, toktext)
+            count = len(splittext)
+            for item in splittext:
+                num =  self._getLineNumber()
+                if numberlinks:
+                    numstrip = num.strip()
+                    content = '<a name="%s" href="#%s">%s</a>' \
+                              %(numstrip,numstrip,num)
+                else:
+                    content = num
+                if count <= 1:
+                    endtag,starttag = '',''
+                linenumber = ''.join([endtag,'<font color=', lcolor, '>',
+                            lstarttag, content, lendtag, '</font>' ,starttag])
+                store.append(linenumber+item)
+            toktext = ''.join(store)
+        # send text
+        ## Output optimization
+        # skip font tag if black text, but styles will still be sent. (b,u,i)
+        if color !='#000000':
+            startfont = '<font color="%s"%s>'%(color, style)
+            endfont = '</font>'
+        else:
+            startfont, endfont = ('','')
+        if toktype != LINENUMBER:
+            self.out.write(''.join([startfont,starttag,
+                                     toktext,endtag,endfont]))
+        else:
+            self.out.write(toktext)
+        return
+
+    def _doHTMLHeader(self):
+        # Optional
+        if self.header != '':
+            self.out.write('%s\n'%self.header)
+        else:
+            color = self._getForeColor(NAME)
+            self.out.write('<b><font color="%s"># %s \
+                            <br># %s</font></b><hr>\n'%
+                           (color, self.title, time.ctime()))
+
+    def _doHTMLFooter(self):
+        # Optional
+        if self.footer != '':
+            self.out.write('%s\n'%self.footer)
+        else:
+            color = self._getForeColor(NAME)
+            self.out.write('<b><font color="%s"> \
+                            <hr># %s<br># %s</font></b>\n'%
+                           (color, self.title, time.ctime()))
+
+    def _doHTMLEnd(self):
+        # End of html page
+        self.out.write('</pre>\n')
+        # Write a little info at the bottom
+        self._doPageFooter()
+        self.out.write('</body></html>\n')
+
+    #################################################### CSS markup functions
+
+    def _getCSSStyle(self, key):
+        # Get the tags and colors from the dictionary
+        tags, forecolor, backcolor = self._getStyle(key)
+        style=[]
+        border = None
+        bordercolor = None
+        tags = tags.lower()
+        if tags:
+            # get the border color if specified
+            # the border color will be appended to
+            # the list after we define a border
+            if '#' in tags:# border color 
+                start = tags.find('#')
+                end = start + 7
+                bordercolor = tags[start:end]
+                tags.replace(bordercolor,'',1)
+            # text styles
+            if 'b' in tags:# Bold
+                style.append('font-weight:bold;')
+            else:
+                style.append('font-weight:normal;')    
+            if 'i' in tags:# Italic
+                style.append('font-style:italic;')
+            if 'u' in tags:# Underline
+                style.append('text-decoration:underline;')
+            # border size
+            if 'l' in tags:# thick border
+                size='thick'
+            elif 'm' in tags:# medium border
+                size='medium'
+            elif 't' in tags:# thin border
+                size='thin'
+            else:# default
+                size='medium'
+            # border styles
+            if 'n' in tags:# inset border
+                border='inset'
+            elif 'o' in tags:# outset border
+                border='outset'
+            elif 'r' in tags:# ridge border
+                border='ridge'
+            elif 'g' in tags:# groove border
+                border='groove'
+            elif '=' in tags:# double border
+                border='double'
+            elif '.' in tags:# dotted border
+                border='dotted'
+            elif '-' in tags:# dashed border
+                border='dashed'
+            elif 's' in tags:# solid border 
+                border='solid'
+            # border type check
+            seperate_sides=0
+            for side in ['<','>','^','v']:
+                if side in tags:
+                    seperate_sides+=1
+            # border box or seperate sides
+            if seperate_sides==0 and border:
+                    style.append('border: %s %s;'%(border,size))
+            else:
+                if border == None:
+                   border = 'solid'
+                if 'v' in tags:# bottom border
+                    style.append('border-bottom:%s %s;'%(border,size))
+                if '<' in tags:# left border
+                    style.append('border-left:%s %s;'%(border,size))
+                if '>' in tags:# right border
+                    style.append('border-right:%s %s;'%(border,size))
+                if '^' in tags:# top border
+                    style.append('border-top:%s %s;'%(border,size))
+        else:
+            style.append('font-weight:normal;')# css inherited style fix    
+        # we have to define our borders before we set colors
+        if bordercolor:
+            style.append('border-color:%s;'%bordercolor)
+        # text forecolor  
+        style.append('color:%s;'% forecolor)
+        # text backcolor
+        if backcolor:
+            style.append('background-color:%s;'%backcolor)
+        return (self._getMarkupClass(key),' '.join(style))
+
+    def _sendCSSStyle(self, external=0):
+        """ create external and internal style sheets"""
+        styles = []
+        external += self.external
+        if not external:
+            styles.append('<style type="text/css">\n<!--\n')
+        # Get page background color and write styles ignore any we don't know
+        styles.append('body { background:%s; }\n'%self._getPageColor())
+        # write out the various css styles
+        for key in MARKUPDICT:
+            styles.append('.%s { %s }\n'%self._getCSSStyle(key))
+        # If you want to style the pre tag you must modify the color dict.
+        #  Example: 
+        #  lite[PY] = .py {border: solid thin #000000;background:#555555}\n''' 
+        styles.append(self.colors.get(PY, '.py { }\n'))
+        # Extra css can be added here
+        # add CSSHOOK to the color dict if you need it.
+        # Example: 
+        #lite[CSSHOOK] = """.mytag { border: solid thin #000000; } \n
+        #                   .myothertag { font-weight:bold; )\n"""
+        styles.append(self.colors.get(CSSHOOK,''))
+        if not self.external:
+             styles.append('--></style>\n')
+        return ''.join(styles)
+
+    def _doCSSStart(self):
+        # Start of css/html 4.01 page
+        self.out.write('<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">\n')
+        self.out.write('<html><head><title>%s</title>\n'%(self.title))
+        self.out.write(self._getDocumentCreatedBy())
+        self.out.write('<meta http-equiv="Content-Type" \
+content="text/html;charset=iso-8859-1">\n')
+        self._doCSSStyleSheet()
+        self.out.write('</head>\n<body>\n')
+        # Write a little info at the top.
+        self._doPageHeader()
+        self.out.write(self.colors.get(CODESTART,'<pre class="py">\n'))
+        return
+
+    def _doCSSStyleSheet(self):
+        if not self.external:
+            # write an embedded style sheet
+            self.out.write(self._sendCSSStyle())
+        else:
+            # write a link to an external style sheet
+            self.out.write('<link rel="stylesheet" \
+href="pystyle.css" type="text/css">')
+        return
+
+    def _sendCSSText(self, toktype, toktext):
+        # This is a hack to 'fix' multi-line strings.
+        # Multi-line strings are treated as only one token 
+        # even though they can be several physical lines.
+        # That makes it hard to spot the start of a line,
+        # because at this level all we know about are tokens.
+        markupclass = MARKUPDICT.get(toktype, MARKUPDICT[NAME])
+        # if it is a LINENUMBER type then we can skip the rest
+        if toktext == self.LINESTART and toktype == LINENUMBER:
+            self.out.write('<span class="py_line">')
+            return
+        if toktext.count(self.LINENUMHOLDER):
+            # rip apart the string and separate it by line
+            # count lines and change all linenum token to line numbers
+            # also convert linestart and lineend tokens
+            # <linestart> <lnumstart> lnum <lnumend> text <lineend>
+            #################################################
+            newmarkup = MARKUPDICT.get(LINENUMBER, MARKUPDICT[NAME])
+            lstartspan = '<span class="%s">'%(newmarkup)
+            if toktype == LINENUMBER:
+                splittext = toktext.split(self.LINENUMHOLDER)
+            else:    
+                splittext = toktext.split(self.LINENUMHOLDER+' ')
+            store = []
+            # we have already seen the first linenumber token
+            # so we can skip the first one
+            store.append(splittext.pop(0))
+            for item in splittext:
+                num = self._getLineNumber()
+                if self.numberlinks:
+                    numstrip = num.strip()
+                    content= '<a name="%s" href="#%s">%s</a>' \
+                              %(numstrip,numstrip,num)
+                else:
+                    content = num
+                linenumber= ''.join([lstartspan,content,'</span>'])
+                store.append(linenumber+item)
+            toktext = ''.join(store)
+        if toktext.count(self.LINESTART):
+            # wraps the textline in a line span
+            # this adds a lot of kludges, is it really worth it?
+            store = []
+            parts = toktext.split(self.LINESTART+' ')
+            # handle the first part differently
+            # the whole token gets wraqpped in a span later on
+            first = parts.pop(0)
+            # place spans before the newline
+            pos = first.rfind('\n')
+            if pos != -1:
+                first=first[:pos]+'</span></span>'+first[pos:]
+            store.append(first)
+            #process the rest of the string
+            for item in parts:
+                #handle line numbers if present
+                if self.dolinenums:
+                    item = item.replace('</span>',
+                           '</span><span class="%s">'%(markupclass))
+                else:
+                    item = '<span class="%s">%s'%(markupclass,item)
+                # add endings for line and string tokens
+                pos = item.rfind('\n')
+                if pos != -1:
+                    item=item[:pos]+'</span></span>\n'
+                store.append(item)
+            # add start tags for lines
+            toktext = '<span class="py_line">'.join(store)
+        # Send text
+        if toktype != LINENUMBER:
+            if toktype == TEXT and self.textFlag == 'DIV':
+                startspan = '<div class="%s">'%(markupclass)
+                endspan = '</div>'
+            elif toktype == TEXT and self.textFlag == 'RAW': 
+                startspan,endspan = ('','')
+            else:
+                startspan = '<span class="%s">'%(markupclass)
+                endspan = '</span>'
+            self.out.write(''.join([startspan, toktext, endspan]))
+        else:
+            self.out.write(toktext)
+        return
+
+    def _doCSSHeader(self):
+        if self.header != '':
+            self.out.write('%s\n'%self.header)
+        else:
+            name = MARKUPDICT.get(NAME)
+            self.out.write('<div class="%s"># %s <br> \
+# %s</div><hr>\n'%(name, self.title, time.ctime()))
+
+    def _doCSSFooter(self):
+        # Optional
+        if self.footer != '':
+            self.out.write('%s\n'%self.footer)
+        else:
+            self.out.write('<hr><div class="%s"># %s <br> \
+# %s</div>\n'%(MARKUPDICT.get(NAME),self.title, time.ctime()))
+
+    def _doCSSEnd(self):
+        # End of css/html page
+        self.out.write(self.colors.get(CODEEND,'</pre>\n'))
+        # Write a little info at the bottom
+        self._doPageFooter()
+        self.out.write('</body></html>\n')
+        return
+
+    ################################################## XHTML markup functions
+
+    def _doXHTMLStart(self):
+        # XHTML is really just XML + HTML 4.01.
+        # We only need to change the page headers, 
+        # and a few tags to get valid XHTML.
+        # Start of xhtml page
+        self.out.write('<?xml version="1.0"?>\n \
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"\n \
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\n \
+<html xmlns="http://www.w3.org/1999/xhtml">\n')
+        self.out.write('<head><title>%s</title>\n'%(self.title))
+        self.out.write(self._getDocumentCreatedBy())
+        self.out.write('<meta http-equiv="Content-Type" \
+content="text/html;charset=iso-8859-1"/>\n')
+        self._doXHTMLStyleSheet()
+        self.out.write('</head>\n<body>\n')
+        # Write a little info at the top.
+        self._doPageHeader()
+        self.out.write(self.colors.get(CODESTART,'<pre class="py">\n'))
+        return
+
+    def _doXHTMLStyleSheet(self):
+        if not self.external:
+            # write an embedded style sheet
+            self.out.write(self._sendCSSStyle())
+        else:
+            # write a link to an external style sheet
+            self.out.write('<link rel="stylesheet" \
+href="pystyle.css" type="text/css"/>\n')
+        return
+
+    def _sendXHTMLText(self, toktype, toktext):
+        self._sendCSSText(toktype, toktext)
+
+    def _doXHTMLHeader(self):
+        # Optional
+        if self.header:
+            self.out.write('%s\n'%self.header)
+        else:
+            name = MARKUPDICT.get(NAME)
+            self.out.write('<div class="%s"># %s <br/> \
+# %s</div><hr/>\n '%(
+            name, self.title, time.ctime()))
+
+    def _doXHTMLFooter(self):
+        # Optional
+        if self.footer:
+            self.out.write('%s\n'%self.footer)
+        else:
+            self.out.write('<hr/><div class="%s"># %s <br/> \
+# %s</div>\n'%(MARKUPDICT.get(NAME), self.title, time.ctime()))
+
+    def _doXHTMLEnd(self):
+        self._doCSSEnd()
+
+#############################################################################
+
+if __name__ == '__main__':
+    cli()
+
+#############################################################################
+# PySourceColor.py
+# 2004, 2005 M.E.Farmer Jr.
+# Python license
Index: /galaxy-central/eggs/WebError-0.8a-py2.6.egg/weberror/util/errorapp.py
===================================================================
--- /galaxy-central/eggs/WebError-0.8a-py2.6.egg/weberror/util/errorapp.py (revision 3)
+++ /galaxy-central/eggs/WebError-0.8a-py2.6.egg/weberror/util/errorapp.py (revision 3)
@@ -0,0 +1,16 @@
+"""
+This simple application creates errors
+"""
+
+def error_app(environ, start_response):
+    environ['errorapp.item'] = 1
+    raise_error()
+
+def raise_error():
+    if 1 == 1:
+        raise Exception('This is an exception')
+    else:
+        do_stuff()
+
+def make_error_app(global_conf):
+    return error_app
Index: /galaxy-central/eggs/WebError-0.8a-py2.6.egg/EGG-INFO/dependency_links.txt
===================================================================
--- /galaxy-central/eggs/WebError-0.8a-py2.6.egg/EGG-INFO/dependency_links.txt (revision 3)
+++ /galaxy-central/eggs/WebError-0.8a-py2.6.egg/EGG-INFO/dependency_links.txt (revision 3)
@@ -0,0 +1,1 @@
+
Index: /galaxy-central/eggs/WebError-0.8a-py2.6.egg/EGG-INFO/SOURCES.txt
===================================================================
--- /galaxy-central/eggs/WebError-0.8a-py2.6.egg/EGG-INFO/SOURCES.txt (revision 3)
+++ /galaxy-central/eggs/WebError-0.8a-py2.6.egg/EGG-INFO/SOURCES.txt (revision 3)
@@ -0,0 +1,48 @@
+.hgignore
+CHANGELOG
+LICENSE
+README
+scramble.py
+setup.cfg
+setup.py
+WebError.egg-info/._PKG-INFO
+WebError.egg-info/._SOURCES.txt
+WebError.egg-info/._dependency_links.txt
+WebError.egg-info/._entry_points.txt
+WebError.egg-info/._not-zip-safe
+WebError.egg-info/._paster_plugins.txt
+WebError.egg-info/._requires.txt
+WebError.egg-info/._top_level.txt
+WebError.egg-info/PKG-INFO
+WebError.egg-info/SOURCES.txt
+WebError.egg-info/dependency_links.txt
+WebError.egg-info/entry_points.txt
+WebError.egg-info/not-zip-safe
+WebError.egg-info/paster_plugins.txt
+WebError.egg-info/requires.txt
+WebError.egg-info/top_level.txt
+tests/__init__.py
+tests/evaldemo.py
+tests/test_error_middleware.py
+tests/test_formatter.py
+tests/test_reporter.py
+tests/reporter_output/.testdir
+weberror/__init__.py
+weberror/evalexception/__init__.py
+weberror/evalexception/error_template.html.tmpl
+weberror/evalexception/evalcontext.py
+weberror/evalexception/middleware.py
+weberror/evalexception/media/debug.js
+weberror/evalexception/media/jquery-1.2.1.min.js
+weberror/evalexception/media/minus.jpg
+weberror/evalexception/media/plus.jpg
+weberror/evalexception/media/traceback.css
+weberror/exceptions/__init__.py
+weberror/exceptions/collector.py
+weberror/exceptions/errormiddleware.py
+weberror/exceptions/formatter.py
+weberror/exceptions/reporter.py
+weberror/exceptions/serial_number_generator.py
+weberror/util/PySourceColor.py
+weberror/util/__init__.py
+weberror/util/errorapp.py
Index: /galaxy-central/eggs/WebError-0.8a-py2.6.egg/EGG-INFO/top_level.txt
===================================================================
--- /galaxy-central/eggs/WebError-0.8a-py2.6.egg/EGG-INFO/top_level.txt (revision 3)
+++ /galaxy-central/eggs/WebError-0.8a-py2.6.egg/EGG-INFO/top_level.txt (revision 3)
@@ -0,0 +1,1 @@
+weberror
Index: /galaxy-central/eggs/WebError-0.8a-py2.6.egg/EGG-INFO/PKG-INFO
===================================================================
--- /galaxy-central/eggs/WebError-0.8a-py2.6.egg/EGG-INFO/PKG-INFO (revision 3)
+++ /galaxy-central/eggs/WebError-0.8a-py2.6.egg/EGG-INFO/PKG-INFO (revision 3)
@@ -0,0 +1,21 @@
+Metadata-Version: 1.0
+Name: WebError
+Version: 0.8a
+Summary: Web Error handling and exception catching
+Home-page: UNKNOWN
+Author: Ben Bangert, Ian Bicking, Mark Ramm
+Author-email: UNKNOWN
+License: MIT
+Description: UNKNOWN
+Keywords: wsgi
+Platform: UNKNOWN
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: MIT License
+Classifier: Programming Language :: Python
+Classifier: Topic :: Internet :: WWW/HTTP
+Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
+Classifier: Topic :: Software Development :: Libraries :: Python Modules
+Classifier: Topic :: Internet :: WWW/HTTP :: WSGI
+Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application
+Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Middleware
Index: /galaxy-central/eggs/WebError-0.8a-py2.6.egg/EGG-INFO/entry_points.txt
===================================================================
--- /galaxy-central/eggs/WebError-0.8a-py2.6.egg/EGG-INFO/entry_points.txt (revision 3)
+++ /galaxy-central/eggs/WebError-0.8a-py2.6.egg/EGG-INFO/entry_points.txt (revision 3)
@@ -0,0 +1,6 @@
+
+      [paste.filter_app_factory]
+      error_catcher = weberror.exceptions.errormiddleware:make_error_middleware
+      cgitb = weberror.cgitb_catcher:make_cgitb_middleware
+      evalerror = weberror.evalexception.middleware:make_eval_exception
+      
Index: /galaxy-central/eggs/WebError-0.8a-py2.6.egg/EGG-INFO/not-zip-safe
===================================================================
--- /galaxy-central/eggs/WebError-0.8a-py2.6.egg/EGG-INFO/not-zip-safe (revision 3)
+++ /galaxy-central/eggs/WebError-0.8a-py2.6.egg/EGG-INFO/not-zip-safe (revision 3)
@@ -0,0 +1,1 @@
+
Index: /galaxy-central/eggs/WebError-0.8a-py2.6.egg/EGG-INFO/requires.txt
===================================================================
--- /galaxy-central/eggs/WebError-0.8a-py2.6.egg/EGG-INFO/requires.txt (revision 3)
+++ /galaxy-central/eggs/WebError-0.8a-py2.6.egg/EGG-INFO/requires.txt (revision 3)
@@ -0,0 +1,3 @@
+WebOb
+wsgiref
+Tempita
Index: /galaxy-central/eggs/WebError-0.8a-py2.6.egg/EGG-INFO/paster_plugins.txt
===================================================================
--- /galaxy-central/eggs/WebError-0.8a-py2.6.egg/EGG-INFO/paster_plugins.txt (revision 3)
+++ /galaxy-central/eggs/WebError-0.8a-py2.6.egg/EGG-INFO/paster_plugins.txt (revision 3)
@@ -0,0 +1,1 @@
+PasteScript
Index: /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/feedgenerator.py
===================================================================
--- /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/feedgenerator.py (revision 3)
+++ /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/feedgenerator.py (revision 3)
@@ -0,0 +1,298 @@
+# Copyright (c) 2005, the Lawrence Journal-World
+# All rights reserved.
+# 
+# Redistribution and use in source and binary forms, with or without modification,
+# are permitted provided that the following conditions are met:
+# 
+#     1. Redistributions of source code must retain the above copyright notice, 
+#        this list of conditions and the following disclaimer.
+#     
+#     2. Redistributions in binary form must reproduce the above copyright 
+#        notice, this list of conditions and the following disclaimer in the
+#        documentation and/or other materials provided with the distribution.
+# 
+#     3. Neither the name of Django nor the names of its contributors may be used
+#        to endorse or promote products derived from this software without
+#        specific prior written permission.
+# 
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# LAST SYNCED WITH DJANGO SOURCE - JULY 12th, 2006 - DJANGO REVISION 3143
+# http://code.djangoproject.com/log/django/trunk/django/utils/feedgenerator.py
+"""Syndication feed generation library -- used for generating RSS, etc.
+
+Sample usage:
+
+>>> feed = feedgenerator.Rss201rev2Feed(
+...     title=u"Poynter E-Media Tidbits",
+...     link=u"http://www.poynter.org/column.asp?id=31",
+...     description=u"A group weblog by the sharpest minds in online media/journalism/publishing.",
+...     language=u"en",
+... )
+>>> feed.add_item(title="Hello", link=u"http://www.holovaty.com/test/", description="Testing.")
+>>> fp = open('test.rss', 'w')
+>>> feed.write(fp, 'utf-8')
+>>> fp.close()
+
+For definitions of the different versions of RSS, see:
+http://diveintomark.org/archives/2004/02/04/incompatible-rss
+
+"""
+
+from util import SimplerXMLGenerator
+import datetime, re, time
+import email.Utils
+from xml.dom import minidom
+from xml.parsers.expat import ExpatError
+
+def rfc2822_date(date):
+    return email.Utils.formatdate(time.mktime(date.timetuple()))
+
+def rfc3339_date(date):
+    return date.strftime('%Y-%m-%dT%H:%M:%SZ')
+
+def get_tag_uri(url, date):
+    """Creates a TagURI. See http://diveintomark.org/archives/2004/05/28/howto-atom-id"""
+    tag = re.sub('^http://', '', url)
+    if date is not None:
+        tag = re.sub('/', ',%s:/' % date.strftime('%Y-%m-%d'), tag, 1)
+    tag = re.sub('#', '/', tag)
+    return 'tag:' + tag
+
+class SyndicationFeed(object):
+    """Base class for all syndication feeds. Subclasses should provide write()"""
+    def __init__(self, title, link, description, language=None, author_email=None,
+            author_name=None, author_link=None, subtitle=None, categories=None,
+            feed_url=None):
+        self.feed = {
+            'title': title,
+            'link': link,
+            'description': description,
+            'language': language,
+            'author_email': author_email,
+            'author_name': author_name,
+            'author_link': author_link,
+            'subtitle': subtitle,
+            'categories': categories or (),
+            'feed_url': feed_url,
+        }
+        self.items = []
+
+    def add_item(self, title, link, description, author_email=None,
+        author_name=None, author_link=None, pubdate=None, comments=None,
+        unique_id=None, enclosure=None, categories=()):
+        """Adds an item to the feed. 
+        
+        All args are expected to be Python Unicode
+        objects except pubdate, which is a datetime.datetime object, and
+        enclosure, which is an instance of the Enclosure class.
+        
+        """
+        self.items.append({
+            'title': title,
+            'link': link,
+            'description': description,
+            'author_email': author_email,
+            'author_name': author_name,
+            'author_link': author_link,
+            'pubdate': pubdate,
+            'comments': comments,
+            'unique_id': unique_id,
+            'enclosure': enclosure,
+            'categories': categories or (),
+        })
+
+    def num_items(self):
+        return len(self.items)
+
+    def write(self, outfile, encoding):
+        """Outputs the feed in the given encoding to outfile, which is a file-like
+        object. 
+        
+        Subclasses should override this.
+        
+        """
+        raise NotImplementedError
+
+    def writeString(self, encoding):
+        """Returns the feed in the given encoding as a string."""
+        from StringIO import StringIO
+        s = StringIO()
+        self.write(s, encoding)
+        return s.getvalue()
+
+    def latest_post_date(self):
+        """Returns the latest item's pubdate. 
+        
+        If none of them have a pubdate, this returns the current date/time.
+        
+        """
+        updates = [i['pubdate'] for i in self.items if i['pubdate'] is not None]
+        if len(updates) > 0:
+            updates.sort()
+            return updates[-1]
+        else:
+            return datetime.datetime.now()
+
+class Enclosure(object):
+    """Represents an RSS enclosure"""
+    def __init__(self, url, length, mime_type):
+        "All args are expected to be Python Unicode objects"
+        self.url, self.length, self.mime_type = url, length, mime_type
+
+class RssFeed(SyndicationFeed):
+    mime_type = 'application/rss+xml'
+    def write(self, outfile, encoding):
+        handler = SimplerXMLGenerator(outfile, encoding)
+        handler.startDocument()
+        handler.startElement(u"rss", {u"version": self._version})
+        handler.startElement(u"channel", {})
+        handler.addQuickElement(u"title", self.feed['title'])
+        handler.addQuickElement(u"link", self.feed['link'])
+        handler.addQuickElement(u"description", self.feed['description'])
+        if self.feed['language'] is not None:
+            handler.addQuickElement(u"language", self.feed['language'])
+        for cat in self.feed['categories']:
+            handler.addQuickElement(u"category", cat)
+        self.write_items(handler)
+        self.endChannelElement(handler)
+        handler.endElement(u"rss")
+
+    def endChannelElement(self, handler):
+        handler.endElement(u"channel")
+
+class RssUserland091Feed(RssFeed):
+    _version = u"0.91"
+    def write_items(self, handler):
+        for item in self.items:
+            handler.startElement(u"item", {})
+            handler.addQuickElement(u"title", item['title'])
+            handler.addQuickElement(u"link", item['link'])
+            if item['description'] is not None:
+                handler.addQuickElement(u"description", item['description'])
+            handler.endElement(u"item")
+
+class Rss201rev2Feed(RssFeed):
+    # Spec: http://blogs.law.harvard.edu/tech/rss
+    _version = u"2.0"
+    def write_items(self, handler):
+        for item in self.items:
+            handler.startElement(u"item", {})
+            handler.addQuickElement(u"title", item['title'])
+            handler.addQuickElement(u"link", item['link'])
+            if item['description'] is not None:
+                handler.addQuickElement(u"description", item['description'])
+
+            # Author information.
+            if item["author_name"] and item["author_email"]:
+                handler.addQuickElement(u"author", "%s (%s)" % \
+                    (item['author_email'], item['author_name']))
+            elif item["author_email"]:
+                handler.addQuickElement(u"author", item["author_email"])
+
+            if item['pubdate'] is not None:
+                handler.addQuickElement(u"pubDate", rfc2822_date(item['pubdate']).decode('ascii'))
+            if item['comments'] is not None:
+                handler.addQuickElement(u"comments", item['comments'])
+            if item['unique_id'] is not None:
+                handler.addQuickElement(u"guid", item['unique_id'])
+
+            # Enclosure.
+            if item['enclosure'] is not None:
+                handler.addQuickElement(u"enclosure", '',
+                    {u"url": item['enclosure'].url, u"length": item['enclosure'].length,
+                        u"type": item['enclosure'].mime_type})
+
+            # Categories.
+            for cat in item['categories']:
+                handler.addQuickElement(u"category", cat)
+
+            handler.endElement(u"item")
+
+class Atom1Feed(SyndicationFeed):
+    # Spec: http://atompub.org/2005/07/11/draft-ietf-atompub-format-10.html
+    mime_type = 'application/atom+xml'
+    ns = u"http://www.w3.org/2005/Atom"
+    def write(self, outfile, encoding):
+        handler = SimplerXMLGenerator(outfile, encoding)
+        handler.startDocument()
+        if self.feed['language'] is not None:
+            handler.startElement(u"feed", {u"xmlns": self.ns, u"xml:lang": self.feed['language']})
+        else:
+            handler.startElement(u"feed", {u"xmlns": self.ns})
+        handler.addQuickElement(u"title", self.feed['title'])
+        handler.addQuickElement(u"link", "", {u"rel": u"alternate", u"href": self.feed['link']})
+        if self.feed['feed_url'] is not None:
+            handler.addQuickElement(u"link", "", {u"rel": u"self", u"href": self.feed['feed_url']})
+        handler.addQuickElement(u"id", self.feed['link'])
+        handler.addQuickElement(u"updated", rfc3339_date(self.latest_post_date()).decode('ascii'))
+        if self.feed['author_name'] is not None:
+            handler.startElement(u"author", {})
+            handler.addQuickElement(u"name", self.feed['author_name'])
+            if self.feed['author_email'] is not None:
+                handler.addQuickElement(u"email", self.feed['author_email'])
+            if self.feed['author_link'] is not None:
+                handler.addQuickElement(u"uri", self.feed['author_link'])
+            handler.endElement(u"author")
+        if self.feed['subtitle'] is not None:
+            handler.addQuickElement(u"subtitle", self.feed['subtitle'])
+        for cat in self.feed['categories']:
+            handler.addQuickElement(u"category", "", {u"term": cat})
+        self.write_items(handler)
+        handler.endElement(u"feed")
+
+    def write_items(self, handler):
+        for item in self.items:
+            handler.startElement(u"entry", {})
+            handler.addQuickElement(u"title", item['title'])
+            handler.addQuickElement(u"link", u"", {u"href": item['link'], u"rel": u"alternate"})
+            if item['pubdate'] is not None:
+                handler.addQuickElement(u"updated", rfc3339_date(item['pubdate']).decode('ascii'))
+
+            # Author information.
+            if item['author_name'] is not None:
+                handler.startElement(u"author", {})
+                handler.addQuickElement(u"name", item['author_name'])
+                if item['author_email'] is not None:
+                    handler.addQuickElement(u"email", item['author_email'])
+                if item['author_link'] is not None:
+                    handler.addQuickElement(u"uri", item['author_link'])
+                handler.endElement(u"author")
+
+            # Unique ID.
+            if item['unique_id'] is not None:
+                unique_id = item['unique_id']
+            else:
+                unique_id = get_tag_uri(item['link'], item['pubdate'])
+            handler.addQuickElement(u"id", unique_id)
+
+            # Summary.
+            if item['description'] is not None:
+                handler.addQuickElement(u"summary", item['description'], {u"type": u"html"})
+
+            # Enclosure.
+            if item['enclosure'] is not None:
+                handler.addQuickElement(u"link", '',
+                    {u"rel": u"enclosure",
+                     u"href": item['enclosure'].url,
+                     u"length": item['enclosure'].length,
+                     u"type": item['enclosure'].mime_type})
+
+            # Categories:
+            for cat in item['categories']:
+                handler.addQuickElement(u"category", u"", {u"term": cat})
+
+            handler.endElement(u"entry")
+
+# This isolates the decision of what the system default is, so calling code can
+# do "feedgenerator.DefaultFeed" instead of "feedgenerator.Rss201rev2Feed".
+DefaultFeed = Rss201rev2Feed
Index: /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/hinclude.py
===================================================================
--- /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/hinclude.py (revision 3)
+++ /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/hinclude.py (revision 3)
@@ -0,0 +1,23 @@
+"""
+``Tired of regenerating HTML pages from templates? Want more from Web caches?
+HInclude makes one thing very easy; including other bits of HTML into your Web
+page, using the browser.``
+
+http://www.mnot.net/javascript/hinclude.html
+"""
+
+from webhelpers.util import html_escape
+from webhelpers.rails.tags import content_tag
+
+def include(url, default=''):
+    """Do a client-side include of ``url``, defaulting to ``default```
+        >>> hinclude.include("/foo","hello")
+        '<hx:include src="/foo">hello</hx:include>'
+    """
+    
+    if callable(url):
+        url = url()
+    else:
+        url = html_escape(url)
+
+    return content_tag("hx:include", content=default, src=url)
Index: /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/util.py
===================================================================
--- /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/util.py (revision 3)
+++ /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/util.py (revision 3)
@@ -0,0 +1,47 @@
+"""Utility functions used by various web helpers"""
+import cgi
+from xml.sax.saxutils import XMLGenerator
+
+def html_escape(s):
+    """HTML-escape a string or object
+    
+    This converts any non-string objects passed into it to strings
+    (actually, using ``unicode()``).  All values returned are
+    non-unicode strings (using ``&#num;`` entities for all non-ASCII
+    characters).
+    
+    None is treated specially, and returns the empty string.
+    """
+    if s is None:
+        return ''
+    if not isinstance(s, basestring):
+        if hasattr(s, '__unicode__'):
+            s = unicode(s)
+        else:
+            s = str(s)
+    s = cgi.escape(s, True)
+    if isinstance(s, unicode):
+        s = s.encode('ascii', 'xmlcharrefreplace')
+    return s
+
+class Partial(object):
+    """partial object, which will be in Python 2.5"""
+    def __init__(*args, **kw):
+        self = args[0]
+        self.fn, self.args, self.kw = (args[1], args[2:], kw)
+    
+    def __call__(self, *args, **kw):
+        if kw and self.kw:
+            d = self.kw.copy()
+            d.update(kw)
+        else:
+            d = kw or self.kw
+        return self.fn(*(self.args + args), **d)
+
+class SimplerXMLGenerator(XMLGenerator):
+    def addQuickElement(self, name, contents=None, attrs={}):
+        """Convenience method for adding an element with no children"""
+        self.startElement(name, attrs)
+        if contents is not None:
+            self.characters(contents)
+        self.endElement(name)
Index: /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/htmlgen.py
===================================================================
--- /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/htmlgen.py (revision 3)
+++ /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/htmlgen.py (revision 3)
@@ -0,0 +1,159 @@
+"""
+htmlgen
+
+Kind of like HTMLGen, only much simpler.  Like stan, only not.  The
+only important symbol that is exported is ``html``.
+
+You create tags with attribute access.  I.e., the ``A`` anchor tag is
+``html.a``.  The attributes of the HTML tag are done with keyword
+arguments.  The contents of the tag are the non-keyword arguments
+(concatenated).  You can also use the special ``c`` keyword, passing a
+list, tuple, or single tag, and it will make up the contents (this is
+useful because keywords have to come after all non-keyword arguments,
+which is non-intuitive).
+
+If the value of an attribute is None, then no attribute will be
+inserted.  So::
+
+    >>> html.a(href='http://www.yahoo.com', name=None, c='Click Here')
+    '<a href=\"http://www.yahoo.com\">Click Here</a>'
+
+If a non-string is passed in, then ``webhelpers.escapes.html_escape``
+is called on the value.
+
+``html`` can also be called, and it will concatenate the string
+representations of its arguments.
+
+``html.comment`` will generate an HTML comment, like
+``html.comment('comment text', 'and some more text')`` -- note that it
+cannot take keyword arguments (because they wouldn't mean anything).
+
+For cases where you cannot use a name (e.g., for the ``class``
+attribute) you can append an underscore to the name, like
+``html.span(class_='alert')``.
+
+Examples::
+
+    >>> print html.html(
+    ...    html.head(html.title(\"Page Title\")),
+    ...    html.body(
+    ...    bgcolor='#000066',
+    ...    text='#ffffff',
+    ...    c=[html.h1('Page Title'),
+    ...       html.p('Hello world!')],
+    ...    ))
+    <html>
+    <head>
+    <title>Page Title</title>
+    </head>
+    <body text=\"#ffffff\" bgcolor=\"#000066\">
+    <h1>Page Title</h1><p>
+    Hello world!
+    </p>
+    </body>
+    </html>
+    >>> html.a(href='#top', c='return to top')
+    '<a href=\"#top\">return to top</a>'
+    >>> 1.4
+    1.4
+
+.. note::
+
+   Should this return objects instead of strings?  That would allow
+   things like ``html.a(href='foo')('title')``.  Also, the objects
+   could have a method that shows that they are trully HTML, and thus
+   should not be further quoted.
+
+   However, in some contexts you can't use objects, you need actual
+   strings.  But maybe we can just make sure those contexts don't
+   happen in webhelpers.
+"""
+
+from util import html_escape
+
+__all__ = ['html']
+
+def strify(s):
+    if s is None:
+        return ''
+    if not isinstance(s, basestring):
+        s = unicode(s)
+    if isinstance(s, unicode):
+        s = s.encode('ascii', 'xmlcharrefreplace')
+    return s
+
+class UnfinishedComment:
+
+    def __call__(self, *args):
+        return '<!--%s-->' % '\n'.join(map(strify, args))
+
+class Base:
+
+    comment = UnfinishedComment()
+
+    def __getattr__(self, attr):
+        if attr.startswith('__'):
+            raise AttributeError
+        attr = attr.lower()
+        return UnfinishedTag(attr)
+
+    def __call__(self, *args):
+        return ''.join(map(str, args))
+
+    def escape(self, *args):
+        return ''.join(map(html_escape, args))
+
+    def str(self, arg):
+        return strify(arg)
+
+class UnfinishedTag:
+
+    def __init__(self, tag):
+        self._tag = tag
+
+    def __call__(self, *args, **kw):
+        return tag(self._tag, *args, **kw)
+
+    def __str__(self):
+        if self._tag in empty_tags:
+            return '<%s />' % self._tag
+        else:
+            return '<%s></%s>' % (self._tag, self._tag)
+
+def tag(tag, *args, **kw):
+    if kw.has_key("c"):
+        if args:
+            raise TypeError(
+                "The special 'c' keyword argument cannot be used in "
+                "conjunction with non-keyword arguments")
+        args = kw["c"]
+        del kw["c"]
+    attrargs = []
+    for attr, value in kw.items():
+        if value is None:
+            continue
+        if attr.endswith('_'):
+            attr = attr[:-1]
+        attrargs.append(' %s="%s"' % (attr, html_escape(value)))
+    if not args and tag in empty_tags:
+        return '<%s%s />' % (tag, ''.join(attrargs))
+    else:
+        return '<%s%s>%s</%s>' % (
+            tag, ''.join(attrargs), ''.join(map(strify, args)),
+            tag)
+
+# Taken from: http://www.w3.org/TR/REC-html40/index/elements.html
+empty_tags = {}
+for _t in ("area base basefont br col frame hr img input isindex "
+           "link meta param".split()):
+    empty_tags[_t] = None
+
+block_level_tags = {}
+for _t in ("applet blockquote body br dd div dl dt fieldset "
+           "form frameset head hr html iframe map menu noframes "
+           "noscript object ol optgroup p param script select "
+           "table tbody tfoot thead tr ul var"):
+    block_level_tags[_t] = None
+
+html = Base()
+
Index: /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/textile.py
===================================================================
--- /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/textile.py (revision 3)
+++ /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/textile.py (revision 3)
@@ -0,0 +1,2873 @@
+#!/usr/bin/env python
+# _*_ coding: latin1 _*_
+
+"""This is Textile
+A Humane Web Text Generator
+
+TODO:
+* Make it work with Python 2.1.
+* Make it work with Python 1.5.2? Or that's too optimistic?
+
+---
+To get an overview of all PyTextile's features, simply
+type 'tell me about textile.' in a single line.
+"""
+
+__authors__ = ["Roberto A. F. De Almeida (roberto@dealmeida.net)",
+               "Mark Pilgrim (f8dy@diveintomark.org)"]
+__version__ = "2.0.10"
+__date__ = "2004/10/06"
+__copyright__ = """
+Copyright (c) 2004, Roberto A. F. De Almeida, http://dealmeida.net/
+Copyright (c) 2003, Mark Pilgrim, http://diveintomark.org/
+All rights reserved.
+
+Original PHP version:
+Version 1.0
+21 Feb, 2003
+
+Copyright (c) 2003, Dean Allen, www.textism.com
+All rights reserved.
+
+Parts of the documentation and some of the regular expressions are (c) Brad
+Choate, http://bradchoate.com/. Thanks, Brad!
+"""
+__license__ = """
+Redistribution and use in source and binary forms, with or without 
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, 
+  this list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+  this list of conditions and the following disclaimer in the documentation
+  and/or other materials provided with the distribution.
+
+* Neither the name Textile nor the names of its contributors may be used to
+  endorse or promote products derived from this software without specific
+  prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+"""
+__history__ = """
+1.0 - 2003/03/19 - MAP - initial release
+1.01 - 2003/03/19 - MAP - don't strip whitespace within <pre> tags;
+  map high-bit ASCII to HTML numeric entities
+1.02 - 2003/03/19 - MAP - changed hyperlink qtag expression to only
+  match valid URL characters (per RFC 2396); fixed preg_replace to
+  not match across line breaks (solves lots of problems with
+  mistakenly matching overlapping inline markup); fixed whitespace
+  stripping to only strip whitespace from beginning and end of lines,
+  not immediately before and after HTML tags.
+1.03 - 2003/03/20 - MAP - changed hyperlink qtag again to more
+  closely match original Textile (fixes problems with links
+  immediately followed by punctuation -- somewhere Dean is
+  grinning right now); handle curly apostrophe with "ve"
+  contraction; clean up empty titles at end.
+1.04 - 2003/03/23 - MAP - lstrip input to deal with extra spaces at
+  beginning of first line; tweaked list loop to handle consecutive lists
+1.1 - 2003/06/06 - MAP - created initial test suite for links and images,
+  and fixed a bunch of related bugs to pass them
+1.11 - 2003/07/20 - CL - don't demoronise unicode strings; handle
+  "they're" properly
+1.12 - 2003/07/23 - GW - print debug messages to stderr; handle bq(cite).
+1.13 - 2003/07/23 - MAP - wrap bq. text in <p>...</p>
+2 - 2004/03/26 - RAFA - rewritten from (almost) scratch to include
+  all features from Textile 2 and a little bit more.
+2.0.1 - 2004/04/02 - RAFA - Fixed validating function that uses uTidyLib.
+2.0.2 - 2004/04/02 - RAFA - Fixed problem with caps letters in URLs.
+2.0.3 - 2004/04/19 - RAFA - Multiple classes are allowed, thanks to Dave
+  Anderson. The "lang" attribute is now removed from <code>, to be valid
+  XHTML. Fixed <span class="caps">UCAS</span> problem.
+2.0.4 - 2004/05/20 - RAFA, CLB - Added inline formatting to table cells.
+  Curt Bergmann fixed a bug with the colspan formatting. Added Amazon
+  Associated id.
+2.0.5 - 2004/06/01 - CL - Applied patch from Chris Lawrence to (1) fix
+  that Amazon associates ID was being added to all search URIs, (2)
+  customize the Amazon site used with the AMAZON variable, and (3) added
+  an "isbn" URI type that links directly to an Amazon product by ISBN or
+  Amazon ASIN.
+2.0.6 - 2004/06/02 - RAFA - Fixed CAPS problem, again. I hope this is
+  the last time.
+2.0.7 - 2004/06/04 - RAFA, MW - Fixed bullet macro, thanks to Adam
+  Messinger. Added patch from Michal Wallace changing {}.pop() for
+  compatibility with Python 2.2.x.
+2.0.8 - 2004/06/25 - RAFA - Strip tags when adding the content from a
+  footnote to the reference link. Escaped '<' and '>' in the self-
+  generated documentation.
+2.0.9 - 2004/10/04 - RAFA - In images, if ALT is not defined, add an
+  empty attribute. Added "LaTeX" style open/close quotes. Fixed a bug 
+  where the acronym definition was being formatted with inline rules. 
+  Handle "broken" lines correctly, removing the <br /> from inside
+  split HTML tags.
+2.0.10 - 2004/10/06 - RAFA, LO - Escape all non-escaped ampersands.
+  Applied "trivial patch" from Ludvig Omholt to remove newline right
+  after the <pre> tag.
+"""
+
+# Set your encoding here.
+ENCODING = 'latin-1'
+
+# Output? Non-ASCII characters will be automatically
+# converted to XML entities if you choose ASCII.
+OUTPUT = 'ascii'
+
+# PyTextile can optionally validate the generated
+# XHTML code. We can use either mxTidy or uTidyLib.
+# You can change the default behaviour here.
+VALIDATE = 0
+
+# If you want h1. to be translated to something other
+# than <h1>, change this offset. You can also pass it
+# as an argument to textile().
+HEAD_OFFSET = 0
+
+# If you want to use itex2mml, specify the full path
+# to the binary here. You can download it from here:
+# http://golem.ph.utexas.edu/~distler/blog/files/itexToMML.tar.gz
+itex2mml = None
+#itex2mml = '/usr/local/bin/itex2MML'
+#itex2mml = '/usr/people/almeida/bin/itex2MML'
+
+# PyTextile can optionally sanitize the generated XHTML,
+# which is good for weblog comments or if you don't trust
+# yourself.
+SANITIZE = 0
+
+# Turn debug on?
+DEBUGLEVEL = 0
+
+# Amazon associate for links: "keywords":amazon
+# If you don't have one, please consider leaving mine here as
+# a small compensation for writing PyTextile. It's commented
+# off as default.
+#amazon_associate_id = 'bomtempo-21'
+amazon_associate_id = None 
+
+#AMAZON = 'www.amazon.co.uk'
+AMAZON = 'www.amazon.com'
+
+import re
+import sys
+import os
+import sgmllib
+import unicodedata
+
+
+def _in_tag(text, tag):
+    """Extracts text from inside a tag.
+
+    This function extracts the text from inside a given tag.
+    It's useful to get the text between <body></body> or
+    <pre></pre> when using the validators or the colorizer.
+    """
+    if text.count('<%s' % tag):
+        text = text.split('<%s' % tag, 1)[1]
+        if text.count('>'):
+            text = text.split('>', 1)[1]
+    if text.count('</%s' % tag):
+        text = text.split('</%s' % tag, 1)[0]
+
+    text = text.strip().replace('\r\n', '\n')
+
+    return text
+
+
+# If you want PyTextile to automatically colorize
+# your Python code, you need the htmlizer module
+# from Twisted. (You can just grab this file from
+# the distribution, it has no other dependencies.)
+try:
+    #from twisted.python import htmlizer
+    import htmlizer
+    from StringIO import StringIO
+
+    def _color(code):
+        """Colorizer Python code.
+
+        This function wraps a text string in a StringIO,
+        and passes it to the htmlizer function from
+        Twisted.
+        """
+        # Fix line continuations.
+        code = preg_replace(r' \\\n', ' \\\\\n', code)
+        
+        code_in  = StringIO(code)
+        code_out = StringIO()
+
+        htmlizer.filter(code_in, code_out)
+
+        # Remove <pre></pre> from input.
+        code = _in_tag(code_out.getvalue(), 'pre')
+
+        # Fix newlines.
+        code = code.replace('<span class="py-src-newline">\n</span>', '<span class="py-src-newline"></span>\n')
+
+        return code
+
+except ImportError:
+    htmlizer = None
+
+
+# PyTextile can optionally validate the generated
+# XHTML code using either mxTidy or uTidyLib.
+try:
+    # This is mxTidy.
+    from mx.Tidy import Tidy
+    
+    def _tidy1(text):
+        """mxTidy's XHTML validator.
+
+        This function is a wrapper to mxTidy's validator.
+        """
+        nerrors, nwarnings, text, errortext = Tidy.tidy(text, output_xhtml=1, numeric_entities=1, wrap=0)
+        return _in_tag(text, 'body')
+
+    _tidy = _tidy1
+
+except ImportError:
+    try:
+        # This is uTidyLib.
+        import tidy
+
+        def _tidy2(text):
+            """uTidyLib's XHTML validator.
+
+            This function is a wrapper to uTidyLib's validator.
+            """
+            text = tidy.parseString(text,  output_xhtml=1, add_xml_decl=0, indent=0, tidy_mark=0)
+            return _in_tag(str(text), 'body')
+
+        _tidy = _tidy2
+
+    except ImportError:
+        _tidy = None
+    
+
+# This is good for debugging.
+def _debug(s, level=1):
+    """Outputs debug information to sys.stderr.
+
+    This function outputs debug information if DEBUGLEVEL is
+    higher than a given treshold.
+    """
+    if DEBUGLEVEL >= level: print >> sys.stderr, s
+
+
+#############################
+# Useful regular expressions.
+parameters = {
+    # Horizontal alignment.
+    'align':    r'''(?:(?:<>|[<>=])                 # Either '<>', '<', '>' or '='
+                    (?![^\s]*(?:<>|[<>=])))         # Look-ahead to ensure it happens once
+                 ''',
+
+    # Horizontal padding.
+    'padding':  r'''(?:[\(\)]+)                     # Any number of '(' and/or ')'
+                 ''',
+
+    # Class and/or id.
+    'classid':  r'''(                               #
+                        (?:\(\#[\w]+\))             # (#id)
+                        |                           #
+                        (?:\((?:[\w]+(?:\s[\w]+)*)  #
+                            (?:\#[\w]+)?\))         # (class1 class2 ... classn#id) or (class1 class2 ... classn)
+                    )                               #
+                    (?![^\s]*(?:\([\w#]+\)))        # must happen once
+                 ''',
+           
+    # Language.
+    'lang':     r'''(?:\[[\w-]+\])                  # [lang]
+                    (?![^\s]*(?:\[.*?\]))           # must happen once
+                 ''',
+
+    # Style.
+    'style':    r'''(?:{[^\}]+})                    # {style}
+                    (?![^\s]*(?:{.*?}))             # must happen once
+                 ''',
+}
+
+res = {
+    # Punctuation.
+    'punct': r'''[\!"#\$%&'()\*\+,\-\./:;<=>\?@\[\\\]\^_`{\|}\~]''',
+        
+    # URL regular expression.
+    'url':   r'''(?=[a-zA-Z0-9./#])                         # Must start correctly
+                 (?:                                        # Match the leading part (proto://hostname, or just hostname)
+                     (?:ftp|https?|telnet|nntp)             #     protocol
+                     ://                                    #     ://
+                     (?:                                    #     Optional 'username:password@'
+                         \w+                                #         username
+                         (?::\w+)?                          #         optional :password
+                         @                                  #         @
+                     )?                                     # 
+                     [-\w]+(?:\.\w[-\w]*)+                  #     hostname (sub.example.com)
+                 |                                          #
+                     (?:mailto:)?                           #     Optional mailto:
+                     [-\+\w]+                               #     username
+                     \@                                     #     at
+                     [-\w]+(?:\.\w[-\w]*)+                  #     hostname
+                 |                                          #
+                     (?:[a-z0-9](?:[-a-z0-9]*[a-z0-9])?\.)+ #     domain without protocol
+                     (?:com\b                               #     TLD
+                     |  edu\b                               #
+                     |  biz\b                               #
+                     |  gov\b                               #
+                     |  in(?:t|fo)\b                        #     .int or .info
+                     |  mil\b                               #
+                     |  net\b                               #
+                     |  org\b                               #
+                     |  museum\b                            #
+                     |  aero\b                              #
+                     |  coop\b                              #
+                     |  name\b                              #
+                     |  pro\b                               #
+                     |  [a-z][a-z]\b                        #     two-letter country codes
+                     )                                      #
+                 )?                                         #
+                 (?::\d+)?                                  # Optional port number
+                 (?:                                        # Rest of the URL, optional
+                     /?                                     #     Start with '/'
+                     [^.!,?;:"'<>()\[\]{}\s\x7F-\xFF]*      #     Can't start with these
+                     (?:                                    #
+                         [.!,?;:]+                          #     One or more of these
+                         [^.!,?;:"'<>()\[\]{}\s\x7F-\xFF]+  #     Can't finish with these
+                         #'"                                #     # or ' or "
+                     )*                                     #
+                 )?                                         #
+              ''',
+
+
+    # Block attributes.
+    'battr': r'''(?P<parameters>                            # 
+                     (?: %(align)s                          # alignment
+                     |   %(classid)s                        # class and/or id
+                     |   %(padding)s                        # padding tags
+                     |   %(lang)s                           # [lang]
+                     |   %(style)s                          # {style}
+                     )+                                     #
+                 )?                                         #
+              ''' % parameters,
+
+    # (Un)ordered list attributes.
+    'olattr': r'''(?P<olparameters>                         # 
+                      (?: %(align)s                         # alignment
+                      | ((?:\(\#[\w]+\))                    # (#id)
+                          |                                 #
+                          (?:\((?:[\w]+(?:\s[\w]+)*)        #
+                            (?:\#[\w]+)?\))                 # (class1 class2 ... classn#id) or (class1 class2 ... classn)
+                      )                                     #
+                      |   %(padding)s                       # padding tags
+                      |   %(lang)s                          # [lang]
+                      |   %(style)s                         # {style}
+                      )+                                    #
+                  )?                                        #
+              ''' % parameters,
+
+    # List item attributes.
+    'liattr': r'''(?P<liparameters>                         # 
+                      (?: %(align)s                         # alignment
+                      |   %(classid)s                       # class and/or id
+                      |   %(padding)s                       # padding tags
+                      |   %(lang)s                          # [lang]
+                      |   %(style)s                         # {style}
+                      )+                                    #
+                  )?                                        #
+              ''' % parameters,
+
+    # Qtag attributes.
+    'qattr': r'''(?P<parameters>                            #
+                     (?: %(classid)s                        # class and/or id
+                     |   %(lang)s                           # [lang]
+                     |   %(style)s                          # {style}
+                     )+                                     #
+                 )?                                         #
+              ''' % parameters,
+
+    # Link attributes.
+    'lattr': r'''(?P<parameters>                            # Links attributes
+                     (?: %(align)s                          # alignment
+                     |   %(classid)s                        # class and/or id
+                     |   %(lang)s                           # [lang]
+                     |   %(style)s                          # {style}
+                     )+                                     #
+                 )?                                         #
+              ''' % parameters,
+
+    # Image attributes.
+    'iattr': r'''(?P<parameters>                            #
+                     (?:                                    #
+                     (?: [<>]+                              # horizontal alignment tags
+                         (?![^\s]*(?:[<>])))                #     (must happen once)
+                     |                                      # 
+                     (?: [\-\^~]+                           # vertical alignment tags
+                         (?![^\s]*(?:[\-\^~])))             #     (must happen once)
+                     | %(classid)s                          # class and/or id
+                     | %(padding)s                          # padding tags
+                     | %(style)s                            # {style}
+                     )+                                     #
+                 )?                                         #
+              ''' % parameters,
+
+    # Resize attributes.
+    'resize': r'''(?:                                       #
+                      (?:([\d]+%?)x([\d]+%?))               # 20x10
+                      |                                     #
+                      (?:                                   # or
+                          (?:([\d]+)%?w\s([\d]+)%?h)        #     10h 20w
+                          |                                 #     or
+                          (?:([\d]+)%?h\s([\d]+)%?w)        #     20w 10h 
+                      )                                     #
+                  )?                                        #
+               ''',
+
+    # Table attributes.
+    'tattr': r'''(?P<parameters>                            #
+                     (?:                                    #
+                     (?: [\^~]                              # vertical alignment
+                         (?![^\s]*(?:[\^~])))               #     (must happen once)
+                     |   %(align)s                          # alignment
+                     |   %(lang)s                           # [lang]
+                     |   %(style)s                          # {style}
+                     |   %(classid)s                        # class and/or id
+                     |   %(padding)s                        # padding
+                     |   _                                  # is this a header row/cell?
+                     |   \\\d+                              # colspan
+                     |   /\d+                               # rowspan
+                     )+                                     #
+                 )?                                         #
+              ''' % parameters,
+}
+
+
+def preg_replace(pattern, replacement, text):
+    """Alternative re.sub that handles empty groups.
+
+    This acts like re.sub, except it replaces empty groups with ''
+    instead of raising an exception.
+    """
+
+    def replacement_func(matchobj):
+        counter = 1
+        rc = replacement
+        _debug(matchobj.groups())
+        for matchitem in matchobj.groups():
+            if not matchitem:
+                matchitem = ''
+
+            rc = rc.replace(r'\%s' % counter, matchitem)
+            counter += 1
+
+        return rc
+        
+    p = re.compile(pattern)
+    _debug(pattern)
+
+    return p.sub(replacement_func, text)
+
+
+def html_replace(pattern, replacement, text):
+    """Replacement outside HTML tags.
+
+    Does a preg_replace only outside HTML tags.
+    """
+    # If there is no html, do a simple search and replace.
+    if not re.search(r'''<.*>''', text):
+        return preg_replace(pattern, replacement, text)
+
+    else:
+        lines = []
+        # Else split the text into an array at <>.
+        for line in re.split('(<.*?>)', text):
+            if not re.match('<.*?>', line):
+                line = preg_replace(pattern, replacement, line)
+
+            lines.append(line)
+
+        return ''.join(lines)
+
+
+# PyTextile can optionally sanitize the generated XHTML,
+# which is good for weblog comments. This code is from
+# Mark Pilgrim's feedparser.
+class _BaseHTMLProcessor(sgmllib.SGMLParser):
+    elements_no_end_tag = ['area', 'base', 'basefont', 'br', 'col', 'frame', 'hr',
+      'img', 'input', 'isindex', 'link', 'meta', 'param']
+    
+    def __init__(self):
+        sgmllib.SGMLParser.__init__(self)
+    
+    def reset(self):
+        self.pieces = []
+        sgmllib.SGMLParser.reset(self)
+
+    def normalize_attrs(self, attrs):
+        # utility method to be called by descendants
+        attrs = [(k.lower(), sgmllib.charref.sub(lambda m: unichr(int(m.groups()[0])), v).strip()) for k, v in attrs]
+        attrs = [(k, k in ('rel', 'type') and v.lower() or v) for k, v in attrs]
+        return attrs
+    
+    def unknown_starttag(self, tag, attrs):
+        # called for each start tag
+        # attrs is a list of (attr, value) tuples
+        # e.g. for <pre class="screen">, tag="pre", attrs=[("class", "screen")]
+        strattrs = "".join([' %s="%s"' % (key, value) for key, value in attrs])
+        if tag in self.elements_no_end_tag:
+            self.pieces.append("<%(tag)s%(strattrs)s />" % locals())
+        else:
+            self.pieces.append("<%(tag)s%(strattrs)s>" % locals())
+        
+    def unknown_endtag(self, tag):
+        # called for each end tag, e.g. for </pre>, tag will be "pre"
+        # Reconstruct the original end tag.
+        if tag not in self.elements_no_end_tag:
+            self.pieces.append("</%(tag)s>" % locals())
+
+    def handle_charref(self, ref):
+        # called for each character reference, e.g. for "&#160;", ref will be "160"
+        # Reconstruct the original character reference.
+        self.pieces.append("&#%(ref)s;" % locals())
+
+    def handle_entityref(self, ref):
+        # called for each entity reference, e.g. for "&copy;", ref will be "copy"
+        # Reconstruct the original entity reference.
+        self.pieces.append("&%(ref)s;" % locals())
+
+    def handle_data(self, text):
+        # called for each block of plain text, i.e. outside of any tag and
+        # not containing any character or entity references
+        # Store the original text verbatim.
+        self.pieces.append(text)
+
+    def handle_comment(self, text):
+        # called for each HTML comment, e.g. <!-- insert Javascript code here -->
+        # Reconstruct the original comment.
+        self.pieces.append("<!--%(text)s-->" % locals())
+
+    def handle_pi(self, text):
+        # called for each processing instruction, e.g. <?instruction>
+        # Reconstruct original processing instruction.
+        self.pieces.append("<?%(text)s>" % locals())
+
+    def handle_decl(self, text):
+        # called for the DOCTYPE, if present, e.g.
+        # <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+        #     "http://www.w3.org/TR/html4/loose.dtd">
+        # Reconstruct original DOCTYPE
+        self.pieces.append("<!%(text)s>" % locals())
+
+    def output(self):
+        """Return processed HTML as a single string"""
+        return "".join(self.pieces)
+
+
+class _HTMLSanitizer(_BaseHTMLProcessor):
+    acceptable_elements = ['a', 'abbr', 'acronym', 'address', 'area', 'b', 'big',
+      'blockquote', 'br', 'button', 'caption', 'center', 'cite', 'code', 'col',
+      'colgroup', 'dd', 'del', 'dfn', 'dir', 'div', 'dl', 'dt', 'em', 'fieldset',
+      'font', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'hr', 'i', 'img', 'input',
+      'ins', 'kbd', 'label', 'legend', 'li', 'map', 'menu', 'ol', 'optgroup',
+      'option', 'p', 'pre', 'q', 's', 'samp', 'select', 'small', 'span', 'strike',
+      'strong', 'sub', 'sup', 'table', 'tbody', 'td', 'textarea', 'tfoot', 'th',
+      'thead', 'tr', 'tt', 'u', 'ul', 'var']
+
+    acceptable_attributes = ['abbr', 'accept', 'accept-charset', 'accesskey',
+      'action', 'align', 'alt', 'axis', 'border', 'cellpadding', 'cellspacing',
+      'char', 'charoff', 'charset', 'checked', 'cite', 'class', 'clear', 'cols',
+      'colspan', 'color', 'compact', 'coords', 'datetime', 'dir', 'disabled',
+      'enctype', 'for', 'frame', 'headers', 'height', 'href', 'hreflang', 'hspace',
+      'id', 'ismap', 'label', 'lang', 'longdesc', 'maxlength', 'media', 'method',
+      'multiple', 'name', 'nohref', 'noshade', 'nowrap', 'prompt', 'readonly',
+      'rel', 'rev', 'rows', 'rowspan', 'rules', 'scope', 'selected', 'shape', 'size',
+      'span', 'src', 'start', 'summary', 'tabindex', 'target', 'title', 'type',
+      'usemap', 'valign', 'value', 'vspace', 'width']
+    
+    unacceptable_elements_with_end_tag = ['script', 'applet'] 
+    
+    # This if for MathML.
+    mathml_elements = ['math', 'mi', 'mn', 'mo', 'mrow', 'msup']
+    mathml_attributes = ['mode', 'xmlns']
+
+    acceptable_elements = acceptable_elements + mathml_elements
+    acceptable_attributes = acceptable_attributes + mathml_attributes
+                  
+    def reset(self):
+        _BaseHTMLProcessor.reset(self)
+        self.unacceptablestack = 0
+        
+    def unknown_starttag(self, tag, attrs):
+        if not tag in self.acceptable_elements:
+            if tag in self.unacceptable_elements_with_end_tag:
+                self.unacceptablestack += 1
+            return
+        attrs = self.normalize_attrs(attrs)
+        attrs = [(key, value) for key, value in attrs if key in self.acceptable_attributes]
+        _BaseHTMLProcessor.unknown_starttag(self, tag, attrs)
+
+    def unknown_endtag(self, tag):
+        if not tag in self.acceptable_elements:
+            if tag in self.unacceptable_elements_with_end_tag:
+                self.unacceptablestack -= 1
+            return
+        _BaseHTMLProcessor.unknown_endtag(self, tag)
+
+    def handle_pi(self, text):
+        pass
+
+    def handle_decl(self, text):
+        pass
+
+    def handle_data(self, text):
+        if not self.unacceptablestack:
+            _BaseHTMLProcessor.handle_data(self, text)
+
+
+class Textiler:
+    """Textile formatter.
+
+    This is the base class for the PyTextile text processor.
+    """
+    def __init__(self, text=''):
+        """Instantiate the class, passing the text to be formatted.
+            
+        Here we pre-process the text and collect all the link
+        lookups for later.
+        """
+        self.text = text
+
+        # Basic regular expressions.
+        self.res = res
+
+        # Smart searches.
+        self.searches = {}
+        self.searches['imdb']   = 'http://www.imdb.com/Find?for=%s'
+        self.searches['google'] = 'http://www.google.com/search?q=%s'
+        self.searches['python'] = 'http://www.python.org/doc/current/lib/module-%s.html'
+        if amazon_associate_id:
+            self.searches['isbn']   = ''.join(['http://', AMAZON, '/exec/obidos/ASIN/%s/', amazon_associate_id])
+            self.searches['amazon'] = ''.join(['http://', AMAZON, '/exec/obidos/external-search?mode=blended&keyword=%s&tag=', amazon_associate_id])
+        else:
+            self.searches['isbn']   = ''.join(['http://', AMAZON, '/exec/obidos/ASIN/%s'])
+            self.searches['amazon'] = ''.join(['http://', AMAZON, '/exec/obidos/external-search?mode=blended&keyword=%s'])
+
+        # These are the blocks we know.
+        self.signatures = [
+                           # Paragraph.
+                           (r'''^p                       # Paragraph signature
+                                %(battr)s                # Paragraph attributes
+                                (?P<dot>\.)              # .
+                                (?P<extend>\.)?          # Extended paragraph denoted by a second dot
+                                \s                       # whitespace
+                                (?P<text>.*)             # text
+                             ''' % self.res, self.paragraph),
+   
+                           # Pre-formatted text.
+                           (r'''^pre                     # Pre signature
+                                %(battr)s                # Pre attributes
+                                (?P<dot>\.)              # .
+                                (?P<extend>\.)?          # Extended pre denoted by a second dot
+                                \s                       # whitespace
+                                (?P<text>.*)             # text
+                             ''' % self.res, self.pre),
+   
+                           # Block code.
+                           (r'''^bc                      # Blockcode signature
+                                %(battr)s                # Blockcode attributes
+                                (?P<dot>\.)              # .
+                                (?P<extend>\.)?          # Extended blockcode denoted by a second dot
+                                \s                       # whitespace
+                                (?P<text>.*)             # text
+                             ''' % self.res, self.bc),
+   
+                           # Blockquote.
+                           (r'''^bq                      # Blockquote signature
+                                %(battr)s                # Blockquote attributes
+                                (?P<dot>\.)              # .
+                                (?P<extend>\.)?          # Extended blockquote denoted by a second dot
+                                (:(?P<cite>              # Optional cite attribute
+                                (                        #
+                                    %(url)s              #     URL
+                                |   "[\w]+(?:\s[\w]+)*"  #     "Name inside quotes"
+                                ))                       #
+                                )?                       #
+                                \s                       # whitespace
+                                (?P<text>.*)             # text
+                             ''' % self.res, self.blockquote),
+   
+                           # Header.
+                           (r'''^h                       # Header signature
+                                (?P<header>\d)           # Header number
+                                %(battr)s                # Header attributes
+                                (?P<dot>\.)              # .
+                                (?P<extend>\.)?          # Extended header denoted by a second dot
+                                \s                       # whitespace
+                                (?P<text>.*)             # text
+                             ''' % self.res, self.header),
+   
+                           # Footnote.
+                           (r'''^fn                      # Footnote signature
+                                (?P<footnote>[\d]+)      # Footnote number
+                                (?P<dot>\.)              # .
+                                (?P<extend>\.)?          # Extended footnote denoted by a second dot
+                                \s                       # whitespace
+                                (?P<text>.*)             # text
+                             ''', self.footnote),
+   
+                           # Definition list.
+                           (r'''^dl                      # Definition list signature
+                                %(battr)s                # Definition list attributes
+                                (?P<dot>\.)              # .
+                                (?P<extend>\.)?          # Extended definition list denoted by a second dot
+                                \s                       # whitespace
+                                (?P<text>.*)             # text
+                             ''' % self.res, self.dl),
+                           
+                           # Ordered list (attributes to first <li>).
+                           (r'''^%(olattr)s              # Ordered list attributes
+                                \#                       # Ordered list signature
+                                %(liattr)s               # List item attributes
+                                (?P<dot>\.)?             # .
+                                \s                       # whitespace
+                                (?P<text>.*)             # text
+                             ''' % self.res, self.ol),
+   
+                           # Unordered list (attributes to first <li>).
+                           (r'''^%(olattr)s              # Unrdered list attributes
+                                \*                       # Unordered list signature
+                                %(liattr)s               # Unordered list attributes
+                                (?P<dot>\.)?             # .
+                                \s                       # whitespace
+                                (?P<text>.*)             # text
+                             ''' % self.res, self.ul),
+   
+                           # Escaped text.
+                           (r'''^==?(?P<text>.*?)(==)?$  # Escaped text
+                             ''', self.escape),
+   
+                           (r'''^(?P<text><.*)$          # XHTML tag
+                             ''', self.escape),
+   
+                           # itex code.
+                           (r'''^(?P<text>               # itex code
+                                \\\[                     # starts with \[
+                                .*?                      # complicated mathematical equations go here
+                                \\\])                    # ends with \]
+                             ''', self.itex),
+   
+                           # Tables.
+                           (r'''^table                   # Table signature
+                                %(tattr)s                # Table attributes
+                                (?P<dot>\.)              # .
+                                (?P<extend>\.)?          # Extended blockcode denoted by a second dot
+                                \s                       # whitespace
+                                (?P<text>.*)             # text
+                             ''' % self.res, self.table),
+                           
+                           # Simple tables.
+                           (r'''^(?P<text>
+                                \|
+                                .*)
+                             ''', self.table),
+   
+                           # About.
+                           (r'''^(?P<text>tell\sme\sabout\stextile\.)$''', self.about),
+                          ]
+
+
+    def preprocess(self):
+        """Pre-processing of the text.
+
+        Remove whitespace, fix carriage returns.
+        """
+        # Remove whitespace.
+        self.text = self.text.strip()
+
+        # Zap carriage returns.
+        self.text = self.text.replace("\r\n", "\n")
+        self.text = self.text.replace("\r", "\n")
+
+        # Minor sanitizing.
+        self.text = self.sanitize(self.text)
+
+
+    def grab_links(self):
+        """Grab link lookups.
+
+        Check the text for link lookups, store them in a 
+        dictionary, and clean them up.
+        """
+        # Grab links like this: '[id]example.com'
+        links = {}
+        p = re.compile(r'''(?:^|\n)\[([\w]+?)\](%(url)s)(?:$|\n)''' % self.res, re.VERBOSE)
+        for key, link in p.findall(self.text):
+            links[key] = link
+
+        # And clear them from the text.
+        self.text = p.sub('', self.text)
+
+        return links
+
+
+    def process(self, head_offset=HEAD_OFFSET, validate=VALIDATE, sanitize=SANITIZE, output=OUTPUT, encoding=ENCODING):
+        """Process the text.
+
+        Here we actually process the text, splitting the text in
+        blocks and applying the corresponding function to each
+        one of them.
+        """
+        # Basic global changes.
+        self.preprocess()
+
+        # Grab lookup links and clean them from the text.
+        self._links = self.grab_links()
+
+        # Offset for the headers.
+        self.head_offset = head_offset
+
+        # Process each block.
+        self.blocks = self.split_text()
+
+        text = []
+        for [function, captures] in self.blocks:
+            text.append(function(**captures))
+
+        text = '\n\n'.join(text)
+
+        # Add titles to footnotes.
+        text = self.footnotes(text)
+
+        # Convert to desired output.
+        text = unicode(text, encoding)
+        text = text.encode(output, 'xmlcharrefreplace')
+
+        # Sanitize?
+        if sanitize:
+            p = _HTMLSanitizer()
+            p.feed(text)
+            text = p.output()
+
+        # Validate output.
+        if _tidy and validate:
+            text = _tidy(text)
+
+        return text
+
+
+    def sanitize(self, text):
+        """Fix single tags.
+
+        Fix tags like <img />, <br /> and <hr />.
+
+        ---
+        h1. Sanitizing
+
+        Textile can help you generate valid XHTML(eXtensible HyperText Markup Language).
+        It will fix any single tags that are not properly closed, like
+        @<img />@, @<br />@ and @<hr />@.
+
+        If you have "mx.Tidy":http://www.egenix.com/files/python/mxTidy.html
+        and/or "&micro;TidyLib":http://utidylib.sourceforge.net/ installed,
+        it also can optionally validade the generated code with these wrappers
+        to ensure 100% valid XHTML(eXtensible HyperText Markup Language).
+        """
+        # Fix single tags like <img /> and <br />.
+        text = preg_replace(r'''<(img|br|hr)(.*?)(?:\s*/?\s*)?>''', r'''<\1\2 />''', text)
+
+        # Remove ampersands.
+        text = preg_replace(r'''&(?!#?[xX]?(?:[0-9a-fA-F]+|\w{1,8});)''', r'''&amp;''', text)
+
+        return text
+
+
+    def split_text(self):
+        """Process the blocks from the text.
+
+        Split the blocks according to the signatures, join extended
+        blocks and associate each one of them with a function to
+        process them.
+
+        ---
+        h1. Blocks
+
+        Textile process your text by dividing it in blocks. Each block
+        is identified by a signature and separated from other blocks by
+        an empty line.
+
+        All signatures should end with a period followed by a space. A
+        header @<h1></h1>@ can be done this way:
+
+        pre. h1. This is a header 1.
+
+        Blocks may continue for multiple paragraphs of text. If you want
+        a block signature to stay "active", use two periods after the
+        signature instead of one. For example:
+
+        pre.. bq.. This is paragraph one of a block quote.
+
+        This is paragraph two of a block quote.
+
+        =p. Now we're back to a regular paragraph.
+
+        p. Becomes:
+        
+        pre.. <blockquote>
+        <p>This is paragraph one of a block quote.</p>
+
+        <p>This is paragraph two of a block quote.</p>
+        </blockquote>
+
+        <p>Now we&#8217;re back to a regular paragraph.</p>
+
+        p. The blocks can be customised by adding parameters between the
+        signature and the period. These include:
+
+        dl. {style rule}:A CSS(Cascading Style Sheets) style rule.
+        [ll]:A language identifier (for a "lang" attribute).
+        (class) or (#id) or (class#id):For CSS(Cascading Style Sheets) class and id attributes.
+        &gt;, &lt;, =, &lt;&gt;:Modifier characters for alignment. Right-justification, left-justification, centered, and full-justification. The paragraph will also receive the class names "right", "left", "center" and "justify", respectively.
+        ( (one or more):Adds padding on the left. 1em per "(" character is applied. When combined with the align-left or align-right modifier, it makes the block float. 
+        ) (one or more):Adds padding on the right. 1em per ")" character is applied. When combined with the align-left or align-right modifier, it makes the block float.
+
+        Here's an overloaded example:
+
+        pre. p(())>(class#id)[en]{color:red}. A simple paragraph.
+
+        Becomes:
+
+        pre. <p lang="en" style="color:red;padding-left:2em;padding-right:2em;float:right;" class="class right" id="id">A simple paragraph.</p>
+        """
+        # Clear signature.
+        clear_sig = r'''^clear(?P<alignment>[<>])?\.$'''
+        clear = None
+
+        extending  = 0
+
+        # We capture the \n's because they are important inside "pre..".
+        blocks = re.split(r'''(\n{2,})''', self.text)
+        output = []
+        for block in blocks:
+            # Check for the clear signature.
+            m = re.match(clear_sig, block)
+            if m:
+                clear = m.group('alignment')
+                if clear:
+                    clear = {'<': 'clear:left;', '>': 'clear:right;'}[clear]
+                else:
+                    clear = 'clear:both;'
+
+            else:
+                # Check each of the code signatures.
+                for regexp, function in self.signatures:
+                    p = re.compile(regexp, (re.VERBOSE | re.DOTALL))
+                    m = p.match(block)
+                    if m:
+                        # Put everything in a dictionary.
+                        captures = m.groupdict()
+
+                        # If we are extending a block, we require a dot to
+                        # break it, so we can start lines with '#' inside
+                        # an extended <pre> without matching an ordered list.
+                        if extending and not captures.get('dot', None):
+                            output[-1][1]['text'] += block
+                            break 
+                        elif captures.has_key('dot'):
+                            del captures['dot']
+                            
+                        # If a signature matches, we are not extending a block.
+                        extending = 0
+
+                        # Check if we should extend this block.
+                        if captures.has_key('extend'):
+                            extending = captures['extend']
+                            del captures['extend']
+                            
+                        # Apply head_offset.
+                        if captures.has_key('header'):
+                            captures['header'] = int(captures['header']) + self.head_offset
+
+                        # Apply clear.
+                        if clear:
+                            captures['clear'] = clear
+                            clear = None
+
+                        # Save the block to be processed later.
+                        output.append([function, captures])
+
+                        break
+
+                else:
+                    if extending:
+                        # Append the text to the last block.
+                        output[-1][1]['text'] += block
+                    elif block.strip():
+                        output.append([self.paragraph, {'text': block}])
+    
+        return output
+
+
+    def parse_params(self, parameters, clear=None, align_type='block'):
+        """Parse the parameters from a block signature.
+
+        This function parses the parameters from a block signature,
+        splitting the information about class, id, language and
+        style. The positioning (indentation and alignment) is parsed
+        and stored in the style.
+
+        A paragraph like:
+
+            p>(class#id){color:red}[en]. Paragraph.
+
+        or:
+            
+            p{color:red}[en](class#id)>. Paragraph.
+
+        will have its parameters parsed to:
+
+            output = {'lang' : 'en',
+                      'class': 'class',
+                      'id'   : 'id',
+                      'style': 'color:red;text-align:right;'}
+
+        Note that order is not important.
+        """
+        if not parameters:
+            if clear:
+                return {'style': clear}
+            else:
+                return {}
+
+        output = {}
+        
+        # Match class from (class) or (class#id).
+        m = re.search(r'''\((?P<class>[\w]+(\s[\w]+)*)(\#[\w]+)?\)''', parameters)
+        if m: output['class'] = m.group('class')
+
+        # Match id from (#id) or (class#id).
+        m = re.search(r'''\([\w]*(\s[\w]+)*\#(?P<id>[\w]+)\)''', parameters)
+        if m: output['id'] = m.group('id')
+
+        # Match [language].
+        m = re.search(r'''\[(?P<lang>[\w-]+)\]''', parameters)
+        if m: output['lang'] = m.group('lang')
+
+        # Match {style}.
+        m = re.search(r'''{(?P<style>[^\}]+)}''', parameters)
+        if m:
+            output['style'] = m.group('style').replace('\n', '')
+
+            # If necessary, apppend a semi-comma to the style.
+            if not output['style'].endswith(';'):
+                output['style'] += ';'
+
+        # Clear the block?
+        if clear:
+            output['style'] = output.get('style', '') + clear
+
+        # Remove classes, ids, langs and styles. This makes the 
+        # regular expression for the positioning much easier.
+        parameters = preg_replace(r'''\([\#\w\s]+\)''', '', parameters)
+        parameters = preg_replace(r'''\[[\w-]+\]''', '', parameters)
+        parameters = preg_replace(r'''{[\w:;#%-]+}''', '', parameters)
+
+        style = []
+        
+        # Count the left indentation.
+        l_indent = parameters.count('(')
+        if l_indent: style.append('padding-left:%dem;' % l_indent)
+
+        # Count the right indentation.
+        r_indent = parameters.count(')')
+        if r_indent: style.append('padding-right:%dem;' % r_indent)
+
+        # Add alignment.
+        if align_type == 'image':
+            align = [('<', 'float:left;', ' left'),
+                     ('>', 'float:right;', ' right')]
+
+            valign = [('^', 'vertical-align:text-top;', ' top'),
+                      ('-', 'vertical-align:middle;', ' middle'),
+                      ('~', 'vertical-align:text-bottom;', ' bottom')]
+
+            # Images can have both a vertical and a horizontal alignment.
+            for alignments in [align, valign]:
+                for _align, _style, _class in alignments:
+                    if parameters.count(_align):
+                        style.append(_style)
+                        
+                        # Append a class name related to the alignment.
+                        output['class'] = output.get('class', '') + _class
+                        break
+
+        elif align_type == 'table':
+            align = [('<', 'left'),
+                     ('>', 'right'),
+                     ('=', 'center'),
+                     ('<>', 'justify')]
+
+            valign = [('^', 'top'),
+                      ('~', 'bottom')]
+
+            # Horizontal alignment.
+            for _align, _style, in align:
+                if parameters.count(_align):
+                    output['align'] = _style
+            
+            # Vertical alignment.
+            for _align, _style, in valign:
+                if parameters.count(_align):
+                    output['valign'] = _style
+
+            # Colspan and rowspan.
+            m = re.search(r'''\\(\d+)''', parameters)
+            if m:
+                #output['colspan'] = m.groups()
+                output['colspan'] = int(m.groups()[0])
+
+            m = re.search(r'''/(\d+)''', parameters)
+            if m:
+                output['rowspan'] = int(m.groups()[0])
+
+        else:
+            if l_indent or r_indent:
+                alignments = [('<>', 'text-align:justify;', ' justify'),
+                              ('=', 'text-align:center;', ' center'),
+                              ('<', 'float:left;', ' left'),
+                              ('>', 'float:right;', ' right')]
+            else:
+                alignments = [('<>', 'text-align:justify;', ' justify'),
+                              ('=', 'text-align:center;', ' center'),
+                              ('<', 'text-align:left;', ' left'),
+                              ('>', 'text-align:right;', ' right')]
+
+            for _align, _style, _class in alignments:
+                if parameters.count(_align):
+                    style.append(_style)
+
+                    # Append a class name related to the alignment.
+                    output['class'] = output.get('class', '') + _class
+                    break
+
+        # Join all the styles.
+        output['style'] = output.get('style', '') + ''.join(style)
+
+        # Remove excess whitespace.
+        if output.has_key('class'):
+            output['class'] = output['class'].strip()
+
+        return output 
+        
+
+    def build_open_tag(self, tag, attributes={}, single=0):
+        """Build the open tag with specified attributes.
+
+        This function is used by all block builders to 
+        generate the opening tags with the attributes of
+        the block.
+        """
+        # Open tag.
+        open_tag = ['<%s' % tag]
+        for k,v in attributes.items():
+            # The ALT attribute can be empty.
+            if k == 'alt' or v: open_tag.append(' %s="%s"' % (k, v))
+
+        if single:
+            open_tag.append(' /')
+
+        # Close tag.
+        open_tag.append('>')
+
+        return ''.join(open_tag)
+
+
+    def paragraph(self, text, parameters=None, attributes=None, clear=None):
+        """Process a paragraph.
+
+        This function processes the paragraphs, enclosing the text in a 
+        <p> tag and breaking lines with <br />. Paragraphs are formatted
+        with all the inline rules.
+
+        ---
+        h1. Paragraph
+        
+        This is how you write a paragraph:
+
+        pre. p. This is a paragraph, although a short one.
+        
+        Since the paragraph is the default block, you can safely omit its
+        signature ([@p@]). Simply write:
+
+        pre. This is a paragraph, although a short one.
+
+        Text in a paragraph block is wrapped in @<p></p>@ tags, and
+        newlines receive a <br /> tag. In both cases Textile will process
+        the text to:
+
+        pre. <p>This is a paragraph, although a short one.</p>
+
+        Text in a paragraph block is processed with all the inline rules.
+        """
+        # Split the lines.
+        lines = re.split('\n{2,}', text)
+        
+        # Get the attributes.
+        attributes = attributes or self.parse_params(parameters, clear)
+
+        output = []
+        for line in lines:
+            if line:
+                # Clean the line.
+                line = line.strip()
+                 
+                # Build the tag.
+                open_tag = self.build_open_tag('p', attributes)
+                close_tag = '</p>'
+
+                # Pop the id because it must be unique.
+                if attributes.has_key('id'): del attributes['id']
+
+                # Break lines. 
+                line = preg_replace(r'(<br />|\n)+', '<br />\n', line)
+
+                # Remove <br /> from inside broken HTML tags.
+                line = preg_replace(r'(<[^>]*)<br />\n(.*?>)', r'\1 \2', line)
+
+                # Inline formatting.
+                line = self.inline(line)
+
+                output.append(open_tag + line + close_tag)
+
+        return '\n\n'.join(output)
+
+
+    def pre(self, text, parameters=None, clear=None):
+        """Process pre-formatted text.
+
+        This function processes pre-formatted text into a <pre> tag.
+        No HTML is added for the lines, but @<@ and @>@ are translated into
+        HTML entities.
+
+        ---
+        h1. Pre-formatted text
+
+        Pre-formatted text can be specified using the @pre@ signature.
+        Inside a "pre" block, whitespace is preserved and @<@ and @>@ are
+        translated into HTML(HyperText Markup Language) entities
+        automatically.
+
+        Text in a "pre" block is _not processed_ with any inline rule.
+
+        Here's a simple example:
+
+        pre. pre. This text is pre-formatted.
+        Nothing interesting happens inside here...
+        
+        Will become:
+
+        pre. <pre>
+        This text is pre-formatted.
+        Nothing interesting happens inside here...
+        </pre>
+        """
+
+        # Remove trailing whitespace.
+        text = text.rstrip()
+
+        # Get the attributes.
+        attributes = self.parse_params(parameters, clear)
+
+        # Build the tag.
+        #open_tag = self.build_open_tag('pre', attributes) + '\n'
+        open_tag = self.build_open_tag('pre', attributes)
+        close_tag = '\n</pre>'
+
+        # Replace < and >.
+        text = text.replace('<', '&lt;')
+        text = text.replace('>', '&gt;')
+
+        return open_tag + text + close_tag
+
+
+    def bc(self, text, parameters=None, clear=None):
+        """Process block code.
+
+        This function processes block code into a <code> tag inside a
+        <pre>. No HTML is added for the lines, but @<@ and @>@ are translated
+        into HTML entities.
+
+        ---
+        h1. Block code
+
+        A block code, specified by the @bc@ signature, is a block of
+        pre-formatted text which also receives a @<code></code>@ tag. As
+        with "pre", whitespace is preserved and @<@ and @>@ are translated
+        into HTML(HyperText Markup Language) entities automatically.
+
+        Text in a "bc" code is _not processed_ with the inline rules.
+        
+        If you have "Twisted":http://www.twistedmatrix.com/ installed,
+        Textile can automatically colorize your Python code if you
+        specify its language as "Python":
+        
+        pre. bc[python]. from twisted.python import htmlizer
+
+        This will become:
+
+        pre. <pre>
+        <code lang="python">
+        <span class="py-src-keyword">from</span> <span class="py-src-variable">twisted</span><span class="py-src-op">.</span><span class="py-src-variable">python</span> <span class="py-src-keyword">import</span> <span class="py-src-variable">htmlizer</span>
+        </code>
+        </pre>
+
+        The colors can be specified in your CSS(Cascading Style Sheets)
+        file. If you don't want to install Twisted, you can download just
+        the @htmlizer@ module "independently":http://dealmeida.net/code/htmlizer.py.txt.
+        """
+
+        # Get the attributes.
+        attributes = self.parse_params(parameters, clear)
+
+        # XHTML <code> can't have the attribute lang.
+        if attributes.has_key('lang'):
+            lang = attributes['lang']
+            del attributes['lang']
+        else:
+            lang = None
+
+        # Build the tag.
+        open_tag = '<pre>\n' + self.build_open_tag('code', attributes) + '\n'
+        close_tag = '\n</code>\n</pre>'
+
+        # Colorize Python code?
+        if htmlizer and lang == 'python':
+            text = _color(text)
+        else:
+            # Replace < and >.
+            text = text.replace('<', '&lt;')
+            text = text.replace('>', '&gt;')
+
+        return open_tag + text + close_tag
+
+
+    def dl(self, text, parameters=None, clear=None):
+        """Process definition list.
+
+        This function process definition lists. The text inside
+        the <dt> and <dd> tags is processed for inline formatting.
+
+        ---
+        h1. Definition list
+
+        A definition list starts with the signature @dl@, and has
+        its items separated by a @:@. Here's a simple example:
+
+        pre. dl. name:Sir Lancelot of Camelot.
+        quest:To seek the Holy Grail.
+        color:Blue.
+
+        Becomes:
+
+        pre. <dl>
+        <dt>name</dt>
+        <dd>Sir Lancelot of Camelot.</dd>
+        <dt>quest</dt>
+        <dd>To seek the Holy Grail.</dd>
+        <dt>color</dt>
+        <dd>Blue.</dd>
+        </dl>
+        """
+        # Get the attributes.
+        attributes = self.parse_params(parameters, clear)
+
+        # Build the tag.
+        open_tag = self.build_open_tag('dl', attributes) + '\n'
+        close_tag = '\n</dl>'
+
+        lines = text.split('\n')
+        output = []
+        for line in lines:
+            if line.count(':'):
+                [dt, dd] = line.split(':', 1)
+            else:
+                dt,dd = line, ''
+
+            if dt: output.append('<dt>%s</dt>\n<dd>%s</dd>' % (dt, dd))
+
+        text = '\n'.join(output)
+
+        text = self.inline(text)
+
+        return open_tag + text + close_tag
+
+
+    def blockquote(self, text, parameters=None, cite=None, clear=None):
+        """Process block quote.
+
+        The block quote is inserted into a <blockquote> tag, and
+        processed as a paragraph. An optional cite attribute can
+        be appended on the last line after two dashes (--), or
+        after the period following ':' for compatibility with the
+        Perl version.
+
+        ---
+        h1. Blockquote
+
+        A blockquote is denoted by the signature @bq@. The text in this
+        block will be enclosed in @<blockquote></blockquote>@ and @<p></p>@,
+        receiving the same formatting as a paragraph. For example:
+
+        pre. bq. This is a blockquote.
+
+        Becomes:
+
+        pre. <blockquote>
+        <p>This is a blockquote.</p>
+        </blockquote>
+
+        You can optionally specify the @cite@ attribute of the blockquote,
+        using the following syntax:
+
+        pre. bq.:http://example.com Some text.
+
+        pre. bq.:"John Doe" Some other text.
+
+        Becomes:
+
+        pre. <blockquote cite="http://example.com">
+        <p>Some text.</p>
+        </blockquote>
+
+        pre. <blockquote cite="John Doe">
+        <p>Some other text.</p>
+        </blockquote>
+
+        You can also specify the @cite@ using a pair of dashes on the
+        last line of the blockquote:
+
+        pre. bq. Some text.
+        -- http://example.com
+        """
+
+        # Get the attributes.
+        attributes = self.parse_params(parameters, clear)
+
+        if cite:
+            # Remove the quotes?
+            cite = cite.strip('"')
+            attributes['cite'] = cite
+        else:
+            # The citation should be on the last line.
+            text = text.split('\n')
+            if text[-1].startswith('-- '):
+                attributes['cite'] = text.pop()[3:]    
+        
+            text = '\n'.join(text)
+
+        # Build the tag.
+        open_tag = self.build_open_tag('blockquote', attributes) + '\n'
+        close_tag = '\n</blockquote>'
+
+        # Process the paragraph, passing the attributes.
+        # Does it make sense to pass the id, class, etc. to
+        # the paragraph instead of applying it to the
+        # blockquote tag?
+        text = self.paragraph(text)
+        
+        return open_tag + text + close_tag
+
+
+    def header(self, text, parameters=None, header=1, clear=None):
+        """Process a header.
+
+        The header number is captured by the regular 
+        expression and lives in header. If head_offset is
+        set, it is adjusted accordingly.
+
+        ---
+        h1. Header
+
+        A header is produced by the signature @hn@, where @n@ goes
+        from 1 to 6. You can adjust the relative output of the headers
+        passing a @head_offset@ attribute when calling @textile()@.
+
+        To make a header:
+
+        pre. h1. This is a header.
+
+        Becomes:
+
+        pre. <h1>This is a header.</h1>
+        """
+        # Get the attributes.
+        attributes = self.parse_params(parameters, clear)
+
+        # Get the header number and limit it between 1 and 6.
+        n = header
+        n = min(n,6)
+        n = max(n,1)
+
+        # Build the tag.
+        open_tag = self.build_open_tag('h%d' % n, attributes)
+        close_tag = '</h%d>' % n
+
+        text = self.inline(text)
+
+        return open_tag + text + close_tag
+
+
+    def footnote(self, text, parameters=None, footnote=1, clear=None):
+        """Process a footnote.
+
+        A footnote is formatted as a paragraph of class
+        'footnote' and id 'fn%d', starting with the footnote
+        number in a <sup> tag. Here we just build the
+        attributes and pass them directly to self.paragraph().
+
+        ---
+        h1. Footnote
+
+        A footnote is produced by the signature @fn@ followed by
+        a number. Footnotes are paragraphs of a special CSS(Cascading Style Sheets)
+        class. An example:
+
+        pre. fn1. This is footnote number one.
+
+        Will produce this:
+
+        pre. <p class="footnote" id="fn1"><sup>1</sup> This is footnote number one.</p>
+
+        This footnote can be referenced anywhere on the text by the
+        following way:
+
+        pre. This is a reference[1] to footnote number one.
+
+        Which becomes:
+
+        pre. <p>This is a reference<sup class="footnote"><a href="#fn1" title="This is footnote number one.">1</a></sup> to footnote number 1.</p>
+
+        Note that the text from the footnote appears in the @title@ of the
+        link pointing to it.
+        """
+        # Get the number.
+        n = int(footnote)
+
+        # Build the attributes to the paragraph.
+        attributes = self.parse_params(parameters, clear)
+        attributes['class'] = 'footnote'
+        attributes['id']    = 'fn%d' % n
+
+        # Build the paragraph text.
+        text = ('<sup>%d</sup> ' % n) + text
+
+        # And return the paragraph.
+        return self.paragraph(text=text, attributes=attributes)
+
+
+    def build_li(self, items, liattributes):
+        """Build the list item.
+
+        This function build the list item of an (un)ordered list. It
+        works by peeking at the next list item, and searching for a
+        multi-list. If a multi-list is found, it is processed and 
+        appended inside the list item tags, as it should be.
+        """
+        lines = []
+        while len(items):
+            item = items.pop(0)
+
+            # Clean the line.
+            item = item.lstrip()
+            item = item.replace('\n', '<br />\n')
+
+            # Get list item attributes.
+            p = re.compile(r'''^%(liattr)s\s''' % self.res, re.VERBOSE)
+            m = p.match(item)
+            if m:
+                c = m.groupdict('')
+                liparameters = c['liparameters']
+                item = p.sub('', item)
+            else:
+                liparameters = ''
+
+            liattributes = liattributes or self.parse_params(liparameters)
+            
+            # Build the item tag.
+            open_tag_li = self.build_open_tag('li', liattributes) 
+
+            # Reset the attributes, which should be applied
+            # only to the first <li>.
+            liattributes = {}
+
+            # Build the closing tag.
+            close_tag_li = '</li>'
+
+            # Multi-list recursive routine.
+            # Here we check the _next_ items for a multi-list. If we
+            # find one, we extract all items of the multi-list and
+            # process them recursively.
+            if len(items):
+                inlist = []
+
+                # Grab all the items that start with # or *.
+                n_item = items.pop(0)
+
+                # Grab the <ol> parameters.
+                p = re.compile(r'''^%(olattr)s''' % self.res, re.VERBOSE)
+                m = p.match(n_item)
+                if m:
+                    c = m.groupdict('')
+                    olparameters = c['olparameters']
+                    tmp = p.sub('', n_item)
+                else:
+                    olparameters = ''
+
+                # Check for an ordered list inside this one.
+                if tmp.startswith('#'):
+                    n_item = tmp
+                    inlist.append(n_item)
+                    while len(items):
+                        # Peek into the next item.
+                        n_item = items.pop(0)
+                        if n_item.startswith('#'):
+                            inlist.append(n_item)
+                        else:
+                            items.insert(0, n_item)
+                            break
+                        
+                    inlist = self.ol('\n'.join(inlist), olparameters=olparameters)
+                    item = item + '\n' + inlist + '\n'
+
+                # Check for an unordered list inside this one.
+                elif tmp.startswith('*'):
+                    n_item = tmp
+                    inlist.append(n_item)
+                    while len(items):
+                        # Peek into the next item.
+                        n_item = items.pop(0)
+                        if n_item.startswith('*'):
+                            inlist.append(n_item)
+                        else:
+                            items.insert(0, n_item)
+                            break
+
+                    inlist = self.ul('\n'.join(inlist), olparameters=olparameters)
+                    item = item + '\n' + inlist + '\n'
+
+                # Otherwise we just put it back in the list.
+                else:
+                    items.insert(0, n_item)
+
+            item = self.inline(item)
+
+            item = open_tag_li + item + close_tag_li
+            lines.append(item)
+
+        return '\n'.join(lines)
+
+
+    def ol(self, text, liparameters=None, olparameters=None, clear=None):
+        """Build an ordered list.
+
+        This function basically just sets the <ol></ol> with the
+        right attributes, and then pass everything inside to 
+        _build_li, which does the real tough recursive job.
+
+        ---
+        h1. Ordered lists
+
+        Ordered lists can be constructed this way:
+
+        pre. # Item number 1.
+        # Item number 2.
+        # Item number 3.
+
+        And you get:
+
+        pre. <ol>
+        <li>Item number 1.</li>
+        <li>Item number 2.</li>
+        <li>Item number 3.</li>
+        </ol>
+
+        If you want a list to "break" an extended block, you should
+        add a period after the hash. This is useful for writing 
+        Python code:
+
+        pre.. bc[python].. #!/usr/bin/env python
+
+        # This is a comment, not an ordered list!
+        # So this won't break the extended "bc".
+
+        p. Lists can be nested:
+
+        pre. # Item number 1.
+        ## Item number 1a.
+        ## Item number 1b.
+        # Item number 2.
+        ## Item number 2a.
+
+        Textile will transform this to:
+
+        pre. <ol>
+        <li>Item number 1.
+        <ol>
+        <li>Item number 1a.</li>
+        <li>Item number 1b.</li>
+        </ol>
+        </li>
+        <li>Item number 2.
+        <ol>
+        <li>Item number 2a.</li>
+        </ol>
+        </li>
+        </ol>
+
+        You can also mix ordered and unordered lists:
+
+        pre. * To write well you need:
+        *# to read every day
+        *# to write every day
+        *# and X
+
+        You'll get this:
+
+        pre. <ul>
+        <li>To write well you need:
+        <ol>
+        <li>to read every day</li>
+        <li>to write every day</li>
+        <li>and X</li>
+        </ol>
+        </li>
+        </ul>
+
+        To style a list, the parameters should go before the hash if you want
+        to set the attributes on the @<ol>@ tag:
+
+        pre. (class#id)# one
+        # two
+        # three
+
+        If you want to customize the firsr @<li>@ tag, apply the parameters
+        after the hash:
+
+        pre. #(class#id) one
+        # two
+        # three
+        """
+        # Get the attributes.
+        olattributes = self.parse_params(olparameters, clear)
+        liattributes = self.parse_params(liparameters)
+
+        # Remove list depth.
+        if text.startswith('#'):
+            text = text[1:]
+
+        items = text.split('\n#')
+
+        # Build the open tag.
+        open_tag = self.build_open_tag('ol', olattributes) + '\n'
+
+        close_tag = '\n</ol>'
+
+        # Build the list items.
+        text = self.build_li(items, liattributes)
+
+        return open_tag + text + close_tag
+
+
+    def ul(self, text, liparameters=None, olparameters=None, clear=None):
+        """Build an unordered list.
+
+        This function basically just sets the <ul></ul> with the
+        right attributes, and then pass everything inside to 
+        _build_li, which does the real tough recursive job.
+
+        ---
+        h1. Unordered lists
+
+        Unordered lists behave exactly like the ordered lists, and are
+        defined using a star:
+
+        pre. * Python
+        * Perl
+        * PHP
+
+        Becomes:
+
+        pre. <ul>
+        <li>Python</li>
+        <li>Perl</li>
+        <li><span class="caps">PHP</span></li>
+        </ul>
+        """
+        # Get the attributes.
+        olattributes = self.parse_params(olparameters, clear)
+        liattributes = self.parse_params(liparameters)
+
+        # Remove list depth.
+        if text.startswith('*'):
+            text = text[1:]
+
+        items = text.split('\n*')
+
+        # Build the open tag.
+        open_tag = self.build_open_tag('ul', olattributes) + '\n'
+
+        close_tag = '\n</ul>'
+
+        # Build the list items.
+        text = self.build_li(items, liattributes)
+
+        return open_tag + text + close_tag
+    
+
+    def table(self, text, parameters=None, clear=None):
+        """Build a table.
+
+        To build a table we split the text in lines to get the
+        rows, and split the rows between '|' to get the individual
+        cells.
+
+        ---
+        h1. Tables
+
+        Making a simple table is as easy as possible:
+
+        pre. |a|b|c|
+        |1|2|3|
+
+        Will be processed into:
+
+        pre. <table>
+        <tr>
+        <td>a</td>
+        <td>b</td>
+        <td>c</td>
+        </tr>
+        <tr>
+        <td>1</td>
+        <td>2</td>
+        <td>3</td>
+        </tr>
+        </table>
+
+        If you want to customize the @<table>@ tag, you must use the
+        @table@ signature:
+
+        pre. table(class#id)[en]. |a|b|c|
+        |1|2|3|
+
+        To customize a row, apply the modifier _before_ the first @|@:
+
+        pre. table. (class)<>|a|b|c|
+        |1|2|3|
+
+        Individual cells can by customized by adding the parameters _after_
+        the @|@, proceded by a period and a space:
+
+        pre. |(#id). a|b|c|
+        |1|2|3|
+
+        The allowed modifiers are:
+
+        dl. {style rule}:A CSS(Cascading Style Sheets) style rule. 
+        (class) or (#id) or (class#id):A CSS(Cascading Style Sheets) class and/or id attribute. 
+        ( (one or more):Adds 1em of padding to the left for each '(' character. 
+        ) (one or more):Adds 1em of padding to the right for each ')' character. 
+        &lt;:Aligns to the left (floats to left for tables if combined with the ')' modifier). 
+        &gt;:Aligns to the right (floats to right for tables if combined with the '(' modifier). 
+        =:Aligns to center (sets left, right margins to 'auto' for tables). 
+        &lt;&gt;:For cells only. Justifies text. 
+        ^:For rows and cells only. Aligns to the top. 
+        ~ (tilde):For rows and cells only. Aligns to the bottom. 
+        _ (underscore):Can be applied to a table row or cell to indicate a header row or cell. 
+        \\2 or \\3 or \\4, etc.:Used within cells to indicate a colspan of 2, 3, 4, etc. columns. When you see "\\", think "push forward". 
+        /2 or /3 or /4, etc.:Used within cells to indicate a rowspan of 2, 3, 4, etc. rows. When you see "/", think "push downward". 
+        
+        When a cell is identified as a header cell and an alignment is
+        specified, that becomes the default alignment for cells below it.
+        You can always override this behavior by specifying an alignment
+        for one of the lower cells.
+        """
+        attributes = self.parse_params(parameters, clear, align_type='table')
+        #attributes['cellspacing'] = '0'
+
+        # Build the <table>.
+        open_tag = self.build_open_tag('table', attributes) + '\n'
+        close_tag = '</table>'
+
+        output = []
+        default_align = {}
+        rows = re.split(r'''\n+''', text)
+        for row in rows:
+            # Get the columns.
+            columns = row.split('|')
+
+            # Build the <tr>.
+            parameters = columns.pop(0)
+
+            rowattr = self.parse_params(parameters, align_type='table')
+            open_tr = self.build_open_tag('tr', rowattr) + '\n'
+            output.append(open_tr)
+
+            # Does the row define headers?
+            if parameters.count('_'):
+                td_tag = 'th'
+            else:
+                td_tag = 'td'
+                
+            col = 0
+            for cell in columns[:-1]:
+                p = re.compile(r'''(?:%(tattr)s\.\s)?(?P<text>.*)''' % self.res, re.VERBOSE)
+                m = p.match(cell)
+                if m:
+                    c = m.groupdict('')
+                    cellattr = self.parse_params(c['parameters'], align_type='table')
+
+                    # Get the width of this cell.
+                    width = cellattr.get('colspan', 1)
+
+                    # Is this a header?
+                    if c['parameters'].count('_'):
+                        td_tag = 'th'
+
+                    # If it is a header, let's set the default alignment.
+                    if td_tag == 'th':
+                        # Set the default aligment for all cells below this one.
+                        # This is a little tricky because this header can have
+                        # a colspan set.
+                        for i in range(col, col+width):
+                            default_align[i] = cellattr.get('align', None)
+
+                    else:
+                        # Apply the default align, if any.
+                        cellattr['align'] = cellattr.get('align', default_align.get(col, None))
+
+                    open_td = self.build_open_tag(td_tag, cellattr)
+                    close_td = '</%s>\n' % td_tag
+
+                    #output.append(open_td + c['text'].strip() + close_td)
+                    output.append(open_td + self.inline(c['text'].strip()) + close_td)
+
+                col += width
+
+            output.append('</tr>\n')
+
+        text = open_tag + ''.join(output) + close_tag
+
+        return text
+
+
+    def escape(self, text):
+        """Do nothing.
+
+        This is used to match escaped text. Nothing to see here!
+
+        ---
+        h1. Escaping
+
+        If you don't want Textile processing a block, you can simply
+        enclose it inside @==@:
+
+        pre. p. Regular paragraph
+
+        pre. ==
+        Escaped portion -- will not be formatted
+        by Textile at all
+        ==
+
+        pre. p. Back to normal.
+
+        This can also be used inline, disabling the formatting temporarily:
+
+        pre. p. This is ==*a test*== of escaping.
+        """
+        return text
+
+
+    def itex(self, text):
+        """Convert itex to MathML.
+
+        If the itex2mml binary is set, we use it to convert the
+        itex to MathML. Otherwise, the text is unprocessed and 
+        return as is.
+
+        ---
+        h1. itex
+
+        Textile can automatically convert itex code to MathML(Mathematical Markup Language)
+        for you, if you have the itex2MML binary (you can download it
+        from the "Movable Type plugin":http://golem.ph.utexas.edu/~distler/blog/files/itexToMML.tar.gz).
+
+        Block equations should be enclosed inbetween @\[@ and @\]@:
+
+        pre. \[ e^{i\pi} + 1 = 0 \]
+
+        Will be translated to:
+
+        pre. <math xmlns='http://www.w3.org/1998/Math/MathML' mode='display'>
+        <msup><mi>e</mi> <mrow><mi>i</mi>
+        <mi>&amp;pi;</mi></mrow></msup>
+        <mo>+</mo><mn>1</mn><mo>=</mo><mn>0</mn>
+        </math>
+
+        Equations can also be displayed inline:
+
+        pre. Euler's formula, $e^{i\pi}+1=0$, ...
+
+        (Note that if you want to display MathML(Mathematical Markup Language)
+        your content must be served as @application/xhtml+xml@, which is not
+        accepted by all browsers.)
+        """
+        if itex2mml:
+            try:
+                text = os.popen("echo '%s' | %s" % (text, itex2mml)).read()
+            except:
+                pass
+
+        return text
+
+
+    def about(self, text=None):
+        """Show PyTextile's functionalities.
+
+        An introduction to PyTextile. Can be called when running the
+        main script or if you write the following line:
+
+            'tell me about textile.'
+
+        But keep it a secret!
+        """
+
+        about = []
+        about.append(textile('h1. This is Textile', head_offset=self.head_offset))
+        about.append(textile(__doc__.split('---', 1)[1], head_offset=self.head_offset))
+
+        functions = [(self.split_text, 1),
+                     (self.paragraph,  2),
+                     (self.pre,        2),
+                     (self.bc,         2),
+                     (self.blockquote, 2),
+                     (self.dl,         2),
+                     (self.header,     2),
+                     (self.footnote,   2),
+                     (self.escape,     2),
+                     (self.itex,       2),
+                     (self.ol,         2),
+                     (self.ul,         2),
+                     (self.table,      2),
+                     (self.inline,     1),
+                     (self.qtags,      2),
+                     (self.glyphs,     2),
+                     (self.macros,     2),
+                     (self.acronym,    2),
+                     (self.images,     1),
+                     (self.links,      1),
+                     (self.sanitize,   1),
+                    ]
+
+        for function, offset in functions:
+            doc = function.__doc__.split('---', 1)[1]
+            doc = doc.split('\n')
+            lines = []
+            for line in doc:
+                line = line.strip()
+                lines.append(line)
+                
+            doc = '\n'.join(lines)
+            about.append(textile(doc, head_offset=self.head_offset+offset))
+
+        about = '\n'.join(about)
+        about = about.replace('<br />', '')
+
+        return about
+
+
+    def acronym(self, text):
+        """Process acronyms.
+
+        Acronyms can have letters in upper and lower caps, or even numbers,
+        provided that the numbers and upper caps are the same in the
+        abbreviation and in the description. For example:
+
+            XHTML(eXtensible HyperText Markup Language)
+            OPeNDAP(Open source Project for a Network Data Access Protocol)
+            L94(Levitus 94)
+
+        are all valid acronyms.
+
+        ---
+        h1. Acronyms
+
+        You can define acronyms in your text the following way:
+
+        pre. This is XHTML(eXtensible HyperText Markup Language).
+
+        The resulting code is:
+
+        pre. <p><acronym title="eXtensible HyperText Markup Language"><span class="caps">XHTML</span></acronym></p>
+
+        Acronyms can have letters in upper and lower caps, or even numbers,
+        provided that the numbers and upper caps are the same in the
+        abbreviation and in the description. For example:
+
+        pre. XHTML(eXtensible HyperText Markup Language)
+        OPeNDAP(Open source Project for a Network Data Access Protocol)
+        L94(Levitus 94)
+
+        are all valid acronyms.
+        """
+        # Find the acronyms.
+        acronyms = r'''(?P<acronym>[\w]+)\((?P<definition>[^\(\)]+?)\)'''
+
+        # Check all acronyms.
+        for acronym, definition in re.findall(acronyms, text):
+            caps_acronym = ''.join(re.findall('[A-Z\d]+', acronym))
+            caps_definition = ''.join(re.findall('[A-Z\d]+', definition))
+            if caps_acronym and caps_acronym == caps_definition:
+                text = text.replace('%s(%s)' % (acronym, definition), '<acronym title="%s">%s</acronym>' % (definition, acronym))
+        
+        text = html_replace(r'''(^|\s)([A-Z]{3,})\b(?!\()''', r'''\1<span class="caps">\2</span>''', text)
+
+        return text
+
+
+    def footnotes(self, text):
+        """Add titles to footnotes references.
+
+        This function searches for footnotes references like this [1], and 
+        adds a title to the link containing the first paragraph of the
+        footnote.
+        """
+        # Search for footnotes.
+        p = re.compile(r'''<p class="footnote" id="fn(?P<n>\d+)"><sup>(?P=n)</sup>(?P<note>.*)</p>''')
+        for m in p.finditer(text):
+            n = m.group('n')
+            note = m.group('note').strip()
+
+            # Strip HTML from note.
+            note = re.sub('<.*?>', '', note)
+
+            # Add the title.
+            text = text.replace('<a href="#fn%s">' % n, '<a href="#fn%s" title="%s">' % (n, note))
+
+        return text
+
+
+    def macros(self, m):
+        """Quick macros.
+
+        This function replaces macros inside brackets using a built-in
+        dictionary, and also unicode names if the key doesn't exist.
+
+        ---
+        h1. Macros
+
+        Textile has support for character macros, which should be enclosed
+        in curly braces. A few useful ones are:
+
+        pre. {C=} or {=C}: euro sign
+        {+-} or {-+}: plus-minus sign
+        {L-} or {-L}: pound sign.
+
+        You can also make accented characters:
+
+        pre. Expos{e'}
+
+        Becomes:
+
+        pre. <p>Expos&amp;#233;</p>
+
+        You can also specify Unicode names like:
+
+        pre. {umbrella}
+        {white smiling face}
+        """
+        entity = m.group(1)
+
+        macros = {'c|': '&#162;',       # cent sign
+                  '|c': '&#162;',       # cent sign
+                  'L-': '&#163;',       # pound sign
+                  '-L': '&#163;',       # pound sign
+                  'Y=': '&#165;',       # yen sign
+                  '=Y': '&#165;',       # yen sign
+                  '(c)': '&#169;',      # copyright sign
+                  '<<': '&#171;',       # left-pointing double angle quotation
+                  '(r)': '&#174;',      # registered sign
+                  '+_': '&#177;',       # plus-minus sign
+                  '_+': '&#177;',       # plus-minus sign
+                  '>>': '&#187;',       # right-pointing double angle quotation
+                  '1/4': '&#188;',      # vulgar fraction one quarter
+                  '1/2': '&#189;',      # vulgar fraction one half
+                  '3/4': '&#190;',      # vulgar fraction three quarters
+                  'A`': '&#192;',       # latin capital letter a with grave
+                  '`A': '&#192;',       # latin capital letter a with grave
+                  'A\'': '&#193;',      # latin capital letter a with acute
+                  '\'A': '&#193;',      # latin capital letter a with acute
+                  'A^': '&#194;',       # latin capital letter a with circumflex
+                  '^A': '&#194;',       # latin capital letter a with circumflex
+                  'A~': '&#195;',       # latin capital letter a with tilde
+                  '~A': '&#195;',       # latin capital letter a with tilde
+                  'A"': '&#196;',       # latin capital letter a with diaeresis
+                  '"A': '&#196;',       # latin capital letter a with diaeresis
+                  'Ao': '&#197;',       # latin capital letter a with ring above
+                  'oA': '&#197;',       # latin capital letter a with ring above
+                  'AE': '&#198;',       # latin capital letter ae
+                  'C,': '&#199;',       # latin capital letter c with cedilla
+                  ',C': '&#199;',       # latin capital letter c with cedilla
+                  'E`': '&#200;',       # latin capital letter e with grave
+                  '`E': '&#200;',       # latin capital letter e with grave
+                  'E\'': '&#201;',      # latin capital letter e with acute
+                  '\'E': '&#201;',      # latin capital letter e with acute
+                  'E^': '&#202;',       # latin capital letter e with circumflex
+                  '^E': '&#202;',       # latin capital letter e with circumflex
+                  'E"': '&#203;',       # latin capital letter e with diaeresis
+                  '"E': '&#203;',       # latin capital letter e with diaeresis
+                  'I`': '&#204;',       # latin capital letter i with grave
+                  '`I': '&#204;',       # latin capital letter i with grave
+                  'I\'': '&#205;',      # latin capital letter i with acute
+                  '\'I': '&#205;',      # latin capital letter i with acute
+                  'I^': '&#206;',       # latin capital letter i with circumflex
+                  '^I': '&#206;',       # latin capital letter i with circumflex
+                  'I"': '&#207;',       # latin capital letter i with diaeresis
+                  '"I': '&#207;',       # latin capital letter i with diaeresis
+                  'D-': '&#208;',       # latin capital letter eth
+                  '-D': '&#208;',       # latin capital letter eth
+                  'N~': '&#209;',       # latin capital letter n with tilde
+                  '~N': '&#209;',       # latin capital letter n with tilde
+                  'O`': '&#210;',       # latin capital letter o with grave
+                  '`O': '&#210;',       # latin capital letter o with grave
+                  'O\'': '&#211;',      # latin capital letter o with acute
+                  '\'O': '&#211;',      # latin capital letter o with acute
+                  'O^': '&#212;',       # latin capital letter o with circumflex
+                  '^O': '&#212;',       # latin capital letter o with circumflex
+                  'O~': '&#213;',       # latin capital letter o with tilde
+                  '~O': '&#213;',       # latin capital letter o with tilde
+                  'O"': '&#214;',       # latin capital letter o with diaeresis
+                  '"O': '&#214;',       # latin capital letter o with diaeresis
+                  'O/': '&#216;',       # latin capital letter o with stroke
+                  '/O': '&#216;',       # latin capital letter o with stroke
+                  'U`':  '&#217;',      # latin capital letter u with grave
+                  '`U':  '&#217;',      # latin capital letter u with grave
+                  'U\'': '&#218;',      # latin capital letter u with acute
+                  '\'U': '&#218;',      # latin capital letter u with acute
+                  'U^': '&#219;',       # latin capital letter u with circumflex
+                  '^U': '&#219;',       # latin capital letter u with circumflex
+                  'U"': '&#220;',       # latin capital letter u with diaeresis
+                  '"U': '&#220;',       # latin capital letter u with diaeresis
+                  'Y\'': '&#221;',      # latin capital letter y with acute
+                  '\'Y': '&#221;',      # latin capital letter y with acute
+                  'a`': '&#224;',       # latin small letter a with grave
+                  '`a': '&#224;',       # latin small letter a with grave
+                  'a\'': '&#225;',      # latin small letter a with acute
+                  '\'a': '&#225;',      # latin small letter a with acute
+                  'a^': '&#226;',       # latin small letter a with circumflex
+                  '^a': '&#226;',       # latin small letter a with circumflex
+                  'a~': '&#227;',       # latin small letter a with tilde
+                  '~a': '&#227;',       # latin small letter a with tilde
+                  'a"': '&#228;',       # latin small letter a with diaeresis
+                  '"a': '&#228;',       # latin small letter a with diaeresis
+                  'ao': '&#229;',       # latin small letter a with ring above
+                  'oa': '&#229;',       # latin small letter a with ring above
+                  'ae': '&#230;',       # latin small letter ae
+                  'c,': '&#231;',       # latin small letter c with cedilla
+                  ',c': '&#231;',       # latin small letter c with cedilla
+                  'e`': '&#232;',       # latin small letter e with grave
+                  '`e': '&#232;',       # latin small letter e with grave
+                  'e\'': '&#233;',      # latin small letter e with acute
+                  '\'e': '&#233;',      # latin small letter e with acute
+                  'e^': '&#234;',       # latin small letter e with circumflex
+                  '^e': '&#234;',       # latin small letter e with circumflex
+                  'e"': '&#235;',       # latin small letter e with diaeresis
+                  '"e': '&#235;',       # latin small letter e with diaeresis
+                  'i`': '&#236;',       # latin small letter i with grave
+                  '`i': '&#236;',       # latin small letter i with grave
+                  'i\'': '&#237;',      # latin small letter i with acute
+                  '\'i': '&#237;',      # latin small letter i with acute
+                  'i^': '&#238;',       # latin small letter i with circumflex
+                  '^i': '&#238;',       # latin small letter i with circumflex
+                  'i"': '&#239;',       # latin small letter i with diaeresis
+                  '"i': '&#239;',       # latin small letter i with diaeresis
+                  'n~': '&#241;',       # latin small letter n with tilde
+                  '~n': '&#241;',       # latin small letter n with tilde
+                  'o`': '&#242;',       # latin small letter o with grave
+                  '`o': '&#242;',       # latin small letter o with grave
+                  'o\'': '&#243;',      # latin small letter o with acute
+                  '\'o': '&#243;',      # latin small letter o with acute
+                  'o^': '&#244;',       # latin small letter o with circumflex
+                  '^o': '&#244;',       # latin small letter o with circumflex
+                  'o~': '&#245;',       # latin small letter o with tilde
+                  '~o': '&#245;',       # latin small letter o with tilde
+                  'o"': '&#246;',       # latin small letter o with diaeresis
+                  '"o': '&#246;',       # latin small letter o with diaeresis
+                  ':-': '&#247;',       # division sign
+                  '-:': '&#247;',       # division sign
+                  'o/': '&#248;',       # latin small letter o with stroke
+                  '/o': '&#248;',       # latin small letter o with stroke
+                  'u`': '&#249;',       # latin small letter u with grave
+                  '`u': '&#249;',       # latin small letter u with grave
+                  'u\'': '&#250;',      # latin small letter u with acute
+                  '\'u': '&#250;',      # latin small letter u with acute
+                  'u^': '&#251;',       # latin small letter u with circumflex
+                  '^u': '&#251;',       # latin small letter u with circumflex
+                  'u"': '&#252;',       # latin small letter u with diaeresis
+                  '"u': '&#252;',       # latin small letter u with diaeresis
+                  'y\'': '&#253;',      # latin small letter y with acute
+                  '\'y': '&#253;',      # latin small letter y with acute
+                  'y"': '&#255',        # latin small letter y with diaeresis
+                  '"y': '&#255',        # latin small letter y with diaeresis
+                  'OE': '&#338;',       # latin capital ligature oe
+                  'oe': '&#339;',       # latin small ligature oe
+                  '*': '&#8226;',       # bullet
+                  'Fr': '&#8355;',      # french franc sign
+                  'L=': '&#8356;',      # lira sign
+                  '=L': '&#8356;',      # lira sign
+                  'Rs': '&#8360;',      # rupee sign
+                  'C=': '&#8364;',      # euro sign
+                  '=C': '&#8364;',      # euro sign
+                  'tm': '&#8482;',      # trade mark sign
+                  '<-': '&#8592;',      # leftwards arrow
+                  '->': '&#8594;',      # rightwards arrow
+                  '<=': '&#8656;',      # leftwards double arrow
+                  '=>': '&#8658;',      # rightwards double arrow
+                  '=/': '&#8800;',      # not equal to
+                  '/=': '&#8800;',      # not equal to
+                  '<_': '&#8804;',      # less-than or equal to
+                  '_<': '&#8804;',      # less-than or equal to
+                  '>_': '&#8805;',      # greater-than or equal to
+                  '_>': '&#8805;',      # greater-than or equal to
+                  ':(': '&#9785;',      # white frowning face
+                  ':)': '&#9786;',      # white smiling face
+                  'spade': '&#9824;',   # black spade suit
+                  'club': '&#9827;',    # black club suit
+                  'heart': '&#9829;',   # black heart suit
+                  'diamond': '&#9830;', # black diamond suit
+                 }
+
+        try:
+            # Try the key.
+            entity = macros[entity]
+        except KeyError:
+            try:
+                # Try a unicode entity.
+                entity = unicodedata.lookup(entity)
+                entity = entity.encode('ascii', 'xmlcharrefreplace')
+            except:
+                # Return the unmodified entity.
+                entity = '{%s}' % entity
+
+        return entity
+
+
+    def glyphs(self, text):
+        """Glyph formatting.
+
+        This function replaces quotations marks, dashes and a few other
+        symbol for numerical entities. The em/en dashes use definitions
+        comes from http://alistapart.com/articles/emen/.
+
+        ---
+        h1. Glyphs
+
+        Textile replaces some of the characters in your text with their
+        equivalent numerical entities. These include:
+
+        * Replace single and double primes used as quotation marks with HTML(HyperText Markup Language) entities for opening and closing quotation marks in readable text, while leaving untouched the primes required within HTML(HyperText Markup Language) tags.
+        * Replace double hyphens (==--==) with an em-dash (&#8212;) entity.
+        * Replace triple hyphens (==---==) with two em-dash (&#8212;&#8212;) entities.
+        * Replace single hyphens surrounded by spaces with an en-dash (&#8211;) entity.
+        * Replace triplets of periods (==...==) with an ellipsis (&#8230;) entity.
+        * Convert many nonstandard characters to browser-safe entities corresponding to keyboard input.
+        * Convert ==(TM)==, ==(R)==, and  ==(C)== to &#8482;, &#174;, and &#169;.
+        * Convert the letter x to a dimension sign: 2==x==4 to 2x4 and 8 ==x== 10 to 8x10.
+        """
+        glyphs = [(r'''"(?<!\w)\b''', r'''&#8220;'''),                              # double quotes
+                  (r'''"''', r'''&#8221;'''),                                       # double quotes
+                  (r"""\b'""", r'''&#8217;'''),                                     # single quotes
+                  (r"""'(?<!\w)\b""", r'''&#8216;'''),                              # single quotes
+                  (r"""'""", r'''&#8217;'''),                                       # single single quote
+                  (r'''(\b|^)( )?\.{3}''', r'''\1&#8230;'''),                       # ellipsis
+                  (r'''\b---\b''', r'''&#8212;&#8212;'''),                          # double em dash
+                  (r'''\s?--\s?''', r'''&#8212;'''),                                # em dash
+                  (r'''(\d+)-(\d+)''', r'''\1&#8211;\2'''),                         # en dash (1954-1999)
+                  (r'''(\d+)-(\W)''', r'''\1&#8212;\2'''),                          # em dash (1954--)
+                  (r'''\s-\s''', r''' &#8211; '''),                                 # en dash
+                  (r'''(\d+) ?x ?(\d+)''', r'''\1&#215;\2'''),                      # dimension sign
+                  (r'''\b ?(\((tm|TM)\))''', r'''&#8482;'''),                       # trademark
+                  (r'''\b ?(\([rR]\))''', r'''&#174;'''),                           # registered
+                  (r'''\b ?(\([cC]\))''', r'''&#169;'''),                           # copyright
+                  (r'''([^\s])\[(\d+)\]''',                                         #
+                       r'''\1<sup class="footnote"><a href="#fn\2">\2</a></sup>'''),# footnote
+                  ]
+
+        # Apply macros.
+        text = re.sub(r'''{([^}]+)}''', self.macros, text)
+
+        # LaTeX style quotes.
+        text = text.replace('\x60\x60', '&#8220;')
+        text = text.replace('\xb4\xb4', '&#8221;')
+
+        # Linkify URL and emails.
+        url = r'''(?=[a-zA-Z0-9./#])                          # Must start correctly
+                  ((?:                                        # Match the leading part (proto://hostname, or just hostname)
+                      (?:ftp|https?|telnet|nntp)              #     protocol
+                      ://                                     #     ://
+                      (?:                                     #     Optional 'username:password@'
+                          \w+                                 #         username
+                          (?::\w+)?                           #         optional :password
+                          @                                   #         @
+                      )?                                      # 
+                      [-\w]+(?:\.\w[-\w]*)+                   #     hostname (sub.example.com)
+                  )                                           #
+                  (?::\d+)?                                   # Optional port number
+                  (?:                                         # Rest of the URL, optional
+                      /?                                      #     Start with '/'
+                      [^.!,?;:"'<>()\[\]{}\s\x7F-\xFF]*       #     Can't start with these
+                      (?:                                     #
+                          [.!,?;:]+                           #     One or more of these
+                          [^.!,?;:"'<>()\[\]{}\s\x7F-\xFF]+   #     Can't finish with these
+                          #'"                                 #     # or ' or "
+                      )*                                      #
+                  )?)                                         #
+               '''
+
+        email = r'''(?:mailto:)?            # Optional mailto:
+                    ([-\+\w]+               # username
+                    \@                      # at
+                    [-\w]+(?:\.\w[-\w]*)+)  # hostname
+                 '''
+
+        # If there is no html, do a simple search and replace.
+        if not re.search(r'''<.*>''', text):
+            for glyph_search, glyph_replace in glyphs:
+                text = preg_replace(glyph_search, glyph_replace, text)
+
+            # Linkify.
+            text = re.sub(re.compile(url, re.VERBOSE), r'''<a href="\1">\1</a>''', text)
+            text = re.sub(re.compile(email, re.VERBOSE), r'''<a href="mailto:\1">\1</a>''', text)
+
+        else:
+            lines = []
+            # Else split the text into an array at <>.
+            for line in re.split('(<.*?>)', text):
+                if not re.match('<.*?>', line):
+                    for glyph_search, glyph_replace in glyphs:
+                        line = preg_replace(glyph_search, glyph_replace, line)
+
+                    # Linkify.
+                    line = re.sub(re.compile(url, re.VERBOSE), r'''<a href="\1">\1</a>''', line)
+                    line = re.sub(re.compile(email, re.VERBOSE), r'''<a href="mailto:\1">\1</a>''', line)
+
+                lines.append(line)
+
+            text = ''.join(lines)
+
+        return text
+
+
+    def qtags(self, text):
+        """Quick tags formatting.
+
+        This function does the inline formatting of text, like
+        bold, italic, strong and also itex code.
+
+        ---
+        h1. Quick tags
+
+        Quick tags allow you to format your text, making it bold, 
+        emphasized or small, for example. The quick tags operators
+        include:
+
+        dl. ==*strong*==:Translates into @<strong>strong</strong>@.
+        ==_emphasis_==:Translates into @<em>emphasis</em>@. 
+        ==**bold**==:Translates into @<b>bold</b>@. 
+        ==__italics__==:Translates into @<i>italics</i>@. 
+        ==++bigger++==:Translates into @<big>bigger</big>@. 
+        ==--smaller--==:Translates into: @<small>smaller</small>@. 
+        ==-deleted text-==:Translates into @<del>deleted text</del>@. 
+        ==+inserted text+==:Translates into @<ins>inserted text</ins>@. 
+        ==^superscript^==:Translates into @<sup>superscript</sup>@. 
+        ==~subscript~==:Translates into @<sub>subscript</sub>@. 
+        ==%span%==:Translates into @<span>span</span>@. 
+        ==@code@==:Translates into @<code>code</code>@. 
+        
+        Note that within a "==@==...==@==" section, @<@ and @>@ are
+        translated into HTML entities automatically. 
+
+        Inline formatting operators accept the following modifiers:
+
+        dl. {style rule}:A CSS(Cascading Style Sheets) style rule. 
+        [ll]:A language identifier (for a "lang" attribute). 
+        (class) or (#id) or (class#id):For CSS(Cascading Style Sheets) class and id attributes. 
+        """
+        # itex2mml.
+        text = re.sub('\$(.*?)\$', lambda m: self.itex(m.group()), text)
+
+        # Add span tags to upper-case words which don't have a description.
+        #text = preg_replace(r'''(^|\s)([A-Z]{3,})\b(?!\()''', r'''\1<span class="caps">\2</span>''', text)
+        
+        # Quick tags.
+        qtags = [('**', 'b',      {'qf': '(?<!\*)\*\*(?!\*)', 'cls': '\*'}),
+                 ('__', 'i',      {'qf': '(?<!_)__(?!_)', 'cls': '_'}),
+                 ('??', 'cite',   {'qf': '\?\?(?!\?)', 'cls': '\?'}),
+                 ('-',  'del',    {'qf': '(?<!\-)\-(?!\-)', 'cls': '-'}),
+                 ('+',  'ins',    {'qf': '(?<!\+)\+(?!\+)', 'cls': '\+'}),
+                 ('*',  'strong', {'qf': '(?<!\*)\*(?!\*)', 'cls': '\*'}),
+                 ('_',  'em',     {'qf': '(?<!_)_(?!_)', 'cls': '_'}),
+                 ('++', 'big',    {'qf': '(?<!\+)\+\+(?!\+)', 'cls': '\+\+'}),
+                 ('--', 'small',  {'qf': '(?<!\-)\-\-(?!\-)', 'cls': '\-\-'}),
+                 ('~',  'sub',    {'qf': '(?<!\~)\~(?!(\\\/~))', 'cls': '\~'}),
+                 ('@',  'code',   {'qf': '(?<!@)@(?!@)', 'cls': '@'}),
+                 ('%',  'span',   {'qf': '(?<!%)%(?!%)', 'cls': '%'}),
+                ]
+
+        # Superscript.
+        text = re.sub(r'''(?<!\^)\^(?!\^)(.+?)(?<!\^)\^(?!\^)''', r'''<sup>\1</sup>''', text)
+
+        # This is from the perl version of Textile.
+        for qtag, htmltag, redict in qtags:
+            self.res.update(redict)
+            p = re.compile(r'''(?:                          #
+                                   ^                        # Start of string
+                                   |                        #
+                                   (?<=[\s>'"])             # Whitespace, end of tag, quotes
+                                   |                        #
+                                   (?P<pre>[{[])            # Surrounded by [ or {
+                                   |                        #
+                                   (?<=%(punct)s)           # Punctuation
+                               )                            #
+                               %(qf)s                       # opening tag
+                               %(qattr)s                    # attributes
+                               (?P<text>[^%(cls)s\s].*?)    # text
+                               (?<=\S)                      # non-whitespace
+                               %(qf)s                       # 
+                               (?:                          #
+                                   $                        # End of string
+                                   |                        #
+                                   (?P<post>[\]}])          # Surrounded by ] or }
+                                   |                        # 
+                                   (?=%(punct)s{1,2}|\s)    # punctuation
+                                )                           #
+                             ''' % self.res, re.VERBOSE)
+
+            def _replace(m):
+                c = m.groupdict('')
+
+                attributes = self.parse_params(c['parameters'])
+                open_tag  = self.build_open_tag(htmltag, attributes) 
+                close_tag = '</%s>' % htmltag
+
+                # Replace < and > inside <code></code>.
+                if htmltag == 'code':
+                    c['text'] = c['text'].replace('<', '&lt;')
+                    c['text'] = c['text'].replace('>', '&gt;')
+         
+                return open_tag + c['text'] + close_tag
+
+            text = p.sub(_replace, text)
+
+        return text
+
+
+    def images(self, text):
+        """Process images.
+
+        This function process images tags, with or without links. Images
+        can have vertical and/or horizontal alignment, and can be resized
+        unefficiently using width and height tags.
+
+        ---
+        h1. Images
+
+        An image is generated by enclosing the image source in @!@:
+
+        pre. !/path/to/image!
+
+        You may optionally specify an alternative text for the image, which
+        will also be used as its title:
+
+        pre. !image.jpg (Nice picture)!
+
+        Becomes:
+
+        pre. <p><img src="image.jpg" alt="Nice picture" title="Nice picture" /></p>
+
+        If you want to make the image point to a link, simply append a
+        comma and the URL(Universal Republic of Love) to the image:
+
+        pre. !image.jpg!:http://diveintopython.org
+
+        Images can also be resized. These are all equivalent:
+
+        pre. !image.jpg 10x20!
+        !image.jpg 10w 20h!
+        !image.jpg 20h 10w!
+
+        The image @image.jpg@ will be resized to width 10 and height 20.
+
+        Modifiers to the @<img>@ tag go after the opening @!@:
+
+        pre. !(class#id)^image.jpg!
+
+        Allowed modifiers include:
+        
+        dl. &lt;:Align the image to the left (causes the image to float if CSS options are enabled). 
+        &gt;:Align the image to the right (causes the image to float if CSS options are enabled). 
+        - (dash):Aligns the image to the middle. 
+        ^:Aligns the image to the top. 
+        ~ (tilde):Aligns the image to the bottom. 
+        {style rule}:Applies a CSS style rule to the image. 
+        (class) or (#id) or (class#id):Applies a CSS class and/or id to the image. 
+        ( (one or more):Pads 1em on the left for each '(' character. 
+        ) (one or more):Pads 1em on the right for each ')' character. 
+
+        Images receive the class "top" when using top alignment, "bottom" 
+        for bottom alignment and "middle" for middle alignment.
+        """
+        # Compile the beast.
+        p = re.compile(r'''\!               # Opening !
+                           %(iattr)s        # Image attributes
+                           (?P<src>%(url)s) # Image src
+                           \s?              # Optional whitesapce
+                           (                #
+                               \(           #
+                               (?P<alt>.*?) # Optional (alt) attribute
+                               \)           #
+                           )?               #
+                           \s?              # Optional whitespace
+                           %(resize)s       # Resize parameters
+                           \!               # Closing !
+                           (                # Optional link
+                               :            #    starts with ':'
+                               (?P<link>    #    
+                               %(url)s      #    link HREF
+                               )            #
+                           )?               #
+                        ''' % self.res, re.VERBOSE)
+
+        for m in p.finditer(text):
+            c = m.groupdict('')
+
+            # Build the parameters for the <img /> tag.
+            attributes = self.parse_params(c['parameters'], align_type='image')
+            attributes.update(c)
+            if attributes['alt']:
+                attributes['title'] = attributes['alt']
+
+            # Append height and width.
+            attributes['width'] = m.groups()[5] or m.groups()[7] or m.groups()[10]
+            attributes['height'] = m.groups()[6] or m.groups()[8] or m.groups()[9]
+
+            # Create the image tag.
+            tag = self.image(attributes)
+
+            text = text.replace(m.group(), tag)
+        
+        return text
+
+
+    def image(self, attributes):
+        """Process each image.
+
+        This method builds the <img> tag for each image in the text. It's
+        separated from the 'images' method so it can be easily overriden when
+        subclassing Textiler. Useful if you want to download and/or process
+        the images, for example.
+        """
+        link = attributes['link']
+        del attributes['link']
+        del attributes['parameters']
+
+        # Build the tag.
+        tag = self.build_open_tag('img', attributes, single=1)
+
+        if link:
+            href = preg_replace('&(?!(#|amp))', '&amp;', link)
+            tag = '<a href="%s">%s</a>' % (href, tag)
+
+        return tag
+
+
+    def links(self, text):
+        """Process links.
+
+        This function is responsible for processing links. It has
+        some nice shortcuts to Google, Amazon and IMDB queries.
+
+        ---
+        h1. Links
+
+        A links is done the following way:
+
+        pre. "This is the text link":http://example.com
+
+        The result from this markup is:
+
+        pre. <p><a href="http://example.com">This is the text link</a></p>
+
+        You can add an optional @title@ attribute:
+
+        pre. "This is the text link(This is the title)":http://example.com
+
+        The link can be customised as well:
+
+        pre. "(nospam)E-mail me please":mailto:someone@example.com
+
+        You can use either single or double quotes. They must be enclosed in
+        whitespace, punctuation or brackets:
+
+        pre. You["gotta":http://example.com]seethis!
+
+        If you are going to reference the same link a couple of times, you
+        can define a lookup list anywhere on your document:
+
+        pre. [python]http://www.python.org
+
+        Links to the Python website can then be defined the following way:
+
+        pre. "Check this":python
+
+        There are also shortcuts for Amazon, IMDB(Internet Movie DataBase) and
+        Google queries:
+
+        pre. "Has anyone seen this guy?":imdb:Stephen+Fry
+        "Really nice book":amazon:Goedel+Escher+Bach
+        "PyBlosxom":google
+        ["Using Textile and Blosxom with Python":google:python blosxom textile]
+
+        Becomes:
+
+        pre. <a href="http://www.imdb.com/Find?for=Stephen+Fry">Has anyone seen this guy?</a>
+        <a href="http://www.amazon.com/exec/obidos/external-search?index=blended&amp;keyword=Goedel+Escher+Bach">Really nice book</a>
+        <a href="http://www.google.com/search?q=PyBlosxom">PyBlosxom</a>
+        <a href="http://www.google.com/search?q=python+blosxom+textile">Using Textile and Blosxom with Python</a>
+        """
+        linkres = [r'''\[                           # [
+                       (?P<quote>"|')               # Opening quotes
+                       %(lattr)s                    # Link attributes
+                       (?P<text>[^"]+?)             # Link text
+                       \s?                          # Optional whitespace
+                       (?:\((?P<title>[^\)]+?)\))?  # Optional (title)
+                       (?P=quote)                   # Closing quotes
+                       :                            # :
+                       (?P<href>[^\]]+)             # HREF
+                       \]                           # ]
+                    ''' % self.res,
+                   r'''(?P<quote>"|')               # Opening quotes
+                       %(lattr)s                    # Link attributes
+                       (?P<text>[^"]+?)             # Link text
+                       \s?                          # Optional whitespace
+                       (?:\((?P<title>[^\)]+?)\))?  # Optional (title)
+                       (?P=quote)                   # Closing quotes
+                       :                            # :
+                       (?P<href>%(url)s)            # HREF
+                    ''' % self.res]
+
+        for linkre in linkres:
+            p = re.compile(linkre, re.VERBOSE)
+            for m in p.finditer(text):
+                c = m.groupdict('')
+
+                attributes = self.parse_params(c['parameters'])
+                attributes['title'] = c['title'].replace('"', '&quot;')
+
+                # Search lookup list.
+                link = self._links.get(c['href'], None) or c['href']
+
+                # Hyperlinks for Amazon, IMDB and Google searches.
+                parts = link.split(':', 1)
+                proto = parts[0]
+                if len(parts) == 2:
+                    query = parts[1]
+                else:
+                    query = c['text']
+
+                query = query.replace(' ', '+')
+
+                # Look for smart search.
+                if self.searches.has_key(proto):
+                    link = self.searches[proto] % query
+                
+                # Fix URL.
+                attributes['href'] = preg_replace('&(?!(#|amp))', '&amp;', link)
+
+                open_tag = self.build_open_tag('a', attributes)
+                close_tag = '</a>'
+
+                repl = open_tag + c['text'] + close_tag
+
+                text = text.replace(m.group(), repl)
+
+        return text
+
+
+    def format(self, text):
+        """Text formatting.
+
+        This function basically defines the order on which the 
+        formatting is applied.
+        """
+        text = self.qtags(text)
+        text = self.images(text)
+        text = self.links(text)
+        text = self.acronym(text)
+        text = self.glyphs(text)
+
+        return text
+
+
+    def inline(self, text):
+        """Inline formatting.
+
+        This function calls the formatting on the inline text,
+        taking care to avoid the escaped parts.
+
+        ---
+        h1. Inline 
+
+        Inline formatting is applied within a block of text.
+        """
+        if not re.search(r'''==(.*?)==''', text):
+            text = self.format(text)
+
+        else:
+            lines = []
+            # Else split the text into an array at <>.
+            for line in re.split('(==.*?==)', text):
+                if not re.match('==.*?==', line):
+                    line = self.format(line)
+                else:
+                    line = line[2:-2]
+
+                lines.append(line)
+            
+            text = ''.join(lines)
+
+        return text
+            
+
+def textile(text, **args):
+    """This is Textile.
+
+    Generates XHTML from a simple markup developed by Dean Allen.
+
+    This function should be called like this:
+    
+        textile(text, head_offset=0, validate=0, sanitize=0,
+                encoding='latin-1', output='ASCII')
+    """
+    return Textiler(text).process(**args)
+
+
+if __name__ == '__main__':
+    print textile('tell me about textile.', head_offset=1)
Index: /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/__init__.py
===================================================================
--- /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/__init__.py (revision 3)
+++ /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/__init__.py (revision 3)
@@ -0,0 +1,1 @@
+from webhelpers.rails import *
Index: /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/markdown.py
===================================================================
--- /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/markdown.py (revision 3)
+++ /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/markdown.py (revision 3)
@@ -0,0 +1,1874 @@
+#!/usr/bin/env python
+
+SPEED_TEST = 0
+
+"""
+====================================================================
+IF YOU ARE LOOKING TO EXTEND MARKDOWN, SEE THE "FOOTNOTES" SECTION
+====================================================================
+
+Python-Markdown
+===============
+
+Converts Markdown to HTML.  Basic usage as a module:
+
+    import markdown
+    html = markdown.markdown(your_text_string)
+
+Started by [Manfred Stienstra](http://www.dwerg.net/).  Continued and
+maintained  by [Yuri Takhteyev](http://www.freewisdom.org).
+
+Project website: http://www.freewisdom.org/projects/python-markdown
+Contact: yuri [at] freewisdom.org
+
+License: GPL 2 (http://www.gnu.org/copyleft/gpl.html) or BSD
+
+Version: 1.5 (May 15, 2006)
+
+For changelog, see end of file
+"""
+
+import re, sys, os, random
+
+# set debug level: 3 none, 2 critical, 1 informative, 0 all
+(VERBOSE, INFO, CRITICAL, NONE) = range(4)
+
+MESSAGE_THRESHOLD = CRITICAL
+
+def message(level, text) :
+    if level >= MESSAGE_THRESHOLD :
+        print text
+
+
+# --------------- CONSTANTS YOU MIGHT WANT TO MODIFY -----------------
+
+# all tabs will be expanded to up to this many spaces
+TAB_LENGTH = 4
+ENABLE_ATTRIBUTES = 1
+SMART_EMPHASIS = 1
+
+# --------------- CONSTANTS YOU _SHOULD NOT_ HAVE TO CHANGE ----------
+
+FN_BACKLINK_TEXT = "zz1337820767766393qq"
+# a template for html placeholders
+HTML_PLACEHOLDER_PREFIX = "qaodmasdkwaspemas"
+HTML_PLACEHOLDER = HTML_PLACEHOLDER_PREFIX + "%dajkqlsmdqpakldnzsdfls"
+
+BLOCK_LEVEL_ELEMENTS = ['p', 'div', 'blockquote', 'pre', 'table',
+                        'dl', 'ol', 'ul', 'script', 'noscript',
+                        'form', 'fieldset', 'iframe', 'math', 'ins',
+                        'del', 'hr', 'hr/']
+
+def is_block_level (tag) :
+    return ( (tag in BLOCK_LEVEL_ELEMENTS) or
+             (tag[0] == 'h' and tag[1] in "0123456789") )
+
+"""
+======================================================================
+========================== NANODOM ===================================
+======================================================================
+
+The three classes below implement some of the most basic DOM
+methods.  I use this instead of minidom because I need a simpler
+functionality and do not want to require additional libraries.
+
+Importantly, NanoDom does not do normalization, which is what we
+want. It also adds extra white space when converting DOM to string
+"""
+
+
+class Document :
+
+    def appendChild(self, child) :
+        self.documentElement = child
+        child.parent = self
+        self.entities = {}
+
+    def createElement(self, tag, textNode=None) :
+        el = Element(tag)
+        el.doc = self
+        if textNode :
+            el.appendChild(self.createTextNode(textNode))
+        return el
+
+    def createTextNode(self, text) :
+        node = TextNode(text)
+        node.doc = self
+        return node
+
+    def createEntityReference(self, entity):
+        if entity not in self.entities:
+            self.entities[entity] = EntityReference(entity)
+        return self.entities[entity]
+
+    def toxml (self) :
+        return self.documentElement.toxml()
+
+    def normalizeEntities(self, text) :
+
+        pairs = [ #("&", "&amp;"),
+                  ("<", "&lt;"),
+                  (">", "&gt;"),
+                  ("\"", "&quot;")]
+
+        for old, new in pairs :
+            text = text.replace(old, new)
+        return text
+
+    def find(self, test) :
+        return self.documentElement.find(test)
+
+    def unlink(self) :
+        self.documentElement.unlink()
+        self.documentElement = None
+
+
+class Element :
+
+    type = "element"
+
+    def __init__ (self, tag) :
+
+        self.nodeName = tag
+        self.attributes = []
+        self.attribute_values = {}
+        self.childNodes = []
+
+    def unlink(self) :
+        for child in self.childNodes :
+            if child.type == "element" :
+                child.unlink()
+        self.childNodes = None
+
+    def setAttribute(self, attr, value) :
+        if not attr in self.attributes :
+            self.attributes.append(attr)
+
+        self.attribute_values[attr] = value
+
+    def insertChild(self, position, child) :
+        self.childNodes.insert(position, child)
+        child.parent = self
+
+    def removeChild(self, child) :
+        self.childNodes.remove(child)
+
+    def replaceChild(self, oldChild, newChild) :
+        position = self.childNodes.index(oldChild)
+        self.removeChild(oldChild)
+        self.insertChild(position, newChild)
+
+    def appendChild(self, child) :
+        self.childNodes.append(child)
+        child.parent = self
+
+    def handleAttributes(self) :
+        pass
+
+    def find(self, test, depth=0) :
+        """ Returns a list of descendants that pass the test function """
+        matched_nodes = []
+        for child in self.childNodes :
+            if test(child) :
+                matched_nodes.append(child)
+            if child.type == "element" :
+                matched_nodes += child.find(test, depth+1)
+        return matched_nodes
+
+    def toxml(self):
+        if ENABLE_ATTRIBUTES :
+            for child in self.childNodes:
+                child.handleAttributes()
+        buffer = ""
+        if self.nodeName in ['h1', 'h2', 'h3', 'h4'] :
+            buffer += "\n"
+        elif self.nodeName in ['li'] :
+            buffer += "\n "
+        buffer += "<" + self.nodeName
+        for attr in self.attributes :
+            value = self.attribute_values[attr]
+            value = self.doc.normalizeEntities(value)
+            buffer += ' %s="%s"' % (attr, value)
+        if self.childNodes or self.nodeName in ['blockquote']:
+            buffer += ">"
+            for child in self.childNodes :
+                buffer += child.toxml()
+            if self.nodeName == 'p' :
+                buffer += "\n"
+            elif self.nodeName == 'li' :
+                buffer += "\n "
+            buffer += "</%s>" % self.nodeName
+        else :
+            buffer += "/>"
+        if self.nodeName in ['p', 'li', 'ul', 'ol',
+                             'h1', 'h2', 'h3', 'h4'] :
+            buffer += "\n"
+
+        return buffer
+
+
+class TextNode :
+
+    type = "text"
+    attrRegExp = re.compile(r'\{@([^\}]*)=([^\}]*)}') # {@id=123}
+
+    def __init__ (self, text) :
+        self.value = text        
+
+    def attributeCallback(self, match) :
+        self.parent.setAttribute(match.group(1), match.group(2))
+
+    def handleAttributes(self) :
+        self.value = self.attrRegExp.sub(self.attributeCallback, self.value)
+
+    def toxml(self) :
+        text = self.value
+        if not text.startswith(HTML_PLACEHOLDER_PREFIX):
+            if self.parent.nodeName == "p" :
+                text = text.replace("\n", "\n   ")
+            elif (self.parent.nodeName == "li"
+                  and self.parent.childNodes[0]==self):
+                text = "\n     " + text.replace("\n", "\n     ")
+        text = self.doc.normalizeEntities(text)
+        return text
+
+
+class EntityReference:
+
+    type = "entity_ref"
+
+    def __init__(self, entity):
+        self.entity = entity
+
+    def handleAttributes(self):
+        pass
+
+    def toxml(self):
+        return "&" + self.entity + ";"
+
+
+"""
+======================================================================
+========================== PRE-PROCESSORS ============================
+======================================================================
+
+Preprocessors munge source text before we start doing anything too
+complicated.
+
+Each preprocessor implements a "run" method that takes a pointer to
+a list of lines of the document, modifies it as necessary and
+returns either the same pointer or a pointer to a new list.
+"""
+
+class HeaderPreprocessor :
+
+    """
+       Replaces underlined headers with hashed headers to avoid
+       the nead for lookahead later.
+    """
+
+    def run (self, lines) :
+
+        for i in range(len(lines)) :
+            if not lines[i] :
+                continue
+
+            if lines[i].startswith("#") :
+                lines.insert(i+1, "\n")
+
+            if (i+1 <= len(lines)
+                  and lines[i+1]
+                  and lines[i+1][0] in ['-', '=']) :
+
+                underline = lines[i+1].strip()
+
+                if underline == "="*len(underline) :
+                    lines[i] = "# " + lines[i].strip()
+                    lines[i+1] = ""
+                elif underline == "-"*len(underline) :
+                    lines[i] = "## " + lines[i].strip()
+                    lines[i+1] = ""
+
+        return lines
+
+HEADER_PREPROCESSOR = HeaderPreprocessor()
+
+class LinePreprocessor :
+    """Deals with HR lines (needs to be done before processing lists)"""
+
+    def run (self, lines) :
+        for i in range(len(lines)) :
+            if self._isLine(lines[i]) :
+                lines[i] = "<hr />"
+        return lines
+
+    def _isLine(self, block) :
+        """Determines if a block should be replaced with an <HR>"""
+        if block.startswith("    ") : return 0  # a code block
+        text = "".join([x for x in block if not x.isspace()])
+        if len(text) <= 2 :
+            return 0
+        for pattern in ['isline1', 'isline2', 'isline3'] :
+            m = RE.regExp[pattern].match(text)
+            if (m and m.group(1)) :
+                return 1
+        else:
+            return 0
+
+LINE_PREPROCESSOR = LinePreprocessor()
+
+
+class LineBreaksPreprocessor :
+    """Replaces double spaces at the end of the lines with <br/ >."""
+
+    def run (self, lines) :
+        for i in range(len(lines)) :
+            if (lines[i].endswith("  ")
+                and not RE.regExp['tabbed'].match(lines[i]) ):
+                lines[i] += "<br />"
+        return lines
+
+LINE_BREAKS_PREPROCESSOR = LineBreaksPreprocessor()
+
+
+class HtmlBlockPreprocessor :
+    """Removes html blocks from self.lines"""
+
+    def run (self, lines) :
+        new_blocks = []
+        text = "\n".join(lines)
+        for block in text.split("\n\n") :
+            if block.startswith("\n") :
+                block = block[1:]
+            if ( (block.startswith("<") and block.rstrip().endswith(">"))
+                 and (block[1] in ["!", "?", "@", "%"]
+                      or is_block_level( block[1:].replace(">", " ")
+                                         .split()[0].lower()))) :
+                new_blocks.append(
+                    self.stash.store(block.strip()))
+            else :
+                new_blocks.append(block)
+        return "\n\n".join(new_blocks).split("\n")
+
+HTML_BLOCK_PREPROCESSOR = HtmlBlockPreprocessor()
+
+
+class ReferencePreprocessor :
+
+    def run (self, lines) :
+        new_text = [];
+        for line in lines:
+            m = RE.regExp['reference-def'].match(line)
+            if m:
+                id = m.group(2).strip().lower()
+                title = dequote(m.group(4).strip()) #.replace('"', "&quot;")
+                self.references[id] = (m.group(3), title)
+            else:
+                new_text.append(line)
+        return new_text #+ "\n"
+
+REFERENCE_PREPROCESSOR = ReferencePreprocessor()
+
+"""
+======================================================================
+========================== INLINE PATTERNS ===========================
+======================================================================
+
+Inline patterns such as *emphasis* are handled by means of auxiliary
+objects, one per pattern.  Each pattern object uses a single regular
+expression and needs support the following methods:
+
+  pattern.getCompiledRegExp() - returns a regular expression
+
+  pattern.handleMatch(m, doc) - takes a match object and returns
+                                a NanoDom node (as a part of the provided
+                                doc) or None
+
+All of python markdown's built-in patterns subclass from BasePatter,
+but you can add additional patterns that don't.
+
+Also note that all the regular expressions used by inline must
+capture the whole block.  For this reason, they all start with
+'^(.*)' and end with '(.*)!'.  In case with built-in expression
+BasePattern takes care of adding the "^(.*)" and "(.*)!".
+
+Finally, the order in which regular expressions are applied is very
+important - e.g. if we first replace http://.../ links with <a> tags
+and _then_ try to replace inline html, we would end up with a mess.
+So, we apply the expressions in the following order:
+
+       * escape and backticks have to go before everything else, so
+         that we can preempt any markdown patterns by escaping them.
+
+       * then we handle auto-links (must be done before inline html)
+
+       * then we handle inline HTML.  At this point we will simply
+         replace all inline HTML strings with a placeholder and add
+         the actual HTML to a hash.
+
+       * then inline images (must be done before links)
+
+       * then bracketed links, first regular then reference-style
+
+       * finally we apply strong and emphasis
+"""
+
+NOBRACKET = r'[^\]\[]*'
+BRK = ( r'\[('
+        + (NOBRACKET + r'(\['+NOBRACKET)*6
+        + (NOBRACKET+ r'\])*'+NOBRACKET)*6
+        + NOBRACKET + r')\]' )
+
+BACKTICK_RE = r'\`([^\`]*)\`'                    # `e= m*c^2`
+DOUBLE_BACKTICK_RE =  r'\`\`(.*)\`\`'            # ``e=f("`")``
+ESCAPE_RE = r'\\(.)'                             # \<
+EMPHASIS_RE = r'\*([^\*]*)\*'                    # *emphasis*
+STRONG_RE = r'\*\*(.*)\*\*'                      # **strong**
+STRONG_EM_RE = r'\*\*\*([^_]*)\*\*\*'            # ***strong***
+
+if SMART_EMPHASIS:
+    EMPHASIS_2_RE = r'(?<!\S)_(\S[^_]*)_'        # _emphasis_
+else :
+    EMPHASIS_2_RE = r'_([^_]*)_'                 # _emphasis_
+
+STRONG_2_RE = r'__([^_]*)__'                     # __strong__
+STRONG_EM_2_RE = r'___([^_]*)___'                # ___strong___
+
+LINK_RE = BRK + r'\s*\(([^\)]*)\)'               # [text](url)
+LINK_ANGLED_RE = BRK + r'\s*\(<([^\)]*)>\)'      # [text](<url>)
+IMAGE_LINK_RE = r'\!' + BRK + r'\s*\(([^\)]*)\)' # ![alttxt](http://x.com/)
+REFERENCE_RE = BRK+ r'\s*\[([^\]]*)\]'           # [Google][3]
+IMAGE_REFERENCE_RE = r'\!' + BRK + '\s*\[([^\]]*)\]' # ![alt text][2]
+NOT_STRONG_RE = r'( \* )'                        # stand-alone * or _
+AUTOLINK_RE = r'<(http://[^>]*)>'                # <http://www.123.com>
+AUTOMAIL_RE = r'<([^> ]*@[^> ]*)>'               # <me@example.com>
+HTML_RE = r'(\<[^\>]*\>)'                        # <...>
+ENTITY_RE = r'(&[\#a-zA-Z0-9]*;)'                # &amp;
+
+class BasePattern:
+
+    def __init__ (self, pattern) :
+        self.pattern = pattern
+        self.compiled_re = re.compile("^(.*)%s(.*)$" % pattern, re.DOTALL)
+
+    def getCompiledRegExp (self) :
+        return self.compiled_re
+
+class SimpleTextPattern (BasePattern) :
+
+    def handleMatch(self, m, doc) :
+        return doc.createTextNode(m.group(2))
+
+class SimpleTagPattern (BasePattern):
+
+    def __init__ (self, pattern, tag) :
+        BasePattern.__init__(self, pattern)
+        self.tag = tag
+
+    def handleMatch(self, m, doc) :
+        el = doc.createElement(self.tag)
+        el.appendChild(doc.createTextNode(m.group(2)))
+        return el
+
+class BacktickPattern (BasePattern):
+
+    def __init__ (self, pattern):
+        BasePattern.__init__(self, pattern)
+        self.tag = "code"
+
+    def handleMatch(self, m, doc) :
+        el = doc.createElement(self.tag)
+        text = m.group(2).strip()
+        text = text.replace("&", "&amp;")
+        el.appendChild(doc.createTextNode(text))
+        return el
+
+
+class DoubleTagPattern (SimpleTagPattern) :
+
+    def handleMatch(self, m, doc) :
+        tag1, tag2 = self.tag.split(",")
+        el1 = doc.createElement(tag1)
+        el2 = doc.createElement(tag2)
+        el1.appendChild(el2)
+        el2.appendChild(doc.createTextNode(m.group(2)))
+        return el1
+
+
+class HtmlPattern (BasePattern):
+
+    def handleMatch (self, m, doc) :
+        place_holder = self.stash.store(m.group(2))
+        return doc.createTextNode(place_holder)
+
+
+class LinkPattern (BasePattern):
+
+    def handleMatch(self, m, doc) :
+        el = doc.createElement('a')
+        el.appendChild(doc.createTextNode(m.group(2)))
+        parts = m.group(9).split()
+        # We should now have [], [href], or [href, title]
+        if parts :
+            el.setAttribute('href', parts[0])
+        else :
+            el.setAttribute('href', "")
+        if len(parts) > 1 :
+            # we also got a title
+            title = " ".join(parts[1:]).strip()
+            title = dequote(title) #.replace('"', "&quot;")
+            el.setAttribute('title', title)
+        return el
+
+
+class ImagePattern (BasePattern):
+
+    def handleMatch(self, m, doc):
+        el = doc.createElement('img')
+        src_parts = m.group(9).split()
+        el.setAttribute('src', src_parts[0])
+        if len(src_parts) > 1 :
+            el.setAttribute('title', dequote(" ".join(src_parts[1:])))
+        if ENABLE_ATTRIBUTES :
+            text = doc.createTextNode(m.group(2))
+            el.appendChild(text)
+            text.handleAttributes()
+            truealt = text.value
+            el.childNodes.remove(text)
+        else:
+            truealt = m.group(2)
+        el.setAttribute('alt', truealt)
+        return el
+
+class ReferencePattern (BasePattern):
+
+    def handleMatch(self, m, doc):
+        if m.group(9) :
+            id = m.group(9).lower()
+        else :
+            # if we got something like "[Google][]"
+            # we'll use "google" as the id
+            id = m.group(2).lower()
+        if not self.references.has_key(id) : # ignore undefined refs
+            return None
+        href, title = self.references[id]
+        text = m.group(2)
+        return self.makeTag(href, title, text, doc)
+
+    def makeTag(self, href, title, text, doc):
+        el = doc.createElement('a')
+        el.setAttribute('href', href)
+        if title :
+            el.setAttribute('title', title)
+        el.appendChild(doc.createTextNode(text))
+        return el
+
+
+class ImageReferencePattern (ReferencePattern):
+
+    def makeTag(self, href, title, text, doc):
+        el = doc.createElement('img')
+        el.setAttribute('src', href)
+        if title :
+            el.setAttribute('title', title)
+        el.setAttribute('alt', text)
+        return el
+
+
+class AutolinkPattern (BasePattern):
+
+    def handleMatch(self, m, doc):
+        el = doc.createElement('a')
+        el.setAttribute('href', m.group(2))
+        el.appendChild(doc.createTextNode(m.group(2)))
+        return el
+
+class AutomailPattern (BasePattern):
+
+    def handleMatch(self, m, doc) :
+        el = doc.createElement('a')
+        email = m.group(2)
+        if email.startswith("mailto:"):
+            email = email[len("mailto:"):]
+        for letter in email:
+            entity = doc.createEntityReference("#%d" % ord(letter))
+            el.appendChild(entity)
+        mailto = "mailto:" + email
+        mailto = "".join(['&#%d;' % ord(letter) for letter in mailto])
+        el.setAttribute('href', mailto)
+        return el
+
+ESCAPE_PATTERN          = SimpleTextPattern(ESCAPE_RE)
+NOT_STRONG_PATTERN      = SimpleTextPattern(NOT_STRONG_RE)
+
+BACKTICK_PATTERN        = BacktickPattern(BACKTICK_RE)
+DOUBLE_BACKTICK_PATTERN = BacktickPattern(DOUBLE_BACKTICK_RE)
+STRONG_PATTERN          = SimpleTagPattern(STRONG_RE, 'strong')
+STRONG_PATTERN_2        = SimpleTagPattern(STRONG_2_RE, 'strong')
+EMPHASIS_PATTERN        = SimpleTagPattern(EMPHASIS_RE, 'em')
+EMPHASIS_PATTERN_2      = SimpleTagPattern(EMPHASIS_2_RE, 'em')
+
+STRONG_EM_PATTERN       = DoubleTagPattern(STRONG_EM_RE, 'strong,em')
+STRONG_EM_PATTERN_2     = DoubleTagPattern(STRONG_EM_2_RE, 'strong,em')
+
+LINK_PATTERN            = LinkPattern(LINK_RE)
+LINK_ANGLED_PATTERN     = LinkPattern(LINK_ANGLED_RE)
+IMAGE_LINK_PATTERN      = ImagePattern(IMAGE_LINK_RE)
+IMAGE_REFERENCE_PATTERN = ImageReferencePattern(IMAGE_REFERENCE_RE)
+REFERENCE_PATTERN       = ReferencePattern(REFERENCE_RE)
+
+HTML_PATTERN            = HtmlPattern(HTML_RE)
+ENTITY_PATTERN          = HtmlPattern(ENTITY_RE)
+
+AUTOLINK_PATTERN        = AutolinkPattern(AUTOLINK_RE)
+AUTOMAIL_PATTERN        = AutomailPattern(AUTOMAIL_RE)
+
+
+"""
+======================================================================
+========================== POST-PROCESSORS ===========================
+======================================================================
+
+Markdown also allows post-processors, which are similar to
+preprocessors in that they need to implement a "run" method.  Unlike
+pre-processors, they take a NanoDom document as a parameter and work
+with that.
+#
+There are currently no standard post-processors, but the footnote
+extension below uses one.
+"""
+"""
+======================================================================
+========================== MISC AUXILIARY CLASSES ====================
+======================================================================
+"""
+
+class HtmlStash :
+    """This class is used for stashing HTML objects that we extract
+        in the beginning and replace with place-holders."""
+
+    def __init__ (self) :
+        self.html_counter = 0 # for counting inline html segments
+        self.rawHtmlBlocks=[]
+
+    def store(self, html) :
+        """Saves an HTML segment for later reinsertion.  Returns a
+           placeholder string that needs to be inserted into the
+           document.
+
+           @param html: an html segment
+           @returns : a placeholder string """
+        self.rawHtmlBlocks.append(html)
+        placeholder = HTML_PLACEHOLDER % self.html_counter
+        self.html_counter += 1
+        return placeholder
+
+
+class BlockGuru :
+
+    def _findHead(self, lines, fn, allowBlank=0) :
+
+        """Functional magic to help determine boundaries of indented
+           blocks.
+
+           @param lines: an array of strings
+           @param fn: a function that returns a substring of a string
+                      if the string matches the necessary criteria
+           @param allowBlank: specifies whether it's ok to have blank
+                      lines between matching functions
+           @returns: a list of post processes items and the unused
+                      remainder of the original list"""
+
+        items = []
+        item = -1
+
+        i = 0 # to keep track of where we are
+
+        for line in lines :
+
+            if not line.strip() and not allowBlank:
+                return items, lines[i:]
+
+            if not line.strip() and allowBlank:
+                # If we see a blank line, this _might_ be the end
+                i += 1
+
+                # Find the next non-blank line
+                for j in range(i, len(lines)) :
+                    if lines[j].strip() :
+                        next = lines[j]
+                        break
+                else :
+                    # There is no more text => this is the end
+                    break
+
+                # Check if the next non-blank line is still a part of the list
+
+                part = fn(next)
+
+                if part :
+                    items.append("")
+                    continue
+                else :
+                    break # found end of the list
+
+            part = fn(line)
+
+            if part :
+                items.append(part)
+                i += 1
+                continue
+            else :
+                return items, lines[i:]
+        else :
+            i += 1
+
+        return items, lines[i:]
+
+
+    def detabbed_fn(self, line) :
+        """ An auxiliary method to be passed to _findHead """
+        m = RE.regExp['tabbed'].match(line)
+        if m:
+            return m.group(4)
+        else :
+            return None
+
+
+    def detectTabbed(self, lines) :
+
+        return self._findHead(lines, self.detabbed_fn,
+                              allowBlank = 1)
+
+
+def print_error(string):
+    """Print an error string to stderr"""
+    sys.stderr.write(string +'\n')
+
+
+def dequote(string) :
+    """ Removes quotes from around a string """
+    if ( ( string.startswith('"') and string.endswith('"'))
+         or (string.startswith("'") and string.endswith("'")) ) :
+        return string[1:-1]
+    else :
+        return string
+
+"""
+======================================================================
+========================== CORE MARKDOWN =============================
+======================================================================
+
+This stuff is ugly, so if you are thinking of extending the syntax,
+see first if you can do it via pre-processors, post-processors,
+inline patterns or a combination of the three.
+"""
+
+class CorePatterns :
+    """This class is scheduled for removal as part of a refactoring
+        effort."""
+
+    patterns = {
+        'header':          r'(#*)([^#]*)(#*)', # # A title
+        'reference-def' :  r'(\ ?\ ?\ ?)\[([^\]]*)\]:\s*([^ ]*)(.*)',
+                           # [Google]: http://www.google.com/
+        'containsline':    r'([-]*)$|^([=]*)', # -----, =====, etc.
+        'ol':              r'[ ]{0,3}[\d]*\.\s+(.*)', # 1. text
+        'ul':              r'[ ]{0,3}[*+-]\s+(.*)', # "* text"
+        'isline1':         r'(\**)', # ***
+        'isline2':         r'(\-*)', # ---
+        'isline3':         r'(\_*)', # ___
+        'tabbed':          r'((\t)|(    ))(.*)', # an indented line
+        'quoted' :         r'> ?(.*)', # a quoted block ("> ...")
+    }
+
+    def __init__ (self) :
+
+        self.regExp = {}
+        for key in self.patterns.keys() :
+            self.regExp[key] = re.compile("^%s$" % self.patterns[key],
+                                          re.DOTALL)
+
+        self.regExp['containsline'] = re.compile(r'^([-]*)$|^([=]*)$', re.M)
+
+RE = CorePatterns()
+
+
+class Markdown:
+    """ Markdown formatter class for creating an html document from
+        Markdown text """
+
+
+    def __init__(self, source=None):
+        """Creates a new Markdown instance.
+
+           @param source: The text in Markdown format. """
+        
+        if isinstance(source, unicode):
+            source = source.encode('utf8')
+        self.source = source
+        self.blockGuru = BlockGuru()
+        self.registeredExtensions = []
+        self.stripTopLevelTags = 1
+
+        self.preprocessors = [ HEADER_PREPROCESSOR,
+                               LINE_PREPROCESSOR,
+                               HTML_BLOCK_PREPROCESSOR,
+                               LINE_BREAKS_PREPROCESSOR,
+                               # A footnote preprocessor will
+                               # get inserted here
+                               REFERENCE_PREPROCESSOR ]
+
+
+        self.postprocessors = [] # a footnote postprocessor will get
+                                 # inserted later
+
+        self.prePatterns = []
+        
+
+        self.inlinePatterns = [ DOUBLE_BACKTICK_PATTERN,
+                                BACKTICK_PATTERN,
+                                ESCAPE_PATTERN,
+                                IMAGE_LINK_PATTERN,
+                                IMAGE_REFERENCE_PATTERN,
+                                REFERENCE_PATTERN,
+                                LINK_ANGLED_PATTERN,
+                                LINK_PATTERN,
+                                AUTOLINK_PATTERN,
+                                AUTOMAIL_PATTERN,
+                                HTML_PATTERN,
+                                ENTITY_PATTERN,
+                                NOT_STRONG_PATTERN,
+                                STRONG_EM_PATTERN,
+                                STRONG_EM_PATTERN_2,
+                                STRONG_PATTERN,
+                                STRONG_PATTERN_2,
+                                EMPHASIS_PATTERN,
+                                EMPHASIS_PATTERN_2
+                                # The order of the handlers matters!!!
+                                ]
+
+        self.reset()
+
+    def registerExtension(self, extension) :
+        self.registeredExtensions.append(extension)
+
+    def reset(self) :
+        """Resets all state variables so that we can start
+            with a new text."""
+        self.references={}
+        self.htmlStash = HtmlStash()
+
+        HTML_BLOCK_PREPROCESSOR.stash = self.htmlStash
+        REFERENCE_PREPROCESSOR.references = self.references
+        HTML_PATTERN.stash = self.htmlStash
+        ENTITY_PATTERN.stash = self.htmlStash
+        REFERENCE_PATTERN.references = self.references
+        IMAGE_REFERENCE_PATTERN.references = self.references
+
+        for extension in self.registeredExtensions :
+            extension.reset()
+
+
+    def _transform(self):
+        """Transforms the Markdown text into a XHTML body document
+
+           @returns: A NanoDom Document """
+
+        # Setup the document
+
+        self.doc = Document()
+        self.top_element = self.doc.createElement("span")
+        self.top_element.appendChild(self.doc.createTextNode('\n'))
+        self.top_element.setAttribute('class', 'markdown')
+        self.doc.appendChild(self.top_element)
+
+        # Fixup the source text
+        text = self.source.strip()
+        text = text.replace("\r\n", "\n").replace("\r", "\n")
+        text += "\n\n"
+        text = text.expandtabs(TAB_LENGTH)
+
+        # Split into lines and run the preprocessors that will work with
+        # self.lines
+
+        self.lines = text.split("\n")
+
+        # Run the pre-processors on the lines
+        for prep in self.preprocessors :
+            self.lines = prep.run(self.lines)
+
+        # Create a NanoDom tree from the lines and attach it to Document
+
+
+        buffer = []
+        for line in self.lines :
+            if line.startswith("#") :
+                self._processSection(self.top_element, buffer)
+                buffer = [line]
+            else :
+                buffer.append(line)
+        self._processSection(self.top_element, buffer)
+        
+        #self._processSection(self.top_element, self.lines)
+
+        # Not sure why I put this in but let's leave it for now.
+        self.top_element.appendChild(self.doc.createTextNode('\n'))
+
+        # Run the post-processors
+        for postprocessor in self.postprocessors :
+            postprocessor.run(self.doc)
+
+        return self.doc
+
+
+    def _processSection(self, parent_elem, lines,
+                        inList = 0, looseList = 0) :
+
+        """Process a section of a source document, looking for high
+           level structural elements like lists, block quotes, code
+           segments, html blocks, etc.  Some those then get stripped
+           of their high level markup (e.g. get unindented) and the
+           lower-level markup is processed recursively.
+
+           @param parent_elem: A NanoDom element to which the content
+                               will be added
+           @param lines: a list of lines
+           @param inList: a level
+           @returns: None"""
+
+        if not lines :
+            return
+
+        # Check if this section starts with a list, a blockquote or
+        # a code block
+
+        processFn = { 'ul' :     self._processUList,
+                      'ol' :     self._processOList,
+                      'quoted' : self._processQuote,
+                      'tabbed' : self._processCodeBlock }
+
+        for regexp in ['ul', 'ol', 'quoted', 'tabbed'] :
+            m = RE.regExp[regexp].match(lines[0])
+            if m :
+                processFn[regexp](parent_elem, lines, inList)
+                return
+
+        # We are NOT looking at one of the high-level structures like
+        # lists or blockquotes.  So, it's just a regular paragraph
+        # (though perhaps nested inside a list or something else).  If
+        # we are NOT inside a list, we just need to look for a blank
+        # line to find the end of the block.  If we ARE inside a
+        # list, however, we need to consider that a sublist does not
+        # need to be separated by a blank line.  Rather, the following
+        # markup is legal:
+        #
+        # * The top level list item
+        #
+        #     Another paragraph of the list.  This is where we are now.
+        #     * Underneath we might have a sublist.
+        #
+
+        if inList :
+
+            start, theRest = self._linesUntil(lines, (lambda line:
+                             RE.regExp['ul'].match(line)
+                             or RE.regExp['ol'].match(line)
+                                              or not line.strip()))
+
+            self._processSection(parent_elem, start,
+                                 inList - 1, looseList = looseList)
+            self._processSection(parent_elem, theRest,
+                                 inList - 1, looseList = looseList)
+
+
+        else : # Ok, so it's just a simple block
+
+            paragraph, theRest = self._linesUntil(lines, lambda line:
+                                                 not line.strip())
+
+            if len(paragraph) and paragraph[0].startswith('#') :
+                m = RE.regExp['header'].match(paragraph[0])
+                if m :
+                    level = len(m.group(1))
+                    h = self.doc.createElement("h%d" % level)
+                    parent_elem.appendChild(h)
+                    for item in self._handleInlineWrapper2(m.group(2).strip()) :
+                        h.appendChild(item)
+                else :
+                    message(CRITICAL, "We've got a problem header!")
+
+            elif paragraph :
+
+                list = self._handleInlineWrapper2("\n".join(paragraph))
+
+                if ( parent_elem.nodeName == 'li'
+                     and not (looseList or parent_elem.childNodes)):
+
+                    #and not parent_elem.childNodes) :
+                    # If this is the first paragraph inside "li", don't
+                    # put <p> around it - append the paragraph bits directly
+                    # onto parent_elem
+                    el = parent_elem
+                else :
+                    # Otherwise make a "p" element
+                    el = self.doc.createElement("p")
+                    parent_elem.appendChild(el)
+
+                for item in list :
+                    el.appendChild(item)
+
+            if theRest :
+                theRest = theRest[1:]  # skip the first (blank) line
+
+            self._processSection(parent_elem, theRest, inList)
+
+
+
+    def _processUList(self, parent_elem, lines, inList) :
+        self._processList(parent_elem, lines, inList,
+                         listexpr='ul', tag = 'ul')
+
+    def _processOList(self, parent_elem, lines, inList) :
+        self._processList(parent_elem, lines, inList,
+                         listexpr='ol', tag = 'ol')
+
+
+    def _processList(self, parent_elem, lines, inList, listexpr, tag) :
+        """Given a list of document lines starting with a list item,
+           finds the end of the list, breaks it up, and recursively
+           processes each list item and the remainder of the text file.
+
+           @param parent_elem: A dom element to which the content will be added
+           @param lines: a list of lines
+           @param inList: a level
+           @returns: None"""
+
+        ul = self.doc.createElement(tag)  # ul might actually be '<ol>'
+        parent_elem.appendChild(ul)
+
+        looseList = 0
+
+        # Make a list of list items
+        items = []
+        item = -1
+
+        i = 0  # a counter to keep track of where we are
+
+        for line in lines :
+
+            loose = 0
+            if not line.strip() :
+                # If we see a blank line, this _might_ be the end of the list
+                i += 1
+                loose = 1
+
+                # Find the next non-blank line
+                for j in range(i, len(lines)) :
+                    if lines[j].strip() :
+                        next = lines[j]
+                        break
+                else :
+                    # There is no more text => end of the list
+                    break
+
+                # Check if the next non-blank line is still a part of the list
+                if ( RE.regExp['ul'].match(next) or
+                     RE.regExp['ol'].match(next) or 
+                     RE.regExp['tabbed'].match(next) ):
+                    # get rid of any white space in the line
+                    items[item].append(line.strip())
+                    looseList = loose or looseList
+                    continue
+                else :
+                    break # found end of the list
+
+            # Now we need to detect list items (at the current level)
+            # while also detabing child elements if necessary
+
+            for expr in ['ul', 'ol', 'tabbed']:
+
+                m = RE.regExp[expr].match(line)
+                if m :
+                    if expr in ['ul', 'ol'] :  # We are looking at a new item
+                        if m.group(1) :
+                            items.append([m.group(1)])
+                            item += 1
+                    elif expr == 'tabbed' :  # This line needs to be detabbed
+                        items[item].append(m.group(4)) #after the 'tab'
+
+                    i += 1
+                    break
+            else :
+                items[item].append(line)  # Just regular continuation
+                i += 1 # added on 2006.02.25
+        else :
+            i += 1
+
+        # Add the dom elements
+        for item in items :
+            li = self.doc.createElement("li")
+            ul.appendChild(li)
+
+            self._processSection(li, item, inList + 1, looseList = looseList)
+
+        # Process the remaining part of the section
+
+        self._processSection(parent_elem, lines[i:], inList)
+
+
+    def _linesUntil(self, lines, condition) :
+        """ A utility function to break a list of lines upon the
+            first line that satisfied a condition.  The condition
+            argument should be a predicate function.
+            """
+
+        i = -1
+        for line in lines :
+            i += 1
+            if condition(line) : break
+        else :
+            i += 1
+        return lines[:i], lines[i:]
+
+    def _processQuote(self, parent_elem, lines, inList) :
+        """Given a list of document lines starting with a quote finds
+           the end of the quote, unindents it and recursively
+           processes the body of the quote and the remainder of the
+           text file.
+
+           @param parent_elem: DOM element to which the content will be added
+           @param lines: a list of lines
+           @param inList: a level
+           @returns: None """
+
+        dequoted = []
+        i = 0
+        for line in lines :
+            m = RE.regExp['quoted'].match(line)
+            if m :
+                dequoted.append(m.group(1))
+                i += 1
+            else :
+                break
+        else :
+            i += 1
+
+        blockquote = self.doc.createElement('blockquote')
+        parent_elem.appendChild(blockquote)
+
+        self._processSection(blockquote, dequoted, inList)
+        self._processSection(parent_elem, lines[i:], inList)
+
+
+
+
+    def _processCodeBlock(self, parent_elem, lines, inList) :
+        """Given a list of document lines starting with a code block
+           finds the end of the block, puts it into the dom verbatim
+           wrapped in ("<pre><code>") and recursively processes the
+           the remainder of the text file.
+
+           @param parent_elem: DOM element to which the content will be added
+           @param lines: a list of lines
+           @param inList: a level
+           @returns: None"""
+
+        detabbed, theRest = self.blockGuru.detectTabbed(lines)
+
+        pre = self.doc.createElement('pre')
+        code = self.doc.createElement('code')
+        parent_elem.appendChild(pre)
+        pre.appendChild(code)
+        text = "\n".join(detabbed).rstrip()+"\n"
+        text = text.replace("&", "&amp;")
+        code.appendChild(self.doc.createTextNode(text))
+        self._processSection(parent_elem, theRest, inList)
+
+
+    def _handleInlineWrapper2 (self, line) :
+
+
+        parts = [line]
+
+        #if not(line):
+        #    return [self.doc.createTextNode(' ')]
+
+        for pattern in self.inlinePatterns :
+
+            #print
+            #print self.inlinePatterns.index(pattern)
+
+            i = 0
+
+            #print parts
+            while i < len(parts) :
+                
+                x = parts[i]
+                #print i
+                if isinstance(x, (str, unicode)) :
+                    result = self._applyPattern(x, pattern)
+                    #print result
+                    #print result
+                    #print parts, i
+                    if result :
+                        i -= 1
+                        parts.remove(x)
+                        for y in result :
+                            parts.insert(i+1,y)
+                
+                i += 1
+
+        for i in range(len(parts)) :
+            x = parts[i]
+            if isinstance(x, (str, unicode)) :
+                parts[i] = self.doc.createTextNode(x)
+
+        return parts
+        
+
+
+    def _handleInlineWrapper (self, line) :
+
+        # A wrapper around _handleInline to avoid recursion
+
+        parts = [line]
+
+        i = 0
+        
+        while i < len(parts) :
+            x = parts[i]
+            if isinstance(x, (str, unicode)) :
+                parts.remove(x)
+                result = self._handleInline(x)
+                for y in result :
+                    parts.insert(i,y)
+            else :
+                i += 1
+
+        return parts
+
+    def _handleInline(self,  line):
+        """Transform a Markdown line with inline elements to an XHTML
+        fragment.
+
+        This function uses auxiliary objects called inline patterns.
+        See notes on inline patterns above.
+
+        @param item: A block of Markdown text
+        @return: A list of NanoDom nodes """
+
+        if not(line):
+            return [self.doc.createTextNode(' ')]
+
+        for pattern in self.inlinePatterns :
+            list = self._applyPattern( line, pattern)
+            if list: return list
+
+        return [self.doc.createTextNode(line)]
+
+    def _applyPattern(self, line, pattern) :
+        """ Given a pattern name, this function checks if the line
+        fits the pattern, creates the necessary elements, and returns
+        back a list consisting of NanoDom elements and/or strings.
+        
+        @param line: the text to be processed
+        @param pattern: the pattern to be checked
+
+        @returns: the appropriate newly created NanoDom element if the
+                  pattern matches, None otherwise.
+        """
+
+        # match the line to pattern's pre-compiled reg exp.
+        # if no match, move on.
+
+        m = pattern.getCompiledRegExp().match(line)
+        if not m :
+            return None
+
+        # if we got a match let the pattern make us a NanoDom node
+        # if it doesn't, move on
+        node = pattern.handleMatch(m, self.doc)
+
+        if node :
+            # Those are in the reverse order!
+            return ( m.groups()[-1], # the string to the left
+                     node,           # the new node
+                     m.group(1))     # the string to the right of the match
+
+        else :
+            return None
+
+    def __str__(self):
+        """Return the document in XHTML format.
+
+        @returns: A serialized XHTML body."""
+        #try :
+        doc = self._transform()
+        xml = doc.toxml()
+        #finally:
+        #    doc.unlink()
+
+        # Let's stick in all the raw html pieces
+
+        for i in range(self.htmlStash.html_counter) :
+            xml = xml.replace("<p>%s\n</p>" % (HTML_PLACEHOLDER % i),
+                              self.htmlStash.rawHtmlBlocks[i] + "\n")
+            xml = xml.replace(HTML_PLACEHOLDER % i,
+                              self.htmlStash.rawHtmlBlocks[i])
+
+        xml = xml.replace(FN_BACKLINK_TEXT, "&#8617;")
+
+        # And return everything but the top level tag
+
+        if self.stripTopLevelTags :
+            xml = xml.strip()[23:-7]
+
+        if isinstance(xml, unicode) :
+            xml = xml.encode("utf8")
+
+        return xml
+
+
+    toString = __str__
+
+
+"""
+========================= FOOTNOTES =================================
+
+This section adds footnote handling to markdown.  It can be used as
+an example for extending python-markdown with relatively complex
+functionality.  While in this case the extension is included inside
+the module itself, it could just as easily be added from outside the
+module.  Not that all markdown classes above are ignorant about
+footnotes.  All footnote functionality is provided separately and
+then added to the markdown instance at the run time.
+
+Footnote functionality is attached by calling extendMarkdown()
+method of FootnoteExtension.  The method also registers the
+extension to allow it's state to be reset by a call to reset()
+method.
+"""
+
+class FootnoteExtension :
+
+    DEF_RE = re.compile(r'(\ ?\ ?\ ?)\[\^([^\]]*)\]:\s*(.*)')
+    SHORT_USE_RE = re.compile(r'\[\^([^\]]*)\]', re.M) # [^a]
+
+    FN_PLACE_MARKER = "///Footnotes Go Here///"
+
+    def __init__ (self) :
+        self.reset()
+
+    def extendMarkdown(self, md) :
+
+        self.md = md
+
+        # Stateless extensions do not need to be registered
+        md.registerExtension(self)
+
+        # Insert a preprocessor before ReferencePreprocessor
+        index = md.preprocessors.index(REFERENCE_PREPROCESSOR)
+        preprocessor = FootnotePreprocessor(self)
+        preprocessor.md = md
+        md.preprocessors.insert(index, preprocessor)
+
+        # Insert an inline pattern before ImageReferencePattern
+        FOOTNOTE_RE = r'\[\^([^\]]*)\]' # blah blah [^1] blah
+        index = md.inlinePatterns.index(IMAGE_REFERENCE_PATTERN)
+        md.inlinePatterns.insert(index, FootnotePattern(FOOTNOTE_RE, self))
+
+        # Insert a post-processor that would actually add the footnote div
+        postprocessor = FootnotePostprocessor(self)
+        postprocessor.extension = self
+        
+        md.postprocessors.append(postprocessor)
+
+
+    def reset(self) :
+        # May be called by Markdown is state reset is desired
+
+        self.footnote_suffix = "-" + str(int(random.random()*1000000000))
+        self.used_footnotes={}
+        self.footnotes = {}
+
+    def findFootnotesPlaceholder(self, doc) :
+        def findFootnotePlaceholderFn(node=None, indent=0):
+            if node.type == 'text':
+                if node.value.find(self.FN_PLACE_MARKER) > -1 :
+                    return True
+
+        fn_div_list = doc.find(findFootnotePlaceholderFn)
+        if fn_div_list :
+            return fn_div_list[0]
+
+
+    def setFootnote(self, id, text) :
+        self.footnotes[id] = text
+
+    def makeFootnoteId(self, num) :
+        return 'fn%d%s' % (num, self.footnote_suffix)
+
+    def makeFootnoteRefId(self, num) :
+        return 'fnr%d%s' % (num, self.footnote_suffix)
+
+    def makeFootnotesDiv (self, doc) :
+        """Creates the div with class='footnote' and populates it with
+           the text of the footnotes.
+
+           @returns: the footnote div as a dom element """
+
+        if not self.footnotes.keys() :
+            return None
+
+        div = doc.createElement("div")
+        div.setAttribute('class', 'footnote')
+        hr = doc.createElement("hr")
+        div.appendChild(hr)
+        ol = doc.createElement("ol")
+        div.appendChild(ol)
+
+        footnotes = [(self.used_footnotes[id], id)
+                     for id in self.footnotes.keys()]
+        footnotes.sort()
+
+        for i, id in footnotes :
+            li = doc.createElement('li')
+            li.setAttribute('id', self.makeFootnoteId(i))
+
+            self.md._processSection(li, self.footnotes[id].split("\n"))
+
+            #li.appendChild(doc.createTextNode(self.footnotes[id]))
+
+            backlink = doc.createElement('a')
+            backlink.setAttribute('href', '#' + self.makeFootnoteRefId(i))
+            backlink.setAttribute('class', 'footnoteBackLink')
+            backlink.setAttribute('title',
+                                  'Jump back to footnote %d in the text' % 1)
+            backlink.appendChild(doc.createTextNode(FN_BACKLINK_TEXT))
+
+            if li.childNodes :
+                node = li.childNodes[-1]
+                if node.type == "text" :
+                    node = li
+                node.appendChild(backlink)
+
+            ol.appendChild(li)
+
+        return div
+
+
+class FootnotePreprocessor :
+
+    def __init__ (self, footnotes) :
+        self.footnotes = footnotes
+
+    def run(self, lines) :
+
+        self.blockGuru = BlockGuru()
+        lines = self._handleFootnoteDefinitions (lines)
+
+        # Make a hash of all footnote marks in the text so that we
+        # know in what order they are supposed to appear.  (This
+        # function call doesn't really substitute anything - it's just
+        # a way to get a callback for each occurence.
+
+        text = "\n".join(lines)
+        self.footnotes.SHORT_USE_RE.sub(self.recordFootnoteUse, text)
+
+        return text.split("\n")
+
+
+    def recordFootnoteUse(self, match) :
+
+        id = match.group(1)
+        id = id.strip()
+        nextNum = len(self.footnotes.used_footnotes.keys()) + 1
+        self.footnotes.used_footnotes[id] = nextNum
+
+
+    def _handleFootnoteDefinitions(self, lines) :
+        """Recursively finds all footnote definitions in the lines.
+
+            @param lines: a list of lines of text
+            @returns: a string representing the text with footnote
+                      definitions removed """
+
+        i, id, footnote = self._findFootnoteDefinition(lines)
+
+        if id :
+
+            plain = lines[:i]
+
+            detabbed, theRest = self.blockGuru.detectTabbed(lines[i+1:])
+
+            self.footnotes.setFootnote(id,
+                                       footnote + "\n"
+                                       + "\n".join(detabbed))
+
+            more_plain = self._handleFootnoteDefinitions(theRest)
+            return plain + [""] + more_plain
+
+        else :
+            return lines
+
+    def _findFootnoteDefinition(self, lines) :
+        """Finds the first line of a footnote definition.
+
+            @param lines: a list of lines of text
+            @returns: the index of the line containing a footnote definition """
+
+        counter = 0
+        for line in lines :
+            m = self.footnotes.DEF_RE.match(line)
+            if m :
+                return counter, m.group(2), m.group(3)
+            counter += 1
+        return counter, None, None
+
+
+class FootnotePattern (BasePattern) :
+
+    def __init__ (self, pattern, footnotes) :
+
+        BasePattern.__init__(self, pattern)
+        self.footnotes = footnotes
+
+    def handleMatch(self, m, doc) :
+        sup = doc.createElement('sup')
+        a = doc.createElement('a')
+        sup.appendChild(a)
+        id = m.group(2)
+        num = self.footnotes.used_footnotes[id]
+        sup.setAttribute('id', self.footnotes.makeFootnoteRefId(num))
+        a.setAttribute('href', '#' + self.footnotes.makeFootnoteId(num))
+        a.appendChild(doc.createTextNode(str(num)))
+        return sup
+
+class FootnotePostprocessor :
+
+    def __init__ (self, footnotes) :
+        self.footnotes = footnotes
+
+    def run(self, doc) :
+        footnotesDiv = self.footnotes.makeFootnotesDiv(doc)
+        if footnotesDiv :
+            fnPlaceholder = self.extension.findFootnotesPlaceholder(doc)
+            if fnPlaceholder :
+                fnPlaceholder.parent.replaceChild(fnPlaceholder, footnotesDiv)
+            else :
+                doc.documentElement.appendChild(footnotesDiv)
+
+# ====================================================================
+
+def markdown(text) :
+    message(VERBOSE, "in markdown.py, received text:\n%s" % text)
+    return Markdown(text).toString()
+
+def markdownWithFootnotes(text):
+    message(VERBOSE, "Running markdown with footnotes, "
+            + "received text:\n%s" % text)
+    md = Markdown()
+    footnoteExtension = FootnoteExtension()
+    footnoteExtension.extendMarkdown(md)
+    md.source = text
+
+    return str(md)
+
+def test_markdown(args):
+    """test markdown at the command line.
+        in each test, arg 0 is the module name"""
+    print "\nTEST 1: no arguments on command line"
+    cmd_line(["markdown.py"])
+    print "\nTEST 2a: 1 argument on command line: a good option"
+    cmd_line(["markdown.py","-footnotes"])
+    print "\nTEST 2b: 1 argument on command line: a bad option"
+    cmd_line(["markdown.py","-foodnotes"])
+    print "\nTEST 3: 1 argument on command line: non-existent input file"
+    cmd_line(["markdown.py","junk.txt"])
+    print "\nTEST 4: 1 argument on command line: existing input file"
+    lines = """
+Markdown text with[^1]:
+
+2. **bold text**,
+3. *italic text*.
+
+Then more:
+
+    beginning of code block;
+    another line of code block.
+    
+    a second paragraph of code block.
+
+more text to end our file.
+
+[^1]: "italic" means emphasis.
+"""
+    fid = "markdown-test.txt"
+    f1 = open(fid, 'w+')
+    f1.write(lines)
+    f1.close()
+    cmd_line(["markdown.py",fid])
+    print "\nTEST 5: 2 arguments on command line: nofootnotes and input file"
+    cmd_line(["markdown.py","-nofootnotes", fid])
+    print "\nTEST 6: 2 arguments on command line: footnotes and input file"
+    cmd_line(["markdown.py","-footnotes", fid])
+    print "\nTEST 7: 3 arguments on command line: nofootnotes,inputfile, outputfile"
+    fidout = "markdown-test.html"
+    cmd_line(["markdown.py","-nofootnotes", fid, fidout])
+
+
+def get_vars(args):
+    """process the command-line args received; return usable variables"""
+    #firstly get the variables
+
+    message(VERBOSE, "in get_vars(), args: %s" % args) 
+
+    if len(args) <= 1:
+        option, inFile, outFile = (None, None, None)
+    elif len(args) >= 4:
+        option, inFile, outFile = args[1:4]
+    elif len(args) == 3:
+        temp1, temp2 = args[1:3]
+        if temp1[0] == '-':
+            #then we have an option and inFile
+            option, inFile, outFile = temp1, temp2, None
+        else:
+            #we have no option, so we must have inFile and outFile
+            option, inFile, outFile = None, temp1, temp2
+    else:
+        #len(args) = 2
+        #we have only one usable arg: might be an option or a file
+        temp1 = args[1]
+        
+        message(VERBOSE, "our single arg is: %s" % str(temp1))
+
+        if temp1[0] == '-':
+            #then we have an option 
+            option, inFile, outFile = temp1, None, None
+        else:
+            #we have no option, so we must have inFile
+            option, inFile, outFile = None, temp1, None
+    
+    message(VERBOSE,
+            "prior to validation, option: %s, inFile: %s, outFile: %s" %
+            (str(option), str(inFile), str(outFile),))
+    
+    return option, inFile, outFile
+
+
+USAGE = """
+\nUsing markdown.py:
+
+    python markdown.py [option] input_file_with_markdown.txt [output_file.html]
+
+Options:
+
+    -footnotes or -fn   : generate markdown with footnotes
+    -test or -t         : run a self-test
+    -help or -h         : print this message
+
+"""
+    
+VALID_OPTIONS = ['footnotes','nofootnotes', 'fn', 'test', 't', 'f',
+                 'help', 'h']
+
+EXPANDED_OPTIONS =  { "fn" : "footnotes",
+                      "t"  : "test",
+                      "h"  : "help" }
+
+
+def validate_option(option) :
+
+    """ Check if the option makes sense and print an appropriate message
+        if it isn't.
+        
+        @return: valid option string or None
+    """
+
+    #now validate the variables
+    if (option is not None):
+        if (len(option) > 1 and option[1:] in VALID_OPTIONS) :
+            option = option[1:]
+
+            if option in EXPANDED_OPTIONS.keys() :
+                option = EXPANDED_OPTIONS[option]
+            return option
+        else:
+            message(CRITICAL,
+                    "\nSorry, I don't understand option %s" % option)
+            message(CRITICAL, USAGE)
+            return None
+
+
+def validate_input_file(inFile) :        
+    """ Check if the input file is specified and exists.
+
+        @return: valid input file path or None
+    """
+
+    if not inFile :
+        message(CRITICAL,
+                "\nI need an input filename.\n")
+        message(CRITICAL, USAGE)
+        return None
+    
+        
+    if os.access(inFile, os.R_OK):
+        return inFile
+    else :
+        message(CRITICAL, "Sorry, I can't find input file %s" % str(inFile))
+        return None
+
+    
+            
+
+def cmd_line(args):
+
+    message(VERBOSE, "in cmd_line with args: %s" % args)
+
+    option, inFile, outFile = get_vars(args)
+
+    if option :
+        option = validate_option(option)
+        if not option : return
+
+    if option == "help" :
+        message(CRITICAL, USAGE)
+        return
+    elif option == "test" :
+        test_markdown(None)
+        return
+
+    inFile = validate_input_file(inFile)
+    if not inFile :
+        return
+    else :
+        input = file(inFile).read()
+
+    message(VERBOSE, "Validated command line parameters:" +             
+             "\n\toption: %s, \n\tinFile: %s, \n\toutFile: %s" % (
+             str(option), str(inFile), str(outFile),))
+
+    if option == "footnotes" :
+        md_function = markdownWithFootnotes
+    else :
+        md_function = markdown
+
+    if outFile is None:
+        print md_function(input)
+    else:
+        output = md_function(input)
+        f1 = open(outFile, "w+")
+        f1.write(output)
+        f1.close()
+        
+        if os.access(outFile, os.F_OK):
+            message(INFO, "Successfully wrote %s" % outFile)
+        else:
+            message(INFO, "Failed to write %s" % outFile)
+
+
+if __name__ == '__main__':
+    """ Run Markdown from the command line.
+        Set debug = 3 at top of file to get diagnostic output"""
+    args = sys.argv
+        
+    #set testing=1 to test the command-line response of markdown.py
+    testing = 0
+    if testing:
+        test_markdown(args)
+    else:
+        import time
+        t0 = time.time()
+        #for x in range(10) :
+        cmd_line(args)
+        #import profile
+        #profile.run('cmd_line(args)', 'profile')
+        t1 = time.time()
+        #print "Time: %f - %f = %f" % (t1, t0, t1-t0)
+
+"""
+CHANGELOG
+=========
+
+May 15, 2006: A bug with lists, recursion on block-level elements,
+run-in headers, spaces before headers, unicode input (thanks to Aaron
+Swartz). Sourceforge tracker #s: 1489313, 1489312, 1489311, 1488370,
+1485178, 1485176. (v. 1.5)
+
+Mar. 24, 2006: Switched to a not-so-recursive algorithm with
+_handleInline.  (Version 1.4)
+
+Mar. 15, 2006: Replaced some instance variables with class variables
+(a patch from Stelios Xanthakis).  Chris Clark's new regexps that do
+not trigger midword underlining.
+
+Feb. 28, 2006: Clean-up and command-line handling by Stewart
+Midwinter. (Version 1.3)
+
+Feb. 24, 2006: Fixed a bug with the last line of the list appearing
+again as a separate paragraph.  Incorporated Chris Clark's "mailto"
+patch.  Added support for <br /> at the end of lines ending in two or
+more spaces.  Fixed a crashing bug when using ImageReferencePattern.
+Added several utility methods to Nanodom.  (Version 1.2)
+
+Jan. 31, 2006: Added "hr" and "hr/" to BLOCK_LEVEL_ELEMENTS and
+changed <hr/> to <hr />.  (Thanks to Sergej Chodarev.)
+
+Nov. 26, 2005: Fixed a bug with certain tabbed lines inside lists
+getting wrapped in <pre><code>.  (v. 1.1)
+
+Nov. 19, 2005: Made "<!...", "<?...", etc. behave like block-level
+HTML tags.
+
+Nov. 14, 2005: Added entity code and email autolink fix by Tiago
+Cogumbreiro.  Fixed some small issues with backticks to get 100%
+compliance with John's test suite.  (v. 1.0)
+
+Nov. 7, 2005: Added an unlink method for documents to aid with memory
+collection (per Doug Sauder's suggestion).
+
+Oct. 29, 2005: Restricted a set of html tags that get treated as
+block-level elements.
+
+Sept. 18, 2005: Refactored the whole script to make it easier to
+customize it and made footnote functionality into an extension.
+(v. 0.9)
+
+Sept. 5, 2005: Fixed a bug with multi-paragraph footnotes.  Added
+attribute support.
+
+Sept. 1, 2005: Changed the way headers are handled to allow inline
+syntax in headers (e.g. links) and got the lists to use p-tags
+correctly (v. 0.8)
+
+Aug. 29, 2005: Added flexible tabs, fixed a few small issues, added
+basic support for footnotes.  Got rid of xml.dom.minidom and added
+pretty-printing. (v. 0.7)
+
+Aug. 13, 2005: Fixed a number of small bugs in order to conform to the
+test suite.  (v. 0.6)
+
+Aug. 11, 2005: Added support for inline html and entities, inline
+images, autolinks, underscore emphasis. Cleaned up and refactored the
+code, added some more comments.
+
+Feb. 19, 2005: Rewrote the handling of high-level elements to allow
+multi-line list items and all sorts of nesting.
+
+Feb. 3, 2005: Reference-style links, single-line lists, backticks,
+escape, emphasis in the beginning of the paragraph.
+
+Nov. 2004: Added links, blockquotes, html blocks to Manfred
+Stienstra's code
+
+Apr. 2004: Manfred's version at http://www.dwerg.net/projects/markdown/
+
+"""
+
+
+
+
+
+
Index: /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/pagination/orm.py
===================================================================
--- /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/pagination/orm.py (revision 3)
+++ /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/pagination/orm.py (revision 3)
@@ -0,0 +1,71 @@
+"""ORM Wrappers"""
+import inspect
+from webhelpers.util import Partial
+
+orms = {}
+try:
+    import sqlobject
+except:
+    pass
+else:
+    orms['sqlobject'] = True
+try:
+    import sqlalchemy
+except:
+    pass
+else:
+    orms['sqlalchemy'] = True
+
+def get_wrapper(obj, *args, **kw):
+    if isinstance(obj, (list, tuple)):
+        return obj
+    if orms.get('sqlobject'):
+        if inspect.isclass(obj) and issubclass(obj, sqlobject.SQLObject):
+            return SQLObjectLazy(obj.select, *args, **kw)
+    if orms.get('sqlalchemy'):
+        if hasattr(obj, '_is_primary_mapper'):
+            return SQLAlchemyLazyMapper(obj, *args, **kw)
+        if isinstance(obj, sqlalchemy.Table):
+            return SQLAlchemyLazyTable(obj, *args, **kw)
+    return "You shouldn't have this"
+    
+
+class SQLObjectLazy(Partial):
+    def __getitem__(self, key):
+        if not isinstance(key, slice):
+            raise Exception, "SQLObjectLazy doesn't support getitem without slicing"
+        return list(self()[key.start:key.stop])
+    
+    def __len__(self):
+        return self().count()
+
+class SQLAlchemyLazyTable(Partial):
+    def __getitem__(self, key):
+        if not isinstance(key, slice):
+            raise Exception, "SQLAlchemyLazy doesn't support getitem without slicing"
+        limit = key.stop - key.start
+        offset = key.start
+        fn = self.fn
+        self.fn = fn.select
+        results = self(limit=limit, offset=offset).execute()
+        self.fn = fn
+        return results
+    
+    def __len__(self):
+        s = self.fn.select(*self.args, **self.kw)
+        return self.fn([func.count(1)], from_obj=[s])
+
+class SQLAlchemyLazyMapper(Partial):
+    def __getitem__(self, key):
+        if not isinstance(key, slice):
+            raise Exception, "SQLAlchemyLazy doesn't support getitem without slicing"
+        limit = key.stop - key.start
+        offset = key.start
+        fn = self.fn
+        self.fn = fn.select
+        results = self(limit=limit, offset=offset)
+        self.fn = fn
+        return results
+    
+    def __len__(self):
+        return self.fn.count(*self.args, **self.kw)
Index: /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/pagination/__init__.py
===================================================================
--- /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/pagination/__init__.py (revision 3)
+++ /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/pagination/__init__.py (revision 3)
@@ -0,0 +1,230 @@
+"""Pagination for Collections and ORMs
+
+The Pagination module aids in the process of paging large collections of
+objects. It can be used macro-style for automatic fetching of large collections
+using one of the ORM wrappers, or handle a large collection responding to
+standard Python list slicing operations. These methods can also be used
+individually and customized to do as much or little as desired.
+
+The Paginator itself maintains pagination logic associated with each page, where
+it begins, what the first/last item on the page is, etc.
+
+Helper functions hook-up the Paginator in more conveinent methods for the more
+macro-style approach to return the Paginator and the slice of the collection
+desired.
+
+"""
+from routes import request_config
+from orm import get_wrapper
+
+def paginate(collection, page=None, per_page=10, item_count=None, *args, **options):
+    """Paginate a collection of data
+    
+    If the collection is a list, it will return the slice of the list along
+    with the Paginator object. If the collection is given using an ORM, the
+    collection argument must be a partial representing the function to be
+    used that will generate the proper query and extend properly for the
+    limit/offset.
+    
+    Example::
+    
+        # In this case, Person is a SQLObject class, or it could be a list/tuple
+        person_paginator, person_set = paginate(Person, page=1)
+        
+        set_count = int(person_paginator.current)
+        total_pages = len(person_paginator)
+    
+    Current ORM support is limited to SQLObject and SQLAlchemy. You can use any ORM
+    you'd like with the Paginator as it will give you the offset/limit data necessary
+    to make your own query.
+    
+    **WARNING:** Unless you pass in an item_count, a count will be performed on the
+    collection every time paginate is called. If using an ORM, it's suggested that
+    you count the items yourself and/or cache them.
+    
+    """
+    collection = get_wrapper(collection, *args, **options)
+    if not item_count:
+        item_count = len(collection)
+    paginator = Paginator(item_count, per_page, page)
+    subset = collection[paginator.current.first_item:paginator.current.last_item]
+    
+    return paginator, subset
+    
+    
+class Paginator(object):
+    """Tracks paginated sets of data, and supplies common pagination operations
+    
+    The Paginator tracks data associated with pagination of groups of data, as well
+    as supplying objects and methods that make dealing with paginated results easier.
+    
+    A Paginator supports list operations, including item fetching, length, iteration,
+    and the 'in' operation. Each item in the Paginator is a Page object representing
+    data about that specific page in the set of paginated data. As with the standard
+    Python list, the Paginator list index starts at 0.
+    
+    """
+    def __init__(self, item_count, items_per_page=10, current_page=0):
+        """Initialize a Paginator with the item count specified."""
+        self.item_count = item_count
+        self.items_per_page = items_per_page
+        self.pages = {}
+        self.current_page = current_page
+    
+    def current():
+        doc = """\
+Page object currently being displayed
+
+When assigning to the current page, it will set the page number for this page
+and create it if needed. If the page is a Page object and does not belong to
+this paginator, an AttributeError will be raised.
+
+"""
+        def fget(self):
+            return self[int(self.current_page)]
+        def fset(self, page):
+            if isinstance(page, Page) and page.paginator != self:
+                raise AttributeError("Page/Paginator mismatch")
+            page = int(page)
+            self.current_page = page in self and page or 0
+        return locals()
+    current = property(**current())
+    
+    def __len__(self):
+        return (self.item_count == 0) and 0 or (((self.item_count - 1)//self.items_per_page) + 1)
+    
+    def __iter__(self):
+        for i in range(0, len(self)):
+            yield self[i]
+    
+    def __getitem__(self, index):
+        # Handle negative indexing like a normal list
+        if index < 0:
+            index = len(self) + index
+        
+        if index < 0:
+            index = 0
+        
+        if index not in self and index != 0:
+            raise IndexError, "list index out of range"
+        
+        return self.pages.setdefault(index, Page(self, index))
+    
+    def __contains__(self, value):
+        if value >= 0 and value <= (len(self) - 1):
+            return True
+        return False
+
+class Page(object):
+    """Represents a single page from a paginated set."""
+    def __init__(self, paginator, number):
+        """Creates a new Page for the given ``paginator`` with the index ``number``."""
+        self.paginator = paginator
+        self.number = int(number)
+    
+    def __int__(self):
+        return self.number
+    
+    def __eq__(self, page):
+        return self.paginator == page.paginator and self.number == page.number
+    
+    def __cmp__(self, page):
+        return cmp(self.number, page.number)
+    
+    def offset():
+        doc = """Offset of the page, useful for database queries."""
+        def fget(self):
+            return self.paginator.items_per_page * self.number
+        return locals()
+    offset = property(**offset())
+    
+    def first_item():
+        doc = """The number of the first item in the page."""
+        def fget(self):
+            return self.offset
+        return locals()
+    first_item = property(**first_item())
+    
+    def last_item():
+        doc = """The number of the last item in the page."""
+        def fget(self):
+            return min(self.paginator.items_per_page * (self.number + 1),
+                self.paginator.item_count)
+        return locals()
+    last_item = property(**last_item())
+    
+    def first():
+        doc = """Boolean indiciating if this page is the first."""
+        def fget(self):
+            return self == self.paginator[0]
+        return locals()
+    first = property(**first())
+    
+    def last():
+        doc = """Boolean indicating if this page is the last."""
+        def fget(self):
+            return self == self.paginator[-1]
+        return locals()
+    last = property(**last())
+    
+    def previous():
+        doc = """Previous page if it exists, None otherwise."""
+        def fget(self):
+            if self.first:
+                return None
+            return self.paginator[self.number - 1]
+        return locals()
+    previous = property(**previous())
+    
+    def next():
+        doc = """Next page if it exists, None otherwise."""
+        def fget(self):
+            if self.last:
+                return None
+            return self.paginator[self.number + 1]
+        return locals()
+    next = property(**next())
+
+    def window(self, padding = 2):
+        return Window(self, padding)
+    
+    def __repr__(self):
+        return str(self.number)
+
+class Window(object):
+    """Represents ranges around a given page."""
+    def __init__(self, page, padding = 2):
+        """Creates a new Window object for the given ``page`` with the specified ``padding``."""
+        self.paginator = page.paginator
+        self.page = page
+        self.padding = padding
+    
+    def padding():
+        doc = """Sets the window's padding (the number of pages on either side of the window page)."""
+        def fset(self, padding):
+            self._padding = padding
+            if padding < 0: self._padding = 0
+            first_page_in_window = self.page.number - self._padding
+            self.first = first_page_in_window in self.paginator and (
+                self.paginator[first_page_in_window]) or self.paginator[0]
+            last_page_in_window = self.page.number + self._padding
+            self.last = last_page_in_window in self.paginator and (
+                self.paginator[last_page_in_window]) or self.paginator[-1]
+        def fget(self):
+            return self._padding
+        return locals()
+    padding = property(**padding())
+    
+    def pages():
+        doc = """Returns a list of Page objects in the current window."""
+        def fget(self):
+            return [self.paginator[page_number] for page_number in 
+                range(self.first.number, self.last.number+1)]
+        return locals()
+    pages = property(**pages())
+
+    def __add__(self, window):
+        if window.paginator != self.paginator:
+            raise AttributeError("Window/paginator mismatch")
+        assert self.last >= window.first
+        return Window(self.page.next, padding=self.padding+1)
Index: /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/pagination/links.py
===================================================================
--- /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/pagination/links.py (revision 3)
+++ /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/pagination/links.py (revision 3)
@@ -0,0 +1,59 @@
+"""Pagination Link Generators"""
+from webhelpers.htmlgen import html
+
+def pagelist(page):
+    """PHPbb style Pagination Links
+    
+    This returns HTML source to be included into a page. The html is generated
+    with htmlgen
+    """
+    paginator = page.paginator
+
+    first_page = paginator[0]
+    first_window = first_page.window(padding=3)
+
+    page_window = page.window(padding=1)
+
+    last_page = paginator[-1]
+    last_window = last_page.window(padding=3)
+
+    first_past_page = first_window.last >= page_window.first
+    page_past_last = page_window.last >= last_window.first
+
+    def combine_pages(page_list):
+        seen = {}
+        result = []
+        for page in page_list:
+            if page in seen: continue
+            seen[page] = 1
+            result.append(page)
+        return result
+
+    if first_past_page:
+        if page_past_last:
+            display = first_window.pages
+        else:
+            first_window.last = page_window.last
+            display = (first_window.pages + [None] + last_window.pages)
+    else:
+        if page_past_last:
+            page_window.last = last_window.last
+            display = (first_window.pages + [None] + page_window.pages)
+        else:
+            display = (first_window.pages + [None] + page_window.pages + [None]
+                    + last_window.pages)
+
+    print display
+
+    pager_c = []
+    for i in display:
+        if i is None:
+            pager_c.append(html.span(c='...'))
+        elif i == page:
+            pager_c.append(html.span(c=[i]))
+        else:
+            pager_c.append(html.a(href=i, c=[i]))
+
+    pager = html.div(class_='pager', c=pager_c)
+
+    return pager
Index: /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/rails/number.py
===================================================================
--- /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/rails/number.py (revision 3)
+++ /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/rails/number.py (revision 3)
@@ -0,0 +1,146 @@
+"""
+Number Helpers
+"""
+# Last synced with Rails copy at Revision 4537 on Aug 19th, 2006.
+import re
+
+def number_to_phone(number, area_code=False, delimiter="-", extension=""):
+    """
+    Formats a ``number`` into a US phone number string.
+    
+    The area code can be surrounded by parentheses by setting ``area_code`` to True; default is False
+    The delimiter can be set using ``delimiter`` default is "-"
+    
+    Examples::
+    
+        >>> number_to_phone(1235551234)
+        123-555-1234
+        >>> number_to_phone(1235551234, area_code=True)
+        (123) 555-1234
+        >>> number_to_phone(1235551234, delimiter=" ")
+        123 555 1234
+        >>> number_to_phone(1235551234, area_code=True, extension=555)
+        (123) 555-1234 x 555
+    """
+    if area_code:
+        number = re.sub(r'([0-9]{3})([0-9]{3})([0-9]{4})', r'(\1) \2%s\3' % delimiter, str(number))
+    else:
+        number = re.sub(r'([0-9]{3})([0-9]{3})([0-9]{4})', r'\1%s\2%s\3' % (delimiter, delimiter), str(number))
+    if extension and str(extension).strip():
+        number += " x %s" % extension
+    return number
+
+def number_to_currency(number, unit="$", precision=2, separator=".", delimiter=","):
+    """
+    Formats a ``number`` into a currency string. 
+    
+    ``number``
+        Indicates the level of precision
+    ``unit``
+        Sets the currency type
+    ``separator``
+        Used to set what the unit separation should be
+    ``delimiter``
+        The delimiter can be set using the +delimiter+ key; default is ","
+    
+    Examples::
+    
+        >>> number_to_currency(1234567890.50)
+        $1,234,567,890.50
+        >>> number_to_currency(1234567890.506)
+        $1,234,567,890.51
+        >>> number_to_currency(1234567890.50, unit="&pound;", separator=",", delimiter="")
+        &pound;1234567890,50
+    """
+    if precision < 1:
+        separator = ""
+    parts = number_with_precision(number, precision).split('.')
+    num = unit + number_with_delimiter(parts[0], delimiter)
+    if len(parts) > 1:
+        num += separator + parts[1]
+    return num
+
+def number_to_percentage(number, precision=3, separator="."):
+    """
+    Formats a ``number`` as into a percentage string. 
+    
+    ``number``
+        Contains the level of precision
+    ``separator``
+        The unit separator to be used
+    
+    Examples::
+    
+        >>> number_to_percentage(100)
+        100.000%
+        >>> number_to_percentage(100, precision=0)
+        100%
+        >>> number_to_percentage(302.0574, precision=2)
+        302.06%
+    """
+    number = number_with_precision(number, precision)
+    parts = number.split('.')
+    if len(parts) < 2:
+        return parts[0] + "%"
+    else:
+        return parts[0] + separator + parts[1] + "%"
+
+def number_to_human_size(size):
+    """
+    Returns a formatted-for-humans file size.
+    
+    Examples::
+    
+        >>> number_to_human_size(123)
+        123 Bytes
+        >>> number_to_human_size(1234)
+        1.2 KB
+        >>> number_to_human_size(12345)
+        12.1 KB
+        >>> number_to_human_size(1234567)
+        1.2 MB
+        >>> number_to_human_size(1234567890)
+        1.1 GB
+    """
+    if size == 1:
+        return "1 Byte"
+    elif size < 1024:
+        return "%d Bytes" % size
+    elif size < (1024**2):
+        return "%.1f KB" % (size / 1024.00)
+    elif size < (1024**3):
+        return "%.1f MB" % (size / 1024.00**2)
+    elif size < (1024**4):
+        return "%.1f GB" % (size / 1024.00**3)
+    elif size < (1024**5):
+        return "%.1f TB" % (size / 1024.00**4)
+    else:
+        return ""
+
+human_size = number_to_human_size
+
+def number_with_delimiter(number, delimiter=","):
+    """
+    Formats a ``number`` with a ``delimiter``.
+    
+    Example::
+    
+        >>> number_with_delimiter(12345678)
+        12,345,678
+    """
+    return re.sub(r'(\d)(?=(\d\d\d)+(?!\d))', r'\1%s' % delimiter, str(number))
+
+def number_with_precision(number, precision=3):
+    """
+    Formats a ``number`` with a level of ``precision``.
+    
+    Example::
+    
+        >>> number_with_precision(111.2345)
+        111.235
+    """
+    formstr = '%01.' + str(precision) + 'f'
+    return formstr % number
+
+__all__ = ['number_to_phone', 'number_to_currency', 'number_to_percentage','number_with_delimiter', 
+           'number_with_precision', 'number_to_human_size', 'human_size']
Index: /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/rails/asset_tag.py
===================================================================
--- /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/rails/asset_tag.py (revision 3)
+++ /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/rails/asset_tag.py (revision 3)
@@ -0,0 +1,196 @@
+"""
+Asset Tag Helpers
+
+Provides functionality for linking an HTML page together with other assets, such as
+javascripts, stylesheets, and feeds.
+"""
+# Last synced with Rails copy at Revision 4103 on Aug 19th, 2006.
+
+import os
+import urlparse
+from tags import *
+from routes import request_config
+
+# The absolute path of the WebHelpers javascripts directory
+javascript_path = os.path.join(os.path.dirname(os.path.abspath(__file__)),
+                               'javascripts')
+
+# WebHelpers' built-in javascripts. Note: scriptaculous automatically includes all of its
+# supporting .js files
+javascript_builtins = ('prototype.js', 'scriptaculous.js')
+
+def auto_discovery_link_tag(source, type='rss', **kwargs):
+    """
+    Returns a link tag allowing browsers and news readers (that support it) to auto-detect
+    an RSS or ATOM feed for current page.
+
+    ``source``
+        The URL of the feed. The URL is ultimately prepended with the environment's
+        ``SCRIPT_NAME`` (the root path of the web application), unless the URL is
+        fully-fledged (e.g. http://example.com).
+
+    ``type``
+        The type of feed. Specifying 'rss' or 'atom' automatically translates to a type of
+        'application/rss+xml' or 'application/atom+xml', respectively. Otherwise the type
+        is used as specified. Defaults to 'rss'.
+        
+    Examples::
+
+        >>> auto_discovery_link_tag('http://feed.com/feed.xml')
+        '<link href="http://feed.com/feed.xml" rel="alternate" title="RSS" type="application/rss+xml" />'
+
+        >>> auto_discovery_link_tag('http://feed.com/feed.xml', type='atom')
+        '<link href="http://feed.com/feed.xml" rel="alternate" title="ATOM" type="application/atom+xml" />'
+
+        >>> auto_discovery_link_tag('app.rss', type='atom', title='atom feed')
+        '<link href="app.rss" rel="alternate" title="atom feed" type="application/atom+xml" />'
+
+        >>> auto_discovery_link_tag('/app.html', type='text/html')
+        '<link href="/app.html" rel="alternate" title="" type="text/html" />'
+    """
+    title = ''
+    if type.lower() in ('rss', 'atom'):
+        title = type.upper()
+        type='application/%s+xml' % type.lower()
+
+    tag_args = dict(rel='alternate', type=type, title=title,
+                    href=compute_public_path(source))
+    kwargs.pop('href', None)
+    kwargs.pop('type', None)
+    tag_args.update(kwargs)
+    return tag('link', **tag_args)
+
+def image_tag(source, alt=None, size=None, **options):
+    """
+    Returns an image tag for the specified ``source``.
+
+    ``source``
+        The source URL of the image. The URL is prepended with '/images/', unless its full
+        path is specified. The URL is ultimately prepended with the environment's
+        ``SCRIPT_NAME`` (the root path of the web application), unless the URL is
+        fully-fledged (e.g. http://example.com). A source with no filename extension will
+        be automatically appended with the '.png' extension.
+    
+    ``alt``
+        The img's alt tag. Defaults to the source's filename, title cased.
+
+    ``size``
+        The img's size, specified in the format "XxY". "30x45" becomes
+        width="30", height="45". "x20" becomes height="20".
+        
+    Examples::
+
+        >>> image_tag('xml')
+        '<img alt="Xml" src="/images/xml.png" />'
+
+        >>> image_tag('rss', 'rss syndication')
+        '<img alt="rss syndication" src="/images/rss.png" />'    
+    """
+    options['src'] = compute_public_path(source, 'images', 'png')
+
+    if not alt:
+        alt = os.path.splitext(os.path.basename(source))[0].title()
+    options['alt'] = alt
+    
+    if size:
+        width, height = size.split('x')
+        if width:
+            options['width'] = width
+        if height:
+            options['height'] = height
+        
+    return tag('img', **options)
+
+def javascript_include_tag(*sources, **options):
+    """
+    Returns script include tags for the specified javascript ``sources``.
+
+    Each source's URL path is prepended with '/javascripts/' unless their full path is
+    specified. Each source's URL path is ultimately prepended with the environment's
+    ``SCRIPT_NAME`` (the root path of the web application), unless the URL path is a
+    full-fledged URL (e.g. http://example.com). Sources with no filename extension will be
+    appended with the '.js' extension.
+
+    Optionally includes (prepended) WebHelpers' built-in javascripts when passed the
+    ``builtins=True`` keyword argument.
+
+    Examples::
+    
+        >>> print javascript_include_tag(builtins=True)
+        <script src="/javascripts/prototype.js" type="text/javascript"></script>
+        <script src="/javascripts/scriptaculous.js" type="text/javascript"></script>
+
+        >>> print javascript_include_tag('prototype', '/other-javascripts/util.js')
+        <script src="/javascripts/prototype.js" type="text/javascript"></script>
+        <script src="/other-javascripts/util.js" type="text/javascript"></script>
+
+        >>> print javascript_include_tag('app', '/test/test.1.js', builtins=True)
+        <script src="/javascripts/prototype.js" type="text/javascript"></script>
+        <script src="/javascripts/scriptaculous.js" type="text/javascript"></script>
+        <script src="/javascripts/app.js" type="text/javascript"></script>
+        <script src="/test/test.1.js" type="text/javascript"></script>
+    """
+    if options.get('builtins'):
+        sources = javascript_builtins + sources
+        
+    tags = [content_tag('script', None,
+                        **dict(type='text/javascript',
+                               src=compute_public_path(source, 'javascripts', 'js'))) \
+            for source in sources]
+    return '\n'.join(tags)
+
+def stylesheet_link_tag(*sources, **options):
+    """
+    Returns CSS link tags for the specified stylesheet ``sources``.
+
+    Each source's URL path is prepended with '/stylesheets/' unless their full path is
+    specified. Each source's URL path is ultimately prepended with the environment's
+    ``SCRIPT_NAME`` (the root path of the web application), unless the URL path is a
+    full-fledged URL (e.g. http://example.com). Sources with no filename extension will be
+    appended with the '.css' extension.
+    
+    Examples::
+
+        >>> stylesheet_link_tag('style')
+        '<link href="/stylesheets/style.css" media="screen" rel="Stylesheet" type="text/css" />'
+
+        >>> stylesheet_link_tag('/dir/file', media='all')
+        '<link href="/dir/file.css" media="all" rel="Stylesheet" type="text/css" />'
+    """
+    tag_options = dict(rel='Stylesheet', type='text/css', media='screen')
+    tag_options.update(options)
+    tag_options.pop('href', None)
+
+    tags = [tag('link', **dict(href=compute_public_path(source, 'stylesheets', 'css'),
+                               **tag_options)) for source in sources]
+    return '\n'.join(tags)
+    
+def compute_public_path(source, root_path=None, ext=None):
+    """
+    Format the specified source for publishing, via the public directory, if applicable.
+    """
+    if ext and not os.path.splitext(os.path.basename(source))[1]:
+        source = '%s.%s' % (source, ext)
+
+    # Avoid munging fully-fledged URLs, including 'mailto:'
+    parsed = urlparse.urlparse(source)
+    if not (parsed[0] and (parsed[1] or parsed[2])):
+        # Prefix apps deployed under any SCRIPT_NAME path
+        if not root_path or source.startswith('/'):
+            source = '%s%s' % (get_script_name(), source)
+        else:
+            source = '%s/%s/%s' % (get_script_name(), root_path, source)
+    return source
+
+def get_script_name():
+    """
+    Determine the current web application's ``SCRIPT_NAME``.
+    """
+    script_name = ''
+    config = request_config()
+    if hasattr(config, 'environ'):
+        script_name = config.environ.get('SCRIPT_NAME', '')
+    return script_name
+
+__all__ = ['javascript_path', 'javascript_builtins', 'auto_discovery_link_tag',
+           'image_tag', 'javascript_include_tag', 'stylesheet_link_tag']
Index: /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/rails/date.py
===================================================================
--- /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/rails/date.py (revision 3)
+++ /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/rails/date.py (revision 3)
@@ -0,0 +1,76 @@
+"""Date/Time Helpers"""
+# Last synced with Rails copy at Revision 4674 on Aug 19th, 2006.
+# Note that the select_ tags are purposely not ported as they're very totally useless
+# and inefficient beyond comprehension.
+
+from datetime import datetime
+import time
+
+DEFAULT_PREFIX = 'date'
+
+def distance_of_time_in_words(from_time, to_time=0, include_seconds=False):
+    """
+    Reports the approximate distance in time between two datetime objects or integers. 
+    
+    For example, if the distance is 47 minutes, it'll return
+    "about 1 hour". See the source for the complete wording list.
+    
+    Integers are interpreted as seconds from now. So,
+    ``distance_of_time_in_words(50)`` returns "less than a minute".
+    
+    Set ``include_seconds`` to True if you want more detailed approximations if distance < 1 minute
+    """
+    if isinstance(from_time, int):
+        from_time = time.time()+from_time
+    else:
+        from_time = time.mktime(from_time.timetuple())
+    if isinstance(to_time, int):
+        to_time = time.time()+to_time
+    else:
+        to_time = time.mktime(to_time.timetuple())
+    
+    distance_in_minutes = int(round(abs(to_time-from_time)/60))
+    distance_in_seconds = int(round(abs(to_time-from_time)))
+    
+    if distance_in_minutes <= 1:
+        if include_seconds:
+            for remainder in [5, 10, 20]:
+                if distance_in_seconds < remainder:
+                    return "less than %s seconds" % remainder
+            if distance_in_seconds < 40:
+                return "half a minute"
+            elif distance_in_seconds < 60:
+                return "less than a minute"
+            else:
+                return "1 minute"
+        else:
+            if distance_in_minutes == 0:
+                return "less than a minute"
+            else:
+                return "1 minute"
+    elif distance_in_minutes <= 45:
+        return "%s minutes" % distance_in_minutes
+    elif distance_in_minutes <= 90:
+        return "about 1 hour"
+    elif distance_in_minutes <= 1440:
+        return "about %d hours" % (round(distance_in_minutes / 60.0))
+    elif distance_in_minutes <= 2880:
+        return "1 day"
+    elif distance_in_minutes <= 43220:
+        return "%d days" % (round(distance_in_minutes / 1440))
+    elif distance_in_minutes <= 86400:
+        return "about 1 month"
+    elif distance_in_minutes <= 525960:
+        return "%d months" % (round(distance_in_minutes / 43200))
+    elif distance_in_minutes <= 1051920:
+        return "about 1 year"
+    else:
+        return "over %d years" % (round(distance_in_minutes / 525600))
+
+def time_ago_in_words(from_time, include_seconds=False):
+    """
+    Like distance_of_time_in_words, but where ``to_time`` is fixed to ``datetime.now()``.
+    """
+    return distance_of_time_in_words(from_time, datetime.now(), include_seconds)
+
+__all__ = ['distance_of_time_in_words', 'time_ago_in_words']
Index: /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/rails/form_options.py
===================================================================
--- /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/rails/form_options.py (revision 3)
+++ /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/rails/form_options.py (revision 3)
@@ -0,0 +1,96 @@
+"""
+Form Options Helpers
+"""
+# Last synced with Rails copy at Revision 4331 on Aug 19th, 2006.
+# Purposely left out a few redundant options_for_collection stuff.
+
+
+from webhelpers.util import html_escape
+
+def options_for_select(container, selected = None):
+    """
+    Creates select options from a container (list, tuple, dict)
+    
+    Accepts a container (list, tuple, dict) and returns a string of option tags. Given a container where the 
+    elements respond to first and last (such as a two-element array), the "lasts" serve as option values and
+    the "firsts" as option text. Dicts are turned into this form automatically, so the keys become "firsts" and values
+    become lasts. If ``selected`` is specified, the matching "last" or element will get the selected option-tag.
+    ``Selected`` may also be an array of values to be selected when using a multiple select.
+    
+    Examples (call, result)::
+    
+        >>> options_for_select([["Dollar", "$"], ["Kroner", "DKK"]])
+        <option value="$">Dollar</option>\\n<option value="DKK">Kroner</option>
+        >>> options_for_select([ "VISA", "MasterCard" ], "MasterCard")
+        <option value="VISA">VISA</option>\\n<option value="MasterCard" selected="selected">MasterCard</option>
+        >>> options_for_select(dict(Basic="$20", Plus="$40"), "$40")
+        <option value="$20">Basic</option>\\n<option value="$40" selected="selected">Plus</option>
+        >>> options_for_select([ "VISA", "MasterCard", "Discover" ], ["VISA", "Discover"])
+        <option value="VISA" selected="selected">VISA</option>\\n<option value="MasterCard">MasterCard</option>\\n
+        <option value="Discover" selected="selected">Discover</option>
+
+    Note: Only the option tags are returned, you have to wrap this call in a regular HTML select tag.
+    """
+    if hasattr(container, 'values'):
+        container = container.items()
+    
+    if not isinstance(selected, (list,tuple)):
+        selected = (selected,)
+    
+    options = []
+    
+    for elem in container:
+        if isinstance(elem, (list, tuple)):
+            name, value = elem
+            n = html_escape(name)
+            v = html_escape(value)
+        else :
+            name = value = elem
+            n = v = html_escape(elem)
+        
+        #TODO: run timeit for this against content_tag('option', n, value=v, selected=value in selected)
+        if value in selected:
+            options.append('<option value="%s" selected="selected">%s</option>' % (v, n))
+        else :
+            options.append('<option value="%s">%s</option>' % (v, n))
+    return "\n".join(options)
+
+def options_for_select_from_objects(container, name_attr, value_attr = None, selected = None):
+    """
+    Create select options from objects in a container
+    
+    Returns a string of option tags that have been compiled by iterating over the ``container`` and assigning the
+    the result of a call to the ``value_attr`` as the option value and the ``name_attr`` as the option text.
+    If ``selected`` is specified, the element returning a match on ``value_attr`` will get the selected option tag.
+    
+    NOTE: Only the option tags are returned, you have to wrap this call in a regular HTML select tag.
+    """
+    if value_attr:
+        def make_elem(elem):
+            return getattr(elem, name_attr), getattr(elem, value_attr)
+    else :
+        def make_elem(elem):
+            return getattr(elem, name_attr)
+    
+    return options_for_select([make_elem(x) for x in container], selected)
+
+def options_for_select_from_dicts(container, name_key, value_key = None, selected = None):
+    """
+    Create select options from dicts in a container
+    
+    Returns a string of option tags that have been compiled by iterating over the ``container`` and assigning the
+    the result of a call to the ``value_key`` as the option value and the ``name_attr`` as the option text.
+    If ``selected`` is specified, the element returning a match on ``value_key`` will get the selected option tag.
+    
+    NOTE: Only the option tags are returned, you have to wrap this call in a regular HTML select tag.
+    """
+    if value_key:
+        def make_elem(elem):
+            return elem[name_key], elem[value_key]
+    else :
+        def make_elem(elem):
+            return elem[name_key]
+
+    return options_for_select([make_elem(x) for x in container], selected)
+
+__all__ = ['options_for_select', 'options_for_select_from_objects', 'options_for_select_from_dicts']
Index: /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/rails/form_tag.py
===================================================================
--- /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/rails/form_tag.py (revision 3)
+++ /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/rails/form_tag.py (revision 3)
@@ -0,0 +1,181 @@
+"""
+Form Tag Helpers
+"""
+# Last synced with Rails copy at Revision 4374 on Aug 19th, 2006.
+
+from urls import confirm_javascript_function
+from tags import *
+from webhelpers.util import html_escape
+
+def form(url, method="post", multipart=False, **options):
+    """
+    Starts a form tag that points the action to an url. 
+    
+    The url options should be given either as a string, or as a ``url()``
+    function. The method for the form defaults to POST.
+    
+    Options:
+
+    ``multipart``
+        If set to True, the enctype is set to "multipart/form-data".
+    ``method``
+        The method to use when submitting the form, usually either "get" or 
+        "post". If "put", "delete", or another verb is used, a hidden input
+        with name _method is added to simulate the verb over post.
+    
+    """
+    if multipart:
+        options["enctype"] = "multipart/form-data"
+    
+    if callable(url):
+        url = url()
+    else:
+        url = html_escape(url)
+    
+    method_tag = ""
+    
+    if method in ['post', 'get']:
+        options['method'] = method
+    else:
+        options['method'] = "post"
+        method_tag = tag('input', type="hidden", name_="_method", value=method)
+    
+    options["action"] = url
+    return tag("form", True, **options) + method_tag
+
+start_form = form
+
+def end_form():
+    """
+    Outputs "</form>"
+    """
+    return "</form>"
+
+def select(name, option_tags='', **options):
+    """
+    Creates a dropdown selection box
+    
+    ``option_tags`` is a string containing the option tags for the select box::
+
+        >>> select("people", "<option>George</option>")
+        <select id="people" name="people"><option>George</option></select>
+    
+    Options:
+    
+    * ``multiple`` - If set to true the selection will allow multiple choices.
+    
+    """
+    o = { 'name_': name, 'id': name }
+    o.update(options)
+    return content_tag("select", option_tags, **o)
+
+def text_field(name, value=None, **options):
+    """
+    Creates a standard text field.
+    
+    ``value`` is a string that will the contents of the text field will be set to
+    
+    Options:
+    
+    * ``disabled`` - If set to True, the user will not be able to use this input.
+    * ``size`` - The number of visible characters that will fit in the input.
+    * ``maxlength`` - The maximum number of characters that the browser will allow the user to enter.
+    
+    Remaining keyword options will be standard HTML options for the tag.
+    """
+    o = {'type': 'text', 'name_': name, 'id': name, 'value': value}
+    o.update(options)
+    return tag("input", **o)
+
+def hidden_field(name, value=None, **options):
+    """
+    Creates a hidden field.
+    
+    Takes the same options as text_field
+    """
+    return text_field(name, value, type="hidden", **options)
+
+def file_field(name, value=None, **options):
+    """
+    Creates a file upload field.
+    
+    If you are using file uploads then you will also need to set the multipart option for the form.
+    """
+    return text_field(name, value=value, type="file", **options)
+
+def password_field(name="password", value=None, **options):
+    """
+    Creates a password field
+    
+    Takes the same options as text_field
+    """
+    return text_field(name, value, type="password", **options)
+
+def text_area(name, content='', **options):
+    """
+    Creates a text input area.
+    
+    Options:
+    
+    * ``size`` - A string specifying the dimensions of the textarea.
+    
+    Example::
+    
+        >>> text_area("body", '', size="25x10")
+        <textarea name="body" id="body" cols="25" rows="10"></textarea>
+    """
+    if 'size' in options:
+        options["cols"], options["rows"] = options["size"].split("x")
+        del options['size']
+    o = {'name_': name, 'id': name}
+    o.update(options)
+    return content_tag("textarea", content, **o)
+
+def check_box(name, value="1", checked=False, **options):
+    """
+    Creates a check box.
+    """
+    o = {'type': 'checkbox', 'name_': name, 'id': name, 'value': value}
+    o.update(options)
+    if checked:
+        o["checked"] = "checked"
+    return tag("input", **o)
+
+def radio_button(name, value, checked=False, **options):
+    """Creates a radio button."""
+    o = {'type': 'radio', 'name_': name, 'id': name, 'value': value}
+    o.update(options)
+    if checked:
+        o["checked"] = "checked"
+    return tag("input", **o)
+
+def submit(value="Save changes", name='commit', confirm=None, disable_with=None, **options):
+    """Creates a submit button with the text ``value`` as the caption.
+
+    Options:
+
+    * ``confirm`` - A confirm message displayed when the button is clicked.
+    * ``disable_with`` - The value to be used to rename a disabled version of the submit
+      button.
+    """
+
+    if confirm:
+        onclick = options.get('onclick', '')
+        if onclick.strip() and not onclick.rstrip().endswith(';'):
+            onclick += ';'
+        options['onclick'] = "%s return %s;" % (onclick, confirm_javascript_function(confirm))
+
+    if disable_with:
+        options["onclick"] = "this.disabled=true;this.value='%s';this.form.submit();%s" % (disable_with, options.get("onclick", ''))
+    o = {'type': 'submit', 'name_': name, 'value': value }
+    o.update(options)
+    return tag("input", **o)
+      
+#def image_submit(source, **options):
+#    """Displays an image which when clicked will submit the form"""
+#    o = {'type': 'image', 'src': image_path_source) }
+#    o.update(options)
+#    return tag("input", **o)
+
+__all__ = ['form', 'start_form', 'end_form', 'select', 'text_field', 'hidden_field', 'file_field',
+           'password_field', 'text_area', 'check_box', 'radio_button', 'submit']
Index: /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/rails/tags.py
===================================================================
--- /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/rails/tags.py (revision 3)
+++ /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/rails/tags.py (revision 3)
@@ -0,0 +1,95 @@
+"""Tag Helpers"""
+# Last synced with Rails copy at Revision 2543 on Aug 20th, 2006.
+
+from webhelpers.util import html_escape
+import re
+
+def camelize(name):
+    """
+    Camelize a ``name``
+    """
+    def upcase(matchobj):
+        return getattr(matchobj.group(0)[1:], 'upper')()
+    name = re.sub(r'(_[a-zA-Z])', upcase, name)
+    name = name[0].upper() + name[1:]
+    return name
+
+def strip_unders(options):
+    for x,y in options.iteritems():
+        if x.endswith('_'):
+            options[x[:-1]] = y
+            del options[x]
+
+def tag(name, open=False, **options):
+    """
+    Create a HTML tag of type ``name``
+    
+    ``open``
+        Set to True if the tag should remain open
+    
+    All additional keyword args become attribute/value's for the tag. To pass in Python
+    reserved words, append _ to the name of the key.
+    
+    Examples::
+    
+        >>> tag("br")
+        <br />
+        >>> tag("input", type="text")
+        <input type="text" />
+    """
+    tag = '<%s%s%s' % (name, (options and tag_options(**options)) or '', (open and '>') or ' />')
+    return tag
+
+def content_tag(name, content, **options):
+    """
+    Create a tag with content
+    
+    Takes the same keyword args as ``tag``
+    
+    Examples::
+    
+        >>> content_tag("p", "Hello world!")
+        <p>Hello world!</p>
+        >>> content_tag("div", content_tag("p", "Hello world!"), class_="strong")
+        <div class="strong"><p>Hello world!</p></div>
+    """
+    if content is None:
+        content = ''
+    tag = '<%s%s>%s</%s>' % (name, (options and tag_options(**options)) or '', content, name)
+    return tag
+
+def cdata_section(content):
+    """
+    Returns a CDATA section for the given ``content``.
+    
+    CDATA sections are used to escape blocks of text containing characters which would
+    otherwise be recognized as markup. CDATA sections begin with the string
+    ``<![CDATA[`` and end with (and may not contain) the string 
+    ``]]>``. 
+    """
+    if content is None:
+        content = ''
+    return "<![CDATA[%s]]>" % content
+
+def tag_options(**options):
+    strip_unders(options)
+    cleaned_options = convert_booleans(dict([(x, y) for x,y in options.iteritems() if y is not None]))
+    optionlist = ['%s="%s"' % (x, html_escape(str(y))) for x,y in cleaned_options.iteritems()]
+    optionlist.sort()
+    if optionlist:
+        return ' ' + ' '.join(optionlist)
+    else:
+        return ''
+
+def convert_booleans(options):
+    for attr in ['disabled', 'readonly', 'multiple']:
+        boolean_attribute(options, attr)
+    return options
+
+def boolean_attribute(options, attribute):
+    if options.get(attribute):
+        options[attribute] = attribute
+    elif options.has_key(attribute):
+        del options[attribute]
+
+__all__ = ['tag', 'content_tag', 'cdata_section', 'camelize']
Index: /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/rails/__init__.py
===================================================================
--- /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/rails/__init__.py (revision 3)
+++ /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/rails/__init__.py (revision 3)
@@ -0,0 +1,13 @@
+"""Helper functions ported from Rails"""
+from asset_tag import *
+from urls import *
+from javascript import *
+from tags import *
+from prototype import *
+from scriptaculous import *
+from form_tag import *
+from text import *
+from form_options import *
+from date import *
+from number import *
+from routes import url_for, redirect_to
Index: /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/rails/scriptaculous.py
===================================================================
--- /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/rails/scriptaculous.py (revision 3)
+++ /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/rails/scriptaculous.py (revision 3)
@@ -0,0 +1,160 @@
+"""
+Scriptaculous Helpers
+
+Provides a set of helpers for calling Scriptaculous JavaScript 
+functions, including those which create Ajax controls and visual effects.
+
+To be able to use these helpers, you must include the Prototype 
+JavaScript framework and the Scriptaculous JavaScript library in your 
+pages.
+
+The Scriptaculous helpers' behavior can be tweaked with various options.
+See the documentation at http://script.aculo.us for more information on
+using these helpers in your application.
+"""
+# Last synced with Rails copy at Revision 3772 on Aug 19th, 2006.
+import simplejson as json
+from prototype import *
+from javascript import options_for_javascript, array_or_string_for_javascript
+from prototype import AJAX_OPTIONS, javascript_tag
+from tags import camelize
+
+def visual_effect(name, element_id=False, **js_options):
+    """
+    Returns a JavaScript snippet to be used on the Ajax callbacks for
+    starting visual effects.
+    
+    Example::
+    
+        <% link_to_remote("Reload",  
+                dict(url=url(action="reload"),
+                     update="posts",
+                     complete=visual_effect('highlight', "posts", duration=0.5))) %>
+    
+    If no element_id is given, it assumes "element" which should be a local
+    variable in the generated JavaScript execution context. This can be 
+    used for example with drop_receiving_element::
+    
+        <% drop_receving_element('some_element', loading=visual_effect('fade')) %>
+    
+    This would fade the element that was dropped on the drop receiving 
+    element.
+    
+    For toggling visual effects, you can use ``toggle_appear``, ``toggle_slide``, and
+    ``toggle_blind`` which will alternate between appear/fade, slidedown/slideup, and
+    blinddown/blindup respectively.
+    
+    You can change the behaviour with various options, see
+    http://script.aculo.us for more documentation.
+    """
+    element = (element_id and json.dumps(element_id)) or "element"
+    if isinstance(js_options.get('queue'), dict):
+        js_options['queue'] = '{%s}' % ','.join(["%s:%s" % (k,(k == 'limit' and v) or "'%s'" % v) for k,v in js_options['queue'].iteritems()])
+    elif js_options.has_key('queue'):
+        js_options['queue'] = "'%s'" % js_options['queue']
+    
+    
+    if 'toggle' in name:
+        return "Effect.toggle(%s,'%s',%s);" % (element, name.replace('toggle_',''), options_for_javascript(js_options))
+    return "new Effect.%s(%s,%s);" % (camelize(name), element, options_for_javascript(js_options))
+
+def parallel_effects(*effects, **js_options):
+    """
+    Wraps visual effects so they occur in parallel
+    
+    Example::
+    
+        parallel_effects(
+            visual_effect('highlight, 'dom_id'),
+            visual_effect('fade', 'dom_id'),
+        )
+    """
+    str_effects = [e[:e.rindex(';')] for e in effects] # Remove trailing ';'
+    return "new Effect.Parallel([%s], %s)" % (','.join(str_effects), options_for_javascript(js_options))
+
+def sortable_element(element_id, **options):
+    """
+    Makes the element with the DOM ID specified by ``element_id`` sortable.
+    
+    Uses drag-and-drop and makes an Ajax call whenever the sort order has
+    changed. By default, the action called gets the serialized sortable
+    element as parameters.
+    
+    Example::
+
+        <% sortable_element("my_list", url=url(action="order")) %>
+    
+    In the example, the action gets a "my_list" array parameter 
+    containing the values of the ids of elements the sortable consists 
+    of, in the current order.
+    
+    You can change the behaviour with various options, see
+    http://script.aculo.us for more documentation.
+    """
+    return javascript_tag(sortable_element_js(element_id, **options))
+
+def sortable_element_js(element_id, **options):
+    options.setdefault('with', "Sortable.serialize('%s')" % element_id)
+    options.setdefault('onUpdate', "function(){%s}" % remote_function(**options))
+    for k in options.keys():
+        if k in AJAX_OPTIONS: del options[k]
+    
+    for option in ['tag', 'overlap', 'constraint', 'handle']:
+        if options.has_key(option) and options[option]:
+            options[option] = "'%s'" % options[option]
+    
+    if options.has_key('containment'):
+        options['containment'] = array_or_string_for_javascript(options['containment'])
+    if options.has_key('only'):
+        options['only'] = array_or_string_for_javascript(options['only'])
+    
+    return "Sortable.create(%s, %s)" % (json.dumps(element_id), options_for_javascript(options))
+
+def draggable_element(element_id, **options):
+    """
+    Makes the element with the DOM ID specified by ``element_id`` draggable.
+    
+    Example::
+
+        <% draggable_element("my_image", revert=True)
+    
+    You can change the behaviour with various options, see
+    http://script.aculo.us for more documentation.
+    """
+    return javascript_tag(draggable_element_js(element_id, **options))
+
+def draggable_element_js(element_id, **options):
+    return "new Draggable(%s, %s)" % (json.dumps(element_id), options_for_javascript(options))
+
+def drop_receiving_element(element_id, **options):
+    """
+    Makes an element able to recieve dropped draggable elements
+    
+    Makes the element with the DOM ID specified by ``element_id`` receive
+    dropped draggable elements (created by draggable_element) and make an
+    AJAX call  By default, the action called gets the DOM ID of the element
+    as parameter.
+    
+    Example::
+    
+        <% drop_receiving_element("my_cart", url=(controller="cart", action="add" )) %>
+    
+    You can change the behaviour with various options, see
+    http://script.aculo.us for more documentation.    
+    """
+    return javascript_tag(drop_receiving_element_js(element_id, **options))
+
+def drop_receiving_element_js(element_id, **options):
+    options.setdefault('with', "'id=' + encodeURIComponent(element.id)")
+    options.setdefault('onDrop', "function(element){%s}" % remote_function(**options))
+    for k in options.keys():
+        if k in AJAX_OPTIONS: del options[k]
+    
+    if options.has_key('accept'):
+        options['accept'] = array_or_string_for_javascript(options['accept'])
+    if options.has_key('hoverclass'):
+        options['hoverclass'] = "'%s'" % options['hoverclass']
+    
+    return "Droppables.add(%s, %s)" % (json.dumps(element_id), options_for_javascript(options))
+
+__all__ = ['visual_effect', 'parallel_effects', 'sortable_element', 'draggable_element', 'drop_receiving_element']
Index: /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/rails/text.py
===================================================================
--- /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/rails/text.py (revision 3)
+++ /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/rails/text.py (revision 3)
@@ -0,0 +1,235 @@
+"""
+Text Helpers
+"""
+# Last synced with Rails copy at Revision 4595 on Aug 19th, 2006.
+# Purposely left out sanitize, should be included at some point likely using
+# BeautifulSoup.
+
+from routes import request_config
+from webhelpers.rails.tags import content_tag, tag_options
+import webhelpers.textile as textile
+import webhelpers.markdown as markdown
+import itertools, re
+
+AUTO_LINK_RE = re.compile("""(<\w+.*?>|[^=!:'"\/]|^)((?:http[s]?:\/\/)|(?:www\.))(([\w]+:?[=?&\/.-]?)*\w+[\/]?(?:\#\w*)?)([\.,"'?!;:]|\s|<|$)""")
+    
+def iterdict(items):
+    return dict(items=items, iter=itertools.cycle(items))
+
+def cycle(*args, **kargs):
+    """
+    Returns the next cycle of the given list
+    
+    Everytime ``cycle`` is called, the value returned will be the next item
+    in the list passed to it. This list is reset on every request, but can
+    also be reset by calling ``reset_cycle()``.
+    
+    You may specify the list as either arguments, or as a single list argument.
+    
+    This can be used to alternate classes for table rows::
+    
+        # In Myghty...
+        % for item in items:
+        <tr class="<% cycle("even", "odd") %>">
+            ... use item ...
+        </tr>
+        % #endfor
+    
+    You can use named cycles to prevent clashes in nested loops. You'll
+    have to reset the inner cycle, manually::
+    
+        % for item in items:
+        <tr class="<% cycle("even", "odd", name="row_class") %>
+            <td>
+        %     for value in item.values:
+                <span style="color:'<% cycle("red", "green", "blue",
+                                             name="colors") %>'">
+                            item
+                </span>
+        %     #endfor
+            <% reset_cycle("colors") %>
+            </td>
+        </tr>
+        % #endfor
+    """
+    if len(args) > 1:
+        items = args
+    else:
+        items = args[0]
+    name = kargs.get('name', 'default')
+    cycles = request_config().environ.setdefault('railshelpers.cycles', {})
+    
+    cycle = cycles.setdefault(name, iterdict(items))
+    
+    if cycles[name].get('items') != items:
+        cycle = cycles[name] = iterdict(items)
+    return cycle['iter'].next()
+
+def reset_cycle(name='default'):
+    """
+    Resets a cycle
+    
+    Resets the cycle so that it starts from the first element in the array
+    the next time it is used.
+    """
+    del request_config().environ['railshelpers.cycles'][name]
+
+def truncate(text, length=30, truncate_string='...'):
+    """
+    Truncates ``text`` with replacement characters
+    
+    ``length``
+        The maximum length of ``text`` before replacement
+    ``truncate_string``
+        If ``text`` exceeds the ``length``, this string will replace
+        the end of the string
+    """
+    if not text: return ''
+    
+    new_len = length-len(truncate_string)
+    if len(text) > length:
+        return text[:new_len] + truncate_string
+    else:
+        return text
+
+def highlight(text, phrase, hilighter='<strong class="hilight">\\1</strong>'):
+    """
+    Highlights the ``phrase`` where it is found in the ``text``
+    
+    The highlighted phrase will be surrounded by the hilighter, by default::
+    
+        <strong class="highlight">I'm a highlight phrase</strong>
+    
+    ``highlighter``
+        Defines the highlighting phrase. This argument should be a single-quoted string
+        with ``\\1`` where the phrase is supposed to be inserted.
+        
+    Note: The ``phrase`` is sanitized to include only letters, digits, and spaces before use.
+    """
+    if not phrase or not text:
+        return text
+    return re.sub(re.compile('(%s)' % re.escape(phrase)), hilighter, text, re.I)
+
+def excerpt(text, phrase, radius=100, excerpt_string="..."):
+    """
+    Extracts an excerpt from the ``text``
+    
+    ``phrase``
+        Phrase to excerpt from ``text``
+    ``radius``
+        How many surrounding characters to include
+    ``excerpt_string``
+        Characters surrounding entire excerpt
+    
+    Example::
+    
+        >>> excerpt("hello my world", "my", 3)
+        "...lo my wo..."
+    """
+    if not text or not phrase:
+        return text
+    
+    pat = re.compile('(.{0,%s}%s.{0,%s})' % (radius, re.escape(phrase), radius))
+    match = pat.search(text)
+    if not match:
+        return ""
+    return excerpt_string + match.expand(r'\1') + excerpt_string
+
+def word_wrap(text, line_width=80):
+    """
+    Word wrap long lines to ``line_width``
+    """
+    text = re.sub(r'\n', '\n\n', text)
+    return re.sub(r'(.{1,%s})(\s+|$)' % line_width, r'\1\n', text).strip()
+
+def simple_format(text):
+    """
+    Returns ``text`` transformed into HTML using very simple formatting rules
+    
+    Surrounds paragraphs with ``<p>`` tags, and converts line breaks into ``<br />``
+    Two consecutive newlines(``\\n\\n``) are considered as a paragraph, one newline (``\\n``) is
+    considered a linebreak, three or more consecutive newlines are turned into two newlines.
+    """
+    text = re.sub(r'(\r\n|\n|\r)', r'\n', text)
+    text = re.sub(r'\n\n+', r'\n\n', text)
+    text = re.sub(r'(\n\n)', r'</p>\1<p>', text)
+    text = re.sub(r'([^\n])(\n)([^\n])', r'\1\2<br />\3', text)
+    text = content_tag("p", text).replace('</p><p></p>', '</p>')
+    text = re.sub(r'</p><p>', r'</p>\n<p>', text)
+    return text
+
+def auto_link(text, link="all", **href_options):
+    """
+    Turns all urls and email addresses into clickable links. 
+    
+    ``link``
+        Used to determine what to link. Options are "all", "email_addresses", or "urls"
+    
+    Example::
+    
+        >>> auto_link("Go to http://www.planetpython.com and say hello to guido@python.org")
+        'Go to <a href="http://www.planetpython.com">http://www.planetpython.com</a> and say
+        hello to <a href="mailto:guido@python.org">guido@python.org</a>'
+    """
+    if not text:
+        return ""
+    if link == "all":
+        return auto_link_urls(auto_link_email_addresses(text), **href_options)
+    elif link == "email_addresses":
+        return auto_link_email_addresses(text)
+    else:
+        return auto_link_urls(text, **href_options)
+
+def auto_link_urls(text, **href_options):
+    extra_options = tag_options(**href_options)
+    def handle_match(matchobj):
+        all = matchobj.group()
+        a, b, c, d = matchobj.group(1,2,3,5)
+        if re.match(r'<a\s', a, re.I):
+            return all
+        text = b + c
+        if b == "www.":
+            b = "http://www."
+        return '%s<a href="%s%s"%s>%s</a>%s' % (a, b, c, extra_options, text, d)
+    return re.sub(AUTO_LINK_RE, handle_match, text)
+
+def auto_link_email_addresses(text):
+    def fix_email(match):
+        text = matchobj.group()
+        return '<a href="mailto:%s>%s</a>' % (text, text)
+    return re.sub(r'([\w\.!#\$%\-+.]+@[A-Za-z0-9\-]+(\.[A-Za-z0-9\-]+)+)', r'<a href="mailto:\1">\1</a>', text)
+
+def strip_links(text):
+    """
+    Turns all links into words
+    
+    Example::
+    
+        >>> strip_links("<a href="something">else</a>")
+        "else"
+    """
+    return re.sub(r'<a\b.*?>(.*?)<\/a>', r'\1', text, re.M)
+
+def textilize(text, sanitize=False):
+    """Format the text with Textile formatting
+    
+    This function uses the `PyTextile library <http://dealmeida.net/>`_ which is included with WebHelpers.
+    
+    Additionally, the output can be sanitized which will fix tags like <img />,
+    <br /> and <hr /> for proper XHTML output.
+    
+    """
+    texer = textile.Textiler(text)
+    return texer.process(sanitize=sanitize)
+
+def markdown(text):
+    """Format the text with MarkDown formatting
+    
+    This function uses the `Python MarkDown library <http://www.freewisdom.org/projects/python-markdown/>`_
+    which is included with WebHelpers.
+    
+    """
+    return markdown.markdown(text)
+
+__all__ = ['cycle', 'reset_cycle', 'truncate', 'highlight', 'excerpt', 'word_wrap', 'simple_format',
+           'auto_link', 'strip_links', 'textilize', 'markdown']
Index: /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/rails/prototype.py
===================================================================
--- /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/rails/prototype.py (revision 3)
+++ /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/rails/prototype.py (revision 3)
@@ -0,0 +1,409 @@
+"""
+Prototype Helpers
+
+Provides a set of helpers for calling Prototype JavaScript functions, 
+including functionality to call remote methods using 
+`Ajax <http://www.adaptivepath.com/publications/essays/archives/000385.php>`_. 
+This means that you can call actions in your controllers without
+reloading the page, but still update certain parts of it using
+injections into the DOM. The common use case is having a form that adds
+a new element to a list without reloading the page.
+
+To be able to use these helpers, you must include the Prototype 
+JavaScript framework in your pages.
+
+See `link_to_remote <module-railshelpers.helpers.javascript.html#link_to_function>`_ 
+for documentation of options common to all Ajax helpers.
+
+See also `Scriptaculous <module-railshelpers.helpers.scriptaculous.html>`_ for
+helpers which work with the Scriptaculous controls and visual effects library.
+"""
+# Last synced with Rails copy at Revision 4235 on Aug 19th, 2006.
+
+import sys
+if sys.version < '2.4':
+    from sets import ImmutableSet as frozenset
+
+from javascript import *
+from javascript import options_for_javascript
+from form_tag import form
+from tags import tag, camelize
+from urls import get_url
+
+CALLBACKS = frozenset(['uninitialized','loading','loaded',
+                       'interactive','complete','failure','success'] + [str(x) for x in range(100,599)])
+AJAX_OPTIONS = frozenset(['before','after','condition','url',
+                          'asynchronous','method','insertion','position',
+                          'form','with','update','script'] + list(CALLBACKS))
+
+def link_to_remote(name, options={}, **html_options):
+    """
+    Links to a remote function
+    
+    Returns a link to a remote action defined ``dict(url=url())``
+    (using the url() format) that's called in the background using 
+    XMLHttpRequest. The result of that request can then be inserted into a
+    DOM object whose id can be specified with the ``update`` keyword. 
+    Usually, the result would be a partial prepared by the controller with
+    either render_partial or render_partial_collection.
+    
+    Any keywords given after the second dict argument are considered html options
+    and assigned as html attributes/values for the element.
+    
+    Example::
+    
+        link_to_remote("Delete this post", dict(update="posts", 
+                       url=url(action="destroy", id=post.id)))
+    
+    You can also specify a dict for ``update`` to allow for easy redirection
+    of output to an other DOM element if a server-side error occurs:
+    
+    Example::
+
+        link_to_remote("Delete this post",
+                dict(url=url(action="destroy", id=post.id),
+                     update=dict(success="posts", failure="error")))
+    
+    Optionally, you can use the ``position`` parameter to influence how the
+    target DOM element is updated. It must be one of 'before', 'top', 'bottom',
+    or 'after'.
+    
+    By default, these remote requests are processed asynchronous during 
+    which various JavaScript callbacks can be triggered (for progress 
+    indicators and the likes). All callbacks get access to the 
+    ``request`` object, which holds the underlying XMLHttpRequest. 
+    
+    To access the server response, use ``request.responseText``, to
+    find out the HTTP status, use ``request.status``.
+    
+    Example::
+
+        link_to_remote(word,
+                dict(url=url(action="undo", n=word_counter),
+                     complete="undoRequestCompleted(request)"))
+    
+    The callbacks that may be specified are (in order):
+    
+    ``loading``
+        Called when the remote document is being loaded with data by the browser.
+    ``loaded``
+        Called when the browser has finished loading the remote document.
+    ``interactive``
+        Called when the user can interact with the remote document, even
+        though it has not finished loading.
+    ``success``
+        Called when the XMLHttpRequest is completed, and the HTTP status
+        code is in the 2XX range.
+    ``failure``
+        Called when the XMLHttpRequest is completed, and the HTTP status code is
+        not in the 2XX range.
+    ``complete``
+        Called when the XMLHttpRequest is complete (fires after success/failure
+        if they are present).
+                        
+    You can further refine ``success`` and ``failure`` by 
+    adding additional callbacks for specific status codes.
+    
+    Example::
+    
+        link_to_remote(word,
+                dict(url=url(action="action"),
+                     404="alert('Not found...? Wrong URL...?')",
+                     failure="alert('HTTP Error ' + request.status + '!')"))
+    
+    A status code callback overrides the success/failure handlers if 
+    present.
+    
+    If you for some reason or another need synchronous processing (that'll
+    block the browser while the request is happening), you can specify 
+    ``type='synchronous'``.
+    
+    You can customize further browser side call logic by passing in
+    JavaScript code snippets via some optional parameters. In their order 
+    of use these are:
+    
+    ``confirm``
+        Adds confirmation dialog.
+    ``condition``
+        Perform remote request conditionally by this expression. Use this to
+        describe browser-side conditions when request should not be initiated.
+    ``before``
+        Called before request is initiated.
+    ``after``
+        Called immediately after request was initiated and before ``loading``.
+    ``submit``
+        Specifies the DOM element ID that's used as the parent of the form
+        elements. By default this is the current form, but it could just as
+        well be the ID of a table row or any other DOM element.    
+    """
+    return link_to_function(name, remote_function(**options), **html_options)
+
+def periodically_call_remote(**options):
+    """
+    Periodically calls a remote function
+    
+    Periodically calls the specified ``url`` every ``frequency`` seconds
+    (default is 10). Usually used to update a specified div ``update``
+    with the results of the remote call. The options for specifying the
+    target with ``url`` and defining callbacks is the same as `link_to_remote <#link_to_remote>`_.    
+    """
+    frequency = options.get('frequency') or 10
+    code = "new PeriodicalExecuter(function() {%s}, %s)" % (remote_function(**options), frequency)
+    return javascript_tag(code)
+
+def form_remote_tag(**options):
+    """
+    Create a form tag using a remote function to submit the request
+    
+    Returns a form tag that will submit using XMLHttpRequest in the 
+    background instead of the regular reloading POST arrangement. Even 
+    though it's using JavaScript to serialize the form elements, the form
+    submission will work just like a regular submission as viewed by the
+    receiving side. The options for specifying the target with ``url``
+    and defining callbacks is the same as `link_to_remote <#link_to_remote>`_.
+    
+    A "fall-through" target for browsers that doesn't do JavaScript can be
+    specified with the ``action/method`` options on ``html``.
+    
+    Example::
+
+        form_remote_tag(html=dict(action=url(
+                                    controller="some", action="place")))
+    
+    By default the fall-through action is the same as the one specified in 
+    the ``url`` (and the default method is ``post``).
+    """
+    options['form'] = True
+    if 'html' not in options: options['html'] = {}
+    options['html']['onsubmit'] = "%s; return false;" % remote_function(**options)
+    action = options['html'].get('action', get_url(options['url']))
+    options['html']['method'] = options['html'].get('method', 'post')
+    
+    return form(action, **options['html'])
+
+def submit_to_remote(name, value, **options):
+    """
+    A submit button that submits via an XMLHttpRequest call
+    
+    Returns a button input tag that will submit form using XMLHttpRequest 
+    in the background instead of regular reloading POST arrangement. 
+    Keyword args are the same as in ``form_remote_tag``.    
+    """
+    options['with'] = options.get('form') or 'Form.serialize(this.form)'
+    
+    options['html'] = options.get('html') or {}
+    options['html']['type'] = 'button'
+    options['html']['onclick'] = "%s; return false;" % remote_function(**options)
+    options['html']['name_'] = name
+    options['html']['value'] = str(value)
+    
+    return tag("input", open=False, **options['html'])
+
+def update_element_function(element_id, **options):
+    """
+    Returns a JavaScript function (or expression) that'll update a DOM 
+    element.
+    
+    ``content``
+        The content to use for updating.
+    ``action``
+        Valid options are 'update' (assumed by default), 'empty', 'remove'
+    ``position``
+        If the ``action`` is 'update', you can optionally specify one of the
+        following positions: 'before', 'top', 'bottom', 'after'.
+    
+    Example::
+    
+        <% javascript_tag(update_element_function("products", 
+            position='bottom', content="<p>New product!</p>")) %>
+    
+    This method can also be used in combination with remote method call 
+    where the result is evaluated afterwards to cause multiple updates on
+    a page. Example::
+    
+        # Calling view
+        <% form_remote_tag(url=url(action="buy"), 
+                complete=evaluate_remote_response()) %>
+            all the inputs here...
+    
+        # Controller action
+        def buy(self, **params):
+            c.product = Product.find(1)
+            m.subexec('/buy.myt')
+    
+        # Returning view
+        <% update_element_function(
+                "cart", action='update', position='bottom', 
+                content="<p>New Product: %s</p>" % c.product.name) %>
+        <% update_element_function("status", binding='binding',
+                content="You've bought a new product!") %>
+    """
+    content = escape_javascript(options.get('content', ''))
+    opval = options.get('action', 'update')
+    if opval == 'update':
+        if options.get('position'):
+            jsf = "new Insertion.%s('%s','%s')" % (camelize(options['position']), element_id, content)
+        else:
+            jsf = "$('%s').innerHTML = '%s'" % (element_id, content)
+    elif opval == 'empty':
+        jsf = "$('%s').innerHTML = ''" % element_id
+    elif opval == 'remove':
+        jsf = "Element.remove('%s')" % element_id
+    else:
+        raise "Invalid action, choose one of update, remove, or empty"
+    
+    jsf += ";\n"
+    if options.get('binding'):
+        return jsf + options['binding']
+    else:
+        return jsf
+
+def evaluate_remote_response():
+    """
+    Returns a Javascript function that evals a request response
+    
+    Returns 'eval(request.responseText)' which is the JavaScript function
+    that ``form_remote_tag`` can call in *complete* to evaluate a multiple
+    update return document using ``update_element_function`` calls.    
+    """
+    return "eval(request.responseText)"
+
+def remote_function(**options):
+    """
+    Returns the JavaScript needed for a remote function.
+    
+    Takes the same arguments as `link_to_remote <#link_to_remote>`_.
+    
+    Example::
+    
+        <select id="options" onchange="<% remote_function(update="options", 
+                url=url(action='update_options')) %>">
+            <option value="0">Hello</option>
+            <option value="1">World</option>
+        </select>    
+    """
+    javascript_options = options_for_ajax(options)
+    
+    update = ''
+    if options.get('update') and isinstance(options['update'], dict):
+        update = []
+        if options['update'].has_key('success'): 
+            update.append("success:'%s'" % options['update']['success'])
+        if options['update'].has_key('failure'):
+            update.append("failure:'%s'" % options['update']['failure'])
+        update = '{' + ','.join(update) + '}'
+    elif options.get('update'):
+        update += "'%s'" % options['update']
+    
+    function = "new Ajax.Request("
+    if update: function = "new Ajax.Updater(%s, " % update
+    
+    function += "'%s'" % get_url(options['url'])
+    function += ", %s)" % javascript_options
+    
+    if options.get('before'):
+        function = "%s; %s" % (options['before'], function)
+    if options.get('after'):
+        function = "%s; %s" % (function, options['after'])
+    if options.get('condition'):
+        function = "if (%s) { %s; }" % (options['condition'], function)
+    if options.get('confirm'):
+        function = "if (confirm('%s')) { %s; }" % (escape_javascript(options['confirm']), function)
+    
+    return function
+
+def observe_field(field_id, **options):
+    """
+    Observes the field with the DOM ID specified by ``field_id`` and makes
+    an Ajax call when its contents have changed.
+    
+    Required keyword args are:
+    
+    ``url``
+        ``url()``-style options for the action to call when the
+        field has changed.
+    
+    Additional keyword args are:
+    
+    ``frequency``
+        The frequency (in seconds) at which changes to this field will be
+        detected. Not setting this option at all or to a value equal to or
+        less than zero will use event based observation instead of time
+        based observation.
+    ``update``
+        Specifies the DOM ID of the element whose innerHTML should be
+        updated with the XMLHttpRequest response text.
+    ``with``
+        A JavaScript expression specifying the parameters for the
+        XMLHttpRequest. This defaults to 'value', which in the evaluated
+        context refers to the new field value.
+    ``on``
+        Specifies which event handler to observe. By default, it's set to
+        "changed" for text fields and areas and "click" for radio buttons
+        and checkboxes. With this, you can specify it instead to be "blur"
+        or "focus" or any other event.
+    
+    Additionally, you may specify any of the options documented in
+    `link_to_remote <#link_to_remote>`_.
+    """
+    if options.get('frequency') > 0:
+        return build_observer('Form.Element.Observer', field_id, **options)
+    else:
+        return build_observer('Form.Element.EventObserver', field_id, **options)
+
+def observe_form(form_id, **options):
+    """
+    Like `observe_field <#observe_field>`_, but operates on an entire form
+    identified by the DOM ID ``form_id``.
+    
+    Keyword args are the same as observe_field, except the default value of
+    the ``with`` keyword evaluates to the serialized (request string) value
+    of the form.
+    """
+    if options.get('frequency'):
+        return build_observer('Form.Observer', form_id, **options)
+    else:
+        return build_observer('Form.EventObserver', form_id, **options)
+
+def options_for_ajax(options):
+    js_options = build_callbacks(options)
+    
+    js_options['asynchronous'] = str(options.get('type') != 'synchronous').lower()
+    if options.get('method'):
+        if isinstance(options['method'], str) and options['method'].startswith("'"):
+            js_options['method'] = options['method']
+        else:
+            js_options['method'] = "'%s'" % options['method']
+    if options.get('position'):
+        js_options['insertion'] = "Insertion.%s" % camelize(options['position'])
+    js_options['evalScripts'] = str(options.get('script') is None or options['script']).lower()
+    
+    if options.get('form'):
+        js_options['parameters'] = 'Form.serialize(this)'
+    elif options.get('submit'):
+        js_options['parameters'] = "Form.serialize('%s')" % options['submit']
+    elif options.get('with'):
+        js_options['parameters'] = options['with']
+    
+    return options_for_javascript(js_options)
+
+def build_observer(cls, name, **options):
+    if options.get('update') is True:
+        options['with'] = options.get('with', 'value')
+    callback = remote_function(**options)
+    javascript = "new %s('%s', " % (cls, name)
+    if options.get('frequency'): 
+        javascript += "%s, " % options['frequency']
+    javascript += "function(element, value) {%s})" % callback
+    return javascript_tag(javascript)
+
+def build_callbacks(options):
+    callbacks = {}
+    for callback, code in options.iteritems():
+        if callback in CALLBACKS:
+            name = 'on' + callback.title()
+            callbacks[name] = "function(request){%s}" % code
+    return callbacks
+
+__all__ = ['link_to_remote', 'periodically_call_remote', 'form_remote_tag', 'submit_to_remote', 'update_element_function',
+           'evaluate_remote_response', 'remote_function', 'observe_field', 'observe_form']
Index: /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/rails/urls.py
===================================================================
--- /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/rails/urls.py (revision 3)
+++ /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/rails/urls.py (revision 3)
@@ -0,0 +1,311 @@
+"""URL Helpers"""
+# Last synced with Rails copy at Revision 4374 on Aug 20th, 2006.
+
+import cgi
+import urllib
+
+from webhelpers.util import html_escape
+
+from routes import url_for, request_config
+from javascript import *
+import tags
+
+def get_url(url):
+    if callable(url):
+        return url()
+    else:
+        return url
+
+def url(*args, **kargs):
+    """
+    Lazily evaluates url_for() arguments
+    
+    Used instead of url_for() for functions so that the function will be evaluated
+    in a lazy manner rather than at initial function call.
+    """
+    args = args
+    kargs = kargs
+    def call():
+        return url_for(*args, **kargs)
+    return call
+
+def link_to(name, url='', **html_options):
+    """
+    Creates a link tag of the given ``name`` using an URL created by the set of ``options``.
+    
+    See the valid options in the documentation for Routes url_for.
+    
+    The html_options has three special features. One for creating javascript confirm alerts where if you pass
+    ``confirm='Are you sure?'`` , the link will be guarded with a JS popup asking that question. If the user
+    accepts, the link is processed, otherwise not.
+    
+    Another for creating a popup window, which is done by either passing ``popup`` with True or the options
+    of the window in Javascript form.
+    
+    And a third for making the link do a POST request (instead of the regular GET) through a dynamically added
+    form element that is instantly submitted. Note that if the user has turned off Javascript, the request will
+    fall back on the GET. So its your responsibility to determine what the action should be once it arrives at
+    the controller. The POST form is turned on by passing ``post`` as True. Note, it's not possible to use POST
+    requests and popup targets at the same time (an exception will be thrown).
+    
+    Examples::
+    
+        >>> link_to("Delete this page", url(action="destroy", id=4), confirm="Are you sure?")
+        >>> link_to("Help", url(action="help"), popup=True)
+        >>> link_to("Busy loop", url(action="busy"), popup=['new_window', 'height=300,width=600'])
+        >>> link_to("Destroy account", url(action="destroy"), confirm="Are you sure?", method='delete')
+    """
+    if html_options:
+        html_options = convert_options_to_javascript(**html_options)
+        tag_op = tags.tag_options(**html_options)
+    else:
+        tag_op = ''
+    if callable(url):
+        url = url()
+    else:
+        url = html_escape(url)
+    return "<a href=\"%s\"%s>%s</a>" % (url, tag_op, name or url)
+
+def button_to(name, url='', **html_options):
+    """
+    Generates a form containing a sole button that submits to the
+    URL given by ``url``.  
+    
+    Use this method instead of ``link_to`` for actions that do not have the safe HTTP GET semantics
+    implied by using a hypertext link.
+    
+    The parameters are the same as for ``link_to``.  Any ``html_options`` that you pass will be
+    applied to the inner ``input`` element.
+    In particular, pass
+    
+        disabled = True/False
+    
+    as part of ``html_options`` to control whether the button is
+    disabled.  The generated form element is given the class
+    'button-to', to which you can attach CSS styles for display
+    purposes.
+    
+    Example 1::
+    
+        # inside of controller for "feeds"
+        >>> button_to("Edit", url(action='edit', id=3))
+        <form method="post" action="/feeds/edit/3" class="button-to">
+        <div><input value="Edit" type="submit" /></div>
+        </form>
+    
+    Example 2::
+    
+        >> button_to("Destroy", url(action='destroy', id=3), confirm="Are you sure?")
+        <form method="post" action="/feeds/destroy/3" class="button-to">
+        <div><input onclick="return confirm('Are you sure?');" value="Destroy" type="submit" />
+        </div>
+        </form>
+    
+    *NOTE*: This method generates HTML code that represents a form.
+    Forms are "block" content, which means that you should not try to
+    insert them into your HTML where only inline content is expected.
+    For example, you can legally insert a form inside of a ``div`` or
+    ``td`` element or in between ``p`` elements, but not in the middle of
+    a run of text, nor can you place a form within another form.
+    (Bottom line: Always validate your HTML before going public.)    
+    """
+    if html_options:
+        convert_boolean_attributes(html_options, ['disabled'])
+    
+    confirm = html_options.get('confirm')
+    if confirm:
+        del html_options['confirm']
+        html_options['onclick'] = "return %s;" % confirm_javascript_function(confirm)
+    
+    if callable(url):
+        ur = url()
+        url, name = ur, name or html_escape(ur)
+    else:
+        url, name = url, name or url
+    
+    html_options.update(dict(type='submit', value=name))
+    
+    return """<form method="post" action="%s" class="button-to"><div>""" % html_escape(url) + \
+           tags.tag("input", **html_options) + "</div></form>"
+
+def link_to_unless_current(name, url, **html_options):
+    """
+    Conditionally create a link tag of the given ``name`` using the ``url``
+    
+    If the current request uri is the same as the link's only the name is returned. This is useful
+    for creating link bars where you don't want to link to the page currently being viewed.
+    """
+    return link_to_unless(current_page(url), name, url, **html_options)
+
+def link_to_unless(condition, name, url, **html_options):
+    """
+    Conditionally create a link tag of the given ``name`` using the ``url``
+    
+    If ``condition`` is false only the name is returned.
+    """
+    if condition:
+        return name
+    else:
+        return link_to(name, url, **html_options)
+
+def link_to_if(condition, name, url, **html_options):
+    """
+    Conditionally create a link tag of the given ``name`` using the ``url`` 
+    
+    If ``condition`` is True only the name is returned.
+    """
+    link_to_unless(not condition, name, url, **html_options)
+
+def parse_querystring(environ):
+    """
+    Parses a query string into a list like ``[(name, value)]``.
+
+    You can pass the result to ``dict()``, but be aware that keys that appear multiple
+    times will be lost (only the last value will be preserved).
+
+    This function is cut and pasted from paste.request.parse_querystring (minus its
+    caching piece) to avoid requiring paste as a dependency.
+    """
+    source = environ.get('QUERY_STRING', '')
+    parsed = cgi.parse_qsl(source, keep_blank_values=True,
+                           strict_parsing=False)
+    return parsed
+
+def current_page(url):
+    """
+    Returns true if the current page uri is equivalent to ``url``
+    """
+    currl = current_url()
+    if callable(url):
+        return url() == currl
+    else:
+        return url == currl
+
+def current_url():
+    """
+    Returns the current page's url.
+    """
+    config = request_config()
+    environ = config.environ
+    curopts = config.mapper_dict.copy()
+    if environ.get('REQUEST_METHOD', 'GET') == 'GET':
+        if environ.has_key('QUERY_STRING'):
+            curopts.update(dict(parse_querystring(environ)))
+    return url_for(**curopts)
+
+def convert_options_to_javascript(confirm=None, popup=None, post=None, method=None, **html_options):
+    if method: method = method.lower()
+    
+    if post and not method:
+        method = 'post'
+    
+    if popup and method:
+        raise "You can't use popup and post in the same link"
+    elif confirm and popup:
+        oc = "if (%s) { %s };return false;" % (confirm_javascript_function(confirm), 
+                                               popup_javascript_function(popup))
+    elif confirm and method:
+        oc = "if (%s) { %s };return false;" % (confirm_javascript_function(confirm),
+                                               method_javascript_function(method))
+    elif confirm:
+        oc = "return %s;" % confirm_javascript_function(confirm)
+    elif method:
+        oc = "%sreturn false;" % method_javascript_function(method)
+    elif popup:
+        oc = popup_javascript_function(popup) + 'return false;'
+    else:
+        oc = html_options.get('onclick')
+    html_options['onclick'] = oc
+    return html_options
+    
+def convert_boolean_attributes(html_options, bool_attrs):
+    for attr in bool_attrs:
+        if html_options.has_key(attr) and html_options[attr]:
+            html_options[attr] = attr
+        elif html_options.has_key(attr):
+            del html_options[attr]
+
+def confirm_javascript_function(confirm):
+    return "confirm('%s')" % escape_javascript(confirm)
+
+def popup_javascript_function(popup):
+    if isinstance(popup, list):
+        return "window.open(this.href,'%s','%s');" % (popup[0], popup[-1])
+    else:
+        return "window.open(this.href);"
+
+def method_javascript_function(method):
+    submit_function = "var f = document.createElement('form'); f.style.display = 'none'; " + \
+        "this.parentNode.appendChild(f); f.method = 'POST'; f.action = this.href;"
+    
+    if method != 'post':
+        submit_function += "var m = document.createElement('input'); m.setAttribute('type', 'hidden'); "
+        submit_function += "m.setAttribute('name', '_method'); m.setAttribute('value', '%s'); f.appendChild(m);" % method
+    
+    return submit_function + "f.submit();"
+
+
+def mail_to(email_address, name=None, cc=None, bcc=None, subject=None, 
+    body=None, replace_at=None, replace_dot=None, encode=None, **html_options):
+    """
+    Creates a link tag for starting an email to the specified 
+    ``email_address``, which is also used as the name of the link unless
+    ``name`` is specified. Additional HTML options, such as class or id, can be
+    passed in the ``html_options`` hash.
+    
+    You can also make it difficult for spiders to harvest email address by 
+    obfuscating them.
+    
+    Examples::
+    
+        >>> mail_to("me@domain.com", "My email", encode = "javascript")
+        <script type="text/javascript" language="javascript">eval(unescape('%64%6f%63%75%6d%65%6e%74%2e%77%72%69%74%65%28%27%3c%61%20%68%72%65%66%3d%22%6d%61%69%6c%74%6f%3a%6d%65%40%64%6f%6d%61%69%6e%2e%63%6f%6d%22%3e%4d%79%20%65%6d%61%69%6c%3c%2f%61%3e%27%29%3b'))</script>
+    
+        >>> mail_to("me@domain.com", "My email", encode = "hex")
+        <a href="mailto:%6d%65@%64%6f%6d%61%69%6e.%63%6f%6d">My email</a>
+    
+    You can also specify the cc address, bcc address, subject, and body parts
+    of the message header to create a complex e-mail using the corresponding
+    ``cc``, ``bcc``, ``subject``, and ``body`` keyword arguments. Each of these
+    options are URI escaped and then appended to the ``email_address`` before
+    being output. **Be aware that javascript keywords will not be escaped and
+    may break this feature when encoding with javascript.**
+    
+    Examples::
+    
+        >>> mail_to("me@domain.com", "My email", cc="ccaddress@domain.com", bcc="bccaddress@domain.com", 
+        subject="This is an examjust    ple email", body= "This is the body of the message.")
+        <a href="mailto:me@domain.com?cc="ccaddress@domain.com"&bcc="bccaddress@domain.com"&body="This%20is%20the%20body%20of%20the%20message."&subject="This%20is%20an%20example%20email">My email</a>
+    """
+    extras = {}
+    for key, option in ('cc', cc), ('bcc', bcc), ('subject', subject), ('body', body):
+        if option:
+            extras[key] = option
+    options_query = urllib.urlencode(extras).replace("+", "%20")
+
+    email_address_obfuscated = email_address
+    if replace_at:
+        email_address_obfuscated = email_address_obfuscated.replace('@', replace_at)
+    if replace_dot:
+        email_address_obfuscated = email_address_obfuscated.replace('.', replace_dot)
+
+    if encode=='hex':
+        email_address = ''.join(['%%%x' % ord(x) for x in email_address])
+
+    url = 'mailto:' + email_address
+    if options_query:
+        url += '?' + options_query
+    html_options['href'] = url
+
+    tag = tags.content_tag('a', name or email_address_obfuscated, **html_options)
+
+    if encode =='javascript':
+        tmp = "document.write('%s');" % tag
+        string = ''.join(['%%%x' % ord(x) for x in tmp])
+        return javascript_tag("eval(unescape('%s'))" % string)
+    else : 
+        return tag
+    
+
+__all__ = ['url', 'link_to', 'button_to', 'link_to_unless_current', 'link_to_unless', 'link_to_if',
+           'current_page', 'current_url', 'mail_to']
Index: /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/rails/javascript.py
===================================================================
--- /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/rails/javascript.py (revision 3)
+++ /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/webhelpers/rails/javascript.py (revision 3)
@@ -0,0 +1,84 @@
+"""
+Javascript Helpers
+
+Provides functionality for working with JavaScript in your views.
+
+Ajax, controls and visual effects
+---------------------------------
+
+* For information on using Ajax, see `Prototype Helpers <module-railshelpers.helpers.prototype.html>`_.
+* For information on using controls and visual effects, see `Scriptaculous Helpers <module-railshelpers.helpers.scriptaculous.html>`_.
+"""
+# Last synced with Rails copy at Revision 4235 on Aug 19th, 2006.
+
+import re
+from tags import *
+
+def link_to_function(name, function, **html_options):
+    """
+    Returns a link that'll trigger a JavaScript ``function`` using the 
+    onclick handler and return false after the fact.
+    
+    Example::
+    
+        link_to_function("Greeting", "alert('Hello world!')")
+    """
+    options = dict(href="#", onclick="%s; return false;" % function)
+    options.update(html_options)
+    return content_tag("a", name, **options)
+
+def button_to_function(name, function, **html_options):
+    """
+    Returns a link that'll trigger a JavaScript ``function`` using the 
+    onclick handler and return false after the fact.
+    
+    Example::
+    
+        button_to_function("Greeting", "alert('Hello world!')")
+    """
+    options = dict(type_="button", value=name, onclick="%s; " % function)
+    options.update(html_options)
+    return content_tag("input", "", **options)
+
+def escape_javascript(javascript):
+    """
+    Escape carriage returns and single and double quotes for JavaScript segments.
+    """
+    javascript = re.sub(r'\r\n|\n|\r', r'\\n', (javascript or ''))
+    javascript = re.sub(r'(["\'])', r'\\\1', javascript)
+    return javascript
+
+def javascript_tag(content):
+    """
+    Returns a JavaScript tag with the ``content`` inside.
+    
+    Example::
+    
+        >>> javascript_tag("alert('All is good')"
+        '<script type="text/javascript">alert('All is good')</script>'
+    """
+    return content_tag("script", javascript_cdata_section(content), type="text/javascript")
+
+def javascript_cdata_section(content):
+    return "\n//%s\n" % cdata_section("\n%s\n//" % content)
+
+def options_for_javascript(options):
+    optionlist = []
+    for key, value in options.iteritems():
+        if isinstance(value, bool):
+            value = str(value).lower()
+        optionlist.append('%s:%s' % (key, value))
+    optionlist.sort()
+    return '{' + ', '.join(optionlist) + '}'
+
+def array_or_string_for_javascript(option):
+    jsoption = None
+    if isinstance(option, list):
+        jsoption = "['%s']" % '\',\''.join(option)
+    elif isinstance(option, bool):
+        jsoption = str(option).lower()
+    else:
+        jsoption = "'%s'" % option
+    return jsoption
+
+__all__ = ['link_to_function', 'button_to_function', 'escape_javascript', 'javascript_tag']
Index: /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/EGG-INFO/SOURCES.txt
===================================================================
--- /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/EGG-INFO/SOURCES.txt (revision 3)
+++ /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/EGG-INFO/SOURCES.txt (revision 3)
@@ -0,0 +1,30 @@
+scramble.py
+setup.cfg
+WebHelpers.egg-info/PKG-INFO
+WebHelpers.egg-info/SOURCES.txt
+WebHelpers.egg-info/dependency_links.txt
+WebHelpers.egg-info/not-zip-safe
+WebHelpers.egg-info/requires.txt
+WebHelpers.egg-info/top_level.txt
+webhelpers/__init__.py
+webhelpers/feedgenerator.py
+webhelpers/hinclude.py
+webhelpers/htmlgen.py
+webhelpers/markdown.py
+webhelpers/textile.py
+webhelpers/util.py
+webhelpers/pagination/__init__.py
+webhelpers/pagination/links.py
+webhelpers/pagination/orm.py
+webhelpers/rails/__init__.py
+webhelpers/rails/asset_tag.py
+webhelpers/rails/date.py
+webhelpers/rails/form_options.py
+webhelpers/rails/form_tag.py
+webhelpers/rails/javascript.py
+webhelpers/rails/number.py
+webhelpers/rails/prototype.py
+webhelpers/rails/scriptaculous.py
+webhelpers/rails/tags.py
+webhelpers/rails/text.py
+webhelpers/rails/urls.py
Index: /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/EGG-INFO/top_level.txt
===================================================================
--- /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/EGG-INFO/top_level.txt (revision 3)
+++ /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/EGG-INFO/top_level.txt (revision 3)
@@ -0,0 +1,1 @@
+webhelpers
Index: /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/EGG-INFO/PKG-INFO
===================================================================
--- /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/EGG-INFO/PKG-INFO (revision 3)
+++ /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/EGG-INFO/PKG-INFO (revision 3)
@@ -0,0 +1,27 @@
+Metadata-Version: 1.0
+Name: WebHelpers
+Version: 0.2
+Summary: Web Helpers
+Home-page: http://pylonshq.com/WebHelpers/
+Author: Ben Bangert, James Gardner
+Author-email: ben@groovie.org
+License: UNKNOWN
+Description: 
+        Web Helpers is a library of helper functions intended to make writing templates in web
+        applications easier.
+        
+        One of the sub-sections of Web Helpers contains a full port of the template helpers that
+        are provided by Ruby on Rails with slight adaptations on occasion to accomodate for Python.
+        
+        Some of these helpers only require `Routes <http://routes.groovie.org/>`_ to function.
+        
+        * `Development svn <http://pylonshq.com/svn/WebHelpers/trunk#egg=WebHelpers-dev>`_
+        
+        
+Platform: UNKNOWN
+Classifier: Development Status :: 4 - Beta
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: BSD License
+Classifier: Programming Language :: Python
+Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
+Classifier: Topic :: Software Development :: Libraries :: Python Modules
Index: /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/EGG-INFO/dependency_links.txt
===================================================================
--- /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/EGG-INFO/dependency_links.txt (revision 3)
+++ /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/EGG-INFO/dependency_links.txt (revision 3)
@@ -0,0 +1,1 @@
+
Index: /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/EGG-INFO/not-zip-safe
===================================================================
--- /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/EGG-INFO/not-zip-safe (revision 3)
+++ /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/EGG-INFO/not-zip-safe (revision 3)
@@ -0,0 +1,1 @@
+
Index: /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/EGG-INFO/requires.txt
===================================================================
--- /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/EGG-INFO/requires.txt (revision 3)
+++ /galaxy-central/eggs/WebHelpers-0.2-py2.6.egg/EGG-INFO/requires.txt (revision 3)
@@ -0,0 +1,2 @@
+Routes>=1.1
+simplejson>=1.4
Index: /galaxy-central/eggs/Routes-1.12.3-py2.6.egg/routes/base.py
===================================================================
--- /galaxy-central/eggs/Routes-1.12.3-py2.6.egg/routes/base.py (revision 3)
+++ /galaxy-central/eggs/Routes-1.12.3-py2.6.egg/routes/base.py (revision 3)
@@ -0,0 +1,4 @@
+"""Route and Mapper core classes"""
+from routes import request_config
+from routes.mapper import Mapper
+from routes.route import Route
Index: /galaxy-central/eggs/Routes-1.12.3-py2.6.egg/routes/middleware.py
===================================================================
--- /galaxy-central/eggs/Routes-1.12.3-py2.6.egg/routes/middleware.py (revision 3)
+++ /galaxy-central/eggs/Routes-1.12.3-py2.6.egg/routes/middleware.py (revision 3)
@@ -0,0 +1,146 @@
+"""Routes WSGI Middleware"""
+import re
+import logging
+
+from webob import Request
+
+from routes.base import request_config
+from routes.util import URLGenerator, url_for
+
+log = logging.getLogger('routes.middleware')
+
+class RoutesMiddleware(object):
+    """Routing middleware that handles resolving the PATH_INFO in
+    addition to optionally recognizing method overriding."""
+    def __init__(self, wsgi_app, mapper, use_method_override=True, 
+                 path_info=True, singleton=True):
+        """Create a Route middleware object
+        
+        Using the use_method_override keyword will require Paste to be
+        installed, and your application should use Paste's WSGIRequest
+        object as it will properly handle POST issues with wsgi.input
+        should Routes check it.
+        
+        If path_info is True, then should a route var contain
+        path_info, the SCRIPT_NAME and PATH_INFO will be altered
+        accordingly. This should be used with routes like:
+        
+        .. code-block:: python
+        
+            map.connect('blog/*path_info', controller='blog', path_info='')
+        
+        """
+        self.app = wsgi_app
+        self.mapper = mapper
+        self.singleton = singleton
+        self.use_method_override = use_method_override
+        self.path_info = path_info
+        log_debug = self.log_debug = logging.DEBUG >= log.getEffectiveLevel()
+        if self.log_debug:
+            log.debug("Initialized with method overriding = %s, and path "
+                  "info altering = %s", use_method_override, path_info)
+    
+    def __call__(self, environ, start_response):
+        """Resolves the URL in PATH_INFO, and uses wsgi.routing_args
+        to pass on URL resolver results."""
+        old_method = None
+        if self.use_method_override:
+            req = None
+            
+            # In some odd cases, there's no query string
+            try:
+                qs = environ['QUERY_STRING']
+            except KeyError:
+                qs = ''
+            if '_method' in qs:
+                req = Request(environ)
+                req.errors = 'ignore'
+                if '_method' in req.GET:
+                    old_method = environ['REQUEST_METHOD']
+                    environ['REQUEST_METHOD'] = req.GET['_method'].upper()
+                    if self.log_debug:
+                        log.debug("_method found in QUERY_STRING, altering request"
+                                " method to %s", environ['REQUEST_METHOD'])
+            elif environ['REQUEST_METHOD'] == 'POST' and is_form_post(environ):
+                if req is None:
+                    req = Request(environ)
+                    req.errors = 'ignore'
+                if '_method' in req.POST:
+                    old_method = environ['REQUEST_METHOD']
+                    environ['REQUEST_METHOD'] = req.POST['_method'].upper()
+                    if self.log_debug:
+                        log.debug("_method found in POST data, altering request "
+                                  "method to %s", environ['REQUEST_METHOD'])
+        
+        # Run the actual route matching
+        # -- Assignment of environ to config triggers route matching
+        if self.singleton:
+            config = request_config()
+            config.mapper = self.mapper
+            config.environ = environ
+            match = config.mapper_dict
+            route = config.route
+        else:
+            results = self.mapper.routematch(environ=environ)
+            if results:
+                match, route = results[0], results[1]
+            else:
+                match = route = None
+                
+        if old_method:
+            environ['REQUEST_METHOD'] = old_method
+        
+        if not match:
+            match = {}
+            if self.log_debug:
+                urlinfo = "%s %s" % (environ['REQUEST_METHOD'], environ['PATH_INFO'])
+                log.debug("No route matched for %s", urlinfo)
+        elif self.log_debug:
+            urlinfo = "%s %s" % (environ['REQUEST_METHOD'], environ['PATH_INFO'])
+            log.debug("Matched %s", urlinfo)
+            log.debug("Route path: '%s', defaults: %s", route.routepath, 
+                      route.defaults)
+            log.debug("Match dict: %s", match)
+                
+        url = URLGenerator(self.mapper, environ)
+        environ['wsgiorg.routing_args'] = ((url), match)
+        environ['routes.route'] = route
+        environ['routes.url'] = url
+
+        if route and route.redirect:
+            route_name = '_redirect_%s' % id(route)
+            location = url(route_name, **match)
+            log.debug("Using redirect route, redirect to '%s' with status"
+                      "code: %s", location, route.redirect_status)
+            start_response(route.redirect_status, 
+                           [('Content-Type', 'text/plain; charset=utf8'), 
+                            ('Location', location)])
+            return []
+
+        # If the route included a path_info attribute and it should be used to
+        # alter the environ, we'll pull it out
+        if self.path_info and 'path_info' in match:
+            oldpath = environ['PATH_INFO']
+            newpath = match.get('path_info') or ''
+            environ['PATH_INFO'] = newpath
+            if not environ['PATH_INFO'].startswith('/'):
+                environ['PATH_INFO'] = '/' + environ['PATH_INFO']
+            environ['SCRIPT_NAME'] += re.sub(r'^(.*?)/' + re.escape(newpath) + '$', 
+                                             r'\1', oldpath)
+        
+        response = self.app(environ, start_response)
+        
+        # Wrapped in try as in rare cases the attribute will be gone already
+        try:
+            del self.mapper.environ
+        except AttributeError:
+            pass
+        return response
+
+def is_form_post(environ):
+    """Determine whether the request is a POSTed html form"""
+    content_type = environ.get('CONTENT_TYPE', '').lower()
+    if ';' in content_type:
+        content_type = content_type.split(';', 1)[0]
+    return content_type in ('application/x-www-form-urlencoded',
+                            'multipart/form-data')
Index: /galaxy-central/eggs/Routes-1.12.3-py2.6.egg/routes/util.py
===================================================================
--- /galaxy-central/eggs/Routes-1.12.3-py2.6.egg/routes/util.py (revision 3)
+++ /galaxy-central/eggs/Routes-1.12.3-py2.6.egg/routes/util.py (revision 3)
@@ -0,0 +1,504 @@
+"""Utility functions for use in templates / controllers
+
+*PLEASE NOTE*: Many of these functions expect an initialized RequestConfig
+object. This is expected to have been initialized for EACH REQUEST by the web
+framework.
+
+"""
+import os
+import re
+import urllib
+from routes import request_config
+
+
+class RoutesException(Exception):
+    """Tossed during Route exceptions"""
+
+
+class MatchException(RoutesException):
+    """Tossed during URL matching exceptions"""
+
+
+class GenerationException(RoutesException):
+    """Tossed during URL generation exceptions"""
+
+
+def _screenargs(kargs, mapper, environ, force_explicit=False):
+    """
+    Private function that takes a dict, and screens it against the current 
+    request dict to determine what the dict should look like that is used. 
+    This is responsible for the requests "memory" of the current.
+    """
+    # Coerce any unicode args with the encoding
+    encoding = mapper.encoding
+    for key, val in kargs.iteritems():
+        if isinstance(val, unicode):
+            kargs[key] = val.encode(encoding)
+    
+    if mapper.explicit and mapper.sub_domains and not force_explicit:
+        return _subdomain_check(kargs, mapper, environ)
+    elif mapper.explicit and not force_explicit:
+        return kargs
+    
+    controller_name = kargs.get('controller')
+    
+    if controller_name and controller_name.startswith('/'):
+        # If the controller name starts with '/', ignore route memory
+        kargs['controller'] = kargs['controller'][1:]
+        return kargs
+    elif controller_name and not kargs.has_key('action'):
+        # Fill in an action if we don't have one, but have a controller
+        kargs['action'] = 'index'
+    
+    route_args = environ.get('wsgiorg.routing_args')
+    if route_args:
+        memory_kargs = route_args[1].copy()
+    else:
+        memory_kargs = {}
+     
+    # Remove keys from memory and kargs if kargs has them as None
+    for key in [key for key in kargs.keys() if kargs[key] is None]:
+        del kargs[key]
+        if memory_kargs.has_key(key):
+            del memory_kargs[key]
+    
+    # Merge the new args on top of the memory args
+    memory_kargs.update(kargs)
+    
+    # Setup a sub-domain if applicable
+    if mapper.sub_domains:
+        memory_kargs = _subdomain_check(memory_kargs, mapper, environ)
+    return memory_kargs
+
+
+def _subdomain_check(kargs, mapper, environ):
+    """Screen the kargs for a subdomain and alter it appropriately depending
+    on the current subdomain or lack therof."""
+    if mapper.sub_domains:
+        subdomain = kargs.pop('sub_domain', None)
+        if isinstance(subdomain, unicode):
+            subdomain = str(subdomain)
+        
+        fullhost = environ.get('HTTP_HOST') or environ.get('SERVER_NAME')
+        
+        # In case environ defaulted to {}
+        if not fullhost:
+            return kargs
+        
+        hostmatch = fullhost.split(':')
+        host = hostmatch[0]
+        port = ''
+        if len(hostmatch) > 1:
+            port += ':' + hostmatch[1]
+        sub_match = re.compile('^.+?\.(%s)$' % mapper.domain_match)
+        domain = re.sub(sub_match, r'\1', host)
+        if subdomain and not host.startswith(subdomain) and \
+            subdomain not in mapper.sub_domains_ignore:
+            kargs['_host'] = subdomain + '.' + domain + port
+        elif (subdomain in mapper.sub_domains_ignore or \
+            subdomain is None) and domain != host:
+            kargs['_host'] = domain + port
+        return kargs
+    else:
+        return kargs
+
+
+def _url_quote(string, encoding):
+    """A Unicode handling version of urllib.quote."""
+    if encoding:
+        if isinstance(string, unicode):
+            s = string.encode(encoding)
+        elif isinstance(string, str):
+            # assume the encoding is already correct
+            s = string
+        else:
+            s = unicode(string).encode(encoding)
+    else:
+        s = str(string)
+    return urllib.quote(s, '/')
+
+
+def _str_encode(string, encoding):
+    if encoding:
+        if isinstance(string, unicode):
+            s = string.encode(encoding)
+        elif isinstance(string, str):
+            # assume the encoding is already correct
+            s = string
+        else:
+            s = unicode(string).encode(encoding)
+    return s
+
+
+def url_for(*args, **kargs):
+    """Generates a URL 
+    
+    All keys given to url_for are sent to the Routes Mapper instance for 
+    generation except for::
+        
+        anchor          specified the anchor name to be appened to the path
+        host            overrides the default (current) host if provided
+        protocol        overrides the default (current) protocol if provided
+        qualified       creates the URL with the host/port information as 
+                        needed
+        
+    The URL is generated based on the rest of the keys. When generating a new 
+    URL, values will be used from the current request's parameters (if 
+    present). The following rules are used to determine when and how to keep 
+    the current requests parameters:
+    
+    * If the controller is present and begins with '/', no defaults are used
+    * If the controller is changed, action is set to 'index' unless otherwise 
+      specified
+    
+    For example, if the current request yielded a dict of
+    {'controller': 'blog', 'action': 'view', 'id': 2}, with the standard 
+    ':controller/:action/:id' route, you'd get the following results::
+    
+        url_for(id=4)                    =>  '/blog/view/4',
+        url_for(controller='/admin')     =>  '/admin',
+        url_for(controller='admin')      =>  '/admin/view/2'
+        url_for(action='edit')           =>  '/blog/edit/2',
+        url_for(action='list', id=None)  =>  '/blog/list'
+    
+    **Static and Named Routes**
+    
+    If there is a string present as the first argument, a lookup is done 
+    against the named routes table to see if there's any matching routes. The
+    keyword defaults used with static routes will be sent in as GET query 
+    arg's if a route matches.
+    
+    If no route by that name is found, the string is assumed to be a raw URL. 
+    Should the raw URL begin with ``/`` then appropriate SCRIPT_NAME data will
+    be added if present, otherwise the string will be used as the url with 
+    keyword args becoming GET query args.
+    
+    """
+    anchor = kargs.get('anchor')
+    host = kargs.get('host')
+    protocol = kargs.get('protocol')
+    qualified = kargs.pop('qualified', None)
+    
+    # Remove special words from kargs, convert placeholders
+    for key in ['anchor', 'host', 'protocol']:
+        if kargs.get(key):
+            del kargs[key]
+    config = request_config()
+    route = None
+    static = False
+    encoding = config.mapper.encoding
+    url = ''
+    if len(args) > 0:
+        route = config.mapper._routenames.get(args[0])
+        
+        # No named route found, assume the argument is a relative path
+        if not route:
+            static = True
+            url = args[0]
+        
+        if url.startswith('/') and hasattr(config, 'environ') \
+                and config.environ.get('SCRIPT_NAME'):
+            url = config.environ.get('SCRIPT_NAME') + url
+        
+        if static:
+            if kargs:
+                url += '?'
+                query_args = []
+                for key, val in kargs.iteritems():
+                    if isinstance(val, (list, tuple)):
+                        for value in val:
+                            query_args.append("%s=%s" % (
+                                urllib.quote(unicode(key).encode(encoding)),
+                                urllib.quote(unicode(value).encode(encoding))))
+                    else:
+                        query_args.append("%s=%s" % (
+                            urllib.quote(unicode(key).encode(encoding)),
+                            urllib.quote(unicode(val).encode(encoding))))
+                url += '&'.join(query_args)
+    environ = getattr(config, 'environ', {})
+    if 'wsgiorg.routing_args' not in environ:
+        environ = environ.copy()
+        mapper_dict = getattr(config, 'mapper_dict', None)
+        if mapper_dict is not None:
+            match_dict = mapper_dict.copy()
+        else:
+            match_dict = {}
+        environ['wsgiorg.routing_args'] = ((), match_dict)
+    
+    if not static:
+        route_args = []
+        if route:
+            if config.mapper.hardcode_names:
+                route_args.append(route)
+            newargs = route.defaults.copy()
+            newargs.update(kargs)
+            
+            # If this route has a filter, apply it
+            if route.filter:
+                newargs = route.filter(newargs)
+            
+            if not route.static:
+                # Handle sub-domains
+                newargs = _subdomain_check(newargs, config.mapper, environ)
+        else:
+            newargs = _screenargs(kargs, config.mapper, environ)
+        anchor = newargs.pop('_anchor', None) or anchor
+        host = newargs.pop('_host', None) or host
+        protocol = newargs.pop('_protocol', None) or protocol
+        url = config.mapper.generate(*route_args, **newargs)
+    if anchor is not None:
+        url += '#' + _url_quote(anchor, encoding)
+    if host or protocol or qualified:
+        if not host and not qualified:
+            # Ensure we don't use a specific port, as changing the protocol
+            # means that we most likely need a new port
+            host = config.host.split(':')[0]
+        elif not host:
+            host = config.host
+        if not protocol:
+            protocol = config.protocol
+        if url is not None:
+            url = protocol + '://' + host + url
+    
+    if not isinstance(url, str) and url is not None:
+        raise GenerationException("url_for can only return a string, got "
+                        "unicode instead: %s" % url)
+    if url is None:
+        raise GenerationException(
+            "url_for could not generate URL. Called with args: %s %s" % \
+            (args, kargs))
+    return url
+
+
+class URLGenerator(object):
+    """The URL Generator generates URL's
+    
+    It is automatically instantiated by the RoutesMiddleware and put
+    into the ``wsgiorg.routing_args`` tuple accessible as::
+    
+        url = environ['wsgiorg.routing_args'][0][0]
+    
+    Or via the ``routes.url`` key::
+    
+        url = environ['routes.url']
+    
+    The url object may be instantiated outside of a web context for use
+    in testing, however sub_domain support and fully qualified URL's
+    cannot be generated without supplying a dict that must contain the
+    key ``HTTP_HOST``.
+    
+    """
+    def __init__(self, mapper, environ):
+        """Instantiate the URLGenerator
+        
+        ``mapper``
+            The mapper object to use when generating routes.
+        ``environ``
+            The environment dict used in WSGI, alternately, any dict
+            that contains at least an ``HTTP_HOST`` value.
+        
+        """
+        self.mapper = mapper
+        if 'SCRIPT_NAME' not in environ:
+            environ['SCRIPT_NAME'] = ''
+        self.environ = environ
+    
+    def __call__(self, *args, **kargs):
+        """Generates a URL 
+
+        All keys given to url_for are sent to the Routes Mapper instance for 
+        generation except for::
+
+            anchor          specified the anchor name to be appened to the path
+            host            overrides the default (current) host if provided
+            protocol        overrides the default (current) protocol if provided
+            qualified       creates the URL with the host/port information as 
+                            needed
+
+        """
+        anchor = kargs.get('anchor')
+        host = kargs.get('host')
+        protocol = kargs.get('protocol')
+        qualified = kargs.pop('qualified', None)
+
+        # Remove special words from kargs, convert placeholders
+        for key in ['anchor', 'host', 'protocol']:
+            if kargs.get(key):
+                del kargs[key]
+        
+        route = None
+        use_current = '_use_current' in kargs and kargs.pop('_use_current')
+        
+        static = False
+        encoding = self.mapper.encoding
+        url = ''
+                
+        more_args = len(args) > 0
+        if more_args:
+            route = self.mapper._routenames.get(args[0])
+        
+        if not route and more_args:
+            static = True
+            url = args[0]
+            if url.startswith('/') and self.environ.get('SCRIPT_NAME'):
+                url = self.environ.get('SCRIPT_NAME') + url
+
+            if static:
+                if kargs:
+                    url += '?'
+                    query_args = []
+                    for key, val in kargs.iteritems():
+                        if isinstance(val, (list, tuple)):
+                            for value in val:
+                                query_args.append("%s=%s" % (
+                                    urllib.quote(unicode(key).encode(encoding)),
+                                    urllib.quote(unicode(value).encode(encoding))))
+                        else:
+                            query_args.append("%s=%s" % (
+                                urllib.quote(unicode(key).encode(encoding)),
+                                urllib.quote(unicode(val).encode(encoding))))
+                    url += '&'.join(query_args)
+        if not static:
+            route_args = []
+            if route:
+                if self.mapper.hardcode_names:
+                    route_args.append(route)
+                newargs = route.defaults.copy()
+                newargs.update(kargs)
+                
+                # If this route has a filter, apply it
+                if route.filter:
+                    newargs = route.filter(newargs)
+                if not route.static or (route.static and not route.external):
+                    # Handle sub-domains, retain sub_domain if there is one
+                    sub = newargs.get('sub_domain', None)
+                    newargs = _subdomain_check(newargs, self.mapper,
+                                               self.environ)
+                    # If the route requires a sub-domain, and we have it, restore
+                    # it
+                    if 'sub_domain' in route.defaults:
+                        newargs['sub_domain'] = sub
+                    
+            elif use_current:
+                newargs = _screenargs(kargs, self.mapper, self.environ, force_explicit=True)
+            elif 'sub_domain' in kargs:
+                newargs = _subdomain_check(kargs, self.mapper, self.environ)
+            else:
+                newargs = kargs
+            
+            anchor = anchor or newargs.pop('_anchor', None)
+            host = host or newargs.pop('_host', None)
+            protocol = protocol or newargs.pop('_protocol', None)
+            newargs['_environ'] = self.environ
+            url = self.mapper.generate(*route_args, **newargs)
+        if anchor is not None:
+            url += '#' + _url_quote(anchor, encoding)
+        if host or protocol or qualified:
+            if 'routes.cached_hostinfo' not in self.environ:
+                cache_hostinfo(self.environ)
+            hostinfo = self.environ['routes.cached_hostinfo']
+            
+            if not host and not qualified:
+                # Ensure we don't use a specific port, as changing the protocol
+                # means that we most likely need a new port
+                host = hostinfo['host'].split(':')[0]
+            elif not host:
+                host = hostinfo['host']
+            if not protocol:
+                protocol = hostinfo['protocol']
+            if url is not None:
+                if host[-1] != '/':
+                    host += '/'
+                url = protocol + '://' + host + url.lstrip('/')
+
+        if not isinstance(url, str) and url is not None:
+            raise GenerationException("Can only return a string, got "
+                            "unicode instead: %s" % url)
+        if url is None:
+            raise GenerationException(
+                "Could not generate URL. Called with args: %s %s" % \
+                (args, kargs))
+        return url
+    
+    def current(self, *args, **kwargs):
+        """Generate a route that includes params used on the current
+        request
+        
+        The arguments for this method are identical to ``__call__``
+        except that arguments set to None will remove existing route
+        matches of the same name from the set of arguments used to
+        construct a URL.
+        """
+        return self(_use_current=True, *args, **kwargs)
+
+
+def redirect_to(*args, **kargs):
+    """Issues a redirect based on the arguments. 
+    
+    Redirect's *should* occur as a "302 Moved" header, however the web 
+    framework may utilize a different method.
+    
+    All arguments are passed to url_for to retrieve the appropriate URL, then
+    the resulting URL it sent to the redirect function as the URL.
+    """
+    target = url_for(*args, **kargs)
+    config = request_config()
+    return config.redirect(target)
+
+
+def cache_hostinfo(environ):
+    """Processes the host information and stores a copy
+    
+    This work was previously done but wasn't stored in environ, nor is
+    it guaranteed to be setup in the future (Routes 2 and beyond).
+    
+    cache_hostinfo processes environ keys that may be present to
+    determine the proper host, protocol, and port information to use
+    when generating routes.
+    
+    """
+    hostinfo = {}
+    if environ.get('HTTPS') or environ.get('wsgi.url_scheme') == 'https' \
+       or environ.get('HTTP_X_FORWARDED_PROTO') == 'https':
+        hostinfo['protocol'] = 'https'
+    else:
+        hostinfo['protocol'] = 'http'
+    if environ.get('HTTP_X_FORWARDED_HOST'):
+        hostinfo['host'] = environ['HTTP_X_FORWARDED_HOST']
+    elif environ.get('HTTP_HOST'):
+        hostinfo['host'] = environ['HTTP_HOST']
+    else:
+        hostinfo['host'] = environ['SERVER_NAME']
+        if environ.get('wsgi.url_scheme') == 'https':
+            if environ['SERVER_PORT'] != '443':
+                hostinfo['host'] += ':' + environ['SERVER_PORT']
+        else:
+            if environ['SERVER_PORT'] != '80':
+                hostinfo['host'] += ':' + environ['SERVER_PORT']
+    environ['routes.cached_hostinfo'] = hostinfo
+    return hostinfo
+
+
+def controller_scan(directory=None):
+    """Scan a directory for python files and use them as controllers"""
+    if directory is None:
+        return []
+    
+    def find_controllers(dirname, prefix=''):
+        """Locate controllers in a directory"""
+        controllers = []
+        for fname in os.listdir(dirname):
+            filename = os.path.join(dirname, fname)
+            if os.path.isfile(filename) and \
+                re.match('^[^_]{1,1}.*\.py$', fname):
+                controllers.append(prefix + fname[:-3])
+            elif os.path.isdir(filename):
+                controllers.extend(find_controllers(filename, 
+                                                    prefix=prefix+fname+'/'))
+        return controllers
+    def longest_first(fst, lst):
+        """Compare the length of one string to another, shortest goes first"""
+        return cmp(len(lst), len(fst))
+    controllers = find_controllers(directory)
+    controllers.sort(longest_first)
+    return controllers
Index: /galaxy-central/eggs/Routes-1.12.3-py2.6.egg/routes/route.py
===================================================================
--- /galaxy-central/eggs/Routes-1.12.3-py2.6.egg/routes/route.py (revision 3)
+++ /galaxy-central/eggs/Routes-1.12.3-py2.6.egg/routes/route.py (revision 3)
@@ -0,0 +1,742 @@
+import re
+import sys
+import urllib
+
+if sys.version < '2.4':
+    from sets import ImmutableSet as frozenset
+
+from routes.util import _url_quote as url_quote, _str_encode
+
+
+class Route(object):
+    """The Route object holds a route recognition and generation
+    routine.
+    
+    See Route.__init__ docs for usage.
+    
+    """
+    # reserved keys that don't count
+    reserved_keys = ['requirements']
+    
+    # special chars to indicate a natural split in the URL
+    done_chars = ('/', ',', ';', '.', '#')
+    
+    def __init__(self, name, routepath, **kargs):
+        """Initialize a route, with a given routepath for
+        matching/generation
+        
+        The set of keyword args will be used as defaults.
+        
+        Usage::
+        
+            >>> from routes.base import Route
+            >>> newroute = Route(None, ':controller/:action/:id')
+            >>> sorted(newroute.defaults.items())
+            [('action', 'index'), ('id', None)]
+            >>> newroute = Route(None, 'date/:year/:month/:day',  
+            ...     controller="blog", action="view")
+            >>> newroute = Route(None, 'archives/:page', controller="blog", 
+            ...     action="by_page", requirements = { 'page':'\d{1,2}' })
+            >>> newroute.reqs
+            {'page': '\\\d{1,2}'}
+        
+        .. Note:: 
+            Route is generally not called directly, a Mapper instance
+            connect method should be used to add routes.
+        
+        """
+        self.routepath = routepath
+        self.sub_domains = False
+        self.prior = None
+        self.redirect = False
+        self.name = name
+        self._kargs = kargs
+        self.minimization = kargs.pop('_minimize', False)
+        self.encoding = kargs.pop('_encoding', 'utf-8')
+        self.reqs = kargs.get('requirements', {})
+        self.decode_errors = 'replace'
+        
+        # Don't bother forming stuff we don't need if its a static route
+        self.static = kargs.pop('_static', False)
+        self.filter = kargs.pop('_filter', None)
+        self.absolute = kargs.pop('_absolute', False)
+        
+        # Pull out the member/collection name if present, this applies only to
+        # map.resource
+        self.member_name = kargs.pop('_member_name', None)
+        self.collection_name = kargs.pop('_collection_name', None)
+        self.parent_resource = kargs.pop('_parent_resource', None)
+        
+        # Pull out route conditions
+        self.conditions = kargs.pop('conditions', None)
+        
+        # Determine if explicit behavior should be used
+        self.explicit = kargs.pop('_explicit', False)
+                
+        # Since static need to be generated exactly, treat them as
+        # non-minimized
+        if self.static:
+            self.external = '://' in self.routepath
+            self.minimization = False
+        
+        # Strip preceding '/' if present, and not minimizing
+        if routepath.startswith('/') and self.minimization:
+            self.routepath = routepath[1:]
+        self._setup_route()
+        
+    def _setup_route(self):
+        # Build our routelist, and the keys used in the route
+        self.routelist = routelist = self._pathkeys(self.routepath)
+        routekeys = frozenset([key['name'] for key in routelist
+                               if isinstance(key, dict)])
+        self.dotkeys = frozenset([key['name'] for key in routelist
+                                  if isinstance(key, dict) and 
+                                     key['type'] == '.'])
+
+        if not self.minimization:
+            self.make_full_route()
+        
+        # Build a req list with all the regexp requirements for our args
+        self.req_regs = {}
+        for key, val in self.reqs.iteritems():
+            self.req_regs[key] = re.compile('^' + val + '$')
+        # Update our defaults and set new default keys if needed. defaults
+        # needs to be saved
+        (self.defaults, defaultkeys) = self._defaults(routekeys, 
+                                                      self.reserved_keys, 
+                                                      self._kargs.copy())
+        # Save the maximum keys we could utilize
+        self.maxkeys = defaultkeys | routekeys
+        
+        # Populate our minimum keys, and save a copy of our backward keys for
+        # quicker generation later
+        (self.minkeys, self.routebackwards) = self._minkeys(routelist[:])
+        
+        # Populate our hardcoded keys, these are ones that are set and don't 
+        # exist in the route
+        self.hardcoded = frozenset([key for key in self.maxkeys \
+            if key not in routekeys and self.defaults[key] is not None])
+        
+        # Cache our default keys
+        self._default_keys = frozenset(self.defaults.keys())
+    
+    def make_full_route(self):
+        """Make a full routelist string for use with non-minimized
+        generation"""
+        regpath = ''
+        for part in self.routelist:
+            if isinstance(part, dict):
+                regpath += '%(' + part['name'] + ')s'
+            else:
+                regpath += part
+        self.regpath = regpath
+    
+    def make_unicode(self, s):
+        """Transform the given argument into a unicode string."""
+        if isinstance(s, unicode):
+            return s
+        elif isinstance(s, str):
+            return s.decode(self.encoding)
+        elif callable(s):
+            return s
+        else:
+            return unicode(s)
+    
+    def _pathkeys(self, routepath):
+        """Utility function to walk the route, and pull out the valid
+        dynamic/wildcard keys."""
+        collecting = False
+        current = ''
+        done_on = ''
+        var_type = ''
+        just_started = False
+        routelist = []
+        for char in routepath:
+            if char in [':', '*', '{'] and not collecting and not self.static \
+               or char in ['{'] and not collecting:
+                just_started = True
+                collecting = True
+                var_type = char
+                if char == '{':
+                    done_on = '}'
+                    just_started = False
+                if len(current) > 0:
+                    routelist.append(current)
+                    current = ''
+            elif collecting and just_started:
+                just_started = False
+                if char == '(':
+                    done_on = ')'
+                else:
+                    current = char
+                    done_on = self.done_chars + ('-',)
+            elif collecting and char not in done_on:
+                current += char
+            elif collecting:
+                collecting = False
+                if var_type == '{':
+                    if current[0] == '.':
+                        var_type = '.'
+                        current = current[1:]
+                    else:
+                        var_type = ':'
+                    opts = current.split(':')
+                    if len(opts) > 1:
+                        current = opts[0]
+                        self.reqs[current] = opts[1]
+                routelist.append(dict(type=var_type, name=current))
+                if char in self.done_chars:
+                    routelist.append(char)
+                done_on = var_type = current = ''
+            else:
+                current += char
+        if collecting:
+            routelist.append(dict(type=var_type, name=current))
+        elif current:
+            routelist.append(current)
+        return routelist
+
+    def _minkeys(self, routelist):
+        """Utility function to walk the route backwards
+        
+        Will also determine the minimum keys we can handle to generate
+        a working route.
+        
+        routelist is a list of the '/' split route path
+        defaults is a dict of all the defaults provided for the route
+        
+        """
+        minkeys = []
+        backcheck = routelist[:]
+        
+        # If we don't honor minimization, we need all the keys in the
+        # route path
+        if not self.minimization:
+            for part in backcheck:
+                if isinstance(part, dict):
+                    minkeys.append(part['name'])
+            return (frozenset(minkeys), backcheck)
+        
+        gaps = False
+        backcheck.reverse()
+        for part in backcheck:
+            if not isinstance(part, dict) and part not in self.done_chars:
+                gaps = True
+                continue
+            elif not isinstance(part, dict):
+                continue
+            key = part['name']
+            if self.defaults.has_key(key) and not gaps:
+                continue
+            minkeys.append(key)
+            gaps = True
+        return  (frozenset(minkeys), backcheck)
+    
+    def _defaults(self, routekeys, reserved_keys, kargs):
+        """Creates default set with values stringified
+        
+        Put together our list of defaults, stringify non-None values
+        and add in our action/id default if they use it and didn't
+        specify it.
+        
+        defaultkeys is a list of the currently assumed default keys
+        routekeys is a list of the keys found in the route path
+        reserved_keys is a list of keys that are not
+        
+        """
+        defaults = {}
+        # Add in a controller/action default if they don't exist
+        if 'controller' not in routekeys and 'controller' not in kargs \
+           and not self.explicit:
+            kargs['controller'] = 'content'
+        if 'action' not in routekeys and 'action' not in kargs \
+           and not self.explicit:
+            kargs['action'] = 'index'
+        defaultkeys = frozenset([key for key in kargs.keys() \
+                                 if key not in reserved_keys])
+        for key in defaultkeys:
+            if kargs[key] is not None:
+                defaults[key] = self.make_unicode(kargs[key])
+            else:
+                defaults[key] = None
+        if 'action' in routekeys and not defaults.has_key('action') \
+           and not self.explicit:
+            defaults['action'] = 'index'
+        if 'id' in routekeys and not defaults.has_key('id') \
+           and not self.explicit:
+            defaults['id'] = None
+        newdefaultkeys = frozenset([key for key in defaults.keys() \
+                                    if key not in reserved_keys])
+        
+        return (defaults, newdefaultkeys)
+        
+    def makeregexp(self, clist, include_names=True):
+        """Create a regular expression for matching purposes
+        
+        Note: This MUST be called before match can function properly.
+        
+        clist should be a list of valid controller strings that can be 
+        matched, for this reason makeregexp should be called by the web
+        framework after it knows all available controllers that can be
+        utilized.
+        
+        include_names indicates whether this should be a match regexp
+        assigned to itself using regexp grouping names, or if names
+        should be excluded for use in a single larger regexp to
+        determine if any routes match
+        
+        """
+        if self.minimization:
+            reg = self.buildnextreg(self.routelist, clist, include_names)[0]
+            if not reg:
+                reg = '/'
+            reg = reg + '/?' + '$'
+        
+            if not reg.startswith('/'):
+                reg = '/' + reg
+        else:
+            reg = self.buildfullreg(clist, include_names)
+        
+        reg = '^' + reg
+        
+        if not include_names:
+            return reg
+        
+        self.regexp = reg
+        self.regmatch = re.compile(reg)
+    
+    def buildfullreg(self, clist, include_names=True):
+        """Build the regexp by iterating through the routelist and
+        replacing dicts with the appropriate regexp match"""
+        regparts = []
+        for part in self.routelist:
+            if isinstance(part, dict):
+                var = part['name']
+                if var == 'controller':
+                    partmatch = '|'.join(map(re.escape, clist))
+                elif part['type'] == ':':
+                    partmatch = self.reqs.get(var) or '[^/]+?'
+                elif part['type'] == '.':
+                    partmatch = self.reqs.get(var) or '[^/.]+?'
+                else:
+                    partmatch = self.reqs.get(var) or '.+?'
+                if include_names:
+                    regpart = '(?P<%s>%s)' % (var, partmatch)
+                else:
+                    regpart = '(?:%s)' % partmatch
+                if part['type'] == '.':
+                    regparts.append('(?:\.%s)??' % regpart)
+                else:
+                    regparts.append(regpart)
+            else:
+                regparts.append(re.escape(part))
+        regexp = ''.join(regparts) + '$'
+        return regexp
+    
+    def buildnextreg(self, path, clist, include_names=True):
+        """Recursively build our regexp given a path, and a controller
+        list.
+        
+        Returns the regular expression string, and two booleans that
+        can be ignored as they're only used internally by buildnextreg.
+        
+        """
+        if path:
+            part = path[0]
+        else:
+            part = ''
+        reg = ''
+        
+        # noreqs will remember whether the remainder has either a string 
+        # match, or a non-defaulted regexp match on a key, allblank remembers
+        # if the rest could possible be completely empty
+        (rest, noreqs, allblank) = ('', True, True)
+        if len(path[1:]) > 0:
+            self.prior = part
+            (rest, noreqs, allblank) = self.buildnextreg(path[1:], clist, include_names)
+        
+        if isinstance(part, dict) and part['type'] in (':', '.'):
+            var = part['name']
+            typ = part['type']
+            partreg = ''
+            
+            # First we plug in the proper part matcher
+            if self.reqs.has_key(var):
+                if include_names:
+                    partreg = '(?P<%s>%s)' % (var, self.reqs[var])
+                else:
+                    partreg = '(?:%s)' % self.reqs[var]
+                if typ == '.':
+                    partreg = '(?:\.%s)??' % partreg
+            elif var == 'controller':
+                if include_names:
+                    partreg = '(?P<%s>%s)' % (var, '|'.join(map(re.escape, clist)))
+                else:
+                    partreg = '(?:%s)' % '|'.join(map(re.escape, clist))
+            elif self.prior in ['/', '#']:
+                if include_names:
+                    partreg = '(?P<' + var + '>[^' + self.prior + ']+?)'
+                else:
+                    partreg = '(?:[^' + self.prior + ']+?)'
+            else:
+                if not rest:
+                    if typ == '.':
+                        exclude_chars = '/.'
+                    else:
+                        exclude_chars = '/'
+                    if include_names:
+                        partreg = '(?P<%s>[^%s]+?)' % (var, exclude_chars)
+                    else:
+                        partreg = '(?:[^%s]+?)' % exclude_chars
+                    if typ == '.':
+                        partreg = '(?:\.%s)??' % partreg
+                else:
+                    end = ''.join(self.done_chars)
+                    rem = rest
+                    if rem[0] == '\\' and len(rem) > 1:
+                        rem = rem[1]
+                    elif rem.startswith('(\\') and len(rem) > 2:
+                        rem = rem[2]
+                    else:
+                        rem = end
+                    rem = frozenset(rem) | frozenset(['/'])
+                    if include_names:
+                        partreg = '(?P<%s>[^%s]+?)' % (var, ''.join(rem))
+                    else:
+                        partreg = '(?:[^%s]+?)' % ''.join(rem)
+            
+            if self.reqs.has_key(var):
+                noreqs = False
+            if not self.defaults.has_key(var): 
+                allblank = False
+                noreqs = False
+            
+            # Now we determine if its optional, or required. This changes 
+            # depending on what is in the rest of the match. If noreqs is 
+            # true, then its possible the entire thing is optional as there's
+            # no reqs or string matches.
+            if noreqs:
+                # The rest is optional, but now we have an optional with a 
+                # regexp. Wrap to ensure that if we match anything, we match
+                # our regexp first. It's still possible we could be completely
+                # blank as we have a default
+                if self.reqs.has_key(var) and self.defaults.has_key(var):
+                    reg = '(' + partreg + rest + ')?'
+                
+                # Or we have a regexp match with no default, so now being 
+                # completely blank form here on out isn't possible
+                elif self.reqs.has_key(var):
+                    allblank = False
+                    reg = partreg + rest
+                
+                # If the character before this is a special char, it has to be
+                # followed by this
+                elif self.defaults.has_key(var) and \
+                     self.prior in (',', ';', '.'):
+                    reg = partreg + rest
+                
+                # Or we have a default with no regexp, don't touch the allblank
+                elif self.defaults.has_key(var):
+                    reg = partreg + '?' + rest
+                
+                # Or we have a key with no default, and no reqs. Not possible
+                # to be all blank from here
+                else:
+                    allblank = False
+                    reg = partreg + rest
+            # In this case, we have something dangling that might need to be
+            # matched
+            else:
+                # If they can all be blank, and we have a default here, we know
+                # its safe to make everything from here optional. Since 
+                # something else in the chain does have req's though, we have
+                # to make the partreg here required to continue matching
+                if allblank and self.defaults.has_key(var):
+                    reg = '(' + partreg + rest + ')?'
+                    
+                # Same as before, but they can't all be blank, so we have to 
+                # require it all to ensure our matches line up right
+                else:
+                    reg = partreg + rest
+        elif isinstance(part, dict) and part['type'] == '*':
+            var = part['name']
+            if noreqs:
+                if include_names:
+                    reg = '(?P<%s>.*)' % var + rest
+                else:
+                    reg = '(?:.*)' + rest
+                if not self.defaults.has_key(var):
+                    allblank = False
+                    noreqs = False
+            else:
+                if allblank and self.defaults.has_key(var):
+                    if include_names:
+                        reg = '(?P<%s>.*)' % var + rest
+                    else:
+                        reg = '(?:.*)' + rest
+                elif self.defaults.has_key(var):
+                    if include_names:
+                        reg = '(?P<%s>.*)' % var + rest
+                    else:
+                        reg = '(?:.*)' + rest
+                else:
+                    if include_names:
+                        reg = '(?P<%s>.*)' % var + rest
+                    else:
+                        reg = '(?:.*)' + rest
+                    allblank = False
+                    noreqs = False
+        elif part and part[-1] in self.done_chars:
+            if allblank:
+                reg = re.escape(part[:-1]) + '(' + re.escape(part[-1]) + rest
+                reg += ')?'
+            else:
+                allblank = False
+                reg = re.escape(part) + rest
+        
+        # We have a normal string here, this is a req, and it prevents us from 
+        # being all blank
+        else:
+            noreqs = False
+            allblank = False
+            reg = re.escape(part) + rest
+        
+        return (reg, noreqs, allblank)
+    
+    def match(self, url, environ=None, sub_domains=False, 
+              sub_domains_ignore=None, domain_match=''):
+        """Match a url to our regexp. 
+        
+        While the regexp might match, this operation isn't
+        guaranteed as there's other factors that can cause a match to
+        fail even though the regexp succeeds (Default that was relied
+        on wasn't given, requirement regexp doesn't pass, etc.).
+        
+        Therefore the calling function shouldn't assume this will
+        return a valid dict, the other possible return is False if a
+        match doesn't work out.
+        
+        """
+        # Static routes don't match, they generate only
+        if self.static:
+            return False
+        
+        match = self.regmatch.match(url)
+        
+        if not match:
+            return False
+            
+        sub_domain = None
+        
+        if sub_domains and environ and 'HTTP_HOST' in environ:
+            host = environ['HTTP_HOST'].split(':')[0]
+            sub_match = re.compile('^(.+?)\.%s$' % domain_match)
+            subdomain = re.sub(sub_match, r'\1', host)
+            if subdomain not in sub_domains_ignore and host != subdomain:
+                sub_domain = subdomain
+        
+        if self.conditions:
+            if 'method' in self.conditions and environ and \
+                environ['REQUEST_METHOD'] not in self.conditions['method']:
+                return False
+            
+            # Check sub-domains?
+            use_sd = self.conditions.get('sub_domain')
+            if use_sd and not sub_domain:
+                return False
+            elif not use_sd and 'sub_domain' in self.conditions and sub_domain:
+                return False
+            if isinstance(use_sd, list) and sub_domain not in use_sd:
+                return False
+        
+        matchdict = match.groupdict()
+        result = {}
+        extras = self._default_keys - frozenset(matchdict.keys())
+        for key, val in matchdict.iteritems():
+            if key != 'path_info' and self.encoding:
+                # change back into python unicode objects from the URL 
+                # representation
+                try:
+                    val = val and val.decode(self.encoding, self.decode_errors)
+                except UnicodeDecodeError:
+                    return False
+            
+            if not val and key in self.defaults and self.defaults[key]:
+                result[key] = self.defaults[key]
+            else:
+                result[key] = val
+        for key in extras:
+            result[key] = self.defaults[key]
+        
+        # Add the sub-domain if there is one
+        if sub_domains:
+            result['sub_domain'] = sub_domain
+        
+        # If there's a function, call it with environ and expire if it
+        # returns False
+        if self.conditions and 'function' in self.conditions and \
+            not self.conditions['function'](environ, result):
+            return False
+        
+        return result
+    
+    def generate_non_minimized(self, kargs):
+        """Generate a non-minimal version of the URL"""
+        # Iterate through the keys that are defaults, and NOT in the route
+        # path. If its not in kargs, or doesn't match, or is None, this
+        # route won't work
+        for k in self.maxkeys - self.minkeys:
+            if k not in kargs:
+                return False
+            elif self.make_unicode(kargs[k]) != \
+                self.make_unicode(self.defaults[k]):
+                return False
+                
+        # Ensure that all the args in the route path are present and not None
+        for arg in self.minkeys:
+            if arg not in kargs or kargs[arg] is None:
+                if arg in self.dotkeys:
+                    kargs[arg] = ''
+                else:
+                    return False
+
+        # Encode all the argument that the regpath can use
+        for k in kargs:
+            if k in self.maxkeys:
+                if k in self.dotkeys:
+                    if kargs[k]:
+                        kargs[k] = url_quote('.' + kargs[k], self.encoding)
+                else:
+                    kargs[k] = url_quote(kargs[k], self.encoding)
+
+        return self.regpath % kargs
+    
+    def generate_minimized(self, kargs):
+        """Generate a minimized version of the URL"""
+        routelist = self.routebackwards
+        urllist = []
+        gaps = False
+        for part in routelist:
+            if isinstance(part, dict) and part['type'] in (':', '.'):
+                arg = part['name']
+                
+                # For efficiency, check these just once
+                has_arg = kargs.has_key(arg)
+                has_default = self.defaults.has_key(arg)
+                
+                # Determine if we can leave this part off
+                # First check if the default exists and wasn't provided in the 
+                # call (also no gaps)
+                if has_default and not has_arg and not gaps:
+                    continue
+                    
+                # Now check to see if there's a default and it matches the 
+                # incoming call arg
+                if (has_default and has_arg) and self.make_unicode(kargs[arg]) == \
+                    self.make_unicode(self.defaults[arg]) and not gaps: 
+                    continue
+                
+                # We need to pull the value to append, if the arg is None and 
+                # we have a default, use that
+                if has_arg and kargs[arg] is None and has_default and not gaps:
+                    continue
+                
+                # Otherwise if we do have an arg, use that
+                elif has_arg:
+                    val = kargs[arg]
+                
+                elif has_default and self.defaults[arg] is not None:
+                    val = self.defaults[arg]
+                # Optional format parameter?
+                elif part['type'] == '.':
+                    continue
+                # No arg at all? This won't work
+                else:
+                    return False
+                    
+                urllist.append(url_quote(val, self.encoding))
+                if part['type'] == '.':
+                    urllist.append('.')
+
+                if has_arg:
+                    del kargs[arg]
+                gaps = True
+            elif isinstance(part, dict) and part['type'] == '*':
+                arg = part['name']
+                kar = kargs.get(arg)
+                if kar is not None:
+                    urllist.append(url_quote(kar, self.encoding))
+                    gaps = True
+            elif part and part[-1] in self.done_chars:
+                if not gaps and part in self.done_chars:
+                    continue
+                elif not gaps:
+                    urllist.append(part[:-1])
+                    gaps = True
+                else:
+                    gaps = True
+                    urllist.append(part)
+            else:
+                gaps = True
+                urllist.append(part)
+        urllist.reverse()
+        url = ''.join(urllist)
+        return url
+    
+    def generate(self, _ignore_req_list=False, _append_slash=False, **kargs):
+        """Generate a URL from ourself given a set of keyword arguments
+        
+        Toss an exception if this
+        set of keywords would cause a gap in the url.
+        
+        """
+        # Verify that our args pass any regexp requirements
+        if not _ignore_req_list:
+            for key in self.reqs.keys():
+                val = kargs.get(key)
+                if val and not self.req_regs[key].match(self.make_unicode(val)):
+                    return False
+        
+        # Verify that if we have a method arg, its in the method accept list. 
+        # Also, method will be changed to _method for route generation
+        meth = kargs.get('method')
+        if meth:
+            if self.conditions and 'method' in self.conditions \
+                and meth.upper() not in self.conditions['method']:
+                return False
+            kargs.pop('method')
+        
+        if self.minimization:
+            url = self.generate_minimized(kargs)
+        else:
+            url = self.generate_non_minimized(kargs)
+        
+        if url is False:
+            return url
+        
+        if not url.startswith('/') and not self.static:
+            url = '/' + url
+        extras = frozenset(kargs.keys()) - self.maxkeys
+        if extras:
+            if _append_slash and not url.endswith('/'):
+                url += '/'
+            fragments = []
+            # don't assume the 'extras' set preserves order: iterate
+            # through the ordered kargs instead
+            for key in kargs:
+                if key not in extras:
+                    continue
+                if key == 'action' or key == 'controller':
+                    continue
+                val = kargs[key]
+                if isinstance(val, (tuple, list)):
+                    for value in val:
+                        fragments.append((key, _str_encode(value, self.encoding)))
+                else:
+                    fragments.append((key, _str_encode(val, self.encoding)))
+            if fragments:
+                url += '?'
+                url += urllib.urlencode(fragments)
+        elif _append_slash and not url.endswith('/'):
+            url += '/'
+        return url
Index: /galaxy-central/eggs/Routes-1.12.3-py2.6.egg/routes/__init__.py
===================================================================
--- /galaxy-central/eggs/Routes-1.12.3-py2.6.egg/routes/__init__.py (revision 3)
+++ /galaxy-central/eggs/Routes-1.12.3-py2.6.egg/routes/__init__.py (revision 3)
@@ -0,0 +1,142 @@
+"""Provides common classes and functions most users will want access to."""
+import threading, sys
+
+class _RequestConfig(object):
+    """
+    RequestConfig thread-local singleton
+    
+    The Routes RequestConfig object is a thread-local singleton that should 
+    be initialized by the web framework that is utilizing Routes.
+    """
+    __shared_state = threading.local()
+    
+    def __getattr__(self, name):
+        return getattr(self.__shared_state, name)
+
+    def __setattr__(self, name, value):
+        """
+        If the name is environ, load the wsgi envion with load_wsgi_environ
+        and set the environ
+        """
+        if name == 'environ':
+            self.load_wsgi_environ(value)
+            return self.__shared_state.__setattr__(name, value)
+        return self.__shared_state.__setattr__(name, value)
+    
+    def __delattr__(self, name):
+        delattr(self.__shared_state, name)
+    
+    def load_wsgi_environ(self, environ):
+        """
+        Load the protocol/server info from the environ and store it.
+        Also, match the incoming URL if there's already a mapper, and
+        store the resulting match dict in mapper_dict.
+        """
+        if 'HTTPS' in environ or environ.get('wsgi.url_scheme') == 'https' \
+           or environ.get('HTTP_X_FORWARDED_PROTO') == 'https':
+            self.__shared_state.protocol = 'https'
+        else:
+            self.__shared_state.protocol = 'http'
+        try:
+            self.mapper.environ = environ
+        except AttributeError:
+            pass
+        
+        # Wrap in try/except as common case is that there is a mapper
+        # attached to self
+        try:
+            if 'PATH_INFO' in environ:
+                mapper = self.mapper
+                path = environ['PATH_INFO']
+                result = mapper.routematch(path)
+                if result is not None:
+                    self.__shared_state.mapper_dict = result[0]
+                    self.__shared_state.route = result[1]
+                else:
+                    self.__shared_state.mapper_dict = None
+                    self.__shared_state.route = None
+        except AttributeError:
+            pass
+        
+        if 'HTTP_X_FORWARDED_HOST' in environ:
+            self.__shared_state.host = environ['HTTP_X_FORWARDED_HOST']
+        elif 'HTTP_HOST' in environ:
+            self.__shared_state.host = environ['HTTP_HOST']
+        else:
+            self.__shared_state.host = environ['SERVER_NAME']
+            if environ['wsgi.url_scheme'] == 'https':
+                if environ['SERVER_PORT'] != '443':
+                    self.__shared_state.host += ':' + environ['SERVER_PORT']
+            else:
+                if environ['SERVER_PORT'] != '80':
+                    self.__shared_state.host += ':' + environ['SERVER_PORT']
+
+def request_config(original=False):
+    """
+    Returns the Routes RequestConfig object.
+    
+    To get the Routes RequestConfig:
+    
+    >>> from routes import *
+    >>> config = request_config()
+    
+    The following attributes must be set on the config object every request:
+    
+    mapper
+        mapper should be a Mapper instance thats ready for use
+    host
+        host is the hostname of the webapp
+    protocol
+        protocol is the protocol of the current request
+    mapper_dict
+        mapper_dict should be the dict returned by mapper.match()
+    redirect
+        redirect should be a function that issues a redirect, 
+        and takes a url as the sole argument
+    prefix (optional)
+        Set if the application is moved under a URL prefix. Prefix
+        will be stripped before matching, and prepended on generation
+    environ (optional)
+        Set to the WSGI environ for automatic prefix support if the
+        webapp is underneath a 'SCRIPT_NAME'
+        
+        Setting the environ will use information in environ to try and
+        populate the host/protocol/mapper_dict options if you've already
+        set a mapper.
+    
+    **Using your own requst local**
+    
+    If you have your own request local object that you'd like to use instead 
+    of the default thread local provided by Routes, you can configure Routes 
+    to use it::
+        
+        from routes import request_config()
+        config = request_config()
+        if hasattr(config, 'using_request_local'):
+            config.request_local = YourLocalCallable
+            config = request_config()
+    
+    Once you have configured request_config, its advisable you retrieve it 
+    again to get the object you wanted. The variable you assign to 
+    request_local is assumed to be a callable that will get the local config 
+    object you wish.
+    
+    This example tests for the presence of the 'using_request_local' attribute
+    which will be present if you haven't assigned it yet. This way you can 
+    avoid repeat assignments of the request specific callable.
+    
+    Should you want the original object, perhaps to change the callable its 
+    using or stop this behavior, call request_config(original=True).
+    """
+    obj = _RequestConfig()
+    try:
+        if obj.request_local and original is False:
+            return getattr(obj, 'request_local')()
+    except AttributeError:
+        obj.request_local = False
+        obj.using_request_local = False
+    return _RequestConfig()
+    
+from routes.mapper import Mapper
+from routes.util import redirect_to, url_for, URLGenerator
+__all__=['Mapper', 'url_for', 'URLGenerator', 'redirect_to', 'request_config']
Index: /galaxy-central/eggs/Routes-1.12.3-py2.6.egg/routes/lru.py
===================================================================
--- /galaxy-central/eggs/Routes-1.12.3-py2.6.egg/routes/lru.py (revision 3)
+++ /galaxy-central/eggs/Routes-1.12.3-py2.6.egg/routes/lru.py (revision 3)
@@ -0,0 +1,70 @@
+"""LRU caching class and decorator"""
+import threading
+
+_marker = object()
+
+class LRUCache(object):
+    def __init__(self, size):
+        """ Implements a psueudo-LRU algorithm (CLOCK) """
+        if size < 1:
+            raise ValueError('size must be >1')
+        self.clock = []
+        for i in xrange(0, size):
+            self.clock.append({'key':_marker, 'ref':False})
+        self.size = size
+        self.maxpos = size - 1
+        self.hand = 0
+        self.data = {}
+        self.lock = threading.Lock()
+    
+    def __contains__(self, key):
+        return key in self.data
+
+    def __getitem__(self, key, default=None):
+        try:
+            datum = self.data[key]
+        except KeyError:
+            return default
+        pos, val = datum
+        self.clock[pos]['ref'] = True
+        hand = pos + 1
+        if hand > self.maxpos:
+            hand = 0
+        self.hand = hand
+        return val
+
+    def __setitem__(self, key, val, _marker=_marker):
+        hand = self.hand
+        maxpos = self.maxpos
+        clock = self.clock
+        data = self.data
+        lock = self.lock
+
+        end = hand - 1
+        if end < 0:
+            end = maxpos
+
+        while 1:
+            current = clock[hand]
+            ref = current['ref']
+            if ref is True:
+                current['ref'] = False
+                hand = hand + 1
+                if hand > maxpos:
+                    hand = 0
+            elif ref is False or hand == end:
+                lock.acquire()
+                try:
+                    oldkey = current['key']
+                    if oldkey in data:
+                        del data[oldkey]
+                    current['key'] = key
+                    current['ref'] = True
+                    data[key] = (hand, val)
+                    hand += 1
+                    if hand > maxpos:
+                        hand = 0
+                    self.hand = hand
+                finally:
+                    lock.release()
+                break
Index: /galaxy-central/eggs/Routes-1.12.3-py2.6.egg/routes/mapper.py
===================================================================
--- /galaxy-central/eggs/Routes-1.12.3-py2.6.egg/routes/mapper.py (revision 3)
+++ /galaxy-central/eggs/Routes-1.12.3-py2.6.egg/routes/mapper.py (revision 3)
@@ -0,0 +1,1162 @@
+"""Mapper and Sub-Mapper"""
+import re
+import sys
+import threading
+
+from routes import request_config
+from routes.lru import LRUCache
+from routes.util import controller_scan, MatchException, RoutesException
+from routes.route import Route
+
+
+COLLECTION_ACTIONS = ['index', 'create', 'new']
+MEMBER_ACTIONS = ['show', 'update', 'delete', 'edit']
+
+
+def strip_slashes(name):
+    """Remove slashes from the beginning and end of a part/URL."""
+    if name.startswith('/'):
+        name = name[1:]
+    if name.endswith('/'):
+        name = name[:-1]
+    return name
+
+
+class SubMapperParent(object):
+    """Base class for Mapper and SubMapper, both of which may be the parent
+    of SubMapper objects
+    """
+    
+    def submapper(self, **kargs):
+        """Create a partial version of the Mapper with the designated
+        options set
+        
+        This results in a :class:`routes.mapper.SubMapper` object.
+        
+        If keyword arguments provided to this method also exist in the
+        keyword arguments provided to the submapper, their values will
+        be merged with the saved options going first.
+        
+        In addition to :class:`routes.route.Route` arguments, submapper
+        can also take a ``path_prefix`` argument which will be
+        prepended to the path of all routes that are connected.
+        
+        Example::
+            
+            >>> map = Mapper(controller_scan=None)
+            >>> map.connect('home', '/', controller='home', action='splash')
+            >>> map.matchlist[0].name == 'home'
+            True
+            >>> m = map.submapper(controller='home')
+            >>> m.connect('index', '/index', action='index')
+            >>> map.matchlist[1].name == 'index'
+            True
+            >>> map.matchlist[1].defaults['controller'] == 'home'
+            True
+        
+        Optional ``collection_name`` and ``resource_name`` arguments are
+        used in the generation of route names by the ``action`` and
+        ``link`` methods.  These in turn are used by the ``index``,
+        ``new``, ``create``, ``show``, ``edit``, ``update`` and
+        ``delete`` methods which may be invoked indirectly by listing
+        them in the ``actions`` argument.  If the ``formatted`` argument
+        is set to ``True`` (the default), generated paths are given the
+        suffix '{.format}' which matches or generates an optional format
+        extension.
+        
+        Example::
+        
+            >>> from routes.util import url_for
+            >>> map = Mapper(controller_scan=None)
+            >>> m = map.submapper(path_prefix='/entries', collection_name='entries', resource_name='entry', actions=['index', 'new'])
+            >>> url_for('entries') == '/entries'
+            True
+            >>> url_for('new_entry', format='xml') == '/entries/new.xml'
+            True
+
+        """
+        return SubMapper(self, **kargs)
+
+    def collection(self, collection_name, resource_name, path_prefix=None,
+                   member_prefix='/{id}', controller=None,
+                   collection_actions=COLLECTION_ACTIONS,
+                   member_actions = MEMBER_ACTIONS, member_options=None,
+                   **kwargs):
+        """Create a submapper that represents a collection.
+
+        This results in a :class:`routes.mapper.SubMapper` object, with a
+        ``member`` property of the same type that represents the collection's
+        member resources.
+        
+        Its interface is the same as the ``submapper`` together with
+        ``member_prefix``, ``member_actions`` and ``member_options``
+        which are passed to the ``member` submatter as ``path_prefix``,
+        ``actions`` and keyword arguments respectively.
+        
+        Example::
+        
+            >>> from routes.util import url_for
+            >>> map = Mapper(controller_scan=None)
+            >>> c = map.collection('entries', 'entry')
+            >>> c.member.link('ping', method='POST')
+            >>> url_for('entries') == '/entries'
+            True
+            >>> url_for('edit_entry', id=1) == '/entries/1/edit'
+            True
+            >>> url_for('ping_entry', id=1) == '/entries/1/ping'
+            True
+
+        """
+        if controller is None:
+            controller = resource_name or collection_name
+        
+        if path_prefix is None:
+            path_prefix = '/' + collection_name
+
+        collection = SubMapper(self, collection_name=collection_name,
+                               resource_name=resource_name,
+                               path_prefix=path_prefix, controller=controller,
+                               actions=collection_actions, **kwargs)
+        
+        collection.member = SubMapper(collection, path_prefix=member_prefix,
+                                      actions=member_actions, 
+                                      **(member_options or {}))
+
+        return collection
+
+
+class SubMapper(SubMapperParent):
+    """Partial mapper for use with_options"""
+    def __init__(self, obj, resource_name=None, collection_name=None,
+                 actions=None, formatted=None, **kwargs):
+        self.kwargs = kwargs
+        self.obj = obj
+        self.collection_name = collection_name
+        self.member = None
+        self.resource_name = resource_name \
+                            or getattr(obj, 'resource_name', None) \
+                            or kwargs.get('controller', None) \
+                            or getattr(obj, 'controller', None)
+        if formatted is not None:
+            self.formatted = formatted
+        else:
+            self.formatted = getattr(obj, 'formatted', None)
+            if self.formatted is None:
+                self.formatted = True
+
+        self.add_actions(actions or [])
+        
+    def connect(self, *args, **kwargs):
+        newkargs = {}
+        newargs = args
+        for key, value in self.kwargs.items():
+            if key == 'path_prefix':
+                if len(args) > 1:
+                    newargs = (args[0], self.kwargs[key] + args[1])
+                else:
+                    newargs = (self.kwargs[key] + args[0],)
+            elif key in kwargs:
+                if isinstance(value, dict):
+                    newkargs[key] = dict(value, **kwargs[key]) # merge dicts
+                else:
+                    newkargs[key] = value + kwargs[key]
+            else:
+                newkargs[key] = self.kwargs[key]
+        for key in kwargs:
+            if key not in self.kwargs:
+                newkargs[key] = kwargs[key]
+        return self.obj.connect(*newargs, **newkargs)
+
+    def link(self, rel=None, name=None, action=None, method='GET',
+             formatted=None, **kwargs):
+        """Generates a named route for a subresource.
+
+        Example::
+        
+            >>> from routes.util import url_for
+            >>> map = Mapper(controller_scan=None)
+            >>> c = map.collection('entries', 'entry')
+            >>> c.link('recent', name='recent_entries')
+            >>> c.member.link('ping', method='POST', formatted=True)
+            >>> url_for('entries') == '/entries'
+            True
+            >>> url_for('recent_entries') == '/entries/recent'
+            True
+            >>> url_for('ping_entry', id=1) == '/entries/1/ping'
+            True
+            >>> url_for('ping_entry', id=1, format='xml') == '/entries/1/ping.xml'
+            True
+
+        """
+        if formatted or (formatted is None and self.formatted):
+            suffix = '{.format}'
+        else:
+            suffix = ''
+
+        return self.connect(name or (rel + '_' + self.resource_name),
+                            '/' + (rel or name) + suffix,
+                            action=action or rel or name,
+                            **_kwargs_with_conditions(kwargs, method))
+
+    def new(self, **kwargs):
+        """Generates the "new" link for a collection submapper."""
+        return self.link(rel='new', **kwargs)
+
+    def edit(self, **kwargs):
+        """Generates the "edit" link for a collection member submapper."""
+        return self.link(rel='edit', **kwargs)
+
+    def action(self, name=None, action=None, method='GET', formatted=None,
+               **kwargs):
+        """Generates a named route at the base path of a submapper.
+
+        Example::
+        
+            >>> from routes import url_for
+            >>> map = Mapper(controller_scan=None)
+            >>> c = map.submapper(path_prefix='/entries', controller='entry')
+            >>> c.action(action='index', name='entries', formatted=True)
+            >>> c.action(action='create', method='POST')
+            >>> url_for(controller='entry', action='index', method='GET') == '/entries'
+            True
+            >>> url_for(controller='entry', action='index', method='GET', format='xml') == '/entries.xml'
+            True
+            >>> url_for(controller='entry', action='create', method='POST') == '/entries'
+            True
+
+        """
+        if formatted or (formatted is None and self.formatted):
+            suffix = '{.format}'
+        else:
+            suffix = ''
+        return self.connect(name or (action + '_' + self.resource_name),
+                            suffix,
+                            action=action or name,
+                            **_kwargs_with_conditions(kwargs, method))
+            
+    def index(self, name=None, **kwargs):
+        """Generates the "index" action for a collection submapper."""
+        return self.action(name=name or self.collection_name,
+                           action='index', method='GET', **kwargs)
+
+    def show(self, name = None, **kwargs):
+        """Generates the "show" action for a collection member submapper."""
+        return self.action(name=name or self.resource_name,
+                           action='show', method='GET', **kwargs)
+
+    def create(self, **kwargs):
+        """Generates the "create" action for a collection submapper."""
+        return self.action(action='create', method='POST', **kwargs)
+        
+    def update(self, **kwargs):
+        """Generates the "update" action for a collection member submapper."""
+        return self.action(action='update', method='PUT', **kwargs)
+
+    def delete(self, **kwargs):
+        """Generates the "delete" action for a collection member submapper."""
+        return self.action(action='delete', method='DELETE', **kwargs)
+
+    def add_actions(self, actions):
+        [getattr(self, action)() for action in actions]
+
+    # Provided for those who prefer using the 'with' syntax in Python 2.5+
+    def __enter__(self):
+        return self
+    
+    def __exit__(self, type, value, tb):
+        pass
+
+# Create kwargs with a 'conditions' member generated for the given method
+def _kwargs_with_conditions(kwargs, method):
+    if method and 'conditions' not in kwargs:
+        newkwargs = kwargs.copy()
+        newkwargs['conditions'] = {'method': method}                
+        return newkwargs             
+    else:
+        return kwargs
+
+
+
+class Mapper(SubMapperParent):
+    """Mapper handles URL generation and URL recognition in a web
+    application.
+    
+    Mapper is built handling dictionary's. It is assumed that the web
+    application will handle the dictionary returned by URL recognition
+    to dispatch appropriately.
+    
+    URL generation is done by passing keyword parameters into the
+    generate function, a URL is then returned.
+    
+    """
+    def __init__(self, controller_scan=controller_scan, directory=None, 
+                 always_scan=False, register=True, explicit=True):
+        """Create a new Mapper instance
+        
+        All keyword arguments are optional.
+        
+        ``controller_scan``
+            Function reference that will be used to return a list of
+            valid controllers used during URL matching. If
+            ``directory`` keyword arg is present, it will be passed
+            into the function during its call. This option defaults to
+            a function that will scan a directory for controllers.
+            
+            Alternatively, a list of controllers or None can be passed
+            in which are assumed to be the definitive list of
+            controller names valid when matching 'controller'.
+        
+        ``directory``
+            Passed into controller_scan for the directory to scan. It
+            should be an absolute path if using the default 
+            ``controller_scan`` function.
+        
+        ``always_scan``
+            Whether or not the ``controller_scan`` function should be
+            run during every URL match. This is typically a good idea
+            during development so the server won't need to be restarted
+            anytime a controller is added.
+        
+        ``register``
+            Boolean used to determine if the Mapper should use 
+            ``request_config`` to register itself as the mapper. Since
+            it's done on a thread-local basis, this is typically best
+            used during testing though it won't hurt in other cases.
+        
+        ``explicit``
+            Boolean used to determine if routes should be connected
+            with implicit defaults of::
+                
+                {'controller':'content','action':'index','id':None}
+            
+            When set to True, these defaults will not be added to route
+            connections and ``url_for`` will not use Route memory.
+                
+        Additional attributes that may be set after mapper
+        initialization (ie, map.ATTRIBUTE = 'something'):
+        
+        ``encoding``
+            Used to indicate alternative encoding/decoding systems to
+            use with both incoming URL's, and during Route generation
+            when passed a Unicode string. Defaults to 'utf-8'.
+        
+        ``decode_errors``
+            How to handle errors in the encoding, generally ignoring
+            any chars that don't convert should be sufficient. Defaults
+            to 'ignore'.
+        
+        ``minimization``
+            Boolean used to indicate whether or not Routes should
+            minimize URL's and the generated URL's, or require every
+            part where it appears in the path. Defaults to True.
+        
+        ``hardcode_names``
+            Whether or not Named Routes result in the default options
+            for the route being used *or* if they actually force url
+            generation to use the route. Defaults to False.
+        
+        """
+        self.matchlist = []
+        self.maxkeys = {}
+        self.minkeys = {}
+        self.urlcache = LRUCache(1600)
+        self._created_regs = False
+        self._created_gens = False
+        self._master_regexp = None
+        self.prefix = None
+        self.req_data = threading.local()
+        self.directory = directory
+        self.always_scan = always_scan
+        self.controller_scan = controller_scan
+        self._regprefix = None
+        self._routenames = {}
+        self.debug = False
+        self.append_slash = False
+        self.sub_domains = False
+        self.sub_domains_ignore = []
+        self.domain_match = '[^\.\/]+?\.[^\.\/]+'
+        self.explicit = explicit
+        self.encoding = 'utf-8'
+        self.decode_errors = 'ignore'
+        self.hardcode_names = True
+        self.minimization = False
+        self.create_regs_lock = threading.Lock()
+        if register:
+            config = request_config()
+            config.mapper = self
+    
+    def __str__(self):
+        """Generates a tabular string representation."""
+        def format_methods(r):
+            if r.conditions:
+                method = r.conditions.get('method', '')
+                return type(method) is str and method or ', '.join(method)
+            else:
+                return ''
+
+        table = [('Route name', 'Methods', 'Path')] + \
+                [(r.name or '', format_methods(r), r.routepath or '')
+                 for r in self.matchlist]
+            
+        widths = [max(len(row[col]) for row in table)
+                  for col in range(len(table[0]))]
+        
+        return '\n'.join(
+            ' '.join(row[col].ljust(widths[col])
+                     for col in range(len(widths)))
+            for row in table)
+
+    def _envget(self):
+        try:
+            return self.req_data.environ
+        except AttributeError:
+            return None
+    def _envset(self, env):
+        self.req_data.environ = env
+    def _envdel(self):
+        del self.req_data.environ
+    environ = property(_envget, _envset, _envdel)
+    
+    def extend(self, routes, path_prefix=''):
+        """Extends the mapper routes with a list of Route objects
+        
+        If a path_prefix is provided, all the routes will have their
+        path prepended with the path_prefix.
+        
+        Example::
+            
+            >>> map = Mapper(controller_scan=None)
+            >>> map.connect('home', '/', controller='home', action='splash')
+            >>> map.matchlist[0].name == 'home'
+            True
+            >>> routes = [Route('index', '/index.htm', controller='home',
+            ...                 action='index')]
+            >>> map.extend(routes)
+            >>> len(map.matchlist) == 2
+            True
+            >>> map.extend(routes, path_prefix='/subapp')
+            >>> len(map.matchlist) == 3
+            True
+            >>> map.matchlist[2].routepath == '/subapp/index.htm'
+            True
+        
+        .. note::
+            
+            This function does not merely extend the mapper with the
+            given list of routes, it actually creates new routes with
+            identical calling arguments.
+        
+        """
+        for route in routes:
+            if path_prefix and route.minimization:
+                routepath = '/'.join([path_prefix, route.routepath])
+            elif path_prefix:
+                routepath = path_prefix + route.routepath
+            else:
+                routepath = route.routepath
+            self.connect(route.name, routepath, **route._kargs)
+                
+    def connect(self, *args, **kargs):
+        """Create and connect a new Route to the Mapper.
+        
+        Usage:
+        
+        .. code-block:: python
+        
+            m = Mapper()
+            m.connect(':controller/:action/:id')
+            m.connect('date/:year/:month/:day', controller="blog", action="view")
+            m.connect('archives/:page', controller="blog", action="by_page",
+            requirements = { 'page':'\d{1,2}' })
+            m.connect('category_list', 'archives/category/:section', controller='blog', action='category',
+            section='home', type='list')
+            m.connect('home', '', controller='blog', action='view', section='home')
+        
+        """
+        routename = None
+        if len(args) > 1:
+            routename = args[0]
+        else:
+            args = (None,) + args
+        if '_explicit' not in kargs:
+            kargs['_explicit'] = self.explicit
+        if '_minimize' not in kargs:
+            kargs['_minimize'] = self.minimization
+        route = Route(*args, **kargs)
+                
+        # Apply encoding and errors if its not the defaults and the route 
+        # didn't have one passed in.
+        if (self.encoding != 'utf-8' or self.decode_errors != 'ignore') and \
+           '_encoding' not in kargs:
+            route.encoding = self.encoding
+            route.decode_errors = self.decode_errors
+        
+        if not route.static:
+            self.matchlist.append(route)
+        
+        if routename:
+            self._routenames[routename] = route
+            route.name = routename
+        if route.static:
+            return
+        exists = False
+        for key in self.maxkeys:
+            if key == route.maxkeys:
+                self.maxkeys[key].append(route)
+                exists = True
+                break
+        if not exists:
+            self.maxkeys[route.maxkeys] = [route]
+        self._created_gens = False
+    
+    def _create_gens(self):
+        """Create the generation hashes for route lookups"""
+        # Use keys temporailly to assemble the list to avoid excessive
+        # list iteration testing with "in"
+        controllerlist = {}
+        actionlist = {}
+        
+        # Assemble all the hardcoded/defaulted actions/controllers used
+        for route in self.matchlist:
+            if route.static:
+                continue
+            if route.defaults.has_key('controller'):
+                controllerlist[route.defaults['controller']] = True
+            if route.defaults.has_key('action'):
+                actionlist[route.defaults['action']] = True
+        
+        # Setup the lists of all controllers/actions we'll add each route
+        # to. We include the '*' in the case that a generate contains a
+        # controller/action that has no hardcodes
+        controllerlist = controllerlist.keys() + ['*']
+        actionlist = actionlist.keys() + ['*']
+        
+        # Go through our list again, assemble the controllers/actions we'll
+        # add each route to. If its hardcoded, we only add it to that dict key.
+        # Otherwise we add it to every hardcode since it can be changed.
+        gendict = {} # Our generated two-deep hash
+        for route in self.matchlist:
+            if route.static:
+                continue
+            clist = controllerlist
+            alist = actionlist
+            if 'controller' in route.hardcoded:
+                clist = [route.defaults['controller']]
+            if 'action' in route.hardcoded:
+                alist = [unicode(route.defaults['action'])]
+            for controller in clist:
+                for action in alist:
+                    actiondict = gendict.setdefault(controller, {})
+                    actiondict.setdefault(action, ([], {}))[0].append(route)
+        self._gendict = gendict
+        self._created_gens = True
+
+    def create_regs(self, *args, **kwargs):
+        """Atomically creates regular expressions for all connected
+        routes
+        """
+        self.create_regs_lock.acquire()
+        try:
+            self._create_regs(*args, **kwargs)
+        finally:
+            self.create_regs_lock.release()
+    
+    def _create_regs(self, clist=None):
+        """Creates regular expressions for all connected routes"""
+        if clist is None:
+            if self.directory:
+                clist = self.controller_scan(self.directory)
+            elif callable(self.controller_scan):
+                clist = self.controller_scan()
+            elif not self.controller_scan:
+                clist = []
+            else:
+                clist = self.controller_scan
+        
+        for key, val in self.maxkeys.iteritems():
+            for route in val:
+                route.makeregexp(clist)
+        
+        regexps = []
+        routematches = []
+        for route in self.matchlist:
+            if not route.static:
+                routematches.append(route)
+                regexps.append(route.makeregexp(clist, include_names=False))
+        self._routematches = routematches
+        
+        # Create our regexp to strip the prefix
+        if self.prefix:
+            self._regprefix = re.compile(self.prefix + '(.*)')
+        
+        # Save the master regexp
+        regexp = '|'.join(['(?:%s)' % x for x in regexps])
+        self._master_reg = regexp
+        self._master_regexp = re.compile(regexp)
+        self._created_regs = True
+    
+    def _match(self, url, environ):
+        """Internal Route matcher
+        
+        Matches a URL against a route, and returns a tuple of the match
+        dict and the route object if a match is successfull, otherwise
+        it returns empty.
+        
+        For internal use only.
+        
+        """
+        if not self._created_regs and self.controller_scan:
+            self.create_regs()
+        elif not self._created_regs:
+            raise RoutesException("You must generate the regular expressions"
+                                 " before matching.")
+        
+        if self.always_scan:
+            self.create_regs()
+        
+        matchlog = []
+        if self.prefix:
+            if re.match(self._regprefix, url):
+                url = re.sub(self._regprefix, r'\1', url)
+                if not url:
+                    url = '/'
+            else:
+                return (None, None, matchlog)
+                
+        environ = environ or self.environ
+        sub_domains = self.sub_domains
+        sub_domains_ignore = self.sub_domains_ignore
+        domain_match = self.domain_match
+        debug = self.debug
+        
+        # Check to see if its a valid url against the main regexp
+        # Done for faster invalid URL elimination
+        valid_url = re.match(self._master_regexp, url)
+        if not valid_url:
+            return (None, None, matchlog)
+        
+        for route in self.matchlist:
+            if route.static:
+                if debug:
+                    matchlog.append(dict(route=route, static=True))
+                continue
+            match = route.match(url, environ, sub_domains, sub_domains_ignore,
+                                domain_match)
+            if debug:
+                matchlog.append(dict(route=route, regexp=bool(match)))
+            if isinstance(match, dict) or match:
+                return (match, route, matchlog)
+        return (None, None, matchlog)
+    
+    def match(self, url=None, environ=None):
+        """Match a URL against against one of the routes contained.
+        
+        Will return None if no valid match is found.
+        
+        .. code-block:: python
+            
+            resultdict = m.match('/joe/sixpack')
+        
+        """
+        if not url and not environ:
+            raise RoutesException('URL or environ must be provided')
+        
+        if not url:
+            url = environ['PATH_INFO']
+                
+        result = self._match(url, environ)
+        if self.debug:
+            return result[0], result[1], result[2]
+        if isinstance(result[0], dict) or result[0]:
+            return result[0]
+        return None
+    
+    def routematch(self, url=None, environ=None):
+        """Match a URL against against one of the routes contained.
+        
+        Will return None if no valid match is found, otherwise a
+        result dict and a route object is returned.
+        
+        .. code-block:: python
+        
+            resultdict, route_obj = m.match('/joe/sixpack')
+        
+        """
+        if not url and not environ:
+            raise RoutesException('URL or environ must be provided')
+        
+        if not url:
+            url = environ['PATH_INFO']
+        result = self._match(url, environ)
+        if self.debug:
+            return result[0], result[1], result[2]
+        if isinstance(result[0], dict) or result[0]:
+            return result[0], result[1]
+        return None
+    
+    def generate(self, *args, **kargs):
+        """Generate a route from a set of keywords
+        
+        Returns the url text, or None if no URL could be generated.
+        
+        .. code-block:: python
+            
+            m.generate(controller='content',action='view',id=10)
+        
+        """
+        # Generate ourself if we haven't already
+        if not self._created_gens:
+            self._create_gens()
+        
+        if self.append_slash:
+            kargs['_append_slash'] = True
+        
+        if not self.explicit:
+            if 'controller' not in kargs:
+                kargs['controller'] = 'content'
+            if 'action' not in kargs:
+                kargs['action'] = 'index'
+        
+        environ = kargs.pop('_environ', self.environ)
+        controller = kargs.get('controller', None)
+        action = kargs.get('action', None)
+
+        # If the URL didn't depend on the SCRIPT_NAME, we'll cache it
+        # keyed by just by kargs; otherwise we need to cache it with
+        # both SCRIPT_NAME and kargs:
+        cache_key = unicode(args).encode('utf8') + \
+            unicode(kargs).encode('utf8')
+        
+        if self.urlcache is not None:
+            if self.environ:
+                cache_key_script_name = '%s:%s' % (
+                    environ.get('SCRIPT_NAME', ''), cache_key)
+            else:
+                cache_key_script_name = cache_key
+        
+            # Check the url cache to see if it exists, use it if it does
+            for key in [cache_key, cache_key_script_name]:
+                if key in self.urlcache:
+                    return self.urlcache[key]
+        
+        actionlist = self._gendict.get(controller) or self._gendict.get('*', {})
+        if not actionlist and not args:
+            return None
+        (keylist, sortcache) = actionlist.get(action) or \
+                               actionlist.get('*', (None, {}))
+        if not keylist and not args:
+            return None
+
+        keys = frozenset(kargs.keys())
+        cacheset = False
+        cachekey = unicode(keys)
+        cachelist = sortcache.get(cachekey)
+        if args:
+            keylist = args
+        elif cachelist:
+            keylist = cachelist
+        else:
+            cacheset = True
+            newlist = []
+            for route in keylist:
+                if len(route.minkeys - route.dotkeys - keys) == 0:
+                    newlist.append(route)
+            keylist = newlist
+            
+            def keysort(a, b):
+                """Sorts two sets of sets, to order them ideally for
+                matching."""
+                am = a.minkeys
+                a = a.maxkeys
+                b = b.maxkeys
+                
+                lendiffa = len(keys^a)
+                lendiffb = len(keys^b)
+                # If they both match, don't switch them
+                if lendiffa == 0 and lendiffb == 0:
+                    return 0
+                
+                # First, if a matches exactly, use it
+                if lendiffa == 0:
+                    return -1
+                
+                # Or b matches exactly, use it
+                if lendiffb == 0:
+                    return 1
+                
+                # Neither matches exactly, return the one with the most in 
+                # common
+                if cmp(lendiffa, lendiffb) != 0:
+                    return cmp(lendiffa, lendiffb)
+                
+                # Neither matches exactly, but if they both have just as much 
+                # in common
+                if len(keys&b) == len(keys&a):
+                    # Then we return the shortest of the two
+                    return cmp(len(a), len(b))
+                
+                # Otherwise, we return the one that has the most in common
+                else:
+                    return cmp(len(keys&b), len(keys&a))
+            
+            keylist.sort(keysort)
+            if cacheset:
+                sortcache[cachekey] = keylist
+                
+        # Iterate through the keylist of sorted routes (or a single route if
+        # it was passed in explicitly for hardcoded named routes)
+        for route in keylist:
+            fail = False
+            for key in route.hardcoded:
+                kval = kargs.get(key)
+                if not kval:
+                    continue
+                if isinstance(kval, str):
+                    kval = kval.decode(self.encoding)
+                else:
+                    kval = unicode(kval)
+                if kval != route.defaults[key] and not callable(route.defaults[key]):
+                    fail = True
+                    break
+            if fail:
+                continue
+            path = route.generate(**kargs)
+            if path:
+                if self.prefix:
+                    path = self.prefix + path
+                external_static = route.static and route.external
+                if environ and environ.get('SCRIPT_NAME', '') != ''\
+                    and not route.absolute and not external_static:
+                    path = environ['SCRIPT_NAME'] + path
+                    key = cache_key_script_name
+                else:
+                    key = cache_key
+                if self.urlcache is not None:
+                    self.urlcache[key] = str(path)
+                return str(path)
+            else:
+                continue
+        return None
+    
+    def resource(self, member_name, collection_name, **kwargs):
+        """Generate routes for a controller resource
+        
+        The member_name name should be the appropriate singular version
+        of the resource given your locale and used with members of the
+        collection. The collection_name name will be used to refer to
+        the resource collection methods and should be a plural version
+        of the member_name argument. By default, the member_name name
+        will also be assumed to map to a controller you create.
+        
+        The concept of a web resource maps somewhat directly to 'CRUD' 
+        operations. The overlying things to keep in mind is that
+        mapping a resource is about handling creating, viewing, and
+        editing that resource.
+        
+        All keyword arguments are optional.
+        
+        ``controller``
+            If specified in the keyword args, the controller will be
+            the actual controller used, but the rest of the naming
+            conventions used for the route names and URL paths are
+            unchanged.
+        
+        ``collection``
+            Additional action mappings used to manipulate/view the
+            entire set of resources provided by the controller.
+            
+            Example::
+                
+                map.resource('message', 'messages', collection={'rss':'GET'})
+                # GET /message/rss (maps to the rss action)
+                # also adds named route "rss_message"
+        
+        ``member``
+            Additional action mappings used to access an individual
+            'member' of this controllers resources.
+            
+            Example::
+                
+                map.resource('message', 'messages', member={'mark':'POST'})
+                # POST /message/1/mark (maps to the mark action)
+                # also adds named route "mark_message"
+        
+        ``new``
+            Action mappings that involve dealing with a new member in
+            the controller resources.
+            
+            Example::
+                
+                map.resource('message', 'messages', new={'preview':'POST'})
+                # POST /message/new/preview (maps to the preview action)
+                # also adds a url named "preview_new_message"
+        
+        ``path_prefix``
+            Prepends the URL path for the Route with the path_prefix
+            given. This is most useful for cases where you want to mix
+            resources or relations between resources.
+        
+        ``name_prefix``
+            Perpends the route names that are generated with the
+            name_prefix given. Combined with the path_prefix option,
+            it's easy to generate route names and paths that represent
+            resources that are in relations.
+            
+            Example::
+                
+                map.resource('message', 'messages', controller='categories', 
+                    path_prefix='/category/:category_id', 
+                    name_prefix="category_")
+                # GET /category/7/message/1
+                # has named route "category_message"
+                
+        ``parent_resource`` 
+            A ``dict`` containing information about the parent
+            resource, for creating a nested resource. It should contain
+            the ``member_name`` and ``collection_name`` of the parent
+            resource. This ``dict`` will 
+            be available via the associated ``Route`` object which can
+            be accessed during a request via
+            ``request.environ['routes.route']``
+ 
+            If ``parent_resource`` is supplied and ``path_prefix``
+            isn't, ``path_prefix`` will be generated from
+            ``parent_resource`` as
+            "<parent collection name>/:<parent member name>_id". 
+
+            If ``parent_resource`` is supplied and ``name_prefix``
+            isn't, ``name_prefix`` will be generated from
+            ``parent_resource`` as  "<parent member name>_". 
+ 
+            Example:: 
+ 
+                >>> from routes.util import url_for 
+                >>> m = Mapper() 
+                >>> m.resource('location', 'locations', 
+                ...            parent_resource=dict(member_name='region', 
+                ...                                 collection_name='regions'))
+                >>> # path_prefix is "regions/:region_id" 
+                >>> # name prefix is "region_"  
+                >>> url_for('region_locations', region_id=13) 
+                '/regions/13/locations'
+                >>> url_for('region_new_location', region_id=13) 
+                '/regions/13/locations/new'
+                >>> url_for('region_location', region_id=13, id=60) 
+                '/regions/13/locations/60'
+                >>> url_for('region_edit_location', region_id=13, id=60) 
+                '/regions/13/locations/60/edit'
+
+            Overriding generated ``path_prefix``::
+
+                >>> m = Mapper()
+                >>> m.resource('location', 'locations',
+                ...            parent_resource=dict(member_name='region',
+                ...                                 collection_name='regions'),
+                ...            path_prefix='areas/:area_id')
+                >>> # name prefix is "region_"
+                >>> url_for('region_locations', area_id=51)
+                '/areas/51/locations'
+
+            Overriding generated ``name_prefix``::
+
+                >>> m = Mapper()
+                >>> m.resource('location', 'locations',
+                ...            parent_resource=dict(member_name='region',
+                ...                                 collection_name='regions'),
+                ...            name_prefix='')
+                >>> # path_prefix is "regions/:region_id" 
+                >>> url_for('locations', region_id=51)
+                '/regions/51/locations'
+
+        """
+        collection = kwargs.pop('collection', {})
+        member = kwargs.pop('member', {})
+        new = kwargs.pop('new', {})
+        path_prefix = kwargs.pop('path_prefix', None)
+        name_prefix = kwargs.pop('name_prefix', None)
+        parent_resource = kwargs.pop('parent_resource', None)
+        
+        # Generate ``path_prefix`` if ``path_prefix`` wasn't specified and 
+        # ``parent_resource`` was. Likewise for ``name_prefix``. Make sure
+        # that ``path_prefix`` and ``name_prefix`` *always* take precedence if
+        # they are specified--in particular, we need to be careful when they
+        # are explicitly set to "".
+        if parent_resource is not None: 
+            if path_prefix is None: 
+                path_prefix = '%s/:%s_id' % (parent_resource['collection_name'], 
+                                             parent_resource['member_name']) 
+            if name_prefix is None:
+                name_prefix = '%s_' % parent_resource['member_name']
+        else:
+            if path_prefix is None: path_prefix = ''
+            if name_prefix is None: name_prefix = ''
+        
+        # Ensure the edit and new actions are in and GET
+        member['edit'] = 'GET'
+        new.update({'new': 'GET'})
+        
+        # Make new dict's based off the old, except the old values become keys,
+        # and the old keys become items in a list as the value
+        def swap(dct, newdct):
+            """Swap the keys and values in the dict, and uppercase the values
+            from the dict during the swap."""
+            for key, val in dct.iteritems():
+                newdct.setdefault(val.upper(), []).append(key)
+            return newdct
+        collection_methods = swap(collection, {})
+        member_methods = swap(member, {})
+        new_methods = swap(new, {})
+        
+        # Insert create, update, and destroy methods
+        collection_methods.setdefault('POST', []).insert(0, 'create')
+        member_methods.setdefault('PUT', []).insert(0, 'update')
+        member_methods.setdefault('DELETE', []).insert(0, 'delete')
+        
+        # If there's a path prefix option, use it with the controller
+        controller = strip_slashes(collection_name)
+        path_prefix = strip_slashes(path_prefix)
+        path_prefix = '/' + path_prefix
+        if path_prefix and path_prefix != '/':
+            path = path_prefix + '/' + controller
+        else:
+            path = '/' + controller
+        collection_path = path
+        new_path = path + "/new"
+        member_path = path + "/:(id)"
+        
+        options = { 
+            'controller': kwargs.get('controller', controller),
+            '_member_name': member_name,
+            '_collection_name': collection_name,
+            '_parent_resource': parent_resource,
+            '_filter': kwargs.get('_filter')
+        }
+        
+        def requirements_for(meth):
+            """Returns a new dict to be used for all route creation as the
+            route options"""
+            opts = options.copy()
+            if method != 'any': 
+                opts['conditions'] = {'method':[meth.upper()]}
+            return opts
+        
+        # Add the routes for handling collection methods
+        for method, lst in collection_methods.iteritems():
+            primary = (method != 'GET' and lst.pop(0)) or None
+            route_options = requirements_for(method)
+            for action in lst:
+                route_options['action'] = action
+                route_name = "%s%s_%s" % (name_prefix, action, collection_name)
+                self.connect("formatted_" + route_name, "%s/%s.:(format)" % \
+                             (collection_path, action), **route_options)
+                self.connect(route_name, "%s/%s" % (collection_path, action),
+                                                    **route_options)
+            if primary:
+                route_options['action'] = primary
+                self.connect("%s.:(format)" % collection_path, **route_options)
+                self.connect(collection_path, **route_options)
+        
+        # Specifically add in the built-in 'index' collection method and its 
+        # formatted version
+        self.connect("formatted_" + name_prefix + collection_name, 
+            collection_path + ".:(format)", action='index', 
+            conditions={'method':['GET']}, **options)
+        self.connect(name_prefix + collection_name, collection_path, 
+                     action='index', conditions={'method':['GET']}, **options)
+        
+        # Add the routes that deal with new resource methods
+        for method, lst in new_methods.iteritems():
+            route_options = requirements_for(method)
+            for action in lst:
+                path = (action == 'new' and new_path) or "%s/%s" % (new_path, 
+                                                                    action)
+                name = "new_" + member_name
+                if action != 'new':
+                    name = action + "_" + name
+                route_options['action'] = action
+                formatted_path = (action == 'new' and new_path + '.:(format)') or \
+                    "%s/%s.:(format)" % (new_path, action)
+                self.connect("formatted_" + name_prefix + name, formatted_path, 
+                             **route_options)
+                self.connect(name_prefix + name, path, **route_options)
+        
+        requirements_regexp = '[^\/]+'
+
+        # Add the routes that deal with member methods of a resource
+        for method, lst in member_methods.iteritems():
+            route_options = requirements_for(method)
+            route_options['requirements'] = {'id':requirements_regexp}
+            if method not in ['POST', 'GET', 'any']:
+                primary = lst.pop(0)
+            else:
+                primary = None
+            for action in lst:
+                route_options['action'] = action
+                self.connect("formatted_%s%s_%s" % (name_prefix, action, 
+                                                    member_name),
+                    "%s/%s.:(format)" % (member_path, action), **route_options)
+                self.connect("%s%s_%s" % (name_prefix, action, member_name),
+                    "%s/%s" % (member_path, action), **route_options)
+            if primary:
+                route_options['action'] = primary
+                self.connect("%s.:(format)" % member_path, **route_options)
+                self.connect(member_path, **route_options)
+        
+        # Specifically add the member 'show' method
+        route_options = requirements_for('GET')
+        route_options['action'] = 'show'
+        route_options['requirements'] = {'id':requirements_regexp}
+        self.connect("formatted_" + name_prefix + member_name, 
+                     member_path + ".:(format)", **route_options)
+        self.connect(name_prefix + member_name, member_path, **route_options)
+    
+    def redirect(self, match_path, destination_path, *args, **kwargs):
+        """Add a redirect route to the mapper
+        
+        Redirect routes bypass the wrapped WSGI application and instead
+        result in a redirect being issued by the RoutesMiddleware. As
+        such, this method is only meaningful when using
+        RoutesMiddleware.
+        
+        By default, a 302 Found status code is used, this can be
+        changed by providing a ``_redirect_code`` keyword argument
+        which will then be used instead. Note that the entire status
+        code string needs to be present.
+        
+        When using keyword arguments, all arguments that apply to
+        matching will be used for the match, while generation specific
+        options will be used during generation. Thus all options
+        normally available to connected Routes may be used with
+        redirect routes as well.
+        
+        Example::
+            
+            map = Mapper()
+            map.redirect('/legacyapp/archives/{url:.*}, '/archives/{url})
+            map.redirect('/home/index', '/', _redirect_code='301 Moved Permanently')
+        
+        """
+        both_args = ['_encoding', '_explicit', '_minimize']
+        gen_args = ['_filter']
+        
+        status_code = kwargs.pop('_redirect_code', '302 Found')
+        gen_dict, match_dict = {}, {}
+        
+        # Create the dict of args for the generation route
+        for key in both_args + gen_args:
+            if key in kwargs:
+                gen_dict[key] = kwargs[key]
+        gen_dict['_static'] = True
+        
+        # Create the dict of args for the matching route
+        for key in kwargs:
+            if key not in gen_args:
+                match_dict[key] = kwargs[key]
+        
+        self.connect(match_path, **match_dict)
+        match_route = self.matchlist[-1]
+        
+        self.connect('_redirect_%s' % id(match_route), destination_path,
+                     **gen_dict)
+        match_route.redirect = True
+        match_route.redirect_status = status_code
Index: /galaxy-central/eggs/Routes-1.12.3-py2.6.egg/EGG-INFO/SOURCES.txt
===================================================================
--- /galaxy-central/eggs/Routes-1.12.3-py2.6.egg/EGG-INFO/SOURCES.txt (revision 3)
+++ /galaxy-central/eggs/Routes-1.12.3-py2.6.egg/EGG-INFO/SOURCES.txt (revision 3)
@@ -0,0 +1,130 @@
+CHANGELOG
+LICENSE
+MANIFEST.in
+README
+scramble.py
+setup.cfg
+setup.py
+Routes.egg-info/PKG-INFO
+Routes.egg-info/SOURCES.txt
+Routes.egg-info/dependency_links.txt
+Routes.egg-info/not-zip-safe
+Routes.egg-info/top_level.txt
+docs/Makefile
+docs/changes.rst
+docs/conf.py
+docs/contents.rst
+docs/generating.rst
+docs/glossary.rst
+docs/introduction.rst
+docs/porting.rst
+docs/restful.rst
+docs/routes-logo.png
+docs/setting_up.rst
+docs/todo.rst
+docs/uni_redirect_rest.rst
+docs/_build/doctrees/changes.doctree
+docs/_build/doctrees/contents.doctree
+docs/_build/doctrees/environment.pickle
+docs/_build/doctrees/generating.doctree
+docs/_build/doctrees/glossary.doctree
+docs/_build/doctrees/introduction.doctree
+docs/_build/doctrees/porting.doctree
+docs/_build/doctrees/restful.doctree
+docs/_build/doctrees/setting_up.doctree
+docs/_build/doctrees/todo.doctree
+docs/_build/doctrees/uni_redirect_rest.doctree
+docs/_build/doctrees/modules/index.doctree
+docs/_build/doctrees/modules/lru.doctree
+docs/_build/doctrees/modules/mapper.doctree
+docs/_build/doctrees/modules/middleware.doctree
+docs/_build/doctrees/modules/route.doctree
+docs/_build/doctrees/modules/routes.doctree
+docs/_build/doctrees/modules/util.doctree
+docs/_build/html/.buildinfo
+docs/_build/html/changes.html
+docs/_build/html/contents.html
+docs/_build/html/generating.html
+docs/_build/html/genindex.html
+docs/_build/html/glossary.html
+docs/_build/html/index.html
+docs/_build/html/introduction.html
+docs/_build/html/modindex.html
+docs/_build/html/objects.inv
+docs/_build/html/porting.html
+docs/_build/html/restful.html
+docs/_build/html/search.html
+docs/_build/html/searchindex.js
+docs/_build/html/setting_up.html
+docs/_build/html/todo.html
+docs/_build/html/uni_redirect_rest.html
+docs/_build/html/_images/routes-logo.png
+docs/_build/html/_sources/changes.txt
+docs/_build/html/_sources/contents.txt
+docs/_build/html/_sources/generating.txt
+docs/_build/html/_sources/glossary.txt
+docs/_build/html/_sources/introduction.txt
+docs/_build/html/_sources/porting.txt
+docs/_build/html/_sources/restful.txt
+docs/_build/html/_sources/setting_up.txt
+docs/_build/html/_sources/todo.txt
+docs/_build/html/_sources/uni_redirect_rest.txt
+docs/_build/html/_sources/modules/index.txt
+docs/_build/html/_sources/modules/lru.txt
+docs/_build/html/_sources/modules/mapper.txt
+docs/_build/html/_sources/modules/middleware.txt
+docs/_build/html/_sources/modules/route.txt
+docs/_build/html/_sources/modules/routes.txt
+docs/_build/html/_sources/modules/util.txt
+docs/_build/html/_static/basic.css
+docs/_build/html/_static/default.css
+docs/_build/html/_static/doctools.js
+docs/_build/html/_static/file.png
+docs/_build/html/_static/jquery.js
+docs/_build/html/_static/minus.png
+docs/_build/html/_static/opensearch.xml
+docs/_build/html/_static/plus.png
+docs/_build/html/_static/pygments.css
+docs/_build/html/_static/searchtools.js
+docs/_build/html/modules/index.html
+docs/_build/html/modules/lru.html
+docs/_build/html/modules/mapper.html
+docs/_build/html/modules/middleware.html
+docs/_build/html/modules/route.html
+docs/_build/html/modules/routes.html
+docs/_build/html/modules/util.html
+docs/_build/latex/Makefile
+docs/_build/latex/Routes.aux
+docs/_build/latex/Routes.idx
+docs/_build/latex/Routes.log
+docs/_build/latex/Routes.out
+docs/_build/latex/Routes.pdf
+docs/_build/latex/Routes.tex
+docs/_build/latex/Routes.toc
+docs/_build/latex/fncychap.sty
+docs/_build/latex/howto.cls
+docs/_build/latex/manual.cls
+docs/_build/latex/python.ist
+docs/_build/latex/routes-logo.png
+docs/_build/latex/sphinx.sty
+docs/_build/latex/tabulary.sty
+docs/_build/latex/index/index.html
+docs/_templates/index.html
+docs/_templates/indexsidebar.html
+docs/_templates/layout.html
+docs/modules/index.rst
+docs/modules/lru.rst
+docs/modules/mapper.rst
+docs/modules/middleware.rst
+docs/modules/route.rst
+docs/modules/routes.rst
+docs/modules/util.rst
+docs/src/README
+docs/src/routes-logo-boehme.svg
+routes/__init__.py
+routes/base.py
+routes/lru.py
+routes/mapper.py
+routes/middleware.py
+routes/route.py
+routes/util.py
Index: /galaxy-central/eggs/Routes-1.12.3-py2.6.egg/EGG-INFO/top_level.txt
===================================================================
--- /galaxy-central/eggs/Routes-1.12.3-py2.6.egg/EGG-INFO/top_level.txt (revision 3)
+++ /galaxy-central/eggs/Routes-1.12.3-py2.6.egg/EGG-INFO/top_level.txt (revision 3)
@@ -0,0 +1,1 @@
+routes
Index: /galaxy-central/eggs/Routes-1.12.3-py2.6.egg/EGG-INFO/PKG-INFO
===================================================================
--- /galaxy-central/eggs/Routes-1.12.3-py2.6.egg/EGG-INFO/PKG-INFO (revision 3)
+++ /galaxy-central/eggs/Routes-1.12.3-py2.6.egg/EGG-INFO/PKG-INFO (revision 3)
@@ -0,0 +1,20 @@
+Metadata-Version: 1.0
+Name: Routes
+Version: 1.12.3
+Summary: Routing Recognition and Generation Tools
+Home-page: http://routes.groovie.org/
+Author: Ben Bangert
+Author-email: ben@groovie.org
+License: UNKNOWN
+Description: 
+        A Routing package for Python that matches URL's to dicts and vice versa
+        
+        `Dev version available <http://bitbucket.org/bbangert/routes/>`_
+        
+Platform: UNKNOWN
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: BSD License
+Classifier: Programming Language :: Python
+Classifier: Topic :: Internet :: WWW/HTTP
+Classifier: Topic :: Software Development :: Libraries :: Python Modules
Index: /galaxy-central/eggs/Routes-1.12.3-py2.6.egg/EGG-INFO/dependency_links.txt
===================================================================
--- /galaxy-central/eggs/Routes-1.12.3-py2.6.egg/EGG-INFO/dependency_links.txt (revision 3)
+++ /galaxy-central/eggs/Routes-1.12.3-py2.6.egg/EGG-INFO/dependency_links.txt (revision 3)
@@ -0,0 +1,1 @@
+
Index: /galaxy-central/eggs/Routes-1.12.3-py2.6.egg/EGG-INFO/not-zip-safe
===================================================================
--- /galaxy-central/eggs/Routes-1.12.3-py2.6.egg/EGG-INFO/not-zip-safe (revision 3)
+++ /galaxy-central/eggs/Routes-1.12.3-py2.6.egg/EGG-INFO/not-zip-safe (revision 3)
@@ -0,0 +1,1 @@
+
Index: /galaxy-central/test-data/unix_awk_input1.txt
===================================================================
--- /galaxy-central/test-data/unix_awk_input1.txt (revision 3)
+++ /galaxy-central/test-data/unix_awk_input1.txt (revision 3)
@@ -0,0 +1,10 @@
+chr10	0.4
+chr1	1.4
+chrM	3e-1
+chr2	1.1e2
+chr15	3.14e-2
+chr15	0.0314
+chr4	0.1
+chr20	0.9
+chr22	+1.3
+chrX	-0.3
Index: /galaxy-central/test-data/replace_text_in_line_input1.txt
===================================================================
--- /galaxy-central/test-data/replace_text_in_line_input1.txt (revision 3)
+++ /galaxy-central/test-data/replace_text_in_line_input1.txt (revision 3)
@@ -0,0 +1,3 @@
+chr7  56632  56652   D17003_CTCF_R6  310  +
+chr7  56736  56756   D17003_CTCF_R7  354  +
+chr7  56761  56781   D17003_CTCF_R4  220  +
Index: /galaxy-central/test-data/unix_grep_input1.txt
===================================================================
--- /galaxy-central/test-data/unix_grep_input1.txt (revision 3)
+++ /galaxy-central/test-data/unix_grep_input1.txt (revision 3)
@@ -0,0 +1,152 @@
+>FC0000042:5:1:220:1502
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+>FC0000042:5:1:34:1398
+GATCTCAGTCCACCGCTGGGATTAACCTTGCCCCCC
+>FC0000042:5:1:164:1396
+TATCTTATAGATATTTCCCTCTATACTAGTGACCCC
+>FC0000042:5:1:333:925
+GAGCTTATAGCTTGTTATATACGTCAACCCCCCCCC
+>FC0000042:5:1:204:1476
+GTACTTATATAGATACAAAATATGTATAGGATTGTC
+>FC0000042:5:1:119:1511
+GATCTGCATGACCTGGGATTTGTTGGACCCCCCCCC
+>FC0000042:5:1:202:1487
+CATGTATAGTCTCCAGTCTATACAACAACCCCCCCC
+>FC0000042:5:1:182:1434
+GCTATAGAAATGTTAACATCGAATGTACATTATAAC
+>FC0000042:5:1:627:866
+AATATAGATATGGGACAAAACACATTTAGACCCCCC
+>FC0000042:5:1:24:1357
+GATATAATATCAATATCAATCCACGCTTGTTCCCCC
+>FC0000042:5:1:187:1492
+TATAGAAGCAGAAGAAACAACCTACTTTCACATGTT
+>FC0000042:5:1:45:1344
+CAGCTAACAATCAAGCGTTACAGATTAGCCCCCCCC
+>FC0000042:5:1:87:1299
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+>FC0000042:5:1:206:1341
+GATATATAGCAGTGACCACCTCTAAGCCCCCCCCCC
+>FC0000042:5:1:144:929
+GCCCTGGCATATTGTCAATATCTTTAAACCCCCCCC
+>FC0000042:5:1:662:820
+TGTCTTTTCGATTTTTTTCTTTGCGTCACCCCCCCC
+>FC0000042:5:1:53:1507
+GACCTCACTGTGGCATGAATCATACATTCCCCCCCC
+>FC0000042:5:1:182:1502
+AATGCTTGGCAAAGCTCAACTTCGTTGCCCCCCCCC
+>FC0000042:5:1:194:1423
+GATCCTATAGGTCTCGATTGGTCTTTTATTCTTTTT
+>FC0000042:5:1:35:1444
+GCTATAGCACGGCATAGTGCGATACTAGTACCCCCC
+>FC0000042:5:1:667:872
+GACTATAGGCGGAATGATAATGTCAAATAAGTAGTT
+>FC0000042:5:1:147:1438
+GATCAAGGAGACTAGGGAGGTAGGAGTTACTCCCCC
+>FC0000042:5:1:467:510
+GAACCACTATAGTGACATGGAACACGCGTGAACCCC
+>FC0000042:5:1:1553:1707
+TATAGTTACCCTACTGGGCCGACGATTCCCTTACGA
+>FC0000042:5:1:207:964
+AATCTATAGATTTTTCTATTATTGTGTCCTCACCCC
+>FC0000042:5:1:169:1468
+GCTCTATAGTTCGAGTTACCAAACTCTTCCCCCCCC
+>FC0000042:5:1:42:1465
+GCTCTTTAGGTTTGAACCTGTAGACTTGAGGGGCAT
+>FC0000042:5:1:55:1331
+GAACTTGCGTAACGTACAAAAATGCAAGCAAAAAGT
+>FC0000042:5:1:175:1501
+GCTCTGTTAATCTAGAAAATGTGTCTCCCCCCCCCC
+>FC0000042:5:1:221:1465
+TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
+>FC0000042:5:1:196:1450
+AATATAGTCTATCCAACAAGATGTAACCCCCCCCCC
+>FC0000042:5:1:86:1413
+TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
+>FC0000042:5:1:453:514
+GATATCTTCGTTTTATATTGAAACTGGCCCCCCCCC
+>FC0000042:5:1:150:1415
+TATAGGGCCCTGTATGGTTGCTTGACTAGGGGCTGC
+>FC0000042:5:1:191:1475
+GATCCATCCCAATCTCTACGATTGAAAGCATCGGGA
+>FC0000042:5:1:26:1407
+GTTATAGAGGCGGGAAGGTGAGAATGCCCCCCCCCC
+>FC0000042:5:1:107:1407
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+>FC0000042:5:1:388:780
+GATCTATAGCTTCTTTAGCTTGGAAACTGGTCAGCC
+>FC0000042:5:1:223:1535
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+>FC0000042:5:1:145:783
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+>FC0000042:5:1:449:876
+GACCATCAATCAGGTGGAAAGCAGGGCCCCCCCCCC
+>FC0000042:5:1:212:1325
+TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
+>FC0000042:5:1:194:1485
+GAACCGAATCCAACCTGTTTCATTCCTCAGATCCCC
+>FC0000042:5:1:507:494
+GATCTTATAGAATTTTTGACAACATAAGTTACCCCC
+>FC0000042:5:1:416:938
+AATCGTATAGCTCGGGCCGGATACTAGTACACCCCC
+>FC0000042:5:1:633:480
+GAGCTGTGTGCATCTGTCCTGAGAGAGGCAAGATTT
+>FC0000042:5:1:53:1443
+GTAATGTTATAGCTAGGATTTTGGAGTTTGGTCCTC
+>FC0000042:5:1:45:915
+GTATAGCAGCCTAATAAGGAGCTGGGGACCCCCCCC
+>FC0000042:5:1:39:1343
+GTTCTATTTTCGATAAAACTGAACCACCCCCCCCCC
+>FC0000042:5:1:46:1501
+GATATAGTGGATAACTAATGCTCCCCCAGAACTGTT
+>FC0000042:5:1:187:1507
+GAACTAATCCTGATTTATACAACGGCTCCCCCCCCC
+>FC0000042:5:1:91:1364
+AATTTATAGCCACTCTAATTCCGTTTGGTTCCCCCC
+>FC0000042:5:1:1542:1751
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+>FC0000042:5:1:146:886
+GATCTACGATGTACCTTACGCCTCCGAGCATCCCCC
+>FC0000042:5:1:615:861
+GATCTACATTATAGATAATGAAGTTCCATTTCCCCC
+>FC0000042:5:1:52:792
+GATGTGGTATAGAGAGCAATTCGTTGGTTTTGCCCC
+>FC0000042:5:1:153:1433
+GGTCTTTCTATAGAACGGAACGATATATTTTTCCCC
+>FC0000042:5:1:540:800
+GAGCGAAAGTGATAGATGGAGGACTATATCTGCCCC
+>FC0000042:5:1:160:1344
+GGTGTACTATAGCTATTAAGTCCAATCATGATAATA
+>FC0000042:5:1:544:413
+GATCTCTGGAAAATATAAACCGGTGACCCCCCCCCC
+>FC0000042:5:1:579:895
+AGTCTCGAATCAATGTATTTCATCGTGGTAATCCCC
+>FC0000042:5:1:468:495
+TATTGATGCTCCCTGCCTGAAAGATACCCCCCCCCC
+>FC0000042:5:1:383:831
+CTTCATGAATCTACTGTTGGCGTTTATTTTATCTGG
+>FC0000042:5:1:112:1416
+TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
+>FC0000042:5:1:37:1299
+GATCGTGAGCTCTGTACCGGAAGTTCGTGGCTGCCA
+>FC0000042:5:1:205:780
+TATAGTGTTCCACAAAGACTAGGTAACGCTTCATTT
+>FC0000042:5:1:33:702
+GAACGGACTATAGCCGGTATCCAAACATAAATGTTC
+>FC0000042:5:1:54:1019
+AATCGCAGCATTCTGACACACAGGTTTCGGATGTAC
+>FC0000042:5:1:587:867
+TATCTAATGTCATATTTTCAGACAAATTACTAGAAA
+>FC0000042:5:1:319:990
+GATTTGTAAATTACTTCGAACATAGAAGTTCCCCCC
+>FC0000042:5:1:453:829
+GAACTTACGGCATTAAGTTTAATCTTCAGCCACCCC
+>FC0000042:5:1:159:1470
+GATCTGATAGTGTTGCGACGTAAATAAGTCCCCCCC
+>FC0000042:5:1:487:820
+GATCTCGCAGGGATCAGTTATCCAGGTATTCCCCCC
+>FC0000042:5:1:48:371
+AATCTATAATCTTTACCCGAGTTTAAGTCCCCCCCC
+>FC0000042:5:1:1346:1739
+GATATAGGTTATACGTTTTTAGTCTTAGAGAAGTTT
+>FC0000042:5:1:661:459
+GATCTGCTTTAACGATTGAGGACGATGCCCCCCCCC
Index: /galaxy-central/test-data/unix_cut_input1.txt
===================================================================
--- /galaxy-central/test-data/unix_cut_input1.txt (revision 3)
+++ /galaxy-central/test-data/unix_cut_input1.txt (revision 3)
@@ -0,0 +1,4 @@
+fruit	color	weight	price
+apple	red	1.4	0.4
+orange	orange	1.1	0.2
+banana	yellow	0.9	0.35
Index: /galaxy-central/test-data/unix_cut_output1.txt
===================================================================
--- /galaxy-central/test-data/unix_cut_output1.txt (revision 3)
+++ /galaxy-central/test-data/unix_cut_output1.txt (revision 3)
@@ -0,0 +1,4 @@
+fruit	weight	price
+apple	1.4	0.4
+orange	1.1	0.2
+banana	0.9	0.35
Index: /galaxy-central/test-data/unix_grep_output1.txt
===================================================================
--- /galaxy-central/test-data/unix_grep_output1.txt (revision 3)
+++ /galaxy-central/test-data/unix_grep_output1.txt (revision 3)
@@ -0,0 +1,14 @@
+>FC0000042:5:1:182:1434
+GCTATAGAAATGTTAACATCGAATGTACATTATAAC
+>FC0000042:5:1:45:1344
+CAGCTAACAATCAAGCGTTACAGATTAGCCCCCCCC
+>FC0000042:5:1:55:1331
+GAACTTGCGTAACGTACAAAAATGCAAGCAAAAAGT
+>FC0000042:5:1:175:1501
+GCTCTGTTAATCTAGAAAATGTGTCTCCCCCCCCCC
+>FC0000042:5:1:416:938
+AATCGTATAGCTCGGGCCGGATACTAGTACACCCCC
+>FC0000042:5:1:46:1501
+GATATAGTGGATAACTAATGCTCCCCCAGAACTGTT
+>FC0000042:5:1:33:702
+GAACGGACTATAGCCGGTATCCAAACATAAATGTTC
Index: /galaxy-central/test-data/unix_sort_input1.txt
===================================================================
--- /galaxy-central/test-data/unix_sort_input1.txt (revision 3)
+++ /galaxy-central/test-data/unix_sort_input1.txt (revision 3)
@@ -0,0 +1,10 @@
+chr10	0.4
+chr1	1.4
+chrM	3e-1
+chr2	1.1e2
+chr15	3.14e-2
+chr15	0.0314
+chr4	0.1
+chr20	0.9
+chr22	+1.3
+chrX	-0.3
Index: /galaxy-central/test-data/unix_sort_output1.txt
===================================================================
--- /galaxy-central/test-data/unix_sort_output1.txt (revision 3)
+++ /galaxy-central/test-data/unix_sort_output1.txt (revision 3)
@@ -0,0 +1,10 @@
+chr2	1.1e2
+chr1	1.4
+chr22	+1.3
+chr20	0.9
+chr10	0.4
+chrM	3e-1
+chr4	0.1
+chr15	0.0314
+chr15	3.14e-2
+chrX	-0.3
Index: /galaxy-central/test-data/replace_text_in_column_output1.txt
===================================================================
--- /galaxy-central/test-data/replace_text_in_column_output1.txt (revision 3)
+++ /galaxy-central/test-data/replace_text_in_column_output1.txt (revision 3)
@@ -0,0 +1,3 @@
+chr7  56632  56652   D17003_CTCF_R6  310  +
+chr7  56736  56756   D17003_CTCF_R7  354  +
+chr7  56761  56781   D17003_CTCF_R4  220  +
Index: /galaxy-central/test-data/unix_sort_output2.txt
===================================================================
--- /galaxy-central/test-data/unix_sort_output2.txt (revision 3)
+++ /galaxy-central/test-data/unix_sort_output2.txt (revision 3)
@@ -0,0 +1,9 @@
+chrX	-0.3
+chr15	3.14e-2
+chr4	0.1
+chrM	3e-1
+chr10	0.4
+chr20	0.9
+chr22	+1.3
+chr1	1.4
+chr2	1.1e2
Index: /galaxy-central/test-data/remove_ending_output1.txt
===================================================================
--- /galaxy-central/test-data/remove_ending_output1.txt (revision 3)
+++ /galaxy-central/test-data/remove_ending_output1.txt (revision 3)
@@ -0,0 +1,3 @@
+chr7  56632  56652   D17003_CTCF_R6  310  +
+chr7  56736  56756   D17003_CTCF_R7  354  +
+chr7  56761  56781   D17003_CTCF_R4  220  +
Index: /galaxy-central/test-data/replace_text_in_column_output2.txt
===================================================================
--- /galaxy-central/test-data/replace_text_in_column_output2.txt (revision 3)
+++ /galaxy-central/test-data/replace_text_in_column_output2.txt (revision 3)
@@ -0,0 +1,3 @@
+chr7	56632	56652	D17003_6R_FCTC	310	+
+chr7	56736	56756	D17003_7R_FCTC	354	+
+chr7	56761	56781	D17003_4R_FCTC	220	+
Index: /galaxy-central/test-data/replace_text_in_line_output1.txt
===================================================================
--- /galaxy-central/test-data/replace_text_in_line_output1.txt (revision 3)
+++ /galaxy-central/test-data/replace_text_in_line_output1.txt (revision 3)
@@ -0,0 +1,3 @@
+chr7	56632	56652	D17003_FOOBAR_R6	310	+
+chr7	56736	56756	D17003_FOOBAR_R7	354	+
+chr7	56761	56781	D17003_FOOBAR_R4	220	+
Index: /galaxy-central/test-data/unix_sort_output3.txt
===================================================================
--- /galaxy-central/test-data/unix_sort_output3.txt (revision 3)
+++ /galaxy-central/test-data/unix_sort_output3.txt (revision 3)
@@ -0,0 +1,10 @@
+chr1	1.4
+chr2	1.1e2
+chr4	0.1
+chr10	0.4
+chr15	0.0314
+chr15	3.14e-2
+chr20	0.9
+chr22	+1.3
+chrM	3e-1
+chrX	-0.3
Index: /galaxy-central/test-data/replace_text_in_column_input1.txt
===================================================================
--- /galaxy-central/test-data/replace_text_in_column_input1.txt (revision 3)
+++ /galaxy-central/test-data/replace_text_in_column_input1.txt (revision 3)
@@ -0,0 +1,3 @@
+chr7  56632  56652   D17003_CTCF_R6  310  +
+chr7  56736  56756   D17003_CTCF_R7  354  +
+chr7  56761  56781   D17003_CTCF_R4  220  +
Index: /galaxy-central/test-data/replace_text_in_line_output2.txt
===================================================================
--- /galaxy-central/test-data/replace_text_in_line_output2.txt (revision 3)
+++ /galaxy-central/test-data/replace_text_in_line_output2.txt (revision 3)
@@ -0,0 +1,3 @@
+chr7	56632	56652	D17003_6R_FCTC	310	+
+chr7	56736	56756	D17003_7R_FCTC	354	+
+chr7	56761	56781	D17003_4R_FCTC	220	+
Index: /galaxy-central/test-data/unix_awk_output1.txt
===================================================================
--- /galaxy-central/test-data/unix_awk_output1.txt (revision 3)
+++ /galaxy-central/test-data/unix_awk_output1.txt (revision 3)
@@ -0,0 +1,4 @@
+12.6	chr1
+990	chr2
+8.1	chr20
+11.7	chr22
Index: /galaxy-central/test-data/remove_ending_input1.txt
===================================================================
--- /galaxy-central/test-data/remove_ending_input1.txt (revision 3)
+++ /galaxy-central/test-data/remove_ending_input1.txt (revision 3)
@@ -0,0 +1,5 @@
+chr7  56632  56652   D17003_CTCF_R6  310  +
+chr7  56736  56756   D17003_CTCF_R7  354  +
+chr7  56761  56781   D17003_CTCF_R4  220  +
+chr7  56772  56792   D17003_CTCF_R7  372  +
+chr7  56775  56795   D17003_CTCF_R4  207  +
Index: /galaxy-central/test-data/unix_grep_output2.html
===================================================================
--- /galaxy-central/test-data/unix_grep_output2.html (revision 3)
+++ /galaxy-central/test-data/unix_grep_output2.html (revision 3)
@@ -0,0 +1,9 @@
+<html><body><pre>
+GCTATAG<font color="blue"><b>AAATGT</b></font>TAACATCGAATGTACATTATAAC
+CAGCTAACAATC<font color="blue"><b>AAGCGT</b></font>TACAGATTAGCCCCCCCC
+GAACTTGCGTAACGTACAAAAATGCAAGCA<font color="blue"><b>AAAAGT</b></font>
+GCTCTGTTAATCTAGA<font color="blue"><b>AAATGT</b></font>GTCTCCCCCCCCCC
+<font color="blue"><b>AATCGT</b></font>ATAGCTCGGGCCGGATACTAGTACACCCCC
+GATATAGTGGATAACTAATGCTCCCCCAG<font color="blue"><b>AACTGT</b></font>T
+GAACGGACTATAGCCGGTATCCAAACAT<font color="blue"><b>AAATGT</b></font>TC
+</pre></body></html>
Index: /galaxy-central/datatypes_conf.xml
===================================================================
--- /galaxy-central/datatypes_conf.xml (revision 3)
+++ /galaxy-central/datatypes_conf.xml (revision 3)
@@ -0,0 +1,303 @@
+<?xml version="1.0"?>
+<datatypes>
+    <registration converters_path="lib/galaxy/datatypes/converters" display_path="display_applications">
+        <datatype extension="ab1" type="galaxy.datatypes.binary:Ab1" mimetype="application/octet-stream" display_in_upload="true"/>
+        <datatype extension="afg" type="galaxy.datatypes.assembly:Amos" display_in_upload="false"/>
+        <datatype extension="axt" type="galaxy.datatypes.sequence:Axt" display_in_upload="true"/>
+        <datatype extension="bam" type="galaxy.datatypes.binary:Bam" mimetype="application/octet-stream" display_in_upload="true">
+            <converter file="bam_to_bai.xml" target_datatype="bai"/>
+            <converter file="bam_to_summary_tree_converter.xml" target_datatype="summary_tree" depends_on="bai"/>
+            <display file="ucsc/bam.xml" />
+            <display file="ensembl/ensembl_bam.xml" />
+        </datatype>
+        <datatype extension="bed" type="galaxy.datatypes.interval:Bed" display_in_upload="true">
+            <converter file="bed_to_gff_converter.xml" target_datatype="gff"/>
+            <converter file="interval_to_coverage.xml" target_datatype="coverage"/>
+            <converter file="bed_to_interval_index_converter.xml" target_datatype="interval_index"/>
+            <converter file="bed_to_summary_tree_converter.xml" target_datatype="summary_tree"/>
+            <!-- <display file="ucsc/interval_as_bed.xml" /> -->
+            <display file="genetrack.xml" />
+        </datatype>
+        <datatype extension="bedgraph" type="galaxy.datatypes.interval:BedGraph" display_in_upload="true">
+            <converter file="bedgraph_to_array_tree_converter.xml" target_datatype="array_tree"/>
+        </datatype>
+        <datatype extension="bedstrict" type="galaxy.datatypes.interval:BedStrict" />
+        <datatype extension="bed6" type="galaxy.datatypes.interval:Bed6">
+            <converter file="bed_to_genetrack_converter.xml" target_datatype="genetrack"/>
+        </datatype>
+        <datatype extension="bed12" type="galaxy.datatypes.interval:Bed12" />
+        <datatype extension="len" type="galaxy.datatypes.chrominfo:ChromInfo" display_in_upload="true">
+            <!-- no converters yet -->
+        </datatype>
+        <datatype extension="bigbed" type="galaxy.datatypes.binary:BigBed" mimetype="application/octet-stream" display_in_upload="true">
+            <display file="ucsc/bigbed.xml" />
+        </datatype>
+        <datatype extension="bigwig" type="galaxy.datatypes.binary:BigWig" mimetype="application/octet-stream" display_in_upload="true">
+            <display file="ucsc/bigwig.xml" />
+        </datatype>
+        <datatype extension="coverage" type="galaxy.datatypes.coverage:LastzCoverage" display_in_upload="true">
+            <indexer file="coverage.xml" />
+        </datatype>
+        <datatype extension="coverage" type="galaxy.datatypes.coverage:LastzCoverage" display_in_upload="true">
+            <indexer file="coverage.xml" />
+        </datatype>
+        <!-- MSI added Datatypes -->
+        <datatype extension="csv" type="galaxy.datatypes.tabular:Tabular"/>
+        <!-- End MSI added Datatypes -->
+        <datatype extension="customtrack" type="galaxy.datatypes.interval:CustomTrack"/>
+        <datatype extension="bowtie_color_index" type="galaxy.datatypes.ngsindex:BowtieColorIndex" mimetype="text/html" display_in_upload="False"/>
+        <datatype extension="bowtie_base_index" type="galaxy.datatypes.ngsindex:BowtieBaseIndex" mimetype="text/html" display_in_upload="False"/>
+        <datatype extension="csfasta" type="galaxy.datatypes.sequence:csFasta" display_in_upload="true"/>
+        <datatype extension="data" type="galaxy.datatypes.data:Data" mimetype="application/octet-stream" max_optional_metadata_filesize="1048576" />
+        <datatype extension="fasta" type="galaxy.datatypes.sequence:Fasta" display_in_upload="true">
+            <converter file="fasta_to_tabular_converter.xml" target_datatype="tabular"/>
+            <converter file="fasta_to_bowtie_base_index_converter.xml" target_datatype="bowtie_base_index"/>
+            <converter file="fasta_to_bowtie_color_index_converter.xml" target_datatype="bowtie_color_index"/>
+        </datatype>
+        <datatype extension="fastq" type="galaxy.datatypes.sequence:Fastq" display_in_upload="true"/>
+        <datatype extension="fastqsanger" type="galaxy.datatypes.sequence:FastqSanger" display_in_upload="true"/>
+        <datatype extension="fastqsolexa" type="galaxy.datatypes.sequence:FastqSolexa" display_in_upload="true"/>
+        <datatype extension="fastqcssanger" type="galaxy.datatypes.sequence:FastqCSSanger" display_in_upload="true"/>
+        <datatype extension="fastqillumina" type="galaxy.datatypes.sequence:FastqIllumina" display_in_upload="true"/>
+        <datatype extension="eland" type="galaxy.datatypes.tabular:Eland" display_in_upload="true"/>
+        <datatype extension="elandmulti" type="galaxy.datatypes.tabular:ElandMulti" display_in_upload="true"/>
+        <datatype extension="genetrack" type="galaxy.datatypes.tracks:GeneTrack">
+            <!-- <display file="genetrack.xml" /> -->
+        </datatype>
+        <datatype extension="gff" type="galaxy.datatypes.interval:Gff" display_in_upload="true">
+            <converter file="gff_to_bed_converter.xml" target_datatype="bed"/>
+            <converter file="gff_to_interval_index_converter.xml" target_datatype="interval_index"/>
+            <converter file="gff_to_summary_tree_converter.xml" target_datatype="summary_tree"/>
+            <display file="ensembl/ensembl_gff.xml" inherit="True"/>
+            <!-- <display file="gbrowse/gbrowse_gff.xml" inherit="True" /> -->
+        </datatype>
+        <datatype extension="gff3" type="galaxy.datatypes.interval:Gff3" display_in_upload="true"/>
+        <datatype extension="gif" type="galaxy.datatypes.images:Image" mimetype="image/gif"/>
+        <datatype extension="gmaj.zip" type="galaxy.datatypes.images:Gmaj" mimetype="application/zip"/>
+        <datatype extension="gtf" type="galaxy.datatypes.interval:Gtf" display_in_upload="true"/>
+        <datatype extension="html" type="galaxy.datatypes.images:Html" mimetype="text/html"/>
+        <datatype extension="interval" type="galaxy.datatypes.interval:Interval" display_in_upload="true">
+            <converter file="interval_to_bed_converter.xml" target_datatype="bed"/>
+            <converter file="interval_to_bedstrict_converter.xml" target_datatype="bedstrict"/>
+            <converter file="interval_to_bed6_converter.xml" target_datatype="bed6"/>
+            <converter file="interval_to_bed12_converter.xml" target_datatype="bed12"/>
+            <indexer file="interval_awk.xml" />
+            <!-- <display file="ucsc/interval_as_bed.xml" inherit="True" /> -->
+            <display file="genetrack.xml" inherit="True"/>
+            <display file="ensembl/ensembl_interval_as_bed.xml" inherit="True"/>
+            <display file="gbrowse/gbrowse_interval_as_bed.xml" inherit="True"/>
+        </datatype>
+        <datatype extension="jpg" type="galaxy.datatypes.images:Image" mimetype="image/jpeg"/>
+        <datatype extension="laj" type="galaxy.datatypes.images:Laj"/>
+        <datatype extension="lav" type="galaxy.datatypes.sequence:Lav" display_in_upload="true"/>
+        <datatype extension="maf" type="galaxy.datatypes.sequence:Maf" display_in_upload="true">
+            <converter file="maf_to_fasta_converter.xml" target_datatype="fasta"/>
+            <converter file="maf_to_interval_converter.xml" target_datatype="interval"/>
+        </datatype>
+        <datatype extension="mafcustomtrack" type="galaxy.datatypes.sequence:MafCustomTrack">
+            <display file="ucsc/maf_customtrack.xml" />
+        </datatype>
+        <datatype extension="pdf" type="galaxy.datatypes.images:Pdf" mimetype="application/pdf"/>
+        <datatype extension="pileup" type="galaxy.datatypes.tabular:Pileup" display_in_upload="true" />
+        <datatype extension="png" type="galaxy.datatypes.images:Image" mimetype="image/png"/>
+        <datatype extension="qual" type="galaxy.datatypes.qualityscore:QualityScore" />
+        <datatype extension="qualsolexa" type="galaxy.datatypes.qualityscore:QualityScoreSolexa" display_in_upload="true"/>
+        <datatype extension="qualillumina" type="galaxy.datatypes.qualityscore:QualityScoreIllumina" display_in_upload="true"/>
+        <datatype extension="qualsolid" type="galaxy.datatypes.qualityscore:QualityScoreSOLiD" display_in_upload="true"/>
+        <datatype extension="qual454" type="galaxy.datatypes.qualityscore:QualityScore454" display_in_upload="true"/>
+        <datatype extension="Roadmaps" type="galaxy.datatypes.assembly:Roadmaps" display_in_upload="false"/>
+        <datatype extension="sam" type="galaxy.datatypes.tabular:Sam" display_in_upload="true"/>
+        <datatype extension="scf" type="galaxy.datatypes.binary:Scf" mimetype="application/octet-stream" display_in_upload="true"/>
+        <datatype extension="Sequences" type="galaxy.datatypes.assembly:Sequences" display_in_upload="false"/>
+        <datatype extension="sff" type="galaxy.datatypes.binary:Sff" mimetype="application/octet-stream" display_in_upload="true"/>
+        <datatype extension="svg" type="galaxy.datatypes.images:Image" mimetype="image/svg+xml"/>
+        <datatype extension="taxonomy" type="galaxy.datatypes.tabular:Taxonomy" display_in_upload="true"/>
+        <datatype extension="tabular" type="galaxy.datatypes.tabular:Tabular" display_in_upload="true"/>
+        <datatype extension="txt" type="galaxy.datatypes.data:Text" display_in_upload="true"/>
+        <datatype extension="blastxml" type="galaxy.datatypes.xml:BlastXml" display_in_upload="true"/>
+        <datatype extension="vcf" type="galaxy.datatypes.tabular:Vcf" display_in_upload="true">
+            <converter file="vcf_to_interval_index_converter.xml" target_datatype="interval_index"/>
+            <converter file="vcf_to_summary_tree_converter.xml" target_datatype="summary_tree"/>    
+        </datatype>
+        <datatype extension="velvet" type="galaxy.datatypes.assembly:Velvet" display_in_upload="false"/>
+        <datatype extension="wig" type="galaxy.datatypes.interval:Wiggle" display_in_upload="true">
+            <converter file="wiggle_to_array_tree_converter.xml" target_datatype="array_tree"/>
+            <converter file="wiggle_to_simple_converter.xml" target_datatype="interval"/>
+            <!-- <display file="gbrowse/gbrowse_wig.xml" /> -->
+        </datatype>
+        <datatype extension="array_tree" type="galaxy.datatypes.data:Data" />
+        <datatype extension="summary_tree" type="galaxy.datatypes.data:Data" />
+        <datatype extension="interval_index" type="galaxy.datatypes.data:Data" />
+        <!-- Start EMBOSS tools -->
+        <datatype extension="acedb" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="asn1" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="btwisted" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="cai" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="charge" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="checktrans" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="chips" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="clustal" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="codata" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="codcmp" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="coderet" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="compseq" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="cpgplot" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="cpgreport" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="cusp" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="cut" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="dan" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="dbmotif" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="diffseq" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="digest" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="dreg" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="einverted" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="embl" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="epestfind" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="equicktandem" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="est2genome" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="etandem" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="excel" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="feattable" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="fitch" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="freak" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="fuzznuc" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="fuzzpro" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="fuzztran" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="garnier" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="gcg" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="geecee" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="genbank" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="helixturnhelix" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="hennig86" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="hmoment" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="ig" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="isochore" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="jackknifer" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="jackknifernon" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="markx10" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="markx1" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="markx0" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="markx3" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="markx2" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="match" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="mega" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="meganon" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="motif" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="msf" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="nametable" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="ncbi" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="needle" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="newcpgreport" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="newcpgseek" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="nexus" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="nexusnon" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="noreturn" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="pair" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="palindrome" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="pepcoil" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="pepinfo" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="pepstats" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="phylip" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="phylipnon" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="pir" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="polydot" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="preg" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="prettyseq" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="primersearch" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="regions" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="score" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="selex" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="seqtable" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="showfeat" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="showorf" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="simple" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="sixpack" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="srs" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="srspair" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="staden" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="strider" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="supermatcher" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="swiss" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="syco" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="table" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="textsearch" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="vectorstrip" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="wobble" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="wordcount" type="galaxy.datatypes.data:Text"/>
+        <datatype extension="tagseq" type="galaxy.datatypes.data:Text"/>
+        <!-- End EMBOSS tools -->
+        <!-- Start RGenetics Datatypes -->
+        <datatype extension="affybatch" type="galaxy.datatypes.genetics:Affybatch" display_in_upload="true"/>
+        <!-- eigenstrat pedigree input file -->
+        <datatype extension="eigenstratgeno" type="galaxy.datatypes.genetics:Eigenstratgeno"/>
+        <!-- eigenstrat pca output file for adjusted eigenQTL eg -->
+        <datatype extension="eigenstratpca" type="galaxy.datatypes.genetics:Eigenstratpca"/>
+        <datatype extension="eset" type="galaxy.datatypes.genetics:Eset" display_in_upload="true" />
+        <!-- fbat/pbat format pedigree (header row of marker names) -->
+        <datatype extension="fped" type="galaxy.datatypes.genetics:Fped" display_in_upload="true"/>
+        <!-- phenotype file - fbat format -->
+        <datatype extension="fphe" type="galaxy.datatypes.genetics:Fphe" display_in_upload="true" mimetype="text/html"/>
+        <!-- genome graphs ucsc file - first col is always marker then numeric values to plot -->
+        <datatype extension="gg" type="galaxy.datatypes.genetics:GenomeGraphs"/>
+        <!-- part of linkage format pedigree -->
+        <!-- information redundancy (LD) filtered plink pbed -->
+        <datatype extension="ldindep" type="galaxy.datatypes.genetics:ldIndep" display_in_upload="true">
+        </datatype>
+        <datatype extension="malist" type="galaxy.datatypes.genetics:MAlist" display_in_upload="true"/>
+        <!-- linkage format pedigree (separate .map file) -->
+        <datatype extension="lped" type="galaxy.datatypes.genetics:Lped" display_in_upload="true">
+            <converter file="lped_to_fped_converter.xml" target_datatype="fped"/>
+            <converter file="lped_to_pbed_converter.xml" target_datatype="pbed"/>
+        </datatype>
+        <!-- plink compressed file - has bed extension unfortunately -->
+        <datatype extension="pbed" type="galaxy.datatypes.genetics:Pbed" display_in_upload="true">
+            <converter file="pbed_to_lped_converter.xml" target_datatype="lped"/>
+            <converter file="pbed_ldreduced_converter.xml" target_datatype="ldindep"/>
+        </datatype>
+        <datatype extension="pheno" type="galaxy.datatypes.genetics:Pheno"/>
+        <!-- phenotype file - plink format -->
+        <datatype extension="pphe" type="galaxy.datatypes.genetics:Pphe" display_in_upload="true" mimetype="text/html"/>
+        <datatype extension="rexpbase" type="galaxy.datatypes.genetics:RexpBase"/>
+        <datatype extension="rgenetics" type="galaxy.datatypes.genetics:Rgenetics"/>
+        <datatype extension="snptest" type="galaxy.datatypes.genetics:Snptest" display_in_upload="true"/>
+        <datatype extension="snpmatrix" type="galaxy.datatypes.genetics:SNPMatrix" display_in_upload="true"/>
+        <datatype extension="xls" type="galaxy.datatypes.tabular:Tabular"/>
+        <!-- End RGenetics Datatypes -->
+    </registration>
+    <sniffers>
+        <!--
+          The order in which Galaxy attempts to determine data types is 
+          important because some formats are much more loosely defined 
+          than others.  The following list should be the most rigidly 
+          defined format first, followed by next-most rigidly defined, 
+          and so on.
+        -->
+        <sniffer type="galaxy.datatypes.binary:Bam"/>
+        <sniffer type="galaxy.datatypes.binary:Sff"/>
+        <sniffer type="galaxy.datatypes.xml:BlastXml"/>
+        <sniffer type="galaxy.datatypes.sequence:Maf"/>
+        <sniffer type="galaxy.datatypes.sequence:Lav"/>
+        <sniffer type="galaxy.datatypes.sequence:csFasta"/>
+        <sniffer type="galaxy.datatypes.qualityscore:QualityScoreSOLiD"/>
+        <sniffer type="galaxy.datatypes.qualityscore:QualityScore454"/>
+        <sniffer type="galaxy.datatypes.sequence:Fasta"/>
+        <sniffer type="galaxy.datatypes.sequence:Fastq"/>
+        <sniffer type="galaxy.datatypes.interval:Wiggle"/>
+        <sniffer type="galaxy.datatypes.images:Html"/>
+        <sniffer type="galaxy.datatypes.images:Pdf"/>
+        <sniffer type="galaxy.datatypes.sequence:Axt"/>
+        <sniffer type="galaxy.datatypes.interval:Bed"/>
+        <sniffer type="galaxy.datatypes.interval:CustomTrack"/>
+        <sniffer type="galaxy.datatypes.interval:Gff"/>
+        <sniffer type="galaxy.datatypes.interval:Gff3"/>
+        <sniffer type="galaxy.datatypes.tabular:Pileup"/>
+        <sniffer type="galaxy.datatypes.interval:Interval"/>
+        <sniffer type="galaxy.datatypes.tabular:Sam"/>
+        <sniffer type="galaxy.datatypes.tabular:Vcf"/>
+        <!--
+        Keep this commented until the sniff method in the assembly.py
+        module is fixed to not read the entire file.
+        <sniffer type="galaxy.datatypes.assembly:Amos"/>
+        -->
+    </sniffers>
+</datatypes>
Index: /galaxy-central/reports_wsgi.ini
===================================================================
--- /galaxy-central/reports_wsgi.ini (revision 3)
+++ /galaxy-central/reports_wsgi.ini (revision 3)
@@ -0,0 +1,70 @@
+# ---- HTTP Server ----------------------------------------------------------
+
+[server:main]
+
+use = egg:Paste#http
+port = 9001
+host = 127.0.0.1
+use_threadpool = true
+threadpool_workers = 10
+
+# ---- Galaxy Webapps Report Interface -------------------------------------------------
+
+[app:main]
+
+# Specifies the factory for the universe WSGI application
+paste.app_factory = galaxy.webapps.reports.buildapp:app_factory
+log_level = DEBUG
+
+# Database connection
+#database_file = database/universe.sqlite
+# You may use a SQLAlchemy connection string to specify an external database instead
+# database_connection = postgres:///galaxy_test?user=postgres&password=postgres 
+
+# Where dataset files are saved
+file_path = database/files
+# Temporary storage for additional datasets, this should be shared through the cluster
+new_file_path = database/tmp
+
+# Session support (beaker)
+use_beaker_session = True
+session_type = memory
+session_data_dir = %(here)s/database/beaker_sessions
+session_key = galaxysessions
+session_secret = changethisinproduction
+
+# Configuration for debugging middleware
+# debug = true
+use_lint = false
+
+# NEVER enable this on a public site (even test or QA)
+# use_interactive = true
+
+# path to sendmail
+sendmail_path = /usr/sbin/sendmail
+
+# Address to join mailing list
+mailing_join_addr = galaxy-user-join@bx.psu.edu
+
+# Write thread status periodically to 'heartbeat.log' (careful, uses disk space rapidly!)
+## use_heartbeat = True
+
+# Profiling middleware (cProfile based)
+## use_profile = True
+
+# Mail
+# smtp_server = yourserver@yourfacility.edu
+# error_email_to = your_bugs@bx.psu.edu
+
+# Use the new iframe / javascript based layout
+use_new_layout = true
+
+# Serving static files (needed if running standalone)
+static_enabled = True
+static_cache_time = 360
+static_dir = %(here)s/static/
+static_images_dir = %(here)s/static/images
+static_favicon_dir = %(here)s/static/favicon.ico
+static_scripts_dir = %(here)s/static/scripts/
+static_style_dir = %(here)s/static/june_2007_style/blue
+
